diff --git a/Bag-Of-Tricks-For-Image-Classification/README.md b/Bag-Of-Tricks-For-Image-Classification/README.md new file mode 100644 index 000000000..560eaef33 --- /dev/null +++ b/Bag-Of-Tricks-For-Image-Classification/README.md @@ -0,0 +1,83 @@ +## Description + +This repository contains classification pipeline for experiments with tricks listed in +["Bag of Tricks for Image Classification with Convolutional Neural Networks"](https://arxiv.org/abs/1812.01187). Visit [our blogpost](https://www.learnopencv.com/bag-of-tricks-for-image-classification-lets-check-if-it-is-working-or-not/) for more details. + +The pipeline is based on [pytorch-lightning framework](https://github.com/PyTorchLightning/pytorch-lightning). + +### Installation + +1. Clone the repository; +2. Set up the virtual environment; +3. If you are going to run experiments with mixed-precision: + + - Check you CUDA version with `nvcc --version`; + - Install pytorch 1.5.1 compiled with CUDA version which you have installed. In our case it is CUDA 10.1 so the + pytorch should be installed with + `pip install torch==1.5.1+cu101 -f https://download.pytorch.org/whl/torch_stable.html`; + - Install Nvidia Apex by following [the official instructions](https://github.com/NVIDIA/apex#quick-start); + Otherwise: + - Run `pip install torch==1.5.1` to install PyTorch + +4. Run `pip install -r requirements.txt` + +### Dataset + +Please, follow the instruction to prepare the dataset: + +- Download zip-archive from kaggle ([link](https://www.kaggle.com/dansbecker/food-101/)); +- Unzip the data; +- Use `split_food-101.py` to split Food-101 into train/test folders. This script will parse `train.txt` and `test.txt` + and copy images into corresponding sub-folders. Note that we hard-coded the classes which we are going to use. + +### Training + +To train model launch + +``` +python main.py --gpus [gpus_number] --max_epochs [epoch_number] --data-root [path_to_dataset] --amp_level [optimization_level] (only for mixed-precision with apex) +``` + +You can turn on any trick by adding the corresponding key: + +``` +--use-smoothing for label smoothing; +--use-mixup for mixup augmentation; +--use-cosine-scheduler for Cosine LR Scheduler; +--use-knowledge-distillation for Knowledge Distillation; +``` + +_Note:_ If you want to train the model on GPU you should always use `--gpus` key, without it the pytorch lightning +console log will show you that the GPU is used but the training will be performed on CPU. + +For Knowledge Distillation, please, download the teacher weights from +[Dropbox](https://www.dropbox.com/s/za5eeyhhy6pmpd2/bag_of_tricks_resnet50_teacher.ckpt?dl=0). + +Run `python main.py --help` to see all possible arguments. This command will also show you the arguments for pytorch +lightning Trainer. Please, see the +[official documentation](https://pytorch-lightning.readthedocs.io/en/0.8.5/trainer.html#trainer-flags) for details about +them. + +### Testing + +To evaluate a trained model launch + +``` +python main.py --gpus [gpus_number] --data-root [path_to_dataset] -e --checkpoint [path_to_checkpoint] +``` + +### Colab Notebook + +You can also train a colab-based version of this model: + +[Open in Colab](https://colab.research.google.com/github/spmallick/learnopencv/blob/master/Bag-Of-Tricks-For-Image-Classification/bag-of-tricks-colab.ipynb) + +## AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
diff --git a/Bag-Of-Tricks-For-Image-Classification/bag-of-tricks-colab.ipynb b/Bag-Of-Tricks-For-Image-Classification/bag-of-tricks-colab.ipynb new file mode 100644 index 000000000..6b4e43872 --- /dev/null +++ b/Bag-Of-Tricks-For-Image-Classification/bag-of-tricks-colab.ipynb @@ -0,0 +1,18064 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "bag-of-tricks.ipynb", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "GPU", + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "a309c376716f467083b9e235ce5ac786": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_f5b9114e102f4dafb5a650942d07e001", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_65357848a4f2413aa09502e4b5827bbb", + "IPY_MODEL_24bac64eeee147d9ae2533fc923f8bd8" + ] + } + }, + "f5b9114e102f4dafb5a650942d07e001": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "65357848a4f2413aa09502e4b5827bbb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_f61997cd973f4d57b3e6de3a294d0c14", + "_dom_classes": [], + "description": "", + "_model_name": "FloatProgressModel", + "bar_style": "success", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_cfa9f77355224187be118e6bd7917ad2" + } + }, + "24bac64eeee147d9ae2533fc923f8bd8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_e9e13a09b33f4e24961dc9989bd695b6", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 75750/? [07:09<00:00, 176.36it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_310243d71d9c4b16bee1be5bb3628e1c" + } + }, + "f61997cd973f4d57b3e6de3a294d0c14": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "cfa9f77355224187be118e6bd7917ad2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "e9e13a09b33f4e24961dc9989bd695b6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "310243d71d9c4b16bee1be5bb3628e1c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "74c39deb82ad4d42b35a36b4c8de30a9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_5b085c03bff84edf9e2bd61e4d674f13", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_f589ad7fc73f42508e7284bda8540bfc", + "IPY_MODEL_dbe6097914ac4c8fafc3e2af66a7dc03" + ] + } + }, + "5b085c03bff84edf9e2bd61e4d674f13": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "f589ad7fc73f42508e7284bda8540bfc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_5da7cd2a45834b0ab0616bd94bff4a62", + "_dom_classes": [], + "description": "", + "_model_name": "FloatProgressModel", + "bar_style": "success", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_7279f1b86f144d5983bdf1afaaf03ecb" + } + }, + "dbe6097914ac4c8fafc3e2af66a7dc03": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_69d54beda9ed4562a27c075465e474b2", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 25250/? [06:56<00:00, 60.66it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_5afb9ebc9c0748a5b9460e3df8bcc177" + } + }, + "5da7cd2a45834b0ab0616bd94bff4a62": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "7279f1b86f144d5983bdf1afaaf03ecb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "69d54beda9ed4562a27c075465e474b2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "5afb9ebc9c0748a5b9460e3df8bcc177": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "7309694760e44d389f1c954a5ac87655": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_5fa5c11c14824b4694eec57a16fb44b9", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_574a1c46522a4b4093d2e88c3831cc2f", + "IPY_MODEL_ab5f79cb97ca48118b6d2f9eb296a324" + ] + } + }, + "5fa5c11c14824b4694eec57a16fb44b9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "574a1c46522a4b4093d2e88c3831cc2f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_fdde2f8d291f468a9701121f01bd00b3", + "_dom_classes": [], + "description": "100%", + "_model_name": "FloatProgressModel", + "bar_style": "success", + "max": 46827520, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 46827520, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_2b07d65f8c6142ae9a9e285de81bb414" + } + }, + "ab5f79cb97ca48118b6d2f9eb296a324": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_ab8d6bbb5fa44623ac031ac17e00b2a5", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 44.7M/44.7M [00:00<00:00, 68.4MB/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_c1881c84292643d284491b84c4bfbdd3" + } + }, + "fdde2f8d291f468a9701121f01bd00b3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "2b07d65f8c6142ae9a9e285de81bb414": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "ab8d6bbb5fa44623ac031ac17e00b2a5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "c1881c84292643d284491b84c4bfbdd3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "d56c5304a76e49d5a428ee6b4c92849b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_cba17c4ffe14460eaacf37b11982ca27", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_df674170016b4408b920725b4b5d852b", + "IPY_MODEL_a455c7187d3842b690925d698702737c" + ] + } + }, + "cba17c4ffe14460eaacf37b11982ca27": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "df674170016b4408b920725b4b5d852b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_37767d5433454a138ae6318a5e74f879", + "_dom_classes": [], + "description": "Validation sanity check: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_4d8eadb9c1214384a21bb9b2d7e8772f" + } + }, + "a455c7187d3842b690925d698702737c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_9c8b169e688143468d146ae5631b9c18", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 1/1.0 [00:02<00:00, 1.89s/it]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_a223049b09b240aa80377469ed85cae0" + } + }, + "37767d5433454a138ae6318a5e74f879": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "4d8eadb9c1214384a21bb9b2d7e8772f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "9c8b169e688143468d146ae5631b9c18": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "a223049b09b240aa80377469ed85cae0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "a00c42dc6ce54ec4804acf66b8d46ced": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_efff7e15a4af4cb38b16a941e108a824", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_4bcac84304c544458bd6c1ce5bcd0db4", + "IPY_MODEL_1ceef8cc74bc4d38ab8408234ffa1d2d" + ] + } + }, + "efff7e15a4af4cb38b16a941e108a824": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "4bcac84304c544458bd6c1ce5bcd0db4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_89f08cbecf484b02808c9630d11f2617", + "_dom_classes": [], + "description": "Epoch 32: 70%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 658, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 460, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_887e947bf23543efbeac7a9e41f1118b" + } + }, + "1ceef8cc74bc4d38ab8408234ffa1d2d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_e548e5bcd7b14b419b60460dbacb00e7", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 460/658 [04:06<01:46, 1.86it/s, loss=0.992, v_num=0, train_loss=1.3, train_acc=0.0938]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_b919379437414936a01a2f5b980615ef" + } + }, + "89f08cbecf484b02808c9630d11f2617": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "887e947bf23543efbeac7a9e41f1118b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "e548e5bcd7b14b419b60460dbacb00e7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "b919379437414936a01a2f5b980615ef": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "e8d1e8f21d1f45029a0817eb42e39845": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_45e0f3c593664853b4b0121b0b54c767", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_9dae5f235813481986c9f7ffd72cd72a", + "IPY_MODEL_3064b3ae5d3d4a80a652dc81246200ae" + ] + } + }, + "45e0f3c593664853b4b0121b0b54c767": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "9dae5f235813481986c9f7ffd72cd72a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_8711057d7832466987b974baa7a7f5bd", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_1596ef80eaf54211afe901c02da10a46" + } + }, + "3064b3ae5d3d4a80a652dc81246200ae": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_22e1943359d140e69061486cfe03a976", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_402b129faf594a3486aec2804953eaa0" + } + }, + "8711057d7832466987b974baa7a7f5bd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "1596ef80eaf54211afe901c02da10a46": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "22e1943359d140e69061486cfe03a976": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "402b129faf594a3486aec2804953eaa0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "4b82b861aa224799857d9f0c900efbe6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_066d9455ecf042a08c3a4a569b8639b2", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_6f2d81b4cc294c87ae98a0727296364a", + "IPY_MODEL_f3ffb4aeaf734bfd842b937eef703016" + ] + } + }, + "066d9455ecf042a08c3a4a569b8639b2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "6f2d81b4cc294c87ae98a0727296364a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_1662f6fbd176477f878a2a9c66b4b268", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_00b3c078646f4d7bbba62d2e3efddfe8" + } + }, + "f3ffb4aeaf734bfd842b937eef703016": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_91ea6014e06c4371a9bc1d8cb01edc6d", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_fd9603f0f7c64cfd9c6358c12ad9b816" + } + }, + "1662f6fbd176477f878a2a9c66b4b268": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "00b3c078646f4d7bbba62d2e3efddfe8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "91ea6014e06c4371a9bc1d8cb01edc6d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "fd9603f0f7c64cfd9c6358c12ad9b816": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "37e17e5a827448ee9dfa809cedd7c79a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_b2a4a683242e43fb99580d1fde7054ce", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_8e35b7e4143d4804a1d37b5ee1c20947", + "IPY_MODEL_80abe1c282ef4a939ad7bf7c118cce7d" + ] + } + }, + "b2a4a683242e43fb99580d1fde7054ce": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "8e35b7e4143d4804a1d37b5ee1c20947": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_5579c43e432b49778307ec5d7131985d", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_10b0e108d9394832870b397b1c2b9b16" + } + }, + "80abe1c282ef4a939ad7bf7c118cce7d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_330fd6caead747c1a1569644a249c239", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:53<00:00, 3.32it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_e55d0a78374543c8b8003e7effc3a7a1" + } + }, + "5579c43e432b49778307ec5d7131985d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "10b0e108d9394832870b397b1c2b9b16": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "330fd6caead747c1a1569644a249c239": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "e55d0a78374543c8b8003e7effc3a7a1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "72b4f725a0224df98bb6bd991f334447": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_126737b514444921a5a866de491b6499", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_e3c85df1065a44b38b3fb933f5a85ca3", + "IPY_MODEL_22d086f35b9c47879399b25767381a3b" + ] + } + }, + "126737b514444921a5a866de491b6499": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "e3c85df1065a44b38b3fb933f5a85ca3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_17a613d8ca5841b3b0fe4786585c7f9a", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_280899ce11e5476eadda45047bb144ce" + } + }, + "22d086f35b9c47879399b25767381a3b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_9ba421500a334a448c9b144fe5ebf763", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:53<00:00, 3.33it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_b286321e54e64d6ba92c96d4e7e58512" + } + }, + "17a613d8ca5841b3b0fe4786585c7f9a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "280899ce11e5476eadda45047bb144ce": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "9ba421500a334a448c9b144fe5ebf763": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "b286321e54e64d6ba92c96d4e7e58512": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "87c8cc3e76054d94a68053e029fed4f7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_34611d63210c48978902922d8bc93c73", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_247f2417040042898f2fe209c3d1d8d6", + "IPY_MODEL_4344bc0c051645c0a8be7805ace9bcf1" + ] + } + }, + "34611d63210c48978902922d8bc93c73": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "247f2417040042898f2fe209c3d1d8d6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_eded55cea34b4687b401af997adbf29b", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_a0ff13de336e42a8ae17d2926883e837" + } + }, + "4344bc0c051645c0a8be7805ace9bcf1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_5cc9ba755cf54797953f790d0493fe57", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:53<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_d073ae885e474ece9ded2d059cd2077d" + } + }, + "eded55cea34b4687b401af997adbf29b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "a0ff13de336e42a8ae17d2926883e837": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "5cc9ba755cf54797953f790d0493fe57": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "d073ae885e474ece9ded2d059cd2077d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "69b76e58fead441f97592d187c999c14": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_f477fed0947f473fb131d7a143f4547c", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_80d910d1426a46aa8a1b435d0ad688b8", + "IPY_MODEL_b8ac8d3917064a18a6e9604d461a7808" + ] + } + }, + "f477fed0947f473fb131d7a143f4547c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "80d910d1426a46aa8a1b435d0ad688b8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_a7b9350ff08a4e7eb08e76f9166ffaea", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_9431dcad770a4e6b8b1dd56d8a0d7f81" + } + }, + "b8ac8d3917064a18a6e9604d461a7808": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_d4edb8f296204759aa27310387ebef9f", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.31it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_4fa8be417491436a91948b9dac976edb" + } + }, + "a7b9350ff08a4e7eb08e76f9166ffaea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "9431dcad770a4e6b8b1dd56d8a0d7f81": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "d4edb8f296204759aa27310387ebef9f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "4fa8be417491436a91948b9dac976edb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "a14e487e449340d3aa52ac1e9b21f9f7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_80b89ea7d3d14741a12ce85d02b2c5d7", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_1cde68eb6c0348cfae7def1bda5ded3b", + "IPY_MODEL_95b2d5c74e104963847c192bc4c8c9f5" + ] + } + }, + "80b89ea7d3d14741a12ce85d02b2c5d7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "1cde68eb6c0348cfae7def1bda5ded3b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_ff38b7357e5d4af4ac536a61e9a264b8", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_f531e64ae0c74d2fa971336bd35db767" + } + }, + "95b2d5c74e104963847c192bc4c8c9f5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_a0b5e21cb0ab4660abfcdeeb2ba67e63", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_29fa621ad1e7401b9fb4193c20ed05b0" + } + }, + "ff38b7357e5d4af4ac536a61e9a264b8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "f531e64ae0c74d2fa971336bd35db767": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "a0b5e21cb0ab4660abfcdeeb2ba67e63": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "29fa621ad1e7401b9fb4193c20ed05b0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "9d54c42108614290b074eec07ed303b3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_ba3deef65b3d40f9bc16c653fd81ccba", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_7e724292b77945c8a7296e36f2591dcc", + "IPY_MODEL_6cb686afe4014d42897877c6e420a656" + ] + } + }, + "ba3deef65b3d40f9bc16c653fd81ccba": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "7e724292b77945c8a7296e36f2591dcc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_d8fd9c3b703e49948f076a3222a49561", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_760f6319b1794384846fe7280723b03e" + } + }, + "6cb686afe4014d42897877c6e420a656": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_d4f79426700a456a8ffb1512f65dc903", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_121f4d9f367a4d20a9fb5678d235740a" + } + }, + "d8fd9c3b703e49948f076a3222a49561": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "760f6319b1794384846fe7280723b03e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "d4f79426700a456a8ffb1512f65dc903": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "121f4d9f367a4d20a9fb5678d235740a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "4699e9378f8e42ef86889404108b028b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_74536b3bb9424a2bb8d0158b5f68d8ec", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_f32fd684c9c244d1b9620c32589ff23f", + "IPY_MODEL_65f99126ccae4562ac5ece1cebdf3d1d" + ] + } + }, + "74536b3bb9424a2bb8d0158b5f68d8ec": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "f32fd684c9c244d1b9620c32589ff23f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_a2b568efadbb46258f746d10d735b322", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_67438e6e9ff54e58a7e10d4b4e50fd6c" + } + }, + "65f99126ccae4562ac5ece1cebdf3d1d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_779df4a6e9144b298e67af31aa8e8b79", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.35it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_f8f52e69d04b43d4bd6ae1334ff2a098" + } + }, + "a2b568efadbb46258f746d10d735b322": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "67438e6e9ff54e58a7e10d4b4e50fd6c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "779df4a6e9144b298e67af31aa8e8b79": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "f8f52e69d04b43d4bd6ae1334ff2a098": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "bf7df41baa014e84a91bb1f6247a33a9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_e893c307ec5449d1b294fe75bb2f33dd", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_a12d94dd2b73406a838a1d8e28f88e7b", + "IPY_MODEL_71369ad6685248d8af82cb2f4a2e9775" + ] + } + }, + "e893c307ec5449d1b294fe75bb2f33dd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "a12d94dd2b73406a838a1d8e28f88e7b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_ad421bd6544d4219aaf3fbe4834897f7", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_bea668dc900942e2aca20a1ca79ae78b" + } + }, + "71369ad6685248d8af82cb2f4a2e9775": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_c98815794329489dbb71a38cc1f68efe", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.35it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_f65566ae7182461b944bddf31ae29deb" + } + }, + "ad421bd6544d4219aaf3fbe4834897f7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "bea668dc900942e2aca20a1ca79ae78b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "c98815794329489dbb71a38cc1f68efe": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "f65566ae7182461b944bddf31ae29deb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "f52ca000017e42e6a2373d25a3ebf1fb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_e3d7dc32e86d4ff79c99e4d217e1b168", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_e9769a637e1a4537a9fbec0a0a3448d7", + "IPY_MODEL_b1ff952e3af84e7787497d0c1623ccb8" + ] + } + }, + "e3d7dc32e86d4ff79c99e4d217e1b168": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "e9769a637e1a4537a9fbec0a0a3448d7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_10f5ef3e9369428897d81af6a835e23d", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_8ecdd48377834aeb98bf35f1d817810c" + } + }, + "b1ff952e3af84e7787497d0c1623ccb8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_10a8c613bfdd457fb343cf57b5551cb6", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:53<00:00, 3.35it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_a057f933d57e42fe9558b07ae93cd250" + } + }, + "10f5ef3e9369428897d81af6a835e23d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "8ecdd48377834aeb98bf35f1d817810c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "10a8c613bfdd457fb343cf57b5551cb6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "a057f933d57e42fe9558b07ae93cd250": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "5107bc0b61c54b0e9a8dc0008c9693da": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_5b9f76d0ce68428bbc7bf5381818d4e6", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_76d86ce32ef648b49d13e304345401a7", + "IPY_MODEL_3e8f80ed649445cab0b3719c8d6b3ada" + ] + } + }, + "5b9f76d0ce68428bbc7bf5381818d4e6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "76d86ce32ef648b49d13e304345401a7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_6c6e3b3aaf894dec9f795594d5871f1b", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_e0d9feaee28e461a8ecf5cc62e58836d" + } + }, + "3e8f80ed649445cab0b3719c8d6b3ada": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_82a2c3090c914e8b979e6214dba22607", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.33it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_93de15083ab94a20958f1a7146420d2f" + } + }, + "6c6e3b3aaf894dec9f795594d5871f1b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "e0d9feaee28e461a8ecf5cc62e58836d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "82a2c3090c914e8b979e6214dba22607": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "93de15083ab94a20958f1a7146420d2f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "38d72545f29b4cdcafce2a181cc3832f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_9034be24725843acac9faa27bb6f444b", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_03b33f02ccfd4d73a9ac342165bd704a", + "IPY_MODEL_1eb3e9125d50401ea2bf575f760a0387" + ] + } + }, + "9034be24725843acac9faa27bb6f444b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "03b33f02ccfd4d73a9ac342165bd704a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_c992add9eefd41ca9401d99cf7c46da4", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_e2b65978de654b31b8c9dcacca7faf58" + } + }, + "1eb3e9125d50401ea2bf575f760a0387": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_c1dcf2d1d3704012921a37342e8b7df0", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:53<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_acc8b4609dfc46489f4f67939e013065" + } + }, + "c992add9eefd41ca9401d99cf7c46da4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "e2b65978de654b31b8c9dcacca7faf58": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "c1dcf2d1d3704012921a37342e8b7df0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "acc8b4609dfc46489f4f67939e013065": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "eeac5e28e731499faaa353d6fa3ad894": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_ed714984ed6844f8a5805476a3bd3a7c", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_0695e07278744e78a816227976e84b4b", + "IPY_MODEL_e4160a3297c14d489e714dfc0b714185" + ] + } + }, + "ed714984ed6844f8a5805476a3bd3a7c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "0695e07278744e78a816227976e84b4b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_42f5f038d00b4f44992cd93f28567960", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_4cda9c4c313446498684b2dd99b7707e" + } + }, + "e4160a3297c14d489e714dfc0b714185": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_15523047c2dd4ac5a008226eb4b23bb0", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:51<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_46c4d0ce0a0e47068308c7e37f85bc0c" + } + }, + "42f5f038d00b4f44992cd93f28567960": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "4cda9c4c313446498684b2dd99b7707e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "15523047c2dd4ac5a008226eb4b23bb0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "46c4d0ce0a0e47068308c7e37f85bc0c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "e6d52fced02e469e998e01d5245544b6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_5fbb77510fb245429ac6735ae51e7bfa", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_600e76abd8d5411088f3e9c4173d351b", + "IPY_MODEL_88ea03ac8483435692855d48ed4f6b52" + ] + } + }, + "5fbb77510fb245429ac6735ae51e7bfa": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "600e76abd8d5411088f3e9c4173d351b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_802e2caf48c64e1b9ea127214a57e0a3", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_793eb4c5ed4343f4b1ce7d29df15572e" + } + }, + "88ea03ac8483435692855d48ed4f6b52": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_276bc6c9841644bc914e733245b34ec3", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.35it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_9ef30da0690b412d9c3ac29a9edd8965" + } + }, + "802e2caf48c64e1b9ea127214a57e0a3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "793eb4c5ed4343f4b1ce7d29df15572e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "276bc6c9841644bc914e733245b34ec3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "9ef30da0690b412d9c3ac29a9edd8965": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "1e21595335554508bd30c734fc33b7f6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_472276c706b74efeabe01f3ee192da0a", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_97b0a7cfd6ff4f07a6aaf5b211099a5a", + "IPY_MODEL_cda74ae81fc14bd196754a8d5a39bf98" + ] + } + }, + "472276c706b74efeabe01f3ee192da0a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "97b0a7cfd6ff4f07a6aaf5b211099a5a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_b0bb816f9d4f48429060d97955389d8f", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_5b4c61f4892040f0b8e317eefc18ea78" + } + }, + "cda74ae81fc14bd196754a8d5a39bf98": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_f010b2acf00149518f6ea5e4a62e7061", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:51<00:00, 3.36it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_7002bbc80fbd46f5838975b6f23e8b70" + } + }, + "b0bb816f9d4f48429060d97955389d8f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "5b4c61f4892040f0b8e317eefc18ea78": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "f010b2acf00149518f6ea5e4a62e7061": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "7002bbc80fbd46f5838975b6f23e8b70": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "400fef02ba84494c8d6c49dd98645649": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_d3ec24f9193e4226b83fe4279cde82bd", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_62dc2beca1f14783aaeca7583fce4d46", + "IPY_MODEL_3c6c617bd6014f1aa5e7eeee138fb925" + ] + } + }, + "d3ec24f9193e4226b83fe4279cde82bd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "62dc2beca1f14783aaeca7583fce4d46": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_60e6ec9c5411453aa67de9c793c5aac0", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_375843f975f4444e89fcd567eeadcc5c" + } + }, + "3c6c617bd6014f1aa5e7eeee138fb925": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_d96946d0cd3e407bb5ec98139a87f780", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:51<00:00, 3.36it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_c7cb2a50ed3b4d0cbc6b7fcc4f7ff58a" + } + }, + "60e6ec9c5411453aa67de9c793c5aac0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "375843f975f4444e89fcd567eeadcc5c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "d96946d0cd3e407bb5ec98139a87f780": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "c7cb2a50ed3b4d0cbc6b7fcc4f7ff58a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "7ce455ccdab94cba8860372d03f0a92c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_8ea1e817cf0e424ca0c922f0f0de64f5", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_295d87c50de3439b9036c1cc3f1527cd", + "IPY_MODEL_7c212c73669c4493bd9f0d9b581d8617" + ] + } + }, + "8ea1e817cf0e424ca0c922f0f0de64f5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "295d87c50de3439b9036c1cc3f1527cd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_d0721e5d7f284f778013d41961e9a361", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_c54823ec43844bbfbe6eddda52cdca6b" + } + }, + "7c212c73669c4493bd9f0d9b581d8617": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_928a129b59864827a32244f4ad1ddb6f", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:51<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_c29fc55722504119a210fe6766ccb822" + } + }, + "d0721e5d7f284f778013d41961e9a361": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "c54823ec43844bbfbe6eddda52cdca6b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "928a129b59864827a32244f4ad1ddb6f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "c29fc55722504119a210fe6766ccb822": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "8c0291db4e314219bef1272f59586487": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_6d19beefef404a278dafddaaef8eb885", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_1ebf8b4328774d718c0d79b2d417a8b6", + "IPY_MODEL_311f3859f7c9410eabcaf15db0f25f0b" + ] + } + }, + "6d19beefef404a278dafddaaef8eb885": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "1ebf8b4328774d718c0d79b2d417a8b6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_f732d3c35291427382abe38a2f90cfc6", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_e6e18ceca0834115b6647063bd60c765" + } + }, + "311f3859f7c9410eabcaf15db0f25f0b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_3eea0cb3cdaf4255af46ea4a114135e6", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:51<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_a0beea6197254054a179e4a5d163645a" + } + }, + "f732d3c35291427382abe38a2f90cfc6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "e6e18ceca0834115b6647063bd60c765": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "3eea0cb3cdaf4255af46ea4a114135e6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "a0beea6197254054a179e4a5d163645a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "34a1891498e546ee8593cc26ee8500e6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_4336336b6ebf4937ae12c24e6a755825", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_cfbbbb3f330b4d739e55965e5d7934aa", + "IPY_MODEL_7b607a78fd96498ca890e46afe30d0f7" + ] + } + }, + "4336336b6ebf4937ae12c24e6a755825": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "cfbbbb3f330b4d739e55965e5d7934aa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_c10f450cd788464e9609920360b1dac9", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_9b6f156b8f864ad082b946ec079dfc67" + } + }, + "7b607a78fd96498ca890e46afe30d0f7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_f43ef9b8ad934936bb0c715894d9291d", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:53<00:00, 3.33it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_42381e207ea64806b0b8453c59362db6" + } + }, + "c10f450cd788464e9609920360b1dac9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "9b6f156b8f864ad082b946ec079dfc67": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "f43ef9b8ad934936bb0c715894d9291d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "42381e207ea64806b0b8453c59362db6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "3c50f8ca386d483eac3c5804bb6e4a24": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_2b20a2ed4c434359b05bda829363e387", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_358f3301c91d45218ea5f2de82095f1f", + "IPY_MODEL_90236d4e68134c0c9f2eb0dcbe473769" + ] + } + }, + "2b20a2ed4c434359b05bda829363e387": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "358f3301c91d45218ea5f2de82095f1f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_e6d01e97b3fc4a2397b29052756541dd", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_a09cc860ec164e35802bf532531908ef" + } + }, + "90236d4e68134c0c9f2eb0dcbe473769": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_783bc8133edb4af9849e391e50952f6d", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:53<00:00, 3.33it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_a62b5d399da14a63bb39fa8ecc3b2679" + } + }, + "e6d01e97b3fc4a2397b29052756541dd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "a09cc860ec164e35802bf532531908ef": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "783bc8133edb4af9849e391e50952f6d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "a62b5d399da14a63bb39fa8ecc3b2679": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "91c43686b5ff4eeebb3c9eaff2ea5a0d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_3a1a9213ebdb48b48153882cfadeee52", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_a80637916179482e8464990cb027a2b2", + "IPY_MODEL_304076b88a6742299d236b9f13857bac" + ] + } + }, + "3a1a9213ebdb48b48153882cfadeee52": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "a80637916179482e8464990cb027a2b2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_a190996a318644ac833d99f3ca4777b5", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_2745b38d6ec245308ed7bbfeeedcaf53" + } + }, + "304076b88a6742299d236b9f13857bac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_7b1cd36a28e249a8b236b4fc329a26f1", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_7a46f0eab8cf401f9c5e0059e0ad3876" + } + }, + "a190996a318644ac833d99f3ca4777b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "2745b38d6ec245308ed7bbfeeedcaf53": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "7b1cd36a28e249a8b236b4fc329a26f1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "7a46f0eab8cf401f9c5e0059e0ad3876": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "9ad1d638c2ae4c8399b0f6b56936668c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_1b6b16e926a74796add83caec51dad82", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_89a860a124084fd2bdbd05a82a170519", + "IPY_MODEL_aa7d0b5deb004a7697f45466bdc20dbf" + ] + } + }, + "1b6b16e926a74796add83caec51dad82": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "89a860a124084fd2bdbd05a82a170519": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_2803b878fcbe4ef5bedadb5dc6ecabe8", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_56038641a5404d679dc935a7ef38720e" + } + }, + "aa7d0b5deb004a7697f45466bdc20dbf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_de92895dfa064c5699de3210cf56ba71", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_0074031873dc48c9ba71b2eefb47ab13" + } + }, + "2803b878fcbe4ef5bedadb5dc6ecabe8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "56038641a5404d679dc935a7ef38720e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "de92895dfa064c5699de3210cf56ba71": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "0074031873dc48c9ba71b2eefb47ab13": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "f00fc81692684f739ac13939ab8fd598": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_8441763d00614ae2b2943a53f9b4e9c1", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_79466a60b4cd4fc299b4faf9ba20a420", + "IPY_MODEL_089b6207f67a4971b0c87bb956460290" + ] + } + }, + "8441763d00614ae2b2943a53f9b4e9c1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "79466a60b4cd4fc299b4faf9ba20a420": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_fc323a3a3a7948629c89fb7ebf5f822e", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_4be275d6d6044a24b894f6f31b0cd559" + } + }, + "089b6207f67a4971b0c87bb956460290": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_28e97c0e0191430b97c228d3de943c4a", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:53<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_0b7b54653a384681918c4ba33d17ee92" + } + }, + "fc323a3a3a7948629c89fb7ebf5f822e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "4be275d6d6044a24b894f6f31b0cd559": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "28e97c0e0191430b97c228d3de943c4a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "0b7b54653a384681918c4ba33d17ee92": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "26f15abbd984451a977c04aee589f929": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_d4e5db8120584033974018b63ff0aed2", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_d263e53ef70541e9ac2a26c350c9e67f", + "IPY_MODEL_198a2cee0d3c43b5ba1d2e209166bfee" + ] + } + }, + "d4e5db8120584033974018b63ff0aed2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "d263e53ef70541e9ac2a26c350c9e67f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_941e033e2da6484e80b2406283db680a", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_ecf94a2ab1584067939d1bfa37d87d70" + } + }, + "198a2cee0d3c43b5ba1d2e209166bfee": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_fb069bf77dd3435daa51b759337152af", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:53<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_f1c551e96b9b4cb989557a207fe1c68e" + } + }, + "941e033e2da6484e80b2406283db680a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "ecf94a2ab1584067939d1bfa37d87d70": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "fb069bf77dd3435daa51b759337152af": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "f1c551e96b9b4cb989557a207fe1c68e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "3751907cc0ce410fa644ac9386dbfe56": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_bc2615d7b792446c830a180d5ea04de9", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_bfd8b031899b4153986d108fbd502083", + "IPY_MODEL_ff8e1631ad12406f9b33d3633b25d8ec" + ] + } + }, + "bc2615d7b792446c830a180d5ea04de9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "bfd8b031899b4153986d108fbd502083": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_180a70b8888b416da705ff6b8eff447c", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_d65567a09eec4bb4a2ce4887164e4a99" + } + }, + "ff8e1631ad12406f9b33d3633b25d8ec": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_b9e809eb192a4f1981fb011b8a50f8eb", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.33it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_11a5fbe3907841fd91310afb048977f9" + } + }, + "180a70b8888b416da705ff6b8eff447c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "d65567a09eec4bb4a2ce4887164e4a99": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "b9e809eb192a4f1981fb011b8a50f8eb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "11a5fbe3907841fd91310afb048977f9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "4efde29749d84c778e48b9c4d8b49ac0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_b78a22b8a51f4511a549b2c1f4c1ffde", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_b6e01e8b7432431e8a142a88d37c5055", + "IPY_MODEL_2c3337a6d9e24596a8088a2c3e7f6d8a" + ] + } + }, + "b78a22b8a51f4511a549b2c1f4c1ffde": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "b6e01e8b7432431e8a142a88d37c5055": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_2fb2937480e34c4ea00abc0abe10f9cf", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_3333b071f0d44e49963ab90a08976759" + } + }, + "2c3337a6d9e24596a8088a2c3e7f6d8a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_5e6b64f6f7ce496dbf45bac8d16f116e", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:53<00:00, 3.35it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_77aa5222a45d42709c115af77bfe3832" + } + }, + "2fb2937480e34c4ea00abc0abe10f9cf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "3333b071f0d44e49963ab90a08976759": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "5e6b64f6f7ce496dbf45bac8d16f116e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "77aa5222a45d42709c115af77bfe3832": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "14fb7b380abe4efc8d6b6233ec932a28": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_f5e42d2beaf146bc915ab0c0a0740668", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_0de5c7e23dca4241b12993db1c14891c", + "IPY_MODEL_21ce0e9d00d0405ca1ac16dc44054da0" + ] + } + }, + "f5e42d2beaf146bc915ab0c0a0740668": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "0de5c7e23dca4241b12993db1c14891c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_501b0c5f2c7c48a1bf50962d02561056", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_49a637fd6f8644f98f18c8724d7d403e" + } + }, + "21ce0e9d00d0405ca1ac16dc44054da0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_4850e6b355364c68a3f72f8f9011c458", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.33it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_7710d025a5764798a383eb6084ad1634" + } + }, + "501b0c5f2c7c48a1bf50962d02561056": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "49a637fd6f8644f98f18c8724d7d403e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "4850e6b355364c68a3f72f8f9011c458": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "7710d025a5764798a383eb6084ad1634": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "22b0c39593834b7f8fa33322fbc38237": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_03b1a599e2834f7e88a83b9deb4e5cfa", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_3b16479fc7a5433fa287ab9d01668e0b", + "IPY_MODEL_181d194cc489465cb137d72908cd1133" + ] + } + }, + "03b1a599e2834f7e88a83b9deb4e5cfa": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "3b16479fc7a5433fa287ab9d01668e0b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_62ef0b077bc04e6382155ca0095859d2", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_1b0b3dc73e434262b1f6d7f60f5bafd1" + } + }, + "181d194cc489465cb137d72908cd1133": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_cf1af66b024d4e9db3cc3e968698979f", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.33it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_89fc0ae065b045b8942dec045f2e58b4" + } + }, + "62ef0b077bc04e6382155ca0095859d2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "1b0b3dc73e434262b1f6d7f60f5bafd1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "cf1af66b024d4e9db3cc3e968698979f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "89fc0ae065b045b8942dec045f2e58b4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "1bffbb9459414f24aa6f0c46cd99d987": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_55751bbae38949e39d9b441f06d1cff5", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_9d063fbce6c94842954ed94d75983bf5", + "IPY_MODEL_3a899a80c4ce46bdbc83bdfe03c63505" + ] + } + }, + "55751bbae38949e39d9b441f06d1cff5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "9d063fbce6c94842954ed94d75983bf5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_bab389e096904462a8ae70485b290636", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_a1320f59c5a64a5fadc464c6883c2eba" + } + }, + "3a899a80c4ce46bdbc83bdfe03c63505": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_9820a93f6f024c518256abb7b6707c07", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_7c0dcc29e90d49759169baf2628a4568" + } + }, + "bab389e096904462a8ae70485b290636": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "a1320f59c5a64a5fadc464c6883c2eba": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "9820a93f6f024c518256abb7b6707c07": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "7c0dcc29e90d49759169baf2628a4568": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "8ab63c57832e4490aa796da338ff696e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_49ced01dff814e26bd879e6db458e5e9", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_ab431859c91f4b588694206419a23735", + "IPY_MODEL_a815feffe1474fc08cb661dcafdac13a" + ] + } + }, + "49ced01dff814e26bd879e6db458e5e9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "ab431859c91f4b588694206419a23735": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_64a5a67e2a8941c48034495b72a4153b", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_383721cbd75c4934b4a1e19b016fad4f" + } + }, + "a815feffe1474fc08cb661dcafdac13a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_971ea09ced1846b7a42e9e065349a276", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.34it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_cfe721e3396e48d78da89178e73d2c7b" + } + }, + "64a5a67e2a8941c48034495b72a4153b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "383721cbd75c4934b4a1e19b016fad4f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "971ea09ced1846b7a42e9e065349a276": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "cfe721e3396e48d78da89178e73d2c7b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "df66145c19c34c569f38818a36a62780": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_c578d2caf5504e95b9e1435fd4103060", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_342e0a3c2f2844a7b2d26ddad0ce3438", + "IPY_MODEL_02350f0dde6a4b4b9c962e4e77a9a97b" + ] + } + }, + "c578d2caf5504e95b9e1435fd4103060": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "342e0a3c2f2844a7b2d26ddad0ce3438": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_5c535cb28d424e40b791cfe7c8b6327a", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_8a5d1ed71b8d42cc8160b84aa57b86c4" + } + }, + "02350f0dde6a4b4b9c962e4e77a9a97b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_55a2c7621d494c15aa145f2479f29545", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 165/165 [00:52<00:00, 3.36it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_818f4e2b00be4e32a33786a7b02144e1" + } + }, + "5c535cb28d424e40b791cfe7c8b6327a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "8a5d1ed71b8d42cc8160b84aa57b86c4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "55a2c7621d494c15aa145f2479f29545": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "818f4e2b00be4e32a33786a7b02144e1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + } + } + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "kHyVSq1qeRFX", + "colab_type": "text" + }, + "source": [ + "## Download the data from Kaggle" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iGao6J6XeYNu", + "colab_type": "text" + }, + "source": [ + "Please go to Kaggle and create an API key to download the data. Follow [this guide](https://www.kaggle.com/general/74235) to do it.\n", + "\n", + "The code in the cells below will prompt you for the kaggle.json file you've downloaded from the Kaggle and do the rest of the connection establishing and data downloading." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "pAzkTEOLeNsZ", + "colab_type": "code", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/files.js": { + "data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCkgewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwogICAgICBwZXJjZW50LnRleHRDb250ZW50ID0KICAgICAgICAgIGAke01hdGgucm91bmQoKHBvc2l0aW9uIC8gZmlsZURhdGEuYnl0ZUxlbmd0aCkgKiAxMDApfSUgZG9uZWA7CiAgICB9CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK", + "ok": true, + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 73 + }, + "outputId": "eee77b1b-8762-407b-888b-d631fc3df4d8" + }, + "source": [ + "! pip install -q kaggle\n", + "\n", + "import os\n", + "from google.colab import files\n", + "\n", + "if not os.path.exists(\"/root/.kaggle/kaggle.json\"):\n", + " files.upload()\n", + " ! mkdir -p ~/.kaggle\n", + " ! mv kaggle.json ~/.kaggle/ \n", + " ! chmod 600 ~/.kaggle/kaggle.json" + ], + "execution_count": 1, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " Upload widget is only available when the cell has been executed in the\n", + " current browser session. Please rerun this cell to enable.\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Saving kaggle.json to kaggle.json\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L__k7xBwfG9A", + "colab_type": "text" + }, + "source": [ + "Check if everything is correct." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "uxVTdVdHfI4C", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 425 + }, + "outputId": "e2e46fec-c365-4c0b-9d00-3f6de8d90d34" + }, + "source": [ + "! kaggle datasets list" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Warning: Looks like you're using an outdated API Version, please consider updating (server 1.5.6 / client 1.5.4)\n", + "ref title size lastUpdated downloadCount \n", + "------------------------------------------------------------------ -------------------------------------------------- ----- ------------------- ------------- \n", + "anikannal/solar-power-generation-data Solar Power Generation Data 2MB 2020-08-18 15:52:03 830 \n", + "ruchi798/bookcrossing-dataset Book-Crossing: User review ratings 25MB 2020-08-11 10:40:25 213 \n", + "nehaprabhavalkar/av-healthcare-analytics-ii AV : Healthcare Analytics II 7MB 2020-08-29 03:40:10 350 \n", + "Cornell-University/arxiv arXiv Dataset 880MB 2020-08-27 23:07:17 2298 \n", + "imoore/60k-stack-overflow-questions-with-quality-rate 60k Stack Overflow Questions with Quality Rating 21MB 2020-08-31 22:20:53 75 \n", + "tunguz/us-elections-dataset US Elections Dataset 7MB 2020-08-28 15:19:03 293 \n", + "ihelon/lego-minifigures-classification LEGO Minifigures Classification 5MB 2020-09-02 19:35:20 148 \n", + "jerzydziewierz/bee-vs-wasp Bee or wasp? 559MB 2020-08-23 18:07:47 38 \n", + "jayitabhattacharyya/face-match face match 427MB 2020-08-29 07:38:53 30 \n", + "douglaskgaraujo/opportunity-insights-real-time-economic-tracker-us Opportunity Insights real time Economic Tracker US 19MB 2020-08-30 20:37:18 43 \n", + "claytonmiller/interpretation-of-thermal-perception-scales Interpretation of Thermal Perception Scales 737KB 2020-08-31 12:23:51 15 \n", + "jmmvutu/summer-products-and-sales-in-ecommerce-wish Sales of summer clothes in E-commerce Wish 376KB 2020-08-23 15:16:46 4158 \n", + "agirlcoding/all-space-missions-from-1957 All Space Missions from 1957 101KB 2020-08-13 16:18:58 2095 \n", + "gpreda/covid19-tweets COVID19 Tweets 28MB 2020-08-30 09:38:38 3792 \n", + "landlord/handwriting-recognition Handwriting Recognition 1GB 2020-08-05 17:20:36 687 \n", + "jacobbaruch/basketball-players-stats-per-season-49-leagues Basketball Players Stats per Season - 49 Leagues 2MB 2020-09-02 19:27:11 867 \n", + "google/tinyquickdraw QuickDraw Sketches 11GB 2018-04-18 19:38:04 2254 \n", + "datasnaek/youtube-new Trending YouTube Video Statistics 201MB 2019-06-03 00:56:47 103009 \n", + "zynicide/wine-reviews Wine Reviews 51MB 2017-11-27 17:08:04 111043 \n", + "datasnaek/chess Chess Game Dataset (Lichess) 3MB 2017-09-04 03:09:09 8442 \n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "E_7DL8esfP_G", + "colab_type": "text" + }, + "source": [ + "Download Food-101 dataset.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hdNmL-ocfJvh", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "9e296196-651d-487e-acdb-73b814eb36d9" + }, + "source": [ + "if not os.path.exists('/content/food-101'):\n", + " !kaggle datasets download -d dansbecker/food-101\n", + " !unzip -o food-101.zip \n", + " !unzip -q food-101.zip -x food-101.zip \n", + " !rm food-101.zip" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "text": [ + "\u001b[1;30;43mStreaming output truncated to the last 5000 lines.\u001b[0m\n", + " inflating: food-101/food-101/images/tacos/1033196.jpg \n", + " inflating: food-101/food-101/images/tacos/1036030.jpg \n", + " inflating: food-101/food-101/images/tacos/1042175.jpg \n", + " inflating: food-101/food-101/images/tacos/1044043.jpg \n", + " inflating: food-101/food-101/images/tacos/1058697.jpg \n", + " inflating: food-101/food-101/images/tacos/1059239.jpg \n", + " inflating: food-101/food-101/images/tacos/1059326.jpg \n", + " inflating: food-101/food-101/images/tacos/1066762.jpg \n", + " inflating: food-101/food-101/images/tacos/1070967.jpg \n", + " inflating: food-101/food-101/images/tacos/1073468.jpg \n", + " inflating: food-101/food-101/images/tacos/1075296.jpg \n", + " inflating: food-101/food-101/images/tacos/1085243.jpg \n", + " inflating: food-101/food-101/images/tacos/108529.jpg \n", + " inflating: food-101/food-101/images/tacos/1086014.jpg \n", + " inflating: food-101/food-101/images/tacos/108945.jpg \n", + " inflating: food-101/food-101/images/tacos/1089575.jpg \n", + " inflating: food-101/food-101/images/tacos/1091159.jpg \n", + " inflating: food-101/food-101/images/tacos/1101369.jpg \n", + " inflating: food-101/food-101/images/tacos/1109058.jpg \n", + " inflating: food-101/food-101/images/tacos/1109744.jpg \n", + " inflating: food-101/food-101/images/tacos/1119371.jpg \n", + " inflating: food-101/food-101/images/tacos/1123766.jpg \n", + " inflating: food-101/food-101/images/tacos/1124625.jpg \n", + " inflating: food-101/food-101/images/tacos/1130893.jpg \n", + " inflating: food-101/food-101/images/tacos/1135415.jpg \n", + " inflating: food-101/food-101/images/tacos/1135700.jpg \n", + " inflating: food-101/food-101/images/tacos/1136805.jpg \n", + " inflating: food-101/food-101/images/tacos/1137119.jpg \n", + " inflating: food-101/food-101/images/tacos/1147458.jpg \n", + " inflating: food-101/food-101/images/tacos/1152582.jpg \n", + " inflating: food-101/food-101/images/tacos/1154429.jpg \n", + " inflating: food-101/food-101/images/tacos/1158522.jpg \n", + " inflating: food-101/food-101/images/tacos/1158965.jpg \n", + " inflating: food-101/food-101/images/tacos/1159023.jpg \n", + " inflating: food-101/food-101/images/tacos/1162503.jpg \n", + " inflating: food-101/food-101/images/tacos/1164998.jpg \n", + " inflating: food-101/food-101/images/tacos/1165330.jpg \n", + " inflating: food-101/food-101/images/tacos/1176039.jpg \n", + " inflating: food-101/food-101/images/tacos/1181683.jpg \n", + " inflating: food-101/food-101/images/tacos/1188062.jpg \n", + " inflating: food-101/food-101/images/tacos/1188477.jpg \n", + " inflating: food-101/food-101/images/tacos/1189793.jpg \n", + " inflating: food-101/food-101/images/tacos/1195600.jpg \n", + " inflating: food-101/food-101/images/tacos/1199299.jpg \n", + " inflating: food-101/food-101/images/tacos/1200047.jpg \n", + " inflating: food-101/food-101/images/tacos/1200178.jpg \n", + " inflating: food-101/food-101/images/tacos/1205090.jpg \n", + " inflating: food-101/food-101/images/tacos/121283.jpg \n", + " inflating: food-101/food-101/images/tacos/1213116.jpg \n", + " inflating: food-101/food-101/images/tacos/1217263.jpg \n", + " inflating: food-101/food-101/images/tacos/1224181.jpg \n", + " inflating: food-101/food-101/images/tacos/1224556.jpg \n", + " inflating: food-101/food-101/images/tacos/122809.jpg \n", + " inflating: food-101/food-101/images/tacos/1231428.jpg \n", + " inflating: food-101/food-101/images/tacos/1234952.jpg \n", + " inflating: food-101/food-101/images/tacos/123968.jpg \n", + " inflating: food-101/food-101/images/tacos/1249525.jpg \n", + " inflating: food-101/food-101/images/tacos/1251335.jpg \n", + " inflating: food-101/food-101/images/tacos/1253602.jpg \n", + " inflating: food-101/food-101/images/tacos/1255478.jpg \n", + " inflating: food-101/food-101/images/tacos/125623.jpg \n", + " inflating: food-101/food-101/images/tacos/1269896.jpg \n", + " inflating: food-101/food-101/images/tacos/127545.jpg \n", + " inflating: food-101/food-101/images/tacos/1275556.jpg \n", + " inflating: food-101/food-101/images/tacos/1277134.jpg \n", + " inflating: food-101/food-101/images/tacos/1280660.jpg \n", + " inflating: food-101/food-101/images/tacos/128139.jpg \n", + " inflating: food-101/food-101/images/tacos/1284207.jpg \n", + " inflating: food-101/food-101/images/tacos/1288391.jpg \n", + " inflating: food-101/food-101/images/tacos/1288774.jpg \n", + " inflating: food-101/food-101/images/tacos/1290874.jpg \n", + " inflating: food-101/food-101/images/tacos/1303466.jpg \n", + " inflating: food-101/food-101/images/tacos/1314186.jpg \n", + " inflating: food-101/food-101/images/tacos/1316537.jpg \n", + " inflating: food-101/food-101/images/tacos/131906.jpg \n", + " inflating: food-101/food-101/images/tacos/1320199.jpg \n", + " inflating: food-101/food-101/images/tacos/132307.jpg \n", + " inflating: food-101/food-101/images/tacos/1324636.jpg \n", + " inflating: food-101/food-101/images/tacos/1329233.jpg \n", + " inflating: food-101/food-101/images/tacos/1337608.jpg \n", + " inflating: food-101/food-101/images/tacos/1344920.jpg \n", + " inflating: food-101/food-101/images/tacos/1350945.jpg \n", + " inflating: food-101/food-101/images/tacos/1350948.jpg \n", + " inflating: food-101/food-101/images/tacos/1351099.jpg \n", + " inflating: food-101/food-101/images/tacos/1352156.jpg \n", + " inflating: food-101/food-101/images/tacos/1356617.jpg \n", + " inflating: food-101/food-101/images/tacos/1359952.jpg \n", + " inflating: food-101/food-101/images/tacos/1360241.jpg \n", + " inflating: food-101/food-101/images/tacos/1369038.jpg \n", + " inflating: food-101/food-101/images/tacos/1372662.jpg \n", + " inflating: food-101/food-101/images/tacos/1374617.jpg \n", + " inflating: food-101/food-101/images/tacos/1376445.jpg \n", + " inflating: food-101/food-101/images/tacos/1383711.jpg \n", + " inflating: food-101/food-101/images/tacos/1403364.jpg \n", + " inflating: food-101/food-101/images/tacos/1411396.jpg \n", + " inflating: food-101/food-101/images/tacos/1412569.jpg \n", + " inflating: food-101/food-101/images/tacos/1413480.jpg \n", + " inflating: food-101/food-101/images/tacos/1414051.jpg \n", + " inflating: food-101/food-101/images/tacos/1417456.jpg \n", + " inflating: food-101/food-101/images/tacos/1425497.jpg \n", + " inflating: food-101/food-101/images/tacos/1426564.jpg \n", + " inflating: food-101/food-101/images/tacos/1430868.jpg \n", + " inflating: food-101/food-101/images/tacos/1434865.jpg \n", + " inflating: food-101/food-101/images/tacos/1435442.jpg \n", + " inflating: food-101/food-101/images/tacos/1441011.jpg \n", + " inflating: food-101/food-101/images/tacos/1441211.jpg \n", + " inflating: food-101/food-101/images/tacos/1448465.jpg \n", + " inflating: food-101/food-101/images/tacos/144852.jpg \n", + " inflating: food-101/food-101/images/tacos/1450478.jpg \n", + " inflating: food-101/food-101/images/tacos/1453145.jpg \n", + " inflating: food-101/food-101/images/tacos/1454976.jpg \n", + " inflating: food-101/food-101/images/tacos/145794.jpg \n", + " inflating: food-101/food-101/images/tacos/1458312.jpg \n", + " inflating: food-101/food-101/images/tacos/1474360.jpg \n", + " inflating: food-101/food-101/images/tacos/1476158.jpg \n", + " inflating: food-101/food-101/images/tacos/1479541.jpg \n", + " inflating: food-101/food-101/images/tacos/1482865.jpg \n", + " inflating: food-101/food-101/images/tacos/1483183.jpg \n", + " inflating: food-101/food-101/images/tacos/1492228.jpg \n", + " inflating: food-101/food-101/images/tacos/1495230.jpg \n", + " inflating: food-101/food-101/images/tacos/1495685.jpg \n", + " inflating: food-101/food-101/images/tacos/1497247.jpg \n", + " inflating: food-101/food-101/images/tacos/1498055.jpg \n", + " inflating: food-101/food-101/images/tacos/1505262.jpg \n", + " inflating: food-101/food-101/images/tacos/1505491.jpg \n", + " inflating: food-101/food-101/images/tacos/1511713.jpg \n", + " inflating: food-101/food-101/images/tacos/1514885.jpg \n", + " inflating: food-101/food-101/images/tacos/1514936.jpg \n", + " inflating: food-101/food-101/images/tacos/1515524.jpg \n", + " inflating: food-101/food-101/images/tacos/1519607.jpg \n", + " inflating: food-101/food-101/images/tacos/1521733.jpg \n", + " inflating: food-101/food-101/images/tacos/152327.jpg \n", + " inflating: food-101/food-101/images/tacos/1524571.jpg \n", + " inflating: food-101/food-101/images/tacos/1525342.jpg \n", + " inflating: food-101/food-101/images/tacos/1530506.jpg \n", + " inflating: food-101/food-101/images/tacos/1538691.jpg \n", + " inflating: food-101/food-101/images/tacos/1540864.jpg \n", + " inflating: food-101/food-101/images/tacos/1545545.jpg \n", + " inflating: food-101/food-101/images/tacos/155635.jpg \n", + " inflating: food-101/food-101/images/tacos/1556523.jpg \n", + " inflating: food-101/food-101/images/tacos/1557207.jpg \n", + " inflating: food-101/food-101/images/tacos/1561938.jpg \n", + " inflating: food-101/food-101/images/tacos/1562526.jpg \n", + " inflating: food-101/food-101/images/tacos/1564787.jpg \n", + " inflating: food-101/food-101/images/tacos/1566677.jpg \n", + " inflating: food-101/food-101/images/tacos/1568283.jpg \n", + " inflating: food-101/food-101/images/tacos/1569063.jpg \n", + " inflating: food-101/food-101/images/tacos/1571597.jpg \n", + " inflating: food-101/food-101/images/tacos/1575565.jpg \n", + " inflating: food-101/food-101/images/tacos/1576976.jpg \n", + " inflating: food-101/food-101/images/tacos/1578229.jpg \n", + " inflating: food-101/food-101/images/tacos/1587760.jpg \n", + " inflating: food-101/food-101/images/tacos/158880.jpg \n", + " inflating: food-101/food-101/images/tacos/1591433.jpg \n", + " inflating: food-101/food-101/images/tacos/1594984.jpg \n", + " inflating: food-101/food-101/images/tacos/1598530.jpg \n", + " inflating: food-101/food-101/images/tacos/1608797.jpg \n", + " inflating: food-101/food-101/images/tacos/160973.jpg \n", + " inflating: food-101/food-101/images/tacos/1614484.jpg \n", + " inflating: food-101/food-101/images/tacos/1617403.jpg \n", + " inflating: food-101/food-101/images/tacos/1617850.jpg \n", + " inflating: food-101/food-101/images/tacos/1622614.jpg \n", + " inflating: food-101/food-101/images/tacos/1627254.jpg \n", + " inflating: food-101/food-101/images/tacos/1627742.jpg \n", + " inflating: food-101/food-101/images/tacos/1635285.jpg \n", + " inflating: food-101/food-101/images/tacos/1638510.jpg \n", + " inflating: food-101/food-101/images/tacos/164201.jpg \n", + " inflating: food-101/food-101/images/tacos/1646853.jpg \n", + " inflating: food-101/food-101/images/tacos/1651086.jpg \n", + " inflating: food-101/food-101/images/tacos/1655797.jpg \n", + " inflating: food-101/food-101/images/tacos/1658157.jpg \n", + " inflating: food-101/food-101/images/tacos/1667121.jpg \n", + " inflating: food-101/food-101/images/tacos/1668668.jpg \n", + " inflating: food-101/food-101/images/tacos/1672772.jpg \n", + " inflating: food-101/food-101/images/tacos/1674089.jpg \n", + " inflating: food-101/food-101/images/tacos/1674481.jpg \n", + " inflating: food-101/food-101/images/tacos/1679458.jpg \n", + " inflating: food-101/food-101/images/tacos/1679800.jpg \n", + " inflating: food-101/food-101/images/tacos/1682927.jpg \n", + " inflating: food-101/food-101/images/tacos/168442.jpg \n", + " inflating: food-101/food-101/images/tacos/1688602.jpg \n", + " inflating: food-101/food-101/images/tacos/1692475.jpg \n", + " inflating: food-101/food-101/images/tacos/1693719.jpg \n", + " inflating: food-101/food-101/images/tacos/1697433.jpg \n", + " inflating: food-101/food-101/images/tacos/1706610.jpg \n", + " inflating: food-101/food-101/images/tacos/1707011.jpg \n", + " inflating: food-101/food-101/images/tacos/1707234.jpg \n", + " inflating: food-101/food-101/images/tacos/1710505.jpg \n", + " inflating: food-101/food-101/images/tacos/1715467.jpg \n", + " inflating: food-101/food-101/images/tacos/1717678.jpg \n", + " inflating: food-101/food-101/images/tacos/1729455.jpg \n", + " inflating: food-101/food-101/images/tacos/1734149.jpg \n", + " inflating: food-101/food-101/images/tacos/1735958.jpg \n", + " inflating: food-101/food-101/images/tacos/1737798.jpg \n", + " inflating: food-101/food-101/images/tacos/1741944.jpg \n", + " inflating: food-101/food-101/images/tacos/1744745.jpg \n", + " inflating: food-101/food-101/images/tacos/1746357.jpg \n", + " inflating: food-101/food-101/images/tacos/1748832.jpg \n", + " inflating: food-101/food-101/images/tacos/1753981.jpg \n", + " inflating: food-101/food-101/images/tacos/1755322.jpg \n", + " inflating: food-101/food-101/images/tacos/1758313.jpg \n", + " inflating: food-101/food-101/images/tacos/1763770.jpg \n", + " inflating: food-101/food-101/images/tacos/1764106.jpg \n", + " inflating: food-101/food-101/images/tacos/1764697.jpg \n", + " inflating: food-101/food-101/images/tacos/17688.jpg \n", + " inflating: food-101/food-101/images/tacos/1773728.jpg \n", + " inflating: food-101/food-101/images/tacos/1775338.jpg \n", + " inflating: food-101/food-101/images/tacos/1777759.jpg \n", + " inflating: food-101/food-101/images/tacos/1777864.jpg \n", + " inflating: food-101/food-101/images/tacos/1788072.jpg \n", + " inflating: food-101/food-101/images/tacos/17969.jpg \n", + " inflating: food-101/food-101/images/tacos/179997.jpg \n", + " inflating: food-101/food-101/images/tacos/180134.jpg \n", + " inflating: food-101/food-101/images/tacos/180243.jpg \n", + " inflating: food-101/food-101/images/tacos/1803374.jpg \n", + " inflating: food-101/food-101/images/tacos/1807072.jpg \n", + " inflating: food-101/food-101/images/tacos/1809621.jpg \n", + " inflating: food-101/food-101/images/tacos/1812220.jpg \n", + " inflating: food-101/food-101/images/tacos/1812543.jpg \n", + " inflating: food-101/food-101/images/tacos/1818604.jpg \n", + " inflating: food-101/food-101/images/tacos/1821357.jpg \n", + " inflating: food-101/food-101/images/tacos/1832182.jpg \n", + " inflating: food-101/food-101/images/tacos/1834044.jpg \n", + " inflating: food-101/food-101/images/tacos/1834755.jpg \n", + " inflating: food-101/food-101/images/tacos/1835496.jpg \n", + " inflating: food-101/food-101/images/tacos/1836242.jpg \n", + " inflating: food-101/food-101/images/tacos/1840006.jpg \n", + " inflating: food-101/food-101/images/tacos/184282.jpg \n", + " inflating: food-101/food-101/images/tacos/1845215.jpg \n", + " inflating: food-101/food-101/images/tacos/1846911.jpg \n", + " inflating: food-101/food-101/images/tacos/1860442.jpg \n", + " inflating: food-101/food-101/images/tacos/1862919.jpg \n", + " inflating: food-101/food-101/images/tacos/1864282.jpg \n", + " inflating: food-101/food-101/images/tacos/1865026.jpg \n", + " inflating: food-101/food-101/images/tacos/186679.jpg \n", + " inflating: food-101/food-101/images/tacos/1867757.jpg \n", + " inflating: food-101/food-101/images/tacos/1874965.jpg \n", + " inflating: food-101/food-101/images/tacos/1886310.jpg \n", + " inflating: food-101/food-101/images/tacos/1894812.jpg \n", + " inflating: food-101/food-101/images/tacos/1895316.jpg \n", + " inflating: food-101/food-101/images/tacos/1895757.jpg \n", + " inflating: food-101/food-101/images/tacos/189598.jpg \n", + " inflating: food-101/food-101/images/tacos/1900099.jpg \n", + " inflating: food-101/food-101/images/tacos/1900464.jpg \n", + " inflating: food-101/food-101/images/tacos/190616.jpg \n", + " inflating: food-101/food-101/images/tacos/1907855.jpg \n", + " inflating: food-101/food-101/images/tacos/1908336.jpg \n", + " inflating: food-101/food-101/images/tacos/1908434.jpg \n", + " inflating: food-101/food-101/images/tacos/1910630.jpg \n", + " inflating: food-101/food-101/images/tacos/1912464.jpg \n", + " inflating: food-101/food-101/images/tacos/1912496.jpg \n", + " inflating: food-101/food-101/images/tacos/1919281.jpg \n", + " inflating: food-101/food-101/images/tacos/1930366.jpg \n", + " inflating: food-101/food-101/images/tacos/1937403.jpg \n", + " inflating: food-101/food-101/images/tacos/1937704.jpg \n", + " inflating: food-101/food-101/images/tacos/194816.jpg \n", + " inflating: food-101/food-101/images/tacos/195011.jpg \n", + " inflating: food-101/food-101/images/tacos/1950286.jpg \n", + " inflating: food-101/food-101/images/tacos/1951793.jpg \n", + " inflating: food-101/food-101/images/tacos/1970638.jpg \n", + " inflating: food-101/food-101/images/tacos/197572.jpg \n", + " inflating: food-101/food-101/images/tacos/1977546.jpg \n", + " inflating: food-101/food-101/images/tacos/1980126.jpg \n", + " inflating: food-101/food-101/images/tacos/1983024.jpg \n", + " inflating: food-101/food-101/images/tacos/1988022.jpg \n", + " inflating: food-101/food-101/images/tacos/1988547.jpg \n", + " inflating: food-101/food-101/images/tacos/1988700.jpg \n", + " inflating: food-101/food-101/images/tacos/1997124.jpg \n", + " inflating: food-101/food-101/images/tacos/199784.jpg \n", + " inflating: food-101/food-101/images/tacos/2001326.jpg \n", + " inflating: food-101/food-101/images/tacos/2008469.jpg \n", + " inflating: food-101/food-101/images/tacos/20087.jpg \n", + " inflating: food-101/food-101/images/tacos/2009226.jpg \n", + " inflating: food-101/food-101/images/tacos/2011520.jpg \n", + " inflating: food-101/food-101/images/tacos/201305.jpg \n", + " inflating: food-101/food-101/images/tacos/2018613.jpg \n", + " inflating: food-101/food-101/images/tacos/2019429.jpg \n", + " inflating: food-101/food-101/images/tacos/201951.jpg \n", + " inflating: food-101/food-101/images/tacos/201955.jpg \n", + " inflating: food-101/food-101/images/tacos/2021025.jpg \n", + " inflating: food-101/food-101/images/tacos/2021328.jpg \n", + " inflating: food-101/food-101/images/tacos/2022942.jpg \n", + " inflating: food-101/food-101/images/tacos/2023795.jpg \n", + " inflating: food-101/food-101/images/tacos/2024549.jpg \n", + " inflating: food-101/food-101/images/tacos/2025079.jpg \n", + " inflating: food-101/food-101/images/tacos/2025456.jpg \n", + " inflating: food-101/food-101/images/tacos/2027617.jpg \n", + " inflating: food-101/food-101/images/tacos/2027794.jpg \n", + " inflating: food-101/food-101/images/tacos/2030.jpg \n", + " inflating: food-101/food-101/images/tacos/2031215.jpg \n", + " inflating: food-101/food-101/images/tacos/203160.jpg \n", + " inflating: food-101/food-101/images/tacos/203516.jpg \n", + " inflating: food-101/food-101/images/tacos/2035843.jpg \n", + " inflating: food-101/food-101/images/tacos/2037084.jpg \n", + " inflating: food-101/food-101/images/tacos/2044334.jpg \n", + " inflating: food-101/food-101/images/tacos/2050177.jpg \n", + " inflating: food-101/food-101/images/tacos/20532.jpg \n", + " inflating: food-101/food-101/images/tacos/2053662.jpg \n", + " inflating: food-101/food-101/images/tacos/2054774.jpg \n", + " inflating: food-101/food-101/images/tacos/2066856.jpg \n", + " inflating: food-101/food-101/images/tacos/2067142.jpg \n", + " inflating: food-101/food-101/images/tacos/2067299.jpg \n", + " inflating: food-101/food-101/images/tacos/2069001.jpg \n", + " inflating: food-101/food-101/images/tacos/2069056.jpg \n", + " inflating: food-101/food-101/images/tacos/2069789.jpg \n", + " inflating: food-101/food-101/images/tacos/20787.jpg \n", + " inflating: food-101/food-101/images/tacos/2081860.jpg \n", + " inflating: food-101/food-101/images/tacos/2084804.jpg \n", + " inflating: food-101/food-101/images/tacos/2086736.jpg \n", + " inflating: food-101/food-101/images/tacos/209939.jpg \n", + " inflating: food-101/food-101/images/tacos/2102616.jpg \n", + " inflating: food-101/food-101/images/tacos/2114135.jpg \n", + " inflating: food-101/food-101/images/tacos/2117132.jpg \n", + " inflating: food-101/food-101/images/tacos/2121881.jpg \n", + " inflating: food-101/food-101/images/tacos/2122239.jpg \n", + " inflating: food-101/food-101/images/tacos/212330.jpg \n", + " inflating: food-101/food-101/images/tacos/2125477.jpg \n", + " inflating: food-101/food-101/images/tacos/2132075.jpg \n", + " inflating: food-101/food-101/images/tacos/2133969.jpg \n", + " inflating: food-101/food-101/images/tacos/213499.jpg \n", + " inflating: food-101/food-101/images/tacos/2138849.jpg \n", + " inflating: food-101/food-101/images/tacos/2140211.jpg \n", + " inflating: food-101/food-101/images/tacos/2143962.jpg \n", + " inflating: food-101/food-101/images/tacos/21440.jpg \n", + " inflating: food-101/food-101/images/tacos/2144788.jpg \n", + " inflating: food-101/food-101/images/tacos/2147230.jpg \n", + " inflating: food-101/food-101/images/tacos/214761.jpg \n", + " inflating: food-101/food-101/images/tacos/2148860.jpg \n", + " inflating: food-101/food-101/images/tacos/2148959.jpg \n", + " inflating: food-101/food-101/images/tacos/2151577.jpg \n", + " inflating: food-101/food-101/images/tacos/2159308.jpg \n", + " inflating: food-101/food-101/images/tacos/2160279.jpg \n", + " inflating: food-101/food-101/images/tacos/2160957.jpg \n", + " inflating: food-101/food-101/images/tacos/2163783.jpg \n", + " inflating: food-101/food-101/images/tacos/2165853.jpg \n", + " inflating: food-101/food-101/images/tacos/2166287.jpg \n", + " inflating: food-101/food-101/images/tacos/2172636.jpg \n", + " inflating: food-101/food-101/images/tacos/2176466.jpg \n", + " inflating: food-101/food-101/images/tacos/2177128.jpg \n", + " inflating: food-101/food-101/images/tacos/2177402.jpg \n", + " inflating: food-101/food-101/images/tacos/2184595.jpg \n", + " inflating: food-101/food-101/images/tacos/2189723.jpg \n", + " inflating: food-101/food-101/images/tacos/2194334.jpg \n", + " inflating: food-101/food-101/images/tacos/2197933.jpg \n", + " inflating: food-101/food-101/images/tacos/2209046.jpg \n", + " inflating: food-101/food-101/images/tacos/2210457.jpg \n", + " inflating: food-101/food-101/images/tacos/2210876.jpg \n", + " inflating: food-101/food-101/images/tacos/2217693.jpg \n", + " inflating: food-101/food-101/images/tacos/2220765.jpg \n", + " inflating: food-101/food-101/images/tacos/2226921.jpg \n", + " inflating: food-101/food-101/images/tacos/2229341.jpg \n", + " inflating: food-101/food-101/images/tacos/2242034.jpg \n", + " inflating: food-101/food-101/images/tacos/2249620.jpg \n", + " inflating: food-101/food-101/images/tacos/2252218.jpg \n", + " inflating: food-101/food-101/images/tacos/2260240.jpg \n", + " inflating: food-101/food-101/images/tacos/228552.jpg \n", + " inflating: food-101/food-101/images/tacos/2291483.jpg \n", + " inflating: food-101/food-101/images/tacos/2293324.jpg \n", + " inflating: food-101/food-101/images/tacos/2294790.jpg \n", + " inflating: food-101/food-101/images/tacos/2298502.jpg \n", + " inflating: food-101/food-101/images/tacos/2303976.jpg \n", + " inflating: food-101/food-101/images/tacos/2313458.jpg \n", + " inflating: food-101/food-101/images/tacos/2315447.jpg \n", + " inflating: food-101/food-101/images/tacos/2320117.jpg \n", + " inflating: food-101/food-101/images/tacos/2337493.jpg \n", + " inflating: food-101/food-101/images/tacos/2342089.jpg \n", + " inflating: food-101/food-101/images/tacos/2343263.jpg \n", + " inflating: food-101/food-101/images/tacos/2343435.jpg \n", + " inflating: food-101/food-101/images/tacos/2343802.jpg \n", + " inflating: food-101/food-101/images/tacos/2347583.jpg \n", + " inflating: food-101/food-101/images/tacos/2348558.jpg \n", + " inflating: food-101/food-101/images/tacos/2351664.jpg \n", + " inflating: food-101/food-101/images/tacos/2352451.jpg \n", + " inflating: food-101/food-101/images/tacos/2352494.jpg \n", + " inflating: food-101/food-101/images/tacos/2356849.jpg \n", + " inflating: food-101/food-101/images/tacos/2359390.jpg \n", + " inflating: food-101/food-101/images/tacos/2361789.jpg \n", + " inflating: food-101/food-101/images/tacos/2363168.jpg \n", + " inflating: food-101/food-101/images/tacos/2368411.jpg \n", + " inflating: food-101/food-101/images/tacos/2368708.jpg \n", + " inflating: food-101/food-101/images/tacos/2375378.jpg \n", + " inflating: food-101/food-101/images/tacos/2377158.jpg \n", + " inflating: food-101/food-101/images/tacos/2377562.jpg \n", + " inflating: food-101/food-101/images/tacos/2377709.jpg \n", + " inflating: food-101/food-101/images/tacos/2380536.jpg \n", + " inflating: food-101/food-101/images/tacos/2404214.jpg \n", + " inflating: food-101/food-101/images/tacos/2405170.jpg \n", + " inflating: food-101/food-101/images/tacos/2408586.jpg \n", + " inflating: food-101/food-101/images/tacos/2409245.jpg \n", + " inflating: food-101/food-101/images/tacos/2410630.jpg \n", + " inflating: food-101/food-101/images/tacos/2414833.jpg \n", + " inflating: food-101/food-101/images/tacos/2415156.jpg \n", + " inflating: food-101/food-101/images/tacos/2415437.jpg \n", + " inflating: food-101/food-101/images/tacos/2430658.jpg \n", + " inflating: food-101/food-101/images/tacos/243366.jpg \n", + " inflating: food-101/food-101/images/tacos/244867.jpg \n", + " inflating: food-101/food-101/images/tacos/2453875.jpg \n", + " inflating: food-101/food-101/images/tacos/2455059.jpg \n", + " inflating: food-101/food-101/images/tacos/2458414.jpg \n", + " inflating: food-101/food-101/images/tacos/2467912.jpg \n", + " inflating: food-101/food-101/images/tacos/2467984.jpg \n", + " inflating: food-101/food-101/images/tacos/247997.jpg \n", + " inflating: food-101/food-101/images/tacos/24844.jpg \n", + " inflating: food-101/food-101/images/tacos/2488764.jpg \n", + " inflating: food-101/food-101/images/tacos/2489515.jpg \n", + " inflating: food-101/food-101/images/tacos/2501492.jpg \n", + " inflating: food-101/food-101/images/tacos/2502795.jpg \n", + " inflating: food-101/food-101/images/tacos/2509156.jpg \n", + " inflating: food-101/food-101/images/tacos/2513250.jpg \n", + " inflating: food-101/food-101/images/tacos/2517324.jpg \n", + " inflating: food-101/food-101/images/tacos/2521961.jpg \n", + " inflating: food-101/food-101/images/tacos/2522593.jpg \n", + " inflating: food-101/food-101/images/tacos/2527453.jpg \n", + " inflating: food-101/food-101/images/tacos/2527660.jpg \n", + " inflating: food-101/food-101/images/tacos/2527987.jpg \n", + " inflating: food-101/food-101/images/tacos/2528224.jpg \n", + " inflating: food-101/food-101/images/tacos/2533389.jpg \n", + " inflating: food-101/food-101/images/tacos/2536172.jpg \n", + " inflating: food-101/food-101/images/tacos/2540187.jpg \n", + " inflating: food-101/food-101/images/tacos/2541449.jpg \n", + " inflating: food-101/food-101/images/tacos/2542168.jpg \n", + " inflating: food-101/food-101/images/tacos/2551523.jpg \n", + " inflating: food-101/food-101/images/tacos/255748.jpg \n", + " inflating: food-101/food-101/images/tacos/2560894.jpg \n", + " inflating: food-101/food-101/images/tacos/256376.jpg \n", + " inflating: food-101/food-101/images/tacos/2565813.jpg \n", + " inflating: food-101/food-101/images/tacos/2567081.jpg \n", + " inflating: food-101/food-101/images/tacos/2569878.jpg \n", + " inflating: food-101/food-101/images/tacos/2573317.jpg \n", + " inflating: food-101/food-101/images/tacos/2573469.jpg \n", + " inflating: food-101/food-101/images/tacos/25784.jpg \n", + " inflating: food-101/food-101/images/tacos/2587781.jpg \n", + " inflating: food-101/food-101/images/tacos/2590480.jpg \n", + " inflating: food-101/food-101/images/tacos/2596091.jpg \n", + " inflating: food-101/food-101/images/tacos/2597085.jpg \n", + " inflating: food-101/food-101/images/tacos/260147.jpg \n", + " inflating: food-101/food-101/images/tacos/2601855.jpg \n", + " inflating: food-101/food-101/images/tacos/2602786.jpg \n", + " inflating: food-101/food-101/images/tacos/2604575.jpg \n", + " inflating: food-101/food-101/images/tacos/260820.jpg \n", + " inflating: food-101/food-101/images/tacos/2609169.jpg \n", + " inflating: food-101/food-101/images/tacos/2615864.jpg \n", + " inflating: food-101/food-101/images/tacos/2620582.jpg \n", + " inflating: food-101/food-101/images/tacos/2621360.jpg \n", + " inflating: food-101/food-101/images/tacos/2622735.jpg \n", + " inflating: food-101/food-101/images/tacos/2623603.jpg \n", + " inflating: food-101/food-101/images/tacos/2631239.jpg \n", + " inflating: food-101/food-101/images/tacos/2639722.jpg \n", + " inflating: food-101/food-101/images/tacos/2640146.jpg \n", + " inflating: food-101/food-101/images/tacos/264641.jpg \n", + " inflating: food-101/food-101/images/tacos/26489.jpg \n", + " inflating: food-101/food-101/images/tacos/2650502.jpg \n", + " inflating: food-101/food-101/images/tacos/265072.jpg \n", + " inflating: food-101/food-101/images/tacos/2662167.jpg \n", + " inflating: food-101/food-101/images/tacos/2663086.jpg \n", + " inflating: food-101/food-101/images/tacos/2666467.jpg \n", + " inflating: food-101/food-101/images/tacos/2666895.jpg \n", + " inflating: food-101/food-101/images/tacos/2673709.jpg \n", + " inflating: food-101/food-101/images/tacos/267672.jpg \n", + " inflating: food-101/food-101/images/tacos/2680805.jpg \n", + " inflating: food-101/food-101/images/tacos/2682570.jpg \n", + " inflating: food-101/food-101/images/tacos/2685162.jpg \n", + " inflating: food-101/food-101/images/tacos/268573.jpg \n", + " inflating: food-101/food-101/images/tacos/2687874.jpg \n", + " inflating: food-101/food-101/images/tacos/2691884.jpg \n", + " inflating: food-101/food-101/images/tacos/269451.jpg \n", + " inflating: food-101/food-101/images/tacos/2700770.jpg \n", + " inflating: food-101/food-101/images/tacos/2706105.jpg \n", + " inflating: food-101/food-101/images/tacos/2710884.jpg \n", + " inflating: food-101/food-101/images/tacos/2713997.jpg \n", + " inflating: food-101/food-101/images/tacos/2721137.jpg \n", + " inflating: food-101/food-101/images/tacos/27330.jpg \n", + " inflating: food-101/food-101/images/tacos/2740719.jpg \n", + " inflating: food-101/food-101/images/tacos/2741437.jpg \n", + " inflating: food-101/food-101/images/tacos/2746697.jpg \n", + " inflating: food-101/food-101/images/tacos/2755297.jpg \n", + " inflating: food-101/food-101/images/tacos/2762567.jpg \n", + " inflating: food-101/food-101/images/tacos/2776648.jpg \n", + " inflating: food-101/food-101/images/tacos/2781123.jpg \n", + " inflating: food-101/food-101/images/tacos/2786948.jpg \n", + " inflating: food-101/food-101/images/tacos/279299.jpg \n", + " inflating: food-101/food-101/images/tacos/2794248.jpg \n", + " inflating: food-101/food-101/images/tacos/279573.jpg \n", + " inflating: food-101/food-101/images/tacos/2800419.jpg \n", + " inflating: food-101/food-101/images/tacos/2802806.jpg \n", + " inflating: food-101/food-101/images/tacos/2806934.jpg \n", + " inflating: food-101/food-101/images/tacos/281205.jpg \n", + " inflating: food-101/food-101/images/tacos/2813830.jpg \n", + " inflating: food-101/food-101/images/tacos/281538.jpg \n", + " inflating: food-101/food-101/images/tacos/2815745.jpg \n", + " inflating: food-101/food-101/images/tacos/2819670.jpg \n", + " inflating: food-101/food-101/images/tacos/2819834.jpg \n", + " inflating: food-101/food-101/images/tacos/2831138.jpg \n", + " inflating: food-101/food-101/images/tacos/2832027.jpg \n", + " inflating: food-101/food-101/images/tacos/2835577.jpg \n", + " inflating: food-101/food-101/images/tacos/2837120.jpg \n", + " inflating: food-101/food-101/images/tacos/2837607.jpg \n", + " inflating: food-101/food-101/images/tacos/28387.jpg \n", + " inflating: food-101/food-101/images/tacos/2865762.jpg \n", + " inflating: food-101/food-101/images/tacos/2868777.jpg \n", + " inflating: food-101/food-101/images/tacos/2869833.jpg \n", + " inflating: food-101/food-101/images/tacos/2870992.jpg \n", + " inflating: food-101/food-101/images/tacos/2882204.jpg \n", + " inflating: food-101/food-101/images/tacos/288567.jpg \n", + " inflating: food-101/food-101/images/tacos/2886348.jpg \n", + " inflating: food-101/food-101/images/tacos/2893468.jpg \n", + " inflating: food-101/food-101/images/tacos/2897356.jpg \n", + " inflating: food-101/food-101/images/tacos/2914162.jpg \n", + " inflating: food-101/food-101/images/tacos/2919153.jpg \n", + " inflating: food-101/food-101/images/tacos/2926370.jpg \n", + " inflating: food-101/food-101/images/tacos/293111.jpg \n", + " inflating: food-101/food-101/images/tacos/2936156.jpg \n", + " inflating: food-101/food-101/images/tacos/2936503.jpg \n", + " inflating: food-101/food-101/images/tacos/2937937.jpg \n", + " inflating: food-101/food-101/images/tacos/2942043.jpg \n", + " inflating: food-101/food-101/images/tacos/2949649.jpg \n", + " inflating: food-101/food-101/images/tacos/2954905.jpg \n", + " inflating: food-101/food-101/images/tacos/2971659.jpg \n", + " inflating: food-101/food-101/images/tacos/2974612.jpg \n", + " inflating: food-101/food-101/images/tacos/2974711.jpg \n", + " inflating: food-101/food-101/images/tacos/3002970.jpg \n", + " inflating: food-101/food-101/images/tacos/300556.jpg \n", + " inflating: food-101/food-101/images/tacos/3017777.jpg \n", + " inflating: food-101/food-101/images/tacos/3017835.jpg \n", + " inflating: food-101/food-101/images/tacos/3024670.jpg \n", + " inflating: food-101/food-101/images/tacos/3029995.jpg \n", + " inflating: food-101/food-101/images/tacos/3035346.jpg \n", + " inflating: food-101/food-101/images/tacos/3039930.jpg \n", + " inflating: food-101/food-101/images/tacos/304636.jpg \n", + " inflating: food-101/food-101/images/tacos/3055164.jpg \n", + " inflating: food-101/food-101/images/tacos/3056471.jpg \n", + " inflating: food-101/food-101/images/tacos/3062365.jpg \n", + " inflating: food-101/food-101/images/tacos/3063137.jpg \n", + " inflating: food-101/food-101/images/tacos/309350.jpg \n", + " inflating: food-101/food-101/images/tacos/3095882.jpg \n", + " inflating: food-101/food-101/images/tacos/3104471.jpg \n", + " inflating: food-101/food-101/images/tacos/3105680.jpg \n", + " inflating: food-101/food-101/images/tacos/3105942.jpg \n", + " inflating: food-101/food-101/images/tacos/3105961.jpg \n", + " inflating: food-101/food-101/images/tacos/3109068.jpg \n", + " inflating: food-101/food-101/images/tacos/3110220.jpg \n", + " inflating: food-101/food-101/images/tacos/311676.jpg \n", + " inflating: food-101/food-101/images/tacos/3127446.jpg \n", + " inflating: food-101/food-101/images/tacos/3128630.jpg \n", + " inflating: food-101/food-101/images/tacos/3133686.jpg \n", + " inflating: food-101/food-101/images/tacos/3136709.jpg \n", + " inflating: food-101/food-101/images/tacos/3138193.jpg \n", + " inflating: food-101/food-101/images/tacos/314887.jpg \n", + " inflating: food-101/food-101/images/tacos/3149716.jpg \n", + " inflating: food-101/food-101/images/tacos/3149969.jpg \n", + " inflating: food-101/food-101/images/tacos/3151646.jpg \n", + " inflating: food-101/food-101/images/tacos/3151905.jpg \n", + " inflating: food-101/food-101/images/tacos/3152735.jpg \n", + " inflating: food-101/food-101/images/tacos/3157053.jpg \n", + " inflating: food-101/food-101/images/tacos/3157777.jpg \n", + " inflating: food-101/food-101/images/tacos/3158234.jpg \n", + " inflating: food-101/food-101/images/tacos/3159086.jpg \n", + " inflating: food-101/food-101/images/tacos/3165327.jpg \n", + " inflating: food-101/food-101/images/tacos/3177140.jpg \n", + " inflating: food-101/food-101/images/tacos/3177404.jpg \n", + " inflating: food-101/food-101/images/tacos/3180792.jpg \n", + " inflating: food-101/food-101/images/tacos/3189515.jpg \n", + " inflating: food-101/food-101/images/tacos/3189725.jpg \n", + " inflating: food-101/food-101/images/tacos/3189974.jpg \n", + " inflating: food-101/food-101/images/tacos/3194546.jpg \n", + " inflating: food-101/food-101/images/tacos/3195514.jpg \n", + " inflating: food-101/food-101/images/tacos/3200314.jpg \n", + " inflating: food-101/food-101/images/tacos/3205255.jpg \n", + " inflating: food-101/food-101/images/tacos/3208535.jpg \n", + " inflating: food-101/food-101/images/tacos/321256.jpg \n", + " inflating: food-101/food-101/images/tacos/3215955.jpg \n", + " inflating: food-101/food-101/images/tacos/3222257.jpg \n", + " inflating: food-101/food-101/images/tacos/3223633.jpg \n", + " inflating: food-101/food-101/images/tacos/3227222.jpg \n", + " inflating: food-101/food-101/images/tacos/3227977.jpg \n", + " inflating: food-101/food-101/images/tacos/322915.jpg \n", + " inflating: food-101/food-101/images/tacos/3230870.jpg \n", + " inflating: food-101/food-101/images/tacos/3232807.jpg \n", + " inflating: food-101/food-101/images/tacos/3233123.jpg \n", + " inflating: food-101/food-101/images/tacos/3234174.jpg \n", + " inflating: food-101/food-101/images/tacos/3241735.jpg \n", + " inflating: food-101/food-101/images/tacos/3248495.jpg \n", + " inflating: food-101/food-101/images/tacos/3249128.jpg \n", + " inflating: food-101/food-101/images/tacos/3253644.jpg \n", + " inflating: food-101/food-101/images/tacos/3254037.jpg \n", + " inflating: food-101/food-101/images/tacos/3257297.jpg \n", + " inflating: food-101/food-101/images/tacos/3258746.jpg \n", + " inflating: food-101/food-101/images/tacos/3262270.jpg \n", + " inflating: food-101/food-101/images/tacos/3268953.jpg \n", + " inflating: food-101/food-101/images/tacos/327041.jpg \n", + " inflating: food-101/food-101/images/tacos/3275812.jpg \n", + " inflating: food-101/food-101/images/tacos/3276080.jpg \n", + " inflating: food-101/food-101/images/tacos/3278722.jpg \n", + " inflating: food-101/food-101/images/tacos/3282435.jpg \n", + " inflating: food-101/food-101/images/tacos/328456.jpg \n", + " inflating: food-101/food-101/images/tacos/3286750.jpg \n", + " inflating: food-101/food-101/images/tacos/3297021.jpg \n", + " inflating: food-101/food-101/images/tacos/3297293.jpg \n", + " inflating: food-101/food-101/images/tacos/3300773.jpg \n", + " inflating: food-101/food-101/images/tacos/3301181.jpg \n", + " inflating: food-101/food-101/images/tacos/3303823.jpg \n", + " inflating: food-101/food-101/images/tacos/3304032.jpg \n", + " inflating: food-101/food-101/images/tacos/3304895.jpg \n", + " inflating: food-101/food-101/images/tacos/3305669.jpg \n", + " inflating: food-101/food-101/images/tacos/3306113.jpg \n", + " inflating: food-101/food-101/images/tacos/3308866.jpg \n", + " inflating: food-101/food-101/images/tacos/3312147.jpg \n", + " inflating: food-101/food-101/images/tacos/3313158.jpg \n", + " inflating: food-101/food-101/images/tacos/3313600.jpg \n", + " inflating: food-101/food-101/images/tacos/3316331.jpg \n", + " inflating: food-101/food-101/images/tacos/3318684.jpg \n", + " inflating: food-101/food-101/images/tacos/3319644.jpg \n", + " inflating: food-101/food-101/images/tacos/3322600.jpg \n", + " inflating: food-101/food-101/images/tacos/332669.jpg \n", + " inflating: food-101/food-101/images/tacos/3330223.jpg \n", + " inflating: food-101/food-101/images/tacos/3330658.jpg \n", + " inflating: food-101/food-101/images/tacos/3331622.jpg \n", + " inflating: food-101/food-101/images/tacos/333260.jpg \n", + " inflating: food-101/food-101/images/tacos/3335915.jpg \n", + " inflating: food-101/food-101/images/tacos/3341328.jpg \n", + " inflating: food-101/food-101/images/tacos/3342706.jpg \n", + " inflating: food-101/food-101/images/tacos/3342870.jpg \n", + " inflating: food-101/food-101/images/tacos/3344522.jpg \n", + " inflating: food-101/food-101/images/tacos/3348417.jpg \n", + " inflating: food-101/food-101/images/tacos/3362617.jpg \n", + " inflating: food-101/food-101/images/tacos/3377716.jpg \n", + " inflating: food-101/food-101/images/tacos/3378114.jpg \n", + " inflating: food-101/food-101/images/tacos/3379211.jpg \n", + " inflating: food-101/food-101/images/tacos/337973.jpg \n", + " inflating: food-101/food-101/images/tacos/3381364.jpg \n", + " inflating: food-101/food-101/images/tacos/3381771.jpg \n", + " inflating: food-101/food-101/images/tacos/3384498.jpg \n", + " inflating: food-101/food-101/images/tacos/3388810.jpg \n", + " inflating: food-101/food-101/images/tacos/3390162.jpg \n", + " inflating: food-101/food-101/images/tacos/3395295.jpg \n", + " inflating: food-101/food-101/images/tacos/339846.jpg \n", + " inflating: food-101/food-101/images/tacos/3399210.jpg \n", + " inflating: food-101/food-101/images/tacos/3400268.jpg \n", + " inflating: food-101/food-101/images/tacos/3406527.jpg \n", + " inflating: food-101/food-101/images/tacos/3415963.jpg \n", + " inflating: food-101/food-101/images/tacos/3423139.jpg \n", + " inflating: food-101/food-101/images/tacos/3426713.jpg \n", + " inflating: food-101/food-101/images/tacos/3437269.jpg \n", + " inflating: food-101/food-101/images/tacos/3437974.jpg \n", + " inflating: food-101/food-101/images/tacos/3441052.jpg \n", + " inflating: food-101/food-101/images/tacos/3452776.jpg \n", + " inflating: food-101/food-101/images/tacos/3455885.jpg \n", + " inflating: food-101/food-101/images/tacos/3458100.jpg \n", + " inflating: food-101/food-101/images/tacos/346150.jpg \n", + " inflating: food-101/food-101/images/tacos/3477515.jpg \n", + " inflating: food-101/food-101/images/tacos/3479034.jpg \n", + " inflating: food-101/food-101/images/tacos/3481413.jpg \n", + " inflating: food-101/food-101/images/tacos/3484435.jpg \n", + " inflating: food-101/food-101/images/tacos/3491721.jpg \n", + " inflating: food-101/food-101/images/tacos/3497229.jpg \n", + " inflating: food-101/food-101/images/tacos/3498104.jpg \n", + " inflating: food-101/food-101/images/tacos/3498952.jpg \n", + " inflating: food-101/food-101/images/tacos/3503623.jpg \n", + " inflating: food-101/food-101/images/tacos/3504351.jpg \n", + " inflating: food-101/food-101/images/tacos/351124.jpg \n", + " inflating: food-101/food-101/images/tacos/3514112.jpg \n", + " inflating: food-101/food-101/images/tacos/3515060.jpg \n", + " inflating: food-101/food-101/images/tacos/3516403.jpg \n", + " inflating: food-101/food-101/images/tacos/352413.jpg \n", + " inflating: food-101/food-101/images/tacos/352904.jpg \n", + " inflating: food-101/food-101/images/tacos/353013.jpg \n", + " inflating: food-101/food-101/images/tacos/3531481.jpg \n", + " inflating: food-101/food-101/images/tacos/3533425.jpg \n", + " inflating: food-101/food-101/images/tacos/3536193.jpg \n", + " inflating: food-101/food-101/images/tacos/3541893.jpg \n", + " inflating: food-101/food-101/images/tacos/3545034.jpg \n", + " inflating: food-101/food-101/images/tacos/3546537.jpg \n", + " inflating: food-101/food-101/images/tacos/3553437.jpg \n", + " inflating: food-101/food-101/images/tacos/3556505.jpg \n", + " inflating: food-101/food-101/images/tacos/3563182.jpg \n", + " inflating: food-101/food-101/images/tacos/3564496.jpg \n", + " inflating: food-101/food-101/images/tacos/3567370.jpg \n", + " inflating: food-101/food-101/images/tacos/3568812.jpg \n", + " inflating: food-101/food-101/images/tacos/3568908.jpg \n", + " inflating: food-101/food-101/images/tacos/3570063.jpg \n", + " inflating: food-101/food-101/images/tacos/3576713.jpg \n", + " inflating: food-101/food-101/images/tacos/3578813.jpg \n", + " inflating: food-101/food-101/images/tacos/3586536.jpg \n", + " inflating: food-101/food-101/images/tacos/3587203.jpg \n", + " inflating: food-101/food-101/images/tacos/358756.jpg \n", + " inflating: food-101/food-101/images/tacos/3590883.jpg \n", + " inflating: food-101/food-101/images/tacos/3592332.jpg \n", + " inflating: food-101/food-101/images/tacos/3594712.jpg \n", + " inflating: food-101/food-101/images/tacos/3595219.jpg \n", + " inflating: food-101/food-101/images/tacos/3595264.jpg \n", + " inflating: food-101/food-101/images/tacos/3599013.jpg \n", + " inflating: food-101/food-101/images/tacos/360480.jpg \n", + " inflating: food-101/food-101/images/tacos/3606489.jpg \n", + " inflating: food-101/food-101/images/tacos/36081.jpg \n", + " inflating: food-101/food-101/images/tacos/3608314.jpg \n", + " inflating: food-101/food-101/images/tacos/3614076.jpg \n", + " inflating: food-101/food-101/images/tacos/3630467.jpg \n", + " inflating: food-101/food-101/images/tacos/3633647.jpg \n", + " inflating: food-101/food-101/images/tacos/3635497.jpg \n", + " inflating: food-101/food-101/images/tacos/3648454.jpg \n", + " inflating: food-101/food-101/images/tacos/3648787.jpg \n", + " inflating: food-101/food-101/images/tacos/3650428.jpg \n", + " inflating: food-101/food-101/images/tacos/3650822.jpg \n", + " inflating: food-101/food-101/images/tacos/3656817.jpg \n", + " inflating: food-101/food-101/images/tacos/3668168.jpg \n", + " inflating: food-101/food-101/images/tacos/366974.jpg \n", + " inflating: food-101/food-101/images/tacos/3670272.jpg \n", + " inflating: food-101/food-101/images/tacos/3676267.jpg \n", + " inflating: food-101/food-101/images/tacos/3680711.jpg \n", + " inflating: food-101/food-101/images/tacos/3689480.jpg \n", + " inflating: food-101/food-101/images/tacos/3691581.jpg \n", + " inflating: food-101/food-101/images/tacos/369334.jpg \n", + " inflating: food-101/food-101/images/tacos/3697566.jpg \n", + " inflating: food-101/food-101/images/tacos/3702371.jpg \n", + " inflating: food-101/food-101/images/tacos/3704862.jpg \n", + " inflating: food-101/food-101/images/tacos/3706936.jpg \n", + " inflating: food-101/food-101/images/tacos/3709595.jpg \n", + " inflating: food-101/food-101/images/tacos/3715155.jpg \n", + " inflating: food-101/food-101/images/tacos/3718204.jpg \n", + " inflating: food-101/food-101/images/tacos/3719660.jpg \n", + " inflating: food-101/food-101/images/tacos/3723532.jpg \n", + " inflating: food-101/food-101/images/tacos/3726280.jpg \n", + " inflating: food-101/food-101/images/tacos/3728240.jpg \n", + " inflating: food-101/food-101/images/tacos/3729027.jpg \n", + " inflating: food-101/food-101/images/tacos/3729055.jpg \n", + " inflating: food-101/food-101/images/tacos/3732800.jpg \n", + " inflating: food-101/food-101/images/tacos/3742219.jpg \n", + " inflating: food-101/food-101/images/tacos/374449.jpg \n", + " inflating: food-101/food-101/images/tacos/3745526.jpg \n", + " inflating: food-101/food-101/images/tacos/374556.jpg \n", + " inflating: food-101/food-101/images/tacos/3752490.jpg \n", + " inflating: food-101/food-101/images/tacos/3754242.jpg \n", + " inflating: food-101/food-101/images/tacos/3757829.jpg \n", + " inflating: food-101/food-101/images/tacos/3764437.jpg \n", + " inflating: food-101/food-101/images/tacos/3773638.jpg \n", + " inflating: food-101/food-101/images/tacos/377843.jpg \n", + " inflating: food-101/food-101/images/tacos/3779854.jpg \n", + " inflating: food-101/food-101/images/tacos/378139.jpg \n", + " inflating: food-101/food-101/images/tacos/3781893.jpg \n", + " inflating: food-101/food-101/images/tacos/3789374.jpg \n", + " inflating: food-101/food-101/images/tacos/3792612.jpg \n", + " inflating: food-101/food-101/images/tacos/3793042.jpg \n", + " inflating: food-101/food-101/images/tacos/3798529.jpg \n", + " inflating: food-101/food-101/images/tacos/3801273.jpg \n", + " inflating: food-101/food-101/images/tacos/3801996.jpg \n", + " inflating: food-101/food-101/images/tacos/3804283.jpg \n", + " inflating: food-101/food-101/images/tacos/3806565.jpg \n", + " inflating: food-101/food-101/images/tacos/3808265.jpg \n", + " inflating: food-101/food-101/images/tacos/380891.jpg \n", + " inflating: food-101/food-101/images/tacos/3808996.jpg \n", + " inflating: food-101/food-101/images/tacos/3814359.jpg \n", + " inflating: food-101/food-101/images/tacos/3820889.jpg \n", + " inflating: food-101/food-101/images/tacos/382593.jpg \n", + " inflating: food-101/food-101/images/tacos/3826428.jpg \n", + " inflating: food-101/food-101/images/tacos/3826695.jpg \n", + " inflating: food-101/food-101/images/tacos/3829335.jpg \n", + " inflating: food-101/food-101/images/tacos/3829846.jpg \n", + " inflating: food-101/food-101/images/tacos/3842881.jpg \n", + " inflating: food-101/food-101/images/tacos/3846291.jpg \n", + " inflating: food-101/food-101/images/tacos/3846373.jpg \n", + " inflating: food-101/food-101/images/tacos/3852479.jpg \n", + " inflating: food-101/food-101/images/tacos/385349.jpg \n", + " inflating: food-101/food-101/images/tacos/3854119.jpg \n", + " inflating: food-101/food-101/images/tacos/3854566.jpg \n", + " inflating: food-101/food-101/images/tacos/3858018.jpg \n", + " inflating: food-101/food-101/images/tacos/3858674.jpg \n", + " inflating: food-101/food-101/images/tacos/3866090.jpg \n", + " inflating: food-101/food-101/images/tacos/386957.jpg \n", + " inflating: food-101/food-101/images/tacos/3874237.jpg \n", + " inflating: food-101/food-101/images/tacos/3878167.jpg \n", + " inflating: food-101/food-101/images/tacos/3879814.jpg \n", + " inflating: food-101/food-101/images/tacos/3884320.jpg \n", + " inflating: food-101/food-101/images/tacos/3890040.jpg \n", + " inflating: food-101/food-101/images/tacos/3890217.jpg \n", + " inflating: food-101/food-101/images/tacos/3895371.jpg \n", + " inflating: food-101/food-101/images/tacos/3898372.jpg \n", + " inflating: food-101/food-101/images/tacos/3899081.jpg \n", + " inflating: food-101/food-101/images/tacos/3904795.jpg \n", + " inflating: food-101/food-101/images/tacos/3905539.jpg \n", + " inflating: food-101/food-101/images/tacos/3909997.jpg \n", + " inflating: food-101/food-101/images/tacos/3911660.jpg \n", + " inflating: food-101/food-101/images/tacos/3912145.jpg \n", + " inflating: food-101/food-101/images/tacos/3912441.jpg \n", + " inflating: food-101/food-101/images/tacos/3913763.jpg \n", + " inflating: food-101/food-101/images/tacos/3917000.jpg \n", + " inflating: food-101/food-101/images/tacos/3918117.jpg \n", + " inflating: food-101/food-101/images/tacos/3921830.jpg \n", + " inflating: food-101/food-101/images/tacos/394010.jpg \n", + " inflating: food-101/food-101/images/tacos/397315.jpg \n", + " inflating: food-101/food-101/images/tacos/401211.jpg \n", + " inflating: food-101/food-101/images/tacos/403868.jpg \n", + " inflating: food-101/food-101/images/tacos/406757.jpg \n", + " inflating: food-101/food-101/images/tacos/415029.jpg \n", + " inflating: food-101/food-101/images/tacos/418408.jpg \n", + " inflating: food-101/food-101/images/tacos/419674.jpg \n", + " inflating: food-101/food-101/images/tacos/420562.jpg \n", + " inflating: food-101/food-101/images/tacos/425034.jpg \n", + " inflating: food-101/food-101/images/tacos/44578.jpg \n", + " inflating: food-101/food-101/images/tacos/448340.jpg \n", + " inflating: food-101/food-101/images/tacos/45035.jpg \n", + " inflating: food-101/food-101/images/tacos/452606.jpg \n", + " inflating: food-101/food-101/images/tacos/452755.jpg \n", + " inflating: food-101/food-101/images/tacos/462108.jpg \n", + " inflating: food-101/food-101/images/tacos/46246.jpg \n", + " inflating: food-101/food-101/images/tacos/467930.jpg \n", + " inflating: food-101/food-101/images/tacos/469818.jpg \n", + " inflating: food-101/food-101/images/tacos/470015.jpg \n", + " inflating: food-101/food-101/images/tacos/476796.jpg \n", + " inflating: food-101/food-101/images/tacos/476935.jpg \n", + " inflating: food-101/food-101/images/tacos/482281.jpg \n", + " inflating: food-101/food-101/images/tacos/484927.jpg \n", + " inflating: food-101/food-101/images/tacos/48506.jpg \n", + " inflating: food-101/food-101/images/tacos/485269.jpg \n", + " inflating: food-101/food-101/images/tacos/487048.jpg \n", + " inflating: food-101/food-101/images/tacos/48840.jpg \n", + " inflating: food-101/food-101/images/tacos/497459.jpg \n", + " inflating: food-101/food-101/images/tacos/49803.jpg \n", + " inflating: food-101/food-101/images/tacos/499937.jpg \n", + " inflating: food-101/food-101/images/tacos/503225.jpg \n", + " inflating: food-101/food-101/images/tacos/504895.jpg \n", + " inflating: food-101/food-101/images/tacos/505247.jpg \n", + " inflating: food-101/food-101/images/tacos/509078.jpg \n", + " inflating: food-101/food-101/images/tacos/511160.jpg \n", + " inflating: food-101/food-101/images/tacos/519704.jpg \n", + " inflating: food-101/food-101/images/tacos/525466.jpg \n", + " inflating: food-101/food-101/images/tacos/527000.jpg \n", + " inflating: food-101/food-101/images/tacos/528781.jpg \n", + " inflating: food-101/food-101/images/tacos/530707.jpg \n", + " inflating: food-101/food-101/images/tacos/535381.jpg \n", + " inflating: food-101/food-101/images/tacos/535587.jpg \n", + " inflating: food-101/food-101/images/tacos/537119.jpg \n", + " inflating: food-101/food-101/images/tacos/537488.jpg \n", + " inflating: food-101/food-101/images/tacos/537566.jpg \n", + " inflating: food-101/food-101/images/tacos/53758.jpg \n", + " inflating: food-101/food-101/images/tacos/537588.jpg \n", + " inflating: food-101/food-101/images/tacos/538427.jpg \n", + " inflating: food-101/food-101/images/tacos/538466.jpg \n", + " inflating: food-101/food-101/images/tacos/539634.jpg \n", + " inflating: food-101/food-101/images/tacos/541192.jpg \n", + " inflating: food-101/food-101/images/tacos/541635.jpg \n", + " inflating: food-101/food-101/images/tacos/54252.jpg \n", + " inflating: food-101/food-101/images/tacos/544619.jpg \n", + " inflating: food-101/food-101/images/tacos/54529.jpg \n", + " inflating: food-101/food-101/images/tacos/54685.jpg \n", + " inflating: food-101/food-101/images/tacos/549245.jpg \n", + " inflating: food-101/food-101/images/tacos/550206.jpg \n", + " inflating: food-101/food-101/images/tacos/551627.jpg \n", + " inflating: food-101/food-101/images/tacos/552406.jpg \n", + " inflating: food-101/food-101/images/tacos/555759.jpg \n", + " inflating: food-101/food-101/images/tacos/560529.jpg \n", + " inflating: food-101/food-101/images/tacos/561322.jpg \n", + " inflating: food-101/food-101/images/tacos/56337.jpg \n", + " inflating: food-101/food-101/images/tacos/568951.jpg \n", + " inflating: food-101/food-101/images/tacos/574204.jpg \n", + " inflating: food-101/food-101/images/tacos/580156.jpg \n", + " inflating: food-101/food-101/images/tacos/581276.jpg \n", + " inflating: food-101/food-101/images/tacos/5813.jpg \n", + " inflating: food-101/food-101/images/tacos/582772.jpg \n", + " inflating: food-101/food-101/images/tacos/58856.jpg \n", + " inflating: food-101/food-101/images/tacos/589799.jpg \n", + " inflating: food-101/food-101/images/tacos/594811.jpg \n", + " inflating: food-101/food-101/images/tacos/596139.jpg \n", + " inflating: food-101/food-101/images/tacos/597979.jpg \n", + " inflating: food-101/food-101/images/tacos/600296.jpg \n", + " inflating: food-101/food-101/images/tacos/60069.jpg \n", + " inflating: food-101/food-101/images/tacos/602727.jpg \n", + " inflating: food-101/food-101/images/tacos/602843.jpg \n", + " inflating: food-101/food-101/images/tacos/604063.jpg \n", + " inflating: food-101/food-101/images/tacos/604718.jpg \n", + " inflating: food-101/food-101/images/tacos/606771.jpg \n", + " inflating: food-101/food-101/images/tacos/606860.jpg \n", + " inflating: food-101/food-101/images/tacos/608386.jpg \n", + " inflating: food-101/food-101/images/tacos/611065.jpg \n", + " inflating: food-101/food-101/images/tacos/616584.jpg \n", + " inflating: food-101/food-101/images/tacos/622425.jpg \n", + " inflating: food-101/food-101/images/tacos/6229.jpg \n", + " inflating: food-101/food-101/images/tacos/623353.jpg \n", + " inflating: food-101/food-101/images/tacos/626618.jpg \n", + " inflating: food-101/food-101/images/tacos/63099.jpg \n", + " inflating: food-101/food-101/images/tacos/634820.jpg \n", + " inflating: food-101/food-101/images/tacos/635686.jpg \n", + " inflating: food-101/food-101/images/tacos/635854.jpg \n", + " inflating: food-101/food-101/images/tacos/63928.jpg \n", + " inflating: food-101/food-101/images/tacos/647505.jpg \n", + " inflating: food-101/food-101/images/tacos/647567.jpg \n", + " inflating: food-101/food-101/images/tacos/650660.jpg \n", + " inflating: food-101/food-101/images/tacos/652950.jpg \n", + " inflating: food-101/food-101/images/tacos/658936.jpg \n", + " inflating: food-101/food-101/images/tacos/668046.jpg \n", + " inflating: food-101/food-101/images/tacos/673520.jpg \n", + " inflating: food-101/food-101/images/tacos/676156.jpg \n", + " inflating: food-101/food-101/images/tacos/679556.jpg \n", + " inflating: food-101/food-101/images/tacos/681467.jpg \n", + " inflating: food-101/food-101/images/tacos/683921.jpg \n", + " inflating: food-101/food-101/images/tacos/695250.jpg \n", + " inflating: food-101/food-101/images/tacos/696270.jpg \n", + " inflating: food-101/food-101/images/tacos/699031.jpg \n", + " inflating: food-101/food-101/images/tacos/699871.jpg \n", + " inflating: food-101/food-101/images/tacos/701369.jpg \n", + " inflating: food-101/food-101/images/tacos/703734.jpg \n", + " inflating: food-101/food-101/images/tacos/704188.jpg \n", + " inflating: food-101/food-101/images/tacos/704550.jpg \n", + " inflating: food-101/food-101/images/tacos/706629.jpg \n", + " inflating: food-101/food-101/images/tacos/706691.jpg \n", + " inflating: food-101/food-101/images/tacos/708619.jpg \n", + " inflating: food-101/food-101/images/tacos/710512.jpg \n", + " inflating: food-101/food-101/images/tacos/712764.jpg \n", + " inflating: food-101/food-101/images/tacos/716719.jpg \n", + " inflating: food-101/food-101/images/tacos/718434.jpg \n", + " inflating: food-101/food-101/images/tacos/721955.jpg \n", + " inflating: food-101/food-101/images/tacos/725963.jpg \n", + " inflating: food-101/food-101/images/tacos/727193.jpg \n", + " inflating: food-101/food-101/images/tacos/729481.jpg \n", + " inflating: food-101/food-101/images/tacos/730352.jpg \n", + " inflating: food-101/food-101/images/tacos/73043.jpg \n", + " inflating: food-101/food-101/images/tacos/730938.jpg \n", + " inflating: food-101/food-101/images/tacos/735186.jpg \n", + " inflating: food-101/food-101/images/tacos/738213.jpg \n", + " inflating: food-101/food-101/images/tacos/743774.jpg \n", + " inflating: food-101/food-101/images/tacos/74573.jpg \n", + " inflating: food-101/food-101/images/tacos/747985.jpg \n", + " inflating: food-101/food-101/images/tacos/748088.jpg \n", + " inflating: food-101/food-101/images/tacos/749374.jpg \n", + " inflating: food-101/food-101/images/tacos/759160.jpg \n", + " inflating: food-101/food-101/images/tacos/75990.jpg \n", + " inflating: food-101/food-101/images/tacos/765053.jpg \n", + " inflating: food-101/food-101/images/tacos/766638.jpg \n", + " inflating: food-101/food-101/images/tacos/768793.jpg \n", + " inflating: food-101/food-101/images/tacos/769437.jpg \n", + " inflating: food-101/food-101/images/tacos/776077.jpg \n", + " inflating: food-101/food-101/images/tacos/779193.jpg \n", + " inflating: food-101/food-101/images/tacos/781137.jpg \n", + " inflating: food-101/food-101/images/tacos/784510.jpg \n", + " inflating: food-101/food-101/images/tacos/790763.jpg \n", + " inflating: food-101/food-101/images/tacos/791662.jpg \n", + " inflating: food-101/food-101/images/tacos/796326.jpg \n", + " inflating: food-101/food-101/images/tacos/797686.jpg \n", + " inflating: food-101/food-101/images/tacos/801827.jpg \n", + " inflating: food-101/food-101/images/tacos/803895.jpg \n", + " inflating: food-101/food-101/images/tacos/807258.jpg \n", + " inflating: food-101/food-101/images/tacos/80931.jpg \n", + " inflating: food-101/food-101/images/tacos/815394.jpg \n", + " inflating: food-101/food-101/images/tacos/816725.jpg \n", + " inflating: food-101/food-101/images/tacos/816756.jpg \n", + " inflating: food-101/food-101/images/tacos/817533.jpg \n", + " inflating: food-101/food-101/images/tacos/822411.jpg \n", + " inflating: food-101/food-101/images/tacos/823536.jpg \n", + " inflating: food-101/food-101/images/tacos/824157.jpg \n", + " inflating: food-101/food-101/images/tacos/828189.jpg \n", + " inflating: food-101/food-101/images/tacos/8350.jpg \n", + " inflating: food-101/food-101/images/tacos/835998.jpg \n", + " inflating: food-101/food-101/images/tacos/837058.jpg \n", + " inflating: food-101/food-101/images/tacos/83935.jpg \n", + " inflating: food-101/food-101/images/tacos/846311.jpg \n", + " inflating: food-101/food-101/images/tacos/847402.jpg \n", + " inflating: food-101/food-101/images/tacos/85137.jpg \n", + " inflating: food-101/food-101/images/tacos/853830.jpg \n", + " inflating: food-101/food-101/images/tacos/857190.jpg \n", + " inflating: food-101/food-101/images/tacos/863882.jpg \n", + " inflating: food-101/food-101/images/tacos/864338.jpg \n", + " inflating: food-101/food-101/images/tacos/868882.jpg \n", + " inflating: food-101/food-101/images/tacos/870327.jpg \n", + " inflating: food-101/food-101/images/tacos/874446.jpg \n", + " inflating: food-101/food-101/images/tacos/874556.jpg \n", + " inflating: food-101/food-101/images/tacos/875734.jpg \n", + " inflating: food-101/food-101/images/tacos/87767.jpg \n", + " inflating: food-101/food-101/images/tacos/896949.jpg \n", + " inflating: food-101/food-101/images/tacos/904583.jpg \n", + " inflating: food-101/food-101/images/tacos/907061.jpg \n", + " inflating: food-101/food-101/images/tacos/910144.jpg \n", + " inflating: food-101/food-101/images/tacos/911899.jpg \n", + " inflating: food-101/food-101/images/tacos/912020.jpg \n", + " inflating: food-101/food-101/images/tacos/912275.jpg \n", + " inflating: food-101/food-101/images/tacos/91964.jpg \n", + " inflating: food-101/food-101/images/tacos/924512.jpg \n", + " inflating: food-101/food-101/images/tacos/925843.jpg \n", + " inflating: food-101/food-101/images/tacos/936041.jpg \n", + " inflating: food-101/food-101/images/tacos/942465.jpg \n", + " inflating: food-101/food-101/images/tacos/947556.jpg \n", + " inflating: food-101/food-101/images/tacos/952872.jpg \n", + " inflating: food-101/food-101/images/tacos/952885.jpg \n", + " inflating: food-101/food-101/images/tacos/955551.jpg \n", + " inflating: food-101/food-101/images/tacos/956341.jpg \n", + " inflating: food-101/food-101/images/tacos/974823.jpg \n", + " inflating: food-101/food-101/images/tacos/975273.jpg \n", + " inflating: food-101/food-101/images/tacos/975798.jpg \n", + " inflating: food-101/food-101/images/tacos/975974.jpg \n", + " inflating: food-101/food-101/images/tacos/980382.jpg \n", + " inflating: food-101/food-101/images/tacos/982544.jpg \n", + " inflating: food-101/food-101/images/tacos/986817.jpg \n", + " inflating: food-101/food-101/images/tacos/990034.jpg \n", + " inflating: food-101/food-101/images/tacos/991261.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1002013.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1002167.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1002237.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1003289.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1010258.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1012802.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1016334.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1016857.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1022404.jpg \n", + " inflating: food-101/food-101/images/takoyaki/102284.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1025445.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1029933.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1034768.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1035370.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1039457.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1043001.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1045631.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1046921.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1055534.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1058365.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1065533.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1068834.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1069998.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1085743.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1093016.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1093318.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1096319.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1103284.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1103395.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1103543.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1113665.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1115738.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1115739.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1115909.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1116166.jpg \n", + " inflating: food-101/food-101/images/takoyaki/111766.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1122579.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1126334.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1128320.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1130995.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1131695.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1133698.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1135249.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1140791.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1142229.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1145789.jpg \n", + " inflating: food-101/food-101/images/takoyaki/114935.jpg \n", + " inflating: food-101/food-101/images/takoyaki/114959.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1150868.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1157313.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1161535.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1163070.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1169507.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1170148.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1183616.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1184113.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1188503.jpg \n", + " inflating: food-101/food-101/images/takoyaki/119152.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1191884.jpg \n", + " inflating: food-101/food-101/images/takoyaki/119195.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1206992.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1208551.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1211249.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1215578.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1216488.jpg \n", + " inflating: food-101/food-101/images/takoyaki/122322.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1227331.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1228529.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1232964.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1256006.jpg \n", + " inflating: food-101/food-101/images/takoyaki/125755.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1261746.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1267793.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1283993.jpg \n", + " inflating: food-101/food-101/images/takoyaki/128746.jpg \n", + " inflating: food-101/food-101/images/takoyaki/128818.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1296570.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1298669.jpg \n", + " inflating: food-101/food-101/images/takoyaki/130350.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1309932.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1316132.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1317573.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1320117.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1321871.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1322881.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1326001.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1326339.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1327577.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1327965.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1328176.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1334377.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1338177.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1339207.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1340802.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1343306.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1347978.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1348393.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1348394.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1348805.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1353969.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1359944.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1368025.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1369001.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1370.jpg \n", + " inflating: food-101/food-101/images/takoyaki/137609.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1377723.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1385301.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1385417.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1386467.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1395047.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1396790.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1399938.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1404317.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1408033.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1408909.jpg \n", + " inflating: food-101/food-101/images/takoyaki/140993.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1414328.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1419252.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1426664.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1428179.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1429705.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1437975.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1441782.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1444275.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1453024.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1461210.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1464586.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1470214.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1470509.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1471690.jpg \n", + " inflating: food-101/food-101/images/takoyaki/147193.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1477569.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1479100.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1481918.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1488746.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1494065.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1495491.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1510755.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1516067.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1522049.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1523838.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1526680.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1527019.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1545358.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1546550.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1552257.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1553334.jpg \n", + " inflating: food-101/food-101/images/takoyaki/155550.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1555526.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1561025.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1565844.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1570074.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1577294.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1578933.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1580613.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1582251.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1587046.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1593524.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1595889.jpg \n", + " inflating: food-101/food-101/images/takoyaki/159894.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1601624.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1606600.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1608014.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1609356.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1609491.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1609831.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1610046.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1610913.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1614155.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1615290.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1621977.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1622216.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1625192.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1630260.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1633961.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1637299.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1639255.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1647019.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1650493.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1651606.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1652301.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1652857.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1656700.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1657214.jpg \n", + " inflating: food-101/food-101/images/takoyaki/165735.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1657501.jpg \n", + " inflating: food-101/food-101/images/takoyaki/166204.jpg \n", + " inflating: food-101/food-101/images/takoyaki/166704.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1672611.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1679780.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1683138.jpg \n", + " inflating: food-101/food-101/images/takoyaki/168664.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1690756.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1692042.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1693966.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1694779.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1696444.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1701861.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1712342.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1712349.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1726046.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1727691.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1732340.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1735246.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1735481.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1741307.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1748582.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1753822.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1754577.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1756509.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1759204.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1760765.jpg \n", + " inflating: food-101/food-101/images/takoyaki/176266.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1764286.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1765893.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1765914.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1767620.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1771195.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1774992.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1782705.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1786753.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1790682.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1797029.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1797224.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1799541.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1800172.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1802256.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1806129.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1808073.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1809386.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1813547.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1814190.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1814896.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1819298.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1821738.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1825469.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1826795.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1836141.jpg \n", + " inflating: food-101/food-101/images/takoyaki/183717.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1839013.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1841734.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1842535.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1844605.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1850795.jpg \n", + " inflating: food-101/food-101/images/takoyaki/185141.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1855427.jpg \n", + " inflating: food-101/food-101/images/takoyaki/185554.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1862082.jpg \n", + " inflating: food-101/food-101/images/takoyaki/18622.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1866469.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1866588.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1866643.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1872820.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1873453.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1875184.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1878406.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1884836.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1887858.jpg \n", + " inflating: food-101/food-101/images/takoyaki/190027.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1912168.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1912270.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1913820.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1916693.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1916883.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1918337.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1921095.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1921474.jpg \n", + " inflating: food-101/food-101/images/takoyaki/192790.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1929477.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1931095.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1931381.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1934380.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1941091.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1946921.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1957965.jpg \n", + " inflating: food-101/food-101/images/takoyaki/196570.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1967057.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1968296.jpg \n", + " inflating: food-101/food-101/images/takoyaki/197368.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1980410.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1984095.jpg \n", + " inflating: food-101/food-101/images/takoyaki/198580.jpg \n", + " inflating: food-101/food-101/images/takoyaki/1998692.jpg \n", + " inflating: food-101/food-101/images/takoyaki/199999.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2000246.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2005039.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2005053.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2007062.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2012783.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2014521.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2015634.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2029820.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2031483.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2033708.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2036508.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2036777.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2041578.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2044463.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2045667.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2046335.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2053633.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2056652.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2056932.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2057647.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2060674.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2061358.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2062894.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2066592.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2070339.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2081733.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2082458.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2098990.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2099441.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2101329.jpg \n", + " inflating: food-101/food-101/images/takoyaki/211195.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2112710.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2114185.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2119677.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2121850.jpg \n", + " inflating: food-101/food-101/images/takoyaki/212521.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2128707.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2128809.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2129377.jpg \n", + " inflating: food-101/food-101/images/takoyaki/213474.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2135033.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2146839.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2147607.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2156455.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2156809.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2156827.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2161053.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2161447.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2161538.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2161851.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2164106.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2165305.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2166365.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2173529.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2173578.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2177438.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2177568.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2178104.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2189202.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2190103.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2198240.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2200696.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2200776.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2201105.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2202223.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2211317.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2215013.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2223619.jpg \n", + " inflating: food-101/food-101/images/takoyaki/223796.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2243696.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2244288.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2247872.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2251336.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2253038.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2253712.jpg \n", + " inflating: food-101/food-101/images/takoyaki/225868.jpg \n", + " inflating: food-101/food-101/images/takoyaki/225871.jpg \n", + " inflating: food-101/food-101/images/takoyaki/227433.jpg \n", + " inflating: food-101/food-101/images/takoyaki/228203.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2284798.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2306.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2306432.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2307812.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2312574.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2316382.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2322654.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2322684.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2328385.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2328814.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2332481.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2334543.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2337368.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2344460.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2346318.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2348423.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2354658.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2354783.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2358930.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2359261.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2366031.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2366168.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2377065.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2381302.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2381597.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2396967.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2402528.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2402674.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2409895.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2410929.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2413525.jpg \n", + " inflating: food-101/food-101/images/takoyaki/241430.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2416799.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2422949.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2435832.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2436539.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2439157.jpg \n", + " inflating: food-101/food-101/images/takoyaki/244831.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2449136.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2449647.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2452881.jpg \n", + " inflating: food-101/food-101/images/takoyaki/245387.jpg \n", + " inflating: food-101/food-101/images/takoyaki/245445.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2456953.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2457015.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2461870.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2463279.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2464865.jpg \n", + " inflating: food-101/food-101/images/takoyaki/24691.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2471659.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2474894.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2478904.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2480341.jpg \n", + " inflating: food-101/food-101/images/takoyaki/248260.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2483611.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2485022.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2486197.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2492193.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2494020.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2495116.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2500473.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2508089.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2510257.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2513972.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2514363.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2516718.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2518469.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2521556.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2522282.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2522688.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2524432.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2531859.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2532733.jpg \n", + " inflating: food-101/food-101/images/takoyaki/25339.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2535751.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2541299.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2545488.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2546728.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2549196.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2551557.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2552653.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2555608.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2555811.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2561863.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2564008.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2568658.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2579163.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2585618.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2585660.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2589270.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2591705.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2595538.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2595782.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2598890.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2599900.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2603475.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2603874.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2604822.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2605700.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2606288.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2606935.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2609451.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2610521.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2610785.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2610888.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2613800.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2615850.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2616689.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2616858.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2620430.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2623785.jpg \n", + " inflating: food-101/food-101/images/takoyaki/262385.jpg \n", + " inflating: food-101/food-101/images/takoyaki/262389.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2625926.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2630009.jpg \n", + " inflating: food-101/food-101/images/takoyaki/263587.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2649636.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2659241.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2659561.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2685712.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2701599.jpg \n", + " inflating: food-101/food-101/images/takoyaki/270382.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2706237.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2706241.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2708607.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2711840.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2721194.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2721280.jpg \n", + " inflating: food-101/food-101/images/takoyaki/272279.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2724854.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2728641.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2738536.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2744341.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2749776.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2751549.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2754793.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2760492.jpg \n", + " inflating: food-101/food-101/images/takoyaki/27640.jpg \n", + " inflating: food-101/food-101/images/takoyaki/277076.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2772293.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2773399.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2774235.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2775785.jpg \n", + " inflating: food-101/food-101/images/takoyaki/277883.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2783428.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2783613.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2787527.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2788766.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2791240.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2797249.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2797966.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2799346.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2805778.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2810284.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2814896.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2815621.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2817155.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2817778.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2820767.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2824913.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2830655.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2845648.jpg \n", + " inflating: food-101/food-101/images/takoyaki/284998.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2853296.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2855639.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2861548.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2864454.jpg \n", + " inflating: food-101/food-101/images/takoyaki/286501.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2867705.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2874615.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2875699.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2877332.jpg \n", + " inflating: food-101/food-101/images/takoyaki/287837.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2878802.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2881604.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2881818.jpg \n", + " inflating: food-101/food-101/images/takoyaki/288860.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2889718.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2891074.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2894530.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2895219.jpg \n", + " inflating: food-101/food-101/images/takoyaki/289527.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2900174.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2903947.jpg \n", + " inflating: food-101/food-101/images/takoyaki/290602.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2910751.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2911817.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2911910.jpg \n", + " inflating: food-101/food-101/images/takoyaki/291515.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2915211.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2916748.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2921278.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2922467.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2923337.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2930957.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2942411.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2946590.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2946790.jpg \n", + " inflating: food-101/food-101/images/takoyaki/294923.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2955325.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2958220.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2966363.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2967770.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2967951.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2968426.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2970510.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2971658.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2975805.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2976489.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2979613.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2989505.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2993867.jpg \n", + " inflating: food-101/food-101/images/takoyaki/2998658.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3002428.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3003038.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3003215.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3006334.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3010949.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3012592.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3018174.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3019059.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3021168.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3021728.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3027423.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3031554.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3032868.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3037289.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3042785.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3046557.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3049209.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3051739.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3054432.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3063506.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3064955.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3072848.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3075308.jpg \n", + " inflating: food-101/food-101/images/takoyaki/307600.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3076572.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3086572.jpg \n", + " inflating: food-101/food-101/images/takoyaki/309046.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3094798.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3102069.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3129236.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3130148.jpg \n", + " inflating: food-101/food-101/images/takoyaki/31339.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3136714.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3138621.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3141472.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3147814.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3150825.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3150827.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3153904.jpg \n", + " inflating: food-101/food-101/images/takoyaki/315391.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3158804.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3161739.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3163396.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3168140.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3169666.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3169916.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3178045.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3181181.jpg \n", + " inflating: food-101/food-101/images/takoyaki/318373.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3193224.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3194673.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3205035.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3205985.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3210499.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3214741.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3225271.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3230944.jpg \n", + " inflating: food-101/food-101/images/takoyaki/32310.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3233515.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3233524.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3233854.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3234005.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3238616.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3242821.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3243120.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3249868.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3252127.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3253346.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3259232.jpg \n", + " inflating: food-101/food-101/images/takoyaki/326340.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3266604.jpg \n", + " inflating: food-101/food-101/images/takoyaki/326781.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3282391.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3288810.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3293086.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3294314.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3296159.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3298088.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3310286.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3310338.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3313790.jpg \n", + " inflating: food-101/food-101/images/takoyaki/332021.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3322347.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3328935.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3331130.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3332604.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3336830.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3341016.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3352249.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3357262.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3375978.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3376492.jpg \n", + " inflating: food-101/food-101/images/takoyaki/33860.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3387586.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3397252.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3405713.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3408429.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3410154.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3410241.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3415542.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3417389.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3423091.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3429912.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3435488.jpg \n", + " inflating: food-101/food-101/images/takoyaki/343786.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3438855.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3443066.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3448676.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3449517.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3454458.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3455310.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3457919.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3460442.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3461694.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3466266.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3466307.jpg \n", + " inflating: food-101/food-101/images/takoyaki/347176.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3476235.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3489266.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3498693.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3498886.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3502341.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3504062.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3506374.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3506438.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3506755.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3524164.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3534363.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3534852.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3537662.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3548876.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3551471.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3554242.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3565437.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3569489.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3570369.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3575101.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3575317.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3580253.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3603482.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3609028.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3609263.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3609949.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3612623.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3617237.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3619523.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3627671.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3628506.jpg \n", + " inflating: food-101/food-101/images/takoyaki/362982.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3634139.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3638218.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3642080.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3642161.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3651132.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3652024.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3655272.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3661171.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3662609.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3664175.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3672870.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3673452.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3675315.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3675687.jpg \n", + " inflating: food-101/food-101/images/takoyaki/367683.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3679264.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3679406.jpg \n", + " inflating: food-101/food-101/images/takoyaki/368055.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3681620.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3683003.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3686302.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3692091.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3695942.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3697133.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3697325.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3702475.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3708585.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3709817.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3712855.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3713603.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3716689.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3718325.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3720685.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3724542.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3725131.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3728041.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3731876.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3736904.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3752675.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3752935.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3758700.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3774197.jpg \n", + " inflating: food-101/food-101/images/takoyaki/377590.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3780450.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3780709.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3791482.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3793104.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3796189.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3799923.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3804079.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3809028.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3812501.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3812678.jpg \n", + " inflating: food-101/food-101/images/takoyaki/381898.jpg \n", + " inflating: food-101/food-101/images/takoyaki/383274.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3837513.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3837557.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3838578.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3846185.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3854779.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3855074.jpg \n", + " inflating: food-101/food-101/images/takoyaki/385739.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3859810.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3863177.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3870420.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3871655.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3878903.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3882206.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3900277.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3910486.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3912617.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3914860.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3915038.jpg \n", + " inflating: food-101/food-101/images/takoyaki/3920302.jpg \n", + " inflating: food-101/food-101/images/takoyaki/395118.jpg \n", + " inflating: food-101/food-101/images/takoyaki/398037.jpg \n", + " inflating: food-101/food-101/images/takoyaki/399069.jpg \n", + " inflating: food-101/food-101/images/takoyaki/404028.jpg \n", + " inflating: food-101/food-101/images/takoyaki/408424.jpg \n", + " inflating: food-101/food-101/images/takoyaki/415923.jpg \n", + " inflating: food-101/food-101/images/takoyaki/418734.jpg \n", + " inflating: food-101/food-101/images/takoyaki/420720.jpg \n", + " inflating: food-101/food-101/images/takoyaki/423667.jpg \n", + " inflating: food-101/food-101/images/takoyaki/44239.jpg \n", + " inflating: food-101/food-101/images/takoyaki/44652.jpg \n", + " inflating: food-101/food-101/images/takoyaki/447380.jpg \n", + " inflating: food-101/food-101/images/takoyaki/447511.jpg \n", + " inflating: food-101/food-101/images/takoyaki/450850.jpg \n", + " inflating: food-101/food-101/images/takoyaki/451023.jpg \n", + " inflating: food-101/food-101/images/takoyaki/45129.jpg \n", + " inflating: food-101/food-101/images/takoyaki/451304.jpg \n", + " inflating: food-101/food-101/images/takoyaki/451394.jpg \n", + " inflating: food-101/food-101/images/takoyaki/45185.jpg \n", + " inflating: food-101/food-101/images/takoyaki/454126.jpg \n", + " inflating: food-101/food-101/images/takoyaki/454128.jpg \n", + " inflating: food-101/food-101/images/takoyaki/454134.jpg \n", + " inflating: food-101/food-101/images/takoyaki/454978.jpg \n", + " inflating: food-101/food-101/images/takoyaki/454980.jpg \n", + " inflating: food-101/food-101/images/takoyaki/455666.jpg \n", + " inflating: food-101/food-101/images/takoyaki/45570.jpg \n", + " inflating: food-101/food-101/images/takoyaki/455782.jpg \n", + " inflating: food-101/food-101/images/takoyaki/45627.jpg \n", + " inflating: food-101/food-101/images/takoyaki/457841.jpg \n", + " inflating: food-101/food-101/images/takoyaki/46008.jpg \n", + " inflating: food-101/food-101/images/takoyaki/461182.jpg \n", + " inflating: food-101/food-101/images/takoyaki/463070.jpg \n", + " inflating: food-101/food-101/images/takoyaki/46357.jpg \n", + " inflating: food-101/food-101/images/takoyaki/47754.jpg \n", + " inflating: food-101/food-101/images/takoyaki/48152.jpg \n", + " inflating: food-101/food-101/images/takoyaki/485797.jpg \n", + " inflating: food-101/food-101/images/takoyaki/489780.jpg \n", + " inflating: food-101/food-101/images/takoyaki/491350.jpg \n", + " inflating: food-101/food-101/images/takoyaki/494914.jpg \n", + " inflating: food-101/food-101/images/takoyaki/501687.jpg \n", + " inflating: food-101/food-101/images/takoyaki/503610.jpg \n", + " inflating: food-101/food-101/images/takoyaki/503946.jpg \n", + " inflating: food-101/food-101/images/takoyaki/508718.jpg \n", + " inflating: food-101/food-101/images/takoyaki/509239.jpg \n", + " inflating: food-101/food-101/images/takoyaki/518032.jpg \n", + " inflating: food-101/food-101/images/takoyaki/520178.jpg \n", + " inflating: food-101/food-101/images/takoyaki/5202.jpg \n", + " inflating: food-101/food-101/images/takoyaki/520573.jpg \n", + " inflating: food-101/food-101/images/takoyaki/521503.jpg \n", + " inflating: food-101/food-101/images/takoyaki/524205.jpg \n", + " inflating: food-101/food-101/images/takoyaki/528937.jpg \n", + " inflating: food-101/food-101/images/takoyaki/529110.jpg \n", + " inflating: food-101/food-101/images/takoyaki/529112.jpg \n", + " inflating: food-101/food-101/images/takoyaki/53341.jpg \n", + " inflating: food-101/food-101/images/takoyaki/534015.jpg \n", + " inflating: food-101/food-101/images/takoyaki/534342.jpg \n", + " inflating: food-101/food-101/images/takoyaki/536604.jpg \n", + " inflating: food-101/food-101/images/takoyaki/537390.jpg \n", + " inflating: food-101/food-101/images/takoyaki/540313.jpg \n", + " inflating: food-101/food-101/images/takoyaki/544467.jpg \n", + " inflating: food-101/food-101/images/takoyaki/554885.jpg \n", + " inflating: food-101/food-101/images/takoyaki/558516.jpg \n", + " inflating: food-101/food-101/images/takoyaki/56537.jpg \n", + " inflating: food-101/food-101/images/takoyaki/57044.jpg \n", + " inflating: food-101/food-101/images/takoyaki/573094.jpg \n", + " inflating: food-101/food-101/images/takoyaki/574551.jpg \n", + " inflating: food-101/food-101/images/takoyaki/576234.jpg \n", + " inflating: food-101/food-101/images/takoyaki/581477.jpg \n", + " inflating: food-101/food-101/images/takoyaki/584471.jpg \n", + " inflating: food-101/food-101/images/takoyaki/584771.jpg \n", + " inflating: food-101/food-101/images/takoyaki/586407.jpg \n", + " inflating: food-101/food-101/images/takoyaki/587892.jpg \n", + " inflating: food-101/food-101/images/takoyaki/590980.jpg \n", + " inflating: food-101/food-101/images/takoyaki/595019.jpg \n", + " inflating: food-101/food-101/images/takoyaki/597587.jpg \n", + " inflating: food-101/food-101/images/takoyaki/600061.jpg \n", + " inflating: food-101/food-101/images/takoyaki/606683.jpg \n", + " inflating: food-101/food-101/images/takoyaki/608441.jpg \n", + " inflating: food-101/food-101/images/takoyaki/611669.jpg \n", + " inflating: food-101/food-101/images/takoyaki/612969.jpg \n", + " inflating: food-101/food-101/images/takoyaki/617562.jpg \n", + " inflating: food-101/food-101/images/takoyaki/617567.jpg \n", + " inflating: food-101/food-101/images/takoyaki/624997.jpg \n", + " inflating: food-101/food-101/images/takoyaki/627733.jpg \n", + " inflating: food-101/food-101/images/takoyaki/62843.jpg \n", + " inflating: food-101/food-101/images/takoyaki/628673.jpg \n", + " inflating: food-101/food-101/images/takoyaki/646207.jpg \n", + " inflating: food-101/food-101/images/takoyaki/651405.jpg \n", + " inflating: food-101/food-101/images/takoyaki/65276.jpg \n", + " inflating: food-101/food-101/images/takoyaki/65376.jpg \n", + " inflating: food-101/food-101/images/takoyaki/653925.jpg \n", + " inflating: food-101/food-101/images/takoyaki/655704.jpg \n", + " inflating: food-101/food-101/images/takoyaki/655710.jpg \n", + " inflating: food-101/food-101/images/takoyaki/659393.jpg \n", + " inflating: food-101/food-101/images/takoyaki/659404.jpg \n", + " inflating: food-101/food-101/images/takoyaki/660040.jpg \n", + " inflating: food-101/food-101/images/takoyaki/660600.jpg \n", + " inflating: food-101/food-101/images/takoyaki/668423.jpg \n", + " inflating: food-101/food-101/images/takoyaki/669572.jpg \n", + " inflating: food-101/food-101/images/takoyaki/669605.jpg \n", + " inflating: food-101/food-101/images/takoyaki/670312.jpg \n", + " inflating: food-101/food-101/images/takoyaki/674801.jpg \n", + " inflating: food-101/food-101/images/takoyaki/675036.jpg \n", + " inflating: food-101/food-101/images/takoyaki/676990.jpg \n", + " inflating: food-101/food-101/images/takoyaki/682236.jpg \n", + " inflating: food-101/food-101/images/takoyaki/684789.jpg \n", + " inflating: food-101/food-101/images/takoyaki/685493.jpg \n", + " inflating: food-101/food-101/images/takoyaki/686111.jpg \n", + " inflating: food-101/food-101/images/takoyaki/687832.jpg \n", + " inflating: food-101/food-101/images/takoyaki/692871.jpg \n", + " inflating: food-101/food-101/images/takoyaki/694770.jpg \n", + " inflating: food-101/food-101/images/takoyaki/698527.jpg \n", + " inflating: food-101/food-101/images/takoyaki/702511.jpg \n", + " inflating: food-101/food-101/images/takoyaki/702725.jpg \n", + " inflating: food-101/food-101/images/takoyaki/705185.jpg \n", + " inflating: food-101/food-101/images/takoyaki/707640.jpg \n", + " inflating: food-101/food-101/images/takoyaki/709294.jpg \n", + " inflating: food-101/food-101/images/takoyaki/714980.jpg \n", + " inflating: food-101/food-101/images/takoyaki/72228.jpg \n", + " inflating: food-101/food-101/images/takoyaki/733112.jpg \n", + " inflating: food-101/food-101/images/takoyaki/736144.jpg \n", + " inflating: food-101/food-101/images/takoyaki/736932.jpg \n", + " inflating: food-101/food-101/images/takoyaki/741808.jpg \n", + " inflating: food-101/food-101/images/takoyaki/743490.jpg \n", + " inflating: food-101/food-101/images/takoyaki/744002.jpg \n", + " inflating: food-101/food-101/images/takoyaki/748901.jpg \n", + " inflating: food-101/food-101/images/takoyaki/749153.jpg \n", + " inflating: food-101/food-101/images/takoyaki/751592.jpg \n", + " inflating: food-101/food-101/images/takoyaki/751665.jpg \n", + " inflating: food-101/food-101/images/takoyaki/751981.jpg \n", + " inflating: food-101/food-101/images/takoyaki/752755.jpg \n", + " inflating: food-101/food-101/images/takoyaki/766813.jpg \n", + " inflating: food-101/food-101/images/takoyaki/771500.jpg \n", + " inflating: food-101/food-101/images/takoyaki/781281.jpg \n", + " inflating: food-101/food-101/images/takoyaki/788614.jpg \n", + " inflating: food-101/food-101/images/takoyaki/789632.jpg \n", + " inflating: food-101/food-101/images/takoyaki/800517.jpg \n", + " inflating: food-101/food-101/images/takoyaki/801882.jpg \n", + " inflating: food-101/food-101/images/takoyaki/804118.jpg \n", + " inflating: food-101/food-101/images/takoyaki/808309.jpg \n", + " inflating: food-101/food-101/images/takoyaki/818257.jpg \n", + " inflating: food-101/food-101/images/takoyaki/818954.jpg \n", + " inflating: food-101/food-101/images/takoyaki/822322.jpg \n", + " inflating: food-101/food-101/images/takoyaki/827559.jpg \n", + " inflating: food-101/food-101/images/takoyaki/829562.jpg \n", + " inflating: food-101/food-101/images/takoyaki/830370.jpg \n", + " inflating: food-101/food-101/images/takoyaki/83221.jpg \n", + " inflating: food-101/food-101/images/takoyaki/832998.jpg \n", + " inflating: food-101/food-101/images/takoyaki/833644.jpg \n", + " inflating: food-101/food-101/images/takoyaki/834288.jpg \n", + " inflating: food-101/food-101/images/takoyaki/837193.jpg \n", + " inflating: food-101/food-101/images/takoyaki/837760.jpg \n", + " inflating: food-101/food-101/images/takoyaki/841876.jpg \n", + " inflating: food-101/food-101/images/takoyaki/842228.jpg \n", + " inflating: food-101/food-101/images/takoyaki/842664.jpg \n", + " inflating: food-101/food-101/images/takoyaki/843945.jpg \n", + " inflating: food-101/food-101/images/takoyaki/844419.jpg \n", + " inflating: food-101/food-101/images/takoyaki/844768.jpg \n", + " inflating: food-101/food-101/images/takoyaki/850333.jpg \n", + " inflating: food-101/food-101/images/takoyaki/853649.jpg \n", + " inflating: food-101/food-101/images/takoyaki/853944.jpg \n", + " inflating: food-101/food-101/images/takoyaki/85593.jpg \n", + " inflating: food-101/food-101/images/takoyaki/856972.jpg \n", + " inflating: food-101/food-101/images/takoyaki/862764.jpg \n", + " inflating: food-101/food-101/images/takoyaki/868613.jpg \n", + " inflating: food-101/food-101/images/takoyaki/86899.jpg \n", + " inflating: food-101/food-101/images/takoyaki/869935.jpg \n", + " inflating: food-101/food-101/images/takoyaki/875796.jpg \n", + " inflating: food-101/food-101/images/takoyaki/877517.jpg \n", + " inflating: food-101/food-101/images/takoyaki/88731.jpg \n", + " inflating: food-101/food-101/images/takoyaki/889607.jpg \n", + " inflating: food-101/food-101/images/takoyaki/893088.jpg \n", + " inflating: food-101/food-101/images/takoyaki/897284.jpg \n", + " inflating: food-101/food-101/images/takoyaki/90139.jpg \n", + " inflating: food-101/food-101/images/takoyaki/902263.jpg \n", + " inflating: food-101/food-101/images/takoyaki/904123.jpg \n", + " inflating: food-101/food-101/images/takoyaki/907950.jpg \n", + " inflating: food-101/food-101/images/takoyaki/908475.jpg \n", + " inflating: food-101/food-101/images/takoyaki/913724.jpg \n", + " inflating: food-101/food-101/images/takoyaki/914304.jpg \n", + " inflating: food-101/food-101/images/takoyaki/919902.jpg \n", + " inflating: food-101/food-101/images/takoyaki/923389.jpg \n", + " inflating: food-101/food-101/images/takoyaki/929396.jpg \n", + " inflating: food-101/food-101/images/takoyaki/929601.jpg \n", + " inflating: food-101/food-101/images/takoyaki/931198.jpg \n", + " inflating: food-101/food-101/images/takoyaki/931276.jpg \n", + " inflating: food-101/food-101/images/takoyaki/933800.jpg \n", + " inflating: food-101/food-101/images/takoyaki/934590.jpg \n", + " inflating: food-101/food-101/images/takoyaki/938244.jpg \n", + " inflating: food-101/food-101/images/takoyaki/942541.jpg \n", + " inflating: food-101/food-101/images/takoyaki/943785.jpg \n", + " inflating: food-101/food-101/images/takoyaki/945663.jpg \n", + " inflating: food-101/food-101/images/takoyaki/953469.jpg \n", + " inflating: food-101/food-101/images/takoyaki/960118.jpg \n", + " inflating: food-101/food-101/images/takoyaki/963942.jpg \n", + " inflating: food-101/food-101/images/takoyaki/965653.jpg \n", + " inflating: food-101/food-101/images/takoyaki/966428.jpg \n", + " inflating: food-101/food-101/images/takoyaki/970865.jpg \n", + " inflating: food-101/food-101/images/takoyaki/97911.jpg \n", + " inflating: food-101/food-101/images/takoyaki/982593.jpg \n", + " inflating: food-101/food-101/images/takoyaki/985307.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1002946.jpg \n", + " inflating: food-101/food-101/images/tiramisu/100504.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1009109.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1015080.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1016527.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1023537.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1026043.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1026550.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1032177.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1034333.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1038052.jpg \n", + " inflating: food-101/food-101/images/tiramisu/103850.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1039481.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1040253.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1043867.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1045579.jpg \n", + " inflating: food-101/food-101/images/tiramisu/105485.jpg \n", + " inflating: food-101/food-101/images/tiramisu/105532.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1057474.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1059966.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1060127.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1061807.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1062773.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1071748.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1072043.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1073868.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1074380.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1083184.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1084668.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1091265.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1094581.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1108683.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1109901.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1114111.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1115577.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1117112.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1119464.jpg \n", + " inflating: food-101/food-101/images/tiramisu/11272.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1127862.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1132621.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1136909.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1138291.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1141716.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1143941.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1156943.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1157925.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1162659.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1166767.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1167528.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1169808.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1172147.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1179143.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1179809.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1189372.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1193160.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1194926.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1202843.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1203999.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1209936.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1210023.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1211138.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1211872.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1217967.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1225591.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1233331.jpg \n", + " inflating: food-101/food-101/images/tiramisu/123563.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1236136.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1238685.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1244199.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1246743.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1248053.jpg \n", + " inflating: food-101/food-101/images/tiramisu/124945.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1257409.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1263110.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1265696.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1267027.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1267644.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1269846.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1278295.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1280513.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1288101.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1291541.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1292137.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1296036.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1297139.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1300504.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1305025.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1313811.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1316773.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1319463.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1320297.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1321095.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1326832.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1337975.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1339515.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1340967.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1341027.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1346407.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1351888.jpg \n", + " inflating: food-101/food-101/images/tiramisu/135295.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1375000.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1377830.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1380802.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1384400.jpg \n", + " inflating: food-101/food-101/images/tiramisu/139188.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1393511.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1400446.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1405438.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1410962.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1412012.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1413893.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1416676.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1434557.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1436664.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1440237.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1445680.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1449607.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1449849.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1450107.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1451799.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1454398.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1463336.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1468595.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1471445.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1472032.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1476631.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1479337.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1486144.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1486986.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1488226.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1494008.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1496723.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1498437.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1506379.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1514063.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1514269.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1517759.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1519466.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1519777.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1524198.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1524803.jpg \n", + " inflating: food-101/food-101/images/tiramisu/152790.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1529640.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1535921.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1537803.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1545786.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1548519.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1555377.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1556718.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1559423.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1559942.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1569112.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1573305.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1577639.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1590539.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1592156.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1612162.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1612518.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1615311.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1617957.jpg \n", + " inflating: food-101/food-101/images/tiramisu/162528.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1625763.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1628468.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1628714.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1631131.jpg \n", + " inflating: food-101/food-101/images/tiramisu/163992.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1641680.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1644287.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1651083.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1653292.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1653833.jpg \n", + " inflating: food-101/food-101/images/tiramisu/165391.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1654647.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1656308.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1657244.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1662188.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1665061.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1669750.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1681160.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1684876.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1692561.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1696378.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1696457.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1701048.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1703995.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1705402.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1709007.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1716118.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1716565.jpg \n", + " inflating: food-101/food-101/images/tiramisu/17189.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1720180.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1720921.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1730783.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1733220.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1735605.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1737869.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1745225.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1745825.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1746422.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1748414.jpg \n", + " inflating: food-101/food-101/images/tiramisu/175106.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1753173.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1756241.jpg \n", + " inflating: food-101/food-101/images/tiramisu/175719.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1768949.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1772662.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1773621.jpg \n", + " inflating: food-101/food-101/images/tiramisu/177938.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1780269.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1780792.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1791395.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1798786.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1799699.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1800350.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1801190.jpg \n", + " inflating: food-101/food-101/images/tiramisu/180323.jpg \n", + " inflating: food-101/food-101/images/tiramisu/18038.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1807092.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1807247.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1808548.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1810102.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1812028.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1816577.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1817634.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1818079.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1819317.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1824216.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1826877.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1829794.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1832112.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1833999.jpg \n", + " inflating: food-101/food-101/images/tiramisu/183429.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1837924.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1843618.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1847690.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1851779.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1854492.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1857712.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1859635.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1861089.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1866845.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1866898.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1890089.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1891971.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1892440.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1893522.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1900276.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1900329.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1906599.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1908836.jpg \n", + " inflating: food-101/food-101/images/tiramisu/191004.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1911646.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1911985.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1914210.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1921266.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1925597.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1927554.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1931159.jpg \n", + " inflating: food-101/food-101/images/tiramisu/193302.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1938068.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1945892.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1956699.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1957033.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1961401.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1961449.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1964907.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1970890.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1972675.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1973788.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1985115.jpg \n", + " inflating: food-101/food-101/images/tiramisu/199014.jpg \n", + " inflating: food-101/food-101/images/tiramisu/1995142.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2000484.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2001653.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2011943.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2020178.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2026146.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2026255.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2028263.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2029713.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2036736.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2043658.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2056064.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2059690.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2060392.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2060572.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2065625.jpg \n", + " inflating: food-101/food-101/images/tiramisu/206668.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2074710.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2075706.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2076978.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2080503.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2081497.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2085806.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2087510.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2087974.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2090805.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2091302.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2093517.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2097382.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2100608.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2113718.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2126846.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2127758.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2129868.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2131367.jpg \n", + " inflating: food-101/food-101/images/tiramisu/213231.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2135862.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2154521.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2166035.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2167972.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2171563.jpg \n", + " inflating: food-101/food-101/images/tiramisu/217317.jpg \n", + " inflating: food-101/food-101/images/tiramisu/217757.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2181314.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2181503.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2186510.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2192206.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2194444.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2202870.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2206362.jpg \n", + " inflating: food-101/food-101/images/tiramisu/220677.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2208425.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2212056.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2215763.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2220643.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2225838.jpg \n", + " inflating: food-101/food-101/images/tiramisu/222658.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2228071.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2230909.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2231877.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2236707.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2238235.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2241680.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2248428.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2248973.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2251296.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2253341.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2253624.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2255074.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2263060.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2264915.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2267885.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2269367.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2276434.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2277624.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2282735.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2282762.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2289496.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2298090.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2303250.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2310268.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2312156.jpg \n", + " inflating: food-101/food-101/images/tiramisu/232335.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2323515.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2324732.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2325122.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2326555.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2333760.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2337259.jpg \n", + " inflating: food-101/food-101/images/tiramisu/233858.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2342782.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2346039.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2351867.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2358536.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2360980.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2362725.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2364828.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2364926.jpg \n", + " inflating: food-101/food-101/images/tiramisu/236574.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2366909.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2370271.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2377497.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2382053.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2383362.jpg \n", + " inflating: food-101/food-101/images/tiramisu/23840.jpg \n", + " inflating: food-101/food-101/images/tiramisu/238698.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2390357.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2391845.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2395497.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2396711.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2399833.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2403559.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2407101.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2408124.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2409460.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2409654.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2414053.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2422213.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2424853.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2431983.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2434.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2439651.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2445783.jpg \n", + " inflating: food-101/food-101/images/tiramisu/245602.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2460811.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2465772.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2469521.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2473828.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2474042.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2479065.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2484327.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2487807.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2488683.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2488755.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2490734.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2492545.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2497012.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2497301.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2499568.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2499838.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2501459.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2507566.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2510646.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2513497.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2520722.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2520860.jpg \n", + " inflating: food-101/food-101/images/tiramisu/252210.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2524000.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2525228.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2531311.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2532404.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2533914.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2539121.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2544731.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2554575.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2561056.jpg \n", + " inflating: food-101/food-101/images/tiramisu/256970.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2573425.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2582566.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2591722.jpg \n", + " inflating: food-101/food-101/images/tiramisu/259191.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2594999.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2596008.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2599898.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2602065.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2602689.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2605902.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2611937.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2614241.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2619584.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2620950.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2623873.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2628324.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2636152.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2636790.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2637538.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2640444.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2643035.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2646134.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2650931.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2658287.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2659053.jpg \n", + " inflating: food-101/food-101/images/tiramisu/266040.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2662861.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2667065.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2670239.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2677742.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2680.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2682782.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2684111.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2684482.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2695586.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2697032.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2700490.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2704145.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2704239.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2711043.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2714250.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2722457.jpg \n", + " inflating: food-101/food-101/images/tiramisu/272661.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2730978.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2731284.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2731942.jpg \n", + " inflating: food-101/food-101/images/tiramisu/273942.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2739589.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2739662.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2742294.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2742430.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2743344.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2743459.jpg \n", + " inflating: food-101/food-101/images/tiramisu/274545.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2746460.jpg \n", + " inflating: food-101/food-101/images/tiramisu/274756.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2754379.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2757205.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2759231.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2763909.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2766760.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2769229.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2774659.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2776910.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2777427.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2778081.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2781411.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2786037.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2796181.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2799011.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2807556.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2815963.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2820182.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2830329.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2833120.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2834703.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2839583.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2843813.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2844165.jpg \n", + " inflating: food-101/food-101/images/tiramisu/284511.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2845280.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2849227.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2850581.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2853872.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2860750.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2863601.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2864228.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2870725.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2885129.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2892103.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2893276.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2897268.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2902782.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2903734.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2906386.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2916344.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2927587.jpg \n", + " inflating: food-101/food-101/images/tiramisu/293435.jpg \n", + " inflating: food-101/food-101/images/tiramisu/293878.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2942157.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2944213.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2944986.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2946211.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2960065.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2960070.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2964713.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2964807.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2967581.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2977889.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2984192.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2987194.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2988328.jpg \n", + " inflating: food-101/food-101/images/tiramisu/298862.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2988654.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2991451.jpg \n", + " inflating: food-101/food-101/images/tiramisu/2997481.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3000633.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3003956.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3008568.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3011297.jpg \n", + " inflating: food-101/food-101/images/tiramisu/301551.jpg \n", + " inflating: food-101/food-101/images/tiramisu/302620.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3031184.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3036256.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3041535.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3045543.jpg \n", + " inflating: food-101/food-101/images/tiramisu/304659.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3048878.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3054676.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3059396.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3061830.jpg \n", + " inflating: food-101/food-101/images/tiramisu/306292.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3063104.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3064652.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3064655.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3067681.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3080604.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3082547.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3084055.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3084593.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3091189.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3093529.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3095650.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3096363.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3098577.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3101693.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3107330.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3107383.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3107597.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3108314.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3109452.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3110811.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3111123.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3112258.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3117714.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3120713.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3124601.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3128104.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3132193.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3140004.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3140235.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3147923.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3149183.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3149900.jpg \n", + " inflating: food-101/food-101/images/tiramisu/31533.jpg \n", + " inflating: food-101/food-101/images/tiramisu/316172.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3164522.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3166752.jpg \n", + " inflating: food-101/food-101/images/tiramisu/316682.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3171422.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3173439.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3179280.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3180815.jpg \n", + " inflating: food-101/food-101/images/tiramisu/318320.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3183357.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3185573.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3190254.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3191259.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3193780.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3201156.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3203923.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3204552.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3205550.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3207321.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3213916.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3216579.jpg \n", + " inflating: food-101/food-101/images/tiramisu/321885.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3221223.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3228909.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3229201.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3233801.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3235079.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3242516.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3252088.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3255902.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3257595.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3259333.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3261488.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3264412.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3267447.jpg \n", + " inflating: food-101/food-101/images/tiramisu/326828.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3268935.jpg \n", + " inflating: food-101/food-101/images/tiramisu/327669.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3277843.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3279519.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3286467.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3290112.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3290255.jpg \n", + " inflating: food-101/food-101/images/tiramisu/329178.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3297619.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3297941.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3300569.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3301218.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3302960.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3304053.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3304267.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3305129.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3305587.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3311589.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3315678.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3320899.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3327603.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3327995.jpg \n", + " inflating: food-101/food-101/images/tiramisu/333067.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3331512.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3332651.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3337539.jpg \n", + " inflating: food-101/food-101/images/tiramisu/333860.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3343348.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3343839.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3346399.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3346922.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3347900.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3350483.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3352633.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3353571.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3354103.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3356364.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3356442.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3358550.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3359764.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3367699.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3369477.jpg \n", + " inflating: food-101/food-101/images/tiramisu/33703.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3379352.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3383833.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3387897.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3389698.jpg \n", + " inflating: food-101/food-101/images/tiramisu/339165.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3394997.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3395306.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3395692.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3400472.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3403724.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3405130.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3405990.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3411270.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3412914.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3415141.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3419575.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3419682.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3422949.jpg \n", + " inflating: food-101/food-101/images/tiramisu/342477.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3425740.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3425790.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3429047.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3429217.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3445430.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3446670.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3449076.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3455427.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3456041.jpg \n", + " inflating: food-101/food-101/images/tiramisu/345749.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3462410.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3474385.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3481044.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3482786.jpg \n", + " inflating: food-101/food-101/images/tiramisu/348496.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3485625.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3488207.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3490282.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3491407.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3491791.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3501623.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3504005.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3506682.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3508187.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3512060.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3517382.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3517475.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3521249.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3521611.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3529646.jpg \n", + " inflating: food-101/food-101/images/tiramisu/353454.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3537459.jpg \n", + " inflating: food-101/food-101/images/tiramisu/354024.jpg \n", + " inflating: food-101/food-101/images/tiramisu/354282.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3543268.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3551870.jpg \n", + " inflating: food-101/food-101/images/tiramisu/355199.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3552045.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3552662.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3552850.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3556900.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3562357.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3570243.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3570270.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3576554.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3576903.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3582134.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3584681.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3586281.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3586948.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3587054.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3590932.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3591410.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3593313.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3594341.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3597308.jpg \n", + " inflating: food-101/food-101/images/tiramisu/360561.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3608439.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3609474.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3610572.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3610772.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3618054.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3640021.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3640482.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3642408.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3644571.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3646255.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3646651.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3648317.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3648937.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3649739.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3655629.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3658415.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3661347.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3668989.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3678593.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3679183.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3681283.jpg \n", + " inflating: food-101/food-101/images/tiramisu/368132.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3682792.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3685526.jpg \n", + " inflating: food-101/food-101/images/tiramisu/368900.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3698139.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3700833.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3704078.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3705038.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3705541.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3711095.jpg \n", + " inflating: food-101/food-101/images/tiramisu/371366.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3717091.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3717963.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3723815.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3728575.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3730884.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3734931.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3740397.jpg \n", + " inflating: food-101/food-101/images/tiramisu/374076.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3741606.jpg \n", + " inflating: food-101/food-101/images/tiramisu/374207.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3742123.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3744313.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3746028.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3746099.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3751500.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3753145.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3762138.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3764776.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3774133.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3774167.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3776018.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3779123.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3788405.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3793145.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3800906.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3810955.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3817995.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3820513.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3829691.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3833309.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3838062.jpg \n", + " inflating: food-101/food-101/images/tiramisu/383819.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3840092.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3842913.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3846092.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3846559.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3847006.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3848533.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3850451.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3852671.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3863781.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3868222.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3868763.jpg \n", + " inflating: food-101/food-101/images/tiramisu/387959.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3888327.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3888602.jpg \n", + " inflating: food-101/food-101/images/tiramisu/389195.jpg \n", + " inflating: food-101/food-101/images/tiramisu/389241.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3894834.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3897546.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3900480.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3903209.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3914963.jpg \n", + " inflating: food-101/food-101/images/tiramisu/391522.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3920905.jpg \n", + " inflating: food-101/food-101/images/tiramisu/392131.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3923041.jpg \n", + " inflating: food-101/food-101/images/tiramisu/3924588.jpg \n", + " inflating: food-101/food-101/images/tiramisu/395629.jpg \n", + " inflating: food-101/food-101/images/tiramisu/401614.jpg \n", + " inflating: food-101/food-101/images/tiramisu/403158.jpg \n", + " inflating: food-101/food-101/images/tiramisu/404168.jpg \n", + " inflating: food-101/food-101/images/tiramisu/413156.jpg \n", + " inflating: food-101/food-101/images/tiramisu/437849.jpg \n", + " inflating: food-101/food-101/images/tiramisu/438600.jpg \n", + " inflating: food-101/food-101/images/tiramisu/441252.jpg \n", + " inflating: food-101/food-101/images/tiramisu/442915.jpg \n", + " inflating: food-101/food-101/images/tiramisu/443212.jpg \n", + " inflating: food-101/food-101/images/tiramisu/445981.jpg \n", + " inflating: food-101/food-101/images/tiramisu/450920.jpg \n", + " inflating: food-101/food-101/images/tiramisu/487955.jpg \n", + " inflating: food-101/food-101/images/tiramisu/488636.jpg \n", + " inflating: food-101/food-101/images/tiramisu/489422.jpg \n", + " inflating: food-101/food-101/images/tiramisu/505640.jpg \n", + " inflating: food-101/food-101/images/tiramisu/508820.jpg \n", + " inflating: food-101/food-101/images/tiramisu/511137.jpg \n", + " inflating: food-101/food-101/images/tiramisu/514938.jpg \n", + " inflating: food-101/food-101/images/tiramisu/516611.jpg \n", + " inflating: food-101/food-101/images/tiramisu/521453.jpg \n", + " inflating: food-101/food-101/images/tiramisu/521895.jpg \n", + " inflating: food-101/food-101/images/tiramisu/522617.jpg \n", + " inflating: food-101/food-101/images/tiramisu/524712.jpg \n", + " inflating: food-101/food-101/images/tiramisu/524973.jpg \n", + " inflating: food-101/food-101/images/tiramisu/528512.jpg \n", + " inflating: food-101/food-101/images/tiramisu/529881.jpg \n", + " inflating: food-101/food-101/images/tiramisu/534227.jpg \n", + " inflating: food-101/food-101/images/tiramisu/536235.jpg \n", + " inflating: food-101/food-101/images/tiramisu/537155.jpg \n", + " inflating: food-101/food-101/images/tiramisu/538788.jpg \n", + " inflating: food-101/food-101/images/tiramisu/541848.jpg \n", + " inflating: food-101/food-101/images/tiramisu/550039.jpg \n", + " inflating: food-101/food-101/images/tiramisu/550279.jpg \n", + " inflating: food-101/food-101/images/tiramisu/551213.jpg \n", + " inflating: food-101/food-101/images/tiramisu/553458.jpg \n", + " inflating: food-101/food-101/images/tiramisu/558505.jpg \n", + " inflating: food-101/food-101/images/tiramisu/560486.jpg \n", + " inflating: food-101/food-101/images/tiramisu/560986.jpg \n", + " inflating: food-101/food-101/images/tiramisu/565245.jpg \n", + " inflating: food-101/food-101/images/tiramisu/568284.jpg \n", + " inflating: food-101/food-101/images/tiramisu/570218.jpg \n", + " inflating: food-101/food-101/images/tiramisu/571637.jpg \n", + " inflating: food-101/food-101/images/tiramisu/574407.jpg \n", + " inflating: food-101/food-101/images/tiramisu/576905.jpg \n", + " inflating: food-101/food-101/images/tiramisu/577467.jpg \n", + " inflating: food-101/food-101/images/tiramisu/583151.jpg \n", + " inflating: food-101/food-101/images/tiramisu/6032.jpg \n", + " inflating: food-101/food-101/images/tiramisu/604564.jpg \n", + " inflating: food-101/food-101/images/tiramisu/610368.jpg \n", + " inflating: food-101/food-101/images/tiramisu/611771.jpg \n", + " inflating: food-101/food-101/images/tiramisu/618123.jpg \n", + " inflating: food-101/food-101/images/tiramisu/619214.jpg \n", + " inflating: food-101/food-101/images/tiramisu/624782.jpg \n", + " inflating: food-101/food-101/images/tiramisu/626772.jpg \n", + " inflating: food-101/food-101/images/tiramisu/627976.jpg \n", + " inflating: food-101/food-101/images/tiramisu/62828.jpg \n", + " inflating: food-101/food-101/images/tiramisu/63187.jpg \n", + " inflating: food-101/food-101/images/tiramisu/638859.jpg \n", + " inflating: food-101/food-101/images/tiramisu/643236.jpg \n", + " inflating: food-101/food-101/images/tiramisu/643559.jpg \n", + " inflating: food-101/food-101/images/tiramisu/645855.jpg \n", + " inflating: food-101/food-101/images/tiramisu/64942.jpg \n", + " inflating: food-101/food-101/images/tiramisu/650309.jpg \n", + " inflating: food-101/food-101/images/tiramisu/652526.jpg \n", + " inflating: food-101/food-101/images/tiramisu/665682.jpg \n", + " inflating: food-101/food-101/images/tiramisu/680254.jpg \n", + " inflating: food-101/food-101/images/tiramisu/694263.jpg \n", + " inflating: food-101/food-101/images/tiramisu/709610.jpg \n", + " inflating: food-101/food-101/images/tiramisu/710373.jpg \n", + " inflating: food-101/food-101/images/tiramisu/710750.jpg \n", + " inflating: food-101/food-101/images/tiramisu/711883.jpg \n", + " inflating: food-101/food-101/images/tiramisu/715725.jpg \n", + " inflating: food-101/food-101/images/tiramisu/716644.jpg \n", + " inflating: food-101/food-101/images/tiramisu/717195.jpg \n", + " inflating: food-101/food-101/images/tiramisu/718599.jpg \n", + " inflating: food-101/food-101/images/tiramisu/723789.jpg \n", + " inflating: food-101/food-101/images/tiramisu/724560.jpg \n", + " inflating: food-101/food-101/images/tiramisu/725741.jpg \n", + " inflating: food-101/food-101/images/tiramisu/727449.jpg \n", + " inflating: food-101/food-101/images/tiramisu/727624.jpg \n", + " inflating: food-101/food-101/images/tiramisu/733770.jpg \n", + " inflating: food-101/food-101/images/tiramisu/738341.jpg \n", + " inflating: food-101/food-101/images/tiramisu/738462.jpg \n", + " inflating: food-101/food-101/images/tiramisu/739856.jpg \n", + " inflating: food-101/food-101/images/tiramisu/746685.jpg \n", + " inflating: food-101/food-101/images/tiramisu/747515.jpg \n", + " inflating: food-101/food-101/images/tiramisu/748238.jpg \n", + " inflating: food-101/food-101/images/tiramisu/763112.jpg \n", + " inflating: food-101/food-101/images/tiramisu/765569.jpg \n", + " inflating: food-101/food-101/images/tiramisu/766100.jpg \n", + " inflating: food-101/food-101/images/tiramisu/767573.jpg \n", + " inflating: food-101/food-101/images/tiramisu/781786.jpg \n", + " inflating: food-101/food-101/images/tiramisu/784174.jpg \n", + " inflating: food-101/food-101/images/tiramisu/785970.jpg \n", + " inflating: food-101/food-101/images/tiramisu/790035.jpg \n", + " inflating: food-101/food-101/images/tiramisu/790849.jpg \n", + " inflating: food-101/food-101/images/tiramisu/792268.jpg \n", + " inflating: food-101/food-101/images/tiramisu/793790.jpg \n", + " inflating: food-101/food-101/images/tiramisu/80043.jpg \n", + " inflating: food-101/food-101/images/tiramisu/801669.jpg \n", + " inflating: food-101/food-101/images/tiramisu/801735.jpg \n", + " inflating: food-101/food-101/images/tiramisu/810718.jpg \n", + " inflating: food-101/food-101/images/tiramisu/814082.jpg \n", + " inflating: food-101/food-101/images/tiramisu/815203.jpg \n", + " inflating: food-101/food-101/images/tiramisu/823998.jpg \n", + " inflating: food-101/food-101/images/tiramisu/824376.jpg \n", + " inflating: food-101/food-101/images/tiramisu/82628.jpg \n", + " inflating: food-101/food-101/images/tiramisu/827370.jpg \n", + " inflating: food-101/food-101/images/tiramisu/830860.jpg \n", + " inflating: food-101/food-101/images/tiramisu/831877.jpg \n", + " inflating: food-101/food-101/images/tiramisu/833654.jpg \n", + " inflating: food-101/food-101/images/tiramisu/833903.jpg \n", + " inflating: food-101/food-101/images/tiramisu/838002.jpg \n", + " inflating: food-101/food-101/images/tiramisu/838509.jpg \n", + " inflating: food-101/food-101/images/tiramisu/842784.jpg \n", + " inflating: food-101/food-101/images/tiramisu/845342.jpg \n", + " inflating: food-101/food-101/images/tiramisu/849295.jpg \n", + " inflating: food-101/food-101/images/tiramisu/853394.jpg \n", + " inflating: food-101/food-101/images/tiramisu/856381.jpg \n", + " inflating: food-101/food-101/images/tiramisu/863147.jpg \n", + " inflating: food-101/food-101/images/tiramisu/868269.jpg \n", + " inflating: food-101/food-101/images/tiramisu/870342.jpg \n", + " inflating: food-101/food-101/images/tiramisu/873107.jpg \n", + " inflating: food-101/food-101/images/tiramisu/875295.jpg \n", + " inflating: food-101/food-101/images/tiramisu/876899.jpg \n", + " inflating: food-101/food-101/images/tiramisu/877758.jpg \n", + " inflating: food-101/food-101/images/tiramisu/879204.jpg \n", + " inflating: food-101/food-101/images/tiramisu/880979.jpg \n", + " inflating: food-101/food-101/images/tiramisu/881855.jpg \n", + " inflating: food-101/food-101/images/tiramisu/883020.jpg \n", + " inflating: food-101/food-101/images/tiramisu/883770.jpg \n", + " inflating: food-101/food-101/images/tiramisu/887606.jpg \n", + " inflating: food-101/food-101/images/tiramisu/889109.jpg \n", + " inflating: food-101/food-101/images/tiramisu/893067.jpg \n", + " inflating: food-101/food-101/images/tiramisu/899393.jpg \n", + " inflating: food-101/food-101/images/tiramisu/901272.jpg \n", + " inflating: food-101/food-101/images/tiramisu/902020.jpg \n", + " inflating: food-101/food-101/images/tiramisu/903821.jpg \n", + " inflating: food-101/food-101/images/tiramisu/909253.jpg \n", + " inflating: food-101/food-101/images/tiramisu/912218.jpg \n", + " inflating: food-101/food-101/images/tiramisu/912525.jpg \n", + " inflating: food-101/food-101/images/tiramisu/913729.jpg \n", + " inflating: food-101/food-101/images/tiramisu/925806.jpg \n", + " inflating: food-101/food-101/images/tiramisu/929007.jpg \n", + " inflating: food-101/food-101/images/tiramisu/942951.jpg \n", + " inflating: food-101/food-101/images/tiramisu/950514.jpg \n", + " inflating: food-101/food-101/images/tiramisu/951130.jpg \n", + " inflating: food-101/food-101/images/tiramisu/953867.jpg \n", + " inflating: food-101/food-101/images/tiramisu/954434.jpg \n", + " inflating: food-101/food-101/images/tiramisu/956625.jpg \n", + " inflating: food-101/food-101/images/tiramisu/958418.jpg \n", + " inflating: food-101/food-101/images/tiramisu/960142.jpg \n", + " inflating: food-101/food-101/images/tiramisu/96202.jpg \n", + " inflating: food-101/food-101/images/tiramisu/962096.jpg \n", + " inflating: food-101/food-101/images/tiramisu/963032.jpg \n", + " inflating: food-101/food-101/images/tiramisu/966712.jpg \n", + " inflating: food-101/food-101/images/tiramisu/967042.jpg \n", + " inflating: food-101/food-101/images/tiramisu/967817.jpg \n", + " inflating: food-101/food-101/images/tiramisu/975603.jpg \n", + " inflating: food-101/food-101/images/tiramisu/977927.jpg \n", + " inflating: food-101/food-101/images/tiramisu/992770.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1008604.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1010528.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1010786.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/101560.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/101595.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1016519.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1021556.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/102915.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1037880.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1052688.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1066205.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1073603.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1079423.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/108172.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/108552.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1101707.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1109293.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1118964.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1119076.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1128820.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1131910.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1137117.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1139624.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1141263.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1146418.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1146877.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1148257.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/11517.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1157350.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/115871.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1162103.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1172669.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1179089.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1179475.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/118399.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1185376.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1189560.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1195192.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1206421.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1206614.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1214336.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1214500.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1234755.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1248009.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1255155.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1261669.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1263036.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1264676.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1268591.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1286896.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1295868.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1296111.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1296491.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1298241.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1300253.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1312482.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1314637.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1317702.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1319225.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1319658.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1326796.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1330931.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1333722.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1334129.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1334460.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1334503.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1341064.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1342329.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1343062.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1348158.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1350692.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1350903.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1359032.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1362672.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1365432.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1372825.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1383119.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1387752.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1392794.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1392955.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1392968.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/139564.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1396812.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1397025.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1397126.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1407420.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1413767.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1414252.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1420145.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1421178.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1425486.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1425629.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1428825.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/142959.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1433931.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1437082.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1437321.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1444185.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1444698.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1451408.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/145214.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1452941.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1453693.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1456769.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/145813.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/145826.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/145862.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1460493.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/146831.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1469622.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1472888.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/147625.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/147706.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1481065.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1486112.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1499018.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1502045.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1504893.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1512290.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1512429.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1513137.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1516298.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1522660.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/152831.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1534250.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1535403.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1539544.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/154702.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1550342.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1552003.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1556411.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1558603.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1561625.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1573089.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/157322.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1574469.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1575772.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1576119.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1585410.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1586916.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1588697.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1591571.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1591979.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1592303.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/159380.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1596058.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1606678.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1611953.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1615517.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1628008.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1631609.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/163162.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1634681.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1640708.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1640756.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1642187.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1642522.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1644233.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1645789.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1646904.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1650241.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1651031.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1653002.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1655312.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1655327.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1655992.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1658829.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1661245.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1666584.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/167047.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/167294.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/168063.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1692900.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1692903.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1693243.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1710812.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1719721.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1720432.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1721002.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1722183.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1724630.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1734901.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1735490.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1738559.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1741689.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1742325.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1744677.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1750574.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1751934.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1753328.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1757149.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1758624.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1765864.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1774734.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1777154.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1778760.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/17806.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1787577.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1789598.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1804670.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1808536.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1819826.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1822146.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1827932.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1834110.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/183445.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/183481.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1837579.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1846648.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1856093.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1859683.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1860447.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1864331.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1867567.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1868121.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1872581.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1873089.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1876188.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1876951.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1877140.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1877516.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1882174.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1882403.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1894245.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1895173.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1896805.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1901100.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1901994.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1907270.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1911004.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/191122.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1916357.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/191832.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1928248.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1933074.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1933132.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/193526.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1935307.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1936434.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1937188.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1938247.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1941378.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1944221.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1951861.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1955807.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1957869.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1959450.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1960307.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1960758.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1977907.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1978172.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/1979091.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/19801.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2013532.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2014856.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/201686.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2018433.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/202266.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2029758.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2032641.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2033109.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2053740.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2054323.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2054924.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/206166.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2065355.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2066866.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2070397.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2076804.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2078245.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2080611.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2087015.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2087797.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/20924.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2093113.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2095002.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2096610.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2097252.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2100275.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2100554.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2105979.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2108488.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2111437.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2112095.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2116073.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2117228.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2119032.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2124811.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2126651.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2131624.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2132798.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2134225.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2134235.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2135983.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2141350.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2146550.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2148186.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2150869.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2153010.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2154639.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2161055.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2164010.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/217005.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2171934.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2179072.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2184557.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2184857.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2187209.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2189636.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2196742.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/221291.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2218826.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2224497.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2225486.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2234075.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2237230.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2245319.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2251276.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/225741.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2259586.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2262920.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2269220.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2272184.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2280403.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2283802.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2291055.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2294682.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2296313.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2308457.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2309907.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2316917.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2317748.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2322199.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/233444.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2336551.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2340776.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2344734.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2349427.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2349606.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2350022.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2354613.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2357074.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2364413.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/236576.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2371195.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2371635.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2377478.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2382010.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2385346.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2386376.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2387005.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2389154.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2391406.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2394632.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2394679.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2398215.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2398538.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2400430.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/24053.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/241131.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2413470.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2414022.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/241844.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2421391.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2425584.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2426381.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2436358.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/243708.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2450706.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2454851.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2457012.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2463243.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2467067.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2471642.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2471922.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2477550.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2477565.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2481081.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2481425.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2483919.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2487035.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2488503.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/24955.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2508294.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2516702.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2519870.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2522490.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2527496.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2528867.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2531864.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2531953.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/253787.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2542517.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2549766.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2551227.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2558062.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2560573.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2566926.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2567018.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/257872.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2579022.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/258514.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/258596.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2589915.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2597143.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2600095.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2603822.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2604381.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2605423.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2607543.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2608589.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2611774.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2611946.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2614845.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2616203.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2617887.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2618027.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2618039.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2623883.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2635028.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2640456.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2640863.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2643219.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2648059.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2657814.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2658826.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2659039.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2659304.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2663212.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2669821.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2677370.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2677394.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2681056.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/268180.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2687886.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/269007.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2692192.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2694793.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2699438.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2702007.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2702304.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2707586.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2714520.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2718927.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/271943.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2726337.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2736022.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2738934.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2738985.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2742637.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2743794.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2747477.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2756438.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2757902.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2759592.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2763960.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2777986.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/279152.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2798572.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2802131.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2807151.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2809127.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2813744.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2814198.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2816024.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2817608.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2819830.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2822069.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2822628.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2822637.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2826187.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2827132.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2831479.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2836757.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2837887.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/284901.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2854378.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2856497.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2862612.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2866419.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2866922.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2878354.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2882724.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/288900.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2891951.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2892091.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2899088.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2910040.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2910564.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2910768.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2913182.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2924446.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2926943.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2932522.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2938497.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2939629.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2939715.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2940010.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2950727.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2953800.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2954102.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2958593.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2960792.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/296778.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2970143.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2972724.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2978472.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2982280.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2986671.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2987452.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2989138.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2991103.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/299390.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/2997404.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3002061.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3016086.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3017049.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3021918.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3023797.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3025223.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3034109.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3038992.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3043526.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3045462.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3050907.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3056847.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3057933.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3058064.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/306745.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/307519.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3076993.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3077953.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3079659.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3080426.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3091207.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3091701.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3092640.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3094539.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3106360.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3108217.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3110432.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3112450.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3114362.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3118783.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3119513.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3121493.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3122272.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3132472.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3132663.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3134727.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3137608.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3139458.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3147138.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3151200.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3151235.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3155594.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3156913.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3157143.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3159654.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3161553.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3169363.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3177361.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3181507.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3187129.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3187463.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3188044.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3189394.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3189576.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/319004.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3192432.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3198714.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3203291.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3204439.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3205616.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3215775.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3221588.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3226625.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3231251.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3232237.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3233255.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3236254.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3246974.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3249251.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3255564.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3255661.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3255995.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3256523.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3261372.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/326248.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3271040.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3273107.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3274105.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/327414.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3274262.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3275586.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/327923.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3279913.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3282685.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3282792.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3290474.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/329426.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3295764.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/33065.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3307632.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3311172.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3312152.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/331686.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3321598.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3332970.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3341791.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3342734.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3345519.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3347591.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3357299.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3357548.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3357647.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3365783.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/33658.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3366743.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3368081.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3370096.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3386147.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3392318.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3394841.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3397062.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3399049.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3404199.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3408362.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3412030.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3413818.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3422306.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3423028.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3426460.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3428071.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3437171.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3443738.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3447957.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3448475.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3448575.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/34487.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3450085.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3451087.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3452533.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3453043.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3453980.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3455928.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3457194.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3460189.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3460824.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3463938.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/346422.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3475354.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3478434.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3479791.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3491856.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3494477.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3497857.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3498641.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3499885.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3500172.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3500490.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/35044.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/350912.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3509335.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3515773.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3519.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3524553.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3529932.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3535846.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3540729.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3541534.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3546461.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3557699.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3557735.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3558721.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3560259.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3561222.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3561619.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3562741.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3567751.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3569122.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3578905.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3580094.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3582701.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3585650.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3593574.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3599714.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3600092.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3601878.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3603460.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/36051.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3610345.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3610676.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3613085.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3619584.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3622255.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3622691.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3624042.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3624484.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3626722.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3628022.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/36290.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3630342.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3635256.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3637329.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3639504.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3652308.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/365643.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3659465.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3661734.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3665209.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3666875.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/366972.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3674282.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3674298.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3674988.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3678199.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3681266.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3685706.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3688212.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3689762.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3692583.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3694073.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3695025.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3696426.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3701580.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3702411.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3704213.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3704226.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3704252.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3707041.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3707150.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3710734.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3715639.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3719672.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3721967.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3724304.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3727452.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3728189.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3736982.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3737381.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3737722.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3738658.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3742299.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3743541.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3746815.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3747142.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3747957.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3750639.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3750702.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3750729.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3752340.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3758607.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3758893.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3760623.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3762471.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3765857.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3769347.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3770796.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3771542.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3780468.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3780540.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3781088.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/378373.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3786485.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3794194.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3794734.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3802300.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3802461.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3803079.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3806895.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3810494.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3810683.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/381073.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3814595.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3819788.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/38202.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3829391.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3838031.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/383902.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3839327.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3842895.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3849717.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3849823.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3851883.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/385203.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3853221.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3855662.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3856356.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/386352.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3867409.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3869483.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3878952.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3882009.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3882575.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3890611.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3891551.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3892681.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3895107.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3896270.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3901215.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3903828.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3913122.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3913323.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3914495.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3918679.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3922281.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3923808.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3923860.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/3924200.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/397270.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/398631.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/400822.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/401274.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/403443.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/412081.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/41718.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/417718.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/419291.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/42175.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/425210.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/43750.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/440111.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/441402.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/448802.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/454509.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/459436.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/465106.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/466053.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/473340.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/474057.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/479041.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/479463.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/482825.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/486727.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/489570.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/494121.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/502306.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/503096.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/505947.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/51230.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/513111.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/513912.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/520040.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/521236.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/525959.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/528072.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/529118.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/533343.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/53579.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/536038.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/538381.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/538827.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/538872.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/53907.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/541315.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/541535.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/54399.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/545014.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/545053.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/549231.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/549841.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/556510.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/559862.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/565980.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/566237.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/567782.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/567963.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/568199.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/572219.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/575546.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/585829.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/588667.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/595504.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/598557.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/605058.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/605681.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/606272.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/606714.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/606902.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/607912.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/611137.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/614508.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/61474.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/615900.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/617347.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/618258.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/619461.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/61957.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/620847.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/621822.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/621891.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/622597.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/62315.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/627918.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/629235.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/630679.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/632206.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/635983.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/636113.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/639462.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/640649.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/643050.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/645091.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/653943.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/654378.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/655191.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/655565.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/655796.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/660190.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/666481.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/668926.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/671183.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/673190.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/674242.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/674978.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/676066.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/676601.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/678688.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/678728.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/683794.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/683973.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/691990.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/695220.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/697370.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/697928.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/699830.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/699986.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/70228.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/702384.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/713051.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/720130.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/721928.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/723721.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/73581.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/737107.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/745084.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/745626.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/74620.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/752081.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/756228.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/75677.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/756825.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/75795.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/758858.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/766548.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/768600.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/769403.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/772630.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/774892.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/775644.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/781885.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/783821.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/790370.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/790812.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/792064.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/803766.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/803807.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/804184.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/814761.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/817853.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/829472.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/839992.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/841002.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/864119.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/867082.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/867394.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/872104.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/877221.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/878117.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/884208.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/884242.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/897379.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/90780.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/91163.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/911743.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/918851.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/92149.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/92453.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/92525.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/935745.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/950161.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/956941.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/958603.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/959535.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/960361.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/964587.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/970268.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/973248.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/976250.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/978346.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/980147.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/986995.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/987081.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/989795.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/989892.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/991077.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/99695.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/998474.jpg \n", + " inflating: food-101/food-101/images/tuna_tartare/99979.jpg \n", + " inflating: food-101/food-101/images/waffles/100242.jpg \n", + " inflating: food-101/food-101/images/waffles/100353.jpg \n", + " inflating: food-101/food-101/images/waffles/1005295.jpg \n", + " inflating: food-101/food-101/images/waffles/1005755.jpg \n", + " inflating: food-101/food-101/images/waffles/1011635.jpg \n", + " inflating: food-101/food-101/images/waffles/1013333.jpg \n", + " inflating: food-101/food-101/images/waffles/1021349.jpg \n", + " inflating: food-101/food-101/images/waffles/1022491.jpg \n", + " inflating: food-101/food-101/images/waffles/102624.jpg \n", + " inflating: food-101/food-101/images/waffles/1028113.jpg \n", + " inflating: food-101/food-101/images/waffles/1028763.jpg \n", + " inflating: food-101/food-101/images/waffles/103151.jpg \n", + " inflating: food-101/food-101/images/waffles/1032468.jpg \n", + " inflating: food-101/food-101/images/waffles/1035338.jpg \n", + " inflating: food-101/food-101/images/waffles/1043451.jpg \n", + " inflating: food-101/food-101/images/waffles/1043579.jpg \n", + " inflating: food-101/food-101/images/waffles/1048577.jpg \n", + " inflating: food-101/food-101/images/waffles/1055825.jpg \n", + " inflating: food-101/food-101/images/waffles/105596.jpg \n", + " inflating: food-101/food-101/images/waffles/1057393.jpg \n", + " inflating: food-101/food-101/images/waffles/1058830.jpg \n", + " inflating: food-101/food-101/images/waffles/1069014.jpg \n", + " inflating: food-101/food-101/images/waffles/1077738.jpg \n", + " inflating: food-101/food-101/images/waffles/1093239.jpg \n", + " inflating: food-101/food-101/images/waffles/1099071.jpg \n", + " inflating: food-101/food-101/images/waffles/1100787.jpg \n", + " inflating: food-101/food-101/images/waffles/1102327.jpg \n", + " inflating: food-101/food-101/images/waffles/1102436.jpg \n", + " inflating: food-101/food-101/images/waffles/1103303.jpg \n", + " inflating: food-101/food-101/images/waffles/110449.jpg \n", + " inflating: food-101/food-101/images/waffles/1105579.jpg \n", + " inflating: food-101/food-101/images/waffles/11088.jpg \n", + " inflating: food-101/food-101/images/waffles/1113046.jpg \n", + " inflating: food-101/food-101/images/waffles/1116460.jpg \n", + " inflating: food-101/food-101/images/waffles/1116896.jpg \n", + " inflating: food-101/food-101/images/waffles/1122499.jpg \n", + " inflating: food-101/food-101/images/waffles/1131681.jpg \n", + " inflating: food-101/food-101/images/waffles/1133731.jpg \n", + " inflating: food-101/food-101/images/waffles/113651.jpg \n", + " inflating: food-101/food-101/images/waffles/113836.jpg \n", + " inflating: food-101/food-101/images/waffles/1141046.jpg \n", + " inflating: food-101/food-101/images/waffles/1143020.jpg \n", + " inflating: food-101/food-101/images/waffles/1143171.jpg \n", + " inflating: food-101/food-101/images/waffles/1145486.jpg \n", + " inflating: food-101/food-101/images/waffles/114592.jpg \n", + " inflating: food-101/food-101/images/waffles/1152335.jpg \n", + " inflating: food-101/food-101/images/waffles/1153365.jpg \n", + " inflating: food-101/food-101/images/waffles/1161643.jpg \n", + " inflating: food-101/food-101/images/waffles/1162057.jpg \n", + " inflating: food-101/food-101/images/waffles/1162601.jpg \n", + " inflating: food-101/food-101/images/waffles/1165059.jpg \n", + " inflating: food-101/food-101/images/waffles/1174687.jpg \n", + " inflating: food-101/food-101/images/waffles/1185489.jpg \n", + " inflating: food-101/food-101/images/waffles/1187888.jpg \n", + " inflating: food-101/food-101/images/waffles/119259.jpg \n", + " inflating: food-101/food-101/images/waffles/1192810.jpg \n", + " inflating: food-101/food-101/images/waffles/119316.jpg \n", + " inflating: food-101/food-101/images/waffles/1195540.jpg \n", + " inflating: food-101/food-101/images/waffles/1196037.jpg \n", + " inflating: food-101/food-101/images/waffles/1203560.jpg \n", + " inflating: food-101/food-101/images/waffles/1215857.jpg \n", + " inflating: food-101/food-101/images/waffles/12160.jpg \n", + " inflating: food-101/food-101/images/waffles/122080.jpg \n", + " inflating: food-101/food-101/images/waffles/1231392.jpg \n", + " inflating: food-101/food-101/images/waffles/1234373.jpg \n", + " inflating: food-101/food-101/images/waffles/1236559.jpg \n", + " inflating: food-101/food-101/images/waffles/1239851.jpg \n", + " inflating: food-101/food-101/images/waffles/1245873.jpg \n", + " inflating: food-101/food-101/images/waffles/1251504.jpg \n", + " inflating: food-101/food-101/images/waffles/125490.jpg \n", + " inflating: food-101/food-101/images/waffles/1256924.jpg \n", + " inflating: food-101/food-101/images/waffles/1260443.jpg \n", + " inflating: food-101/food-101/images/waffles/1265284.jpg \n", + " inflating: food-101/food-101/images/waffles/1266775.jpg \n", + " inflating: food-101/food-101/images/waffles/1272069.jpg \n", + " inflating: food-101/food-101/images/waffles/1277823.jpg \n", + " inflating: food-101/food-101/images/waffles/1281065.jpg \n", + " inflating: food-101/food-101/images/waffles/1286272.jpg \n", + " inflating: food-101/food-101/images/waffles/129067.jpg \n", + " inflating: food-101/food-101/images/waffles/1292363.jpg \n", + " inflating: food-101/food-101/images/waffles/1292687.jpg \n", + " inflating: food-101/food-101/images/waffles/1295297.jpg \n", + " inflating: food-101/food-101/images/waffles/1311578.jpg \n", + " inflating: food-101/food-101/images/waffles/131207.jpg \n", + " inflating: food-101/food-101/images/waffles/1313096.jpg \n", + " inflating: food-101/food-101/images/waffles/1318213.jpg \n", + " inflating: food-101/food-101/images/waffles/1320836.jpg \n", + " inflating: food-101/food-101/images/waffles/1330061.jpg \n", + " inflating: food-101/food-101/images/waffles/1331214.jpg \n", + " inflating: food-101/food-101/images/waffles/1335316.jpg \n", + " inflating: food-101/food-101/images/waffles/1336006.jpg \n", + " inflating: food-101/food-101/images/waffles/1336133.jpg \n", + " inflating: food-101/food-101/images/waffles/1343361.jpg \n", + " inflating: food-101/food-101/images/waffles/1343456.jpg \n", + " inflating: food-101/food-101/images/waffles/1343475.jpg \n", + " inflating: food-101/food-101/images/waffles/1350003.jpg \n", + " inflating: food-101/food-101/images/waffles/1351305.jpg \n", + " inflating: food-101/food-101/images/waffles/1353542.jpg \n", + " inflating: food-101/food-101/images/waffles/1354919.jpg \n", + " inflating: food-101/food-101/images/waffles/1355650.jpg \n", + " inflating: food-101/food-101/images/waffles/1371262.jpg \n", + " inflating: food-101/food-101/images/waffles/1371398.jpg \n", + " inflating: food-101/food-101/images/waffles/1373884.jpg \n", + " inflating: food-101/food-101/images/waffles/1376085.jpg \n", + " inflating: food-101/food-101/images/waffles/1377375.jpg \n", + " inflating: food-101/food-101/images/waffles/1378391.jpg \n", + " inflating: food-101/food-101/images/waffles/1380629.jpg \n", + " inflating: food-101/food-101/images/waffles/138568.jpg \n", + " inflating: food-101/food-101/images/waffles/1386687.jpg \n", + " inflating: food-101/food-101/images/waffles/1390602.jpg \n", + " inflating: food-101/food-101/images/waffles/1395475.jpg \n", + " inflating: food-101/food-101/images/waffles/1395783.jpg \n", + " inflating: food-101/food-101/images/waffles/1397009.jpg \n", + " inflating: food-101/food-101/images/waffles/1397605.jpg \n", + " inflating: food-101/food-101/images/waffles/1400149.jpg \n", + " inflating: food-101/food-101/images/waffles/1406502.jpg \n", + " inflating: food-101/food-101/images/waffles/1408987.jpg \n", + " inflating: food-101/food-101/images/waffles/1411508.jpg \n", + " inflating: food-101/food-101/images/waffles/1414127.jpg \n", + " inflating: food-101/food-101/images/waffles/142556.jpg \n", + " inflating: food-101/food-101/images/waffles/1427986.jpg \n", + " inflating: food-101/food-101/images/waffles/1429769.jpg \n", + " inflating: food-101/food-101/images/waffles/1430889.jpg \n", + " inflating: food-101/food-101/images/waffles/143150.jpg \n", + " inflating: food-101/food-101/images/waffles/1438397.jpg \n", + " inflating: food-101/food-101/images/waffles/144072.jpg \n", + " inflating: food-101/food-101/images/waffles/1444576.jpg \n", + " inflating: food-101/food-101/images/waffles/1451001.jpg \n", + " inflating: food-101/food-101/images/waffles/1452225.jpg \n", + " inflating: food-101/food-101/images/waffles/1459517.jpg \n", + " inflating: food-101/food-101/images/waffles/1462386.jpg \n", + " inflating: food-101/food-101/images/waffles/1465178.jpg \n", + " inflating: food-101/food-101/images/waffles/1478100.jpg \n", + " inflating: food-101/food-101/images/waffles/1479086.jpg \n", + " inflating: food-101/food-101/images/waffles/1483193.jpg \n", + " inflating: food-101/food-101/images/waffles/1484347.jpg \n", + " inflating: food-101/food-101/images/waffles/1486259.jpg \n", + " inflating: food-101/food-101/images/waffles/1488520.jpg \n", + " inflating: food-101/food-101/images/waffles/1497735.jpg \n", + " inflating: food-101/food-101/images/waffles/1499279.jpg \n", + " inflating: food-101/food-101/images/waffles/1509171.jpg \n", + " inflating: food-101/food-101/images/waffles/1511442.jpg \n", + " inflating: food-101/food-101/images/waffles/1514054.jpg \n", + " inflating: food-101/food-101/images/waffles/1515272.jpg \n", + " inflating: food-101/food-101/images/waffles/1519122.jpg \n", + " inflating: food-101/food-101/images/waffles/1520986.jpg \n", + " inflating: food-101/food-101/images/waffles/1522343.jpg \n", + " inflating: food-101/food-101/images/waffles/1526232.jpg \n", + " inflating: food-101/food-101/images/waffles/1527373.jpg \n", + " inflating: food-101/food-101/images/waffles/1527411.jpg \n", + " inflating: food-101/food-101/images/waffles/1528836.jpg \n", + " inflating: food-101/food-101/images/waffles/152985.jpg \n", + " inflating: food-101/food-101/images/waffles/153584.jpg \n", + " inflating: food-101/food-101/images/waffles/1539206.jpg \n", + " inflating: food-101/food-101/images/waffles/1540127.jpg \n", + " inflating: food-101/food-101/images/waffles/1540934.jpg \n", + " inflating: food-101/food-101/images/waffles/1544230.jpg \n", + " inflating: food-101/food-101/images/waffles/1547258.jpg \n", + " inflating: food-101/food-101/images/waffles/1547700.jpg \n", + " inflating: food-101/food-101/images/waffles/1548988.jpg \n", + " inflating: food-101/food-101/images/waffles/155074.jpg \n", + " inflating: food-101/food-101/images/waffles/1553222.jpg \n", + " inflating: food-101/food-101/images/waffles/1554561.jpg \n", + " inflating: food-101/food-101/images/waffles/1554866.jpg \n", + " inflating: food-101/food-101/images/waffles/1561591.jpg \n", + " inflating: food-101/food-101/images/waffles/1564248.jpg \n", + " inflating: food-101/food-101/images/waffles/1569444.jpg \n", + " inflating: food-101/food-101/images/waffles/1571924.jpg \n", + " inflating: food-101/food-101/images/waffles/1572031.jpg \n", + " inflating: food-101/food-101/images/waffles/1576252.jpg \n", + " inflating: food-101/food-101/images/waffles/157640.jpg \n", + " inflating: food-101/food-101/images/waffles/1579691.jpg \n", + " inflating: food-101/food-101/images/waffles/1588674.jpg \n", + " inflating: food-101/food-101/images/waffles/1589594.jpg \n", + " inflating: food-101/food-101/images/waffles/1590090.jpg \n", + " inflating: food-101/food-101/images/waffles/1593140.jpg \n", + " inflating: food-101/food-101/images/waffles/1593164.jpg \n", + " inflating: food-101/food-101/images/waffles/1593451.jpg \n", + " inflating: food-101/food-101/images/waffles/1595187.jpg \n", + " inflating: food-101/food-101/images/waffles/1596095.jpg \n", + " inflating: food-101/food-101/images/waffles/1606698.jpg \n", + " inflating: food-101/food-101/images/waffles/1608606.jpg \n", + " inflating: food-101/food-101/images/waffles/1610272.jpg \n", + " inflating: food-101/food-101/images/waffles/1612477.jpg \n", + " inflating: food-101/food-101/images/waffles/1614753.jpg \n", + " inflating: food-101/food-101/images/waffles/1618732.jpg \n", + " inflating: food-101/food-101/images/waffles/1626804.jpg \n", + " inflating: food-101/food-101/images/waffles/1630772.jpg \n", + " inflating: food-101/food-101/images/waffles/1632416.jpg \n", + " inflating: food-101/food-101/images/waffles/1633847.jpg \n", + " inflating: food-101/food-101/images/waffles/1635793.jpg \n", + " inflating: food-101/food-101/images/waffles/1636688.jpg \n", + " inflating: food-101/food-101/images/waffles/164246.jpg \n", + " inflating: food-101/food-101/images/waffles/1644362.jpg \n", + " inflating: food-101/food-101/images/waffles/1646170.jpg \n", + " inflating: food-101/food-101/images/waffles/1647985.jpg \n", + " inflating: food-101/food-101/images/waffles/1648664.jpg \n", + " inflating: food-101/food-101/images/waffles/1650410.jpg \n", + " inflating: food-101/food-101/images/waffles/1657253.jpg \n", + " inflating: food-101/food-101/images/waffles/1658352.jpg \n", + " inflating: food-101/food-101/images/waffles/1665561.jpg \n", + " inflating: food-101/food-101/images/waffles/1671002.jpg \n", + " inflating: food-101/food-101/images/waffles/1673914.jpg \n", + " inflating: food-101/food-101/images/waffles/1674241.jpg \n", + " inflating: food-101/food-101/images/waffles/1675357.jpg \n", + " inflating: food-101/food-101/images/waffles/1676746.jpg \n", + " inflating: food-101/food-101/images/waffles/1686783.jpg \n", + " inflating: food-101/food-101/images/waffles/1690981.jpg \n", + " inflating: food-101/food-101/images/waffles/169556.jpg \n", + " inflating: food-101/food-101/images/waffles/1696545.jpg \n", + " inflating: food-101/food-101/images/waffles/1696831.jpg \n", + " inflating: food-101/food-101/images/waffles/1697358.jpg \n", + " inflating: food-101/food-101/images/waffles/1697829.jpg \n", + " inflating: food-101/food-101/images/waffles/1698064.jpg \n", + " inflating: food-101/food-101/images/waffles/1698436.jpg \n", + " inflating: food-101/food-101/images/waffles/1700397.jpg \n", + " inflating: food-101/food-101/images/waffles/1702.jpg \n", + " inflating: food-101/food-101/images/waffles/1716836.jpg \n", + " inflating: food-101/food-101/images/waffles/1716839.jpg \n", + " inflating: food-101/food-101/images/waffles/1726447.jpg \n", + " inflating: food-101/food-101/images/waffles/1727803.jpg \n", + " inflating: food-101/food-101/images/waffles/1729046.jpg \n", + " inflating: food-101/food-101/images/waffles/1733518.jpg \n", + " inflating: food-101/food-101/images/waffles/1736006.jpg \n", + " inflating: food-101/food-101/images/waffles/1740550.jpg \n", + " inflating: food-101/food-101/images/waffles/1744371.jpg \n", + " inflating: food-101/food-101/images/waffles/174743.jpg \n", + " inflating: food-101/food-101/images/waffles/1755563.jpg \n", + " inflating: food-101/food-101/images/waffles/1761429.jpg \n", + " inflating: food-101/food-101/images/waffles/1765634.jpg \n", + " inflating: food-101/food-101/images/waffles/1767843.jpg \n", + " inflating: food-101/food-101/images/waffles/1768853.jpg \n", + " inflating: food-101/food-101/images/waffles/1775307.jpg \n", + " inflating: food-101/food-101/images/waffles/177761.jpg \n", + " inflating: food-101/food-101/images/waffles/1778019.jpg \n", + " inflating: food-101/food-101/images/waffles/1782242.jpg \n", + " inflating: food-101/food-101/images/waffles/179004.jpg \n", + " inflating: food-101/food-101/images/waffles/1793231.jpg \n", + " inflating: food-101/food-101/images/waffles/1794708.jpg \n", + " inflating: food-101/food-101/images/waffles/1795723.jpg \n", + " inflating: food-101/food-101/images/waffles/1796206.jpg \n", + " inflating: food-101/food-101/images/waffles/180543.jpg \n", + " inflating: food-101/food-101/images/waffles/1811994.jpg \n", + " inflating: food-101/food-101/images/waffles/1813268.jpg \n", + " inflating: food-101/food-101/images/waffles/1814158.jpg \n", + " inflating: food-101/food-101/images/waffles/1814644.jpg \n", + " inflating: food-101/food-101/images/waffles/1819694.jpg \n", + " inflating: food-101/food-101/images/waffles/1820109.jpg \n", + " inflating: food-101/food-101/images/waffles/1821176.jpg \n", + " inflating: food-101/food-101/images/waffles/182725.jpg \n", + " inflating: food-101/food-101/images/waffles/1830934.jpg \n", + " inflating: food-101/food-101/images/waffles/1839581.jpg \n", + " inflating: food-101/food-101/images/waffles/1843949.jpg \n", + " inflating: food-101/food-101/images/waffles/1845514.jpg \n", + " inflating: food-101/food-101/images/waffles/1845952.jpg \n", + " inflating: food-101/food-101/images/waffles/1852434.jpg \n", + " inflating: food-101/food-101/images/waffles/1852612.jpg \n", + " inflating: food-101/food-101/images/waffles/1854051.jpg \n", + " inflating: food-101/food-101/images/waffles/1854304.jpg \n", + " inflating: food-101/food-101/images/waffles/1859606.jpg \n", + " inflating: food-101/food-101/images/waffles/1860029.jpg \n", + " inflating: food-101/food-101/images/waffles/1862302.jpg \n", + " inflating: food-101/food-101/images/waffles/1865250.jpg \n", + " inflating: food-101/food-101/images/waffles/1870080.jpg \n", + " inflating: food-101/food-101/images/waffles/1874115.jpg \n", + " inflating: food-101/food-101/images/waffles/1875841.jpg \n", + " inflating: food-101/food-101/images/waffles/1878715.jpg \n", + " inflating: food-101/food-101/images/waffles/1881038.jpg \n", + " inflating: food-101/food-101/images/waffles/1881067.jpg \n", + " inflating: food-101/food-101/images/waffles/1884998.jpg \n", + " inflating: food-101/food-101/images/waffles/1887341.jpg \n", + " inflating: food-101/food-101/images/waffles/188830.jpg \n", + " inflating: food-101/food-101/images/waffles/1889533.jpg \n", + " inflating: food-101/food-101/images/waffles/1890328.jpg \n", + " inflating: food-101/food-101/images/waffles/1893599.jpg \n", + " inflating: food-101/food-101/images/waffles/1900405.jpg \n", + " inflating: food-101/food-101/images/waffles/190449.jpg \n", + " inflating: food-101/food-101/images/waffles/1905144.jpg \n", + " inflating: food-101/food-101/images/waffles/1915099.jpg \n", + " inflating: food-101/food-101/images/waffles/1927240.jpg \n", + " inflating: food-101/food-101/images/waffles/1928512.jpg \n", + " inflating: food-101/food-101/images/waffles/1935257.jpg \n", + " inflating: food-101/food-101/images/waffles/1935340.jpg \n", + " inflating: food-101/food-101/images/waffles/194142.jpg \n", + " inflating: food-101/food-101/images/waffles/1941638.jpg \n", + " inflating: food-101/food-101/images/waffles/1942827.jpg \n", + " inflating: food-101/food-101/images/waffles/1943689.jpg \n", + " inflating: food-101/food-101/images/waffles/1950148.jpg \n", + " inflating: food-101/food-101/images/waffles/1950275.jpg \n", + " inflating: food-101/food-101/images/waffles/1950591.jpg \n", + " inflating: food-101/food-101/images/waffles/1950857.jpg \n", + " inflating: food-101/food-101/images/waffles/195779.jpg \n", + " inflating: food-101/food-101/images/waffles/1959366.jpg \n", + " inflating: food-101/food-101/images/waffles/1960003.jpg \n", + " inflating: food-101/food-101/images/waffles/1961724.jpg \n", + " inflating: food-101/food-101/images/waffles/1963280.jpg \n", + " inflating: food-101/food-101/images/waffles/1964332.jpg \n", + " inflating: food-101/food-101/images/waffles/1964936.jpg \n", + " inflating: food-101/food-101/images/waffles/1970884.jpg \n", + " inflating: food-101/food-101/images/waffles/1972123.jpg \n", + " inflating: food-101/food-101/images/waffles/1972144.jpg \n", + " inflating: food-101/food-101/images/waffles/1972595.jpg \n", + " inflating: food-101/food-101/images/waffles/1973030.jpg \n", + " inflating: food-101/food-101/images/waffles/197401.jpg \n", + " inflating: food-101/food-101/images/waffles/1985900.jpg \n", + " inflating: food-101/food-101/images/waffles/198961.jpg \n", + " inflating: food-101/food-101/images/waffles/1997066.jpg \n", + " inflating: food-101/food-101/images/waffles/2002292.jpg \n", + " inflating: food-101/food-101/images/waffles/2006225.jpg \n", + " inflating: food-101/food-101/images/waffles/2008200.jpg \n", + " inflating: food-101/food-101/images/waffles/2022268.jpg \n", + " inflating: food-101/food-101/images/waffles/2023395.jpg \n", + " inflating: food-101/food-101/images/waffles/2025419.jpg \n", + " inflating: food-101/food-101/images/waffles/2028068.jpg \n", + " inflating: food-101/food-101/images/waffles/2036924.jpg \n", + " inflating: food-101/food-101/images/waffles/2037294.jpg \n", + " inflating: food-101/food-101/images/waffles/20378.jpg \n", + " inflating: food-101/food-101/images/waffles/2040739.jpg \n", + " inflating: food-101/food-101/images/waffles/2041508.jpg \n", + " inflating: food-101/food-101/images/waffles/204242.jpg \n", + " inflating: food-101/food-101/images/waffles/2045713.jpg \n", + " inflating: food-101/food-101/images/waffles/2058733.jpg \n", + " inflating: food-101/food-101/images/waffles/2059562.jpg \n", + " inflating: food-101/food-101/images/waffles/2073891.jpg \n", + " inflating: food-101/food-101/images/waffles/2084382.jpg \n", + " inflating: food-101/food-101/images/waffles/2086263.jpg \n", + " inflating: food-101/food-101/images/waffles/2100085.jpg \n", + " inflating: food-101/food-101/images/waffles/2109095.jpg \n", + " inflating: food-101/food-101/images/waffles/211459.jpg \n", + " inflating: food-101/food-101/images/waffles/2115879.jpg \n", + " inflating: food-101/food-101/images/waffles/2121986.jpg \n", + " inflating: food-101/food-101/images/waffles/2129850.jpg \n", + " inflating: food-101/food-101/images/waffles/2131845.jpg \n", + " inflating: food-101/food-101/images/waffles/2135581.jpg \n", + " inflating: food-101/food-101/images/waffles/2136837.jpg \n", + " inflating: food-101/food-101/images/waffles/2137022.jpg \n", + " inflating: food-101/food-101/images/waffles/2138642.jpg \n", + " inflating: food-101/food-101/images/waffles/2138894.jpg \n", + " inflating: food-101/food-101/images/waffles/2139994.jpg \n", + " inflating: food-101/food-101/images/waffles/2144514.jpg \n", + " inflating: food-101/food-101/images/waffles/2145121.jpg \n", + " inflating: food-101/food-101/images/waffles/2148737.jpg \n", + " inflating: food-101/food-101/images/waffles/2149365.jpg \n", + " inflating: food-101/food-101/images/waffles/2154112.jpg \n", + " inflating: food-101/food-101/images/waffles/215480.jpg \n", + " inflating: food-101/food-101/images/waffles/2156898.jpg \n", + " inflating: food-101/food-101/images/waffles/215995.jpg \n", + " inflating: food-101/food-101/images/waffles/2164357.jpg \n", + " inflating: food-101/food-101/images/waffles/2166979.jpg \n", + " inflating: food-101/food-101/images/waffles/2173099.jpg \n", + " inflating: food-101/food-101/images/waffles/2174566.jpg \n", + " inflating: food-101/food-101/images/waffles/2176671.jpg \n", + " inflating: food-101/food-101/images/waffles/2177928.jpg \n", + " inflating: food-101/food-101/images/waffles/2179412.jpg \n", + " inflating: food-101/food-101/images/waffles/2180544.jpg \n", + " inflating: food-101/food-101/images/waffles/2190865.jpg \n", + " inflating: food-101/food-101/images/waffles/2191428.jpg \n", + " inflating: food-101/food-101/images/waffles/219246.jpg \n", + " inflating: food-101/food-101/images/waffles/2197577.jpg \n", + " inflating: food-101/food-101/images/waffles/21998.jpg \n", + " inflating: food-101/food-101/images/waffles/2202881.jpg \n", + " inflating: food-101/food-101/images/waffles/2204808.jpg \n", + " inflating: food-101/food-101/images/waffles/2206406.jpg \n", + " inflating: food-101/food-101/images/waffles/2214590.jpg \n", + " inflating: food-101/food-101/images/waffles/2215668.jpg \n", + " inflating: food-101/food-101/images/waffles/2221456.jpg \n", + " inflating: food-101/food-101/images/waffles/2221629.jpg \n", + " inflating: food-101/food-101/images/waffles/222273.jpg \n", + " inflating: food-101/food-101/images/waffles/2223963.jpg \n", + " inflating: food-101/food-101/images/waffles/2232990.jpg \n", + " inflating: food-101/food-101/images/waffles/2234895.jpg \n", + " inflating: food-101/food-101/images/waffles/223637.jpg \n", + " inflating: food-101/food-101/images/waffles/2236814.jpg \n", + " inflating: food-101/food-101/images/waffles/2241812.jpg \n", + " inflating: food-101/food-101/images/waffles/2248129.jpg \n", + " inflating: food-101/food-101/images/waffles/2257125.jpg \n", + " inflating: food-101/food-101/images/waffles/2267408.jpg \n", + " inflating: food-101/food-101/images/waffles/2279044.jpg \n", + " inflating: food-101/food-101/images/waffles/2283963.jpg \n", + " inflating: food-101/food-101/images/waffles/2285047.jpg \n", + " inflating: food-101/food-101/images/waffles/2292418.jpg \n", + " inflating: food-101/food-101/images/waffles/2292674.jpg \n", + " inflating: food-101/food-101/images/waffles/2294470.jpg \n", + " inflating: food-101/food-101/images/waffles/2297483.jpg \n", + " inflating: food-101/food-101/images/waffles/2298224.jpg \n", + " inflating: food-101/food-101/images/waffles/2298330.jpg \n", + " inflating: food-101/food-101/images/waffles/2301845.jpg \n", + " inflating: food-101/food-101/images/waffles/2302386.jpg \n", + " inflating: food-101/food-101/images/waffles/2303453.jpg \n", + " inflating: food-101/food-101/images/waffles/2305714.jpg \n", + " inflating: food-101/food-101/images/waffles/2310681.jpg \n", + " inflating: food-101/food-101/images/waffles/2314342.jpg \n", + " inflating: food-101/food-101/images/waffles/2317705.jpg \n", + " inflating: food-101/food-101/images/waffles/2321433.jpg \n", + " inflating: food-101/food-101/images/waffles/2323613.jpg \n", + " inflating: food-101/food-101/images/waffles/2333159.jpg \n", + " inflating: food-101/food-101/images/waffles/2334490.jpg \n", + " inflating: food-101/food-101/images/waffles/2336160.jpg \n", + " inflating: food-101/food-101/images/waffles/2342115.jpg \n", + " inflating: food-101/food-101/images/waffles/2351416.jpg \n", + " inflating: food-101/food-101/images/waffles/236252.jpg \n", + " inflating: food-101/food-101/images/waffles/2364175.jpg \n", + " inflating: food-101/food-101/images/waffles/2373598.jpg \n", + " inflating: food-101/food-101/images/waffles/237519.jpg \n", + " inflating: food-101/food-101/images/waffles/2377733.jpg \n", + " inflating: food-101/food-101/images/waffles/238327.jpg \n", + " inflating: food-101/food-101/images/waffles/2389143.jpg \n", + " inflating: food-101/food-101/images/waffles/2390448.jpg \n", + " inflating: food-101/food-101/images/waffles/2392474.jpg \n", + " inflating: food-101/food-101/images/waffles/239469.jpg \n", + " inflating: food-101/food-101/images/waffles/2402418.jpg \n", + " inflating: food-101/food-101/images/waffles/2403939.jpg \n", + " inflating: food-101/food-101/images/waffles/2406514.jpg \n", + " inflating: food-101/food-101/images/waffles/2407258.jpg \n", + " inflating: food-101/food-101/images/waffles/2414969.jpg \n", + " inflating: food-101/food-101/images/waffles/242535.jpg \n", + " inflating: food-101/food-101/images/waffles/2429390.jpg \n", + " inflating: food-101/food-101/images/waffles/2442795.jpg \n", + " inflating: food-101/food-101/images/waffles/2454965.jpg \n", + " inflating: food-101/food-101/images/waffles/2455578.jpg \n", + " inflating: food-101/food-101/images/waffles/245977.jpg \n", + " inflating: food-101/food-101/images/waffles/2466633.jpg \n", + " inflating: food-101/food-101/images/waffles/2466707.jpg \n", + " inflating: food-101/food-101/images/waffles/2470039.jpg \n", + " inflating: food-101/food-101/images/waffles/2475465.jpg \n", + " inflating: food-101/food-101/images/waffles/248394.jpg \n", + " inflating: food-101/food-101/images/waffles/248596.jpg \n", + " inflating: food-101/food-101/images/waffles/2486774.jpg \n", + " inflating: food-101/food-101/images/waffles/248999.jpg \n", + " inflating: food-101/food-101/images/waffles/2491308.jpg \n", + " inflating: food-101/food-101/images/waffles/2492594.jpg \n", + " inflating: food-101/food-101/images/waffles/2492955.jpg \n", + " inflating: food-101/food-101/images/waffles/2493998.jpg \n", + " inflating: food-101/food-101/images/waffles/2494095.jpg \n", + " inflating: food-101/food-101/images/waffles/2496070.jpg \n", + " inflating: food-101/food-101/images/waffles/2497492.jpg \n", + " inflating: food-101/food-101/images/waffles/2500558.jpg \n", + " inflating: food-101/food-101/images/waffles/2501107.jpg \n", + " inflating: food-101/food-101/images/waffles/2504288.jpg \n", + " inflating: food-101/food-101/images/waffles/2508726.jpg \n", + " inflating: food-101/food-101/images/waffles/2520260.jpg \n", + " inflating: food-101/food-101/images/waffles/2522165.jpg \n", + " inflating: food-101/food-101/images/waffles/2525823.jpg \n", + " inflating: food-101/food-101/images/waffles/2527419.jpg \n", + " inflating: food-101/food-101/images/waffles/2527617.jpg \n", + " inflating: food-101/food-101/images/waffles/2530998.jpg \n", + " inflating: food-101/food-101/images/waffles/2531838.jpg \n", + " inflating: food-101/food-101/images/waffles/2534338.jpg \n", + " inflating: food-101/food-101/images/waffles/2534937.jpg \n", + " inflating: food-101/food-101/images/waffles/2539671.jpg \n", + " inflating: food-101/food-101/images/waffles/2541584.jpg \n", + " inflating: food-101/food-101/images/waffles/2542624.jpg \n", + " inflating: food-101/food-101/images/waffles/2544151.jpg \n", + " inflating: food-101/food-101/images/waffles/2547616.jpg \n", + " inflating: food-101/food-101/images/waffles/2551121.jpg \n", + " inflating: food-101/food-101/images/waffles/256352.jpg \n", + " inflating: food-101/food-101/images/waffles/2563859.jpg \n", + " inflating: food-101/food-101/images/waffles/2568091.jpg \n", + " inflating: food-101/food-101/images/waffles/2569188.jpg \n", + " inflating: food-101/food-101/images/waffles/2570033.jpg \n", + " inflating: food-101/food-101/images/waffles/257014.jpg \n", + " inflating: food-101/food-101/images/waffles/2571196.jpg \n", + " inflating: food-101/food-101/images/waffles/2571849.jpg \n", + " inflating: food-101/food-101/images/waffles/257273.jpg \n", + " inflating: food-101/food-101/images/waffles/2575514.jpg \n", + " inflating: food-101/food-101/images/waffles/2579613.jpg \n", + " inflating: food-101/food-101/images/waffles/2580463.jpg \n", + " inflating: food-101/food-101/images/waffles/258099.jpg \n", + " inflating: food-101/food-101/images/waffles/259785.jpg \n", + " inflating: food-101/food-101/images/waffles/2600696.jpg \n", + " inflating: food-101/food-101/images/waffles/2609057.jpg \n", + " inflating: food-101/food-101/images/waffles/2609134.jpg \n", + " inflating: food-101/food-101/images/waffles/2609858.jpg \n", + " inflating: food-101/food-101/images/waffles/2609901.jpg \n", + " inflating: food-101/food-101/images/waffles/2614831.jpg \n", + " inflating: food-101/food-101/images/waffles/2621994.jpg \n", + " inflating: food-101/food-101/images/waffles/262688.jpg \n", + " inflating: food-101/food-101/images/waffles/2629714.jpg \n", + " inflating: food-101/food-101/images/waffles/2635878.jpg \n", + " inflating: food-101/food-101/images/waffles/2637616.jpg \n", + " inflating: food-101/food-101/images/waffles/264638.jpg \n", + " inflating: food-101/food-101/images/waffles/2658047.jpg \n", + " inflating: food-101/food-101/images/waffles/2659330.jpg \n", + " inflating: food-101/food-101/images/waffles/2676468.jpg \n", + " inflating: food-101/food-101/images/waffles/267783.jpg \n", + " inflating: food-101/food-101/images/waffles/2681437.jpg \n", + " inflating: food-101/food-101/images/waffles/2685997.jpg \n", + " inflating: food-101/food-101/images/waffles/2700447.jpg \n", + " inflating: food-101/food-101/images/waffles/2701316.jpg \n", + " inflating: food-101/food-101/images/waffles/270175.jpg \n", + " inflating: food-101/food-101/images/waffles/271146.jpg \n", + " inflating: food-101/food-101/images/waffles/271341.jpg \n", + " inflating: food-101/food-101/images/waffles/2715178.jpg \n", + " inflating: food-101/food-101/images/waffles/2718747.jpg \n", + " inflating: food-101/food-101/images/waffles/2722540.jpg \n", + " inflating: food-101/food-101/images/waffles/272795.jpg \n", + " inflating: food-101/food-101/images/waffles/2739648.jpg \n", + " inflating: food-101/food-101/images/waffles/2748580.jpg \n", + " inflating: food-101/food-101/images/waffles/2755206.jpg \n", + " inflating: food-101/food-101/images/waffles/2760745.jpg \n", + " inflating: food-101/food-101/images/waffles/2777324.jpg \n", + " inflating: food-101/food-101/images/waffles/2779587.jpg \n", + " inflating: food-101/food-101/images/waffles/2781990.jpg \n", + " inflating: food-101/food-101/images/waffles/2783691.jpg \n", + " inflating: food-101/food-101/images/waffles/2786790.jpg \n", + " inflating: food-101/food-101/images/waffles/278953.jpg \n", + " inflating: food-101/food-101/images/waffles/279605.jpg \n", + " inflating: food-101/food-101/images/waffles/280688.jpg \n", + " inflating: food-101/food-101/images/waffles/2810256.jpg \n", + " inflating: food-101/food-101/images/waffles/2810306.jpg \n", + " inflating: food-101/food-101/images/waffles/2825680.jpg \n", + " inflating: food-101/food-101/images/waffles/2827385.jpg \n", + " inflating: food-101/food-101/images/waffles/283190.jpg \n", + " inflating: food-101/food-101/images/waffles/2833351.jpg \n", + " inflating: food-101/food-101/images/waffles/2833565.jpg \n", + " inflating: food-101/food-101/images/waffles/2834278.jpg \n", + " inflating: food-101/food-101/images/waffles/2834849.jpg \n", + " inflating: food-101/food-101/images/waffles/2836089.jpg \n", + " inflating: food-101/food-101/images/waffles/2837551.jpg \n", + " inflating: food-101/food-101/images/waffles/28437.jpg \n", + " inflating: food-101/food-101/images/waffles/2846469.jpg \n", + " inflating: food-101/food-101/images/waffles/2851929.jpg \n", + " inflating: food-101/food-101/images/waffles/2855920.jpg \n", + " inflating: food-101/food-101/images/waffles/2859801.jpg \n", + " inflating: food-101/food-101/images/waffles/2864238.jpg \n", + " inflating: food-101/food-101/images/waffles/286459.jpg \n", + " inflating: food-101/food-101/images/waffles/2868556.jpg \n", + " inflating: food-101/food-101/images/waffles/286912.jpg \n", + " inflating: food-101/food-101/images/waffles/2871136.jpg \n", + " inflating: food-101/food-101/images/waffles/2873703.jpg \n", + " inflating: food-101/food-101/images/waffles/2875227.jpg \n", + " inflating: food-101/food-101/images/waffles/2879036.jpg \n", + " inflating: food-101/food-101/images/waffles/2892763.jpg \n", + " inflating: food-101/food-101/images/waffles/2907823.jpg \n", + " inflating: food-101/food-101/images/waffles/29115.jpg \n", + " inflating: food-101/food-101/images/waffles/29126.jpg \n", + " inflating: food-101/food-101/images/waffles/2913803.jpg \n", + " inflating: food-101/food-101/images/waffles/2923372.jpg \n", + " inflating: food-101/food-101/images/waffles/2927857.jpg \n", + " inflating: food-101/food-101/images/waffles/2930177.jpg \n", + " inflating: food-101/food-101/images/waffles/2934699.jpg \n", + " inflating: food-101/food-101/images/waffles/2940205.jpg \n", + " inflating: food-101/food-101/images/waffles/2940224.jpg \n", + " inflating: food-101/food-101/images/waffles/2944828.jpg \n", + " inflating: food-101/food-101/images/waffles/29488.jpg \n", + " inflating: food-101/food-101/images/waffles/2956296.jpg \n", + " inflating: food-101/food-101/images/waffles/29618.jpg \n", + " inflating: food-101/food-101/images/waffles/2969913.jpg \n", + " inflating: food-101/food-101/images/waffles/2972841.jpg \n", + " inflating: food-101/food-101/images/waffles/2980734.jpg \n", + " inflating: food-101/food-101/images/waffles/2981788.jpg \n", + " inflating: food-101/food-101/images/waffles/2982520.jpg \n", + " inflating: food-101/food-101/images/waffles/2983133.jpg \n", + " inflating: food-101/food-101/images/waffles/29912.jpg \n", + " inflating: food-101/food-101/images/waffles/2992687.jpg \n", + " inflating: food-101/food-101/images/waffles/2993703.jpg \n", + " inflating: food-101/food-101/images/waffles/2996383.jpg \n", + " inflating: food-101/food-101/images/waffles/2999228.jpg \n", + " inflating: food-101/food-101/images/waffles/2999331.jpg \n", + " inflating: food-101/food-101/images/waffles/300274.jpg \n", + " inflating: food-101/food-101/images/waffles/3006524.jpg \n", + " inflating: food-101/food-101/images/waffles/3007734.jpg \n", + " inflating: food-101/food-101/images/waffles/3014576.jpg \n", + " inflating: food-101/food-101/images/waffles/3014777.jpg \n", + " inflating: food-101/food-101/images/waffles/3015633.jpg \n", + " inflating: food-101/food-101/images/waffles/301720.jpg \n", + " inflating: food-101/food-101/images/waffles/301950.jpg \n", + " inflating: food-101/food-101/images/waffles/3026523.jpg \n", + " inflating: food-101/food-101/images/waffles/3027536.jpg \n", + " inflating: food-101/food-101/images/waffles/3029709.jpg \n", + " inflating: food-101/food-101/images/waffles/3030284.jpg \n", + " inflating: food-101/food-101/images/waffles/3032387.jpg \n", + " inflating: food-101/food-101/images/waffles/3034694.jpg \n", + " inflating: food-101/food-101/images/waffles/304137.jpg \n", + " inflating: food-101/food-101/images/waffles/3043682.jpg \n", + " inflating: food-101/food-101/images/waffles/3044407.jpg \n", + " inflating: food-101/food-101/images/waffles/3046012.jpg \n", + " inflating: food-101/food-101/images/waffles/3050537.jpg \n", + " inflating: food-101/food-101/images/waffles/30536.jpg \n", + " inflating: food-101/food-101/images/waffles/3053905.jpg \n", + " inflating: food-101/food-101/images/waffles/305507.jpg \n", + " inflating: food-101/food-101/images/waffles/3057823.jpg \n", + " inflating: food-101/food-101/images/waffles/3057857.jpg \n", + " inflating: food-101/food-101/images/waffles/306036.jpg \n", + " inflating: food-101/food-101/images/waffles/3062041.jpg \n", + " inflating: food-101/food-101/images/waffles/3074426.jpg \n", + " inflating: food-101/food-101/images/waffles/3079563.jpg \n", + " inflating: food-101/food-101/images/waffles/3081538.jpg \n", + " inflating: food-101/food-101/images/waffles/3086867.jpg \n", + " inflating: food-101/food-101/images/waffles/3091708.jpg \n", + " inflating: food-101/food-101/images/waffles/3093783.jpg \n", + " inflating: food-101/food-101/images/waffles/3096264.jpg \n", + " inflating: food-101/food-101/images/waffles/3096817.jpg \n", + " inflating: food-101/food-101/images/waffles/3101937.jpg \n", + " inflating: food-101/food-101/images/waffles/3106010.jpg \n", + " inflating: food-101/food-101/images/waffles/310725.jpg \n", + " inflating: food-101/food-101/images/waffles/3110211.jpg \n", + " inflating: food-101/food-101/images/waffles/3111440.jpg \n", + " inflating: food-101/food-101/images/waffles/3111533.jpg \n", + " inflating: food-101/food-101/images/waffles/311361.jpg \n", + " inflating: food-101/food-101/images/waffles/3121682.jpg \n", + " inflating: food-101/food-101/images/waffles/312739.jpg \n", + " inflating: food-101/food-101/images/waffles/3135867.jpg \n", + " inflating: food-101/food-101/images/waffles/3138.jpg \n", + " inflating: food-101/food-101/images/waffles/314148.jpg \n", + " inflating: food-101/food-101/images/waffles/3145489.jpg \n", + " inflating: food-101/food-101/images/waffles/315203.jpg \n", + " inflating: food-101/food-101/images/waffles/3154295.jpg \n", + " inflating: food-101/food-101/images/waffles/3155252.jpg \n", + " inflating: food-101/food-101/images/waffles/3159868.jpg \n", + " inflating: food-101/food-101/images/waffles/3168479.jpg \n", + " inflating: food-101/food-101/images/waffles/31831.jpg \n", + " inflating: food-101/food-101/images/waffles/3188584.jpg \n", + " inflating: food-101/food-101/images/waffles/3189117.jpg \n", + " inflating: food-101/food-101/images/waffles/3189212.jpg \n", + " inflating: food-101/food-101/images/waffles/3189873.jpg \n", + " inflating: food-101/food-101/images/waffles/319137.jpg \n", + " inflating: food-101/food-101/images/waffles/3192145.jpg \n", + " inflating: food-101/food-101/images/waffles/3192557.jpg \n", + " inflating: food-101/food-101/images/waffles/3195715.jpg \n", + " inflating: food-101/food-101/images/waffles/3195827.jpg \n", + " inflating: food-101/food-101/images/waffles/3197495.jpg \n", + " inflating: food-101/food-101/images/waffles/3201039.jpg \n", + " inflating: food-101/food-101/images/waffles/320124.jpg \n", + " inflating: food-101/food-101/images/waffles/320635.jpg \n", + " inflating: food-101/food-101/images/waffles/3209670.jpg \n", + " inflating: food-101/food-101/images/waffles/3214392.jpg \n", + " inflating: food-101/food-101/images/waffles/3220300.jpg \n", + " inflating: food-101/food-101/images/waffles/3220321.jpg \n", + " inflating: food-101/food-101/images/waffles/3221009.jpg \n", + " inflating: food-101/food-101/images/waffles/322684.jpg \n", + " inflating: food-101/food-101/images/waffles/3231998.jpg \n", + " inflating: food-101/food-101/images/waffles/324323.jpg \n", + " inflating: food-101/food-101/images/waffles/3244892.jpg \n", + " inflating: food-101/food-101/images/waffles/3247543.jpg \n", + " inflating: food-101/food-101/images/waffles/3252811.jpg \n", + " inflating: food-101/food-101/images/waffles/3253353.jpg \n", + " inflating: food-101/food-101/images/waffles/325349.jpg \n", + " inflating: food-101/food-101/images/waffles/3253682.jpg \n", + " inflating: food-101/food-101/images/waffles/3253743.jpg \n", + " inflating: food-101/food-101/images/waffles/3258196.jpg \n", + " inflating: food-101/food-101/images/waffles/3260936.jpg \n", + " inflating: food-101/food-101/images/waffles/3275091.jpg \n", + " inflating: food-101/food-101/images/waffles/3276602.jpg \n", + " inflating: food-101/food-101/images/waffles/3284174.jpg \n", + " inflating: food-101/food-101/images/waffles/3297297.jpg \n", + " inflating: food-101/food-101/images/waffles/3298147.jpg \n", + " inflating: food-101/food-101/images/waffles/3299137.jpg \n", + " inflating: food-101/food-101/images/waffles/3299279.jpg \n", + " inflating: food-101/food-101/images/waffles/3300753.jpg \n", + " inflating: food-101/food-101/images/waffles/3306354.jpg \n", + " inflating: food-101/food-101/images/waffles/3306863.jpg \n", + " inflating: food-101/food-101/images/waffles/3308951.jpg \n", + " inflating: food-101/food-101/images/waffles/3310314.jpg \n", + " inflating: food-101/food-101/images/waffles/331777.jpg \n", + " inflating: food-101/food-101/images/waffles/3322220.jpg \n", + " inflating: food-101/food-101/images/waffles/3322722.jpg \n", + " inflating: food-101/food-101/images/waffles/3324642.jpg \n", + " inflating: food-101/food-101/images/waffles/3327752.jpg \n", + " inflating: food-101/food-101/images/waffles/3344726.jpg \n", + " inflating: food-101/food-101/images/waffles/3346301.jpg \n", + " inflating: food-101/food-101/images/waffles/3348732.jpg \n", + " inflating: food-101/food-101/images/waffles/3350256.jpg \n", + " inflating: food-101/food-101/images/waffles/3352416.jpg \n", + " inflating: food-101/food-101/images/waffles/3356576.jpg \n", + " inflating: food-101/food-101/images/waffles/3359762.jpg \n", + " inflating: food-101/food-101/images/waffles/3366221.jpg \n", + " inflating: food-101/food-101/images/waffles/337193.jpg \n", + " inflating: food-101/food-101/images/waffles/3375443.jpg \n", + " inflating: food-101/food-101/images/waffles/3381018.jpg \n", + " inflating: food-101/food-101/images/waffles/3382502.jpg \n", + " inflating: food-101/food-101/images/waffles/3382752.jpg \n", + " inflating: food-101/food-101/images/waffles/3386841.jpg \n", + " inflating: food-101/food-101/images/waffles/3391711.jpg \n", + " inflating: food-101/food-101/images/waffles/3395343.jpg \n", + " inflating: food-101/food-101/images/waffles/339571.jpg \n", + " inflating: food-101/food-101/images/waffles/339645.jpg \n", + " inflating: food-101/food-101/images/waffles/3396769.jpg \n", + " inflating: food-101/food-101/images/waffles/3399355.jpg \n", + " inflating: food-101/food-101/images/waffles/3402251.jpg \n", + " inflating: food-101/food-101/images/waffles/3402541.jpg \n", + " inflating: food-101/food-101/images/waffles/3408401.jpg \n", + " inflating: food-101/food-101/images/waffles/3408501.jpg \n", + " inflating: food-101/food-101/images/waffles/340922.jpg \n", + " inflating: food-101/food-101/images/waffles/341000.jpg \n", + " inflating: food-101/food-101/images/waffles/341006.jpg \n", + " inflating: food-101/food-101/images/waffles/3413253.jpg \n", + " inflating: food-101/food-101/images/waffles/3416346.jpg \n", + " inflating: food-101/food-101/images/waffles/3419461.jpg \n", + " inflating: food-101/food-101/images/waffles/3420480.jpg \n", + " inflating: food-101/food-101/images/waffles/342167.jpg \n", + " inflating: food-101/food-101/images/waffles/342491.jpg \n", + " inflating: food-101/food-101/images/waffles/3435646.jpg \n", + " inflating: food-101/food-101/images/waffles/3438797.jpg \n", + " inflating: food-101/food-101/images/waffles/3439834.jpg \n", + " inflating: food-101/food-101/images/waffles/3446096.jpg \n", + " inflating: food-101/food-101/images/waffles/3460768.jpg \n", + " inflating: food-101/food-101/images/waffles/3463840.jpg \n", + " inflating: food-101/food-101/images/waffles/3464018.jpg \n", + " inflating: food-101/food-101/images/waffles/3467199.jpg \n", + " inflating: food-101/food-101/images/waffles/3470539.jpg \n", + " inflating: food-101/food-101/images/waffles/347105.jpg \n", + " inflating: food-101/food-101/images/waffles/3483574.jpg \n", + " inflating: food-101/food-101/images/waffles/3487800.jpg \n", + " inflating: food-101/food-101/images/waffles/3490755.jpg \n", + " inflating: food-101/food-101/images/waffles/3491832.jpg \n", + " inflating: food-101/food-101/images/waffles/349936.jpg \n", + " inflating: food-101/food-101/images/waffles/3500900.jpg \n", + " inflating: food-101/food-101/images/waffles/3505188.jpg \n", + " inflating: food-101/food-101/images/waffles/3507514.jpg \n", + " inflating: food-101/food-101/images/waffles/351174.jpg \n", + " inflating: food-101/food-101/images/waffles/3514895.jpg \n", + " inflating: food-101/food-101/images/waffles/351490.jpg \n", + " inflating: food-101/food-101/images/waffles/3518140.jpg \n", + " inflating: food-101/food-101/images/waffles/351972.jpg \n", + " inflating: food-101/food-101/images/waffles/3537561.jpg \n", + " inflating: food-101/food-101/images/waffles/3537728.jpg \n", + " inflating: food-101/food-101/images/waffles/3539.jpg \n", + " inflating: food-101/food-101/images/waffles/3539292.jpg \n", + " inflating: food-101/food-101/images/waffles/3539490.jpg \n", + " inflating: food-101/food-101/images/waffles/3543926.jpg \n", + " inflating: food-101/food-101/images/waffles/3545094.jpg \n", + " inflating: food-101/food-101/images/waffles/3548615.jpg \n", + " inflating: food-101/food-101/images/waffles/35506.jpg \n", + " inflating: food-101/food-101/images/waffles/3554365.jpg \n", + " inflating: food-101/food-101/images/waffles/3563710.jpg \n", + " inflating: food-101/food-101/images/waffles/3568299.jpg \n", + " inflating: food-101/food-101/images/waffles/3568751.jpg \n", + " inflating: food-101/food-101/images/waffles/357132.jpg \n", + " inflating: food-101/food-101/images/waffles/3572362.jpg \n", + " inflating: food-101/food-101/images/waffles/3573134.jpg \n", + " inflating: food-101/food-101/images/waffles/3582015.jpg \n", + " inflating: food-101/food-101/images/waffles/358264.jpg \n", + " inflating: food-101/food-101/images/waffles/358502.jpg \n", + " inflating: food-101/food-101/images/waffles/3590150.jpg \n", + " inflating: food-101/food-101/images/waffles/3598283.jpg \n", + " inflating: food-101/food-101/images/waffles/3604258.jpg \n", + " inflating: food-101/food-101/images/waffles/3610812.jpg \n", + " inflating: food-101/food-101/images/waffles/361476.jpg \n", + " inflating: food-101/food-101/images/waffles/3620548.jpg \n", + " inflating: food-101/food-101/images/waffles/3622195.jpg \n", + " inflating: food-101/food-101/images/waffles/3622628.jpg \n", + " inflating: food-101/food-101/images/waffles/3641894.jpg \n", + " inflating: food-101/food-101/images/waffles/3646191.jpg \n", + " inflating: food-101/food-101/images/waffles/364994.jpg \n", + " inflating: food-101/food-101/images/waffles/3654864.jpg \n", + " inflating: food-101/food-101/images/waffles/3657399.jpg \n", + " inflating: food-101/food-101/images/waffles/366032.jpg \n", + " inflating: food-101/food-101/images/waffles/3662922.jpg \n", + " inflating: food-101/food-101/images/waffles/366460.jpg \n", + " inflating: food-101/food-101/images/waffles/367760.jpg \n", + " inflating: food-101/food-101/images/waffles/3694581.jpg \n", + " inflating: food-101/food-101/images/waffles/3694584.jpg \n", + " inflating: food-101/food-101/images/waffles/3696113.jpg \n", + " inflating: food-101/food-101/images/waffles/371514.jpg \n", + " inflating: food-101/food-101/images/waffles/3718117.jpg \n", + " inflating: food-101/food-101/images/waffles/3727063.jpg \n", + " inflating: food-101/food-101/images/waffles/3729576.jpg \n", + " inflating: food-101/food-101/images/waffles/3731391.jpg \n", + " inflating: food-101/food-101/images/waffles/3732820.jpg \n", + " inflating: food-101/food-101/images/waffles/3744327.jpg \n", + " inflating: food-101/food-101/images/waffles/3747795.jpg \n", + " inflating: food-101/food-101/images/waffles/3749640.jpg \n", + " inflating: food-101/food-101/images/waffles/3752380.jpg \n", + " inflating: food-101/food-101/images/waffles/3753793.jpg \n", + " inflating: food-101/food-101/images/waffles/3756482.jpg \n", + " inflating: food-101/food-101/images/waffles/376531.jpg \n", + " inflating: food-101/food-101/images/waffles/3773199.jpg \n", + " inflating: food-101/food-101/images/waffles/3785474.jpg \n", + " inflating: food-101/food-101/images/waffles/379349.jpg \n", + " inflating: food-101/food-101/images/waffles/3797591.jpg \n", + " inflating: food-101/food-101/images/waffles/3798963.jpg \n", + " inflating: food-101/food-101/images/waffles/3802231.jpg \n", + " inflating: food-101/food-101/images/waffles/3805564.jpg \n", + " inflating: food-101/food-101/images/waffles/380699.jpg \n", + " inflating: food-101/food-101/images/waffles/3808328.jpg \n", + " inflating: food-101/food-101/images/waffles/3815296.jpg \n", + " inflating: food-101/food-101/images/waffles/3817783.jpg \n", + " inflating: food-101/food-101/images/waffles/3820519.jpg \n", + " inflating: food-101/food-101/images/waffles/38216.jpg \n", + " inflating: food-101/food-101/images/waffles/3829863.jpg \n", + " inflating: food-101/food-101/images/waffles/3834504.jpg \n", + " inflating: food-101/food-101/images/waffles/3844038.jpg \n", + " inflating: food-101/food-101/images/waffles/3844515.jpg \n", + " inflating: food-101/food-101/images/waffles/3851289.jpg \n", + " inflating: food-101/food-101/images/waffles/3852270.jpg \n", + " inflating: food-101/food-101/images/waffles/3854229.jpg \n", + " inflating: food-101/food-101/images/waffles/3854733.jpg \n", + " inflating: food-101/food-101/images/waffles/3855881.jpg \n", + " inflating: food-101/food-101/images/waffles/3856612.jpg \n", + " inflating: food-101/food-101/images/waffles/3868329.jpg \n", + " inflating: food-101/food-101/images/waffles/3872190.jpg \n", + " inflating: food-101/food-101/images/waffles/387404.jpg \n", + " inflating: food-101/food-101/images/waffles/3874993.jpg \n", + " inflating: food-101/food-101/images/waffles/388077.jpg \n", + " inflating: food-101/food-101/images/waffles/3888417.jpg \n", + " inflating: food-101/food-101/images/waffles/389675.jpg \n", + " inflating: food-101/food-101/images/waffles/3918255.jpg \n", + " inflating: food-101/food-101/images/waffles/3918417.jpg \n", + " inflating: food-101/food-101/images/waffles/3919789.jpg \n", + " inflating: food-101/food-101/images/waffles/3922711.jpg \n", + " inflating: food-101/food-101/images/waffles/393609.jpg \n", + " inflating: food-101/food-101/images/waffles/394203.jpg \n", + " inflating: food-101/food-101/images/waffles/395442.jpg \n", + " inflating: food-101/food-101/images/waffles/396649.jpg \n", + " inflating: food-101/food-101/images/waffles/397619.jpg \n", + " inflating: food-101/food-101/images/waffles/401374.jpg \n", + " inflating: food-101/food-101/images/waffles/401476.jpg \n", + " inflating: food-101/food-101/images/waffles/41942.jpg \n", + " inflating: food-101/food-101/images/waffles/422863.jpg \n", + " inflating: food-101/food-101/images/waffles/424024.jpg \n", + " inflating: food-101/food-101/images/waffles/43069.jpg \n", + " inflating: food-101/food-101/images/waffles/435303.jpg \n", + " inflating: food-101/food-101/images/waffles/435805.jpg \n", + " inflating: food-101/food-101/images/waffles/438277.jpg \n", + " inflating: food-101/food-101/images/waffles/439439.jpg \n", + " inflating: food-101/food-101/images/waffles/440320.jpg \n", + " inflating: food-101/food-101/images/waffles/441550.jpg \n", + " inflating: food-101/food-101/images/waffles/44343.jpg \n", + " inflating: food-101/food-101/images/waffles/446057.jpg \n", + " inflating: food-101/food-101/images/waffles/449316.jpg \n", + " inflating: food-101/food-101/images/waffles/452045.jpg \n", + " inflating: food-101/food-101/images/waffles/452670.jpg \n", + " inflating: food-101/food-101/images/waffles/454960.jpg \n", + " inflating: food-101/food-101/images/waffles/463896.jpg \n", + " inflating: food-101/food-101/images/waffles/472323.jpg \n", + " inflating: food-101/food-101/images/waffles/473392.jpg \n", + " inflating: food-101/food-101/images/waffles/477226.jpg \n", + " inflating: food-101/food-101/images/waffles/490259.jpg \n", + " inflating: food-101/food-101/images/waffles/493293.jpg \n", + " inflating: food-101/food-101/images/waffles/495037.jpg \n", + " inflating: food-101/food-101/images/waffles/496688.jpg \n", + " inflating: food-101/food-101/images/waffles/497819.jpg \n", + " inflating: food-101/food-101/images/waffles/498671.jpg \n", + " inflating: food-101/food-101/images/waffles/501902.jpg \n", + " inflating: food-101/food-101/images/waffles/502002.jpg \n", + " inflating: food-101/food-101/images/waffles/503034.jpg \n", + " inflating: food-101/food-101/images/waffles/503640.jpg \n", + " inflating: food-101/food-101/images/waffles/504879.jpg \n", + " inflating: food-101/food-101/images/waffles/505879.jpg \n", + " inflating: food-101/food-101/images/waffles/520709.jpg \n", + " inflating: food-101/food-101/images/waffles/520878.jpg \n", + " inflating: food-101/food-101/images/waffles/523025.jpg \n", + " inflating: food-101/food-101/images/waffles/526783.jpg \n", + " inflating: food-101/food-101/images/waffles/531515.jpg \n", + " inflating: food-101/food-101/images/waffles/538315.jpg \n", + " inflating: food-101/food-101/images/waffles/540286.jpg \n", + " inflating: food-101/food-101/images/waffles/544250.jpg \n", + " inflating: food-101/food-101/images/waffles/546550.jpg \n", + " inflating: food-101/food-101/images/waffles/549187.jpg \n", + " inflating: food-101/food-101/images/waffles/55093.jpg \n", + " inflating: food-101/food-101/images/waffles/55114.jpg \n", + " inflating: food-101/food-101/images/waffles/551174.jpg \n", + " inflating: food-101/food-101/images/waffles/551528.jpg \n", + " inflating: food-101/food-101/images/waffles/554969.jpg \n", + " inflating: food-101/food-101/images/waffles/555374.jpg \n", + " inflating: food-101/food-101/images/waffles/556999.jpg \n", + " inflating: food-101/food-101/images/waffles/55947.jpg \n", + " inflating: food-101/food-101/images/waffles/562070.jpg \n", + " inflating: food-101/food-101/images/waffles/570148.jpg \n", + " inflating: food-101/food-101/images/waffles/571864.jpg \n", + " inflating: food-101/food-101/images/waffles/572148.jpg \n", + " inflating: food-101/food-101/images/waffles/57325.jpg \n", + " inflating: food-101/food-101/images/waffles/57352.jpg \n", + " inflating: food-101/food-101/images/waffles/581193.jpg \n", + " inflating: food-101/food-101/images/waffles/584201.jpg \n", + " inflating: food-101/food-101/images/waffles/59277.jpg \n", + " inflating: food-101/food-101/images/waffles/602347.jpg \n", + " inflating: food-101/food-101/images/waffles/60308.jpg \n", + " inflating: food-101/food-101/images/waffles/613189.jpg \n", + " inflating: food-101/food-101/images/waffles/61894.jpg \n", + " inflating: food-101/food-101/images/waffles/619726.jpg \n", + " inflating: food-101/food-101/images/waffles/629226.jpg \n", + " inflating: food-101/food-101/images/waffles/629359.jpg \n", + " inflating: food-101/food-101/images/waffles/629565.jpg \n", + " inflating: food-101/food-101/images/waffles/6312.jpg \n", + " inflating: food-101/food-101/images/waffles/632573.jpg \n", + " inflating: food-101/food-101/images/waffles/635997.jpg \n", + " inflating: food-101/food-101/images/waffles/644386.jpg \n", + " inflating: food-101/food-101/images/waffles/647838.jpg \n", + " inflating: food-101/food-101/images/waffles/648890.jpg \n", + " inflating: food-101/food-101/images/waffles/653680.jpg \n", + " inflating: food-101/food-101/images/waffles/654779.jpg \n", + " inflating: food-101/food-101/images/waffles/655334.jpg \n", + " inflating: food-101/food-101/images/waffles/656673.jpg \n", + " inflating: food-101/food-101/images/waffles/6603.jpg \n", + " inflating: food-101/food-101/images/waffles/660921.jpg \n", + " inflating: food-101/food-101/images/waffles/661951.jpg \n", + " inflating: food-101/food-101/images/waffles/662163.jpg \n", + " inflating: food-101/food-101/images/waffles/665287.jpg \n", + " inflating: food-101/food-101/images/waffles/667162.jpg \n", + " inflating: food-101/food-101/images/waffles/675917.jpg \n", + " inflating: food-101/food-101/images/waffles/677805.jpg \n", + " inflating: food-101/food-101/images/waffles/678288.jpg \n", + " inflating: food-101/food-101/images/waffles/683460.jpg \n", + " inflating: food-101/food-101/images/waffles/688126.jpg \n", + " inflating: food-101/food-101/images/waffles/70789.jpg \n", + " inflating: food-101/food-101/images/waffles/708688.jpg \n", + " inflating: food-101/food-101/images/waffles/712973.jpg \n", + " inflating: food-101/food-101/images/waffles/71341.jpg \n", + " inflating: food-101/food-101/images/waffles/720603.jpg \n", + " inflating: food-101/food-101/images/waffles/723066.jpg \n", + " inflating: food-101/food-101/images/waffles/726245.jpg \n", + " inflating: food-101/food-101/images/waffles/731632.jpg \n", + " inflating: food-101/food-101/images/waffles/734196.jpg \n", + " inflating: food-101/food-101/images/waffles/734861.jpg \n", + " inflating: food-101/food-101/images/waffles/737503.jpg \n", + " inflating: food-101/food-101/images/waffles/737611.jpg \n", + " inflating: food-101/food-101/images/waffles/74327.jpg \n", + " inflating: food-101/food-101/images/waffles/743722.jpg \n", + " inflating: food-101/food-101/images/waffles/750964.jpg \n", + " inflating: food-101/food-101/images/waffles/753739.jpg \n", + " inflating: food-101/food-101/images/waffles/757194.jpg \n", + " inflating: food-101/food-101/images/waffles/758030.jpg \n", + " inflating: food-101/food-101/images/waffles/761505.jpg \n", + " inflating: food-101/food-101/images/waffles/76239.jpg \n", + " inflating: food-101/food-101/images/waffles/762877.jpg \n", + " inflating: food-101/food-101/images/waffles/764669.jpg \n", + " inflating: food-101/food-101/images/waffles/764801.jpg \n", + " inflating: food-101/food-101/images/waffles/768177.jpg \n", + " inflating: food-101/food-101/images/waffles/770301.jpg \n", + " inflating: food-101/food-101/images/waffles/771512.jpg \n", + " inflating: food-101/food-101/images/waffles/774743.jpg \n", + " inflating: food-101/food-101/images/waffles/777619.jpg \n", + " inflating: food-101/food-101/images/waffles/77990.jpg \n", + " inflating: food-101/food-101/images/waffles/78000.jpg \n", + " inflating: food-101/food-101/images/waffles/787217.jpg \n", + " inflating: food-101/food-101/images/waffles/789765.jpg \n", + " inflating: food-101/food-101/images/waffles/789971.jpg \n", + " inflating: food-101/food-101/images/waffles/792165.jpg \n", + " inflating: food-101/food-101/images/waffles/795262.jpg \n", + " inflating: food-101/food-101/images/waffles/797266.jpg \n", + " inflating: food-101/food-101/images/waffles/800242.jpg \n", + " inflating: food-101/food-101/images/waffles/805673.jpg \n", + " inflating: food-101/food-101/images/waffles/806461.jpg \n", + " inflating: food-101/food-101/images/waffles/813210.jpg \n", + " inflating: food-101/food-101/images/waffles/815135.jpg \n", + " inflating: food-101/food-101/images/waffles/818491.jpg \n", + " inflating: food-101/food-101/images/waffles/819721.jpg \n", + " inflating: food-101/food-101/images/waffles/82242.jpg \n", + " inflating: food-101/food-101/images/waffles/824478.jpg \n", + " inflating: food-101/food-101/images/waffles/825476.jpg \n", + " inflating: food-101/food-101/images/waffles/825982.jpg \n", + " inflating: food-101/food-101/images/waffles/831385.jpg \n", + " inflating: food-101/food-101/images/waffles/831714.jpg \n", + " inflating: food-101/food-101/images/waffles/839029.jpg \n", + " inflating: food-101/food-101/images/waffles/839545.jpg \n", + " inflating: food-101/food-101/images/waffles/840630.jpg \n", + " inflating: food-101/food-101/images/waffles/843836.jpg \n", + " inflating: food-101/food-101/images/waffles/846838.jpg \n", + " inflating: food-101/food-101/images/waffles/855973.jpg \n", + " inflating: food-101/food-101/images/waffles/863723.jpg \n", + " inflating: food-101/food-101/images/waffles/867262.jpg \n", + " inflating: food-101/food-101/images/waffles/867682.jpg \n", + " inflating: food-101/food-101/images/waffles/869731.jpg \n", + " inflating: food-101/food-101/images/waffles/87930.jpg \n", + " inflating: food-101/food-101/images/waffles/883673.jpg \n", + " inflating: food-101/food-101/images/waffles/885452.jpg \n", + " inflating: food-101/food-101/images/waffles/88648.jpg \n", + " inflating: food-101/food-101/images/waffles/888311.jpg \n", + " inflating: food-101/food-101/images/waffles/888907.jpg \n", + " inflating: food-101/food-101/images/waffles/896011.jpg \n", + " inflating: food-101/food-101/images/waffles/899285.jpg \n", + " inflating: food-101/food-101/images/waffles/899761.jpg \n", + " inflating: food-101/food-101/images/waffles/901094.jpg \n", + " inflating: food-101/food-101/images/waffles/901565.jpg \n", + " inflating: food-101/food-101/images/waffles/902643.jpg \n", + " inflating: food-101/food-101/images/waffles/903293.jpg \n", + " inflating: food-101/food-101/images/waffles/903753.jpg \n", + " inflating: food-101/food-101/images/waffles/905007.jpg \n", + " inflating: food-101/food-101/images/waffles/908565.jpg \n", + " inflating: food-101/food-101/images/waffles/910563.jpg \n", + " inflating: food-101/food-101/images/waffles/913086.jpg \n", + " inflating: food-101/food-101/images/waffles/919275.jpg \n", + " inflating: food-101/food-101/images/waffles/923472.jpg \n", + " inflating: food-101/food-101/images/waffles/928557.jpg \n", + " inflating: food-101/food-101/images/waffles/932850.jpg \n", + " inflating: food-101/food-101/images/waffles/940186.jpg \n", + " inflating: food-101/food-101/images/waffles/942009.jpg \n", + " inflating: food-101/food-101/images/waffles/945920.jpg \n", + " inflating: food-101/food-101/images/waffles/948659.jpg \n", + " inflating: food-101/food-101/images/waffles/948929.jpg \n", + " inflating: food-101/food-101/images/waffles/950926.jpg \n", + " inflating: food-101/food-101/images/waffles/951093.jpg \n", + " inflating: food-101/food-101/images/waffles/954028.jpg \n", + " inflating: food-101/food-101/images/waffles/957965.jpg \n", + " inflating: food-101/food-101/images/waffles/959230.jpg \n", + " inflating: food-101/food-101/images/waffles/961486.jpg \n", + " inflating: food-101/food-101/images/waffles/96181.jpg \n", + " inflating: food-101/food-101/images/waffles/97015.jpg \n", + " inflating: food-101/food-101/images/waffles/971843.jpg \n", + " inflating: food-101/food-101/images/waffles/97524.jpg \n", + " inflating: food-101/food-101/images/waffles/97567.jpg \n", + " inflating: food-101/food-101/images/waffles/978448.jpg \n", + " inflating: food-101/food-101/images/waffles/98131.jpg \n", + " inflating: food-101/food-101/images/waffles/981485.jpg \n", + " inflating: food-101/food-101/images/waffles/98238.jpg \n", + " inflating: food-101/food-101/images/waffles/982668.jpg \n", + " inflating: food-101/food-101/images/waffles/995085.jpg \n", + " inflating: food-101/food-101/images/waffles/999047.jpg \n", + " inflating: food-101/food-101/license_agreement.txt \n", + " inflating: food-101/food-101/meta/classes.txt \n", + " inflating: food-101/food-101/meta/labels.txt \n", + " inflating: food-101/food-101/meta/test.json \n", + " inflating: food-101/food-101/meta/test.txt \n", + " inflating: food-101/food-101/meta/train.json \n", + " inflating: food-101/food-101/meta/train.txt \n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-Nzj11ms3Q6u", + "colab_type": "text" + }, + "source": [ + "## Install packages\n", + "We have to install some extra packages" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "DYyE9YRS3WyX", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "18d39b1c-6d70-409c-8d24-714a7a62da43" + }, + "source": [ + "!pip install albumentations==0.4.6 pytorch-lightning==0.9.0" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Collecting albumentations==0.4.6\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/92/33/1c459c2c9a4028ec75527eff88bc4e2d256555189f42af4baf4d7bd89233/albumentations-0.4.6.tar.gz (117kB)\n", + "\u001b[K |████████████████████████████████| 122kB 6.8MB/s \n", + "\u001b[?25hCollecting pytorch-lightning==0.9.0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/ed/af/2f10c8ee22d7a05fe8c9be58ad5c55b71ab4dd895b44f0156bfd5535a708/pytorch_lightning-0.9.0-py3-none-any.whl (408kB)\n", + "\u001b[K |████████████████████████████████| 409kB 13.0MB/s \n", + "\u001b[?25hRequirement already satisfied: numpy>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from albumentations==0.4.6) (1.18.5)\n", + "Requirement already satisfied: scipy in /usr/local/lib/python3.6/dist-packages (from albumentations==0.4.6) (1.4.1)\n", + "Collecting imgaug>=0.4.0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/66/b1/af3142c4a85cba6da9f4ebb5ff4e21e2616309552caca5e8acefe9840622/imgaug-0.4.0-py2.py3-none-any.whl (948kB)\n", + "\u001b[K |████████████████████████████████| 952kB 17.7MB/s \n", + "\u001b[?25hRequirement already satisfied: PyYAML in /usr/local/lib/python3.6/dist-packages (from albumentations==0.4.6) (3.13)\n", + "Requirement already satisfied: opencv-python>=4.1.1 in /usr/local/lib/python3.6/dist-packages (from albumentations==0.4.6) (4.1.2.30)\n", + "Collecting future>=0.17.1\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/45/0b/38b06fd9b92dc2b68d58b75f900e97884c45bedd2ff83203d933cf5851c9/future-0.18.2.tar.gz (829kB)\n", + "\u001b[K |████████████████████████████████| 829kB 34.0MB/s \n", + "\u001b[?25hCollecting tensorboard==2.2.0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/54/f5/d75a6f7935e4a4870d85770bc9976b12e7024fbceb83a1a6bc50e6deb7c4/tensorboard-2.2.0-py3-none-any.whl (2.8MB)\n", + "\u001b[K |████████████████████████████████| 2.8MB 37.0MB/s \n", + "\u001b[?25hRequirement already satisfied: packaging in /usr/local/lib/python3.6/dist-packages (from pytorch-lightning==0.9.0) (20.4)\n", + "Requirement already satisfied: torch>=1.3 in /usr/local/lib/python3.6/dist-packages (from pytorch-lightning==0.9.0) (1.6.0+cu101)\n", + "Requirement already satisfied: tqdm>=4.41.0 in /usr/local/lib/python3.6/dist-packages (from pytorch-lightning==0.9.0) (4.41.1)\n", + "Requirement already satisfied: Shapely in /usr/local/lib/python3.6/dist-packages (from imgaug>=0.4.0->albumentations==0.4.6) (1.7.1)\n", + "Requirement already satisfied: scikit-image>=0.14.2 in /usr/local/lib/python3.6/dist-packages (from imgaug>=0.4.0->albumentations==0.4.6) (0.16.2)\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from imgaug>=0.4.0->albumentations==0.4.6) (3.2.2)\n", + "Requirement already satisfied: Pillow in /usr/local/lib/python3.6/dist-packages (from imgaug>=0.4.0->albumentations==0.4.6) (7.0.0)\n", + "Requirement already satisfied: imageio in /usr/local/lib/python3.6/dist-packages (from imgaug>=0.4.0->albumentations==0.4.6) (2.4.1)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from imgaug>=0.4.0->albumentations==0.4.6) (1.15.0)\n", + "Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorboard==2.2.0->pytorch-lightning==0.9.0) (3.12.4)\n", + "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.6/dist-packages (from tensorboard==2.2.0->pytorch-lightning==0.9.0) (0.4.1)\n", + "Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.6/dist-packages (from tensorboard==2.2.0->pytorch-lightning==0.9.0) (2.23.0)\n", + "Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from tensorboard==2.2.0->pytorch-lightning==0.9.0) (0.35.1)\n", + "Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.6/dist-packages (from tensorboard==2.2.0->pytorch-lightning==0.9.0) (49.6.0)\n", + "Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.6/dist-packages (from tensorboard==2.2.0->pytorch-lightning==0.9.0) (0.8.1)\n", + "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard==2.2.0->pytorch-lightning==0.9.0) (3.2.2)\n", + "Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.6/dist-packages (from tensorboard==2.2.0->pytorch-lightning==0.9.0) (1.17.2)\n", + "Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.6/dist-packages (from tensorboard==2.2.0->pytorch-lightning==0.9.0) (1.31.0)\n", + "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorboard==2.2.0->pytorch-lightning==0.9.0) (1.7.0)\n", + "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tensorboard==2.2.0->pytorch-lightning==0.9.0) (1.0.1)\n", + "Requirement already satisfied: pyparsing>=2.0.2 in /usr/local/lib/python3.6/dist-packages (from packaging->pytorch-lightning==0.9.0) (2.4.7)\n", + "Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image>=0.14.2->imgaug>=0.4.0->albumentations==0.4.6) (1.1.1)\n", + "Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image>=0.14.2->imgaug>=0.4.0->albumentations==0.4.6) (2.5)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->imgaug>=0.4.0->albumentations==0.4.6) (1.2.0)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->imgaug>=0.4.0->albumentations==0.4.6) (2.8.1)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->imgaug>=0.4.0->albumentations==0.4.6) (0.10.0)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard==2.2.0->pytorch-lightning==0.9.0) (1.3.0)\n", + "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.21.0->tensorboard==2.2.0->pytorch-lightning==0.9.0) (1.24.3)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.21.0->tensorboard==2.2.0->pytorch-lightning==0.9.0) (2020.6.20)\n", + "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.21.0->tensorboard==2.2.0->pytorch-lightning==0.9.0) (3.0.4)\n", + "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.21.0->tensorboard==2.2.0->pytorch-lightning==0.9.0) (2.10)\n", + "Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.6/dist-packages (from markdown>=2.6.8->tensorboard==2.2.0->pytorch-lightning==0.9.0) (1.7.0)\n", + "Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard==2.2.0->pytorch-lightning==0.9.0) (4.6)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard==2.2.0->pytorch-lightning==0.9.0) (0.2.8)\n", + "Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard==2.2.0->pytorch-lightning==0.9.0) (4.1.1)\n", + "Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from networkx>=2.0->scikit-image>=0.14.2->imgaug>=0.4.0->albumentations==0.4.6) (4.4.2)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard==2.2.0->pytorch-lightning==0.9.0) (3.1.0)\n", + "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.6/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard==2.2.0->pytorch-lightning==0.9.0) (3.1.0)\n", + "Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.6/dist-packages (from rsa<5,>=3.1.4; python_version >= \"3\"->google-auth<2,>=1.6.3->tensorboard==2.2.0->pytorch-lightning==0.9.0) (0.4.8)\n", + "Building wheels for collected packages: albumentations, future\n", + " Building wheel for albumentations (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for albumentations: filename=albumentations-0.4.6-cp36-none-any.whl size=65165 sha256=f1388831849e604f28cb0146b55d6559321fe07aaaf29c4b91b22c35cd78cfb2\n", + " Stored in directory: /root/.cache/pip/wheels/c7/f4/89/56d1bee5c421c36c1a951eeb4adcc32fbb82f5344c086efa14\n", + " Building wheel for future (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for future: filename=future-0.18.2-cp36-none-any.whl size=491057 sha256=8b2136a49af61543a856d1bac301d381ac95d24aa39c098401fea0f0d1280cde\n", + " Stored in directory: /root/.cache/pip/wheels/8b/99/a0/81daf51dcd359a9377b110a8a886b3895921802d2fc1b2397e\n", + "Successfully built albumentations future\n", + "\u001b[31mERROR: tensorflow 2.3.0 has requirement tensorboard<3,>=2.3.0, but you'll have tensorboard 2.2.0 which is incompatible.\u001b[0m\n", + "\u001b[31mERROR: pytorch-lightning 0.9.0 has requirement PyYAML>=5.1, but you'll have pyyaml 3.13 which is incompatible.\u001b[0m\n", + "Installing collected packages: imgaug, albumentations, future, tensorboard, pytorch-lightning\n", + " Found existing installation: imgaug 0.2.9\n", + " Uninstalling imgaug-0.2.9:\n", + " Successfully uninstalled imgaug-0.2.9\n", + " Found existing installation: albumentations 0.1.12\n", + " Uninstalling albumentations-0.1.12:\n", + " Successfully uninstalled albumentations-0.1.12\n", + " Found existing installation: future 0.16.0\n", + " Uninstalling future-0.16.0:\n", + " Successfully uninstalled future-0.16.0\n", + " Found existing installation: tensorboard 2.3.0\n", + " Uninstalling tensorboard-2.3.0:\n", + " Successfully uninstalled tensorboard-2.3.0\n", + "Successfully installed albumentations-0.4.6 future-0.18.2 imgaug-0.4.0 pytorch-lightning-0.9.0 tensorboard-2.2.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pSItNGiUqCfn", + "colab_type": "text" + }, + "source": [ + "## Dataset Preparation\n", + "\n", + "We are going to take 21 classes from the dataset. To split the dataset run the code below:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "K1fCM33tqOXs", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 116, + "referenced_widgets": [ + "a309c376716f467083b9e235ce5ac786", + "f5b9114e102f4dafb5a650942d07e001", + "65357848a4f2413aa09502e4b5827bbb", + "24bac64eeee147d9ae2533fc923f8bd8", + "f61997cd973f4d57b3e6de3a294d0c14", + "cfa9f77355224187be118e6bd7917ad2", + "e9e13a09b33f4e24961dc9989bd695b6", + "310243d71d9c4b16bee1be5bb3628e1c", + "74c39deb82ad4d42b35a36b4c8de30a9", + "5b085c03bff84edf9e2bd61e4d674f13", + "f589ad7fc73f42508e7284bda8540bfc", + "dbe6097914ac4c8fafc3e2af66a7dc03", + "5da7cd2a45834b0ab0616bd94bff4a62", + "7279f1b86f144d5983bdf1afaaf03ecb", + "69d54beda9ed4562a27c075465e474b2", + "5afb9ebc9c0748a5b9460e3df8bcc177" + ] + }, + "outputId": "c78c6013-e6fe-4841-8651-889d88a0e9ab" + }, + "source": [ + "import os.path as osp\n", + "from shutil import copyfile\n", + "from tqdm.notebook import tqdm\n", + "\n", + "classes = [\n", + " \"apple_pie\",\n", + " \"bruschetta\",\n", + " \"caesar_salad\",\n", + " \"steak\",\n", + " \"spring_rolls\",\n", + " \"spaghetti_carbonara\",\n", + " \"frozen_yogurt\",\n", + " \"falafel\",\n", + " \"mussels\",\n", + " \"ramen\",\n", + " \"onion_rings\",\n", + " \"oysters\",\n", + " \"risotto\",\n", + " \"waffles\",\n", + " \"cup_cakes\",\n", + " \"grilled_cheese_sandwich\",\n", + " \"fried_calamari\",\n", + " \"huevos_rancheros\",\n", + " \"croque_madame\",\n", + " \"bread_pudding\",\n", + " \"dumplings\",\n", + "]\n", + "data_root = '/content/food-101/food-101'\n", + "assert osp.isdir(data_root)\n", + "assert \"images\" in os.listdir(data_root)\n", + "assert \"meta\" in os.listdir(data_root)\n", + "os.makedirs(osp.join(data_root, \"train\"), exist_ok=True)\n", + "os.makedirs(osp.join(data_root, \"test\"), exist_ok=True)\n", + "for cls_name in classes:\n", + " os.makedirs(osp.join(data_root, \"train\", cls_name), exist_ok=True)\n", + " os.makedirs(osp.join(data_root, \"test\", cls_name), exist_ok=True)\n", + "with open(osp.join(data_root, \"meta\", \"train.txt\"), \"r\") as file:\n", + " for image in tqdm(file):\n", + " image = image.rstrip()\n", + " if image.split(\"/\")[0] in classes:\n", + " copyfile(\n", + " osp.join(data_root, \"images\", image + \".jpg\"),\n", + " osp.join(data_root, \"train\", image + \".jpg\"),\n", + " )\n", + "with open(osp.join(data_root, \"meta\", \"test.txt\"), \"r\") as file:\n", + " for image in tqdm(file):\n", + " image = image.rstrip()\n", + " if image.split(\"/\")[0] in classes:\n", + " copyfile(\n", + " osp.join(data_root, \"images\", image + \".jpg\"),\n", + " osp.join(data_root, \"test\", image + \".jpg\"),\n", + " )\n" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a309c376716f467083b9e235ce5ac786", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', max=1.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "74c39deb82ad4d42b35a36b4c8de30a9", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', max=1.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "U2pnetRCq94T", + "colab_type": "text" + }, + "source": [ + "## Apex Installation\n", + "Torch 1.6.0 has its own AMP for mixed-precision training. However, we are going to use Apex. Please, run the block below to install it:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "us-XC-2Qs75I", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "a532db69-b289-484a-8279-0b5c9c66bbdb" + }, + "source": [ + "!git clone https://github.com/NVIDIA/apex\n", + "%cd apex\n", + "!pip install -v --no-cache-dir --global-option=\"--cpp_ext\" --global-option=\"--cuda_ext\" ./\n", + "%cd .." + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Cloning into 'apex'...\n", + "remote: Enumerating objects: 7431, done.\u001b[K\n", + "remote: Total 7431 (delta 0), reused 0 (delta 0), pack-reused 7431\u001b[K\n", + "Receiving objects: 100% (7431/7431), 13.91 MiB | 13.73 MiB/s, done.\n", + "Resolving deltas: 100% (5023/5023), done.\n", + "/content/apex\n", + "/usr/local/lib/python3.6/dist-packages/pip/_internal/commands/install.py:283: UserWarning: Disabling all use of wheels due to the use of --build-options / --global-options / --install-options.\n", + " cmdoptions.check_install_build_global(options)\n", + "Created temporary directory: /tmp/pip-ephem-wheel-cache-i2m8ug50\n", + "Created temporary directory: /tmp/pip-req-tracker-5zyf_ul2\n", + "Created requirements tracker '/tmp/pip-req-tracker-5zyf_ul2'\n", + "Created temporary directory: /tmp/pip-install-hid3au93\n", + "Processing /content/apex\n", + " Created temporary directory: /tmp/pip-req-build-usombg2r\n", + " Added file:///content/apex to build tracker '/tmp/pip-req-tracker-5zyf_ul2'\n", + " Running setup.py (path:/tmp/pip-req-build-usombg2r/setup.py) egg_info for package from file:///content/apex\n", + " Running command python setup.py egg_info\n", + "\n", + "\n", + " torch.__version__ = 1.6.0+cu101\n", + "\n", + "\n", + " running egg_info\n", + " creating /tmp/pip-req-build-usombg2r/pip-egg-info/apex.egg-info\n", + " writing /tmp/pip-req-build-usombg2r/pip-egg-info/apex.egg-info/PKG-INFO\n", + " writing dependency_links to /tmp/pip-req-build-usombg2r/pip-egg-info/apex.egg-info/dependency_links.txt\n", + " writing top-level names to /tmp/pip-req-build-usombg2r/pip-egg-info/apex.egg-info/top_level.txt\n", + " writing manifest file '/tmp/pip-req-build-usombg2r/pip-egg-info/apex.egg-info/SOURCES.txt'\n", + " writing manifest file '/tmp/pip-req-build-usombg2r/pip-egg-info/apex.egg-info/SOURCES.txt'\n", + " /tmp/pip-req-build-usombg2r/setup.py:67: UserWarning: Option --pyprof not specified. Not installing PyProf dependencies!\n", + " warnings.warn(\"Option --pyprof not specified. Not installing PyProf dependencies!\")\n", + " Source in /tmp/pip-req-build-usombg2r has version 0.1, which satisfies requirement apex==0.1 from file:///content/apex\n", + " Removed apex==0.1 from file:///content/apex from build tracker '/tmp/pip-req-tracker-5zyf_ul2'\n", + "Skipping wheel build for apex, due to binaries being disabled for it.\n", + "Installing collected packages: apex\n", + " Created temporary directory: /tmp/pip-record-77lhozzn\n", + " Running command /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '\"'\"'/tmp/pip-req-build-usombg2r/setup.py'\"'\"'; __file__='\"'\"'/tmp/pip-req-build-usombg2r/setup.py'\"'\"';f=getattr(tokenize, '\"'\"'open'\"'\"', open)(__file__);code=f.read().replace('\"'\"'\\r\\n'\"'\"', '\"'\"'\\n'\"'\"');f.close();exec(compile(code, __file__, '\"'\"'exec'\"'\"'))' --cpp_ext --cuda_ext install --record /tmp/pip-record-77lhozzn/install-record.txt --single-version-externally-managed --compile\n", + "\n", + "\n", + " torch.__version__ = 1.6.0+cu101\n", + "\n", + "\n", + " /tmp/pip-req-build-usombg2r/setup.py:67: UserWarning: Option --pyprof not specified. Not installing PyProf dependencies!\n", + " warnings.warn(\"Option --pyprof not specified. Not installing PyProf dependencies!\")\n", + "\n", + " Compiling cuda extensions with\n", + " nvcc: NVIDIA (R) Cuda compiler driver\n", + " Copyright (c) 2005-2019 NVIDIA Corporation\n", + " Built on Sun_Jul_28_19:07:16_PDT_2019\n", + " Cuda compilation tools, release 10.1, V10.1.243\n", + " from /usr/local/cuda/bin\n", + "\n", + " running install\n", + " running build\n", + " running build_py\n", + " creating build\n", + " creating build/lib.linux-x86_64-3.6\n", + " creating build/lib.linux-x86_64-3.6/apex\n", + " copying apex/__init__.py -> build/lib.linux-x86_64-3.6/apex\n", + " creating build/lib.linux-x86_64-3.6/apex/mlp\n", + " copying apex/mlp/__init__.py -> build/lib.linux-x86_64-3.6/apex/mlp\n", + " copying apex/mlp/mlp.py -> build/lib.linux-x86_64-3.6/apex/mlp\n", + " creating build/lib.linux-x86_64-3.6/apex/parallel\n", + " copying apex/parallel/LARC.py -> build/lib.linux-x86_64-3.6/apex/parallel\n", + " copying apex/parallel/__init__.py -> build/lib.linux-x86_64-3.6/apex/parallel\n", + " copying apex/parallel/sync_batchnorm_kernel.py -> build/lib.linux-x86_64-3.6/apex/parallel\n", + " copying apex/parallel/optimized_sync_batchnorm.py -> build/lib.linux-x86_64-3.6/apex/parallel\n", + " copying apex/parallel/distributed.py -> build/lib.linux-x86_64-3.6/apex/parallel\n", + " copying apex/parallel/sync_batchnorm.py -> build/lib.linux-x86_64-3.6/apex/parallel\n", + " copying apex/parallel/optimized_sync_batchnorm_kernel.py -> build/lib.linux-x86_64-3.6/apex/parallel\n", + " copying apex/parallel/multiproc.py -> build/lib.linux-x86_64-3.6/apex/parallel\n", + " creating build/lib.linux-x86_64-3.6/apex/optimizers\n", + " copying apex/optimizers/fused_adam.py -> build/lib.linux-x86_64-3.6/apex/optimizers\n", + " copying apex/optimizers/__init__.py -> build/lib.linux-x86_64-3.6/apex/optimizers\n", + " copying apex/optimizers/fused_sgd.py -> build/lib.linux-x86_64-3.6/apex/optimizers\n", + " copying apex/optimizers/fused_novograd.py -> build/lib.linux-x86_64-3.6/apex/optimizers\n", + " copying apex/optimizers/fused_adagrad.py -> build/lib.linux-x86_64-3.6/apex/optimizers\n", + " copying apex/optimizers/fused_lamb.py -> build/lib.linux-x86_64-3.6/apex/optimizers\n", + " creating build/lib.linux-x86_64-3.6/apex/RNN\n", + " copying apex/RNN/__init__.py -> build/lib.linux-x86_64-3.6/apex/RNN\n", + " copying apex/RNN/models.py -> build/lib.linux-x86_64-3.6/apex/RNN\n", + " copying apex/RNN/cells.py -> build/lib.linux-x86_64-3.6/apex/RNN\n", + " copying apex/RNN/RNNBackend.py -> build/lib.linux-x86_64-3.6/apex/RNN\n", + " creating build/lib.linux-x86_64-3.6/apex/pyprof\n", + " copying apex/pyprof/__init__.py -> build/lib.linux-x86_64-3.6/apex/pyprof\n", + " creating build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/__version__.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/utils.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/__init__.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/amp.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/compat.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/_process_optimizer.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/_amp_state.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/_initialize.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/opt.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/handle.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/rnn_compat.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/frontend.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/scaler.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " copying apex/amp/wrap.py -> build/lib.linux-x86_64-3.6/apex/amp\n", + " creating build/lib.linux-x86_64-3.6/apex/fp16_utils\n", + " copying apex/fp16_utils/fp16util.py -> build/lib.linux-x86_64-3.6/apex/fp16_utils\n", + " copying apex/fp16_utils/__init__.py -> build/lib.linux-x86_64-3.6/apex/fp16_utils\n", + " copying apex/fp16_utils/fp16_optimizer.py -> build/lib.linux-x86_64-3.6/apex/fp16_utils\n", + " copying apex/fp16_utils/loss_scaler.py -> build/lib.linux-x86_64-3.6/apex/fp16_utils\n", + " creating build/lib.linux-x86_64-3.6/apex/reparameterization\n", + " copying apex/reparameterization/__init__.py -> build/lib.linux-x86_64-3.6/apex/reparameterization\n", + " copying apex/reparameterization/weight_norm.py -> build/lib.linux-x86_64-3.6/apex/reparameterization\n", + " copying apex/reparameterization/reparameterization.py -> build/lib.linux-x86_64-3.6/apex/reparameterization\n", + " creating build/lib.linux-x86_64-3.6/apex/multi_tensor_apply\n", + " copying apex/multi_tensor_apply/multi_tensor_apply.py -> build/lib.linux-x86_64-3.6/apex/multi_tensor_apply\n", + " copying apex/multi_tensor_apply/__init__.py -> build/lib.linux-x86_64-3.6/apex/multi_tensor_apply\n", + " creating build/lib.linux-x86_64-3.6/apex/normalization\n", + " copying apex/normalization/__init__.py -> build/lib.linux-x86_64-3.6/apex/normalization\n", + " copying apex/normalization/fused_layer_norm.py -> build/lib.linux-x86_64-3.6/apex/normalization\n", + " creating build/lib.linux-x86_64-3.6/apex/contrib\n", + " copying apex/contrib/__init__.py -> build/lib.linux-x86_64-3.6/apex/contrib\n", + " creating build/lib.linux-x86_64-3.6/apex/pyprof/parse\n", + " copying apex/pyprof/parse/__init__.py -> build/lib.linux-x86_64-3.6/apex/pyprof/parse\n", + " copying apex/pyprof/parse/kernel.py -> build/lib.linux-x86_64-3.6/apex/pyprof/parse\n", + " copying apex/pyprof/parse/db.py -> build/lib.linux-x86_64-3.6/apex/pyprof/parse\n", + " copying apex/pyprof/parse/__main__.py -> build/lib.linux-x86_64-3.6/apex/pyprof/parse\n", + " copying apex/pyprof/parse/parse.py -> build/lib.linux-x86_64-3.6/apex/pyprof/parse\n", + " copying apex/pyprof/parse/nvvp.py -> build/lib.linux-x86_64-3.6/apex/pyprof/parse\n", + " creating build/lib.linux-x86_64-3.6/apex/pyprof/nvtx\n", + " copying apex/pyprof/nvtx/__init__.py -> build/lib.linux-x86_64-3.6/apex/pyprof/nvtx\n", + " copying apex/pyprof/nvtx/nvmarker.py -> build/lib.linux-x86_64-3.6/apex/pyprof/nvtx\n", + " creating build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/reduction.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/usage.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/data.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/prof.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/__init__.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/blas.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/pooling.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/index_slice_join_mutate.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/randomSample.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/convert.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/normalization.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/activation.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/__main__.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/misc.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/dropout.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/loss.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/linear.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/softmax.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/embedding.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/base.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/conv.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/pointwise.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/recurrentCell.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/output.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/utility.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " copying apex/pyprof/prof/optim.py -> build/lib.linux-x86_64-3.6/apex/pyprof/prof\n", + " creating build/lib.linux-x86_64-3.6/apex/amp/lists\n", + " copying apex/amp/lists/__init__.py -> build/lib.linux-x86_64-3.6/apex/amp/lists\n", + " copying apex/amp/lists/functional_overrides.py -> build/lib.linux-x86_64-3.6/apex/amp/lists\n", + " copying apex/amp/lists/torch_overrides.py -> build/lib.linux-x86_64-3.6/apex/amp/lists\n", + " copying apex/amp/lists/tensor_overrides.py -> build/lib.linux-x86_64-3.6/apex/amp/lists\n", + " creating build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn\n", + " copying apex/contrib/multihead_attn/self_multihead_attn_func.py -> build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn\n", + " copying apex/contrib/multihead_attn/__init__.py -> build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn\n", + " copying apex/contrib/multihead_attn/mask_softmax_dropout_func.py -> build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn\n", + " copying apex/contrib/multihead_attn/encdec_multihead_attn.py -> build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn\n", + " copying apex/contrib/multihead_attn/self_multihead_attn.py -> build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn\n", + " copying apex/contrib/multihead_attn/fast_encdec_multihead_attn_func.py -> build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn\n", + " copying apex/contrib/multihead_attn/fast_self_multihead_attn_func.py -> build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn\n", + " copying apex/contrib/multihead_attn/encdec_multihead_attn_func.py -> build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn\n", + " copying apex/contrib/multihead_attn/fast_self_multihead_attn_norm_add_func.py -> build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn\n", + " copying apex/contrib/multihead_attn/fast_encdec_multihead_attn_norm_add_func.py -> build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn\n", + " creating build/lib.linux-x86_64-3.6/apex/contrib/sparsity\n", + " copying apex/contrib/sparsity/asp.py -> build/lib.linux-x86_64-3.6/apex/contrib/sparsity\n", + " copying apex/contrib/sparsity/__init__.py -> build/lib.linux-x86_64-3.6/apex/contrib/sparsity\n", + " copying apex/contrib/sparsity/sparse_masklib.py -> build/lib.linux-x86_64-3.6/apex/contrib/sparsity\n", + " creating build/lib.linux-x86_64-3.6/apex/contrib/optimizers\n", + " copying apex/contrib/optimizers/fused_adam.py -> build/lib.linux-x86_64-3.6/apex/contrib/optimizers\n", + " copying apex/contrib/optimizers/__init__.py -> build/lib.linux-x86_64-3.6/apex/contrib/optimizers\n", + " copying apex/contrib/optimizers/fused_sgd.py -> build/lib.linux-x86_64-3.6/apex/contrib/optimizers\n", + " copying apex/contrib/optimizers/fp16_optimizer.py -> build/lib.linux-x86_64-3.6/apex/contrib/optimizers\n", + " copying apex/contrib/optimizers/distributed_fused_lamb.py -> build/lib.linux-x86_64-3.6/apex/contrib/optimizers\n", + " copying apex/contrib/optimizers/distributed_fused_adam_v3.py -> build/lib.linux-x86_64-3.6/apex/contrib/optimizers\n", + " copying apex/contrib/optimizers/distributed_fused_adam_v2.py -> build/lib.linux-x86_64-3.6/apex/contrib/optimizers\n", + " copying apex/contrib/optimizers/fused_lamb.py -> build/lib.linux-x86_64-3.6/apex/contrib/optimizers\n", + " copying apex/contrib/optimizers/distributed_fused_adam.py -> build/lib.linux-x86_64-3.6/apex/contrib/optimizers\n", + " creating build/lib.linux-x86_64-3.6/apex/contrib/xentropy\n", + " copying apex/contrib/xentropy/softmax_xentropy.py -> build/lib.linux-x86_64-3.6/apex/contrib/xentropy\n", + " copying apex/contrib/xentropy/__init__.py -> build/lib.linux-x86_64-3.6/apex/contrib/xentropy\n", + " creating build/lib.linux-x86_64-3.6/apex/contrib/groupbn\n", + " copying apex/contrib/groupbn/__init__.py -> build/lib.linux-x86_64-3.6/apex/contrib/groupbn\n", + " copying apex/contrib/groupbn/batch_norm.py -> build/lib.linux-x86_64-3.6/apex/contrib/groupbn\n", + " running build_ext\n", + " /usr/local/lib/python3.6/dist-packages/torch/utils/cpp_extension.py:335: UserWarning: Attempted to use ninja as the BuildExtension backend but we could not find ninja.. Falling back to using the slow distutils backend.\n", + " warnings.warn(msg.format('we could not find ninja.'))\n", + " building 'apex_C' extension\n", + " creating build/temp.linux-x86_64-3.6\n", + " creating build/temp.linux-x86_64-3.6/csrc\n", + " x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/include/python3.6m -c csrc/flatten_unflatten.cpp -o build/temp.linux-x86_64-3.6/csrc/flatten_unflatten.o -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=apex_C -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++14\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Parallel.h:149:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/utils.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/nn.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:7,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/flatten_unflatten.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ParallelOpenMP.h:84:0: warning: ignoring #pragma omp parallel [-Wunknown-pragmas]\n", + " #pragma omp parallel for if ((end - begin) >= grain_size)\n", + "\n", + " In file included from csrc/flatten_unflatten.cpp:2:0:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/utils/tensor_flatten.h: In member function ‘at::DeprecatedTypeProperties& torch::utils::TensorGroup::type()’:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/utils/tensor_flatten.h:36:28: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " return tensors[0].type();\n", + " ^\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/flatten_unflatten.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " x86_64-linux-gnu-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.6/csrc/flatten_unflatten.o -L/usr/local/lib/python3.6/dist-packages/torch/lib -lc10 -ltorch -ltorch_cpu -ltorch_python -o build/lib.linux-x86_64-3.6/apex_C.cpython-36m-x86_64-linux-gnu.so\n", + " building 'amp_C' extension\n", + " x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/amp_C_frontend.cpp -o build/temp.linux-x86_64-3.6/csrc/amp_C_frontend.o -O3 -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=amp_C -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++14\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Parallel.h:149:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/utils.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/nn.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:7,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/amp_C_frontend.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ParallelOpenMP.h:84:0: warning: ignoring #pragma omp parallel [-Wunknown-pragmas]\n", + " #pragma omp parallel for if ((end - begin) >= grain_size)\n", + "\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/multi_tensor_sgd_kernel.cu -o build/temp.linux-x86_64-3.6/csrc/multi_tensor_sgd_kernel.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -lineinfo -O3 --use_fast_math -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=amp_C -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/multi_tensor_scale_kernel.cu -o build/temp.linux-x86_64-3.6/csrc/multi_tensor_scale_kernel.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -lineinfo -O3 --use_fast_math -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=amp_C -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/multi_tensor_axpby_kernel.cu -o build/temp.linux-x86_64-3.6/csrc/multi_tensor_axpby_kernel.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -lineinfo -O3 --use_fast_math -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=amp_C -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/multi_tensor_l2norm_kernel.cu -o build/temp.linux-x86_64-3.6/csrc/multi_tensor_l2norm_kernel.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -lineinfo -O3 --use_fast_math -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=amp_C -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/multi_tensor_lamb_stage_1.cu -o build/temp.linux-x86_64-3.6/csrc/multi_tensor_lamb_stage_1.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -lineinfo -O3 --use_fast_math -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=amp_C -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/multi_tensor_lamb_stage_2.cu -o build/temp.linux-x86_64-3.6/csrc/multi_tensor_lamb_stage_2.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -lineinfo -O3 --use_fast_math -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=amp_C -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/multi_tensor_adam.cu -o build/temp.linux-x86_64-3.6/csrc/multi_tensor_adam.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -lineinfo -O3 --use_fast_math -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=amp_C -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/multi_tensor_adagrad.cu -o build/temp.linux-x86_64-3.6/csrc/multi_tensor_adagrad.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -lineinfo -O3 --use_fast_math -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=amp_C -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/multi_tensor_novograd.cu -o build/temp.linux-x86_64-3.6/csrc/multi_tensor_novograd.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -lineinfo -O3 --use_fast_math -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=amp_C -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/multi_tensor_lamb.cu -o build/temp.linux-x86_64-3.6/csrc/multi_tensor_lamb.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -lineinfo -O3 --use_fast_math -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=amp_C -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " x86_64-linux-gnu-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.6/csrc/amp_C_frontend.o build/temp.linux-x86_64-3.6/csrc/multi_tensor_sgd_kernel.o build/temp.linux-x86_64-3.6/csrc/multi_tensor_scale_kernel.o build/temp.linux-x86_64-3.6/csrc/multi_tensor_axpby_kernel.o build/temp.linux-x86_64-3.6/csrc/multi_tensor_l2norm_kernel.o build/temp.linux-x86_64-3.6/csrc/multi_tensor_lamb_stage_1.o build/temp.linux-x86_64-3.6/csrc/multi_tensor_lamb_stage_2.o build/temp.linux-x86_64-3.6/csrc/multi_tensor_adam.o build/temp.linux-x86_64-3.6/csrc/multi_tensor_adagrad.o build/temp.linux-x86_64-3.6/csrc/multi_tensor_novograd.o build/temp.linux-x86_64-3.6/csrc/multi_tensor_lamb.o -L/usr/local/lib/python3.6/dist-packages/torch/lib -L/usr/local/cuda/lib64 -lc10 -ltorch -ltorch_cpu -ltorch_python -lcudart -lc10_cuda -ltorch_cuda -o build/lib.linux-x86_64-3.6/amp_C.cpython-36m-x86_64-linux-gnu.so\n", + " building 'syncbn' extension\n", + " x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/syncbn.cpp -o build/temp.linux-x86_64-3.6/csrc/syncbn.o -O3 -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=syncbn -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++14\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Parallel.h:149:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/utils.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/nn.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:7,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/syncbn.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ParallelOpenMP.h:84:0: warning: ignoring #pragma omp parallel [-Wunknown-pragmas]\n", + " #pragma omp parallel for if ((end - begin) >= grain_size)\n", + "\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/welford.cu -o build/temp.linux-x86_64-3.6/csrc/welford.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -O3 -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=syncbn -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " x86_64-linux-gnu-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.6/csrc/syncbn.o build/temp.linux-x86_64-3.6/csrc/welford.o -L/usr/local/lib/python3.6/dist-packages/torch/lib -L/usr/local/cuda/lib64 -lc10 -ltorch -ltorch_cpu -ltorch_python -lcudart -lc10_cuda -ltorch_cuda -o build/lib.linux-x86_64-3.6/syncbn.cpython-36m-x86_64-linux-gnu.so\n", + " building 'fused_layer_norm_cuda' extension\n", + " x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/layer_norm_cuda.cpp -o build/temp.linux-x86_64-3.6/csrc/layer_norm_cuda.o -O3 -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=fused_layer_norm_cuda -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++14\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Parallel.h:149:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/utils.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/nn.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:7,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ParallelOpenMP.h:84:0: warning: ignoring #pragma omp parallel [-Wunknown-pragmas]\n", + " #pragma omp parallel for if ((end - begin) >= grain_size)\n", + "\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp: In function ‘std::vector layer_norm(at::Tensor, c10::IntArrayRef, double)’:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:129:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(input);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp: In function ‘std::vector layer_norm_affine(at::Tensor, c10::IntArrayRef, at::Tensor, at::Tensor, double)’:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:149:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(input);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:150:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(gamma);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:151:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(beta);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp: In function ‘at::Tensor layer_norm_gradient(at::Tensor, at::Tensor, at::Tensor, at::Tensor, c10::IntArrayRef, double)’:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:193:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(dout);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:194:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(mean);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:195:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(invvar);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:196:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(input);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp: In function ‘std::vector layer_norm_gradient_affine(at::Tensor, at::Tensor, at::Tensor, at::Tensor, c10::IntArrayRef, at::Tensor, at::Tensor, double)’:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:218:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(dout);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:219:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(mean);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:220:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(invvar);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:221:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(input);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:222:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(gamma);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/DeviceType.h:8:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Device.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/c10/core/Allocator.h:6,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " csrc/layer_norm_cuda.cpp:117:42: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/macros/Macros.h:146:65: note: in definition of macro ‘C10_UNLIKELY’\n", + " #define C10_UNLIKELY(expr) (__builtin_expect(static_cast(expr), 0))\n", + " ^~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:330:7: note: in expansion of macro ‘C10_UNLIKELY_OR_CONST’\n", + " if (C10_UNLIKELY_OR_CONST(!(cond))) { \\\n", + " ^~~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:318:3: note: in expansion of macro ‘TORCH_CHECK_WITH_MSG’\n", + " TORCH_CHECK_WITH_MSG(error_t, cond, \"\", __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/c10/util/Exception.h:341:32: note: in expansion of macro ‘TORCH_CHECK_WITH’\n", + " #define TORCH_CHECK(cond, ...) TORCH_CHECK_WITH(Error, cond, __VA_ARGS__)\n", + " ^~~~~~~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:117:23: note: in expansion of macro ‘TORCH_CHECK’\n", + " #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x \" must be a CUDA tensor\")\n", + " ^~~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:119:24: note: in expansion of macro ‘CHECK_CUDA’\n", + " #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n", + " ^~~~~~~~~~\n", + " csrc/layer_norm_cuda.cpp:223:3: note: in expansion of macro ‘CHECK_INPUT’\n", + " CHECK_INPUT(beta);\n", + " ^~~~~~~~~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/layer_norm_cuda.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/layer_norm_cuda_kernel.cu -o build/temp.linux-x86_64-3.6/csrc/layer_norm_cuda_kernel.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -maxrregcount=50 -O3 --use_fast_math -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=fused_layer_norm_cuda -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " x86_64-linux-gnu-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.6/csrc/layer_norm_cuda.o build/temp.linux-x86_64-3.6/csrc/layer_norm_cuda_kernel.o -L/usr/local/lib/python3.6/dist-packages/torch/lib -L/usr/local/cuda/lib64 -lc10 -ltorch -ltorch_cpu -ltorch_python -lcudart -lc10_cuda -ltorch_cuda -o build/lib.linux-x86_64-3.6/fused_layer_norm_cuda.cpython-36m-x86_64-linux-gnu.so\n", + " building 'mlp_cuda' extension\n", + " x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/mlp.cpp -o build/temp.linux-x86_64-3.6/csrc/mlp.o -O3 -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=mlp_cuda -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++14\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Parallel.h:149:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/utils.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/nn.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:7,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ParallelOpenMP.h:84:0: warning: ignoring #pragma omp parallel [-Wunknown-pragmas]\n", + " #pragma omp parallel for if ((end - begin) >= grain_size)\n", + "\n", + " csrc/mlp.cpp: In function ‘std::vector mlp_forward(int, int, std::vector)’:\n", + " csrc/mlp.cpp:56:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n", + " for (int i = 0; i < num_layers; i++) {\n", + " ~~^~~~~~~~~~~~\n", + " csrc/mlp.cpp:64:77: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " auto out = at::empty({batch_size, output_features.back()}, inputs[0].type());\n", + " ^\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " csrc/mlp.cpp:65:67: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " auto reserved_space = at::empty({reserved_size}, inputs[0].type());\n", + " ^\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " csrc/mlp.cpp:65:68: warning: narrowing conversion of ‘reserved_size’ from ‘long unsigned int’ to ‘long int’ inside { } [-Wnarrowing]\n", + " auto reserved_space = at::empty({reserved_size}, inputs[0].type());\n", + " ^\n", + " csrc/mlp.cpp:65:68: warning: narrowing conversion of ‘reserved_size’ from ‘long unsigned int’ to ‘long int’ inside { } [-Wnarrowing]\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:9:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " csrc/mlp.cpp: In lambda function:\n", + " csrc/mlp.cpp:67:54: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_forward\", [&] {\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:150:28: note: in definition of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " const auto& the_type = TYPE; \\\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:9:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:152:56: warning: ‘c10::ScalarType detail::scalar_type(const at::DeprecatedTypeProperties&)’ is deprecated: passing at::DeprecatedTypeProperties to an AT_DISPATCH macro is deprecated, pass an at::ScalarType instead [-Wdeprecated-declarations]\n", + " at::ScalarType _st = ::detail::scalar_type(the_type); \\\n", + " ^\n", + " csrc/mlp.cpp:67:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_forward\", [&] {\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:66:23: note: declared here\n", + " inline at::ScalarType scalar_type(const at::DeprecatedTypeProperties& t) {\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp: In lambda function:\n", + " csrc/mlp.cpp:70:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n", + " for (int i = 0; i < num_layers; i++) {\n", + " ~~^~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:67:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_forward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:76:10: warning: unused variable ‘result’ [-Wunused-variable]\n", + " auto result = mlp_fp(\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:67:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_forward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp: In lambda function:\n", + " csrc/mlp.cpp:70:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n", + " for (int i = 0; i < num_layers; i++) {\n", + " ~~^~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:67:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_forward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:76:10: warning: unused variable ‘result’ [-Wunused-variable]\n", + " auto result = mlp_fp(\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:67:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_forward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp: In lambda function:\n", + " csrc/mlp.cpp:70:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n", + " for (int i = 0; i < num_layers; i++) {\n", + " ~~^~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:67:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_forward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:76:10: warning: unused variable ‘result’ [-Wunused-variable]\n", + " auto result = mlp_fp(\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:67:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_forward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp: In function ‘std::vector mlp_backward(int, int, at::Tensor, std::vector, std::vector)’:\n", + " csrc/mlp.cpp:113:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n", + " for (int i = 0; i < num_layers; i++) {\n", + " ~~^~~~~~~~~~~~\n", + " csrc/mlp.cpp:119:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n", + " for (int i = 0; i < inputs.size(); i++) {\n", + " ~~^~~~~~~~~~~~~~~\n", + " csrc/mlp.cpp:120:67: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " outputs.push_back(at::empty(inputs[i].sizes(), inputs[i].type())); // clone for testing now\n", + " ^\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:9:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " csrc/mlp.cpp: In lambda function:\n", + " csrc/mlp.cpp:123:54: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:150:28: note: in definition of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " const auto& the_type = TYPE; \\\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:9:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:152:56: warning: ‘c10::ScalarType detail::scalar_type(const at::DeprecatedTypeProperties&)’ is deprecated: passing at::DeprecatedTypeProperties to an AT_DISPATCH macro is deprecated, pass an at::ScalarType instead [-Wdeprecated-declarations]\n", + " at::ScalarType _st = ::detail::scalar_type(the_type); \\\n", + " ^\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:66:23: note: declared here\n", + " inline at::ScalarType scalar_type(const at::DeprecatedTypeProperties& t) {\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp: In lambda function:\n", + " csrc/mlp.cpp:125:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n", + " for (int i = 0; i < num_layers; i++) {\n", + " ~~^~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:129:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n", + " for (int i = 0; i < inputs.size(); i++) {\n", + " ~~^~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:137:80: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " auto work_space = at::empty({work_size / sizeof(scalar_t)}, inputs[0].type());\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:9:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " csrc/mlp.cpp:137:44: warning: narrowing conversion of ‘(work_size / sizeof (scalar_t))’ from ‘long unsigned int’ to ‘long int’ inside { } [-Wnarrowing]\n", + " auto work_space = at::empty({work_size / sizeof(scalar_t)}, inputs[0].type());\n", + " ~~~~~~~~~~^~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:137:44: warning: narrowing conversion of ‘(work_size / sizeof (scalar_t))’ from ‘long unsigned int’ to ‘long int’ inside { } [-Wnarrowing]\n", + " auto work_space = at::empty({work_size / sizeof(scalar_t)}, inputs[0].type());\n", + " ~~~~~~~~~~^~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:139:10: warning: unused variable ‘result’ [-Wunused-variable]\n", + " auto result = mlp_bp(\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp: In lambda function:\n", + " csrc/mlp.cpp:125:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n", + " for (int i = 0; i < num_layers; i++) {\n", + " ~~^~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:129:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n", + " for (int i = 0; i < inputs.size(); i++) {\n", + " ~~^~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:137:80: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " auto work_space = at::empty({work_size / sizeof(scalar_t)}, inputs[0].type());\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:9:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " csrc/mlp.cpp:137:44: warning: narrowing conversion of ‘(work_size / sizeof (scalar_t))’ from ‘long unsigned int’ to ‘long int’ inside { } [-Wnarrowing]\n", + " auto work_space = at::empty({work_size / sizeof(scalar_t)}, inputs[0].type());\n", + " ~~~~~~~~~~^~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:137:44: warning: narrowing conversion of ‘(work_size / sizeof (scalar_t))’ from ‘long unsigned int’ to ‘long int’ inside { } [-Wnarrowing]\n", + " auto work_space = at::empty({work_size / sizeof(scalar_t)}, inputs[0].type());\n", + " ~~~~~~~~~~^~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:139:10: warning: unused variable ‘result’ [-Wunused-variable]\n", + " auto result = mlp_bp(\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp: In lambda function:\n", + " csrc/mlp.cpp:125:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n", + " for (int i = 0; i < num_layers; i++) {\n", + " ~~^~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:129:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]\n", + " for (int i = 0; i < inputs.size(); i++) {\n", + " ~~^~~~~~~~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:137:80: warning: ‘at::DeprecatedTypeProperties& at::Tensor::type() const’ is deprecated: Tensor.type() is deprecated. Instead use Tensor.options(), which in many cases (e.g. in a constructor) is a drop-in replacement. If you were using data from type(), that is now available from Tensor itself, so instead of tensor.type().scalar_type(), use tensor.scalar_type() instead and instead of tensor.type().backend() use tensor.device(). [-Wdeprecated-declarations]\n", + " auto work_space = at::empty({work_size / sizeof(scalar_t)}, inputs[0].type());\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Tensor.h:3:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Context.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:5,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/core/TensorBody.h:268:30: note: declared here\n", + " DeprecatedTypeProperties & type() const {\n", + " ^~~~\n", + " In file included from /usr/local/lib/python3.6/dist-packages/torch/include/ATen/ATen.h:9:0,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/types.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/data.h:3,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include/torch/all.h:4,\n", + " from /usr/local/lib/python3.6/dist-packages/torch/include/torch/extension.h:4,\n", + " from csrc/mlp.cpp:1:\n", + " csrc/mlp.cpp:137:44: warning: narrowing conversion of ‘(work_size / sizeof (scalar_t))’ from ‘long unsigned int’ to ‘long int’ inside { } [-Wnarrowing]\n", + " auto work_space = at::empty({work_size / sizeof(scalar_t)}, inputs[0].type());\n", + " ~~~~~~~~~~^~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:137:44: warning: narrowing conversion of ‘(work_size / sizeof (scalar_t))’ from ‘long unsigned int’ to ‘long int’ inside { } [-Wnarrowing]\n", + " auto work_space = at::empty({work_size / sizeof(scalar_t)}, inputs[0].type());\n", + " ~~~~~~~~~~^~~~~~~~~\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " csrc/mlp.cpp:139:10: warning: unused variable ‘result’ [-Wunused-variable]\n", + " auto result = mlp_bp(\n", + " ^\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/Dispatch.h:13:12: note: in definition of macro ‘AT_PRIVATE_CASE_TYPE’\n", + " return __VA_ARGS__(); \\\n", + " ^~~~~~~~~~~\n", + " csrc/mlp.cpp:123:3: note: in expansion of macro ‘AT_DISPATCH_FLOATING_TYPES_AND_HALF’\n", + " AT_DISPATCH_FLOATING_TYPES_AND_HALF(inputs[0].type(), \"mlp_backward\", [&] {\n", + " ^\n", + " /usr/local/cuda/bin/nvcc -I/usr/local/lib/python3.6/dist-packages/torch/include -I/usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.6/dist-packages/torch/include/TH -I/usr/local/lib/python3.6/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.6m -c csrc/mlp_cuda.cu -o build/temp.linux-x86_64-3.6/csrc/mlp_cuda.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options '-fPIC' -O3 -DVERSION_GE_1_1 -DVERSION_GE_1_3 -DVERSION_GE_1_5 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=mlp_cuda -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_37,code=sm_37 -std=c++14\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/record_function.h(18): warning: attribute \"__visibility__\" does not apply here\n", + "\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/autograd/profiler.h(97): warning: attribute \"__visibility__\" does not apply here\n", + "\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/autograd/profiler.h(126): warning: attribute \"__visibility__\" does not apply here\n", + "\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/ATen/record_function.h(18): warning: attribute \"__visibility__\" does not apply here\n", + "\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/autograd/profiler.h(97): warning: attribute \"__visibility__\" does not apply here\n", + "\n", + " /usr/local/lib/python3.6/dist-packages/torch/include/torch/csrc/autograd/profiler.h(126): warning: attribute \"__visibility__\" does not apply here\n", + "\n", + " x86_64-linux-gnu-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.6/csrc/mlp.o build/temp.linux-x86_64-3.6/csrc/mlp_cuda.o -L/usr/local/lib/python3.6/dist-packages/torch/lib -L/usr/local/cuda/lib64 -lc10 -ltorch -ltorch_cpu -ltorch_python -lcudart -lc10_cuda -ltorch_cuda -o build/lib.linux-x86_64-3.6/mlp_cuda.cpython-36m-x86_64-linux-gnu.so\n", + " running install_lib\n", + " copying build/lib.linux-x86_64-3.6/syncbn.cpython-36m-x86_64-linux-gnu.so -> /usr/local/lib/python3.6/dist-packages\n", + " copying build/lib.linux-x86_64-3.6/mlp_cuda.cpython-36m-x86_64-linux-gnu.so -> /usr/local/lib/python3.6/dist-packages\n", + " creating /usr/local/lib/python3.6/dist-packages/apex\n", + " copying build/lib.linux-x86_64-3.6/apex/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/mlp\n", + " copying build/lib.linux-x86_64-3.6/apex/mlp/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/mlp\n", + " copying build/lib.linux-x86_64-3.6/apex/mlp/mlp.py -> /usr/local/lib/python3.6/dist-packages/apex/mlp\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/parallel\n", + " copying build/lib.linux-x86_64-3.6/apex/parallel/LARC.py -> /usr/local/lib/python3.6/dist-packages/apex/parallel\n", + " copying build/lib.linux-x86_64-3.6/apex/parallel/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/parallel\n", + " copying build/lib.linux-x86_64-3.6/apex/parallel/sync_batchnorm_kernel.py -> /usr/local/lib/python3.6/dist-packages/apex/parallel\n", + " copying build/lib.linux-x86_64-3.6/apex/parallel/optimized_sync_batchnorm.py -> /usr/local/lib/python3.6/dist-packages/apex/parallel\n", + " copying build/lib.linux-x86_64-3.6/apex/parallel/distributed.py -> /usr/local/lib/python3.6/dist-packages/apex/parallel\n", + " copying build/lib.linux-x86_64-3.6/apex/parallel/sync_batchnorm.py -> /usr/local/lib/python3.6/dist-packages/apex/parallel\n", + " copying build/lib.linux-x86_64-3.6/apex/parallel/optimized_sync_batchnorm_kernel.py -> /usr/local/lib/python3.6/dist-packages/apex/parallel\n", + " copying build/lib.linux-x86_64-3.6/apex/parallel/multiproc.py -> /usr/local/lib/python3.6/dist-packages/apex/parallel\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/optimizers/fused_adam.py -> /usr/local/lib/python3.6/dist-packages/apex/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/optimizers/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/optimizers/fused_sgd.py -> /usr/local/lib/python3.6/dist-packages/apex/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/optimizers/fused_novograd.py -> /usr/local/lib/python3.6/dist-packages/apex/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/optimizers/fused_adagrad.py -> /usr/local/lib/python3.6/dist-packages/apex/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/optimizers/fused_lamb.py -> /usr/local/lib/python3.6/dist-packages/apex/optimizers\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/RNN\n", + " copying build/lib.linux-x86_64-3.6/apex/RNN/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/RNN\n", + " copying build/lib.linux-x86_64-3.6/apex/RNN/models.py -> /usr/local/lib/python3.6/dist-packages/apex/RNN\n", + " copying build/lib.linux-x86_64-3.6/apex/RNN/cells.py -> /usr/local/lib/python3.6/dist-packages/apex/RNN\n", + " copying build/lib.linux-x86_64-3.6/apex/RNN/RNNBackend.py -> /usr/local/lib/python3.6/dist-packages/apex/RNN\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/pyprof\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/parse/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/parse/kernel.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/parse/db.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/parse/__main__.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/parse/parse.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/parse/nvvp.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/pyprof/nvtx\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/nvtx/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/nvtx\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/nvtx/nvmarker.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/nvtx\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/reduction.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/usage.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/data.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/prof.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/blas.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/pooling.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/index_slice_join_mutate.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/randomSample.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/convert.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/normalization.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/activation.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/__main__.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/misc.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/dropout.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/loss.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/linear.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/softmax.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/embedding.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/base.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/conv.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/pointwise.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/recurrentCell.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/output.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/utility.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " copying build/lib.linux-x86_64-3.6/apex/pyprof/prof/optim.py -> /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/__version__.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/amp/lists\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/lists/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/amp/lists\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/lists/functional_overrides.py -> /usr/local/lib/python3.6/dist-packages/apex/amp/lists\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/lists/torch_overrides.py -> /usr/local/lib/python3.6/dist-packages/apex/amp/lists\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/lists/tensor_overrides.py -> /usr/local/lib/python3.6/dist-packages/apex/amp/lists\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/utils.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/amp.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/compat.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/_process_optimizer.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/_amp_state.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/_initialize.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/opt.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/handle.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/rnn_compat.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/frontend.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/scaler.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " copying build/lib.linux-x86_64-3.6/apex/amp/wrap.py -> /usr/local/lib/python3.6/dist-packages/apex/amp\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/fp16_utils\n", + " copying build/lib.linux-x86_64-3.6/apex/fp16_utils/fp16util.py -> /usr/local/lib/python3.6/dist-packages/apex/fp16_utils\n", + " copying build/lib.linux-x86_64-3.6/apex/fp16_utils/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/fp16_utils\n", + " copying build/lib.linux-x86_64-3.6/apex/fp16_utils/fp16_optimizer.py -> /usr/local/lib/python3.6/dist-packages/apex/fp16_utils\n", + " copying build/lib.linux-x86_64-3.6/apex/fp16_utils/loss_scaler.py -> /usr/local/lib/python3.6/dist-packages/apex/fp16_utils\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/reparameterization\n", + " copying build/lib.linux-x86_64-3.6/apex/reparameterization/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/reparameterization\n", + " copying build/lib.linux-x86_64-3.6/apex/reparameterization/weight_norm.py -> /usr/local/lib/python3.6/dist-packages/apex/reparameterization\n", + " copying build/lib.linux-x86_64-3.6/apex/reparameterization/reparameterization.py -> /usr/local/lib/python3.6/dist-packages/apex/reparameterization\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/multi_tensor_apply\n", + " copying build/lib.linux-x86_64-3.6/apex/multi_tensor_apply/multi_tensor_apply.py -> /usr/local/lib/python3.6/dist-packages/apex/multi_tensor_apply\n", + " copying build/lib.linux-x86_64-3.6/apex/multi_tensor_apply/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/multi_tensor_apply\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/normalization\n", + " copying build/lib.linux-x86_64-3.6/apex/normalization/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/normalization\n", + " copying build/lib.linux-x86_64-3.6/apex/normalization/fused_layer_norm.py -> /usr/local/lib/python3.6/dist-packages/apex/normalization\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/contrib\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn/self_multihead_attn_func.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn/mask_softmax_dropout_func.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn/encdec_multihead_attn.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn/self_multihead_attn.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn/fast_encdec_multihead_attn_func.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn/fast_self_multihead_attn_func.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn/encdec_multihead_attn_func.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn/fast_self_multihead_attn_norm_add_func.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/multihead_attn/fast_encdec_multihead_attn_norm_add_func.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/contrib/sparsity\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/sparsity/asp.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/sparsity\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/sparsity/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/sparsity\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/sparsity/sparse_masklib.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/sparsity\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/optimizers/fused_adam.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/optimizers/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/optimizers/fused_sgd.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/optimizers/fp16_optimizer.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/optimizers/distributed_fused_lamb.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/optimizers/distributed_fused_adam_v3.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/optimizers/distributed_fused_adam_v2.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/optimizers/fused_lamb.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/optimizers/distributed_fused_adam.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/contrib/xentropy\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/xentropy/softmax_xentropy.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/xentropy\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/xentropy/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/xentropy\n", + " creating /usr/local/lib/python3.6/dist-packages/apex/contrib/groupbn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/groupbn/__init__.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/groupbn\n", + " copying build/lib.linux-x86_64-3.6/apex/contrib/groupbn/batch_norm.py -> /usr/local/lib/python3.6/dist-packages/apex/contrib/groupbn\n", + " copying build/lib.linux-x86_64-3.6/fused_layer_norm_cuda.cpython-36m-x86_64-linux-gnu.so -> /usr/local/lib/python3.6/dist-packages\n", + " copying build/lib.linux-x86_64-3.6/amp_C.cpython-36m-x86_64-linux-gnu.so -> /usr/local/lib/python3.6/dist-packages\n", + " copying build/lib.linux-x86_64-3.6/apex_C.cpython-36m-x86_64-linux-gnu.so -> /usr/local/lib/python3.6/dist-packages\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/mlp/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/mlp/mlp.py to mlp.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/parallel/LARC.py to LARC.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/parallel/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/parallel/sync_batchnorm_kernel.py to sync_batchnorm_kernel.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/parallel/optimized_sync_batchnorm.py to optimized_sync_batchnorm.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/parallel/distributed.py to distributed.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/parallel/sync_batchnorm.py to sync_batchnorm.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/parallel/optimized_sync_batchnorm_kernel.py to optimized_sync_batchnorm_kernel.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/parallel/multiproc.py to multiproc.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/optimizers/fused_adam.py to fused_adam.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/optimizers/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/optimizers/fused_sgd.py to fused_sgd.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/optimizers/fused_novograd.py to fused_novograd.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/optimizers/fused_adagrad.py to fused_adagrad.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/optimizers/fused_lamb.py to fused_lamb.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/RNN/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/RNN/models.py to models.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/RNN/cells.py to cells.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/RNN/RNNBackend.py to RNNBackend.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse/kernel.py to kernel.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse/db.py to db.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse/__main__.py to __main__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse/parse.py to parse.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/parse/nvvp.py to nvvp.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/nvtx/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/nvtx/nvmarker.py to nvmarker.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/reduction.py to reduction.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/usage.py to usage.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/data.py to data.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/prof.py to prof.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/blas.py to blas.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/pooling.py to pooling.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/index_slice_join_mutate.py to index_slice_join_mutate.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/randomSample.py to randomSample.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/convert.py to convert.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/normalization.py to normalization.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/activation.py to activation.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/__main__.py to __main__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/misc.py to misc.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/dropout.py to dropout.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/loss.py to loss.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/linear.py to linear.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/softmax.py to softmax.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/embedding.py to embedding.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/base.py to base.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/conv.py to conv.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/pointwise.py to pointwise.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/recurrentCell.py to recurrentCell.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/output.py to output.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/utility.py to utility.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/pyprof/prof/optim.py to optim.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/__version__.py to __version__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/lists/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/lists/functional_overrides.py to functional_overrides.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/lists/torch_overrides.py to torch_overrides.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/lists/tensor_overrides.py to tensor_overrides.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/utils.py to utils.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/amp.py to amp.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/compat.py to compat.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/_process_optimizer.py to _process_optimizer.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/_amp_state.py to _amp_state.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/_initialize.py to _initialize.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/opt.py to opt.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/handle.py to handle.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/rnn_compat.py to rnn_compat.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/frontend.py to frontend.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/scaler.py to scaler.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/amp/wrap.py to wrap.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/fp16_utils/fp16util.py to fp16util.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/fp16_utils/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/fp16_utils/fp16_optimizer.py to fp16_optimizer.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/fp16_utils/loss_scaler.py to loss_scaler.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/reparameterization/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/reparameterization/weight_norm.py to weight_norm.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/reparameterization/reparameterization.py to reparameterization.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/multi_tensor_apply/multi_tensor_apply.py to multi_tensor_apply.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/multi_tensor_apply/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/normalization/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/normalization/fused_layer_norm.py to fused_layer_norm.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn/self_multihead_attn_func.py to self_multihead_attn_func.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn/mask_softmax_dropout_func.py to mask_softmax_dropout_func.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn/encdec_multihead_attn.py to encdec_multihead_attn.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn/self_multihead_attn.py to self_multihead_attn.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn/fast_encdec_multihead_attn_func.py to fast_encdec_multihead_attn_func.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn/fast_self_multihead_attn_func.py to fast_self_multihead_attn_func.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn/encdec_multihead_attn_func.py to encdec_multihead_attn_func.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn/fast_self_multihead_attn_norm_add_func.py to fast_self_multihead_attn_norm_add_func.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/multihead_attn/fast_encdec_multihead_attn_norm_add_func.py to fast_encdec_multihead_attn_norm_add_func.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/sparsity/asp.py to asp.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/sparsity/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/sparsity/sparse_masklib.py to sparse_masklib.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers/fused_adam.py to fused_adam.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers/fused_sgd.py to fused_sgd.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers/fp16_optimizer.py to fp16_optimizer.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers/distributed_fused_lamb.py to distributed_fused_lamb.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers/distributed_fused_adam_v3.py to distributed_fused_adam_v3.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers/distributed_fused_adam_v2.py to distributed_fused_adam_v2.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers/fused_lamb.py to fused_lamb.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/optimizers/distributed_fused_adam.py to distributed_fused_adam.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/xentropy/softmax_xentropy.py to softmax_xentropy.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/xentropy/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/groupbn/__init__.py to __init__.cpython-36.pyc\n", + " byte-compiling /usr/local/lib/python3.6/dist-packages/apex/contrib/groupbn/batch_norm.py to batch_norm.cpython-36.pyc\n", + " running install_egg_info\n", + " running egg_info\n", + " creating apex.egg-info\n", + " writing apex.egg-info/PKG-INFO\n", + " writing dependency_links to apex.egg-info/dependency_links.txt\n", + " writing top-level names to apex.egg-info/top_level.txt\n", + " writing manifest file 'apex.egg-info/SOURCES.txt'\n", + " writing manifest file 'apex.egg-info/SOURCES.txt'\n", + " Copying apex.egg-info to /usr/local/lib/python3.6/dist-packages/apex-0.1-py3.6.egg-info\n", + " running install_scripts\n", + " writing list of installed files to '/tmp/pip-record-77lhozzn/install-record.txt'\n", + " Running setup.py install for apex ... \u001b[?25l\u001b[?25hdone\n", + " Removing source in /tmp/pip-req-build-usombg2r\n", + "Successfully installed apex-0.1\n", + "Cleaning up...\n", + "Removed build tracker '/tmp/pip-req-tracker-5zyf_ul2'\n", + "/content\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jurD3z-qttCa", + "colab_type": "text" + }, + "source": [ + "## Model Definition\n", + "\n", + "### Augmentations\n", + "We use Albumentations library for augmentations:\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2uQWb7k-umh9", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import albumentations as A\n", + "import numpy as np\n", + "from albumentations.pytorch import ToTensorV2\n", + "\n", + "def get_training_augmentation():\n", + " augmentations_train = A.Compose(\n", + " [\n", + " A.RandomResizedCrop(224, 224, scale=(0.8, 1.0)),\n", + " A.HorizontalFlip(),\n", + " A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ToTensorV2(),\n", + " ],\n", + " )\n", + " return lambda img: augmentations_train(image=np.array(img))\n", + "\n", + "\n", + "def get_test_augmentation():\n", + " augmentations_val = A.Compose(\n", + " [\n", + " A.SmallestMaxSize(256),\n", + " A.CenterCrop(224, 224),\n", + " A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n", + " ToTensorV2(),\n", + " ],\n", + " )\n", + " return lambda img: augmentations_val(image=np.array(img))\n" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TylQQ6w1uqLi", + "colab_type": "text" + }, + "source": [ + "### Extra Losses\n", + "Some of our tricks require the definition of custom loss functions:\n", + " " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2XaWriibum4a", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# MIT License\n", + "# Copyright (c) 2018 Haitong Li\n", + "\n", + "\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "\n", + "\n", + "# Based on https://github.com/peterliht/knowledge-distillation-pytorch/blob/master/model/net.py\n", + "class KnowledgeDistillationLoss(nn.Module):\n", + " def __init__(self, alpha, T, criterion):\n", + " super().__init__()\n", + " self.criterion = criterion\n", + " self.KLDivLoss = nn.KLDivLoss(reduction=\"batchmean\")\n", + " self.alpha = alpha\n", + " self.T = T\n", + "\n", + " def forward(self, input, target, teacher_target):\n", + " loss = self.KLDivLoss(\n", + " F.log_softmax(input / self.T, dim=1),\n", + " F.softmax(teacher_target / self.T, dim=1),\n", + " ) * (self.alpha * self.T * self.T) + self.criterion(input, target) * (\n", + " 1.0 - self.alpha\n", + " )\n", + " return loss\n", + "\n", + "\n", + "class MixUpAugmentationLoss(nn.Module):\n", + " def __init__(self, criterion):\n", + " super().__init__()\n", + " self.criterion = criterion\n", + "\n", + " def forward(self, input, target, *args):\n", + " # Validation step\n", + " if isinstance(target, torch.Tensor):\n", + " return self.criterion(input, target, *args)\n", + " target_a, target_b, lmbd = target\n", + " return lmbd * self.criterion(input, target_a, *args) + (\n", + " 1 - lmbd\n", + " ) * self.criterion(input, target_b, *args)\n", + "\n", + "\n", + "# Based on https://github.com/pytorch/pytorch/issues/7455\n", + "class LabelSmoothingLoss(nn.Module):\n", + " def __init__(self, n_classes, smoothing=0.0, dim=-1):\n", + " super(LabelSmoothingLoss, self).__init__()\n", + " self.confidence = 1.0 - smoothing\n", + " self.smoothing = smoothing\n", + " self.cls = n_classes\n", + " self.dim = dim\n", + "\n", + " def forward(self, output, target, *args):\n", + " output = output.log_softmax(dim=self.dim)\n", + " with torch.no_grad():\n", + " # Create matrix with shapes batch_size x n_classes\n", + " true_dist = torch.zeros_like(output)\n", + " # Initialize all elements with epsilon / N - 1\n", + " true_dist.fill_(self.smoothing / (self.cls - 1))\n", + " # Fill correct class for each sample in the batch with 1 - epsilon\n", + " true_dist.scatter_(1, target.data.unsqueeze(1), self.confidence)\n", + " return torch.mean(torch.sum(-true_dist * output, dim=self.dim))\n" + ], + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DfDvb7zpoCq8", + "colab_type": "text" + }, + "source": [ + "### Teacher model weights\n", + "If you're going to launch the experiment with the Knowledge Distillation technique\n", + "you should have a teacher model weights. We trained ResNet-50 and used this model as the teacher. Launch the code below to download our weights. You can skip this step if you don't want to use the KD (or use your own pretrained weights).\n", + "\n", + "**Note:** The usage of KD requires more time for training." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "3cUoEnR7ouUr", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 463 + }, + "outputId": "e02e996f-028b-43c5-e7a2-8eb97823373e" + }, + "source": [ + "!wget https://www.dropbox.com/s/za5eeyhhy6pmpd2/bag_of_tricks_resnet50_teacher.ckpt?dl=0 -O ./teacher.ckpt" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "text": [ + "--2020-09-03 09:48:23-- https://www.dropbox.com/s/za5eeyhhy6pmpd2/bag_of_tricks_resnet50_teacher.ckpt?dl=0\n", + "Resolving www.dropbox.com (www.dropbox.com)... 162.125.67.1, 2620:100:6023:1::a27d:4301\n", + "Connecting to www.dropbox.com (www.dropbox.com)|162.125.67.1|:443... connected.\n", + "HTTP request sent, awaiting response... 301 Moved Permanently\n", + "Location: /s/raw/za5eeyhhy6pmpd2/bag_of_tricks_resnet50_teacher.ckpt [following]\n", + "--2020-09-03 09:48:23-- https://www.dropbox.com/s/raw/za5eeyhhy6pmpd2/bag_of_tricks_resnet50_teacher.ckpt\n", + "Reusing existing connection to www.dropbox.com:443.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://uc0d44dd339ec3fdf4bc3ebc2ae6.dl.dropboxusercontent.com/cd/0/inline/A-qH_9fKzInWFiDcmlucWEbPJfv9R08WwhXgBkruuEGkZ8d_1sbBY-AkoWc4qhkjRCZtrPcIKtgAsVkcLGWcGGGS-qDCI4AoJlMWr5qzFWDQcxgZR9CIjJrtYJkoKIcojFk/file# [following]\n", + "--2020-09-03 09:48:24-- https://uc0d44dd339ec3fdf4bc3ebc2ae6.dl.dropboxusercontent.com/cd/0/inline/A-qH_9fKzInWFiDcmlucWEbPJfv9R08WwhXgBkruuEGkZ8d_1sbBY-AkoWc4qhkjRCZtrPcIKtgAsVkcLGWcGGGS-qDCI4AoJlMWr5qzFWDQcxgZR9CIjJrtYJkoKIcojFk/file\n", + "Resolving uc0d44dd339ec3fdf4bc3ebc2ae6.dl.dropboxusercontent.com (uc0d44dd339ec3fdf4bc3ebc2ae6.dl.dropboxusercontent.com)... 162.125.67.15, 2620:100:6023:15::a27d:430f\n", + "Connecting to uc0d44dd339ec3fdf4bc3ebc2ae6.dl.dropboxusercontent.com (uc0d44dd339ec3fdf4bc3ebc2ae6.dl.dropboxusercontent.com)|162.125.67.15|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: /cd/0/inline2/A-rvg7l0D7zSdsOEOgZ2xForZXswOF5RX8exu0_RlEeV6azD_BcJRDfUSWhXuaGKiQMIWLzmhWfcRWritZObSHw2NmaUDmS-5kRbgKDuX7guoYbhbkkjNSGItScuApPDifTWSyUxaeXw6qUkB5wakWxRrs239pCNTNIYqMZLoRkNr-EtQbvW1geTdH16sYtwbiwDGoaihqnuy7vohnQoRsjlww7UZJRCK51zgMwyOsyUyVns--xVt8n1WJ9aGW0wiJ1BRdakv3nItt7qx0iL9LnCrigOMegCXrxThqHPBvaEvH5voblDmK5Mmq7nGc67b30GDiRRRcVke0D3DbqzNBL2gVIZ_2N3_5h7paqsfLmnjQ/file [following]\n", + "--2020-09-03 09:48:24-- https://uc0d44dd339ec3fdf4bc3ebc2ae6.dl.dropboxusercontent.com/cd/0/inline2/A-rvg7l0D7zSdsOEOgZ2xForZXswOF5RX8exu0_RlEeV6azD_BcJRDfUSWhXuaGKiQMIWLzmhWfcRWritZObSHw2NmaUDmS-5kRbgKDuX7guoYbhbkkjNSGItScuApPDifTWSyUxaeXw6qUkB5wakWxRrs239pCNTNIYqMZLoRkNr-EtQbvW1geTdH16sYtwbiwDGoaihqnuy7vohnQoRsjlww7UZJRCK51zgMwyOsyUyVns--xVt8n1WJ9aGW0wiJ1BRdakv3nItt7qx0iL9LnCrigOMegCXrxThqHPBvaEvH5voblDmK5Mmq7nGc67b30GDiRRRcVke0D3DbqzNBL2gVIZ_2N3_5h7paqsfLmnjQ/file\n", + "Reusing existing connection to uc0d44dd339ec3fdf4bc3ebc2ae6.dl.dropboxusercontent.com:443.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 282922606 (270M) [application/octet-stream]\n", + "Saving to: ‘./teacher.ckpt’\n", + "\n", + "./teacher.ckpt 100%[===================>] 269.82M 24.5MB/s in 11s \n", + "\n", + "2020-09-03 09:48:36 (24.6 MB/s) - ‘./teacher.ckpt’ saved [282922606/282922606]\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WLq2vpLWuuTc", + "colab_type": "text" + }, + "source": [ + "### Model\n", + "In PyTorch-Lightning framework we should define a class which inherits from `LightningModule` and overwrite some methods:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "HqETxZpouLGt", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import warnings\n", + "from typing import Dict\n", + "\n", + "import pytorch_lightning as pl\n", + "from torch.utils.data import DataLoader\n", + "from torchvision.datasets import ImageFolder\n", + "\n", + "\n", + "class LitFood101(pl.LightningModule):\n", + " def __init__(self, model, config):\n", + " super().__init__()\n", + " self.model = model\n", + " self.config = config\n", + " # We need to specify a number of classes there to avoid the RuntimeError\n", + " # See https://github.com/PyTorchLightning/pytorch-lightning/issues/3006\n", + " # However, we will get another warning and it should be handled in forward steps\n", + " self.metric = pl.metrics.Accuracy(num_classes=self.config.num_classes)\n", + " dim_feats = self.model.fc.in_features # =2048\n", + " nb_classes = self.config.num_classes\n", + " self.model.fc = nn.Linear(dim_feats, nb_classes)\n", + "\n", + " def forward(self, x):\n", + " return self.model(x)\n", + "\n", + " def setup(self, stage):\n", + " if self.config.use_smoothing:\n", + " self.criterion = LabelSmoothingLoss(\n", + " self.config.num_classes, self.config.smoothing,\n", + " )\n", + " else:\n", + " self.criterion = nn.CrossEntropyLoss()\n", + "\n", + " if self.config.use_mixup:\n", + " self.criterion = MixUpAugmentationLoss(self.criterion)\n", + "\n", + " def on_epoch_start(self):\n", + " self.previous_batch = [None, None]\n", + "\n", + " def training_step(self, batch, *args):\n", + " x, y = batch[0][\"image\"], batch[1]\n", + " if self.args.use_mixup:\n", + " mixup_x, *mixup_y = self.mixup_batch(x, y, *self.previous_batch)\n", + " logits = self(mixup_x)\n", + " loss = self.criterion(logits, mixup_y)\n", + " else:\n", + " logits = self(x)\n", + " loss = self.criterion(logits, y)\n", + " # We ignore a warning about a mismatch between a number of predicted classes\n", + " # and a number of initialized for Accuracy class\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " accuracy = self.metric(logits.argmax(dim=-1), y)\n", + " tensorboard_logs = {\"train_loss\": loss, \"train_acc\": accuracy}\n", + " self.previous_batch = [x, y]\n", + "\n", + " return {\"loss\": loss, \"progress_bar\": tensorboard_logs, \"log\": tensorboard_logs}\n", + "\n", + " def validation_step(self, batch, *args):\n", + " x, y = batch[0][\"image\"], batch[1]\n", + " logits = self(x)\n", + " val_loss = self.criterion(logits, y)\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " val_accuracy = self.metric(logits.argmax(dim=-1), y)\n", + " return {\"val_loss\": val_loss, \"val_acc\": val_accuracy}\n", + "\n", + " def test_step(self, batch, *args):\n", + " x, y = batch[0][\"image\"], batch[1]\n", + " logits = self(x)\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " test_accuracy = self.metric(logits.argmax(dim=-1), y)\n", + " return {\"test_acc\": test_accuracy}\n", + "\n", + " def validation_epoch_end(self, outputs):\n", + " avg_loss = torch.stack([x[\"val_loss\"] for x in outputs]).mean()\n", + " avg_accuracy = torch.stack([x[\"val_acc\"] for x in outputs]).mean()\n", + " tensorboard_logs = {\"val_loss\": avg_loss, \"val_acc\": avg_accuracy}\n", + " return {\n", + " \"avg_val_loss\": avg_loss,\n", + " \"avg_val_acc\": avg_accuracy,\n", + " \"log\": tensorboard_logs,\n", + " }\n", + "\n", + " def test_epoch_end(self, outputs):\n", + " avg_accuracy = torch.stack([x[\"test_acc\"] for x in outputs]).mean()\n", + " return {\"avg_test_acc\": avg_accuracy.item()}\n", + "\n", + " def configure_optimizers(self):\n", + " optimizer = torch.optim.Adam(self.model.parameters(), lr=self.config.lr)\n", + " if self.config.use_cosine_scheduler:\n", + " scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(\n", + " optimizer, T_max=self.config.max_epochs, eta_min=0.0,\n", + " )\n", + " else:\n", + " scheduler = torch.optim.lr_scheduler.MultiStepLR(\n", + " optimizer, milestones=self.config.milestones,\n", + " )\n", + " return [optimizer], [scheduler]\n", + "\n", + " def train_dataloader(self):\n", + " train_dataset = ImageFolder(\n", + " os.path.join('/content/food-101/food-101', \"train\"),\n", + " transform=get_training_augmentation(),\n", + " )\n", + "\n", + " return DataLoader(\n", + " train_dataset,\n", + " batch_size=self.config.batch_size,\n", + " shuffle=True,\n", + " num_workers=self.config.workers,\n", + " pin_memory=True,\n", + " )\n", + "\n", + " def val_dataloader(self):\n", + " val_dataset = ImageFolder(\n", + " os.path.join('/content/food-101/food-101', \"test\"),\n", + " transform=get_test_augmentation(),\n", + " )\n", + " return DataLoader(\n", + " val_dataset,\n", + " batch_size=32,\n", + " shuffle=False,\n", + " num_workers=self.config.workers,\n", + " pin_memory=True,\n", + " )\n", + "\n", + " def test_dataloader(self):\n", + " return self.val_dataloader()\n", + "\n", + " def optimizer_step(self, epoch, batch_idx, optimizer, *args, **kwargs):\n", + " # Learning Rate warm-up\n", + " if self.config.warmup != -1 and epoch < self.config.warmup:\n", + " lr = self.config.lr * (epoch + 1) / self.config.warmup\n", + " for pg in optimizer.param_groups:\n", + " pg[\"lr\"] = lr\n", + "\n", + " self.logger.log_metrics({\"lr\": optimizer.param_groups[0][\"lr\"]}, step=epoch)\n", + " optimizer.step()\n", + " optimizer.zero_grad()\n", + "\n", + " def mixup_batch(self, x, y, x_previous, y_previous):\n", + " lmbd = (\n", + " np.random.beta(self.config.mixup_alpha, self.config.mixup_alpha)\n", + " if self.config.mixup_alpha > 0\n", + " else 1\n", + " )\n", + " if x_previous is None:\n", + " x_previous = torch.empty_like(x).copy_(x)\n", + " y_previous = torch.empty_like(y).copy_(y)\n", + " batch_size = x.size(0)\n", + " index = torch.randperm(batch_size)\n", + " # If current batch size != previous batch size, we take only a part of the previous batch\n", + " x_previous = x_previous[:batch_size, ...]\n", + " y_previous = y_previous[:batch_size, ...]\n", + " x_mixed = lmbd * x + (1 - lmbd) * x_previous[index, ...]\n", + " y_a, y_b = y, y_previous[index]\n", + " return x_mixed, y_a, y_b, lmbd\n", + "\n", + "\n", + "class LitFood101KD(LitFood101):\n", + " def __init__(self, model, teacher, config):\n", + " super().__init__(model, config)\n", + " self.teacher = teacher\n", + " dim_feats = self.teacher.fc.in_features # =2048\n", + " nb_classes = self.config.num_classes\n", + " self.teacher.fc = nn.Linear(dim_feats, nb_classes)\n", + " teacher_checkpoint = torch.load(\"./teacher.ckpt\")\n", + " self.teacher.load_state_dict(teacher_checkpoint[\"state_dict\"])\n", + "\n", + " def setup(self, stage):\n", + " criterion = (\n", + " LabelSmoothingLoss(self.config.num_classes, self.config.smoothing)\n", + " if self.config.use_smoothing\n", + " else nn.CrossEntropyLoss()\n", + " )\n", + " self.criterion = KnowledgeDistillationLoss(\n", + " self.config.distill_alpha, self.config.distill_temperature, \n", + " criterion=criterion,\n", + " )\n", + " if self.config.use_mixup:\n", + " self.criterion = MixUpAugmentationLoss(self.criterion)\n", + " self.teacher.eval()\n", + "\n", + " def training_step(self, batch, *args):\n", + " x, y = batch[0][\"image\"], batch[1]\n", + " with torch.no_grad():\n", + " teacher_output = self.teacher(x)\n", + "\n", + " if self.config.use_mixup:\n", + " mixup_x, *mixup_y = self.mixup_batch(x, y, *self.previous_batch)\n", + " logits = self(mixup_x)\n", + " loss = self.criterion(logits, mixup_y, teacher_output)\n", + " else:\n", + " logits = self(x)\n", + " loss = self.criterion(logits, y, teacher_output)\n", + "\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " accuracy = self.metric(logits.argmax(dim=-1), y)\n", + " tensorboard_logs = {\"train_loss\": loss, \"train_acc\": accuracy}\n", + "\n", + " return {\"loss\": loss, \"progress_bar\": tensorboard_logs, \"log\": tensorboard_logs}\n", + "\n", + " def validation_step(self, batch, *args):\n", + " x, y = batch[0][\"image\"], batch[1]\n", + " logits = self(x)\n", + " with torch.no_grad():\n", + " teacher_output = self.teacher(x)\n", + " val_loss = self.criterion(logits, y, teacher_output)\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " val_accuracy = self.metric(logits.argmax(dim=-1), y)\n", + " return {\"val_loss\": val_loss, \"val_acc\": val_accuracy}\n", + "\n", + " def test_step(self, batch, *args):\n", + " x, y = batch[0][\"image\"], batch[1]\n", + " logits = self(x)\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " test_accuracy = self.metric(logits.argmax(dim=-1), y)\n", + " return {\"test_acc\": test_accuracy}\n", + "\n" + ], + "execution_count": 10, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ifstsk5uvKgf", + "colab_type": "text" + }, + "source": [ + "## Training\n", + "In the cell below you can set up the training process. Change values in the dictionary to turn on tricks and adjust hyperparameters." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "WCE5BDDivgSR", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from dataclasses import dataclass\n", + "\n", + "@dataclass\n", + "class Config:\n", + " workers: int = 4 # Number of data loading workers\n", + " use_smoothing: bool = True # Use label smoothing trick\n", + " smoothing: float = 0.2 # Coefficient for label smoothing (from 0.0 (no smoothing) to 1.0)\n", + " use_mixup: bool = True # Use mixup augmentation during training\n", + " mixup_alpha: float = 0.2 # Alpha value for mixup augmentation\n", + " use_cosine_scheduler: bool = True # Use Cosine LR Scheduler instead of MultiStep\n", + " batch_size: int = 32 # Mini-batch size\n", + " lr: float = 1e-4 # Initial learning rate\n", + " milestones: tuple = (15, 30) # Milestones for dropping the LR\n", + " warmup: int = 6 # Number of epochs to warm up the LR. -1 to turn off\n", + " max_epochs: int = 40 # Max number of epochs\n", + " amp_level: str = 'O1' # Apex optimization level\n", + " num_classes: int = 21 # Number of classes in the dataset\n", + " use_knowledge_distillation: bool = True # Use knowledge distillation from resnet-50\n", + " distill_alpha: float = 0.5 # Distillation strength\n", + " distill_temperature: int = 20 # Temperature hyper-parameter to make the outputs smoother for KD\n" + ], + "execution_count": 11, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "p--qKeBn2Suq", + "colab_type": "text" + }, + "source": [ + "Load the tensorboard:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ZGQ8JTJX2VpG", + "colab_type": "code", + "colab": { + "resources": { + "https://localhost:6006/": { + "data": "PCFkb2N0eXBlIGh0bWw+PCEtLQpAbGljZW5zZQpDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLT48aHRtbCBsYW5nPSJlbiI+PG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDx0aXRsZT5UZW5zb3JCb2FyZDwvdGl0bGU+CiAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQU1RQUFBREVDQU1BQUFEM2VINVpBQUFBQkdkQlRVRUFBTEdQQy94aEJRQUFBQUZ6VWtkQ0FLN09IT2tBQUFEL1VFeFVSZkZsS2ZhRUx2Rm1LZk55Sy82N052V0FMZjY4TnY2OU52TnhLLzIwTmZ5eU5QMjJOZk4wSy9Kckt2cWhNdjJ6TmYyNU5mMjROZjIzTmZlT0wveXpOUHl2TlBKb0t2aVdNUG1lTWZOMUsvV0JMZmVQTC9GbktmZU1ML3FsTXZSN0xQbWNNZmVMTC9hSkx2UjVMUEZvS2ZKdUt2UjNMUDY2TnZ5d05QZU5ML1YvTGZhSUx2MjFOZjI2TmZOeksvTnZLL1I2TFBtYU1meXhOUHFmTXZWK0xmdXJNL2lTTVBtYk1mSnZLdm1kTWZ1bU0vcWlNdm1aTWZ5dE5QSnFLdnlzTlBOMksvaVlNUE53Sy91cE0vSnRLdkpzS3ZpVk1QYUhMdmFHTHZKcEt2UjhMUGFLTHZxa012dXFNL2FGTHZSNExQdW9NL2lUTVBXRExmaVJNUG1ZTVhTMG5na0FBQUxvU1VSQlZIamE3ZHJuY3RwQUZJYmhGVUlTU0tKM01LWWEwK3k0eFRXOTkzNy8xNUprSmhsVGpoclNySFJtdnVmL2FzNkwwWUxGQ2dFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUJKNm5qZW5xc3B6Z25QcnNyR1g5WnBpMnRDcm1uYzYrZFlOdGhWWTVXcE1teFFMV1BkTXNPdVlWd3pOajNlaTJ0M21Rd2FWNDNCSlBEQ1MyTmJKNWFFZXVYLys5cWNqUU90ZkZJa0lrcnZZMmc0TVZjbU9Cc0ZXYm93S08va055ajYyZ1JwSmNEYVBCbHhMcjFCMHpkRzBDLzhMemJKaUpyc2h1dnkxZ3psQTkrckQ4bUlrdXlJSmpGRTMvZHFuWXdvU203SVVFUG9EL3d1dDhpSWd1U0lEamxGeGUveWZYTDV2dVNJMjFCVFpMTGhYb09JTE1POEh4d2EvTDhiSTBMZm1VZGhHb3diMlp2VDBlNTdwRk5EZ0IwNklsVnlqbW1JQmwyVC9ubDlSdzZTRDlHZ1NHL1EwdVFrYVczWGhtb3ZLUTNlRlE0TjJVbzlPUTFlRlpzTmVyZjd2UCtyTzRyaG1ZMUxnM3ZGVm9QOCs4QlhnMXNGbndibkNrNE5UaFc4R3VpS0JEZGtWVnRUTkZ2TmVsVnNOcVRieVduSU9NMm9lVFJveVd2d21wSkhnL3VjWEJyY0p1WFQ0RHdycHdaaTJ2eTBWQ3g4WXRYZy9EMmJVNE9maXVRM2VGZkUyS0Q0YmZDcWlMTkI5OTNnWHNHbHdhMkNUNE56QmFjR0lWUTZZc2lwUWRoMHhFZE9EVUtqSXhyU3A4OG9uWjh6YmJGTGcxRG9pRk81Qlh2REd2Mk15OS9KaFVUOEpVWlRJMHlEYU5ITEJ6SWJ2cVRETlloVWlWdy9rZGpRMWtNMkNIRkRQaktXK0t6eVJURjBnL2dhOXc5eStmQU5RcHh2WDhDVStOeTdGVVdEZUYzWStnM2xST0lmNGswVURYOWVDeXZPNTMxUHlZaEhnYTl6dlBaSlU1YjczWS9lWGo4SHY5RDQ4bjZIYUY1TGJjalJ0OFRaVHRkYTVNMURmWG5ia1gxQzBTSENGS3pRQjVGZThvcDRHTkdOSGF2dlpFU2JWd1Q1cjZXMXh5dUNQQlkzWTlZZ0RxemtuSC9lM1lmTnp6dUwzMGwwSWViclo1a0t0dURJWHQxbjg2OEVUNmtmMy80OXRMdnJDY1p5RjhQdTIxNWRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWNQSWJOckJoT2FCWHVjb0FBQUFBU1VWT1JLNUNZSUk9Ij4KICA8bGluayByZWw9ImFwcGxlLXRvdWNoLWljb24iIGhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBTVFBQUFERUNBTUFBQUQzZUg1WkFBQUFCR2RCVFVFQUFMR1BDL3hoQlFBQUFBRnpVa2RDQUs3T0hPa0FBQUQvVUV4VVJmRmxLZmFFTHZGbUtmTnlLLzY3TnZXQUxmNjhOdjY5TnZOeEsvMjBOZnl5TlAyMk5mTjBLL0pyS3ZxaE12MnpOZjI1TmYyNE5mMjNOZmVPTC95ek5QeXZOUEpvS3ZpV01QbWVNZk4xSy9XQkxmZVBML0ZuS2ZlTUwvcWxNdlI3TFBtY01mZUxML2FKTHZSNUxQRm9LZkp1S3ZSM0xQNjZOdnl3TlBlTkwvVi9MZmFJTHYyMU5mMjZOZk56Sy9OdksvUjZMUG1hTWZ5eE5QcWZNdlYrTGZ1ck0vaVNNUG1iTWZKdkt2bWRNZnVtTS9xaU12bVpNZnl0TlBKcUt2eXNOUE4ySy9pWU1QTndLL3VwTS9KdEt2SnNLdmlWTVBhSEx2YUdMdkpwS3ZSOExQYUtMdnFrTXZ1cU0vYUZMdlI0TFB1b00vaVRNUFdETGZpUk1QbVlNWFMwbmdrQUFBTG9TVVJCVkhqYTdkcm5jdHBBRkliaEZVSVNTS0ozTUtZYTAreTR4VFc5OTM3LzE1SmtKaGxUamhyU3JIUm12dWYvYXM2TDBZTEZDZ0VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNQko2bmplbnFzcHpnblByc3JHWDlacGkydENybW5jNitkWU50aFZZNVdwTW14UUxXUGRNc091WVZ3ek5qM2VpMnQzbVF3YVY0M0JKUERDUzJOYko1YUVldVgvKzlxY2pRT3RmRklrSWtydlkyZzRNVmNtT0JzRldib3dLTy9rTnlqNjJnUnBKY0RhUEJseExyMUIwemRHMEMvOEx6YkppSnJzaHV2eTFnemxBOStyRDhtSWt1eUlKakZFMy9kcW5Zd29TbTdJVUVQb0Qvd3V0OGlJZ3VTSURqbEZ4ZS95ZlhMNXZ1U0kyMUJUWkxMaFhvT0lMTU84SHh3YS9MOGJJMExmbVVkaEdvd2IyWnZUMGU1N3BGTkRnQjA2SWxWeWptbUlCbDJUL25sOVJ3NlNEOUdnU0cvUTB1UWthVzNYaG1vdktRM2VGUTROMlVvOU9RMWVGWnNOZXJmN3ZQK3JPNHJobVkxTGczdkZWb1A4KzhCWGcxc0Zud2JuQ2s0TlRoVzhHdWlLQkRka1ZWdFRORnZOZWxWc05xVGJ5V25JT00yb2VUUm95V3Z3bXBKSGcvdWNYQnJjSnVYVDREd3Jwd1ppMnZ5MFZDeDhZdFhnL0QyYlU0T2ZpdVEzZUZmRTJLRDRiZkNxaUxOQjk5M2dYc0dsd2EyQ1Q0TnpCYWNHSVZRNllzaXBRZGgweEVkT0RVS2pJeHJTcDg4b25aOHpiYkZMZzFEb2lGTzVCWHZER3YyTXk5L0poVVQ4SlVaVEkweURhTkhMQnpJYnZxVEROWWhVaVZ3L2tkalExa00yQ0hGRFBqS1crS3p5UlRGMGcvZ2E5dzl5K2ZBTlFweHZYOENVK055N0ZVV0RlRjNZK2czbFJPSWY0azBVRFg5ZUN5dk81MzFQeVloSGdhOXp2UFpKVTViNzNZL2VYajhIdjlENDhuNkhhRjVMYmNqUnQ4VFpUdGRhNU0xRGZYbmJrWDFDMFNIQ0ZLelFCNUZlOG9wNEdOR05IYXZ2WkVTYlZ3VDVyNlcxeHl1Q1BCWTNZOVlnRHF6a25IL2UzWWZOenp1TDMwbDBJZWJyWjVrS3R1RElYdDFuODY4RVQ2a2YzLzQ5dEx2ckNjWnlGOFB1MjE1ZEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBY1BJYk5yQmhPYUJYdWNvQUFBQUFTVVZPUks1Q1lJST0iPgoKICAKICAKICAKCiAgCgogIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAgPHN0eWxlPgpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3VZRUNNS29IY085eDF3ZG1ieUhJbTMtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9zVGRhQTZqMFBzYjkyMFZqdi1tcnpILV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vX1ZZRngtczgyNGtYcV9VbDJCSHFZSC1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vdG5qNFNCNkROYmRhUW5zTThDRnFCWC1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vb01NZ2ZaTVF0aE9yeVFvOW4yMmRjdXZ2RGluMXBLOGFLdGVMcGVaNWMwQS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vS3NfY1Z4aUNpd1VXVnNGV0ZBM0Jqbi1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9OSjR2eGxnV3dXYkVzdjE4ZEFocW5uLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL2lzWi13YkNYTktBYm5qbzZfVHdIVG9YMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvLzc3RlhGalJiR3pONGFDclNGaGxoM29YMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL2pTTjJDR1ZEYmNWeUNuZkpmalNkZklYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vVVg2aTRKeFFEbTNmVlRjMUNQdXdxb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9kLTZJWXBsT0ZvY0NhY0t6eHdYU09KQncxeFUxcktwdEpqXzBqYW5zOTIwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvLzk3dWFoeGlxWlJvbmNCYUNFSTNhVzRYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9Qd1pjLVliSUw0MTR3QjlyQjFJQVBZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0MxNHNZWWRKZzVkVTJxekpFVlN1dGEwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDX1pyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQ3d0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzFCVzI2UXhwU2otX1pLbV94VDRoV3cud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzRncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDOURpTnNSNWEtOU9lX0l2cHU4WFdsWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT3BYVXFUbzBVZ1FRaEdqX1NGZExXQmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL1d4clhKYTBDM0tkdEM3bE1hZkc0ZFJrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9jREtoUmFYblFUT1ZiYW94d2RPcjl4a0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by8xaFpmMDJQT0FOaDMyazJWa2dFb1VCa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by92UGN5blNMMHFIcV82ZFg3bEtWQnlYWWhqYlNwdmM0N2VlNnhSXzgwSG53LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by92U3p1bGZLU0swTExqamZlYXhjUkVoa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL0syM2N4V1ZUcklGRDZESnNFVmkwN1JrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9GbDR5MFFkT3h5eVRIRUdNWFg4a2NZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvLzBlQzZmbDA2bHVYRVlXcEJTSnZYQ0lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vSTNTMXdzZ1NnOVlDdXJWNlBVa1RPWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvLy1MMTRKazA2bTZwVUhCLTVtWFFRbllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9IZ28xM2stdGZTcG4wcWkxU0ZkVWZaQncxeFUxcktwdEpqXzBqYW5zOTIwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vUHJ1MzNxalNocFpTbUczejZWWXduWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vTllEV0JkRDRnSXEyNkc1WFliSHNGSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQxNHNZWWRKZzVkVTJxekpFVlN1dGEwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXRfWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXR3dF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDFCVzI2UXhwU2otX1pLbV94VDRoV3cud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0NGdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ2RThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0OURpTnNSNWEtOU9lX0l2cHU4WFdsWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vb0hpMzBrd1FXdnBDV3FBaHpIY0NTSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL1pMcUtlZWxZYkFURzYwRXBaQlNEeTRYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9teDlVY2s2dUI2M1ZJS0ZZbkVNWHJZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9yR3ZIZEpucjJsNzVxYjBZTkQ5TnlJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9SeFpKZG56ZW8zUjV6U2V4Z2U4VVVaQncxeFUxcktwdEpqXzBqYW5zOTIwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9vT2VGd1pObHJUZWZ6TFltbFZWMVVJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL21ibWhwck1INjlaaTZlRVBCWVZGaFlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBWNHNZWWRKZzVkVTJxekpFVlN1dGEwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMGZacmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwUXRfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFZCVzI2UXhwU2otX1pLbV94VDRoV3cud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBZZ3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwYUU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwZERpTnNSNWEtOU9lX0l2cHU4WFdsWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFkxNHNZWWRKZzVkVTJxekpFVlN1dGEwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFlfWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFl3dF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTFCVzI2UXhwU2otX1pLbV94VDRoV3cud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZNGdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk2RThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZOURpTnNSNWEtOU9lX0l2cHU4WFdsWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejF4LU0xSTF3NU9NaXFuVkY4eEJMaFUud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6d1hhQVh1cDVtWmxmSzZ4UkxyaHNjby53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rnp3bjZXcXhvLXh3eGlsRFhQVThjaFZVLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6MVQ3YUpMSzZuS3BuMzZJTXdUY01NYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGel83OV9adVV4Q2lnTTJEZXNwVG5GYXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rno0Z2Q5T0VQVUNOM0FkWVcwZTh0YXQ0LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rno4YklRU1labldMYVdDOVFOQ3BUS19VLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KPC9zdHlsZT4KCgo8c3R5bGU+CiAgaHRtbCwKICBib2R5IHsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmOwogIH0KPC9zdHlsZT4KCiAgCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIFtoaWRkZW5dIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tbGF5b3V0OiB7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1pbmxpbmU6IHsKICAgICAgICBkaXNwbGF5OiAtbXMtaW5saW5lLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtZmxleDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWhvcml6b250YWw6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsLXJldmVyc2U6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcDogewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcC1yZXZlcnNlOiB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LWF1dG86IHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtbm9uZTogewogICAgICAgIC1tcy1mbGV4OiBub25lOwogICAgICAgIC13ZWJraXQtZmxleDogbm9uZTsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleDogewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMjogewogICAgICAgIC1tcy1mbGV4OiAyOwogICAgICAgIC13ZWJraXQtZmxleDogMjsKICAgICAgICBmbGV4OiAyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0zOiB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTQ6IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNTogewogICAgICAgIC1tcy1mbGV4OiA1OwogICAgICAgIC13ZWJraXQtZmxleDogNTsKICAgICAgICBmbGV4OiA1OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC02OiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTc6IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtODogewogICAgICAgIC1tcy1mbGV4OiA4OwogICAgICAgIC13ZWJraXQtZmxleDogODsKICAgICAgICBmbGV4OiA4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC05OiB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEwOiB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTExOiB7CiAgICAgICAgLW1zLWZsZXg6IDExOwogICAgICAgIC13ZWJraXQtZmxleDogMTE7CiAgICAgICAgZmxleDogMTE7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEyOiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH07CgogICAgICAvKiBhbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlcjogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWJhc2VsaW5lOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfTsKCiAgICAgIC8qIGFsaWdubWVudCBpbiBtYWluIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1hcm91bmQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItY2VudGVyOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfTsKCiAgICAgIC8qIHNlbGYgYWxpZ25tZW50ICovCgogICAgICAtLWxheW91dC1zZWxmLXN0YXJ0OiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWNlbnRlcjogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1lbmQ6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtc3RyZXRjaDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1iYXNlbGluZTogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9OwoKICAgICAgLyogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYmV0d2Vlbi1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYXJvdW5kLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH07CgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgT3RoZXIgTGF5b3V0CiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAtLWxheW91dC1ibG9jazogewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaW52aXNpYmxlOiB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1yZWxhdGl2ZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpdDogewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zY3JvbGw6IHsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH07CgogICAgICAtLWxheW91dC1mdWxsYmxlZWQ6IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfTsKCiAgICAgIC8qIGZpeGVkIHBvc2l0aW9uICovCgogICAgICAtLWxheW91dC1maXhlZC10b3A6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1yaWdodDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtYm90dG9tOiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtbGVmdDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItcmlwcGxlIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CgogICAgICAgIC8qIFNlZSBQb2x5bWVyRWxlbWVudHMvcGFwZXItYmVoYXZpb3JzL2lzc3Vlcy8zNC4gT24gbm9uLUNocm9tZSBicm93c2VycywKICAgICAgICAgKiBjcmVhdGluZyBhIG5vZGUgKHdpdGggYSBwb3NpdGlvbjphYnNvbHV0ZSkgaW4gdGhlIG1pZGRsZSBvZiBhbiBldmVudAogICAgICAgICAqIGhhbmRsZXIgImludGVycnVwdHMiIHRoYXQgZXZlbnQgaGFuZGxlciAod2hpY2ggaGFwcGVucyB3aGVuIHRoZQogICAgICAgICAqIHJpcHBsZSBpcyBjcmVhdGVkIG9uIGRlbWFuZCkgKi8KICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGluZ10pIHsKICAgICAgICAvKiBUaGlzIHJlc29sdmVzIGEgcmVuZGVyaW5nIGlzc3VlIGluIENocm9tZSAoYXMgb2YgNDApIHdoZXJlIHRoZQogICAgICAgICAgIHJpcHBsZSBpcyBub3QgcHJvcGVybHkgY2xpcHBlZCBieSBpdHMgcGFyZW50ICh3aGljaCBtYXkgaGF2ZQogICAgICAgICAgIHJvdW5kZWQgY29ybmVycykuIFNlZTogaHR0cDovL2pzYmluLmNvbS90ZW1leGEvNAoKICAgICAgICAgICBOb3RlOiBXZSBvbmx5IGFwcGx5IHRoaXMgc3R5bGUgY29uZGl0aW9uYWxseS4gT3RoZXJ3aXNlLCB0aGUgYnJvd3NlcgogICAgICAgICAgIHdpbGwgY3JlYXRlIGEgbmV3IGNvbXBvc2l0aW5nIGxheWVyIGZvciBldmVyeSByaXBwbGUgZWxlbWVudCBvbiB0aGUKICAgICAgICAgICBwYWdlLCBhbmQgdGhhdCB3b3VsZCBiZSBiYWQuICovCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgI3dhdmVzLAogICAgICAud2F2ZS1jb250YWluZXIsCiAgICAgIC53YXZlIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgLndhdmUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgICN3YXZlcywKICAgICAgLndhdmUgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC53YXZlLWNvbnRhaW5lciwKICAgICAgLndhdmUgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNpcmNsZSkgI2JhY2tncm91bmQsCiAgICAgIDpob3N0KC5jaXJjbGUpICN3YXZlcyB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICA6aG9zdCguY2lyY2xlKSAud2F2ZS1jb250YWluZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iYmFja2dyb3VuZCI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ3YXZlcyI+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAtLXNoYWRvdy10cmFuc2l0aW9uOiB7CiAgICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjI4cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctbm9uZTogewogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgIH07CgogICAgICAvKiBmcm9tIGh0dHA6Ly9jb2RlcGVuLmlvL3NoeW5kbWFuL3Blbi9jNTM5NGRkZjJlOGIyYTVjOTE4NTkwNGI1NzQyMWNkYiAqLwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tM2RwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAzcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi00ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi02ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDZweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCAxOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0xMmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAxMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCA0cHggMjJweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgIDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgIDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTI0ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCwgaHRtbCB7CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbDogewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLThkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICB9OwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbCksIC5wYXBlci1tYXRlcmlhbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSksIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIC8qIE5lZWQgdG8gc3BlY2lmeSB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyB0aGUgc3R5bGVzIGltcG9ydGVkIGZyb20gcGFwZXItbWF0ZXJpYWwuICovCiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1pbi13aWR0aDogNS4xNGVtOwogICAgICAgIG1hcmdpbjogMCAwLjI5ZW07CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIG91dGxpbmUtd2lkdGg6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgcGFkZGluZzogMC43ZW0gMC41N2VtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMpIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tcmFpc2VkLWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtyYWlzZWRdKS5rZXlib2FyZC1mb2N1cykgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1mbGF0LWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgYmFja2dyb3VuZDogI2VhZWFlYTsKICAgICAgICBjb2xvcjogI2E4YThhODsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1idXR0b24taW5rLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZm9yIEdvb2dsZSBwcm9kdWN0cyAqLwoKICAgICAgLS1nb29nbGUtcmVkLTEwMDogI2Y0YzdjMzsKICAgICAgLS1nb29nbGUtcmVkLTMwMDogI2U2N2M3MzsKICAgICAgLS1nb29nbGUtcmVkLTUwMDogI2RiNDQzNzsKICAgICAgLS1nb29nbGUtcmVkLTcwMDogI2M1MzkyOTsKCiAgICAgIC0tZ29vZ2xlLWJsdWUtMTAwOiAjYzZkYWZjOwogICAgICAtLWdvb2dsZS1ibHVlLTMwMDogIzdiYWFmNzsKICAgICAgLS1nb29nbGUtYmx1ZS01MDA6ICM0Mjg1ZjQ7CiAgICAgIC0tZ29vZ2xlLWJsdWUtNzAwOiAjMzM2N2Q2OwoKICAgICAgLS1nb29nbGUtZ3JlZW4tMTAwOiAjYjdlMWNkOwogICAgICAtLWdvb2dsZS1ncmVlbi0zMDA6ICM1N2JiOGE7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTUwMDogIzBmOWQ1ODsKICAgICAgLS1nb29nbGUtZ3JlZW4tNzAwOiAjMGI4MDQzOwoKICAgICAgLS1nb29nbGUteWVsbG93LTEwMDogI2ZjZThiMjsKICAgICAgLS1nb29nbGUteWVsbG93LTMwMDogI2Y3Y2I0ZDsKICAgICAgLS1nb29nbGUteWVsbG93LTUwMDogI2Y0YjQwMDsKICAgICAgLS1nb29nbGUteWVsbG93LTcwMDogI2YwOTMwMDsKCiAgICAgIC0tZ29vZ2xlLWdyZXktMTAwOiAjZjVmNWY1OwogICAgICAtLWdvb2dsZS1ncmV5LTMwMDogI2UwZTBlMDsKICAgICAgLS1nb29nbGUtZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tZ29vZ2xlLWdyZXktNzAwOiAjNjE2MTYxOwoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZnJvbSBvbmxpbmUgc3BlYyBkb2N1bWVudCAqLwoKICAgICAgLS1wYXBlci1yZWQtNTA6ICNmZmViZWU7CiAgICAgIC0tcGFwZXItcmVkLTEwMDogI2ZmY2RkMjsKICAgICAgLS1wYXBlci1yZWQtMjAwOiAjZWY5YTlhOwogICAgICAtLXBhcGVyLXJlZC0zMDA6ICNlNTczNzM7CiAgICAgIC0tcGFwZXItcmVkLTQwMDogI2VmNTM1MDsKICAgICAgLS1wYXBlci1yZWQtNTAwOiAjZjQ0MzM2OwogICAgICAtLXBhcGVyLXJlZC02MDA6ICNlNTM5MzU7CiAgICAgIC0tcGFwZXItcmVkLTcwMDogI2QzMmYyZjsKICAgICAgLS1wYXBlci1yZWQtODAwOiAjYzYyODI4OwogICAgICAtLXBhcGVyLXJlZC05MDA6ICNiNzFjMWM7CiAgICAgIC0tcGFwZXItcmVkLWExMDA6ICNmZjhhODA7CiAgICAgIC0tcGFwZXItcmVkLWEyMDA6ICNmZjUyNTI7CiAgICAgIC0tcGFwZXItcmVkLWE0MDA6ICNmZjE3NDQ7CiAgICAgIC0tcGFwZXItcmVkLWE3MDA6ICNkNTAwMDA7CgogICAgICAtLXBhcGVyLXBpbmstNTA6ICNmY2U0ZWM7CiAgICAgIC0tcGFwZXItcGluay0xMDA6ICNmOGJiZDA7CiAgICAgIC0tcGFwZXItcGluay0yMDA6ICNmNDhmYjE7CiAgICAgIC0tcGFwZXItcGluay0zMDA6ICNmMDYyOTI7CiAgICAgIC0tcGFwZXItcGluay00MDA6ICNlYzQwN2E7CiAgICAgIC0tcGFwZXItcGluay01MDA6ICNlOTFlNjM7CiAgICAgIC0tcGFwZXItcGluay02MDA6ICNkODFiNjA7CiAgICAgIC0tcGFwZXItcGluay03MDA6ICNjMjE4NWI7CiAgICAgIC0tcGFwZXItcGluay04MDA6ICNhZDE0NTc7CiAgICAgIC0tcGFwZXItcGluay05MDA6ICM4ODBlNGY7CiAgICAgIC0tcGFwZXItcGluay1hMTAwOiAjZmY4MGFiOwogICAgICAtLXBhcGVyLXBpbmstYTIwMDogI2ZmNDA4MTsKICAgICAgLS1wYXBlci1waW5rLWE0MDA6ICNmNTAwNTc7CiAgICAgIC0tcGFwZXItcGluay1hNzAwOiAjYzUxMTYyOwoKICAgICAgLS1wYXBlci1wdXJwbGUtNTA6ICNmM2U1ZjU7CiAgICAgIC0tcGFwZXItcHVycGxlLTEwMDogI2UxYmVlNzsKICAgICAgLS1wYXBlci1wdXJwbGUtMjAwOiAjY2U5M2Q4OwogICAgICAtLXBhcGVyLXB1cnBsZS0zMDA6ICNiYTY4Yzg7CiAgICAgIC0tcGFwZXItcHVycGxlLTQwMDogI2FiNDdiYzsKICAgICAgLS1wYXBlci1wdXJwbGUtNTAwOiAjOWMyN2IwOwogICAgICAtLXBhcGVyLXB1cnBsZS02MDA6ICM4ZTI0YWE7CiAgICAgIC0tcGFwZXItcHVycGxlLTcwMDogIzdiMWZhMjsKICAgICAgLS1wYXBlci1wdXJwbGUtODAwOiAjNmExYjlhOwogICAgICAtLXBhcGVyLXB1cnBsZS05MDA6ICM0YTE0OGM7CiAgICAgIC0tcGFwZXItcHVycGxlLWExMDA6ICNlYTgwZmM7CiAgICAgIC0tcGFwZXItcHVycGxlLWEyMDA6ICNlMDQwZmI7CiAgICAgIC0tcGFwZXItcHVycGxlLWE0MDA6ICNkNTAwZjk7CiAgICAgIC0tcGFwZXItcHVycGxlLWE3MDA6ICNhYTAwZmY7CgogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTUwOiAjZWRlN2Y2OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTEwMDogI2QxYzRlOTsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0yMDA6ICNiMzlkZGI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMzAwOiAjOTU3NWNkOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTQwMDogIzdlNTdjMjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS01MDA6ICM2NzNhYjc7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNjAwOiAjNWUzNWIxOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTcwMDogIzUxMmRhODsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS04MDA6ICM0NTI3YTA7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtOTAwOiAjMzExYjkyOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWExMDA6ICNiMzg4ZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTIwMDogIzdjNGRmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hNDAwOiAjNjUxZmZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWE3MDA6ICM2MjAwZWE7CgogICAgICAtLXBhcGVyLWluZGlnby01MDogI2U4ZWFmNjsKICAgICAgLS1wYXBlci1pbmRpZ28tMTAwOiAjYzVjYWU5OwogICAgICAtLXBhcGVyLWluZGlnby0yMDA6ICM5ZmE4ZGE7CiAgICAgIC0tcGFwZXItaW5kaWdvLTMwMDogIzc5ODZjYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNDAwOiAjNWM2YmMwOwogICAgICAtLXBhcGVyLWluZGlnby01MDA6ICMzZjUxYjU7CiAgICAgIC0tcGFwZXItaW5kaWdvLTYwMDogIzM5NDlhYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNzAwOiAjMzAzZjlmOwogICAgICAtLXBhcGVyLWluZGlnby04MDA6ICMyODM1OTM7CiAgICAgIC0tcGFwZXItaW5kaWdvLTkwMDogIzFhMjM3ZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTEwMDogIzhjOWVmZjsKICAgICAgLS1wYXBlci1pbmRpZ28tYTIwMDogIzUzNmRmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTQwMDogIzNkNWFmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTcwMDogIzMwNGZmZTsKCiAgICAgIC0tcGFwZXItYmx1ZS01MDogI2UzZjJmZDsKICAgICAgLS1wYXBlci1ibHVlLTEwMDogI2JiZGVmYjsKICAgICAgLS1wYXBlci1ibHVlLTIwMDogIzkwY2FmOTsKICAgICAgLS1wYXBlci1ibHVlLTMwMDogIzY0YjVmNjsKICAgICAgLS1wYXBlci1ibHVlLTQwMDogIzQyYTVmNTsKICAgICAgLS1wYXBlci1ibHVlLTUwMDogIzIxOTZmMzsKICAgICAgLS1wYXBlci1ibHVlLTYwMDogIzFlODhlNTsKICAgICAgLS1wYXBlci1ibHVlLTcwMDogIzE5NzZkMjsKICAgICAgLS1wYXBlci1ibHVlLTgwMDogIzE1NjVjMDsKICAgICAgLS1wYXBlci1ibHVlLTkwMDogIzBkNDdhMTsKICAgICAgLS1wYXBlci1ibHVlLWExMDA6ICM4MmIxZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hMjAwOiAjNDQ4YWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTQwMDogIzI5NzlmZjsKICAgICAgLS1wYXBlci1ibHVlLWE3MDA6ICMyOTYyZmY7CgogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNTA6ICNlMWY1ZmU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0xMDA6ICNiM2U1ZmM7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0yMDA6ICM4MWQ0ZmE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0zMDA6ICM0ZmMzZjc7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS00MDA6ICMyOWI2ZjY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS01MDA6ICMwM2E5ZjQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS02MDA6ICMwMzliZTU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS03MDA6ICMwMjg4ZDE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS04MDA6ICMwMjc3YmQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS05MDA6ICMwMTU3OWI7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hMTAwOiAjODBkOGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTIwMDogIzQwYzRmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWE0MDA6ICMwMGIwZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hNzAwOiAjMDA5MWVhOwoKICAgICAgLS1wYXBlci1jeWFuLTUwOiAjZTBmN2ZhOwogICAgICAtLXBhcGVyLWN5YW4tMTAwOiAjYjJlYmYyOwogICAgICAtLXBhcGVyLWN5YW4tMjAwOiAjODBkZWVhOwogICAgICAtLXBhcGVyLWN5YW4tMzAwOiAjNGRkMGUxOwogICAgICAtLXBhcGVyLWN5YW4tNDAwOiAjMjZjNmRhOwogICAgICAtLXBhcGVyLWN5YW4tNTAwOiAjMDBiY2Q0OwogICAgICAtLXBhcGVyLWN5YW4tNjAwOiAjMDBhY2MxOwogICAgICAtLXBhcGVyLWN5YW4tNzAwOiAjMDA5N2E3OwogICAgICAtLXBhcGVyLWN5YW4tODAwOiAjMDA4MzhmOwogICAgICAtLXBhcGVyLWN5YW4tOTAwOiAjMDA2MDY0OwogICAgICAtLXBhcGVyLWN5YW4tYTEwMDogIzg0ZmZmZjsKICAgICAgLS1wYXBlci1jeWFuLWEyMDA6ICMxOGZmZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hNDAwOiAjMDBlNWZmOwogICAgICAtLXBhcGVyLWN5YW4tYTcwMDogIzAwYjhkNDsKCiAgICAgIC0tcGFwZXItdGVhbC01MDogI2UwZjJmMTsKICAgICAgLS1wYXBlci10ZWFsLTEwMDogI2IyZGZkYjsKICAgICAgLS1wYXBlci10ZWFsLTIwMDogIzgwY2JjNDsKICAgICAgLS1wYXBlci10ZWFsLTMwMDogIzRkYjZhYzsKICAgICAgLS1wYXBlci10ZWFsLTQwMDogIzI2YTY5YTsKICAgICAgLS1wYXBlci10ZWFsLTUwMDogIzAwOTY4ODsKICAgICAgLS1wYXBlci10ZWFsLTYwMDogIzAwODk3YjsKICAgICAgLS1wYXBlci10ZWFsLTcwMDogIzAwNzk2YjsKICAgICAgLS1wYXBlci10ZWFsLTgwMDogIzAwNjk1YzsKICAgICAgLS1wYXBlci10ZWFsLTkwMDogIzAwNGQ0MDsKICAgICAgLS1wYXBlci10ZWFsLWExMDA6ICNhN2ZmZWI7CiAgICAgIC0tcGFwZXItdGVhbC1hMjAwOiAjNjRmZmRhOwogICAgICAtLXBhcGVyLXRlYWwtYTQwMDogIzFkZTliNjsKICAgICAgLS1wYXBlci10ZWFsLWE3MDA6ICMwMGJmYTU7CgogICAgICAtLXBhcGVyLWdyZWVuLTUwOiAjZThmNWU5OwogICAgICAtLXBhcGVyLWdyZWVuLTEwMDogI2M4ZTZjOTsKICAgICAgLS1wYXBlci1ncmVlbi0yMDA6ICNhNWQ2YTc7CiAgICAgIC0tcGFwZXItZ3JlZW4tMzAwOiAjODFjNzg0OwogICAgICAtLXBhcGVyLWdyZWVuLTQwMDogIzY2YmI2YTsKICAgICAgLS1wYXBlci1ncmVlbi01MDA6ICM0Y2FmNTA7CiAgICAgIC0tcGFwZXItZ3JlZW4tNjAwOiAjNDNhMDQ3OwogICAgICAtLXBhcGVyLWdyZWVuLTcwMDogIzM4OGUzYzsKICAgICAgLS1wYXBlci1ncmVlbi04MDA6ICMyZTdkMzI7CiAgICAgIC0tcGFwZXItZ3JlZW4tOTAwOiAjMWI1ZTIwOwogICAgICAtLXBhcGVyLWdyZWVuLWExMDA6ICNiOWY2Y2E7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTIwMDogIzY5ZjBhZTsKICAgICAgLS1wYXBlci1ncmVlbi1hNDAwOiAjMDBlNjc2OwogICAgICAtLXBhcGVyLWdyZWVuLWE3MDA6ICMwMGM4NTM7CgogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTUwOiAjZjFmOGU5OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTEwMDogI2RjZWRjODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0yMDA6ICNjNWUxYTU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMzAwOiAjYWVkNTgxOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTQwMDogIzljY2M2NTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi01MDA6ICM4YmMzNGE7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNjAwOiAjN2NiMzQyOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTcwMDogIzY4OWYzODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi04MDA6ICM1NThiMmY7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tOTAwOiAjMzM2OTFlOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWExMDA6ICNjY2ZmOTA7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTIwMDogI2IyZmY1OTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hNDAwOiAjNzZmZjAzOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWE3MDA6ICM2NGRkMTc7CgogICAgICAtLXBhcGVyLWxpbWUtNTA6ICNmOWZiZTc7CiAgICAgIC0tcGFwZXItbGltZS0xMDA6ICNmMGY0YzM7CiAgICAgIC0tcGFwZXItbGltZS0yMDA6ICNlNmVlOWM7CiAgICAgIC0tcGFwZXItbGltZS0zMDA6ICNkY2U3NzU7CiAgICAgIC0tcGFwZXItbGltZS00MDA6ICNkNGUxNTc7CiAgICAgIC0tcGFwZXItbGltZS01MDA6ICNjZGRjMzk7CiAgICAgIC0tcGFwZXItbGltZS02MDA6ICNjMGNhMzM7CiAgICAgIC0tcGFwZXItbGltZS03MDA6ICNhZmI0MmI7CiAgICAgIC0tcGFwZXItbGltZS04MDA6ICM5ZTlkMjQ7CiAgICAgIC0tcGFwZXItbGltZS05MDA6ICM4Mjc3MTc7CiAgICAgIC0tcGFwZXItbGltZS1hMTAwOiAjZjRmZjgxOwogICAgICAtLXBhcGVyLWxpbWUtYTIwMDogI2VlZmY0MTsKICAgICAgLS1wYXBlci1saW1lLWE0MDA6ICNjNmZmMDA7CiAgICAgIC0tcGFwZXItbGltZS1hNzAwOiAjYWVlYTAwOwoKICAgICAgLS1wYXBlci15ZWxsb3ctNTA6ICNmZmZkZTc7CiAgICAgIC0tcGFwZXIteWVsbG93LTEwMDogI2ZmZjljNDsKICAgICAgLS1wYXBlci15ZWxsb3ctMjAwOiAjZmZmNTlkOwogICAgICAtLXBhcGVyLXllbGxvdy0zMDA6ICNmZmYxNzY7CiAgICAgIC0tcGFwZXIteWVsbG93LTQwMDogI2ZmZWU1ODsKICAgICAgLS1wYXBlci15ZWxsb3ctNTAwOiAjZmZlYjNiOwogICAgICAtLXBhcGVyLXllbGxvdy02MDA6ICNmZGQ4MzU7CiAgICAgIC0tcGFwZXIteWVsbG93LTcwMDogI2ZiYzAyZDsKICAgICAgLS1wYXBlci15ZWxsb3ctODAwOiAjZjlhODI1OwogICAgICAtLXBhcGVyLXllbGxvdy05MDA6ICNmNTdmMTc7CiAgICAgIC0tcGFwZXIteWVsbG93LWExMDA6ICNmZmZmOGQ7CiAgICAgIC0tcGFwZXIteWVsbG93LWEyMDA6ICNmZmZmMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE0MDA6ICNmZmVhMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE3MDA6ICNmZmQ2MDA7CgogICAgICAtLXBhcGVyLWFtYmVyLTUwOiAjZmZmOGUxOwogICAgICAtLXBhcGVyLWFtYmVyLTEwMDogI2ZmZWNiMzsKICAgICAgLS1wYXBlci1hbWJlci0yMDA6ICNmZmUwODI7CiAgICAgIC0tcGFwZXItYW1iZXItMzAwOiAjZmZkNTRmOwogICAgICAtLXBhcGVyLWFtYmVyLTQwMDogI2ZmY2EyODsKICAgICAgLS1wYXBlci1hbWJlci01MDA6ICNmZmMxMDc7CiAgICAgIC0tcGFwZXItYW1iZXItNjAwOiAjZmZiMzAwOwogICAgICAtLXBhcGVyLWFtYmVyLTcwMDogI2ZmYTAwMDsKICAgICAgLS1wYXBlci1hbWJlci04MDA6ICNmZjhmMDA7CiAgICAgIC0tcGFwZXItYW1iZXItOTAwOiAjZmY2ZjAwOwogICAgICAtLXBhcGVyLWFtYmVyLWExMDA6ICNmZmU1N2Y7CiAgICAgIC0tcGFwZXItYW1iZXItYTIwMDogI2ZmZDc0MDsKICAgICAgLS1wYXBlci1hbWJlci1hNDAwOiAjZmZjNDAwOwogICAgICAtLXBhcGVyLWFtYmVyLWE3MDA6ICNmZmFiMDA7CgogICAgICAtLXBhcGVyLW9yYW5nZS01MDogI2ZmZjNlMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtMTAwOiAjZmZlMGIyOwogICAgICAtLXBhcGVyLW9yYW5nZS0yMDA6ICNmZmNjODA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTMwMDogI2ZmYjc0ZDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNDAwOiAjZmZhNzI2OwogICAgICAtLXBhcGVyLW9yYW5nZS01MDA6ICNmZjk4MDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTYwMDogI2ZiOGMwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNzAwOiAjZjU3YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS04MDA6ICNlZjZjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTkwMDogI2U2NTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTEwMDogI2ZmZDE4MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTIwMDogI2ZmYWI0MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTQwMDogI2ZmOTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTcwMDogI2ZmNjUwMDsKCiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNTA6ICNmYmU5ZTc7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMTAwOiAjZmZjY2JjOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTIwMDogI2ZmYWI5MTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0zMDA6ICNmZjhhNjU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNDAwOiAjZmY3MDQzOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTUwMDogI2ZmNTcyMjsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS02MDA6ICNmNDUxMWU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNzAwOiAjZTY0YTE5OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTgwMDogI2Q4NDMxNTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS05MDA6ICNiZjM2MGM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTEwMDogI2ZmOWU4MDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hMjAwOiAjZmY2ZTQwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWE0MDA6ICNmZjNkMDA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMDogI2RkMmMwMDsKCiAgICAgIC0tcGFwZXItYnJvd24tNTA6ICNlZmViZTk7CiAgICAgIC0tcGFwZXItYnJvd24tMTAwOiAjZDdjY2M4OwogICAgICAtLXBhcGVyLWJyb3duLTIwMDogI2JjYWFhNDsKICAgICAgLS1wYXBlci1icm93bi0zMDA6ICNhMTg4N2Y7CiAgICAgIC0tcGFwZXItYnJvd24tNDAwOiAjOGQ2ZTYzOwogICAgICAtLXBhcGVyLWJyb3duLTUwMDogIzc5NTU0ODsKICAgICAgLS1wYXBlci1icm93bi02MDA6ICM2ZDRjNDE7CiAgICAgIC0tcGFwZXItYnJvd24tNzAwOiAjNWQ0MDM3OwogICAgICAtLXBhcGVyLWJyb3duLTgwMDogIzRlMzQyZTsKICAgICAgLS1wYXBlci1icm93bi05MDA6ICMzZTI3MjM7CgogICAgICAtLXBhcGVyLWdyZXktNTA6ICNmYWZhZmE7CiAgICAgIC0tcGFwZXItZ3JleS0xMDA6ICNmNWY1ZjU7CiAgICAgIC0tcGFwZXItZ3JleS0yMDA6ICNlZWVlZWU7CiAgICAgIC0tcGFwZXItZ3JleS0zMDA6ICNlMGUwZTA7CiAgICAgIC0tcGFwZXItZ3JleS00MDA6ICNiZGJkYmQ7CiAgICAgIC0tcGFwZXItZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tcGFwZXItZ3JleS02MDA6ICM3NTc1NzU7CiAgICAgIC0tcGFwZXItZ3JleS03MDA6ICM2MTYxNjE7CiAgICAgIC0tcGFwZXItZ3JleS04MDA6ICM0MjQyNDI7CiAgICAgIC0tcGFwZXItZ3JleS05MDA6ICMyMTIxMjE7CgogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDogI2VjZWZmMTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMTAwOiAjY2ZkOGRjOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0yMDA6ICNiMGJlYzU7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTMwMDogIzkwYTRhZTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNDAwOiAjNzg5MDljOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDA6ICM2MDdkOGI7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTYwMDogIzU0NmU3YTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNzAwOiAjNDU1YTY0OwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS04MDA6ICMzNzQ3NGY7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTkwMDogIzI2MzIzODsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGRhcmsgdGV4dCBvbiBhIGxpZ2h0IGJhY2tncm91bmQgKi8KICAgICAgLS1kYXJrLWRpdmlkZXItb3BhY2l0eTogMC4xMjsKICAgICAgLS1kYXJrLWRpc2FibGVkLW9wYWNpdHk6IDAuMzg7IC8qIG9yIGhpbnQgdGV4dCBvciBpY29uICovCiAgICAgIC0tZGFyay1zZWNvbmRhcnktb3BhY2l0eTogMC41NDsKICAgICAgLS1kYXJrLXByaW1hcnktb3BhY2l0eTogMC44NzsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGxpZ2h0IHRleHQgb24gYSBkYXJrIGJhY2tncm91bmQgKi8KICAgICAgLS1saWdodC1kaXZpZGVyLW9wYWNpdHk6IDAuMTI7CiAgICAgIC0tbGlnaHQtZGlzYWJsZWQtb3BhY2l0eTogMC4zOyAvKiBvciBoaW50IHRleHQgb3IgaWNvbiAqLwogICAgICAtLWxpZ2h0LXNlY29uZGFyeS1vcGFjaXR5OiAwLjc7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1vcGFjaXR5OiAxLjA7CgogICAgfQoKICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CiAgICAgIC8qCiAgICAgICAqIFlvdSBjYW4gdXNlIHRoZXNlIGdlbmVyaWMgdmFyaWFibGVzIGluIHlvdXIgZWxlbWVudHMgZm9yIGVhc3kgdGhlbWluZy4KICAgICAgICogRm9yIGV4YW1wbGUsIGlmIGFsbCB5b3VyIGVsZW1lbnRzIHVzZSBgLS1wcmltYXJ5LXRleHQtY29sb3JgIGFzIGl0cyBtYWluCiAgICAgICAqIGNvbG9yLCB0aGVuIHN3aXRjaGluZyBmcm9tIGEgbGlnaHQgdG8gYSBkYXJrIHRoZW1lIGlzIGp1c3QgYSBtYXR0ZXIgb2YKICAgICAgICogY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGAtLXByaW1hcnktdGV4dC1jb2xvcmAgaW4geW91ciBhcHBsaWNhdGlvbi4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS10ZXh0LWNvbG9yKTsKICAgICAgLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWJhY2tncm91bmQtY29sb3IpOwogICAgICAtLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3IpOwogICAgICAtLWRpc2FibGVkLXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWRpc2FibGVkLWNvbG9yKTsKICAgICAgLS1kaXZpZGVyLWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yKTsKICAgICAgLS1lcnJvci1jb2xvcjogdmFyKC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMCk7CgogICAgICAvKgogICAgICAgKiBQcmltYXJ5IGFuZCBhY2NlbnQgY29sb3JzLiBBbHNvIHNlZSBjb2xvci5odG1sIGZvciBtb3JlIGNvbG9ycy4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTEwMCk7CiAgICAgIC0tZGFyay1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNzAwKTsKCiAgICAgIC0tYWNjZW50LWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLWEyMDApOwogICAgICAtLWxpZ2h0LWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMTAwKTsKICAgICAgLS1kYXJrLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hNDAwKTsKCgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gTGlnaHQgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1saWdodC10aGVtZS1iYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWxpZ2h0LXRoZW1lLWJhc2UtY29sb3I6ICMwMDAwMDA7CiAgICAgIC0tbGlnaHQtdGhlbWUtdGV4dC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWxpZ2h0LXRoZW1lLXNlY29uZGFyeS1jb2xvcjogIzczNzM3MzsgIC8qIGZvciBzZWNvbmRhcnkgdGV4dCBhbmQgaWNvbnMgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzliOWI5YjsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWxpZ2h0LXRoZW1lLWRpdmlkZXItY29sb3I6ICNkYmRiZGI7CgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gRGFyayBiYWNrZ3JvdW5kIHRoZW1lCiAgICAgICAqLwogICAgICAtLWRhcmstdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWRhcmstdGhlbWUtYmFzZS1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1kYXJrLXRoZW1lLXRleHQtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS1zZWNvbmRhcnktY29sb3I6ICNiY2JjYmM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tZGFyay10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzY0NjQ2NDsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWRhcmstdGhlbWUtZGl2aWRlci1jb2xvcjogIzNjM2MzYzsKCiAgICAgIC8qCiAgICAgICAqIERlcHJlY2F0ZWQgdmFsdWVzIGJlY2F1c2Ugb2YgdGhlaXIgY29uZnVzaW5nIG5hbWVzLgogICAgICAgKi8KICAgICAgLS10ZXh0LXByaW1hcnktY29sb3I6IHZhcigtLWRhcmstdGhlbWUtdGV4dC1jb2xvcik7CiAgICAgIC0tZGVmYXVsdC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItY2hlY2tib3giPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplOiB2YXIoLS1wYXBlci1jaGVja2JveC1zaXplLCAxOHB4KTsKICAgICAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlZCBpbiBgYXR0YWNoZWRgLiAqLwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZTogdmFyKC0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUsIC0xcHgpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgICNjaGVja2JveENvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICAgICAgbWluLXdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpOwogICAgICAgIG1hcmdpbjogdmFyKC0tcGFwZXItY2hlY2tib3gtbWFyZ2luLCBpbml0aWFsKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItY2hlY2tib3gtdmVydGljYWwtYWxpZ24sIG1pZGRsZSk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgfQoKICAgICAgI2luayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwoKICAgICAgICAvKiBDZW50ZXIgdGhlIHJpcHBsZSBpbiB0aGUgY2hlY2tib3ggYnkgbmVnYXRpdmUgb2Zmc2V0dGluZyBpdCBieQogICAgICAgICAqIChpbmtXaWR0aCAtIHJpcHBsZVdpZHRoKSAvIDIgKi8KICAgICAgICB0b3A6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI2luazpkaXIocnRsKSB7CiAgICAgICAgcmlnaHQ6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBhdXRvOwogICAgICB9CgogICAgICAjaW5rW2NoZWNrZWRdIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI2NoZWNrYm94IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAycHg7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDE0MG1zLCBib3JkZXItY29sb3IgMTQwbXM7CiAgICAgIH0KCiAgICAgIC8qIGNoZWNrYm94IGNoZWNrZWQgYW5pbWF0aW9ucyAqLwogICAgICAjY2hlY2tib3guY2hlY2tlZCAjY2hlY2ttYXJrIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY2hlY2ttYXJrLWV4cGFuZCAxNDBtcyBlYXNlLW91dCBmb3J3YXJkczsKICAgICAgICBhbmltYXRpb246IGNoZWNrbWFyay1leHBhbmQgMTQwbXMgZWFzZS1vdXQgZm9yd2FyZHM7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjaGVja21hcmstZXhwYW5kIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCwgMCkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY2hlY2ttYXJrLWV4cGFuZCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNjaGVja2JveC5jaGVja2VkIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgICNjaGVja21hcmsgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMzYlOwogICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXItbGVmdDogbm9uZTsKICAgICAgICBib3JkZXItcmlnaHQtd2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2ttYXJrLWNvbG9yLCB3aGl0ZSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA5NyUgODYlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDk3JSA4NiU7CiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7IC8qIHByb3RlY3QgYWdhaW5zdCBwYWdlLWxldmVsIGJveC1zaXppbmcgKi8KICAgICAgfQoKICAgICAgI2NoZWNrbWFyazpkaXIocnRsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTQlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSAxNCU7CiAgICAgIH0KCiAgICAgIC8qIGxhYmVsICovCiAgICAgICNjaGVja2JveExhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nLCA4cHgpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWNoZWNrYm94LWxhYmVsOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNjaGVja2JveExhYmVsIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZC1jb2xvciwgdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkOwogICAgICB9CgogICAgICAjY2hlY2tib3hMYWJlbDpkaXIocnRsKSB7CiAgICAgICAgcGFkZGluZy1yaWdodDogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtc3BhY2luZywgOHB4KTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICAgIH0KCiAgICAgICNjaGVja2JveExhYmVsW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3ggewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNjaGVja2JveCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNjaGVja2JveExhYmVsICB7CiAgICAgICAgb3BhY2l0eTogMC42NTsKICAgICAgfQoKICAgICAgLyogaW52YWxpZCBzdGF0ZSAqLwogICAgICAjY2hlY2tib3guaW52YWxpZDpub3QoLmNoZWNrZWQpIHsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWVycm9yLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9ImNoZWNrYm94Q29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iY2hlY2tib3giIGNsYXNzJD0iW1tfY29tcHV0ZUNoZWNrYm94Q2xhc3MoY2hlY2tlZCwgaW52YWxpZCldXSI+CiAgICAgICAgPGRpdiBpZD0iY2hlY2ttYXJrIiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja21hcmtDbGFzcyhjaGVja2VkKV1dIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjaGVja2JveExhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIGZpbGw6IHZhcigtLWlyb24taWNvbi1maWxsLWNvbG9yLCBjdXJyZW50Y29sb3IpOwogICAgICAgIHN0cm9rZTogdmFyKC0taXJvbi1pY29uLXN0cm9rZS1jb2xvciwgbm9uZSk7CgogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWljb24td2lkdGgsIDI0cHgpOwogICAgICAgIGhlaWdodDogdmFyKC0taXJvbi1pY29uLWhlaWdodCwgMjRweCk7CiAgICAgICAgQGFwcGx5IC0taXJvbi1pY29uOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWExMXktYW5ub3VuY2VyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIGNsaXA6IHJlY3QoMHB4LDBweCwwcHgsMHB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgYXJpYS1saXZlJD0iW1ttb2RlXV0iPltbX3RleHRdXTwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taW5wdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJjb250ZW50Ij48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogU2hhcmVkIFN0eWxlcyAqLwogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U6IHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90bycsICdOb3RvJywgc2Fucy1zZXJpZjsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tY29kZTogewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCAnQ29uc29sYXMnLCAnTWVubG8nLCBtb25vc3BhY2U7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWV4cGVuc2l2ZS1rZXJuaW5nOiB7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOiB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9OwoKICAgICAgLyogTWF0ZXJpYWwgRm9udCBTdHlsZXMgKi8KCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5NDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDExMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDQ0ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkzOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogNTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAyNmVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA2MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiA0NXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDE4ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDM0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWhlYWRsaW5lOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDEyZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDMycHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtdGl0bGU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtc3ViaGVhZDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJvZHkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYm9keTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jYXB0aW9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LW1lbnU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYnV0dG9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxOGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29kZTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb2RlMTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgIH0KCiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWNoYXItY291bnRlciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsb2F0OiByaWdodDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNoYXItY291bnRlcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpkaXIocnRsKSkgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzcGFuPltbX2NoYXJDb3VudGVyU3RyXV08L3NwYW4+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlOiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiB0byBtYWtlIGEgc3RhY2tpbmcgY29udGV4dCAqLwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgfTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1jb250YWluZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2lubGluZV0pIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjMzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICB9CgogICAgICAudW5kZXJsaW5lIHsKICAgICAgICBoZWlnaHQ6IDJweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLDEsMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1mb2N1czsKICAgICAgfQoKICAgICAgLnVuZGVybGluZS5pcy1oaWdobGlnaHRlZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWludmFsaWQgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzLCB3aWR0aCAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgLyogRml4IGZvciBzYWZhcmkgbm90IGZvY3VzaW5nIDAtaGVpZ2h0IGRhdGUvdGltZSBpbnB1dHMgd2l0aCAtd2Via2l0LWFwcGVyYW5jZTogbm9uZTsgKi8KICAgICAgICBtaW4taGVpZ2h0OiAxcHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwoKICAgICAgICAvKiBTaW5jZSB3ZSBzY2FsZSB0byA3NS8xMDAgb2YgdGhlIHNpemUsIHdlIGFjdHVhbGx5IGhhdmUgMTAwLzc1IG9mIHRoZQogICAgICAgIG9yaWdpbmFsIHNwYWNlIG5vdyBhdmFpbGFibGUgKi8KICAgICAgICB3aWR0aDogMTMzJTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZsb2F0aW5nOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICAvKiBUaGUgYXBwbHkgc2hpbSBkb2Vzbid0IGFwcGx5IHRoZSBuZXN0ZWQgY29sb3IgY3VzdG9tIHByb3BlcnR5LAogICAgICAgICAgc28gd2UgaGF2ZSB0byByZS1hcHBseSBpdCBoZXJlLiAqLwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1pbnZhbGlkOwogICAgICB9CgogICAgICAucHJlZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXByZWZpeDsKICAgICAgfQoKICAgICAgLnN1ZmZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtc3VmZml4OwogICAgICB9CgogICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSkgewogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciIgYXJpYS1oaWRkZW49InRydWUiIGhpZGRlbj0iW1tub0xhYmVsRmxvYXRdXSI+Jm5ic3A7PC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPjxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90Pjwvc3Bhbj4KCiAgICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlSW5wdXRDb250ZW50Q2xhc3Mobm9MYWJlbEZsb2F0LGFsd2F5c0Zsb2F0TGFiZWwsZm9jdXNlZCxpbnZhbGlkLF9pbnB1dEhhc0NvbnRlbnQpXV0iIGlkPSJsYWJlbEFuZElucHV0Q29udGFpbmVyIj4KICAgICAgICA8c2xvdCBuYW1lPSJsYWJlbCI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9ImlucHV0Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPHNwYW4gY2xhc3M9InN1ZmZpeCI+PHNsb3QgbmFtZT0ic3VmZml4Ij48L3Nsb3Q+PC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVVbmRlcmxpbmVDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJ1bmZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxzbG90IG5hbWU9ImFkZC1vbiI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWVycm9yIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWludmFsaWQtY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1lcnJvcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDowOwogICAgICAgIHJpZ2h0OjA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgewogICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgIH07CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtmb2N1c2VkXSkgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhlIDxpbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMgaXQuCiAgICAgIEluIDIueCB0aGUgPGlyb24taW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzCiAgICAgIGl0LCBidXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHksIHdlIG5lZWQgdG8gcmVzZXQgc29tZQogICAgICBvZiB0aGUgbmF0aXZlIGlucHV0J3MgcHJvcGVydGllcyB0byBpbmhlcml0IChmcm9tIHRoZSBpcm9uLWlucHV0KSAqLwogICAgICBpcm9uLWlucHV0ID4gaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIHdvcmQtc3BhY2luZzogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jbGVhci1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLWNsZWFyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtcmV2ZWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtcmV2ZWFsOwogICAgICB9CgogICAgICBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIGlkPSJjb250YWluZXIiIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPHNsb3QgbmFtZT0icHJlZml4IiBzbG90PSJwcmVmaXgiPjwvc2xvdD4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDxzcGFuIGlkPSJ0ZW1wbGF0ZS1wbGFjZWhvbGRlciI+PC9zcGFuPgoKICAgICAgPHNsb3QgbmFtZT0ic3VmZml4IiBzbG90PSJzdWZmaXgiPjwvc2xvdD4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgoKICAKICA8dGVtcGxhdGUgaWQ9InYwIj4KICAgIDxpbnB1dCBpcz0iaXJvbi1pbnB1dCIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgaW52YWxpZD0ie3tpbnZhbGlkfX0iIHByZXZlbnQtaW52YWxpZC1pbnB1dD0iW1twcmV2ZW50SW52YWxpZElucHV0XV0iIGFsbG93ZWQtcGF0dGVybj0iW1thbGxvd2VkUGF0dGVybl1dIiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgPC90ZW1wbGF0ZT4KCiAgPHRlbXBsYXRlIGlkPSJ2MSI+CiAgICAKICAgIDxpcm9uLWlucHV0IGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYWxsb3dlZC1wYXR0ZXJuPSJbW2FsbG93ZWRQYXR0ZXJuXV0iIGludmFsaWQ9Int7aW52YWxpZH19IiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iPgogICAgICA8aW5wdXQgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgICA8L2lyb24taW5wdXQ+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1vdmVybGF5LWJhY2tkcm9wIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pcm9uLW92ZXJsYXktYmFja2Ryb3AtYmFja2dyb3VuZC1jb2xvciwgIzAwMCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wOwogICAgICB9CgogICAgICA6aG9zdCgub3BlbmVkKSB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wYWNpdHksIDAuNik7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wZW5lZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1kcm9wZG93biI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyLmFuaW1hdGluZyA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudFdyYXBwZXIiPgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbWVudS1idXR0b24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiPgogICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIGNsYXNzPSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvaXJvbi1kcm9wZG93bj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItZHJvcGRvd24tbWVudSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj48cGF0aCBkPSJNNyAxMGw1IDUgNS01eiI+PC9wYXRoPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKCiAgICAgICAgLyogTk9URShjZGF0YSk6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlCiAgICAgICAgICogdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4KICAgICAgICAgKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbbm9pbmtdKSBwYXBlci1yaXBwbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtuby1sYWJlbC1mbG9hdF0pIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiAxMnB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICByaWdodDogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LXJpcHBsZTsKICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcik7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaWNvbjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZHJvcGRvd24tbWVudSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRyb3Bkb3duLW1lbnUtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAKICAgIDxzcGFuIHJvbGU9ImJ1dHRvbiI+PC9zcGFuPgogICAgPHBhcGVyLW1lbnUtYnV0dG9uIGlkPSJtZW51QnV0dG9uIiB2ZXJ0aWNhbC1hbGlnbj0iW1t2ZXJ0aWNhbEFsaWduXV0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIGR5bmFtaWMtYWxpZ249IltbZHluYW1pY0FsaWduXV0iIHZlcnRpY2FsLW9mZnNldD0iW1tfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldChub0xhYmVsRmxvYXQsIHZlcnRpY2FsT2Zmc2V0KV1dIiBkaXNhYmxlZD0iW1tkaXNhYmxlZF1dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBvbi1pcm9uLXNlbGVjdD0iX29uSXJvblNlbGVjdCIgb24taXJvbi1kZXNlbGVjdD0iX29uSXJvbkRlc2VsZWN0IiBvcGVuZWQ9Int7b3BlbmVkfX0iIGNsb3NlLW9uLWFjdGl2YXRlIGFsbG93LW91dHNpZGUtc2Nyb2xsPSJbW2FsbG93T3V0c2lkZVNjcm9sbF1dIiByZXN0b3JlLWZvY3VzLW9uLWNsb3NlPSJbW3Jlc3RvcmVGb2N1c09uQ2xvc2VdXSI+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIj4KICAgICAgICA8cGFwZXItcmlwcGxlPjwvcGFwZXItcmlwcGxlPgogICAgICAgIAogICAgICAgIDxwYXBlci1pbnB1dCB0eXBlPSJ0ZXh0IiBpbnZhbGlkPSJbW2ludmFsaWRdXSIgcmVhZG9ubHkgZGlzYWJsZWQ9IltbZGlzYWJsZWRdXSIgdmFsdWU9IltbdmFsdWVdXSIgcGxhY2Vob2xkZXI9IltbcGxhY2Vob2xkZXJdXSIgZXJyb3ItbWVzc2FnZT0iW1tlcnJvck1lc3NhZ2VdXSIgYWx3YXlzLWZsb2F0LWxhYmVsPSJbW2Fsd2F5c0Zsb2F0TGFiZWxdXSIgbm8tbGFiZWwtZmxvYXQ9Iltbbm9MYWJlbEZsb2F0XV0iIGxhYmVsPSJbW2xhYmVsXV0iPgogICAgICAgICAgCiAgICAgICAgICA8aXJvbi1pY29uIGljb249InBhcGVyLWRyb3Bkb3duLW1lbnU6YXJyb3ctZHJvcC1kb3duIiBzdWZmaXggc2xvdD0ic3VmZml4Ij48L2lyb24taWNvbj4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgICAgPHNsb3QgaWQ9ImNvbnRlbnQiIG5hbWU9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPjwvc2xvdD4KICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbGlzdGJveCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CgogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLWxpc3Rib3gtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWxpc3Rib3gtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1saXN0Ym94OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QsIC5wYXBlci1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1taW4taGVpZ2h0LCA0OHB4KTsKICAgICAgICBwYWRkaW5nOiAwcHggMTZweDsKICAgICAgfQoKICAgICAgLnBhcGVyLWl0ZW0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBib3JkZXI6bm9uZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgLnBhcGVyLWl0ZW1baGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCguaXJvbi1zZWxlY3RlZCksIC5wYXBlci1pdGVtLmlyb24tc2VsZWN0ZWQgewogICAgICAgIGZvbnQtd2VpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLXNlbGVjdGVkLXdlaWdodCwgYm9sZCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pLCAucGFwZXItaXRlbVtkaXNhYmxlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pdGVtLWRpc2FibGVkLWNvbG9yLCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cyksIC5wYXBlci1pdGVtOmZvY3VzIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogMDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1mb2N1c2VkOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpOmJlZm9yZSwgLnBhcGVyLWl0ZW06Zm9jdXM6YmVmb3JlIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwoKICAgICAgICBiYWNrZ3JvdW5kOiBjdXJyZW50Q29sb3I7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tZGFyay1kaXZpZGVyLW9wYWNpdHkpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWZvY3VzZWQtYmVmb3JlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzIj4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iYWNrZW5kIj4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zdG9yYWdlIj4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGFnLWZpbHRlcmVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgbGFiZWw9IkZpbHRlciB0YWdzIChyZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnRlZCkiIHZhbHVlPSJ7e190YWdGaWx0ZXJ9fSIgY2xhc3M9InNlYXJjaC1pbnB1dCI+CiAgICAgIDxpcm9uLWljb24gcHJlZml4IGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmxheW91dC5ob3Jpem9udGFsLAogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5pbmxpbmUgewogICAgICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmxheW91dC53cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5uby13cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZmxleCB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC1hdXRvIHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgLmZsZXgtbm9uZSB7CiAgICAgICAgLW1zLWZsZXg6IG5vbmU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiBub25lOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtcmV2ZXJzZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSwKICAgICAgLmxheW91dC52ZXJ0aWNhbC1yZXZlcnNlIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5ob3Jpem9udGFsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtYWxpZ25tZW50Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlciwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZCB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmFzZWxpbmUgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGVuZDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5hcm91bmQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGYgYWxpZ25tZW50LgogICAgICAgKi8KICAgICAgLnNlbGYtc3RhcnQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAuc2VsZi1jZW50ZXIgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9CgogICAgICAuc2VsZi1lbmQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAuc2VsZi1zdHJldGNoIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgfQoKICAgICAgLnNlbGYtYmFzZWxpbmUgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IHN0YXJ0OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGVuZDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBjZW50ZXI7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmV0d2Vlbi1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGp1c3RpZnk7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYXJvdW5kLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZGlzdHJpYnV0ZTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1mbGV4LWZhY3RvcnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmZsZXgsCiAgICAgIC5mbGV4LTEgewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfQoKICAgICAgLmZsZXgtMiB7CiAgICAgICAgLW1zLWZsZXg6IDI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAyOwogICAgICAgIGZsZXg6IDI7CiAgICAgIH0KCiAgICAgIC5mbGV4LTMgewogICAgICAgIC1tcy1mbGV4OiAzOwogICAgICAgIC13ZWJraXQtZmxleDogMzsKICAgICAgICBmbGV4OiAzOwogICAgICB9CgogICAgICAuZmxleC00IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfQoKICAgICAgLmZsZXgtNSB7CiAgICAgICAgLW1zLWZsZXg6IDU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA1OwogICAgICAgIGZsZXg6IDU7CiAgICAgIH0KCiAgICAgIC5mbGV4LTYgewogICAgICAgIC1tcy1mbGV4OiA2OwogICAgICAgIC13ZWJraXQtZmxleDogNjsKICAgICAgICBmbGV4OiA2OwogICAgICB9CgogICAgICAuZmxleC03IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfQoKICAgICAgLmZsZXgtOCB7CiAgICAgICAgLW1zLWZsZXg6IDg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA4OwogICAgICAgIGZsZXg6IDg7CiAgICAgIH0KCiAgICAgIC5mbGV4LTkgewogICAgICAgIC1tcy1mbGV4OiA5OwogICAgICAgIC13ZWJraXQtZmxleDogOTsKICAgICAgICBmbGV4OiA5OwogICAgICB9CgogICAgICAuZmxleC0xMCB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH0KCiAgICAgIC5mbGV4LTExIHsKICAgICAgICAtbXMtZmxleDogMTE7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMTsKICAgICAgICBmbGV4OiAxMTsKICAgICAgfQoKICAgICAgLmZsZXgtMTIgewogICAgICAgIC1tcy1mbGV4OiAxMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDEyOwogICAgICAgIGZsZXg6IDEyOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1wb3NpdGlvbmluZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaW52aXNpYmxlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnJlbGF0aXZlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIGJvZHkuZnVsbGJsZWVkIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNjcm9sbCB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwogICAgICAuZml4ZWQtYm90dG9tLAogICAgICAuZml4ZWQtbGVmdCwKICAgICAgLmZpeGVkLXJpZ2h0LAogICAgICAuZml4ZWQtdG9wIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtcmlnaHQgewogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1ib3R0b20gewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtbGVmdCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogIDpyb290IHsKICAgIC0tdGItb3JhbmdlLXdlYWs6ICNmZmE3MjY7CiAgICAtLXRiLW9yYW5nZS1zdHJvbmc6ICNmNTdjMDA7CiAgICAtLXRiLW9yYW5nZS1kYXJrOiAjZGM3MzIwOwogICAgLS10Yi1ncmV5LWRhcmtlcjogI2UyZTJlMjsKICAgIC0tdGItZ3JleS1saWdodGVyOiAjZjNmM2YzOwogICAgLS10Yi11aS1kYXJrLWFjY2VudDogIzc1NzU3NTsKICAgIC0tdGItdWktbGlnaHQtYWNjZW50OiAjZTBlMGUwOwogICAgLS10Yi1ncmFwaC1mYWRlZDogI2UwZDRiMzsKICB9Cjwvc3R5bGU+CgoKPGRvbS1tb2R1bGUgaWQ9ImRhc2hib2FyZC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nOiAxNXB4OwogICAgICAgIC0tc2lkZWJhci1sZWZ0LXBhZGRpbmc6IDMwcHg7CiAgICAgIH0KCiAgICAgIFtzbG90PSdzaWRlYmFyJ10gewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHBhZGRpbmc6IDVweCAwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgbGVmdDogdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpOwogICAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgKiAyKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgLnNlYXJjaC1pbnB1dCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDVweCAwIDEwcHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gewogICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpOwogICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMAogICAgICAgICAgdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbjpsYXN0LW9mLXR5cGUgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgcGFkZGluZy10b3A6IDA7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiBoMyB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJzY3JvbGxiYXItc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRhc2hib2FyZC1sYXlvdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InNpZGViYXIiPgogICAgICA8c2xvdCBuYW1lPSJzaWRlYmFyIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjZW50ZXIiPgogICAgICA8c2xvdCBuYW1lPSJjZW50ZXIiIGNsYXNzPSJzY29sbGJhciI+PC9zbG90PgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpZGViYXIgewogICAgICAgIGZsZXg6IDAgMCB2YXIoLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItYmFzaXMsIDI1JSk7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1heC13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aCwgMzUwcHgpOwogICAgICAgIG1pbi13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1pbi13aWR0aCwgMjcwcHgpOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgICNjZW50ZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKFtzbG90PSdjZW50ZXInXSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAudGYtZ3JhcGgtZGFzaGJvYXJkICNjZW50ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcHRpb24tc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9IndyYXAiPgogICAgICA8aDM+W1tuYW1lXV08L2gzPgogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LXdyYXBwZXIiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCguc2VsZWN0ZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIGgzIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogMCAwIDVweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWNvbGxhcHNlIj4KCiAgPHRlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLWlyb24tY29sbGFwc2UtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMzAwbXMpOwogICAgICAgIC8qIFNhZmFyaSAxMCBuZWVkcyB0aGlzIHByb3BlcnR5IHByZWZpeGVkIHRvIGNvcnJlY3RseSBhcHBseSB0aGUgY3VzdG9tIHByb3BlcnR5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmlyb24tY29sbGFwc2UtY2xvc2VkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1jb2xsYXBzZS1vcGVuZWQpKSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CgogIDwvdGVtcGxhdGU+Cgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcGFuZVJlbmRlcmVkXV0iIGlkPSJpZlJlbmRlcmVkIj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iaGVhZGluZyIgb24tdGFwPSJfdG9nZ2xlUGFuZSIgb3Blbi1idXR0b24kPSJbW29wZW5lZF1dIj4KICAgICAgICA8c3BhbiBjbGFzcz0ibmFtZSI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0NvbXBvc2l0ZVNlYXJjaChjYXRlZ29yeSldXSI+CiAgICAgICAgICAgICAgPHNwYW4+VGFncyBtYXRjaGluZyBtdWx0aXBsZSBleHBlcmltZW50czwvc3Bhbj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzSW52YWxpZFNlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4mbmJzcDs8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc0NvbXBvc2l0ZVNlYXJjaChjYXRlZ29yeSldXSI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxpZ2h0Ij5UYWdzIG1hdGNoaW5nIC88L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LW5hbWUiIHRpdGxlJD0iW1tjYXRlZ29yeS5uYW1lXV0iPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaWdodCI+Lzwvc3Bhbj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVW5pdmVyc2FsU2VhcmNoUXVlcnldXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4gKGFsbCB0YWdzKTwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNJbnZhbGlkU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgICAgIDxzcGFuPiA8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LW5hbWUiIHRpdGxlJD0iW1tjYXRlZ29yeS5uYW1lXV0iPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvdW50Ij4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVdXSI+CiAgICAgICAgICAgIDxzcGFuPltbX2NvdW50XV08L3NwYW4+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJleHBhbmQtbW9yZSIgY2xhc3M9ImV4cGFuZC1hcnJvdyI+PC9pcm9uLWljb24+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2J1dHRvbj4KICAgICAgCiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tvcGVuZWRdXSIgbm8tYW5pbWF0aW9uPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgPHNwYW4gaWQ9InRvcC1vZi1jb250YWluZXIiPjwvc3Bhbj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbXVsdGlwbGVQYWdlc0V4aXN0XV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJiaWctcGFnZS1idXR0b25zIiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMTBweDsiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybVByZXZpb3VzUGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzUHJldmlvdXNQYWdlXV0iPlByZXZpb3VzIHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iX3BlcmZvcm1OZXh0UGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzTmV4dFBhZ2VdXSI+TmV4dCBwYWdlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGlkPSJpdGVtcyI+CiAgICAgICAgICAgIDxzbG90IG5hbWU9Iml0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbXVsdGlwbGVQYWdlc0V4aXN0XV0iPgogICAgICAgICAgICA8ZGl2IGlkPSJjb250cm9scy1jb250YWluZXIiPgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogMCA1cHgiPgogICAgICAgICAgICAgICAgUGFnZQogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJwYWdlLWlucHV0IiB0eXBlPSJudW1iZXIiIG5vLWxhYmVsLWZsb2F0IG1pbj0iMSIgbWF4PSJbW19wYWdlQ291bnRdXSIgdmFsdWU9IltbX3BhZ2VJbnB1dFZhbHVlXV0iIG9uLWlucHV0PSJfaGFuZGxlUGFnZUlucHV0RXZlbnQiIG9uLWNoYW5nZT0iX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCIgb24tZm9jdXM9Il9oYW5kbGVQYWdlRm9jdXNFdmVudCIgb24tYmx1cj0iX2hhbmRsZVBhZ2VCbHVyRXZlbnQiPjwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICBvZiBbW19wYWdlQ291bnRdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNQcmV2aW91c1BhZ2VdXSI+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybU5leHRQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIj5OZXh0IHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAwIDVweCAxcHggMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZpcnN0LW9mLXR5cGUpIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICA6aG9zdCg6bGFzdC1vZi10eXBlKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmhlYWRpbmcgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgIH0KCiAgICAgIFtvcGVuLWJ1dHRvbl0gewogICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbb3Blbi1idXR0b25dIC5leHBhbmQtYXJyb3cgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlWigxODBkZWcpOwogICAgICB9CgogICAgICAubmFtZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmxpZ2h0IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICB9CgogICAgICAuY2F0ZWdvcnktbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHBhZGRpbmc6IDJweCAwOwogICAgICB9CgogICAgICAuY291bnQgewogICAgICAgIG1hcmdpbjogMCA1cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGVkZWRlOwogICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgIH0KCiAgICAgIC5saWdodCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbGV4LWJhc2lzOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIH0KCiAgICAgIHNsb3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgICNwYWdlLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IHZhcigtLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgsIDEwMCUpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZGlhbG9nLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbjogMjRweCA0MHB4OwoKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1kaWFsb2ctYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWRpYWxvZy1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtYm9keTE7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZzsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG1hcmdpbi10b3A6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMCAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgubm8tcGFkZGluZykgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIAogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgqOmZpcnN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpsYXN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQoKICAgICAgLyogSW4gMS54LCB0aGlzIHNlbGVjdG9yIHdhcyBgOmhvc3QgPiA6OmNvbnRlbnQgaDJgLiBJbiAyLnggPHNsb3Q+IGFsbG93cwogICAgICB0byBzZWxlY3QgZGlyZWN0IGNoaWxkcmVuIG9ubHksIHdoaWNoIGluY3JlYXNlcyB0aGUgd2VpZ2h0IG9mIHRoaXMKICAgICAgc2VsZWN0b3IsIHNvIHdlIGhhdmUgdG8gcmUtZGVmaW5lIGZpcnN0LWNoaWxkL2xhc3QtY2hpbGQgbWFyZ2lucyBiZWxvdy4gKi8KICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDIpIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAwOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXRpdGxlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tdG9wLiAqLwogICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXRpdGxlOwogICAgICB9CgogICAgICAvKiBBcHBseSBtaXhpbiBhZ2FpbiwgaW4gY2FzZSBpdCBzZXRzIG1hcmdpbi1ib3R0b20uICovCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyOmxhc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLnBhcGVyLWRpYWxvZy1idXR0b25zKSwKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLmJ1dHRvbnMpIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4IDhweCA4cHggMjRweDsKICAgICAgICBtYXJnaW46IDA7CgogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctYnV0dG9uLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY29sb3Itc2NhbGUiPgogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgo8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJpY29ucyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iM2Qtcm90YXRpb24iPjxwYXRoIGQ9Ik03LjUyIDIxLjQ4QzQuMjUgMTkuOTQgMS45MSAxNi43NiAxLjU1IDEzSC4wNUMuNTYgMTkuMTYgNS43MSAyNCAxMiAyNGwuNjYtLjAzLTMuODEtMy44MS0xLjMzIDEuMzJ6bS44OS02LjUyYy0uMTkgMC0uMzctLjAzLS41Mi0uMDgtLjE2LS4wNi0uMjktLjEzLS40LS4yNC0uMTEtLjEtLjItLjIyLS4yNi0uMzctLjA2LS4xNC0uMDktLjMtLjA5LS40N2gtMS4zYzAgLjM2LjA3LjY4LjIxLjk1LjE0LjI3LjMzLjUuNTYuNjkuMjQuMTguNTEuMzIuODIuNDEuMy4xLjYyLjE1Ljk2LjE1LjM3IDAgLjcyLS4wNSAxLjAzLS4xNS4zMi0uMS42LS4yNS44My0uNDRzLjQyLS40My41NS0uNzJjLjEzLS4yOS4yLS42MS4yLS45NyAwLS4xOS0uMDItLjM4LS4wNy0uNTYtLjA1LS4xOC0uMTItLjM1LS4yMy0uNTEtLjEtLjE2LS4yNC0uMy0uNC0uNDMtLjE3LS4xMy0uMzctLjIzLS42MS0uMzEuMi0uMDkuMzctLjIuNTItLjMzLjE1LS4xMy4yNy0uMjcuMzctLjQyLjEtLjE1LjE3LS4zLjIyLS40Ni4wNS0uMTYuMDctLjMyLjA3LS40OCAwLS4zNi0uMDYtLjY4LS4xOC0uOTYtLjEyLS4yOC0uMjktLjUxLS41MS0uNjktLjItLjE5LS40Ny0uMzMtLjc3LS40M0M5LjEgOC4wNSA4Ljc2IDggOC4zOSA4Yy0uMzYgMC0uNjkuMDUtMSAuMTYtLjMuMTEtLjU3LjI2LS43OS40NS0uMjEuMTktLjM4LjQxLS41MS42Ny0uMTIuMjYtLjE4LjU0LS4xOC44NWgxLjNjMC0uMTcuMDMtLjMyLjA5LS40NXMuMTQtLjI1LjI1LS4zNGMuMTEtLjA5LjIzLS4xNy4zOC0uMjIuMTUtLjA1LjMtLjA4LjQ4LS4wOC40IDAgLjcuMS44OS4zMS4xOS4yLjI5LjQ5LjI5Ljg2IDAgLjE4LS4wMy4zNC0uMDguNDktLjA1LjE1LS4xNC4yNy0uMjUuMzctLjExLjEtLjI1LjE4LS40MS4yNC0uMTYuMDYtLjM2LjA5LS41OC4wOUg3LjV2MS4wM2guNzdjLjIyIDAgLjQyLjAyLjYuMDdzLjMzLjEzLjQ1LjIzYy4xMi4xMS4yMi4yNC4yOS40LjA3LjE2LjEuMzUuMS41NyAwIC40MS0uMTIuNzItLjM1LjkzLS4yMy4yMy0uNTUuMzMtLjk1LjMzem04LjU1LTUuOTJjLS4zMi0uMzMtLjctLjU5LTEuMTQtLjc3LS40My0uMTgtLjkyLS4yNy0xLjQ2LS4yN0gxMnY4aDIuM2MuNTUgMCAxLjA2LS4wOSAxLjUxLS4yNy40NS0uMTguODQtLjQzIDEuMTYtLjc2LjMyLS4zMy41Ny0uNzMuNzQtMS4xOS4xNy0uNDcuMjYtLjk5LjI2LTEuNTd2LS40YzAtLjU4LS4wOS0xLjEtLjI2LTEuNTctLjE4LS40Ny0uNDMtLjg3LS43NS0xLjJ6bS0uMzkgMy4xNmMwIC40Mi0uMDUuNzktLjE0IDEuMTMtLjEuMzMtLjI0LjYyLS40My44NS0uMTkuMjMtLjQzLjQxLS43MS41My0uMjkuMTItLjYyLjE4LS45OS4xOGgtLjkxVjkuMTJoLjk3Yy43MiAwIDEuMjcuMjMgMS42NC42OS4zOC40Ni41NyAxLjEyLjU3IDEuOTl2LjR6TTEyIDBsLS42Ni4wMyAzLjgxIDMuODEgMS4zMy0xLjMzYzMuMjcgMS41NSA1LjYxIDQuNzIgNS45NiA4LjQ4aDEuNUMyMy40NCA0Ljg0IDE4LjI5IDAgMTIgMHoiIC8+PC9nPgo8ZyBpZD0iYWNjZXNzaWJpbGl0eSI+PHBhdGggZD0iTTEyIDJjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem05IDdoLTZ2MTNoLTJ2LTZoLTJ2Nkg5VjlIM1Y3aDE4djJ6IiAvPjwvZz4KPGcgaWQ9ImFjY2Vzc2libGUiPjxjaXJjbGUgY3g9IjEyIiBjeT0iNCIgcj0iMiIgLz48cGF0aCBkPSJNMTkgMTN2LTJjLTEuNTQuMDItMy4wOS0uNzUtNC4wNy0xLjgzbC0xLjI5LTEuNDNjLS4xNy0uMTktLjM4LS4zNC0uNjEtLjQ1LS4wMSAwLS4wMS0uMDEtLjAyLS4wMUgxM2MtLjM1LS4yLS43NS0uMy0xLjE5LS4yNkMxMC43NiA3LjExIDEwIDguMDQgMTAgOS4wOVYxNWMwIDEuMS45IDIgMiAyaDV2NWgydi01LjVjMC0xLjEtLjktMi0yLTJoLTN2LTMuNDVjMS4yOSAxLjA3IDMuMjUgMS45NCA1IDEuOTV6bS02LjE3IDVjLS40MSAxLjE2LTEuNTIgMi0yLjgzIDItMS42NiAwLTMtMS4zNC0zLTMgMC0xLjMxLjg0LTIuNDEgMi0yLjgzVjEyLjFjLTIuMjguNDYtNCAyLjQ4LTQgNC45IDAgMi43NiAyLjI0IDUgNSA1IDIuNDIgMCA0LjQ0LTEuNzIgNC45LTRoLTIuMDd6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYmFsYW5jZSI+PHBhdGggZD0iTTQgMTB2N2gzdi03SDR6bTYgMHY3aDN2LTdoLTN6TTIgMjJoMTl2LTNIMnYzem0xNC0xMnY3aDN2LTdoLTN6bS00LjUtOUwyIDZ2MmgxOVY2bC05LjUtNXoiIC8+PC9nPgo8ZyBpZD0iYWNjb3VudC1iYWxhbmNlLXdhbGxldCI+PHBhdGggZD0iTTIxIDE4djFjMCAxLjEtLjkgMi0yIDJINWMtMS4xMSAwLTItLjktMi0yVjVjMC0xLjEuODktMiAyLTJoMTRjMS4xIDAgMiAuOSAyIDJ2MWgtOWMtMS4xMSAwLTIgLjktMiAydjhjMCAxLjEuODkgMiAyIDJoOXptLTktMmgxMFY4SDEydjh6bTQtMi41Yy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0iYWNjb3VudC1ib3giPjxwYXRoIGQ9Ik0zIDV2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMkg1Yy0xLjExIDAtMiAuOS0yIDJ6bTEyIDRjMCAxLjY2LTEuMzQgMy0zIDNzLTMtMS4zNC0zLTMgMS4zNC0zIDMtMyAzIDEuMzQgMyAzem0tOSA4YzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxSDZ2LTF6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptMCAxNC4yYy0yLjUgMC00LjcxLTEuMjgtNi0zLjIyLjAzLTEuOTkgNC0zLjA4IDYtMy4wOCAxLjk5IDAgNS45NyAxLjA5IDYgMy4wOC0xLjI5IDEuOTQtMy41IDMuMjItNiAzLjIyeiIgLz48L2c+CjxnIGlkPSJhZGQiPjxwYXRoIGQ9Ik0xOSAxM2gtNnY2aC0ydi02SDV2LTJoNlY1aDJ2Nmg2djJ6IiAvPjwvZz4KPGcgaWQ9ImFkZC1hbGVydCI+PHBhdGggZD0iTTEwLjAxIDIxLjAxYzAgMS4xLjg5IDEuOTkgMS45OSAxLjk5czEuOTktLjg5IDEuOTktMS45OWgtMy45OHptOC44Ny00LjE5VjExYzAtMy4yNS0yLjI1LTUuOTctNS4yOS02LjY5di0uNzJDMTMuNTkgMi43MSAxMi44OCAyIDEyIDJzLTEuNTkuNzEtMS41OSAxLjU5di43MkM3LjM3IDUuMDMgNS4xMiA3Ljc1IDUuMTIgMTF2NS44MkwzIDE4Ljk0VjIwaDE4di0xLjA2bC0yLjEyLTIuMTJ6TTE2IDEzLjAxaC0zdjNoLTJ2LTNIOFYxMWgzVjhoMnYzaDN2Mi4wMXoiIC8+PC9nPgo8ZyBpZD0iYWRkLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0yIDEwaC00djRoLTJ2LTRIN3YtMmg0VjdoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFoLTR2NGgtMnYtNEg3di0yaDRWN2gydjRoNHYyeiIgLz48L2c+CjxnIGlkPSJhZGQtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMyA3aC0ydjRIN3YyaDR2NGgydi00aDR2LTJoLTRWN3ptLTEtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImFkZC1zaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNMTEgOWgyVjZoM1Y0aC0zVjFoLTJ2M0g4djJoM3Yzem0tNCA5Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yem0xMCAwYy0xLjEgMC0xLjk5LjktMS45OSAycy44OSAyIDEuOTkgMiAyLS45IDItMi0uOS0yLTItMnptLTkuODMtMy4yNWwuMDMtLjEyLjktMS42M2g3LjQ1Yy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjg2LTcuMDFMMTkuNDIgNGgtLjAxbC0xLjEgMi0yLjc2IDVIOC41M2wtLjEzLS4yN0w2LjE2IDZsLS45NS0yLS45NC0ySDF2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTMgMC0uMjUtLjExLS4yNS0uMjV6IiAvPjwvZz4KPGcgaWQ9ImFsYXJtIj48cGF0aCBkPSJNMjIgNS43MmwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTcuODggMy4zOUw2LjYgMS44NiAyIDUuNzFsMS4yOSAxLjUzIDQuNTktMy44NXpNMTIuNSA4SDExdjZsNC43NSAyLjg1Ljc1LTEuMjMtNC0yLjM3Vjh6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3eiIgLz48L2c+CjxnIGlkPSJhbGFybS1hZGQiPjxwYXRoIGQ9Ik03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptMS0xMWgtMnYzSDh2MmgzdjNoMnYtM2gzdi0yaC0zVjl6IiAvPjwvZz4KPGcgaWQ9ImFsYXJtLW9mZiI+PHBhdGggZD0iTTEyIDZjMy44NyAwIDcgMy4xMyA3IDcgMCAuODQtLjE2IDEuNjUtLjQzIDIuNGwxLjUyIDEuNTJjLjU4LTEuMTkuOTEtMi41MS45MS0zLjkyIDAtNC45Ny00LjAzLTktOS05LTEuNDEgMC0yLjczLjMzLTMuOTIuOTFMOS42IDYuNDNDMTAuMzUgNi4xNiAxMS4xNiA2IDEyIDZ6bTEwLS4yOGwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTIuOTIgMi4yOUwxLjY1IDMuNTcgMi45OCA0LjlsLTEuMTEuOTMgMS40MiAxLjQyIDEuMTEtLjk0LjguOEMzLjgzIDguNjkgMyAxMC43NSAzIDEzYzAgNC45NyA0LjAyIDkgOSA5IDIuMjUgMCA0LjMxLS44MyA1Ljg5LTIuMmwyLjIgMi4yIDEuMjctMS4yN0wzLjg5IDMuMjdsLS45Ny0uOTh6bTEzLjU1IDE2LjFDMTUuMjYgMTkuMzkgMTMuNyAyMCAxMiAyMGMtMy44NyAwLTctMy4xMy03LTcgMC0xLjcuNjEtMy4yNiAxLjYxLTQuNDdsOS44NiA5Ljg2ek04LjAyIDMuMjhMNi42IDEuODZsLS44Ni43MSAxLjQyIDEuNDIuODYtLjcxeiIgLz48L2c+CjxnIGlkPSJhbGFybS1vbiI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3em0tMS40Ni01LjQ3TDguNDEgMTIuNGwtMS4wNiAxLjA2IDMuMTggMy4xOCA2LTYtMS4wNi0xLjA2LTQuOTMgNC45NXoiIC8+PC9nPgo8ZyBpZD0iYWxsLW91dCI+PHBhdGggZD0iTTE2LjIxIDQuMTZsNCA0di00em00IDEybC00IDRoNHptLTEyIDRsLTQtNHY0em0tNC0xMmw0LTRoLTR6bTEyLjk1LS45NWMtMi43My0yLjczLTcuMTctMi43My05LjkgMHMtMi43MyA3LjE3IDAgOS45IDcuMTcgMi43MyA5LjkgMCAyLjczLTcuMTYgMC05Ljl6bS0xLjEgOC44Yy0yLjEzIDIuMTMtNS41NyAyLjEzLTcuNyAwcy0yLjEzLTUuNTcgMC03LjcgNS41Ny0yLjEzIDcuNyAwIDIuMTMgNS41NyAwIDcuN3oiIC8+PC9nPgo8ZyBpZD0iYW5kcm9pZCI+PHBhdGggZD0iTTYgMThjMCAuNTUuNDUgMSAxIDFoMXYzLjVjMCAuODMuNjcgMS41IDEuNSAxLjVzMS41LS42NyAxLjUtMS41VjE5aDJ2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgxYy41NSAwIDEtLjQ1IDEtMVY4SDZ2MTB6TTMuNSA4QzIuNjcgOCAyIDguNjcgMiA5LjV2N2MwIC44My42NyAxLjUgMS41IDEuNVM1IDE3LjMzIDUgMTYuNXYtN0M1IDguNjcgNC4zMyA4IDMuNSA4em0xNyAwYy0uODMgMC0xLjUuNjctMS41IDEuNXY3YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNXYtN2MwLS44My0uNjctMS41LTEuNS0xLjV6bS00Ljk3LTUuODRsMS4zLTEuM2MuMi0uMi4yLS41MSAwLS43MS0uMi0uMi0uNTEtLjItLjcxIDBsLTEuNDggMS40OEMxMy44NSAxLjIzIDEyLjk1IDEgMTIgMWMtLjk2IDAtMS44Ni4yMy0yLjY2LjYzTDcuODUuMTVjLS4yLS4yLS41MS0uMi0uNzEgMC0uMi4yLS4yLjUxIDAgLjcxbDEuMzEgMS4zMUM2Ljk3IDMuMjYgNiA1LjAxIDYgN2gxMmMwLTEuOTktLjk3LTMuNzUtMi40Ny00Ljg0ek0xMCA1SDlWNGgxdjF6bTUgMGgtMVY0aDF2MXoiIC8+PC9nPgo8ZyBpZD0iYW5ub3VuY2VtZW50Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDloLTJWNWgydjZ6bTAgNGgtMnYtMmgydjJ6IiAvPjwvZz4KPGcgaWQ9ImFwcHMiPjxwYXRoIGQ9Ik00IDhoNFY0SDR2NHptNiAxMmg0di00aC00djR6bS02IDBoNHYtNEg0djR6bTAtNmg0di00SDR2NHptNiAwaDR2LTRoLTR2NHptNi0xMHY0aDRWNGgtNHptLTYgNGg0VjRoLTR2NHptNiA2aDR2LTRoLTR2NHptMCA2aDR2LTRoLTR2NHoiIC8+PC9nPgo8ZyBpZD0iYXJjaGl2ZSI+PHBhdGggZD0iTTIwLjU0IDUuMjNsLTEuMzktMS42OEMxOC44OCAzLjIxIDE4LjQ3IDMgMTggM0g2Yy0uNDcgMC0uODguMjEtMS4xNi41NUwzLjQ2IDUuMjNDMy4xNyA1LjU3IDMgNi4wMiAzIDYuNVYxOWMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjYuNWMwLS40OC0uMTctLjkzLS40Ni0xLjI3ek0xMiAxNy41TDYuNSAxMkgxMHYtMmg0djJoMy41TDEyIDE3LjV6TTUuMTIgNWwuODEtMWgxMmwuOTQgMUg1LjEyeiIgLz48L2c+CjxnIGlkPSJhcnJvdy1iYWNrIj48cGF0aCBkPSJNMjAgMTFINy44M2w1LjU5LTUuNTlMMTIgNGwtOCA4IDggOCAxLjQxLTEuNDFMNy44MyAxM0gyMHYtMnoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctZG93bndhcmQiPjxwYXRoIGQ9Ik0yMCAxMmwtMS40MS0xLjQxTDEzIDE2LjE3VjRoLTJ2MTIuMTdsLTUuNTgtNS41OUw0IDEybDggOCA4LTh6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtZG93biI+PHBhdGggZD0iTTcgMTBsNSA1IDUtNXoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMTJsLTQtNGg4bC00IDR6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtdXAiPjxwYXRoIGQ9Ik03IDE0bDUtNSA1IDV6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWZvcndhcmQiPjxwYXRoIGQ9Ik0xMiA0bC0xLjQxIDEuNDFMMTYuMTcgMTFINHYyaDEyLjE3bC01LjU4IDUuNTlMMTIgMjBsOC04eiIgLz48L2c+CjxnIGlkPSJhcnJvdy11cHdhcmQiPjxwYXRoIGQ9Ik00IDEybDEuNDEgMS40MUwxMSA3LjgzVjIwaDJWNy44M2w1LjU4IDUuNTlMMjAgMTJsLTgtOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImFzcGVjdC1yYXRpbyI+PHBhdGggZD0iTTE5IDEyaC0ydjNoLTN2Mmg1di01ek03IDloM1Y3SDV2NWgyVjl6bTE0LTZIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnoiIC8+PC9nPgo8ZyBpZD0iYXNzZXNzbWVudCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50Ij48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTIgMTRIN3YtMmg3djJ6bTMtNEg3di0yaDEwdjJ6bTAtNEg3VjdoMTB2MnoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1pbmQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMCA0YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xLjRjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xVjE5eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LWxhdGUiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS02IDE1aC0ydi0yaDJ2MnptMC00aC0yVjhoMnY2em0tMS05Yy0uNTUgMC0xLS40NS0xLTFzLjQ1LTEgMS0xIDEgLjQ1IDEgMS0uNDUgMS0xIDF6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTQgMTJoLTR2M2wtNS01IDUtNXYzaDR2NHoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1yZXR1cm5lZCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0wIDE1bC01LTVoM1Y5aDR2NGgzbC01IDV6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtdHVybmVkLWluIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bS0yIDE0bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6IiAvPjwvZz4KPGcgaWQ9ImF0dGFjaG1lbnQiPjxwYXRoIGQ9Ik0yIDEyLjVDMiA5LjQ2IDQuNDYgNyA3LjUgN0gxOGMyLjIxIDAgNCAxLjc5IDQgNHMtMS43OSA0LTQgNEg5LjVDOC4xMiAxNSA3IDEzLjg4IDcgMTIuNVM4LjEyIDEwIDkuNSAxMEgxN3YySDkuNDFjLS41NSAwLS41NSAxIDAgMUgxOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTJINy41QzUuNTcgOSA0IDEwLjU3IDQgMTIuNVM1LjU3IDE2IDcuNSAxNkgxN3YySDcuNUM0LjQ2IDE4IDIgMTUuNTQgMiAxMi41eiIgLz48L2c+CjxnIGlkPSJhdXRvcmVuZXciPjxwYXRoIGQ9Ik0xMiA2djNsNC00LTQtNHYzYy00LjQyIDAtOCAzLjU4LTggOCAwIDEuNTcuNDYgMy4wMyAxLjI0IDQuMjZMNi43IDE0LjhjLS40NS0uODMtLjctMS43OS0uNy0yLjggMC0zLjMxIDIuNjktNiA2LTZ6bTYuNzYgMS43NEwxNy4zIDkuMmMuNDQuODQuNyAxLjc5LjcgMi44IDAgMy4zMS0yLjY5IDYtNiA2di0zbC00IDQgNCA0di0zYzQuNDIgMCA4LTMuNTggOC04IDAtMS41Ny0uNDYtMy4wMy0xLjI0LTQuMjZ6IiAvPjwvZz4KPGcgaWQ9ImJhY2tzcGFjZSI+PHBhdGggZD0iTTIyIDNIN2MtLjY5IDAtMS4yMy4zNS0xLjU5Ljg4TDAgMTJsNS40MSA4LjExYy4zNi41My45Ljg5IDEuNTkuODloMTVjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTMgMTIuNTlMMTcuNTkgMTcgMTQgMTMuNDEgMTAuNDEgMTcgOSAxNS41OSAxMi41OSAxMiA5IDguNDEgMTAuNDEgNyAxNCAxMC41OSAxNy41OSA3IDE5IDguNDEgMTUuNDEgMTIgMTkgMTUuNTl6IiAvPjwvZz4KPGcgaWQ9ImJhY2t1cCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6IiAvPjwvZz4KPGcgaWQ9ImJsb2NrIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNNCAxMmMwLTQuNDIgMy41OC04IDgtOCAxLjg1IDAgMy41NS42MyA0LjkgMS42OUw1LjY5IDE2LjlDNC42MyAxNS41NSA0IDEzLjg1IDQgMTJ6bTggOGMtMS44NSAwLTMuNTUtLjYzLTQuOS0xLjY5TDE4LjMxIDcuMUMxOS4zNyA4LjQ1IDIwIDEwLjE1IDIwIDEyYzAgNC40Mi0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJib29rIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiIgLz48L2c+CjxnIGlkPSJib29rbWFyayI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iYm9va21hcmstYm9yZGVyIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiIgLz48L2c+CjxnIGlkPSJidWctcmVwb3J0Ij48cGF0aCBkPSJNMjAgOGgtMi44MWMtLjQ1LS43OC0xLjA3LTEuNDUtMS44Mi0xLjk2TDE3IDQuNDEgMTUuNTkgM2wtMi4xNyAyLjE3QzEyLjk2IDUuMDYgMTIuNDkgNSAxMiA1Yy0uNDkgMC0uOTYuMDYtMS40MS4xN0w4LjQxIDMgNyA0LjQxbDEuNjIgMS42M0M3Ljg4IDYuNTUgNy4yNiA3LjIyIDYuODEgOEg0djJoMi4wOWMtLjA1LjMzLS4wOS42Ni0uMDkgMXYxSDR2MmgydjFjMCAuMzQuMDQuNjcuMDkgMUg0djJoMi44MWMxLjA0IDEuNzkgMi45NyAzIDUuMTkgM3M0LjE1LTEuMjEgNS4xOS0zSDIwdi0yaC0yLjA5Yy4wNS0uMzMuMDktLjY2LjA5LTF2LTFoMnYtMmgtMnYtMWMwLS4zNC0uMDQtLjY3LS4wOS0xSDIwVjh6bS02IDhoLTR2LTJoNHYyem0wLTRoLTR2LTJoNHYyeiIgLz48L2c+CjxnIGlkPSJidWlsZCI+PHBhdGggZD0iTTIyLjcgMTlsLTkuMS05LjFjLjktMi4zLjQtNS0xLjUtNi45LTItMi01LTIuNC03LjQtMS4zTDkgNiA2IDkgMS42IDQuN0MuNCA3LjEuOSAxMC4xIDIuOSAxMi4xYzEuOSAxLjkgNC42IDIuNCA2LjkgMS41bDkuMSA5LjFjLjQuNCAxIC40IDEuNCAwbDIuMy0yLjNjLjUtLjQuNS0xLjEuMS0xLjR6IiAvPjwvZz4KPGcgaWQ9ImNhY2hlZCI+PHBhdGggZD0iTTE5IDhsLTQgNGgzYzAgMy4zMS0yLjY5IDYtNiA2LTEuMDEgMC0xLjk3LS4yNS0yLjgtLjdsLTEuNDYgMS40NkM4Ljk3IDE5LjU0IDEwLjQzIDIwIDEyIDIwYzQuNDIgMCA4LTMuNTggOC04aDNsLTQtNHpNNiAxMmMwLTMuMzEgMi42OS02IDYtNiAxLjAxIDAgMS45Ny4yNSAyLjguN2wxLjQ2LTEuNDZDMTUuMDMgNC40NiAxMy41NyA0IDEyIDRjLTQuNDIgMC04IDMuNTgtOCA4SDFsNCA0IDQtNEg2eiIgLz48L2c+CjxnIGlkPSJjYW1lcmEtZW5oYW5jZSI+PHBhdGggZD0iTTkgM0w3LjE3IDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yaC0zLjE3TDE1IDNIOXptMyAxNWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6bTAtMWwxLjI1LTIuNzVMMTYgMTNsLTIuNzUtMS4yNUwxMiA5bC0xLjI1IDIuNzVMOCAxM2wyLjc1IDEuMjV6IiAvPjwvZz4KPGcgaWQ9ImNhbmNlbCI+PHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTUgMTMuNTlMMTUuNTkgMTcgMTIgMTMuNDEgOC40MSAxNyA3IDE1LjU5IDEwLjU5IDEyIDcgOC40MSA4LjQxIDcgMTIgMTAuNTkgMTUuNTkgNyAxNyA4LjQxIDEzLjQxIDEyIDE3IDE1LjU5eiIgLz48L2c+CjxnIGlkPSJjYXJkLWdpZnRjYXJkIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6IiAvPjwvZz4KPGcgaWQ9ImNhcmQtbWVtYmVyc2hpcCI+PHBhdGggZD0iTTIwIDJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoNHY1bDQtMiA0IDJ2LTVoNGMxLjExIDAgMi0uODkgMi0yVjRjMC0xLjExLS44OS0yLTItMnptMCAxM0g0di0yaDE2djJ6bTAtNUg0VjRoMTZ2NnoiIC8+PC9nPgo8ZyBpZD0iY2FyZC10cmF2ZWwiPjxwYXRoIGQ9Ik0yMCA2aC0zVjRjMC0xLjExLS44OS0yLTItMkg5Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6TTkgNGg2djJIOVY0em0xMSAxNUg0di0yaDE2djJ6bTAtNUg0VjhoM3YyaDJWOGg2djJoMlY4aDN2NnoiIC8+PC9nPgo8ZyBpZD0iY2hhbmdlLWhpc3RvcnkiPjxwYXRoIGQ9Ik0xMiA3Ljc3TDE4LjM5IDE4SDUuNjFMMTIgNy43N00xMiA0TDIgMjBoMjBMMTIgNHoiIC8+PC9nPgo8ZyBpZD0iY2hlY2siPjxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiIC8+PC9nPgo8ZyBpZD0iY2hlY2stYm94Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjkgMi0yVjVjMC0xLjEtLjg5LTItMi0yem0tOSAxNGwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiIgLz48L2c+CjxnIGlkPSJjaGVjay1ib3gtb3V0bGluZS1ibGFuayI+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0yIDE1bC01LTUgMS40MS0xLjQxTDEwIDE0LjE3bDcuNTktNy41OUwxOSA4bC05IDl6IiAvPjwvZz4KPGcgaWQ9ImNoZXZyb24tbGVmdCI+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNoZXZyb24tcmlnaHQiPjxwYXRoIGQ9Ik0xMCA2TDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiIC8+PC9nPgo8ZyBpZD0iY2hyb21lLXJlYWRlci1tb2RlIj48cGF0aCBkPSJNMTMgMTJoN3YxLjVoLTd6bTAtMi41aDdWMTFoLTd6bTAgNWg3VjE2aC03ek0yMSA0SDNjLTEuMSAwLTIgLjktMiAydjEzYzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNWgtOVY2aDl2MTN6IiAvPjwvZz4KPGcgaWQ9ImNsYXNzIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiIgLz48L2c+CjxnIGlkPSJjbGVhciI+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiIC8+PC9nPgo8ZyBpZD0iY2xvc2UiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem00LjUgMTRIOGMtMS42NiAwLTMtMS4zNC0zLTNzMS4zNC0zIDMtM2wuMTQuMDFDOC41OCA4LjI4IDEwLjEzIDcgMTIgN2MyLjIxIDAgNCAxLjc5IDQgNGguNWMxLjM4IDAgMi41IDEuMTIgMi41IDIuNVMxNy44OCAxNiAxNi41IDE2eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1kb25lIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xMCAxN2wtMy41LTMuNSAxLjQxLTEuNDFMMTAgMTQuMTcgMTUuMTggOWwxLjQxIDEuNDFMMTAgMTd6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLWRvd25sb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNyAxM2wtNSA1LTUtNWgzVjloNHY0aDN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLW9mZiI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0Yy0xLjQ4IDAtMi44NS40My00LjAxIDEuMTdsMS40NiAxLjQ2QzEwLjIxIDYuMjMgMTEuMDggNiAxMiA2YzMuMDQgMCA1LjUgMi40NiA1LjUgNS41di41SDE5YzEuNjYgMCAzIDEuMzQgMyAzIDAgMS4xMy0uNjQgMi4xMS0xLjU2IDIuNjJsMS40NSAxLjQ1QzIzLjE2IDE4LjE2IDI0IDE2LjY4IDI0IDE1YzAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0zIDUuMjdsMi43NSAyLjc0QzIuNTYgOC4xNSAwIDEwLjc3IDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTEuNzNsMiAyTDIxIDIwLjczIDQuMjcgNCAzIDUuMjd6TTcuNzMgMTBsOCA4SDZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTRoMS43M3oiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtcXVldWUiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE5IDE4SDZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTRoLjcxQzcuMzcgNy42OSA5LjQ4IDYgMTIgNmMzLjA0IDAgNS41IDIuNDYgNS41IDUuNXYuNUgxOWMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgM3oiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtdXBsb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNCAxM3Y0aC00di00SDdsNS01IDUgNWgtM3oiIC8+PC9nPgo8ZyBpZD0iY29kZSI+PHBhdGggZD0iTTkuNCAxNi42TDQuOCAxMmw0LjYtNC42TDggNmwtNiA2IDYgNiAxLjQtMS40em01LjIgMGw0LjYtNC42LTQuNi00LjZMMTYgNmw2IDYtNiA2LTEuNC0xLjR6IiAvPjwvZz4KPGcgaWQ9ImNvbXBhcmUtYXJyb3dzIj48cGF0aCBkPSJNOS4wMSAxNEgydjJoNy4wMXYzTDEzIDE1bC0zLjk5LTR2M3ptNS45OC0xdi0zSDIyVjhoLTcuMDFWNUwxMSA5bDMuOTkgNHoiIC8+PC9nPgo8ZyBpZD0iY29udGVudC1jb3B5Ij48cGF0aCBkPSJNMTYgMUg0Yy0xLjEgMC0yIC45LTIgMnYxNGgyVjNoMTJWMXptMyA0SDhjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTFjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptMCAxNkg4VjdoMTF2MTR6IiAvPjwvZz4KPGcgaWQ9ImNvbnRlbnQtY3V0Ij48cGF0aCBkPSJNOS42NCA3LjY0Yy4yMy0uNS4zNi0xLjA1LjM2LTEuNjQgMC0yLjIxLTEuNzktNC00LTRTMiAzLjc5IDIgNnMxLjc5IDQgNCA0Yy41OSAwIDEuMTQtLjEzIDEuNjQtLjM2TDEwIDEybC0yLjM2IDIuMzZDNy4xNCAxNC4xMyA2LjU5IDE0IDYgMTRjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNGMwLS41OS0uMTMtMS4xNC0uMzYtMS42NEwxMiAxNGw3IDdoM3YtMUw5LjY0IDcuNjR6TTYgOGMtMS4xIDAtMi0uODktMi0ycy45LTIgMi0yIDIgLjg5IDIgMi0uOSAyLTIgMnptMCAxMmMtMS4xIDAtMi0uODktMi0ycy45LTIgMi0yIDIgLjg5IDIgMi0uOSAyLTIgMnptNi03LjVjLS4yOCAwLS41LS4yMi0uNS0uNXMuMjItLjUuNS0uNS41LjIyLjUuNS0uMjIuNS0uNS41ek0xOSAzbC02IDYgMiAyIDctN1YzeiIgLz48L2c+CjxnIGlkPSJjb250ZW50LXBhc3RlIj48cGF0aCBkPSJNMTkgMmgtNC4xOEMxNC40Ljg0IDEzLjMgMCAxMiAwYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem03IDE4SDVWNGgydjNoMTBWNGgydjE2eiIgLz48L2c+CjxnIGlkPSJjb3B5cmlnaHQiPjxwYXRoIGQ9Ik0xMC4wOCAxMC44NmMuMDUtLjMzLjE2LS42Mi4zLS44N3MuMzQtLjQ2LjU5LS42MmMuMjQtLjE1LjU0LS4yMi45MS0uMjMuMjMuMDEuNDQuMDUuNjMuMTMuMi4wOS4zOC4yMS41Mi4zNnMuMjUuMzMuMzQuNTMuMTMuNDIuMTQuNjRoMS43OWMtLjAyLS40Ny0uMTEtLjktLjI4LTEuMjlzLS40LS43My0uNy0xLjAxLS42Ni0uNS0xLjA4LS42Ni0uODgtLjIzLTEuMzktLjIzYy0uNjUgMC0xLjIyLjExLTEuNy4zNHMtLjg4LjUzLTEuMi45Mi0uNTYuODQtLjcxIDEuMzZTOCAxMS4yOSA4IDExLjg3di4yN2MwIC41OC4wOCAxLjEyLjIzIDEuNjRzLjM5Ljk3LjcxIDEuMzUuNzIuNjkgMS4yLjkxIDEuMDUuMzQgMS43LjM0Yy40NyAwIC45MS0uMDggMS4zMi0uMjNzLjc3LS4zNiAxLjA4LS42My41Ni0uNTguNzQtLjk0LjI5LS43NC4zLTEuMTVoLTEuNzljLS4wMS4yMS0uMDYuNC0uMTUuNThzLS4yMS4zMy0uMzYuNDYtLjMyLjIzLS41Mi4zYy0uMTkuMDctLjM5LjA5LS42LjEtLjM2LS4wMS0uNjYtLjA4LS44OS0uMjMtLjI1LS4xNi0uNDUtLjM3LS41OS0uNjJzLS4yNS0uNTUtLjMtLjg4LS4wOC0uNjctLjA4LTF2LS4yN2MwLS4zNS4wMy0uNjguMDgtMS4wMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImNyZWF0ZSI+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiIC8+PC9nPgo8ZyBpZD0iY3JlYXRlLW5ldy1mb2xkZXIiPjxwYXRoIGQ9Ik0yMCA2aC04bC0yLTJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tMSA4aC0zdjNoLTJ2LTNoLTN2LTJoM1Y5aDJ2M2gzdjJ6IiAvPjwvZz4KPGcgaWQ9ImNyZWRpdC1jYXJkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiIgLz48L2c+CjxnIGlkPSJkYXNoYm9hcmQiPjxwYXRoIGQ9Ik0zIDEzaDhWM0gzdjEwem0wIDhoOHYtNkgzdjZ6bTEwIDBoOFYxMWgtOHYxMHptMC0xOHY2aDhWM2gtOHoiIC8+PC9nPgo8ZyBpZD0iZGF0ZS1yYW5nZSI+PHBhdGggZD0iTTkgMTFIN3YyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTItN2gtMVYyaC0ydjJIOFYySDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDIwYzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY5aDE0djExeiIgLz48L2c+CjxnIGlkPSJkZWxldGUiPjxwYXRoIGQ9Ik02IDE5YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlY3SDZ2MTJ6TTE5IDRoLTMuNWwtMS0xaC01bC0xIDFINXYyaDE0VjR6IiAvPjwvZz4KPGcgaWQ9ImRlbGV0ZS1mb3JldmVyIj48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz48L2c+CjxnIGlkPSJkZWxldGUtc3dlZXAiPjxwYXRoIGQ9Ik0xNSAxNmg0djJoLTR6bTAtOGg3djJoLTd6bTAgNGg2djJoLTZ6TTMgMThjMCAxLjEuOSAyIDIgMmg2YzEuMSAwIDItLjkgMi0yVjhIM3YxMHpNMTQgNWgtM2wtMS0xSDZMNSA1SDJ2MmgxMnoiIC8+PC9nPgo8ZyBpZD0iZGVzY3JpcHRpb24iPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bTIgMTZIOHYtMmg4djJ6bTAtNEg4di0yaDh2MnptLTMtNVYzLjVMMTguNSA5SDEzeiIgLz48L2c+CjxnIGlkPSJkbnMiPjxwYXRoIGQ9Ik0yMCAxM0g0Yy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxNmMuNTUgMCAxLS40NSAxLTF2LTZjMC0uNTUtLjQ1LTEtMS0xek03IDE5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNMjAgM0g0Yy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxNmMuNTUgMCAxLS40NSAxLTFWNGMwLS41NS0uNDUtMS0xLTF6TTcgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6IiAvPjwvZz4KPGcgaWQ9ImRvbmUiPjxwYXRoIGQ9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6IiAvPjwvZz4KPGcgaWQ9ImRvbmUtYWxsIj48cGF0aCBkPSJNMTggN2wtMS40MS0xLjQxLTYuMzQgNi4zNCAxLjQxIDEuNDFMMTggN3ptNC4yNC0xLjQxTDExLjY2IDE2LjE3IDcuNDggMTJsLTEuNDEgMS40MUwxMS42NiAxOWwxMi0xMi0xLjQyLTEuNDF6TS40MSAxMy40MUw2IDE5bDEuNDEtMS40MUwxLjgzIDEyIC40MSAxMy40MXoiIC8+PC9nPgo8ZyBpZD0iZG9udXQtbGFyZ2UiPjxwYXRoIGQ9Ik0xMSA1LjA4VjJjLTUgLjUtOSA0LjgxLTkgMTBzNCA5LjUgOSAxMHYtMy4wOGMtMy0uNDgtNi0zLjQtNi02LjkyczMtNi40NCA2LTYuOTJ6TTE4Ljk3IDExSDIyYy0uNDctNS00LTguNTMtOS05djMuMDhDMTYgNS41MSAxOC41NCA4IDE4Ljk3IDExek0xMyAxOC45MlYyMmM1LS40NyA4LjUzLTQgOS05aC0zLjAzYy0uNDMgMy0yLjk3IDUuNDktNS45NyA1LjkyeiIgLz48L2c+CjxnIGlkPSJkb251dC1zbWFsbCI+PHBhdGggZD0iTTExIDkuMTZWMmMtNSAuNS05IDQuNzktOSAxMHM0IDkuNSA5IDEwdi03LjE2Yy0xLS40MS0yLTEuNTItMi0yLjg0czEtMi40MyAyLTIuODR6TTE0Ljg2IDExSDIyYy0uNDgtNC43NS00LTguNTMtOS05djcuMTZjMSAuMyAxLjUyLjk4IDEuODYgMS44NHpNMTMgMTQuODRWMjJjNS0uNDcgOC41Mi00LjI1IDktOWgtNy4xNGMtLjM0Ljg2LS44NiAxLjU0LTEuODYgMS44NHoiIC8+PC9nPgo8ZyBpZD0iZHJhZnRzIj48cGF0aCBkPSJNMjEuOTkgOGMwLS43Mi0uMzctMS4zNS0uOTQtMS43TDEyIDEgMi45NSA2LjNDMi4zOCA2LjY1IDIgNy4yOCAyIDh2MTBjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMmwtLjAxLTEwek0xMiAxM0wzLjc0IDcuODQgMTIgM2w4LjI2IDQuODRMMTIgMTN6IiAvPjwvZz4KPGcgaWQ9ImVqZWN0Ij48cGF0aCBkPSJNNSAxN2gxNHYySDV6bTctMTJMNS4zMyAxNWgxMy4zNHoiIC8+PC9nPgo8ZyBpZD0iZXJyb3IiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJlcnJvci1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTVoMnYyaC0yem0wLThoMnY2aC0yem0uOTktNUM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJldXJvLXN5bWJvbCI+PHBhdGggZD0iTTE1IDE4LjVjLTIuNTEgMC00LjY4LTEuNDItNS43Ni0zLjVIMTV2LTJIOC41OGMtLjA1LS4zMy0uMDgtLjY2LS4wOC0xcy4wMy0uNjcuMDgtMUgxNVY5SDkuMjRDMTAuMzIgNi45MiAxMi41IDUuNSAxNSA1LjVjMS42MSAwIDMuMDkuNTkgNC4yMyAxLjU3TDIxIDUuM0MxOS40MSAzLjg3IDE3LjMgMyAxNSAzYy0zLjkyIDAtNy4yNCAyLjUxLTguNDggNkgzdjJoMy4wNmMtLjA0LjMzLS4wNi42Ni0uMDYgMSAwIC4zNC4wMi42Ny4wNiAxSDN2MmgzLjUyYzEuMjQgMy40OSA0LjU2IDYgOC40OCA2IDIuMzEgMCA0LjQxLS44NyA2LTIuM2wtMS43OC0xLjc3Yy0xLjEzLjk4LTIuNiAxLjU3LTQuMjIgMS41N3oiIC8+PC9nPgo8ZyBpZD0iZXZlbnQiPjxwYXRoIGQ9Ik0xNyAxMmgtNXY1aDV2LTV6TTE2IDF2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMmgtMVYxaC0yem0zIDE4SDVWOGgxNHYxMXoiIC8+PC9nPgo8ZyBpZD0iZXZlbnQtc2VhdCI+PHBhdGggZD0iTTQgMTh2M2gzdi0zaDEwdjNoM3YtNkg0em0xNS04aDN2M2gtM3pNMiAxMGgzdjNIMnptMTUgM0g3VjVjMC0xLjEuOS0yIDItMmg2YzEuMSAwIDIgLjkgMiAydjh6IiAvPjwvZz4KPGcgaWQ9ImV4aXQtdG8tYXBwIj48cGF0aCBkPSJNMTAuMDkgMTUuNTlMMTEuNSAxN2w1LTUtNS01LTEuNDEgMS40MUwxMi42NyAxMUgzdjJoOS42N2wtMi41OCAyLjU5ek0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnY0aDJWNWgxNHYxNEg1di00SDN2NGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJleHBhbmQtbGVzcyI+PHBhdGggZD0iTTEyIDhsLTYgNiAxLjQxIDEuNDFMMTIgMTAuODNsNC41OSA0LjU4TDE4IDE0eiIgLz48L2c+CjxnIGlkPSJleHBhbmQtbW9yZSI+PHBhdGggZD0iTTE2LjU5IDguNTlMMTIgMTMuMTcgNy40MSA4LjU5IDYgMTBsNiA2IDYtNnoiIC8+PC9nPgo8ZyBpZD0iZXhwbG9yZSI+PHBhdGggZD0iTTEyIDEwLjljLS42MSAwLTEuMS40OS0xLjEgMS4xcy40OSAxLjEgMS4xIDEuMWMuNjEgMCAxLjEtLjQ5IDEuMS0xLjFzLS40OS0xLjEtMS4xLTEuMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMi4xOSAxMi4xOUw2IDE4bDMuODEtOC4xOUwxOCA2bC0zLjgxIDguMTl6IiAvPjwvZz4KPGcgaWQ9ImV4dGVuc2lvbiI+PHBhdGggZD0iTTIwLjUgMTFIMTlWN2MwLTEuMS0uOS0yLTItMmgtNFYzLjVDMTMgMi4xMiAxMS44OCAxIDEwLjUgMVM4IDIuMTIgOCAzLjVWNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAydjMuOEgzLjVjMS40OSAwIDIuNyAxLjIxIDIuNyAyLjdzLTEuMjEgMi43LTIuNyAyLjdIMlYyMGMwIDEuMS45IDIgMiAyaDMuOHYtMS41YzAtMS40OSAxLjIxLTIuNyAyLjctMi43IDEuNDkgMCAyLjcgMS4yMSAyLjcgMi43VjIySDE3YzEuMSAwIDItLjkgMi0ydi00aDEuNWMxLjM4IDAgMi41LTEuMTIgMi41LTIuNVMyMS44OCAxMSAyMC41IDExeiIgLz48L2c+CjxnIGlkPSJmYWNlIj48cGF0aCBkPSJNOSAxMS43NWMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6bTYgMGMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04IDAtLjI5LjAyLS41OC4wNS0uODYgMi4zNi0xLjA1IDQuMjMtMi45OCA1LjIxLTUuMzdDMTEuMDcgOC4zMyAxNC4wNSAxMCAxNy40MiAxMGMuNzggMCAxLjUzLS4wOSAyLjI1LS4yNi4yMS43MS4zMyAxLjQ3LjMzIDIuMjYgMCA0LjQxLTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImZhdm9yaXRlIj48cGF0aCBkPSJNMTIgMjEuMzVsLTEuNDUtMS4zMkM1LjQgMTUuMzYgMiAxMi4yOCAyIDguNSAyIDUuNDIgNC40MiAzIDcuNSAzYzEuNzQgMCAzLjQxLjgxIDQuNSAyLjA5QzEzLjA5IDMuODEgMTQuNzYgMyAxNi41IDMgMTkuNTggMyAyMiA1LjQyIDIyIDguNWMwIDMuNzgtMy40IDYuODYtOC41NSAxMS41NEwxMiAyMS4zNXoiIC8+PC9nPgo8ZyBpZD0iZmF2b3JpdGUtYm9yZGVyIj48cGF0aCBkPSJNMTYuNSAzYy0xLjc0IDAtMy40MS44MS00LjUgMi4wOUMxMC45MSAzLjgxIDkuMjQgMyA3LjUgMyA0LjQyIDMgMiA1LjQyIDIgOC41YzAgMy43OCAzLjQgNi44NiA4LjU1IDExLjU0TDEyIDIxLjM1bDEuNDUtMS4zMkMxOC42IDE1LjM2IDIyIDEyLjI4IDIyIDguNSAyMiA1LjQyIDE5LjU4IDMgMTYuNSAzem0tNC40IDE1LjU1bC0uMS4xLS4xLS4xQzcuMTQgMTQuMjQgNCAxMS4zOSA0IDguNSA0IDYuNSA1LjUgNSA3LjUgNWMxLjU0IDAgMy4wNC45OSAzLjU3IDIuMzZoMS44N0MxMy40NiA1Ljk5IDE0Ljk2IDUgMTYuNSA1YzIgMCAzLjUgMS41IDMuNSAzLjUgMCAyLjg5LTMuMTQgNS43NC03LjkgMTAuMDV6IiAvPjwvZz4KPGcgaWQ9ImZlZWRiYWNrIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDEyaC0ydi0yaDJ2MnptMC00aC0yVjZoMnY0eiIgLz48L2c+CjxnIGlkPSJmaWxlLWRvd25sb2FkIj48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJmaWxlLXVwbG9hZCI+PHBhdGggZD0iTTkgMTZoNnYtNmg0bC03LTctNyA3aDR6bS00IDJoMTR2Mkg1eiIgLz48L2c+CjxnIGlkPSJmaWx0ZXItbGlzdCI+PHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiIgLz48L2c+CjxnIGlkPSJmaW5kLWluLXBhZ2UiPjxwYXRoIGQ9Ik0yMCAxOS41OVY4bC02LTZINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4Yy40NSAwIC44NS0uMTUgMS4xOS0uNGwtNC40My00LjQzYy0uOC41Mi0xLjc0LjgzLTIuNzYuODMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1YzAgMS4wMi0uMzEgMS45Ni0uODMgMi43NUwyMCAxOS41OXpNOSAxM2MwIDEuNjYgMS4zNCAzIDMgM3MzLTEuMzQgMy0zLTEuMzQtMy0zLTMtMyAxLjM0LTMgM3oiIC8+PC9nPgo8ZyBpZD0iZmluZC1yZXBsYWNlIj48cGF0aCBkPSJNMTEgNmMxLjM4IDAgMi42My41NiAzLjU0IDEuNDZMMTIgMTBoNlY0bC0yLjA1IDIuMDVDMTQuNjggNC43OCAxMi45MyA0IDExIDRjLTMuNTMgMC02LjQzIDIuNjEtNi45MiA2SDYuMWMuNDYtMi4yOCAyLjQ4LTQgNC45LTR6bTUuNjQgOS4xNGMuNjYtLjkgMS4xMi0xLjk3IDEuMjgtMy4xNEgxNS45Yy0uNDYgMi4yOC0yLjQ4IDQtNC45IDQtMS4zOCAwLTIuNjMtLjU2LTMuNTQtMS40NkwxMCAxMkg0djZsMi4wNS0yLjA1QzcuMzIgMTcuMjIgOS4wNyAxOCAxMSAxOGMxLjU1IDAgMi45OC0uNTEgNC4xNC0xLjM2TDIwIDIxLjQ5IDIxLjQ5IDIwbC00Ljg1LTQuODZ6IiAvPjwvZz4KPGcgaWQ9ImZpbmdlcnByaW50Ij48cGF0aCBkPSJNMTcuODEgNC40N2MtLjA4IDAtLjE2LS4wMi0uMjMtLjA2QzE1LjY2IDMuNDIgMTQgMyAxMi4wMSAzYy0xLjk4IDAtMy44Ni40Ny01LjU3IDEuNDEtLjI0LjEzLS41NC4wNC0uNjgtLjItLjEzLS4yNC0uMDQtLjU1LjItLjY4QzcuODIgMi41MiA5Ljg2IDIgMTIuMDEgMmMyLjEzIDAgMy45OS40NyA2LjAzIDEuNTIuMjUuMTMuMzQuNDMuMjEuNjctLjA5LjE4LS4yNi4yOC0uNDQuMjh6TTMuNSA5LjcyYy0uMSAwLS4yLS4wMy0uMjktLjA5LS4yMy0uMTYtLjI4LS40Ny0uMTItLjcuOTktMS40IDIuMjUtMi41IDMuNzUtMy4yN0M5Ljk4IDQuMDQgMTQgNC4wMyAxNy4xNSA1LjY1YzEuNS43NyAyLjc2IDEuODYgMy43NSAzLjI1LjE2LjIyLjExLjU0LS4xMi43LS4yMy4xNi0uNTQuMTEtLjctLjEyLS45LTEuMjYtMi4wNC0yLjI1LTMuMzktMi45NC0yLjg3LTEuNDctNi41NC0xLjQ3LTkuNC4wMS0xLjM2LjctMi41IDEuNy0zLjQgMi45Ni0uMDguMTQtLjIzLjIxLS4zOS4yMXptNi4yNSAxMi4wN2MtLjEzIDAtLjI2LS4wNS0uMzUtLjE1LS44Ny0uODctMS4zNC0xLjQzLTIuMDEtMi42NC0uNjktMS4yMy0xLjA1LTIuNzMtMS4wNS00LjM0IDAtMi45NyAyLjU0LTUuMzkgNS42Ni01LjM5czUuNjYgMi40MiA1LjY2IDUuMzljMCAuMjgtLjIyLjUtLjUuNXMtLjUtLjIyLS41LS41YzAtMi40Mi0yLjA5LTQuMzktNC42Ni00LjM5LTIuNTcgMC00LjY2IDEuOTctNC42NiA0LjM5IDAgMS40NC4zMiAyLjc3LjkzIDMuODUuNjQgMS4xNSAxLjA4IDEuNjQgMS44NSAyLjQyLjE5LjIuMTkuNTEgMCAuNzEtLjExLjEtLjI0LjE1LS4zNy4xNXptNy4xNy0xLjg1Yy0xLjE5IDAtMi4yNC0uMy0zLjEtLjg5LTEuNDktMS4wMS0yLjM4LTIuNjUtMi4zOC00LjM5IDAtLjI4LjIyLS41LjUtLjVzLjUuMjIuNS41YzAgMS40MS43MiAyLjc0IDEuOTQgMy41Ni43MS40OCAxLjU0LjcxIDIuNTQuNzEuMjQgMCAuNjQtLjAzIDEuMDQtLjEuMjctLjA1LjUzLjEzLjU4LjQxLjA1LjI3LS4xMy41My0uNDEuNTgtLjU3LjExLTEuMDcuMTItMS4yMS4xMnpNMTQuOTEgMjJjLS4wNCAwLS4wOS0uMDEtLjEzLS4wMi0xLjU5LS40NC0yLjYzLTEuMDMtMy43Mi0yLjEtMS40LTEuMzktMi4xNy0zLjI0LTIuMTctNS4yMiAwLTEuNjIgMS4zOC0yLjk0IDMuMDgtMi45NCAxLjcgMCAzLjA4IDEuMzIgMy4wOCAyLjk0IDAgMS4wNy45MyAxLjk0IDIuMDggMS45NHMyLjA4LS44NyAyLjA4LTEuOTRjMC0zLjc3LTMuMjUtNi44My03LjI1LTYuODMtMi44NCAwLTUuNDQgMS41OC02LjYxIDQuMDMtLjM5LjgxLS41OSAxLjc2LS41OSAyLjggMCAuNzguMDcgMi4wMS42NyAzLjYxLjEuMjYtLjAzLjU1LS4yOS42NC0uMjYuMS0uNTUtLjA0LS42NC0uMjktLjQ5LTEuMzEtLjczLTIuNjEtLjczLTMuOTYgMC0xLjIuMjMtMi4yOS42OC0zLjI0IDEuMzMtMi43OSA0LjI4LTQuNiA3LjUxLTQuNiA0LjU1IDAgOC4yNSAzLjUxIDguMjUgNy44MyAwIDEuNjItMS4zOCAyLjk0LTMuMDggMi45NHMtMy4wOC0xLjMyLTMuMDgtMi45NGMwLTEuMDctLjkzLTEuOTQtMi4wOC0xLjk0cy0yLjA4Ljg3LTIuMDggMS45NGMwIDEuNzEuNjYgMy4zMSAxLjg3IDQuNTEuOTUuOTQgMS44NiAxLjQ2IDMuMjcgMS44NS4yNy4wNy40Mi4zNS4zNS42MS0uMDUuMjMtLjI2LjM4LS40Ny4zOHoiIC8+PC9nPgo8ZyBpZD0iZmlyc3QtcGFnZSI+PHBhdGggZD0iTTE4LjQxIDE2LjU5TDEzLjgyIDEybDQuNTktNC41OUwxNyA2bC02IDYgNiA2ek02IDZoMnYxMkg2eiIgLz48L2c+CjxnIGlkPSJmbGFnIj48cGF0aCBkPSJNMTQuNCA2TDE0IDRINXYxN2gydi03aDUuNmwuNCAyaDdWNnoiIC8+PC9nPgo8ZyBpZD0iZmxpZ2h0LWxhbmQiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTcuMTgtNS43M2w0LjM1IDEuMTYgNS4zMSAxLjQyYy44LjIxIDEuNjItLjI2IDEuODQtMS4wNi4yMS0uOC0uMjYtMS42Mi0xLjA2LTEuODRsLTUuMzEtMS40Mi0yLjc2LTkuMDJMMTAuMTIgMnY4LjI4TDUuMTUgOC45NWwtLjkzLTIuMzItMS40NS0uMzl2NS4xN2wxLjYuNDMgNS4zMSAxLjQzeiIgLz48L2c+CjxnIGlkPSJmbGlnaHQtdGFrZW9mZiI+PHBhdGggZD0iTTIuNSAxOWgxOXYyaC0xOXptMTkuNTctOS4zNmMtLjIxLS44LTEuMDQtMS4yOC0xLjg0LTEuMDZMMTQuOTIgMTBsLTYuOS02LjQzLTEuOTMuNTEgNC4xNCA3LjE3LTQuOTcgMS4zMy0xLjk3LTEuNTQtMS40NS4zOSAxLjgyIDMuMTYuNzcgMS4zMyAxLjYtLjQzIDUuMzEtMS40MiA0LjM1LTEuMTZMMjEgMTEuNDljLjgxLS4yMyAxLjI4LTEuMDUgMS4wNy0xLjg1eiIgLz48L2c+CjxnIGlkPSJmbGlwLXRvLWJhY2siPjxwYXRoIGQ9Ik05IDdIN3YyaDJWN3ptMCA0SDd2Mmgydi0yem0wLThjLTEuMTEgMC0yIC45LTIgMmgyVjN6bTQgMTJoLTJ2Mmgydi0yem02LTEydjJoMmMwLTEuMS0uOS0yLTItMnptLTYgMGgtMnYyaDJWM3pNOSAxN3YtMkg3YzAgMS4xLjg5IDIgMiAyem0xMC00aDJ2LTJoLTJ2MnptMC00aDJWN2gtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnpNNSA3SDN2MTJjMCAxLjEuODkgMiAyIDJoMTJ2LTJINVY3em0xMC0yaDJWM2gtMnYyem0wIDEyaDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iZmxpcC10by1mcm9udCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMiA0di0ySDNjMCAxLjEuODkgMiAyIDJ6TTMgOWgyVjdIM3Yyem0xMiAxMmgydi0yaC0ydjJ6bTQtMThIOWMtMS4xMSAwLTIgLjktMiAydjEwYzAgMS4xLjg5IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJIOVY1aDEwdjEwem0tOCA2aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnoiIC8+PC9nPgo8ZyBpZD0iZm9sZGVyIj48cGF0aCBkPSJNMTAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yaC04bC0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImZvbGRlci1vcGVuIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bTAgMTJINFY4aDE2djEweiIgLz48L2c+CjxnIGlkPSJmb2xkZXItc2hhcmVkIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS01IDNjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem00IDhoLTh2LTFjMC0xLjMzIDIuNjctMiA0LTJzNCAuNjcgNCAydjF6IiAvPjwvZz4KPGcgaWQ9ImZvbnQtZG93bmxvYWQiPjxwYXRoIGQ9Ik05LjkzIDEzLjVoNC4xNEwxMiA3Ljk4ek0yMCAySDRjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTQuMDUgMTYuNWwtMS4xNC0zSDkuMTdsLTEuMTIgM0g1Ljk2bDUuMTEtMTNoMS44Nmw1LjExIDEzaC0yLjA5eiIgLz48L2c+CjxnIGlkPSJmb3J3YXJkIj48cGF0aCBkPSJNMTIgOFY0bDggOC04IDh2LTRINFY4eiIgLz48L2c+CjxnIGlkPSJmdWxsc2NyZWVuIj48cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiIC8+PC9nPgo8ZyBpZD0iZnVsbHNjcmVlbi1leGl0Ij48cGF0aCBkPSJNNSAxNmgzdjNoMnYtNUg1djJ6bTMtOEg1djJoNVY1SDh2M3ptNiAxMWgydi0zaDN2LTJoLTV2NXptMi0xMVY1aC0ydjVoNVY4aC0zeiIgLz48L2c+CjxnIGlkPSJnLXRyYW5zbGF0ZSI+PHBhdGggZD0iTTIwIDVoLTkuMTJMMTAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDdsMSAzaDhjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnpNNy4xNyAxNC41OWMtMi4yNSAwLTQuMDktMS44My00LjA5LTQuMDlzMS44My00LjA5IDQuMDktNC4wOWMxLjA0IDAgMS45OS4zNyAyLjc0IDEuMDdsLjA3LjA2LTEuMjMgMS4xOC0uMDYtLjA1Yy0uMjktLjI3LS43OC0uNTktMS41Mi0uNTktMS4zMSAwLTIuMzggMS4wOS0yLjM4IDIuNDJzMS4wNyAyLjQyIDIuMzggMi40MmMxLjM3IDAgMS45Ni0uODcgMi4xMi0xLjQ2SDcuMDhWOS45MWgzLjk1bC4wMS4wN2MuMDQuMjEuMDUuNC4wNS42MSAwIDIuMzUtMS42MSA0LTMuOTIgNHptNi4wMy0xLjcxYy4zMy42Ljc0IDEuMTggMS4xOSAxLjdsLS41NC41My0uNjUtMi4yM3ptLjc3LS43NmgtLjk5bC0uMzEtMS4wNGgzLjk5cy0uMzQgMS4zMS0xLjU2IDIuNzRjLS41Mi0uNjItLjg5LTEuMjMtMS4xMy0xLjd6TTIxIDIwYzAgLjU1LS40NSAxLTEgMWgtN2wyLTItLjgxLTIuNzcuOTItLjkyTDE3Ljc5IDE4bC43My0uNzMtMi43MS0yLjY4Yy45LTEuMDMgMS42LTIuMjUgMS45Mi0zLjUxSDE5di0xLjA0aC0zLjY0VjloLTEuMDR2MS4wNGgtMS45NkwxMS4xOCA2SDIwYy41NSAwIDEgLjQ1IDEgMXYxM3oiIC8+PC9nPgo8ZyBpZD0iZ2F2ZWwiPjxwYXRoIGQ9Ik0xIDIxaDEydjJIMXpNNS4yNDUgOC4wN2wyLjgzLTIuODI3IDE0LjE0IDE0LjE0Mi0yLjgyOCAyLjgyOHpNMTIuMzE3IDFsNS42NTcgNS42NTYtMi44MyAyLjgzLTUuNjU0LTUuNjZ6TTMuODI1IDkuNDg1bDUuNjU3IDUuNjU3LTIuODI4IDIuODI4LTUuNjU3LTUuNjU3eiIgLz48L2c+CjxnIGlkPSJnZXN0dXJlIj48cGF0aCBkPSJNNC41OSA2Ljg5Yy43LS43MSAxLjQtMS4zNSAxLjcxLTEuMjIuNS4yIDAgMS4wMy0uMyAxLjUyLS4yNS40Mi0yLjg2IDMuODktMi44NiA2LjMxIDAgMS4yOC40OCAyLjM0IDEuMzQgMi45OC43NS41NiAxLjc0LjczIDIuNjQuNDYgMS4wNy0uMzEgMS45NS0xLjQgMy4wNi0yLjc3IDEuMjEtMS40OSAyLjgzLTMuNDQgNC4wOC0zLjQ0IDEuNjMgMCAxLjY1IDEuMDEgMS43NiAxLjc5LTMuNzguNjQtNS4zOCAzLjY3LTUuMzggNS4zNyAwIDEuNyAxLjQ0IDMuMDkgMy4yMSAzLjA5IDEuNjMgMCA0LjI5LTEuMzMgNC42OS02LjFIMjF2LTIuNWgtMi40N2MtLjE1LTEuNjUtMS4wOS00LjItNC4wMy00LjItMi4yNSAwLTQuMTggMS45MS00Ljk0IDIuODQtLjU4LjczLTIuMDYgMi40OC0yLjI5IDIuNzItLjI1LjMtLjY4Ljg0LTEuMTEuODQtLjQ1IDAtLjcyLS44My0uMzYtMS45Mi4zNS0xLjA5IDEuNC0yLjg2IDEuODUtMy41Mi43OC0xLjE0IDEuMy0xLjkyIDEuMy0zLjI4QzguOTUgMy42OSA3LjMxIDMgNi40NCAzIDUuMTIgMyAzLjk3IDQgMy43MiA0LjI1Yy0uMzYuMzYtLjY2LjY2LS44OC45M2wxLjc1IDEuNzF6bTkuMjkgMTEuNjZjLS4zMSAwLS43NC0uMjYtLjc0LS43MiAwLS42LjczLTIuMiAyLjg3LTIuNzYtLjMgMi42OS0xLjQzIDMuNDgtMi4xMyAzLjQ4eiIgLz48L2c+CjxnIGlkPSJnZXQtYXBwIj48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJnaWYiPjxwYXRoIGQ9Ik0xMS41IDlIMTN2NmgtMS41ek05IDlINmMtLjYgMC0xIC41LTEgMXY0YzAgLjUuNCAxIDEgMWgzYy42IDAgMS0uNSAxLTF2LTJIOC41djEuNWgtMnYtM0gxMFYxMGMwLS41LS40LTEtMS0xem0xMCAxLjVWOWgtNC41djZIMTZ2LTJoMnYtMS41aC0ydi0xeiIgLz48L2c+CjxnIGlkPSJncmFkZSI+PHBhdGggZD0iTTEyIDE3LjI3TDE4LjE4IDIxbC0xLjY0LTcuMDNMMjIgOS4yNGwtNy4xOS0uNjFMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxeiIgLz48L2c+CjxnIGlkPSJncm91cC13b3JrIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNOCAxNy41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXpNOS41IDhjMC0xLjM4IDEuMTItMi41IDIuNS0yLjVzMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41UzkuNSA5LjM4IDkuNSA4em02LjUgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiIC8+PC9nPgo8ZyBpZD0iaGVscCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTEgMTdoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45LjkyQzEzLjQ1IDEyLjkgMTMgMTMuNSAxMyAxNWgtMnYtLjVjMC0xLjEuNDUtMi4xIDEuMTctMi44M2wxLjI0LTEuMjZjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEgMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz48L2c+CjxnIGlkPSJoZWxwLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxOGgydi0yaC0ydjJ6bTEtMTZDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0wLTE0Yy0yLjIxIDAtNCAxLjc5LTQgNGgyYzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAyLTMgMS43NS0zIDVoMmMwLTIuMjUgMy0yLjUgMy01IDAtMi4yMS0xLjc5LTQtNC00eiIgLz48L2c+CjxnIGlkPSJoaWdobGlnaHQtb2ZmIj48cGF0aCBkPSJNMTQuNTkgOEwxMiAxMC41OSA5LjQxIDggOCA5LjQxIDEwLjU5IDEyIDggMTQuNTkgOS40MSAxNiAxMiAxMy40MSAxNC41OSAxNiAxNiAxNC41OSAxMy40MSAxMiAxNiA5LjQxIDE0LjU5IDh6TTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJoaXN0b3J5Ij48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiIgLz48L2c+CjxnIGlkPSJob21lIj48cGF0aCBkPSJNMTAgMjB2LTZoNHY2aDV2LThoM0wxMiAzIDIgMTJoM3Y4eiIgLz48L2c+CjxnIGlkPSJob3VyZ2xhc3MtZW1wdHkiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnptMTAgMTQuNVYyMEg4di0zLjVsNC00IDQgNHptLTQtNWwtNC00VjRoOHYzLjVsLTQgNHoiIC8+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWZ1bGwiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnoiIC8+PC9nPgo8ZyBpZD0iaHR0cCI+PHBhdGggZD0iTTQuNSAxMWgtMlY5SDF2NmgxLjV2LTIuNWgyVjE1SDZWOUg0LjV2MnptMi41LS41aDEuNVYxNUgxMHYtNC41aDEuNVY5SDd2MS41em01LjUgMEgxNFYxNWgxLjV2LTQuNUgxN1Y5aC00LjV2MS41em05LTEuNUgxOHY2aDEuNXYtMmgyYy44IDAgMS41LS43IDEuNS0xLjV2LTFjMC0uOC0uNy0xLjUtMS41LTEuNXptMCAyLjVoLTJ2LTFoMnYxeiIgLz48L2c+CjxnIGlkPSJodHRwcyI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6IiAvPjwvZz4KPGcgaWQ9ImltcG9ydGFudC1kZXZpY2VzIj48cGF0aCBkPSJNMjMgMTEuMDFMMTggMTFjLS41NSAwLTEgLjQ1LTEgMXY5YzAgLjU1LjQ1IDEgMSAxaDVjLjU1IDAgMS0uNDUgMS0xdi05YzAtLjU1LS40NS0uOTktMS0uOTl6TTIzIDIwaC01di03aDV2N3pNMjAgMkgyQy44OSAyIDAgMi44OSAwIDR2MTJjMCAxLjEuODkgMiAyIDJoN3YySDd2Mmg4di0yaC0ydi0yaDJ2LTJIMlY0aDE4djVoMlY0YzAtMS4xMS0uOS0yLTItMnptLTguMDMgN0wxMSA2bC0uOTcgM0g3bDIuNDcgMS43Ni0uOTQgMi45MSAyLjQ3LTEuOCAyLjQ3IDEuOC0uOTQtMi45MUwxNSA5aC0zLjAzeiIgLz48L2c+CjxnIGlkPSJpbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguODktMS45OCAyTDMgMTljMCAxLjEuODggMiAxLjk5IDJIMTljMS4xIDAgMi0uOSAyLTJWNWMwLTEuMTEtLjktMi0yLTJ6bTAgMTJoLTRjMCAxLjY2LTEuMzUgMy0zIDNzLTMtMS4zNC0zLTNINC45OVY1SDE5djEweiIgLz48L2c+CjxnIGlkPSJpbmRldGVybWluYXRlLWNoZWNrLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMEg3di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImluZm8iPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi02aDJ2NnptMC04aC0yVjdoMnYyeiIgLz48L2c+CjxnIGlkPSJpbmZvLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxN2gydi02aC0ydjZ6bTEtMTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4ek0xMSA5aDJWN2gtMnYyeiIgLz48L2c+CjxnIGlkPSJpbnB1dCI+PHBhdGggZD0iTTIxIDMuMDFIM2MtMS4xIDAtMiAuOS0yIDJWOWgyVjQuOTloMTh2MTQuMDNIM1YxNUgxdjQuMDFjMCAxLjEuOSAxLjk4IDIgMS45OGgxOGMxLjEgMCAyLS44OCAyLTEuOTh2LTE0YzAtMS4xMS0uOS0yLTItMnpNMTEgMTZsNC00LTQtNHYzSDF2MmgxMHYzeiIgLz48L2c+CjxnIGlkPSJpbnZlcnQtY29sb3JzIj48cGF0aCBkPSJNMTcuNjYgNy45M0wxMiAyLjI3IDYuMzQgNy45M2MtMy4xMiAzLjEyLTMuMTIgOC4xOSAwIDExLjMxQzcuOSAyMC44IDkuOTUgMjEuNTggMTIgMjEuNThjMi4wNSAwIDQuMS0uNzggNS42Ni0yLjM0IDMuMTItMy4xMiAzLjEyLTguMTkgMC0xMS4zMXpNMTIgMTkuNTljLTEuNiAwLTMuMTEtLjYyLTQuMjQtMS43NkM2LjYyIDE2LjY5IDYgMTUuMTkgNiAxMy41OXMuNjItMy4xMSAxLjc2LTQuMjRMMTIgNS4xdjE0LjQ5eiIgLz48L2c+CjxnIGlkPSJsYWJlbCI+PHBhdGggZD0iTTE3LjYzIDUuODRDMTcuMjcgNS4zMyAxNi42NyA1IDE2IDVMNSA1LjAxQzMuOSA1LjAxIDMgNS45IDMgN3YxMGMwIDEuMS45IDEuOTkgMiAxLjk5TDE2IDE5Yy42NyAwIDEuMjctLjMzIDEuNjMtLjg0TDIyIDEybC00LjM3LTYuMTZ6IiAvPjwvZz4KPGcgaWQ9ImxhYmVsLW91dGxpbmUiPjxwYXRoIGQ9Ik0xNy42MyA1Ljg0QzE3LjI3IDUuMzMgMTYuNjcgNSAxNiA1TDUgNS4wMUMzLjkgNS4wMSAzIDUuOSAzIDd2MTBjMCAxLjEuOSAxLjk5IDIgMS45OUwxNiAxOWMuNjcgMCAxLjI3LS4zMyAxLjYzLS44NEwyMiAxMmwtNC4zNy02LjE2ek0xNiAxN0g1VjdoMTFsMy41NSA1TDE2IDE3eiIgLz48L2c+CjxnIGlkPSJsYW5ndWFnZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6bTYuOTMgNmgtMi45NWMtLjMyLTEuMjUtLjc4LTIuNDUtMS4zOC0zLjU2IDEuODQuNjMgMy4zNyAxLjkxIDQuMzMgMy41NnpNMTIgNC4wNGMuODMgMS4yIDEuNDggMi41MyAxLjkxIDMuOTZoLTMuODJjLjQzLTEuNDMgMS4wOC0yLjc2IDEuOTEtMy45NnpNNC4yNiAxNEM0LjEgMTMuMzYgNCAxMi42OSA0IDEycy4xLTEuMzYuMjYtMmgzLjM4Yy0uMDguNjYtLjE0IDEuMzItLjE0IDIgMCAuNjguMDYgMS4zNC4xNCAySDQuMjZ6bS44MiAyaDIuOTVjLjMyIDEuMjUuNzggMi40NSAxLjM4IDMuNTYtMS44NC0uNjMtMy4zNy0xLjktNC4zMy0zLjU2em0yLjk1LThINS4wOGMuOTYtMS42NiAyLjQ5LTIuOTMgNC4zMy0zLjU2QzguODEgNS41NSA4LjM1IDYuNzUgOC4wMyA4ek0xMiAxOS45NmMtLjgzLTEuMi0xLjQ4LTIuNTMtMS45MS0zLjk2aDMuODJjLS40MyAxLjQzLTEuMDggMi43Ni0xLjkxIDMuOTZ6TTE0LjM0IDE0SDkuNjZjLS4wOS0uNjYtLjE2LTEuMzItLjE2LTIgMC0uNjguMDctMS4zNS4xNi0yaDQuNjhjLjA5LjY1LjE2IDEuMzIuMTYgMiAwIC42OC0uMDcgMS4zNC0uMTYgMnptLjI1IDUuNTZjLjYtMS4xMSAxLjA2LTIuMzEgMS4zOC0zLjU2aDIuOTVjLS45NiAxLjY1LTIuNDkgMi45My00LjMzIDMuNTZ6TTE2LjM2IDE0Yy4wOC0uNjYuMTQtMS4zMi4xNC0yIDAtLjY4LS4wNi0xLjM0LS4xNC0yaDMuMzhjLjE2LjY0LjI2IDEuMzEuMjYgMnMtLjEgMS4zNi0uMjYgMmgtMy4zOHoiIC8+PC9nPgo8ZyBpZD0ibGFzdC1wYWdlIj48cGF0aCBkPSJNNS41OSA3LjQxTDEwLjE4IDEybC00LjU5IDQuNTlMNyAxOGw2LTYtNi02ek0xNiA2aDJ2MTJoLTJ6IiAvPjwvZz4KPGcgaWQ9ImxhdW5jaCI+PHBhdGggZD0iTTE5IDE5SDVWNWg3VjNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi03aC0ydjd6TTE0IDN2MmgzLjU5bC05LjgzIDkuODMgMS40MSAxLjQxTDE5IDYuNDFWMTBoMlYzaC03eiIgLz48L2c+CjxnIGlkPSJsaWdodGJ1bGItb3V0bGluZSI+PHBhdGggZD0iTTkgMjFjMCAuNTUuNDUgMSAxIDFoNGMuNTUgMCAxLS40NSAxLTF2LTFIOXYxem0zLTE5QzguMTQgMiA1IDUuMTQgNSA5YzAgMi4zOCAxLjE5IDQuNDcgMyA1Ljc0VjE3YzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xdi0yLjI2YzEuODEtMS4yNyAzLTMuMzYgMy01Ljc0IDAtMy44Ni0zLjE0LTctNy03em0yLjg1IDExLjFsLS44NS42VjE2aC00di0yLjNsLS44NS0uNkM3LjggMTIuMTYgNyAxMC42MyA3IDljMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWMwIDEuNjMtLjggMy4xNi0yLjE1IDQuMXoiIC8+PC9nPgo8ZyBpZD0ibGluZS1zdHlsZSI+PHBhdGggZD0iTTMgMTZoNXYtMkgzdjJ6bTYuNSAwaDV2LTJoLTV2MnptNi41IDBoNXYtMmgtNXYyek0zIDIwaDJ2LTJIM3Yyem00IDBoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTMgMTJoOHYtMkgzdjJ6bTEwIDBoOHYtMmgtOHYyek0zIDR2NGgxOFY0SDN6IiAvPjwvZz4KPGcgaWQ9ImxpbmUtd2VpZ2h0Ij48cGF0aCBkPSJNMyAxN2gxOHYtMkgzdjJ6bTAgM2gxOHYtMUgzdjF6bTAtN2gxOHYtM0gzdjN6bTAtOXY0aDE4VjRIM3oiIC8+PC9nPgo8ZyBpZD0ibGluayI+PHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIgLz48L2c+CjxnIGlkPSJsaXN0Ij48cGF0aCBkPSJNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptNCA0aDE0di0ySDd2MnptMCA0aDE0di0ySDd2MnpNNyA3djJoMTRWN0g3eiIgLz48L2c+CjxnIGlkPSJsb2NrIj48cGF0aCBkPSJNMTggOGgtMVY2YzAtMi43Ni0yLjI0LTUtNS01UzcgMy4yNCA3IDZ2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0tNiA5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnptMy4xLTlIOC45VjZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2MnoiIC8+PC9nPgo8ZyBpZD0ibG9jay1vcGVuIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2aDEuOWMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bTAgMTJINlYxMGgxMnYxMHoiIC8+PC9nPgo8ZyBpZD0ibG9jay1vdXRsaW5lIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnpNOC45IDZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFzMy4xIDEuMzkgMy4xIDMuMXYySDguOVY2ek0xOCAyMEg2VjEwaDEydjEweiIgLz48L2c+CjxnIGlkPSJsb3ctcHJpb3JpdHkiPjxwYXRoIGQ9Ik0xNCA1aDh2MmgtOHptMCA1LjVoOHYyaC04em0wIDUuNWg4djJoLTh6TTIgMTEuNUMyIDE1LjA4IDQuOTIgMTggOC41IDE4SDl2MmwzLTMtMy0zdjJoLS41QzYuMDIgMTYgNCAxMy45OCA0IDExLjVTNi4wMiA3IDguNSA3SDEyVjVIOC41QzQuOTIgNSAyIDcuOTIgMiAxMS41eiIgLz48L2c+CjxnIGlkPSJsb3lhbHR5Ij48cGF0aCBkPSJNMjEuNDEgMTEuNThsLTktOUMxMi4wNSAyLjIyIDExLjU1IDIgMTEgMkg0Yy0xLjEgMC0yIC45LTIgMnY3YzAgLjU1LjIyIDEuMDUuNTkgMS40Mmw5IDljLjM2LjM2Ljg2LjU4IDEuNDEuNTguNTUgMCAxLjA1LS4yMiAxLjQxLS41OWw3LTdjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLS41NS0uMjMtMS4wNi0uNTktMS40MnpNNS41IDdDNC42NyA3IDQgNi4zMyA0IDUuNVM0LjY3IDQgNS41IDQgNyA0LjY3IDcgNS41IDYuMzMgNyA1LjUgN3ptMTEuNzcgOC4yN0wxMyAxOS41NGwtNC4yNy00LjI3QzguMjggMTQuODEgOCAxNC4xOSA4IDEzLjVjMC0xLjM4IDEuMTItMi41IDIuNS0yLjUuNjkgMCAxLjMyLjI4IDEuNzcuNzRsLjczLjcyLjczLS43M2MuNDUtLjQ1IDEuMDgtLjczIDEuNzctLjczIDEuMzggMCAyLjUgMS4xMiAyLjUgMi41IDAgLjY5LS4yOCAxLjMyLS43MyAxLjc3eiIgLz48L2c+CjxnIGlkPSJtYWlsIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9Im1hcmt1bnJlYWQiPjxwYXRoIGQ9Ik0yMCA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgNGwtOCA1LTgtNVY2bDggNSA4LTV2MnoiIC8+PC9nPgo8ZyBpZD0ibWFya3VucmVhZC1tYWlsYm94Ij48cGF0aCBkPSJNMjAgNkgxMHY2SDhWNGg2VjBINnY2SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibWVudSI+PHBhdGggZD0iTTMgMThoMTh2LTJIM3Yyem0wLTVoMTh2LTJIM3Yyem0wLTd2MmgxOFY2SDN6IiAvPjwvZz4KPGcgaWQ9Im1vcmUtaG9yaXoiPjxwYXRoIGQ9Ik02IDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMTIgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bS02IDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJtb3JlLXZlcnQiPjxwYXRoIGQ9Ik0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibW90b3JjeWNsZSI+PHBhdGggZD0iTTE5LjQ0IDkuMDNMMTUuNDEgNUgxMXYyaDMuNTlsMiAySDVjLTIuOCAwLTUgMi4yLTUgNXMyLjIgNSA1IDVjMi40NiAwIDQuNDUtMS42OSA0LjktNGgxLjY1bDIuNzctMi43N2MtLjIxLjU0LS4zMiAxLjE0LS4zMiAxLjc3IDAgMi44IDIuMiA1IDUgNXM1LTIuMiA1LTVjMC0yLjY1LTEuOTctNC43Ny00LjU2LTQuOTd6TTcuODIgMTVDNy40IDE2LjE1IDYuMjggMTcgNSAxN2MtMS42MyAwLTMtMS4zNy0zLTNzMS4zNy0zIDMtM2MxLjI4IDAgMi40Ljg1IDIuODIgMkg1djJoMi44MnpNMTkgMTdjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzeiIgLz48L2c+CjxnIGlkPSJtb3ZlLXRvLWluYm94Ij48cGF0aCBkPSJNMTkgM0g0Ljk5Yy0xLjExIDAtMS45OC45LTEuOTggMkwzIDE5YzAgMS4xLjg4IDIgMS45OSAySDE5YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJoLTRjMCAxLjY2LTEuMzUgMy0zIDNzLTMtMS4zNC0zLTNINC45OVY1SDE5djEwem0tMy01aC0yVjdoLTR2M0g4bDQgNCA0LTR6IiAvPjwvZz4KPGcgaWQ9Im5leHQtd2VlayI+PHBhdGggZD0iTTIwIDdoLTRWNWMwLS41NS0uMjItMS4wNS0uNTktMS40MUMxNS4wNSAzLjIyIDE0LjU1IDMgMTQgM2gtNGMtMS4xIDAtMiAuOS0yIDJ2Mkg0Yy0xLjEgMC0yIC45LTIgMnYxMWMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjljMC0xLjEtLjktMi0yLTJ6TTEwIDVoNHYyaC00VjV6bTEgMTMuNWwtMS0xIDMtMy0zLTMgMS0xIDQgNC00IDR6IiAvPjwvZz4KPGcgaWQ9Im5vdGUtYWRkIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE0aC0zdjNoLTJ2LTNIOHYtMmgzdi0zaDJ2M2gzdjJ6bS0zLTdWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0ib2ZmbGluZS1waW4iPjxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwIDEwLTQuNSAxMC0xMFMxNy41IDIgMTIgMnptNSAxNkg3di0yaDEwdjJ6bS02LjctNEw3IDEwLjdsMS40LTEuNCAxLjkgMS45IDUuMy01LjNMMTcgNy4zIDEwLjMgMTR6IiAvPjwvZz4KPGcgaWQ9Im9wYWNpdHkiPjxwYXRoIGQ9Ik0xNy42NiA4TDEyIDIuMzUgNi4zNCA4QzQuNzggOS41NiA0IDExLjY0IDQgMTMuNjRzLjc4IDQuMTEgMi4zNCA1LjY3IDMuNjEgMi4zNSA1LjY2IDIuMzUgNC4xLS43OSA1LjY2LTIuMzVTMjAgMTUuNjQgMjAgMTMuNjQgMTkuMjIgOS41NiAxNy42NiA4ek02IDE0Yy4wMS0yIC42Mi0zLjI3IDEuNzYtNC40TDEyIDUuMjdsNC4yNCA0LjM4QzE3LjM4IDEwLjc3IDE3Ljk5IDEyIDE4IDE0SDZ6IiAvPjwvZz4KPGcgaWQ9Im9wZW4taW4tYnJvd3NlciI+PHBhdGggZD0iTTE5IDRINWMtMS4xMSAwLTIgLjktMiAydjEyYzAgMS4xLjg5IDIgMiAyaDR2LTJINVY4aDE0djEwaC00djJoNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS44OS0yLTItMnptLTcgNmwtNCA0aDN2Nmgydi02aDNsLTQtNHoiIC8+PC9nPgo8ZyBpZD0ib3Blbi1pbi1uZXciPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiIC8+PC9nPgo8ZyBpZD0ib3Blbi13aXRoIj48cGF0aCBkPSJNMTAgOWg0VjZoM2wtNS01LTUgNWgzdjN6bS0xIDFINlY3bC01IDUgNSA1di0zaDN2LTR6bTE0IDJsLTUtNXYzaC0zdjRoM3YzbDUtNXptLTkgM2gtNHYzSDdsNSA1IDUtNWgtM3YtM3oiIC8+PC9nPgo8ZyBpZD0icGFnZXZpZXciPjxwYXRoIGQ9Ik0xMS41IDlDMTAuMTIgOSA5IDEwLjEyIDkgMTEuNXMxLjEyIDIuNSAyLjUgMi41IDIuNS0xLjEyIDIuNS0yLjVTMTIuODggOSAxMS41IDl6TTIwIDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tMy4yMSAxNC4yMWwtMi45MS0yLjkxYy0uNjkuNDQtMS41MS43LTIuMzkuN0M5LjAxIDE2IDcgMTMuOTkgNyAxMS41UzkuMDEgNyAxMS41IDcgMTYgOS4wMSAxNiAxMS41YzAgLjg4LS4yNiAxLjY5LS43IDIuMzlsMi45MSAyLjktMS40MiAxLjQyeiIgLz48L2c+CjxnIGlkPSJwYW4tdG9vbCI+PHBhdGggZD0iTTIzIDUuNVYyMGMwIDIuMi0xLjggNC00IDRoLTcuM2MtMS4wOCAwLTIuMS0uNDMtMi44NS0xLjE5TDEgMTQuODNzMS4yNi0xLjIzIDEuMy0xLjI1Yy4yMi0uMTkuNDktLjI5Ljc5LS4yOS4yMiAwIC40Mi4wNi42LjE2LjA0LjAxIDQuMzEgMi40NiA0LjMxIDIuNDZWNGMwLS44My42Ny0xLjUgMS41LTEuNVMxMSAzLjE3IDExIDR2N2gxVjEuNWMwLS44My42Ny0xLjUgMS41LTEuNVMxNSAuNjcgMTUgMS41VjExaDFWMi41YzAtLjgzLjY3LTEuNSAxLjUtMS41czEuNS42NyAxLjUgMS41VjExaDFWNS41YzAtLjgzLjY3LTEuNSAxLjUtMS41czEuNS42NyAxLjUgMS41eiIgLz48L2c+CjxnIGlkPSJwYXltZW50Ij48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiIgLz48L2c+CjxnIGlkPSJwZXJtLWNhbWVyYS1taWMiPjxwYXRoIGQ9Ik0yMCA1aC0zLjE3TDE1IDNIOUw3LjE3IDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg3di0yLjA5Yy0yLjgzLS40OC01LTIuOTQtNS01LjkxaDJjMCAyLjIxIDEuNzkgNCA0IDRzNC0xLjc5IDQtNGgyYzAgMi45Ny0yLjE3IDUuNDMtNSA1LjkxVjIxaDdjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptLTYgOGMwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTJWOWMwLTEuMS45LTIgMi0yczIgLjkgMiAydjR6IiAvPjwvZz4KPGcgaWQ9InBlcm0tY29udGFjdC1jYWxlbmRhciI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDNjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDMtMy0xLjM0LTMtMyAxLjM0LTMgMy0zem02IDEySDZ2LTFjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xdjF6IiAvPjwvZz4KPGcgaWQ9InBlcm0tZGF0YS1zZXR0aW5nIj48cGF0aCBkPSJNMTguOTkgMTEuNWMuMzQgMCAuNjcuMDMgMSAuMDdMMjAgMCAwIDIwaDExLjU2Yy0uMDQtLjMzLS4wNy0uNjYtLjA3LTEgMC00LjE0IDMuMzYtNy41IDcuNS03LjV6bTMuNzEgNy45OWMuMDItLjE2LjA0LS4zMi4wNC0uNDkgMC0uMTctLjAxLS4zMy0uMDQtLjQ5bDEuMDYtLjgzYy4wOS0uMDguMTItLjIxLjA2LS4zMmwtMS0xLjczYy0uMDYtLjExLS4xOS0uMTUtLjMxLS4xMWwtMS4yNC41Yy0uMjYtLjItLjU0LS4zNy0uODUtLjQ5bC0uMTktMS4zMmMtLjAxLS4xMi0uMTItLjIxLS4yNC0uMjFoLTJjLS4xMiAwLS4yMy4wOS0uMjUuMjFsLS4xOSAxLjMyYy0uMy4xMy0uNTkuMjktLjg1LjQ5bC0xLjI0LS41Yy0uMTEtLjA0LS4yNCAwLS4zMS4xMWwtMSAxLjczYy0uMDYuMTEtLjA0LjI0LjA2LjMybDEuMDYuODNjLS4wMi4xNi0uMDMuMzItLjAzLjQ5IDAgLjE3LjAxLjMzLjAzLjQ5bC0xLjA2LjgzYy0uMDkuMDgtLjEyLjIxLS4wNi4zMmwxIDEuNzNjLjA2LjExLjE5LjE1LjMxLjExbDEuMjQtLjVjLjI2LjIuNTQuMzcuODUuNDlsLjE5IDEuMzJjLjAyLjEyLjEyLjIxLjI1LjIxaDJjLjEyIDAgLjIzLS4wOS4yNS0uMjFsLjE5LTEuMzJjLjMtLjEzLjU5LS4yOS44NC0uNDlsMS4yNS41Yy4xMS4wNC4yNCAwIC4zMS0uMTFsMS0xLjczYy4wNi0uMTEuMDMtLjI0LS4wNi0uMzJsLTEuMDctLjgzem0tMy43MSAxLjAxYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0icGVybS1kZXZpY2UtaW5mb3JtYXRpb24iPjxwYXRoIGQ9Ik0xMyA3aC0ydjJoMlY3em0wIDRoLTJ2Nmgydi02em00LTkuOTlMNyAxYy0xLjEgMC0yIC45LTIgMnYxOGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE3IDE5SDdWNWgxMHYxNHoiIC8+PC9nPgo8ZyBpZD0icGVybS1pZGVudGl0eSI+PHBhdGggZD0iTTEyIDUuOWMxLjE2IDAgMi4xLjk0IDIuMSAyLjFzLS45NCAyLjEtMi4xIDIuMVM5LjkgOS4xNiA5LjkgOHMuOTQtMi4xIDIuMS0yLjFtMCA5YzIuOTcgMCA2LjEgMS40NiA2LjEgMi4xdjEuMUg1LjlWMTdjMC0uNjQgMy4xMy0yLjEgNi4xLTIuMU0xMiA0QzkuNzkgNCA4IDUuNzkgOCA4czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0wIDljLTIuNjcgMC04IDEuMzQtOCA0djNoMTZ2LTNjMC0yLjY2LTUuMzMtNC04LTR6IiAvPjwvZz4KPGcgaWQ9InBlcm0tbWVkaWEiPjxwYXRoIGQ9Ik0yIDZIMHY1aC4wMUwwIDIwYzAgMS4xLjkgMiAyIDJoMTh2LTJIMlY2em0yMC0yaC04bC0yLTJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnpNNyAxNWw0LjUtNiAzLjUgNC41MSAyLjUtMy4wMUwyMSAxNUg3eiIgLz48L2c+CjxnIGlkPSJwZXJtLXBob25lLW1zZyI+PHBhdGggZD0iTTIwIDE1LjVjLTEuMjUgMC0yLjQ1LS4yLTMuNTctLjU3LS4zNS0uMTEtLjc0LS4wMy0xLjAyLjI0bC0yLjIgMi4yYy0yLjgzLTEuNDQtNS4xNS0zLjc1LTYuNTktNi41OGwyLjItMi4yMWMuMjgtLjI3LjM2LS42Ni4yNS0xLjAxQzguNyA2LjQ1IDguNSA1LjI1IDguNSA0YzAtLjU1LS40NS0xLTEtMUg0Yy0uNTUgMC0xIC40NS0xIDEgMCA5LjM5IDcuNjEgMTcgMTcgMTcgLjU1IDAgMS0uNDUgMS0xdi0zLjVjMC0uNTUtLjQ1LTEtMS0xek0xMiAzdjEwbDMtM2g2VjNoLTl6IiAvPjwvZz4KPGcgaWQ9InBlcm0tc2Nhbi13aWZpIj48cGF0aCBkPSJNMTIgM0M2Ljk1IDMgMy4xNSA0Ljg1IDAgNy4yM0wxMiAyMiAyNCA3LjI1QzIwLjg1IDQuODcgMTcuMDUgMyAxMiAzem0xIDEzaC0ydi02aDJ2NnptLTItOFY2aDJ2MmgtMnoiIC8+PC9nPgo8ZyBpZD0icGV0cyI+PGNpcmNsZSBjeD0iNC41IiBjeT0iOS41IiByPSIyLjUiIC8+PGNpcmNsZSBjeD0iOSIgY3k9IjUuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjE1IiBjeT0iNS41IiByPSIyLjUiIC8+PGNpcmNsZSBjeD0iMTkuNSIgY3k9IjkuNSIgcj0iMi41IiAvPjxwYXRoIGQ9Ik0xNy4zNCAxNC44NmMtLjg3LTEuMDItMS42LTEuODktMi40OC0yLjkxLS40Ni0uNTQtMS4wNS0xLjA4LTEuNzUtMS4zMi0uMTEtLjA0LS4yMi0uMDctLjMzLS4wOS0uMjUtLjA0LS41Mi0uMDQtLjc4LS4wNHMtLjUzIDAtLjc5LjA1Yy0uMTEuMDItLjIyLjA1LS4zMy4wOS0uNy4yNC0xLjI4Ljc4LTEuNzUgMS4zMi0uODcgMS4wMi0xLjYgMS44OS0yLjQ4IDIuOTEtMS4zMSAxLjMxLTIuOTIgMi43Ni0yLjYyIDQuNzkuMjkgMS4wMiAxLjAyIDIuMDMgMi4zMyAyLjMyLjczLjE1IDMuMDYtLjQ0IDUuNTQtLjQ0aC4xOGMyLjQ4IDAgNC44MS41OCA1LjU0LjQ0IDEuMzEtLjI5IDIuMDQtMS4zMSAyLjMzLTIuMzIuMzEtMi4wNC0xLjMtMy40OS0yLjYxLTQuOHoiIC8+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlIj48cGF0aCBkPSJNMTkgN2gtOHY2aDhWN3ptMi00SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4VjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk4aDE4djE0LjAzeiIgLz48L2c+CjxnIGlkPSJwaWN0dXJlLWluLXBpY3R1cmUtYWx0Ij48cGF0aCBkPSJNMTkgMTFoLTh2Nmg4di02em00IDhWNC45OEMyMyAzLjg4IDIyLjEgMyAyMSAzSDNjLTEuMSAwLTIgLjg4LTIgMS45OFYxOWMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yem0tMiAuMDJIM1Y0Ljk3aDE4djE0LjA1eiIgLz48L2c+CjxnIGlkPSJwbGF5LWZvci13b3JrIj48cGF0aCBkPSJNMTEgNXY1LjU5SDcuNWw0LjUgNC41IDQuNS00LjVIMTNWNWgtMnptLTUgOWMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02aC0yYzAgMi4yMS0xLjc5IDQtNCA0cy00LTEuNzktNC00SDZ6IiAvPjwvZz4KPGcgaWQ9InBvbHltZXIiPjxwYXRoIGQ9Ik0xOSA0aC00TDcuMTEgMTYuNjMgNC41IDEyIDkgNEg1TC41IDEyIDUgMjBoNGw3Ljg5LTEyLjYzTDE5LjUgMTIgMTUgMjBoNGw0LjUtOHoiIC8+PC9nPgo8ZyBpZD0icG93ZXItc2V0dGluZ3MtbmV3Ij48cGF0aCBkPSJNMTMgM2gtMnYxMGgyVjN6bTQuODMgMi4xN2wtMS40MiAxLjQyQzE3Ljk5IDcuODYgMTkgOS44MSAxOSAxMmMwIDMuODctMy4xMyA3LTcgN3MtNy0zLjEzLTctN2MwLTIuMTkgMS4wMS00LjE0IDIuNTgtNS40Mkw2LjE3IDUuMTdDNC4yMyA2LjgyIDMgOS4yNiAzIDEyYzAgNC45NyA0LjAzIDkgOSA5czktNC4wMyA5LTljMC0yLjc0LTEuMjMtNS4xOC0zLjE3LTYuODN6IiAvPjwvZz4KPGcgaWQ9InByZWduYW50LXdvbWFuIj48cGF0aCBkPSJNOSA0YzAtMS4xMS44OS0yIDItMnMyIC44OSAyIDItLjg5IDItMiAyLTItLjg5LTItMnptNyA5Yy0uMDEtMS4zNC0uODMtMi41MS0yLTMgMC0xLjY2LTEuMzQtMy0zLTNzLTMgMS4zNC0zIDN2N2gydjVoM3YtNWgzdi00eiIgLz48L2c+CjxnIGlkPSJwcmludCI+PHBhdGggZD0iTTE5IDhINWMtMS42NiAwLTMgMS4zNC0zIDN2Nmg0djRoMTJ2LTRoNHYtNmMwLTEuNjYtMS4zNC0zLTMtM3ptLTMgMTFIOHYtNWg4djV6bTMtN2MtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxem0tMS05SDZ2NGgxMlYzeiIgLz48L2c+CjxnIGlkPSJxdWVyeS1idWlsZGVyIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0uNS0xM0gxMXY2bDUuMjUgMy4xNS43NS0xLjIzLTQuNS0yLjY3eiIgLz48L2c+CjxnIGlkPSJxdWVzdGlvbi1hbnN3ZXIiPjxwYXRoIGQ9Ik0yMSA2aC0ydjlINnYyYzAgLjU1LjQ1IDEgMSAxaDExbDQgNFY3YzAtLjU1LS40NS0xLTEtMXptLTQgNlYzYzAtLjU1LS40NS0xLTEtMUgzYy0uNTUgMC0xIC40NS0xIDF2MTRsNC00aDEwYy41NSAwIDEtLjQ1IDEtMXoiIC8+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLWNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiA3Yy0yLjc2IDAtNSAyLjI0LTUgNXMyLjI0IDUgNSA1IDUtMi4yNCA1LTUtMi4yNC01LTUtNXptMC01QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLXVuY2hlY2tlZCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJyZWNlaXB0Ij48cGF0aCBkPSJNMTggMTdINnYtMmgxMnYyem0wLTRINnYtMmgxMnYyem0wLTRINlY3aDEydjJ6TTMgMjJsMS41LTEuNUw2IDIybDEuNS0xLjVMOSAyMmwxLjUtMS41TDEyIDIybDEuNS0xLjVMMTUgMjJsMS41LTEuNUwxOCAyMmwxLjUtMS41TDIxIDIyVjJsLTEuNSAxLjVMMTggMmwtMS41IDEuNUwxNSAybC0xLjUgMS41TDEyIDJsLTEuNSAxLjVMOSAyIDcuNSAzLjUgNiAyIDQuNSAzLjUgMyAydjIweiIgLz48L2c+CjxnIGlkPSJyZWNvcmQtdm9pY2Utb3ZlciI+PGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjQiIC8+PHBhdGggZD0iTTkgMTVjLTIuNjcgMC04IDEuMzQtOCA0djJoMTZ2LTJjMC0yLjY2LTUuMzMtNC04LTR6bTcuNzYtOS42NGwtMS42OCAxLjY5Yy44NCAxLjE4Ljg0IDIuNzEgMCAzLjg5bDEuNjggMS42OWMyLjAyLTIuMDIgMi4wMi01LjA3IDAtNy4yN3pNMjAuMDcgMmwtMS42MyAxLjYzYzIuNzcgMy4wMiAyLjc3IDcuNTYgMCAxMC43NEwyMC4wNyAxNmMzLjktMy44OSAzLjkxLTkuOTUgMC0xNHoiIC8+PC9nPgo8ZyBpZD0icmVkZWVtIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6IiAvPjwvZz4KPGcgaWQ9InJlZG8iPjxwYXRoIGQ9Ik0xOC40IDEwLjZDMTYuNTUgOC45OSAxNC4xNSA4IDExLjUgOGMtNC42NSAwLTguNTggMy4wMy05Ljk2IDcuMjJMMy45IDE2YzEuMDUtMy4xOSA0LjA1LTUuNSA3LjYtNS41IDEuOTUgMCAzLjczLjcyIDUuMTIgMS44OEwxMyAxNmg5VjdsLTMuNiAzLjZ6IiAvPjwvZz4KPGcgaWQ9InJlZnJlc2giPjxwYXRoIGQ9Ik0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlIj48cGF0aCBkPSJNMTkgMTNINXYtMmgxNHYyeiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNSAxMUg3di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9InJlbW92ZS1jaXJjbGUtb3V0bGluZSI+PHBhdGggZD0iTTcgMTF2MmgxMHYtMkg3em01LTlDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTIyLjczIDIyLjczTDIuNzcgMi43NyAyIDJsLS43My0uNzNMMCAyLjU0bDQuMzkgNC4zOSAyLjIxIDQuNjYtMS4zNSAyLjQ1Yy0uMTYuMjgtLjI1LjYxLS4yNS45NiAwIDEuMS45IDIgMiAyaDcuNDZsMS4zOCAxLjM4Yy0uNS4zNi0uODMuOTUtLjgzIDEuNjIgMCAxLjEuODkgMiAxLjk5IDIgLjY3IDAgMS4yNi0uMzMgMS42Mi0uODRMMjEuNDYgMjRsMS4yNy0xLjI3ek03LjQyIDE1Yy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoMi4zNmwyIDJINy40MnptOC4xMy0yYy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjU4LTYuNDljLjA4LS4xNC4xMi0uMzEuMTItLjQ4IDAtLjU1LS40NS0xLTEtMUg2LjU0bDkuMDEgOXpNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0icmVvcmRlciI+PHBhdGggZD0iTTMgMTVoMTh2LTJIM3Yyem0wIDRoMTh2LTJIM3Yyem0wLThoMThWOUgzdjJ6bTAtNnYyaDE4VjVIM3oiIC8+PC9nPgo8ZyBpZD0icmVwbHkiPjxwYXRoIGQ9Ik0xMCA5VjVsLTcgNyA3IDd2LTQuMWM1IDAgOC41IDEuNiAxMSA1LjEtMS01LTQtMTAtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InJlcGx5LWFsbCI+PHBhdGggZD0iTTcgOFY1bC03IDcgNyA3di0zbC00LTQgNC00em02IDFWNWwtNyA3IDcgN3YtNC4xYzUgMCA4LjUgMS42IDExIDUuMS0xLTUtNC0xMC0xMS0xMXoiIC8+PC9nPgo8ZyBpZD0icmVwb3J0Ij48cGF0aCBkPSJNMTUuNzMgM0g4LjI3TDMgOC4yN3Y3LjQ2TDguMjcgMjFoNy40NkwyMSAxNS43M1Y4LjI3TDE1LjczIDN6TTEyIDE3LjNjLS43MiAwLTEuMy0uNTgtMS4zLTEuMyAwLS43Mi41OC0xLjMgMS4zLTEuMy43MiAwIDEuMy41OCAxLjMgMS4zIDAgLjcyLS41OCAxLjMtMS4zIDEuM3ptMS00LjNoLTJWN2gydjZ6IiAvPjwvZz4KPGcgaWQ9InJlcG9ydC1wcm9ibGVtIj48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJyZXN0b3JlIj48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiIgLz48L2c+CjxnIGlkPSJyZXN0b3JlLXBhZ2UiPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bS0yIDE2Yy0yLjA1IDAtMy44MS0xLjI0LTQuNTgtM2gxLjcxYy42My45IDEuNjggMS41IDIuODcgMS41IDEuOTMgMCAzLjUtMS41NyAzLjUtMy41UzEzLjkzIDkuNSAxMiA5LjVjLTEuMzUgMC0yLjUyLjc4LTMuMSAxLjlsMS42IDEuNmgtNFY5bDEuMyAxLjNDOC42OSA4LjkyIDEwLjIzIDggMTIgOGMyLjc2IDAgNSAyLjI0IDUgNXMtMi4yNCA1LTUgNXoiIC8+PC9nPgo8ZyBpZD0icm9vbSI+PHBhdGggZD0iTTEyIDJDOC4xMyAyIDUgNS4xMyA1IDljMCA1LjI1IDcgMTMgNyAxM3M3LTcuNzUgNy0xM2MwLTMuODctMy4xMy03LTctN3ptMCA5LjVjLTEuMzggMC0yLjUtMS4xMi0yLjUtMi41czEuMTItMi41IDIuNS0yLjUgMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41eiIgLz48L2c+CjxnIGlkPSJyb3VuZGVkLWNvcm5lciI+PHBhdGggZD0iTTE5IDE5aDJ2MmgtMnYtMnptMC0yaDJ2LTJoLTJ2MnpNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptMC00aDJWM0gzdjJ6bTQgMGgyVjNIN3Yyem04IDE2aDJ2LTJoLTJ2MnptLTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bS04IDBoMnYtMkg3djJ6bS00IDBoMnYtMkgzdjJ6TTIxIDhjMC0yLjc2LTIuMjQtNS01LTVoLTV2Mmg1YzEuNjUgMCAzIDEuMzUgMyAzdjVoMlY4eiIgLz48L2c+CjxnIGlkPSJyb3dpbmciPjxwYXRoIGQ9Ik04LjUgMTQuNUw0IDE5bDEuNSAxLjVMOSAxN2gybC0yLjUtMi41ek0xNSAxYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNiAyMC4wMUwxOCAyNGwtMi45OS0zLjAxVjE5LjVsLTcuMS03LjA5Yy0uMzEuMDUtLjYxLjA3LS45MS4wN3YtMi4xNmMxLjY2LjAzIDMuNjEtLjg3IDQuNjctMi4wNGwxLjQtMS41NWMuMTktLjIxLjQzLS4zOC42OS0uNS4yOS0uMTQuNjItLjIzLjk2LS4yM2guMDNDMTUuOTkgNi4wMSAxNyA3LjAyIDE3IDguMjZ2NS43NWMwIC44NC0uMzUgMS42MS0uOTIgMi4xNmwtMy41OC0zLjU4di0yLjI3Yy0uNjMuNTItMS40MyAxLjAyLTIuMjkgMS4zOUwxNi41IDE4SDE4bDMgMy4wMXoiIC8+PC9nPgo8ZyBpZD0ic2F2ZSI+PHBhdGggZD0iTTE3IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdsLTQtNHptLTUgMTZjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzem0zLTEwSDVWNWgxMHY0eiIgLz48L2c+CjxnIGlkPSJzY2hlZHVsZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiIC8+PC9nPgo8ZyBpZD0ic2VhcmNoIj48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiIC8+PC9nPgo8ZyBpZD0ic2VsZWN0LWFsbCI+PHBhdGggZD0iTTMgNWgyVjNjLTEuMSAwLTIgLjktMiAyem0wIDhoMnYtMkgzdjJ6bTQgOGgydi0ySDd2MnpNMyA5aDJWN0gzdjJ6bTEwLTZoLTJ2MmgyVjN6bTYgMHYyaDJjMC0xLjEtLjktMi0yLTJ6TTUgMjF2LTJIM2MwIDEuMS45IDIgMiAyem0tMi00aDJ2LTJIM3Yyek05IDNIN3YyaDJWM3ptMiAxOGgydi0yaC0ydjJ6bTgtOGgydi0yaC0ydjJ6bTAgOGMxLjEgMCAyLS45IDItMmgtMnYyem0wLTEyaDJWN2gtMnYyem0wIDhoMnYtMmgtMnYyem0tNCA0aDJ2LTJoLTJ2MnptMC0xNmgyVjNoLTJ2MnpNNyAxN2gxMFY3SDd2MTB6bTItOGg2djZIOVY5eiIgLz48L2c+CjxnIGlkPSJzZW5kIj48cGF0aCBkPSJNMi4wMSAyMUwyMyAxMiAyLjAxIDMgMiAxMGwxNSAyLTE1IDJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzIj48cGF0aCBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVDMTQuNDYgMi4xOCAxNC4yNSAyIDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYXBwbGljYXRpb25zIj48cGF0aCBkPSJNMTIgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem03LTdINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xLS44OS0yLTItMnptLTEuNzUgOWMwIC4yMy0uMDIuNDYtLjA1LjY4bDEuNDggMS4xNmMuMTMuMTEuMTcuMy4wOC40NWwtMS40IDIuNDJjLS4wOS4xNS0uMjcuMjEtLjQzLjE1bC0xLjc0LS43Yy0uMzYuMjgtLjc2LjUxLTEuMTguNjlsLS4yNiAxLjg1Yy0uMDMuMTctLjE4LjMtLjM1LjNoLTIuOGMtLjE3IDAtLjMyLS4xMy0uMzUtLjI5bC0uMjYtMS44NWMtLjQzLS4xOC0uODItLjQxLTEuMTgtLjY5bC0xLjc0LjdjLS4xNi4wNi0uMzQgMC0uNDMtLjE1bC0xLjQtMi40MmMtLjA5LS4xNS0uMDUtLjM0LjA4LS40NWwxLjQ4LTEuMTZjLS4wMy0uMjMtLjA1LS40Ni0uMDUtLjY5IDAtLjIzLjAyLS40Ni4wNS0uNjhsLTEuNDgtMS4xNmMtLjEzLS4xMS0uMTctLjMtLjA4LS40NWwxLjQtMi40MmMuMDktLjE1LjI3LS4yMS40My0uMTVsMS43NC43Yy4zNi0uMjguNzYtLjUxIDEuMTgtLjY5bC4yNi0xLjg1Yy4wMy0uMTcuMTgtLjMuMzUtLjNoMi44Yy4xNyAwIC4zMi4xMy4zNS4yOWwuMjYgMS44NWMuNDMuMTguODIuNDEgMS4xOC42OWwxLjc0LS43Yy4xNi0uMDYuMzQgMCAuNDMuMTVsMS40IDIuNDJjLjA5LjE1LjA1LjM0LS4wOC40NWwtMS40OCAxLjE2Yy4wMy4yMy4wNS40Ni4wNS42OXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYmFja3VwLXJlc3RvcmUiPjxwYXRoIGQ9Ik0xNCAxMmMwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDIgLjkgMiAyIDIgMi0uOSAyLTJ6bS0yLTljLTQuOTcgMC05IDQuMDMtOSA5SDBsNCA0IDQtNEg1YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS41MSAwLTIuOTEtLjQ5LTQuMDYtMS4zbC0xLjQyIDEuNDRDOC4wNCAyMC4zIDkuOTQgMjEgMTIgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJsdWV0b290aCI+PHBhdGggZD0iTTExIDI0aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnptOCAwaDJ2LTJoLTJ2MnptMi43MS0xOC4yOUwxMiAwaC0xdjcuNTlMNi40MSAzIDUgNC40MSAxMC41OSAxMCA1IDE1LjU5IDYuNDEgMTcgMTEgMTIuNDFWMjBoMWw1LjcxLTUuNzEtNC4zLTQuMjkgNC4zLTQuMjl6TTEzIDMuODNsMS44OCAxLjg4TDEzIDcuNTlWMy44M3ptMS44OCAxMC40NkwxMyAxNi4xN3YtMy43NmwxLjg4IDEuODh6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJyaWdodG5lc3MiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6TTggMTZoMi41bDEuNSAxLjUgMS41LTEuNUgxNnYtMi41bDEuNS0xLjUtMS41LTEuNVY4aC0yLjVMMTIgNi41IDEwLjUgOEg4djIuNUw2LjUgMTIgOCAxMy41VjE2em00LTdjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDNWOXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtY2VsbCI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTE2IC4wMUw4IDBDNi45IDAgNiAuOSA2IDJ2MTZjMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjJjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE2IDE2SDhWNGg4djEyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1ldGhlcm5ldCI+PHBhdGggZD0iTTcuNzcgNi43Nkw2LjIzIDUuNDguODIgMTJsNS40MSA2LjUyIDEuNTQtMS4yOEwzLjQyIDEybDQuMzUtNS4yNHpNNyAxM2gydi0ySDd2MnptMTAtMmgtMnYyaDJ2LTJ6bS02IDJoMnYtMmgtMnYyem02Ljc3LTcuNTJsLTEuNTQgMS4yOEwyMC41OCAxMmwtNC4zNSA1LjI0IDEuNTQgMS4yOEwyMy4xOCAxMmwtNS40MS02LjUyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1hbnRlbm5hIj48cGF0aCBkPSJNMTIgNWMtMy44NyAwLTcgMy4xMy03IDdoMmMwLTIuNzYgMi4yNC01IDUtNXM1IDIuMjQgNSA1aDJjMC0zLjg3LTMuMTMtNy03LTd6bTEgOS4yOWMuODgtLjM5IDEuNS0xLjI2IDEuNS0yLjI5IDAtMS4zOC0xLjEyLTIuNS0yLjUtMi41UzkuNSAxMC42MiA5LjUgMTJjMCAxLjAyLjYyIDEuOSAxLjUgMi4yOXYzLjNMNy41OSAyMSA5IDIyLjQxbDMtMyAzIDNMMTYuNDEgMjEgMTMgMTcuNTl2LTMuM3pNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJoMmMwLTQuOTcgNC4wMy05IDktOXM5IDQuMDMgOSA5aDJjMC02LjA3LTQuOTMtMTEtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvbmVudCI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtY29tcG9zaXRlIj48cGF0aCBkPSJNNSAyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIMXY2aDZWNkg1VjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJIOXYyem0tOCAwYzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOEM2LjE2IDE4LjQgNyAxNy4zIDcgMTZ2LTJIMXYyek0yMSA2VjJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NGgtMnY2aDZWNmgtMnptLTgtNGMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDl2Nmg2VjZoLTJWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMmgtNnYyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1oZG1pIj48cGF0aCBkPSJNMTggN1Y0YzAtMS4xLS45LTItMi0ySDhjLTEuMSAwLTIgLjktMiAydjNINXY2bDMgNnYzaDh2LTNsMy02VjdoLTF6TTggNGg4djNoLTJWNWgtMXYyaC0yVjVoLTF2Mkg4VjR6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LXN2aWRlbyI+PHBhdGggZD0iTTggMTEuNWMwLS44My0uNjctMS41LTEuNS0xLjVTNSAxMC42NyA1IDExLjUgNS42NyAxMyA2LjUgMTMgOCAxMi4zMyA4IDExLjV6bTctNWMwLS44My0uNjctMS41LTEuNS0xLjVoLTNDOS42NyA1IDkgNS42NyA5IDYuNVM5LjY3IDggMTAuNSA4aDNjLjgzIDAgMS41LS42NyAxLjUtMS41ek04LjUgMTVjLS44MyAwLTEuNS42Ny0xLjUgMS41UzcuNjcgMTggOC41IDE4czEuNS0uNjcgMS41LTEuNVM5LjMzIDE1IDguNSAxNXpNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJzNC45MyAxMSAxMSAxMSAxMS00LjkzIDExLTExUzE4LjA3IDEgMTIgMXptMCAyMGMtNC45NiAwLTktNC4wNC05LTlzNC4wNC05IDktOSA5IDQuMDQgOSA5LTQuMDQgOS05IDl6bTUuNS0xMWMtLjgzIDAtMS41LjY3LTEuNSAxLjVzLjY3IDEuNSAxLjUgMS41IDEuNS0uNjcgMS41LTEuNS0uNjctMS41LTEuNS0xLjV6bS0yIDVjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1vdmVyc2NhbiI+PHBhdGggZD0iTTEyLjAxIDUuNUwxMCA4aDRsLTEuOTktMi41ek0xOCAxMHY0bDIuNS0xLjk5TDE4IDEwek02IDEwbC0yLjUgMi4wMUw2IDE0di00em04IDZoLTRsMi4wMSAyLjVMMTQgMTZ6bTctMTNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcGhvbmUiPjxwYXRoIGQ9Ik0xMyA5aC0ydjJoMlY5em00IDBoLTJ2MmgyVjl6bTMgNi41Yy0xLjI1IDAtMi40NS0uMi0zLjU3LS41Ny0uMzUtLjExLS43NC0uMDMtMS4wMi4yNGwtMi4yIDIuMmMtMi44My0xLjQ0LTUuMTUtMy43NS02LjU5LTYuNThsMi4yLTIuMjFjLjI4LS4yNy4zNi0uNjYuMjUtMS4wMUM4LjcgNi40NSA4LjUgNS4yNSA4LjUgNGMwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxIDAgOS4zOSA3LjYxIDE3IDE3IDE3IC41NSAwIDEtLjQ1IDEtMXYtMy41YzAtLjU1LS40NS0xLTEtMXpNMTkgOXYyaDJWOWgtMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcG93ZXIiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem0yLTIyaC0ydjEwaDJWMnptMy41NiAyLjQ0bC0xLjQ1IDEuNDVDMTYuODQgNi45NCAxOCA4LjgzIDE4IDExYzAgMy4zMS0yLjY5IDYtNiA2cy02LTIuNjktNi02YzAtMi4xNyAxLjE2LTQuMDYgMi44OC01LjEyTDcuNDQgNC40NEM1LjM2IDUuODggNCA4LjI4IDQgMTFjMCA0LjQyIDMuNTggOCA4IDhzOC0zLjU4IDgtOGMwLTIuNzItMS4zNi01LjEyLTMuNDQtNi41NnpNMTUgMjRoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1yZW1vdGUiPjxwYXRoIGQ9Ik0xNSA5SDljLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMVYxMGMwLS41NS0uNDUtMS0xLTF6bS0zIDZjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyek03LjA1IDYuMDVsMS40MSAxLjQxQzkuMzcgNi41NiAxMC42MiA2IDEyIDZzMi42My41NiAzLjU0IDEuNDZsMS40MS0xLjQxQzE1LjY4IDQuNzggMTMuOTMgNCAxMiA0cy0zLjY4Ljc4LTQuOTUgMi4wNXpNMTIgMEM4Ljk2IDAgNi4yMSAxLjIzIDQuMjIgMy4yMmwxLjQxIDEuNDFDNy4yNiAzLjAxIDkuNTEgMiAxMiAyczQuNzQgMS4wMSA2LjM2IDIuNjRsMS40MS0xLjQxQzE3Ljc5IDEuMjMgMTUuMDQgMCAxMiAweiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy12b2ljZSI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTUtMTFjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNGMwLTEuNjYtMS4zNC0zLTMtM1M5IDIuMzQgOSA0djZjMCAxLjY2IDEuMzQgMyAzIDN6bS0xIDExaDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnptNC0xNGgtMS43YzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxMyA2LjcgMTBINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMGgydi0zLjI4YzMuMjgtLjQ5IDYtMy4zMSA2LTYuNzJ6IiAvPjwvZz4KPGcgaWQ9InNob3AiPjxwYXRoIGQ9Ik0xNiA2VjRjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDJ2MTNjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmgtNnptLTYtMmg0djJoLTRWNHpNOSAxOFY5bDcuNSA0TDkgMTh6IiAvPjwvZz4KPGcgaWQ9InNob3AtdHdvIj48cGF0aCBkPSJNMyA5SDF2MTFjMCAxLjExLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS44OSAyLTJIM1Y5em0xNS00VjNjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDV2MTFjMCAxLjExLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS44OSAyLTJWNWgtNXptLTYtMmg0djJoLTRWM3ptMCAxMlY4bDUuNSAzLTUuNSA0eiIgLz48L2c+CjxnIGlkPSJzaG9wcGluZy1iYXNrZXQiPjxwYXRoIGQ9Ik0xNy4yMSA5bC00LjM4LTYuNTZjLS4xOS0uMjgtLjUxLS40Mi0uODMtLjQyLS4zMiAwLS42NC4xNC0uODMuNDNMNi43OSA5SDJjLS41NSAwLTEgLjQ1LTEgMSAwIC4wOS4wMS4xOC4wNC4yN2wyLjU0IDkuMjdjLjIzLjg0IDEgMS40NiAxLjkyIDEuNDZoMTNjLjkyIDAgMS42OS0uNjIgMS45My0xLjQ2bDIuNTQtOS4yN0wyMyAxMGMwLS41NS0uNDUtMS0xLTFoLTQuNzl6TTkgOWwzLTQuNEwxNSA5SDl6bTMgOGMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6IiAvPjwvZz4KPGcgaWQ9InNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik03IDE4Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yek0xIDJ2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINS4yMWwtLjk0LTJIMXptMTYgMTZjLTEuMSAwLTEuOTkuOS0xLjk5IDJzLjg5IDIgMS45OSAyIDItLjkgMi0yLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJzb3J0Ij48cGF0aCBkPSJNMyAxOGg2di0ySDN2MnpNMyA2djJoMThWNkgzem0wIDdoMTJ2LTJIM3YyeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLW5vdGVzIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTggMTRINnYtMmgydjJ6bTAtM0g2VjloMnYyem0wLTNINlY2aDJ2MnptNyA2aC01di0yaDV2MnptMy0zaC04VjloOHYyem0wLTNoLThWNmg4djJ6IiAvPjwvZz4KPGcgaWQ9InNwZWFrZXItbm90ZXMtb2ZmIj48cGF0aCBkPSJNMTAuNTQgMTFsLS41NC0uNTRMNy41NCA4IDYgNi40NiAyLjM4IDIuODQgMS4yNyAxLjczIDAgM2wyLjAxIDIuMDFMMiAyMmw0LTRoOWw1LjczIDUuNzNMMjIgMjIuNDYgMTcuNTQgMThsLTctN3pNOCAxNEg2di0yaDJ2MnptLTItM1Y5bDIgMkg2em0xNC05SDQuMDhMMTAgNy45MlY2aDh2MmgtNy45MmwxIDFIMTh2MmgtNC45Mmw2Ljk5IDYuOTlDMjEuMTQgMTcuOTUgMjIgMTcuMDggMjIgMTZWNGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ic3BlbGxjaGVjayI+PHBhdGggZD0iTTEyLjQ1IDE2aDIuMDlMOS40MyAzSDcuNTdMMi40NiAxNmgyLjA5bDEuMTItM2g1LjY0bDEuMTQgM3ptLTYuMDItNUw4LjUgNS40OCAxMC41NyAxMUg2LjQzem0xNS4xNi41OWwtOC4wOSA4LjA5TDkuODMgMTZsLTEuNDEgMS40MSA1LjA5IDUuMDlMMjMgMTNsLTEuNDEtMS40MXoiIC8+PC9nPgo8ZyBpZD0ic3RhciI+PHBhdGggZD0iTTEyIDE3LjI3TDE4LjE4IDIxbC0xLjY0LTcuMDNMMjIgOS4yNGwtNy4xOS0uNjFMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxeiIgLz48L2c+CjxnIGlkPSJzdGFyLWJvcmRlciI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRsLTMuNzYgMi4yNyAxLTQuMjgtMy4zMi0yLjg4IDQuMzgtLjM4TDEyIDYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6IiAvPjwvZz4KPGcgaWQ9InN0YXItaGFsZiI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRWNi4xbDEuNzEgNC4wNCA0LjM4LjM4LTMuMzIgMi44OCAxIDQuMjhMMTIgMTUuNHoiIC8+PC9nPgo8ZyBpZD0ic3RhcnMiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyem00LjI0IDE2TDEyIDE1LjQ1IDcuNzcgMThsMS4xMi00LjgxLTMuNzMtMy4yMyA0LjkyLS40MkwxMiA1bDEuOTIgNC41MyA0LjkyLjQyLTMuNzMgMy4yM0wxNi4yMyAxOHoiIC8+PC9nPgo8ZyBpZD0ic3RvcmUiPjxwYXRoIGQ9Ik0yMCA0SDR2MmgxNlY0em0xIDEwdi0ybC0xLTVINGwtMSA1djJoMXY2aDEwdi02aDR2Nmgydi02aDF6bS05IDRINnYtNGg2djR6IiAvPjwvZz4KPGcgaWQ9InN1YmRpcmVjdG9yeS1hcnJvdy1sZWZ0Ij48cGF0aCBkPSJNMTEgOWwxLjQyIDEuNDJMOC44MyAxNEgxOFY0aDJ2MTJIOC44M2wzLjU5IDMuNThMMTEgMjFsLTYtNiA2LTZ6IiAvPjwvZz4KPGcgaWQ9InN1YmRpcmVjdG9yeS1hcnJvdy1yaWdodCI+PHBhdGggZD0iTTE5IDE1bC02IDYtMS40Mi0xLjQyTDE1LjE3IDE2SDRWNGgydjEwaDkuMTdsLTMuNTktMy41OEwxMyA5bDYgNnoiIC8+PC9nPgo8ZyBpZD0ic3ViamVjdCI+PHBhdGggZD0iTTE0IDE3SDR2MmgxMHYtMnptNi04SDR2MmgxNlY5ek00IDE1aDE2di0ySDR2MnpNNCA1djJoMTZWNUg0eiIgLz48L2c+CjxnIGlkPSJzdXBlcnZpc29yLWFjY291bnQiPjxwYXRoIGQ9Ik0xNi41IDEyYzEuMzggMCAyLjQ5LTEuMTIgMi40OS0yLjVTMTcuODggNyAxNi41IDdDMTUuMTIgNyAxNCA4LjEyIDE0IDkuNXMxLjEyIDIuNSAyLjUgMi41ek05IDExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zUzEwLjY2IDUgOSA1QzcuMzQgNSA2IDYuMzQgNiA4czEuMzQgMyAzIDN6bTcuNSAzYy0xLjgzIDAtNS41LjkyLTUuNSAyLjc1VjE5aDExdi0yLjI1YzAtMS44My0zLjY3LTIuNzUtNS41LTIuNzV6TTkgMTNjLTIuMzMgMC03IDEuMTctNyAzLjVWMTloN3YtMi4yNWMwLS44NS4zMy0yLjM0IDIuMzctMy40N0MxMC41IDEzLjEgOS42NiAxMyA5IDEzeiIgLz48L2c+CjxnIGlkPSJzd2FwLWhvcml6Ij48cGF0aCBkPSJNNi45OSAxMUwzIDE1bDMuOTkgNHYtM0gxNHYtMkg2Ljk5di0zek0yMSA5bC0zLjk5LTR2M0gxMHYyaDcuMDF2M0wyMSA5eiIgLz48L2c+CjxnIGlkPSJzd2FwLXZlcnQiPjxwYXRoIGQ9Ik0xNiAxNy4wMVYxMGgtMnY3LjAxaC0zTDE1IDIxbDQtMy45OWgtM3pNOSAzTDUgNi45OWgzVjE0aDJWNi45OWgzTDkgM3oiIC8+PC9nPgo8ZyBpZD0ic3dhcC12ZXJ0aWNhbC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyek02LjUgOUwxMCA1LjUgMTMuNSA5SDExdjRIOVY5SDYuNXptMTEgNkwxNCAxOC41IDEwLjUgMTVIMTN2LTRoMnY0aDIuNXoiIC8+PC9nPgo8ZyBpZD0ic3lzdGVtLXVwZGF0ZS1hbHQiPjxwYXRoIGQ9Ik0xMiAxNi41bDQtNGgtM3YtOWgtMnY5SDhsNCA0em05LTEzaC02djEuOTloNnYxNC4wM0gzVjUuNDloNlYzLjVIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnYtMTRjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InRhYiI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDNWNWgxMHY0aDh2MTB6IiAvPjwvZz4KPGcgaWQ9InRhYi11bnNlbGVjdGVkIj48cGF0aCBkPSJNMSA5aDJWN0gxdjJ6bTAgNGgydi0ySDF2MnptMC04aDJWM2MtMS4xIDAtMiAuOS0yIDJ6bTggMTZoMnYtMkg5djJ6bS04LTRoMnYtMkgxdjJ6bTIgNHYtMkgxYzAgMS4xLjkgMiAyIDJ6TTIxIDNoLTh2NmgxMFY1YzAtMS4xLS45LTItMi0yem0wIDE0aDJ2LTJoLTJ2MnpNOSA1aDJWM0g5djJ6TTUgMjFoMnYtMkg1djJ6TTUgNWgyVjNINXYyem0xNiAxNmMxLjEgMCAyLS45IDItMmgtMnYyem0wLThoMnYtMmgtMnYyem0tOCA4aDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0idGV4dC1mb3JtYXQiPjxwYXRoIGQ9Ik01IDE3djJoMTR2LTJINXptNC41LTQuMmg1bC45IDIuMmgyLjFMMTIuNzUgNGgtMS41TDYuNSAxNWgyLjFsLjktMi4yek0xMiA1Ljk4TDEzLjg3IDExaC0zLjc0TDEyIDUuOTh6IiAvPjwvZz4KPGcgaWQ9InRoZWF0ZXJzIj48cGF0aCBkPSJNMTggM3YyaC0yVjNIOHYySDZWM0g0djE4aDJ2LTJoMnYyaDh2LTJoMnYyaDJWM2gtMnpNOCAxN0g2di0yaDJ2MnptMC00SDZ2LTJoMnYyem0wLTRINlY3aDJ2MnptMTAgOGgtMnYtMmgydjJ6bTAtNGgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2MnoiIC8+PC9nPgo8ZyBpZD0idGh1bWItZG93biI+PHBhdGggZD0iTTE1IDNINmMtLjgzIDAtMS41NC41LTEuODQgMS4yMmwtMy4wMiA3LjA1Yy0uMDkuMjMtLjE0LjQ3LS4xNC43M3YxLjkxbC4wMS4wMUwxIDE0YzAgMS4xLjkgMiAyIDJoNi4zMWwtLjk1IDQuNTctLjAzLjMyYzAgLjQxLjE3Ljc5LjQ0IDEuMDZMOS44MyAyM2w2LjU5LTYuNTljLjM2LS4zNi41OC0uODYuNTgtMS40MVY1YzAtMS4xLS45LTItMi0yem00IDB2MTJoNFYzaC00eiIgLz48L2c+CjxnIGlkPSJ0aHVtYi11cCI+PHBhdGggZD0iTTEgMjFoNFY5SDF2MTJ6bTIyLTExYzAtMS4xLS45LTItMi0yaC02LjMxbC45NS00LjU3LjAzLS4zMmMwLS40MS0uMTctLjc5LS40NC0xLjA2TDE0LjE3IDEgNy41OSA3LjU5QzcuMjIgNy45NSA3IDguNDUgNyA5djEwYzAgMS4xLjkgMiAyIDJoOWMuODMgMCAxLjU0LS41IDEuODQtMS4yMmwzLjAyLTcuMDVjLjA5LS4yMy4xNC0uNDcuMTQtLjczdi0xLjkxbC0uMDEtLjAxTDIzIDEweiIgLz48L2c+CjxnIGlkPSJ0aHVtYnMtdXAtZG93biI+PHBhdGggZD0iTTEyIDZjMC0uNTUtLjQ1LTEtMS0xSDUuODJsLjY2LTMuMTguMDItLjIzYzAtLjMxLS4xMy0uNTktLjMzLS44TDUuMzggMCAuNDQgNC45NEMuMTcgNS4yMSAwIDUuNTkgMCA2djYuNWMwIC44My42NyAxLjUgMS41IDEuNWg2Ljc1Yy42MiAwIDEuMTUtLjM4IDEuMzgtLjkxbDIuMjYtNS4yOWMuMDctLjE3LjExLS4zNi4xMS0uNTVWNnptMTAuNSA0aC02Ljc1Yy0uNjIgMC0xLjE1LjM4LTEuMzguOTFsLTIuMjYgNS4yOWMtLjA3LjE3LS4xMS4zNi0uMTEuNTVWMThjMCAuNTUuNDUgMSAxIDFoNS4xOGwtLjY2IDMuMTgtLjAyLjI0YzAgLjMxLjEzLjU5LjMzLjhsLjc5Ljc4IDQuOTQtNC45NGMuMjctLjI3LjQ0LS42NS40NC0xLjA2di02LjVjMC0uODMtLjY3LTEuNS0xLjUtMS41eiIgLz48L2c+CjxnIGlkPSJ0aW1lbGluZSI+PHBhdGggZD0iTTIzIDhjMCAxLjEtLjkgMi0yIDItLjE4IDAtLjM1LS4wMi0uNTEtLjA3bC0zLjU2IDMuNTVjLjA1LjE2LjA3LjM0LjA3LjUyIDAgMS4xLS45IDItMiAycy0yLS45LTItMmMwLS4xOC4wMi0uMzYuMDctLjUybC0yLjU1LTIuNTVjLS4xNi4wNS0uMzQuMDctLjUyLjA3cy0uMzYtLjAyLS41Mi0uMDdsLTQuNTUgNC41NmMuMDUuMTYuMDcuMzMuMDcuNTEgMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yIC45LTIgMi0yYy4xOCAwIC4zNS4wMi41MS4wN2w0LjU2LTQuNTVDOC4wMiA5LjM2IDggOS4xOCA4IDljMC0xLjEuOS0yIDItMnMyIC45IDIgMmMwIC4xOC0uMDIuMzYtLjA3LjUybDIuNTUgMi41NWMuMTYtLjA1LjM0LS4wNy41Mi0uMDdzLjM2LjAyLjUyLjA3bDMuNTUtMy41NkMxOS4wMiA4LjM1IDE5IDguMTggMTkgOGMwLTEuMS45LTIgMi0yczIgLjkgMiAyeiIgLz48L2c+CjxnIGlkPSJ0b2MiPjxwYXRoIGQ9Ik0zIDloMTRWN0gzdjJ6bTAgNGgxNHYtMkgzdjJ6bTAgNGgxNHYtMkgzdjJ6bTE2IDBoMnYtMmgtMnYyem0wLTEwdjJoMlY3aC0yem0wIDZoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJ0b2RheSI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOGgxNHYxMXpNNyAxMGg1djVIN3oiIC8+PC9nPgo8ZyBpZD0idG9sbCI+PHBhdGggZD0iTTE1IDRjLTQuNDIgMC04IDMuNTgtOCA4czMuNTggOCA4IDggOC0zLjU4IDgtOC0zLjU4LTgtOC04em0wIDE0Yy0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02IDYgMi42OSA2IDYtMi42OSA2LTYgNnpNMyAxMmMwLTIuNjEgMS42Ny00LjgzIDQtNS42NVY0LjI2QzMuNTUgNS4xNSAxIDguMjcgMSAxMnMyLjU1IDYuODUgNiA3Ljc0di0yLjA5Yy0yLjMzLS44Mi00LTMuMDQtNC01LjY1eiIgLz48L2c+CjxnIGlkPSJ0b3VjaC1hcHAiPjxwYXRoIGQ9Ik05IDExLjI0VjcuNUM5IDYuMTIgMTAuMTIgNSAxMS41IDVTMTQgNi4xMiAxNCA3LjV2My43NGMxLjIxLS44MSAyLTIuMTggMi0zLjc0QzE2IDUuMDEgMTMuOTkgMyAxMS41IDNTNyA1LjAxIDcgNy41YzAgMS41Ni43OSAyLjkzIDIgMy43NHptOS44NCA0LjYzbC00LjU0LTIuMjZjLS4xNy0uMDctLjM1LS4xMS0uNTQtLjExSDEzdi02YzAtLjgzLS42Ny0xLjUtMS41LTEuNVMxMCA2LjY3IDEwIDcuNXYxMC43NGwtMy40My0uNzJjLS4wOC0uMDEtLjE1LS4wMy0uMjQtLjAzLS4zMSAwLS41OS4xMy0uNzkuMzNsLS43OS44IDQuOTQgNC45NGMuMjcuMjcuNjUuNDQgMS4wNi40NGg2Ljc5Yy43NSAwIDEuMzMtLjU1IDEuNDQtMS4yOGwuNzUtNS4yN2MuMDEtLjA3LjAyLS4xNC4wMi0uMiAwLS42Mi0uMzgtMS4xNi0uOTEtMS4zOHoiIC8+PC9nPgo8ZyBpZD0idHJhY2stY2hhbmdlcyI+PHBhdGggZD0iTTE5LjA3IDQuOTNsLTEuNDEgMS40MUMxOS4xIDcuNzkgMjAgOS43OSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHMtOC0zLjU4LTgtOGMwLTQuMDggMy4wNS03LjQ0IDctNy45M3YyLjAyQzguMTYgNi41NyA2IDkuMDMgNiAxMmMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02YzAtMS42Ni0uNjctMy4xNi0xLjc2LTQuMjRsLTEuNDEgMS40MUMxNS41NSA5LjkgMTYgMTAuOSAxNiAxMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNGMwLTEuODYgMS4yOC0zLjQxIDMtMy44NnYyLjE0Yy0uNi4zNS0xIC45OC0xIDEuNzIgMCAxLjEuOSAyIDIgMnMyLS45IDItMmMwLS43NC0uNC0xLjM4LTEtMS43MlYyaC0xQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBjMC0yLjc2LTEuMTItNS4yNi0yLjkzLTcuMDd6IiAvPjwvZz4KPGcgaWQ9InRyYW5zbGF0ZSI+PHBhdGggZD0iTTEyLjg3IDE1LjA3bC0yLjU0LTIuNTEuMDMtLjAzYzEuNzQtMS45NCAyLjk4LTQuMTcgMy43MS02LjUzSDE3VjRoLTdWMkg4djJIMXYxLjk5aDExLjE3QzExLjUgNy45MiAxMC40NCA5Ljc1IDkgMTEuMzUgOC4wNyAxMC4zMiA3LjMgOS4xOSA2LjY5IDhoLTJjLjczIDEuNjMgMS43MyAzLjE3IDIuOTggNC41NmwtNS4wOSA1LjAyTDQgMTlsNS01IDMuMTEgMy4xMS43Ni0yLjA0ek0xOC41IDEwaC0yTDEyIDIyaDJsMS4xMi0zaDQuNzVMMjEgMjJoMmwtNC41LTEyem0tMi42MiA3bDEuNjItNC4zM0wxOS4xMiAxN2gtMy4yNHoiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctZG93biI+PHBhdGggZD0iTTE2IDE4bDIuMjktMi4yOS00Ljg4LTQuODgtNCA0TDIgNy40MSAzLjQxIDZsNiA2IDQtNCA2LjMgNi4yOUwyMiAxMnY2eiIgLz48L2c+CjxnIGlkPSJ0cmVuZGluZy1mbGF0Ij48cGF0aCBkPSJNMjIgMTJsLTQtNHYzSDN2MmgxNXYzeiIgLz48L2c+CjxnIGlkPSJ0cmVuZGluZy11cCI+PHBhdGggZD0iTTE2IDZsMi4yOSAyLjI5LTQuODggNC44OC00LTRMMiAxNi41OSAzLjQxIDE4bDYtNiA0IDQgNi4zLTYuMjlMMjIgMTJWNnoiIC8+PC9nPgo8ZyBpZD0idHVybmVkLWluIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ0dXJuZWQtaW4tbm90Ij48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiIgLz48L2c+CjxnIGlkPSJ1bmFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NSA1LjIybC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTUuNTVMMy40NiA1LjIyQzMuMTcgNS41NyAzIDYuMDEgMyA2LjVWMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNi41YzAtLjQ5LS4xNy0uOTMtLjQ1LTEuMjh6TTEyIDkuNWw1LjUgNS41SDE0djJoLTR2LTJINi41TDEyIDkuNXpNNS4xMiA1bC44Mi0xaDEybC45MyAxSDUuMTJ6IiAvPjwvZz4KPGcgaWQ9InVuZG8iPjxwYXRoIGQ9Ik0xMi41IDhjLTIuNjUgMC01LjA1Ljk5LTYuOSAyLjZMMiA3djloOWwtMy42Mi0zLjYyYzEuMzktMS4xNiAzLjE2LTEuODggNS4xMi0xLjg4IDMuNTQgMCA2LjU1IDIuMzEgNy42IDUuNWwyLjM3LS43OEMyMS4wOCAxMS4wMyAxNy4xNSA4IDEyLjUgOHoiIC8+PC9nPgo8ZyBpZD0idW5mb2xkLWxlc3MiPjxwYXRoIGQ9Ik03LjQxIDE4LjU5TDguODMgMjAgMTIgMTYuODMgMTUuMTcgMjBsMS40MS0xLjQxTDEyIDE0bC00LjU5IDQuNTl6bTkuMTgtMTMuMThMMTUuMTcgNCAxMiA3LjE3IDguODMgNCA3LjQxIDUuNDEgMTIgMTBsNC41OS00LjU5eiIgLz48L2c+CjxnIGlkPSJ1bmZvbGQtbW9yZSI+PHBhdGggZD0iTTEyIDUuODNMMTUuMTcgOWwxLjQxLTEuNDFMMTIgMyA3LjQxIDcuNTkgOC44MyA5IDEyIDUuODN6bTAgMTIuMzRMOC44MyAxNWwtMS40MSAxLjQxTDEyIDIxbDQuNTktNC41OUwxNS4xNyAxNSAxMiAxOC4xN3oiIC8+PC9nPgo8ZyBpZD0idXBkYXRlIj48cGF0aCBkPSJNMjEgMTAuMTJoLTYuNzhsMi43NC0yLjgyYy0yLjczLTIuNy03LjE1LTIuOC05Ljg4LS4xLTIuNzMgMi43MS0yLjczIDcuMDggMCA5Ljc5IDIuNzMgMi43MSA3LjE1IDIuNzEgOS44OCAwQzE4LjMyIDE1LjY1IDE5IDE0LjA4IDE5IDEyLjFoMmMwIDEuOTgtLjg4IDQuNTUtMi42NCA2LjI5LTMuNTEgMy40OC05LjIxIDMuNDgtMTIuNzIgMC0zLjUtMy40Ny0zLjUzLTkuMTEtLjAyLTEyLjU4IDMuNTEtMy40NyA5LjE0LTMuNDcgMTIuNjUgMEwyMSAzdjcuMTJ6TTEyLjUgOHY0LjI1bDMuNSAyLjA4LS43MiAxLjIxTDExIDEzVjhoMS41eiIgLz48L2c+CjxnIGlkPSJ2ZXJpZmllZC11c2VyIj48cGF0aCBkPSJNMTIgMUwzIDV2NmMwIDUuNTUgMy44NCAxMC43NCA5IDEyIDUuMTYtMS4yNiA5LTYuNDUgOS0xMlY1bC05LTR6bS0yIDE2bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6IiAvPjwvZz4KPGcgaWQ9InZpZXctYWdlbmRhIj48cGF0aCBkPSJNMjAgMTNIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xdi02YzAtLjU1LS40NS0xLTEtMXptMC0xMEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWNGMwLS41NS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9InZpZXctYXJyYXkiPjxwYXRoIGQ9Ik00IDE4aDNWNUg0djEzek0xOCA1djEzaDNWNWgtM3pNOCAxOGg5VjVIOHYxM3oiIC8+PC9nPgo8ZyBpZD0idmlldy1jYXJvdXNlbCI+PHBhdGggZD0iTTcgMTloMTBWNEg3djE1em0tNS0yaDRWNkgydjExek0xOCA2djExaDRWNmgtNHoiIC8+PC9nPgo8ZyBpZD0idmlldy1jb2x1bW4iPjxwYXRoIGQ9Ik0xMCAxOGg1VjVoLTV2MTN6bS02IDBoNVY1SDR2MTN6TTE2IDV2MTNoNVY1aC01eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWRheSI+PHBhdGggZD0iTTIgMjFoMTl2LTNIMnYzek0yMCA4SDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMVY5YzAtLjU1LS40NS0xLTEtMXpNMiAzdjNoMTlWM0gyeiIgLz48L2c+CjxnIGlkPSJ2aWV3LWhlYWRsaW5lIj48cGF0aCBkPSJNNCAxNWgxNnYtMkg0djJ6bTAgNGgxNnYtMkg0djJ6bTAtOGgxNlY5SDR2MnptMC02djJoMTZWNUg0eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWxpc3QiPjxwYXRoIGQ9Ik00IDE0aDR2LTRINHY0em0wIDVoNHYtNEg0djR6TTQgOWg0VjVINHY0em01IDVoMTJ2LTRIOXY0em0wIDVoMTJ2LTRIOXY0ek05IDV2NGgxMlY1SDl6IiAvPjwvZz4KPGcgaWQ9InZpZXctbW9kdWxlIj48cGF0aCBkPSJNNCAxMWg1VjVINHY2em0wIDdoNXYtNkg0djZ6bTYgMGg1di02aC01djZ6bTYgMGg1di02aC01djZ6bS02LTdoNVY1aC01djZ6bTYtNnY2aDVWNWgtNXoiIC8+PC9nPgo8ZyBpZD0idmlldy1xdWlsdCI+PHBhdGggZD0iTTEwIDE4aDV2LTZoLTV2NnptLTYgMGg1VjVINHYxM3ptMTIgMGg1di02aC01djZ6TTEwIDV2NmgxMVY1SDEweiIgLz48L2c+CjxnIGlkPSJ2aWV3LXN0cmVhbSI+PHBhdGggZD0iTTQgMThoMTd2LTZINHY2ek00IDV2NmgxN1Y1SDR6IiAvPjwvZz4KPGcgaWQ9InZpZXctd2VlayI+PHBhdGggZD0iTTYgNUgzYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bTE0IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXptLTcgMGgtM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xeiIgLz48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5Ij48cGF0aCBkPSJNMTIgNC41QzcgNC41IDIuNzMgNy42MSAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjVzOS4yNy0zLjExIDExLTcuNWMtMS43My00LjM5LTYtNy41LTExLTcuNXpNMTIgMTdjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLThjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiIgLz48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5LW9mZiI+PHBhdGggZD0iTTEyIDdjMi43NiAwIDUgMi4yNCA1IDUgMCAuNjUtLjEzIDEuMjYtLjM2IDEuODNsMi45MiAyLjkyYzEuNTEtMS4yNiAyLjctMi44OSAzLjQzLTQuNzUtMS43My00LjM5LTYtNy41LTExLTcuNS0xLjQgMC0yLjc0LjI1LTMuOTguN2wyLjE2IDIuMTZDMTAuNzQgNy4xMyAxMS4zNSA3IDEyIDd6TTIgNC4yN2wyLjI4IDIuMjguNDYuNDZDMy4wOCA4LjMgMS43OCAxMC4wMiAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjUgMS41NSAwIDMuMDMtLjMgNC4zOC0uODRsLjQyLjQyTDE5LjczIDIyIDIxIDIwLjczIDMuMjcgMyAyIDQuMjd6TTcuNTMgOS44bDEuNTUgMS41NWMtLjA1LjIxLS4wOC40My0uMDguNjUgMCAxLjY2IDEuMzQgMyAzIDMgLjIyIDAgLjQ0LS4wMy42NS0uMDhsMS41NSAxLjU1Yy0uNjcuMzMtMS40MS41My0yLjIuNTMtMi43NiAwLTUtMi4yNC01LTUgMC0uNzkuMi0xLjUzLjUzLTIuMnptNC4zMS0uNzhsMy4xNSAzLjE1LjAyLS4xNmMwLTEuNjYtMS4zNC0zLTMtM2wtLjE3LjAxeiIgLz48L2c+CjxnIGlkPSJ3YXJuaW5nIj48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJ3YXRjaC1sYXRlciI+PHBhdGggZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyem00LjIgMTQuMkwxMSAxM1Y3aDEuNXY1LjJsNC41IDIuNy0uOCAxLjN6IiAvPjwvZz4KPGcgaWQ9IndlZWtlbmQiPjxwYXRoIGQ9Ik0yMSAxMGMtMS4xIDAtMiAuOS0yIDJ2M0g1di0zYzAtMS4xLS45LTItMi0ycy0yIC45LTIgMnY1YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTVjMC0xLjEtLjktMi0yLTJ6bS0zLTVINmMtMS4xIDAtMiAuOS0yIDJ2Mi4xNWMxLjE2LjQxIDIgMS41MSAyIDIuODJWMTRoMTJ2LTIuMDNjMC0xLjMuODQtMi40IDItMi44MlY3YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ3b3JrIj48cGF0aCBkPSJNMjAgNmgtNFY0YzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2Mkg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS02IDBoLTRWNGg0djJ6IiAvPjwvZz4KPGcgaWQ9InlvdXR1YmUtc2VhcmNoZWQtZm9yIj48cGF0aCBkPSJNMTcuMDEgMTRoLS44bC0uMjctLjI3Yy45OC0xLjE0IDEuNTctMi42MSAxLjU3LTQuMjMgMC0zLjU5LTIuOTEtNi41LTYuNS02LjVzLTYuNSAzLTYuNSA2LjVIMmwzLjg0IDQgNC4xNi00SDYuNTFDNi41MSA3IDguNTMgNSAxMS4wMSA1czQuNSAyLjAxIDQuNSA0LjVjMCAyLjQ4LTIuMDIgNC41LTQuNSA0LjUtLjY1IDAtMS4yNi0uMTQtMS44Mi0uMzhMNy43MSAxNS4xYy45Ny41NyAyLjA5LjkgMy4zLjkgMS42MSAwIDMuMDgtLjU5IDQuMjItMS41N2wuMjcuMjd2Ljc5bDUuMDEgNC45OUwyMiAxOWwtNC45OS01eiIgLz48L2c+CjxnIGlkPSJ6b29tLWluIj48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHptMi41LTRoLTJ2Mkg5di0ySDdWOWgyVjdoMXYyaDJ2MXoiIC8+PC9nPgo8ZyBpZD0iem9vbS1vdXQiPjxwYXRoIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0ek03IDloNXYxSDd6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pY29uLWJ1dHRvbiI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CgogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIGhlaWdodDogNDBweDsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLyogQmVjYXVzZSBvZiBwb2x5bWVyLzI1NTgsIHRoaXMgc3R5bGUgaGFzIGxvd2VyIHNwZWNpZmljaXR5IHRoYW4gKiAqLwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b247CiAgICAgIH0KCiAgICAgIDpob3N0ICNpbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZC10ZXh0LCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBhdXRvOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpob3ZlcikgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uLWhvdmVyOwogICAgICB9CgogICAgICBpcm9uLWljb24gewogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxMDAlOwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8aXJvbi1pY29uIGlkPSJpY29uIiBzcmM9Iltbc3JjXV0iIGljb249IltbaWNvbl1dIiBhbHQkPSJbW2FsdF1dIj48L2lyb24taWNvbj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJydW4tY29sb3Itc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2NvbG9yLWNsYXNzPSdsaWdodC1ibHVlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncmVkJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdncmVlbiddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwdXJwbGUnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J3RlYWwnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwaW5rJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nb3JhbmdlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdicm93biddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdpbmRpZ28nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tOTAwKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbXVsdGktY2hlY2tib3giPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icnVuLWNvbG9yLXN0eWxlIj48L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dCBpZD0ibmFtZXMtcmVnZXgiIG5vLWxhYmVsLWZsb2F0IGxhYmVsPSJXcml0ZSBhIHJlZ2V4IHRvIGZpbHRlciBydW5zIiB2YWx1ZT0iW1tyZWdleF1dIiBvbi1iaW5kLXZhbHVlLWNoYW5nZWQ9Il9kZWJvdW5jZWRSZWdleENoYW5nZSI+PC9wYXBlci1pbnB1dD4KICAgIDxkaXYgaWQ9Im91dGVyLWNvbnRhaW5lciIgY2xhc3M9InNjcm9sbGJhciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbmFtZXNNYXRjaGluZ1JlZ2V4XV0iIG9uLWRvbS1jaGFuZ2U9InN5bmNocm9uaXplQ29sb3JzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYW1lLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciBjaGVja2JveC1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJjaGVja2JveCB2ZXJ0aWNhbC1hbGlnbi1jZW50ZXIiIGlkJD0iY2hlY2tib3gtW1tpdGVtXV0iIG5hbWU9IltbaXRlbV1dIiBjaGVja2VkJD0iW1tfaXNDaGVja2VkKGl0ZW0sIHNlbGVjdGlvblN0YXRlLiopXV0iIG9uLWNoYW5nZT0iX2NoZWNrYm94Q2hhbmdlIj48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciBpc29sYXRvci1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQiIGNsYXNzPSJpc29sYXRvciB2ZXJ0aWNhbC1hbGlnbi1jZW50ZXIiIG9uLXRhcD0iX2lzb2xhdGVOYW1lIiBuYW1lPSJbW2l0ZW1dXSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1sYWJlbC1jb250YWluZXIiPgogICAgICAgICAgICA8c3Bhbj5bW2l0ZW1dXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAjb3V0ZXItY29udGFpbmVyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5uYW1lLXJvdyB7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyAvKiBtYWtlcyB3cmFwcGluZyBvZiBoeXBlcnBhcmFtIHN0cmluZ3MgYmV0dGVyICovCiAgICAgIH0KICAgICAgLmljb24tY29udGFpbmVyIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmlzb2xhdG9yIHsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvci1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNnB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgfQogICAgICAuY2hlY2tib3gtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAuaXRlbS1sYWJlbC1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICB3aWR0aDogMHB4OyAvKiBoYWNrIHRvIGdldCB0aGUgZmxleC1ncm93IHRvIHdvcmsgcHJvcGVybHkgKi8KICAgICAgfQogICAgICAudG9vbHRpcC12YWx1ZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tY2VudGVyIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tdG9wIHsKICAgICAgICBhbGlnbi1zZWxmOiBzdGFydDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtd2JyLXN0cmluZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19wYXJ0c11dIiBhcz0icGFydCI+W1twYXJ0XV08d2JyPjwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcnVucy1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyB3aXRoLWJhY2tkcm9wIGlkPSJkYXRhLWxvY2F0aW9uLWRpYWxvZyI+CiAgICAgIDxoMj5EYXRhIExvY2F0aW9uPC9oMj4KICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbZGF0YUxvY2F0aW9uXV0iIC8+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxkaXYgaWQ9InRvcC10ZXh0Ij4KICAgICAgPGgzIGlkPSJ0b29sdGlwLWhlbHAiIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+UnVuczwvaDM+CiAgICA8L2Rpdj4KICAgIDx0Zi1tdWx0aS1jaGVja2JveCBpZD0ibXVsdGlDaGVja2JveCIgbmFtZXM9IltbcnVuc11dIiBzZWxlY3Rpb24tc3RhdGU9Int7cnVuU2VsZWN0aW9uU3RhdGV9fSIgb3V0LXNlbGVjdGVkPSJ7e3NlbGVjdGVkUnVuc319IiByZWdleD0ie3tyZWdleElucHV0fX0iIGNvbG9yaW5nPSJbW2NvbG9yaW5nXV0iPjwvdGYtbXVsdGktY2hlY2tib3g+CiAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgaWQ9InRvZ2dsZS1hbGwiIG9uLXRhcD0iX3RvZ2dsZUFsbCI+CiAgICAgIFRvZ2dsZSBBbGwgUnVucwogICAgPC9wYXBlci1idXR0b24+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZGF0YUxvY2F0aW9uXV0iPgogICAgICA8ZGl2IGlkPSJkYXRhLWxvY2F0aW9uIj4KICAgICAgICA8dGYtd2JyLXN0cmluZyB2YWx1ZT0iW1tfY2xpcHBlZERhdGFMb2NhdGlvbl1dIiAvPjx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvdWxkU2hvd0V4cGFuZERhdGFMb2NhdGlvbkJ1dHRvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKV1dIj48YSBocmVmPSIiIG9uLWNsaWNrPSJfb3BlbkRhdGFMb2NhdGlvbkRpYWxvZyI+4oCmPC9hPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgICB9CiAgICAgICN0b3AtdGV4dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICB9CiAgICAgIHRmLW11bHRpLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAjdG9vbHRpcC1oZWxwIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAjZGF0YS1sb2NhdGlvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiA1cHggMCAwIDA7CiAgICAgICAgbWF4LXdpZHRoOiAyODhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgLyogU1RZTEVTIEZPUiBUSEUgU1BJTk5FUiAqLwogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAvKgogICAgICAgKiBDb25zdGFudHM6CiAgICAgICAqICAgICAgQVJDU0laRSAgICAgPSAyNzAgZGVncmVlcyAoYW1vdW50IG9mIGNpcmNsZSB0aGUgYXJjIHRha2VzIHVwKQogICAgICAgKiAgICAgIEFSQ1RJTUUgICAgID0gMTMzM21zICh0aW1lIGl0IHRha2VzIHRvIGV4cGFuZCBhbmQgY29udHJhY3QgYXJjKQogICAgICAgKiAgICAgIEFSQ1NUQVJUUk9UID0gMjE2IGRlZ3JlZXMgKGhvdyBtdWNoIHRoZSBzdGFydCBsb2NhdGlvbiBvZiB0aGUgYXJjCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgcm90YXRlIGVhY2ggdGltZSwgMjE2IGdpdmVzIHVzIGEKICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgcG9pbnRlZCBzdGFyIHNoYXBlIChpdCdzIDM2MC81ICogMykuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSA3IHBvaW50ZWQgc3Rhciwgd2UgbWlnaHQgZG8KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MC83ICogMyA9IDE1NC4yODYpCiAgICAgICAqICAgICAgU0hSSU5LX1RJTUUgPSA0MDBtcwogICAgICAgKi8KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKCiAgICAgICAgLyogMzYwICogQVJDVElNRSAvIChBUkNTVEFSVFJPVCArICgzNjAtQVJDU0laRSkpICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbjogMTU2OG1zOwoKICAgICAgICAvKiBBUkNUSU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWV4cGFuZC1jb250cmFjdC1kdXJhdGlvbjogMTMzM21zOwoKICAgICAgICAvKiA0ICogQVJDVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uOiA1MzMybXM7CgogICAgICAgIC8qIFNIUklOS19USU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uOiA0MDBtczsKICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKCiAgICAgICAgLyogVGhlIHNwaW5uZXIgZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudHMgdGhhdCB3b3VsZCBoYXZlIHRvIGJlCiAgICAgICAgICogZmxpcHBlZCBpZiB0aGUgZGlyZWN0aW9uIGNoYW5nZXMuIEFsd2F5cyB1c2UgbHRyIHNvIHRoYXQgdGhlCiAgICAgICAgICogc3R5bGUgd29ya3Mgb3V0IGNvcnJlY3RseSBpbiBib3RoIGNhc2VzLiAqLwogICAgICAgIGRpcmVjdGlvbjogbHRyOwogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5hY3RpdmUgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjb250YWluZXItcm90YXRlIHsKICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIH0KICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTEgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTEtY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTUwMCkpOwogICAgICB9CgogICAgICAubGF5ZXItMiB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItMi1jb2xvciwgdmFyKC0tZ29vZ2xlLXJlZC01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTMgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTMtY29sb3IsIHZhcigtLWdvb2dsZS15ZWxsb3ctNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci00IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci00LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJTVBPUlRBTlQgTk9URSBBQk9VVCBDU1MgQU5JTUFUSU9OIFBST1BFUlRJRVMgKGtlYW51bGVlKToKICAgICAgICoKICAgICAgICogaU9TIFNhZmFyaSAodGVzdGVkIG9uIGlPUyA4LjEpIGRvZXMgbm90IGhhbmRsZSBhbmltYXRpb24tZGVsYXkgdmVyeSB3ZWxsIC0gaXQgZG9lc24ndAogICAgICAgKiBndWFyYW50ZWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RhcnQgX2V4YWN0bHlfIGFmdGVyIHRoYXQgdmFsdWUuIFNvIHdlIGF2b2lkIHVzaW5nCiAgICAgICAqIGFuaW1hdGlvbi1kZWxheSBhbmQgaW5zdGVhZCBzZXQgY3VzdG9tIGtleWZyYW1lcyBmb3IgZWFjaCBjb2xvciAoYXMgbGF5ZXItMnVuZGFudCBhcyBpdAogICAgICAgKiBzZWVtcykuCiAgICAgICAqLwogICAgICAuYWN0aXZlIC5zcGlubmVyLWxheWVyIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uKTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0xIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTEtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMS1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0yIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMi1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0zIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMy1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci00IHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTQtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItNC1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZykgfSAvKiAwLjUgKiBBUkNTSVpFICovCiAgICAgICAgMjUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovCiAgICAgICAgMzcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDU0MGRlZykgfSAvKiAyICAgKiBBUkNTSVpFICovCiAgICAgICAgNjIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovCiAgICAgICAgNzUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDk0NWRlZykgfSAvKiAzLjUgKiBBUkNTSVpFICovCiAgICAgICAgdG8gICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqLwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqLwogICAgICAgIDI1JSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSB9IC8qIDEgICAqIEFSQ1NJWkUgKi8KICAgICAgICAzNy41JSB7IHRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqLwogICAgICAgIDYyLjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKSB9IC8qIDIuNSAqIEFSQ1NJWkUgKi8KICAgICAgICA3NSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqLwogICAgICAgIHRvICAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZykgfSAvKiA0ICAgKiBBUkNTSVpFICovCiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0xLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDg5JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA4OSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDEgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMi1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAxNSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTMtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzYlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci00LWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDY1JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA2NSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhdGNoIHRoZSBnYXAgdGhhdCBhcHBlYXIgYmV0d2VlbiB0aGUgdHdvIGFkamFjZW50IGRpdi5jaXJjbGUtY2xpcHBlciB3aGlsZSB0aGUKICAgICAgICogc3Bpbm5lciBpcyByb3RhdGluZyAoYXBwZWFycyBvbiBDaHJvbWUgNTAsIFNhZmFyaSA5LjEuMSwgYW5kIEVkZ2UpLgogICAgICAgKi8KICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyIHsKICAgICAgICBsZWZ0OiA0NSU7CiAgICAgICAgd2lkdGg6IDEwJTsKICAgICAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsKICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyLAogICAgICAuY2lyY2xlLWNsaXBwZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm9yZGVyLXdpZHRoOiB2YXIoLS1wYXBlci1zcGlubmVyLXN0cm9rZS13aWR0aCwgM3B4KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlcjo6YWZ0ZXIgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMjAwJTsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5sZWZ0OjphZnRlciB7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIGxlZnQ6IC0xMDAlOwogICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLmdhcC1wYXRjaDo6YWZ0ZXIsCiAgICAgIC5hY3RpdmUgLmNpcmNsZS1jbGlwcGVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb24pOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIubGVmdDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGxlZnQtc3BpbjsKICAgICAgICBhbmltYXRpb24tbmFtZTogbGVmdC1zcGluOwogICAgICB9CgogICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsZWZ0LXNwaW4gewogICAgICAgIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB9CiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxlZnQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyByaWdodC1zcGluIHsKICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICAgIDUwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcmlnaHQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5jb29sZG93biB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZSwgZmFkZS1vdXQgdmFyKC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbikgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlLCBmYWRlLW91dCB2YXIoLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uKSBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItbGl0ZSI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItc3Bpbm5lci1zdHlsZXMiPjwvc3R5bGU+CgogICAgPGRpdiBpZD0ic3Bpbm5lckNvbnRhaW5lciIgY2xhc3MtbmFtZT0iW1tfX2NvbXB1dGVDb250YWluZXJDbGFzc2VzKGFjdGl2ZSwgX19jb29saW5nRG93bildXSIgb24tYW5pbWF0aW9uZW5kPSJfX3Jlc2V0IiBvbi13ZWJraXQtYW5pbWF0aW9uLWVuZD0iX19yZXNldCI+CiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIGxlZnQiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIHJpZ2h0Ij48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxzdHlsZT4KLnBsb3R0YWJsZS1jb2xvcnMtMCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzUyNzljNzsgLyogSU5ESUdPICovCn0KCi5wbG90dGFibGUtY29sb3JzLTEgewogIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTMgewogIGJhY2tncm91bmQtY29sb3I6ICNmYWQ0MTk7IC8qIEJSSUdIVF9TVU4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy01IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy02IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGIyZTY1OyAvKiBDRVJJU0VfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTcgewogIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA2Y2NjYzsgLyogUk9CSU5TX0VHR19CTFVFICovCn0KCi8qKgogKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuCiAqLwoucGxvdHRhYmxlIHsKICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovCiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAvKioKICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTCiAgICogKGlubGluZSBvciB0aHJvdWdoIGEgc3R5bGVzaGVldCksIG9yIHVzaW5nIHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlCiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS4KICAgKgogICAqIFBvc3QgMy4wIHRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIGEgbm9ybWFsIGRpdiBhbmQgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgZGltZW5zaW9ucyBpcwogICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgIjEwMCUtYnktZGVmYXVsdCIgYmVoYXZpb3IsIHdlIGFwcGx5IHdpZHRoL2hlaWdodCAxMDAlLgogICAqLwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLgogKi8KLnBsb3R0YWJsZSAuY29tcG9uZW50IHsKICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovCiAgcG9zaXRpb246IGFic29sdXRlOwp9CgoucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lciwKLnBsb3R0YWJsZSAuY29udGVudCwKLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzCiAqLwoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIHsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICAvKioKICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuCiAgICovCiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7Cn0KCi5wbG90dGFibGUgdGV4dCB7CiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKfQoKLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuYmFyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQgewogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLm9mZi1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLXBsb3QgLm9mZi1iYXItbGFiZWwgewogIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqLwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgoucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsZXR0ZXItc3BhY2luZzogMXB4OwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUuYmFzZWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUgewogIGZpbGw6IHdoaXRlOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHN0cm9rZTogI0NDQzsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUgewogIHN0cm9rZTogIzk5OTsKfQoKLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUgewogIHN0cm9rZTogIzNDM0MzQzsgLyogaGFja2hhY2s6IGdyaWRsaW5lcyBzaG91bGQgYmUgc29saWQ7IHNlZSAjODIwICovCiAgb3BhY2l0eTogMC4yNTsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEgewogIGZpbGw6IGJsYWNrOwogIGZpbGwtb3BhY2l0eTogMC4wMzsKICBzdHJva2U6ICNDQ0M7Cn0KLyogRHJhZ0JveExheWVyICovCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIgewogIGN1cnNvcjogZXctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdGwgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRyIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1ibCB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYnIgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHsKICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovCiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgY3Vyc29yOiBncmFiOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUgewogIGN1cnNvcjogLW1vei1ncmFiYmluZzsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgY3Vyc29yOiBncmFiYmluZzsKfQovKiAvRHJhZ0JveExheWVyICovCgoucGxvdHRhYmxlIC5ndWlkZS1saW5lLWxheWVyIGxpbmUuZ3VpZGUtbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLmhvcml6b250YWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3ggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC53YXRlcmZhbGwtcGxvdCBsaW5lLmNvbm5lY3RvciB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUgewogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KPC9zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwbG90dGFibGUtc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KLnBsb3R0YWJsZS1jb2xvcnMtMCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzUyNzljNzsgLyogSU5ESUdPICovCn0KCi5wbG90dGFibGUtY29sb3JzLTEgewogIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTMgewogIGJhY2tncm91bmQtY29sb3I6ICNmYWQ0MTk7IC8qIEJSSUdIVF9TVU4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy01IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy02IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGIyZTY1OyAvKiBDRVJJU0VfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTcgewogIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA2Y2NjYzsgLyogUk9CSU5TX0VHR19CTFVFICovCn0KCi8qKgogKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuCiAqLwoucGxvdHRhYmxlIHsKICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovCiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAvKioKICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTCiAgICogKGlubGluZSBvciB0aHJvdWdoIGEgc3R5bGVzaGVldCksIG9yIHVzaW5nIHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlCiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS4KICAgKgogICAqIFBvc3QgMy4wIHRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIGEgbm9ybWFsIGRpdiBhbmQgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgZGltZW5zaW9ucyBpcwogICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgIjEwMCUtYnktZGVmYXVsdCIgYmVoYXZpb3IsIHdlIGFwcGx5IHdpZHRoL2hlaWdodCAxMDAlLgogICAqLwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLgogKi8KLnBsb3R0YWJsZSAuY29tcG9uZW50IHsKICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovCiAgcG9zaXRpb246IGFic29sdXRlOwp9CgoucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lciwKLnBsb3R0YWJsZSAuY29udGVudCwKLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzCiAqLwoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIHsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICAvKioKICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuCiAgICovCiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7Cn0KCi5wbG90dGFibGUgdGV4dCB7CiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKfQoKLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuYmFyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQgewogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLm9mZi1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLXBsb3QgLm9mZi1iYXItbGFiZWwgewogIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqLwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgoucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsZXR0ZXItc3BhY2luZzogMXB4OwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUuYmFzZWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUgewogIGZpbGw6IHdoaXRlOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHN0cm9rZTogI0NDQzsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUgewogIHN0cm9rZTogIzk5OTsKfQoKLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUgewogIHN0cm9rZTogIzNDM0MzQzsgLyogaGFja2hhY2s6IGdyaWRsaW5lcyBzaG91bGQgYmUgc29saWQ7IHNlZSAjODIwICovCiAgb3BhY2l0eTogMC4yNTsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEgewogIGZpbGw6IGJsYWNrOwogIGZpbGwtb3BhY2l0eTogMC4wMzsKICBzdHJva2U6ICNDQ0M7Cn0KLyogRHJhZ0JveExheWVyICovCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIgewogIGN1cnNvcjogZXctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdGwgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRyIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1ibCB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYnIgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHsKICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovCiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgY3Vyc29yOiBncmFiOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUgewogIGN1cnNvcjogLW1vei1ncmFiYmluZzsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgY3Vyc29yOiBncmFiYmluZzsKfQovKiAvRHJhZ0JveExheWVyICovCgoucGxvdHRhYmxlIC5ndWlkZS1saW5lLWxheWVyIGxpbmUuZ3VpZGUtbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLmhvcml6b250YWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3ggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC53YXRlcmZhbGwtcGxvdCBsaW5lLmNvbm5lY3RvciB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUgewogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotY2hhcnQtdG9vbHRpcCI+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotcGFuLXpvb20tc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmhlbHAgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAxczsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDFzOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmYWRlLW91dDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDMwLCAzMCwgMzAsIDAuNik7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLmhlbHAgPiBzcGFuIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIH0KCiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1saW5lLWNoYXJ0MiI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0iY2hhcnRkaXYiPjwvZGl2PgogICAgPHZ6LWNoYXJ0LXRvb2x0aXAgaWQ9InRvb2x0aXAiIHBvc2l0aW9uPSJbW3Rvb2x0aXBQb3NpdGlvbl1dIiBjb250ZW50LWNvbXBvbmVudC1uYW1lPSJ2ei1saW5lLWNoYXJ0LXRvb2x0aXAiPjwvdnotY2hhcnQtdG9vbHRpcD4KICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idnotcGFuLXpvb20tc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICAgIGRpdiB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IC5tYWluIHsKICAgICAgICBjdXJzb3I6IGNyb3NzaGFpcjsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhbmtleSkgI2NoYXJ0ZGl2IDpub3QoLmRyYWctem9vbWluZykgLm1haW4gewogICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogICAgICAgIGN1cnNvcjogZ3JhYjsKICAgICAgfQoKICAgICAgOmhvc3QoLm1vdXNlZG93bikgI2NoYXJ0ZGl2IC5wYW5uaW5nIC5tYWluIHsKICAgICAgICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgICAgICAgY3Vyc29yOiBncmFiYmluZzsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IGxpbmUuZ3VpZGUtbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5OwogICAgICAgIHN0cm9rZS13aWR0aDogMS41cHg7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2OmhvdmVyIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idnotbGluZS1jaGFydC10b29sdGlwIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgPHRhYmxlPgogICAgICAgIDx0aGVhZD48L3RoZWFkPgogICAgICAgIDx0Ym9keT48L3Rib2R5PgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIHRoZWFkIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIHRib2R5IHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIxcHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgdGQgewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICB9CgogICAgICAuc3dhdGNoIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICB9CgogICAgICAuY2xvc2VzdCAuc3dhdGNoIHsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggI2ZmZjsKICAgICAgfQoKICAgICAgdGggewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5kaXN0YW50IHRkOm5vdCguc3dhdGNoKSB7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjaGFydC1hbmQtc3Bpbm5lci1jb250YWluZXIiPgogICAgICA8dnotbGluZS1jaGFydDIgaWQ9ImNoYXJ0IiBkYXRhLWxvYWRpbmckPSJbW2RhdGFMb2FkaW5nXV0iIGNvbG9yLXNjYWxlPSJbW2NvbG9yU2NhbGVdXSIgZGVmYXVsdC14LXJhbmdlPSJbW2RlZmF1bHRYUmFuZ2VdXSIgZGVmYXVsdC15LXJhbmdlPSJbW2RlZmF1bHRZUmFuZ2VdXSIgZmlsbC1hcmVhPSJbW2ZpbGxBcmVhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBvbi1jaGFydC1hdHRhY2hlZD0iX29uQ2hhcnRBdHRhY2hlZCIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiBzeW1ib2wtZnVuY3Rpb249Iltbc3ltYm9sRnVuY3Rpb25dXSIgdG9vbHRpcC1jb2x1bW5zPSJbW3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1t4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW3lWYWx1ZUFjY2Vzc29yXV0iPjwvdnotbGluZS1jaGFydDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkYXRhTG9hZGluZ11dIj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdChbX21heWJlLXJlbmRlcmVkLWluLWJhZC1zdGF0ZV0pIHZ6LWxpbmUtY2hhcnQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2NoYXJ0LWFuZC1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjbG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDJbZGF0YS1sb2FkaW5nXSB7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSI+CgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcy1zY3JvbGxlZDpub3QoOmZpcnN0LWNoaWxkKSk6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRpdmlkZXItY29sb3IpOwogICAgICB9CgogICAgICA6aG9zdCguY2FuLXNjcm9sbDpub3QoLnNjcm9sbGVkLXRvLWJvdHRvbSk6bm90KDpsYXN0LWNoaWxkKSk6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvcik7CiAgICAgIH0KCiAgICAgIC5zY3JvbGxhYmxlIHsKICAgICAgICBwYWRkaW5nOiAwIDI0cHg7CgogICAgICAgIEBhcHBseSAtLWxheW91dC1zY3JvbGw7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXNjcm9sbGFibGU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ic2Nyb2xsYWJsZSIgY2xhc3M9InNjcm9sbGFibGUiIG9uLXNjcm9sbD0idXBkYXRlU2Nyb2xsU3RhdGUiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLW1hcmtkb3duLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9Im1hcmtkb3duIiBpbm5lci1oLXQtbS1sPSJbW2h0bWxdXSI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgICAqIFJlZHVjZSB0b3Btb3N0IGFuZCBib3R0b21tb3N0IG1hcmdpbnMgZnJvbSAxNnB4IHRvIDAuM2VtIChyZW5kZXJzCiAgICAgICAqIGF0IGFib3V0IDQuOHB4KSB0byBrZWVwIHRoZSBsYXlvdXQgY29tcGFjdC4gVGhpcyBpbXByb3ZlcyB0aGUKICAgICAgICogYXBwZWFyYW5jZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGxpbmUgb2YgdGV4dDsgc3RhbmRhcmQgTWFya2Rvd24KICAgICAgICogcmVuZGVyZXJzIHdpbGwgc3RpbGwgaW5jbHVkZSBhIGA8cD5gIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEJ5IHRhcmdldGluZyBvbmx5IHRoZSB0b3AtbGV2ZWwsIGV4dHJlbWFsIGVsZW1lbnRzLCB3ZSBwcmVzZXJ2ZSBhbnkKICAgICAgICogYWN0dWFsIHBhcmFncmFwaCBicmVha3MgYW5kIG9ubHkgY2hhbmdlIHRoZSBwYWRkaW5nIGFnYWluc3QgdGhlCiAgICAgICAqIGNvbXBvbmVudCBlZGdlcy4KICAgICAgICovCiAgICAgICNtYXJrZG93biA+IHA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDAuM2VtOwogICAgICB9CiAgICAgICNtYXJrZG93biA+IHA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC4zZW07CiAgICAgIH0KCiAgICAgIC8qIFBsZWFzYW50IHN0eWxlcyBmb3IgTWFya2Rvd24gdGFibGVzLiAqLwogICAgICAjbWFya2Rvd24gdGFibGUgewogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRoIHsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0aCwKICAgICAgI21hcmtkb3duIHRhYmxlIHRkIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTNweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGZlMmU1OwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0ciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2M2Y2JkMTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIGZpZ2NhcHRpb24gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAvKiogSG9yaXpvbnRhbCBsaW5lIG9mIGxhYmVscy4gKi8KICAgICAgLmhlYWRpbmctcm93IHsKICAgICAgICBtYXJnaW4tdG9wOiAtNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC8qKiBQaWVjZSBvZiB0ZXh0IGluIHRoZSBmaWd1cmUgY2FwdGlvbi4gKi8KICAgICAgLmhlYWRpbmctbGFiZWwgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQoKICAgICAgLyoqIE1ha2VzIGxhYmVsIHNob3cgb24gdGhlIHJpZ2h0LiAqLwogICAgICAuaGVhZGluZy1yaWdodCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZmlnY2FwdGlvbiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19uYW1lTGFiZWxdXSI+CiAgICAgICAgICAgIDxkaXYgaXRlbXByb3A9Im5hbWUiIGNsYXNzPSJoZWFkaW5nLWxhYmVsIG5hbWUiPgogICAgICAgICAgICAgIFtbX25hbWVMYWJlbF1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tydW5dXSI+CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgPHNwYW4gaXRlbXByb3A9InJ1biIgaWQ9ImhlYWRpbmctcnVuIiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0IHJ1biI+W1tydW5dXTwvc3Bhbj4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0xhYmVsXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgICB0YWc6IDxzcGFuIGl0ZW1wcm9wPSJ0YWciPltbX3RhZ0xhYmVsXV08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZmlnY2FwdGlvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Rlc2NyaXB0aW9uXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvIiBvbi10YXA9Il90b2dnbGVEZXNjcmlwdGlvbkRpYWxvZyIgdGl0bGU9IlNob3cgc3VtbWFyeSBkZXNjcmlwdGlvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZyBpZD0iZGVzY3JpcHRpb25EaWFsb2ciIG5vLW92ZXJsYXAgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgIDxwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbZGVzY3JpcHRpb25dXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY29udGVudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgcGFkZGluZzogMXB4IDRweCAycHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICBwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSB7CiAgICAgICAgbWF4LXdpZHRoOiA2NDBweDsKICAgICAgfQogICAgICAjaGVhZGluZy1ydW4gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRmLWNhcmQtaGVhZGluZy1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBjb2xvcjogdmFyKC0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kb3dubG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InJ1biB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfcnVufX0iPgogICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3J1bnNdXSI+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ydW5dXSI+CiAgICAgIDxhIGRvd25sb2FkPSJbW19jc3ZOYW1lKHRhZywgX3J1bildXSIgaHJlZj0iW1tfY3N2VXJsKHRhZywgX3J1biwgdXJsRm4pXV0iPkNTVjwvYT48YSBkb3dubG9hZD0iW1tfanNvbk5hbWUodGFnLCBfcnVuKV1dIiBocmVmPSJbW19qc29uVXJsKHRhZywgX3J1biwgdXJsRm4pXV0iPkpTT048L2E+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgfQogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgYSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMCAwLjJlbTsKICAgICAgfQogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgZm9udC1zaXplOiAyMnB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNjYWxhci1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIGNvbG9yLXNjYWxlPSJbW19nZXRDb2xvclNjYWxlKGNvbG9yU2NhbGUpXV0iIGRhdGEtc2VyaWVzPSJbW19nZXREYXRhU2VyaWVzKGRhdGFUb0xvYWQuKildXSIgZGF0YS10by1sb2FkPSJbW2RhdGFUb0xvYWRdXSIgZ2V0LWRhdGEtbG9hZC1uYW1lPSJbW19nZXREYXRhTG9hZE5hbWVdXSIgZ2V0LWRhdGEtbG9hZC11cmw9IltbZ2V0RGF0YUxvYWRVcmxdXSIgcmVxdWVzdC1kYXRhPSJbW3JlcXVlc3REYXRhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2xvYWREYXRhQ2FsbGJhY2tdXSIgbG9hZC1rZXk9IltbdGFnXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iIHRhZy1tZXRhZGF0YT0iW1t0YWdNZXRhZGF0YV1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249ImF1dG8iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW3hUeXBlXV0iPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgaWNvbj0ibGluZS13ZWlnaHQiIG9uLXRhcD0iX3RvZ2dsZUxvZ1NjYWxlIiB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJGaXQgZG9tYWluIHRvIGRhdGEiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8cGFwZXItbWVudS1idXR0b24gb24tcGFwZXItZHJvcGRvd24tb3Blbj0iX3VwZGF0ZURvd25sb2FkTGluayI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIiIHNsb3Q9ImRyb3Bkb3duLXRyaWdnZXIiIGljb249ImZpbGUtZG93bmxvYWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtPgogICAgICAgICAgICAgIDxhIGlkPSJzdmdMaW5rIiBkb3dubG9hZD0iW1t0YWddXS5zdmciPgogICAgICAgICAgICAgICAgRG93bmxvYWQgQ3VycmVudCBDaGFydCBhcyBTVkcKICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLW1lbnUtYnV0dG9uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8dGYtZG93bmxvYWRlciBydW5zPSJbW19ydW5zRnJvbURhdGEoZGF0YVRvTG9hZCldXSIgdGFnPSJbW3RhZ11dIiB1cmwtZm49IltbX2Rvd25sb2FkVXJsRm5dXSI+PC90Zi1kb3dubG9hZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXJnaW46IDVweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgIH0KCiAgICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICB9CgogICAgICAjYnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyBhIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1tZW51LWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQogICAgICBwYXBlci1pdGVtIGEgewogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItcHJvZ3Jlc3MiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pLCBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciwKICAgICAgLyogdGhlIHN0cmlwZSBmb3IgdGhlIGluZGV0ZXJtaW5hdGUgYW5pbWF0aW9uKi8KICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBoZWlnaHQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWhlaWdodCwgNHB4KTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgI3NlY29uZGFyeVByb2dyZXNzLAogICAgICAuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciwKICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXItY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTMwMCkpOwogICAgICB9CgogICAgICA6aG9zdCgudHJhbnNpdGluZykgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgOmhvc3QoLnRyYW5zaXRpbmcpICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTsKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm07CgogICAgICAgIC8qIER1cmF0aW9uICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWR1cmF0aW9uLCAwLjA4cyk7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMC4wOHMpOwoKICAgICAgICAvKiBUaW1pbmcgZnVuY3Rpb24gKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiwgZWFzZSk7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uLCBlYXNlKTsKCiAgICAgICAgLyogRGVsYXkgKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZGVsYXksIDBzKTsKICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWRlbGF5LCAwcyk7CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCk7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tMTAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNwcmltYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktNTAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS0zMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZGlzYWJsZWRdKSkgI3ByaW1hcnlQcm9ncmVzcy5pbmRldGVybWluYXRlIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGluZGV0ZXJtaW5hdGUtYmFyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLWJhciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtkaXNhYmxlZF0pKSAjcHJpbWFyeVByb2dyZXNzLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKCiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb246IGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtYmFyIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgICAgNzUlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguMjgsLjYyLC4zNywuOTEpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMCkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgIH0KICAgICAgICAzMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjQyLDAsLjYsLjgpOwogICAgICAgIH0KICAgICAgICA5MCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtYmFyIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgICA3NSUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjI4LC42MiwuMzcsLjkxKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgwKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICB9CiAgICAgICAgMzAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjQyLDAsLjYsLjgpOwogICAgICAgIH0KICAgICAgICA5MCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0icHJvZ3Jlc3NDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJzZWNvbmRhcnlQcm9ncmVzcyIgaGlkZGVuJD0iW1tfaGlkZVNlY29uZGFyeVByb2dyZXNzKHNlY29uZGFyeVJhdGlvKV1dIj48L2Rpdj4KICAgICAgPGRpdiBpZD0icHJpbWFyeVByb2dyZXNzIj48L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1zbGlkZXIiPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtMzAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1hY3RpdmUtY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQ6IHZhcigtLXBhcGVyLXNsaWRlci1oZWlnaHQsIDJweCk7CiAgICAgIH0KCiAgICAgIC8qIGZvY3VzIHNob3dzIHRoZSByaXBwbGUgKi8KICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5PVEUoa2VhbnVsZWUpOiBUaG91Z2ggOmhvc3QtY29udGV4dCBpcyBub3QgdW5pdmVyc2FsbHkgc3VwcG9ydGVkLCBzb21lIHBhZ2VzCiAgICAgICAqIHN0aWxsIHJlbHkgb24gcGFwZXItc2xpZGVyIGJlaW5nIGZsaXBwZWQgd2hlbiBkaXI9InJ0bCIgaXMgc2V0IG9uIGJvZHkuIEZvciBmdWxsCiAgICAgICAqIGNvbXBhdGFiaWxpdHksIGRpcj0icnRsIiBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0IG9uIHBhcGVyLXNsaWRlci4KICAgICAgICovCiAgICAgIDpkaXIocnRsKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOT1RFKGtlYW51bGVlKTogVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBydWxlIGFib3ZlIGJlY2F1c2UgOmhvc3QtY29udGV4dCBtYXkKICAgICAgICogbm90IGJlIHJlY29nbml6ZWQuCiAgICAgICAqLwogICAgICA6aG9zdChbZGlyPSJydGwiXSkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTk9URShrZWFudWxlZSk6IE5lZWRlZCB0byBvdmVycmlkZSB0aGUgOmhvc3QtY29udGV4dCBydWxlICh3aGVyZSBzdXBwb3J0ZWQpCiAgICAgICAqIHRvIHN1cHBvcnQgTFRSIHNsaWRlcnMgaW4gUlRMIHBhZ2VzLgogICAgICAgKi8KICAgICAgOmhvc3QoW2Rpcj0ibHRyIl0pICNzbGlkZXJDb250YWluZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICAgIH0KCiAgICAgICNzbGlkZXJDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKDE1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICAgIG1hcmdpbi1yaWdodDogY2FsYygxNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgfQoKICAgICAgI3NsaWRlckNvbnRhaW5lcjpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogMDsKICAgICAgfQoKICAgICAgI3NsaWRlckNvbnRhaW5lci5lZGl0YWJsZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTJweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICB9CgogICAgICAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAucmluZyA+IC5iYXItY29udGFpbmVyIHsKICAgICAgICBsZWZ0OiBjYWxjKDVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE4cyBlYXNlOwogICAgICB9CgogICAgICAucmluZy5leHBhbmQuZHJhZ2dpbmcgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnJpbmcuZXhwYW5kOm5vdCgucGluKSA+IC5iYXItY29udGFpbmVyIHsKICAgICAgICBsZWZ0OiBjYWxjKDhweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgIH0KCiAgICAgICNzbGlkZXJCYXIgewogICAgICAgIHBhZGRpbmc6IDE1cHggMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItYmFyLWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXItY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1jb250YWluZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbWFya2VycyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogY2FsYygxNHB4ICsgdmFyKC0tcGFwZXItc2xpZGVyLWhlaWdodCwycHgpLzIpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAtMXB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbWFya2VyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQogICAgICAuc2xpZGVyLW1hcmtlcnM6OmFmdGVyLAogICAgICAuc2xpZGVyLW1hcmtlcjo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4OwogICAgICAgIHdpZHRoOiAycHg7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKC0xNXB4IC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgICB3aWR0aDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgICAgfQoKICAgICAgLnRyYW5zaXRpbmcgPiAuc2xpZGVyLWtub2IgewogICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4wOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2IuZHJhZ2dpbmcgewogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIC5zbmFwcyA+IC5zbGlkZXIta25vYi5kcmFnZ2luZyB7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4wOHMgZWFzZTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4wOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBtYXJnaW46IDEwcHg7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMjBweCk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CgogICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybSwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyOwogICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICB9CgogICAgICAuZXhwYW5kOm5vdCgucGluKSA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuNSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgICB9CgogICAgICAucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItcGluLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgfQoKICAgICAgLnBpbiA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICBtYXJnaW4tbGVmdDogLTEzcHg7CiAgICAgICAgd2lkdGg6IDI2cHg7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJSA1MCUgNTAlIDA7CgogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlLAogICAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAuMThzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuMThzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlOwogICAgICB9CgogICAgICAucGluLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgfQoKICAgICAgLnBpbi5leHBhbmQgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDEpIHRyYW5zbGF0ZSgxN3B4LCAtMTdweCk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgxKSB0cmFuc2xhdGUoMTdweCwgLTE3cHgpOwogICAgICB9CgogICAgICAucGluID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgY29udGVudDogYXR0cih2YWx1ZSk7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xNnB4OwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1mb250LWNvbG9yLCAjZmZmKTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CgogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgIH0KCiAgICAgIC5waW4uZXhwYW5kID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZSgwLCAtMTdweCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGUoMCwgLTE3cHgpOwogICAgICB9CgogICAgICAvKiBwYXBlci1pbnB1dCAqLwogICAgICAuc2xpZGVyLWlucHV0IHsKICAgICAgICB3aWR0aDogNTBweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICBAYXBwbHkgLS1wYXBlci1zbGlkZXItaW5wdXQtY29udGFpbmVyLWlucHV0OwogICAgICAgIH07CiAgICAgICAgQGFwcGx5IC0tcGFwZXItc2xpZGVyLWlucHV0OwogICAgICB9CgogICAgICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwogICAgICAjc2xpZGVyQ29udGFpbmVyLmRpc2FibGVkIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmRpc2FibGVkID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLjc1LCAwLjc1LCAxKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlM2QoMC43NSwgMC43NSwgMSk7CiAgICAgIH0KCiAgICAgIC5kaXNhYmxlZC5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgfQoKICAgICAgcGFwZXItcmlwcGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNsaWRlckNvbnRhaW5lciIgY2xhc3MkPSJbW19nZXRDbGFzc05hbWVzKGRpc2FibGVkLCBwaW4sIHNuYXBzLCBpbW1lZGlhdGVWYWx1ZSwgbWluLCBleHBhbmQsIGRyYWdnaW5nLCB0cmFuc2l0aW5nLCBlZGl0YWJsZSldXSI+CiAgICAgIDxkaXYgY2xhc3M9ImJhci1jb250YWluZXIiPgogICAgICAgIDxwYXBlci1wcm9ncmVzcyBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaWQ9InNsaWRlckJhciIgYXJpYS1oaWRkZW49InRydWUiIG1pbj0iW1ttaW5dXSIgbWF4PSJbW21heF1dIiBzdGVwPSJbW3N0ZXBdXSIgdmFsdWU9IltbaW1tZWRpYXRlVmFsdWVdXSIgc2Vjb25kYXJ5LXByb2dyZXNzPSJbW3NlY29uZGFyeVByb2dyZXNzXV0iIG9uLWRvd249Il9iYXJkb3duIiBvbi11cD0iX3Jlc2V0S25vYiIgb24tdHJhY2s9Il9iYXJ0cmFjayIgb24tdGFwPSJfYmFyY2xpY2siPgogICAgICAgIDwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgIDwvZGl2PgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3NuYXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1tYXJrZXJzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbWFya2Vyc11dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLW1hcmtlciI+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPGRpdiBpZD0ic2xpZGVyS25vYiIgY2xhc3M9InNsaWRlci1rbm9iIiBvbi1kb3duPSJfa25vYmRvd24iIG9uLXVwPSJfcmVzZXRLbm9iIiBvbi10cmFjaz0iX29uVHJhY2siIG9uLXRyYW5zaXRpb25lbmQ9Il9rbm9iVHJhbnNpdGlvbkVuZCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXIta25vYi1pbm5lciIgdmFsdWUkPSJbW2ltbWVkaWF0ZVZhbHVlXV0iPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlZGl0YWJsZV1dIj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgdHlwZT0ibnVtYmVyIiBzdGVwPSJbW3N0ZXBdXSIgbWluPSJbW21pbl1dIiBtYXg9IltbbWF4XV0iIGNsYXNzPSJzbGlkZXItaW5wdXQiIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiB2YWx1ZT0iW1tpbW1lZGlhdGVWYWx1ZV1dIiBvbi1jaGFuZ2U9Il9jaGFuZ2VWYWx1ZSIgb24ta2V5ZG93bj0iX2lucHV0S2V5RG93biIgbm8tbGFiZWwtZmxvYXQ+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNtb290aGluZy1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPGgzIGNsYXNzPSJ0aXRsZSI+U21vb3RoaW5nPC9oMz4KICAgIDxkaXYgY2xhc3M9InNtb290aGluZy1ibG9jayI+CiAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InNsaWRlciIgaW1tZWRpYXRlLXZhbHVlPSJ7e19pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcn19IiBtYXg9IltbbWF4XV0iIG1pbj0iW1ttaW5dXSIgcGluIHN0ZXA9Iltbc3RlcF1dIiB0eXBlPSJudW1iZXIiIHZhbHVlPSJ7e3dlaWdodH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgbGFiZWw9IndlaWdodCIgbm8tbGFiZWwtZmxvYXQgdmFsdWU9Int7X2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dH19IiB0eXBlPSJudW1iZXIiIHN0ZXA9Iltbc3RlcF1dIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAudGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLnNtb290aGluZy1ibG9jayB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgZmxleC1ncm93OiAyOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNjYWxhci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGlkPSJzaG93LWRvd25sb2FkLWxpbmtzIiBjaGVja2VkPSJ7e19zaG93RG93bmxvYWRMaW5rc319Ij5TaG93IGRhdGEgZG93bmxvYWQgbGlua3M8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggaWQ9Imlnbm9yZS15LW91dGxpZXIiIGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgIDxkaXY+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMC45OTkiPjwvdGYtc21vb3RoaW5nLWlucHV0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ4LXR5cGUtc2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgQXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHNjYWxhciBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBzY2FsYXIgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIiBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtc2NhbGFyLWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiBkYXRhLXRvLWxvYWQ9IltbaXRlbS5zZXJpZXNdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBtdWx0aS1leHBlcmltZW50cz0iW1tfZ2V0TXVsdGlFeHBlcmltZW50cyhkYXRhU2VsZWN0aW9uKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHNob3ctZG93bmxvYWQtbGlua3M9IltbX3Nob3dEb3dubG9hZExpbmtzXV0iIHNtb290aGluZy1lbmFibGVkPSJbW19zbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9IltbX3Ntb290aGluZ1dlaWdodF1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKGNhdGVnb3J5LCBfcnVuVG9UYWdJbmZvLCBpdGVtKV1dIiB0YWc9IltbaXRlbS50YWddXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1tfdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW194VHlwZV1dIj48L3RmLXNjYWxhci1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICN0b29sdGlwLXNvcnRpbmcgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQogICAgICAjdG9vbHRpcC1zb3J0aW5nIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICB3aWR0aDogMTA1cHg7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuY2VudGVyIHsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXJnaW46IDVweCAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRleHQtdG9wOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICBoMSB7CiAgICAgICAgZm9udC1zaXplOiAxOXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGlkPSJsb2FkZXIiIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGZpbGwtYXJlYT0iW1tfZmlsbEFyZWFdXSIgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iIGxvYWQta2V5PSJbW190YWdGaWx0ZXJdXSIgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIgbG9nLXNjYWxlLWFjdGl2ZT0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKG1hcmdpbkNoYXJ0U2VyaWVzKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgc3ltYm9sLWZ1bmN0aW9uPSJbW19jcmVhdGVTeW1ib2xGdW5jdGlvbigpXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfdG9vbHRpcENvbHVtbnNdXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIiB4LXR5cGU9IltbeFR5cGVdXSI+CiAgICAgIDwvdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iYnV0dG9ucyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiBpY29uPSJsaW5lLXdlaWdodCIgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiIHRpdGxlPSJUb2dnbGUgeS1heGlzIGxvZyBzY2FsZSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQ9InRydWUiIGxhYmVsPSJzZXJpZXMgdG8gZG93bmxvYWQiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZH19Ij4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJkYXRhU2VyaWVzTmFtZSI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tkYXRhU2VyaWVzTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDxhIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5jc3YiIGhyZWY9IltbX2NzdlVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+Q1NWPC9hPgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmpzb24iIGhyZWY9IltbX2pzb25VcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iPkpTT048L2E+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWlzc2luZ1RhZ3MubGVuZ3RoXV0iPgogICAgICA8ZGl2IGNsYXNzPSJjb2xsYXBzaWJsZS1saXN0LXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlQ29sbGFwc2libGVJY29uKF9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkKV1dIiBvbi1jbGljaz0iX3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuIiBjbGFzcz0idG9nZ2xlLWNvbGxhcHNpYmxlLWJ1dHRvbiI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4gTWlzc2luZyBUYWdzCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWlzc2luZ1RhZ3NdXSIgYXM9Im1pc3NpbmdFbnRyeSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgUnVuICJbW21pc3NpbmdFbnRyeS5ydW5dXSIgbGFja3MgZGF0YSBmb3IgdGFncwogICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbWlzc2luZ0VudHJ5LnRhZ3NdXSIgYXM9InRhZyI+CiAgICAgICAgICAgICAgICAgIDxsaT5bW3RhZ11dPC9saT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdGFnRmlsdGVySW52YWxpZF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoaXMgcmVndWxhciBleHByZXNpb24gaXMgaW52YWxpZDo8YnI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImludmFsaWQtcmVnZXgiPltbX3RhZ0ZpbHRlcl1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdGVwc01pc21hdGNoXV0iPgogICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICA8aXJvbi1pY29uIGNsYXNzPSJlcnJvci1pY29uIiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+CiAgICAgICAgVGhlIHN0ZXBzIGZvciB2YWx1ZSwgbG93ZXIsIGFuZCB1cHBlciB0YWdzIGRvIG5vdCBtYXRjaDoKICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QudmFsdWVdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC52YWx1ZVN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0Lmxvd2VyXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gubG93ZXJTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC51cHBlcl1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLnVwcGVyU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDxkaXYgaWQ9Im1hdGNoZXMtY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2libGUtbGlzdC10aXRsZSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlQ29sbGFwc2libGVJY29uKF9tYXRjaGVzTGlzdE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNYXRjaGVzT3BlbiIgY2xhc3M9InRvZ2dsZS1tYXRjaGVzLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsYXBzaWJsZS10aXRsZS10ZXh0Ij4KICAgICAgICAgIE1hdGNoZXMgKFtbX3Nlcmllc05hbWVzLmxlbmd0aF1dKQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWF0Y2hlc0xpc3RPcGVuZWRdXSI+CiAgICAgICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIiBhcz0ic2VyaWVzTmFtZSIgaWQ9Im1hdGNoLWxpc3QtcmVwZWF0IiBvbi1kb20tY2hhbmdlPSJfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hdGNoLWxpc3QtZW50cnkiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1hdGNoLWVudHJ5LXN5bWJvbCI+CiAgICAgICAgICAgICAgICAgIFtbX2RldGVybWluZVN5bWJvbChfbmFtZVRvRGF0YVNlcmllcywgc2VyaWVzTmFtZSldXQogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgW1tzZXJpZXNOYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5lcnJvci1jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBtYXJnaW46IDEwcHggMCAwIDA7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQoKICAgICAgLmVycm9yLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgbWFyZ2luOiAwIGF1dG8gNXB4IGF1dG87CiAgICAgIH0KCiAgICAgIC5pbnZhbGlkLXJlZ2V4IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQoKICAgICAgLmVycm9yLWNvbnRlbnQgdWwgewogICAgICAgIG1hcmdpbjogMXB4IDAgMCAwOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDE5cHg7CiAgICAgIH0KCiAgICAgIC50YWctbmFtZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzaWJsZS1saXN0LXRpdGxlIHsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHggMDsKICAgICAgfQoKICAgICAgLmNvbGxhcHNpYmxlLXRpdGxlLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciB7CiAgICAgICAgbWFyZ2luOiA4cHggMCAwIDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGlkPSJsb2FkZXIiIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIj4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGljb249ImxpbmUtd2VpZ2h0IiBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iIG9uLXRhcD0iX3Jlc2V0RG9tYWluIiB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InNlcmllcyB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkfX0iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9ImRhdGFTZXJpZXNOYW1lIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2RhdGFTZXJpZXNOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmNzdiIgaHJlZj0iW1tfY3N2VXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5DU1Y8L2E+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uanNvbiIgaHJlZj0iW1tfanNvblVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+SlNPTjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWF0Y2hlcy1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZU1hdGNoZXNJY29uKF9tYXRjaGVzTGlzdE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNYXRjaGVzT3BlbiIgY2xhc3M9InRvZ2dsZS1tYXRjaGVzLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaGVzLXRleHQiPgogICAgICAgICAgTWF0Y2hlcyAoW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0pCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19tYXRjaGVzTGlzdE9wZW5lZF1dIj4KICAgICAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJzZXJpZXNOYW1lIiBpZD0ibWF0Y2gtbGlzdC1yZXBlYXQiIG9uLWRvbS1jaGFuZ2U9Il9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF0Y2gtbGlzdC1lbnRyeSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2gtZW50cnktc3ltYm9sIj4KICAgICAgICAgICAgICAgICAgW1tfZGV0ZXJtaW5lU3ltYm9sKF9uYW1lVG9EYXRhU2VyaWVzLCBzZXJpZXNOYW1lKV1dCiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICBbW3Nlcmllc05hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI21hdGNoZXMtbGlzdC10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4IDA7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1hdGNoZXMtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfc2hvd0Rvd25sb2FkTGlua3N9fSI+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZy1sYWJlbCI+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMSI+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9IngtdHlwZS1zZWxlY3RvciIgbmFtZT0iSG9yaXpvbnRhbCBBeGlzIiBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciIgaWQ9ImNhdGVnb3JpZXMtY29udGFpbmVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5UaGUgY3VzdG9tIHNjYWxhcnMgZGFzaGJvYXJkIGlzIGluYWN0aXZlLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPG9sPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW4ndCBsYWlkIG91dCB0aGUgZGFzaGJvYXJkLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgc2NhbGFyIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L29sPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgVG8gbGF5IG91dCB0aGUgZGFzaGJvYXJkLCBwYXNzIGEgPGNvZGU+TGF5b3V0PC9jb2RlPiBwcm90b2J1ZmZlcgogICAgICAgICAgICAgIHRvIHRoZSA8Y29kZT5zZXRfbGF5b3V0PC9jb2RlPiBtZXRob2QuIEZvciBleGFtcGxlLAogICAgICAgICAgICAKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkIGltcG9ydCBzdW1tYXJ5CmZyb20gdGVuc29yYm9hcmQucGx1Z2lucy5jdXN0b21fc2NhbGFyIGltcG9ydCBsYXlvdXRfcGIyCi4uLgojIFRoaXMgYWN0aW9uIGRvZXMgbm90IGhhdmUgdG8gYmUgcGVyZm9ybWVkIGF0IGV2ZXJ5IHN0ZXAsIHNvIHRoZSBhY3Rpb24gaXMgbm90CiMgdGFrZW4gY2FyZSBvZiBieSBhbiBvcCBpbiB0aGUgZ3JhcGguIFdlIG9ubHkgbmVlZCB0byBzcGVjaWZ5IHRoZSBsYXlvdXQgb25jZQojIChpbnN0ZWFkIG9mIHBlciBzdGVwKS4KbGF5b3V0X3N1bW1hcnkgPSBzdW1tYXJ5X2xpYi5jdXN0b21fc2NhbGFyX3BiKGxheW91dF9wYjIuTGF5b3V0KAogIGNhdGVnb3J5PVsKICAgIGxheW91dF9wYjIuQ2F0ZWdvcnkoCiAgICAgIHRpdGxlPSdsb3NzZXMnLAogICAgICBjaGFydD1bCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSdsb3NzZXMnLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcidsb3NzLionXSwKICAgICAgICAgICAgICApKSwKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J2JheicsCiAgICAgICAgICAgICAgbWFyZ2luPWxheW91dF9wYjIuTWFyZ2luQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgc2VyaWVzPVsKICAgICAgICAgICAgICAgICAgbGF5b3V0X3BiMi5NYXJnaW5DaGFydENvbnRlbnQuU2VyaWVzKAogICAgICAgICAgICAgICAgICAgIHZhbHVlPSdsb3NzL2Jhei9zY2FsYXJfc3VtbWFyeScsCiAgICAgICAgICAgICAgICAgICAgbG93ZXI9J2Jhel9sb3dlci9iYXovc2NhbGFyX3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgIHVwcGVyPSdiYXpfdXBwZXIvYmF6L3NjYWxhcl9zdW1tYXJ5JyksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICkpLAogICAgICBdKSwKICAgIGxheW91dF9wYjIuQ2F0ZWdvcnkoCiAgICAgIHRpdGxlPSd0cmlnIGZ1bmN0aW9ucycsCiAgICAgIGNoYXJ0PVsKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J3dhdmUgdHJpZyBmdW5jdGlvbnMnLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcid0cmlnRnVuY3Rpb25zL2Nvc2luZScsIHIndHJpZ0Z1bmN0aW9ucy9zaW5lJ10sCiAgICAgICAgICAgICAgKSksCiAgICAgICAgICAjIFRoZSByYW5nZSBvZiB0YW5nZW50IGlzIGRpZmZlcmVudC4gTGV0J3MgZ2l2ZSBpdCBpdHMgb3duIGNoYXJ0LgogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0ndGFuJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3IndHJpZ0Z1bmN0aW9ucy90YW5nZW50J10sCiAgICAgICAgICAgICAgKSksCiAgICAgIF0sCiAgICAgICMgVGhpcyBjYXRlZ29yeSB3ZSBjYXJlIGxlc3MgYWJvdXQuIExldCdzIG1ha2UgaXQgaW5pdGlhbGx5IGNsb3NlZC4KICAgICAgY2xvc2VkPVRydWUpLAogIF0pKQp3cml0ZXIuYWRkX3N1bW1hcnkobGF5b3V0X3N1bW1hcnkpCjwvcHJlPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGFzPSJjaGFydCIgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgZGlzYWJsZS1wYWdpbmF0aW9uIGluaXRpYWwtb3BlbmVkPSJbW2NhdGVnb3J5Lm1ldGFkYXRhLm9wZW5lZF1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhcnQubXVsdGlsaW5lXV0iPgogICAgICAgICAgICAgICAgICAgIDx0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVucz0iW1tfc2VsZWN0ZWRSdW5zXV0iIHRpdGxlPSJbW2NoYXJ0LnRpdGxlXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgc21vb3RoaW5nLXdlaWdodD0iW1tfc21vb3RoaW5nV2VpZ2h0XV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiB0YWctcmVnZXhlcz0iW1tjaGFydC5tdWx0aWxpbmUudGFnXV0iPjwvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjaGFydC5tYXJnaW5dXSI+CiAgICAgICAgICAgICAgICAgICAgPHRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIiB0aXRsZT0iW1tjaGFydC50aXRsZV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiBtYXJnaW4tY2hhcnQtc2VyaWVzPSJbW2NoYXJ0Lm1hcmdpbi5zZXJpZXNdXSI+PC90Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmcgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHdpZHRoOiAxMDVweDsKICAgICAgfQogICAgICAubGluZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWltYWdlLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdj5zYW1wbGU6IFtbX3NhbXBsZVRleHRdXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHN0ZXAKICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj5bW190b0xvY2FsZVN0cmluZyhfc3RlcFZhbHVlKV1dPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQgZGF0ZXRpbWUiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnRXYWxsVGltZV1dIj4KICAgICAgICAgICAgICBbW19jdXJyZW50V2FsbFRpbWVdXQogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCByaWdodCI+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIV9pc0ltYWdlTG9hZGluZ11dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJzdGVwcyIgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIgbWF4LW1hcmtlcnM9IltbX21heFN0ZXBJbmRleF1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CgogICAgCiAgICA8YSBpZD0ibWFpbi1pbWFnZS1jb250YWluZXIiIHJvbGU9ImJ1dHRvbiIgYXJpYS1sYWJlbD0iVG9nZ2xlIGFjdHVhbCBzaXplIiBhcmlhLWV4cGFuZGVkJD0iW1tfZ2V0QXJpYUV4cGFuZGVkKGFjdHVhbFNpemUpXV0iIG9uLXRhcD0iX2hhbmRsZVRhcCI+PC9hPgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiPgogICAgICAvKiogTWFrZSBidXR0b24gYSBkaXYuICovCiAgICAgIGJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IEdldCByaWQgb2YgZG90dGVkIGxpbmUgaW5zaWRlIGJ1dHRvbi4gKi8KICAgICAgYnV0dG9uOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IFNpbXVsYXRlIENocm9tZSdzIG91dGVyIGdsb3cgb24gYnV0dG9uIHdoZW4gZm9jdXNlZC4gKi8KICAgICAgYnV0dG9uOi1tb3otZm9jdXNyaW5nIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IDJweCBIaWdobGlnaHQ7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW46IDAgMTVweCA0MHB4IDA7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgfQoKICAgICAgLyoqIFdoZW4gYWN0dWFsIHNpemUgc2hvd24gaXMgb24sIHVzZSB0aGUgYWN0dWFsIGltYWdlIHdpZHRoLiAqLwogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IG5vbmU7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pICNtYWluLWltYWdlLWNvbnRhaW5lciBpbWcgewogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1zcGlubmVyLWxpdGUgewogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207CiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQoKICAgICAgI3N0ZXBzIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMTVweDsKICAgICAgICAvKgogICAgICAgICAqIDMxIGNvbWVzIGZyb20gYWRkaW5nIGEgcGFkZGluZyBvZiAxNXB4IGZyb20gYm90aCBzaWRlcyBvZiB0aGUKICAgICAgICAgKiBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nIDFweCBzbyB0aGF0IHRoZSBzbGlkZXIgd2lkdGggYWxpZ25zCiAgICAgICAgICogd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwgYW5kCiAgICAgICAgICogYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZgogICAgICAgICAqIHRoZSBpbWFnZS4gMzAgLSAxICsgMi4KICAgICAgICAgKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICB9CgogICAgICAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDEwMjRweDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI21haW4taW1hZ2UtY29udGFpbmVyIGltZyB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGltYWdlLXJlbmRlcmluZzogLW1vei1jcmlzcC1lZGdlczsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWltYWdlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfYWN0dWFsU2l6ZX19Ij5TaG93IGFjdHVhbCBpbWFnZSBzaXplPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8aDMgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5CcmlnaHRuZXNzIGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBtaW49IjAiIG1heD0iMiIgc25hcHMgcGluIHN0ZXA9IjAuMDEiIHZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19IiBpbW1lZGlhdGUtdmFsdWU9Int7X2JyaWdodG5lc3NBZGp1c3RtZW50fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgb24tdGFwPSJfcmVzZXRCcmlnaHRuZXNzIiBkaXNhYmxlZD0iW1tfYnJpZ2h0bmVzc0lzRGVmYXVsdF1dIj5SZXNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMyBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPkNvbnRyYXN0IGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBtaW49IjAiIG1heD0iNTAwIiBzbmFwcyBwaW4gc3RlcD0iMSIgdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19IiBpbW1lZGlhdGUtdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIG9uLXRhcD0iX3Jlc2V0Q29udHJhc3QiIGRpc2FibGVkPSJbW19jb250cmFzdElzRGVmYXVsdF1dIj5SZXNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIGlkPSJydW5zLXNlbGVjdG9yIiBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+PC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGltYWdlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGltYWdlIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWltYWdlLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iIG9mLXNhbXBsZXM9IltbaXRlbS5vZlNhbXBsZXNdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgYWN0dWFsLXNpemU9IltbX2FjdHVhbFNpemVdXSIgYnJpZ2h0bmVzcy1hZGp1c3RtZW50PSJbW19icmlnaHRuZXNzQWRqdXN0bWVudF1dIiBjb250cmFzdC1wZXJjZW50YWdlPSJbW19jb250cmFzdFBlcmNlbnRhZ2VdXSI+PC90Zi1pbWFnZS1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItc2xpZGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHVuc2V0OwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbdG90YWxTYW1wbGVzXV0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwIDxzdHJvbmc+W1tfY3VycmVudERhdHVtLnN0ZXBdXTwvc3Ryb25nPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnREYXR1bS53YWxsX3RpbWVdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgICAgW1tfY3VycmVudERhdHVtLndhbGxfdGltZV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgIDxhdWRpbyBjb250cm9scyBzcmMkPSJbW19jdXJyZW50RGF0dW0udXJsXV0iIHR5cGUkPSJbW19jdXJyZW50RGF0dW0uY29udGVudFR5cGVdXSI+PC9hdWRpbz4KICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tfY3VycmVudERhdHVtLmxhYmVsXV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtYWluLWF1ZGlvLWNvbnRhaW5lciI+PC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3I6ICM0MjQyNDI7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgICNzdGVwcyB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwYWRkaW5nOiAwIDVweDsgLyogc28gdGhlIHNsaWRlciBrbm9iIGRvZXNuJ3QgYnV0dCBvdXQgKi8KICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBpZD0icnVucy1zZWxlY3RvciIgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBhdWRpbyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBhdWRpbyBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1hdWRpby1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIiB0b3RhbC1zYW1wbGVzPSJbW2l0ZW0udG90YWxTYW1wbGVzXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iPjwvdGYtYXVkaW8tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tYXV0b2dyb3ctdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRhcmVhOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1pcnJvci10ZXh0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIHRlbXBsYXRlICovCiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIAogICAgCiAgICA8ZGl2IGlkPSJtaXJyb3IiIGNsYXNzPSJtaXJyb3ItdGV4dCIgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PgoKICAgIAogICAgPGRpdiBjbGFzcz0idGV4dGFyZWEtY29udGFpbmVyIGZpdCI+CiAgICAgIDx0ZXh0YXJlYSBpZD0idGV4dGFyZWEiIG5hbWUkPSJbW25hbWVdXSIgYXJpYS1sYWJlbCQ9IltbbGFiZWxdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSI+PC90ZXh0YXJlYT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgbGFiZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dC1jb250YWluZXIgbm8tbGFiZWwtZmxvYXQkPSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPGxhYmVsIGhpZGRlbiQ9IltbIWxhYmVsXV0iIGFyaWEtaGlkZGVuPSJ0cnVlIiBmb3IkPSJbW19pbnB1dElkXV0iIHNsb3Q9ImxhYmVsIj5bW2xhYmVsXV08L2xhYmVsPgoKICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3M9InBhcGVyLWlucHV0LWlucHV0IiBzbG90PSJpbnB1dCIgaWQkPSJbW19pbnB1dElkXV0iIGFyaWEtbGFiZWxsZWRieSQ9IltbX2FyaWFMYWJlbGxlZEJ5XV0iIGFyaWEtZGVzY3JpYmVkYnkkPSJbW19hcmlhRGVzY3JpYmVkQnldXSIgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yJD0iW1t2YWxpZGF0b3JdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGF1dG9jb21wbGV0ZSQ9IltbYXV0b2NvbXBsZXRlXV0iIGF1dG9mb2N1cyQ9IltbYXV0b2ZvY3VzXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIG5hbWUkPSJbW25hbWVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWF4LXJvd3MkPSJbW21heFJvd3NdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiPjwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9hc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2FzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjMzIzMjMyKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9hc3QtY29sb3IsICNmMWYxZjEpOwogICAgICAgIG1pbi1oZWlnaHQ6IDQ4cHg7CiAgICAgICAgbWluLXdpZHRoOiAyODhweDsKICAgICAgICBwYWRkaW5nOiAxNnB4IDI0cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMjYpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBtYXJnaW46IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuM3MsIG9wYWNpdHkgMC4zczsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcywgb3BhY2l0eSAwLjNzOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwcHgpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhcHN1bGUpIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCguZml0LWJvdHRvbSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhcGVyLXRvYXN0LW9wZW4pIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNwYW4gaWQ9ImxhYmVsIj57e3RleHR9fTwvc3Bhbj4KICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b2dnbGUtYnV0dG9uIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6bm9uZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1iYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhci1jb2xvciwgIzAwMDAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhcjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IC0zcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gbGluZWFyIC4wOHMsIGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b24tY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNTApKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbi5kcmFnZ2luZyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYmFyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJhci1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICAgICAgICBvcGFjaXR5OiAwLjEyOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF06bm90KFtkaXNhYmxlZF0pKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudG9nZ2xlLWluayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTE0cHg7CiAgICAgICAgbGVmdDogLTE0cHg7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIC8qIFRoZSB0b2dnbGUgYnV0dG9uIGhhcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZiAtM3B4OyBUaGUgZXh0cmEgMXB4CiAgICAgICAgLyogYWNjb3VudHMgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIHNoYWRvdyBib3guICovCiAgICAgICAgbWFyZ2luOiA0cHggMXB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICAvKiBpbnZhbGlkIHN0YXRlICovCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1iYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1iYXItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1idXR0b24tY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1pbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtaW5rLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCYXIiIGNsYXNzPSJ0b2dnbGUtYmFyIj48L2Rpdj4KICAgICAgPGRpdiBpZD0idG9nZ2xlQnV0dG9uIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtbGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1taW5pbWFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgbGluZWFyOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCguaGlkZGVuKSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgY2FudmFzIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwogICAgICB9CgogICAgICByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6ICMxMTExMTE7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwOwogICAgICAgIGZpbHRlcjogdXJsKCNtaW5pbWFwRHJvcFNoYWRvdyk7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdmc+CiAgICAgIDxkZWZzPgogICAgICAgIDxmaWx0ZXIgaWQ9Im1pbmltYXBEcm9wU2hhZG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTUwJSIgaGVpZ2h0PSIxNTAlIj4KICAgICAgICAgIDxmZW9mZnNldCByZXN1bHQ9Im9mZk91dCIgaW49IlNvdXJjZUdyYXBoaWMiIGR4PSIxIiBkeT0iMSI+PC9mZW9mZnNldD4KICAgICAgICAgIDxmZWNvbG9ybWF0cml4IHJlc3VsdD0ibWF0cml4T3V0IiBpbj0ib2ZmT3V0IiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4xIDAgMCAwIDAgMCAwLjEgMCAwIDAgMCAwIDAuMSAwIDAgMCAwIDAgMC41IDAiPjwvZmVjb2xvcm1hdHJpeD4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciByZXN1bHQ9ImJsdXJPdXQiIGluPSJtYXRyaXhPdXQiIHN0ZGRldmlhdGlvbj0iMiI+PC9mZWdhdXNzaWFuYmx1cj4KICAgICAgICAgIDxmZWJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImJsdXJPdXQiIG1vZGU9Im5vcm1hbCI+PC9mZWJsZW5kPgogICAgICAgIDwvZmlsdGVyPgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0PjwvcmVjdD4KICAgIDwvc3ZnPgogICAgPGNhbnZhcyBjbGFzcz0iZmlyc3QiPjwvY2FudmFzPgogICAgCiAgICA8Y2FudmFzIGNsYXNzPSJzZWNvbmQiPjwvY2FudmFzPgogICAgPGNhbnZhcyBjbGFzcz0iZG93bmxvYWQiPjwvY2FudmFzPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLXNjZW5lIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzdmcgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2hpZGRlbiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyogLS0tIE5vZGUgYW5kIGFubm90YXRpb24tbm9kZSBmb3IgTWV0YW5vZGUgLS0tICovCgogICAgICAubWV0YSA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YSA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgfQogICAgICAubWV0YS5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCwKICAgICAgLmZhZGVkIHJlY3QsCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgcGF0aCwKICAgICAgLmZhZGVkIHVzZSwKICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBwYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmFkZWQgcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgdXNlIHsKICAgICAgICBmaWxsOiB1cmwoI2VsbGlwc2VIYXRjaCkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmZhZGVkIHRleHQgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC8qIFJ1bGVzIHVzZWQgZm9yIGlucHV0LXRyYWNpbmcuICovCiAgICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gcmVjdCwKICAgICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiBlbGxpcHNlLAogICAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHVzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZmY5ODAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qICAtIEZhZGVkIG5vbi1pbnB1dCBzdHlsaW5nICovCiAgICAgIC5ub24taW5wdXQgPiAqID4gcmVjdCwKLm5vbi1pbnB1dCA+ICogPiBlbGxpcHNlLAoubm9uLWlucHV0ID4gKiA+IHVzZSwKLyogRm9yIENvbnN0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gKiA+IC5jb25zdGFudDpub3QoW2NsYXNzKj0iaW5wdXQtaGlnaGxpZ2h0Il0pID4KICAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiBpbmhlcml0OwogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgcGF0aCB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gLm5vZGVzaGFwZSA+IHJlY3QsCi5ub24taW5wdXQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgZWxsaXBzZSwKICAgICAgLm5vbi1pbnB1dCB1c2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLm5vbi1pbnB1dCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLyogSW5wdXQgZWRnZXMuICovCiAgICAgIC5pbnB1dC1lZGdlLWhpZ2hsaWdodCA+IHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLmlucHV0LWhpZ2hsaWdodCA+IC5pbi1hbm5vdGF0aW9ucyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSwKICAgICAgLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZAogICAgICAgID4gLmluLWFubm90YXRpb25zCiAgICAgICAgPiAuYW5ub3RhdGlvbgogICAgICAgID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIE5vbi1pbnB1dCBlZGdlcy4gKi8KICAgICAgLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCwKLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IHBhdGgsCi8qIEFubm90YXRpb24gc3R5bGVzIChsYWJlbCBhbmQgZWRnZXMgcmVzcGVjdGl2ZWx5KS4gKi8KLm5vbi1pbnB1dCA+IGcgPgouYW5ub3RhdGlvbjpub3QoLmlucHV0LWhpZ2hsaWdodCk6bm90KC5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQpID4KLmFubm90YXRpb24tbGFiZWwKLyouYW5ub3RhdGlvbi1lZGdlKi8KIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qIC0tLSBPcCBOb2RlIC0tLSAqLwoKICAgICAgLm9wID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAgIC5vcCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5vcC5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgICAub3Auc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAub3AuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgICAgLm9wLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQoKICAgICAgLyogLS0tIFNlcmllcyBOb2RlIC0tLSAqLwoKICAgICAgLyogQnkgZGVmYXVsdCwgZG9uJ3Qgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+LiAqLwogICAgICAuc2VyaWVzID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICAgIGZpbGw6IGhzbCgwLCAwJSwgNzAlKTsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogNSwgNTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC8qIE9uY2UgZXhwYW5kZWQsIHNob3cgdGhlIHNlcmllcyBiYWNrZ3JvdW5kIDxyZWN0PiBhbmQgaGlkZSB0aGUgPHVzZT4uICovCiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwLjE1OwogICAgICAgIHN0cm9rZTogaHNsKDAsIDAlLCA3MCUpOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gdXNlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKgogKiBUT0RPOiBTaW1wbGlmeSB0aGlzIGJ5IGFwcGx5aW5nIGEgc3RhYmxlIGNsYXNzIG5hbWUgdG8gYWxsIDxnPgogKiBlbGVtZW50cyB0aGF0IGN1cnJlbnRseSBoYXZlIGVpdGhlciB0aGUgbm9kZXNoYXBlIG9yIGFubm90YXRpb24tbm9kZSBjbGFzc2VzLgogKi8KICAgICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KICAgICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLnNlcmllcy5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBCcmlkZ2UgTm9kZSAtLS0gKi8KICAgICAgLmJyaWRnZSA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6ICNmMGY7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTdHJ1Y3R1cmFsIEVsZW1lbnRzIC0tLSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUuc3RydWN0dXJhbCB7CiAgICAgICAgc3Ryb2tlOiAjZjBmOwogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBSZWZlcmVuY2UgRWRnZSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUucmVmZXJlbmNlZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjZmZiNzRkOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTZXJpZXMgTm9kZXMgLS0tICovCgogICAgICAvKiBIaWRlIHRoZSByZWN0IGZvciBhIHNlcmllcycgYW5ub3RhdGlvbi4gKi8KICAgICAgLnNlcmllcyA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiAtLS0gTm9kZSBsYWJlbCAtLS0gKi8KCiAgICAgIC5ub2RlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiAjNDQ0OwogICAgICB9CgogICAgICAubWV0YS5leHBhbmRlZCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgfQoKICAgICAgLnNlcmllcyA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDhweDsKICAgICAgfQoKICAgICAgLm9wID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNnB4OwogICAgICB9CgogICAgICAuYnJpZGdlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ub2RlLm1ldGEuZXhwYW5kZWQgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgICAgY3Vyc29yOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuaGlnaGxpZ2h0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM1MGEzZjc7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM0Mjg1ZjQ7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uIC0tLSAqLwoKICAgICAgLyogb25seSBhcHBsaWVkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGFyZSBub3Qgc3VtbWFyeSBvciBjb25zdGFudC4KKC5zdW1tYXJ5LCAuY29uc3RhbnQgZ2V0cyBvdmVycmlkZGVuIGJlbG93KSAqLwogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zdW1tYXJ5ID4gLmFubm90YXRpb24tbm9kZSA+ICosCiAgICAgIC5hbm5vdGF0aW9uLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+ICogewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYWFhOwogICAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgICBtYXJrZXItZW5kOiB1cmwoI2Fubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTsKICAgICAgfQoKICAgICAgI2Fubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjYWFhOwogICAgICB9CgogICAgICAjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNhYWE7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWxhYmVsLmFubm90YXRpb24tZWxsaXBzaXMgewogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLyogSGlkZSBhbm5vdGF0aW9ucyBvbiBleHBhbmRlZCBtZXRhIG5vZGVzIHNpbmNlIHRoZXkncmUgcmVkdW5kYW50LiAqLwogICAgICAuZXhwYW5kZWQgPiAuaW4tYW5ub3RhdGlvbnMsCiAgICAgIC5leHBhbmRlZCA+IC5vdXQtYW5ub3RhdGlvbnMgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBDb25zdGFudCAtLS0gKi8KCiAgICAgIC5jb25zdGFudCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjODQ4NDg0OwogICAgICB9CgogICAgICAuY29uc3RhbnQuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIH0KCiAgICAgIC5jb25zdGFudC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEFubm90YXRpb246IFN1bW1hcnkgLS0tICovCgogICAgICAuc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2RiNDQzNzsKICAgICAgICBzdHJva2U6ICNkYjQ0Mzc7CiAgICAgIH0KCiAgICAgIC5zdW1tYXJ5LnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIGZpbGw6ICNhNTI3MTQ7CiAgICAgICAgc3Ryb2tlOiAjYTUyNzE0OwogICAgICB9CgogICAgICAuc3VtbWFyeS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEVkZ2UgLS0tICovCgogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYmJiOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNzU7CiAgICAgIH0KCiAgICAgIC5lZGdlIC5zZWxlY3RhYmxlZWRnZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuc2VsZWN0ZWRlZGdlID4gcGF0aC5lZGdlbGluZSB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHN0cm9rZTogI2YwMDsKICAgICAgfQoKICAgICAgLmVkZ2Uuc2VsZWN0ZWRlZGdlIHRleHQgewogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgIH0KCiAgICAgIC8qIExhYmVscyBzaG93aW5nIHRlbnNvciBzaGFwZXMgb24gZWRnZXMgKi8KICAgICAgLmVkZ2UgPiB0ZXh0IHsKICAgICAgICBmb250LXNpemU6IDMuNXB4OwogICAgICAgIGZpbGw6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5kYXRhZmxvdy1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNiYmI7CiAgICAgIH0KCiAgICAgIC5yZWZlcmVuY2UtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZmZiNzRkOwogICAgICB9CgogICAgICAuc2VsZWN0ZWQtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZjAwOwogICAgICB9CgogICAgICAuZWRnZSAuY29udHJvbC1kZXAgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDIsIDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBHcm91cCBub2RlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0tICovCgogICAgICAvKiBIaWRlcyBleHBhbmQvY29sbGFwc2UgYnV0dG9ucyB3aGVuIGEgbm9kZSBpc24ndCBleHBhbmRlZCBvciBoaWdobGlnaHRlZC4gVXNpbmcKICAgaW5jcmVkaWJseSBzbWFsbCBvcGFjaXR5IHNvIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgPGc+IHBhcmVudCBzdGlsbCB0YWtlcwogICB0aGlzIGNvbnRhaW5lciBpbnRvIGFjY291bnQgZXZlbiB3aGVuIGl0IGlzbid0IHZpc2libGUgKi8KICAgICAgLm5vZGU6bm90KC5oaWdobGlnaHRlZCk6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciB7CiAgICAgICAgb3BhY2l0eTogMC4wMTsKICAgICAgfQogICAgICAubm9kZS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLmJ1dHRvbmNpcmNsZSB7CiAgICAgICAgZmlsbDogI2U3ODExZDsKICAgICAgfQogICAgICAuYnV0dG9uY2lyY2xlOmhvdmVyIHsKICAgICAgICBmaWxsOiAjYjk2NzE3OwogICAgICB9CiAgICAgIC5leHBhbmRidXR0b24sCiAgICAgIC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgfQogICAgICAvKiBEbyBub3QgbGV0IHRoZSBwYXRoIGVsZW1lbnRzIGluIHRoZSBidXR0b24gdGFrZSBwb2ludGVyIGZvY3VzICovCiAgICAgIC5ub2RlID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuZXhwYW5kYnV0dG9uLAogICAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAvKiBPbmx5IHNob3cgdGhlIGV4cGFuZCBidXR0b24gd2hlbiBhIG5vZGUgaXMgY29sbGFwc2VkIGFuZCBvbmx5IHNob3cgdGhlCiAgIGNvbGxhcHNlIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZC4gKi8KICAgICAgLm5vZGUuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm5vZGU6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLXN0YXRzIHsKICAgICAgICBmb250LXNpemU6IDRweDsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwgcmVjdCB7CiAgICAgICAgZmlsdGVyOiB1cmwoI2hlYWx0aC1waWxsLXNoYWRvdyk7CiAgICAgICAgcng6IDM7CiAgICAgICAgcnk6IDM7CiAgICAgIH0KCiAgICAgIC50aXRsZUNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRvcDogMjBweDsKICAgICAgfQoKICAgICAgLnRpdGxlLAogICAgICAuYXV4VGl0bGUsCiAgICAgIC5mdW5jdGlvbkxpYnJhcnlUaXRsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjbWluaW1hcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAyMHB4OwogICAgICAgIGJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0idGl0bGVDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0aXRsZSIgY2xhc3M9InRpdGxlIj5NYWluIEdyYXBoPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImF1eFRpdGxlIiBjbGFzcz0iYXV4VGl0bGUiPkF1eGlsaWFyeSBOb2RlczwvZGl2PgogICAgICA8ZGl2IGlkPSJmdW5jdGlvbkxpYnJhcnlUaXRsZSIgY2xhc3M9ImZ1bmN0aW9uTGlicmFyeVRpdGxlIj4KICAgICAgICBGdW5jdGlvbnMKICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxkZWZzPgogICAgICAgIAogICAgICAgIDxwYXRoIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1zbWFsbCIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1tZWRpdW0iIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjEzIiBtYXJrZXJoZWlnaHQ9IjEzIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMTYiIG1hcmtlcmhlaWdodD0iMTYiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXhsYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMjAiIG1hcmtlcmhlaWdodD0iMjAiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8cGF0aCBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtc21hbGwiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbWVkaXVtIiB2aWV3Ym94PSIwIDAgMTAgMTAiIG1hcmtlcndpZHRoPSIxMyIgbWFya2VyaGVpZ2h0PSIxMyIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjE2IiBtYXJrZXJoZWlnaHQ9IjE2IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC14bGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjIwIiBtYXJrZXJoZWlnaHQ9IjIwIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQiIG1hcmtlcndpZHRoPSI1IiBtYXJrZXJoZWlnaHQ9IjUiIHJlZng9IjAiIHJlZnk9IjIuNSIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gNSwwIEwgMCwyLjUgTCA1LDUgTCA1LDAiIC8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgPG1hcmtlciBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIwIiByZWZ5PSIyLjUiIG9yaWVudD0iYXV0byI+CiAgICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICAKICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtYW5ub3RhdGlvbi1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjkiIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjciIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjUiIHk9IjIiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxzdmcgaWQ9InN1bW1hcnktaWNvbiIgZmlsbD0iIzg0ODQ4NCIgaGVpZ2h0PSIxMiIgdmlld2JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTIiPgogICAgICAgICAgPHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz4KICAgICAgICA8L3N2Zz4KCiAgICAgICAgCiAgICAgICAgPHBhdHRlcm4gaWQ9InJlY3RIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuIGlkPSJlbGxpcHNlSGF0Y2giIHBhdHRlcm50cmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIiB3aWR0aD0iMiIgaGVpZ2h0PSIyIiBwYXR0ZXJudW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIiAvPgogICAgICAgIDwvcGF0dGVybj4KCiAgICAgICAgCiAgICAgICAgPGZpbHRlciBpZD0iaGVhbHRoLXBpbGwtc2hhZG93IiB4PSItNDAlIiB5PSItNDAlIiB3aWR0aD0iMTgwJSIgaGVpZ2h0PSIxODAlIj4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMC44IiAvPgogICAgICAgICAgPGZlb2Zmc2V0IGR4PSIwIiBkeT0iMCIgcmVzdWx0PSJvZmZzZXRibHVyIiAvPgogICAgICAgICAgPGZlZmxvb2QgZmxvb2QtY29sb3I9IiMwMDAwMDAiIC8+CiAgICAgICAgICA8ZmVjb21wb3NpdGUgaW4yPSJvZmZzZXRibHVyIiBvcGVyYXRvcj0iaW4iIC8+CiAgICAgICAgICA8ZmVtZXJnZT4KICAgICAgICAgICAgPGZlbWVyZ2Vub2RlIC8+CiAgICAgICAgICAgIDxmZW1lcmdlbm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgICAgIDwvZmVtZXJnZT4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgPC9kZWZzPgogICAgICAKICAgICAgPHJlY3QgZmlsbD0id2hpdGUiIHdpZHRoPSIxMDAwMCIgaGVpZ2h0PSIxMDAwMCI+PC9yZWN0PgogICAgICA8ZyBpZD0icm9vdCI+PC9nPgogICAgPC9zdmc+CiAgICA8dGYtZ3JhcGgtbWluaW1hcCBpZD0ibWluaW1hcCI+PC90Zi1ncmFwaC1taW5pbWFwPgogICAgPGRpdiBpZD0iY29udGV4dE1lbnUiIGNsYXNzPSJjb250ZXh0LW1lbnUiPjwvZGl2PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgfQoKICAgICAgLmF1dG8gewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICBwYXBlci1idXR0b24gewogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0idmVydGljYWwiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t0aXRsZV1dIj4KICAgICAgICAgIDxoMj5bW3RpdGxlXV08L2gyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRmLWdyYXBoLXNjZW5lIGlkPSJzY2VuZSIgY2xhc3M9ImF1dG8iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1lZGdlPSJ7e3NlbGVjdGVkRWRnZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHByb2dyZXNzPSJbW3Byb2dyZXNzXV0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW25vZGVDb250ZXh0TWVudUl0ZW1zXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9jb250aW51ZUJ1dHRvbkNhbGxiYWNrIj4KICAgICAgPHNwYW4+W1tfY29udGludWVCdXR0b25UZXh0XV08L3NwYW4+CiAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iY29udGludWVEaWFsb2ciPgogICAgICA8aDI+Q29udGludWUuLi48L2gyPgogICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlLW5hbWUiPgogICAgICAgICAgT3ZlciBTZXNzaW9uIFJ1bnM6CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJjb250aW51ZU51bSIgY2xhc3M9ImlucHV0LWJveCIgbGFiZWw9Ik51bWJlciBvZiBTZXNzaW9uIFJ1bnMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBvbmUpOiIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIxIiBzdGVwPSIxIiB2YWx1ZT0ie3tjb250aW51ZU51bX19Ij48L3BhcGVyLWlucHV0PgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZ28tYnV0dG9uIiBpY29uPSJhcnJvdy1mb3J3YXJkIiB0aXRsZT0iU2Vzc2lvbiBSdW5zIEdvIiBvbi10YXA9Il9zZXNzaW9uUnVuR29CdXR0b25DYWxsYmFjayI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUtbmFtZSI+CiAgICAgICAgICBUaWxsIENvbmRpdGlvbiBNZXQgYnkgV2F0Y2hlZCBUZW5zb3IKICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0idGVuc29yQ29uZGl0aW9uRHJvcGRvd24iIGNsYXNzPSJpbnB1dC1ib3giIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iVGVuc29yIENvbmRpdGlvbiIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb259fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJ0ZW5zb3JDb25kaXRpb25NZW51IiBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Db250YWlucyArLy3iiJ4gb3IgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgKy8t4oiePC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWF4ICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1pbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWluICZsdDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggLSBNaW4gJmd0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1heCAtIE1pbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+U3RhbmRhcmQgZGV2aWF0aW9uICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5TdGFuZGFyZCBkZXZpYXRpb24gJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJnby1idXR0b24iIGljb249ImFycm93LWZvcndhcmQiIHRpdGxlPSJUZW5zb3IgQ29uZGl0aW9uIEdvIiBvbi10YXA9Il90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2siPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJyZWYtdmFsdWUiIGNsYXNzPSJpbnB1dC1ib3giIGxhYmVsPSJSZWZlcmVuY2UgdmFsdWUgdG8gY29tcGFyZSB0byIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0ie3tfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWV9fSIgaGlkZGVuPSJbW19pc1JlZlZhbHVlSW5wdXRIaWRkZW5dXSI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC5jb250aW51ZS10by10eXBlLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IHBhcGVyLWRpYWxvZyB7CiAgICAgICAgd2lkdGg6IDM2dnc7CiAgICAgIH0KICAgICAgOmhvc3QgLmlucHV0LWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgfQogICAgICA6aG9zdCAuZ28tYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nIj4KICA8dGVtcGxhdGU+CiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfb3Blbl1dIj4KICAgICAgPGRpdiBpZD0iZGFzaGJvYXJkLWJhY2tkcm9wIj48L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJkaWFsb2ciIG5vLWNhbmNlbC1vbi1vdXRzaWRlLWNsaWNrIG5vLWNhbmNlbC1vbi1lc2Mta2V5IG9wZW5lZD0ie3tfb3Blbn19Ij4KICAgICAgPGgyIGlkPSJkaWFsb2ctdGl0bGUiPltbX3RpdGxlXV08L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0N1c3RvbU1lc3NhZ2VdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLW1lc3NhZ2UiPltbX2N1c3RvbU1lc3NhZ2VdXTwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXNDdXN0b21NZXNzYWdlXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvU2Vzc2lvbiIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+dGYuU2Vzc2lvbjwvYT46CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlLXNuaXBwZXQiPmltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCmZyb20gdGVuc29yZmxvdy5weXRob24gaW1wb3J0IGRlYnVnIGFzIHRmX2RlYnVnCgpzZXNzID0gdGYuU2Vzc2lvbigpCnNlc3MgPSB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24oc2VzcywgIltbX2hvc3RdXTpbW19wb3J0XV0iKQpzZXNzLnJ1bihteV9mZXRjaGVzKQogICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL3Byb2dyYW1tZXJzX2d1aWRlL2VzdGltYXRvcnMiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPkVzdGltYXRvcjwvYT4KICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL3RyYWluL01vbml0b3JlZFNlc3Npb24iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPk1vbml0b3JlZFNlc3Npb248L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwoKaG9vayA9IHRmX2RlYnVnLlRlbnNvckJvYXJkRGVidWdIb29rKCJbW19ob3N0XV06W1tfcG9ydF1dIikKbXlfZXN0aW1hdG9yLmZpdCh4PXhfZGF0YSwgeT15X2RhdGEsIHN0ZXBzPTEwMDAsIG1vbml0b3JzPVtob29rXSkKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8va2VyYXMuaW8vbW9kZWxzL21vZGVsLyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+S2VyYXMgTW9kZWw8L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwppbXBvcnQga2VyYXMKCmtlcmFzLmJhY2tlbmQuc2V0X3Nlc3Npb24oCiAgICB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24odGYuU2Vzc2lvbigpLCAiW1tfaG9zdF1dOltbX3BvcnRdXSIpKQojIERlZmluZSB5b3VyIGtlcmFzIG1vZGVsLCBjYWxsZWQgIm1vZGVsIi4KbW9kZWwuZml0KC4uLikKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHN0eWxlPgogICAgICAvKiogV2UgcmVseSBvbiBhIHNlcGFyYXRlIGBfaGlkZGVuYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRpcmVjdGx5IG1ha2luZyB1c2UKICAgICAgICAgIG9mIHRoZSBgX29wZW5gIGF0dHJpYnV0ZSBiZWNhdXNlIHRoaXMgQ1NTIHNwZWNpZmljYXRpb24gbWF5IHN0cmFuZ2VseQogICAgICAgICAgYWZmZWN0IG90aGVyIGVsZW1lbnRzIHRocm91Z2hvdXQgVGVuc29yQm9hcmQuIFNlZSAjODk5LiAqLwogICAgICA6aG9zdChbX2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIDpob3N0LAogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgIH0KCiAgICAgIC5jb2RlLWV4YW1wbGUgewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CiAgICAgIC5jb2RlLWV4YW1wbGUtc2VjdGlvbiB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLmNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAuY29kZS1zbmlwcGV0IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKICAgICAgfQoKICAgICAgI2RpYWxvZy10aXRsZSB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jdXN0b20tbWVzc2FnZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZGVidWdnZXItcmVzaXplciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iYmFycyI+CiAgICAgIDxkaXYgY2xhc3M9ImJhcnMtcm90YXRvciI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImJhcnMtdGV4dCI+fCB8PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdChbX3Jlc2l6ZXItaWRlbnRpZmllcl0pIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYmFja2dyb3VuZDogI2NjYzsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2lzLWhvcml6b250YWxdKSB7CiAgICAgICAgY3Vyc29yOiByb3ctcmVzaXplOwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICA6aG9zdChbX2lzLXZlcnRpY2FsXSkgewogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICByaWdodDogLTE1cHg7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLmJhcnMgewogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgZm9udC1zaXplOiA1cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgIC8qKiBUaGlzIGJsb2NrIHByZXZlbnRzIHRoZSBiYXJzIHJvdGF0b3IgZnJvbSBoYXZpbmcgYSBoZWlnaHQgdGhhdCBpcwogICAgICAgICAgdGhlIGVudGlyZSB2aWV3cG9ydCwgdGh1cyBvY2NsdWRpbmcgaXQgYW5kIGdpdmluZyBpdCBhbiB1bmRlc2lyZWQgY3Vyc29yCiAgICAgICAgICB2YWx1ZS4gKi8KICAgICAgLmJhcnMtcm90YXRvciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaXMtaG9yaXpvbnRhbF0pIC5iYXJzLXJvdGF0b3IgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgICAgfQoKICAgICAgLmJhcnMtdGV4dCB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMTUpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdj4KICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9ImZpbHRlci1tb2RlIiBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9IkZpbHRlciBNb2RlIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19maWx0ZXJNb2RlfX0iPgogICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Ob2RlIE5hbWU8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+T3AgVHlwZTwvcGFwZXItaXRlbT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJmaWx0ZXItaW5wdXQiIGxhYmVsPSJGaWx0ZXIgUmVnZXgiIGFsd2F5cy1mbG9hdC1sYWJlbCB2YWx1ZT0ie3tfZmlsdGVySW5wdXR9fSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgY2xhc3M9InNwaW5uZXIiIGlkPSJsb2FkaW5nLXNwaW5uZXIiIGhpZGRlbj0iW1shX2lzTG9hZGluZ11dIj4KICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgPGRpdiBpZD0ic2VsZWN0b3ItaGllcmFyY2h5Ij48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgLmxldmVsLWNvbnRhaW5lciBpcm9uLWNvbGxhcHNlIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICBtYXJnaW46IDAgOHB4IDAgMDsKICAgICAgfQoKICAgICAgLm9wLXR5cGUgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7CiAgICAgICAgY29sb3I6ICM0NDQ7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQoKICAgICAgLnBhcnRpYWwtY2hlY2tib3ggewogICAgICAgIGJhY2tncm91bmQ6ICNmNTdjMDA7CiAgICAgIH0KCiAgICAgIC5ub2RlLWV4cGFuZC1idXR0b24gewogICAgICAgIG1hcmdpbjogMCAwIDAgLTEzcHg7CiAgICAgIH0KCiAgICAgIC5sZXZlbC10aXRsZS10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xcHg7CiAgICAgIH0KCiAgICAgIC5vcC1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIDI3cHg7CiAgICAgICAgcGFkZGluZzogMTBweCAwOwogICAgICB9CgogICAgICAuc3Bpbm5lciB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNmaWx0ZXItbW9kZSB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2ZpbHRlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIC5oaWdobGlnaHRlZCA+IC5vcC10eXBlIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CgogICAgICAjc2VsZWN0b3ItaGllcmFyY2h5IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zZXNzaW9uLXJ1bnMtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0ic2Vzc2lvbi1ydW5zLWRpdiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNlc3Npb24gUnVuczwvZGl2PgogICAgICA8dGFibGUgaWQ9InNlc3Npb24tcnVucy10YWJsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJzZXNzaW9uLXJ1bnMtdGFibGUiPgogICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICA8dGg+RmVlZHM8L3RoPgogICAgICAgICAgPHRoPkZldGNoZXM8L3RoPgogICAgICAgICAgPHRoPlRhcmdldHM8L3RoPgogICAgICAgICAgPHRoPiMoRGV2aWNlcyk8L3RoPgogICAgICAgICAgPHRoPkNvdW50PC90aD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAyMHB4IDA7CiAgICAgIH0KCiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgOmhvc3QgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLyogVE9ETyhjYWlzKTogVGhpcyBuZWVkcyB3b3JrOiB0aGUgdGFibGUgc2hvdWxkbid0IGdldCB0b28gd2lkZSB3aGVuCiAgICAgICAgIHRoZXJlIGFyZSBtYW55IGZlZWRzL2ZldGNoZXMvdGFyZ3RlIG5hbWVzLiAqLwogICAgICAuc2Vzc2lvbi1ydW5zLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZCAxcHggYmxhY2s7CiAgICAgICAgdGFibGUtbGF5b3V0OiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgIC5hY3RpdmUtc2Vzc2lvbi1ydW4gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLnNvbGUtYWN0aXZlLXNlc3Npb24tcnVuIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTcyLCAyMzIsIDE4OCk7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50IHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50OmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNvdXJjZS1jb2RlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImZ1bGxTdGFja0RpYWxvZyIgaGlkZGVuJD0iW1shX2Z1bGxTdGFja1Nob3duXV0iPgogICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iZmlsdGVyLWxpc3QiIGRpc2FibGVkPSJ0cnVlIj4KICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIEZ1bGwgU3RhY2sgVHJhY2Ugb2YgTm9kZToKICAgICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLW5vZGUtbmFtZSI+IltbX2Z1bGxTdGFja05vZGVOYW1lXV0iPC9kaXY+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImNsb3NlIiBpZD0iY2xvc2UtZnVsbC1zdGFjay1idXR0b24iIHRpdGxlPSJDbG9zZSBGdWxsIFN0YWNrIiBvbi10YXA9Il9jbG9zZUZ1bGxTdGFja0RpYWxvZyI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDx1bCBpZD0iZnVsbC1zdGFjay1jb250ZW50Ij48L3VsPgogICAgPC9kaXY+CiAgICA8cGFwZXItdGFicyBpZD0ic291cmNlLWZpbGVzLXRhYnMiIHNlbGVjdGVkPSJ7e19maWxlUGF0aFNlbGVjdGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zaG9ydEZpbGVQYXRoc11dIj4KICAgICAgICA8cGFwZXItdGFiIGlkPSJbW2l0ZW0uaWRdXSI+W1tpdGVtLm5hbWVdXTwvcGFwZXItdGFiPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci10YWJzPgogICAgPGRpdiBpZD0ic291cmNlLWZpbGUtY29udGVudCIgY2xhc3M9InNvdXJjZS1jb250ZW50Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZmlsZUxpbmVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJ7e2l0ZW0uc291cmNlQ2xhc3N9fSIgaWQ9InNvdXJjZS1saW5lLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtbnVtYmVyIiBpZD0ic291cmNlLWxpbmVuby1bW2l0ZW0ubGluZW5vXV0iPgogICAgICAgICAgICBbW2l0ZW0ubGluZW5vXV0KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSIgaWQ9InNvdXJjZS1saW5lLW5vZGUtdG9nZ2xlLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICAgIFtbaXRlbS5udW1Ob2Rlc11dCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtdGV4dCIgaWQ9InNvdXJjZS1saW5lLXRleHQtW1tpdGVtLmxpbmVub11dIj4KICAgICAgICAgICAgW1tpdGVtLnRleHRdXQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPGRpdiBjbGFzcz0ic291cmNlLWxpbmUtbm9kZXMiIGlkPSJzb3VyY2UtbGluZS1ub2Rlcy1bW2l0ZW0ubGluZW5vXV0iPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzb3VyY2UtZmlsZXMtdGFicyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogOCU7CiAgICAgIH0KICAgICAgLnNvdXJjZS1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiA5MCU7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICBvdmVyZmxvdy14OiBzY3JvbGw7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CiAgICAgIC5zb3VyY2UtY29udGVudCA6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmMDA7CiAgICAgIH0KICAgICAgLmhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1udW1iZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjb2xvcjogbGlnaHRibHVlOwogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuc291cmNlLWxpbmUtbm9kZXMgewogICAgICAgIHBhZGRpbmctbGVmdDogNGVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICBtYXJnaW4tdG9wOiAwZW07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMGVtOwogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLWVudHJ5IHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLW5vZGVzIHNwYW4gewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLXRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgI2Z1bGxTdGFja0RpYWxvZyB7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHdpZHRoOiA0NSU7CiAgICAgICAgaGVpZ2h0OiA4NSU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2RkZDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLW5vZGUtbmFtZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgOmhvc3QgI2Z1bGwtc3RhY2stY29udGVudCB7CiAgICAgICAgcGFkZGluZy10b3A6IDFlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KICAgICAgLnN0YWNrLWZyYW1lLWNsaWNrYWJsZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5zdGFjay1mcmFtZS1ub25jbGlja2FibGUgewogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICB9CiAgICAgICNjbG9zZS1mdWxsLXN0YWNrLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yLWRhdGEtc3VtbWFyeSI+CiAgPHRlbXBsYXRlPgogICAgPHNwYW4gY2xhc3M9InNlY3Rpb24tdGl0bGUiPlRlbnNvciBWYWx1ZSBPdmVydmlldzwvc3Bhbj4KICAgIDxkaXYgaWQ9InRlbnNvci1kYXRhLWRpdiIgY2xhc3M9InRlbnNvci1kYXRhLWRpdiI+CiAgICAgIDx0YWJsZSBpZD0idGVuc29yLWRhdGEtdGFibGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0idGVuc29yLWRhdGEtdGFibGUiPgogICAgICAgIDx0aGVhZD4KICAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgIDx0aD5UZW5zb3I8L3RoPgogICAgICAgICAgICA8dGg+Q291bnQ8L3RoPgogICAgICAgICAgICA8dGg+RFR5cGU8L3RoPgogICAgICAgICAgICA8dGg+U2hhcGU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+VmFsdWU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+CiAgICAgICAgICAgICAgSGVhbHRoIFBpbGwKICAgICAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0ic2hvdy1oZWFsdGgtcGlsbHMiIGNoZWNrZWQ9Int7X2hlYWx0aFBpbGxzRW5hYmxlZH19Ij4KICAgICAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWNhcmQ+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFsdGgtcGlsbC1sZWdlbmQiIGlkPSJoZWFsdGgtcGlsbC1sZWdlbmQiPjwvZGl2PgogICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgPHRoIHdpZHRoPSI1JSI+PC90aD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCAjdGVuc29yLWRhdGEtZGl2IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IC5pbmRlbnRlZC1sZXZlbC1jb250YWluZXIgLmNvbnRlbnQtY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDEwcHg7CiAgICAgIH0KICAgICAgOmhvc3QgLnRlbnNvci1kYXRhLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgIH0KICAgICAgOmhvc3QgI3RlbnNvci1kYXRhLXRhYmxlIHRoIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CiAgICAgIDpob3N0IC5hY3RpdmUtdGVuc29yIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGJvcmRlcjogc29saWQgMXB4ICM4ODg7CiAgICAgIH0KICAgICAgOmhvc3QgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIDpob3N0IC5oZWFsdGgtcGlsbC1sZWdlbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIDpob3N0ICNzaG93LWhlYWx0aC1waWxscyB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayA6aG92ZXIgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICB9CiAgICAgIC5oZWFsdGgtcGlsbCA6aG92ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxzdHlsZT4vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLnRlbnNvci13aWRnZXQgewogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxNHB4OwogIG92ZXJmbG93LXg6IGhpZGRlbjsKICBvdmVyZmxvdy15OiBoaWRkZW47CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoudGVuc29yLXdpZGdldC1kaW0gewogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICBtYXJnaW4tbGVmdDogMTVweDsKICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiAgcGFkZGluZzogMnB4Owp9CgoudGVuc29yLXdpZGdldC1kaW0tY29tbWEgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDEwMCwgMTgwLCAyNTUpOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1kaW0tYnJhY2tldHMgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0Owp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgd2lkdGg6IDE4MHB4OwogIHotaW5kZXg6IDEwMDA7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0gewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTgwLCAxODAsIDE4MCk7CiAgZm9udC1zaXplOiAxMnB4OwogIHBhZGRpbmc6IDNweDsKICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigxMDAsIDE4MCwgMjU1KTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUgewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDYwLCA2MCwgNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDhwdDsKICBoZWlnaHQ6IDQ4cHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwYWRkaW5nLWxlZnQ6IDE0cHg7CiAgcGFkZGluZy1yaWdodDogMTBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUtbGFiZWwgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7Cn0KCi50ZW5zb3Itd2lkZ2V0LWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MiwgMjUyLCAyNTIpOwogIGJveC1zaGFkb3c6IDJweCAycHggMnB4ICNiMGIwYjA7CiAgaGVpZ2h0OiA0MHB4OwogIGxpbmUtaGVpZ2h0OiA0MHB4OwogIG1heC1oZWlnaHQ6IDQwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDEwMCU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWluZm8gewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDAsIDAsIDI1NSk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogMjJweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXJnaW4tbGVmdDogOHB4OwogIG1heC1oZWlnaHQ6IDIycHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWIgewogIGNvbG9yOiByZ2IoMzIsIDMzLCAzNik7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LXNpemU6IDE2cHg7CiAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1tZW51LXRodW1iOmhvdmVyIHsKICBjb2xvcjogcmdiKDIyNywgMTE2LCAwKTsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUgewogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1sZWZ0OiAxMnB4Owp9CgoudGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLXZhbHVlIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNsaWNpbmctZ3JvdXAgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTAsIDI1MCwgMjUwKTsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDE5MCwgMTkwLCAxOTApOwogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMThweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgcGFkZGluZy1ib3R0b206IDVweDsKICBwYWRkaW5nLXRvcDogNXB4Owp9CgoudGVuc29yLXdpZGdldC10ZW5zb3ItbmFtZSB7CiAgY29sb3I6IGJsYWNrOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtbGVmdC1ydWxlci10aWNrIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yKTsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci10b3A6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm94LXNoYWRvdzogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjb2xvcjogcmdiKDExMCwgMTEwLCAxMTApOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMjlweDsKICBsaW5lLWhlaWdodDogMjlweDsKICBtYXJnaW4tbGVmdDogMHB4OwogIG1heC13aWR0aDogNDVweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0MCwgMjQwLCAyNDApOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBib3gtc2hhZG93OiAxcHggMXB4IDFweCAjYjBiMGIwOwogIGRpc3BsYXk6IG5vbmU7CiAgZm9udC1zaXplOiAxM3B4OwogIHBhZGRpbmc6IDVweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgd2lkdGg6IDI0MHB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2lkdGg6IDk1JTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSB7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIHBhZGRpbmctcmlnaHQ6IDJweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2IHsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci1yaWdodDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogODAlOwogIGhlaWdodDogMjRweDsKICBsaW5lLWhlaWdodDogMjRweDsKICBtYXgtd2lkdGg6IDQ1cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHVzZXItc2VsZWN0OiBub25lOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDQ1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24gewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IHsKICBib3JkZXItbGVmdDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCB7CiAgYm9yZGVyLXJpZ2h0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCB7CiAgYm9yZGVyLXRvcDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiB7CiAgLS1ib3JkZXItc3R5bGU6IDFweCBzb2xpZCByZ2IoMTQwLCAxNDAsIDE0MCk7CiAgLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEwLCAyMTAsIDIxMCk7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1yb3cgewogIGhlaWdodDogMjVweDsKICBsaW5lLWhlaWdodDogMjVweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Cjwvc3R5bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGVuc29yLXdpZGdldC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoudGVuc29yLXdpZGdldCB7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDE0cHg7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IGhpZGRlbjsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbSB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIG1hcmdpbi1yaWdodDogMTVweDsKICBwYWRkaW5nOiAycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1jb21tYSB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIHsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTAwLCAxODAsIDI1NSk7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjgsIDEyOCwgMTI4KTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGN1cnNvcjogcG9pbnRlcjsKICB3aWR0aDogMTgwcHg7CiAgei1pbmRleDogMTAwMDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigxODAsIDE4MCwgMTgwKTsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogM3B4OwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEwMCwgMTgwLCAyNTUpOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWRpc2FibGVkIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZSB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogNDhweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXgtaGVpZ2h0OiAyMnB4OwogIHBhZGRpbmctbGVmdDogMTRweDsKICBwYWRkaW5nLXJpZ2h0OiAxMHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtaGVhZGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUyLCAyNTIsIDI1Mik7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBoZWlnaHQ6IDQwcHg7CiAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgbWF4LWhlaWdodDogNDBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogMTAwJTsKfQoKLnRlbnNvci13aWRnZXQtaW5mbyB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoMCwgMCwgMjU1KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7CiAgaGVpZ2h0OiAyMnB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIG1hcmdpbi1sZWZ0OiA4cHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtbWVudS10aHVtYiB7CiAgY29sb3I6IHJnYigzMiwgMzMsIDM2KTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtc2l6ZTogMTZweDsKICBtYXJnaW4tbGVmdDogMTBweDsKICBtYXJnaW4tcmlnaHQ6IDVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWI6aG92ZXIgewogIGNvbG9yOiByZ2IoMjI3LCAxMTYsIDApOwp9CgoudGVuc29yLXdpZGdldC1zaGFwZSB7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLWxlZnQ6IDEycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUtdmFsdWUgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTkwLCAxOTAsIDE5MCk7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxOHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBwYWRkaW5nLWJvdHRvbTogNXB4OwogIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIHsKICBjb2xvcjogYmxhY2s7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1sZWZ0LXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3gtc2hhZG93OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyOXB4OwogIGxpbmUtaGVpZ2h0OiAyOXB4OwogIG1hcmdpbi1sZWZ0OiAwcHg7CiAgbWF4LXdpZHRoOiA0NXB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXIgewogIGhlaWdodDogMjRweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGJveC1zaGFkb3c6IDFweCAxcHggMXB4ICNiMGIwYjA7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEzcHg7CiAgcGFkZGluZzogNXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB3aWR0aDogMjQwcHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtY29sb3JiYXIgewogIGhlaWdodDogMjRweDsKICB3aWR0aDogOTUlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWluZGljZXMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIHsKICBtYXJnaW4tdG9wOiAyMHB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayB7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnVsZXItYmFja2dyb3VuZC1jb2xvcik7CiAgYm9yZGVyLWJvdHRvbTogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3JkZXItcmlnaHQ6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDI0cHg7CiAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYgewogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4MCU7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIG1heC13aWR0aDogNDVweDsKICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIHsKICBib3JkZXItYm90dG9tOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWxlZnQgewogIGJvcmRlci1sZWZ0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0IHsKICBib3JkZXItcmlnaHQ6IDAuNXB4IHNvbGlkIGJsdWU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIHsKICBib3JkZXItdG9wOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1zZWN0aW9uIHsKICAtLWJvcmRlci1zdHlsZTogMXB4IHNvbGlkIHJnYigxNDAsIDE0MCwgMTQwKTsKICAtLXJ1bGVyLWJhY2tncm91bmQtY29sb3I6IHJnYigyMTAsIDIxMCwgMjEwKTsKICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXJvdyB7CiAgaGVpZ2h0OiAyNXB4OwogIGxpbmUtaGVpZ2h0OiAyNXB4OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDx2ei1saW5lLWNoYXJ0MiB4LWNvbXBvbmVudHMtY3JlYXRpb24tbWV0aG9kPSJbW19saW5lQ2hhcnRYQ29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHktdmFsdWUtYWNjZXNzb3I9IltbX2xpbmVDaGFydFlWYWx1ZUFjY2Vzc29yXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnNdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWRdXSI+PC92ei1saW5lLWNoYXJ0Mj4KICAgIDxzdHlsZT4KICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIGhlaWdodDogMzAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3ItdmFsdWUtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0ZW5zb3JWYWx1ZVRvYXN0IiB0ZXh0PSIiIGFsd2F5cy1vbi10b3A+PC9wYXBlci10b2FzdD4KICAgIDx0YWJsZSBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGFibGUiPgogICAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9InRlbnNvci1uYW1lIiBvbi10YXA9InRlbnNvck5hbWVDYWxsYmFjayI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRlbnNvci1uYW1lLXRleHQiPltbdGVuc29yTmFtZV1dPC9zcGFuPgogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJjbG9zZSIgY2xhc3M9InZhbHVlLXZpZXctaWNvbi1idXR0b24iIGlkPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiB0aXRsZT0iQ2xvc2UiIG9uLXRhcD0iY2xvc2VCdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImZvcndhcmQiIGNsYXNzPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiBpZD0idmFsdWUtdmlldy1pY29uLWJ1dHRvbiIgdGl0bGU9IkNvbnRpbnVlIHRvIiBvbi10YXA9ImNvbnRpbnVlVG9CdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0idGVuc29yLXZhbHVlLXZhbHVlLXRyIj4KICAgICAgICA8dGQ+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPGRpdiBpZD0idGVuc29yLXdpZGdldCI+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9ImRlYnVnLW9wIj48L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlNsaWNpbmciIGlkPSJzbGljaW5nIiB2YWx1ZT0ie3tzbGljaW5nfX0iIG9uLWNoYW5nZT0icmVmcmVzaCI+CiAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlRpbWUgSW5kaWNlcyIgaWQ9InRpbWUtaW5kaWNlcyIgdmFsdWU9Int7dGltZUluZGljZXN9fSIgb24tY2hhbmdlPSJyZWZyZXNoIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBpZD0idGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iIGNsYXNzPSJ0ZW5zb3ItdmFsdWUtYnV0dG9ucyIgb24tY2xpY2s9Il90aW1lSW5kaWNlc1RvZ2dsZUJ1dHRvbkNhbGxiYWNrIj5GdWxsIEhpc3Rvcnk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgPC9kaXY+PC90ZW1wbGF0ZT48L3RkPjx0ZCBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlU2NhbGFyXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgY2xhc3M9ImlubGluZSIgbGFiZWw9IlNjYWxhciBWYWx1ZSIgaWQ9InZhbHVlLXNjYWxhciIgdmFsdWU9IltbX2RhdGFTY2FsYXJdXSI+CiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlTGluZUNoYXJ0XV0iPgogICAgICAgICAgICAgICAgICA8dGYtZGVidWdnZXItbGluZS1jaGFydCBkYXRhPSJbW19saW5lQ2hhcnREYXRhXV0iPjwvdGYtZGVidWdnZXItbGluZS1jaGFydD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVmFsdWVJbWFnZV1dIj4KICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0idmFsdWUtaW1hZ2UiIGhlaWdodD0iMjUwcHgiIHdpZHRoPSIyNTBweCIgc3JjJD0iW1tfZGF0YUltYWdlU3JjXV0iPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAKICAgICAgICAgIAogICAgICAgIAogICAgICA8L3RyPgogICAgPC90YWJsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGVuc29yLXdpZGdldC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnRlbnNvci12YWx1ZS1idXR0b25zIHsKICAgICAgICBoZWlnaHQ6IDc1JTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIH0KICAgICAgLnRlbnNvci12YWx1ZS12aWV3LXRhYmxlIHsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLXRhYmxlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiA1cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggMXB4IDFweCAjZDhkOGQ4OwogICAgICB9CiAgICAgIC50ZW5zb3ItdmFsdWUtdmlldy10ZCB7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICB9CiAgICAgIC52YWx1ZS1jYXJkLWlucHV0IHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KICAgICAgI3RlbnNvci1uYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC50ZW5zb3ItbmFtZS10ZXh0IHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAjZGVidWctb3AgewogICAgICAgIGZvbnQtc2l6ZTogOTAlOwogICAgICB9CiAgICAgIC52YWx1ZS1pbWFnZSB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgIH0KICAgICAgLnZhbHVlLXZpZXctaWNvbi1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgI3RlbnNvci13aWRnZXQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICAgICAgICAvKiBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogICAgICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7ICovCiAgICAgICAgaGVpZ2h0OiAyODBweDsKICAgICAgICB3aWR0aDogNDg0cHg7CiAgICAgIH0KICAgICAgI3NsaWNpbmcsCiAgICAgICN0aW1lLWluZGljZXMgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtdWx0aVZpZXciPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UZW5zb3IgVmFsdWVzPC9kaXY+CiAgICAgIDxkaXYgaWQ9Im11bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAjbXVsdGlWaWV3IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogM3B4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2VlZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0b2FzdCIgdGV4dD0iIiBhbHdheXMtb24tdG9wPjwvcGFwZXItdG9hc3Q+CiAgICA8dGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cgaWQ9ImluaXRpYWxEaWFsb2ciPjwvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2c+CiAgICAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBpZD0ibGVmdC1wYW5lIj4KICAgICAgICA8ZGl2IGlkPSJub2RlLWVudHJpZXMiIGNsYXNzPSJub2RlLWVudHJpZXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+UnVudGltZSBOb2RlIExpc3Q8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSI+CiAgICAgICAgICAgIFNob3cgQ29kZToKICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSIgaWQ9InNob3ctc291cmNlLWNvZGUiIGNoZWNrZWQ9Int7X3NvdXJjZUNvZGVTaG93bn19Ij48L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0Zi1vcC1zZWxlY3RvciBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZGVidWctd2F0Y2gtY2hhbmdlPSJbW19jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZm9yY2UtZXhwYW5kLWFuZC1jaGVjay1ub2RlLW5hbWU9IltbX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZV1dIiBmb3JjZS1leHBhbmQtbm9kZS1uYW1lPSJbW19mb3JjZUV4cGFuZE5vZGVOYW1lXV0iPgogICAgICAgICAgPC90Zi1vcC1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzb3VyY2UtY29kZS12aWV3LWRpdiIgY2xhc3M9InNvdXJjZS1jb2RlLXZpZXctZGl2IiBoaWRkZW4kPSJ7eyFfc291cmNlQ29kZVNob3dufX0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+U291cmNlIENvZGU8L2Rpdj4KICAgICAgICAgIDx0Zi1zb3VyY2UtY29kZS12aWV3IGlkPSJzb3VyY2VDb2RlVmlldyIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZm9jdXMtbm9kZS1uYW1lPSJbW19zb3VyY2VGb2N1c05vZGVOYW1lXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgY29udGludWUtdG8tbm9kZT0iW1tfY3JlYXRlQ29udGludWVUb05vZGVIYW5kbGVyKCldXSI+PC90Zi1zb3VyY2UtY29kZS12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDx0Zi1kZWJ1Z2dlci1yZXNpemVyIGN1cnJlbnQtbGVuZ3RoPSJ7e19sZWZ0UGFuZVdpZHRofX0iIG1pbi1sZW5ndGg9IltbX21pbmxlZnRQYW5lV2lkdGhdXSIgbWF4LWxlbmd0aD0iW1tfbWF4bGVmdFBhbmVXaWR0aF1dIj4KICAgICAgICA8L3RmLWRlYnVnZ2VyLXJlc2l6ZXI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0Zi1zZXNzaW9uLXJ1bnMtdmlldyBpZD0ic2Vzc2lvblJ1bnNWaWV3IiBsYXRlc3Qtc2Vzc2lvbi1ydW49IltbX2xhdGVzdFNlc3Npb25SdW5dXSIgc2Vzc2lvbi1ydW4ta2V5LXRvLWRldmljZS1uYW1lcz0iW1tfc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc11dIiBzb2xlLWFjdGl2ZT0iW1tfc2Vzc2lvblJ1blNvbGVBY3RpdmVdXSIgbm9kZS1vci10ZW5zb3ItY2xpY2tlZD0iW1tfY3JlYXRlRmVlZEZldGNoVGFyZ2V0Q2xpY2tlZEhhbmRsZXIoKV1dIj4KICAgICAgICAgIDwvdGYtc2Vzc2lvbi1ydW5zLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucy1jb250YWluZXIiPgogICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9zdGVwIj4KICAgICAgICAgICAgPHNwYW4+W1tfc3RlcEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPHRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyBpZD0iY29udGludWVEaWFsb2ciIHNlc3Npb24tcnVuLWdvPSJbW19jcmVhdGVTZXNzaW9uUnVuR28oKV1dIiB0ZW5zb3ItY29uZGl0aW9uLWdvPSJbW19jcmVhdGVUZW5zb3JDb25kaXRpb25HbygpXV0iIGZvcmNlLWNvbnRpbnVhdGlvbi1zdG9wPSJbW19jcmVhdGVGb3JjZUNvbnRpbnVhdGlvblN0b3AoKV1dIj4KICAgICAgICAgIDwvdGYtZGVidWdnZXItY29udGludWUtZGlhbG9nPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8dGYtZ3JhcGgtbG9hZGVyIGlkPSJsb2FkZXIiIG91dC1ncmFwaC1oaWVyYXJjaHk9Int7Z3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e2dyYXBofX0iIG91dC1zdGF0cz0ie3tzdGF0c319IiBwcm9ncmVzcz0ie3tfZ3JhcGhQcm9ncmVzc319Ij48L3RmLWdyYXBoLWxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIiBpZD0iY2VudGVyLWNvbnRlbnQiPgogICAgICAgIDxkaXYgaWQ9InRvcC1yaWdodC1xdWFkcmFudCI+CiAgICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfdG9wUmlnaHRTZWxlY3RlZH19Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdG9wUmlnaHRUYWJzXV0iPgogICAgICAgICAgICAgIDxwYXBlci10YWIgaWQ9IltbaXRlbS5pZF1dIj5bW2l0ZW0ubmFtZV1dPC9wYXBlci10YWI+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJydW50aW1lLWdyYXBoLWRldmljZSI+CiAgICAgICAgICAgIDxzcGFuIGlkPSJydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIj4gPC9zcGFuPgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0iYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iRGV2aWNlIG5hbWUiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNdXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgY2xhc3M9InNwaW5uZXIiIGlkPSJ0b3AtcmlnaHQtc3Bpbm5lciIgaGlkZGVuPSJbWyFfYnVzeV1dIiBhY3RpdmU9IltbX2J1c3ldXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgaWQ9InRvcC1yaWdodC1wcm9ncmVzcy1iYXIiIHZhbHVlPSIwIj48L3BhcGVyLXByb2dyZXNzPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZV1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iZ3JhcGgtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8dGYtZ3JhcGggaWQ9ImdyYXBoIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgYmFzaWMtZ3JhcGg9IltbZ3JhcGhdXSIgc3RhdHM9Iltbc3RhdHNdXSIgcHJvZ3Jlc3M9Int7X2dyYXBoUHJvZ3Jlc3N9fSIgY29sb3ItYnk9InN0cnVjdHVyZSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW19jcmVhdGVOb2RlQ29udGV4dE1lbnVJdGVtcygpXV0iPjwvdGYtZ3JhcGg+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGV4dC1tZW51Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlXV0iPgogICAgICAgICAgICA8dGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXcgaWQ9InRlbnNvclZhbHVlTXVsdGlWaWV3IiBjb250aW51ZS10by1jYWxsYmFjaz0iW1tfY3JlYXRlQ29udGludWVUb0NhbGxiYWNrKCldXSIgdGVuc29yLW5hbWUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZ2V0LWhlYWx0aC1waWxsPSJbW19jcmVhdGVHZXRIZWFsdGhQaWxsKCldXSI+CiAgICAgICAgICAgIDwvdGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8dGYtZGVidWdnZXItcmVzaXplciBpcy1ob3Jpem9udGFsPSJ0cnVlIiBjdXJyZW50LWxlbmd0aD0ie3tfdG9wUmlnaHRRdWFkcmFudEhlaWdodH19IiBtaW4tbGVuZ3RoPSJbW19taW5Ub3BSaWdodFF1YWRyYW50SGVpZ2h0XV0iIG1heC1sZW5ndGg9IltbX21heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHRdXSI+CiAgICAgICAgPC90Zi1kZWJ1Z2dlci1yZXNpemVyPgoKICAgICAgICA8ZGl2IGlkPSJ0ZW5zb3ItZGF0YSIgY2xhc3M9InRlbnNvci1kYXRhIj4KICAgICAgICAgIDx0Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5IGlkPSJ0ZW5zb3JEYXRhU3VtbWFyeSIgbGF0ZXN0LXRlbnNvci1kYXRhPSJbW19sYXRlc3RUZW5zb3JEYXRhXV0iIGV4cGFuZC1oYW5kbGVyPSJbW19jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpXV0iIGNvbnRpbnVlLXRvLWNhbGxiYWNrPSJbW19jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKV1dIiBoaWdobGlnaHRlZC1ub2RlLW5hbWU9IltbX2hpZ2hsaWdodE5vZGVOYW1lXV0iIHRlbnNvci1uYW1lLWNsaWNrZWQ9IltbX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpXV0iIGdldC1oZWFsdGgtcGlsbD0iW1tfY3JlYXRlR2V0SGVhbHRoUGlsbCgpXV0iPgogICAgICAgICAgPC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIHBhcGVyLXRvYXN0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIHdpZHRoOiA0MHZ3OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzMHZ3OwogICAgICB9CiAgICAgIHRmLWRhc2hib2FyZC1sYXlvdXQgewogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzOiBhdXRvOwogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aDogbm9uZTsKICAgICAgICAtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGg6IG5vbmU7CiAgICAgIH0KICAgICAgLmRlYnVnZ2VyLXNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICBwYXBlci10YWJzIHsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIHBhcGVyLXRhYi5pcm9uLXNlbGVjdGVkIHsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgI2luaXRpYWxEaWFsb2cgewogICAgICAgIC8qKiBUaGlzIG1hdGNoZXMgdGhlIGRlZmF1bHQgei1pbmRleCBvZiBwYXBlci1kaWFsb2cgYmFja2Ryb3BzLiAqLwogICAgICAgIHotaW5kZXg6IDEwMjsKICAgICAgfQogICAgICAvKiogUmVzaXplIHRoZSByZWdpb24gZm9yIHRoZSBncmFwaCBhcyB0aGUgdXNlciByZXNpemVzIHRoZSByZWdpb24uICovCiAgICAgICNncmFwaC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMTIwcHgpOwogICAgICAgIC8qKiBDbGlwIHRoZSBtaW5pbWFwIGlmIHRoZSBoZWlnaHQgb2YgdGhlIGdyYXBoIGNvbnRhaW5lciBpcyBzbWFsbC4gKi8KICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAjZ3JhcGggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmctbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEzcHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgICN4LXR5cGUtc2VsZWN0b3IgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDVweCAzcHg7CiAgICAgIH0KICAgICAgLnJ1bnRpbWUtZ3JhcGgtZGV2aWNlIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgICNydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgICNhY3RpdmUtcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiA4NSU7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuc2lkZWJhciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtZGVidWdnZXItcmVzaXplciB7CiAgICAgICAgcmlnaHQ6IC0xMHB4OwogICAgICB9CiAgICAgICNjZW50ZXItY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIC8qKiBUaGUgcmVzaXplciBzaG91bGQgaGF2ZSBubyBzcGFjZSB0byB0aGUgbGVmdCBvZiBpdC4gKi8KICAgICAgI2NlbnRlci1jb250ZW50IHRmLWRlYnVnZ2VyLXJlc2l6ZXJbaXMtaG9yaXpvbnRhbF0gewogICAgICAgIG1hcmdpbi1sZWZ0OiAtMjNweDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CiAgICAgIC5zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAubm9kZS1lbnRyaWVzIHsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDgwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc291cmNlLWNvZGUtdmlldy1kaXYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDQwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgICNzZXNzaW9uUnVuc1ZpZXcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiAyNXZoOwogICAgICB9CiAgICAgIC5idXR0b25zLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogMjBweCAwOwogICAgICB9CiAgICAgICN0ZW5zb3ItZGF0YSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDIwcHggMDsKICAgICAgICBtYXJnaW46IDAgMCAyMHB4IDA7CiAgICAgIH0KICAgICAgI3RlbnNvckRhdGFTdW1tYXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CiAgICAgICN0b3AtcmlnaHQtcXVhZHJhbnQgewogICAgICAgIGhlaWdodDogNjYlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC50b2dnbGUtc291cmNlLWNvZGUgewogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICAgIGZvbnQtc2l6ZTogODAlOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGkgewogICAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICB9CiAgICAgIC5pbmxpbmUsCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydCB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItbWF0ZXJpYWwtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIHsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgewogICAgICAgIG1hcmdpbjogMTBweCAxMHB4IDEwcHggMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1wcmV2aWV3IHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtYXJnaW46IDAgMTBweCAwIDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAuY29sb3ItbGFiZWwsCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBjb2xvcjogIzc3NzsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgICBsaW5lLWhlaWdodDogMjZweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLnRlbnNvci1jb3VudCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZSBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nCiAgICogMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMgd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwKICAgKiBhbmQgYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICogQXBwYXJlbnRseSwgdGhlIHBhcGVyLXNsaWRlciBsYWNrcyBhIG1peGluIGZvciB0aG9zZSBwYWRkaW5nIHZhbHVlcy4gKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHRkIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIHdpZHRoOiA4MHB4OwogICAgICB9CgogICAgICAudGVuc29yLWRldmljZS10ZCB7CiAgICAgICAgbWF4LXdpZHRoOiAxNDBweDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGU6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5kZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCB7CiAgICAgICAgd2lkdGg6IDEzMHB4OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCA+IGRpdiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgI2V2ZW50LWNvdW50cy10aCB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyNTUsIDE0MSwgMCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5wb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMCwgNjIsIDIxMik7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMjA0LCA0NywgNDQpOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24sCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5uby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24gewogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJjYXJkIGhlYWx0aC1waWxsLWxlZ2VuZCI+CiAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICBFbmFibGUgYWxsIChub3QganVzdCBzYW1wbGVkKSBzdGVwcy4gUmVxdWlyZXMgc2xvdyBkaXNrIHJlYWQuCiAgICAgIDwvZGl2PgogICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0iZW5hYmxlQWxsU3RlcHNNb2RlVG9nZ2xlIiBjaGVja2VkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSI+CiAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgPGgyPgogICAgICAgIFN0ZXAgb2YgSGVhbHRoIFBpbGxzOgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IiBtaW49IjAiIG1heD0iW1tfYmlnZ2VzdFN0ZXBFdmVyU2Vlbl1dIiB2YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOjppbnB1dH19Ij4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICAgIFtbX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlXV0KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIWFyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBpZD0iaGVhbHRoLXBpbGxzLWxvYWRpbmctc3Bpbm5lciI+PC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIiBpbW1lZGlhdGUtdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBtYXg9IltbX2JpZ2dlc3RTdGVwRXZlclNlZW5dXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWF4U3RlcEluZGV4XV0iPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIiIGltbWVkaWF0ZS12YWx1ZT0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIG1heD0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGgyPgogICAgICAgIEhlYWx0aCBQaWxsCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGVdXSI+CiAgICAgICAgICBDb3VudHMgZm9yIFNlbGVjdGVkIE5vZGUKICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZV1dIj4KICAgICAgICAgIExlZ2VuZAogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaGVhbHRoUGlsbEVudHJpZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhbHRoLXBpbGwtZW50cnkiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItcHJldmlldyIgc3R5bGU9ImJhY2tncm91bmQ6W1tpdGVtLmJhY2tncm91bmRfY29sb3JdXSI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sYWJlbCI+W1tpdGVtLmxhYmVsXV08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRlbnNvci1jb3VudCI+CiAgICAgICAgICAgIFtbX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZyhoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlLAogICAgICAgICAgICBpbmRleCldXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyhkZWJ1Z2dlck51bWVyaWNBbGVydHMpXV0iPgogICAgICAgIDxoMiBpZD0ibnVtZXJpYy1hbGVydHMtaGVhZGVyIj5OdW1lcmljIEFsZXJ0czwvaDI+CiAgICAgICAgPHA+CiAgICAgICAgICBBbGVydHMgYXJlIHNvcnRlZCBmcm9tIHRvcCB0byBib3R0b20gYnkgaW5jcmVhc2luZyB0aW1lc3RhbXAuCiAgICAgICAgCiAgICAgICAgPGRpdiBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUtY29udGFpbmVyIj4KICAgICAgICAgIDx0YWJsZSBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUiPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpcnN0IE9mZmVuc2U8L3RoPgogICAgICAgICAgICAgICAgPHRoPlRlbnNvciAoRGV2aWNlKTwvdGg+CiAgICAgICAgICAgICAgICA8dGggaWQ9ImV2ZW50LWNvdW50cy10aCI+RXZlbnQgQ291bnRzPC90aD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHkgaWQ9Im51bWVyaWMtYWxlcnRzLWJvZHkiPjwvdGJvZHk+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSI+CiAgICAgICAgPHAgY2xhc3M9Im5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiI+CiAgICAgICAgICBObyBudW1lcmljIGFsZXJ0cyBzbyBmYXIuIFRoYXQgaXMgbGlrZWx5IGdvb2QuIEFsZXJ0cyBpbmRpY2F0ZSB0aGUKICAgICAgICAgIHByZXNlbmNlIG9mIE5hTiBvciAoKy8tKSBJbmZpbml0eSB2YWx1ZXMsIHdoaWNoIG1heSBiZSBjb25jZXJuaW5nLgogICAgICAgIAogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci1tYXRlcmlhbD4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWxpc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1heC1kZXZpY2UtcGl4ZWwtcmF0aW86IDEpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI2l0ZW1zIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWxpc3QtaXRlbXMtY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZ3JpZF0pKSAjaXRlbXMgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjaXRlbXMgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8YXJyYXktc2VsZWN0b3IgaWQ9InNlbGVjdG9yIiBpdGVtcz0ie3tpdGVtc319IiBzZWxlY3RlZD0ie3tzZWxlY3RlZEl0ZW1zfX0iIHNlbGVjdGVkLWl0ZW09Int7c2VsZWN0ZWRJdGVtfX0iPjwvYXJyYXktc2VsZWN0b3I+CgogICAgPGRpdiBpZD0iaXRlbXMiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWl0ZW0tYm9keSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsgLyogbmVlZGVkIGZvciB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcyB0byB3b3JrIG9uIGZmICovCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICB9CgogICAgICA6aG9zdChbdHdvLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXR3by1saW5lLW1pbi1oZWlnaHQsIDcycHgpOwogICAgICB9CgogICAgICA6aG9zdChbdGhyZWUtbGluZV0pIHsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLWJvZHktdGhyZWUtbGluZS1taW4taGVpZ2h0LCA4OHB4KTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoW3NlY29uZGFyeV0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeS1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtaWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAwOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtZWxsaXBzZSB7CiAgICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCwKICAgICAgLmZhZGVkLWVsbGlwc2UsCiAgICAgIC5mYWRlZC1zZXJpZXMgewogICAgICAgIHN0cm9rZTogdmFyKC0tdGItZ3JhcGgtZmFkZWQpICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxzdmcgaGVpZ2h0PSIwIiB3aWR0aD0iMCIgaWQ9InN2Z0RlZnMiPgogICAgICA8ZGVmcz4KICAgICAgICAKICAgICAgICA8cGF0dGVybiBpZD0icmVjdEhhdGNoIiBwYXR0ZXJudHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIgd2lkdGg9IjUiIGhlaWdodD0iNSIgcGF0dGVybnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNSIgc3R5bGU9InN0cm9rZS13aWR0aDogMSIgLz4KICAgICAgICA8L3BhdHRlcm4+CiAgICAgICAgPHBhdHRlcm4gaWQ9ImVsbGlwc2VIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjIiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGlkPSJzdW1tYXJ5LWljb24iIGZpbGw9IiM4NDg0ODQiIGhlaWdodD0iMTIiIHZpZXdib3g9IjAgMCAyNCAyNCIgd2lkdGg9IjEyIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2RlZnM+CiAgICA8L3N2Zz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdDT05TVCcpXV0iPgogICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxMCAxMCI+CiAgICAgICAgPGNpcmNsZSBjeD0iNSIgY3k9IjUiIHI9IjMiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU1VNTUFSWScpXV0iPgogICAgICA8c3ZnIHdpZHRoJD0iW1toZWlnaHRdXSIgaGVpZ2h0JD0iW1toZWlnaHRdXSIgdmlld2JveD0iMCAwIDI0IDI0IiBmaWxsPSIjODQ4NDg0Ij4KICAgICAgICA8cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnT1AnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTYgOCI+CiAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdlbGxpcHNlJyl9fSIgeD0iOCIgeT0iNCIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ01FVEEnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMzcgMTYiPgogICAgICAgIDxyZWN0IHg9IjEiIHk9IjEiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdyZWN0Jyl9fSIgc3Ryb2tlLXdpZHRoPSIycHgiIGhlaWdodD0iMTQiIHdpZHRoPSIzNSIgcng9IjUiIHJ5PSI1IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU0VSSUVTJyldXSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNiAxNSI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLXZlcnRpY2FsLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnc2VyaWVzJyl9fSIgeD0iMCIgeT0iMiIgLz4KICAgICAgICA8L3N2Zz4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyF2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAyNCAxMCI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdzZXJpZXMnKX19IiB4PSIwIiB5PSIxIiAvPgogICAgICAgIDwvc3ZnPgogICAgICA8L3RlbXBsYXRlPgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ub2RlLWljb24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgLS10Yi1ncmFwaC1mYWRlZDogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRmLWdyYXBoLWljb24gaWQ9Imljb24iIHR5cGU9IltbX2dldFR5cGUobm9kZSwgc3VtbWFyeSwgY29uc3QsIHR5cGUpXV0iIGhlaWdodD0iW1toZWlnaHRdXSIgZmlsbC1vdmVycmlkZT0iW1tfZmlsbE92ZXJyaWRlXV0iIHN0cm9rZS1vdmVycmlkZT0iW1tfZ2V0U3Ryb2tlT3ZlcnJpZGUoX2ZpbGxPdmVycmlkZSldXSIgZmFkZWQ9IltbX2dldEZhZGVkKHJlbmRlckluZm8pXV0iIHZlcnRpY2FsPSJbW19pc1ZlcnRpY2FsKG5vZGUsIHZlcnRpY2FsKV1dIj48L3RmLWdyYXBoLWljb24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAjbGlzdC1pdGVtIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIC5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuIHsKICAgICAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbS5leGNsdWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuLmVkZ2UtbGFiZWwgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmZhZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgIDwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXgtaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgLmluY29tcGF0aWJsZS1vcHMtbGlzdCB7CiAgICAgICAgaGVpZ2h0OiAzNTBweDsKICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICBpcm9uLWxpc3QgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGJhY2tncm91bmQ6ICNlOWU5ZTk7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIGNvbG9yOiAjNWU1ZTVlOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ub24tY29udHJvbC1saXN0LWl0ZW0gewogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC1kaXNwbGF5IHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgc3ZnLm9wLWNvbXBhdCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGhlaWdodDogMjVweDsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC12YWx1ZSB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pdGVtPgogICAgICA8cGFwZXItaXRlbS1ib2R5IHR3by1saW5lPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfZXhwYW5kZWQpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlRXhwYW5kZWQiIGNsYXNzPSJ0b2dnbGUtYnV0dG9uIj4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJub2RlLW5hbWUiIGlkPSJub2RldGl0bGUiPltbbm9kZVRpdGxlXV08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3AtY29tcGF0LWRpc3BsYXkiPgogICAgICAgICAgICAgIDxzdmcgY2xhc3M9Im9wLWNvbXBhdCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDI1MCAyNSI+CiAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgPGxpbmVhcmdyYWRpZW50IGlkPSJvcC1jb21wYXQtZmlsbCI+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BJbmNvbXBhdENvbG9yXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3IkPSJbW19vcEluY29tcGF0Q29sb3IgXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgPC9saW5lYXJncmFkaWVudD4KICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgIDxyZWN0IGhlaWdodD0iMjUiIHdpZHRoPSIyNTAiIHJ4PSI1IiByeT0iNSIgc3R5bGU9ImZpbGw6IHVybCgnI29wLWNvbXBhdC1maWxsJyk7IiAvPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wLWNvbXBhdC12YWx1ZSI+W1tfb3BDb21wYXRTY29yZUxhYmVsXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci1pdGVtLWJvZHk+CiAgICA8L3BhcGVyLWl0ZW0+CgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgSW5jb21wYXRpYmxlIE9wZXJhdGlvbnM6ICg8c3Bhbj5bW190b3RhbEluY29tcGF0T3BzXV08L3NwYW4+KQogICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0iaW5jb21wYXRpYmxlLW9wcy1saXN0IiBpZD0iaW5jb21wYXRpYmxlT3BzTGlzdCIgaXRlbXM9IltbX2luY29tcGF0aWJsZU9wTm9kZXNdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW19nZXRSZW5kZXJJbmZvKGl0ZW0ubmFtZSwgcmVuZGVySGllcmFyY2h5KV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGl0ZW0tdHlwZT0iaW5jb21wYXRpYmxlLW9wcyI+CiAgICAgICAgICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tY29sbGFwc2U+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbm9kZS1saXN0LWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3BhbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQwcHg7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0uZXhjbHVkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3Bhbi5lZGdlLWxhYmVsIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDFweDsKICAgICAgICBsZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPjwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJlZGdlLWxhYmVsIj5bW2VkZ2VMYWJlbF1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLW5vZGUtaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuc3ViLWxpc3QtZ3JvdXAgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMzAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CgogICAgICAuYXR0ci1sZWZ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICB3aWR0aDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLmF0dHItcmlnaHQgewogICAgICAgIG1hcmdpbi1sZWZ0OiAzMCU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogdGFibGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLXJvdyAuc3ViLWxpc3QtdGFibGUtY2VsbDpsYXN0LWNoaWxkIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLWNlbGwgewogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDsKICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICB9CgogICAgICBwYXBlci1pdGVtLWJvZHlbdHdvLWxpbmVdIHsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDRweDsKICAgICAgfQoKICAgICAgLmV4cGFuZGVkSW5mbyB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sRGVwcyB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgOHB4OwogICAgICB9CgogICAgICAubm9kZS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBmb250LXNpemU6IDE0cHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAuc3VidGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICBjb2xvcjogIzVlNWU1ZTsKICAgICAgfQoKICAgICAgLmNvbnRyb2xMaW5lIHsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuY29udHJvbC10b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGUtZ3JvdXAgewogICAgICAgIHBhZGRpbmctdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZSB7CiAgICAgICAgbWFyZ2luOiA1cHggNnB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB0OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAubm9uLWNvbnRyb2wtbGlzdC1pdGVtIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItaXRlbT4KICAgICAgPHBhcGVyLWl0ZW0tYm9keSB0d28tbGluZT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX2V4cGFuZGVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUV4cGFuZGVkIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIiBpZD0ibm9kZXRpdGxlIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDx0Zi1ub2RlLWljb24gY2xhc3M9Im5vZGUtaWNvbiIgbm9kZT0iW1tfbm9kZV1dIiByZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhncmFwaE5vZGVOYW1lLCByZW5kZXJIaWVyYXJjaHkpXV0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+PC90Zi1ub2RlLWljb24+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUub3B9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgICBPcGVyYXRpb246CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5vcF1dPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUubWV0YWdyYXBofX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgU3ViZ3JhcGg6CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5jYXJkaW5hbGl0eV1dPC9zcGFuPiBub2RlcwogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvcGFwZXItaXRlbS1ib2R5PgogICAgPC9wYXBlci1pdGVtPgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgYXR0cmlidXRlcyI+CiAgICAgICAgICAgIEF0dHJpYnV0ZXMgKDxzcGFuPltbX2F0dHJpYnV0ZXMubGVuZ3RoXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImF0dHJpYnV0ZXNMaXN0IiBpdGVtcz0iW1tfYXR0cmlidXRlc11dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPltbaXRlbS5rZXldXTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLXJpZ2h0Ij5bW2l0ZW0udmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2RldmljZX19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgZGV2aWNlIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPkRldmljZTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItcmlnaHQiPltbX2RldmljZV1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBwcmVkZWNlc3NvcnMiPgogICAgICAgICAgICBJbnB1dHMgKDxzcGFuPltbX3RvdGFsUHJlZGVjZXNzb3JzXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImlucHV0c0xpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMucmVndWxhcl1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0gY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIgY2FyZC1ub2RlPSJbW19ub2RlXV0iIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIgZWRnZS1sYWJlbD0iW1tpdGVtLmVkZ2VMYWJlbF1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgIDwvdGYtbm9kZS1saXN0LWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcHJlZGVjZXNzb3JzLmNvbnRyb2wubGVuZ3RoXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xEZXBzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xMaW5lIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX29wZW5lZENvbnRyb2xQcmVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xQcmVkIiBjbGFzcz0iY29udHJvbC10b2dnbGUtYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sUHJlZH19IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfb3BlbmVkQ29udHJvbFByZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0icHJlZGVjZXNzb3JzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHN1Y2Nlc3NvcnMiPgogICAgICAgICAgICBPdXRwdXRzICg8c3Bhbj5bW190b3RhbFN1Y2Nlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpZD0ib3V0cHV0c0xpc3QiIGl0ZW1zPSJbW19zdWNjZXNzb3JzLnJlZ3VsYXJdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGVkZ2UtbGFiZWw9IltbaXRlbS5lZGdlTGFiZWxdXSIgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgaXRlbS10eXBlPSJzdWNjZXNzb3IiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N1Y2Nlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfb3BlbmVkQ29udHJvbFN1Y2MpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlQ29udHJvbFN1Y2MiIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7X29wZW5lZENvbnRyb2xTdWNjfX0iIG5vLWFuaW1hdGlvbj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaXRlbXM9IltbX3N1Y2Nlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0ic3VjY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaGFzRGlzcGxheWFibGVOb2RlU3RhdHN9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIG5vZGUtc3RhdHMiPgogICAgICAgICAgICAgIE5vZGUgU3RhdHMKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy50b3RhbEJ5dGVzfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPk1lbW9yeTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXNdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2dldFRvdGFsTWljcm9zKF9ub2RlU3RhdHMpfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPkNvbXB1dGUgVGltZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWVdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy5vdXRwdXRTaXplfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPlRlbnNvciBPdXRwdXQgU2l6ZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW1dXSA8YnI+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2Z1bmN0aW9uVXNhZ2VzLmxlbmd0aF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgICBVc2FnZXMgb2YgdGhlIEZ1bmN0aW9uICg8c3Bhbj5bW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXTwvc3Bhbj4pCiAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGlkPSJmdW5jdGlvblVzYWdlc0xpc3QiIGl0ZW1zPSJbW19mdW5jdGlvblVzYWdlc11dIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9ImZ1bmN0aW9uVXNhZ2VzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzTGlicmFyeUZ1bmN0aW9uKF9ub2RlKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWluY2x1ZGUtZ3JvdXAiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIGNsYXNzPSJ0b2dnbGUtaW5jbHVkZSIgb24tY2xpY2s9Il90b2dnbGVJbmNsdWRlIj4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2F1eEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaXNJblNlcmllcyhfbm9kZSl9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idG9nZ2xlLWluY2x1ZGUiIG9uLWNsaWNrPSJfdG9nZ2xlR3JvdXAiPgogICAgICAgICAgICAgICAgPHNwYW4+W1tfZ3JvdXBCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1pbmZvIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNjUwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7c2VsZWN0ZWROb2RlfX0iPgogICAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBjbGFzcz0iY2FyZCI+CiAgICAgICAgPHRmLW5vZGUtaW5mbyBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZmxhdC1ncmFwaD0iW1tncmFwaF1dIiBncmFwaC1ub2RlLW5hbWU9Iltbc2VsZWN0ZWROb2RlXV0iIG5vZGUtaW5jbHVkZT0iW1tzZWxlY3RlZE5vZGVJbmNsdWRlXV0iIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSI+CiAgICAgICAgPC90Zi1ub2RlLWluZm8+CiAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIG5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iPgogICAgICA8L3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGVhbHRoUGlsbHNBdmFpbGFibGUoZGVidWdnZXJEYXRhRW5hYmxlZCwgbm9kZU5hbWVzVG9IZWFsdGhQaWxscyldXSI+CiAgICAgIDx0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3toaWdobGlnaHRlZE5vZGV9fSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19Ij4KICAgICAgPC90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQ+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1ib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6Omhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAvZGVlcC8gLmNsb3NlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGxlZnQ6IDE1cHg7CiAgICAgICAgYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nIHsKICAgICAgICBjdXJzb3I6IHByb2dyZXNzOwogICAgICAgIG9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nLmVycm9yIHsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgIH0KCiAgICAgICNpbmZvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDVweDsKICAgICAgICB0b3A6IDVweDsKICAgICAgICBwYWRkaW5nOiAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAzODBweDsKICAgICAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgfQoKICAgICAgI21haW4gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNDBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLW1zZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXByb2dyZXNzIHsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IDZweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogI2YzOTEzZTsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgewogICAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIGxpIHsKICAgICAgICBwYWRkaW5nOiA0cHggMTZweDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc05vdENvbXBsZXRlKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtYmFyIj4KICAgICAgICA8ZGl2IGlkPSJwcm9ncmVzcy1tc2ciPltbcHJvZ3Jlc3MubXNnXV08L2Rpdj4KICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgdmFsdWU9IltbcHJvZ3Jlc3MudmFsdWVdXSI+PC9wYXBlci1wcm9ncmVzcz4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPGRpdiBjbGFzcyQ9IltbX2dldENvbnRhaW5lckNsYXNzKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0ibWFpbiI+CiAgICAgICAgPHRmLWdyYXBoIGlkPSJncmFwaCIgZ3JhcGgtaGllcmFyY2h5PSJ7e2dyYXBoSGllcmFyY2h5fX0iIGJhc2ljLWdyYXBoPSJbW2dyYXBoXV0iIGhpZXJhcmNoeS1wYXJhbXM9IltbaGllcmFyY2h5UGFyYW1zXV0iIHJlbmRlci1oaWVyYXJjaHk9Int7cmVuZGVySGllcmFyY2h5fX0iIGRldmljZXMtZm9yLXN0YXRzPSJbW2RldmljZXNGb3JTdGF0c11dIiBzdGF0cz0iW1tzdGF0c11dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBoaWdobGlnaHRlZC1ub2RlPSJ7e19oaWdobGlnaHRlZE5vZGV9fSIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBjb2xvci1ieS1wYXJhbXM9Int7Y29sb3JCeVBhcmFtc319IiBwcm9ncmVzcz0ie3twcm9ncmVzc319IiBlZGdlLWxhYmVsLWZ1bmN0aW9uPSJbW2VkZ2VMYWJlbEZ1bmN0aW9uXV0iIGVkZ2Utd2lkdGgtZnVuY3Rpb249IltbZWRnZVdpZHRoRnVuY3Rpb25dXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJbW2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIgaGFuZGxlLW5vZGUtc2VsZWN0ZWQ9IltbaGFuZGxlTm9kZVNlbGVjdGVkXV0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImluZm8iPgogICAgICAgIDx0Zi1ncmFwaC1pbmZvIGlkPSJncmFwaC1pbmZvIiB0aXRsZT0ic2VsZWN0ZWQiIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBncmFwaD0iW1tncmFwaF1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1ub2RlLWluY2x1ZGU9Int7X3NlbGVjdGVkTm9kZUluY2x1ZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgZGVidWdnZXItZGF0YS1lbmFibGVkPSJbW2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tkZWJ1Z2dlck51bWVyaWNBbGVydHNdXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IiBjb21wYXQtbm9kZS10aXRsZT0iW1tjb21wYXROb2RlVGl0bGVdXSIgb24tbm9kZS10b2dnbGUtaW5jbHVzaW9uPSJfb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZCIgb24tbm9kZS10b2dnbGUtc2VyaWVzZ3JvdXA9Il9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQiPjwvdGYtZ3JhcGgtaW5mbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJhZGlvLWJ1dHRvbiI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplLCAxNnB4KTsKICAgICAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlIGluIGBhdHRhY2hlZGAuICovCiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZTogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplLCAtMXB4KTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgI3JhZGlvQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tcmFkaW8tY29udGFpbmVyOwogICAgICB9CgogICAgICAjaW5rIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgI2lua1tjaGVja2VkXSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICAjb2ZmUmFkaW8sICNvblJhZGlvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtYmFja2dyb3VuZC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjI4czsKICAgICAgfQoKICAgICAgI29uUmFkaW8gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNvZmZSYWRpbyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNvblJhZGlvIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC41KTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsIHsKICAgICAgICBsaW5lLWhlaWdodDogbm9ybWFsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBtYXJnaW4tbGVmdDogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDEwcHgpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjcmFkaW9MYWJlbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLWNoZWNrZWQ7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsOmRpcihydGwpIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1zcGFjaW5nLCAxMHB4KTsKICAgICAgfQoKICAgICAgI3JhZGlvTGFiZWxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogZGlzYWJsZWQgc3RhdGUgKi8KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNvZmZSYWRpbyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNvblJhZGlvIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNyYWRpb0xhYmVsIHsKICAgICAgICAvKiBzbGlnaHRseSBkYXJrZXIgdGhhbiB0aGUgYnV0dG9uLCBzbyB0aGF0IGl0J3MgcmVhZGFibGUgKi8KICAgICAgICBvcGFjaXR5OiAwLjY1OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InJhZGlvQ29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ib2ZmUmFkaW8iPjwvZGl2PgogICAgICA8ZGl2IGlkPSJvblJhZGlvIj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InJhZGlvTGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJhZGlvLWdyb3VwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgcGFkZGluZzogdmFyKC0tcGFwZXItcmFkaW8tZ3JvdXAtaXRlbS1wYWRkaW5nLCAxMnB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9vbHRpcCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgei1pbmRleDogMTAwMjsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9vbHRpcC1iYWNrZ3JvdW5kLCAjNjE2MTYxKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbHRpcC10ZXh0LWNvbG9yLCB3aGl0ZSk7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2NhbGVVcCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjApOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTY2FsZURvd24gewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lRmFkZUluT3BhY2l0eSB7CiAgICAgICAgMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lRmFkZU91dE9wYWNpdHkgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNsaWRlRG93bkluIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgICAxMCUgewogICAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTbGlkZURvd25PdXQgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgICAgMTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmZhZGUtaW4tYW5pbWF0aW9uIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZUZhZGVJbk9wYWNpdHk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuZmFkZS1vdXQtYW5pbWF0aW9uIHsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVGYWRlT3V0T3BhY2l0eTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2NhbGUtdXAtYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTY2FsZVVwOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24taW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNjYWxlLWRvd24tYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2NhbGVEb3duOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zbGlkZS1kb3duLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNsaWRlRG93bkluOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNsaWRlLWRvd24tYW5pbWF0aW9uLW91dCB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2xpZGVEb3duT3V0OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5jYW5jZWwtYW5pbWF0aW9uIHsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IC0zMHMgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLyogVGhhbmtzIElFIDEwLiAqLwoKICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRvb2x0aXAiIGNsYXNzPSJoaWRkZW4iPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW5vZGUtc2VhcmNoIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJzZWFyY2gtY29udGFpbmVyIj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJydW5zLXJlZ2V4IiBsYWJlbD0iU2VhcmNoIG5vZGVzLiBSZWdleGVzIHN1cHBvcnRlZC4iIHZhbHVlPSJ7e19yYXdSZWdleElucHV0fX0iPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8ZGl2IGlkPSJzZWFyY2gtcmVzdWx0cy1hbmNob3IiPgogICAgICAgIDxkaXYgaWQ9InNlYXJjaC1yZXN1bHRzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3JlZ2V4TWF0Y2hlc11dIj4KICAgICAgICAgICAgPGRpdiBpZD0ic2VhcmNoLW1hdGNoIiBvbi1jbGljaz0iX21hdGNoQ2xpY2tlZCI+W1tpdGVtXV08L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzZWFyY2gtY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgI3J1bnMtcmVnZXggewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjc2VhcmNoLXJlc3VsdHMtYW5jaG9yIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtcmVzdWx0cyB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjc2VhcmNoLW1hdGNoIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlyZWN0aW9uOiBydGw7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtbWF0Y2g6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLW9yYW5nZS13ZWFrKTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1jb250cm9scyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgfQogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxNXB4OwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTVweDsKICAgICAgICAtLXByaW1hcnktdGV4dC1jb2xvcjogZ3JheTsKICAgICAgICAtLXBhcGVyLWl0ZW0tbWluLWhlaWdodDogMzBweDsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMgewogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5ydW4tZHJvcGRvd24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA4cHggMCA4cHggMTBweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5jb2xvci1kcm9wZG93biB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXI6IHsKICAgICAgICAgIHBhZGRpbmc6IDlweCAwIDAgMTNweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlIHsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiAwOwogICAgICB9CgogICAgICB0YWJsZSB0ZCB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyB7CiAgICAgICAgcGFkZGluZzogMCAyMHB4IDIwcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtaG9sZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgY29sb3I6ICM1NTU7CiAgICAgICAgcGFkZGluZzogMTVweCAyMHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAudG9nZ2xlLWxlZ2VuZC1idXR0b24gewogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGVnZW5kLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CiAgICAgIHN2Zy5pY29uLAogICAgICB0Zi1ncmFwaC1pY29uIHsKICAgICAgICB3aWR0aDogNjBweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmRvbWFpblZhbHVlcyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICB3aWR0aDogMTY1cHg7CiAgICAgIH0KICAgICAgLmRvbWFpblN0YXJ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAuZG9tYWluRW5kIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgLmNvbG9yQm94IHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLmltYWdlLWljb24gewogICAgICAgIHdpZHRoOiAyNHB4OwogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLmhlbHAtaWNvbiB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuZ3JheSB7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIG1hcmdpbjogOHB4IDVweCA4cHggMDsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgIH0KICAgICAgLnRpdGxlIHNtYWxsIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIC5kZXZpY2VMaXN0LAogICAgICAueGxhQ2x1c3Rlckxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNmaWxlIHsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgfQoKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CgogICAgICAuY29sb3ItbGVnZW5kLXJvdyAubGFiZWwsCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHN2ZywKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgZmxleDogMCAwIDQwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICB9CgogICAgICAuZGV2aWNlcy1jaGVja2JveCBpbnB1dCB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAuY29udHJvbC1ob2xkZXIgLmljb24tYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luOiAwIC01cHg7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CgogICAgICAuYnV0dG9uLXRleHQgewogICAgICAgIHBhZGRpbmctbGVmdDogMjBweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgLnVwbG9hZC1idXR0b24gewogICAgICAgIHdpZHRoOiAxNjVweDsKICAgICAgICBoZWlnaHQ6IDI1cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CgogICAgICAuYnV0dG9uLWljb24gewogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4taW5wdXQgewogICAgICAgIGhlaWdodDogMHB4OwogICAgICAgIHdpZHRoOiAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC5jb250cm9sLWhvbGRlciB7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAuY29udHJvbC1ob2xkZXIgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgc3Bhbi5jb3VudGVyIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgIH0KCiAgICAgIC5ydW5zIHBhcGVyLWl0ZW0gewogICAgICAgIC0tcGFwZXItaXRlbTogewogICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgfQoKICAgICAgdGFibGUudGYtZ3JhcGgtY29udHJvbHMgdGQuaW5wdXQtZWxlbWVudC10YWJsZS1kYXRhIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICAuc3BhY2VyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIC5jb2xvci10ZXh0IHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAvKiogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyB0aGF0IHN1cHByZXNzIHBvaW50ZXIgZXZlbnRzIGZvciBkaXNhYmxlZCBidXR0b25zLiBPdGhlcndpc2UsIHRoZSAqLwogICAgICAvKiAgdG9vbHRpcHMgZG8gbm90IGFwcGVhci4gKi8KICAgICAgcGFwZXItcmFkaW8tZ3JvdXAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0byAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubGVnZW5kLWNsYXJpZmllciB7CiAgICAgICAgY29sb3I6ICMyNjYyMzY7CiAgICAgICAgY3Vyc29yOiBoZWxwOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1jbGFyaWZpZXIgcGFwZXItdG9vbHRpcCB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICB9CgogICAgICAvKiogT3RoZXJ3aXNlLCBwb2x5bWVyIFVJIGNvbnRyb2xzIGFwcGVhciBhdG9wIG5vZGUgc2VhcmNoLiAqLwogICAgICB0Zi1ncmFwaC1ub2RlLXNlYXJjaCB7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImFsbGNvbnRyb2xzIj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDx0Zi1ncmFwaC1ub2RlLXNlYXJjaCBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIj48L3RmLWdyYXBoLW5vZGUtc2VhcmNoPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9Imljb24tYnV0dG9uIiBvbi10YXA9Il9maXQiIGFsdD0iRml0IHRvIHNjcmVlbiI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImFzcGVjdC1yYXRpbyIgY2xhc3M9ImJ1dHRvbi1pY29uIj48L2lyb24taWNvbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24tdGV4dCI+Rml0IHRvIFNjcmVlbjwvc3Bhbj4KICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpY29uLWJ1dHRvbiIgb24tY2xpY2s9ImRvd25sb2FkIiBhbHQ9IkRvd25sb2FkIFBORyI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImZpbGUtZG93bmxvYWQiIGNsYXNzPSJidXR0b24taWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXRleHQiPkRvd25sb2FkIFBORzwvc3Bhbj4KICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICA8YSBocmVmPSIjIiBpZD0iZ3JhcGhkb3dubG9hZCIgY2xhc3M9InRpdGxlIiBkb3dubG9hZD0iZ3JhcGgucG5nIj48L2E+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciBydW5zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+CiAgICAgICAgICBSdW4gPHNwYW4gY2xhc3M9ImNvdW50ZXIiPihbW2RhdGFzZXRzLmxlbmd0aF1dKTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIG5vaW5rIGhvcml6b250YWwtYWxpZ249ImxlZnQiIGNsYXNzPSJydW4tZHJvcGRvd24iPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFJ1bkluZGV4fX0iIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2RhdGFzZXRzXV0iPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbaXRlbS5uYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dTZXNzaW9uUnVuc0Ryb3Bkb3duXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgVGFnCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudGVyIj4oW1tfbnVtVGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0pPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIGhvcml6b250YWwtYWxpZ249ImxlZnQiIG5vaW5rIGNsYXNzPSJydW4tZHJvcGRvd24iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVGFnSW5kZXh9fSIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZ2V0VGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtLmRpc3BsYXlOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd1VwbG9hZEJ1dHRvbl1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+VXBsb2FkPC9kaXY+CiAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idXBsb2FkLWJ1dHRvbiIgb24tY2xpY2s9Il9nZXRGaWxlIiB0aXRsZT0iVXBsb2FkIGEgZ3JhcGggcGJ0eHQgZmlsZSB0byB2aWV3IHRoZSBncmFwaCI+CiAgICAgICAgICAgIENob29zZSBGaWxlCiAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhpZGRlbi1pbnB1dCI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iZmlsZSIgbmFtZT0iZmlsZSIgb24tY2hhbmdlPSJfdXBkYXRlRmlsZUlucHV0IiBhY2NlcHQ9Ii5wYnR4dCI+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRHcmFwaFR5cGV9fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0ib3BfZ3JhcGgiIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25PcEdyYXBoRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSI+R3JhcGg8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY29uY2VwdHVhbF9ncmFwaCIgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvbkNvbmNlcHR1YWxHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iPkNvbmNlcHR1YWwgR3JhcGg8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0icHJvZmlsZSIgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvblByb2ZpbGVEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIj5Qcm9maWxlPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3t0cmFjZUlucHV0c319IiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICBUcmFjZSBpbnB1dHMKICAgICAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWFsdGhQaWxsc0ZlYXR1cmVFbmFibGVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGNoZWNrZWQ9Int7aGVhbHRoUGlsbHNUb2dnbGVkT259fSIgY2xhc3M9InRpdGxlIj5TaG93IGhlYWx0aCBwaWxsczwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5Db2xvcjwvZGl2PgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ie3tjb2xvckJ5fX0iPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJzdHJ1Y3R1cmUiPlN0cnVjdHVyZTwvcGFwZXItcmFkaW8tYnV0dG9uPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZGV2aWNlIj5EZXZpY2U8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ4bGEtY2x1c3Rlci1yYWRpby1idXR0b24iIG5hbWU9InhsYV9jbHVzdGVyIiBkaXNhYmxlZD0iW1shX3hsYUNsdXN0ZXJzUHJvdmlkZWQocmVuZGVySGllcmFyY2h5KV1dIj4KICAgICAgICAgICAgWExBIENsdXN0ZXIKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InhsYS1jbHVzdGVyLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSBYTEEgY2x1c3RlciBpcyBvbmx5IGVuYWJsZWQgaWYgYXQgbGVhc3QgMSBvcCBzcGVjaWZpZXMKICAgICAgICAgICAgYW4gWExBIGNsdXN0ZXIuCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIgbmFtZT0iY29tcHV0ZV90aW1lIiBkaXNhYmxlZD0iW1shc3RhdHNdXSI+CiAgICAgICAgICAgIENvbXB1dGUgdGltZQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSBjb21wdXRlIHRpbWUgaXMgb25seSBlbmFibGVkIGlmIHRoZSBSdW5NZXRhZGF0YSBwcm90byBpcwogICAgICAgICAgICBwYXNzZWQgdG8gdGhlIEZpbGVXcml0ZXIgd2hlbiBhIHNwZWNpZmljIHNlc3Npb24gaXMgcnVuLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im1lbW9yeS1yYWRpby1idXR0b24iIG5hbWU9Im1lbW9yeSIgZGlzYWJsZWQ9IltbIXN0YXRzXV0iPgogICAgICAgICAgICBNZW1vcnkKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9Im1lbW9yeS1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgbWVtb3J5IGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgUnVuTWV0YWRhdGEgcHJvdG8gaXMKICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBGaWxlV3JpdGVyIHdoZW4gYSBzcGVjaWZpYyBzZXNzaW9uIGlzIHJ1bi4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iIG5hbWU9Im9wX2NvbXBhdGliaWxpdHkiPgogICAgICAgICAgICBUUFUgQ29tcGF0aWJpbGl0eQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0idHB1LWNvbXBhdGliaWxpdHktcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IHdoZXRoZXIgYW4gb3BlcmF0aW9uIGlzIGNvbXBhdGlibGUgZm9yIHRoZSBUUFUgZGV2aWNlLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgPHNwYW4gY2xhc3M9InNwYWNlciI+PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzR3JhZGllbnRDb2xvcmluZyhzdGF0cywgY29sb3JCeSldXSI+CiAgICAgICAgICA8c3ZnIHdpZHRoPSIxNDAiIGhlaWdodD0iMjAiIHN0eWxlPSJtYXJnaW46IDAgNXB4IiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgIDxsaW5lYXJncmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMTAwJSIgeTI9IjAlIj4KICAgICAgICAgICAgICAgIDxzdG9wIGNsYXNzPSJzdGFydCIgb2Zmc2V0PSIwJSIgc3RvcC1jb2xvciQ9IltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5zdGFydENvbG9yXV0iIC8+CiAgICAgICAgICAgICAgICA8c3RvcCBjbGFzcz0iZW5kIiBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3IkPSJbW19jdXJyZW50R3JhZGllbnRQYXJhbXMuZW5kQ29sb3JdXSIgLz4KICAgICAgICAgICAgICA8L2xpbmVhcmdyYWRpZW50PgogICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMzUiIGhlaWdodD0iMjAiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQpIiBzdHJva2U9ImJsYWNrIiAvPgogICAgICAgICAgPC9zdmc+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5WYWx1ZXMgY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpblN0YXJ0Ij5bW19jdXJyZW50R3JhZGllbnRQYXJhbXMubWluVmFsdWVdXTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5FbmQiPltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5tYXhWYWx1ZV1dPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxiciBzdHlsZT0iY2xlYXI6IGJvdGgiPgogICAgICAgICAgPGRpdj5EZXZpY2VzIGluY2x1ZGVkIGluIHN0YXRzOjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGV2aWNlTGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnREZXZpY2VzXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3cgZGV2aWNlcy1jaGVja2JveCI+CiAgICAgICAgICAgICAgICA8c3Bhbj48aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlJD0iW1tpdGVtLmRldmljZV1dIiBjaGVja2VkJD0iW1tpdGVtLnVzZWRdXSIgb24tY2xpY2s9Il9kZXZpY2VDaGVja2JveENsaWNrZWQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuPltbaXRlbS5zdWZmaXhdXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpdGVtLmlnbm9yZWRNc2ddXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJoZWxwIiBjbGFzcz0iaGVscC1pY29uIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCIgYW5pbWF0aW9uLWRlbGF5PSIwIj5bW2l0ZW0uaWdub3JlZE1zZ11dPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ3N0cnVjdHVyZScpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCI+CiAgICAgICAgICAgICAgICBjb2xvcnMKICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+c2FtZSBzdWJzdHJ1Y3R1cmU8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZWVlIiBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmlxdWUgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ2RldmljZScpXV0iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudERldmljZVBhcmFtc11dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IltbaXRlbS5jb2xvcl1dIiBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPltbaXRlbS5kZXZpY2VdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2VlZSIgc3Ryb2tlLW92ZXJyaWRlPSIjYTZhNmE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBkZXZpY2U8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAneGxhX2NsdXN0ZXInKV1dIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnRYbGFDbHVzdGVyUGFyYW1zXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI3VuZmlsbGVkLXJlY3QiIHg9IjAiIHk9IjAiIHN0eWxlPSJmaWxsOltbaXRlbS5jb2xvcl1dIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5bW2l0ZW0ueGxhX2NsdXN0ZXJdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgIDx1c2UgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhsaW5rOmhyZWY9IiNncmV5LXJlY3QiIHg9IjAiIHk9IjAiIC8+CiAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBYTEEgY2x1c3Rlcjwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdvcF9jb21wYXRpYmlsaXR5JyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci10ZXh0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iT1AiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiMwZjlkNTgiIHN0cm9rZS1vdmVycmlkZT0iI2NjYyI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPlZhbGlkIE9wPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iT1AiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiNkYjQ0MzciIHN0cm9rZS1vdmVycmlkZT0iI2NjYyI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPkludmFsaWQgT3A8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N0YXRzTm90TnVsbChzdGF0cyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmFkZWQ+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bnVzZWQgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1ob2xkZXIiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlTGVnZW5kSWNvbihfbGVnZW5kT3BlbmVkKV1dIiBvbi1jbGljaz0iX3RvZ2dsZUxlZ2VuZE9wZW4iIGNsYXNzPSJ0b2dnbGUtbGVnZW5kLWJ1dHRvbiI+CiAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJ0b2dnbGUtbGVnZW5kLXRleHQiPgogICAgICAgIFtbX2dldFRvZ2dsZVRleHQoX2xlZ2VuZE9wZW5lZCldXQogICAgICA8L3NwYW4+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbGVnZW5kT3BlbmVkXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz0idGl0bGUiPkdyYXBoPC9kaXY+PC90ZD4KICAgICAgICAgICAgICA8dGQ+KCogPSBleHBhbmRhYmxlKTwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZDlkOWQ5IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIE5hbWVzcGFjZTxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVuY2Fwc3VsYXRlcyBhIHNldCBvZiBub2Rlcy4gTmFtZXNwYWNlIGlzIGhpZXJhcmNoaWNhbCBhbmQKICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBzY29wZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBPcE5vZGUKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgcGVyZm9ybXMgYW4gb3BlcmF0aW9uLiBUaGVzZSBub2RlcyBjYW5ub3QgZXhwYW5kLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iU0VSSUVTIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBVbmNvbm5lY3RlZCBzZXJpZXM8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBvZiBudW1iZXJlZCBub2RlcyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIGVhY2gKICAgICAgICAgICAgICAgICAgICBvdGhlci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNFUklFUyIgaGVpZ2h0PSIxNiIgdmVydGljYWw+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgQ29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG9mIG51bWJlcmVkIG5vZGVzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iaWNvbiI+CiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzg0ODQ4NCIgY3g9IjEwIiBjeT0iMTAiIHI9IjUiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIENvbnN0YW50CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IG91dHB1dHMgYSBjb25zdGFudCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNVTU1BUlkiIGhlaWdodD0iMjAiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFN1bW1hcnkKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgY29sbGVjdHMgZGF0YSBmb3IgdmlzdWFsaXphdGlvbiB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZC4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLWxlZ2VuZCIgZmlsbD0iI2JiYiIgbWFya2Vyd2lkdGg9IjEwIiBtYXJrZXJoZWlnaHQ9IjEwIiByZWZ4PSI5IiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+CiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgPHBhdGggbWFya2VyLWVuZD0idXJsKCNkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kKSIgc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBEYXRhZmxvdyBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoZSBkYXRhIGZsb3cgYmV0d2VlbiBvcGVyYXRpb25zLiBFZGdlcyBmbG93CiAgICAgICAgICAgICAgICAgICAgdXB3YXJkcyB1bmxlc3MgYXJyb3doZWFkcyBzcGVjaWZ5IG90aGVyd2lzZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtZGFzaGFycmF5PSIyLCAyIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY3kgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGUgY29udHJvbCBkZXBlbmRlbmN5IGJldHdlZW4gb3BlcmF0aW9ucy4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQiIGZpbGw9IiNGRkI3NEQiIG1hcmtlcndpZHRoPSIxMCIgbWFya2VyaGVpZ2h0PSIxMCIgcmVmeD0iOSIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIiAvPgogICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICAgIDxwYXRoIG1hcmtlci1lbmQ9InVybCgjcmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQpIiBzdHJva2U9IiNGRkI3NEQiIGQ9Ik0yIDkgbCAyOSAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFJlZmVyZW5jZSBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoYXQgdGhlIG91dGdvaW5nIG9wZXJhdGlvbiBub2RlIGNhbiBtdXRhdGUgdGhlCiAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgdGVuc29yLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJlcnJvci1kaWFsb2ciIHdpdGgtYmFja2Ryb3A+PC9wYXBlci1kaWFsb2c+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFzZXRzU3RhdGUoX2RhdGFzZXRzRmV0Y2hlZCwgX2RhdGFzZXRzLCAnRU1QVFknKV1dIj4KICAgICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA1NDBweDsgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOyI+CiAgICAgICAgPGgzPk5vIGdyYXBoIGRlZmluaXRpb24gZmlsZXMgd2VyZSBmb3VuZC48L2gzPgogICAgICAgIDxwPgogICAgICAgICAgVG8gc3RvcmUgYSBncmFwaCwgY3JlYXRlIGEKICAgICAgICAgIDxjb2RlPnRmLnN1bW1hcnkuRmlsZVdyaXRlcjwvY29kZT4KICAgICAgICAgIGFuZCBwYXNzIHRoZSBncmFwaCBlaXRoZXIgdmlhIHRoZSBjb25zdHJ1Y3Rvciwgb3IgYnkgY2FsbGluZyBpdHMKICAgICAgICAgIDxjb2RlPmFkZF9ncmFwaCgpPC9jb2RlPiBtZXRob2QuIFlvdSBtYXkgd2FudCB0byBjaGVjayBvdXQgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9ncmFwaF92aXoiPmdyYXBoIHZpc3VhbGl6ZXIgdHV0b3JpYWw8L2E+LgogICAgICAgIAoKICAgICAgICA8cD4KICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvIGFkZAogICAgICAgICAgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgCgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAKICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhc2V0c1N0YXRlKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgJ1BSRVNFTlQnKV1dIj4KICAgICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgICAgPHRmLWdyYXBoLWNvbnRyb2xzIGlkPSJjb250cm9scyIgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiIGRldmljZXMtZm9yLXN0YXRzPSJ7e19kZXZpY2VzRm9yU3RhdHN9fSIgY29sb3ItYnktcGFyYW1zPSJbW19jb2xvckJ5UGFyYW1zXV0iIHN0YXRzPSJbW19zdGF0c11dIiBjb2xvci1ieT0ie3tfY29sb3JCeX19IiBkYXRhc2V0cz0iW1tfZGF0YXNldHNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tfcmVuZGVySGllcmFyY2h5XV0iIHNlbGVjdGlvbj0ie3tfc2VsZWN0aW9ufX0iIHNlbGVjdGVkLWZpbGU9Int7X3NlbGVjdGVkRmlsZX19IiBzZWxlY3RlZC1ub2RlPSJ7e19zZWxlY3RlZE5vZGV9fSIgaGVhbHRoLXBpbGxzLWZlYXR1cmUtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIiBoZWFsdGgtcGlsbHMtdG9nZ2xlZC1vbj0ie3toZWFsdGhQaWxsc1RvZ2dsZWRPbn19IiBvbi1maXQtdGFwPSJfZml0IiB0cmFjZS1pbnB1dHM9Int7X3RyYWNlSW5wdXRzfX0iPjwvdGYtZ3JhcGgtY29udHJvbHM+CiAgICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgICAgPHRmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIgaWQ9ImxvYWRlciIgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iIHNlbGVjdGlvbj0iW1tfc2VsZWN0aW9uXV0iIHNlbGVjdGVkLWZpbGU9IltbX3NlbGVjdGVkRmlsZV1dIiBvdXQtZ3JhcGgtaGllcmFyY2h5PSJ7e19ncmFwaEhpZXJhcmNoeX19IiBvdXQtZ3JhcGg9Int7X2dyYXBofX0iIG91dC1zdGF0cz0ie3tfc3RhdHN9fSIgcHJvZ3Jlc3M9Int7X3Byb2dyZXNzfX0iIGhpZXJhcmNoeS1wYXJhbXM9IltbX2hpZXJhcmNoeVBhcmFtc11dIiBjb21wYXRpYmlsaXR5LXByb3ZpZGVyPSJbW19jb21wYXRpYmlsaXR5UHJvdmlkZXJdXSI+PC90Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyPgogICAgICAgICAgPHRmLWdyYXBoLWJvYXJkIGlkPSJncmFwaGJvYXJkIiBkZXZpY2VzLWZvci1zdGF0cz0iW1tfZGV2aWNlc0ZvclN0YXRzXV0iIGNvbG9yLWJ5PSJbW19jb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0ie3tfY29sb3JCeVBhcmFtc319IiBncmFwaC1oaWVyYXJjaHk9IltbX2dyYXBoSGllcmFyY2h5XV0iIGdyYXBoPSJbW19ncmFwaF1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIgcHJvZ3Jlc3M9IltbX3Byb2dyZXNzXV0iIGRlYnVnZ2VyLWRhdGEtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIiBhcmUtaGVhbHRoLXBpbGxzLWxvYWRpbmc9IltbX2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tfZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW19ub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iIGFsbC1zdGVwcy1tb2RlLWVuYWJsZWQ9Int7YWxsU3RlcHNNb2RlRW5hYmxlZH19IiBzcGVjaWZpYy1oZWFsdGgtcGlsbC1zdGVwPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0iW1tfaGVhbHRoUGlsbFN0ZXBJbmRleF1dIiByZW5kZXItaGllcmFyY2h5PSJ7e19yZW5kZXJIaWVyYXJjaHl9fSIgc2VsZWN0ZWQtbm9kZT0ie3tfc2VsZWN0ZWROb2RlfX0iIHN0YXRzPSJbW19zdGF0c11dIiB0cmFjZS1pbnB1dHM9IltbX3RyYWNlSW5wdXRzXV0iPjwvdGYtZ3JhcGgtYm9hcmQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC9kZWVwLyB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRpYWxvZyB7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1kaXN0cmlidXRpb24tY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBydW49IltbcnVuXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICAKICAgIDx2ei1kaXN0cmlidXRpb24tY2hhcnQgaWQ9ImNoYXJ0IiB4LXR5cGU9IltbeFR5cGVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSI+PC92ei1kaXN0cmlidXRpb24tY2hhcnQ+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIGhlaWdodDogMjM1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogNzAwcHg7CiAgICAgICAgaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgewogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9InhUeXBlU2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGRpc3RyaWJ1dGlvbiBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgICAoSGlzdG9ncmFtcyBhbmQgZGlzdHJpYnV0aW9ucyBib3RoIHVzZSB0aGUgaGlzdG9ncmFtIHN1bW1hcnkKICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4pCiAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtZGlzdHJpYnV0aW9uLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1oaXN0b2dyYW0tdGltZXNlcmllcyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0idG9vbHRpcCI+PHNwYW4+PC9zcGFuPjwvZGl2PgogICAgPHN2ZyBpZD0ic3ZnIj4KICAgICAgPGc+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeCI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHkiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB5IHNsaWNlIj48L2c+CiAgICAgICAgPGcgY2xhc3M9InN0YWdlIj4KICAgICAgICAgIDxyZWN0IGNsYXNzPSJiYWNrZ3JvdW5kIj48L3JlY3Q+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGNsYXNzPSJ4LWF4aXMtaG92ZXIiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ieS1heGlzLWhvdmVyIj48L2c+CiAgICAgICAgPGcgY2xhc3M9Inktc2xpY2UtYXhpcy1ob3ZlciI+PC9nPgogICAgICA8L2c+CiAgICA8L3N2Zz4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgc3ZnIHsKICAgICAgICBmb250LWZhbWlseTogcm9ib3RvLCBzYW5zLXNlcmlmOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmJhY2tncm91bmQgewogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBmaWxsOiByZWQ7CiAgICAgIH0KCiAgICAgIC5oaXN0b2dyYW0gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuaG92ZXIgewogICAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgICAgIGRvbWluYW50LWJhc2VsaW5lOiBtaWRkbGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyIGNpcmNsZSB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICB9CgogICAgICAuaG92ZXIgdGV4dCB7CiAgICAgICAgZmlsbDogYmxhY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgY2lyY2xlIHsKICAgICAgICBmaWxsOiBibGFjayAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaG92ZXIuaG92ZXItY2xvc2VzdCB0ZXh0IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuYmFzZWxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLm91dGxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAub3V0bGluZS5vdXRsaW5lLWhvdmVyIHsKICAgICAgICBzdHJva2U6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIsCiAgICAgIC55LWF4aXMtaG92ZXIsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIC5sYWJlbCwKICAgICAgLnktYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgLmxhYmVsIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LWFuY2hvcjogZW5kOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHRleHQgewogICAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC55LWF4aXMtaG92ZXIgdGV4dCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktYXhpcy1ob3ZlciBsaW5lLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIGxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktYXhpcy1ob3ZlciByZWN0LAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIHJlY3QgewogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICB9CgogICAgICAuYXhpcyB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICB9CgogICAgICAuYXhpcyBwYXRoLmRvbWFpbiB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgfQoKICAgICAgLmF4aXMgLnRpY2sgbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjZGRkOwogICAgICB9CgogICAgICAuYXhpcy5zbGljZSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmF4aXMuc2xpY2UgLnRpY2sgbGluZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMjsKICAgICAgfQoKICAgICAgLnNtYWxsIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnNtYWxsIC5heGlzIC50aWNrOmZpcnN0LW9mLXR5cGUgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnNtYWxsIC5heGlzIC50aWNrOmxhc3Qtb2YtdHlwZSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAubWVkaXVtIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm1lZGl1bSAuYXhpcyAudGljazpudGgtY2hpbGQoMm4gKyAxKSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAubGFyZ2UgLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAubGFyZ2UgLmF4aXMgLnRpY2s6bnRoLWNoaWxkKDJuICsgMSkgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1oaXN0b2dyYW0tbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgCiAgICA8dnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgaWQ9ImNoYXJ0IiB0aW1lLXByb3BlcnR5PSJbW3RpbWVQcm9wZXJ0eV1dIiBtb2RlPSJbW2hpc3RvZ3JhbU1vZGVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVGdW5jdGlvbl1dIj48L3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzPgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDkwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0iaGlzdG9ncmFtTW9kZVNlbGVjdG9yIiBuYW1lPSJIaXN0b2dyYW0gbW9kZSIgc2VsZWN0ZWQtaWQ9Int7X2hpc3RvZ3JhbU1vZGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im92ZXJsYXkiPm92ZXJsYXk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ib2Zmc2V0Ij5vZmZzZXQ8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lUHJvcGVydHlTZWxlY3RvciIgbmFtZT0iT2Zmc2V0IHRpbWUgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3RpbWVQcm9wZXJ0eX19Ij4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGhpc3RvZ3JhbSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1oaXN0b2dyYW0tbG9hZGVyIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIgdGltZS1wcm9wZXJ0eT0iW1tfdGltZVByb3BlcnR5XV0iIGhpc3RvZ3JhbS1tb2RlPSJbW19oaXN0b2dyYW1Nb2RlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi1oaXN0b2dyYW0tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRleHQtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHJ1bj0iW1tydW5dXSIgdGFnPSJbW3RhZ11dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGlkPSJzdGVwcy1jb250YWluZXIiIGNsYXNzPSJjb250YWluZXIgc2Nyb2xsYmFyIiBzdHlsZT0iYm9yZGVyLWNvbG9yOiBbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdGV4dHNdXSI+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InN0ZXAtY29udGFpbmVyIj4KICAgICAgICAgIHN0ZXAgPHNwYW4gY2xhc3M9InN0ZXAtdmFsdWUiPltbX2Zvcm1hdFN0ZXAoaXRlbS5zdGVwKV1dPC9zcGFuPgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InRleHQiPgogICAgICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tpdGVtLnRleHRdXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgPHN0eWxlIGluY2x1ZGU9InNjcm9sbGJhci1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLnNjcm9sbGJhciB7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgICAjc3RlcHMtY29udGFpbmVyIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgLyogY29sb3IgY29tcHV0ZWQgYW5kIHNldCBhcyBpbmxpbmUgc3R5bGUgKi87CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQogICAgICAudGV4dCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAzcHggM3B4IDNweDsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgICAgfQogICAgICAuc3RlcC1jb250YWluZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4OyAvKiB0byBjb3JyZWN0IGZvciBib3JkZXIgKi8KICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgIH0KICAgICAgLnN0ZXAtY29udGFpbmVyOm5vdCg6Zmlyc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGV4dC1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHRleHQgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgdGV4dCBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi10ZXh0LWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBydW49IltbaXRlbS5ydW5dXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLXRleHQtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSI+PC90Zi1jYXJkLWhlYWRpbmc+CgogICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1tfeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW195VmFsdWVBY2Nlc3Nvcl1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlRnVuY3Rpb25dXSIgZGVmYXVsdC14LXJhbmdlPSJbW19kZWZhdWx0WFJhbmdlXV0iIGRlZmF1bHQteS1yYW5nZT0iW1tfZGVmYXVsdFlSYW5nZV1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIgZGF0YS1zZXJpZXM9IltbcnVuc11dIiBsb2FkLWtleT0iW1t0YWddXSIgZ2V0LWRhdGEtbG9hZC11cmw9IltbX2RhdGFVcmxdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCldXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIj48L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CgogICAgPGRpdiBpZD0iYnV0dG9ucy1yb3ciPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IlJlc2V0IGF4ZXMgdG8gWzAsIDFdLiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InN0ZXAtbGVnZW5kIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTdGVwQXZhaWxhYmxlXV0iIGFzPSJydW4iPgogICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItYm94IiBzdHlsZT0iYmFja2dyb3VuZDogW1tfY29tcHV0ZVJ1bkNvbG9yKHJ1bildXTsiPjwvZGl2PgogICAgICAgICAgW1tydW5dXSBpcyBhdAogICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtbGFiZWwtdGV4dCI+CiAgICAgICAgICAgIHN0ZXAgW1tfY29tcHV0ZUN1cnJlbnRTdGVwRm9yUnVuKF9ydW5Ub1ByQ3VydmVFbnRyeSwgcnVuKV1dIDwvc3Bhbj48YnI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0id2FsbC10aW1lLWxhYmVsLXRleHQiPgogICAgICAgICAgICAoW1tfY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bihfcnVuVG9QckN1cnZlRW50cnksIHJ1bildXSkKICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICB0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiA2MDBweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgICNzdGVwLWxlZ2VuZCB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAubGVnZW5kLXJvdyB7CiAgICAgICAgbWFyZ2luOiA1cHggMCA1cHggMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuY29sb3ItYm94IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMXB4OwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgfQogICAgICAuc3RlcC1sYWJlbC10ZXh0IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAud2FsbC10aW1lLWxhYmVsLXRleHQgewogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTbGlkZXJzXV0iIGFzPSJydW4iPgogICAgICA8ZGl2IGNsYXNzPSJydW4td2lkZ2V0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJydW4tZGlzcGxheS1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0icnVuLWNvbG9yLWJveCIgc3R5bGU9ImJhY2tncm91bmQ6W1tfY29tcHV0ZUNvbG9yRm9yUnVuKHJ1bildXTsiPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icnVuLXRleHQiPgogICAgICAgICAgICBbW3J1bl1dCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwLWRpc3BsYXktY29udGFpbmVyIj4KICAgICAgICAgIFtbX2NvbXB1dGVUaW1lVGV4dEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBfcnVuVG9TdGVwSW5kZXgsCiAgICAgICAgICBydW4sIHRpbWVEaXNwbGF5VHlwZSldXQogICAgICAgIDwvZGl2PgogICAgICAgIDxwYXBlci1zbGlkZXIgZGF0YS1ydW4kPSJbW3J1bl1dIiBzdGVwPSIxIiB0eXBlPSJudW1iZXIiIG1pbj0iMCIgbWF4PSJbW19jb21wdXRlTWF4U3RlcEluZGV4Rm9yUnVuKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIHJ1bildXSIgdmFsdWU9IltbX2dldFN0ZXAoX3J1blRvU3RlcEluZGV4LCBydW4pXV0iIG9uLWltbWVkaWF0ZS12YWx1ZS1jaGFuZ2VkPSJfc2xpZGVyVmFsdWVDaGFuZ2VkIj48L3BhcGVyLXNsaWRlcj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAucnVuLXdpZGdldCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICB9CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgbWFyZ2luOiAtOHB4IDAgMCAtMTVweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc3RlcC1kaXNwbGF5LWNvbnRhaW5lciB7CiAgICAgICAgZm9udC1zaXplOiAwLjllbTsKICAgICAgICBtYXJnaW46IDAgMTVweCAwIDA7CiAgICAgIH0KICAgICAgLnJ1bi10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgLnJ1bi1jb2xvci1ib3ggewogICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgIGhlaWdodDogMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lLXR5cGUtc2VsZWN0b3IiIG5hbWU9IlRpbWUgRGlzcGxheSBUeXBlIiBzZWxlY3RlZC1pZD0ie3tfdGltZURpc3BsYXlUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXNdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iIGlkPSJzdGVwcy1zZWxlY3Rvci1jb250YWluZXIiPgogICAgICAgICAgICA8dGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IgcnVucz0iW1tfcmVsZXZhbnRTZWxlY3RlZFJ1bnNdXSIgcnVuLXRvLXN0ZXA9Int7X3J1blRvU3RlcH19IiBydW4tdG8tYXZhaWxhYmxlLXRpbWUtZW50cmllcz0iW1tfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllc11dIiB0aW1lLWRpc3BsYXktdHlwZT0iW1tfdGltZURpc3BsYXlUeXBlXV0iPjwvdGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gcHJlY2lzaW9u4oCTcmVjYWxsIGN1cnZlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcHJlY2lzaW9u4oCTcmVjYWxsIGRhdGEgdG8geW91ciBldmVudAogICAgICAgICAgICAgICAgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIiBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtcHItY3VydmUtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bnM9IltbaXRlbS5ydW5zXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVucywgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVuLXRvLXN0ZXAtY2FwPSJbW19ydW5Ub1N0ZXBdXSI+PC90Zi1wci1jdXJ2ZS1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIC8qKiBEbyBub3QgbGV0IHRoZSBzdGVwcyBzZWxlY3RvciBvY2NsdWRlIHRoZSBydW4gc2VsZWN0b3IuICovCiAgICAgICNzdGVwcy1zZWxlY3Rvci1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByb2ZpbGUtcmVkaXJlY3QtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgPGgzPlRoZSBwcm9maWxlIHBsdWdpbiBoYXMgbW92ZWQuPC9oMz4KICAgICAgPHA+CiAgICAgICAgUGxlYXNlIGluc3RhbGwgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBwcm9maWxlIHBsdWdpbiBmcm9tIFB5UEkgYnkKICAgICAgICBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmcm9tIHRoZSBtYWNoaW5lIHJ1bm5pbmcgVGVuc29yQm9hcmQ6CiAgICAgIAogICAgICA8dGV4dGFyZWEgaWQ9ImNvbW1hbmRUZXh0YXJlYSIgcmVhZG9ubHkgcm93cz0iMSIgb24tYmx1cj0iX3JlbW92ZUNvcGllZE1lc3NhZ2UiPgpbW19pbnN0YWxsQ29tbWFuZF1dPC90ZXh0YXJlYT4KICAgICAgPGRpdiBpZD0iY29weUNvbnRhaW5lciI+CiAgICAgICAgPHNwYW4gaWQ9ImNvcGllZE1lc3NhZ2UiPjwvc3Bhbj4KICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBvbi10YXA9Il9jb3B5SW5zdGFsbENvbW1hbmQiPkNvcHkgdG8gY2xpcGJvYXJkPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICAubWVzc2FnZSB7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgIH0KICAgICAgI2NvbW1hbmRUZXh0YXJlYSB7CiAgICAgICAgbWFyZ2luLXRvcDogMWV4OwogICAgICAgIHBhZGRpbmc6IDFleCAxZW07CiAgICAgICAgcmVzaXplOiB2ZXJ0aWNhbDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAjY29weUNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAjY29waWVkTWVzc2FnZSB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcGx1Z2luLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX29wZW5dXSI+CiAgICAgIDxkaXYgaWQ9ImRhc2hib2FyZC1iYWNrZHJvcCI+PC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZGlhbG9nIiBtb2RhbCBvcGVuZWQ9Int7X29wZW59fSIgd2l0aC1iYWNrZHJvcD0iW1tfdXNlTmF0aXZlQmFja2Ryb3BdXSI+CiAgICAgIDxoMiBpZD0iZGlhbG9nLXRpdGxlIj5bW190aXRsZV1dPC9oMj4KICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLW1lc3NhZ2UiPltbX2N1c3RvbU1lc3NhZ2VdXTwvZGl2PgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8c3R5bGU+CiAgICAgIC8qKiBXZSByZWx5IG9uIGEgc2VwYXJhdGUgYF9oaWRkZW5gIHByb3BlcnR5IGluc3RlYWQgb2YgZGlyZWN0bHkgbWFraW5nIHVzZQogICAgICAgICAgb2YgdGhlIGBfb3BlbmAgYXR0cmlidXRlIGJlY2F1c2UgdGhpcyBDU1Mgc3BlY2lmaWNhdGlvbiBtYXkgc3RyYW5nZWx5CiAgICAgICAgICBhZmZlY3Qgb3RoZXIgZWxlbWVudHMgdGhyb3VnaG91dCBUZW5zb3JCb2FyZC4gU2VlICM4OTkuICovCiAgICAgICNkYXNoYm9hcmQtYmFja2Ryb3AgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNkaWFsb2ctdGl0bGUgewogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY3VzdG9tLW1lc3NhZ2UgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWJlaG9sZGVyLXZpZGVvIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8aW1nIGlkPSJ2aWRlbyIgc3JjJD0iW1tfaW1hZ2VVUkxdXSI+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIGltZyB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtYmVob2xkZXItaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaXRlbXNdXSI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24taW5mbyIgc3R5bGUkPSJoZWlnaHQ6IFtbaXRlbS5oZWlnaHRdXXB4Ij4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+W1tpdGVtLm5hbWVdXTwvbGk+CiAgICAgICAgICA8bGk+c2hhcGU6IFtbaXRlbS5zaGFwZV1dPC9saT4KICAgICAgICAgIDxsaT5yYW5nZTogWyBbW2l0ZW0ubWluXV0sIFtbaXRlbS5tYXhdXSBdPC9saT4KICAgICAgICAgIDxsaT5tZWFuOiBbW2l0ZW0ubWVhbl1dPC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbi1pbmZvIHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQogICAgICAuc2VjdGlvbi1pbmZvIHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1wbHVnaW4tZGlhbG9nIGlkPSJpbml0aWFsRGlhbG9nIj48L3RmLXBsdWdpbi1kaWFsb2c+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxwIGNsYXNzPSJjb250cm9scy1kaXNhYmxlZC1tZXNzYWdlIj4KICAgICAgICAgICAgICBDb250cm9scyBkaXNhYmxlZDogZGlyZWN0b3J5IGlzIG5vdCB3cml0ZWFibGUuCiAgICAgICAgICAgIAogICAgICAgICAgICA8cCBjbGFzcz0iZGlzY2xhaW1lciI+CiAgICAgICAgICAgICAgQmVob2xkZXIgcmVxdWlyZXMgd3JpdGUgYWNjZXNzIHRvIHRoZSBsb2cgZGlyZWN0b3J5IGluIG9yZGVyIHRvCiAgICAgICAgICAgICAgY29tbXVuaWNhdGUgdmlzdWFsaXphdGlvbiBjaGFuZ2VzIHRvIHRoZSA8Y29kZT5CZWhvbGRlcjwvY29kZT4KICAgICAgICAgICAgICBpbnN0YW5jZSBpbiB5b3VyIG1vZGVsLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMz5WYWx1ZXM8L2gzPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2YWx1ZXNTZWxlY3RvciIgc2VsZWN0ZWQ9Int7X3ZhbHVlc319Ij4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ0cmFpbmFibGVfdmFyaWFibGVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT50Zi50cmFpbmFibGVfdmFyaWFibGVzKCk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1hcnJheXMiIG5hbWU9ImFycmF5cyIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIDxwcmU+Yi51cGRhdGUoYXJyYXlzPVtOUF9BUlJBWVNdKTwvcHJlPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ib3B0aW9uLWZyYW1lcyIgbmFtZT0iZnJhbWVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT5iLnVwZGF0ZShmcmFtZT1OUF9BUlJBWSk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFsdWVzTm90RnJhbWUoX3ZhbHVlcyldXSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19zaG93QWxsfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj5TaG93IGFsbCBkYXRhIDxpPihjYW4gYmUgcmVzb3VyY2UgaW50ZW5zaXZlKTwvaT48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5Nb2RlPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJtb2RlU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19tb2RlfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY3VycmVudCIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgY3VycmVudCB2YWx1ZXMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InZhcmlhbmNlIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICB2YXJpYW5jZSBvdmVyIHRyYWluIHN0ZXBzCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFyaWFuY2VTZWxlY3RlZChfbW9kZSldXSI+CiAgICAgICAgICAgICAgPGg0PlZhcmlhbmNlIHRpbWVzdGVwczoge3tfd2luZG93U2l6ZX19PC9oND4KICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJ3aW5kb3dTbGlkZXIiIHZhbHVlPSJ7e193aW5kb3dTaXplfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIyIiBtYXg9IjIwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5JbWFnZSBzY2FsaW5nPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJzY2FsaW5nU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19zY2FsaW5nfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1sYXllciIgbmFtZT0ibGF5ZXIiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIHBlciBzZWN0aW9uCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbGF5ZXIiIHBvc2l0aW9uPSJyaWdodCI+CiAgICAgICAgICAgICAgICBCbGFjayBpcyB0aGUgbG93ZXN0IHZhbHVlIGluIHRoYXQgc2VjdGlvbiwgd2hpdGUgaXMgdGhhdCBsYXJnZXN0CiAgICAgICAgICAgICAgICB2YWx1ZSBpbiB0aGF0IHNlY3Rpb24uCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJvcHRpb24tbmV0d29yayIgbmFtZT0ibmV0d29yayIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgYWxsIHNlY3Rpb25zCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbmV0d29yayIgcG9zaXRpb249InJpZ2h0Ij4KICAgICAgICAgICAgICAgIEJsYWNrIGlzIHRoZSBzbWFsbGVzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMsIHdoaXRlIGlzIHRoZQogICAgICAgICAgICAgICAgbGFyZ2VzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgICAgPGRpdiBpZD0iY29sb3JtYXAtc2VsZWN0aW9uIj4KICAgICAgICAgICAgICA8ZGl2IGlkPSJjb2xvcm1hcC1zZWxlY3Rpb24tbGFiZWwiPkNvbG9ybWFwOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2NvbG9ybWFwfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bWFnbWE8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmluZmVybm88L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPnBsYXNtYTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+dmlyaWRpczwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+Z3JheXNjYWxlPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGgzPlVwZGF0ZXMgcGVyIHNlY29uZDoge3tfRlBTfX08L2gzPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iRlBTU2xpZGVyIiB2YWx1ZT0ie3tfRlBTfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIwIiBtYXg9IjMwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJyZWNvcmRfYnV0dG9uIiBvbi10YXA9Il90b2dnbGVSZWNvcmQiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICBbW19yZWNvcmRUZXh0XV0KICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgTm90ZTogQmVob2xkZXIgY3VycmVudGx5IG9ubHkgd29ya3Mgd2VsbCBvbiBsb2NhbCBmaWxlIHN5c3RlbXMuCiAgICAgICAgICAKICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc19hY3RpdmVdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gQmVob2xkZXIgZGF0YSB3YXMgZm91bmQuPC9oMz4KCiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3VyIHNjcmlwdCBpc24ndCBydW5uaW5nLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBhcmVuJ3QgY2FsbGluZyA8Y29kZT5iZWhvbGRlci51cGRhdGUoKTwvY29kZT4uPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIFRvIHVzZSBCZWhvbGRlciwgaW1wb3J0IGFuZCBpbnN0YW50aWF0ZSB0aGUKICAgICAgICAgICAgICA8Y29kZT5CZWhvbGRlcjwvY29kZT4gY2xhc3MsIGFuZCBjYWxsIGl0cwogICAgICAgICAgICAgIDxjb2RlPnVwZGF0ZTwvY29kZT4gbWV0aG9kIHdpdGggYSA8Y29kZT5TZXNzaW9uPC9jb2RlPiBhcmd1bWVudAogICAgICAgICAgICAgIGFmdGVyIGV2ZXJ5IHRyYWluIHN0ZXA6CiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuYmVob2xkZXIgaW1wb3J0IEJlaG9sZGVyCmJlaG9sZGVyID0gQmVob2xkZXIoTE9HX0RJUkVDVE9SWSkKCiMgaW5zaWRlIHRyYWluIGxvb3AKYmVob2xkZXIudXBkYXRlKAogIHNlc3Npb249c2VzcywKICBhcnJheXM9bGlzdF9vZl9ucF9hcnJheXMsICAjIG9wdGlvbmFsIGFyZ3VtZW50CiAgZnJhbWU9dHdvX2RpbWVuc2lvbmFsX25wX2FycmF5LCAgIyBvcHRpb25hbCBhcmd1bWVudAopPC9wcmU+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHVzaW5nIDxjb2RlPnRmLnRyYWluLk1vbml0b3JlZFNlc3Npb248L2NvZGU+LCB5b3UgY2FuIHVzZQogICAgICAgICAgICAgIDxjb2RlPkJlaG9sZGVySG9vazwvY29kZT46CiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuYmVob2xkZXIgaW1wb3J0IEJlaG9sZGVySG9vawpiZWhvbGRlcl9ob29rID0gQmVob2xkZXJIb29rKExPR19ESVJFQ1RPUlkpCndpdGggTW9uaXRvcmVkU2Vzc2lvbiguLi4sIGhvb2tzPVtiZWhvbGRlcl9ob29rXSkgYXMgc2VzczoKICBzZXNzLnJ1bih0cmFpbl9vcCk8L3ByZT4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBldmVyeXRoaW5nIGlzIHNldCB1cCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL3RlbnNvcmJvYXJkL3BsdWdpbnMvYmVob2xkZXIvUkVBRE1FLm1kIj50aGUgUkVBRE1FPC9hPgogICAgICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgICBOb3RlOiBCZWhvbGRlciBjdXJyZW50bHkgb25seSB3b3JrcyB3ZWxsIG9uIGxvY2FsIGZpbGUgc3lzdGVtcy4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzX2FjdGl2ZV1dIj4KICAgICAgICAgIDx0Zi1iZWhvbGRlci12aWRlbyBpZD0idmlkZW8iIGZwcz0iW1tfRlBTXV0iPjwvdGYtYmVob2xkZXItdmlkZW8+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgICAgPHRmLWJlaG9sZGVyLWluZm8gaWQ9ImluZm8iIGZwcz0iW1tfRlBTXV0iPiA8L3RmLWJlaG9sZGVyLWluZm8+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwOwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogNXB4OwoKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1yYWRpby1jb250YWluZXI6IHsKICAgICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIGZsZXgtZ3JvdzogMjsKICAgICAgfQoKICAgICAgcHJlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiNyZWNvcmRfYnV0dG9uIHsKICAgICAgICBjb2xvcjogI2QzMmYyZjsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uI3JlY29yZF9idXR0b24uaXMtcmVjb3JkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZDMyZjJmOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbi5iZWhvbGRlci1kYXNoYm9hcmQ6bGFzdC1jaGlsZCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CgogICAgICAjY29sb3JtYXAtc2VsZWN0aW9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbi1sYWJlbCB7CiAgICAgICAgbWFyZ2luLXRvcDogMTNweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbiBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CgogICAgICBoNCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgbWFyZ2luOiA1cHggMDsKICAgICAgfQoKICAgICAgcC5kaXNjbGFpbWVyIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIHAuY29udHJvbHMtZGlzYWJsZWQtbWVzc2FnZSB7CiAgICAgICAgY29sb3I6ICNjMDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tc3BsaXQtbGF5b3V0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCA+ICNzcGxpdHRlciB7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBtaW4td2lkdGg6IDhweDsKICAgICAgICBtaW4taGVpZ2h0OiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvciwgI2NjYyk7CiAgICAgICAgZmlsbDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKTsKICAgICAgICBAYXBwbHkgLS12YWFkaW4tc3BsaXQtbGF5b3V0LXNwbGl0dGVyOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFt2ZXJ0aWNhbF0pKSA+ICNzcGxpdHRlciB7CiAgICAgICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pID4gI3NwbGl0dGVyIHsKICAgICAgICBjdXJzb3I6IG5zLXJlc2l6ZTsKICAgICAgfQoKICAgICAgI2hhbmRsZSwKICAgICAgI3NwbGl0dGVyIDo6c2xvdHRlZChbc2xvdD1oYW5kbGVdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsXSkgPiAjc3BsaXR0ZXIgI2hhbmRsZSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDkwZGVnKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJwcmltYXJ5IiBuYW1lPSJwcmltYXJ5Ij48L3Nsb3Q+CiAgICA8ZGl2IGlkPSJzcGxpdHRlciIgb24tdHJhY2s9Il9vbkhhbmRsZVRyYWNrIiBvbi1kb3duPSJfcHJldmVudERlZmF1bHQiPgogICAgICA8c2xvdCBuYW1lPSJoYW5kbGUiPgogICAgICAgIDxzdmcgaWQ9ImhhbmRsZSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIj4KICAgICAgICAgIDxyZWN0IHg9IjE5IiB5PSI4IiB3aWR0aD0iMiIgaGVpZ2h0PSIyNCI+PC9yZWN0PgogICAgICAgIDwvc3ZnPgogICAgICA8L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzbG90IGlkPSJzZWNvbmRhcnkiIG5hbWU9InNlY29uZGFyeSI+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1xdWVyeS1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9Imh5cGVycGFyYW1ldGVycy1tZXRyaWNzLXN0YXR1c2VzIj4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsIGlkPSJoeXBlcnBhcmFtZXRlcnMtbWV0cmljcyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gaHlwZXJwYXJhbWV0ZXJzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5IeXBlcnBhcmFtZXRlcnM8L2Rpdj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19ocGFyYW1zfX0iIGFzPSJocGFyYW0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aHBhcmFtLmRpc3BsYXllZH19IiBjbGFzcz0iaHBhcmFtLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbS5pbmZvKV1dCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tocGFyYW0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aXRlbS5jaGVja2VkfX0iIGNsYXNzPSJkaXNjcmV0ZS12YWx1ZS1jaGVja2JveCIgb24tY2hhbmdlPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICBbW19wcmV0dHlQcmludChpdGVtLnZhbHVlKV1dCiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbF1dIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1pbiIgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIgYWxsb3dlZF9wYXR0ZXJuPSJbMC05LmVcLV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tocGFyYW0uZmlsdGVyLmludGVydmFsLm1pbi5pbnZhbGlkXV0iIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNYXgiIHZhbHVlPSJ7e2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXC1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbC5tYXguaW52YWxpZF1dIiBwbGFjZWhvbGRlcj0iK2luZmluaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIucmVnZXhwXV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUmVndWxhciBleHByZXNzaW9uIiB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLnJlZ2V4cH19IiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBtZXRyaWNzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5NZXRyaWNzPC9kaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfbWV0cmljc319IiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1ldHJpYyI+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3ttZXRyaWMuZGlzcGxheWVkfX0iIGNsYXNzPSJtZXRyaWMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljLmluZm8pXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lLWVsZW1lbnQiPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWluIiB2YWx1ZT0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1pbi52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTkuZVwtXSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWR9fSIgcGxhY2Vob2xkZXI9Ii1pbmZpbml0eSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50Ij4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05LmVcLV0iIHZhbHVlPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1heC5pbnZhbGlkfX0iIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIHN0YXR1cyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlN0YXR1czwvZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zdGF0dXNlc11dIiBhcz0ic3RhdHVzIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tzdGF0dXMuYWxsb3dlZH19IiBvbi1jaGFuZ2U9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICBbW3N0YXR1cy5kaXNwbGF5TmFtZV1dCiAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbCBpZD0ic29ydGluZy1wYWdpbmciPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBzb3J0aW5nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U29ydGluZzwvZGl2PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU29ydCBieSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc29ydEJ5SW5kZXh9fSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaHBhcmFtc11dIiBhcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW0uaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWV0cmljc11dIiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWMuaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iRGlyZWN0aW9uIiBvbi1zZWxlY3RlZC1pdGVtLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zb3J0RGlyZWN0aW9ufX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+QXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+RGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9InBhZ2luZy1kb3dubG9hZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gcGFnaW5nIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5QYWdpbmc8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgTnVtYmVyIG9mIG1hdGNoaW5nIHNlc3Npb24gZ3JvdXBzOgogICAgICAgICAgICAgICAgW1tfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHJdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2UtbnVtYmVyLWlucHV0Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUGFnZSAjIiB2YWx1ZT0ie3tfcGFnZU51bWJlcklucHV0LnZhbHVlfX0iIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbX3BhZ2VOdW1iZXJJbnB1dC5pbnZhbGlkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD0ic3VmZml4IiBjbGFzcz0icGFnZS1zdWZmaXgiPgogICAgICAgICAgICAgICAgICAgIC8gW1tfcGFnZUNvdW50U3RyXV0KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2Utc2l6ZS1pbnB1dCI+CiAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCAjIG9mIHNlc3Npb24gZ3JvdXBzIHBlciBwYWdlOiIgdmFsdWU9Int7X3BhZ2VTaXplSW5wdXQudmFsdWV9fSIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05XSIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tfcGFnZVNpemVJbnB1dC5pbnZhbGlkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBkb3dubG9hZCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXNzaW9uR3JvdXBzUmVxdWVzdF1dIj4KICAgICAgICAgICAgICAgIERvd25sb2FkIGRhdGEgYXMKICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICA8YSBpZD0iY3N2TGluayIgZG93bmxvYWQ9ImhwYXJhbXNfdGFibGUuY3N2IiBocmVmPSJbW19jc3ZVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIj5DU1Y8L2E+CiAgICAgICAgICAgICAgICAgIDxhIGlkPSJqc29uTGluayIgZG93bmxvYWQ9ImhwYXJhbXNfdGFibGUuanNvbiIgaHJlZj0iW1tfanNvblVybChfc2Vzc2lvbkdyb3Vwc1JlcXVlc3QsIGNvbmZpZ3VyYXRpb24pXV0iPkpTT048L2E+CiAgICAgICAgICAgICAgICAgIDxhIGlkPSJsYXRleExpbmsiIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLnRleCIgaHJlZj0iW1tfbGF0ZXhVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIj5MYVRlWDwvYT4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAucGFuZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuc2VjdGlvbiB7CiAgICAgICAgbWFyZ2luOiA1cHggMTBweCA1cHggMTBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA3cHg7CiAgICAgIH0KICAgICAgI2h5cGVycGFyYW1ldGVycy1tZXRyaWNzLXN0YXR1c2VzIHsKICAgICAgICBmbGV4LWJhc2lzOiA3MCU7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgICNoeXBlcnBhcmFtZXRlcnMtbWV0cmljcyB7CiAgICAgICAgZmxleC1iYXNpczogOTAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuaHlwZXJwYXJhbWV0ZXJzIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubWV0cmljcyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnN0YXR1c2VzIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAjc29ydGluZy1wYWdpbmcgewogICAgICAgIGZsZXgtYmFzaXM6IDMwJTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgI3BhZ2luZy1kb3dubG9hZCB7CiAgICAgICAgZmxleC1iYXNpczogOTAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuc29ydGluZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLnBhZ2luZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLmRvd25sb2FkIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3gsCiAgICAgIC5tZXRyaWMtY2hlY2tib3gsCiAgICAgIC5ocGFyYW0tY2hlY2tib3ggewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5kaXNjcmV0ZS12YWx1ZS1jaGVja2JveCB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7CiAgICAgIH0KICAgICAgLmhwYXJhbSwKICAgICAgLm1ldHJpYyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmlubGluZS1lbGVtZW50IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDQwJTsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgfQogICAgICAucGFnZS1udW1iZXItaW5wdXQgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgIH0KICAgICAgLnBhZ2Utc2l6ZS1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDYwJTsKICAgICAgfQogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItbGlzdGJveCB7CiAgICAgICAgbWF4LWhlaWdodDogMTVlbTsKICAgICAgfQogICAgICAucGFnZS1zdWZmaXggewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tcGFnZXMiPgoKICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoOm5vdChzbG90KTpub3QoLmlyb24tc2VsZWN0ZWQpKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWhlYWRlci1wYW5lbCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsOwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgI21haW5QYW5lbCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1ib2R5OwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2Nyb2xsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zY3JvbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNjcm9sbC1jb250YWluZXI7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IGNvdmVyCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1jb3Zlcl0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY292ZXItY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5QYW5lbCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc3RhbmRhcmQKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXN0YW5kYXJkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zdGFuZGFyZC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHNlYW1lZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c2VhbWVkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zZWFtZWQtY29udGFpbmVyOwogICAgICB9CgoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXdhdGVyZmFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHdhdGVyZmFsbC10YWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGwtdGFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLXRhbGwtY29udGFpbmVyOwogICAgICB9CgogICAgICAjZHJvcFNoYWRvdyB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzOwogICAgICAgIGhlaWdodDogNnB4OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zaGFkb3c7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93Lmhhcy1zaGFkb3cgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyID4gOjpzbG90dGVkKC5maXQpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgPC9zdHlsZT4KCiAgICA8c2xvdCBpZD0iaGVhZGVyU2xvdCIgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CgogICAgPGRpdiBpZD0ibWFpblBhbmVsIj4KICAgICAgPGRpdiBpZD0ibWFpbkNvbnRhaW5lciIgY2xhc3MkPSJbW19jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzKG1vZGUpXV0iPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImRyb3BTaGFkb3ciPjwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10YWIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1pbmxpbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbbGlua10pIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudGFiLWNvbnRlbnQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50OwogICAgICB9CgogICAgICA6aG9zdCg6bm90KC5pcm9uLXNlbGVjdGVkKSkgPiAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDAuODsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiLWNvbnRlbnQtdW5zZWxlY3RlZDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgfQoKICAgICAgcGFwZXItcmlwcGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdGFiLWluaywgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgfQoKICAgICAgLnRhYi1jb250ZW50ID4gOjpzbG90dGVkKGEpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItdGFicyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iY2hldnJvbi1sZWZ0Ij48cGF0aCBkPSJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiIC8+PC9nPgo8ZyBpZD0iY2hldnJvbi1yaWdodCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10YWJzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKCiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiczsKICAgICAgfQoKICAgICAgOmhvc3QoOmRpcihydGwpKSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWwtcmV2ZXJzZTsKICAgICAgfQoKICAgICAgI3RhYnNDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1jb250YWluZXI7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIC1tb3otZmxleC1iYXNpczogYXV0bzsKICAgICAgICAtbXMtZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYnMtY29udGVudDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQ6bm90KC5zY3JvbGxhYmxlKSwKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudC5zY3JvbGxhYmxlLmZpdC1jb250YWluZXIgewogICAgICAgIG1pbi13aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgLyogSUUgLSBwcmV2ZW50IHRhYnMgZnJvbSBjb21wcmVzc2luZyB3aGVuIHRoZXkgc2hvdWxkIHNjcm9sbC4gKi8KICAgICAgICAtbXMtZmxleDogMSAwIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDAgYXV0bzsKICAgICAgICBmbGV4OiAxIDAgYXV0bzsKICAgICAgfQoKICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLm5vdC12aXNpYmxlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIG1hcmdpbjogMCA0cHg7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvciwgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmFsaWduLWJvdHRvbSB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogYXV0bzsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhci5leHBhbmQgewogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMTVzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDEsIDEpOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmNvbnRyYWN0IHsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE4czsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMCwgMC4wLCAwLjIsIDEpOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQgPiA6OnNsb3R0ZWQoOm5vdCgjc2VsZWN0aW9uQmFyKSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0icGFwZXItdGFiczpjaGV2cm9uLWxlZnQiIGNsYXNzJD0iW1tfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzKF9sZWZ0SGlkZGVuLCBzY3JvbGxhYmxlLCBoaWRlU2Nyb2xsQnV0dG9ucyldXSIgb24tdXA9Il9vblNjcm9sbEJ1dHRvblVwIiBvbi1kb3duPSJfb25MZWZ0U2Nyb2xsQnV0dG9uRG93biIgdGFiaW5kZXg9Ii0xIj48L3BhcGVyLWljb24tYnV0dG9uPgoKICAgIDxkaXYgaWQ9InRhYnNDb250YWluZXIiIG9uLXRyYWNrPSJfc2Nyb2xsIiBvbi1kb3duPSJfZG93biI+CiAgICAgIDxkaXYgaWQ9InRhYnNDb250ZW50IiBjbGFzcyQ9IltbX2NvbXB1dGVUYWJzQ29udGVudENsYXNzKHNjcm9sbGFibGUsIGZpdENvbnRhaW5lcildXSI+CiAgICAgICAgPGRpdiBpZD0ic2VsZWN0aW9uQmFyIiBjbGFzcyQ9IltbX2NvbXB1dGVTZWxlY3Rpb25CYXJDbGFzcyhub0JhciwgYWxpZ25Cb3R0b20pXV0iIG9uLXRyYW5zaXRpb25lbmQ9Il9vbkJhclRyYW5zaXRpb25FbmQiPjwvZGl2PgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0icGFwZXItdGFiczpjaGV2cm9uLXJpZ2h0IiBjbGFzcyQ9IltbX2NvbXB1dGVTY3JvbGxCdXR0b25DbGFzcyhfcmlnaHRIaWRkZW4sIHNjcm9sbGFibGUsIGhpZGVTY3JvbGxCdXR0b25zKV1dIiBvbi11cD0iX29uU2Nyb2xsQnV0dG9uVXAiIG9uLWRvd249Il9vblJpZ2h0U2Nyb2xsQnV0dG9uRG93biIgdGFiaW5kZXg9Ii0xIj48L3BhcGVyLWljb24tYnV0dG9uPgoKICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b29sYmFyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItaGVpZ2h0LCA2NHB4KTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0LCA1NnB4KTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci10b29sYmFyLWJhY2tncm91bmQsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbGJhci1jb2xvciwgdmFyKC0tZGFyay10aGVtZS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhcjsKICAgICAgfQoKICAgICAgOmhvc3QoLmFuaW1hdGUpIHsKICAgICAgICB0cmFuc2l0aW9uOiB2YXIoLS1wYXBlci10b29sYmFyLXRyYW5zaXRpb24sIGhlaWdodCAwLjE4cyBlYXNlLWluKTsKICAgICAgfQoKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMik7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1tZWRpdW07CiAgICAgIH0KCiAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMyk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10YWxsOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCk7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1jb250ZW50OwogICAgICB9CgogICAgICAvKgogICAgICAgKiBUT0RPOiBXaGVyZSBzaG91bGQgbWVkaWEgcXVlcnkgYnJlYWtwb2ludHMgbGl2ZSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBlbGVtZW50cz8KICAgICAgICovCgogICAgICBAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAyKTsKICAgICAgICB9CgogICAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAzKTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLXRvb2xzIHsKICAgICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAjdG9wQmFyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC8qIG1pZGRsZSBiYXIgKi8KICAgICAgI21pZGRsZUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICA6aG9zdCgudGFsbCkgI21pZGRsZUJhciwKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSAjbWlkZGxlQmFyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7CiAgICAgIH0KCiAgICAgIC8qIGJvdHRvbSBiYXIgKi8KICAgICAgI2JvdHRvbUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtYWtlIGVsZW1lbnRzIChlLmcuIGJ1dHRvbnMpIHJlc3BvbmQgdG8gbW91c2UvdG91Y2ggZXZlbnRzCiAgICAgICAqCiAgICAgICAqIGAudG9vbGJhci10b29sc2AgZGlzYWJsZXMgdG91Y2ggZXZlbnRzIHNvIG11bHRpcGxlIHRvb2xiYXJzIGNhbiBzdGFjayBhbmQgbm90CiAgICAgICAqIGFic29yYiBldmVudHMuIEFsbCBjaGlsZHJlbiBtdXN0IGhhdmUgcG9pbnRlciBldmVudHMgcmUtZW5hYmxlZCB0byB3b3JrIGFzCiAgICAgICAqIGV4cGVjdGVkLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoKjpub3QoW2Rpc2FibGVkXSkpIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiA1NnB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbiArIC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIC0tcGFwZXItdG9vbGJhci10aXRsZSBtaXhpbiBpcyBhcHBsaWVkIGhlcmUgaW5zdGVhZCBvZiBhYm92ZSB0bwogICAgICAgKiBmaXggdGhlIGlzc3VlIHdpdGggbWFyZ2luLWxlZnQgYmVpbmcgaWdub3JlZCBkdWUgdG8gY3NzIG9yZGVyaW5nLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10aXRsZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQocGFwZXItaWNvbi1idXR0b25baWNvbj1tZW51XSkgewogICAgICAgIG1hcmdpbi1yaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGF1dG87CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAvKiBUT0RPKG5vbXMpOiBVbnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIGZvciBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlCiAgICAgICAqIC9kZWVwLyBjcmVhdGUgb3VyIG93bi4KICAgICAgICovCiAgICAgIC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1zdGFydC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5jZW50ZXItanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmVuZC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CgogICAgICAuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWFyb3VuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9wQmFyIiBjbGFzcyQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3NlcyhqdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0idG9wIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJtaWRkbGVCYXIiIGNsYXNzJD0idG9vbGJhci10b29scyBbW19jb21wdXRlQmFyRXh0cmFDbGFzc2VzKG1pZGRsZUp1c3RpZnkpXV0iPgogICAgICA8c2xvdCBuYW1lPSJtaWRkbGUiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImJvdHRvbUJhciIgY2xhc3MkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoYm90dG9tSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9ImJvdHRvbSI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtcGFuZWwiPgogICAgICAKICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkNvbG9yIGJ5IiBpZD0iY29sb3JCeURyb3BEb3duTWVudSIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e29wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4fX0iIGlkPSJjb2xvckJ5TGlzdEJveCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW29wdGlvbnMuY29sdW1uc11dIiBhcz0iY29sdW1uIiBpZD0iY29sb3JCeUNvbHVtblRlbXBsYXRlIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gZGlzYWJsZWQ9IltbIV9pc051bWVyaWNDb2x1bW4oY29sdW1uLmluZGV4KV1dIj4KICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KCiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJjb2x1bW5zLWNvbnRhaW5lciI+CiAgICAgICAgCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvcHRpb25zLmNvbHVtbnN9fSIgYXM9ImNvbHVtbiI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbi10aXRsZSI+CiAgICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGNsYXNzPSJzY2FsZS1yYWRpby1ncm91cCIgc2VsZWN0ZWQ9Int7Y29sdW1uLnNjYWxlfX0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkxJTkVBUiI+CiAgICAgICAgICAgICAgICAgICAgTGluZWFyCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ibG9nU2NhbGVCdXR0b25fW1tjb2x1bW4ubmFtZV1dIiBuYW1lPSJMT0ciIGRpc2FibGVkPSJbWyFfYWxsb3dMb2dTY2FsZShjb2x1bW4sIHNlc3Npb25Hcm91cHMuKildXSI+CiAgICAgICAgICAgICAgICAgICAgTG9nYXJpdGhtaWMKICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iUVVBTlRJTEUiPgogICAgICAgICAgICAgICAgICAgIFF1YW50aWxlCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmNvbnRyb2wtcGFuZWwgewogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC5jb2x1bW4gewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgICBib3JkZXI6IHNvbGlkIDFweCBkYXJrZ3JheTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgIH0KICAgICAgLmNvbHVtbi10aXRsZSB7CiAgICAgICAgLyogRml0IGV2ZXJ5IHRpdGxlIGluIG9uZSBsaW5lIHNvIHRoZSByYWRpbyBib3hlcyBhbGlnbiB2ZXJ0aWNhbGx5LiAqLwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgICAgLmNvbHVtbnMtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgLnNjYWxlLXJhZGlvLWdyb3VwIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMnB4OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWFjdGl2ZS1pdGVtLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93W2FjdGl2ZV0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1hY3RpdmUtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICN0YWJsZSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgICB6LWluZGV4OiAtMjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbaW9zXSAjdGFibGUgewogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdICN0YWJsZSB7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICB6LWluZGV4OiAtMTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHsKICAgICAgICAvKiBBbnkgdmFsdWUgb3RoZXIgdGhhbiDigJhub25l4oCZIGZvciB0aGUgdHJhbnNmb3JtIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGJvdGggYSBzdGFja2luZyBjb250ZXh0IGFuZAogICAgICAgIGEgY29udGFpbmluZyBibG9jay4gVGhlIG9iamVjdCBhY3RzIGFzIGEgY29udGFpbmluZyBibG9jayBmb3IgZml4ZWQgcG9zaXRpb25lZCBkZXNjZW5kYW50cy4gKi8KICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtYm9keSNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtY2VsbCI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiPjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIj48L2RvbS1tb2R1bGU+Cjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zaXplci1jZWxsIj48L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtc2l6ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuY2VsbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgZm9udC1zaXplOiAxcHg7CiAgICAgICAgbWFyZ2luLXRvcDogLTFlbTsKICAgICAgfQoKICAgICAgLmNlbGxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jb2x1bW5zXV0iIGFzPSJjb2x1bW4iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXItY2VsbCBjbGFzcz0iY2VsbCIgY29sdW1uPSJbW2NvbHVtbl1dIj4mbmJzcDs8L3ZhYWRpbi1ncmlkLXNpemVyLWNlbGw+CiAgICA8L3RlbXBsYXRlPgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbcGFzc3Rocm91Z2hdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpb3NdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICB6LWluZGV4OiAtMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2lvc11bc2Nyb2xsaW5nXSkgewogICAgICAgIHotaW5kZXg6IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgOmhvc3QgewogICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgei1pbmRleDogLTM7CiAgICAgICBoZWlnaHQ6IDA7CiAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgIH0KCiAgICAgOmhvc3QoOmZvY3VzKSwKICAgICAucHJpbWFyeTpmb2N1cywKICAgICA6OnNsb3R0ZWQoLnByaW1hcnk6Zm9jdXMpLAogICAgIC5zZWNvbmRhcnk6Zm9jdXMsCiAgICAgOjpzbG90dGVkKC5zZWNvbmRhcnk6Zm9jdXMpIHsKICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgfQogICAgPC9zdHlsZT4KCiAgICAKICAgIDxkaXYgY2xhc3M9InByaW1hcnkiIHRhYmluZGV4PSIwIiByb2xlPSJncmlkY2VsbCIgb24tZm9jdXM9Il9vbkJhaXRGb2N1cyIgb24tYmx1cj0iX29uQmFpdEJsdXIiPjxkaXYgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PjwvZGl2PgogICAgPGRpdiBjbGFzcz0ic2Vjb25kYXJ5IiB0YWJpbmRleD0iLTEiIHJvbGU9ImdyaWRjZWxsIiBvbi1mb2N1cz0iX29uQmFpdEZvY3VzIiBvbi1ibHVyPSJfb25CYWl0Qmx1ciI+PGRpdiBhcmlhLWhpZGRlbj0idHJ1ZSI+Jm5ic3A7PC9kaXY+PC9kaXY+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXJvdyI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyI+PC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2RldGFpbHNjZWxsXSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAudmFhZGluLWdyaWQtY2VsbFtkZXRhaWxzY2VsbF0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctZGV0YWlscy1jZWxsKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIC8qIEFuaW0gKi8KICAgICAgQGtleWZyYW1lcyB2YWFkaW4tZ3JpZC1zcGluLTM2MCB7CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgdmFhZGluLWdyaWQtc3Bpbi0zNjAgewogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNzcGlubmVyIHsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDNBOUY0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtOHB4OwogICAgICAgIG1hcmdpbi10b3A6IC04cHg7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtbG9hZGluZy1zcGlubmVyKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2xvYWRpbmddKSAjc3Bpbm5lciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICA6aG9zdChbbG9hZGluZ10pICNpdGVtcyB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3dbc2VsZWN0ZWRdIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS0xMDAsIHJnYigyNDMsIDI0MywgMjQzKSk7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctc2VsZWN0ZWQtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLW5hdmlnYXRpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KDpmb2N1cyksCiAgICAgICN0YWJsZTpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW25hdmlnYXRpbmddOm5vdChbaW50ZXJhY3RpbmddKSkgW2ZvY3VzZWRdID4gLnZhYWRpbi1ncmlkLXJvd1tmb2N1c2VkXSA+IFtmb2N1c2VkXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb2N1c2VkLWNlbGwpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtyZW9yZGVyaW5nXSAudmFhZGluLWdyaWQtY2VsbCB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQoKICAgICAgOmhvc3QoW3Jlb3JkZXJpbmddKSAudmFhZGluLWdyaWQtY2VsbFtyZW9yZGVyLXN0YXR1cz0iZHJhZ2dpbmciXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW3Jlb3JkZXJpbmddIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtczsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAjc2Nyb2xsZXIgLnZhYWRpbi1ncmlkLWNlbGxbcmVvcmRlci1zdGF0dXM9ImFsbG93ZWQiXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDAwKTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBvcGFjaXR5OiAwLjk1OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgQGtleWZyYW1lcyBhcHBlYXIgewogICAgICAgIHRvIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGFuaW1hdGlvbjogMW1zIGFwcGVhcjsKICAgICAgfQoKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1tYXgtZGV2aWNlLXBpeGVsLXJhdGlvOiAxKSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIGJvcmRlci10b3A6IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgI2l0ZW1zID4gLnZhYWRpbi1ncmlkLXJvdyB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1jZWxsLAogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMzVweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgIH0KCiAgICAgIFtsYXN0Y29sdW1uXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSwKICAgICAgW2xhc3QtZnJvemVuXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZF0gI2hlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtcm93Om5vdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIFtmcm96ZW5dIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbbm8tY29udGVudC1wb2ludGVyLWV2ZW50c10gLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2lvc11bY29sdW1uLXJlc2l6aW5nXSkgI291dGVyc2Nyb2xsZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgICNmaXhlZHNpemVyLAogICAgICAjb3V0ZXJzaXplciB7CiAgICAgICAgYm9yZGVyLXRvcDogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItYm90dG9tOiAwIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAjdGFibGUgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjdGFibGVbb3ZlcmZsb3ctaGlkZGVuXSwKICAgICAgI291dGVyc2Nyb2xsZXJbb3ZlcmZsb3ctaGlkZGVuXSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtc2l6ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpemVyd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IC0xMDA7CiAgICAgIH0KCiAgICAgICNyZW9yZGVyZ2hvc3QgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uKSwKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLXNlbGVjdGlvbi1jb2x1bW4pLAogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uLWdyb3VwKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgLyogRGVmYXVsdCBib3JkZXJzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIC52YWFkaW4tZ3JpZC1yb3c6Zmlyc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93Om5vdChbbGFzdHJvd10pIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgIH0KCiAgICAgIFtsYXN0LWZyb3plbl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICAvKiBDb2x1bW4gcmVzaXplIGhhbmRsZSAqLwoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1jb2x1bW4tcmVzaXplLWhhbmRsZSk7CiAgICAgIH0KCiAgICAgIC8qIENlbGxzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1oZWFkZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb290ZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgW29kZF0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1vZGQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pW2xhc3QtZnJvemVuXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbC1sYXN0LWZyb3plbik7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlOm5vdChbc2Nyb2xsaW5nXSkgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93OmhvdmVyIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1ob3Zlci1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbC52YWFkaW4tZ3JpZC1jZWxsW2xhc3Rjb2x1bW5dIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZSI+CiAgPHRlbXBsYXRlPgogICAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc2Nyb2xsLXN0eWxlcyI+PC9zdHlsZT4KICAgICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxkaXYgaWQ9InNwaW5uZXIiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJ0YWJsZSIgdGFiaW5kZXg9Ii0xIiBvdmVyZmxvdy1oaWRkZW4kPSJbW19oaWRlVGFibGVPdmVyZmxvdyhzY3JvbGxiYXJXaWR0aCwgc2FmYXJpKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzaXplcndyYXBwZXIiPgogICAgICAgICAgPHZhYWRpbi1ncmlkLXNpemVyIGlkPSJmaXhlZHNpemVyIiB0b3A9IltbX2VzdFNjcm9sbEhlaWdodF1dIiBjb2x1bW4tdHJlZT0iW1tjb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtc2l6ZXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNsb3QgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CiAgICAgICAgPHNsb3QgbmFtZT0iaXRlbXMiPjwvc2xvdD4KICAgICAgICA8c2xvdCBuYW1lPSJmb290ZXIiPjwvc2xvdD4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJyZW9yZGVyZ2hvc3QiPjwvZGl2PgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIgaWQ9Im91dGVyc2Nyb2xsZXIiIHNjcm9sbC10YXJnZXQ9Iltbc2Nyb2xsVGFyZ2V0XV0iIG92ZXJmbG93LWhpZGRlbiQ9IltbX2hpZGVPdXRlclNjcm9sbGVyKHNjcm9sbGJhcldpZHRoLCBzYWZhcmkpXV0iIGlvcyQ9IltbaW9zXV0iIHNjcm9sbGluZyQ9Iltbc2Nyb2xsaW5nXV0iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXIgaWQ9Im91dGVyc2l6ZXIiIHRvcD0iW1tfZXN0U2Nyb2xsSGVpZ2h0XV0iIGNvbHVtbi10cmVlPSJbW2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC1zaXplcj4KICAgIDwvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXI+CiAgICA8c2xvdD48L3Nsb3Q+CiAgICA8c2xvdCBuYW1lPSJmb290ZXJGb2N1c1RyYXAiPjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbiI+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvciwgI2ZmZik7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtcm93LWRldGFpbHMtc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXNlbGVjdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtbmF2aWdhdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1jb2x1bW4tcmVvcmRlcmluZy10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CgogICAgPHZhYWRpbi1ncmlkLXRhYmxlIGlkPSJzY3JvbGxlciIgbG9hZGluZyQ9IltbX2xvYWRpbmddXSIgYmluZC1kYXRhPSJbW19iaW5kRGF0YV1dIiBzaXplPSJbW3NpemVdXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSIgcm93LWRldGFpbHMtdGVtcGxhdGU9IltbX3Jvd0RldGFpbHNUZW1wbGF0ZV1dIiBjb2x1bW4tcmVvcmRlcmluZy1hbGxvd2VkPSJbW2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkXV0iPgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIGlkPSJoZWFkZXIiIHNsb3Q9ImhlYWRlciIgdGFyZ2V0PSJbW19nZXRDb250ZW50VGFyZ2V0KCldXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXI+CiAgICAgIDx2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IGlkPSJpdGVtcyIgc2xvdD0iaXRlbXMiPjwvdmFhZGluLWdyaWQtdGFibGUtYm9keT4KICAgICAgPHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciBpZD0iZm9vdGVyIiBzbG90PSJmb290ZXIiIHRhcmdldD0iW1tfZ2V0Q29udGVudFRhcmdldCgpXV0iIGNvbHVtbi10cmVlPSJbW19jb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyPgoKICAgICAgCiAgICAgIDxzbG90IG5hbWU9ImZvb3RlckZvY3VzVHJhcCI+PC9zbG90PgoKICAgICAgCiAgICAgIAogICAgICA8c2xvdD48L3Nsb3Q+CgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCBpZD0iZm9vdGVyRm9jdXNUcmFwIiBzbG90PSJmb290ZXJGb2N1c1RyYXAiIG9uLWZvY3VzLWdhaW5lZD0iX29uRm9vdGVyRm9jdXMiIG9uLWZvY3VzLWxvc3Q9Il9vbkZvY3Vzb3V0Ij4KICAgICAgPC92YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwPgogICAgPC92YWFkaW4tZ3JpZC10YWJsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFzZXNzaW9uR3JvdXBdXSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgzPk5vIHNlc3Npb24gZ3JvdXAgc2VsZWN0ZWQ8L2gzPgogICAgICAgIDxwPlBsZWFzZSBzZWxlY3QgYSBzZXNzaW9uIGdyb3VwIHRvIHNlZSBpdHMgbWV0cmljLWdyYXBocyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXZlTWV0cmljcyh2aXNpYmxlU2NoZW1hLiopXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBtZXRyaWNzIGFyZSBlbmFibGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2UgZW5hYmxlIHNvbWUgbWV0cmljcyB0byBzZWUgY29udGVudCBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQgaG9yaXpvbnRhbCB3cmFwIHNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGF2ZU1ldHJpY3NBbmRTZXNzaW9uR3JvdXAodmlzaWJsZVNjaGVtYS4qLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cCldXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zXV0iIGFzPSJtZXRyaWNJbmZvIj4KICAgICAgICAgIAogICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGNsYXNzPSJzY2FsYXItY2FyZCIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS10by1sb2FkPSJbW19jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHNlc3Npb25Hcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNJbmZvKV1dIiB0YWc9IltbbWV0cmljSW5mby5uYW1lLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX2NvbXB1dGVUYWdNZXRhZGF0YShtZXRyaWNJbmZvKV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIG11bHRpLWV4cGVyaW1lbnRzPSJbW19ub011bHRpRXhwZXJpbWVudHNdXSIgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIiBhY3RpdmU+CiAgICAgICAgICA8L3RmLXNjYWxhci1jYXJkPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIAogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXRhYmxlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tZ3JpZCBjbGFzcz0ic2Vzc2lvbi1ncm91cC10YWJsZSIgaWQ9InNlc3Npb25Hcm91cHNUYWJsZSIgY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZCBpdGVtcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMCIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+VHJpYWwgSUQ8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPltbaXRlbS5uYW1lXV08L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2VuYWJsZVNob3dNZXRyaWNzXV0iPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIwIiB3aWR0aD0iNWVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5TaG93IE1ldHJpY3M8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0idGFibGUtY2VsbCIgY2hlY2tlZD0ie3tleHBhbmRlZH19Ij4KICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc11dIiBhcz0iaHBhcmFtSW5mbyIgaW5kZXgtYXM9ImhwYXJhbUluZGV4Ij4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMiIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX2hwYXJhbU5hbWUoaHBhcmFtSW5mbyldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX3Nlc3Npb25Hcm91cEhQYXJhbShpdGVtLCBocGFyYW1JbmZvLm5hbWUpXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e3Zpc2libGVTY2hlbWEubWV0cmljSW5mb3N9fSIgYXM9Im1ldHJpY0luZm8iIGluZGV4LWFzPSJtZXRyaWNJbmRleCI+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjIiIHdpZHRoPSIxMGVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19tZXRyaWNOYW1lKG1ldHJpY0luZm8pXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19zZXNzaW9uR3JvdXBNZXRyaWMoaXRlbSwgbWV0cmljSW5mby5uYW1lKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGNsYXNzPSJyb3ctZGV0YWlscyI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tpdGVtXV0iIHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgY2xhc3M9InNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdmFhZGluLWdyaWQ+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAudGFibGUtaGVhZGVyIHsKICAgICAgICAvKiBsaW5lLWJyZWFrIG92ZXJmbG93aW5nIGNvbHVtbiBoZWFkZXJzICovCiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zZXNzaW9uLWdyb3VwLXRhYmxlIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlc3Npb24tZ3JvdXAtZGV0YWlscyB7CiAgICAgICAgaGVpZ2h0OiAzNjBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSI+CiAgICAgIAogICAgICA8dGYtaHBhcmFtcy10YWJsZS12aWV3IHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9IltbX3NpbmdsZXRvblNlc3Npb25Hcm91cHMoc2Vzc2lvbkdyb3VwKV1dIj4KICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfcHJvcGVydGllc0FyZVBvcHVsYXRlZCh2aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXApXV0iPgogICAgICA8ZGl2PgogICAgICAgIENsaWNrIG9yIGhvdmVyIG92ZXIgYSBzZXNzaW9uIGdyb3VwIHRvIGRpc3BsYXkgaXRzIHZhbHVlcyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxzdmcgaWQ9InN2ZyI+PC9zdmc+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHN2ZyB7CiAgICAgICAgZm9udDogMTBweCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuYmFja2dyb3VuZCBwYXRoIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7CiAgICAgIH0KCiAgICAgIC5mb3JlZ3JvdW5kIHBhdGggewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNzsKICAgICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIH0KCiAgICAgIC8qIFdpbGwgYmUgc2V0IG9uIGZvcmVncm91bmQgcGF0aHMgdGhhdCBhcmUgbm90ICJjb250YWluZWQiIGluIHRoZSBjdXJyZW50CiAgICAgICAgIGF4ZXMgYnJ1c2hlcy4gSWYgbm8gYnJ1c2hlcyBhcmUgc2V0LCBubyBwYXRoIHdpbGwgaGF2ZSB0aGlzIGNsYXNzLiAqLwogICAgICAuZm9yZWdyb3VuZCAuaW52aXNpYmxlLXBhdGggewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIFN0eWxlIGZvciB0aGUgcGF0aCBjbG9zZXN0IHRvIHRoZSBtb3VzZSBwb2ludGVyICh0eXBpY2FsbHkgd2lsbCBiZWNvbWUKICAgICAgdGhlIHNlbGVjdGVkIHBhdGggd2hlbiB0aGUgdXNlciBjbGlja3MpLiAqLwogICAgICAuZm9yZWdyb3VuZCAucGVha2VkLXBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQoKICAgICAgLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXRoIGNsYXNzLiBXZSB1c2UgIWltcG9ydGFudCB0byBvdmVycmlkZSB0aGUKICAgICAgICAgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBjb2xvciBvZiBhIHBhdGguICovCiAgICAgIC5mb3JlZ3JvdW5kIC5zZWxlY3RlZC1wYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDMgIWltcG9ydGFudDsKICAgICAgICBzdHJva2U6ICMwZjAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI2NvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmF4aXMgdGV4dCB7CiAgICAgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZiwgMXB4IDAgMCAjZmZmLCAwIC0xcHggMCAjZmZmLCAtMXB4IDAgMCAjZmZmOwogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPGRpdiBjbGFzcz0icGFuZSI+CiAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgIAogICAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzZWN0aW9uIiBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBvcHRpb25zPSJ7e19vcHRpb25zfX0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHM+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgICAKICAgICAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90IGlkPSJwbG90IiBjbGFzcz0ic2VjdGlvbiIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBzZWxlY3RlZC1zZXNzaW9uLWdyb3VwPSJ7e19zZWxlY3RlZEdyb3VwfX0iIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iIG9wdGlvbnM9IltbX29wdGlvbnNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3Q+CiAgICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMgaWQ9InZhbHVlcyIgY2xhc3M9InNlY3Rpb24iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIiBzZXNzaW9uLWdyb3VwPSJbW19jbG9zZXN0T3JTZWxlY3RlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGlkPSJkZXRhaWxzIiBjbGFzcz0ic2VjdGlvbiIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBzZXNzaW9uLWdyb3VwPSJbW19zZWxlY3RlZEdyb3VwXV0iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIj4KICAgICAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjbG9zZXN0IGRhdGEgcG9pbnQgbWFya2VyIHRvIHRoZSBtb3VzZSBwb2ludGVyLiBXZSB1c2UgIWltcG9ydGFudAogICAgICAgICB0byBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4KICAgICAgKi8KICAgICAgLmNsb3Nlc3QtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0YSBwb2ludCBtYXJrZXIuIFdlIHVzZSAhaW1wb3J0YW50IHRvCiAgICAgICAgIG92ZXJyaWRlIHRoZSBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIHN0eWxlIG9mIGEgbWFya2VyLiAqLwogICAgICAuc2VsZWN0ZWQtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgCiAgICAgICAgPHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIGNsYXNzPSJzZWN0aW9uIiBpZD0iY29udHJvbHMiIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iIG9wdGlvbnM9Int7X29wdGlvbnN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgIAogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IGNsYXNzPSJzZWN0aW9uIiBpZD0icGxvdCIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IiBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IiBvcHRpb25zPSJbW19vcHRpb25zXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdD4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyBjbGFzcz0ic2VjdGlvbiIgaWQ9InZhbHVlcyIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXA9IltbX2Nsb3Nlc3RPclNlbGVjdGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgCiAgICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyBjbGFzcz0ic2VjdGlvbiIgaWQ9ImRldGFpbHMiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tfc2VsZWN0ZWRHcm91cF1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaGVhZGVyLXBhbmVsPgogICAgICA8cGFwZXItdG9vbGJhciBzbG90PSJoZWFkZXIiIGNsYXNzPSJ0YWItYmFyIj4KICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRUYWJ9fSIgc2xvdD0idG9wIj4KICAgICAgICAgIAogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJ0YWJsZS12aWV3Ij4KICAgICAgICAgICAgVEFCTEUgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InBhcmFsbGVsLWNvb3Jkcy12aWV3Ij4KICAgICAgICAgICAgUEFSQUxMRUwgQ09PUkRJTkFURVMgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyI+CiAgICAgICAgICAgIFNDQVRURVIgUExPVCBNQVRSSVggVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLWFuZC1mZWVkYmFjayI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tidWdSZXBvcnRVcmxdXSI+CiAgICAgICAgICAgICAgPGEgaHJlZiQ9IltbYnVnUmVwb3J0VXJsXV0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0iYnVnLXJlcG9ydCIgcmFpc2VkIHRpdGxlPSJTZW5kIGEgYnVnIHJlcG9ydCBvciBmZWF0dXJlIHJlcXVlc3QiPgogICAgICAgICAgICAgICAgICBCdWcgUmVwb3J0IC8gRmVhdHVyZSBSZXF1ZXN0CiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWxwVXJsXV0iPgogICAgICAgICAgICAgIDxhIGhyZWYkPSJbW2hlbHBVcmxdXSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIiB0aXRsZT0iVmlldyBkb2N1bWVudGF0aW9uIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci10YWJzPgogICAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICAgIDxpcm9uLXBhZ2VzIHNlbGVjdGVkPSJbW19zZWxlY3RlZFRhYl1dIiBjbGFzcz0iZml0IHRhYi12aWV3Ij4KICAgICAgICA8ZGl2IGlkPSIwIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBlbmFibGUtc2hvdy1tZXRyaWNzPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iMSIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IjIiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3IGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0iW1tjb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3PgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tcGFnZXM+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIC50YWItdmlldyB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC50YWItYmFyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgfQogICAgICAudGFiIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItdGFicyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci10YWJzLWNvbnRlbnQ6IHsKICAgICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIH0KICAgICAgfQogICAgICB0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuaGVscC1hbmQtZmVlZGJhY2sgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICAgICNidWctcmVwb3J0IHsKICAgICAgICBib3JkZXI6IHNvbGlkIGJsYWNrOwogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmRzOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBtYXgtd2lkdGg6IDE1MHB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLW1haW4iPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8dGYtaHBhcmFtcy1xdWVyeS1wYW5lIGlkPSJxdWVyeS1wYW5lIiBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249Int7X2NvbmZpZ3VyYXRpb259fSIgc2Vzc2lvbi1ncm91cHM9Int7X3Nlc3Npb25Hcm91cHN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSBpZD0ic2Vzc2lvbnMtcGFuZSIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGhlbHAtdXJsPSJbW2hlbHBVcmxdXSIgYnVnLXJlcG9ydC11cmw9IltbYnVnUmVwb3J0VXJsXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBjb25maWd1cmF0aW9uPSJbW19jb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW19zZXNzaW9uR3JvdXBzXV0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lPgogICAgICA8L2Rpdj4KICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDx0Zi1ocGFyYW1zLWdvb2dsZS1hbmFseXRpY3MtdHJhY2tlciBpZD0idHJhY2tlciIgdHJhY2tpbmctaWQ9IltbdHJhY2tpbmdJZF1dIiBuYW1lPSJ0Zl9ocGFyYW1zIj4KICAgIDwvdGYtaHBhcmFtcy1nb29nbGUtYW5hbHl0aWNzLXRyYWNrZXI+CgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBtaW4td2lkdGg6IDEwJTsKICAgICAgfQoKICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRmLWhwYXJhbXMtbWFpbiBpZD0iaHBhcmFtcy1tYWluIiBiYWNrZW5kPSJbW19iYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iIj4KICAgIDwvdGYtaHBhcmFtcy1tYWluPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1tZXNoLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyBjb2xvcj0iW1tfcnVuQ29sb3JdXSIgY2xhc3M9InRmLW1lc2gtbG9hZGVyLWhlYWRlciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTYW1wbGVzKG9mU2FtcGxlcyldXSI+CiAgICAgICAgPGRpdj5zYW1wbGU6IFtbX2dldFNhbXBsZVRleHQoc2FtcGxlKV1dIG9mIFtbb2ZTYW1wbGVzXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcChfc3RlcHMpXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwCiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+W1t0b0xvY2FsZVN0cmluZ18oX3N0ZXBWYWx1ZSldXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jdXJyZW50V2FsbFRpbWVdXSI+CiAgICAgICAgICAgICAgW1tfY3VycmVudFdhbGxUaW1lXV0KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwgcmlnaHQiPgogICAgICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFjdGl2ZSBoaWRkZW4kPSJbWyFfaXNNZXNoTG9hZGluZ11dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzKF9zdGVwcyldXSI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX2dldE1heFN0ZXBJbmRleChfc3RlcHMpXV0iIG1heC1tYXJrZXJzPSJbW19nZXRNYXhTdGVwSW5kZXgoX3N0ZXBzKV1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDFweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFweDsKICAgICAgfQogICAgICAudGYtbWVzaC1sb2FkZXItaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwNXB4OwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9Im1lc2gtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIiBjbGFzcz0iYWxsLWNvbnRyb2xzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gdmlldy1jb250cm9sIj4KICAgICAgICAgIDxoMyBjbGFzcz0idGl0bGUiPlBvaW50IG9mIHZpZXc8L2gzPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2aWV3LXJhZGlvLWdyb3VwIiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRWaWV3fX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9ImFsbC1yYWRpby1idXR0b24iIG5hbWU9ImFsbCI+CiAgICAgICAgICAgICAgICBEaXNwbGF5IGFsbCBwb2ludHMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0iYWxsLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgWm9vbSBhbmQgY2VudGVyIGNhbWVyYSB0byBkaXNwbGF5IGFsbCBwb2ludHMgYXQgb25jZS4gTm90ZSwgdGhhdAogICAgICAgICAgICAgICAgc29tZSBwb2ludHMgY291bGQgYmUgdG9vIGZhciAoaS5lLiB0b28gc21hbGwpIHRvIGJlIHZpc2libGUuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InVzZXItcmFkaW8tYnV0dG9uIiBuYW1lPSJ1c2VyIj4KICAgICAgICAgICAgICAgIEN1cnJlbnQgdmlldwogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJ1c2VyLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgS2VlcCBjdXJyZW50IGNhbWVyYSBwb3NpdGlvbiBhbmQgem9vbSBsZXZlbC4KICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ic2hhcmUtcmFkaW8tYnV0dG9uIiBuYW1lPSJzaGFyZSI+CiAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0ic2hhcmUtcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQgYW1vbmcgYWxsIGNhbWVyYXMuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHBvaW50IGNsb3VkIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcG9pbnQgY2xvdWQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbWVzaC1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBzZWxlY3RlZC12aWV3PSJbW19zZWxlY3RlZFZpZXddXSIgcnVuPSJbW2l0ZW0ucnVuXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIgb2Ytc2FtcGxlcz0iW1tpdGVtLm9mU2FtcGxlc11dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1jb250YWluZXIiIG9uLWNhbWVyYS1wb3NpdGlvbi1jaGFuZ2U9Il9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlZCI+CiAgICAgICAgICAgICAgICA8L3RmLW1lc2gtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gaDMudGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLnJ1bnMtc2VsZWN0b3IgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgdGYtcnVucy1zZWxlY3RvciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZpZXctY29udHJvbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnZpZXctY29udHJvbCBoMy50aXRsZSB7CiAgICAgICAgcGFkZGluZy10b3A6IDE2cHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE2cHg7CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAudmlldy1jb250cm9sIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLyogTGF5b3V0IG11c3QgYmUgaG9yaXpvbnRhbCwgaS5lLiBpdGVtcyBhcnJhbmdlZCBpbiBhIHJvdy4gSWYgaXRlbXMgY2Fubm90IGZpdCBpbiBhIHJvdywKICAgICAgICogdGhleSBzaG91bGQgYmUgbW92ZWQgdG8gbmV4dCBsaW5lLiBBbGwgaXRlbXMgbXVzdCBiZSBzcXVhcmUgYXQgYWxsIHRpbWVzLiBNaW5pbXVtIHNpemUgb2YKICAgICAgICogdGhlIGl0ZW0gaXMgNDgwcHguIFRoaXMgbWVhbnMgdGhhdCBtYXhpbXVtIHNpemUgb2YgdGhlIGl0ZW0gbXVzdCBiZSA0ODBweCArIDQ3OXB4ID0gOTU5cHguCiAgICAgICAqICovCiAgICAgIC5ob3Jpem9udGFsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgIHRmLW1lc2gtbG9hZGVyIHsKICAgICAgICB3aWR0aDogNDgwcHg7CiAgICAgICAgZmxleC1iYXNpczogNDgwcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKICAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3Jib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyB3aXRoLWJhY2tkcm9wIGlkPSJzZXR0aW5ncyI+CiAgICAgIDxoMj5TZXR0aW5nczwvaDI+CiAgICAgIDxwYXBlci1jaGVja2JveCBpZD0iYXV0by1yZWxvYWQtY2hlY2tib3giIGNoZWNrZWQ9Int7YXV0b1JlbG9hZEVuYWJsZWR9fSI+CiAgICAgICAgUmVsb2FkIGRhdGEgZXZlcnkgPHNwYW4+W1thdXRvUmVsb2FkSW50ZXJ2YWxTZWNzXV08L3NwYW4+cy4KICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJwYWdpbmF0aW9uTGltaXRJbnB1dCIgbGFiZWw9IlBhZ2luYXRpb24gbGltaXQiIGFsd2F5cy1mbG9hdC1sYWJlbCB0eXBlPSJudW1iZXIiIG1pbj0iMSIgc3RlcD0iMSIgb24tY2hhbmdlPSJfcGFnaW5hdGlvbkxpbWl0Q2hhbmdlZCIgb24tdmFsdWUtY2hhbmdlZD0iX3BhZ2luYXRpb25MaW1pdFZhbGlkYXRlIj48L3BhcGVyLWlucHV0PgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8cGFwZXItaGVhZGVyLXBhbmVsPgogICAgICA8cGFwZXItdG9vbGJhciBpZD0idG9vbGJhciIgc2xvdD0iaGVhZGVyIiBjbGFzcz0iaGVhZGVyIj4KICAgICAgICA8ZGl2IGlkPSJ0b29sYmFyLWNvbnRlbnQiIHNsb3Q9InRvcCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9ob21lUGF0aF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhci10aXRsZSI+W1ticmFuZF1dPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ob21lUGF0aF1dIj4KICAgICAgICAgICAgPGEgaHJlZj0iW1tfaG9tZVBhdGhdXSIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiBjbGFzcz0idG9vbGJhci10aXRsZSI+W1ticmFuZF1dPC9hPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZF1dIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRvb2xiYXItbWVzc2FnZSI+CiAgICAgICAgICAgICAgTG9hZGluZyBhY3RpdmUgZGFzaGJvYXJkc+KApgogICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzTG9hZGVkXV0iPgogICAgICAgICAgICA8cGFwZXItdGFicyBub2luayBzY3JvbGxhYmxlIHNlbGVjdGVkPSJ7e19zZWxlY3RlZERhc2hib2FyZH19IiBhdHRyLWZvci1zZWxlY3RlZD0iZGF0YS1kYXNoYm9hcmQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNEYXNoYm9hcmRBY3RpdmUoZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcywgZGFzaGJvYXJkRGF0dW0pXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItdGFiIGRhdGEtZGFzaGJvYXJkJD0iW1tkYXNoYm9hcmREYXR1bS5wbHVnaW5dXSIgdGl0bGU9IltbZGFzaGJvYXJkRGF0dW0udGFiTmFtZV1dIj4KICAgICAgICAgICAgICAgICAgICBbW2Rhc2hib2FyZERhdHVtLnRhYk5hbWVdXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRhYj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci10YWJzPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2luYWN0aXZlRGFzaGJvYXJkc0V4aXN0KF9kYXNoYm9hcmREYXRhLCBkaXNhYmxlZERhc2hib2FyZHMsIF9hY3RpdmVEYXNoYm9hcmRzKV1dIj4KICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iSU5BQ1RJVkUiIG5vLWxhYmVsLWZsb2F0IG5vaW5rIHN0eWxlPSJtYXJnaW4tbGVmdDogMTJweCI+CiAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBpZD0iaW5hY3RpdmUtZGFzaGJvYXJkcy1tZW51IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWREYXNoYm9hcmR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9ImRhdGEtZGFzaGJvYXJkIj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZGFzaGJvYXJkRGF0YV1dIiBhcz0iZGFzaGJvYXJkRGF0dW0iPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNEYXNoYm9hcmRJbmFjdGl2ZShkaXNhYmxlZERhc2hib2FyZHMsIF9hY3RpdmVEYXNoYm9hcmRzLCBkYXNoYm9hcmREYXR1bSldXSIgcmVzdGFtcD4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIGRhdGEtZGFzaGJvYXJkJD0iW1tkYXNoYm9hcmREYXR1bS5wbHVnaW5dXSI+W1tkYXNoYm9hcmREYXR1bS50YWJOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGRpdiBjbGFzcz0iZ2xvYmFsLWFjdGlvbnMiPgogICAgICAgICAgICA8c2xvdCBuYW1lPSJpbmplY3RlZC1oZWFkZXItaXRlbXMiPjwvc2xvdD4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGlkPSJyZWxvYWQtYnV0dG9uIiBjbGFzcyQ9IltbX2dldERhdGFSZWZyZXNoaW5nQ2xhc3MoX3JlZnJlc2hpbmcpXV0iIGRpc2FibGVkJD0iW1tfaXNSZWxvYWREaXNhYmxlZF1dIiBpY29uPSJyZWZyZXNoIiBvbi10YXA9InJlbG9hZCIgdGl0bGUkPSJMYXN0IHVwZGF0ZWQ6IFtbX2xhc3RSZWxvYWRUaW1lU2hvcnRdXSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzIiBvbi10YXA9Im9wZW5TZXR0aW5ncyIgaWQ9InNldHRpbmdzLWJ1dHRvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiIHRhYmluZGV4PSItMSIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJoZWxwLW91dGxpbmUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLXRvb2xiYXI+CgogICAgICA8ZGl2IGlkPSJjb250ZW50LXBhbmUiIGNsYXNzPSJmaXQiPgogICAgICAgIDxzbG90IG5hbWU9ImluamVjdGVkLW92ZXJ2aWV3Ij48L3Nsb3Q+CiAgICAgICAgPGRpdiBpZD0iY29udGVudCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNGYWlsZWRUb0xvYWRdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmctbWVzc2FnZSI+CiAgICAgICAgICAgICAgPGgzPkZhaWxlZCB0byBsb2FkIHRoZSBzZXQgb2YgYWN0aXZlIGRhc2hib2FyZHMuPC9oMz4KICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBUZW5zb3JCb2FyZCBiYWNrZW5kIGlzIG5vIGxvbmdlciBydW5uaW5nLgogICAgICAgICAgICAgICAgUGVyaGFwcyB0aGlzIHBhZ2UgaXMgY2FjaGVkPwogICAgICAgICAgICAgIAoKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIElmIHlvdSB0aGluayB0aGF0IHlvdeKAmXZlIGZpeGVkIHRoZSBwcm9ibGVtLCBjbGljayB0aGUgcmVsb2FkCiAgICAgICAgICAgICAgICBidXR0b24gaW4gdGhlIHRvcC1yaWdodC4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thdXRvUmVsb2FkRW5hYmxlZF1dIj4KICAgICAgICAgICAgICAgICAgV2XigJlsbCB0cnkgdG8gcmVsb2FkIGV2ZXJ5CiAgICAgICAgICAgICAgICAgIFtbYXV0b1JlbG9hZEludGVydmFsU2Vjc11dJm5ic3A7c2Vjb25kcyBhcyB3ZWxsLgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjxwPgogICAgICAgICAgICAgICAgICAgIDxpPkxvZyBkaXJlY3Rvcnk6CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGF0YV9sb2NhdGlvbiI+W1tfZGF0YUxvY2F0aW9uXV08L3NwYW4+PC9pPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3dOb0Rhc2hib2FyZHNNZXNzYWdlXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz5ObyBkYXNoYm9hcmRzIGFyZSBhY3RpdmUgZm9yIHRoZSBjdXJyZW50IGRhdGEgc2V0LjwvaDM+CiAgICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAgIAoKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxpPkxhc3QgcmVsb2FkOiBbW19sYXN0UmVsb2FkVGltZV1dPC9pPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTG9jYXRpb25dXSI+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+PHA+CiAgICAgICAgICAgICAgICAgICAgPGk+RGF0YSBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkYXRhX2xvY2F0aW9uIj5bW19kYXRhTG9jYXRpb25dXTwvc3Bhbj48L2k+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2VdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmctbWVzc2FnZSI+CiAgICAgICAgICAgICAgPGgzPgogICAgICAgICAgICAgICAgVGhlcmXigJlzIG5vIGRhc2hib2FyZCBieSB0aGUgbmFtZSBvZgogICAgICAgICAgICAgICAg4oCcPHR0PltbX3NlbGVjdGVkRGFzaGJvYXJkXV08L3R0Pi7igJ0KICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZF1dIj4KICAgICAgICAgICAgICAgIDxwPllvdSBjYW4gc2VsZWN0IGEgZGFzaGJvYXJkIGZyb20gdGhlIGxpc3QgYWJvdmUuPC90ZW1wbGF0ZT4KCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjxwPgogICAgICAgICAgICAgICAgICAgIDxpPkRhdGEgbG9jYXRpb246CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGF0YV9sb2NhdGlvbiI+W1tfZGF0YUxvY2F0aW9uXV08L3NwYW4+PC9pPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGlkPSJkYXNoYm9hcmRzLXRlbXBsYXRlIiBpdGVtcz0iW1tfZGFzaGJvYXJkRGF0YV1dIiBhcz0iZGFzaGJvYXJkRGF0dW0iIG9uLWRvbS1jaGFuZ2U9Il9vblRlbXBsYXRlQ2hhbmdlZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhc2hib2FyZC1jb250YWluZXIiIGRhdGEtZGFzaGJvYXJkJD0iW1tkYXNoYm9hcmREYXR1bS5wbHVnaW5dXSIgZGF0YS1zZWxlY3RlZCQ9IltbX3NlbGVjdGVkU3RhdHVzKF9zZWxlY3RlZERhc2hib2FyZCwgZGFzaGJvYXJkRGF0dW0ucGx1Z2luKV1dIj4KICAgICAgICAgICAgICAKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvcGFwZXItaGVhZGVyLXBhbmVsPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTEwMCk7CiAgICAgIH0KCiAgICAgICN0b29sYmFyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBtYXJnaW4tbGVmdDogNnB4OwogICAgICAgIC8qIEluY3JlYXNlIGNsaWNrYWJsZSBhcmVhIGZvciBjYXNlIHdoZXJlIHRpdGxlIGlzIGFuIGFuY2hvci4gKi8KICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBkaXNwbGF5OiB2YXIoLS10Yi10b29sYmFyLXRpdGxlLWRpc3BsYXksIGJsb2NrKTsKICAgICAgfQoKICAgICAgYS50b29sYmFyLXRpdGxlIHsKICAgICAgICAvKiBPdmVycmlkZSBkZWZhdWx0IGFuY2hvciBjb2xvci4gKi8KICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICAvKiBPdmVycmlkZSBkZWZhdWx0IGFuY2hvciB0ZXh0LWRlY29yYXRpb24uICovCiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICAudG9vbGJhci1tZXNzYWdlIHsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIHBhcGVyLXRhYnMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItdGFicy1jb250ZW50OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWljb246IHsKICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHBhcGVyLWl0ZW0gewogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH0KCiAgICAgICNpbmFjdGl2ZS1kYXNoYm9hcmRzLW1lbnUgewogICAgICAgIC0tcGFwZXItbGlzdGJveC1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgICAtLXBhcGVyLWxpc3Rib3gtY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuZ2xvYmFsLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuZ2xvYmFsLWFjdGlvbnMgYSB7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAjdG9vbGJhci1jb250ZW50IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAjY29udGVudC1wYW5lIHsKICAgICAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3RyZXRjaDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2NvbnRlbnQgewogICAgICAgIGZsZXg6IDEgMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAvKiBIaWRlIHVuc2VsZWN0ZWQgZGFzaGJvYXJkcy4gV2Ugc3RpbGwgZGlzcGxheSB0aGVtIHdpdGhpbiBhIGNvbnRhaW5lcgogICAgICAgICBvZiBoZWlnaHQgMCBzaW5jZSBQbG90dGFibGUgcHJvZHVjZXMgZGVnZW5lcmF0ZSBjaGFydHMgd2hlbiBjaGFydHMgYXJlCiAgICAgICAgIHJlbG9hZGVkIHdoaWxlIG5vdCBkaXNwbGF5ZWQuICovCiAgICAgIC5kYXNoYm9hcmQtY29udGFpbmVyOm5vdChbZGF0YS1zZWxlY3RlZF0pIHsKICAgICAgICBtYXgtaGVpZ2h0OiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIC8qKiBXZSBmdXJ0aGVyIG1ha2UgY29udGFpbmVycyBpbnZpc2libGUuIFNvbWUgZWxlbWVudHMgbWF5IGFuY2hvciB0bwogICAgICAgICAgICB0aGUgdmlld3BvcnQgaW5zdGVhZCBvZiB0aGUgY29udGFpbmVyLCBpbiB3aGljaCBjYXNlIHNldHRpbmcgdGhlIG1heAogICAgICAgICAgICBoZWlnaHQgaGVyZSB0byAwIHdpbGwgbm90IGhpZGUgdGhlbS4gKi8KICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5kYXNoYm9hcmQtY29udGFpbmVyIGlmcmFtZSB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLndhcm5pbmctbWVzc2FnZSB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KCiAgICAgIFtkaXNhYmxlZF0gewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgICNyZWxvYWQtYnV0dG9uLnJlZnJlc2hpbmcgewogICAgICAgIGFuaW1hdGlvbjogcm90YXRlIDJzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyByb3RhdGUgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAo8L2RvbS1tb2R1bGU+CgogIDxib2R5PgogICAgPHRmLXRlbnNvcmJvYXJkIHVzZS1oYXNoIGJyYW5kPSJUZW5zb3JCb2FyZCI+PC90Zi10ZW5zb3Jib2FyZD4KICAKCjxzY3JpcHQgc3JjPSJpbmRleC5qcyI+PC9zY3JpcHQ+", + "ok": true, + "headers": [ + [ + "content-type", + "text/html; charset=utf-8" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/index.js": { + "data": "Ly8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvYmFzZS5qcwpmdW5jdGlvbiB3YShiKXt2YXIgZD0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBkPGIubGVuZ3RoP3tkb25lOiExLHZhbHVlOmJbZCsrXX06e2RvbmU6ITB9fX1mdW5jdGlvbiBnYihiKXtyZXR1cm57bmV4dDp3YShiKX19ZnVuY3Rpb24gbGIoYil7dmFyIGQ9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYltTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBkP2QuY2FsbChiKTpnYihiKX12YXIgd2I9ZnVuY3Rpb24oYil7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdz09PWI/YjoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmbnVsbCE9Z2xvYmFsP2dsb2JhbDpifSh0aGlzKSxSYj0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnRpZXM/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGIsZCxmKXtiIT1BcnJheS5wcm90b3R5cGUmJmIhPU9iamVjdC5wcm90b3R5cGUmJihiW2RdPWYudmFsdWUpfTsKZnVuY3Rpb24gVWIoYixkKXtpZihkKXt2YXIgZj13YjtiPWIuc3BsaXQoIi4iKTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoLTE7aCsrKXt2YXIgaz1iW2hdO2sgaW4gZnx8KGZba109e30pO2Y9ZltrXX1iPWJbYi5sZW5ndGgtMV07aD1mW2JdO2Q9ZChoKTtkIT1oJiZudWxsIT1kJiZSYihmLGIse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpkfSl9fQpVYigiUHJvbWlzZSIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChwKXt0aGlzLnN0YXRlXz0wO3RoaXMucmVzdWx0Xz12b2lkIDA7dGhpcy5vblNldHRsZWRDYWxsYmFja3NfPVtdO3ZhciBtPXRoaXMuY3JlYXRlUmVzb2x2ZUFuZFJlamVjdF8oKTt0cnl7cChtLnJlc29sdmUsbS5yZWplY3QpfWNhdGNoKG4pe20ucmVqZWN0KG4pfX1mdW5jdGlvbiBmKCl7dGhpcy5iYXRjaF89bnVsbH1mdW5jdGlvbiBoKHApe3N3aXRjaCh0eXBlb2YgcCl7Y2FzZSAib2JqZWN0IjpyZXR1cm4gbnVsbCE9cDtjYXNlICJmdW5jdGlvbiI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gayhwKXtyZXR1cm4gcCBpbnN0YW5jZW9mIGQ/cDpuZXcgZChmdW5jdGlvbihtKXttKHApfSl9aWYoYilyZXR1cm4gYjtmLnByb3RvdHlwZS5hc3luY0V4ZWN1dGU9ZnVuY3Rpb24ocCl7aWYobnVsbD09dGhpcy5iYXRjaF8pe3RoaXMuYmF0Y2hfPVtdO3ZhciBtPXRoaXM7dGhpcy5hc3luY0V4ZWN1dGVGdW5jdGlvbihmdW5jdGlvbigpe20uZXhlY3V0ZUJhdGNoXygpfSl9dGhpcy5iYXRjaF8ucHVzaChwKX07CnZhciB0PXdiLnNldFRpbWVvdXQ7Zi5wcm90b3R5cGUuYXN5bmNFeGVjdXRlRnVuY3Rpb249ZnVuY3Rpb24ocCl7dChwLDApfTtmLnByb3RvdHlwZS5leGVjdXRlQmF0Y2hfPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmJhdGNoXyYmdGhpcy5iYXRjaF8ubGVuZ3RoOyl7dmFyIHA9dGhpcy5iYXRjaF87dGhpcy5iYXRjaF89W107Zm9yKHZhciBtPTA7bTxwLmxlbmd0aDsrK20pe3ZhciBuPXBbbV07cFttXT1udWxsO3RyeXtuKCl9Y2F0Y2gocSl7dGhpcy5hc3luY1Rocm93XyhxKX19fXRoaXMuYmF0Y2hfPW51bGx9O2YucHJvdG90eXBlLmFzeW5jVGhyb3dfPWZ1bmN0aW9uKHApe3RoaXMuYXN5bmNFeGVjdXRlRnVuY3Rpb24oZnVuY3Rpb24oKXt0aHJvdyBwO30pfTtkLnByb3RvdHlwZS5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0Xz1mdW5jdGlvbigpe2Z1bmN0aW9uIHAocSl7cmV0dXJuIGZ1bmN0aW9uKHUpe258fChuPSEwLHEuY2FsbChtLHUpKX19dmFyIG09dGhpcyxuPSExO3JldHVybntyZXNvbHZlOnAodGhpcy5yZXNvbHZlVG9fKSwKcmVqZWN0OnAodGhpcy5yZWplY3RfKX19O2QucHJvdG90eXBlLnJlc29sdmVUb189ZnVuY3Rpb24ocCl7cD09PXRoaXM/dGhpcy5yZWplY3RfKG5ldyBUeXBlRXJyb3IoIkEgUHJvbWlzZSBjYW5ub3QgcmVzb2x2ZSB0byBpdHNlbGYiKSk6cCBpbnN0YW5jZW9mIGQ/dGhpcy5zZXR0bGVTYW1lQXNQcm9taXNlXyhwKTpoKHApP3RoaXMucmVzb2x2ZVRvTm9uUHJvbWlzZU9ial8ocCk6dGhpcy5mdWxmaWxsXyhwKX07ZC5wcm90b3R5cGUucmVzb2x2ZVRvTm9uUHJvbWlzZU9ial89ZnVuY3Rpb24ocCl7dmFyIG09dm9pZCAwO3RyeXttPXAudGhlbn1jYXRjaChuKXt0aGlzLnJlamVjdF8obik7cmV0dXJufSJmdW5jdGlvbiI9PXR5cGVvZiBtP3RoaXMuc2V0dGxlU2FtZUFzVGhlbmFibGVfKG0scCk6dGhpcy5mdWxmaWxsXyhwKX07ZC5wcm90b3R5cGUucmVqZWN0Xz1mdW5jdGlvbihwKXt0aGlzLnNldHRsZV8oMixwKX07ZC5wcm90b3R5cGUuZnVsZmlsbF89ZnVuY3Rpb24ocCl7dGhpcy5zZXR0bGVfKDEsCnApfTtkLnByb3RvdHlwZS5zZXR0bGVfPWZ1bmN0aW9uKHAsbSl7aWYoMCE9dGhpcy5zdGF0ZV8pdGhyb3cgRXJyb3IoIkNhbm5vdCBzZXR0bGUoIitwKyIsICIrbSsiKTogUHJvbWlzZSBhbHJlYWR5IHNldHRsZWQgaW4gc3RhdGUiK3RoaXMuc3RhdGVfKTt0aGlzLnN0YXRlXz1wO3RoaXMucmVzdWx0Xz1tO3RoaXMuZXhlY3V0ZU9uU2V0dGxlZENhbGxiYWNrc18oKX07ZC5wcm90b3R5cGUuZXhlY3V0ZU9uU2V0dGxlZENhbGxiYWNrc189ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLm9uU2V0dGxlZENhbGxiYWNrc18pe2Zvcih2YXIgcD0wO3A8dGhpcy5vblNldHRsZWRDYWxsYmFja3NfLmxlbmd0aDsrK3ApbC5hc3luY0V4ZWN1dGUodGhpcy5vblNldHRsZWRDYWxsYmFja3NfW3BdKTt0aGlzLm9uU2V0dGxlZENhbGxiYWNrc189bnVsbH19O3ZhciBsPW5ldyBmO2QucHJvdG90eXBlLnNldHRsZVNhbWVBc1Byb21pc2VfPWZ1bmN0aW9uKHApe3ZhciBtPXRoaXMuY3JlYXRlUmVzb2x2ZUFuZFJlamVjdF8oKTsKcC5jYWxsV2hlblNldHRsZWRfKG0ucmVzb2x2ZSxtLnJlamVjdCl9O2QucHJvdG90eXBlLnNldHRsZVNhbWVBc1RoZW5hYmxlXz1mdW5jdGlvbihwLG0pe3ZhciBuPXRoaXMuY3JlYXRlUmVzb2x2ZUFuZFJlamVjdF8oKTt0cnl7cC5jYWxsKG0sbi5yZXNvbHZlLG4ucmVqZWN0KX1jYXRjaChxKXtuLnJlamVjdChxKX19O2QucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKEEseSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIEE/ZnVuY3Rpb24odyl7dHJ5e3EoQSh3KSl9Y2F0Y2goQyl7dShDKX19Onl9dmFyIHEsdSx4PW5ldyBkKGZ1bmN0aW9uKEEseSl7cT1BO3U9eX0pO3RoaXMuY2FsbFdoZW5TZXR0bGVkXyhuKHAscSksbihtLHUpKTtyZXR1cm4geH07ZC5wcm90b3R5cGUuY2F0Y2g9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMudGhlbih2b2lkIDAscCl9O2QucHJvdG90eXBlLmNhbGxXaGVuU2V0dGxlZF89ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7c3dpdGNoKHEuc3RhdGVfKXtjYXNlIDE6cChxLnJlc3VsdF8pOwpicmVhaztjYXNlIDI6bShxLnJlc3VsdF8pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgc3RhdGU6ICIrcS5zdGF0ZV8pO319dmFyIHE9dGhpcztudWxsPT10aGlzLm9uU2V0dGxlZENhbGxiYWNrc18/bC5hc3luY0V4ZWN1dGUobik6dGhpcy5vblNldHRsZWRDYWxsYmFja3NfLnB1c2gobil9O2QucmVzb2x2ZT1rO2QucmVqZWN0PWZ1bmN0aW9uKHApe3JldHVybiBuZXcgZChmdW5jdGlvbihtLG4pe24ocCl9KX07ZC5yYWNlPWZ1bmN0aW9uKHApe3JldHVybiBuZXcgZChmdW5jdGlvbihtLG4pe2Zvcih2YXIgcT1sYihwKSx1PXEubmV4dCgpOyF1LmRvbmU7dT1xLm5leHQoKSlrKHUudmFsdWUpLmNhbGxXaGVuU2V0dGxlZF8obSxuKX0pfTtkLmFsbD1mdW5jdGlvbihwKXt2YXIgbT1sYihwKSxuPW0ubmV4dCgpO3JldHVybiBuLmRvbmU/ayhbXSk6bmV3IGQoZnVuY3Rpb24ocSx1KXtmdW5jdGlvbiB4KHcpe3JldHVybiBmdW5jdGlvbihDKXtBW3ddPUM7eS0tOzA9PQp5JiZxKEEpfX12YXIgQT1bXSx5PTA7ZG8gQS5wdXNoKHZvaWQgMCkseSsrLGsobi52YWx1ZSkuY2FsbFdoZW5TZXR0bGVkXyh4KEEubGVuZ3RoLTEpLHUpLG49bS5uZXh0KCk7d2hpbGUoIW4uZG9uZSl9KX07cmV0dXJuIGR9KTtmdW5jdGlvbiBhYyhiKXtmdW5jdGlvbiBkKGgpe3JldHVybiBiLm5leHQoaCl9ZnVuY3Rpb24gZihoKXtyZXR1cm4gYi50aHJvdyhoKX1yZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oaCxrKXtmdW5jdGlvbiB0KGwpe2wuZG9uZT9oKGwudmFsdWUpOlByb21pc2UucmVzb2x2ZShsLnZhbHVlKS50aGVuKGQsZikudGhlbih0LGspfXQoYi5uZXh0KCkpfSl9ZnVuY3Rpb24gaGMoYil7cmV0dXJuIGFjKGIoKSl9OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9kZXBzLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9hbmFseXRpY3MuaHRtbC5qcwp3aW5kb3cuZ2E9ZnVuY3Rpb24oKXt9OwoKLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8KLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLy8gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgohZnVuY3Rpb24oYSxiKXt2YXIgYz17fSxkPXt9LGU9e30sZj1udWxsOyFmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiBhO3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109YVtjXTtyZXR1cm4gYn1mdW5jdGlvbiBkKCl7dGhpcy5fZGVsYXk9MCx0aGlzLl9lbmREZWxheT0wLHRoaXMuX2ZpbGw9Im5vbmUiLHRoaXMuX2l0ZXJhdGlvblN0YXJ0PTAsdGhpcy5faXRlcmF0aW9ucz0xLHRoaXMuX2R1cmF0aW9uPTAsdGhpcy5fcGxheWJhY2tSYXRlPTEsdGhpcy5fZGlyZWN0aW9uPSJub3JtYWwiLHRoaXMuX2Vhc2luZz0ibGluZWFyIix0aGlzLl9lYXNpbmdGdW5jdGlvbj13fWZ1bmN0aW9uIGUoKXtyZXR1cm4gYS5pc0RlcHJlY2F0ZWQoIkludmFsaWQgdGltaW5nIGlucHV0cyIsIjIwMTYtMDMtMDIiLCJUeXBlRXJyb3IgZXhjZXB0aW9ucyB3aWxsIGJlIHRocm93biBpbnN0ZWFkLiIsITApfWZ1bmN0aW9uIGYoYixjLGUpe3ZhciBmPW5ldyBkO3JldHVybiBjJiYoZi5maWxsPSJib3RoIixmLmR1cmF0aW9uPSJhdXRvIiksIm51bWJlciIhPXR5cGVvZiBifHxpc05hTihiKT92b2lkIDAhPT1iJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhiKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2lmKCJhdXRvIiE9YltjXSl7aWYoKCJudW1iZXIiPT10eXBlb2YgZltjXXx8ImR1cmF0aW9uIj09YykmJigibnVtYmVyIiE9dHlwZW9mIGJbY118fGlzTmFOKGJbY10pKSlyZXR1cm47aWYoImZpbGwiPT1jJiYtMT09dS5pbmRleE9mKGJbY10pKXJldHVybjtpZigiZGlyZWN0aW9uIj09YyYmLTE9PXYuaW5kZXhPZihiW2NdKSlyZXR1cm47aWYoInBsYXliYWNrUmF0ZSI9PWMmJjEhPT1iW2NdJiZhLmlzRGVwcmVjYXRlZCgiQW5pbWF0aW9uRWZmZWN0VGltaW5nLnBsYXliYWNrUmF0ZSIsIjIwMTQtMTEtMjgiLCJVc2UgQW5pbWF0aW9uLnBsYXliYWNrUmF0ZSBpbnN0ZWFkLiIpKXJldHVybjtmW2NdPWJbY119fSk6Zi5kdXJhdGlvbj1iLGZ9ZnVuY3Rpb24gZyhhKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGEmJihhPWlzTmFOKGEpP3tkdXJhdGlvbjowfTp7ZHVyYXRpb246YX0pLGF9ZnVuY3Rpb24gaChiLGMpe3JldHVybiBiPWEubnVtZXJpY1RpbWluZ1RvT2JqZWN0KGIpLGYoYixjKX1mdW5jdGlvbiBpKGEsYixjLGQpe3JldHVybiAwPmF8fGE+MXx8MD5jfHxjPjE/dzpmdW5jdGlvbihlKXtmdW5jdGlvbiBmKGEsYixjKXtyZXR1cm4gMyphKigxLWMpKigxLWMpKmMrMypiKigxLWMpKmMqYytjKmMqY31pZigwPT1lfHwxPT1lKXJldHVybiBlO2Zvcih2YXIgZz0wLGg9MTs7KXt2YXIgaT0oZytoKS8yLGo9ZihhLGMsaSk7aWYoTWF0aC5hYnMoZS1qKTwxZS00KXJldHVybiBmKGIsZCxpKTtlPmo/Zz1pOmg9aX19fWZ1bmN0aW9uIGooYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYz49MSlyZXR1cm4gMTt2YXIgZD0xL2E7cmV0dXJuIGMrPWIqZCxjLWMlZH19ZnVuY3Rpb24gayhhKXtCfHwoQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSksQi5hbmltYXRpb25UaW1pbmdGdW5jdGlvbj0iIixCLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uPWE7dmFyIGI9Qi5hbmltYXRpb25UaW1pbmdGdW5jdGlvbjtpZigiIj09YiYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoYSsiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciBlYXNpbmciKTt2YXIgYz1ELmV4ZWMoYik7aWYoYylyZXR1cm4gaS5hcHBseSh0aGlzLGMuc2xpY2UoMSkubWFwKE51bWJlcikpO3ZhciBkPUUuZXhlYyhiKTtpZihkKXJldHVybiBqKE51bWJlcihkWzFdKSx7c3RhcnQ6eCxtaWRkbGU6eSxlbmQ6en1bZFsyXV0pO3ZhciBmPUFbYl07cmV0dXJuIGY/Zjp3fWZ1bmN0aW9uIGwoYSl7cmV0dXJuIE1hdGguYWJzKG0oYSkvYS5wbGF5YmFja1JhdGUpfWZ1bmN0aW9uIG0oYSl7cmV0dXJuIGEuZHVyYXRpb24qYS5pdGVyYXRpb25zfWZ1bmN0aW9uIG4oYSxiLGMpe3JldHVybiBudWxsPT1iP0Y6YjxjLmRlbGF5P0c6Yj49Yy5kZWxheSthP0g6SX1mdW5jdGlvbiBvKGEsYixjLGQsZSl7c3dpdGNoKGQpe2Nhc2UgRzpyZXR1cm4iYmFja3dhcmRzIj09Ynx8ImJvdGgiPT1iPzA6bnVsbDtjYXNlIEk6cmV0dXJuIGMtZTtjYXNlIEg6cmV0dXJuImZvcndhcmRzIj09Ynx8ImJvdGgiPT1iP2E6bnVsbDtjYXNlIEY6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIHAoYSxiLGMsZCl7cmV0dXJuKGQucGxheWJhY2tSYXRlPDA/Yi1hOmIpKmQucGxheWJhY2tSYXRlK2N9ZnVuY3Rpb24gcShhLGIsYyxkLGUpe3JldHVybiBjPT09MS8wfHxjPT09LSgxLzApfHxjLWQ9PWImJmUuaXRlcmF0aW9ucyYmKGUuaXRlcmF0aW9ucytlLml0ZXJhdGlvblN0YXJ0KSUxPT0wP2E6YyVhfWZ1bmN0aW9uIHIoYSxiLGMsZCl7cmV0dXJuIDA9PT1jPzA6Yj09YT9kLml0ZXJhdGlvblN0YXJ0K2QuaXRlcmF0aW9ucy0xOk1hdGguZmxvb3IoYy9hKX1mdW5jdGlvbiBzKGEsYixjLGQpe3ZhciBlPWElMj49MSxmPSJub3JtYWwiPT1kLmRpcmVjdGlvbnx8ZC5kaXJlY3Rpb249PShlPyJhbHRlcm5hdGUtcmV2ZXJzZSI6ImFsdGVybmF0ZSIpLGc9Zj9jOmItYyxoPWcvYjtyZXR1cm4gYipkLl9lYXNpbmdGdW5jdGlvbihoKX1mdW5jdGlvbiB0KGEsYixjKXt2YXIgZD1uKGEsYixjKSxlPW8oYSxjLmZpbGwsYixkLGMuZGVsYXkpO2lmKG51bGw9PT1lKXJldHVybiBudWxsO2lmKDA9PT1hKXJldHVybiBkPT09Rz8wOjE7dmFyIGY9Yy5pdGVyYXRpb25TdGFydCpjLmR1cmF0aW9uLGc9cChhLGUsZixjKSxoPXEoYy5kdXJhdGlvbixtKGMpLGcsZixjKSxpPXIoYy5kdXJhdGlvbixoLGcsYyk7cmV0dXJuIHMoaSxjLmR1cmF0aW9uLGgsYykvYy5kdXJhdGlvbn12YXIgdT0iYmFja3dhcmRzfGZvcndhcmRzfGJvdGh8bm9uZSIuc3BsaXQoInwiKSx2PSJyZXZlcnNlfGFsdGVybmF0ZXxhbHRlcm5hdGUtcmV2ZXJzZSIuc3BsaXQoInwiKSx3PWZ1bmN0aW9uKGEpe3JldHVybiBhfTtkLnByb3RvdHlwZT17X3NldE1lbWJlcjpmdW5jdGlvbihiLGMpe3RoaXNbIl8iK2JdPWMsdGhpcy5fZWZmZWN0JiYodGhpcy5fZWZmZWN0Ll90aW1pbmdJbnB1dFtiXT1jLHRoaXMuX2VmZmVjdC5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQodGhpcy5fZWZmZWN0Ll90aW1pbmdJbnB1dCksdGhpcy5fZWZmZWN0LmFjdGl2ZUR1cmF0aW9uPWEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24odGhpcy5fZWZmZWN0Ll90aW1pbmcpLHRoaXMuX2VmZmVjdC5fYW5pbWF0aW9uJiZ0aGlzLl9lZmZlY3QuX2FuaW1hdGlvbi5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSl9LGdldCBwbGF5YmFja1JhdGUoKXtyZXR1cm4gdGhpcy5fcGxheWJhY2tSYXRlfSxzZXQgZGVsYXkoYSl7dGhpcy5fc2V0TWVtYmVyKCJkZWxheSIsYSl9LGdldCBkZWxheSgpe3JldHVybiB0aGlzLl9kZWxheX0sc2V0IGVuZERlbGF5KGEpe3RoaXMuX3NldE1lbWJlcigiZW5kRGVsYXkiLGEpfSxnZXQgZW5kRGVsYXkoKXtyZXR1cm4gdGhpcy5fZW5kRGVsYXl9LHNldCBmaWxsKGEpe3RoaXMuX3NldE1lbWJlcigiZmlsbCIsYSl9LGdldCBmaWxsKCl7cmV0dXJuIHRoaXMuX2ZpbGx9LHNldCBpdGVyYXRpb25TdGFydChhKXtpZigoaXNOYU4oYSl8fDA+YSkmJmUoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpdGVyYXRpb25TdGFydCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgcmVjZWl2ZWQ6ICIrdGltaW5nLml0ZXJhdGlvblN0YXJ0KTt0aGlzLl9zZXRNZW1iZXIoIml0ZXJhdGlvblN0YXJ0IixhKX0sZ2V0IGl0ZXJhdGlvblN0YXJ0KCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvblN0YXJ0fSxzZXQgZHVyYXRpb24oYSl7aWYoImF1dG8iIT1hJiYoaXNOYU4oYSl8fDA+YSkmJmUoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJkdXJhdGlvbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBvciBhdXRvLCByZWNlaXZlZDogIithKTt0aGlzLl9zZXRNZW1iZXIoImR1cmF0aW9uIixhKX0sZ2V0IGR1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2R1cmF0aW9ufSxzZXQgZGlyZWN0aW9uKGEpe3RoaXMuX3NldE1lbWJlcigiZGlyZWN0aW9uIixhKX0sZ2V0IGRpcmVjdGlvbigpe3JldHVybiB0aGlzLl9kaXJlY3Rpb259LHNldCBlYXNpbmcoYSl7dGhpcy5fZWFzaW5nRnVuY3Rpb249ayhhKSx0aGlzLl9zZXRNZW1iZXIoImVhc2luZyIsYSl9LGdldCBlYXNpbmcoKXtyZXR1cm4gdGhpcy5fZWFzaW5nfSxzZXQgaXRlcmF0aW9ucyhhKXtpZigoaXNOYU4oYSl8fDA+YSkmJmUoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpdGVyYXRpb25zIG11c3QgYmUgbm9uLW5lZ2F0aXZlLCByZWNlaXZlZDogIithKTt0aGlzLl9zZXRNZW1iZXIoIml0ZXJhdGlvbnMiLGEpfSxnZXQgaXRlcmF0aW9ucygpe3JldHVybiB0aGlzLl9pdGVyYXRpb25zfX07dmFyIHg9MSx5PS41LHo9MCxBPXtlYXNlOmkoLjI1LC4xLC4yNSwxKSwiZWFzZS1pbiI6aSguNDIsMCwxLDEpLCJlYXNlLW91dCI6aSgwLDAsLjU4LDEpLCJlYXNlLWluLW91dCI6aSguNDIsMCwuNTgsMSksInN0ZXAtc3RhcnQiOmooMSx4KSwic3RlcC1taWRkbGUiOmooMSx5KSwic3RlcC1lbmQiOmooMSx6KX0sQj1udWxsLEM9IlxccyooLT9cXGQrXFwuP1xcZCp8LT9cXC5cXGQrKVxccyoiLEQ9bmV3IFJlZ0V4cCgiY3ViaWMtYmV6aWVyXFwoIitDKyIsIitDKyIsIitDKyIsIitDKyJcXCkiKSxFPS9zdGVwc1woXHMqKFxkKylccyosXHMqKHN0YXJ0fG1pZGRsZXxlbmQpXHMqXCkvLEY9MCxHPTEsSD0yLEk9MzthLmNsb25lVGltaW5nSW5wdXQ9YyxhLm1ha2VUaW1pbmc9ZixhLm51bWVyaWNUaW1pbmdUb09iamVjdD1nLGEubm9ybWFsaXplVGltaW5nSW5wdXQ9aCxhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uPWwsYS5jYWxjdWxhdGVUaW1lRnJhY3Rpb249dCxhLmNhbGN1bGF0ZVBoYXNlPW4sYS50b1RpbWluZ0Z1bmN0aW9uPWt9KGMsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7cmV0dXJuIGEgaW4gaj9qW2FdW2JdfHxiOmJ9ZnVuY3Rpb24gZChhLGIsZCl7dmFyIGU9Z1thXTtpZihlKXtoLnN0eWxlW2FdPWI7Zm9yKHZhciBmIGluIGUpe3ZhciBpPWVbZl0saj1oLnN0eWxlW2ldO2RbaV09YyhpLGopfX1lbHNlIGRbYV09YyhhLGIpfWZ1bmN0aW9uIGUoYSl7dmFyIGI9W107Zm9yKHZhciBjIGluIGEpaWYoIShjIGluWyJlYXNpbmciLCJvZmZzZXQiLCJjb21wb3NpdGUiXSkpe3ZhciBkPWFbY107QXJyYXkuaXNBcnJheShkKXx8KGQ9W2RdKTtmb3IodmFyIGUsZj1kLmxlbmd0aCxnPTA7Zj5nO2crKyllPXt9LCJvZmZzZXQiaW4gYT9lLm9mZnNldD1hLm9mZnNldDoxPT1mP2Uub2Zmc2V0PTE6ZS5vZmZzZXQ9Zy8oZi0xKSwiZWFzaW5nImluIGEmJihlLmVhc2luZz1hLmVhc2luZyksImNvbXBvc2l0ZSJpbiBhJiYoZS5jb21wb3NpdGU9YS5jb21wb3NpdGUpLGVbY109ZFtnXSxiLnB1c2goZSl9cmV0dXJuIGIuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLm9mZnNldC1iLm9mZnNldH0pLGJ9ZnVuY3Rpb24gZihhKXtmdW5jdGlvbiBiKCl7dmFyIGE9Yy5sZW5ndGg7bnVsbD09Y1thLTFdLm9mZnNldCYmKGNbYS0xXS5vZmZzZXQ9MSksYT4xJiZudWxsPT1jWzBdLm9mZnNldCYmKGNbMF0ub2Zmc2V0PTApO2Zvcih2YXIgYj0wLGQ9Y1swXS5vZmZzZXQsZT0xO2E+ZTtlKyspe3ZhciBmPWNbZV0ub2Zmc2V0O2lmKG51bGwhPWYpe2Zvcih2YXIgZz0xO2UtYj5nO2crKyljW2IrZ10ub2Zmc2V0PWQrKGYtZCkqZy8oZS1iKTtiPWUsZD1mfX19aWYobnVsbD09YSlyZXR1cm5bXTt3aW5kb3cuU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3ImJkFycmF5LnByb3RvdHlwZS5mcm9tJiZhW1N5bWJvbC5pdGVyYXRvcl0mJihhPUFycmF5LmZyb20oYSkpLEFycmF5LmlzQXJyYXkoYSl8fChhPWUoYSkpO2Zvcih2YXIgYz1hLm1hcChmdW5jdGlvbihhKXt2YXIgYj17fTtmb3IodmFyIGMgaW4gYSl7dmFyIGU9YVtjXTtpZigib2Zmc2V0Ij09Yyl7aWYobnVsbCE9ZSYmKGU9TnVtYmVyKGUpLCFpc0Zpbml0ZShlKSkpdGhyb3cgbmV3IFR5cGVFcnJvcigia2V5ZnJhbWUgb2Zmc2V0cyBtdXN0IGJlIG51bWJlcnMuIil9ZWxzZXtpZigiY29tcG9zaXRlIj09Yyl0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiYWRkIGNvbXBvc2l0aW5nIGlzIG5vdCBzdXBwb3J0ZWQifTtlPSIiK2V9ZChjLGUsYil9cmV0dXJuIHZvaWQgMD09Yi5vZmZzZXQmJihiLm9mZnNldD1udWxsKSxifSksZj0hMCxnPS0oMS8wKSxoPTA7aDxjLmxlbmd0aDtoKyspe3ZhciBpPWNbaF0ub2Zmc2V0O2lmKG51bGwhPWkpe2lmKGc+aSl0aHJvd3tjb2RlOkRPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsbmFtZToiSW52YWxpZE1vZGlmaWNhdGlvbkVycm9yIixtZXNzYWdlOiJLZXlmcmFtZXMgYXJlIG5vdCBsb29zZWx5IHNvcnRlZCBieSBvZmZzZXQuIFNvcnQgb3Igc3BlY2lmeSBvZmZzZXRzLiJ9O2c9aX1lbHNlIGY9ITF9cmV0dXJuIGM9Yy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEub2Zmc2V0Pj0wJiZhLm9mZnNldDw9MX0pLGZ8fGIoKSxjfXZhciBnPXtiYWNrZ3JvdW5kOlsiYmFja2dyb3VuZEltYWdlIiwiYmFja2dyb3VuZFBvc2l0aW9uIiwiYmFja2dyb3VuZFNpemUiLCJiYWNrZ3JvdW5kUmVwZWF0IiwiYmFja2dyb3VuZEF0dGFjaG1lbnQiLCJiYWNrZ3JvdW5kT3JpZ2luIiwiYmFja2dyb3VuZENsaXAiLCJiYWNrZ3JvdW5kQ29sb3IiXSxib3JkZXI6WyJib3JkZXJUb3BDb2xvciIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0V2lkdGgiLCJib3JkZXJCb3R0b21Db2xvciIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJib3JkZXJMZWZ0Q29sb3IiLCJib3JkZXJMZWZ0U3R5bGUiLCJib3JkZXJMZWZ0V2lkdGgiXSxib3JkZXJCb3R0b206WyJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyQm90dG9tQ29sb3IiXSxib3JkZXJDb2xvcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyUmlnaHRDb2xvciIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyTGVmdDpbImJvcmRlckxlZnRXaWR0aCIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRDb2xvciJdLGJvcmRlclJhZGl1czpbImJvcmRlclRvcExlZnRSYWRpdXMiLCJib3JkZXJUb3BSaWdodFJhZGl1cyIsImJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyJdLGJvcmRlclJpZ2h0OlsiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlclJpZ2h0U3R5bGUiLCJib3JkZXJSaWdodENvbG9yIl0sYm9yZGVyVG9wOlsiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJUb3BTdHlsZSIsImJvcmRlclRvcENvbG9yIl0sYm9yZGVyV2lkdGg6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0V2lkdGgiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRXaWR0aCJdLGZsZXg6WyJmbGV4R3JvdyIsImZsZXhTaHJpbmsiLCJmbGV4QmFzaXMiXSxmb250OlsiZm9udEZhbWlseSIsImZvbnRTaXplIiwiZm9udFN0eWxlIiwiZm9udFZhcmlhbnQiLCJmb250V2VpZ2h0IiwibGluZUhlaWdodCJdLG1hcmdpbjpbIm1hcmdpblRvcCIsIm1hcmdpblJpZ2h0IiwibWFyZ2luQm90dG9tIiwibWFyZ2luTGVmdCJdLG91dGxpbmU6WyJvdXRsaW5lQ29sb3IiLCJvdXRsaW5lU3R5bGUiLCJvdXRsaW5lV2lkdGgiXSxwYWRkaW5nOlsicGFkZGluZ1RvcCIsInBhZGRpbmdSaWdodCIsInBhZGRpbmdCb3R0b20iLCJwYWRkaW5nTGVmdCJdfSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImRpdiIpLGk9e3RoaW46IjFweCIsbWVkaXVtOiIzcHgiLHRoaWNrOiI1cHgifSxqPXtib3JkZXJCb3R0b21XaWR0aDppLGJvcmRlckxlZnRXaWR0aDppLGJvcmRlclJpZ2h0V2lkdGg6aSxib3JkZXJUb3BXaWR0aDppLGZvbnRTaXplOnsieHgtc21hbGwiOiI2MCUiLCJ4LXNtYWxsIjoiNzUlIixzbWFsbDoiODklIixtZWRpdW06IjEwMCUiLGxhcmdlOiIxMjAlIiwieC1sYXJnZSI6IjE1MCUiLCJ4eC1sYXJnZSI6IjIwMCUifSxmb250V2VpZ2h0Ontub3JtYWw6IjQwMCIsYm9sZDoiNzAwIn0sb3V0bGluZVdpZHRoOmksdGV4dFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggdHJhbnNwYXJlbnQifSxib3hTaGFkb3c6e25vbmU6IjBweCAwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9fTthLmNvbnZlcnRUb0FycmF5Rm9ybT1lLGEubm9ybWFsaXplS2V5ZnJhbWVzPWZ9KGMsZiksZnVuY3Rpb24oYSl7dmFyIGI9e307YS5pc0RlcHJlY2F0ZWQ9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGY9ZT8iYXJlIjoiaXMiLGc9bmV3IERhdGUsaD1uZXcgRGF0ZShjKTtyZXR1cm4gaC5zZXRNb250aChoLmdldE1vbnRoKCkrMyksaD5nPyhhIGluIGJ8fGNvbnNvbGUud2FybigiV2ViIEFuaW1hdGlvbnM6ICIrYSsiICIrZisiIGRlcHJlY2F0ZWQgYW5kIHdpbGwgc3RvcCB3b3JraW5nIG9uICIraC50b0RhdGVTdHJpbmcoKSsiLiAiK2QpLGJbYV09ITAsITEpOiEwfSxhLmRlcHJlY2F0ZWQ9ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGY9ZT8iYXJlIjoiaXMiO2lmKGEuaXNEZXByZWNhdGVkKGIsYyxkLGUpKXRocm93IG5ldyBFcnJvcihiKyIgIitmKyIgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIitkKX19KGMpLGZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUpe3ZhciBhPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hbmltYXRlKFtdLDApLGI9ITA7aWYoYSYmKGI9ITEsInBsYXl8Y3VycmVudFRpbWV8cGF1c2V8cmV2ZXJzZXxwbGF5YmFja1JhdGV8Y2FuY2VsfGZpbmlzaHxzdGFydFRpbWV8cGxheVN0YXRlIi5zcGxpdCgifCIpLmZvckVhY2goZnVuY3Rpb24oYyl7dm9pZCAwPT09YVtjXSYmKGI9ITApfSkpLCFiKXJldHVybn0hZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYVtjXSlpZigib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kKXt2YXIgZT17b2Zmc2V0OmFbY10ub2Zmc2V0LGVhc2luZzphW2NdLmVhc2luZyx2YWx1ZTphW2NdW2RdfTtiW2RdPWJbZF18fFtdLGJbZF0ucHVzaChlKX1mb3IodmFyIGYgaW4gYil7dmFyIGc9YltmXTtpZigwIT1nWzBdLm9mZnNldHx8MSE9Z1tnLmxlbmd0aC0xXS5vZmZzZXQpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsbmFtZToiTm90U3VwcG9ydGVkRXJyb3IiLG1lc3NhZ2U6IlBhcnRpYWwga2V5ZnJhbWVzIGFyZSBub3Qgc3VwcG9ydGVkIn19cmV0dXJuIGJ9ZnVuY3Rpb24gZShjKXt2YXIgZD1bXTtmb3IodmFyIGUgaW4gYylmb3IodmFyIGY9Y1tlXSxnPTA7ZzxmLmxlbmd0aC0xO2crKyl7dmFyIGg9ZltnXS5vZmZzZXQsaT1mW2crMV0ub2Zmc2V0LGo9ZltnXS52YWx1ZSxrPWZbZysxXS52YWx1ZSxsPWZbZ10uZWFzaW5nO2g9PWkmJigxPT1pP2o9azprPWopLGQucHVzaCh7c3RhcnRUaW1lOmgsZW5kVGltZTppLGVhc2luZzphLnRvVGltaW5nRnVuY3Rpb24obD9sOiJsaW5lYXIiKSxwcm9wZXJ0eTplLGludGVycG9sYXRpb246Yi5wcm9wZXJ0eUludGVycG9sYXRpb24oZSxqLGspfSl9cmV0dXJuIGQuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0YXJ0VGltZS1iLnN0YXJ0VGltZX0pLGR9Yi5jb252ZXJ0RWZmZWN0SW5wdXQ9ZnVuY3Rpb24oYyl7dmFyIGY9YS5ub3JtYWxpemVLZXlmcmFtZXMoYyksZz1kKGYpLGg9ZShnKTtyZXR1cm4gZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWguZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiAwPj1jJiYwPT1hLnN0YXJ0VGltZXx8Yz49MSYmMT09YS5lbmRUaW1lfHxjPj1hLnN0YXJ0VGltZSYmYzw9YS5lbmRUaW1lfSkuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgZT1jLWQuc3RhcnRUaW1lLGY9ZC5lbmRUaW1lLWQuc3RhcnRUaW1lLGc9MD09Zj8wOmQuZWFzaW5nKGUvZik7Yi5hcHBseShhLGQucHJvcGVydHksZC5pbnRlcnBvbGF0aW9uKGcpKX0pO2Vsc2UgZm9yKHZhciBkIGluIGcpIm9mZnNldCIhPWQmJiJlYXNpbmciIT1kJiYiY29tcG9zaXRlIiE9ZCYmYi5jbGVhcihhLGQpfX19KGMsZCxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtyZXR1cm4gYS5yZXBsYWNlKC8tKC4pL2csZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfSl9ZnVuY3Rpb24gZShhLGIsYyl7aFtjXT1oW2NdfHxbXSxoW2NdLnB1c2goW2EsYl0pfWZ1bmN0aW9uIGYoYSxiLGMpe2Zvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgZz1jW2ZdO2UoYSxiLGQoZykpfX1mdW5jdGlvbiBnKGMsZSxmKXt2YXIgZz1jOy8tLy50ZXN0KGMpJiYhYS5pc0RlcHJlY2F0ZWQoIkh5cGhlbmF0ZWQgcHJvcGVydHkgbmFtZXMiLCIyMDE2LTAzLTIyIiwiVXNlIGNhbWVsQ2FzZSBpbnN0ZWFkLiIsITApJiYoZz1kKGMpKSwiaW5pdGlhbCIhPWUmJiJpbml0aWFsIiE9Znx8KCJpbml0aWFsIj09ZSYmKGU9aVtnXSksImluaXRpYWwiPT1mJiYoZj1pW2ddKSk7Zm9yKHZhciBqPWU9PWY/W106aFtnXSxrPTA7aiYmazxqLmxlbmd0aDtrKyspe3ZhciBsPWpba11bMF0oZSksbT1qW2tdWzBdKGYpO2lmKHZvaWQgMCE9PWwmJnZvaWQgMCE9PW0pe3ZhciBuPWpba11bMV0obCxtKTtpZihuKXt2YXIgbz1iLkludGVycG9sYXRpb24uYXBwbHkobnVsbCxuKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIDA9PWE/ZToxPT1hP2Y6byhhKX19fX1yZXR1cm4gYi5JbnRlcnBvbGF0aW9uKCExLCEwLGZ1bmN0aW9uKGEpe3JldHVybiBhP2Y6ZX0pfXZhciBoPXt9O2IuYWRkUHJvcGVydGllc0hhbmRsZXI9Zjt2YXIgaT17YmFja2dyb3VuZENvbG9yOiJ0cmFuc3BhcmVudCIsYmFja2dyb3VuZFBvc2l0aW9uOiIwJSAwJSIsYm9yZGVyQm90dG9tQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyQm90dG9tTGVmdFJhZGl1czoiMHB4Iixib3JkZXJCb3R0b21SaWdodFJhZGl1czoiMHB4Iixib3JkZXJCb3R0b21XaWR0aDoiM3B4Iixib3JkZXJMZWZ0Q29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyTGVmdFdpZHRoOiIzcHgiLGJvcmRlclJpZ2h0Q29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyUmlnaHRXaWR0aDoiM3B4Iixib3JkZXJTcGFjaW5nOiIycHgiLGJvcmRlclRvcENvbG9yOiJjdXJyZW50Q29sb3IiLGJvcmRlclRvcExlZnRSYWRpdXM6IjBweCIsYm9yZGVyVG9wUmlnaHRSYWRpdXM6IjBweCIsYm9yZGVyVG9wV2lkdGg6IjNweCIsYm90dG9tOiJhdXRvIixjbGlwOiJyZWN0KDBweCwgMHB4LCAwcHgsIDBweCkiLGNvbG9yOiJibGFjayIsZm9udFNpemU6IjEwMCUiLGZvbnRXZWlnaHQ6IjQwMCIsaGVpZ2h0OiJhdXRvIixsZWZ0OiJhdXRvIixsZXR0ZXJTcGFjaW5nOiJub3JtYWwiLGxpbmVIZWlnaHQ6IjEyMCUiLG1hcmdpbkJvdHRvbToiMHB4IixtYXJnaW5MZWZ0OiIwcHgiLG1hcmdpblJpZ2h0OiIwcHgiLG1hcmdpblRvcDoiMHB4IixtYXhIZWlnaHQ6Im5vbmUiLG1heFdpZHRoOiJub25lIixtaW5IZWlnaHQ6IjBweCIsbWluV2lkdGg6IjBweCIsb3BhY2l0eToiMS4wIixvdXRsaW5lQ29sb3I6ImludmVydCIsb3V0bGluZU9mZnNldDoiMHB4IixvdXRsaW5lV2lkdGg6IjNweCIscGFkZGluZ0JvdHRvbToiMHB4IixwYWRkaW5nTGVmdDoiMHB4IixwYWRkaW5nUmlnaHQ6IjBweCIscGFkZGluZ1RvcDoiMHB4IixyaWdodDoiYXV0byIsdGV4dEluZGVudDoiMHB4Iix0ZXh0U2hhZG93OiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCIsdG9wOiJhdXRvIix0cmFuc2Zvcm06IiIsdmVydGljYWxBbGlnbjoiMHB4Iix2aXNpYmlsaXR5OiJ2aXNpYmxlIix3aWR0aDoiYXV0byIsd29yZFNwYWNpbmc6Im5vcm1hbCIsekluZGV4OiJhdXRvIn07Yi5wcm9wZXJ0eUludGVycG9sYXRpb249Z30oYyxkLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGIpe3ZhciBjPWEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oYiksZD1mdW5jdGlvbihkKXtyZXR1cm4gYS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYyxkLGIpfTtyZXR1cm4gZC5fdG90YWxEdXJhdGlvbj1iLmRlbGF5K2MrYi5lbmREZWxheSxkLl9pc0N1cnJlbnQ9ZnVuY3Rpb24oZCl7dmFyIGU9YS5jYWxjdWxhdGVQaGFzZShjLGQsYik7cmV0dXJuIGU9PT1QaGFzZUFjdGl2ZXx8ZT09PVBoYXNlQmVmb3JlfSxkfWIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYyxlLGYsZyl7dmFyIGgsaT1kKGEubm9ybWFsaXplVGltaW5nSW5wdXQoZikpLGo9Yi5jb252ZXJ0RWZmZWN0SW5wdXQoZSksaz1mdW5jdGlvbigpe2ooYyxoKX07cmV0dXJuIGsuX3VwZGF0ZT1mdW5jdGlvbihhKXtyZXR1cm4gaD1pKGEpLG51bGwhPT1ofSxrLl9jbGVhcj1mdW5jdGlvbigpe2ooYyxudWxsKX0say5faGFzU2FtZVRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYz09PWF9LGsuX2lzQ3VycmVudD1pLl9pc0N1cnJlbnQsay5fdG90YWxEdXJhdGlvbj1pLl90b3RhbER1cmF0aW9uLGsuX2lkPWcsa30sYi5OdWxsRWZmZWN0PWZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKCl7YSYmKGEoKSxhPW51bGwpfTtyZXR1cm4gYi5fdXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGIuX3RvdGFsRHVyYXRpb249MCxiLl9pc0N1cnJlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYi5faGFzU2FtZVRhcmdldD1mdW5jdGlvbigpe3JldHVybiExfSxifX0oYyxkLGYpLGZ1bmN0aW9uKGEsYil7YS5hcHBseT1mdW5jdGlvbihiLGMsZCl7Yi5zdHlsZVthLnByb3BlcnR5TmFtZShjKV09ZH0sYS5jbGVhcj1mdW5jdGlvbihiLGMpe2Iuc3R5bGVbYS5wcm9wZXJ0eU5hbWUoYyldPSIifX0oZCxmKSxmdW5jdGlvbihhKXt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihiLGMpe3ZhciBkPSIiO3JldHVybiBjJiZjLmlkJiYoZD1jLmlkKSxhLnRpbWVsaW5lLl9wbGF5KGEuS2V5ZnJhbWVFZmZlY3QodGhpcyxiLGMsZCkpfX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYixkKXtpZigibnVtYmVyIj09dHlwZW9mIGEmJiJudW1iZXIiPT10eXBlb2YgYilyZXR1cm4gYSooMS1kKStiKmQ7aWYoImJvb2xlYW4iPT10eXBlb2YgYSYmImJvb2xlYW4iPT10eXBlb2YgYilyZXR1cm4uNT5kP2E6YjtpZihhLmxlbmd0aD09Yi5sZW5ndGgpe2Zvcih2YXIgZT1bXSxmPTA7ZjxhLmxlbmd0aDtmKyspZS5wdXNoKGMoYVtmXSxiW2ZdLGQpKTtyZXR1cm4gZX10aHJvdyJNaXNtYXRjaGVkIGludGVycG9sYXRpb24gYXJndW1lbnRzICIrYSsiOiIrYn1hLkludGVycG9sYXRpb249ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZChjKGEsYixlKSl9fX0oZCxmKSxmdW5jdGlvbihhLGIsYyl7YS5zZXF1ZW5jZU51bWJlcj0wO3ZhciBkPWZ1bmN0aW9uKGEsYixjKXt0aGlzLnRhcmdldD1hLHRoaXMuY3VycmVudFRpbWU9Yix0aGlzLnRpbWVsaW5lVGltZT1jLHRoaXMudHlwZT0iZmluaXNoIix0aGlzLmJ1YmJsZXM9ITEsdGhpcy5jYW5jZWxhYmxlPSExLHRoaXMuY3VycmVudFRhcmdldD1hLHRoaXMuZGVmYXVsdFByZXZlbnRlZD0hMSx0aGlzLmV2ZW50UGhhc2U9RXZlbnQuQVRfVEFSR0VULHRoaXMudGltZVN0YW1wPURhdGUubm93KCl9O2IuQW5pbWF0aW9uPWZ1bmN0aW9uKGIpe3RoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLl9zZXF1ZW5jZU51bWJlcj1hLnNlcXVlbmNlTnVtYmVyKyssdGhpcy5fY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9wYXVzZWQ9ITEsdGhpcy5fcGxheWJhY2tSYXRlPTEsdGhpcy5faW5UaW1lbGluZT0hMCx0aGlzLl9maW5pc2hlZEZsYWc9ITAsdGhpcy5vbmZpbmlzaD1udWxsLHRoaXMuX2ZpbmlzaEhhbmRsZXJzPVtdLHRoaXMuX2VmZmVjdD1iLHRoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKDApLHRoaXMuX2lkbGU9ITAsdGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExfSxiLkFuaW1hdGlvbi5wcm90b3R5cGU9e19lbnN1cmVBbGl2ZTpmdW5jdGlvbigpe3RoaXMucGxheWJhY2tSYXRlPDAmJjA9PT10aGlzLmN1cnJlbnRUaW1lP3RoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKC0xKTp0aGlzLl9pbkVmZmVjdD10aGlzLl9lZmZlY3QuX3VwZGF0ZSh0aGlzLmN1cnJlbnRUaW1lKSx0aGlzLl9pblRpbWVsaW5lfHwhdGhpcy5faW5FZmZlY3QmJnRoaXMuX2ZpbmlzaGVkRmxhZ3x8KHRoaXMuX2luVGltZWxpbmU9ITAsYi50aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpKX0sX3RpY2tDdXJyZW50VGltZTpmdW5jdGlvbihhLGIpe2EhPXRoaXMuX2N1cnJlbnRUaW1lJiYodGhpcy5fY3VycmVudFRpbWU9YSx0aGlzLl9pc0ZpbmlzaGVkJiYhYiYmKHRoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wP3RoaXMuX3RvdGFsRHVyYXRpb246MCksdGhpcy5fZW5zdXJlQWxpdmUoKSl9LGdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLl9pZGxlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/bnVsbDp0aGlzLl9jdXJyZW50VGltZX0sc2V0IGN1cnJlbnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fChiLnJlc3RhcnQoKSx0aGlzLl9wYXVzZWR8fG51bGw9PXRoaXMuX3N0YXJ0VGltZXx8KHRoaXMuX3N0YXJ0VGltZT10aGlzLl90aW1lbGluZS5jdXJyZW50VGltZS1hL3RoaXMuX3BsYXliYWNrUmF0ZSksdGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLHRoaXMuX2N1cnJlbnRUaW1lIT1hJiYodGhpcy5fdGlja0N1cnJlbnRUaW1lKGEsITApLGIuaW52YWxpZGF0ZUVmZmVjdHMoKSkpfSxnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX3N0YXJ0VGltZX0sc2V0IHN0YXJ0VGltZShhKXthPSthLGlzTmFOKGEpfHx0aGlzLl9wYXVzZWR8fHRoaXMuX2lkbGV8fCh0aGlzLl9zdGFydFRpbWU9YSx0aGlzLl90aWNrQ3VycmVudFRpbWUoKHRoaXMuX3RpbWVsaW5lLmN1cnJlbnRUaW1lLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5wbGF5YmFja1JhdGUpLGIuaW52YWxpZGF0ZUVmZmVjdHMoKSl9LGdldCBwbGF5YmFja1JhdGUoKXtyZXR1cm4gdGhpcy5fcGxheWJhY2tSYXRlfSxzZXQgcGxheWJhY2tSYXRlKGEpe2lmKGEhPXRoaXMuX3BsYXliYWNrUmF0ZSl7dmFyIGI9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9wbGF5YmFja1JhdGU9YSx0aGlzLl9zdGFydFRpbWU9bnVsbCwicGF1c2VkIiE9dGhpcy5wbGF5U3RhdGUmJiJpZGxlIiE9dGhpcy5wbGF5U3RhdGUmJnRoaXMucGxheSgpLG51bGwhPWImJih0aGlzLmN1cnJlbnRUaW1lPWIpfX0sZ2V0IF9pc0ZpbmlzaGVkKCl7cmV0dXJuIXRoaXMuX2lkbGUmJih0aGlzLl9wbGF5YmFja1JhdGU+MCYmdGhpcy5fY3VycmVudFRpbWU+PXRoaXMuX3RvdGFsRHVyYXRpb258fHRoaXMuX3BsYXliYWNrUmF0ZTwwJiZ0aGlzLl9jdXJyZW50VGltZTw9MCl9LGdldCBfdG90YWxEdXJhdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3QuX3RvdGFsRHVyYXRpb259LGdldCBwbGF5U3RhdGUoKXtyZXR1cm4gdGhpcy5faWRsZT8iaWRsZSI6bnVsbD09dGhpcy5fc3RhcnRUaW1lJiYhdGhpcy5fcGF1c2VkJiYwIT10aGlzLnBsYXliYWNrUmF0ZXx8dGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPyJwZW5kaW5nIjp0aGlzLl9wYXVzZWQ/InBhdXNlZCI6dGhpcy5faXNGaW5pc2hlZD8iZmluaXNoZWQiOiJydW5uaW5nIn0scGxheTpmdW5jdGlvbigpe3RoaXMuX3BhdXNlZD0hMSwodGhpcy5faXNGaW5pc2hlZHx8dGhpcy5faWRsZSkmJih0aGlzLl9jdXJyZW50VGltZT10aGlzLl9wbGF5YmFja1JhdGU+MD8wOnRoaXMuX3RvdGFsRHVyYXRpb24sdGhpcy5fc3RhcnRUaW1lPW51bGwpLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMSx0aGlzLl9pZGxlPSExLHRoaXMuX2Vuc3VyZUFsaXZlKCksYi5pbnZhbGlkYXRlRWZmZWN0cygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX2lzRmluaXNoZWR8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMCksdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5fcGF1c2VkPSEwfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9pZGxlfHwodGhpcy5jdXJyZW50VGltZT10aGlzLl9wbGF5YmFja1JhdGU+MD90aGlzLl90b3RhbER1cmF0aW9uOjAsdGhpcy5fc3RhcnRUaW1lPXRoaXMuX3RvdGFsRHVyYXRpb24tdGhpcy5jdXJyZW50VGltZSx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsYi5pbnZhbGlkYXRlRWZmZWN0cygpKX0sY2FuY2VsOmZ1bmN0aW9uKCl7dGhpcy5faW5FZmZlY3QmJih0aGlzLl9pbkVmZmVjdD0hMSx0aGlzLl9pZGxlPSEwLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMCx0aGlzLmN1cnJlbnRUaW1lPTAsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5fZWZmZWN0Ll91cGRhdGUobnVsbCksYi5pbnZhbGlkYXRlRWZmZWN0cygpKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMucGxheWJhY2tSYXRlKj0tMSx0aGlzLnBsYXkoKX0sYWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiYiZmluaXNoIj09YSYmdGhpcy5fZmluaXNoSGFuZGxlcnMucHVzaChiKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIpe2lmKCJmaW5pc2giPT1hKXt2YXIgYz10aGlzLl9maW5pc2hIYW5kbGVycy5pbmRleE9mKGIpO2M+PTAmJnRoaXMuX2ZpbmlzaEhhbmRsZXJzLnNwbGljZShjLDEpfX0sX2ZpcmVFdmVudHM6ZnVuY3Rpb24oYSl7aWYodGhpcy5faXNGaW5pc2hlZCl7aWYoIXRoaXMuX2ZpbmlzaGVkRmxhZyl7dmFyIGI9bmV3IGQodGhpcyx0aGlzLl9jdXJyZW50VGltZSxhKSxjPXRoaXMuX2ZpbmlzaEhhbmRsZXJzLmNvbmNhdCh0aGlzLm9uZmluaXNoP1t0aGlzLm9uZmluaXNoXTpbXSk7c2V0VGltZW91dChmdW5jdGlvbigpe2MuZm9yRWFjaChmdW5jdGlvbihhKXthLmNhbGwoYi50YXJnZXQsYil9KX0sMCksdGhpcy5fZmluaXNoZWRGbGFnPSEwfX1lbHNlIHRoaXMuX2ZpbmlzaGVkRmxhZz0hMX0sX3RpY2s6ZnVuY3Rpb24oYSxiKXt0aGlzLl9pZGxlfHx0aGlzLl9wYXVzZWR8fChudWxsPT10aGlzLl9zdGFydFRpbWU/YiYmKHRoaXMuc3RhcnRUaW1lPWEtdGhpcy5fY3VycmVudFRpbWUvdGhpcy5wbGF5YmFja1JhdGUpOnRoaXMuX2lzRmluaXNoZWR8fHRoaXMuX3RpY2tDdXJyZW50VGltZSgoYS10aGlzLl9zdGFydFRpbWUpKnRoaXMucGxheWJhY2tSYXRlKSksYiYmKHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSx0aGlzLl9maXJlRXZlbnRzKGEpKX0sZ2V0IF9uZWVkc1RpY2soKXtyZXR1cm4gdGhpcy5wbGF5U3RhdGUgaW57cGVuZGluZzoxLHJ1bm5pbmc6MX18fCF0aGlzLl9maW5pc2hlZEZsYWd9fX0oYyxkLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3ZhciBiPWo7aj1bXSxhPHAuY3VycmVudFRpbWUmJihhPXAuY3VycmVudFRpbWUpLGgoYSwhMCksYi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2JbMV0oYSl9KSxnKCksbD12b2lkIDB9ZnVuY3Rpb24gZShhLGIpe3JldHVybiBhLl9zZXF1ZW5jZU51bWJlci1iLl9zZXF1ZW5jZU51bWJlcn1mdW5jdGlvbiBmKCl7dGhpcy5fYW5pbWF0aW9ucz1bXSx0aGlzLmN1cnJlbnRUaW1lPXdpbmRvdy5wZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlLm5vdygpOjB9ZnVuY3Rpb24gZygpe28uZm9yRWFjaChmdW5jdGlvbihhKXthKCl9KSxvLmxlbmd0aD0wfWZ1bmN0aW9uIGgoYSxjKXtuPSExO3ZhciBkPWIudGltZWxpbmU7ZC5jdXJyZW50VGltZT1hLGQuX2FuaW1hdGlvbnMuc29ydChlKSxtPSExO3ZhciBmPWQuX2FuaW1hdGlvbnM7ZC5fYW5pbWF0aW9ucz1bXTt2YXIgZz1bXSxoPVtdO2Y9Zi5maWx0ZXIoZnVuY3Rpb24oYil7Yi5fdGljayhhLGMpLGIuX2luRWZmZWN0P2gucHVzaChiLl9lZmZlY3QpOmcucHVzaChiLl9lZmZlY3QpLGIuX25lZWRzVGljayYmKG09ITApO3ZhciBkPWIuX2luRWZmZWN0fHxiLl9uZWVkc1RpY2s7cmV0dXJuIGIuX2luVGltZWxpbmU9ZCxkfSksby5wdXNoLmFwcGx5KG8sZyksby5wdXNoLmFwcGx5KG8saCksZC5fYW5pbWF0aW9ucy5wdXNoLmFwcGx5KGQuX2FuaW1hdGlvbnMsZiksbSYmcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7fSl9dmFyIGk9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSxqPVtdLGs9MDt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGEpe3ZhciBiPWsrKztyZXR1cm4gMD09ai5sZW5ndGgmJmkoZCksai5wdXNoKFtiLGFdKSxifSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7ai5mb3JFYWNoKGZ1bmN0aW9uKGIpe2JbMF09PWEmJihiWzFdPWZ1bmN0aW9uKCl7fSl9KX0sZi5wcm90b3R5cGU9e19wbGF5OmZ1bmN0aW9uKGMpe2MuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGMudGltaW5nKTt2YXIgZD1uZXcgYi5BbmltYXRpb24oYyk7cmV0dXJuIGQuX2lkbGU9ITEsZC5fdGltZWxpbmU9dGhpcyx0aGlzLl9hbmltYXRpb25zLnB1c2goZCksYi5yZXN0YXJ0KCksYi5pbnZhbGlkYXRlRWZmZWN0cygpLGR9fTt2YXIgbD12b2lkIDAsbT0hMSxuPSExO2IucmVzdGFydD1mdW5jdGlvbigpe3JldHVybiBtfHwobT0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt9KSxuPSEwKSxufSxiLmludmFsaWRhdGVFZmZlY3RzPWZ1bmN0aW9uKCl7aChiLnRpbWVsaW5lLmN1cnJlbnRUaW1lLCExKSxnKCl9O3ZhciBvPVtdLHA9bmV3IGY7Yi50aW1lbGluZT1wfShjLGQsZiksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPWEuZXhlYyhiKTtyZXR1cm4gYz8oYz1hLmlnbm9yZUNhc2U/Y1swXS50b0xvd2VyQ2FzZSgpOmNbMF0sW2MsYi5zdWJzdHIoYy5sZW5ndGgpXSk6dm9pZCAwfWZ1bmN0aW9uIGMoYSxiKXtiPWIucmVwbGFjZSgvXlxzKi8sIiIpO3ZhciBjPWEoYik7cmV0dXJuIGM/W2NbMF0sY1sxXS5yZXBsYWNlKC9eXHMqLywiIildOnZvaWQgMH1mdW5jdGlvbiBkKGEsZCxlKXthPWMuYmluZChudWxsLGEpO2Zvcih2YXIgZj1bXTs7KXt2YXIgZz1hKGUpO2lmKCFnKXJldHVybltmLGVdO2lmKGYucHVzaChnWzBdKSxlPWdbMV0sZz1iKGQsZSksIWd8fCIiPT1nWzFdKXJldHVybltmLGVdO2U9Z1sxXX19ZnVuY3Rpb24gZShhLGIpe2Zvcih2YXIgYz0wLGQ9MDtkPGIubGVuZ3RoJiYoIS9cc3wsLy50ZXN0KGJbZF0pfHwwIT1jKTtkKyspaWYoIigiPT1iW2RdKWMrKztlbHNlIGlmKCIpIj09YltkXSYmKGMtLSwwPT1jJiZkKyssMD49YykpYnJlYWs7dmFyIGU9YShiLnN1YnN0cigwLGQpKTtyZXR1cm4gdm9pZCAwPT1lP3ZvaWQgMDpbZSxiLnN1YnN0cihkKV19ZnVuY3Rpb24gZihhLGIpe2Zvcih2YXIgYz1hLGQ9YjtjJiZkOyljPmQ/YyU9ZDpkJT1jO3JldHVybiBjPWEqYi8oYytkKX1mdW5jdGlvbiBnKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1hKGIpO3JldHVybiBjJiYoY1swXT12b2lkIDApLGN9fWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7dmFyIGQ9YShjKTtyZXR1cm4gZD9kOltiLGNdfX1mdW5jdGlvbiBpKGIsYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGIubGVuZ3RoO2UrKyl7dmFyIGY9YS5jb25zdW1lVHJpbW1lZChiW2VdLGMpO2lmKCFmfHwiIj09ZlswXSlyZXR1cm47dm9pZCAwIT09ZlswXSYmZC5wdXNoKGZbMF0pLGM9ZlsxXX1yZXR1cm4iIj09Yz9kOnZvaWQgMH1mdW5jdGlvbiBqKGEsYixjLGQsZSl7Zm9yKHZhciBnPVtdLGg9W10saT1bXSxqPWYoZC5sZW5ndGgsZS5sZW5ndGgpLGs9MDtqPms7aysrKXt2YXIgbD1iKGRbayVkLmxlbmd0aF0sZVtrJWUubGVuZ3RoXSk7aWYoIWwpcmV0dXJuO2cucHVzaChsWzBdKSxoLnB1c2gobFsxXSksaS5wdXNoKGxbMl0pfXJldHVybltnLGgsZnVuY3Rpb24oYil7dmFyIGQ9Yi5tYXAoZnVuY3Rpb24oYSxiKXtyZXR1cm4gaVtiXShhKX0pLmpvaW4oYyk7cmV0dXJuIGE/YShkKTpkfV19ZnVuY3Rpb24gayhhLGIsYyl7Zm9yKHZhciBkPVtdLGU9W10sZj1bXSxnPTAsaD0wO2g8Yy5sZW5ndGg7aCsrKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBjW2hdKXt2YXIgaT1jW2hdKGFbZ10sYltnKytdKTtkLnB1c2goaVswXSksZS5wdXNoKGlbMV0pLGYucHVzaChpWzJdKX1lbHNlIWZ1bmN0aW9uKGEpe2QucHVzaCghMSksZS5wdXNoKCExKSxmLnB1c2goZnVuY3Rpb24oKXtyZXR1cm4gY1thXX0pfShoKTtyZXR1cm5bZCxlLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspYis9ZltjXShhW2NdKTtyZXR1cm4gYn1dfWEuY29uc3VtZVRva2VuPWIsYS5jb25zdW1lVHJpbW1lZD1jLGEuY29uc3VtZVJlcGVhdGVkPWQsYS5jb25zdW1lUGFyZW50aGVzaXNlZD1lLGEuaWdub3JlPWcsYS5vcHRpb25hbD1oLGEuY29uc3VtZUxpc3Q9aSxhLm1lcmdlTmVzdGVkUmVwZWF0ZWQ9ai5iaW5kKG51bGwsbnVsbCksYS5tZXJnZVdyYXBwZWROZXN0ZWRSZXBlYXRlZD1qLGEubWVyZ2VMaXN0PWt9KGQpLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYil7ZnVuY3Rpb24gYyhiKXt2YXIgYz1hLmNvbnN1bWVUb2tlbigvXmluc2V0L2ksYik7aWYoYylyZXR1cm4gZC5pbnNldD0hMCxjO3ZhciBjPWEuY29uc3VtZUxlbmd0aE9yUGVyY2VudChiKTtpZihjKXJldHVybiBkLmxlbmd0aHMucHVzaChjWzBdKSxjO3ZhciBjPWEuY29uc3VtZUNvbG9yKGIpO3JldHVybiBjPyhkLmNvbG9yPWNbMF0sYyk6dm9pZCAwfXZhciBkPXtpbnNldDohMSxsZW5ndGhzOltdLGNvbG9yOm51bGx9LGU9YS5jb25zdW1lUmVwZWF0ZWQoYywvXi8sYik7cmV0dXJuIGUmJmVbMF0ubGVuZ3RoP1tkLGVbMV1dOnZvaWQgMH1mdW5jdGlvbiBjKGMpe3ZhciBkPWEuY29uc3VtZVJlcGVhdGVkKGIsL14sLyxjKTtyZXR1cm4gZCYmIiI9PWRbMV0/ZFswXTp2b2lkIDB9ZnVuY3Rpb24gZChiLGMpe2Zvcig7Yi5sZW5ndGhzLmxlbmd0aDxNYXRoLm1heChiLmxlbmd0aHMubGVuZ3RoLGMubGVuZ3Rocy5sZW5ndGgpOyliLmxlbmd0aHMucHVzaCh7cHg6MH0pO2Zvcig7Yy5sZW5ndGhzLmxlbmd0aDxNYXRoLm1heChiLmxlbmd0aHMubGVuZ3RoLGMubGVuZ3Rocy5sZW5ndGgpOyljLmxlbmd0aHMucHVzaCh7cHg6MH0pO2lmKGIuaW5zZXQ9PWMuaW5zZXQmJiEhYi5jb2xvcj09ISFjLmNvbG9yKXtmb3IodmFyIGQsZT1bXSxmPVtbXSwwXSxnPVtbXSwwXSxoPTA7aDxiLmxlbmd0aHMubGVuZ3RoO2grKyl7dmFyIGk9YS5tZXJnZURpbWVuc2lvbnMoYi5sZW5ndGhzW2hdLGMubGVuZ3Roc1toXSwyPT1oKTtmWzBdLnB1c2goaVswXSksZ1swXS5wdXNoKGlbMV0pLGUucHVzaChpWzJdKX1pZihiLmNvbG9yJiZjLmNvbG9yKXt2YXIgaj1hLm1lcmdlQ29sb3JzKGIuY29sb3IsYy5jb2xvcik7ZlsxXT1qWzBdLGdbMV09alsxXSxkPWpbMl19cmV0dXJuW2YsZyxmdW5jdGlvbihhKXtmb3IodmFyIGM9Yi5pbnNldD8iaW5zZXQgIjoiICIsZj0wO2Y8ZS5sZW5ndGg7ZisrKWMrPWVbZl0oYVswXVtmXSkrIiAiO3JldHVybiBkJiYoYys9ZChhWzFdKSksY31dfX1mdW5jdGlvbiBlKGIsYyxkLGUpe2Z1bmN0aW9uIGYoYSl7cmV0dXJue2luc2V0OmEsY29sb3I6WzAsMCwwLDBdLGxlbmd0aHM6W3tweDowfSx7cHg6MH0se3B4OjB9LHtweDowfV19fWZvcih2YXIgZz1bXSxoPVtdLGk9MDtpPGQubGVuZ3RofHxpPGUubGVuZ3RoO2krKyl7dmFyIGo9ZFtpXXx8ZihlW2ldLmluc2V0KSxrPWVbaV18fGYoZFtpXS5pbnNldCk7Zy5wdXNoKGopLGgucHVzaChrKX1yZXR1cm4gYS5tZXJnZU5lc3RlZFJlcGVhdGVkKGIsYyxnLGgpfXZhciBmPWUuYmluZChudWxsLGQsIiwgIik7YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihjLGYsWyJib3gtc2hhZG93IiwidGV4dC1zaGFkb3ciXSl9KGQpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gYS50b0ZpeGVkKDMpLnJlcGxhY2UoIi4wMDAiLCIiKX1mdW5jdGlvbiBkKGEsYixjKXtyZXR1cm4gTWF0aC5taW4oYixNYXRoLm1heChhLGMpKX1mdW5jdGlvbiBlKGEpe3JldHVybi9eXHMqWy0rXT8oXGQqXC4pP1xkK1xzKiQvLnRlc3QoYSk/TnVtYmVyKGEpOnZvaWQgMH1mdW5jdGlvbiBmKGEsYil7cmV0dXJuW2EsYixjXX1mdW5jdGlvbiBnKGEsYil7cmV0dXJuIDAhPWE/aSgwLDEvMCkoYSxiKTp2b2lkIDB9ZnVuY3Rpb24gaChhLGIpe3JldHVyblthLGIsZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoZCgxLDEvMCxhKSl9XX1mdW5jdGlvbiBpKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuW2UsZixmdW5jdGlvbihlKXtyZXR1cm4gYyhkKGEsYixlKSl9XX19ZnVuY3Rpb24gaihhLGIpe3JldHVyblthLGIsTWF0aC5yb3VuZF19YS5jbGFtcD1kLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxpKDAsMS8wKSxbImJvcmRlci1pbWFnZS13aWR0aCIsImxpbmUtaGVpZ2h0Il0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxpKDAsMSksWyJvcGFjaXR5Iiwic2hhcGUtaW1hZ2UtdGhyZXNob2xkIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxnLFsiZmxleC1ncm93IiwiZmxleC1zaHJpbmsiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGgsWyJvcnBoYW5zIiwid2lkb3dzIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxqLFsiei1pbmRleCJdKSxhLnBhcnNlTnVtYmVyPWUsYS5tZXJnZU51bWJlcnM9ZixhLm51bWJlclRvU3RyaW5nPWN9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7cmV0dXJuInZpc2libGUiPT1hfHwidmlzaWJsZSI9PWI/WzAsMSxmdW5jdGlvbihjKXtyZXR1cm4gMD49Yz9hOmM+PTE/YjoidmlzaWJsZSJ9XTp2b2lkIDB9YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihTdHJpbmcsYyxbInZpc2liaWxpdHkiXSl9KGQpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXthPWEudHJpbSgpLGYuZmlsbFN0eWxlPSIjMDAwIixmLmZpbGxTdHlsZT1hO3ZhciBiPWYuZmlsbFN0eWxlO2lmKGYuZmlsbFN0eWxlPSIjZmZmIixmLmZpbGxTdHlsZT1hLGI9PWYuZmlsbFN0eWxlKXtmLmZpbGxSZWN0KDAsMCwxLDEpO3ZhciBjPWYuZ2V0SW1hZ2VEYXRhKDAsMCwxLDEpLmRhdGE7Zi5jbGVhclJlY3QoMCwwLDEsMSk7dmFyIGQ9Y1szXS8yNTU7cmV0dXJuW2NbMF0qZCxjWzFdKmQsY1syXSpkLGRdfX1mdW5jdGlvbiBkKGIsYyl7cmV0dXJuW2IsYyxmdW5jdGlvbihiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDI1NSxhKSl9aWYoYlszXSlmb3IodmFyIGQ9MDszPmQ7ZCsrKWJbZF09TWF0aC5yb3VuZChjKGJbZF0vYlszXSkpO3JldHVybiBiWzNdPWEubnVtYmVyVG9TdHJpbmcoYS5jbGFtcCgwLDEsYlszXSkpLCJyZ2JhKCIrYi5qb2luKCIsIikrIikifV19dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIik7ZS53aWR0aD1lLmhlaWdodD0xO3ZhciBmPWUuZ2V0Q29udGV4dCgiMmQiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZCxbImJhY2tncm91bmQtY29sb3IiLCJib3JkZXItYm90dG9tLWNvbG9yIiwiYm9yZGVyLWxlZnQtY29sb3IiLCJib3JkZXItcmlnaHQtY29sb3IiLCJib3JkZXItdG9wLWNvbG9yIiwiY29sb3IiLCJvdXRsaW5lLWNvbG9yIiwidGV4dC1kZWNvcmF0aW9uLWNvbG9yIl0pLGEuY29uc3VtZUNvbG9yPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGMpLGEubWVyZ2VDb2xvcnM9ZH0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiPWIudHJpbSgpLnRvTG93ZXJDYXNlKCksIjAiPT1iJiYicHgiLnNlYXJjaChhKT49MClyZXR1cm57cHg6MH07aWYoL15bXihdKiR8XmNhbGMvLnRlc3QoYikpe2I9Yi5yZXBsYWNlKC9jYWxjXCgvZywiKCIpO3ZhciBjPXt9O2I9Yi5yZXBsYWNlKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV09bnVsbCwiVSIrYX0pO2Zvcih2YXIgZD0iVSgiK2Euc291cmNlKyIpIixlPWIucmVwbGFjZSgvWy0rXT8oXGQqXC4pP1xkKy9nLCJOIikucmVwbGFjZShuZXcgUmVnRXhwKCJOIitkLCJnIiksIkQiKS5yZXBsYWNlKC9cc1srLV1ccy9nLCJPIikucmVwbGFjZSgvXHMvZywiIiksZj1bL05cKihEKS9nLC8oTnxEKVsqXC9dTi9nLC8oTnxEKU9cMS9nLC9cKChOfEQpXCkvZ10sZz0wO2c8Zi5sZW5ndGg7KWZbZ10udGVzdChlKT8oZT1lLnJlcGxhY2UoZltnXSwiJDEiKSxnPTApOmcrKztpZigiRCI9PWUpe2Zvcih2YXIgaCBpbiBjKXt2YXIgaT1ldmFsKGIucmVwbGFjZShuZXcgUmVnRXhwKCJVIitoLCJnIiksIiIpLnJlcGxhY2UobmV3IFJlZ0V4cChkLCJnIiksIiowIikpO2lmKCFpc0Zpbml0ZShpKSlyZXR1cm47Y1toXT1pfXJldHVybiBjfX19ZnVuY3Rpb24gZChhLGIpe3JldHVybiBlKGEsYiwhMCl9ZnVuY3Rpb24gZShiLGMsZCl7dmFyIGUsZj1bXTtmb3IoZSBpbiBiKWYucHVzaChlKTtmb3IoZSBpbiBjKWYuaW5kZXhPZihlKTwwJiZmLnB1c2goZSk7cmV0dXJuIGI9Zi5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGJbYV18fDB9KSxjPWYubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBjW2FdfHwwfSksW2IsYyxmdW5jdGlvbihiKXt2YXIgYz1iLm1hcChmdW5jdGlvbihjLGUpe3JldHVybiAxPT1iLmxlbmd0aCYmZCYmKGM9TWF0aC5tYXgoYywwKSksYS5udW1iZXJUb1N0cmluZyhjKStmW2VdfSkuam9pbigiICsgIik7cmV0dXJuIGIubGVuZ3RoPjE/ImNhbGMoIitjKyIpIjpjfV19dmFyIGY9InB4fGVtfGV4fGNofHJlbXx2d3x2aHx2bWlufHZtYXh8Y218bW18aW58cHR8cGMiLGc9Yy5iaW5kKG51bGwsbmV3IFJlZ0V4cChmLCJnIikpLGg9Yy5iaW5kKG51bGwsbmV3IFJlZ0V4cChmKyJ8JSIsImciKSksaT1jLmJpbmQobnVsbCwvZGVnfHJhZHxncmFkfHR1cm4vZyk7YS5wYXJzZUxlbmd0aD1nLGEucGFyc2VMZW5ndGhPclBlcmNlbnQ9aCxhLmNvbnN1bWVMZW5ndGhPclBlcmNlbnQ9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsaCksYS5wYXJzZUFuZ2xlPWksYS5tZXJnZURpbWVuc2lvbnM9ZTt2YXIgaj1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxnKSxrPWEuY29uc3VtZVJlcGVhdGVkLmJpbmQodm9pZCAwLGosL14vKSxsPWEuY29uc3VtZVJlcGVhdGVkLmJpbmQodm9pZCAwLGssL14sLyk7YS5jb25zdW1lU2l6ZVBhaXJMaXN0PWw7dmFyIG09ZnVuY3Rpb24oYSl7dmFyIGI9bChhKTtyZXR1cm4gYiYmIiI9PWJbMV0/YlswXTp2b2lkIDB9LG49YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLGQsIiAiKSxvPWEubWVyZ2VOZXN0ZWRSZXBlYXRlZC5iaW5kKHZvaWQgMCxuLCIsIik7YS5tZXJnZU5vbk5lZ2F0aXZlU2l6ZVBhaXI9bixhLmFkZFByb3BlcnRpZXNIYW5kbGVyKG0sbyxbImJhY2tncm91bmQtc2l6ZSJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGgsZCxbImJvcmRlci1ib3R0b20td2lkdGgiLCJib3JkZXItaW1hZ2Utd2lkdGgiLCJib3JkZXItbGVmdC13aWR0aCIsImJvcmRlci1yaWdodC13aWR0aCIsImJvcmRlci10b3Atd2lkdGgiLCJmbGV4LWJhc2lzIiwiZm9udC1zaXplIiwiaGVpZ2h0IiwibGluZS1oZWlnaHQiLCJtYXgtaGVpZ2h0IiwibWF4LXdpZHRoIiwib3V0bGluZS13aWR0aCIsIndpZHRoIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaCxlLFsiYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyIsImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIiwiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyIsImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwiYm90dG9tIiwibGVmdCIsImxldHRlci1zcGFjaW5nIiwibWFyZ2luLWJvdHRvbSIsIm1hcmdpbi1sZWZ0IiwibWFyZ2luLXJpZ2h0IiwibWFyZ2luLXRvcCIsIm1pbi1oZWlnaHQiLCJtaW4td2lkdGgiLCJvdXRsaW5lLW9mZnNldCIsInBhZGRpbmctYm90dG9tIiwicGFkZGluZy1sZWZ0IiwicGFkZGluZy1yaWdodCIsInBhZGRpbmctdG9wIiwicGVyc3BlY3RpdmUiLCJyaWdodCIsInNoYXBlLW1hcmdpbiIsInRleHQtaW5kZW50IiwidG9wIiwidmVydGljYWwtYWxpZ24iLCJ3b3JkLXNwYWNpbmciXSl9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIpe3JldHVybiBhLmNvbnN1bWVMZW5ndGhPclBlcmNlbnQoYil8fGEuY29uc3VtZVRva2VuKC9eYXV0by8sYil9ZnVuY3Rpb24gZChiKXt2YXIgZD1hLmNvbnN1bWVMaXN0KFthLmlnbm9yZShhLmNvbnN1bWVUb2tlbi5iaW5kKG51bGwsL15yZWN0LykpLGEuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXlwoLykpLGEuY29uc3VtZVJlcGVhdGVkLmJpbmQobnVsbCxjLC9eLC8pLGEuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXlwpLykpXSxiKTtyZXR1cm4gZCYmND09ZFswXS5sZW5ndGg/ZFswXTp2b2lkIDB9ZnVuY3Rpb24gZShiLGMpe3JldHVybiJhdXRvIj09Ynx8ImF1dG8iPT1jP1shMCwhMSxmdW5jdGlvbihkKXt2YXIgZT1kP2I6YztpZigiYXV0byI9PWUpcmV0dXJuImF1dG8iO3ZhciBmPWEubWVyZ2VEaW1lbnNpb25zKGUsZSk7cmV0dXJuIGZbMl0oZlswXSl9XTphLm1lcmdlRGltZW5zaW9ucyhiLGMpfWZ1bmN0aW9uIGYoYSl7cmV0dXJuInJlY3QoIithKyIpIn12YXIgZz1hLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkLmJpbmQobnVsbCxmLGUsIiwgIik7YS5wYXJzZUJveD1kLGEubWVyZ2VCb3hlcz1nLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZCxnLFsiY2xpcCJdKX0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPTA7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09az9iW2MrK106YX0pfX1mdW5jdGlvbiBkKGEpe3JldHVybiBhfWZ1bmN0aW9uIGUoYil7aWYoYj1iLnRvTG93ZXJDYXNlKCkudHJpbSgpLCJub25lIj09YilyZXR1cm5bXTtmb3IodmFyIGMsZD0vXHMqKFx3KylcKChbXildKilcKS9nLGU9W10sZj0wO2M9ZC5leGVjKGIpOyl7aWYoYy5pbmRleCE9ZilyZXR1cm47Zj1jLmluZGV4K2NbMF0ubGVuZ3RoO3ZhciBnPWNbMV0saD1uW2ddO2lmKCFoKXJldHVybjt2YXIgaT1jWzJdLnNwbGl0KCIsIiksaj1oWzBdO2lmKGoubGVuZ3RoPGkubGVuZ3RoKXJldHVybjtmb3IodmFyIGs9W10sbz0wO288ai5sZW5ndGg7bysrKXt2YXIgcCxxPWlbb10scj1qW29dO2lmKHA9cT97QTpmdW5jdGlvbihiKXtyZXR1cm4iMCI9PWIudHJpbSgpP206YS5wYXJzZUFuZ2xlKGIpfSxOOmEucGFyc2VOdW1iZXIsVDphLnBhcnNlTGVuZ3RoT3JQZXJjZW50LEw6YS5wYXJzZUxlbmd0aH1bci50b1VwcGVyQ2FzZSgpXShxKTp7YTptLG46a1swXSx0Omx9W3JdLHZvaWQgMD09PXApcmV0dXJuO2sucHVzaChwKX1pZihlLnB1c2goe3Q6ZyxkOmt9KSxkLmxhc3RJbmRleD09Yi5sZW5ndGgpcmV0dXJuIGV9fWZ1bmN0aW9uIGYoYSl7cmV0dXJuIGEudG9GaXhlZCg2KS5yZXBsYWNlKCIuMDAwMDAwIiwiIil9ZnVuY3Rpb24gZyhiLGMpe2lmKGIuZGVjb21wb3NpdGlvblBhaXIhPT1jKXtiLmRlY29tcG9zaXRpb25QYWlyPWM7dmFyIGQ9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihiKX1pZihjLmRlY29tcG9zaXRpb25QYWlyIT09Yil7Yy5kZWNvbXBvc2l0aW9uUGFpcj1iO3ZhciBlPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24oYyl9cmV0dXJuIG51bGw9PWRbMF18fG51bGw9PWVbMF0/W1shMV0sWyEwXSxmdW5jdGlvbihhKXtyZXR1cm4gYT9jWzBdLmQ6YlswXS5kfV06KGRbMF0ucHVzaCgwKSxlWzBdLnB1c2goMSksW2QsZSxmdW5jdGlvbihiKXt2YXIgYz1hLnF1YXQoZFswXVszXSxlWzBdWzNdLGJbNV0pLGc9YS5jb21wb3NlTWF0cml4KGJbMF0sYlsxXSxiWzJdLGMsYls0XSksaD1nLm1hcChmKS5qb2luKCIsIik7cmV0dXJuIGh9XSl9ZnVuY3Rpb24gaChhKXtyZXR1cm4gYS5yZXBsYWNlKC9beHldLywiIil9ZnVuY3Rpb24gaShhKXtyZXR1cm4gYS5yZXBsYWNlKC8oeHx5fHp8M2QpPyQvLCIzZCIpfWZ1bmN0aW9uIGooYixjKXt2YXIgZD1hLm1ha2VNYXRyaXhEZWNvbXBvc2l0aW9uJiYhMCxlPSExO2lmKCFiLmxlbmd0aHx8IWMubGVuZ3RoKXtiLmxlbmd0aHx8KGU9ITAsYj1jLGM9W10pO2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKXt2YXIgaj1iW2ZdLnQsaz1iW2ZdLmQsbD0ic2NhbGUiPT1qLnN1YnN0cigwLDUpPzE6MDtjLnB1c2goe3Q6aixkOmsubWFwKGZ1bmN0aW9uKGEpe2lmKCJudW1iZXIiPT10eXBlb2YgYSlyZXR1cm4gbDt2YXIgYj17fTtmb3IodmFyIGMgaW4gYSliW2NdPWw7cmV0dXJuIGJ9KX0pfX12YXIgbT1mdW5jdGlvbihhLGIpe3JldHVybiJwZXJzcGVjdGl2ZSI9PWEmJiJwZXJzcGVjdGl2ZSI9PWJ8fCgibWF0cml4Ij09YXx8Im1hdHJpeDNkIj09YSkmJigibWF0cml4Ij09Ynx8Im1hdHJpeDNkIj09Yil9LG89W10scD1bXSxxPVtdO2lmKGIubGVuZ3RoIT1jLmxlbmd0aCl7aWYoIWQpcmV0dXJuO3ZhciByPWcoYixjKTtvPVtyWzBdXSxwPVtyWzFdXSxxPVtbIm1hdHJpeCIsW3JbMl1dXV19ZWxzZSBmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl7dmFyIGoscz1iW2ZdLnQsdD1jW2ZdLnQsdT1iW2ZdLmQsdj1jW2ZdLmQsdz1uW3NdLHg9blt0XTtpZihtKHMsdCkpe2lmKCFkKXJldHVybjt2YXIgcj1nKFtiW2ZdXSxbY1tmXV0pO28ucHVzaChyWzBdKSxwLnB1c2goclsxXSkscS5wdXNoKFsibWF0cml4IixbclsyXV1dKX1lbHNle2lmKHM9PXQpaj1zO2Vsc2UgaWYod1syXSYmeFsyXSYmaChzKT09aCh0KSlqPWgocyksdT13WzJdKHUpLHY9eFsyXSh2KTtlbHNle2lmKCF3WzFdfHwheFsxXXx8aShzKSE9aSh0KSl7aWYoIWQpcmV0dXJuO3ZhciByPWcoYixjKTtvPVtyWzBdXSxwPVtyWzFdXSxxPVtbIm1hdHJpeCIsW3JbMl1dXV07YnJlYWt9aj1pKHMpLHU9d1sxXSh1KSx2PXhbMV0odil9Zm9yKHZhciB5PVtdLHo9W10sQT1bXSxCPTA7Qjx1Lmxlbmd0aDtCKyspe3ZhciBDPSJudW1iZXIiPT10eXBlb2YgdVtCXT9hLm1lcmdlTnVtYmVyczphLm1lcmdlRGltZW5zaW9ucyxyPUModVtCXSx2W0JdKTt5W0JdPXJbMF0seltCXT1yWzFdLEEucHVzaChyWzJdKX1vLnB1c2goeSkscC5wdXNoKHopLHEucHVzaChbaixBXSl9fWlmKGUpe3ZhciBEPW87bz1wLHA9RH1yZXR1cm5bbyxwLGZ1bmN0aW9uKGEpe3JldHVybiBhLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPWEubWFwKGZ1bmN0aW9uKGEsYyl7cmV0dXJuIHFbYl1bMV1bY10oYSl9KS5qb2luKCIsIik7cmV0dXJuIm1hdHJpeCI9PXFbYl1bMF0mJjE2PT1jLnNwbGl0KCIsIikubGVuZ3RoJiYocVtiXVswXT0ibWF0cml4M2QiKSxxW2JdWzBdKyIoIitjKyIpIn0pLmpvaW4oIiAiKX1dfXZhciBrPW51bGwsbD17cHg6MH0sbT17ZGVnOjB9LG49e21hdHJpeDpbIk5OTk5OTiIsW2ssaywwLDAsayxrLDAsMCwwLDAsMSwwLGssaywwLDFdLGRdLG1hdHJpeDNkOlsiTk5OTk5OTk5OTk5OTk5OTiIsZF0scm90YXRlOlsiQSJdLHJvdGF0ZXg6WyJBIl0scm90YXRleTpbIkEiXSxyb3RhdGV6OlsiQSJdLHJvdGF0ZTNkOlsiTk5OQSJdLHBlcnNwZWN0aXZlOlsiTCJdLHNjYWxlOlsiTm4iLGMoW2ssaywxXSksZF0sc2NhbGV4OlsiTiIsYyhbaywxLDFdKSxjKFtrLDFdKV0sc2NhbGV5OlsiTiIsYyhbMSxrLDFdKSxjKFsxLGtdKV0sc2NhbGV6OlsiTiIsYyhbMSwxLGtdKV0sc2NhbGUzZDpbIk5OTiIsZF0sc2tldzpbIkFhIixudWxsLGRdLHNrZXd4OlsiQSIsbnVsbCxjKFtrLG1dKV0sc2tld3k6WyJBIixudWxsLGMoW20sa10pXSx0cmFuc2xhdGU6WyJUdCIsYyhbayxrLGxdKSxkXSx0cmFuc2xhdGV4OlsiVCIsYyhbayxsLGxdKSxjKFtrLGxdKV0sdHJhbnNsYXRleTpbIlQiLGMoW2wsayxsXSksYyhbbCxrXSldLHRyYW5zbGF0ZXo6WyJMIixjKFtsLGwsa10pXSx0cmFuc2xhdGUzZDpbIlRUTCIsZF19O2EuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxqLFsidHJhbnNmb3JtIl0pfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2IuY29uY2F0KFthXSkuZm9yRWFjaChmdW5jdGlvbihiKXtiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSYmKGRbYV09Yil9KX12YXIgZD17fTtjKCJ0cmFuc2Zvcm0iLFsid2Via2l0VHJhbnNmb3JtIiwibXNUcmFuc2Zvcm0iXSksYygidHJhbnNmb3JtT3JpZ2luIixbIndlYmtpdFRyYW5zZm9ybU9yaWdpbiJdKSxjKCJwZXJzcGVjdGl2ZSIsWyJ3ZWJraXRQZXJzcGVjdGl2ZSJdKSxjKCJwZXJzcGVjdGl2ZU9yaWdpbiIsWyJ3ZWJraXRQZXJzcGVjdGl2ZU9yaWdpbiJdKSxhLnByb3BlcnR5TmFtZT1mdW5jdGlvbihhKXtyZXR1cm4gZFthXXx8YX19KGQsZil9KCksIWZ1bmN0aW9uKCl7aWYodm9pZCAwPT09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikuYW5pbWF0ZShbXSkub25jYW5jZWwpe3ZhciBhO2lmKHdpbmRvdy5wZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93KXZhciBhPWZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTtlbHNlIHZhciBhPWZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9O3ZhciBiPWZ1bmN0aW9uKGEsYixjKXt0aGlzLnRhcmdldD1hLHRoaXMuY3VycmVudFRpbWU9Yix0aGlzLnRpbWVsaW5lVGltZT1jLHRoaXMudHlwZT0iY2FuY2VsIix0aGlzLmJ1YmJsZXM9ITEsdGhpcy5jYW5jZWxhYmxlPSExLHRoaXMuY3VycmVudFRhcmdldD1hLHRoaXMuZGVmYXVsdFByZXZlbnRlZD0hMSx0aGlzLmV2ZW50UGhhc2U9RXZlbnQuQVRfVEFSR0VULHRoaXMudGltZVN0YW1wPURhdGUubm93KCl9LGM9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU7d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oZCxlKXt2YXIgZj1jLmNhbGwodGhpcyxkLGUpO2YuX2NhbmNlbEhhbmRsZXJzPVtdLGYub25jYW5jZWw9bnVsbDt2YXIgZz1mLmNhbmNlbDtmLmNhbmNlbD1mdW5jdGlvbigpe2cuY2FsbCh0aGlzKTt2YXIgYz1uZXcgYih0aGlzLG51bGwsYSgpKSxkPXRoaXMuX2NhbmNlbEhhbmRsZXJzLmNvbmNhdCh0aGlzLm9uY2FuY2VsP1t0aGlzLm9uY2FuY2VsXTpbXSk7c2V0VGltZW91dChmdW5jdGlvbigpe2QuZm9yRWFjaChmdW5jdGlvbihhKXthLmNhbGwoYy50YXJnZXQsYyl9KX0sMCl9O3ZhciBoPWYuYWRkRXZlbnRMaXN0ZW5lcjtmLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiKXsiZnVuY3Rpb24iPT10eXBlb2YgYiYmImNhbmNlbCI9PWE/dGhpcy5fY2FuY2VsSGFuZGxlcnMucHVzaChiKTpoLmNhbGwodGhpcyxhLGIpfTt2YXIgaT1mLnJlbW92ZUV2ZW50TGlzdGVuZXI7cmV0dXJuIGYucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpe2lmKCJjYW5jZWwiPT1hKXt2YXIgYz10aGlzLl9jYW5jZWxIYW5kbGVycy5pbmRleE9mKGIpO2M+PTAmJnRoaXMuX2NhbmNlbEhhbmRsZXJzLnNwbGljZShjLDEpfWVsc2UgaS5jYWxsKHRoaXMsYSxiKX0sZn19fSgpLGZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxjPW51bGwsZD0hMTt0cnl7dmFyIGU9Z2V0Q29tcHV0ZWRTdHlsZShiKS5nZXRQcm9wZXJ0eVZhbHVlKCJvcGFjaXR5IiksZj0iMCI9PWU/IjEiOiIwIjtjPWIuYW5pbWF0ZSh7b3BhY2l0eTpbZixmXX0se2R1cmF0aW9uOjF9KSxjLmN1cnJlbnRUaW1lPTAsZD1nZXRDb21wdXRlZFN0eWxlKGIpLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKT09Zn1jYXRjaChnKXt9ZmluYWxseXtjJiZjLmNhbmNlbCgpfWlmKCFkKXt2YXIgaD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihiLGMpe3JldHVybiB3aW5kb3cuU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3ImJkFycmF5LnByb3RvdHlwZS5mcm9tJiZiW1N5bWJvbC5pdGVyYXRvcl0mJihiPUFycmF5LmZyb20oYikpLEFycmF5LmlzQXJyYXkoYil8fG51bGw9PT1ifHwoYj1hLmNvbnZlcnRUb0FycmF5Rm9ybShiKSksaC5jYWxsKHRoaXMsYixjKX19fShjKSwhZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9d2luZG93LmRvY3VtZW50LnRpbWVsaW5lO2IuY3VycmVudFRpbWU9YSxiLl9kaXNjYXJkQW5pbWF0aW9ucygpLDA9PWIuX2FuaW1hdGlvbnMubGVuZ3RoP2Y9ITE6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGQpOwp9dmFyIGU9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBlKGZ1bmN0aW9uKGIpe3dpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksYShiKSx3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpfSl9LGIuQW5pbWF0aW9uVGltZWxpbmU9ZnVuY3Rpb24oKXt0aGlzLl9hbmltYXRpb25zPVtdLHRoaXMuY3VycmVudFRpbWU9dm9pZCAwfSxiLkFuaW1hdGlvblRpbWVsaW5lLnByb3RvdHlwZT17Z2V0QW5pbWF0aW9uczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNjYXJkQW5pbWF0aW9ucygpLHRoaXMuX2FuaW1hdGlvbnMuc2xpY2UoKX0sX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlczpmdW5jdGlvbigpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLl91cGRhdGVQcm9taXNlcygpfSl9LF9kaXNjYXJkQW5pbWF0aW9uczpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbnM9dGhpcy5fYW5pbWF0aW9ucy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImZpbmlzaGVkIiE9YS5wbGF5U3RhdGUmJiJpZGxlIiE9YS5wbGF5U3RhdGV9KX0sX3BsYXk6ZnVuY3Rpb24oYSl7dmFyIGM9bmV3IGIuQW5pbWF0aW9uKGEsdGhpcyk7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbnMucHVzaChjKSxiLnJlc3RhcnRXZWJBbmltYXRpb25zTmV4dFRpY2soKSxjLl91cGRhdGVQcm9taXNlcygpLGMuX2FuaW1hdGlvbi5wbGF5KCksYy5fdXBkYXRlUHJvbWlzZXMoKSxjfSxwbGF5OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLnJlbW92ZSgpLHRoaXMuX3BsYXkoYSl9fTt2YXIgZj0hMTtiLnJlc3RhcnRXZWJBbmltYXRpb25zTmV4dFRpY2s9ZnVuY3Rpb24oKXtmfHwoZj0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCkpfTt2YXIgZz1uZXcgYi5BbmltYXRpb25UaW1lbGluZTtiLnRpbWVsaW5lPWc7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuZG9jdW1lbnQsInRpbWVsaW5lIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBnfX0pfWNhdGNoKGgpe310cnl7d2luZG93LmRvY3VtZW50LnRpbWVsaW5lPWd9Y2F0Y2goaCl7fX0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXM9W10sYi5BbmltYXRpb249ZnVuY3Rpb24oYixjKXtpZih0aGlzLmlkPSIiLGImJmIuX2lkJiYodGhpcy5pZD1iLl9pZCksdGhpcy5lZmZlY3Q9YixiJiYoYi5fYW5pbWF0aW9uPXRoaXMpLCFjKXRocm93IG5ldyBFcnJvcigiQW5pbWF0aW9uIHdpdGggbnVsbCB0aW1lbGluZSBpcyBub3Qgc3VwcG9ydGVkIik7dGhpcy5fdGltZWxpbmU9Yyx0aGlzLl9zZXF1ZW5jZU51bWJlcj1hLnNlcXVlbmNlTnVtYmVyKyssdGhpcy5faG9sZFRpbWU9MCx0aGlzLl9wYXVzZWQ9ITEsdGhpcy5faXNHcm91cD0hMSx0aGlzLl9hbmltYXRpb249bnVsbCx0aGlzLl9jaGlsZEFuaW1hdGlvbnM9W10sdGhpcy5fY2FsbGJhY2s9bnVsbCx0aGlzLl9vbGRQbGF5U3RhdGU9ImlkbGUiLHRoaXMuX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGIuQW5pbWF0aW9uLnByb3RvdHlwZT17X3VwZGF0ZVByb21pc2VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fb2xkUGxheVN0YXRlLGI9dGhpcy5wbGF5U3RhdGU7cmV0dXJuIHRoaXMuX3JlYWR5UHJvbWlzZSYmYiE9PWEmJigiaWRsZSI9PWI/KHRoaXMuX3JlamVjdFJlYWR5UHJvbWlzZSgpLHRoaXMuX3JlYWR5UHJvbWlzZT12b2lkIDApOiJwZW5kaW5nIj09YT90aGlzLl9yZXNvbHZlUmVhZHlQcm9taXNlKCk6InBlbmRpbmciPT1iJiYodGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCkpLHRoaXMuX2ZpbmlzaGVkUHJvbWlzZSYmYiE9PWEmJigiaWRsZSI9PWI/KHRoaXMuX3JlamVjdEZpbmlzaGVkUHJvbWlzZSgpLHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApOiJmaW5pc2hlZCI9PWI/dGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpOiJmaW5pc2hlZCI9PWEmJih0aGlzLl9maW5pc2hlZFByb21pc2U9dm9pZCAwKSksdGhpcy5fb2xkUGxheVN0YXRlPXRoaXMucGxheVN0YXRlLHRoaXMuX3JlYWR5UHJvbWlzZXx8dGhpcy5fZmluaXNoZWRQcm9taXNlfSxfcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpO3ZhciBhLGMsZCxlLGY9ISF0aGlzLl9hbmltYXRpb247ZiYmKGE9dGhpcy5wbGF5YmFja1JhdGUsYz10aGlzLl9wYXVzZWQsZD10aGlzLnN0YXJ0VGltZSxlPXRoaXMuY3VycmVudFRpbWUsdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX2FuaW1hdGlvbi5fd3JhcHBlcj1udWxsLHRoaXMuX2FuaW1hdGlvbj1udWxsKSwoIXRoaXMuZWZmZWN0fHx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5LZXlmcmFtZUVmZmVjdCkmJih0aGlzLl9hbmltYXRpb249Yi5uZXdVbmRlcmx5aW5nQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcy5lZmZlY3QpLGIuYmluZEFuaW1hdGlvbkZvcktleWZyYW1lRWZmZWN0KHRoaXMpKSwodGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yR3JvdXAodGhpcykpLHRoaXMuZWZmZWN0JiZ0aGlzLmVmZmVjdC5fb25zYW1wbGUmJmIuYmluZEFuaW1hdGlvbkZvckN1c3RvbUVmZmVjdCh0aGlzKSxmJiYoMSE9YSYmKHRoaXMucGxheWJhY2tSYXRlPWEpLG51bGwhPT1kP3RoaXMuc3RhcnRUaW1lPWQ6bnVsbCE9PWU/dGhpcy5jdXJyZW50VGltZT1lOm51bGwhPT10aGlzLl9ob2xkVGltZSYmKHRoaXMuY3VycmVudFRpbWU9dGhpcy5faG9sZFRpbWUpLGMmJnRoaXMucGF1c2UoKSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sX3VwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKCl7aWYodGhpcy5lZmZlY3QmJiJpZGxlIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBhPXRoaXMuZWZmZWN0Ll90aW1pbmcuZGVsYXk7dGhpcy5fY2hpbGRBbmltYXRpb25zLmZvckVhY2goZnVuY3Rpb24oYyl7dGhpcy5fYXJyYW5nZUNoaWxkcmVuKGMsYSksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihhKz1iLmdyb3VwQ2hpbGREdXJhdGlvbihjLmVmZmVjdCkpfS5iaW5kKHRoaXMpKX19LF9zZXRFeHRlcm5hbEFuaW1hdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmVmZmVjdCYmdGhpcy5faXNHcm91cClmb3IodmFyIGI9MDtiPHRoaXMuZWZmZWN0LmNoaWxkcmVuLmxlbmd0aDtiKyspdGhpcy5lZmZlY3QuY2hpbGRyZW5bYl0uX2FuaW1hdGlvbj1hLHRoaXMuX2NoaWxkQW5pbWF0aW9uc1tiXS5fc2V0RXh0ZXJuYWxBbmltYXRpb24oYSl9LF9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmdGhpcy5faXNHcm91cCl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9yZW1vdmVDaGlsZEFuaW1hdGlvbnMoKSx0aGlzLmVmZmVjdC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPXdpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fcGxheShjKTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMucHVzaChkKSxkLnBsYXliYWNrUmF0ZT10aGlzLnBsYXliYWNrUmF0ZSx0aGlzLl9wYXVzZWQmJmQucGF1c2UoKSxjLl9hbmltYXRpb249dGhpcy5lZmZlY3QuX2FuaW1hdGlvbix0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oZCxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMpKX0uYmluZCh0aGlzKSl9fSxfYXJyYW5nZUNoaWxkcmVuOmZ1bmN0aW9uKGEsYil7bnVsbD09PXRoaXMuc3RhcnRUaW1lP2EuY3VycmVudFRpbWU9dGhpcy5jdXJyZW50VGltZS1iL3RoaXMucGxheWJhY2tSYXRlOmEuc3RhcnRUaW1lIT09dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSYmKGEuc3RhcnRUaW1lPXRoaXMuc3RhcnRUaW1lK2IvdGhpcy5wbGF5YmFja1JhdGUpfSxnZXQgdGltZWxpbmUoKXtyZXR1cm4gdGhpcy5fdGltZWxpbmV9LGdldCBwbGF5U3RhdGUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uP3RoaXMuX2FuaW1hdGlvbi5wbGF5U3RhdGU6ImlkbGUifSxnZXQgZmluaXNoZWQoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX2ZpbmlzaGVkUHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fZmluaXNoZWRQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdEZpbmlzaGVkUHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksImZpbmlzaGVkIj09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVGaW5pc2hlZFByb21pc2UoKSksdGhpcy5fZmluaXNoZWRQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IHJlYWR5KCl7cmV0dXJuIHdpbmRvdy5Qcm9taXNlPyh0aGlzLl9yZWFkeVByb21pc2V8fCgtMT09Yi5hbmltYXRpb25zV2l0aFByb21pc2VzLmluZGV4T2YodGhpcykmJmIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5wdXNoKHRoaXMpLHRoaXMuX3JlYWR5UHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGIpe3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2U9ZnVuY3Rpb24oKXthKHRoaXMpfSx0aGlzLl9yZWplY3RSZWFkeVByb21pc2U9ZnVuY3Rpb24oKXtiKHt0eXBlOkRPTUV4Y2VwdGlvbi5BQk9SVF9FUlIsbmFtZToiQWJvcnRFcnJvciJ9KX19LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9PXRoaXMucGxheVN0YXRlJiZ0aGlzLl9yZXNvbHZlUmVhZHlQcm9taXNlKCkpLHRoaXMuX3JlYWR5UHJvbWlzZSk6KGNvbnNvbGUud2FybigiQW5pbWF0aW9uIFByb21pc2VzIHJlcXVpcmUgSmF2YVNjcmlwdCBQcm9taXNlIGNvbnN0cnVjdG9yIiksbnVsbCl9LGdldCBvbmZpbmlzaCgpe3JldHVybiB0aGlzLl9hbmltYXRpb24ub25maW5pc2h9LHNldCBvbmZpbmlzaChhKXsiZnVuY3Rpb24iPT10eXBlb2YgYT90aGlzLl9hbmltYXRpb24ub25maW5pc2g9ZnVuY3Rpb24oYil7Yi50YXJnZXQ9dGhpcyxhLmNhbGwodGhpcyxiKX0uYmluZCh0aGlzKTp0aGlzLl9hbmltYXRpb24ub25maW5pc2g9YX0sZ2V0IG9uY2FuY2VsKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5vbmNhbmNlbH0sc2V0IG9uY2FuY2VsKGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBhP3RoaXMuX2FuaW1hdGlvbi5vbmNhbmNlbD1mdW5jdGlvbihiKXtiLnRhcmdldD10aGlzLGEuY2FsbCh0aGlzLGIpfS5iaW5kKHRoaXMpOnRoaXMuX2FuaW1hdGlvbi5vbmNhbmNlbD1hfSxnZXQgY3VycmVudFRpbWUoKXt0aGlzLl91cGRhdGVQcm9taXNlcygpO3ZhciBhPXRoaXMuX2FuaW1hdGlvbi5jdXJyZW50VGltZTtyZXR1cm4gdGhpcy5fdXBkYXRlUHJvbWlzZXMoKSxhfSxzZXQgY3VycmVudFRpbWUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uY3VycmVudFRpbWU9aXNGaW5pdGUoYSk/YTpNYXRoLnNpZ24oYSkqTnVtYmVyLk1BWF9WQUxVRSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihiLGMpe2IuY3VycmVudFRpbWU9YS1jfSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sZ2V0IHN0YXJ0VGltZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb24uc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLnN0YXJ0VGltZT1pc0Zpbml0ZShhKT9hOk1hdGguc2lnbihhKSpOdW1iZXIuTUFYX1ZBTFVFLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIsYyl7Yi5zdGFydFRpbWU9YStjfSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb24ucGxheWJhY2tSYXRlfSxzZXQgcGxheWJhY2tSYXRlKGEpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGI9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucGxheWJhY2tSYXRlPWEsdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIpe2IucGxheWJhY2tSYXRlPWF9KSwicGF1c2VkIiE9dGhpcy5wbGF5U3RhdGUmJiJpZGxlIiE9dGhpcy5wbGF5U3RhdGUmJnRoaXMucGxheSgpLG51bGwhPT1iJiYodGhpcy5jdXJyZW50VGltZT1iKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9wYXVzZWQ9ITEsdGhpcy5fYW5pbWF0aW9uLnBsYXkoKSwtMT09dGhpcy5fdGltZWxpbmUuX2FuaW1hdGlvbnMuaW5kZXhPZih0aGlzKSYmdGhpcy5fdGltZWxpbmUuX2FuaW1hdGlvbnMucHVzaCh0aGlzKSx0aGlzLl9yZWdpc3RlcigpLGIuYXdhaXRTdGFydFRpbWUodGhpcyksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe3ZhciBiPWEuY3VycmVudFRpbWU7YS5wbGF5KCksYS5jdXJyZW50VGltZT1ifSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuY3VycmVudFRpbWUmJih0aGlzLl9ob2xkVGltZT10aGlzLmN1cnJlbnRUaW1lKSx0aGlzLl9hbmltYXRpb24ucGF1c2UoKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnBhdXNlKCl9KSx0aGlzLl9wYXVzZWQ9ITAsdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sZmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uZmluaXNoKCksdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5jYW5jZWwoKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHJldmVyc2U6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpO3ZhciBhPXRoaXMuY3VycmVudFRpbWU7dGhpcy5fYW5pbWF0aW9uLnJldmVyc2UoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7YS5yZXZlcnNlKCl9KSxudWxsIT09YSYmKHRoaXMuY3VycmVudFRpbWU9YSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIpe3ZhciBjPWI7ImZ1bmN0aW9uIj09dHlwZW9mIGImJihjPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PXRoaXMsYi5jYWxsKHRoaXMsYSl9LmJpbmQodGhpcyksYi5fd3JhcHBlcj1jKSx0aGlzLl9hbmltYXRpb24uYWRkRXZlbnRMaXN0ZW5lcihhLGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dGhpcy5fYW5pbWF0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxiJiZiLl93cmFwcGVyfHxiKX0sX3JlbW92ZUNoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2Zvcig7dGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDspdGhpcy5fY2hpbGRBbmltYXRpb25zLnBvcCgpLmNhbmNlbCgpfSxfZm9yRWFjaENoaWxkOmZ1bmN0aW9uKGIpe3ZhciBjPTA7aWYodGhpcy5lZmZlY3QuY2hpbGRyZW4mJnRoaXMuX2NoaWxkQW5pbWF0aW9ucy5sZW5ndGg8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoJiZ0aGlzLl9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnMoKSx0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihhKXtiLmNhbGwodGhpcyxhLGMpLHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0JiYoYys9YS5lZmZlY3QuYWN0aXZlRHVyYXRpb24pfS5iaW5kKHRoaXMpKSwicGVuZGluZyIhPXRoaXMucGxheVN0YXRlKXt2YXIgZD10aGlzLmVmZmVjdC5fdGltaW5nLGU9dGhpcy5jdXJyZW50VGltZTtudWxsIT09ZSYmKGU9YS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihkKSxlLGQpKSwobnVsbD09ZXx8aXNOYU4oZSkpJiZ0aGlzLl9yZW1vdmVDaGlsZEFuaW1hdGlvbnMoKX19fSx3aW5kb3cuQW5pbWF0aW9uPWIuQW5pbWF0aW9ufShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dGhpcy5fZnJhbWVzPWEubm9ybWFsaXplS2V5ZnJhbWVzKGIpfWZ1bmN0aW9uIGUoKXtmb3IodmFyIGE9ITE7aS5sZW5ndGg7KXt2YXIgYj1pLnNoaWZ0KCk7Yi5fdXBkYXRlQ2hpbGRyZW4oKSxhPSEwfXJldHVybiBhfXZhciBmPWZ1bmN0aW9uKGEpe2lmKGEuX2FuaW1hdGlvbj12b2lkIDAsYSBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8YSBpbnN0YW5jZW9mIHdpbmRvdy5Hcm91cEVmZmVjdClmb3IodmFyIGI9MDtiPGEuY2hpbGRyZW4ubGVuZ3RoO2IrKylmKGEuY2hpbGRyZW5bYl0pfTtiLnJlbW92ZU11bHRpPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107ZC5fcGFyZW50PygtMT09Yi5pbmRleE9mKGQuX3BhcmVudCkmJmIucHVzaChkLl9wYXJlbnQpLGQuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoZC5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoZCksMSksZC5fcGFyZW50PW51bGwsZihkKSk6ZC5fYW5pbWF0aW9uJiZkLl9hbmltYXRpb24uZWZmZWN0PT1kJiYoZC5fYW5pbWF0aW9uLmNhbmNlbCgpLGQuX2FuaW1hdGlvbi5lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KG51bGwsW10pLGQuX2FuaW1hdGlvbi5fY2FsbGJhY2smJihkLl9hbmltYXRpb24uX2NhbGxiYWNrLl9hbmltYXRpb249bnVsbCksZC5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpLGYoZCkpfWZvcihjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5fcmVidWlsZCgpfSxiLktleWZyYW1lRWZmZWN0PWZ1bmN0aW9uKGIsYyxlLGYpe3JldHVybiB0aGlzLnRhcmdldD1iLHRoaXMuX3BhcmVudD1udWxsLGU9YS5udW1lcmljVGltaW5nVG9PYmplY3QoZSksdGhpcy5fdGltaW5nSW5wdXQ9YS5jbG9uZVRpbWluZ0lucHV0KGUpLHRoaXMuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGUpLHRoaXMudGltaW5nPWEubWFrZVRpbWluZyhlLCExLHRoaXMpLHRoaXMudGltaW5nLl9lZmZlY3Q9dGhpcywiZnVuY3Rpb24iPT10eXBlb2YgYz8oYS5kZXByZWNhdGVkKCJDdXN0b20gS2V5ZnJhbWVFZmZlY3QiLCIyMDE1LTA2LTIyIiwiVXNlIEtleWZyYW1lRWZmZWN0Lm9uc2FtcGxlIGluc3RlYWQuIiksdGhpcy5fbm9ybWFsaXplZEtleWZyYW1lcz1jKTp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPW5ldyBkKGMpLHRoaXMuX2tleWZyYW1lcz1jLHRoaXMuYWN0aXZlRHVyYXRpb249YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbih0aGlzLl90aW1pbmcpLHRoaXMuX2lkPWYsdGhpc30sYi5LZXlmcmFtZUVmZmVjdC5wcm90b3R5cGU9e2dldEZyYW1lczpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzP3RoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM6dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lcy5fZnJhbWVzfSxzZXQgb25zYW1wbGUoYSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZ2V0RnJhbWVzKCkpdGhyb3cgbmV3IEVycm9yKCJTZXR0aW5nIG9uc2FtcGxlIG9uIGN1c3RvbSBlZmZlY3QgS2V5ZnJhbWVFZmZlY3QgaXMgbm90IHN1cHBvcnRlZC4iKTt0aGlzLl9vbnNhbXBsZT1hLHRoaXMuX2FuaW1hdGlvbiYmdGhpcy5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpfSxnZXQgcGFyZW50KCl7cmV0dXJuIHRoaXMuX3BhcmVudH0sY2xvbmU6ZnVuY3Rpb24oKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIkNsb25pbmcgY3VzdG9tIGVmZmVjdHMgaXMgbm90IHN1cHBvcnRlZC4iKTt2YXIgYj1uZXcgS2V5ZnJhbWVFZmZlY3QodGhpcy50YXJnZXQsW10sYS5jbG9uZVRpbWluZ0lucHV0KHRoaXMuX3RpbWluZ0lucHV0KSx0aGlzLl9pZCk7cmV0dXJuIGIuX25vcm1hbGl6ZWRLZXlmcmFtZXM9dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lcyxiLl9rZXlmcmFtZXM9dGhpcy5fa2V5ZnJhbWVzLGJ9LHJlbW92ZTpmdW5jdGlvbigpe2IucmVtb3ZlTXVsdGkoW3RoaXNdKX19O3ZhciBnPUVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU7RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihhLGMpe3ZhciBkPSIiO3JldHVybiBjJiZjLmlkJiYoZD1jLmlkKSxiLnRpbWVsaW5lLl9wbGF5KG5ldyBiLktleWZyYW1lRWZmZWN0KHRoaXMsYSxjLGQpKX07dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2Iik7Yi5uZXdVbmRlcmx5aW5nQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9YS50YXJnZXR8fGgsYz1hLl9rZXlmcmFtZXM7ImZ1bmN0aW9uIj09dHlwZW9mIGMmJihjPVtdKTt2YXIgZD1hLl90aW1pbmdJbnB1dDtkLmlkPWEuX2lkfWVsc2UgdmFyIGI9aCxjPVtdLGQ9MDtyZXR1cm4gZy5hcHBseShiLFtjLGRdKX0sYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYSl7YS5lZmZlY3QmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmVmZmVjdC5fbm9ybWFsaXplZEtleWZyYW1lcyYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KGEpfTt2YXIgaT1bXTtiLmF3YWl0U3RhcnRUaW1lPWZ1bmN0aW9uKGEpe251bGw9PT1hLnN0YXJ0VGltZSYmYS5faXNHcm91cCYmKDA9PWkubGVuZ3RoJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSksaS5wdXNoKGEpKX07dmFyIGo9d2luZG93LmdldENvbXB1dGVkU3R5bGU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywiZ2V0Q29tcHV0ZWRTdHlsZSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKTt2YXIgYT1qLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZSgpJiYoYT1qLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksd2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSxhfX0pLHdpbmRvdy5LZXlmcmFtZUVmZmVjdD1iLktleWZyYW1lRWZmZWN0LHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBbmltYXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LnRpbWVsaW5lLmdldEFuaW1hdGlvbnMoKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hLmVmZmVjdCYmYS5lZmZlY3QudGFyZ2V0PT10aGlzfS5iaW5kKHRoaXMpKX19KGMsZSxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXthLl9yZWdpc3RlcmVkfHwoYS5fcmVnaXN0ZXJlZD0hMCxnLnB1c2goYSksaHx8KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKSl9ZnVuY3Rpb24gZShhKXt2YXIgYj1nO2c9W10sYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuX3NlcXVlbmNlTnVtYmVyLWIuX3NlcXVlbmNlTnVtYmVyfSksYj1iLmZpbHRlcihmdW5jdGlvbihhKXthKCk7dmFyIGI9YS5fYW5pbWF0aW9uP2EuX2FuaW1hdGlvbi5wbGF5U3RhdGU6ImlkbGUiO3JldHVybiJydW5uaW5nIiE9YiYmInBlbmRpbmciIT1iJiYoYS5fcmVnaXN0ZXJlZD0hMSksYS5fcmVnaXN0ZXJlZH0pLGcucHVzaC5hcHBseShnLGIpLGcubGVuZ3RoPyhoPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShlKSk6aD0hMX12YXIgZj0oZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IiksMCk7Yi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0PWZ1bmN0aW9uKGIpe3ZhciBjLGU9Yi5lZmZlY3QudGFyZ2V0LGc9ImZ1bmN0aW9uIj09dHlwZW9mIGIuZWZmZWN0LmdldEZyYW1lcygpO2M9Zz9iLmVmZmVjdC5nZXRGcmFtZXMoKTpiLmVmZmVjdC5fb25zYW1wbGU7dmFyIGg9Yi5lZmZlY3QudGltaW5nLGk9bnVsbDtoPWEubm9ybWFsaXplVGltaW5nSW5wdXQoaCk7dmFyIGo9ZnVuY3Rpb24oKXt2YXIgZD1qLl9hbmltYXRpb24/ai5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lOm51bGw7bnVsbCE9PWQmJihkPWEuY2FsY3VsYXRlVGltZUZyYWN0aW9uKGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oaCksZCxoKSxpc05hTihkKSYmKGQ9bnVsbCkpLGQhPT1pJiYoZz9jKGQsZSxiLmVmZmVjdCk6YyhkLGIuZWZmZWN0LGIuZWZmZWN0Ll9hbmltYXRpb24pKSxpPWR9O2ouX2FuaW1hdGlvbj1iLGouX3JlZ2lzdGVyZWQ9ITEsai5fc2VxdWVuY2VOdW1iZXI9ZisrLGIuX2NhbGxiYWNrPWosZChqKX07dmFyIGc9W10saD0hMTtiLkFuaW1hdGlvbi5wcm90b3R5cGUuX3JlZ2lzdGVyPWZ1bmN0aW9uKCl7dGhpcy5fY2FsbGJhY2smJmQodGhpcy5fY2FsbGJhY2spfX0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLl90aW1pbmcuZGVsYXkrYS5hY3RpdmVEdXJhdGlvbithLl90aW1pbmcuZW5kRGVsYXl9ZnVuY3Rpb24gZShiLGMsZCl7dGhpcy5faWQ9ZCx0aGlzLl9wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPWJ8fFtdLHRoaXMuX3JlcGFyZW50KHRoaXMuY2hpbGRyZW4pLGM9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYyksdGhpcy5fdGltaW5nSW5wdXQ9YS5jbG9uZVRpbWluZ0lucHV0KGMpLHRoaXMuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGMsITApLHRoaXMudGltaW5nPWEubWFrZVRpbWluZyhjLCEwLHRoaXMpLHRoaXMudGltaW5nLl9lZmZlY3Q9dGhpcywiYXV0byI9PT10aGlzLl90aW1pbmcuZHVyYXRpb24mJih0aGlzLl90aW1pbmcuZHVyYXRpb249dGhpcy5hY3RpdmVEdXJhdGlvbil9d2luZG93LlNlcXVlbmNlRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHdpbmRvdy5Hcm91cEVmZmVjdD1mdW5jdGlvbigpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZT17X2lzQW5jZXN0b3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXM7bnVsbCE9PWI7KXtpZihiPT1hKXJldHVybiEwO2I9Yi5fcGFyZW50fXJldHVybiExfSxfcmVidWlsZDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzO2E7KSJhdXRvIj09PWEudGltaW5nLmR1cmF0aW9uJiYoYS5fdGltaW5nLmR1cmF0aW9uPWEuYWN0aXZlRHVyYXRpb24pLGE9YS5fcGFyZW50O3RoaXMuX2FuaW1hdGlvbiYmdGhpcy5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpfSxfcmVwYXJlbnQ6ZnVuY3Rpb24oYSl7Yi5yZW1vdmVNdWx0aShhKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLl9wYXJlbnQ9dGhpc30sX3B1dENoaWxkOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWI/IkNhbm5vdCBhcHBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiI6IkNhbm5vdCBwcmVwZW5kIGFuIGFuY2VzdG9yIG9yIHNlbGYiLGQ9MDtkPGEubGVuZ3RoO2QrKylpZih0aGlzLl9pc0FuY2VzdG9yKGFbZF0pKXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUixuYW1lOiJIaWVyYXJjaHlSZXF1ZXN0RXJyb3IiLG1lc3NhZ2U6Y307Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYj90aGlzLmNoaWxkcmVuLnB1c2goYVtkXSk6dGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFbZF0pO3RoaXMuX3JlcGFyZW50KGEpLHRoaXMuX3JlYnVpbGQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCEwKX0scHJlcGVuZDpmdW5jdGlvbigpe3RoaXMuX3B1dENoaWxkKGFyZ3VtZW50cywhMSl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxnZXQgZmlyc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuWzBdOm51bGx9LGdldCBsYXN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg/dGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aC0xXTpudWxsfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgYj1hLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLGM9W10sZD0wO2Q8dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZCsrKWMucHVzaCh0aGlzLmNoaWxkcmVuW2RdLmNsb25lKCkpO3JldHVybiB0aGlzIGluc3RhbmNlb2YgR3JvdXBFZmZlY3Q/bmV3IEdyb3VwRWZmZWN0KGMsYik6bmV3IFNlcXVlbmNlRWZmZWN0KGMsYil9LHJlbW92ZTpmdW5jdGlvbigpe2IucmVtb3ZlTXVsdGkoW3RoaXNdKX19LHdpbmRvdy5TZXF1ZW5jZUVmZmVjdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5TZXF1ZW5jZUVmZmVjdC5wcm90b3R5cGUsImFjdGl2ZUR1cmF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2ErPWQoYil9KSxNYXRoLm1heChhLDApfX0pLHdpbmRvdy5Hcm91cEVmZmVjdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5Hcm91cEVmZmVjdC5wcm90b3R5cGUsImFjdGl2ZUR1cmF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2E9TWF0aC5tYXgoYSxkKGIpKX0pLGF9fSksYi5uZXdVbmRlcmx5aW5nQW5pbWF0aW9uRm9yR3JvdXA9ZnVuY3Rpb24oYyl7dmFyIGQsZT1udWxsLGY9ZnVuY3Rpb24oYil7dmFyIGM9ZC5fd3JhcHBlcjtyZXR1cm4gYyYmInBlbmRpbmciIT1jLnBsYXlTdGF0ZSYmYy5lZmZlY3Q/bnVsbD09Yj92b2lkIGMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpOjA9PWImJmMucGxheWJhY2tSYXRlPDAmJihlfHwoZT1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGMuZWZmZWN0LnRpbWluZykpLGI9YS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihlKSwtMSxlKSxpc05hTihiKXx8bnVsbD09Yik/KGMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLmN1cnJlbnRUaW1lPS0xfSksdm9pZCBjLl9yZW1vdmVDaGlsZEFuaW1hdGlvbnMoKSk6dm9pZCAwOnZvaWQgMH0sZz1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSxjLl90aW1pbmcsYy5faWQpO3JldHVybiBnLm9uc2FtcGxlPWYsZD1iLnRpbWVsaW5lLl9wbGF5KGcpfSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihhKXthLl9hbmltYXRpb24uX3dyYXBwZXI9YSxhLl9pc0dyb3VwPSEwLGIuYXdhaXRTdGFydFRpbWUoYSksYS5fY29uc3RydWN0Q2hpbGRBbmltYXRpb25zKCksYS5fc2V0RXh0ZXJuYWxBbmltYXRpb24oYSl9LGIuZ3JvdXBDaGlsZER1cmF0aW9uPWR9KGMsZSxmKSxiWyJ0cnVlIl09YX0oe30sZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKSk7CgovKioKQGxpY2Vuc2UgQG5vY29tcGlsZQpDb3B5cmlnaHQgKGMpIDIwMTggVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dApDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwpzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwooZnVuY3Rpb24oKXsvKgoKIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBuLHA9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdz09PXRoaXM/dGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmbnVsbCE9Z2xvYmFsP2dsb2JhbDp0aGlzLGFhPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oYSxiLGMpe2EhPUFycmF5LnByb3RvdHlwZSYmYSE9T2JqZWN0LnByb3RvdHlwZSYmKGFbYl09Yy52YWx1ZSl9O2Z1bmN0aW9uIGJhKCl7YmE9ZnVuY3Rpb24oKXt9O3AuU3ltYm9sfHwocC5TeW1ib2w9Y2EpfXZhciBjYT1mdW5jdGlvbigpe3ZhciBhPTA7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiJqc2NvbXBfc3ltYm9sXyIrKGJ8fCIiKSthKyt9fSgpOwpmdW5jdGlvbiBkYSgpe2JhKCk7dmFyIGE9cC5TeW1ib2wuaXRlcmF0b3I7YXx8KGE9cC5TeW1ib2wuaXRlcmF0b3I9cC5TeW1ib2woIml0ZXJhdG9yIikpOyJmdW5jdGlvbiIhPXR5cGVvZiBBcnJheS5wcm90b3R5cGVbYV0mJmFhKEFycmF5LnByb3RvdHlwZSxhLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZWEodGhpcyl9fSk7ZGE9ZnVuY3Rpb24oKXt9fWZ1bmN0aW9uIGVhKGEpe3ZhciBiPTA7cmV0dXJuIGZhKGZ1bmN0aW9uKCl7cmV0dXJuIGI8YS5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6YVtiKytdfTp7ZG9uZTohMH19KX1mdW5jdGlvbiBmYShhKXtkYSgpO2E9e25leHQ6YX07YVtwLlN5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307cmV0dXJuIGF9ZnVuY3Rpb24gaWEoYSl7ZGEoKTt2YXIgYj1hW1N5bWJvbC5pdGVyYXRvcl07cmV0dXJuIGI/Yi5jYWxsKGEpOmVhKGEpfQpmdW5jdGlvbiBqYShhKXtmb3IodmFyIGIsYz1bXTshKGI9YS5uZXh0KCkpLmRvbmU7KWMucHVzaChiLnZhbHVlKTtyZXR1cm4gY30KKGZ1bmN0aW9uKCl7aWYoIWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7YS5pbml0RXZlbnQoImZvbyIsITAsITApO2EucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYS5kZWZhdWx0UHJldmVudGVkfSgpKXt2YXIgYT1FdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ7RXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxhYmxlJiYoYS5jYWxsKHRoaXMpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJkZWZhdWx0UHJldmVudGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LGNvbmZpZ3VyYWJsZTohMH0pKX19dmFyIGI9L1RyaWRlbnQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoIXdpbmRvdy5DdXN0b21FdmVudHx8YiYmImZ1bmN0aW9uIiE9PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQpd2luZG93LkN1c3RvbUV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKTsKYy5pbml0Q3VzdG9tRXZlbnQoYSwhIWIuYnViYmxlcywhIWIuY2FuY2VsYWJsZSxiLmRldGFpbCk7cmV0dXJuIGN9LHdpbmRvdy5DdXN0b21FdmVudC5wcm90b3R5cGU9d2luZG93LkV2ZW50LnByb3RvdHlwZTtpZighd2luZG93LkV2ZW50fHxiJiYiZnVuY3Rpb24iIT09dHlwZW9mIHdpbmRvdy5FdmVudCl7dmFyIGM9d2luZG93LkV2ZW50O3dpbmRvdy5FdmVudD1mdW5jdGlvbihhLGIpe2I9Ynx8e307dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7Yy5pbml0RXZlbnQoYSwhIWIuYnViYmxlcywhIWIuY2FuY2VsYWJsZSk7cmV0dXJuIGN9O2lmKGMpZm9yKHZhciBkIGluIGMpd2luZG93LkV2ZW50W2RdPWNbZF07d2luZG93LkV2ZW50LnByb3RvdHlwZT1jLnByb3RvdHlwZX1pZighd2luZG93Lk1vdXNlRXZlbnR8fGImJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93Lk1vdXNlRXZlbnQpe2I9d2luZG93Lk1vdXNlRXZlbnQ7d2luZG93Lk1vdXNlRXZlbnQ9ZnVuY3Rpb24oYSwKYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudCIpO2MuaW5pdE1vdXNlRXZlbnQoYSwhIWIuYnViYmxlcywhIWIuY2FuY2VsYWJsZSxiLnZpZXd8fHdpbmRvdyxiLmRldGFpbCxiLnNjcmVlblgsYi5zY3JlZW5ZLGIuY2xpZW50WCxiLmNsaWVudFksYi5jdHJsS2V5LGIuYWx0S2V5LGIuc2hpZnRLZXksYi5tZXRhS2V5LGIuYnV0dG9uLGIucmVsYXRlZFRhcmdldCk7cmV0dXJuIGN9O2lmKGIpZm9yKGQgaW4gYil3aW5kb3cuTW91c2VFdmVudFtkXT1iW2RdO3dpbmRvdy5Nb3VzZUV2ZW50LnByb3RvdHlwZT1iLnByb3RvdHlwZX1BcnJheS5mcm9tfHwoQXJyYXkuZnJvbT1mdW5jdGlvbihhKXtyZXR1cm5bXS5zbGljZS5jYWxsKGEpfSk7T2JqZWN0LmFzc2lnbnx8KE9iamVjdC5hc3NpZ249ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZD0wLGU7ZDxjLmxlbmd0aDtkKyspaWYoZT1jW2RdKWZvcih2YXIgZj0KYSxtPWUscT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtKSx4PTA7eDxxLmxlbmd0aDt4KyspZT1xW3hdLGZbZV09bVtlXTtyZXR1cm4gYX0pfSkod2luZG93LldlYkNvbXBvbmVudHMpOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt9ZnVuY3Rpb24gYihhLGIpe2lmKCFhLmNoaWxkTm9kZXMubGVuZ3RoKXJldHVybltdO3N3aXRjaChhLm5vZGVUeXBlKXtjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERTpyZXR1cm4gdWEuY2FsbChhLGIpO2Nhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOnJldHVybiBsYi5jYWxsKGEsYik7ZGVmYXVsdDpyZXR1cm4gVS5jYWxsKGEsYil9fXZhciBjPSJ1bmRlZmluZWQiPT09dHlwZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQsZD0hKGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5jbG9uZU5vZGUoKWluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCksZT0hMTsvVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKHZhciBkO2Q9YS5maXJzdENoaWxkOyljLmNhbGwodGhpcyxkLGIpO2Vsc2UgYy5jYWxsKHRoaXMsCmEsYik7cmV0dXJuIGF9ZT0hMDt2YXIgYj1Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGU7Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPWZ1bmN0aW9uKGEpe2E9Yi5jYWxsKHRoaXMsYSk7dGhpcyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQmJihhLl9fcHJvdG9fXz1Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSk7cmV0dXJuIGF9O0RvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw9SFRNTEVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3Rvcj1IVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvcjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx7bm9kZVR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREV9LGNvbmZpZ3VyYWJsZTohMH0sbG9jYWxOYW1lOntnZXQ6ZnVuY3Rpb24oKXt9LApjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iI2RvY3VtZW50LWZyYWdtZW50In0sY29uZmlndXJhYmxlOiEwfX0pO3ZhciBjPU5vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZTtOb2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9YTt2YXIgZD1Ob2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZDtOb2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZD1mdW5jdGlvbihiKXtiIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudD9hLmNhbGwodGhpcyxiLG51bGwpOmQuY2FsbCh0aGlzLGIpO3JldHVybiBifTt2YXIgZj1Ob2RlLnByb3RvdHlwZS5yZW1vdmVDaGlsZCxnPU5vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZDtOb2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24oYixjKXtiIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudD8oYS5jYWxsKHRoaXMsYixjKSxmLmNhbGwodGhpcyxjKSk6Zy5jYWxsKHRoaXMsYixjKTtyZXR1cm4gY307RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ9CmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jcmVhdGVFbGVtZW50KCJkZiIpO2EuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO3JldHVybiBhfTt2YXIgaD1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZTtEb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZT1mdW5jdGlvbihhLGIpe2I9aC5jYWxsKHRoaXMsYSxifHwhMSk7YSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQmJihiLl9fcHJvdG9fXz1Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSk7cmV0dXJuIGJ9fSgpO3ZhciBmPU5vZGUucHJvdG90eXBlLmNsb25lTm9kZSxnPURvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50LGg9RG9jdW1lbnQucHJvdG90eXBlLmltcG9ydE5vZGUsaz1Ob2RlLnByb3RvdHlwZS5yZW1vdmVDaGlsZCxsPU5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkLG09Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkLHE9RE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmcsCng9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKXx8e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuaW5uZXJIVE1MPWF9fSxNPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93Lk5vZGUucHJvdG90eXBlLCJjaGlsZE5vZGVzIil8fHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzfX0sVT1FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLHVhPURvY3VtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLGxiPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsbWI9ZnVuY3Rpb24oKXtpZighYyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKSxiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7Yi5jb250ZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTsKYS5jb250ZW50LmFwcGVuZENoaWxkKGIpO2E9YS5jbG9uZU5vZGUoITApO3JldHVybiAwPT09YS5jb250ZW50LmNoaWxkTm9kZXMubGVuZ3RofHwwPT09YS5jb250ZW50LmZpcnN0Q2hpbGQuY29udGVudC5jaGlsZE5vZGVzLmxlbmd0aHx8ZH19KCk7aWYoYyl7dmFyIFM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJ0ZW1wbGF0ZSIpLEM9ITAsVj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO1YudGV4dENvbnRlbnQ9InRlbXBsYXRle2Rpc3BsYXk6bm9uZTt9Ijt2YXIgaGE9ZG9jdW1lbnQuaGVhZDtoYS5pbnNlcnRCZWZvcmUoVixoYS5maXJzdEVsZW1lbnRDaGlsZCk7YS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShIVE1MRWxlbWVudC5wcm90b3R5cGUpO3ZhciB2YT0hZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikuaGFzT3duUHJvcGVydHkoImlubmVySFRNTCIpO2EuRz1mdW5jdGlvbihiKXtpZighYi5jb250ZW50JiZiLm5hbWVzcGFjZVVSST09PQpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJKXtiLmNvbnRlbnQ9Uy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Zm9yKHZhciBjO2M9Yi5maXJzdENoaWxkOylsLmNhbGwoYi5jb250ZW50LGMpO2lmKHZhKWIuX19wcm90b19fPWEucHJvdG90eXBlO2Vsc2UgaWYoYi5jbG9uZU5vZGU9ZnVuY3Rpb24oYil7cmV0dXJuIGEuYSh0aGlzLGIpfSxDKXRyeXtQKGIpLFcoYil9Y2F0Y2goVGcpe0M9ITF9YS5DKGIuY29udGVudCl9fTt2YXIgWD17b3B0aW9uOlsic2VsZWN0Il0sdGhlYWQ6WyJ0YWJsZSJdLGNvbDpbImNvbGdyb3VwIiwidGFibGUiXSx0cjpbInRib2R5IiwidGFibGUiXSx0aDpbInRyIiwidGJvZHkiLCJ0YWJsZSJdLHRkOlsidHIiLCJ0Ym9keSIsInRhYmxlIl19LFA9ZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGIsImlubmVySFRNTCIse2dldDpmdW5jdGlvbigpe3JldHVybiBuYih0aGlzKX0sc2V0OmZ1bmN0aW9uKGIpe3ZhciBjPVhbKC88KFthLXpdW14vXDA+XHgyMFx0XHJcblxmXSspL2kuZXhlYyhiKXx8ClsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldO2lmKGMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspYj0iPCIrY1tkXSsiPiIrYisiPC8iK2NbZF0rIj4iO1MuYm9keS5pbm5lckhUTUw9Yjtmb3IoYS5DKFMpO3RoaXMuY29udGVudC5maXJzdENoaWxkOylrLmNhbGwodGhpcy5jb250ZW50LHRoaXMuY29udGVudC5maXJzdENoaWxkKTtiPVMuYm9keTtpZihjKWZvcihkPTA7ZDxjLmxlbmd0aDtkKyspYj1iLmxhc3RDaGlsZDtmb3IoO2IuZmlyc3RDaGlsZDspbC5jYWxsKHRoaXMuY29udGVudCxiLmZpcnN0Q2hpbGQpfSxjb25maWd1cmFibGU6ITB9KX0sVz1mdW5jdGlvbihhKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwib3V0ZXJIVE1MIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjx0ZW1wbGF0ZT4iK3RoaXMuaW5uZXJIVE1MKyI8L3RlbXBsYXRlPiJ9LHNldDpmdW5jdGlvbihhKXtpZih0aGlzLnBhcmVudE5vZGUpe1MuYm9keS5pbm5lckhUTUw9YTtmb3IoYT10aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1MuYm9keS5maXJzdENoaWxkOylsLmNhbGwoYSwKUy5ib2R5LmZpcnN0Q2hpbGQpO20uY2FsbCh0aGlzLnBhcmVudE5vZGUsYSx0aGlzKX1lbHNlIHRocm93IEVycm9yKCJGYWlsZWQgdG8gc2V0IHRoZSAnb3V0ZXJIVE1MJyBwcm9wZXJ0eSBvbiAnRWxlbWVudCc6IFRoaXMgZWxlbWVudCBoYXMgbm8gcGFyZW50IG5vZGUuIik7fSxjb25maWd1cmFibGU6ITB9KX07UChhLnByb3RvdHlwZSk7VyhhLnByb3RvdHlwZSk7YS5DPWZ1bmN0aW9uKGMpe2M9YihjLCJ0ZW1wbGF0ZSIpO2Zvcih2YXIgZD0wLGU9Yy5sZW5ndGgsZjtkPGUmJihmPWNbZF0pO2QrKylhLkcoZil9O2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGZ1bmN0aW9uKCl7YS5DKGRvY3VtZW50KX0pO0RvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIGI9Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7InRlbXBsYXRlIj09PWIubG9jYWxOYW1lJiZhLkcoYik7cmV0dXJuIGJ9O0RPTVBhcnNlci5wcm90b3R5cGUucGFyc2VGcm9tU3RyaW5nPQpmdW5jdGlvbigpe3ZhciBiPXEuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EuQyhiKTtyZXR1cm4gYn07T2JqZWN0LmRlZmluZVByb3BlcnR5KEhUTUxFbGVtZW50LnByb3RvdHlwZSwiaW5uZXJIVE1MIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5iKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYil7eC5zZXQuY2FsbCh0aGlzLGIpO2EuQyh0aGlzKX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KTt2YXIgVmU9L1smXHUwMEEwIl0vZyx5Yz0vWyZcdTAwQTA8Pl0vZyx6Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAiJiI6cmV0dXJuIiZhbXA7IjtjYXNlICI8IjpyZXR1cm4iJmx0OyI7Y2FzZSAiPiI6cmV0dXJuIiZndDsiO2Nhc2UgJyInOnJldHVybiImcXVvdDsiO2Nhc2UgIlx1MDBhMCI6cmV0dXJuIiZuYnNwOyJ9fTtWPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxjPTA7YzxhLmxlbmd0aDtjKyspYlthW2NdXT0hMDtyZXR1cm4gYn07dmFyIFdlPVYoImFyZWEgYmFzZSBiciBjb2wgY29tbWFuZCBlbWJlZCBociBpbWcgaW5wdXQga2V5Z2VuIGxpbmsgbWV0YSBwYXJhbSBzb3VyY2UgdHJhY2sgd2JyIi5zcGxpdCgiICIpKSwKWGU9Vigic3R5bGUgc2NyaXB0IHhtcCBpZnJhbWUgbm9lbWJlZCBub2ZyYW1lcyBwbGFpbnRleHQgbm9zY3JpcHQiLnNwbGl0KCIgIikpLG5iPWZ1bmN0aW9uKGEsYil7InRlbXBsYXRlIj09PWEubG9jYWxOYW1lJiYoYT1hLmNvbnRlbnQpO2Zvcih2YXIgYz0iIixkPWI/YihhKTpNLmdldC5jYWxsKGEpLGU9MCxmPWQubGVuZ3RoLGc7ZTxmJiYoZz1kW2VdKTtlKyspe2E6e3ZhciBoPWc7dmFyIGs9YTt2YXIgbD1iO3N3aXRjaChoLm5vZGVUeXBlKXtjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOmZvcih2YXIgUD1oLmxvY2FsTmFtZSxtPSI8IitQLFc9aC5hdHRyaWJ1dGVzLHE9MDtrPVdbcV07cSsrKW0rPSIgIitrLm5hbWUrJz0iJytrLnZhbHVlLnJlcGxhY2UoVmUsemMpKyciJzttKz0iPiI7aD1XZVtQXT9tOm0rbmIoaCxsKSsiPC8iK1ArIj4iO2JyZWFrIGE7Y2FzZSBOb2RlLlRFWFRfTk9ERTpoPWguZGF0YTtoPWsmJlhlW2subG9jYWxOYW1lXT9oOmgucmVwbGFjZSh5Yyx6Yyk7YnJlYWsgYTsKY2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpoPSJceDNjIS0tIitoLmRhdGErIi0tXHgzZSI7YnJlYWsgYTtkZWZhdWx0OnRocm93IHdpbmRvdy5jb25zb2xlLmVycm9yKGgpLEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTt9fWMrPWh9cmV0dXJuIGN9fWlmKGN8fG1iKXthLmE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1mLmNhbGwoYSwhMSk7dGhpcy5HJiZ0aGlzLkcoYyk7YiYmKGwuY2FsbChjLmNvbnRlbnQsZi5jYWxsKGEuY29udGVudCwhMCkpLG9iKGMuY29udGVudCxhLmNvbnRlbnQpKTtyZXR1cm4gY307dmFyIG9iPWZ1bmN0aW9uKGMsZCl7aWYoZC5xdWVyeVNlbGVjdG9yQWxsJiYoZD1iKGQsInRlbXBsYXRlIiksMCE9PWQubGVuZ3RoKSl7Yz1iKGMsInRlbXBsYXRlIik7Zm9yKHZhciBlPTAsZj1jLmxlbmd0aCxnLGg7ZTxmO2UrKyloPWRbZV0sZz1jW2VdLGEmJmEuRyYmYS5HKGgpLG0uY2FsbChnLnBhcmVudE5vZGUsWWUuY2FsbChoLCEwKSxnKX19LFllPU5vZGUucHJvdG90eXBlLmNsb25lTm9kZT0KZnVuY3Rpb24oYil7aWYoIWUmJmQmJnRoaXMgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWlmKGIpdmFyIGM9WmUuY2FsbCh0aGlzLm93bmVyRG9jdW1lbnQsdGhpcywhMCk7ZWxzZSByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtlbHNlIHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmInRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lJiZ0aGlzLm5hbWVzcGFjZVVSST09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST9jPWEuYSh0aGlzLGIpOmM9Zi5jYWxsKHRoaXMsYik7YiYmb2IoYyx0aGlzKTtyZXR1cm4gY30sWmU9RG9jdW1lbnQucHJvdG90eXBlLmltcG9ydE5vZGU9ZnVuY3Rpb24oYyxkKXtkPWR8fCExO2lmKCJ0ZW1wbGF0ZSI9PT1jLmxvY2FsTmFtZSlyZXR1cm4gYS5hKGMsZCk7dmFyIGU9aC5jYWxsKHRoaXMsYyxkKTtpZihkKXtvYihlLGMpO2M9YihlLCdzY3JpcHQ6bm90KFt0eXBlXSksc2NyaXB0W3R5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0idGV4dC9qYXZhc2NyaXB0Il0nKTsKZm9yKHZhciBmLGs9MDtrPGMubGVuZ3RoO2srKyl7Zj1jW2tdO2Q9Zy5jYWxsKGRvY3VtZW50LCJzY3JpcHQiKTtkLnRleHRDb250ZW50PWYudGV4dENvbnRlbnQ7Zm9yKHZhciBsPWYuYXR0cmlidXRlcyxQPTAsVztQPGwubGVuZ3RoO1ArKylXPWxbUF0sZC5zZXRBdHRyaWJ1dGUoVy5uYW1lLFcudmFsdWUpO20uY2FsbChmLnBhcmVudE5vZGUsZCxmKX19cmV0dXJuIGV9fWMmJih3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudD1hKX0pKCk7dmFyIGthPXNldFRpbWVvdXQ7ZnVuY3Rpb24gbGEoKXt9ZnVuY3Rpb24gbWEoYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXthLmFwcGx5KGIsYXJndW1lbnRzKX19ZnVuY3Rpb24gcihhKXtpZighKHRoaXMgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJQcm9taXNlcyBtdXN0IGJlIGNvbnN0cnVjdGVkIHZpYSBuZXciKTtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGEpdGhyb3cgbmV3IFR5cGVFcnJvcigibm90IGEgZnVuY3Rpb24iKTt0aGlzLnU9MDt0aGlzLm1hPSExO3RoaXMuaD12b2lkIDA7dGhpcy5JPVtdO25hKGEsdGhpcyl9CmZ1bmN0aW9uIG9hKGEsYil7Zm9yKDszPT09YS51OylhPWEuaDswPT09YS51P2EuSS5wdXNoKGIpOihhLm1hPSEwLHBhKGZ1bmN0aW9uKCl7dmFyIGM9MT09PWEudT9iLk5hOmIuT2E7aWYobnVsbD09PWMpKDE9PT1hLnU/cWE6cmEpKGIuZ2EsYS5oKTtlbHNle3RyeXt2YXIgZD1jKGEuaCl9Y2F0Y2goZSl7cmEoYi5nYSxlKTtyZXR1cm59cWEoYi5nYSxkKX19KSl9ZnVuY3Rpb24gcWEoYSxiKXt0cnl7aWYoYj09PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi4iKTtpZihiJiYoIm9iamVjdCI9PT10eXBlb2YgYnx8ImZ1bmN0aW9uIj09PXR5cGVvZiBiKSl7dmFyIGM9Yi50aGVuO2lmKGIgaW5zdGFuY2VvZiByKXthLnU9MzthLmg9YjtzYShhKTtyZXR1cm59aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBjKXtuYShtYShjLGIpLGEpO3JldHVybn19YS51PTE7YS5oPWI7c2EoYSl9Y2F0Y2goZCl7cmEoYSxkKX19CmZ1bmN0aW9uIHJhKGEsYil7YS51PTI7YS5oPWI7c2EoYSl9ZnVuY3Rpb24gc2EoYSl7Mj09PWEudSYmMD09PWEuSS5sZW5ndGgmJnBhKGZ1bmN0aW9uKCl7YS5tYXx8InVuZGVmaW5lZCIhPT10eXBlb2YgY29uc29sZSYmY29uc29sZSYmY29uc29sZS53YXJuKCJQb3NzaWJsZSBVbmhhbmRsZWQgUHJvbWlzZSBSZWplY3Rpb246IixhLmgpfSk7Zm9yKHZhciBiPTAsYz1hLkkubGVuZ3RoO2I8YztiKyspb2EoYSxhLklbYl0pO2EuST1udWxsfWZ1bmN0aW9uIHRhKGEsYixjKXt0aGlzLk5hPSJmdW5jdGlvbiI9PT10eXBlb2YgYT9hOm51bGw7dGhpcy5PYT0iZnVuY3Rpb24iPT09dHlwZW9mIGI/YjpudWxsO3RoaXMuZ2E9Y31mdW5jdGlvbiBuYShhLGIpe3ZhciBjPSExO3RyeXthKGZ1bmN0aW9uKGEpe2N8fChjPSEwLHFhKGIsYSkpfSxmdW5jdGlvbihhKXtjfHwoYz0hMCxyYShiLGEpKX0pfWNhdGNoKGQpe2N8fChjPSEwLHJhKGIsZCkpfX0Kci5wcm90b3R5cGVbImNhdGNoIl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudGhlbihudWxsLGEpfTtyLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHRoaXMuY29uc3RydWN0b3IobGEpO29hKHRoaXMsbmV3IHRhKGEsYixjKSk7cmV0dXJuIGN9O3IucHJvdG90eXBlWyJmaW5hbGx5Il09ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGMpe3JldHVybiBiLnJlc29sdmUoYSgpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGN9KX0sZnVuY3Rpb24oYyl7cmV0dXJuIGIucmVzb2x2ZShhKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gYi5yZWplY3QoYyl9KX0pfTsKZnVuY3Rpb24gd2EoYSl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKGIsYyl7ZnVuY3Rpb24gZChhLGcpe3RyeXtpZihnJiYoIm9iamVjdCI9PT10eXBlb2YgZ3x8ImZ1bmN0aW9uIj09PXR5cGVvZiBnKSl7dmFyIGg9Zy50aGVuO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgaCl7aC5jYWxsKGcsZnVuY3Rpb24oYil7ZChhLGIpfSxjKTtyZXR1cm59fWVbYV09ZzswPT09LS1mJiZiKGUpfWNhdGNoKG0pe2MobSl9fWlmKCFhfHwidW5kZWZpbmVkIj09PXR5cGVvZiBhLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJQcm9taXNlLmFsbCBhY2NlcHRzIGFuIGFycmF5Iik7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSk7aWYoMD09PWUubGVuZ3RoKXJldHVybiBiKFtdKTtmb3IodmFyIGY9ZS5sZW5ndGgsZz0wO2c8ZS5sZW5ndGg7ZysrKWQoZyxlW2ddKX0pfQpmdW5jdGlvbiB4YShhKXtyZXR1cm4gYSYmIm9iamVjdCI9PT10eXBlb2YgYSYmYS5jb25zdHJ1Y3Rvcj09PXI/YTpuZXcgcihmdW5jdGlvbihiKXtiKGEpfSl9ZnVuY3Rpb24geWEoYSl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKGIsYyl7YyhhKX0pfWZ1bmN0aW9uIHphKGEpe3JldHVybiBuZXcgcihmdW5jdGlvbihiLGMpe2Zvcih2YXIgZD0wLGU9YS5sZW5ndGg7ZDxlO2QrKylhW2RdLnRoZW4oYixjKX0pfXZhciBwYT0iZnVuY3Rpb24iPT09dHlwZW9mIHNldEltbWVkaWF0ZSYmZnVuY3Rpb24oYSl7c2V0SW1tZWRpYXRlKGEpfXx8ZnVuY3Rpb24oYSl7a2EoYSwwKX07LyoKCkNvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCmlmKCF3aW5kb3cuUHJvbWlzZSl7d2luZG93LlByb21pc2U9cjtyLnByb3RvdHlwZS50aGVuPXIucHJvdG90eXBlLnRoZW47ci5hbGw9d2E7ci5yYWNlPXphO3IucmVzb2x2ZT14YTtyLnJlamVjdD15YTt2YXIgQWE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpLEJhPVtdOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe2Zvcih2YXIgYT1CYS5sZW5ndGgsYj0wO2I8YTtiKyspQmFbYl0oKTtCYS5zcGxpY2UoMCxhKX0pKS5vYnNlcnZlKEFhLHtjaGFyYWN0ZXJEYXRhOiEwfSk7cGE9ZnVuY3Rpb24oYSl7QmEucHVzaChhKTtBYS50ZXh0Q29udGVudD0wPEFhLnRleHRDb250ZW50Lmxlbmd0aD8iIjoiYSJ9fTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50KXJldHVybiBuZXcgQ3VzdG9tRXZlbnQoYSxiKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKTtjLmluaXRDdXN0b21FdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIuZGV0YWlsKTtyZXR1cm4gY31mdW5jdGlvbiBjKGEpe2lmKE0pcmV0dXJuIGEub3duZXJEb2N1bWVudCE9PWRvY3VtZW50P2Eub3duZXJEb2N1bWVudDpudWxsO3ZhciBiPWEuX19pbXBvcnREb2M7aWYoIWImJmEucGFyZW50Tm9kZSl7Yj1hLnBhcmVudE5vZGU7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBiLmNsb3Nlc3QpYj1iLmNsb3Nlc3QoImxpbmtbcmVsPWltcG9ydF0iKTtlbHNlIGZvcig7IWgoYikmJihiPWIucGFyZW50Tm9kZSk7KTthLl9faW1wb3J0RG9jPWJ9cmV0dXJuIGJ9ZnVuY3Rpb24gZChhKXt2YXIgYj1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdOm5vdChbaW1wb3J0LWRlcGVuZGVuY3ldKSIpLApjPWIubGVuZ3RoO2M/cShiLGZ1bmN0aW9uKGIpe3JldHVybiBnKGIsZnVuY3Rpb24oKXswPT09LS1jJiZhKCl9KX0pOmEoKX1mdW5jdGlvbiBlKGEpe2Z1bmN0aW9uIGIoKXsibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlJiZkb2N1bWVudC5ib2R5JiYoZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsYiksYSgpKX1kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixiKTtiKCl9ZnVuY3Rpb24gZihhKXtlKGZ1bmN0aW9uKCl7cmV0dXJuIGQoZnVuY3Rpb24oKXtyZXR1cm4gYSYmYSgpfSl9KX1mdW5jdGlvbiBnKGEsYil7aWYoYS5fX2xvYWRlZCliJiZiKCk7ZWxzZSBpZigic2NyaXB0Ij09PWEubG9jYWxOYW1lJiYhYS5zcmN8fCJzdHlsZSI9PT1hLmxvY2FsTmFtZSYmIWEuZmlyc3RDaGlsZClhLl9fbG9hZGVkPSEwLGImJmIoKTtlbHNle3ZhciBjPWZ1bmN0aW9uKGQpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLnR5cGUsCmMpO2EuX19sb2FkZWQ9ITA7YiYmYigpfTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGMpO2hhJiYic3R5bGUiPT09YS5sb2NhbE5hbWV8fGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGMpfX1mdW5jdGlvbiBoKGEpe3JldHVybiBhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJiJsaW5rIj09PWEubG9jYWxOYW1lJiYiaW1wb3J0Ij09PWEucmVsfWZ1bmN0aW9uIGsoKXt2YXIgYT10aGlzO3RoaXMuYT17fTt0aGlzLmI9MDt0aGlzLmM9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGEuSmEoYil9KTt0aGlzLmMub2JzZXJ2ZShkb2N1bWVudC5oZWFkLHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO3RoaXMubG9hZEltcG9ydHMoZG9jdW1lbnQpfWZ1bmN0aW9uIGwoYSl7cShtKGEsInRlbXBsYXRlIiksZnVuY3Rpb24oYSl7cShtKGEuY29udGVudCwnc2NyaXB0Om5vdChbdHlwZV0pLHNjcmlwdFt0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9InRleHQvamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJtb2R1bGUiXScpLApmdW5jdGlvbihhKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtxKGEuYXR0cmlidXRlcyxmdW5jdGlvbihhKXtyZXR1cm4gYi5zZXRBdHRyaWJ1dGUoYS5uYW1lLGEudmFsdWUpfSk7Yi50ZXh0Q29udGVudD1hLnRleHRDb250ZW50O2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYixhKX0pO2woYS5jb250ZW50KX0pfWZ1bmN0aW9uIG0oYSxiKXtyZXR1cm4gYS5jaGlsZE5vZGVzLmxlbmd0aD9hLnF1ZXJ5U2VsZWN0b3JBbGwoYik6VX1mdW5jdGlvbiBxKGEsYixjKXt2YXIgZD1hP2EubGVuZ3RoOjAsZT1jPy0xOjE7Zm9yKGM9Yz9kLTE6MDtjPGQmJjA8PWM7Yys9ZSliKGFbY10sYyl9dmFyIHg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpLE09ImltcG9ydCJpbiB4LFU9eC5xdWVyeVNlbGVjdG9yQWxsKCIqIiksdWE9bnVsbDshMT09PSJjdXJyZW50U2NyaXB0ImluIGRvY3VtZW50JiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsImN1cnJlbnRTY3JpcHQiLAp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHVhfHwoImNvbXBsZXRlIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZG9jdW1lbnQuc2NyaXB0c1tkb2N1bWVudC5zY3JpcHRzLmxlbmd0aC0xXTpudWxsKX0sY29uZmlndXJhYmxlOiEwfSk7dmFyIGxiPS8odXJsXCgpKFteKV0qKShcKSkvZyxtYj0vKEBpbXBvcnRbXHNdKyg/IXVybFwoKSkoW147XSopKDspL2csUz0vKDxsaW5rW14+XSopKHJlbD1bJ3wiXT9zdHlsZXNoZWV0Wyd8Il0/W14+XSo+KS9nLEM9e0VhOmZ1bmN0aW9uKGEsYil7YS5ocmVmJiZhLnNldEF0dHJpYnV0ZSgiaHJlZiIsQy5YKGEuZ2V0QXR0cmlidXRlKCJocmVmIiksYikpO2Euc3JjJiZhLnNldEF0dHJpYnV0ZSgic3JjIixDLlgoYS5nZXRBdHRyaWJ1dGUoInNyYyIpLGIpKTtpZigic3R5bGUiPT09YS5sb2NhbE5hbWUpe3ZhciBjPUMucWEoYS50ZXh0Q29udGVudCxiLGxiKTthLnRleHRDb250ZW50PUMucWEoYyxiLG1iKX19LHFhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS5yZXBsYWNlKGMsCmZ1bmN0aW9uKGEsYyxkLGUpe2E9ZC5yZXBsYWNlKC9bIiddL2csIiIpO2ImJihhPUMuWChhLGIpKTtyZXR1cm4gYysiJyIrYSsiJyIrZX0pfSxYOmZ1bmN0aW9uKGEsYil7aWYodm9pZCAwPT09Qy5hYSl7Qy5hYT0hMTt0cnl7dmFyIGM9bmV3IFVSTCgiYiIsImh0dHA6Ly9hIik7Yy5wYXRobmFtZT0iYyUyMGQiO0MuYWE9Imh0dHA6Ly9hL2MlMjBkIj09PWMuaHJlZn1jYXRjaCh5Yyl7fX1pZihDLmFhKXJldHVybihuZXcgVVJMKGEsYikpLmhyZWY7Yz1DLnhhO2N8fChjPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgidGVtcCIpLEMueGE9YyxjLmphPWMuY3JlYXRlRWxlbWVudCgiYmFzZSIpLGMuaGVhZC5hcHBlbmRDaGlsZChjLmphKSxjLmlhPWMuY3JlYXRlRWxlbWVudCgiYSIpKTtjLmphLmhyZWY9YjtjLmlhLmhyZWY9YTtyZXR1cm4gYy5pYS5ocmVmfHxhfX0sVj17YXN5bmM6ITAsbG9hZDpmdW5jdGlvbihhLGIsYyl7aWYoYSlpZihhLm1hdGNoKC9eZGF0YTovKSl7YT0KYS5zcGxpdCgiLCIpO3ZhciBkPWFbMV07ZD0tMTxhWzBdLmluZGV4T2YoIjtiYXNlNjQiKT9hdG9iKGQpOmRlY29kZVVSSUNvbXBvbmVudChkKTtiKGQpfWVsc2V7dmFyIGU9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub3BlbigiR0VUIixhLFYuYXN5bmMpO2Uub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ZS5yZXNwb25zZVVSTHx8ZS5nZXRSZXNwb25zZUhlYWRlcigiTG9jYXRpb24iKTthJiYwPT09YS5pbmRleE9mKCIvIikmJihhPShsb2NhdGlvbi5vcmlnaW58fGxvY2F0aW9uLnByb3RvY29sKyIvLyIrbG9jYXRpb24uaG9zdCkrYSk7dmFyIGQ9ZS5yZXNwb25zZXx8ZS5yZXNwb25zZVRleHQ7MzA0PT09ZS5zdGF0dXN8fDA9PT1lLnN0YXR1c3x8MjAwPD1lLnN0YXR1cyYmMzAwPmUuc3RhdHVzP2IoZCxhKTpjKGQpfTtlLnNlbmQoKX1lbHNlIGMoImVycm9yOiBocmVmIG11c3QgYmUgc3BlY2lmaWVkIil9fSxoYT0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8L0VkZ2VcL1xkLi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CmsucHJvdG90eXBlLmxvYWRJbXBvcnRzPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT1tKGEsImxpbmtbcmVsPWltcG9ydF0iKTtxKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIuZyhhKX0pfTtrLnByb3RvdHlwZS5nPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1hLmhyZWY7aWYodm9pZCAwIT09dGhpcy5hW2NdKXt2YXIgZD10aGlzLmFbY107ZCYmZC5fX2xvYWRlZCYmKGEuX19pbXBvcnQ9ZCx0aGlzLmYoYSkpfWVsc2UgdGhpcy5iKyssdGhpcy5hW2NdPSJwZW5kaW5nIixWLmxvYWQoYyxmdW5jdGlvbihhLGQpe2E9Yi5LYShhLGR8fGMpO2IuYVtjXT1hO2IuYi0tO2IubG9hZEltcG9ydHMoYSk7Yi5sKCl9LGZ1bmN0aW9uKCl7Yi5hW2NdPW51bGw7Yi5iLS07Yi5sKCl9KX07ay5wcm90b3R5cGUuS2E9ZnVuY3Rpb24oYSxiKXtpZighYSlyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2hhJiYoYT1hLnJlcGxhY2UoUyxmdW5jdGlvbihhLGIsYyl7cmV0dXJuLTE9PT0KYS5pbmRleE9mKCJ0eXBlPSIpP2IrIiB0eXBlPWltcG9ydC1kaXNhYmxlICIrYzphfSkpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7Yy5pbm5lckhUTUw9YTtpZihjLmNvbnRlbnQpYT1jLmNvbnRlbnQsbChhKTtlbHNlIGZvcihhPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtjLmZpcnN0Q2hpbGQ7KWEuYXBwZW5kQ2hpbGQoYy5maXJzdENoaWxkKTtpZihjPWEucXVlcnlTZWxlY3RvcigiYmFzZSIpKWI9Qy5YKGMuZ2V0QXR0cmlidXRlKCJocmVmIiksYiksYy5yZW1vdmVBdHRyaWJ1dGUoImhyZWYiKTtjPW0oYSwnbGlua1tyZWw9aW1wb3J0XSxsaW5rW3JlbD1zdHlsZXNoZWV0XVtocmVmXVt0eXBlPWltcG9ydC1kaXNhYmxlXSxzdHlsZTpub3QoW3R5cGVdKSxsaW5rW3JlbD1zdHlsZXNoZWV0XVtocmVmXTpub3QoW3R5cGVdKSxzY3JpcHQ6bm90KFt0eXBlXSksc2NyaXB0W3R5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0idGV4dC9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9Im1vZHVsZSJdJyk7CnZhciBkPTA7cShjLGZ1bmN0aW9uKGEpe2coYSk7Qy5FYShhLGIpO2Euc2V0QXR0cmlidXRlKCJpbXBvcnQtZGVwZW5kZW5jeSIsIiIpO2lmKCJzY3JpcHQiPT09YS5sb2NhbE5hbWUmJiFhLnNyYyYmYS50ZXh0Q29udGVudCl7aWYoIm1vZHVsZSI9PT1hLnR5cGUpdGhyb3cgRXJyb3IoIklubGluZSBtb2R1bGUgc2NyaXB0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiBIVE1MIEltcG9ydHMuIik7YS5zZXRBdHRyaWJ1dGUoInNyYyIsImRhdGE6dGV4dC9qYXZhc2NyaXB0O2NoYXJzZXQ9dXRmLTgsIitlbmNvZGVVUklDb21wb25lbnQoYS50ZXh0Q29udGVudCsoIlxuLy8jIHNvdXJjZVVSTD0iK2IrKGQ/Ii0iK2Q6IiIpKyIuanNcbiIpKSk7YS50ZXh0Q29udGVudD0iIjtkKyt9fSk7cmV0dXJuIGF9O2sucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2lmKCF0aGlzLmIpe3RoaXMuYy5kaXNjb25uZWN0KCk7dGhpcy5mbGF0dGVuKGRvY3VtZW50KTt2YXIgYj0hMSxjPSExLGQ9ZnVuY3Rpb24oKXtjJiYKYiYmKGEubG9hZEltcG9ydHMoZG9jdW1lbnQpLGEuYnx8KGEuYy5vYnNlcnZlKGRvY3VtZW50LmhlYWQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksYS5kYSgpKSl9O3RoaXMuTWEoZnVuY3Rpb24oKXtjPSEwO2QoKX0pO3RoaXMuTGEoZnVuY3Rpb24oKXtiPSEwO2QoKX0pfX07ay5wcm90b3R5cGUuZmxhdHRlbj1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2E9bShhLCJsaW5rW3JlbD1pbXBvcnRdIik7cShhLGZ1bmN0aW9uKGEpe3ZhciBjPWIuYVthLmhyZWZdOyhhLl9faW1wb3J0PWMpJiZjLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiYoYi5hW2EuaHJlZl09YSxhLnJlYWR5U3RhdGU9ImxvYWRpbmciLGEuX19pbXBvcnQ9YSxiLmZsYXR0ZW4oYyksYS5hcHBlbmRDaGlsZChjKSl9KX07ay5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihlKXtpZihlPGQpe3ZhciBmPWNbZV0saD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtmLnJlbW92ZUF0dHJpYnV0ZSgiaW1wb3J0LWRlcGVuZGVuY3kiKTsKcShmLmF0dHJpYnV0ZXMsZnVuY3Rpb24oYSl7cmV0dXJuIGguc2V0QXR0cmlidXRlKGEubmFtZSxhLnZhbHVlKX0pO3VhPWg7Zi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGYpO2coaCxmdW5jdGlvbigpe3VhPW51bGw7YihlKzEpfSl9ZWxzZSBhKCl9dmFyIGM9bShkb2N1bWVudCwic2NyaXB0W2ltcG9ydC1kZXBlbmRlbmN5XSIpLGQ9Yy5sZW5ndGg7YigwKX07ay5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dmFyIGI9bShkb2N1bWVudCwic3R5bGVbaW1wb3J0LWRlcGVuZGVuY3ldLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2ltcG9ydC1kZXBlbmRlbmN5XSIpLGQ9Yi5sZW5ndGg7aWYoZCl7dmFyIGU9aGEmJiEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcigibGlua1tyZWw9c3R5bGVzaGVldF1baHJlZl1bdHlwZT1pbXBvcnQtZGlzYWJsZV0iKTtxKGIsZnVuY3Rpb24oYil7ZyhiLGZ1bmN0aW9uKCl7Yi5yZW1vdmVBdHRyaWJ1dGUoImltcG9ydC1kZXBlbmRlbmN5Iik7MD09PS0tZCYmCmEoKX0pO2lmKGUmJmIucGFyZW50Tm9kZSE9PWRvY3VtZW50LmhlYWQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYi5sb2NhbE5hbWUpO2YuX19hcHBsaWVkRWxlbWVudD1iO2Yuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaW1wb3J0LXBsYWNlaG9sZGVyIik7Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLGIubmV4dFNpYmxpbmcpO2ZvcihmPWMoYik7ZiYmYyhmKTspZj1jKGYpO2YucGFyZW50Tm9kZSE9PWRvY3VtZW50LmhlYWQmJihmPW51bGwpO2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGIsZik7Yi5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKX19KX1lbHNlIGEoKX07ay5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9bShkb2N1bWVudCwibGlua1tyZWw9aW1wb3J0XSIpO3EoYixmdW5jdGlvbihiKXtyZXR1cm4gYS5mKGIpfSwhMCl9O2sucHJvdG90eXBlLmY9ZnVuY3Rpb24oYSl7YS5fX2xvYWRlZHx8KGEuX19sb2FkZWQ9ITAsYS5pbXBvcnQmJihhLmltcG9ydC5yZWFkeVN0YXRlPQoiY29tcGxldGUiKSxhLmRpc3BhdGNoRXZlbnQoYihhLmltcG9ydD8ibG9hZCI6ImVycm9yIix7YnViYmxlczohMSxjYW5jZWxhYmxlOiExLGRldGFpbDp2b2lkIDB9KSkpfTtrLnByb3RvdHlwZS5KYT1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3EoYSxmdW5jdGlvbihhKXtyZXR1cm4gcShhLmFkZGVkTm9kZXMsZnVuY3Rpb24oYSl7YSYmYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiYoaChhKT9iLmcoYSk6Yi5sb2FkSW1wb3J0cyhhKSl9KX0pfTt2YXIgdmE9bnVsbDtpZihNKXg9bShkb2N1bWVudCwibGlua1tyZWw9aW1wb3J0XSIpLHEoeCxmdW5jdGlvbihhKXthLmltcG9ydCYmImxvYWRpbmciPT09YS5pbXBvcnQucmVhZHlTdGF0ZXx8KGEuX19sb2FkZWQ9ITApfSkseD1mdW5jdGlvbihhKXthPWEudGFyZ2V0O2goYSkmJihhLl9fbG9hZGVkPSEwKX0sZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIseCwhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLAp4LCEwKTtlbHNle3ZhciBYPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsImJhc2VVUkkiKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoKCFYfHxYLmNvbmZpZ3VyYWJsZT9Ob2RlOkVsZW1lbnQpLnByb3RvdHlwZSwiYmFzZVVSSSIse2dldDpmdW5jdGlvbigpe3ZhciBhPWgodGhpcyk/dGhpczpjKHRoaXMpO3JldHVybiBhP2EuaHJlZjpYJiZYLmdldD9YLmdldC5jYWxsKHRoaXMpOihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJiYXNlIil8fHdpbmRvdy5sb2NhdGlvbikuaHJlZn0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTExpbmtFbGVtZW50LnByb3RvdHlwZSwiaW1wb3J0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19pbXBvcnR8fG51bGx9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSk7ZShmdW5jdGlvbigpe3ZhPW5ldyBrfSl9ZihmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIoIkhUTUxJbXBvcnRzTG9hZGVkIiwKe2NhbmNlbGFibGU6ITAsYnViYmxlczohMCxkZXRhaWw6dm9pZCAwfSkpfSk7YS51c2VOYXRpdmU9TTthLndoZW5SZWFkeT1mO2EuaW1wb3J0Rm9yRWxlbWVudD1jO2EubG9hZEltcG9ydHM9ZnVuY3Rpb24oYSl7dmEmJnZhLmxvYWRJbXBvcnRzKGEpfX0pKHdpbmRvdy5IVE1MSW1wb3J0cz13aW5kb3cuSFRNTEltcG9ydHN8fHt9KTsvKgoKIENvcHlyaWdodCAoYykgMjAxNCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8Kd2luZG93LldlYkNvbXBvbmVudHM9d2luZG93LldlYkNvbXBvbmVudHN8fHtmbGFnczp7fX07dmFyIENhPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmMqPSJ3ZWJjb21wb25lbnRzLWxpdGUuanMiXScpLERhPS93Yy0oLispLyx0PXt9O2lmKCF0Lm5vT3B0cyl7bG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihhKXthPWEuc3BsaXQoIj0iKTt2YXIgYjthWzBdJiYoYj1hWzBdLm1hdGNoKERhKSkmJih0W2JbMV1dPWFbMV18fCEwKX0pO2lmKENhKWZvcih2YXIgRWE9MCxGYT12b2lkIDA7RmE9Q2EuYXR0cmlidXRlc1tFYV07RWErKykic3JjIiE9PUZhLm5hbWUmJih0W0ZhLm5hbWVdPUZhLnZhbHVlfHwhMCk7aWYodC5sb2cmJnQubG9nLnNwbGl0KXt2YXIgR2E9dC5sb2cuc3BsaXQoIiwiKTt0LmxvZz17fTtHYS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3QubG9nW2FdPSEwfSl9ZWxzZSB0LmxvZz17fX0Kd2luZG93LldlYkNvbXBvbmVudHMuZmxhZ3M9dDt2YXIgSGE9dC5zaGFkeWRvbTtIYSYmKHdpbmRvdy5TaGFkeURPTT13aW5kb3cuU2hhZHlET018fHt9LHdpbmRvdy5TaGFkeURPTS5mb3JjZT1IYSk7dmFyIElhPXQucmVnaXN0ZXJ8fHQuY2U7SWEmJndpbmRvdy5jdXN0b21FbGVtZW50cyYmKHdpbmRvdy5jdXN0b21FbGVtZW50cy5mb3JjZVBvbHlmaWxsPUlhKTsvKgoKQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KZnVuY3Rpb24gSmEoKXt0aGlzLnBhPXRoaXMucm9vdD1udWxsO3RoaXMuVD0hMTt0aGlzLkQ9dGhpcy5QPXRoaXMuY2E9dGhpcy5hc3NpZ25lZFNsb3Q9dGhpcy5hc3NpZ25lZE5vZGVzPXRoaXMuSD1udWxsO3RoaXMuY2hpbGROb2Rlcz10aGlzLm5leHRTaWJsaW5nPXRoaXMucHJldmlvdXNTaWJsaW5nPXRoaXMubGFzdENoaWxkPXRoaXMuZmlyc3RDaGlsZD10aGlzLnBhcmVudE5vZGU9dGhpcy5LPXZvaWQgMDt0aGlzLmthPXRoaXMubGE9ITE7dGhpcy5PPXt9fUphLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57fX07ZnVuY3Rpb24gdShhKXthLl9fc2hhZHl8fChhLl9fc2hhZHk9bmV3IEphKTtyZXR1cm4gYS5fX3NoYWR5fWZ1bmN0aW9uIHYoYSl7cmV0dXJuIGEmJmEuX19zaGFkeX07dmFyIHc9d2luZG93LlNoYWR5RE9NfHx7fTt3LkdhPSEoIUVsZW1lbnQucHJvdG90eXBlLmF0dGFjaFNoYWRvd3x8IU5vZGUucHJvdG90eXBlLmdldFJvb3ROb2RlKTt2YXIgS2E9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwiZmlyc3RDaGlsZCIpO3cubT0hIShLYSYmS2EuY29uZmlndXJhYmxlJiZLYS5nZXQpO3cuZWE9dy5mb3JjZXx8IXcuR2E7dy5KPXcubm9QYXRjaHx8ITE7dy5vYT13LnByZWZlclBlcmZvcm1hbmNlO2Z1bmN0aW9uIHkoYSl7cmV0dXJuKGE9dihhKSkmJnZvaWQgMCE9PWEuZmlyc3RDaGlsZH1mdW5jdGlvbiB6KGEpe3JldHVybiJTaGFkeVJvb3QiPT09YS56YX1mdW5jdGlvbiBMYShhKXtyZXR1cm4oYT0oYT12KGEpKSYmYS5yb290KSYmTWEoYSl9CnZhciBOYT1FbGVtZW50LnByb3RvdHlwZSxPYT1OYS5tYXRjaGVzfHxOYS5tYXRjaGVzU2VsZWN0b3J8fE5hLm1vek1hdGNoZXNTZWxlY3Rvcnx8TmEubXNNYXRjaGVzU2VsZWN0b3J8fE5hLm9NYXRjaGVzU2VsZWN0b3J8fE5hLndlYmtpdE1hdGNoZXNTZWxlY3RvcixQYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksUWE9MCxSYT1bXTsobmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXtmb3IoO1JhLmxlbmd0aDspdHJ5e1JhLnNoaWZ0KCkoKX1jYXRjaChhKXt0aHJvdyBQYS50ZXh0Q29udGVudD1RYSsrLGE7fX0pKS5vYnNlcnZlKFBhLHtjaGFyYWN0ZXJEYXRhOiEwfSk7ZnVuY3Rpb24gU2EoYSl7UmEucHVzaChhKTtQYS50ZXh0Q29udGVudD1RYSsrfXZhciBUYT0hIWRvY3VtZW50LmNvbnRhaW5zO2Z1bmN0aW9uIFVhKGEsYil7Zm9yKDtiOyl7aWYoYj09YSlyZXR1cm4hMDtiPWIuX19zaGFkeV9wYXJlbnROb2RlfXJldHVybiExfQpmdW5jdGlvbiBWYShhKXtmb3IodmFyIGI9YS5sZW5ndGgtMTswPD1iO2ItLSl7dmFyIGM9YVtiXSxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfHxjLmdldEF0dHJpYnV0ZSgibmFtZSIpO2QmJiJsZW5ndGgiIT09ZCYmaXNOYU4oZCkmJihhW2RdPWMpfWEuaXRlbT1mdW5jdGlvbihiKXtyZXR1cm4gYVtiXX07YS5uYW1lZEl0ZW09ZnVuY3Rpb24oYil7aWYoImxlbmd0aCIhPT1iJiZpc05hTihiKSYmYVtiXSlyZXR1cm4gYVtiXTtmb3IodmFyIGM9aWEoYSksZD1jLm5leHQoKTshZC5kb25lO2Q9Yy5uZXh0KCkpaWYoZD1kLnZhbHVlLChkLmdldEF0dHJpYnV0ZSgiaWQiKXx8ZC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk9PWIpcmV0dXJuIGQ7cmV0dXJuIG51bGx9O3JldHVybiBhfQpmdW5jdGlvbiBBKGEsYixjLGQpe2M9dm9pZCAwPT09Yz8iIjpjO2Zvcih2YXIgZSBpbiBiKXt2YXIgZj1iW2VdO2lmKCEoZCYmMDw9ZC5pbmRleE9mKGUpKSl7Zi5jb25maWd1cmFibGU9ITA7dmFyIGc9YytlO2lmKGYudmFsdWUpYVtnXT1mLnZhbHVlO2Vsc2UgdHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGcsZil9Y2F0Y2goaCl7fX19fWZ1bmN0aW9uIEIoYSl7dmFyIGI9e307T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYSkuZm9yRWFjaChmdW5jdGlvbihjKXtiW2NdPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSxjKX0pO3JldHVybiBifTt2YXIgV2E9W10sWGE7ZnVuY3Rpb24gWWEoYSl7WGF8fChYYT0hMCxTYShaYSkpO1dhLnB1c2goYSl9ZnVuY3Rpb24gWmEoKXtYYT0hMTtmb3IodmFyIGE9ISFXYS5sZW5ndGg7V2EubGVuZ3RoOylXYS5zaGlmdCgpKCk7cmV0dXJuIGF9WmEubGlzdD1XYTtmdW5jdGlvbiAkYSgpe3RoaXMuYT0hMTt0aGlzLmFkZGVkTm9kZXM9W107dGhpcy5yZW1vdmVkTm9kZXM9W107dGhpcy5TPW5ldyBTZXR9ZnVuY3Rpb24gYWIoYSl7YS5hfHwoYS5hPSEwLFNhKGZ1bmN0aW9uKCl7YS5mbHVzaCgpfSkpfSRhLnByb3RvdHlwZS5mbHVzaD1mdW5jdGlvbigpe2lmKHRoaXMuYSl7dGhpcy5hPSExO3ZhciBhPXRoaXMudGFrZVJlY29yZHMoKTthLmxlbmd0aCYmdGhpcy5TLmZvckVhY2goZnVuY3Rpb24oYil7YihhKX0pfX07JGEucHJvdG90eXBlLnRha2VSZWNvcmRzPWZ1bmN0aW9uKCl7aWYodGhpcy5hZGRlZE5vZGVzLmxlbmd0aHx8dGhpcy5yZW1vdmVkTm9kZXMubGVuZ3RoKXt2YXIgYT1be2FkZGVkTm9kZXM6dGhpcy5hZGRlZE5vZGVzLHJlbW92ZWROb2Rlczp0aGlzLnJlbW92ZWROb2Rlc31dO3RoaXMuYWRkZWROb2Rlcz1bXTt0aGlzLnJlbW92ZWROb2Rlcz1bXTtyZXR1cm4gYX1yZXR1cm5bXX07CmZ1bmN0aW9uIGJiKGEsYil7dmFyIGM9dShhKTtjLkh8fChjLkg9bmV3ICRhKTtjLkguUy5hZGQoYik7dmFyIGQ9Yy5IO3JldHVybnt5YTpiLEY6ZCxBYTphLHRha2VSZWNvcmRzOmZ1bmN0aW9uKCl7cmV0dXJuIGQudGFrZVJlY29yZHMoKX19fWZ1bmN0aW9uIGNiKGEpe3ZhciBiPWEmJmEuRjtiJiYoYi5TLmRlbGV0ZShhLnlhKSxiLlMuc2l6ZXx8KHUoYS5BYSkuSD1udWxsKSl9CmZ1bmN0aW9uIGRiKGEsYil7dmFyIGM9Yi5nZXRSb290Tm9kZSgpO3JldHVybiBhLm1hcChmdW5jdGlvbihhKXt2YXIgYj1jPT09YS50YXJnZXQuZ2V0Um9vdE5vZGUoKTtpZihiJiZhLmFkZGVkTm9kZXMpe2lmKGI9QXJyYXkuZnJvbShhLmFkZGVkTm9kZXMpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYz09PWEuZ2V0Um9vdE5vZGUoKX0pLGIubGVuZ3RoKXJldHVybiBhPU9iamVjdC5jcmVhdGUoYSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsImFkZGVkTm9kZXMiLHt2YWx1ZTpiLGNvbmZpZ3VyYWJsZTohMH0pLGF9ZWxzZSBpZihiKXJldHVybiBhfSkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhfSl9O3ZhciBlYj0vWyZcdTAwQTAiXS9nLGZiPS9bJlx1MDBBMDw+XS9nO2Z1bmN0aW9uIGdiKGEpe3N3aXRjaChhKXtjYXNlICImIjpyZXR1cm4iJmFtcDsiO2Nhc2UgIjwiOnJldHVybiImbHQ7IjtjYXNlICI+IjpyZXR1cm4iJmd0OyI7Y2FzZSAnIic6cmV0dXJuIiZxdW90OyI7Y2FzZSAiXHUwMGEwIjpyZXR1cm4iJm5ic3A7In19ZnVuY3Rpb24gaGIoYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKyliW2FbY11dPSEwO3JldHVybiBifXZhciBpYj1oYigiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnIiLnNwbGl0KCIgIikpLGpiPWhiKCJzdHlsZSBzY3JpcHQgeG1wIGlmcmFtZSBub2VtYmVkIG5vZnJhbWVzIHBsYWludGV4dCBub3NjcmlwdCIuc3BsaXQoIiAiKSk7CmZ1bmN0aW9uIGtiKGEsYil7InRlbXBsYXRlIj09PWEubG9jYWxOYW1lJiYoYT1hLmNvbnRlbnQpO2Zvcih2YXIgYz0iIixkPWI/YihhKTphLmNoaWxkTm9kZXMsZT0wLGY9ZC5sZW5ndGgsZz12b2lkIDA7ZTxmJiYoZz1kW2VdKTtlKyspe2E6e3ZhciBoPWc7dmFyIGs9YSxsPWI7c3dpdGNoKGgubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6az1oLmxvY2FsTmFtZTtmb3IodmFyIG09IjwiK2sscT1oLmF0dHJpYnV0ZXMseD0wLE07TT1xW3hdO3grKyltKz0iICIrTS5uYW1lKyc9IicrTS52YWx1ZS5yZXBsYWNlKGViLGdiKSsnIic7bSs9Ij4iO2g9aWJba10/bTptK2tiKGgsbCkrIjwvIitrKyI+IjticmVhayBhO2Nhc2UgTm9kZS5URVhUX05PREU6aD1oLmRhdGE7aD1rJiZqYltrLmxvY2FsTmFtZV0/aDpoLnJlcGxhY2UoZmIsZ2IpO2JyZWFrIGE7Y2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpoPSJceDNjIS0tIitoLmRhdGErIi0tXHgzZSI7YnJlYWsgYTtkZWZhdWx0OnRocm93IHdpbmRvdy5jb25zb2xlLmVycm9yKGgpLApFcnJvcigibm90IGltcGxlbWVudGVkIik7fX1jKz1ofXJldHVybiBjfTt2YXIgcGI9dy5tLHFiPXtxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3F1ZXJ5U2VsZWN0b3IoYSl9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvckFsbChhKX19LHJiPXt9O2Z1bmN0aW9uIHNiKGEpe3JiW2FdPWZ1bmN0aW9uKGIpe3JldHVybiBiWyJfX3NoYWR5X25hdGl2ZV8iK2FdfX1mdW5jdGlvbiB0YihhLGIpe0EoYSxiLCJfX3NoYWR5X25hdGl2ZV8iKTtmb3IodmFyIGMgaW4gYilzYihjKX1mdW5jdGlvbiBEKGEsYil7Yj12b2lkIDA9PT1iP1tdOmI7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10sZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsZCk7ZSYmKE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJfX3NoYWR5X25hdGl2ZV8iK2QsZSksZS52YWx1ZT9xYltkXXx8KHFiW2RdPWUudmFsdWUpOnNiKGQpKX19CnZhciBFPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZG9jdW1lbnQsTm9kZUZpbHRlci5TSE9XX0FMTCxudWxsLCExKSxGPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZG9jdW1lbnQsTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQsbnVsbCwhMSksdWI9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJpbmVydCIpO2Z1bmN0aW9uIHZiKGEpe2Zvcih2YXIgYjtiPWEuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZDspYS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChiKX12YXIgd2I9WyJmaXJzdEVsZW1lbnRDaGlsZCIsImxhc3RFbGVtZW50Q2hpbGQiLCJjaGlsZHJlbiIsImNoaWxkRWxlbWVudENvdW50Il0seGI9WyJxdWVyeVNlbGVjdG9yIiwicXVlcnlTZWxlY3RvckFsbCJdOwpmdW5jdGlvbiB5Yigpe3ZhciBhPVsiZGlzcGF0Y2hFdmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIl07d2luZG93LkV2ZW50VGFyZ2V0P0Qod2luZG93LkV2ZW50VGFyZ2V0LnByb3RvdHlwZSxhKTooRChOb2RlLnByb3RvdHlwZSxhKSxEKFdpbmRvdy5wcm90b3R5cGUsYSkpO3BiP0QoTm9kZS5wcm90b3R5cGUsInBhcmVudE5vZGUgZmlyc3RDaGlsZCBsYXN0Q2hpbGQgcHJldmlvdXNTaWJsaW5nIG5leHRTaWJsaW5nIGNoaWxkTm9kZXMgcGFyZW50RWxlbWVudCB0ZXh0Q29udGVudCIuc3BsaXQoIiAiKSk6dGIoTm9kZS5wcm90b3R5cGUse3BhcmVudE5vZGU6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5wYXJlbnROb2RlKCl9fSxmaXJzdENoaWxkOntnZXQ6ZnVuY3Rpb24oKXtFLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEUuZmlyc3RDaGlsZCgpfX0sbGFzdENoaWxkOntnZXQ6ZnVuY3Rpb24oKXtFLmN1cnJlbnROb2RlPQp0aGlzO3JldHVybiBFLmxhc3RDaGlsZCgpfX0scHJldmlvdXNTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtFLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEUucHJldmlvdXNTaWJsaW5nKCl9fSxuZXh0U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7RS5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBFLm5leHRTaWJsaW5nKCl9fSxjaGlsZE5vZGVzOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtFLmN1cnJlbnROb2RlPXRoaXM7Zm9yKHZhciBjPUUuZmlyc3RDaGlsZCgpO2M7KWEucHVzaChjKSxjPUUubmV4dFNpYmxpbmcoKTtyZXR1cm4gYX19LHBhcmVudEVsZW1lbnQ6e2dldDpmdW5jdGlvbigpe0YuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRi5wYXJlbnROb2RlKCl9fSx0ZXh0Q29udGVudDp7Z2V0OmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6Zm9yKHZhciBhPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIodGhpcywKTm9kZUZpbHRlci5TSE9XX1RFWFQsbnVsbCwhMSksYz0iIixkO2Q9YS5uZXh0Tm9kZSgpOyljKz1kLm5vZGVWYWx1ZTtyZXR1cm4gYztkZWZhdWx0OnJldHVybiB0aGlzLm5vZGVWYWx1ZX19LHNldDpmdW5jdGlvbihhKXtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBhfHxudWxsPT09YSlhPSIiO3N3aXRjaCh0aGlzLm5vZGVUeXBlKXtjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOmNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOnZiKHRoaXMpOygwPGEubGVuZ3RofHx0aGlzLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpJiZ0aGlzLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6dGhpcy5ub2RlVmFsdWU9YX19fX0pO0QoTm9kZS5wcm90b3R5cGUsImFwcGVuZENoaWxkIGluc2VydEJlZm9yZSByZW1vdmVDaGlsZCByZXBsYWNlQ2hpbGQgY2xvbmVOb2RlIGNvbnRhaW5zIi5zcGxpdCgiICIpKTsKYT17Zmlyc3RFbGVtZW50Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0YuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRi5maXJzdENoaWxkKCl9fSxsYXN0RWxlbWVudENoaWxkOntnZXQ6ZnVuY3Rpb24oKXtGLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEYubGFzdENoaWxkKCl9fSxjaGlsZHJlbjp7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9W107Ri5jdXJyZW50Tm9kZT10aGlzO2Zvcih2YXIgYz1GLmZpcnN0Q2hpbGQoKTtjOylhLnB1c2goYyksYz1GLm5leHRTaWJsaW5nKCk7cmV0dXJuIFZhKGEpfX0sY2hpbGRFbGVtZW50Q291bnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkcmVuP3RoaXMuY2hpbGRyZW4ubGVuZ3RoOjB9fX07cGI/KEQoRWxlbWVudC5wcm90b3R5cGUsd2IpLEQoRWxlbWVudC5wcm90b3R5cGUsWyJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiaW5uZXJIVE1MIl0pLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLAoiY2hpbGRyZW4iKSYmRChIVE1MRWxlbWVudC5wcm90b3R5cGUsWyJjaGlsZHJlbiJdKSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlwZSwiaW5uZXJIVE1MIikmJkQoSFRNTEVsZW1lbnQucHJvdG90eXBlLFsiaW5uZXJIVE1MIl0pKToodGIoRWxlbWVudC5wcm90b3R5cGUsYSksdGIoRWxlbWVudC5wcm90b3R5cGUse3ByZXZpb3VzRWxlbWVudFNpYmxpbmc6e2dldDpmdW5jdGlvbigpe0YuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRi5wcmV2aW91c1NpYmxpbmcoKX19LG5leHRFbGVtZW50U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLm5leHRTaWJsaW5nKCl9fSxpbm5lckhUTUw6e2dldDpmdW5jdGlvbigpe3JldHVybiBrYih0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiBhLl9fc2hhZHlfbmF0aXZlX2NoaWxkTm9kZXN9KX0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPSJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZT8KdGhpcy5jb250ZW50OnRoaXM7dmIoYik7dmFyIGQ9dGhpcy5sb2NhbE5hbWV8fCJkaXYiO2Q9dGhpcy5uYW1lc3BhY2VVUkkmJnRoaXMubmFtZXNwYWNlVVJJIT09dWIubmFtZXNwYWNlVVJJP3ViLmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5hbWVzcGFjZVVSSSxkKTp1Yi5jcmVhdGVFbGVtZW50KGQpO2QuaW5uZXJIVE1MPWE7Zm9yKGE9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lP2QuY29udGVudDpkO2Q9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkOyliLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShkLHZvaWQgMCl9fX0pKTtEKEVsZW1lbnQucHJvdG90eXBlLCJzZXRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlIGhhc0F0dHJpYnV0ZSByZW1vdmVBdHRyaWJ1dGUgZm9jdXMgYmx1ciIuc3BsaXQoIiAiKSk7RChFbGVtZW50LnByb3RvdHlwZSx4Yik7RChIVE1MRWxlbWVudC5wcm90b3R5cGUsWyJmb2N1cyIsImJsdXIiLCJjb250YWlucyJdKTtwYiYmRChIVE1MRWxlbWVudC5wcm90b3R5cGUsClsicGFyZW50RWxlbWVudCIsImNoaWxkcmVuIiwiaW5uZXJIVE1MIl0pO3dpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50JiZEKHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50LnByb3RvdHlwZSxbImlubmVySFRNTCJdKTtwYj9EKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHdiKTp0YihEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSxhKTtEKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHhiKTtwYj8oRChEb2N1bWVudC5wcm90b3R5cGUsd2IpLEQoRG9jdW1lbnQucHJvdG90eXBlLFsiYWN0aXZlRWxlbWVudCJdKSk6dGIoRG9jdW1lbnQucHJvdG90eXBlLGEpO0QoRG9jdW1lbnQucHJvdG90eXBlLFsiaW1wb3J0Tm9kZSIsImdldEVsZW1lbnRCeUlkIl0pO0QoRG9jdW1lbnQucHJvdG90eXBlLHhiKX07dmFyIHpiPUIoe2dldCBjaGlsZE5vZGVzKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZE5vZGVzfSxnZXQgZmlyc3RDaGlsZCgpe3JldHVybiB0aGlzLl9fc2hhZHlfZmlyc3RDaGlsZH0sZ2V0IGxhc3RDaGlsZCgpe3JldHVybiB0aGlzLl9fc2hhZHlfbGFzdENoaWxkfSxnZXQgdGV4dENvbnRlbnQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3RleHRDb250ZW50fSxzZXQgdGV4dENvbnRlbnQoYSl7dGhpcy5fX3NoYWR5X3RleHRDb250ZW50PWF9LGdldCBjaGlsZEVsZW1lbnRDb3VudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfY2hpbGRFbGVtZW50Q291bnR9LGdldCBjaGlsZHJlbigpe3JldHVybiB0aGlzLl9fc2hhZHlfY2hpbGRyZW59LGdldCBmaXJzdEVsZW1lbnRDaGlsZCgpe3JldHVybiB0aGlzLl9fc2hhZHlfZmlyc3RFbGVtZW50Q2hpbGR9LGdldCBsYXN0RWxlbWVudENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9sYXN0RWxlbWVudENoaWxkfSxnZXQgaW5uZXJIVE1MKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9pbm5lckhUTUx9LApzZXQgaW5uZXJIVE1MKGEpe3JldHVybiB0aGlzLl9fc2hhZHlfaW5uZXJIVE1MPWF9LGdldCBzaGFkb3dSb290KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9zaGFkb3dSb290fX0pLEFiPUIoe2dldCBwYXJlbnRFbGVtZW50KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wYXJlbnRFbGVtZW50fSxnZXQgcGFyZW50Tm9kZSgpe3JldHVybiB0aGlzLl9fc2hhZHlfcGFyZW50Tm9kZX0sZ2V0IG5leHRTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9uZXh0U2libGluZ30sZ2V0IHByZXZpb3VzU2libGluZygpe3JldHVybiB0aGlzLl9fc2hhZHlfcHJldmlvdXNTaWJsaW5nfSxnZXQgbmV4dEVsZW1lbnRTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9uZXh0RWxlbWVudFNpYmxpbmd9LGdldCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfSxnZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jbGFzc05hbWV9LApzZXQgY2xhc3NOYW1lKGEpe3JldHVybiB0aGlzLl9fc2hhZHlfY2xhc3NOYW1lPWF9fSksQmI7Zm9yKEJiIGluIHpiKXpiW0JiXS5lbnVtZXJhYmxlPSExO2Zvcih2YXIgQ2IgaW4gQWIpQWJbQ2JdLmVudW1lcmFibGU9ITE7dmFyIERiPXcubXx8dy5KLEViPURiP2Z1bmN0aW9uKCl7fTpmdW5jdGlvbihhKXt2YXIgYj11KGEpO2IubGF8fChiLmxhPSEwLEEoYSxBYikpfSxGYj1EYj9mdW5jdGlvbigpe306ZnVuY3Rpb24oYSl7dmFyIGI9dShhKTtiLmthfHwoYi5rYT0hMCxBKGEsemIpKX07dmFyIEdiPSJfX2V2ZW50V3JhcHBlcnMiK0RhdGUubm93KCksSGI9ZnVuY3Rpb24oKXt2YXIgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV2ZW50LnByb3RvdHlwZSwiY29tcG9zZWQiKTtyZXR1cm4gYT9mdW5jdGlvbihiKXtyZXR1cm4gYS5nZXQuY2FsbChiKX06bnVsbH0oKSxJYj17Ymx1cjohMCxmb2N1czohMCxmb2N1c2luOiEwLGZvY3Vzb3V0OiEwLGNsaWNrOiEwLGRibGNsaWNrOiEwLG1vdXNlZG93bjohMCxtb3VzZWVudGVyOiEwLG1vdXNlbGVhdmU6ITAsbW91c2Vtb3ZlOiEwLG1vdXNlb3V0OiEwLG1vdXNlb3ZlcjohMCxtb3VzZXVwOiEwLHdoZWVsOiEwLGJlZm9yZWlucHV0OiEwLGlucHV0OiEwLGtleWRvd246ITAsa2V5dXA6ITAsY29tcG9zaXRpb25zdGFydDohMCxjb21wb3NpdGlvbnVwZGF0ZTohMCxjb21wb3NpdGlvbmVuZDohMCx0b3VjaHN0YXJ0OiEwLHRvdWNoZW5kOiEwLHRvdWNobW92ZTohMCx0b3VjaGNhbmNlbDohMCxwb2ludGVyb3ZlcjohMCwKcG9pbnRlcmVudGVyOiEwLHBvaW50ZXJkb3duOiEwLHBvaW50ZXJtb3ZlOiEwLHBvaW50ZXJ1cDohMCxwb2ludGVyY2FuY2VsOiEwLHBvaW50ZXJvdXQ6ITAscG9pbnRlcmxlYXZlOiEwLGdvdHBvaW50ZXJjYXB0dXJlOiEwLGxvc3Rwb2ludGVyY2FwdHVyZTohMCxkcmFnc3RhcnQ6ITAsZHJhZzohMCxkcmFnZW50ZXI6ITAsZHJhZ2xlYXZlOiEwLGRyYWdvdmVyOiEwLGRyb3A6ITAsZHJhZ2VuZDohMCxET01BY3RpdmF0ZTohMCxET01Gb2N1c0luOiEwLERPTUZvY3VzT3V0OiEwLGtleXByZXNzOiEwfSxKYj17RE9NQXR0ck1vZGlmaWVkOiEwLERPTUF0dHJpYnV0ZU5hbWVDaGFuZ2VkOiEwLERPTUNoYXJhY3RlckRhdGFNb2RpZmllZDohMCxET01FbGVtZW50TmFtZUNoYW5nZWQ6ITAsRE9NTm9kZUluc2VydGVkOiEwLERPTU5vZGVJbnNlcnRlZEludG9Eb2N1bWVudDohMCxET01Ob2RlUmVtb3ZlZDohMCxET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudDohMCxET01TdWJ0cmVlTW9kaWZpZWQ6ITB9OwpmdW5jdGlvbiBLYihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIE5vZGU/YS5fX3NoYWR5X2dldFJvb3ROb2RlKCk6YX1mdW5jdGlvbiBMYihhLGIpe3ZhciBjPVtdLGQ9YTtmb3IoYT1LYihhKTtkOyljLnB1c2goZCksZC5fX3NoYWR5X2Fzc2lnbmVkU2xvdD9kPWQuX19zaGFkeV9hc3NpZ25lZFNsb3Q6ZC5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmZC5ob3N0JiYoYnx8ZCE9PWEpP2Q9ZC5ob3N0OmQ9ZC5fX3NoYWR5X3BhcmVudE5vZGU7Y1tjLmxlbmd0aC0xXT09PWRvY3VtZW50JiZjLnB1c2god2luZG93KTtyZXR1cm4gY31mdW5jdGlvbiBNYihhKXthLl9fY29tcG9zZWRQYXRofHwoYS5fX2NvbXBvc2VkUGF0aD1MYihhLnRhcmdldCwhMCkpO3JldHVybiBhLl9fY29tcG9zZWRQYXRofQpmdW5jdGlvbiBOYihhLGIpe2lmKCF6KXJldHVybiBhO2E9TGIoYSwhMCk7Zm9yKHZhciBjPTAsZCxlPXZvaWQgMCxmLGc9dm9pZCAwO2M8Yi5sZW5ndGg7YysrKWlmKGQ9YltjXSxmPUtiKGQpLGYhPT1lJiYoZz1hLmluZGV4T2YoZiksZT1mKSwheihmKXx8LTE8ZylyZXR1cm4gZH1mdW5jdGlvbiBPYihhKXtmdW5jdGlvbiBiKGIsZCl7Yj1uZXcgYShiLGQpO2IuX19jb21wb3NlZD1kJiYhIWQuY29tcG9zZWQ7cmV0dXJuIGJ9Yi5fX3Byb3RvX189YTtiLnByb3RvdHlwZT1hLnByb3RvdHlwZTtyZXR1cm4gYn12YXIgUGI9e2ZvY3VzOiEwLGJsdXI6ITB9O2Z1bmN0aW9uIFFiKGEpe3JldHVybiBhLl9fdGFyZ2V0IT09YS50YXJnZXR8fGEuX19yZWxhdGVkVGFyZ2V0IT09YS5yZWxhdGVkVGFyZ2V0fQpmdW5jdGlvbiBSYihhLGIsYyl7aWYoYz1iLl9faGFuZGxlcnMmJmIuX19oYW5kbGVyc1thLnR5cGVdJiZiLl9faGFuZGxlcnNbYS50eXBlXVtjXSlmb3IodmFyIGQ9MCxlOyhlPWNbZF0pJiYoIVFiKGEpfHxhLnRhcmdldCE9PWEucmVsYXRlZFRhcmdldCkmJihlLmNhbGwoYixhKSwhYS5fX2ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCk7ZCsrKTt9CmZ1bmN0aW9uIFNiKGEpe3ZhciBiPWEuY29tcG9zZWRQYXRoKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsImN1cnJlbnRUYXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZH0sY29uZmlndXJhYmxlOiEwfSk7Zm9yKHZhciBjPWIubGVuZ3RoLTE7MDw9YztjLS0pe3ZhciBkPWJbY107UmIoYSxkLCJjYXB0dXJlIik7aWYoYS5aKXJldHVybn1PYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiZXZlbnRQaGFzZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBFdmVudC5BVF9UQVJHRVR9fSk7dmFyIGU7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyl7ZD1iW2NdO3ZhciBmPXYoZCk7Zj1mJiZmLnJvb3Q7aWYoMD09PWN8fGYmJmY9PT1lKWlmKFJiKGEsZCwiYnViYmxlIiksZCE9PXdpbmRvdyYmKGU9ZC5fX3NoYWR5X2dldFJvb3ROb2RlKCkpLGEuWilicmVha319CmZ1bmN0aW9uIFRiKGEsYixjLGQsZSxmKXtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl7dmFyIGg9YVtnXSxrPWgudHlwZSxsPWguY2FwdHVyZSxtPWgub25jZSxxPWgucGFzc2l2ZTtpZihiPT09aC5ub2RlJiZjPT09ayYmZD09PWwmJmU9PT1tJiZmPT09cSlyZXR1cm4gZ31yZXR1cm4tMX0KZnVuY3Rpb24gVWIoYSxiLGMpe2lmKGIpe3ZhciBkPXR5cGVvZiBiO2lmKCJmdW5jdGlvbiI9PT1kfHwib2JqZWN0Ij09PWQpaWYoIm9iamVjdCIhPT1kfHxiLmhhbmRsZUV2ZW50JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuaGFuZGxlRXZlbnQpe2lmKEpiW2FdKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpO2lmKGMmJiJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBlPSEhYy5jYXB0dXJlO3ZhciBmPSEhYy5vbmNlO3ZhciBnPSEhYy5wYXNzaXZlfWVsc2UgZT0hIWMsZz1mPSExO3ZhciBoPWMmJmMuJHx8dGhpcyxrPWJbR2JdO2lmKGspe2lmKC0xPFRiKGssaCxhLGUsZixnKSlyZXR1cm59ZWxzZSBiW0diXT1bXTtrPWZ1bmN0aW9uKGUpe2YmJnRoaXMuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKTtlLl9fdGFyZ2V0fHxWYihlKTtpZihoIT09dGhpcyl7dmFyIGc9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCJjdXJyZW50VGFyZ2V0Iik7Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJjdXJyZW50VGFyZ2V0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGh9LGNvbmZpZ3VyYWJsZTohMH0pfWUuX19wcmV2aW91c0N1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0O2lmKCF6KGgpfHwtMSE9ZS5jb21wb3NlZFBhdGgoKS5pbmRleE9mKGgpKWlmKGUuY29tcG9zZWR8fC0xPGUuY29tcG9zZWRQYXRoKCkuaW5kZXhPZihoKSlpZihRYihlKSYmZS50YXJnZXQ9PT1lLnJlbGF0ZWRUYXJnZXQpZS5ldmVudFBoYXNlPT09RXZlbnQuQlVCQkxJTkdfUEhBU0UmJmUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7ZWxzZSBpZihlLmV2ZW50UGhhc2U9PT1FdmVudC5DQVBUVVJJTkdfUEhBU0V8fGUuYnViYmxlc3x8ZS50YXJnZXQ9PT1ofHxoIGluc3RhbmNlb2YgV2luZG93KXt2YXIgaz0iZnVuY3Rpb24iPT09ZD9iLmNhbGwoaCxlKTpiLmhhbmRsZUV2ZW50JiZiLmhhbmRsZUV2ZW50KGUpO2ghPT10aGlzJiYoZz8oT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsCiJjdXJyZW50VGFyZ2V0IixnKSxnPW51bGwpOmRlbGV0ZSBlLmN1cnJlbnRUYXJnZXQpO3JldHVybiBrfX07YltHYl0ucHVzaCh7bm9kZTpoLHR5cGU6YSxjYXB0dXJlOmUsb25jZTpmLHBhc3NpdmU6ZyxZYTprfSk7UGJbYV0/KHRoaXMuX19oYW5kbGVycz10aGlzLl9faGFuZGxlcnN8fHt9LHRoaXMuX19oYW5kbGVyc1thXT10aGlzLl9faGFuZGxlcnNbYV18fHtjYXB0dXJlOltdLGJ1YmJsZTpbXX0sdGhpcy5fX2hhbmRsZXJzW2FdW2U/ImNhcHR1cmUiOiJidWJibGUiXS5wdXNoKGspKTp0aGlzLl9fc2hhZHlfbmF0aXZlX2FkZEV2ZW50TGlzdGVuZXIoYSxrLGMpfX19CmZ1bmN0aW9uIFdiKGEsYixjKXtpZihiKXtpZihKYlthXSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKTtpZihjJiYib2JqZWN0Ij09PXR5cGVvZiBjKXt2YXIgZD0hIWMuY2FwdHVyZTt2YXIgZT0hIWMub25jZTt2YXIgZj0hIWMucGFzc2l2ZX1lbHNlIGQ9ISFjLGY9ZT0hMTt2YXIgZz1jJiZjLiR8fHRoaXMsaD12b2lkIDA7dmFyIGs9bnVsbDt0cnl7az1iW0diXX1jYXRjaChsKXt9ayYmKGU9VGIoayxnLGEsZCxlLGYpLC0xPGUmJihoPWsuc3BsaWNlKGUsMSlbMF0uWWEsay5sZW5ndGh8fChiW0diXT12b2lkIDApKSk7dGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVFdmVudExpc3RlbmVyKGEsaHx8YixjKTtoJiZQYlthXSYmdGhpcy5fX2hhbmRsZXJzJiZ0aGlzLl9faGFuZGxlcnNbYV0mJihhPXRoaXMuX19oYW5kbGVyc1thXVtkPyJjYXB0dXJlIjoiYnViYmxlIl0saD1hLmluZGV4T2YoaCksLTE8aCYmYS5zcGxpY2UoaCwxKSl9fQpmdW5jdGlvbiBYYigpe2Zvcih2YXIgYSBpbiBQYil3aW5kb3cuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe2EuX190YXJnZXR8fChWYihhKSxTYihhKSl9LCEwKX0KdmFyIFliPUIoe2dldCBjb21wb3NlZCgpe3ZvaWQgMD09PXRoaXMuX19jb21wb3NlZCYmKEhiP3RoaXMuX19jb21wb3NlZD0iZm9jdXNpbiI9PT10aGlzLnR5cGV8fCJmb2N1c291dCI9PT10aGlzLnR5cGV8fEhiKHRoaXMpOiExIT09dGhpcy5pc1RydXN0ZWQmJih0aGlzLl9fY29tcG9zZWQ9SWJbdGhpcy50eXBlXSkpO3JldHVybiB0aGlzLl9fY29tcG9zZWR8fCExfSxjb21wb3NlZFBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9fY29tcG9zZWRQYXRofHwodGhpcy5fX2NvbXBvc2VkUGF0aD1MYih0aGlzLl9fdGFyZ2V0LHRoaXMuY29tcG9zZWQpKTtyZXR1cm4gdGhpcy5fX2NvbXBvc2VkUGF0aH0sZ2V0IHRhcmdldCgpe3JldHVybiBOYih0aGlzLmN1cnJlbnRUYXJnZXR8fHRoaXMuX19wcmV2aW91c0N1cnJlbnRUYXJnZXQsdGhpcy5jb21wb3NlZFBhdGgoKSl9LGdldCByZWxhdGVkVGFyZ2V0KCl7aWYoIXRoaXMuX19yZWxhdGVkVGFyZ2V0KXJldHVybiBudWxsO3RoaXMuX19yZWxhdGVkVGFyZ2V0Q29tcG9zZWRQYXRofHwKKHRoaXMuX19yZWxhdGVkVGFyZ2V0Q29tcG9zZWRQYXRoPUxiKHRoaXMuX19yZWxhdGVkVGFyZ2V0LCEwKSk7cmV0dXJuIE5iKHRoaXMuY3VycmVudFRhcmdldHx8dGhpcy5fX3ByZXZpb3VzQ3VycmVudFRhcmdldCx0aGlzLl9fcmVsYXRlZFRhcmdldENvbXBvc2VkUGF0aCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe0V2ZW50LnByb3RvdHlwZS5zdG9wUHJvcGFnYXRpb24uY2FsbCh0aGlzKTt0aGlzLlo9ITB9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe0V2ZW50LnByb3RvdHlwZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24uY2FsbCh0aGlzKTt0aGlzLlo9dGhpcy5fX2ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD0hMH19KTsKZnVuY3Rpb24gVmIoYSl7YS5fX3RhcmdldD1hLnRhcmdldDthLl9fcmVsYXRlZFRhcmdldD1hLnJlbGF0ZWRUYXJnZXQ7aWYody5tKXt2YXIgYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYSk7aWYoIU9iamVjdC5oYXNPd25Qcm9wZXJ0eShiLCJfX3NoYWR5X3BhdGNoZWRQcm90byIpKXt2YXIgYz1PYmplY3QuY3JlYXRlKGIpO2MuX19zaGFkeV9zb3VyY2VQcm90bz1iO0EoYyxZYik7Yi5fX3NoYWR5X3BhdGNoZWRQcm90bz1jfWEuX19wcm90b19fPWIuX19zaGFkeV9wYXRjaGVkUHJvdG99ZWxzZSBBKGEsWWIpfXZhciBaYj1PYihFdmVudCksJGI9T2IoQ3VzdG9tRXZlbnQpLGFjPU9iKE1vdXNlRXZlbnQpOwpmdW5jdGlvbiBiYygpe2lmKCFIYiYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFdmVudC5wcm90b3R5cGUsImlzVHJ1c3RlZCIpKXt2YXIgYT1mdW5jdGlvbigpe3ZhciBhPW5ldyBNb3VzZUV2ZW50KCJjbGljayIse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjb21wb3NlZDohMH0pO3RoaXMuX19zaGFkeV9kaXNwYXRjaEV2ZW50KGEpfTtFbGVtZW50LnByb3RvdHlwZS5jbGljaz9FbGVtZW50LnByb3RvdHlwZS5jbGljaz1hOkhUTUxFbGVtZW50LnByb3RvdHlwZS5jbGljayYmKEhUTUxFbGVtZW50LnByb3RvdHlwZS5jbGljaz1hKX19dmFyIGNjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKERvY3VtZW50LnByb3RvdHlwZSkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJvbiI9PT1hLnN1YnN0cmluZygwLDIpfSk7ZnVuY3Rpb24gZGMoYSxiKXtyZXR1cm57aW5kZXg6YSxMOltdLFI6Yn19CmZ1bmN0aW9uIGVjKGEsYixjLGQpe3ZhciBlPTAsZj0wLGc9MCxoPTAsaz1NYXRoLm1pbihiLWUsZC1mKTtpZigwPT1lJiYwPT1mKWE6e2ZvcihnPTA7ZzxrO2crKylpZihhW2ddIT09Y1tnXSlicmVhayBhO2c9a31pZihiPT1hLmxlbmd0aCYmZD09Yy5sZW5ndGgpe2g9YS5sZW5ndGg7Zm9yKHZhciBsPWMubGVuZ3RoLG09MDttPGstZyYmZmMoYVstLWhdLGNbLS1sXSk7KW0rKztoPW19ZSs9ZztmKz1nO2ItPWg7ZC09aDtpZigwPT1iLWUmJjA9PWQtZilyZXR1cm5bXTtpZihlPT1iKXtmb3IoYj1kYyhlLDApO2Y8ZDspYi5MLnB1c2goY1tmKytdKTtyZXR1cm5bYl19aWYoZj09ZClyZXR1cm5bZGMoZSxiLWUpXTtrPWU7Zz1mO2Q9ZC1nKzE7aD1iLWsrMTtiPUFycmF5KGQpO2ZvcihsPTA7bDxkO2wrKyliW2xdPUFycmF5KGgpLGJbbF1bMF09bDtmb3IobD0wO2w8aDtsKyspYlswXVtsXT1sO2ZvcihsPTE7bDxkO2wrKylmb3IobT0xO208aDttKyspaWYoYVtrK20tMV09PT1jW2crbC0xXSliW2xdW21dPQpiW2wtMV1bbS0xXTtlbHNle3ZhciBxPWJbbC0xXVttXSsxLHg9YltsXVttLTFdKzE7YltsXVttXT1xPHg/cTp4fWs9Yi5sZW5ndGgtMTtnPWJbMF0ubGVuZ3RoLTE7ZD1iW2tdW2ddO2ZvcihhPVtdOzA8a3x8MDxnOykwPT1rPyhhLnB1c2goMiksZy0tKTowPT1nPyhhLnB1c2goMyksay0tKTooaD1iW2stMV1bZy0xXSxsPWJbay0xXVtnXSxtPWJba11bZy0xXSxxPWw8bT9sPGg/bDpoOm08aD9tOmgscT09aD8oaD09ZD9hLnB1c2goMCk6KGEucHVzaCgxKSxkPWgpLGstLSxnLS0pOnE9PWw/KGEucHVzaCgzKSxrLS0sZD1sKTooYS5wdXNoKDIpLGctLSxkPW0pKTthLnJldmVyc2UoKTtiPXZvaWQgMDtrPVtdO2ZvcihnPTA7ZzxhLmxlbmd0aDtnKyspc3dpdGNoKGFbZ10pe2Nhc2UgMDpiJiYoay5wdXNoKGIpLGI9dm9pZCAwKTtlKys7ZisrO2JyZWFrO2Nhc2UgMTpifHwoYj1kYyhlLDApKTtiLlIrKztlKys7Yi5MLnB1c2goY1tmXSk7ZisrO2JyZWFrO2Nhc2UgMjpifHwoYj1kYyhlLDApKTsKYi5SKys7ZSsrO2JyZWFrO2Nhc2UgMzpifHwoYj1kYyhlLDApKSxiLkwucHVzaChjW2ZdKSxmKyt9YiYmay5wdXNoKGIpO3JldHVybiBrfWZ1bmN0aW9uIGZjKGEsYil7cmV0dXJuIGE9PT1ifTtmdW5jdGlvbiBnYyhhLGIsYyl7RWIoYSk7Yz1jfHxudWxsO3ZhciBkPXUoYSksZT11KGIpLGY9Yz91KGMpOm51bGw7ZC5wcmV2aW91c1NpYmxpbmc9Yz9mLnByZXZpb3VzU2libGluZzpiLl9fc2hhZHlfbGFzdENoaWxkO2lmKGY9dihkLnByZXZpb3VzU2libGluZykpZi5uZXh0U2libGluZz1hO2lmKGY9dihkLm5leHRTaWJsaW5nPWMpKWYucHJldmlvdXNTaWJsaW5nPWE7ZC5wYXJlbnROb2RlPWI7Yz9jPT09ZS5maXJzdENoaWxkJiYoZS5maXJzdENoaWxkPWEpOihlLmxhc3RDaGlsZD1hLGUuZmlyc3RDaGlsZHx8KGUuZmlyc3RDaGlsZD1hKSk7ZS5jaGlsZE5vZGVzPW51bGx9CmZ1bmN0aW9uIGhjKGEsYixjKXtGYihiKTt2YXIgZD11KGIpO3ZvaWQgMCE9PWQuZmlyc3RDaGlsZCYmKGQuY2hpbGROb2Rlcz1udWxsKTtpZihhLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKXtkPWEuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKWdjKGRbZV0sYixjKTthPXUoYSk7Yj12b2lkIDAhPT1hLmZpcnN0Q2hpbGQ/bnVsbDp2b2lkIDA7YS5maXJzdENoaWxkPWEubGFzdENoaWxkPWI7YS5jaGlsZE5vZGVzPWJ9ZWxzZSBnYyhhLGIsYyl9CmZ1bmN0aW9uIGljKGEsYil7dmFyIGM9dShhKTtiPXUoYik7YT09PWIuZmlyc3RDaGlsZCYmKGIuZmlyc3RDaGlsZD1jLm5leHRTaWJsaW5nKTthPT09Yi5sYXN0Q2hpbGQmJihiLmxhc3RDaGlsZD1jLnByZXZpb3VzU2libGluZyk7YT1jLnByZXZpb3VzU2libGluZzt2YXIgZD1jLm5leHRTaWJsaW5nO2EmJih1KGEpLm5leHRTaWJsaW5nPWQpO2QmJih1KGQpLnByZXZpb3VzU2libGluZz1hKTtjLnBhcmVudE5vZGU9Yy5wcmV2aW91c1NpYmxpbmc9Yy5uZXh0U2libGluZz12b2lkIDA7dm9pZCAwIT09Yi5jaGlsZE5vZGVzJiYoYi5jaGlsZE5vZGVzPW51bGwpfQpmdW5jdGlvbiBqYyhhKXt2YXIgYj11KGEpO2lmKHZvaWQgMD09PWIuZmlyc3RDaGlsZCl7Yi5jaGlsZE5vZGVzPW51bGw7dmFyIGM9Yi5maXJzdENoaWxkPWEuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZHx8bnVsbDtiLmxhc3RDaGlsZD1hLl9fc2hhZHlfbmF0aXZlX2xhc3RDaGlsZHx8bnVsbDtGYihhKTtiPWM7Zm9yKGM9dm9pZCAwO2I7Yj1iLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nKXt2YXIgZD11KGIpO2QucGFyZW50Tm9kZT1hO2QubmV4dFNpYmxpbmc9Yi5fX3NoYWR5X25hdGl2ZV9uZXh0U2libGluZ3x8bnVsbDtkLnByZXZpb3VzU2libGluZz1jfHxudWxsO2M9YjtFYihiKX19fTt2YXIga2M9bnVsbDtmdW5jdGlvbiBHKCl7a2N8fChrYz13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5TY29waW5nU2hpbSk7cmV0dXJuIGtjfHxudWxsfWZ1bmN0aW9uIGxjKGEsYil7dmFyIGM9RygpO2MmJmMudW5zY29wZU5vZGUoYSxiKX1mdW5jdGlvbiBtYyhhLGIpe3ZhciBjPUcoKTtpZighYylyZXR1cm4hMDtpZihhLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKXtjPSEwO2E9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBkPTA7YyYmZDxhLmxlbmd0aDtkKyspYz1jJiZtYyhhW2RdLGIpO3JldHVybiBjfXJldHVybiBhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU/ITA6Yy5jdXJyZW50U2NvcGVGb3JOb2RlKGEpPT09Yn1mdW5jdGlvbiBuYyhhKXtpZihhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIiI7dmFyIGI9RygpO3JldHVybiBiP2IuY3VycmVudFNjb3BlRm9yTm9kZShhKToiIn0KZnVuY3Rpb24gb2MoYSxiKXtpZihhKXthLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJmIoYSk7YT1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkO2M8YS5sZW5ndGg7YysrKWQ9YVtjXSxkLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJm9jKGQsYil9fTt2YXIgcGM9d2luZG93LmRvY3VtZW50LHFjPXcub2EscmM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwiaXNDb25uZWN0ZWQiKSxzYz1yYyYmcmMuZ2V0O2Z1bmN0aW9uIHRjKGEpe2Zvcih2YXIgYjtiPWEuX19zaGFkeV9maXJzdENoaWxkOylhLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYil9ZnVuY3Rpb24gdWMoYSl7dmFyIGI9dihhKTtpZihiJiZ2b2lkIDAhPT1iLkspe2I9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBjPTAsZD1iLmxlbmd0aCxlPXZvaWQgMDtjPGQmJihlPWJbY10pO2MrKyl1YyhlKX1pZihhPXYoYSkpYS5LPXZvaWQgMH1mdW5jdGlvbiB2YyhhKXt2YXIgYj1hO2EmJiJzbG90Ij09PWEubG9jYWxOYW1lJiYoYj0oYj0oYj12KGEpKSYmYi5EKSYmYi5sZW5ndGg/YlswXTp2YyhhLl9fc2hhZHlfbmV4dFNpYmxpbmcpKTtyZXR1cm4gYn0KZnVuY3Rpb24gd2MoYSxiLGMpe2lmKGE9KGE9dihhKSkmJmEuSCliJiZhLmFkZGVkTm9kZXMucHVzaChiKSxjJiZhLnJlbW92ZWROb2Rlcy5wdXNoKGMpLGFiKGEpfQp2YXIgQ2M9Qih7Z2V0IHBhcmVudE5vZGUoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5wYXJlbnROb2RlO3JldHVybiB2b2lkIDAhPT1hP2E6dGhpcy5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlfSxnZXQgZmlyc3RDaGlsZCgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLmZpcnN0Q2hpbGQ7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGR9LGdldCBsYXN0Q2hpbGQoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5sYXN0Q2hpbGQ7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX2xhc3RDaGlsZH0sZ2V0IG5leHRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTthPWEmJmEubmV4dFNpYmxpbmc7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nfSxnZXQgcHJldmlvdXNTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTthPWEmJmEucHJldmlvdXNTaWJsaW5nO3JldHVybiB2b2lkIDAhPT1hP2E6dGhpcy5fX3NoYWR5X25hdGl2ZV9wcmV2aW91c1NpYmxpbmd9LApnZXQgY2hpbGROb2Rlcygpe2lmKHkodGhpcykpe3ZhciBhPXYodGhpcyk7aWYoIWEuY2hpbGROb2Rlcyl7YS5jaGlsZE5vZGVzPVtdO2Zvcih2YXIgYj10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKWEuY2hpbGROb2Rlcy5wdXNoKGIpfXZhciBjPWEuY2hpbGROb2Rlc31lbHNlIGM9dGhpcy5fX3NoYWR5X25hdGl2ZV9jaGlsZE5vZGVzO2MuaXRlbT1mdW5jdGlvbihhKXtyZXR1cm4gY1thXX07cmV0dXJuIGN9LGdldCBwYXJlbnRFbGVtZW50KCl7dmFyIGE9dih0aGlzKTsoYT1hJiZhLnBhcmVudE5vZGUpJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREUmJihhPW51bGwpO3JldHVybiB2b2lkIDAhPT1hP2E6dGhpcy5fX3NoYWR5X25hdGl2ZV9wYXJlbnRFbGVtZW50fSxnZXQgaXNDb25uZWN0ZWQoKXtpZihzYyYmc2MuY2FsbCh0aGlzKSlyZXR1cm4hMDtpZih0aGlzLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpcmV0dXJuITE7CnZhciBhPXRoaXMub3duZXJEb2N1bWVudDtpZihUYSl7aWYoYS5fX3NoYWR5X25hdGl2ZV9jb250YWlucyh0aGlzKSlyZXR1cm4hMH1lbHNlIGlmKGEuZG9jdW1lbnRFbGVtZW50JiZhLmRvY3VtZW50RWxlbWVudC5fX3NoYWR5X25hdGl2ZV9jb250YWlucyh0aGlzKSlyZXR1cm4hMDtmb3IoYT10aGlzO2EmJiEoYSBpbnN0YW5jZW9mIERvY3VtZW50KTspYT1hLl9fc2hhZHlfcGFyZW50Tm9kZXx8KHooYSk/YS5ob3N0OnZvaWQgMCk7cmV0dXJuISEoYSYmYSBpbnN0YW5jZW9mIERvY3VtZW50KX0sZ2V0IHRleHRDb250ZW50KCl7aWYoeSh0aGlzKSl7Zm9yKHZhciBhPVtdLGI9MCxjPXRoaXMuX19zaGFkeV9jaGlsZE5vZGVzLGQ7ZD1jW2JdO2IrKylkLm5vZGVUeXBlIT09Tm9kZS5DT01NRU5UX05PREUmJmEucHVzaChkLl9fc2hhZHlfdGV4dENvbnRlbnQpO3JldHVybiBhLmpvaW4oIiIpfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3RleHRDb250ZW50fSxzZXQgdGV4dENvbnRlbnQoYSl7aWYoInVuZGVmaW5lZCI9PT0KdHlwZW9mIGF8fG51bGw9PT1hKWE9IiI7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6aWYoIXkodGhpcykmJncubSl7dmFyIGI9dGhpcy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KGIhPXRoaXMuX19zaGFkeV9sYXN0Q2hpbGR8fGImJmIubm9kZVR5cGUhPU5vZGUuVEVYVF9OT0RFKSYmdGModGhpcyk7dGhpcy5fX3NoYWR5X25hdGl2ZV90ZXh0Q29udGVudD1hfWVsc2UgdGModGhpcyksKDA8YS5sZW5ndGh8fHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJnRoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYSkpO2JyZWFrO2RlZmF1bHQ6dGhpcy5ub2RlVmFsdWU9YX19LGluc2VydEJlZm9yZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMub3duZXJEb2N1bWVudCE9PXBjJiZhLm93bmVyRG9jdW1lbnQhPT1wYylyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9pbnNlcnRCZWZvcmUoYSwKYiksYTtpZihhPT09dGhpcyl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2FwcGVuZENoaWxkJyBvbiAnTm9kZSc6IFRoZSBuZXcgY2hpbGQgZWxlbWVudCBjb250YWlucyB0aGUgcGFyZW50LiIpO2lmKGIpe3ZhciBjPXYoYik7Yz1jJiZjLnBhcmVudE5vZGU7aWYodm9pZCAwIT09YyYmYyE9PXRoaXN8fHZvaWQgMD09PWMmJmIuX19zaGFkeV9uYXRpdmVfcGFyZW50Tm9kZSE9PXRoaXMpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdpbnNlcnRCZWZvcmUnIG9uICdOb2RlJzogVGhlIG5vZGUgYmVmb3JlIHdoaWNoIHRoZSBuZXcgbm9kZSBpcyB0byBiZSBpbnNlcnRlZCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIG5vZGUuIik7fWlmKGI9PT1hKXJldHVybiBhO3ZhciBkPVtdLGU9KGM9eGModGhpcykpP2MuaG9zdC5sb2NhbE5hbWU6bmModGhpcyksZj1hLl9fc2hhZHlfcGFyZW50Tm9kZTtpZihmKXt2YXIgZz1uYyhhKTtmLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYSwhIWN8fAoheGMoYSkpfWY9ITA7dmFyIGg9KCFxY3x8dm9pZCAwPT09YS5fX25vSW5zZXJ0aW9uUG9pbnQpJiYhbWMoYSxlKSxrPWMmJiFhLl9fbm9JbnNlcnRpb25Qb2ludCYmKCFxY3x8YS5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSk7aWYoa3x8aCloJiYoZz1nfHxuYyhhKSksb2MoYSxmdW5jdGlvbihhKXtrJiYic2xvdCI9PT1hLmxvY2FsTmFtZSYmZC5wdXNoKGEpO2lmKGgpe3ZhciBiPWc7RygpJiYoYiYmbGMoYSxiKSwoYj1HKCkpJiZiLnNjb3BlTm9kZShhLGUpKX19KTtpZigic2xvdCI9PT10aGlzLmxvY2FsTmFtZXx8ZC5sZW5ndGgpZC5sZW5ndGgmJihjLmM9Yy5jfHxbXSxjLmE9Yy5hfHxbXSxjLmI9Yy5ifHx7fSxjLmMucHVzaC5hcHBseShjLmMsZCBpbnN0YW5jZW9mIEFycmF5P2Q6amEoaWEoZCkpKSksYyYmQWMoYyk7eSh0aGlzKSYmKGhjKGEsdGhpcyxiKSxjPXYodGhpcyksTGEodGhpcyk/KEFjKGMucm9vdCksZj0hMSk6Yy5yb290JiYoZj0hMSkpO2Y/CihjPXoodGhpcyk/dGhpcy5ob3N0OnRoaXMsYj8oYj12YyhiKSxjLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShhLGIpKTpjLl9fc2hhZHlfbmF0aXZlX2FwcGVuZENoaWxkKGEpKTphLm93bmVyRG9jdW1lbnQhPT10aGlzLm93bmVyRG9jdW1lbnQmJnRoaXMub3duZXJEb2N1bWVudC5hZG9wdE5vZGUoYSk7d2ModGhpcyxhKTtyZXR1cm4gYX0sYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSl9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iPyExOmI7aWYodGhpcy5vd25lckRvY3VtZW50IT09cGMpcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYSk7aWYoYS5fX3NoYWR5X3BhcmVudE5vZGUhPT10aGlzKXRocm93IEVycm9yKCJUaGUgbm9kZSB0byBiZSByZW1vdmVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZTogIithKTt2YXIgYz14YyhhKSxkPWMmJkJjKGMsYSksZT12KHRoaXMpOwppZih5KHRoaXMpJiYoaWMoYSx0aGlzKSxMYSh0aGlzKSkpe0FjKGUucm9vdCk7dmFyIGY9ITB9aWYoRygpJiYhYiYmYyl7dmFyIGc9bmMoYSk7b2MoYSxmdW5jdGlvbihhKXtsYyhhLGcpfSl9dWMoYSk7YyYmKChiPXRoaXMmJiJzbG90Ij09PXRoaXMubG9jYWxOYW1lKSYmKGY9ITApLChkfHxiKSYmQWMoYykpO2Z8fChmPXoodGhpcyk/dGhpcy5ob3N0OnRoaXMsKCFlLnJvb3QmJiJzbG90IiE9PWEubG9jYWxOYW1lfHxmPT09YS5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlKSYmZi5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChhKSk7d2ModGhpcyxudWxsLGEpO3JldHVybiBhfSxyZXBsYWNlQ2hpbGQ6ZnVuY3Rpb24oYSxiKXt0aGlzLl9fc2hhZHlfaW5zZXJ0QmVmb3JlKGEsYik7dGhpcy5fX3NoYWR5X3JlbW92ZUNoaWxkKGIpO3JldHVybiBhfSxjbG9uZU5vZGU6ZnVuY3Rpb24oYSl7aWYoInRlbXBsYXRlIj09dGhpcy5sb2NhbE5hbWUpcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfY2xvbmVOb2RlKGEpOwp2YXIgYj10aGlzLl9fc2hhZHlfbmF0aXZlX2Nsb25lTm9kZSghMSk7aWYoYSYmYi5ub2RlVHlwZSE9PU5vZGUuQVRUUklCVVRFX05PREUpe2E9dGhpcy5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBjPTAsZDtjPGEubGVuZ3RoO2MrKylkPWFbY10uX19zaGFkeV9jbG9uZU5vZGUoITApLGIuX19zaGFkeV9hcHBlbmRDaGlsZChkKX1yZXR1cm4gYn0sZ2V0Um9vdE5vZGU6ZnVuY3Rpb24oYSl7aWYodGhpcyYmdGhpcy5ub2RlVHlwZSl7dmFyIGI9dSh0aGlzKSxjPWIuSzt2b2lkIDA9PT1jJiYoeih0aGlzKT8oYz10aGlzLGIuSz1jKTooYz0oYz10aGlzLl9fc2hhZHlfcGFyZW50Tm9kZSk/Yy5fX3NoYWR5X2dldFJvb3ROb2RlKGEpOnRoaXMsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpJiYoYi5LPWMpKSk7cmV0dXJuIGN9fSxjb250YWluczpmdW5jdGlvbihhKXtyZXR1cm4gVWEodGhpcyxhKX19KTtmdW5jdGlvbiBEYyhhLGIsYyl7dmFyIGQ9W107RWMoYS5fX3NoYWR5X2NoaWxkTm9kZXMsYixjLGQpO3JldHVybiBkfWZ1bmN0aW9uIEVjKGEsYixjLGQpe2Zvcih2YXIgZT0wLGY9YS5sZW5ndGgsZz12b2lkIDA7ZTxmJiYoZz1hW2VdKTtlKyspe3ZhciBoO2lmKGg9Zy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXtoPWc7dmFyIGs9YixsPWMsbT1kLHE9ayhoKTtxJiZtLnB1c2goaCk7bCYmbChxKT9oPXE6KEVjKGguX19zaGFkeV9jaGlsZE5vZGVzLGssbCxtKSxoPXZvaWQgMCl9aWYoaClicmVha319CnZhciBGYz1CKHtnZXQgZmlyc3RFbGVtZW50Q2hpbGQoKXt2YXIgYT12KHRoaXMpO2lmKGEmJnZvaWQgMCE9PWEuZmlyc3RDaGlsZCl7Zm9yKGE9dGhpcy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9uZXh0U2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9maXJzdEVsZW1lbnRDaGlsZH0sZ2V0IGxhc3RFbGVtZW50Q2hpbGQoKXt2YXIgYT12KHRoaXMpO2lmKGEmJnZvaWQgMCE9PWEubGFzdENoaWxkKXtmb3IoYT10aGlzLl9fc2hhZHlfbGFzdENoaWxkO2EmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERTspYT1hLl9fc2hhZHlfcHJldmlvdXNTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2xhc3RFbGVtZW50Q2hpbGR9LGdldCBjaGlsZHJlbigpe3JldHVybiB5KHRoaXMpP1ZhKEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCh0aGlzLl9fc2hhZHlfY2hpbGROb2RlcywKZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERX0pKTp0aGlzLl9fc2hhZHlfbmF0aXZlX2NoaWxkcmVufSxnZXQgY2hpbGRFbGVtZW50Q291bnQoKXt2YXIgYT10aGlzLl9fc2hhZHlfY2hpbGRyZW47cmV0dXJuIGE/YS5sZW5ndGg6MH19KSxHYz1CKHtxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKGEpe3JldHVybiBEYyh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBPYS5jYWxsKGIsYSl9LGZ1bmN0aW9uKGEpe3JldHVybiEhYX0pWzBdfHxudWxsfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKGEsYil7aWYoYil7Yj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9fc2hhZHlfbmF0aXZlX3F1ZXJ5U2VsZWN0b3JBbGwoYSkpO3ZhciBjPXRoaXMuX19zaGFkeV9nZXRSb290Tm9kZSgpO3JldHVybiBiLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3NoYWR5X2dldFJvb3ROb2RlKCk9PWN9KX1yZXR1cm4gRGModGhpcyxmdW5jdGlvbihiKXtyZXR1cm4gT2EuY2FsbChiLAphKX0pfX0pLEhjPXcub2E/T2JqZWN0LmFzc2lnbih7fSxGYyk6RmM7T2JqZWN0LmFzc2lnbihGYyxHYyk7dmFyIEljPUIoe2dldEVsZW1lbnRCeUlkOmZ1bmN0aW9uKGEpe3JldHVybiIiPT09YT9udWxsOkRjKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIGIuaWQ9PWF9LGZ1bmN0aW9uKGEpe3JldHVybiEhYX0pWzBdfHxudWxsfX0pO3ZhciBKYz1CKHtnZXQgYWN0aXZlRWxlbWVudCgpe3ZhciBhPXcubT9kb2N1bWVudC5fX3NoYWR5X25hdGl2ZV9hY3RpdmVFbGVtZW50OmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoIWF8fCFhLm5vZGVUeXBlKXJldHVybiBudWxsO3ZhciBiPSEheih0aGlzKTtpZighKHRoaXM9PT1kb2N1bWVudHx8YiYmdGhpcy5ob3N0IT09YSYmdGhpcy5ob3N0Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKGEpKSlyZXR1cm4gbnVsbDtmb3IoYj14YyhhKTtiJiZiIT09dGhpczspYT1iLmhvc3QsYj14YyhhKTtyZXR1cm4gdGhpcz09PWRvY3VtZW50P2I/bnVsbDphOmI9PT10aGlzP2E6bnVsbH19KTt2YXIgS2M9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJpbmVydCIpLExjPUIoe2dldCBpbm5lckhUTUwoKXtyZXR1cm4geSh0aGlzKT9rYigidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWU/dGhpcy5jb250ZW50OnRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuX19zaGFkeV9jaGlsZE5vZGVzfSk6dGhpcy5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUx9LHNldCBpbm5lckhUTUwoYSl7aWYoInRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lKXRoaXMuX19zaGFkeV9uYXRpdmVfaW5uZXJIVE1MPWE7ZWxzZXt0Yyh0aGlzKTt2YXIgYj10aGlzLmxvY2FsTmFtZXx8ImRpdiI7Yj10aGlzLm5hbWVzcGFjZVVSSSYmdGhpcy5uYW1lc3BhY2VVUkkhPT1LYy5uYW1lc3BhY2VVUkk/S2MuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLGIpOktjLmNyZWF0ZUVsZW1lbnQoYik7Zm9yKHcubT9iLl9fc2hhZHlfbmF0aXZlX2lubmVySFRNTD1hOmIuaW5uZXJIVE1MPQphO2E9Yi5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KXRoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSl9fX0pO3ZhciBNYz1CKHthZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYixjKXsib2JqZWN0IiE9PXR5cGVvZiBjJiYoYz17Y2FwdHVyZTohIWN9KTtjLiQ9dGhpczt0aGlzLmhvc3QuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGEsYixjKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIsYyl7Im9iamVjdCIhPT10eXBlb2YgYyYmKGM9e2NhcHR1cmU6ISFjfSk7Yy4kPXRoaXM7dGhpcy5ob3N0Ll9fc2hhZHlfcmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsYyl9fSk7ZnVuY3Rpb24gTmMoYSxiKXtBKGEsTWMsYik7QShhLEpjLGIpO0EoYSxMYyxiKTtBKGEsRmMsYik7dy5KJiYhYj8oQShhLENjLGIpLEEoYSxJYyxiKSk6dy5tfHwoQShhLEFiKSxBKGEsemIpKX07dmFyIE9jPXt9LFBjPXcuZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzJiYibG9hZGluZyI9PT1kb2N1bWVudC5yZWFkeVN0YXRlLFFjO2Z1bmN0aW9uIFJjKGEpe3ZhciBiPVtdO2RvIGIudW5zaGlmdChhKTt3aGlsZShhPWEuX19zaGFkeV9wYXJlbnROb2RlKTtyZXR1cm4gYn0KZnVuY3Rpb24gU2MoYSxiLGMpe2lmKGEhPT1PYyl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7dGhpcy56YT0iU2hhZHlSb290Ijt0aGlzLmhvc3Q9Yjt0aGlzLm1vZGU9YyYmYy5tb2RlO2pjKGIpO2E9dShiKTthLnJvb3Q9dGhpczthLnBhPSJjbG9zZWQiIT09dGhpcy5tb2RlP3RoaXM6bnVsbDthPXUodGhpcyk7YS5maXJzdENoaWxkPWEubGFzdENoaWxkPWEucGFyZW50Tm9kZT1hLm5leHRTaWJsaW5nPWEucHJldmlvdXNTaWJsaW5nPW51bGw7YS5jaGlsZE5vZGVzPVtdO3RoaXMuYmE9dGhpcy5CPSExO3RoaXMuYz10aGlzLmI9dGhpcy5hPW51bGw7aWYody5wcmVmZXJQZXJmb3JtYW5jZSlmb3IoO2E9Yi5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkOyliLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGEpO2Vsc2UgQWModGhpcyl9ZnVuY3Rpb24gQWMoYSl7YS5CfHwoYS5CPSEwLFlhKGZ1bmN0aW9uKCl7cmV0dXJuIFRjKGEpfSkpfQpmdW5jdGlvbiBUYyhhKXt2YXIgYjtpZihiPWEuQil7Zm9yKHZhciBjO2E7KWE6e2EuQiYmKGM9YSksYj1hO2E9Yi5ob3N0Ll9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtpZih6KGEpJiYoYj12KGIuaG9zdCkpJiYwPGIuTilicmVhayBhO2E9dm9pZCAwfWI9Y30oYz1iKSYmYy5fcmVuZGVyU2VsZigpfQpTYy5wcm90b3R5cGUuX3JlbmRlclNlbGY9ZnVuY3Rpb24oKXt2YXIgYT1QYztQYz0hMDt0aGlzLkI9ITE7aWYodGhpcy5hKXtVYyh0aGlzKTtmb3IodmFyIGI9MCxjO2I8dGhpcy5hLmxlbmd0aDtiKyspe2M9dGhpcy5hW2JdO3ZhciBkPXYoYyksZT1kLmFzc2lnbmVkTm9kZXM7ZC5hc3NpZ25lZE5vZGVzPVtdO2QuRD1bXTtpZihkLmNhPWUpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyl7dmFyIGY9dihlW2RdKTtmLlA9Zi5hc3NpZ25lZFNsb3Q7Zi5hc3NpZ25lZFNsb3Q9PT1jJiYoZi5hc3NpZ25lZFNsb3Q9bnVsbCl9fWZvcihiPXRoaXMuaG9zdC5fX3NoYWR5X2ZpcnN0Q2hpbGQ7YjtiPWIuX19zaGFkeV9uZXh0U2libGluZylWYyh0aGlzLGIpO2ZvcihiPTA7Yjx0aGlzLmEubGVuZ3RoO2IrKyl7Yz10aGlzLmFbYl07ZT12KGMpO2lmKCFlLmFzc2lnbmVkTm9kZXMubGVuZ3RoKWZvcihkPWMuX19zaGFkeV9maXJzdENoaWxkO2Q7ZD1kLl9fc2hhZHlfbmV4dFNpYmxpbmcpVmModGhpcywKZCxjKTsoZD0oZD12KGMuX19zaGFkeV9wYXJlbnROb2RlKSkmJmQucm9vdCkmJihNYShkKXx8ZC5CKSYmZC5fcmVuZGVyU2VsZigpO1djKHRoaXMsZS5ELGUuYXNzaWduZWROb2Rlcyk7aWYoZD1lLmNhKXtmb3IoZj0wO2Y8ZC5sZW5ndGg7ZisrKXYoZFtmXSkuUD1udWxsO2UuY2E9bnVsbDtkLmxlbmd0aD5lLmFzc2lnbmVkTm9kZXMubGVuZ3RoJiYoZS5UPSEwKX1lLlQmJihlLlQ9ITEsWGModGhpcyxjKSl9Yz10aGlzLmE7Yj1bXTtmb3IoZT0wO2U8Yy5sZW5ndGg7ZSsrKWQ9Y1tlXS5fX3NoYWR5X3BhcmVudE5vZGUsKGY9dihkKSkmJmYucm9vdHx8ISgwPmIuaW5kZXhPZihkKSl8fGIucHVzaChkKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXtmPWJbY107ZT1mPT09dGhpcz90aGlzLmhvc3Q6ZjtkPVtdO2Y9Zi5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspe3ZhciBoPWZbZ107aWYoInNsb3QiPT1oLmxvY2FsTmFtZSl7aD12KGgpLkQ7Zm9yKHZhciBrPQowO2s8aC5sZW5ndGg7aysrKWQucHVzaChoW2tdKX1lbHNlIGQucHVzaChoKX1mPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuX19zaGFkeV9uYXRpdmVfY2hpbGROb2Rlcyk7Zz1lYyhkLGQubGVuZ3RoLGYsZi5sZW5ndGgpO2s9aD0wO2Zvcih2YXIgbD12b2lkIDA7aDxnLmxlbmd0aCYmKGw9Z1toXSk7aCsrKXtmb3IodmFyIG09MCxxPXZvaWQgMDttPGwuTC5sZW5ndGgmJihxPWwuTFttXSk7bSsrKXEuX19zaGFkeV9uYXRpdmVfcGFyZW50Tm9kZT09PWUmJmUuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQocSksZi5zcGxpY2UobC5pbmRleCtrLDEpO2stPWwuUn1rPTA7Zm9yKGw9dm9pZCAwO2s8Zy5sZW5ndGgmJihsPWdba10pO2srKylmb3IoaD1mW2wuaW5kZXhdLG09bC5pbmRleDttPGwuaW5kZXgrbC5SO20rKylxPWRbbV0sZS5fX3NoYWR5X25hdGl2ZV9pbnNlcnRCZWZvcmUocSxoKSxmLnNwbGljZShtLDAscSl9fWlmKCF3LnByZWZlclBlcmZvcm1hbmNlJiYhdGhpcy5iYSlmb3IoYj0KdGhpcy5ob3N0Ll9fc2hhZHlfY2hpbGROb2RlcyxjPTAsZT1iLmxlbmd0aDtjPGU7YysrKWQ9YltjXSxmPXYoZCksZC5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlIT09dGhpcy5ob3N0fHwic2xvdCIhPT1kLmxvY2FsTmFtZSYmZi5hc3NpZ25lZFNsb3R8fHRoaXMuaG9zdC5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChkKTt0aGlzLmJhPSEwO1BjPWE7UWMmJlFjKCl9O2Z1bmN0aW9uIFZjKGEsYixjKXt2YXIgZD11KGIpLGU9ZC5QO2QuUD1udWxsO2N8fChjPShhPWEuYltiLl9fc2hhZHlfc2xvdHx8Il9fY2F0Y2hhbGwiXSkmJmFbMF0pO2M/KHUoYykuYXNzaWduZWROb2Rlcy5wdXNoKGIpLGQuYXNzaWduZWRTbG90PWMpOmQuYXNzaWduZWRTbG90PXZvaWQgMDtlIT09ZC5hc3NpZ25lZFNsb3QmJmQuYXNzaWduZWRTbG90JiYodShkLmFzc2lnbmVkU2xvdCkuVD0hMCl9CmZ1bmN0aW9uIFdjKGEsYixjKXtmb3IodmFyIGQ9MCxlPXZvaWQgMDtkPGMubGVuZ3RoJiYoZT1jW2RdKTtkKyspaWYoInNsb3QiPT1lLmxvY2FsTmFtZSl7dmFyIGY9dihlKS5hc3NpZ25lZE5vZGVzO2YmJmYubGVuZ3RoJiZXYyhhLGIsZil9ZWxzZSBiLnB1c2goY1tkXSl9ZnVuY3Rpb24gWGMoYSxiKXtiLl9fc2hhZHlfbmF0aXZlX2Rpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJzbG90Y2hhbmdlIikpO2I9dihiKTtiLmFzc2lnbmVkU2xvdCYmWGMoYSxiLmFzc2lnbmVkU2xvdCl9CmZ1bmN0aW9uIFVjKGEpe2lmKGEuYyYmYS5jLmxlbmd0aCl7Zm9yKHZhciBiPWEuYyxjLGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXTtqYyhlKTt2YXIgZj1lLl9fc2hhZHlfcGFyZW50Tm9kZTtqYyhmKTtmPXYoZik7Zi5OPShmLk58fDApKzE7Zj1ZYyhlKTthLmJbZl0/KGM9Y3x8e30sY1tmXT0hMCxhLmJbZl0ucHVzaChlKSk6YS5iW2ZdPVtlXTthLmEucHVzaChlKX1pZihjKWZvcih2YXIgZyBpbiBjKWEuYltnXT1aYyhhLmJbZ10pO2EuYz1bXX19ZnVuY3Rpb24gWWMoYSl7dmFyIGI9YS5uYW1lfHxhLmdldEF0dHJpYnV0ZSgibmFtZSIpfHwiX19jYXRjaGFsbCI7cmV0dXJuIGEud2E9Yn0KZnVuY3Rpb24gWmMoYSl7cmV0dXJuIGEuc29ydChmdW5jdGlvbihhLGMpe2E9UmMoYSk7Zm9yKHZhciBiPVJjKGMpLGU9MDtlPGEubGVuZ3RoO2UrKyl7Yz1hW2VdO3ZhciBmPWJbZV07aWYoYyE9PWYpcmV0dXJuIGE9QXJyYXkuZnJvbShjLl9fc2hhZHlfcGFyZW50Tm9kZS5fX3NoYWR5X2NoaWxkTm9kZXMpLGEuaW5kZXhPZihjKS1hLmluZGV4T2YoZil9fSl9CmZ1bmN0aW9uIEJjKGEsYil7aWYoYS5hKXtVYyhhKTt2YXIgYz1hLmIsZDtmb3IoZCBpbiBjKWZvcih2YXIgZT1jW2RdLGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIGc9ZVtmXTtpZihVYShiLGcpKXtlLnNwbGljZShmLDEpO3ZhciBoPWEuYS5pbmRleE9mKGcpOzA8PWgmJihhLmEuc3BsaWNlKGgsMSksKGg9dihnLl9fc2hhZHlfcGFyZW50Tm9kZSkpJiZoLk4mJmguTi0tKTtmLS07Zz12KGcpO2lmKGg9Zy5EKWZvcih2YXIgaz0wO2s8aC5sZW5ndGg7aysrKXt2YXIgbD1oW2tdLG09bC5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlO20mJm0uX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQobCl9Zy5EPVtdO2cuYXNzaWduZWROb2Rlcz1bXTtoPSEwfX1yZXR1cm4gaH19ZnVuY3Rpb24gTWEoYSl7VWMoYSk7cmV0dXJuISghYS5hfHwhYS5hLmxlbmd0aCl9CihmdW5jdGlvbihhKXthLl9fcHJvdG9fXz1Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZTtOYyhhLCJfX3NoYWR5XyIpO05jKGEpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEse25vZGVUeXBlOnt2YWx1ZTpOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUsY29uZmlndXJhYmxlOiEwfSxub2RlTmFtZTp7dmFsdWU6IiNkb2N1bWVudC1mcmFnbWVudCIsY29uZmlndXJhYmxlOiEwfSxub2RlVmFsdWU6e3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOiEwfX0pO1sibG9jYWxOYW1lIiwibmFtZXNwYWNlVVJJIiwicHJlZml4Il0uZm9yRWFjaChmdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHt2YWx1ZTp2b2lkIDAsY29uZmlndXJhYmxlOiEwfSl9KTtbIm93bmVyRG9jdW1lbnQiLCJiYXNlVVJJIiwiaXNDb25uZWN0ZWQiXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhvc3RbYl19LApjb25maWd1cmFibGU6ITB9KX0pfSkoU2MucHJvdG90eXBlKTsKaWYod2luZG93LmN1c3RvbUVsZW1lbnRzJiZ3LmVhJiYhdy5wcmVmZXJQZXJmb3JtYW5jZSl7dmFyICRjPW5ldyBNYXA7UWM9ZnVuY3Rpb24oKXt2YXIgYT1bXTskYy5mb3JFYWNoKGZ1bmN0aW9uKGIsYyl7YS5wdXNoKFtjLGJdKX0pOyRjLmNsZWFyKCk7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPWFbYl1bMF07YVtiXVsxXT9jLnVhKCk6Yy52YSgpfX07UGMmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKCl7UGM9ITE7UWMoKX0se29uY2U6ITB9KTt2YXIgYWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPTAsZT0iX19pc0Nvbm5lY3RlZCIrZCsrO2lmKGJ8fGMpYS5wcm90b3R5cGUuY29ubmVjdGVkQ2FsbGJhY2s9YS5wcm90b3R5cGUudWE9ZnVuY3Rpb24oKXtQYz8kYy5zZXQodGhpcywhMCk6dGhpc1tlXXx8KHRoaXNbZV09ITAsYiYmYi5jYWxsKHRoaXMpKX0sYS5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9CmEucHJvdG90eXBlLnZhPWZ1bmN0aW9uKCl7UGM/dGhpcy5pc0Nvbm5lY3RlZHx8JGMuc2V0KHRoaXMsITEpOnRoaXNbZV0mJih0aGlzW2VdPSExLGMmJmMuY2FsbCh0aGlzKSl9O3JldHVybiBhfSxiZD13aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5LnByb3RvdHlwZSwiZGVmaW5lIix7dmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjayxkPWIucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrO2JkLmNhbGwod2luZG93LmN1c3RvbUVsZW1lbnRzLGEsYWQoYixjLGQpKTtiLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1jO2IucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrPWR9fSl9ZnVuY3Rpb24geGMoYSl7YT1hLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtpZih6KGEpKXJldHVybiBhfTtmdW5jdGlvbiBjZChhKXt0aGlzLm5vZGU9YX1uPWNkLnByb3RvdHlwZTtuLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGEsYixjKX07bi5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsYyl9O24uYXBwZW5kQ2hpbGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FwcGVuZENoaWxkKGEpfTtuLmluc2VydEJlZm9yZT1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSxiKX07bi5yZW1vdmVDaGlsZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYSl9O24ucmVwbGFjZUNoaWxkPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3JlcGxhY2VDaGlsZChhLGIpfTsKbi5jbG9uZU5vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Nsb25lTm9kZShhKX07bi5nZXRSb290Tm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZ2V0Um9vdE5vZGUoYSl9O24uY29udGFpbnM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NvbnRhaW5zKGEpfTtuLmRpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Rpc3BhdGNoRXZlbnQoYSl9O24uc2V0QXR0cmlidXRlPWZ1bmN0aW9uKGEsYil7dGhpcy5ub2RlLl9fc2hhZHlfc2V0QXR0cmlidXRlKGEsYil9O24uZ2V0QXR0cmlidXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uYXRpdmVfZ2V0QXR0cmlidXRlKGEpfTtuLmhhc0F0dHJpYnV0ZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2hhc0F0dHJpYnV0ZShhKX07bi5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24oYSl7dGhpcy5ub2RlLl9fc2hhZHlfcmVtb3ZlQXR0cmlidXRlKGEpfTsKbi5hdHRhY2hTaGFkb3c9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2F0dGFjaFNoYWRvdyhhKX07bi5mb2N1cz1mdW5jdGlvbigpe3RoaXMubm9kZS5fX3NoYWR5X25hdGl2ZV9mb2N1cygpfTtuLmJsdXI9ZnVuY3Rpb24oKXt0aGlzLm5vZGUuX19zaGFkeV9ibHVyKCl9O24uaW1wb3J0Tm9kZT1mdW5jdGlvbihhLGIpe2lmKHRoaXMubm9kZS5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfTk9ERSlyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfaW1wb3J0Tm9kZShhLGIpfTtuLmdldEVsZW1lbnRCeUlkPWZ1bmN0aW9uKGEpe2lmKHRoaXMubm9kZS5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfTk9ERSlyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZ2V0RWxlbWVudEJ5SWQoYSl9O24ucXVlcnlTZWxlY3Rvcj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcXVlcnlTZWxlY3RvcihhKX07Cm4ucXVlcnlTZWxlY3RvckFsbD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9xdWVyeVNlbGVjdG9yQWxsKGEsYil9O24uYXNzaWduZWROb2Rlcz1mdW5jdGlvbihhKXtpZigic2xvdCI9PT10aGlzLm5vZGUubG9jYWxOYW1lKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hc3NpZ25lZE5vZGVzKGEpfTsKcC5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhjZC5wcm90b3R5cGUse2FjdGl2ZUVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHoodGhpcy5ub2RlKXx8dGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hY3RpdmVFbGVtZW50fX0sX2FjdGl2ZUVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZUVsZW1lbnR9fSxob3N0Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZih6KHRoaXMubm9kZSkpcmV0dXJuIHRoaXMubm9kZS5ob3N0fX0scGFyZW50Tm9kZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3BhcmVudE5vZGV9fSxmaXJzdENoaWxkOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2ZpcnN0Q2hpbGR9fSxsYXN0Q2hpbGQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9sYXN0Q2hpbGR9fSxuZXh0U2libGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25leHRTaWJsaW5nfX0scHJldmlvdXNTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcHJldmlvdXNTaWJsaW5nfX0sY2hpbGROb2Rlczp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NoaWxkTm9kZXN9fSxwYXJlbnRFbGVtZW50Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCwKZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3BhcmVudEVsZW1lbnR9fSxmaXJzdEVsZW1lbnRDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2ZpcnN0RWxlbWVudENoaWxkfX0sbGFzdEVsZW1lbnRDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2xhc3RFbGVtZW50Q2hpbGR9fSxuZXh0RWxlbWVudFNpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uZXh0RWxlbWVudFNpYmxpbmd9fSxwcmV2aW91c0VsZW1lbnRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcHJldmlvdXNFbGVtZW50U2libGluZ319LApjaGlsZHJlbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NoaWxkcmVufX0sY2hpbGRFbGVtZW50Q291bnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9jaGlsZEVsZW1lbnRDb3VudH19LHNoYWRvd1Jvb3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9zaGFkb3dSb290fX0sYXNzaWduZWRTbG90Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXNzaWduZWRTbG90fX0saXNDb25uZWN0ZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pc0Nvbm5lY3RlZH19LGlubmVySFRNTDp7Y29uZmlndXJhYmxlOiEwLAplbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbm5lckhUTUx9LHNldDpmdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9pbm5lckhUTUw9YX19LHRleHRDb250ZW50Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfdGV4dENvbnRlbnR9LHNldDpmdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV90ZXh0Q29udGVudD1hfX0sc2xvdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3Nsb3R9LHNldDpmdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9zbG90PWF9fX0pOwpjYy5mb3JFYWNoKGZ1bmN0aW9uKGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShjZC5wcm90b3R5cGUsYSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZVsiX19zaGFkeV8iK2FdfSxzZXQ6ZnVuY3Rpb24oYil7dGhpcy5ub2RlWyJfX3NoYWR5XyIrYV09Yn0sY29uZmlndXJhYmxlOiEwfSl9KTt2YXIgZGQ9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gZWQoYSl7aWYoeihhKXx8YSBpbnN0YW5jZW9mIGNkKXJldHVybiBhO3ZhciBiPWRkLmdldChhKTtifHwoYj1uZXcgY2QoYSksZGQuc2V0KGEsYikpO3JldHVybiBifTt2YXIgZmQ9Qih7ZGlzcGF0Y2hFdmVudDpmdW5jdGlvbihhKXtaYSgpO3JldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2Rpc3BhdGNoRXZlbnQoYSl9LGFkZEV2ZW50TGlzdGVuZXI6VWIscmVtb3ZlRXZlbnRMaXN0ZW5lcjpXYn0pO3ZhciBnZD1CKHtnZXQgYXNzaWduZWRTbG90KCl7dmFyIGE9dGhpcy5fX3NoYWR5X3BhcmVudE5vZGU7KGE9YSYmYS5fX3NoYWR5X3NoYWRvd1Jvb3QpJiZUYyhhKTtyZXR1cm4oYT12KHRoaXMpKSYmYS5hc3NpZ25lZFNsb3R8fG51bGx9fSk7dmFyIGhkPXdpbmRvdy5kb2N1bWVudDtmdW5jdGlvbiBpZChhLGIpe2lmKCJzbG90Ij09PWIpYT1hLl9fc2hhZHlfcGFyZW50Tm9kZSxMYShhKSYmQWModihhKS5yb290KTtlbHNlIGlmKCJzbG90Ij09PWEubG9jYWxOYW1lJiYibmFtZSI9PT1iJiYoYj14YyhhKSkpe2lmKGIuYSl7VWMoYik7dmFyIGM9YS53YSxkPVljKGEpO2lmKGQhPT1jKXtjPWIuYltjXTt2YXIgZT1jLmluZGV4T2YoYSk7MDw9ZSYmYy5zcGxpY2UoZSwxKTtjPWIuYltkXXx8KGIuYltkXT1bXSk7Yy5wdXNoKGEpOzE8Yy5sZW5ndGgmJihiLmJbZF09WmMoYykpfX1BYyhiKX19CnZhciBqZD1CKHtnZXQgcHJldmlvdXNFbGVtZW50U2libGluZygpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5wcmV2aW91c1NpYmxpbmcpe2ZvcihhPXRoaXMuX19zaGFkeV9wcmV2aW91c1NpYmxpbmc7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9wcmV2aW91c1NpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcHJldmlvdXNFbGVtZW50U2libGluZ30sZ2V0IG5leHRFbGVtZW50U2libGluZygpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5uZXh0U2libGluZyl7Zm9yKGE9dGhpcy5fX3NoYWR5X25leHRTaWJsaW5nO2EmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERTspYT1hLl9fc2hhZHlfbmV4dFNpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfbmV4dEVsZW1lbnRTaWJsaW5nfSxnZXQgc2xvdCgpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgic2xvdCIpfSwKc2V0IHNsb3QoYSl7dGhpcy5fX3NoYWR5X3NldEF0dHJpYnV0ZSgic2xvdCIsYSl9LGdldCBzaGFkb3dSb290KCl7dmFyIGE9dih0aGlzKTtyZXR1cm4gYSYmYS5wYXx8bnVsbH0sZ2V0IGNsYXNzTmFtZSgpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9LHNldCBjbGFzc05hbWUoYSl7dGhpcy5fX3NoYWR5X3NldEF0dHJpYnV0ZSgiY2xhc3MiLGEpfSxzZXRBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxiKXtpZih0aGlzLm93bmVyRG9jdW1lbnQhPT1oZCl0aGlzLl9fc2hhZHlfbmF0aXZlX3NldEF0dHJpYnV0ZShhLGIpO2Vsc2V7dmFyIGM7KGM9RygpKSYmImNsYXNzIj09PWE/KGMuc2V0RWxlbWVudENsYXNzKHRoaXMsYiksYz0hMCk6Yz0hMTtjfHwodGhpcy5fX3NoYWR5X25hdGl2ZV9zZXRBdHRyaWJ1dGUoYSxiKSxpZCh0aGlzLGEpKX19LHJlbW92ZUF0dHJpYnV0ZTpmdW5jdGlvbihhKXt0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUF0dHJpYnV0ZShhKTtpZCh0aGlzLAphKX0sYXR0YWNoU2hhZG93OmZ1bmN0aW9uKGEpe2lmKCF0aGlzKXRocm93IEVycm9yKCJNdXN0IHByb3ZpZGUgYSBob3N0LiIpO2lmKCFhKXRocm93IEVycm9yKCJOb3QgZW5vdWdoIGFyZ3VtZW50cy4iKTtyZXR1cm4gbmV3IFNjKE9jLHRoaXMsYSl9fSk7dmFyIGtkPUIoe2JsdXI6ZnVuY3Rpb24oKXt2YXIgYT12KHRoaXMpOyhhPShhPWEmJmEucm9vdCkmJmEuYWN0aXZlRWxlbWVudCk/YS5fX3NoYWR5X2JsdXIoKTp0aGlzLl9fc2hhZHlfbmF0aXZlX2JsdXIoKX19KTtjYy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2tkW2FdPXtzZXQ6ZnVuY3Rpb24oYil7dmFyIGM9dSh0aGlzKSxkPWEuc3Vic3RyaW5nKDIpO2MuT1thXSYmdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGQsYy5PW2FdKTt0aGlzLl9fc2hhZHlfYWRkRXZlbnRMaXN0ZW5lcihkLGIpO2MuT1thXT1ifSxnZXQ6ZnVuY3Rpb24oKXt2YXIgYj12KHRoaXMpO3JldHVybiBiJiZiLk9bYV19LGNvbmZpZ3VyYWJsZTohMH19KTt2YXIgbGQ9Qih7YXNzaWduZWROb2RlczpmdW5jdGlvbihhKXtpZigic2xvdCI9PT10aGlzLmxvY2FsTmFtZSl7dmFyIGI9dGhpcy5fX3NoYWR5X2dldFJvb3ROb2RlKCk7YiYmeihiKSYmVGMoYik7cmV0dXJuKGI9dih0aGlzKSk/KGEmJmEuZmxhdHRlbj9iLkQ6Yi5hc3NpZ25lZE5vZGVzKXx8W106W119fX0pO3ZhciBtZD13aW5kb3cuZG9jdW1lbnQsbmQ9Qih7aW1wb3J0Tm9kZTpmdW5jdGlvbihhLGIpe2lmKGEub3duZXJEb2N1bWVudCE9PW1kfHwidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUpcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfaW1wb3J0Tm9kZShhLGIpO3ZhciBjPXRoaXMuX19zaGFkeV9uYXRpdmVfaW1wb3J0Tm9kZShhLCExKTtpZihiKXthPWEuX19zaGFkeV9jaGlsZE5vZGVzO2I9MDtmb3IodmFyIGQ7YjxhLmxlbmd0aDtiKyspZD10aGlzLl9fc2hhZHlfaW1wb3J0Tm9kZShhW2JdLCEwKSxjLl9fc2hhZHlfYXBwZW5kQ2hpbGQoZCl9cmV0dXJuIGN9fSk7dmFyIG9kPUIoe2FkZEV2ZW50TGlzdGVuZXI6VWIuYmluZCh3aW5kb3cpLHJlbW92ZUV2ZW50TGlzdGVuZXI6V2IuYmluZCh3aW5kb3cpfSk7dmFyIHBkPXt9O09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJwYXJlbnRFbGVtZW50IikmJihwZC5wYXJlbnRFbGVtZW50PUNjLnBhcmVudEVsZW1lbnQpO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJjb250YWlucyIpJiYocGQuY29udGFpbnM9Q2MuY29udGFpbnMpO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJjaGlsZHJlbiIpJiYocGQuY2hpbGRyZW49RmMuY2hpbGRyZW4pO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSYmKHBkLmlubmVySFRNTD1MYy5pbm5lckhUTUwpO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJjbGFzc05hbWUiKSYmKHBkLmNsYXNzTmFtZT1qZC5jbGFzc05hbWUpOwp2YXIgcWQ9e0V2ZW50VGFyZ2V0OltmZF0sTm9kZTpbQ2Msd2luZG93LkV2ZW50VGFyZ2V0P251bGw6ZmRdLFRleHQ6W2dkXSxFbGVtZW50OltqZCxGYyxnZCwhdy5tfHwiaW5uZXJIVE1MImluIEVsZW1lbnQucHJvdG90eXBlP0xjOm51bGwsd2luZG93LkhUTUxTbG90RWxlbWVudD9udWxsOmxkXSxIVE1MRWxlbWVudDpba2QscGRdLEhUTUxTbG90RWxlbWVudDpbbGRdLERvY3VtZW50RnJhZ21lbnQ6W0hjLEljXSxEb2N1bWVudDpbbmQsSGMsSWMsSmNdLFdpbmRvdzpbb2RdfSxyZD13Lm0/bnVsbDpbImlubmVySFRNTCIsInRleHRDb250ZW50Il07ZnVuY3Rpb24gc2QoYSl7dmFyIGI9YT9udWxsOnJkLGM9e30sZDtmb3IoZCBpbiBxZCljLlc9d2luZG93W2RdJiZ3aW5kb3dbZF0ucHJvdG90eXBlLHFkW2RdLmZvckVhY2goZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBjLlcmJmQmJkEoYy5XLGQsYSxiKX19KGMpKSxjPXtXOmMuV319O2lmKHcuZWEpe3ZhciBTaGFkeURPTT17aW5Vc2U6dy5lYSxwYXRjaDpmdW5jdGlvbihhKXtGYihhKTtFYihhKTtyZXR1cm4gYX0saXNTaGFkeVJvb3Q6eixlbnF1ZXVlOllhLGZsdXNoOlphLGZsdXNoSW5pdGlhbDpmdW5jdGlvbihhKXshYS5iYSYmYS5CJiZUYyhhKX0sc2V0dGluZ3M6dyxmaWx0ZXJNdXRhdGlvbnM6ZGIsb2JzZXJ2ZUNoaWxkcmVuOmJiLHVub2JzZXJ2ZUNoaWxkcmVuOmNiLGRlZmVyQ29ubmVjdGlvbkNhbGxiYWNrczp3LmRlZmVyQ29ubmVjdGlvbkNhbGxiYWNrcyxwcmVmZXJQZXJmb3JtYW5jZTp3LnByZWZlclBlcmZvcm1hbmNlLGhhbmRsZXNEeW5hbWljU2NvcGluZzohMCx3cmFwOncuSj9lZDpmdW5jdGlvbihhKXtyZXR1cm4gYX0sV3JhcHBlcjpjZCxjb21wb3NlZFBhdGg6TWIsbm9QYXRjaDp3LkosbmF0aXZlTWV0aG9kczpxYixuYXRpdmVUcmVlOnJifTt3aW5kb3cuU2hhZHlET009U2hhZHlET007eWIoKTtzZCgiX19zaGFkeV8iKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsCiJfYWN0aXZlRWxlbWVudCIsSmMuYWN0aXZlRWxlbWVudCk7QShXaW5kb3cucHJvdG90eXBlLG9kLCJfX3NoYWR5XyIpO3cuSnx8KHNkKCksYmMoKSk7WGIoKTt3aW5kb3cuRXZlbnQ9WmI7d2luZG93LkN1c3RvbUV2ZW50PSRiO3dpbmRvdy5Nb3VzZUV2ZW50PWFjO3dpbmRvdy5TaGFkb3dSb290PVNjfTt2YXIgdGQ9bmV3IFNldCgiYW5ub3RhdGlvbi14bWwgY29sb3ItcHJvZmlsZSBmb250LWZhY2UgZm9udC1mYWNlLXNyYyBmb250LWZhY2UtdXJpIGZvbnQtZmFjZS1mb3JtYXQgZm9udC1mYWNlLW5hbWUgbWlzc2luZy1nbHlwaCIuc3BsaXQoIiAiKSk7ZnVuY3Rpb24gdWQoYSl7dmFyIGI9dGQuaGFzKGEpO2E9L15bYS16XVsuMC05X2Etel0qLVtcLS4wLTlfYS16XSokLy50ZXN0KGEpO3JldHVybiFiJiZhfWZ1bmN0aW9uIEgoYSl7dmFyIGI9YS5pc0Nvbm5lY3RlZDtpZih2b2lkIDAhPT1iKXJldHVybiBiO2Zvcig7YSYmIShhLl9fQ0VfaXNJbXBvcnREb2N1bWVudHx8YSBpbnN0YW5jZW9mIERvY3VtZW50KTspYT1hLnBhcmVudE5vZGV8fCh3aW5kb3cuU2hhZG93Um9vdCYmYSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q/YS5ob3N0OnZvaWQgMCk7cmV0dXJuISghYXx8IShhLl9fQ0VfaXNJbXBvcnREb2N1bWVudHx8YSBpbnN0YW5jZW9mIERvY3VtZW50KSl9CmZ1bmN0aW9uIHZkKGEsYil7Zm9yKDtiJiZiIT09YSYmIWIubmV4dFNpYmxpbmc7KWI9Yi5wYXJlbnROb2RlO3JldHVybiBiJiZiIT09YT9iLm5leHRTaWJsaW5nOm51bGx9CmZ1bmN0aW9uIHdkKGEsYixjKXtjPXZvaWQgMD09PWM/bmV3IFNldDpjO2Zvcih2YXIgZD1hO2Q7KXtpZihkLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBlPWQ7YihlKTt2YXIgZj1lLmxvY2FsTmFtZTtpZigibGluayI9PT1mJiYiaW1wb3J0Ij09PWUuZ2V0QXR0cmlidXRlKCJyZWwiKSl7ZD1lLmltcG9ydDtpZihkIGluc3RhbmNlb2YgTm9kZSYmIWMuaGFzKGQpKWZvcihjLmFkZChkKSxkPWQuZmlyc3RDaGlsZDtkO2Q9ZC5uZXh0U2libGluZyl3ZChkLGIsYyk7ZD12ZChhLGUpO2NvbnRpbnVlfWVsc2UgaWYoInRlbXBsYXRlIj09PWYpe2Q9dmQoYSxlKTtjb250aW51ZX1pZihlPWUuX19DRV9zaGFkb3dSb290KWZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyl3ZChlLGIsYyl9ZD1kLmZpcnN0Q2hpbGQ/ZC5maXJzdENoaWxkOnZkKGEsZCl9fWZ1bmN0aW9uIEkoYSxiLGMpe2FbYl09Y307ZnVuY3Rpb24geGQoKXt0aGlzLmE9bmV3IE1hcDt0aGlzLmc9bmV3IE1hcDt0aGlzLmY9W107dGhpcy5jPSExfWZ1bmN0aW9uIHlkKGEsYixjKXthLmEuc2V0KGIsYyk7YS5nLnNldChjLmNvbnN0cnVjdG9yRnVuY3Rpb24sYyl9ZnVuY3Rpb24gemQoYSxiKXthLmM9ITA7YS5mLnB1c2goYil9ZnVuY3Rpb24gQWQoYSxiKXthLmMmJndkKGIsZnVuY3Rpb24oYil7cmV0dXJuIGEuYihiKX0pfXhkLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYyYmIWEuX19DRV9wYXRjaGVkKXthLl9fQ0VfcGF0Y2hlZD0hMDtmb3IodmFyIGI9MDtiPHRoaXMuZi5sZW5ndGg7YisrKXRoaXMuZltiXShhKX19O2Z1bmN0aW9uIEooYSxiKXt2YXIgYz1bXTt3ZChiLGZ1bmN0aW9uKGEpe3JldHVybiBjLnB1c2goYSl9KTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKXt2YXIgZD1jW2JdOzE9PT1kLl9fQ0Vfc3RhdGU/YS5jb25uZWN0ZWRDYWxsYmFjayhkKTpCZChhLGQpfX0KZnVuY3Rpb24gSyhhLGIpe3ZhciBjPVtdO3dkKGIsZnVuY3Rpb24oYSl7cmV0dXJuIGMucHVzaChhKX0pO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07MT09PWQuX19DRV9zdGF0ZSYmYS5kaXNjb25uZWN0ZWRDYWxsYmFjayhkKX19CmZ1bmN0aW9uIEwoYSxiLGMpe2M9dm9pZCAwPT09Yz97fTpjO3ZhciBkPWMuWGF8fG5ldyBTZXQsZT1jLll8fGZ1bmN0aW9uKGIpe3JldHVybiBCZChhLGIpfSxmPVtdO3dkKGIsZnVuY3Rpb24oYil7aWYoImxpbmsiPT09Yi5sb2NhbE5hbWUmJiJpbXBvcnQiPT09Yi5nZXRBdHRyaWJ1dGUoInJlbCIpKXt2YXIgYz1iLmltcG9ydDtjIGluc3RhbmNlb2YgTm9kZSYmKGMuX19DRV9pc0ltcG9ydERvY3VtZW50PSEwLGMuX19DRV9oYXNSZWdpc3RyeT0hMCk7YyYmImNvbXBsZXRlIj09PWMucmVhZHlTdGF0ZT9jLl9fQ0VfZG9jdW1lbnRMb2FkSGFuZGxlZD0hMDpiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGZ1bmN0aW9uKCl7dmFyIGM9Yi5pbXBvcnQ7aWYoIWMuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkKXtjLl9fQ0VfZG9jdW1lbnRMb2FkSGFuZGxlZD0hMDt2YXIgZj1uZXcgU2V0KGQpO2YuZGVsZXRlKGMpO0woYSxjLHtYYTpmLFk6ZX0pfX0pfWVsc2UgZi5wdXNoKGIpfSxkKTtpZihhLmMpZm9yKGI9CjA7YjxmLmxlbmd0aDtiKyspYS5iKGZbYl0pO2ZvcihiPTA7YjxmLmxlbmd0aDtiKyspZShmW2JdKX0KZnVuY3Rpb24gQmQoYSxiKXtpZih2b2lkIDA9PT1iLl9fQ0Vfc3RhdGUpe3ZhciBjPWIub3duZXJEb2N1bWVudDtpZihjLmRlZmF1bHRWaWV3fHxjLl9fQ0VfaXNJbXBvcnREb2N1bWVudCYmYy5fX0NFX2hhc1JlZ2lzdHJ5KWlmKGM9YS5hLmdldChiLmxvY2FsTmFtZSkpe2MuY29uc3RydWN0aW9uU3RhY2sucHVzaChiKTt2YXIgZD1jLmNvbnN0cnVjdG9yRnVuY3Rpb247dHJ5e3RyeXtpZihuZXcgZCE9PWIpdGhyb3cgRXJyb3IoIlRoZSBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvciBkaWQgbm90IHByb2R1Y2UgdGhlIGVsZW1lbnQgYmVpbmcgdXBncmFkZWQuIik7fWZpbmFsbHl7Yy5jb25zdHJ1Y3Rpb25TdGFjay5wb3AoKX19Y2F0Y2goZyl7dGhyb3cgYi5fX0NFX3N0YXRlPTIsZzt9Yi5fX0NFX3N0YXRlPTE7Yi5fX0NFX2RlZmluaXRpb249YztpZihjLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaylmb3IoYz1jLm9ic2VydmVkQXR0cmlidXRlcyxkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPQpjW2RdLGY9Yi5nZXRBdHRyaWJ1dGUoZSk7bnVsbCE9PWYmJmEuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGIsZSxudWxsLGYsbnVsbCl9SChiKSYmYS5jb25uZWN0ZWRDYWxsYmFjayhiKX19fXhkLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj1hLl9fQ0VfZGVmaW5pdGlvbjtiLmNvbm5lY3RlZENhbGxiYWNrJiZiLmNvbm5lY3RlZENhbGxiYWNrLmNhbGwoYSl9O3hkLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj1hLl9fQ0VfZGVmaW5pdGlvbjtiLmRpc2Nvbm5lY3RlZENhbGxiYWNrJiZiLmRpc2Nvbm5lY3RlZENhbGxiYWNrLmNhbGwoYSl9Owp4ZC5wcm90b3R5cGUuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS5fX0NFX2RlZmluaXRpb247Zi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2smJi0xPGYub2JzZXJ2ZWRBdHRyaWJ1dGVzLmluZGV4T2YoYikmJmYuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrLmNhbGwoYSxiLGMsZCxlKX07ZnVuY3Rpb24gQ2QoYSl7dmFyIGI9ZG9jdW1lbnQ7dGhpcy5iPWE7dGhpcy5hPWI7dGhpcy5GPXZvaWQgMDtMKHRoaXMuYix0aGlzLmEpOyJsb2FkaW5nIj09PXRoaXMuYS5yZWFkeVN0YXRlJiYodGhpcy5GPW5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuYy5iaW5kKHRoaXMpKSx0aGlzLkYub2JzZXJ2ZSh0aGlzLmEse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSkpfWZ1bmN0aW9uIERkKGEpe2EuRiYmYS5GLmRpc2Nvbm5lY3QoKX1DZC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmEucmVhZHlTdGF0ZTsiaW50ZXJhY3RpdmUiIT09YiYmImNvbXBsZXRlIiE9PWJ8fERkKHRoaXMpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKHZhciBjPWFbYl0uYWRkZWROb2RlcyxkPTA7ZDxjLmxlbmd0aDtkKyspTCh0aGlzLmIsY1tkXSl9O2Z1bmN0aW9uIEVkKCl7dmFyIGE9dGhpczt0aGlzLmE9dGhpcy5oPXZvaWQgMDt0aGlzLmI9bmV3IFByb21pc2UoZnVuY3Rpb24oYil7YS5hPWI7YS5oJiZiKGEuaCl9KX1FZC5wcm90b3R5cGUucmVzb2x2ZT1mdW5jdGlvbihhKXtpZih0aGlzLmgpdGhyb3cgRXJyb3IoIkFscmVhZHkgcmVzb2x2ZWQuIik7dGhpcy5oPWE7dGhpcy5hJiZ0aGlzLmEoYSl9O2Z1bmN0aW9uIE4oYSl7dGhpcy5jPSExO3RoaXMuYT1hO3RoaXMubD1uZXcgTWFwO3RoaXMuZj1mdW5jdGlvbihhKXtyZXR1cm4gYSgpfTt0aGlzLmI9ITE7dGhpcy5nPVtdO3RoaXMuZGE9bmV3IENkKGEpfW49Ti5wcm90b3R5cGU7Cm4uc2E9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO2lmKCEoYiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcnMgbXVzdCBiZSBmdW5jdGlvbnMuIik7aWYoIXVkKGEpKXRocm93IG5ldyBTeW50YXhFcnJvcigiVGhlIGVsZW1lbnQgbmFtZSAnIithKyInIGlzIG5vdCB2YWxpZC4iKTtpZih0aGlzLmEuYS5nZXQoYSkpdGhyb3cgRXJyb3IoIkEgY3VzdG9tIGVsZW1lbnQgd2l0aCBuYW1lICciK2ErIicgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiIpO2lmKHRoaXMuYyl0aHJvdyBFcnJvcigiQSBjdXN0b20gZWxlbWVudCBpcyBhbHJlYWR5IGJlaW5nIGRlZmluZWQuIik7dGhpcy5jPSEwO3RyeXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1lW2FdO2lmKHZvaWQgMCE9PWImJiEoYiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl0aHJvdyBFcnJvcigiVGhlICciK2ErIicgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpOwpyZXR1cm4gYn0sZT1iLnByb3RvdHlwZTtpZighKGUgaW5zdGFuY2VvZiBPYmplY3QpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcidzIHByb3RvdHlwZSBpcyBub3QgYW4gb2JqZWN0LiIpO3ZhciBmPWQoImNvbm5lY3RlZENhbGxiYWNrIik7dmFyIGc9ZCgiZGlzY29ubmVjdGVkQ2FsbGJhY2siKTt2YXIgaD1kKCJhZG9wdGVkQ2FsbGJhY2siKTt2YXIgaz1kKCJhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2siKTt2YXIgbD1iLm9ic2VydmVkQXR0cmlidXRlc3x8W119Y2F0Y2gobSl7cmV0dXJufWZpbmFsbHl7dGhpcy5jPSExfWI9e2xvY2FsTmFtZTphLGNvbnN0cnVjdG9yRnVuY3Rpb246Yixjb25uZWN0ZWRDYWxsYmFjazpmLGRpc2Nvbm5lY3RlZENhbGxiYWNrOmcsYWRvcHRlZENhbGxiYWNrOmgsYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrOmssb2JzZXJ2ZWRBdHRyaWJ1dGVzOmwsY29uc3RydWN0aW9uU3RhY2s6W119O3lkKHRoaXMuYSwKYSxiKTt0aGlzLmcucHVzaChiKTt0aGlzLmJ8fCh0aGlzLmI9ITAsdGhpcy5mKGZ1bmN0aW9uKCl7cmV0dXJuIEZkKGMpfSkpfTtuLlk9ZnVuY3Rpb24oYSl7TCh0aGlzLmEsYSl9OwpmdW5jdGlvbiBGZChhKXtpZighMSE9PWEuYil7YS5iPSExO2Zvcih2YXIgYj1hLmcsYz1bXSxkPW5ldyBNYXAsZT0wO2U8Yi5sZW5ndGg7ZSsrKWQuc2V0KGJbZV0ubG9jYWxOYW1lLFtdKTtMKGEuYSxkb2N1bWVudCx7WTpmdW5jdGlvbihiKXtpZih2b2lkIDA9PT1iLl9fQ0Vfc3RhdGUpe3ZhciBlPWIubG9jYWxOYW1lLGY9ZC5nZXQoZSk7Zj9mLnB1c2goYik6YS5hLmEuZ2V0KGUpJiZjLnB1c2goYil9fX0pO2ZvcihlPTA7ZTxjLmxlbmd0aDtlKyspQmQoYS5hLGNbZV0pO2Zvcig7MDxiLmxlbmd0aDspe3ZhciBmPWIuc2hpZnQoKTtlPWYubG9jYWxOYW1lO2Y9ZC5nZXQoZi5sb2NhbE5hbWUpO2Zvcih2YXIgZz0wO2c8Zi5sZW5ndGg7ZysrKUJkKGEuYSxmW2ddKTsoZT1hLmwuZ2V0KGUpKSYmZS5yZXNvbHZlKHZvaWQgMCl9fX1uLmdldD1mdW5jdGlvbihhKXtpZihhPXRoaXMuYS5hLmdldChhKSlyZXR1cm4gYS5jb25zdHJ1Y3RvckZ1bmN0aW9ufTsKbi50YT1mdW5jdGlvbihhKXtpZighdWQoYSkpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBTeW50YXhFcnJvcigiJyIrYSsiJyBpcyBub3QgYSB2YWxpZCBjdXN0b20gZWxlbWVudCBuYW1lLiIpKTt2YXIgYj10aGlzLmwuZ2V0KGEpO2lmKGIpcmV0dXJuIGIuYjtiPW5ldyBFZDt0aGlzLmwuc2V0KGEsYik7dGhpcy5hLmEuZ2V0KGEpJiYhdGhpcy5nLnNvbWUoZnVuY3Rpb24oYil7cmV0dXJuIGIubG9jYWxOYW1lPT09YX0pJiZiLnJlc29sdmUodm9pZCAwKTtyZXR1cm4gYi5ifTtuLlBhPWZ1bmN0aW9uKGEpe0RkKHRoaXMuZGEpO3ZhciBiPXRoaXMuZjt0aGlzLmY9ZnVuY3Rpb24oYyl7cmV0dXJuIGEoZnVuY3Rpb24oKXtyZXR1cm4gYihjKX0pfX07d2luZG93LkN1c3RvbUVsZW1lbnRSZWdpc3RyeT1OO04ucHJvdG90eXBlLmRlZmluZT1OLnByb3RvdHlwZS5zYTtOLnByb3RvdHlwZS51cGdyYWRlPU4ucHJvdG90eXBlLlk7Ti5wcm90b3R5cGUuZ2V0PU4ucHJvdG90eXBlLmdldDsKTi5wcm90b3R5cGUud2hlbkRlZmluZWQ9Ti5wcm90b3R5cGUudGE7Ti5wcm90b3R5cGUucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjaz1OLnByb3RvdHlwZS5QYTt2YXIgR2Q9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50LEhkPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudE5TLElkPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZSxKZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLnByZXBlbmQsS2Q9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5hcHBlbmQsTGQ9d2luZG93LkRvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLnByZXBlbmQsTWQ9d2luZG93LkRvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLmFwcGVuZCxOZD13aW5kb3cuTm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlLE9kPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZCxQZD13aW5kb3cuTm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlLFFkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5yZW1vdmVDaGlsZCxSZD13aW5kb3cuTm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkLFNkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93Lk5vZGUucHJvdG90eXBlLAoidGV4dENvbnRlbnQiKSxUZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93LFVkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LkVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSxWZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlLFdkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUsWGQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZSxZZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlTlMsWmQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZU5TLCRkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGVOUyxhZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50LGJlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEhUTUwsY2U9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnByZXBlbmQsCmRlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hcHBlbmQsZWU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmJlZm9yZSxmZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYWZ0ZXIsZ2U9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VXaXRoLGhlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5yZW1vdmUsaWU9d2luZG93LkhUTUxFbGVtZW50LGplPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZSwiaW5uZXJIVE1MIiksa2U9d2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQsbGU9d2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEhUTUw7dmFyIG1lPW5ldyBmdW5jdGlvbigpe307ZnVuY3Rpb24gbmUoKXt2YXIgYT1vZTt3aW5kb3cuSFRNTEVsZW1lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dmFyIGI9dGhpcy5jb25zdHJ1Y3RvcixkPWEuZy5nZXQoYik7aWYoIWQpdGhyb3cgRXJyb3IoIlRoZSBjdXN0b20gZWxlbWVudCBiZWluZyBjb25zdHJ1Y3RlZCB3YXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBgY3VzdG9tRWxlbWVudHNgLiIpO3ZhciBlPWQuY29uc3RydWN0aW9uU3RhY2s7aWYoMD09PWUubGVuZ3RoKXJldHVybiBlPUdkLmNhbGwoZG9jdW1lbnQsZC5sb2NhbE5hbWUpLE9iamVjdC5zZXRQcm90b3R5cGVPZihlLGIucHJvdG90eXBlKSxlLl9fQ0Vfc3RhdGU9MSxlLl9fQ0VfZGVmaW5pdGlvbj1kLGEuYihlKSxlO2Q9ZS5sZW5ndGgtMTt2YXIgZj1lW2RdO2lmKGY9PT1tZSl0aHJvdyBFcnJvcigiVGhlIEhUTUxFbGVtZW50IGNvbnN0cnVjdG9yIHdhcyBlaXRoZXIgY2FsbGVkIHJlZW50cmFudGx5IGZvciB0aGlzIGNvbnN0cnVjdG9yIG9yIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4iKTsKZVtkXT1tZTtPYmplY3Quc2V0UHJvdG90eXBlT2YoZixiLnByb3RvdHlwZSk7YS5iKGYpO3JldHVybiBmfWIucHJvdG90eXBlPWllLnByb3RvdHlwZTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5wcm90b3R5cGUsImNvbnN0cnVjdG9yIix7d3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6Yn0pO3JldHVybiBifSgpfTtmdW5jdGlvbiBwZShhLGIsYyl7ZnVuY3Rpb24gZChiKXtyZXR1cm4gZnVuY3Rpb24oYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7KytlKWRbZV09YXJndW1lbnRzW2VdO2U9W107Zm9yKHZhciBmPVtdLGw9MDtsPGQubGVuZ3RoO2wrKyl7dmFyIG09ZFtsXTttIGluc3RhbmNlb2YgRWxlbWVudCYmSChtKSYmZi5wdXNoKG0pO2lmKG0gaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihtPW0uZmlyc3RDaGlsZDttO209bS5uZXh0U2libGluZyllLnB1c2gobSk7ZWxzZSBlLnB1c2gobSl9Yi5hcHBseSh0aGlzLGQpO2ZvcihkPTA7ZDxmLmxlbmd0aDtkKyspSyhhLGZbZF0pO2lmKEgodGhpcykpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKylmPWVbZF0sZiBpbnN0YW5jZW9mIEVsZW1lbnQmJkooYSxmKX19dm9pZCAwIT09Yy5WJiYoYi5wcmVwZW5kPWQoYy5WKSk7dm9pZCAwIT09Yy5hcHBlbmQmJihiLmFwcGVuZD1kKGMuYXBwZW5kKSl9O2Z1bmN0aW9uIHFlKCl7dmFyIGE9b2U7SShEb2N1bWVudC5wcm90b3R5cGUsImNyZWF0ZUVsZW1lbnQiLGZ1bmN0aW9uKGIpe2lmKHRoaXMuX19DRV9oYXNSZWdpc3RyeSl7dmFyIGM9YS5hLmdldChiKTtpZihjKXJldHVybiBuZXcgYy5jb25zdHJ1Y3RvckZ1bmN0aW9ufWI9R2QuY2FsbCh0aGlzLGIpO2EuYihiKTtyZXR1cm4gYn0pO0koRG9jdW1lbnQucHJvdG90eXBlLCJpbXBvcnROb2RlIixmdW5jdGlvbihiLGMpe2I9SWQuY2FsbCh0aGlzLGIsISFjKTt0aGlzLl9fQ0VfaGFzUmVnaXN0cnk/TChhLGIpOkFkKGEsYik7cmV0dXJuIGJ9KTtJKERvY3VtZW50LnByb3RvdHlwZSwiY3JlYXRlRWxlbWVudE5TIixmdW5jdGlvbihiLGMpe2lmKHRoaXMuX19DRV9oYXNSZWdpc3RyeSYmKG51bGw9PT1ifHwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI9PT1iKSl7dmFyIGQ9YS5hLmdldChjKTtpZihkKXJldHVybiBuZXcgZC5jb25zdHJ1Y3RvckZ1bmN0aW9ufWI9SGQuY2FsbCh0aGlzLApiLGMpO2EuYihiKTtyZXR1cm4gYn0pO3BlKGEsRG9jdW1lbnQucHJvdG90eXBlLHtWOkpkLGFwcGVuZDpLZH0pfTtmdW5jdGlvbiByZSgpe2Z1bmN0aW9uIGEoYSxkKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwidGV4dENvbnRlbnQiLHtlbnVtZXJhYmxlOmQuZW51bWVyYWJsZSxjb25maWd1cmFibGU6ITAsZ2V0OmQuZ2V0LHNldDpmdW5jdGlvbihhKXtpZih0aGlzLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREUpZC5zZXQuY2FsbCh0aGlzLGEpO2Vsc2V7dmFyIGM9dm9pZCAwO2lmKHRoaXMuZmlyc3RDaGlsZCl7dmFyIGU9dGhpcy5jaGlsZE5vZGVzLGg9ZS5sZW5ndGg7aWYoMDxoJiZIKHRoaXMpKXtjPUFycmF5KGgpO2Zvcih2YXIgaz0wO2s8aDtrKyspY1trXT1lW2tdfX1kLnNldC5jYWxsKHRoaXMsYSk7aWYoYylmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKUsoYixjW2FdKX19fSl9dmFyIGI9b2U7SShOb2RlLnByb3RvdHlwZSwiaW5zZXJ0QmVmb3JlIixmdW5jdGlvbihhLGQpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTsKYT1QZC5jYWxsKHRoaXMsYSxkKTtpZihIKHRoaXMpKWZvcihkPTA7ZDxjLmxlbmd0aDtkKyspSihiLGNbZF0pO3JldHVybiBhfWM9SChhKTtkPVBkLmNhbGwodGhpcyxhLGQpO2MmJksoYixhKTtIKHRoaXMpJiZKKGIsYSk7cmV0dXJuIGR9KTtJKE5vZGUucHJvdG90eXBlLCJhcHBlbmRDaGlsZCIsZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhLmNoaWxkTm9kZXMpO2E9T2QuY2FsbCh0aGlzLGEpO2lmKEgodGhpcykpZm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspSihiLGNbZV0pO3JldHVybiBhfWM9SChhKTtlPU9kLmNhbGwodGhpcyxhKTtjJiZLKGIsYSk7SCh0aGlzKSYmSihiLGEpO3JldHVybiBlfSk7SShOb2RlLnByb3RvdHlwZSwiY2xvbmVOb2RlIixmdW5jdGlvbihhKXthPU5kLmNhbGwodGhpcywhIWEpO3RoaXMub3duZXJEb2N1bWVudC5fX0NFX2hhc1JlZ2lzdHJ5P0woYixhKToKQWQoYixhKTtyZXR1cm4gYX0pO0koTm9kZS5wcm90b3R5cGUsInJlbW92ZUNoaWxkIixmdW5jdGlvbihhKXt2YXIgYz1IKGEpLGU9UWQuY2FsbCh0aGlzLGEpO2MmJksoYixhKTtyZXR1cm4gZX0pO0koTm9kZS5wcm90b3R5cGUsInJlcGxhY2VDaGlsZCIsZnVuY3Rpb24oYSxkKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGEuY2hpbGROb2Rlcyk7YT1SZC5jYWxsKHRoaXMsYSxkKTtpZihIKHRoaXMpKWZvcihLKGIsZCksZD0wO2Q8Yy5sZW5ndGg7ZCsrKUooYixjW2RdKTtyZXR1cm4gYX1jPUgoYSk7dmFyIGY9UmQuY2FsbCh0aGlzLGEsZCksZz1IKHRoaXMpO2cmJksoYixkKTtjJiZLKGIsYSk7ZyYmSihiLGEpO3JldHVybiBmfSk7U2QmJlNkLmdldD9hKE5vZGUucHJvdG90eXBlLFNkKTp6ZChiLGZ1bmN0aW9uKGIpe2EoYix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPTA7Yjx0aGlzLmNoaWxkTm9kZXMubGVuZ3RoO2IrKylhLnB1c2godGhpcy5jaGlsZE5vZGVzW2JdLnRleHRDb250ZW50KTtyZXR1cm4gYS5qb2luKCIiKX0sc2V0OmZ1bmN0aW9uKGEpe2Zvcig7dGhpcy5maXJzdENoaWxkOylRZC5jYWxsKHRoaXMsdGhpcy5maXJzdENoaWxkKTtPZC5jYWxsKHRoaXMsZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYSkpfX0pfSl9O2Z1bmN0aW9uIHNlKGEpe2Z1bmN0aW9uIGIoYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2Zvcih2YXIgZD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoOysrZSlkW2VdPWFyZ3VtZW50c1tlXTtlPVtdO2Zvcih2YXIgaD1bXSxrPTA7azxkLmxlbmd0aDtrKyspe3ZhciBsPWRba107bCBpbnN0YW5jZW9mIEVsZW1lbnQmJkgobCkmJmgucHVzaChsKTtpZihsIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3IobD1sLmZpcnN0Q2hpbGQ7bDtsPWwubmV4dFNpYmxpbmcpZS5wdXNoKGwpO2Vsc2UgZS5wdXNoKGwpfWIuYXBwbHkodGhpcyxkKTtmb3IoZD0wO2Q8aC5sZW5ndGg7ZCsrKUsoYSxoW2RdKTtpZihIKHRoaXMpKWZvcihkPTA7ZDxlLmxlbmd0aDtkKyspaD1lW2RdLGggaW5zdGFuY2VvZiBFbGVtZW50JiZKKGEsaCl9fXZhciBjPUVsZW1lbnQucHJvdG90eXBlO3ZvaWQgMCE9PWVlJiYoYy5iZWZvcmU9YihlZSkpO3ZvaWQgMCE9PWVlJiYoYy5hZnRlcj1iKGZlKSk7dm9pZCAwIT09Z2UmJgpJKGMsInJlcGxhY2VXaXRoIixmdW5jdGlvbihiKXtmb3IodmFyIGM9W10sZD0wO2Q8YXJndW1lbnRzLmxlbmd0aDsrK2QpY1tkXT1hcmd1bWVudHNbZF07ZD1bXTtmb3IodmFyIGc9W10saD0wO2g8Yy5sZW5ndGg7aCsrKXt2YXIgaz1jW2hdO2sgaW5zdGFuY2VvZiBFbGVtZW50JiZIKGspJiZnLnB1c2goayk7aWYoayBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKGs9ay5maXJzdENoaWxkO2s7az1rLm5leHRTaWJsaW5nKWQucHVzaChrKTtlbHNlIGQucHVzaChrKX1oPUgodGhpcyk7Z2UuYXBwbHkodGhpcyxjKTtmb3IoYz0wO2M8Zy5sZW5ndGg7YysrKUsoYSxnW2NdKTtpZihoKWZvcihLKGEsdGhpcyksYz0wO2M8ZC5sZW5ndGg7YysrKWc9ZFtjXSxnIGluc3RhbmNlb2YgRWxlbWVudCYmSihhLGcpfSk7dm9pZCAwIT09aGUmJkkoYywicmVtb3ZlIixmdW5jdGlvbigpe3ZhciBiPUgodGhpcyk7aGUuY2FsbCh0aGlzKTtiJiZLKGEsdGhpcyl9KX07ZnVuY3Rpb24gdGUoKXtmdW5jdGlvbiBhKGEsYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsImlubmVySFRNTCIse2VudW1lcmFibGU6Yi5lbnVtZXJhYmxlLGNvbmZpZ3VyYWJsZTohMCxnZXQ6Yi5nZXQsc2V0OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsZT12b2lkIDA7SCh0aGlzKSYmKGU9W10sd2QodGhpcyxmdW5jdGlvbihhKXthIT09YyYmZS5wdXNoKGEpfSkpO2Iuc2V0LmNhbGwodGhpcyxhKTtpZihlKWZvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdOzE9PT1nLl9fQ0Vfc3RhdGUmJmQuZGlzY29ubmVjdGVkQ2FsbGJhY2soZyl9dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk/TChkLHRoaXMpOkFkKGQsdGhpcyk7cmV0dXJuIGF9fSl9ZnVuY3Rpb24gYihhLGIpe0koYSwiaW5zZXJ0QWRqYWNlbnRFbGVtZW50IixmdW5jdGlvbihhLGMpe3ZhciBlPUgoYyk7YT1iLmNhbGwodGhpcyxhLGMpO2UmJksoZCxjKTtIKGEpJiZKKGQsYyk7cmV0dXJuIGF9KX0KZnVuY3Rpb24gYyhhLGIpe2Z1bmN0aW9uIGMoYSxiKXtmb3IodmFyIGM9W107YSE9PWI7YT1hLm5leHRTaWJsaW5nKWMucHVzaChhKTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKUwoZCxjW2JdKX1JKGEsImluc2VydEFkamFjZW50SFRNTCIsZnVuY3Rpb24oYSxkKXthPWEudG9Mb3dlckNhc2UoKTtpZigiYmVmb3JlYmVnaW4iPT09YSl7dmFyIGU9dGhpcy5wcmV2aW91c1NpYmxpbmc7Yi5jYWxsKHRoaXMsYSxkKTtjKGV8fHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkLHRoaXMpfWVsc2UgaWYoImFmdGVyYmVnaW4iPT09YSllPXRoaXMuZmlyc3RDaGlsZCxiLmNhbGwodGhpcyxhLGQpLGModGhpcy5maXJzdENoaWxkLGUpO2Vsc2UgaWYoImJlZm9yZWVuZCI9PT1hKWU9dGhpcy5sYXN0Q2hpbGQsYi5jYWxsKHRoaXMsYSxkKSxjKGV8fHRoaXMuZmlyc3RDaGlsZCxudWxsKTtlbHNlIGlmKCJhZnRlcmVuZCI9PT1hKWU9dGhpcy5uZXh0U2libGluZyxiLmNhbGwodGhpcyxhLGQpLGModGhpcy5uZXh0U2libGluZywKZSk7ZWxzZSB0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlRoZSB2YWx1ZSBwcm92aWRlZCAoIitTdHJpbmcoYSkrIikgaXMgbm90IG9uZSBvZiAnYmVmb3JlYmVnaW4nLCAnYWZ0ZXJiZWdpbicsICdiZWZvcmVlbmQnLCBvciAnYWZ0ZXJlbmQnLiIpO30pfXZhciBkPW9lO1RkJiZJKEVsZW1lbnQucHJvdG90eXBlLCJhdHRhY2hTaGFkb3ciLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9fQ0Vfc2hhZG93Um9vdD1hPVRkLmNhbGwodGhpcyxhKX0pO1VkJiZVZC5nZXQ/YShFbGVtZW50LnByb3RvdHlwZSxVZCk6amUmJmplLmdldD9hKEhUTUxFbGVtZW50LnByb3RvdHlwZSxqZSk6emQoZCxmdW5jdGlvbihiKXthKGIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBOZC5jYWxsKHRoaXMsITApLmlubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPSJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZSxjPWI/dGhpcy5jb250ZW50OnRoaXMsZD1IZC5jYWxsKGRvY3VtZW50LAp0aGlzLm5hbWVzcGFjZVVSSSx0aGlzLmxvY2FsTmFtZSk7Zm9yKGQuaW5uZXJIVE1MPWE7MDxjLmNoaWxkTm9kZXMubGVuZ3RoOylRZC5jYWxsKGMsYy5jaGlsZE5vZGVzWzBdKTtmb3IoYT1iP2QuY29udGVudDpkOzA8YS5jaGlsZE5vZGVzLmxlbmd0aDspT2QuY2FsbChjLGEuY2hpbGROb2Rlc1swXSl9fSl9KTtJKEVsZW1lbnQucHJvdG90eXBlLCJzZXRBdHRyaWJ1dGUiLGZ1bmN0aW9uKGEsYil7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gV2QuY2FsbCh0aGlzLGEsYik7dmFyIGM9VmQuY2FsbCh0aGlzLGEpO1dkLmNhbGwodGhpcyxhLGIpO2I9VmQuY2FsbCh0aGlzLGEpO2QuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYSxjLGIsbnVsbCl9KTtJKEVsZW1lbnQucHJvdG90eXBlLCJzZXRBdHRyaWJ1dGVOUyIsZnVuY3Rpb24oYSxiLGMpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIFpkLmNhbGwodGhpcyxhLGIsYyk7dmFyIGU9WWQuY2FsbCh0aGlzLGEsCmIpO1pkLmNhbGwodGhpcyxhLGIsYyk7Yz1ZZC5jYWxsKHRoaXMsYSxiKTtkLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGIsZSxjLGEpfSk7SShFbGVtZW50LnByb3RvdHlwZSwicmVtb3ZlQXR0cmlidXRlIixmdW5jdGlvbihhKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBYZC5jYWxsKHRoaXMsYSk7dmFyIGI9VmQuY2FsbCh0aGlzLGEpO1hkLmNhbGwodGhpcyxhKTtudWxsIT09YiYmZC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGIsbnVsbCxudWxsKX0pO0koRWxlbWVudC5wcm90b3R5cGUsInJlbW92ZUF0dHJpYnV0ZU5TIixmdW5jdGlvbihhLGIpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuICRkLmNhbGwodGhpcyxhLGIpO3ZhciBjPVlkLmNhbGwodGhpcyxhLGIpOyRkLmNhbGwodGhpcyxhLGIpO3ZhciBlPVlkLmNhbGwodGhpcyxhLGIpO2MhPT1lJiZkLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGIsYyxlLGEpfSk7a2U/YihIVE1MRWxlbWVudC5wcm90b3R5cGUsCmtlKTphZT9iKEVsZW1lbnQucHJvdG90eXBlLGFlKTpjb25zb2xlLndhcm4oIkN1c3RvbSBFbGVtZW50czogYEVsZW1lbnQjaW5zZXJ0QWRqYWNlbnRFbGVtZW50YCB3YXMgbm90IHBhdGNoZWQuIik7bGU/YyhIVE1MRWxlbWVudC5wcm90b3R5cGUsbGUpOmJlP2MoRWxlbWVudC5wcm90b3R5cGUsYmUpOmNvbnNvbGUud2FybigiQ3VzdG9tIEVsZW1lbnRzOiBgRWxlbWVudCNpbnNlcnRBZGphY2VudEhUTUxgIHdhcyBub3QgcGF0Y2hlZC4iKTtwZShkLEVsZW1lbnQucHJvdG90eXBlLHtWOmNlLGFwcGVuZDpkZX0pO3NlKGQpfTt2YXIgdWU9d2luZG93LmN1c3RvbUVsZW1lbnRzO2lmKCF1ZXx8dWUuZm9yY2VQb2x5ZmlsbHx8ImZ1bmN0aW9uIiE9dHlwZW9mIHVlLmRlZmluZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHVlLmdldCl7dmFyIG9lPW5ldyB4ZDtuZSgpO3FlKCk7cGUob2UsRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUse1Y6TGQsYXBwZW5kOk1kfSk7cmUoKTt0ZSgpO2RvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk9ITA7dmFyIGN1c3RvbUVsZW1lbnRzPW5ldyBOKG9lKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJjdXN0b21FbGVtZW50cyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmN1c3RvbUVsZW1lbnRzfSl9O2Z1bmN0aW9uIHZlKCl7dGhpcy5lbmQ9dGhpcy5zdGFydD0wO3RoaXMucnVsZXM9dGhpcy5wYXJlbnQ9dGhpcy5wcmV2aW91cz1udWxsO3RoaXMuY3NzVGV4dD10aGlzLnBhcnNlZENzc1RleHQ9IiI7dGhpcy5hdFJ1bGU9ITE7dGhpcy50eXBlPTA7dGhpcy5wYXJzZWRTZWxlY3Rvcj10aGlzLnNlbGVjdG9yPXRoaXMua2V5ZnJhbWVzTmFtZT0iIn0KZnVuY3Rpb24gd2UoYSl7YT1hLnJlcGxhY2UoeGUsIiIpLnJlcGxhY2UoeWUsIiIpO3ZhciBiPXplLGM9YSxkPW5ldyB2ZTtkLnN0YXJ0PTA7ZC5lbmQ9Yy5sZW5ndGg7Zm9yKHZhciBlPWQsZj0wLGc9Yy5sZW5ndGg7ZjxnO2YrKylpZigieyI9PT1jW2ZdKXtlLnJ1bGVzfHwoZS5ydWxlcz1bXSk7dmFyIGg9ZSxrPWgucnVsZXNbaC5ydWxlcy5sZW5ndGgtMV18fG51bGw7ZT1uZXcgdmU7ZS5zdGFydD1mKzE7ZS5wYXJlbnQ9aDtlLnByZXZpb3VzPWs7aC5ydWxlcy5wdXNoKGUpfWVsc2UifSI9PT1jW2ZdJiYoZS5lbmQ9ZisxLGU9ZS5wYXJlbnR8fGQpO3JldHVybiBiKGQsYSl9CmZ1bmN0aW9uIHplKGEsYil7dmFyIGM9Yi5zdWJzdHJpbmcoYS5zdGFydCxhLmVuZC0xKTthLnBhcnNlZENzc1RleHQ9YS5jc3NUZXh0PWMudHJpbSgpO2EucGFyZW50JiYoYz1iLnN1YnN0cmluZyhhLnByZXZpb3VzP2EucHJldmlvdXMuZW5kOmEucGFyZW50LnN0YXJ0LGEuc3RhcnQtMSksYz1BZShjKSxjPWMucmVwbGFjZShCZSwiICIpLGM9Yy5zdWJzdHJpbmcoYy5sYXN0SW5kZXhPZigiOyIpKzEpLGM9YS5wYXJzZWRTZWxlY3Rvcj1hLnNlbGVjdG9yPWMudHJpbSgpLGEuYXRSdWxlPTA9PT1jLmluZGV4T2YoIkAiKSxhLmF0UnVsZT8wPT09Yy5pbmRleE9mKCJAbWVkaWEiKT9hLnR5cGU9Q2U6Yy5tYXRjaChEZSkmJihhLnR5cGU9RWUsYS5rZXlmcmFtZXNOYW1lPWEuc2VsZWN0b3Iuc3BsaXQoQmUpLnBvcCgpKTphLnR5cGU9MD09PWMuaW5kZXhPZigiLS0iKT9GZTpHZSk7aWYoYz1hLnJ1bGVzKWZvcih2YXIgZD0wLGU9Yy5sZW5ndGgsZj12b2lkIDA7ZDxlJiYoZj1jW2RdKTtkKyspemUoZiwKYik7cmV0dXJuIGF9ZnVuY3Rpb24gQWUoYSl7cmV0dXJuIGEucmVwbGFjZSgvXFwoWzAtOWEtZl17MSw2fSlccy9naSxmdW5jdGlvbihhLGMpe2E9Yztmb3IoYz02LWEubGVuZ3RoO2MtLTspYT0iMCIrYTtyZXR1cm4iXFwiK2F9KX0KZnVuY3Rpb24gSGUoYSxiLGMpe2M9dm9pZCAwPT09Yz8iIjpjO3ZhciBkPSIiO2lmKGEuY3NzVGV4dHx8YS5ydWxlcyl7dmFyIGU9YS5ydWxlcyxmO2lmKGY9ZSlmPWVbMF0sZj0hKGYmJmYuc2VsZWN0b3ImJjA9PT1mLnNlbGVjdG9yLmluZGV4T2YoIi0tIikpO2lmKGYpe2Y9MDtmb3IodmFyIGc9ZS5sZW5ndGgsaD12b2lkIDA7ZjxnJiYoaD1lW2ZdKTtmKyspZD1IZShoLGIsZCl9ZWxzZSBiP2I9YS5jc3NUZXh0OihiPWEuY3NzVGV4dCxiPWIucmVwbGFjZShJZSwiIikucmVwbGFjZShKZSwiIiksYj1iLnJlcGxhY2UoS2UsIiIpLnJlcGxhY2UoTGUsIiIpKSwoZD1iLnRyaW0oKSkmJihkPSIgICIrZCsiXG4iKX1kJiYoYS5zZWxlY3RvciYmKGMrPWEuc2VsZWN0b3IrIiB7XG4iKSxjKz1kLGEuc2VsZWN0b3ImJihjKz0ifVxuXG4iKSk7cmV0dXJuIGN9CnZhciBHZT0xLEVlPTcsQ2U9NCxGZT0xRTMseGU9L1wvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLy9naW0seWU9L0BpbXBvcnRbXjtdKjsvZ2ltLEllPS8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qPyg/Ols7XG5dfCQpL2dpbSxKZT0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj97W159XSo/fSg/Ols7XG5dfCQpPy9naW0sS2U9L0BhcHBseVxzKlwoP1teKTtdKlwpP1xzKig/Ols7XG5dfCQpPy9naW0sTGU9L1teOzpdKj86W147XSo/dmFyXChbXjtdKlwpKD86Wztcbl18JCk/L2dpbSxEZT0vXkBbXlxzXSprZXlmcmFtZXMvLEJlPS9ccysvZzt2YXIgTz0hKHdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmluVXNlKSxNZTtmdW5jdGlvbiBOZShhKXtNZT1hJiZhLnNoaW1jc3Nwcm9wZXJ0aWVzPyExOk98fCEobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQXBwbGVXZWJLaXRcLzYwMXxFZGdlXC8xNS8pfHwhd2luZG93LkNTU3x8IUNTUy5zdXBwb3J0c3x8IUNTUy5zdXBwb3J0cygiYm94LXNoYWRvdyIsIjAgMCAwIHZhcigtLWZvbykiKSl9dmFyIE9lO3dpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkJiYoT2U9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgUGU9ISghd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTsKd2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP01lPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyhOZSh3aW5kb3cuU2hhZHlDU1MpLHdpbmRvdy5TaGFkeUNTUz12b2lkIDApOk5lKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIFE9TWUsUWU9T2U7dmFyIFJlPS8oPzpefFs7XHN7XVxzKikoLS1bXHctXSo/KVxzKjpccyooPzooKD86Jyg/OlxcJ3wuKSo/J3wiKD86XFwifC4pKj8ifFwoW14pXSo/XCl8W159O3tdKSspfFx7KFtefV0qKVx9KD86KD89Wztcc31dKXwkKSkvZ2ksU2U9Lyg/Ol58XFcrKUBhcHBseVxzKlwoPyhbXik7XG5dKilcKT8vZ2ksVGU9LygtLVtcdy1dKylccyooWzosOyldfCQpL2dpLFVlPS8oYW5pbWF0aW9uXHMqOil8KGFuaW1hdGlvbi1uYW1lXHMqOikvLCRlPS9AbWVkaWFccyguKikvLGFmPS9ce1tefV0qXH0vZzt2YXIgYmY9bmV3IFNldDtmdW5jdGlvbiBjZihhLGIpe2lmKCFhKXJldHVybiIiOyJzdHJpbmciPT09dHlwZW9mIGEmJihhPXdlKGEpKTtiJiZkZihhLGIpO3JldHVybiBIZShhLFEpfWZ1bmN0aW9uIGVmKGEpeyFhLl9fY3NzUnVsZXMmJmEudGV4dENvbnRlbnQmJihhLl9fY3NzUnVsZXM9d2UoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gZmYoYSl7cmV0dXJuISFhLnBhcmVudCYmYS5wYXJlbnQudHlwZT09PUVlfWZ1bmN0aW9uIGRmKGEsYixjLGQpe2lmKGEpe3ZhciBlPSExLGY9YS50eXBlO2lmKGQmJmY9PT1DZSl7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaCgkZSk7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChlPSEwKSl9Zj09PUdlP2IoYSk6YyYmZj09PUVlP2MoYSk6Zj09PUZlJiYoZT0hMCk7aWYoKGE9YS5ydWxlcykmJiFlKWZvcihlPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWFbZV0pO2UrKylkZihnLGIsYyxkKX19CmZ1bmN0aW9uIGdmKGEsYixjLGQpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7YiYmZS5zZXRBdHRyaWJ1dGUoInNjb3BlIixiKTtlLnRleHRDb250ZW50PWE7aGYoZSxjLGQpO3JldHVybiBlfXZhciBqZj1udWxsO2Z1bmN0aW9uIGtmKGEpe2E9ZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIFNoYWR5IERPTSBzdHlsZXMgZm9yICIrYSsiICIpO3ZhciBiPWRvY3VtZW50LmhlYWQ7Yi5pbnNlcnRCZWZvcmUoYSwoamY/amYubmV4dFNpYmxpbmc6bnVsbCl8fGIuZmlyc3RDaGlsZCk7cmV0dXJuIGpmPWF9ZnVuY3Rpb24gaGYoYSxiLGMpe2I9Ynx8ZG9jdW1lbnQuaGVhZDtiLmluc2VydEJlZm9yZShhLGMmJmMubmV4dFNpYmxpbmd8fGIuZmlyc3RDaGlsZCk7amY/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihqZik9PT1Ob2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyYmKGpmPWEpOmpmPWF9CmZ1bmN0aW9uIGxmKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtiPGQ7YisrKWlmKCIoIj09PWFbYl0pYysrO2Vsc2UgaWYoIikiPT09YVtiXSYmMD09PS0tYylyZXR1cm4gYjtyZXR1cm4tMX1mdW5jdGlvbiBtZihhLGIpe3ZhciBjPWEuaW5kZXhPZigidmFyKCIpO2lmKC0xPT09YylyZXR1cm4gYihhLCIiLCIiLCIiKTt2YXIgZD1sZihhLGMrMyksZT1hLnN1YnN0cmluZyhjKzQsZCk7Yz1hLnN1YnN0cmluZygwLGMpO2E9bWYoYS5zdWJzdHJpbmcoZCsxKSxiKTtkPWUuaW5kZXhPZigiLCIpO3JldHVybi0xPT09ZD9iKGMsZS50cmltKCksIiIsYSk6YihjLGUuc3Vic3RyaW5nKDAsZCkudHJpbSgpLGUuc3Vic3RyaW5nKGQrMSkudHJpbSgpLGEpfWZ1bmN0aW9uIG5mKGEsYil7Tz9hLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpOndpbmRvdy5TaGFkeURPTS5uYXRpdmVNZXRob2RzLnNldEF0dHJpYnV0ZS5jYWxsKGEsImNsYXNzIixiKX0KdmFyIG9mPXdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLndyYXB8fGZ1bmN0aW9uKGEpe3JldHVybiBhfTtmdW5jdGlvbiBwZihhKXt2YXIgYj1hLmxvY2FsTmFtZSxjPSIiO2I/LTE8Yi5pbmRleE9mKCItIil8fChjPWIsYj1hLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImlzIil8fCIiKTooYj1hLmlzLGM9YS5leHRlbmRzKTtyZXR1cm57aXM6YixNOmN9fWZ1bmN0aW9uIHFmKGEpe2Zvcih2YXIgYj1bXSxjPSIiLGQ9MDswPD1kJiZkPGEubGVuZ3RoO2QrKylpZigiKCI9PT1hW2RdKXt2YXIgZT1sZihhLGQpO2MrPWEuc2xpY2UoZCxlKzEpO2Q9ZX1lbHNlIiwiPT09YVtkXT8oYi5wdXNoKGMpLGM9IiIpOmMrPWFbZF07YyYmYi5wdXNoKGMpO3JldHVybiBifQpmdW5jdGlvbiByZihhKXtpZih2b2lkIDAhPT1RZSlyZXR1cm4gUWU7aWYodm9pZCAwPT09YS5fX2Nzc0J1aWxkKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgiY3NzLWJ1aWxkIik7aWYoYilhLl9fY3NzQnVpbGQ9YjtlbHNle2E6e2I9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtpZihiIGluc3RhbmNlb2YgQ29tbWVudCYmKGI9Yi50ZXh0Q29udGVudC50cmltKCkuc3BsaXQoIjoiKSwiY3NzLWJ1aWxkIj09PWJbMF0pKXtiPWJbMV07YnJlYWsgYX1iPSIifWlmKCIiIT09Yil7dmFyIGM9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9YS5fX2Nzc0J1aWxkPWJ9fXJldHVybiBhLl9fY3NzQnVpbGR8fCIifQpmdW5jdGlvbiBzZihhKXthPXZvaWQgMD09PWE/IiI6YTtyZXR1cm4iIiE9PWEmJlE/Tz8ic2hhZG93Ij09PWE6InNoYWR5Ij09PWE6ITF9O2Z1bmN0aW9uIHRmKCl7fWZ1bmN0aW9uIHVmKGEsYil7dmYoUixhLGZ1bmN0aW9uKGEpe3dmKGEsYnx8IiIpfSl9ZnVuY3Rpb24gdmYoYSxiLGMpe2Iubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYyhiKTt2YXIgZDsidGVtcGxhdGUiPT09Yi5sb2NhbE5hbWU/ZD0oYi5jb250ZW50fHxiLl9jb250ZW50fHxiKS5jaGlsZE5vZGVzOmQ9Yi5jaGlsZHJlbnx8Yi5jaGlsZE5vZGVzO2lmKGQpZm9yKGI9MDtiPGQubGVuZ3RoO2IrKyl2ZihhLGRbYl0sYyl9CmZ1bmN0aW9uIHdmKGEsYixjKXtpZihiKWlmKGEuY2xhc3NMaXN0KWM/KGEuY2xhc3NMaXN0LnJlbW92ZSgic3R5bGUtc2NvcGUiKSxhLmNsYXNzTGlzdC5yZW1vdmUoYikpOihhLmNsYXNzTGlzdC5hZGQoInN0eWxlLXNjb3BlIiksYS5jbGFzc0xpc3QuYWRkKGIpKTtlbHNlIGlmKGEuZ2V0QXR0cmlidXRlKXt2YXIgZD1hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTtjP2QmJihiPWQucmVwbGFjZSgic3R5bGUtc2NvcGUiLCIiKS5yZXBsYWNlKGIsIiIpLG5mKGEsYikpOm5mKGEsKGQ/ZCsiICI6IiIpKyJzdHlsZS1zY29wZSAiK2IpfX1mdW5jdGlvbiB4ZihhLGIsYyl7dmYoUixhLGZ1bmN0aW9uKGEpe3dmKGEsYiwhMCk7d2YoYSxjKX0pfWZ1bmN0aW9uIHlmKGEsYil7dmYoUixhLGZ1bmN0aW9uKGEpe3dmKGEsYnx8IiIsITApfSl9CmZ1bmN0aW9uIHpmKGEsYixjLGQsZSl7dmFyIGY9UjtlPXZvaWQgMD09PWU/IiI6ZTsiIj09PWUmJihPfHwic2hhZHkiPT09KHZvaWQgMD09PWQ/IiI6ZCk/ZT1jZihiLGMpOihhPXBmKGEpLGU9QWYoZixiLGEuaXMsYS5NLGMpKyJcblxuIikpO3JldHVybiBlLnRyaW0oKX1mdW5jdGlvbiBBZihhLGIsYyxkLGUpe3ZhciBmPUJmKGMsZCk7Yz1jPyIuIitjOiIiO3JldHVybiBjZihiLGZ1bmN0aW9uKGIpe2IuY3x8KGIuc2VsZWN0b3I9Yi5qPUNmKGEsYixhLmIsYyxmKSxiLmM9ITApO2UmJmUoYixjLGYpfSl9ZnVuY3Rpb24gQmYoYSxiKXtyZXR1cm4gYj8iW2lzPSIrYSsiXSI6YX0KZnVuY3Rpb24gQ2YoYSxiLGMsZCxlKXt2YXIgZj1xZihiLnNlbGVjdG9yKTtpZighZmYoYikpe2I9MDtmb3IodmFyIGc9Zi5sZW5ndGgsaD12b2lkIDA7YjxnJiYoaD1mW2JdKTtiKyspZltiXT1jLmNhbGwoYSxoLGQsZSl9cmV0dXJuIGYuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiEhYX0pLmpvaW4oIiwiKX1mdW5jdGlvbiBEZihhKXtyZXR1cm4gYS5yZXBsYWNlKEVmLGZ1bmN0aW9uKGEsYyxkKXstMTxkLmluZGV4T2YoIisiKT9kPWQucmVwbGFjZSgvXCsvZywiX19fIik6LTE8ZC5pbmRleE9mKCJfX18iKSYmKGQ9ZC5yZXBsYWNlKC9fX18vZywiKyIpKTtyZXR1cm4iOiIrYysiKCIrZCsiKSJ9KX0KZnVuY3Rpb24gRmYoYSl7Zm9yKHZhciBiPVtdLGM7Yz1hLm1hdGNoKEdmKTspe3ZhciBkPWMuaW5kZXgsZT1sZihhLGQpO2lmKC0xPT09ZSl0aHJvdyBFcnJvcihjLmlucHV0KyIgc2VsZWN0b3IgbWlzc2luZyAnKSciKTtjPWEuc2xpY2UoZCxlKzEpO2E9YS5yZXBsYWNlKGMsIlx1ZTAwMCIpO2IucHVzaChjKX1yZXR1cm57aGE6YSxtYXRjaGVzOmJ9fWZ1bmN0aW9uIEhmKGEsYil7dmFyIGM9YS5zcGxpdCgiXHVlMDAwIik7cmV0dXJuIGIucmVkdWNlKGZ1bmN0aW9uKGEsYixmKXtyZXR1cm4gYStiK2NbZisxXX0sY1swXSl9CnRmLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0hMTthPWEudHJpbSgpO3ZhciBlPUVmLnRlc3QoYSk7ZSYmKGE9YS5yZXBsYWNlKEVmLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4iOiIrYisiKCIrYy5yZXBsYWNlKC9ccy9nLCIiKSsiKSJ9KSxhPURmKGEpKTt2YXIgZj1HZi50ZXN0KGEpO2lmKGYpe3ZhciBnPUZmKGEpO2E9Zy5oYTtnPWcubWF0Y2hlc31hPWEucmVwbGFjZShJZiwiOmhvc3QgJDEiKTthPWEucmVwbGFjZShKZixmdW5jdGlvbihhLGUsZil7ZHx8KGE9S2YoZixlLGIsYyksZD1kfHxhLnN0b3AsZT1hLkNhLGY9YS52YWx1ZSk7cmV0dXJuIGUrZn0pO2YmJihhPUhmKGEsZykpO2UmJihhPURmKGEpKTtyZXR1cm4gYX07CmZ1bmN0aW9uIEtmKGEsYixjLGQpe3ZhciBlPWEuaW5kZXhPZigiOjpzbG90dGVkIik7MDw9YS5pbmRleE9mKCI6aG9zdCIpP2E9TGYoYSxkKTowIT09ZSYmKGE9Yz9NZihhLGMpOmEpO2M9ITE7MDw9ZSYmKGI9IiIsYz0hMCk7aWYoYyl7dmFyIGY9ITA7YyYmKGE9YS5yZXBsYWNlKE5mLGZ1bmN0aW9uKGEsYil7cmV0dXJuIiA+ICIrYn0pKX1hPWEucmVwbGFjZShPZixmdW5jdGlvbihhLGIsYyl7cmV0dXJuJ1tkaXI9IicrYysnIl0gJytiKyIsICIrYisnW2Rpcj0iJytjKyciXSd9KTtyZXR1cm57dmFsdWU6YSxDYTpiLHN0b3A6Zn19CmZ1bmN0aW9uIE1mKGEsYil7YT1hLnNwbGl0KC8oXFsuKz9cXSkvKTtmb3IodmFyIGM9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKDE9PT1kJTIpYy5wdXNoKGFbZF0pO2Vsc2V7dmFyIGU9YVtkXTtpZigiIiE9PWV8fGQhPT1hLmxlbmd0aC0xKWU9ZS5zcGxpdCgiOiIpLGVbMF0rPWIsYy5wdXNoKGUuam9pbigiOiIpKX1yZXR1cm4gYy5qb2luKCIiKX1mdW5jdGlvbiBMZihhLGIpe3ZhciBjPWEubWF0Y2goUGYpO3JldHVybihjPWMmJmNbMl0udHJpbSgpfHwiIik/Y1swXS5tYXRjaChRZik/YS5yZXBsYWNlKFBmLGZ1bmN0aW9uKGEsYyxmKXtyZXR1cm4gYitmfSk6Yy5zcGxpdChRZilbMF09PT1iP2M6InNob3VsZF9ub3RfbWF0Y2giOmEucmVwbGFjZSgiOmhvc3QiLGIpfWZ1bmN0aW9uIFJmKGEpeyI6cm9vdCI9PT1hLnNlbGVjdG9yJiYoYS5zZWxlY3Rvcj0iaHRtbCIpfQp0Zi5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXtyZXR1cm4gYS5tYXRjaCgiOmhvc3QiKT8iIjphLm1hdGNoKCI6OnNsb3R0ZWQiKT90aGlzLmIoYSwiOm5vdCguc3R5bGUtc2NvcGUpIik6TWYoYS50cmltKCksIjpub3QoLnN0eWxlLXNjb3BlKSIpfTtwLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRmLnByb3RvdHlwZSx7YTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuInN0eWxlLXNjb3BlIn19fSk7CnZhciBFZj0vOihudGhbLVx3XSspXCgoW14pXSspXCkvLEpmPS8oXnxbXHM+K35dKykoKD86XFsuKz9cXXxbXlxzPit+PVtdKSspL2csUWY9L1tbLjojKl0vLElmPS9eKDo6c2xvdHRlZCkvLFBmPS8oOmhvc3QpKD86XCgoKD86XChbXikoXSpcKXxbXikoXSopKz8pXCkpLyxOZj0vKD86OjpzbG90dGVkKSg/OlwoKCg/OlwoW14pKF0qXCl8W14pKF0qKSs/KVwpKS8sT2Y9LyguKik6ZGlyXCgoPzoobHRyfHJ0bCkpXCkvLEdmPS86KD86bWF0Y2hlc3xhbnl8LSg/OndlYmtpdHxtb3opLWFueSkvLFI9bmV3IHRmO2Z1bmN0aW9uIFNmKGEsYixjLGQsZSl7dGhpcy5BPWF8fG51bGw7dGhpcy5iPWJ8fG51bGw7dGhpcy5mYT1jfHxbXTt0aGlzLm89bnVsbDt0aGlzLmNzc0J1aWxkPWV8fCIiO3RoaXMuTT1kfHwiIjt0aGlzLmE9dGhpcy5zPXRoaXMudz1udWxsfWZ1bmN0aW9uIFQoYSl7cmV0dXJuIGE/YS5fX3N0eWxlSW5mbzpudWxsfWZ1bmN0aW9uIFRmKGEsYil7cmV0dXJuIGEuX19zdHlsZUluZm89Yn1TZi5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLkF9O1NmLnByb3RvdHlwZS5fZ2V0U3R5bGVSdWxlcz1TZi5wcm90b3R5cGUuYztmdW5jdGlvbiBVZihhKXt2YXIgYj10aGlzLm1hdGNoZXN8fHRoaXMubWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm1vek1hdGNoZXNTZWxlY3Rvcnx8dGhpcy5tc01hdGNoZXNTZWxlY3Rvcnx8dGhpcy5vTWF0Y2hlc1NlbGVjdG9yfHx0aGlzLndlYmtpdE1hdGNoZXNTZWxlY3RvcjtyZXR1cm4gYiYmYi5jYWxsKHRoaXMsYSl9dmFyIFZmPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goIlRyaWRlbnQiKTtmdW5jdGlvbiBXZigpe31mdW5jdGlvbiBYZihhKXt2YXIgYj17fSxjPVtdLGQ9MDtkZihhLGZ1bmN0aW9uKGEpe1lmKGEpO2EuaW5kZXg9ZCsrO2E9YS5pLmNzc1RleHQ7Zm9yKHZhciBjO2M9VGUuZXhlYyhhKTspe3ZhciBlPWNbMV07IjoiIT09Y1syXSYmKGJbZV09ITApfX0sZnVuY3Rpb24oYSl7Yy5wdXNoKGEpfSk7YS5iPWM7YT1bXTtmb3IodmFyIGUgaW4gYilhLnB1c2goZSk7cmV0dXJuIGF9CmZ1bmN0aW9uIFlmKGEpe2lmKCFhLmkpe3ZhciBiPXt9LGM9e307WmYoYSxjKSYmKGIudj1jLGEucnVsZXM9bnVsbCk7Yi5jc3NUZXh0PWEucGFyc2VkQ3NzVGV4dC5yZXBsYWNlKGFmLCIiKS5yZXBsYWNlKFJlLCIiKTthLmk9Yn19ZnVuY3Rpb24gWmYoYSxiKXt2YXIgYz1hLmk7aWYoYyl7aWYoYy52KXJldHVybiBPYmplY3QuYXNzaWduKGIsYy52KSwhMH1lbHNle2M9YS5wYXJzZWRDc3NUZXh0O2Zvcih2YXIgZDthPVJlLmV4ZWMoYyk7KXtkPShhWzJdfHxhWzNdKS50cmltKCk7aWYoImluaGVyaXQiIT09ZHx8InVuc2V0IiE9PWQpYlthWzFdLnRyaW0oKV09ZDtkPSEwfXJldHVybiBkfX0KZnVuY3Rpb24gJGYoYSxiLGMpe2ImJihiPTA8PWIuaW5kZXhPZigiOyIpP2FnKGEsYixjKTptZihiLGZ1bmN0aW9uKGIsZSxmLGcpe2lmKCFlKXJldHVybiBiK2c7KGU9JGYoYSxjW2VdLGMpKSYmImluaXRpYWwiIT09ZT8iYXBwbHktc2hpbS1pbmhlcml0Ij09PWUmJihlPSJpbmhlcml0Iik6ZT0kZihhLGNbZl18fGYsYyl8fGY7cmV0dXJuIGIrKGV8fCIiKStnfSkpO3JldHVybiBiJiZiLnRyaW0oKXx8IiJ9CmZ1bmN0aW9uIGFnKGEsYixjKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGQ9MCxlLGY7ZDxiLmxlbmd0aDtkKyspaWYoZT1iW2RdKXtTZS5sYXN0SW5kZXg9MDtpZihmPVNlLmV4ZWMoZSkpZT0kZihhLGNbZlsxXV0sYyk7ZWxzZSBpZihmPWUuaW5kZXhPZigiOiIpLC0xIT09Zil7dmFyIGc9ZS5zdWJzdHJpbmcoZik7Zz1nLnRyaW0oKTtnPSRmKGEsZyxjKXx8ZztlPWUuc3Vic3RyaW5nKDAsZikrZ31iW2RdPWUmJmUubGFzdEluZGV4T2YoIjsiKT09PWUubGVuZ3RoLTE/ZS5zbGljZSgwLC0xKTplfHwiIn1yZXR1cm4gYi5qb2luKCI7Iil9CmZ1bmN0aW9uIGJnKGEsYil7dmFyIGM9e30sZD1bXTtkZihhLGZ1bmN0aW9uKGEpe2EuaXx8WWYoYSk7dmFyIGU9YS5qfHxhLnBhcnNlZFNlbGVjdG9yO2ImJmEuaS52JiZlJiZVZi5jYWxsKGIsZSkmJihaZihhLGMpLGE9YS5pbmRleCxlPXBhcnNlSW50KGEvMzIsMTApLGRbZV09KGRbZV18fDApfDE8PGElMzIpfSxudWxsLCEwKTtyZXR1cm57djpjLGtleTpkfX0KZnVuY3Rpb24gY2coYSxiLGMsZCl7Yi5pfHxZZihiKTtpZihiLmkudil7dmFyIGU9cGYoYSk7YT1lLmlzO2U9ZS5NO2U9YT9CZihhLGUpOiJodG1sIjt2YXIgZj1iLnBhcnNlZFNlbGVjdG9yLGc9Ijpob3N0ID4gKiI9PT1mfHwiaHRtbCI9PT1mLGg9MD09PWYuaW5kZXhPZigiOmhvc3QiKSYmIWc7InNoYWR5Ij09PWMmJihnPWY9PT1lKyIgPiAqLiIrZXx8LTEhPT1mLmluZGV4T2YoImh0bWwiKSxoPSFnJiYwPT09Zi5pbmRleE9mKGUpKTtpZihnfHxoKWM9ZSxoJiYoYi5qfHwoYi5qPUNmKFIsYixSLmIsYT8iLiIrYToiIixlKSksYz1iLmp8fGUpLGQoe2hhOmMsSWE6aCxaYTpnfSl9fWZ1bmN0aW9uIGRnKGEsYixjKXt2YXIgZD17fSxlPXt9O2RmKGIsZnVuY3Rpb24oYil7Y2coYSxiLGMsZnVuY3Rpb24oYyl7VWYuY2FsbChhLl9lbGVtZW50fHxhLGMuaGEpJiYoYy5JYT9aZihiLGQpOlpmKGIsZSkpfSl9LG51bGwsITApO3JldHVybntSYTplLEhhOmR9fQpmdW5jdGlvbiBlZyhhLGIsYyxkKXt2YXIgZT1wZihiKSxmPUJmKGUuaXMsZS5NKSxnPW5ldyBSZWdFeHAoIig/Ol58W14uI1s6XSkiKyhiLmV4dGVuZHM/IlxcIitmLnNsaWNlKDAsLTEpKyJcXF0iOmYpKyIoJHxbLjpbXFxzPit+XSkiKSxoPVQoYik7ZT1oLkE7aD1oLmNzc0J1aWxkO3ZhciBrPWZnKGUsZCk7cmV0dXJuIHpmKGIsZSxmdW5jdGlvbihiKXt2YXIgZT0iIjtiLml8fFlmKGIpO2IuaS5jc3NUZXh0JiYoZT1hZyhhLGIuaS5jc3NUZXh0LGMpKTtiLmNzc1RleHQ9ZTtpZighTyYmIWZmKGIpJiZiLmNzc1RleHQpe3ZhciBoPWU9Yi5jc3NUZXh0O251bGw9PWIubmEmJihiLm5hPVVlLnRlc3QoZSkpO2lmKGIubmEpaWYobnVsbD09Yi5VKXtiLlU9W107Zm9yKHZhciBsIGluIGspaD1rW2xdLGg9aChlKSxlIT09aCYmKGU9aCxiLlUucHVzaChsKSl9ZWxzZXtmb3IobD0wO2w8Yi5VLmxlbmd0aDsrK2wpaD1rW2IuVVtsXV0sZT1oKGUpO2g9ZX1iLmNzc1RleHQ9aDtiLmo9Yi5qfHwKYi5zZWxlY3RvcjtlPSIuIitkO2w9cWYoYi5qKTtoPTA7Zm9yKHZhciBNPWwubGVuZ3RoLFU9dm9pZCAwO2g8TSYmKFU9bFtoXSk7aCsrKWxbaF09VS5tYXRjaChnKT9VLnJlcGxhY2UoZixlKTplKyIgIitVO2Iuc2VsZWN0b3I9bC5qb2luKCIsIil9fSxoKX1mdW5jdGlvbiBmZyhhLGIpe2E9YS5iO3ZhciBjPXt9O2lmKCFPJiZhKWZvcih2YXIgZD0wLGU9YVtkXTtkPGEubGVuZ3RoO2U9YVsrK2RdKXt2YXIgZj1lLGc9YjtmLmY9bmV3IFJlZ0V4cCgiXFxiIitmLmtleWZyYW1lc05hbWUrIig/IVxcQnwtKSIsImciKTtmLmE9Zi5rZXlmcmFtZXNOYW1lKyItIitnO2Yuaj1mLmp8fGYuc2VsZWN0b3I7Zi5zZWxlY3Rvcj1mLmoucmVwbGFjZShmLmtleWZyYW1lc05hbWUsZi5hKTtjW2Uua2V5ZnJhbWVzTmFtZV09Z2coZSl9cmV0dXJuIGN9ZnVuY3Rpb24gZ2coYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBiLnJlcGxhY2UoYS5mLGEuYSl9fQpmdW5jdGlvbiBoZyhhLGIpe3ZhciBjPWlnLGQ9ZWYoYSk7YS50ZXh0Q29udGVudD1jZihkLGZ1bmN0aW9uKGEpe3ZhciBkPWEuY3NzVGV4dD1hLnBhcnNlZENzc1RleHQ7YS5pJiZhLmkuY3NzVGV4dCYmKGQ9ZC5yZXBsYWNlKEllLCIiKS5yZXBsYWNlKEplLCIiKSxhLmNzc1RleHQ9YWcoYyxkLGIpKX0pfXAuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoV2YucHJvdG90eXBlLHthOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ieC1zY29wZSJ9fX0pO3ZhciBpZz1uZXcgV2Y7dmFyIGpnPXt9LGtnPXdpbmRvdy5jdXN0b21FbGVtZW50cztpZihrZyYmIU8mJiFQZSl7dmFyIGxnPWtnLmRlZmluZTtrZy5kZWZpbmU9ZnVuY3Rpb24oYSxiLGMpe2pnW2FdfHwoamdbYV09a2YoYSkpO2xnLmNhbGwoa2csYSxiLGMpfX07ZnVuY3Rpb24gbWcoKXt0aGlzLmNhY2hlPXt9fW1nLnByb3RvdHlwZS5zdG9yZT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLmNhY2hlW2FdfHxbXTtlLnB1c2goe3Y6YixzdHlsZUVsZW1lbnQ6YyxzOmR9KTsxMDA8ZS5sZW5ndGgmJmUuc2hpZnQoKTt0aGlzLmNhY2hlW2FdPWV9O2Z1bmN0aW9uIG5nKCl7fXZhciBvZz1uZXcgUmVnRXhwKFIuYSsiXFxzKihbXlxcc10qKSIpO2Z1bmN0aW9uIHBnKGEpe3JldHVybihhPShhLmNsYXNzTGlzdCYmYS5jbGFzc0xpc3QudmFsdWU/YS5jbGFzc0xpc3QudmFsdWU6YS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKS5tYXRjaChvZykpP2FbMV06IiJ9ZnVuY3Rpb24gcWcoYSl7dmFyIGI9b2YoYSkuZ2V0Um9vdE5vZGUoKTtyZXR1cm4gYj09PWF8fGI9PT1hLm93bmVyRG9jdW1lbnQ/IiI6KGE9Yi5ob3N0KT9wZihhKS5pczoiIn0KZnVuY3Rpb24gcmcoYSl7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPWFbYl07aWYoYy50YXJnZXQhPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmMudGFyZ2V0IT09ZG9jdW1lbnQuaGVhZClmb3IodmFyIGQ9MDtkPGMuYWRkZWROb2Rlcy5sZW5ndGg7ZCsrKXt2YXIgZT1jLmFkZGVkTm9kZXNbZF07aWYoZS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXt2YXIgZj1lLmdldFJvb3ROb2RlKCksZz1wZyhlKTtpZihnJiZmPT09ZS5vd25lckRvY3VtZW50JiYoInN0eWxlIiE9PWUubG9jYWxOYW1lJiYidGVtcGxhdGUiIT09ZS5sb2NhbE5hbWV8fCIiPT09cmYoZSkpKXlmKGUsZyk7ZWxzZSBpZihmIGluc3RhbmNlb2YgU2hhZG93Um9vdClmb3IoZj1xZyhlKSxmIT09ZyYmeGYoZSxnLGYpLGU9d2luZG93LlNoYWR5RE9NLm5hdGl2ZU1ldGhvZHMucXVlcnlTZWxlY3RvckFsbC5jYWxsKGUsIjpub3QoLiIrUi5hKyIpIiksZz0wO2c8ZS5sZW5ndGg7ZysrKXtmPWVbZ107CnZhciBoPXFnKGYpO2gmJndmKGYsaCl9fX19fQppZighKE98fHdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmhhbmRsZXNEeW5hbWljU2NvcGluZykpe3ZhciBzZz1uZXcgTXV0YXRpb25PYnNlcnZlcihyZyksdGc9ZnVuY3Rpb24oYSl7c2cub2JzZXJ2ZShhLHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pfTtpZih3aW5kb3cuY3VzdG9tRWxlbWVudHMmJiF3aW5kb3cuY3VzdG9tRWxlbWVudHMucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayl0Zyhkb2N1bWVudCk7ZWxzZXt2YXIgdWc9ZnVuY3Rpb24oKXt0Zyhkb2N1bWVudC5ib2R5KX07d2luZG93LkhUTUxJbXBvcnRzP3dpbmRvdy5IVE1MSW1wb3J0cy53aGVuUmVhZHkodWcpOnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2lmKCJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpe3ZhciBhPWZ1bmN0aW9uKCl7dWcoKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixhKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsCmEpfWVsc2UgdWcoKX0pfW5nPWZ1bmN0aW9uKCl7cmcoc2cudGFrZVJlY29yZHMoKSl9fXZhciB2Zz1uZzt2YXIgd2c9e307dmFyIHhnPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIHlnKGEpe2lmKGE9d2dbYV0pYS5fYXBwbHlTaGltQ3VycmVudFZlcnNpb249YS5fYXBwbHlTaGltQ3VycmVudFZlcnNpb258fDAsYS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb258fDAsYS5fYXBwbHlTaGltTmV4dFZlcnNpb249KGEuX2FwcGx5U2hpbU5leHRWZXJzaW9ufHwwKSsxfWZ1bmN0aW9uIHpnKGEpe3JldHVybiBhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj09PWEuX2FwcGx5U2hpbU5leHRWZXJzaW9ufWZ1bmN0aW9uIEFnKGEpe2EuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmd8fChhLl92YWxpZGF0aW5nPSEwLHhnLnRoZW4oZnVuY3Rpb24oKXthLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1OZXh0VmVyc2lvbjthLl92YWxpZGF0aW5nPSExfSkpfTt2YXIgQmc9e30sQ2c9bmV3IG1nO2Z1bmN0aW9uIFkoKXt0aGlzLmw9e307dGhpcy5jPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDt2YXIgYT1uZXcgdmU7YS5ydWxlcz1bXTt0aGlzLmY9VGYodGhpcy5jLG5ldyBTZihhKSk7dGhpcy5nPSExO3RoaXMuYj10aGlzLmE9bnVsbH1uPVkucHJvdG90eXBlO24uZmx1c2g9ZnVuY3Rpb24oKXt2ZygpfTtuLkZhPWZ1bmN0aW9uKGEpe3JldHVybiBlZihhKX07bi5WYT1mdW5jdGlvbihhKXtyZXR1cm4gY2YoYSl9O24ucHJlcGFyZVRlbXBsYXRlPWZ1bmN0aW9uKGEsYixjKXt0aGlzLnByZXBhcmVUZW1wbGF0ZURvbShhLGIpO3RoaXMucHJlcGFyZVRlbXBsYXRlU3R5bGVzKGEsYixjKX07Cm4ucHJlcGFyZVRlbXBsYXRlU3R5bGVzPWZ1bmN0aW9uKGEsYixjKXtpZighYS5fcHJlcGFyZWQmJiFQZSl7T3x8amdbYl18fChqZ1tiXT1rZihiKSk7YS5fcHJlcGFyZWQ9ITA7YS5uYW1lPWI7YS5leHRlbmRzPWM7d2dbYl09YTt2YXIgZD1yZihhKSxlPXNmKGQpO2M9e2lzOmIsZXh0ZW5kczpjfTtmb3IodmFyIGY9W10sZz1hLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKSxoPTA7aDxnLmxlbmd0aDtoKyspe3ZhciBrPWdbaF07aWYoay5oYXNBdHRyaWJ1dGUoInNoYWR5LXVuc2NvcGVkIikpe2lmKCFPKXt2YXIgbD1rLnRleHRDb250ZW50O2JmLmhhcyhsKXx8KGJmLmFkZChsKSxsPWsuY2xvbmVOb2RlKCEwKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpKTtrLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoayl9fWVsc2UgZi5wdXNoKGsudGV4dENvbnRlbnQpLGsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKX1mPWYuam9pbigiIikudHJpbSgpKyhCZ1tiXXx8IiIpOwpEZyh0aGlzKTtpZighZSl7aWYoZz0hZClnPVNlLnRlc3QoZil8fFJlLnRlc3QoZiksU2UubGFzdEluZGV4PTAsUmUubGFzdEluZGV4PTA7aD13ZShmKTtnJiZRJiZ0aGlzLmEmJnRoaXMuYS50cmFuc2Zvcm1SdWxlcyhoLGIpO2EuX3N0eWxlQXN0PWh9Zz1bXTtRfHwoZz1YZihhLl9zdHlsZUFzdCkpO2lmKCFnLmxlbmd0aHx8USloPU8/YS5jb250ZW50Om51bGwsYj1qZ1tiXXx8bnVsbCxkPXpmKGMsYS5fc3R5bGVBc3QsbnVsbCxkLGU/ZjoiIiksZD1kLmxlbmd0aD9nZihkLGMuaXMsaCxiKTpudWxsLGEuX3N0eWxlPWQ7YS5hPWd9fTtuLlFhPWZ1bmN0aW9uKGEsYil7QmdbYl09YS5qb2luKCIgIil9O24ucHJlcGFyZVRlbXBsYXRlRG9tPWZ1bmN0aW9uKGEsYil7aWYoIVBlKXt2YXIgYz1yZihhKTtPfHwic2hhZHkiPT09Y3x8YS5fZG9tUHJlcGFyZWR8fChhLl9kb21QcmVwYXJlZD0hMCx1ZihhLmNvbnRlbnQsYikpfX07CmZ1bmN0aW9uIEVnKGEpe3ZhciBiPXBmKGEpLGM9Yi5pcztiPWIuTTt2YXIgZD1qZ1tjXXx8bnVsbCxlPXdnW2NdO2lmKGUpe2M9ZS5fc3R5bGVBc3Q7dmFyIGY9ZS5hO2U9cmYoZSk7Yj1uZXcgU2YoYyxkLGYsYixlKTtUZihhLGIpO3JldHVybiBifX1mdW5jdGlvbiBGZyhhKXshYS5iJiZ3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSYmKGEuYj13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UsYS5iLnRyYW5zZm9ybUNhbGxiYWNrPWZ1bmN0aW9uKGIpe2EucmEoYil9LGEuYi52YWxpZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7KGEuYi5lbnF1ZXVlZHx8YS5nKSYmYS5mbHVzaEN1c3RvbVN0eWxlcygpfSl9KX0KZnVuY3Rpb24gRGcoYSl7IWEuYSYmd2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltJiYoYS5hPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0sYS5hLmludmFsaWRDYWxsYmFjaz15Zyk7RmcoYSl9Cm4uZmx1c2hDdXN0b21TdHlsZXM9ZnVuY3Rpb24oKXtpZighUGUmJihEZyh0aGlzKSx0aGlzLmIpKXt2YXIgYT10aGlzLmIucHJvY2Vzc1N0eWxlcygpO2lmKHRoaXMuYi5lbnF1ZXVlZCYmIXNmKHRoaXMuZi5jc3NCdWlsZCkpe2lmKFEpe2lmKCF0aGlzLmYuY3NzQnVpbGQpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuYi5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKGFbYl0pO2lmKGMmJlEmJnRoaXMuYSl7dmFyIGQ9ZWYoYyk7RGcodGhpcyk7dGhpcy5hLnRyYW5zZm9ybVJ1bGVzKGQpO2MudGV4dENvbnRlbnQ9Y2YoZCl9fX1lbHNle0dnKHRoaXMsdGhpcy5jLHRoaXMuZik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKykoYz10aGlzLmIuZ2V0U3R5bGVGb3JDdXN0b21TdHlsZShhW2JdKSkmJmhnKGMsdGhpcy5mLncpO3RoaXMuZyYmdGhpcy5zdHlsZURvY3VtZW50KCl9dGhpcy5iLmVucXVldWVkPSExfX19OwpuLnN0eWxlRWxlbWVudD1mdW5jdGlvbihhLGIpe2lmKFBlKXtpZihiKXtUKGEpfHxUZihhLG5ldyBTZihudWxsKSk7dmFyIGM9VChhKTtjLm89Yy5vfHx7fTtPYmplY3QuYXNzaWduKGMubyxiKTtIZyh0aGlzLGEsYyl9fWVsc2UgaWYoYz1UKGEpfHxFZyhhKSlpZihhIT09dGhpcy5jJiYodGhpcy5nPSEwKSxiJiYoYy5vPWMub3x8e30sT2JqZWN0LmFzc2lnbihjLm8sYikpLFEpSGcodGhpcyxhLGMpO2Vsc2UgaWYodGhpcy5mbHVzaCgpLEdnKHRoaXMsYSxjKSxjLmZhJiZjLmZhLmxlbmd0aCl7Yj1wZihhKS5pczt2YXIgZDthOntpZihkPUNnLmNhY2hlW2JdKWZvcih2YXIgZT1kLmxlbmd0aC0xOzA8PWU7ZS0tKXt2YXIgZj1kW2VdO2I6e3ZhciBnPWMuZmE7Zm9yKHZhciBoPTA7aDxnLmxlbmd0aDtoKyspe3ZhciBrPWdbaF07aWYoZi52W2tdIT09Yy53W2tdKXtnPSExO2JyZWFrIGJ9fWc9ITB9aWYoZyl7ZD1mO2JyZWFrIGF9fWQ9dm9pZCAwfWc9ZD9kLnN0eWxlRWxlbWVudDpudWxsOwplPWMuczsoZj1kJiZkLnMpfHwoZj10aGlzLmxbYl09KHRoaXMubFtiXXx8MCkrMSxmPWIrIi0iK2YpO2Mucz1mO2Y9Yy5zO2g9aWc7aD1nP2cudGV4dENvbnRlbnR8fCIiOmVnKGgsYSxjLncsZik7az1UKGEpO3ZhciBsPWsuYTtsJiYhTyYmbCE9PWcmJihsLl91c2VDb3VudC0tLDA+PWwuX3VzZUNvdW50JiZsLnBhcmVudE5vZGUmJmwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsKSk7Tz9rLmE/KGsuYS50ZXh0Q29udGVudD1oLGc9ay5hKTpoJiYoZz1nZihoLGYsYS5zaGFkb3dSb290LGsuYikpOmc/Zy5wYXJlbnROb2RlfHwoVmYmJi0xPGguaW5kZXhPZigiQG1lZGlhIikmJihnLnRleHRDb250ZW50PWgpLGhmKGcsbnVsbCxrLmIpKTpoJiYoZz1nZihoLGYsbnVsbCxrLmIpKTtnJiYoZy5fdXNlQ291bnQ9Zy5fdXNlQ291bnR8fDAsay5hIT1nJiZnLl91c2VDb3VudCsrLGsuYT1nKTtmPWc7T3x8KGc9Yy5zLGs9aD1hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIsZSYmKGs9aC5yZXBsYWNlKG5ldyBSZWdFeHAoIlxccyp4LXNjb3BlXFxzKiIrCmUrIlxccyoiLCJnIiksIiAiKSksays9KGs/IiAiOiIiKSsieC1zY29wZSAiK2csaCE9PWsmJm5mKGEsaykpO2R8fENnLnN0b3JlKGIsYy53LGYsYy5zKX19OwpmdW5jdGlvbiBIZyhhLGIsYyl7dmFyIGQ9cGYoYikuaXM7aWYoYy5vKXt2YXIgZT1jLm8sZjtmb3IoZiBpbiBlKW51bGw9PT1mP2Iuc3R5bGUucmVtb3ZlUHJvcGVydHkoZik6Yi5zdHlsZS5zZXRQcm9wZXJ0eShmLGVbZl0pfWU9d2dbZF07aWYoISghZSYmYiE9PWEuY3x8ZSYmIiIhPT1yZihlKSkmJmUmJmUuX3N0eWxlJiYhemcoZSkpe2lmKHpnKGUpfHxlLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbiE9PWUuX2FwcGx5U2hpbU5leHRWZXJzaW9uKURnKGEpLGEuYSYmYS5hLnRyYW5zZm9ybVJ1bGVzKGUuX3N0eWxlQXN0LGQpLGUuX3N0eWxlLnRleHRDb250ZW50PXpmKGIsYy5BKSxBZyhlKTtPJiYoYT1iLnNoYWRvd1Jvb3QpJiYoYT1hLnF1ZXJ5U2VsZWN0b3IoInN0eWxlIikpJiYoYS50ZXh0Q29udGVudD16ZihiLGMuQSkpO2MuQT1lLl9zdHlsZUFzdH19CmZ1bmN0aW9uIElnKGEsYil7cmV0dXJuKGI9b2YoYikuZ2V0Um9vdE5vZGUoKS5ob3N0KT9UKGIpfHxFZyhiKT9iOklnKGEsYik6YS5jfWZ1bmN0aW9uIEdnKGEsYixjKXt2YXIgZD1JZyhhLGIpLGU9VChkKSxmPWUudztkPT09YS5jfHxmfHwoR2coYSxkLGUpLGY9ZS53KTthPU9iamVjdC5jcmVhdGUoZnx8bnVsbCk7ZD1kZyhiLGMuQSxjLmNzc0J1aWxkKTtiPWJnKGUuQSxiKS52O09iamVjdC5hc3NpZ24oYSxkLkhhLGIsZC5SYSk7Yj1jLm87Zm9yKHZhciBnIGluIGIpaWYoKGU9YltnXSl8fDA9PT1lKWFbZ109ZTtnPWlnO2I9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYSk7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylkPWJbZV0sYVtkXT0kZihnLGFbZF0sYSk7Yy53PWF9bi5zdHlsZURvY3VtZW50PWZ1bmN0aW9uKGEpe3RoaXMuc3R5bGVTdWJ0cmVlKHRoaXMuYyxhKX07Cm4uc3R5bGVTdWJ0cmVlPWZ1bmN0aW9uKGEsYil7dmFyIGM9b2YoYSksZD1jLnNoYWRvd1Jvb3Q7KGR8fGE9PT10aGlzLmMpJiZ0aGlzLnN0eWxlRWxlbWVudChhLGIpO2lmKGE9ZCYmKGQuY2hpbGRyZW58fGQuY2hpbGROb2RlcykpZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLnN0eWxlU3VidHJlZShhW2NdKTtlbHNlIGlmKGM9Yy5jaGlsZHJlbnx8Yy5jaGlsZE5vZGVzKWZvcihhPTA7YTxjLmxlbmd0aDthKyspdGhpcy5zdHlsZVN1YnRyZWUoY1thXSl9OwpuLnJhPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1yZihhKTtjIT09dGhpcy5mLmNzc0J1aWxkJiYodGhpcy5mLmNzc0J1aWxkPWMpO2lmKCFzZihjKSl7dmFyIGQ9ZWYoYSk7ZGYoZCxmdW5jdGlvbihhKXtpZihPKVJmKGEpO2Vsc2V7dmFyIGQ9UjthLnNlbGVjdG9yPWEucGFyc2VkU2VsZWN0b3I7UmYoYSk7YS5zZWxlY3Rvcj1hLmo9Q2YoZCxhLGQuYyx2b2lkIDAsdm9pZCAwKX1RJiYiIj09PWMmJihEZyhiKSxiLmEmJmIuYS50cmFuc2Zvcm1SdWxlKGEpKX0pO1E/YS50ZXh0Q29udGVudD1jZihkKTp0aGlzLmYuQS5ydWxlcy5wdXNoKGQpfX07bi5nZXRDb21wdXRlZFN0eWxlVmFsdWU9ZnVuY3Rpb24oYSxiKXt2YXIgYztRfHwoYz0oVChhKXx8VChJZyh0aGlzLGEpKSkud1tiXSk7cmV0dXJuKGM9Y3x8d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkuZ2V0UHJvcGVydHlWYWx1ZShiKSk/Yy50cmltKCk6IiJ9OwpuLlVhPWZ1bmN0aW9uKGEsYil7dmFyIGM9b2YoYSkuZ2V0Um9vdE5vZGUoKTtiPWI/Yi5zcGxpdCgvXHMvKTpbXTtjPWMuaG9zdCYmYy5ob3N0LmxvY2FsTmFtZTtpZighYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7aWYoZCl7ZD1kLnNwbGl0KC9ccy8pO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKWlmKGRbZV09PT1SLmEpe2M9ZFtlKzFdO2JyZWFrfX19YyYmYi5wdXNoKFIuYSxjKTtRfHwoYz1UKGEpKSYmYy5zJiZiLnB1c2goaWcuYSxjLnMpO25mKGEsYi5qb2luKCIgIikpfTtuLkJhPWZ1bmN0aW9uKGEpe3JldHVybiBUKGEpfTtuLlRhPWZ1bmN0aW9uKGEsYil7d2YoYSxiKX07bi5XYT1mdW5jdGlvbihhLGIpe3dmKGEsYiwhMCl9O24uU2E9ZnVuY3Rpb24oYSl7cmV0dXJuIHFnKGEpfTtuLkRhPWZ1bmN0aW9uKGEpe3JldHVybiBwZyhhKX07WS5wcm90b3R5cGUuZmx1c2g9WS5wcm90b3R5cGUuZmx1c2g7WS5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlPVkucHJvdG90eXBlLnByZXBhcmVUZW1wbGF0ZTsKWS5wcm90b3R5cGUuc3R5bGVFbGVtZW50PVkucHJvdG90eXBlLnN0eWxlRWxlbWVudDtZLnByb3RvdHlwZS5zdHlsZURvY3VtZW50PVkucHJvdG90eXBlLnN0eWxlRG9jdW1lbnQ7WS5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlPVkucHJvdG90eXBlLnN0eWxlU3VidHJlZTtZLnByb3RvdHlwZS5nZXRDb21wdXRlZFN0eWxlVmFsdWU9WS5wcm90b3R5cGUuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlO1kucHJvdG90eXBlLnNldEVsZW1lbnRDbGFzcz1ZLnByb3RvdHlwZS5VYTtZLnByb3RvdHlwZS5fc3R5bGVJbmZvRm9yTm9kZT1ZLnByb3RvdHlwZS5CYTtZLnByb3RvdHlwZS50cmFuc2Zvcm1DdXN0b21TdHlsZUZvckRvY3VtZW50PVkucHJvdG90eXBlLnJhO1kucHJvdG90eXBlLmdldFN0eWxlQXN0PVkucHJvdG90eXBlLkZhO1kucHJvdG90eXBlLnN0eWxlQXN0VG9TdHJpbmc9WS5wcm90b3R5cGUuVmE7WS5wcm90b3R5cGUuZmx1c2hDdXN0b21TdHlsZXM9WS5wcm90b3R5cGUuZmx1c2hDdXN0b21TdHlsZXM7ClkucHJvdG90eXBlLnNjb3BlTm9kZT1ZLnByb3RvdHlwZS5UYTtZLnByb3RvdHlwZS51bnNjb3BlTm9kZT1ZLnByb3RvdHlwZS5XYTtZLnByb3RvdHlwZS5zY29wZUZvck5vZGU9WS5wcm90b3R5cGUuU2E7WS5wcm90b3R5cGUuY3VycmVudFNjb3BlRm9yTm9kZT1ZLnByb3RvdHlwZS5EYTtZLnByb3RvdHlwZS5wcmVwYXJlQWRvcHRlZENzc1RleHQ9WS5wcm90b3R5cGUuUWE7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoWS5wcm90b3R5cGUse25hdGl2ZVNoYWRvdzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE99fSxuYXRpdmVDc3M6e2dldDpmdW5jdGlvbigpe3JldHVybiBRfX19KTt2YXIgWj1uZXcgWSxKZyxLZzt3aW5kb3cuU2hhZHlDU1MmJihKZz13aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltLEtnPXdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSk7CndpbmRvdy5TaGFkeUNTUz17U2NvcGluZ1NoaW06WixwcmVwYXJlVGVtcGxhdGU6ZnVuY3Rpb24oYSxiLGMpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnByZXBhcmVUZW1wbGF0ZShhLGIsYyl9LHByZXBhcmVUZW1wbGF0ZURvbTpmdW5jdGlvbihhLGIpe1oucHJlcGFyZVRlbXBsYXRlRG9tKGEsYil9LHByZXBhcmVUZW1wbGF0ZVN0eWxlczpmdW5jdGlvbihhLGIsYyl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1oucHJlcGFyZVRlbXBsYXRlU3R5bGVzKGEsYixjKX0sc3R5bGVTdWJ0cmVlOmZ1bmN0aW9uKGEsYil7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1ouc3R5bGVTdWJ0cmVlKGEsYil9LHN0eWxlRWxlbWVudDpmdW5jdGlvbihhKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZUVsZW1lbnQoYSl9LHN0eWxlRG9jdW1lbnQ6ZnVuY3Rpb24oYSl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1ouc3R5bGVEb2N1bWVudChhKX0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCl9LApnZXRDb21wdXRlZFN0eWxlVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gWi5nZXRDb21wdXRlZFN0eWxlVmFsdWUoYSxiKX0sbmF0aXZlQ3NzOlEsbmF0aXZlU2hhZG93Ok8sY3NzQnVpbGQ6UWUsZGlzYWJsZVJ1bnRpbWU6UGV9O0pnJiYod2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbT1KZyk7S2cmJih3aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2U9S2cpO3ZhciBMZz13aW5kb3cuY3VzdG9tRWxlbWVudHMsTWc9d2luZG93LkhUTUxJbXBvcnRzLE5nPXdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50O3dpbmRvdy5XZWJDb21wb25lbnRzPXdpbmRvdy5XZWJDb21wb25lbnRzfHx7fTtpZihMZyYmTGcucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayl7dmFyIE9nLFBnPWZ1bmN0aW9uKCl7aWYoT2cpe05nLkMmJk5nLkMod2luZG93LmRvY3VtZW50KTt2YXIgYT1PZztPZz1udWxsO2EoKTtyZXR1cm4hMH19LFFnPU1nLndoZW5SZWFkeTtMZy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKGZ1bmN0aW9uKGEpe09nPWE7UWcoUGcpfSk7TWcud2hlblJlYWR5PWZ1bmN0aW9uKGEpe1FnKGZ1bmN0aW9uKCl7UGcoKT9NZy53aGVuUmVhZHkoYSk6YSgpfSl9fQpNZy53aGVuUmVhZHkoZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt3aW5kb3cuV2ViQ29tcG9uZW50cy5yZWFkeT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiV2ViQ29tcG9uZW50c1JlYWR5Iix7YnViYmxlczohMH0pKX0pfSk7dmFyIFJnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7UmcudGV4dENvbnRlbnQ9ImJvZHkge3RyYW5zaXRpb246IG9wYWNpdHkgZWFzZS1pbiAwLjJzOyB9IFxuYm9keVt1bnJlc29sdmVkXSB7b3BhY2l0eTogMDsgZGlzcGxheTogYmxvY2s7IG92ZXJmbG93OiBoaWRkZW47IHBvc2l0aW9uOiByZWxhdGl2ZTsgfSBcbiI7dmFyIFNnPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImhlYWQiKTtTZy5pbnNlcnRCZWZvcmUoUmcsU2cuZmlyc3RDaGlsZCk7fSkuY2FsbCh0aGlzKTsKCgoKKGZ1bmN0aW9uKCl7LyoKCkNvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCid1c2Ugc3RyaWN0Jzt2YXIgbD0hKHdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmluVXNlKSxwO2Z1bmN0aW9uIHIoYSl7cD1hJiZhLnNoaW1jc3Nwcm9wZXJ0aWVzPyExOmx8fCEobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQXBwbGVXZWJLaXRcLzYwMXxFZGdlXC8xNS8pfHwhd2luZG93LkNTU3x8IUNTUy5zdXBwb3J0c3x8IUNTUy5zdXBwb3J0cygiYm94LXNoYWRvdyIsIjAgMCAwIHZhcigtLWZvbykiKSl9dmFyIHQ7d2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQmJih0PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCk7dmFyIGFhPSEoIXdpbmRvdy5TaGFkeUNTU3x8IXdpbmRvdy5TaGFkeUNTUy5kaXNhYmxlUnVudGltZSk7CndpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzcz9wPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyhyKHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6cih3aW5kb3cuV2ViQ29tcG9uZW50cyYmd2luZG93LldlYkNvbXBvbmVudHMuZmxhZ3MpO3ZhciB1PXAsdj10O2Z1bmN0aW9uIHcoKXt0aGlzLmVuZD10aGlzLnN0YXJ0PTA7dGhpcy5ydWxlcz10aGlzLnBhcmVudD10aGlzLnByZXZpb3VzPW51bGw7dGhpcy5jc3NUZXh0PXRoaXMucGFyc2VkQ3NzVGV4dD0iIjt0aGlzLmF0UnVsZT0hMTt0aGlzLnR5cGU9MDt0aGlzLnBhcnNlZFNlbGVjdG9yPXRoaXMuc2VsZWN0b3I9dGhpcy5rZXlmcmFtZXNOYW1lPSIifQpmdW5jdGlvbiB4KGEpe2E9YS5yZXBsYWNlKGJhLCIiKS5yZXBsYWNlKGNhLCIiKTt2YXIgYj15LGM9YSxlPW5ldyB3O2Uuc3RhcnQ9MDtlLmVuZD1jLmxlbmd0aDtmb3IodmFyIGQ9ZSxmPTAsZz1jLmxlbmd0aDtmPGc7ZisrKWlmKCJ7Ij09PWNbZl0pe2QucnVsZXN8fChkLnJ1bGVzPVtdKTt2YXIgaD1kLGs9aC5ydWxlc1toLnJ1bGVzLmxlbmd0aC0xXXx8bnVsbDtkPW5ldyB3O2Quc3RhcnQ9ZisxO2QucGFyZW50PWg7ZC5wcmV2aW91cz1rO2gucnVsZXMucHVzaChkKX1lbHNlIn0iPT09Y1tmXSYmKGQuZW5kPWYrMSxkPWQucGFyZW50fHxlKTtyZXR1cm4gYihlLGEpfQpmdW5jdGlvbiB5KGEsYil7dmFyIGM9Yi5zdWJzdHJpbmcoYS5zdGFydCxhLmVuZC0xKTthLnBhcnNlZENzc1RleHQ9YS5jc3NUZXh0PWMudHJpbSgpO2EucGFyZW50JiYoYz1iLnN1YnN0cmluZyhhLnByZXZpb3VzP2EucHJldmlvdXMuZW5kOmEucGFyZW50LnN0YXJ0LGEuc3RhcnQtMSksYz1kYShjKSxjPWMucmVwbGFjZSh6LCIgIiksYz1jLnN1YnN0cmluZyhjLmxhc3RJbmRleE9mKCI7IikrMSksYz1hLnBhcnNlZFNlbGVjdG9yPWEuc2VsZWN0b3I9Yy50cmltKCksYS5hdFJ1bGU9MD09PWMuaW5kZXhPZigiQCIpLGEuYXRSdWxlPzA9PT1jLmluZGV4T2YoIkBtZWRpYSIpP2EudHlwZT1BOmMubWF0Y2goZWEpJiYoYS50eXBlPUIsYS5rZXlmcmFtZXNOYW1lPWEuc2VsZWN0b3Iuc3BsaXQoeikucG9wKCkpOmEudHlwZT0wPT09Yy5pbmRleE9mKCItLSIpP0M6RCk7aWYoYz1hLnJ1bGVzKWZvcih2YXIgZT0wLGQ9Yy5sZW5ndGgsZj12b2lkIDA7ZTxkJiYoZj1jW2VdKTtlKyspeShmLGIpOwpyZXR1cm4gYX1mdW5jdGlvbiBkYShhKXtyZXR1cm4gYS5yZXBsYWNlKC9cXChbMC05YS1mXXsxLDZ9KVxzL2dpLGZ1bmN0aW9uKGEsYyl7YT1jO2ZvcihjPTYtYS5sZW5ndGg7Yy0tOylhPSIwIithO3JldHVybiJcXCIrYX0pfQpmdW5jdGlvbiBFKGEsYixjKXtjPXZvaWQgMD09PWM/IiI6Yzt2YXIgZT0iIjtpZihhLmNzc1RleHR8fGEucnVsZXMpe3ZhciBkPWEucnVsZXMsZjtpZihmPWQpZj1kWzBdLGY9IShmJiZmLnNlbGVjdG9yJiYwPT09Zi5zZWxlY3Rvci5pbmRleE9mKCItLSIpKTtpZihmKXtmPTA7Zm9yKHZhciBnPWQubGVuZ3RoLGg9dm9pZCAwO2Y8ZyYmKGg9ZFtmXSk7ZisrKWU9RShoLGIsZSl9ZWxzZSBiP2I9YS5jc3NUZXh0OihiPWEuY3NzVGV4dCxiPWIucmVwbGFjZShmYSwiIikucmVwbGFjZShoYSwiIiksYj1iLnJlcGxhY2UoaWEsIiIpLnJlcGxhY2UoamEsIiIpKSwoZT1iLnRyaW0oKSkmJihlPSIgICIrZSsiXG4iKX1lJiYoYS5zZWxlY3RvciYmKGMrPWEuc2VsZWN0b3IrIiB7XG4iKSxjKz1lLGEuc2VsZWN0b3ImJihjKz0ifVxuXG4iKSk7cmV0dXJuIGN9CnZhciBEPTEsQj03LEE9NCxDPTFFMyxiYT0vXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvL2dpbSxjYT0vQGltcG9ydFteO10qOy9naW0sZmE9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/KD86Wztcbl18JCkvZ2ltLGhhPS8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qP3tbXn1dKj99KD86Wztcbl18JCk/L2dpbSxpYT0vQGFwcGx5XHMqXCg/W14pO10qXCk/XHMqKD86Wztcbl18JCk/L2dpbSxqYT0vW147Ol0qPzpbXjtdKj92YXJcKFteO10qXCkoPzpbO1xuXXwkKT8vZ2ltLGVhPS9eQFteXHNdKmtleWZyYW1lcy8sej0vXHMrL2c7dmFyIEc9Lyg/Ol58Wztcc3tdXHMqKSgtLVtcdy1dKj8pXHMqOlxzKig/OigoPzonKD86XFwnfC4pKj8nfCIoPzpcXCJ8LikqPyJ8XChbXildKj9cKXxbXn07e10pKyl8XHsoW159XSopXH0oPzooPz1bO1xzfV0pfCQpKS9naSxIPS8oPzpefFxXKylAYXBwbHlccypcKD8oW14pO1xuXSopXCk/L2dpLGthPS9AbWVkaWFccyguKikvO3ZhciBJPW5ldyBTZXQ7ZnVuY3Rpb24gSihhKXtpZighYSlyZXR1cm4iIjsic3RyaW5nIj09PXR5cGVvZiBhJiYoYT14KGEpKTtyZXR1cm4gRShhLHUpfWZ1bmN0aW9uIEsoYSl7IWEuX19jc3NSdWxlcyYmYS50ZXh0Q29udGVudCYmKGEuX19jc3NSdWxlcz14KGEudGV4dENvbnRlbnQpKTtyZXR1cm4gYS5fX2Nzc1J1bGVzfHxudWxsfWZ1bmN0aW9uIEwoYSxiLGMsZSl7aWYoYSl7dmFyIGQ9ITEsZj1hLnR5cGU7aWYoZSYmZj09PUEpe3ZhciBnPWEuc2VsZWN0b3IubWF0Y2goa2EpO2cmJih3aW5kb3cubWF0Y2hNZWRpYShnWzFdKS5tYXRjaGVzfHwoZD0hMCkpfWY9PT1EP2IoYSk6YyYmZj09PUI/YyhhKTpmPT09QyYmKGQ9ITApO2lmKChhPWEucnVsZXMpJiYhZClmb3IoZD0wLGY9YS5sZW5ndGgsZz12b2lkIDA7ZDxmJiYoZz1hW2RdKTtkKyspTChnLGIsYyxlKX19CmZ1bmN0aW9uIE0oYSxiKXt2YXIgYz1hLmluZGV4T2YoInZhcigiKTtpZigtMT09PWMpcmV0dXJuIGIoYSwiIiwiIiwiIik7YTp7dmFyIGU9MDt2YXIgZD1jKzM7Zm9yKHZhciBmPWEubGVuZ3RoO2Q8ZjtkKyspaWYoIigiPT09YVtkXSllKys7ZWxzZSBpZigiKSI9PT1hW2RdJiYwPT09LS1lKWJyZWFrIGE7ZD0tMX1lPWEuc3Vic3RyaW5nKGMrNCxkKTtjPWEuc3Vic3RyaW5nKDAsYyk7YT1NKGEuc3Vic3RyaW5nKGQrMSksYik7ZD1lLmluZGV4T2YoIiwiKTtyZXR1cm4tMT09PWQ/YihjLGUudHJpbSgpLCIiLGEpOmIoYyxlLnN1YnN0cmluZygwLGQpLnRyaW0oKSxlLnN1YnN0cmluZyhkKzEpLnRyaW0oKSxhKX0KZnVuY3Rpb24gTihhKXtpZih2b2lkIDAhPT12KXJldHVybiB2O2lmKHZvaWQgMD09PWEuX19jc3NCdWlsZCl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoImNzcy1idWlsZCIpO2lmKGIpYS5fX2Nzc0J1aWxkPWI7ZWxzZXthOntiPSJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZT9hLmNvbnRlbnQuZmlyc3RDaGlsZDphLmZpcnN0Q2hpbGQ7aWYoYiBpbnN0YW5jZW9mIENvbW1lbnQmJihiPWIudGV4dENvbnRlbnQudHJpbSgpLnNwbGl0KCI6IiksImNzcy1idWlsZCI9PT1iWzBdKSl7Yj1iWzFdO2JyZWFrIGF9Yj0iIn1pZigiIiE9PWIpe3ZhciBjPSJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZT9hLmNvbnRlbnQuZmlyc3RDaGlsZDphLmZpcnN0Q2hpbGQ7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpfWEuX19jc3NCdWlsZD1ifX1yZXR1cm4gYS5fX2Nzc0J1aWxkfHwiIn07dmFyIGxhPS87XHMqL20sbWE9L15ccyooaW5pdGlhbCl8KGluaGVyaXQpXHMqJC8sTz0vXHMqIWltcG9ydGFudC87ZnVuY3Rpb24gUCgpe3RoaXMuYT17fX1QLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oYSxiKXthPWEudHJpbSgpO3RoaXMuYVthXT17aDpiLGk6e319fTtQLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSl7YT1hLnRyaW0oKTtyZXR1cm4gdGhpcy5hW2FdfHxudWxsfTt2YXIgUT1udWxsO2Z1bmN0aW9uIFIoKXt0aGlzLmI9dGhpcy5jPW51bGw7dGhpcy5hPW5ldyBQfVIucHJvdG90eXBlLm89ZnVuY3Rpb24oYSl7YT1ILnRlc3QoYSl8fEcudGVzdChhKTtILmxhc3RJbmRleD0wO0cubGFzdEluZGV4PTA7cmV0dXJuIGF9OwpSLnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEsYil7aWYodm9pZCAwPT09YS5fZ2F0aGVyZWRTdHlsZSl7dmFyIGM9W107Zm9yKHZhciBlPWEuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpLGQ9MDtkPGUubGVuZ3RoO2QrKyl7dmFyIGY9ZVtkXTtpZihmLmhhc0F0dHJpYnV0ZSgic2hhZHktdW5zY29wZWQiKSl7aWYoIWwpe3ZhciBnPWYudGV4dENvbnRlbnQ7SS5oYXMoZyl8fChJLmFkZChnKSxnPWYuY2xvbmVOb2RlKCEwKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGcpKTtmLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZil9fWVsc2UgYy5wdXNoKGYudGV4dENvbnRlbnQpLGYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmKX0oYz1jLmpvaW4oIiIpLnRyaW0oKSk/KGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSxlLnRleHRDb250ZW50PWMsYS5jb250ZW50Lmluc2VydEJlZm9yZShlLGEuY29udGVudC5maXJzdENoaWxkKSxjPWUpOmM9bnVsbDthLl9nYXRoZXJlZFN0eWxlPQpjfXJldHVybihhPWEuX2dhdGhlcmVkU3R5bGUpP3RoaXMuaihhLGIpOm51bGx9O1IucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/IiI6Yjt2YXIgYz1LKGEpO3RoaXMubChjLGIpO2EudGV4dENvbnRlbnQ9SihjKTtyZXR1cm4gY307Ui5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9SyhhKTtMKGMsZnVuY3Rpb24oYSl7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSJodG1sIik7Yi5nKGEpfSk7YS50ZXh0Q29udGVudD1KKGMpO3JldHVybiBjfTtSLnByb3RvdHlwZS5sPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpczt0aGlzLmM9YjtMKGEsZnVuY3Rpb24oYSl7Yy5nKGEpfSk7dGhpcy5jPW51bGx9O1IucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7YS5jc3NUZXh0PW5hKHRoaXMsYS5wYXJzZWRDc3NUZXh0LGEpOyI6cm9vdCI9PT1hLnNlbGVjdG9yJiYoYS5zZWxlY3Rvcj0iOmhvc3QgPiAqIil9OwpmdW5jdGlvbiBuYShhLGIsYyl7Yj1iLnJlcGxhY2UoRyxmdW5jdGlvbihiLGQsZixnKXtyZXR1cm4gb2EoYSxiLGQsZixnLGMpfSk7cmV0dXJuIFMoYSxiLGMpfWZ1bmN0aW9uIHBhKGEsYil7Zm9yKHZhciBjPWI7Yy5wYXJlbnQ7KWM9Yy5wYXJlbnQ7dmFyIGU9e30sZD0hMTtMKGMsZnVuY3Rpb24oYyl7KGQ9ZHx8Yz09PWIpfHxjLnNlbGVjdG9yPT09Yi5zZWxlY3RvciYmT2JqZWN0LmFzc2lnbihlLFQoYSxjLnBhcnNlZENzc1RleHQpKX0pO3JldHVybiBlfQpmdW5jdGlvbiBTKGEsYixjKXtmb3IodmFyIGU7ZT1ILmV4ZWMoYik7KXt2YXIgZD1lWzBdLGY9ZVsxXTtlPWUuaW5kZXg7dmFyIGc9Yi5zbGljZSgwLGUrZC5pbmRleE9mKCJAYXBwbHkiKSk7Yj1iLnNsaWNlKGUrZC5sZW5ndGgpO3ZhciBoPWM/cGEoYSxjKTp7fTtPYmplY3QuYXNzaWduKGgsVChhLGcpKTtkPXZvaWQgMDt2YXIgaz1hO2Y9Zi5yZXBsYWNlKGxhLCIiKTt2YXIgbj1bXTt2YXIgbT1rLmEuZ2V0KGYpO218fChrLmEuc2V0KGYse30pLG09ay5hLmdldChmKSk7aWYobSl7ay5jJiYobS5pW2suY109ITApO3ZhciBxPW0uaDtmb3IoZCBpbiBxKWs9aCYmaFtkXSxtPVtkLCI6IHZhcigiLGYsIl8tXyIsZF0sayYmbS5wdXNoKCIsIixrLnJlcGxhY2UoTywiIikpLG0ucHVzaCgiKSIpLE8udGVzdChxW2RdKSYmbS5wdXNoKCIgIWltcG9ydGFudCIpLG4ucHVzaChtLmpvaW4oIiIpKX1kPW4uam9pbigiOyAiKTtiPWcrZCtiO0gubGFzdEluZGV4PWUrZC5sZW5ndGh9cmV0dXJuIGJ9CmZ1bmN0aW9uIFQoYSxiLGMpe2M9dm9pZCAwPT09Yz8hMTpjO2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgZSxkLGY9e30sZz0wLGg7ZzxiLmxlbmd0aDtnKyspaWYoZT1iW2ddKWlmKGg9ZS5zcGxpdCgiOiIpLDE8aC5sZW5ndGgpe2U9aFswXS50cmltKCk7ZD1oLnNsaWNlKDEpLmpvaW4oIjoiKTtpZihjKXt2YXIgaz1hO2g9ZTt2YXIgbj1tYS5leGVjKGQpO24mJihuWzFdPyhrLmJ8fChrLmI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibWV0YSIpLGsuYi5zZXRBdHRyaWJ1dGUoImFwcGx5LXNoaW0tbWVhc3VyZSIsIiIpLGsuYi5zdHlsZS5hbGw9ImluaXRpYWwiLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoay5iKSksaD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShrLmIpLmdldFByb3BlcnR5VmFsdWUoaCkpOmg9ImFwcGx5LXNoaW0taW5oZXJpdCIsZD1oKX1mW2VdPWR9cmV0dXJuIGZ9ZnVuY3Rpb24gcWEoYSxiKXtpZihRKWZvcih2YXIgYyBpbiBiLmkpYyE9PWEuYyYmUShjKX0KZnVuY3Rpb24gb2EoYSxiLGMsZSxkLGYpe2UmJk0oZSxmdW5jdGlvbihiLGMpe2MmJmEuYS5nZXQoYykmJihkPSJAYXBwbHkgIitjKyI7Iil9KTtpZighZClyZXR1cm4gYjt2YXIgZz1TKGEsIiIrZCxmKTtmPWIuc2xpY2UoMCxiLmluZGV4T2YoIi0tIikpO3ZhciBoPWc9VChhLGcsITApLGs9YS5hLmdldChjKSxuPWsmJmsuaDtuP2g9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG4pLGcpOmEuYS5zZXQoYyxoKTt2YXIgbT1bXSxxLFo9ITE7Zm9yKHEgaW4gaCl7dmFyIEY9Z1txXTt2b2lkIDA9PT1GJiYoRj0iaW5pdGlhbCIpOyFufHxxIGluIG58fChaPSEwKTttLnB1c2goYysiXy1fIitxKyI6ICIrRil9WiYmcWEoYSxrKTtrJiYoay5oPWgpO2UmJihmPWIrIjsiK2YpO3JldHVybiBmK20uam9pbigiOyAiKSsiOyJ9Ui5wcm90b3R5cGUuZGV0ZWN0TWl4aW49Ui5wcm90b3R5cGUubztSLnByb3RvdHlwZS50cmFuc2Zvcm1TdHlsZT1SLnByb3RvdHlwZS5qOwpSLnByb3RvdHlwZS50cmFuc2Zvcm1DdXN0b21TdHlsZT1SLnByb3RvdHlwZS5mO1IucHJvdG90eXBlLnRyYW5zZm9ybVJ1bGVzPVIucHJvdG90eXBlLmw7Ui5wcm90b3R5cGUudHJhbnNmb3JtUnVsZT1SLnByb3RvdHlwZS5nO1IucHJvdG90eXBlLnRyYW5zZm9ybVRlbXBsYXRlPVIucHJvdG90eXBlLm07Ui5wcm90b3R5cGUuX3NlcGFyYXRvcj0iXy1fIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoUi5wcm90b3R5cGUsImludmFsaWRDYWxsYmFjayIse2dldDpmdW5jdGlvbigpe3JldHVybiBRfSxzZXQ6ZnVuY3Rpb24oYSl7UT1hfX0pO3ZhciBVPXt9O3ZhciByYT1Qcm9taXNlLnJlc29sdmUoKTtmdW5jdGlvbiBzYShhKXtpZihhPVVbYV0pYS5fYXBwbHlTaGltQ3VycmVudFZlcnNpb249YS5fYXBwbHlTaGltQ3VycmVudFZlcnNpb258fDAsYS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb258fDAsYS5fYXBwbHlTaGltTmV4dFZlcnNpb249KGEuX2FwcGx5U2hpbU5leHRWZXJzaW9ufHwwKSsxfWZ1bmN0aW9uIHRhKGEpe3JldHVybiBhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj09PWEuX2FwcGx5U2hpbU5leHRWZXJzaW9ufWZ1bmN0aW9uIHVhKGEpe2EuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmd8fChhLl92YWxpZGF0aW5nPSEwLHJhLnRoZW4oZnVuY3Rpb24oKXthLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1OZXh0VmVyc2lvbjthLl92YWxpZGF0aW5nPSExfSkpfTt2YXIgVj1uZXcgUjtmdW5jdGlvbiBXKCl7dGhpcy5hPW51bGw7Vi5pbnZhbGlkQ2FsbGJhY2s9c2F9ZnVuY3Rpb24gWChhKXshYS5hJiZ3aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UmJihhLmE9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlLGEuYS50cmFuc2Zvcm1DYWxsYmFjaz1mdW5jdGlvbihhKXtWLmYoYSl9LGEuYS52YWxpZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7YS5hLmVucXVldWVkJiZhLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX0pfVcucHJvdG90eXBlLnByZXBhcmVUZW1wbGF0ZT1mdW5jdGlvbihhLGIpe1godGhpcyk7IiI9PT1OKGEpJiYoVVtiXT1hLGI9Vi5tKGEsYiksYS5fc3R5bGVBc3Q9Yil9OwpXLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlcz1mdW5jdGlvbigpe1godGhpcyk7aWYodGhpcy5hKXt2YXIgYT10aGlzLmEucHJvY2Vzc1N0eWxlcygpO2lmKHRoaXMuYS5lbnF1ZXVlZCl7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuYS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKGFbYl0pO2MmJlYuZihjKX10aGlzLmEuZW5xdWV1ZWQ9ITF9fX07ClcucHJvdG90eXBlLnN0eWxlU3VidHJlZT1mdW5jdGlvbihhLGIpe1godGhpcyk7aWYoYilmb3IodmFyIGMgaW4gYiludWxsPT09Yz9hLnN0eWxlLnJlbW92ZVByb3BlcnR5KGMpOmEuc3R5bGUuc2V0UHJvcGVydHkoYyxiW2NdKTtpZihhLnNoYWRvd1Jvb3QpZm9yKHRoaXMuc3R5bGVFbGVtZW50KGEpLGE9YS5zaGFkb3dSb290LmNoaWxkcmVufHxhLnNoYWRvd1Jvb3QuY2hpbGROb2RlcyxiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5zdHlsZVN1YnRyZWUoYVtiXSk7ZWxzZSBmb3IoYT1hLmNoaWxkcmVufHxhLmNoaWxkTm9kZXMsYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuc3R5bGVTdWJ0cmVlKGFbYl0pfTsKVy5wcm90b3R5cGUuc3R5bGVFbGVtZW50PWZ1bmN0aW9uKGEpe1godGhpcyk7dmFyIGI9YS5sb2NhbE5hbWUsYztiPy0xPGIuaW5kZXhPZigiLSIpP2M9YjpjPWEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZSgiaXMiKXx8IiI6Yz1hLmlzO2I9VVtjXTtpZighKGImJiIiIT09TihiKXx8IWJ8fHRhKGIpKSl7aWYodGEoYil8fGIuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uIT09Yi5fYXBwbHlTaGltTmV4dFZlcnNpb24pdGhpcy5wcmVwYXJlVGVtcGxhdGUoYixjKSx1YShiKTtpZihhPWEuc2hhZG93Um9vdClpZihhPWEucXVlcnlTZWxlY3Rvcigic3R5bGUiKSlhLl9fY3NzUnVsZXM9Yi5fc3R5bGVBc3QsYS50ZXh0Q29udGVudD1KKGIuX3N0eWxlQXN0KX19O1cucHJvdG90eXBlLnN0eWxlRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7WCh0aGlzKTt0aGlzLnN0eWxlU3VidHJlZShkb2N1bWVudC5ib2R5LGEpfTsKaWYoIXdpbmRvdy5TaGFkeUNTU3x8IXdpbmRvdy5TaGFkeUNTUy5TY29waW5nU2hpbSl7dmFyIFk9bmV3IFcsdmE9d2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2U7d2luZG93LlNoYWR5Q1NTPXtwcmVwYXJlVGVtcGxhdGU6ZnVuY3Rpb24oYSxiKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCk7WS5wcmVwYXJlVGVtcGxhdGUoYSxiKX0scHJlcGFyZVRlbXBsYXRlU3R5bGVzOmZ1bmN0aW9uKGEsYixjKXt3aW5kb3cuU2hhZHlDU1MucHJlcGFyZVRlbXBsYXRlKGEsYixjKX0scHJlcGFyZVRlbXBsYXRlRG9tOmZ1bmN0aW9uKCl7fSxzdHlsZVN1YnRyZWU6ZnVuY3Rpb24oYSxiKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCk7WS5zdHlsZVN1YnRyZWUoYSxiKX0sc3R5bGVFbGVtZW50OmZ1bmN0aW9uKGEpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnN0eWxlRWxlbWVudChhKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Clkuc3R5bGVEb2N1bWVudChhKX0sZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuKGE9d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkuZ2V0UHJvcGVydHlWYWx1ZShiKSk/YS50cmltKCk6IiJ9LGZsdXNoQ3VzdG9tU3R5bGVzOmZ1bmN0aW9uKCl7WS5mbHVzaEN1c3RvbVN0eWxlcygpfSxuYXRpdmVDc3M6dSxuYXRpdmVTaGFkb3c6bCxjc3NCdWlsZDp2LGRpc2FibGVSdW50aW1lOmFhfTt2YSYmKHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT12YSl9d2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbT1WO30pLmNhbGwodGhpcyk7CgoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCB1c2VyUG9seW1lciA9IHdpbmRvdy5Qb2x5bWVyOwoKICAvKioKICAgKiBAbmFtZXNwYWNlIFBvbHltZXIKICAgKiBAc3VtbWFyeSBQb2x5bWVyIGlzIGEgbGlnaHR3ZWlnaHQgbGlicmFyeSBidWlsdCBvbiB0b3Agb2YgdGhlIHdlYgogICAqICAgc3RhbmRhcmRzLWJhc2VkIFdlYiBDb21wb25lbnRzIEFQSSdzLCBhbmQgbWFrZXMgaXQgZWFzeSB0byBidWlsZCB5b3VyCiAgICogICBvd24gY3VzdG9tIEhUTUwgZWxlbWVudHMuCiAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUHJvdG90eXBlIGZvciB0aGUgY3VzdG9tIGVsZW1lbnQuIEl0IG11c3QgY29udGFpbgogICAqICAgYW4gYGlzYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBlbGVtZW50IG5hbWUuIE90aGVyIHByb3BlcnRpZXMgcG9wdWxhdGUKICAgKiAgIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhlIGBwcm9wZXJ0aWVzYCwgYG9ic2VydmVyc2AsIGBob3N0QXR0cmlidXRlc2AsCiAgICogICBhbmQgYGxpc3RlbmVyc2AgcHJvcGVydGllcyBhcmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBlbGVtZW50IGZlYXR1cmVzLgogICAqIEByZXR1cm4geyFPYmplY3R9IFJldHVybnMgYSBjdXN0b20gZWxlbWVudCBjbGFzcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVkCiAgICogICBwcm90b3R5cGUgYGluZm9gIG9iamVjdC4gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaWYgZ2l2ZW4gYnkgYGluZm8uaXNgLgogICAqLwogIHdpbmRvdy5Qb2x5bWVyID0gZnVuY3Rpb24oaW5mbykgewogICAgcmV0dXJuIHdpbmRvdy5Qb2x5bWVyLl9wb2x5bWVyRm4oaW5mbyk7CiAgfTsKCiAgLy8gc3VwcG9ydCB1c2VyIHNldHRpbmdzIG9uIHRoZSBQb2x5bWVyIG9iamVjdAogIGlmICh1c2VyUG9seW1lcikgewogICAgT2JqZWN0LmFzc2lnbihQb2x5bWVyLCB1c2VyUG9seW1lcik7CiAgfQoKICAvLyBUbyBiZSBwbHVnZ2VkIGJ5IGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBpZiBsb2FkZWQKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogIC8qKgogICAqIEBwYXJhbSB7IVBvbHltZXJJbml0fSBpbmZvIFByb3RvdHlwZSBmb3IgdGhlIGN1c3RvbSBlbGVtZW50LiBJdCBtdXN0IGNvbnRhaW4KICAgKiAgIGFuIGBpc2AgcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgZWxlbWVudCBuYW1lLiBPdGhlciBwcm9wZXJ0aWVzIHBvcHVsYXRlCiAgICogICB0aGUgZWxlbWVudCBwcm90b3R5cGUuIFRoZSBgcHJvcGVydGllc2AsIGBvYnNlcnZlcnNgLCBgaG9zdEF0dHJpYnV0ZXNgLAogICAqICAgYW5kIGBsaXN0ZW5lcnNgIHByb3BlcnRpZXMgYXJlIHByb2Nlc3NlZCB0byBjcmVhdGUgZWxlbWVudCBmZWF0dXJlcy4KICAgKiBAcmV0dXJuIHshT2JqZWN0fSBSZXR1cm5zIGEgY3VzdG9tIGVsZW1lbnQgY2xhc3MgZm9yIHRoZSBnaXZlbiBwcm92aWRlZAogICAqICAgcHJvdG90eXBlIGBpbmZvYCBvYmplY3QuIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGlmIGdpdmVuIGJ5IGBpbmZvLmlzYC4KICAgKi8KICB3aW5kb3cuUG9seW1lci5fcG9seW1lckZuID0gZnVuY3Rpb24oaW5mbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvYWQgcG9seW1lci5odG1sIHRvIHVzZSB0aGUgUG9seW1lcigpIGZ1bmN0aW9uLicpOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSAqLwoKICB3aW5kb3cuUG9seW1lci52ZXJzaW9uID0gJzIuNy4wJzsKCiAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAvKgogIFdoZW4gdXNpbmcgQ2xvc3VyZSBDb21waWxlciwgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eShwcm9wZXJ0eSwgb2JqZWN0KSBpcyByZXBsYWNlZCBieSB0aGUgbXVuZ2VkIG5hbWUgZm9yIG9iamVjdFtwcm9wZXJ0eV0KICBXZSBjYW5ub3QgYWxpYXMgdGhpcyBmdW5jdGlvbiwgc28gd2UgaGF2ZSB0byB1c2UgYSBzbWFsbCBzaGltIHRoYXQgaGFzIHRoZSBzYW1lIGJlaGF2aW9yIHdoZW4gbm90IGNvbXBpbGluZy4KICAqLwogIHdpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCwgb2JqKSB7CiAgICByZXR1cm4gcHJvcDsKICB9OwogIC8qIGVzbGludC1lbmFibGUgKi8KCn0pKCk7CgoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGxldCBDU1NfVVJMX1JYID0gLyh1cmxcKCkoW14pXSopKFwpKS9nOwogICAgbGV0IEFCU19VUkwgPSAvKF5cLyl8KF4jKXwoXltcdy1cZF0qOikvOwogICAgbGV0IHdvcmtpbmdVUkw7CiAgICBsZXQgcmVzb2x2ZURvYzsKICAgIC8qKgogICAgICogUmVzb2x2ZXMgdGhlIGdpdmVuIFVSTCBhZ2FpbnN0IHRoZSBwcm92aWRlZCBgYmFzZVVyaScuCiAgICAgKiAKICAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIG5vIHJlc29sdXRpb24gZm9yIFVSTHMgdGhhdCBzdGFydAogICAgICogd2l0aCBgL2AgKGFic29sdXRlIFVSTHMpIG9yIGAjYCAoaGFzaCBpZGVudGlmaWVycykuICBGb3IgZ2VuZXJhbCBwdXJwb3NlCiAgICAgKiBVUkwgcmVzb2x1dGlvbiwgdXNlIGB3aW5kb3cuVVJMYC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5SZXNvbHZlVXJsCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIElucHV0IFVSTCB0byByZXNvbHZlCiAgICAgKiBAcGFyYW0gez9zdHJpbmc9fSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHJlc29sdmVkIFVSTAogICAgICovCiAgICBmdW5jdGlvbiByZXNvbHZlVXJsKHVybCwgYmFzZVVSSSkgewogICAgICBpZiAodXJsICYmIEFCU19VUkwudGVzdCh1cmwpKSB7CiAgICAgICAgcmV0dXJuIHVybDsKICAgICAgfQogICAgICAvLyBMYXp5IGZlYXR1cmUgZGV0ZWN0aW9uLgogICAgICBpZiAod29ya2luZ1VSTCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgd29ya2luZ1VSTCA9IGZhbHNlOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCB1ID0gbmV3IFVSTCgnYicsICdodHRwOi8vYScpOwogICAgICAgICAgdS5wYXRobmFtZSA9ICdjJTIwZCc7CiAgICAgICAgICB3b3JraW5nVVJMID0gKHUuaHJlZiA9PT0gJ2h0dHA6Ly9hL2MlMjBkJyk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgLy8gc2lsZW50bHkgZmFpbAogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWJhc2VVUkkpIHsKICAgICAgICBiYXNlVVJJID0gZG9jdW1lbnQuYmFzZVVSSSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgICAgfQogICAgICBpZiAod29ya2luZ1VSTCkgewogICAgICAgIHJldHVybiAobmV3IFVSTCh1cmwsIGJhc2VVUkkpKS5ocmVmOwogICAgICB9CiAgICAgIC8vIEZhbGxiYWNrIHRvIGNyZWF0aW5nIGFuIGFuY2hvciBpbnRvIGEgZGlzY29ubmVjdGVkIGRvY3VtZW50LgogICAgICBpZiAoIXJlc29sdmVEb2MpIHsKICAgICAgICByZXNvbHZlRG9jID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCd0ZW1wJyk7CiAgICAgICAgcmVzb2x2ZURvYy5iYXNlID0gcmVzb2x2ZURvYy5jcmVhdGVFbGVtZW50KCdiYXNlJyk7CiAgICAgICAgcmVzb2x2ZURvYy5oZWFkLmFwcGVuZENoaWxkKHJlc29sdmVEb2MuYmFzZSk7CiAgICAgICAgcmVzb2x2ZURvYy5hbmNob3IgPSByZXNvbHZlRG9jLmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICByZXNvbHZlRG9jLmJvZHkuYXBwZW5kQ2hpbGQocmVzb2x2ZURvYy5hbmNob3IpOwogICAgICB9CiAgICAgIHJlc29sdmVEb2MuYmFzZS5ocmVmID0gYmFzZVVSSTsKICAgICAgcmVzb2x2ZURvYy5hbmNob3IuaHJlZiA9IHVybDsKICAgICAgcmV0dXJuIHJlc29sdmVEb2MuYW5jaG9yLmhyZWYgfHwgdXJsOwoKICAgIH0KCiAgICAvKioKICAgICAqIFJlc29sdmVzIGFueSByZWxhdGl2ZSBVUkwncyBpbiB0aGUgZ2l2ZW4gQ1NTIHRleHQgYWdhaW5zdCB0aGUgcHJvdmlkZWQKICAgICAqIGBvd25lckRvY3VtZW50YCdzIGBiYXNlVVJJYC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5SZXNvbHZlVXJsCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3NzVGV4dCBDU1MgdGV4dCB0byBwcm9jZXNzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSB0byByZXNvbHZlIHRoZSBVUkwgYWdhaW5zdAogICAgICogQHJldHVybiB7c3RyaW5nfSBQcm9jZXNzZWQgQ1NTIHRleHQgd2l0aCByZXNvbHZlZCBVUkwncwogICAgICovCiAgICBmdW5jdGlvbiByZXNvbHZlQ3NzKGNzc1RleHQsIGJhc2VVUkkpIHsKICAgICAgcmV0dXJuIGNzc1RleHQucmVwbGFjZShDU1NfVVJMX1JYLCBmdW5jdGlvbihtLCBwcmUsIHVybCwgcG9zdCkgewogICAgICAgIHJldHVybiBwcmUgKyAnXCcnICsKICAgICAgICAgIHJlc29sdmVVcmwodXJsLnJlcGxhY2UoL1siJ10vZywgJycpLCBiYXNlVVJJKSArCiAgICAgICAgICAnXCcnICsgcG9zdDsKICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgcGF0aCBmcm9tIGEgZ2l2ZW4gYHVybGAuIFRoZSBwYXRoIGluY2x1ZGVzIHRoZSB0cmFpbGluZwogICAgICogYC9gIGZyb20gdGhlIHVybC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5SZXNvbHZlVXJsCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIElucHV0IFVSTCB0byB0cmFuc2Zvcm0KICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmVzb2x2ZWQgcGF0aAogICAgICovCiAgICBmdW5jdGlvbiBwYXRoRnJvbVVybCh1cmwpIHsKICAgICAgcmV0dXJuIHVybC5zdWJzdHJpbmcoMCwgdXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgIH0KCiAgICAvKioKICAgICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSTCdzLgogICAgICoKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIHJlc29sdmluZyByZWxhdGl2ZSBVUkwncy4KICAgICAqLwogICAgUG9seW1lci5SZXNvbHZlVXJsID0gewogICAgICByZXNvbHZlQ3NzOiByZXNvbHZlQ3NzLAogICAgICByZXNvbHZlVXJsOiByZXNvbHZlVXJsLAogICAgICBwYXRoRnJvbVVybDogcGF0aEZyb21VcmwKICAgIH07CgogIH0pKCk7CgoKCi8qKiBAc3VwcHJlc3Mge2RlcHJlY2F0ZWR9ICovCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIFNldHMgdGhlIGdsb2JhbCwgbGVnYWN5IHNldHRpbmdzLgogICAqCiAgICogQGRlcHJlY2F0ZWQKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKi8KICBQb2x5bWVyLlNldHRpbmdzID0gUG9seW1lci5TZXR0aW5ncyB8fCB7fTsKCiAgUG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cgPSAhKHdpbmRvdy5TaGFkeURPTSk7CiAgUG9seW1lci5TZXR0aW5ncy51c2VOYXRpdmVDU1NQcm9wZXJ0aWVzID0KICAgIEJvb2xlYW4oIXdpbmRvdy5TaGFkeUNTUyB8fCB3aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzKTsKICBQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZUN1c3RvbUVsZW1lbnRzID0KICAgICEod2luZG93LmN1c3RvbUVsZW1lbnRzLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2spOwoKCiAgLyoqCiAgICogR2xvYmFsbHkgc2V0dGFibGUgcHJvcGVydHkgdGhhdCBpcyBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIHRvCiAgICogYFBvbHltZXIuRWxlbWVudE1peGluYCBpbnN0YW5jZXMsIHVzZWZ1bCBmb3IgYmluZGluZyBpbiB0ZW1wbGF0ZXMgdG8KICAgKiBtYWtlIFVSTCdzIHJlbGF0aXZlIHRvIGFuIGFwcGxpY2F0aW9uJ3Mgcm9vdC4gIERlZmF1bHRzIHRvIHRoZSBtYWluCiAgICogZG9jdW1lbnQgVVJMLCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdXNlcnMuICBJdCBtYXkgYmUgdXNlZnVsIHRvIHNldAogICAqIGBQb2x5bWVyLnJvb3RQYXRoYCB0byBwcm92aWRlIGEgc3RhYmxlIGFwcGxpY2F0aW9uIG1vdW50IHBhdGggd2hlbgogICAqIHVzaW5nIGNsaWVudCBzaWRlIHJvdXRpbmcuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIFBvbHltZXIucm9vdFBhdGggPSBQb2x5bWVyLnJvb3RQYXRoIHx8CiAgICBQb2x5bWVyLlJlc29sdmVVcmwucGF0aEZyb21VcmwoZG9jdW1lbnQuYmFzZVVSSSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZik7CgogIC8qKgogICAqIFNldHMgdGhlIGdsb2JhbCByb290UGF0aCBwcm9wZXJ0eSB1c2VkIGJ5IGBQb2x5bWVyLkVsZW1lbnRNaXhpbmAgYW5kCiAgICogYXZhaWxhYmxlIHZpYSBgUG9seW1lci5yb290UGF0aGAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBuZXcgcm9vdCBwYXRoCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFJvb3RQYXRoID0gZnVuY3Rpb24ocGF0aCkgewogICAgUG9seW1lci5yb290UGF0aCA9IHBhdGg7CiAgfTsKCiAgLyoqCiAgICogQSBnbG9iYWwgY2FsbGJhY2sgdXNlZCB0byBzYW5pdGl6ZSBhbnkgdmFsdWUgYmVmb3JlIGluc2VydGluZyBpdCBpbnRvIHRoZSBET00uIFRoZSBjYWxsYmFjayBzaWduYXR1cmUgaXM6CiAgICoKICAgKiAgICAgUG9seW1lciA9IHsKICAgKiAgICAgICBzYW5pdGl6ZURPTVZhbHVlOiBmdW5jdGlvbih2YWx1ZSwgbmFtZSwgdHlwZSwgbm9kZSkgeyAuLi4gfQogICAqICAgICB9CiAgICoKICAgKiBXaGVyZToKICAgKgogICAqIGB2YWx1ZWAgaXMgdGhlIHZhbHVlIHRvIHNhbml0aXplLgogICAqIGBuYW1lYCBpcyB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgb3IgcHJvcGVydHkgKGZvciBleGFtcGxlLCBocmVmKS4KICAgKiBgdHlwZWAgaW5kaWNhdGVzIHdoZXJlIHRoZSB2YWx1ZSBpcyBiZWluZyBpbnNlcnRlZDogb25lIG9mIHByb3BlcnR5LCBhdHRyaWJ1dGUsIG9yIHRleHQuCiAgICogYG5vZGVgIGlzIHRoZSBub2RlIHdoZXJlIHRoZSB2YWx1ZSBpcyBiZWluZyBpbnNlcnRlZC4KICAgKgogICAqIEB0eXBlIHsoZnVuY3Rpb24oKixzdHJpbmcsc3RyaW5nLE5vZGUpOiopfHVuZGVmaW5lZH0KICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSA9IFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSB8fCBudWxsOwoKICAvKioKICAgKiBTZXRzIHRoZSBnbG9iYWwgc2FuaXRpemVET01WYWx1ZSBhdmFpbGFibGUgdmlhIGBQb2x5bWVyLnNhbml0aXplRE9NVmFsdWVgLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcGFyYW0geyhmdW5jdGlvbigqLHN0cmluZyxzdHJpbmcsTm9kZSk6Kil8dW5kZWZpbmVkfSBuZXdTYW5pdGl6ZURPTVZhbHVlIHRoZSBnbG9iYWwgc2FuaXRpemVET01WYWx1ZSBjYWxsYmFjawogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5zZXRTYW5pdGl6ZURPTVZhbHVlID0gZnVuY3Rpb24obmV3U2FuaXRpemVET01WYWx1ZSkgewogICAgUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlID0gbmV3U2FuaXRpemVET01WYWx1ZTsKICB9OwoKICAvKioKICAgKiBHbG9iYWxseSBzZXR0YWJsZSBwcm9wZXJ0eSB0byBtYWtlIFBvbHltZXIgR2VzdHVyZXMgdXNlIHBhc3NpdmUgVG91Y2hFdmVudCBsaXN0ZW5lcnMgd2hlbiByZWNvZ25pemluZyBnZXN0dXJlcy4KICAgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIGdlc3R1cmVzIG1hZGUgZnJvbSB0b3VjaCB3aWxsIG5vdCBiZSBhYmxlIHRvIHByZXZlbnQgc2Nyb2xsaW5nLCBhbGxvd2luZyBmb3Igc21vb3RoZXIKICAgKiBzY3JvbGxpbmcgcGVyZm9ybWFuY2UuCiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIFBvbHltZXIucGFzc2l2ZVRvdWNoR2VzdHVyZXMgPSBQb2x5bWVyLnBhc3NpdmVUb3VjaEdlc3R1cmVzIHx8IGZhbHNlOwoKICAvKioKICAgKiBTZXRzIGBwYXNzaXZlVG91Y2hHZXN0dXJlc2AgZ2xvYmFsbHkgZm9yIGFsbCBlbGVtZW50cyB1c2luZyBQb2x5bWVyIEdlc3R1cmVzLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVzZVBhc3NpdmUgZW5hYmxlIG9yIGRpc2FibGUgcGFzc2l2ZSB0b3VjaCBnZXN0dXJlcyBnbG9iYWxseQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5zZXRQYXNzaXZlVG91Y2hHZXN0dXJlcyA9IGZ1bmN0aW9uKHVzZVBhc3NpdmUpIHsKICAgIFBvbHltZXIucGFzc2l2ZVRvdWNoR2VzdHVyZXMgPSB1c2VQYXNzaXZlOwogIH07CgogIFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyA9IFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyB8fAogICAgICB3aW5kb3cuUG9seW1lclNldHRpbmdzICYmIHdpbmRvdy5Qb2x5bWVyU2V0dGluZ3MubGVnYWN5T3B0aW1pemF0aW9ucyB8fCBmYWxzZTsKCiAgLyoqCiAgICogU2V0cyBgbGVnYWN5T3B0aW1pemF0aW9uc2AgZ2xvYmFsbHkgZm9yIGFsbCBlbGVtZW50cy4gRW5hYmxlcwogICAqIG9wdGltaXphdGlvbnMgd2hlbiBvbmx5IGxlZ2FjeSBQb2x5bWVyKCkgc3R5bGUgZWxlbWVudHMgYXJlIHVzZWQuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlTGVnYWN5T3B0aW1pemF0aW9ucyBlbmFibGUgb3IgZGlzYWJsZSBsZWdhY3kgb3B0aW1pemF0aW9ucyBnbG9iYWxseS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuc2V0TGVnYWN5T3B0aW1pemF0aW9ucyA9IGZ1bmN0aW9uKHVzZUxlZ2FjeU9wdGltaXphdGlvbnMpIHsKICAgIFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyA9IHVzZUxlZ2FjeU9wdGltaXphdGlvbnM7CiAgfTsKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIC8vIHVuaXF1ZSBnbG9iYWwgaWQgZm9yIGRlZHVwaW5nIG1peGlucy4KICBsZXQgZGVkdXBlSWQgPSAwOwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7RnVuY3Rpb259CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBNaXhpbkZ1bmN0aW9uKCl7fQogIC8qKiBAdHlwZSB7KFdlYWtNYXAgfCB1bmRlZmluZWQpfSAqLwogIE1peGluRnVuY3Rpb24ucHJvdG90eXBlLl9fbWl4aW5BcHBsaWNhdGlvbnM7CiAgLyoqIEB0eXBlIHsoT2JqZWN0IHwgdW5kZWZpbmVkKX0gKi8KICBNaXhpbkZ1bmN0aW9uLnByb3RvdHlwZS5fX21peGluU2V0OwoKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogIC8qKgogICAqIFdyYXBzIGFuIEVTNiBjbGFzcyBleHByZXNzaW9uIG1peGluIHN1Y2ggdGhhdCB0aGUgbWl4aW4gaXMgb25seSBhcHBsaWVkCiAgICogaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYXBwbGllZCBpdHMgYmFzZSBhcmd1bWVudC4gQWxzbyBtZW1vaXplcyBtaXhpbgogICAqIGFwcGxpY2F0aW9ucy4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHRlbXBsYXRlIFQKICAgKiBAcGFyYW0ge1R9IG1peGluIEVTNiBjbGFzcyBleHByZXNzaW9uIG1peGluIHRvIHdyYXAKICAgKiBAcmV0dXJuIHtUfQogICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAqLwogIFBvbHltZXIuZGVkdXBpbmdNaXhpbiA9IGZ1bmN0aW9uKG1peGluKSB7CiAgICBsZXQgbWl4aW5BcHBsaWNhdGlvbnMgPSAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhtaXhpbikuX19taXhpbkFwcGxpY2F0aW9uczsKICAgIGlmICghbWl4aW5BcHBsaWNhdGlvbnMpIHsKICAgICAgbWl4aW5BcHBsaWNhdGlvbnMgPSBuZXcgV2Vha01hcCgpOwogICAgICAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhtaXhpbikuX19taXhpbkFwcGxpY2F0aW9ucyA9IG1peGluQXBwbGljYXRpb25zOwogICAgfQogICAgLy8gbWFpbnRhaW4gYSB1bmlxdWUgaWQgZm9yIGVhY2ggbWl4aW4KICAgIGxldCBtaXhpbkRlZHVwZUlkID0gZGVkdXBlSWQrKzsKICAgIGZ1bmN0aW9uIGRlZHVwaW5nTWl4aW4oYmFzZSkgewogICAgICBsZXQgYmFzZVNldCA9IC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKGJhc2UpLl9fbWl4aW5TZXQ7CiAgICAgIGlmIChiYXNlU2V0ICYmIGJhc2VTZXRbbWl4aW5EZWR1cGVJZF0pIHsKICAgICAgICByZXR1cm4gYmFzZTsKICAgICAgfQogICAgICBsZXQgbWFwID0gbWl4aW5BcHBsaWNhdGlvbnM7CiAgICAgIGxldCBleHRlbmRlZCA9IG1hcC5nZXQoYmFzZSk7CiAgICAgIGlmICghZXh0ZW5kZWQpIHsKICAgICAgICBleHRlbmRlZCA9IC8qKiBAdHlwZSB7IUZ1bmN0aW9ufSAqLyhtaXhpbikoYmFzZSk7CiAgICAgICAgbWFwLnNldChiYXNlLCBleHRlbmRlZCk7CiAgICAgIH0KICAgICAgLy8gY29weSBpbmhlcml0ZWQgbWl4aW4gc2V0IGZyb20gdGhlIGV4dGVuZGVkIGNsYXNzLCBvciB0aGUgYmFzZSBjbGFzcwogICAgICAvLyBOT1RFOiB3ZSBhdm9pZCB1c2Ugb2YgU2V0IGhlcmUgYmVjYXVzZSBzb21lIGJyb3dzZXIgKElFMTEpCiAgICAgIC8vIGNhbm5vdCBleHRlbmQgYSBiYXNlIFNldCB2aWEgdGhlIGNvbnN0cnVjdG9yLgogICAgICBsZXQgbWl4aW5TZXQgPSBPYmplY3QuY3JlYXRlKC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKGV4dGVuZGVkKS5fX21peGluU2V0IHx8IGJhc2VTZXQgfHwgbnVsbCk7CiAgICAgIG1peGluU2V0W21peGluRGVkdXBlSWRdID0gdHJ1ZTsKICAgICAgLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oZXh0ZW5kZWQpLl9fbWl4aW5TZXQgPSBtaXhpblNldDsKICAgICAgcmV0dXJuIGV4dGVuZGVkOwogICAgfQoKICAgIHJldHVybiAvKiogQHR5cGUge1R9ICovIChkZWR1cGluZ01peGluKTsKICB9OwogIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IE1PRFVMRV9TVFlMRV9MSU5LX1NFTEVDVE9SID0gJ2xpbmtbcmVsPWltcG9ydF1bdHlwZX49Y3NzXSc7CiAgY29uc3QgSU5DTFVERV9BVFRSID0gJ2luY2x1ZGUnOwogIGNvbnN0IFNIQURZX1VOU0NPUEVEX0FUVFIgPSAnc2hhZHktdW5zY29wZWQnOwoKICBmdW5jdGlvbiBpbXBvcnRNb2R1bGUobW9kdWxlSWQpIHsKICAgIGNvbnN0IC8qKiBQb2x5bWVyLkRvbU1vZHVsZSAqLyBQb2x5bWVyRG9tTW9kdWxlID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdkb20tbW9kdWxlJyk7CiAgICBpZiAoIVBvbHltZXJEb21Nb2R1bGUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gUG9seW1lckRvbU1vZHVsZS5pbXBvcnQobW9kdWxlSWQpOwogIH0KCiAgZnVuY3Rpb24gc3R5bGVGb3JJbXBvcnQoaW1wb3J0RG9jKSB7CiAgICAvLyBOT1RFOiBwb2x5ZmlsbCBhZmZvcmRhbmNlLgogICAgLy8gdW5kZXIgdGhlIEhUTUxJbXBvcnRzIHBvbHlmaWxsLCB0aGVyZSB3aWxsIGJlIG5vICdib2R5JywKICAgIC8vIGJ1dCB0aGUgaW1wb3J0IHBzZXVkby1kb2MgY2FuIGJlIHVzZWQgZGlyZWN0bHkuCiAgICBsZXQgY29udGFpbmVyID0gaW1wb3J0RG9jLmJvZHkgPyBpbXBvcnREb2MuYm9keSA6IGltcG9ydERvYzsKICAgIGNvbnN0IGltcG9ydENzcyA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlQ3NzKGNvbnRhaW5lci50ZXh0Q29udGVudCwKICAgICAgaW1wb3J0RG9jLmJhc2VVUkkpOwogICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgc3R5bGUudGV4dENvbnRlbnQgPSBpbXBvcnRDc3M7CiAgICByZXR1cm4gc3R5bGU7CiAgfQoKICAvKiogQHR5cGVkZWYge3thc3NldHBhdGg6IHN0cmluZ319ICovCiAgbGV0IHRlbXBsYXRlV2l0aEFzc2V0UGF0aDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAvKioKICAgKiBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIGNvbGxlY3Rpb24gQ1NTIHRleHQgZnJvbSBgPHRlbXBsYXRlcz5gLCBleHRlcm5hbAogICAqIHN0eWxlc2hlZXRzLCBhbmQgYGRvbS1tb2R1bGVgcy4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29sbGVjdGlvbiBDU1MgdGV4dCBmcm9tIHZhcmlvdXMgc291cmNlcy4KICAgKi8KICBjb25zdCBTdHlsZUdhdGhlciA9IHsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIDxzdHlsZT4gZWxlbWVudHMgaW4gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBgZG9tLW1vZHVsZWBzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWRzIExpc3Qgb2YgZG9tLW1vZHVsZSBpZCdzIHdpdGhpbiB3aGljaCB0bwogICAgICogc2VhcmNoIGZvciBjc3MuCiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBjb250YWluZWQgPHN0eWxlPiBlbGVtZW50cwogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICAgc3R5bGVzRnJvbU1vZHVsZXMobW9kdWxlSWRzKSB7CiAgICAgIGNvbnN0IG1vZHVsZXMgPSBtb2R1bGVJZHMudHJpbSgpLnNwbGl0KC9ccysvKTsKICAgICAgY29uc3Qgc3R5bGVzID0gW107CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzdHlsZXMucHVzaCguLi50aGlzLnN0eWxlc0Zyb21Nb2R1bGUobW9kdWxlc1tpXSkpOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZXM7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyBpbiBhIGdpdmVuIGBkb20tbW9kdWxlYC4KICAgICAqIFN0eWxlcyBpbiBhIGBkb20tbW9kdWxlYCBjYW4gY29tZSBlaXRoZXIgZnJvbSBgPHN0eWxlPmBzIHdpdGhpbiB0aGUKICAgICAqIGZpcnN0IGA8dGVtcGxhdGU+YCwgb3IgZWxzZSBmcm9tIG9uZSBvciBtb3JlCiAgICAgKiBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBsaW5rcyBvdXRzaWRlIHRoZSB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIGRvbS1tb2R1bGUgaWQgdG8gZ2F0aGVyIHN0eWxlcyBmcm9tCiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBjb250YWluZWQgc3R5bGVzLgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICBzdHlsZXNGcm9tTW9kdWxlKG1vZHVsZUlkKSB7CiAgICAgIGNvbnN0IG0gPSBpbXBvcnRNb2R1bGUobW9kdWxlSWQpOwoKICAgICAgaWYgKCFtKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCcsIG1vZHVsZUlkKTsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KCiAgICAgIGlmIChtLl9zdHlsZXMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICAgIC8vIG1vZHVsZSBpbXBvcnRzOiA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj4KICAgICAgICBzdHlsZXMucHVzaCguLi50aGlzLl9zdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtKSk7CiAgICAgICAgLy8gaW5jbHVkZSBjc3MgZnJvbSB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIG1vZHVsZQogICAgICAgIGNvbnN0IHRlbXBsYXRlID0gbS5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICAgIGlmICh0ZW1wbGF0ZSkgewogICAgICAgICAgc3R5bGVzLnB1c2goLi4udGhpcy5zdHlsZXNGcm9tVGVtcGxhdGUodGVtcGxhdGUsCiAgICAgICAgICAgIC8qKiBAdHlwZSB7dGVtcGxhdGVXaXRoQXNzZXRQYXRofSAqLyhtKS5hc3NldHBhdGgpKTsKICAgICAgICB9CgogICAgICAgIG0uX3N0eWxlcyA9IHN0eWxlczsKICAgICAgfQoKICAgICAgcmV0dXJuIG0uX3N0eWxlczsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBgPHN0eWxlPmAgZWxlbWVudHMgd2l0aGluIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIGdhdGhlciBzdHlsZXMgZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkkgYmFzZVVSSSBmb3Igc3R5bGUgY29udGVudAogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2Ygc3R5bGVzCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIHN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgYmFzZVVSSSkgewogICAgICBpZiAoIXRlbXBsYXRlLl9zdHlsZXMpIHsKICAgICAgICBjb25zdCBzdHlsZXMgPSBbXTsKICAgICAgICAvLyBpZiBlbGVtZW50IGlzIGEgdGVtcGxhdGUsIGdldCBjb250ZW50IGZyb20gaXRzIC5jb250ZW50CiAgICAgICAgY29uc3QgZSQgPSB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZSQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCBlID0gZSRbaV07CiAgICAgICAgICAvLyBzdXBwb3J0IHN0eWxlIHNoYXJpbmcgYnkgYWxsb3dpbmcgc3R5bGVzIHRvICJpbmNsdWRlIgogICAgICAgICAgLy8gb3RoZXIgZG9tLW1vZHVsZXMgdGhhdCBjb250YWluIHN0eWxpbmcKICAgICAgICAgIGxldCBpbmNsdWRlID0gZS5nZXRBdHRyaWJ1dGUoSU5DTFVERV9BVFRSKTsKICAgICAgICAgIGlmIChpbmNsdWRlKSB7CiAgICAgICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuc3R5bGVzRnJvbU1vZHVsZXMoaW5jbHVkZSkuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBzZWxmKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZihpdGVtKSA9PT0gaW5kZXg7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChiYXNlVVJJKSB7CiAgICAgICAgICAgIGUudGV4dENvbnRlbnQgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZUNzcyhlLnRleHRDb250ZW50LCBiYXNlVVJJKTsKICAgICAgICAgIH0KICAgICAgICAgIHN0eWxlcy5wdXNoKGUpOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZS5fc3R5bGVzID0gc3R5bGVzOwogICAgICB9CiAgICAgIHJldHVybiB0ZW1wbGF0ZS5fc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIDxzdHlsZT4gZWxlbWVudHMgIGZyb20gc3R5bGVzaGVldHMgbG9hZGVkIHZpYSBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBsaW5rcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBgZG9tLW1vZHVsZWAuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCBJZCBvZiBgZG9tLW1vZHVsZWAgdG8gZ2F0aGVyIENTUyBmcm9tCiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBjb250YWluZWQgc3R5bGVzLgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICAgc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlSWQpIHsKICAgICAgbGV0IG0gPSBpbXBvcnRNb2R1bGUobW9kdWxlSWQpOwogICAgICByZXR1cm4gbSA/IHRoaXMuX3N0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG0pIDogW107CiAgICB9LAoKICAgIC8qKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBtb2R1bGUgZG9tLW1vZHVsZSBlbGVtZW50IHRoYXQgY291bGQgY29udGFpbiBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBzdHlsZXMKICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMKICAgICAqLwogICAgX3N0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZSkgewogICAgICBjb25zdCBzdHlsZXMgPSBbXTsKICAgICAgY29uc3QgcCQgPSBtb2R1bGUucXVlcnlTZWxlY3RvckFsbChNT0RVTEVfU1RZTEVfTElOS19TRUxFQ1RPUik7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IHAkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IHAgPSBwJFtpXTsKICAgICAgICBpZiAocC5pbXBvcnQpIHsKICAgICAgICAgIGNvbnN0IGltcG9ydERvYyA9IHAuaW1wb3J0OwogICAgICAgICAgY29uc3QgdW5zY29wZWQgPSBwLmhhc0F0dHJpYnV0ZShTSEFEWV9VTlNDT1BFRF9BVFRSKTsKICAgICAgICAgIGlmICh1bnNjb3BlZCAmJiAhaW1wb3J0RG9jLl91bnNjb3BlZFN0eWxlKSB7CiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gc3R5bGVGb3JJbXBvcnQoaW1wb3J0RG9jKTsKICAgICAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKFNIQURZX1VOU0NPUEVEX0FUVFIsICcnKTsKICAgICAgICAgICAgaW1wb3J0RG9jLl91bnNjb3BlZFN0eWxlID0gc3R5bGU7CiAgICAgICAgICB9IGVsc2UgaWYgKCFpbXBvcnREb2MuX3N0eWxlKSB7CiAgICAgICAgICAgIGltcG9ydERvYy5fc3R5bGUgPSBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGVzLnB1c2godW5zY29wZWQgPyBpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUgOiBpbXBvcnREb2MuX3N0eWxlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlczsKICAgIH0sCgogICAgLyoqCiAgICAgKgogICAgICogUmV0dXJucyBDU1MgdGV4dCBvZiBzdHlsZXMgaW4gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBgZG9tLW1vZHVsZWBzLgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZXNGcm9tTW9kdWxlc2AgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZHMgTGlzdCBvZiBkb20tbW9kdWxlIGlkJ3Mgd2l0aGluIHdoaWNoIHRvCiAgICAgKiBzZWFyY2ggZm9yIGNzcy4KICAgICAqIEByZXR1cm4ge3N0cmluZ30gQ29uY2F0ZW5hdGVkIENTUyBjb250ZW50IGZyb20gc3BlY2lmaWVkIGBkb20tbW9kdWxlYHMKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgIGNzc0Zyb21Nb2R1bGVzKG1vZHVsZUlkcykgewogICAgICBsZXQgbW9kdWxlcyA9IG1vZHVsZUlkcy50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICBsZXQgY3NzVGV4dCA9ICcnOwogICAgICBmb3IgKGxldCBpPTA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY3NzVGV4dCArPSB0aGlzLmNzc0Zyb21Nb2R1bGUobW9kdWxlc1tpXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyBDU1MgdGV4dCBvZiBzdHlsZXMgaW4gYSBnaXZlbiBgZG9tLW1vZHVsZWAuICBDU1MgaW4gYSBgZG9tLW1vZHVsZWAKICAgICAqIGNhbiBjb21lIGVpdGhlciBmcm9tIGA8c3R5bGU+YHMgd2l0aGluIHRoZSBmaXJzdCBgPHRlbXBsYXRlPmAsIG9yIGVsc2UKICAgICAqIGZyb20gb25lIG9yIG1vcmUgYDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPmAgbGlua3Mgb3V0c2lkZSB0aGUKICAgICAqIHRlbXBsYXRlLgogICAgICoKICAgICAqIEFueSBgPHN0eWxlcz5gIHByb2Nlc3NlZCBhcmUgcmVtb3ZlZCBmcm9tIHRoZWlyIG9yaWdpbmFsIGxvY2F0aW9uLgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZUZyb21Nb2R1bGVgIGluc3RlYWQuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgZG9tLW1vZHVsZSBpZCB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEByZXR1cm4ge3N0cmluZ30gQ29uY2F0ZW5hdGVkIENTUyBjb250ZW50IGZyb20gc3BlY2lmaWVkIGBkb20tbW9kdWxlYAogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICBjc3NGcm9tTW9kdWxlKG1vZHVsZUlkKSB7CiAgICAgIGxldCBtID0gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKTsKICAgICAgaWYgKG0gJiYgbS5fY3NzVGV4dCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgLy8gbW9kdWxlIGltcG9ydHM6IDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPgogICAgICAgIGxldCBjc3NUZXh0ID0gdGhpcy5fY3NzRnJvbU1vZHVsZUltcG9ydHMobSk7CiAgICAgICAgLy8gaW5jbHVkZSBjc3MgZnJvbSB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIG1vZHVsZQogICAgICAgIGxldCB0ID0gbS5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICAgIGlmICh0KSB7CiAgICAgICAgICBjc3NUZXh0ICs9IHRoaXMuY3NzRnJvbVRlbXBsYXRlKHQsCiAgICAgICAgICAgIC8qKiBAdHlwZSB7dGVtcGxhdGVXaXRoQXNzZXRQYXRofSAqLyhtKS5hc3NldHBhdGgpOwogICAgICAgIH0KICAgICAgICBtLl9jc3NUZXh0ID0gY3NzVGV4dCB8fCBudWxsOwogICAgICB9CiAgICAgIGlmICghbSkgewogICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGZpbmQgc3R5bGUgZGF0YSBpbiBtb2R1bGUgbmFtZWQnLCBtb2R1bGVJZCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG0gJiYgbS5fY3NzVGV4dCB8fCAnJzsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIGA8c3R5bGVzPmAgd2l0aGluIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgKgogICAgICogQW55IGA8c3R5bGVzPmAgcHJvY2Vzc2VkIGFyZSByZW1vdmVkIGZyb20gdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24uCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlRnJvbVRlbXBsYXRlYCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gZ2F0aGVyIHN0eWxlcyBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSB0byByZXNvbHZlIHRoZSBVUkwgYWdhaW5zdAogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgdGVtcGxhdGUKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgY3NzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKSB7CiAgICAgIGxldCBjc3NUZXh0ID0gJyc7CiAgICAgIGNvbnN0IGUkID0gdGhpcy5zdHlsZXNGcm9tVGVtcGxhdGUodGVtcGxhdGUsIGJhc2VVUkkpOwogICAgICAvLyBpZiBlbGVtZW50IGlzIGEgdGVtcGxhdGUsIGdldCBjb250ZW50IGZyb20gaXRzIC5jb250ZW50CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IGUkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IGUgPSBlJFtpXTsKICAgICAgICBpZiAoZS5wYXJlbnROb2RlKSB7CiAgICAgICAgICBlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7CiAgICAgICAgfQogICAgICAgIGNzc1RleHQgKz0gZS50ZXh0Q29udGVudDsKICAgICAgfQogICAgICByZXR1cm4gY3NzVGV4dDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IGZyb20gc3R5bGVzaGVldHMgbG9hZGVkIHZpYSBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YAogICAgICogbGlua3Mgd2l0aGluIHRoZSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgLgogICAgICoKICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZSBgc3R5bGVzRnJvbU1vZHVsZUltcG9ydHNgIGluc3RlYWQuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIElkIG9mIGBkb20tbW9kdWxlYCB0byBnYXRoZXIgQ1NTIGZyb20KICAgICAqIEByZXR1cm4ge3N0cmluZ30gQ29uY2F0ZW5hdGVkIENTUyBjb250ZW50IGZyb20gbGlua3MgaW4gc3BlY2lmaWVkIGBkb20tbW9kdWxlYAogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICBjc3NGcm9tTW9kdWxlSW1wb3J0cyhtb2R1bGVJZCkgewogICAgICBsZXQgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CiAgICAgIHJldHVybiBtID8gdGhpcy5fY3NzRnJvbU1vZHVsZUltcG9ydHMobSkgOiAnJzsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBtb2R1bGUgZG9tLW1vZHVsZSBlbGVtZW50IHRoYXQgY291bGQgY29udGFpbiBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBzdHlsZXMKICAgICAqIEByZXR1cm4ge3N0cmluZ30gQ29uY2F0ZW5hdGVkIENTUyBjb250ZW50IGZyb20gbGlua3MgaW4gdGhlIGRvbS1tb2R1bGUKICAgICAqLwogICAgIF9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtb2R1bGUpIHsKICAgICAgbGV0IGNzc1RleHQgPSAnJzsKICAgICAgbGV0IHN0eWxlcyA9IHRoaXMuX3N0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZSk7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNzc1RleHQgKz0gc3R5bGVzW2ldLnRleHRDb250ZW50OwogICAgICB9CiAgICAgIHJldHVybiBjc3NUZXh0OwogICAgfQogIH07CgogIFBvbHltZXIuU3R5bGVHYXRoZXIgPSBTdHlsZUdhdGhlcjsKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgbW9kdWxlcyA9IHt9OwogIGxldCBsY01vZHVsZXMgPSB7fTsKICBmdW5jdGlvbiBzZXRNb2R1bGUoaWQsIG1vZHVsZSkgewogICAgLy8gc3RvcmUgaWQgc2VwYXJhdGUgZnJvbSBsb3dlcmNhc2VkIGlkIHNvIHRoYXQKICAgIC8vIGluIGFsbCBjYXNlcyBtaXhlZENhc2UgaWQgd2lsbCBzdG9yZWQgZGlzdGluY3RseQogICAgLy8gYW5kIGxvd2VyY2FzZSB2ZXJzaW9uIGlzIGEgZmFsbGJhY2sKICAgIG1vZHVsZXNbaWRdID0gbGNNb2R1bGVzW2lkLnRvTG93ZXJDYXNlKCldID0gbW9kdWxlOwogIH0KICBmdW5jdGlvbiBmaW5kTW9kdWxlKGlkKSB7CiAgICByZXR1cm4gbW9kdWxlc1tpZF0gfHwgbGNNb2R1bGVzW2lkLnRvTG93ZXJDYXNlKCldOwogIH0KCiAgZnVuY3Rpb24gc3R5bGVPdXRzaWRlVGVtcGxhdGVDaGVjayhpbnN0KSB7CiAgICBpZiAoaW5zdC5xdWVyeVNlbGVjdG9yKCdzdHlsZScpKSB7CiAgICAgIGNvbnNvbGUud2FybignZG9tLW1vZHVsZSAlcyBoYXMgc3R5bGUgb3V0c2lkZSB0ZW1wbGF0ZScsIGluc3QuaWQpOwogICAgfQogIH0KCiAgLyoqCiAgICogVGhlIGBkb20tbW9kdWxlYCBlbGVtZW50IHJlZ2lzdGVycyB0aGUgZG9tIGl0IGNvbnRhaW5zIHRvIHRoZSBuYW1lIGdpdmVuCiAgICogYnkgdGhlIG1vZHVsZSdzIGlkIGF0dHJpYnV0ZS4gSXQgcHJvdmlkZXMgYSB1bmlmaWVkIGRhdGFiYXNlIG9mIGRvbQogICAqIGFjY2Vzc2libGUgdmlhIGl0cyBzdGF0aWMgYGltcG9ydGAgQVBJLgogICAqCiAgICogQSBrZXkgdXNlIGNhc2Ugb2YgYGRvbS1tb2R1bGVgIGlzIGZvciBwcm92aWRpbmcgY3VzdG9tIGVsZW1lbnQgYDx0ZW1wbGF0ZT5gcwogICAqIHZpYSBIVE1MIGltcG9ydHMgdGhhdCBhcmUgcGFyc2VkIGJ5IHRoZSBuYXRpdmUgSFRNTCBwYXJzZXIsIHRoYXQgY2FuIGJlCiAgICogcmVsb2NhdGVkIGR1cmluZyBhIGJ1bmRsaW5nIHBhc3MgYW5kIHN0aWxsIGxvb2tlZCB1cCBieSBgaWRgLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqICAgICA8ZG9tLW1vZHVsZSBpZD0iZm9vIj4KICAgKiAgICAgICA8aW1nIHNyYz0ic3R1ZmYucG5nIj4KICAgKiAgICAgPC9kb20tbW9kdWxlPgogICAqCiAgICogVGhlbiBpbiBjb2RlIGluIHNvbWUgb3RoZXIgbG9jYXRpb24gdGhhdCBjYW5ub3QgYWNjZXNzIHRoZSBkb20tbW9kdWxlIGFib3ZlCiAgICoKICAgKiAgICAgbGV0IGltZyA9IGN1c3RvbUVsZW1lbnRzLmdldCgnZG9tLW1vZHVsZScpLmltcG9ydCgnZm9vJywgJ2ltZycpOwogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAZXh0ZW5kcyBIVE1MRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBwcm92aWRlcyBhIHJlZ2lzdHJ5IG9mIHJlbG9jYXRhYmxlIERPTSBjb250ZW50CiAgICogICBieSBgaWRgIHRoYXQgaXMgYWdub3N0aWMgdG8gYnVuZGxpbmcuCiAgICogQHVucmVzdHJpY3RlZAogICAqLwogIGNsYXNzIERvbU1vZHVsZSBleHRlbmRzIEhUTUxFbGVtZW50IHsKCiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsgcmV0dXJuIFsnaWQnXTsgfQoKICAgIC8qKgogICAgICogUmV0cmlldmVzIHRoZSBlbGVtZW50IHNwZWNpZmllZCBieSB0aGUgY3NzIGBzZWxlY3RvcmAgaW4gdGhlIG1vZHVsZQogICAgICogcmVnaXN0ZXJlZCBieSBgaWRgLiBGb3IgZXhhbXBsZSwgdGhpcy5pbXBvcnQoJ2ZvbycsICdpbWcnKTsKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgaWQgb2YgdGhlIGRvbS1tb2R1bGUgaW4gd2hpY2ggdG8gc2VhcmNoLgogICAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvciBUaGUgY3NzIHNlbGVjdG9yIGJ5IHdoaWNoIHRvIGZpbmQgdGhlIGVsZW1lbnQuCiAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBlbGVtZW50IHdoaWNoIG1hdGNoZXMgYHNlbGVjdG9yYCBpbiB0aGUKICAgICAqIG1vZHVsZSByZWdpc3RlcmVkIGF0IHRoZSBzcGVjaWZpZWQgYGlkYC4KICAgICAqLwogICAgc3RhdGljIGltcG9ydChpZCwgc2VsZWN0b3IpIHsKICAgICAgaWYgKGlkKSB7CiAgICAgICAgbGV0IG0gPSBmaW5kTW9kdWxlKGlkKTsKICAgICAgICBpZiAobSAmJiBzZWxlY3RvcikgewogICAgICAgICAgcmV0dXJuIG0ucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlLgogICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgQ3VycmVudCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBBdHRyaWJ1dGUgbmFtZXNwYWNlLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSkgewogICAgICBpZiAob2xkICE9PSB2YWx1ZSkgewogICAgICAgIHRoaXMucmVnaXN0ZXIoKTsKICAgICAgfQogICAgfQogICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtYXJncyAqLwoKICAgIC8qKgogICAgICogVGhlIGFic29sdXRlIFVSTCBvZiB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhpcyBgZG9tLW1vZHVsZWAuCiAgICAgKgogICAgICogVGhpcyB2YWx1ZSB3aWxsIGRpZmZlciBmcm9tIHRoaXMgZWxlbWVudCdzIGBvd25lckRvY3VtZW50YCBpbiB0aGUKICAgICAqIGZvbGxvd2luZyB3YXlzOgogICAgICogLSBUYWtlcyBpbnRvIGFjY291bnQgYW55IGBhc3NldHBhdGhgIGF0dHJpYnV0ZSBhZGRlZCBkdXJpbmcgYnVuZGxpbmcKICAgICAqICAgdG8gaW5kaWNhdGUgdGhlIG9yaWdpbmFsIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBidW5kbGVkIGxvY2F0aW9uCiAgICAgKiAtIFVzZXMgdGhlIEhUTUxJbXBvcnRzIHBvbHlmaWxsJ3MgYGltcG9ydEZvckVsZW1lbnRgIEFQSSB0byBlbnN1cmUKICAgICAqICAgdGhlIHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIGltcG9ydCBkb2N1bWVudCdzIGxvY2F0aW9uIHNpbmNlCiAgICAgKiAgIGBvd25lckRvY3VtZW50YCBpcyBub3QgY3VycmVudGx5IHBvbHlmaWxsZWQKICAgICAqLwogICAgZ2V0IGFzc2V0cGF0aCgpIHsKICAgICAgLy8gRG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgYXNzZXRwYXRoLgogICAgICBpZiAoIXRoaXMuX19hc3NldHBhdGgpIHsKICAgICAgICAvLyBub3RlOiBhc3NldHBhdGggc2V0IHZpYSBhbiBhdHRyaWJ1dGUgbXVzdCBiZSByZWxhdGl2ZSB0byB0aGlzCiAgICAgICAgLy8gZWxlbWVudCdzIGxvY2F0aW9uOyBhY2NvbW9kYXRlIHBvbHlmaWxsZWQgSFRNTEltcG9ydHMKICAgICAgICBjb25zdCBvd25lciA9IHdpbmRvdy5IVE1MSW1wb3J0cyAmJiBIVE1MSW1wb3J0cy5pbXBvcnRGb3JFbGVtZW50ID8KICAgICAgICAgIEhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQodGhpcykgfHwgZG9jdW1lbnQgOiB0aGlzLm93bmVyRG9jdW1lbnQ7CiAgICAgICAgY29uc3QgdXJsID0gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVVcmwoCiAgICAgICAgICB0aGlzLmdldEF0dHJpYnV0ZSgnYXNzZXRwYXRoJykgfHwgJycsIG93bmVyLmJhc2VVUkkpOwogICAgICAgIHRoaXMuX19hc3NldHBhdGggPSBQb2x5bWVyLlJlc29sdmVVcmwucGF0aEZyb21VcmwodXJsKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fX2Fzc2V0cGF0aDsKICAgIH0KCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyB0aGUgZG9tLW1vZHVsZSBhdCBhIGdpdmVuIGlkLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQKICAgICAqIHdoZW4gYSBkb20tbW9kdWxlIGlzIGltcGVyYXRpdmVseSBjcmVhdGVkLiBGb3IKICAgICAqIGV4YW1wbGUsIGBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkb20tbW9kdWxlJykucmVnaXN0ZXIoJ2ZvbycpYC4KICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gaWQgVGhlIGlkIGF0IHdoaWNoIHRvIHJlZ2lzdGVyIHRoZSBkb20tbW9kdWxlLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgcmVnaXN0ZXIoaWQpIHsKICAgICAgaWQgPSBpZCB8fCB0aGlzLmlkOwogICAgICBpZiAoaWQpIHsKICAgICAgICAvLyBVbmRlciBzdHJpY3RUZW1wbGF0ZVBvbGljeSwgcmVqZWN0IGFuZCBudWxsIG91dCBhbnkgcmUtcmVnaXN0ZXJlZAogICAgICAgIC8vIGRvbS1tb2R1bGUgc2luY2UgaXQgaXMgYW1iaWd1b3VzIHdoZXRoZXIgZmlyc3QtaW4gb3IgbGFzdC1pbiBpcyB0cnVzdGVkIAogICAgICAgIGlmIChQb2x5bWVyLnN0cmljdFRlbXBsYXRlUG9saWN5ICYmIGZpbmRNb2R1bGUoaWQpICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHNldE1vZHVsZShpZCwgbnVsbCk7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0cmljdFRlbXBsYXRlUG9saWN5OiBkb20tbW9kdWxlICR7aWR9IHJlLXJlZ2lzdGVyZWRgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgIHNldE1vZHVsZShpZCwgdGhpcyk7CiAgICAgICAgc3R5bGVPdXRzaWRlVGVtcGxhdGVDaGVjayh0aGlzKTsKICAgICAgfQogICAgfQogIH0KCiAgRG9tTW9kdWxlLnByb3RvdHlwZVsnbW9kdWxlcyddID0gbW9kdWxlczsKCiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkb20tbW9kdWxlJywgRG9tTW9kdWxlKTsKCiAgLyoqIEBjb25zdCAqLwogIFBvbHltZXIuRG9tTW9kdWxlID0gRG9tTW9kdWxlOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCBzdHJpbmdzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciBtYW5pcHVsYXRpbmcgc3RydWN0dXJlZCBkYXRhIHBhdGggc3RyaW5ncy4KICAgKi8KICBjb25zdCBQYXRoID0gewoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCAoaGFzIGRvdHMpLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguaXNQYXRoKCdmb28uYmFyLmJheicpIC8vIHRydWUKICAgICAqIFBvbHltZXIuUGF0aC5pc1BhdGgoJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBzdHJpbmcgY29udGFpbmVkIG9uZSBvciBtb3JlIGRvdHMKICAgICAqLwogICAgaXNQYXRoOiBmdW5jdGlvbihwYXRoKSB7CiAgICAgIHJldHVybiBwYXRoLmluZGV4T2YoJy4nKSA+PSAwOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvb3QgcHJvcGVydHkgbmFtZSBmb3IgdGhlIGdpdmVuIHBhdGguCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5yb290KCdmb28uYmFyLmJheicpIC8vICdmb28nCiAgICAgKiBQb2x5bWVyLlBhdGgucm9vdCgnZm9vJykgICAgICAgICAvLyAnZm9vJwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcKICAgICAqIEByZXR1cm4ge3N0cmluZ30gUm9vdCBwcm9wZXJ0eSBuYW1lCiAgICAgKi8KICAgIHJvb3Q6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgbGV0IGRvdEluZGV4ID0gcGF0aC5pbmRleE9mKCcuJyk7CiAgICAgIGlmIChkb3RJbmRleCA9PT0gLTEpIHsKICAgICAgICByZXR1cm4gcGF0aDsKICAgICAgfQogICAgICByZXR1cm4gcGF0aC5zbGljZSgwLCBkb3RJbmRleCk7CiAgICB9LAoKICAgIC8qKgogICAgICogR2l2ZW4gYGJhc2VgIGlzIGBmb28uYmFyYCwgYGZvb2AgaXMgYW4gYW5jZXN0b3IsIGBmb28uYmFyYCBpcyBub3QKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyBhbiBhbmNlc3RvciBvZiB0aGUgYmFzZSBwYXRoLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguaXNBbmNlc3RvcignZm9vLmJhcicsICdmb28nKSAgICAgICAgIC8vIHRydWUKICAgICAqIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKCdmb28uYmFyJywgJ2Zvby5iYXInKSAgICAgLy8gZmFsc2UKICAgICAqIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKCdmb28uYmFyJywgJ2Zvby5iYXIuYmF6JykgLy8gZmFsc2UKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nIHRvIHRlc3QuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBwYXRoYCBpcyBhbiBhbmNlc3RvciBvZiBgYmFzZWAuCiAgICAgKi8KICAgIGlzQW5jZXN0b3I6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsKICAgICAgLy8gICAgIGJhc2Uuc3RhcnRzV2l0aChwYXRoICsgJy4nKTsKICAgICAgcmV0dXJuIGJhc2UuaW5kZXhPZihwYXRoICsgJy4nKSA9PT0gMDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBHaXZlbiBgYmFzZWAgaXMgYGZvby5iYXJgLCBgZm9vLmJhci5iYXpgIGlzIGFuIGRlc2NlbmRhbnQKICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28uYmFyLmJheicpIC8vIHRydWUKICAgICAqIFBvbHltZXIuUGF0aC5pc0Rlc2NlbmRhbnQoJ2Zvby5iYXInLCAnZm9vLmJhcicpICAgICAvLyBmYWxzZQogICAgICogUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28nKSAgICAgICAgIC8vIGZhbHNlCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5QYXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZSBQYXRoIHN0cmluZyB0byB0ZXN0IGFnYWluc3QuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZyB0byB0ZXN0LgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgcGF0aGAgaXMgYSBkZXNjZW5kYW50IG9mIGBiYXNlYC4KICAgICAqLwogICAgaXNEZXNjZW5kYW50OiBmdW5jdGlvbihiYXNlLCBwYXRoKSB7CiAgICAgIC8vICAgICBwYXRoLnN0YXJ0c1dpdGgoYmFzZSArICcuJyk7CiAgICAgIHJldHVybiBwYXRoLmluZGV4T2YoYmFzZSArICcuJykgPT09IDA7CiAgICB9LAoKICAgIC8qKgogICAgICogUmVwbGFjZXMgYSBwcmV2aW91cyBiYXNlIHBhdGggd2l0aCBhIG5ldyBiYXNlIHBhdGgsIHByZXNlcnZpbmcgdGhlCiAgICAgKiByZW1haW5kZXIgb2YgdGhlIHBhdGguCiAgICAgKgogICAgICogVXNlciBtdXN0IGVuc3VyZSBgcGF0aGAgaGFzIGEgcHJlZml4IG9mIGBiYXNlYC4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLnRyYW5zbGF0ZSgnZm9vLmJhcicsICd6b3QnLCAnZm9vLmJhci5iYXonKSAvLyAnem90LmJheicKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIEN1cnJlbnQgYmFzZSBzdHJpbmcgdG8gcmVtb3ZlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3QmFzZSBOZXcgYmFzZSBzdHJpbmcgdG8gcmVwbGFjZSB3aXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHRvIHRyYW5zbGF0ZQogICAgICogQHJldHVybiB7c3RyaW5nfSBUcmFuc2xhdGVkIHN0cmluZwogICAgICovCiAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uKGJhc2UsIG5ld0Jhc2UsIHBhdGgpIHsKICAgICAgcmV0dXJuIG5ld0Jhc2UgKyBwYXRoLnNsaWNlKGJhc2UubGVuZ3RoKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZSBQYXRoIHN0cmluZyB0byB0ZXN0IGFnYWluc3QKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nIHRvIHRlc3QKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYHBhdGhgIGlzIGVxdWFsIHRvIGBiYXNlYAogICAgICogQHRoaXMge1BhdGh9CiAgICAgKi8KICAgIG1hdGNoZXM6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsKICAgICAgcmV0dXJuIChiYXNlID09PSBwYXRoKSB8fAogICAgICAgICAgICAgdGhpcy5pc0FuY2VzdG9yKGJhc2UsIHBhdGgpIHx8CiAgICAgICAgICAgICB0aGlzLmlzRGVzY2VuZGFudChiYXNlLCBwYXRoKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBhcnJheS1iYXNlZCBwYXRocyB0byBmbGF0dGVuZWQgcGF0aC4gIFN0cmluZy1iYXNlZCBwYXRocwogICAgICogYXJlIHJldHVybmVkIGFzLWlzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGgubm9ybWFsaXplKFsnZm9vLmJhcicsIDAsICdiYXonXSkgIC8vICdmb28uYmFyLjAuYmF6JwogICAgICogUG9seW1lci5QYXRoLm5vcm1hbGl6ZSgnZm9vLmJhci4wLmJheicpICAgICAgICAvLyAnZm9vLmJhci4wLmJheicKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIElucHV0IHBhdGgKICAgICAqIEByZXR1cm4ge3N0cmluZ30gRmxhdHRlbmVkIHBhdGgKICAgICAqLwogICAgbm9ybWFsaXplOiBmdW5jdGlvbihwYXRoKSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGgpKSB7CiAgICAgICAgbGV0IHBhcnRzID0gW107CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCBhcmdzID0gcGF0aFtpXS50b1N0cmluZygpLnNwbGl0KCcuJyk7CiAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8YXJncy5sZW5ndGg7IGorKykgewogICAgICAgICAgICBwYXJ0cy5wdXNoKGFyZ3Nbal0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFydHMuam9pbignLicpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogU3BsaXRzIGEgcGF0aCBpbnRvIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLiBBY2NlcHRzIGVpdGhlciBhcnJheXMKICAgICAqIG9mIHBhdGggcGFydHMgb3Igc3RyaW5ncy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLnNwbGl0KFsnZm9vLmJhcicsIDAsICdiYXonXSkgIC8vIFsnZm9vJywgJ2JhcicsICcwJywgJ2JheiddCiAgICAgKiBQb2x5bWVyLlBhdGguc3BsaXQoJ2Zvby5iYXIuMC5iYXonKSAgICAgICAgLy8gWydmb28nLCAnYmFyJywgJzAnLCAnYmF6J10KICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIElucHV0IHBhdGgKICAgICAqIEByZXR1cm4geyFBcnJheTxzdHJpbmc+fSBBcnJheSBvZiBwYXRoIHBhcnRzCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlc30KICAgICAqLwogICAgc3BsaXQ6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUocGF0aCkuc3BsaXQoJy4nKTsKICAgICAgfQogICAgICByZXR1cm4gcGF0aC50b1N0cmluZygpLnNwbGl0KCcuJyk7CiAgICB9LAoKICAgIC8qKgogICAgICogUmVhZHMgYSB2YWx1ZSBmcm9tIGEgcGF0aC4gIElmIGFueSBzdWItcHJvcGVydHkgaW4gdGhlIHBhdGggaXMgYHVuZGVmaW5lZGAsCiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgICh3aWxsIG5ldmVyIHRocm93LgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290IE9iamVjdCBmcm9tIHdoaWNoIHRvIGRlcmVmZXJlbmNlIHBhdGggZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byByZWFkCiAgICAgKiBAcGFyYW0ge09iamVjdD19IGluZm8gSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIHRvIGBpbmZvYCwgdGhlIG5vcm1hbGl6ZWQKICAgICAqICAoZmxhdHRlbmVkKSBwYXRoIHdpbGwgYmUgc2V0IHRvIGBpbmZvLnBhdGhgLgogICAgICogQHJldHVybiB7Kn0gVmFsdWUgYXQgcGF0aCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIHBhdGggY291bGQgbm90IGJlCiAgICAgKiAgZnVsbHkgZGVyZWZlcmVuY2VkLgogICAgICogQHRoaXMge1BhdGh9CiAgICAgKi8KICAgIGdldDogZnVuY3Rpb24ocm9vdCwgcGF0aCwgaW5mbykgewogICAgICBsZXQgcHJvcCA9IHJvb3Q7CiAgICAgIGxldCBwYXJ0cyA9IHRoaXMuc3BsaXQocGF0aCk7CiAgICAgIC8vIExvb3Agb3ZlciBwYXRoIHBhcnRzWzAuLm4tMV0gYW5kIGRlcmVmZXJlbmNlCiAgICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmICghcHJvcCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldOwogICAgICAgIHByb3AgPSBwcm9wW3BhcnRdOwogICAgICB9CiAgICAgIGlmIChpbmZvKSB7CiAgICAgICAgaW5mby5wYXRoID0gcGFydHMuam9pbignLicpOwogICAgICB9CiAgICAgIHJldHVybiBwcm9wOwogICAgfSwKCiAgICAvKioKICAgICAqIFNldHMgYSB2YWx1ZSB0byBhIHBhdGguICBJZiBhbnkgc3ViLXByb3BlcnR5IGluIHRoZSBwYXRoIGlzIGB1bmRlZmluZWRgLAogICAgICogdGhpcyBtZXRob2Qgd2lsbCBuby1vcC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5QYXRoCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcm9vdCBPYmplY3QgZnJvbSB3aGljaCB0byBkZXJlZmVyZW5jZSBwYXRoIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gc2V0CiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCB0byBwYXRoCiAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSBub3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIGlucHV0IHBhdGgKICAgICAqIEB0aGlzIHtQYXRofQogICAgICovCiAgICBzZXQ6IGZ1bmN0aW9uKHJvb3QsIHBhdGgsIHZhbHVlKSB7CiAgICAgIGxldCBwcm9wID0gcm9vdDsKICAgICAgbGV0IHBhcnRzID0gdGhpcy5zcGxpdChwYXRoKTsKICAgICAgbGV0IGxhc3QgPSBwYXJ0c1twYXJ0cy5sZW5ndGgtMV07CiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7CiAgICAgICAgLy8gTG9vcCBvdmVyIHBhdGggcGFydHNbMC4ubi0yXSBhbmQgZGVyZWZlcmVuY2UKICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGFydHMubGVuZ3RoLTE7IGkrKykgewogICAgICAgICAgbGV0IHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgICAgIHByb3AgPSBwcm9wW3BhcnRdOwogICAgICAgICAgaWYgKCFwcm9wKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gU2V0IHZhbHVlIHRvIG9iamVjdCBhdCBlbmQgb2YgcGF0aAogICAgICAgIHByb3BbbGFzdF0gPSB2YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBTaW1wbGUgcHJvcGVydHkgc2V0CiAgICAgICAgcHJvcFtwYXRoXSA9IHZhbHVlOwogICAgICB9CiAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7CiAgICB9CgogIH07CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgc3RydWN0dXJlZCBkYXRhIHBhdGggKGhhcyBkb3RzKS4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gIFVzZSBgUG9seW1lci5QYXRoLmlzUGF0aGAgaW5zdGVhZC4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGAKICAgKiBQb2x5bWVyLlBhdGguaXNEZWVwKCdmb28uYmFyLmJheicpIC8vIHRydWUKICAgKiBQb2x5bWVyLlBhdGguaXNEZWVwKCdmb28nKSAgICAgICAgIC8vIGZhbHNlCiAgICogYGBgCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZwogICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBjb250YWluZWQgb25lIG9yIG1vcmUgZG90cwogICAqLwogIFBhdGguaXNEZWVwID0gUGF0aC5pc1BhdGg7CgogIFBvbHltZXIuUGF0aCA9IFBhdGg7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IGNhc2VNYXAgPSB7fTsKICBjb25zdCBEQVNIX1RPX0NBTUVMID0gLy1bYS16XS9nOwogIGNvbnN0IENBTUVMX1RPX0RBU0ggPSAvKFtBLVpdKS9nOwoKICAvKioKICAgKiBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiAiZGFzaC1jYXNlIiBhbmQgImNhbWVsQ2FzZSIKICAgKiBpZGVudGlmaWVycy4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSB0aGF0IHByb3ZpZGVzIHV0aWxpdGllcyBmb3IgY29udmVydGluZyBiZXR3ZWVuICJkYXNoLWNhc2UiCiAgICogICBhbmQgImNhbWVsQ2FzZSIuCiAgICovCiAgY29uc3QgQ2FzZU1hcCA9IHsKCiAgICAvKioKICAgICAqIENvbnZlcnRzICJkYXNoLWNhc2UiIGlkZW50aWZpZXIgKGUuZy4gYGZvby1iYXItYmF6YCkgdG8gImNhbWVsQ2FzZSIKICAgICAqIChlLmcuIGBmb29CYXJCYXpgKS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5DYXNlTWFwCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGFzaCBEYXNoLWNhc2UgaWRlbnRpZmllcgogICAgICogQHJldHVybiB7c3RyaW5nfSBDYW1lbC1jYXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpZGVudGlmaWVyCiAgICAgKi8KICAgIGRhc2hUb0NhbWVsQ2FzZShkYXNoKSB7CiAgICAgIHJldHVybiBjYXNlTWFwW2Rhc2hdIHx8ICgKICAgICAgICBjYXNlTWFwW2Rhc2hdID0gZGFzaC5pbmRleE9mKCctJykgPCAwID8gZGFzaCA6IGRhc2gucmVwbGFjZShEQVNIX1RPX0NBTUVMLAogICAgICAgICAgKG0pID0+IG1bMV0udG9VcHBlckNhc2UoKQogICAgICAgICkKICAgICAgKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyAiY2FtZWxDYXNlIiBpZGVudGlmaWVyIChlLmcuIGBmb29CYXJCYXpgKSB0byAiZGFzaC1jYXNlIgogICAgICogKGUuZy4gYGZvby1iYXItYmF6YCkuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuQ2FzZU1hcAogICAgICogQHBhcmFtIHtzdHJpbmd9IGNhbWVsIENhbWVsLWNhc2UgaWRlbnRpZmllcgogICAgICogQHJldHVybiB7c3RyaW5nfSBEYXNoLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlkZW50aWZpZXIKICAgICAqLwogICAgY2FtZWxUb0Rhc2hDYXNlKGNhbWVsKSB7CiAgICAgIHJldHVybiBjYXNlTWFwW2NhbWVsXSB8fCAoCiAgICAgICAgY2FzZU1hcFtjYW1lbF0gPSBjYW1lbC5yZXBsYWNlKENBTUVMX1RPX0RBU0gsICctJDEnKS50b0xvd2VyQ2FzZSgpCiAgICAgICk7CiAgICB9CgogIH07CgogIFBvbHltZXIuQ2FzZU1hcCA9IENhc2VNYXA7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIC8vIE1pY3JvdGFzayBpbXBsZW1lbnRlZCB1c2luZyBNdXRhdGlvbiBPYnNlcnZlcgogIGxldCBtaWNyb3Rhc2tDdXJySGFuZGxlID0gMDsKICBsZXQgbWljcm90YXNrTGFzdEhhbmRsZSA9IDA7CiAgbGV0IG1pY3JvdGFza0NhbGxiYWNrcyA9IFtdOwogIGxldCBtaWNyb3Rhc2tOb2RlQ29udGVudCA9IDA7CiAgbGV0IG1pY3JvdGFza05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7CiAgbmV3IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKG1pY3JvdGFza0ZsdXNoKS5vYnNlcnZlKG1pY3JvdGFza05vZGUsIHtjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7CgogIGZ1bmN0aW9uIG1pY3JvdGFza0ZsdXNoKCkgewogICAgY29uc3QgbGVuID0gbWljcm90YXNrQ2FsbGJhY2tzLmxlbmd0aDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgbGV0IGNiID0gbWljcm90YXNrQ2FsbGJhY2tzW2ldOwogICAgICBpZiAoY2IpIHsKICAgICAgICB0cnkgewogICAgICAgICAgY2IoKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhyb3cgZTsgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBtaWNyb3Rhc2tDYWxsYmFja3Muc3BsaWNlKDAsIGxlbik7CiAgICBtaWNyb3Rhc2tMYXN0SGFuZGxlICs9IGxlbjsKICB9CgogIC8qKgogICAqIE1vZHVsZSB0aGF0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0cmF0ZWdpZXMgZm9yIGVucXVldWluZyBhc3luY2hyb25vdXMKICAgKiB0YXNrcy4gIEVhY2ggc3ViLW1vZHVsZSBwcm92aWRlcyBhIHN0YW5kYXJkIGBydW4oZm4pYCBpbnRlcmZhY2UgdGhhdCByZXR1cm5zIGEKICAgKiBoYW5kbGUsIGFuZCBhIGBjYW5jZWwoaGFuZGxlKWAgaW50ZXJmYWNlIGZvciBjYW5jZWxpbmcgYXN5bmMgdGFza3MgYmVmb3JlCiAgICogdGhleSBydW4uCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgdGhhdCBwcm92aWRlcyBhIG51bWJlciBvZiBzdHJhdGVnaWVzIGZvciBlbnF1ZXVpbmcgYXN5bmNocm9ub3VzCiAgICogdGFza3MuCiAgICovCiAgUG9seW1lci5Bc3luYyA9IHsKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgc2V0VGltZW91dGAuCiAgICAgKgogICAgICogQG5hbWVzcGFjZQogICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMKICAgICAqIEBzdW1tYXJ5IEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgc2V0VGltZW91dGAuCiAgICAgKi8KICAgIHRpbWVPdXQ6IHsKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBzdWItbW9kdWxlIHdpdGggdGhlIGFzeW5jIGludGVyZmFjZSBwcm92aWRpbmcgdGhlIHByb3ZpZGVkCiAgICAgICAqIGRlbGF5LgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy50aW1lT3V0CiAgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gZGVsYXkgVGltZSB0byB3YWl0IGJlZm9yZSBjYWxsaW5nIGNhbGxiYWNrcyBpbiBtcwogICAgICAgKiBAcmV0dXJuIHshQXN5bmNJbnRlcmZhY2V9IEFuIGFzeW5jIHRpbWVvdXQgaW50ZXJmYWNlCiAgICAgICAqLwogICAgICBhZnRlcihkZWxheSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBydW4oZm4pIHsgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZuLCBkZWxheSk7IH0sCiAgICAgICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9LAogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgaW4gdGhlIG5leHQgdGFzay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMudGltZU91dAogICAgICAgKiBAcGFyYW0geyFGdW5jdGlvbn0gZm4gQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gZGVsYXkgRGVsYXkgaW4gbWlsbGlzZWNvbmRzCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oZm4sIGRlbGF5KSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZuLCBkZWxheSk7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgdGltZU91dGAgY2FsbGJhY2suCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLnRpbWVPdXQKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGhhbmRsZSBIYW5kbGUgcmV0dXJuZWQgZnJvbSBgcnVuYCBvZiBjYWxsYmFjayB0byBjYW5jZWwKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGNhbmNlbChoYW5kbGUpIHsKICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGhhbmRsZSk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBBc3luYyBpbnRlcmZhY2Ugd3JhcHBlciBhcm91bmQgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAuCiAgICAgKgogICAgICogQG5hbWVzcGFjZQogICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMKICAgICAqIEBzdW1tYXJ5IEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqLwogICAgYW5pbWF0aW9uRnJhbWU6IHsKICAgICAgLyoqCiAgICAgICAqIEVucXVldWVzIGEgZnVuY3Rpb24gY2FsbGVkIGF0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMuYW5pbWF0aW9uRnJhbWUKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOnZvaWR9IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYGFuaW1hdGlvbkZyYW1lYCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMuYW5pbWF0aW9uRnJhbWUKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGhhbmRsZSBIYW5kbGUgcmV0dXJuZWQgZnJvbSBgcnVuYCBvZiBjYWxsYmFjayB0byBjYW5jZWwKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGNhbmNlbChoYW5kbGUpIHsKICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaGFuZGxlKTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdElkbGVDYWxsYmFja2AuICBGYWxscyBiYWNrIHRvCiAgICAgKiBgc2V0VGltZW91dGAgb24gYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBgcmVxdWVzdElkbGVDYWxsYmFja2AuCiAgICAgKgogICAgICogQG5hbWVzcGFjZQogICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMKICAgICAqIEBzdW1tYXJ5IEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdElkbGVDYWxsYmFja2AuCiAgICAgKi8KICAgIGlkbGVQZXJpb2Q6IHsKICAgICAgLyoqCiAgICAgICAqIEVucXVldWVzIGEgZnVuY3Rpb24gY2FsbGVkIGF0IGByZXF1ZXN0SWRsZUNhbGxiYWNrYCB0aW1pbmcuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLmlkbGVQZXJpb2QKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighSWRsZURlYWRsaW5lKTp2b2lkfSBmbiBDYWxsYmFjayB0byBydW4KICAgICAgICogQHJldHVybiB7bnVtYmVyfSBIYW5kbGUgdXNlZCBmb3IgY2FuY2VsaW5nIHRhc2sKICAgICAgICovCiAgICAgIHJ1bihmbikgewogICAgICAgIHJldHVybiB3aW5kb3cucmVxdWVzdElkbGVDYWxsYmFjayA/CiAgICAgICAgICB3aW5kb3cucmVxdWVzdElkbGVDYWxsYmFjayhmbikgOgogICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZm4sIDE2KTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGVucXVldWVkIGBpZGxlUGVyaW9kYCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMuaWRsZVBlcmlvZAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jYW5jZWxJZGxlQ2FsbGJhY2sgPwogICAgICAgICAgd2luZG93LmNhbmNlbElkbGVDYWxsYmFjayhoYW5kbGUpIDoKICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSBmb3IgZW5xdWV1aW5nIGNhbGxiYWNrcyB0aGF0IHJ1biBhdCBtaWNyb3Rhc2sgdGltaW5nLgogICAgICoKICAgICAqIE5vdGUgdGhhdCBtaWNyb3Rhc2sgdGltaW5nIGlzIGFjaGlldmVkIHZpYSBhIHNpbmdsZSBgTXV0YXRpb25PYnNlcnZlcmAsCiAgICAgKiBhbmQgdGh1cyBjYWxsYmFja3MgZW5xdWV1ZWQgd2l0aCB0aGlzIEFQSSB3aWxsIGFsbCBydW4gaW4gYSBzaW5nbGUKICAgICAqIGJhdGNoLCBhbmQgbm90IGludGVybGVhdmVkIHdpdGggb3RoZXIgbWljcm90YXNrcyBzdWNoIGFzIHByb21pc2VzLgogICAgICogUHJvbWlzZXMgYXJlIGF2b2lkZWQgYXMgYW4gaW1wbGVtZW50YXRpb24gY2hvaWNlIGZvciB0aGUgdGltZSBiZWluZwogICAgICogZHVlIHRvIFNhZmFyaSBidWdzIHRoYXQgY2F1c2UgUHJvbWlzZXMgdG8gbGFjayBtaWNyb3Rhc2sgZ3VhcmFudGVlcy4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIGZvciBlbnF1ZXVpbmcgY2FsbGJhY2tzIHRoYXQgcnVuIGF0IG1pY3JvdGFzawogICAgICogICB0aW1pbmcuCiAgICAgKi8KICAgIG1pY3JvVGFzazogewoKICAgICAgLyoqCiAgICAgICAqIEVucXVldWVzIGEgZnVuY3Rpb24gY2FsbGVkIGF0IG1pY3JvdGFzayB0aW1pbmcuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzawogICAgICAgKiBAcGFyYW0geyFGdW5jdGlvbj19IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGNhbGxiYWNrKSB7CiAgICAgICAgbWljcm90YXNrTm9kZS50ZXh0Q29udGVudCA9IG1pY3JvdGFza05vZGVDb250ZW50Kys7CiAgICAgICAgbWljcm90YXNrQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spOwogICAgICAgIHJldHVybiBtaWNyb3Rhc2tDdXJySGFuZGxlKys7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYG1pY3JvVGFza2AgY2FsbGJhY2suCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzawogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIGNvbnN0IGlkeCA9IGhhbmRsZSAtIG1pY3JvdGFza0xhc3RIYW5kbGU7CiAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICBpZiAoIW1pY3JvdGFza0NhbGxiYWNrc1tpZHhdKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhc3luYyBoYW5kbGU6ICcgKyBoYW5kbGUpOwogICAgICAgICAgfQogICAgICAgICAgbWljcm90YXNrQ2FsbGJhY2tzW2lkeF0gPSBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgIH0KICB9OwoKfSkoKTsKCgogIChmdW5jdGlvbiAoKSB7CgogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qKiBAY29uc3QgeyFBc3luY0ludGVyZmFjZX0gKi8KICAgIGNvbnN0IG1pY3JvdGFzayA9IFBvbHltZXIuQXN5bmMubWljcm9UYXNrOwoKICAgIC8qKgogICAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIGJhc2ljIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIGNyZWF0aW5nIG9uZQogICAgICogb3IgbW9yZSBwcm9wZXJ0eSBhY2Nlc3NvcnMgKGdldHRlci9zZXR0ZXIgcGFpcikgdGhhdCBlbnF1ZXVlIGFuIGFzeW5jCiAgICAgKiAoYmF0Y2hlZCkgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgKgogICAgICogRm9yIGJhc2ljIHVzYWdlIG9mIHRoaXMgbWl4aW4sIGNhbGwgYE15Q2xhc3MuY3JlYXRlUHJvcGVydGllcyhwcm9wcylgCiAgICAgKiBvbmNlIGF0IGNsYXNzIGRlZmluaXRpb24gdGltZSB0byBjcmVhdGUgcHJvcGVydHkgYWNjZXNzb3JzIGZvciBwcm9wZXJ0aWVzCiAgICAgKiBuYW1lZCBpbiBwcm9wcywgaW1wbGVtZW50IGBfcHJvcGVydGllc0NoYW5nZWRgIHRvIHJlYWN0IGFzIGRlc2lyZWQgdG8KICAgICAqIHByb3BlcnR5IGNoYW5nZXMsIGFuZCBpbXBsZW1lbnQgYHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKClgIGFuZAogICAgICogaW5jbHVkZSBsb3dlcmNhc2UgdmVyc2lvbnMgb2YgYW55IHByb3BlcnR5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNldCBmcm9tCiAgICAgKiBhdHRyaWJ1dGVzLiBMYXN0LCBjYWxsIGB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKClgIGluIHRoZSBlbGVtZW50J3MKICAgICAqIGBjb25uZWN0ZWRDYWxsYmFja2AgdG8gZW5hYmxlIHRoZSBhY2Nlc3NvcnMuCiAgICAgKgogICAgICogQG1peGluRnVuY3Rpb24KICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiBmb3IgcmVhY3RpbmcgdG8gcHJvcGVydHkgY2hhbmdlcyBmcm9tCiAgICAgKiAgIGdlbmVyYXRlZCBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgKi8KICAgIFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgICAvKioKICAgICAgICogQHBvbHltZXIKICAgICAgICogQG1peGluQ2xhc3MKICAgICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNDaGFuZ2VkfQogICAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgICAqLwogICAgICBjbGFzcyBQcm9wZXJ0aWVzQ2hhbmdlZCBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IG5hbWVzLgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gcHJvcHMgT2JqZWN0IHdob3NlIGtleXMgYXJlIG5hbWVzIG9mIGFjY2Vzc29ycy4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgICAgY29uc3QgcHJvdG8gPSB0aGlzLnByb3RvdHlwZTsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgICAgLy8gZG9uJ3Qgc3RvbXAgYW4gZXhpc3RpbmcgYWNjZXNzb3IKICAgICAgICAgICAgaWYgKCEocHJvcCBpbiBwcm90bykpIHsKICAgICAgICAgICAgICBwcm90by5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhbiBhdHRyaWJ1dGUgbmFtZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICAgKiBUaGUgYXR0cmlidXRlIG5hbWUgaXMgdGhlIGxvd2VyY2FzZWQgcHJvcGVydHkgbmFtZS4gT3ZlcnJpZGUgdG8KICAgICAgICAgKiBjdXN0b21pemUgdGhpcyBtYXBwaW5nLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSB0byBjb252ZXJ0CiAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBBdHRyaWJ1dGUgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgICByZXR1cm4gcHJvcGVydHkudG9Mb3dlckNhc2UoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlIHBvaW50IHRvIHByb3ZpZGUgYSB0eXBlIHRvIHdoaWNoIHRvIGRlc2VyaWFsaXplIGEgdmFsdWUgdG8KICAgICAgICAgKiBhIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgcHJvcGVydHkKICAgICAgICAgKgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHsgfSAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIHNldHRlci9nZXR0ZXIgcGFpciBmb3IgdGhlIG5hbWVkIHByb3BlcnR5IHdpdGggaXRzIG93bgogICAgICAgICAqIGxvY2FsIHN0b3JhZ2UuICBUaGUgZ2V0dGVyIHJldHVybnMgdGhlIHZhbHVlIGluIHRoZSBsb2NhbCBzdG9yYWdlLAogICAgICAgICAqIGFuZCB0aGUgc2V0dGVyIGNhbGxzIGBfc2V0UHJvcGVydHlgLCB3aGljaCB1cGRhdGVzIHRoZSBsb2NhbCBzdG9yYWdlCiAgICAgICAgICogZm9yIHRoZSBwcm9wZXJ0eSBhbmQgZW5xdWV1ZXMgYSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgb24gYSBwcm90b3R5cGUgb3IgYW4gaW5zdGFuY2UuICBDYWxsaW5nCiAgICAgICAgICogdGhpcyBtZXRob2QgbWF5IG92ZXJ3cml0ZSBhIHByb3BlcnR5IHZhbHVlIHRoYXQgYWxyZWFkeSBleGlzdHMgb24KICAgICAgICAgKiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGJ5IGNyZWF0aW5nIHRoZSBhY2Nlc3Nvci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlYWRPbmx5IFdoZW4gdHJ1ZSwgbm8gc2V0dGVyIGlzIGNyZWF0ZWQ7IHRoZQogICAgICAgICAqICAgcHJvdGVjdGVkIGBfc2V0UHJvcGVydHlgIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBzZXQgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IocHJvcGVydHksIHJlYWRPbmx5KSB7CiAgICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKHByb3BlcnR5KTsKICAgICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19kYXRhSGFzQWNjZXNzb3InKSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcHJvcGVydHldKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcHJvcGVydHldID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyB0aGUgZ2l2ZW4gYHByb3BlcnR5YCB0byBhIG1hcCBtYXRjaGluZyBhdHRyaWJ1dGUgbmFtZXMKICAgICAgICAgKiB0byBwcm9wZXJ0eSBuYW1lcywgdXNpbmcgYGF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eWAuIFRoaXMgbWFwIGlzCiAgICAgICAgICogdXNlZCB3aGVuIGRlc2VyaWFsaXppbmcgYXR0cmlidXRlIHZhbHVlcyB0byBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICovCiAgICAgICAgX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpIHsKICAgICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19kYXRhQXR0cmlidXRlcycpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhQXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX19kYXRhQXR0cmlidXRlcyk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhQXR0cmlidXRlc1twcm9wZXJ0eV0pIHsKICAgICAgICAgICAgY29uc3QgYXR0ciA9IHRoaXMuY29uc3RydWN0b3IuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW2F0dHJdID0gcHJvcGVydHk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGEgcHJvcGVydHkgYWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZWFkT25seSBXaGVuIHRydWUsIG5vIHNldHRlciBpcyBjcmVhdGVkCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICAgX2RlZmluZVByb3BlcnR5QWNjZXNzb3IocHJvcGVydHksIHJlYWRPbmx5KSB7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHksIHsKICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgdmFsaWQtanNkb2MgKi8KICAgICAgICAgICAgLyoqIEB0aGlzIHtQcm9wZXJ0aWVzQ2hhbmdlZH0gKi8KICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8qKiBAdGhpcyB7UHJvcGVydGllc0NoYW5nZWR9ICovCiAgICAgICAgICAgIHNldDogcmVhZE9ubHkgPyBmdW5jdGlvbiAoKSB7fSA6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqLwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICB0aGlzLl9fZGF0YUVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX19kYXRhSW52YWxpZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGEgPSB7fTsKICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSBudWxsOwogICAgICAgICAgdGhpcy5fX3NlcmlhbGl6aW5nID0gZmFsc2U7CiAgICAgICAgICB0aGlzLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHByb3BlcnRpZXMgYXJlIGVuYWJsZWQgdmlhCiAgICAgICAgICogYF9lbmFibGVQcm9wZXJ0aWVzYC4KICAgICAgICAgKgogICAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBiZWhhdmlvciB0aGF0IGlzCiAgICAgICAgICogZGVwZW5kZW50IG9uIHRoZSBlbGVtZW50IGhhdmluZyBpdHMgcHJvcGVydHkgZGF0YSBpbml0aWFsaXplZCwgZS5nLgogICAgICAgICAqIGZyb20gZGVmYXVsdHMgKGluaXRpYWxpemVkIGZyb20gYGNvbnN0cnVjdG9yYCwgYF9pbml0aWFsaXplUHJvcGVydGllc2ApLAogICAgICAgICAqIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLCBvciB2YWx1ZXMgcHJvcGFnYXRlZCBmcm9tIGhvc3QgZS5nLiB2aWEKICAgICAgICAgKiBiaW5kaW5ncy4gIGBzdXBlci5yZWFkeSgpYCBtdXN0IGJlIGNhbGxlZCB0byBlbnN1cmUgdGhlIGRhdGEgc3lzdGVtCiAgICAgICAgICogYmVjb21lcyBlbmFibGVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHVibGljCiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YVJlYWR5ID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbGl6ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAgICAgKgogICAgICAgICAqIFByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlIHBvaW50IGZvciBwZXJmb3JtaW5nIGFueSBzZXR1cCB3b3JrIHByaW9yCiAgICAgICAgICogdG8gaW5pdGlhbGl6aW5nIHRoZSBwcm9wZXJ0eSBhY2Nlc3NvciBzeXN0ZW0uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICAvLyBDYXB0dXJlIGluc3RhbmNlIHByb3BlcnRpZXM7IHRoZXNlIHdpbGwgYmUgc2V0IGludG8gYWNjZXNzb3JzCiAgICAgICAgICAvLyBkdXJpbmcgZmlyc3QgZmx1c2guIERvbid0IHNldCB0aGVtIGhlcmUsIHNpbmNlIHdlIHdhbnQKICAgICAgICAgIC8vIHRoZXNlIHRvIG92ZXJ3cml0ZSBkZWZhdWx0cy9jb25zdHJ1Y3RvciBhc3NpZ25tZW50cwogICAgICAgICAgZm9yIChsZXQgcCBpbiB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KHApKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzID0gdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzIHx8IHt9OwogICAgICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wc1twXSA9IHRoaXNbcF07CiAgICAgICAgICAgICAgZGVsZXRlIHRoaXNbcF07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBhdCByZWFkeSB0aW1lIHdpdGggYmFnIG9mIGluc3RhbmNlIHByb3BlcnRpZXMgdGhhdCBvdmVyd3JvdGUKICAgICAgICAgKiBhY2Nlc3NvcnMgd2hlbiB0aGUgZWxlbWVudCB1cGdyYWRlZC4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNldHMgdGhlc2UgcHJvcGVydGllcyBiYWNrIGludG8gdGhlCiAgICAgICAgICogc2V0dGVyIGF0IHJlYWR5IHRpbWUuICBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhbiBvdmVycmlkZQogICAgICAgICAqIHBvaW50IGZvciBjdXN0b21pemluZyBvciBwcm92aWRpbmcgbW9yZSBlZmZpY2llbnQgaW5pdGlhbGl6YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIHByb3BlcnR5IHZhbHVlcyB0aGF0IHdlcmUgb3ZlcndyaXR0ZW4KICAgICAgICAgKiAgIHdoZW4gY3JlYXRpbmcgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplSW5zdGFuY2VQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHByb3BzKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHkgKHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWApCiAgICAgICAgICogYW5kIGVucXVldWVzIGEgYF9wcm9lcHJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpIHsKICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlKSkgewogICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgICAqIEByZXR1cm4geyp9IFZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkKICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2dldFByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fX2RhdGFbcHJvcGVydHldOwogICAgICAgIH0KCiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBsb2NhbCBzdG9yYWdlIGZvciBhIHByb3BlcnR5LCByZWNvcmRzIHRoZSBwcmV2aW91cyB2YWx1ZSwKICAgICAgICAgKiBhbmQgYWRkcyBpdCB0byB0aGUgc2V0IG9mICJwZW5kaW5nIGNoYW5nZXMiIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suICBUaGlzIG1ldGhvZCBkb2VzIG5vdCBlbnF1ZXVlIHRoZQogICAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBleHQgTm90IHVzZWQgaGVyZTsgYWZmb3JkYW5jZSBmb3IgY2xvc3VyZQogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgY2hhbmdlZAogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSwgZXh0KSB7CiAgICAgICAgICBsZXQgb2xkID0gdGhpcy5fX2RhdGFbcHJvcGVydHldOwogICAgICAgICAgbGV0IGNoYW5nZWQgPSB0aGlzLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCk7CiAgICAgICAgICBpZiAoY2hhbmdlZCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IHt9OwogICAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRW5zdXJlIG9sZCBpcyBjYXB0dXJlZCBmcm9tIHRoZSBsYXN0IHR1cm4KICAgICAgICAgICAgaWYgKHRoaXMuX19kYXRhT2xkICYmICEocHJvcGVydHkgaW4gdGhpcy5fX2RhdGFPbGQpKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGRbcHJvcGVydHldID0gb2xkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX19kYXRhW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY2hhbmdlZDsKICAgICAgICB9CiAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBNYXJrcyB0aGUgcHJvcGVydGllcyBhcyBpbnZhbGlkLCBhbmQgZW5xdWV1ZXMgYW4gYXN5bmMKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9pbnZhbGlkYXRlUHJvcGVydGllcygpIHsKICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFJbnZhbGlkICYmIHRoaXMuX19kYXRhUmVhZHkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgbWljcm90YXNrLnJ1bigoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuX19kYXRhSW52YWxpZCkgewogICAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbCB0byBlbmFibGUgcHJvcGVydHkgYWNjZXNzb3IgcHJvY2Vzc2luZy4gQmVmb3JlIHRoaXMgbWV0aG9kIGlzCiAgICAgICAgICogY2FsbGVkIGFjY2Vzc29yIHZhbHVlcyB3aWxsIGJlIHNldCBidXQgc2lkZSBlZmZlY3RzIGFyZQogICAgICAgICAqIHF1ZXVlZC4gV2hlbiBjYWxsZWQsIGFueSBwZW5kaW5nIHNpZGUgZWZmZWN0cyBvY2N1ciBpbW1lZGlhdGVseS4KICAgICAgICAgKiBGb3IgZWxlbWVudHMsIGdlbmVyYWxseSBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGEgbm9ybWFsIHNwb3QgdG8gZG8gc28uCiAgICAgICAgICogSXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzIGFzIGl0IG9ubHkgdHVybnMgb24KICAgICAgICAgKiBwcm9wZXJ0eSBhY2Nlc3NvcnMgb25jZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9lbmFibGVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUVuYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFFbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcykgewogICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXModGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKTsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucmVhZHkoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxzIHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjayB3aXRoIHRoZSBjdXJyZW50IHNldCBvZgogICAgICAgICAqIHBlbmRpbmcgY2hhbmdlcyAoYW5kIG9sZCB2YWx1ZXMgcmVjb3JkZWQgd2hlbiBwZW5kaW5nIGNoYW5nZXMgd2VyZQogICAgICAgICAqIHNldCksIGFuZCByZXNldHMgdGhlIHBlbmRpbmcgc2V0IG9mIGNoYW5nZXMuIEdlbmVyYWxseSwgdGhpcyBtZXRob2QKICAgICAgICAgKiBzaG91bGQgbm90IGJlIGNhbGxlZCBpbiB1c2VyIGNvZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfZmx1c2hQcm9wZXJ0aWVzKCkgewogICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9fZGF0YTsKICAgICAgICAgIGNvbnN0IGNoYW5nZWRQcm9wcyA9IHRoaXMuX19kYXRhUGVuZGluZzsKICAgICAgICAgIGNvbnN0IG9sZCA9IHRoaXMuX19kYXRhT2xkOwogICAgICAgICAgaWYgKHRoaXMuX3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UocHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkKSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgaW4gYF9mbHVzaFByb3BlcnRpZXNgIHRvIGRldGVybWluZSBpZiBgX3Byb3BlcnRpZXNDaGFuZ2VkYAogICAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZSBpZgogICAgICAgICAqIHByb3BlcnRpZXMgYXJlIHBlbmRpbmcuIE92ZXJyaWRlIHRvIGN1c3RvbWl6ZSB3aGVuCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgaXMgY2FsbGVkLgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY3VycmVudFByb3BzIEJhZyBvZiBhbGwgY3VycmVudCBhY2Nlc3NvciB2YWx1ZXMKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgY2hhbmdlZFByb3BzIGlzIHRydXRoeQogICAgICAgICAqLwogICAgICAgIF9zaG91bGRQcm9wZXJ0aWVzQ2hhbmdlKGN1cnJlbnRQcm9wcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgICByZXR1cm4gQm9vbGVhbihjaGFuZ2VkUHJvcHMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gYW55IHByb3BlcnRpZXMgd2l0aCBhY2Nlc3NvcnMgY3JlYXRlZCB2aWEKICAgICAgICAgKiBgX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3JgIGhhdmUgYmVlbiBzZXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGN1cnJlbnRQcm9wcyBCYWcgb2YgYWxsIGN1cnJlbnQgYWNjZXNzb3IgdmFsdWVzCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjaGFuZ2VkUHJvcHMgQmFnIG9mIHByb3BlcnRpZXMgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdAogICAgICAgICAqICAgY2FsbCB0byBgX3Byb3BlcnRpZXNDaGFuZ2VkYAogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgZWFjaCBwcm9wZXJ0eQogICAgICAgICAqICAgaW4gYGNoYW5nZWRQcm9wc2AKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfcHJvcGVydGllc0NoYW5nZWQoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE1ldGhvZCBjYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUKICAgICAgICAgKiBjb25zaWRlcmVkIGFzIGEgY2hhbmdlIGFuZCBjYXVzZSB0aGUgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2sKICAgICAgICAgKiB0byBiZSBlbnF1ZXVlZC4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgYHRydWVgIGlmIGEgc3RyaWN0IGVxdWFsaXR5CiAgICAgICAgICogY2hlY2sgZmFpbHMuIFRoZSBtZXRob2QgYWx3YXlzIHJldHVybnMgZmFsc2UgZm9yIGBOYU5gLgogICAgICAgICAqCiAgICAgICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZS5nLiBwcm92aWRlIHN0cmljdGVyIGNoZWNraW5nIGZvcgogICAgICAgICAqIE9iamVjdHMvQXJyYXlzIHdoZW4gdXNpbmcgaW1tdXRhYmxlIHBhdHRlcm5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBjaGFuZ2UKICAgICAgICAgKiAgIGFuZCBlbnF1ZXVlIGEgYF9wcm9lcHJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2sKICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKSB7CiAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAvLyBTdHJpY3QgZXF1YWxpdHkgY2hlY2sKICAgICAgICAgICAgKG9sZCAhPT0gdmFsdWUgJiYKICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgKG9sZD09TmFOLCB2YWx1ZT09TmFOKSBhbHdheXMgcmV0dXJucyBmYWxzZQogICAgICAgICAgICAgIChvbGQgPT09IG9sZCB8fCB2YWx1ZSA9PT0gdmFsdWUpKQogICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudHMgbmF0aXZlIEN1c3RvbSBFbGVtZW50cyBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0bwogICAgICAgICAqIHNldCBhbiBhdHRyaWJ1dGUgdmFsdWUgdG8gYSBwcm9wZXJ0eSB2aWEgYF9hdHRyaWJ1dGVUb1Byb3BlcnR5YC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlIHRoYXQgY2hhbmdlZAogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIE5ldyBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBBdHRyaWJ1dGUgbmFtZXNwYWNlLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICAgIGlmIChvbGQgIT09IHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2F0dHJpYnV0ZVRvUHJvcGVydHkobmFtZSwgdmFsdWUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERlc2VyaWFsaXplcyBhbiBhdHRyaWJ1dGUgdG8gaXRzIGFzc29jaWF0ZWQgcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBjYWxscyB0aGUgYF9kZXNlcmlhbGl6ZVZhbHVlYCBtZXRob2QgdG8gY29udmVydCB0aGUgc3RyaW5nIHRvCiAgICAgICAgICogYSB0eXBlZCB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgTmFtZSBvZiBhdHRyaWJ1dGUgdG8gZGVzZXJpYWxpemUuCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgdHlwZSB0byBkZXNlcmlhbGl6ZSB0bywgZGVmYXVsdHMgdG8gdGhlIHZhbHVlCiAgICAgICAgICogcmV0dXJuZWQgZnJvbSBgdHlwZUZvclByb3BlcnR5YAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX2F0dHJpYnV0ZVRvUHJvcGVydHkoYXR0cmlidXRlLCB2YWx1ZSwgdHlwZSkgewogICAgICAgICAgaWYgKCF0aGlzLl9fc2VyaWFsaXppbmcpIHsKICAgICAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fX2RhdGFBdHRyaWJ1dGVzOwogICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IG1hcCAmJiBtYXBbYXR0cmlidXRlXSB8fCBhdHRyaWJ1dGU7CiAgICAgICAgICAgIHRoaXNbcHJvcGVydHldID0gdGhpcy5fZGVzZXJpYWxpemVWYWx1ZSh2YWx1ZSwgdHlwZSB8fAogICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IudHlwZUZvclByb3BlcnR5KHByb3BlcnR5KSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXJpYWxpemVzIGEgcHJvcGVydHkgdG8gaXRzIGFzc29jaWF0ZWQgYXR0cmlidXRlLgogICAgICAgICAqCiAgICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IENsb3N1cmUgY2FuJ3QgZmlndXJlIG91dCBgdGhpc2AgaXMgYW4gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lIHRvIHJlZmxlY3QuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBhdHRyaWJ1dGUgQXR0cmlidXRlIG5hbWUgdG8gcmVmbGVjdCB0by4KICAgICAgICAgKiBAcGFyYW0geyo9fSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byByZWZlY3QuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfcHJvcGVydHlUb0F0dHJpYnV0ZShwcm9wZXJ0eSwgYXR0cmlidXRlLCB2YWx1ZSkgewogICAgICAgICAgdGhpcy5fX3NlcmlhbGl6aW5nID0gdHJ1ZTsKICAgICAgICAgIHZhbHVlID0gKGFyZ3VtZW50cy5sZW5ndGggPCAzKSA/IHRoaXNbcHJvcGVydHldIDogdmFsdWU7CiAgICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcyksIHZhbHVlLAogICAgICAgICAgICBhdHRyaWJ1dGUgfHwgdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpKTsKICAgICAgICAgIHRoaXMuX19zZXJpYWxpemluZyA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyBhIHR5cGVkIHZhbHVlIHRvIGFuIEhUTUwgYXR0cmlidXRlIG9uIGEgbm9kZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBgX3NlcmlhbGl6ZVZhbHVlYCBtZXRob2QgdG8gY29udmVydCB0aGUgdHlwZWQKICAgICAgICAgKiB2YWx1ZSB0byBhIHN0cmluZy4gIElmIHRoZSBgX3NlcmlhbGl6ZVZhbHVlYCBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYCwKICAgICAgICAgKiB0aGUgYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZCAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgYm9vbGVhbgogICAgICAgICAqIHR5cGUgYGZhbHNlYCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgRWxlbWVudCB0byBzZXQgYXR0cmlidXRlIHRvLgogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2VyaWFsaXplLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgQXR0cmlidXRlIG5hbWUgdG8gc2VyaWFsaXplIHRvLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKG5vZGUsIHZhbHVlLCBhdHRyaWJ1dGUpIHsKICAgICAgICAgIGNvbnN0IHN0ciA9IHRoaXMuX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKTsKICAgICAgICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBzdHIpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSB0eXBlZCBKYXZhU2NyaXB0IHZhbHVlIHRvIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gc2V0dGluZyBKUyBwcm9wZXJ0eSB2YWx1ZXMgdG8KICAgICAgICAgKiBIVE1MIGF0dHJpYnV0ZXMuICBVc2VycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZQogICAgICAgICAqIHNlcmlhbGl6YXRpb24gZm9yIGN1c3RvbSB0eXBlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgUHJvcGVydHkgdmFsdWUgdG8gc2VyaWFsaXplLgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU3RyaW5nIHNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQKICAgICAgICAgKiBwcm9wZXJ0eSAgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkgewogICAgICAgICAgICBjYXNlICdib29sZWFuJzoKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPyAnJyA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiByZWFkaW5nIEhUTUwgYXR0cmlidXRlIHZhbHVlcyB0bwogICAgICAgICAqIEpTIHByb3BlcnRpZXMuICBVc2VycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZQogICAgICAgICAqIGRlc2VyaWFsaXphdGlvbiBmb3IgY3VzdG9tIGB0eXBlYHMuIFR5cGVzIGZvciBgQm9vbGVhbmAsIGBTdHJpbmdgLAogICAgICAgICAqIGFuZCBgTnVtYmVyYCBjb252ZXJ0IGF0dHJpYnV0ZXMgdG8gdGhlIGV4cGVjdGVkIHR5cGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0geyo9fSB0eXBlIFR5cGUgdG8gZGVzZXJpYWxpemUgdGhlIHN0cmluZyB0by4KICAgICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlZCB2YWx1ZSBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIF9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgY2FzZSBCb29sZWFuOgogICAgICAgICAgICAgIHJldHVybiAodmFsdWUgIT09IG51bGwpOwogICAgICAgICAgICBjYXNlIE51bWJlcjoKICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgfQoKICAgICAgcmV0dXJuIFByb3BlcnRpZXNDaGFuZ2VkOwogICAgfSk7CgoKICB9KSgpOwoKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IGNhc2VNYXAgPSBQb2x5bWVyLkNhc2VNYXA7CgogIC8vIFNhdmUgbWFwIG9mIG5hdGl2ZSBwcm9wZXJ0aWVzOyB0aGlzIGZvcm1zIGEgYmxhY2tsaXN0IG9yIHByb3BlcnRpZXMKICAvLyB0aGF0IHdvbid0IGhhdmUgdGhlaXIgdmFsdWVzICJzYXZlZCIgYnkgYHNhdmVBY2Nlc3NvclZhbHVlYCwgc2luY2UKICAvLyByZWFkaW5nIGZyb20gYW4gSFRNTEVsZW1lbnQgYWNjZXNzb3IgZnJvbSB0aGUgY29udGV4dCBvZiBhIHByb3RvdHlwZSB0aHJvd3MKICBjb25zdCBuYXRpdmVQcm9wZXJ0aWVzID0ge307CiAgbGV0IHByb3RvID0gSFRNTEVsZW1lbnQucHJvdG90eXBlOwogIHdoaWxlIChwcm90bykgewogICAgbGV0IHByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG8pOwogICAgZm9yIChsZXQgaT0wOyBpPHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgIG5hdGl2ZVByb3BlcnRpZXNbcHJvcHNbaV1dID0gdHJ1ZTsKICAgIH0KICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTsKICB9CgogIC8qKgogICAqIFVzZWQgdG8gc2F2ZSB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgb3ZlcnJpZGRlbiB3aXRoCiAgICogYW4gYWNjZXNzb3IuIElmIHRoZSBgbW9kZWxgIGlzIGEgcHJvdG90eXBlLCB0aGUgdmFsdWVzIHdpbGwgYmUgc2F2ZWQKICAgKiBpbiBgX19kYXRhUHJvdG9gLCBhbmQgaXQncyB1cCB0byB0aGUgdXNlciAob3IgZG93bnN0cmVhbSBtaXhpbikgdG8KICAgKiBkZWNpZGUgaG93L3doZW4gdG8gc2V0IHRoZXNlIHZhbHVlcyBiYWNrIGludG8gdGhlIGFjY2Vzc29ycy4KICAgKiBJZiBgbW9kZWxgIGlzIGFscmVhZHkgYW4gaW5zdGFuY2UgKGl0IGhhcyBhIGBfX2RhdGFgIHByb3BlcnR5KSwgdGhlbgogICAqIHRoZSB2YWx1ZSB3aWxsIGJlIHNldCBhcyBhIHBlbmRpbmcgcHJvcGVydHksIG1lYW5pbmcgdGhlIHVzZXIgc2hvdWxkCiAgICogY2FsbCBgX2ludmFsaWRhdGVQcm9wZXJ0aWVzYCBvciBgX2ZsdXNoUHJvcGVydGllc2AgdG8gdGFrZSBlZmZlY3QKICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBzYXZlQWNjZXNzb3JWYWx1ZShtb2RlbCwgcHJvcGVydHkpIHsKICAgIC8vIERvbid0IHJlYWQvc3RvcmUgdmFsdWUgZm9yIGFueSBuYXRpdmUgcHJvcGVydGllcyBzaW5jZSB0aGV5IGNvdWxkIHRocm93CiAgICBpZiAoIW5hdGl2ZVByb3BlcnRpZXNbcHJvcGVydHldKSB7CiAgICAgIGxldCB2YWx1ZSA9IG1vZGVsW3Byb3BlcnR5XTsKICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBpZiAobW9kZWwuX19kYXRhKSB7CiAgICAgICAgICAvLyBBZGRpbmcgYWNjZXNzb3IgdG8gaW5zdGFuY2U7IHVwZGF0ZSB0aGUgcHJvcGVydHkKICAgICAgICAgIC8vIEl0IGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2FsbCBfZmx1c2hQcm9wZXJ0aWVzCiAgICAgICAgICBtb2RlbC5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIEFkZGluZyBhY2Nlc3NvciB0byBwcm90bzsgc2F2ZSBwcm90bydzIHZhbHVlIGZvciBpbnN0YW5jZS10aW1lIHVzZQogICAgICAgICAgaWYgKCFtb2RlbC5fX2RhdGFQcm90bykgewogICAgICAgICAgICBtb2RlbC5fX2RhdGFQcm90byA9IHt9OwogICAgICAgICAgfSBlbHNlIGlmICghbW9kZWwuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19kYXRhUHJvdG8nLCBtb2RlbCkpKSB7CiAgICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvID0gT2JqZWN0LmNyZWF0ZShtb2RlbC5fX2RhdGFQcm90byk7CiAgICAgICAgICB9CiAgICAgICAgICBtb2RlbC5fX2RhdGFQcm90b1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBiYXNpYyBtZXRhLXByb2dyYW1taW5nIGZvciBjcmVhdGluZyBvbmUKICAgKiBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycyAoZ2V0dGVyL3NldHRlciBwYWlyKSB0aGF0IGVucXVldWUgYW4gYXN5bmMKICAgKiAoYmF0Y2hlZCkgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICoKICAgKiBGb3IgYmFzaWMgdXNhZ2Ugb2YgdGhpcyBtaXhpbjoKICAgKiAKICAgKiAtICAgRGVjbGFyZSBhdHRyaWJ1dGVzIHRvIG9ic2VydmUgdmlhIHRoZSBzdGFuZGFyZCBgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKWAuIFVzZQogICAqICAgICBgZGFzaC1jYXNlYCBhdHRyaWJ1dGUgbmFtZXMgdG8gcmVwcmVzZW50IGBjYW1lbENhc2VgIHByb3BlcnR5IG5hbWVzLiAKICAgKiAtICAgSW1wbGVtZW50IHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjayBvbiB0aGUgY2xhc3MuCiAgICogLSAgIENhbGwgYE15Q2xhc3MuY3JlYXRlUHJvcGVydGllc0ZvckF0dHJpYnV0ZXMoKWAgKipvbmNlKiogb24gdGhlIGNsYXNzIHRvIGdlbmVyYXRlIAogICAqICAgICBwcm9wZXJ0eSBhY2Nlc3NvcnMgZm9yIGVhY2ggb2JzZXJ2ZWQgYXR0cmlidXRlLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgCiAgICogICAgIGluc3RhbmNlIGlzIGNyZWF0ZWQsIGZvciBleGFtcGxlLCBieSBjYWxsaW5nIGl0IGJlZm9yZSBjYWxsaW5nIGBjdXN0b21FbGVtZW50cy5kZWZpbmVgLgogICAqICAgICBJdCBjYW4gYWxzbyBiZSBjYWxsZWQgbGF6aWx5IGZyb20gdGhlIGVsZW1lbnQncyBgY29uc3RydWN0b3JgLCBhcyBsb25nIGFzIGl0J3MgZ3VhcmRlZCBzbwogICAqICAgICB0aGF0IHRoZSBjYWxsIGlzIG9ubHkgbWFkZSBvbmNlLCB3aGVuIHRoZSBmaXJzdCBpbnN0YW5jZSBpcyBjcmVhdGVkLgogICAqIC0gICBDYWxsIGB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKClgIGluIHRoZSBlbGVtZW50J3MgYGNvbm5lY3RlZENhbGxiYWNrYCB0byBlbmFibGUgCiAgICogICAgIHRoZSBhY2Nlc3NvcnMuCiAgICoKICAgKiBBbnkgYG9ic2VydmVkQXR0cmlidXRlc2Agd2lsbCBhdXRvbWF0aWNhbGx5IGJlCiAgICogZGVzZXJpYWxpemVkIHZpYSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCBhbmQgc2V0IHRvIHRoZSBhc3NvY2lhdGVkCiAgICogcHJvcGVydHkgdXNpbmcgYGRhc2gtY2FzZWAtdG8tYGNhbWVsQ2FzZWAgY29udmVudGlvbi4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gZm9yIHJlYWN0aW5nIHRvIHByb3BlcnR5IGNoYW5nZXMgZnJvbQogICAqICAgZ2VuZXJhdGVkIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgKi8KICBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzID0gUG9seW1lci5kZWR1cGluZ01peGluKHN1cGVyQ2xhc3MgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7c3VwZXJDbGFzc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNDaGFuZ2VkfQogICAgICogQHVucmVzdHJpY3RlZAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnRpZXNDaGFuZ2VkKHN1cGVyQ2xhc3MpOwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUFjY2Vzc29yc30KICAgICAqIEBleHRlbmRzIHtiYXNlfQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBQcm9wZXJ0eUFjY2Vzc29ycyBleHRlbmRzIGJhc2UgewoKICAgICAgLyoqCiAgICAgICAqIEdlbmVyYXRlcyBwcm9wZXJ0eSBhY2Nlc3NvcnMgZm9yIGFsbCBhdHRyaWJ1dGVzIGluIHRoZSBzdGFuZGFyZAogICAgICAgKiBzdGF0aWMgYG9ic2VydmVkQXR0cmlidXRlc2AgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEF0dHJpYnV0ZSBuYW1lcyBhcmUgbWFwcGVkIHRvIHByb3BlcnR5IG5hbWVzIHVzaW5nIHRoZSBgZGFzaC1jYXNlYCB0bwogICAgICAgKiBgY2FtZWxDYXNlYCBjb252ZW50aW9uCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydGllc0ZvckF0dHJpYnV0ZXMoKSB7CiAgICAgICAgbGV0IGEkID0gdGhpcy5vYnNlcnZlZEF0dHJpYnV0ZXM7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgYSQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKGNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKGEkW2ldKSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhbiBhdHRyaWJ1dGUgbmFtZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICogQnkgZGVmYXVsdCwgY29udmVydHMgY2FtZWwgdG8gZGFzaCBjYXNlLCBlLmcuIGBmb29CYXJgIHRvIGBmb28tYmFyYC4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRvIGNvbnZlcnQKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBBdHRyaWJ1dGUgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiBjYXNlTWFwLmNhbWVsVG9EYXNoQ2FzZShwcm9wZXJ0eSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgUHJvcGVydGllc0NoYW5nZWQgaW1wbGVtZW50YXRpb24gdG8gaW5pdGlhbGl6ZSB2YWx1ZXMgZm9yCiAgICAgICAqIGFjY2Vzc29ycyBjcmVhdGVkIGZvciB2YWx1ZXMgdGhhdCBhbHJlYWR5IGV4aXN0ZWQgb24gdGhlIGVsZW1lbnQKICAgICAgICogcHJvdG90eXBlLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7CiAgICAgICAgaWYgKHRoaXMuX19kYXRhUHJvdG8pIHsKICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXModGhpcy5fX2RhdGFQcm90byk7CiAgICAgICAgICB0aGlzLl9fZGF0YVByb3RvID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgYXQgaW5zdGFuY2UgdGltZSB3aXRoIGJhZyBvZiBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbgogICAgICAgKiBieSBhY2Nlc3NvcnMgb24gdGhlIHByb3RvdHlwZSB3aGVuIGFjY2Vzc29ycyB3ZXJlIGNyZWF0ZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNldHMgdGhlc2UgcHJvcGVydGllcyBiYWNrIGludG8gdGhlCiAgICAgICAqIHNldHRlciBhdCBpbnN0YW5jZSB0aW1lLiAgVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYW4gb3ZlcnJpZGUKICAgICAgICogcG9pbnQgZm9yIGN1c3RvbWl6aW5nIG9yIHByb3ZpZGluZyBtb3JlIGVmZmljaWVudCBpbml0aWFsaXphdGlvbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCB3ZXJlIG92ZXJ3cml0dGVuCiAgICAgICAqICAgd2hlbiBjcmVhdGluZyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvdG9Qcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgZm9yIChsZXQgcCBpbiBwcm9wcykgewogICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocCwgcHJvcHNbcF0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVuc3VyZXMgdGhlIGVsZW1lbnQgaGFzIHRoZSBnaXZlbiBhdHRyaWJ1dGUuIElmIGl0IGRvZXMgbm90LAogICAgICAgKiBhc3NpZ25zIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgYXR0cmlidXRlLgogICAgICAgKgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gQ2xvc3VyZSBjYW4ndCBmaWd1cmUgb3V0IGB0aGlzYCBpcyBpbmZhY3QgYW4gZWxlbWVudAogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIE5hbWUgb2YgYXR0cmlidXRlIHRvIGVuc3VyZSBpcyBzZXQuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2Vuc3VyZUF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICAgICAgY29uc3QgZWwgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcyk7CiAgICAgICAgaWYgKCFlbC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkgewogICAgICAgICAgdGhpcy5fdmFsdWVUb05vZGVBdHRyaWJ1dGUoZWwsIHZhbHVlLCBhdHRyaWJ1dGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBQcm9wZXJ0aWVzQ2hhbmdlZCBpbXBsZW1lbnRpb24gdG8gc2VyaWFsaXplIG9iamVjdHMgYXMgSlNPTi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU3RyaW5nIHNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgcHJvcGVydHkgdmFsdWUuCiAgICAgICAqLwogICAgICBfc2VyaWFsaXplVmFsdWUodmFsdWUpIHsKICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1mYWxsdGhyb3VnaCAqLwogICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgICBjYXNlICdvYmplY3QnOgogICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTsKICAgICAgICAgICAgICB9IGNhdGNoKHgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gc3VwZXIuX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBQb2x5bWVyIHdoZW4gcmVhZGluZyBIVE1MIGF0dHJpYnV0ZSB2YWx1ZXMgdG8KICAgICAgICogSlMgcHJvcGVydGllcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbiBQb2x5bWVyIGVsZW1lbnQKICAgICAgICogcHJvdG90eXBlcyB0byBwcm92aWRlIGRlc2VyaWFsaXphdGlvbiBmb3IgY3VzdG9tIGB0eXBlYHMuICBOb3RlLAogICAgICAgKiB0aGUgYHR5cGVgIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgYHR5cGVgIGZpZWxkIHByb3ZpZGVkIGluIHRoZQogICAgICAgKiBgcHJvcGVydGllc2AgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGEgZ2l2ZW4gcHJvcGVydHksIGFuZCBpcwogICAgICAgKiBieSBjb252ZW50aW9uIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHR5cGUgdG8gZGVzZXJpYWxpemUuCiAgICAgICAqCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgQXR0cmlidXRlIHZhbHVlIHRvIGRlc2VyaWFsaXplLgogICAgICAgKiBAcGFyYW0geyo9fSB0eXBlIFR5cGUgdG8gZGVzZXJpYWxpemUgdGhlIHN0cmluZyB0by4KICAgICAgICogQHJldHVybiB7Kn0gVHlwZWQgdmFsdWUgZGVzZXJpYWxpemVkIGZyb20gdGhlIHByb3ZpZGVkIHN0cmluZy4KICAgICAgICovCiAgICAgIF9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHR5cGUgeyp9CiAgICAgICAgICovCiAgICAgICAgbGV0IG91dFZhbHVlOwogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgY2FzZSBPYmplY3Q6CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgb3V0VmFsdWUgPSBKU09OLnBhcnNlKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyh2YWx1ZSkpOwogICAgICAgICAgICB9IGNhdGNoKHgpIHsKICAgICAgICAgICAgICAvLyBhbGxvdyBub24tSlNPTiBsaXRlcmFscyBsaWtlIFN0cmluZ3MgYW5kIE51bWJlcnMKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBBcnJheToKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IEpTT04ucGFyc2UoLyoqIEB0eXBlIHtzdHJpbmd9ICovKHZhbHVlKSk7CiAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgIG91dFZhbHVlID0gbnVsbDsKICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFBvbHltZXI6OkF0dHJpYnV0ZXM6IGNvdWxkbid0IGRlY29kZSBBcnJheSBhcyBKU09OOiAke3ZhbHVlfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBEYXRlOgogICAgICAgICAgICBvdXRWYWx1ZSA9IGlzTmFOKHZhbHVlKSA/IFN0cmluZyh2YWx1ZSkgOiBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICBvdXRWYWx1ZSA9IG5ldyBEYXRlKG91dFZhbHVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBvdXRWYWx1ZSA9IHN1cGVyLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvdXRWYWx1ZTsKICAgICAgfQogICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWZhbGx0aHJvdWdoICovCgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIFByb3BlcnRpZXNDaGFuZ2VkIGltcGxlbWVudGF0aW9uIHRvIHNhdmUgZXhpc3RpbmcgcHJvdG90eXBlCiAgICAgICAqIHByb3BlcnR5IHZhbHVlIHNvIHRoYXQgaXQgY2FuIGJlIHJlc2V0LgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZAogICAgICAgKgogICAgICAgKiBXaGVuIGNhbGxpbmcgb24gYSBwcm90b3R5cGUsIGFueSBvdmVyd3JpdHRlbiB2YWx1ZXMgYXJlIHNhdmVkIGluCiAgICAgICAqIGBfX2RhdGFQcm90b2AsIGFuZCBpdCBpcyB1cCB0byB0aGUgc3ViY2xhc3NlciB0byBkZWNpZGUgaG93L3doZW4KICAgICAgICogdG8gc2V0IHRob3NlIHByb3BlcnRpZXMgYmFjayBpbnRvIHRoZSBhY2Nlc3Nvci4gIFdoZW4gY2FsbGluZyBvbiBhbgogICAgICAgKiBpbnN0YW5jZSwgdGhlIG92ZXJ3cml0dGVuIHZhbHVlIGlzIHNldCB2aWEgYF9zZXRQZW5kaW5nUHJvcGVydHlgLAogICAgICAgKiBhbmQgdGhlIHVzZXIgc2hvdWxkIGNhbGwgYF9pbnZhbGlkYXRlUHJvcGVydGllc2Agb3IgYF9mbHVzaFByb3BlcnRpZXNgCiAgICAgICAqIGZvciB0aGUgdmFsdWVzIHRvIHRha2UgZWZmZWN0LgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICBzYXZlQWNjZXNzb3JWYWx1ZSh0aGlzLCBwcm9wZXJ0eSk7CiAgICAgICAgc3VwZXIuX2RlZmluZVByb3BlcnR5QWNjZXNzb3IocHJvcGVydHksIHJlYWRPbmx5KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGxpYnJhcnkgY3JlYXRlZCBhbiBhY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGFjY2Vzc29yIHdhcyBjcmVhdGVkCiAgICAgICAqLwogICAgICBfaGFzQWNjZXNzb3IocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gdGhpcy5fX2RhdGFIYXNBY2Nlc3NvciAmJiB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yW3Byb3BlcnR5XTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcyBhIHBlbmRpbmcgY2hhbmdlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgcHJvcGVydHkgaGFzIGEgcGVuZGluZyBjaGFuZ2UKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2lzUHJvcGVydHlQZW5kaW5nKHByb3ApIHsKICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9fZGF0YVBlbmRpbmcgJiYgKHByb3AgaW4gdGhpcy5fX2RhdGFQZW5kaW5nKSk7CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIFByb3BlcnR5QWNjZXNzb3JzOwoKICB9KTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZG9jdW1lbnQsIE5vZGVGaWx0ZXIuU0hPV19BTEwsCiAgICAgIG51bGwsIGZhbHNlKTsKCiAgLy8gMS54IGJhY2t3YXJkcy1jb21wYXRpYmxlIGF1dG8td3JhcHBlciBmb3IgdGVtcGxhdGUgdHlwZSBleHRlbnNpb25zCiAgLy8gVGhpcyBpcyBhIGNsZWFyIGxheWVyaW5nIHZpb2xhdGlvbiBhbmQgZ2l2ZXMgZmF2b3JlZC1uYXRpb24gc3RhdHVzIHRvCiAgLy8gZG9tLWlmIGFuZCBkb20tcmVwZWF0IHRlbXBsYXRlcy4gIFRoaXMgaXMgYSBjb25jZWl0IHdlJ3JlIGNob29zaW5nIHRvIGtlZXAKICAvLyBhLikgdG8gZWFzZSAxLnggYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgZHVlIHRvIGxvc3Mgb2YgYGlzYCwgYW5kCiAgLy8gYi4pIHRvIG1haW50YWluIGlmL3JlcGVhdCBjYXBhYmlsaXR5IGluIHBhcnNlci1jb25zdHJhaW5lZCBlbGVtZW50cwogIC8vICAgICAoZS5nLiB0YWJsZSwgc2VsZWN0KSBpbiBsaWV1IG9mIG5hdGl2ZSBDRSB0eXBlIGV4dGVuc2lvbnMgd2l0aG91dAogIC8vICAgICBtYXNzaXZlIG5ldyBpbnZlbnRpb24gaW4gdGhpcyBzcGFjZSAoZS5nLiBkaXJlY3RpdmUgc3lzdGVtKQogIGNvbnN0IHRlbXBsYXRlRXh0ZW5zaW9ucyA9IHsKICAgICdkb20taWYnOiB0cnVlLAogICAgJ2RvbS1yZXBlYXQnOiB0cnVlCiAgfTsKICBmdW5jdGlvbiB3cmFwVGVtcGxhdGVFeHRlbnNpb24obm9kZSkgewogICAgbGV0IGlzID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2lzJyk7CiAgICBpZiAoaXMgJiYgdGVtcGxhdGVFeHRlbnNpb25zW2lzXSkgewogICAgICBsZXQgdCA9IG5vZGU7CiAgICAgIHQucmVtb3ZlQXR0cmlidXRlKCdpcycpOwogICAgICBub2RlID0gdC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXMpOwogICAgICB0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5vZGUsIHQpOwogICAgICBub2RlLmFwcGVuZENoaWxkKHQpOwogICAgICB3aGlsZSh0LmF0dHJpYnV0ZXMubGVuZ3RoKSB7CiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUodC5hdHRyaWJ1dGVzWzBdLm5hbWUsIHQuYXR0cmlidXRlc1swXS52YWx1ZSk7CiAgICAgICAgdC5yZW1vdmVBdHRyaWJ1dGUodC5hdHRyaWJ1dGVzWzBdLm5hbWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIGZpbmRUZW1wbGF0ZU5vZGUocm9vdCwgbm9kZUluZm8pIHsKICAgIC8vIHJlY3Vyc2l2ZWx5IGFzY2VuZCB0cmVlIHVudGlsIHdlIGhpdCByb290CiAgICBsZXQgcGFyZW50ID0gbm9kZUluZm8ucGFyZW50SW5mbyAmJiBmaW5kVGVtcGxhdGVOb2RlKHJvb3QsIG5vZGVJbmZvLnBhcmVudEluZm8pOwogICAgLy8gdW53aW5kIHRoZSBzdGFjaywgcmV0dXJuaW5nIHRoZSBpbmRleGVkIG5vZGUgYXQgZWFjaCBsZXZlbAogICAgaWYgKHBhcmVudCkgewogICAgICAvLyBub3RlOiBtYXJnaW5hbGx5IGZhc3RlciB0aGFuIGluZGV4aW5nIHZpYSBjaGlsZE5vZGVzCiAgICAgIC8vIChodHRwOi8vanNwZXJmLmNvbS9jaGlsZG5vZGVzLWxvb2t1cCkKICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gcGFyZW50OwogICAgICBmb3IgKGxldCBuPXdhbGtlci5maXJzdENoaWxkKCksIGk9MDsgbjsgbj13YWxrZXIubmV4dFNpYmxpbmcoKSkgewogICAgICAgIGlmIChub2RlSW5mby5wYXJlbnRJbmRleCA9PT0gaSsrKSB7CiAgICAgICAgICByZXR1cm4gbjsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiByb290OwogICAgfQogIH0KCiAgLy8gY29uc3RydWN0IGAkYCBtYXAgKGZyb20gaWQgYW5ub3RhdGlvbnMpCiAgZnVuY3Rpb24gYXBwbHlJZFRvTWFwKGluc3QsIG1hcCwgbm9kZSwgbm9kZUluZm8pIHsKICAgIGlmIChub2RlSW5mby5pZCkgewogICAgICBtYXBbbm9kZUluZm8uaWRdID0gbm9kZTsKICAgIH0KICB9CgogIC8vIGluc3RhbGwgZXZlbnQgbGlzdGVuZXJzIChmcm9tIGV2ZW50IGFubm90YXRpb25zKQogIGZ1bmN0aW9uIGFwcGx5RXZlbnRMaXN0ZW5lcihpbnN0LCBub2RlLCBub2RlSW5mbykgewogICAgaWYgKG5vZGVJbmZvLmV2ZW50cyAmJiBub2RlSW5mby5ldmVudHMubGVuZ3RoKSB7CiAgICAgIGZvciAobGV0IGo9MCwgZSQ9bm9kZUluZm8uZXZlbnRzLCBlOyAoajxlJC5sZW5ndGgpICYmIChlPWUkW2pdKTsgaisrKSB7CiAgICAgICAgaW5zdC5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBlLm5hbWUsIGUudmFsdWUsIGluc3QpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBwdXNoIGNvbmZpZ3VyYXRpb24gcmVmZXJlbmNlcyBhdCBjb25maWd1cmUgdGltZQogIGZ1bmN0aW9uIGFwcGx5VGVtcGxhdGVDb250ZW50KGluc3QsIG5vZGUsIG5vZGVJbmZvKSB7CiAgICBpZiAobm9kZUluZm8udGVtcGxhdGVJbmZvKSB7CiAgICAgIG5vZGUuX3RlbXBsYXRlSW5mbyA9IG5vZGVJbmZvLnRlbXBsYXRlSW5mbzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNyZWF0ZU5vZGVFdmVudEhhbmRsZXIoY29udGV4dCwgZXZlbnROYW1lLCBtZXRob2ROYW1lKSB7CiAgICAvLyBJbnN0YW5jZXMgY2FuIG9wdGlvbmFsbHkgaGF2ZSBhIF9tZXRob2RIb3N0IHdoaWNoIGFsbG93cyByZWRpcmVjdGluZyB3aGVyZQogICAgLy8gdG8gZmluZCBtZXRob2RzLiBDdXJyZW50bHkgdXNlZCBieSBgdGVtcGxhdGl6ZWAuCiAgICBjb250ZXh0ID0gY29udGV4dC5fbWV0aG9kSG9zdCB8fCBjb250ZXh0OwogICAgbGV0IGhhbmRsZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChjb250ZXh0W21ldGhvZE5hbWVdKSB7CiAgICAgICAgY29udGV4dFttZXRob2ROYW1lXShlLCBlLmRldGFpbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc29sZS53YXJuKCdsaXN0ZW5lciBtZXRob2QgYCcgKyBtZXRob2ROYW1lICsgJ2Agbm90IGRlZmluZWQnKTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBoYW5kbGVyOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBtaXhpbiB0aGF0IHByb3ZpZGVzIGJhc2ljIHRlbXBsYXRlIHBhcnNpbmcgYW5kIHN0YW1waW5nLCBpbmNsdWRpbmcKICAgKiB0aGUgZm9sbG93aW5nIHRlbXBsYXRlLXJlbGF0ZWQgZmVhdHVyZXMgZm9yIHN0YW1wZWQgdGVtcGxhdGVzOgogICAqCiAgICogLSBEZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgKGBvbi1ldmVudG5hbWU9Imxpc3RlbmVyImApCiAgICogLSBNYXAgb2Ygbm9kZSBpZCdzIHRvIHN0YW1wZWQgbm9kZSBpbnN0YW5jZXMgKGB0aGlzLiQuaWRgKQogICAqIC0gTmVzdGVkIHRlbXBsYXRlIGNvbnRlbnQgY2FjaGluZy9yZW1vdmFsIGFuZCByZS1pbnN0YWxsYXRpb24gKHBlcmZvcm1hbmNlCiAgICogICBvcHRpbWl6YXRpb24pCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgdGVtcGxhdGUgcGFyc2luZyBhbmQgc3RhbXBpbmcKICAgKi8KICBQb2x5bWVyLlRlbXBsYXRlU3RhbXAgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1RlbXBsYXRlU3RhbXB9CiAgICAgKi8KICAgIGNsYXNzIFRlbXBsYXRlU3RhbXAgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIC8qKgogICAgICAgKiBTY2FucyBhIHRlbXBsYXRlIHRvIHByb2R1Y2UgdGVtcGxhdGUgbWV0YWRhdGEuCiAgICAgICAqCiAgICAgICAqIFRlbXBsYXRlLXNwZWNpZmljIG1ldGFkYXRhIGFyZSBzdG9yZWQgaW4gdGhlIG9iamVjdCByZXR1cm5lZCwgYW5kIG5vZGUtCiAgICAgICAqIHNwZWNpZmljIG1ldGFkYXRhIGFyZSBzdG9yZWQgaW4gb2JqZWN0cyBpbiBpdHMgZmxhdHRlbmVkIGBub2RlSW5mb0xpc3RgCiAgICAgICAqIGFycmF5LiAgT25seSBub2RlcyBpbiB0aGUgdGVtcGxhdGUgdGhhdCB3ZXJlIHBhcnNlZCBhcyBub2RlcyBvZgogICAgICAgKiBpbnRlcmVzdCBjb250YWluIGFuIG9iamVjdCBpbiBgbm9kZUluZm9MaXN0YC4gIEVhY2ggYG5vZGVJbmZvYCBvYmplY3QKICAgICAgICogY29udGFpbnMgYW4gYGluZGV4YCAoYGNoaWxkTm9kZXNgIGluZGV4IGluIHBhcmVudCkgYW5kIG9wdGlvbmFsbHkKICAgICAgICogYHBhcmVudGAsIHdoaWNoIHBvaW50cyB0byBub2RlIGluZm8gb2YgaXRzIHBhcmVudCAoaW5jbHVkaW5nIGl0cyBpbmRleCkuCiAgICAgICAqCiAgICAgICAqIFRoZSB0ZW1wbGF0ZSBtZXRhZGF0YSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBoYXMgdGhlIGZvbGxvd2luZwogICAgICAgKiBzdHJ1Y3R1cmUgKG1hbnkgZmllbGRzIG9wdGlvbmFsKToKICAgICAgICoKICAgICAgICogYGBganMKICAgICAgICogICB7CiAgICAgICAqICAgICAvLyBGbGF0dGVuZWQgbGlzdCBvZiBub2RlIG1ldGFkYXRhIChmb3Igbm9kZXMgdGhhdCBnZW5lcmF0ZWQgbWV0YWRhdGEpCiAgICAgICAqICAgICBub2RlSW5mb0xpc3Q6IFsKICAgICAgICogICAgICAgewogICAgICAgKiAgICAgICAgIC8vIGBpZGAgYXR0cmlidXRlIGZvciBhbnkgbm9kZXMgd2l0aCBpZCdzIGZvciBnZW5lcmF0aW5nIGAkYCBtYXAKICAgICAgICogICAgICAgICBpZDoge3N0cmluZ30sCiAgICAgICAqICAgICAgICAgLy8gYG9uLWV2ZW50PSJoYW5kbGVyImAgbWV0YWRhdGEKICAgICAgICogICAgICAgICBldmVudHM6IFsKICAgICAgICogICAgICAgICAgIHsKICAgICAgICogICAgICAgICAgICAgbmFtZToge3N0cmluZ30sICAgLy8gZXZlbnQgbmFtZQogICAgICAgKiAgICAgICAgICAgICB2YWx1ZToge3N0cmluZ30sICAvLyBoYW5kbGVyIG1ldGhvZCBuYW1lCiAgICAgICAqICAgICAgICAgICB9LCAuLi4KICAgICAgICogICAgICAgICBdLAogICAgICAgKiAgICAgICAgIC8vIE5vdGVzIHdoZW4gdGhlIHRlbXBsYXRlIGNvbnRhaW5lZCBhIGA8c2xvdD5gIGZvciBzaGFkeSBET00KICAgICAgICogICAgICAgICAvLyBvcHRpbWl6YXRpb24gcHVycG9zZXMKICAgICAgICogICAgICAgICBoYXNJbnNlcnRpb25Qb2ludDoge2Jvb2xlYW59LAogICAgICAgKiAgICAgICAgIC8vIEZvciBuZXN0ZWQgYDx0ZW1wbGF0ZT5gYCBub2RlcywgbmVzdGVkIHRlbXBsYXRlIG1ldGFkYXRhCiAgICAgICAqICAgICAgICAgdGVtcGxhdGVJbmZvOiB7b2JqZWN0fSwgLy8gbmVzdGVkIHRlbXBsYXRlIG1ldGFkYXRhCiAgICAgICAqICAgICAgICAgLy8gTWV0YWRhdGEgdG8gYWxsb3cgZWZmaWNpZW50IHJldHJpZXZhbCBvZiBpbnN0YW5jZWQgbm9kZQogICAgICAgKiAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZXRhZGF0YQogICAgICAgKiAgICAgICAgIHBhcmVudEluZm86IHtudW1iZXJ9LCAgIC8vIHJlZmVyZW5jZSB0byBwYXJlbnQgbm9kZUluZm8+CiAgICAgICAqICAgICAgICAgcGFyZW50SW5kZXg6IHtudW1iZXJ9LCAgLy8gaW5kZXggaW4gcGFyZW50J3MgYGNoaWxkTm9kZXNgIGNvbGxlY3Rpb24KICAgICAgICogICAgICAgICBpbmZvSW5kZXg6IHtudW1iZXJ9LCAgICAvLyBpbmRleCBvZiB0aGlzIGBub2RlSW5mb2AgaW4gYHRlbXBsYXRlSW5mby5ub2RlSW5mb0xpc3RgCiAgICAgICAqICAgICAgIH0sCiAgICAgICAqICAgICAgIC4uLgogICAgICAgKiAgICAgXSwKICAgICAgICogICAgIC8vIFdoZW4gdHJ1ZSwgdGhlIHRlbXBsYXRlIGhhZCB0aGUgYHN0cmlwLXdoaXRlc3BhY2VgIGF0dHJpYnV0ZQogICAgICAgKiAgICAgLy8gb3Igd2FzIG5lc3RlZCBpbiBhIHRlbXBsYXRlIHdpdGggdGhhdCBzZXR0aW5nCiAgICAgICAqICAgICBzdHJpcFdoaXRlc3BhY2U6IHtib29sZWFufSwKICAgICAgICogICAgIC8vIEZvciBuZXN0ZWQgdGVtcGxhdGVzLCBuZXN0ZWQgdGVtcGxhdGUgY29udGVudCBpcyBtb3ZlZCBpbnRvCiAgICAgICAqICAgICAvLyBhIGRvY3VtZW50IGZyYWdtZW50IHN0b3JlZCBoZXJlOyB0aGlzIGlzIGFuIG9wdGltaXphdGlvbiB0bwogICAgICAgKiAgICAgLy8gYXZvaWQgdGhlIGNvc3Qgb2YgbmVzdGVkIHRlbXBsYXRlIGNsb25pbmcKICAgICAgICogICAgIGNvbnRlbnQ6IHtEb2N1bWVudEZyYWdtZW50fQogICAgICAgKiAgIH0KICAgICAgICogYGBgCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGtpY2tzIG9mZiBhIHJlY3Vyc2l2ZSB0cmVld2FsayBhcyBmb2xsb3dzOgogICAgICAgKgogICAgICAgKiBgYGAKICAgICAgICogICAgX3BhcnNlVGVtcGxhdGUgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICogICAgICBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQgICAgICAgICAgICAgIHwKICAgICAgICogICAgICAgIF9wYXJzZVRlbXBsYXRlTm9kZSAgPC0tLS0tLS0tLS0tLXwtLSsKICAgICAgICogICAgICAgICAgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZSAtLSsgIHwKICAgICAgICogICAgICAgICAgX3BhcnNlVGVtcGxhdGVDaGlsZE5vZGVzIC0tLS0tLS0tLSsKICAgICAgICogICAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcwogICAgICAgKiAgICAgICAgICAgIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZQogICAgICAgKgogICAgICAgKiBgYGAKICAgICAgICoKICAgICAgICogVGhlc2UgbWV0aG9kcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhZGQgY3VzdG9tIG1ldGFkYXRhIGFib3V0IHRlbXBsYXRlcwogICAgICAgKiB0byBlaXRoZXIgYHRlbXBsYXRlSW5mb2Agb3IgYG5vZGVJbmZvYC4KICAgICAgICoKICAgICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heSBiZSBkZXN0cnVjdGl2ZSB0byB0aGUgdGVtcGxhdGUsIGluIHRoYXQKICAgICAgICogZS5nLiBldmVudCBhbm5vdGF0aW9ucyBtYXkgYmUgcmVtb3ZlZCBhZnRlciBiZWluZyBub3RlZCBpbiB0aGUKICAgICAgICogdGVtcGxhdGUgbWV0YWRhdGEuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvPX0gb3V0ZXJUZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZnJvbSB0aGUgb3V0ZXIKICAgICAgICogICB0ZW1wbGF0ZSwgZm9yIHBhcnNpbmcgbmVzdGVkIHRlbXBsYXRlcwogICAgICAgKiBAcmV0dXJuIHshVGVtcGxhdGVJbmZvfSBQYXJzZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSwgb3V0ZXJUZW1wbGF0ZUluZm8pIHsKICAgICAgICAvLyBzaW5jZSBhIHRlbXBsYXRlIG1heSBiZSByZS11c2VkLCBtZW1vLWl6ZSBtZXRhZGF0YQogICAgICAgIGlmICghdGVtcGxhdGUuX3RlbXBsYXRlSW5mbykgewogICAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IHRlbXBsYXRlLl90ZW1wbGF0ZUluZm8gPSB7fTsKICAgICAgICAgIHRlbXBsYXRlSW5mby5ub2RlSW5mb0xpc3QgPSBbXTsKICAgICAgICAgIHRlbXBsYXRlSW5mby5zdHJpcFdoaXRlU3BhY2UgPSBQb2x5bWVyLmxlZ2FjeU9wdGltaXphdGlvbnMgfHwKICAgICAgICAgICAgKG91dGVyVGVtcGxhdGVJbmZvICYmIG91dGVyVGVtcGxhdGVJbmZvLnN0cmlwV2hpdGVTcGFjZSkgfHwKICAgICAgICAgICAgdGVtcGxhdGUuaGFzQXR0cmlidXRlKCdzdHJpcC13aGl0ZXNwYWNlJyk7CiAgICAgICAgICB0aGlzLl9wYXJzZVRlbXBsYXRlQ29udGVudCh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCB7cGFyZW50OiBudWxsfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZW1wbGF0ZS5fdGVtcGxhdGVJbmZvOwogICAgICB9CgogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVDb250ZW50KHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKHRlbXBsYXRlLmNvbnRlbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRlbXBsYXRlIG5vZGUgYW5kIGFkZHMgdGVtcGxhdGUgYW5kIG5vZGUgbWV0YWRhdGEgYmFzZWQgb24KICAgICAgICogdGhlIGN1cnJlbnQgbm9kZSwgYW5kIGl0cyBgY2hpbGROb2Rlc2AgYW5kIGBhdHRyaWJ1dGVzYC4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4gdG8gYWRkIGN1c3RvbSBub2RlIG9yIHRlbXBsYXRlIHNwZWNpZmljCiAgICAgICAqIG1ldGFkYXRhIGJhc2VkIG9uIHRoaXMgbm9kZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHshVGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHshTm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICBsZXQgbm90ZWQ7CiAgICAgICAgbGV0IGVsZW1lbnQgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovKG5vZGUpOwogICAgICAgIGlmIChlbGVtZW50LmxvY2FsTmFtZSA9PSAndGVtcGxhdGUnICYmICFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncHJlc2VydmUtY29udGVudCcpKSB7CiAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShlbGVtZW50LCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB8fCBub3RlZDsKICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQubG9jYWxOYW1lID09PSAnc2xvdCcpIHsKICAgICAgICAgIC8vIEZvciBTaGFkeURvbSBvcHRpbWl6YXRpb24sIGluZGljYXRpbmcgdGhlcmUgaXMgYW4gaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICB0ZW1wbGF0ZUluZm8uaGFzSW5zZXJ0aW9uUG9pbnQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBlbGVtZW50OwogICAgICAgIGlmICh3YWxrZXIuZmlyc3RDaGlsZCgpKSB7CiAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVDaGlsZE5vZGVzKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0KICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGVzICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlcygpKSB7CiAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcyhlbGVtZW50LCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB8fCBub3RlZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRlbXBsYXRlIGNoaWxkIG5vZGVzIGZvciB0aGUgZ2l2ZW4gcm9vdCBub2RlLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBhbHNvIHdyYXBzIHdoaXRlbGlzdGVkIGxlZ2FjeSB0ZW1wbGF0ZSBleHRlbnNpb25zCiAgICAgICAqIChgaXM9ImRvbS1pZiJgIGFuZCBgaXM9ImRvbS1yZXBlYXQiYCkgd2l0aCB0aGVpciBlcXVpdmFsZW50IGVsZW1lbnQKICAgICAgICogd3JhcHBlcnMsIGNvbGxhcHNlcyB0ZXh0IG5vZGVzLCBhbmQgc3RyaXBzIHdoaXRlc3BhY2UgZnJvbSB0aGUgdGVtcGxhdGUKICAgICAgICogaWYgdGhlIGB0ZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZXNwYWNlYCBzZXR0aW5nIHdhcyBwcm92aWRlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtOb2RlfSByb290IFJvb3Qgbm9kZSB3aG9zZSBgY2hpbGROb2Rlc2Agd2lsbCBiZSBwYXJzZWQKICAgICAgICogQHBhcmFtIHshVGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHshTm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVDaGlsZE5vZGVzKHJvb3QsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICBpZiAocm9vdC5sb2NhbE5hbWUgPT09ICdzY3JpcHQnIHx8IHJvb3QubG9jYWxOYW1lID09PSAnc3R5bGUnKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IHJvb3Q7CiAgICAgICAgZm9yIChsZXQgbm9kZT13YWxrZXIuZmlyc3RDaGlsZCgpLCBwYXJlbnRJbmRleD0wLCBuZXh0OyBub2RlOyBub2RlPW5leHQpIHsKICAgICAgICAgIC8vIFdyYXAgdGVtcGxhdGVzCiAgICAgICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT0gJ3RlbXBsYXRlJykgewogICAgICAgICAgICBub2RlID0gd3JhcFRlbXBsYXRlRXh0ZW5zaW9uKG5vZGUpOwogICAgICAgICAgfQogICAgICAgICAgLy8gY29sbGFwc2UgYWRqYWNlbnQgdGV4dE5vZGVzOiBmaXhlcyBhbiBJRSBpc3N1ZSB0aGF0IGNhbiBjYXVzZQogICAgICAgICAgLy8gdGV4dCBub2RlcyB0byBiZSBpbmV4cGxpY2FibHkgc3BsaXQgPSgKICAgICAgICAgIC8vIG5vdGUgdGhhdCByb290Lm5vcm1hbGl6ZSgpIHNob3VsZCB3b3JrIGJ1dCBkb2VzIG5vdCBzbyB3ZSBkbyB0aGlzCiAgICAgICAgICAvLyBtYW51YWxseS4KICAgICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IG5vZGU7CiAgICAgICAgICBuZXh0ID0gd2Fsa2VyLm5leHRTaWJsaW5nKCk7CiAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgICAgICAgbGV0IC8qKiBOb2RlICovIG4gPSBuZXh0OwogICAgICAgICAgICB3aGlsZSAobiAmJiAobi5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpKSB7CiAgICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCArPSBuLnRleHRDb250ZW50OwogICAgICAgICAgICAgIG5leHQgPSB3YWxrZXIubmV4dFNpYmxpbmcoKTsKICAgICAgICAgICAgICByb290LnJlbW92ZUNoaWxkKG4pOwogICAgICAgICAgICAgIG4gPSBuZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgc3RyaXAgd2hpdGVzcGFjZQogICAgICAgICAgICBpZiAodGVtcGxhdGVJbmZvLnN0cmlwV2hpdGVTcGFjZSAmJiAhbm9kZS50ZXh0Q29udGVudC50cmltKCkpIHsKICAgICAgICAgICAgICByb290LnJlbW92ZUNoaWxkKG5vZGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgY2hpbGRJbmZvID0geyBwYXJlbnRJbmRleCwgcGFyZW50SW5mbzogbm9kZUluZm8gfTsKICAgICAgICAgIGlmICh0aGlzLl9wYXJzZVRlbXBsYXRlTm9kZShub2RlLCB0ZW1wbGF0ZUluZm8sIGNoaWxkSW5mbykpIHsKICAgICAgICAgICAgY2hpbGRJbmZvLmluZm9JbmRleCA9IHRlbXBsYXRlSW5mby5ub2RlSW5mb0xpc3QucHVzaCgvKiogQHR5cGUgeyFOb2RlSW5mb30gKi8oY2hpbGRJbmZvKSkgLSAxOwogICAgICAgICAgfQogICAgICAgICAgLy8gSW5jcmVtZW50IGlmIG5vdCByZW1vdmVkCiAgICAgICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBub2RlOwogICAgICAgICAgaWYgKHdhbGtlci5wYXJlbnROb2RlKCkpIHsKICAgICAgICAgICAgcGFyZW50SW5kZXgrKzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgY29udGVudCBmb3IgdGhlIGdpdmVuIG5lc3RlZCBgPHRlbXBsYXRlPmAuCiAgICAgICAqCiAgICAgICAqIE5lc3RlZCB0ZW1wbGF0ZSBpbmZvIGlzIHN0b3JlZCBhcyBgdGVtcGxhdGVJbmZvYCBpbiB0aGUgY3VycmVudCBub2RlJ3MKICAgICAgICogYG5vZGVJbmZvYC4gYHRlbXBsYXRlLmNvbnRlbnRgIGlzIHJlbW92ZWQgYW5kIHN0b3JlZCBpbiBgdGVtcGxhdGVJbmZvYC4KICAgICAgICogSXQgd2lsbCB0aGVuIGJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgaG9zdCB0byBzZXQgaXQgYmFjayB0byB0aGUKICAgICAgICogdGVtcGxhdGUgYW5kIGZvciB1c2VycyBzdGFtcGluZyBuZXN0ZWQgdGVtcGxhdGVzIHRvIHVzZSB0aGUKICAgICAgICogYF9jb250ZW50Rm9yVGVtcGxhdGVgIG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgY29udGVudCBmb3IgdGhpcyB0ZW1wbGF0ZQogICAgICAgKiAoYW4gb3B0aW1pemF0aW9uIHRvIGF2b2lkIHRoZSBjb3N0IG9mIGNsb25pbmcgbmVzdGVkIHRlbXBsYXRlIGNvbnRlbnQpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZSAoYSA8dGVtcGxhdGU+KQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gb3V0ZXJUZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogICB0aGF0IGluY2x1ZGVzIHRoZSB0ZW1wbGF0ZSBgbm9kZWAKICAgICAgICogQHBhcmFtIHshTm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCBvdXRlclRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5fcGFyc2VUZW1wbGF0ZShub2RlLCBvdXRlclRlbXBsYXRlSW5mbyk7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0ZW1wbGF0ZUluZm8uY29udGVudCA9CiAgICAgICAgICBub2RlLmNvbnRlbnQub3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZChub2RlLmNvbnRlbnQpOwogICAgICAgIG5vZGVJbmZvLnRlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbzsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBub2RlIGF0dHJpYnV0ZXMgYW5kIGFkZHMgbm9kZSBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqIGZvciBub2RlcyBvZiBpbnRlcmVzdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIE5vZGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0ge05vZGVJbmZvfSBub2RlSW5mbyBOb2RlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZXMobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIC8vIE1ha2UgY29weSBvZiBvcmlnaW5hbCBhdHRyaWJ1dGUgbGlzdCwgc2luY2UgdGhlIG9yZGVyIG1heSBjaGFuZ2UKICAgICAgICAvLyBhcyBhdHRyaWJ1dGVzIGFyZSBhZGRlZCBhbmQgcmVtb3ZlZAogICAgICAgIGxldCBub3RlZCA9IGZhbHNlOwogICAgICAgIGxldCBhdHRycyA9IEFycmF5LmZyb20obm9kZS5hdHRyaWJ1dGVzKTsKICAgICAgICBmb3IgKGxldCBpPWF0dHJzLmxlbmd0aC0xLCBhOyAoYT1hdHRyc1tpXSk7IGktLSkgewogICAgICAgICAgbm90ZWQgPSB0aGlzLl9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBhLm5hbWUsIGEudmFsdWUpIHx8IG5vdGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgYSBzaW5nbGUgdGVtcGxhdGUgbm9kZSBhdHRyaWJ1dGUgYW5kIGFkZHMgbm9kZSBtZXRhZGF0YSB0bwogICAgICAgKiBgbm9kZUluZm9gIGZvciBhdHRyaWJ1dGVzIG9mIGludGVyZXN0LgogICAgICAgKgogICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFkZHMgbWV0YWRhdGEgZm9yIGBvbi1ldmVudD0iaGFuZGxlciJgIGF0dHJpYnV0ZXMKICAgICAgICogYW5kIGBpZGAgYXR0cmlidXRlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIE5vZGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHshVGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHshTm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEF0dHJpYnV0ZSBuYW1lCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpIHsKICAgICAgICAvLyBldmVudHMgKG9uLSopCiAgICAgICAgaWYgKG5hbWUuc2xpY2UoMCwgMykgPT09ICdvbi0nKSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICAgIG5vZGVJbmZvLmV2ZW50cyA9IG5vZGVJbmZvLmV2ZW50cyB8fCBbXTsKICAgICAgICAgIG5vZGVJbmZvLmV2ZW50cy5wdXNoKHsKICAgICAgICAgICAgbmFtZTogbmFtZS5zbGljZSgzKSwKICAgICAgICAgICAgdmFsdWUKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIC8vIHN0YXRpYyBpZAogICAgICAgIGVsc2UgaWYgKG5hbWUgPT09ICdpZCcpIHsKICAgICAgICAgIG5vZGVJbmZvLmlkID0gdmFsdWU7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgYGNvbnRlbnRgIGRvY3VtZW50IGZyYWdtZW50IGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBGb3IgbmVzdGVkIHRlbXBsYXRlcywgUG9seW1lciBwZXJmb3JtcyBhbiBvcHRpbWl6YXRpb24gdG8gY2FjaGUgbmVzdGVkCiAgICAgICAqIHRlbXBsYXRlIGNvbnRlbnQgdG8gYXZvaWQgdGhlIGNvc3Qgb2YgY2xvbmluZyBkZWVwbHkgbmVzdGVkIHRlbXBsYXRlcy4KICAgICAgICogVGhpcyBtZXRob2QgcmV0cmlldmVzIHRoZSBjYWNoZWQgY29udGVudCBmb3IgYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byByZXRyaWV2ZSBgY29udGVudGAgZm9yCiAgICAgICAqIEByZXR1cm4ge0RvY3VtZW50RnJhZ21lbnR9IENvbnRlbnQgZnJhZ21lbnQKICAgICAgICovCiAgICAgIHN0YXRpYyBfY29udGVudEZvclRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudFdpdGhJbmZvfSAqLyAodGVtcGxhdGUpLl90ZW1wbGF0ZUluZm87CiAgICAgICAgcmV0dXJuICh0ZW1wbGF0ZUluZm8gJiYgdGVtcGxhdGVJbmZvLmNvbnRlbnQpIHx8IHRlbXBsYXRlLmNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDbG9uZXMgdGhlIHByb3ZpZGVkIHRlbXBsYXRlIGNvbnRlbnQgYW5kIHJldHVybnMgYSBkb2N1bWVudCBmcmFnbWVudAogICAgICAgKiBjb250YWluaW5nIHRoZSBjbG9uZWQgZG9tLgogICAgICAgKgogICAgICAgKiBUaGUgdGVtcGxhdGUgaXMgcGFyc2VkIChvbmNlIGFuZCBtZW1vaXplZCkgdXNpbmcgdGhpcyBsaWJyYXJ5J3MKICAgICAgICogdGVtcGxhdGUgcGFyc2luZyBmZWF0dXJlcywgYW5kIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUtYWRkZWQKICAgICAgICogZmVhdHVyZXM6CiAgICAgICAqICogQWRkcyBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgZm9yIGBvbi1ldmVudD0iaGFuZGxlciJgIGF0dHJpYnV0ZXMKICAgICAgICogKiBHZW5lcmF0ZXMgYW4gImlkIG1hcCIgZm9yIGFsbCBub2RlcyB3aXRoIGlkJ3MgdW5kZXIgYCRgIG9uIHJldHVybmVkCiAgICAgICAqICAgZG9jdW1lbnQgZnJhZ21lbnQKICAgICAgICogKiBQYXNzZXMgdGVtcGxhdGUgaW5mbyBpbmNsdWRpbmcgYGNvbnRlbnRgIGJhY2sgdG8gdGVtcGxhdGVzIGFzCiAgICAgICAqICAgYF90ZW1wbGF0ZUluZm9gIChhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB0byBhdm9pZCBkZWVwIHRlbXBsYXRlCiAgICAgICAqICAgY2xvbmluZykKICAgICAgICoKICAgICAgICogTm90ZSB0aGF0IHRoZSBtZW1vaXplZCB0ZW1wbGF0ZSBwYXJzaW5nIHByb2Nlc3MgaXMgZGVzdHJ1Y3RpdmUgdG8gdGhlCiAgICAgICAqIHRlbXBsYXRlOiBhdHRyaWJ1dGVzIGZvciBiaW5kaW5ncyBhbmQgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzIGFyZQogICAgICAgKiByZW1vdmVkIGFmdGVyIGJlaW5nIG5vdGVkIGluIG5vdGVzLCBhbmQgYW55IG5lc3RlZCBgPHRlbXBsYXRlPi5jb250ZW50YAogICAgICAgKiBpcyByZW1vdmVkIGFuZCBzdG9yZWQgaW4gbm90ZXMgYXMgd2VsbC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gc3RhbXAKICAgICAgICogQHJldHVybiB7IVN0YW1wZWRUZW1wbGF0ZX0gQ2xvbmVkIHRlbXBsYXRlIGNvbnRlbnQKICAgICAgICovCiAgICAgIF9zdGFtcFRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgLy8gUG9seWZpbGwgc3VwcG9ydDogYm9vdHN0cmFwIHRoZSB0ZW1wbGF0ZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbgogICAgICAgIGlmICh0ZW1wbGF0ZSAmJiAhdGVtcGxhdGUuY29udGVudCAmJgogICAgICAgICAgICB3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudCAmJiBIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlKSB7CiAgICAgICAgICBIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlKHRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IHRoaXMuY29uc3RydWN0b3IuX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIGxldCBub2RlSW5mbyA9IHRlbXBsYXRlSW5mby5ub2RlSW5mb0xpc3Q7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0ZW1wbGF0ZUluZm8uY29udGVudCB8fCB0ZW1wbGF0ZS5jb250ZW50OwogICAgICAgIGxldCBkb20gPSAvKiogQHR5cGUge0RvY3VtZW50RnJhZ21lbnR9ICovIChkb2N1bWVudC5pbXBvcnROb2RlKGNvbnRlbnQsIHRydWUpKTsKICAgICAgICAvLyBOT1RFOiBTaGFkeURvbSBvcHRpbWl6YXRpb24gaW5kaWNhdGluZyB0aGVyZSBpcyBhbiBpbnNlcnRpb24gcG9pbnQKICAgICAgICBkb20uX19ub0luc2VydGlvblBvaW50ID0gIXRlbXBsYXRlSW5mby5oYXNJbnNlcnRpb25Qb2ludDsKICAgICAgICBsZXQgbm9kZXMgPSBkb20ubm9kZUxpc3QgPSBuZXcgQXJyYXkobm9kZUluZm8ubGVuZ3RoKTsKICAgICAgICBkb20uJCA9IHt9OwogICAgICAgIGZvciAobGV0IGk9MCwgbD1ub2RlSW5mby5sZW5ndGgsIGluZm87IChpPGwpICYmIChpbmZvPW5vZGVJbmZvW2ldKTsgaSsrKSB7CiAgICAgICAgICBsZXQgbm9kZSA9IG5vZGVzW2ldID0gZmluZFRlbXBsYXRlTm9kZShkb20sIGluZm8pOwogICAgICAgICAgYXBwbHlJZFRvTWFwKHRoaXMsIGRvbS4kLCBub2RlLCBpbmZvKTsKICAgICAgICAgIGFwcGx5VGVtcGxhdGVDb250ZW50KHRoaXMsIG5vZGUsIGluZm8pOwogICAgICAgICAgYXBwbHlFdmVudExpc3RlbmVyKHRoaXMsIG5vZGUsIGluZm8pOwogICAgICAgIH0KICAgICAgICBkb20gPSAvKiogQHR5cGUgeyFTdGFtcGVkVGVtcGxhdGV9ICovKGRvbSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1hc3NpZ24KICAgICAgICByZXR1cm4gZG9tOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBieSBtZXRob2QgbmFtZSBmb3IgdGhlIGV2ZW50IHByb3ZpZGVkLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgYSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgbG9va3MgdXAgdGhlIG1ldGhvZAogICAgICAgKiBuYW1lIGF0IGhhbmRsaW5nIHRpbWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBhZGQgbGlzdGVuZXIgb24KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgbWV0aG9kCiAgICAgICAqIEBwYXJhbSB7Kj19IGNvbnRleHQgQ29udGV4dCB0aGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uIChkZWZhdWx0cwogICAgICAgKiAgIHRvIGBub2RlYCkKICAgICAgICogQHJldHVybiB7RnVuY3Rpb259IEdlbmVyYXRlZCBoYW5kbGVyIGZ1bmN0aW9uCiAgICAgICAqLwogICAgICBfYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIG1ldGhvZE5hbWUsIGNvbnRleHQpIHsKICAgICAgICBjb250ZXh0ID0gY29udGV4dCB8fCBub2RlOwogICAgICAgIGxldCBoYW5kbGVyID0gY3JlYXRlTm9kZUV2ZW50SGFuZGxlcihjb250ZXh0LCBldmVudE5hbWUsIG1ldGhvZE5hbWUpOwogICAgICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICByZXR1cm4gaGFuZGxlcjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHBvaW50IGZvciBhZGRpbmcgY3VzdG9tIG9yIHNpbXVsYXRlZCBldmVudCBoYW5kbGluZy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBldmVudCBsaXN0ZW5lciB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYWRkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHBvaW50IGZvciBhZGRpbmcgY3VzdG9tIG9yIHNpbXVsYXRlZCBldmVudCBoYW5kbGluZy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIFRlbXBsYXRlU3RhbXA7CgogIH0pOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLyoqIEBjb25zdCB7T2JqZWN0fSAqLwogIGNvbnN0IENhc2VNYXAgPSBQb2x5bWVyLkNhc2VNYXA7CgogIC8vIE1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB1bmlxdWUgSUQgdXNlZCBmb3IgZGUtZHVwaW5nIGVmZmVjdHMgdHJpZ2dlcmVkCiAgLy8gZnJvbSBtdWx0aXBsZSBwcm9wZXJ0aWVzIGluIHRoZSBzYW1lIHR1cm4KICBsZXQgZGVkdXBlSWQgPSAwOwoKICAvKioKICAgKiBQcm9wZXJ0eSBlZmZlY3QgdHlwZXM7IGVmZmVjdHMgYXJlIHN0b3JlZCBvbiB0aGUgcHJvdG90eXBlIHVzaW5nIHRoZXNlIGtleXMKICAgKiBAZW51bSB7c3RyaW5nfQogICAqLwogIGNvbnN0IFRZUEVTID0gewogICAgQ09NUFVURTogJ19fY29tcHV0ZUVmZmVjdHMnLAogICAgUkVGTEVDVDogJ19fcmVmbGVjdEVmZmVjdHMnLAogICAgTk9USUZZOiAnX19ub3RpZnlFZmZlY3RzJywKICAgIFBST1BBR0FURTogJ19fcHJvcGFnYXRlRWZmZWN0cycsCiAgICBPQlNFUlZFOiAnX19vYnNlcnZlRWZmZWN0cycsCiAgICBSRUFEX09OTFk6ICdfX3JlYWRPbmx5JwogIH07CgogIC8qKiBAY29uc3Qge1JlZ0V4cH0gKi8KICBjb25zdCBjYXBpdGFsQXR0cmlidXRlUmVnZXggPSAvW0EtWl0vOwoKICAvKioKICAgKiBAdHlwZWRlZiB7ewogICAqIG5hbWU6IChzdHJpbmcgfCB1bmRlZmluZWQpLAogICAqIHN0cnVjdHVyZWQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSwKICAgKiB3aWxkY2FyZDogKGJvb2xlYW4gfCB1bmRlZmluZWQpCiAgICogfX0KICAgKi8KICBsZXQgRGF0YVRyaWdnZXI7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAvKioKICAgKiBAdHlwZWRlZiB7ewogICAqIGluZm86ID8sCiAgICogdHJpZ2dlcjogKCFEYXRhVHJpZ2dlciB8IHVuZGVmaW5lZCksCiAgICogZm46ICghRnVuY3Rpb24gfCB1bmRlZmluZWQpCiAgICogfX0KICAgKi8KICBsZXQgRGF0YUVmZmVjdDsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIGxldCBQcm9wZXJ0eUVmZmVjdHNUeXBlOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgLyoqCiAgICogRW5zdXJlcyB0aGF0IHRoZSBtb2RlbCBoYXMgYW4gb3duLXByb3BlcnR5IG1hcCBvZiBlZmZlY3RzIGZvciB0aGUgZ2l2ZW4gdHlwZS4KICAgKiBUaGUgbW9kZWwgbWF5IGJlIGEgcHJvdG90eXBlIG9yIGFuIGluc3RhbmNlLgogICAqCiAgICogUHJvcGVydHkgZWZmZWN0cyBhcmUgc3RvcmVkIGFzIGFycmF5cyBvZiBlZmZlY3RzIGJ5IHByb3BlcnR5IGluIGEgbWFwLAogICAqIGJ5IG5hbWVkIHR5cGUgb24gdGhlIG1vZGVsLiBlLmcuCiAgICoKICAgKiAgIF9fY29tcHV0ZUVmZmVjdHM6IHsKICAgKiAgICAgZm9vOiBbIC4uLiBdLAogICAqICAgICBiYXI6IFsgLi4uIF0KICAgKiAgIH0KICAgKgogICAqIElmIHRoZSBtb2RlbCBkb2VzIG5vdCB5ZXQgaGF2ZSBhbiBlZmZlY3QgbWFwIGZvciB0aGUgdHlwZSwgb25lIGlzIGNyZWF0ZWQKICAgKiBhbmQgcmV0dXJuZWQuICBJZiBpdCBkb2VzLCBidXQgaXQgaXMgbm90IGFuIG93biBwcm9wZXJ0eSAoaS5lLiB0aGUKICAgKiBwcm90b3R5cGUgaGFkIGVmZmVjdHMpLCB0aGUgdGhlIG1hcCBpcyBkZWVwbHkgY2xvbmVkIGFuZCB0aGUgY29weSBpcwogICAqIHNldCBvbiB0aGUgbW9kZWwgYW5kIHJldHVybmVkLCByZWFkeSBmb3IgbmV3IGVmZmVjdHMgdG8gYmUgYWRkZWQuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gbW9kZWwgUHJvdG90eXBlIG9yIGluc3RhbmNlCiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgUHJvcGVydHkgZWZmZWN0IHR5cGUKICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBvd24tcHJvcGVydHkgbWFwIG9mIGVmZmVjdHMgZm9yIHRoZSBnaXZlbiB0eXBlCiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBlbnN1cmVPd25FZmZlY3RNYXAobW9kZWwsIHR5cGUpIHsKICAgIGxldCBlZmZlY3RzID0gbW9kZWxbdHlwZV07CiAgICBpZiAoIWVmZmVjdHMpIHsKICAgICAgZWZmZWN0cyA9IG1vZGVsW3R5cGVdID0ge307CiAgICB9IGVsc2UgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICBlZmZlY3RzID0gbW9kZWxbdHlwZV0gPSBPYmplY3QuY3JlYXRlKG1vZGVsW3R5cGVdKTsKICAgICAgZm9yIChsZXQgcCBpbiBlZmZlY3RzKSB7CiAgICAgICAgbGV0IHByb3RvRnggPSBlZmZlY3RzW3BdOwogICAgICAgIGxldCBpbnN0RnggPSBlZmZlY3RzW3BdID0gQXJyYXkocHJvdG9GeC5sZW5ndGgpOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxwcm90b0Z4Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpbnN0RnhbaV0gPSBwcm90b0Z4W2ldOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGVmZmVjdHM7CiAgfQoKICAvLyAtLSBlZmZlY3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLyoqCiAgICogUnVucyBhbGwgZWZmZWN0cyBvZiBhIGdpdmVuIHR5cGUgZm9yIHRoZSBnaXZlbiBzZXQgb2YgcHJvcGVydHkgY2hhbmdlcwogICAqIG9uIGFuIGluc3RhbmNlLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2l0aCBlZmZlY3RzIHRvIHJ1bgogICAqIEBwYXJhbSB7T2JqZWN0fSBlZmZlY3RzIE9iamVjdCBtYXAgb2YgcHJvcGVydHktdG8tQXJyYXkgb2YgZWZmZWN0cwogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3Q9fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEBwYXJhbSB7Kj19IGV4dHJhQXJncyBBZGRpdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gZWZmZWN0IGZ1bmN0aW9uCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbiBlZmZlY3QgcmFuIGZvciB0aGlzIHByb3BlcnR5CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5FZmZlY3RzKGluc3QsIGVmZmVjdHMsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMsIGV4dHJhQXJncykgewogICAgaWYgKGVmZmVjdHMpIHsKICAgICAgbGV0IHJhbiA9IGZhbHNlOwogICAgICBsZXQgaWQgPSBkZWR1cGVJZCsrOwogICAgICBmb3IgKGxldCBwcm9wIGluIHByb3BzKSB7CiAgICAgICAgaWYgKHJ1bkVmZmVjdHNGb3JQcm9wZXJ0eShpbnN0LCBlZmZlY3RzLCBpZCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSkgewogICAgICAgICAgcmFuID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJhbjsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8qKgogICAqIFJ1bnMgYSBsaXN0IG9mIGVmZmVjdHMgZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB3aXRoIGVmZmVjdHMgdG8gcnVuCiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdHMgT2JqZWN0IG1hcCBvZiBwcm9wZXJ0eS10by1BcnJheSBvZiBlZmZlY3RzCiAgICogQHBhcmFtIHtudW1iZXJ9IGRlZHVwZUlkIENvdW50ZXIgdXNlZCBmb3IgZGUtZHVwaW5nIGVmZmVjdHMKICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBOYW1lIG9mIGNoYW5nZWQgcHJvcGVydHkKICAgKiBAcGFyYW0geyp9IHByb3BzIENoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Kn0gb2xkUHJvcHMgT2xkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEBwYXJhbSB7Kj19IGV4dHJhQXJncyBBZGRpdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gZWZmZWN0IGZ1bmN0aW9uCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbiBlZmZlY3QgcmFuIGZvciB0aGlzIHByb3BlcnR5CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5FZmZlY3RzRm9yUHJvcGVydHkoaW5zdCwgZWZmZWN0cywgZGVkdXBlSWQsIHByb3AsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMsIGV4dHJhQXJncykgewogICAgbGV0IHJhbiA9IGZhbHNlOwogICAgbGV0IHJvb3RQcm9wZXJ0eSA9IGhhc1BhdGhzID8gUG9seW1lci5QYXRoLnJvb3QocHJvcCkgOiBwcm9wOwogICAgbGV0IGZ4cyA9IGVmZmVjdHNbcm9vdFByb3BlcnR5XTsKICAgIGlmIChmeHMpIHsKICAgICAgZm9yIChsZXQgaT0wLCBsPWZ4cy5sZW5ndGgsIGZ4OyAoaTxsKSAmJiAoZng9ZnhzW2ldKTsgaSsrKSB7CiAgICAgICAgaWYgKCghZnguaW5mbyB8fCBmeC5pbmZvLmxhc3RSdW4gIT09IGRlZHVwZUlkKSAmJgogICAgICAgICAgICAoIWhhc1BhdGhzIHx8IHBhdGhNYXRjaGVzVHJpZ2dlcihwcm9wLCBmeC50cmlnZ2VyKSkpIHsKICAgICAgICAgIGlmIChmeC5pbmZvKSB7CiAgICAgICAgICAgIGZ4LmluZm8ubGFzdFJ1biA9IGRlZHVwZUlkOwogICAgICAgICAgfQogICAgICAgICAgZnguZm4oaW5zdCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBmeC5pbmZvLCBoYXNQYXRocywgZXh0cmFBcmdzKTsKICAgICAgICAgIHJhbiA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmFuOwogIH0KCiAgLyoqCiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcHJvcGVydHkvcGF0aCB0aGF0IGhhcyBjaGFuZ2VkIG1hdGNoZXMgdGhlIHRyaWdnZXIKICAgKiBjcml0ZXJpYSBmb3IgYW4gZWZmZWN0LiAgQSB0cmlnZ2VyIGlzIGEgZGVzY3JpcHRvciB3aXRoIHRoZSBmb2xsb3dpbmcKICAgKiBzdHJ1Y3R1cmUsIHdoaWNoIG1hdGNoZXMgdGhlIGRlc2NyaXB0b3JzIHJldHVybmVkIGZyb20gYHBhcnNlQXJnYC4KICAgKiBlLmcuIGZvciBgZm9vLmJhci4qYDoKICAgKiBgYGAKICAgKiB0cmlnZ2VyOiB7CiAgICogICBuYW1lOiAnYS5iJywKICAgKiAgIHN0cnVjdHVyZWQ6IHRydWUsCiAgICogICB3aWxkY2FyZDogdHJ1ZQogICAqIH0KICAgKiBgYGAKICAgKiBJZiBubyB0cmlnZ2VyIGlzIGdpdmVuLCB0aGUgcGF0aCBpcyBkZWVtZWQgdG8gbWF0Y2guCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIG9yIHByb3BlcnR5IHRoYXQgY2hhbmdlZAogICAqIEBwYXJhbSB7RGF0YVRyaWdnZXJ9IHRyaWdnZXIgRGVzY3JpcHRvcgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHBhdGggbWF0Y2hlZCB0aGUgdHJpZ2dlcgogICAqLwogIGZ1bmN0aW9uIHBhdGhNYXRjaGVzVHJpZ2dlcihwYXRoLCB0cmlnZ2VyKSB7CiAgICBpZiAodHJpZ2dlcikgewogICAgICBsZXQgdHJpZ2dlclBhdGggPSB0cmlnZ2VyLm5hbWU7CiAgICAgIHJldHVybiAodHJpZ2dlclBhdGggPT0gcGF0aCkgfHwKICAgICAgICAodHJpZ2dlci5zdHJ1Y3R1cmVkICYmIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKHRyaWdnZXJQYXRoLCBwYXRoKSkgfHwKICAgICAgICAodHJpZ2dlci53aWxkY2FyZCAmJiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KHRyaWdnZXJQYXRoLCBwYXRoKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CgogIC8qKgogICAqIEltcGxlbWVudHMgdGhlICJvYnNlcnZlciIgZWZmZWN0LgogICAqCiAgICogQ2FsbHMgdGhlIG1ldGhvZCB3aXRoIGBpbmZvLm1ldGhvZE5hbWVgIG9uIHRoZSBpbnN0YW5jZSwgcGFzc2luZyB0aGUKICAgKiBuZXcgYW5kIG9sZCB2YWx1ZXMuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bk9ic2VydmVyRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgIGxldCBmbiA9IHR5cGVvZiBpbmZvLm1ldGhvZCA9PT0gInN0cmluZyIgPyBpbnN0W2luZm8ubWV0aG9kXSA6IGluZm8ubWV0aG9kOwogICAgbGV0IGNoYW5nZWRQcm9wID0gaW5mby5wcm9wZXJ0eTsKICAgIGlmIChmbikgewogICAgICBmbi5jYWxsKGluc3QsIGluc3QuX19kYXRhW2NoYW5nZWRQcm9wXSwgb2xkUHJvcHNbY2hhbmdlZFByb3BdKTsKICAgIH0gZWxzZSBpZiAoIWluZm8uZHluYW1pY0ZuKSB7CiAgICAgIGNvbnNvbGUud2Fybignb2JzZXJ2ZXIgbWV0aG9kIGAnICsgaW5mby5tZXRob2QgKyAnYCBub3QgZGVmaW5lZCcpOwogICAgfQogIH0KCiAgLyoqCiAgICogUnVucyAibm90aWZ5IiBlZmZlY3RzIGZvciBhIHNldCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gdGhlIGdlbmVyaWMgYHJ1bkVmZmVjdHNgIG1ldGhvZCBpbiB0aGF0IGl0CiAgICogd2lsbCBkaXNwYXRjaCBwYXRoIG5vdGlmaWNhdGlvbiBldmVudHMgaW4gdGhlIGNhc2UgdGhhdCB0aGUgcHJvcGVydHkKICAgKiBjaGFuZ2VkIHdhcyBhIHBhdGggYW5kIHRoZSByb290IHByb3BlcnR5IGZvciB0aGF0IHBhdGggZGlkbid0IGhhdmUgYQogICAqICJub3RpZnkiIGVmZmVjdC4gIFRoaXMgaXMgdG8gbWFpbnRhaW4gMS4wIGJlaGF2aW9yIHRoYXQgZGlkIG5vdCByZXF1aXJlCiAgICogYG5vdGlmeTogdHJ1ZWAgdG8gZW5zdXJlIG9iamVjdCBzdWItcHJvcGVydHkgbm90aWZpY2F0aW9ucyB3ZXJlCiAgICogc2VudC4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHdpdGggZWZmZWN0cyB0byBydW4KICAgKiBAcGFyYW0ge09iamVjdH0gbm90aWZ5UHJvcHMgQmFnIG9mIHByb3BlcnRpZXMgdG8gbm90aWZ5CiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Ob3RpZnlFZmZlY3RzKGluc3QsIG5vdGlmeVByb3BzLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAvLyBOb3RpZnkKICAgIGxldCBmeHMgPSBpbnN0W1RZUEVTLk5PVElGWV07CiAgICBsZXQgbm90aWZpZWQ7CiAgICBsZXQgaWQgPSBkZWR1cGVJZCsrOwogICAgLy8gVHJ5IG5vcm1hbCBub3RpZnkgZWZmZWN0czsgaWYgbm9uZSwgZmFsbCBiYWNrIHRvIHRyeSBwYXRoIG5vdGlmaWNhdGlvbgogICAgZm9yIChsZXQgcHJvcCBpbiBub3RpZnlQcm9wcykgewogICAgICBpZiAobm90aWZ5UHJvcHNbcHJvcF0pIHsKICAgICAgICBpZiAoZnhzICYmIHJ1bkVmZmVjdHNGb3JQcm9wZXJ0eShpbnN0LCBmeHMsIGlkLCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSkgewogICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAoaGFzUGF0aHMgJiYgbm90aWZ5UGF0aChpbnN0LCBwcm9wLCBwcm9wcykpIHsKICAgICAgICAgIG5vdGlmaWVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8vIEZsdXNoIGhvc3QgaWYgd2UgYWN0dWFsbHkgbm90aWZpZWQgYW5kIGhvc3Qgd2FzIGJhdGNoaW5nCiAgICAvLyBBbmQgdGhlIGhvc3QgaGFzIGFscmVhZHkgaW5pdGlhbGl6ZWQgY2xpZW50czsgdGhpcyBwcmV2ZW50cwogICAgLy8gYW4gaXNzdWUgd2l0aCBhIGhvc3Qgb2JzZXJ2aW5nIGRhdGEgY2hhbmdlcyBiZWZvcmUgY2xpZW50cyBhcmUgcmVhZHkuCiAgICBsZXQgaG9zdDsKICAgIGlmIChub3RpZmllZCAmJiAoaG9zdCA9IGluc3QuX19kYXRhSG9zdCkgJiYgaG9zdC5faW52YWxpZGF0ZVByb3BlcnRpZXMpIHsKICAgICAgaG9zdC5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgIH0KICB9CgogIC8qKgogICAqIERpc3BhdGNoZXMge3Byb3BlcnR5fS1jaGFuZ2VkIGV2ZW50cyB3aXRoIHBhdGggaW5mb3JtYXRpb24gaW4gdGhlIGRldGFpbAogICAqIG9iamVjdCB0byBpbmRpY2F0ZSBhIHN1Yi1wYXRoIG9mIHRoZSBwcm9wZXJ0eSB3YXMgY2hhbmdlZC4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGVsZW1lbnQgZnJvbSB3aGljaCB0byBmaXJlIHRoZSBldmVudAogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRoYXQgd2FzIGNoYW5nZWQKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0aCB3YXMgbm90aWZpZWQKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIG5vdGlmeVBhdGgoaW5zdCwgcGF0aCwgcHJvcHMpIHsKICAgIGxldCByb290UHJvcGVydHkgPSBQb2x5bWVyLlBhdGgucm9vdChwYXRoKTsKICAgIGlmIChyb290UHJvcGVydHkgIT09IHBhdGgpIHsKICAgICAgbGV0IGV2ZW50TmFtZSA9IFBvbHltZXIuQ2FzZU1hcC5jYW1lbFRvRGFzaENhc2Uocm9vdFByb3BlcnR5KSArICctY2hhbmdlZCc7CiAgICAgIGRpc3BhdGNoTm90aWZ5RXZlbnQoaW5zdCwgZXZlbnROYW1lLCBwcm9wc1twYXRoXSwgcGF0aCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogRGlzcGF0Y2hlcyB7cHJvcGVydHl9LWNoYW5nZWQgZXZlbnRzIHRvIGluZGljYXRlIGEgcHJvcGVydHkgKG9yIHBhdGgpCiAgICogY2hhbmdlZC4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGVsZW1lbnQgZnJvbSB3aGljaCB0byBmaXJlIHRoZSBldmVudAogICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQgKCd7cHJvcGVydHl9LWNoYW5nZWQnKQogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5CiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXRoIElmIGEgc3ViLXBhdGggb2YgdGhpcyBwcm9wZXJ0eSBjaGFuZ2VkLCB0aGUgcGF0aAogICAqICAgdGhhdCBjaGFuZ2VkIChvcHRpb25hbCkuCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAqLwogIGZ1bmN0aW9uIGRpc3BhdGNoTm90aWZ5RXZlbnQoaW5zdCwgZXZlbnROYW1lLCB2YWx1ZSwgcGF0aCkgewogICAgbGV0IGRldGFpbCA9IHsKICAgICAgdmFsdWU6IHZhbHVlLAogICAgICBxdWV1ZVByb3BlcnR5OiB0cnVlCiAgICB9OwogICAgaWYgKHBhdGgpIHsKICAgICAgZGV0YWlsLnBhdGggPSBwYXRoOwogICAgfQogICAgLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKGluc3QpLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBkZXRhaWwgfSkpOwogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgIm5vdGlmeSIgZWZmZWN0LgogICAqCiAgICogRGlzcGF0Y2hlcyBhIG5vbi1idWJibGluZyBldmVudCBuYW1lZCBgaW5mby5ldmVudE5hbWVgIG9uIHRoZSBpbnN0YW5jZQogICAqIHdpdGggYSBkZXRhaWwgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5ldyBgdmFsdWVgLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHs/fSBpbmZvIEVmZmVjdCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFzUGF0aHMgVHJ1ZSB3aXRoIGBwcm9wc2AgY29udGFpbnMgb25lIG9yIG1vcmUgcGF0aHMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuTm90aWZ5RWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8sIGhhc1BhdGhzKSB7CiAgICBsZXQgcm9vdFByb3BlcnR5ID0gaGFzUGF0aHMgPyBQb2x5bWVyLlBhdGgucm9vdChwcm9wZXJ0eSkgOiBwcm9wZXJ0eTsKICAgIGxldCBwYXRoID0gcm9vdFByb3BlcnR5ICE9IHByb3BlcnR5ID8gcHJvcGVydHkgOiBudWxsOwogICAgbGV0IHZhbHVlID0gcGF0aCA/IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGF0aCkgOiBpbnN0Ll9fZGF0YVtwcm9wZXJ0eV07CiAgICBpZiAocGF0aCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gcHJvcHNbcHJvcGVydHldOyAgLy8gc3BlY2lmaWNhbGx5IGZvciAuc3BsaWNlcwogICAgfQogICAgZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBpbmZvLmV2ZW50TmFtZSwgdmFsdWUsIHBhdGgpOwogIH0KCiAgLyoqCiAgICogSGFuZGxlciBmdW5jdGlvbiBmb3IgMi13YXkgbm90aWZpY2F0aW9uIGV2ZW50cy4gUmVjZWl2ZXMgY29udGV4dAogICAqIGluZm9ybWF0aW9uIGNhcHR1cmVkIGluIHRoZSBgYWRkTm90aWZ5TGlzdGVuZXJgIGNsb3N1cmUgZnJvbSB0aGUKICAgKiBgX19ub3RpZnlMaXN0ZW5lcnNgIG1ldGFkYXRhLgogICAqCiAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5vdGlmaWVkIHByb3BlcnR5IHRvIHRoZSBob3N0IHByb3BlcnR5IG9yIHBhdGguICBJZgogICAqIHRoZSBldmVudCBjb250YWluZWQgcGF0aCBpbmZvcm1hdGlvbiwgdHJhbnNsYXRlIHRoYXQgcGF0aCB0byB0aGUgaG9zdAogICAqIHNjb3BlJ3MgbmFtZSBmb3IgdGhhdCBwYXRoIGZpcnN0LgogICAqCiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZlbnQgTm90aWZpY2F0aW9uIGV2ZW50IChlLmcuICc8cHJvcGVydHk+LWNoYW5nZWQnKQogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSG9zdCBlbGVtZW50IGluc3RhbmNlIGhhbmRsaW5nIHRoZSBub3RpZmljYXRpb24gZXZlbnQKICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbVByb3AgQ2hpbGQgZWxlbWVudCBwcm9wZXJ0eSB0aGF0IHdhcyBib3VuZAogICAqIEBwYXJhbSB7c3RyaW5nfSB0b1BhdGggSG9zdCBwcm9wZXJ0eS9wYXRoIHRoYXQgd2FzIGJvdW5kCiAgICogQHBhcmFtIHtib29sZWFufSBuZWdhdGUgV2hldGhlciB0aGUgYmluZGluZyB3YXMgbmVnYXRlZAogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBoYW5kbGVOb3RpZmljYXRpb24oZXZlbnQsIGluc3QsIGZyb21Qcm9wLCB0b1BhdGgsIG5lZ2F0ZSkgewogICAgbGV0IHZhbHVlOwogICAgbGV0IGRldGFpbCA9IC8qKiBAdHlwZSB7T2JqZWN0fSAqLyhldmVudC5kZXRhaWwpOwogICAgbGV0IGZyb21QYXRoID0gZGV0YWlsICYmIGRldGFpbC5wYXRoOwogICAgaWYgKGZyb21QYXRoKSB7CiAgICAgIHRvUGF0aCA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUoZnJvbVByb3AsIHRvUGF0aCwgZnJvbVBhdGgpOwogICAgICB2YWx1ZSA9IGRldGFpbCAmJiBkZXRhaWwudmFsdWU7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZSA9IGV2ZW50LmN1cnJlbnRUYXJnZXRbZnJvbVByb3BdOwogICAgfQogICAgdmFsdWUgPSBuZWdhdGUgPyAhdmFsdWUgOiB2YWx1ZTsKICAgIGlmICghaW5zdFtUWVBFUy5SRUFEX09OTFldIHx8ICFpbnN0W1RZUEVTLlJFQURfT05MWV1bdG9QYXRoXSkgewogICAgICBpZiAoaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHRvUGF0aCwgdmFsdWUsIHRydWUsIEJvb2xlYW4oZnJvbVBhdGgpKQogICAgICAgICYmICghZGV0YWlsIHx8ICFkZXRhaWwucXVldWVQcm9wZXJ0eSkpIHsKICAgICAgICBpbnN0Ll9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAicmVmbGVjdCIgZWZmZWN0LgogICAqCiAgICogU2V0cyB0aGUgYXR0cmlidXRlIG5hbWVkIGBpbmZvLmF0dHJOYW1lYCB0byB0aGUgZ2l2ZW4gcHJvcGVydHkgdmFsdWUuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1blJlZmxlY3RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgbGV0IHZhbHVlID0gaW5zdC5fX2RhdGFbcHJvcGVydHldOwogICAgaWYgKFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSkgewogICAgICB2YWx1ZSA9IFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSh2YWx1ZSwgaW5mby5hdHRyTmFtZSwgJ2F0dHJpYnV0ZScsIC8qKiBAdHlwZSB7Tm9kZX0gKi8oaW5zdCkpOwogICAgfQogICAgaW5zdC5fcHJvcGVydHlUb0F0dHJpYnV0ZShwcm9wZXJ0eSwgaW5mby5hdHRyTmFtZSwgdmFsdWUpOwogIH0KCiAgLyoqCiAgICogUnVucyAiY29tcHV0ZWQiIGVmZmVjdHMgZm9yIGEgc2V0IG9mIGNoYW5nZWQgcHJvcGVydGllcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSB0aGUgZ2VuZXJpYyBgcnVuRWZmZWN0c2AgbWV0aG9kIGluIHRoYXQgaXQKICAgKiBjb250aW51ZXMgdG8gcnVuIGNvbXB1dGVkIGVmZmVjdHMgYmFzZWQgb24gdGhlIG91dHB1dCBvZiBlYWNoIHBhc3MgdW50aWwKICAgKiB0aGVyZSBhcmUgbm8gbW9yZSBuZXdseSBjb21wdXRlZCBwcm9wZXJ0aWVzLiAgVGhpcyBlbnN1cmVzIHRoYXQgYWxsCiAgICogcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgY29tcHV0ZWQgYnkgdGhlIGluaXRpYWwgc2V0IG9mIGNoYW5nZXMgYXJlCiAgICogY29tcHV0ZWQgYmVmb3JlIG90aGVyIGVmZmVjdHMgKGJpbmRpbmcgcHJvcGFnYXRpb24sIG9ic2VydmVycywgYW5kIG5vdGlmeSkKICAgKiBydW4uCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHshT2JqZWN0fSBjaGFuZ2VkUHJvcHMgQmFnIG9mIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7IU9iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Db21wdXRlZEVmZmVjdHMoaW5zdCwgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgIGxldCBjb21wdXRlRWZmZWN0cyA9IGluc3RbVFlQRVMuQ09NUFVURV07CiAgICBpZiAoY29tcHV0ZUVmZmVjdHMpIHsKICAgICAgbGV0IGlucHV0UHJvcHMgPSBjaGFuZ2VkUHJvcHM7CiAgICAgIHdoaWxlIChydW5FZmZlY3RzKGluc3QsIGNvbXB1dGVFZmZlY3RzLCBpbnB1dFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpKSB7CiAgICAgICAgT2JqZWN0LmFzc2lnbihvbGRQcm9wcywgaW5zdC5fX2RhdGFPbGQpOwogICAgICAgIE9iamVjdC5hc3NpZ24oY2hhbmdlZFByb3BzLCBpbnN0Ll9fZGF0YVBlbmRpbmcpOwogICAgICAgIGlucHV0UHJvcHMgPSBpbnN0Ll9fZGF0YVBlbmRpbmc7CiAgICAgICAgaW5zdC5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgImNvbXB1dGVkIHByb3BlcnR5IiBlZmZlY3QgYnkgcnVubmluZyB0aGUgbWV0aG9kIHdpdGggdGhlCiAgICogdmFsdWVzIG9mIHRoZSBhcmd1bWVudHMgc3BlY2lmaWVkIGluIHRoZSBgaW5mb2Agb2JqZWN0IGFuZCBzZXR0aW5nIHRoZQogICAqIHJldHVybiB2YWx1ZSB0byB0aGUgY29tcHV0ZWQgcHJvcGVydHkgc3BlY2lmaWVkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHs/fSBpbmZvIEVmZmVjdCBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Db21wdXRlZEVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvKSB7CiAgICBsZXQgcmVzdWx0ID0gcnVuTWV0aG9kRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pOwogICAgbGV0IGNvbXB1dGVkUHJvcCA9IGluZm8ubWV0aG9kSW5mbzsKICAgIGlmIChpbnN0Ll9fZGF0YUhhc0FjY2Vzc29yICYmIGluc3QuX19kYXRhSGFzQWNjZXNzb3JbY29tcHV0ZWRQcm9wXSkgewogICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkoY29tcHV0ZWRQcm9wLCByZXN1bHQsIHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgaW5zdFtjb21wdXRlZFByb3BdID0gcmVzdWx0OwogICAgfQogIH0KCiAgLyoqCiAgICogQ29tcHV0ZXMgcGF0aCBjaGFuZ2VzIGJhc2VkIG9uIHBhdGggbGlua3Mgc2V0IHVwIHVzaW5nIHRoZSBgbGlua1BhdGhzYAogICAqIEFQSS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHdob3NlIHByb3BzIGFyZSBjaGFuZ2luZwogICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PChzdHJpbmd8bnVtYmVyKT59IHBhdGggUGF0aCB0aGF0IGhhcyBjaGFuZ2VkCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSBvZiBjaGFuZ2VkIHBhdGgKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gY29tcHV0ZUxpbmtlZFBhdGhzKGluc3QsIHBhdGgsIHZhbHVlKSB7CiAgICBsZXQgbGlua3MgPSBpbnN0Ll9fZGF0YUxpbmtlZFBhdGhzOwogICAgaWYgKGxpbmtzKSB7CiAgICAgIGxldCBsaW5rOwogICAgICBmb3IgKGxldCBhIGluIGxpbmtzKSB7CiAgICAgICAgbGV0IGIgPSBsaW5rc1thXTsKICAgICAgICBpZiAoUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudChhLCBwYXRoKSkgewogICAgICAgICAgbGluayA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUoYSwgYiwgcGF0aCk7CiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgobGluaywgdmFsdWUsIHRydWUsIHRydWUpOwogICAgICAgIH0gZWxzZSBpZiAoUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudChiLCBwYXRoKSkgewogICAgICAgICAgbGluayA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUoYiwgYSwgcGF0aCk7CiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgobGluaywgdmFsdWUsIHRydWUsIHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8gLS0gYmluZGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBBZGRzIGJpbmRpbmcgbWV0YWRhdGEgdG8gdGhlIGN1cnJlbnQgYG5vZGVJbmZvYCwgYW5kIGJpbmRpbmcgZWZmZWN0cwogICAqIGZvciBhbGwgcGFydCBkZXBlbmRlbmNpZXMgdG8gYHRlbXBsYXRlSW5mb2AuCiAgICoKICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvciBDbGFzcyB0aGF0IGBfcGFyc2VUZW1wbGF0ZWAgaXMgY3VycmVudGx5CiAgICogICBydW5uaW5nIG9uCiAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kIEJpbmRpbmcga2luZCwgZWl0aGVyICdwcm9wZXJ0eScsICdhdHRyaWJ1dGUnLCBvciAndGV4dCcKICAgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IFRhcmdldCBwcm9wZXJ0eSBuYW1lCiAgICogQHBhcmFtIHshQXJyYXk8IUJpbmRpbmdQYXJ0Pn0gcGFydHMgQXJyYXkgb2YgYmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtzdHJpbmc9fSBsaXRlcmFsIExpdGVyYWwgdGV4dCBzdXJyb3VuZGluZyBiaW5kaW5nIHBhcnRzIChzcGVjaWZpZWQKICAgKiAgIG9ubHkgZm9yICdwcm9wZXJ0eScgYmluZGluZ3MsIHNpbmNlIHRoZXNlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYXMgcGFydAogICAqICAgb2YgYm9vdC11cCkKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gYWRkQmluZGluZyhjb25zdHJ1Y3RvciwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywga2luZCwgdGFyZ2V0LCBwYXJ0cywgbGl0ZXJhbCkgewogICAgLy8gQ3JlYXRlIGJpbmRpbmcgbWV0YWRhdGEgYW5kIGFkZCB0byBub2RlSW5mbwogICAgbm9kZUluZm8uYmluZGluZ3MgPSBub2RlSW5mby5iaW5kaW5ncyB8fCBbXTsKICAgIGxldCAvKiogQmluZGluZyAqLyBiaW5kaW5nID0geyBraW5kLCB0YXJnZXQsIHBhcnRzLCBsaXRlcmFsLCBpc0NvbXBvdW5kOiAocGFydHMubGVuZ3RoICE9PSAxKSB9OwogICAgbm9kZUluZm8uYmluZGluZ3MucHVzaChiaW5kaW5nKTsKICAgIC8vIEFkZCBsaXN0ZW5lciBpbmZvIHRvIGJpbmRpbmcgbWV0YWRhdGEKICAgIGlmIChzaG91bGRBZGRMaXN0ZW5lcihiaW5kaW5nKSkgewogICAgICBsZXQge2V2ZW50LCBuZWdhdGV9ID0gYmluZGluZy5wYXJ0c1swXTsKICAgICAgYmluZGluZy5saXN0ZW5lckV2ZW50ID0gZXZlbnQgfHwgKENhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHRhcmdldCkgKyAnLWNoYW5nZWQnKTsKICAgICAgYmluZGluZy5saXN0ZW5lck5lZ2F0ZSA9IG5lZ2F0ZTsKICAgIH0KICAgIC8vIEFkZCAicHJvcGFnYXRlIiBwcm9wZXJ0eSBlZmZlY3RzIHRvIHRlbXBsYXRlSW5mbwogICAgbGV0IGluZGV4ID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdC5sZW5ndGg7CiAgICBmb3IgKGxldCBpPTA7IGk8YmluZGluZy5wYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICBsZXQgcGFydCA9IGJpbmRpbmcucGFydHNbaV07CiAgICAgIHBhcnQuY29tcG91bmRJbmRleCA9IGk7CiAgICAgIGFkZEVmZmVjdEZvckJpbmRpbmdQYXJ0KGNvbnN0cnVjdG9yLCB0ZW1wbGF0ZUluZm8sIGJpbmRpbmcsIHBhcnQsIGluZGV4KTsKICAgIH0KICB9CgogIC8qKgogICAqIEFkZHMgcHJvcGVydHkgZWZmZWN0cyB0byB0aGUgZ2l2ZW4gYHRlbXBsYXRlSW5mb2AgZm9yIHRoZSBnaXZlbiBiaW5kaW5nCiAgICogcGFydC4KICAgKgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIENsYXNzIHRoYXQgYF9wYXJzZVRlbXBsYXRlYCBpcyBjdXJyZW50bHkKICAgKiAgIHJ1bm5pbmcgb24KICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICogQHBhcmFtIHshQmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHBhcmFtIHshQmluZGluZ1BhcnR9IHBhcnQgQmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IGludG8gYG5vZGVJbmZvTGlzdGAgZm9yIHRoaXMgbm9kZQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgZnVuY3Rpb24gYWRkRWZmZWN0Rm9yQmluZGluZ1BhcnQoY29uc3RydWN0b3IsIHRlbXBsYXRlSW5mbywgYmluZGluZywgcGFydCwgaW5kZXgpIHsKICAgIGlmICghcGFydC5saXRlcmFsKSB7CiAgICAgIGlmIChiaW5kaW5nLmtpbmQgPT09ICdhdHRyaWJ1dGUnICYmIGJpbmRpbmcudGFyZ2V0WzBdID09PSAnLScpIHsKICAgICAgICBjb25zb2xlLndhcm4oJ0Nhbm5vdCBzZXQgYXR0cmlidXRlICcgKyBiaW5kaW5nLnRhcmdldCArCiAgICAgICAgICAnIGJlY2F1c2UgIi0iIGlzIG5vdCBhIHZhbGlkIGF0dHJpYnV0ZSBzdGFydGluZyBjaGFyYWN0ZXInKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgZGVwZW5kZW5jaWVzID0gcGFydC5kZXBlbmRlbmNpZXM7CiAgICAgICAgbGV0IGluZm8gPSB7IGluZGV4LCBiaW5kaW5nLCBwYXJ0LCBldmFsdWF0b3I6IGNvbnN0cnVjdG9yIH07CiAgICAgICAgZm9yIChsZXQgaj0wOyBqPGRlcGVuZGVuY2llcy5sZW5ndGg7IGorKykgewogICAgICAgICAgbGV0IHRyaWdnZXIgPSBkZXBlbmRlbmNpZXNbal07CiAgICAgICAgICBpZiAodHlwZW9mIHRyaWdnZXIgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgdHJpZ2dlciA9IHBhcnNlQXJnKHRyaWdnZXIpOwogICAgICAgICAgICB0cmlnZ2VyLndpbGRjYXJkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0cnVjdG9yLl9hZGRUZW1wbGF0ZVByb3BlcnR5RWZmZWN0KHRlbXBsYXRlSW5mbywgdHJpZ2dlci5yb290UHJvcGVydHksIHsKICAgICAgICAgICAgZm46IHJ1bkJpbmRpbmdFZmZlY3QsCiAgICAgICAgICAgIGluZm8sIHRyaWdnZXIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgImJpbmRpbmciIChwcm9wZXJ0eS9wYXRoIGJpbmRpbmcpIGVmZmVjdC4KICAgKgogICAqIE5vdGUgdGhhdCBiaW5kaW5nIHN5bnRheCBpcyBvdmVycmlkYWJsZSB2aWEgYF9wYXJzZUJpbmRpbmdzYCBhbmQKICAgKiBgX2V2YWx1YXRlQmluZGluZ2AuICBUaGlzIG1ldGhvZCB3aWxsIGNhbGwgYF9ldmFsdWF0ZUJpbmRpbmdgIGZvciBhbnkKICAgKiBub24tbGl0ZXJhbCBwYXJ0cyByZXR1cm5lZCBmcm9tIGBfcGFyc2VCaW5kaW5nc2AuICBIb3dldmVyLAogICAqIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIF9wYXRoXyBiaW5kaW5ncyB2aWEgY3VzdG9tIGJpbmRpbmcgcGFydHMsCiAgICogYXMgdGhpcyBpcyBzcGVjaWZpYyB0byBQb2x5bWVyJ3MgcGF0aCBiaW5kaW5nIHN5bnRheC4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBOYW1lIG9mIHByb3BlcnR5CiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHs/fSBpbmZvIEVmZmVjdCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFzUGF0aHMgVHJ1ZSB3aXRoIGBwcm9wc2AgY29udGFpbnMgb25lIG9yIG1vcmUgcGF0aHMKICAgKiBAcGFyYW0ge0FycmF5fSBub2RlTGlzdCBMaXN0IG9mIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCBgbm9kZUluZm9MaXN0YCB0ZW1wbGF0ZQogICAqICAgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuQmluZGluZ0VmZmVjdChpbnN0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGluZm8sIGhhc1BhdGhzLCBub2RlTGlzdCkgewogICAgbGV0IG5vZGUgPSBub2RlTGlzdFtpbmZvLmluZGV4XTsKICAgIGxldCBiaW5kaW5nID0gaW5mby5iaW5kaW5nOwogICAgbGV0IHBhcnQgPSBpbmZvLnBhcnQ7CiAgICAvLyBTdWJwYXRoIG5vdGlmaWNhdGlvbjogdHJhbnNmb3JtIHBhdGggYW5kIHNldCB0byBjbGllbnQKICAgIC8vIGUuZy46IGZvbz0ie3tvYmouc3VifX0iLCBwYXRoOiAnb2JqLnN1Yi5wcm9wJywgc2V0ICdmb28ucHJvcCc9b2JqLnN1Yi5wcm9wCiAgICBpZiAoaGFzUGF0aHMgJiYgcGFydC5zb3VyY2UgJiYgKHBhdGgubGVuZ3RoID4gcGFydC5zb3VyY2UubGVuZ3RoKSAmJgogICAgICAgIChiaW5kaW5nLmtpbmQgPT0gJ3Byb3BlcnR5JykgJiYgIWJpbmRpbmcuaXNDb21wb3VuZCAmJgogICAgICAgIG5vZGUuX19pc1Byb3BlcnR5RWZmZWN0c0NsaWVudCAmJgogICAgICAgIG5vZGUuX19kYXRhSGFzQWNjZXNzb3IgJiYgbm9kZS5fX2RhdGFIYXNBY2Nlc3NvcltiaW5kaW5nLnRhcmdldF0pIHsKICAgICAgbGV0IHZhbHVlID0gcHJvcHNbcGF0aF07CiAgICAgIHBhdGggPSBQb2x5bWVyLlBhdGgudHJhbnNsYXRlKHBhcnQuc291cmNlLCBiaW5kaW5nLnRhcmdldCwgcGF0aCk7CiAgICAgIGlmIChub2RlLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocGF0aCwgdmFsdWUsIGZhbHNlLCB0cnVlKSkgewogICAgICAgIGluc3QuX2VucXVldWVDbGllbnQobm9kZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCB2YWx1ZSA9IGluZm8uZXZhbHVhdG9yLl9ldmFsdWF0ZUJpbmRpbmcoaW5zdCwgcGFydCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgIC8vIFByb3BhZ2F0ZSB2YWx1ZSB0byBjaGlsZAogICAgICBhcHBseUJpbmRpbmdWYWx1ZShpbnN0LCBub2RlLCBiaW5kaW5nLCBwYXJ0LCB2YWx1ZSk7CiAgICB9CiAgfQoKICAvKioKICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYW4gImJpbmRpbmciIChiaW5kaW5nKSBlZmZlY3QgdG8gYSBub2RlLAogICAqIGVpdGhlciBhcyBhIHByb3BlcnR5IG9yIGF0dHJpYnV0ZS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIG93bmluZyB0aGUgYmluZGluZyBlZmZlY3QKICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgVGFyZ2V0IG5vZGUgZm9yIGJpbmRpbmcKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhcHBseUJpbmRpbmdWYWx1ZShpbnN0LCBub2RlLCBiaW5kaW5nLCBwYXJ0LCB2YWx1ZSkgewogICAgdmFsdWUgPSBjb21wdXRlQmluZGluZ1ZhbHVlKG5vZGUsIHZhbHVlLCBiaW5kaW5nLCBwYXJ0KTsKICAgIGlmIChQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUpIHsKICAgICAgdmFsdWUgPSBQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUodmFsdWUsIGJpbmRpbmcudGFyZ2V0LCBiaW5kaW5nLmtpbmQsIG5vZGUpOwogICAgfQogICAgaWYgKGJpbmRpbmcua2luZCA9PSAnYXR0cmlidXRlJykgewogICAgICAvLyBBdHRyaWJ1dGUgYmluZGluZwogICAgICBpbnN0Ll92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUge0VsZW1lbnR9ICovKG5vZGUpLCB2YWx1ZSwgYmluZGluZy50YXJnZXQpOwogICAgfSBlbHNlIHsKICAgICAgLy8gUHJvcGVydHkgYmluZGluZwogICAgICBsZXQgcHJvcCA9IGJpbmRpbmcudGFyZ2V0OwogICAgICBpZiAobm9kZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ICYmCiAgICAgICAgICBub2RlLl9fZGF0YUhhc0FjY2Vzc29yICYmIG5vZGUuX19kYXRhSGFzQWNjZXNzb3JbcHJvcF0pIHsKICAgICAgICBpZiAoIW5vZGVbVFlQRVMuUkVBRF9PTkxZXSB8fCAhbm9kZVtUWVBFUy5SRUFEX09OTFldW3Byb3BdKSB7CiAgICAgICAgICBpZiAobm9kZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3AsIHZhbHVlKSkgewogICAgICAgICAgICBpbnN0Ll9lbnF1ZXVlQ2xpZW50KG5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlICB7CiAgICAgICAgaW5zdC5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBUcmFuc2Zvcm1zIGFuICJiaW5kaW5nIiBlZmZlY3QgdmFsdWUgYmFzZWQgb24gY29tcG91bmQgJiBuZWdhdGlvbgogICAqIGVmZmVjdCBtZXRhZGF0YSwgYXMgd2VsbCBhcyBoYW5kbGluZyBmb3Igc3BlY2lhbC1jYXNlIHByb3BlcnRpZXMKICAgKgogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRoZSB2YWx1ZSB3aWxsIGJlIHNldCB0bwogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICogQHBhcmFtIHshQmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHBhcmFtIHshQmluZGluZ1BhcnR9IHBhcnQgQmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICogQHJldHVybiB7Kn0gVHJhbnNmb3JtZWQgdmFsdWUgdG8gc2V0CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBjb21wdXRlQmluZGluZ1ZhbHVlKG5vZGUsIHZhbHVlLCBiaW5kaW5nLCBwYXJ0KSB7CiAgICBpZiAoYmluZGluZy5pc0NvbXBvdW5kKSB7CiAgICAgIGxldCBzdG9yYWdlID0gbm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2VbYmluZGluZy50YXJnZXRdOwogICAgICBzdG9yYWdlW3BhcnQuY29tcG91bmRJbmRleF0gPSB2YWx1ZTsKICAgICAgdmFsdWUgPSBzdG9yYWdlLmpvaW4oJycpOwogICAgfQogICAgaWYgKGJpbmRpbmcua2luZCAhPT0gJ2F0dHJpYnV0ZScpIHsKICAgICAgLy8gU29tZSBicm93c2VycyBzZXJpYWxpemUgYHVuZGVmaW5lZGAgdG8gYCJ1bmRlZmluZWQiYAogICAgICBpZiAoYmluZGluZy50YXJnZXQgPT09ICd0ZXh0Q29udGVudCcgfHwKICAgICAgICAgIChiaW5kaW5nLnRhcmdldCA9PT0gJ3ZhbHVlJyAmJgogICAgICAgICAgICAobm9kZS5sb2NhbE5hbWUgPT09ICdpbnB1dCcgfHwgbm9kZS5sb2NhbE5hbWUgPT09ICd0ZXh0YXJlYScpKSkgewogICAgICAgIHZhbHVlID0gdmFsdWUgPT0gdW5kZWZpbmVkID8gJycgOiB2YWx1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIGEgYmluZGluZydzIG1ldGFkYXRhIG1lZXRzIGFsbCB0aGUgcmVxdWlyZW1lbnRzIHRvIGFsbG93CiAgICogMi13YXkgYmluZGluZywgYW5kIHRoZXJlZm9yZSBhIGA8cHJvcGVydHk+LWNoYW5nZWRgIGV2ZW50IGxpc3RlbmVyIHNob3VsZCBiZQogICAqIGFkZGVkOgogICAqIC0gdXNlZCBjdXJseSBicmFjZXMKICAgKiAtIGlzIGEgcHJvcGVydHkgKG5vdCBhdHRyaWJ1dGUpIGJpbmRpbmcKICAgKiAtIGlzIG5vdCBhIHRleHRDb250ZW50IGJpbmRpbmcKICAgKiAtIGlzIG5vdCBjb21wb3VuZAogICAqCiAgICogQHBhcmFtIHshQmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiAyLXdheSBsaXN0ZW5lciBzaG91bGQgYmUgYWRkZWQKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNob3VsZEFkZExpc3RlbmVyKGJpbmRpbmcpIHsKICAgIHJldHVybiBCb29sZWFuKGJpbmRpbmcudGFyZ2V0KSAmJgogICAgICAgICAgIGJpbmRpbmcua2luZCAhPSAnYXR0cmlidXRlJyAmJgogICAgICAgICAgIGJpbmRpbmcua2luZCAhPSAndGV4dCcgJiYKICAgICAgICAgICAhYmluZGluZy5pc0NvbXBvdW5kICYmCiAgICAgICAgICAgYmluZGluZy5wYXJ0c1swXS5tb2RlID09PSAneyc7CiAgfQoKICAvKioKICAgKiBTZXR1cCBjb21wb3VuZCBiaW5kaW5nIHN0b3JhZ2Ugc3RydWN0dXJlcywgbm90aWZ5IGxpc3RlbmVycywgYW5kIGRhdGFIb3N0CiAgICogcmVmZXJlbmNlcyBvbnRvIHRoZSBib3VuZCBub2RlTGlzdC4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdGhhdCBiYXMgYmVlbiBwcmV2aW91c2x5IGJvdW5kCiAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBzZXR1cEJpbmRpbmdzKGluc3QsIHRlbXBsYXRlSW5mbykgewogICAgLy8gU2V0dXAgY29tcG91bmQgc3RvcmFnZSwgZGF0YUhvc3QsIGFuZCBub3RpZnkgbGlzdGVuZXJzCiAgICBsZXQge25vZGVMaXN0LCBub2RlSW5mb0xpc3R9ID0gdGVtcGxhdGVJbmZvOwogICAgaWYgKG5vZGVJbmZvTGlzdC5sZW5ndGgpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUluZm9MaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IGluZm8gPSBub2RlSW5mb0xpc3RbaV07CiAgICAgICAgbGV0IG5vZGUgPSBub2RlTGlzdFtpXTsKICAgICAgICBsZXQgYmluZGluZ3MgPSBpbmZvLmJpbmRpbmdzOwogICAgICAgIGlmIChiaW5kaW5ncykgewogICAgICAgICAgZm9yIChsZXQgaT0wOyBpPGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCBiaW5kaW5nID0gYmluZGluZ3NbaV07CiAgICAgICAgICAgIHNldHVwQ29tcG91bmRTdG9yYWdlKG5vZGUsIGJpbmRpbmcpOwogICAgICAgICAgICBhZGROb3RpZnlMaXN0ZW5lcihub2RlLCBpbnN0LCBiaW5kaW5nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbm9kZS5fX2RhdGFIb3N0ID0gaW5zdDsKICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogSW5pdGlhbGl6ZXMgYF9fZGF0YUNvbXBvdW5kU3RvcmFnZWAgbG9jYWwgc3RvcmFnZSBvbiBhIGJvdW5kIG5vZGUgd2l0aAogICAqIGluaXRpYWwgbGl0ZXJhbCBkYXRhIGZvciBjb21wb3VuZCBiaW5kaW5ncywgYW5kIHNldHMgdGhlIGpvaW5lZAogICAqIGxpdGVyYWwgcGFydHMgdG8gdGhlIGJvdW5kIHByb3BlcnR5LgogICAqCiAgICogV2hlbiBjaGFuZ2VzIHRvIGNvbXBvdW5kIHBhcnRzIG9jY3VyLCB0aGV5IGFyZSBmaXJzdCBzZXQgaW50byB0aGUgY29tcG91bmQKICAgKiBzdG9yYWdlIGFycmF5IGZvciB0aGF0IHByb3BlcnR5LCBhbmQgdGhlbiB0aGUgYXJyYXkgaXMgam9pbmVkIHRvIHJlc3VsdCBpbgogICAqIHRoZSBmaW5hbCB2YWx1ZSBzZXQgdG8gdGhlIHByb3BlcnR5L2F0dHJpYnV0ZS4KICAgKgogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBCb3VuZCBub2RlIHRvIGluaXRpYWxpemUKICAgKiBAcGFyYW0ge0JpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBzZXR1cENvbXBvdW5kU3RvcmFnZShub2RlLCBiaW5kaW5nKSB7CiAgICBpZiAoYmluZGluZy5pc0NvbXBvdW5kKSB7CiAgICAgIC8vIENyZWF0ZSBjb21wb3VuZCBzdG9yYWdlIG1hcAogICAgICBsZXQgc3RvcmFnZSA9IG5vZGUuX19kYXRhQ29tcG91bmRTdG9yYWdlIHx8CiAgICAgICAgKG5vZGUuX19kYXRhQ29tcG91bmRTdG9yYWdlID0ge30pOwogICAgICBsZXQgcGFydHMgPSBiaW5kaW5nLnBhcnRzOwogICAgICAvLyBDb3B5IGxpdGVyYWxzIGZyb20gcGFydHMgaW50byBzdG9yYWdlIGZvciB0aGlzIGJpbmRpbmcKICAgICAgbGV0IGxpdGVyYWxzID0gbmV3IEFycmF5KHBhcnRzLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGo9MDsgajxwYXJ0cy5sZW5ndGg7IGorKykgewogICAgICAgIGxpdGVyYWxzW2pdID0gcGFydHNbal0ubGl0ZXJhbDsKICAgICAgfQogICAgICBsZXQgdGFyZ2V0ID0gYmluZGluZy50YXJnZXQ7CiAgICAgIHN0b3JhZ2VbdGFyZ2V0XSA9IGxpdGVyYWxzOwogICAgICAvLyBDb25maWd1cmUgcHJvcGVydGllcyB3aXRoIHRoZWlyIGxpdGVyYWwgcGFydHMKICAgICAgaWYgKGJpbmRpbmcubGl0ZXJhbCAmJiBiaW5kaW5nLmtpbmQgPT0gJ3Byb3BlcnR5JykgewogICAgICAgIG5vZGVbdGFyZ2V0XSA9IGJpbmRpbmcubGl0ZXJhbDsKICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogQWRkcyBhIDItd2F5IGJpbmRpbmcgbm90aWZpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIHNwZWNpZmllZAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG5vZGUgQ2hpbGQgZWxlbWVudCB0byBhZGQgbGlzdGVuZXIgdG8KICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IEhvc3QgZWxlbWVudCBpbnN0YW5jZSB0byBoYW5kbGUgbm90aWZpY2F0aW9uIGV2ZW50CiAgICogQHBhcmFtIHtCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gYWRkTm90aWZ5TGlzdGVuZXIobm9kZSwgaW5zdCwgYmluZGluZykgewogICAgaWYgKGJpbmRpbmcubGlzdGVuZXJFdmVudCkgewogICAgICBsZXQgcGFydCA9IGJpbmRpbmcucGFydHNbMF07CiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihiaW5kaW5nLmxpc3RlbmVyRXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICBoYW5kbGVOb3RpZmljYXRpb24oZSwgaW5zdCwgYmluZGluZy50YXJnZXQsIHBhcnQuc291cmNlLCBwYXJ0Lm5lZ2F0ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gLS0gZm9yIG1ldGhvZC1iYXNlZCBlZmZlY3RzIChjb21wbGV4T2JzZXJ2ZXIgJiBjb21wdXRlZCkgLS0tLS0tLS0tLS0tLS0KCiAgLyoqCiAgICogQWRkcyBwcm9wZXJ0eSBlZmZlY3RzIGZvciBlYWNoIGFyZ3VtZW50IGluIHRoZSBtZXRob2Qgc2lnbmF0dXJlIChhbmQKICAgKiBvcHRpb25hbGx5LCBmb3IgdGhlIG1ldGhvZCBuYW1lIGlmIGBkeW5hbWljYCBpcyB0cnVlKSB0aGF0IGNhbGxzIHRoZQogICAqIHByb3ZpZGVkIGVmZmVjdCBmdW5jdGlvbi4KICAgKgogICAqIEBwYXJhbSB7RWxlbWVudCB8IE9iamVjdH0gbW9kZWwgUHJvdG90eXBlIG9yIGluc3RhbmNlCiAgICogQHBhcmFtIHshTWV0aG9kU2lnbmF0dXJlfSBzaWcgTWV0aG9kIHNpZ25hdHVyZSBtZXRhZGF0YQogICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFR5cGUgb2YgcHJvcGVydHkgZWZmZWN0IHRvIGFkZAogICAqIEBwYXJhbSB7RnVuY3Rpb259IGVmZmVjdEZuIEZ1bmN0aW9uIHRvIHJ1biB3aGVuIGFyZ3VtZW50cyBjaGFuZ2UKICAgKiBAcGFyYW0geyo9fSBtZXRob2RJbmZvIEVmZmVjdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBiZSBpbmNsdWRlZCBpbgogICAqICAgbWV0aG9kIGVmZmVjdCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3Q9fSBkeW5hbWljRm4gQm9vbGVhbiBvciBvYmplY3QgbWFwIGluZGljYXRpbmcgd2hldGhlcgogICAqICAgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4gTm90ZSwKICAgKiAgIGRlZmF1bHRzIHRvIHRydWUgaWYgdGhlIHNpZ25hdHVyZSBpcyBzdGF0aWMgKHNpZy5zdGF0aWMgaXMgdHJ1ZSkuCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGNyZWF0ZU1ldGhvZEVmZmVjdChtb2RlbCwgc2lnLCB0eXBlLCBlZmZlY3RGbiwgbWV0aG9kSW5mbywgZHluYW1pY0ZuKSB7CiAgICBkeW5hbWljRm4gPSBzaWcuc3RhdGljIHx8IChkeW5hbWljRm4gJiYKICAgICAgKHR5cGVvZiBkeW5hbWljRm4gIT09ICdvYmplY3QnIHx8IGR5bmFtaWNGbltzaWcubWV0aG9kTmFtZV0pKTsKICAgIGxldCBpbmZvID0gewogICAgICBtZXRob2ROYW1lOiBzaWcubWV0aG9kTmFtZSwKICAgICAgYXJnczogc2lnLmFyZ3MsCiAgICAgIG1ldGhvZEluZm8sCiAgICAgIGR5bmFtaWNGbgogICAgfTsKICAgIGZvciAobGV0IGk9MCwgYXJnOyAoaTxzaWcuYXJncy5sZW5ndGgpICYmIChhcmc9c2lnLmFyZ3NbaV0pOyBpKyspIHsKICAgICAgaWYgKCFhcmcubGl0ZXJhbCkgewogICAgICAgIG1vZGVsLl9hZGRQcm9wZXJ0eUVmZmVjdChhcmcucm9vdFByb3BlcnR5LCB0eXBlLCB7CiAgICAgICAgICBmbjogZWZmZWN0Rm4sIGluZm86IGluZm8sIHRyaWdnZXI6IGFyZwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBpZiAoZHluYW1pY0ZuKSB7CiAgICAgIG1vZGVsLl9hZGRQcm9wZXJ0eUVmZmVjdChzaWcubWV0aG9kTmFtZSwgdHlwZSwgewogICAgICAgIGZuOiBlZmZlY3RGbiwgaW5mbzogaW5mbwogICAgICB9KTsKICAgIH0KICB9CgogIC8qKgogICAqIENhbGxzIGEgbWV0aG9kIHdpdGggYXJndW1lbnRzIG1hcnNoYWxlZCBmcm9tIHByb3BlcnRpZXMgb24gdGhlIGluc3RhbmNlCiAgICogYmFzZWQgb24gdGhlIG1ldGhvZCBzaWduYXR1cmUgY29udGFpbmVkIGluIHRoZSBlZmZlY3QgbWV0YWRhdGEuCiAgICoKICAgKiBNdWx0aS1wcm9wZXJ0eSBvYnNlcnZlcnMsIGNvbXB1dGVkIHByb3BlcnRpZXMsIGFuZCBpbmxpbmUgY29tcHV0aW5nCiAgICogZnVuY3Rpb25zIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBpbnZva2UgdGhlIG1ldGhvZCwgdGhlbiB1c2UgdGhlIHJldHVybgogICAqIHZhbHVlIGFjY29yZGluZ2x5LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHs/fSBpbmZvIEVmZmVjdCBtZXRhZGF0YQogICAqIEByZXR1cm4geyp9IFJldHVybnMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBtZXRob2QgaW52b2NhdGlvbgogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuTWV0aG9kRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgIC8vIEluc3RhbmNlcyBjYW4gb3B0aW9uYWxseSBoYXZlIGEgX21ldGhvZEhvc3Qgd2hpY2ggYWxsb3dzIHJlZGlyZWN0aW5nIHdoZXJlCiAgICAvLyB0byBmaW5kIG1ldGhvZHMuIEN1cnJlbnRseSB1c2VkIGJ5IGB0ZW1wbGF0aXplYC4KICAgIGxldCBjb250ZXh0ID0gaW5zdC5fbWV0aG9kSG9zdCB8fCBpbnN0OwogICAgbGV0IGZuID0gY29udGV4dFtpbmZvLm1ldGhvZE5hbWVdOwogICAgaWYgKGZuKSB7CiAgICAgIGxldCBhcmdzID0gaW5zdC5fbWFyc2hhbEFyZ3MoaW5mby5hcmdzLCBwcm9wZXJ0eSwgcHJvcHMpOwogICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJncyk7CiAgICB9IGVsc2UgaWYgKCFpbmZvLmR5bmFtaWNGbikgewogICAgICBjb25zb2xlLndhcm4oJ21ldGhvZCBgJyArIGluZm8ubWV0aG9kTmFtZSArICdgIG5vdCBkZWZpbmVkJyk7CiAgICB9CiAgfQoKICBjb25zdCBlbXB0eUFycmF5ID0gW107CgogIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlZCBmb3IgYmluZGluZwogIGNvbnN0IElERU5UICA9ICcoPzonICsgJ1thLXpBLVpfJF1bXFx3LjokXFwtKl0qJyArICcpJzsKICBjb25zdCBOVU1CRVIgPSAnKD86JyArICdbLStdP1swLTldKlxcLj9bMC05XSsoPzpbZUVdWy0rXT9bMC05XSspPycgKyAnKSc7CiAgY29uc3QgU1FVT1RFX1NUUklORyA9ICcoPzonICsgJ1wnKD86W15cJ1xcXFxdfFxcXFwuKSpcJycgKyAnKSc7CiAgY29uc3QgRFFVT1RFX1NUUklORyA9ICcoPzonICsgJyIoPzpbXiJcXFxcXXxcXFxcLikqIicgKyAnKSc7CiAgY29uc3QgU1RSSU5HID0gJyg/OicgKyBTUVVPVEVfU1RSSU5HICsgJ3wnICsgRFFVT1RFX1NUUklORyArICcpJzsKICBjb25zdCBBUkdVTUVOVCA9ICcoPzooJyArIElERU5UICsgJ3wnICsgTlVNQkVSICsgJ3wnICsgIFNUUklORyArICcpXFxzKicgKyAnKSc7CiAgY29uc3QgQVJHVU1FTlRTID0gJyg/OicgKyBBUkdVTUVOVCArICcoPzosXFxzKicgKyBBUkdVTUVOVCArICcpKicgKyAnKSc7CiAgY29uc3QgQVJHVU1FTlRfTElTVCA9ICcoPzonICsgJ1xcKFxccyonICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKD86JyArIEFSR1VNRU5UUyArICc/JyArICcpJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXClcXHMqJyArICcpJzsKICBjb25zdCBCSU5ESU5HID0gJygnICsgSURFTlQgKyAnXFxzKicgKyBBUkdVTUVOVF9MSVNUICsgJz8nICsgJyknOyAvLyBHcm91cCAzCiAgY29uc3QgT1BFTl9CUkFDS0VUID0gJyhcXFtcXFt8e3spJyArICdcXHMqJzsKICBjb25zdCBDTE9TRV9CUkFDS0VUID0gJyg/Ol1dfH19KSc7CiAgY29uc3QgTkVHQVRFID0gJyg/OighKVxccyopPyc7IC8vIEdyb3VwIDIKICBjb25zdCBFWFBSRVNTSU9OID0gT1BFTl9CUkFDS0VUICsgTkVHQVRFICsgQklORElORyArIENMT1NFX0JSQUNLRVQ7CiAgY29uc3QgYmluZGluZ1JlZ2V4ID0gbmV3IFJlZ0V4cChFWFBSRVNTSU9OLCAiZyIpOwoKICAvKioKICAgKiBDcmVhdGUgYSBzdHJpbmcgZnJvbSBiaW5kaW5nIHBhcnRzIG9mIGFsbCB0aGUgbGl0ZXJhbCBwYXJ0cwogICAqCiAgICogQHBhcmFtIHshQXJyYXk8QmluZGluZ1BhcnQ+fSBwYXJ0cyBBbGwgcGFydHMgdG8gc3RyaW5naWZ5CiAgICogQHJldHVybiB7c3RyaW5nfSBTdHJpbmcgbWFkZSBmcm9tIHRoZSBsaXRlcmFsIHBhcnRzCiAgICovCiAgZnVuY3Rpb24gbGl0ZXJhbEZyb21QYXJ0cyhwYXJ0cykgewogICAgbGV0IHMgPSAnJzsKICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICBsZXQgbGl0ZXJhbCA9IHBhcnRzW2ldLmxpdGVyYWw7CiAgICAgIHMgKz0gbGl0ZXJhbCB8fCAnJzsKICAgIH0KICAgIHJldHVybiBzOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIGFuIGV4cHJlc3Npb24gc3RyaW5nIGZvciBhIG1ldGhvZCBzaWduYXR1cmUsIGFuZCByZXR1cm5zIGEgbWV0YWRhdGEKICAgKiBkZXNjcmliaW5nIHRoZSBtZXRob2QgaW4gdGVybXMgb2YgYG1ldGhvZE5hbWVgLCBgc3RhdGljYCAod2hldGhlciBhbGwgdGhlCiAgICogYXJndW1lbnRzIGFyZSBsaXRlcmFscyksIGFuZCBhbiBhcnJheSBvZiBgYXJnc2AKICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIHBhcnNlCiAgICogQHJldHVybiB7P01ldGhvZFNpZ25hdHVyZX0gVGhlIG1ldGhvZCBtZXRhZGF0YSBvYmplY3QgaWYgYSBtZXRob2QgZXhwcmVzc2lvbiB3YXMKICAgKiAgIGZvdW5kLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHBhcnNlTWV0aG9kKGV4cHJlc3Npb24pIHsKICAgIC8vIHRyaWVzIHRvIG1hdGNoIHZhbGlkIGphdmFzY3JpcHQgcHJvcGVydHkgbmFtZXMKICAgIGxldCBtID0gZXhwcmVzc2lvbi5tYXRjaCgvKFteXHNdKz8pXCgoW1xzXFNdKilcKS8pOwogICAgaWYgKG0pIHsKICAgICAgbGV0IG1ldGhvZE5hbWUgPSBtWzFdOwogICAgICBsZXQgc2lnID0geyBtZXRob2ROYW1lLCBzdGF0aWM6IHRydWUsIGFyZ3M6IGVtcHR5QXJyYXkgfTsKICAgICAgaWYgKG1bMl0udHJpbSgpKSB7CiAgICAgICAgLy8gcmVwbGFjZSBlc2NhcGVkIGNvbW1hcyB3aXRoIGNvbW1hIGVudGl0eSwgc3BsaXQgb24gdW4tZXNjYXBlZCBjb21tYXMKICAgICAgICBsZXQgYXJncyA9IG1bMl0ucmVwbGFjZSgvXFwsL2csICcmY29tbWE7Jykuc3BsaXQoJywnKTsKICAgICAgICByZXR1cm4gcGFyc2VBcmdzKGFyZ3MsIHNpZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHNpZzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYW4gYXJyYXkgb2YgYXJndW1lbnRzIGFuZCBzZXRzIHRoZSBgYXJnc2AgcHJvcGVydHkgb2YgdGhlIHN1cHBsaWVkCiAgICogc2lnbmF0dXJlIG1ldGFkYXRhIG9iamVjdC4gU2V0cyB0aGUgYHN0YXRpY2AgcHJvcGVydHkgdG8gZmFsc2UgaWYgYW55CiAgICogYXJndW1lbnQgaXMgYSBub24tbGl0ZXJhbC4KICAgKgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IGFyZ0xpc3QgQXJyYXkgb2YgYXJndW1lbnQgbmFtZXMKICAgKiBAcGFyYW0geyFNZXRob2RTaWduYXR1cmV9IHNpZyBNZXRob2Qgc2lnbmF0dXJlIG1ldGFkYXRhIG9iamVjdAogICAqIEByZXR1cm4geyFNZXRob2RTaWduYXR1cmV9IFRoZSB1cGRhdGVkIHNpZ25hdHVyZSBtZXRhZGF0YSBvYmplY3QKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHBhcnNlQXJncyhhcmdMaXN0LCBzaWcpIHsKICAgIHNpZy5hcmdzID0gYXJnTGlzdC5tYXAoZnVuY3Rpb24ocmF3QXJnKSB7CiAgICAgIGxldCBhcmcgPSBwYXJzZUFyZyhyYXdBcmcpOwogICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgc2lnLnN0YXRpYyA9IGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiBhcmc7CiAgICB9LCB0aGlzKTsKICAgIHJldHVybiBzaWc7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYW4gaW5kaXZpZHVhbCBhcmd1bWVudCwgYW5kIHJldHVybnMgYW4gYXJndW1lbnQgbWV0YWRhdGEgb2JqZWN0CiAgICogd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczoKICAgKgogICAqICAgewogICAqICAgICB2YWx1ZTogJ3Byb3AnLCAgICAgICAgLy8gcHJvcGVydHkvcGF0aCBvciBsaXRlcmFsIHZhbHVlCiAgICogICAgIGxpdGVyYWw6IGZhbHNlLCAgICAgICAvLyB3aGV0aGVyIGFyZ3VtZW50IGlzIGEgbGl0ZXJhbAogICAqICAgICBzdHJ1Y3R1cmVkOiBmYWxzZSwgICAgLy8gd2hldGhlciB0aGUgcHJvcGVydHkgaXMgYSBwYXRoCiAgICogICAgIHJvb3RQcm9wZXJ0eTogJ3Byb3AnLCAvLyB0aGUgcm9vdCBwcm9wZXJ0eSBvZiB0aGUgcGF0aAogICAqICAgICB3aWxkY2FyZDogZmFsc2UgICAgICAgLy8gd2hldGhlciB0aGUgYXJndW1lbnQgd2FzIGEgd2lsZGNhcmQgJy4qJyBwYXRoCiAgICogICB9CiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3QXJnIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGFyZ3VtZW50CiAgICogQHJldHVybiB7IU1ldGhvZEFyZ30gQXJndW1lbnQgbWV0YWRhdGEgb2JqZWN0CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBwYXJzZUFyZyhyYXdBcmcpIHsKICAgIC8vIGNsZWFuIHVwIHdoaXRlc3BhY2UKICAgIGxldCBhcmcgPSByYXdBcmcudHJpbSgpCiAgICAgIC8vIHJlcGxhY2UgY29tbWEgZW50aXR5IHdpdGggY29tbWEKICAgICAgLnJlcGxhY2UoLyZjb21tYTsvZywgJywnKQogICAgICAvLyByZXBhaXIgZXh0cmEgZXNjYXBlIHNlcXVlbmNlczsgbm90ZSBvbmx5IGNvbW1hcyBzdHJpY3RseSBuZWVkCiAgICAgIC8vIGVzY2FwaW5nLCBidXQgd2UgYWxsb3cgYW55IG90aGVyIGNoYXIgdG8gYmUgZXNjYXBlZCBzaW5jZSBpdHMKICAgICAgLy8gbGlrZWx5IHVzZXJzIHdpbGwgZG8gdGhpcwogICAgICAucmVwbGFjZSgvXFwoLikvZywgJ1wkMScpCiAgICAgIDsKICAgIC8vIGJhc2ljIGFyZ3VtZW50IGRlc2NyaXB0b3IKICAgIGxldCBhID0gewogICAgICBuYW1lOiBhcmcsCiAgICAgIHZhbHVlOiAnJywKICAgICAgbGl0ZXJhbDogZmFsc2UKICAgIH07CiAgICAvLyBkZXRlY3QgbGl0ZXJhbCB2YWx1ZSAobXVzdCBiZSBTdHJpbmcgb3IgTnVtYmVyKQogICAgbGV0IGZjID0gYXJnWzBdOwogICAgaWYgKGZjID09PSAnLScpIHsKICAgICAgZmMgPSBhcmdbMV07CiAgICB9CiAgICBpZiAoZmMgPj0gJzAnICYmIGZjIDw9ICc5JykgewogICAgICBmYyA9ICcjJzsKICAgIH0KICAgIHN3aXRjaChmYykgewogICAgICBjYXNlICInIjoKICAgICAgY2FzZSAnIic6CiAgICAgICAgYS52YWx1ZSA9IGFyZy5zbGljZSgxLCAtMSk7CiAgICAgICAgYS5saXRlcmFsID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnIyc6CiAgICAgICAgYS52YWx1ZSA9IE51bWJlcihhcmcpOwogICAgICAgIGEubGl0ZXJhbCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICAvLyBpZiBub3QgbGl0ZXJhbCwgbG9vayBmb3Igc3RydWN0dXJlZCBwYXRoCiAgICBpZiAoIWEubGl0ZXJhbCkgewogICAgICBhLnJvb3RQcm9wZXJ0eSA9IFBvbHltZXIuUGF0aC5yb290KGFyZyk7CiAgICAgIC8vIGRldGVjdCBzdHJ1Y3R1cmVkIHBhdGggKGhhcyBkb3RzKQogICAgICBhLnN0cnVjdHVyZWQgPSBQb2x5bWVyLlBhdGguaXNQYXRoKGFyZyk7CiAgICAgIGlmIChhLnN0cnVjdHVyZWQpIHsKICAgICAgICBhLndpbGRjYXJkID0gKGFyZy5zbGljZSgtMikgPT0gJy4qJyk7CiAgICAgICAgaWYgKGEud2lsZGNhcmQpIHsKICAgICAgICAgIGEubmFtZSA9IGFyZy5zbGljZSgwLCAtMik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gYTsKICB9CgogIC8vIGRhdGEgYXBpCgogIC8qKgogICAqIFNlbmRzIGFycmF5IHNwbGljZSBub3RpZmljYXRpb25zIChgLnNwbGljZXNgIGFuZCBgLmxlbmd0aGApCiAgICoKICAgKiBOb3RlOiB0aGlzIGltcGxlbWVudGF0aW9uIG9ubHkgYWNjZXB0cyBub3JtYWxpemVkIHBhdGhzCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IEluc3RhbmNlIHRvIHNlbmQgbm90aWZpY2F0aW9ucyB0bwogICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0aGUgbXV0YXRpb25zIG9jY3VycmVkIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gdGhlIGFycmF5IHRoYXQgd2FzIG11dGF0ZWQKICAgKiBAcGFyYW0ge0FycmF5fSBzcGxpY2VzIEFycmF5IG9mIHNwbGljZSByZWNvcmRzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIG5vdGlmeVNwbGljZXMoaW5zdCwgYXJyYXksIHBhdGgsIHNwbGljZXMpIHsKICAgIGxldCBzcGxpY2VzUGF0aCA9IHBhdGggKyAnLnNwbGljZXMnOwogICAgaW5zdC5ub3RpZnlQYXRoKHNwbGljZXNQYXRoLCB7IGluZGV4U3BsaWNlczogc3BsaWNlcyB9KTsKICAgIGluc3Qubm90aWZ5UGF0aChwYXRoICsgJy5sZW5ndGgnLCBhcnJheS5sZW5ndGgpOwogICAgLy8gTnVsbCBoZXJlIHRvIGFsbG93IHBvdGVudGlhbGx5IGxhcmdlIHNwbGljZSByZWNvcmRzIHRvIGJlIEdDJ2VkLgogICAgaW5zdC5fX2RhdGFbc3BsaWNlc1BhdGhdID0ge2luZGV4U3BsaWNlczogbnVsbH07CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgc3BsaWNlIHJlY29yZCBhbmQgc2VuZHMgYW4gYXJyYXkgc3BsaWNlIG5vdGlmaWNhdGlvbiBmb3IKICAgKiB0aGUgZGVzY3JpYmVkIG11dGF0aW9uCiAgICoKICAgKiBOb3RlOiB0aGlzIGltcGxlbWVudGF0aW9uIG9ubHkgYWNjZXB0cyBub3JtYWxpemVkIHBhdGhzCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IEluc3RhbmNlIHRvIHNlbmQgbm90aWZpY2F0aW9ucyB0bwogICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0aGUgbXV0YXRpb25zIG9jY3VycmVkIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gdGhlIGFycmF5IHRoYXQgd2FzIG11dGF0ZWQKICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggYXQgd2hpY2ggdGhlIGFycmF5IG11dGF0aW9uIG9jY3VycmVkCiAgICogQHBhcmFtIHtudW1iZXJ9IGFkZGVkQ291bnQgTnVtYmVyIG9mIGFkZGVkIGl0ZW1zCiAgICogQHBhcmFtIHtBcnJheX0gcmVtb3ZlZCBBcnJheSBvZiByZW1vdmVkIGl0ZW1zCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIG5vdGlmeVNwbGljZShpbnN0LCBhcnJheSwgcGF0aCwgaW5kZXgsIGFkZGVkQ291bnQsIHJlbW92ZWQpIHsKICAgIG5vdGlmeVNwbGljZXMoaW5zdCwgYXJyYXksIHBhdGgsIFt7CiAgICAgIGluZGV4OiBpbmRleCwKICAgICAgYWRkZWRDb3VudDogYWRkZWRDb3VudCwKICAgICAgcmVtb3ZlZDogcmVtb3ZlZCwKICAgICAgb2JqZWN0OiBhcnJheSwKICAgICAgdHlwZTogJ3NwbGljZScKICAgIH1dKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYW4gdXBwZXItY2FzZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgU3RyaW5nIHRvIHVwcGVyY2FzZQogICAqIEByZXR1cm4ge3N0cmluZ30gVXBwZXJjYXNlZCBzdHJpbmcKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHVwcGVyKG5hbWUpIHsKICAgIHJldHVybiBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cmluZygxKTsKICB9CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBtZXRhLXByb2dyYW1taW5nIGZvciBQb2x5bWVyJ3MgdGVtcGxhdGUKICAgKiBiaW5kaW5nIGFuZCBkYXRhIG9ic2VydmF0aW9uIChjb2xsZWN0aXZlbHksICJwcm9wZXJ0eSBlZmZlY3RzIikgc3lzdGVtLgogICAqCiAgICogVGhpcyBtaXhpbiB1c2VzIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcga2V5IHN0YXRpYyBtZXRob2RzIGZvciBhZGRpbmcKICAgKiBwcm9wZXJ0eSBlZmZlY3RzIHRvIGFuIGVsZW1lbnQgY2xhc3M6CiAgICogLSBgYWRkUHJvcGVydHlFZmZlY3RgCiAgICogLSBgY3JlYXRlUHJvcGVydHlPYnNlcnZlcmAKICAgKiAtIGBjcmVhdGVNZXRob2RPYnNlcnZlcmAKICAgKiAtIGBjcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eWAKICAgKiAtIGBjcmVhdGVSZWFkT25seVByb3BlcnR5YAogICAqIC0gYGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5YAogICAqIC0gYGNyZWF0ZUNvbXB1dGVkUHJvcGVydHlgCiAgICogLSBgYmluZFRlbXBsYXRlYAogICAqCiAgICogRWFjaCBtZXRob2QgY3JlYXRlcyBvbmUgb3IgbW9yZSBwcm9wZXJ0eSBhY2Nlc3NvcnMsIGFsb25nIHdpdGggbWV0YWRhdGEKICAgKiB1c2VkIGJ5IHRoaXMgbWl4aW4ncyBpbXBsZW1lbnRhdGlvbiBvZiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCB0byBwZXJmb3JtCiAgICogdGhlIHByb3BlcnR5IGVmZmVjdHMuCiAgICoKICAgKiBVbmRlcnNjb3JlZCB2ZXJzaW9ucyBvZiB0aGUgYWJvdmUgbWV0aG9kcyBhbHNvIGV4aXN0IG9uIHRoZSBlbGVtZW50CiAgICogcHJvdG90eXBlIGZvciBhZGRpbmcgcHJvcGVydHkgZWZmZWN0cyBvbiBpbnN0YW5jZXMgYXQgcnVudGltZS4KICAgKgogICAqIE5vdGUgdGhhdCB0aGlzIG1peGluIG92ZXJyaWRlcyBzZXZlcmFsIGBQcm9wZXJ0eUFjY2Vzc29yc2AgbWV0aG9kcywgaW4KICAgKiBtYW55IGNhc2VzIHRvIG1haW50YWluIGd1YXJhbnRlZXMgcHJvdmlkZWQgYnkgdGhlIFBvbHltZXIgMS54IGZlYXR1cmVzOwogICAqIG5vdGFibHkgaXQgY2hhbmdlcyBwcm9wZXJ0eSBhY2Nlc3NvcnMgdG8gYmUgc3luY2hyb25vdXMgYnkgZGVmYXVsdAogICAqIHdoZXJlYXMgdGhlIGRlZmF1bHQgd2hlbiB1c2luZyBgUHJvcGVydHlBY2Nlc3NvcnNgIHN0YW5kYWxvbmUgaXMgdG8gYmUKICAgKiBhc3luYyBieSBkZWZhdWx0LgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5UZW1wbGF0ZVN0YW1wCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgbWV0YS1wcm9ncmFtbWluZyBmb3IgUG9seW1lcidzCiAgICogdGVtcGxhdGUgYmluZGluZyBhbmQgZGF0YSBvYnNlcnZhdGlvbiBzeXN0ZW0uCiAgICovCiAgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtzdXBlckNsYXNzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydHlBY2Nlc3NvcnN9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9UZW1wbGF0ZVN0YW1wfQogICAgICogQHVucmVzdHJpY3RlZAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgcHJvcGVydHlFZmZlY3RzQmFzZSA9IFBvbHltZXIuVGVtcGxhdGVTdGFtcChQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzKHN1cGVyQ2xhc3MpKTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydHlFZmZlY3RzfQogICAgICogQGV4dGVuZHMge3Byb3BlcnR5RWZmZWN0c0Jhc2V9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnR5RWZmZWN0cyBleHRlbmRzIHByb3BlcnR5RWZmZWN0c0Jhc2UgewoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgLy8gVXNlZCB0byBpZGVudGlmeSB1c2VycyBvZiB0aGlzIG1peGluLCBhbGEgaW5zdGFuY2VvZgogICAgICAgIHRoaXMuX19pc1Byb3BlcnR5RWZmZWN0c0NsaWVudCA9IHRydWU7CiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovCiAgICAgICAgLy8gTk9URTogdXNlZCB0byB0cmFjayByZS1lbnRyYW50IGNhbGxzIHRvIGBfZmx1c2hQcm9wZXJ0aWVzYAogICAgICAgIC8vIHBhdGggY2hhbmdlcyBkaXJ0eSBjaGVjayBhZ2FpbnN0IGBfX2RhdGFUZW1wYCBvbmx5IGR1cmluZyBvbmUgInR1cm4iCiAgICAgICAgLy8gYW5kIGFyZSBjbGVhcmVkIHdoZW4gYF9fZGF0YUNvdW50ZXJgIHJldHVybnMgdG8gMC4KICAgICAgICB0aGlzLl9fZGF0YUNvdW50ZXIgPSAwOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICB0aGlzLl9fZGF0YUNsaWVudHNSZWFkeTsKICAgICAgICAvKiogQHR5cGUge0FycmF5fSAqLwogICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeTsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhQ29tcG91bmRTdG9yYWdlOwogICAgICAgIC8qKiBAdHlwZSB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9ICovCiAgICAgICAgdGhpcy5fX2RhdGFIb3N0OwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVRlbXA7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c0luaXRpYWxpemVkOwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YTsKICAgICAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nOwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YU9sZDsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fY29tcHV0ZUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX3JlZmxlY3RFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19ub3RpZnlFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19wcm9wYWdhdGVFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19vYnNlcnZlRWZmZWN0czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fcmVhZE9ubHk7CiAgICAgICAgLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLwogICAgICAgIHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIGdldCBQUk9QRVJUWV9FRkZFQ1RfVFlQRVMoKSB7CiAgICAgICAgcmV0dXJuIFRZUEVTOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgICBob3N0U3RhY2sucmVnaXN0ZXJIb3N0KHRoaXMpOwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5ID0gZmFsc2U7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IG51bGw7CiAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeSA9IG51bGw7CiAgICAgICAgdGhpcy5fX2RhdGFMaW5rZWRQYXRocyA9IG51bGw7CiAgICAgICAgdGhpcy5fX2RhdGFIYXNQYXRocyA9IGZhbHNlOwogICAgICAgIC8vIE1heSBiZSBzZXQgb24gaW5zdGFuY2UgcHJpb3IgdG8gdXBncmFkZQogICAgICAgIHRoaXMuX19kYXRhQ29tcG91bmRTdG9yYWdlID0gdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgfHwgbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUhvc3QgPSB0aGlzLl9fZGF0YUhvc3QgfHwgbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YVRlbXAgPSB7fTsKICAgICAgICB0aGlzLl9fZGF0YUNsaWVudHNJbml0aWFsaXplZCA9IGZhbHNlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzYCBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIGEKICAgICAgICogbW9yZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gb2YgaW5pdGlhbGl6aW5nIHByb3BlcnRpZXMgZnJvbQogICAgICAgKiB0aGUgcHJvdG90eXBlIG9uIHRoZSBpbnN0YW5jZS4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIGluaXRpYWxpemUgb24gdGhlIHByb3RvdHlwZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICB0aGlzLl9fZGF0YSA9IE9iamVjdC5jcmVhdGUocHJvcHMpOwogICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IE9iamVjdC5jcmVhdGUocHJvcHMpOwogICAgICAgIHRoaXMuX19kYXRhT2xkID0ge307CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIGltcGxlbWVudGF0aW9uIHRvIGF2b2lkIHNldHRpbmcKICAgICAgICogYF9zZXRQcm9wZXJ0eWAncyBgc2hvdWxkTm90aWZ5OiB0cnVlYC4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIGluaXRpYWxpemUgb24gdGhlIGluc3RhbmNlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGxldCByZWFkT25seSA9IHRoaXNbVFlQRVMuUkVBRF9PTkxZXTsKICAgICAgICBmb3IgKGxldCBwcm9wIGluIHByb3BzKSB7CiAgICAgICAgICBpZiAoIXJlYWRPbmx5IHx8ICFyZWFkT25seVtwcm9wXSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB0aGlzLl9fZGF0YVBlbmRpbmcgfHwge307CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gdGhpcy5fX2RhdGFPbGQgfHwge307CiAgICAgICAgICAgIHRoaXMuX19kYXRhW3Byb3BdID0gdGhpcy5fX2RhdGFQZW5kaW5nW3Byb3BdID0gcHJvcHNbcHJvcF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBQcm90b3R5cGUgc2V0dXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBhZGRQcm9wZXJ0eUVmZmVjdGAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgRWZmZWN0IHR5cGUsIGZyb20gdGhpcy5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgIHRoaXMuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IocHJvcGVydHksIHR5cGUgPT0gVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgICAvLyBlZmZlY3RzIGFyZSBhY2N1bXVsYXRlZCBpbnRvIGFycmF5cyBwZXIgcHJvcGVydHkgYmFzZWQgb24gdHlwZQogICAgICAgIGxldCBlZmZlY3RzID0gZW5zdXJlT3duRWZmZWN0TWFwKHRoaXMsIHR5cGUpW3Byb3BlcnR5XTsKICAgICAgICBpZiAoIWVmZmVjdHMpIHsKICAgICAgICAgIGVmZmVjdHMgPSB0aGlzW3R5cGVdW3Byb3BlcnR5XSA9IFtdOwogICAgICAgIH0KICAgICAgICBlZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIHByb3BlcnR5IGVmZmVjdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoZSBlZmZlY3Qgd2FzIGFzc29jaWF0ZWQgd2l0aAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0IHRvIHJlbW92ZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlbW92ZVByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCB0eXBlLCBlZmZlY3QpIHsKICAgICAgICBsZXQgZWZmZWN0cyA9IGVuc3VyZU93bkVmZmVjdE1hcCh0aGlzLCB0eXBlKVtwcm9wZXJ0eV07CiAgICAgICAgbGV0IGlkeCA9IGVmZmVjdHMuaW5kZXhPZihlZmZlY3QpOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgZWZmZWN0cy5zcGxpY2UoaWR4LCAxKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhIHByb3BlcnR5IGVmZmVjdAogICAgICAgKiBvZiBhIGNlcnRhaW4gdHlwZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSB0eXBlIEVmZmVjdCB0eXBlLCBmcm9tIHRoaXMuUFJPUEVSVFlfRUZGRUNUX1RZUEVTCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMgdHlwZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUpIHsKICAgICAgICBsZXQgZWZmZWN0cyA9IHRoaXNbdHlwZV07CiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZWZmZWN0cyAmJiBlZmZlY3RzW3Byb3BlcnR5XSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhICJyZWFkIG9ubHkiCiAgICAgICAqIGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMgdHlwZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaGFzUmVhZE9ubHlFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLlJFQURfT05MWSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhICJub3RpZnkiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc05vdGlmeUVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuTk9USUZZKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgInJlZmxlY3QgdG8gYXR0cmlidXRlIgogICAgICAgKiBwcm9wZXJ0eSBlZmZlY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNSZWZsZWN0RWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUZMRUNUKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgImNvbXB1dGVkIgogICAgICAgKiBwcm9wZXJ0eSBlZmZlY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNDb21wdXRlZEVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuQ09NUFVURSk7CiAgICAgIH0KCiAgICAgIC8vIFJ1bnRpbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSBwZW5kaW5nIHByb3BlcnR5IG9yIHBhdGguICBJZiB0aGUgcm9vdCBwcm9wZXJ0eSBvZiB0aGUgcGF0aCBpbgogICAgICAgKiBxdWVzdGlvbiBoYWQgbm8gYWNjZXNzb3IsIHRoZSBwYXRoIGlzIHNldCwgb3RoZXJ3aXNlIGl0IGlzIGVucXVldWVkCiAgICAgICAqIHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXNvbGF0ZXMgcmVsYXRpdmVseSBleHBlbnNpdmUgZnVuY3Rpb25hbGl0eSBuZWNlc3NhcnkKICAgICAgICogZm9yIHRoZSBwdWJsaWMgQVBJIChgc2V0YCwgYHNldFByb3BlcnRpZXNgLCBgbm90aWZ5UGF0aGAsIGFuZCBwcm9wZXJ0eQogICAgICAgKiBjaGFuZ2UgbGlzdGVuZXJzIHZpYSB7ey4uLn19IGJpbmRpbmdzKSwgc3VjaCB0aGF0IGl0IGlzIG9ubHkgZG9uZQogICAgICAgKiB3aGVuIHBhdGhzIGVudGVyIHRoZSBzeXN0ZW0sIGFuZCBub3QgYXQgZXZlcnkgcHJvcGFnYXRpb24gc3RlcC4gIEl0CiAgICAgICAqIGFsc28gc2V0cyBhIGBfX2RhdGFIYXNQYXRoc2AgZmxhZyBvbiB0aGUgaW5zdGFuY2Ugd2hpY2ggaXMgdXNlZCB0bwogICAgICAgKiBmYXN0LXBhdGggc2xvd2VyIHBhdGgtbWF0Y2hpbmcgY29kZSBpbiB0aGUgcHJvcGVydHkgZWZmZWN0cyBob3N0IHBhdGhzLgogICAgICAgKgogICAgICAgKiBgcGF0aGAgY2FuIGJlIGEgcGF0aCBzdHJpbmcgb3IgYXJyYXkgb2YgcGF0aCBwYXJ0cyBhcyBhY2NlcHRlZCBieSB0aGUKICAgICAgICogcHVibGljIEFQSS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8bnVtYmVyfHN0cmluZz59IHBhdGggUGF0aCB0byBzZXQKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkTm90aWZ5IFNldCB0byB0cnVlIGlmIHRoaXMgY2hhbmdlIHNob3VsZAogICAgICAgKiAgY2F1c2UgYSBwcm9wZXJ0eSBub3RpZmljYXRpb24gZXZlbnQgZGlzcGF0Y2gKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gaXNQYXRoTm90aWZpY2F0aW9uIElmIHRoZSBwYXRoIGJlaW5nIHNldCBpcyBhIHBhdGgKICAgICAgICogICBub3RpZmljYXRpb24gb2YgYW4gYWxyZWFkeSBjaGFuZ2VkIHZhbHVlLCBhcyBvcHBvc2VkIHRvIGEgcmVxdWVzdAogICAgICAgKiAgIHRvIHNldCBhbmQgbm90aWZ5IHRoZSBjaGFuZ2UuICBJbiB0aGUgbGF0dGVyIGBmYWxzZWAgY2FzZSwgYSBkaXJ0eQogICAgICAgKiAgIGNoZWNrIGlzIHBlcmZvcm1lZCBhbmQgdGhlbiB0aGUgdmFsdWUgaXMgc2V0IHRvIHRoZSBwYXRoIGJlZm9yZQogICAgICAgKiAgIGVucXVldWluZyB0aGUgcGVuZGluZyBwcm9wZXJ0eSBjaGFuZ2UuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkvcGF0aCB3YXMgZW5xdWV1ZWQgaW4KICAgICAgICogICB0aGUgcGVuZGluZyBjaGFuZ2VzIGJhZy4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCB2YWx1ZSwgc2hvdWxkTm90aWZ5LCBpc1BhdGhOb3RpZmljYXRpb24pIHsKICAgICAgICBpZiAoaXNQYXRoTm90aWZpY2F0aW9uIHx8CiAgICAgICAgICAgIFBvbHltZXIuUGF0aC5yb290KEFycmF5LmlzQXJyYXkocGF0aCkgPyBwYXRoWzBdIDogcGF0aCkgIT09IHBhdGgpIHsKICAgICAgICAgIC8vIERpcnR5IGNoZWNrIGNoYW5nZXMgYmVpbmcgc2V0IHRvIGEgcGF0aCBhZ2FpbnN0IHRoZSBhY3R1YWwgb2JqZWN0LAogICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHBhdGhzIGludG8gdGhlIHN5c3RlbTsgZnJvbSBoZXJlCiAgICAgICAgICAvLyB0aGUgb25seSBkaXJ0eSBjaGVja3MgYXJlIGFnYWluc3QgdGhlIGBfX2RhdGFUZW1wYCBjYWNoZSB0byBwcmV2ZW50CiAgICAgICAgICAvLyBkdXBsaWNhdGUgd29yayBpbiB0aGUgc2FtZSB0dXJuIG9ubHkuIE5vdGUsIGlmIHRoaXMgd2FzIGEgbm90aWZpY2F0aW9uCiAgICAgICAgICAvLyBvZiBhIGNoYW5nZSBhbHJlYWR5IHNldCB0byBhIHBhdGggKGlzUGF0aE5vdGlmaWNhdGlvbjogdHJ1ZSksCiAgICAgICAgICAvLyB3ZSBhbHdheXMgbGV0IHRoZSBjaGFuZ2UgdGhyb3VnaCBhbmQgc2tpcCB0aGUgYHNldGAgc2luY2UgaXQgd2FzCiAgICAgICAgICAvLyBhbHJlYWR5IGRpcnR5IGNoZWNrZWQgYXQgdGhlIHBvaW50IG9mIGVudHJ5IGFuZCB0aGUgdW5kZXJseWluZwogICAgICAgICAgLy8gb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZAogICAgICAgICAgaWYgKCFpc1BhdGhOb3RpZmljYXRpb24pIHsKICAgICAgICAgICAgbGV0IG9sZCA9IFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCk7CiAgICAgICAgICAgIHBhdGggPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKFBvbHltZXIuUGF0aC5zZXQodGhpcywgcGF0aCwgdmFsdWUpKTsKICAgICAgICAgICAgLy8gVXNlIHByb3BlcnR5LWFjY2Vzc29yJ3Mgc2ltcGxlciBkaXJ0eSBjaGVjawogICAgICAgICAgICBpZiAoIXBhdGggfHwgIXN1cGVyLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwYXRoLCB2YWx1ZSwgb2xkKSkgewogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2RhdGFIYXNQYXRocyA9IHRydWU7CiAgICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KC8qKkB0eXBle3N0cmluZ30qLyhwYXRoKSwgdmFsdWUsIHNob3VsZE5vdGlmeSkpIHsKICAgICAgICAgICAgY29tcHV0ZUxpbmtlZFBhdGhzKHRoaXMsIHBhdGgsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh0aGlzLl9fZGF0YUhhc0FjY2Vzc29yICYmIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcGF0aF0pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eSgvKipAdHlwZXtzdHJpbmd9Ki8ocGF0aCksIHZhbHVlLCBzaG91bGROb3RpZnkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpc1twYXRoXSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBcHBsaWVzIGEgdmFsdWUgdG8gYSBub24tUG9seW1lciBlbGVtZW50L25vZGUncyBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogVGhlIGltcGxlbWVudGF0aW9uIG1ha2VzIGEgYmVzdC1lZmZvcnQgYXQgYmluZGluZyBpbnRlcm9wOgogICAgICAgKiBTb21lIG5hdGl2ZSBlbGVtZW50IHByb3BlcnRpZXMgaGF2ZSBzaWRlLWVmZmVjdHMgd2hlbgogICAgICAgKiByZS1zZXR0aW5nIHRoZSBzYW1lIHZhbHVlIChlLmcuIHNldHRpbmcgYDxpbnB1dD4udmFsdWVgIHJlc2V0cyB0aGUKICAgICAgICogY3Vyc29yIHBvc2l0aW9uKSwgc28gd2UgZG8gYSBkaXJ0eS1jaGVjayBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUuCiAgICAgICAqIEhvd2V2ZXIsIGZvciBiZXR0ZXIgaW50ZXJvcCB3aXRoIG5vbi1Qb2x5bWVyIGN1c3RvbSBlbGVtZW50cyB0aGF0CiAgICAgICAqIGFjY2VwdCBvYmplY3RzLCB3ZSBleHBsaWNpdGx5IHJlLXNldCBvYmplY3QgY2hhbmdlcyBjb21pbmcgZnJvbSB0aGUKICAgICAgICogUG9seW1lciB3b3JsZCAod2hpY2ggbWF5IGluY2x1ZGUgZGVlcCBvYmplY3QgY2hhbmdlcyB3aXRob3V0IHRoZQogICAgICAgKiB0b3AgcmVmZXJlbmNlIGNoYW5naW5nKSwgZXJyaW5nIG9uIHRoZSBzaWRlIG9mIHByb3ZpZGluZyBtb3JlCiAgICAgICAqIGluZm9ybWF0aW9uLgogICAgICAgKgogICAgICAgKiBVc2VycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhbHRlcm5hdGUgYXBwcm9hY2hlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBUaGUgbm9kZSB0byBzZXQgYSBwcm9wZXJ0eSBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgICAgICAvLyBJdCBpcyBhIGp1ZGdtZW50IGNhbGwgdGhhdCByZXNldHRpbmcgcHJpbWl0aXZlcyBpcwogICAgICAgIC8vICJiYWQiIGFuZCByZXNldHRpbmdzIG9iamVjdHMgaXMgYWxzbyAiZ29vZCI7IGFsdGVybmF0aXZlbHkgd2UgY291bGQKICAgICAgICAvLyBpbXBsZW1lbnQgYSB3aGl0ZWxpc3Qgb2YgdGFnICYgcHJvcGVydHkgdmFsdWVzIHRoYXQgc2hvdWxkIG5ldmVyCiAgICAgICAgLy8gYmUgcmVzZXQgKGUuZy4gPGlucHV0Pi52YWx1ZSAmJiA8c2VsZWN0Pi52YWx1ZSkKICAgICAgICBpZiAodmFsdWUgIT09IG5vZGVbcHJvcF0gfHwgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7CiAgICAgICAgICBub2RlW3Byb3BdID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBgUHJvcGVydGllc0NoYW5nZWRgIGltcGxlbWVudGF0aW9uIHRvIGludHJvZHVjZSBzcGVjaWFsCiAgICAgICAqIGRpcnR5IGNoZWNrIGxvZ2ljIGRlcGVuZGluZyBvbiB0aGUgcHJvcGVydHkgJiB2YWx1ZSBiZWluZyBzZXQ6CiAgICAgICAqCiAgICAgICAqIDEuIEFueSB2YWx1ZSBzZXQgdG8gYSBwYXRoIChlLmcuICdvYmoucHJvcCc6IDQyIG9yICdvYmoucHJvcCc6IHsuLi59KQogICAgICAgKiAgICBTdG9yZWQgaW4gYF9fZGF0YVRlbXBgLCBkaXJ0eSBjaGVja2VkIGFnYWluc3QgYF9fZGF0YVRlbXBgCiAgICAgICAqIDIuIE9iamVjdCBzZXQgdG8gc2ltcGxlIHByb3BlcnR5IChlLmcuICdwcm9wJzogey4uLn0pCiAgICAgICAqICAgIFN0b3JlZCBpbiBgX19kYXRhVGVtcGAgYW5kIGBfX2RhdGFgLCBkaXJ0eSBjaGVja2VkIGFnYWluc3QKICAgICAgICogICAgYF9fZGF0YVRlbXBgIGJ5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYF9zaG91bGRQcm9wZXJ0eUNoYW5nZWAKICAgICAgICogMy4gUHJpbWl0aXZlIHZhbHVlIHNldCB0byBzaW1wbGUgcHJvcGVydHkgKGUuZy4gJ3Byb3AnOiA0MikKICAgICAgICogICAgU3RvcmVkIGluIGBfX2RhdGFgLCBkaXJ0eSBjaGVja2VkIGFnYWluc3QgYF9fZGF0YWAKICAgICAgICoKICAgICAgICogVGhlIGRpcnR5LWNoZWNrIGlzIGltcG9ydGFudCB0byBwcmV2ZW50IGN5Y2xlcyBkdWUgdG8gdHdvLXdheQogICAgICAgKiBub3RpZmljYXRpb24sIGJ1dCBwYXRocyBhbmQgb2JqZWN0cyBhcmUgb25seSBkaXJ0eSBjaGVja2VkIGFnYWluc3QgYW55CiAgICAgICAqIHByZXZpb3VzIHZhbHVlIHNldCBkdXJpbmcgdGhpcyB0dXJuIHZpYSBhICJ0ZW1wb3JhcnkgY2FjaGUiIHRoYXQgaXMKICAgICAgICogY2xlYXJlZCB3aGVuIHRoZSBsYXN0IGBfcHJvcGVydGllc0NoYW5nZWRgIGV4aXRzLiBUaGlzIGlzIHNvOgogICAgICAgKiBhLiBhbnkgY2FjaGVkIGFycmF5IHBhdGhzIChlLmcuICdhcnJheS4zLnByb3AnKSBtYXkgYmUgaW52YWxpZGF0ZWQKICAgICAgICogICAgZHVlIHRvIGFycmF5IG11dGF0aW9ucyBsaWtlIHNoaWZ0L3Vuc2hpZnQvc3BsaWNlOyB0aGlzIGlzIGZpbmUKICAgICAgICogICAgc2luY2UgcGF0aCBjaGFuZ2VzIGFyZSBkaXJ0eS1jaGVja2VkIGF0IHVzZXIgZW50cnkgcG9pbnRzIGxpa2UgYHNldGAKICAgICAgICogYi4gZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgb25seSBsYXN0cyBvbmUgdHVybiB0byBhbGxvdyB0aGUgdXNlcgogICAgICAgKiAgICB0byBtdXRhdGUgdGhlIG9iamVjdCBpbi1wbGFjZSBhbmQgcmUtc2V0IGl0IHdpdGggdGhlIHNhbWUgaWRlbnRpdHkKICAgICAgICogICAgYW5kIGhhdmUgYWxsIHN1Yi1wcm9wZXJ0aWVzIHJlLXByb3BhZ2F0ZWQgaW4gYSBzdWJzZXF1ZW50IHR1cm4uCiAgICAgICAqCiAgICAgICAqIFRoZSB0ZW1wIGNhY2hlIGlzIG5vdCBuZWNlc3NhcmlseSBzdWZmaWNpZW50IHRvIHByZXZlbnQgaW52YWxpZCBhcnJheQogICAgICAgKiBwYXRocywgc2luY2UgYSBzcGxpY2UgY2FuIGhhcHBlbiBkdXJpbmcgdGhlIHNhbWUgdHVybiAod2l0aCBwYXRob2xvZ2ljYWwKICAgICAgICogdXNlciBjb2RlKTsgd2UgY291bGQgaW50cm9kdWNlIGEgImZpeHVwIiBmb3IgdGVtcG9yYXJpbHkgY2FjaGVkIGFycmF5CiAgICAgICAqIHBhdGhzIGlmIG5lZWRlZDogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXIvcG9seW1lci9pc3N1ZXMvNDIyNwogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZE5vdGlmeSBUcnVlIGlmIHByb3BlcnR5IHNob3VsZCBmaXJlIG5vdGlmaWNhdGlvbgogICAgICAgKiAgIGV2ZW50IChhcHBsaWVzIG9ubHkgZm9yIGBub3RpZnk6IHRydWVgIHByb3BlcnRpZXMpCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgY2hhbmdlZAogICAgICAgKi8KICAgICAgX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHNob3VsZE5vdGlmeSkgewogICAgICAgIGxldCBpc1BhdGggPSB0aGlzLl9fZGF0YUhhc1BhdGhzICYmIFBvbHltZXIuUGF0aC5pc1BhdGgocHJvcGVydHkpOwogICAgICAgIGxldCBwcmV2UHJvcHMgPSBpc1BhdGggPyB0aGlzLl9fZGF0YVRlbXAgOiB0aGlzLl9fZGF0YTsKICAgICAgICBpZiAodGhpcy5fc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBwcmV2UHJvcHNbcHJvcGVydHldKSkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0ge307CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0ge307CiAgICAgICAgICB9CiAgICAgICAgICAvLyBFbnN1cmUgb2xkIGlzIGNhcHR1cmVkIGZyb20gdGhlIGxhc3QgdHVybgogICAgICAgICAgaWYgKCEocHJvcGVydHkgaW4gdGhpcy5fX2RhdGFPbGQpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkW3Byb3BlcnR5XSA9IHRoaXMuX19kYXRhW3Byb3BlcnR5XTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFBhdGhzIGFyZSBzdG9yZWQgaW4gdGVtcG9yYXJ5IGNhY2hlIChjbGVhcmVkIGF0IGVuZCBvZiB0dXJuKSwKICAgICAgICAgIC8vIHdoaWNoIGlzIHVzZWQgZm9yIGRpcnR5LWNoZWNraW5nLCBhbGwgb3RoZXJzIHN0b3JlZCBpbiBfX2RhdGEKICAgICAgICAgIGlmIChpc1BhdGgpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFUZW1wW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBBbGwgY2hhbmdlcyBnbyBpbnRvIHBlbmRpbmcgcHJvcGVydHkgYmFnLCBwYXNzZWQgdG8gX3Byb3BlcnRpZXNDaGFuZ2VkCiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAvLyBUcmFjayBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIG5vdGlmeSBzZXBhcmF0ZWx5CiAgICAgICAgICBpZiAoaXNQYXRoIHx8ICh0aGlzW1RZUEVTLk5PVElGWV0gJiYgdGhpc1tUWVBFUy5OT1RJRlldW3Byb3BlcnR5XSkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeSA9IHRoaXMuX19kYXRhVG9Ob3RpZnkgfHwge307CiAgICAgICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnlbcHJvcGVydHldID0gc2hvdWxkTm90aWZ5OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBiYXNlIGltcGxlbWVudGF0aW9uIHRvIGVuc3VyZSBhbGwgYWNjZXNzb3JzIHNldCBgc2hvdWxkTm90aWZ5YAogICAgICAgKiB0byB0cnVlLCBmb3IgcGVyLXByb3BlcnR5IG5vdGlmaWNhdGlvbiB0cmFja2luZy4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnR5QWNjZXNzb3JgJ3MgZGVmYXVsdCBhc3luYyBxdWV1aW5nIG9mCiAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgOiBpZiBgX19kYXRhUmVhZHlgIGlzIGZhbHNlIChoYXMgbm90IHlldCBiZWVuCiAgICAgICAqIG1hbnVhbGx5IGZsdXNoZWQpLCB0aGUgZnVuY3Rpb24gbm8tb3BzOyBvdGhlcndpc2UgZmx1c2hlcwogICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBzeW5jaHJvbm91c2x5LgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbnZhbGlkYXRlUHJvcGVydGllcygpIHsKICAgICAgICBpZiAodGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgdGhlIGdpdmVuIGNsaWVudCBvbiBhIGxpc3Qgb2YgcGVuZGluZyBjbGllbnRzLCB3aG9zZQogICAgICAgKiBwZW5kaW5nIHByb3BlcnR5IGNoYW5nZXMgY2FuIGxhdGVyIGJlIGZsdXNoZWQgdmlhIGEgY2FsbCB0bwogICAgICAgKiBgX2ZsdXNoQ2xpZW50c2AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjbGllbnQgUHJvcGVydHlFZmZlY3RzIGNsaWVudCB0byBlbnF1ZXVlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9lbnF1ZXVlQ2xpZW50KGNsaWVudCkgewogICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMgPSB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzIHx8IFtdOwogICAgICAgIGlmIChjbGllbnQgIT09IHRoaXMpIHsKICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMucHVzaChjbGllbnQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBzdXBlcmNsYXNzIGltcGxlbWVudGF0aW9uLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfZmx1c2hQcm9wZXJ0aWVzKCkgewogICAgICAgIHRoaXMuX19kYXRhQ291bnRlcisrOwogICAgICAgIHN1cGVyLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB0aGlzLl9fZGF0YUNvdW50ZXItLTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZsdXNoZXMgYW55IGNsaWVudHMgcHJldmlvdXNseSBlbnF1ZXVlZCB2aWEgYF9lbnF1ZXVlQ2xpZW50YCwgY2F1c2luZwogICAgICAgKiB0aGVpciBgX2ZsdXNoUHJvcGVydGllc2AgbWV0aG9kIHRvIHJ1bi4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2ZsdXNoQ2xpZW50cygpIHsKICAgICAgICBpZiAoIXRoaXMuX19kYXRhQ2xpZW50c1JlYWR5KSB7CiAgICAgICAgICB0aGlzLl9fZGF0YUNsaWVudHNSZWFkeSA9IHRydWU7CiAgICAgICAgICB0aGlzLl9yZWFkeUNsaWVudHMoKTsKICAgICAgICAgIC8vIE92ZXJyaWRlIHBvaW50IHdoZXJlIGFjY2Vzc29ycyBhcmUgdHVybmVkIG9uOyBpbXBvcnRhbnRseSwKICAgICAgICAgIC8vIHRoaXMgaXMgYWZ0ZXIgY2xpZW50cyBoYXZlIGZ1bGx5IHJlYWRpZWQsIHByb3ZpZGluZyBhIGd1YXJhbnRlZQogICAgICAgICAgLy8gdGhhdCBhbnkgcHJvcGVydHkgZWZmZWN0cyBvY2N1ciBvbmx5IGFmdGVyIGFsbCBjbGllbnRzIGFyZSByZWFkeS4KICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9fZW5hYmxlT3JGbHVzaENsaWVudHMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIE5PVEU6IFdlIGVuc3VyZSBjbGllbnRzIGVpdGhlciBlbmFibGUgb3IgZmx1c2ggYXMgYXBwcm9wcmlhdGUuIFRoaXMKICAgICAgLy8gaGFuZGxlcyB0d28gY29ybmVyIGNhc2VzOgogICAgICAvLyAoMSkgY2xpZW50cyBmbHVzaCBwcm9wZXJseSB3aGVuIGNvbm5lY3RlZC9lbmFibGVkIGJlZm9yZSB0aGUgaG9zdAogICAgICAvLyBlbmFibGVzOyBlLmcuCiAgICAgIC8vICAgKGEpIFRlbXBsYXRpemUgc3RhbXBzIHdpdGggbm8gcHJvcGVydGllcyBhbmQgZG9lcyBub3QgZmx1c2ggYW5kCiAgICAgIC8vICAgKGIpIHRoZSBpbnN0YW5jZSBpcyBpbnNlcnRlZCBpbnRvIGRvbSBhbmQKICAgICAgLy8gICAoYykgdGhlbiB0aGUgaW5zdGFuY2UgZmx1c2hlcy4KICAgICAgLy8gKDIpIGNsaWVudHMgZW5hYmxlIHByb3Blcmx5IHdoZW4gbm90IGNvbm5lY3RlZC9lbmFibGVkIHdoZW4gdGhlIGhvc3QKICAgICAgLy8gZmx1c2hlczsgZS5nLgogICAgICAvLyAgIChhKSBhIHRlbXBsYXRlIGlzIHJ1bnRpbWUgc3RhbXBlZCBhbmQgbm90IHlldCBjb25uZWN0ZWQvZW5hYmxlZAogICAgICAvLyAgIChiKSBhIGhvc3Qgc2V0cyBhIHByb3BlcnR5LCBjYXVzaW5nIHN0YW1wZWQgZG9tIHRvIGZsdXNoCiAgICAgIC8vICAgKGMpIHRoZSBzdGFtcGVkIGRvbSBlbmFibGVzLgogICAgICBfX2VuYWJsZU9yRmx1c2hDbGllbnRzKCkgewogICAgICAgIGxldCBjbGllbnRzID0gdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50czsKICAgICAgICBpZiAoY2xpZW50cykgewogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IG51bGw7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBjbGllbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCBjbGllbnQgPSBjbGllbnRzW2ldOwogICAgICAgICAgICBpZiAoIWNsaWVudC5fX2RhdGFFbmFibGVkKSB7CiAgICAgICAgICAgICAgY2xpZW50Ll9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xpZW50Ll9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgICAgICBjbGllbnQuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUGVyZm9ybSBhbnkgaW5pdGlhbCBzZXR1cCBvbiBjbGllbnQgZG9tLiBDYWxsZWQgYmVmb3JlIHRoZSBmaXJzdAogICAgICAgKiBgX2ZsdXNoUHJvcGVydGllc2AgY2FsbCBvbiBjbGllbnQgZG9tIGFuZCBiZWZvcmUgYW55IGVsZW1lbnQKICAgICAgICogb2JzZXJ2ZXJzIGFyZSBjYWxsZWQuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9yZWFkeUNsaWVudHMoKSB7CiAgICAgICAgdGhpcy5fX2VuYWJsZU9yRmx1c2hDbGllbnRzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXRzIGEgYmFnIG9mIHByb3BlcnR5IGNoYW5nZXMgdG8gdGhpcyBpbnN0YW5jZSwgYW5kCiAgICAgICAqIHN5bmNocm9ub3VzbHkgcHJvY2Vzc2VzIGFsbCBlZmZlY3RzIG9mIHRoZSBwcm9wZXJ0aWVzIGFzIGEgYmF0Y2guCiAgICAgICAqCiAgICAgICAqIFByb3BlcnR5IG5hbWVzIG11c3QgYmUgc2ltcGxlIHByb3BlcnRpZXMsIG5vdCBwYXRocy4gIEJhdGNoZWQKICAgICAgICogcGF0aCBwcm9wYWdhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIG9uZSBvciBtb3JlIGtleS12YWx1ZSBwYWlycyB3aG9zZSBrZXkgaXMKICAgICAgICogICBhIHByb3BlcnR5IGFuZCB2YWx1ZSBpcyB0aGUgbmV3IHZhbHVlIHRvIHNldCBmb3IgdGhhdCBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2V0UmVhZE9ubHkgV2hlbiB0cnVlLCBhbnkgcHJpdmF0ZSB2YWx1ZXMgc2V0IGluCiAgICAgICAqICAgYHByb3BzYCB3aWxsIGJlIHNldC4gQnkgZGVmYXVsdCwgYHNldFByb3BlcnRpZXNgIHdpbGwgbm90IHNldAogICAgICAgKiAgIGByZWFkT25seTogdHJ1ZWAgcm9vdCBwcm9wZXJ0aWVzLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBzZXRQcm9wZXJ0aWVzKHByb3BzLCBzZXRSZWFkT25seSkgewogICAgICAgIGZvciAobGV0IHBhdGggaW4gcHJvcHMpIHsKICAgICAgICAgIGlmIChzZXRSZWFkT25seSB8fCAhdGhpc1tUWVBFUy5SRUFEX09OTFldIHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV1bcGF0aF0pIHsKICAgICAgICAgICAgLy9UT0RPKGtzY2hhYWYpOiBleHBsaWNpdGx5IGRpc2FsbG93IHBhdGhzIGluIHNldFByb3BlcnR5PwogICAgICAgICAgICAvLyB3aWxkY2FyZCBvYnNlcnZlcnMgY3VycmVudGx5IG9ubHkgcGFzcyB0aGUgZmlyc3QgY2hhbmdlZCBwYXRoCiAgICAgICAgICAgIC8vIGluIHRoZSBgaW5mb2Agb2JqZWN0LCBhbmQgeW91IGNvdWxkIGRvIHNvbWUgb2RkIHRoaW5ncyBiYXRjaGluZwogICAgICAgICAgICAvLyBwYXRocywgZS5nLiB7J2Zvby5iYXInOiB7Li4ufSwgJ2Zvbyc6IG51bGx9CiAgICAgICAgICAgIHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCBwcm9wc1twYXRoXSwgdHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnR5QWNjZXNzb3JzYCBzbyB0aGF0IHByb3BlcnR5IGFjY2Vzc29yCiAgICAgICAqIHNpZGUgZWZmZWN0cyBhcmUgbm90IGVuYWJsZWQgdW50aWwgYWZ0ZXIgY2xpZW50IGRvbSBpcyBmdWxseSByZWFkeS4KICAgICAgICogQWxzbyBjYWxscyBgX2ZsdXNoQ2xpZW50c2AgY2FsbGJhY2sgdG8gZW5zdXJlIGNsaWVudCBkb20gaXMgZW5hYmxlZAogICAgICAgKiB0aGF0IHdhcyBub3QgZW5hYmxlZCBhcyBhIHJlc3VsdCBvZiBmbHVzaGluZyBwcm9wZXJ0aWVzLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIC8vIEl0IGlzIGltcG9ydGFudCB0aGF0IGBzdXBlci5yZWFkeSgpYCBpcyBub3QgY2FsbGVkIGhlcmUgYXMgaXQKICAgICAgICAvLyBpbW1lZGlhdGVseSB0dXJucyBvbiBhY2Nlc3NvcnMuIEluc3RlYWQsIHdlIHdhaXQgdW50aWwgYHJlYWR5Q2xpZW50c2AKICAgICAgICAvLyB0byBlbmFibGUgYWNjZXNzb3JzIHRvIHByb3ZpZGUgYSBndWFyYW50ZWUgdGhhdCBjbGllbnRzIGFyZSByZWFkeQogICAgICAgIC8vIGJlZm9yZSBwcm9jZXNzaW5nIGFueSBhY2Nlc3NvcnMgc2lkZSBlZmZlY3RzLgogICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIC8vIElmIG5vIGRhdGEgd2FzIHBlbmRpbmcsIGBfZmx1c2hQcm9wZXJ0aWVzYCB3aWxsIG5vdCBgZmx1c2hDbGllbnRzYAogICAgICAgIC8vIHNvIGVuc3VyZSB0aGlzIGlzIGRvbmUuCiAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUNsaWVudHNSZWFkeSkgewogICAgICAgICAgdGhpcy5fZmx1c2hDbGllbnRzKCk7CiAgICAgICAgfQogICAgICAgIC8vIEJlZm9yZSByZWFkeSwgY2xpZW50IG5vdGlmaWNhdGlvbnMgZG8gbm90IHRyaWdnZXIgX2ZsdXNoUHJvcGVydGllcy4KICAgICAgICAvLyBUaGVyZWZvcmUgYSBmbHVzaCBpcyBuZWNlc3NhcnkgaGVyZSBpZiBkYXRhIGhhcyBiZWVuIHNldC4KICAgICAgICBpZiAodGhpcy5fX2RhdGFQZW5kaW5nKSB7CiAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJbXBsZW1lbnRzIGBQcm9wZXJ0eUFjY2Vzc29yc2AncyBwcm9wZXJ0aWVzIGNoYW5nZWQgY2FsbGJhY2suCiAgICAgICAqCiAgICAgICAqIFJ1bnMgZWFjaCBjbGFzcyBvZiBlZmZlY3RzIGZvciB0aGUgYmF0Y2ggb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIGluCiAgICAgICAqIGEgc3BlY2lmaWMgb3JkZXIgKGNvbXB1dGUsIHByb3BhZ2F0ZSwgcmVmbGVjdCwgb2JzZXJ2ZSwgbm90aWZ5KS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50UHJvcHMgQmFnIG9mIGFsbCBjdXJyZW50IGFjY2Vzc29yIHZhbHVlcwogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAqICAgY2FsbCB0byBgX3Byb3BlcnRpZXNDaGFuZ2VkYAogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3Byb3BlcnRpZXNDaGFuZ2VkKGN1cnJlbnRQcm9wcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcykgewogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyBsZXQgYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGNoYW5nZWRQcm9wcyB8fCB7fSk7CiAgICAgICAgLy8gd2luZG93LmRlYnVnICYmIGNvbnNvbGUuZ3JvdXAodGhpcy5sb2NhbE5hbWUgKyAnIycgKyB0aGlzLmlkICsgJzogJyArIGMpOwogICAgICAgIC8vIGlmICh3aW5kb3cuZGVidWcpIHsgZGVidWdnZXI7IH0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgbGV0IGhhc1BhdGhzID0gdGhpcy5fX2RhdGFIYXNQYXRoczsKICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gZmFsc2U7CiAgICAgICAgLy8gQ29tcHV0ZSBwcm9wZXJ0aWVzCiAgICAgICAgcnVuQ29tcHV0ZWRFZmZlY3RzKHRoaXMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBDbGVhciBub3RpZnkgcHJvcGVydGllcyBwcmlvciB0byBwb3NzaWJsZSByZWVudHJ5IChwcm9wYWdhdGUsIG9ic2VydmUpLAogICAgICAgIC8vIGJ1dCBhZnRlciBjb21wdXRpbmcgZWZmZWN0cyBoYXZlIGEgY2hhbmNlIHRvIGFkZCB0byB0aGVtCiAgICAgICAgbGV0IG5vdGlmeVByb3BzID0gdGhpcy5fX2RhdGFUb05vdGlmeTsKICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gbnVsbDsKICAgICAgICAvLyBQcm9wYWdhdGUgcHJvcGVydGllcyB0byBjbGllbnRzCiAgICAgICAgdGhpcy5fcHJvcGFnYXRlUHJvcGVydHlDaGFuZ2VzKGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBGbHVzaCBjbGllbnRzCiAgICAgICAgdGhpcy5fZmx1c2hDbGllbnRzKCk7CiAgICAgICAgLy8gUmVmbGVjdCBwcm9wZXJ0aWVzCiAgICAgICAgcnVuRWZmZWN0cyh0aGlzLCB0aGlzW1RZUEVTLlJFRkxFQ1RdLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgLy8gT2JzZXJ2ZSBwcm9wZXJ0aWVzCiAgICAgICAgcnVuRWZmZWN0cyh0aGlzLCB0aGlzW1RZUEVTLk9CU0VSVkVdLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgLy8gTm90aWZ5IHByb3BlcnRpZXMgdG8gaG9zdAogICAgICAgIGlmIChub3RpZnlQcm9wcykgewogICAgICAgICAgcnVuTm90aWZ5RWZmZWN0cyh0aGlzLCBub3RpZnlQcm9wcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIH0KICAgICAgICAvLyBDbGVhciB0ZW1wb3JhcnkgY2FjaGUgYXQgZW5kIG9mIHR1cm4KICAgICAgICBpZiAodGhpcy5fX2RhdGFDb3VudGVyID09IDEpIHsKICAgICAgICAgIHRoaXMuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIH0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgLy8gd2luZG93LmRlYnVnICYmIGNvbnNvbGUuZ3JvdXBFbmQodGhpcy5sb2NhbE5hbWUgKyAnIycgKyB0aGlzLmlkICsgJzogJyArIGMpOwogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB0byBwcm9wYWdhdGUgYW55IHByb3BlcnR5IGNoYW5nZXMgdG8gc3RhbXBlZCB0ZW1wbGF0ZSBub2RlcwogICAgICAgKiBtYW5hZ2VkIGJ5IHRoaXMgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfcHJvcGFnYXRlUHJvcGVydHlDaGFuZ2VzKGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAgICAgaWYgKHRoaXNbVFlQRVMuUFJPUEFHQVRFXSkgewogICAgICAgICAgcnVuRWZmZWN0cyh0aGlzLCB0aGlzW1RZUEVTLlBST1BBR0FURV0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICB9CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgICAgd2hpbGUgKHRlbXBsYXRlSW5mbykgewogICAgICAgICAgcnVuRWZmZWN0cyh0aGlzLCB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLAogICAgICAgICAgICBoYXNQYXRocywgdGVtcGxhdGVJbmZvLm5vZGVMaXN0KTsKICAgICAgICAgIHRlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFsaWFzZXMgb25lIGRhdGEgcGF0aCBhcyBhbm90aGVyLCBzdWNoIHRoYXQgcGF0aCBub3RpZmljYXRpb25zIGZyb20gb25lCiAgICAgICAqIGFyZSByb3V0ZWQgdG8gdGhlIG90aGVyLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gdG8gVGFyZ2V0IHBhdGggdG8gbGluay4KICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IGZyb20gU291cmNlIHBhdGggdG8gbGluay4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgbGlua1BhdGhzKHRvLCBmcm9tKSB7CiAgICAgICAgdG8gPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKHRvKTsKICAgICAgICBmcm9tID0gUG9seW1lci5QYXRoLm5vcm1hbGl6ZShmcm9tKTsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzID0gdGhpcy5fX2RhdGFMaW5rZWRQYXRocyB8fCB7fTsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzW3RvXSA9IGZyb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGEgZGF0YSBwYXRoIGFsaWFzIHByZXZpb3VzbHkgZXN0YWJsaXNoZWQgd2l0aCBgX2xpbmtQYXRoc2AuCiAgICAgICAqCiAgICAgICAqIE5vdGUsIHRoZSBwYXRoIHRvIHVubGluayBzaG91bGQgYmUgdGhlIHRhcmdldCAoYHRvYCkgdXNlZCB3aGVuCiAgICAgICAqIGxpbmtpbmcgdGhlIHBhdGhzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBUYXJnZXQgcGF0aCB0byB1bmxpbmsuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHVubGlua1BhdGhzKHBhdGgpIHsKICAgICAgICBwYXRoID0gUG9seW1lci5QYXRoLm5vcm1hbGl6ZShwYXRoKTsKICAgICAgICBpZiAodGhpcy5fX2RhdGFMaW5rZWRQYXRocykgewogICAgICAgICAgZGVsZXRlIHRoaXMuX19kYXRhTGlua2VkUGF0aHNbcGF0aF07CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogTm90aWZ5IHRoYXQgYW4gYXJyYXkgaGFzIGNoYW5nZWQuCiAgICAgICAqCiAgICAgICAqIEV4YW1wbGU6CiAgICAgICAqCiAgICAgICAqICAgICB0aGlzLml0ZW1zID0gWyB7bmFtZTogJ0ppbSd9LCB7bmFtZTogJ1RvZGQnfSwge25hbWU6ICdCaWxsJ30gXTsKICAgICAgICogICAgIC4uLgogICAgICAgKiAgICAgdGhpcy5pdGVtcy5zcGxpY2UoMSwgMSwge25hbWU6ICdTYW0nfSk7CiAgICAgICAqICAgICB0aGlzLml0ZW1zLnB1c2goe25hbWU6ICdCb2InfSk7CiAgICAgICAqICAgICB0aGlzLm5vdGlmeVNwbGljZXMoJ2l0ZW1zJywgWwogICAgICAgKiAgICAgICB7IGluZGV4OiAxLCByZW1vdmVkOiBbe25hbWU6ICdUb2RkJ31dLCBhZGRlZENvdW50OiAxLCBvYmplY3Q6IHRoaXMuaXRlbXMsIHR5cGU6ICdzcGxpY2UnIH0sCiAgICAgICAqICAgICAgIHsgaW5kZXg6IDMsIHJlbW92ZWQ6IFtdLCBhZGRlZENvdW50OiAxLCBvYmplY3Q6IHRoaXMuaXRlbXMsIHR5cGU6ICdzcGxpY2UnfQogICAgICAgKiAgICAgXSk7CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdGhhdCBzaG91bGQgYmUgbm90aWZpZWQuCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHNwbGljZXMgQXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMgaW5kaWNhdGluZyBvcmRlcmVkCiAgICAgICAqICAgY2hhbmdlcyB0aGF0IG9jY3VycmVkIHRvIHRoZSBhcnJheS4gRWFjaCByZWNvcmQgc2hvdWxkIGhhdmUgdGhlCiAgICAgICAqICAgZm9sbG93aW5nIGZpZWxkczoKICAgICAgICogICAgKiBpbmRleDogaW5kZXggYXQgd2hpY2ggdGhlIGNoYW5nZSBvY2N1cnJlZAogICAgICAgKiAgICAqIHJlbW92ZWQ6IGFycmF5IG9mIGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkIGZyb20gdGhpcyBpbmRleAogICAgICAgKiAgICAqIGFkZGVkQ291bnQ6IG51bWJlciBvZiBuZXcgaXRlbXMgYWRkZWQgYXQgdGhpcyBpbmRleAogICAgICAgKiAgICAqIG9iamVjdDogYSByZWZlcmVuY2UgdG8gdGhlIGFycmF5IGluIHF1ZXN0aW9uCiAgICAgICAqICAgICogdHlwZTogdGhlIHN0cmluZyBsaXRlcmFsICdzcGxpY2UnCiAgICAgICAqCiAgICAgICAqICAgTm90ZSB0aGF0IHNwbGljZSByZWNvcmRzIF9tdXN0XyBiZSBub3JtYWxpemVkIHN1Y2ggdGhhdCB0aGV5IGFyZQogICAgICAgKiAgIHJlcG9ydGVkIGluIGluZGV4IG9yZGVyIChyYXcgcmVzdWx0cyBmcm9tIGBPYmplY3Qub2JzZXJ2ZWAgYXJlIG5vdAogICAgICAgKiAgIG9yZGVyZWQgYW5kIG11c3QgYmUgbm9ybWFsaXplZC9tZXJnZWQgYmVmb3JlIG5vdGlmeWluZykuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgKi8KICAgICAgbm90aWZ5U3BsaWNlcyhwYXRoLCBzcGxpY2VzKSB7CiAgICAgICAgbGV0IGluZm8gPSB7cGF0aDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIG5vdGlmeVNwbGljZXModGhpcywgYXJyYXksIGluZm8ucGF0aCwgc3BsaWNlcyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHJlYWRpbmcgYSB2YWx1ZSBmcm9tIGEgcGF0aC4KICAgICAgICoKICAgICAgICogTm90ZSwgaWYgYW55IHBhcnQgaW4gdGhlIHBhdGggaXMgdW5kZWZpbmVkLCB0aGlzIG1ldGhvZCByZXR1cm5zCiAgICAgICAqIGB1bmRlZmluZWRgICh0aGlzIG1ldGhvZCBkb2VzIG5vdCB0aHJvdyB3aGVuIGRlcmVmZXJlbmNpbmcgdW5kZWZpbmVkCiAgICAgICAqIHBhdGhzKS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsoc3RyaW5nfCFBcnJheTwoc3RyaW5nfG51bWJlcik+KX0gcGF0aCBQYXRoIHRvIHRoZSB2YWx1ZQogICAgICAgKiAgIHRvIHJlYWQuICBUaGUgcGF0aCBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChlLmcuIGBmb28uYmFyLmJhemApCiAgICAgICAqICAgb3IgYW4gYXJyYXkgb2YgcGF0aCBwYXJ0cyAoZS5nLiBgWydmb28uYmFyJywgJ2JheiddYCkuICBOb3RlIHRoYXQKICAgICAgICogICBicmFja2V0ZWQgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQ7IHN0cmluZy1iYXNlZCBwYXRoIHBhcnRzCiAgICAgICAqICAgKm11c3QqIGJlIHNlcGFyYXRlZCBieSBkb3RzLiAgTm90ZSB0aGF0IHdoZW4gZGVyZWZlcmVuY2luZyBhcnJheQogICAgICAgKiAgIGluZGljZXMsIHRoZSBpbmRleCBtYXkgYmUgdXNlZCBhcyBhIGRvdHRlZCBwYXJ0IGRpcmVjdGx5CiAgICAgICAqICAgKGUuZy4gYHVzZXJzLjEyLm5hbWVgIG9yIGBbJ3VzZXJzJywgMTIsICduYW1lJ11gKS4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSByb290IFJvb3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHBhdGggaXMgZXZhbHVhdGVkLgogICAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSBhdCB0aGUgcGF0aCwgb3IgYHVuZGVmaW5lZGAgaWYgYW55IHBhcnQgb2YgdGhlIHBhdGgKICAgICAgICogICBpcyB1bmRlZmluZWQuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIGdldChwYXRoLCByb290KSB7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuUGF0aC5nZXQocm9vdCB8fCB0aGlzLCBwYXRoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBhIHZhbHVlIHRvIGEgcGF0aCBhbmQgbm90aWZ5aW5nIGFueQogICAgICAgKiBlbGVtZW50cyBib3VuZCB0byB0aGUgc2FtZSBwYXRoLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiBhbnkgcGFydCBpbiB0aGUgcGF0aCBleGNlcHQgZm9yIHRoZSBsYXN0IGlzIHVuZGVmaW5lZCwKICAgICAgICogdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nICh0aGlzIG1ldGhvZCBkb2VzIG5vdCB0aHJvdyB3aGVuCiAgICAgICAqIGRlcmVmZXJlbmNpbmcgdW5kZWZpbmVkIHBhdGhzKS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsoc3RyaW5nfCFBcnJheTwoc3RyaW5nfG51bWJlcik+KX0gcGF0aCBQYXRoIHRvIHRoZSB2YWx1ZQogICAgICAgKiAgIHRvIHdyaXRlLiAgVGhlIHBhdGggbWF5IGJlIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoZS5nLiBgJ2Zvby5iYXIuYmF6J2ApCiAgICAgICAqICAgb3IgYW4gYXJyYXkgb2YgcGF0aCBwYXJ0cyAoZS5nLiBgWydmb28uYmFyJywgJ2JheiddYCkuICBOb3RlIHRoYXQKICAgICAgICogICBicmFja2V0ZWQgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQ7IHN0cmluZy1iYXNlZCBwYXRoIHBhcnRzCiAgICAgICAqICAgKm11c3QqIGJlIHNlcGFyYXRlZCBieSBkb3RzLiAgTm90ZSB0aGF0IHdoZW4gZGVyZWZlcmVuY2luZyBhcnJheQogICAgICAgKiAgIGluZGljZXMsIHRoZSBpbmRleCBtYXkgYmUgdXNlZCBhcyBhIGRvdHRlZCBwYXJ0IGRpcmVjdGx5CiAgICAgICAqICAgKGUuZy4gYCd1c2Vycy4xMi5uYW1lJ2Agb3IgYFsndXNlcnMnLCAxMiwgJ25hbWUnXWApLgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCBhdCB0aGUgc3BlY2lmaWVkIHBhdGguCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gcm9vdCBSb290IG9iamVjdCBmcm9tIHdoaWNoIHRoZSBwYXRoIGlzIGV2YWx1YXRlZC4KICAgICAgICogICBXaGVuIHNwZWNpZmllZCwgbm8gbm90aWZpY2F0aW9uIHdpbGwgb2NjdXIuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgKi8KICAgICAgc2V0KHBhdGgsIHZhbHVlLCByb290KSB7CiAgICAgICAgaWYgKHJvb3QpIHsKICAgICAgICAgIFBvbHltZXIuUGF0aC5zZXQocm9vdCwgcGF0aCwgdmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIXRoaXNbVFlQRVMuUkVBRF9PTkxZXSB8fCAhdGhpc1tUWVBFUy5SRUFEX09OTFldWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyhwYXRoKV0pIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCB2YWx1ZSwgdHJ1ZSkpIHsKICAgICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQWRkcyBpdGVtcyBvbnRvIHRoZSBlbmQgb2YgdGhlIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICoKICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucHVzaGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIHB1c2ggb250byBhcnJheQogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IE5ldyBsZW5ndGggb2YgdGhlIGFycmF5LgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBwdXNoKHBhdGgsIC4uLml0ZW1zKSB7CiAgICAgICAgbGV0IGluZm8gPSB7cGF0aDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9Ki8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IGxlbiA9IGFycmF5Lmxlbmd0aDsKICAgICAgICBsZXQgcmV0ID0gYXJyYXkucHVzaCguLi5pdGVtcyk7CiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCkgewogICAgICAgICAgbm90aWZ5U3BsaWNlKHRoaXMsIGFycmF5LCBpbmZvLnBhdGgsIGxlbiwgaXRlbXMubGVuZ3RoLCBbXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgZW5kIG9mIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICoKICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucG9wYC4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgb3RoZXIgcGF0aHMgdG8gdGhlIHNhbWUgYXJyYXkgdGhhdCBhCiAgICAgICAqIHNwbGljZSBvY2N1cnJlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gYXJyYXkuCiAgICAgICAqIEByZXR1cm4geyp9IEl0ZW0gdGhhdCB3YXMgcmVtb3ZlZC4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgcG9wKHBhdGgpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IGhhZExlbmd0aCA9IEJvb2xlYW4oYXJyYXkubGVuZ3RoKTsKICAgICAgICBsZXQgcmV0ID0gYXJyYXkucG9wKCk7CiAgICAgICAgaWYgKGhhZExlbmd0aCkgewogICAgICAgICAgbm90aWZ5U3BsaWNlKHRoaXMsIGFycmF5LCBpbmZvLnBhdGgsIGFycmF5Lmxlbmd0aCwgMCwgW3JldF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3RhcnRpbmcgZnJvbSB0aGUgc3RhcnQgaW5kZXggc3BlY2lmaWVkLCByZW1vdmVzIDAgb3IgbW9yZSBpdGVtcwogICAgICAgKiBmcm9tIHRoZSBhcnJheSBhbmQgaW5zZXJ0cyAwIG9yIG1vcmUgbmV3IGl0ZW1zIGluIHRoZWlyIHBsYWNlLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IEluZGV4IGZyb20gd2hpY2ggdG8gc3RhcnQgcmVtb3ZpbmcvaW5zZXJ0aW5nLgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsZXRlQ291bnQgTnVtYmVyIG9mIGl0ZW1zIHRvIHJlbW92ZS4KICAgICAgICogQHBhcmFtIHsuLi4qfSBpdGVtcyBJdGVtcyB0byBpbnNlcnQgaW50byBhcnJheS4KICAgICAgICogQHJldHVybiB7QXJyYXl9IEFycmF5IG9mIHJlbW92ZWQgaXRlbXMuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNwbGljZShwYXRoLCBzdGFydCwgZGVsZXRlQ291bnQsIC4uLml0ZW1zKSB7CiAgICAgICAgbGV0IGluZm8gPSB7cGF0aCA6ICcnfTsKICAgICAgICBsZXQgYXJyYXkgPSAvKiogQHR5cGUge0FycmF5fSAqLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICAvLyBOb3JtYWxpemUgZmFuY3kgbmF0aXZlIHNwbGljZSBoYW5kbGluZyBvZiBjcmF6eSBzdGFydCB2YWx1ZXMKICAgICAgICBpZiAoc3RhcnQgPCAwKSB7CiAgICAgICAgICBzdGFydCA9IGFycmF5Lmxlbmd0aCAtIE1hdGguZmxvb3IoLXN0YXJ0KTsKICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0KSB7CiAgICAgICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnQpOwogICAgICAgIH0KICAgICAgICAvLyBhcnJheS5zcGxpY2UgZG9lcyBkaWZmZXJlbnQgdGhpbmdzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzCiAgICAgICAgLy8geW91IHBhc3MgaW4uIFRoZXJlZm9yZSwgYXJyYXkuc3BsaWNlKDApIGFuZCBhcnJheS5zcGxpY2UoMCwgdW5kZWZpbmVkKQogICAgICAgIC8vIGRvIGRpZmZlcmVudCB0aGluZ3MuIEluIHRoZSBmb3JtZXIsIHRoZSB3aG9sZSBhcnJheSBpcyBjbGVhcmVkLiBJbiB0aGUKICAgICAgICAvLyBsYXR0ZXIsIG5vIGl0ZW1zIGFyZSByZW1vdmVkLgogICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGRldGVjdCB3aGV0aGVyIDEuIG9uZSBvZiB0aGUgYXJndW1lbnRzCiAgICAgICAgLy8gaXMgYWN0dWFsbHkgcGFzc2VkIGluIGFuZCB0aGVuIDIuIGRldGVybWluZSBob3cgbWFueSBhcmd1bWVudHMKICAgICAgICAvLyB3ZSBzaG91bGQgcGFzcyBvbiB0byB0aGUgbmF0aXZlIGFycmF5LnNwbGljZQogICAgICAgIC8vCiAgICAgICAgbGV0IHJldDsKICAgICAgICAvLyBPbWl0IGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBpZiB0aGV5IHdlcmUgbm90IHBhc3NlZCBpbgogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICByZXQgPSBhcnJheS5zcGxpY2Uoc3RhcnQpOwogICAgICAgIC8vIEVpdGhlciBzdGFydCB3YXMgdW5kZWZpbmVkIGFuZCB0aGUgb3RoZXJzIHdlcmUgZGVmaW5lZCwgYnV0IGluIHRoaXMKICAgICAgICAvLyBjYXNlIHdlIGNhbiBzYWZlbHkgcGFzcyBvbiBhbGwgYXJndW1lbnRzCiAgICAgICAgLy8KICAgICAgICAvLyBOb3RlOiB0aGlzIGluY2x1ZGVzIHRoZSBjYXNlIHdoZXJlIG5vbmUgb2YgdGhlIGFyZ3VtZW50cyB3ZXJlIHBhc3NlZCBpbiwKICAgICAgICAvLyBlLmcuIHRoaXMuc3BsaWNlKCdhcnJheScpLiBIb3dldmVyLCBpZiBib3RoIHN0YXJ0IGFuZCBkZWxldGVDb3VudAogICAgICAgIC8vIGFyZSB1bmRlZmluZWQsIGFycmF5LnNwbGljZSB3aWxsIG5vdCBtb2RpZnkgdGhlIGFycmF5IChhcyBleHBlY3RlZCkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0ID0gYXJyYXkuc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCwgLi4uaXRlbXMpOwogICAgICAgIH0KICAgICAgICAvLyBBdCB0aGUgZW5kLCBjaGVjayB3aGV0aGVyIGFueSBpdGVtcyB3ZXJlIHBhc3NlZCBpbiAoZS5nLiBpbnNlcnRpb25zKQogICAgICAgIC8vIG9yIGlmIHRoZSByZXR1cm4gYXJyYXkgY29udGFpbnMgaXRlbXMgKGUuZy4gZGVsZXRpb25zKS4KICAgICAgICAvLyBPbmx5IG5vdGlmeSBpZiBpdGVtcyB3ZXJlIGFkZGVkIG9yIGRlbGV0ZWQuCiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCB8fCByZXQubGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgc3RhcnQsIGl0ZW1zLmxlbmd0aCwgcmV0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wb3BgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHJldHVybiB7Kn0gSXRlbSB0aGF0IHdhcyByZW1vdmVkLgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBzaGlmdChwYXRoKSB7CiAgICAgICAgbGV0IGluZm8gPSB7cGF0aDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIGxldCBoYWRMZW5ndGggPSBCb29sZWFuKGFycmF5Lmxlbmd0aCk7CiAgICAgICAgbGV0IHJldCA9IGFycmF5LnNoaWZ0KCk7CiAgICAgICAgaWYgKGhhZExlbmd0aCkgewogICAgICAgICAgbm90aWZ5U3BsaWNlKHRoaXMsIGFycmF5LCBpbmZvLnBhdGgsIDAsIDAsIFtyZXRdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgaXRlbXMgb250byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheSBhdCB0aGUgcGF0aCBzcGVjaWZpZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnB1c2hgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHBhcmFtIHsuLi4qfSBpdGVtcyBJdGVtcyB0byBpbnNlcnQgaW5mbyBhcnJheQogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IE5ldyBsZW5ndGggb2YgdGhlIGFycmF5LgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICB1bnNoaWZ0KHBhdGgsIC4uLml0ZW1zKSB7CiAgICAgICAgbGV0IGluZm8gPSB7cGF0aDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIGxldCByZXQgPSBhcnJheS51bnNoaWZ0KC4uLml0ZW1zKTsKICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgMCwgaXRlbXMubGVuZ3RoLCBbXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOb3RpZnkgdGhhdCBhIHBhdGggaGFzIGNoYW5nZWQuCiAgICAgICAqCiAgICAgICAqIEV4YW1wbGU6CiAgICAgICAqCiAgICAgICAqICAgICB0aGlzLml0ZW0udXNlci5uYW1lID0gJ0JvYic7CiAgICAgICAqICAgICB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW0udXNlci5uYW1lJyk7CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdGhhdCBzaG91bGQgYmUgbm90aWZpZWQuCiAgICAgICAqIEBwYXJhbSB7Kj19IHZhbHVlIFZhbHVlIGF0IHRoZSBwYXRoIChvcHRpb25hbCkuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgKi8KICAgICAgbm90aWZ5UGF0aChwYXRoLCB2YWx1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIGxldCBwcm9wUGF0aDsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAvLyBHZXQgdmFsdWUgaWYgbm90IHN1cHBsaWVkCiAgICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbyk7CiAgICAgICAgICBwcm9wUGF0aCA9IGluZm8ucGF0aDsKICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICAgIC8vIE5vcm1hbGl6ZSBwYXRoIGlmIG5lZWRlZAogICAgICAgICAgcHJvcFBhdGggPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKHBhdGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcm9wUGF0aCA9IC8qKiBAdHlwZXtzdHJpbmd9ICovKHBhdGgpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHByb3BQYXRoLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSkpIHsKICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZVJlYWRPbmx5UHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBwcm90ZWN0ZWRTZXR0ZXIgQ3JlYXRlcyBhIGN1c3RvbSBwcm90ZWN0ZWQgc2V0dGVyCiAgICAgICAqICAgd2hlbiBgdHJ1ZWAuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9jcmVhdGVSZWFkT25seVByb3BlcnR5KHByb3BlcnR5LCBwcm90ZWN0ZWRTZXR0ZXIpIHsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgICBpZiAocHJvdGVjdGVkU2V0dGVyKSB7CiAgICAgICAgICB0aGlzWydfc2V0JyArIHVwcGVyKHByb3BlcnR5KV0gPSAvKiogQHRoaXMge1Byb3BlcnR5RWZmZWN0c30gKi9mdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlUHJvcGVydHlPYnNlcnZlcmAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9uKCosKil9IG1ldGhvZCBGdW5jdGlvbiBvciBuYW1lIG9mIG9ic2VydmVyIG1ldGhvZCB0byBjYWxsCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGR5bmFtaWNGbiBXaGV0aGVyIHRoZSBtZXRob2QgbmFtZSBzaG91bGQgYmUgaW5jbHVkZWQgYXMKICAgICAgICogICBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIocHJvcGVydHksIG1ldGhvZCwgZHluYW1pY0ZuKSB7CiAgICAgICAgbGV0IGluZm8gPSB7IHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbjogQm9vbGVhbihkeW5hbWljRm4pIH07CiAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLk9CU0VSVkUsIHsKICAgICAgICAgIGZuOiBydW5PYnNlcnZlckVmZmVjdCwgaW5mbywgdHJpZ2dlcjoge25hbWU6IHByb3BlcnR5fQogICAgICAgIH0pOwogICAgICAgIGlmIChkeW5hbWljRm4pIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyhtZXRob2QpLCBUWVBFUy5PQlNFUlZFLCB7CiAgICAgICAgICAgIGZuOiBydW5PYnNlcnZlckVmZmVjdCwgaW5mbywgdHJpZ2dlcjoge25hbWU6IG1ldGhvZH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVNZXRob2RPYnNlcnZlcmAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIE1ldGhvZCBleHByZXNzaW9uCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3Q9fSBkeW5hbWljRm4gQm9vbGVhbiBvciBvYmplY3QgbWFwIGluZGljYXRpbmcKICAgICAgICogICB3aGV0aGVyIG1ldGhvZCBuYW1lcyBzaG91bGQgYmUgaW5jbHVkZWQgYXMgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9jcmVhdGVNZXRob2RPYnNlcnZlcihleHByZXNzaW9uLCBkeW5hbWljRm4pIHsKICAgICAgICBsZXQgc2lnID0gcGFyc2VNZXRob2QoZXhwcmVzc2lvbik7CiAgICAgICAgaWYgKCFzaWcpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIG9ic2VydmVyIGV4cHJlc3Npb24gJyIgKyBleHByZXNzaW9uICsgIiciKTsKICAgICAgICB9CiAgICAgICAgY3JlYXRlTWV0aG9kRWZmZWN0KHRoaXMsIHNpZywgVFlQRVMuT0JTRVJWRSwgcnVuTWV0aG9kRWZmZWN0LCBudWxsLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLk5PVElGWSwgewogICAgICAgICAgZm46IHJ1bk5vdGlmeUVmZmVjdCwKICAgICAgICAgIGluZm86IHsKICAgICAgICAgICAgZXZlbnROYW1lOiBDYXNlTWFwLmNhbWVsVG9EYXNoQ2FzZShwcm9wZXJ0eSkgKyAnLWNoYW5nZWQnLAogICAgICAgICAgICBwcm9wZXJ0eTogcHJvcGVydHkKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVSZWZsZWN0ZWRQcm9wZXJ0eWAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9jcmVhdGVSZWZsZWN0ZWRQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgIGxldCBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgIGlmIChhdHRyWzBdID09PSAnLScpIHsKICAgICAgICAgIGNvbnNvbGUud2FybignUHJvcGVydHkgJyArIHByb3BlcnR5ICsgJyBjYW5ub3QgYmUgcmVmbGVjdGVkIHRvIGF0dHJpYnV0ZSAnICsKICAgICAgICAgICAgYXR0ciArICcgYmVjYXVzZSAiLSIgaXMgbm90IGEgdmFsaWQgc3RhcnRpbmcgYXR0cmlidXRlIG5hbWUuIFVzZSBhIGxvd2VyY2FzZSBmaXJzdCBsZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSBpbnN0ZWFkLicpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVGTEVDVCwgewogICAgICAgICAgICBmbjogcnVuUmVmbGVjdEVmZmVjdCwKICAgICAgICAgICAgaW5mbzogewogICAgICAgICAgICAgIGF0dHJOYW1lOiBhdHRyCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVDb21wdXRlZFByb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgY29tcHV0ZWQgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIE1ldGhvZCBleHByZXNzaW9uCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3Q9fSBkeW5hbWljRm4gQm9vbGVhbiBvciBvYmplY3QgbWFwIGluZGljYXRpbmcKICAgICAgICogICB3aGV0aGVyIG1ldGhvZCBuYW1lcyBzaG91bGQgYmUgaW5jbHVkZWQgYXMgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9jcmVhdGVDb21wdXRlZFByb3BlcnR5KHByb3BlcnR5LCBleHByZXNzaW9uLCBkeW5hbWljRm4pIHsKICAgICAgICBsZXQgc2lnID0gcGFyc2VNZXRob2QoZXhwcmVzc2lvbik7CiAgICAgICAgaWYgKCFzaWcpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIGNvbXB1dGVkIGV4cHJlc3Npb24gJyIgKyBleHByZXNzaW9uICsgIiciKTsKICAgICAgICB9CiAgICAgICAgY3JlYXRlTWV0aG9kRWZmZWN0KHRoaXMsIHNpZywgVFlQRVMuQ09NUFVURSwgcnVuQ29tcHV0ZWRFZmZlY3QsIHByb3BlcnR5LCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogR2F0aGVyIHRoZSBhcmd1bWVudCB2YWx1ZXMgZm9yIGEgbWV0aG9kIHNwZWNpZmllZCBpbiB0aGUgcHJvdmlkZWQgYXJyYXkKICAgICAgICogb2YgYXJndW1lbnQgbWV0YWRhdGEuCiAgICAgICAqCiAgICAgICAqIFRoZSBgcGF0aGAgYW5kIGB2YWx1ZWAgYXJndW1lbnRzIGFyZSB1c2VkIHRvIGZpbGwgaW4gd2lsZGNhcmQgZGVzY3JpcHRvcgogICAgICAgKiB3aGVuIHRoZSBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGFzIGEgcmVzdWx0IG9mIGEgcGF0aCBub3RpZmljYXRpb24uCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUFycmF5PCFNZXRob2RBcmc+fSBhcmdzIEFycmF5IG9mIGFyZ3VtZW50IG1ldGFkYXRhCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFByb3BlcnR5L3BhdGggbmFtZSB0aGF0IHRyaWdnZXJlZCB0aGUgbWV0aG9kIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAgICAgKiBAcmV0dXJuIHtBcnJheTwqPn0gQXJyYXkgb2YgYXJndW1lbnQgdmFsdWVzCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfbWFyc2hhbEFyZ3MoYXJncywgcGF0aCwgcHJvcHMpIHsKICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fX2RhdGE7CiAgICAgICAgbGV0IHZhbHVlcyA9IFtdOwogICAgICAgIGZvciAobGV0IGk9MCwgbD1hcmdzLmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICAgIGxldCBhcmcgPSBhcmdzW2ldOwogICAgICAgICAgbGV0IG5hbWUgPSBhcmcubmFtZTsKICAgICAgICAgIGxldCB2OwogICAgICAgICAgaWYgKGFyZy5saXRlcmFsKSB7CiAgICAgICAgICAgIHYgPSBhcmcudmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoYXJnLnN0cnVjdHVyZWQpIHsKICAgICAgICAgICAgICB2ID0gUG9seW1lci5QYXRoLmdldChkYXRhLCBuYW1lKTsKICAgICAgICAgICAgICAvLyB3aGVuIGRhdGEgaXMgbm90IHN0b3JlZCBlLmcuIGBzcGxpY2VzYAogICAgICAgICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHYgPSBwcm9wc1tuYW1lXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdiA9IGRhdGFbbmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChhcmcud2lsZGNhcmQpIHsKICAgICAgICAgICAgLy8gT25seSBzZW5kIHRoZSBhY3R1YWwgcGF0aCBjaGFuZ2VkIGluZm8gaWYgdGhlIGNoYW5nZSB0aGF0CiAgICAgICAgICAgIC8vIGNhdXNlZCB0aGUgb2JzZXJ2ZXIgdG8gcnVuIG1hdGNoZWQgdGhlIHdpbGRjYXJkCiAgICAgICAgICAgIGxldCBiYXNlQ2hhbmdlZCA9IChuYW1lLmluZGV4T2YocGF0aCArICcuJykgPT09IDApOwogICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IChwYXRoLmluZGV4T2YobmFtZSkgPT09IDAgJiYgIWJhc2VDaGFuZ2VkKTsKICAgICAgICAgICAgdmFsdWVzW2ldID0gewogICAgICAgICAgICAgIHBhdGg6IG1hdGNoZXMgPyBwYXRoIDogbmFtZSwKICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hlcyA/IHByb3BzW3BhdGhdIDogdiwKICAgICAgICAgICAgICBiYXNlOiB2CiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZXNbaV0gPSB2OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICB9CgogICAgICAvLyAtLSBzdGF0aWMgY2xhc3MgbWV0aG9kcyAtLS0tLS0tLS0tLS0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIGFuIGFjY2Vzc29yIGV4aXN0cyBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSwgYW5kIGFkZHMKICAgICAgICogdG8gYSBsaXN0IG9mICJwcm9wZXJ0eSBlZmZlY3RzIiB0aGF0IHdpbGwgcnVuIHdoZW4gdGhlIGFjY2Vzc29yIGZvcgogICAgICAgKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGlzIHNldC4gIEVmZmVjdHMgYXJlIGdyb3VwZWQgYnkgInR5cGUiLCB3aGljaAogICAgICAgKiByb3VnaGx5IGNvcnJlc3BvbmRzIHRvIGEgcGhhc2UgaW4gZWZmZWN0IHByb2Nlc3NpbmcuICBUaGUgZWZmZWN0CiAgICAgICAqIG1ldGFkYXRhIHNob3VsZCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm06CiAgICAgICAqCiAgICAgICAqICAgICB7CiAgICAgICAqICAgICAgIGZuOiBlZmZlY3RGdW5jdGlvbiwgLy8gUmVmZXJlbmNlIHRvIGZ1bmN0aW9uIHRvIGNhbGwgdG8gcGVyZm9ybSBlZmZlY3QKICAgICAgICogICAgICAgaW5mbzogeyAuLi4gfSAgICAgICAvLyBFZmZlY3QgbWV0YWRhdGEgcGFzc2VkIHRvIGZ1bmN0aW9uCiAgICAgICAqICAgICAgIHRyaWdnZXI6IHsgICAgICAgICAgLy8gT3B0aW9uYWwgdHJpZ2dlcmluZyBtZXRhZGF0YTsgaWYgbm90IHByb3ZpZGVkCiAgICAgICAqICAgICAgICAgbmFtZTogc3RyaW5nICAgICAgLy8gdGhlIHByb3BlcnR5IGlzIHRyZWF0ZWQgYXMgYSB3aWxkY2FyZAogICAgICAgKiAgICAgICAgIHN0cnVjdHVyZWQ6IGJvb2xlYW4KICAgICAgICogICAgICAgICB3aWxkY2FyZDogYm9vbGVhbgogICAgICAgKiAgICAgICB9CiAgICAgICAqICAgICB9CiAgICAgICAqCiAgICAgICAqIEVmZmVjdHMgYXJlIGNhbGxlZCBmcm9tIGBfcHJvcGVydGllc0NoYW5nZWRgIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgYnkKICAgICAgICogdHlwZToKICAgICAgICoKICAgICAgICogMS4gQ09NUFVURQogICAgICAgKiAyLiBQUk9QQUdBVEUKICAgICAgICogMy4gUkVGTEVDVAogICAgICAgKiA0LiBPQlNFUlZFCiAgICAgICAqIDUuIE5PVElGWQogICAgICAgKgogICAgICAgKiBFZmZlY3QgZnVuY3Rpb25zIGFyZSBjYWxsZWQgd2l0aCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKICAgICAgICoKICAgICAgICogICAgIGVmZmVjdEZ1bmN0aW9uKGluc3QsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMpCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgRWZmZWN0IHR5cGUsIGZyb20gdGhpcy5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYSBzaW5nbGUtcHJvcGVydHkgb2JzZXJ2ZXIgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oKiwqKX0gbWV0aG9kIEZ1bmN0aW9uIG9yIG5hbWUgb2Ygb2JzZXJ2ZXIgbWV0aG9kIHRvIGNhbGwKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZHluYW1pY0ZuIFdoZXRoZXIgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBhcwogICAgICAgKiAgIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIG11bHRpLXByb3BlcnR5ICJtZXRob2Qgb2JzZXJ2ZXIiIGJhc2VkIG9uIHRoZSBwcm92aWRlZAogICAgICAgKiBleHByZXNzaW9uLCB3aGljaCBzaG91bGQgYmUgYSBzdHJpbmcgaW4gdGhlIGZvcm0gb2YgYSBub3JtYWwgSmF2YVNjcmlwdAogICAgICAgKiBmdW5jdGlvbiBzaWduYXR1cmU6IGAnbWV0aG9kTmFtZShhcmcxLCBbLi4uLCBhcmduXSknYC4gIEVhY2ggYXJndW1lbnQKICAgICAgICogc2hvdWxkIGNvcnJlc3BvbmQgdG8gYSBwcm9wZXJ0eSBvciBwYXRoIGluIHRoZSBjb250ZXh0IG9mIHRoaXMKICAgICAgICogcHJvdG90eXBlIChvciBpbnN0YW5jZSksIG9yIG1heSBiZSBhIGxpdGVyYWwgc3RyaW5nIG9yIG51bWJlci4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVNZXRob2RPYnNlcnZlcihleHByZXNzaW9uLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2F1c2VzIHRoZSBzZXR0ZXIgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSB0byBkaXNwYXRjaCBgPHByb3BlcnR5Pi1jaGFuZ2VkYAogICAgICAgKiBldmVudHMgdG8gbm90aWZ5IG9mIGNoYW5nZXMgdG8gdGhlIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBhY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBUbyBzZXQgdGhlIHByb3BlcnR5LCB1c2UgdGhlIHByb3RlY3RlZCBgX3NldFByb3BlcnR5YCBBUEkuCiAgICAgICAqIFRvIGNyZWF0ZSBhIGN1c3RvbSBwcm90ZWN0ZWQgc2V0dGVyIChlLmcuIGBfc2V0TXlQcm9wKClgIGZvcgogICAgICAgKiBwcm9wZXJ0eSBgbXlQcm9wYCksIHBhc3MgYHRydWVgIGZvciBgcHJvdGVjdGVkU2V0dGVyYC4KICAgICAgICoKICAgICAgICogTm90ZSwgaWYgdGhlIHByb3BlcnR5IHdpbGwgaGF2ZSBvdGhlciBwcm9wZXJ0eSBlZmZlY3RzLCB0aGlzIG1ldGhvZAogICAgICAgKiBzaG91bGQgYmUgY2FsbGVkIGZpcnN0LCBiZWZvcmUgYWRkaW5nIG90aGVyIGVmZmVjdHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHByb3RlY3RlZFNldHRlciBDcmVhdGVzIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIKICAgICAgICogICB3aGVuIGB0cnVlYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVSZWFkT25seVByb3BlcnR5KHByb3BlcnR5LCBwcm90ZWN0ZWRTZXR0ZXIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2F1c2VzIHRoZSBzZXR0ZXIgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSB0byByZWZsZWN0IHRoZSBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiB0byBhIChkYXNoLWNhc2VkKSBhdHRyaWJ1dGUgb2YgdGhlIHNhbWUgbmFtZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYSBjb21wdXRlZCBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHJlc3VsdCBvZiB0aGUKICAgICAgICogbWV0aG9kIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gYGV4cHJlc3Npb25gIGVhY2ggdGltZSBvbmUgb3IgbW9yZQogICAgICAgKiBhcmd1bWVudHMgdG8gdGhlIG1ldGhvZCBjaGFuZ2VzLiAgVGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIGEgc3RyaW5nCiAgICAgICAqIGluIHRoZSBmb3JtIG9mIGEgbm9ybWFsIEphdmFTY3JpcHQgZnVuY3Rpb24gc2lnbmF0dXJlOgogICAgICAgKiBgJ21ldGhvZE5hbWUoYXJnMSwgWy4uLiwgYXJnbl0pJ2AKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgY29tcHV0ZWQgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIE1ldGhvZCBleHByZXNzaW9uCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3Q9fSBkeW5hbWljRm4gQm9vbGVhbiBvciBvYmplY3QgbWFwIGluZGljYXRpbmcgd2hldGhlcgogICAgICAgKiAgIG1ldGhvZCBuYW1lcyBzaG91bGQgYmUgaW5jbHVkZWQgYXMgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVDb21wdXRlZFByb3BlcnR5KHByb3BlcnR5LCBleHByZXNzaW9uLCBkeW5hbWljRm4pIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eShwcm9wZXJ0eSwgZXhwcmVzc2lvbiwgZHluYW1pY0ZuKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgdG8gZW5zdXJlIGJpbmRpbmcgZWZmZWN0cyBhcmUgY3JlYXRlZAogICAgICAgKiBmb3IgdGhlbSwgYW5kIHRoZW4gZW5zdXJlcyBwcm9wZXJ0eSBhY2Nlc3NvcnMgYXJlIGNyZWF0ZWQgZm9yIGFueQogICAgICAgKiBkZXBlbmRlbnQgcHJvcGVydGllcyBpbiB0aGUgdGVtcGxhdGUuICBCaW5kaW5nIGVmZmVjdHMgZm9yIGJvdW5kCiAgICAgICAqIHRlbXBsYXRlcyBhcmUgc3RvcmVkIGluIGEgbGlua2VkIGxpc3Qgb24gdGhlIGluc3RhbmNlIHNvIHRoYXQKICAgICAgICogdGVtcGxhdGVzIGNhbiBiZSBlZmZpY2llbnRseSBzdGFtcGVkIGFuZCB1bnN0YW1wZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIGNvbnRhaW5pbmcgYmluZGluZwogICAgICAgKiAgIGJpbmRpbmdzCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgYmluZFRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICB9CgogICAgICAvLyAtLSBiaW5kaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgYmluZFRlbXBsYXRlYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBvbiB0aGUgcHJvdG90eXBlIChmb3IgcHJvdG90eXBpY2FsIHRlbXBsYXRlCiAgICAgICAqIGJpbmRpbmcsIHRvIGF2b2lkIGNyZWF0aW5nIGFjY2Vzc29ycyBldmVyeSBpbnN0YW5jZSkgb25jZSBwZXIgcHJvdG90eXBlLAogICAgICAgKiBhbmQgd2lsbCBiZSBjYWxsZWQgd2l0aCBgcnVudGltZUJpbmRpbmc6IHRydWVgIGJ5IGBfc3RhbXBUZW1wbGF0ZWAgdG8KICAgICAgICogY3JlYXRlIGFuZCBsaW5rIGFuIGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggYQogICAgICAgKiBwYXJ0aWN1bGFyIHN0YW1waW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSBjb250YWluaW5nIGJpbmRpbmcKICAgICAgICogICBiaW5kaW5ncwogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBpbnN0YW5jZUJpbmRpbmcgV2hlbiBmYWxzZSAoZGVmYXVsdCksIHBlcmZvcm1zCiAgICAgICAqICAgInByb3RvdHlwaWNhbCIgYmluZGluZyBvZiB0aGUgdGVtcGxhdGUgYW5kIG92ZXJ3cml0ZXMgYW55IHByZXZpb3VzbHkKICAgICAgICogICBib3VuZCB0ZW1wbGF0ZSBmb3IgdGhlIGNsYXNzLiBXaGVuIHRydWUgKGFzIHBhc3NlZCBmcm9tCiAgICAgICAqICAgYF9zdGFtcFRlbXBsYXRlYCksIHRoZSB0ZW1wbGF0ZSBpbmZvIGlzIGluc3RhbmNlZCBhbmQgbGlua2VkIGludG8KICAgICAgICogICB0aGUgbGlzdCBvZiBib3VuZCB0ZW1wbGF0ZXMuCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdDsgZm9yIGBydW50aW1lQmluZGluZ2AsCiAgICAgICAqICAgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdG90eXBpY2FsIHRlbXBsYXRlIGluZm8KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSwgaW5zdGFuY2VCaW5kaW5nKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IHRoaXMuY29uc3RydWN0b3IuX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIGxldCB3YXNQcmVCb3VuZCA9IHRoaXMuX190ZW1wbGF0ZUluZm8gPT0gdGVtcGxhdGVJbmZvOwogICAgICAgIC8vIE9wdGltaXphdGlvbjogc2luY2UgdGhpcyBpcyBjYWxsZWQgdHdpY2UgZm9yIHByb3RvLWJvdW5kIHRlbXBsYXRlcywKICAgICAgICAvLyBkb24ndCBhdHRlbXB0IHRvIHJlY3JlYXRlIGFjY2Vzc29ycyBpZiB0aGlzIHRlbXBsYXRlIHdhcyBwcmUtYm91bmQKICAgICAgICBpZiAoIXdhc1ByZUJvdW5kKSB7CiAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMpIHsKICAgICAgICAgICAgdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGluc3RhbmNlQmluZGluZykgewogICAgICAgICAgLy8gRm9yIGluc3RhbmNlLXRpbWUgYmluZGluZywgY3JlYXRlIGluc3RhbmNlIG9mIHRlbXBsYXRlIG1ldGFkYXRhCiAgICAgICAgICAvLyBhbmQgbGluayBpbnRvIGxpc3Qgb2YgdGVtcGxhdGVzIGlmIG5lY2Vzc2FyeQogICAgICAgICAgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLyhPYmplY3QuY3JlYXRlKHRlbXBsYXRlSW5mbykpOwogICAgICAgICAgdGVtcGxhdGVJbmZvLndhc1ByZUJvdW5kID0gd2FzUHJlQm91bmQ7CiAgICAgICAgICBpZiAoIXdhc1ByZUJvdW5kICYmIHRoaXMuX190ZW1wbGF0ZUluZm8pIHsKICAgICAgICAgICAgbGV0IGxhc3QgPSB0aGlzLl9fdGVtcGxhdGVJbmZvTGFzdCB8fCB0aGlzLl9fdGVtcGxhdGVJbmZvOwogICAgICAgICAgICB0aGlzLl9fdGVtcGxhdGVJbmZvTGFzdCA9IGxhc3QubmV4dFRlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbzsKICAgICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0gbGFzdDsKICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlSW5mbzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX190ZW1wbGF0ZUluZm8gPSB0ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGEgcHJvcGVydHkgZWZmZWN0IHRvIHRoZSBnaXZlbiB0ZW1wbGF0ZSBtZXRhZGF0YSwgd2hpY2ggaXMgcnVuCiAgICAgICAqIGF0IHRoZSAicHJvcGFnYXRlIiBzdGFnZSBvZiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCB3aGVuIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBoYXMgYmVlbiBib3VuZCB0byB0aGUgZWxlbWVudCB2aWEgYF9iaW5kVGVtcGxhdGVgLgogICAgICAgKgogICAgICAgKiBUaGUgYGVmZmVjdGAgb2JqZWN0IHNob3VsZCBtYXRjaCB0aGUgZm9ybWF0IGluIGBfYWRkUHJvcGVydHlFZmZlY3RgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIHRvIGFkZCBlZmZlY3QgdG8KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdGhhdCBzaG91bGQgdHJpZ2dlciB0aGUgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9hZGRUZW1wbGF0ZVByb3BlcnR5RWZmZWN0KHRlbXBsYXRlSW5mbywgcHJvcCwgZWZmZWN0KSB7CiAgICAgICAgbGV0IGhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9OwogICAgICAgIGhvc3RQcm9wc1twcm9wXSA9IHRydWU7CiAgICAgICAgbGV0IGVmZmVjdHMgPSB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzID0gdGVtcGxhdGVJbmZvLnByb3BlcnR5RWZmZWN0cyB8fCB7fTsKICAgICAgICBsZXQgcHJvcEVmZmVjdHMgPSBlZmZlY3RzW3Byb3BdID0gZWZmZWN0c1twcm9wXSB8fCBbXTsKICAgICAgICBwcm9wRWZmZWN0cy5wdXNoKGVmZmVjdCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdGFtcHMgdGhlIHByb3ZpZGVkIHRlbXBsYXRlIGFuZCBwZXJmb3JtcyBpbnN0YW5jZS10aW1lIHNldHVwIGZvcgogICAgICAgKiBQb2x5bWVyIHRlbXBsYXRlIGZlYXR1cmVzLCBpbmNsdWRpbmcgZGF0YSBiaW5kaW5ncywgZGVjbGFyYXRpdmUgZXZlbnQKICAgICAgICogbGlzdGVuZXJzLCBhbmQgdGhlIGB0aGlzLiRgIG1hcCBvZiBgaWRgJ3MgdG8gbm9kZXMuICBBIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAqIGlzIHJldHVybmVkIGNvbnRhaW5pbmcgdGhlIHN0YW1wZWQgRE9NLCByZWFkeSBmb3IgaW5zZXJ0aW9uIGludG8gdGhlCiAgICAgICAqIERPTS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZTsgaG93ZXZlciBub3RlIHRoYXQgZHVlIHRvCiAgICAgICAqIGBzaGFkeWNzc2AgcG9seWZpbGwgbGltaXRhdGlvbnMsIG9ubHkgc3R5bGVzIGZyb20gdGVtcGxhdGVzIHByZXBhcmVkCiAgICAgICAqIHVzaW5nIGBTaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVgIHdpbGwgYmUgY29ycmVjdGx5IHBvbHlmaWxsZWQgKHNjb3BlZAogICAgICAgKiB0byB0aGUgc2hhZG93IHJvb3QgYW5kIHN1cHBvcnQgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzKSwgYW5kIG5vdGUgdGhhdAogICAgICAgKiBgU2hhZHlDU1MucHJlcGFyZVRlbXBsYXRlYCBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgZWxlbWVudC4gQXMgc3VjaCwKICAgICAgICogYW55IHN0eWxlcyByZXF1aXJlZCBieSBpbiBydW50aW1lLXN0YW1wZWQgdGVtcGxhdGVzIG11c3QgYmUgaW5jbHVkZWQKICAgICAgICogaW4gdGhlIG1haW4gZWxlbWVudCB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gc3RhbXAKICAgICAgICogQHJldHVybiB7IVN0YW1wZWRUZW1wbGF0ZX0gQ2xvbmVkIHRlbXBsYXRlIGNvbnRlbnQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zdGFtcFRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgLy8gRW5zdXJlcyB0aGF0IGNyZWF0ZWQgZG9tIGlzIGBfZW5xdWV1ZUNsaWVudGAnZCB0byB0aGlzIGVsZW1lbnQgc28KICAgICAgICAvLyB0aGF0IGl0IGNhbiBiZSBmbHVzaGVkIG9uIG5leHQgY2FsbCB0byBgX2ZsdXNoUHJvcGVydGllc2AKICAgICAgICBob3N0U3RhY2suYmVnaW5Ib3N0aW5nKHRoaXMpOwogICAgICAgIGxldCBkb20gPSBzdXBlci5fc3RhbXBUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgaG9zdFN0YWNrLmVuZEhvc3RpbmcodGhpcyk7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IC8qKiBAdHlwZSB7IVRlbXBsYXRlSW5mb30gKi8odGhpcy5fYmluZFRlbXBsYXRlKHRlbXBsYXRlLCB0cnVlKSk7CiAgICAgICAgLy8gQWRkIHRlbXBsYXRlLWluc3RhbmNlLXNwZWNpZmljIGRhdGEgdG8gaW5zdGFuY2VkIHRlbXBsYXRlSW5mbwogICAgICAgIHRlbXBsYXRlSW5mby5ub2RlTGlzdCA9IGRvbS5ub2RlTGlzdDsKICAgICAgICAvLyBDYXB0dXJlIGNoaWxkIG5vZGVzIHRvIGFsbG93IHVuc3RhbXBpbmcgb2Ygbm9uLXByb3RvdHlwaWNhbCB0ZW1wbGF0ZXMKICAgICAgICBpZiAoIXRlbXBsYXRlSW5mby53YXNQcmVCb3VuZCkgewogICAgICAgICAgbGV0IG5vZGVzID0gdGVtcGxhdGVJbmZvLmNoaWxkTm9kZXMgPSBbXTsKICAgICAgICAgIGZvciAobGV0IG49ZG9tLmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgICBub2Rlcy5wdXNoKG4pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkb20udGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgIC8vIFNldHVwIGNvbXBvdW5kIHN0b3JhZ2UsIDItd2F5IGxpc3RlbmVycywgYW5kIGRhdGFIb3N0IGZvciBiaW5kaW5ncwogICAgICAgIHNldHVwQmluZGluZ3ModGhpcywgdGVtcGxhdGVJbmZvKTsKICAgICAgICAvLyBGbHVzaCBwcm9wZXJ0aWVzIGludG8gdGVtcGxhdGUgbm9kZXMgaWYgYWxyZWFkeSBib290ZWQKICAgICAgICBpZiAodGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgcnVuRWZmZWN0cyh0aGlzLCB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzLCB0aGlzLl9fZGF0YSwgbnVsbCwKICAgICAgICAgICAgZmFsc2UsIHRlbXBsYXRlSW5mby5ub2RlTGlzdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGFuZCB1bmJpbmRzIHRoZSBub2RlcyBwcmV2aW91c2x5IGNvbnRhaW5lZCBpbiB0aGUgcHJvdmlkZWQKICAgICAgICogRG9jdW1lbnRGcmFnbWVudCByZXR1cm5lZCBmcm9tIGBfc3RhbXBUZW1wbGF0ZWAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IVN0YW1wZWRUZW1wbGF0ZX0gZG9tIERvY3VtZW50RnJhZ21lbnQgcHJldmlvdXNseSByZXR1cm5lZAogICAgICAgKiAgIGZyb20gYF9zdGFtcFRlbXBsYXRlYCBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGVzIHRvIGJlIHJlbW92ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3JlbW92ZUJvdW5kRG9tKGRvbSkgewogICAgICAgIC8vIFVubGluayB0ZW1wbGF0ZSBpbmZvCiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IGRvbS50ZW1wbGF0ZUluZm87CiAgICAgICAgaWYgKHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbykgewogICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8gPQogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ubmV4dFRlbXBsYXRlSW5mbzsKICAgICAgICB9CiAgICAgICAgaWYgKHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ubmV4dFRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbyA9CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbzsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0ID09IHRlbXBsYXRlSW5mbykgewogICAgICAgICAgdGhpcy5fX3RlbXBsYXRlSW5mb0xhc3QgPSB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm87CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvID0gbnVsbDsKICAgICAgICAvLyBSZW1vdmUgc3RhbXBlZCBub2RlcwogICAgICAgIGxldCBub2RlcyA9IHRlbXBsYXRlSW5mby5jaGlsZE5vZGVzOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IG5vZGUgPSBub2Rlc1tpXTsKICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAqIHBhcnNpbmcgYmluZGluZ3MgZnJvbSBgVGV4dE5vZGVgJ3MnIGB0ZXh0Q29udGVudGAuICBBIGBiaW5kaW5nc2AKICAgICAgICogYXJyYXkgaXMgYWRkZWQgdG8gYG5vZGVJbmZvYCBhbmQgcG9wdWxhdGVkIHdpdGggYmluZGluZyBtZXRhZGF0YQogICAgICAgKiB3aXRoIGluZm9ybWF0aW9uIGNhcHR1cmluZyB0aGUgYmluZGluZyB0YXJnZXQsIGFuZCBhIGBwYXJ0c2AgYXJyYXkKICAgICAgICogd2l0aCBvbmUgb3IgbW9yZSBtZXRhZGF0YSBvYmplY3RzIGNhcHR1cmluZyB0aGUgc291cmNlKHMpIG9mIHRoZQogICAgICAgKiBiaW5kaW5nLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0ge05vZGVJbmZvfSBub2RlSW5mbyBOb2RlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlIG5vZGUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZCA9IHN1cGVyLl9wYXJzZVRlbXBsYXRlTm9kZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKTsKICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgICAgIGxldCBwYXJ0cyA9IHRoaXMuX3BhcnNlQmluZGluZ3Mobm9kZS50ZXh0Q29udGVudCwgdGVtcGxhdGVJbmZvKTsKICAgICAgICAgIGlmIChwYXJ0cykgewogICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSB0ZXh0Q29udGVudCB3aXRoIGFueSBsaXRlcmFsIHBhcnRzCiAgICAgICAgICAgIC8vIE5PVEU6IGRlZmF1bHQgdG8gYSBzcGFjZSBoZXJlIHNvIHRoZSB0ZXh0Tm9kZSByZW1haW5zOyBzb21lIGJyb3dzZXJzCiAgICAgICAgICAgIC8vIChJRSkgb21pdCBhbiBlbXB0eSB0ZXh0Tm9kZSBmb2xsb3dpbmcgY2xvbmVOb2RlL2ltcG9ydE5vZGUuCiAgICAgICAgICAgIG5vZGUudGV4dENvbnRlbnQgPSBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKSB8fCAnICc7CiAgICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgJ3RleHQnLCAndGV4dENvbnRlbnQnLCBwYXJ0cyk7CiAgICAgICAgICAgIG5vdGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgYFRlbXBsYXRlU3RhbXBgIGltcGxlbWVudGF0aW9uIHRvIGFkZCBzdXBwb3J0IGZvcgogICAgICAgKiBwYXJzaW5nIGJpbmRpbmdzIGZyb20gYXR0cmlidXRlcy4gIEEgYGJpbmRpbmdzYAogICAgICAgKiBhcnJheSBpcyBhZGRlZCB0byBgbm9kZUluZm9gIGFuZCBwb3B1bGF0ZWQgd2l0aCBiaW5kaW5nIG1ldGFkYXRhCiAgICAgICAqIHdpdGggaW5mb3JtYXRpb24gY2FwdHVyaW5nIHRoZSBiaW5kaW5nIHRhcmdldCwgYW5kIGEgYHBhcnRzYCBhcnJheQogICAgICAgKiB3aXRoIG9uZSBvciBtb3JlIG1ldGFkYXRhIG9iamVjdHMgY2FwdHVyaW5nIHRoZSBzb3VyY2Uocykgb2YgdGhlCiAgICAgICAqIGJpbmRpbmcuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBBdHRyaWJ1dGUgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgQXR0cmlidXRlIHZhbHVlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIG5hbWUsIHZhbHVlKSB7CiAgICAgICAgbGV0IHBhcnRzID0gdGhpcy5fcGFyc2VCaW5kaW5ncyh2YWx1ZSwgdGVtcGxhdGVJbmZvKTsKICAgICAgICBpZiAocGFydHMpIHsKICAgICAgICAgIC8vIEF0dHJpYnV0ZSBvciBwcm9wZXJ0eQogICAgICAgICAgbGV0IG9yaWdOYW1lID0gbmFtZTsKICAgICAgICAgIGxldCBraW5kID0gJ3Byb3BlcnR5JzsKICAgICAgICAgIC8vIFRoZSBvbmx5IHdheSB3ZSBzZWUgYSBjYXBpdGFsIGxldHRlciBoZXJlIGlzIGlmIHRoZSBhdHRyIGhhcwogICAgICAgICAgLy8gYSBjYXBpdGFsIGxldHRlciBpbiBpdCBwZXIgc3BlYy4gSW4gdGhpcyBjYXNlLCB0byBtYWtlIHN1cmUKICAgICAgICAgIC8vIHRoaXMgYmluZGluZyB3b3Jrcywgd2UgZ28gYWhlYWQgYW5kIG1ha2UgdGhlIGJpbmRpbmcgdG8gdGhlIGF0dHJpYnV0ZS4KICAgICAgICAgIGlmIChjYXBpdGFsQXR0cmlidXRlUmVnZXgudGVzdChuYW1lKSkgewogICAgICAgICAgICBraW5kID0gJ2F0dHJpYnV0ZSc7CiAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVbbmFtZS5sZW5ndGgtMV0gPT0gJyQnKSB7CiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIC0xKTsKICAgICAgICAgICAga2luZCA9ICdhdHRyaWJ1dGUnOwogICAgICAgICAgfQogICAgICAgICAgLy8gSW5pdGlhbGl6ZSBhdHRyaWJ1dGUgYmluZGluZ3Mgd2l0aCBhbnkgbGl0ZXJhbCBwYXJ0cwogICAgICAgICAgbGV0IGxpdGVyYWwgPSBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKTsKICAgICAgICAgIGlmIChsaXRlcmFsICYmIGtpbmQgPT0gJ2F0dHJpYnV0ZScpIHsKICAgICAgICAgICAgLy8gRW5zdXJlIGEgU2hhZHlDU1MgdGVtcGxhdGUgc2NvcGVkIHN0eWxlIGlzIG5vdCByZW1vdmVkCiAgICAgICAgICAgIC8vIHdoZW4gYSBjbGFzcyQgYmluZGluZydzIGluaXRpYWwgbGl0ZXJhbCB2YWx1ZSBpcyBzZXQuCiAgICAgICAgICAgIGlmIChuYW1lID09ICdjbGFzcycgJiYgbm9kZS5oYXNBdHRyaWJ1dGUoJ2NsYXNzJykpIHsKICAgICAgICAgICAgICBsaXRlcmFsICs9ICcgJyArIG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIGxpdGVyYWwpOwogICAgICAgICAgfQogICAgICAgICAgLy8gQ2xlYXIgYXR0cmlidXRlIGJlZm9yZSByZW1vdmluZywgc2luY2UgSUUgd29uJ3QgYWxsb3cgcmVtb3ZpbmcKICAgICAgICAgIC8vIGB2YWx1ZWAgYXR0cmlidXRlIGlmIGl0IHByZXZpb3VzbHkgaGFkIGEgdmFsdWUgKGNhbid0CiAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHkgc2V0ICcnIGJlZm9yZSByZW1vdmluZyBzaW5jZSBhdHRyaWJ1dGVzIHdpdGggYCRgCiAgICAgICAgICAvLyBjYW4ndCBiZSBzZXQgdXNpbmcgc2V0QXR0cmlidXRlKQogICAgICAgICAgaWYgKG5vZGUubG9jYWxOYW1lID09PSAnaW5wdXQnICYmIG9yaWdOYW1lID09PSAndmFsdWUnKSB7CiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG9yaWdOYW1lLCAnJyk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBSZW1vdmUgYW5ub3RhdGlvbgogICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUob3JpZ05hbWUpOwogICAgICAgICAgLy8gQ2FzZSBoYWNrZXJ5OiBhdHRyaWJ1dGVzIGFyZSBsb3dlci1jYXNlLCBidXQgYmluZCB0YXJnZXRzCiAgICAgICAgICAvLyAocHJvcGVydGllcykgYXJlIGNhc2Ugc2Vuc2l0aXZlLiBHYW1iaXQgaXMgdG8gbWFwIGRhc2gtY2FzZSB0bwogICAgICAgICAgLy8gY2FtZWwtY2FzZTogYGZvby1iYXJgIGJlY29tZXMgYGZvb0JhcmAuCiAgICAgICAgICAvLyBBdHRyaWJ1dGUgYmluZGluZ3MgYXJlIGV4Y2VwdGVkLgogICAgICAgICAgaWYgKGtpbmQgPT09ICdwcm9wZXJ0eScpIHsKICAgICAgICAgICAgbmFtZSA9IFBvbHltZXIuQ2FzZU1hcC5kYXNoVG9DYW1lbENhc2UobmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgICBhZGRCaW5kaW5nKHRoaXMsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGtpbmQsIG5hbWUsIHBhcnRzLCBsaXRlcmFsKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gc3VwZXIuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIG5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAqIGJpbmRpbmcgdGhlIHByb3BlcnRpZXMgdGhhdCBhIG5lc3RlZCB0ZW1wbGF0ZSBkZXBlbmRzIG9uIHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBhcyBgX2hvc3RfPHByb3BlcnR5PmAuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTmVzdGVkVGVtcGxhdGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZCA9IHN1cGVyLl9wYXJzZVRlbXBsYXRlTmVzdGVkVGVtcGxhdGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgICAgLy8gTWVyZ2UgaG9zdCBwcm9wcyBpbnRvIG91dGVyIHRlbXBsYXRlIGFuZCBhZGQgYmluZGluZ3MKICAgICAgICBsZXQgaG9zdFByb3BzID0gbm9kZUluZm8udGVtcGxhdGVJbmZvLmhvc3RQcm9wczsKICAgICAgICBsZXQgbW9kZSA9ICd7JzsKICAgICAgICBmb3IgKGxldCBzb3VyY2UgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICBsZXQgcGFydHMgPSBbeyBtb2RlLCBzb3VyY2UsIGRlcGVuZGVuY2llczogW3NvdXJjZV0gfV07CiAgICAgICAgICBhZGRCaW5kaW5nKHRoaXMsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sICdwcm9wZXJ0eScsICdfaG9zdF8nICsgc291cmNlLCBwYXJ0cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RlZDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB0byBwYXJzZSB0ZXh0IGluIGEgdGVtcGxhdGUgKGVpdGhlciBhdHRyaWJ1dGUgdmFsdWVzIG9yCiAgICAgICAqIHRleHRDb250ZW50KSBpbnRvIGJpbmRpbmcgbWV0YWRhdGEuCiAgICAgICAqCiAgICAgICAqIEFueSBvdmVycmlkZXMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhbiBhcnJheSBvZiBiaW5kaW5nIHBhcnQKICAgICAgICogbWV0YWRhdGEgIHJlcHJlc2VudGluZyBvbmUgb3IgbW9yZSBiaW5kaW5ncyBmb3VuZCBpbiB0aGUgcHJvdmlkZWQgdGV4dAogICAgICAgKiBhbmQgYW55ICJsaXRlcmFsIiB0ZXh0IGluIGJldHdlZW4uICBBbnkgbm9uLWxpdGVyYWwgcGFydHMgd2lsbCBiZSBwYXNzZWQKICAgICAgICogdG8gYF9ldmFsdWF0ZUJpbmRpbmdgIHdoZW4gYW55IGRlcGVuZGVuY2llcyBjaGFuZ2UuICBUaGUgb25seSByZXF1aXJlZAogICAgICAgKiBmaWVsZHMgb2YgZWFjaCAicGFydCIgaW4gdGhlIHJldHVybmVkIGFycmF5IGFyZSBhcyBmb2xsb3dzOgogICAgICAgKgogICAgICAgKiAtIGBkZXBlbmRlbmNpZXNgIC0gQXJyYXkgY29udGFpbmluZyB0cmlnZ2VyIG1ldGFkYXRhIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAqICAgdGhhdCBzaG91bGQgdHJpZ2dlciB0aGUgYmluZGluZyB0byB1cGRhdGUKICAgICAgICogLSBgbGl0ZXJhbGAgLSBTdHJpbmcgY29udGFpbmluZyB0ZXh0IGlmIHRoZSBwYXJ0IHJlcHJlc2VudHMgYSBsaXRlcmFsOwogICAgICAgKiAgIGluIHRoaXMgY2FzZSBubyBgZGVwZW5kZW5jaWVzYCBhcmUgbmVlZGVkCiAgICAgICAqCiAgICAgICAqIEFkZGl0aW9uYWwgbWV0YWRhdGEgZm9yIHVzZSBieSBgX2V2YWx1YXRlQmluZGluZ2AgbWF5IGJlIHByb3ZpZGVkIGluCiAgICAgICAqIGVhY2ggcGFydCBvYmplY3QgYXMgbmVlZGVkLgogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgYmluZGluZ3MKICAgICAgICogKG9uZSBvciBtb3JlIG1heSBiZSBpbnRlcm1peGVkIHdpdGggbGl0ZXJhbCBzdHJpbmdzKToKICAgICAgICogLSBQcm9wZXJ0eSBiaW5kaW5nOiBgW1twcm9wXV1gCiAgICAgICAqIC0gUGF0aCBiaW5kaW5nOiBgW1tvYmplY3QucHJvcF1dYAogICAgICAgKiAtIE5lZ2F0ZWQgcHJvcGVydHkgb3IgcGF0aCBiaW5kaW5nczogYFtbIXByb3BdXWAgb3IgYFtbIW9iamVjdC5wcm9wXV1gCiAgICAgICAqIC0gVHdvLXdheSBwcm9wZXJ0eSBvciBwYXRoIGJpbmRpbmdzIChzdXBwb3J0cyBuZWdhdGlvbik6CiAgICAgICAqICAgYHt7cHJvcH19YCwgYHt7b2JqZWN0LnByb3B9fWAsIGB7eyFwcm9wfX1gIG9yIGB7eyFvYmplY3QucHJvcH19YAogICAgICAgKiAtIElubGluZSBjb21wdXRlZCBtZXRob2QgKHN1cHBvcnRzIG5lZ2F0aW9uKToKICAgICAgICogICBgW1tjb21wdXRlKGEsICdsaXRlcmFsJywgYildXWAsIGBbWyFjb21wdXRlKGEsICdsaXRlcmFsJywgYildXWAKICAgICAgICoKICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdXNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgYmVzdAogICAgICAgKiBwZXJmb3JtYW5jZS4gSG93ZXZlciwgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VzIGEgd2hpdGUtbGlzdCBvZgogICAgICAgKiBhbGxvd2VkIGNoYXJhY3RlcnMgaW4gYSBkYXRhLWJpbmRpbmcsIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBmb3IKICAgICAgICogZGF0YS1iaW5kaW5ncyB0aGF0IGRvIHVzZSBjaGFyYWN0ZXJzIG5vdCBpbiB0aGlzIHdoaXRlLWxpc3QuCiAgICAgICAqCiAgICAgICAqIEluc3RlYWQgb2YgdXBkYXRpbmcgdGhlIHdoaXRlLWxpc3Qgd2l0aCBhbGwgYWxsb3dlZCBjaGFyYWN0ZXJzLAogICAgICAgKiB0aGVyZSBpcyBhIFN0cmljdEJpbmRpbmdQYXJzZXIgKHNlZSBsaWIvbWl4aW5zL3N0cmljdC1iaW5kaW5nLXBhcnNlcikKICAgICAgICogdGhhdCB1c2VzIGEgc3RhdGUgbWFjaGluZSBpbnN0ZWFkLiBUaGlzIHN0YXRlIG1hY2hpbmUgaXMgYWJsZSB0byBoYW5kbGUKICAgICAgICogYWxsIGNoYXJhY3RlcnMuIEhvd2V2ZXIsIGl0IGlzIHNsaWdodGx5IGxlc3MgcGVyZm9ybWFudCwgdGhlcmVmb3JlIHdlCiAgICAgICAqIGV4dHJhY3RlZCBpdCBpbnRvIGEgc2VwYXJhdGUgb3B0aW9uYWwgbWl4aW4uCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRleHQgdG8gcGFyc2UgZnJvbSBhdHRyaWJ1dGUgb3IgdGV4dENvbnRlbnQKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlSW5mbyBDdXJyZW50IHRlbXBsYXRlIG1ldGFkYXRhCiAgICAgICAqIEByZXR1cm4ge0FycmF5PCFCaW5kaW5nUGFydD59IEFycmF5IG9mIGJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlQmluZGluZ3ModGV4dCwgdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgbGV0IHBhcnRzID0gW107CiAgICAgICAgbGV0IGxhc3RJbmRleCA9IDA7CiAgICAgICAgbGV0IG07CiAgICAgICAgLy8gRXhhbXBsZTogImxpdGVyYWwxe3twcm9wfX1saXRlcmFsMltbIWNvbXB1dGUoZm9vLGJhcildXWZpbmFsIgogICAgICAgIC8vIFJlZ2V4IG1hdGNoZXM6CiAgICAgICAgLy8gICAgICAgIEl0ZXJhdGlvbiAxOiAgSXRlcmF0aW9uIDI6CiAgICAgICAgLy8gbVsxXTogJ3t7JyAgICAgICAgICAnW1snCiAgICAgICAgLy8gbVsyXTogJycgICAgICAgICAgICAnIScKICAgICAgICAvLyBtWzNdOiAncHJvcCcgICAgICAgICdjb21wdXRlKGZvbyxiYXIpJwogICAgICAgIHdoaWxlICgobSA9IGJpbmRpbmdSZWdleC5leGVjKHRleHQpKSAhPT0gbnVsbCkgewogICAgICAgICAgLy8gQWRkIGxpdGVyYWwgcGFydAogICAgICAgICAgaWYgKG0uaW5kZXggPiBsYXN0SW5kZXgpIHsKICAgICAgICAgICAgcGFydHMucHVzaCh7bGl0ZXJhbDogdGV4dC5zbGljZShsYXN0SW5kZXgsIG0uaW5kZXgpfSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBBZGQgYmluZGluZyBwYXJ0CiAgICAgICAgICBsZXQgbW9kZSA9IG1bMV1bMF07CiAgICAgICAgICBsZXQgbmVnYXRlID0gQm9vbGVhbihtWzJdKTsKICAgICAgICAgIGxldCBzb3VyY2UgPSBtWzNdLnRyaW0oKTsKICAgICAgICAgIGxldCBjdXN0b21FdmVudCA9IGZhbHNlLCBub3RpZnlFdmVudCA9ICcnLCBjb2xvbiA9IC0xOwogICAgICAgICAgaWYgKG1vZGUgPT0gJ3snICYmIChjb2xvbiA9IHNvdXJjZS5pbmRleE9mKCc6OicpKSA+IDApIHsKICAgICAgICAgICAgbm90aWZ5RXZlbnQgPSBzb3VyY2Uuc3Vic3RyaW5nKGNvbG9uICsgMik7CiAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoMCwgY29sb24pOwogICAgICAgICAgICBjdXN0b21FdmVudCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgc2lnbmF0dXJlID0gcGFyc2VNZXRob2Qoc291cmNlKTsKICAgICAgICAgIGxldCBkZXBlbmRlbmNpZXMgPSBbXTsKICAgICAgICAgIGlmIChzaWduYXR1cmUpIHsKICAgICAgICAgICAgLy8gSW5saW5lIGNvbXB1dGVkIGZ1bmN0aW9uCiAgICAgICAgICAgIGxldCB7YXJncywgbWV0aG9kTmFtZX0gPSBzaWduYXR1cmU7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGV0IGFyZyA9IGFyZ3NbaV07CiAgICAgICAgICAgICAgaWYgKCFhcmcubGl0ZXJhbCkgewogICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYXJnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGR5bmFtaWNGbnMgPSB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZuczsKICAgICAgICAgICAgaWYgKGR5bmFtaWNGbnMgJiYgZHluYW1pY0Zuc1ttZXRob2ROYW1lXSB8fCBzaWduYXR1cmUuc3RhdGljKSB7CiAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2gobWV0aG9kTmFtZSk7CiAgICAgICAgICAgICAgc2lnbmF0dXJlLmR5bmFtaWNGbiA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFByb3BlcnR5IG9yIHBhdGgKICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goc291cmNlKTsKICAgICAgICAgIH0KICAgICAgICAgIHBhcnRzLnB1c2goewogICAgICAgICAgICBzb3VyY2UsIG1vZGUsIG5lZ2F0ZSwgY3VzdG9tRXZlbnQsIHNpZ25hdHVyZSwgZGVwZW5kZW5jaWVzLAogICAgICAgICAgICBldmVudDogbm90aWZ5RXZlbnQKICAgICAgICAgIH0pOwogICAgICAgICAgbGFzdEluZGV4ID0gYmluZGluZ1JlZ2V4Lmxhc3RJbmRleDsKICAgICAgICB9CiAgICAgICAgLy8gQWRkIGEgZmluYWwgbGl0ZXJhbCBwYXJ0CiAgICAgICAgaWYgKGxhc3RJbmRleCAmJiBsYXN0SW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgICAgICAgbGV0IGxpdGVyYWwgPSB0ZXh0LnN1YnN0cmluZyhsYXN0SW5kZXgpOwogICAgICAgICAgaWYgKGxpdGVyYWwpIHsKICAgICAgICAgICAgcGFydHMucHVzaCh7CiAgICAgICAgICAgICAgbGl0ZXJhbDogbGl0ZXJhbAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIHBhcnRzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgdG8gZXZhbHVhdGUgYSBwcmV2aW91c2x5IHBhcnNlZCBiaW5kaW5nIHBhcnQgYmFzZWQgb24gYSBzZXQgb2YKICAgICAgICogb25lIG9yIG1vcmUgY2hhbmdlZCBkZXBlbmRlbmNpZXMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7dGhpc30gaW5zdCBFbGVtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgc2NvcGUgZm9yCiAgICAgICAqICAgYmluZGluZyBkZXBlbmRlbmNpZXMKICAgICAgICogQHBhcmFtIHtCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUHJvcGVydHkvcGF0aCB0aGF0IHRyaWdnZXJlZCB0aGlzIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFzUGF0aHMgVHJ1ZSB3aXRoIGBwcm9wc2AgY29udGFpbnMgb25lIG9yIG1vcmUgcGF0aHMKICAgICAgICogQHJldHVybiB7Kn0gVmFsdWUgdGhlIGJpbmRpbmcgcGFydCBldmFsdWF0ZWQgdG8KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9ldmFsdWF0ZUJpbmRpbmcoaW5zdCwgcGFydCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykgewogICAgICAgIGxldCB2YWx1ZTsKICAgICAgICBpZiAocGFydC5zaWduYXR1cmUpIHsKICAgICAgICAgIHZhbHVlID0gcnVuTWV0aG9kRWZmZWN0KGluc3QsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgcGFydC5zaWduYXR1cmUpOwogICAgICAgIH0gZWxzZSBpZiAocGF0aCAhPSBwYXJ0LnNvdXJjZSkgewogICAgICAgICAgdmFsdWUgPSBQb2x5bWVyLlBhdGguZ2V0KGluc3QsIHBhcnQuc291cmNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGhhc1BhdGhzICYmIFBvbHltZXIuUGF0aC5pc1BhdGgocGF0aCkpIHsKICAgICAgICAgICAgdmFsdWUgPSBQb2x5bWVyLlBhdGguZ2V0KGluc3QsIHBhdGgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsdWUgPSBpbnN0Ll9fZGF0YVtwYXRoXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBhcnQubmVnYXRlKSB7CiAgICAgICAgICB2YWx1ZSA9ICF2YWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CgogICAgfQoKICAgIC8vIG1ha2UgYSB0eXBpbmcgZm9yIGNsb3N1cmUgOlAKICAgIFByb3BlcnR5RWZmZWN0c1R5cGUgPSBQcm9wZXJ0eUVmZmVjdHM7CgogICAgcmV0dXJuIFByb3BlcnR5RWZmZWN0czsKICB9KTsKCiAgLyoqCiAgICogSGVscGVyIGFwaSBmb3IgZW5xdWV1aW5nIGNsaWVudCBkb20gY3JlYXRlZCBieSBhIGhvc3QgZWxlbWVudC4KICAgKgogICAqIEJ5IGRlZmF1bHQgZWxlbWVudHMgYXJlIGZsdXNoZWQgdmlhIGBfZmx1c2hQcm9wZXJ0aWVzYCB3aGVuCiAgICogYGNvbm5lY3RlZENhbGxiYWNrYCBpcyBjYWxsZWQuIEVsZW1lbnRzIGF0dGFjaCB0aGVpciBjbGllbnQgZG9tIHRvCiAgICogdGhlbXNlbHZlcyBhdCBgcmVhZHlgIHRpbWUgd2hpY2ggcmVzdWx0cyBmcm9tIHRoaXMgZmlyc3QgZmx1c2guCiAgICogVGhpcyBwcm92aWRlcyBhbiBvcmRlcmluZyBndWFyYW50ZWUgdGhhdCB0aGUgY2xpZW50IGRvbSBhbiBlbGVtZW50CiAgICogY3JlYXRlcyBpcyBmbHVzaGVkIGJlZm9yZSB0aGUgZWxlbWVudCBpdHNlbGYgKGkuZS4gY2xpZW50IGByZWFkeWAKICAgKiBmaXJlcyBiZWZvcmUgaG9zdCBgcmVhZHlgKS4KICAgKgogICAqIEhvd2V2ZXIsIGlmIGBfZmx1c2hQcm9wZXJ0aWVzYCBpcyBjYWxsZWQgKmJlZm9yZSogYW4gZWxlbWVudCBpcyBjb25uZWN0ZWQsCiAgICogYXMgZm9yIGV4YW1wbGUgYFRlbXBsYXRpemVgIGRvZXMsIHRoaXMgb3JkZXJpbmcgZ3VhcmFudGVlIGNhbm5vdCBiZQogICAqIHNhdGlzZmllZCBiZWNhdXNlIG5vIGVsZW1lbnRzIGFyZSBjb25uZWN0ZWQuIChOb3RlOiBCb3VuZCBlbGVtZW50cyB0aGF0CiAgICogcmVjZWl2ZSBkYXRhIGRvIGJlY29tZSBlbnF1ZXVlZCBjbGllbnRzIGFuZCBhcmUgcHJvcGVybHkgb3JkZXJlZCBidXQKICAgKiB1bmJvdW5kIGVsZW1lbnRzIGFyZSBub3QuKQogICAqCiAgICogVG8gbWFpbnRhaW4gdGhlIGRlc2lyZWQgImNsaWVudCBiZWZvcmUgaG9zdCIgb3JkZXJpbmcgZ3VhcmFudGVlIGZvciB0aGlzCiAgICogY2FzZSB3ZSByZWx5IG9uIHRoZSAiaG9zdCBzdGFjay4gQ2xpZW50IG5vZGVzIHJlZ2lzdGVycyB0aGVtc2VsdmVzIHdpdGgKICAgKiB0aGUgY3JlYXRpbmcgaG9zdCBlbGVtZW50IHdoZW4gY3JlYXRlZC4gVGhpcyBlbnN1cmVzIHRoYXQgYWxsIGNsaWVudCBkb20KICAgKiBpcyByZWFkaWVkIGluIHRoZSBwcm9wZXIgb3JkZXIsIG1haW50YWluaW5nIHRoZSBkZXNpcmVkIGd1YXJhbnRlZS4KICAgKgogICAqIEBwcml2YXRlCiAgICovCiAgbGV0IGhvc3RTdGFjayA9IHsKCiAgICBzdGFjazogW10sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gYWRkIHRvIGhvc3RTdGFjawogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtob3N0U3RhY2t9CiAgICAgKi8KICAgIHJlZ2lzdGVySG9zdChpbnN0KSB7CiAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCkgewogICAgICAgIGxldCBob3N0ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXTsKICAgICAgICBob3N0Ll9lbnF1ZXVlQ2xpZW50KGluc3QpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSBpbnN0IEluc3RhbmNlIHRvIGJlZ2luIGhvc3RpbmcKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7aG9zdFN0YWNrfQogICAgICovCiAgICBiZWdpbkhvc3RpbmcoaW5zdCkgewogICAgICB0aGlzLnN0YWNrLnB1c2goaW5zdCk7CiAgICB9LAoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSBpbnN0IEluc3RhbmNlIHRvIGVuZCBob3N0aW5nCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge2hvc3RTdGFja30KICAgICAqLwogICAgZW5kSG9zdGluZyhpbnN0KSB7CiAgICAgIGxldCBzdGFja0xlbiA9IHRoaXMuc3RhY2subGVuZ3RoOwogICAgICBpZiAoc3RhY2tMZW4gJiYgdGhpcy5zdGFja1tzdGFja0xlbi0xXSA9PSBpbnN0KSB7CiAgICAgICAgdGhpcy5zdGFjay5wb3AoKTsKICAgICAgfQogICAgfQoKICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBQcm92aWRlcyBiYXNpYyB0cmFja2luZyBvZiBlbGVtZW50IGRlZmluaXRpb25zIChyZWdpc3RyYXRpb25zKSBhbmQKICAgKiBpbnN0YW5jZSBjb3VudHMuCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYmFzaWMgdHJhY2tpbmcgb2YgZWxlbWVudCBkZWZpbml0aW9ucyAocmVnaXN0cmF0aW9ucykgYW5kCiAgICogaW5zdGFuY2UgY291bnRzLgogICAqLwogIFBvbHltZXIudGVsZW1ldHJ5ID0gewogICAgLyoqCiAgICAgKiBUb3RhbCBudW1iZXIgb2YgUG9seW1lciBlbGVtZW50IGluc3RhbmNlcyBjcmVhdGVkLgogICAgICogQHR5cGUge251bWJlcn0KICAgICAqLwogICAgaW5zdGFuY2VDb3VudDogMCwKICAgIC8qKgogICAgICogQXJyYXkgb2YgUG9seW1lciBlbGVtZW50IGNsYXNzZXMgdGhhdCBoYXZlIGJlZW4gZmluYWxpemVkLgogICAgICogQHR5cGUge0FycmF5PFBvbHltZXIuRWxlbWVudD59CiAgICAgKi8KICAgIHJlZ2lzdHJhdGlvbnM6IFtdLAogICAgLyoqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSBwcm90b3R5cGUgRWxlbWVudCBwcm90b3R5cGUgdG8gbG9nCiAgICAgKiBAdGhpcyB7dGhpc30KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF9yZWdMb2c6IGZ1bmN0aW9uKHByb3RvdHlwZSkgewogICAgICBjb25zb2xlLmxvZygnWycgKyBwcm90b3R5cGUuaXMgKyAnXTogcmVnaXN0ZXJlZCcpOwogICAgfSwKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGEgY2xhc3MgcHJvdG90eXBlIGZvciB0ZWxlbWV0cnkgcHVycG9zZXMuCiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwcm90b3R5cGUgRWxlbWVudCBwcm90b3R5cGUgdG8gcmVnaXN0ZXIKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICByZWdpc3RlcjogZnVuY3Rpb24ocHJvdG90eXBlKSB7CiAgICAgIHRoaXMucmVnaXN0cmF0aW9ucy5wdXNoKHByb3RvdHlwZSk7CiAgICAgIFBvbHltZXIubG9nICYmIHRoaXMuX3JlZ0xvZyhwcm90b3R5cGUpOwogICAgfSwKICAgIC8qKgogICAgICogTG9ncyBhbGwgZWxlbWVudHMgcmVnaXN0ZXJlZCB3aXRoIGFuIGBpc2AgdG8gdGhlIGNvbnNvbGUuCiAgICAgKiBAcHVibGljCiAgICAgKiBAdGhpcyB7dGhpc30KICAgICAqLwogICAgZHVtcFJlZ2lzdHJhdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnJlZ2lzdHJhdGlvbnMuZm9yRWFjaCh0aGlzLl9yZWdMb2cpOwogICAgfQogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIENyZWF0ZXMgYSBjb3B5IG9mIGBwcm9wc2Agd2l0aCBlYWNoIHByb3BlcnR5IG5vcm1hbGl6ZWQgc3VjaCB0aGF0CiAgICogdXBncmFkZWQgaXQgaXMgYW4gb2JqZWN0IHdpdGggYXQgbGVhc3QgYSB0eXBlIHByb3BlcnR5IHsgdHlwZTogVHlwZX0uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgUHJvcGVydGllcyB0byBub3JtYWxpemUKICAgKiBAcmV0dXJuIHtPYmplY3R9IENvcHkgb2YgaW5wdXQgYHByb3BzYCB3aXRoIG5vcm1hbGl6ZWQgcHJvcGVydGllcyB0aGF0CiAgICogYXJlIGluIHRoZSBmb3JtIHt0eXBlOiBUeXBlfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm9ybWFsaXplUHJvcGVydGllcyhwcm9wcykgewogICAgY29uc3Qgb3V0cHV0ID0ge307CiAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgIGNvbnN0IG8gPSBwcm9wc1twXTsKICAgICAgb3V0cHV0W3BdID0gKHR5cGVvZiBvID09PSAnZnVuY3Rpb24nKSA/IHt0eXBlOiBvfSA6IG87CiAgICB9CiAgICByZXR1cm4gb3V0cHV0OwogIH0KCiAgLyoqCiAgICogTWl4aW4gdGhhdCBwcm92aWRlcyBhIG1pbmltYWwgc3RhcnRpbmcgcG9pbnQgdG8gdXNpbmcgdGhlIFByb3BlcnRpZXNDaGFuZ2VkCiAgICogbWl4aW4gYnkgcHJvdmlkaW5nIGEgbWVjaGFuaXNtIHRvIGRlY2xhcmUgcHJvcGVydGllcyBpbiBhIHN0YXRpYwogICAqIGdldHRlciAoZS5nLiBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7IHJldHVybiB7IGZvbzogU3RyaW5nIH0gfSkuIENoYW5nZXMKICAgKiBhcmUgcmVwb3J0ZWQgdmlhIHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBtZXRob2QuCiAgICoKICAgKiBUaGlzIG1peGluIHByb3ZpZGVzIG5vIHNwZWNpZmljIHN1cHBvcnQgZm9yIHJlbmRlcmluZy4gVXNlcnMgYXJlIGV4cGVjdGVkCiAgICogdG8gY3JlYXRlIGEgU2hhZG93Um9vdCBhbmQgcHV0IGNvbnRlbnQgaW50byBpdCBhbmQgdXBkYXRlIGl0IGluIHdoYXRldmVyCiAgICogd2F5IG1ha2VzIHNlbnNlLiBUaGlzIGNhbiBiZSBkb25lIGluIHJlYWN0aW9uIHRvIHByb3BlcnRpZXMgY2hhbmdpbmcgYnkKICAgKiBpbXBsZW1lbnRpbmcgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnRpZXNDaGFuZ2VkCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCBmb3IgdXNpbmcKICAgKiB0aGUgUHJvcGVydGllc0NoYW5nZWQgbWl4aW4gYnkgcHJvdmlkaW5nIGEgZGVjbGFyYXRpdmUgYHByb3BlcnRpZXNgIG9iamVjdC4KICAgKi8KICAgUG9seW1lci5Qcm9wZXJ0aWVzTWl4aW4gPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtzdXBlckNsYXNzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBiYXNlID0gUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZChzdXBlckNsYXNzKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yIGZvciB0aGUgZ2l2ZW4gY2xhc3MsIGlmIGl0IGlzIGFuCiAgICAgKiBpbnN0YW5jZSBvZiB0aGUgUHJvcGVydGllc01peGluLgogICAgICoKICAgICAqIEBwYXJhbSB7IVByb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvciBQcm9wZXJ0aWVzTWl4aW4gY29uc3RydWN0b3IKICAgICAqIEByZXR1cm4ge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSBTdXBlciBjbGFzcyBjb25zdHJ1Y3RvcgogICAgICovCiAgICBmdW5jdGlvbiBzdXBlclByb3BlcnRpZXNDbGFzcyhjb25zdHJ1Y3RvcikgewogICAgICBjb25zdCBzdXBlckN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY29uc3RydWN0b3IpOwoKICAgICAgLy8gTm90ZSwgdGhlIGBQcm9wZXJ0aWVzTWl4aW5gIGNsYXNzIGJlbG93IG9ubHkgcmVmZXJzIHRvIHRoZSBjbGFzcwogICAgICAvLyBnZW5lcmF0ZWQgYnkgdGhpcyBjYWxsIHRvIHRoZSBtaXhpbjsgdGhlIGluc3RhbmNlb2YgdGVzdCBvbmx5IHdvcmtzCiAgICAgIC8vIGJlY2F1c2UgdGhlIG1peGluIGlzIGRlZHVwZWQgYW5kIGd1YXJhbnRlZWQgb25seSB0byBhcHBseSBvbmNlLCBoZW5jZQogICAgICAvLyBhbGwgY29uc3RydWN0b3JzIGluIGEgcHJvdG8gY2hhaW4gd2lsbCBzZWUgdGhlIHNhbWUgYFByb3BlcnRpZXNNaXhpbmAKICAgICAgcmV0dXJuIChzdXBlckN0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgUHJvcGVydGllc01peGluKSA/CiAgICAgICAgLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8gKHN1cGVyQ3RvcikgOiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIG1lbW9pemVkIHZlcnNpb24gb2YgdGhlIGBwcm9wZXJ0aWVzYCBvYmplY3QgZm9yIHRoZQogICAgICogZ2l2ZW4gY2xhc3MuIFByb3BlcnRpZXMgbm90IGluIG9iamVjdCBmb3JtYXQgYXJlIGNvbnZlcnRlZCB0byBhdAogICAgICogbGVhc3Qge3R5cGV9LgogICAgICoKICAgICAqIEBwYXJhbSB7UHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIFByb3BlcnRpZXNNaXhpbiBjb25zdHJ1Y3RvcgogICAgICogQHJldHVybiB7T2JqZWN0fSBNZW1vaXplZCBwcm9wZXJ0aWVzIG9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBvd25Qcm9wZXJ0aWVzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGlmICghY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19vd25Qcm9wZXJ0aWVzJywgY29uc3RydWN0b3IpKSkgewogICAgICAgIGxldCBwcm9wcyA9IG51bGw7CgogICAgICAgIGlmIChjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdwcm9wZXJ0aWVzJywgY29uc3RydWN0b3IpKSkgewogICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IGNvbnN0cnVjdG9yLnByb3BlcnRpZXM7CiAgICAgICAgICAKICAgICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgIHByb3BzID0gbm9ybWFsaXplUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNvbnN0cnVjdG9yLl9fb3duUHJvcGVydGllcyA9IHByb3BzOwogICAgICB9CiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5fX293blByb3BlcnRpZXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBleHRlbmRzIHtiYXNlfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc01peGlufQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBQcm9wZXJ0aWVzTWl4aW4gZXh0ZW5kcyBiYXNlIHsKCiAgICAgIC8qKgogICAgICAgKiBJbXBsZW1lbnRzIHN0YW5kYXJkIGN1c3RvbSBlbGVtZW50cyBnZXR0ZXIgdG8gb2JzZXJ2ZXMgdGhlIGF0dHJpYnV0ZXMKICAgICAgICogbGlzdGVkIGluIGBwcm9wZXJ0aWVzYC4KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsKICAgICAgICBpZiAoIXRoaXMuaGFzT3duUHJvcGVydHkoJ19fb2JzZXJ2ZWRBdHRyaWJ1dGVzJykpIHsKICAgICAgICAgIFBvbHltZXIudGVsZW1ldHJ5LnJlZ2lzdGVyKHRoaXMucHJvdG90eXBlKTsKICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5fcHJvcGVydGllczsKICAgICAgICAgIHRoaXMuX19vYnNlcnZlZEF0dHJpYnV0ZXMgPSBwcm9wcyA/IE9iamVjdC5rZXlzKHByb3BzKS5tYXAocCA9PiB0aGlzLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwKSkgOiBbXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX19vYnNlcnZlZEF0dHJpYnV0ZXM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGaW5hbGl6ZXMgYW4gZWxlbWVudCBkZWZpbml0aW9uLCBpbmNsdWRpbmcgZW5zdXJpbmcgYW55IHN1cGVyIGNsYXNzZXMKICAgICAgICogYXJlIGFsc28gZmluYWxpemVkLiBUaGlzIGluY2x1ZGVzIGVuc3VyaW5nIHByb3BlcnR5CiAgICAgICAqIGFjY2Vzc29ycyBleGlzdCBvbiB0aGUgZWxlbWVudCBwcm90b3R5cGUuIFRoaXMgbWV0aG9kIGNhbGxzCiAgICAgICAqIGBfZmluYWxpemVDbGFzc2AgdG8gZmluYWxpemUgZWFjaCBjb25zdHJ1Y3RvciBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc3RhdGljIGZpbmFsaXplKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX2ZpbmFsaXplZCcsIHRoaXMpKSkgewogICAgICAgICAgY29uc3Qgc3VwZXJDdG9yID0gc3VwZXJQcm9wZXJ0aWVzQ2xhc3MoLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpOwogICAgICAgICAgaWYgKHN1cGVyQ3RvcikgewogICAgICAgICAgICBzdXBlckN0b3IuZmluYWxpemUoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19maW5hbGl6ZWQgPSB0cnVlOwogICAgICAgICAgdGhpcy5fZmluYWxpemVDbGFzcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZpbmFsaXplIGFuIGVsZW1lbnQgY2xhc3MuIFRoaXMgaW5jbHVkZXMgZW5zdXJpbmcgcHJvcGVydHkKICAgICAgICogYWNjZXNzb3JzIGV4aXN0IG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5CiAgICAgICAqIGBmaW5hbGl6ZWAgYW5kIGZpbmFsaXplcyB0aGUgY2xhc3MgY29uc3RydWN0b3IuCiAgICAgICAqCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICBjb25zdCBwcm9wcyA9IG93blByb3BlcnRpZXMoLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpOwogICAgICAgIGlmIChwcm9wcykgewogICAgICAgICAgdGhpcy5jcmVhdGVQcm9wZXJ0aWVzKHByb3BzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiBhbGwgcHJvcGVydGllcywgaW5jbHVkaW5nIHRob3NlIGluaGVyaXRlZAogICAgICAgKiBmcm9tIHN1cGVyIGNsYXNzZXMuIFByb3BlcnRpZXMgbm90IGluIG9iamVjdCBmb3JtYXQgYXJlIGNvbnZlcnRlZCB0bwogICAgICAgKiBhdCBsZWFzdCB7dHlwZX0uCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyBmb3IgdGhpcyBjbGFzcwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IF9wcm9wZXJ0aWVzKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICAgIEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fcHJvcGVydGllcycsIHRoaXMpKSkgewogICAgICAgICAgY29uc3Qgc3VwZXJDdG9yID0gc3VwZXJQcm9wZXJ0aWVzQ2xhc3MoLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpOwogICAgICAgICAgdGhpcy5fX3Byb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKHt9LAogICAgICAgICAgICBzdXBlckN0b3IgJiYgc3VwZXJDdG9yLl9wcm9wZXJ0aWVzLAogICAgICAgICAgICBvd25Qcm9wZXJ0aWVzKC8qKiBAdHlwZSB7UHJvcGVydGllc01peGluQ29uc3RydWN0b3J9ICovKHRoaXMpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9fcHJvcGVydGllczsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZCB0byByZXR1cm4gdHlwZSBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAqIHN0YXRpYyBgcHJvcGVydGllc2Agb2JqZWN0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgcHJvcGVydHkKICAgICAgICogQHJldHVybiB7Kn0gVHlwZSB0byB3aGljaCB0byBkZXNlcmlhbGl6ZSBhdHRyaWJ1dGUKICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIHR5cGVGb3JQcm9wZXJ0eShuYW1lKSB7CiAgICAgICAgY29uc3QgaW5mbyA9IHRoaXMuX3Byb3BlcnRpZXNbbmFtZV07CiAgICAgICAgcmV0dXJuIGluZm8gJiYgaW5mby50eXBlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgbWV0aG9kIGFuZCBhZGRzIGEgY2FsbCB0bwogICAgICAgKiBgZmluYWxpemVgIHdoaWNoIGxhemlseSBjb25maWd1cmVzIHRoZSBlbGVtZW50J3MgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBQb2x5bWVyLnRlbGVtZXRyeS5pbnN0YW5jZUNvdW50Kys7CiAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5maW5hbGl6ZSgpOwogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgYWRkZWQgdG8gYSBkb2N1bWVudC4KICAgICAgICogQ2FsbHMgYF9lbmFibGVQcm9wZXJ0aWVzYCB0byB0dXJuIG9uIHByb3BlcnR5IHN5c3RlbSBmcm9tCiAgICAgICAqIGBQcm9wZXJ0aWVzQ2hhbmdlZGAuCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IFN1cGVyIG1heSBvciBtYXkgbm90IGltcGxlbWVudCB0aGUgY2FsbGJhY2sKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIGlmIChzdXBlci5jb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIGEgZG9jdW1lbnQKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gUHJvcGVydGllc01peGluOwoKICB9KTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IGJ1aWx0Q1NTID0gd2luZG93LlNoYWR5Q1NTICYmIHdpbmRvdy5TaGFkeUNTU1snY3NzQnVpbGQnXTsKCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcKICAgKiBmZWF0dXJlcyBpbmNsdWRpbmcgdGVtcGxhdGUgc3RhbXBpbmcsIGRhdGEtYmluZGluZywgYXR0cmlidXRlIGRlc2VyaWFsaXphdGlvbiwKICAgKiBhbmQgcHJvcGVydHkgY2hhbmdlIG9ic2VydmF0aW9uLgogICAqCiAgICogU3ViY2xhc3NlcnMgbWF5IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBzdGF0aWMgZ2V0dGVycyB0byByZXR1cm4gbWV0YWRhdGEKICAgKiB1c2VkIHRvIGNvbmZpZ3VyZSBQb2x5bWVyJ3MgZmVhdHVyZXMgZm9yIHRoZSBjbGFzczoKICAgKgogICAqIC0gYHN0YXRpYyBnZXQgaXMoKWA6IFdoZW4gdGhlIHRlbXBsYXRlIGlzIHByb3ZpZGVkIHZpYSBhIGBkb20tbW9kdWxlYCwKICAgKiAgIHVzZXJzIHNob3VsZCByZXR1cm4gdGhlIGBkb20tbW9kdWxlYCBpZCBmcm9tIGEgc3RhdGljIGBpc2AgZ2V0dGVyLiAgSWYKICAgKiAgIG5vIHRlbXBsYXRlIGlzIG5lZWRlZCBvciB0aGUgdGVtcGxhdGUgaXMgcHJvdmlkZWQgZGlyZWN0bHkgdmlhIHRoZQogICAqICAgYHRlbXBsYXRlYCBnZXR0ZXIsIHRoZXJlIGlzIG5vIG5lZWQgdG8gZGVmaW5lIGBpc2AgZm9yIHRoZSBlbGVtZW50LgogICAqCiAgICogLSBgc3RhdGljIGdldCB0ZW1wbGF0ZSgpYDogVXNlcnMgbWF5IHByb3ZpZGUgdGhlIHRlbXBsYXRlIGRpcmVjdGx5IChhcwogICAqICAgb3Bwb3NlZCB0byB2aWEgYGRvbS1tb2R1bGVgKSBieSBpbXBsZW1lbnRpbmcgYSBzdGF0aWMgYHRlbXBsYXRlYCBnZXR0ZXIuCiAgICogICBUaGUgZ2V0dGVyIG1heSByZXR1cm4gYW4gYEhUTUxUZW1wbGF0ZUVsZW1lbnRgIG9yIGEgc3RyaW5nLCB3aGljaCB3aWxsCiAgICogICBhdXRvbWF0aWNhbGx5IGJlIHBhcnNlZCBpbnRvIGEgdGVtcGxhdGUuCiAgICoKICAgKiAtIGBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKWA6IFNob3VsZCByZXR1cm4gYW4gb2JqZWN0IGRlc2NyaWJpbmcKICAgKiAgIHByb3BlcnR5LXJlbGF0ZWQgbWV0YWRhdGEgdXNlZCBieSBQb2x5bWVyIGZlYXR1cmVzIChrZXk6IHByb3BlcnR5IG5hbWUKICAgKiAgIHZhbHVlOiBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0eSBtZXRhZGF0YSkuIFZhbGlkIGtleXMgaW4gcGVyLXByb3BlcnR5CiAgICogICBtZXRhZGF0YSBpbmNsdWRlOgogICAqICAgLSBgdHlwZWAgKFN0cmluZ3xOdW1iZXJ8T2JqZWN0fEFycmF5fC4uLik6IFVzZWQgYnkKICAgKiAgICAgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AgdG8gZGV0ZXJtaW5lIGhvdyBzdHJpbmctYmFzZWQgYXR0cmlidXRlcwogICAqICAgICBhcmUgZGVzZXJpYWxpemVkIHRvIEphdmFTY3JpcHQgcHJvcGVydHkgdmFsdWVzLgogICAqICAgLSBgbm90aWZ5YCAoYm9vbGVhbik6IENhdXNlcyBhIGNoYW5nZSBpbiB0aGUgcHJvcGVydHkgdG8gZmlyZSBhCiAgICogICAgIG5vbi1idWJibGluZyBldmVudCBjYWxsZWQgYDxwcm9wZXJ0eT4tY2hhbmdlZGAuIEVsZW1lbnRzIHRoYXQgaGF2ZQogICAqICAgICBlbmFibGVkIHR3by13YXkgYmluZGluZyB0byB0aGUgcHJvcGVydHkgdXNlIHRoaXMgZXZlbnQgdG8gb2JzZXJ2ZSBjaGFuZ2VzLgogICAqICAgLSBgcmVhZE9ubHlgIChib29sZWFuKTogQ3JlYXRlcyBhIGdldHRlciBmb3IgdGhlIHByb3BlcnR5LCBidXQgbm8gc2V0dGVyLgogICAqICAgICBUbyBzZXQgYSByZWFkLW9ubHkgcHJvcGVydHksIHVzZSB0aGUgcHJpdmF0ZSBzZXR0ZXIgbWV0aG9kCiAgICogICAgIGBfc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKWAuCiAgICogICAtIGBvYnNlcnZlcmAgKHN0cmluZyk6IE9ic2VydmVyIG1ldGhvZCBuYW1lIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbgogICAqICAgICB0aGUgcHJvcGVydHkgY2hhbmdlcy4gVGhlIGFyZ3VtZW50cyBvZiB0aGUgbWV0aG9kIGFyZQogICAqICAgICBgKHZhbHVlLCBwcmV2aW91c1ZhbHVlKWAuCiAgICogICAtIGBjb21wdXRlZGAgKHN0cmluZyk6IFN0cmluZyBkZXNjcmliaW5nIG1ldGhvZCBhbmQgZGVwZW5kZW50IHByb3BlcnRpZXMKICAgKiAgICAgZm9yIGNvbXB1dGluZyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSAoZS5nLiBgJ2NvbXB1dGVGb28oYmFyLCB6b3QpJ2ApLgogICAqICAgICBDb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSByZWFkLW9ubHkgYnkgZGVmYXVsdCBhbmQgY2FuIG9ubHkgYmUgY2hhbmdlZAogICAqICAgICB2aWEgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY29tcHV0aW5nIG1ldGhvZC4KICAgKgogICAqIC0gYHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKClgOiBBcnJheSBvZiBzdHJpbmdzIGRlc2NyaWJpbmcgbXVsdGktcHJvcGVydHkKICAgKiAgIG9ic2VydmVyIG1ldGhvZHMgYW5kIHRoZWlyIGRlcGVuZGVudCBwcm9wZXJ0aWVzIChlLmcuCiAgICogICBgJ29ic2VydmVBQkMoYSwgYiwgYyknYCkuCiAgICoKICAgKiBUaGUgYmFzZSBjbGFzcyBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBzdGFuZGFyZAogICAqIGN1c3RvbSBlbGVtZW50IGxpZmVjeWNsZSBjYWxsYmFja3M7IHVzZXJzIG1heSBvdmVycmlkZSB0aGVzZSwgYnV0IHNob3VsZAogICAqIGNhbGwgdGhlIHN1cGVyIG1ldGhvZCB0byBlbnN1cmUKICAgKiAtIGBjb25zdHJ1Y3RvcmA6IFJ1biB3aGVuIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQgb3IgdXBncmFkZWQKICAgKiAtIGBjb25uZWN0ZWRDYWxsYmFja2A6IFJ1biBlYWNoIHRpbWUgdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZQogICAqICAgZG9jdW1lbnQKICAgKiAtIGBkaXNjb25uZWN0ZWRDYWxsYmFja2A6IFJ1biBlYWNoIHRpbWUgdGhlIGVsZW1lbnQgaXMgZGlzY29ubmVjdGVkIGZyb20KICAgKiAgIHRoZSBkb2N1bWVudAogICAqIC0gYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2A6IFJ1biBlYWNoIHRpbWUgYW4gYXR0cmlidXRlIGluCiAgICogICBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBpcyBzZXQgb3IgcmVtb3ZlZCAobm90ZTogdGhpcyBlbGVtZW50J3MgZGVmYXVsdAogICAqICAgYG9ic2VydmVkQXR0cmlidXRlc2AgaW1wbGVtZW50YXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IHJldHVybiBhbiBhcnJheQogICAqICAgb2YgZGFzaC1jYXNlZCBhdHRyaWJ1dGVzIGJhc2VkIG9uIGBwcm9wZXJ0aWVzYCkKICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydHlFZmZlY3RzCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHByb3BlcnR5IHJvb3RQYXRoIHtzdHJpbmd9IFNldCB0byB0aGUgdmFsdWUgb2YgYFBvbHltZXIucm9vdFBhdGhgLAogICAqICAgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIG1haW4gZG9jdW1lbnQgcGF0aAogICAqIEBwcm9wZXJ0eSBpbXBvcnRQYXRoIHtzdHJpbmd9IFNldCB0byB0aGUgdmFsdWUgb2YgdGhlIGNsYXNzJ3Mgc3RhdGljCiAgICogICBgaW1wb3J0UGF0aGAgcHJvcGVydHksIHdoaWNoIGRlZmF1bHRzIHRvIHRoZSBwYXRoIG9mIHRoaXMgZWxlbWVudCdzCiAgICogICBgZG9tLW1vZHVsZWAgKHdoZW4gYGlzYCBpcyB1c2VkKSwgYnV0IGNhbiBiZSBvdmVycmlkZGVuIGZvciBvdGhlcgogICAqICAgaW1wb3J0IHN0cmF0ZWdpZXMuCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzCiAgICogbWV0YS1wcm9ncmFtbWluZyBmZWF0dXJlcy4KICAgKi8KICBQb2x5bWVyLkVsZW1lbnRNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihiYXNlID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBwb2x5bWVyRWxlbWVudEJhc2UgPSBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbihQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhiYXNlKSk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIHdpdGggZGVmYXVsdCB2YWx1ZXMuCiAgICAgKiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBhcyBhbiBvcHRpbWl6YXRpb24gc2luY2UgaXQgaXMgYSBzdWJzZXQgb2YKICAgICAqIHRoZSBsaXN0IHJldHVybmVkIGZyb20gYF9wcm9wZXJ0aWVzYC4KICAgICAqIFRoaXMgbGlzdCBpcyB1c2VkIGluIGBfaW5pdGlhbGl6ZVByb3BlcnRpZXNgIHRvIHNldCBwcm9wZXJ0eSBkZWZhdWx0cy4KICAgICAqCiAgICAgKiBAcGFyYW0ge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIEVsZW1lbnQgY2xhc3MKICAgICAqIEByZXR1cm4ge1BvbHltZXJFbGVtZW50UHJvcGVydGllc30gRmxhdHRlbmVkIHByb3BlcnRpZXMgZm9yIHRoaXMgY2xhc3MKICAgICAqICAgdGhhdCBoYXZlIGRlZmF1bHQgdmFsdWVzCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBwcm9wZXJ0eURlZmF1bHRzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGlmICghY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoCiAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0eURlZmF1bHRzJywgY29uc3RydWN0b3IpKSkgewogICAgICAgIGNvbnN0cnVjdG9yLl9fcHJvcGVydHlEZWZhdWx0cyA9IG51bGw7CiAgICAgICAgbGV0IHByb3BzID0gY29uc3RydWN0b3IuX3Byb3BlcnRpZXM7CiAgICAgICAgZm9yIChsZXQgcCBpbiBwcm9wcykgewogICAgICAgICAgbGV0IGluZm8gPSBwcm9wc1twXTsKICAgICAgICAgIGlmICgndmFsdWUnIGluIGluZm8pIHsKICAgICAgICAgICAgY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzID0gY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzIHx8IHt9OwogICAgICAgICAgICBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHNbcF0gPSBpbmZvOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIG1lbW9pemVkIHZlcnNpb24gb2YgdGhlIGBvYnNlcnZlcnNgIGFycmF5LgogICAgICogQHBhcmFtIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvciBFbGVtZW50IGNsYXNzCiAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgY29udGFpbmluZyBvd24gb2JzZXJ2ZXJzIGZvciB0aGUgZ2l2ZW4gY2xhc3MKICAgICAqIEBwcm90ZWN0ZWQKICAgICAqLwogICAgZnVuY3Rpb24gb3duT2JzZXJ2ZXJzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGlmICghY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoCiAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19vd25PYnNlcnZlcnMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgICBjb25zdHJ1Y3Rvci5fX293bk9ic2VydmVycyA9CiAgICAgICAgICBjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdvYnNlcnZlcnMnLCBjb25zdHJ1Y3RvcikpID8KICAgICAgICAgIC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gKi8gKGNvbnN0cnVjdG9yKS5vYnNlcnZlcnMgOiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5fX293bk9ic2VydmVyczsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgZWZmZWN0cyBmb3IgYSBwcm9wZXJ0eS4KICAgICAqCiAgICAgKiBOb3RlLCBvbmNlIGEgcHJvcGVydHkgaGFzIGJlZW4gc2V0IHRvCiAgICAgKiBgcmVhZE9ubHlgLCBgY29tcHV0ZWRgLCBgcmVmbGVjdFRvQXR0cmlidXRlYCwgb3IgYG5vdGlmeWAKICAgICAqIHRoZXNlIHZhbHVlcyBtYXkgbm90IGJlIGNoYW5nZWQuIEZvciBleGFtcGxlLCBhIHN1YmNsYXNzIGNhbm5vdAogICAgICogYWx0ZXIgdGhlc2Ugc2V0dGluZ3MuIEhvd2V2ZXIsIGFkZGl0aW9uYWwgYG9ic2VydmVyc2AgbWF5IGJlIGFkZGVkCiAgICAgKiBieSBzdWJjbGFzc2VzLgogICAgICoKICAgICAqIFRoZSBpbmZvIG9iamVjdCBzaG91bGQgY29udGFpbiBwcm9wZXJ0eSBtZXRhZGF0YSBhcyBmb2xsb3dzOgogICAgICoKICAgICAqICogYHR5cGVgOiB7ZnVuY3Rpb259IHR5cGUgdG8gd2hpY2ggYW4gYXR0cmlidXRlIG1hdGNoaW5nIHRoZSBwcm9wZXJ0eQogICAgICogaXMgZGVzZXJpYWxpemVkLiBOb3RlIHRoZSBwcm9wZXJ0eSBpcyBjYW1lbC1jYXNlZCBmcm9tIGEgZGFzaC1jYXNlZAogICAgICogYXR0cmlidXRlLiBGb3IgZXhhbXBsZSwgJ2Zvby1iYXInIGF0dHJpYnV0ZSBpcyBkZXNlcmlhbGl6ZWQgdG8gYQogICAgICogcHJvcGVydHkgbmFtZWQgJ2Zvb0JhcicuCiAgICAgKgogICAgICogKiBgcmVhZE9ubHlgOiB7Ym9vbGVhbn0gY3JlYXRlcyBhIHJlYWRPbmx5IHByb3BlcnR5IGFuZAogICAgICogbWFrZXMgYSBwcml2YXRlIHNldHRlciBmb3IgdGhlIHByaXZhdGUgb2YgdGhlIGZvcm0gJ19zZXRGb28nIGZvciBhCiAgICAgKiBwcm9wZXJ0eSAnZm9vJywKICAgICAqCiAgICAgKiAqIGBjb21wdXRlZGA6IHtzdHJpbmd9IGNyZWF0ZXMgYSBjb21wdXRlZCBwcm9wZXJ0eS4gQSBjb21wdXRlZCBwcm9wZXJ0eQogICAgICogaXMgYWxzbyBhdXRvbWF0aWNhbGx5IHNldCB0byBgcmVhZE9ubHk6IHRydWVgLiBUaGUgdmFsdWUgaXMgY2FsY3VsYXRlZAogICAgICogYnkgcnVubmluZyBhIG1ldGhvZCBhbmQgYXJndW1lbnRzIHBhcnNlZCBmcm9tIHRoZSBnaXZlbiBzdHJpbmcuIEZvcgogICAgICogZXhhbXBsZSAnY29tcHV0ZShmb28pJyB3aWxsIGNvbXB1dGUgYSBnaXZlbiBwcm9wZXJ0eSB3aGVuIHRoZQogICAgICogJ2ZvbycgcHJvcGVydHkgY2hhbmdlcyBieSBleGVjdXRpbmcgdGhlICdjb21wdXRlJyBtZXRob2QuIFRoaXMgbWV0aG9kCiAgICAgKiBtdXN0IHJldHVybiB0aGUgY29tcHV0ZWQgdmFsdWUuCiAgICAgKgogICAgICogKiBgcmVmbGVjdFRvQXR0cmlidXRlYDoge2Jvb2xlYW59IElmIHRydWUsIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyByZWZsZWN0ZWQKICAgICAqIHRvIGFuIGF0dHJpYnV0ZSBvZiB0aGUgc2FtZSBuYW1lLiBOb3RlLCB0aGUgYXR0cmlidXRlIGlzIGRhc2gtY2FzZWQKICAgICAqIHNvIGEgcHJvcGVydHkgbmFtZWQgJ2Zvb0JhcicgaXMgcmVmbGVjdGVkIGFzICdmb28tYmFyJy4KICAgICAqCiAgICAgKiAqIGBub3RpZnlgOiB7Ym9vbGVhbn0gc2VuZHMgYSBub24tYnViYmxpbmcgbm90aWZpY2F0aW9uIGV2ZW50IHdoZW4KICAgICAqIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lZCAnZm9vJyBzZW5kcyBhbgogICAgICogZXZlbnQgbmFtZWQgJ2Zvby1jaGFuZ2VkJyB3aXRoIGBldmVudC5kZXRhaWxgIHNldCB0byB0aGUgdmFsdWUgb2YKICAgICAqIHRoZSBwcm9wZXJ0eS4KICAgICAqCiAgICAgKiAqIG9ic2VydmVyOiB7c3RyaW5nfSBuYW1lIG9mIGEgbWV0aG9kIHRoYXQgcnVucyB3aGVuIHRoZSBwcm9wZXJ0eQogICAgICogY2hhbmdlcy4gVGhlIGFyZ3VtZW50cyBvZiB0aGUgbWV0aG9kIGFyZSAodmFsdWUsIHByZXZpb3VzVmFsdWUpLgogICAgICoKICAgICAqIE5vdGU6IFVzZXJzIG1heSB3YW50IGNvbnRyb2wgb3ZlciBtb2RpZnlpbmcgcHJvcGVydHkKICAgICAqIGVmZmVjdHMgdmlhIHN1YmNsYXNzaW5nLiBGb3IgZXhhbXBsZSwgYSB1c2VyIG1pZ2h0IHdhbnQgdG8gbWFrZSBhCiAgICAgKiByZWZsZWN0VG9BdHRyaWJ1dGUgcHJvcGVydHkgbm90IGRvIHNvIGluIGEgc3ViY2xhc3MuIFdlJ3ZlIGNob3NlbiB0bwogICAgICogZGlzYWJsZSB0aGlzIGJlY2F1c2UgaXQgbGVhZHMgdG8gYWRkaXRpb25hbCBjb21wbGljYXRpb24uCiAgICAgKiBGb3IgZXhhbXBsZSwgYSByZWFkT25seSBlZmZlY3QgZ2VuZXJhdGVzIGEgc3BlY2lhbCBzZXR0ZXIuIElmIGEgc3ViY2xhc3MKICAgICAqIGRpc2FibGVzIHRoZSBlZmZlY3QsIHRoZSBzZXR0ZXIgd291bGQgZmFpbCB1bmV4cGVjdGVkbHkuCiAgICAgKiBCYXNlZCBvbiBmZWVkYmFjaywgd2UgbWF5IHdhbnQgdG8gdHJ5IHRvIG1ha2UgZWZmZWN0cyBtb3JlIG1hbGxlYWJsZQogICAgICogYW5kL29yIHByb3ZpZGUgYW4gYWR2YW5jZWQgYXBpIGZvciBtYW5pcHVsYXRpbmcgdGhlbS4KICAgICAqIEFsc28gY29uc2lkZXIgYWRkaW5nIHdhcm5pbmdzIHdoZW4gYW4gZWZmZWN0IGNhbm5vdCBiZSBjaGFuZ2VkLgogICAgICoKICAgICAqIEBwYXJhbSB7IVBvbHltZXJFbGVtZW50fSBwcm90byBFbGVtZW50IGNsYXNzIHByb3RvdHlwZSB0byBhZGQgYWNjZXNzb3JzCiAgICAgKiAgIGFuZCBlZmZlY3RzIHRvCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIEluZm8gb2JqZWN0IGZyb20gd2hpY2ggdG8gY3JlYXRlIHByb3BlcnR5IGVmZmVjdHMuCiAgICAgKiBTdXBwb3J0ZWQga2V5czoKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhbGxQcm9wcyBGbGF0dGVuZWQgbWFwIG9mIGFsbCBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhpcwogICAgICogICBlbGVtZW50IChpbmNsdWRpbmcgaW5oZXJpdGVkIHByb3BlcnRpZXMpCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlGcm9tQ29uZmlnKHByb3RvLCBuYW1lLCBpbmZvLCBhbGxQcm9wcykgewogICAgICAvLyBjb21wdXRlZCBmb3JjZXMgcmVhZE9ubHkuLi4KICAgICAgaWYgKGluZm8uY29tcHV0ZWQpIHsKICAgICAgICBpbmZvLnJlYWRPbmx5ID0gdHJ1ZTsKICAgICAgfQogICAgICAvLyBOb3RlLCBzaW5jZSBhbGwgY29tcHV0ZWQgcHJvcGVydGllcyBhcmUgcmVhZE9ubHksIHRoaXMgcHJldmVudHMKICAgICAgLy8gYWRkaW5nIGFkZGl0aW9uYWwgY29tcHV0ZWQgcHJvcGVydHkgZWZmZWN0cyAod2hpY2ggbGVhZHMgdG8gYSBjb25mdXNpbmcKICAgICAgLy8gc2V0dXAgd2hlcmUgbXVsdGlwbGUgdHJpZ2dlcnMgZm9yIHNldHRpbmcgYSBwcm9wZXJ0eSkKICAgICAgLy8gV2hpbGUgd2UgZG8gaGF2ZSBgaGFzQ29tcHV0ZWRFZmZlY3RgIHRoaXMgaXMgc2V0IG9uIHRoZSBwcm9wZXJ0eSdzCiAgICAgIC8vIGRlcGVuZGVuY2llcyByYXRoZXIgdGhhbiBpdHNlbGYuCiAgICAgIGlmIChpbmZvLmNvbXB1dGVkICYmICFwcm90by5faGFzUmVhZE9ubHlFZmZlY3QobmFtZSkpIHsKICAgICAgICBwcm90by5fY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eShuYW1lLCBpbmZvLmNvbXB1dGVkLCBhbGxQcm9wcyk7CiAgICAgIH0KICAgICAgaWYgKGluZm8ucmVhZE9ubHkgJiYgIXByb3RvLl9oYXNSZWFkT25seUVmZmVjdChuYW1lKSkgewogICAgICAgIHByb3RvLl9jcmVhdGVSZWFkT25seVByb3BlcnR5KG5hbWUsICFpbmZvLmNvbXB1dGVkKTsKICAgICAgfQogICAgICBpZiAoaW5mby5yZWZsZWN0VG9BdHRyaWJ1dGUgJiYgIXByb3RvLl9oYXNSZWZsZWN0RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KG5hbWUpOwogICAgICB9CiAgICAgIGlmIChpbmZvLm5vdGlmeSAmJiAhcHJvdG8uX2hhc05vdGlmeUVmZmVjdChuYW1lKSkgewogICAgICAgIHByb3RvLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShuYW1lKTsKICAgICAgfQogICAgICAvLyBhbHdheXMgYWRkIG9ic2VydmVyCiAgICAgIGlmIChpbmZvLm9ic2VydmVyKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIobmFtZSwgaW5mby5vYnNlcnZlciwgYWxsUHJvcHNbaW5mby5vYnNlcnZlcl0pOwogICAgICB9CiAgICAgIC8vIGFsd2F5cyBjcmVhdGUgdGhlIG1hcHBpbmcgZnJvbSBhdHRyaWJ1dGUgYmFjayB0byBwcm9wZXJ0eSBmb3IgZGVzZXJpYWxpemF0aW9uLgogICAgICBwcm90by5fYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChuYW1lKTsKICAgIH0KCiAgICAvKioKICAgICAqIFByb2Nlc3MgYWxsIHN0eWxlIGVsZW1lbnRzIGluIHRoZSBlbGVtZW50IHRlbXBsYXRlLiBTdHlsZXMgd2l0aCB0aGUKICAgICAqIGBpbmNsdWRlYCBhdHRyaWJ1dGUgYXJlIHByb2Nlc3NlZCBzdWNoIHRoYXQgYW55IHN0eWxlcyBpbgogICAgICogdGhlIGFzc29jaWF0ZWQgInN0eWxlIG1vZHVsZXMiIGFyZSBpbmNsdWRlZCBpbiB0aGUgZWxlbWVudCB0ZW1wbGF0ZS4KICAgICAqIEBwYXJhbSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0ga2xhc3MgRWxlbWVudCBjbGFzcwogICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gcHJvY2VzcwogICAgICogQHBhcmFtIHtzdHJpbmd9IGlzIE5hbWUgb2YgZWxlbWVudAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkkgQmFzZSBVUkkgZm9yIGVsZW1lbnQKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50U3R5bGVzKGtsYXNzLCB0ZW1wbGF0ZSwgaXMsIGJhc2VVUkkpIHsKICAgICAgaWYgKCFidWlsdENTUykgewogICAgICAgIGNvbnN0IHRlbXBsYXRlU3R5bGVzID0gdGVtcGxhdGUuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZScpOwogICAgICAgIGNvbnN0IHN0eWxlc1dpdGhJbXBvcnRzID0gUG9seW1lci5TdHlsZUdhdGhlci5zdHlsZXNGcm9tVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIC8vIGluc2VydCBzdHlsZXMgZnJvbSA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj4gYXQgdGhlIHRvcCBvZiB0aGUgdGVtcGxhdGUKICAgICAgICBjb25zdCBsaW5rZWRTdHlsZXMgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLnN0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKGlzKTsKICAgICAgICBjb25zdCBmaXJzdFRlbXBsYXRlQ2hpbGQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkOwogICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGxpbmtlZFN0eWxlcy5sZW5ndGg7IGlkeCsrKSB7CiAgICAgICAgICBsZXQgcyA9IGxpbmtlZFN0eWxlc1tpZHhdOwogICAgICAgICAgcy50ZXh0Q29udGVudCA9IGtsYXNzLl9wcm9jZXNzU3R5bGVUZXh0KHMudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgICAgdGVtcGxhdGUuY29udGVudC5pbnNlcnRCZWZvcmUocywgZmlyc3RUZW1wbGF0ZUNoaWxkKTsKICAgICAgICB9CiAgICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCAiY29uY3JldGUiIHN0eWxlIGluIHRoZSB0ZW1wbGF0ZSB3ZSBoYXZlIGVuY291bnRlcmVkCiAgICAgICAgbGV0IHRlbXBsYXRlU3R5bGVJbmRleCA9IDA7CiAgICAgICAgLy8gZW5zdXJlIGFsbCBnYXRoZXJlZCBzdHlsZXMgYXJlIGFjdHVhbGx5IGluIHRoaXMgdGVtcGxhdGUuCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHlsZXNXaXRoSW1wb3J0cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IHMgPSBzdHlsZXNXaXRoSW1wb3J0c1tpXTsKICAgICAgICAgIGxldCB0ZW1wbGF0ZVN0eWxlID0gdGVtcGxhdGVTdHlsZXNbdGVtcGxhdGVTdHlsZUluZGV4XTsKICAgICAgICAgIC8vIGlmIHRoZSBzdHlsZSBpcyBub3QgaW4gdGhpcyB0ZW1wbGF0ZSwgaXQncyBiZWVuICJpbmNsdWRlZCIgYW5kCiAgICAgICAgICAvLyB3ZSBwdXQgYSBjbG9uZSBvZiBpdCBpbiB0aGUgdGVtcGxhdGUgYmVmb3JlIHRoZSBzdHlsZSB0aGF0IGluY2x1ZGVkIGl0CiAgICAgICAgICBpZiAodGVtcGxhdGVTdHlsZSAhPT0gcykgewogICAgICAgICAgICBzID0gcy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgIHRlbXBsYXRlU3R5bGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocywgdGVtcGxhdGVTdHlsZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZW1wbGF0ZVN0eWxlSW5kZXgrKzsKICAgICAgICAgIH0KICAgICAgICAgIHMudGV4dENvbnRlbnQgPSBrbGFzcy5fcHJvY2Vzc1N0eWxlVGV4dChzLnRleHRDb250ZW50LCBiYXNlVVJJKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICAgIHdpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUodGVtcGxhdGUsIGlzKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogTG9vayB1cCB0ZW1wbGF0ZSBmcm9tIGRvbS1tb2R1bGUgZm9yIGVsZW1lbnQKICAgICAqCiAgICAgKiBAcGFyYW0geyFzdHJpbmd9IGlzIEVsZW1lbnQgbmFtZSB0byBsb29rIHVwCiAgICAgKiBAcmV0dXJuIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gVGVtcGxhdGUgZm91bmQgaW4gZG9tIG1vZHVsZSwgb3IKICAgICAqICAgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZAogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBnZXRUZW1wbGF0ZUZyb21Eb21Nb2R1bGUoaXMpIHsKICAgICAgbGV0IHRlbXBsYXRlID0gbnVsbDsKICAgICAgaWYgKGlzICYmIFBvbHltZXIuRG9tTW9kdWxlKSB7CiAgICAgICAgdGVtcGxhdGUgPSBQb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoaXMsICd0ZW1wbGF0ZScpOwogICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCByZXF1aXJlIGFueSBlbGVtZW50IHdpdGggYW4gYGlzYAogICAgICAgIC8vIHNwZWNpZmllZCB0byBoYXZlIGEgZG9tLW1vZHVsZQogICAgICAgIGlmIChQb2x5bWVyLnN0cmljdFRlbXBsYXRlUG9saWN5ICYmICF0ZW1wbGF0ZSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZXhwZWN0aW5nIGRvbS1tb2R1bGUgb3IgbnVsbCB0ZW1wbGF0ZSBmb3IgJHtpc31gKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXBsYXRlOwogICAgfQoKICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQHVucmVzdHJpY3RlZAogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAgICovCiAgICBjbGFzcyBQb2x5bWVyRWxlbWVudCBleHRlbmRzIHBvbHltZXJFbGVtZW50QmFzZSB7CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgb2YgUHJvcGVydGllc01peGluIF9maW5hbGl6ZUNsYXNzIHRvIGNyZWF0ZSBvYnNlcnZlcnMgYW5kCiAgICAgICAqIGZpbmQgdGhlIHRlbXBsYXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICBzdXBlci5fZmluYWxpemVDbGFzcygpOwogICAgICAgIGNvbnN0IG9ic2VydmVycyA9IG93bk9ic2VydmVycyh0aGlzKTsKICAgICAgICBpZiAob2JzZXJ2ZXJzKSB7CiAgICAgICAgICB0aGlzLmNyZWF0ZU9ic2VydmVycyhvYnNlcnZlcnMsIHRoaXMuX3Byb3BlcnRpZXMpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9wcmVwYXJlVGVtcGxhdGUoKTsKICAgICAgfQoKICAgICAgc3RhdGljIF9wcmVwYXJlVGVtcGxhdGUoKSB7CiAgICAgICAgLy8gbm90ZTogY3JlYXRlICJ3b3JraW5nIiB0ZW1wbGF0ZSB0aGF0IGlzIGZpbmFsaXplZCBhdCBpbnN0YW5jZSB0aW1lCiAgICAgICAgbGV0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAodGhpcykudGVtcGxhdGU7CiAgICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICBsZXQgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7CiAgICAgICAgICAgIHQuaW5uZXJIVE1MID0gdGVtcGxhdGU7CiAgICAgICAgICAgIHRlbXBsYXRlID0gdDsKICAgICAgICAgIH0gZWxzZSBpZiAoIVBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGUgPSB0ZW1wbGF0ZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIG9mIFByb3BlcnRpZXNDaGFuZ2VkIGNyZWF0ZVByb3BlcnRpZXMgdG8gY3JlYXRlIGFjY2Vzc29ycwogICAgICAgKiBhbmQgcHJvcGVydHkgZWZmZWN0cyBmb3IgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICBjcmVhdGVQcm9wZXJ0eUZyb21Db25maWcodGhpcy5wcm90b3R5cGUsIHAsIHByb3BzW3BdLCBwcm9wcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBvYnNlcnZlcnMgZm9yIHRoZSBnaXZlbiBgb2JzZXJ2ZXJzYCBhcnJheS4KICAgICAgICogTGV2ZXJhZ2VzIGBQcm9wZXJ0eUVmZmVjdHNgIHRvIGNyZWF0ZSBvYnNlcnZlcnMuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYnNlcnZlcnMgQXJyYXkgb2Ygb2JzZXJ2ZXIgZGVzY3JpcHRvcnMgZm9yCiAgICAgICAqICAgdGhpcyBjbGFzcwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gZHluYW1pY0ZucyBPYmplY3QgY29udGFpbmluZyBrZXlzIGZvciBhbnkgcHJvcGVydGllcwogICAgICAgKiAgIHRoYXQgYXJlIGZ1bmN0aW9ucyBhbmQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdCB3aGVuIHRoZSBmdW5jdGlvbgogICAgICAgKiAgIHJlZmVyZW5jZSBpcyBjaGFuZ2VkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVPYnNlcnZlcnMob2JzZXJ2ZXJzLCBkeW5hbWljRm5zKSB7CiAgICAgICAgY29uc3QgcHJvdG8gPSB0aGlzLnByb3RvdHlwZTsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBvYnNlcnZlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHByb3RvLl9jcmVhdGVNZXRob2RPYnNlcnZlcihvYnNlcnZlcnNbaV0sIGR5bmFtaWNGbnMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHRoYXQgd2lsbCBiZSBzdGFtcGVkIGludG8gdGhpcyBlbGVtZW50J3Mgc2hhZG93IHJvb3QuCiAgICAgICAqCiAgICAgICAqIElmIGEgYHN0YXRpYyBnZXQgaXMoKWAgZ2V0dGVyIGlzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgICAqIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBgPHRlbXBsYXRlPmAgaW4gYSBgZG9tLW1vZHVsZWAgd2hvc2UgYGlkYAogICAgICAgKiBtYXRjaGVzIHRoaXMgZWxlbWVudCdzIGBpc2AuCiAgICAgICAqCiAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIGdldHRlciB0byByZXR1cm4gYW4gYXJiaXRyYXJ5IHRlbXBsYXRlCiAgICAgICAqIChpbiB3aGljaCBjYXNlIHRoZSBgaXNgIGdldHRlciBpcyB1bm5lY2Vzc2FyeSkuIFRoZSB0ZW1wbGF0ZSByZXR1cm5lZAogICAgICAgKiBtYXkgYmUgZWl0aGVyIGFuIGBIVE1MVGVtcGxhdGVFbGVtZW50YCBvciBhIHN0cmluZyB0aGF0IHdpbGwgYmUKICAgICAgICogYXV0b21hdGljYWxseSBwYXJzZWQgaW50byBhIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgd2hlbiBzdWJjbGFzc2luZywgaWYgdGhlIHN1cGVyIGNsYXNzIG92ZXJyb2RlIHRoZSBkZWZhdWx0CiAgICAgICAqIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgc3ViY2xhc3Mgd291bGQgbGlrZSB0byBwcm92aWRlIGFuIGFsdGVybmF0ZQogICAgICAgKiB0ZW1wbGF0ZSB2aWEgYSBgZG9tLW1vZHVsZWAsIGl0IHNob3VsZCBvdmVycmlkZSB0aGlzIGdldHRlciBhbmQKICAgICAgICogcmV0dXJuIGBQb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQodGhpcy5pcywgJ3RlbXBsYXRlJylgLgogICAgICAgKgogICAgICAgKiBJZiBhIHN1YmNsYXNzIHdvdWxkIGxpa2UgdG8gbW9kaWZ5IHRoZSBzdXBlciBjbGFzcyB0ZW1wbGF0ZSwgaXQgc2hvdWxkCiAgICAgICAqIGNsb25lIGl0IHJhdGhlciB0aGFuIG1vZGlmeSBpdCBpbiBwbGFjZS4gIElmIHRoZSBnZXR0ZXIgZG9lcyBleHBlbnNpdmUKICAgICAgICogd29yayBzdWNoIGFzIGNsb25pbmcvbW9kaWZ5aW5nIGEgdGVtcGxhdGUsIGl0IHNob3VsZCBtZW1vaXplIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBmb3IgbWF4aW11bSBwZXJmb3JtYW5jZToKICAgICAgICoKICAgICAgICogICBsZXQgbWVtb2l6ZWRUZW1wbGF0ZTsKICAgICAgICogICBjbGFzcyBNeVN1YkNsYXNzIGV4dGVuZHMgTXlTdXBlckNsYXNzIHsKICAgICAgICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgICAqICAgICAgIGlmICghbWVtb2l6ZWRUZW1wbGF0ZSkgewogICAgICAgKiAgICAgICAgIG1lbW9pemVkVGVtcGxhdGUgPSBNeVN1cGVyQ2xhc3MudGVtcGxhdGUuY2xvbmVOb2RlKHRydWUpOwogICAgICAgKiAgICAgICAgIGxldCBzdWJDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAqICAgICAgICAgc3ViQ29udGVudC50ZXh0Q29udGVudCA9ICdUaGlzIGNhbWUgZnJvbSBNeVN1YkNsYXNzJzsKICAgICAgICogICAgICAgICBtZW1vaXplZFRlbXBsYXRlLmNvbnRlbnQuYXBwZW5kQ2hpbGQoc3ViQ29udGVudCk7CiAgICAgICAqICAgICAgIH0KICAgICAgICogICAgICAgcmV0dXJuIG1lbW9pemVkVGVtcGxhdGU7CiAgICAgICAqICAgICB9CiAgICAgICAqICAgfQogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHtIVE1MVGVtcGxhdGVFbGVtZW50fHN0cmluZ30gVGVtcGxhdGUgdG8gYmUgc3RhbXBlZAogICAgICAgKi8KICAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsKICAgICAgICAvLyBFeHBsYW5hdGlvbiBvZiB0ZW1wbGF0ZS1yZWxhdGVkIHByb3BlcnRpZXM6CiAgICAgICAgLy8gLSBjb25zdHJ1Y3Rvci50ZW1wbGF0ZSAodGhpcyBnZXR0ZXIpOiB0aGUgdGVtcGxhdGUgZm9yIHRoZSBjbGFzcy4KICAgICAgICAvLyAgICAgVGhpcyBjYW4gY29tZSBmcm9tIHRoZSBwcm90b3R5cGUgKGZvciBsZWdhY3kgZWxlbWVudHMpLCBmcm9tIGEKICAgICAgICAvLyAgICAgZG9tLW1vZHVsZSwgb3IgZnJvbSB0aGUgc3VwZXIgY2xhc3MncyB0ZW1wbGF0ZSAob3IgY2FuIGJlIG92ZXJyaWRkZW4KICAgICAgICAvLyAgICAgYWx0b2dldGhlciBieSB0aGUgdXNlcikKICAgICAgICAvLyAtIGNvbnN0cnVjdG9yLl90ZW1wbGF0ZTogbWVtb2l6ZWQgdmVyc2lvbiBvZiBjb25zdHJ1Y3Rvci50ZW1wbGF0ZQogICAgICAgIC8vIC0gcHJvdG90eXBlLl90ZW1wbGF0ZTogd29ya2luZyB0ZW1wbGF0ZSBmb3IgdGhlIGVsZW1lbnQsIHdoaWNoIHdpbGwgYmUKICAgICAgICAvLyAgICAgcGFyc2VkIGFuZCBtb2RpZmllZCBpbiBwbGFjZS4gSXQgaXMgYSBjbG9uZWQgdmVyc2lvbiBvZgogICAgICAgIC8vICAgICBjb25zdHJ1Y3Rvci50ZW1wbGF0ZSwgc2F2ZWQgaW4gX2ZpbmFsaXplQ2xhc3MoKS4gTm90ZSB0aGF0IGJlZm9yZQogICAgICAgIC8vICAgICB0aGlzIGdldHRlciBpcyBjYWxsZWQsIGZvciBsZWdhY3kgZWxlbWVudHMgdGhpcyBjb3VsZCBiZSBmcm9tIGEKICAgICAgICAvLyAgICAgX3RlbXBsYXRlIGZpZWxkIG9uIHRoZSBpbmZvIG9iamVjdCBwYXNzZWQgdG8gUG9seW1lcigpLCBhIGJlaGF2aW9yLAogICAgICAgIC8vICAgICBvciBzZXQgaW4gcmVnaXN0ZXJlZCgpOyBvbmNlIHRoZSBzdGF0aWMgZ2V0dGVyIHJ1bnMsIGEgY2xvbmUgb2YgaXQKICAgICAgICAvLyAgICAgd2lsbCBvdmVyd3JpdGUgaXQgb24gdGhlIHByb3RvdHlwZSBhcyB0aGUgd29ya2luZyB0ZW1wbGF0ZS4KICAgICAgICBpZiAoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX3RlbXBsYXRlJywgdGhpcykpKSB7CiAgICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9CiAgICAgICAgICAgIC8vIElmIHVzZXIgaGFzIHB1dCB0ZW1wbGF0ZSBvbiBwcm90b3R5cGUgKGUuZy4gaW4gbGVnYWN5IHZpYSByZWdpc3RlcmVkCiAgICAgICAgICAgIC8vIGNhbGxiYWNrIG9yIGluZm8gb2JqZWN0KSwgcHJlZmVyIHRoYXQgZmlyc3QKICAgICAgICAgICAgdGhpcy5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX3RlbXBsYXRlJywgdGhpcy5wcm90b3R5cGUpKSA/CiAgICAgICAgICAgIHRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZSA6CiAgICAgICAgICAgIC8vIExvb2sgaW4gZG9tLW1vZHVsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50J3MgaXMKICAgICAgICAgICAgKGdldFRlbXBsYXRlRnJvbURvbU1vZHVsZSgvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLmlzKSB8fAogICAgICAgICAgICAvLyBOZXh0IGxvb2sgZm9yIHN1cGVyY2xhc3MgdGVtcGxhdGUgKGNhbGwgdGhlIHN1cGVyIGltcGwgdGhpcwogICAgICAgICAgICAvLyB3YXkgc28gdGhhdCBgdGhpc2AgcG9pbnRzIHRvIHRoZSBzdXBlcmNsYXNzKQogICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSovICh0aGlzKS5wcm90b3R5cGUpLmNvbnN0cnVjdG9yLnRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2V0IHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudHxzdHJpbmd9IHZhbHVlIFRlbXBsYXRlIHRvIHNldC4KICAgICAgICovCiAgICAgIHN0YXRpYyBzZXQgdGVtcGxhdGUodmFsdWUpIHsKICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9IHZhbHVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGF0aCBtYXRjaGluZyB0aGUgdXJsIGZyb20gd2hpY2ggdGhlIGVsZW1lbnQgd2FzIGltcG9ydGVkLgogICAgICAgKgogICAgICAgKiBUaGlzIHBhdGggaXMgdXNlZCB0byByZXNvbHZlIHVybCdzIGluIHRlbXBsYXRlIHN0eWxlIGNzc1RleHQuCiAgICAgICAqIFRoZSBgaW1wb3J0UGF0aGAgcHJvcGVydHkgaXMgYWxzbyBzZXQgb24gZWxlbWVudCBpbnN0YW5jZXMgYW5kIGNhbiBiZQogICAgICAgKiB1c2VkIHRvIGNyZWF0ZSBiaW5kaW5ncyByZWxhdGl2ZSB0byB0aGUgaW1wb3J0IHBhdGguCiAgICAgICAqCiAgICAgICAqIEZvciBlbGVtZW50cyBkZWZpbmVkIGluIEVTIG1vZHVsZXMsIHVzZXJzIHNob3VsZCBpbXBsZW1lbnQKICAgICAgICogYHN0YXRpYyBnZXQgaW1wb3J0TWV0YSgpIHsgcmV0dXJuIGltcG9ydC5tZXRhOyB9YCwgYW5kIHRoZSBkZWZhdWx0CiAgICAgICAqIGltcGxlbWVudGF0aW9uIG9mIGBpbXBvcnRQYXRoYCB3aWxsICByZXR1cm4gYGltcG9ydC5tZXRhLnVybGAncyBwYXRoLgogICAgICAgKiBGb3IgZWxlbWVudHMgZGVmaW5lZCBpbiBIVE1MIGltcG9ydHMsIHRoaXMgZ2V0dGVyIHdpbGwgcmV0dXJuIHRoZSBwYXRoCiAgICAgICAqIHRvIHRoZSBkb2N1bWVudCBjb250YWluaW5nIGEgYGRvbS1tb2R1bGVgIGVsZW1lbnQgbWF0Y2hpbmcgdGhpcwogICAgICAgKiBlbGVtZW50J3Mgc3RhdGljIGBpc2AgcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIE5vdGUsIHRoaXMgcGF0aCBzaG91bGQgY29udGFpbiBhIHRyYWlsaW5nIGAvYC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW1wb3J0IHBhdGggZm9yIHRoaXMgZWxlbWVudCBjbGFzcwogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfQogICAgICAgKi8KICAgICAgc3RhdGljIGdldCBpbXBvcnRQYXRoKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfaW1wb3J0UGF0aCcsIHRoaXMpKSkgewogICAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuaW1wb3J0TWV0YTsKICAgICAgICAgIGlmIChtZXRhKSB7CiAgICAgICAgICAgIHRoaXMuX2ltcG9ydFBhdGggPSBQb2x5bWVyLlJlc29sdmVVcmwucGF0aEZyb21VcmwobWV0YS51cmwpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gUG9seW1lci5Eb21Nb2R1bGUgJiYgUG9seW1lci5Eb21Nb2R1bGUuaW1wb3J0KC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gKi8gKHRoaXMpLmlzKTsKICAgICAgICAgICAgdGhpcy5faW1wb3J0UGF0aCA9IChtb2R1bGUgJiYgbW9kdWxlLmFzc2V0cGF0aCkgfHwKICAgICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSovICh0aGlzKS5wcm90b3R5cGUpLmNvbnN0cnVjdG9yLmltcG9ydFBhdGg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9pbXBvcnRQYXRoOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8KICAgICAgICB0aGlzLl90ZW1wbGF0ZTsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLl9pbXBvcnRQYXRoOwogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXMucm9vdFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgdGhpcy5pbXBvcnRQYXRoOwogICAgICAgIC8qKiBAdHlwZSB7U3RhbXBlZFRlbXBsYXRlIHwgSFRNTEVsZW1lbnQgfCBTaGFkb3dSb290fSAqLwogICAgICAgIHRoaXMucm9vdDsKICAgICAgICAvKiogQHR5cGUgeyFPYmplY3Q8c3RyaW5nLCAhRWxlbWVudD59ICovCiAgICAgICAgdGhpcy4kOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzYCB0byBlbnN1cmUgY2xhc3MKICAgICAgICogbWV0YXByb2dyYW1taW5nIHJlbGF0ZWQgdG8gcHJvcGVydHkgYWNjZXNzb3JzIGFuZCBlZmZlY3RzIGhhcwogICAgICAgKiBjb21wbGV0ZWQgKGNhbGxzIGBmaW5hbGl6ZWApLgogICAgICAgKgogICAgICAgKiBJdCBhbHNvIGluaXRpYWxpemVzIGFueSBwcm9wZXJ0eSBkZWZhdWx0cyBwcm92aWRlZCB2aWEgYHZhbHVlYCBpbgogICAgICAgKiBgcHJvcGVydGllc2AgbWV0YWRhdGEuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmZpbmFsaXplKCk7CiAgICAgICAgLy8gbm90ZTogZmluYWxpemUgdGVtcGxhdGUgd2hlbiB3ZSBoYXZlIGFjY2VzcyB0byBgbG9jYWxOYW1lYCB0bwogICAgICAgIC8vIGF2b2lkIGRlcGVuZGVuY2Ugb24gYGlzYCBmb3IgcG9seWZpbGxpbmcgc3R5bGluZy4KICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLl9maW5hbGl6ZVRlbXBsYXRlKC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKS5sb2NhbE5hbWUpOwogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIC8vIHNldCBwYXRoIGRlZmF1bHRzCiAgICAgICAgdGhpcy5yb290UGF0aCA9IFBvbHltZXIucm9vdFBhdGg7CiAgICAgICAgdGhpcy5pbXBvcnRQYXRoID0gdGhpcy5jb25zdHJ1Y3Rvci5pbXBvcnRQYXRoOwogICAgICAgIC8vIGFwcGx5IHByb3BlcnR5IGRlZmF1bHRzLi4uCiAgICAgICAgbGV0IHAkID0gcHJvcGVydHlEZWZhdWx0cyh0aGlzLmNvbnN0cnVjdG9yKTsKICAgICAgICBpZiAoIXAkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IHAgaW4gcCQpIHsKICAgICAgICAgIGxldCBpbmZvID0gcCRbcF07CiAgICAgICAgICAvLyBEb24ndCBzZXQgZGVmYXVsdCB2YWx1ZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIG93biBwcm9wZXJ0eSwgd2hpY2gKICAgICAgICAgIC8vIGhhcHBlbnMgd2hlbiBhIGBwcm9wZXJ0aWVzYCBwcm9wZXJ0eSB3aXRoIGRlZmF1bHQgYnV0IG5vIGVmZmVjdHMgaGFkCiAgICAgICAgICAvLyBhIHByb3BlcnR5IHNldCAoZS5nLiBib3VuZCkgYnkgaXRzIGhvc3QgYmVmb3JlIHVwZ3JhZGUKICAgICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShwKSkgewogICAgICAgICAgICBsZXQgdmFsdWUgPSB0eXBlb2YgaW5mby52YWx1ZSA9PSAnZnVuY3Rpb24nID8KICAgICAgICAgICAgICBpbmZvLnZhbHVlLmNhbGwodGhpcykgOgogICAgICAgICAgICAgIGluZm8udmFsdWU7CiAgICAgICAgICAgIC8vIFNldCB2aWEgYF9zZXRQcm9wZXJ0eWAgaWYgdGhlcmUgaXMgYW4gYWNjZXNzb3IsIHRvIGVuYWJsZQogICAgICAgICAgICAvLyBpbml0aWFsaXppbmcgcmVhZE9ubHkgcHJvcGVydHkgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKHRoaXMuX2hhc0FjY2Vzc29yKHApKSB7CiAgICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KHAsIHZhbHVlLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzW3BdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBHYXRoZXIgc3R5bGUgdGV4dCBmb3IgYSBzdHlsZSBlbGVtZW50IGluIHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNzc1RleHQgVGV4dCBjb250YWluaW5nIHN0eWxpbmcgdG8gcHJvY2VzcwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSB0byByZWJhc2UgQ1NTIHBhdGhzIGFnYWluc3QKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgcHJvY2Vzc2VkIENTUyB0ZXh0CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBfcHJvY2Vzc1N0eWxlVGV4dChjc3NUZXh0LCBiYXNlVVJJKSB7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlQ3NzKGNzc1RleHQsIGJhc2VVUkkpOwogICAgICB9CgogICAgICAvKioKICAgICAgKiBDb25maWd1cmVzIGFuIGVsZW1lbnQgYHByb3RvYCB0byBmdW5jdGlvbiB3aXRoIGEgZ2l2ZW4gYHRlbXBsYXRlYC4KICAgICAgKiBUaGUgZWxlbWVudCBuYW1lIGBpc2AgYW5kIGV4dGVuZHMgYGV4dGAgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIFNoYWR5Q1NTCiAgICAgICogc3R5bGUgc2NvcGluZy4KICAgICAgKgogICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpcyBUYWcgbmFtZSAob3IgdHlwZSBleHRlbnNpb24gbmFtZSkgZm9yIHRoaXMgZWxlbWVudAogICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICogQHByb3RlY3RlZAogICAgICAqLwogICAgICBzdGF0aWMgX2ZpbmFsaXplVGVtcGxhdGUoaXMpIHsKICAgICAgICAvKiogQGNvbnN0IHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLwogICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5wcm90b3R5cGUuX3RlbXBsYXRlOwogICAgICAgIGlmICh0ZW1wbGF0ZSAmJiAhdGVtcGxhdGUuX19wb2x5bWVyRmluYWxpemVkKSB7CiAgICAgICAgICB0ZW1wbGF0ZS5fX3BvbHltZXJGaW5hbGl6ZWQgPSB0cnVlOwogICAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IHRoaXMuaW1wb3J0UGF0aDsKICAgICAgICAgIGNvbnN0IGJhc2VVUkkgPSBpbXBvcnRQYXRoID8gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVVcmwoaW1wb3J0UGF0aCkgOiAnJzsKICAgICAgICAgIC8vIGUuZy4gc3VwcG9ydCBgaW5jbHVkZT0ibW9kdWxlLW5hbWUiYCwgYW5kIFNoYWR5Q1NTCiAgICAgICAgICBwcm9jZXNzRWxlbWVudFN0eWxlcyh0aGlzLCB0ZW1wbGF0ZSwgaXMsIGJhc2VVUkkpOwogICAgICAgICAgdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdGFuZGFyZCBDdXN0b20gRWxlbWVudHMKICAgICAgICogYGNvbm5lY3RlZENhbGxiYWNrYC4KICAgICAgICoKICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZW5hYmxlcyB0aGUgcHJvcGVydHkgZWZmZWN0cyBzeXN0ZW0gYW5kCiAgICAgICAqIGZsdXNoZXMgYW55IHBlbmRpbmcgcHJvcGVydGllcywgYW5kIHVwZGF0ZXMgc2hpbW1lZCBDU1MgcHJvcGVydGllcwogICAgICAgKiB3aGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nL2N1c3RvbSBwcm9wZXJ0aWVzIHBvbHlmaWxsLgogICAgICAgKgogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzLCBpbnZhbGlkQ2FzdHN9IFN1cGVyIG1heSBvciBtYXkgbm90IGltcGxlbWVudCB0aGUgY2FsbGJhY2sKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIGlmICh3aW5kb3cuU2hhZHlDU1MgJiYgdGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZUVsZW1lbnQoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFN0YW1wcyB0aGUgZWxlbWVudCB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICByZWFkeSgpIHsKICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUodGhpcy5fdGVtcGxhdGUpOwogICAgICAgICAgdGhpcy4kID0gdGhpcy5yb290LiQ7CiAgICAgICAgfQogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJbXBsZW1lbnRzIGBQcm9wZXJ0eUVmZmVjdHNgJ3MgYF9yZWFkeUNsaWVudHNgIGNhbGwuIEF0dGFjaGVzCiAgICAgICAqIGVsZW1lbnQgZG9tIGJ5IGNhbGxpbmcgYF9hdHRhY2hEb21gIHdpdGggdGhlIGRvbSBzdGFtcGVkIGZyb20gdGhlCiAgICAgICAqIGVsZW1lbnQncyB0ZW1wbGF0ZSB2aWEgYF9zdGFtcFRlbXBsYXRlYC4gTm90ZSB0aGF0IHRoaXMgYWxsb3dzCiAgICAgICAqIGNsaWVudCBkb20gdG8gYmUgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQgcHJpb3IgdG8gYW55IG9ic2VydmVycwogICAgICAgKiBydW5uaW5nLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIF9yZWFkeUNsaWVudHMoKSB7CiAgICAgICAgaWYgKHRoaXMuX3RlbXBsYXRlKSB7CiAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLl9hdHRhY2hEb20oLyoqIEB0eXBlIHtTdGFtcGVkVGVtcGxhdGV9ICovKHRoaXMucm9vdCkpOwogICAgICAgIH0KICAgICAgICAvLyBUaGUgc3VwZXIuX3JlYWR5Q2xpZW50cyBoZXJlIHNldHMgdGhlIGNsaWVudHMgaW5pdGlhbGl6ZWQgZmxhZy4KICAgICAgICAvLyBXZSBtdXN0IHdhaXQgdG8gZG8gdGhpcyB1bnRpbCBhZnRlciBjbGllbnQgZG9tIGlzIGNyZWF0ZWQvYXR0YWNoZWQKICAgICAgICAvLyBzbyB0aGF0IHRoaXMgZmxhZyBjYW4gYmUgY2hlY2tlZCB0byBwcmV2ZW50IG5vdGlmaWNhdGlvbnMgZmlyZWQKICAgICAgICAvLyBkdXJpbmcgdGhpcyBwcm9jZXNzIGZyb20gYmVpbmcgaGFuZGxlZCBiZWZvcmUgY2xpZW50cyBhcmUgcmVhZHkuCiAgICAgICAgc3VwZXIuX3JlYWR5Q2xpZW50cygpOwogICAgICB9CgoKICAgICAgLyoqCiAgICAgICAqIEF0dGFjaGVzIGFuIGVsZW1lbnQncyBzdGFtcGVkIGRvbSB0byBpdHNlbGYuIEJ5IGRlZmF1bHQsCiAgICAgICAqIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBgc2hhZG93Um9vdGAgYW5kIGFkZHMgdGhlIGRvbSB0byBpdC4KICAgICAgICogSG93ZXZlciwgdGhpcyBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4gdG8gYWxsb3cgYW4gZWxlbWVudAogICAgICAgKiB0byBwdXQgaXRzIGRvbSBpbiBhbm90aGVyIGxvY2F0aW9uLgogICAgICAgKgogICAgICAgKiBAdGhyb3dzIHtFcnJvcn0KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUmV0dXJufQogICAgICAgKiBAcGFyYW0ge1N0YW1wZWRUZW1wbGF0ZX0gZG9tIHRvIGF0dGFjaCB0byB0aGUgZWxlbWVudC4KICAgICAgICogQHJldHVybiB7U2hhZG93Um9vdH0gbm9kZSB0byB3aGljaCB0aGUgZG9tIGhhcyBiZWVuIGF0dGFjaGVkLgogICAgICAgKi8KICAgICAgX2F0dGFjaERvbShkb20pIHsKICAgICAgICBpZiAodGhpcy5hdHRhY2hTaGFkb3cpIHsKICAgICAgICAgIGlmIChkb20pIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnNoYWRvd1Jvb3QpIHsKICAgICAgICAgICAgICB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZTogJ29wZW4nfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGRvbSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3Q7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaGFkb3dET00gbm90IGF2YWlsYWJsZS4gJyArCiAgICAgICAgICAgIC8vIFRPRE8oc29ydmVsbCk6IG1vdmUgdG8gY29tcGlsZS10aW1lIGNvbmRpdGlvbmFsIHdoZW4gc3VwcG9ydGVkCiAgICAgICAgICAnUG9seW1lci5FbGVtZW50IGNhbiBjcmVhdGUgZG9tIGFzIGNoaWxkcmVuIGluc3RlYWQgb2YgaW4gJyArCiAgICAgICAgICAnU2hhZG93RE9NIGJ5IHNldHRpbmcgYHRoaXMucm9vdCA9IHRoaXM7XGAgYmVmb3JlIFxgcmVhZHlcYC4nKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBXaGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydHkgc2hpbSwgY2F1c2VzIGFsbAogICAgICAgKiBzaGltbWVkIHN0eWxlcyBpbiB0aGlzIGVsZW1lbnQgKGFuZCBpdHMgc3VidHJlZSkgdG8gYmUgdXBkYXRlZAogICAgICAgKiBiYXNlZCBvbiBjdXJyZW50IGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMuCiAgICAgICAqCiAgICAgICAqIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgb3ZlcnJpZGVzIGlubGluZSBjdXN0b20gcHJvcGVydHkgc3R5bGVzIHdpdGggYW4KICAgICAgICogb2JqZWN0IG9mIHByb3BlcnRpZXMgd2hlcmUgdGhlIGtleXMgYXJlIENTUyBwcm9wZXJ0aWVzLCBhbmQgdGhlIHZhbHVlcwogICAgICAgKiBhcmUgc3RyaW5ncy4KICAgICAgICoKICAgICAgICogRXhhbXBsZTogYHRoaXMudXBkYXRlU3R5bGVzKHsnLS1jb2xvcic6ICdibHVlJ30pYAogICAgICAgKgogICAgICAgKiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSByZXRhaW5lZCB1bmxlc3MgYSB2YWx1ZSBvZiBgbnVsbGAgaXMgc2V0LgogICAgICAgKgogICAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgdXBkYXRpbmcgQ1NTIG1peGlucy4KICAgICAgICogWW91IGNhbiBub3QgZHluYW1pY2FsbHkgY2hhbmdlIHRoZSB2YWx1ZSBvZiBhbiBgQGFwcGx5YC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBwcm9wZXJ0aWVzIEJhZyBvZiBjdXN0b20gcHJvcGVydHkga2V5L3ZhbHVlcyB0bwogICAgICAgKiAgIGFwcGx5IHRvIHRoaXMgZWxlbWVudC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICAgICAqLwogICAgICB1cGRhdGVTdHlsZXMocHJvcGVydGllcykgewogICAgICAgIGlmICh3aW5kb3cuU2hhZHlDU1MpIHsKICAgICAgICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZVN1YnRyZWUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXdyaXRlcyBhIGdpdmVuIFVSTCByZWxhdGl2ZSB0byBhIGJhc2UgVVJMLiBUaGUgYmFzZSBVUkwgZGVmYXVsdHMgdG8KICAgICAgICogdGhlIG9yaWdpbmFsIGxvY2F0aW9uIG9mIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBgZG9tLW1vZHVsZWAgZm9yCiAgICAgICAqIHRoaXMgZWxlbWVudC4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHNhbWUgVVJMIGJlZm9yZSBhbmQgYWZ0ZXIKICAgICAgICogYnVuZGxpbmcuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIG5vIHJlc29sdXRpb24gZm9yIFVSTHMgdGhhdCBzdGFydAogICAgICAgKiB3aXRoIGAvYCAoYWJzb2x1dGUgVVJMcykgb3IgYCNgIChoYXNoIGlkZW50aWZpZXJzKS4gIEZvciBnZW5lcmFsIHB1cnBvc2UKICAgICAgICogVVJMIHJlc29sdXRpb24sIHVzZSBgd2luZG93LlVSTGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHRvIHJlc29sdmUuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gYmFzZSBPcHRpb25hbCBiYXNlIFVSTCB0byByZXNvbHZlIGFnYWluc3QsIGRlZmF1bHRzCiAgICAgICAqIHRvIHRoZSBlbGVtZW50J3MgYGltcG9ydFBhdGhgCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gUmV3cml0dGVuIFVSTCByZWxhdGl2ZSB0byBiYXNlCiAgICAgICAqLwogICAgICByZXNvbHZlVXJsKHVybCwgYmFzZSkgewogICAgICAgIGlmICghYmFzZSAmJiB0aGlzLmltcG9ydFBhdGgpIHsKICAgICAgICAgIGJhc2UgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCh0aGlzLmltcG9ydFBhdGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVVcmwodXJsLCBiYXNlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcnNgIHRvIGFkZCBtYXAgb2YgZHluYW1pYyBmdW5jdGlvbnMgb24KICAgICAgICogdGVtcGxhdGUgaW5mbywgZm9yIGNvbnN1bXB0aW9uIGJ5IGBQcm9wZXJ0eUVmZmVjdHNgIHRlbXBsYXRlIGJpbmRpbmcKICAgICAgICogY29kZS4gVGhpcyBtYXAgZGV0ZXJtaW5lcyB3aGljaCBtZXRob2QgdGVtcGxhdGVzIHNob3VsZCBoYXZlIGFjY2Vzc29ycwogICAgICAgKiBjcmVhdGVkIGZvciB0aGVtLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVDb250ZW50KHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgdGVtcGxhdGVJbmZvLmR5bmFtaWNGbnMgPSB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZucyB8fCB0aGlzLl9wcm9wZXJ0aWVzOwogICAgICAgIHJldHVybiBzdXBlci5fcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICB9CgogICAgfQoKICAgIHJldHVybiBQb2x5bWVyRWxlbWVudDsKICB9KTsKCiAgLyoqCiAgICogV2hlbiB1c2luZyB0aGUgU2hhZHlDU1Mgc2NvcGluZyBhbmQgY3VzdG9tIHByb3BlcnR5IHNoaW0sIGNhdXNlcyBhbGwKICAgKiBzaGltbWVkIGBzdHlsZXNgICh2aWEgYGN1c3RvbS1zdHlsZWApIGluIHRoZSBkb2N1bWVudCAoYW5kIGl0cyBzdWJ0cmVlKQogICAqIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gY3VycmVudCBjdXN0b20gcHJvcGVydHkgdmFsdWVzLgogICAqCiAgICogVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvdmVycmlkZXMgaW5saW5lIGN1c3RvbSBwcm9wZXJ0eSBzdHlsZXMgd2l0aCBhbgogICAqIG9iamVjdCBvZiBwcm9wZXJ0aWVzIHdoZXJlIHRoZSBrZXlzIGFyZSBDU1MgcHJvcGVydGllcywgYW5kIHRoZSB2YWx1ZXMKICAgKiBhcmUgc3RyaW5ncy4KICAgKgogICAqIEV4YW1wbGU6IGBQb2x5bWVyLnVwZGF0ZVN0eWxlcyh7Jy0tY29sb3InOiAnYmx1ZSd9KWAKICAgKgogICAqIFRoZXNlIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkIHVubGVzcyBhIHZhbHVlIG9mIGBudWxsYCBpcyBzZXQuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BzIEJhZyBvZiBjdXN0b20gcHJvcGVydHkga2V5L3ZhbHVlcyB0bwogICAqICAgYXBwbHkgdG8gdGhlIGRvY3VtZW50LgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci51cGRhdGVTdHlsZXMgPSBmdW5jdGlvbihwcm9wcykgewogICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICB3aW5kb3cuU2hhZHlDU1Muc3R5bGVEb2N1bWVudChwcm9wcyk7CiAgICB9CiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQHN1bW1hcnkgQ29sbGFwc2UgbXVsdGlwbGUgY2FsbGJhY2tzIGludG8gb25lIGludm9jYXRpb24gYWZ0ZXIgYSB0aW1lci4KICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIGNsYXNzIERlYm91bmNlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgdGhpcy5fYXN5bmNNb2R1bGUgPSBudWxsOwogICAgICB0aGlzLl9jYWxsYmFjayA9IG51bGw7CiAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgc2NoZWR1bGVyOyB0aGF0IGlzLCBhIG1vZHVsZSB3aXRoIHRoZSBBc3luYyBpbnRlcmZhY2UsCiAgICAgKiBhIGNhbGxiYWNrIGFuZCBvcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBydW4gZnVuY3Rpb24KICAgICAqIGZyb20gdGhlIGFzeW5jIG1vZHVsZS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFBc3luY0ludGVyZmFjZX0gYXN5bmNNb2R1bGUgT2JqZWN0IHdpdGggQXN5bmMgaW50ZXJmYWNlLgogICAgICogQHBhcmFtIHtmdW5jdGlvbigpfSBjYWxsYmFjayBDYWxsYmFjayB0byBydW4uCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBzZXRDb25maWcoYXN5bmNNb2R1bGUsIGNhbGxiYWNrKSB7CiAgICAgIHRoaXMuX2FzeW5jTW9kdWxlID0gYXN5bmNNb2R1bGU7CiAgICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMuX3RpbWVyID0gdGhpcy5fYXN5bmNNb2R1bGUucnVuKCgpID0+IHsKICAgICAgICB0aGlzLl90aW1lciA9IG51bGw7CiAgICAgICAgdGhpcy5fY2FsbGJhY2soKTsKICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIENhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlciBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdHNlbGYuCiAgICAgKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY2FuY2VsKCkgewogICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7CiAgICAgICAgdGhpcy5fYXN5bmNNb2R1bGUuY2FuY2VsKHRoaXMuX3RpbWVyKTsKICAgICAgICB0aGlzLl90aW1lciA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRmx1c2hlcyBhbiBhY3RpdmUgZGVib3VuY2VyIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmbHVzaCgpIHsKICAgICAgaWYgKHRoaXMuaXNBY3RpdmUoKSkgewogICAgICAgIHRoaXMuY2FuY2VsKCk7CiAgICAgICAgdGhpcy5fY2FsbGJhY2soKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRlYm91bmNlciBpcyBhY3RpdmUuCiAgICAgKgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhY3RpdmUuCiAgICAgKi8KICAgIGlzQWN0aXZlKCkgewogICAgICByZXR1cm4gdGhpcy5fdGltZXIgIT0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGRlYm91bmNlciBpZiBubyBkZWJvdW5jZXIgaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyCiAgICAgKiBvciBpdCBjYW5jZWxzIGFuIGFjdGl2ZSBkZWJvdW5jZXIgb3RoZXJ3aXNlLiBUaGUgZm9sbG93aW5nCiAgICAgKiBleGFtcGxlIHNob3dzIGhvdyBhIGRlYm91bmNlciBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhCiAgICAgKiBtaWNyb3Rhc2sgYW5kICJkZWJvdW5jZWQiIHN1Y2ggdGhhdCB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gaXMKICAgICAqIGNhbGxlZCBvbmNlLiBBZGQgdGhpcyBtZXRob2QgdG8gYSBjdXN0b20gZWxlbWVudDoKICAgICAqCiAgICAgKiBfZGVib3VuY2VXb3JrKCkgewogICAgICogICB0aGlzLl9kZWJvdW5jZUpvYiA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlSm9iLAogICAgICogICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2ssICgpID0+IHsKICAgICAqICAgICB0aGlzLl9kb1dvcmsoKTsKICAgICAqICAgfSk7CiAgICAgKiB9CiAgICAgKgogICAgICogSWYgdGhlIGBfZGVib3VuY2VXb3JrYCBtZXRob2QgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZQogICAgICogbWljcm90YXNrLCB0aGUgYF9kb1dvcmtgIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSBhdCB0aGUgbmV4dAogICAgICogbWljcm90YXNrIGNoZWNrcG9pbnQuCiAgICAgKgogICAgICogTm90ZTogSW4gdGVzdGluZyBpdCBpcyBvZnRlbiBjb252ZW5pZW50IHRvIGF2b2lkIGFzeW5jaHJvbnkuIFRvIGFjY29tcGxpc2gKICAgICAqIHRoaXMgd2l0aCBhIGRlYm91bmNlciwgeW91IGNhbiB1c2UgYFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcmAgYW5kCiAgICAgKiBgUG9seW1lci5mbHVzaGAuIEZvciBleGFtcGxlLCBleHRlbmQgdGhlIGFib3ZlIGV4YW1wbGUgYnkgYWRkaW5nCiAgICAgKiBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyKHRoaXMuX2RlYm91bmNlSm9iKWAgYXQgdGhlIGVuZCBvZiB0aGUKICAgICAqIGBfZGVib3VuY2VXb3JrYCBtZXRob2QuIFRoZW4gaW4gYSB0ZXN0LCBjYWxsIGBQb2x5bWVyLmZsdXNoYCB0byBlbnN1cmUKICAgICAqIHRoZSBkZWJvdW5jZXIgaGFzIGNvbXBsZXRlZC4KICAgICAqCiAgICAgKiBAcGFyYW0ge0RlYm91bmNlcj99IGRlYm91bmNlciBEZWJvdW5jZXIgb2JqZWN0LgogICAgICogQHBhcmFtIHshQXN5bmNJbnRlcmZhY2V9IGFzeW5jTW9kdWxlIE9iamVjdCB3aXRoIEFzeW5jIGludGVyZmFjZQogICAgICogQHBhcmFtIHtmdW5jdGlvbigpfSBjYWxsYmFjayBDYWxsYmFjayB0byBydW4uCiAgICAgKiBAcmV0dXJuIHshRGVib3VuY2VyfSBSZXR1cm5zIGEgZGVib3VuY2VyIG9iamVjdC4KICAgICAqLwogICAgc3RhdGljIGRlYm91bmNlKGRlYm91bmNlciwgYXN5bmNNb2R1bGUsIGNhbGxiYWNrKSB7CiAgICAgIGlmIChkZWJvdW5jZXIgaW5zdGFuY2VvZiBEZWJvdW5jZXIpIHsKICAgICAgICBkZWJvdW5jZXIuY2FuY2VsKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVib3VuY2VyID0gbmV3IERlYm91bmNlcigpOwogICAgICB9CiAgICAgIGRlYm91bmNlci5zZXRDb25maWcoYXN5bmNNb2R1bGUsIGNhbGxiYWNrKTsKICAgICAgcmV0dXJuIGRlYm91bmNlcjsKICAgIH0KICB9CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRlYm91bmNlciA9IERlYm91bmNlcjsKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gZGV0ZWN0IG5hdGl2ZSB0b3VjaCBhY3Rpb24gc3VwcG9ydAogIGxldCBIQVNfTkFUSVZFX1RBID0gdHlwZW9mIGRvY3VtZW50LmhlYWQuc3R5bGUudG91Y2hBY3Rpb24gPT09ICdzdHJpbmcnOwogIGxldCBHRVNUVVJFX0tFWSA9ICdfX3BvbHltZXJHZXN0dXJlcyc7CiAgbGV0IEhBTkRMRURfT0JKID0gJ19fcG9seW1lckdlc3R1cmVzSGFuZGxlZCc7CiAgbGV0IFRPVUNIX0FDVElPTiA9ICdfX3BvbHltZXJHZXN0dXJlc1RvdWNoQWN0aW9uJzsKICAvLyByYWRpdXMgZm9yIHRhcCBhbmQgdHJhY2sKICBsZXQgVEFQX0RJU1RBTkNFID0gMjU7CiAgbGV0IFRSQUNLX0RJU1RBTkNFID0gNTsKICAvLyBudW1iZXIgb2YgbGFzdCBOIHRyYWNrIHBvc2l0aW9ucyB0byBrZWVwCiAgbGV0IFRSQUNLX0xFTkdUSCA9IDI7CgogIC8vIERpc2FibGluZyAibW91c2UiIGhhbmRsZXJzIGZvciAyNTAwbXMgaXMgZW5vdWdoCiAgbGV0IE1PVVNFX1RJTUVPVVQgPSAyNTAwOwogIGxldCBNT1VTRV9FVkVOVFMgPSBbJ21vdXNlZG93bicsICdtb3VzZW1vdmUnLCAnbW91c2V1cCcsICdjbGljayddOwogIC8vIGFuIGFycmF5IG9mIGJpdG1hc2sgdmFsdWVzIGZvciBtYXBwaW5nIE1vdXNlRXZlbnQud2hpY2ggdG8gTW91c2VFdmVudC5idXR0b25zCiAgbGV0IE1PVVNFX1dISUNIX1RPX0JVVFRPTlMgPSBbMCwgMSwgNCwgMl07CiAgbGV0IE1PVVNFX0hBU19CVVRUT05TID0gKGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIG5ldyBNb3VzZUV2ZW50KCd0ZXN0Jywge2J1dHRvbnM6IDF9KS5idXR0b25zID09PSAxOwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfSkoKTsKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgUG9zc2libGUgbW91c2UgZXZlbnQgbmFtZQogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbW91c2UgZXZlbnQsIGZhbHNlIGlmIG5vdAogICAqLwogIGZ1bmN0aW9uIGlzTW91c2VFdmVudChuYW1lKSB7CiAgICByZXR1cm4gTU9VU0VfRVZFTlRTLmluZGV4T2YobmFtZSkgPiAtMTsKICB9CgogIC8qIGVzbGludCBuby1lbXB0eTogWyJlcnJvciIsIHsgImFsbG93RW1wdHlDYXRjaCI6IHRydWUgfV0gKi8KICAvLyBjaGVjayBmb3IgcGFzc2l2ZSBldmVudCBsaXN0ZW5lcnMKICBsZXQgU1VQUE9SVFNfUEFTU0lWRSA9IGZhbHNlOwogIChmdW5jdGlvbigpIHsKICAgIHRyeSB7CiAgICAgIGxldCBvcHRzID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHtnZXQoKSB7U1VQUE9SVFNfUEFTU0lWRSA9IHRydWU7fX0pOwogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG51bGwsIG9wdHMpOwogICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG51bGwsIG9wdHMpOwogICAgfSBjYXRjaChlKSB7fQogIH0pKCk7CgogIC8qKgogICAqIEdlbmVyYXRlIHNldHRpbmdzIGZvciBldmVudCBsaXN0ZW5lcnMsIGRlcGVuZGFudCBvbiBgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlc2AKICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgRXZlbnQgbmFtZSB0byBkZXRlcm1pbmUgaWYgYHtwYXNzaXZlfWAgb3B0aW9uIGlzIG5lZWRlZAogICAqIEByZXR1cm4ge3twYXNzaXZlOiBib29sZWFufSB8IHVuZGVmaW5lZH0gT3B0aW9ucyB0byB1c2UgZm9yIGFkZEV2ZW50TGlzdGVuZXIgYW5kIHJlbW92ZUV2ZW50TGlzdGVuZXIKICAgKi8KICBmdW5jdGlvbiBQQVNTSVZFX1RPVUNIKGV2ZW50TmFtZSkgewogICAgaWYgKGlzTW91c2VFdmVudChldmVudE5hbWUpIHx8IGV2ZW50TmFtZSA9PT0gJ3RvdWNoZW5kJykgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoSEFTX05BVElWRV9UQSAmJiBTVVBQT1JUU19QQVNTSVZFICYmIFBvbHltZXIucGFzc2l2ZVRvdWNoR2VzdHVyZXMpIHsKICAgICAgcmV0dXJuIHtwYXNzaXZlOiB0cnVlfTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybjsKICAgIH0KICB9CgogIC8vIENoZWNrIGZvciB0b3VjaC1vbmx5IGRldmljZXMKICBsZXQgSVNfVE9VQ0hfT05MWSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86W29hXWR8aG9uZSl8QW5kcm9pZC8pOwoKICBsZXQgR2VzdHVyZVJlY29nbml6ZXIgPSBmdW5jdGlvbigpe307IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAvKiogQHR5cGUge2Z1bmN0aW9uKCk6IHZvaWR9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLnJlc2V0OwogIC8qKiBAdHlwZSB7ZnVuY3Rpb24oTW91c2VFdmVudCk6IHZvaWQgfCB1bmRlZmluZWR9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLm1vdXNlZG93bjsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLm1vdXNlbW92ZTsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLm1vdXNldXA7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaHN0YXJ0OwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKFRvdWNoRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUudG91Y2htb3ZlOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKFRvdWNoRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUudG91Y2hlbmQ7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oTW91c2VFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS5jbGljazsKCiAgLy8ga2VlcCB0cmFjayBvZiBhbnkgbGFiZWxzIGhpdCBieSB0aGUgbW91c2VDYW5jZWxsZXIKICAvKiogQHR5cGUgeyFBcnJheTwhSFRNTExhYmVsRWxlbWVudD59ICovCiAgY29uc3QgY2xpY2tlZExhYmVscyA9IFtdOwoKICAvKiogQHR5cGUgeyFPYmplY3Q8Ym9vbGVhbj59ICovCiAgY29uc3QgbGFiZWxsYWJsZSA9IHsKICAgICdidXR0b24nOiB0cnVlLAogICAgJ2lucHV0JzogdHJ1ZSwKICAgICdrZXlnZW4nOiB0cnVlLAogICAgJ21ldGVyJzogdHJ1ZSwKICAgICdvdXRwdXQnOiB0cnVlLAogICAgJ3RleHRhcmVhJzogdHJ1ZSwKICAgICdwcm9ncmVzcyc6IHRydWUsCiAgICAnc2VsZWN0JzogdHJ1ZQogIH07CgogIC8vIERlZmluZWQgYXQgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybS1jb250cm9sLWluZnJhc3RydWN0dXJlLmh0bWwjZW5hYmxpbmctYW5kLWRpc2FibGluZy1mb3JtLWNvbnRyb2xzOi10aGUtZGlzYWJsZWQtYXR0cmlidXRlCiAgLyoqIEB0eXBlIHshT2JqZWN0PGJvb2xlYW4+fSAqLwogIGNvbnN0IGNhbkJlRGlzYWJsZWQgPSB7CiAgICAnYnV0dG9uJzogdHJ1ZSwKICAgICdjb21tYW5kJzogdHJ1ZSwKICAgICdmaWVsZHNldCc6IHRydWUsCiAgICAnaW5wdXQnOiB0cnVlLAogICAgJ2tleWdlbic6IHRydWUsCiAgICAnb3B0Z3JvdXAnOiB0cnVlLAogICAgJ29wdGlvbic6IHRydWUsCiAgICAnc2VsZWN0JzogdHJ1ZSwKICAgICd0ZXh0YXJlYSc6IHRydWUKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBFbGVtZW50IHRvIGNoZWNrIGxhYmVsbGluZyBzdGF0dXMKICAgKiBAcmV0dXJuIHtib29sZWFufSBlbGVtZW50IGNhbiBoYXZlIGxhYmVscwogICAqLwogIGZ1bmN0aW9uIGNhbkJlTGFiZWxsZWQoZWwpIHsKICAgIHJldHVybiBsYWJlbGxhYmxlW2VsLmxvY2FsTmFtZV0gfHwgZmFsc2U7CiAgfQoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBFbGVtZW50IHRoYXQgbWF5IGJlIGxhYmVsbGVkLgogICAqIEByZXR1cm4geyFBcnJheTwhSFRNTExhYmVsRWxlbWVudD59IFJlbGV2YW50IGxhYmVsIGZvciBgZWxgCiAgICovCiAgZnVuY3Rpb24gbWF0Y2hpbmdMYWJlbHMoZWwpIHsKICAgIGxldCBsYWJlbHMgPSBBcnJheS5mcm9tKC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8oZWwpLmxhYmVscyB8fCBbXSk7CiAgICAvLyBJRSBkb2Vzbid0IGhhdmUgYGxhYmVsc2AgYW5kIFNhZmFyaSBkb2Vzbid0IHBvcHVsYXRlIGBsYWJlbHNgCiAgICAvLyBpZiBlbGVtZW50IGlzIGluIGEgc2hhZG93cm9vdC4KICAgIC8vIEluIHRoaXMgaW5zdGFuY2UsIGZpbmRpbmcgdGhlIG5vbi1hbmNlc3RvciBsYWJlbHMgaXMgZW5vdWdoLAogICAgLy8gYXMgdGhlIG1vdXNlQ2FuY2VsbG9yIGNvZGUgd2lsbCBoYW5kbGUgYW5jc3RvciBsYWJlbHMKICAgIGlmICghbGFiZWxzLmxlbmd0aCkgewogICAgICBsYWJlbHMgPSBbXTsKICAgICAgbGV0IHJvb3QgPSBlbC5nZXRSb290Tm9kZSgpOwogICAgICAvLyBpZiB0aGVyZSBpcyBhbiBpZCBvbiBgZWxgLCBjaGVjayBmb3IgYWxsIGxhYmVscyB3aXRoIGEgbWF0Y2hpbmcgYGZvcmAgYXR0cmlidXRlCiAgICAgIGlmIChlbC5pZCkgewogICAgICAgIGxldCBtYXRjaGluZyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbChgbGFiZWxbZm9yID0gJHtlbC5pZH1dYCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaGluZy5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGFiZWxzLnB1c2goLyoqIEB0eXBlIHshSFRNTExhYmVsRWxlbWVudH0gKi8obWF0Y2hpbmdbaV0pKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBsYWJlbHM7CiAgfQoKICAvLyB0b3VjaCB3aWxsIG1ha2Ugc3ludGhldGljIG1vdXNlIGV2ZW50cwogIC8vIGBwcmV2ZW50RGVmYXVsdGAgb24gdG91Y2hlbmQgd2lsbCBjYW5jZWwgdGhlbSwKICAvLyBidXQgdGhpcyBicmVha3MgYDxpbnB1dD5gIGZvY3VzIGFuZCBsaW5rIGNsaWNrcwogIC8vIGRpc2FibGUgbW91c2UgaGFuZGxlcnMgZm9yIE1PVVNFX1RJTUVPVVQgbXMgYWZ0ZXIKICAvLyBhIHRvdWNoZW5kIHRvIGlnbm9yZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgbGV0IG1vdXNlQ2FuY2VsbGVyID0gZnVuY3Rpb24obW91c2VFdmVudCkgewogICAgLy8gQ2hlY2sgZm9yIHNvdXJjZUNhcGFiaWxpdGllcywgdXNlZCB0byBkaXN0aW5ndWlzaCBzeW50aGV0aWMgZXZlbnRzCiAgICAvLyBpZiBtb3VzZUV2ZW50IGRpZCBub3QgY29tZSBmcm9tIGEgZGV2aWNlIHRoYXQgZmlyZXMgdG91Y2ggZXZlbnRzLAogICAgLy8gaXQgd2FzIG1hZGUgYnkgYSByZWFsIG1vdXNlIGFuZCBzaG91bGQgYmUgY291bnRlZAogICAgLy8gaHR0cDovL3dpY2cuZ2l0aHViLmlvL0lucHV0RGV2aWNlQ2FwYWJpbGl0aWVzLyNkb20taW5wdXRkZXZpY2VjYXBhYmlsaXRpZXMtZmlyZXN0b3VjaGV2ZW50cwogICAgbGV0IHNjID0gbW91c2VFdmVudC5zb3VyY2VDYXBhYmlsaXRpZXM7CiAgICBpZiAoc2MgJiYgIXNjLmZpcmVzVG91Y2hFdmVudHMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gc2tpcCBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgICBtb3VzZUV2ZW50W0hBTkRMRURfT0JKXSA9IHtza2lwOiB0cnVlfTsKICAgIC8vIGRpc2FibGUgImdob3N0IGNsaWNrcyIKICAgIGlmIChtb3VzZUV2ZW50LnR5cGUgPT09ICdjbGljaycpIHsKICAgICAgbGV0IGNsaWNrRnJvbUxhYmVsID0gZmFsc2U7CiAgICAgIGxldCBwYXRoID0gbW91c2VFdmVudC5jb21wb3NlZFBhdGggJiYgbW91c2VFdmVudC5jb21wb3NlZFBhdGgoKTsKICAgICAgaWYgKHBhdGgpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmIChwYXRoW2ldLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgICAgICBpZiAocGF0aFtpXS5sb2NhbE5hbWUgPT09ICdsYWJlbCcpIHsKICAgICAgICAgICAgICBjbGlja2VkTGFiZWxzLnB1c2gocGF0aFtpXSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FuQmVMYWJlbGxlZChwYXRoW2ldKSkgewogICAgICAgICAgICAgIGxldCBvd25lckxhYmVscyA9IG1hdGNoaW5nTGFiZWxzKHBhdGhbaV0pOwogICAgICAgICAgICAgIC8vIGNoZWNrIGlmIG9uZSBvZiB0aGUgY2xpY2tlZCBsYWJlbHMgaXMgbGFiZWxsaW5nIHRoaXMgZWxlbWVudAogICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb3duZXJMYWJlbHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgIGNsaWNrRnJvbUxhYmVsID0gY2xpY2tGcm9tTGFiZWwgfHwgY2xpY2tlZExhYmVscy5pbmRleE9mKG93bmVyTGFiZWxzW2pdKSA+IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHBhdGhbaV0gPT09IFBPSU5URVJTVEFURS5tb3VzZS50YXJnZXQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyBpZiBvbmUgb2YgdGhlIGNsaWNrZWQgbGFiZWxzIHdhcyBsYWJlbGxpbmcgdGhlIHRhcmdldCBlbGVtZW50LAogICAgICAvLyB0aGlzIGlzIG5vdCBhIGdob3N0IGNsaWNrCiAgICAgIGlmIChjbGlja0Zyb21MYWJlbCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBtb3VzZUV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIG1vdXNlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtib29sZWFuPX0gc2V0dXAgVHJ1ZSB0byBhZGQsIGZhbHNlIHRvIHJlbW92ZS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIGZ1bmN0aW9uIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcihzZXR1cCkgewogICAgbGV0IGV2ZW50cyA9IElTX1RPVUNIX09OTFkgPyBbJ2NsaWNrJ10gOiBNT1VTRV9FVkVOVFM7CiAgICBmb3IgKGxldCBpID0gMCwgZW47IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgZW4gPSBldmVudHNbaV07CiAgICAgIGlmIChzZXR1cCkgewogICAgICAgIC8vIHJlc2V0IGNsaWNrTGFiZWxzIGFycmF5CiAgICAgICAgY2xpY2tlZExhYmVscy5sZW5ndGggPSAwOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZW4sIG1vdXNlQ2FuY2VsbGVyLCB0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGVuLCBtb3VzZUNhbmNlbGxlciwgdHJ1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGlnbm9yZU1vdXNlKGUpIHsKICAgIGlmICghUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iKSB7CiAgICAgIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcih0cnVlKTsKICAgIH0KICAgIGxldCB1bnNldCA9IGZ1bmN0aW9uKCkgewogICAgICBzZXR1cFRlYXJkb3duTW91c2VDYW5jZWxsZXIoKTsKICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLnRhcmdldCA9IG51bGw7CiAgICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYiA9IG51bGw7CiAgICB9OwogICAgUE9JTlRFUlNUQVRFLm1vdXNlLnRhcmdldCA9IGUuY29tcG9zZWRQYXRoKClbMF07CiAgICBQT0lOVEVSU1RBVEUubW91c2UubW91c2VJZ25vcmVKb2IgPSBQb2x5bWVyLkRlYm91bmNlci5kZWJvdW5jZSgKICAgICAgICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYgogICAgICAgICwgUG9seW1lci5Bc3luYy50aW1lT3V0LmFmdGVyKE1PVVNFX1RJTUVPVVQpCiAgICAgICAgLCB1bnNldCk7CiAgfQoKICAvKioKICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2IGV2ZW50IHRvIHRlc3QgZm9yIGxlZnQgbW91c2UgYnV0dG9uIGRvd24KICAgKiBAcmV0dXJuIHtib29sZWFufSBoYXMgbGVmdCBtb3VzZSBidXR0b24gZG93bgogICAqLwogIGZ1bmN0aW9uIGhhc0xlZnRNb3VzZUJ1dHRvbihldikgewogICAgbGV0IHR5cGUgPSBldi50eXBlOwogICAgLy8gZXhpdCBlYXJseSBpZiB0aGUgZXZlbnQgaXMgbm90IGEgbW91c2UgZXZlbnQKICAgIGlmICghaXNNb3VzZUV2ZW50KHR5cGUpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8vIGV2LmJ1dHRvbiBpcyBub3QgcmVsaWFibGUgZm9yIG1vdXNlbW92ZSAoMCBpcyBvdmVybG9hZGVkIGFzIGJvdGggbGVmdCBidXR0b24gYW5kIG5vIGJ1dHRvbnMpCiAgICAvLyBpbnN0ZWFkIHdlIHVzZSBldi5idXR0b25zIChiaXRtYXNrIG9mIGJ1dHRvbnMpIG9yIGZhbGwgYmFjayB0byBldi53aGljaCAoZGVwcmVjYXRlZCwgMCBmb3Igbm8gYnV0dG9ucywgMSBmb3IgbGVmdCBidXR0b24pCiAgICBpZiAodHlwZSA9PT0gJ21vdXNlbW92ZScpIHsKICAgICAgLy8gYWxsb3cgdW5kZWZpbmVkIGZvciB0ZXN0aW5nIGV2ZW50cwogICAgICBsZXQgYnV0dG9ucyA9IGV2LmJ1dHRvbnMgPT09IHVuZGVmaW5lZCA/IDEgOiBldi5idXR0b25zOwogICAgICBpZiAoKGV2IGluc3RhbmNlb2Ygd2luZG93Lk1vdXNlRXZlbnQpICYmICFNT1VTRV9IQVNfQlVUVE9OUykgewogICAgICAgIGJ1dHRvbnMgPSBNT1VTRV9XSElDSF9UT19CVVRUT05TW2V2LndoaWNoXSB8fCAwOwogICAgICB9CiAgICAgIC8vIGJ1dHRvbnMgaXMgYSBiaXRtYXNrLCBjaGVjayB0aGF0IHRoZSBsZWZ0IGJ1dHRvbiBiaXQgaXMgc2V0ICgxKQogICAgICByZXR1cm4gQm9vbGVhbihidXR0b25zICYgMSk7CiAgICB9IGVsc2UgewogICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZm9yIHRlc3RpbmcgZXZlbnRzCiAgICAgIGxldCBidXR0b24gPSBldi5idXR0b24gPT09IHVuZGVmaW5lZCA/IDAgOiBldi5idXR0b247CiAgICAgIC8vIGV2LmJ1dHRvbiBpcyAwIGluIG1vdXNlZG93bi9tb3VzZXVwL2NsaWNrIGZvciBsZWZ0IGJ1dHRvbiBhY3RpdmF0aW9uCiAgICAgIHJldHVybiBidXR0b24gPT09IDA7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpc1N5bnRoZXRpY0NsaWNrKGV2KSB7CiAgICBpZiAoZXYudHlwZSA9PT0gJ2NsaWNrJykgewogICAgICAvLyBldi5kZXRhaWwgaXMgMCBmb3IgSFRNTEVsZW1lbnQuY2xpY2sgaW4gbW9zdCBicm93c2VycwogICAgICBpZiAoZXYuZGV0YWlsID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgLy8gaW4gdGhlIHdvcnN0IGNhc2UsIGNoZWNrIHRoYXQgdGhlIHgveSBwb3NpdGlvbiBvZiB0aGUgY2xpY2sgaXMgd2l0aGluCiAgICAgIC8vIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHRhcmdldCBvZiB0aGUgZXZlbnQKICAgICAgLy8gVGhhbmtzIElFIDEwID46KAogICAgICBsZXQgdCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQoZXYpOwogICAgICAvLyBtYWtlIHN1cmUgdGhlIHRhcmdldCBvZiB0aGUgZXZlbnQgaXMgYW4gZWxlbWVudCBzbyB3ZSBjYW4gdXNlIGdldEJvdW5kaW5nQ2xpZW50UmVjdCwKICAgICAgLy8gaWYgbm90LCBqdXN0IGFzc3VtZSBpdCBpcyBhIHN5bnRoZXRpYyBjbGljawogICAgICBpZiAoIXQubm9kZVR5cGUgfHwgLyoqIEB0eXBlIHtFbGVtZW50fSAqLyh0KS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgYmNyID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyh0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgLy8gdXNlIHBhZ2UgeC95IHRvIGFjY291bnQgZm9yIHNjcm9sbGluZwogICAgICBsZXQgeCA9IGV2LnBhZ2VYLCB5ID0gZXYucGFnZVk7CiAgICAgIC8vIGV2IGlzIGEgc3ludGhldGljIGNsaWNrIGlmIHRoZSBwb3NpdGlvbiBpcyBvdXRzaWRlIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHRhcmdldAogICAgICByZXR1cm4gISgoeCA+PSBiY3IubGVmdCAmJiB4IDw9IGJjci5yaWdodCkgJiYgKHkgPj0gYmNyLnRvcCAmJiB5IDw9IGJjci5ib3R0b20pKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGxldCBQT0lOVEVSU1RBVEUgPSB7CiAgICBtb3VzZTogewogICAgICB0YXJnZXQ6IG51bGwsCiAgICAgIG1vdXNlSWdub3JlSm9iOiBudWxsCiAgICB9LAogICAgdG91Y2g6IHsKICAgICAgeDogMCwKICAgICAgeTogMCwKICAgICAgaWQ6IC0xLAogICAgICBzY3JvbGxEZWNpZGVkOiBmYWxzZQogICAgfQogIH07CgogIGZ1bmN0aW9uIGZpcnN0VG91Y2hBY3Rpb24oZXYpIHsKICAgIGxldCB0YSA9ICdhdXRvJzsKICAgIGxldCBwYXRoID0gZXYuY29tcG9zZWRQYXRoICYmIGV2LmNvbXBvc2VkUGF0aCgpOwogICAgaWYgKHBhdGgpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIG47IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbiA9IHBhdGhbaV07CiAgICAgICAgaWYgKG5bVE9VQ0hfQUNUSU9OXSkgewogICAgICAgICAgdGEgPSBuW1RPVUNIX0FDVElPTl07CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0YTsKICB9CgogIGZ1bmN0aW9uIHRyYWNrRG9jdW1lbnQoc3RhdGVPYmosIG1vdmVmbiwgdXBmbikgewogICAgc3RhdGVPYmoubW92ZWZuID0gbW92ZWZuOwogICAgc3RhdGVPYmoudXBmbiA9IHVwZm47CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBtb3ZlZm4pOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHVwZm4pOwogIH0KCiAgZnVuY3Rpb24gdW50cmFja0RvY3VtZW50KHN0YXRlT2JqKSB7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBzdGF0ZU9iai5tb3ZlZm4pOwogICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHN0YXRlT2JqLnVwZm4pOwogICAgc3RhdGVPYmoubW92ZWZuID0gbnVsbDsKICAgIHN0YXRlT2JqLnVwZm4gPSBudWxsOwogIH0KCiAgLy8gdXNlIGEgZG9jdW1lbnQtd2lkZSB0b3VjaGVuZCBsaXN0ZW5lciB0byBzdGFydCB0aGUgZ2hvc3QtY2xpY2sgcHJldmVudGlvbiBtZWNoYW5pc20KICAvLyBVc2UgcGFzc2l2ZSBldmVudCBsaXN0ZW5lcnMsIGlmIHN1cHBvcnRlZCwgdG8gbm90IGFmZmVjdCBzY3JvbGxpbmcgcGVyZm9ybWFuY2UKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGlnbm9yZU1vdXNlLCBTVVBQT1JUU19QQVNTSVZFID8ge3Bhc3NpdmU6IHRydWV9IDogZmFsc2UpOwoKICAvKioKICAgKiBNb2R1bGUgZm9yIGFkZGluZyBsaXN0ZW5lcnMgdG8gYSBub2RlIGZvciB0aGUgZm9sbG93aW5nIG5vcm1hbGl6ZWQKICAgKiBjcm9zcy1wbGF0Zm9ybSAiZ2VzdHVyZSIgZXZlbnRzOgogICAqIC0gYGRvd25gIC0gbW91c2Ugb3IgdG91Y2ggd2VudCBkb3duCiAgICogLSBgdXBgIC0gbW91c2Ugb3IgdG91Y2ggd2VudCB1cAogICAqIC0gYHRhcGAgLSBtb3VzZSBjbGljayBvciBmaW5nZXIgdGFwCiAgICogLSBgdHJhY2tgIC0gbW91c2UgZHJhZyBvciB0b3VjaCBtb3ZlCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgZm9yIGFkZGluZyBjcm9zcy1wbGF0Zm9ybSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVycy4KICAgKi8KICBjb25zdCBHZXN0dXJlcyA9IHsKICAgIGdlc3R1cmVzOiB7fSwKICAgIHJlY29nbml6ZXJzOiBbXSwKCiAgICAvKioKICAgICAqIEZpbmRzIHRoZSBlbGVtZW50IHJlbmRlcmVkIG9uIHRoZSBzY3JlZW4gYXQgdGhlIHByb3ZpZGVkIGNvb3JkaW5hdGVzLgogICAgICoKICAgICAqIFNpbWlsYXIgdG8gYGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnRgLCBidXQgcGllcmNlcyB0aHJvdWdoCiAgICAgKiBzaGFkb3cgcm9vdHMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IEhvcml6b250YWwgcGl4ZWwgY29vcmRpbmF0ZQogICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVmVydGljYWwgcGl4ZWwgY29vcmRpbmF0ZQogICAgICogQHJldHVybiB7RWxlbWVudH0gUmV0dXJucyB0aGUgZGVlcGVzdCBzaGFkb3dSb290IGluY2x1c2l2ZSBlbGVtZW50CiAgICAgKiBmb3VuZCBhdCB0aGUgc2NyZWVuIHBvc2l0aW9uIGdpdmVuLgogICAgICovCiAgICBkZWVwVGFyZ2V0RmluZDogZnVuY3Rpb24oeCwgeSkgewogICAgICBsZXQgbm9kZSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7CiAgICAgIGxldCBuZXh0ID0gbm9kZTsKICAgICAgLy8gdGhpcyBjb2RlIHBhdGggaXMgb25seSB0YWtlbiB3aGVuIG5hdGl2ZSBTaGFkb3dET00gaXMgdXNlZAogICAgICAvLyBpZiB0aGVyZSBpcyBhIHNoYWRvd3Jvb3QsIGl0IG1heSBoYXZlIGEgbm9kZSBhdCB4L3kKICAgICAgLy8gaWYgdGhlcmUgaXMgbm90IGEgc2hhZG93cm9vdCwgZXhpdCB0aGUgbG9vcAogICAgICB3aGlsZSAobmV4dCAmJiBuZXh0LnNoYWRvd1Jvb3QgJiYgIXdpbmRvdy5TaGFkeURPTSkgewogICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgbm9kZSBhdCB4L3kgaW4gdGhlIHNoYWRvd3Jvb3QsIGxvb2sgZGVlcGVyCiAgICAgICAgbGV0IG9sZE5leHQgPSBuZXh0OwogICAgICAgIG5leHQgPSBuZXh0LnNoYWRvd1Jvb3QuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKICAgICAgICAvLyBvbiBTYWZhcmksIGVsZW1lbnRGcm9tUG9pbnQgbWF5IHJldHVybiB0aGUgc2hhZG93Um9vdCBob3N0CiAgICAgICAgaWYgKG9sZE5leHQgPT09IG5leHQpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAobmV4dCkgewogICAgICAgICAgbm9kZSA9IG5leHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBub2RlOwogICAgfSwKICAgIC8qKgogICAgICogYSBjaGVhcGVyIGNoZWNrIHRoYW4gZXYuY29tcG9zZWRQYXRoKClbMF07CiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7RXZlbnRUYXJnZXR9IFJldHVybnMgdGhlIGV2ZW50IHRhcmdldC4KICAgICAqLwogICAgX2ZpbmRPcmlnaW5hbFRhcmdldDogZnVuY3Rpb24oZXYpIHsKICAgICAgLy8gc2hhZG93ZG9tCiAgICAgIGlmIChldi5jb21wb3NlZFBhdGgpIHsKICAgICAgICBjb25zdCB0YXJnZXRzID0gLyoqIEB0eXBlIHshQXJyYXk8IUV2ZW50VGFyZ2V0Pn0gKi8oZXYuY29tcG9zZWRQYXRoKCkpOwogICAgICAgIC8vIEl0IHNob3VsZG4ndCBiZSwgYnV0IHNvbWV0aW1lcyB0YXJnZXRzIGlzIGVtcHR5ICh3aW5kb3cgb24gU2FmYXJpKS4KICAgICAgICByZXR1cm4gdGFyZ2V0cy5sZW5ndGggPiAwID8gdGFyZ2V0c1swXSA6IGV2LnRhcmdldDsKICAgICAgfQogICAgICAvLyBzaGFkeWRvbQogICAgICByZXR1cm4gZXYudGFyZ2V0OwogICAgfSwKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldiBFdmVudC4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIF9oYW5kbGVOYXRpdmU6IGZ1bmN0aW9uKGV2KSB7CiAgICAgIGxldCBoYW5kbGVkOwogICAgICBsZXQgdHlwZSA9IGV2LnR5cGU7CiAgICAgIGxldCBub2RlID0gZXYuY3VycmVudFRhcmdldDsKICAgICAgbGV0IGdvYmogPSBub2RlW0dFU1RVUkVfS0VZXTsKICAgICAgaWYgKCFnb2JqKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCBncyA9IGdvYmpbdHlwZV07CiAgICAgIGlmICghZ3MpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCFldltIQU5ETEVEX09CSl0pIHsKICAgICAgICBldltIQU5ETEVEX09CSl0gPSB7fTsKICAgICAgICBpZiAodHlwZS5zbGljZSgwLCA1KSA9PT0gJ3RvdWNoJykgewogICAgICAgICAgZXYgPSAvKiogQHR5cGUge1RvdWNoRXZlbnR9ICovKGV2KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgICAgbGV0IHQgPSBldi5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgICAgIGlmICh0eXBlID09PSAndG91Y2hzdGFydCcpIHsKICAgICAgICAgICAgLy8gb25seSBoYW5kbGUgdGhlIGZpcnN0IGZpbmdlcgogICAgICAgICAgICBpZiAoZXYudG91Y2hlcy5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICBQT0lOVEVSU1RBVEUudG91Y2guaWQgPSB0LmlkZW50aWZpZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChQT0lOVEVSU1RBVEUudG91Y2guaWQgIT09IHQuaWRlbnRpZmllcikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIUhBU19OQVRJVkVfVEEpIHsKICAgICAgICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JyB8fCB0eXBlID09PSAndG91Y2htb3ZlJykgewogICAgICAgICAgICAgIEdlc3R1cmVzLl9oYW5kbGVUb3VjaEFjdGlvbihldik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaGFuZGxlZCA9IGV2W0hBTkRMRURfT0JKXTsKICAgICAgLy8gdXNlZCB0byBpZ25vcmUgc3ludGhldGljIG1vdXNlIGV2ZW50cwogICAgICBpZiAoaGFuZGxlZC5za2lwKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIHJlc2V0IHJlY29nbml6ZXIgc3RhdGUKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCBHZXN0dXJlcy5yZWNvZ25pemVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHIgPSBHZXN0dXJlcy5yZWNvZ25pemVyc1tpXTsKICAgICAgICBpZiAoZ3Nbci5uYW1lXSAmJiAhaGFuZGxlZFtyLm5hbWVdKSB7CiAgICAgICAgICBpZiAoci5mbG93ICYmIHIuZmxvdy5zdGFydC5pbmRleE9mKGV2LnR5cGUpID4gLTEgJiYgci5yZXNldCkgewogICAgICAgICAgICByLnJlc2V0KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGVuZm9yY2UgZ2VzdHVyZSByZWNvZ25pemVyIG9yZGVyCiAgICAgIGZvciAobGV0IGkgPSAwLCByOyBpIDwgR2VzdHVyZXMucmVjb2duaXplcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICByID0gR2VzdHVyZXMucmVjb2duaXplcnNbaV07CiAgICAgICAgaWYgKGdzW3IubmFtZV0gJiYgIWhhbmRsZWRbci5uYW1lXSkgewogICAgICAgICAgaGFuZGxlZFtyLm5hbWVdID0gdHJ1ZTsKICAgICAgICAgIHJbdHlwZV0oZXYpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2hhbmRsZVRvdWNoQWN0aW9uOiBmdW5jdGlvbihldikgewogICAgICBsZXQgdCA9IGV2LmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICBsZXQgdHlwZSA9IGV2LnR5cGU7CiAgICAgIGlmICh0eXBlID09PSAndG91Y2hzdGFydCcpIHsKICAgICAgICBQT0lOVEVSU1RBVEUudG91Y2gueCA9IHQuY2xpZW50WDsKICAgICAgICBQT0lOVEVSU1RBVEUudG91Y2gueSA9IHQuY2xpZW50WTsKICAgICAgICBQT0lOVEVSU1RBVEUudG91Y2guc2Nyb2xsRGVjaWRlZCA9IGZhbHNlOwogICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0b3VjaG1vdmUnKSB7CiAgICAgICAgaWYgKFBPSU5URVJTVEFURS50b3VjaC5zY3JvbGxEZWNpZGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5zY3JvbGxEZWNpZGVkID0gdHJ1ZTsKICAgICAgICBsZXQgdGEgPSBmaXJzdFRvdWNoQWN0aW9uKGV2KTsKICAgICAgICBsZXQgcHJldmVudCA9IGZhbHNlOwogICAgICAgIGxldCBkeCA9IE1hdGguYWJzKFBPSU5URVJTVEFURS50b3VjaC54IC0gdC5jbGllbnRYKTsKICAgICAgICBsZXQgZHkgPSBNYXRoLmFicyhQT0lOVEVSU1RBVEUudG91Y2gueSAtIHQuY2xpZW50WSk7CiAgICAgICAgaWYgKCFldi5jYW5jZWxhYmxlKSB7CiAgICAgICAgICAvLyBzY3JvbGxpbmcgaXMgaGFwcGVuaW5nCiAgICAgICAgfSBlbHNlIGlmICh0YSA9PT0gJ25vbmUnKSB7CiAgICAgICAgICBwcmV2ZW50ID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKHRhID09PSAncGFuLXgnKSB7CiAgICAgICAgICBwcmV2ZW50ID0gZHkgPiBkeDsKICAgICAgICB9IGVsc2UgaWYgKHRhID09PSAncGFuLXknKSB7CiAgICAgICAgICBwcmV2ZW50ID0gZHggPiBkeTsKICAgICAgICB9CiAgICAgICAgaWYgKHByZXZlbnQpIHsKICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIEdlc3R1cmVzLnByZXZlbnQoJ3RyYWNrJyk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhIG5vZGUgZm9yIHRoZSBnaXZlbiBnZXN0dXJlIHR5cGUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBhZGQgbGlzdGVuZXIgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldlR5cGUgR2VzdHVyZSB0eXBlOiBgZG93bmAsIGB1cGAsIGB0cmFja2AsIG9yIGB0YXBgCiAgICAgKiBAcGFyYW0geyFmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgRXZlbnQgbGlzdGVuZXIgZnVuY3Rpb24gdG8gY2FsbAogICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lciB3YXMgYWRkZWQuCiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIGFkZExpc3RlbmVyOiBmdW5jdGlvbihub2RlLCBldlR5cGUsIGhhbmRsZXIpIHsKICAgICAgaWYgKHRoaXMuZ2VzdHVyZXNbZXZUeXBlXSkgewogICAgICAgIHRoaXMuX2FkZChub2RlLCBldlR5cGUsIGhhbmRsZXIpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYSBub2RlIGZvciB0aGUgZ2l2ZW4gZ2VzdHVyZSB0eXBlLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gcmVtb3ZlIGxpc3RlbmVyIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldlR5cGUgR2VzdHVyZSB0eXBlOiBgZG93bmAsIGB1cGAsIGB0cmFja2AsIG9yIGB0YXBgCiAgICAgKiBAcGFyYW0geyFmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgRXZlbnQgbGlzdGVuZXIgZnVuY3Rpb24gcHJldmlvdXNseSBwYXNzZWQgdG8KICAgICAqICBgYWRkTGlzdGVuZXJgLgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lciB3YXMgcmVtb3ZlZC4KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgcmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uKG5vZGUsIGV2VHlwZSwgaGFuZGxlcikgewogICAgICBpZiAodGhpcy5nZXN0dXJlc1tldlR5cGVdKSB7CiAgICAgICAgdGhpcy5fcmVtb3ZlKG5vZGUsIGV2VHlwZSwgaGFuZGxlcik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICAvKioKICAgICAqIGF1dG9tYXRlIHRoZSBldmVudCBsaXN0ZW5lcnMgZm9yIHRoZSBuYXRpdmUgZXZlbnRzCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBub2RlIE5vZGUgb24gd2hpY2ggdG8gYWRkIHRoZSBldmVudC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldlR5cGUgRXZlbnQgdHlwZSB0byBhZGQuCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCl9IGhhbmRsZXIgRXZlbnQgaGFuZGxlciBmdW5jdGlvbi4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIF9hZGQ6IGZ1bmN0aW9uKG5vZGUsIGV2VHlwZSwgaGFuZGxlcikgewogICAgICBsZXQgcmVjb2duaXplciA9IHRoaXMuZ2VzdHVyZXNbZXZUeXBlXTsKICAgICAgbGV0IGRlcHMgPSByZWNvZ25pemVyLmRlcHM7CiAgICAgIGxldCBuYW1lID0gcmVjb2duaXplci5uYW1lOwogICAgICBsZXQgZ29iaiA9IG5vZGVbR0VTVFVSRV9LRVldOwogICAgICBpZiAoIWdvYmopIHsKICAgICAgICBub2RlW0dFU1RVUkVfS0VZXSA9IGdvYmogPSB7fTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMCwgZGVwLCBnZDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBkZXAgPSBkZXBzW2ldOwogICAgICAgIC8vIGRvbid0IGFkZCBtb3VzZSBoYW5kbGVycyBvbiBpT1MgYmVjYXVzZSB0aGV5IGNhdXNlIGdyYXkgc2VsZWN0aW9uIG92ZXJsYXlzCiAgICAgICAgaWYgKElTX1RPVUNIX09OTFkgJiYgaXNNb3VzZUV2ZW50KGRlcCkgJiYgZGVwICE9PSAnY2xpY2snKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZ2QgPSBnb2JqW2RlcF07CiAgICAgICAgaWYgKCFnZCkgewogICAgICAgICAgZ29ialtkZXBdID0gZ2QgPSB7X2NvdW50OiAwfTsKICAgICAgICB9CiAgICAgICAgaWYgKGdkLl9jb3VudCA9PT0gMCkgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGRlcCwgdGhpcy5faGFuZGxlTmF0aXZlLCBQQVNTSVZFX1RPVUNIKGRlcCkpOwogICAgICAgIH0KICAgICAgICBnZFtuYW1lXSA9IChnZFtuYW1lXSB8fCAwKSArIDE7CiAgICAgICAgZ2QuX2NvdW50ID0gKGdkLl9jb3VudCB8fCAwKSArIDE7CiAgICAgIH0KICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2VHlwZSwgaGFuZGxlcik7CiAgICAgIGlmIChyZWNvZ25pemVyLnRvdWNoQWN0aW9uKSB7CiAgICAgICAgdGhpcy5zZXRUb3VjaEFjdGlvbihub2RlLCByZWNvZ25pemVyLnRvdWNoQWN0aW9uKTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIGF1dG9tYXRlIGV2ZW50IGxpc3RlbmVyIHJlbW92YWwgZm9yIG5hdGl2ZSBldmVudHMKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG5vZGUgTm9kZSBvbiB3aGljaCB0byByZW1vdmUgdGhlIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBFdmVudCB0eXBlIHRvIHJlbW92ZS4KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oRXZlbnQ/KX0gaGFuZGxlciBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgX3JlbW92ZTogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGxldCByZWNvZ25pemVyID0gdGhpcy5nZXN0dXJlc1tldlR5cGVdOwogICAgICBsZXQgZGVwcyA9IHJlY29nbml6ZXIuZGVwczsKICAgICAgbGV0IG5hbWUgPSByZWNvZ25pemVyLm5hbWU7CiAgICAgIGxldCBnb2JqID0gbm9kZVtHRVNUVVJFX0tFWV07CiAgICAgIGlmIChnb2JqKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGRlcCwgZ2Q7IGkgPCBkZXBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBkZXAgPSBkZXBzW2ldOwogICAgICAgICAgZ2QgPSBnb2JqW2RlcF07CiAgICAgICAgICBpZiAoZ2QgJiYgZ2RbbmFtZV0pIHsKICAgICAgICAgICAgZ2RbbmFtZV0gPSAoZ2RbbmFtZV0gfHwgMSkgLSAxOwogICAgICAgICAgICBnZC5fY291bnQgPSAoZ2QuX2NvdW50IHx8IDEpIC0gMTsKICAgICAgICAgICAgaWYgKGdkLl9jb3VudCA9PT0gMCkgewogICAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihkZXAsIHRoaXMuX2hhbmRsZU5hdGl2ZSwgUEFTU0lWRV9UT1VDSChkZXApKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZUeXBlLCBoYW5kbGVyKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBuZXcgZ2VzdHVyZSBldmVudCByZWNvZ25pemVyIGZvciBhZGRpbmcgbmV3IGN1c3RvbQogICAgICogZ2VzdHVyZSBldmVudCB0eXBlcy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHshR2VzdHVyZVJlY29nbml6ZXJ9IHJlY29nIEdlc3R1cmUgcmVjb2duaXplciBkZXNjcmlwdG9yCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICByZWdpc3RlcjogZnVuY3Rpb24ocmVjb2cpIHsKICAgICAgdGhpcy5yZWNvZ25pemVycy5wdXNoKHJlY29nKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWNvZy5lbWl0cy5sZW5ndGg7IGkrKykgewogICAgICAgIHRoaXMuZ2VzdHVyZXNbcmVjb2cuZW1pdHNbaV1dID0gcmVjb2c7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2TmFtZSBFdmVudCBuYW1lLgogICAgICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIHRoZSBnZXN0dXJlIGZvciB0aGUgZ2l2ZW4gZXZlbnQgbmFtZS4KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgX2ZpbmRSZWNvZ25pemVyQnlFdmVudDogZnVuY3Rpb24oZXZOYW1lKSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCByOyBpIDwgdGhpcy5yZWNvZ25pemVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHIgPSB0aGlzLnJlY29nbml6ZXJzW2ldOwogICAgICAgIGZvciAobGV0IGogPSAwLCBuOyBqIDwgci5lbWl0cy5sZW5ndGg7IGorKykgewogICAgICAgICAgbiA9IHIuZW1pdHNbal07CiAgICAgICAgICBpZiAobiA9PT0gZXZOYW1lKSB7CiAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBTZXRzIHNjcm9sbGluZyBkaXJlY3Rpb24gb24gbm9kZS4KICAgICAqCiAgICAgKiBUaGlzIHZhbHVlIGlzIGNoZWNrZWQgb24gZmlyc3QgbW92ZSwgdGh1cyBpdCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvCiAgICAgKiBhZGRpbmcgZXZlbnQgbGlzdGVuZXJzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcGFyYW0geyFFbGVtZW50fSBub2RlIE5vZGUgdG8gc2V0IHRvdWNoIGFjdGlvbiBzZXR0aW5nIG9uCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVG91Y2ggYWN0aW9uIHZhbHVlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBzZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24obm9kZSwgdmFsdWUpIHsKICAgICAgaWYgKEhBU19OQVRJVkVfVEEpIHsKICAgICAgICAvLyBOT1RFOiBhZGQgdG91Y2hBY3Rpb24gYXN5bmMgc28gdGhhdCBldmVudHMgY2FuIGJlIGFkZGVkIGluCiAgICAgICAgLy8gY3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3JzLiBPdGhlcndpc2Ugd2UgcnVuIGFmb3VsIG9mIGN1c3RvbQogICAgICAgIC8vIGVsZW1lbnRzIHJlc3RyaWN0aW9uIGFnYWluc3Qgc2V0dGluZ3MgYXR0cmlidXRlcyAoc3R5bGUpIGluIHRoZQogICAgICAgIC8vIGNvbnN0cnVjdG9yLgogICAgICAgIFBvbHltZXIuQXN5bmMubWljcm9UYXNrLnJ1bigoKSA9PiB7CiAgICAgICAgICBub2RlLnN0eWxlLnRvdWNoQWN0aW9uID0gdmFsdWU7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgbm9kZVtUT1VDSF9BQ1RJT05dID0gdmFsdWU7CiAgICB9LAoKICAgIC8qKgogICAgICogRGlzcGF0Y2hlcyBhbiBldmVudCBvbiB0aGUgYHRhcmdldGAgZWxlbWVudCBvZiBgdHlwZWAgd2l0aCB0aGUgZ2l2ZW4KICAgICAqIGBkZXRhaWxgLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7IUV2ZW50VGFyZ2V0fSB0YXJnZXQgVGhlIGVsZW1lbnQgb24gd2hpY2ggdG8gZmlyZSBhbiBldmVudC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSB0eXBlIG9mIGV2ZW50IHRvIGZpcmUuCiAgICAgKiBAcGFyYW0geyFPYmplY3Q9fSBkZXRhaWwgVGhlIGRldGFpbCBvYmplY3QgdG8gcG9wdWxhdGUgb24gdGhlIGV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2ZpcmU6IGZ1bmN0aW9uKHRhcmdldCwgdHlwZSwgZGV0YWlsKSB7CiAgICAgIGxldCBldiA9IG5ldyBFdmVudCh0eXBlLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlIH0pOwogICAgICBldi5kZXRhaWwgPSBkZXRhaWw7CiAgICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KGV2KTsKICAgICAgLy8gZm9yd2FyZCBgcHJldmVudERlZmF1bHRgIGluIGEgY2xlYW4gd2F5CiAgICAgIGlmIChldi5kZWZhdWx0UHJldmVudGVkKSB7CiAgICAgICAgbGV0IHByZXZlbnRlciA9IGRldGFpbC5wcmV2ZW50ZXIgfHwgZGV0YWlsLnNvdXJjZUV2ZW50OwogICAgICAgIGlmIChwcmV2ZW50ZXIgJiYgcHJldmVudGVyLnByZXZlbnREZWZhdWx0KSB7CiAgICAgICAgICBwcmV2ZW50ZXIucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBQcmV2ZW50cyB0aGUgZGlzcGF0Y2ggYW5kIGRlZmF1bHQgYWN0aW9uIG9mIHRoZSBnaXZlbiBldmVudCBuYW1lLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZOYW1lIEV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBwcmV2ZW50OiBmdW5jdGlvbihldk5hbWUpIHsKICAgICAgbGV0IHJlY29nbml6ZXIgPSB0aGlzLl9maW5kUmVjb2duaXplckJ5RXZlbnQoZXZOYW1lKTsKICAgICAgaWYgKHJlY29nbml6ZXIuaW5mbykgewogICAgICAgIHJlY29nbml6ZXIuaW5mby5wcmV2ZW50ID0gdHJ1ZTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFJlc2V0IHRoZSAyNTAwbXMgdGltZW91dCBvbiBwcm9jZXNzaW5nIG1vdXNlIGlucHV0IGFmdGVyIGRldGVjdGluZyB0b3VjaCBpbnB1dC4KICAgICAqCiAgICAgKiBUb3VjaCBpbnB1dHMgY3JlYXRlIHN5bnRoZXNpemVkIG1vdXNlIGlucHV0cyBhbnl3aGVyZSBmcm9tIDAgdG8gMjAwMG1zIGFmdGVyIHRoZSB0b3VjaC4KICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgdGVzdGluZyB3aXRoIHNpbXVsYXRlZCB0b3VjaCBpbnB1dHMuCiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGluIHByb2R1Y3Rpb24gbWF5IGNhdXNlIGR1cGxpY2F0ZSB0YXBzIG9yIG90aGVyIEdlc3R1cmVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZXNldE1vdXNlQ2FuY2VsbGVyOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYikgewogICAgICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYi5mbHVzaCgpOwogICAgICB9CiAgICB9CiAgfTsKCiAgLyogZXNsaW50LWRpc2FibGUgdmFsaWQtanNkb2MgKi8KCiAgR2VzdHVyZXMucmVnaXN0ZXIoewogICAgbmFtZTogJ2Rvd251cCcsCiAgICBkZXBzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0JywgJ3RvdWNoZW5kJ10sCiAgICBmbG93OiB7CiAgICAgIHN0YXJ0OiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0J10sCiAgICAgIGVuZDogWydtb3VzZXVwJywgJ3RvdWNoZW5kJ10KICAgIH0sCiAgICBlbWl0czogWydkb3duJywgJ3VwJ10sCgogICAgaW5mbzogewogICAgICBtb3ZlZm46IG51bGwsCiAgICAgIHVwZm46IG51bGwKICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHVudHJhY2tEb2N1bWVudCh0aGlzLmluZm8pOwogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbW91c2Vkb3duOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IHNlbGYgPSB0aGlzOwogICAgICBsZXQgbW92ZWZuID0gZnVuY3Rpb24gbW92ZWZuKGUpIHsKICAgICAgICBpZiAoIWhhc0xlZnRNb3VzZUJ1dHRvbihlKSkgewogICAgICAgICAgc2VsZi5fZmlyZSgndXAnLCB0LCBlKTsKICAgICAgICAgIHVudHJhY2tEb2N1bWVudChzZWxmLmluZm8pOwogICAgICAgIH0KICAgICAgfTsKICAgICAgbGV0IHVwZm4gPSBmdW5jdGlvbiB1cGZuKGUpIHsKICAgICAgICBpZiAoaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICBzZWxmLl9maXJlKCd1cCcsIHQsIGUpOwogICAgICAgIH0KICAgICAgICB1bnRyYWNrRG9jdW1lbnQoc2VsZi5pbmZvKTsKICAgICAgfTsKICAgICAgdHJhY2tEb2N1bWVudCh0aGlzLmluZm8sIG1vdmVmbiwgdXBmbik7CiAgICAgIHRoaXMuX2ZpcmUoJ2Rvd24nLCB0LCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLl9maXJlKCdkb3duJywgR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKSwgZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuX2ZpcmUoJ3VwJywgR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKSwgZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IHRhcmdldAogICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZXZlbnRlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2ZpcmU6IGZ1bmN0aW9uKHR5cGUsIHRhcmdldCwgZXZlbnQsIHByZXZlbnRlcikgewogICAgICBHZXN0dXJlcy5fZmlyZSh0YXJnZXQsIHR5cGUsIHsKICAgICAgICB4OiBldmVudC5jbGllbnRYLAogICAgICAgIHk6IGV2ZW50LmNsaWVudFksCiAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LAogICAgICAgIHByZXZlbnRlcjogcHJldmVudGVyLAogICAgICAgIHByZXZlbnQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIHJldHVybiBHZXN0dXJlcy5wcmV2ZW50KGUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfSk7CgogIEdlc3R1cmVzLnJlZ2lzdGVyKHsKICAgIG5hbWU6ICd0cmFjaycsCiAgICB0b3VjaEFjdGlvbjogJ25vbmUnLAogICAgZGVwczogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ21vdXNldXAnLCAndG91Y2hlbmQnXQogICAgfSwKICAgIGVtaXRzOiBbJ3RyYWNrJ10sCgogICAgaW5mbzogewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICBzdGF0ZTogJ3N0YXJ0JywKICAgICAgc3RhcnRlZDogZmFsc2UsCiAgICAgIG1vdmVzOiBbXSwKICAgICAgLyoqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0gKi8KICAgICAgYWRkTW92ZTogZnVuY3Rpb24obW92ZSkgewogICAgICAgIGlmICh0aGlzLm1vdmVzLmxlbmd0aCA+IFRSQUNLX0xFTkdUSCkgewogICAgICAgICAgdGhpcy5tb3Zlcy5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICB0aGlzLm1vdmVzLnB1c2gobW92ZSk7CiAgICAgIH0sCiAgICAgIG1vdmVmbjogbnVsbCwKICAgICAgdXBmbjogbnVsbCwKICAgICAgcHJldmVudDogZmFsc2UKICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICdzdGFydCc7CiAgICAgIHRoaXMuaW5mby5zdGFydGVkID0gZmFsc2U7CiAgICAgIHRoaXMuaW5mby5tb3ZlcyA9IFtdOwogICAgICB0aGlzLmluZm8ueCA9IDA7CiAgICAgIHRoaXMuaW5mby55ID0gMDsKICAgICAgdGhpcy5pbmZvLnByZXZlbnQgPSBmYWxzZTsKICAgICAgdW50cmFja0RvY3VtZW50KHRoaXMuaW5mbyk7CiAgICB9LAoKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtudW1iZXJ9IHgKICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5CiAgICAgKiBAcmV0dXJuIHtib29sZWFufQogICAgICovCiAgICBoYXNNb3ZlZEVub3VnaDogZnVuY3Rpb24oeCwgeSkgewogICAgICBpZiAodGhpcy5pbmZvLnByZXZlbnQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuaW5mby5zdGFydGVkKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgbGV0IGR4ID0gTWF0aC5hYnModGhpcy5pbmZvLnggLSB4KTsKICAgICAgbGV0IGR5ID0gTWF0aC5hYnModGhpcy5pbmZvLnkgLSB5KTsKICAgICAgcmV0dXJuIChkeCA+PSBUUkFDS19ESVNUQU5DRSB8fCBkeSA+PSBUUkFDS19ESVNUQU5DRSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIG1vdXNlZG93bjogZnVuY3Rpb24oZSkgewogICAgICBpZiAoIWhhc0xlZnRNb3VzZUJ1dHRvbihlKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBsZXQgdCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQoZSk7CiAgICAgIGxldCBzZWxmID0gdGhpczsKICAgICAgbGV0IG1vdmVmbiA9IGZ1bmN0aW9uIG1vdmVmbihlKSB7CiAgICAgICAgbGV0IHggPSBlLmNsaWVudFgsIHkgPSBlLmNsaWVudFk7CiAgICAgICAgaWYgKHNlbGYuaGFzTW92ZWRFbm91Z2goeCwgeSkpIHsKICAgICAgICAgIC8vIGZpcnN0IG1vdmUgaXMgJ3N0YXJ0Jywgc3Vic2VxdWVudCBtb3ZlcyBhcmUgJ21vdmUnLCBtb3VzZXVwIGlzICdlbmQnCiAgICAgICAgICBzZWxmLmluZm8uc3RhdGUgPSBzZWxmLmluZm8uc3RhcnRlZCA/IChlLnR5cGUgPT09ICdtb3VzZXVwJyA/ICdlbmQnIDogJ3RyYWNrJykgOiAnc3RhcnQnOwogICAgICAgICAgaWYgKHNlbGYuaW5mby5zdGF0ZSA9PT0gJ3N0YXJ0JykgewogICAgICAgICAgICAvLyBpZiBhbmQgb25seSBpZiB0cmFja2luZywgYWx3YXlzIHByZXZlbnQgdGFwCiAgICAgICAgICAgIEdlc3R1cmVzLnByZXZlbnQoJ3RhcCcpOwogICAgICAgICAgfQogICAgICAgICAgc2VsZi5pbmZvLmFkZE1vdmUoe3g6IHgsIHk6IHl9KTsKICAgICAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICAgIC8vIGFsd2F5cyBfZmlyZSAiZW5kIgogICAgICAgICAgICBzZWxmLmluZm8uc3RhdGUgPSAnZW5kJzsKICAgICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxmLl9maXJlKHQsIGUpOwogICAgICAgICAgc2VsZi5pbmZvLnN0YXJ0ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgbGV0IHVwZm4gPSBmdW5jdGlvbiB1cGZuKGUpIHsKICAgICAgICBpZiAoc2VsZi5pbmZvLnN0YXJ0ZWQpIHsKICAgICAgICAgIG1vdmVmbihlKTsKICAgICAgICB9CgogICAgICAgIC8vIHJlbW92ZSB0aGUgdGVtcG9yYXJ5IGxpc3RlbmVycwogICAgICAgIHVudHJhY2tEb2N1bWVudChzZWxmLmluZm8pOwogICAgICB9OwogICAgICAvLyBhZGQgdGVtcG9yYXJ5IGRvY3VtZW50IGxpc3RlbmVycyBhcyBtb3VzZSByZXRhcmdldHMKICAgICAgdHJhY2tEb2N1bWVudCh0aGlzLmluZm8sIG1vdmVmbiwgdXBmbik7CiAgICAgIHRoaXMuaW5mby54ID0gZS5jbGllbnRYOwogICAgICB0aGlzLmluZm8ueSA9IGUuY2xpZW50WTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSkgewogICAgICBsZXQgY3QgPSBlLmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICB0aGlzLmluZm8ueCA9IGN0LmNsaWVudFg7CiAgICAgIHRoaXMuaW5mby55ID0gY3QuY2xpZW50WTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2htb3ZlOiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IGN0ID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgbGV0IHggPSBjdC5jbGllbnRYLCB5ID0gY3QuY2xpZW50WTsKICAgICAgaWYgKHRoaXMuaGFzTW92ZWRFbm91Z2goeCwgeSkpIHsKICAgICAgICBpZiAodGhpcy5pbmZvLnN0YXRlID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAvLyBpZiBhbmQgb25seSBpZiB0cmFja2luZywgYWx3YXlzIHByZXZlbnQgdGFwCiAgICAgICAgICBHZXN0dXJlcy5wcmV2ZW50KCd0YXAnKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5pbmZvLmFkZE1vdmUoe3g6IHgsIHk6IHl9KTsKICAgICAgICB0aGlzLl9maXJlKHQsIGN0KTsKICAgICAgICB0aGlzLmluZm8uc3RhdGUgPSAndHJhY2snOwogICAgICAgIHRoaXMuaW5mby5zdGFydGVkID0gdHJ1ZTsKICAgICAgfQogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaGVuZDogZnVuY3Rpb24oZSkgewogICAgICBsZXQgdCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQoZSk7CiAgICAgIGxldCBjdCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIC8vIG9ubHkgdHJhY2tlbmQgaWYgdHJhY2sgd2FzIHN0YXJ0ZWQgYW5kIG5vdCBhYm9ydGVkCiAgICAgIGlmICh0aGlzLmluZm8uc3RhcnRlZCkgewogICAgICAgIC8vIHJlc2V0IHN0YXJ0ZWQgc3RhdGUgb24gdXAKICAgICAgICB0aGlzLmluZm8uc3RhdGUgPSAnZW5kJzsKICAgICAgICB0aGlzLmluZm8uYWRkTW92ZSh7eDogY3QuY2xpZW50WCwgeTogY3QuY2xpZW50WX0pOwogICAgICAgIHRoaXMuX2ZpcmUodCwgY3QsIGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IHRhcmdldAogICAgICogQHBhcmFtIHtUb3VjaH0gdG91Y2gKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIF9maXJlOiBmdW5jdGlvbih0YXJnZXQsIHRvdWNoKSB7CiAgICAgIGxldCBzZWNvbmRsYXN0ID0gdGhpcy5pbmZvLm1vdmVzW3RoaXMuaW5mby5tb3Zlcy5sZW5ndGggLSAyXTsKICAgICAgbGV0IGxhc3Rtb3ZlID0gdGhpcy5pbmZvLm1vdmVzW3RoaXMuaW5mby5tb3Zlcy5sZW5ndGggLSAxXTsKICAgICAgbGV0IGR4ID0gbGFzdG1vdmUueCAtIHRoaXMuaW5mby54OwogICAgICBsZXQgZHkgPSBsYXN0bW92ZS55IC0gdGhpcy5pbmZvLnk7CiAgICAgIGxldCBkZHgsIGRkeSA9IDA7CiAgICAgIGlmIChzZWNvbmRsYXN0KSB7CiAgICAgICAgZGR4ID0gbGFzdG1vdmUueCAtIHNlY29uZGxhc3QueDsKICAgICAgICBkZHkgPSBsYXN0bW92ZS55IC0gc2Vjb25kbGFzdC55OwogICAgICB9CiAgICAgIEdlc3R1cmVzLl9maXJlKHRhcmdldCwgJ3RyYWNrJywgewogICAgICAgIHN0YXRlOiB0aGlzLmluZm8uc3RhdGUsCiAgICAgICAgeDogdG91Y2guY2xpZW50WCwKICAgICAgICB5OiB0b3VjaC5jbGllbnRZLAogICAgICAgIGR4OiBkeCwKICAgICAgICBkeTogZHksCiAgICAgICAgZGR4OiBkZHgsCiAgICAgICAgZGR5OiBkZHksCiAgICAgICAgc291cmNlRXZlbnQ6IHRvdWNoLAogICAgICAgIGhvdmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBHZXN0dXJlcy5kZWVwVGFyZ2V0RmluZCh0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICB9KTsKCiAgR2VzdHVyZXMucmVnaXN0ZXIoewogICAgbmFtZTogJ3RhcCcsCiAgICBkZXBzOiBbJ21vdXNlZG93bicsICdjbGljaycsICd0b3VjaHN0YXJ0JywgJ3RvdWNoZW5kJ10sCiAgICBmbG93OiB7CiAgICAgIHN0YXJ0OiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0J10sCiAgICAgIGVuZDogWydjbGljaycsICd0b3VjaGVuZCddCiAgICB9LAogICAgZW1pdHM6IFsndGFwJ10sCiAgICBpbmZvOiB7CiAgICAgIHg6IE5hTiwKICAgICAgeTogTmFOLAogICAgICBwcmV2ZW50OiBmYWxzZQogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgcmVzZXQ6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmluZm8ueCA9IE5hTjsKICAgICAgdGhpcy5pbmZvLnkgPSBOYU47CiAgICAgIHRoaXMuaW5mby5wcmV2ZW50ID0gZmFsc2U7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNhdmU6IGZ1bmN0aW9uKGUpIHsKICAgICAgdGhpcy5pbmZvLnggPSBlLmNsaWVudFg7CiAgICAgIHRoaXMuaW5mby55ID0gZS5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBtb3VzZWRvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGhhc0xlZnRNb3VzZUJ1dHRvbihlKSkgewogICAgICAgIHRoaXMuc2F2ZShlKTsKICAgICAgfQogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICBpZiAoaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgdGhpcy5mb3J3YXJkKGUpOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoc3RhcnQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgdGhpcy5zYXZlKGUuY2hhbmdlZFRvdWNoZXNbMF0sIGUpOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaGVuZDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLmZvcndhcmQoZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge0V2ZW50IHwgVG91Y2h9IGUKICAgICAqIEBwYXJhbSB7RXZlbnQ9fSBwcmV2ZW50ZXIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZvcndhcmQ6IGZ1bmN0aW9uKGUsIHByZXZlbnRlcikgewogICAgICBsZXQgZHggPSBNYXRoLmFicyhlLmNsaWVudFggLSB0aGlzLmluZm8ueCk7CiAgICAgIGxldCBkeSA9IE1hdGguYWJzKGUuY2xpZW50WSAtIHRoaXMuaW5mby55KTsKICAgICAgLy8gZmluZCBvcmlnaW5hbCB0YXJnZXQgZnJvbSBgcHJldmVudGVyYCBmb3IgVG91Y2hFdmVudHMsIG9yIGBlYCBmb3IgTW91c2VFdmVudHMKICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KC8qKiBAdHlwZSB7RXZlbnR9ICovKHByZXZlbnRlciB8fCBlKSk7CiAgICAgIGlmICghdCB8fCAoY2FuQmVEaXNhYmxlZFsvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odCkubG9jYWxOYW1lXSAmJiB0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gZHgsZHkgY2FuIGJlIE5hTiBpZiBgY2xpY2tgIGhhcyBiZWVuIHNpbXVsYXRlZCBhbmQgdGhlcmUgd2FzIG5vIGBkb3duYCBmb3IgYHN0YXJ0YAogICAgICBpZiAoaXNOYU4oZHgpIHx8IGlzTmFOKGR5KSB8fCAoZHggPD0gVEFQX0RJU1RBTkNFICYmIGR5IDw9IFRBUF9ESVNUQU5DRSkgfHwgaXNTeW50aGV0aWNDbGljayhlKSkgewogICAgICAgIC8vIHByZXZlbnQgdGFwcyBmcm9tIGJlaW5nIGdlbmVyYXRlZCBpZiBhbiBldmVudCBoYXMgY2FuY2VsZWQgdGhlbQogICAgICAgIGlmICghdGhpcy5pbmZvLnByZXZlbnQpIHsKICAgICAgICAgIEdlc3R1cmVzLl9maXJlKHQsICd0YXAnLCB7CiAgICAgICAgICAgIHg6IGUuY2xpZW50WCwKICAgICAgICAgICAgeTogZS5jbGllbnRZLAogICAgICAgICAgICBzb3VyY2VFdmVudDogZSwKICAgICAgICAgICAgcHJldmVudGVyOiBwcmV2ZW50ZXIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0pOwoKICAvKiBlc2xpbnQtZW5hYmxlIHZhbGlkLWpzZG9jICovCgogIC8qKiBAZGVwcmVjYXRlZCAqLwogIEdlc3R1cmVzLmZpbmRPcmlnaW5hbFRhcmdldCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQ7CgogIC8qKiBAZGVwcmVjYXRlZCAqLwogIEdlc3R1cmVzLmFkZCA9IEdlc3R1cmVzLmFkZExpc3RlbmVyOwoKICAvKiogQGRlcHJlY2F0ZWQgKi8KICBHZXN0dXJlcy5yZW1vdmUgPSBHZXN0dXJlcy5yZW1vdmVMaXN0ZW5lcjsKCiAgUG9seW1lci5HZXN0dXJlcyA9IEdlc3R1cmVzOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQGNvbnN0IHtQb2x5bWVyLkdlc3R1cmVzfQogICAqLwogIGNvbnN0IGdlc3R1cmVzID0gUG9seW1lci5HZXN0dXJlczsKCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIEFQSSBmb3IgYWRkaW5nIFBvbHltZXIncyBjcm9zcy1wbGF0Zm9ybQogICAqIGdlc3R1cmUgZXZlbnRzIHRvIG5vZGVzLgogICAqCiAgICogVGhlIEFQSSBpcyBkZXNpZ25lZCB0byBiZSBjb21wYXRpYmxlIHdpdGggb3ZlcnJpZGUgcG9pbnRzIGltcGxlbWVudGVkCiAgICogaW4gYFBvbHltZXIuVGVtcGxhdGVTdGFtcGAgc3VjaCB0aGF0IGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyBpbgogICAqIHRlbXBsYXRlcyB3aWxsIHN1cHBvcnQgZ2VzdHVyZSBldmVudHMgd2hlbiB0aGlzIG1peGluIGlzIGFwcGxpZWQgYWxvbmcgd2l0aAogICAqIGBQb2x5bWVyLlRlbXBsYXRlU3RhbXBgLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIEFQSSBmb3IgYWRkaW5nIFBvbHltZXIncyBjcm9zcy1wbGF0Zm9ybQogICAqIGdlc3R1cmUgZXZlbnRzIHRvIG5vZGVzCiAgICovCiAgUG9seW1lci5HZXN0dXJlRXZlbnRMaXN0ZW5lcnMgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0dlc3R1cmVFdmVudExpc3RlbmVyc30KICAgICAqLwogICAgY2xhc3MgR2VzdHVyZUV2ZW50TGlzdGVuZXJzIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICAvKioKICAgICAgICogQWRkIHRoZSBldmVudCBsaXN0ZW5lciB0byB0aGUgbm9kZSBpZiBpdCBpcyBhIGdlc3R1cmVzIGV2ZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIGlmICghZ2VzdHVyZXMuYWRkTGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSkgewogICAgICAgICAgc3VwZXIuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIGlmIGl0IGlzIGEgZ2VzdHVyZXMgZXZlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXIgZnJvbQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gcmVtb3ZlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIGlmICghZ2VzdHVyZXMucmVtb3ZlTGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSkgewogICAgICAgICAgc3VwZXIuX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gR2VzdHVyZUV2ZW50TGlzdGVuZXJzOwoKICB9KTsKCn0pKCk7CgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgY29uc3QgSE9TVF9ESVIgPSAvOmhvc3RcKDpkaXJcKChsdHJ8cnRsKVwpXCkvZzsKICAgIGNvbnN0IEhPU1RfRElSX1JFUExBQ01FTlQgPSAnOmhvc3QoW2Rpcj0iJDEiXSknOwoKICAgIGNvbnN0IEVMX0RJUiA9IC8oW1xzXHctI1wuXFtcXVwqXSopOmRpclwoKGx0cnxydGwpXCkvZzsKICAgIGNvbnN0IEVMX0RJUl9SRVBMQUNNRU5UID0gJzpob3N0KFtkaXI9IiQyIl0pICQxJzsKCiAgICBjb25zdCBESVJfQ0hFQ0sgPSAvOmRpclwoKD86bHRyfHJ0bClcKS87CiAgICAKICAgIGNvbnN0IFNISU1fU0hBRE9XID0gQm9vbGVhbih3aW5kb3dbJ1NoYWR5RE9NJ10gJiYgd2luZG93WydTaGFkeURPTSddWydpblVzZSddKTsKCiAgICAvKioKICAgICAqIEB0eXBlIHshQXJyYXk8IVBvbHltZXJfRGlyTWl4aW4+fQogICAgICovCiAgICBjb25zdCBESVJfSU5TVEFOQ0VTID0gW107CgogICAgLyoqIEB0eXBlIHtNdXRhdGlvbk9ic2VydmVyfSAqLwogICAgbGV0IG9ic2VydmVyID0gbnVsbDsKCiAgICBsZXQgRE9DVU1FTlRfRElSID0gJyc7CgogICAgZnVuY3Rpb24gZ2V0UlRMKCkgewogICAgICBET0NVTUVOVF9ESVIgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXInKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7IVBvbHltZXJfRGlyTWl4aW59IGluc3RhbmNlIEluc3RhbmNlIHRvIHNldCBSVEwgc3RhdHVzIG9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFJUTChpbnN0YW5jZSkgewogICAgICBpZiAoIWluc3RhbmNlLl9fYXV0b0Rpck9wdE91dCkgewogICAgICAgIGNvbnN0IGVsID0gLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKGluc3RhbmNlKTsKICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RpcicsIERPQ1VNRU5UX0RJUik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVEaXJlY3Rpb24oKSB7CiAgICAgIGdldFJUTCgpOwogICAgICBET0NVTUVOVF9ESVIgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXInKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBESVJfSU5TVEFOQ0VTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgc2V0UlRMKERJUl9JTlNUQU5DRVNbaV0pOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdGFrZVJlY29yZHMoKSB7CiAgICAgIGlmIChvYnNlcnZlciAmJiBvYnNlcnZlci50YWtlUmVjb3JkcygpLmxlbmd0aCkgewogICAgICAgIHVwZGF0ZURpcmVjdGlvbigpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgYWxsb3dzIGVsZW1lbnRzIHRvIHVzZSB0aGUgYDpkaXJgIENTUyBTZWxlY3RvciB0byBoYXZlCiAgICAgKiB0ZXh0IGRpcmVjdGlvbiBzcGVjaWZpYyBzdHlsaW5nLgogICAgICoKICAgICAqIFdpdGggdGhpcyBtaXhpbiwgYW55IHN0eWxlc2hlZXQgcHJvdmlkZWQgaW4gdGhlIHRlbXBsYXRlIHdpbGwgdHJhbnNmb3JtIGA6ZGlyYCBpbnRvCiAgICAgKiBgOmhvc3QoW2Rpcl0pYCBhbmQgc3luYyBkaXJlY3Rpb24gd2l0aCB0aGUgcGFnZSB2aWEgdGhlIGVsZW1lbnQncyBgZGlyYCBhdHRyaWJ1dGUuCiAgICAgKgogICAgICogRWxlbWVudHMgY2FuIG9wdCBvdXQgb2YgdGhlIGdsb2JhbCBwYWdlIHRleHQgZGlyZWN0aW9uIGJ5IHNldHRpbmcgdGhlIGBkaXJgIGF0dHJpYnV0ZQogICAgICogZGlyZWN0bHkgaW4gYHJlYWR5KClgIG9yIGluIEhUTUwuCiAgICAgKgogICAgICogQ2F2ZWF0czoKICAgICAqIC0gQXBwbGljYXRpb25zIG11c3Qgc2V0IGA8aHRtbCBkaXI9Imx0ciI+YCBvciBgPGh0bWwgZGlyPSJydGwiPmAgdG8gc3luYyBkaXJlY3Rpb24KICAgICAqIC0gQXV0b21hdGljIGxlZnQtdG8tcmlnaHQgb3IgcmlnaHQtdG8tbGVmdCBzdHlsaW5nIGlzIHN5bmMnZCB3aXRoIHRoZSBgPGh0bWw+YCBlbGVtZW50IG9ubHkuCiAgICAgKiAtIENoYW5naW5nIGBkaXJgIGF0IHJ1bnRpbWUgaXMgc3VwcG9ydGVkLgogICAgICogLSBPcHRpbmcgb3V0IG9mIHRoZSBnbG9iYWwgZGlyZWN0aW9uIHN0eWxpbmcgaXMgcGVybWFuZW50CiAgICAgKgogICAgICogQG1peGluRnVuY3Rpb24KICAgICAqIEBwb2x5bWVyCiAgICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKi8KICAgIFBvbHltZXIuRGlyTWl4aW4gPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oKGJhc2UpID0+IHsKCiAgICAgIGlmICghU0hJTV9TSEFET1cpIHsKICAgICAgICBpZiAoIW9ic2VydmVyKSB7CiAgICAgICAgICBnZXRSVEwoKTsKICAgICAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodXBkYXRlRGlyZWN0aW9uKTsKICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7YXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2RpciddfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAqIEBleHRlbmRzIHtiYXNlfQogICAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUFjY2Vzc29yc30KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGNvbnN0IGVsZW1lbnRCYXNlID0gUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29ycyhiYXNlKTsKCiAgICAgIC8qKgogICAgICAgKiBAcG9seW1lcgogICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9EaXJNaXhpbn0KICAgICAgICovCiAgICAgIGNsYXNzIERpciBleHRlbmRzIGVsZW1lbnRCYXNlIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIF9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpIHsKICAgICAgICAgIGNzc1RleHQgPSBzdXBlci5fcHJvY2Vzc1N0eWxlVGV4dChjc3NUZXh0LCBiYXNlVVJJKTsKICAgICAgICAgIGlmICghU0hJTV9TSEFET1cgJiYgRElSX0NIRUNLLnRlc3QoY3NzVGV4dCkpIHsKICAgICAgICAgICAgY3NzVGV4dCA9IHRoaXMuX3JlcGxhY2VEaXJJbkNzc1RleHQoY3NzVGV4dCk7CiAgICAgICAgICAgIHRoaXMuX19hY3RpdmF0ZURpciA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY3NzVGV4dDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2UgYDpkaXJgIGluIHRoZSBnaXZlbiBDU1MgdGV4dAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgQ1NTIHRleHQgdG8gcmVwbGFjZSBESVIKICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1vZGlmaWVkIENTUwogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBfcmVwbGFjZURpckluQ3NzVGV4dCh0ZXh0KSB7CiAgICAgICAgICBsZXQgcmVwbGFjZWRUZXh0ID0gdGV4dDsKICAgICAgICAgIHJlcGxhY2VkVGV4dCA9IHJlcGxhY2VkVGV4dC5yZXBsYWNlKEhPU1RfRElSLCBIT1NUX0RJUl9SRVBMQUNNRU5UKTsKICAgICAgICAgIHJlcGxhY2VkVGV4dCA9IHJlcGxhY2VkVGV4dC5yZXBsYWNlKEVMX0RJUiwgRUxfRElSX1JFUExBQ01FTlQpOwogICAgICAgICAgcmV0dXJuIHJlcGxhY2VkVGV4dDsKICAgICAgICB9CgogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICAgIHRoaXMuX19hdXRvRGlyT3B0T3V0ID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gQ2xvc3VyZSBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCBgdGhpc2AgaXMgYW4gSFRNTEVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIHJlYWR5KCkgewogICAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICAgIHRoaXMuX19hdXRvRGlyT3B0T3V0ID0gLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLmhhc0F0dHJpYnV0ZSgnZGlyJyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJZiBpdCBleGlzdHMgb24gZWxlbWVudEJhc2UsIGl0IGNhbiBiZSBzdXBlcidkCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICAgIGlmIChlbGVtZW50QmFzZS5wcm90b3R5cGUuY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLl9fYWN0aXZhdGVEaXIpIHsKICAgICAgICAgICAgdGFrZVJlY29yZHMoKTsKICAgICAgICAgICAgRElSX0lOU1RBTkNFUy5wdXNoKHRoaXMpOwogICAgICAgICAgICBzZXRSVEwodGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJZiBpdCBleGlzdHMgb24gZWxlbWVudEJhc2UsIGl0IGNhbiBiZSBzdXBlcidkCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICAgIGlmIChlbGVtZW50QmFzZS5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLl9fYWN0aXZhdGVEaXIpIHsKICAgICAgICAgICAgY29uc3QgaWR4ID0gRElSX0lOU1RBTkNFUy5pbmRleE9mKHRoaXMpOwogICAgICAgICAgICBpZiAoaWR4ID4gLTEpIHsKICAgICAgICAgICAgICBESVJfSU5TVEFOQ0VTLnNwbGljZShpZHgsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBEaXIuX19hY3RpdmF0ZURpciA9IGZhbHNlOwoKICAgICAgcmV0dXJuIERpcjsKICAgIH0pOwogIH0pKCk7CgoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBydW4gYSBjYWxsYmFjayB3aGVuIEhUTUxJbXBvcnRzIGFyZSByZWFkeSBvciBpbW1lZGlhdGVseSBpZgogIC8vIHRoaXMgYXBpIGlzIG5vdCBhdmFpbGFibGUuCiAgZnVuY3Rpb24gd2hlbkltcG9ydHNSZWFkeShjYikgewogICAgaWYgKHdpbmRvdy5IVE1MSW1wb3J0cykgewogICAgICBIVE1MSW1wb3J0cy53aGVuUmVhZHkoY2IpOwogICAgfSBlbHNlIHsKICAgICAgY2IoKTsKICAgIH0KICB9CgogIC8qKgogICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgaW1wb3J0aW5nIGFuIEhUTUwgZG9jdW1lbnQgaW1wZXJhdGl2ZWx5LgogICAqCiAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBgPGxpbmsgcmVsPSJpbXBvcnQiPmAgZWxlbWVudCB3aXRoCiAgICogdGhlIHByb3ZpZGVkIFVSTCBhbmQgYXBwZW5kcyBpdCB0byB0aGUgZG9jdW1lbnQgdG8gc3RhcnQgbG9hZGluZy4KICAgKiBJbiB0aGUgYG9ubG9hZGAgY2FsbGJhY2ssIHRoZSBgaW1wb3J0YCBwcm9wZXJ0eSBvZiB0aGUgYGxpbmtgCiAgICogZWxlbWVudCB3aWxsIGNvbnRhaW4gdGhlIGltcG9ydGVkIGRvY3VtZW50IGNvbnRlbnRzLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBVUkwgdG8gZG9jdW1lbnQgdG8gbG9hZC4KICAgKiBAcGFyYW0gez9mdW5jdGlvbighRXZlbnQpOnZvaWQ9fSBvbmxvYWQgQ2FsbGJhY2sgdG8gbm90aWZ5IHdoZW4gYW4gaW1wb3J0IHN1Y2Nlc3NmdWxseQogICAqICAgbG9hZGVkLgogICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFcnJvckV2ZW50KTp2b2lkPX0gb25lcnJvciBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQKICAgKiAgIHVuc3VjY2Vzc2Z1bGx5IGxvYWRlZC4KICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRBc3luYyBUcnVlIGlmIHRoZSBpbXBvcnQgc2hvdWxkIGJlIGxvYWRlZCBgYXN5bmNgLgogICAqICAgRGVmYXVsdHMgdG8gYGZhbHNlYC4KICAgKiBAcmV0dXJuIHshSFRNTExpbmtFbGVtZW50fSBUaGUgbGluayBlbGVtZW50IGZvciB0aGUgVVJMIHRvIGJlIGxvYWRlZC4KICAgKi8KICBQb2x5bWVyLmltcG9ydEhyZWYgPSBmdW5jdGlvbihocmVmLCBvbmxvYWQsIG9uZXJyb3IsIG9wdEFzeW5jKSB7CiAgICBsZXQgbGluayA9IC8qKiBAdHlwZSB7SFRNTExpbmtFbGVtZW50fSAqLwogICAgICAoZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdsaW5rW2hyZWY9IicgKyBocmVmICsgJyJdW2ltcG9ydC1ocmVmXScpKTsKICAgIGlmICghbGluaykgewogICAgICBsaW5rID0gLyoqIEB0eXBlIHtIVE1MTGlua0VsZW1lbnR9ICovIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJykpOwogICAgICBsaW5rLnJlbCA9ICdpbXBvcnQnOwogICAgICBsaW5rLmhyZWYgPSBocmVmOwogICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaW1wb3J0LWhyZWYnLCAnJyk7CiAgICB9CiAgICAvLyBhbHdheXMgZW5zdXJlIGxpbmsgaGFzIGBhc3luY2AgYXR0cmlidXRlIGlmIHVzZXIgc3BlY2lmaWVkIG9uZSwKICAgIC8vIGV2ZW4gaWYgaXQgd2FzIHByZXZpb3VzbHkgbm90IGFzeW5jLiBUaGlzIGlzIGNvbnNpZGVyZWQgbGVzcyBjb25mdXNpbmcuCiAgICBpZiAob3B0QXN5bmMpIHsKICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2FzeW5jJywgJycpOwogICAgfQogICAgLy8gTk9URTogdGhlIGxpbmsgbWF5IG5vdyBiZSBpbiAzIHN0YXRlczogKDEpIHBlbmRpbmcgaW5zZXJ0aW9uLAogICAgLy8gKDIpIGluZmxpZ2h0LCAoMykgYWxyZWFkeSBsb2FkZWQuIEluIGVhY2ggY2FzZSwgd2UgbmVlZCB0byBhZGQKICAgIC8vIGV2ZW50IGxpc3RlbmVycyB0byBwcm9jZXNzIGNhbGxiYWNrcy4KICAgIGxldCBjbGVhbnVwID0gZnVuY3Rpb24oKSB7CiAgICAgIGxpbmsucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIGxvYWRMaXN0ZW5lcik7CiAgICAgIGxpbmsucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTsKICAgIH07CiAgICBsZXQgbG9hZExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgY2xlYW51cCgpOwogICAgICAvLyBJbiBjYXNlIG9mIGEgc3VjY2Vzc2Z1bCBsb2FkLCBjYWNoZSB0aGUgbG9hZCBldmVudCBvbiB0aGUgbGluayBzbwogICAgICAvLyB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIHNob3J0LWNpcmN1aXQgdGhpcyBtZXRob2QgaW4gdGhlIGZ1dHVyZSB3aGVuCiAgICAgIC8vIGl0IGlzIGNhbGxlZCB3aXRoIHRoZSBzYW1lIGhyZWYgcGFyYW0uCiAgICAgIGxpbmsuX19keW5hbWljSW1wb3J0TG9hZGVkID0gdHJ1ZTsKICAgICAgaWYgKG9ubG9hZCkgewogICAgICAgIHdoZW5JbXBvcnRzUmVhZHkoKCkgPT4gewogICAgICAgICAgb25sb2FkKGV2ZW50KTsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIGxldCBlcnJvckxpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgY2xlYW51cCgpOwogICAgICAvLyBJbiBjYXNlIG9mIGFuIGVycm9yLCByZW1vdmUgdGhlIGxpbmsgZnJvbSB0aGUgZG9jdW1lbnQgc28gdGhhdCBpdAogICAgICAvLyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhZ2FpbiB0aGUgbmV4dCB0aW1lIGBpbXBvcnRIcmVmYCBpcwogICAgICAvLyBjYWxsZWQuCiAgICAgIGlmIChsaW5rLnBhcmVudE5vZGUpIHsKICAgICAgICBsaW5rLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobGluayk7CiAgICAgIH0KICAgICAgaWYgKG9uZXJyb3IpIHsKICAgICAgICB3aGVuSW1wb3J0c1JlYWR5KCgpID0+IHsKICAgICAgICAgIG9uZXJyb3IoZXZlbnQpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgbG9hZExpc3RlbmVyKTsKICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTsKICAgIGlmIChsaW5rLnBhcmVudE5vZGUgPT0gbnVsbCkgewogICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspOwogICAgLy8gaWYgdGhlIGxpbmsgYWxyZWFkeSBsb2FkZWQsIGRpc3BhdGNoIGEgZmFrZSBsb2FkIGV2ZW50CiAgICAvLyBzbyB0aGF0IGxpc3RlbmVycyBhcmUgY2FsbGVkIGFuZCBnZXQgYSBwcm9wZXIgZXZlbnQgYXJndW1lbnQuCiAgICB9IGVsc2UgaWYgKGxpbmsuX19keW5hbWljSW1wb3J0TG9hZGVkKSB7CiAgICAgIGxpbmsuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2xvYWQnKSk7CiAgICB9CiAgICByZXR1cm4gbGluazsKICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IHNjaGVkdWxlZCA9IGZhbHNlOwogIGxldCBiZWZvcmVSZW5kZXJRdWV1ZSA9IFtdOwogIGxldCBhZnRlclJlbmRlclF1ZXVlID0gW107CgogIGZ1bmN0aW9uIHNjaGVkdWxlKCkgewogICAgc2NoZWR1bGVkID0gdHJ1ZTsKICAgIC8vIGJlZm9yZSBuZXh0IHJlbmRlcgogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkgewogICAgICBzY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgZmx1c2hRdWV1ZShiZWZvcmVSZW5kZXJRdWV1ZSk7CiAgICAgIC8vIGFmdGVyIHRoZSByZW5kZXIKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBydW5RdWV1ZShhZnRlclJlbmRlclF1ZXVlKTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGZsdXNoUXVldWUocXVldWUpIHsKICAgIHdoaWxlIChxdWV1ZS5sZW5ndGgpIHsKICAgICAgY2FsbE1ldGhvZChxdWV1ZS5zaGlmdCgpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJ1blF1ZXVlKHF1ZXVlKSB7CiAgICBmb3IgKGxldCBpPTAsIGw9cXVldWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGNhbGxNZXRob2QocXVldWUuc2hpZnQoKSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjYWxsTWV0aG9kKGluZm8pIHsKICAgIGNvbnN0IGNvbnRleHQgPSBpbmZvWzBdOwogICAgY29uc3QgY2FsbGJhY2sgPSBpbmZvWzFdOwogICAgY29uc3QgYXJncyA9IGluZm9bMl07CiAgICB0cnkgewogICAgICBjYWxsYmFjay5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgIH0gY2F0Y2goZSkgewogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aHJvdyBlOwogICAgICB9KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZsdXNoKCkgewogICAgd2hpbGUgKGJlZm9yZVJlbmRlclF1ZXVlLmxlbmd0aCB8fCBhZnRlclJlbmRlclF1ZXVlLmxlbmd0aCkgewogICAgICBmbHVzaFF1ZXVlKGJlZm9yZVJlbmRlclF1ZXVlKTsKICAgICAgZmx1c2hRdWV1ZShhZnRlclJlbmRlclF1ZXVlKTsKICAgIH0KICAgIHNjaGVkdWxlZCA9IGZhbHNlOwogIH0KCiAgLyoqCiAgICogTW9kdWxlIGZvciBzY2hlZHVsaW5nIGZsdXNoYWJsZSBwcmUtcmVuZGVyIGFuZCBwb3N0LXJlbmRlciB0YXNrcy4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSBmb3Igc2NoZWR1bGluZyBmbHVzaGFibGUgcHJlLXJlbmRlciBhbmQgcG9zdC1yZW5kZXIgdGFza3MuCiAgICovCiAgUG9seW1lci5SZW5kZXJTdGF0dXMgPSB7CgogICAgLyoqCiAgICAgKiBFbnF1ZXVlcyBhIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgcnVuIGJlZm9yZSB0aGUgbmV4dCByZW5kZXIsIGF0CiAgICAgKiBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCB0aW1pbmcuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBlbnF1ZXVpbmcgd29yayB0aGF0IHJlcXVpcmVzIERPTSBtZWFzdXJlbWVudCwKICAgICAqIHNpbmNlIG1lYXN1cmVtZW50IG1heSBub3QgYmUgcmVsaWFibGUgaW4gY3VzdG9tIGVsZW1lbnQgY2FsbGJhY2tzIGJlZm9yZQogICAgICogdGhlIGZpcnN0IHJlbmRlciwgYXMgd2VsbCBhcyBmb3IgYmF0Y2hpbmcgbWVhc3VyZW1lbnQgdGFza3MgaW4gZ2VuZXJhbC4KICAgICAqCiAgICAgKiBUYXNrcyBpbiB0aGlzIHF1ZXVlIG1heSBiZSBmbHVzaGVkIGJ5IGNhbGxpbmcgYFBvbHltZXIuUmVuZGVyU3RhdHVzLmZsdXNoKClgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlbmRlclN0YXR1cwogICAgICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGJvdW5kIHRvCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLiopOnZvaWR9IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0geyFBcnJheT19IGFyZ3MgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGgKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGJlZm9yZU5leHRSZW5kZXI6IGZ1bmN0aW9uKGNvbnRleHQsIGNhbGxiYWNrLCBhcmdzKSB7CiAgICAgIGlmICghc2NoZWR1bGVkKSB7CiAgICAgICAgc2NoZWR1bGUoKTsKICAgICAgfQogICAgICBiZWZvcmVSZW5kZXJRdWV1ZS5wdXNoKFtjb250ZXh0LCBjYWxsYmFjaywgYXJnc10pOwogICAgfSwKCiAgICAvKioKICAgICAqIEVucXVldWVzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBydW4gYWZ0ZXIgdGhlIG5leHQgcmVuZGVyLCBlcXVpdmFsZW50CiAgICAgKiB0byBvbmUgdGFzayAoYHNldFRpbWVvdXRgKSBhZnRlciB0aGUgbmV4dCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIHR1bmluZyB0aGUgZmlyc3QtcmVuZGVyIHBlcmZvcm1hbmNlIG9mIGFuCiAgICAgKiBlbGVtZW50IG9yIGFwcGxpY2F0aW9uIGJ5IGRlZmVycmluZyBub24tY3JpdGljYWwgd29yayB1bnRpbCBhZnRlciB0aGUKICAgICAqIGZpcnN0IHBhaW50LiAgVHlwaWNhbCBub24tcmVuZGVyLWNyaXRpY2FsIHdvcmsgbWF5IGluY2x1ZGUgYWRkaW5nIFVJCiAgICAgKiBldmVudCBsaXN0ZW5lcnMgYW5kIGFyaWEgYXR0cmlidXRlcy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5SZW5kZXJTdGF0dXMKICAgICAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IG9iamVjdCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBib3VuZCB0bwogICAgICogQHBhcmFtIHtmdW5jdGlvbiguLi4qKTp2b2lkfSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbgogICAgICogQHBhcmFtIHshQXJyYXk9fSBhcmdzIEFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBhZnRlck5leHRSZW5kZXI6IGZ1bmN0aW9uKGNvbnRleHQsIGNhbGxiYWNrLCBhcmdzKSB7CiAgICAgIGlmICghc2NoZWR1bGVkKSB7CiAgICAgICAgc2NoZWR1bGUoKTsKICAgICAgfQogICAgICBhZnRlclJlbmRlclF1ZXVlLnB1c2goW2NvbnRleHQsIGNhbGxiYWNrLCBhcmdzXSk7CiAgICB9LAoKICAgIC8qKgogICAgICogRmx1c2hlcyBhbGwgYGJlZm9yZU5leHRSZW5kZXJgIHRhc2tzLCBmb2xsb3dlZCBieSBhbGwgYGFmdGVyTmV4dFJlbmRlcmAKICAgICAqIHRhc2tzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlbmRlclN0YXR1cwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZmx1c2g6IGZsdXNoCgogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8vIHVucmVzb2x2ZWQKCiAgZnVuY3Rpb24gcmVzb2x2ZSgpIHsKICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQXR0cmlidXRlKCd1bnJlc29sdmVkJyk7CiAgfQoKICBpZiAod2luZG93LldlYkNvbXBvbmVudHMpIHsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdXZWJDb21wb25lbnRzUmVhZHknLCByZXNvbHZlKTsKICB9IGVsc2UgewogICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdpbnRlcmFjdGl2ZScgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykgewogICAgICByZXNvbHZlKCk7CiAgICB9IGVsc2UgewogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHJlc29sdmUpOwogICAgfQogIH0KCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIGZ1bmN0aW9uIG5ld1NwbGljZShpbmRleCwgcmVtb3ZlZCwgYWRkZWRDb3VudCkgewogICAgcmV0dXJuIHsKICAgICAgaW5kZXg6IGluZGV4LAogICAgICByZW1vdmVkOiByZW1vdmVkLAogICAgICBhZGRlZENvdW50OiBhZGRlZENvdW50CiAgICB9OwogIH0KCiAgY29uc3QgRURJVF9MRUFWRSA9IDA7CiAgY29uc3QgRURJVF9VUERBVEUgPSAxOwogIGNvbnN0IEVESVRfQUREID0gMjsKICBjb25zdCBFRElUX0RFTEVURSA9IDM7CgogIC8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgKmJhc2VkKiBvbiB0aGUgY29tcHV0YXRpb24gb2YgdGhlIExldmVuc2h0ZWluCiAgLy8gImVkaXQiIGRpc3RhbmNlLiBUaGUgb25lIGNoYW5nZSBpcyB0aGF0ICJ1cGRhdGVzIiBhcmUgdHJlYXRlZCBhcyB0d28KICAvLyBlZGl0cyAtIG5vdCBvbmUuIFdpdGggQXJyYXkgc3BsaWNlcywgYW4gdXBkYXRlIGlzIHJlYWxseSBhIGRlbGV0ZQogIC8vIGZvbGxvd2VkIGJ5IGFuIGFkZC4gQnkgcmV0YWluaW5nIHRoaXMsIHdlIG9wdGltaXplIGZvciAia2VlcGluZyIgdGhlCiAgLy8gbWF4aW11bSBhcnJheSBpdGVtcyBpbiB0aGUgb3JpZ2luYWwgYXJyYXkuIEZvciBleGFtcGxlOgogIC8vCiAgLy8gICAneHh4eDEyMycgLT4gJzEyM3l5eXknCiAgLy8KICAvLyBXaXRoIDEtZWRpdCB1cGRhdGVzLCB0aGUgc2hvcnRlc3QgcGF0aCB3b3VsZCBiZSBqdXN0IHRvIHVwZGF0ZSBhbGwgc2V2ZW4KICAvLyBjaGFyYWN0ZXJzLiBXaXRoIDItZWRpdCB1cGRhdGVzLCB3ZSBkZWxldGUgNCwgbGVhdmUgMywgYW5kIGFkZCA0LiBUaGlzCiAgLy8gbGVhdmVzIHRoZSBzdWJzdHJpbmcgJzEyMycgaW50YWN0LgogIGZ1bmN0aW9uIGNhbGNFZGl0RGlzdGFuY2VzKGN1cnJlbnQsIGN1cnJlbnRTdGFydCwgY3VycmVudEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSB7CiAgICAvLyAiRGVsZXRpb24iIGNvbHVtbnMKICAgIGxldCByb3dDb3VudCA9IG9sZEVuZCAtIG9sZFN0YXJ0ICsgMTsKICAgIGxldCBjb2x1bW5Db3VudCA9IGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQgKyAxOwogICAgbGV0IGRpc3RhbmNlcyA9IG5ldyBBcnJheShyb3dDb3VudCk7CgogICAgLy8gIkFkZGl0aW9uIiByb3dzLiBJbml0aWFsaXplIG51bGwgY29sdW1uLgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dDb3VudDsgaSsrKSB7CiAgICAgIGRpc3RhbmNlc1tpXSA9IG5ldyBBcnJheShjb2x1bW5Db3VudCk7CiAgICAgIGRpc3RhbmNlc1tpXVswXSA9IGk7CiAgICB9CgogICAgLy8gSW5pdGlhbGl6ZSBudWxsIHJvdwogICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2x1bW5Db3VudDsgaisrKQogICAgICBkaXN0YW5jZXNbMF1bal0gPSBqOwoKICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcm93Q291bnQ7IGkrKykgewogICAgICBmb3IgKGxldCBqID0gMTsgaiA8IGNvbHVtbkNvdW50OyBqKyspIHsKICAgICAgICBpZiAoZXF1YWxzKGN1cnJlbnRbY3VycmVudFN0YXJ0ICsgaiAtIDFdLCBvbGRbb2xkU3RhcnQgKyBpIC0gMV0pKQogICAgICAgICAgZGlzdGFuY2VzW2ldW2pdID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBsZXQgbm9ydGggPSBkaXN0YW5jZXNbaSAtIDFdW2pdICsgMTsKICAgICAgICAgIGxldCB3ZXN0ID0gZGlzdGFuY2VzW2ldW2ogLSAxXSArIDE7CiAgICAgICAgICBkaXN0YW5jZXNbaV1bal0gPSBub3J0aCA8IHdlc3QgPyBub3J0aCA6IHdlc3Q7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGRpc3RhbmNlczsKICB9CgogIC8vIFRoaXMgc3RhcnRzIGF0IHRoZSBmaW5hbCB3ZWlnaHQsIGFuZCB3YWxrcyAiYmFja3dhcmQiIGJ5IGZpbmRpbmcKICAvLyB0aGUgbWluaW11bSBwcmV2aW91cyB3ZWlnaHQgcmVjdXJzaXZlbHkgdW50aWwgdGhlIG9yaWdpbiBvZiB0aGUgd2VpZ2h0CiAgLy8gbWF0cml4LgogIGZ1bmN0aW9uIHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcyhkaXN0YW5jZXMpIHsKICAgIGxldCBpID0gZGlzdGFuY2VzLmxlbmd0aCAtIDE7CiAgICBsZXQgaiA9IGRpc3RhbmNlc1swXS5sZW5ndGggLSAxOwogICAgbGV0IGN1cnJlbnQgPSBkaXN0YW5jZXNbaV1bal07CiAgICBsZXQgZWRpdHMgPSBbXTsKICAgIHdoaWxlIChpID4gMCB8fCBqID4gMCkgewogICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICAgZWRpdHMucHVzaChFRElUX0FERCk7CiAgICAgICAgai0tOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChqID09IDApIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfREVMRVRFKTsKICAgICAgICBpLS07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgbGV0IG5vcnRoV2VzdCA9IGRpc3RhbmNlc1tpIC0gMV1baiAtIDFdOwogICAgICBsZXQgd2VzdCA9IGRpc3RhbmNlc1tpIC0gMV1bal07CiAgICAgIGxldCBub3J0aCA9IGRpc3RhbmNlc1tpXVtqIC0gMV07CgogICAgICBsZXQgbWluOwogICAgICBpZiAod2VzdCA8IG5vcnRoKQogICAgICAgIG1pbiA9IHdlc3QgPCBub3J0aFdlc3QgPyB3ZXN0IDogbm9ydGhXZXN0OwogICAgICBlbHNlCiAgICAgICAgbWluID0gbm9ydGggPCBub3J0aFdlc3QgPyBub3J0aCA6IG5vcnRoV2VzdDsKCiAgICAgIGlmIChtaW4gPT0gbm9ydGhXZXN0KSB7CiAgICAgICAgaWYgKG5vcnRoV2VzdCA9PSBjdXJyZW50KSB7CiAgICAgICAgICBlZGl0cy5wdXNoKEVESVRfTEVBVkUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlZGl0cy5wdXNoKEVESVRfVVBEQVRFKTsKICAgICAgICAgIGN1cnJlbnQgPSBub3J0aFdlc3Q7CiAgICAgICAgfQogICAgICAgIGktLTsKICAgICAgICBqLS07CiAgICAgIH0gZWxzZSBpZiAobWluID09IHdlc3QpIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfREVMRVRFKTsKICAgICAgICBpLS07CiAgICAgICAgY3VycmVudCA9IHdlc3Q7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZWRpdHMucHVzaChFRElUX0FERCk7CiAgICAgICAgai0tOwogICAgICAgIGN1cnJlbnQgPSBub3J0aDsKICAgICAgfQogICAgfQoKICAgIGVkaXRzLnJldmVyc2UoKTsKICAgIHJldHVybiBlZGl0czsKICB9CgogIC8qKgogICAqIFNwbGljZSBQcm9qZWN0aW9uIGZ1bmN0aW9uczoKICAgKgogICAqIEEgc3BsaWNlIG1hcCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGhvdyBhIHByZXZpb3VzIGFycmF5IG9mIGl0ZW1zCiAgICogd2FzIHRyYW5zZm9ybWVkIGludG8gYSBuZXcgYXJyYXkgb2YgaXRlbXMuIENvbmNlcHR1YWxseSBpdCBpcyBhIGxpc3Qgb2YKICAgKiB0dXBsZXMgb2YKICAgKgogICAqICAgPGluZGV4LCByZW1vdmVkLCBhZGRlZENvdW50PgogICAqCiAgICogd2hpY2ggYXJlIGtlcHQgaW4gYXNjZW5kaW5nIGluZGV4IG9yZGVyIG9mLiBUaGUgdHVwbGUgcmVwcmVzZW50cyB0aGF0IGF0CiAgICogdGhlIHxpbmRleHwsIHxyZW1vdmVkfCBzZXF1ZW5jZSBvZiBpdGVtcyB3ZXJlIHJlbW92ZWQsIGFuZCBjb3VudGluZyBmb3J3YXJkCiAgICogZnJvbSB8aW5kZXh8LCB8YWRkZWRDb3VudHwgaXRlbXMgd2VyZSBhZGRlZC4KICAgKi8KCiAgLyoqCiAgICogTGFja2luZyBpbmRpdmlkdWFsIHNwbGljZSBtdXRhdGlvbiBpbmZvcm1hdGlvbiwgdGhlIG1pbmltYWwgc2V0IG9mCiAgICogc3BsaWNlcyBjYW4gYmUgc3ludGhlc2l6ZWQgZ2l2ZW4gdGhlIHByZXZpb3VzIHN0YXRlIGFuZCBmaW5hbCBzdGF0ZSBvZiBhbgogICAqIGFycmF5LiBUaGUgYmFzaWMgYXBwcm9hY2ggaXMgdG8gY2FsY3VsYXRlIHRoZSBlZGl0IGRpc3RhbmNlIG1hdHJpeCBhbmQKICAgKiBjaG9vc2UgdGhlIHNob3J0ZXN0IHBhdGggdGhyb3VnaCBpdC4KICAgKgogICAqIENvbXBsZXhpdHk6IE8obCAqIHApCiAgICogICBsOiBUaGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGFycmF5CiAgICogICBwOiBUaGUgbGVuZ3RoIG9mIHRoZSBvbGQgYXJyYXkKICAgKgogICAqIEBwYXJhbSB7IUFycmF5fSBjdXJyZW50IFRoZSBjdXJyZW50ICJjaGFuZ2VkIiBhcnJheSBmb3Igd2hpY2ggdG8KICAgKiBjYWxjdWxhdGUgc3BsaWNlcy4KICAgKiBAcGFyYW0ge251bWJlcn0gY3VycmVudFN0YXJ0IFN0YXJ0aW5nIGluZGV4IGluIHRoZSBgY3VycmVudGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcGFyYW0ge251bWJlcn0gY3VycmVudEVuZCBFbmRpbmcgaW5kZXggaW4gdGhlIGBjdXJyZW50YCBhcnJheSBmb3IKICAgKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLgogICAqIEBwYXJhbSB7IUFycmF5fSBvbGQgVGhlIG9yaWdpbmFsICJ1bmNoYW5nZWQiIGFycmF5IHRvIGNvbXBhcmUgYGN1cnJlbnRgCiAgICogYWdhaW5zdCB0byBkZXRlcm1pbmUgc3BsaWNlcy4KICAgKiBAcGFyYW0ge251bWJlcn0gb2xkU3RhcnQgU3RhcnRpbmcgaW5kZXggaW4gdGhlIGBvbGRgIGFycmF5IGZvcgogICAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuCiAgICogQHBhcmFtIHtudW1iZXJ9IG9sZEVuZCBFbmRpbmcgaW5kZXggaW4gdGhlIGBvbGRgIGFycmF5IGZvcgogICAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuCiAgICogQHJldHVybiB7IUFycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHNwbGljZSByZWNvcmQgb2JqZWN0cy4gRWFjaCBvZiB0aGVzZQogICAqIGNvbnRhaW5zOiBgaW5kZXhgIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgc3BsaWNlIG9jY3VycmVkOyBgcmVtb3ZlZGAKICAgKiB0aGUgYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgbG9jYXRpb247IGBhZGRlZENvdW50YCB0aGUgbnVtYmVyCiAgICogb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBsb2NhdGlvbi4KICAgKi8KICBmdW5jdGlvbiBjYWxjU3BsaWNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIG9sZCwgb2xkU3RhcnQsIG9sZEVuZCkgewogICAgbGV0IHByZWZpeENvdW50ID0gMDsKICAgIGxldCBzdWZmaXhDb3VudCA9IDA7CiAgICBsZXQgc3BsaWNlOwoKICAgIGxldCBtaW5MZW5ndGggPSBNYXRoLm1pbihjdXJyZW50RW5kIC0gY3VycmVudFN0YXJ0LCBvbGRFbmQgLSBvbGRTdGFydCk7CiAgICBpZiAoY3VycmVudFN0YXJ0ID09IDAgJiYgb2xkU3RhcnQgPT0gMCkKICAgICAgcHJlZml4Q291bnQgPSBzaGFyZWRQcmVmaXgoY3VycmVudCwgb2xkLCBtaW5MZW5ndGgpOwoKICAgIGlmIChjdXJyZW50RW5kID09IGN1cnJlbnQubGVuZ3RoICYmIG9sZEVuZCA9PSBvbGQubGVuZ3RoKQogICAgICBzdWZmaXhDb3VudCA9IHNoYXJlZFN1ZmZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCAtIHByZWZpeENvdW50KTsKCiAgICBjdXJyZW50U3RhcnQgKz0gcHJlZml4Q291bnQ7CiAgICBvbGRTdGFydCArPSBwcmVmaXhDb3VudDsKICAgIGN1cnJlbnRFbmQgLT0gc3VmZml4Q291bnQ7CiAgICBvbGRFbmQgLT0gc3VmZml4Q291bnQ7CgogICAgaWYgKGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQgPT0gMCAmJiBvbGRFbmQgLSBvbGRTdGFydCA9PSAwKQogICAgICByZXR1cm4gW107CgogICAgaWYgKGN1cnJlbnRTdGFydCA9PSBjdXJyZW50RW5kKSB7CiAgICAgIHNwbGljZSA9IG5ld1NwbGljZShjdXJyZW50U3RhcnQsIFtdLCAwKTsKICAgICAgd2hpbGUgKG9sZFN0YXJ0IDwgb2xkRW5kKQogICAgICAgIHNwbGljZS5yZW1vdmVkLnB1c2gob2xkW29sZFN0YXJ0KytdKTsKCiAgICAgIHJldHVybiBbIHNwbGljZSBdOwogICAgfSBlbHNlIGlmIChvbGRTdGFydCA9PSBvbGRFbmQpCiAgICAgIHJldHVybiBbIG5ld1NwbGljZShjdXJyZW50U3RhcnQsIFtdLCBjdXJyZW50RW5kIC0gY3VycmVudFN0YXJ0KSBdOwoKICAgIGxldCBvcHMgPSBzcGxpY2VPcGVyYXRpb25zRnJvbUVkaXREaXN0YW5jZXMoCiAgICAgICAgY2FsY0VkaXREaXN0YW5jZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSk7CgogICAgc3BsaWNlID0gdW5kZWZpbmVkOwogICAgbGV0IHNwbGljZXMgPSBbXTsKICAgIGxldCBpbmRleCA9IGN1cnJlbnRTdGFydDsKICAgIGxldCBvbGRJbmRleCA9IG9sZFN0YXJ0OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgc3dpdGNoKG9wc1tpXSkgewogICAgICAgIGNhc2UgRURJVF9MRUFWRToKICAgICAgICAgIGlmIChzcGxpY2UpIHsKICAgICAgICAgICAgc3BsaWNlcy5wdXNoKHNwbGljZSk7CiAgICAgICAgICAgIHNwbGljZSA9IHVuZGVmaW5lZDsKICAgICAgICAgIH0KCiAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgb2xkSW5kZXgrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRURJVF9VUERBVEU6CiAgICAgICAgICBpZiAoIXNwbGljZSkKICAgICAgICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGluZGV4LCBbXSwgMCk7CgogICAgICAgICAgc3BsaWNlLmFkZGVkQ291bnQrKzsKICAgICAgICAgIGluZGV4Kys7CgogICAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkSW5kZXhdKTsKICAgICAgICAgIG9sZEluZGV4Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVESVRfQUREOgogICAgICAgICAgaWYgKCFzcGxpY2UpCiAgICAgICAgICAgIHNwbGljZSA9IG5ld1NwbGljZShpbmRleCwgW10sIDApOwoKICAgICAgICAgIHNwbGljZS5hZGRlZENvdW50Kys7CiAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFRElUX0RFTEVURToKICAgICAgICAgIGlmICghc3BsaWNlKQogICAgICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoaW5kZXgsIFtdLCAwKTsKCiAgICAgICAgICBzcGxpY2UucmVtb3ZlZC5wdXNoKG9sZFtvbGRJbmRleF0pOwogICAgICAgICAgb2xkSW5kZXgrKzsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgaWYgKHNwbGljZSkgewogICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTsKICAgIH0KICAgIHJldHVybiBzcGxpY2VzOwogIH0KCiAgZnVuY3Rpb24gc2hhcmVkUHJlZml4KGN1cnJlbnQsIG9sZCwgc2VhcmNoTGVuZ3RoKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaExlbmd0aDsgaSsrKQogICAgICBpZiAoIWVxdWFscyhjdXJyZW50W2ldLCBvbGRbaV0pKQogICAgICAgIHJldHVybiBpOwogICAgcmV0dXJuIHNlYXJjaExlbmd0aDsKICB9CgogIGZ1bmN0aW9uIHNoYXJlZFN1ZmZpeChjdXJyZW50LCBvbGQsIHNlYXJjaExlbmd0aCkgewogICAgbGV0IGluZGV4MSA9IGN1cnJlbnQubGVuZ3RoOwogICAgbGV0IGluZGV4MiA9IG9sZC5sZW5ndGg7CiAgICBsZXQgY291bnQgPSAwOwogICAgd2hpbGUgKGNvdW50IDwgc2VhcmNoTGVuZ3RoICYmIGVxdWFscyhjdXJyZW50Wy0taW5kZXgxXSwgb2xkWy0taW5kZXgyXSkpCiAgICAgIGNvdW50Kys7CgogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgZnVuY3Rpb24gY2FsY3VsYXRlU3BsaWNlcyhjdXJyZW50LCBwcmV2aW91cykgewogICAgcmV0dXJuIGNhbGNTcGxpY2VzKGN1cnJlbnQsIDAsIGN1cnJlbnQubGVuZ3RoLCBwcmV2aW91cywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLmxlbmd0aCk7CiAgfQoKICBmdW5jdGlvbiBlcXVhbHMoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSB7CiAgICByZXR1cm4gY3VycmVudFZhbHVlID09PSBwcmV2aW91c1ZhbHVlOwogIH0KCiAgLyoqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHRoYXQgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBkaWZmaW5nIGFycmF5cy4KICAgKi8KICBQb2x5bWVyLkFycmF5U3BsaWNlID0gewogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHNwbGljZSByZWNvcmRzIGluZGljYXRpbmcgdGhlIG1pbmltdW0gZWRpdHMgcmVxdWlyZWQKICAgICAqIHRvIHRyYW5zZm9ybSB0aGUgYHByZXZpb3VzYCBhcnJheSBpbnRvIHRoZSBgY3VycmVudGAgYXJyYXkuCiAgICAgKgogICAgICogU3BsaWNlIHJlY29yZHMgYXJlIG9yZGVyZWQgYnkgaW5kZXggYW5kIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWVsZHM6CiAgICAgKiAtIGBpbmRleGA6IGluZGV4IHdoZXJlIGVkaXQgc3RhcnRlZAogICAgICogLSBgcmVtb3ZlZGA6IGFycmF5IG9mIHJlbW92ZWQgaXRlbXMgZnJvbSB0aGlzIGluZGV4CiAgICAgKiAtIGBhZGRlZENvdW50YDogbnVtYmVyIG9mIGl0ZW1zIGFkZGVkIGF0IHRoaXMgaW5kZXgKICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIHRoZSBMZXZlbnNodGVpbiAibWluaW11bSBlZGl0IGRpc3RhbmNlIgogICAgICogYWxnb3JpdGhtLiBOb3RlIHRoYXQgdXBkYXRlcyBhcmUgdHJlYXRlZCBhcyByZW1vdmFsIGZvbGxvd2VkIGJ5IGFkZGl0aW9uLgogICAgICoKICAgICAqIFRoZSB3b3JzdC1jYXNlIHRpbWUgY29tcGxleGl0eSBvZiB0aGlzIGFsZ29yaXRobSBpcyBgTyhsICogcClgCiAgICAgKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXkKICAgICAqICAgcDogVGhlIGxlbmd0aCBvZiB0aGUgcHJldmlvdXMgYXJyYXkKICAgICAqCiAgICAgKiBIb3dldmVyLCB0aGUgd29yc3QtY2FzZSBjb21wbGV4aXR5IGlzIHJlZHVjZWQgYnkgYW4gYE8obilgIG9wdGltaXphdGlvbgogICAgICogdG8gZGV0ZWN0IGFueSBzaGFyZWQgcHJlZml4ICYgc3VmZml4IGJldHdlZW4gdGhlIHR3byBhcnJheXMgYW5kIG9ubHkKICAgICAqIHBlcmZvcm0gdGhlIG1vcmUgZXhwZW5zaXZlIG1pbmltdW0gZWRpdCBkaXN0YW5jZSBjYWxjdWxhdGlvbiBvdmVyIHRoZQogICAgICogbm9uLXNoYXJlZCBwb3J0aW9ucyBvZiB0aGUgYXJyYXlzLgogICAgICoKICAgICAqIEBmdW5jdGlvbgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXJyYXlTcGxpY2UKICAgICAqIEBwYXJhbSB7IUFycmF5fSBjdXJyZW50IFRoZSAiY2hhbmdlZCIgYXJyYXkgZm9yIHdoaWNoIHNwbGljZXMgd2lsbCBiZQogICAgICogY2FsY3VsYXRlZC4KICAgICAqIEBwYXJhbSB7IUFycmF5fSBwcmV2aW91cyBUaGUgInVuY2hhbmdlZCIgb3JpZ2luYWwgYXJyYXkgdG8gY29tcGFyZQogICAgICogYGN1cnJlbnRgIGFnYWluc3QgdG8gZGV0ZXJtaW5lIHRoZSBzcGxpY2VzLgogICAgICogQHJldHVybiB7IUFycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHNwbGljZSByZWNvcmQgb2JqZWN0cy4gRWFjaCBvZiB0aGVzZQogICAgICogY29udGFpbnM6IGBpbmRleGAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzcGxpY2Ugb2NjdXJyZWQ7IGByZW1vdmVkYAogICAgICogdGhlIGFycmF5IG9mIHJlbW92ZWQgaXRlbXMgZnJvbSB0aGlzIGxvY2F0aW9uOyBgYWRkZWRDb3VudGAgdGhlIG51bWJlcgogICAgICogb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBsb2NhdGlvbi4KICAgICAqLwogICAgY2FsY3VsYXRlU3BsaWNlcwogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiBgbm9kZWAgaXMgYSBzbG90IGVsZW1lbnQKICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byB0ZXN0LgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYG5vZGVgIGlzIGEgc2xvdAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gaXNTbG90KG5vZGUpIHsKICAgIHJldHVybiAobm9kZS5sb2NhbE5hbWUgPT09ICdzbG90Jyk7CiAgfQoKICAvKioKICAgKiBDbGFzcyB0aGF0IGxpc3RlbnMgZm9yIGNoYW5nZXMgKGFkZGl0aW9ucyBvciByZW1vdmFscykgdG8KICAgKiAiZmxhdHRlbmVkIG5vZGVzIiBvbiBhIGdpdmVuIGBub2RlYC4gVGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzIGNvbnNpc3RzCiAgICogb2YgYSBub2RlJ3MgY2hpbGRyZW4gYW5kLCBmb3IgYW55IGNoaWxkcmVuIHRoYXQgYXJlIGA8c2xvdD5gIGVsZW1lbnRzLAogICAqIHRoZSBleHBhbmRlZCBmbGF0dGVuZWQgbGlzdCBvZiBgYXNzaWduZWROb2Rlc2AuCiAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSBvYnNlcnZlZCBub2RlIGhhcyBjaGlsZHJlbiBgPGE+PC9hPjxzbG90Pjwvc2xvdD48Yj48L2I+YAogICAqIGFuZCB0aGUgYDxzbG90PmAgaGFzIG9uZSBgPGRpdj5gIGFzc2lnbmVkIHRvIGl0LCB0aGVuIHRoZSBmbGF0dGVuZWQKICAgKiBub2RlcyBsaXN0IGlzIGA8YT48L2E+PGRpdj48L2Rpdj48Yj48L2I+YC4gSWYgdGhlIGA8c2xvdD5gIGhhcyBvdGhlcgogICAqIGA8c2xvdD5gIGVsZW1lbnRzIGFzc2lnbmVkIHRvIGl0LCB0aGVzZSBhcmUgZmxhdHRlbmVkIGFzIHdlbGwuCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgYGNhbGxiYWNrYCBpcyBjYWxsZWQgd2hlbmV2ZXIgYW55IGNoYW5nZSB0byB0aGlzIGxpc3QKICAgKiBvZiBmbGF0dGVuZWQgbm9kZXMgb2NjdXJzLCB3aGVyZSBhbiBhZGRpdGlvbiBvciByZW1vdmFsIG9mIGEgbm9kZSBpcwogICAqIGNvbnNpZGVyZWQgYSBjaGFuZ2UuIFRoZSBgY2FsbGJhY2tgIGlzIGNhbGxlZCB3aXRoIG9uZSBhcmd1bWVudCwgYW4gb2JqZWN0CiAgICogY29udGFpbmluZyBhbiBhcnJheSBvZiBhbnkgYGFkZGVkTm9kZXNgIGFuZCBgcmVtb3ZlZE5vZGVzYC4KICAgKgogICAqIE5vdGU6IHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgYXN5bmNocm9ub3VzIHRvIGFueSBjaGFuZ2VzCiAgICogYXQgYSBtaWNyb3Rhc2sgY2hlY2twb2ludC4gVGhpcyBpcyBiZWNhdXNlIG9ic2VydmF0aW9uIGlzIHBlcmZvcm1lZCB1c2luZwogICAqIGBNdXRhdGlvbk9ic2VydmVyYCBhbmQgdGhlIGA8c2xvdD5gIGVsZW1lbnQncyBgc2xvdGNoYW5nZWAgZXZlbnQgd2hpY2gKICAgKiBhcmUgYXN5bmNocm9ub3VzLgogICAqCiAgICogQW4gZXhhbXBsZToKICAgKiBgYGBqcwogICAqIGNsYXNzIFRlc3RTZWxmT2JzZXJ2ZSBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CiAgICogICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ3Rlc3Qtc2VsZi1vYnNlcnZlJzt9CiAgICogICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgKiAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgKiAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBuZXcgUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyKHRoaXMsIChpbmZvKSA9PiB7CiAgICogICAgICAgdGhpcy5pbmZvID0gaW5mbzsKICAgKiAgICAgfSk7CiAgICogICB9CiAgICogICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgKiAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgKiAgICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAqICAgfQogICAqIH0KICAgKiBjdXN0b21FbGVtZW50cy5kZWZpbmUoVGVzdFNlbGZPYnNlcnZlLmlzLCBUZXN0U2VsZk9ic2VydmUpOwogICAqIGBgYAogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDbGFzcyB0aGF0IGxpc3RlbnMgZm9yIGNoYW5nZXMgKGFkZGl0aW9ucyBvciByZW1vdmFscykgdG8KICAgKiAiZmxhdHRlbmVkIG5vZGVzIiBvbiBhIGdpdmVuIGBub2RlYC4KICAgKi8KICBjbGFzcyBGbGF0dGVuZWROb2Rlc09ic2VydmVyIHsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzIGZvciB0aGUgZ2l2ZW4gYG5vZGVgLgogICAgICogVGhpcyBsaXN0IGNvbnNpc3RzIG9mIGEgbm9kZSdzIGNoaWxkcmVuIGFuZCwgZm9yIGFueSBjaGlsZHJlbgogICAgICogdGhhdCBhcmUgYDxzbG90PmAgZWxlbWVudHMsIHRoZSBleHBhbmRlZCBmbGF0dGVuZWQgbGlzdCBvZiBgYXNzaWduZWROb2Rlc2AuCiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9ic2VydmVkIG5vZGUgaGFzIGNoaWxkcmVuIGA8YT48L2E+PHNsb3Q+PC9zbG90PjxiPjwvYj5gCiAgICAgKiBhbmQgdGhlIGA8c2xvdD5gIGhhcyBvbmUgYDxkaXY+YCBhc3NpZ25lZCB0byBpdCwgdGhlbiB0aGUgZmxhdHRlbmVkCiAgICAgKiBub2RlcyBsaXN0IGlzIGA8YT48L2E+PGRpdj48L2Rpdj48Yj48L2I+YC4gSWYgdGhlIGA8c2xvdD5gIGhhcyBvdGhlcgogICAgICogYDxzbG90PmAgZWxlbWVudHMgYXNzaWduZWQgdG8gaXQsIHRoZXNlIGFyZSBmbGF0dGVuZWQgYXMgd2VsbC4KICAgICAqCiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fEhUTUxTbG90RWxlbWVudH0gbm9kZSBUaGUgbm9kZSBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2Rlcy4KICAgICAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgZm9yIHRoZSBnaXZlbiBgbm9kZWAuCiAgICAqLwogICAgc3RhdGljIGdldEZsYXR0ZW5lZE5vZGVzKG5vZGUpIHsKICAgICAgaWYgKGlzU2xvdChub2RlKSkgewogICAgICAgIG5vZGUgPSAvKiogQHR5cGUge0hUTUxTbG90RWxlbWVudH0gKi8obm9kZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1hc3NpZ24KICAgICAgICByZXR1cm4gbm9kZS5hc3NpZ25lZE5vZGVzKHtmbGF0dGVuOiB0cnVlfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obm9kZS5jaGlsZE5vZGVzKS5tYXAoKG5vZGUpID0+IHsKICAgICAgICAgIGlmIChpc1Nsb3Qobm9kZSkpIHsKICAgICAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7SFRNTFNsb3RFbGVtZW50fSAqLyhub2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgICAgICByZXR1cm4gbm9kZS5hc3NpZ25lZE5vZGVzKHtmbGF0dGVuOiB0cnVlfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gW25vZGVdOwogICAgICAgICAgfQogICAgICAgIH0pLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYiksIFtdKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgTm9kZSBvbiB3aGljaCB0byBsaXN0ZW4gZm9yIGNoYW5nZXMuCiAgICAgKiBAcGFyYW0gez9mdW5jdGlvbighRWxlbWVudCwgeyB0YXJnZXQ6ICFFbGVtZW50LCBhZGRlZE5vZGVzOiAhQXJyYXk8IUVsZW1lbnQ+LCByZW1vdmVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4gfSk6dm9pZH0gY2FsbGJhY2sgRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlcmUgYXJlIGFkZGl0aW9ucwogICAgICogb3IgcmVtb3ZhbHMgZnJvbSB0aGUgdGFyZ2V0J3MgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMuCiAgICAqLwogICAgY29uc3RydWN0b3IodGFyZ2V0LCBjYWxsYmFjaykgewogICAgICAvKioKICAgICAgICogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICAvKioKICAgICAgICogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7RWxlbWVudH0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX3RhcmdldCA9IHRhcmdldDsKICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICB0aGlzLl9lZmZlY3RpdmVOb2RlcyA9IFtdOwogICAgICB0aGlzLl9vYnNlcnZlciA9IG51bGw7CiAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IGZhbHNlOwogICAgICAvKioKICAgICAgICogQHR5cGUge2Z1bmN0aW9uKCl9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICB0aGlzLl9ib3VuZFNjaGVkdWxlID0gKCkgPT4gewogICAgICAgIHRoaXMuX3NjaGVkdWxlKCk7CiAgICAgIH07CiAgICAgIHRoaXMuY29ubmVjdCgpOwogICAgICB0aGlzLl9zY2hlZHVsZSgpOwogICAgfQoKICAgIC8qKgogICAgICogQWN0aXZhdGVzIGFuIG9ic2VydmVyLiBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZCB3aGVuCiAgICAgKiBhIGBGbGF0dGVuZWROb2Rlc09ic2VydmVyYCBpcyBjcmVhdGVkLiBJdCBzaG91bGQgb25seSBiZSBjYWxsZWQgdG8KICAgICAqIHJlLWFjdGl2YXRlIGFuIG9ic2VydmVyIHRoYXQgaGFzIGJlZW4gZGVhY3RpdmF0ZWQgdmlhIHRoZSBgZGlzY29ubmVjdGAgbWV0aG9kLgogICAgICoKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNvbm5lY3QoKSB7CiAgICAgIGlmIChpc1Nsb3QodGhpcy5fdGFyZ2V0KSkgewogICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKFt0aGlzLl90YXJnZXRdKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXJnZXQuY2hpbGRyZW4pIHsKICAgICAgICB0aGlzLl9saXN0ZW5TbG90cyh0aGlzLl90YXJnZXQuY2hpbGRyZW4pOwogICAgICAgIGlmICh3aW5kb3cuU2hhZHlET00pIHsKICAgICAgICAgIHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciA9CiAgICAgICAgICAgIFNoYWR5RE9NLm9ic2VydmVDaGlsZHJlbih0aGlzLl90YXJnZXQsIChtdXRhdGlvbnMpID0+IHsKICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzTXV0YXRpb25zKG11dGF0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0KICAgICAgICAgICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4gewogICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyLm9ic2VydmUodGhpcy5fdGFyZ2V0LCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBEZWFjdGl2YXRlcyB0aGUgZmxhdHRlbmVkIG5vZGVzIG9ic2VydmVyLiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kCiAgICAgKiB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkIHdoZW4gY2hhbmdlcyB0byBmbGF0dGVuZWQgbm9kZXMKICAgICAqIG9jY3VyLiBUaGUgYGNvbm5lY3RgIG1ldGhvZCBtYXkgYmUgc3Vic2VxdWVudGx5IGNhbGxlZCB0byByZWFjdGl2YXRlCiAgICAgKiB0aGUgb2JzZXJ2ZXIuCiAgICAgKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZGlzY29ubmVjdCgpIHsKICAgICAgaWYgKGlzU2xvdCh0aGlzLl90YXJnZXQpKSB7CiAgICAgICAgdGhpcy5fdW5saXN0ZW5TbG90cyhbdGhpcy5fdGFyZ2V0XSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGFyZ2V0LmNoaWxkcmVuKSB7CiAgICAgICAgdGhpcy5fdW5saXN0ZW5TbG90cyh0aGlzLl90YXJnZXQuY2hpbGRyZW4pOwogICAgICAgIGlmICh3aW5kb3cuU2hhZHlET00gJiYgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyKSB7CiAgICAgICAgICBTaGFkeURPTS51bm9ic2VydmVDaGlsZHJlbih0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIpOwogICAgICAgICAgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlciA9IG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF9zY2hlZHVsZSgpIHsKICAgICAgaWYgKCF0aGlzLl9zY2hlZHVsZWQpIHsKICAgICAgICB0aGlzLl9zY2hlZHVsZWQgPSB0cnVlOwogICAgICAgIFBvbHltZXIuQXN5bmMubWljcm9UYXNrLnJ1bigoKSA9PiB0aGlzLmZsdXNoKCkpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0FycmF5PE11dGF0aW9uUmVjb3JkPn0gbXV0YXRpb25zIE11dGF0aW9ucyBzaWduYWxlZCBieSB0aGUgbXV0YXRpb24gb2JzZXJ2ZXIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpIHsKICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnMobXV0YXRpb25zKTsKICAgICAgdGhpcy5mbHVzaCgpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtBcnJheTxNdXRhdGlvblJlY29yZD59IG11dGF0aW9ucyBNdXRhdGlvbnMgc2lnbmFsZWQgYnkgdGhlIG11dGF0aW9uIG9ic2VydmVyCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3Byb2Nlc3NTbG90TXV0YXRpb25zKG11dGF0aW9ucykgewogICAgICBpZiAobXV0YXRpb25zKSB7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbXV0YXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07CiAgICAgICAgICBpZiAobXV0YXRpb24uYWRkZWROb2RlcykgewogICAgICAgICAgICB0aGlzLl9saXN0ZW5TbG90cyhtdXRhdGlvbi5hZGRlZE5vZGVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtdXRhdGlvbi5yZW1vdmVkTm9kZXMpIHsKICAgICAgICAgICAgdGhpcy5fdW5saXN0ZW5TbG90cyhtdXRhdGlvbi5yZW1vdmVkTm9kZXMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRmx1c2hlcyB0aGUgb2JzZXJ2ZXIgY2F1c2luZyBhbnkgcGVuZGluZyBjaGFuZ2VzIHRvIGJlIGltbWVkaWF0ZWx5CiAgICAgKiBkZWxpdmVyZWQgdGhlIG9ic2VydmVyIGNhbGxiYWNrLiBCeSBkZWZhdWx0IHRoZXNlIGNoYW5nZXMgYXJlIGRlbGl2ZXJlZAogICAgICogYXN5bmNocm9ub3VzbHkgYXQgdGhlIG5leHQgbWljcm90YXNrIGNoZWNrcG9pbnQuCiAgICAgKgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwZW5kaW5nIGNoYW5nZXMgY2F1c2VkIHRoZSBvYnNlcnZlcgogICAgICogY2FsbGJhY2sgdG8gcnVuLgogICAgICovCiAgICBmbHVzaCgpIHsKICAgICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSkgewogICAgICAgIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICB0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyh0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgIHRoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlci50YWtlUmVjb3JkcygpKTsKICAgICAgfQogICAgICB0aGlzLl9zY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgbGV0IGluZm8gPSB7CiAgICAgICAgdGFyZ2V0OiB0aGlzLl90YXJnZXQsCiAgICAgICAgYWRkZWROb2RlczogW10sCiAgICAgICAgcmVtb3ZlZE5vZGVzOiBbXQogICAgICB9OwogICAgICBsZXQgbmV3Tm9kZXMgPSB0aGlzLmNvbnN0cnVjdG9yLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMuX3RhcmdldCk7CiAgICAgIGxldCBzcGxpY2VzID0gUG9seW1lci5BcnJheVNwbGljZS5jYWxjdWxhdGVTcGxpY2VzKG5ld05vZGVzLAogICAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzKTsKICAgICAgLy8gcHJvY2VzcyByZW1vdmFscwogICAgICBmb3IgKGxldCBpPTAsIHM7IChpPHNwbGljZXMubGVuZ3RoKSAmJiAocz1zcGxpY2VzW2ldKTsgaSsrKSB7CiAgICAgICAgZm9yIChsZXQgaj0wLCBuOyAoaiA8IHMucmVtb3ZlZC5sZW5ndGgpICYmIChuPXMucmVtb3ZlZFtqXSk7IGorKykgewogICAgICAgICAgaW5mby5yZW1vdmVkTm9kZXMucHVzaChuKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gcHJvY2VzcyBhZGRzCiAgICAgIGZvciAobGV0IGk9MCwgczsgKGk8c3BsaWNlcy5sZW5ndGgpICYmIChzPXNwbGljZXNbaV0pOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqPXMuaW5kZXg7IGogPCBzLmluZGV4ICsgcy5hZGRlZENvdW50OyBqKyspIHsKICAgICAgICAgIGluZm8uYWRkZWROb2Rlcy5wdXNoKG5ld05vZGVzW2pdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gdXBkYXRlIGNhY2hlCiAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gbmV3Tm9kZXM7CiAgICAgIGxldCBkaWRGbHVzaCA9IGZhbHNlOwogICAgICBpZiAoaW5mby5hZGRlZE5vZGVzLmxlbmd0aCB8fCBpbmZvLnJlbW92ZWROb2Rlcy5sZW5ndGgpIHsKICAgICAgICBkaWRGbHVzaCA9IHRydWU7CiAgICAgICAgdGhpcy5jYWxsYmFjay5jYWxsKHRoaXMuX3RhcmdldCwgaW5mbyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGRpZEZsdXNoOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshQXJyYXk8RWxlbWVudHxOb2RlPnwhTm9kZUxpc3Q8Tm9kZT59IG5vZGVMaXN0IE5vZGVzIHRoYXQgY291bGQgY2hhbmdlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX2xpc3RlblNsb3RzKG5vZGVMaXN0KSB7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG5vZGVMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IG4gPSBub2RlTGlzdFtpXTsKICAgICAgICBpZiAoaXNTbG90KG4pKSB7CiAgICAgICAgICBuLmFkZEV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCB0aGlzLl9ib3VuZFNjaGVkdWxlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7IUFycmF5PEVsZW1lbnR8Tm9kZT58IU5vZGVMaXN0PE5vZGU+fSBub2RlTGlzdCBOb2RlcyB0aGF0IGNvdWxkIGNoYW5nZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF91bmxpc3RlblNsb3RzKG5vZGVMaXN0KSB7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG5vZGVMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IG4gPSBub2RlTGlzdFtpXTsKICAgICAgICBpZiAoaXNTbG90KG4pKSB7CiAgICAgICAgICBuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCB0aGlzLl9ib3VuZFNjaGVkdWxlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgfQoKICBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIgPSBGbGF0dGVuZWROb2Rlc09ic2VydmVyOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgZGVib3VuY2VyUXVldWUgPSBbXTsKCiAgLyoqCiAgICogQWRkcyBhIGBQb2x5bWVyLkRlYm91bmNlcmAgdG8gYSBsaXN0IG9mIGdsb2JhbGx5IGZsdXNoYWJsZSB0YXNrcy4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHshUG9seW1lci5EZWJvdW5jZXJ9IGRlYm91bmNlciBEZWJvdW5jZXIgdG8gZW5xdWV1ZQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyID0gZnVuY3Rpb24oZGVib3VuY2VyKSB7CiAgICBkZWJvdW5jZXJRdWV1ZS5wdXNoKGRlYm91bmNlcik7CiAgfTsKCiAgZnVuY3Rpb24gZmx1c2hEZWJvdW5jZXJzKCkgewogICAgY29uc3QgZGlkRmx1c2ggPSBCb29sZWFuKGRlYm91bmNlclF1ZXVlLmxlbmd0aCk7CiAgICB3aGlsZSAoZGVib3VuY2VyUXVldWUubGVuZ3RoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgZGVib3VuY2VyUXVldWUuc2hpZnQoKS5mbHVzaCgpOwogICAgICB9IGNhdGNoKGUpIHsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkaWRGbHVzaDsKICB9CgogIC8qKgogICAqIEZvcmNlcyBzZXZlcmFsIGNsYXNzZXMgb2YgYXN5bmNocm9ub3VzbHkgcXVldWVkIHRhc2tzIHRvIGZsdXNoOgogICAqIC0gRGVib3VuY2VycyBhZGRlZCB2aWEgYGVucXVldWVEZWJvdW5jZXJgCiAgICogLSBTaGFkeURPTSBkaXN0cmlidXRpb24KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLmZsdXNoID0gZnVuY3Rpb24oKSB7CiAgICBsZXQgc2hhZHlET00sIGRlYm91bmNlcnM7CiAgICBkbyB7CiAgICAgIHNoYWR5RE9NID0gd2luZG93LlNoYWR5RE9NICYmIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgIGlmICh3aW5kb3cuU2hhZHlDU1MgJiYgd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKSB7CiAgICAgICAgd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltLmZsdXNoKCk7CiAgICAgIH0KICAgICAgZGVib3VuY2VycyA9IGZsdXNoRGVib3VuY2VycygpOwogICAgfSB3aGlsZSAoc2hhZHlET00gfHwgZGVib3VuY2Vycyk7CiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgcCA9IEVsZW1lbnQucHJvdG90eXBlOwogIC8qKgogICAqIEBjb25zdCB7ZnVuY3Rpb24odGhpczpOb2RlLCBzdHJpbmcpOiBib29sZWFufQogICAqLwogIGNvbnN0IG5vcm1hbGl6ZWRNYXRjaGVzU2VsZWN0b3IgPSBwLm1hdGNoZXMgfHwgcC5tYXRjaGVzU2VsZWN0b3IgfHwKICAgIHAubW96TWF0Y2hlc1NlbGVjdG9yIHx8IHAubXNNYXRjaGVzU2VsZWN0b3IgfHwKICAgIHAub01hdGNoZXNTZWxlY3RvciB8fCBwLndlYmtpdE1hdGNoZXNTZWxlY3RvcjsKCiAgLyoqCiAgICogQ3Jvc3MtcGxhdGZvcm0gYGVsZW1lbnQubWF0Y2hlc2Agc2hpbS4KICAgKgogICAqIEBmdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IKICAgKiBAbWVtYmVyb2YgUG9seW1lci5kb20KICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gY2hlY2sgc2VsZWN0b3IgYWdhaW5zdAogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBtYXRjaAogICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbm9kZSBtYXRjaGVkIHNlbGVjdG9yCiAgICovCiAgY29uc3QgbWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24obm9kZSwgc2VsZWN0b3IpIHsKICAgIHJldHVybiBub3JtYWxpemVkTWF0Y2hlc1NlbGVjdG9yLmNhbGwobm9kZSwgc2VsZWN0b3IpOwogIH07CgogIC8qKgogICAqIE5vZGUgQVBJIHdyYXBwZXIgY2xhc3MgcmV0dXJuZWQgZnJvbSBgUG9seW1lci5kb20uKHRhcmdldClgIHdoZW4KICAgKiBgdGFyZ2V0YCBpcyBhIGBOb2RlYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgY2xhc3MgRG9tQXBpIHsKCiAgICAvKioKICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIGZvciB3aGljaCB0byBjcmVhdGUgYSBQb2x5bWVyLmRvbSBoZWxwZXIgb2JqZWN0LgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7CiAgICAgIHRoaXMubm9kZSA9IG5vZGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJgIHRoYXQKICAgICAqIGxpc3RlbnMgZm9yIG5vZGUgY2hhbmdlcyBvbiB0aGlzIGVsZW1lbnQuCiAgICAgKgogICAgICogQHBhcmFtIHtmdW5jdGlvbighRWxlbWVudCwgeyB0YXJnZXQ6ICFFbGVtZW50LCBhZGRlZE5vZGVzOiAhQXJyYXk8IUVsZW1lbnQ+LCByZW1vdmVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4gfSk6dm9pZH0gY2FsbGJhY2sgQ2FsbGVkIHdoZW4gZGlyZWN0IG9yIGRpc3RyaWJ1dGVkIGNoaWxkcmVuCiAgICAgKiAgIG9mIHRoaXMgZWxlbWVudCBjaGFuZ2VzCiAgICAgKiBAcmV0dXJuIHshUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyfSBPYnNlcnZlciBpbnN0YW5jZQogICAgICovCiAgICBvYnNlcnZlTm9kZXMoY2FsbGJhY2spIHsKICAgICAgcmV0dXJuIG5ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcy5ub2RlLCBjYWxsYmFjayk7CiAgICB9CgogICAgLyoqCiAgICAgKiBEaXNjb25uZWN0cyBhbiBvYnNlcnZlciBwcmV2aW91c2x5IGNyZWF0ZWQgdmlhIGBvYnNlcnZlTm9kZXNgCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyfSBvYnNlcnZlckhhbmRsZSBPYnNlcnZlciBpbnN0YW5jZQogICAgICogICB0byBkaXNjb25uZWN0LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdW5vYnNlcnZlTm9kZXMob2JzZXJ2ZXJIYW5kbGUpIHsKICAgICAgb2JzZXJ2ZXJIYW5kbGUuZGlzY29ubmVjdCgpOwogICAgfQoKICAgIC8qKgogICAgICogUHJvdmlkZWQgYXMgYSBiYWNrd2FyZHMtY29tcGF0aWJsZSBBUEkgb25seS4gIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIG5vdGlmeU9ic2VydmVyKCkge30KCiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgbm9kZSBpcyBjb250YWluZWQgd2l0aCB0aGlzIGVsZW1lbnQncwogICAgICogbGlnaHQtRE9NIGNoaWxkcmVuIG9yIHNoYWRvdyByb290LCBpbmNsdWRpbmcgYW55IG5lc3RlZCBzaGFkb3cgcm9vdHMKICAgICAqIG9mIGNoaWxkcmVuIHRoZXJlaW4uCiAgICAgKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdG8gdGVzdAogICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgbm9kZWAgaXMgY29udGFpbmVkIHdpdGhpbgogICAgICogICB0aGlzIGVsZW1lbnQncyBsaWdodCBvciBzaGFkb3cgRE9NLgogICAgICovCiAgICBkZWVwQ29udGFpbnMobm9kZSkgewogICAgICBpZiAodGhpcy5ub2RlLmNvbnRhaW5zKG5vZGUpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgbGV0IG4gPSBub2RlOwogICAgICBsZXQgZG9jID0gbm9kZS5vd25lckRvY3VtZW50OwogICAgICAvLyB3YWxrIGZyb20gbm9kZSB0byBgdGhpc2Agb3IgYGRvY3VtZW50YAogICAgICB3aGlsZSAobiAmJiBuICE9PSBkb2MgJiYgbiAhPT0gdGhpcy5ub2RlKSB7CiAgICAgICAgLy8gdXNlIGxvZ2ljYWwgcGFyZW50bm9kZSwgb3IgbmF0aXZlIFNoYWRvd1Jvb3QgaG9zdAogICAgICAgIG4gPSBuLnBhcmVudE5vZGUgfHwgbi5ob3N0OwogICAgICB9CiAgICAgIHJldHVybiBuID09PSB0aGlzLm5vZGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhpcyBub2RlLiAgRXF1aXZhbGVudCB0byBgZ2V0Um9vZE5vZGUoKWAuCiAgICAgKgogICAgICogQHJldHVybiB7Tm9kZX0gVG9wIG1vc3QgZWxlbWVudCBpbiB0aGUgZG9tIHRyZWUgaW4gd2hpY2ggdGhlIG5vZGUKICAgICAqIGV4aXN0cy4gSWYgdGhlIG5vZGUgaXMgY29ubmVjdGVkIHRvIGEgZG9jdW1lbnQgdGhpcyBpcyBlaXRoZXIgYQogICAgICogc2hhZG93Um9vdCBvciB0aGUgZG9jdW1lbnQ7IG90aGVyd2lzZSwgaXQgbWF5IGJlIHRoZSBub2RlCiAgICAgKiBpdHNlbGYgb3IgYSBub2RlIG9yIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgaXQuCiAgICAgKi8KICAgIGdldE93bmVyUm9vdCgpIHsKICAgICAgcmV0dXJuIHRoaXMubm9kZS5nZXRSb290Tm9kZSgpOwogICAgfQoKICAgIC8qKgogICAgICogRm9yIHNsb3QgZWxlbWVudHMsIHJldHVybnMgdGhlIG5vZGVzIGFzc2lnbmVkIHRvIHRoZSBzbG90OyBvdGhlcndpc2UKICAgICAqIGFuIGVtcHR5IGFycmF5LiBJdCBpcyBlcXVpdmFsZW50IHRvIGA8c2xvdD4uYWRkaWduZWROb2Rlcyh7ZmxhdHRlbjp0cnVlfSlgLgogICAgICoKICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IEFycmF5IG9mIGFzc2lnbmVkIG5vZGVzCiAgICAgKi8KICAgIGdldERpc3RyaWJ1dGVkTm9kZXMoKSB7CiAgICAgIHJldHVybiAodGhpcy5ub2RlLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKSA/CiAgICAgICAgdGhpcy5ub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KSA6CiAgICAgICAgW107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBzbG90cyB0aGlzIGVsZW1lbnQgd2FzIGRpc3RyaWJ1dGVkIHRvLgogICAgICoKICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFNsb3RFbGVtZW50Pn0gRGVzY3JpcHRpb24KICAgICAqLwogICAgZ2V0RGVzdGluYXRpb25JbnNlcnRpb25Qb2ludHMoKSB7CiAgICAgIGxldCBpcCQgPSBbXTsKICAgICAgbGV0IG4gPSB0aGlzLm5vZGUuYXNzaWduZWRTbG90OwogICAgICB3aGlsZSAobikgewogICAgICAgIGlwJC5wdXNoKG4pOwogICAgICAgIG4gPSBuLmFzc2lnbmVkU2xvdDsKICAgICAgfQogICAgICByZXR1cm4gaXAkOwogICAgfQoKICAgIC8qKgogICAgICogQ2FsbHMgYGltcG9ydE5vZGVgIG9uIHRoZSBgb3duZXJEb2N1bWVudGAgZm9yIHRoaXMgbm9kZS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gaW1wb3J0CiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRlZXAgVHJ1ZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xvbmVkIGRlZXBseSBkdXJpbmcKICAgICAqICAgaW1wb3J0CiAgICAgKiBAcmV0dXJuIHtOb2RlfSBDbG9uZSBvZiBnaXZlbiBub2RlIGltcG9ydGVkIHRvIHRoaXMgb3duZXIgZG9jdW1lbnQKICAgICAqLwogICAgaW1wb3J0Tm9kZShub2RlLCBkZWVwKSB7CiAgICAgIGxldCBkb2MgPSB0aGlzLm5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCA/IHRoaXMubm9kZSA6CiAgICAgICAgdGhpcy5ub2RlLm93bmVyRG9jdW1lbnQ7CiAgICAgIHJldHVybiBkb2MuaW1wb3J0Tm9kZShub2RlLCBkZWVwKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IFJldHVybnMgYSBmbGF0dGVuZWQgbGlzdCBvZiBhbGwgY2hpbGQgbm9kZXMgYW5kCiAgICAgKiBub2RlcyBhc3NpZ25lZCB0byBjaGlsZCBzbG90cy4KICAgICAqLwogICAgZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpIHsKICAgICAgcmV0dXJuIFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlci5nZXRGbGF0dGVuZWROb2Rlcyh0aGlzLm5vZGUpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgZmxhdHRlbmVkIGNoaWxkIGVsZW1lbnRzIGZvciB0aGlzIGVsZW1lbnQgYmFzZWQKICAgICAqIG9uIHRoZSBnaXZlbiBzZWxlY3Rvci4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gZmlsdGVyIG5vZGVzIGFnYWluc3QKICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTEVsZW1lbnQ+fSBMaXN0IG9mIGZsYXR0ZW5lZCBjaGlsZCBlbGVtZW50cwogICAgICovCiAgICBxdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpIHsKICAgICAgbGV0IGMkID0gdGhpcy5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCk7CiAgICAgIGxldCBsaXN0ID0gW107CiAgICAgIGZvciAobGV0IGk9MCwgbD1jJC5sZW5ndGgsIGM7IChpPGwpICYmIChjPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgaWYgKChjLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYKICAgICAgICAgICAgbWF0Y2hlc1NlbGVjdG9yKGMsIHNlbGVjdG9yKSkgewogICAgICAgICAgbGlzdC5wdXNoKGMpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbGlzdDsKICAgIH0KCiAgICAvKioKICAgICAqIEZvciBzaGFkb3cgcm9vdHMsIHJldHVybnMgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnQgd2l0aGluIHRoaXMKICAgICAqIHNoYWRvdyByb290LgogICAgICoKICAgICAqIEByZXR1cm4ge05vZGV8dW5kZWZpbmVkfSBDdXJyZW50bHkgZm9jdXNlZCBlbGVtZW50CiAgICAgKi8KICAgIGdldCBhY3RpdmVFbGVtZW50KCkgewogICAgICBsZXQgbm9kZSA9IHRoaXMubm9kZTsKICAgICAgcmV0dXJuIG5vZGUuX2FjdGl2ZUVsZW1lbnQgIT09IHVuZGVmaW5lZCA/IG5vZGUuX2FjdGl2ZUVsZW1lbnQgOiBub2RlLmFjdGl2ZUVsZW1lbnQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmb3J3YXJkTWV0aG9kcyhwcm90bywgbWV0aG9kcykgewogICAgZm9yIChsZXQgaT0wOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewogICAgICBsZXQgbWV0aG9kID0gbWV0aG9kc1tpXTsKICAgICAgLyogZXNsaW50LWRpc2FibGUgdmFsaWQtanNkb2MgKi8KICAgICAgcHJvdG9bbWV0aG9kXSA9IC8qKiBAdGhpcyB7RG9tQXBpfSAqLyBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub2RlW21ldGhvZF0uYXBwbHkodGhpcy5ub2RlLCBhcmd1bWVudHMpOwogICAgICB9OwogICAgICAvKiBlc2xpbnQtZW5hYmxlICovCiAgICB9CiAgfQoKICBmdW5jdGlvbiBmb3J3YXJkUmVhZE9ubHlQcm9wZXJ0aWVzKHByb3RvLCBwcm9wZXJ0aWVzKSB7CiAgICBmb3IgKGxldCBpPTA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBuYW1lID0gcHJvcGVydGllc1tpXTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBuYW1lLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGNvbnN0IGRvbUFwaSA9IC8qKiBAdHlwZSB7RG9tQXBpfSAqLyh0aGlzKTsKICAgICAgICAgIHJldHVybiBkb21BcGkubm9kZVtuYW1lXTsKICAgICAgICB9LAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRQcm9wZXJ0aWVzKHByb3RvLCBwcm9wZXJ0aWVzKSB7CiAgICBmb3IgKGxldCBpPTA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBuYW1lID0gcHJvcGVydGllc1tpXTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBuYW1lLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGNvbnN0IGRvbUFwaSA9IC8qKiBAdHlwZSB7RG9tQXBpfSAqLyh0aGlzKTsKICAgICAgICAgIHJldHVybiBkb21BcGkubm9kZVtuYW1lXTsKICAgICAgICB9LAogICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIC8qKiBAdHlwZSB7RG9tQXBpfSAqLyAodGhpcykubm9kZVtuYW1lXSA9IHZhbHVlOwogICAgICAgIH0sCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogIH0KCiAgZm9yd2FyZE1ldGhvZHMoRG9tQXBpLnByb3RvdHlwZSwgWwogICAgJ2Nsb25lTm9kZScsICdhcHBlbmRDaGlsZCcsICdpbnNlcnRCZWZvcmUnLCAncmVtb3ZlQ2hpbGQnLAogICAgJ3JlcGxhY2VDaGlsZCcsICdzZXRBdHRyaWJ1dGUnLCAncmVtb3ZlQXR0cmlidXRlJywKICAgICdxdWVyeVNlbGVjdG9yJywgJ3F1ZXJ5U2VsZWN0b3JBbGwnCiAgXSk7CgogIGZvcndhcmRSZWFkT25seVByb3BlcnRpZXMoRG9tQXBpLnByb3RvdHlwZSwgWwogICAgJ3BhcmVudE5vZGUnLCAnZmlyc3RDaGlsZCcsICdsYXN0Q2hpbGQnLAogICAgJ25leHRTaWJsaW5nJywgJ3ByZXZpb3VzU2libGluZycsICdmaXJzdEVsZW1lbnRDaGlsZCcsCiAgICAnbGFzdEVsZW1lbnRDaGlsZCcsICduZXh0RWxlbWVudFNpYmxpbmcnLCAncHJldmlvdXNFbGVtZW50U2libGluZycsCiAgICAnY2hpbGROb2RlcycsICdjaGlsZHJlbicsICdjbGFzc0xpc3QnCiAgXSk7CgogIGZvcndhcmRQcm9wZXJ0aWVzKERvbUFwaS5wcm90b3R5cGUsIFsKICAgICd0ZXh0Q29udGVudCcsICdpbm5lckhUTUwnCiAgXSk7CgoKICAvKioKICAgKiBFdmVudCBBUEkgd3JhcHBlciBjbGFzcyByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmRvbS4odGFyZ2V0KWAgd2hlbgogICAqIGB0YXJnZXRgIGlzIGFuIGBFdmVudGAuCiAgICovCiAgY2xhc3MgRXZlbnRBcGkgewogICAgY29uc3RydWN0b3IoZXZlbnQpIHsKICAgICAgdGhpcy5ldmVudCA9IGV2ZW50OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZmlyc3Qgbm9kZSBvbiB0aGUgYGNvbXBvc2VkUGF0aGAgb2YgdGhpcyBldmVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHshRXZlbnRUYXJnZXR9IFRoZSBub2RlIHRoaXMgZXZlbnQgd2FzIGRpc3BhdGNoZWQgdG8KICAgICAqLwogICAgZ2V0IHJvb3RUYXJnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50LmNvbXBvc2VkUGF0aCgpWzBdOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbG9jYWwgKHJlLXRhcmdldGVkKSB0YXJnZXQgZm9yIHRoaXMgZXZlbnQuCiAgICAgKgogICAgICogQHJldHVybiB7IUV2ZW50VGFyZ2V0fSBUaGUgbG9jYWwgKHJlLXRhcmdldGVkKSB0YXJnZXQgZm9yIHRoaXMgZXZlbnQuCiAgICAgKi8KICAgIGdldCBsb2NhbFRhcmdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnQudGFyZ2V0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgYGNvbXBvc2VkUGF0aGAgZm9yIHRoaXMgZXZlbnQuCiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUV2ZW50VGFyZ2V0Pn0gVGhlIG5vZGVzIHRoaXMgZXZlbnQgcHJvcGFnYXRlZCB0aHJvdWdoCiAgICAgKi8KICAgIGdldCBwYXRoKCkgewogICAgICByZXR1cm4gdGhpcy5ldmVudC5jb21wb3NlZFBhdGgoKTsKICAgIH0KICB9CgogIFBvbHltZXIuRG9tQXBpID0gRG9tQXBpOwoKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBkZWVwCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLmNsb25lTm9kZTsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0geyFOb2RlfSBub2RlCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLmFwcGVuZENoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG5ld0NoaWxkCiAgICogQHBhcmFtIHtOb2RlfSByZWZDaGlsZAogICAqIEByZXR1cm4geyFOb2RlfQogICAqLwogIFBvbHltZXIuRG9tQXBpLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU7CiAgLyoqCiAgICogQGZ1bmN0aW9uCiAgICogQHBhcmFtIHshTm9kZX0gbm9kZQogICAqIEByZXR1cm4geyFOb2RlfQogICAqLwogIFBvbHltZXIuRG9tQXBpLnByb3RvdHlwZS5yZW1vdmVDaGlsZDsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0geyFOb2RlfSBvbGRDaGlsZAogICAqIEBwYXJhbSB7IU5vZGV9IG5ld0NoaWxkCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnJlcGxhY2VDaGlsZDsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQogICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnNldEF0dHJpYnV0ZTsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZTsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IKICAgKiBAcmV0dXJuIHs/RWxlbWVudH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucXVlcnlTZWxlY3RvcjsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IKICAgKiBAcmV0dXJuIHshTm9kZUxpc3Q8IUVsZW1lbnQ+fQogICAqLwogIFBvbHltZXIuRG9tQXBpLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsOwoKICAvKioKICAgKiBMZWdhY3kgRE9NIGFuZCBFdmVudCBtYW5pcHVsYXRpb24gQVBJIHdyYXBwZXIgZmFjdG9yeSB1c2VkIHRvIGFic3RyYWN0CiAgICogZGlmZmVyZW5jZXMgYmV0d2VlbiBuYXRpdmUgU2hhZG93IERPTSBhbmQgIlNoYWR5IERPTSIgd2hlbiBwb2x5ZmlsbGluZyBvbgogICAqIG9sZGVyIGJyb3dzZXJzLgogICAqCiAgICogTm90ZSB0aGF0IGluIFBvbHltZXIgMi54IHVzZSBvZiBgUG9seW1lci5kb21gIGlzIG5vIGxvbmdlciByZXF1aXJlZCBhbmQKICAgKiBpbiB0aGUgbWFqb3JpdHkgb2YgY2FzZXMgc2ltcGx5IGZhY2FkZXMgZGlyZWN0bHkgdG8gdGhlIHN0YW5kYXJkIG5hdGl2ZQogICAqIEFQSS4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAc3VtbWFyeSBMZWdhY3kgRE9NIGFuZCBFdmVudCBtYW5pcHVsYXRpb24gQVBJIHdyYXBwZXIgZmFjdG9yeSB1c2VkIHRvCiAgICogYWJzdHJhY3QgZGlmZmVyZW5jZXMgYmV0d2VlbiBuYXRpdmUgU2hhZG93IERPTSBhbmQgIlNoYWR5IERPTS4iCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcGFyYW0geyhOb2RlfEV2ZW50KT19IG9iaiBOb2RlIG9yIGV2ZW50IHRvIG9wZXJhdGUgb24KICAgKiBAcmV0dXJuIHshRG9tQXBpfCFFdmVudEFwaX0gV3JhcHBlciBwcm92aWRpbmcgZWl0aGVyIG5vZGUgQVBJIG9yIGV2ZW50IEFQSQogICAqLwogIFBvbHltZXIuZG9tID0gZnVuY3Rpb24ob2JqKSB7CiAgICBvYmogPSBvYmogfHwgZG9jdW1lbnQ7CiAgICBpZiAoIW9iai5fX2RvbUFwaSkgewogICAgICBsZXQgaGVscGVyOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgRXZlbnQpIHsKICAgICAgICBoZWxwZXIgPSBuZXcgRXZlbnRBcGkob2JqKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBoZWxwZXIgPSBuZXcgRG9tQXBpKG9iaik7CiAgICAgIH0KICAgICAgb2JqLl9fZG9tQXBpID0gaGVscGVyOwogICAgfQogICAgcmV0dXJuIG9iai5fX2RvbUFwaTsKICB9OwoKICBQb2x5bWVyLmRvbS5tYXRjaGVzU2VsZWN0b3IgPSBtYXRjaGVzU2VsZWN0b3I7CgogIC8qKgogICAqIEZvcmNlcyBzZXZlcmFsIGNsYXNzZXMgb2YgYXN5bmNocm9ub3VzbHkgcXVldWVkIHRhc2tzIHRvIGZsdXNoOgogICAqIC0gRGVib3VuY2VycyBhZGRlZCB2aWEgYFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcmAKICAgKiAtIFNoYWR5RE9NIGRpc3RyaWJ1dGlvbgogICAqCiAgICogVGhpcyBtZXRob2QgZmFjYWRlcyB0byBgUG9seW1lci5mbHVzaGAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lci5kb20KICAgKi8KICBQb2x5bWVyLmRvbS5mbHVzaCA9IFBvbHltZXIuZmx1c2g7CgogIC8qKgogICAqIEFkZHMgYSBgUG9seW1lci5EZWJvdW5jZXJgIHRvIGEgbGlzdCBvZiBnbG9iYWxseSBmbHVzaGFibGUgdGFza3MuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBmYWNhZGVzIHRvIGBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXJgLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIuZG9tCiAgICogQHBhcmFtIHshUG9seW1lci5EZWJvdW5jZXJ9IGRlYm91bmNlciBEZWJvdW5jZXIgdG8gZW5xdWV1ZQogICAqLwogIFBvbHltZXIuZG9tLmFkZERlYm91bmNlciA9IFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcjsKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IHN0eWxlSW50ZXJmYWNlID0gd2luZG93LlNoYWR5Q1NTOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgUG9seW1lcidzICJsZWdhY3kiIEFQSSBpbnRlbmRlZCB0byBiZQogICAqIGJhY2t3YXJkLWNvbXBhdGlibGUgdG8gdGhlIGdyZWF0ZXN0IGV4dGVudCBwb3NzaWJsZSB3aXRoIHRoZSBBUEkKICAgKiBmb3VuZCBvbiB0aGUgUG9seW1lciAxLnggYFBvbHltZXIuQmFzZWAgcHJvdG90eXBlIGFwcGxpZWQgdG8gYWxsIGVsZW1lbnRzCiAgICogZGVmaW5lZCB1c2luZyB0aGUgYFBvbHltZXIoey4uLn0pYCBmdW5jdGlvbi4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycwogICAqIEBwcm9wZXJ0eSBpc0F0dGFjaGVkIHtib29sZWFufSBTZXQgdG8gYHRydWVgIGluIHRoaXMgZWxlbWVudCdzCiAgICogICBgY29ubmVjdGVkQ2FsbGJhY2tgIGFuZCBgZmFsc2VgIGluIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBQb2x5bWVyJ3MgImxlZ2FjeSIgQVBJCiAgICovCiAgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW4gPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oKGJhc2UpID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9HZXN0dXJlRXZlbnRMaXN0ZW5lcnN9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9EaXJNaXhpbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGxlZ2FjeUVsZW1lbnRCYXNlID0gUG9seW1lci5EaXJNaXhpbihQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycyhQb2x5bWVyLkVsZW1lbnRNaXhpbihiYXNlKSkpOwoKICAgIC8qKgogICAgICogTWFwIG9mIHNpbXBsZSBuYW1lcyB0byB0b3VjaCBhY3Rpb24gbmFtZXMKICAgICAqIEBkaWN0CiAgICAgKi8KICAgIGNvbnN0IERJUkVDVElPTl9NQVAgPSB7CiAgICAgICd4JzogJ3Bhbi14JywKICAgICAgJ3knOiAncGFuLXknLAogICAgICAnbm9uZSc6ICdub25lJywKICAgICAgJ2FsbCc6ICdhdXRvJwogICAgfTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGV4dGVuZHMge2xlZ2FjeUVsZW1lbnRCYXNlfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfTGVnYWN5RWxlbWVudE1peGlufQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBMZWdhY3lFbGVtZW50IGV4dGVuZHMgbGVnYWN5RWxlbWVudEJhc2UgewoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgdGhpcy5pc0F0dGFjaGVkOwogICAgICAgIC8qKiBAdHlwZSB7V2Vha01hcDwhRWxlbWVudCwgIU9iamVjdDxzdHJpbmcsICFGdW5jdGlvbj4+fSAqLwogICAgICAgIHRoaXMuX19ib3VuZExpc3RlbmVyczsKICAgICAgICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEZ1bmN0aW9uPn0gKi8KICAgICAgICB0aGlzLl9kZWJvdW5jZXJzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yd2FyZHMgYGltcG9ydE1ldGFgIGZyb20gdGhlIHByb3RvdHlwZSAoaS5lLiBmcm9tIHRoZSBpbmZvIG9iamVjdAogICAgICAgKiBwYXNzZWQgdG8gYFBvbHltZXIoey4uLn0pYCkgdG8gdGhlIHN0YXRpYyBBUEkuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IFRoZSBgaW1wb3J0Lm1ldGFgIG9iamVjdCBzZXQgb24gdGhlIHByb3RvdHlwZQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBgdGhpc2AgaXMgYWx3YXlzIGluIHRoZSBpbnN0YW5jZSBpbgogICAgICAgKiAgY2xvc3VyZSBmb3Igc29tZSByZWFzb24gZXZlbiBpbiBhIHN0YXRpYyBtZXRob2QsIHJhdGhlciB0aGFuIHRoZSBjbGFzcwogICAgICAgKi8KICAgICAgc3RhdGljIGdldCBpbXBvcnRNZXRhKCkgewogICAgICAgIHJldHVybiB0aGlzLnByb3RvdHlwZS5pbXBvcnRNZXRhOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTGVnYWN5IGNhbGxiYWNrIGNhbGxlZCBkdXJpbmcgdGhlIGBjb25zdHJ1Y3RvcmAsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY3JlYXRlZCgpIHt9CgogICAgICAvKioKICAgICAgICogUHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYGNvbm5lY3RlZENhbGxiYWNrYAogICAgICAgKiB3aGljaCBhZGRzIFBvbHltZXIgbGVnYWN5IEFQSSdzIGBhdHRhY2hlZGAgbWV0aG9kLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgdGhpcy5pc0F0dGFjaGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmF0dGFjaGVkKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyBgY29ubmVjdGVkQ2FsbGJhY2tgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGF0dGFjaGVkKCkge30KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgZGlzY29ubmVjdGVkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgUG9seW1lciBsZWdhY3kgQVBJJ3MgYGRldGFjaGVkYCBtZXRob2QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB0aGlzLmlzQXR0YWNoZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmRldGFjaGVkKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyBgZGlzY29ubmVjdGVkQ2FsbGJhY2tgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGRldGFjaGVkKCkge30KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhbiBvdmVycmlkZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYAogICAgICAgKiB3aGljaCBhZGRzIHRoZSBQb2x5bWVyIGxlZ2FjeSBBUEkncyBgYXR0cmlidXRlQ2hhbmdlZGAgbWV0aG9kLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIGF0dHJpYnV0ZS4KICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBDdXJyZW50IHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBuYW1lc3BhY2UgQXR0cmlidXRlIG5hbWVzcGFjZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgICAgaWYgKG9sZCAhPT0gdmFsdWUpIHsKICAgICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpOwogICAgICAgICAgdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkKG5hbWUsIG9sZCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBhdHRyaWJ1dGVDaGFuZ2VkQ2hhbGxiYWNrYCwgZm9yIG92ZXJyaWRpbmcKICAgICAgICogYnkgdGhlIHVzZXIuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGQsIHZhbHVlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgaW1wbGVtZW50YXRpb24gdG8KICAgICAgICogYWRkIHN1cHBvcnQgZm9yIGNsYXNzIGluaXRpYWxpemF0aW9uIHZpYSB0aGUgYF9yZWdpc3RlcmVkYCBjYWxsYmFjay4KICAgICAgICogVGhpcyBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgZWxlbWVudCBpcyBjcmVhdGVkLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7CiAgICAgICAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpOwogICAgICAgIGlmICghcHJvdG8uaGFzT3duUHJvcGVydHkoJ19faGFzUmVnaXN0ZXJGaW5pc2hlZCcpKSB7CiAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkKCk7CiAgICAgICAgICAvLyBiYWNrc3RvcCBpbiBjYXNlIHRoZSBgX3JlZ2lzdGVyZWRgIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHNldCB0aGlzCiAgICAgICAgICBwcm90by5fX2hhc1JlZ2lzdGVyRmluaXNoZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgICB0aGlzLnJvb3QgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqLyh0aGlzKTsKICAgICAgICB0aGlzLmNyZWF0ZWQoKTsKICAgICAgICAvLyBFbnN1cmUgbGlzdGVuZXJzIGFyZSBhcHBsaWVkIGltbWVkaWF0ZWx5IHNvIHRoYXQgdGhleSBhcmUKICAgICAgICAvLyBhZGRlZCBiZWZvcmUgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLiBUaGlzIGFsbG93cyBhbiBlbGVtZW50IHRvCiAgICAgICAgLy8gZGVjb3JhdGUgaXRzZWxmIHZpYSBhbiBldmVudCBwcmlvciB0byBhbnkgZGVjbGFyYXRpdmUgbGlzdGVuZXJzCiAgICAgICAgLy8gc2VlaW5nIHRoZSBldmVudC4gTm90ZSwgdGhpcyBlbnN1cmVzIGNvbXBhdGliaWxpdHkgd2l0aCAxLnggb3JkZXJpbmcuCiAgICAgICAgdGhpcy5fYXBwbHlMaXN0ZW5lcnMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gZWxlbWVudCBpcyBpbml0aWFsaXppbmcuCiAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIGNsYXNzIHJlZ2lzdHJhdGlvbiB0aW1lCiAgICAgICAqIHdvcmsuIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZW5zdXJlIHRoZSB3b3JrIGlzIHBlcmZvcm1lZAogICAgICAgKiBvbmx5IG9uY2UgZm9yIHRoZSBjbGFzcy4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlZ2lzdGVyZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIGltcGxlbWVudGF0aW9uIHRvCiAgICAgICAqIGFkZCBzdXBwb3J0IGZvciBpbnN0YWxsaW5nIGBob3N0QXR0cmlidXRlc2AgYW5kIGBsaXN0ZW5lcnNgLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIHRoaXMuX2Vuc3VyZUF0dHJpYnV0ZXMoKTsKICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5zdXJlcyBhbiBlbGVtZW50IGhhcyByZXF1aXJlZCBhdHRyaWJ1dGVzLiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudAogICAgICAgKiBpcyBiZWluZyByZWFkaWVkIHZpYSBgcmVhZHlgLiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdG8gc2V0IHRoZQogICAgICAgKiBlbGVtZW50J3MgcmVxdWlyZWQgYXR0cmlidXRlcy4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBzdXJlCiAgICAgICAqIHRvIGNoZWNrIGFuZCBub3Qgb3ZlcnJpZGUgZXhpc3RpbmcgYXR0cmlidXRlcyBhZGRlZCBieQogICAgICAgKiB0aGUgdXNlciBvZiB0aGUgZWxlbWVudC4gVHlwaWNhbGx5LCBzZXR0aW5nIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxlZnQKICAgICAgICogdG8gdGhlIGVsZW1lbnQgdXNlciBhbmQgbm90IGRvbmUgaGVyZTsgcmVhc29uYWJsZSBleGNlcHRpb25zIGluY2x1ZGUKICAgICAgICogc2V0dGluZyBhcmlhIHJvbGVzIGFuZCBmb2N1c2FiaWxpdHkuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9lbnN1cmVBdHRyaWJ1dGVzKCkge30KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGVsZW1lbnQgZXZlbnQgbGlzdGVuZXJzLiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudAogICAgICAgKiBpcyBiZWluZyByZWFkaWVkIHZpYSBgcmVhZHlgLiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdG8KICAgICAgICogYWRkIGFueSByZXF1aXJlZCBlbGVtZW50IGV2ZW50IGxpc3RlbmVycy4KICAgICAgICogSW4gcGVyZm9ybWFuY2UgY3JpdGljYWwgZWxlbWVudHMsIHRoZSB3b3JrIGRvbmUgaGVyZSBzaG91bGQgYmUga2VwdAogICAgICAgKiB0byBhIG1pbmltdW0gc2luY2UgaXQgaXMgZG9uZSBiZWZvcmUgdGhlIGVsZW1lbnQgaXMgcmVuZGVyZWQuIEluCiAgICAgICAqIHRoZXNlIGVsZW1lbnRzLCBjb25zaWRlciBhZGRpbmcgbGlzdGVuZXJzIGFzeW5jaHJvbm91c2x5IHNvIGFzIG5vdCB0bwogICAgICAgKiBibG9jayByZW5kZXIuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hcHBseUxpc3RlbmVycygpIHt9CgogICAgICAvKioKICAgICAgICogQ29udmVydHMgYSB0eXBlZCBKYXZhU2NyaXB0IHZhbHVlIHRvIGEgc3RyaW5nLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGJhY2t3YXJkLWNvbXBhdGlibGUgbGVnYWN5IEFQSQogICAgICAgKiBvbmx5LiAgSXQgaXMgbm90IGRpcmVjdGx5IGNhbGxlZCBieSBhbnkgUG9seW1lciBmZWF0dXJlcy4gVG8gY3VzdG9taXplCiAgICAgICAqIGhvdyBwcm9wZXJ0aWVzIGFyZSBzZXJpYWxpemVkIHRvIGF0dHJpYnV0ZXMgZm9yIGF0dHJpYnV0ZSBiaW5kaW5ncyBhbmQKICAgICAgICogYHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZWAgcHJvcGVydGllcyBhcyB3ZWxsIGFzIHRoaXMgbWV0aG9kLCBvdmVycmlkZQogICAgICAgKiB0aGUgYF9zZXJpYWxpemVWYWx1ZWAgbWV0aG9kIHByb3ZpZGVkIGJ5IGBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBkZXNlcmlhbGl6ZQogICAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IFNlcmlhbGl6ZWQgdmFsdWUKICAgICAgICovCiAgICAgIHNlcmlhbGl6ZSh2YWx1ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVWYWx1ZSh2YWx1ZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLiAgVG8gY3VzdG9taXplCiAgICAgICAqIGhvdyBhdHRyaWJ1dGVzIGFyZSBkZXNlcmlhbGl6ZWQgdG8gcHJvcGVydGllcyBmb3IgaW4KICAgICAgICogYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AsIG92ZXJyaWRlIGBfZGVzZXJpYWxpemVWYWx1ZWAgbWV0aG9kCiAgICAgICAqIHByb3ZpZGVkIGJ5IGBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFN0cmluZyB0byBkZXNlcmlhbGl6ZQogICAgICAgKiBAcGFyYW0geyp9IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvCiAgICAgICAqIEByZXR1cm4geyp9IFJldHVybnMgdGhlIGRlc2VyaWFsaXplZCB2YWx1ZSBpbiB0aGUgYHR5cGVgIGdpdmVuLgogICAgICAgKi8KICAgICAgZGVzZXJpYWxpemUodmFsdWUsIHR5cGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGVzZXJpYWxpemVWYWx1ZSh2YWx1ZSwgdHlwZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXJpYWxpemVzIGEgcHJvcGVydHkgdG8gaXRzIGFzc29jaWF0ZWQgYXR0cmlidXRlLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGJhY2t3YXJkLWNvbXBhdGlibGUgbGVnYWN5IEFQSQogICAgICAgKiBvbmx5LiAgSXQgaXMgbm90IGRpcmVjdGx5IGNhbGxlZCBieSBhbnkgUG9seW1lciBmZWF0dXJlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBhdHRyaWJ1dGUgQXR0cmlidXRlIG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICogQHBhcmFtIHsqPX0gdmFsdWUgUHJvcGVydHkgdmFsdWUgdG8gcmVmbGVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHJlZmxlY3RQcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICAgICAgdGhpcy5fcHJvcGVydHlUb0F0dHJpYnV0ZShwcm9wZXJ0eSwgYXR0cmlidXRlLCB2YWx1ZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXRzIGEgdHlwZWQgdmFsdWUgdG8gYW4gSFRNTCBhdHRyaWJ1dGUgb24gYSBub2RlLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGJhY2t3YXJkLWNvbXBhdGlibGUgbGVnYWN5IEFQSQogICAgICAgKiBvbmx5LiAgSXQgaXMgbm90IGRpcmVjdGx5IGNhbGxlZCBieSBhbnkgUG9seW1lciBmZWF0dXJlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgQXR0cmlidXRlIG5hbWUgdG8gc2VyaWFsaXplIHRvLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgRWxlbWVudCB0byBzZXQgYXR0cmlidXRlIHRvLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2VyaWFsaXplVmFsdWVUb0F0dHJpYnV0ZSh2YWx1ZSwgYXR0cmlidXRlLCBub2RlKSB7CiAgICAgICAgdGhpcy5fdmFsdWVUb05vZGVBdHRyaWJ1dGUoLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKSwgdmFsdWUsIGF0dHJpYnV0ZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb3BpZXMgb3duIHByb3BlcnRpZXMgKGluY2x1ZGluZyBhY2Nlc3NvciBkZXNjcmlwdG9ycykgZnJvbSBhIHNvdXJjZQogICAgICAgKiBvYmplY3QgdG8gYSB0YXJnZXQgb2JqZWN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRhcmdldCBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gYXBpIFNvdXJjZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gcHJvdG90eXBlIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgYXMgZmlyc3QgYXJndW1lbnQuCiAgICAgICAqLwogICAgICBleHRlbmQocHJvdG90eXBlLCBhcGkpIHsKICAgICAgICBpZiAoIShwcm90b3R5cGUgJiYgYXBpKSkgewogICAgICAgICAgcmV0dXJuIHByb3RvdHlwZSB8fCBhcGk7CiAgICAgICAgfQogICAgICAgIGxldCBuJCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFwaSk7CiAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxuJC5sZW5ndGgpICYmIChuPW4kW2ldKTsgaSsrKSB7CiAgICAgICAgICBsZXQgcGQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFwaSwgbik7CiAgICAgICAgICBpZiAocGQpIHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgbiwgcGQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvdG90eXBlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29waWVzIHByb3BzIGZyb20gYSBzb3VyY2Ugb2JqZWN0IHRvIGEgdGFyZ2V0IG9iamVjdC4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhpcyBtZXRob2QgdXNlcyBhIHNpbXBsZSBgZm9yLi4uaW5gIHN0cmF0ZWd5IGZvciBlbnVtZXJhdGluZwogICAgICAgKiBwcm9wZXJ0aWVzLiAgVG8gZW5zdXJlIG9ubHkgYG93blByb3BlcnRpZXNgIGFyZSBjb3BpZWQgZnJvbSBzb3VyY2UKICAgICAgICogdG8gdGFyZ2V0IGFuZCB0aGF0IGFjY2Vzc29yIGltcGxlbWVudGF0aW9ucyBhcmUgY29waWVkLCB1c2UgYGV4dGVuZGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gdGFyZ2V0IFRhcmdldCBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLgogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IHNvdXJjZSBTb3VyY2Ugb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLgogICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBUYXJnZXQgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudC4KICAgICAgICovCiAgICAgIG1peGluKHRhcmdldCwgc291cmNlKSB7CiAgICAgICAgZm9yIChsZXQgaSBpbiBzb3VyY2UpIHsKICAgICAgICAgIHRhcmdldFtpXSA9IHNvdXJjZVtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgdGhlIHByb3RvdHlwZSBvZiBhbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3Qgb24gd2hpY2ggdG8gc2V0IHRoZSBwcm90b3R5cGUuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIHByb3RvdHlwZSB0aGF0IHdpbGwgYmUgc2V0IG9uIHRoZSBnaXZlbgogICAgICAgKiBgb2JqZWN0YC4KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIHRoZSBnaXZlbiBgb2JqZWN0YCB3aXRoIGl0cyBwcm90b3R5cGUgc2V0CiAgICAgICAqIHRvIHRoZSBnaXZlbiBgcHJvdG90eXBlYCBvYmplY3QuCiAgICAgICAqLwogICAgICBjaGFpbk9iamVjdChvYmplY3QsIHByb3RvdHlwZSkgewogICAgICAgIGlmIChvYmplY3QgJiYgcHJvdG90eXBlICYmIG9iamVjdCAhPT0gcHJvdG90eXBlKSB7CiAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgICB9CgogICAgICAvKiAqKioqIEJlZ2luIFRlbXBsYXRlICoqKiogKi8KCiAgICAgIC8qKgogICAgICAgKiBDYWxscyBgaW1wb3J0Tm9kZWAgb24gdGhlIGBjb250ZW50YCBvZiB0aGUgYHRlbXBsYXRlYCBzcGVjaWZpZWQgYW5kCiAgICAgICAqIHJldHVybnMgYSBkb2N1bWVudCBmcmFnbWVudCBjb250YWluaW5nIHRoZSBpbXBvcnRlZCBjb250ZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIEhUTUwgdGVtcGxhdGUgZWxlbWVudCB0byBpbnN0YW5jZS4KICAgICAgICogQHJldHVybiB7IURvY3VtZW50RnJhZ21lbnR9IERvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkCiAgICAgICAqICAgdGVtcGxhdGUgY29udGVudC4KICAgICAgKi8KICAgICAgaW5zdGFuY2VUZW1wbGF0ZSh0ZW1wbGF0ZSkgewogICAgICAgIGxldCBjb250ZW50ID0gdGhpcy5jb25zdHJ1Y3Rvci5fY29udGVudEZvclRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICBsZXQgZG9tID0gLyoqIEB0eXBlIHshRG9jdW1lbnRGcmFnbWVudH0gKi8KICAgICAgICAgIChkb2N1bWVudC5pbXBvcnROb2RlKGNvbnRlbnQsIHRydWUpKTsKICAgICAgICByZXR1cm4gZG9tOwogICAgICB9CgogICAgICAvKiAqKioqIEJlZ2luIEV2ZW50cyAqKioqICovCgoKCiAgICAgIC8qKgogICAgICAgKiBEaXNwYXRjaGVzIGEgY3VzdG9tIGV2ZW50IHdpdGggYW4gb3B0aW9uYWwgZGV0YWlsIHZhbHVlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBOYW1lIG9mIGV2ZW50IHR5cGUuCiAgICAgICAqIEBwYXJhbSB7Kj19IGRldGFpbCBEZXRhaWwgdmFsdWUgY29udGFpbmluZyBldmVudC1zcGVjaWZpYwogICAgICAgKiAgIHBheWxvYWQuCiAgICAgICAqIEBwYXJhbSB7eyBidWJibGVzOiAoYm9vbGVhbnx1bmRlZmluZWQpLCBjYW5jZWxhYmxlOiAoYm9vbGVhbnx1bmRlZmluZWQpLCBjb21wb3NlZDogKGJvb2xlYW58dW5kZWZpbmVkKSB9PX0KICAgICAgICogIG9wdGlvbnMgT2JqZWN0IHNwZWNpZnlpbmcgb3B0aW9ucy4gIFRoZXNlIG1heSBpbmNsdWRlOgogICAgICAgKiAgYGJ1YmJsZXNgIChib29sZWFuLCBkZWZhdWx0cyB0byBgdHJ1ZWApLAogICAgICAgKiAgYGNhbmNlbGFibGVgIChib29sZWFuLCBkZWZhdWx0cyB0byBmYWxzZSksIGFuZAogICAgICAgKiAgYG5vZGVgIG9uIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50IChIVE1MRWxlbWVudCwgZGVmYXVsdHMgdG8gYHRoaXNgKS4KICAgICAgICogQHJldHVybiB7IUV2ZW50fSBUaGUgbmV3IGV2ZW50IHRoYXQgd2FzIGZpcmVkLgogICAgICAgKi8KICAgICAgZmlyZSh0eXBlLCBkZXRhaWwsIG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICBkZXRhaWwgPSAoZGV0YWlsID09PSBudWxsIHx8IGRldGFpbCA9PT0gdW5kZWZpbmVkKSA/IHt9IDogZGV0YWlsOwogICAgICAgIGxldCBldmVudCA9IG5ldyBFdmVudCh0eXBlLCB7CiAgICAgICAgICBidWJibGVzOiBvcHRpb25zLmJ1YmJsZXMgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBvcHRpb25zLmJ1YmJsZXMsCiAgICAgICAgICBjYW5jZWxhYmxlOiBCb29sZWFuKG9wdGlvbnMuY2FuY2VsYWJsZSksCiAgICAgICAgICBjb21wb3NlZDogb3B0aW9ucy5jb21wb3NlZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZTogb3B0aW9ucy5jb21wb3NlZAogICAgICAgIH0pOwogICAgICAgIGV2ZW50LmRldGFpbCA9IGRldGFpbDsKICAgICAgICBsZXQgbm9kZSA9IG9wdGlvbnMubm9kZSB8fCB0aGlzOwogICAgICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICAgICAgcmV0dXJuIGV2ZW50OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFkZCBhbiBldmVudCBsaXN0ZW5lciBvbiBhIGdpdmVuIGVsZW1lbnQsCiAgICAgICAqIGxhdGUgYm91bmQgdG8gYSBuYW1lZCBtZXRob2Qgb24gdGhpcyBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgRWxlbWVudCB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBOYW1lIG9mIGhhbmRsZXIgbWV0aG9kIG9uIGB0aGlzYCB0byBjYWxsLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgbGlzdGVuKG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSkgewogICAgICAgIG5vZGUgPSAvKiogQHR5cGUgeyFFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBsZXQgaGJsID0gdGhpcy5fX2JvdW5kTGlzdGVuZXJzIHx8CiAgICAgICAgICAodGhpcy5fX2JvdW5kTGlzdGVuZXJzID0gbmV3IFdlYWtNYXAoKSk7CiAgICAgICAgbGV0IGJsID0gaGJsLmdldChub2RlKTsKICAgICAgICBpZiAoIWJsKSB7CiAgICAgICAgICBibCA9IHt9OwogICAgICAgICAgaGJsLnNldChub2RlLCBibCk7CiAgICAgICAgfQogICAgICAgIGxldCBrZXkgPSBldmVudE5hbWUgKyBtZXRob2ROYW1lOwogICAgICAgIGlmICghYmxba2V5XSkgewogICAgICAgICAgYmxba2V5XSA9IHRoaXMuX2FkZE1ldGhvZEV2ZW50TGlzdGVuZXJUb05vZGUoCiAgICAgICAgICAgIG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSwgdGhpcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGEgZ2l2ZW4gZWxlbWVudCwKICAgICAgICogbGF0ZSBib3VuZCB0byBhIG5hbWVkIG1ldGhvZCBvbiB0aGlzIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgaGFuZGxlciBtZXRob2Qgb24gYHRoaXNgIHRvIG5vdCBjYWxsCiAgICAgICBhbnltb3JlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdW5saXN0ZW4obm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgIGxldCBibCA9IHRoaXMuX19ib3VuZExpc3RlbmVycyAmJiB0aGlzLl9fYm91bmRMaXN0ZW5lcnMuZ2V0KG5vZGUpOwogICAgICAgIGxldCBrZXkgPSBldmVudE5hbWUgKyBtZXRob2ROYW1lOwogICAgICAgIGxldCBoYW5kbGVyID0gYmwgJiYgYmxba2V5XTsKICAgICAgICBpZiAoaGFuZGxlcikgewogICAgICAgICAgdGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgICBibFtrZXldID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZSBzY3JvbGxpbmcgYmVoYXZpb3IgdG8gYWxsIGRpcmVjdGlvbiwgb25lIGRpcmVjdGlvbiwgb3Igbm9uZS4KICAgICAgICoKICAgICAgICogVmFsaWQgc2Nyb2xsIGRpcmVjdGlvbnM6CiAgICAgICAqICAgLSAnYWxsJzogc2Nyb2xsIGluIGFueSBkaXJlY3Rpb24KICAgICAgICogICAtICd4Jzogc2Nyb2xsIG9ubHkgaW4gdGhlICd4JyBkaXJlY3Rpb24KICAgICAgICogICAtICd5Jzogc2Nyb2xsIG9ubHkgaW4gdGhlICd5JyBkaXJlY3Rpb24KICAgICAgICogICAtICdub25lJzogZGlzYWJsZSBzY3JvbGxpbmcgZm9yIHRoaXMgbm9kZQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGRpcmVjdGlvbiBEaXJlY3Rpb24gdG8gYWxsb3cgc2Nyb2xsaW5nCiAgICAgICAqIERlZmF1bHRzIHRvIGBhbGxgLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIEVsZW1lbnQgdG8gYXBwbHkgc2Nyb2xsIGRpcmVjdGlvbiBzZXR0aW5nLgogICAgICAgKiBEZWZhdWx0cyB0byBgdGhpc2AuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzZXRTY3JvbGxEaXJlY3Rpb24oZGlyZWN0aW9uLCBub2RlKSB7CiAgICAgICAgUG9seW1lci5HZXN0dXJlcy5zZXRUb3VjaEFjdGlvbigvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpLCBESVJFQ1RJT05fTUFQW2RpcmVjdGlvbl0gfHwgJ2F1dG8nKTsKICAgICAgfQogICAgICAvKiAqKioqIEVuZCBFdmVudHMgKioqKiAqLwoKICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBydW4gYHF1ZXJ5U2VsZWN0b3JgIG9uIHRoaXMgbG9jYWwgRE9NIHNjb3BlLgogICAgICAgKgogICAgICAgKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGBQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3Ioc2xjdHIpYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNsY3RyIFNlbGVjdG9yIHRvIHJ1biBvbiB0aGlzIGxvY2FsIERPTSBzY29wZQogICAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBFbGVtZW50IGZvdW5kIGJ5IHRoZSBzZWxlY3Rvciwgb3IgbnVsbCBpZiBub3QgZm91bmQuCiAgICAgICAqLwogICAgICAkJChzbGN0cikgewogICAgICAgIHJldHVybiB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcihzbGN0cik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgd2hvc2UgbG9jYWwgZG9tIHdpdGhpbiB3aGljaCB0aGlzIGVsZW1lbnQKICAgICAgICogaXMgY29udGFpbmVkLiBUaGlzIGlzIGEgc2hvcnRoYW5kIGZvcgogICAgICAgKiBgdGhpcy5nZXRSb290Tm9kZSgpLmhvc3RgLgogICAgICAgKiBAdGhpcyB7RWxlbWVudH0KICAgICAgICovCiAgICAgIGdldCBkb21Ib3N0KCkgewogICAgICAgIGxldCByb290ID0gdGhpcy5nZXRSb290Tm9kZSgpOwogICAgICAgIHJldHVybiAocm9vdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpID8gLyoqIEB0eXBlIHtTaGFkb3dSb290fSAqLyAocm9vdCkuaG9zdCA6IHJvb3Q7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3JjZSB0aGlzIGVsZW1lbnQgdG8gZGlzdHJpYnV0ZSBpdHMgY2hpbGRyZW4gdG8gaXRzIGxvY2FsIGRvbS4KICAgICAgICogVGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSBhcyBvZiBQb2x5bWVyIDIuMC4yIGFuZCBpcyBwcm92aWRlZCBvbmx5CiAgICAgICAqIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGRpc3RyaWJ1dGVDb250ZW50KCkgewogICAgICAgIGlmICh3aW5kb3cuU2hhZHlET00gJiYgdGhpcy5zaGFkb3dSb290KSB7CiAgICAgICAgICBTaGFkeURPTS5mbHVzaCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIG5vZGVzIHRoYXQgYXJlIHRoZSBlZmZlY3RpdmUgY2hpbGROb2Rlcy4gVGhlIGVmZmVjdGl2ZQogICAgICAgKiBjaGlsZE5vZGVzIGxpc3QgaXMgdGhlIHNhbWUgYXMgdGhlIGVsZW1lbnQncyBjaGlsZE5vZGVzIGV4Y2VwdCB0aGF0CiAgICAgICAqIGFueSBgPGNvbnRlbnQ+YCBlbGVtZW50cyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgbGlzdCBvZiBub2RlcyBkaXN0cmlidXRlZAogICAgICAgKiB0byB0aGUgYDxjb250ZW50PmAsIHRoZSByZXN1bHQgb2YgaXRzIGBnZXREaXN0cmlidXRlZE5vZGVzYCBtZXRob2QuCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZWZmZWN0aXZlIGNoaWxkIG5vZGVzLgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gTGVnYWN5RWxlbWVudE1peGluIG11c3QgYmUgYXBwbGllZCB0byBhbiBIVE1MRWxlbWVudAogICAgICAgKi8KICAgICAgZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpIHsKICAgICAgICBjb25zdCB0aGlzRWwgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovICh0aGlzKTsKICAgICAgICBjb25zdCBkb21BcGkgPSAvKiogQHR5cGUge1BvbHltZXIuRG9tQXBpfSAqLyhQb2x5bWVyLmRvbSh0aGlzRWwpKTsKICAgICAgICByZXR1cm4gZG9tQXBpLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIG5vZGVzIGRpc3RyaWJ1dGVkIHdpdGhpbiB0aGlzIGVsZW1lbnQgdGhhdCBtYXRjaAogICAgICAgKiBgc2VsZWN0b3JgLiBUaGVzZSBjYW4gYmUgZG9tIGNoaWxkcmVuIG9yIGVsZW1lbnRzIGRpc3RyaWJ1dGVkIHRvCiAgICAgICAqIGNoaWxkcmVuIHRoYXQgYXJlIGluc2VydGlvbiBwb2ludHMuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBydW4uCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZGlzdHJpYnV0ZWQgZWxlbWVudHMgdGhhdCBtYXRjaCBzZWxlY3Rvci4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIHF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3RvcikgewogICAgICAgIGNvbnN0IHRoaXNFbCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKHRoaXMpOwogICAgICAgIGNvbnN0IGRvbUFwaSA9IC8qKiBAdHlwZSB7UG9seW1lci5Eb21BcGl9ICovKFBvbHltZXIuZG9tKHRoaXNFbCkpOwogICAgICAgIHJldHVybiBkb21BcGkucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHRoZSBlZmZlY3RpdmUgY2hpbGRyZW4uIFRoZSBlZmZlY3RpdmUKICAgICAgICogY2hpbGRyZW4gbGlzdCBpcyB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCdzIGNoaWxkcmVuIGV4Y2VwdCB0aGF0CiAgICAgICAqIGFueSBgPGNvbnRlbnQ+YCBlbGVtZW50cyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgbGlzdCBvZiBlbGVtZW50cwogICAgICAgKiBkaXN0cmlidXRlZCB0byB0aGUgYDxjb250ZW50PmAuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZWZmZWN0aXZlIGNoaWxkcmVuLgogICAgICAgKi8KICAgICAgZ2V0RWZmZWN0aXZlQ2hpbGRyZW4oKSB7CiAgICAgICAgbGV0IGxpc3QgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgICByZXR1cm4gbGlzdC5maWx0ZXIoZnVuY3Rpb24oLyoqIEB0eXBlIHshTm9kZX0gKi8gbikgewogICAgICAgICAgcmV0dXJuIChuLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIG9mIHRleHQgY29udGVudCB0aGF0IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZQogICAgICAgKiB0ZXh0IGNvbnRlbnQncyBvZiB0aGUgZWxlbWVudCdzIGVmZmVjdGl2ZSBjaGlsZE5vZGVzICh0aGUgZWxlbWVudHMKICAgICAgICogcmV0dXJuZWQgYnkgPGEgaHJlZj0iI2dldEVmZmVjdGl2ZUNoaWxkTm9kZXM+Z2V0RWZmZWN0aXZlQ2hpbGROb2RlczwvYT4uCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGRyZW4uCiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVUZXh0Q29udGVudCgpIHsKICAgICAgICBsZXQgY24gPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgICBsZXQgdGMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpPTAsIGM7IChjID0gY25baV0pOyBpKyspIHsKICAgICAgICAgIGlmIChjLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkgewogICAgICAgICAgICB0Yy5wdXNoKGMudGV4dENvbnRlbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGMuam9pbignJyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBlZmZlY3RpdmUgY2hpbGROb2RlIHdpdGhpbiB0aGlzIGVsZW1lbnQgdGhhdAogICAgICAgKiBtYXRjaCBgc2VsZWN0b3JgLiBUaGVzZSBjYW4gYmUgZG9tIGNoaWxkIG5vZGVzIG9yIGVsZW1lbnRzIGRpc3RyaWJ1dGVkCiAgICAgICAqIHRvIGNoaWxkcmVuIHRoYXQgYXJlIGluc2VydGlvbiBwb2ludHMuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBydW4uCiAgICAgICAqIEByZXR1cm4ge05vZGV9IEZpcnN0IGVmZmVjdGl2ZSBjaGlsZCBub2RlIHRoYXQgbWF0Y2hlcyBzZWxlY3Rvci4KICAgICAgICovCiAgICAgIHF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4oc2VsZWN0b3IpIHsKICAgICAgICBsZXQgZSQgPSB0aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3Rvcik7CiAgICAgICAgcmV0dXJuIGUkICYmIGUkWzBdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWZmZWN0aXZlIGNoaWxkTm9kZXMgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0CiAgICAgICAqIG1hdGNoIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGQgbm9kZXMgb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQKICAgICAgICogdG8gY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGQgbm9kZXMgdGhhdCBtYXRjaCBzZWxlY3Rvci4KICAgICAgICovCiAgICAgIHF1ZXJ5QWxsRWZmZWN0aXZlQ2hpbGRyZW4oc2VsZWN0b3IpIHsKICAgICAgICByZXR1cm4gdGhpcy5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgZGlzdHJpYnV0ZWQgdG8gdGhpcyBlbGVtZW50J3MgYDxzbG90PmAuCiAgICAgICAqCiAgICAgICAqIElmIHRoaXMgZWxlbWVudCBjb250YWlucyBtb3JlIHRoYW4gb25lIGA8c2xvdD5gIGluIGl0cyBsb2NhbCBET00sCiAgICAgICAqIGFuIG9wdGlvbmFsIHNlbGVjdG9yIG1heSBiZSBwYXNzZWQgdG8gY2hvb3NlIHRoZSBkZXNpcmVkIGNvbnRlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2xjdHIgQ1NTIHNlbGVjdG9yIHRvIGNob29zZSB0aGUgZGVzaXJlZAogICAgICAgKiAgIGA8c2xvdD5gLiAgRGVmYXVsdHMgdG8gYGNvbnRlbnRgLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fSBMaXN0IG9mIGRpc3RyaWJ1dGVkIG5vZGVzIGZvciB0aGUgYDxzbG90PmAuCiAgICAgICAqLwogICAgICBnZXRDb250ZW50Q2hpbGROb2RlcyhzbGN0cikgewogICAgICAgIGxldCBjb250ZW50ID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3Ioc2xjdHIgfHwgJ3Nsb3QnKTsKICAgICAgICByZXR1cm4gY29udGVudCA/IC8qKiBAdHlwZSB7UG9seW1lci5Eb21BcGl9ICovKFBvbHltZXIuZG9tKGNvbnRlbnQpKS5nZXREaXN0cmlidXRlZE5vZGVzKCkgOiBbXTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGVsZW1lbnQgY2hpbGRyZW4gZGlzdHJpYnV0ZWQgdG8gdGhpcyBlbGVtZW50J3MKICAgICAgICogYDxzbG90PmAuCiAgICAgICAqCiAgICAgICAqIElmIHRoaXMgZWxlbWVudCBjb250YWlucyBtb3JlIHRoYW4gb25lIGA8c2xvdD5gIGluIGl0cwogICAgICAgKiBsb2NhbCBET00sIGFuIG9wdGlvbmFsIHNlbGVjdG9yIG1heSBiZSBwYXNzZWQgdG8gY2hvb3NlIHRoZSBkZXNpcmVkCiAgICAgICAqIGNvbnRlbnQuICBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gYGdldENvbnRlbnRDaGlsZE5vZGVzYCBpbiB0aGF0IG9ubHkKICAgICAgICogZWxlbWVudHMgYXJlIHJldHVybmVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IHNsY3RyIENTUyBzZWxlY3RvciB0byBjaG9vc2UgdGhlIGRlc2lyZWQKICAgICAgICogICBgPGNvbnRlbnQ+YC4gIERlZmF1bHRzIHRvIGBjb250ZW50YC4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MRWxlbWVudD59IExpc3Qgb2YgZGlzdHJpYnV0ZWQgbm9kZXMgZm9yIHRoZQogICAgICAgKiAgIGA8c2xvdD5gLgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIGdldENvbnRlbnRDaGlsZHJlbihzbGN0cikgewogICAgICAgIGxldCBjaGlsZHJlbiA9IC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MRWxlbWVudD59ICovKHRoaXMuZ2V0Q29udGVudENoaWxkTm9kZXMoc2xjdHIpLmZpbHRlcihmdW5jdGlvbihuKSB7CiAgICAgICAgICByZXR1cm4gKG4ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKTsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBpbiB0aGlzIGVsZW1lbnQncyBsaWdodCBET00gdHJlZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHs/Tm9kZX0gbm9kZSBUaGUgZWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG5vZGUgaXMgaW4gdGhpcyBlbGVtZW50J3MgbGlnaHQgRE9NIHRyZWUuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuIEhUTUxFbGVtZW50CiAgICAgICAqLwogICAgICBpc0xpZ2h0RGVzY2VuZGFudChub2RlKSB7CiAgICAgICAgY29uc3QgdGhpc05vZGUgPSAvKiogQHR5cGUge05vZGV9ICovICh0aGlzKTsKICAgICAgICByZXR1cm4gdGhpc05vZGUgIT09IG5vZGUgJiYgdGhpc05vZGUuY29udGFpbnMobm9kZSkgJiYKICAgICAgICAgIHRoaXNOb2RlLmdldFJvb3ROb2RlKCkgPT09IG5vZGUuZ2V0Um9vdE5vZGUoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENoZWNrcyB3aGV0aGVyIGFuIGVsZW1lbnQgaXMgaW4gdGhpcyBlbGVtZW50J3MgbG9jYWwgRE9NIHRyZWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG5vZGUgVGhlIGVsZW1lbnQgdG8gYmUgY2hlY2tlZC4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBub2RlIGlzIGluIHRoaXMgZWxlbWVudCdzIGxvY2FsIERPTSB0cmVlLgogICAgICAgKi8KICAgICAgaXNMb2NhbERlc2NlbmRhbnQobm9kZSkgewogICAgICAgIHJldHVybiB0aGlzLnJvb3QgPT09IG5vZGUuZ2V0Um9vdE5vZGUoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5vLW9wIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gVGhpcyBzaG91bGQgbm93IGJlIGhhbmRsZWQgYnkKICAgICAgICogU2hhZHlDc3MgbGlicmFyeS4KICAgICAgICogQHBhcmFtICB7Kn0gY29udGFpbmVyIFVudXNlZAogICAgICAgKiBAcGFyYW0gIHsqfSBzaG91bGRPYnNlcnZlIFVudXNlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2NvcGVTdWJ0cmVlKGNvbnRhaW5lciwgc2hvdWxkT2JzZXJ2ZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBjb21wdXRlZCBzdHlsZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgVGhlIGNzcyBwcm9wZXJ0eSBuYW1lLgogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbXB1dGVkIGNzcyBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIGdpdmVuCiAgICAgICAqIGBwcm9wZXJ0eWAuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuIEhUTUxFbGVtZW50CiAgICAgICAqLwogICAgICBnZXRDb21wdXRlZFN0eWxlVmFsdWUocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gc3R5bGVJbnRlcmZhY2UuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovKHRoaXMpLCBwcm9wZXJ0eSk7CiAgICAgIH0KCiAgICAgIC8vIGRlYm91bmNlCgogICAgICAvKioKICAgICAgICogQ2FsbCBgZGVib3VuY2VgIHRvIGNvbGxhcHNlIG11bHRpcGxlIHJlcXVlc3RzIGZvciBhIG5hbWVkIHRhc2sgaW50bwogICAgICAgKiBvbmUgaW52b2NhdGlvbiB3aGljaCBpcyBtYWRlIGFmdGVyIHRoZSB3YWl0IHRpbWUgaGFzIGVsYXBzZWQgd2l0aAogICAgICAgKiBubyBuZXcgcmVxdWVzdC4gIElmIG5vIHdhaXQgdGltZSBpcyBnaXZlbiwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkCiAgICAgICAqIGF0IG1pY3JvdGFzayB0aW1pbmcgKGd1YXJhbnRlZWQgYmVmb3JlIHBhaW50KS4KICAgICAgICoKICAgICAgICogICAgIGRlYm91bmNlZENsaWNrQWN0aW9uKGUpIHsKICAgICAgICogICAgICAgLy8gd2lsbCBub3QgY2FsbCBgcHJvY2Vzc0NsaWNrYCBtb3JlIHRoYW4gb25jZSBwZXIgMTAwbXMKICAgICAgICogICAgICAgdGhpcy5kZWJvdW5jZSgnY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICogICAgICAgIHRoaXMucHJvY2Vzc0NsaWNrKCk7CiAgICAgICAqICAgICAgIH0gMTAwKTsKICAgICAgICogICAgIH0KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgU3RyaW5nIHRvIGlkZW50aWZ5IHRoZSBkZWJvdW5jZSBqb2IuCiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCAod2l0aCBgdGhpc2AKICAgICAgICogICBjb250ZXh0KSB3aGVuIHRoZSB3YWl0IHRpbWUgZWxhcHNlcy4KICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgT3B0aW9uYWwgd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcyAobXMpIGFmdGVyIHRoZQogICAgICAgKiAgIGxhc3Qgc2lnbmFsIHRoYXQgbXVzdCBlbGFwc2UgYmVmb3JlIGludm9raW5nIGBjYWxsYmFja2AKICAgICAgICogQHJldHVybiB7IU9iamVjdH0gUmV0dXJucyBhIGRlYm91bmNlciBvYmplY3Qgb24gd2hpY2ggZXhpc3RzIHRoZQogICAgICAgKiBmb2xsb3dpbmcgbWV0aG9kczogYGlzQWN0aXZlKClgIHJldHVybnMgdHJ1ZSBpZiB0aGUgZGVib3VuY2VyIGlzCiAgICAgICAqIGFjdGl2ZTsgYGNhbmNlbCgpYCBjYW5jZWxzIHRoZSBkZWJvdW5jZXIgaWYgaXQgaXMgYWN0aXZlOwogICAgICAgKiBgZmx1c2goKWAgaW1tZWRpYXRlbHkgaW52b2tlcyB0aGUgZGVib3VuY2VkIGNhbGxiYWNrIGlmIHRoZSBkZWJvdW5jZXIKICAgICAgICogaXMgYWN0aXZlLgogICAgICAgKi8KICAgICAgZGVib3VuY2Uoam9iTmFtZSwgY2FsbGJhY2ssIHdhaXQpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICByZXR1cm4gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXSA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICAgIHRoaXMuX2RlYm91bmNlcnNbam9iTmFtZV0KICAgICAgICAgICAgLCB3YWl0ID4gMCA/IFBvbHltZXIuQXN5bmMudGltZU91dC5hZnRlcih3YWl0KSA6IFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAgICAgICwgY2FsbGJhY2suYmluZCh0aGlzKSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuYW1lZCBkZWJvdW5jZXIgaXMgYWN0aXZlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBUaGUgbmFtZSBvZiB0aGUgZGVib3VuY2VyIHN0YXJ0ZWQgd2l0aCBgZGVib3VuY2VgCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGRlYm91bmNlciBpcyBhY3RpdmUgKGhhcyBub3QgeWV0IGZpcmVkKS4KICAgICAgICovCiAgICAgIGlzRGVib3VuY2VyQWN0aXZlKGpvYk5hbWUpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICBsZXQgZGVib3VuY2VyID0gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXTsKICAgICAgICByZXR1cm4gISEoZGVib3VuY2VyICYmIGRlYm91bmNlci5pc0FjdGl2ZSgpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltbWVkaWF0ZWx5IGNhbGxzIHRoZSBkZWJvdW5jZXIgYGNhbGxiYWNrYCBhbmQgaW5hY3RpdmF0ZXMgaXQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGZsdXNoRGVib3VuY2VyKGpvYk5hbWUpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICBsZXQgZGVib3VuY2VyID0gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXTsKICAgICAgICBpZiAoZGVib3VuY2VyKSB7CiAgICAgICAgICBkZWJvdW5jZXIuZmx1c2goKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGFuIGFjdGl2ZSBkZWJvdW5jZXIuICBUaGUgYGNhbGxiYWNrYCB3aWxsIG5vdCBiZSBjYWxsZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGNhbmNlbERlYm91bmNlcihqb2JOYW1lKSB7CiAgICAgICAgdGhpcy5fZGVib3VuY2VycyA9IHRoaXMuX2RlYm91bmNlcnMgfHwge307CiAgICAgICAgbGV0IGRlYm91bmNlciA9IHRoaXMuX2RlYm91bmNlcnNbam9iTmFtZV07CiAgICAgICAgaWYgKGRlYm91bmNlcikgewogICAgICAgICAgZGVib3VuY2VyLmNhbmNlbCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJ1bnMgYSBjYWxsYmFjayBmdW5jdGlvbiBhc3luY2hyb25vdXNseS4KICAgICAgICoKICAgICAgICogQnkgZGVmYXVsdCAoaWYgbm8gd2FpdFRpbWUgaXMgc3BlY2lmaWVkKSwgYXN5bmMgY2FsbGJhY2tzIGFyZSBydW4gYXQKICAgICAgICogbWljcm90YXNrIHRpbWluZywgd2hpY2ggd2lsbCBvY2N1ciBiZWZvcmUgcGFpbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcnVuLCBib3VuZCB0byBgdGhpc2AuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gd2FpdFRpbWUgVGltZSB0byB3YWl0IGJlZm9yZSBjYWxsaW5nIHRoZQogICAgICAgKiAgIGBjYWxsYmFja2AuICBJZiB1bnNwZWNpZmllZCBvciAwLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBydW4gYXQgbWljcm90YXNrCiAgICAgICAqICAgdGltaW5nIChiZWZvcmUgcGFpbnQpLgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB0aGF0IG1heSBiZSB1c2VkIHRvIGNhbmNlbCB0aGUgYXN5bmMgam9iLgogICAgICAgKi8KICAgICAgYXN5bmMoY2FsbGJhY2ssIHdhaXRUaW1lKSB7CiAgICAgICAgcmV0dXJuIHdhaXRUaW1lID4gMCA/IFBvbHltZXIuQXN5bmMudGltZU91dC5ydW4oY2FsbGJhY2suYmluZCh0aGlzKSwgd2FpdFRpbWUpIDoKICAgICAgICAgICAgflBvbHltZXIuQXN5bmMubWljcm9UYXNrLnJ1bihjYWxsYmFjay5iaW5kKHRoaXMpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYW4gYXN5bmMgb3BlcmF0aW9uIHN0YXJ0ZWQgd2l0aCBgYXN5bmNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIG9yaWdpbmFsIGBhc3luY2AgY2FsbCB0bwogICAgICAgKiAgIGNhbmNlbC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGNhbmNlbEFzeW5jKGhhbmRsZSkgewogICAgICAgIGhhbmRsZSA8IDAgPyBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzay5jYW5jZWwofmhhbmRsZSkgOgogICAgICAgICAgICBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuY2FuY2VsKGhhbmRsZSk7CiAgICAgIH0KCiAgICAgIC8vIG90aGVyCgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBlbGVtZW50IGFuZCBjb25maWd1cmluZyBpdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBIVE1MIGVsZW1lbnQgdGFnIHRvIGNyZWF0ZS4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBwcm9wcyBPYmplY3Qgb2YgcHJvcGVydGllcyB0byBjb25maWd1cmUgb24gdGhlCiAgICAgICAqICAgIGluc3RhbmNlLgogICAgICAgKiBAcmV0dXJuIHshRWxlbWVudH0gTmV3bHkgY3JlYXRlZCBhbmQgY29uZmlndXJlZCBlbGVtZW50LgogICAgICAgKi8KICAgICAgY3JlYXRlKHRhZywgcHJvcHMpIHsKICAgICAgICBsZXQgZWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgICAgIGlmIChwcm9wcykgewogICAgICAgICAgaWYgKGVsdC5zZXRQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgIGVsdC5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAobGV0IG4gaW4gcHJvcHMpIHsKICAgICAgICAgICAgICBlbHRbbl0gPSBwcm9wc1tuXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZWx0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbXBvcnRpbmcgYW4gSFRNTCBkb2N1bWVudCBpbXBlcmF0aXZlbHkuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgYDxsaW5rIHJlbD0iaW1wb3J0Ij5gIGVsZW1lbnQgd2l0aAogICAgICAgKiB0aGUgcHJvdmlkZWQgVVJMIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCB0byBzdGFydCBsb2FkaW5nLgogICAgICAgKiBJbiB0aGUgYG9ubG9hZGAgY2FsbGJhY2ssIHRoZSBgaW1wb3J0YCBwcm9wZXJ0eSBvZiB0aGUgYGxpbmtgCiAgICAgICAqIGVsZW1lbnQgd2lsbCBjb250YWluIHRoZSBpbXBvcnRlZCBkb2N1bWVudCBjb250ZW50cy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGhyZWYgVVJMIHRvIGRvY3VtZW50IHRvIGxvYWQuCiAgICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFdmVudCk6dm9pZD19IG9ubG9hZCBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQgc3VjY2Vzc2Z1bGx5CiAgICAgICAqICAgbG9hZGVkLgogICAgICAgKiBAcGFyYW0gez9mdW5jdGlvbighRXJyb3JFdmVudCk6dm9pZD19IG9uZXJyb3IgQ2FsbGJhY2sgdG8gbm90aWZ5IHdoZW4gYW4gaW1wb3J0CiAgICAgICAqICAgdW5zdWNjZXNzZnVsbHkgbG9hZGVkLgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRBc3luYyBUcnVlIGlmIHRoZSBpbXBvcnQgc2hvdWxkIGJlIGxvYWRlZCBgYXN5bmNgLgogICAgICAgKiAgIERlZmF1bHRzIHRvIGBmYWxzZWAuCiAgICAgICAqIEByZXR1cm4geyFIVE1MTGlua0VsZW1lbnR9IFRoZSBsaW5rIGVsZW1lbnQgZm9yIHRoZSBVUkwgdG8gYmUgbG9hZGVkLgogICAgICAgKi8KICAgICAgaW1wb3J0SHJlZihocmVmLCBvbmxvYWQsIG9uZXJyb3IsIG9wdEFzeW5jKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICBsZXQgbG9hZEZuID0gb25sb2FkID8gb25sb2FkLmJpbmQodGhpcykgOiBudWxsOwogICAgICAgIGxldCBlcnJvckZuID0gb25lcnJvciA/IG9uZXJyb3IuYmluZCh0aGlzKSA6IG51bGw7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuaW1wb3J0SHJlZihocmVmLCBsb2FkRm4sIGVycm9yRm4sIG9wdEFzeW5jKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBvbHlmaWxsIGZvciBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzLCB3aGljaCBpcyBzb21ldGltZXMgc3RpbGwKICAgICAgICogcHJlZml4ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byB0ZXN0LgogICAgICAgKiBAcGFyYW0geyFFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIHRlc3QgdGhlIHNlbGVjdG9yIGFnYWluc3QuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuCiAgICAgICAqLwogICAgICBlbGVtZW50TWF0Y2hlcyhzZWxlY3Rvciwgbm9kZSkgewogICAgICAgIHJldHVybiBQb2x5bWVyLmRvbS5tYXRjaGVzU2VsZWN0b3IoLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyksIHNlbGVjdG9yKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFRvZ2dsZXMgYW4gSFRNTCBhdHRyaWJ1dGUgb24gb3Igb2ZmLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBIVE1MIGF0dHJpYnV0ZSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGJvb2wgQm9vbGVhbiB0byBmb3JjZSB0aGUgYXR0cmlidXRlIG9uIG9yIG9mZi4KICAgICAgICogICAgV2hlbiB1bnNwZWNpZmllZCwgdGhlIHN0YXRlIG9mIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSByZXZlcnNlZC4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBOb2RlIHRvIHRhcmdldC4gIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRvZ2dsZUF0dHJpYnV0ZShuYW1lLCBib29sLCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgICAgYm9vbCA9ICFub2RlLmhhc0F0dHJpYnV0ZShuYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJvb2wpIHsKICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsICcnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgfQogICAgICB9CgoKICAgICAgLyoqCiAgICAgICAqIFRvZ2dsZXMgYSBDU1MgY2xhc3Mgb24gb3Igb2ZmLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBDU1MgY2xhc3MgbmFtZQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBib29sIEJvb2xlYW4gdG8gZm9yY2UgdGhlIGNsYXNzIG9uIG9yIG9mZi4KICAgICAgICogICAgV2hlbiB1bnNwZWNpZmllZCwgdGhlIHN0YXRlIG9mIHRoZSBjbGFzcyB3aWxsIGJlIHJldmVyc2VkLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIE5vZGUgdG8gdGFyZ2V0LiAgRGVmYXVsdHMgdG8gYHRoaXNgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdG9nZ2xlQ2xhc3MobmFtZSwgYm9vbCwgbm9kZSkgewogICAgICAgIG5vZGUgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIGJvb2wgPSAhbm9kZS5jbGFzc0xpc3QuY29udGFpbnMobmFtZSk7CiAgICAgICAgfQogICAgICAgIGlmIChib29sKSB7CiAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQobmFtZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZShuYW1lKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcm9zcy1wbGF0Zm9ybSBoZWxwZXIgZm9yIHNldHRpbmcgYW4gZWxlbWVudCdzIENTUyBgdHJhbnNmb3JtYCBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zZm9ybVRleHQgVHJhbnNmb3JtIHNldHRpbmcuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSB0aGUgdHJhbnNmb3JtIHRvLgogICAgICAgKiBEZWZhdWx0cyB0byBgdGhpc2AKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRyYW5zZm9ybSh0cmFuc2Zvcm1UZXh0LCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgbm9kZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZXh0OwogICAgICAgIG5vZGUuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtVGV4dDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3Igc2V0dGluZyBhbiBlbGVtZW50J3MgQ1NTIGB0cmFuc2xhdGUzZGAKICAgICAgICogcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IFggb2Zmc2V0LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0geSBZIG9mZnNldC4KICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHogWiBvZmZzZXQuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSB0aGUgdHJhbnNmb3JtIHRvLgogICAgICAgKiBEZWZhdWx0cyB0byBgdGhpc2AuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0cmFuc2xhdGUzZCh4LCB5LCB6LCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgdGhpcy50cmFuc2Zvcm0oJ3RyYW5zbGF0ZTNkKCcgKyB4ICsgJywnICsgeSArICcsJyArIHogKyAnKScsIG5vZGUpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gYW4gYXJyYXksIGlmIGl0IGV4aXN0cy4KICAgICAgICoKICAgICAgICogSWYgdGhlIGFycmF5IGlzIHNwZWNpZmllZCBieSBwYXRoLCBhIGNoYW5nZSBub3RpZmljYXRpb24gaXMKICAgICAgICogZ2VuZXJhdGVkLCBzbyB0aGF0IG9ic2VydmVycywgZGF0YSBiaW5kaW5ncyBhbmQgY29tcHV0ZWQKICAgICAgICogcHJvcGVydGllcyB3YXRjaGluZyB0aGF0IHBhdGggY2FuIHVwZGF0ZS4KICAgICAgICoKICAgICAgICogSWYgdGhlIGFycmF5IGlzIHBhc3NlZCBkaXJlY3RseSwgKipubyBjaGFuZ2UKICAgICAgICogbm90aWZpY2F0aW9uIGlzIGdlbmVyYXRlZCoqLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxudW1iZXJ8c3RyaW5nPn0gYXJyYXlPclBhdGggUGF0aCB0byBhcnJheSBmcm9tIHdoaWNoIHRvIHJlbW92ZSB0aGUgaXRlbQogICAgICAgKiAgIChvciB0aGUgYXJyYXkgaXRzZWxmKS4KICAgICAgICogQHBhcmFtIHsqfSBpdGVtIEl0ZW0gdG8gcmVtb3ZlLgogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgY29udGFpbmluZyBpdGVtIHJlbW92ZWQuCiAgICAgICAqLwogICAgICBhcnJheURlbGV0ZShhcnJheU9yUGF0aCwgaXRlbSkgewogICAgICAgIGxldCBpbmRleDsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnJheU9yUGF0aCkpIHsKICAgICAgICAgIGluZGV4ID0gYXJyYXlPclBhdGguaW5kZXhPZihpdGVtKTsKICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheU9yUGF0aC5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsZXQgYXJyID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBhcnJheU9yUGF0aCk7CiAgICAgICAgICBpbmRleCA9IGFyci5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaWNlKGFycmF5T3JQYXRoLCBpbmRleCwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CgogICAgICAvLyBsb2dnaW5nCgogICAgICAvKioKICAgICAgICogRmFjYWRlcyBgY29uc29sZS5sb2dgL2B3YXJuYC9gZXJyb3JgIGFzIG92ZXJyaWRlIHBvaW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGV2ZWwgT25lIG9mICdsb2cnLCAnd2FybicsICdlcnJvcicKICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfbG9nZ2VyKGxldmVsLCBhcmdzKSB7CiAgICAgICAgLy8gYWNjZXB0IFsnZm9vJywgJ2JhciddIGFuZCBbWydmb28nLCAnYmFyJ11dCiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncykgJiYgYXJncy5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShhcmdzWzBdKSkgewogICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgfQogICAgICAgIHN3aXRjaChsZXZlbCkgewogICAgICAgICAgY2FzZSAnbG9nJzoKICAgICAgICAgIGNhc2UgJ3dhcm4nOgogICAgICAgICAgY2FzZSAnZXJyb3InOgogICAgICAgICAgICBjb25zb2xlW2xldmVsXSguLi5hcmdzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLmxvZ2AgYXMgYW4gb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfbG9nKC4uLmFyZ3MpIHsKICAgICAgICB0aGlzLl9sb2dnZXIoJ2xvZycsIGFyZ3MpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmFjYWRlcyBgY29uc29sZS53YXJuYCBhcyBhbiBvdmVycmlkZSBwb2ludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF93YXJuKC4uLmFyZ3MpIHsKICAgICAgICB0aGlzLl9sb2dnZXIoJ3dhcm4nLCBhcmdzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZhY2FkZXMgYGNvbnNvbGUuZXJyb3JgIGFzIGFuIG92ZXJyaWRlIHBvaW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2Vycm9yKC4uLmFyZ3MpIHsKICAgICAgICB0aGlzLl9sb2dnZXIoJ2Vycm9yJywgYXJncyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3JtYXRzIGEgbWVzc2FnZSB1c2luZyB0aGUgZWxlbWVudCB0eXBlIGFuIGEgbWV0aG9kIG5hbWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIG1lc3NhZ2UKICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7QXJyYXl9IEFycmF5IHdpdGggZm9ybWF0dGluZyBpbmZvcm1hdGlvbiBmb3IgYGNvbnNvbGVgCiAgICAgICAqICAgbG9nZ2luZy4KICAgICAgICovCiAgICAgIF9sb2dmKG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gWydbJXM6OiVzXScsIHRoaXMuaXMsIG1ldGhvZE5hbWUsIC4uLmFyZ3NdOwogICAgICB9CgogICAgfQoKICAgIExlZ2FjeUVsZW1lbnQucHJvdG90eXBlLmlzID0gJyc7CgogICAgcmV0dXJuIExlZ2FjeUVsZW1lbnQ7CgogIH0pOwoKfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CgogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGNvbnN0IGxpZmVjeWNsZVByb3BzID0gewogICAgICBhdHRhY2hlZDogdHJ1ZSwKICAgICAgZGV0YWNoZWQ6IHRydWUsCiAgICAgIHJlYWR5OiB0cnVlLAogICAgICBjcmVhdGVkOiB0cnVlLAogICAgICBiZWZvcmVSZWdpc3RlcjogdHJ1ZSwKICAgICAgcmVnaXN0ZXJlZDogdHJ1ZSwKICAgICAgYXR0cmlidXRlQ2hhbmdlZDogdHJ1ZSwKICAgICAgbGlzdGVuZXJzOiB0cnVlLAogICAgICBob3N0QXR0cmlidXRlczogdHJ1ZQogICAgfTsKCiAgICBjb25zdCBleGNsdWRlT25JbmZvID0gewogICAgICBhdHRhY2hlZDogdHJ1ZSwKICAgICAgZGV0YWNoZWQ6IHRydWUsCiAgICAgIHJlYWR5OiB0cnVlLAogICAgICBjcmVhdGVkOiB0cnVlLAogICAgICBiZWZvcmVSZWdpc3RlcjogdHJ1ZSwKICAgICAgcmVnaXN0ZXJlZDogdHJ1ZSwKICAgICAgYXR0cmlidXRlQ2hhbmdlZDogdHJ1ZSwKICAgICAgYmVoYXZpb3JzOiB0cnVlLAogICAgICBfbm9BY2Nlc3NvcnM6IHRydWUKICAgIH07CgogICAgY29uc3QgZXhjbHVkZU9uQmVoYXZpb3JzID0gT2JqZWN0LmFzc2lnbih7CiAgICAgIGxpc3RlbmVyczogdHJ1ZSwKICAgICAgaG9zdEF0dHJpYnV0ZXM6IHRydWUsCiAgICAgIHByb3BlcnRpZXM6IHRydWUsCiAgICAgIG9ic2VydmVyczogdHJ1ZSwKICAgIH0sIGV4Y2x1ZGVPbkluZm8pOwoKICAgIGZ1bmN0aW9uIGNvcHlQcm9wZXJ0aWVzKHNvdXJjZSwgdGFyZ2V0LCBleGNsdWRlUHJvcHMpIHsKICAgICAgY29uc3Qgbm9BY2Nlc3NvcnMgPSBzb3VyY2UuX25vQWNjZXNzb3JzOwogICAgICBmb3IgKGxldCBwIGluIHNvdXJjZSkgewogICAgICAgIGlmICghKHAgaW4gZXhjbHVkZVByb3BzKSkgewogICAgICAgICAgaWYgKG5vQWNjZXNzb3JzKSB7CiAgICAgICAgICAgIHRhcmdldFtwXSA9IHNvdXJjZVtwXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBwKTsKICAgICAgICAgICAgaWYgKHBkKSB7CiAgICAgICAgICAgICAgLy8gZW5zdXJlIHByb3BlcnR5IGlzIGNvbmZpZ3VyYWJsZSBzbyB0aGF0IGEgbGF0ZXIgYmVoYXZpb3IgY2FuCiAgICAgICAgICAgICAgLy8gcmUtY29uZmlndXJlIGl0LgogICAgICAgICAgICAgIHBkLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcCwgcGQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBBcHBsaWVzIGEgImxlZ2FjeSIgYmVoYXZpb3Igb3IgYXJyYXkgb2YgYmVoYXZpb3JzIHRvIHRoZSBwcm92aWRlZCBjbGFzcy4KICAgICAqCiAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCB3aWxsIGF1dG9tYXRpY2FsbHkgYWxzbyBhcHBseSB0aGUgYFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluYAogICAgICogdG8gZW5zdXJlIHRoYXQgYW55IGxlZ2FjeSBiZWhhdmlvcnMgY2FuIHJlbHkgb24gbGVnYWN5IFBvbHltZXIgQVBJIG9uCiAgICAgKiB0aGUgdW5kZXJseWluZyBlbGVtZW50LgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0geyFPYmplY3R8IUFycmF5PCFPYmplY3Q+fSBiZWhhdmlvcnMgQmVoYXZpb3Igb2JqZWN0IG9yIGFycmF5IG9mIGJlaGF2aW9ycy4KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3OlQpfSBrbGFzcyBFbGVtZW50IGNsYXNzLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlQpfSBSZXR1cm5zIGEgbmV3IEVsZW1lbnQgY2xhc3MgZXh0ZW5kZWQgYnkgdGhlCiAgICAgKiBwYXNzZWQgaW4gYGJlaGF2aW9yc2AgYW5kIGFsc28gYnkgYFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluYC4KICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0cywgY2hlY2tUeXBlc30KICAgICAqLwogICAgZnVuY3Rpb24gbWl4aW5CZWhhdmlvcnMoYmVoYXZpb3JzLCBrbGFzcykgewogICAgICByZXR1cm4gR2VuZXJhdGVDbGFzc0Zyb21JbmZvKHt9LCBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbihrbGFzcyksIGJlaGF2aW9ycyk7CiAgICB9CgogICAgLy8gTk9URToKICAgIC8vIDEueAogICAgLy8gQmVoYXZpb3JzIHdlcmUgbWl4ZWQgaW4gKmluIHJldmVyc2Ugb3JkZXIqIGFuZCBkZS1kdXBlZCBvbiB0aGUgZmx5LgogICAgLy8gVGhlIHJ1bGUgd2FzIHRoYXQgYmVoYXZpb3IgcHJvcGVydGllcyB3ZXJlIGNvcGllZCBvbnRvIHRoZSBlbGVtZW50CiAgICAvLyBwcm90b3R5cGUgaWYgYW5kIG9ubHkgaWYgdGhlIHByb3BlcnR5IGRpZCBub3QgYWxyZWFkeSBleGlzdC4KICAgIC8vIEdpdmVuOiBQb2x5bWVyeyBiZWhhdmlvcnM6IFtBLCBCLCBDLCBBLCBCXX0sIHByb3BlcnR5IGNvcHkgb3JkZXIgd2FzOgogICAgLy8gKDEpLCBCLCAoMiksIEEsICgzKSBDLiBUaGlzIG1lYW5zIHByb3RvdHlwZSBwcm9wZXJ0aWVzIHdpbiBvdmVyCiAgICAvLyBCIHByb3BlcnRpZXMgd2luIG92ZXIgQSB3aW4gb3ZlciBDLiBUaGlzIG1pcnJvcnMgd2hhdCB3b3VsZCBoYXBwZW4KICAgIC8vIHdpdGggaW5oZXJpdGFuY2UgaWYgZWxlbWVudCBleHRlbmRlZCBCIGV4dGVuZGVkIEEgZXh0ZW5kZWQgQy4KICAgIC8vCiAgICAvLyBBZ2FpbiBnaXZlbiwgUG9seW1lcnsgYmVoYXZpb3JzOiBbQSwgQiwgQywgQSwgQl19LCB0aGUgcmVzdWx0aW5nCiAgICAvLyBgYmVoYXZpb3JzYCBhcnJheSB3YXMgW0MsIEEsIEJdLgogICAgLy8gQmVoYXZpb3IgbGlmZWN5Y2xlIG1ldGhvZHMgd2VyZSBjYWxsZWQgaW4gYmVoYXZpb3IgYXJyYXkgb3JkZXIKICAgIC8vIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50LCBlLmcuICgxKSBDLmNyZWF0ZWQsICgyKSBBLmNyZWF0ZWQsCiAgICAvLyAoMykgQi5jcmVhdGVkLCAoNCkgZWxlbWVudC5jcmVhdGVkLiBUaGVyZSB3YXMgbm8gc3VwcG9ydCBmb3IKICAgIC8vIHN1cGVyLCBhbmQgInN1cGVyLWJlaGF2aW9yIiBtZXRob2RzIHdlcmUgY2FsbGFibGUgb25seSBieSBuYW1lKS4KICAgIC8vCiAgICAvLyAyLngKICAgIC8vIEJlaGF2aW9ycyBhcmUgbWFkZSBpbnRvIHByb3BlciBtaXhpbnMgd2hpY2ggbGl2ZSBpbiB0aGUKICAgIC8vIGVsZW1lbnQncyBwcm90b3R5cGUgY2hhaW4uIEJlaGF2aW9ycyBhcmUgcGxhY2VkIGluIHRoZSBlbGVtZW50IHByb3RvdHlwZQogICAgLy8gZWxkZXN0IHRvIHlvdW5nZXN0IGFuZCBkZS1kdXBlZCB5b3VuZ2VzdCB0byBvbGRlc3Q6CiAgICAvLyBTbywgZmlyc3QgW0EsIEIsIEMsIEEsIEJdIGJlY29tZXMgW0MsIEEsIEJdIHRoZW4sCiAgICAvLyB0aGUgZWxlbWVudCBwcm90b3R5cGUgYmVjb21lcyAob2xkZXN0KSAoMSkgUG9seW1lci5FbGVtZW50LCAoMikgY2xhc3MoQyksCiAgICAvLyAoMykgY2xhc3MoQSksICg0KSBjbGFzcyhCKSwgKDUpIGNsYXNzKFBvbHltZXIoey4uLn0pKS4KICAgIC8vIFJlc3VsdDoKICAgIC8vIFRoaXMgbWVhbnMgZWxlbWVudCBwcm9wZXJ0aWVzIHdpbiBvdmVyIEIgcHJvcGVydGllcyB3aW4gb3ZlciBBIHdpbgogICAgLy8gb3ZlciBDLiAoc2FtZSBhcyAxLngpCiAgICAvLyBJZiBsaWZlY3ljbGUgaXMgY2FsbGVkIChzdXBlciB0aGVuIG1lKSwgb3JkZXIgaXMKICAgIC8vICgxKSBDLmNyZWF0ZWQsICgyKSBBLmNyZWF0ZWQsICgzKSBCLmNyZWF0ZWQsICg0KSBlbGVtZW50LmNyZWF0ZWQKICAgIC8vIChhZ2FpbiBzYW1lIGFzIDEueCkKICAgIGZ1bmN0aW9uIGFwcGx5QmVoYXZpb3JzKHByb3RvLCBiZWhhdmlvcnMsIGxpZmVjeWNsZSkgewogICAgICBmb3IgKGxldCBpPTA7IGk8YmVoYXZpb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgYXBwbHlJbmZvKHByb3RvLCBiZWhhdmlvcnNbaV0sIGxpZmVjeWNsZSwgZXhjbHVkZU9uQmVoYXZpb3JzKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5SW5mbyhwcm90bywgaW5mbywgbGlmZWN5Y2xlLCBleGNsdWRlUHJvcHMpIHsKICAgICAgY29weVByb3BlcnRpZXMoaW5mbywgcHJvdG8sIGV4Y2x1ZGVQcm9wcyk7CiAgICAgIGZvciAobGV0IHAgaW4gbGlmZWN5Y2xlUHJvcHMpIHsKICAgICAgICBpZiAoaW5mb1twXSkgewogICAgICAgICAgbGlmZWN5Y2xlW3BdID0gbGlmZWN5Y2xlW3BdIHx8IFtdOwogICAgICAgICAgbGlmZWN5Y2xlW3BdLnB1c2goaW5mb1twXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0FycmF5fSBiZWhhdmlvcnMgTGlzdCBvZiBiZWhhdmlvcnMgdG8gZmxhdHRlbi4KICAgICAqIEBwYXJhbSB7QXJyYXk9fSBsaXN0IFRhcmdldCBsaXN0IHRvIGZsYXR0ZW4gYmVoYXZpb3JzIGludG8uCiAgICAgKiBAcGFyYW0ge0FycmF5PX0gZXhjbHVkZSBMaXN0IG9mIGJlaGF2aW9ycyB0byBleGNsdWRlIGZyb20gdGhlIGxpc3QuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgdGhlIGxpc3Qgb2YgZmxhdHRlbmVkIGJlaGF2aW9ycy4KICAgICAqLwogICAgZnVuY3Rpb24gZmxhdHRlbkJlaGF2aW9ycyhiZWhhdmlvcnMsIGxpc3QsIGV4Y2x1ZGUpIHsKICAgICAgbGlzdCA9IGxpc3QgfHwgW107CiAgICAgIGZvciAobGV0IGk9YmVoYXZpb3JzLmxlbmd0aC0xOyBpID49IDA7IGktLSkgewogICAgICAgIGxldCBiID0gYmVoYXZpb3JzW2ldOwogICAgICAgIGlmIChiKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShiKSkgewogICAgICAgICAgICBmbGF0dGVuQmVoYXZpb3JzKGIsIGxpc3QpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gZGVkdXAKICAgICAgICAgICAgaWYgKGxpc3QuaW5kZXhPZihiKSA8IDAgJiYgKCFleGNsdWRlIHx8IGV4Y2x1ZGUuaW5kZXhPZihiKSA8IDApKSB7CiAgICAgICAgICAgICAgbGlzdC51bnNoaWZ0KGIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnNvbGUud2FybignYmVoYXZpb3IgaXMgbnVsbCwgY2hlY2sgZm9yIG1pc3Npbmcgb3IgNDA0IGltcG9ydCcpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbGlzdDsKICAgIH0KCiAgICAvKiBOb3RlIGFib3V0IGNvbnN0cnVjdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIGxlZ2FjeSBjbGFzc2VzLgogICAgICBbQ2hhbmdlZCBpbiBRNCAyMDE4IHRvIG9wdGltaXplIHBlcmZvcm1hbmNlLl0KCiAgICAgIFdoZW4gY2FsbGluZyBgUG9seW1lcmAgb3IgYG1peGluQmVoYXZpb3JzYCwgdGhlIGdlbmVyYXRlZCBjbGFzcyBiZWxvdyBpcwogICAgICBtYWRlLiBUaGUgbGlzdCBvZiBiZWhhdmlvcnMgd2FzIHByZXZpb3VzbHkgbWFkZSBpbnRvIG9uZSBnZW5lcmF0ZWQgY2xhc3MgcGVyCiAgICAgIGJlaGF2aW9yLCBidXQgdGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UgYXMgYmVoYXZpb3JzIGFyZSBub3cgY2FsbGVkCiAgICAgIG1hbnVhbGx5LiBOb3RlLCB0aGVyZSBtYXkgKnN0aWxsKiBiZSBtdWx0aXBsZSBnZW5lcmF0ZWQgY2xhc3NlcyBpbiB0aGUKICAgICAgZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbiBpZiBleHRlbnNpb24gaXMgdXNlZCB3aXRoIGBtaXhpbkJlaGF2aW9yc2AuCgogICAgICBUaGUgZ2VuZXJhdGVkIGNsYXNzIGlzIGRpcmVjdGx5IHRpZWQgdG8gdGhlIGluZm8gb2JqZWN0IGFuZCBiZWhhdmlvcnMKICAgICAgdXNlZCB0byBjcmVhdGUgaXQuIFRoYXQgbGlzdCBvZiBiZWhhdmlvcnMgaXMgZmlsdGVyZWQgc28gaXQncyBvbmx5IHRoZQogICAgICBiZWhhdmlvcnMgbm90IGFjdGl2ZSBvbiB0aGUgc3VwZXJjbGFzcy4gSW4gb3JkZXIgdG8gY2FsbCB0aHJvdWdoIHRvIHRoZQogICAgICBlbnRpcmUgbGlzdCBvZiBsaWZlY3ljbGUgbWV0aG9kcywgaXQncyBpbXBvcnRhbnQgdG8gY2FsbCBgc3VwZXJgLgoKICAgICAgVGhlIGVsZW1lbnQncyBgcHJvcGVydGllc2AgYW5kIGBvYnNlcnZlcnNgIGFyZSBjb250cm9sbGVkIHZpYSB0aGUgZmluYWxpemF0aW9uCiAgICAgIG1lY2hhbmlzbSBwcm92aWRlZCBieSBgUHJvcGVydGllc01peGluYC4gYFByb3BlcnRpZXNgIGFuZCBgb2JzZXJ2ZXJzYCBhcmUKICAgICAgY29sbGVjdGVkIGJ5IG1hbnVhbGx5IHRyYXZlcnNpbmcgdGhlIHByb3RvdHlwZSBjaGFpbiBhbmQgbWVyZ2luZy4KCiAgICAgIFRvIGxpbWl0IGNoYW5nZXMsIHRoZSBgX3JlZ2lzdGVyZWRgIG1ldGhvZCBpcyBjYWxsZWQgdmlhIGBfaW5pdGlhbGl6ZVByb3BlcnRpZXNgCiAgICAgIGFuZCBub3QgYF9maW5hbGl6ZUNsYXNzYC4KICAgICovCiAgICAvKioKICAgICAqIEBwYXJhbSB7IVBvbHltZXJJbml0fSBpbmZvIFBvbHltZXIgaW5mbyBvYmplY3QKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gQmFzZSBiYXNlIGNsYXNzIHRvIGV4dGVuZCB3aXRoIGluZm8gb2JqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gYmVoYXZpb3JzIGJlaGF2aW9ycyB0byBjb3B5IGludG8gdGhlIGVsZW1lbnQKICAgICAqIEByZXR1cm4ge2Z1bmN0aW9uKG5ldzpIVE1MRWxlbWVudCl9IEdlbmVyYXRlZCBjbGFzcwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gR2VuZXJhdGVDbGFzc0Zyb21JbmZvKGluZm8sIEJhc2UsIGJlaGF2aW9ycykgewoKICAgICAgLy8gbWFuYWdlcyBiZWhhdmlvciBhbmQgbGlmZWN5Y2xlIHByb2Nlc3NpbmcgKGZpbGxlZCBpbiBhZnRlciBjbGFzcyBkZWZpbml0aW9uKQogICAgICBsZXQgYmVoYXZpb3JMaXN0OwogICAgICBjb25zdCBsaWZlY3ljbGUgPSB7fTsKCiAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICBjbGFzcyBQb2x5bWVyR2VuZXJhdGVkIGV4dGVuZHMgQmFzZSB7CgogICAgICAgIC8vIGV4cGxpY2l0bHkgbm90IGNhbGxpbmcgc3VwZXIuX2ZpbmFsaXplQ2xhc3MKICAgICAgICBzdGF0aWMgX2ZpbmFsaXplQ2xhc3MoKSB7CiAgICAgICAgICAvLyBpZiBjYWxsaW5nIHZpYSBhIHN1YmNsYXNzIHRoYXQgaGFzbid0IGJlZW4gZ2VuZXJhdGVkLCBwYXNzIHRocm91Z2ggdG8gc3VwZXIKICAgICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSh3aW5kb3cuSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnZ2VuZXJhdGVkRnJvbScsIHRoaXMpKSkgewogICAgICAgICAgICBzdXBlci5fZmluYWxpemVDbGFzcygpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gaW50ZXJsZWF2ZSBwcm9wZXJ0aWVzIGFuZCBvYnNlcnZlcnMgcGVyIGJlaGF2aW9yIGFuZCBgaW5mb2AKICAgICAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MCwgYjsgaSA8IGJlaGF2aW9yTGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgYiA9IGJlaGF2aW9yTGlzdFtpXTsKICAgICAgICAgICAgICAgIGlmIChiLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVQcm9wZXJ0aWVzKGIucHJvcGVydGllcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYi5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVPYnNlcnZlcnMoYi5vYnNlcnZlcnMsIGIucHJvcGVydGllcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmZvLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMoaW5mby5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW5mby5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9ic2VydmVycyhpbmZvLm9ic2VydmVycywgaW5mby5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gcHJlcGFyZSB0aGUgZWxlbWVudCB0ZW1wbGF0ZQogICAgICAgICAgICB0aGlzLl9wcmVwYXJlVGVtcGxhdGUoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgIGlmIChiZWhhdmlvckxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCBiZWhhdmlvckxpc3RbaV0ucHJvcGVydGllcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcywgaW5mby5wcm9wZXJ0aWVzKTsKICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwogICAgICAgIH0KCiAgICAgICAgc3RhdGljIGdldCBvYnNlcnZlcnMoKSB7CiAgICAgICAgICBsZXQgb2JzZXJ2ZXJzID0gW107CiAgICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MCwgYjsgaSA8IGJlaGF2aW9yTGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGIgPSBiZWhhdmlvckxpc3RbaV07CiAgICAgICAgICAgICAgaWYgKGIub2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgICAgICBvYnNlcnZlcnMgPSBvYnNlcnZlcnMuY29uY2F0KGIub2JzZXJ2ZXJzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChpbmZvLm9ic2VydmVycykgewogICAgICAgICAgICBvYnNlcnZlcnMgPSBvYnNlcnZlcnMuY29uY2F0KGluZm8ub2JzZXJ2ZXJzKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBvYnNlcnZlcnM7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGNyZWF0ZWQoKSB7CiAgICAgICAgICBzdXBlci5jcmVhdGVkKCk7CiAgICAgICAgICBjb25zdCBsaXN0ID0gbGlmZWN5Y2xlLmNyZWF0ZWQ7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9yZWdpc3RlcmVkKCkgewogICAgICAgICAgLyogTk9URTogYGJlZm9yZVJlZ2lzdGVyYCBpcyBjYWxsZWQgaGVyZSBmb3IgYmMsIGJ1dCB0aGUgYmVoYXZpb3IKICAgICAgICAgICAgaXMgZGlmZmVyZW50IHRoYW4gaW4gMS54LiBJbiAxLjAsIHRoZSBtZXRob2Qgd2FzIGNhbGxlZCAqYWZ0ZXIqCiAgICAgICAgICAgIG1peGluZyBwcm90b3R5cGVzIHRvZ2V0aGVyIGJ1dCAqYmVmb3JlKiBwcm9jZXNzaW5nIG9mIG1ldGEtb2JqZWN0cy4KICAgICAgICAgICAgSG93ZXZlciwgZHluYW1pYyBlZmZlY3RzIGNhbiBzdGlsbCBiZSBzZXQgaGVyZSBhbmQgY2FuIGJlIGRvbmUgZWl0aGVyCiAgICAgICAgICAgIGluIGBiZWZvcmVSZWdpc3RlcmAgb3IgYHJlZ2lzdGVyZWRgLiBJdCBpcyBubyBsb25nZXIgcG9zc2libGUgdG8gc2V0CiAgICAgICAgICAgIGBpc2AgaW4gYGJlZm9yZVJlZ2lzdGVyYCBhcyB5b3UgY291bGQgaW4gMS54LgogICAgICAgICAgKi8KICAgICAgICAgIC8vIG9ubHkgcHJvY2VlZCBpZiB0aGUgZ2VuZXJhdGVkIGNsYXNzJyBwcm90b3R5cGUgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQuCiAgICAgICAgICBjb25zdCBnZW5lcmF0ZWRQcm90byA9IFBvbHltZXJHZW5lcmF0ZWQucHJvdG90eXBlOwogICAgICAgICAgaWYgKCFnZW5lcmF0ZWRQcm90by5oYXNPd25Qcm9wZXJ0eSgnX19oYXNSZWdpc3RlckZpbmlzaGVkJykpIHsKICAgICAgICAgICAgZ2VuZXJhdGVkUHJvdG8uX19oYXNSZWdpc3RlckZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgLy8gZW5zdXJlIHN1cGVyY2xhc3MgaXMgcmVnaXN0ZXJlZCBmaXJzdC4KICAgICAgICAgICAgc3VwZXIuX3JlZ2lzdGVyZWQoKTsKICAgICAgICAgICAgLy8gY29weSBwcm9wZXJ0aWVzIG9udG8gdGhlIGdlbmVyYXRlZCBjbGFzcyBsYXppbHkgaWYgd2UncmUgb3B0aW1pemluZywKICAgICAgICAgICAgaWYgKFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgICAgICAgICAgIGNvcHlQcm9wZXJ0aWVzVG9Qcm90byhnZW5lcmF0ZWRQcm90byk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGxlZ2FjeSBsaWZlY3ljbGUgaXMgY2FsbGVkIG9uIHRoZSAqZWxlbWVudConcyBwcm90b3R5cGUKICAgICAgICAgICAgLy8gYW5kIG5vdCB0aGUgZ2VuZXJhdGVkIGNsYXNzIHByb3RvdHlwZTsgaWYgdGhlIGVsZW1lbnQgaGFzIGJlZW4KICAgICAgICAgICAgLy8gZXh0ZW5kZWQsIHRoZXNlIGFyZSAqbm90KiB0aGUgc2FtZS4KICAgICAgICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmJlZm9yZVJlZ2lzdGVyOwogICAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGxpc3RbaV0uY2FsbChwcm90byk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpc3QgPSBsaWZlY3ljbGUucmVnaXN0ZXJlZDsKICAgICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwocHJvdG8pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfYXBwbHlMaXN0ZW5lcnMoKSB7CiAgICAgICAgICBzdXBlci5fYXBwbHlMaXN0ZW5lcnMoKTsKICAgICAgICAgIGNvbnN0IGxpc3QgPSBsaWZlY3ljbGUubGlzdGVuZXJzOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGxpc3RbaV07CiAgICAgICAgICAgICAgaWYgKGxpc3RlbmVycykgewogICAgICAgICAgICAgICAgZm9yIChsZXQgbCBpbiBsaXN0ZW5lcnMpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZSh0aGlzLCBsLCBsaXN0ZW5lcnNbbF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gbm90ZTogZXhjZXB0aW9uIHRvICJzdXBlciB0aGVuIG1lIiBydWxlOwogICAgICAgIC8vIGRvIHdvcmsgYmVmb3JlIGNhbGxpbmcgc3VwZXIgc28gdGhhdCBzdXBlciBhdHRyaWJ1dGVzCiAgICAgICAgLy8gb25seSBhcHBseSBpZiBub3QgYWxyZWFkeSBzZXQuCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfZW5zdXJlQXR0cmlidXRlcygpIHsKICAgICAgICAgIGNvbnN0IGxpc3QgPSBsaWZlY3ljbGUuaG9zdEF0dHJpYnV0ZXM7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPWxpc3QubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgY29uc3QgaG9zdEF0dHJpYnV0ZXMgPSBsaXN0W2ldOwogICAgICAgICAgICAgIGZvciAobGV0IGEgaW4gaG9zdEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5fZW5zdXJlQXR0cmlidXRlKGEsIGhvc3RBdHRyaWJ1dGVzW2FdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgc3VwZXIuX2Vuc3VyZUF0dHJpYnV0ZXMoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUucmVhZHk7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGF0dGFjaGVkKCkgewogICAgICAgICAgc3VwZXIuYXR0YWNoZWQoKTsKICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmF0dGFjaGVkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBkZXRhY2hlZCgpIHsKICAgICAgICAgIHN1cGVyLmRldGFjaGVkKCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5kZXRhY2hlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudHMgbmF0aXZlIEN1c3RvbSBFbGVtZW50cyBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0bwogICAgICAgICAqIHNldCBhbiBhdHRyaWJ1dGUgdmFsdWUgdG8gYSBwcm9wZXJ0eSB2aWEgYF9hdHRyaWJ1dGVUb1Byb3BlcnR5YC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlIHRoYXQgY2hhbmdlZAogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIE5ldyBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGF0dHJpYnV0ZUNoYW5nZWQobmFtZSwgb2xkLCB2YWx1ZSkgewogICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZCgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYXR0cmlidXRlQ2hhbmdlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcywgbmFtZSwgb2xkLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIGFwcGx5IGJlaGF2aW9ycywgbm90ZSBhY3R1YWwgY29weWluZyBpcyBkb25lIGxhemlseSBhdCBmaXJzdCBpbnN0YW5jZSBjcmVhdGlvbgogICAgICBpZiAoYmVoYXZpb3JzKSB7CiAgICAgICAgLy8gTk9URTogZW5zdXJlIHRoZSBiZWhhdmlvciBpcyBleHRlbmRpbmcgYSBjbGFzcyB3aXRoCiAgICAgICAgLy8gbGVnYWN5IGVsZW1lbnQgYXBpLiBUaGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSBiZWhhdmlvcnMgZXhwZWN0IHRvIGJlIGFibGUKICAgICAgICAvLyB0byBhY2Nlc3MgMS54IGxlZ2FjeSBhcGkuCiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGJlaGF2aW9ycykpIHsKICAgICAgICAgIGJlaGF2aW9ycyA9IFtiZWhhdmlvcnNdOwogICAgICAgIH0KICAgICAgICBsZXQgc3VwZXJCZWhhdmlvcnMgPSBCYXNlLnByb3RvdHlwZS5iZWhhdmlvcnM7CiAgICAgICAgLy8gZ2V0IGZsYXR0ZW5lZCwgZGVkdXBlZCBsaXN0IG9mIGJlaGF2aW9ycyAqbm90KiBhbHJlYWR5IG9uIHN1cGVyIGNsYXNzCiAgICAgICAgYmVoYXZpb3JMaXN0ID0gZmxhdHRlbkJlaGF2aW9ycyhiZWhhdmlvcnMsIG51bGwsIHN1cGVyQmVoYXZpb3JzKTsKICAgICAgICBQb2x5bWVyR2VuZXJhdGVkLnByb3RvdHlwZS5iZWhhdmlvcnMgPSBzdXBlckJlaGF2aW9ycyA/CiAgICAgICAgICBzdXBlckJlaGF2aW9ycy5jb25jYXQoYmVoYXZpb3JzKSA6IGJlaGF2aW9yTGlzdDsKICAgICAgfQoKICAgICAgY29uc3QgY29weVByb3BlcnRpZXNUb1Byb3RvID0gKHByb3RvKSA9PiB7CiAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgYXBwbHlCZWhhdmlvcnMocHJvdG8sIGJlaGF2aW9yTGlzdCwgbGlmZWN5Y2xlKTsKICAgICAgICB9CiAgICAgICAgYXBwbHlJbmZvKHByb3RvLCBpbmZvLCBsaWZlY3ljbGUsIGV4Y2x1ZGVPbkluZm8pOwogICAgICB9OwoKICAgICAgLy8gY29weSBwcm9wZXJ0aWVzIGlmIHdlJ3JlIG5vdCBvcHRpbWl6aW5nCiAgICAgIGlmICghUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgY29weVByb3BlcnRpZXNUb1Byb3RvKFBvbHltZXJHZW5lcmF0ZWQucHJvdG90eXBlKTsKICAgICAgfQoKICAgICAgUG9seW1lckdlbmVyYXRlZC5nZW5lcmF0ZWRGcm9tID0gaW5mbzsKCiAgICAgIHJldHVybiBQb2x5bWVyR2VuZXJhdGVkOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBleHRlbmRzIGBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRgIGJhc2VkIG9uIHRoZQogICAgICogcHJvdmlkZWQgaW5mbyBvYmplY3QuICBNZXRhZGF0YSBvYmplY3RzIG9uIHRoZSBgaW5mb2Agb2JqZWN0CiAgICAgKiAoYHByb3BlcnRpZXNgLCBgb2JzZXJ2ZXJzYCwgYGxpc3RlbmVyc2AsIGBiZWhhdmlvcnNgLCBgaXNgKSBhcmUgdXNlZAogICAgICogZm9yIFBvbHltZXIncyBtZXRhLXByb2dyYW1taW5nIHN5c3RlbXMsIGFuZCBhbnkgZnVuY3Rpb25zIGFyZSBjb3BpZWQKICAgICAqIHRvIHRoZSBnZW5lcmF0ZWQgY2xhc3MuCiAgICAgKgogICAgICogVmFsaWQgIm1ldGFkYXRhIiB2YWx1ZXMgYXJlIGFzIGZvbGxvd3M6CiAgICAgKgogICAgICogYGlzYDogU3RyaW5nIHByb3ZpZGluZyB0aGUgdGFnIG5hbWUgdG8gcmVnaXN0ZXIgdGhlIGVsZW1lbnQgdW5kZXIuIEluCiAgICAgKiBhZGRpdGlvbiwgaWYgYSBgZG9tLW1vZHVsZWAgd2l0aCB0aGUgc2FtZSBpZCBleGlzdHMsIHRoZSBmaXJzdCB0ZW1wbGF0ZQogICAgICogaW4gdGhhdCBgZG9tLW1vZHVsZWAgd2lsbCBiZSBzdGFtcGVkIGludG8gdGhlIHNoYWRvdyByb290IG9mIHRoaXMgZWxlbWVudCwKICAgICAqIHdpdGggc3VwcG9ydCBmb3IgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzIChgb24tLi4uYCksIFBvbHltZXIgZGF0YQogICAgICogYmluZGluZ3MgKGBbWy4uLl1dYCBhbmQgYHt7Li4ufX1gKSwgYW5kIGlkLWJhc2VkIG5vZGUgZmluZGluZyBpbnRvCiAgICAgKiBgdGhpcy4kYC4KICAgICAqCiAgICAgKiBgcHJvcGVydGllc2A6IE9iamVjdCBkZXNjcmliaW5nIHByb3BlcnR5LXJlbGF0ZWQgbWV0YWRhdGEgdXNlZCBieSBQb2x5bWVyCiAgICAgKiBmZWF0dXJlcyAoa2V5OiBwcm9wZXJ0eSBuYW1lcywgdmFsdWU6IG9iamVjdCBjb250YWluaW5nIHByb3BlcnR5IG1ldGFkYXRhKS4KICAgICAqIFZhbGlkIGtleXMgaW4gcGVyLXByb3BlcnR5IG1ldGFkYXRhIGluY2x1ZGU6CiAgICAgKiAtIGB0eXBlYCAoU3RyaW5nfE51bWJlcnxPYmplY3R8QXJyYXl8Li4uKTogVXNlZCBieQogICAgICogICBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0byBkZXRlcm1pbmUgaG93IHN0cmluZy1iYXNlZCBhdHRyaWJ1dGVzCiAgICAgKiAgIGFyZSBkZXNlcmlhbGl6ZWQgdG8gSmF2YVNjcmlwdCBwcm9wZXJ0eSB2YWx1ZXMuCiAgICAgKiAtIGBub3RpZnlgIChib29sZWFuKTogQ2F1c2VzIGEgY2hhbmdlIGluIHRoZSBwcm9wZXJ0eSB0byBmaXJlIGEKICAgICAqICAgbm9uLWJ1YmJsaW5nIGV2ZW50IGNhbGxlZCBgPHByb3BlcnR5Pi1jaGFuZ2VkYC4gRWxlbWVudHMgdGhhdCBoYXZlCiAgICAgKiAgIGVuYWJsZWQgdHdvLXdheSBiaW5kaW5nIHRvIHRoZSBwcm9wZXJ0eSB1c2UgdGhpcyBldmVudCB0byBvYnNlcnZlIGNoYW5nZXMuCiAgICAgKiAtIGByZWFkT25seWAgKGJvb2xlYW4pOiBDcmVhdGVzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIGJ1dCBubyBzZXR0ZXIuCiAgICAgKiAgIFRvIHNldCBhIHJlYWQtb25seSBwcm9wZXJ0eSwgdXNlIHRoZSBwcml2YXRlIHNldHRlciBtZXRob2QKICAgICAqICAgYF9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpYC4KICAgICAqIC0gYG9ic2VydmVyYCAoc3RyaW5nKTogT2JzZXJ2ZXIgbWV0aG9kIG5hbWUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCiAgICAgKiAgIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlCiAgICAgKiAgIGAodmFsdWUsIHByZXZpb3VzVmFsdWUpYC4KICAgICAqIC0gYGNvbXB1dGVkYCAoc3RyaW5nKTogU3RyaW5nIGRlc2NyaWJpbmcgbWV0aG9kIGFuZCBkZXBlbmRlbnQgcHJvcGVydGllcwogICAgICogICBmb3IgY29tcHV0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IChlLmcuIGAnY29tcHV0ZUZvbyhiYXIsIHpvdCknYCkuCiAgICAgKiAgIENvbXB1dGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBieSBkZWZhdWx0IGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkCiAgICAgKiAgIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjb21wdXRpbmcgbWV0aG9kLgogICAgICoKICAgICAqIGBvYnNlcnZlcnNgOiBBcnJheSBvZiBzdHJpbmdzIGRlc2NyaWJpbmcgbXVsdGktcHJvcGVydHkgb2JzZXJ2ZXIgbWV0aG9kcwogICAgICogIGFuZCB0aGVpciBkZXBlbmRlbnQgcHJvcGVydGllcyAoZS5nLiBgJ29ic2VydmVBQkMoYSwgYiwgYyknYCkuCiAgICAgKgogICAgICogYGxpc3RlbmVyc2A6IE9iamVjdCBkZXNjcmliaW5nIGV2ZW50IGxpc3RlbmVycyB0byBiZSBhZGRlZCB0byBlYWNoCiAgICAgKiAgaW5zdGFuY2Ugb2YgdGhpcyBlbGVtZW50IChrZXk6IGV2ZW50IG5hbWUsIHZhbHVlOiBtZXRob2QgbmFtZSkuCiAgICAgKgogICAgICogYGJlaGF2aW9yc2A6IEFycmF5IG9mIGFkZGl0aW9uYWwgYGluZm9gIG9iamVjdHMgY29udGFpbmluZyBtZXRhZGF0YQogICAgICogYW5kIGNhbGxiYWNrcyBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIGBpbmZvYCBvYmplY3QgaGVyZSB3aGljaCBhcmUKICAgICAqIG1lcmdlZCBpbnRvIHRoaXMgZWxlbWVudC4KICAgICAqCiAgICAgKiBgaG9zdEF0dHJpYnV0ZXNgOiBPYmplY3QgbGlzdGluZyBhdHRyaWJ1dGVzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGhvc3QKICAgICAqICBvbmNlIGNyZWF0ZWQgKGtleTogYXR0cmlidXRlIG5hbWUsIHZhbHVlOiBhdHRyaWJ1dGUgdmFsdWUpLiAgVmFsdWVzCiAgICAgKiAgYXJlIHNlcmlhbGl6ZWQgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIHZhbHVlLiAgSG9zdCBhdHRyaWJ1dGVzIHNob3VsZAogICAgICogIGdlbmVyYWxseSBiZSBsaW1pdGVkIHRvIGF0dHJpYnV0ZXMgc3VjaCBhcyBgdGFiSW5kZXhgIGFuZCBgYXJpYS0uLi5gLgogICAgICogIEF0dHJpYnV0ZXMgaW4gYGhvc3RBdHRyaWJ1dGVzYCBhcmUgb25seSBhcHBsaWVkIGlmIGEgdXNlci1zdXBwbGllZAogICAgICogIGF0dHJpYnV0ZSBpcyBub3QgYWxyZWFkeSBwcmVzZW50IChhdHRyaWJ1dGVzIGluIG1hcmt1cCBvdmVycmlkZQogICAgICogIGBob3N0QXR0cmlidXRlc2ApLgogICAgICoKICAgICAqIEluIGFkZGl0aW9uLCB0aGUgZm9sbG93aW5nIFBvbHltZXItc3BlY2lmaWMgY2FsbGJhY2tzIG1heSBiZSBwcm92aWRlZDoKICAgICAqIC0gYHJlZ2lzdGVyZWRgOiBjYWxsZWQgYWZ0ZXIgZmlyc3QgaW5zdGFuY2Ugb2YgdGhpcyBlbGVtZW50LAogICAgICogLSBgY3JlYXRlZGA6IGNhbGxlZCBkdXJpbmcgYGNvbnN0cnVjdG9yYAogICAgICogLSBgYXR0YWNoZWRgOiBjYWxsZWQgZHVyaW5nIGBjb25uZWN0ZWRDYWxsYmFja2AKICAgICAqIC0gYGRldGFjaGVkYDogY2FsbGVkIGR1cmluZyBgZGlzY29ubmVjdGVkQ2FsbGJhY2tgCiAgICAgKiAtIGByZWFkeWA6IGNhbGxlZCBiZWZvcmUgZmlyc3QgYGF0dGFjaGVkYCwgYWZ0ZXIgYWxsIHByb3BlcnRpZXMgb2YKICAgICAqICAgdGhpcyBlbGVtZW50IGhhdmUgYmVlbiBwcm9wYWdhdGVkIHRvIGl0cyB0ZW1wbGF0ZSBhbmQgYWxsIG9ic2VydmVycwogICAgICogICBoYXZlIHJ1bgogICAgICoKICAgICAqIEBwYXJhbSB7IVBvbHltZXJJbml0fSBpbmZvIE9iamVjdCBjb250YWluaW5nIFBvbHltZXIgbWV0YWRhdGEgYW5kIGZ1bmN0aW9ucwogICAgICogICB0byBiZWNvbWUgY2xhc3MgbWV0aG9kcy4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFQpOlR9IG1peGluIE9wdGlvbmFsIG1peGluIHRvIGFwcGx5IHRvIGxlZ2FjeSBiYXNlIGNsYXNzCiAgICAgKiAgIGJlZm9yZSBleHRlbmRpbmcgd2l0aCBQb2x5bWVyIG1ldGFwcm9ncmFtbWluZy4KICAgICAqIEByZXR1cm4ge2Z1bmN0aW9uKG5ldzpIVE1MRWxlbWVudCl9IEdlbmVyYXRlZCBjbGFzcwogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqLwogICAgUG9seW1lci5DbGFzcyA9IGZ1bmN0aW9uKGluZm8sIG1peGluKSB7CiAgICAgIGlmICghaW5mbykgewogICAgICAgIGNvbnNvbGUud2FybignUG9seW1lci5DbGFzcyByZXF1aXJlcyBgaW5mb2AgYXJndW1lbnQnKTsKICAgICAgfQogICAgICBsZXQga2xhc3MgPSBtaXhpbiA/IG1peGluKFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKEhUTUxFbGVtZW50KSkgOgogICAgICAgICAgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW4oSFRNTEVsZW1lbnQpOwogICAgICBrbGFzcyA9IEdlbmVyYXRlQ2xhc3NGcm9tSW5mbyhpbmZvLCBrbGFzcywgaW5mby5iZWhhdmlvcnMpOwogICAgICBpZiAoaW5mby5fZW5hYmxlRGlzYWJsZVVwZ3JhZGUpIHsKICAgICAgICBrbGFzcyA9IFBvbHltZXIuRGlzYWJsZVVwZ3JhZGVNaXhpbihrbGFzcyk7CiAgICAgIH0KICAgICAgLy8gZGVjb3JhdGUga2xhc3Mgd2l0aCByZWdpc3RyYXRpb24gaW5mbwogICAgICBrbGFzcy5pcyA9IGtsYXNzLnByb3RvdHlwZS5pcyA9IGluZm8uaXM7CiAgICAgIHJldHVybiBrbGFzczsKICAgIH07CgogICAgUG9seW1lci5taXhpbkJlaGF2aW9ycyA9IG1peGluQmVoYXZpb3JzOwoKICB9KSgpOwoKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqCiAgICAgKiBMZWdhY3kgY2xhc3MgZmFjdG9yeSBhbmQgcmVnaXN0cmF0aW9uIGhlbHBlciBmb3IgZGVmaW5pbmcgUG9seW1lcgogICAgICogZWxlbWVudHMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0bwogICAgICogYGN1c3RvbUVsZW1lbnRzLmRlZmluZShpbmZvLmlzLCBQb2x5bWVyLkNsYXNzKGluZm8pKTtgCiAgICAgKgogICAgICogU2VlIGBQb2x5bWVyLkNsYXNzYCBmb3IgZGV0YWlscyBvbiB2YWxpZCBsZWdhY3kgbWV0YWRhdGEgZm9ybWF0IGZvciBgaW5mb2AuCiAgICAgKgogICAgICogQGdsb2JhbAogICAgICogQG92ZXJyaWRlCiAgICAgKiBAZnVuY3Rpb24gUG9seW1lcgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gT2JqZWN0IGNvbnRhaW5pbmcgUG9seW1lciBtZXRhZGF0YSBhbmQgZnVuY3Rpb25zCiAgICAgKiAgIHRvIGJlY29tZSBjbGFzcyBtZXRob2RzLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OiBIVE1MRWxlbWVudCl9IEdlbmVyYXRlZCBjbGFzcwogICAgICogQHN1cHByZXNzIHtkdXBsaWNhdGUsIGludmFsaWRDYXN0cywgY2hlY2tUeXBlc30KICAgICAqLwogICAgd2luZG93LlBvbHltZXIuX3BvbHltZXJGbiA9IGZ1bmN0aW9uKGluZm8pIHsKICAgICAgLy8gaWYgaW5wdXQgaXMgYSBgY2xhc3NgIChha2EgYSBmdW5jdGlvbiB3aXRoIGEgcHJvdG90eXBlKSwgdXNlIHRoZSBwcm90b3R5cGUKICAgICAgLy8gcmVtZW1iZXIgdGhhdCB0aGUgYGNvbnN0cnVjdG9yYCB3aWxsIG5ldmVyIGJlIGNhbGxlZAogICAgICBsZXQga2xhc3M7CiAgICAgIGlmICh0eXBlb2YgaW5mbyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGtsYXNzID0gaW5mbzsKICAgICAgfSBlbHNlIHsKICAgICAgICBrbGFzcyA9IFBvbHltZXIuQ2xhc3MoaW5mbyk7CiAgICAgIH0KICAgICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGtsYXNzLmlzLCAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oa2xhc3MpKTsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8gQ29tbW9uIGltcGxlbWVudGF0aW9uIGZvciBtaXhpbiAmIGJlaGF2aW9yCiAgZnVuY3Rpb24gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKGluc3QsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCBtdXRhYmxlRGF0YSkgewogICAgbGV0IGlzT2JqZWN0OwogICAgaWYgKG11dGFibGVEYXRhKSB7CiAgICAgIGlzT2JqZWN0ID0gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpOwogICAgICAvLyBQdWxsIGBvbGRgIGZvciBPYmplY3RzIGZyb20gdGVtcCBjYWNoZSwgYnV0IHRyZWF0IGBudWxsYCBhcyBhIHByaW1pdGl2ZQogICAgICBpZiAoaXNPYmplY3QpIHsKICAgICAgICBvbGQgPSBpbnN0Ll9fZGF0YVRlbXBbcHJvcGVydHldOwogICAgICB9CiAgICB9CiAgICAvLyBTdHJpY3QgZXF1YWxpdHkgY2hlY2ssIGJ1dCByZXR1cm4gZmFsc2UgZm9yIE5hTj09PU5hTgogICAgbGV0IHNob3VsZENoYW5nZSA9IChvbGQgIT09IHZhbHVlICYmIChvbGQgPT09IG9sZCB8fCB2YWx1ZSA9PT0gdmFsdWUpKTsKICAgIC8vIE9iamVjdHMgYXJlIHN0b3JlZCBpbiB0ZW1wb3JhcnkgY2FjaGUgKGNsZWFyZWQgYXQgZW5kIG9mCiAgICAvLyB0dXJuKSwgd2hpY2ggaXMgdXNlZCBmb3IgZGlydHktY2hlY2tpbmcKICAgIGlmIChpc09iamVjdCAmJiBzaG91bGRDaGFuZ2UpIHsKICAgICAgaW5zdC5fX2RhdGFUZW1wW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIHNob3VsZENoYW5nZTsKICB9CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAqIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKSwgZm9yIHVzZSBvbiBlbGVtZW50cyB1dGlsaXppbmcKICAgKiBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGNhdXNlIFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBhcHBseSB0aGlzIG1peGluIG9yIGVuYWJsZSB0aGUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhYCBtaXhpbi4KICAgKgogICAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIGRpcnR5IGNoZWNrIHN0cmF0ZWd5IGNvbmZpZ3VyYWJsZSwgc2VlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YWAuCiAgICoKICAgKiBOb3RlLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIHByb3BhZ2F0aW5nIGxhcmdlIG9iamVjdCBncmFwaHMKICAgKiB3aWxsIGJlIHdvcnNlIGFzIG9wcG9zZWQgdG8gdXNpbmcgc3RyaWN0IGRpcnR5IGNoZWNraW5nIHdpdGggaW1tdXRhYmxlCiAgICogcGF0dGVybnMgb3IgUG9seW1lcidzIHBhdGggbm90aWZpY2F0aW9uIEFQSS4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMKICAgKiAgIGFuZCBhcnJheXMKICAgKi8KICBQb2x5bWVyLk11dGFibGVEYXRhID0gUG9seW1lci5kZWR1cGluZ01peGluKHN1cGVyQ2xhc3MgPT4gewoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9NdXRhYmxlRGF0YX0KICAgICAqLwogICAgY2xhc3MgTXV0YWJsZURhdGEgZXh0ZW5kcyBzdXBlckNsYXNzIHsKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHByb3ZpZGUgb3B0aW9uIGZvciBza2lwcGluZwogICAgICAgKiBzdHJpY3QgZXF1YWxpdHkgY2hlY2tpbmcgZm9yIE9iamVjdHMgYW5kIEFycmF5cy4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgcHVsbHMgdGhlIHZhbHVlIHRvIGRpcnR5IGNoZWNrIGFnYWluc3QgZnJvbSB0aGUgYF9fZGF0YVRlbXBgCiAgICAgICAqIGNhY2hlIChyYXRoZXIgdGhhbiB0aGUgbm9ybWFsIGBfX2RhdGFgIGNhY2hlKSBmb3IgT2JqZWN0cy4gIFNpbmNlIHRoZSB0ZW1wCiAgICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgICAqIHNpZGUtZWZmZWN0cyBvZiBkZWVwIG9iamVjdCBjaGFuZ2VzIHRvIGJlIHByb2Nlc3NlZCBieSByZS1zZXR0aW5nIHRoZQogICAgICAgKiBzYW1lIG9iamVjdCAodXNpbmcgdGhlIHRlbXAgY2FjaGUgYXMgYW4gaW4tdHVybiBiYWNrc3RvcCB0byBwcmV2ZW50CiAgICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAgICogQHBhcmFtIHsqfSBvbGQgUHJldmlvdXMgcHJvcGVydHkgdmFsdWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBjaGFuZ2UKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKSB7CiAgICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdHJ1ZSk7CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIE11dGFibGVEYXRhOwoKICB9KTsKCgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdG8gYWRkIHRoZSBvcHRpb25hbCBhYmlsaXR5IHRvIHNraXAgc3RyaWN0CiAgICogZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgKiAiZGlydHkiKSBieSBzZXR0aW5nIGEgYG11dGFibGUtZGF0YWAgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgaW5zdGFuY2UuCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBlbmFibGUgdGhpcyBtaXhpbiBvciBhcHBseSB0aGUKICAgKiBgUG9seW1lci5NdXRhYmxlRGF0YWAgbWl4aW4uCiAgICoKICAgKiBXaGlsZSB0aGlzIG1peGluIGFkZHMgdGhlIGFiaWxpdHkgdG8gZm9yZ28gT2JqZWN0L0FycmF5IGRpcnR5IGNoZWNraW5nLAogICAqIHRoZSBgbXV0YWJsZURhdGFgIGZsYWcgZGVmYXVsdHMgdG8gZmFsc2UgYW5kIG11c3QgYmUgc2V0IG9uIHRoZSBpbnN0YW5jZS4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYnkgcmVseWluZyBvbiBgbXV0YWJsZURhdGE6IHRydWVgIGFzIG9wcG9zZWQgdG8gdXNpbmcKICAgKiBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUgcGF0dGVybnMgb3IgUG9seW1lcidzIHBhdGggbm90aWZpY2F0aW9uCiAgICogQVBJLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0byBvcHRpb25hbGx5IHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nCiAgICogICBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICovCiAgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhID0gUG9seW1lci5kZWR1cGluZ01peGluKHN1cGVyQ2xhc3MgPT4gewoKICAgIC8qKgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAgICovCiAgICBjbGFzcyBPcHRpb25hbE11dGFibGVEYXRhIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogSW5zdGFuY2UtbGV2ZWwgZmxhZyBmb3IgY29uZmlndXJpbmcgdGhlIGRpcnR5LWNoZWNraW5nIHN0cmF0ZWd5CiAgICAgICAgICAgKiBmb3IgdGhpcyBlbGVtZW50LiAgV2hlbiB0cnVlLCBPYmplY3RzIGFuZCBBcnJheXMgd2lsbCBza2lwIGRpcnR5CiAgICAgICAgICAgKiBjaGVja2luZywgb3RoZXJ3aXNlIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyB3aWxsIGJlIHVzZWQuCiAgICAgICAgICAgKi8KICAgICAgICAgIG11dGFibGVEYXRhOiBCb29sZWFuCiAgICAgICAgfTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHByb3ZpZGUgb3B0aW9uIGZvciBza2lwcGluZwogICAgICAgKiBzdHJpY3QgZXF1YWxpdHkgY2hlY2tpbmcgZm9yIE9iamVjdHMgYW5kIEFycmF5cy4KICAgICAgICoKICAgICAgICogV2hlbiBgdGhpcy5tdXRhYmxlRGF0YWAgaXMgdHJ1ZSBvbiB0aGlzIGluc3RhbmNlLCB0aGlzIG1ldGhvZAogICAgICAgKiBwdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAgY2FjaGUKICAgICAgICogKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAgICogY2FjaGUgaXMgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIGEgdHVybiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MKICAgICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAgICogY3ljbGVzIGR1ZSB0byAyLXdheSBub3RpZmljYXRpb24pLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0aGlzLm11dGFibGVEYXRhKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBPcHRpb25hbE11dGFibGVEYXRhOwoKICB9KTsKCiAgLy8gRXhwb3J0IGZvciB1c2UgYnkgbGVnYWN5IGJlaGF2aW9yCiAgUG9seW1lci5NdXRhYmxlRGF0YS5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlID0gbXV0YWJsZVByb3BlcnR5Q2hhbmdlOwoKfSkoKTsKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBCYXNlIGNsYXNzIGZvciBIVE1MVGVtcGxhdGVFbGVtZW50IGV4dGVuc2lvbiB0aGF0IGhhcyBwcm9wZXJ0eSBlZmZlY3RzCiAgICAvLyBtYWNoaW5lcnkgZm9yIHByb3BhZ2F0aW5nIGhvc3QgcHJvcGVydGllcyB0byBjaGlsZHJlbi4gVGhpcyBpcyBhbiBFUzUKICAgIC8vIGNsYXNzIG9ubHkgYmVjYXVzZSBCYWJlbCAoaW5jb3JyZWN0bHkpIHJlcXVpcmVzIHN1cGVyKCkgaW4gdGhlIGNsYXNzCiAgICAvLyBjb25zdHJ1Y3RvciBldmVuIHRob3VnaCBubyBgdGhpc2AgaXMgdXNlZCBhbmQgaXQgcmV0dXJucyBhbiBpbnN0YW5jZS4KICAgIGxldCBuZXdJbnN0YW5jZSA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtIVE1MVGVtcGxhdGVFbGVtZW50fQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gSFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbigpIHsgcmV0dXJuIG5ld0luc3RhbmNlOyB9CiAgICBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSFRNTFRlbXBsYXRlRWxlbWVudC5wcm90b3R5cGUsIHsKICAgICAgY29uc3RydWN0b3I6IHsKICAgICAgICB2YWx1ZTogSFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbiwKICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICB9CiAgICB9KTsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydHlFZmZlY3RzfQogICAgICogQGV4dGVuZHMge0hUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb259CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBEYXRhVGVtcGxhdGUgPSBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uKTsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfTXV0YWJsZURhdGF9CiAgICAgKiBAZXh0ZW5kcyB7RGF0YVRlbXBsYXRlfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgTXV0YWJsZURhdGFUZW1wbGF0ZSA9IFBvbHltZXIuTXV0YWJsZURhdGEoRGF0YVRlbXBsYXRlKTsKCiAgICAvLyBBcHBsaWVzIGEgRGF0YVRlbXBsYXRlIHN1YmNsYXNzIHRvIGEgPHRlbXBsYXRlPiBpbnN0YW5jZQogICAgZnVuY3Rpb24gdXBncmFkZVRlbXBsYXRlKHRlbXBsYXRlLCBjb25zdHJ1Y3RvcikgewogICAgICBuZXdJbnN0YW5jZSA9IHRlbXBsYXRlOwogICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGVtcGxhdGUsIGNvbnN0cnVjdG9yLnByb3RvdHlwZSk7CiAgICAgIG5ldyBjb25zdHJ1Y3RvcigpOwogICAgICBuZXdJbnN0YW5jZSA9IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBCYXNlIGNsYXNzIGZvciBUZW1wbGF0ZUluc3RhbmNlLgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBiYXNlID0gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMoY2xhc3Mge30pOwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBjdXN0b21FbGVtZW50CiAgICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydHlFZmZlY3RzCiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFRlbXBsYXRlSW5zdGFuY2VCYXNlIGV4dGVuZHMgYmFzZSB7CiAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9jb25maWd1cmVQcm9wZXJ0aWVzKHByb3BzKTsKICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLl9zdGFtcFRlbXBsYXRlKHRoaXMuX19kYXRhSG9zdCk7CiAgICAgICAgLy8gU2F2ZSBsaXN0IG9mIHN0YW1wZWQgY2hpbGRyZW4KICAgICAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuID0gW107CiAgICAgICAgZm9yIChsZXQgbiA9IHRoaXMucm9vdC5maXJzdENoaWxkOyBuOyBuPW4ubmV4dFNpYmxpbmcpIHsKICAgICAgICAgIGNoaWxkcmVuLnB1c2gobik7CiAgICAgICAgICBuLl9fdGVtcGxhdGl6ZUluc3RhbmNlID0gdGhpczsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX190ZW1wbGF0aXplT3duZXIgJiYKICAgICAgICAgIHRoaXMuX190ZW1wbGF0aXplT3duZXIuX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fKSB7CiAgICAgICAgICB0aGlzLl9zaG93SGlkZUNoaWxkcmVuKHRydWUpOwogICAgICAgIH0KICAgICAgICAvLyBGbHVzaCBwcm9wcyBvbmx5IHdoZW4gcHJvcHMgYXJlIHBhc3NlZCBpZiBpbnN0YW5jZSBwcm9wcyBleGlzdAogICAgICAgIC8vIG9yIHdoZW4gdGhlcmUgaXNuJ3QgaW5zdGFuY2UgcHJvcHMuCiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnM7CiAgICAgICAgaWYgKChwcm9wcyAmJiBvcHRpb25zLmluc3RhbmNlUHJvcHMpIHx8ICFvcHRpb25zLmluc3RhbmNlUHJvcHMpIHsKICAgICAgICAgIHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENvbmZpZ3VyZSB0aGUgZ2l2ZW4gYHByb3BzYCBieSBjYWxsaW5nIGBfc2V0UGVuZGluZ1Byb3BlcnR5YC4gQWxzbwogICAgICAgKiBzZXRzIGFueSBwcm9wZXJ0aWVzIHN0b3JlZCBpbiBgX19ob3N0UHJvcHNgLgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgT2JqZWN0IG9mIHByb3BlcnR5IG5hbWUtdmFsdWUgcGFpcnMgdG8gc2V0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2NvbmZpZ3VyZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMuX190ZW1wbGF0aXplT3B0aW9uczsKICAgICAgICBpZiAob3B0aW9ucy5mb3J3YXJkSG9zdFByb3ApIHsKICAgICAgICAgIGZvciAobGV0IGhwcm9wIGluIHRoaXMuX19ob3N0UHJvcHMpIHsKICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KGhwcm9wLCB0aGlzLl9fZGF0YUhvc3RbJ19ob3N0XycgKyBocHJvcF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBBbnkgaW5zdGFuY2UgcHJvcHMgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvciB3aWxsIG92ZXJ3cml0ZSBob3N0IHByb3BzOwogICAgICAgIC8vIG5vcm1hbGx5IHRoaXMgd291bGQgYmUgYSB1c2VyIGVycm9yIGJ1dCB3ZSBkb24ndCBzcGVjaWZpY2FsbHkgZmlsdGVyIHRoZW0KICAgICAgICBmb3IgKGxldCBpcHJvcCBpbiBwcm9wcykgewogICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KGlwcm9wLCBwcm9wc1tpcHJvcF0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRm9yd2FyZHMgYSBob3N0IHByb3BlcnR5IHRvIHRoaXMgaW5zdGFuY2UuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUKICAgICAgICogY2FsbGVkIG9uIGluc3RhbmNlcyBmcm9tIHRoZSBgb3B0aW9ucy5mb3J3YXJkSG9zdFByb3BgIGNhbGxiYWNrCiAgICAgICAqIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIG9mIGhvc3QgcHJvcGVydGllcyB0byBlYWNoIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoaXMgbWV0aG9kIGVucXVldWVzIHRoZSBjaGFuZ2UsIHdoaWNoIGFyZSBmbHVzaGVkIGFzIGEgYmF0Y2guCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG9yIHBhdGggbmFtZQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBmb3J3YXJkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBmb3J3YXJkSG9zdFByb3AocHJvcCwgdmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHByb3AsIHZhbHVlLCBmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgIHRoaXMuX19kYXRhSG9zdC5fZW5xdWV1ZUNsaWVudCh0aGlzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZSBwb2ludCBmb3IgYWRkaW5nIGN1c3RvbSBvciBzaW11bGF0ZWQgZXZlbnQgaGFuZGxpbmcuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIGFkZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKHRoaXMuX21ldGhvZEhvc3QgJiYgdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zLnBhcmVudE1vZGVsKSB7CiAgICAgICAgICAvLyBJZiB0aGlzIGluc3RhbmNlIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgcGFyZW50IG1vZGVsLCBkZWNvcmF0ZQogICAgICAgICAgLy8gZXZlbnRzIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UgYXMgYG1vZGVsYAogICAgICAgICAgdGhpcy5fbWV0aG9kSG9zdC5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIChlKSA9PiB7CiAgICAgICAgICAgIGUubW9kZWwgPSB0aGlzOwogICAgICAgICAgICBoYW5kbGVyKGUpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSBkZWxlZ2F0ZSB0byB0aGUgdGVtcGxhdGUncyBob3N0ICh3aGljaCBjb3VsZCBiZSkKICAgICAgICAgIC8vIGFub3RoZXIgdGVtcGxhdGUgaW5zdGFuY2UKICAgICAgICAgIGxldCB0ZW1wbGF0ZUhvc3QgPSB0aGlzLl9fZGF0YUhvc3QuX19kYXRhSG9zdDsKICAgICAgICAgIGlmICh0ZW1wbGF0ZUhvc3QpIHsKICAgICAgICAgICAgdGVtcGxhdGVIb3N0Ll9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBTaG93cyBvciBoaWRlcyB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdG9wIGxldmVsIGNoaWxkIGVsZW1lbnRzLiBGb3IKICAgICAgICogdGV4dCBub2RlcywgYHRleHRDb250ZW50YCBpcyByZW1vdmVkIHdoaWxlICJoaWRkZW4iIGFuZCByZXBsYWNlZCB3aGVuCiAgICAgICAqICJzaG93bi4iCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGlkZSBTZXQgdG8gdHJ1ZSB0byBoaWRlIHRoZSBjaGlsZHJlbjsKICAgICAgICogc2V0IHRvIGZhbHNlIHRvIHNob3cgdGhlbS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3Nob3dIaWRlQ2hpbGRyZW4oaGlkZSkgewogICAgICAgIGxldCBjID0gdGhpcy5jaGlsZHJlbjsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8Yy5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IG4gPSBjW2ldOwogICAgICAgICAgLy8gSWdub3JlIG5vbi1jaGFuZ2VzCiAgICAgICAgICBpZiAoQm9vbGVhbihoaWRlKSAhPSBCb29sZWFuKG4uX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fKSkgewogICAgICAgICAgICBpZiAobi5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgICAgICAgICBpZiAoaGlkZSkgewogICAgICAgICAgICAgICAgbi5fX3BvbHltZXJUZXh0Q29udGVudF9fID0gbi50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgIG4udGV4dENvbnRlbnQgPSAnJzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbi50ZXh0Q29udGVudCA9IG4uX19wb2x5bWVyVGV4dENvbnRlbnRfXzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHJlbW92ZSBhbmQgcmVwbGFjZSBzbG90CiAgICAgICAgICAgIH0gZWxzZSBpZiAobi5sb2NhbE5hbWUgPT09ICdzbG90JykgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lclJlcGxhY2VkX18gPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCdoaWRkZW4tc2xvdCcpOwogICAgICAgICAgICAgICAgbi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuLl9fcG9seW1lclJlcGxhY2VkX18sIG4pOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlID0gbi5fX3BvbHltZXJSZXBsYWNlZF9fOwogICAgICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHsKICAgICAgICAgICAgICAgICAgcmVwbGFjZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuLCByZXBsYWNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2UgaWYgKG4uc3R5bGUpIHsKICAgICAgICAgICAgICBpZiAoaGlkZSkgewogICAgICAgICAgICAgICAgbi5fX3BvbHltZXJEaXNwbGF5X18gPSBuLnN0eWxlLmRpc3BsYXk7CiAgICAgICAgICAgICAgICBuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG4uc3R5bGUuZGlzcGxheSA9IG4uX19wb2x5bWVyRGlzcGxheV9fOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbi5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18gPSBoaWRlOwogICAgICAgICAgaWYgKG4uX3Nob3dIaWRlQ2hpbGRyZW4pIHsKICAgICAgICAgICAgbi5fc2hvd0hpZGVDaGlsZHJlbihoaWRlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IHByb3BlcnR5LWVmZmVjdHMgaW1wbGVtZW50YXRpb24gdG8gaW50ZXJjZXB0CiAgICAgICAqIHRleHRDb250ZW50IGJpbmRpbmdzIHdoaWxlIGNoaWxkcmVuIGFyZSAiaGlkZGVuIiBhbmQgY2FjaGUgaW4KICAgICAgICogcHJpdmF0ZSBzdG9yYWdlIGZvciBsYXRlciByZXRyaWV2YWwuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgVGhlIG5vZGUgdG8gc2V0IGEgcHJvcGVydHkgb24KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgVGhlIHByb3BlcnR5IHRvIHNldAogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3NldFVubWFuYWdlZFByb3BlcnR5VG9Ob2RlKG5vZGUsIHByb3AsIHZhbHVlKSB7CiAgICAgICAgaWYgKG5vZGUuX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fICYmCiAgICAgICAgICAgIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUgJiYgcHJvcCA9PSAndGV4dENvbnRlbnQnKSB7CiAgICAgICAgICBub2RlLl9fcG9seW1lclRleHRDb250ZW50X18gPSB2YWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3VwZXIuX3NldFVubWFuYWdlZFByb3BlcnR5VG9Ob2RlKG5vZGUsIHByb3AsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEZpbmQgdGhlIHBhcmVudCBtb2RlbCBvZiB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLiAgVGhlIHBhcmVudCBtb2RlbAogICAgICAgKiBpcyBlaXRoZXIgYW5vdGhlciB0ZW1wbGF0aXplIGluc3RhbmNlIHRoYXQgaGFkIG9wdGlvbiBgcGFyZW50TW9kZWw6IHRydWVgLAogICAgICAgKiBvciBlbHNlIHRoZSBob3N0IGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4geyFQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gVGhlIHBhcmVudCBtb2RlbCBvZiB0aGlzIGluc3RhbmNlCiAgICAgICAqLwogICAgICBnZXQgcGFyZW50TW9kZWwoKSB7CiAgICAgICAgbGV0IG1vZGVsID0gdGhpcy5fX3BhcmVudE1vZGVsOwogICAgICAgIGlmICghbW9kZWwpIHsKICAgICAgICAgIGxldCBvcHRpb25zOwogICAgICAgICAgbW9kZWwgPSB0aGlzOwogICAgICAgICAgZG8gewogICAgICAgICAgICAvLyBBIHRlbXBsYXRlIGluc3RhbmNlJ3MgYF9fZGF0YUhvc3RgIGlzIGEgPHRlbXBsYXRlPgogICAgICAgICAgICAvLyBgbW9kZWwuX19kYXRhSG9zdC5fX2RhdGFIb3N0YCBpcyB0aGUgdGVtcGxhdGUncyBob3N0CiAgICAgICAgICAgIG1vZGVsID0gbW9kZWwuX19kYXRhSG9zdC5fX2RhdGFIb3N0OwogICAgICAgICAgfSB3aGlsZSAoKG9wdGlvbnMgPSBtb2RlbC5fX3RlbXBsYXRpemVPcHRpb25zKSAmJiAhb3B0aW9ucy5wYXJlbnRNb2RlbCk7CiAgICAgICAgICB0aGlzLl9fcGFyZW50TW9kZWwgPSBtb2RlbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1vZGVsOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3R1YiBvZiBIVE1MRWxlbWVudCdzIGBkaXNwYXRjaEV2ZW50YCwgc28gdGhhdCBlZmZlY3RzIHRoYXQgbWF5CiAgICAgICAqIGRpc3BhdGNoIGV2ZW50cyBzYWZlbHkgbm8tb3AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IEV2ZW50IHRvIGRpc3BhdGNoCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IEFsd2F5cyB0cnVlLgogICAgICAgKi8KICAgICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIC8qKiBAdHlwZSB7IURhdGFUZW1wbGF0ZX0gKi8KICAgIFRlbXBsYXRlSW5zdGFuY2VCYXNlLnByb3RvdHlwZS5fX2RhdGFIb3N0OwogICAgLyoqIEB0eXBlIHshVGVtcGxhdGl6ZU9wdGlvbnN9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX190ZW1wbGF0aXplT3B0aW9uczsKICAgIC8qKiBAdHlwZSB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSAqLwogICAgVGVtcGxhdGVJbnN0YW5jZUJhc2UucHJvdG90eXBlLl9tZXRob2RIb3N0OwogICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgVGVtcGxhdGVJbnN0YW5jZUJhc2UucHJvdG90eXBlLl9fdGVtcGxhdGl6ZU93bmVyOwogICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgVGVtcGxhdGVJbnN0YW5jZUJhc2UucHJvdG90eXBlLl9faG9zdFByb3BzOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9NdXRhYmxlRGF0YX0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IE11dGFibGVUZW1wbGF0ZUluc3RhbmNlQmFzZSA9IFBvbHltZXIuTXV0YWJsZURhdGEoVGVtcGxhdGVJbnN0YW5jZUJhc2UpOwoKICAgIGZ1bmN0aW9uIGZpbmRNZXRob2RIb3N0KHRlbXBsYXRlKSB7CiAgICAgIC8vIFRlY2huaWNhbGx5IHRoaXMgc2hvdWxkIGJlIHRoZSBvd25lciBvZiB0aGUgb3V0ZXJtb3N0IHRlbXBsYXRlLgogICAgICAvLyBJbiBzaGFkb3cgZG9tLCB0aGlzIGlzIGFsd2F5cyBnZXRSb290Tm9kZSgpLmhvc3QsIGJ1dCB3ZSBjYW4KICAgICAgLy8gYXBwcm94aW1hdGUgdGhpcyB2aWEgY29vcGVyYXRpb24gd2l0aCBvdXIgZGF0YUhvc3QgYWx3YXlzIHNldHRpbmcKICAgICAgLy8gYF9tZXRob2RIb3N0YCBhcyBsb25nIGFzIHRoZXJlIHdlcmUgYmluZGluZ3MgKG9yIGlkJ3MpIG9uIHRoaXMKICAgICAgLy8gaW5zdGFuY2UgY2F1c2luZyBpdCB0byBnZXQgYSBkYXRhSG9zdC4KICAgICAgbGV0IHRlbXBsYXRlSG9zdCA9IHRlbXBsYXRlLl9fZGF0YUhvc3Q7CiAgICAgIHJldHVybiB0ZW1wbGF0ZUhvc3QgJiYgdGVtcGxhdGVIb3N0Ll9tZXRob2RIb3N0IHx8IHRlbXBsYXRlSG9zdDsKICAgIH0KCiAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgLyoqCiAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBjbGFzcy5wcm90b3R5cGUgaXMgbm90IGRlZmluZWQgZm9yIHNvbWUgcmVhc29uCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVRlbXBsYXRpemVyQ2xhc3ModGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgb3B0aW9ucykgewogICAgICAvLyBBbm9ueW1vdXMgY2xhc3MgY3JlYXRlZCBieSB0aGUgdGVtcGxhdGl6ZQogICAgICBsZXQgYmFzZSA9IG9wdGlvbnMubXV0YWJsZURhdGEgPwogICAgICAgIE11dGFibGVUZW1wbGF0ZUluc3RhbmNlQmFzZSA6IFRlbXBsYXRlSW5zdGFuY2VCYXNlOwogICAgICAvLyBBZmZvcmRhbmNlIGZvciBnbG9iYWwgbWl4aW5zIG9udG8gVGVtcGxhdGl6ZUluc3RhbmNlCiAgICAgIGlmIChQb2x5bWVyLlRlbXBsYXRpemUubWl4aW4pIHsKICAgICAgICBiYXNlID0gUG9seW1lci5UZW1wbGF0aXplLm1peGluKGJhc2UpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBsZXQga2xhc3MgPSBjbGFzcyBleHRlbmRzIGJhc2UgeyB9OwogICAgICBrbGFzcy5wcm90b3R5cGUuX190ZW1wbGF0aXplT3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgIGtsYXNzLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgYWRkTm90aWZ5RWZmZWN0cyhrbGFzcywgdGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgb3B0aW9ucyk7CiAgICAgIHJldHVybiBrbGFzczsKICAgIH0KCiAgICAvKioKICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGNsYXNzLnByb3RvdHlwZSBpcyBub3QgZGVmaW5lZCBmb3Igc29tZSByZWFzb24KICAgICAqLwogICAgZnVuY3Rpb24gYWRkUHJvcGFnYXRlRWZmZWN0cyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIGxldCB1c2VyRm9yd2FyZEhvc3RQcm9wID0gb3B0aW9ucy5mb3J3YXJkSG9zdFByb3A7CiAgICAgIGlmICh1c2VyRm9yd2FyZEhvc3RQcm9wKSB7CiAgICAgICAgLy8gUHJvdmlkZSBkYXRhIEFQSSBhbmQgcHJvcGVydHkgZWZmZWN0cyBvbiBtZW1vaXplZCB0ZW1wbGF0ZSBjbGFzcwogICAgICAgIGxldCBrbGFzcyA9IHRlbXBsYXRlSW5mby50ZW1wbGF0aXplVGVtcGxhdGVDbGFzczsKICAgICAgICBpZiAoIWtsYXNzKSB7CiAgICAgICAgICBsZXQgYmFzZSA9IG9wdGlvbnMubXV0YWJsZURhdGEgPyBNdXRhYmxlRGF0YVRlbXBsYXRlIDogRGF0YVRlbXBsYXRlOwogICAgICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgICAgICBrbGFzcyA9IHRlbXBsYXRlSW5mby50ZW1wbGF0aXplVGVtcGxhdGVDbGFzcyA9CiAgICAgICAgICAgIGNsYXNzIFRlbXBsYXRpemVkVGVtcGxhdGUgZXh0ZW5kcyBiYXNlIHt9OwogICAgICAgICAgLy8gQWRkIHRlbXBsYXRlIC0gPmluc3RhbmNlcyBlZmZlY3RzCiAgICAgICAgICAvLyBhbmQgaG9zdCA8LSB0ZW1wbGF0ZSBlZmZlY3RzCiAgICAgICAgICBsZXQgaG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wczsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICAgIGtsYXNzLnByb3RvdHlwZS5fYWRkUHJvcGVydHlFZmZlY3QoJ19ob3N0XycgKyBwcm9wLAogICAgICAgICAgICAgIGtsYXNzLnByb3RvdHlwZS5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMuUFJPUEFHQVRFLAogICAgICAgICAgICAgIHtmbjogY3JlYXRlRm9yd2FyZEhvc3RQcm9wRWZmZWN0KHByb3AsIHVzZXJGb3J3YXJkSG9zdFByb3ApfSk7CiAgICAgICAgICAgIGtsYXNzLnByb3RvdHlwZS5fY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkoJ19ob3N0XycgKyBwcm9wKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdXBncmFkZVRlbXBsYXRlKHRlbXBsYXRlLCBrbGFzcyk7CiAgICAgICAgLy8gTWl4IGFueSBwcmUtYm91bmQgZGF0YSBpbnRvIF9fZGF0YTsgbm8gbmVlZCB0byBmbHVzaCB0aGlzIHRvCiAgICAgICAgLy8gaW5zdGFuY2VzIHNpbmNlIHRoZXkgcHVsbCBmcm9tIHRoZSB0ZW1wbGF0ZSBhdCBpbnN0YW5jZS10aW1lCiAgICAgICAgaWYgKHRlbXBsYXRlLl9fZGF0YVByb3RvKSB7CiAgICAgICAgICAvLyBOb3RlLCBnZW5lcmFsbHkgYF9fZGF0YVByb3RvYCBjb3VsZCBiZSBjaGFpbmVkLCBidXQgaXQncyBndWFyYW50ZWVkCiAgICAgICAgICAvLyB0byBub3QgYmUgc2luY2UgdGhpcyBpcyBhIHZhbmlsbGEgdGVtcGxhdGUgd2UganVzdCBhZGRlZCBlZmZlY3RzIHRvCiAgICAgICAgICBPYmplY3QuYXNzaWduKHRlbXBsYXRlLl9fZGF0YSwgdGVtcGxhdGUuX19kYXRhUHJvdG8pOwogICAgICAgIH0KICAgICAgICAvLyBDbGVhciBhbnkgcGVuZGluZyBkYXRhIGZvciBwZXJmb3JtYW5jZQogICAgICAgIHRlbXBsYXRlLl9fZGF0YVRlbXAgPSB7fTsKICAgICAgICB0ZW1wbGF0ZS5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgICB0ZW1wbGF0ZS5fX2RhdGFPbGQgPSBudWxsOwogICAgICAgIHRlbXBsYXRlLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KICAgIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCiAgICBmdW5jdGlvbiBjcmVhdGVGb3J3YXJkSG9zdFByb3BFZmZlY3QoaG9zdFByb3AsIHVzZXJGb3J3YXJkSG9zdFByb3ApIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZvcndhcmRIb3N0UHJvcCh0ZW1wbGF0ZSwgcHJvcCwgcHJvcHMpIHsKICAgICAgICB1c2VyRm9yd2FyZEhvc3RQcm9wLmNhbGwodGVtcGxhdGUuX190ZW1wbGF0aXplT3duZXIsCiAgICAgICAgICBwcm9wLnN1YnN0cmluZygnX2hvc3RfJy5sZW5ndGgpLCBwcm9wc1twcm9wXSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYWRkTm90aWZ5RWZmZWN0cyhrbGFzcywgdGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgb3B0aW9ucykgewogICAgICBsZXQgaG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wcyB8fCB7fTsKICAgICAgZm9yIChsZXQgaXByb3AgaW4gb3B0aW9ucy5pbnN0YW5jZVByb3BzKSB7CiAgICAgICAgZGVsZXRlIGhvc3RQcm9wc1tpcHJvcF07CiAgICAgICAgbGV0IHVzZXJOb3RpZnlJbnN0YW5jZVByb3AgPSBvcHRpb25zLm5vdGlmeUluc3RhbmNlUHJvcDsKICAgICAgICBpZiAodXNlck5vdGlmeUluc3RhbmNlUHJvcCkgewogICAgICAgICAga2xhc3MucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdChpcHJvcCwKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLlBST1BFUlRZX0VGRkVDVF9UWVBFUy5OT1RJRlksCiAgICAgICAgICAgIHtmbjogY3JlYXRlTm90aWZ5SW5zdGFuY2VQcm9wRWZmZWN0KGlwcm9wLCB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKX0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAob3B0aW9ucy5mb3J3YXJkSG9zdFByb3AgJiYgdGVtcGxhdGUuX19kYXRhSG9zdCkgewogICAgICAgIGZvciAobGV0IGhwcm9wIGluIGhvc3RQcm9wcykgewogICAgICAgICAga2xhc3MucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdChocHJvcCwKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLlBST1BFUlRZX0VGRkVDVF9UWVBFUy5OT1RJRlksCiAgICAgICAgICAgIHtmbjogY3JlYXRlTm90aWZ5SG9zdFByb3BFZmZlY3QoKX0pOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmeUluc3RhbmNlUHJvcEVmZmVjdChpbnN0UHJvcCwgdXNlck5vdGlmeUluc3RhbmNlUHJvcCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gbm90aWZ5SW5zdGFuY2VQcm9wKGluc3QsIHByb3AsIHByb3BzKSB7CiAgICAgICAgdXNlck5vdGlmeUluc3RhbmNlUHJvcC5jYWxsKGluc3QuX190ZW1wbGF0aXplT3duZXIsCiAgICAgICAgICBpbnN0LCBwcm9wLCBwcm9wc1twcm9wXSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTm90aWZ5SG9zdFByb3BFZmZlY3QoKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBub3RpZnlIb3N0UHJvcChpbnN0LCBwcm9wLCBwcm9wcykgewogICAgICAgIGluc3QuX19kYXRhSG9zdC5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKCdfaG9zdF8nICsgcHJvcCwgcHJvcHNbcHJvcF0sIHRydWUsIHRydWUpOwogICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogTW9kdWxlIGZvciBwcmVwYXJpbmcgYW5kIHN0YW1waW5nIGluc3RhbmNlcyBvZiB0ZW1wbGF0ZXMgdGhhdCB1dGlsaXplCiAgICAgKiBQb2x5bWVyJ3MgZGF0YS1iaW5kaW5nIGFuZCBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lciBmZWF0dXJlcy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqICAgICAvLyBHZXQgYSB0ZW1wbGF0ZSBmcm9tIHNvbWV3aGVyZSwgZS5nLiBsaWdodCBET00KICAgICAqICAgICBsZXQgdGVtcGxhdGUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgKiAgICAgLy8gUHJlcGFyZSB0aGUgdGVtcGxhdGUKICAgICAqICAgICBsZXQgVGVtcGxhdGVDbGFzcyA9IFBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRlbXBsYXRlKTsKICAgICAqICAgICAvLyBJbnN0YW5jZSB0aGUgdGVtcGxhdGUgd2l0aCBhbiBpbml0aWFsIGRhdGEgbW9kZWwKICAgICAqICAgICBsZXQgaW5zdGFuY2UgPSBuZXcgVGVtcGxhdGVDbGFzcyh7bXlQcm9wOiAnaW5pdGlhbCd9KTsKICAgICAqICAgICAvLyBJbnNlcnQgdGhlIGluc3RhbmNlJ3MgRE9NIHNvbWV3aGVyZSwgZS5nLiBlbGVtZW50J3Mgc2hhZG93IERPTQogICAgICogICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChpbnN0YW5jZS5yb290KTsKICAgICAqICAgICAvLyBDaGFuZ2luZyBhIHByb3BlcnR5IG9uIHRoZSBpbnN0YW5jZSB3aWxsIHByb3BhZ2F0ZSB0byBiaW5kaW5ncwogICAgICogICAgIC8vIGluIHRoZSB0ZW1wbGF0ZQogICAgICogICAgIGluc3RhbmNlLm15UHJvcCA9ICduZXcgdmFsdWUnOwogICAgICoKICAgICAqIFRoZSBgb3B0aW9uc2AgZGljdGlvbmFyeSBwYXNzZWQgdG8gYHRlbXBsYXRpemVgIGFsbG93cyBmb3IgY3VzdG9taXppbmcKICAgICAqIGZlYXR1cmVzIG9mIHRoZSBnZW5lcmF0ZWQgdGVtcGxhdGUgY2xhc3MsIGluY2x1ZGluZyBob3cgb3V0ZXItc2NvcGUgaG9zdAogICAgICogcHJvcGVydGllcyBzaG91bGQgYmUgZm9yd2FyZGVkIGludG8gdGVtcGxhdGUgaW5zdGFuY2VzLCBob3cgYW55IGluc3RhbmNlCiAgICAgKiBwcm9wZXJ0aWVzIGFkZGVkIGludG8gdGhlIHRlbXBsYXRlJ3Mgc2NvcGUgc2hvdWxkIGJlIG5vdGlmaWVkIG91dCB0bwogICAgICogdGhlIGhvc3QsIGFuZCB3aGV0aGVyIHRoZSBpbnN0YW5jZSBzaG91bGQgYmUgZGVjb3JhdGVkIGFzIGEgInBhcmVudCBtb2RlbCIKICAgICAqIG9mIGFueSBldmVudCBoYW5kbGVycy4KICAgICAqCiAgICAgKiAgICAgLy8gQ3VzdG9taXplIHByb3BlcnR5IGZvcndhcmRpbmcgYW5kIGV2ZW50IG1vZGVsIGRlY29yYXRpb24KICAgICAqICAgICBsZXQgVGVtcGxhdGVDbGFzcyA9IFBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRlbXBsYXRlLCB0aGlzLCB7CiAgICAgKiAgICAgICBwYXJlbnRNb2RlbDogdHJ1ZSwKICAgICAqICAgICAgIGZvcndhcmRIb3N0UHJvcChwcm9wZXJ0eSwgdmFsdWUpIHsuLi59LAogICAgICogICAgICAgaW5zdGFuY2VQcm9wczogey4uLn0sCiAgICAgKiAgICAgICBub3RpZnlJbnN0YW5jZVByb3AoaW5zdGFuY2UsIHByb3BlcnR5LCB2YWx1ZSkgey4uLn0sCiAgICAgKiAgICAgfSk7CiAgICAgKgogICAgICogQG5hbWVzcGFjZQogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdW1tYXJ5IE1vZHVsZSBmb3IgcHJlcGFyaW5nIGFuZCBzdGFtcGluZyBpbnN0YW5jZXMgb2YgdGVtcGxhdGVzCiAgICAgKiAgIHV0aWxpemluZyBQb2x5bWVyIHRlbXBsYXRpbmcgZmVhdHVyZXMuCiAgICAgKi8KICAgIFBvbHltZXIuVGVtcGxhdGl6ZSA9IHsKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIGFub255bW91cyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIGNsYXNzIGJvdW5kIHRvIHRoZQogICAgICAgKiBgPHRlbXBsYXRlPmAgcHJvdmlkZWQuICBJbnN0YW5jaW5nIHRoZSBjbGFzcyB3aWxsIHJlc3VsdCBpbiB0aGUKICAgICAgICogdGVtcGxhdGUgYmVpbmcgc3RhbXBlZCBpbnRvIGEgZG9jdW1lbnQgZnJhZ21lbnQgc3RvcmVkIGFzIHRoZSBpbnN0YW5jZSdzCiAgICAgICAqIGByb290YCBwcm9wZXJ0eSwgYWZ0ZXIgd2hpY2ggaXQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBET00uCiAgICAgICAqCiAgICAgICAqIFRlbXBsYXRlcyBtYXkgdXRpbGl6ZSBhbGwgUG9seW1lciBkYXRhLWJpbmRpbmcgZmVhdHVyZXMgYXMgd2VsbCBhcwogICAgICAgKiBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMuICBFdmVudCBsaXN0ZW5lcnMgYW5kIGlubGluZSBjb21wdXRpbmcKICAgICAgICogZnVuY3Rpb25zIGluIHRoZSB0ZW1wbGF0ZSB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgaG9zdCBvZiB0aGUgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIFRoZSBjb25zdHJ1Y3RvciByZXR1cm5lZCB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCBkaWN0aW9uYXJ5IG9mIGluaXRpYWwKICAgICAgICogcHJvcGVydHkgdmFsdWVzIHRvIHByb3BhZ2F0ZSBpbnRvIHRlbXBsYXRlIGJpbmRpbmdzLiAgQWRkaXRpb25hbGx5CiAgICAgICAqIGhvc3QgcHJvcGVydGllcyBjYW4gYmUgZm9yd2FyZGVkIGluLCBhbmQgaW5zdGFuY2UgcHJvcGVydGllcyBjYW4gYmUKICAgICAgICogbm90aWZpZWQgb3V0IGJ5IHByb3ZpZGluZyBvcHRpb25hbCBjYWxsYmFja3MgaW4gdGhlIGBvcHRpb25zYCBkaWN0aW9uYXJ5LgogICAgICAgKgogICAgICAgKiBWYWxpZCBjb25maWd1cmF0aW9uIGluIGBvcHRpb25zYCBhcmUgYXMgZm9sbG93czoKICAgICAgICoKICAgICAgICogLSBgZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSlgOiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IHJlZmVyZW5jZWQKICAgICAgICogICBpbiB0aGUgdGVtcGxhdGUgY2hhbmdlZCBvbiB0aGUgdGVtcGxhdGUncyBob3N0LiBBcyB0aGlzIGxpYnJhcnkgZG9lcwogICAgICAgKiAgIG5vdCByZXRhaW4gcmVmZXJlbmNlcyB0byB0ZW1wbGF0ZXMgaW5zdGFuY2VkIGJ5IHRoZSB1c2VyLCBpdCBpcyB0aGUKICAgICAgICogICB0ZW1wbGF0aXplIG93bmVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZm9yd2FyZCBob3N0IHByb3BlcnR5IGNoYW5nZXMgaW50bwogICAgICAgKiAgIHVzZXItc3RhbXBlZCBpbnN0YW5jZXMuICBUaGUgYGluc3RhbmNlLmZvcndhcmRIb3N0UHJvcChwcm9wZXJ0eSwgdmFsdWUpYAogICAgICAgKiAgICBtZXRob2Qgb24gdGhlIGdlbmVyYXRlZCBjbGFzcyBzaG91bGQgYmUgY2FsbGVkIHRvIGZvcndhcmQgaG9zdAogICAgICAgKiAgIHByb3BlcnRpZXMgaW50byB0aGUgdGVtcGxhdGUgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBwcm9wZXJ0eS1jaGFuZ2VkCiAgICAgICAqICAgbm90aWZpY2F0aW9ucy4gQW55IHByb3BlcnRpZXMgcmVmZXJlbmNlZCBpbiB0aGUgdGVtcGxhdGUgdGhhdCBhcmUgbm90CiAgICAgICAqICAgZGVmaW5lZCBpbiBgaW5zdGFuY2VQcm9wc2Agd2lsbCBiZSBub3RpZmllZCB1cCB0byB0aGUgdGVtcGxhdGUncyBob3N0CiAgICAgICAqICAgYXV0b21hdGljYWxseS4KICAgICAgICogLSBgaW5zdGFuY2VQcm9wc2A6IERpY3Rpb25hcnkgb2YgcHJvcGVydHkgbmFtZXMgdGhhdCB3aWxsIGJlIGFkZGVkCiAgICAgICAqICAgdG8gdGhlIGluc3RhbmNlIGJ5IHRoZSB0ZW1wbGF0aXplIG93bmVyLiAgVGhlc2UgcHJvcGVydGllcyBzaGFkb3cgYW55CiAgICAgICAqICAgaG9zdCBwcm9wZXJ0aWVzLCBhbmQgY2hhbmdlcyB3aXRoaW4gdGhlIHRlbXBsYXRlIHRvIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICogICB3aWxsIHJlc3VsdCBpbiBgbm90aWZ5SW5zdGFuY2VQcm9wYCBiZWluZyBjYWxsZWQuCiAgICAgICAqIC0gYG11dGFibGVEYXRhYDogV2hlbiBgdHJ1ZWAsIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBza2lwIHN0cmljdAogICAgICAgKiAgIGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlCiAgICAgICAqICAgImRpcnR5IikuCiAgICAgICAqIC0gYG5vdGlmeUluc3RhbmNlUHJvcChpbnN0YW5jZSwgcHJvcGVydHksIHZhbHVlKWA6IENhbGxlZCB3aGVuCiAgICAgICAqICAgYW4gaW5zdGFuY2UgcHJvcGVydHkgY2hhbmdlcy4gIFVzZXJzIG1heSBjaG9vc2UgdG8gY2FsbCBgbm90aWZ5UGF0aGAKICAgICAgICogICBvbiBlLmcuIHRoZSBvd25lciB0byBub3RpZnkgdGhlIGNoYW5nZS4KICAgICAgICogLSBgcGFyZW50TW9kZWxgOiBXaGVuIGB0cnVlYCwgZXZlbnRzIGhhbmRsZWQgYnkgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzCiAgICAgICAqICAgKGBvbi1ldmVudD0iaGFuZGxlciJgKSB3aWxsIGJlIGRlY29yYXRlZCB3aXRoIGEgYG1vZGVsYCBwcm9wZXJ0eSBwb2ludGluZwogICAgICAgKiAgIHRvIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0aGF0IHN0YW1wZWQgaXQuICBJdCB3aWxsIGFsc28gYmUgcmV0dXJuZWQKICAgICAgICogICBmcm9tIGBpbnN0YW5jZS5wYXJlbnRNb2RlbGAgaW4gY2FzZXMgd2hlcmUgdGVtcGxhdGUgaW5zdGFuY2UgbmVzdGluZwogICAgICAgKiAgIGNhdXNlcyBhbiBpbm5lciBtb2RlbCB0byBzaGFkb3cgYW4gb3V0ZXIgbW9kZWwuCiAgICAgICAqCiAgICAgICAqIEFsbCBjYWxsYmFja3MgYXJlIGNhbGxlZCBib3VuZCB0byB0aGUgYG93bmVyYC4gQW55IGNvbnRleHQKICAgICAgICogbmVlZGVkIGZvciB0aGUgY2FsbGJhY2tzIChzdWNoIGFzIHJlZmVyZW5jZXMgdG8gYGluc3RhbmNlc2Agc3RhbXBlZCkKICAgICAgICogc2hvdWxkIGJlIHN0b3JlZCBvbiB0aGUgYG93bmVyYCBzdWNoIHRoYXQgdGhleSBjYW4gYmUgcmV0cmlldmVkIHZpYQogICAgICAgKiBgdGhpc2AuCiAgICAgICAqCiAgICAgICAqIFdoZW4gYG9wdGlvbnMuZm9yd2FyZEhvc3RQcm9wYCBpcyBkZWNsYXJlZCBhcyBhbiBvcHRpb24sIGFueSBwcm9wZXJ0aWVzCiAgICAgICAqIHJlZmVyZW5jZWQgaW4gdGhlIHRlbXBsYXRlIHdpbGwgYmUgYXV0b21hdGljYWxseSBmb3J3YXJkZWQgZnJvbSB0aGUgaG9zdCBvZgogICAgICAgKiB0aGUgYDx0ZW1wbGF0ZT5gIHRvIGluc3RhbmNlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFueSBwcm9wZXJ0aWVzIGxpc3RlZCBpbgogICAgICAgKiB0aGUgYG9wdGlvbnMuaW5zdGFuY2VQcm9wc2Agb2JqZWN0LiAgYGluc3RhbmNlUHJvcHNgIGFyZSBhc3N1bWVkIHRvIGJlCiAgICAgICAqIG1hbmFnZWQgYnkgdGhlIG93bmVyIG9mIHRoZSBpbnN0YW5jZXMsIGVpdGhlciBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IKICAgICAgICogb3Igc2V0IGFmdGVyIHRoZSBmYWN0LiAgTm90ZSwgYW55IHByb3BlcnRpZXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yIHdpbGwKICAgICAgICogYWx3YXlzIGJlIHNldCB0byB0aGUgaW5zdGFuY2UgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IHdvdWxkIG5vcm1hbGx5CiAgICAgICAqIGJlIGZvcndhcmRlZCBmcm9tIHRoZSBob3N0KS4KICAgICAgICoKICAgICAgICogTm90ZSB0aGF0IGB0ZW1wbGF0aXplKClgIGNhbiBiZSBydW4gb25seSBvbmNlIGZvciBhIGdpdmVuIGA8dGVtcGxhdGU+YC4KICAgICAgICogRnVydGhlciBjYWxscyB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gQWxzbywgdGhlcmUgaXMgYSBzcGVjaWFsCiAgICAgICAqIGJlaGF2aW9yIGlmIHRoZSB0ZW1wbGF0ZSB3YXMgZHVwbGljYXRlZCB0aHJvdWdoIGEgbWVjaGFuaXNtIHN1Y2ggYXMKICAgICAgICogYDxkb20tcmVwZWF0PmAgb3IgYDx0ZXN0LWZpeHR1cmU+YC4gSW4gdGhpcyBjYXNlLCBhbGwgY2FsbHMgdG8KICAgICAgICogYHRlbXBsYXRpemUoKWAgcmV0dXJuIHRoZSBzYW1lIGNsYXNzIGZvciBhbGwgZHVwbGljYXRlcyBvZiBhIHRlbXBsYXRlLgogICAgICAgKiBUaGUgY2xhc3MgcmV0dXJuZWQgZnJvbSBgdGVtcGxhdGl6ZSgpYCBpcyBnZW5lcmF0ZWQgb25seSBvbmNlIHVzaW5nCiAgICAgICAqIHRoZSBgb3B0aW9uc2AgZnJvbSB0aGUgZmlyc3QgY2FsbC4gVGhpcyBtZWFucyB0aGF0IGFueSBgb3B0aW9uc2AKICAgICAgICogcHJvdmlkZWQgdG8gc3Vic2VxdWVudCBjYWxscyB3aWxsIGJlIGlnbm9yZWQuIFRoZXJlZm9yZSwgaXQgaXMgdmVyeQogICAgICAgKiBpbXBvcnRhbnQgbm90IHRvIGNsb3NlIG92ZXIgYW55IHZhcmlhYmxlcyBpbnNpZGUgdGhlIGNhbGxiYWNrcy4gQWxzbywKICAgICAgICogYXJyb3cgZnVuY3Rpb25zIG11c3QgYmUgYXZvaWRlZCBiZWNhdXNlIHRoZXkgYmluZCB0aGUgb3V0ZXIgYHRoaXNgLgogICAgICAgKiBJbnNpZGUgdGhlIGNhbGxiYWNrcywgYW55IGNvbnRleHR1YWwgaW5mb3JtYXRpb24gY2FuIGJlIGFjY2Vzc2VkCiAgICAgICAqIHRocm91Z2ggYHRoaXNgLCB3aGljaCBwb2ludHMgdG8gdGhlIGBvd25lcmAuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlRlbXBsYXRpemUKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gdGVtcGxhdGl6ZQogICAgICAgKiBAcGFyYW0ge1BvbHltZXJfUHJvcGVydHlFZmZlY3RzPX0gb3duZXIgT3duZXIgb2YgdGhlIHRlbXBsYXRlIGluc3RhbmNlczsKICAgICAgICogICBhbnkgb3B0aW9uYWwgY2FsbGJhY2tzIHdpbGwgYmUgYm91bmQgdG8gdGhpcyBvd25lci4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zIE9wdGlvbnMgZGljdGlvbmFyeSAoc2VlIHN1bW1hcnkgZm9yIGRldGFpbHMpCiAgICAgICAqIEByZXR1cm4ge2Z1bmN0aW9uKG5ldzpUZW1wbGF0ZUluc3RhbmNlQmFzZSl9IEdlbmVyYXRlZCBjbGFzcyBib3VuZCB0byB0aGUgdGVtcGxhdGUKICAgICAgICogICBwcm92aWRlZAogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIHRlbXBsYXRpemUodGVtcGxhdGUsIG93bmVyLCBvcHRpb25zKSB7CiAgICAgICAgLy8gVW5kZXIgc3RyaWN0VGVtcGxhdGVQb2xpY3ksIHRoZSB0ZW1wbGF0aXplZCBlbGVtZW50IG11c3QgYmUgb3duZWQKICAgICAgICAvLyBieSBhICh0cnVzdGVkKSBQb2x5bWVyIGVsZW1lbnQsIGluZGljYXRlZCBieSBleGlzdGVuY2Ugb2YgX21ldGhvZEhvc3Q7CiAgICAgICAgLy8gZS5nLiBmb3IgZG9tLWlmICYgZG9tLXJlcGVhdCBpbiBtYWluIGRvY3VtZW50LCBfbWV0aG9kSG9zdCBpcyBudWxsCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgIWZpbmRNZXRob2RIb3N0KHRlbXBsYXRlKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpY3RUZW1wbGF0ZVBvbGljeTogdGVtcGxhdGUgb3duZXIgbm90IHRydXN0ZWQnKTsKICAgICAgICB9CiAgICAgICAgb3B0aW9ucyA9IC8qKiBAdHlwZSB7IVRlbXBsYXRpemVPcHRpb25zfSAqLyhvcHRpb25zIHx8IHt9KTsKICAgICAgICBpZiAodGVtcGxhdGUuX190ZW1wbGF0aXplT3duZXIpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSA8dGVtcGxhdGU+IGNhbiBvbmx5IGJlIHRlbXBsYXRpemVkIG9uY2UnKTsKICAgICAgICB9CiAgICAgICAgdGVtcGxhdGUuX190ZW1wbGF0aXplT3duZXIgPSBvd25lcjsKICAgICAgICBjb25zdCBjdG9yID0gb3duZXIgPyBvd25lci5jb25zdHJ1Y3RvciA6IFRlbXBsYXRlSW5zdGFuY2VCYXNlOwogICAgICAgIGxldCB0ZW1wbGF0ZUluZm8gPSBjdG9yLl9wYXJzZVRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICAvLyBHZXQgbWVtb2l6ZWQgYmFzZSBjbGFzcyBmb3IgdGhlIHByb3RvdHlwaWNhbCB0ZW1wbGF0ZSwgd2hpY2gKICAgICAgICAvLyBpbmNsdWRlcyBwcm9wZXJ0eSBlZmZlY3RzIGZvciBiaW5kaW5nIHRlbXBsYXRlICYgZm9yd2FyZGluZwogICAgICAgIGxldCBiYXNlQ2xhc3MgPSB0ZW1wbGF0ZUluZm8udGVtcGxhdGl6ZUluc3RhbmNlQ2xhc3M7CiAgICAgICAgaWYgKCFiYXNlQ2xhc3MpIHsKICAgICAgICAgIGJhc2VDbGFzcyA9IGNyZWF0ZVRlbXBsYXRpemVyQ2xhc3ModGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgb3B0aW9ucyk7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8udGVtcGxhdGl6ZUluc3RhbmNlQ2xhc3MgPSBiYXNlQ2xhc3M7CiAgICAgICAgfQogICAgICAgIC8vIEhvc3QgcHJvcGVydHkgZm9yd2FyZGluZyBtdXN0IGJlIGluc3RhbGxlZCBvbnRvIHRlbXBsYXRlIGluc3RhbmNlCiAgICAgICAgYWRkUHJvcGFnYXRlRWZmZWN0cyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgICAvLyBTdWJjbGFzcyBiYXNlIGNsYXNzIGFuZCBhZGQgcmVmZXJlbmNlIGZvciB0aGlzIHNwZWNpZmljIHRlbXBsYXRlCiAgICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgICAgbGV0IGtsYXNzID0gY2xhc3MgVGVtcGxhdGVJbnN0YW5jZSBleHRlbmRzIGJhc2VDbGFzcyB7fTsKICAgICAgICBrbGFzcy5wcm90b3R5cGUuX21ldGhvZEhvc3QgPSBmaW5kTWV0aG9kSG9zdCh0ZW1wbGF0ZSk7CiAgICAgICAga2xhc3MucHJvdG90eXBlLl9fZGF0YUhvc3QgPSB0ZW1wbGF0ZTsKICAgICAgICBrbGFzcy5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXIgPSBvd25lcjsKICAgICAgICBrbGFzcy5wcm90b3R5cGUuX19ob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgIGtsYXNzID0gLyoqIEB0eXBlIHtmdW5jdGlvbihuZXc6VGVtcGxhdGVJbnN0YW5jZUJhc2UpfSAqLyhrbGFzcyk7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBrbGFzczsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSAibW9kZWwiIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGVsZW1lbnQsIHdoaWNoCiAgICAgICAqIHNlcnZlcyBhcyB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRoZSBlbGVtZW50IGlzCiAgICAgICAqIGNvbnRhaW5lZCBpbi4gQSB0ZW1wbGF0ZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZgogICAgICAgKiBgVGVtcGxhdGVJbnN0YW5jZUJhc2VgLCBhbmQgc2hvdWxkIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSBkYXRhCiAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBFeGFtcGxlOgogICAgICAgKgogICAgICAgKiAgIGxldCBtb2RlbCA9IG1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgICAqICAgaWYgKG1vZGVsLmluZGV4IDwgMTApIHsKICAgICAgICogICAgIG1vZGVsLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7CiAgICAgICAqICAgfQogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5UZW1wbGF0aXplCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGhlIG1vZGVsIHdpbGwgYmUgcmV0dXJuZWQgZm9yCiAgICAgICAqICAgZWxlbWVudHMgc3RhbXBlZCBmcm9tIHRoaXMgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlPX0gbm9kZSBOb2RlIGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAgICogQHJldHVybiB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9IFRlbXBsYXRlIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUKICAgICAgICogICBiaW5kaW5nIHNjb3BlIGZvciB0aGUgZWxlbWVudAogICAgICAgKi8KICAgICAgbW9kZWxGb3JFbGVtZW50KHRlbXBsYXRlLCBub2RlKSB7CiAgICAgICAgbGV0IG1vZGVsOwogICAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgICAvLyBBbiBlbGVtZW50IHdpdGggYSBfX3RlbXBsYXRpemVJbnN0YW5jZSBtYXJrcyB0aGUgdG9wIGJvdW5kYXJ5CiAgICAgICAgICAvLyBvZiBhIHNjb3BlOyB3YWxrIHVwIHVudGlsIHdlIGZpbmQgb25lLCBhbmQgdGhlbiBlbnN1cmUgdGhhdAogICAgICAgICAgLy8gaXRzIF9fZGF0YUhvc3QgbWF0Y2hlcyBgdGhpc2AsIG1lYW5pbmcgdGhpcyBkb20tcmVwZWF0IHN0YW1wZWQgaXQKICAgICAgICAgIGlmICgobW9kZWwgPSBub2RlLl9fdGVtcGxhdGl6ZUluc3RhbmNlKSkgewogICAgICAgICAgICAvLyBGb3VuZCBhbiBlbGVtZW50IHN0YW1wZWQgYnkgYW5vdGhlciB0ZW1wbGF0ZTsga2VlcCB3YWxraW5nIHVwCiAgICAgICAgICAgIC8vIGZyb20gaXRzIF9fZGF0YUhvc3QKICAgICAgICAgICAgaWYgKG1vZGVsLl9fZGF0YUhvc3QgIT0gdGVtcGxhdGUpIHsKICAgICAgICAgICAgICBub2RlID0gbW9kZWwuX19kYXRhSG9zdDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFN0aWxsIGluIGEgdGVtcGxhdGUgc2NvcGUsIGtlZXAgZ29pbmcgdXAgdW50aWwKICAgICAgICAgICAgLy8gYSBfX3RlbXBsYXRpemVJbnN0YW5jZSBpcyBmb3VuZAogICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfTsKCiAgICBQb2x5bWVyLlRlbXBsYXRlSW5zdGFuY2VCYXNlID0gVGVtcGxhdGVJbnN0YW5jZUJhc2U7CgogIH0pKCk7CgoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGxldCBUZW1wbGF0ZUluc3RhbmNlQmFzZSA9IFBvbHltZXIuVGVtcGxhdGVJbnN0YW5jZUJhc2U7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKCiAgICAvKioKICAgICAqIEB0eXBlZGVmIHt7CiAgICAgKiAgIF90ZW1wbGF0aXplclRlbXBsYXRlOiBIVE1MVGVtcGxhdGVFbGVtZW50LAogICAgICogICBfcGFyZW50TW9kZWw6IGJvb2xlYW4sCiAgICAgKiAgIF9pbnN0YW5jZVByb3BzOiBPYmplY3QsCiAgICAgKiAgIF9mb3J3YXJkSG9zdFByb3BWMjogRnVuY3Rpb24sCiAgICAgKiAgIF9ub3RpZnlJbnN0YW5jZVByb3BWMjogRnVuY3Rpb24sCiAgICAgKiAgIGN0b3I6IFRlbXBsYXRlSW5zdGFuY2VCYXNlCiAgICAgKiB9fQogICAgICovCiAgICBsZXQgVGVtcGxhdGl6ZXJVc2VyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lCgogICAgLyoqCiAgICAgKiBUaGUgYFBvbHltZXIuVGVtcGxhdGl6ZXJgIGJlaGF2aW9yIGFkZHMgbWV0aG9kcyB0byBnZW5lcmF0ZSBpbnN0YW5jZXMgb2YKICAgICAqIHRlbXBsYXRlcyB0aGF0IGFyZSBlYWNoIG1hbmFnZWQgYnkgYW4gYW5vbnltb3VzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AKICAgICAqIGluc3RhbmNlIHdoZXJlIGRhdGEtYmluZGluZ3MgaW4gdGhlIHN0YW1wZWQgdGVtcGxhdGUgY29udGVudCBhcmUgYm91bmQgdG8KICAgICAqIGFjY2Vzc29ycyBvbiBpdHNlbGYuCiAgICAgKgogICAgICogVGhpcyBiZWhhdmlvciBpcyBwcm92aWRlZCBpbiBQb2x5bWVyIDIueCBhcyBhIGh5YnJpZC1lbGVtZW50IGNvbnZlbmllbmNlCiAgICAgKiBvbmx5LiAgRm9yIG5vbi1oeWJyaWQgdXNhZ2UsIHRoZSBgUG9seW1lci5UZW1wbGF0aXplYCBsaWJyYXJ5CiAgICAgKiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIC8vIEdldCBhIHRlbXBsYXRlIGZyb20gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKTsKICAgICAqICAgICAvLyBQcmVwYXJlIHRoZSB0ZW1wbGF0ZQogICAgICogICAgIHRoaXMudGVtcGxhdGl6ZSh0ZW1wbGF0ZSk7CiAgICAgKiAgICAgLy8gSW5zdGFuY2UgdGhlIHRlbXBsYXRlIHdpdGggYW4gaW5pdGlhbCBkYXRhIG1vZGVsCiAgICAgKiAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5zdGFtcCh7bXlQcm9wOiAnaW5pdGlhbCd9KTsKICAgICAqICAgICAvLyBJbnNlcnQgdGhlIGluc3RhbmNlJ3MgRE9NIHNvbWV3aGVyZSwgZS5nLiBsaWdodCBET00KICAgICAqICAgICBQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChpbnN0YW5jZS5yb290KTsKICAgICAqICAgICAvLyBDaGFuZ2luZyBhIHByb3BlcnR5IG9uIHRoZSBpbnN0YW5jZSB3aWxsIHByb3BhZ2F0ZSB0byBiaW5kaW5ncwogICAgICogICAgIC8vIGluIHRoZSB0ZW1wbGF0ZQogICAgICogICAgIGluc3RhbmNlLm15UHJvcCA9ICduZXcgdmFsdWUnOwogICAgICoKICAgICAqIFVzZXJzIG9mIGBUZW1wbGF0aXplcmAgbWF5IG5lZWQgdG8gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgYWJzdHJhY3QKICAgICAqIEFQSSdzIHRvIGRldGVybWluZSBob3cgcHJvcGVydGllcyBhbmQgcGF0aHMgZnJvbSB0aGUgaG9zdCBzaG91bGQgYmUKICAgICAqIGZvcndhcmRlZCBpbnRvIHRvIGluc3RhbmNlczoKICAgICAqCiAgICAgKiAgICAgX2ZvcndhcmRIb3N0UHJvcFYyOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkKICAgICAqCiAgICAgKiBMaWtld2lzZSwgdXNlcnMgbWF5IGltcGxlbWVudCB0aGVzZSBhZGRpdGlvbmFsIGFic3RyYWN0IEFQSSdzIHRvIGRldGVybWluZQogICAgICogaG93IGluc3RhbmNlLXNwZWNpZmljIHByb3BlcnRpZXMgdGhhdCBjaGFuZ2Ugb24gdGhlIGluc3RhbmNlIHNob3VsZCBiZQogICAgICogZm9yd2FyZGVkIG91dCB0byB0aGUgaG9zdCwgaWYgbmVjZXNzYXJ5LgogICAgICoKICAgICAqICAgICBfbm90aWZ5SW5zdGFuY2VQcm9wVjI6IGZ1bmN0aW9uKGluc3QsIHByb3AsIHZhbHVlKQogICAgICoKICAgICAqIEluIG9yZGVyIHRvIGRldGVybWluZSB3aGljaCBwcm9wZXJ0aWVzIGFyZSBpbnN0YW5jZS1zcGVjaWZpYyBhbmQgcmVxdWlyZQogICAgICogY3VzdG9tIG5vdGlmaWNhdGlvbiB2aWEgYF9ub3RpZnlJbnN0YW5jZVByb3BgLCBkZWZpbmUgYW4gYF9pbnN0YW5jZVByb3BzYAogICAgICogb2JqZWN0IGNvbnRhaW5pbmcga2V5cyBmb3IgZWFjaCBpbnN0YW5jZSBwcm9wLCBmb3IgZXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgX2luc3RhbmNlUHJvcHM6IHsKICAgICAqICAgICAgIGl0ZW06IHRydWUsCiAgICAgKiAgICAgICBpbmRleDogdHJ1ZQogICAgICogICAgIH0KICAgICAqCiAgICAgKiBBbnkgcHJvcGVydGllcyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGFyZSBub3QgZGVmaW5lZCBpbiBfaW5zdGFuY2VQcm9wCiAgICAgKiB3aWxsIGJlIGZvcndhcmRlZCBvdXQgdG8gdGhlIFRlbXBsYXRpemUgYG93bmVyYCBhdXRvbWF0aWNhbGx5LgogICAgICoKICAgICAqIFVzZXJzIG1heSBhbHNvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGFic3RyYWN0IGZ1bmN0aW9uIHRvIHNob3cgb3IKICAgICAqIGhpZGUgYW55IERPTSBnZW5lcmF0ZWQgdXNpbmcgYHN0YW1wYDoKICAgICAqCiAgICAgKiAgICAgX3Nob3dIaWRlQ2hpbGRyZW46IGZ1bmN0aW9uKHNob3VsZEhpZGUpCiAgICAgKgogICAgICogTm90ZSB0aGF0IHNvbWUgY2FsbGJhY2tzIGFyZSBzdWZmaXhlZCB3aXRoIGBWMmAgaW4gdGhlIFBvbHltZXIgMi54IGJlaGF2aW9yCiAgICAgKiBhcyB0aGUgaW1wbGVtZW50YXRpb25zIHdpbGwgbmVlZCB0byBkaWZmZXIgZnJvbSB0aGUgY2FsbGJhY2tzIHJlcXVpcmVkCiAgICAgKiBieSB0aGUgMS54IFRlbXBsYXRpemVyIEFQSSBkdWUgdG8gY2hhbmdlcyBpbiB0aGUgYFRlbXBsYXRlSW5zdGFuY2VgIEFQSQogICAgICogYmV0d2VlbiB2ZXJzaW9ucyAxLnggYW5kIDIueC4KICAgICAqCiAgICAgKiBAcG9seW1lckJlaGF2aW9yCiAgICAgKi8KICAgIFBvbHltZXIuVGVtcGxhdGl6ZXIgPSB7CgogICAgICAvKioKICAgICAgICogR2VuZXJhdGVzIGFuIGFub255bW91cyBgVGVtcGxhdGVJbnN0YW5jZWAgY2xhc3MgKHN0b3JlZCBhcyBgdGhpcy5jdG9yYCkKICAgICAgICogZm9yIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZS4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25jZSBwZXIKICAgICAgICogdGVtcGxhdGUgdG8gcHJlcGFyZSBhbiBlbGVtZW50IGZvciBzdGFtcGluZyB0aGUgdGVtcGxhdGUsIGZvbGxvd2VkCiAgICAgICAqIGJ5IGBzdGFtcGAgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBwcmVwYXJlCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG11dGFibGVEYXRhIFdoZW4gYHRydWVgLCB0aGUgZ2VuZXJhdGVkIGNsYXNzIHdpbGwgc2tpcAogICAgICAgKiAgIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0bwogICAgICAgKiAgIGJlICJkaXJ0eSIpLiBEZWZhdWx0cyB0byBmYWxzZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHRoaXMge1RlbXBsYXRpemVyVXNlcn0KICAgICAgICovCiAgICAgIHRlbXBsYXRpemUodGVtcGxhdGUsIG11dGFibGVEYXRhKSB7CiAgICAgICAgdGhpcy5fdGVtcGxhdGl6ZXJUZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICAgIHRoaXMuY3RvciA9IFBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRlbXBsYXRlLCB0aGlzLCB7CiAgICAgICAgICBtdXRhYmxlRGF0YTogQm9vbGVhbihtdXRhYmxlRGF0YSksCiAgICAgICAgICBwYXJlbnRNb2RlbDogdGhpcy5fcGFyZW50TW9kZWwsCiAgICAgICAgICBpbnN0YW5jZVByb3BzOiB0aGlzLl9pbnN0YW5jZVByb3BzLAogICAgICAgICAgZm9yd2FyZEhvc3RQcm9wOiB0aGlzLl9mb3J3YXJkSG9zdFByb3BWMiwKICAgICAgICAgIG5vdGlmeUluc3RhbmNlUHJvcDogdGhpcy5fbm90aWZ5SW5zdGFuY2VQcm9wVjIKICAgICAgICB9KTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSBwcmVwYXJlZCBieSBgdGVtcGxhdGl6ZWAuICBUaGUgb2JqZWN0CiAgICAgICAqIHJldHVybmVkIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBhbm9ueW1vdXMgY2xhc3MgZ2VuZXJhdGVkIGJ5IGB0ZW1wbGF0aXplYAogICAgICAgKiB3aG9zZSBgcm9vdGAgcHJvcGVydHkgaXMgYSBkb2N1bWVudCBmcmFnbWVudCBjb250YWluaW5nIG5ld2x5IGNsb25lZAogICAgICAgKiB0ZW1wbGF0ZSBjb250ZW50LCBhbmQgd2hpY2ggaGFzIHByb3BlcnR5IGFjY2Vzc29ycyBjb3JyZXNwb25kaW5nIHRvCiAgICAgICAqIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBpbiB0ZW1wbGF0ZSBiaW5kaW5ncy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBtb2RlbCBPYmplY3QgY29udGFpbmluZyBpbml0aWFsIHByb3BlcnR5IHZhbHVlcyB0bwogICAgICAgKiAgIHBvcHVsYXRlIGludG8gdGhlIHRlbXBsYXRlIGJpbmRpbmdzLgogICAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0gUmV0dXJucyB0aGUgY3JlYXRlZCBpbnN0YW5jZSBvZgogICAgICAgKiB0aGUgdGVtcGxhdGUgcHJlcGFyZWQgYnkgYHRlbXBsYXRpemVgLgogICAgICAgKiBAdGhpcyB7VGVtcGxhdGl6ZXJVc2VyfQogICAgICAgKi8KICAgICAgc3RhbXAobW9kZWwpIHsKICAgICAgICByZXR1cm4gbmV3IHRoaXMuY3Rvcihtb2RlbCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiAoYFRlbXBsYXRlSW5zdGFuY2VgKSBhc3NvY2lhdGVkIHdpdGgKICAgICAgICogYSBnaXZlbiBlbGVtZW50LCB3aGljaCBzZXJ2ZXMgYXMgdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBpbnN0YW5jZSB0aGUgZWxlbWVudCBpcyBjb250YWluZWQgaW4uICBBIHRlbXBsYXRlIG1vZGVsIHNob3VsZCBiZSB1c2VkCiAgICAgICAqIHRvIG1hbmlwdWxhdGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIGEgdGVtcGxhdGUgbW9kZWwuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBNb2RlbCByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICAgICAqICAgdGhlIGVsZW1lbnQuCiAgICAgICAqIEB0aGlzIHtUZW1wbGF0aXplclVzZXJ9CiAgICAgICAqLwogICAgICBtb2RlbEZvckVsZW1lbnQoZWwpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5UZW1wbGF0aXplLm1vZGVsRm9yRWxlbWVudCh0aGlzLl90ZW1wbGF0aXplclRlbXBsYXRlLCBlbCk7CiAgICAgIH0KICAgIH07CgogIH0pKCk7CgoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7SFRNTEVsZW1lbnR9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfR2VzdHVyZUV2ZW50TGlzdGVuZXJzfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgZG9tQmluZEJhc2UgPQogICAgICBQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycygKICAgICAgICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEoCiAgICAgICAgICBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhIVE1MRWxlbWVudCkpKTsKCiAgICAvKioKICAgICAqIEN1c3RvbSBlbGVtZW50IHRvIGFsbG93IHVzaW5nIFBvbHltZXIncyB0ZW1wbGF0ZSBmZWF0dXJlcyAoZGF0YSBiaW5kaW5nLAogICAgICogZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLCBldGMuKSBpbiB0aGUgbWFpbiBkb2N1bWVudCB3aXRob3V0IGRlZmluaW5nCiAgICAgKiBhIG5ldyBjdXN0b20gZWxlbWVudC4KICAgICAqCiAgICAgKiBgPHRlbXBsYXRlPmAgdGFncyB1dGlsaXppbmcgYmluZGluZ3MgbWF5IGJlIHdyYXBwZWQgd2l0aCB0aGUgYDxkb20tYmluZD5gCiAgICAgKiBlbGVtZW50LCB3aGljaCB3aWxsIGltbWVkaWF0ZWx5IHN0YW1wIHRoZSB3cmFwcGVkIHRlbXBsYXRlIGludG8gdGhlIG1haW4KICAgICAqIGRvY3VtZW50IGFuZCBiaW5kIGVsZW1lbnRzIHRvIHRoZSBgZG9tLWJpbmRgIGVsZW1lbnQgaXRzZWxmIGFzIHRoZQogICAgICogYmluZGluZyBzY29wZS4KICAgICAqCiAgICAgKiBAcG9seW1lcgogICAgICogQGN1c3RvbUVsZW1lbnQKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhCiAgICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzCiAgICAgKiBAZXh0ZW5kcyB7ZG9tQmluZEJhc2V9CiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdG8gYWxsb3cgdXNpbmcgUG9seW1lcidzIHRlbXBsYXRlIGZlYXR1cmVzIChkYXRhCiAgICAgKiAgIGJpbmRpbmcsIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycywgZXRjLikgaW4gdGhlIG1haW4gZG9jdW1lbnQuCiAgICAgKi8KICAgIGNsYXNzIERvbUJpbmQgZXh0ZW5kcyBkb21CaW5kQmFzZSB7CgogICAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsgcmV0dXJuIFsnbXV0YWJsZS1kYXRhJ107IH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGRvbS1iaW5kIG5vdCBhbGxvd2VkYCk7CiAgICAgICAgfQogICAgICAgIHRoaXMucm9vdCA9IG51bGw7CiAgICAgICAgdGhpcy4kID0gbnVsbDsKICAgICAgICB0aGlzLl9fY2hpbGRyZW4gPSBudWxsOwogICAgICB9CgogICAgICAvKiogQHJldHVybiB7dm9pZH0gKi8KICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCkgewogICAgICAgIC8vIGFzc3VtZXMgb25seSBvbmUgb2JzZXJ2ZWQgYXR0cmlidXRlCiAgICAgICAgdGhpcy5tdXRhYmxlRGF0YSA9IHRydWU7CiAgICAgIH0KCiAgICAgIC8qKiBAcmV0dXJuIHt2b2lkfSAqLwogICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgfQoKICAgICAgLyoqIEByZXR1cm4ge3ZvaWR9ICovCiAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHRoaXMuX19yZW1vdmVDaGlsZHJlbigpOwogICAgICB9CgogICAgICBfX2luc2VydENoaWxkcmVuKCkgewogICAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5yb290LCB0aGlzKTsKICAgICAgfQoKICAgICAgX19yZW1vdmVDaGlsZHJlbigpIHsKICAgICAgICBpZiAodGhpcy5fX2NoaWxkcmVuKSB7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5fX2NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLl9fY2hpbGRyZW5baV0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcmNlcyB0aGUgZWxlbWVudCB0byByZW5kZXIgaXRzIGNvbnRlbnQuIFRoaXMgaXMgdHlwaWNhbGx5IG9ubHkKICAgICAgICogbmVjZXNzYXJ5IHRvIGNhbGwgaWYgSFRNTEltcG9ydHMgd2l0aCB0aGUgYXN5bmMgYXR0cmlidXRlIGFyZSB1c2VkLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVuZGVyKCkgewogICAgICAgIGxldCB0ZW1wbGF0ZTsKICAgICAgICBpZiAoIXRoaXMuX19jaGlsZHJlbikgewogICAgICAgICAgdGVtcGxhdGUgPSAvKiogQHR5cGUge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRlbXBsYXRlIHx8IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgY2hpbGRMaXN0IGNoYW5nZXMgYW5kIHRlbXBsYXRlIHNob3VsZCBiZSB0aGVyZSBieSB0aGVuCiAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9tLWJpbmQgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgICAgdGhpcy4kID0gdGhpcy5yb290LiQ7CiAgICAgICAgICB0aGlzLl9fY2hpbGRyZW4gPSBbXTsKICAgICAgICAgIGZvciAobGV0IG49dGhpcy5yb290LmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgICB0aGlzLl9fY2hpbGRyZW5bdGhpcy5fX2NoaWxkcmVuLmxlbmd0aF0gPSBuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9faW5zZXJ0Q2hpbGRyZW4oKTsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkb20tY2hhbmdlJywgewogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICB9CgogICAgfQoKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZG9tLWJpbmQnLCBEb21CaW5kKTsKCiAgICAvKiogQGNvbnN0ICovCiAgICBQb2x5bWVyLkRvbUJpbmQgPSBEb21CaW5kOwoKICB9KSgpOwoKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvKioKICAgICAqIENsYXNzIHJlcHJlc2VudGluZyBhIHN0YXRpYyBzdHJpbmcgdmFsdWUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmlsdGVyCiAgICAgKiBzdHJpbmdzIGJ5IGFzc2V0aW5nIHRoYXQgdGhleSBoYXZlIGJlZW4gY3JlYXRlZCB2aWEgdGhpcyBjbGFzcy4gVGhlCiAgICAgKiBgdmFsdWVgIHByb3BlcnR5IHJldHVybnMgdGhlIHN0cmluZyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgogICAgICovCiAgICBjbGFzcyBMaXRlcmFsU3RyaW5nIHsKICAgICAgY29uc3RydWN0b3Ioc3RyaW5nKSB7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgdGhpcy52YWx1ZSA9IHN0cmluZy50b1N0cmluZygpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IExpdGVyYWxTdHJpbmcgc3RyaW5nIHZhbHVlCiAgICAgICAqLwogICAgICB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTAogICAgICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamAKICAgICAqLwogICAgZnVuY3Rpb24gbGl0ZXJhbFZhbHVlKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpdGVyYWxTdHJpbmcpIHsKICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHshTGl0ZXJhbFN0cmluZ30gKi8odmFsdWUpLnZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgbm9uLWxpdGVyYWwgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIuaHRtbExpdGVyYWw6ICR7dmFsdWV9YCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgT2JqZWN0IHRvIHN0cmluZ2lmeSBpbnRvIEhUTUwKICAgICAqIEByZXR1cm4ge3N0cmluZ30gSFRNTCBzdHJpbmdpZmllZCBmb3JtIG9mIGBvYmpgCiAgICAgKi8KICAgIGZ1bmN0aW9uIGh0bWxWYWx1ZSh2YWx1ZSkgewogICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7CiAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnQgfSAqLyh2YWx1ZSkuaW5uZXJIVE1MOwogICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGl0ZXJhbFN0cmluZykgewogICAgICAgIHJldHVybiBsaXRlcmFsVmFsdWUodmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgbm9uLXRlbXBsYXRlIHZhbHVlIHBhc3NlZCB0byBQb2x5bWVyLmh0bWw6ICR7dmFsdWV9YCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdGhhdCBjcmVhdGVzIGFuIEhUTUwgPHRlbXBsYXRlPiBlbGVtZW50IGZyb20gdGhlCiAgICAgKiBjb250ZW50cyBvZiB0aGUgc3RyaW5nLgogICAgICoKICAgICAqIFRoaXMgYWxsb3dzIHlvdSB0byB3cml0ZSBhIFBvbHltZXIgVGVtcGxhdGUgaW4gSmF2YVNjcmlwdC4KICAgICAqCiAgICAgKiBUZW1wbGF0ZXMgY2FuIGJlIGNvbXBvc2VkIGJ5IGludGVycG9sYXRpbmcgYEhUTUxUZW1wbGF0ZUVsZW1lbnRgcyBpbgogICAgICogZXhwcmVzc2lvbnMgaW4gdGhlIEphdmFTY3JpcHQgdGVtcGxhdGUgbGl0ZXJhbC4gVGhlIG5lc3RlZCB0ZW1wbGF0ZSdzCiAgICAgKiBgaW5uZXJIVE1MYCBpcyBpbmNsdWRlZCBpbiB0aGUgY29udGFpbmluZyB0ZW1wbGF0ZS4gIFRoZSBvbmx5IG90aGVyCiAgICAgKiB2YWx1ZXMgYWxsb3dlZCBpbiBleHByZXNzaW9ucyBhcmUgdGhvc2UgcmV0dXJuZWQgZnJvbSBgUG9seW1lci5odG1sTGl0ZXJhbGAKICAgICAqIHdoaWNoIGVuc3VyZXMgb25seSBsaXRlcmFsIHZhbHVlcyBmcm9tIEpTIHNvdXJjZSBldmVyIHJlYWNoIHRoZSBIVE1MLCB0bwogICAgICogZ3VhcmQgYWdhaW5zdCBYU1Mgcmlza3MuCiAgICAgKgogICAgICogQWxsIG90aGVyIHZhbHVlcyBhcmUgZGlzYWxsb3dlZCBpbiBleHByZXNzaW9ucyB0byBoZWxwIHByZXZlbnQgWFNTCiAgICAgKiBhdHRhY2tzOyBob3dldmVyLCBgUG9seW1lci5odG1sTGl0ZXJhbGAgY2FuIGJlIHVzZWQgdG8gY29tcG9zZSBzdGF0aWMKICAgICAqIHN0cmluZyB2YWx1ZXMgaW50byB0ZW1wbGF0ZXMuIFRoaXMgaXMgdXNlZnVsIHRvIGNvbXBvc2Ugc3RyaW5ncyBpbnRvCiAgICAgKiBwbGFjZXMgdGhhdCBkbyBub3QgYWNjZXB0IGh0bWwsIGxpa2UgdGhlIGNzcyB0ZXh0IG9mIGEgYHN0eWxlYAogICAgICogZWxlbWVudC4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICogICAgICAgcmV0dXJuIFBvbHltZXIuaHRtbGAKICAgICAqICAgICAgICAgPHN0eWxlPjpob3N0eyBjb250ZW50OiIuLi4iIH08L3N0eWxlPgogICAgICogICAgICAgICA8ZGl2IGNsYXNzPSJzaGFkb3dlZCI+JHt0aGlzLnBhcnRpYWxUZW1wbGF0ZX08L2Rpdj4KICAgICAqICAgICAgICAgJHtzdXBlci50ZW1wbGF0ZX0KICAgICAqICAgICAgIGA7CiAgICAgKiAgICAgfQogICAgICogICAgIHN0YXRpYyBnZXQgcGFydGlhbFRlbXBsYXRlKCkgeyByZXR1cm4gUG9seW1lci5odG1sYDxzcGFuPlBhcnRpYWwhPC9zcGFuPmA7IH0KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHBhcmFtIHshSVRlbXBsYXRlQXJyYXl9IHN0cmluZ3MgQ29uc3RhbnQgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEBwYXJhbSB7Li4uKn0gdmFsdWVzIFZhcmlhYmxlIHBhcnRzIG9mIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsCiAgICAgKiBAcmV0dXJuIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gQ29uc3RydWN0ZWQgSFRNTFRlbXBsYXRlRWxlbWVudAogICAgICovCiAgICBQb2x5bWVyLmh0bWwgPSBmdW5jdGlvbiBodG1sKHN0cmluZ3MsIC4uLnZhbHVlcykgewogICAgICBjb25zdCB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJykpOwogICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSB2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT4KICAgICAgICAgIGFjYyArIGh0bWxWYWx1ZSh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pOwogICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICB9OwoKICAgIC8qKgogICAgICogQW4gaHRtbCBsaXRlcmFsIHRhZyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggYFBvbHltZXIuaHRtbGAgdG8gY29tcG9zZS4KICAgICAqIGEgbGl0ZXJhbCBzdHJpbmcuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsKICAgICAqICAgICAgIHJldHVybiBQb2x5bWVyLmh0bWxgCiAgICAgKiAgICAgICAgIDxzdHlsZT4KICAgICAqICAgICAgICAgICA6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgKiAgICAgICAgICAgJHtzdHlsZVRlbXBsYXRlfQogICAgICogICAgICAgICA8L3N0eWxlPgogICAgICogICAgICAgICA8ZGl2IGNsYXNzPSJzaGFkb3dlZCI+JHtzdGF0aWNWYWx1ZX08L2Rpdj4KICAgICAqICAgICAgICAgJHtzdXBlci50ZW1wbGF0ZX0KICAgICAqICAgICAgIGA7CiAgICAgKiAgICAgfQogICAgICogICAgIHN0YXRpYyBnZXQgc3R5bGVUZW1wbGF0ZSgpIHsgcmV0dXJuIFBvbHltZXIuaHRtbExpdGVyYWxgLnNoYWRvd2VkIHsgYmFja2dyb3VuZDogZ3JheTsgfWA7IH0KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHBhcmFtIHshSVRlbXBsYXRlQXJyYXl9IHN0cmluZ3MgQ29uc3RhbnQgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEBwYXJhbSB7Li4uKn0gdmFsdWVzIFZhcmlhYmxlIHBhcnRzIG9mIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsCiAgICAgKiBAcmV0dXJuIHshTGl0ZXJhbFN0cmluZ30gQ29uc3RydWN0ZWQgbGl0ZXJhbCBzdHJpbmcKICAgICAqLwogICAgUG9seW1lci5odG1sTGl0ZXJhbCA9IGZ1bmN0aW9uKHN0cmluZ3MsIC4uLnZhbHVlcykgewogICAgICByZXR1cm4gbmV3IExpdGVyYWxTdHJpbmcodmFsdWVzLnJlZHVjZSgoYWNjLCB2LCBpZHgpID0+CiAgICAgICAgICBhY2MgKyBsaXRlcmFsVmFsdWUodikgKyBzdHJpbmdzW2lkeCArIDFdLCBzdHJpbmdzWzBdKSk7CiAgICB9OwogIH0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcKICAgKiBmZWF0dXJlcyBpbmNsdWRpbmcgdGVtcGxhdGUgc3RhbXBpbmcsIGRhdGEtYmluZGluZywgYXR0cmlidXRlIGRlc2VyaWFsaXphdGlvbiwKICAgKiBhbmQgcHJvcGVydHkgY2hhbmdlIG9ic2VydmF0aW9uLgogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBjb25zdHJ1Y3RvcgogICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0VsZW1lbnRNaXhpbn0KICAgKiBAZXh0ZW5kcyB7SFRNTEVsZW1lbnR9CiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLkVsZW1lbnRNaXhpbgogICAqIEBzdW1tYXJ5IEN1c3RvbSBlbGVtZW50IGJhc2UgY2xhc3MgdGhhdCBwcm92aWRlcyB0aGUgY29yZSBBUEkgZm9yIFBvbHltZXIncwogICAqICAga2V5IG1ldGEtcHJvZ3JhbW1pbmcgZmVhdHVyZXMgaW5jbHVkaW5nIHRlbXBsYXRlIHN0YW1waW5nLCBkYXRhLWJpbmRpbmcsCiAgICogICBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLCBhbmQgcHJvcGVydHkgY2hhbmdlIG9ic2VydmF0aW9uCiAgICovCiAgUG9seW1lci5FbGVtZW50ID0gUG9seW1lci5FbGVtZW50TWl4aW4oSFRNTEVsZW1lbnQpOwoKICAvLyBOT1RFOiB0aGlzIGlzIGhlcmUgZm9yIG1vZHVsaXplciB0byBleHBvcnQgYGh0bWxgIGZvciB0aGUgbW9kdWxlIHZlcnNpb24gb2YgdGhpcyBmaWxlCiAgUG9seW1lci5odG1sID0gUG9seW1lci5odG1sOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBUZW1wbGF0ZUluc3RhbmNlQmFzZSA9IFBvbHltZXIuVGVtcGxhdGVJbnN0YW5jZUJhc2U7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKCiAgLyoqCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGltcGxlbWVudHMge1BvbHltZXJfT3B0aW9uYWxNdXRhYmxlRGF0YX0KICAgKiBAZXh0ZW5kcyB7UG9seW1lci5FbGVtZW50fQogICAqIEBwcml2YXRlCiAgICovCiAgY29uc3QgZG9tUmVwZWF0QmFzZSA9IFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YShQb2x5bWVyLkVsZW1lbnQpOwoKICAvKioKICAgKiBUaGUgYDxkb20tcmVwZWF0PmAgZWxlbWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgc3RhbXAgYW5kIGJpbmRzIG9uZSBpbnN0YW5jZQogICAqIG9mIHRlbXBsYXRlIGNvbnRlbnQgdG8gZWFjaCBvYmplY3QgaW4gYSB1c2VyLXByb3ZpZGVkIGFycmF5LgogICAqIGBkb20tcmVwZWF0YCBhY2NlcHRzIGFuIGBpdGVtc2AgcHJvcGVydHksIGFuZCBvbmUgaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlCiAgICogaXMgc3RhbXBlZCBmb3IgZWFjaCBpdGVtIGludG8gdGhlIERPTSBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGBkb20tcmVwZWF0YAogICAqIGVsZW1lbnQuICBUaGUgYGl0ZW1gIHByb3BlcnR5IHdpbGwgYmUgc2V0IG9uIGVhY2ggaW5zdGFuY2UncyBiaW5kaW5nCiAgICogc2NvcGUsIHRodXMgdGVtcGxhdGVzIHNob3VsZCBiaW5kIHRvIHN1Yi1wcm9wZXJ0aWVzIG9mIGBpdGVtYC4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1tb2R1bGUgaWQ9ImVtcGxveWVlLWxpc3QiPgogICAqCiAgICogICA8dGVtcGxhdGU+CiAgICoKICAgKiAgICAgPGRpdj4gRW1wbG95ZWUgbGlzdDogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e2VtcGxveWVlc319Ij4KICAgKiAgICAgICA8dGVtcGxhdGU+CiAgICogICAgICAgICA8ZGl2PkZpcnN0IG5hbWU6IDxzcGFuPnt7aXRlbS5maXJzdH19PC9zcGFuPjwvZGl2PgogICAqICAgICAgICAgPGRpdj5MYXN0IG5hbWU6IDxzcGFuPnt7aXRlbS5sYXN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgPC90ZW1wbGF0ZT4KICAgKiAgICAgPC9kb20tcmVwZWF0PgogICAqCiAgICogICA8L3RlbXBsYXRlPgogICAqCiAgICogPC9kb20tbW9kdWxlPgogICAqIGBgYAogICAqCiAgICogV2l0aCB0aGUgZm9sbG93aW5nIGN1c3RvbSBlbGVtZW50IGRlZmluaXRpb246CiAgICoKICAgKiBgYGBqcwogICAqIGNsYXNzIEVtcGxveWVlTGlzdCBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CiAgICogICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2VtcGxveWVlLWxpc3QnOyB9CiAgICogICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICogICAgIHJldHVybiB7CiAgICogICAgICAgZW1wbG95ZWVzOiB7CiAgICogICAgICAgICB2YWx1ZSgpIHsKICAgKiAgICAgICAgICAgcmV0dXJuIFsKICAgKiAgICAgICAgICAgICB7Zmlyc3Q6ICdCb2InLCBsYXN0OiAnU21pdGgnfSwKICAgKiAgICAgICAgICAgICB7Zmlyc3Q6ICdTYWxseScsIGxhc3Q6ICdKb2huc29uJ30sCiAgICogICAgICAgICAgICAgLi4uCiAgICogICAgICAgICAgIF07CiAgICogICAgICAgICB9CiAgICogICAgICAgfQogICAqICAgICB9OwogICAqICAgfQogICAqIH0KICAgKiBgYGAKICAgKgogICAqIE5vdGlmaWNhdGlvbnMgZm9yIGNoYW5nZXMgdG8gaXRlbXMgc3ViLXByb3BlcnRpZXMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGVtcGxhdGUKICAgKiBpbnN0YW5jZXMsIHdoaWNoIHdpbGwgdXBkYXRlIHZpYSB0aGUgbm9ybWFsIHN0cnVjdHVyZWQgZGF0YSBub3RpZmljYXRpb24gc3lzdGVtLgogICAqCiAgICogTXV0YXRpb25zIHRvIHRoZSBgaXRlbXNgIGFycmF5IGl0c2VsZiBzaG91bGQgYmUgbWFkZSB1c2luZyB0aGUgQXJyYXkKICAgKiBtdXRhdGlvbiBBUEkncyBvbiBgUG9seW1lci5CYXNlYCAoYHB1c2hgLCBgcG9wYCwgYHNwbGljZWAsIGBzaGlmdGAsCiAgICogYHVuc2hpZnRgKSwgYW5kIHRlbXBsYXRlIGluc3RhbmNlcyB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBkYXRhIGluIHRoZQogICAqIGFycmF5LgogICAqCiAgICogRXZlbnRzIGNhdWdodCBieSBldmVudCBoYW5kbGVycyB3aXRoaW4gdGhlIGBkb20tcmVwZWF0YCB0ZW1wbGF0ZSB3aWxsIGJlCiAgICogZGVjb3JhdGVkIHdpdGggYSBgbW9kZWxgIHByb3BlcnR5LCB3aGljaCByZXByZXNlbnRzIHRoZSBiaW5kaW5nIHNjb3BlIGZvcgogICAqIGVhY2ggdGVtcGxhdGUgaW5zdGFuY2UuICBUaGUgbW9kZWwgaXMgYW4gaW5zdGFuY2Ugb2YgUG9seW1lci5CYXNlLCBhbmQgc2hvdWxkCiAgICogYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEgb24gdGhlIGluc3RhbmNlLCBmb3IgZXhhbXBsZQogICAqIGBldmVudC5tb2RlbC5zZXQoJ2l0ZW0uY2hlY2tlZCcsIHRydWUpO2AuCiAgICoKICAgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgbW9kZWwgZm9yIGEgdGVtcGxhdGUgaW5zdGFuY2UgZm9yIGFuIGVsZW1lbnQgc3RhbXBlZCBieQogICAqIGEgYGRvbS1yZXBlYXRgIGNhbiBiZSBvYnRhaW5lZCB1c2luZyB0aGUgYG1vZGVsRm9yRWxlbWVudGAgQVBJIG9uIHRoZQogICAqIGBkb20tcmVwZWF0YCB0aGF0IHN0YW1wZWQgaXQsIGZvciBleGFtcGxlCiAgICogYHRoaXMuJC5kb21SZXBlYXQubW9kZWxGb3JFbGVtZW50KGV2ZW50LnRhcmdldCkuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTtgLgogICAqIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgbWFuaXB1bGF0aW5nIGluc3RhbmNlIGRhdGEgb2YgZXZlbnQgdGFyZ2V0cyBvYnRhaW5lZAogICAqIGJ5IGV2ZW50IGhhbmRsZXJzIG9uIHBhcmVudHMgb2YgdGhlIGBkb20tcmVwZWF0YCAoZXZlbnQgZGVsZWdhdGlvbikuCiAgICoKICAgKiBBIHZpZXctc3BlY2lmaWMgZmlsdGVyL3NvcnQgbWF5IGJlIGFwcGxpZWQgdG8gZWFjaCBgZG9tLXJlcGVhdGAgYnkgc3VwcGx5aW5nIGEKICAgKiBgZmlsdGVyYCBhbmQvb3IgYHNvcnRgIHByb3BlcnR5LiAgVGhpcyBtYXkgYmUgYSBzdHJpbmcgdGhhdCBuYW1lcyBhIGZ1bmN0aW9uIG9uCiAgICogdGhlIGhvc3QsIG9yIGEgZnVuY3Rpb24gbWF5IGJlIGFzc2lnbmVkIHRvIHRoZSBwcm9wZXJ0eSBkaXJlY3RseS4gIFRoZSBmdW5jdGlvbnMKICAgKiBzaG91bGQgaW1wbGVtZW50ZWQgZm9sbG93aW5nIHRoZSBzdGFuZGFyZCBgQXJyYXlgIGZpbHRlci9zb3J0IEFQSS4KICAgKgogICAqIEluIG9yZGVyIHRvIHJlLXJ1biB0aGUgZmlsdGVyIG9yIHNvcnQgZnVuY3Rpb25zIGJhc2VkIG9uIGNoYW5nZXMgdG8gc3ViLWZpZWxkcwogICAqIG9mIGBpdGVtc2AsIHRoZSBgb2JzZXJ2ZWAgcHJvcGVydHkgbWF5IGJlIHNldCBhcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mCiAgICogYGl0ZW1gIHN1Yi1maWVsZHMgdGhhdCBzaG91bGQgY2F1c2UgYSByZS1maWx0ZXIvc29ydCB3aGVuIG1vZGlmaWVkLiAgSWYKICAgKiB0aGUgZmlsdGVyIG9yIHNvcnQgZnVuY3Rpb24gZGVwZW5kcyBvbiBwcm9wZXJ0aWVzIG5vdCBjb250YWluZWQgaW4gYGl0ZW1zYCwKICAgKiB0aGUgdXNlciBzaG91bGQgb2JzZXJ2ZSBjaGFuZ2VzIHRvIHRob3NlIHByb3BlcnRpZXMgYW5kIGNhbGwgYHJlbmRlcmAgdG8gdXBkYXRlCiAgICogdGhlIHZpZXcgYmFzZWQgb24gdGhlIGRlcGVuZGVuY3kgY2hhbmdlLgogICAqCiAgICogRm9yIGV4YW1wbGUsIGZvciBhbiBgZG9tLXJlcGVhdGAgd2l0aCBhIGZpbHRlciBvZiB0aGUgZm9sbG93aW5nOgogICAqCiAgICogYGBganMKICAgKiBpc0VuZ2luZWVyKGl0ZW0pIHsKICAgKiAgIHJldHVybiBpdGVtLnR5cGUgPT0gJ2VuZ2luZWVyJyB8fCBpdGVtLm1hbmFnZXIudHlwZSA9PSAnZW5naW5lZXInOwogICAqIH0KICAgKiBgYGAKICAgKgogICAqIFRoZW4gdGhlIGBvYnNlcnZlYCBwcm9wZXJ0eSBzaG91bGQgYmUgY29uZmlndXJlZCBhcyBmb2xsb3dzOgogICAqCiAgICogYGBgaHRtbAogICAqIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e2VtcGxveWVlc319IiBmaWx0ZXI9ImlzRW5naW5lZXIiIG9ic2VydmU9InR5cGUgbWFuYWdlci50eXBlIj4KICAgKiBgYGAKICAgKgogICAqIEBjdXN0b21FbGVtZW50CiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBleHRlbmRzIHtkb21SZXBlYXRCYXNlfQogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgZm9yIHN0YW1waW5nIGluc3RhbmNlIG9mIGEgdGVtcGxhdGUgYm91bmQgdG8KICAgKiAgIGl0ZW1zIGluIGFuIGFycmF5LgogICAqLwogIGNsYXNzIERvbVJlcGVhdCBleHRlbmRzIGRvbVJlcGVhdEJhc2UgewoKICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2RvbS1yZXBlYXQnOyB9CgogICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsgcmV0dXJuIG51bGw7IH0KCiAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICAvKioKICAgICAgICogRmlyZWQgd2hlbmV2ZXIgRE9NIGlzIGFkZGVkIG9yIHJlbW92ZWQgYnkgdGhpcyB0ZW1wbGF0ZSAoYnkKICAgICAgICogZGVmYXVsdCwgcmVuZGVyaW5nIG9jY3VycyBsYXppbHkpLiAgVG8gZm9yY2UgaW1tZWRpYXRlIHJlbmRlcmluZywgY2FsbAogICAgICAgKiBgcmVuZGVyYC4KICAgICAgICoKICAgICAgICogQGV2ZW50IGRvbS1jaGFuZ2UKICAgICAgICovCiAgICAgIHJldHVybiB7CgogICAgICAgIC8qKgogICAgICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgaXRlbXMgZGV0ZXJtaW5pbmcgaG93IG1hbnkgaW5zdGFuY2VzIG9mIHRoZSB0ZW1wbGF0ZQogICAgICAgICAqIHRvIHN0YW1wIGFuZCB0aGF0IHRoYXQgZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZSBzaG91bGQgYmluZCB0by4KICAgICAgICAgKi8KICAgICAgICBpdGVtczogewogICAgICAgICAgdHlwZTogQXJyYXkKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgYXJyYXkKICAgICAgICAgKiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGFzOiB7CiAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICB2YWx1ZTogJ2l0ZW0nCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGFkZCB0byB0aGUgYmluZGluZyBzY29wZSB3aXRoIHRoZSBpbmRleAogICAgICAgICAqIG9mIHRoZSBpbnN0YW5jZSBpbiB0aGUgc29ydGVkIGFuZCBmaWx0ZXJlZCBsaXN0IG9mIHJlbmRlcmVkIGl0ZW1zLgogICAgICAgICAqIE5vdGUsIGZvciB0aGUgaW5kZXggaW4gdGhlIGB0aGlzLml0ZW1zYCBhcnJheSwgdXNlIHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgICAgKiBgaXRlbXNJbmRleEFzYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBpbmRleEFzOiB7CiAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICB2YWx1ZTogJ2luZGV4JwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBhZGQgdG8gdGhlIGJpbmRpbmcgc2NvcGUgd2l0aCB0aGUgaW5kZXgKICAgICAgICAgKiBvZiB0aGUgaW5zdGFuY2UgaW4gdGhlIGB0aGlzLml0ZW1zYCBhcnJheS4gTm90ZSwgZm9yIHRoZSBpbmRleCBvZgogICAgICAgICAqIHRoaXMgaW5zdGFuY2UgaW4gdGhlIHNvcnRlZCBhbmQgZmlsdGVyZWQgbGlzdCBvZiByZW5kZXJlZCBpdGVtcywKICAgICAgICAgKiB1c2UgdGhlIHZhbHVlIG9mIHRoZSBgaW5kZXhBc2AgcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgaXRlbXNJbmRleEFzOiB7CiAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICB2YWx1ZTogJ2l0ZW1zSW5kZXgnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBkZXRlcm1pbmUgdGhlIHNvcnQgb3JkZXIgb2YgdGhlIGl0ZW1zLiAgVGhpcwogICAgICAgICAqIHByb3BlcnR5IHNob3VsZCBlaXRoZXIgYmUgcHJvdmlkZWQgYXMgYSBzdHJpbmcsIGluZGljYXRpbmcgYSBtZXRob2QKICAgICAgICAgKiBuYW1lIG9uIHRoZSBlbGVtZW50J3MgaG9zdCwgb3IgZWxzZSBiZSBhbiBhY3R1YWwgZnVuY3Rpb24uICBUaGUKICAgICAgICAgKiBmdW5jdGlvbiBzaG91bGQgbWF0Y2ggdGhlIHNvcnQgZnVuY3Rpb24gcGFzc2VkIHRvIGBBcnJheS5zb3J0YC4KICAgICAgICAgKiBVc2luZyBhIHNvcnQgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgdW5kZXJseWluZyBgaXRlbXNgIGFycmF5LgogICAgICAgICAqLwogICAgICAgIHNvcnQ6IHsKICAgICAgICAgIHR5cGU6IEZ1bmN0aW9uLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX3NvcnRDaGFuZ2VkJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgaXRlbXMgb3V0IG9mIHRoZSB2aWV3LiAgVGhpcwogICAgICAgICAqIHByb3BlcnR5IHNob3VsZCBlaXRoZXIgYmUgcHJvdmlkZWQgYXMgYSBzdHJpbmcsIGluZGljYXRpbmcgYSBtZXRob2QKICAgICAgICAgKiBuYW1lIG9uIHRoZSBlbGVtZW50J3MgaG9zdCwgb3IgZWxzZSBiZSBhbiBhY3R1YWwgZnVuY3Rpb24uICBUaGUKICAgICAgICAgKiBmdW5jdGlvbiBzaG91bGQgbWF0Y2ggdGhlIHNvcnQgZnVuY3Rpb24gcGFzc2VkIHRvIGBBcnJheS5maWx0ZXJgLgogICAgICAgICAqIFVzaW5nIGEgZmlsdGVyIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHVuZGVybHlpbmcgYGl0ZW1zYCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBmaWx0ZXI6IHsKICAgICAgICAgIHR5cGU6IEZ1bmN0aW9uLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX2ZpbHRlckNoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiB1c2luZyBhIGBmaWx0ZXJgIG9yIGBzb3J0YCBmdW5jdGlvbiwgdGhlIGBvYnNlcnZlYCBwcm9wZXJ0eQogICAgICAgICAqIHNob3VsZCBiZSBzZXQgdG8gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbmFtZXMgb2YgaXRlbQogICAgICAgICAqIHN1Yi1maWVsZHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIHJlLXNvcnQgb3IgcmUtZmlsdGVyIHdoZW4gY2hhbmdlZC4KICAgICAgICAgKiBUaGVzZSBzaG91bGQgZ2VuZXJhbGx5IGJlIGZpZWxkcyBvZiBgaXRlbWAgdGhhdCB0aGUgc29ydCBvciBmaWx0ZXIKICAgICAgICAgKiBmdW5jdGlvbiBkZXBlbmRzIG9uLgogICAgICAgICAqLwogICAgICAgIG9ic2VydmU6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIG9ic2VydmVyOiAnX19vYnNlcnZlQ2hhbmdlZCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHVzaW5nIGEgYGZpbHRlcmAgb3IgYHNvcnRgIGZ1bmN0aW9uLCB0aGUgYGRlbGF5YCBwcm9wZXJ0eQogICAgICAgICAqIGRldGVybWluZXMgYSBkZWJvdW5jZSB0aW1lIGluIG1zIGFmdGVyIGEgY2hhbmdlIHRvIG9ic2VydmVkIGl0ZW0KICAgICAgICAgKiBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBwYXNzIGJlZm9yZSB0aGUgZmlsdGVyIG9yIHNvcnQgaXMgcmUtcnVuLgogICAgICAgICAqIFRoaXMgaXMgdXNlZnVsIGluIHJhdGUtbGltaXRpbmcgc2h1ZmZsaW5nIG9mIHRoZSB2aWV3IHdoZW4KICAgICAgICAgKiBpdGVtIGNoYW5nZXMgbWF5IGJlIGZyZXF1ZW50LgogICAgICAgICAqLwogICAgICAgIGRlbGF5OiBOdW1iZXIsCgogICAgICAgIC8qKgogICAgICAgICAqIENvdW50IG9mIGN1cnJlbnRseSByZW5kZXJlZCBpdGVtcyBhZnRlciBgZmlsdGVyYCAoaWYgYW55KSBoYXMgYmVlbiBhcHBsaWVkLgogICAgICAgICAqIElmICJjaHVua2luZyBtb2RlIiBpcyBlbmFibGVkLCBgcmVuZGVyZWRJdGVtQ291bnRgIGlzIHVwZGF0ZWQgZWFjaCB0aW1lIGEKICAgICAgICAgKiBzZXQgb2YgdGVtcGxhdGUgaW5zdGFuY2VzIGlzIHJlbmRlcmVkLgogICAgICAgICAqCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyZWRJdGVtQ291bnQ6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgIHJlYWRPbmx5OiB0cnVlCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmaW5lcyBhbiBpbml0aWFsIGNvdW50IG9mIHRlbXBsYXRlIGluc3RhbmNlcyB0byByZW5kZXIgYWZ0ZXIgc2V0dGluZwogICAgICAgICAqIHRoZSBgaXRlbXNgIGFycmF5LCBiZWZvcmUgdGhlIG5leHQgcGFpbnQsIGFuZCBwdXRzIHRoZSBgZG9tLXJlcGVhdGAKICAgICAgICAgKiBpbnRvICJjaHVua2luZyBtb2RlIi4gIFRoZSByZW1haW5pbmcgaXRlbXMgd2lsbCBiZSBjcmVhdGVkIGFuZCByZW5kZXJlZAogICAgICAgICAqIGluY3JlbWVudGFsbHkgYXQgZWFjaCBhbmltYXRpb24gZnJhbWUgdGhlcm9mIHVudGlsIGFsbCBpbnN0YW5jZXMgaGF2ZQogICAgICAgICAqIGJlZW4gcmVuZGVyZWQuCiAgICAgICAgICovCiAgICAgICAgaW5pdGlhbENvdW50OiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICBvYnNlcnZlcjogJ19faW5pdGlhbGl6ZUNodW5raW5nJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gYGluaXRpYWxDb3VudGAgaXMgdXNlZCwgdGhpcyBwcm9wZXJ0eSBkZWZpbmVzIGEgZnJhbWUgcmF0ZSAoaW4KICAgICAgICAgKiBmcHMpIHRvIHRhcmdldCBieSB0aHJvdHRsaW5nIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIHJlbmRlcmVkIGVhY2gKICAgICAgICAgKiBmcmFtZSB0byBub3QgZXhjZWVkIHRoZSBidWRnZXQgZm9yIHRoZSB0YXJnZXQgZnJhbWUgcmF0ZS4gIFRoZQogICAgICAgICAqIGZyYW1lcmF0ZSBpcyBlZmZlY3RpdmVseSB0aGUgbnVtYmVyIG9mIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgcyB0aGF0CiAgICAgICAgICogaXQgdHJpZXMgdG8gYWxsb3cgdG8gYWN0dWFsbHkgZmlyZSBpbiBhIGdpdmVuIHNlY29uZC4gSXQgZG9lcyB0aGlzCiAgICAgICAgICogYnkgbWVhc3VyaW5nIHRoZSB0aW1lIGJldHdlZW4gYHJBRmBzIGFuZCBjb250aW51b3VzbHkgYWRqdXN0aW5nIHRoZQogICAgICAgICAqIG51bWJlciBvZiBpdGVtcyBjcmVhdGVkIGVhY2ggYHJBRmAgdG8gbWFpbnRhaW4gdGhlIHRhcmdldCBmcmFtZXJhdGUuCiAgICAgICAgICogU2V0dGluZyB0aGlzIHRvIGEgaGlnaGVyIG51bWJlciBhbGxvd3MgbG93ZXIgbGF0ZW5jeSBhbmQgaGlnaGVyCiAgICAgICAgICogdGhyb3VnaHB1dCBmb3IgZXZlbnQgaGFuZGxlcnMgYW5kIG90aGVyIHRhc2tzLCBidXQgcmVzdWx0cyBpbiBhCiAgICAgICAgICogbG9uZ2VyIHRpbWUgZm9yIHRoZSByZW1haW5pbmcgaXRlbXMgdG8gY29tcGxldGUgcmVuZGVyaW5nLgogICAgICAgICAqLwogICAgICAgIHRhcmdldEZyYW1lcmF0ZTogewogICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgdmFsdWU6IDIwCiAgICAgICAgfSwKCiAgICAgICAgX3RhcmdldEZyYW1lVGltZTogewogICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgY29tcHV0ZWQ6ICdfX2NvbXB1dGVGcmFtZVRpbWUodGFyZ2V0RnJhbWVyYXRlKScKICAgICAgICB9CgogICAgICB9OwoKICAgIH0KCiAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgcmV0dXJuIFsgJ19faXRlbXNDaGFuZ2VkKGl0ZW1zLiopJyBdOwogICAgfQoKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLl9faW5zdGFuY2VzID0gW107CiAgICAgIHRoaXMuX19saW1pdCA9IEluZmluaXR5OwogICAgICB0aGlzLl9fcG9vbCA9IFtdOwogICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyID0gbnVsbDsKICAgICAgdGhpcy5fX2l0ZW1zSWR4VG9JbnN0SWR4ID0ge307CiAgICAgIHRoaXMuX19jaHVua0NvdW50ID0gbnVsbDsKICAgICAgdGhpcy5fX2xhc3RDaHVua1RpbWUgPSBudWxsOwogICAgICB0aGlzLl9fc29ydEZuID0gbnVsbDsKICAgICAgdGhpcy5fX2ZpbHRlckZuID0gbnVsbDsKICAgICAgdGhpcy5fX29ic2VydmVQYXRocyA9IG51bGw7CiAgICAgIHRoaXMuX19jdG9yID0gbnVsbDsKICAgICAgdGhpcy5fX2lzRGV0YWNoZWQgPSB0cnVlOwogICAgICB0aGlzLnRlbXBsYXRlID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IHRydWU7CiAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9faW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5fX2RldGFjaEluc3RhbmNlKGkpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAvLyBvbmx5IHBlcmZvcm0gYXR0YWNobWVudCBpZiB0aGUgZWxlbWVudCB3YXMgcHJldmlvdXNseSBkZXRhY2hlZC4KICAgICAgaWYgKHRoaXMuX19pc0RldGFjaGVkKSB7CiAgICAgICAgdGhpcy5fX2lzRGV0YWNoZWQgPSBmYWxzZTsKICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9faW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLl9fYXR0YWNoSW5zdGFuY2UoaSwgcGFyZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX2Vuc3VyZVRlbXBsYXRpemVkKCkgewogICAgICAvLyBUZW1wbGF0aXppbmcgKGdlbmVyYXRpbmcgdGhlIGluc3RhbmNlIGNvbnN0cnVjdG9yKSBuZWVkcyB0byB3YWl0CiAgICAgIC8vIHVudGlsIHJlYWR5LCBzaW5jZSB3b24ndCBoYXZlIGl0cyB0ZW1wbGF0ZSBjb250ZW50IGhhbmRlZCBiYWNrIHRvCiAgICAgIC8vIGl0IHVudGlsIHRoZW4KICAgICAgaWYgKCF0aGlzLl9fY3RvcikgewogICAgICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUgPSAvKiogQHR5cGUge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgaWYgKCF0ZW1wbGF0ZSkgewogICAgICAgICAgLy8gLy8gV2FpdCB1bnRpbCBjaGlsZExpc3QgY2hhbmdlcyBhbmQgdGVtcGxhdGUgc2hvdWxkIGJlIHRoZXJlIGJ5IHRoZW4KICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSkgewogICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICB0aGlzLl9fcmVuZGVyKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb20tcmVwZWF0IHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywge2NoaWxkTGlzdDogdHJ1ZX0pOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvLyBUZW1wbGF0ZSBpbnN0YW5jZSBwcm9wcyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIGZvcndhcmRpbmcKICAgICAgICBsZXQgaW5zdGFuY2VQcm9wcyA9IHt9OwogICAgICAgIGluc3RhbmNlUHJvcHNbdGhpcy5hc10gPSB0cnVlOwogICAgICAgIGluc3RhbmNlUHJvcHNbdGhpcy5pbmRleEFzXSA9IHRydWU7CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLml0ZW1zSW5kZXhBc10gPSB0cnVlOwogICAgICAgIHRoaXMuX19jdG9yID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgIG11dGFibGVEYXRhOiB0aGlzLm11dGFibGVEYXRhLAogICAgICAgICAgcGFyZW50TW9kZWw6IHRydWUsCiAgICAgICAgICBpbnN0YW5jZVByb3BzOiBpbnN0YW5jZVByb3BzLAogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBAdGhpcyB7dGhpc30KICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IHRvIHNldAogICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQgcHJvcGVydHkgdG8KICAgICAgICAgICAqLwogICAgICAgICAgZm9yd2FyZEhvc3RQcm9wOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICBsZXQgaSQgPSB0aGlzLl9faW5zdGFuY2VzOwogICAgICAgICAgICBmb3IgKGxldCBpPTAsIGluc3Q7IChpPGkkLmxlbmd0aCkgJiYgKGluc3Q9aSRbaV0pOyBpKyspIHsKICAgICAgICAgICAgICBpbnN0LmZvcndhcmRIb3N0UHJvcChwcm9wLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGluc3QgSW5zdGFuY2UgdG8gbm90aWZ5CiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0byBub3RpZnkKICAgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gbm90aWZ5CiAgICAgICAgICAgKi8KICAgICAgICAgIG5vdGlmeUluc3RhbmNlUHJvcDogZnVuY3Rpb24oaW5zdCwgcHJvcCwgdmFsdWUpIHsKICAgICAgICAgICAgaWYgKFBvbHltZXIuUGF0aC5tYXRjaGVzKHRoaXMuYXMsIHByb3ApKSB7CiAgICAgICAgICAgICAgbGV0IGlkeCA9IGluc3RbdGhpcy5pdGVtc0luZGV4QXNdOwogICAgICAgICAgICAgIGlmIChwcm9wID09IHRoaXMuYXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNbaWR4XSA9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsZXQgcGF0aCA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUodGhpcy5hcywgJ2l0ZW1zLicgKyBpZHgsIHByb3ApOwogICAgICAgICAgICAgIHRoaXMubm90aWZ5UGF0aChwYXRoLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBfX2dldE1ldGhvZEhvc3QoKSB7CiAgICAgIC8vIFRlY2huaWNhbGx5IHRoaXMgc2hvdWxkIGJlIHRoZSBvd25lciBvZiB0aGUgb3V0ZXJtb3N0IHRlbXBsYXRlLgogICAgICAvLyBJbiBzaGFkb3cgZG9tLCB0aGlzIGlzIGFsd2F5cyBnZXRSb290Tm9kZSgpLmhvc3QsIGJ1dCB3ZSBjYW4KICAgICAgLy8gYXBwcm94aW1hdGUgdGhpcyB2aWEgY29vcGVyYXRpb24gd2l0aCBvdXIgZGF0YUhvc3QgYWx3YXlzIHNldHRpbmcKICAgICAgLy8gYF9tZXRob2RIb3N0YCBhcyBsb25nIGFzIHRoZXJlIHdlcmUgYmluZGluZ3MgKG9yIGlkJ3MpIG9uIHRoaXMKICAgICAgLy8gaW5zdGFuY2UgY2F1c2luZyBpdCB0byBnZXQgYSBkYXRhSG9zdC4KICAgICAgcmV0dXJuIHRoaXMuX19kYXRhSG9zdC5fbWV0aG9kSG9zdCB8fCB0aGlzLl9fZGF0YUhvc3Q7CiAgICB9CgogICAgX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKGZ1bmN0aW9uT3JNZXRob2ROYW1lKSB7CiAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25Pck1ldGhvZE5hbWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgbGV0IG1ldGhvZE5hbWUgPSBmdW5jdGlvbk9yTWV0aG9kTmFtZTsKICAgICAgICBsZXQgb2JqID0gdGhpcy5fX2dldE1ldGhvZEhvc3QoKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiBvYmpbbWV0aG9kTmFtZV0uYXBwbHkob2JqLCBhcmd1bWVudHMpOyB9OwogICAgICB9CgogICAgICByZXR1cm4gZnVuY3Rpb25Pck1ldGhvZE5hbWU7CiAgICB9CgogICAgX19zb3J0Q2hhbmdlZChzb3J0KSB7CiAgICAgIHRoaXMuX19zb3J0Rm4gPSB0aGlzLl9fZnVuY3Rpb25Gcm9tUHJvcGVydHlWYWx1ZShzb3J0KTsKICAgICAgaWYgKHRoaXMuaXRlbXMpIHsgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOyB9CiAgICB9CgogICAgX19maWx0ZXJDaGFuZ2VkKGZpbHRlcikgewogICAgICB0aGlzLl9fZmlsdGVyRm4gPSB0aGlzLl9fZnVuY3Rpb25Gcm9tUHJvcGVydHlWYWx1ZShmaWx0ZXIpOwogICAgICBpZiAodGhpcy5pdGVtcykgeyB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7IH0KICAgIH0KCiAgICBfX2NvbXB1dGVGcmFtZVRpbWUocmF0ZSkgewogICAgICByZXR1cm4gTWF0aC5jZWlsKDEwMDAvcmF0ZSk7CiAgICB9CgogICAgX19pbml0aWFsaXplQ2h1bmtpbmcoKSB7CiAgICAgIGlmICh0aGlzLmluaXRpYWxDb3VudCkgewogICAgICAgIHRoaXMuX19saW1pdCA9IHRoaXMuaW5pdGlhbENvdW50OwogICAgICAgIHRoaXMuX19jaHVua0NvdW50ID0gdGhpcy5pbml0aWFsQ291bnQ7CiAgICAgICAgdGhpcy5fX2xhc3RDaHVua1RpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgfQogICAgfQoKICAgIF9fdHJ5UmVuZGVyQ2h1bmsoKSB7CiAgICAgIC8vIERlYm91bmNlZCBzbyB0aGF0IG11bHRpcGxlIGNhbGxzIHRocm91Z2ggYF9yZW5kZXJgIGJldHdlZW4gYW5pbWF0aW9uCiAgICAgIC8vIGZyYW1lcyBvbmx5IHF1ZXVlIG9uZSBuZXcgckFGIChlLmcuIGFycmF5IG11dGF0aW9uICYgY2h1bmtlZCByZW5kZXIpCiAgICAgIGlmICh0aGlzLml0ZW1zICYmIHRoaXMuX19saW1pdCA8IHRoaXMuaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZXF1ZXN0UmVuZGVyQ2h1bmspOwogICAgICB9CiAgICB9CgogICAgX19yZXF1ZXN0UmVuZGVyQ2h1bmsoKSB7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy5fX3JlbmRlckNodW5rKCkpOwogICAgfQoKICAgIF9fcmVuZGVyQ2h1bmsoKSB7CiAgICAgIC8vIFNpbXBsZSBhdXRvIGNodW5rU2l6ZSB0aHJvdHRsaW5nIGFsZ29yaXRobSBiYXNlZCBvbiBmZWVkYmFjayBsb29wOgogICAgICAvLyBtZWFzdXJlIGFjdHVhbCB0aW1lIGJldHdlZW4gZnJhbWVzIGFuZCBzY2FsZSBjaHVuayBjb3VudCBieSByYXRpbwogICAgICAvLyBvZiB0YXJnZXQvYWN0dWFsIGZyYW1lIHRpbWUKICAgICAgbGV0IGN1cnJDaHVua1RpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgbGV0IHJhdGlvID0gdGhpcy5fdGFyZ2V0RnJhbWVUaW1lIC8gKGN1cnJDaHVua1RpbWUgLSB0aGlzLl9fbGFzdENodW5rVGltZSk7CiAgICAgIHRoaXMuX19jaHVua0NvdW50ID0gTWF0aC5yb3VuZCh0aGlzLl9fY2h1bmtDb3VudCAqIHJhdGlvKSB8fCAxOwogICAgICB0aGlzLl9fbGltaXQgKz0gdGhpcy5fX2NodW5rQ291bnQ7CiAgICAgIHRoaXMuX19sYXN0Q2h1bmtUaW1lID0gY3VyckNodW5rVGltZTsKICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOwogICAgfQoKICAgIF9fb2JzZXJ2ZUNoYW5nZWQoKSB7CiAgICAgIHRoaXMuX19vYnNlcnZlUGF0aHMgPSB0aGlzLm9ic2VydmUgJiYKICAgICAgICB0aGlzLm9ic2VydmUucmVwbGFjZSgnLionLCAnLicpLnNwbGl0KCcgJyk7CiAgICB9CgogICAgX19pdGVtc0NoYW5nZWQoY2hhbmdlKSB7CiAgICAgIGlmICh0aGlzLml0ZW1zICYmICFBcnJheS5pc0FycmF5KHRoaXMuaXRlbXMpKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdkb20tcmVwZWF0IGV4cGVjdGVkIGFycmF5IGZvciBgaXRlbXNgLCBmb3VuZCcsIHRoaXMuaXRlbXMpOwogICAgICB9CiAgICAgIC8vIElmIHBhdGggd2FzIHRvIGFuIGl0ZW0gKGUuZy4gJ2l0ZW1zLjMnIG9yICdpdGVtcy4zLmZvbycpLCBmb3J3YXJkIHRoZQogICAgICAvLyBwYXRoIHRvIHRoYXQgaW5zdGFuY2Ugc3luY2hyb25vdXNseSAocmV0dXJucyBmYWxzZSBmb3Igbm9uLWl0ZW0gcGF0aHMpCiAgICAgIGlmICghdGhpcy5fX2hhbmRsZUl0ZW1QYXRoKGNoYW5nZS5wYXRoLCBjaGFuZ2UudmFsdWUpKSB7CiAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgYXJyYXkgd2FzIHJlc2V0ICgnaXRlbXMnKSBvciBzcGxpY2VkICgnaXRlbXMuc3BsaWNlcycpLAogICAgICAgIC8vIHNvIHF1ZXVlIGEgZnVsbCByZWZyZXNoCiAgICAgICAgdGhpcy5fX2luaXRpYWxpemVDaHVua2luZygpOwogICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsKICAgICAgfQogICAgfQoKICAgIF9faGFuZGxlT2JzZXJ2ZWRQYXRocyhwYXRoKSB7CiAgICAgIC8vIEhhbmRsZSBjYXNlcyB3aGVyZSBwYXRoIGNoYW5nZXMgc2hvdWxkIGNhdXNlIGEgcmUtc29ydC9maWx0ZXIKICAgICAgaWYgKHRoaXMuX19zb3J0Rm4gfHwgdGhpcy5fX2ZpbHRlckZuKSB7CiAgICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgICAvLyBBbHdheXMgcmUtcmVuZGVyIGlmIHRoZSBpdGVtIGl0c2VsZiBjaGFuZ2VkCiAgICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlciwgdGhpcy5kZWxheSk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fb2JzZXJ2ZVBhdGhzKSB7CiAgICAgICAgICAvLyBPdGhlcndpc2UsIHJlLXJlbmRlciBpZiB0aGUgcGF0aCBjaGFuZ2VkIG1hdGNoZXMgYW4gb2JzZXJ2ZWQgcGF0aAogICAgICAgICAgbGV0IHBhdGhzID0gdGhpcy5fX29ic2VydmVQYXRoczsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaTxwYXRocy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKHBhdGhzW2ldKSA9PT0gMCkgewogICAgICAgICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLCB0aGlzLmRlbGF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtmdW5jdGlvbih0aGlzOkRvbVJlcGVhdCl9IGZuIEZ1bmN0aW9uIHRvIGRlYm91bmNlLgogICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBEZWxheSBpbiBtcyB0byBkZWJvdW5jZSBieS4KICAgICAqLwogICAgX19kZWJvdW5jZVJlbmRlcihmbiwgZGVsYXkgPSAwKSB7CiAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBQb2x5bWVyLkRlYm91bmNlci5kZWJvdW5jZSgKICAgICAgICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlcgogICAgICAgICAgLCBkZWxheSA+IDAgPyBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuYWZ0ZXIoZGVsYXkpIDogUG9seW1lci5Bc3luYy5taWNyb1Rhc2sKICAgICAgICAgICwgZm4uYmluZCh0aGlzKSk7CiAgICAgIFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9fcmVuZGVyRGVib3VuY2VyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEZvcmNlcyB0aGUgZWxlbWVudCB0byByZW5kZXIgaXRzIGNvbnRlbnQuIE5vcm1hbGx5IHJlbmRlcmluZyBpcwogICAgICogYXN5bmNocm9ub3VzIHRvIGEgcHJvdm9raW5nIGNoYW5nZS4gVGhpcyBpcyBkb25lIGZvciBlZmZpY2llbmN5IHNvCiAgICAgKiB0aGF0IG11bHRpcGxlIGNoYW5nZXMgdHJpZ2dlciBvbmx5IGEgc2luZ2xlIHJlbmRlci4gVGhlIHJlbmRlciBtZXRob2QKICAgICAqIHNob3VsZCBiZSBjYWxsZWQgaWYsIGZvciBleGFtcGxlLCB0ZW1wbGF0ZSByZW5kZXJpbmcgaXMgcmVxdWlyZWQgdG8KICAgICAqIHZhbGlkYXRlIGFwcGxpY2F0aW9uIHN0YXRlLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgcmVuZGVyKCkgewogICAgICAvLyBRdWV1ZSB0aGlzIHJlcGVhdGVyLCB0aGVuIGZsdXNoIGFsbCBpbiBvcmRlcgogICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7CiAgICAgIFBvbHltZXIuZmx1c2goKTsKICAgIH0KCiAgICBfX3JlbmRlcigpIHsKICAgICAgaWYgKCF0aGlzLl9fZW5zdXJlVGVtcGxhdGl6ZWQoKSkgewogICAgICAgIC8vIE5vIHRlbXBsYXRlIGZvdW5kIHlldAogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLl9fYXBwbHlGdWxsUmVmcmVzaCgpOwogICAgICAvLyBSZXNldCB0aGUgcG9vbAogICAgICAvLyBUT0RPKGtzY2hhYWYpOiBSZXVzZSBwb29sIGFjcm9zcyB0dXJucyBhbmQgbmVzdGVkIHRlbXBsYXRlcwogICAgICAvLyBOb3cgdGhhdCBvYmplY3RzL2FycmF5cyBhcmUgcmUtZXZhbHVhdGVkIHdoZW4gc2V0LCB3ZSBjYW4gc2FmZWx5CiAgICAgIC8vIHJldXNlIHBvb2xlZCBpbnN0YW5jZXMgYWNyb3NzIHR1cm5zLCBob3dldmVyIHdlIHN0aWxsIG5lZWQgdG8gZGVjaWRlCiAgICAgIC8vIHNlbWFudGljcyByZWdhcmRpbmcgaG93IGxvbmcgdG8gaG9sZCwgaG93IG1hbnkgdG8gaG9sZCwgZXRjLgogICAgICB0aGlzLl9fcG9vbC5sZW5ndGggPSAwOwogICAgICAvLyBTZXQgcmVuZGVyZWQgaXRlbSBjb3VudAogICAgICB0aGlzLl9zZXRSZW5kZXJlZEl0ZW1Db3VudCh0aGlzLl9faW5zdGFuY2VzLmxlbmd0aCk7CiAgICAgIC8vIE5vdGlmeSB1c2VycwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkb20tY2hhbmdlJywgewogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byByZW5kZXIgbW9yZSBpdGVtcwogICAgICB0aGlzLl9fdHJ5UmVuZGVyQ2h1bmsoKTsKICAgIH0KCiAgICBfX2FwcGx5RnVsbFJlZnJlc2goKSB7CiAgICAgIGxldCBpdGVtcyA9IHRoaXMuaXRlbXMgfHwgW107CiAgICAgIGxldCBpc250SWR4VG9JdGVtc0lkeCA9IG5ldyBBcnJheShpdGVtcy5sZW5ndGgpOwogICAgICBmb3IgKGxldCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpc250SWR4VG9JdGVtc0lkeFtpXSA9IGk7CiAgICAgIH0KICAgICAgLy8gQXBwbHkgdXNlciBmaWx0ZXIKICAgICAgaWYgKHRoaXMuX19maWx0ZXJGbikgewogICAgICAgIGlzbnRJZHhUb0l0ZW1zSWR4ID0gaXNudElkeFRvSXRlbXNJZHguZmlsdGVyKChpLCBpZHgsIGFycmF5KSA9PgogICAgICAgICAgdGhpcy5fX2ZpbHRlckZuKGl0ZW1zW2ldLCBpZHgsIGFycmF5KSk7CiAgICAgIH0KICAgICAgLy8gQXBwbHkgdXNlciBzb3J0CiAgICAgIGlmICh0aGlzLl9fc29ydEZuKSB7CiAgICAgICAgaXNudElkeFRvSXRlbXNJZHguc29ydCgoYSwgYikgPT4gdGhpcy5fX3NvcnRGbihpdGVtc1thXSwgaXRlbXNbYl0pKTsKICAgICAgfQogICAgICAvLyBpdGVtcy0+aW5zdCBtYXAga2VwdCBmb3IgaXRlbSBwYXRoIGZvcndhcmRpbmcKICAgICAgY29uc3QgaXRlbXNJZHhUb0luc3RJZHggPSB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHggPSB7fTsKICAgICAgbGV0IGluc3RJZHggPSAwOwogICAgICAvLyBHZW5lcmF0ZSBpbnN0YW5jZXMgYW5kIGFzc2lnbiBpdGVtcwogICAgICBjb25zdCBsaW1pdCA9IE1hdGgubWluKGlzbnRJZHhUb0l0ZW1zSWR4Lmxlbmd0aCwgdGhpcy5fX2xpbWl0KTsKICAgICAgZm9yICg7IGluc3RJZHg8bGltaXQ7IGluc3RJZHgrKykgewogICAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XTsKICAgICAgICBsZXQgaXRlbUlkeCA9IGlzbnRJZHhUb0l0ZW1zSWR4W2luc3RJZHhdOwogICAgICAgIGxldCBpdGVtID0gaXRlbXNbaXRlbUlkeF07CiAgICAgICAgaXRlbXNJZHhUb0luc3RJZHhbaXRlbUlkeF0gPSBpbnN0SWR4OwogICAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5hcywgaXRlbSk7CiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5pbmRleEFzLCBpbnN0SWR4KTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLml0ZW1zSW5kZXhBcywgaXRlbUlkeCk7CiAgICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fX2luc2VydEluc3RhbmNlKGl0ZW0sIGluc3RJZHgsIGl0ZW1JZHgpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBSZW1vdmUgYW55IGV4dHJhIGluc3RhbmNlcyBmcm9tIHByZXZpb3VzIHN0YXRlCiAgICAgIGZvciAobGV0IGk9dGhpcy5fX2luc3RhbmNlcy5sZW5ndGgtMTsgaT49aW5zdElkeDsgaS0tKSB7CiAgICAgICAgdGhpcy5fX2RldGFjaEFuZFJlbW92ZUluc3RhbmNlKGkpOwogICAgICB9CiAgICB9CgogICAgX19kZXRhY2hJbnN0YW5jZShpZHgpIHsKICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2lkeF07CiAgICAgIGZvciAobGV0IGk9MDsgaTxpbnN0LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IGVsID0gaW5zdC5jaGlsZHJlbltpXTsKICAgICAgICBpbnN0LnJvb3QuYXBwZW5kQ2hpbGQoZWwpOwogICAgICB9CiAgICAgIHJldHVybiBpbnN0OwogICAgfQoKICAgIF9fYXR0YWNoSW5zdGFuY2UoaWR4LCBwYXJlbnQpIHsKICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2lkeF07CiAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoaW5zdC5yb290LCB0aGlzKTsKICAgIH0KCiAgICBfX2RldGFjaEFuZFJlbW92ZUluc3RhbmNlKGlkeCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19kZXRhY2hJbnN0YW5jZShpZHgpOwogICAgICBpZiAoaW5zdCkgewogICAgICAgIHRoaXMuX19wb29sLnB1c2goaW5zdCk7CiAgICAgIH0KICAgICAgdGhpcy5fX2luc3RhbmNlcy5zcGxpY2UoaWR4LCAxKTsKICAgIH0KCiAgICBfX3N0YW1wSW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCkgewogICAgICBsZXQgbW9kZWwgPSB7fTsKICAgICAgbW9kZWxbdGhpcy5hc10gPSBpdGVtOwogICAgICBtb2RlbFt0aGlzLmluZGV4QXNdID0gaW5zdElkeDsKICAgICAgbW9kZWxbdGhpcy5pdGVtc0luZGV4QXNdID0gaXRlbUlkeDsKICAgICAgcmV0dXJuIG5ldyB0aGlzLl9fY3Rvcihtb2RlbCk7CiAgICB9CgogICAgX19pbnNlcnRJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KSB7CiAgICAgIGxldCBpbnN0ID0gdGhpcy5fX3Bvb2wucG9wKCk7CiAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgLy8gVE9ETyhrc2NoYWFmKTogSWYgdGhlIHBvb2wgaXMgc2hhcmVkIGFjcm9zcyB0dXJucywgaG9zdFByb3BzCiAgICAgICAgLy8gbmVlZCB0byBiZSByZS1zZXQgdG8gcmV1c2VkIGluc3RhbmNlcyBpbiBhZGRpdGlvbiB0byBpdGVtCiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuYXMsIGl0ZW0pOwogICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmluZGV4QXMsIGluc3RJZHgpOwogICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLml0ZW1zSW5kZXhBcywgaXRlbUlkeCk7CiAgICAgICAgaW5zdC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5zdCA9IHRoaXMuX19zdGFtcEluc3RhbmNlKGl0ZW0sIGluc3RJZHgsIGl0ZW1JZHgpOwogICAgICB9CiAgICAgIGxldCBiZWZvcmVSb3cgPSB0aGlzLl9faW5zdGFuY2VzW2luc3RJZHggKyAxXTsKICAgICAgbGV0IGJlZm9yZU5vZGUgPSBiZWZvcmVSb3cgPyBiZWZvcmVSb3cuY2hpbGRyZW5bMF0gOiB0aGlzOwogICAgICB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGluc3Qucm9vdCwgYmVmb3JlTm9kZSk7CiAgICAgIHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeF0gPSBpbnN0OwogICAgICByZXR1cm4gaW5zdDsKICAgIH0KCiAgICAvLyBJbXBsZW1lbnRzIGV4dGVuc2lvbiBwb2ludCBmcm9tIFRlbXBsYXRpemUgbWl4aW4KICAgIC8qKgogICAgICogU2hvd3Mgb3IgaGlkZXMgdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRvcCBsZXZlbCBjaGlsZCBlbGVtZW50cy4gRm9yCiAgICAgKiB0ZXh0IG5vZGVzLCBgdGV4dENvbnRlbnRgIGlzIHJlbW92ZWQgd2hpbGUgImhpZGRlbiIgYW5kIHJlcGxhY2VkIHdoZW4KICAgICAqICJzaG93bi4iCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhpZGRlbiBTZXQgdG8gdHJ1ZSB0byBoaWRlIHRoZSBjaGlsZHJlbjsKICAgICAqIHNldCB0byBmYWxzZSB0byBzaG93IHRoZW0uCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvd0hpZGVDaGlsZHJlbihoaWRkZW4pIHsKICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzLl9faW5zdGFuY2VzW2ldLl9zaG93SGlkZUNoaWxkcmVuKGhpZGRlbik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBDYWxsZWQgYXMgYSBzaWRlIGVmZmVjdCBvZiBhIGhvc3QgaXRlbXMuPGtleT4uPHBhdGg+IHBhdGggY2hhbmdlLAogICAgLy8gcmVzcG9uc2libGUgZm9yIG5vdGlmeWluZyBpdGVtLjxwYXRoPiBjaGFuZ2VzIHRvIGluc3QgZm9yIGtleQogICAgX19oYW5kbGVJdGVtUGF0aChwYXRoLCB2YWx1ZSkgewogICAgICBsZXQgaXRlbXNQYXRoID0gcGF0aC5zbGljZSg2KTsgLy8gJ2l0ZW1zLicubGVuZ3RoID09IDYKICAgICAgbGV0IGRvdCA9IGl0ZW1zUGF0aC5pbmRleE9mKCcuJyk7CiAgICAgIGxldCBpdGVtc0lkeCA9IGRvdCA8IDAgPyBpdGVtc1BhdGggOiBpdGVtc1BhdGguc3Vic3RyaW5nKDAsIGRvdCk7CiAgICAgIC8vIElmIHBhdGggd2FzIGluZGV4IGludG8gYXJyYXkuLi4KICAgICAgaWYgKGl0ZW1zSWR4ID09IHBhcnNlSW50KGl0ZW1zSWR4LCAxMCkpIHsKICAgICAgICBsZXQgaXRlbVN1YlBhdGggPSBkb3QgPCAwID8gJycgOiBpdGVtc1BhdGguc3Vic3RyaW5nKGRvdCsxKTsKICAgICAgICAvLyBJZiB0aGUgcGF0aCBpcyBvYnNlcnZlZCwgaXQgd2lsbCB0cmlnZ2VyIGEgZnVsbCByZWZyZXNoCiAgICAgICAgdGhpcy5fX2hhbmRsZU9ic2VydmVkUGF0aHMoaXRlbVN1YlBhdGgpOwogICAgICAgIC8vIE5vdGUsIGV2ZW4gaWYgYSBydWxsIHJlZnJlc2ggaXMgdHJpZ2dlcmVkLCBhbHdheXMgZG8gdGhlIHBhdGgKICAgICAgICAvLyBub3RpZmljYXRpb24gYmVjYXVzZSB1bmxlc3MgbXV0YWJsZURhdGEgaXMgdXNlZCBmb3IgZG9tLXJlcGVhdAogICAgICAgIC8vIGFuZCBhbGwgZWxlbWVudHMgaW4gdGhlIGluc3RhbmNlIHN1YnRyZWUsIGEgZnVsbCByZWZyZXNoIG1heQogICAgICAgIC8vIG5vdCB0cmlnZ2VyIHRoZSBwcm9wZXIgdXBkYXRlLgogICAgICAgIGxldCBpbnN0SWR4ID0gdGhpcy5fX2l0ZW1zSWR4VG9JbnN0SWR4W2l0ZW1zSWR4XTsKICAgICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeF07CiAgICAgICAgaWYgKGluc3QpIHsKICAgICAgICAgIGxldCBpdGVtUGF0aCA9IHRoaXMuYXMgKyAoaXRlbVN1YlBhdGggPyAnLicgKyBpdGVtU3ViUGF0aCA6ICcnKTsKICAgICAgICAgIC8vIFRoaXMgaXMgZWZmZWN0aXZlbHkgYG5vdGlmeVBhdGhgLCBidXQgYXZvaWRzIHNvbWUgb2YgdGhlIG92ZXJoZWFkCiAgICAgICAgICAvLyBvZiB0aGUgcHVibGljIEFQSQogICAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKGl0ZW1QYXRoLCB2YWx1ZSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgaW5zdC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpdGVtIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGVsZW1lbnQgc3RhbXBlZCBieQogICAgICogdGhpcyBgZG9tLXJlcGVhdGAuCiAgICAgKgogICAgICogTm90ZSwgdG8gbW9kaWZ5IHN1Yi1wcm9wZXJ0aWVzIG9mIHRoZSBpdGVtLAogICAgICogYG1vZGVsRm9yRWxlbWVudChlbCkuc2V0KCdpdGVtLjxzdWItcHJvcD4nLCB2YWx1ZSlgCiAgICAgKiBzaG91bGQgYmUgdXNlZC4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBpdGVtLgogICAgICogQHJldHVybiB7Kn0gSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQuCiAgICAgKi8KICAgIGl0ZW1Gb3JFbGVtZW50KGVsKSB7CiAgICAgIGxldCBpbnN0YW5jZSA9IHRoaXMubW9kZWxGb3JFbGVtZW50KGVsKTsKICAgICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlW3RoaXMuYXNdOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaW5zdCBpbmRleCBmb3IgYSBnaXZlbiBlbGVtZW50IHN0YW1wZWQgYnkgdGhpcyBgZG9tLXJlcGVhdGAuCiAgICAgKiBJZiBgc29ydGAgaXMgcHJvdmlkZWQsIHRoZSBpbmRleCB3aWxsIHJlZmxlY3QgdGhlIHNvcnRlZCBvcmRlciAocmF0aGVyCiAgICAgKiB0aGFuIHRoZSBvcmlnaW5hbCBhcnJheSBvcmRlcikuCiAgICAgKgogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgaW5kZXguCiAgICAgKiBAcmV0dXJuIHs/bnVtYmVyfSBSb3cgaW5kZXggYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50IChub3RlIHRoaXMgbWF5CiAgICAgKiAgIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBhcnJheSBpbmRleCBpZiBhIHVzZXIgYHNvcnRgIGlzIGFwcGxpZWQpLgogICAgICovCiAgICBpbmRleEZvckVsZW1lbnQoZWwpIHsKICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5tb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2VbdGhpcy5pbmRleEFzXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlICJtb2RlbCIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCwgd2hpY2gKICAgICAqIHNlcnZlcyBhcyB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRoZSBlbGVtZW50IGlzCiAgICAgKiBjb250YWluZWQgaW4uIEEgdGVtcGxhdGUgbW9kZWwgaXMgYW4gaW5zdGFuY2Ugb2YgYFBvbHltZXIuQmFzZWAsIGFuZAogICAgICogc2hvdWxkIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICBsZXQgbW9kZWwgPSBtb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICogICBpZiAobW9kZWwuaW5kZXggPCAxMCkgewogICAgICogICAgIG1vZGVsLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7CiAgICAgKiAgIH0KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIGEgdGVtcGxhdGUgbW9kZWwuCiAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0gTW9kZWwgcmVwcmVzZW50aW5nIHRoZSBiaW5kaW5nIHNjb3BlIGZvcgogICAgICogICB0aGUgZWxlbWVudC4KICAgICAqLwogICAgbW9kZWxGb3JFbGVtZW50KGVsKSB7CiAgICAgIHJldHVybiBQb2x5bWVyLlRlbXBsYXRpemUubW9kZWxGb3JFbGVtZW50KHRoaXMudGVtcGxhdGUsIGVsKTsKICAgIH0KCiAgfQoKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoRG9tUmVwZWF0LmlzLCBEb21SZXBlYXQpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5Eb21SZXBlYXQgPSBEb21SZXBlYXQ7Cgp9KSgpOwoKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogVGhlIGA8ZG9tLWlmPmAgZWxlbWVudCB3aWxsIHN0YW1wIGEgbGlnaHQtZG9tIGA8dGVtcGxhdGU+YCBjaGlsZCB3aGVuCiAgICogdGhlIGBpZmAgcHJvcGVydHkgYmVjb21lcyB0cnV0aHksIGFuZCB0aGUgdGVtcGxhdGUgY2FuIHVzZSBQb2x5bWVyCiAgICogZGF0YS1iaW5kaW5nIGFuZCBkZWNsYXJhdGl2ZSBldmVudCBmZWF0dXJlcyB3aGVuIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YKICAgKiBhIFBvbHltZXIgZWxlbWVudCdzIHRlbXBsYXRlLgogICAqCiAgICogV2hlbiBgaWZgIGJlY29tZXMgZmFsc3ksIHRoZSBzdGFtcGVkIGNvbnRlbnQgaXMgaGlkZGVuIGJ1dCBub3QKICAgKiByZW1vdmVkIGZyb20gZG9tLiBXaGVuIGBpZmAgc3Vic2VxdWVudGx5IGJlY29tZXMgdHJ1dGh5IGFnYWluLCB0aGUgY29udGVudAogICAqIGlzIHNpbXBseSByZS1zaG93bi4gVGhpcyBhcHByb2FjaCBpcyB1c2VkIGR1ZSB0byBpdHMgZmF2b3JhYmxlIHBlcmZvcm1hbmNlCiAgICogY2hhcmFjdGVyaXN0aWNzOiB0aGUgZXhwZW5zZSBvZiBjcmVhdGluZyB0ZW1wbGF0ZSBjb250ZW50IGlzIHBhaWQgb25seQogICAqIG9uY2UgYW5kIGxhemlseS4KICAgKgogICAqIFNldCB0aGUgYHJlc3RhbXBgIHByb3BlcnR5IHRvIHRydWUgdG8gZm9yY2UgdGhlIHN0YW1wZWQgY29udGVudCB0byBiZQogICAqIGNyZWF0ZWQgLyBkZXN0cm95ZWQgd2hlbiB0aGUgYGlmYCBjb25kaXRpb24gY2hhbmdlcy4KICAgKgogICAqIEBjdXN0b21FbGVtZW50CiAgICogQHBvbHltZXIKICAgKiBAZXh0ZW5kcyBQb2x5bWVyLkVsZW1lbnQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEN1c3RvbSBlbGVtZW50IHRoYXQgY29uZGl0aW9uYWxseSBzdGFtcHMgYW5kIGhpZGVzIG9yIHJlbW92ZXMKICAgKiAgIHRlbXBsYXRlIGNvbnRlbnQgYmFzZWQgb24gYSBib29sZWFuIGZsYWcuCiAgICovCiAgY2xhc3MgRG9tSWYgZXh0ZW5kcyBQb2x5bWVyLkVsZW1lbnQgewoKICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2RvbS1pZic7IH0KCiAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgeyByZXR1cm4gbnVsbDsgfQoKICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKCiAgICAgIHJldHVybiB7CgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW5ldmVyIERPTSBpcyBhZGRlZCBvciByZW1vdmVkL2hpZGRlbiBieSB0aGlzIHRlbXBsYXRlIChieQogICAgICAgICAqIGRlZmF1bHQsIHJlbmRlcmluZyBvY2N1cnMgbGF6aWx5KS4gIFRvIGZvcmNlIGltbWVkaWF0ZSByZW5kZXJpbmcsIGNhbGwKICAgICAgICAgKiBgcmVuZGVyYC4KICAgICAgICAgKgogICAgICAgICAqIEBldmVudCBkb20tY2hhbmdlCiAgICAgICAgICovCgogICAgICAgIC8qKgogICAgICAgICAqIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB0ZW1wbGF0ZSBzaG91bGQgc3RhbXAuCiAgICAgICAgICovCiAgICAgICAgaWY6IHsKICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICBvYnNlcnZlcjogJ19fZGVib3VuY2VSZW5kZXInCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiB0cnVlLCBlbGVtZW50cyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBET00gYW5kIGRpc2NhcmRlZCB3aGVuIGBpZmAKICAgICAgICAgKiBiZWNvbWVzIGZhbHNlIGFuZCByZS1jcmVhdGVkIGFuZCBhZGRlZCBiYWNrIHRvIHRoZSBET00gd2hlbiBgaWZgCiAgICAgICAgICogYmVjb21lcyB0cnVlLiAgQnkgZGVmYXVsdCwgc3RhbXBlZCBlbGVtZW50cyB3aWxsIGJlIGhpZGRlbiBidXQgbGVmdAogICAgICAgICAqIGluIHRoZSBET00gd2hlbiBgaWZgIGJlY29tZXMgZmFsc2UsIHdoaWNoIGlzIGdlbmVyYWxseSByZXN1bHRzCiAgICAgICAgICogaW4gYmV0dGVyIHBlcmZvcm1hbmNlLgogICAgICAgICAqLwogICAgICAgIHJlc3RhbXA6IHsKICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICBvYnNlcnZlcjogJ19fZGVib3VuY2VSZW5kZXInCiAgICAgICAgfQoKICAgICAgfTsKCiAgICB9CgogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBudWxsOwogICAgICB0aGlzLl9faW52YWxpZFByb3BzID0gbnVsbDsKICAgICAgdGhpcy5fX2luc3RhbmNlID0gbnVsbDsKICAgICAgdGhpcy5fbGFzdElmID0gZmFsc2U7CiAgICAgIHRoaXMuX19jdG9yID0gbnVsbDsKICAgIH0KCiAgICBfX2RlYm91bmNlUmVuZGVyKCkgewogICAgICAvLyBSZW5kZXIgaXMgYXN5bmMgZm9yIDIgcmVhc29uczoKICAgICAgLy8gMS4gVG8gZWxpbWluYXRlIGRvbSBjcmVhdGlvbiB0cmFzaGluZyBpZiB1c2VyIGNvZGUgdGhyYXNoZXMgYGlmYCBpbiB0aGUKICAgICAgLy8gICAgc2FtZSB0dXJuLiBUaGlzIHdhcyBtb3JlIGNvbW1vbiBpbiAxLnggd2hlcmUgYSBjb21wb3VuZCBjb21wdXRlZAogICAgICAvLyAgICBwcm9wZXJ0eSBjb3VsZCByZXN1bHQgaW4gdGhlIHJlc3VsdCBjaGFuZ2luZyBtdWx0aXBsZSB0aW1lcywgYnV0IGlzCiAgICAgIC8vICAgIG1pdGlnYXRlZCB0byBhIGxhcmdlIGV4dGVudCBieSBiYXRjaGVkIHByb3BlcnR5IHByb2Nlc3NpbmcgaW4gMi54LgogICAgICAvLyAyLiBUbyBhdm9pZCBkb3VibGUgb2JqZWN0IHByb3BhZ2F0aW9uIHdoZW4gYSBiYWcgaW5jbHVkaW5nIHZhbHVlcyBib3VuZAogICAgICAvLyAgICB0byB0aGUgYGlmYCBwcm9wZXJ0eSBhcyB3ZWxsIGFzIG9uZSBvciBtb3JlIGhvc3RQcm9wcyBjb3VsZCBlbnF1ZXVlCiAgICAgIC8vICAgIHRoZSA8ZG9tLWlmPiB0byBmbHVzaCBiZWZvcmUgdGhlIDx0ZW1wbGF0ZT4ncyBob3N0IHByb3BlcnR5CiAgICAgIC8vICAgIGZvcndhcmRpbmcuIEluIHRoYXQgc2NlbmFyaW8gY3JlYXRpbmcgYW4gaW5zdGFuY2Ugd291bGQgcmVzdWx0IGluCiAgICAgIC8vICAgIHRoZSBob3N0IHByb3BzIGJlaW5nIHNldCBvbmNlLCBhbmQgdGhlbiB0aGUgZW5xdWV1ZWQgY2hhbmdlcyBvbiB0aGUKICAgICAgLy8gICAgdGVtcGxhdGUgd291bGQgc2V0IHByb3BlcnRpZXMgYSBzZWNvbmQgdGltZSwgcG90ZW50aWFsbHkgY2F1c2luZyBhbgogICAgICAvLyAgICBvYmplY3QgdG8gYmUgc2V0IHRvIGFuIGluc3RhbmNlIG1vcmUgdGhhbiBvbmNlLiAgQ3JlYXRpbmcgdGhlCiAgICAgIC8vICAgIGluc3RhbmNlIGFzeW5jIGZyb20gZmx1c2hpbmcgZGF0YSBlbnN1cmVzIHRoaXMgZG9lc24ndCBoYXBwZW4uIElmCiAgICAgIC8vICAgIHdlIHdhbnRlZCBhIHN5bmMgb3B0aW9uIGluIHRoZSBmdXR1cmUsIHNpbXBseSBoYXZpbmcgPGRvbS1pZj4gZmx1c2gKICAgICAgLy8gICAgKG9yIGNsZWFyKSBpdHMgdGVtcGxhdGUncyBwZW5kaW5nIGhvc3QgcHJvcGVydGllcyBiZWZvcmUgY3JlYXRpbmcKICAgICAgLy8gICAgdGhlIGluc3RhbmNlIHdvdWxkIGFsc28gYXZvaWQgdGhlIHByb2JsZW0uCiAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBQb2x5bWVyLkRlYm91bmNlci5kZWJvdW5jZSgKICAgICAgICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlcgogICAgICAgICAgLCBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzawogICAgICAgICAgLCAoKSA9PiB0aGlzLl9fcmVuZGVyKCkpOwogICAgICBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIodGhpcy5fX3JlbmRlckRlYm91bmNlcik7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgaWYgKCF0aGlzLnBhcmVudE5vZGUgfHwKICAgICAgICAgICh0aGlzLnBhcmVudE5vZGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICYmCiAgICAgICAgICAgIXRoaXMucGFyZW50Tm9kZS5ob3N0KSkgewogICAgICAgIHRoaXMuX190ZWFyZG93bkluc3RhbmNlKCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIGlmICh0aGlzLmlmKSB7CiAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEZvcmNlcyB0aGUgZWxlbWVudCB0byByZW5kZXIgaXRzIGNvbnRlbnQuIE5vcm1hbGx5IHJlbmRlcmluZyBpcwogICAgICogYXN5bmNocm9ub3VzIHRvIGEgcHJvdm9raW5nIGNoYW5nZS4gVGhpcyBpcyBkb25lIGZvciBlZmZpY2llbmN5IHNvCiAgICAgKiB0aGF0IG11bHRpcGxlIGNoYW5nZXMgdHJpZ2dlciBvbmx5IGEgc2luZ2xlIHJlbmRlci4gVGhlIHJlbmRlciBtZXRob2QKICAgICAqIHNob3VsZCBiZSBjYWxsZWQgaWYsIGZvciBleGFtcGxlLCB0ZW1wbGF0ZSByZW5kZXJpbmcgaXMgcmVxdWlyZWQgdG8KICAgICAqIHZhbGlkYXRlIGFwcGxpY2F0aW9uIHN0YXRlLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgcmVuZGVyKCkgewogICAgICBQb2x5bWVyLmZsdXNoKCk7CiAgICB9CgogICAgX19yZW5kZXIoKSB7CiAgICAgIGlmICh0aGlzLmlmKSB7CiAgICAgICAgaWYgKCF0aGlzLl9fZW5zdXJlSW5zdGFuY2UoKSkgewogICAgICAgICAgLy8gTm8gdGVtcGxhdGUgZm91bmQgeWV0CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX3Nob3dIaWRlQ2hpbGRyZW4oKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc3RhbXApIHsKICAgICAgICB0aGlzLl9fdGVhcmRvd25JbnN0YW5jZSgpOwogICAgICB9CiAgICAgIGlmICghdGhpcy5yZXN0YW1wICYmIHRoaXMuX19pbnN0YW5jZSkgewogICAgICAgIHRoaXMuX3Nob3dIaWRlQ2hpbGRyZW4oKTsKICAgICAgfQogICAgICBpZiAodGhpcy5pZiAhPSB0aGlzLl9sYXN0SWYpIHsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkb20tY2hhbmdlJywgewogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICAgIHRoaXMuX2xhc3RJZiA9IHRoaXMuaWY7CiAgICAgIH0KICAgIH0KCiAgICBfX2Vuc3VyZUluc3RhbmNlKCkgewogICAgICBsZXQgcGFyZW50Tm9kZSA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgLy8gR3VhcmQgYWdhaW5zdCBlbGVtZW50IGJlaW5nIGRldGFjaGVkIHdoaWxlIHJlbmRlciB3YXMgcXVldWVkCiAgICAgIGlmIChwYXJlbnROb2RlKSB7CiAgICAgICAgaWYgKCF0aGlzLl9fY3RvcikgewogICAgICAgICAgbGV0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykpOwogICAgICAgICAgaWYgKCF0ZW1wbGF0ZSkgewogICAgICAgICAgICAvLyBXYWl0IHVudGlsIGNoaWxkTGlzdCBjaGFuZ2VzIGFuZCB0ZW1wbGF0ZSBzaG91bGQgYmUgdGhlcmUgYnkgdGhlbgogICAgICAgICAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSkgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5fX3JlbmRlcigpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RvbS1pZiByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2N0b3IgPSBQb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgdGhpcywgewogICAgICAgICAgICAvLyBkb20taWYgdGVtcGxhdGl6ZXIgaW5zdGFuY2VzIHJlcXVpcmUgYG11dGFibGU6IHRydWVgLCBhcwogICAgICAgICAgICAvLyBgX19zeW5jSG9zdFByb3BlcnRpZXNgIHJlbGllcyBvbiB0aGF0IGJlaGF2aW9yIHRvIHN5bmMgb2JqZWN0cwogICAgICAgICAgICBtdXRhYmxlRGF0YTogdHJ1ZSwKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IHRvIGZvcndhcmQKICAgICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSBvZiBwcm9wZXJ0eQogICAgICAgICAgICAgKiBAdGhpcyB7dGhpc30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZvcndhcmRIb3N0UHJvcDogZnVuY3Rpb24ocHJvcCwgdmFsdWUpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pZikgewogICAgICAgICAgICAgICAgICB0aGlzLl9faW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5zdGFuY2UgYnV0IGFyZSBzcXVlbGNoaW5nIGhvc3QgcHJvcGVydHkKICAgICAgICAgICAgICAgICAgLy8gZm9yd2FyZGluZyBkdWUgdG8gaWYgYmVpbmcgZmFsc2UsIG5vdGUgdGhlIGludmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgc28gYF9fc3luY0hvc3RQcm9wZXJ0aWVzYCBjYW4gc3luYyB0aGVtIHRoZSBuZXh0CiAgICAgICAgICAgICAgICAgIC8vIHRpbWUgYGlmYCBiZWNvbWVzIHRydWUKICAgICAgICAgICAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyA9IHRoaXMuX19pbnZhbGlkUHJvcHMgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wc1tQb2x5bWVyLlBhdGgucm9vdChwcm9wKV0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgICB0aGlzLl9faW5zdGFuY2UgPSBuZXcgdGhpcy5fX2N0b3IoKTsKICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuX19pbnN0YW5jZS5yb290LCB0aGlzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fX3N5bmNIb3N0UHJvcGVydGllcygpOwogICAgICAgICAgbGV0IGMkID0gdGhpcy5fX2luc3RhbmNlLmNoaWxkcmVuOwogICAgICAgICAgaWYgKGMkICYmIGMkLmxlbmd0aCkgewogICAgICAgICAgICAvLyBEZXRlY3QgY2FzZSB3aGVyZSBkb20taWYgd2FzIHJlLWF0dGFjaGVkIGluIG5ldyBwb3NpdGlvbgogICAgICAgICAgICBsZXQgbGFzdENoaWxkID0gdGhpcy5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgICAgIGlmIChsYXN0Q2hpbGQgIT09IGMkW2MkLmxlbmd0aC0xXSkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MCwgbjsgKGk8YyQubGVuZ3RoKSAmJiAobj1jJFtpXSk7IGkrKykgewogICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobiwgdGhpcyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIF9fc3luY0hvc3RQcm9wZXJ0aWVzKCkgewogICAgICBsZXQgcHJvcHMgPSB0aGlzLl9faW52YWxpZFByb3BzOwogICAgICBpZiAocHJvcHMpIHsKICAgICAgICBmb3IgKGxldCBwcm9wIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9faW5zdGFuY2UuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wLCB0aGlzLl9fZGF0YUhvc3RbcHJvcF0pOwogICAgICAgIH0KICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzID0gbnVsbDsKICAgICAgICB0aGlzLl9faW5zdGFuY2UuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICB9CiAgICB9CgogICAgX190ZWFyZG93bkluc3RhbmNlKCkgewogICAgICBpZiAodGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgbGV0IGMkID0gdGhpcy5fX2luc3RhbmNlLmNoaWxkcmVuOwogICAgICAgIGlmIChjJCAmJiBjJC5sZW5ndGgpIHsKICAgICAgICAgIC8vIHVzZSBmaXJzdCBjaGlsZCBwYXJlbnQsIGZvciBjYXNlIHdoZW4gZG9tLWlmIG1heSBoYXZlIGJlZW4gZGV0YWNoZWQKICAgICAgICAgIGxldCBwYXJlbnQgPSBjJFswXS5wYXJlbnROb2RlOwogICAgICAgICAgLy8gSW5zdGFuY2UgY2hpbGRyZW4gbWF5IGJlIGRpc2Nvbm5lY3RlZCBmcm9tIHBhcmVudHMgd2hlbiBkb20taWYKICAgICAgICAgIC8vIGRldGFjaGVzIGlmIGEgdHJlZSB3YXMgaW5uZXJIVE1MJ2VkCiAgICAgICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MCwgbjsgKGk8YyQubGVuZ3RoKSAmJiAobj1jJFtpXSk7IGkrKykgewogICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChuKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9faW5zdGFuY2UgPSBudWxsOwogICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTaG93cyBvciBoaWRlcyB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdG9wIGxldmVsIGNoaWxkIGVsZW1lbnRzLiBGb3IKICAgICAqIHRleHQgbm9kZXMsIGB0ZXh0Q29udGVudGAgaXMgcmVtb3ZlZCB3aGlsZSAiaGlkZGVuIiBhbmQgcmVwbGFjZWQgd2hlbgogICAgICogInNob3duLiIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG93SGlkZUNoaWxkcmVuKCkgewogICAgICBsZXQgaGlkZGVuID0gdGhpcy5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18gfHwgIXRoaXMuaWY7CiAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICB0aGlzLl9faW5zdGFuY2UuX3Nob3dIaWRlQ2hpbGRyZW4oaGlkZGVuKTsKICAgICAgfQogICAgfQoKICB9CgogIGN1c3RvbUVsZW1lbnRzLmRlZmluZShEb21JZi5pcywgRG9tSWYpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5Eb21JZiA9IERvbUlmOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBFbGVtZW50IG1peGluIGZvciByZWNvcmRpbmcgZHluYW1pYyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBpdGVtIHBhdGhzIGluIGEKICAgKiBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYSBgc2VsZWN0ZWRgIGFycmF5IHN1Y2ggdGhhdCBwYXRoIGNoYW5nZXMgdG8gdGhlCiAgICogbWFzdGVyIGFycmF5IChhdCB0aGUgaG9zdCkgZWxlbWVudCBvciBlbHNld2hlcmUgdmlhIGRhdGEtYmluZGluZykgYXJlCiAgICogY29ycmVjdGx5IHByb3BhZ2F0ZWQgdG8gaXRlbXMgaW4gdGhlIHNlbGVjdGVkIGFycmF5IGFuZCB2aWNlLXZlcnNhLgogICAqCiAgICogVGhlIGBpdGVtc2AgcHJvcGVydHkgYWNjZXB0cyBhbiBhcnJheSBvZiB1c2VyIGRhdGEsIGFuZCB2aWEgdGhlCiAgICogYHNlbGVjdChpdGVtKWAgYW5kIGBkZXNlbGVjdChpdGVtKWAgQVBJLCB1cGRhdGVzIHRoZSBgc2VsZWN0ZWRgIHByb3BlcnR5CiAgICogd2hpY2ggbWF5IGJlIGJvdW5kIHRvIG90aGVyIHBhcnRzIG9mIHRoZSBhcHBsaWNhdGlvbiwgYW5kIGFueSBjaGFuZ2VzIHRvCiAgICogc3ViLWZpZWxkcyBvZiBgc2VsZWN0ZWRgIGl0ZW0ocykgd2lsbCBiZSBrZXB0IGluIHN5bmMgd2l0aCBpdGVtcyBpbiB0aGUKICAgKiBgaXRlbXNgIGFycmF5LiAgV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCBgc2VsZWN0ZWRgIGlzIGEgcHJvcGVydHkKICAgKiByZXByZXNlbnRpbmcgdGhlIGxhc3Qgc2VsZWN0ZWQgaXRlbS4gIFdoZW4gYG11bHRpYCBpcyB0cnVlLCBgc2VsZWN0ZWRgCiAgICogaXMgYW4gYXJyYXkgb2YgbXVsdGlwbHkgc2VsZWN0ZWQgaXRlbXMuCiAgICoKICAgKiBAcG9seW1lcgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLkVsZW1lbnRNaXhpbgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBtaXhpbiBmb3IgcmVjb3JkaW5nIGR5bmFtaWMgYXNzb2NpYXRpb25zIGJldHdlZW4gaXRlbSBwYXRocyBpbiBhCiAgICogbWFzdGVyIGBpdGVtc2AgYXJyYXkgYW5kIGEgYHNlbGVjdGVkYCBhcnJheQogICAqLwogIGxldCBBcnJheVNlbGVjdG9yTWl4aW4gPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtzdXBlckNsYXNzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgbGV0IGVsZW1lbnRCYXNlID0gUG9seW1lci5FbGVtZW50TWl4aW4oc3VwZXJDbGFzcyk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0FycmF5U2VsZWN0b3JNaXhpbn0KICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgQXJyYXlTZWxlY3Rvck1peGluIGV4dGVuZHMgZWxlbWVudEJhc2UgewoKICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewoKICAgICAgICByZXR1cm4gewoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyBpdGVtcyBmcm9tIHdoaWNoIHNlbGVjdGlvbiB3aWxsIGJlIG1hZGUuCiAgICAgICAgICAgKi8KICAgICAgICAgIGl0ZW1zOiB7CiAgICAgICAgICAgIHR5cGU6IEFycmF5LAogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gYHRydWVgLCBtdWx0aXBsZSBpdGVtcyBtYXkgYmUgc2VsZWN0ZWQgYXQgb25jZSAoaW4gdGhpcyBjYXNlLAogICAgICAgICAgICogYHNlbGVjdGVkYCBpcyBhbiBhcnJheSBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMpLiAgV2hlbiBgZmFsc2VgLAogICAgICAgICAgICogb25seSBvbmUgaXRlbSBtYXkgYmUgc2VsZWN0ZWQgYXQgYSB0aW1lLgogICAgICAgICAgICovCiAgICAgICAgICBtdWx0aTogewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICB2YWx1ZTogZmFsc2UsCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgbXVsdGlgIGlzIHRydWUsIHRoaXMgaXMgYW4gYXJyYXkgdGhhdCBjb250YWlucyBhbnkgc2VsZWN0ZWQuCiAgICAgICAgICAgKiBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIHRoaXMgaXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLCBvciBgbnVsbGAKICAgICAgICAgICAqIGlmIG5vIGl0ZW0gaXMgc2VsZWN0ZWQuCiAgICAgICAgICAgKiBAdHlwZSB7PyhPYmplY3R8QXJyYXk8IU9iamVjdD4pfQogICAgICAgICAgICovCiAgICAgICAgICBzZWxlY3RlZDogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gYG11bHRpYCBpcyBmYWxzZSwgdGhpcyBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIG9yIGBudWxsYAogICAgICAgICAgICogaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KICAgICAgICAgICAqIEB0eXBlIHs/T2JqZWN0fQogICAgICAgICAgICovCiAgICAgICAgICBzZWxlY3RlZEl0ZW06IHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICBub3RpZnk6IHRydWUKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGB0cnVlYCwgY2FsbGluZyBgc2VsZWN0YCBvbiBhbiBpdGVtIHRoYXQgaXMgYWxyZWFkeSBzZWxlY3RlZAogICAgICAgICAgICogd2lsbCBkZXNlbGVjdCB0aGUgaXRlbS4KICAgICAgICAgICAqLwogICAgICAgICAgdG9nZ2xlOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHZhbHVlOiBmYWxzZQogICAgICAgICAgfQoKICAgICAgICB9OwogICAgICB9CgogICAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgICByZXR1cm4gWydfX3VwZGF0ZVNlbGVjdGlvbihtdWx0aSwgaXRlbXMuKiknXTsKICAgICAgfQoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9fbGFzdEl0ZW1zID0gbnVsbDsKICAgICAgICB0aGlzLl9fbGFzdE11bHRpID0gbnVsbDsKICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAgPSBudWxsOwogICAgICB9CgogICAgICBfX3VwZGF0ZVNlbGVjdGlvbihtdWx0aSwgaXRlbXNJbmZvKSB7CiAgICAgICAgbGV0IHBhdGggPSBpdGVtc0luZm8ucGF0aDsKICAgICAgICBpZiAocGF0aCA9PSAnaXRlbXMnKSB7CiAgICAgICAgICAvLyBDYXNlIDEgLSBpdGVtcyBhcnJheSBjaGFuZ2VkLCBzbyBkaWZmIGFnYWluc3QgcHJldmlvdXMgYXJyYXkgYW5kCiAgICAgICAgICAvLyBkZXNlbGVjdCBhbnkgcmVtb3ZlZCBpdGVtcyBhbmQgYWRqdXN0IHNlbGVjdGVkIGluZGljZXMKICAgICAgICAgIGxldCBuZXdJdGVtcyA9IGl0ZW1zSW5mby5iYXNlIHx8IFtdOwogICAgICAgICAgbGV0IGxhc3RJdGVtcyA9IHRoaXMuX19sYXN0SXRlbXM7CiAgICAgICAgICBsZXQgbGFzdE11bHRpID0gdGhpcy5fX2xhc3RNdWx0aTsKICAgICAgICAgIGlmIChtdWx0aSAhPT0gbGFzdE11bHRpKSB7CiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChsYXN0SXRlbXMpIHsKICAgICAgICAgICAgbGV0IHNwbGljZXMgPSBQb2x5bWVyLkFycmF5U3BsaWNlLmNhbGN1bGF0ZVNwbGljZXMobmV3SXRlbXMsIGxhc3RJdGVtcyk7CiAgICAgICAgICAgIHRoaXMuX19hcHBseVNwbGljZXMoc3BsaWNlcyk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fbGFzdEl0ZW1zID0gbmV3SXRlbXM7CiAgICAgICAgICB0aGlzLl9fbGFzdE11bHRpID0gbXVsdGk7CiAgICAgICAgfSBlbHNlIGlmIChpdGVtc0luZm8ucGF0aCA9PSAnaXRlbXMuc3BsaWNlcycpIHsKICAgICAgICAgIC8vIENhc2UgMiAtIGdvdCBzcGVjaWZpYyBzcGxpY2UgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgYXJyYXkgbXV0YXRpb246CiAgICAgICAgICAvLyBkZXNlbGVjdCBhbnkgcmVtb3ZlZCBpdGVtcyBhbmQgYWRqdXN0IHNlbGVjdGVkIGluZGljZXMKICAgICAgICAgIHRoaXMuX19hcHBseVNwbGljZXMoaXRlbXNJbmZvLnZhbHVlLmluZGV4U3BsaWNlcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIENhc2UgMyAtIGFuIGFycmF5IGVsZW1lbnQgd2FzIGNoYW5nZWQsIHNvIGRlc2VsZWN0IHRoZSBwcmV2aW91cwogICAgICAgICAgLy8gaXRlbSBmb3IgdGhhdCBpbmRleCBpZiBpdCB3YXMgcHJldmlvdXNseSBzZWxlY3RlZAogICAgICAgICAgbGV0IHBhcnQgPSBwYXRoLnNsaWNlKCdpdGVtcy4nLmxlbmd0aCk7CiAgICAgICAgICBsZXQgaWR4ID0gcGFyc2VJbnQocGFydCwgMTApOwogICAgICAgICAgaWYgKChwYXJ0LmluZGV4T2YoJy4nKSA8IDApICYmIHBhcnQgPT0gaWR4KSB7CiAgICAgICAgICAgIHRoaXMuX19kZXNlbGVjdENoYW5nZWRJZHgoaWR4KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fYXBwbHlTcGxpY2VzKHNwbGljZXMpIHsKICAgICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLl9fc2VsZWN0ZWRNYXA7CiAgICAgICAgLy8gQWRqdXN0IHNlbGVjdGVkIGluZGljZXMgYW5kIG1hcmsgcmVtb3ZhbHMKICAgICAgICBmb3IgKGxldCBpPTA7IGk8c3BsaWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IHMgPSBzcGxpY2VzW2ldOwogICAgICAgICAgc2VsZWN0ZWQuZm9yRWFjaCgoaWR4LCBpdGVtKSA9PiB7CiAgICAgICAgICAgIGlmIChpZHggPCBzLmluZGV4KSB7CiAgICAgICAgICAgICAgLy8gbm8gY2hhbmdlCiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWR4ID49IHMuaW5kZXggKyBzLnJlbW92ZWQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgLy8gYWRqdXN0IGluZGV4CiAgICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KGl0ZW0sIGlkeCArIHMuYWRkZWRDb3VudCAtIHMucmVtb3ZlZC5sZW5ndGgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIHJlbW92ZSBpbmRleAogICAgICAgICAgICAgIHNlbGVjdGVkLnNldChpdGVtLCAtMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgZm9yIChsZXQgaj0wOyBqPHMuYWRkZWRDb3VudDsgaisrKSB7CiAgICAgICAgICAgIGxldCBpZHggPSBzLmluZGV4ICsgajsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkLmhhcyh0aGlzLml0ZW1zW2lkeF0pKSB7CiAgICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KHRoaXMuaXRlbXNbaWR4XSwgaWR4KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBVcGRhdGUgbGlua2VkIHBhdGhzCiAgICAgICAgdGhpcy5fX3VwZGF0ZUxpbmtzKCk7CiAgICAgICAgLy8gUmVtb3ZlIHNlbGVjdGVkIGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkIGZyb20gdGhlIGl0ZW1zIGFycmF5CiAgICAgICAgbGV0IHNpZHggPSAwOwogICAgICAgIHNlbGVjdGVkLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgaWYgKGlkeCA8IDApIHsKICAgICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgICB0aGlzLnNwbGljZSgnc2VsZWN0ZWQnLCBzaWR4LCAxKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbGVjdGVkLmRlbGV0ZShpdGVtKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNpZHgrKzsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQoKICAgICAgX191cGRhdGVMaW5rcygpIHsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzID0ge307CiAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgIGxldCBzaWR4ID0gMDsKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKGlkeCA9PiB7CiAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgICAgIHRoaXMubGlua1BhdGhzKCdpdGVtcy4nICsgaWR4LCAnc2VsZWN0ZWQuJyArIHNpZHgrKyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAuZm9yRWFjaChpZHggPT4gewogICAgICAgICAgICB0aGlzLmxpbmtQYXRocygnc2VsZWN0ZWQnLCAnaXRlbXMuJyArIGlkeCk7CiAgICAgICAgICAgIHRoaXMubGlua1BhdGhzKCdzZWxlY3RlZEl0ZW0nLCAnaXRlbXMuJyArIGlkeCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDbGVhcnMgdGhlIHNlbGVjdGlvbiBzdGF0ZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGNsZWFyU2VsZWN0aW9uKCkgewogICAgICAgIC8vIFVuYmluZCBwcmV2aW91cyBzZWxlY3Rpb24KICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzID0ge307CiAgICAgICAgLy8gVGhlIHNlbGVjdGVkIG1hcCBzdG9yZXMgMyBwaWVjZXMgb2YgaW5mb3JtYXRpb246CiAgICAgICAgLy8ga2V5OiBpdGVtcyBhcnJheSBvYmplY3QKICAgICAgICAvLyB2YWx1ZTogaXRlbXMgYXJyYXkgaW5kZXgKICAgICAgICAvLyBvcmRlcjogc2VsZWN0ZWQgYXJyYXkgaW5kZXgKICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzZWxlY3Rpb24KICAgICAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5tdWx0aSA/IFtdIDogbnVsbDsKICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGl0ZW0gaXMgY3VycmVudGx5IHNlbGVjdGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gdGVzdAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGlzIHNlbGVjdGVkCiAgICAgICAqLwogICAgICBpc1NlbGVjdGVkKGl0ZW0pIHsKICAgICAgICByZXR1cm4gdGhpcy5fX3NlbGVjdGVkTWFwLmhhcyhpdGVtKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIHRlc3QKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgaXRlbSBpcyBzZWxlY3RlZAogICAgICAgKi8KICAgICAgaXNJbmRleFNlbGVjdGVkKGlkeCkgewogICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWQodGhpcy5pdGVtc1tpZHhdKTsKICAgICAgfQoKICAgICAgX19kZXNlbGVjdENoYW5nZWRJZHgoaWR4KSB7CiAgICAgICAgbGV0IHNpZHggPSB0aGlzLl9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleChpZHgpOwogICAgICAgIGlmIChzaWR4ID49IDApIHsKICAgICAgICAgIGxldCBpID0gMDsKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKChpZHgsIGl0ZW0pID0+IHsKICAgICAgICAgICAgaWYgKHNpZHggPT0gaSsrKSB7CiAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdChpdGVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3NlbGVjdGVkSW5kZXhGb3JJdGVtSW5kZXgoaWR4KSB7CiAgICAgICAgbGV0IHNlbGVjdGVkID0gdGhpcy5fX2RhdGFMaW5rZWRQYXRoc1snaXRlbXMuJyArIGlkeF07CiAgICAgICAgaWYgKHNlbGVjdGVkKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoc2VsZWN0ZWQuc2xpY2UoJ3NlbGVjdGVkLicubGVuZ3RoKSwgMTApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIERlc2VsZWN0cyB0aGUgZ2l2ZW4gaXRlbSBpZiBpdCBpcyBhbHJlYWR5IHNlbGVjdGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gZGVzZWxlY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGRlc2VsZWN0KGl0ZW0pIHsKICAgICAgICBsZXQgaWR4ID0gdGhpcy5fX3NlbGVjdGVkTWFwLmdldChpdGVtKTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5kZWxldGUoaXRlbSk7CiAgICAgICAgICBsZXQgc2lkeDsKICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgIHNpZHggPSB0aGlzLl9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleChpZHgpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX3VwZGF0ZUxpbmtzKCk7CiAgICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgICB0aGlzLnNwbGljZSgnc2VsZWN0ZWQnLCBzaWR4LCAxKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRGVzZWxlY3RzIHRoZSBnaXZlbiBpbmRleCBpZiBpdCBpcyBhbHJlYWR5IHNlbGVjdGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaWR4IEluZGV4IGZyb20gYGl0ZW1zYCBhcnJheSB0byBkZXNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGVzZWxlY3RJbmRleChpZHgpIHsKICAgICAgICB0aGlzLmRlc2VsZWN0KHRoaXMuaXRlbXNbaWR4XSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZWxlY3RzIHRoZSBnaXZlbiBpdGVtLiAgV2hlbiBgdG9nZ2xlYCBpcyB0cnVlLCB0aGlzIHdpbGwgYXV0b21hdGljYWxseQogICAgICAgKiBkZXNlbGVjdCB0aGUgaXRlbSBpZiBhbHJlYWR5IHNlbGVjdGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gc2VsZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzZWxlY3QoaXRlbSkgewogICAgICAgIHRoaXMuc2VsZWN0SW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGVjdHMgdGhlIGdpdmVuIGluZGV4LiAgV2hlbiBgdG9nZ2xlYCBpcyB0cnVlLCB0aGlzIHdpbGwgYXV0b21hdGljYWxseQogICAgICAgKiBkZXNlbGVjdCB0aGUgaXRlbSBpZiBhbHJlYWR5IHNlbGVjdGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaWR4IEluZGV4IGZyb20gYGl0ZW1zYCBhcnJheSB0byBzZWxlY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNlbGVjdEluZGV4KGlkeCkgewogICAgICAgIGxldCBpdGVtID0gdGhpcy5pdGVtc1tpZHhdOwogICAgICAgIGlmICghdGhpcy5pc1NlbGVjdGVkKGl0ZW0pKSB7CiAgICAgICAgICBpZiAoIXRoaXMubXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmNsZWFyKCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAuc2V0KGl0ZW0sIGlkeCk7CiAgICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgIHRoaXMucHVzaCgnc2VsZWN0ZWQnLCBpdGVtKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW07CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRvZ2dsZSkgewogICAgICAgICAgdGhpcy5kZXNlbGVjdEluZGV4KGlkeCk7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBBcnJheVNlbGVjdG9yTWl4aW47CgogIH0pOwoKICAvLyBleHBvcnQgbWl4aW4KICBQb2x5bWVyLkFycmF5U2VsZWN0b3JNaXhpbiA9IEFycmF5U2VsZWN0b3JNaXhpbjsKCiAgLyoqCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGV4dGVuZHMge1BvbHltZXIuRWxlbWVudH0KICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9BcnJheVNlbGVjdG9yTWl4aW59CiAgICogQHByaXZhdGUKICAgKi8KICBsZXQgYmFzZUFycmF5U2VsZWN0b3IgPSBBcnJheVNlbGVjdG9yTWl4aW4oUG9seW1lci5FbGVtZW50KTsKCiAgLyoqCiAgICogRWxlbWVudCBpbXBsZW1lbnRpbmcgdGhlIGBQb2x5bWVyLkFycmF5U2VsZWN0b3JgIG1peGluLCB3aGljaCByZWNvcmRzCiAgICogZHluYW1pYyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBpdGVtIHBhdGhzIGluIGEgbWFzdGVyIGBpdGVtc2AgYXJyYXkgYW5kIGEKICAgKiBgc2VsZWN0ZWRgIGFycmF5IHN1Y2ggdGhhdCBwYXRoIGNoYW5nZXMgdG8gdGhlIG1hc3RlciBhcnJheSAoYXQgdGhlIGhvc3QpCiAgICogZWxlbWVudCBvciBlbHNld2hlcmUgdmlhIGRhdGEtYmluZGluZykgYXJlIGNvcnJlY3RseSBwcm9wYWdhdGVkIHRvIGl0ZW1zCiAgICogaW4gdGhlIHNlbGVjdGVkIGFycmF5IGFuZCB2aWNlLXZlcnNhLgogICAqCiAgICogVGhlIGBpdGVtc2AgcHJvcGVydHkgYWNjZXB0cyBhbiBhcnJheSBvZiB1c2VyIGRhdGEsIGFuZCB2aWEgdGhlCiAgICogYHNlbGVjdChpdGVtKWAgYW5kIGBkZXNlbGVjdChpdGVtKWAgQVBJLCB1cGRhdGVzIHRoZSBgc2VsZWN0ZWRgIHByb3BlcnR5CiAgICogd2hpY2ggbWF5IGJlIGJvdW5kIHRvIG90aGVyIHBhcnRzIG9mIHRoZSBhcHBsaWNhdGlvbiwgYW5kIGFueSBjaGFuZ2VzIHRvCiAgICogc3ViLWZpZWxkcyBvZiBgc2VsZWN0ZWRgIGl0ZW0ocykgd2lsbCBiZSBrZXB0IGluIHN5bmMgd2l0aCBpdGVtcyBpbiB0aGUKICAgKiBgaXRlbXNgIGFycmF5LiAgV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCBgc2VsZWN0ZWRgIGlzIGEgcHJvcGVydHkKICAgKiByZXByZXNlbnRpbmcgdGhlIGxhc3Qgc2VsZWN0ZWQgaXRlbS4gIFdoZW4gYG11bHRpYCBpcyB0cnVlLCBgc2VsZWN0ZWRgCiAgICogaXMgYW4gYXJyYXkgb2YgbXVsdGlwbHkgc2VsZWN0ZWQgaXRlbXMuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogYGBgaHRtbAogICAqIDxkb20tbW9kdWxlIGlkPSJlbXBsb3llZS1saXN0Ij4KICAgKgogICAqICAgPHRlbXBsYXRlPgogICAqCiAgICogICAgIDxkaXY+IEVtcGxveWVlIGxpc3Q6IDwvZGl2PgogICAqICAgICA8ZG9tLXJlcGVhdCBpZD0iZW1wbG95ZWVMaXN0IiBpdGVtcz0ie3tlbXBsb3llZXN9fSI+CiAgICogICAgICAgPHRlbXBsYXRlPgogICAqICAgICAgICAgPGRpdj5GaXJzdCBuYW1lOiA8c3Bhbj57e2l0ZW0uZmlyc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICAgICAgPGRpdj5MYXN0IG5hbWU6IDxzcGFuPnt7aXRlbS5sYXN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICAgIDxidXR0b24gb24tY2xpY2s9InRvZ2dsZVNlbGVjdGlvbiI+U2VsZWN0PC9idXR0b24+CiAgICogICAgICAgPC90ZW1wbGF0ZT4KICAgKiAgICAgPC9kb20tcmVwZWF0PgogICAqCiAgICogICAgIDxhcnJheS1zZWxlY3RvciBpZD0ic2VsZWN0b3IiIGl0ZW1zPSJ7e2VtcGxveWVlc319IiBzZWxlY3RlZD0ie3tzZWxlY3RlZH19IiBtdWx0aSB0b2dnbGU+PC9hcnJheS1zZWxlY3Rvcj4KICAgKgogICAqICAgICA8ZGl2PiBTZWxlY3RlZCBlbXBsb3llZXM6IDwvZGl2PgogICAqICAgICA8ZG9tLXJlcGVhdCBpdGVtcz0ie3tzZWxlY3RlZH19Ij4KICAgKiAgICAgICA8dGVtcGxhdGU+CiAgICogICAgICAgICA8ZGl2PkZpcnN0IG5hbWU6IDxzcGFuPnt7aXRlbS5maXJzdH19PC9zcGFuPjwvZGl2PgogICAqICAgICAgICAgPGRpdj5MYXN0IG5hbWU6IDxzcGFuPnt7aXRlbS5sYXN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgPC90ZW1wbGF0ZT4KICAgKiAgICAgPC9kb20tcmVwZWF0PgogICAqCiAgICogICA8L3RlbXBsYXRlPgogICAqCiAgICogPC9kb20tbW9kdWxlPgogICAqIGBgYAogICAqCiAgICogYGBganMKICAgKmNsYXNzIEVtcGxveWVlTGlzdCBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CiAgICogIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZW1wbG95ZWUtbGlzdCc7IH0KICAgKiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAqICAgIHJldHVybiB7CiAgICogICAgICBlbXBsb3llZXM6IHsKICAgKiAgICAgICAgdmFsdWUoKSB7CiAgICogICAgICAgICAgcmV0dXJuIFsKICAgKiAgICAgICAgICAgIHtmaXJzdDogJ0JvYicsIGxhc3Q6ICdTbWl0aCd9LAogICAqICAgICAgICAgICAge2ZpcnN0OiAnU2FsbHknLCBsYXN0OiAnSm9obnNvbid9LAogICAqICAgICAgICAgICAgLi4uCiAgICogICAgICAgICAgXTsKICAgKiAgICAgICAgfQogICAqICAgICAgfQogICAqICAgIH07CiAgICogIH0KICAgKiAgdG9nZ2xlU2VsZWN0aW9uKGUpIHsKICAgKiAgICBsZXQgaXRlbSA9IHRoaXMuJC5lbXBsb3llZUxpc3QuaXRlbUZvckVsZW1lbnQoZS50YXJnZXQpOwogICAqICAgIHRoaXMuJC5zZWxlY3Rvci5zZWxlY3QoaXRlbSk7CiAgICogIH0KICAgKn0KICAgKiBgYGAKICAgKgogICAqIEBwb2x5bWVyCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAZXh0ZW5kcyB7YmFzZUFycmF5U2VsZWN0b3J9CiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLkFycmF5U2VsZWN0b3JNaXhpbgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBsaW5rcyBwYXRocyBiZXR3ZWVuIGFuIGlucHV0IGBpdGVtc2AgYXJyYXkgYW5kCiAgICogICBhbiBvdXRwdXQgYHNlbGVjdGVkYCBpdGVtIG9yIGFycmF5IGJhc2VkIG9uIGNhbGxzIHRvIGl0cyBzZWxlY3Rpb24gQVBJLgogICAqLwogIGNsYXNzIEFycmF5U2VsZWN0b3IgZXh0ZW5kcyBiYXNlQXJyYXlTZWxlY3RvciB7CiAgICAvLyBOb3QgbmVlZGVkIHRvIGZpbmQgdGVtcGxhdGU7IGNhbiBiZSByZW1vdmVkIG9uY2UgdGhlIGFuYWx5emVyCiAgICAvLyBjYW4gZmluZCB0aGUgdGFnIG5hbWUgZnJvbSBjdXN0b21FbGVtZW50cy5kZWZpbmUgY2FsbAogICAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdhcnJheS1zZWxlY3Rvcic7IH0KICB9CiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKEFycmF5U2VsZWN0b3IuaXMsIEFycmF5U2VsZWN0b3IpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5BcnJheVNlbGVjdG9yID0gQXJyYXlTZWxlY3RvcjsKCn0pKCk7CgoKKGZ1bmN0aW9uKCl7LyoKCkNvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCid1c2Ugc3RyaWN0Jzt2YXIgYz1udWxsLGY9d2luZG93LkhUTUxJbXBvcnRzJiZ3aW5kb3cuSFRNTEltcG9ydHMud2hlblJlYWR5fHxudWxsLGc7ZnVuY3Rpb24gaChhKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtmP2YoYSk6KGN8fChjPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEpe2c9YX0pLCJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlP2coKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixmdW5jdGlvbigpeyJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlJiZnKCl9KSksYy50aGVuKGZ1bmN0aW9uKCl7YSYmYSgpfSkpfSl9O3ZhciBrPW51bGwsbD1udWxsO2Z1bmN0aW9uIG0oKXt0aGlzLmN1c3RvbVN0eWxlcz1bXTt0aGlzLmVucXVldWVkPSExO2goZnVuY3Rpb24oKXt3aW5kb3cuU2hhZHlDU1MuZmx1c2hDdXN0b21TdHlsZXMmJndpbmRvdy5TaGFkeUNTUy5mbHVzaEN1c3RvbVN0eWxlcygpfSl9ZnVuY3Rpb24gbihhKXshYS5lbnF1ZXVlZCYmbCYmKGEuZW5xdWV1ZWQ9ITAsaChsKSl9bS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXthLl9fc2VlbkJ5U2hhZHlDU1N8fChhLl9fc2VlbkJ5U2hhZHlDU1M9ITAsdGhpcy5jdXN0b21TdHlsZXMucHVzaChhKSxuKHRoaXMpKX07bS5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXtpZihhLl9fc2hhZHlDU1NDYWNoZWRTdHlsZSlyZXR1cm4gYS5fX3NoYWR5Q1NTQ2FjaGVkU3R5bGU7dmFyIGI7YS5nZXRTdHlsZT9iPWEuZ2V0U3R5bGUoKTpiPWE7cmV0dXJuIGJ9OwptLnByb3RvdHlwZS5hPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuY3VzdG9tU3R5bGVzLGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXTtpZighZC5fX3NoYWR5Q1NTQ2FjaGVkU3R5bGUpe3ZhciBlPXRoaXMuYihkKTtlJiYoZT1lLl9fYXBwbGllZEVsZW1lbnR8fGUsayYmayhlKSxkLl9fc2hhZHlDU1NDYWNoZWRTdHlsZT1lKX19cmV0dXJuIGF9O20ucHJvdG90eXBlLmFkZEN1c3RvbVN0eWxlPW0ucHJvdG90eXBlLmM7bS5wcm90b3R5cGUuZ2V0U3R5bGVGb3JDdXN0b21TdHlsZT1tLnByb3RvdHlwZS5iO20ucHJvdG90eXBlLnByb2Nlc3NTdHlsZXM9bS5wcm90b3R5cGUuYTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobS5wcm90b3R5cGUse3RyYW5zZm9ybUNhbGxiYWNrOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ga30sc2V0OmZ1bmN0aW9uKGEpe2s9YX19LHZhbGlkYXRlQ2FsbGJhY2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBsfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7bHx8KGI9ITApO2w9YTtiJiZuKHRoaXMpfX19KTtmdW5jdGlvbiBwKGEsYil7Zm9yKHZhciBkIGluIGIpbnVsbD09PWQ/YS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShkKTphLnN0eWxlLnNldFByb3BlcnR5KGQsYltkXSl9O3ZhciBxPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLHI7ZnVuY3Rpb24gdChhKXtyPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6cXx8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgdTt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKHU9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgdj0hKCF3aW5kb3cuU2hhZHlDU1N8fCF3aW5kb3cuU2hhZHlDU1MuZGlzYWJsZVJ1bnRpbWUpOwp3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M/cj13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzOndpbmRvdy5TaGFkeUNTUz8odCh3aW5kb3cuU2hhZHlDU1MpLHdpbmRvdy5TaGFkeUNTUz12b2lkIDApOnQod2luZG93LldlYkNvbXBvbmVudHMmJndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzKTt2YXIgdz1yLHg9dTt2YXIgeT1uZXcgbTt3aW5kb3cuU2hhZHlDU1N8fCh3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbigpe30scHJlcGFyZVRlbXBsYXRlRG9tOmZ1bmN0aW9uKCl7fSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oKXt9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe3kuYSgpO3AoYSxiKX0sc3R5bGVFbGVtZW50OmZ1bmN0aW9uKCl7eS5hKCl9LHN0eWxlRG9jdW1lbnQ6ZnVuY3Rpb24oYSl7eS5hKCk7cChkb2N1bWVudC5ib2R5LGEpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9hLnRyaW0oKToiIn0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXt9LG5hdGl2ZUNzczp3LG5hdGl2ZVNoYWRvdzpxLGNzc0J1aWxkOngsZGlzYWJsZVJ1bnRpbWU6dn0pO3dpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT15O30pLmNhbGwodGhpcyk7CgoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBhdHRyID0gJ2luY2x1ZGUnOwoKICBjb25zdCBDdXN0b21TdHlsZUludGVyZmFjZSA9IHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTsKCiAgLyoqCiAgICogQ3VzdG9tIGVsZW1lbnQgZm9yIGRlZmluaW5nIHN0eWxlcyBpbiB0aGUgbWFpbiBkb2N1bWVudCB0aGF0IGNhbiB0YWtlCiAgICogYWR2YW50YWdlIG9mIFtzaGFkeSBET01dKGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJjb21wb25lbnRzL3NoYWR5Y3NzKSBzaGltcwogICAqIGZvciBzdHlsZSBlbmNhcHN1bGF0aW9uLCBjdXN0b20gcHJvcGVydGllcywgYW5kIGN1c3RvbSBtaXhpbnMuCiAgICoKICAgKiAtIERvY3VtZW50IHN0eWxlcyBkZWZpbmVkIGluIGEgYDxjdXN0b20tc3R5bGU+YCBhcmUgc2hpbW1lZCB0byBlbnN1cmUgdGhleQogICAqICAgZG8gbm90IGxlYWsgaW50byBsb2NhbCBET00gd2hlbiBydW5uaW5nIG9uIGJyb3dzZXJzIHdpdGhvdXQgbmF0aXZlCiAgICogICBTaGFkb3cgRE9NLgogICAqIC0gQ3VzdG9tIHByb3BlcnRpZXMgY2FuIGJlIGRlZmluZWQgaW4gYSBgPGN1c3RvbS1zdHlsZT5gLiBVc2UgdGhlIGBodG1sYCBzZWxlY3RvcgogICAqICAgdG8gZGVmaW5lIGN1c3RvbSBwcm9wZXJ0aWVzIHRoYXQgYXBwbHkgdG8gYWxsIGN1c3RvbSBlbGVtZW50cy4KICAgKiAtIEN1c3RvbSBtaXhpbnMgY2FuIGJlIGRlZmluZWQgaW4gYSBgPGN1c3RvbS1zdHlsZT5gLCBpZiB5b3UgaW1wb3J0IHRoZSBvcHRpb25hbAogICAqICAgW2FwcGx5IHNoaW1dKGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJjb21wb25lbnRzL3NoYWR5Y3NzI2Fib3V0LWFwcGx5c2hpbSkKICAgKiAgIChgc2hhZHljc3MvYXBwbHktc2hpbS5odG1sYCkuCiAgICoKICAgKiBUbyB1c2U6CiAgICoKICAgKiAtIEltcG9ydCBgY3VzdG9tLXN0eWxlLmh0bWxgLgogICAqIC0gUGxhY2UgYSBgPGN1c3RvbS1zdHlsZT5gIGVsZW1lbnQgaW4gdGhlIG1haW4gZG9jdW1lbnQsIHdyYXBwaW5nIGFuIGlubGluZSBgPHN0eWxlPmAgdGFnIHRoYXQKICAgKiAgIGNvbnRhaW5zIHRoZSBDU1MgcnVsZXMgeW91IHdhbnQgdG8gc2hpbS4KICAgKgogICAqIEZvciBleGFtcGxlOgogICAqCiAgICogYGBgaHRtbAogICAqIDwhLS0gaW1wb3J0IGFwcGx5IHNoaW0tLW9ubHkgcmVxdWlyZWQgaWYgdXNpbmcgbWl4aW5zIC0tPgogICAqIDxsaW5rIHJlbD0iaW1wb3J0IiBocmVmPSJib3dlcl9jb21wb25lbnRzL3NoYWR5Y3NzL2FwcGx5LXNoaW0uaHRtbCI+CiAgICogPCEtLSBpbXBvcnQgY3VzdG9tLXN0eWxlIGVsZW1lbnQgLS0+CiAgICogPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvcG9seW1lci9saWIvZWxlbWVudHMvY3VzdG9tLXN0eWxlLmh0bWwiPgogICAqCiAgICogPGN1c3RvbS1zdHlsZT4KICAgKiAgIDxzdHlsZT4KICAgKiAgICAgaHRtbCB7CiAgICogICAgICAgLS1jdXN0b20tY29sb3I6IGJsdWU7CiAgICogICAgICAgLS1jdXN0b20tbWl4aW46IHsKICAgKiAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAqICAgICAgICAgY29sb3I6IHJlZDsKICAgKiAgICAgICB9OwogICAqICAgICB9CiAgICogICA8L3N0eWxlPgogICAqIDwvY3VzdG9tLXN0eWxlPgogICAqIGBgYAogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAZXh0ZW5kcyBIVE1MRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgZm9yIGRlZmluaW5nIHN0eWxlcyBpbiB0aGUgbWFpbiBkb2N1bWVudCB0aGF0IGNhbgogICAqICAgdGFrZSBhZHZhbnRhZ2Ugb2YgUG9seW1lcidzIHN0eWxlIHNjb3BpbmcgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzIHNoaW1zLgogICAqLwogIGNsYXNzIEN1c3RvbVN0eWxlIGV4dGVuZHMgSFRNTEVsZW1lbnQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuX3N0eWxlID0gbnVsbDsKICAgICAgQ3VzdG9tU3R5bGVJbnRlcmZhY2UuYWRkQ3VzdG9tU3R5bGUodGhpcyk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGxpZ2h0LURPTSBgPHN0eWxlPmAgY2hpbGQgdGhpcyBlbGVtZW50IHdyYXBzLiAgVXBvbiBmaXJzdAogICAgICogY2FsbCBhbnkgc3R5bGUgbW9kdWxlcyByZWZlcmVuY2VkIHZpYSB0aGUgYGluY2x1ZGVgIGF0dHJpYnV0ZSB3aWxsIGJlCiAgICAgKiBjb25jYXRlbmF0ZWQgdG8gdGhpcyBlbGVtZW50J3MgYDxzdHlsZT5gLgogICAgICoKICAgICAqIEByZXR1cm4ge0hUTUxTdHlsZUVsZW1lbnR9IFRoaXMgZWxlbWVudCdzIGxpZ2h0LURPTSBgPHN0eWxlPmAKICAgICAqLwogICAgZ2V0U3R5bGUoKSB7CiAgICAgIGlmICh0aGlzLl9zdHlsZSkgewogICAgICAgIHJldHVybiB0aGlzLl9zdHlsZTsKICAgICAgfQogICAgICBjb25zdCBzdHlsZSA9IC8qKiBAdHlwZSB7SFRNTFN0eWxlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCdzdHlsZScpKTsKICAgICAgaWYgKCFzdHlsZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHRoaXMuX3N0eWxlID0gc3R5bGU7CiAgICAgIGNvbnN0IGluY2x1ZGUgPSBzdHlsZS5nZXRBdHRyaWJ1dGUoYXR0cik7CiAgICAgIGlmIChpbmNsdWRlKSB7CiAgICAgICAgc3R5bGUucmVtb3ZlQXR0cmlidXRlKGF0dHIpOwogICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gUG9seW1lci5TdHlsZUdhdGhlci5jc3NGcm9tTW9kdWxlcyhpbmNsdWRlKSArIHN0eWxlLnRleHRDb250ZW50OwogICAgICB9CiAgICAgIC8qCiAgICAgIEhUTUwgSW1wb3J0cyBzdHlsaW5nIHRoZSBtYWluIGRvY3VtZW50IGFyZSBkZXByZWNhdGVkIGluIENocm9tZQogICAgICBodHRwczovL2NyYnVnLmNvbS81MjM5NTIKCiAgICAgIElmIHRoaXMgZWxlbWVudCBpcyBub3QgaW4gdGhlIG1haW4gZG9jdW1lbnQsIHRoZW4gaXQgbXVzdCBiZSBpbiBhbiBIVE1MIEltcG9ydCBkb2N1bWVudC4KICAgICAgSW4gdGhhdCBjYXNlLCBtb3ZlIHRoZSBjdXN0b20gc3R5bGUgdG8gdGhlIG1haW4gZG9jdW1lbnQuCgogICAgICBUaGUgb3JkZXJpbmcgb2YgYDxjdXN0b20tc3R5bGU+YCBzaG91bGQgc3RheSB0aGUgc2FtZSBhcyB3aGVuIGxvYWRlZCBieSBIVE1MIEltcG9ydHMsIGJ1dCB0aGVyZSBtYXkgYmUgb2RkCiAgICAgIGNhc2VzIG9mIG9yZGVyaW5nIHcuci50IHRoZSBtYWluIGRvY3VtZW50IHN0eWxlcy4KICAgICAgKi8KICAgICAgaWYgKHRoaXMub3duZXJEb2N1bWVudCAhPT0gd2luZG93LmRvY3VtZW50KSB7CiAgICAgICAgd2luZG93LmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlOwogICAgfQogIH0KCiAgd2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnY3VzdG9tLXN0eWxlJywgQ3VzdG9tU3R5bGUpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5DdXN0b21TdHlsZSA9IEN1c3RvbVN0eWxlOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBtdXRhYmxlUHJvcGVydHlDaGFuZ2U7CiAgLyoqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9ICovCiAgKCgpID0+IHsKICAgIG11dGFibGVQcm9wZXJ0eUNoYW5nZSA9IFBvbHltZXIuTXV0YWJsZURhdGEuX211dGFibGVQcm9wZXJ0eUNoYW5nZTsKICB9KSgpOwoKICAvKioKICAgKiBMZWdhY3kgZWxlbWVudCBiZWhhdmlvciB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzLAogICAqIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKSBmb3IgdXNlIG9uIGxlZ2FjeSBBUEkgUG9seW1lciBlbGVtZW50cy4KICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgY2F1c2UgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGFwcGx5IHRoaXMgYmVoYXZpb3Igb3IgZW5hYmxlIHRoZQogICAqIGBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcmAuCiAgICoKICAgKiBJbiBvcmRlciB0byBtYWtlIHRoZSBkaXJ0eSBjaGVjayBzdHJhdGVneSBjb25maWd1cmFibGUsIHNlZQogICAqIGBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcmAuCiAgICoKICAgKiBOb3RlLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIHByb3BhZ2F0aW5nIGxhcmdlIG9iamVjdCBncmFwaHMKICAgKiB3aWxsIGJlIHdvcnNlIGFzIG9wcG9zZWQgdG8gdXNpbmcgc3RyaWN0IGRpcnR5IGNoZWNraW5nIHdpdGggaW1tdXRhYmxlCiAgICogcGF0dGVybnMgb3IgUG9seW1lcidzIHBhdGggbm90aWZpY2F0aW9uIEFQSS4KICAgKgogICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEJlaGF2aW9yIHRvIHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZAogICAqICAgYXJyYXlzCiAgICovCiAgUG9seW1lci5NdXRhYmxlRGF0YUJlaGF2aW9yID0gewoKICAgIC8qKgogICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgKiBzdHJpY3QgZXF1YWxpdHkgY2hlY2tpbmcgZm9yIE9iamVjdHMgYW5kIEFycmF5cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBwdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAKICAgICAqIGNhY2hlIChyYXRoZXIgdGhhbiB0aGUgbm9ybWFsIGBfX2RhdGFgIGNhY2hlKSBmb3IgT2JqZWN0cy4gIFNpbmNlIHRoZSB0ZW1wCiAgICAgKiBjYWNoZSBpcyBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgYSB0dXJuLCB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cwogICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgKiBzYW1lIG9iamVjdCAodXNpbmcgdGhlIHRlbXAgY2FjaGUgYXMgYW4gaW4tdHVybiBiYWNrc3RvcCB0byBwcmV2ZW50CiAgICAgKiBjeWNsZXMgZHVlIHRvIDItd2F5IG5vdGlmaWNhdGlvbikuCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBjaGFuZ2UKICAgICAqIEBwcm90ZWN0ZWQKICAgICAqLwogICAgX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKSB7CiAgICAgIHJldHVybiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UodGhpcywgcHJvcGVydHksIHZhbHVlLCBvbGQsIHRydWUpOwogICAgfQogIH07CgogIC8qKgogICAqIExlZ2FjeSBlbGVtZW50IGJlaGF2aW9yIHRvIGFkZCB0aGUgb3B0aW9uYWwgYWJpbGl0eSB0byBza2lwIHN0cmljdAogICAqIGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlCiAgICogImRpcnR5IikgYnkgc2V0dGluZyBhIGBtdXRhYmxlLWRhdGFgIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50IGluc3RhbmNlLgogICAqCiAgICogQnkgZGVmYXVsdCwgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBwZXJmb3JtcyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgb24KICAgKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGFueSBkZWVwIG1vZGlmaWNhdGlvbnMgdG8gYW4gb2JqZWN0IG9yIGFycmF5IHdpbGwKICAgKiBub3QgYmUgcHJvcGFnYXRlZCB1bmxlc3MgImltbXV0YWJsZSIgZGF0YSBwYXR0ZXJucyBhcmUgdXNlZCAoaS5lLiBhbGwgb2JqZWN0CiAgICogcmVmZXJlbmNlcyBmcm9tIHRoZSByb290IHRvIHRoZSBtdXRhdGlvbiB3ZXJlIGNoYW5nZWQpLgogICAqCiAgICogUG9seW1lciBhbHNvIHByb3ZpZGVzIGEgcHJvcHJpZXRhcnkgZGF0YSBtdXRhdGlvbiBhbmQgcGF0aCBub3RpZmljYXRpb24gQVBJCiAgICogKGUuZy4gYG5vdGlmeVBhdGhgLCBgc2V0YCwgYW5kIGFycmF5IG11dGF0aW9uIEFQSSdzKSB0aGF0IGFsbG93IGVmZmljaWVudAogICAqIG11dGF0aW9uIGFuZCBub3RpZmljYXRpb24gb2YgZGVlcCBjaGFuZ2VzIGluIGFuIG9iamVjdCBncmFwaCB0byBhbGwgZWxlbWVudHMKICAgKiBib3VuZCB0byB0aGUgc2FtZSBvYmplY3QgZ3JhcGguCiAgICoKICAgKiBJbiBjYXNlcyB3aGVyZSBuZWl0aGVyIGltbXV0YWJsZSBwYXR0ZXJucyBub3IgdGhlIGRhdGEgbXV0YXRpb24gQVBJIGNhbiBiZQogICAqIHVzZWQsIGFwcGx5aW5nIHRoaXMgbWl4aW4gd2lsbCBhbGxvdyBQb2x5bWVyIHRvIHNraXAgZGlydHkgY2hlY2tpbmcgZm9yCiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKS4gIFRoaXMgYWxsb3dzIGEKICAgKiB1c2VyIHRvIG1ha2UgYSBkZWVwIG1vZGlmaWNhdGlvbiB0byBhIGJvdW5kIG9iamVjdCBncmFwaCwgYW5kIHRoZW4gZWl0aGVyCiAgICogc2ltcGx5IHJlLXNldCB0aGUgb2JqZWN0IChlLmcuIGB0aGlzLml0ZW1zID0gdGhpcy5pdGVtc2ApIG9yIGNhbGwgYG5vdGlmeVBhdGhgCiAgICogKGUuZy4gYHRoaXMubm90aWZ5UGF0aCgnaXRlbXMnKWApIHRvIHVwZGF0ZSB0aGUgdHJlZS4gIE5vdGUgdGhhdCBhbGwKICAgKiBlbGVtZW50cyB0aGF0IHdpc2ggdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBkZWVwIG11dGF0aW9ucyBtdXN0IGFwcGx5IHRoaXMKICAgKiBtaXhpbiBvciBvdGhlcndpc2Ugc2tpcCBzdHJpY3QgZGlydHkgY2hlY2tpbmcgZm9yIG9iamVjdHMvYXJyYXlzLgogICAqIFNwZWNpZmljYWxseSwgYW55IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIHRyZWUgYmV0d2VlbiB0aGUgc291cmNlIG9mIGEKICAgKiBtdXRhdGlvbiBhbmQgdGhlIGNvbnN1bXB0aW9uIG9mIGl0IG11c3QgZW5hYmxlIHRoaXMgYmVoYXZpb3Igb3IgYXBwbHkgdGhlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIFdoaWxlIHRoaXMgYmVoYXZpb3IgYWRkcyB0aGUgYWJpbGl0eSB0byBmb3JnbyBPYmplY3QvQXJyYXkgZGlydHkgY2hlY2tpbmcsCiAgICogdGhlIGBtdXRhYmxlRGF0YWAgZmxhZyBkZWZhdWx0cyB0byBmYWxzZSBhbmQgbXVzdCBiZSBzZXQgb24gdGhlIGluc3RhbmNlLgogICAqCiAgICogTm90ZSwgdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBwcm9wYWdhdGluZyBsYXJnZSBvYmplY3QgZ3JhcGhzCiAgICogd2lsbCBiZSB3b3JzZSBieSByZWx5aW5nIG9uIGBtdXRhYmxlRGF0YTogdHJ1ZWAgYXMgb3Bwb3NlZCB0byB1c2luZwogICAqIHN0cmljdCBkaXJ0eSBjaGVja2luZyB3aXRoIGltbXV0YWJsZSBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24KICAgKiBBUEkuCiAgICoKICAgKiBAcG9seW1lckJlaGF2aW9yCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBCZWhhdmlvciB0byBvcHRpb25hbGx5IHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZAogICAqICAgYXJyYXlzCiAgICovCiAgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3IgPSB7CgogICAgcHJvcGVydGllczogewogICAgICAvKioKICAgICAgICogSW5zdGFuY2UtbGV2ZWwgZmxhZyBmb3IgY29uZmlndXJpbmcgdGhlIGRpcnR5LWNoZWNraW5nIHN0cmF0ZWd5CiAgICAgICAqIGZvciB0aGlzIGVsZW1lbnQuICBXaGVuIHRydWUsIE9iamVjdHMgYW5kIEFycmF5cyB3aWxsIHNraXAgZGlydHkKICAgICAgICogY2hlY2tpbmcsIG90aGVyd2lzZSBzdHJpY3QgZXF1YWxpdHkgY2hlY2tpbmcgd2lsbCBiZSB1c2VkLgogICAgICAgKi8KICAgICAgbXV0YWJsZURhdGE6IEJvb2xlYW4KICAgIH0sCgogICAgLyoqCiAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCB0byBza2lwIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZwogICAgICogZm9yIE9iamVjdHMgYW5kIEFycmF5cy4KICAgICAqCiAgICAgKiBQdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAgY2FjaGUKICAgICAqIChyYXRoZXIgdGhhbiB0aGUgbm9ybWFsIGBfX2RhdGFgIGNhY2hlKSBmb3IgT2JqZWN0cy4gIFNpbmNlIHRoZSB0ZW1wCiAgICAgKiBjYWNoZSBpcyBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgYSB0dXJuLCB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cwogICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgKiBzYW1lIG9iamVjdCAodXNpbmcgdGhlIHRlbXAgY2FjaGUgYXMgYW4gaW4tdHVybiBiYWNrc3RvcCB0byBwcmV2ZW50CiAgICAgKiBjeWNsZXMgZHVlIHRvIDItd2F5IG5vdGlmaWNhdGlvbikuCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBjaGFuZ2UKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdGhpcy5tdXRhYmxlRGF0YSk7CiAgICB9CiAgfTsKCn0pKCk7CgoKCiAgLy8gYmMKICBQb2x5bWVyLkJhc2UgPSBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCkucHJvdG90eXBlOwoKICAvLyBOT1RFOiB0aGlzIGlzIGhlcmUgZm9yIG1vZHVsaXplciB0byBleHBvcnQgYGh0bWxgIGZvciB0aGUgbW9kdWxlIHZlcnNpb24gb2YgdGhpcyBmaWxlCiAgUG9seW1lci5odG1sID0gUG9seW1lci5odG1sOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZmxleC1sYXlvdXQvaXJvbi1mbGV4LWxheW91dC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Yi50ZXh0Q29udGVudD0iW2hpZGRlbl0geyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0iO2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYil9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYTExeS1rZXlzLWJlaGF2aW9yL2lyb24tYTExeS1rZXlzLWJlaGF2aW9yLmh0bWwuanMKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYih3LEMpe3ZhciBGPSIiO2lmKHcpaWYodz13LnRvTG93ZXJDYXNlKCksIiAiPT09d3x8QS50ZXN0KHcpKUY9InNwYWNlIjtlbHNlIGlmKHkudGVzdCh3KSlGPSJlc2MiO2Vsc2UgaWYoMT09dy5sZW5ndGgpe2lmKCFDfHxxLnRlc3QodykpRj13fWVsc2UgRj14LnRlc3Qodyk/dy5yZXBsYWNlKCJhcnJvdyIsIiIpOiJtdWx0aXBseSI9PXc/IioiOnc7cmV0dXJuIEZ9ZnVuY3Rpb24gZCh3KXt2YXIgQz0iIjt3JiYodyBpbiBwP0M9cFt3XTp1LnRlc3Qodyk/KHc9cGFyc2VJbnQody5yZXBsYWNlKCJVKyIsIjB4IiksMTYpLEM9U3RyaW5nLmZyb21DaGFyQ29kZSh3KS50b0xvd2VyQ2FzZSgpKTpDPXcudG9Mb3dlckNhc2UoKSk7cmV0dXJuIEN9ZnVuY3Rpb24gZih3KXt2YXIgQz0iIjtOdW1iZXIodykmJihDPTY1PD13JiY5MD49dz9TdHJpbmcuZnJvbUNoYXJDb2RlKDMyK3cpOjExMjw9dyYmMTIzPj13PyJmIisody0xMTIrMSk6NDg8PXcmJjU3Pj13PwpTdHJpbmcody00OCk6OTY8PXcmJjEwNT49dz9TdHJpbmcody05Nik6bVt3XSk7cmV0dXJuIEN9ZnVuY3Rpb24gaCh3LEMpe3JldHVybiB3LmtleT9iKHcua2V5LEMpOncuZGV0YWlsJiZ3LmRldGFpbC5rZXk/Yih3LmRldGFpbC5rZXksQyk6ZCh3LmtleUlkZW50aWZpZXIpfHxmKHcua2V5Q29kZSl8fCIifWZ1bmN0aW9uIGsodyxDKXtyZXR1cm4gaChDLHcuaGFzTW9kaWZpZXJzKT09PXcua2V5JiYoIXcuaGFzTW9kaWZpZXJzfHwhIUMuc2hpZnRLZXk9PT0hIXcuc2hpZnRLZXkmJiEhQy5jdHJsS2V5PT09ISF3LmN0cmxLZXkmJiEhQy5hbHRLZXk9PT0hIXcuYWx0S2V5JiYhIUMubWV0YUtleT09PSEhdy5tZXRhS2V5KX1mdW5jdGlvbiB0KHcpe3JldHVybiAxPT09dy5sZW5ndGg/e2NvbWJvOncsa2V5OncsZXZlbnQ6ImtleWRvd24ifTp3LnNwbGl0KCIrIikucmVkdWNlKGZ1bmN0aW9uKEMsRil7dmFyIEQ9Ri5zcGxpdCgiOiIpO0Y9RFswXTtEPURbMV07RiBpbiBuPyhDW25bRl1dPSEwLApDLmhhc01vZGlmaWVycz0hMCk6KEMua2V5PUYsQy5ldmVudD1EfHwia2V5ZG93biIpO3JldHVybiBDfSx7Y29tYm86dy5zcGxpdCgiOiIpLnNoaWZ0KCl9KX1mdW5jdGlvbiBsKHcpe3JldHVybiB3LnRyaW0oKS5zcGxpdCgiICIpLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gdChDKX0pfXZhciBwPXsiVSswMDA4IjoiYmFja3NwYWNlIiwiVSswMDA5IjoidGFiIiwiVSswMDFCIjoiZXNjIiwiVSswMDIwIjoic3BhY2UiLCJVKzAwN0YiOiJkZWwifSxtPXs4OiJiYWNrc3BhY2UiLDk6InRhYiIsMTM6ImVudGVyIiwyNzoiZXNjIiwzMzoicGFnZXVwIiwzNDoicGFnZWRvd24iLDM1OiJlbmQiLDM2OiJob21lIiwzMjoic3BhY2UiLDM3OiJsZWZ0IiwzODoidXAiLDM5OiJyaWdodCIsNDA6ImRvd24iLDQ2OiJkZWwiLDEwNjoiKiJ9LG49e3NoaWZ0OiJzaGlmdEtleSIsY3RybDoiY3RybEtleSIsYWx0OiJhbHRLZXkiLG1ldGE6Im1ldGFLZXkifSxxPS9bYS16MC05Kl0vLHU9L1VcKy8seD0vXmFycm93LywKQT0vXnNwYWNlKGJhcik/Lyx5PS9eZXNjYXBlJC87UG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcj17cHJvcGVydGllczp7a2V5RXZlbnRUYXJnZXQ6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSxzdG9wS2V5Ym9hcmRFdmVudFByb3BhZ2F0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9ib3VuZEtleUhhbmRsZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfaW1wZXJhdGl2ZUtleUJpbmRpbmdzOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX19LG9ic2VydmVyczpbIl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKGtleUV2ZW50VGFyZ2V0LCBfYm91bmRLZXlIYW5kbGVycykiXSxrZXlCaW5kaW5nczp7fSxyZWdpc3RlcmVkOmZ1bmN0aW9uKCl7dGhpcy5fcHJlcEtleUJpbmRpbmdzKCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzKCl9LAphZGRPd25LZXlCaW5kaW5nOmZ1bmN0aW9uKHcsQyl7dGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzW3ddPUM7dGhpcy5fcHJlcEtleUJpbmRpbmdzKCk7dGhpcy5fcmVzZXRLZXlFdmVudExpc3RlbmVycygpfSxyZW1vdmVPd25LZXlCaW5kaW5nczpmdW5jdGlvbigpe3RoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5ncz17fTt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKTt0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCl9LGtleWJvYXJkRXZlbnRNYXRjaGVzS2V5czpmdW5jdGlvbih3LEMpe0M9bChDKTtmb3IodmFyIEY9MDtGPEMubGVuZ3RoOysrRilpZihrKENbRl0sdykpcmV0dXJuITA7cmV0dXJuITF9LF9jb2xsZWN0S2V5QmluZGluZ3M6ZnVuY3Rpb24oKXt2YXIgdz10aGlzLmJlaGF2aW9ycy5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIEMua2V5QmluZGluZ3N9KTstMT09PXcuaW5kZXhPZih0aGlzLmtleUJpbmRpbmdzKSYmdy5wdXNoKHRoaXMua2V5QmluZGluZ3MpO3JldHVybiB3fSwKX3ByZXBLZXlCaW5kaW5nczpmdW5jdGlvbigpe3RoaXMuX2tleUJpbmRpbmdzPXt9O3RoaXMuX2NvbGxlY3RLZXlCaW5kaW5ncygpLmZvckVhY2goZnVuY3Rpb24oRil7Zm9yKHZhciBEIGluIEYpdGhpcy5fYWRkS2V5QmluZGluZyhELEZbRF0pfSx0aGlzKTtmb3IodmFyIHcgaW4gdGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzKXRoaXMuX2FkZEtleUJpbmRpbmcodyx0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3Nbd10pO2Zvcih2YXIgQyBpbiB0aGlzLl9rZXlCaW5kaW5ncyl0aGlzLl9rZXlCaW5kaW5nc1tDXS5zb3J0KGZ1bmN0aW9uKEYsRCl7Rj1GWzBdLmhhc01vZGlmaWVycztyZXR1cm4gRj09PURbMF0uaGFzTW9kaWZpZXJzPzA6Rj8tMToxfSl9LF9hZGRLZXlCaW5kaW5nOmZ1bmN0aW9uKHcsQyl7bCh3KS5mb3JFYWNoKGZ1bmN0aW9uKEYpe3RoaXMuX2tleUJpbmRpbmdzW0YuZXZlbnRdPXRoaXMuX2tleUJpbmRpbmdzW0YuZXZlbnRdfHxbXTt0aGlzLl9rZXlCaW5kaW5nc1tGLmV2ZW50XS5wdXNoKFtGLApDXSl9LHRoaXMpfSxfcmVzZXRLZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKTt0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzKCl9LF9saXN0ZW5LZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMua2V5RXZlbnRUYXJnZXQmJk9iamVjdC5rZXlzKHRoaXMuX2tleUJpbmRpbmdzKS5mb3JFYWNoKGZ1bmN0aW9uKHcpe3ZhciBDPXRoaXMuX29uS2V5QmluZGluZ0V2ZW50LmJpbmQodGhpcyx0aGlzLl9rZXlCaW5kaW5nc1t3XSk7dGhpcy5fYm91bmRLZXlIYW5kbGVycy5wdXNoKFt0aGlzLmtleUV2ZW50VGFyZ2V0LHcsQ10pO3RoaXMua2V5RXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih3LEMpfSx0aGlzKX0sX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnM6ZnVuY3Rpb24oKXtmb3IodmFyIHcsQyxGO3RoaXMuX2JvdW5kS2V5SGFuZGxlcnMubGVuZ3RoOyl3PXRoaXMuX2JvdW5kS2V5SGFuZGxlcnMucG9wKCksCkM9d1swXSxGPXdbMV0sdz13WzJdLEMucmVtb3ZlRXZlbnRMaXN0ZW5lcihGLHcpfSxfb25LZXlCaW5kaW5nRXZlbnQ6ZnVuY3Rpb24odyxDKXt0aGlzLnN0b3BLZXlib2FyZEV2ZW50UHJvcGFnYXRpb24mJkMuc3RvcFByb3BhZ2F0aW9uKCk7aWYoIUMuZGVmYXVsdFByZXZlbnRlZClmb3IodmFyIEY9MDtGPHcubGVuZ3RoO0YrKyl7dmFyIEQ9d1tGXVswXSxCPXdbRl1bMV07aWYoayhELEMpJiYodGhpcy5fdHJpZ2dlcktleUhhbmRsZXIoRCxCLEMpLEMuZGVmYXVsdFByZXZlbnRlZCkpYnJlYWt9fSxfdHJpZ2dlcktleUhhbmRsZXI6ZnVuY3Rpb24odyxDLEYpe3ZhciBEPU9iamVjdC5jcmVhdGUodyk7RC5rZXlib2FyZEV2ZW50PUY7dz1uZXcgQ3VzdG9tRXZlbnQody5ldmVudCx7ZGV0YWlsOkQsY2FuY2VsYWJsZTohMH0pO3RoaXNbQ10uY2FsbCh0aGlzLHcpO3cuZGVmYXVsdFByZXZlbnRlZCYmRi5wcmV2ZW50RGVmYXVsdCgpfX19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYmVoYXZpb3JzL2lyb24tY29udHJvbC1zdGF0ZS5odG1sLmpzClBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZT17cHJvcGVydGllczp7Zm9jdXNlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLG9ic2VydmVyOiJfZGlzYWJsZWRDaGFuZ2VkIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9vbGRUYWJJbmRleDp7dHlwZTpTdHJpbmd9LF9ib3VuZEZvY3VzQmx1ckhhbmRsZXI6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZm9jdXNCbHVySGFuZGxlci5iaW5kKHRoaXMpfX0sX19oYW5kbGVFdmVudFJldGFyZ2V0aW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5zaGFkb3dSb290JiYhUG9seW1lci5FbGVtZW50fX19LG9ic2VydmVyczpbIl9jaGFuZ2VkQ29udHJvbFN0YXRlKGZvY3VzZWQsIGRpc2FibGVkKSJdLHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsCnRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwhMCk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9ib3VuZEZvY3VzQmx1ckhhbmRsZXIsITApfSxfZm9jdXNCbHVySGFuZGxlcjpmdW5jdGlvbihiKXtpZihQb2x5bWVyLkVsZW1lbnQpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09Yi50eXBlKTtlbHNlIGlmKGIudGFyZ2V0PT09dGhpcyl0aGlzLl9zZXRGb2N1c2VkKCJmb2N1cyI9PT1iLnR5cGUpO2Vsc2UgaWYodGhpcy5fX2hhbmRsZUV2ZW50UmV0YXJnZXRpbmcpe3ZhciBkPVBvbHltZXIuZG9tKGIpLmxvY2FsVGFyZ2V0O3RoaXMuaXNMaWdodERlc2NlbmRhbnQoZCl8fHRoaXMuZmlyZShiLnR5cGUse3NvdXJjZUV2ZW50OmJ9LHtub2RlOnRoaXMsYnViYmxlczpiLmJ1YmJsZXMsY2FuY2VsYWJsZTpiLmNhbmNlbGFibGV9KX19LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLGI/InRydWUiOiJmYWxzZSIpOwp0aGlzLnN0eWxlLnBvaW50ZXJFdmVudHM9Yj8ibm9uZSI6IiI7Yj8odGhpcy5fb2xkVGFiSW5kZXg9dGhpcy5nZXRBdHRyaWJ1dGUoInRhYmluZGV4IiksdGhpcy5fc2V0Rm9jdXNlZCghMSksdGhpcy50YWJJbmRleD0tMSx0aGlzLmJsdXIoKSk6dm9pZCAwIT09dGhpcy5fb2xkVGFiSW5kZXgmJihudWxsPT09dGhpcy5fb2xkVGFiSW5kZXg/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoInRhYmluZGV4Iik6dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4Iix0aGlzLl9vbGRUYWJJbmRleCkpfSxfY2hhbmdlZENvbnRyb2xTdGF0ZTpmdW5jdGlvbigpe3RoaXMuX2NvbnRyb2xTdGF0ZUNoYW5nZWQmJnRoaXMuX2NvbnRyb2xTdGF0ZUNoYW5nZWQoKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYmVoYXZpb3JzL2lyb24tYnV0dG9uLXN0YXRlLmh0bWwuanMKUG9seW1lci5Jcm9uQnV0dG9uU3RhdGVJbXBsPXtwcm9wZXJ0aWVzOntwcmVzc2VkOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfcHJlc3NlZENoYW5nZWQifSx0b2dnbGVzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxhY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxwb2ludGVyRG93bjp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHZhbHVlOiExfSxyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITB9LGFyaWFBY3RpdmVBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJhcmlhLXByZXNzZWQiLG9ic2VydmVyOiJfYXJpYUFjdGl2ZUF0dHJpYnV0ZUNoYW5nZWQifX0sbGlzdGVuZXJzOntkb3duOiJfZG93bkhhbmRsZXIiLHVwOiJfdXBIYW5kbGVyIix0YXA6Il90YXBIYW5kbGVyIn0sCm9ic2VydmVyczpbIl9mb2N1c0NoYW5nZWQoZm9jdXNlZCkiLCJfYWN0aXZlQ2hhbmdlZChhY3RpdmUsIGFyaWFBY3RpdmVBdHRyaWJ1dGUpIl0sa2V5QmluZGluZ3M6eyJlbnRlcjprZXlkb3duIjoiX2FzeW5jQ2xpY2siLCJzcGFjZTprZXlkb3duIjoiX3NwYWNlS2V5RG93bkhhbmRsZXIiLCJzcGFjZTprZXl1cCI6Il9zcGFjZUtleVVwSGFuZGxlciJ9LF9tb3VzZUV2ZW50UmU6L15tb3VzZS8sX3RhcEhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZXM/dGhpcy5fdXNlckFjdGl2YXRlKCF0aGlzLmFjdGl2ZSk6dGhpcy5hY3RpdmU9ITF9LF9mb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fZGV0ZWN0S2V5Ym9hcmRGb2N1cyhiKTtifHx0aGlzLl9zZXRQcmVzc2VkKCExKX0sX2RldGVjdEtleWJvYXJkRm9jdXM6ZnVuY3Rpb24oYil7dGhpcy5fc2V0UmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCghdGhpcy5wb2ludGVyRG93biYmYil9LF91c2VyQWN0aXZhdGU6ZnVuY3Rpb24oYil7dGhpcy5hY3RpdmUhPT0KYiYmKHRoaXMuYWN0aXZlPWIsdGhpcy5maXJlKCJjaGFuZ2UiKSl9LF9kb3duSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX3NldFBvaW50ZXJEb3duKCEwKTt0aGlzLl9zZXRQcmVzc2VkKCEwKTt0aGlzLl9zZXRSZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKCExKX0sX3VwSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX3NldFBvaW50ZXJEb3duKCExKTt0aGlzLl9zZXRQcmVzc2VkKCExKX0sX3NwYWNlS2V5RG93bkhhbmRsZXI6ZnVuY3Rpb24oYil7Yj1iLmRldGFpbC5rZXlib2FyZEV2ZW50O3ZhciBkPVBvbHltZXIuZG9tKGIpLmxvY2FsVGFyZ2V0O3RoaXMuaXNMaWdodERlc2NlbmRhbnQoZCl8fChiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLl9zZXRQcmVzc2VkKCEwKSl9LF9zcGFjZUtleVVwSGFuZGxlcjpmdW5jdGlvbihiKXtiPVBvbHltZXIuZG9tKGIuZGV0YWlsLmtleWJvYXJkRXZlbnQpLmxvY2FsVGFyZ2V0O3RoaXMuaXNMaWdodERlc2NlbmRhbnQoYil8fAoodGhpcy5wcmVzc2VkJiZ0aGlzLl9hc3luY0NsaWNrKCksdGhpcy5fc2V0UHJlc3NlZCghMSkpfSxfYXN5bmNDbGljazpmdW5jdGlvbigpe3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmNsaWNrKCl9LDEpfSxfcHJlc3NlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2FyaWFBY3RpdmVBdHRyaWJ1dGVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmZCE9YiYmdGhpcy5oYXNBdHRyaWJ1dGUoZCkmJnRoaXMucmVtb3ZlQXR0cmlidXRlKGQpfSxfYWN0aXZlQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnRvZ2dsZXM/dGhpcy5zZXRBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlLGI/InRydWUiOiJmYWxzZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKHRoaXMuYXJpYUFjdGl2ZUF0dHJpYnV0ZSk7dGhpcy5fY2hhbmdlZEJ1dHRvblN0YXRlKCl9LF9jb250cm9sU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD90aGlzLl9zZXRQcmVzc2VkKCExKToKdGhpcy5fY2hhbmdlZEJ1dHRvblN0YXRlKCl9LF9jaGFuZ2VkQnV0dG9uU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLl9idXR0b25TdGF0ZUNoYW5nZWQmJnRoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCgpfX07UG9seW1lci5Jcm9uQnV0dG9uU3RhdGU9W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uQnV0dG9uU3RhdGVJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yaXBwbGUvcGFwZXItcmlwcGxlLmh0bWwuanMKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihoKXt0aGlzLmVsZW1lbnQ9aDt0aGlzLndpZHRoPXRoaXMuYm91bmRpbmdSZWN0LndpZHRoO3RoaXMuaGVpZ2h0PXRoaXMuYm91bmRpbmdSZWN0LmhlaWdodDt0aGlzLnNpemU9TWF0aC5tYXgodGhpcy53aWR0aCx0aGlzLmhlaWdodCl9ZnVuY3Rpb24gZChoKXt0aGlzLmVsZW1lbnQ9aDt0aGlzLmNvbG9yPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGgpLmNvbG9yO3RoaXMud2F2ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLndhdmVDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy53YXZlLnN0eWxlLmJhY2tncm91bmRDb2xvcj10aGlzLmNvbG9yO3RoaXMud2F2ZS5jbGFzc0xpc3QuYWRkKCJ3YXZlIik7dGhpcy53YXZlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoIndhdmUtY29udGFpbmVyIik7UG9seW1lci5kb20odGhpcy53YXZlQ29udGFpbmVyKS5hcHBlbmRDaGlsZCh0aGlzLndhdmUpO3RoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCl9CnZhciBmPXtkaXN0YW5jZTpmdW5jdGlvbihoLGssdCxsKXtoLT10O2stPWw7cmV0dXJuIE1hdGguc3FydChoKmgrayprKX0sbm93OndpbmRvdy5wZXJmb3JtYW5jZSYmd2luZG93LnBlcmZvcm1hbmNlLm5vdz93aW5kb3cucGVyZm9ybWFuY2Uubm93LmJpbmQod2luZG93LnBlcmZvcm1hbmNlKTpEYXRlLm5vd307Yi5wcm90b3R5cGU9e2dldCBib3VuZGluZ1JlY3QoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSxmdXJ0aGVzdENvcm5lckRpc3RhbmNlRnJvbTpmdW5jdGlvbihoLGspe3ZhciB0PWYuZGlzdGFuY2UoaCxrLDAsMCksbD1mLmRpc3RhbmNlKGgsayx0aGlzLndpZHRoLDApLHA9Zi5kaXN0YW5jZShoLGssMCx0aGlzLmhlaWdodCk7aD1mLmRpc3RhbmNlKGgsayx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtyZXR1cm4gTWF0aC5tYXgodCxsLHAsaCl9fTtkLk1BWF9SQURJVVM9MzAwO2QucHJvdG90eXBlPXtnZXQgcmVjZW50ZXJzKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5yZWNlbnRlcnN9LApnZXQgY2VudGVyKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5jZW50ZXJ9LGdldCBtb3VzZURvd25FbGFwc2VkKCl7aWYoIXRoaXMubW91c2VEb3duU3RhcnQpcmV0dXJuIDA7dmFyIGg9Zi5ub3coKS10aGlzLm1vdXNlRG93blN0YXJ0O3RoaXMubW91c2VVcFN0YXJ0JiYoaC09dGhpcy5tb3VzZVVwRWxhcHNlZCk7cmV0dXJuIGh9LGdldCBtb3VzZVVwRWxhcHNlZCgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD9mLm5vdygpLXRoaXMubW91c2VVcFN0YXJ0OjB9LGdldCBtb3VzZURvd25FbGFwc2VkU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlRG93bkVsYXBzZWQvMUUzfSxnZXQgbW91c2VVcEVsYXBzZWRTZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VVcEVsYXBzZWQvMUUzfSxnZXQgbW91c2VJbnRlcmFjdGlvblNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZURvd25FbGFwc2VkU2Vjb25kcyt0aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kc30sZ2V0IGluaXRpYWxPcGFjaXR5KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5pbml0aWFsT3BhY2l0eX0sCmdldCBvcGFjaXR5RGVjYXlWZWxvY2l0eSgpe3JldHVybiB0aGlzLmVsZW1lbnQub3BhY2l0eURlY2F5VmVsb2NpdHl9LGdldCByYWRpdXMoKXt2YXIgaD0xLjEqTWF0aC5taW4oTWF0aC5zcXJ0KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgrdGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodCp0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KSxkLk1BWF9SQURJVVMpKzU7cmV0dXJuIE1hdGguYWJzKGgqKDEtTWF0aC5wb3coODAsLSh0aGlzLm1vdXNlSW50ZXJhY3Rpb25TZWNvbmRzLygxLjEtaC9kLk1BWF9SQURJVVMqLjIpKSkpKX0sZ2V0IG9wYWNpdHkoKXtyZXR1cm4gdGhpcy5tb3VzZVVwU3RhcnQ/TWF0aC5tYXgoMCx0aGlzLmluaXRpYWxPcGFjaXR5LXRoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzKnRoaXMub3BhY2l0eURlY2F5VmVsb2NpdHkpOnRoaXMuaW5pdGlhbE9wYWNpdHl9LGdldCBvdXRlck9wYWNpdHkoKXtyZXR1cm4gTWF0aC5tYXgoMCwKTWF0aC5taW4oLjMqdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHMsdGhpcy5vcGFjaXR5KSl9LGdldCBpc09wYWNpdHlGdWxseURlY2F5ZWQoKXtyZXR1cm4uMDE+dGhpcy5vcGFjaXR5JiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsZC5NQVhfUkFESVVTKX0sZ2V0IGlzUmVzdGluZ0F0TWF4UmFkaXVzKCl7cmV0dXJuIHRoaXMub3BhY2l0eT49dGhpcy5pbml0aWFsT3BhY2l0eSYmdGhpcy5yYWRpdXM+PU1hdGgubWluKHRoaXMubWF4UmFkaXVzLGQuTUFYX1JBRElVUyl9LGdldCBpc0FuaW1hdGlvbkNvbXBsZXRlKCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P3RoaXMuaXNPcGFjaXR5RnVsbHlEZWNheWVkOnRoaXMuaXNSZXN0aW5nQXRNYXhSYWRpdXN9LGdldCB0cmFuc2xhdGlvbkZyYWN0aW9uKCl7cmV0dXJuIE1hdGgubWluKDEsdGhpcy5yYWRpdXMvdGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUqMi9NYXRoLnNxcnQoMikpfSxnZXQgeE5vdygpe3JldHVybiB0aGlzLnhFbmQ/CnRoaXMueFN0YXJ0K3RoaXMudHJhbnNsYXRpb25GcmFjdGlvbioodGhpcy54RW5kLXRoaXMueFN0YXJ0KTp0aGlzLnhTdGFydH0sZ2V0IHlOb3coKXtyZXR1cm4gdGhpcy55RW5kP3RoaXMueVN0YXJ0K3RoaXMudHJhbnNsYXRpb25GcmFjdGlvbioodGhpcy55RW5kLXRoaXMueVN0YXJ0KTp0aGlzLnlTdGFydH0sZ2V0IGlzTW91c2VEb3duKCl7cmV0dXJuIHRoaXMubW91c2VEb3duU3RhcnQmJiF0aGlzLm1vdXNlVXBTdGFydH0scmVzZXRJbnRlcmFjdGlvblN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5zbGlkZURpc3RhbmNlPXRoaXMueUVuZD10aGlzLnhFbmQ9dGhpcy55U3RhcnQ9dGhpcy54U3RhcnQ9dGhpcy5tb3VzZVVwU3RhcnQ9dGhpcy5tb3VzZURvd25TdGFydD10aGlzLm1heFJhZGl1cz0wO3RoaXMuY29udGFpbmVyTWV0cmljcz1uZXcgYih0aGlzLmVsZW1lbnQpfSxkcmF3OmZ1bmN0aW9uKCl7dGhpcy53YXZlLnN0eWxlLm9wYWNpdHk9dGhpcy5vcGFjaXR5O3ZhciBoPXRoaXMucmFkaXVzLwoodGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUvMik7dmFyIGs9dGhpcy54Tm93LXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yO3ZhciB0PXRoaXMueU5vdy10aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LzI7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0idHJhbnNsYXRlKCIraysicHgsICIrdCsicHgpIjt0aGlzLndhdmVDb250YWluZXIuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgiK2srInB4LCAiK3QrInB4LCAwKSI7dGhpcy53YXZlLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0ic2NhbGUoIitoKyIsIitoKyIpIjt0aGlzLndhdmUuc3R5bGUudHJhbnNmb3JtPSJzY2FsZTNkKCIraCsiLCIraCsiLDEpIn0sZG93bkFjdGlvbjpmdW5jdGlvbihoKXt2YXIgaz10aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMix0PXRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMjt0aGlzLnJlc2V0SW50ZXJhY3Rpb25TdGF0ZSgpO3RoaXMubW91c2VEb3duU3RhcnQ9CmYubm93KCk7dGhpcy5jZW50ZXI/KHRoaXMueFN0YXJ0PWssdGhpcy55U3RhcnQ9dCx0aGlzLnNsaWRlRGlzdGFuY2U9Zi5kaXN0YW5jZSh0aGlzLnhTdGFydCx0aGlzLnlTdGFydCx0aGlzLnhFbmQsdGhpcy55RW5kKSk6KHRoaXMueFN0YXJ0PWg/aC5kZXRhaWwueC10aGlzLmNvbnRhaW5lck1ldHJpY3MuYm91bmRpbmdSZWN0LmxlZnQ6dGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzIsdGhpcy55U3RhcnQ9aD9oLmRldGFpbC55LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QudG9wOnRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMik7dGhpcy5yZWNlbnRlcnMmJih0aGlzLnhFbmQ9ayx0aGlzLnlFbmQ9dCx0aGlzLnNsaWRlRGlzdGFuY2U9Zi5kaXN0YW5jZSh0aGlzLnhTdGFydCx0aGlzLnlTdGFydCx0aGlzLnhFbmQsdGhpcy55RW5kKSk7dGhpcy5tYXhSYWRpdXM9dGhpcy5jb250YWluZXJNZXRyaWNzLmZ1cnRoZXN0Q29ybmVyRGlzdGFuY2VGcm9tKHRoaXMueFN0YXJ0LAp0aGlzLnlTdGFydCk7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLnRvcD0odGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0PSh0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgtdGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUpLzIrInB4Ijt0aGlzLndhdmVDb250YWluZXIuc3R5bGUud2lkdGg9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4Ijt0aGlzLndhdmVDb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKyJweCJ9LHVwQWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc01vdXNlRG93biYmKHRoaXMubW91c2VVcFN0YXJ0PWYubm93KCkpfSxyZW1vdmU6ZnVuY3Rpb24oKXtQb2x5bWVyLmRvbSh0aGlzLndhdmVDb250YWluZXIucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcy53YXZlQ29udGFpbmVyKX19O1BvbHltZXIoe2lzOiJwYXBlci1yaXBwbGUiLApiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3JdLHByb3BlcnRpZXM6e2luaXRpYWxPcGFjaXR5Ont0eXBlOk51bWJlcix2YWx1ZTouMjV9LG9wYWNpdHlEZWNheVZlbG9jaXR5Ont0eXBlOk51bWJlcix2YWx1ZTouOH0scmVjZW50ZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNlbnRlcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyaXBwbGVzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxhbmltYXRpbmc6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LGhvbGREb3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ob2xkRG93bkNoYW5nZWQifSxub2luazp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfYW5pbWF0aW5nOnt0eXBlOkJvb2xlYW59LF9ib3VuZEFuaW1hdGU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmltYXRlLmJpbmQodGhpcyl9fX0sCmdldCB0YXJnZXQoKXtyZXR1cm4gdGhpcy5rZXlFdmVudFRhcmdldH0sa2V5QmluZGluZ3M6eyJlbnRlcjprZXlkb3duIjoiX29uRW50ZXJLZXlkb3duIiwic3BhY2U6a2V5ZG93biI6Il9vblNwYWNlS2V5ZG93biIsInNwYWNlOmtleXVwIjoiX29uU3BhY2VLZXl1cCJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5rZXlFdmVudFRhcmdldD0xMT09dGhpcy5wYXJlbnROb2RlLm5vZGVUeXBlP1BvbHltZXIuZG9tKHRoaXMpLmdldE93bmVyUm9vdCgpLmhvc3Q6dGhpcy5wYXJlbnROb2RlO3RoaXMubGlzdGVuKGgsInVwIiwidWlVcEFjdGlvbiIpO3RoaXMubGlzdGVuKGgsImRvd24iLCJ1aURvd25BY3Rpb24iKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMua2V5RXZlbnRUYXJnZXQsInVwIiwidWlVcEFjdGlvbiIpO3RoaXMudW5saXN0ZW4odGhpcy5rZXlFdmVudFRhcmdldCwiZG93biIsInVpRG93bkFjdGlvbiIpO3RoaXMua2V5RXZlbnRUYXJnZXQ9Cm51bGx9LGdldCBzaG91bGRLZWVwQW5pbWF0aW5nKCl7Zm9yKHZhciBoPTA7aDx0aGlzLnJpcHBsZXMubGVuZ3RoOysraClpZighdGhpcy5yaXBwbGVzW2hdLmlzQW5pbWF0aW9uQ29tcGxldGUpcmV0dXJuITA7cmV0dXJuITF9LHNpbXVsYXRlZFJpcHBsZTpmdW5jdGlvbigpe3RoaXMuZG93bkFjdGlvbihudWxsKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy51cEFjdGlvbigpfSwxKX0sdWlEb3duQWN0aW9uOmZ1bmN0aW9uKGgpe3RoaXMubm9pbmt8fHRoaXMuZG93bkFjdGlvbihoKX0sZG93bkFjdGlvbjpmdW5jdGlvbihoKXt0aGlzLmhvbGREb3duJiYwPHRoaXMucmlwcGxlcy5sZW5ndGh8fCh0aGlzLmFkZFJpcHBsZSgpLmRvd25BY3Rpb24oaCksdGhpcy5fYW5pbWF0aW5nfHwodGhpcy5fYW5pbWF0aW5nPSEwLHRoaXMuYW5pbWF0ZSgpKSl9LHVpVXBBY3Rpb246ZnVuY3Rpb24oaCl7dGhpcy5ub2lua3x8dGhpcy51cEFjdGlvbihoKX0sdXBBY3Rpb246ZnVuY3Rpb24oaCl7dGhpcy5ob2xkRG93bnx8Cih0aGlzLnJpcHBsZXMuZm9yRWFjaChmdW5jdGlvbihrKXtrLnVwQWN0aW9uKGgpfSksdGhpcy5fYW5pbWF0aW5nPSEwLHRoaXMuYW5pbWF0ZSgpKX0sb25BbmltYXRpb25Db21wbGV0ZTpmdW5jdGlvbigpe3RoaXMuX2FuaW1hdGluZz0hMTt0aGlzLiQuYmFja2dyb3VuZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9bnVsbDt0aGlzLmZpcmUoInRyYW5zaXRpb25lbmQiKX0sYWRkUmlwcGxlOmZ1bmN0aW9uKCl7dmFyIGg9bmV3IGQodGhpcyk7UG9seW1lci5kb20odGhpcy4kLndhdmVzKS5hcHBlbmRDaGlsZChoLndhdmVDb250YWluZXIpO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj1oLmNvbG9yO3RoaXMucmlwcGxlcy5wdXNoKGgpO3RoaXMuX3NldEFuaW1hdGluZyghMCk7cmV0dXJuIGh9LHJlbW92ZVJpcHBsZTpmdW5jdGlvbihoKXt2YXIgaz10aGlzLnJpcHBsZXMuaW5kZXhPZihoKTswPmt8fCh0aGlzLnJpcHBsZXMuc3BsaWNlKGssMSksaC5yZW1vdmUoKSwKdGhpcy5yaXBwbGVzLmxlbmd0aHx8dGhpcy5fc2V0QW5pbWF0aW5nKCExKSl9LGFuaW1hdGU6ZnVuY3Rpb24oKXtpZih0aGlzLl9hbmltYXRpbmcpe3ZhciBoO2ZvcihoPTA7aDx0aGlzLnJpcHBsZXMubGVuZ3RoOysraCl7dmFyIGs9dGhpcy5yaXBwbGVzW2hdO2suZHJhdygpO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLm9wYWNpdHk9ay5vdXRlck9wYWNpdHk7ay5pc09wYWNpdHlGdWxseURlY2F5ZWQmJiFrLmlzUmVzdGluZ0F0TWF4UmFkaXVzJiZ0aGlzLnJlbW92ZVJpcHBsZShrKX1pZih0aGlzLnNob3VsZEtlZXBBbmltYXRpbmd8fDAhPT10aGlzLnJpcHBsZXMubGVuZ3RoKXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fYm91bmRBbmltYXRlKTtlbHNlIHRoaXMub25BbmltYXRpb25Db21wbGV0ZSgpfX0sX29uRW50ZXJLZXlkb3duOmZ1bmN0aW9uKCl7dGhpcy51aURvd25BY3Rpb24oKTt0aGlzLmFzeW5jKHRoaXMudWlVcEFjdGlvbiwxKX0sX29uU3BhY2VLZXlkb3duOmZ1bmN0aW9uKCl7dGhpcy51aURvd25BY3Rpb24oKX0sCl9vblNwYWNlS2V5dXA6ZnVuY3Rpb24oKXt0aGlzLnVpVXBBY3Rpb24oKX0sX2hvbGREb3duQ2hhbmdlZDpmdW5jdGlvbihoLGspe3ZvaWQgMCE9PWsmJihoP3RoaXMuZG93bkFjdGlvbigpOnRoaXMudXBBY3Rpb24oKSl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJlaGF2aW9ycy9wYXBlci1yaXBwbGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxfcmlwcGxlQ29udGFpbmVyOnt0eXBlOk9iamVjdH19LF9idXR0b25TdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZvY3VzZWQmJnRoaXMuZW5zdXJlUmlwcGxlKCl9LF9kb3duSGFuZGxlcjpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGwuX2Rvd25IYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLnByZXNzZWQmJnRoaXMuZW5zdXJlUmlwcGxlKGIpfSxlbnN1cmVSaXBwbGU6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGFzUmlwcGxlKCkpe3RoaXMuX3JpcHBsZT10aGlzLl9jcmVhdGVSaXBwbGUoKTt0aGlzLl9yaXBwbGUubm9pbms9dGhpcy5ub2luazt2YXIgZD10aGlzLl9yaXBwbGVDb250YWluZXJ8fHRoaXMucm9vdDtkJiZQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZCh0aGlzLl9yaXBwbGUpO2lmKGIpe2Q9ClBvbHltZXIuZG9tKHRoaXMuX3JpcHBsZUNvbnRhaW5lcnx8dGhpcyk7dmFyIGY9UG9seW1lci5kb20oYikucm9vdFRhcmdldDtkLmRlZXBDb250YWlucyhmKSYmdGhpcy5fcmlwcGxlLnVpRG93bkFjdGlvbihiKX19fSxnZXRSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLmVuc3VyZVJpcHBsZSgpO3JldHVybiB0aGlzLl9yaXBwbGV9LGhhc1JpcHBsZTpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fcmlwcGxlfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLXJpcHBsZSIpfSxfbm9pbmtDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUubm9pbms9Yil9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1iZWhhdmlvcnMvcGFwZXItYnV0dG9uLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7ZWxldmF0aW9uOnt0eXBlOk51bWJlcixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITB9fSxvYnNlcnZlcnM6WyJfY2FsY3VsYXRlRWxldmF0aW9uKGZvY3VzZWQsIGRpc2FibGVkLCBhY3RpdmUsIHByZXNzZWQsIHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIiwiX2NvbXB1dGVLZXlib2FyZENsYXNzKHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAiLGFuaW1hdGVkOiEwfSxfY2FsY3VsYXRlRWxldmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9MTt0aGlzLmRpc2FibGVkP2I9MDp0aGlzLmFjdGl2ZXx8dGhpcy5wcmVzc2VkP2I9NDp0aGlzLnJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQmJihiPTMpO3RoaXMuX3NldEVsZXZhdGlvbihiKX0sX2NvbXB1dGVLZXlib2FyZENsYXNzOmZ1bmN0aW9uKGIpe3RoaXMudG9nZ2xlQ2xhc3MoImtleWJvYXJkLWZvY3VzIiwKYil9LF9zcGFjZUtleURvd25IYW5kbGVyOmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fc3BhY2VLZXlEb3duSGFuZGxlci5jYWxsKHRoaXMsYik7dGhpcy5oYXNSaXBwbGUoKSYmMT50aGlzLmdldFJpcHBsZSgpLnJpcHBsZXMubGVuZ3RoJiZ0aGlzLl9yaXBwbGUudWlEb3duQWN0aW9uKCl9LF9zcGFjZUtleVVwSGFuZGxlcjpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGwuX3NwYWNlS2V5VXBIYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLmhhc1JpcHBsZSgpJiZ0aGlzLl9yaXBwbGUudWlVcEFjdGlvbigpfX07UG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLFBvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJ1dHRvbi9wYXBlci1idXR0b24uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvcl0scHJvcGVydGllczp7cmFpc2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExLG9ic2VydmVyOiJfY2FsY3VsYXRlRWxldmF0aW9uIn19LF9jYWxjdWxhdGVFbGV2YXRpb246ZnVuY3Rpb24oKXt0aGlzLnJhaXNlZD9Qb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3JJbXBsLl9jYWxjdWxhdGVFbGV2YXRpb24uYXBwbHkodGhpcyk6dGhpcy5fc2V0RWxldmF0aW9uKDApfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWV0YS9pcm9uLW1ldGEuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyLklyb25NZXRhPWZ1bmN0aW9uKGQpe1BvbHltZXIuSXJvbk1ldGFbIiAiXShkKTt0aGlzLnR5cGU9ZCYmZC50eXBlfHwiZGVmYXVsdCI7dGhpcy5rZXk9ZCYmZC5rZXk7ZCYmInZhbHVlImluIGQmJih0aGlzLnZhbHVlPWQudmFsdWUpfTtQb2x5bWVyLklyb25NZXRhWyIgIl09ZnVuY3Rpb24oKXt9O1BvbHltZXIuSXJvbk1ldGEudHlwZXM9e307UG9seW1lci5Jcm9uTWV0YS5wcm90b3R5cGU9e2dldCB2YWx1ZSgpe3ZhciBkPXRoaXMudHlwZSxmPXRoaXMua2V5O2lmKGQmJmYpcmV0dXJuIFBvbHltZXIuSXJvbk1ldGEudHlwZXNbZF0mJlBvbHltZXIuSXJvbk1ldGEudHlwZXNbZF1bZl19LHNldCB2YWx1ZShkKXt2YXIgZj10aGlzLnR5cGUsaD10aGlzLmtleTtmJiZoJiYoZj1Qb2x5bWVyLklyb25NZXRhLnR5cGVzW2ZdPVBvbHltZXIuSXJvbk1ldGEudHlwZXNbZl18fHt9LG51bGw9PWQ/ZGVsZXRlIGZbaF06ZltoXT1kKX0sZ2V0IGxpc3QoKXtpZih0aGlzLnR5cGUpe3ZhciBkPQpQb2x5bWVyLklyb25NZXRhLnR5cGVzW3RoaXMudHlwZV07cmV0dXJuIGQ/T2JqZWN0LmtleXMoZCkubWFwKGZ1bmN0aW9uKGYpe3JldHVybiBiW3RoaXMudHlwZV1bZl19LHRoaXMpOltdfX0sYnlLZXk6ZnVuY3Rpb24oZCl7dGhpcy5rZXk9ZDtyZXR1cm4gdGhpcy52YWx1ZX19O3ZhciBiPVBvbHltZXIuSXJvbk1ldGEudHlwZXM7UG9seW1lcih7aXM6Imlyb24tbWV0YSIscHJvcGVydGllczp7dHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImRlZmF1bHQifSxrZXk6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxmOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9zZWxmQ2hhbmdlZCJ9LF9fbWV0YTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfX2NvbXB1dGVNZXRhKHR5cGUsIGtleSwgdmFsdWUpIn19LGhvc3RBdHRyaWJ1dGVzOntoaWRkZW46ITB9LF9fY29tcHV0ZU1ldGE6ZnVuY3Rpb24oZCxmLGgpe2Q9bmV3IFBvbHltZXIuSXJvbk1ldGEoe3R5cGU6ZCwKa2V5OmZ9KTt2b2lkIDAhPT1oJiZoIT09ZC52YWx1ZT9kLnZhbHVlPWg6dGhpcy52YWx1ZSE9PWQudmFsdWUmJih0aGlzLnZhbHVlPWQudmFsdWUpO3JldHVybiBkfSxnZXQgbGlzdCgpe3JldHVybiB0aGlzLl9fbWV0YSYmdGhpcy5fX21ldGEubGlzdH0sX3NlbGZDaGFuZ2VkOmZ1bmN0aW9uKGQpe2QmJih0aGlzLnZhbHVlPXRoaXMpfSxieUtleTpmdW5jdGlvbihkKXtyZXR1cm4obmV3IFBvbHltZXIuSXJvbk1ldGEoe3R5cGU6dGhpcy50eXBlLGtleTpkfSkpLnZhbHVlfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXZhbGlkYXRhYmxlLWJlaGF2aW9yL2lyb24tdmFsaWRhdGFibGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YT1udWxsOwpQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnt2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxpbnZhbGlkOntub3RpZnk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2ludmFsaWRDaGFuZ2VkIn19LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YT1uZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZToidmFsaWRhdG9yIn0pfSxfaW52YWxpZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmludmFsaWQ/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIsInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIil9LGdldCBfdmFsaWRhdG9yKCl7cmV0dXJuIFBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhJiZQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YS5ieUtleSh0aGlzLnZhbGlkYXRvcil9LGhhc1ZhbGlkYXRvcjpmdW5jdGlvbigpe3JldHVybiBudWxsIT0KdGhpcy5fdmFsaWRhdG9yfSx2YWxpZGF0ZTpmdW5jdGlvbihiKXt0aGlzLmludmFsaWQ9dm9pZCAwPT09YiYmdm9pZCAwIT09dGhpcy52YWx1ZT8hdGhpcy5fZ2V0VmFsaWRpdHkodGhpcy52YWx1ZSk6IXRoaXMuX2dldFZhbGlkaXR5KGIpO3JldHVybiF0aGlzLmludmFsaWR9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5oYXNWYWxpZGF0b3IoKT90aGlzLl92YWxpZGF0b3IudmFsaWRhdGUoYik6ITB9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWZvcm0tZWxlbWVudC1iZWhhdmlvci9pcm9uLWZvcm0tZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3I9e3Byb3BlcnRpZXM6e25hbWU6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfcGFyZW50Rm9ybTp7dHlwZTpPYmplY3R9fSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuRWxlbWVudHx8dGhpcy5maXJlKCJpcm9uLWZvcm0tZWxlbWVudC1yZWdpc3RlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpeyFQb2x5bWVyLkVsZW1lbnQmJnRoaXMuX3BhcmVudEZvcm0mJnRoaXMuX3BhcmVudEZvcm0uZmlyZSgiaXJvbi1mb3JtLWVsZW1lbnQtdW5yZWdpc3RlciIse3RhcmdldDp0aGlzfSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWNoZWNrZWQtZWxlbWVudC1iZWhhdmlvci9pcm9uLWNoZWNrZWQtZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntjaGVja2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG5vdGlmeTohMCxvYnNlcnZlcjoiX2NoZWNrZWRDaGFuZ2VkIn0sdG9nZ2xlczp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvbiIsb2JzZXJ2ZXI6Il92YWx1ZUNoYW5nZWQifX0sb2JzZXJ2ZXJzOlsiX3JlcXVpcmVkQ2hhbmdlZChyZXF1aXJlZCkiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5faGFzSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3I9ITB9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5yZXF1aXJlZHx8dGhpcy5jaGVja2VkfSxfcmVxdWlyZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5yZXF1aXJlZD90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIsCiJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtcmVxdWlyZWQiKX0sX2NoZWNrZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmU9dGhpcy5jaGVja2VkO3RoaXMuZmlyZSgiaXJvbi1jaGFuZ2UiKX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMudmFsdWV8fG51bGw9PT10aGlzLnZhbHVlKXRoaXMudmFsdWU9Im9uIn19O1BvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3I9W1BvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3IsUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25DaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLWlua3ktZm9jdXMtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsPXtvYnNlcnZlcnM6WyJfZm9jdXNlZENoYW5nZWQocmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiXSxfZm9jdXNlZENoYW5nZWQ6ZnVuY3Rpb24oYil7YiYmdGhpcy5lbnN1cmVSaXBwbGUoKTt0aGlzLmhhc1JpcHBsZSgpJiYodGhpcy5fcmlwcGxlLmhvbGREb3duPWIpfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dmFyIGI9UG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLl9jcmVhdGVSaXBwbGUoKTtiLmlkPSJpbmsiO2Iuc2V0QXR0cmlidXRlKCJjZW50ZXIiLCIiKTtiLmNsYXNzTGlzdC5hZGQoImNpcmNsZSIpO3JldHVybiBifX07UG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLFBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJlaGF2aW9ycy9wYXBlci1jaGVja2VkLWVsZW1lbnQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGw9e19jaGVja2VkQ2hhbmdlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsLl9jaGVja2VkQ2hhbmdlZC5jYWxsKHRoaXMpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLmNoZWNrZWQ/dGhpcy5fcmlwcGxlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIiIpOnRoaXMuX3JpcHBsZS5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKSl9LF9idXR0b25TdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2J1dHRvblN0YXRlQ2hhbmdlZC5jYWxsKHRoaXMpOyF0aGlzLmRpc2FibGVkJiZ0aGlzLmlzQXR0YWNoZWQmJih0aGlzLmNoZWNrZWQ9dGhpcy5hY3RpdmUpfX07ClBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yPVtQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3IsUG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWNoZWNrYm94L3BhcGVyLWNoZWNrYm94Lmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWNoZWNrYm94IixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToiY2hlY2tib3giLCJhcmlhLWNoZWNrZWQiOiExLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e2FyaWFBY3RpdmVBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJhcmlhLWNoZWNrZWQifX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcyxmdW5jdGlvbigpe2lmKCItMXB4Ij09PXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUiKS50cmltKCkpe3ZhciBiPXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSIpLnRyaW0oKSxkPSJweCIsZj1iLm1hdGNoKC9bQS1aYS16XSskLyk7bnVsbCE9PWYmJihkPWZbMF0pO2I9cGFyc2VGbG9hdChiKTsKZj04LzMqYjsicHgiPT09ZCYmKGY9TWF0aC5mbG9vcihmKSxmJTIhPT1iJTImJmYrKyk7dGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNoZWNrYm94LWluay1zaXplIjpmK2R9KX19KX0sX2NvbXB1dGVDaGVja2JveENsYXNzOmZ1bmN0aW9uKGIsZCl7dmFyIGY9IiI7YiYmKGYrPSJjaGVja2VkICIpO2QmJihmKz0iaW52YWxpZCIpO3JldHVybiBmfSxfY29tcHV0ZUNoZWNrbWFya0NsYXNzOmZ1bmN0aW9uKGIpe3JldHVybiBiPyIiOiJoaWRkZW4ifSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5jaGVja2JveENvbnRhaW5lcjtyZXR1cm4gUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbC5fY3JlYXRlUmlwcGxlLmNhbGwodGhpcyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1pY29uL2lyb24taWNvbi5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWljb24iLHByb3BlcnRpZXM6e2ljb246e3R5cGU6U3RyaW5nfSx0aGVtZTp7dHlwZTpTdHJpbmd9LHNyYzp7dHlwZTpTdHJpbmd9LF9tZXRhOnt2YWx1ZTpQb2x5bWVyLkJhc2UuY3JlYXRlKCJpcm9uLW1ldGEiLHt0eXBlOiJpY29uc2V0In0pfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZUljb24oX21ldGEsIGlzQXR0YWNoZWQpIiwiX3VwZGF0ZUljb24odGhlbWUsIGlzQXR0YWNoZWQpIiwiX3NyY0NoYW5nZWQoc3JjLCBpc0F0dGFjaGVkKSIsIl9pY29uQ2hhbmdlZChpY29uLCBpc0F0dGFjaGVkKSJdLF9ERUZBVUxUX0lDT05TRVQ6Imljb25zIixfaWNvbkNoYW5nZWQ6ZnVuY3Rpb24oYil7Yj0oYnx8IiIpLnNwbGl0KCI6Iik7dGhpcy5faWNvbk5hbWU9Yi5wb3AoKTt0aGlzLl9pY29uc2V0TmFtZT1iLnBvcCgpfHx0aGlzLl9ERUZBVUxUX0lDT05TRVQ7dGhpcy5fdXBkYXRlSWNvbigpfSxfc3JjQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUljb24oKX0sCl91c2VzSWNvbnNldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmljb258fCF0aGlzLnNyY30sX3VwZGF0ZUljb246ZnVuY3Rpb24oKXt0aGlzLl91c2VzSWNvbnNldCgpPyh0aGlzLl9pbWcmJnRoaXMuX2ltZy5wYXJlbnROb2RlJiZQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnJlbW92ZUNoaWxkKHRoaXMuX2ltZyksIiI9PT10aGlzLl9pY29uTmFtZT90aGlzLl9pY29uc2V0JiZ0aGlzLl9pY29uc2V0LnJlbW92ZUljb24odGhpcyk6dGhpcy5faWNvbnNldE5hbWUmJnRoaXMuX21ldGEmJigodGhpcy5faWNvbnNldD10aGlzLl9tZXRhLmJ5S2V5KHRoaXMuX2ljb25zZXROYW1lKSk/KHRoaXMuX2ljb25zZXQuYXBwbHlJY29uKHRoaXMsdGhpcy5faWNvbk5hbWUsdGhpcy50aGVtZSksdGhpcy51bmxpc3Rlbih3aW5kb3csImlyb24taWNvbnNldC1hZGRlZCIsIl91cGRhdGVJY29uIikpOnRoaXMubGlzdGVuKHdpbmRvdywiaXJvbi1pY29uc2V0LWFkZGVkIiwiX3VwZGF0ZUljb24iKSkpOih0aGlzLl9pY29uc2V0JiYKdGhpcy5faWNvbnNldC5yZW1vdmVJY29uKHRoaXMpLHRoaXMuX2ltZ3x8KHRoaXMuX2ltZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSx0aGlzLl9pbWcuc3R5bGUud2lkdGg9IjEwMCUiLHRoaXMuX2ltZy5zdHlsZS5oZWlnaHQ9IjEwMCUiLHRoaXMuX2ltZy5kcmFnZ2FibGU9ITEpLHRoaXMuX2ltZy5zcmM9dGhpcy5zcmMsUG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZCh0aGlzLl9pbWcpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWExMXktYW5ub3VuY2VyL2lyb24tYTExeS1hbm5vdW5jZXIuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyPVBvbHltZXIoe2lzOiJpcm9uLWExMXktYW5ub3VuY2VyIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToicG9saXRlIn0sX3RleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sY3JlYXRlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2V8fChQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlPXRoaXMpO2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigiaXJvbi1hbm5vdW5jZSIsdGhpcy5fb25Jcm9uQW5ub3VuY2UuYmluZCh0aGlzKSl9LGFubm91bmNlOmZ1bmN0aW9uKGIpe3RoaXMuX3RleHQ9IiI7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX3RleHQ9Yn0sMTAwKX0sX29uSXJvbkFubm91bmNlOmZ1bmN0aW9uKGIpe2IuZGV0YWlsJiZiLmRldGFpbC50ZXh0JiZ0aGlzLmFubm91bmNlKGIuZGV0YWlsLnRleHQpfX0pOwpQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlPW51bGw7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5PWZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZXx8KFBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1hMTF5LWFubm91bmNlciIpKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKFBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2UpfX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1pbnB1dC9pcm9uLWlucHV0Lmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24taW5wdXQiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvcl0scHJvcGVydGllczp7YmluZFZhbHVlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVZhbHVlKGJpbmRWYWx1ZSkifSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5wdXRFbGVtZW50Ok9iamVjdH0sb2JzZXJ2ZXJzOlsiX2JpbmRWYWx1ZUNoYW5nZWQoYmluZFZhbHVlLCBfaW5wdXRFbGVtZW50KSJdLGxpc3RlbmVyczp7aW5wdXQ6Il9vbklucHV0IixrZXlwcmVzczoiX29uS2V5cHJlc3MifSxjcmVhdGVkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5KCk7dGhpcy5fcHJldmlvdXNWYWxpZElucHV0PSIiO3RoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0hMX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj0KUG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKGZ1bmN0aW9uKCl7dGhpcy5faW5pdFNsb3R0ZWRJbnB1dCgpfS5iaW5kKHRoaXMpKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmKFBvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKSx0aGlzLl9vYnNlcnZlcj1udWxsKX0sZ2V0IGlucHV0RWxlbWVudCgpe3JldHVybiB0aGlzLl9pbnB1dEVsZW1lbnR9LF9pbml0U2xvdHRlZElucHV0OmZ1bmN0aW9uKCl7dGhpcy5faW5wdXRFbGVtZW50PXRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGRyZW4oKVswXTt0aGlzLmlucHV0RWxlbWVudCYmdGhpcy5pbnB1dEVsZW1lbnQudmFsdWUmJih0aGlzLmJpbmRWYWx1ZT10aGlzLmlucHV0RWxlbWVudC52YWx1ZSk7dGhpcy5maXJlKCJpcm9uLWlucHV0LXJlYWR5Iil9LGdldCBfcGF0dGVyblJlZ0V4cCgpe2lmKHRoaXMuYWxsb3dlZFBhdHRlcm4pdmFyIGI9bmV3IFJlZ0V4cCh0aGlzLmFsbG93ZWRQYXR0ZXJuKTsKZWxzZSBzd2l0Y2godGhpcy5pbnB1dEVsZW1lbnQudHlwZSl7Y2FzZSAibnVtYmVyIjpiPS9bMC05LixlLV0vfXJldHVybiBifSxfYmluZFZhbHVlQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJih2b2lkIDA9PT1iP2QudmFsdWU9bnVsbDpiIT09ZC52YWx1ZSYmKHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlPWIpLHRoaXMuYXV0b1ZhbGlkYXRlJiZ0aGlzLnZhbGlkYXRlKCksdGhpcy5maXJlKCJiaW5kLXZhbHVlLWNoYW5nZWQiLHt2YWx1ZTpifSkpfSxfb25JbnB1dDpmdW5jdGlvbigpeyF0aGlzLmFsbG93ZWRQYXR0ZXJufHx0aGlzLl9wYXR0ZXJuQWxyZWFkeUNoZWNrZWR8fHRoaXMuX2NoZWNrUGF0dGVyblZhbGlkaXR5KCl8fCh0aGlzLl9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXIoIkludmFsaWQgc3RyaW5nIG9mIGNoYXJhY3RlcnMgbm90IGVudGVyZWQuIiksdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9dGhpcy5fcHJldmlvdXNWYWxpZElucHV0KTt0aGlzLmJpbmRWYWx1ZT10aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ9CnRoaXMuaW5wdXRFbGVtZW50LnZhbHVlO3RoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0hMX0sX2lzUHJpbnRhYmxlOmZ1bmN0aW9uKGIpe3ZhciBkPTE5PT1iLmtleUNvZGV8fDIwPT1iLmtleUNvZGV8fDQ1PT1iLmtleUNvZGV8fDQ2PT1iLmtleUNvZGV8fDE0ND09Yi5rZXlDb2RlfHwxNDU9PWIua2V5Q29kZXx8MzI8Yi5rZXlDb2RlJiY0MT5iLmtleUNvZGV8fDExMTxiLmtleUNvZGUmJjEyND5iLmtleUNvZGU7cmV0dXJuISg4PT1iLmtleUNvZGV8fDk9PWIua2V5Q29kZXx8MTM9PWIua2V5Q29kZXx8Mjc9PWIua2V5Q29kZSkmJiEoMD09Yi5jaGFyQ29kZSYmZCl9LF9vbktleXByZXNzOmZ1bmN0aW9uKGIpe2lmKHRoaXMuYWxsb3dlZFBhdHRlcm58fCJudW1iZXIiPT09dGhpcy5pbnB1dEVsZW1lbnQudHlwZSl7dmFyIGQ9dGhpcy5fcGF0dGVyblJlZ0V4cDtpZihkJiYhKGIubWV0YUtleXx8Yi5jdHJsS2V5fHxiLmFsdEtleSkpe3RoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0KITA7dmFyIGY9U3RyaW5nLmZyb21DaGFyQ29kZShiLmNoYXJDb2RlKTt0aGlzLl9pc1ByaW50YWJsZShiKSYmIWQudGVzdChmKSYmKGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXIoIkludmFsaWQgY2hhcmFjdGVyICIrZisiIG5vdCBlbnRlcmVkLiIpKX19fSxfY2hlY2tQYXR0ZXJuVmFsaWRpdHk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9wYXR0ZXJuUmVnRXhwO2lmKCFiKXJldHVybiEwO2Zvcih2YXIgZD0wO2Q8dGhpcy5pbnB1dEVsZW1lbnQudmFsdWUubGVuZ3RoO2QrKylpZighYi50ZXN0KHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlW2RdKSlyZXR1cm4hMTtyZXR1cm4hMH0sdmFsaWRhdGU6ZnVuY3Rpb24oKXtpZighdGhpcy5pbnB1dEVsZW1lbnQpcmV0dXJuIHRoaXMuaW52YWxpZD0hMSwhMDt2YXIgYj10aGlzLmlucHV0RWxlbWVudC5jaGVja1ZhbGlkaXR5KCk7YiYmKHRoaXMucmVxdWlyZWQmJiIiPT09dGhpcy5iaW5kVmFsdWU/Yj0hMToKdGhpcy5oYXNWYWxpZGF0b3IoKSYmKGI9UG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvci52YWxpZGF0ZS5jYWxsKHRoaXMsdGhpcy5iaW5kVmFsdWUpKSk7dGhpcy5pbnZhbGlkPSFiO3RoaXMuZmlyZSgiaXJvbi1pbnB1dC12YWxpZGF0ZSIpO3JldHVybiBifSxfYW5ub3VuY2VJbnZhbGlkQ2hhcmFjdGVyOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6Yn0pfSxfY29tcHV0ZVZhbHVlOmZ1bmN0aW9uKGIpe3JldHVybiBifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlcklucHV0SGVscGVyPXt9O1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0TGFiZWxJRD0xO1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0QWRkb25JRD0xO1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0SW5wdXRJRD0xOwpQb2x5bWVyLlBhcGVySW5wdXRCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e2xhYmVsOnt0eXBlOlN0cmluZ30sdmFsdWU6e25vdGlmeTohMCx0eXBlOlN0cmluZ30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saW52YWxpZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sYWxsb3dlZFBhdHRlcm46e3R5cGU6U3RyaW5nfSx0eXBlOnt0eXBlOlN0cmluZ30sbGlzdDp7dHlwZTpTdHJpbmd9LHBhdHRlcm46e3R5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxlcnJvck1lc3NhZ2U6e3R5cGU6U3RyaW5nfSxjaGFyQ291bnRlcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhdXRvVmFsaWRhdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sdmFsaWRhdG9yOnt0eXBlOlN0cmluZ30sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZywKdmFsdWU6Im9mZiJ9LGF1dG9mb2N1czp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfYXV0b2ZvY3VzQ2hhbmdlZCJ9LGlucHV0bW9kZTp7dHlwZTpTdHJpbmd9LG1pbmxlbmd0aDp7dHlwZTpOdW1iZXJ9LG1heGxlbmd0aDp7dHlwZTpOdW1iZXJ9LG1pbjp7dHlwZTpTdHJpbmd9LG1heDp7dHlwZTpTdHJpbmd9LHN0ZXA6e3R5cGU6U3RyaW5nfSxuYW1lOnt0eXBlOlN0cmluZ30scGxhY2Vob2xkZXI6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxyZWFkb25seTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzaXplOnt0eXBlOk51bWJlcn0sYXV0b2NhcGl0YWxpemU6e3R5cGU6U3RyaW5nLHZhbHVlOiJub25lIn0sYXV0b2NvcnJlY3Q6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmYifSxhdXRvc2F2ZTp7dHlwZTpTdHJpbmd9LHJlc3VsdHM6e3R5cGU6TnVtYmVyfSxhY2NlcHQ6e3R5cGU6U3RyaW5nfSxtdWx0aXBsZTp7dHlwZTpCb29sZWFufSxfYXJpYURlc2NyaWJlZEJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sCl9hcmlhTGFiZWxsZWRCeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9pbnB1dElkOnt0eXBlOlN0cmluZyx2YWx1ZToiIn19LGxpc3RlbmVyczp7ImFkZG9uLWF0dGFjaGVkIjoiX29uQWRkb25BdHRhY2hlZCJ9LGtleUJpbmRpbmdzOnsic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxob3N0QXR0cmlidXRlczp7dGFiaW5kZXg6MH0sZ2V0IGlucHV0RWxlbWVudCgpe3RoaXMuJHx8KHRoaXMuJD17fSk7dGhpcy4kLmlucHV0fHwodGhpcy5fZ2VuZXJhdGVJbnB1dElkKCksdGhpcy4kLmlucHV0PXRoaXMuJCQoIiMiK3RoaXMuX2lucHV0SWQpKTtyZXR1cm4gdGhpcy4kLmlucHV0fSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnR9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl90eXBlc1RoYXRIYXZlVGV4dD0iZGF0ZSBkYXRldGltZSBkYXRldGltZS1sb2NhbCBtb250aCB0aW1lIHdlZWsgZmlsZSIuc3BsaXQoIiAiKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpOwohUG9seW1lci5FbGVtZW50JiZ0aGlzLmlucHV0RWxlbWVudCYmLTEhPT10aGlzLl90eXBlc1RoYXRIYXZlVGV4dC5pbmRleE9mKHRoaXMuaW5wdXRFbGVtZW50LnR5cGUpJiYodGhpcy5hbHdheXNGbG9hdExhYmVsPSEwKX0sX2FwcGVuZFN0cmluZ1dpdGhTcGFjZTpmdW5jdGlvbihiLGQpe3JldHVybiBiP2IrIiAiK2Q6ZH0sX29uQWRkb25BdHRhY2hlZDpmdW5jdGlvbihiKXtiPVBvbHltZXIuZG9tKGIpLnJvb3RUYXJnZXQ7aWYoYi5pZCl0aGlzLl9hcmlhRGVzY3JpYmVkQnk9dGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSxiLmlkKTtlbHNle3ZhciBkPSJwYXBlci1pbnB1dC1hZGQtb24tIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dEFkZG9uSUQrKztiLmlkPWQ7dGhpcy5fYXJpYURlc2NyaWJlZEJ5PXRoaXMuX2FwcGVuZFN0cmluZ1dpdGhTcGFjZSh0aGlzLl9hcmlhRGVzY3JpYmVkQnksZCl9fSx2YWxpZGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudC52YWxpZGF0ZSgpfSwKX2ZvY3VzQmx1ckhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLl9mb2N1c0JsdXJIYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLmZvY3VzZWQmJiF0aGlzLl9zaGlmdFRhYlByZXNzZWQmJnRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQmJnRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKX0sX29uU2hpZnRUYWJEb3duOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRBdHRyaWJ1dGUoInRhYmluZGV4Iik7dGhpcy5fc2hpZnRUYWJQcmVzc2VkPSEwO3RoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIik7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsYik7dGhpcy5fc2hpZnRUYWJQcmVzc2VkPSExfSwxKX0sX2hhbmRsZUF1dG9WYWxpZGF0ZTpmdW5jdGlvbigpe3RoaXMuYXV0b1ZhbGlkYXRlJiZ0aGlzLnZhbGlkYXRlKCl9LHVwZGF0ZVZhbHVlQW5kUHJlc2VydmVDYXJldDpmdW5jdGlvbihiKXt0cnl7dmFyIGQ9CnRoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0O3RoaXMudmFsdWU9Yjt0aGlzLmlucHV0RWxlbWVudC5zZWxlY3Rpb25TdGFydD1kO3RoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvbkVuZD1kfWNhdGNoKGYpe3RoaXMudmFsdWU9Yn19LF9jb21wdXRlQWx3YXlzRmxvYXRMYWJlbDpmdW5jdGlvbihiLGQpe3JldHVybiBkfHxifSxfdXBkYXRlQXJpYUxhYmVsbGVkQnk6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoImxhYmVsIik7aWYoYil7aWYoYi5pZCl2YXIgZD1iLmlkO2Vsc2UgZD0icGFwZXItaW5wdXQtbGFiZWwtIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dExhYmVsSUQrKyxiLmlkPWQ7dGhpcy5fYXJpYUxhYmVsbGVkQnk9ZH1lbHNlIHRoaXMuX2FyaWFMYWJlbGxlZEJ5PSIifSxfZ2VuZXJhdGVJbnB1dElkOmZ1bmN0aW9uKCl7dGhpcy5faW5wdXRJZCYmIiIhPT10aGlzLl9pbnB1dElkfHwodGhpcy5faW5wdXRJZD0KImlucHV0LSIrUG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRJbnB1dElEKyspfSxfb25DaGFuZ2U6ZnVuY3Rpb24oYil7dGhpcy5zaGFkb3dSb290JiZ0aGlzLmZpcmUoYi50eXBlLHtzb3VyY2VFdmVudDpifSx7bm9kZTp0aGlzLGJ1YmJsZXM6Yi5idWJibGVzLGNhbmNlbGFibGU6Yi5jYW5jZWxhYmxlfSl9LF9hdXRvZm9jdXNDaGFuZ2VkOmZ1bmN0aW9uKCl7aWYodGhpcy5hdXRvZm9jdXMmJnRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQpe3ZhciBiPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7YiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZiIT09ZG9jdW1lbnQuYm9keSYmYiE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8dGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfX19O1BvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9yPVtQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLlBhcGVySW5wdXRCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWFkZG9uLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcj17YXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImFkZG9uLWF0dGFjaGVkIil9LHVwZGF0ZTpmdW5jdGlvbigpe319OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWNoYXItY291bnRlci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcl0scHJvcGVydGllczp7X2NoYXJDb3VudGVyU3RyOnt0eXBlOlN0cmluZyx2YWx1ZToiMCJ9fSx1cGRhdGU6ZnVuY3Rpb24oYil7aWYoYi5pbnB1dEVsZW1lbnQpe2IudmFsdWU9Yi52YWx1ZXx8IiI7dmFyIGQ9Yi52YWx1ZS50b1N0cmluZygpLmxlbmd0aC50b1N0cmluZygpO2IuaW5wdXRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgibWF4bGVuZ3RoIikmJihkKz0iLyIrYi5pbnB1dEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJtYXhsZW5ndGgiKSk7dGhpcy5fY2hhckNvdW50ZXJTdHI9ZH19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtY29udGFpbmVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWNvbnRhaW5lciIscHJvcGVydGllczp7bm9MYWJlbEZsb2F0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsd2F5c0Zsb2F0TGFiZWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYXR0ckZvclZhbHVlOnt0eXBlOlN0cmluZyx2YWx1ZToiYmluZC12YWx1ZSJ9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOntvYnNlcnZlcjoiX2ludmFsaWRDaGFuZ2VkIix0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZvY3VzZWQ6e3JlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LF9hZGRvbnM6e3R5cGU6QXJyYXl9LF9pbnB1dEhhc0NvbnRlbnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2lucHV0U2VsZWN0b3I6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbnB1dCxpcm9uLWlucHV0LHRleHRhcmVhLC5wYXBlci1pbnB1dC1pbnB1dCJ9LF9ib3VuZE9uRm9jdXM6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25Gb2N1cy5iaW5kKHRoaXMpfX0sCl9ib3VuZE9uQmx1cjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbkJsdXIuYmluZCh0aGlzKX19LF9ib3VuZE9uSW5wdXQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25JbnB1dC5iaW5kKHRoaXMpfX0sX2JvdW5kVmFsdWVDaGFuZ2VkOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uVmFsdWVDaGFuZ2VkLmJpbmQodGhpcyl9fX0sbGlzdGVuZXJzOnsiYWRkb24tYXR0YWNoZWQiOiJfb25BZGRvbkF0dGFjaGVkIiwiaXJvbi1pbnB1dC12YWxpZGF0ZSI6Il9vbklyb25JbnB1dFZhbGlkYXRlIn0sZ2V0IF92YWx1ZUNoYW5nZWRFdmVudCgpe3JldHVybiB0aGlzLmF0dHJGb3JWYWx1ZSsiLWNoYW5nZWQifSxnZXQgX3Byb3BlcnR5Rm9yVmFsdWUoKXtyZXR1cm4gUG9seW1lci5DYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZSh0aGlzLmF0dHJGb3JWYWx1ZSl9LGdldCBfaW5wdXRFbGVtZW50KCl7cmV0dXJuIFBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3IodGhpcy5faW5wdXRTZWxlY3Rvcil9LApnZXQgX2lucHV0RWxlbWVudFZhbHVlKCl7cmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudFt0aGlzLl9wcm9wZXJ0eUZvclZhbHVlXXx8dGhpcy5faW5wdXRFbGVtZW50LnZhbHVlfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGU9ITA7dGhpcy5fYWRkb25zfHwodGhpcy5fYWRkb25zPVtdKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9ib3VuZE9uRm9jdXMsITApO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5fYm91bmRPbkJsdXIsITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuYXR0ckZvclZhbHVlP3RoaXMuX2lucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMuX3ZhbHVlQ2hhbmdlZEV2ZW50LHRoaXMuX2JvdW5kVmFsdWVDaGFuZ2VkKTp0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0Iix0aGlzLl9vbklucHV0KTt0aGlzLl9pbnB1dEVsZW1lbnRWYWx1ZSYmIiIhPXRoaXMuX2lucHV0RWxlbWVudFZhbHVlPwp0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnQpOnRoaXMuX2hhbmRsZVZhbHVlKHRoaXMuX2lucHV0RWxlbWVudCl9LF9vbkFkZG9uQXR0YWNoZWQ6ZnVuY3Rpb24oYil7dGhpcy5fYWRkb25zfHwodGhpcy5fYWRkb25zPVtdKTtiPWIudGFyZ2V0Oy0xPT09dGhpcy5fYWRkb25zLmluZGV4T2YoYikmJih0aGlzLl9hZGRvbnMucHVzaChiKSx0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX2hhbmRsZVZhbHVlKHRoaXMuX2lucHV0RWxlbWVudCkpfSxfb25Gb2N1czpmdW5jdGlvbigpe3RoaXMuX3NldEZvY3VzZWQoITApfSxfb25CbHVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Rm9jdXNlZCghMSk7dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50KX0sX29uSW5wdXQ6ZnVuY3Rpb24oYil7dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUoYi50YXJnZXQpfSxfb25WYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9CmIudGFyZ2V0O2lmKHRoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGUmJih0aGlzLl9faXNGaXJzdFZhbHVlVXBkYXRlPSExLHZvaWQgMD09PWQudmFsdWV8fCIiPT09ZC52YWx1ZSkpcmV0dXJuO3RoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKGIudGFyZ2V0KX0sX2hhbmRsZVZhbHVlOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX2lucHV0RWxlbWVudFZhbHVlO2R8fDA9PT1kfHwibnVtYmVyIj09PWIudHlwZSYmIWIuY2hlY2tWYWxpZGl0eSgpP3RoaXMuX2lucHV0SGFzQ29udGVudD0hMDp0aGlzLl9pbnB1dEhhc0NvbnRlbnQ9ITE7dGhpcy51cGRhdGVBZGRvbnMoe2lucHV0RWxlbWVudDpiLHZhbHVlOmQsaW52YWxpZDp0aGlzLmludmFsaWR9KX0sX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlOmZ1bmN0aW9uKGIpe3RoaXMuYXV0b1ZhbGlkYXRlJiZiJiYodGhpcy5pbnZhbGlkPSEoYi52YWxpZGF0ZT9iLnZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudFZhbHVlKTpiLmNoZWNrVmFsaWRpdHkoKSkpOwp0aGlzLl9oYW5kbGVWYWx1ZShiKX0sX29uSXJvbklucHV0VmFsaWRhdGU6ZnVuY3Rpb24oKXt0aGlzLmludmFsaWQ9dGhpcy5faW5wdXRFbGVtZW50LmludmFsaWR9LF9pbnZhbGlkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2FkZG9ucyYmdGhpcy51cGRhdGVBZGRvbnMoe2ludmFsaWQ6dGhpcy5pbnZhbGlkfSl9LHVwZGF0ZUFkZG9uczpmdW5jdGlvbihiKXtmb3IodmFyIGQsZj0wO2Q9dGhpcy5fYWRkb25zW2ZdO2YrKylkLnVwZGF0ZShiKX0sX2NvbXB1dGVJbnB1dENvbnRlbnRDbGFzczpmdW5jdGlvbihiLGQsZixoLGspe3ZhciB0PSJpbnB1dC1jb250ZW50IjtiPyhrJiYodCs9IiBsYWJlbC1pcy1oaWRkZW4iKSxoJiYodCs9IiBpcy1pbnZhbGlkIikpOihiPXRoaXMucXVlcnlTZWxlY3RvcigibGFiZWwiKSxkfHxrPyh0Kz0iIGxhYmVsLWlzLWZsb2F0aW5nIix0aGlzLiQubGFiZWxBbmRJbnB1dENvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0ic3RhdGljIixoP3QrPSIgaXMtaW52YWxpZCI6CmYmJih0Kz0iIGxhYmVsLWlzLWhpZ2hsaWdodGVkIikpOihiJiYodGhpcy4kLmxhYmVsQW5kSW5wdXRDb250YWluZXIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaCYmKHQrPSIgaXMtaW52YWxpZCIpKSk7ZiYmKHQrPSIgZm9jdXNlZCIpO3JldHVybiB0fSxfY29tcHV0ZVVuZGVybGluZUNsYXNzOmZ1bmN0aW9uKGIsZCl7dmFyIGY9InVuZGVybGluZSI7ZD9mKz0iIGlzLWludmFsaWQiOmImJihmKz0iIGlzLWhpZ2hsaWdodGVkIik7cmV0dXJuIGZ9LF9jb21wdXRlQWRkT25Db250ZW50Q2xhc3M6ZnVuY3Rpb24oYixkKXt2YXIgZj0iYWRkLW9uLWNvbnRlbnQiO2Q/Zis9IiBpcy1pbnZhbGlkIjpiJiYoZis9IiBpcy1oaWdobGlnaHRlZCIpO3JldHVybiBmfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWVycm9yLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWVycm9yIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbnB1dEFkZG9uQmVoYXZpb3JdLHByb3BlcnRpZXM6e2ludmFsaWQ6e3JlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx0eXBlOkJvb2xlYW59fSx1cGRhdGU6ZnVuY3Rpb24oYil7dGhpcy5fc2V0SW52YWxpZChiLmludmFsaWQpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0Lmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0IixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3JdLHByb3BlcnRpZXM6e3ZhbHVlOnt0eXBlOlN0cmluZ319LGJlZm9yZVJlZ2lzdGVyOmZ1bmN0aW9uKCl7dmFyIGI9ImZ1bmN0aW9uIj09dHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24taW5wdXQiKS5faW5pdFNsb3R0ZWRJbnB1dD8idjEiOiJ2MCIsZD1Qb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoInBhcGVyLWlucHV0IiwidGVtcGxhdGUiKTtiPVBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCgicGFwZXItaW5wdXQiLCJ0ZW1wbGF0ZSMiK2IpOyhkPWQuY29udGVudC5xdWVyeVNlbGVjdG9yKCIjdGVtcGxhdGUtcGxhY2Vob2xkZXIiKSkmJmQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYi5jb250ZW50LGQpfSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gUG9seW1lci5FbGVtZW50P3RoaXMuaW5wdXRFbGVtZW50Ll9pbnB1dEVsZW1lbnQ6CnRoaXMuaW5wdXRFbGVtZW50fSxsaXN0ZW5lcnM6eyJpcm9uLWlucHV0LXJlYWR5IjoiX29uSXJvbklucHV0UmVhZHkifSxfb25Jcm9uSW5wdXRSZWFkeTpmdW5jdGlvbigpe3RoaXMuJC5uYXRpdmVJbnB1dHx8KHRoaXMuJC5uYXRpdmVJbnB1dD10aGlzLiQkKCJpbnB1dCIpKTt0aGlzLmlucHV0RWxlbWVudCYmLTEhPT10aGlzLl90eXBlc1RoYXRIYXZlVGV4dC5pbmRleE9mKHRoaXMuJC5uYXRpdmVJbnB1dC50eXBlKSYmKHRoaXMuYWx3YXlzRmxvYXRMYWJlbD0hMCk7dGhpcy5pbnB1dEVsZW1lbnQuYmluZFZhbHVlJiZ0aGlzLiQuY29udGFpbmVyLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLmlucHV0RWxlbWVudCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1maXQtYmVoYXZpb3IvaXJvbi1maXQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25GaXRCZWhhdmlvcj17cHJvcGVydGllczp7c2l6aW5nVGFyZ2V0Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzfX0sZml0SW50bzp7dHlwZTpPYmplY3QsdmFsdWU6d2luZG93fSxub092ZXJsYXA6e3R5cGU6Qm9vbGVhbn0scG9zaXRpb25UYXJnZXQ6e3R5cGU6RWxlbWVudH0saG9yaXpvbnRhbEFsaWduOnt0eXBlOlN0cmluZ30sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmd9LGR5bmFtaWNBbGlnbjp7dHlwZTpCb29sZWFufSxob3Jpem9udGFsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sdmVydGljYWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxhdXRvRml0T25BdHRhY2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2ZpdEluZm86e3R5cGU6T2JqZWN0fX0sZ2V0IF9maXRXaWR0aCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/dGhpcy5maXRJbnRvLmlubmVyV2lkdGg6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRofSwKZ2V0IF9maXRIZWlnaHQoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93P3RoaXMuZml0SW50by5pbm5lckhlaWdodDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0fSxnZXQgX2ZpdExlZnQoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93PzA6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9LGdldCBfZml0VG9wKCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz8wOnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3B9LGdldCBfZGVmYXVsdFBvc2l0aW9uVGFyZ2V0KCl7dmFyIGI9UG9seW1lci5kb20odGhpcykucGFyZW50Tm9kZTtiJiZiLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiYoYj1iLmhvc3QpO3JldHVybiBifSxnZXQgX2xvY2FsZUhvcml6b250YWxBbGlnbigpe2lmKHRoaXMuX2lzUlRMKXtpZigicmlnaHQiPT09dGhpcy5ob3Jpem9udGFsQWxpZ24pcmV0dXJuImxlZnQiOwppZigibGVmdCI9PT10aGlzLmhvcml6b250YWxBbGlnbilyZXR1cm4icmlnaHQifXJldHVybiB0aGlzLmhvcml6b250YWxBbGlnbn0sZ2V0IF9fc2hvdWxkUG9zaXRpb24oKXtyZXR1cm4odGhpcy5ob3Jpem9udGFsQWxpZ258fHRoaXMudmVydGljYWxBbGlnbikmJnRoaXMucG9zaXRpb25UYXJnZXR9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7InVuZGVmaW5lZCI9PT10eXBlb2YgdGhpcy5faXNSVEwmJih0aGlzLl9pc1JUTD0icnRsIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlyZWN0aW9uKTt0aGlzLnBvc2l0aW9uVGFyZ2V0PXRoaXMucG9zaXRpb25UYXJnZXR8fHRoaXMuX2RlZmF1bHRQb3NpdGlvblRhcmdldDt0aGlzLmF1dG9GaXRPbkF0dGFjaCYmKCJub25lIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpc3BsYXk/c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZml0KCl9LmJpbmQodGhpcykpOih3aW5kb3cuU2hhZHlET00mJlNoYWR5RE9NLmZsdXNoKCksCnRoaXMuZml0KCkpKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9fZGVmZXJyZWRGaXQmJihjbGVhclRpbWVvdXQodGhpcy5fX2RlZmVycmVkRml0KSx0aGlzLl9fZGVmZXJyZWRGaXQ9bnVsbCl9LGZpdDpmdW5jdGlvbigpe3RoaXMucG9zaXRpb24oKTt0aGlzLmNvbnN0cmFpbigpO3RoaXMuY2VudGVyKCl9LF9kaXNjb3ZlckluZm86ZnVuY3Rpb24oKXtpZighdGhpcy5fZml0SW5mbyl7dmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyksZD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnNpemluZ1RhcmdldCk7dGhpcy5fZml0SW5mbz17aW5saW5lU3R5bGU6e3RvcDp0aGlzLnN0eWxlLnRvcHx8IiIsbGVmdDp0aGlzLnN0eWxlLmxlZnR8fCIiLHBvc2l0aW9uOnRoaXMuc3R5bGUucG9zaXRpb258fCIifSxzaXplcklubGluZVN0eWxlOnttYXhXaWR0aDp0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhXaWR0aHx8IiIsbWF4SGVpZ2h0OnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heEhlaWdodHx8CiIiLGJveFNpemluZzp0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmd8fCIifSxwb3NpdGlvbmVkQnk6e3ZlcnRpY2FsbHk6ImF1dG8iIT09Yi50b3A/InRvcCI6ImF1dG8iIT09Yi5ib3R0b20/ImJvdHRvbSI6bnVsbCxob3Jpem9udGFsbHk6ImF1dG8iIT09Yi5sZWZ0PyJsZWZ0IjoiYXV0byIhPT1iLnJpZ2h0PyJyaWdodCI6bnVsbH0sc2l6ZWRCeTp7aGVpZ2h0OiJub25lIiE9PWQubWF4SGVpZ2h0LHdpZHRoOiJub25lIiE9PWQubWF4V2lkdGgsbWluV2lkdGg6cGFyc2VJbnQoZC5taW5XaWR0aCwxMCl8fDAsbWluSGVpZ2h0OnBhcnNlSW50KGQubWluSGVpZ2h0LDEwKXx8MH0sbWFyZ2luOnt0b3A6cGFyc2VJbnQoYi5tYXJnaW5Ub3AsMTApfHwwLHJpZ2h0OnBhcnNlSW50KGIubWFyZ2luUmlnaHQsMTApfHwwLGJvdHRvbTpwYXJzZUludChiLm1hcmdpbkJvdHRvbSwxMCl8fDAsbGVmdDpwYXJzZUludChiLm1hcmdpbkxlZnQsMTApfHwwfX19fSxyZXNldEZpdDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLl9maXRJbmZvfHx7fSxkO2ZvcihkIGluIGIuc2l6ZXJJbmxpbmVTdHlsZSl0aGlzLnNpemluZ1RhcmdldC5zdHlsZVtkXT1iLnNpemVySW5saW5lU3R5bGVbZF07Zm9yKGQgaW4gYi5pbmxpbmVTdHlsZSl0aGlzLnN0eWxlW2RdPWIuaW5saW5lU3R5bGVbZF07dGhpcy5fZml0SW5mbz1udWxsfSxyZWZpdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbExlZnQsZD10aGlzLnNpemluZ1RhcmdldC5zY3JvbGxUb3A7dGhpcy5yZXNldEZpdCgpO3RoaXMuZml0KCk7dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsTGVmdD1iO3RoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbFRvcD1kfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCI7dGhpcy5zdHlsZS5sZWZ0PSIwcHgiOwp0aGlzLnN0eWxlLnRvcD0iMHB4Ijt2YXIgYj10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMucG9zaXRpb25UYXJnZXQpLGY9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byksaD10aGlzLl9maXRJbmZvLm1hcmdpbixrPXRoaXMuX19nZXRQb3NpdGlvbih0aGlzLl9sb2NhbGVIb3Jpem9udGFsQWxpZ24sdGhpcy52ZXJ0aWNhbEFsaWduLHt3aWR0aDpiLndpZHRoK2gubGVmdCtoLnJpZ2h0LGhlaWdodDpiLmhlaWdodCtoLnRvcCtoLmJvdHRvbX0sYixkLGYpO2Q9ay5sZWZ0K2gubGVmdDtrPWsudG9wK2gudG9wO3ZhciB0PU1hdGgubWluKGYucmlnaHQtaC5yaWdodCxkK2Iud2lkdGgpLGw9TWF0aC5taW4oZi5ib3R0b20taC5ib3R0b20saytiLmhlaWdodCk7ZD1NYXRoLm1heChmLmxlZnQraC5sZWZ0LE1hdGgubWluKGQsdC10aGlzLl9maXRJbmZvLnNpemVkQnkubWluV2lkdGgpKTtrPU1hdGgubWF4KGYudG9wKwpoLnRvcCxNYXRoLm1pbihrLGwtdGhpcy5fZml0SW5mby5zaXplZEJ5Lm1pbkhlaWdodCkpO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heFdpZHRoPU1hdGgubWF4KHQtZCx0aGlzLl9maXRJbmZvLnNpemVkQnkubWluV2lkdGgpKyJweCI7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4SGVpZ2h0PU1hdGgubWF4KGwtayx0aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KSsicHgiO3RoaXMuc3R5bGUubGVmdD1kLWIubGVmdCsicHgiO3RoaXMuc3R5bGUudG9wPWstYi50b3ArInB4In19LGNvbnN0cmFpbjpmdW5jdGlvbigpe2lmKCF0aGlzLl9fc2hvdWxkUG9zaXRpb24pe3RoaXMuX2Rpc2NvdmVySW5mbygpO3ZhciBiPXRoaXMuX2ZpdEluZm87Yi5wb3NpdGlvbmVkQnkudmVydGljYWxseXx8KHRoaXMuc3R5bGUucG9zaXRpb249ImZpeGVkIix0aGlzLnN0eWxlLnRvcD0iMHB4Iik7Yi5wb3NpdGlvbmVkQnkuaG9yaXpvbnRhbGx5fHwodGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLAp0aGlzLnN0eWxlLmxlZnQ9IjBweCIpO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCI7dmFyIGQ9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtiLnNpemVkQnkuaGVpZ2h0fHx0aGlzLl9fc2l6ZURpbWVuc2lvbihkLGIucG9zaXRpb25lZEJ5LnZlcnRpY2FsbHksInRvcCIsImJvdHRvbSIsIkhlaWdodCIpO2Iuc2l6ZWRCeS53aWR0aHx8dGhpcy5fX3NpemVEaW1lbnNpb24oZCxiLnBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHksImxlZnQiLCJyaWdodCIsIldpZHRoIil9fSxfc2l6ZURpbWVuc2lvbjpmdW5jdGlvbihiLGQsZixoLGspe3RoaXMuX19zaXplRGltZW5zaW9uKGIsZCxmLGgsayl9LF9fc2l6ZURpbWVuc2lvbjpmdW5jdGlvbihiLGQsZixoLGspe3ZhciB0PXRoaXMuX2ZpdEluZm8sbD10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKTtsPSJXaWR0aCI9PT1rP2wud2lkdGg6bC5oZWlnaHQ7ZD1kPT09aDt2YXIgcD0KIm9mZnNldCIrazt0aGlzLnNpemluZ1RhcmdldC5zdHlsZVsibWF4IitrXT1sLXQubWFyZ2luW2Q/ZjpoXS0oZD9sLWJbaF06YltmXSktKHRoaXNbcF0tdGhpcy5zaXppbmdUYXJnZXRbcF0pKyJweCJ9LGNlbnRlcjpmdW5jdGlvbigpe2lmKCF0aGlzLl9fc2hvdWxkUG9zaXRpb24pe3RoaXMuX2Rpc2NvdmVySW5mbygpO3ZhciBiPXRoaXMuX2ZpdEluZm8ucG9zaXRpb25lZEJ5O2lmKCFiLnZlcnRpY2FsbHl8fCFiLmhvcml6b250YWxseSl7dGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO2IudmVydGljYWxseXx8KHRoaXMuc3R5bGUudG9wPSIwcHgiKTtiLmhvcml6b250YWxseXx8KHRoaXMuc3R5bGUubGVmdD0iMHB4Iik7dmFyIGQ9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxmPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pO2IudmVydGljYWxseXx8KHRoaXMuc3R5bGUudG9wPWYudG9wLWQudG9wKyhmLmhlaWdodC1kLmhlaWdodCkvMisicHgiKTtiLmhvcml6b250YWxseXx8Cih0aGlzLnN0eWxlLmxlZnQ9Zi5sZWZ0LWQubGVmdCsoZi53aWR0aC1kLndpZHRoKS8yKyJweCIpfX19LF9fZ2V0Tm9ybWFsaXplZFJlY3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGI9PT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGI9PT13aW5kb3c/e3RvcDowLGxlZnQ6MCx3aWR0aDp3aW5kb3cuaW5uZXJXaWR0aCxoZWlnaHQ6d2luZG93LmlubmVySGVpZ2h0LHJpZ2h0OndpbmRvdy5pbm5lcldpZHRoLGJvdHRvbTp3aW5kb3cuaW5uZXJIZWlnaHR9OmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9LF9fZ2V0T2Zmc2NyZWVuQXJlYTpmdW5jdGlvbihiLGQsZil7cmV0dXJuIE1hdGguYWJzKE1hdGgubWluKDAsYi50b3ApK01hdGgubWluKDAsZi5ib3R0b20tKGIudG9wK2QuaGVpZ2h0KSkpKmQud2lkdGgrTWF0aC5hYnMoTWF0aC5taW4oMCxiLmxlZnQpK01hdGgubWluKDAsZi5yaWdodC0oYi5sZWZ0K2Qud2lkdGgpKSkqZC5oZWlnaHR9LF9fZ2V0UG9zaXRpb246ZnVuY3Rpb24oYixkLApmLGgsayx0KXt2YXIgbD1be3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJsZWZ0Iix0b3A6ay50b3ArdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsubGVmdCt0aGlzLmhvcml6b250YWxPZmZzZXR9LHt2ZXJ0aWNhbEFsaWduOiJ0b3AiLGhvcml6b250YWxBbGlnbjoicmlnaHQiLHRvcDprLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5yaWdodC1mLndpZHRoLXRoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJsZWZ0Iix0b3A6ay5ib3R0b20tZi5oZWlnaHQtdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsubGVmdCt0aGlzLmhvcml6b250YWxPZmZzZXR9LHt2ZXJ0aWNhbEFsaWduOiJib3R0b20iLGhvcml6b250YWxBbGlnbjoicmlnaHQiLHRvcDprLmJvdHRvbS1mLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5yaWdodC1mLndpZHRoLXRoaXMuaG9yaXpvbnRhbE9mZnNldH1dOwppZih0aGlzLm5vT3ZlcmxhcCl7Zm9yKHZhciBwPTAsbT1sLmxlbmd0aDtwPG07cCsrKXt2YXIgbj17fSxxO2ZvcihxIGluIGxbcF0pbltxXT1sW3BdW3FdO2wucHVzaChuKX1sWzBdLnRvcD1sWzFdLnRvcCs9ay5oZWlnaHQ7bFsyXS50b3A9bFszXS50b3AtPWsuaGVpZ2h0O2xbNF0ubGVmdD1sWzZdLmxlZnQrPWsud2lkdGg7bFs1XS5sZWZ0PWxbN10ubGVmdC09ay53aWR0aH1kPSJhdXRvIj09PWQ/bnVsbDpkO2I9ImF1dG8iPT09Yj9udWxsOmI7YiYmImNlbnRlciIhPT1ifHwobC5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJ0b3AiLGhvcml6b250YWxBbGlnbjoiY2VudGVyIix0b3A6ay50b3ArdGhpcy52ZXJ0aWNhbE9mZnNldCsodGhpcy5ub092ZXJsYXA/ay5oZWlnaHQ6MCksbGVmdDprLmxlZnQtaC53aWR0aC8yK2sud2lkdGgvMit0aGlzLmhvcml6b250YWxPZmZzZXR9KSxsLnB1c2goe3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDprLmJvdHRvbS0KZi5oZWlnaHQtdGhpcy52ZXJ0aWNhbE9mZnNldC0odGhpcy5ub092ZXJsYXA/ay5oZWlnaHQ6MCksbGVmdDprLmxlZnQtaC53aWR0aC8yK2sud2lkdGgvMit0aGlzLmhvcml6b250YWxPZmZzZXR9KSk7ZCYmIm1pZGRsZSIhPT1kfHwobC5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoibGVmdCIsdG9wOmsudG9wLWguaGVpZ2h0LzIray5oZWlnaHQvMit0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldCsodGhpcy5ub092ZXJsYXA/ay53aWR0aDowKX0pLGwucHVzaCh7dmVydGljYWxBbGlnbjoibWlkZGxlIixob3Jpem9udGFsQWxpZ246InJpZ2h0Iix0b3A6ay50b3AtaC5oZWlnaHQvMitrLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLnJpZ2h0LWYud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0LSh0aGlzLm5vT3ZlcmxhcD9rLndpZHRoOjApfSkpOyJtaWRkbGUiPT09ZCYmImNlbnRlciI9PT0KYiYmbC5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoiY2VudGVyIix0b3A6ay50b3AtaC5oZWlnaHQvMitrLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLmxlZnQtaC53aWR0aC8yK2sud2lkdGgvMit0aGlzLmhvcml6b250YWxPZmZzZXR9KTtmb3IocD0wO3A8bC5sZW5ndGg7cCsrKXtoPWxbcF07az1oLnZlcnRpY2FsQWxpZ249PT1kO209aC5ob3Jpem9udGFsQWxpZ249PT1iO2lmKCF0aGlzLmR5bmFtaWNBbGlnbiYmIXRoaXMubm9PdmVybGFwJiZrJiZtKXt2YXIgdT1oO2JyZWFrfW49KCFkfHxrKSYmKCFifHxtKTtpZih0aGlzLmR5bmFtaWNBbGlnbnx8bil7aC5vZmZzY3JlZW5BcmVhPXRoaXMuX19nZXRPZmZzY3JlZW5BcmVhKGgsZix0KTtpZigwPT09aC5vZmZzY3JlZW5BcmVhJiZuKXt1PWg7YnJlYWt9dT11fHxoO249aC5vZmZzY3JlZW5BcmVhLXUub2Zmc2NyZWVuQXJlYTtpZigwPm58fDA9PT1uJiYoa3x8bSkpdT1ofX1yZXR1cm4gdX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tcmVzaXphYmxlLWJlaGF2aW9yL2lyb24tcmVzaXphYmxlLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e19wYXJlbnRSZXNpemFibGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfcGFyZW50UmVzaXphYmxlQ2hhbmdlZCJ9LF9ub3RpZnlpbmdEZXNjZW5kYW50Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxsaXN0ZW5lcnM6eyJpcm9uLXJlcXVlc3QtcmVzaXplLW5vdGlmaWNhdGlvbnMiOiJfb25Jcm9uUmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnMifSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXM9W107dGhpcy5fYm91bmROb3RpZnlSZXNpemU9dGhpcy5ub3RpZnlSZXNpemUuYmluZCh0aGlzKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9yZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3BhcmVudFJlc2l6YWJsZT90aGlzLl9wYXJlbnRSZXNpemFibGUuc3RvcFJlc2l6ZU5vdGlmaWNhdGlvbnNGb3IodGhpcyk6d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsCnRoaXMuX2JvdW5kTm90aWZ5UmVzaXplKTt0aGlzLl9wYXJlbnRSZXNpemFibGU9bnVsbH0sbm90aWZ5UmVzaXplOmZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLnJlc2l6ZXJTaG91bGROb3RpZnkoYikmJnRoaXMuX25vdGlmeURlc2NlbmRhbnQoYil9LHRoaXMpLHRoaXMuX2ZpcmVSZXNpemUoKSl9LGFzc2lnblBhcmVudFJlc2l6YWJsZTpmdW5jdGlvbihiKXt0aGlzLl9wYXJlbnRSZXNpemFibGU9Yn0sc3RvcFJlc2l6ZU5vdGlmaWNhdGlvbnNGb3I6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMuaW5kZXhPZihiKTstMTxkJiYodGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMuc3BsaWNlKGQsMSksdGhpcy51bmxpc3RlbihiLCJpcm9uLXJlc2l6ZSIsIl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplIikpfSxyZXNpemVyU2hvdWxkTm90aWZ5OmZ1bmN0aW9uKCl7cmV0dXJuITB9LApfb25EZXNjZW5kYW50SXJvblJlc2l6ZTpmdW5jdGlvbihiKXt0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50P2Iuc3RvcFByb3BhZ2F0aW9uKCk6UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3d8fHRoaXMuX2ZpcmVSZXNpemUoKX0sX2ZpcmVSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImlyb24tcmVzaXplIixudWxsLHtub2RlOnRoaXMsYnViYmxlczohMX0pfSxfb25Jcm9uUmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnM6ZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20oYikucm9vdFRhcmdldDtkIT09dGhpcyYmKC0xPT09dGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMuaW5kZXhPZihkKSYmKHRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLnB1c2goZCksdGhpcy5saXN0ZW4oZCwiaXJvbi1yZXNpemUiLCJfb25EZXNjZW5kYW50SXJvblJlc2l6ZSIpKSxkLmFzc2lnblBhcmVudFJlc2l6YWJsZSh0aGlzKSx0aGlzLl9ub3RpZnlEZXNjZW5kYW50KGQpLGIuc3RvcFByb3BhZ2F0aW9uKCkpfSwKX3BhcmVudFJlc2l6YWJsZUNoYW5nZWQ6ZnVuY3Rpb24oYil7YiYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5fYm91bmROb3RpZnlSZXNpemUpfSxfbm90aWZ5RGVzY2VuZGFudDpmdW5jdGlvbihiKXt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50PSEwLGIubm90aWZ5UmVzaXplKCksdGhpcy5fbm90aWZ5aW5nRGVzY2VuZGFudD0hMSl9LF9yZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuaXNBdHRhY2hlZClpZigibG9hZGluZyI9PT1kb2N1bWVudC5yZWFkeVN0YXRlKXt2YXIgYj10aGlzLl9yZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucy5iaW5kKHRoaXMpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uIGYoKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixmKTtiKCl9KX1lbHNlIHRoaXMuZmlyZSgiaXJvbi1yZXF1ZXN0LXJlc2l6ZS1ub3RpZmljYXRpb25zIiwKbnVsbCx7bm9kZTp0aGlzLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pLHRoaXMuX3BhcmVudFJlc2l6YWJsZXx8KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMuX2JvdW5kTm90aWZ5UmVzaXplKSx0aGlzLm5vdGlmeVJlc2l6ZSgpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tb3ZlcmxheS1iZWhhdmlvci9pcm9uLW92ZXJsYXktYmFja2Ryb3AuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoiaXJvbi1vdmVybGF5LWJhY2tkcm9wIixwcm9wZXJ0aWVzOntvcGVuZWQ6e3JlZmxlY3RUb0F0dHJpYnV0ZTohMCx0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIn19LGxpc3RlbmVyczp7dHJhbnNpdGlvbmVuZDoiX29uVHJhbnNpdGlvbmVuZCJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9fb3BlbmVkUmFmPW51bGx9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJnRoaXMuX29wZW5lZENoYW5nZWQodGhpcy5vcGVuZWQpfSxwcmVwYXJlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJiF0aGlzLnBhcmVudE5vZGUmJlBvbHltZXIuZG9tKGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKHRoaXMpfSxvcGVuOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9ITB9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9ITF9LGNvbXBsZXRlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWR8fHRoaXMucGFyZW50Tm9kZSE9PQpkb2N1bWVudC5ib2R5fHxQb2x5bWVyLmRvbSh0aGlzLnBhcmVudE5vZGUpLnJlbW92ZUNoaWxkKHRoaXMpfSxfb25UcmFuc2l0aW9uZW5kOmZ1bmN0aW9uKGIpe2ImJmIudGFyZ2V0PT09dGhpcyYmdGhpcy5jb21wbGV0ZSgpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihiKXtiP3RoaXMucHJlcGFyZSgpOihiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLCIwcyIhPT1iLnRyYW5zaXRpb25EdXJhdGlvbiYmMCE9Yi5vcGFjaXR5fHx0aGlzLmNvbXBsZXRlKCkpO3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX19vcGVuZWRSYWYmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fX29wZW5lZFJhZiksdGhpcy5fX29wZW5lZFJhZj1udWxsKSx0aGlzLnNjcm9sbFRvcD10aGlzLnNjcm9sbFRvcCx0aGlzLl9fb3BlbmVkUmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0aGlzLl9fb3BlbmVkUmFmPW51bGw7dGhpcy50b2dnbGVDbGFzcygib3BlbmVkIiwKdGhpcy5vcGVuZWQpfS5iaW5kKHRoaXMpKSl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tb3ZlcmxheS1iZWhhdmlvci9pcm9uLW92ZXJsYXktbWFuYWdlci5odG1sLmpzClBvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyQ2xhc3M9ZnVuY3Rpb24oKXt0aGlzLl9vdmVybGF5cz1bXTt0aGlzLl9taW5pbXVtWj0xMDE7dGhpcy5fYmFja2Ryb3BFbGVtZW50PW51bGw7UG9seW1lci5HZXN0dXJlcy5hZGQoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCJ0YXAiLGZ1bmN0aW9uKCl7fSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidGFwIix0aGlzLl9vbkNhcHR1cmVDbGljay5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fb25DYXB0dXJlRm9jdXMuYmluZCh0aGlzKSwhMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5fb25DYXB0dXJlS2V5RG93bi5iaW5kKHRoaXMpLCEwKX07ClBvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyQ2xhc3MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlckNsYXNzLGdldCBiYWNrZHJvcEVsZW1lbnQoKXt0aGlzLl9iYWNrZHJvcEVsZW1lbnR8fCh0aGlzLl9iYWNrZHJvcEVsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1vdmVybGF5LWJhY2tkcm9wIikpO3JldHVybiB0aGlzLl9iYWNrZHJvcEVsZW1lbnR9LGdldCBkZWVwQWN0aXZlRWxlbWVudCgpe3ZhciBiPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7YiYmITEhPT1iIGluc3RhbmNlb2YgRWxlbWVudHx8KGI9ZG9jdW1lbnQuYm9keSk7Zm9yKDtiLnJvb3QmJlBvbHltZXIuZG9tKGIucm9vdCkuYWN0aXZlRWxlbWVudDspYj1Qb2x5bWVyLmRvbShiLnJvb3QpLmFjdGl2ZUVsZW1lbnQ7cmV0dXJuIGJ9LF9icmluZ092ZXJsYXlBdEluZGV4VG9Gcm9udDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9vdmVybGF5c1tiXTtpZihkKXt2YXIgZj0KdGhpcy5fb3ZlcmxheXMubGVuZ3RoLTEsaD10aGlzLl9vdmVybGF5c1tmXTtoJiZ0aGlzLl9zaG91bGRCZUJlaGluZE92ZXJsYXkoZCxoKSYmZi0tO2lmKCEoYj49Zikpe2g9TWF0aC5tYXgodGhpcy5jdXJyZW50T3ZlcmxheVooKSx0aGlzLl9taW5pbXVtWik7Zm9yKHRoaXMuX2dldFooZCk8PWgmJnRoaXMuX2FwcGx5T3ZlcmxheVooZCxoKTtiPGY7KXRoaXMuX292ZXJsYXlzW2JdPXRoaXMuX292ZXJsYXlzW2IrMV0sYisrO3RoaXMuX292ZXJsYXlzW2ZdPWR9fX0sYWRkT3JSZW1vdmVPdmVybGF5OmZ1bmN0aW9uKGIpe2Iub3BlbmVkP3RoaXMuYWRkT3ZlcmxheShiKTp0aGlzLnJlbW92ZU92ZXJsYXkoYil9LGFkZE92ZXJsYXk6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fb3ZlcmxheXMuaW5kZXhPZihiKTtpZigwPD1kKXRoaXMuX2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250KGQpO2Vsc2V7ZD10aGlzLl9vdmVybGF5cy5sZW5ndGg7dmFyIGY9dGhpcy5fb3ZlcmxheXNbZC0xXSxoPQpNYXRoLm1heCh0aGlzLl9nZXRaKGYpLHRoaXMuX21pbmltdW1aKSxrPXRoaXMuX2dldFooYik7ZiYmdGhpcy5fc2hvdWxkQmVCZWhpbmRPdmVybGF5KGIsZikmJih0aGlzLl9hcHBseU92ZXJsYXlaKGYsaCksZC0tLGg9TWF0aC5tYXgodGhpcy5fZ2V0Wih0aGlzLl9vdmVybGF5c1tkLTFdKSx0aGlzLl9taW5pbXVtWikpO2s8PWgmJnRoaXMuX2FwcGx5T3ZlcmxheVooYixoKTt0aGlzLl9vdmVybGF5cy5zcGxpY2UoZCwwLGIpfXRoaXMudHJhY2tCYWNrZHJvcCgpfSxyZW1vdmVPdmVybGF5OmZ1bmN0aW9uKGIpe2I9dGhpcy5fb3ZlcmxheXMuaW5kZXhPZihiKTstMSE9PWImJih0aGlzLl9vdmVybGF5cy5zcGxpY2UoYiwxKSx0aGlzLnRyYWNrQmFja2Ryb3AoKSl9LGN1cnJlbnRPdmVybGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX292ZXJsYXlzW3RoaXMuX292ZXJsYXlzLmxlbmd0aC0xXX0sY3VycmVudE92ZXJsYXlaOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFoodGhpcy5jdXJyZW50T3ZlcmxheSgpKX0sCmVuc3VyZU1pbmltdW1aOmZ1bmN0aW9uKGIpe3RoaXMuX21pbmltdW1aPU1hdGgubWF4KHRoaXMuX21pbmltdW1aLGIpfSxmb2N1c092ZXJsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmN1cnJlbnRPdmVybGF5KCk7YiYmYi5fYXBwbHlGb2N1cygpfSx0cmFja0JhY2tkcm9wOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fb3ZlcmxheVdpdGhCYWNrZHJvcCgpO2lmKGJ8fHRoaXMuX2JhY2tkcm9wRWxlbWVudCl0aGlzLmJhY2tkcm9wRWxlbWVudC5zdHlsZS56SW5kZXg9dGhpcy5fZ2V0WihiKS0xLHRoaXMuYmFja2Ryb3BFbGVtZW50Lm9wZW5lZD0hIWIsdGhpcy5iYWNrZHJvcEVsZW1lbnQucHJlcGFyZSgpfSxnZXRCYWNrZHJvcHM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9W10sZD0wO2Q8dGhpcy5fb3ZlcmxheXMubGVuZ3RoO2QrKyl0aGlzLl9vdmVybGF5c1tkXS53aXRoQmFja2Ryb3AmJmIucHVzaCh0aGlzLl9vdmVybGF5c1tkXSk7cmV0dXJuIGJ9LGJhY2tkcm9wWjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRaKHRoaXMuX292ZXJsYXlXaXRoQmFja2Ryb3AoKSktCjF9LF9vdmVybGF5V2l0aEJhY2tkcm9wOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuX292ZXJsYXlzLmxlbmd0aC0xOzA8PWI7Yi0tKWlmKHRoaXMuX292ZXJsYXlzW2JdLndpdGhCYWNrZHJvcClyZXR1cm4gdGhpcy5fb3ZlcmxheXNbYl19LF9nZXRaOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX21pbmltdW1aO2ImJihiPU51bWJlcihiLnN0eWxlLnpJbmRleHx8d2luZG93LmdldENvbXB1dGVkU3R5bGUoYikuekluZGV4KSxiPT09YiYmKGQ9YikpO3JldHVybiBkfSxfc2V0WjpmdW5jdGlvbihiLGQpe2Iuc3R5bGUuekluZGV4PWR9LF9hcHBseU92ZXJsYXlaOmZ1bmN0aW9uKGIsZCl7dGhpcy5fc2V0WihiLGQrMil9LF9vdmVybGF5SW5QYXRoOmZ1bmN0aW9uKGIpe2I9Ynx8W107Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYltkXS5fbWFuYWdlcj09PXRoaXMpcmV0dXJuIGJbZF19LF9vbkNhcHR1cmVDbGljazpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9vdmVybGF5cy5sZW5ndGgtCjE7aWYoLTEhPT1kKWZvcih2YXIgZj1Qb2x5bWVyLmRvbShiKS5wYXRoLGg7KGg9dGhpcy5fb3ZlcmxheXNbZF0pJiZ0aGlzLl9vdmVybGF5SW5QYXRoKGYpIT09aDspaWYoaC5fb25DYXB0dXJlQ2xpY2soYiksaC5hbGxvd0NsaWNrVGhyb3VnaClkLS07ZWxzZSBicmVha30sX29uQ2FwdHVyZUZvY3VzOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuY3VycmVudE92ZXJsYXkoKTtkJiZkLl9vbkNhcHR1cmVGb2N1cyhiKX0sX29uQ2FwdHVyZUtleURvd246ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2QmJihQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJlc2MiKT9kLl9vbkNhcHR1cmVFc2MoYik6UG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvci5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXMoYiwidGFiIikmJmQuX29uQ2FwdHVyZVRhYihiKSl9LF9zaG91bGRCZUJlaGluZE92ZXJsYXk6ZnVuY3Rpb24oYixkKXtyZXR1cm4hYi5hbHdheXNPblRvcCYmCmQuYWx3YXlzT25Ub3B9fTtQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlcj1uZXcgUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzczsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLW92ZXJsYXktYmVoYXZpb3IvaXJvbi1zY3JvbGwtbWFuYWdlci5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPTAsZD0wLGY9bnVsbCxoPVtdLGs9WyJ3aGVlbCIsIm1vdXNld2hlZWwiLCJET01Nb3VzZVNjcm9sbCIsInRvdWNoc3RhcnQiLCJ0b3VjaG1vdmUiXTtQb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyPXtnZXQgY3VycmVudExvY2tpbmdFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2xvY2tpbmdFbGVtZW50c1t0aGlzLl9sb2NraW5nRWxlbWVudHMubGVuZ3RoLTFdfSxlbGVtZW50SXNTY3JvbGxMb2NrZWQ6ZnVuY3Rpb24odCl7dmFyIGw9dGhpcy5jdXJyZW50TG9ja2luZ0VsZW1lbnQ7aWYodm9pZCAwPT09bClyZXR1cm4hMTtpZih0aGlzLl9oYXNDYWNoZWRMb2NrZWRFbGVtZW50KHQpKXJldHVybiEwO2lmKHRoaXMuX2hhc0NhY2hlZFVubG9ja2VkRWxlbWVudCh0KSlyZXR1cm4hMTsobD0hIWwmJmwhPT10JiYhdGhpcy5fY29tcG9zZWRUcmVlQ29udGFpbnMobCx0KSk/dGhpcy5fbG9ja2VkRWxlbWVudENhY2hlLnB1c2godCk6dGhpcy5fdW5sb2NrZWRFbGVtZW50Q2FjaGUucHVzaCh0KTsKcmV0dXJuIGx9LHB1c2hTY3JvbGxMb2NrOmZ1bmN0aW9uKHQpezA8PXRoaXMuX2xvY2tpbmdFbGVtZW50cy5pbmRleE9mKHQpfHwoMD09PXRoaXMuX2xvY2tpbmdFbGVtZW50cy5sZW5ndGgmJnRoaXMuX2xvY2tTY3JvbGxJbnRlcmFjdGlvbnMoKSx0aGlzLl9sb2NraW5nRWxlbWVudHMucHVzaCh0KSx0aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGU9W10sdGhpcy5fdW5sb2NrZWRFbGVtZW50Q2FjaGU9W10pfSxyZW1vdmVTY3JvbGxMb2NrOmZ1bmN0aW9uKHQpe3Q9dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmluZGV4T2YodCk7LTEhPT10JiYodGhpcy5fbG9ja2luZ0VsZW1lbnRzLnNwbGljZSh0LDEpLHRoaXMuX2xvY2tlZEVsZW1lbnRDYWNoZT1bXSx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZT1bXSwwPT09dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmxlbmd0aCYmdGhpcy5fdW5sb2NrU2Nyb2xsSW50ZXJhY3Rpb25zKCkpfSxfbG9ja2luZ0VsZW1lbnRzOltdLF9sb2NrZWRFbGVtZW50Q2FjaGU6bnVsbCwKX3VubG9ja2VkRWxlbWVudENhY2hlOm51bGwsX2hhc0NhY2hlZExvY2tlZEVsZW1lbnQ6ZnVuY3Rpb24odCl7cmV0dXJuLTE8dGhpcy5fbG9ja2VkRWxlbWVudENhY2hlLmluZGV4T2YodCl9LF9oYXNDYWNoZWRVbmxvY2tlZEVsZW1lbnQ6ZnVuY3Rpb24odCl7cmV0dXJuLTE8dGhpcy5fdW5sb2NrZWRFbGVtZW50Q2FjaGUuaW5kZXhPZih0KX0sX2NvbXBvc2VkVHJlZUNvbnRhaW5zOmZ1bmN0aW9uKHQsbCl7dmFyIHAsbTtpZih0LmNvbnRhaW5zKGwpKXJldHVybiEwO3Q9UG9seW1lci5kb20odCkucXVlcnlTZWxlY3RvckFsbCgiY29udGVudCxzbG90Iik7Zm9yKHA9MDtwPHQubGVuZ3RoOysrcCl7dmFyIG49UG9seW1lci5kb20odFtwXSkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpO2ZvcihtPTA7bTxuLmxlbmd0aDsrK20paWYoblttXS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZ0aGlzLl9jb21wb3NlZFRyZWVDb250YWlucyhuW21dLGwpKXJldHVybiEwfXJldHVybiExfSxfc2Nyb2xsSW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKHQpe3QuY2FuY2VsYWJsZSYmCnRoaXMuX3Nob3VsZFByZXZlbnRTY3JvbGxpbmcodCkmJnQucHJldmVudERlZmF1bHQoKTt0LnRhcmdldFRvdWNoZXMmJih0PXQudGFyZ2V0VG91Y2hlc1swXSxiPXQucGFnZVgsZD10LnBhZ2VZKX0sX2xvY2tTY3JvbGxJbnRlcmFjdGlvbnM6ZnVuY3Rpb24oKXt0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXI9dGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyfHx0aGlzLl9zY3JvbGxJbnRlcmFjdGlvbkhhbmRsZXIuYmluZCh0aGlzKTtmb3IodmFyIHQ9MCxsPWsubGVuZ3RoO3Q8bDt0KyspZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrW3RdLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcix7Y2FwdHVyZTohMCxwYXNzaXZlOiExfSl9LF91bmxvY2tTY3JvbGxJbnRlcmFjdGlvbnM6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxsPWsubGVuZ3RoO3Q8bDt0KyspZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihrW3RdLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcix7Y2FwdHVyZTohMCxwYXNzaXZlOiExfSl9LApfc2hvdWxkUHJldmVudFNjcm9sbGluZzpmdW5jdGlvbih0KXt2YXIgbD1Qb2x5bWVyLmRvbSh0KS5yb290VGFyZ2V0OyJ0b3VjaG1vdmUiIT09dC50eXBlJiZmIT09bCYmKGY9bCxoPXRoaXMuX2dldFNjcm9sbGFibGVOb2RlcyhQb2x5bWVyLmRvbSh0KS5wYXRoKSk7aWYoIWgubGVuZ3RoKXJldHVybiEwO2lmKCJ0b3VjaHN0YXJ0Ij09PXQudHlwZSlyZXR1cm4hMTt0PXRoaXMuX2dldFNjcm9sbEluZm8odCk7cmV0dXJuIXRoaXMuX2dldFNjcm9sbGluZ05vZGUoaCx0LmRlbHRhWCx0LmRlbHRhWSl9LF9nZXRTY3JvbGxhYmxlTm9kZXM6ZnVuY3Rpb24odCl7Zm9yKHZhciBsPVtdLHA9dC5pbmRleE9mKHRoaXMuY3VycmVudExvY2tpbmdFbGVtZW50KSxtPTA7bTw9cDttKyspaWYodFttXS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXt2YXIgbj10W21dLHE9bi5zdHlsZTsic2Nyb2xsIiE9PXEub3ZlcmZsb3cmJiJhdXRvIiE9PXEub3ZlcmZsb3cmJihxPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG4pKTsKInNjcm9sbCIhPT1xLm92ZXJmbG93JiYiYXV0byIhPT1xLm92ZXJmbG93fHxsLnB1c2gobil9cmV0dXJuIGx9LF9nZXRTY3JvbGxpbmdOb2RlOmZ1bmN0aW9uKHQsbCxwKXtpZihsfHxwKWZvcih2YXIgbT1NYXRoLmFicyhwKT49TWF0aC5hYnMobCksbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcT10W25dO2lmKG0/MD5wPzA8cS5zY3JvbGxUb3A6cS5zY3JvbGxUb3A8cS5zY3JvbGxIZWlnaHQtcS5jbGllbnRIZWlnaHQ6MD5sPzA8cS5zY3JvbGxMZWZ0OnEuc2Nyb2xsTGVmdDxxLnNjcm9sbFdpZHRoLXEuY2xpZW50V2lkdGgpcmV0dXJuIHF9fSxfZ2V0U2Nyb2xsSW5mbzpmdW5jdGlvbih0KXt2YXIgbD17ZGVsdGFYOnQuZGVsdGFYLGRlbHRhWTp0LmRlbHRhWX07ImRlbHRhWCJpbiB0fHwoIndoZWVsRGVsdGFYImluIHQmJiJ3aGVlbERlbHRhWSJpbiB0PyhsLmRlbHRhWD0tdC53aGVlbERlbHRhWCxsLmRlbHRhWT0tdC53aGVlbERlbHRhWSk6IndoZWVsRGVsdGEiaW4gdD8obC5kZWx0YVg9CjAsbC5kZWx0YVk9LXQud2hlZWxEZWx0YSk6ImF4aXMiaW4gdD8obC5kZWx0YVg9MT09PXQuYXhpcz90LmRldGFpbDowLGwuZGVsdGFZPTI9PT10LmF4aXM/dC5kZXRhaWw6MCk6dC50YXJnZXRUb3VjaGVzJiYodD10LnRhcmdldFRvdWNoZXNbMF0sbC5kZWx0YVg9Yi10LnBhZ2VYLGwuZGVsdGFZPWQtdC5wYWdlWSkpO3JldHVybiBsfX19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tb3ZlcmxheS1iZWhhdmlvci9pcm9uLWZvY3VzYWJsZXMtaGVscGVyLmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9RWxlbWVudC5wcm90b3R5cGUsZD1iLm1hdGNoZXN8fGIubWF0Y2hlc1NlbGVjdG9yfHxiLm1vek1hdGNoZXNTZWxlY3Rvcnx8Yi5tc01hdGNoZXNTZWxlY3Rvcnx8Yi5vTWF0Y2hlc1NlbGVjdG9yfHxiLndlYmtpdE1hdGNoZXNTZWxlY3RvcjtQb2x5bWVyLklyb25Gb2N1c2FibGVzSGVscGVyPXtnZXRUYWJiYWJsZU5vZGVzOmZ1bmN0aW9uKGYpe3ZhciBoPVtdO3JldHVybiB0aGlzLl9jb2xsZWN0VGFiYmFibGVOb2RlcyhmLGgpP3RoaXMuX3NvcnRCeVRhYkluZGV4KGgpOmh9LGlzRm9jdXNhYmxlOmZ1bmN0aW9uKGYpe3JldHVybiBkLmNhbGwoZiwiaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGJ1dHRvbiwgb2JqZWN0Iik/ZC5jYWxsKGYsIjpub3QoW2Rpc2FibGVkXSkiKTpkLmNhbGwoZiwiYVtocmVmXSwgYXJlYVtocmVmXSwgaWZyYW1lLCBbdGFiaW5kZXhdLCBbY29udGVudEVkaXRhYmxlXSIpfSxpc1RhYmJhYmxlOmZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLmlzRm9jdXNhYmxlKGYpJiYKZC5jYWxsKGYsJzpub3QoW3RhYmluZGV4XHgzZCItMSJdKScpJiZ0aGlzLl9pc1Zpc2libGUoZil9LF9ub3JtYWxpemVkVGFiSW5kZXg6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuaXNGb2N1c2FibGUoZik/KGY9Zi5nZXRBdHRyaWJ1dGUoInRhYmluZGV4Iil8fDAsTnVtYmVyKGYpKTotMX0sX2NvbGxlY3RUYWJiYWJsZU5vZGVzOmZ1bmN0aW9uKGYsaCl7aWYoZi5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFfHwhdGhpcy5faXNWaXNpYmxlKGYpKXJldHVybiExO3ZhciBrPXRoaXMuX25vcm1hbGl6ZWRUYWJJbmRleChmKSx0PTA8azswPD1rJiZoLnB1c2goZik7Zj0iY29udGVudCI9PT1mLmxvY2FsTmFtZXx8InNsb3QiPT09Zi5sb2NhbE5hbWU/UG9seW1lci5kb20oZikuZ2V0RGlzdHJpYnV0ZWROb2RlcygpOlBvbHltZXIuZG9tKGYucm9vdHx8ZikuY2hpbGRyZW47Zm9yKGs9MDtrPGYubGVuZ3RoO2srKyl0PXRoaXMuX2NvbGxlY3RUYWJiYWJsZU5vZGVzKGZba10saCl8fHQ7CnJldHVybiB0fSxfaXNWaXNpYmxlOmZ1bmN0aW9uKGYpe3ZhciBoPWYuc3R5bGU7cmV0dXJuImhpZGRlbiIhPT1oLnZpc2liaWxpdHkmJiJub25lIiE9PWguZGlzcGxheT8oaD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShmKSwiaGlkZGVuIiE9PWgudmlzaWJpbGl0eSYmIm5vbmUiIT09aC5kaXNwbGF5KTohMX0sX3NvcnRCeVRhYkluZGV4OmZ1bmN0aW9uKGYpe3ZhciBoPWYubGVuZ3RoO2lmKDI+aClyZXR1cm4gZjt2YXIgaz1NYXRoLmNlaWwoaC8yKTtoPXRoaXMuX3NvcnRCeVRhYkluZGV4KGYuc2xpY2UoMCxrKSk7Zj10aGlzLl9zb3J0QnlUYWJJbmRleChmLnNsaWNlKGspKTtyZXR1cm4gdGhpcy5fbWVyZ2VTb3J0QnlUYWJJbmRleChoLGYpfSxfbWVyZ2VTb3J0QnlUYWJJbmRleDpmdW5jdGlvbihmLGgpe2Zvcih2YXIgaz1bXTswPGYubGVuZ3RoJiYwPGgubGVuZ3RoOyl0aGlzLl9oYXNMb3dlclRhYk9yZGVyKGZbMF0saFswXSk/ay5wdXNoKGguc2hpZnQoKSk6ay5wdXNoKGYuc2hpZnQoKSk7CnJldHVybiBrLmNvbmNhdChmLGgpfSxfaGFzTG93ZXJUYWJPcmRlcjpmdW5jdGlvbihmLGgpe2Y9TWF0aC5tYXgoZi50YWJJbmRleCwwKTtoPU1hdGgubWF4KGgudGFiSW5kZXgsMCk7cmV0dXJuIDA9PT1mfHwwPT09aD9oPmY6Zj5ofX19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tb3ZlcmxheS1iZWhhdmlvci9pcm9uLW92ZXJsYXktYmVoYXZpb3IuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntvcGVuZWQ6e29ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCIsdHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sY2FuY2VsZWQ6e29ic2VydmVyOiJfY2FuY2VsZWRDaGFuZ2VkIixyZWFkT25seTohMCx0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHdpdGhCYWNrZHJvcDp7b2JzZXJ2ZXI6Il93aXRoQmFja2Ryb3BDaGFuZ2VkIix0eXBlOkJvb2xlYW59LG5vQXV0b0ZvY3VzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQ2FuY2VsT25Fc2NLZXk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9DYW5jZWxPbk91dHNpZGVDbGljazp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxjbG9zaW5nUmVhc29uOnt0eXBlOk9iamVjdH0scmVzdG9yZUZvY3VzT25DbG9zZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbGxvd0NsaWNrVGhyb3VnaDp7dHlwZTpCb29sZWFufSxhbHdheXNPblRvcDp7dHlwZTpCb29sZWFufSwKc2Nyb2xsQWN0aW9uOnt0eXBlOlN0cmluZ30sX21hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOlBvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyfSxfZm9jdXNlZENoaWxkOnt0eXBlOk9iamVjdH19LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uSXJvblJlc2l6ZSJ9LG9ic2VydmVyczpbIl9fdXBkYXRlU2Nyb2xsT2JzZXJ2ZXJzKGlzQXR0YWNoZWQsIG9wZW5lZCwgc2Nyb2xsQWN0aW9uKSJdLGdldCBiYWNrZHJvcEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fbWFuYWdlci5iYWNrZHJvcEVsZW1lbnR9LGdldCBfZm9jdXNOb2RlKCl7cmV0dXJuIHRoaXMuX2ZvY3VzZWRDaGlsZHx8UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvcigiW2F1dG9mb2N1c10iKXx8dGhpc30sZ2V0IF9mb2N1c2FibGVOb2Rlcygpe3JldHVybiBQb2x5bWVyLklyb25Gb2N1c2FibGVzSGVscGVyLmdldFRhYmJhYmxlTm9kZXModGhpcyl9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4PQp0aGlzLl9faXNBbmltYXRpbmc9ITE7dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT10aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9bnVsbDt0aGlzLl9fcmFmcz17fTt0aGlzLl9fc2Nyb2xsVG9wPXRoaXMuX19zY3JvbGxMZWZ0PXRoaXMuX19yZXN0b3JlRm9jdXNOb2RlPW51bGw7dGhpcy5fX29uQ2FwdHVyZVNjcm9sbD10aGlzLl9fb25DYXB0dXJlU2Nyb2xsLmJpbmQodGhpcyk7dGhpcy5fX3Jvb3ROb2Rlcz1udWxsO3RoaXMuX2Vuc3VyZVNldHVwKCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJnRoaXMuX29wZW5lZENoYW5nZWQodGhpcy5vcGVuZWQpO3RoaXMuX29ic2VydmVyPVBvbHltZXIuZG9tKHRoaXMpLm9ic2VydmVOb2Rlcyh0aGlzLl9vbk5vZGVzQ2hhbmdlKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLmRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlcik7dGhpcy5fb2JzZXJ2ZXI9bnVsbDtmb3IodmFyIGIgaW4gdGhpcy5fX3JhZnMpbnVsbCE9PQp0aGlzLl9fcmFmc1tiXSYmY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fX3JhZnNbYl0pO3RoaXMuX19yYWZzPXt9O3RoaXMuX21hbmFnZXIucmVtb3ZlT3ZlcmxheSh0aGlzKTt0aGlzLl9faXNBbmltYXRpbmcmJih0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKToodGhpcy5fYXBwbHlGb2N1cygpLHRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpKSl9LHRvZ2dsZTpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKTt0aGlzLm9wZW5lZD0hdGhpcy5vcGVuZWR9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSk7dGhpcy5vcGVuZWQ9ITB9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpO3RoaXMub3BlbmVkPSExfSxjYW5jZWw6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJpcm9uLW92ZXJsYXktY2FuY2VsZWQiLGIse2NhbmNlbGFibGU6ITB9KS5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5fc2V0Q2FuY2VsZWQoITApLHRoaXMub3BlbmVkPQohMSl9LGludmFsaWRhdGVUYWJiYWJsZXM6ZnVuY3Rpb24oKXt0aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlPXRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZT1udWxsfSxfZW5zdXJlU2V0dXA6ZnVuY3Rpb24oKXt0aGlzLl9vdmVybGF5U2V0dXB8fCh0aGlzLl9vdmVybGF5U2V0dXA9ITAsdGhpcy5zdHlsZS5vdXRsaW5lPSJub25lIix0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oYil7Yj90aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKTp0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIik7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fX2lzQW5pbWF0aW5nPSEwLHRoaXMuX19kZXJhZigiX19vcGVuZWRDaGFuZ2VkIix0aGlzLl9fb3BlbmVkQ2hhbmdlZCkpfSxfY2FuY2VsZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5jbG9zaW5nUmVhc29uPXRoaXMuY2xvc2luZ1JlYXNvbnx8e307dGhpcy5jbG9zaW5nUmVhc29uLmNhbmNlbGVkPQp0aGlzLmNhbmNlbGVkfSxfd2l0aEJhY2tkcm9wQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMud2l0aEJhY2tkcm9wJiYhdGhpcy5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iik/KHRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIiksdGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4PSEwKTp0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXgmJih0aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9ITEpO3RoaXMub3BlbmVkJiZ0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX21hbmFnZXIudHJhY2tCYWNrZHJvcCgpfSxfcHJlcGFyZVJlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMuX19yZXN0b3JlRm9jdXNOb2RlPXRoaXMuX21hbmFnZXIuZGVlcEFjdGl2ZUVsZW1lbnQ7dGhpcy5fcHJlcGFyZVBvc2l0aW9uaW5nKCk7dGhpcy5yZWZpdCgpO3RoaXMuX2ZpbmlzaFBvc2l0aW9uaW5nKCk7dGhpcy5ub0F1dG9Gb2N1cyYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PQp0aGlzLl9mb2N1c05vZGUmJih0aGlzLl9mb2N1c05vZGUuYmx1cigpLHRoaXMuX19yZXN0b3JlRm9jdXNOb2RlLmZvY3VzKCkpfSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCl9LF9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKX0sX2ZpbmlzaFJlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMubm90aWZ5UmVzaXplKCk7dGhpcy5fX2lzQW5pbWF0aW5nPSExO3RoaXMuZmlyZSgiaXJvbi1vdmVybGF5LW9wZW5lZCIpfSxfZmluaXNoUmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLnN0eWxlLnpJbmRleD0iIjt0aGlzLm5vdGlmeVJlc2l6ZSgpO3RoaXMuX19pc0FuaW1hdGluZz0hMTt0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1jbG9zZWQiLHRoaXMuY2xvc2luZ1JlYXNvbil9LF9wcmVwYXJlUG9zaXRpb25pbmc6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnRyYW5zaXRpb249CnRoaXMuc3R5bGUud2Via2l0VHJhbnNpdGlvbj0ibm9uZSI7dGhpcy5zdHlsZS50cmFuc2Zvcm09dGhpcy5zdHlsZS53ZWJraXRUcmFuc2Zvcm09Im5vbmUiO3RoaXMuc3R5bGUuZGlzcGxheT0iIn0sX2ZpbmlzaFBvc2l0aW9uaW5nOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLnNjcm9sbFRvcD10aGlzLnNjcm9sbFRvcDt0aGlzLnN0eWxlLnRyYW5zaXRpb249dGhpcy5zdHlsZS53ZWJraXRUcmFuc2l0aW9uPSIiO3RoaXMuc3R5bGUudHJhbnNmb3JtPXRoaXMuc3R5bGUud2Via2l0VHJhbnNmb3JtPSIiO3RoaXMuc3R5bGUuZGlzcGxheT0iIjt0aGlzLnNjcm9sbFRvcD10aGlzLnNjcm9sbFRvcH0sX2FwcGx5Rm9jdXM6ZnVuY3Rpb24oKXtpZih0aGlzLm9wZW5lZCl0aGlzLm5vQXV0b0ZvY3VzfHx0aGlzLl9mb2N1c05vZGUuZm9jdXMoKTtlbHNle3RoaXMuX2ZvY3VzTm9kZS5ibHVyKCk7dGhpcy5fZm9jdXNlZENoaWxkPW51bGw7aWYodGhpcy5yZXN0b3JlRm9jdXNPbkNsb3NlJiYKdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGUpe3ZhciBiPXRoaXMuX21hbmFnZXIuZGVlcEFjdGl2ZUVsZW1lbnQ7KGI9PT1kb2N1bWVudC5ib2R5fHxQb2x5bWVyLmRvbSh0aGlzKS5kZWVwQ29udGFpbnMoYikpJiZ0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZS5mb2N1cygpfXRoaXMuX19yZXN0b3JlRm9jdXNOb2RlPW51bGw7KGI9dGhpcy5fbWFuYWdlci5jdXJyZW50T3ZlcmxheSgpKSYmdGhpcyE9PWImJmIuX2FwcGx5Rm9jdXMoKX19LF9vbkNhcHR1cmVDbGljazpmdW5jdGlvbihiKXt0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2t8fHRoaXMuY2FuY2VsKGIpfSxfb25DYXB0dXJlRm9jdXM6ZnVuY3Rpb24oYil7aWYodGhpcy53aXRoQmFja2Ryb3Ape3ZhciBkPVBvbHltZXIuZG9tKGIpLnBhdGg7LTE9PT1kLmluZGV4T2YodGhpcyk/KGIuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fYXBwbHlGb2N1cygpKTp0aGlzLl9mb2N1c2VkQ2hpbGQ9ZFswXX19LF9vbkNhcHR1cmVFc2M6ZnVuY3Rpb24oYil7dGhpcy5ub0NhbmNlbE9uRXNjS2V5fHwKdGhpcy5jYW5jZWwoYil9LF9vbkNhcHR1cmVUYWI6ZnVuY3Rpb24oYil7aWYodGhpcy53aXRoQmFja2Ryb3Ape3RoaXMuX19lbnN1cmVGaXJzdExhc3RGb2N1c2FibGVzKCk7dmFyIGQ9Yi5zaGlmdEtleSxmPWQ/dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZTp0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU7ZD1kP3RoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZTp0aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlO2lmKGY9PT1kKWY9ITA7ZWxzZXt2YXIgaD10aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50O2Y9aD09PWZ8fGg9PT10aGlzfWYmJihiLnByZXZlbnREZWZhdWx0KCksdGhpcy5fZm9jdXNlZENoaWxkPWQsdGhpcy5fYXBwbHlGb2N1cygpKX19LF9vbklyb25SZXNpemU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMuX19pc0FuaW1hdGluZyYmdGhpcy5fX2RlcmFmKCJyZWZpdCIsdGhpcy5yZWZpdCl9LF9vbk5vZGVzQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJiF0aGlzLl9faXNBbmltYXRpbmcmJgoodGhpcy5pbnZhbGlkYXRlVGFiYmFibGVzKCksdGhpcy5ub3RpZnlSZXNpemUoKSl9LF9fZW5zdXJlRmlyc3RMYXN0Rm9jdXNhYmxlczpmdW5jdGlvbigpe2lmKCF0aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlfHwhdGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlKXt2YXIgYj10aGlzLl9mb2N1c2FibGVOb2Rlczt0aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlPWJbMF07dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlPWJbYi5sZW5ndGgtMV19fSxfX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD8odGhpcy5fcHJlcGFyZVJlbmRlck9wZW5lZCgpLHRoaXMuX21hbmFnZXIuYWRkT3ZlcmxheSh0aGlzKSx0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fcmVuZGVyT3BlbmVkKCkpOih0aGlzLl9tYW5hZ2VyLnJlbW92ZU92ZXJsYXkodGhpcyksdGhpcy5fYXBwbHlGb2N1cygpLHRoaXMuX3JlbmRlckNsb3NlZCgpKX0sX19kZXJhZjpmdW5jdGlvbihiLGQpe3ZhciBmPXRoaXMuX19yYWZzOwpudWxsIT09ZltiXSYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoZltiXSk7ZltiXT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtmW2JdPW51bGw7ZC5jYWxsKHRoaXMpfS5iaW5kKHRoaXMpKX0sX191cGRhdGVTY3JvbGxPYnNlcnZlcnM6ZnVuY3Rpb24oYixkLGYpe2ImJmQmJnRoaXMuX19pc1ZhbGlkU2Nyb2xsQWN0aW9uKGYpPygibG9jayI9PT1mJiYodGhpcy5fX3NhdmVTY3JvbGxQb3NpdGlvbigpLFBvbHltZXIuSXJvblNjcm9sbE1hbmFnZXIucHVzaFNjcm9sbExvY2sodGhpcykpLHRoaXMuX19hZGRTY3JvbGxMaXN0ZW5lcnMoKSk6KFBvbHltZXIuSXJvblNjcm9sbE1hbmFnZXIucmVtb3ZlU2Nyb2xsTG9jayh0aGlzKSx0aGlzLl9fcmVtb3ZlU2Nyb2xsTGlzdGVuZXJzKCkpfSxfX2FkZFNjcm9sbExpc3RlbmVyczpmdW5jdGlvbigpe2lmKCF0aGlzLl9fcm9vdE5vZGVzKXt0aGlzLl9fcm9vdE5vZGVzPVtdO2lmKFBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93KWZvcih2YXIgYj0KdGhpcztiOyliLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZiLmhvc3QmJnRoaXMuX19yb290Tm9kZXMucHVzaChiKSxiPWIuaG9zdHx8Yi5hc3NpZ25lZFNsb3R8fGIucGFyZW50Tm9kZTt0aGlzLl9fcm9vdE5vZGVzLnB1c2goZG9jdW1lbnQpfXRoaXMuX19yb290Tm9kZXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5fX29uQ2FwdHVyZVNjcm9sbCx7Y2FwdHVyZTohMCxwYXNzaXZlOiEwfSl9LHRoaXMpfSxfX3JlbW92ZVNjcm9sbExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX19yb290Tm9kZXMmJnRoaXMuX19yb290Tm9kZXMuZm9yRWFjaChmdW5jdGlvbihiKXtiLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5fX29uQ2FwdHVyZVNjcm9sbCx7Y2FwdHVyZTohMCxwYXNzaXZlOiEwfSl9LHRoaXMpO3RoaXMuaXNBdHRhY2hlZHx8KHRoaXMuX19yb290Tm9kZXM9bnVsbCl9LF9faXNWYWxpZFNjcm9sbEFjdGlvbjpmdW5jdGlvbihiKXtyZXR1cm4ibG9jayI9PT0KYnx8InJlZml0Ij09PWJ8fCJjYW5jZWwiPT09Yn0sX19vbkNhcHR1cmVTY3JvbGw6ZnVuY3Rpb24oYil7aWYoISh0aGlzLl9faXNBbmltYXRpbmd8fDA8PVBvbHltZXIuZG9tKGIpLnBhdGguaW5kZXhPZih0aGlzKSkpc3dpdGNoKHRoaXMuc2Nyb2xsQWN0aW9uKXtjYXNlICJsb2NrIjp0aGlzLl9fcmVzdG9yZVNjcm9sbFBvc2l0aW9uKCk7YnJlYWs7Y2FzZSAicmVmaXQiOnRoaXMuX19kZXJhZigicmVmaXQiLHRoaXMucmVmaXQpO2JyZWFrO2Nhc2UgImNhbmNlbCI6dGhpcy5jYW5jZWwoYil9fSxfX3NhdmVTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe2RvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQ/KHRoaXMuX19zY3JvbGxUb3A9ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUb3AsdGhpcy5fX3Njcm9sbExlZnQ9ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxMZWZ0KToodGhpcy5fX3Njcm9sbFRvcD1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wLApkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCksdGhpcy5fX3Njcm9sbExlZnQ9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KSl9LF9fcmVzdG9yZVNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudD8oZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbFRvcCxkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbExlZnQ9dGhpcy5fX3Njcm9sbExlZnQpOihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wPWRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wPXRoaXMuX19zY3JvbGxUb3AsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ9ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0PXRoaXMuX19zY3JvbGxMZWZ0KX19O1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvcj1bUG9seW1lci5Jcm9uRml0QmVoYXZpb3IsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsClBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGxdfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9uZW9uLWFuaW1hdGFibGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLk5lb25BbmltYXRhYmxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2FuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3R9LGVudHJ5QW5pbWF0aW9uOntvYnNlcnZlcjoiX2VudHJ5QW5pbWF0aW9uQ2hhbmdlZCIsdHlwZTpTdHJpbmd9LGV4aXRBbmltYXRpb246e29ic2VydmVyOiJfZXhpdEFuaW1hdGlvbkNoYW5nZWQiLHR5cGU6U3RyaW5nfX0sX2VudHJ5QW5pbWF0aW9uQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uQ29uZmlnPXRoaXMuYW5pbWF0aW9uQ29uZmlnfHx7fTt0aGlzLmFuaW1hdGlvbkNvbmZpZy5lbnRyeT1be25hbWU6dGhpcy5lbnRyeUFuaW1hdGlvbixub2RlOnRoaXN9XX0sX2V4aXRBbmltYXRpb25DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25Db25maWc9dGhpcy5hbmltYXRpb25Db25maWd8fHt9O3RoaXMuYW5pbWF0aW9uQ29uZmlnLmV4aXQ9W3tuYW1lOnRoaXMuZXhpdEFuaW1hdGlvbixub2RlOnRoaXN9XX0sX2NvcHlQcm9wZXJ0aWVzOmZ1bmN0aW9uKGIsCmQpe2Zvcih2YXIgZiBpbiBkKWJbZl09ZFtmXX0sX2Nsb25lQ29uZmlnOmZ1bmN0aW9uKGIpe3ZhciBkPXtpc0Nsb25lOiEwfTt0aGlzLl9jb3B5UHJvcGVydGllcyhkLGIpO3JldHVybiBkfSxfZ2V0QW5pbWF0aW9uQ29uZmlnUmVjdXJzaXZlOmZ1bmN0aW9uKGIsZCxmKXtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZylpZih0aGlzLmFuaW1hdGlvbkNvbmZpZy52YWx1ZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmFuaW1hdGlvbkNvbmZpZy52YWx1ZSl0aGlzLl93YXJuKHRoaXMuX2xvZ2YoInBsYXlBbmltYXRpb24iLCJQbGVhc2UgcHV0ICdhbmltYXRpb25Db25maWcnIGluc2lkZSBvZiB5b3VyIGNvbXBvbmVudHMgJ3Byb3BlcnRpZXMnIG9iamVjdCBpbnN0ZWFkIG9mIG91dHNpZGUgb2YgaXQuIikpO2Vsc2V7dmFyIGg9Yj90aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXTp0aGlzLmFuaW1hdGlvbkNvbmZpZztBcnJheS5pc0FycmF5KGgpfHwoaD1baF0pO2lmKGgpZm9yKHZhciBrLHQ9MDtrPQpoW3RdO3QrKylpZihrLmFuaW1hdGFibGUpay5hbmltYXRhYmxlLl9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmUoay50eXBlfHxiLGQsZik7ZWxzZSBpZihrLmlkKXt2YXIgbD1kW2suaWRdO2w/KGwuaXNDbG9uZXx8KGRbay5pZF09dGhpcy5fY2xvbmVDb25maWcobCksbD1kW2suaWRdKSx0aGlzLl9jb3B5UHJvcGVydGllcyhsLGspKTpkW2suaWRdPWt9ZWxzZSBmLnB1c2goayl9fSxnZXRBbmltYXRpb25Db25maWc6ZnVuY3Rpb24oYil7dmFyIGQ9e30sZj1bXTt0aGlzLl9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmUoYixkLGYpO2Zvcih2YXIgaCBpbiBkKWYucHVzaChkW2hdKTtyZXR1cm4gZn19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL25lb24tYW5pbWF0aW9uLXJ1bm5lci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9ySW1wbD17X2NvbmZpZ3VyZUFuaW1hdGlvbnM6ZnVuY3Rpb24oYil7dmFyIGQ9W10sZj1bXTtpZigwPGIubGVuZ3RoKWZvcih2YXIgaCxrPTA7aD1iW2tdO2srKyl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChoLm5hbWUpO2lmKHQuaXNOZW9uQW5pbWF0aW9uKXt2YXIgbD1udWxsO3QuY29uZmlndXJlfHwodC5jb25maWd1cmU9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0pO2w9dC5jb25maWd1cmUoaCk7Zi5wdXNoKHtyZXN1bHQ6bCxjb25maWc6aH0pfWVsc2UgY29uc29sZS53YXJuKHRoaXMuaXMrIjoiLGgubmFtZSwibm90IGZvdW5kISIpfWZvcihiPTA7YjxmLmxlbmd0aDtiKyspe2w9ZltiXS5yZXN1bHQ7aD1mW2JdLmNvbmZpZzt0cnl7ImZ1bmN0aW9uIiE9dHlwZW9mIGwuY2FuY2VsJiYobD1kb2N1bWVudC50aW1lbGluZS5wbGF5KGwpKX1jYXRjaChwKXtsPW51bGwsY29uc29sZS53YXJuKCJDb3VsZG50IHBsYXkiLAoiKCIsaC5uYW1lLCIpLiIscCl9bCYmZC5wdXNoKHtuZW9uQW5pbWF0aW9uOnQsY29uZmlnOmgsYW5pbWF0aW9uOmx9KX1yZXR1cm4gZH0sX3Nob3VsZENvbXBsZXRlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZD0hMCxmPTA7ZjxiLmxlbmd0aDtmKyspaWYoImZpbmlzaGVkIiE9YltmXS5hbmltYXRpb24ucGxheVN0YXRlKXtkPSExO2JyZWFrfXJldHVybiBkfSxfY29tcGxldGU6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspYltkXS5uZW9uQW5pbWF0aW9uLmNvbXBsZXRlKGJbZF0uY29uZmlnKTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWJbZF0uYW5pbWF0aW9uLmNhbmNlbCgpfSxwbGF5QW5pbWF0aW9uOmZ1bmN0aW9uKGIsZCl7dmFyIGY9dGhpcy5nZXRBbmltYXRpb25Db25maWcoYik7aWYoZil7dGhpcy5fYWN0aXZlPXRoaXMuX2FjdGl2ZXx8e307dGhpcy5fYWN0aXZlW2JdJiYodGhpcy5fY29tcGxldGUodGhpcy5fYWN0aXZlW2JdKSxkZWxldGUgdGhpcy5fYWN0aXZlW2JdKTsKdmFyIGg9dGhpcy5fY29uZmlndXJlQW5pbWF0aW9ucyhmKTtpZigwPT1oLmxlbmd0aCl0aGlzLmZpcmUoIm5lb24tYW5pbWF0aW9uLWZpbmlzaCIsZCx7YnViYmxlczohMX0pO2Vsc2UgZm9yKHRoaXMuX2FjdGl2ZVtiXT1oLGY9MDtmPGgubGVuZ3RoO2YrKyloW2ZdLmFuaW1hdGlvbi5vbmZpbmlzaD1mdW5jdGlvbigpe3RoaXMuX3Nob3VsZENvbXBsZXRlKGgpJiYodGhpcy5fY29tcGxldGUoaCksZGVsZXRlIHRoaXMuX2FjdGl2ZVtiXSx0aGlzLmZpcmUoIm5lb24tYW5pbWF0aW9uLWZpbmlzaCIsZCx7YnViYmxlczohMX0pKX0uYmluZCh0aGlzKX19LGNhbmNlbEFuaW1hdGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgYiBpbiB0aGlzLl9hY3RpdmUpe3ZhciBkPXRoaXMuX2FjdGl2ZVtiXSxmO2ZvcihmIGluIGQpZFtmXS5hbmltYXRpb24uY2FuY2VsKCl9dGhpcy5fYWN0aXZlPXt9fX07ClBvbHltZXIuTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9yPVtQb2x5bWVyLk5lb25BbmltYXRhYmxlQmVoYXZpb3IsUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWRyb3Bkb3duL2lyb24tZHJvcGRvd24tc2Nyb2xsLW1hbmFnZXIuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyLklyb25Ecm9wZG93blNjcm9sbE1hbmFnZXI9UG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlcn0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1kcm9wZG93bi9pcm9uLWRyb3Bkb3duLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6Imlyb24tZHJvcGRvd24iLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yLFBvbHltZXIuTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9yXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0IixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sb3BlbkFuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3R9LGNsb3NlQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sZm9jdXNUYXJnZXQ6e3R5cGU6T2JqZWN0fSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9hbGxvd091dHNpZGVTY3JvbGxDaGFuZ2VkIn19LApsaXN0ZW5lcnM6eyJuZW9uLWFuaW1hdGlvbi1maW5pc2giOiJfb25OZW9uQW5pbWF0aW9uRmluaXNoIn0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZU92ZXJsYXlQb3NpdGlvbihwb3NpdGlvblRhcmdldCwgdmVydGljYWxBbGlnbiwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbE9mZnNldCwgaG9yaXpvbnRhbE9mZnNldCkiXSxnZXQgY29udGFpbmVkRWxlbWVudCgpe2Zvcih2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzLiQuY29udGVudCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpLGQ9MCxmPWIubGVuZ3RoO2Q8ZjtkKyspaWYoYltkXS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiBiW2RdfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsQWN0aW9ufHwodGhpcy5zY3JvbGxBY3Rpb249dGhpcy5hbGxvd091dHNpZGVTY3JvbGw/InJlZml0IjoibG9jayIpO3RoaXMuX3JlYWRpZWQ9ITB9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zaXppbmdUYXJnZXQmJnRoaXMuc2l6aW5nVGFyZ2V0IT09CnRoaXN8fCh0aGlzLnNpemluZ1RhcmdldD10aGlzLmNvbnRhaW5lZEVsZW1lbnR8fHRoaXMpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJnRoaXMuZGlzYWJsZWQ/dGhpcy5jYW5jZWwoKToodGhpcy5jYW5jZWxBbmltYXRpb24oKSx0aGlzLl91cGRhdGVBbmltYXRpb25Db25maWcoKSxQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9vcGVuZWRDaGFuZ2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXshdGhpcy5ub0FuaW1hdGlvbnMmJnRoaXMuYW5pbWF0aW9uQ29uZmlnLm9wZW4/KHRoaXMuJC5jb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKCJhbmltYXRpbmciKSx0aGlzLnBsYXlBbmltYXRpb24oIm9wZW4iKSk6UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fcmVuZGVyT3BlbmVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sCl9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXshdGhpcy5ub0FuaW1hdGlvbnMmJnRoaXMuYW5pbWF0aW9uQ29uZmlnLmNsb3NlPyh0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgiYW5pbWF0aW5nIiksdGhpcy5wbGF5QW5pbWF0aW9uKCJjbG9zZSIpKTpQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9yZW5kZXJDbG9zZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfb25OZW9uQW5pbWF0aW9uRmluaXNoOmZ1bmN0aW9uKCl7dGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoImFuaW1hdGluZyIpO3RoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOnRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfdXBkYXRlQW5pbWF0aW9uQ29uZmlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuY29udGFpbmVkRWxlbWVudCxkPVtdLmNvbmNhdCh0aGlzLm9wZW5BbmltYXRpb25Db25maWd8fFtdKS5jb25jYXQodGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZ3x8CltdKSxmPTA7ZjxkLmxlbmd0aDtmKyspZFtmXS5ub2RlPWI7dGhpcy5hbmltYXRpb25Db25maWc9e29wZW46dGhpcy5vcGVuQW5pbWF0aW9uQ29uZmlnLGNsb3NlOnRoaXMuY2xvc2VBbmltYXRpb25Db25maWd9fSxfdXBkYXRlT3ZlcmxheVBvc2l0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLm5vdGlmeVJlc2l6ZSgpfSxfYWxsb3dPdXRzaWRlU2Nyb2xsQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9yZWFkaWVkJiYoYj90aGlzLnNjcm9sbEFjdGlvbiYmImxvY2siIT09dGhpcy5zY3JvbGxBY3Rpb258fCh0aGlzLnNjcm9sbEFjdGlvbj0icmVmaXQiKTp0aGlzLnNjcm9sbEFjdGlvbj0ibG9jayIpfSxfYXBwbHlGb2N1czpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZm9jdXNUYXJnZXR8fHRoaXMuY29udGFpbmVkRWxlbWVudDtiJiZ0aGlzLm9wZW5lZCYmIXRoaXMubm9BdXRvRm9jdXM/Yi5mb2N1cygpOlBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX2FwcGx5Rm9jdXMuYXBwbHkodGhpcywKYXJndW1lbnRzKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbmVvbi1hbmltYXRpb24vbmVvbi1hbmltYXRpb24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcj17cHJvcGVydGllczp7YW5pbWF0aW9uVGltaW5nOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybntkdXJhdGlvbjo1MDAsZWFzaW5nOiJjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpIixmaWxsOiJib3RoIn19fX0saXNOZW9uQW5pbWF0aW9uOiEwLGNyZWF0ZWQ6ZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmFuaW1hdGV8fGNvbnNvbGUud2FybigiTm8gd2ViIGFuaW1hdGlvbnMgZGV0ZWN0ZWQuIFRoaXMgZWxlbWVudCB3aWxsIG5vdCBmdW5jdGlvbiB3aXRob3V0IGEgd2ViIGFuaW1hdGlvbnMgcG9seWZpbGwuIil9LHRpbWluZ0Zyb21Db25maWc6ZnVuY3Rpb24oYil7aWYoYi50aW1pbmcpZm9yKHZhciBkIGluIGIudGltaW5nKXRoaXMuYW5pbWF0aW9uVGltaW5nW2RdPWIudGltaW5nW2RdO3JldHVybiB0aGlzLmFuaW1hdGlvblRpbWluZ30sc2V0UHJlZml4ZWRQcm9wZXJ0eTpmdW5jdGlvbihiLGQsZil7Zm9yKHZhciBoPQp7dHJhbnNmb3JtOlsid2Via2l0VHJhbnNmb3JtIl0sdHJhbnNmb3JtT3JpZ2luOlsibW96VHJhbnNmb3JtT3JpZ2luIiwid2Via2l0VHJhbnNmb3JtT3JpZ2luIl19W2RdLGssdD0wO2s9aFt0XTt0KyspYi5zdHlsZVtrXT1mO2Iuc3R5bGVbZF09Zn0sY29tcGxldGU6ZnVuY3Rpb24oKXt9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9hbmltYXRpb25zL2ZhZGUtaW4tYW5pbWF0aW9uLmh0bWwuanMKUG9seW1lcih7aXM6ImZhZGUtaW4tYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoYi5ub2RlLFt7b3BhY2l0eToiMCJ9LHtvcGFjaXR5OiIxIn1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyhiKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbmVvbi1hbmltYXRpb24vYW5pbWF0aW9ucy9mYWRlLW91dC1hbmltYXRpb24uaHRtbC5qcwpQb2x5bWVyKHtpczoiZmFkZS1vdXQtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoYi5ub2RlLFt7b3BhY2l0eToiMSJ9LHtvcGFjaXR5OiIwIn1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyhiKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItbWVudS1idXR0b24vcGFwZXItbWVudS1idXR0b24tYW5pbWF0aW9ucy5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGIpe3ZhciBkPWIubm9kZSxmPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGQsW3toZWlnaHQ6Zi8yKyJweCJ9LHtoZWlnaHQ6ZisicHgifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTtQb2x5bWVyKHtpczoicGFwZXItbWVudS1ncm93LXdpZHRoLWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGIpe3ZhciBkPWIubm9kZSxmPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoZCxbe3dpZHRoOmYvMisicHgifSx7d2lkdGg6ZisicHgifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKUG9seW1lcih7aXM6InBhcGVyLW1lbnUtc2hyaW5rLXdpZHRoLWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGIpe3ZhciBkPWIubm9kZSxmPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoZCxbe3dpZHRoOmYrInB4In0se3dpZHRoOmYtZi8yMCsicHgifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKUG9seW1lcih7aXM6InBhcGVyLW1lbnUtc2hyaW5rLWhlaWdodC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXt2YXIgZD1iLm5vZGUsZj1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDt0aGlzLnNldFByZWZpeGVkUHJvcGVydHkoZCwidHJhbnNmb3JtT3JpZ2luIiwiMCAwIik7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoZCxbe2hlaWdodDpmKyJweCIsdHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDApIn0se2hlaWdodDpmLzIrInB4Iix0cmFuc2Zvcm06InRyYW5zbGF0ZVkoLTIwcHgpIn1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyhiKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItbWVudS1idXR0b24vcGFwZXItbWVudS1idXR0b24uaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj17QU5JTUFUSU9OX0NVQklDX0JFWklFUjoiY3ViaWMtYmV6aWVyKC4zLC45NSwuNSwxKSIsTUFYX0FOSU1BVElPTl9USU1FX01TOjQwMH07UG9seW1lci5QYXBlck1lbnVCdXR0b249ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5yZWdpc3RlcmVkPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuYWRkT3duS2V5QmluZGluZz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLnJlbW92ZU93bktleUJpbmRpbmdzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2NvbGxlY3RLZXlCaW5kaW5ncz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9wcmVwS2V5QmluZGluZ3M9CmZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2FkZEtleUJpbmRpbmc9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fcmVzZXRLZXlFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX29uS2V5QmluZGluZ0V2ZW50PWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3RyaWdnZXJLZXlIYW5kbGVyPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2ZvY3VzQmx1ckhhbmRsZXI9ZnVuY3Rpb24oZCl7aWYoUG9seW1lci5FbGVtZW50KXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PQpkLnR5cGUpO2Vsc2UgaWYoZC50YXJnZXQ9PT10aGlzKXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWQudHlwZSk7ZWxzZSBpZih0aGlzLl9faGFuZGxlRXZlbnRSZXRhcmdldGluZyl7dmFyIGY9UG9seW1lci5kb20oZCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChmKXx8dGhpcy5maXJlKGQudHlwZSx7c291cmNlRXZlbnQ6ZH0se25vZGU6dGhpcyxidWJibGVzOmQuYnViYmxlcyxjYW5jZWxhYmxlOmQuY2FuY2VsYWJsZX0pfX07UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9jaGFuZ2VkQ29udHJvbFN0YXRlPWZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3NldEZvY3VzZWQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uPVBvbHltZXIoe2lzOiJwYXBlci1tZW51LWJ1dHRvbiIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLApQb2x5bWVyLklyb25Db250cm9sU3RhdGVdLHByb3BlcnRpZXM6e29wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0IixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saWdub3JlU2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNsb3NlT25BY3RpdmF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdCwKdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5be25hbWU6ImZhZGUtaW4tYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjoyMDB9fSx7bmFtZToicGFwZXItbWVudS1ncm93LXdpZHRoLWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246MTUwLGVhc2luZzpiLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fSx7bmFtZToicGFwZXItbWVudS1ncm93LWhlaWdodC1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjI3NSxlYXNpbmc6Yi5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX1dfX0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW3tuYW1lOiJmYWRlLW91dC1hbmltYXRpb24iLHRpbWluZzp7ZHVyYXRpb246MTUwfX0se25hbWU6InBhcGVyLW1lbnUtc2hyaW5rLXdpZHRoLWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246NTAsZWFzaW5nOmIuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19LAp7bmFtZToicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkdXJhdGlvbjoyMDAsZWFzaW5nOiJlYXNlLWluIn19XX19LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9kcm9wZG93bkNvbnRlbnQ6e3R5cGU6T2JqZWN0fX0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6Imdyb3VwIiwiYXJpYS1oYXNwb3B1cCI6InRydWUifSxsaXN0ZW5lcnM6eyJpcm9uLWFjdGl2YXRlIjoiX29uSXJvbkFjdGl2YXRlIiwiaXJvbi1zZWxlY3QiOiJfb25Jcm9uU2VsZWN0In0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciBkPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZj0wLGg9ZC5sZW5ndGg7ZjxoO2YrKylpZihkW2ZdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGRbZl19LHRvZ2dsZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPwp0aGlzLmNsb3NlKCk6dGhpcy5vcGVuKCl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkfHx0aGlzLiQuZHJvcGRvd24ub3BlbigpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuJC5kcm9wZG93bi5jbG9zZSgpfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKCl7dGhpcy5pZ25vcmVTZWxlY3R8fHRoaXMuY2xvc2UoKX0sX29uSXJvbkFjdGl2YXRlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZU9uQWN0aXZhdGUmJnRoaXMuY2xvc2UoKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtkPyh0aGlzLl9kcm9wZG93bkNvbnRlbnQ9dGhpcy5jb250ZW50RWxlbWVudCx0aGlzLmZpcmUoInBhcGVyLWRyb3Bkb3duLW9wZW4iKSk6bnVsbCE9ZiYmdGhpcy5maXJlKCJwYXBlci1kcm9wZG93bi1jbG9zZSIpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKGQpe1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZS5fZGlzYWJsZWRDaGFuZ2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkJiZ0aGlzLm9wZW5lZCYmCnRoaXMuY2xvc2UoKX0sX19vbklyb25PdmVybGF5Q2FuY2VsZWQ6ZnVuY3Rpb24oZCl7dmFyIGY9dGhpcy4kLnRyaWdnZXI7LTE8UG9seW1lci5kb20oZC5kZXRhaWwpLnBhdGguaW5kZXhPZihmKSYmZC5wcmV2ZW50RGVmYXVsdCgpfX0pO09iamVjdC5rZXlzKGIpLmZvckVhY2goZnVuY3Rpb24oZCl7UG9seW1lci5QYXBlck1lbnVCdXR0b25bZF09YltkXX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWljb25zZXQtc3ZnL2lyb24taWNvbnNldC1zdmcuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1pY29uc2V0LXN2ZyIscHJvcGVydGllczp7bmFtZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9uYW1lQ2hhbmdlZCJ9LHNpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjI0fSxydGxNaXJyb3Jpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sdXNlR2xvYmFsUnRsQXR0cmlidXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fbWV0YT1uZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZToiaWNvbnNldCIsa2V5Om51bGwsdmFsdWU6bnVsbH0pfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGdldEljb25OYW1lczpmdW5jdGlvbigpe3RoaXMuX2ljb25zPXRoaXMuX2NyZWF0ZUljb25NYXAoKTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5faWNvbnMpLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5uYW1lKyI6IitifSx0aGlzKX0sYXBwbHlJY29uOmZ1bmN0aW9uKGIsZCl7dGhpcy5yZW1vdmVJY29uKGIpOwppZihkPXRoaXMuX2Nsb25lSWNvbihkLHRoaXMucnRsTWlycm9yaW5nJiZ0aGlzLl90YXJnZXRJc1JUTChiKSkpe3ZhciBmPVBvbHltZXIuZG9tKGIucm9vdHx8Yik7Zi5pbnNlcnRCZWZvcmUoZCxmLmNoaWxkTm9kZXNbMF0pO3JldHVybiBiLl9zdmdJY29uPWR9cmV0dXJuIG51bGx9LHJlbW92ZUljb246ZnVuY3Rpb24oYil7Yi5fc3ZnSWNvbiYmKFBvbHltZXIuZG9tKGIucm9vdHx8YikucmVtb3ZlQ2hpbGQoYi5fc3ZnSWNvbiksYi5fc3ZnSWNvbj1udWxsKX0sX3RhcmdldElzUlRMOmZ1bmN0aW9uKGIpe251bGw9PXRoaXMuX190YXJnZXRJc1JUTCYmKHRoaXMudXNlR2xvYmFsUnRsQXR0cmlidXRlP3RoaXMuX190YXJnZXRJc1JUTD0icnRsIj09PShkb2N1bWVudC5ib2R5JiZkb2N1bWVudC5ib2R5Lmhhc0F0dHJpYnV0ZSgiZGlyIik/ZG9jdW1lbnQuYm9keTpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldEF0dHJpYnV0ZSgiZGlyIik6KGImJmIubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmCihiPWIuaG9zdCksdGhpcy5fX3RhcmdldElzUlRMPWImJiJydGwiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYikuZGlyZWN0aW9uKSk7cmV0dXJuIHRoaXMuX190YXJnZXRJc1JUTH0sX25hbWVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fbWV0YS52YWx1ZT1udWxsO3RoaXMuX21ldGEua2V5PXRoaXMubmFtZTt0aGlzLl9tZXRhLnZhbHVlPXRoaXM7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuZmlyZSgiaXJvbi1pY29uc2V0LWFkZGVkIix0aGlzLHtub2RlOndpbmRvd30pfSl9LF9jcmVhdGVJY29uTWFwOmZ1bmN0aW9uKCl7dmFyIGI9T2JqZWN0LmNyZWF0ZShudWxsKTtQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJbaWRdIikuZm9yRWFjaChmdW5jdGlvbihkKXtiW2QuaWRdPWR9KTtyZXR1cm4gYn0sX2Nsb25lSWNvbjpmdW5jdGlvbihiLGQpe3RoaXMuX2ljb25zPXRoaXMuX2ljb25zfHx0aGlzLl9jcmVhdGVJY29uTWFwKCk7cmV0dXJuIHRoaXMuX3ByZXBhcmVTdmdDbG9uZSh0aGlzLl9pY29uc1tiXSwKdGhpcy5zaXplLGQpfSxfcHJlcGFyZVN2Z0Nsb25lOmZ1bmN0aW9uKGIsZCxmKXtpZihiKXtiPWIuY2xvbmVOb2RlKCEwKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwic3ZnIik7ZD1iLmdldEF0dHJpYnV0ZSgidmlld0JveCIpfHwiMCAwICIrZCsiICIrZDt2YXIgaz0icG9pbnRlci1ldmVudHM6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyI7ZiYmYi5oYXNBdHRyaWJ1dGUoIm1pcnJvci1pbi1ydGwiKSYmKGsrPSItd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm06c2NhbGUoLTEsMSk7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7Iik7aC5zZXRBdHRyaWJ1dGUoInZpZXdCb3giLGQpO2guc2V0QXR0cmlidXRlKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQgbWVldCIpO2guc2V0QXR0cmlidXRlKCJmb2N1c2FibGUiLCJmYWxzZSIpO2guc3R5bGUuY3NzVGV4dD0KaztoLmFwcGVuZENoaWxkKGIpLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKTtyZXR1cm4gaH1yZXR1cm4gbnVsbH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1kcm9wZG93bi1tZW51L3BhcGVyLWRyb3Bkb3duLW1lbnUuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoicGFwZXItZHJvcGRvd24tbWVudSIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntzZWxlY3RlZEl0ZW1MYWJlbDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxzZWxlY3RlZEl0ZW06e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxyZWFkT25seTohMH0sdmFsdWU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sbGFiZWw6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmd9LGVycm9yTWVzc2FnZTp7dHlwZTpTdHJpbmd9LG9wZW5lZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSxhbGxvd091dHNpZGVTY3JvbGw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9MYWJlbEZsb2F0Ont0eXBlOkJvb2xlYW4sCnZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saG9yaXpvbnRhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToicmlnaHQifSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToidG9wIn0sdmVydGljYWxPZmZzZXQ6TnVtYmVyLGR5bmFtaWNBbGlnbjp7dHlwZTpCb29sZWFufSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9fSxsaXN0ZW5lcnM6e3RhcDoiX29uVGFwIn0sa2V5QmluZGluZ3M6eyJ1cCBkb3duIjoib3BlbiIsZXNjOiJjbG9zZSJ9LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJjb21ib2JveCIsImFyaWEtYXV0b2NvbXBsZXRlIjoibm9uZSIsImFyaWEtaGFzcG9wdXAiOiJ0cnVlIn0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGVkSXRlbUNoYW5nZWQoc2VsZWN0ZWRJdGVtKSJdLGF0dGFjaGVkOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuY29udGVudEVsZW1lbnQ7YiYmYi5zZWxlY3RlZEl0ZW0mJnRoaXMuX3NldFNlbGVjdGVkSXRlbShiLnNlbGVjdGVkSXRlbSl9LGdldCBjb250ZW50RWxlbWVudCgpe2Zvcih2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzLiQuY29udGVudCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpLGQ9MCxmPWIubGVuZ3RoO2Q8ZjtkKyspaWYoYltkXS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiBiW2RdfSxvcGVuOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24ub3BlbigpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuJC5tZW51QnV0dG9uLmNsb3NlKCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIuZGV0YWlsLml0ZW0pfSxfb25Jcm9uRGVzZWxlY3Q6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0obnVsbCl9LF9vblRhcDpmdW5jdGlvbihiKXtQb2x5bWVyLkdlc3R1cmVzLmZpbmRPcmlnaW5hbFRhcmdldChiKT09PXRoaXMmJgp0aGlzLm9wZW4oKX0sX3NlbGVjdGVkSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy52YWx1ZT1iPWI/Yi5sYWJlbHx8Yi5nZXRBdHRyaWJ1dGUoImxhYmVsIil8fGIudGV4dENvbnRlbnQudHJpbSgpOiIiO3RoaXMuX3NldFNlbGVjdGVkSXRlbUxhYmVsKGIpfSxfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldDpmdW5jdGlvbihiLGQpe3JldHVybiBkP2Q6Yj8tNDo4fSxfZ2V0VmFsaWRpdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNhYmxlZHx8IXRoaXMucmVxdWlyZWR8fHRoaXMucmVxdWlyZWQmJiEhdGhpcy52YWx1ZX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wZW5lZD8idHJ1ZSI6ImZhbHNlIixkPXRoaXMuY29udGVudEVsZW1lbnQ7ZCYmZC5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLGIpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXNlbGVjdG9yL2lyb24tc2VsZWN0aW9uLmh0bWwuanMKUG9seW1lci5Jcm9uU2VsZWN0aW9uPWZ1bmN0aW9uKGIpe3RoaXMuc2VsZWN0aW9uPVtdO3RoaXMuc2VsZWN0Q2FsbGJhY2s9Yn07ClBvbHltZXIuSXJvblNlbGVjdGlvbi5wcm90b3R5cGU9e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11bHRpP3RoaXMuc2VsZWN0aW9uLnNsaWNlKCk6dGhpcy5zZWxlY3Rpb25bMF19LGNsZWFyOmZ1bmN0aW9uKGIpe3RoaXMuc2VsZWN0aW9uLnNsaWNlKCkuZm9yRWFjaChmdW5jdGlvbihkKXsoIWJ8fDA+Yi5pbmRleE9mKGQpKSYmdGhpcy5zZXRJdGVtU2VsZWN0ZWQoZCwhMSl9LHRoaXMpfSxpc1NlbGVjdGVkOmZ1bmN0aW9uKGIpe3JldHVybiAwPD10aGlzLnNlbGVjdGlvbi5pbmRleE9mKGIpfSxzZXRJdGVtU2VsZWN0ZWQ6ZnVuY3Rpb24oYixkKXtpZihudWxsIT1iJiZkIT09dGhpcy5pc1NlbGVjdGVkKGIpKXtpZihkKXRoaXMuc2VsZWN0aW9uLnB1c2goYik7ZWxzZXt2YXIgZj10aGlzLnNlbGVjdGlvbi5pbmRleE9mKGIpOzA8PWYmJnRoaXMuc2VsZWN0aW9uLnNwbGljZShmLDEpfXRoaXMuc2VsZWN0Q2FsbGJhY2smJnRoaXMuc2VsZWN0Q2FsbGJhY2soYixkKX19LHNlbGVjdDpmdW5jdGlvbihiKXt0aGlzLm11bHRpPwp0aGlzLnRvZ2dsZShiKTp0aGlzLmdldCgpIT09YiYmKHRoaXMuc2V0SXRlbVNlbGVjdGVkKHRoaXMuZ2V0KCksITEpLHRoaXMuc2V0SXRlbVNlbGVjdGVkKGIsITApKX0sdG9nZ2xlOmZ1bmN0aW9uKGIpe3RoaXMuc2V0SXRlbVNlbGVjdGVkKGIsIXRoaXMuaXNTZWxlY3RlZChiKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXNlbGVjdG9yL2lyb24tc2VsZWN0YWJsZS5odG1sLmpzClBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcj17cHJvcGVydGllczp7YXR0ckZvclNlbGVjdGVkOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxzZWxlY3RlZDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxlY3RlZEl0ZW06e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sYWN0aXZhdGVFdmVudDp7dHlwZTpTdHJpbmcsdmFsdWU6InRhcCIsb2JzZXJ2ZXI6Il9hY3RpdmF0ZUV2ZW50Q2hhbmdlZCJ9LHNlbGVjdGFibGU6U3RyaW5nLHNlbGVjdGVkQ2xhc3M6e3R5cGU6U3RyaW5nLHZhbHVlOiJpcm9uLXNlbGVjdGVkIn0sc2VsZWN0ZWRBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGZhbGxiYWNrU2VsZWN0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxpdGVtczp7dHlwZTpBcnJheSxyZWFkT25seTohMCxub3RpZnk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9leGNsdWRlZExvY2FsTmFtZXM6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3RlbXBsYXRlOjEsCiJkb20tYmluZCI6MSwiZG9tLWlmIjoxLCJkb20tcmVwZWF0IjoxfX19fSxvYnNlcnZlcnM6WyJfdXBkYXRlQXR0ckZvclNlbGVjdGVkKGF0dHJGb3JTZWxlY3RlZCkiLCJfdXBkYXRlU2VsZWN0ZWQoc2VsZWN0ZWQpIiwiX2NoZWNrRmFsbGJhY2soZmFsbGJhY2tTZWxlY3Rpb24pIl0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX2JpbmRGaWx0ZXJJdGVtPXRoaXMuX2ZpbHRlckl0ZW0uYmluZCh0aGlzKTt0aGlzLl9zZWxlY3Rpb249bmV3IFBvbHltZXIuSXJvblNlbGVjdGlvbih0aGlzLl9hcHBseVNlbGVjdGlvbi5iaW5kKHRoaXMpKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj10aGlzLl9vYnNlcnZlSXRlbXModGhpcyk7dGhpcy5fYWRkTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmUG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpO3RoaXMuX3JlbW92ZUxpc3RlbmVyKHRoaXMuYWN0aXZhdGVFdmVudCl9LAppbmRleE9mOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLml0ZW1zP3RoaXMuaXRlbXMuaW5kZXhPZihiKTotMX0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMuc2VsZWN0ZWQ9Yn0sc2VsZWN0UHJldmlvdXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLml0ZW1zLmxlbmd0aDtiPShOdW1iZXIodGhpcy5fdmFsdWVUb0luZGV4KHRoaXMuc2VsZWN0ZWQpKS0xK2IpJWI7dGhpcy5zZWxlY3RlZD10aGlzLl9pbmRleFRvVmFsdWUoYil9LHNlbGVjdE5leHQ6ZnVuY3Rpb24oKXt2YXIgYj0oTnVtYmVyKHRoaXMuX3ZhbHVlVG9JbmRleCh0aGlzLnNlbGVjdGVkKSkrMSkldGhpcy5pdGVtcy5sZW5ndGg7dGhpcy5zZWxlY3RlZD10aGlzLl9pbmRleFRvVmFsdWUoYil9LHNlbGVjdEluZGV4OmZ1bmN0aW9uKGIpe3RoaXMuc2VsZWN0KHRoaXMuX2luZGV4VG9WYWx1ZShiKSl9LGZvcmNlU3luY2hyb25vdXNJdGVtVXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5fb2JzZXJ2ZXIuZmx1c2g/CnRoaXMuX29ic2VydmVyLmZsdXNoKCk6dGhpcy5fdXBkYXRlSXRlbXMoKX0sZ2V0IF9zaG91bGRVcGRhdGVTZWxlY3Rpb24oKXtyZXR1cm4gbnVsbCE9dGhpcy5zZWxlY3RlZH0sX2NoZWNrRmFsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVTZWxlY3RlZCgpfSxfYWRkTGlzdGVuZXI6ZnVuY3Rpb24oYil7dGhpcy5saXN0ZW4odGhpcyxiLCJfYWN0aXZhdGVIYW5kbGVyIil9LF9yZW1vdmVMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLnVubGlzdGVuKHRoaXMsYiwiX2FjdGl2YXRlSGFuZGxlciIpfSxfYWN0aXZhdGVFdmVudENoYW5nZWQ6ZnVuY3Rpb24oYixkKXt0aGlzLl9yZW1vdmVMaXN0ZW5lcihkKTt0aGlzLl9hZGRMaXN0ZW5lcihiKX0sX3VwZGF0ZUl0ZW1zOmZ1bmN0aW9uKCl7dmFyIGI9UG9seW1lci5kb20odGhpcykucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHRoaXMuc2VsZWN0YWJsZXx8IioiKTtiPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChiLHRoaXMuX2JpbmRGaWx0ZXJJdGVtKTsKdGhpcy5fc2V0SXRlbXMoYil9LF91cGRhdGVBdHRyRm9yU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkSXRlbSYmKHRoaXMuc2VsZWN0ZWQ9dGhpcy5fdmFsdWVGb3JJdGVtKHRoaXMuc2VsZWN0ZWRJdGVtKSl9LF91cGRhdGVTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0U2VsZWN0ZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLml0ZW1zKXt2YXIgYj10aGlzLl92YWx1ZVRvSXRlbSh0aGlzLnNlbGVjdGVkKTtiP3RoaXMuX3NlbGVjdGlvbi5zZWxlY3QoYik6dGhpcy5fc2VsZWN0aW9uLmNsZWFyKCk7dGhpcy5mYWxsYmFja1NlbGVjdGlvbiYmdGhpcy5pdGVtcy5sZW5ndGgmJnZvaWQgMD09PXRoaXMuX3NlbGVjdGlvbi5nZXQoKSYmKHRoaXMuc2VsZWN0ZWQ9dGhpcy5mYWxsYmFja1NlbGVjdGlvbil9fSxfZmlsdGVySXRlbTpmdW5jdGlvbihiKXtyZXR1cm4hdGhpcy5fZXhjbHVkZWRMb2NhbE5hbWVzW2IubG9jYWxOYW1lXX0sCl92YWx1ZVRvSXRlbTpmdW5jdGlvbihiKXtyZXR1cm4gbnVsbD09Yj9udWxsOnRoaXMuaXRlbXNbdGhpcy5fdmFsdWVUb0luZGV4KGIpXX0sX3ZhbHVlVG9JbmRleDpmdW5jdGlvbihiKXtpZih0aGlzLmF0dHJGb3JTZWxlY3RlZClmb3IodmFyIGQ9MCxmO2Y9dGhpcy5pdGVtc1tkXTtkKyspe2lmKHRoaXMuX3ZhbHVlRm9ySXRlbShmKT09YilyZXR1cm4gZH1lbHNlIHJldHVybiBOdW1iZXIoYil9LF9pbmRleFRvVmFsdWU6ZnVuY3Rpb24oYil7aWYodGhpcy5hdHRyRm9yU2VsZWN0ZWQpe2lmKGI9dGhpcy5pdGVtc1tiXSlyZXR1cm4gdGhpcy5fdmFsdWVGb3JJdGVtKGIpfWVsc2UgcmV0dXJuIGJ9LF92YWx1ZUZvckl0ZW06ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuIG51bGw7aWYoIXRoaXMuYXR0ckZvclNlbGVjdGVkKXJldHVybiBiPXRoaXMuaW5kZXhPZihiKSwtMT09PWI/bnVsbDpiO3ZhciBkPWJbUG9seW1lci5DYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCldOwpyZXR1cm4gdm9pZCAwIT1kP2Q6Yi5nZXRBdHRyaWJ1dGUodGhpcy5hdHRyRm9yU2VsZWN0ZWQpfSxfYXBwbHlTZWxlY3Rpb246ZnVuY3Rpb24oYixkKXt0aGlzLnNlbGVjdGVkQ2xhc3MmJnRoaXMudG9nZ2xlQ2xhc3ModGhpcy5zZWxlY3RlZENsYXNzLGQsYik7dGhpcy5zZWxlY3RlZEF0dHJpYnV0ZSYmdGhpcy50b2dnbGVBdHRyaWJ1dGUodGhpcy5zZWxlY3RlZEF0dHJpYnV0ZSxkLGIpO3RoaXMuX3NlbGVjdGlvbkNoYW5nZSgpO3RoaXMuZmlyZSgiaXJvbi0iKyhkPyJzZWxlY3QiOiJkZXNlbGVjdCIpLHtpdGVtOmJ9KX0sX3NlbGVjdGlvbkNoYW5nZTpmdW5jdGlvbigpe3RoaXMuX3NldFNlbGVjdGVkSXRlbSh0aGlzLl9zZWxlY3Rpb24uZ2V0KCkpfSxfb2JzZXJ2ZUl0ZW1zOmZ1bmN0aW9uKGIpe3JldHVybiBQb2x5bWVyLmRvbShiKS5vYnNlcnZlTm9kZXMoZnVuY3Rpb24oZCl7dGhpcy5fdXBkYXRlSXRlbXMoKTt0aGlzLl91cGRhdGVTZWxlY3RlZCgpO3RoaXMuZmlyZSgiaXJvbi1pdGVtcy1jaGFuZ2VkIiwKZCx7YnViYmxlczohMSxjYW5jZWxhYmxlOiExfSl9KX0sX2FjdGl2YXRlSGFuZGxlcjpmdW5jdGlvbihiKXtiPWIudGFyZ2V0O2Zvcih2YXIgZD10aGlzLml0ZW1zO2ImJmIhPXRoaXM7KXt2YXIgZj1kLmluZGV4T2YoYik7aWYoMDw9Zil7ZD10aGlzLl9pbmRleFRvVmFsdWUoZik7dGhpcy5faXRlbUFjdGl2YXRlKGQsYik7YnJlYWt9Yj1iLnBhcmVudE5vZGV9fSxfaXRlbUFjdGl2YXRlOmZ1bmN0aW9uKGIsZCl7dGhpcy5maXJlKCJpcm9uLWFjdGl2YXRlIix7c2VsZWN0ZWQ6YixpdGVtOmR9LHtjYW5jZWxhYmxlOiEwfSkuZGVmYXVsdFByZXZlbnRlZHx8dGhpcy5zZWxlY3QoYil9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXNlbGVjdG9yL2lyb24tbXVsdGktc2VsZWN0YWJsZS5odG1sLmpzClBvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7bXVsdGk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoibXVsdGlDaGFuZ2VkIn0sc2VsZWN0ZWRWYWx1ZXM6e3R5cGU6QXJyYXksbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxzZWxlY3RlZEl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZFZhbHVlcy5zcGxpY2VzKSJdLHNlbGVjdDpmdW5jdGlvbihiKXt0aGlzLm11bHRpP3RoaXMuX3RvZ2dsZVNlbGVjdGVkKGIpOnRoaXMuc2VsZWN0ZWQ9Yn0sbXVsdGlDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX3NlbGVjdGlvbi5tdWx0aT1iO3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LGdldCBfc2hvdWxkVXBkYXRlU2VsZWN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMuc2VsZWN0ZWR8fApudWxsIT10aGlzLnNlbGVjdGVkVmFsdWVzJiZ0aGlzLnNlbGVjdGVkVmFsdWVzLmxlbmd0aH0sX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMubXVsdGk/dGhpcy5zZWxlY3RlZEl0ZW1zJiYwPHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGgmJih0aGlzLnNlbGVjdGVkVmFsdWVzPXRoaXMuc2VsZWN0ZWRJdGVtcy5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2luZGV4VG9WYWx1ZSh0aGlzLmluZGV4T2YoYikpfSx0aGlzKS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIG51bGwhPWJ9LHRoaXMpKTpQb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3IuX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZC5hcHBseSh0aGlzKX0sX3VwZGF0ZVNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLl9zZWxlY3RNdWx0aSh0aGlzLnNlbGVjdGVkVmFsdWVzKTp0aGlzLl9zZWxlY3RTZWxlY3RlZCh0aGlzLnNlbGVjdGVkKX0sX3NlbGVjdE11bHRpOmZ1bmN0aW9uKGIpe2I9CmJ8fFtdO2I9KHRoaXMuX3ZhbHVlc1RvSXRlbXMoYil8fFtdKS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuIG51bGwhPT1mJiZ2b2lkIDAhPT1mfSk7dGhpcy5fc2VsZWN0aW9uLmNsZWFyKGIpO2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXRoaXMuX3NlbGVjdGlvbi5zZXRJdGVtU2VsZWN0ZWQoYltkXSwhMCk7dGhpcy5mYWxsYmFja1NlbGVjdGlvbiYmIXRoaXMuX3NlbGVjdGlvbi5nZXQoKS5sZW5ndGgmJnRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pJiZ0aGlzLnNlbGVjdCh0aGlzLmZhbGxiYWNrU2VsZWN0aW9uKX0sX3NlbGVjdGlvbkNoYW5nZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX3NlbGVjdGlvbi5nZXQoKTt0aGlzLm11bHRpPyh0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKGIpLHRoaXMuX3NldFNlbGVjdGVkSXRlbShiLmxlbmd0aD9iWzBdOm51bGwpKTpudWxsIT09YiYmdm9pZCAwIT09Yj8odGhpcy5fc2V0U2VsZWN0ZWRJdGVtcyhbYl0pLAp0aGlzLl9zZXRTZWxlY3RlZEl0ZW0oYikpOih0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKFtdKSx0aGlzLl9zZXRTZWxlY3RlZEl0ZW0obnVsbCkpfSxfdG9nZ2xlU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5zZWxlY3RlZFZhbHVlcy5pbmRleE9mKGIpOzA+ZD90aGlzLnB1c2goInNlbGVjdGVkVmFsdWVzIixiKTp0aGlzLnNwbGljZSgic2VsZWN0ZWRWYWx1ZXMiLGQsMSl9LF92YWx1ZXNUb0l0ZW1zOmZ1bmN0aW9uKGIpe3JldHVybiBudWxsPT1iP251bGw6Yi5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuX3ZhbHVlVG9JdGVtKGQpfSx0aGlzKX19O1BvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9yPVtQb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLW1lbnUtYmVoYXZpb3IvaXJvbi1tZW51LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7Zm9jdXNlZEl0ZW06e29ic2VydmVyOiJfZm9jdXNlZEl0ZW1DaGFuZ2VkIixyZWFkT25seTohMCx0eXBlOk9iamVjdH0sYXR0ckZvckl0ZW1UaXRsZTp7dHlwZTpTdHJpbmd9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQifX0sX01PRElGSUVSX0tFWVM6IkFsdCBBbHRHcmFwaCBDYXBzTG9jayBDb250cm9sIEZuIEZuTG9jayBIeXBlciBNZXRhIE51bUxvY2sgT1MgU2Nyb2xsTG9jayBTaGlmdCBTdXBlciBTeW1ib2wgU3ltYm9sTG9jayIuc3BsaXQoIiAiKSxfU0VBUkNIX1JFU0VUX1RJTUVPVVRfTVM6MUUzLF9wcmV2aW91c1RhYkluZGV4OjAsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6Im1lbnUifSxvYnNlcnZlcnM6WyJfdXBkYXRlTXVsdGlzZWxlY3RhYmxlKG11bHRpKSJdLGxpc3RlbmVyczp7Zm9jdXM6Il9vbkZvY3VzIixrZXlkb3duOiJfb25LZXlkb3duIiwKImlyb24taXRlbXMtY2hhbmdlZCI6Il9vbklyb25JdGVtc0NoYW5nZWQifSxrZXlCaW5kaW5nczp7dXA6Il9vblVwS2V5Iixkb3duOiJfb25Eb3duS2V5Iixlc2M6Il9vbkVzY0tleSIsInNoaWZ0K3RhYjprZXlkb3duIjoiX29uU2hpZnRUYWJEb3duIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9yZXNldFRhYmluZGljZXMoKX0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMuX2RlZmF1bHRGb2N1c0FzeW5jJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYyksdGhpcy5fZGVmYXVsdEZvY3VzQXN5bmM9bnVsbCk7dmFyIGQ9dGhpcy5fdmFsdWVUb0l0ZW0oYik7ZCYmZC5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fCh0aGlzLl9zZXRGb2N1c2VkSXRlbShkKSxQb2x5bWVyLklyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvckltcGwuc2VsZWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LF9yZXNldFRhYmluZGljZXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm11bHRpPwp0aGlzLnNlbGVjdGVkSXRlbXMmJnRoaXMuc2VsZWN0ZWRJdGVtc1swXTp0aGlzLnNlbGVjdGVkSXRlbTt0aGlzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixkPT09Yj8iMCI6Ii0xIil9LHRoaXMpfSxfdXBkYXRlTXVsdGlzZWxlY3RhYmxlOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbXVsdGlzZWxlY3RhYmxlIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLW11bHRpc2VsZWN0YWJsZSIpfSxfZm9jdXNXaXRoS2V5Ym9hcmRFdmVudDpmdW5jdGlvbihiKXtpZigtMT09PXRoaXMuX01PRElGSUVSX0tFWVMuaW5kZXhPZihiLmtleSkpe3RoaXMuY2FuY2VsRGVib3VuY2VyKCJfY2xlYXJTZWFyY2hUZXh0Iik7dmFyIGQ9dGhpcy5fc2VhcmNoVGV4dHx8IiI7ZCs9KGIua2V5JiYxPT1iLmtleS5sZW5ndGg/Yi5rZXk6U3RyaW5nLmZyb21DaGFyQ29kZShiLmtleUNvZGUpKS50b0xvY2FsZUxvd2VyQ2FzZSgpOwpiPWQubGVuZ3RoO2Zvcih2YXIgZj0wLGg7aD10aGlzLml0ZW1zW2ZdO2YrKylpZighaC5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpe3ZhciBrPXRoaXMuYXR0ckZvckl0ZW1UaXRsZXx8InRleHRDb250ZW50IjtrPShoW2tdfHxoLmdldEF0dHJpYnV0ZShrKXx8IiIpLnRyaW0oKTtpZighKGsubGVuZ3RoPGIpJiZrLnNsaWNlKDAsYikudG9Mb2NhbGVMb3dlckNhc2UoKT09ZCl7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oaCk7YnJlYWt9fXRoaXMuX3NlYXJjaFRleHQ9ZDt0aGlzLmRlYm91bmNlKCJfY2xlYXJTZWFyY2hUZXh0Iix0aGlzLl9jbGVhclNlYXJjaFRleHQsdGhpcy5fU0VBUkNIX1JFU0VUX1RJTUVPVVRfTVMpfX0sX2NsZWFyU2VhcmNoVGV4dDpmdW5jdGlvbigpe3RoaXMuX3NlYXJjaFRleHQ9IiJ9LF9mb2N1c1ByZXZpb3VzOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuaXRlbXMubGVuZ3RoLGQ9TnVtYmVyKHRoaXMuaW5kZXhPZih0aGlzLmZvY3VzZWRJdGVtKSksZj0xO2Y8CmIrMTtmKyspe3ZhciBoPXRoaXMuaXRlbXNbKGQtZitiKSViXTtpZighaC5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpe3ZhciBrPVBvbHltZXIuZG9tKGgpLmdldE93bmVyUm9vdCgpfHxkb2N1bWVudDt0aGlzLl9zZXRGb2N1c2VkSXRlbShoKTtpZihQb2x5bWVyLmRvbShrKS5hY3RpdmVFbGVtZW50PT1oKWJyZWFrfX19LF9mb2N1c05leHQ6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5pdGVtcy5sZW5ndGgsZD1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxmPTE7ZjxiKzE7ZisrKXt2YXIgaD10aGlzLml0ZW1zWyhkK2YpJWJdO2lmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9UG9seW1lci5kb20oaCkuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O3RoaXMuX3NldEZvY3VzZWRJdGVtKGgpO2lmKFBvbHltZXIuZG9tKGspLmFjdGl2ZUVsZW1lbnQ9PWgpYnJlYWt9fX0sX2FwcGx5U2VsZWN0aW9uOmZ1bmN0aW9uKGIsZCl7ZD9iLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsCiJ0cnVlIik6Yi5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtc2VsZWN0ZWQiKTtQb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3IuX2FwcGx5U2VsZWN0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX2ZvY3VzZWRJdGVtQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJmQuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIik7IWJ8fGIuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpfHx0aGlzLmRpc2FibGVkfHwoYi5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiMCIpLGIuZm9jdXMoKSl9LF9vbklyb25JdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYil7Yi5kZXRhaWwuYWRkZWROb2Rlcy5sZW5ndGgmJnRoaXMuX3Jlc2V0VGFiaW5kaWNlcygpfSxfb25TaGlmdFRhYkRvd246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQ9ITA7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0obnVsbCk7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwKIi0xIik7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsYik7UG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkPSExfSwxKX0sX29uRm9jdXM6ZnVuY3Rpb24oYil7IVBvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZCYmKGI9UG9seW1lci5kb20oYikucm9vdFRhcmdldCxiPT09dGhpc3x8InVuZGVmaW5lZCI9PT10eXBlb2YgYi50YWJJbmRleHx8dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChiKSkmJih0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz10aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJnRoaXMuc2VsZWN0ZWRJdGVtc1swXTp0aGlzLnNlbGVjdGVkSXRlbTt0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKTtkP3RoaXMuX3NldEZvY3VzZWRJdGVtKGQpOnRoaXMuaXRlbXNbMF0mJnRoaXMuX2ZvY3VzTmV4dCgpfSkpfSxfb25VcEtleTpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c1ByZXZpb3VzKCk7CmIuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRG93bktleTpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c05leHQoKTtiLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbkVzY0tleTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZm9jdXNlZEl0ZW07YiYmYi5ibHVyKCl9LF9vbktleWRvd246ZnVuY3Rpb24oYil7dGhpcy5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXMoYiwidXAgZG93biBlc2MiKXx8dGhpcy5fZm9jdXNXaXRoS2V5Ym9hcmRFdmVudChiKTtiLnN0b3BQcm9wYWdhdGlvbigpfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fYWN0aXZhdGVIYW5kbGVyLmNhbGwodGhpcyxiKTtiLnN0b3BQcm9wYWdhdGlvbigpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2I/KHRoaXMuX3ByZXZpb3VzVGFiSW5kZXg9dGhpcy5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iik/dGhpcy50YWJJbmRleDoKMCx0aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKSk6dGhpcy5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil8fHRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsdGhpcy5fcHJldmlvdXNUYWJJbmRleCl9fTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQ9ITE7UG9seW1lci5Jcm9uTWVudUJlaGF2aW9yPVtQb2x5bWVyLklyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWxpc3Rib3gvcGFwZXItbGlzdGJveC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJwYXBlci1saXN0Ym94IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6Imxpc3Rib3gifX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pdGVtL3BhcGVyLWl0ZW0tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySXRlbUJlaGF2aW9ySW1wbD17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6Im9wdGlvbiIsdGFiaW5kZXg6IjAifX07UG9seW1lci5QYXBlckl0ZW1CZWhhdmlvcj1bUG9seW1lci5Jcm9uQnV0dG9uU3RhdGUsUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pdGVtL3BhcGVyLWl0ZW0uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaXRlbSIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySXRlbUJlaGF2aW9yXX0pOwoKLyoKCiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+CiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pzLmZvdW5kYXRpb24vPgogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPgogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT4KIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9ycwoqLwooZnVuY3Rpb24oKXt2YXIgdW5kZWZpbmVkO3ZhciBWRVJTSU9OPSI0LjE3LjUiO3ZhciBMQVJHRV9BUlJBWV9TSVpFPTIwMDt2YXIgQ09SRV9FUlJPUl9URVhUPSJVbnN1cHBvcnRlZCBjb3JlLWpzIHVzZS4gVHJ5IGh0dHBzOi8vbnBtcy5pby9zZWFyY2g/cVx4M2Rwb255ZmlsbC4iLEZVTkNfRVJST1JfVEVYVD0iRXhwZWN0ZWQgYSBmdW5jdGlvbiI7dmFyIEhBU0hfVU5ERUZJTkVEPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjt2YXIgTUFYX01FTU9JWkVfU0laRT01MDA7dmFyIFBMQUNFSE9MREVSPSJfX2xvZGFzaF9wbGFjZWhvbGRlcl9fIjt2YXIgQ0xPTkVfREVFUF9GTEFHPTEsQ0xPTkVfRkxBVF9GTEFHPTIsQ0xPTkVfU1lNQk9MU19GTEFHPTQ7dmFyIENPTVBBUkVfUEFSVElBTF9GTEFHPTEsQ09NUEFSRV9VTk9SREVSRURfRkxBRz0yO3ZhciBXUkFQX0JJTkRfRkxBRz0xLFdSQVBfQklORF9LRVlfRkxBRz0yLFdSQVBfQ1VSUllfQk9VTkRfRkxBRz00LFdSQVBfQ1VSUllfRkxBRz0KOCxXUkFQX0NVUlJZX1JJR0hUX0ZMQUc9MTYsV1JBUF9QQVJUSUFMX0ZMQUc9MzIsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUc9NjQsV1JBUF9BUllfRkxBRz0xMjgsV1JBUF9SRUFSR19GTEFHPTI1NixXUkFQX0ZMSVBfRkxBRz01MTI7dmFyIERFRkFVTFRfVFJVTkNfTEVOR1RIPTMwLERFRkFVTFRfVFJVTkNfT01JU1NJT049Ii4uLiI7dmFyIEhPVF9DT1VOVD04MDAsSE9UX1NQQU49MTY7dmFyIExBWllfRklMVEVSX0ZMQUc9MSxMQVpZX01BUF9GTEFHPTIsTEFaWV9XSElMRV9GTEFHPTM7dmFyIElORklOSVRZPTEvMCxNQVhfU0FGRV9JTlRFR0VSPTkwMDcxOTkyNTQ3NDA5OTEsTUFYX0lOVEVHRVI9MS43OTc2OTMxMzQ4NjIzMTU3RTMwOCxOQU49MC8wO3ZhciBNQVhfQVJSQVlfTEVOR1RIPTQyOTQ5NjcyOTUsTUFYX0FSUkFZX0lOREVYPU1BWF9BUlJBWV9MRU5HVEgtMSxIQUxGX01BWF9BUlJBWV9MRU5HVEg9TUFYX0FSUkFZX0xFTkdUSD4+PjE7dmFyIHdyYXBGbGFncz1bWyJhcnkiLApXUkFQX0FSWV9GTEFHXSxbImJpbmQiLFdSQVBfQklORF9GTEFHXSxbImJpbmRLZXkiLFdSQVBfQklORF9LRVlfRkxBR10sWyJjdXJyeSIsV1JBUF9DVVJSWV9GTEFHXSxbImN1cnJ5UmlnaHQiLFdSQVBfQ1VSUllfUklHSFRfRkxBR10sWyJmbGlwIixXUkFQX0ZMSVBfRkxBR10sWyJwYXJ0aWFsIixXUkFQX1BBUlRJQUxfRkxBR10sWyJwYXJ0aWFsUmlnaHQiLFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHXSxbInJlYXJnIixXUkFQX1JFQVJHX0ZMQUddXTt2YXIgYXJnc1RhZz0iW29iamVjdCBBcmd1bWVudHNdIixhcnJheVRhZz0iW29iamVjdCBBcnJheV0iLGFzeW5jVGFnPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixib29sVGFnPSJbb2JqZWN0IEJvb2xlYW5dIixkYXRlVGFnPSJbb2JqZWN0IERhdGVdIixkb21FeGNUYWc9IltvYmplY3QgRE9NRXhjZXB0aW9uXSIsZXJyb3JUYWc9IltvYmplY3QgRXJyb3JdIixmdW5jVGFnPSJbb2JqZWN0IEZ1bmN0aW9uXSIsZ2VuVGFnPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsCm1hcFRhZz0iW29iamVjdCBNYXBdIixudW1iZXJUYWc9IltvYmplY3QgTnVtYmVyXSIsbnVsbFRhZz0iW29iamVjdCBOdWxsXSIsb2JqZWN0VGFnPSJbb2JqZWN0IE9iamVjdF0iLHByb21pc2VUYWc9IltvYmplY3QgUHJvbWlzZV0iLHByb3h5VGFnPSJbb2JqZWN0IFByb3h5XSIscmVnZXhwVGFnPSJbb2JqZWN0IFJlZ0V4cF0iLHNldFRhZz0iW29iamVjdCBTZXRdIixzdHJpbmdUYWc9IltvYmplY3QgU3RyaW5nXSIsc3ltYm9sVGFnPSJbb2JqZWN0IFN5bWJvbF0iLHVuZGVmaW5lZFRhZz0iW29iamVjdCBVbmRlZmluZWRdIix3ZWFrTWFwVGFnPSJbb2JqZWN0IFdlYWtNYXBdIix3ZWFrU2V0VGFnPSJbb2JqZWN0IFdlYWtTZXRdIjt2YXIgYXJyYXlCdWZmZXJUYWc9IltvYmplY3QgQXJyYXlCdWZmZXJdIixkYXRhVmlld1RhZz0iW29iamVjdCBEYXRhVmlld10iLGZsb2F0MzJUYWc9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsZmxvYXQ2NFRhZz0iW29iamVjdCBGbG9hdDY0QXJyYXldIiwKaW50OFRhZz0iW29iamVjdCBJbnQ4QXJyYXldIixpbnQxNlRhZz0iW29iamVjdCBJbnQxNkFycmF5XSIsaW50MzJUYWc9IltvYmplY3QgSW50MzJBcnJheV0iLHVpbnQ4VGFnPSJbb2JqZWN0IFVpbnQ4QXJyYXldIix1aW50OENsYW1wZWRUYWc9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIix1aW50MTZUYWc9IltvYmplY3QgVWludDE2QXJyYXldIix1aW50MzJUYWc9IltvYmplY3QgVWludDMyQXJyYXldIjt2YXIgcmVFbXB0eVN0cmluZ0xlYWRpbmc9L1xiX19wIFwrPSAnJzsvZyxyZUVtcHR5U3RyaW5nTWlkZGxlPS9cYihfX3AgXCs9KSAnJyBcKy9nLHJlRW1wdHlTdHJpbmdUcmFpbGluZz0vKF9fZVwoLio/XCl8XGJfX3RcKSkgXCtcbicnOy9nO3ZhciByZUVzY2FwZWRIdG1sPS8mKD86YW1wfGx0fGd0fHF1b3R8IzM5KTsvZyxyZVVuZXNjYXBlZEh0bWw9L1smPD4iJ10vZyxyZUhhc0VzY2FwZWRIdG1sPVJlZ0V4cChyZUVzY2FwZWRIdG1sLnNvdXJjZSkscmVIYXNVbmVzY2FwZWRIdG1sPQpSZWdFeHAocmVVbmVzY2FwZWRIdG1sLnNvdXJjZSk7dmFyIHJlRXNjYXBlPS88JS0oW1xzXFNdKz8pJT4vZyxyZUV2YWx1YXRlPS88JShbXHNcU10rPyklPi9nLHJlSW50ZXJwb2xhdGU9LzwlPShbXHNcU10rPyklPi9nO3ZhciByZUlzRGVlcFByb3A9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8scmVJc1BsYWluUHJvcD0vXlx3KiQvLHJlUHJvcE5hbWU9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2c7dmFyIHJlUmVnRXhwQ2hhcj0vW1xcXiQuKis/KClbXF17fXxdL2cscmVIYXNSZWdFeHBDaGFyPVJlZ0V4cChyZVJlZ0V4cENoYXIuc291cmNlKTt2YXIgcmVUcmltPS9eXHMrfFxzKyQvZyxyZVRyaW1TdGFydD0vXlxzKy8scmVUcmltRW5kPS9ccyskLzt2YXIgcmVXcmFwQ29tbWVudD0vXHsoPzpcblwvXCogXFt3cmFwcGVkIHdpdGggLitcXSBcKlwvKT9cbj8vLApyZVdyYXBEZXRhaWxzPS9ce1xuXC9cKiBcW3dyYXBwZWQgd2l0aCAoLispXF0gXCovLHJlU3BsaXREZXRhaWxzPS8sPyAmIC87dmFyIHJlQXNjaWlXb3JkPS9bXlx4MDAtXHgyZlx4M2EtXHg0MFx4NWItXHg2MFx4N2ItXHg3Zl0rL2c7dmFyIHJlRXNjYXBlQ2hhcj0vXFwoXFwpPy9nO3ZhciByZUVzVGVtcGxhdGU9L1wkXHsoW15cXH1dKig/OlxcLlteXFx9XSopKilcfS9nO3ZhciByZUZsYWdzPS9cdyokLzt2YXIgcmVJc0JhZEhleD0vXlstK10weFswLTlhLWZdKyQvaTt2YXIgcmVJc0JpbmFyeT0vXjBiWzAxXSskL2k7dmFyIHJlSXNIb3N0Q3Rvcj0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLzt2YXIgcmVJc09jdGFsPS9eMG9bMC03XSskL2k7dmFyIHJlSXNVaW50PS9eKD86MHxbMS05XVxkKikkLzt2YXIgcmVMYXRpbj0vW1x4YzAtXHhkNlx4ZDgtXHhmNlx4ZjgtXHhmZlx1MDEwMC1cdTAxN2ZdL2c7dmFyIHJlTm9NYXRjaD0vKCReKS87dmFyIHJlVW5lc2NhcGVkU3RyaW5nPQovWydcblxyXHUyMDI4XHUyMDI5XFxdL2c7dmFyIHJzQXN0cmFsUmFuZ2U9IlxcdWQ4MDAtXFx1ZGZmZiIscnNDb21ib01hcmtzUmFuZ2U9IlxcdTAzMDAtXFx1MDM2ZiIscmVDb21ib0hhbGZNYXJrc1JhbmdlPSJcXHVmZTIwLVxcdWZlMmYiLHJzQ29tYm9TeW1ib2xzUmFuZ2U9IlxcdTIwZDAtXFx1MjBmZiIscnNDb21ib1JhbmdlPXJzQ29tYm9NYXJrc1JhbmdlK3JlQ29tYm9IYWxmTWFya3NSYW5nZStyc0NvbWJvU3ltYm9sc1JhbmdlLHJzRGluZ2JhdFJhbmdlPSJcXHUyNzAwLVxcdTI3YmYiLHJzTG93ZXJSYW5nZT0iYS16XFx4ZGYtXFx4ZjZcXHhmOC1cXHhmZiIscnNNYXRoT3BSYW5nZT0iXFx4YWNcXHhiMVxceGQ3XFx4ZjciLHJzTm9uQ2hhclJhbmdlPSJcXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHhiZiIscnNQdW5jdHVhdGlvblJhbmdlPSJcXHUyMDAwLVxcdTIwNmYiLHJzU3BhY2VSYW5nZT0iIFxcdFxceDBiXFxmXFx4YTBcXHVmZWZmXFxuXFxyXFx1MjAyOFxcdTIwMjlcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwIiwKcnNVcHBlclJhbmdlPSJBLVpcXHhjMC1cXHhkNlxceGQ4LVxceGRlIixyc1ZhclJhbmdlPSJcXHVmZTBlXFx1ZmUwZiIscnNCcmVha1JhbmdlPXJzTWF0aE9wUmFuZ2UrcnNOb25DaGFyUmFuZ2UrcnNQdW5jdHVhdGlvblJhbmdlK3JzU3BhY2VSYW5nZTt2YXIgcnNBcG9zPSJbJ1x1MjAxOV0iLHJzQXN0cmFsPSJbIityc0FzdHJhbFJhbmdlKyJdIixyc0JyZWFrPSJbIityc0JyZWFrUmFuZ2UrIl0iLHJzQ29tYm89IlsiK3JzQ29tYm9SYW5nZSsiXSIscnNEaWdpdHM9IlxcZCsiLHJzRGluZ2JhdD0iWyIrcnNEaW5nYmF0UmFuZ2UrIl0iLHJzTG93ZXI9IlsiK3JzTG93ZXJSYW5nZSsiXSIscnNNaXNjPSJbXiIrcnNBc3RyYWxSYW5nZStyc0JyZWFrUmFuZ2UrcnNEaWdpdHMrcnNEaW5nYmF0UmFuZ2UrcnNMb3dlclJhbmdlK3JzVXBwZXJSYW5nZSsiXSIscnNGaXR6PSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLHJzTW9kaWZpZXI9Iig/OiIrcnNDb21ibysifCIrcnNGaXR6KyIpIixyc05vbkFzdHJhbD0KIlteIityc0FzdHJhbFJhbmdlKyJdIixyc1JlZ2lvbmFsPSIoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9Iixyc1N1cnJQYWlyPSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixyc1VwcGVyPSJbIityc1VwcGVyUmFuZ2UrIl0iLHJzWldKPSJcXHUyMDBkIjt2YXIgcnNNaXNjTG93ZXI9Iig/OiIrcnNMb3dlcisifCIrcnNNaXNjKyIpIixyc01pc2NVcHBlcj0iKD86Iityc1VwcGVyKyJ8Iityc01pc2MrIikiLHJzT3B0Q29udHJMb3dlcj0iKD86Iityc0Fwb3MrIig/OmR8bGx8bXxyZXxzfHR8dmUpKT8iLHJzT3B0Q29udHJVcHBlcj0iKD86Iityc0Fwb3MrIig/OkR8TEx8TXxSRXxTfFR8VkUpKT8iLHJlT3B0TW9kPXJzTW9kaWZpZXIrIj8iLHJzT3B0VmFyPSJbIityc1ZhclJhbmdlKyJdPyIscnNPcHRKb2luPSIoPzoiK3JzWldKKyIoPzoiK1tyc05vbkFzdHJhbCxyc1JlZ2lvbmFsLHJzU3VyclBhaXJdLmpvaW4oInwiKSsiKSIrcnNPcHRWYXIrcmVPcHRNb2QrCiIpKiIscnNPcmRMb3dlcj0iXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcZHRoKSg/XHgzZFxcYnxbQS1aX10pIixyc09yZFVwcGVyPSJcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxkVEgpKD9ceDNkXFxifFthLXpfXSkiLHJzU2VxPXJzT3B0VmFyK3JlT3B0TW9kK3JzT3B0Sm9pbixyc0Vtb2ppPSIoPzoiK1tyc0RpbmdiYXQscnNSZWdpb25hbCxyc1N1cnJQYWlyXS5qb2luKCJ8IikrIikiK3JzU2VxLHJzU3ltYm9sPSIoPzoiK1tyc05vbkFzdHJhbCtyc0NvbWJvKyI/Iixyc0NvbWJvLHJzUmVnaW9uYWwscnNTdXJyUGFpcixyc0FzdHJhbF0uam9pbigifCIpKyIpIjt2YXIgcmVBcG9zPVJlZ0V4cChyc0Fwb3MsImciKTt2YXIgcmVDb21ib01hcms9UmVnRXhwKHJzQ29tYm8sImciKTt2YXIgcmVVbmljb2RlPVJlZ0V4cChyc0ZpdHorIig/XHgzZCIrcnNGaXR6KyIpfCIrcnNTeW1ib2wrcnNTZXEsImciKTt2YXIgcmVVbmljb2RlV29yZD1SZWdFeHAoW3JzVXBwZXIrIj8iKwpyc0xvd2VyKyIrIityc09wdENvbnRyTG93ZXIrIig/XHgzZCIrW3JzQnJlYWsscnNVcHBlciwiJCJdLmpvaW4oInwiKSsiKSIscnNNaXNjVXBwZXIrIisiK3JzT3B0Q29udHJVcHBlcisiKD9ceDNkIitbcnNCcmVhayxyc1VwcGVyK3JzTWlzY0xvd2VyLCIkIl0uam9pbigifCIpKyIpIixyc1VwcGVyKyI/Iityc01pc2NMb3dlcisiKyIrcnNPcHRDb250ckxvd2VyLHJzVXBwZXIrIisiK3JzT3B0Q29udHJVcHBlcixyc09yZFVwcGVyLHJzT3JkTG93ZXIscnNEaWdpdHMscnNFbW9qaV0uam9pbigifCIpLCJnIik7dmFyIHJlSGFzVW5pY29kZT1SZWdFeHAoIlsiK3JzWldKK3JzQXN0cmFsUmFuZ2UrcnNDb21ib1JhbmdlK3JzVmFyUmFuZ2UrIl0iKTt2YXIgcmVIYXNVbmljb2RlV29yZD0vW2Etel1bQS1aXXxbQS1aXXsyLH1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS87dmFyIGNvbnRleHRQcm9wcz1bIkFycmF5IiwiQnVmZmVyIiwiRGF0YVZpZXciLAoiRGF0ZSIsIkVycm9yIiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiRnVuY3Rpb24iLCJJbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIk1hcCIsIk1hdGgiLCJPYmplY3QiLCJQcm9taXNlIiwiUmVnRXhwIiwiU2V0IiwiU3RyaW5nIiwiU3ltYm9sIiwiVHlwZUVycm9yIiwiVWludDhBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDE2QXJyYXkiLCJVaW50MzJBcnJheSIsIldlYWtNYXAiLCJfIiwiY2xlYXJUaW1lb3V0IiwiaXNGaW5pdGUiLCJwYXJzZUludCIsInNldFRpbWVvdXQiXTt2YXIgdGVtcGxhdGVDb3VudGVyPS0xO3ZhciB0eXBlZEFycmF5VGFncz17fTt0eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXT10eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXT10eXBlZEFycmF5VGFnc1tpbnQ4VGFnXT10eXBlZEFycmF5VGFnc1tpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbaW50MzJUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXT10eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddPQp0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ109dHJ1ZTt0eXBlZEFycmF5VGFnc1thcmdzVGFnXT10eXBlZEFycmF5VGFnc1thcnJheVRhZ109dHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddPXR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddPXR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXT10eXBlZEFycmF5VGFnc1tkYXRlVGFnXT10eXBlZEFycmF5VGFnc1tlcnJvclRhZ109dHlwZWRBcnJheVRhZ3NbZnVuY1RhZ109dHlwZWRBcnJheVRhZ3NbbWFwVGFnXT10eXBlZEFycmF5VGFnc1tudW1iZXJUYWddPXR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ109dHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXT10eXBlZEFycmF5VGFnc1tzZXRUYWddPXR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ109dHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ109ZmFsc2U7dmFyIGNsb25lYWJsZVRhZ3M9e307Y2xvbmVhYmxlVGFnc1thcmdzVGFnXT1jbG9uZWFibGVUYWdzW2FycmF5VGFnXT0KY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ109Y2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ109Y2xvbmVhYmxlVGFnc1tib29sVGFnXT1jbG9uZWFibGVUYWdzW2RhdGVUYWddPWNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ109Y2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXT1jbG9uZWFibGVUYWdzW2ludDhUYWddPWNsb25lYWJsZVRhZ3NbaW50MTZUYWddPWNsb25lYWJsZVRhZ3NbaW50MzJUYWddPWNsb25lYWJsZVRhZ3NbbWFwVGFnXT1jbG9uZWFibGVUYWdzW251bWJlclRhZ109Y2xvbmVhYmxlVGFnc1tvYmplY3RUYWddPWNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXT1jbG9uZWFibGVUYWdzW3NldFRhZ109Y2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddPWNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXT1jbG9uZWFibGVUYWdzW3VpbnQ4VGFnXT1jbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ109Y2xvbmVhYmxlVGFnc1t1aW50MTZUYWddPWNsb25lYWJsZVRhZ3NbdWludDMyVGFnXT10cnVlOwpjbG9uZWFibGVUYWdzW2Vycm9yVGFnXT1jbG9uZWFibGVUYWdzW2Z1bmNUYWddPWNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ109ZmFsc2U7dmFyIGRlYnVycmVkTGV0dGVycz17Ilx1MDBjMCI6IkEiLCJcdTAwYzEiOiJBIiwiXHUwMGMyIjoiQSIsIlx1MDBjMyI6IkEiLCJcdTAwYzQiOiJBIiwiXHUwMGM1IjoiQSIsIlx1MDBlMCI6ImEiLCJcdTAwZTEiOiJhIiwiXHUwMGUyIjoiYSIsIlx1MDBlMyI6ImEiLCJcdTAwZTQiOiJhIiwiXHUwMGU1IjoiYSIsIlx1MDBjNyI6IkMiLCJcdTAwZTciOiJjIiwiXHUwMGQwIjoiRCIsIlx1MDBmMCI6ImQiLCJcdTAwYzgiOiJFIiwiXHUwMGM5IjoiRSIsIlx1MDBjYSI6IkUiLCJcdTAwY2IiOiJFIiwiXHUwMGU4IjoiZSIsIlx1MDBlOSI6ImUiLCJcdTAwZWEiOiJlIiwiXHUwMGViIjoiZSIsIlx1MDBjYyI6IkkiLCJcdTAwY2QiOiJJIiwiXHUwMGNlIjoiSSIsIlx1MDBjZiI6IkkiLCJcdTAwZWMiOiJpIiwiXHUwMGVkIjoiaSIsIlx1MDBlZSI6ImkiLAoiXHUwMGVmIjoiaSIsIlx1MDBkMSI6Ik4iLCJcdTAwZjEiOiJuIiwiXHUwMGQyIjoiTyIsIlx1MDBkMyI6Ik8iLCJcdTAwZDQiOiJPIiwiXHUwMGQ1IjoiTyIsIlx1MDBkNiI6Ik8iLCJcdTAwZDgiOiJPIiwiXHUwMGYyIjoibyIsIlx1MDBmMyI6Im8iLCJcdTAwZjQiOiJvIiwiXHUwMGY1IjoibyIsIlx1MDBmNiI6Im8iLCJcdTAwZjgiOiJvIiwiXHUwMGQ5IjoiVSIsIlx1MDBkYSI6IlUiLCJcdTAwZGIiOiJVIiwiXHUwMGRjIjoiVSIsIlx1MDBmOSI6InUiLCJcdTAwZmEiOiJ1IiwiXHUwMGZiIjoidSIsIlx1MDBmYyI6InUiLCJcdTAwZGQiOiJZIiwiXHUwMGZkIjoieSIsIlx1MDBmZiI6InkiLCJcdTAwYzYiOiJBZSIsIlx1MDBlNiI6ImFlIiwiXHUwMGRlIjoiVGgiLCJcdTAwZmUiOiJ0aCIsIlx1MDBkZiI6InNzIiwiXHUwMTAwIjoiQSIsIlx1MDEwMiI6IkEiLCJcdTAxMDQiOiJBIiwiXHUwMTAxIjoiYSIsIlx1MDEwMyI6ImEiLCJcdTAxMDUiOiJhIiwiXHUwMTA2IjoiQyIsIlx1MDEwOCI6IkMiLAoiXHUwMTBhIjoiQyIsIlx1MDEwYyI6IkMiLCJcdTAxMDciOiJjIiwiXHUwMTA5IjoiYyIsIlx1MDEwYiI6ImMiLCJcdTAxMGQiOiJjIiwiXHUwMTBlIjoiRCIsIlx1MDExMCI6IkQiLCJcdTAxMGYiOiJkIiwiXHUwMTExIjoiZCIsIlx1MDExMiI6IkUiLCJcdTAxMTQiOiJFIiwiXHUwMTE2IjoiRSIsIlx1MDExOCI6IkUiLCJcdTAxMWEiOiJFIiwiXHUwMTEzIjoiZSIsIlx1MDExNSI6ImUiLCJcdTAxMTciOiJlIiwiXHUwMTE5IjoiZSIsIlx1MDExYiI6ImUiLCJcdTAxMWMiOiJHIiwiXHUwMTFlIjoiRyIsIlx1MDEyMCI6IkciLCJcdTAxMjIiOiJHIiwiXHUwMTFkIjoiZyIsIlx1MDExZiI6ImciLCJcdTAxMjEiOiJnIiwiXHUwMTIzIjoiZyIsIlx1MDEyNCI6IkgiLCJcdTAxMjYiOiJIIiwiXHUwMTI1IjoiaCIsIlx1MDEyNyI6ImgiLCJcdTAxMjgiOiJJIiwiXHUwMTJhIjoiSSIsIlx1MDEyYyI6IkkiLCJcdTAxMmUiOiJJIiwiXHUwMTMwIjoiSSIsIlx1MDEyOSI6ImkiLCJcdTAxMmIiOiJpIiwKIlx1MDEyZCI6ImkiLCJcdTAxMmYiOiJpIiwiXHUwMTMxIjoiaSIsIlx1MDEzNCI6IkoiLCJcdTAxMzUiOiJqIiwiXHUwMTM2IjoiSyIsIlx1MDEzNyI6ImsiLCJcdTAxMzgiOiJrIiwiXHUwMTM5IjoiTCIsIlx1MDEzYiI6IkwiLCJcdTAxM2QiOiJMIiwiXHUwMTNmIjoiTCIsIlx1MDE0MSI6IkwiLCJcdTAxM2EiOiJsIiwiXHUwMTNjIjoibCIsIlx1MDEzZSI6ImwiLCJcdTAxNDAiOiJsIiwiXHUwMTQyIjoibCIsIlx1MDE0MyI6Ik4iLCJcdTAxNDUiOiJOIiwiXHUwMTQ3IjoiTiIsIlx1MDE0YSI6Ik4iLCJcdTAxNDQiOiJuIiwiXHUwMTQ2IjoibiIsIlx1MDE0OCI6Im4iLCJcdTAxNGIiOiJuIiwiXHUwMTRjIjoiTyIsIlx1MDE0ZSI6Ik8iLCJcdTAxNTAiOiJPIiwiXHUwMTRkIjoibyIsIlx1MDE0ZiI6Im8iLCJcdTAxNTEiOiJvIiwiXHUwMTU0IjoiUiIsIlx1MDE1NiI6IlIiLCJcdTAxNTgiOiJSIiwiXHUwMTU1IjoiciIsIlx1MDE1NyI6InIiLCJcdTAxNTkiOiJyIiwiXHUwMTVhIjoiUyIsCiJcdTAxNWMiOiJTIiwiXHUwMTVlIjoiUyIsIlx1MDE2MCI6IlMiLCJcdTAxNWIiOiJzIiwiXHUwMTVkIjoicyIsIlx1MDE1ZiI6InMiLCJcdTAxNjEiOiJzIiwiXHUwMTYyIjoiVCIsIlx1MDE2NCI6IlQiLCJcdTAxNjYiOiJUIiwiXHUwMTYzIjoidCIsIlx1MDE2NSI6InQiLCJcdTAxNjciOiJ0IiwiXHUwMTY4IjoiVSIsIlx1MDE2YSI6IlUiLCJcdTAxNmMiOiJVIiwiXHUwMTZlIjoiVSIsIlx1MDE3MCI6IlUiLCJcdTAxNzIiOiJVIiwiXHUwMTY5IjoidSIsIlx1MDE2YiI6InUiLCJcdTAxNmQiOiJ1IiwiXHUwMTZmIjoidSIsIlx1MDE3MSI6InUiLCJcdTAxNzMiOiJ1IiwiXHUwMTc0IjoiVyIsIlx1MDE3NSI6InciLCJcdTAxNzYiOiJZIiwiXHUwMTc3IjoieSIsIlx1MDE3OCI6IlkiLCJcdTAxNzkiOiJaIiwiXHUwMTdiIjoiWiIsIlx1MDE3ZCI6IloiLCJcdTAxN2EiOiJ6IiwiXHUwMTdjIjoieiIsIlx1MDE3ZSI6InoiLCJcdTAxMzIiOiJJSiIsIlx1MDEzMyI6ImlqIiwiXHUwMTUyIjoiT2UiLAoiXHUwMTUzIjoib2UiLCJcdTAxNDkiOiInbiIsIlx1MDE3ZiI6InMifTt2YXIgaHRtbEVzY2FwZXM9eyJceDI2IjoiXHgyNmFtcDsiLCJceDNjIjoiXHgyNmx0OyIsIlx4M2UiOiJceDI2Z3Q7IiwnIic6Ilx4MjZxdW90OyIsIiciOiJceDI2IzM5OyJ9O3ZhciBodG1sVW5lc2NhcGVzPXsiXHgyNmFtcDsiOiJceDI2IiwiXHgyNmx0OyI6Ilx4M2MiLCJceDI2Z3Q7IjoiXHgzZSIsIlx4MjZxdW90OyI6JyInLCJceDI2IzM5OyI6IicifTt2YXIgc3RyaW5nRXNjYXBlcz17IlxcIjoiXFwiLCInIjoiJyIsIlxuIjoibiIsIlxyIjoiciIsIlx1MjAyOCI6InUyMDI4IiwiXHUyMDI5IjoidTIwMjkifTt2YXIgZnJlZVBhcnNlRmxvYXQ9cGFyc2VGbG9hdCxmcmVlUGFyc2VJbnQ9cGFyc2VJbnQ7dmFyIGZyZWVHbG9iYWw9dHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsO3ZhciBmcmVlU2VsZj10eXBlb2Ygc2VsZj09Im9iamVjdCImJgpzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZjt2YXIgcm9vdD1mcmVlR2xvYmFsfHxmcmVlU2VsZnx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTt2YXIgZnJlZUV4cG9ydHM9dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0czt2YXIgZnJlZU1vZHVsZT1mcmVlRXhwb3J0cyYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCImJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlO3ZhciBtb2R1bGVFeHBvcnRzPWZyZWVNb2R1bGUmJmZyZWVNb2R1bGUuZXhwb3J0cz09PWZyZWVFeHBvcnRzO3ZhciBmcmVlUHJvY2Vzcz1tb2R1bGVFeHBvcnRzJiZmcmVlR2xvYmFsLnByb2Nlc3M7dmFyIG5vZGVVdGlsPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBmcmVlUHJvY2VzcyYmZnJlZVByb2Nlc3MuYmluZGluZyYmZnJlZVByb2Nlc3MuYmluZGluZygidXRpbCIpfWNhdGNoKGUpe319KCk7dmFyIG5vZGVJc0FycmF5QnVmZmVyPW5vZGVVdGlsJiYKbm9kZVV0aWwuaXNBcnJheUJ1ZmZlcixub2RlSXNEYXRlPW5vZGVVdGlsJiZub2RlVXRpbC5pc0RhdGUsbm9kZUlzTWFwPW5vZGVVdGlsJiZub2RlVXRpbC5pc01hcCxub2RlSXNSZWdFeHA9bm9kZVV0aWwmJm5vZGVVdGlsLmlzUmVnRXhwLG5vZGVJc1NldD1ub2RlVXRpbCYmbm9kZVV0aWwuaXNTZXQsbm9kZUlzVHlwZWRBcnJheT1ub2RlVXRpbCYmbm9kZVV0aWwuaXNUeXBlZEFycmF5O2Z1bmN0aW9uIGFwcGx5KGZ1bmMsdGhpc0FyZyxhcmdzKXtzd2l0Y2goYXJncy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO2Nhc2UgMTpyZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsYXJnc1swXSk7Y2FzZSAyOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdLGFyZ3NbMV0pO2Nhc2UgMzpyZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pfXJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsYXJncyl9ZnVuY3Rpb24gYXJyYXlBZ2dyZWdhdG9yKGFycmF5LApzZXR0ZXIsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07c2V0dGVyKGFjY3VtdWxhdG9yLHZhbHVlLGl0ZXJhdGVlKHZhbHVlKSxhcnJheSl9cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSxpdGVyYXRlZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZihpdGVyYXRlZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpPT09ZmFsc2UpYnJlYWs7cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGFycmF5RWFjaFJpZ2h0KGFycmF5LGl0ZXJhdGVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKGxlbmd0aC0tKWlmKGl0ZXJhdGVlKGFycmF5W2xlbmd0aF0sbGVuZ3RoLGFycmF5KT09PWZhbHNlKWJyZWFrOwpyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlFdmVyeShhcnJheSxwcmVkaWNhdGUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpaWYoIXByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSxwcmVkaWNhdGUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYocHJlZGljYXRlKHZhbHVlLGluZGV4LGFycmF5KSlyZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LHZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiEhbGVuZ3RoJiZiYXNlSW5kZXhPZihhcnJheSwKdmFsdWUsMCk+LTF9ZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksdmFsdWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZihjb21wYXJhdG9yKHZhbHVlLGFycmF5W2luZGV4XSkpcmV0dXJuIHRydWU7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHJlc3VsdD1BcnJheShsZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXJlc3VsdFtpbmRleF09aXRlcmF0ZWUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSx2YWx1ZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dmFsdWVzLmxlbmd0aCxvZmZzZXQ9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFycmF5W29mZnNldCtpbmRleF09CnZhbHVlc1tpbmRleF07cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGFycmF5UmVkdWNlKGFycmF5LGl0ZXJhdGVlLGFjY3VtdWxhdG9yLGluaXRBY2N1bSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZihpbml0QWNjdW0mJmxlbmd0aClhY2N1bXVsYXRvcj1hcnJheVsrK2luZGV4XTt3aGlsZSgrK2luZGV4PGxlbmd0aClhY2N1bXVsYXRvcj1pdGVyYXRlZShhY2N1bXVsYXRvcixhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBhcnJheVJlZHVjZVJpZ2h0KGFycmF5LGl0ZXJhdGVlLGFjY3VtdWxhdG9yLGluaXRBY2N1bSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZihpbml0QWNjdW0mJmxlbmd0aClhY2N1bXVsYXRvcj1hcnJheVstLWxlbmd0aF07d2hpbGUobGVuZ3RoLS0pYWNjdW11bGF0b3I9aXRlcmF0ZWUoYWNjdW11bGF0b3IsYXJyYXlbbGVuZ3RoXSxsZW5ndGgsYXJyYXkpOwpyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZihwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9dmFyIGFzY2lpU2l6ZT1iYXNlUHJvcGVydHkoImxlbmd0aCIpO2Z1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpe3JldHVybiBzdHJpbmcuc3BsaXQoIiIpfWZ1bmN0aW9uIGFzY2lpV29yZHMoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLm1hdGNoKHJlQXNjaWlXb3JkKXx8W119ZnVuY3Rpb24gYmFzZUZpbmRLZXkoY29sbGVjdGlvbixwcmVkaWNhdGUsZWFjaEZ1bmMpe3ZhciByZXN1bHQ7ZWFjaEZ1bmMoY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7aWYocHJlZGljYXRlKHZhbHVlLGtleSxjb2xsZWN0aW9uKSl7cmVzdWx0PWtleTsKcmV0dXJuIGZhbHNlfX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSxwcmVkaWNhdGUsZnJvbUluZGV4LGZyb21SaWdodCl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGgsaW5kZXg9ZnJvbUluZGV4Kyhmcm9tUmlnaHQ/MTotMSk7d2hpbGUoZnJvbVJpZ2h0P2luZGV4LS06KytpbmRleDxsZW5ndGgpaWYocHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpcmV0dXJuIGluZGV4O3JldHVybi0xfWZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCl7cmV0dXJuIHZhbHVlPT09dmFsdWU/c3RyaWN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpOmJhc2VGaW5kSW5kZXgoYXJyYXksYmFzZUlzTmFOLGZyb21JbmRleCl9ZnVuY3Rpb24gYmFzZUluZGV4T2ZXaXRoKGFycmF5LHZhbHVlLGZyb21JbmRleCxjb21wYXJhdG9yKXt2YXIgaW5kZXg9ZnJvbUluZGV4LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PApsZW5ndGgpaWYoY29tcGFyYXRvcihhcnJheVtpbmRleF0sdmFsdWUpKXJldHVybiBpbmRleDtyZXR1cm4tMX1mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpe3JldHVybiB2YWx1ZSE9PXZhbHVlfWZ1bmN0aW9uIGJhc2VNZWFuKGFycmF5LGl0ZXJhdGVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YmFzZVN1bShhcnJheSxpdGVyYXRlZSkvbGVuZ3RoOk5BTn1mdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP3VuZGVmaW5lZDpvYmplY3Rba2V5XX19ZnVuY3Rpb24gYmFzZVByb3BlcnR5T2Yob2JqZWN0KXtyZXR1cm4gZnVuY3Rpb24oa2V5KXtyZXR1cm4gb2JqZWN0PT1udWxsP3VuZGVmaW5lZDpvYmplY3Rba2V5XX19ZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLGl0ZXJhdGVlLGFjY3VtdWxhdG9yLGluaXRBY2N1bSxlYWNoRnVuYyl7ZWFjaEZ1bmMoY29sbGVjdGlvbiwKZnVuY3Rpb24odmFsdWUsaW5kZXgsY29sbGVjdGlvbil7YWNjdW11bGF0b3I9aW5pdEFjY3VtPyhpbml0QWNjdW09ZmFsc2UsdmFsdWUpOml0ZXJhdGVlKGFjY3VtdWxhdG9yLHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VTb3J0QnkoYXJyYXksY29tcGFyZXIpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO2FycmF5LnNvcnQoY29tcGFyZXIpO3doaWxlKGxlbmd0aC0tKWFycmF5W2xlbmd0aF09YXJyYXlbbGVuZ3RoXS52YWx1ZTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYmFzZVN1bShhcnJheSxpdGVyYXRlZSl7dmFyIHJlc3VsdCxpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgY3VycmVudD1pdGVyYXRlZShhcnJheVtpbmRleF0pO2lmKGN1cnJlbnQhPT11bmRlZmluZWQpcmVzdWx0PXJlc3VsdD09PXVuZGVmaW5lZD9jdXJyZW50OnJlc3VsdCtjdXJyZW50fXJldHVybiByZXN1bHR9CmZ1bmN0aW9uIGJhc2VUaW1lcyhuLGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KG4pO3doaWxlKCsraW5kZXg8bilyZXN1bHRbaW5kZXhdPWl0ZXJhdGVlKGluZGV4KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VUb1BhaXJzKG9iamVjdCxwcm9wcyl7cmV0dXJuIGFycmF5TWFwKHByb3BzLGZ1bmN0aW9uKGtleSl7cmV0dXJuW2tleSxvYmplY3Rba2V5XV19KX1mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYyl7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gZnVuYyh2YWx1ZSl9fWZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlNYXAocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm4gb2JqZWN0W2tleV19KX1mdW5jdGlvbiBjYWNoZUhhcyhjYWNoZSxrZXkpe3JldHVybiBjYWNoZS5oYXMoa2V5KX1mdW5jdGlvbiBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scyxjaHJTeW1ib2xzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXN0clN5bWJvbHMubGVuZ3RoOwp3aGlsZSgrK2luZGV4PGxlbmd0aCYmYmFzZUluZGV4T2YoY2hyU3ltYm9scyxzdHJTeW1ib2xzW2luZGV4XSwwKT4tMSk7cmV0dXJuIGluZGV4fWZ1bmN0aW9uIGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scyxjaHJTeW1ib2xzKXt2YXIgaW5kZXg9c3RyU3ltYm9scy5sZW5ndGg7d2hpbGUoaW5kZXgtLSYmYmFzZUluZGV4T2YoY2hyU3ltYm9scyxzdHJTeW1ib2xzW2luZGV4XSwwKT4tMSk7cmV0dXJuIGluZGV4fWZ1bmN0aW9uIGNvdW50SG9sZGVycyhhcnJheSxwbGFjZWhvbGRlcil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGgscmVzdWx0PTA7d2hpbGUobGVuZ3RoLS0paWYoYXJyYXlbbGVuZ3RoXT09PXBsYWNlaG9sZGVyKSsrcmVzdWx0O3JldHVybiByZXN1bHR9dmFyIGRlYnVyckxldHRlcj1iYXNlUHJvcGVydHlPZihkZWJ1cnJlZExldHRlcnMpO3ZhciBlc2NhcGVIdG1sQ2hhcj1iYXNlUHJvcGVydHlPZihodG1sRXNjYXBlcyk7ZnVuY3Rpb24gZXNjYXBlU3RyaW5nQ2hhcihjaHIpe3JldHVybiJcXCIrCnN0cmluZ0VzY2FwZXNbY2hyXX1mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3Qsa2V5KXtyZXR1cm4gb2JqZWN0PT1udWxsP3VuZGVmaW5lZDpvYmplY3Rba2V5XX1mdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZyl7cmV0dXJuIHJlSGFzVW5pY29kZS50ZXN0KHN0cmluZyl9ZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKXtyZXR1cm4gcmVIYXNVbmljb2RlV29yZC50ZXN0KHN0cmluZyl9ZnVuY3Rpb24gaXRlcmF0b3JUb0FycmF5KGl0ZXJhdG9yKXt2YXIgZGF0YSxyZXN1bHQ9W107d2hpbGUoIShkYXRhPWl0ZXJhdG9yLm5leHQoKSkuZG9uZSlyZXN1bHQucHVzaChkYXRhLnZhbHVlKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KG1hcC5zaXplKTttYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSxrZXkpe3Jlc3VsdFsrK2luZGV4XT1ba2V5LHZhbHVlXX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gb3ZlckFyZyhmdW5jLAp0cmFuc2Zvcm0pe3JldHVybiBmdW5jdGlvbihhcmcpe3JldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKX19ZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXkscGxhY2Vob2xkZXIpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO2lmKHZhbHVlPT09cGxhY2Vob2xkZXJ8fHZhbHVlPT09UExBQ0VIT0xERVIpe2FycmF5W2luZGV4XT1QTEFDRUhPTERFUjtyZXN1bHRbcmVzSW5kZXgrK109aW5kZXh9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gc2FmZUdldChvYmplY3Qsa2V5KXtyZXR1cm4ga2V5PT0iX19wcm90b19fIj91bmRlZmluZWQ6b2JqZWN0W2tleV19ZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkoc2V0LnNpemUpO3NldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKXtyZXN1bHRbKytpbmRleF09dmFsdWV9KTsKcmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBzZXRUb1BhaXJzKHNldCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShzZXQuc2l6ZSk7c2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpe3Jlc3VsdFsrK2luZGV4XT1bdmFsdWUsdmFsdWVdfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCl7dmFyIGluZGV4PWZyb21JbmRleC0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpaWYoYXJyYXlbaW5kZXhdPT09dmFsdWUpcmV0dXJuIGluZGV4O3JldHVybi0xfWZ1bmN0aW9uIHN0cmljdExhc3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCl7dmFyIGluZGV4PWZyb21JbmRleCsxO3doaWxlKGluZGV4LS0paWYoYXJyYXlbaW5kZXhdPT09dmFsdWUpcmV0dXJuIGluZGV4O3JldHVybiBpbmRleH1mdW5jdGlvbiBzdHJpbmdTaXplKHN0cmluZyl7cmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKT91bmljb2RlU2l6ZShzdHJpbmcpOgphc2NpaVNpemUoc3RyaW5nKX1mdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZyl7cmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKT91bmljb2RlVG9BcnJheShzdHJpbmcpOmFzY2lpVG9BcnJheShzdHJpbmcpfXZhciB1bmVzY2FwZUh0bWxDaGFyPWJhc2VQcm9wZXJ0eU9mKGh0bWxVbmVzY2FwZXMpO2Z1bmN0aW9uIHVuaWNvZGVTaXplKHN0cmluZyl7dmFyIHJlc3VsdD1yZVVuaWNvZGUubGFzdEluZGV4PTA7d2hpbGUocmVVbmljb2RlLnRlc3Qoc3RyaW5nKSkrK3Jlc3VsdDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZyl7cmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGUpfHxbXX1mdW5jdGlvbiB1bmljb2RlV29yZHMoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZVdvcmQpfHxbXX12YXIgcnVuSW5Db250ZXh0PWZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0KXtjb250ZXh0PWNvbnRleHQ9PW51bGw/cm9vdDpfLmRlZmF1bHRzKHJvb3QuT2JqZWN0KCksCmNvbnRleHQsXy5waWNrKHJvb3QsY29udGV4dFByb3BzKSk7dmFyIEFycmF5PWNvbnRleHQuQXJyYXksRGF0ZT1jb250ZXh0LkRhdGUsRXJyb3I9Y29udGV4dC5FcnJvcixGdW5jdGlvbj1jb250ZXh0LkZ1bmN0aW9uLE1hdGg9Y29udGV4dC5NYXRoLE9iamVjdD1jb250ZXh0Lk9iamVjdCxSZWdFeHA9Y29udGV4dC5SZWdFeHAsU3RyaW5nPWNvbnRleHQuU3RyaW5nLFR5cGVFcnJvcj1jb250ZXh0LlR5cGVFcnJvcjt2YXIgYXJyYXlQcm90bz1BcnJheS5wcm90b3R5cGUsZnVuY1Byb3RvPUZ1bmN0aW9uLnByb3RvdHlwZSxvYmplY3RQcm90bz1PYmplY3QucHJvdG90eXBlO3ZhciBjb3JlSnNEYXRhPWNvbnRleHRbIl9fY29yZS1qc19zaGFyZWRfXyJdO3ZhciBmdW5jVG9TdHJpbmc9ZnVuY1Byb3RvLnRvU3RyaW5nO3ZhciBoYXNPd25Qcm9wZXJ0eT1vYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTt2YXIgaWRDb3VudGVyPTA7dmFyIG1hc2tTcmNLZXk9ZnVuY3Rpb24oKXt2YXIgdWlkPQovW14uXSskLy5leGVjKGNvcmVKc0RhdGEmJmNvcmVKc0RhdGEua2V5cyYmY29yZUpzRGF0YS5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHVpZD8iU3ltYm9sKHNyYylfMS4iK3VpZDoiIn0oKTt2YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmc9b2JqZWN0UHJvdG8udG9TdHJpbmc7dmFyIG9iamVjdEN0b3JTdHJpbmc9ZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTt2YXIgb2xkRGFzaD1yb290Ll87dmFyIHJlSXNOYXRpdmU9UmVnRXhwKCJeIitmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsIlxcJFx4MjYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIEJ1ZmZlcj1tb2R1bGVFeHBvcnRzP2NvbnRleHQuQnVmZmVyOnVuZGVmaW5lZCxTeW1ib2w9Y29udGV4dC5TeW1ib2wsVWludDhBcnJheT1jb250ZXh0LlVpbnQ4QXJyYXksYWxsb2NVbnNhZmU9CkJ1ZmZlcj9CdWZmZXIuYWxsb2NVbnNhZmU6dW5kZWZpbmVkLGdldFByb3RvdHlwZT1vdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZixPYmplY3QpLG9iamVjdENyZWF0ZT1PYmplY3QuY3JlYXRlLHByb3BlcnR5SXNFbnVtZXJhYmxlPW9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlLHNwbGljZT1hcnJheVByb3RvLnNwbGljZSxzcHJlYWRhYmxlU3ltYm9sPVN5bWJvbD9TeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlOnVuZGVmaW5lZCxzeW1JdGVyYXRvcj1TeW1ib2w/U3ltYm9sLml0ZXJhdG9yOnVuZGVmaW5lZCxzeW1Ub1N0cmluZ1RhZz1TeW1ib2w/U3ltYm9sLnRvU3RyaW5nVGFnOnVuZGVmaW5lZDt2YXIgZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24oKXt0cnl7dmFyIGZ1bmM9Z2V0TmF0aXZlKE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtmdW5jKHt9LCIiLHt9KTtyZXR1cm4gZnVuY31jYXRjaChlKXt9fSgpO3ZhciBjdHhDbGVhclRpbWVvdXQ9Y29udGV4dC5jbGVhclRpbWVvdXQhPT0Kcm9vdC5jbGVhclRpbWVvdXQmJmNvbnRleHQuY2xlYXJUaW1lb3V0LGN0eE5vdz1EYXRlJiZEYXRlLm5vdyE9PXJvb3QuRGF0ZS5ub3cmJkRhdGUubm93LGN0eFNldFRpbWVvdXQ9Y29udGV4dC5zZXRUaW1lb3V0IT09cm9vdC5zZXRUaW1lb3V0JiZjb250ZXh0LnNldFRpbWVvdXQ7dmFyIG5hdGl2ZUNlaWw9TWF0aC5jZWlsLG5hdGl2ZUZsb29yPU1hdGguZmxvb3IsbmF0aXZlR2V0U3ltYm9scz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLG5hdGl2ZUlzQnVmZmVyPUJ1ZmZlcj9CdWZmZXIuaXNCdWZmZXI6dW5kZWZpbmVkLG5hdGl2ZUlzRmluaXRlPWNvbnRleHQuaXNGaW5pdGUsbmF0aXZlSm9pbj1hcnJheVByb3RvLmpvaW4sbmF0aXZlS2V5cz1vdmVyQXJnKE9iamVjdC5rZXlzLE9iamVjdCksbmF0aXZlTWF4PU1hdGgubWF4LG5hdGl2ZU1pbj1NYXRoLm1pbixuYXRpdmVOb3c9RGF0ZS5ub3csbmF0aXZlUGFyc2VJbnQ9Y29udGV4dC5wYXJzZUludCxuYXRpdmVSYW5kb209Ck1hdGgucmFuZG9tLG5hdGl2ZVJldmVyc2U9YXJyYXlQcm90by5yZXZlcnNlO3ZhciBEYXRhVmlldz1nZXROYXRpdmUoY29udGV4dCwiRGF0YVZpZXciKSxNYXA9Z2V0TmF0aXZlKGNvbnRleHQsIk1hcCIpLFByb21pc2U9Z2V0TmF0aXZlKGNvbnRleHQsIlByb21pc2UiKSxTZXQ9Z2V0TmF0aXZlKGNvbnRleHQsIlNldCIpLFdlYWtNYXA9Z2V0TmF0aXZlKGNvbnRleHQsIldlYWtNYXAiKSxuYXRpdmVDcmVhdGU9Z2V0TmF0aXZlKE9iamVjdCwiY3JlYXRlIik7dmFyIG1ldGFNYXA9V2Vha01hcCYmbmV3IFdlYWtNYXA7dmFyIHJlYWxOYW1lcz17fTt2YXIgZGF0YVZpZXdDdG9yU3RyaW5nPXRvU291cmNlKERhdGFWaWV3KSxtYXBDdG9yU3RyaW5nPXRvU291cmNlKE1hcCkscHJvbWlzZUN0b3JTdHJpbmc9dG9Tb3VyY2UoUHJvbWlzZSksc2V0Q3RvclN0cmluZz10b1NvdXJjZShTZXQpLHdlYWtNYXBDdG9yU3RyaW5nPXRvU291cmNlKFdlYWtNYXApO3ZhciBzeW1ib2xQcm90bz1TeW1ib2w/ClN5bWJvbC5wcm90b3R5cGU6dW5kZWZpbmVkLHN5bWJvbFZhbHVlT2Y9c3ltYm9sUHJvdG8/c3ltYm9sUHJvdG8udmFsdWVPZjp1bmRlZmluZWQsc3ltYm9sVG9TdHJpbmc9c3ltYm9sUHJvdG8/c3ltYm9sUHJvdG8udG9TdHJpbmc6dW5kZWZpbmVkO2Z1bmN0aW9uIGxvZGFzaCh2YWx1ZSl7aWYoaXNPYmplY3RMaWtlKHZhbHVlKSYmIWlzQXJyYXkodmFsdWUpJiYhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpKXtpZih2YWx1ZSBpbnN0YW5jZW9mIExvZGFzaFdyYXBwZXIpcmV0dXJuIHZhbHVlO2lmKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIl9fd3JhcHBlZF9fIikpcmV0dXJuIHdyYXBwZXJDbG9uZSh2YWx1ZSl9cmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlKX12YXIgYmFzZUNyZWF0ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG9iamVjdCgpe31yZXR1cm4gZnVuY3Rpb24ocHJvdG8pe2lmKCFpc09iamVjdChwcm90bykpcmV0dXJue307aWYob2JqZWN0Q3JlYXRlKXJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pOwpvYmplY3QucHJvdG90eXBlPXByb3RvO3ZhciByZXN1bHQ9bmV3IG9iamVjdDtvYmplY3QucHJvdG90eXBlPXVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0fX0oKTtmdW5jdGlvbiBiYXNlTG9kYXNoKCl7fWZ1bmN0aW9uIExvZGFzaFdyYXBwZXIodmFsdWUsY2hhaW5BbGwpe3RoaXMuX193cmFwcGVkX189dmFsdWU7dGhpcy5fX2FjdGlvbnNfXz1bXTt0aGlzLl9fY2hhaW5fXz0hIWNoYWluQWxsO3RoaXMuX19pbmRleF9fPTA7dGhpcy5fX3ZhbHVlc19fPXVuZGVmaW5lZH1sb2Rhc2gudGVtcGxhdGVTZXR0aW5ncz17ImVzY2FwZSI6cmVFc2NhcGUsImV2YWx1YXRlIjpyZUV2YWx1YXRlLCJpbnRlcnBvbGF0ZSI6cmVJbnRlcnBvbGF0ZSwidmFyaWFibGUiOiIiLCJpbXBvcnRzIjp7Il8iOmxvZGFzaH19O2xvZGFzaC5wcm90b3R5cGU9YmFzZUxvZGFzaC5wcm90b3R5cGU7bG9kYXNoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1sb2Rhc2g7TG9kYXNoV3JhcHBlci5wcm90b3R5cGU9YmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7CkxvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxvZGFzaFdyYXBwZXI7ZnVuY3Rpb24gTGF6eVdyYXBwZXIodmFsdWUpe3RoaXMuX193cmFwcGVkX189dmFsdWU7dGhpcy5fX2FjdGlvbnNfXz1bXTt0aGlzLl9fZGlyX189MTt0aGlzLl9fZmlsdGVyZWRfXz1mYWxzZTt0aGlzLl9faXRlcmF0ZWVzX189W107dGhpcy5fX3Rha2VDb3VudF9fPU1BWF9BUlJBWV9MRU5HVEg7dGhpcy5fX3ZpZXdzX189W119ZnVuY3Rpb24gbGF6eUNsb25lKCl7dmFyIHJlc3VsdD1uZXcgTGF6eVdyYXBwZXIodGhpcy5fX3dyYXBwZWRfXyk7cmVzdWx0Ll9fYWN0aW9uc19fPWNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtyZXN1bHQuX19kaXJfXz10aGlzLl9fZGlyX187cmVzdWx0Ll9fZmlsdGVyZWRfXz10aGlzLl9fZmlsdGVyZWRfXztyZXN1bHQuX19pdGVyYXRlZXNfXz1jb3B5QXJyYXkodGhpcy5fX2l0ZXJhdGVlc19fKTtyZXN1bHQuX190YWtlQ291bnRfXz10aGlzLl9fdGFrZUNvdW50X187CnJlc3VsdC5fX3ZpZXdzX189Y29weUFycmF5KHRoaXMuX192aWV3c19fKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGxhenlSZXZlcnNlKCl7aWYodGhpcy5fX2ZpbHRlcmVkX18pe3ZhciByZXN1bHQ9bmV3IExhenlXcmFwcGVyKHRoaXMpO3Jlc3VsdC5fX2Rpcl9fPS0xO3Jlc3VsdC5fX2ZpbHRlcmVkX189dHJ1ZX1lbHNle3Jlc3VsdD10aGlzLmNsb25lKCk7cmVzdWx0Ll9fZGlyX18qPS0xfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gbGF6eVZhbHVlKCl7dmFyIGFycmF5PXRoaXMuX193cmFwcGVkX18udmFsdWUoKSxkaXI9dGhpcy5fX2Rpcl9fLGlzQXJyPWlzQXJyYXkoYXJyYXkpLGlzUmlnaHQ9ZGlyPDAsYXJyTGVuZ3RoPWlzQXJyP2FycmF5Lmxlbmd0aDowLHZpZXc9Z2V0VmlldygwLGFyckxlbmd0aCx0aGlzLl9fdmlld3NfXyksc3RhcnQ9dmlldy5zdGFydCxlbmQ9dmlldy5lbmQsbGVuZ3RoPWVuZC1zdGFydCxpbmRleD1pc1JpZ2h0P2VuZDpzdGFydC0xLGl0ZXJhdGVlcz10aGlzLl9faXRlcmF0ZWVzX18sCml0ZXJMZW5ndGg9aXRlcmF0ZWVzLmxlbmd0aCxyZXNJbmRleD0wLHRha2VDb3VudD1uYXRpdmVNaW4obGVuZ3RoLHRoaXMuX190YWtlQ291bnRfXyk7aWYoIWlzQXJyfHwhaXNSaWdodCYmYXJyTGVuZ3RoPT1sZW5ndGgmJnRha2VDb3VudD09bGVuZ3RoKXJldHVybiBiYXNlV3JhcHBlclZhbHVlKGFycmF5LHRoaXMuX19hY3Rpb25zX18pO3ZhciByZXN1bHQ9W107b3V0ZXI6d2hpbGUobGVuZ3RoLS0mJnJlc0luZGV4PHRha2VDb3VudCl7aW5kZXgrPWRpcjt2YXIgaXRlckluZGV4PS0xLHZhbHVlPWFycmF5W2luZGV4XTt3aGlsZSgrK2l0ZXJJbmRleDxpdGVyTGVuZ3RoKXt2YXIgZGF0YT1pdGVyYXRlZXNbaXRlckluZGV4XSxpdGVyYXRlZT1kYXRhLml0ZXJhdGVlLHR5cGU9ZGF0YS50eXBlLGNvbXB1dGVkPWl0ZXJhdGVlKHZhbHVlKTtpZih0eXBlPT1MQVpZX01BUF9GTEFHKXZhbHVlPWNvbXB1dGVkO2Vsc2UgaWYoIWNvbXB1dGVkKWlmKHR5cGU9PUxBWllfRklMVEVSX0ZMQUcpY29udGludWUgb3V0ZXI7CmVsc2UgYnJlYWsgb3V0ZXJ9cmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlfXJldHVybiByZXN1bHR9TGF6eVdyYXBwZXIucHJvdG90eXBlPWJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO0xhenlXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1MYXp5V3JhcHBlcjtmdW5jdGlvbiBIYXNoKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gaGFzaENsZWFyKCl7dGhpcy5fX2RhdGFfXz1uYXRpdmVDcmVhdGU/bmF0aXZlQ3JlYXRlKG51bGwpOnt9O3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KXt2YXIgcmVzdWx0PXRoaXMuaGFzKGtleSkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07dGhpcy5zaXplLT1yZXN1bHQ/MTowOwpyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGhhc2hHZXQoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fO2lmKG5hdGl2ZUNyZWF0ZSl7dmFyIHJlc3VsdD1kYXRhW2tleV07cmV0dXJuIHJlc3VsdD09PUhBU0hfVU5ERUZJTkVEP3VuZGVmaW5lZDpyZXN1bHR9cmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSxrZXkpP2RhdGFba2V5XTp1bmRlZmluZWR9ZnVuY3Rpb24gaGFzaEhhcyhrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187cmV0dXJuIG5hdGl2ZUNyZWF0ZT9kYXRhW2tleV0hPT11bmRlZmluZWQ6aGFzT3duUHJvcGVydHkuY2FsbChkYXRhLGtleSl9ZnVuY3Rpb24gaGFzaFNldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187dGhpcy5zaXplKz10aGlzLmhhcyhrZXkpPzA6MTtkYXRhW2tleV09bmF0aXZlQ3JlYXRlJiZ2YWx1ZT09PXVuZGVmaW5lZD9IQVNIX1VOREVGSU5FRDp2YWx1ZTtyZXR1cm4gdGhpc31IYXNoLnByb3RvdHlwZS5jbGVhcj1oYXNoQ2xlYXI7Ckhhc2gucHJvdG90eXBlWyJkZWxldGUiXT1oYXNoRGVsZXRlO0hhc2gucHJvdG90eXBlLmdldD1oYXNoR2V0O0hhc2gucHJvdG90eXBlLmhhcz1oYXNoSGFzO0hhc2gucHJvdG90eXBlLnNldD1oYXNoU2V0O2Z1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM9PW51bGw/MDplbnRyaWVzLmxlbmd0aDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCl7dGhpcy5fX2RhdGFfXz1bXTt0aGlzLnNpemU9MH1mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7aWYoaW5kZXg8MClyZXR1cm4gZmFsc2U7dmFyIGxhc3RJbmRleD1kYXRhLmxlbmd0aC0xO2lmKGluZGV4PT1sYXN0SW5kZXgpZGF0YS5wb3AoKTsKZWxzZSBzcGxpY2UuY2FsbChkYXRhLGluZGV4LDEpOy0tdGhpcy5zaXplO3JldHVybiB0cnVlfWZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtyZXR1cm4gaW5kZXg8MD91bmRlZmluZWQ6ZGF0YVtpbmRleF1bMV19ZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSl7cmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLGtleSk+LTF9ZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO2lmKGluZGV4PDApeysrdGhpcy5zaXplO2RhdGEucHVzaChba2V5LHZhbHVlXSl9ZWxzZSBkYXRhW2luZGV4XVsxXT12YWx1ZTtyZXR1cm4gdGhpc31MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyPWxpc3RDYWNoZUNsZWFyO0xpc3RDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdPWxpc3RDYWNoZURlbGV0ZTtMaXN0Q2FjaGUucHJvdG90eXBlLmdldD0KbGlzdENhY2hlR2V0O0xpc3RDYWNoZS5wcm90b3R5cGUuaGFzPWxpc3RDYWNoZUhhcztMaXN0Q2FjaGUucHJvdG90eXBlLnNldD1saXN0Q2FjaGVTZXQ7ZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCl7dGhpcy5zaXplPTA7dGhpcy5fX2RhdGFfXz17Imhhc2giOm5ldyBIYXNoLCJtYXAiOm5ldyAoTWFwfHxMaXN0Q2FjaGUpLCJzdHJpbmciOm5ldyBIYXNofX1mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpe3ZhciByZXN1bHQ9Z2V0TWFwRGF0YSh0aGlzLGtleSlbImRlbGV0ZSJdKGtleSk7dGhpcy5zaXplLT1yZXN1bHQ/MTowO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLAprZXkpLmdldChrZXkpfWZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSl7cmV0dXJuIGdldE1hcERhdGEodGhpcyxrZXkpLmhhcyhrZXkpfWZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9Z2V0TWFwRGF0YSh0aGlzLGtleSksc2l6ZT1kYXRhLnNpemU7ZGF0YS5zZXQoa2V5LHZhbHVlKTt0aGlzLnNpemUrPWRhdGEuc2l6ZT09c2l6ZT8wOjE7cmV0dXJuIHRoaXN9TWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyPW1hcENhY2hlQ2xlYXI7TWFwQ2FjaGUucHJvdG90eXBlWyJkZWxldGUiXT1tYXBDYWNoZURlbGV0ZTtNYXBDYWNoZS5wcm90b3R5cGUuZ2V0PW1hcENhY2hlR2V0O01hcENhY2hlLnByb3RvdHlwZS5oYXM9bWFwQ2FjaGVIYXM7TWFwQ2FjaGUucHJvdG90eXBlLnNldD1tYXBDYWNoZVNldDtmdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dmFsdWVzPT1udWxsPzA6dmFsdWVzLmxlbmd0aDt0aGlzLl9fZGF0YV9fPW5ldyBNYXBDYWNoZTsKd2hpbGUoKytpbmRleDxsZW5ndGgpdGhpcy5hZGQodmFsdWVzW2luZGV4XSl9ZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpe3RoaXMuX19kYXRhX18uc2V0KHZhbHVlLEhBU0hfVU5ERUZJTkVEKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHZhbHVlKX1TZXRDYWNoZS5wcm90b3R5cGUuYWRkPVNldENhY2hlLnByb3RvdHlwZS5wdXNoPXNldENhY2hlQWRkO1NldENhY2hlLnByb3RvdHlwZS5oYXM9c2V0Q2FjaGVIYXM7ZnVuY3Rpb24gU3RhY2soZW50cmllcyl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXz1uZXcgTGlzdENhY2hlKGVudHJpZXMpO3RoaXMuc2l6ZT1kYXRhLnNpemV9ZnVuY3Rpb24gc3RhY2tDbGVhcigpe3RoaXMuX19kYXRhX189bmV3IExpc3RDYWNoZTt0aGlzLnNpemU9MH1mdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18scmVzdWx0PWRhdGFbImRlbGV0ZSJdKGtleSk7CnRoaXMuc2l6ZT1kYXRhLnNpemU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBzdGFja0dldChrZXkpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpfWZ1bmN0aW9uIHN0YWNrSGFzKGtleSl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSl9ZnVuY3Rpb24gc3RhY2tTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fO2lmKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpe3ZhciBwYWlycz1kYXRhLl9fZGF0YV9fO2lmKCFNYXB8fHBhaXJzLmxlbmd0aDxMQVJHRV9BUlJBWV9TSVpFLTEpe3BhaXJzLnB1c2goW2tleSx2YWx1ZV0pO3RoaXMuc2l6ZT0rK2RhdGEuc2l6ZTtyZXR1cm4gdGhpc31kYXRhPXRoaXMuX19kYXRhX189bmV3IE1hcENhY2hlKHBhaXJzKX1kYXRhLnNldChrZXksdmFsdWUpO3RoaXMuc2l6ZT1kYXRhLnNpemU7cmV0dXJuIHRoaXN9U3RhY2sucHJvdG90eXBlLmNsZWFyPXN0YWNrQ2xlYXI7U3RhY2sucHJvdG90eXBlWyJkZWxldGUiXT1zdGFja0RlbGV0ZTsKU3RhY2sucHJvdG90eXBlLmdldD1zdGFja0dldDtTdGFjay5wcm90b3R5cGUuaGFzPXN0YWNrSGFzO1N0YWNrLnByb3RvdHlwZS5zZXQ9c3RhY2tTZXQ7ZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSxpbmhlcml0ZWQpe3ZhciBpc0Fycj1pc0FycmF5KHZhbHVlKSxpc0FyZz0haXNBcnImJmlzQXJndW1lbnRzKHZhbHVlKSxpc0J1ZmY9IWlzQXJyJiYhaXNBcmcmJmlzQnVmZmVyKHZhbHVlKSxpc1R5cGU9IWlzQXJyJiYhaXNBcmcmJiFpc0J1ZmYmJmlzVHlwZWRBcnJheSh2YWx1ZSksc2tpcEluZGV4ZXM9aXNBcnJ8fGlzQXJnfHxpc0J1ZmZ8fGlzVHlwZSxyZXN1bHQ9c2tpcEluZGV4ZXM/YmFzZVRpbWVzKHZhbHVlLmxlbmd0aCxTdHJpbmcpOltdLGxlbmd0aD1yZXN1bHQubGVuZ3RoO2Zvcih2YXIga2V5IGluIHZhbHVlKWlmKChpbmhlcml0ZWR8fGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsa2V5KSkmJiEoc2tpcEluZGV4ZXMmJihrZXk9PSJsZW5ndGgifHxpc0J1ZmYmJihrZXk9PQoib2Zmc2V0Inx8a2V5PT0icGFyZW50Iil8fGlzVHlwZSYmKGtleT09ImJ1ZmZlciJ8fGtleT09ImJ5dGVMZW5ndGgifHxrZXk9PSJieXRlT2Zmc2V0Iil8fGlzSW5kZXgoa2V5LGxlbmd0aCkpKSlyZXN1bHQucHVzaChrZXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYXJyYXlTYW1wbGUoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YXJyYXlbYmFzZVJhbmRvbSgwLGxlbmd0aC0xKV06dW5kZWZpbmVkfWZ1bmN0aW9uIGFycmF5U2FtcGxlU2l6ZShhcnJheSxuKXtyZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSxiYXNlQ2xhbXAobiwwLGFycmF5Lmxlbmd0aCkpfWZ1bmN0aW9uIGFycmF5U2h1ZmZsZShhcnJheSl7cmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSkpfWZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl7aWYodmFsdWUhPT11bmRlZmluZWQmJiFlcShvYmplY3Rba2V5XSx2YWx1ZSl8fAp2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KSliYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl9ZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl7dmFyIG9ialZhbHVlPW9iamVjdFtrZXldO2lmKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSYmZXEob2JqVmFsdWUsdmFsdWUpKXx8dmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCkpYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpfWZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSxrZXkpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKGxlbmd0aC0tKWlmKGVxKGFycmF5W2xlbmd0aF1bMF0sa2V5KSlyZXR1cm4gbGVuZ3RoO3JldHVybi0xfWZ1bmN0aW9uIGJhc2VBZ2dyZWdhdG9yKGNvbGxlY3Rpb24sc2V0dGVyLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXtzZXR0ZXIoYWNjdW11bGF0b3IsCnZhbHVlLGl0ZXJhdGVlKHZhbHVlKSxjb2xsZWN0aW9uKX0pO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBiYXNlQXNzaWduKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3QmJmNvcHlPYmplY3Qoc291cmNlLGtleXMoc291cmNlKSxvYmplY3QpfWZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3Qsc291cmNlKXtyZXR1cm4gb2JqZWN0JiZjb3B5T2JqZWN0KHNvdXJjZSxrZXlzSW4oc291cmNlKSxvYmplY3QpfWZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXtpZihrZXk9PSJfX3Byb3RvX18iJiZkZWZpbmVQcm9wZXJ0eSlkZWZpbmVQcm9wZXJ0eShvYmplY3Qsa2V5LHsiY29uZmlndXJhYmxlIjp0cnVlLCJlbnVtZXJhYmxlIjp0cnVlLCJ2YWx1ZSI6dmFsdWUsIndyaXRhYmxlIjp0cnVlfSk7ZWxzZSBvYmplY3Rba2V5XT12YWx1ZX1mdW5jdGlvbiBiYXNlQXQob2JqZWN0LHBhdGhzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGhzLmxlbmd0aCxyZXN1bHQ9CkFycmF5KGxlbmd0aCksc2tpcD1vYmplY3Q9PW51bGw7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1za2lwP3VuZGVmaW5lZDpnZXQob2JqZWN0LHBhdGhzW2luZGV4XSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLGxvd2VyLHVwcGVyKXtpZihudW1iZXI9PT1udW1iZXIpe2lmKHVwcGVyIT09dW5kZWZpbmVkKW51bWJlcj1udW1iZXI8PXVwcGVyP251bWJlcjp1cHBlcjtpZihsb3dlciE9PXVuZGVmaW5lZCludW1iZXI9bnVtYmVyPj1sb3dlcj9udW1iZXI6bG93ZXJ9cmV0dXJuIG51bWJlcn1mdW5jdGlvbiBiYXNlQ2xvbmUodmFsdWUsYml0bWFzayxjdXN0b21pemVyLGtleSxvYmplY3Qsc3RhY2spe3ZhciByZXN1bHQsaXNEZWVwPWJpdG1hc2smQ0xPTkVfREVFUF9GTEFHLGlzRmxhdD1iaXRtYXNrJkNMT05FX0ZMQVRfRkxBRyxpc0Z1bGw9Yml0bWFzayZDTE9ORV9TWU1CT0xTX0ZMQUc7aWYoY3VzdG9taXplcilyZXN1bHQ9b2JqZWN0PwpjdXN0b21pemVyKHZhbHVlLGtleSxvYmplY3Qsc3RhY2spOmN1c3RvbWl6ZXIodmFsdWUpO2lmKHJlc3VsdCE9PXVuZGVmaW5lZClyZXR1cm4gcmVzdWx0O2lmKCFpc09iamVjdCh2YWx1ZSkpcmV0dXJuIHZhbHVlO3ZhciBpc0Fycj1pc0FycmF5KHZhbHVlKTtpZihpc0Fycil7cmVzdWx0PWluaXRDbG9uZUFycmF5KHZhbHVlKTtpZighaXNEZWVwKXJldHVybiBjb3B5QXJyYXkodmFsdWUscmVzdWx0KX1lbHNle3ZhciB0YWc9Z2V0VGFnKHZhbHVlKSxpc0Z1bmM9dGFnPT1mdW5jVGFnfHx0YWc9PWdlblRhZztpZihpc0J1ZmZlcih2YWx1ZSkpcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLGlzRGVlcCk7aWYodGFnPT1vYmplY3RUYWd8fHRhZz09YXJnc1RhZ3x8aXNGdW5jJiYhb2JqZWN0KXtyZXN1bHQ9aXNGbGF0fHxpc0Z1bmM/e306aW5pdENsb25lT2JqZWN0KHZhbHVlKTtpZighaXNEZWVwKXJldHVybiBpc0ZsYXQ/Y29weVN5bWJvbHNJbih2YWx1ZSxiYXNlQXNzaWduSW4ocmVzdWx0LAp2YWx1ZSkpOmNvcHlTeW1ib2xzKHZhbHVlLGJhc2VBc3NpZ24ocmVzdWx0LHZhbHVlKSl9ZWxzZXtpZighY2xvbmVhYmxlVGFnc1t0YWddKXJldHVybiBvYmplY3Q/dmFsdWU6e307cmVzdWx0PWluaXRDbG9uZUJ5VGFnKHZhbHVlLHRhZyxpc0RlZXApfX1zdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KHZhbHVlKTtpZihzdGFja2VkKXJldHVybiBzdGFja2VkO3N0YWNrLnNldCh2YWx1ZSxyZXN1bHQpO2lmKGlzU2V0KHZhbHVlKSl7dmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSl7cmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN1YlZhbHVlLHZhbHVlLHN0YWNrKSl9KTtyZXR1cm4gcmVzdWx0fWlmKGlzTWFwKHZhbHVlKSl7dmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSxrZXkpe3Jlc3VsdC5zZXQoa2V5LGJhc2VDbG9uZShzdWJWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsa2V5LHZhbHVlLApzdGFjaykpfSk7cmV0dXJuIHJlc3VsdH12YXIga2V5c0Z1bmM9aXNGdWxsP2lzRmxhdD9nZXRBbGxLZXlzSW46Z2V0QWxsS2V5czppc0ZsYXQ/a2V5c0luOmtleXM7dmFyIHByb3BzPWlzQXJyP3VuZGVmaW5lZDprZXlzRnVuYyh2YWx1ZSk7YXJyYXlFYWNoKHByb3BzfHx2YWx1ZSxmdW5jdGlvbihzdWJWYWx1ZSxrZXkpe2lmKHByb3BzKXtrZXk9c3ViVmFsdWU7c3ViVmFsdWU9dmFsdWVba2V5XX1hc3NpZ25WYWx1ZShyZXN1bHQsa2V5LGJhc2VDbG9uZShzdWJWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsa2V5LHZhbHVlLHN0YWNrKSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VDb25mb3Jtcyhzb3VyY2Upe3ZhciBwcm9wcz1rZXlzKHNvdXJjZSk7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2UscHJvcHMpfX1mdW5jdGlvbiBiYXNlQ29uZm9ybXNUbyhvYmplY3Qsc291cmNlLHByb3BzKXt2YXIgbGVuZ3RoPXByb3BzLmxlbmd0aDsKaWYob2JqZWN0PT1udWxsKXJldHVybiFsZW5ndGg7b2JqZWN0PU9iamVjdChvYmplY3QpO3doaWxlKGxlbmd0aC0tKXt2YXIga2V5PXByb3BzW2xlbmd0aF0scHJlZGljYXRlPXNvdXJjZVtrZXldLHZhbHVlPW9iamVjdFtrZXldO2lmKHZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpfHwhcHJlZGljYXRlKHZhbHVlKSlyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9ZnVuY3Rpb24gYmFzZURlbGF5KGZ1bmMsd2FpdCxhcmdzKXtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtmdW5jLmFwcGx5KHVuZGVmaW5lZCxhcmdzKX0sd2FpdCl9ZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksdmFsdWVzLGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxpbmNsdWRlcz1hcnJheUluY2x1ZGVzLGlzQ29tbW9uPXRydWUsbGVuZ3RoPWFycmF5Lmxlbmd0aCwKcmVzdWx0PVtdLHZhbHVlc0xlbmd0aD12YWx1ZXMubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuIHJlc3VsdDtpZihpdGVyYXRlZSl2YWx1ZXM9YXJyYXlNYXAodmFsdWVzLGJhc2VVbmFyeShpdGVyYXRlZSkpO2lmKGNvbXBhcmF0b3Ipe2luY2x1ZGVzPWFycmF5SW5jbHVkZXNXaXRoO2lzQ29tbW9uPWZhbHNlfWVsc2UgaWYodmFsdWVzLmxlbmd0aD49TEFSR0VfQVJSQVlfU0laRSl7aW5jbHVkZXM9Y2FjaGVIYXM7aXNDb21tb249ZmFsc2U7dmFsdWVzPW5ldyBTZXRDYWNoZSh2YWx1ZXMpfW91dGVyOndoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlPT1udWxsP3ZhbHVlOml0ZXJhdGVlKHZhbHVlKTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZihpc0NvbW1vbiYmY29tcHV0ZWQ9PT1jb21wdXRlZCl7dmFyIHZhbHVlc0luZGV4PXZhbHVlc0xlbmd0aDt3aGlsZSh2YWx1ZXNJbmRleC0tKWlmKHZhbHVlc1t2YWx1ZXNJbmRleF09PT0KY29tcHV0ZWQpY29udGludWUgb3V0ZXI7cmVzdWx0LnB1c2godmFsdWUpfWVsc2UgaWYoIWluY2x1ZGVzKHZhbHVlcyxjb21wdXRlZCxjb21wYXJhdG9yKSlyZXN1bHQucHVzaCh2YWx1ZSl9cmV0dXJuIHJlc3VsdH12YXIgYmFzZUVhY2g9Y3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7dmFyIGJhc2VFYWNoUmlnaHQ9Y3JlYXRlQmFzZUVhY2goYmFzZUZvck93blJpZ2h0LHRydWUpO2Z1bmN0aW9uIGJhc2VFdmVyeShjb2xsZWN0aW9uLHByZWRpY2F0ZSl7dmFyIHJlc3VsdD10cnVlO2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsaW5kZXgsY29sbGVjdGlvbil7cmVzdWx0PSEhcHJlZGljYXRlKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pO3JldHVybiByZXN1bHR9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VFeHRyZW11bShhcnJheSxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPQphcnJheVtpbmRleF0sY3VycmVudD1pdGVyYXRlZSh2YWx1ZSk7aWYoY3VycmVudCE9bnVsbCYmKGNvbXB1dGVkPT09dW5kZWZpbmVkP2N1cnJlbnQ9PT1jdXJyZW50JiYhaXNTeW1ib2woY3VycmVudCk6Y29tcGFyYXRvcihjdXJyZW50LGNvbXB1dGVkKSkpdmFyIGNvbXB1dGVkPWN1cnJlbnQscmVzdWx0PXZhbHVlfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUZpbGwoYXJyYXksdmFsdWUsc3RhcnQsZW5kKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aDtzdGFydD10b0ludGVnZXIoc3RhcnQpO2lmKHN0YXJ0PDApc3RhcnQ9LXN0YXJ0Pmxlbmd0aD8wOmxlbmd0aCtzdGFydDtlbmQ9ZW5kPT09dW5kZWZpbmVkfHxlbmQ+bGVuZ3RoP2xlbmd0aDp0b0ludGVnZXIoZW5kKTtpZihlbmQ8MCllbmQrPWxlbmd0aDtlbmQ9c3RhcnQ+ZW5kPzA6dG9MZW5ndGgoZW5kKTt3aGlsZShzdGFydDxlbmQpYXJyYXlbc3RhcnQrK109dmFsdWU7cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VGaWx0ZXIoY29sbGVjdGlvbiwKcHJlZGljYXRlKXt2YXIgcmVzdWx0PVtdO2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsaW5kZXgsY29sbGVjdGlvbil7aWYocHJlZGljYXRlKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pKXJlc3VsdC5wdXNoKHZhbHVlKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksZGVwdGgscHJlZGljYXRlLGlzU3RyaWN0LHJlc3VsdCl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7cHJlZGljYXRlfHwocHJlZGljYXRlPWlzRmxhdHRlbmFibGUpO3Jlc3VsdHx8KHJlc3VsdD1bXSk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYoZGVwdGg+MCYmcHJlZGljYXRlKHZhbHVlKSlpZihkZXB0aD4xKWJhc2VGbGF0dGVuKHZhbHVlLGRlcHRoLTEscHJlZGljYXRlLGlzU3RyaWN0LHJlc3VsdCk7ZWxzZSBhcnJheVB1c2gocmVzdWx0LHZhbHVlKTtlbHNlIGlmKCFpc1N0cmljdClyZXN1bHRbcmVzdWx0Lmxlbmd0aF09CnZhbHVlfXJldHVybiByZXN1bHR9dmFyIGJhc2VGb3I9Y3JlYXRlQmFzZUZvcigpO3ZhciBiYXNlRm9yUmlnaHQ9Y3JlYXRlQmFzZUZvcih0cnVlKTtmdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdCYmYmFzZUZvcihvYmplY3QsaXRlcmF0ZWUsa2V5cyl9ZnVuY3Rpb24gYmFzZUZvck93blJpZ2h0KG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdCYmYmFzZUZvclJpZ2h0KG9iamVjdCxpdGVyYXRlZSxrZXlzKX1mdW5jdGlvbiBiYXNlRnVuY3Rpb25zKG9iamVjdCxwcm9wcyl7cmV0dXJuIGFycmF5RmlsdGVyKHByb3BzLGZ1bmN0aW9uKGtleSl7cmV0dXJuIGlzRnVuY3Rpb24ob2JqZWN0W2tleV0pfSl9ZnVuY3Rpb24gYmFzZUdldChvYmplY3QscGF0aCl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7dmFyIGluZGV4PTAsbGVuZ3RoPXBhdGgubGVuZ3RoO3doaWxlKG9iamVjdCE9bnVsbCYmaW5kZXg8bGVuZ3RoKW9iamVjdD1vYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldOwpyZXR1cm4gaW5kZXgmJmluZGV4PT1sZW5ndGg/b2JqZWN0OnVuZGVmaW5lZH1mdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3Qsa2V5c0Z1bmMsc3ltYm9sc0Z1bmMpe3ZhciByZXN1bHQ9a2V5c0Z1bmMob2JqZWN0KTtyZXR1cm4gaXNBcnJheShvYmplY3QpP3Jlc3VsdDphcnJheVB1c2gocmVzdWx0LHN5bWJvbHNGdW5jKG9iamVjdCkpfWZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpe2lmKHZhbHVlPT1udWxsKXJldHVybiB2YWx1ZT09PXVuZGVmaW5lZD91bmRlZmluZWRUYWc6bnVsbFRhZztyZXR1cm4gc3ltVG9TdHJpbmdUYWcmJnN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSk/Z2V0UmF3VGFnKHZhbHVlKTpvYmplY3RUb1N0cmluZyh2YWx1ZSl9ZnVuY3Rpb24gYmFzZUd0KHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU+b3RoZXJ9ZnVuY3Rpb24gYmFzZUhhcyhvYmplY3Qsa2V5KXtyZXR1cm4gb2JqZWN0IT1udWxsJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwKa2V5KX1mdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LGtleSl7cmV0dXJuIG9iamVjdCE9bnVsbCYma2V5IGluIE9iamVjdChvYmplY3QpfWZ1bmN0aW9uIGJhc2VJblJhbmdlKG51bWJlcixzdGFydCxlbmQpe3JldHVybiBudW1iZXI+PW5hdGl2ZU1pbihzdGFydCxlbmQpJiZudW1iZXI8bmF0aXZlTWF4KHN0YXJ0LGVuZCl9ZnVuY3Rpb24gYmFzZUludGVyc2VjdGlvbihhcnJheXMsaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluY2x1ZGVzPWNvbXBhcmF0b3I/YXJyYXlJbmNsdWRlc1dpdGg6YXJyYXlJbmNsdWRlcyxsZW5ndGg9YXJyYXlzWzBdLmxlbmd0aCxvdGhMZW5ndGg9YXJyYXlzLmxlbmd0aCxvdGhJbmRleD1vdGhMZW5ndGgsY2FjaGVzPUFycmF5KG90aExlbmd0aCksbWF4TGVuZ3RoPUluZmluaXR5LHJlc3VsdD1bXTt3aGlsZShvdGhJbmRleC0tKXt2YXIgYXJyYXk9YXJyYXlzW290aEluZGV4XTtpZihvdGhJbmRleCYmaXRlcmF0ZWUpYXJyYXk9YXJyYXlNYXAoYXJyYXksCmJhc2VVbmFyeShpdGVyYXRlZSkpO21heExlbmd0aD1uYXRpdmVNaW4oYXJyYXkubGVuZ3RoLG1heExlbmd0aCk7Y2FjaGVzW290aEluZGV4XT0hY29tcGFyYXRvciYmKGl0ZXJhdGVlfHxsZW5ndGg+PTEyMCYmYXJyYXkubGVuZ3RoPj0xMjApP25ldyBTZXRDYWNoZShvdGhJbmRleCYmYXJyYXkpOnVuZGVmaW5lZH1hcnJheT1hcnJheXNbMF07dmFyIGluZGV4PS0xLHNlZW49Y2FjaGVzWzBdO291dGVyOndoaWxlKCsraW5kZXg8bGVuZ3RoJiZyZXN1bHQubGVuZ3RoPG1heExlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7dmFsdWU9Y29tcGFyYXRvcnx8dmFsdWUhPT0wP3ZhbHVlOjA7aWYoIShzZWVuP2NhY2hlSGFzKHNlZW4sY29tcHV0ZWQpOmluY2x1ZGVzKHJlc3VsdCxjb21wdXRlZCxjb21wYXJhdG9yKSkpe290aEluZGV4PW90aExlbmd0aDt3aGlsZSgtLW90aEluZGV4KXt2YXIgY2FjaGU9Y2FjaGVzW290aEluZGV4XTsKaWYoIShjYWNoZT9jYWNoZUhhcyhjYWNoZSxjb21wdXRlZCk6aW5jbHVkZXMoYXJyYXlzW290aEluZGV4XSxjb21wdXRlZCxjb21wYXJhdG9yKSkpY29udGludWUgb3V0ZXJ9aWYoc2VlbilzZWVuLnB1c2goY29tcHV0ZWQpO3Jlc3VsdC5wdXNoKHZhbHVlKX19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlSW52ZXJ0ZXIob2JqZWN0LHNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7YmFzZUZvck93bihvYmplY3QsZnVuY3Rpb24odmFsdWUsa2V5LG9iamVjdCl7c2V0dGVyKGFjY3VtdWxhdG9yLGl0ZXJhdGVlKHZhbHVlKSxrZXksb2JqZWN0KX0pO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3Mpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO29iamVjdD1wYXJlbnQob2JqZWN0LHBhdGgpO3ZhciBmdW5jPW9iamVjdD09bnVsbD9vYmplY3Q6b2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtyZXR1cm4gZnVuYz09bnVsbD91bmRlZmluZWQ6CmFwcGx5KGZ1bmMsb2JqZWN0LGFyZ3MpfWZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1hcmdzVGFnfWZ1bmN0aW9uIGJhc2VJc0FycmF5QnVmZmVyKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWFycmF5QnVmZmVyVGFnfWZ1bmN0aW9uIGJhc2VJc0RhdGUodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09ZGF0ZVRhZ31mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spe2lmKHZhbHVlPT09b3RoZXIpcmV0dXJuIHRydWU7aWYodmFsdWU9PW51bGx8fG90aGVyPT1udWxsfHwhaXNPYmplY3RMaWtlKHZhbHVlKSYmIWlzT2JqZWN0TGlrZShvdGhlcikpcmV0dXJuIHZhbHVlIT09dmFsdWUmJm90aGVyIT09b3RoZXI7cmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwKb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGJhc2VJc0VxdWFsLHN0YWNrKX1mdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3ZhciBvYmpJc0Fycj1pc0FycmF5KG9iamVjdCksb3RoSXNBcnI9aXNBcnJheShvdGhlciksb2JqVGFnPW9iaklzQXJyP2FycmF5VGFnOmdldFRhZyhvYmplY3QpLG90aFRhZz1vdGhJc0Fycj9hcnJheVRhZzpnZXRUYWcob3RoZXIpO29ialRhZz1vYmpUYWc9PWFyZ3NUYWc/b2JqZWN0VGFnOm9ialRhZztvdGhUYWc9b3RoVGFnPT1hcmdzVGFnP29iamVjdFRhZzpvdGhUYWc7dmFyIG9iaklzT2JqPW9ialRhZz09b2JqZWN0VGFnLG90aElzT2JqPW90aFRhZz09b2JqZWN0VGFnLGlzU2FtZVRhZz1vYmpUYWc9PW90aFRhZztpZihpc1NhbWVUYWcmJmlzQnVmZmVyKG9iamVjdCkpe2lmKCFpc0J1ZmZlcihvdGhlcikpcmV0dXJuIGZhbHNlO29iaklzQXJyPXRydWU7b2JqSXNPYmo9CmZhbHNlfWlmKGlzU2FtZVRhZyYmIW9iaklzT2JqKXtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7cmV0dXJuIG9iaklzQXJyfHxpc1R5cGVkQXJyYXkob2JqZWN0KT9lcXVhbEFycmF5cyhvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayk6ZXF1YWxCeVRhZyhvYmplY3Qsb3RoZXIsb2JqVGFnLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spfWlmKCEoYml0bWFzayZDT01QQVJFX1BBUlRJQUxfRkxBRykpe3ZhciBvYmpJc1dyYXBwZWQ9b2JqSXNPYmomJmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCJfX3dyYXBwZWRfXyIpLG90aElzV3JhcHBlZD1vdGhJc09iaiYmaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwiX193cmFwcGVkX18iKTtpZihvYmpJc1dyYXBwZWR8fG90aElzV3JhcHBlZCl7dmFyIG9ialVud3JhcHBlZD1vYmpJc1dyYXBwZWQ/b2JqZWN0LnZhbHVlKCk6b2JqZWN0LG90aFVud3JhcHBlZD1vdGhJc1dyYXBwZWQ/b3RoZXIudmFsdWUoKToKb3RoZXI7c3RhY2t8fChzdGFjaz1uZXcgU3RhY2spO3JldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLG90aFVud3JhcHBlZCxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spfX1pZighaXNTYW1lVGFnKXJldHVybiBmYWxzZTtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7cmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl9ZnVuY3Rpb24gYmFzZUlzTWFwKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmZ2V0VGFnKHZhbHVlKT09bWFwVGFnfWZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsbWF0Y2hEYXRhLGN1c3RvbWl6ZXIpe3ZhciBpbmRleD1tYXRjaERhdGEubGVuZ3RoLGxlbmd0aD1pbmRleCxub0N1c3RvbWl6ZXI9IWN1c3RvbWl6ZXI7aWYob2JqZWN0PT1udWxsKXJldHVybiFsZW5ndGg7b2JqZWN0PU9iamVjdChvYmplY3QpO3doaWxlKGluZGV4LS0pe3ZhciBkYXRhPW1hdGNoRGF0YVtpbmRleF07CmlmKG5vQ3VzdG9taXplciYmZGF0YVsyXT9kYXRhWzFdIT09b2JqZWN0W2RhdGFbMF1dOiEoZGF0YVswXWluIG9iamVjdCkpcmV0dXJuIGZhbHNlfXdoaWxlKCsraW5kZXg8bGVuZ3RoKXtkYXRhPW1hdGNoRGF0YVtpbmRleF07dmFyIGtleT1kYXRhWzBdLG9ialZhbHVlPW9iamVjdFtrZXldLHNyY1ZhbHVlPWRhdGFbMV07aWYobm9DdXN0b21pemVyJiZkYXRhWzJdKXtpZihvYmpWYWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KSlyZXR1cm4gZmFsc2V9ZWxzZXt2YXIgc3RhY2s9bmV3IFN0YWNrO2lmKGN1c3RvbWl6ZXIpdmFyIHJlc3VsdD1jdXN0b21pemVyKG9ialZhbHVlLHNyY1ZhbHVlLGtleSxvYmplY3Qsc291cmNlLHN0YWNrKTtpZighKHJlc3VsdD09PXVuZGVmaW5lZD9iYXNlSXNFcXVhbChzcmNWYWx1ZSxvYmpWYWx1ZSxDT01QQVJFX1BBUlRJQUxfRkxBR3xDT01QQVJFX1VOT1JERVJFRF9GTEFHLGN1c3RvbWl6ZXIsc3RhY2spOnJlc3VsdCkpcmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX0KZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKXtpZighaXNPYmplY3QodmFsdWUpfHxpc01hc2tlZCh2YWx1ZSkpcmV0dXJuIGZhbHNlO3ZhciBwYXR0ZXJuPWlzRnVuY3Rpb24odmFsdWUpP3JlSXNOYXRpdmU6cmVJc0hvc3RDdG9yO3JldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKX1mdW5jdGlvbiBiYXNlSXNSZWdFeHAodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09cmVnZXhwVGFnfWZ1bmN0aW9uIGJhc2VJc1NldCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmdldFRhZyh2YWx1ZSk9PXNldFRhZ31mdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmaXNMZW5ndGgodmFsdWUubGVuZ3RoKSYmISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV19ZnVuY3Rpb24gYmFzZUl0ZXJhdGVlKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJmdW5jdGlvbiIpcmV0dXJuIHZhbHVlOwppZih2YWx1ZT09bnVsbClyZXR1cm4gaWRlbnRpdHk7aWYodHlwZW9mIHZhbHVlPT0ib2JqZWN0IilyZXR1cm4gaXNBcnJheSh2YWx1ZSk/YmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSx2YWx1ZVsxXSk6YmFzZU1hdGNoZXModmFsdWUpO3JldHVybiBwcm9wZXJ0eSh2YWx1ZSl9ZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KXtpZighaXNQcm90b3R5cGUob2JqZWN0KSlyZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO3ZhciByZXN1bHQ9W107Zm9yKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpaWYoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSYma2V5IT0iY29uc3RydWN0b3IiKXJlc3VsdC5wdXNoKGtleSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCl7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO3ZhciBpc1Byb3RvPWlzUHJvdG90eXBlKG9iamVjdCkscmVzdWx0PVtdO2Zvcih2YXIga2V5IGluIG9iamVjdClpZighKGtleT09CiJjb25zdHJ1Y3RvciImJihpc1Byb3RvfHwhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSkpKXJlc3VsdC5wdXNoKGtleSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlTHQodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZTxvdGhlcn1mdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxyZXN1bHQ9aXNBcnJheUxpa2UoY29sbGVjdGlvbik/QXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpOltdO2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe3Jlc3VsdFsrK2luZGV4XT1pdGVyYXRlZSh2YWx1ZSxrZXksY29sbGVjdGlvbil9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSl7dmFyIG1hdGNoRGF0YT1nZXRNYXRjaERhdGEoc291cmNlKTtpZihtYXRjaERhdGEubGVuZ3RoPT0xJiZtYXRjaERhdGFbMF1bMl0pcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwKbWF0Y2hEYXRhWzBdWzFdKTtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT09c291cmNlfHxiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLG1hdGNoRGF0YSl9fWZ1bmN0aW9uIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCxzcmNWYWx1ZSl7aWYoaXNLZXkocGF0aCkmJmlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLHNyY1ZhbHVlKTtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXt2YXIgb2JqVmFsdWU9Z2V0KG9iamVjdCxwYXRoKTtyZXR1cm4gb2JqVmFsdWU9PT11bmRlZmluZWQmJm9ialZhbHVlPT09c3JjVmFsdWU/aGFzSW4ob2JqZWN0LHBhdGgpOmJhc2VJc0VxdWFsKHNyY1ZhbHVlLG9ialZhbHVlLENPTVBBUkVfUEFSVElBTF9GTEFHfENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpfX1mdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyLHN0YWNrKXtpZihvYmplY3Q9PT0Kc291cmNlKXJldHVybjtiYXNlRm9yKHNvdXJjZSxmdW5jdGlvbihzcmNWYWx1ZSxrZXkpe2lmKGlzT2JqZWN0KHNyY1ZhbHVlKSl7c3RhY2t8fChzdGFjaz1uZXcgU3RhY2spO2Jhc2VNZXJnZURlZXAob2JqZWN0LHNvdXJjZSxrZXksc3JjSW5kZXgsYmFzZU1lcmdlLGN1c3RvbWl6ZXIsc3RhY2spfWVsc2V7dmFyIG5ld1ZhbHVlPWN1c3RvbWl6ZXI/Y3VzdG9taXplcihzYWZlR2V0KG9iamVjdCxrZXkpLHNyY1ZhbHVlLGtleSsiIixvYmplY3Qsc291cmNlLHN0YWNrKTp1bmRlZmluZWQ7aWYobmV3VmFsdWU9PT11bmRlZmluZWQpbmV3VmFsdWU9c3JjVmFsdWU7YXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LG5ld1ZhbHVlKX19LGtleXNJbil9ZnVuY3Rpb24gYmFzZU1lcmdlRGVlcChvYmplY3Qsc291cmNlLGtleSxzcmNJbmRleCxtZXJnZUZ1bmMsY3VzdG9taXplcixzdGFjayl7dmFyIG9ialZhbHVlPXNhZmVHZXQob2JqZWN0LGtleSksc3JjVmFsdWU9c2FmZUdldChzb3VyY2UsCmtleSksc3RhY2tlZD1zdGFjay5nZXQoc3JjVmFsdWUpO2lmKHN0YWNrZWQpe2Fzc2lnbk1lcmdlVmFsdWUob2JqZWN0LGtleSxzdGFja2VkKTtyZXR1cm59dmFyIG5ld1ZhbHVlPWN1c3RvbWl6ZXI/Y3VzdG9taXplcihvYmpWYWx1ZSxzcmNWYWx1ZSxrZXkrIiIsb2JqZWN0LHNvdXJjZSxzdGFjayk6dW5kZWZpbmVkO3ZhciBpc0NvbW1vbj1uZXdWYWx1ZT09PXVuZGVmaW5lZDtpZihpc0NvbW1vbil7dmFyIGlzQXJyPWlzQXJyYXkoc3JjVmFsdWUpLGlzQnVmZj0haXNBcnImJmlzQnVmZmVyKHNyY1ZhbHVlKSxpc1R5cGVkPSFpc0FyciYmIWlzQnVmZiYmaXNUeXBlZEFycmF5KHNyY1ZhbHVlKTtuZXdWYWx1ZT1zcmNWYWx1ZTtpZihpc0Fycnx8aXNCdWZmfHxpc1R5cGVkKWlmKGlzQXJyYXkob2JqVmFsdWUpKW5ld1ZhbHVlPW9ialZhbHVlO2Vsc2UgaWYoaXNBcnJheUxpa2VPYmplY3Qob2JqVmFsdWUpKW5ld1ZhbHVlPWNvcHlBcnJheShvYmpWYWx1ZSk7ZWxzZSBpZihpc0J1ZmYpe2lzQ29tbW9uPQpmYWxzZTtuZXdWYWx1ZT1jbG9uZUJ1ZmZlcihzcmNWYWx1ZSx0cnVlKX1lbHNlIGlmKGlzVHlwZWQpe2lzQ29tbW9uPWZhbHNlO25ld1ZhbHVlPWNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSx0cnVlKX1lbHNlIG5ld1ZhbHVlPVtdO2Vsc2UgaWYoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSl8fGlzQXJndW1lbnRzKHNyY1ZhbHVlKSl7bmV3VmFsdWU9b2JqVmFsdWU7aWYoaXNBcmd1bWVudHMob2JqVmFsdWUpKW5ld1ZhbHVlPXRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO2Vsc2UgaWYoIWlzT2JqZWN0KG9ialZhbHVlKXx8c3JjSW5kZXgmJmlzRnVuY3Rpb24ob2JqVmFsdWUpKW5ld1ZhbHVlPWluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSl9ZWxzZSBpc0NvbW1vbj1mYWxzZX1pZihpc0NvbW1vbil7c3RhY2suc2V0KHNyY1ZhbHVlLG5ld1ZhbHVlKTttZXJnZUZ1bmMobmV3VmFsdWUsc3JjVmFsdWUsc3JjSW5kZXgsY3VzdG9taXplcixzdGFjayk7c3RhY2tbImRlbGV0ZSJdKHNyY1ZhbHVlKX1hc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwKa2V5LG5ld1ZhbHVlKX1mdW5jdGlvbiBiYXNlTnRoKGFycmF5LG4pe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuO24rPW48MD9sZW5ndGg6MDtyZXR1cm4gaXNJbmRleChuLGxlbmd0aCk/YXJyYXlbbl06dW5kZWZpbmVkfWZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24saXRlcmF0ZWVzLG9yZGVycyl7dmFyIGluZGV4PS0xO2l0ZXJhdGVlcz1hcnJheU1hcChpdGVyYXRlZXMubGVuZ3RoP2l0ZXJhdGVlczpbaWRlbnRpdHldLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7dmFyIHJlc3VsdD1iYXNlTWFwKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe3ZhciBjcml0ZXJpYT1hcnJheU1hcChpdGVyYXRlZXMsZnVuY3Rpb24oaXRlcmF0ZWUpe3JldHVybiBpdGVyYXRlZSh2YWx1ZSl9KTtyZXR1cm57ImNyaXRlcmlhIjpjcml0ZXJpYSwiaW5kZXgiOisraW5kZXgsInZhbHVlIjp2YWx1ZX19KTtyZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsCmZ1bmN0aW9uKG9iamVjdCxvdGhlcil7cmV0dXJuIGNvbXBhcmVNdWx0aXBsZShvYmplY3Qsb3RoZXIsb3JkZXJzKX0pfWZ1bmN0aW9uIGJhc2VQaWNrKG9iamVjdCxwYXRocyl7cmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LHBhdGhzLGZ1bmN0aW9uKHZhbHVlLHBhdGgpe3JldHVybiBoYXNJbihvYmplY3QscGF0aCl9KX1mdW5jdGlvbiBiYXNlUGlja0J5KG9iamVjdCxwYXRocyxwcmVkaWNhdGUpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aHMubGVuZ3RoLHJlc3VsdD17fTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHBhdGg9cGF0aHNbaW5kZXhdLHZhbHVlPWJhc2VHZXQob2JqZWN0LHBhdGgpO2lmKHByZWRpY2F0ZSh2YWx1ZSxwYXRoKSliYXNlU2V0KHJlc3VsdCxjYXN0UGF0aChwYXRoLG9iamVjdCksdmFsdWUpfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gYmFzZUdldChvYmplY3QscGF0aCl9fQpmdW5jdGlvbiBiYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMsaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluZGV4T2Y9Y29tcGFyYXRvcj9iYXNlSW5kZXhPZldpdGg6YmFzZUluZGV4T2YsaW5kZXg9LTEsbGVuZ3RoPXZhbHVlcy5sZW5ndGgsc2Vlbj1hcnJheTtpZihhcnJheT09PXZhbHVlcyl2YWx1ZXM9Y29weUFycmF5KHZhbHVlcyk7aWYoaXRlcmF0ZWUpc2Vlbj1hcnJheU1hcChhcnJheSxiYXNlVW5hcnkoaXRlcmF0ZWUpKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGZyb21JbmRleD0wLHZhbHVlPXZhbHVlc1tpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU/aXRlcmF0ZWUodmFsdWUpOnZhbHVlO3doaWxlKChmcm9tSW5kZXg9aW5kZXhPZihzZWVuLGNvbXB1dGVkLGZyb21JbmRleCxjb21wYXJhdG9yKSk+LTEpe2lmKHNlZW4hPT1hcnJheSlzcGxpY2UuY2FsbChzZWVuLGZyb21JbmRleCwxKTtzcGxpY2UuY2FsbChhcnJheSxmcm9tSW5kZXgsMSl9fXJldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlUHVsbEF0KGFycmF5LAppbmRleGVzKXt2YXIgbGVuZ3RoPWFycmF5P2luZGV4ZXMubGVuZ3RoOjAsbGFzdEluZGV4PWxlbmd0aC0xO3doaWxlKGxlbmd0aC0tKXt2YXIgaW5kZXg9aW5kZXhlc1tsZW5ndGhdO2lmKGxlbmd0aD09bGFzdEluZGV4fHxpbmRleCE9PXByZXZpb3VzKXt2YXIgcHJldmlvdXM9aW5kZXg7aWYoaXNJbmRleChpbmRleCkpc3BsaWNlLmNhbGwoYXJyYXksaW5kZXgsMSk7ZWxzZSBiYXNlVW5zZXQoYXJyYXksaW5kZXgpfX1yZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYmFzZVJhbmRvbShsb3dlcix1cHBlcil7cmV0dXJuIGxvd2VyK25hdGl2ZUZsb29yKG5hdGl2ZVJhbmRvbSgpKih1cHBlci1sb3dlcisxKSl9ZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LGVuZCxzdGVwLGZyb21SaWdodCl7dmFyIGluZGV4PS0xLGxlbmd0aD1uYXRpdmVNYXgobmF0aXZlQ2VpbCgoZW5kLXN0YXJ0KS8oc3RlcHx8MSkpLDApLHJlc3VsdD1BcnJheShsZW5ndGgpO3doaWxlKGxlbmd0aC0tKXtyZXN1bHRbZnJvbVJpZ2h0PwpsZW5ndGg6KytpbmRleF09c3RhcnQ7c3RhcnQrPXN0ZXB9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUmVwZWF0KHN0cmluZyxuKXt2YXIgcmVzdWx0PSIiO2lmKCFzdHJpbmd8fG48MXx8bj5NQVhfU0FGRV9JTlRFR0VSKXJldHVybiByZXN1bHQ7ZG97aWYobiUyKXJlc3VsdCs9c3RyaW5nO249bmF0aXZlRmxvb3Iobi8yKTtpZihuKXN0cmluZys9c3RyaW5nfXdoaWxlKG4pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVJlc3QoZnVuYyxzdGFydCl7cmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsc3RhcnQsaWRlbnRpdHkpLGZ1bmMrIiIpfWZ1bmN0aW9uIGJhc2VTYW1wbGUoY29sbGVjdGlvbil7cmV0dXJuIGFycmF5U2FtcGxlKHZhbHVlcyhjb2xsZWN0aW9uKSl9ZnVuY3Rpb24gYmFzZVNhbXBsZVNpemUoY29sbGVjdGlvbixuKXt2YXIgYXJyYXk9dmFsdWVzKGNvbGxlY3Rpb24pO3JldHVybiBzaHVmZmxlU2VsZihhcnJheSxiYXNlQ2xhbXAobiwwLGFycmF5Lmxlbmd0aCkpfQpmdW5jdGlvbiBiYXNlU2V0KG9iamVjdCxwYXRoLHZhbHVlLGN1c3RvbWl6ZXIpe2lmKCFpc09iamVjdChvYmplY3QpKXJldHVybiBvYmplY3Q7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRoLmxlbmd0aCxsYXN0SW5kZXg9bGVuZ3RoLTEsbmVzdGVkPW9iamVjdDt3aGlsZShuZXN0ZWQhPW51bGwmJisraW5kZXg8bGVuZ3RoKXt2YXIga2V5PXRvS2V5KHBhdGhbaW5kZXhdKSxuZXdWYWx1ZT12YWx1ZTtpZihpbmRleCE9bGFzdEluZGV4KXt2YXIgb2JqVmFsdWU9bmVzdGVkW2tleV07bmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKG9ialZhbHVlLGtleSxuZXN0ZWQpOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCluZXdWYWx1ZT1pc09iamVjdChvYmpWYWx1ZSk/b2JqVmFsdWU6aXNJbmRleChwYXRoW2luZGV4KzFdKT9bXTp7fX1hc3NpZ25WYWx1ZShuZXN0ZWQsa2V5LG5ld1ZhbHVlKTtuZXN0ZWQ9bmVzdGVkW2tleV19cmV0dXJuIG9iamVjdH0KdmFyIGJhc2VTZXREYXRhPSFtZXRhTWFwP2lkZW50aXR5OmZ1bmN0aW9uKGZ1bmMsZGF0YSl7bWV0YU1hcC5zZXQoZnVuYyxkYXRhKTtyZXR1cm4gZnVuY307dmFyIGJhc2VTZXRUb1N0cmluZz0hZGVmaW5lUHJvcGVydHk/aWRlbnRpdHk6ZnVuY3Rpb24oZnVuYyxzdHJpbmcpe3JldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCJ0b1N0cmluZyIseyJjb25maWd1cmFibGUiOnRydWUsImVudW1lcmFibGUiOmZhbHNlLCJ2YWx1ZSI6Y29uc3RhbnQoc3RyaW5nKSwid3JpdGFibGUiOnRydWV9KX07ZnVuY3Rpb24gYmFzZVNodWZmbGUoY29sbGVjdGlvbil7cmV0dXJuIHNodWZmbGVTZWxmKHZhbHVlcyhjb2xsZWN0aW9uKSl9ZnVuY3Rpb24gYmFzZVNsaWNlKGFycmF5LHN0YXJ0LGVuZCl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7aWYoc3RhcnQ8MClzdGFydD0tc3RhcnQ+bGVuZ3RoPzA6bGVuZ3RoK3N0YXJ0O2VuZD1lbmQ+bGVuZ3RoP2xlbmd0aDplbmQ7aWYoZW5kPDApZW5kKz0KbGVuZ3RoO2xlbmd0aD1zdGFydD5lbmQ/MDplbmQtc3RhcnQ+Pj4wO3N0YXJ0Pj4+PTA7dmFyIHJlc3VsdD1BcnJheShsZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXJlc3VsdFtpbmRleF09YXJyYXlbaW5kZXgrc3RhcnRdO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVNvbWUoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciByZXN1bHQ7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtyZXN1bHQ9cHJlZGljYXRlKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pO3JldHVybiFyZXN1bHR9KTtyZXR1cm4hIXJlc3VsdH1mdW5jdGlvbiBiYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUscmV0SGlnaGVzdCl7dmFyIGxvdz0wLGhpZ2g9YXJyYXk9PW51bGw/bG93OmFycmF5Lmxlbmd0aDtpZih0eXBlb2YgdmFsdWU9PSJudW1iZXIiJiZ2YWx1ZT09PXZhbHVlJiZoaWdoPD1IQUxGX01BWF9BUlJBWV9MRU5HVEgpe3doaWxlKGxvdzxoaWdoKXt2YXIgbWlkPQpsb3craGlnaD4+PjEsY29tcHV0ZWQ9YXJyYXlbbWlkXTtpZihjb21wdXRlZCE9PW51bGwmJiFpc1N5bWJvbChjb21wdXRlZCkmJihyZXRIaWdoZXN0P2NvbXB1dGVkPD12YWx1ZTpjb21wdXRlZDx2YWx1ZSkpbG93PW1pZCsxO2Vsc2UgaGlnaD1taWR9cmV0dXJuIGhpZ2h9cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGlkZW50aXR5LHJldEhpZ2hlc3QpfWZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGl0ZXJhdGVlLHJldEhpZ2hlc3Qpe3ZhbHVlPWl0ZXJhdGVlKHZhbHVlKTt2YXIgbG93PTAsaGlnaD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCx2YWxJc05hTj12YWx1ZSE9PXZhbHVlLHZhbElzTnVsbD12YWx1ZT09PW51bGwsdmFsSXNTeW1ib2w9aXNTeW1ib2wodmFsdWUpLHZhbElzVW5kZWZpbmVkPXZhbHVlPT09dW5kZWZpbmVkO3doaWxlKGxvdzxoaWdoKXt2YXIgbWlkPW5hdGl2ZUZsb29yKChsb3craGlnaCkvMiksY29tcHV0ZWQ9Cml0ZXJhdGVlKGFycmF5W21pZF0pLG90aElzRGVmaW5lZD1jb21wdXRlZCE9PXVuZGVmaW5lZCxvdGhJc051bGw9Y29tcHV0ZWQ9PT1udWxsLG90aElzUmVmbGV4aXZlPWNvbXB1dGVkPT09Y29tcHV0ZWQsb3RoSXNTeW1ib2w9aXNTeW1ib2woY29tcHV0ZWQpO2lmKHZhbElzTmFOKXZhciBzZXRMb3c9cmV0SGlnaGVzdHx8b3RoSXNSZWZsZXhpdmU7ZWxzZSBpZih2YWxJc1VuZGVmaW5lZClzZXRMb3c9b3RoSXNSZWZsZXhpdmUmJihyZXRIaWdoZXN0fHxvdGhJc0RlZmluZWQpO2Vsc2UgaWYodmFsSXNOdWxsKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmb3RoSXNEZWZpbmVkJiYocmV0SGlnaGVzdHx8IW90aElzTnVsbCk7ZWxzZSBpZih2YWxJc1N5bWJvbClzZXRMb3c9b3RoSXNSZWZsZXhpdmUmJm90aElzRGVmaW5lZCYmIW90aElzTnVsbCYmKHJldEhpZ2hlc3R8fCFvdGhJc1N5bWJvbCk7ZWxzZSBpZihvdGhJc051bGx8fG90aElzU3ltYm9sKXNldExvdz1mYWxzZTtlbHNlIHNldExvdz0KcmV0SGlnaGVzdD9jb21wdXRlZDw9dmFsdWU6Y29tcHV0ZWQ8dmFsdWU7aWYoc2V0TG93KWxvdz1taWQrMTtlbHNlIGhpZ2g9bWlkfXJldHVybiBuYXRpdmVNaW4oaGlnaCxNQVhfQVJSQVlfSU5ERVgpfWZ1bmN0aW9uIGJhc2VTb3J0ZWRVbmlxKGFycmF5LGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7aWYoIWluZGV4fHwhZXEoY29tcHV0ZWQsc2Vlbikpe3ZhciBzZWVuPWNvbXB1dGVkO3Jlc3VsdFtyZXNJbmRleCsrXT12YWx1ZT09PTA/MDp2YWx1ZX19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlVG9OdW1iZXIodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09Im51bWJlciIpcmV0dXJuIHZhbHVlO2lmKGlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gTkFOO3JldHVybit2YWx1ZX0KZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJzdHJpbmciKXJldHVybiB2YWx1ZTtpZihpc0FycmF5KHZhbHVlKSlyZXR1cm4gYXJyYXlNYXAodmFsdWUsYmFzZVRvU3RyaW5nKSsiIjtpZihpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIHN5bWJvbFRvU3RyaW5nP3N5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpOiIiO3ZhciByZXN1bHQ9dmFsdWUrIiI7cmV0dXJuIHJlc3VsdD09IjAiJiYxL3ZhbHVlPT0tSU5GSU5JVFk/Ii0wIjpyZXN1bHR9ZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGluY2x1ZGVzPWFycmF5SW5jbHVkZXMsbGVuZ3RoPWFycmF5Lmxlbmd0aCxpc0NvbW1vbj10cnVlLHJlc3VsdD1bXSxzZWVuPXJlc3VsdDtpZihjb21wYXJhdG9yKXtpc0NvbW1vbj1mYWxzZTtpbmNsdWRlcz1hcnJheUluY2x1ZGVzV2l0aH1lbHNlIGlmKGxlbmd0aD49TEFSR0VfQVJSQVlfU0laRSl7dmFyIHNldD0KaXRlcmF0ZWU/bnVsbDpjcmVhdGVTZXQoYXJyYXkpO2lmKHNldClyZXR1cm4gc2V0VG9BcnJheShzZXQpO2lzQ29tbW9uPWZhbHNlO2luY2x1ZGVzPWNhY2hlSGFzO3NlZW49bmV3IFNldENhY2hlfWVsc2Ugc2Vlbj1pdGVyYXRlZT9bXTpyZXN1bHQ7b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU/aXRlcmF0ZWUodmFsdWUpOnZhbHVlO3ZhbHVlPWNvbXBhcmF0b3J8fHZhbHVlIT09MD92YWx1ZTowO2lmKGlzQ29tbW9uJiZjb21wdXRlZD09PWNvbXB1dGVkKXt2YXIgc2VlbkluZGV4PXNlZW4ubGVuZ3RoO3doaWxlKHNlZW5JbmRleC0tKWlmKHNlZW5bc2VlbkluZGV4XT09PWNvbXB1dGVkKWNvbnRpbnVlIG91dGVyO2lmKGl0ZXJhdGVlKXNlZW4ucHVzaChjb21wdXRlZCk7cmVzdWx0LnB1c2godmFsdWUpfWVsc2UgaWYoIWluY2x1ZGVzKHNlZW4sY29tcHV0ZWQsY29tcGFyYXRvcikpe2lmKHNlZW4hPT1yZXN1bHQpc2Vlbi5wdXNoKGNvbXB1dGVkKTsKcmVzdWx0LnB1c2godmFsdWUpfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VVbnNldChvYmplY3QscGF0aCl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7b2JqZWN0PXBhcmVudChvYmplY3QscGF0aCk7cmV0dXJuIG9iamVjdD09bnVsbHx8ZGVsZXRlIG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV19ZnVuY3Rpb24gYmFzZVVwZGF0ZShvYmplY3QscGF0aCx1cGRhdGVyLGN1c3RvbWl6ZXIpe3JldHVybiBiYXNlU2V0KG9iamVjdCxwYXRoLHVwZGF0ZXIoYmFzZUdldChvYmplY3QscGF0aCkpLGN1c3RvbWl6ZXIpfWZ1bmN0aW9uIGJhc2VXaGlsZShhcnJheSxwcmVkaWNhdGUsaXNEcm9wLGZyb21SaWdodCl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGgsaW5kZXg9ZnJvbVJpZ2h0P2xlbmd0aDotMTt3aGlsZSgoZnJvbVJpZ2h0P2luZGV4LS06KytpbmRleDxsZW5ndGgpJiZwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSk7cmV0dXJuIGlzRHJvcD9iYXNlU2xpY2UoYXJyYXksCmZyb21SaWdodD8wOmluZGV4LGZyb21SaWdodD9pbmRleCsxOmxlbmd0aCk6YmFzZVNsaWNlKGFycmF5LGZyb21SaWdodD9pbmRleCsxOjAsZnJvbVJpZ2h0P2xlbmd0aDppbmRleCl9ZnVuY3Rpb24gYmFzZVdyYXBwZXJWYWx1ZSh2YWx1ZSxhY3Rpb25zKXt2YXIgcmVzdWx0PXZhbHVlO2lmKHJlc3VsdCBpbnN0YW5jZW9mIExhenlXcmFwcGVyKXJlc3VsdD1yZXN1bHQudmFsdWUoKTtyZXR1cm4gYXJyYXlSZWR1Y2UoYWN0aW9ucyxmdW5jdGlvbihyZXN1bHQsYWN0aW9uKXtyZXR1cm4gYWN0aW9uLmZ1bmMuYXBwbHkoYWN0aW9uLnRoaXNBcmcsYXJyYXlQdXNoKFtyZXN1bHRdLGFjdGlvbi5hcmdzKSl9LHJlc3VsdCl9ZnVuY3Rpb24gYmFzZVhvcihhcnJheXMsaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGxlbmd0aD1hcnJheXMubGVuZ3RoO2lmKGxlbmd0aDwyKXJldHVybiBsZW5ndGg/YmFzZVVuaXEoYXJyYXlzWzBdKTpbXTt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KGxlbmd0aCk7CndoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgYXJyYXk9YXJyYXlzW2luZGV4XSxvdGhJbmRleD0tMTt3aGlsZSgrK290aEluZGV4PGxlbmd0aClpZihvdGhJbmRleCE9aW5kZXgpcmVzdWx0W2luZGV4XT1iYXNlRGlmZmVyZW5jZShyZXN1bHRbaW5kZXhdfHxhcnJheSxhcnJheXNbb3RoSW5kZXhdLGl0ZXJhdGVlLGNvbXBhcmF0b3IpfXJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihyZXN1bHQsMSksaXRlcmF0ZWUsY29tcGFyYXRvcil9ZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcyx2YWx1ZXMsYXNzaWduRnVuYyl7dmFyIGluZGV4PS0xLGxlbmd0aD1wcm9wcy5sZW5ndGgsdmFsc0xlbmd0aD12YWx1ZXMubGVuZ3RoLHJlc3VsdD17fTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWluZGV4PHZhbHNMZW5ndGg/dmFsdWVzW2luZGV4XTp1bmRlZmluZWQ7YXNzaWduRnVuYyhyZXN1bHQscHJvcHNbaW5kZXhdLHZhbHVlKX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNhc3RBcnJheUxpa2VPYmplY3QodmFsdWUpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSk/CnZhbHVlOltdfWZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09ImZ1bmN0aW9uIj92YWx1ZTppZGVudGl0eX1mdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSxvYmplY3Qpe2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiB2YWx1ZTtyZXR1cm4gaXNLZXkodmFsdWUsb2JqZWN0KT9bdmFsdWVdOnN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpfXZhciBjYXN0UmVzdD1iYXNlUmVzdDtmdW5jdGlvbiBjYXN0U2xpY2UoYXJyYXksc3RhcnQsZW5kKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aDtlbmQ9ZW5kPT09dW5kZWZpbmVkP2xlbmd0aDplbmQ7cmV0dXJuIXN0YXJ0JiZlbmQ+PWxlbmd0aD9hcnJheTpiYXNlU2xpY2UoYXJyYXksc3RhcnQsZW5kKX12YXIgY2xlYXJUaW1lb3V0PWN0eENsZWFyVGltZW91dHx8ZnVuY3Rpb24oaWQpe3JldHVybiByb290LmNsZWFyVGltZW91dChpZCl9O2Z1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlcixpc0RlZXApe2lmKGlzRGVlcClyZXR1cm4gYnVmZmVyLnNsaWNlKCk7CnZhciBsZW5ndGg9YnVmZmVyLmxlbmd0aCxyZXN1bHQ9YWxsb2NVbnNhZmU/YWxsb2NVbnNhZmUobGVuZ3RoKTpuZXcgYnVmZmVyLmNvbnN0cnVjdG9yKGxlbmd0aCk7YnVmZmVyLmNvcHkocmVzdWx0KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpe3ZhciByZXN1bHQ9bmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpOyhuZXcgVWludDhBcnJheShyZXN1bHQpKS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsaXNEZWVwKXt2YXIgYnVmZmVyPWlzRGVlcD9jbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcik6ZGF0YVZpZXcuYnVmZmVyO3JldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLGRhdGFWaWV3LmJ5dGVPZmZzZXQsZGF0YVZpZXcuYnl0ZUxlbmd0aCl9ZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKXt2YXIgcmVzdWx0PQpuZXcgcmVnZXhwLmNvbnN0cnVjdG9yKHJlZ2V4cC5zb3VyY2UscmVGbGFncy5leGVjKHJlZ2V4cCkpO3Jlc3VsdC5sYXN0SW5kZXg9cmVnZXhwLmxhc3RJbmRleDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNsb25lU3ltYm9sKHN5bWJvbCl7cmV0dXJuIHN5bWJvbFZhbHVlT2Y/T2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKTp7fX1mdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodHlwZWRBcnJheSxpc0RlZXApe3ZhciBidWZmZXI9aXNEZWVwP2Nsb25lQXJyYXlCdWZmZXIodHlwZWRBcnJheS5idWZmZXIpOnR5cGVkQXJyYXkuYnVmZmVyO3JldHVybiBuZXcgdHlwZWRBcnJheS5jb25zdHJ1Y3RvcihidWZmZXIsdHlwZWRBcnJheS5ieXRlT2Zmc2V0LHR5cGVkQXJyYXkubGVuZ3RoKX1mdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLG90aGVyKXtpZih2YWx1ZSE9PW90aGVyKXt2YXIgdmFsSXNEZWZpbmVkPXZhbHVlIT09dW5kZWZpbmVkLHZhbElzTnVsbD12YWx1ZT09PQpudWxsLHZhbElzUmVmbGV4aXZlPXZhbHVlPT09dmFsdWUsdmFsSXNTeW1ib2w9aXNTeW1ib2wodmFsdWUpO3ZhciBvdGhJc0RlZmluZWQ9b3RoZXIhPT11bmRlZmluZWQsb3RoSXNOdWxsPW90aGVyPT09bnVsbCxvdGhJc1JlZmxleGl2ZT1vdGhlcj09PW90aGVyLG90aElzU3ltYm9sPWlzU3ltYm9sKG90aGVyKTtpZighb3RoSXNOdWxsJiYhb3RoSXNTeW1ib2wmJiF2YWxJc1N5bWJvbCYmdmFsdWU+b3RoZXJ8fHZhbElzU3ltYm9sJiZvdGhJc0RlZmluZWQmJm90aElzUmVmbGV4aXZlJiYhb3RoSXNOdWxsJiYhb3RoSXNTeW1ib2x8fHZhbElzTnVsbCYmb3RoSXNEZWZpbmVkJiZvdGhJc1JlZmxleGl2ZXx8IXZhbElzRGVmaW5lZCYmb3RoSXNSZWZsZXhpdmV8fCF2YWxJc1JlZmxleGl2ZSlyZXR1cm4gMTtpZighdmFsSXNOdWxsJiYhdmFsSXNTeW1ib2wmJiFvdGhJc1N5bWJvbCYmdmFsdWU8b3RoZXJ8fG90aElzU3ltYm9sJiZ2YWxJc0RlZmluZWQmJnZhbElzUmVmbGV4aXZlJiYhdmFsSXNOdWxsJiYKIXZhbElzU3ltYm9sfHxvdGhJc051bGwmJnZhbElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmV8fCFvdGhJc0RlZmluZWQmJnZhbElzUmVmbGV4aXZlfHwhb3RoSXNSZWZsZXhpdmUpcmV0dXJuLTF9cmV0dXJuIDB9ZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCxvdGhlcixvcmRlcnMpe3ZhciBpbmRleD0tMSxvYmpDcml0ZXJpYT1vYmplY3QuY3JpdGVyaWEsb3RoQ3JpdGVyaWE9b3RoZXIuY3JpdGVyaWEsbGVuZ3RoPW9iakNyaXRlcmlhLmxlbmd0aCxvcmRlcnNMZW5ndGg9b3JkZXJzLmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHJlc3VsdD1jb21wYXJlQXNjZW5kaW5nKG9iakNyaXRlcmlhW2luZGV4XSxvdGhDcml0ZXJpYVtpbmRleF0pO2lmKHJlc3VsdCl7aWYoaW5kZXg+PW9yZGVyc0xlbmd0aClyZXR1cm4gcmVzdWx0O3ZhciBvcmRlcj1vcmRlcnNbaW5kZXhdO3JldHVybiByZXN1bHQqKG9yZGVyPT0iZGVzYyI/LTE6MSl9fXJldHVybiBvYmplY3QuaW5kZXgtCm90aGVyLmluZGV4fWZ1bmN0aW9uIGNvbXBvc2VBcmdzKGFyZ3MscGFydGlhbHMsaG9sZGVycyxpc0N1cnJpZWQpe3ZhciBhcmdzSW5kZXg9LTEsYXJnc0xlbmd0aD1hcmdzLmxlbmd0aCxob2xkZXJzTGVuZ3RoPWhvbGRlcnMubGVuZ3RoLGxlZnRJbmRleD0tMSxsZWZ0TGVuZ3RoPXBhcnRpYWxzLmxlbmd0aCxyYW5nZUxlbmd0aD1uYXRpdmVNYXgoYXJnc0xlbmd0aC1ob2xkZXJzTGVuZ3RoLDApLHJlc3VsdD1BcnJheShsZWZ0TGVuZ3RoK3JhbmdlTGVuZ3RoKSxpc1VuY3VycmllZD0haXNDdXJyaWVkO3doaWxlKCsrbGVmdEluZGV4PGxlZnRMZW5ndGgpcmVzdWx0W2xlZnRJbmRleF09cGFydGlhbHNbbGVmdEluZGV4XTt3aGlsZSgrK2FyZ3NJbmRleDxob2xkZXJzTGVuZ3RoKWlmKGlzVW5jdXJyaWVkfHxhcmdzSW5kZXg8YXJnc0xlbmd0aClyZXN1bHRbaG9sZGVyc1thcmdzSW5kZXhdXT1hcmdzW2FyZ3NJbmRleF07d2hpbGUocmFuZ2VMZW5ndGgtLSlyZXN1bHRbbGVmdEluZGV4KytdPQphcmdzW2FyZ3NJbmRleCsrXTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPWFyZ3MubGVuZ3RoLGhvbGRlcnNJbmRleD0tMSxob2xkZXJzTGVuZ3RoPWhvbGRlcnMubGVuZ3RoLHJpZ2h0SW5kZXg9LTEscmlnaHRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLHJhbmdlTGVuZ3RoPW5hdGl2ZU1heChhcmdzTGVuZ3RoLWhvbGRlcnNMZW5ndGgsMCkscmVzdWx0PUFycmF5KHJhbmdlTGVuZ3RoK3JpZ2h0TGVuZ3RoKSxpc1VuY3VycmllZD0haXNDdXJyaWVkO3doaWxlKCsrYXJnc0luZGV4PHJhbmdlTGVuZ3RoKXJlc3VsdFthcmdzSW5kZXhdPWFyZ3NbYXJnc0luZGV4XTt2YXIgb2Zmc2V0PWFyZ3NJbmRleDt3aGlsZSgrK3JpZ2h0SW5kZXg8cmlnaHRMZW5ndGgpcmVzdWx0W29mZnNldCtyaWdodEluZGV4XT1wYXJ0aWFsc1tyaWdodEluZGV4XTt3aGlsZSgrK2hvbGRlcnNJbmRleDwKaG9sZGVyc0xlbmd0aClpZihpc1VuY3VycmllZHx8YXJnc0luZGV4PGFyZ3NMZW5ndGgpcmVzdWx0W29mZnNldCtob2xkZXJzW2hvbGRlcnNJbmRleF1dPWFyZ3NbYXJnc0luZGV4KytdO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSxhcnJheSl7dmFyIGluZGV4PS0xLGxlbmd0aD1zb3VyY2UubGVuZ3RoO2FycmF5fHwoYXJyYXk9QXJyYXkobGVuZ3RoKSk7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJyYXlbaW5kZXhdPXNvdXJjZVtpbmRleF07cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLHByb3BzLG9iamVjdCxjdXN0b21pemVyKXt2YXIgaXNOZXc9IW9iamVjdDtvYmplY3R8fChvYmplY3Q9e30pO3ZhciBpbmRleD0tMSxsZW5ndGg9cHJvcHMubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIga2V5PXByb3BzW2luZGV4XTt2YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKG9iamVjdFtrZXldLHNvdXJjZVtrZXldLAprZXksb2JqZWN0LHNvdXJjZSk6dW5kZWZpbmVkO2lmKG5ld1ZhbHVlPT09dW5kZWZpbmVkKW5ld1ZhbHVlPXNvdXJjZVtrZXldO2lmKGlzTmV3KWJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LG5ld1ZhbHVlKTtlbHNlIGFzc2lnblZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpfXJldHVybiBvYmplY3R9ZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLG9iamVjdCl7cmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLGdldFN5bWJvbHMoc291cmNlKSxvYmplY3QpfWZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLG9iamVjdCl7cmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLGdldFN5bWJvbHNJbihzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gY3JlYXRlQWdncmVnYXRvcihzZXR0ZXIsaW5pdGlhbGl6ZXIpe3JldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLGl0ZXJhdGVlKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5QWdncmVnYXRvcjpiYXNlQWdncmVnYXRvcixhY2N1bXVsYXRvcj0KaW5pdGlhbGl6ZXI/aW5pdGlhbGl6ZXIoKTp7fTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLHNldHRlcixnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSxhY2N1bXVsYXRvcil9fWZ1bmN0aW9uIGNyZWF0ZUFzc2lnbmVyKGFzc2lnbmVyKXtyZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9c291cmNlcy5sZW5ndGgsY3VzdG9taXplcj1sZW5ndGg+MT9zb3VyY2VzW2xlbmd0aC0xXTp1bmRlZmluZWQsZ3VhcmQ9bGVuZ3RoPjI/c291cmNlc1syXTp1bmRlZmluZWQ7Y3VzdG9taXplcj1hc3NpZ25lci5sZW5ndGg+MyYmdHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/KGxlbmd0aC0tLGN1c3RvbWl6ZXIpOnVuZGVmaW5lZDtpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSxzb3VyY2VzWzFdLGd1YXJkKSl7Y3VzdG9taXplcj1sZW5ndGg8Mz91bmRlZmluZWQ6Y3VzdG9taXplcjtsZW5ndGg9MX1vYmplY3Q9T2JqZWN0KG9iamVjdCk7CndoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgc291cmNlPXNvdXJjZXNbaW5kZXhdO2lmKHNvdXJjZSlhc3NpZ25lcihvYmplY3Qsc291cmNlLGluZGV4LGN1c3RvbWl6ZXIpfXJldHVybiBvYmplY3R9KX1mdW5jdGlvbiBjcmVhdGVCYXNlRWFjaChlYWNoRnVuYyxmcm9tUmlnaHQpe3JldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLGl0ZXJhdGVlKXtpZihjb2xsZWN0aW9uPT1udWxsKXJldHVybiBjb2xsZWN0aW9uO2lmKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSlyZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbixpdGVyYXRlZSk7dmFyIGxlbmd0aD1jb2xsZWN0aW9uLmxlbmd0aCxpbmRleD1mcm9tUmlnaHQ/bGVuZ3RoOi0xLGl0ZXJhYmxlPU9iamVjdChjb2xsZWN0aW9uKTt3aGlsZShmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aClpZihpdGVyYXRlZShpdGVyYWJsZVtpbmRleF0saW5kZXgsaXRlcmFibGUpPT09ZmFsc2UpYnJlYWs7cmV0dXJuIGNvbGxlY3Rpb259fWZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0LAppdGVyYXRlZSxrZXlzRnVuYyl7dmFyIGluZGV4PS0xLGl0ZXJhYmxlPU9iamVjdChvYmplY3QpLHByb3BzPWtleXNGdW5jKG9iamVjdCksbGVuZ3RoPXByb3BzLmxlbmd0aDt3aGlsZShsZW5ndGgtLSl7dmFyIGtleT1wcm9wc1tmcm9tUmlnaHQ/bGVuZ3RoOisraW5kZXhdO2lmKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sa2V5LGl0ZXJhYmxlKT09PWZhbHNlKWJyZWFrfXJldHVybiBvYmplY3R9fWZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYyxiaXRtYXNrLHRoaXNBcmcpe3ZhciBpc0JpbmQ9Yml0bWFzayZXUkFQX0JJTkRfRkxBRyxDdG9yPWNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBmbj10aGlzJiZ0aGlzIT09cm9vdCYmdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXI/Q3RvcjpmdW5jO3JldHVybiBmbi5hcHBseShpc0JpbmQ/dGhpc0FyZzp0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHdyYXBwZXJ9ZnVuY3Rpb24gY3JlYXRlQ2FzZUZpcnN0KG1ldGhvZE5hbWUpe3JldHVybiBmdW5jdGlvbihzdHJpbmcpe3N0cmluZz0KdG9TdHJpbmcoc3RyaW5nKTt2YXIgc3RyU3ltYm9scz1oYXNVbmljb2RlKHN0cmluZyk/c3RyaW5nVG9BcnJheShzdHJpbmcpOnVuZGVmaW5lZDt2YXIgY2hyPXN0clN5bWJvbHM/c3RyU3ltYm9sc1swXTpzdHJpbmcuY2hhckF0KDApO3ZhciB0cmFpbGluZz1zdHJTeW1ib2xzP2Nhc3RTbGljZShzdHJTeW1ib2xzLDEpLmpvaW4oIiIpOnN0cmluZy5zbGljZSgxKTtyZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkrdHJhaWxpbmd9fWZ1bmN0aW9uIGNyZWF0ZUNvbXBvdW5kZXIoY2FsbGJhY2spe3JldHVybiBmdW5jdGlvbihzdHJpbmcpe3JldHVybiBhcnJheVJlZHVjZSh3b3JkcyhkZWJ1cnIoc3RyaW5nKS5yZXBsYWNlKHJlQXBvcywiIikpLGNhbGxiYWNrLCIiKX19ZnVuY3Rpb24gY3JlYXRlQ3RvcihDdG9yKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7c3dpdGNoKGFyZ3MubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyBDdG9yO2Nhc2UgMTpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7CmNhc2UgMjpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdKTtjYXNlIDM6cmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKTtjYXNlIDQ6cmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10pO2Nhc2UgNTpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdKTtjYXNlIDY6cmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdKTtjYXNlIDc6cmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLGFyZ3NbNl0pfXZhciB0aGlzQmluZGluZz1iYXNlQ3JlYXRlKEN0b3IucHJvdG90eXBlKSxyZXN1bHQ9Q3Rvci5hcHBseSh0aGlzQmluZGluZyxhcmdzKTtyZXR1cm4gaXNPYmplY3QocmVzdWx0KT9yZXN1bHQ6dGhpc0JpbmRpbmd9fWZ1bmN0aW9uIGNyZWF0ZUN1cnJ5KGZ1bmMsCmJpdG1hc2ssYXJpdHkpe3ZhciBDdG9yPWNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBsZW5ndGg9YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KGxlbmd0aCksaW5kZXg9bGVuZ3RoLHBsYWNlaG9sZGVyPWdldEhvbGRlcih3cmFwcGVyKTt3aGlsZShpbmRleC0tKWFyZ3NbaW5kZXhdPWFyZ3VtZW50c1tpbmRleF07dmFyIGhvbGRlcnM9bGVuZ3RoPDMmJmFyZ3NbMF0hPT1wbGFjZWhvbGRlciYmYXJnc1tsZW5ndGgtMV0hPT1wbGFjZWhvbGRlcj9bXTpyZXBsYWNlSG9sZGVycyhhcmdzLHBsYWNlaG9sZGVyKTtsZW5ndGgtPWhvbGRlcnMubGVuZ3RoO2lmKGxlbmd0aDxhcml0eSlyZXR1cm4gY3JlYXRlUmVjdXJyeShmdW5jLGJpdG1hc2ssY3JlYXRlSHlicmlkLHdyYXBwZXIucGxhY2Vob2xkZXIsdW5kZWZpbmVkLGFyZ3MsaG9sZGVycyx1bmRlZmluZWQsdW5kZWZpbmVkLGFyaXR5LWxlbmd0aCk7dmFyIGZuPXRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2YKd3JhcHBlcj9DdG9yOmZ1bmM7cmV0dXJuIGFwcGx5KGZuLHRoaXMsYXJncyl9cmV0dXJuIHdyYXBwZXJ9ZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKXtyZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbixwcmVkaWNhdGUsZnJvbUluZGV4KXt2YXIgaXRlcmFibGU9T2JqZWN0KGNvbGxlY3Rpb24pO2lmKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSl7dmFyIGl0ZXJhdGVlPWdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKTtjb2xsZWN0aW9uPWtleXMoY29sbGVjdGlvbik7cHJlZGljYXRlPWZ1bmN0aW9uKGtleSl7cmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sa2V5LGl0ZXJhYmxlKX19dmFyIGluZGV4PWZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbixwcmVkaWNhdGUsZnJvbUluZGV4KTtyZXR1cm4gaW5kZXg+LTE/aXRlcmFibGVbaXRlcmF0ZWU/Y29sbGVjdGlvbltpbmRleF06aW5kZXhdOnVuZGVmaW5lZH19ZnVuY3Rpb24gY3JlYXRlRmxvdyhmcm9tUmlnaHQpe3JldHVybiBmbGF0UmVzdChmdW5jdGlvbihmdW5jcyl7dmFyIGxlbmd0aD0KZnVuY3MubGVuZ3RoLGluZGV4PWxlbmd0aCxwcmVyZXE9TG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtpZihmcm9tUmlnaHQpZnVuY3MucmV2ZXJzZSgpO3doaWxlKGluZGV4LS0pe3ZhciBmdW5jPWZ1bmNzW2luZGV4XTtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7aWYocHJlcmVxJiYhd3JhcHBlciYmZ2V0RnVuY05hbWUoZnVuYyk9PSJ3cmFwcGVyIil2YXIgd3JhcHBlcj1uZXcgTG9kYXNoV3JhcHBlcihbXSx0cnVlKX1pbmRleD13cmFwcGVyP2luZGV4Omxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7ZnVuYz1mdW5jc1tpbmRleF07dmFyIGZ1bmNOYW1lPWdldEZ1bmNOYW1lKGZ1bmMpLGRhdGE9ZnVuY05hbWU9PSJ3cmFwcGVyIj9nZXREYXRhKGZ1bmMpOnVuZGVmaW5lZDtpZihkYXRhJiZpc0xhemlhYmxlKGRhdGFbMF0pJiZkYXRhWzFdPT0oV1JBUF9BUllfRkxBR3xXUkFQX0NVUlJZX0ZMQUd8V1JBUF9QQVJUSUFMX0ZMQUd8CldSQVBfUkVBUkdfRkxBRykmJiFkYXRhWzRdLmxlbmd0aCYmZGF0YVs5XT09MSl3cmFwcGVyPXdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsZGF0YVszXSk7ZWxzZSB3cmFwcGVyPWZ1bmMubGVuZ3RoPT0xJiZpc0xhemlhYmxlKGZ1bmMpP3dyYXBwZXJbZnVuY05hbWVdKCk6d3JhcHBlci50aHJ1KGZ1bmMpfXJldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cyx2YWx1ZT1hcmdzWzBdO2lmKHdyYXBwZXImJmFyZ3MubGVuZ3RoPT0xJiZpc0FycmF5KHZhbHVlKSlyZXR1cm4gd3JhcHBlci5wbGFudCh2YWx1ZSkudmFsdWUoKTt2YXIgaW5kZXg9MCxyZXN1bHQ9bGVuZ3RoP2Z1bmNzW2luZGV4XS5hcHBseSh0aGlzLGFyZ3MpOnZhbHVlO3doaWxlKCsraW5kZXg8bGVuZ3RoKXJlc3VsdD1mdW5jc1tpbmRleF0uY2FsbCh0aGlzLHJlc3VsdCk7cmV0dXJuIHJlc3VsdH19KX1mdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYyxiaXRtYXNrLHRoaXNBcmcsCnBhcnRpYWxzLGhvbGRlcnMscGFydGlhbHNSaWdodCxob2xkZXJzUmlnaHQsYXJnUG9zLGFyeSxhcml0eSl7dmFyIGlzQXJ5PWJpdG1hc2smV1JBUF9BUllfRkxBRyxpc0JpbmQ9Yml0bWFzayZXUkFQX0JJTkRfRkxBRyxpc0JpbmRLZXk9Yml0bWFzayZXUkFQX0JJTkRfS0VZX0ZMQUcsaXNDdXJyaWVkPWJpdG1hc2smKFdSQVBfQ1VSUllfRkxBR3xXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpLGlzRmxpcD1iaXRtYXNrJldSQVBfRkxJUF9GTEFHLEN0b3I9aXNCaW5kS2V5P3VuZGVmaW5lZDpjcmVhdGVDdG9yKGZ1bmMpO2Z1bmN0aW9uIHdyYXBwZXIoKXt2YXIgbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShsZW5ndGgpLGluZGV4PWxlbmd0aDt3aGlsZShpbmRleC0tKWFyZ3NbaW5kZXhdPWFyZ3VtZW50c1tpbmRleF07aWYoaXNDdXJyaWVkKXZhciBwbGFjZWhvbGRlcj1nZXRIb2xkZXIod3JhcHBlciksaG9sZGVyc0NvdW50PWNvdW50SG9sZGVycyhhcmdzLHBsYWNlaG9sZGVyKTsKaWYocGFydGlhbHMpYXJncz1jb21wb3NlQXJncyhhcmdzLHBhcnRpYWxzLGhvbGRlcnMsaXNDdXJyaWVkKTtpZihwYXJ0aWFsc1JpZ2h0KWFyZ3M9Y29tcG9zZUFyZ3NSaWdodChhcmdzLHBhcnRpYWxzUmlnaHQsaG9sZGVyc1JpZ2h0LGlzQ3VycmllZCk7bGVuZ3RoLT1ob2xkZXJzQ291bnQ7aWYoaXNDdXJyaWVkJiZsZW5ndGg8YXJpdHkpe3ZhciBuZXdIb2xkZXJzPXJlcGxhY2VIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpO3JldHVybiBjcmVhdGVSZWN1cnJ5KGZ1bmMsYml0bWFzayxjcmVhdGVIeWJyaWQsd3JhcHBlci5wbGFjZWhvbGRlcix0aGlzQXJnLGFyZ3MsbmV3SG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5LWxlbmd0aCl9dmFyIHRoaXNCaW5kaW5nPWlzQmluZD90aGlzQXJnOnRoaXMsZm49aXNCaW5kS2V5P3RoaXNCaW5kaW5nW2Z1bmNdOmZ1bmM7bGVuZ3RoPWFyZ3MubGVuZ3RoO2lmKGFyZ1BvcylhcmdzPXJlb3JkZXIoYXJncyxhcmdQb3MpO2Vsc2UgaWYoaXNGbGlwJiZsZW5ndGg+CjEpYXJncy5yZXZlcnNlKCk7aWYoaXNBcnkmJmFyeTxsZW5ndGgpYXJncy5sZW5ndGg9YXJ5O2lmKHRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcilmbj1DdG9yfHxjcmVhdGVDdG9yKGZuKTtyZXR1cm4gZm4uYXBwbHkodGhpc0JpbmRpbmcsYXJncyl9cmV0dXJuIHdyYXBwZXJ9ZnVuY3Rpb24gY3JlYXRlSW52ZXJ0ZXIoc2V0dGVyLHRvSXRlcmF0ZWUpe3JldHVybiBmdW5jdGlvbihvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LHNldHRlcix0b0l0ZXJhdGVlKGl0ZXJhdGVlKSx7fSl9fWZ1bmN0aW9uIGNyZWF0ZU1hdGhPcGVyYXRpb24ob3BlcmF0b3IsZGVmYXVsdFZhbHVlKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUsb3RoZXIpe3ZhciByZXN1bHQ7aWYodmFsdWU9PT11bmRlZmluZWQmJm90aGVyPT09dW5kZWZpbmVkKXJldHVybiBkZWZhdWx0VmFsdWU7aWYodmFsdWUhPT11bmRlZmluZWQpcmVzdWx0PXZhbHVlO2lmKG90aGVyIT09CnVuZGVmaW5lZCl7aWYocmVzdWx0PT09dW5kZWZpbmVkKXJldHVybiBvdGhlcjtpZih0eXBlb2YgdmFsdWU9PSJzdHJpbmcifHx0eXBlb2Ygb3RoZXI9PSJzdHJpbmciKXt2YWx1ZT1iYXNlVG9TdHJpbmcodmFsdWUpO290aGVyPWJhc2VUb1N0cmluZyhvdGhlcil9ZWxzZXt2YWx1ZT1iYXNlVG9OdW1iZXIodmFsdWUpO290aGVyPWJhc2VUb051bWJlcihvdGhlcil9cmVzdWx0PW9wZXJhdG9yKHZhbHVlLG90aGVyKX1yZXR1cm4gcmVzdWx0fX1mdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYyl7cmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGl0ZXJhdGVlcyl7aXRlcmF0ZWVzPWFycmF5TWFwKGl0ZXJhdGVlcyxiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgdGhpc0FyZz10aGlzO3JldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLGZ1bmN0aW9uKGl0ZXJhdGVlKXtyZXR1cm4gYXBwbHkoaXRlcmF0ZWUsdGhpc0FyZyxhcmdzKX0pfSl9KX0KZnVuY3Rpb24gY3JlYXRlUGFkZGluZyhsZW5ndGgsY2hhcnMpe2NoYXJzPWNoYXJzPT09dW5kZWZpbmVkPyIgIjpiYXNlVG9TdHJpbmcoY2hhcnMpO3ZhciBjaGFyc0xlbmd0aD1jaGFycy5sZW5ndGg7aWYoY2hhcnNMZW5ndGg8MilyZXR1cm4gY2hhcnNMZW5ndGg/YmFzZVJlcGVhdChjaGFycyxsZW5ndGgpOmNoYXJzO3ZhciByZXN1bHQ9YmFzZVJlcGVhdChjaGFycyxuYXRpdmVDZWlsKGxlbmd0aC9zdHJpbmdTaXplKGNoYXJzKSkpO3JldHVybiBoYXNVbmljb2RlKGNoYXJzKT9jYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShyZXN1bHQpLDAsbGVuZ3RoKS5qb2luKCIiKTpyZXN1bHQuc2xpY2UoMCxsZW5ndGgpfWZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwoZnVuYyxiaXRtYXNrLHRoaXNBcmcscGFydGlhbHMpe3ZhciBpc0JpbmQ9Yml0bWFzayZXUkFQX0JJTkRfRkxBRyxDdG9yPWNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBhcmdzSW5kZXg9LTEsYXJnc0xlbmd0aD0KYXJndW1lbnRzLmxlbmd0aCxsZWZ0SW5kZXg9LTEsbGVmdExlbmd0aD1wYXJ0aWFscy5sZW5ndGgsYXJncz1BcnJheShsZWZ0TGVuZ3RoK2FyZ3NMZW5ndGgpLGZuPXRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcj9DdG9yOmZ1bmM7d2hpbGUoKytsZWZ0SW5kZXg8bGVmdExlbmd0aClhcmdzW2xlZnRJbmRleF09cGFydGlhbHNbbGVmdEluZGV4XTt3aGlsZShhcmdzTGVuZ3RoLS0pYXJnc1tsZWZ0SW5kZXgrK109YXJndW1lbnRzWysrYXJnc0luZGV4XTtyZXR1cm4gYXBwbHkoZm4saXNCaW5kP3RoaXNBcmc6dGhpcyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpe3JldHVybiBmdW5jdGlvbihzdGFydCxlbmQsc3RlcCl7aWYoc3RlcCYmdHlwZW9mIHN0ZXAhPSJudW1iZXIiJiZpc0l0ZXJhdGVlQ2FsbChzdGFydCxlbmQsc3RlcCkpZW5kPXN0ZXA9dW5kZWZpbmVkO3N0YXJ0PXRvRmluaXRlKHN0YXJ0KTtpZihlbmQ9PT0KdW5kZWZpbmVkKXtlbmQ9c3RhcnQ7c3RhcnQ9MH1lbHNlIGVuZD10b0Zpbml0ZShlbmQpO3N0ZXA9c3RlcD09PXVuZGVmaW5lZD9zdGFydDxlbmQ/MTotMTp0b0Zpbml0ZShzdGVwKTtyZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LGVuZCxzdGVwLGZyb21SaWdodCl9fWZ1bmN0aW9uIGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24ob3BlcmF0b3Ipe3JldHVybiBmdW5jdGlvbih2YWx1ZSxvdGhlcil7aWYoISh0eXBlb2YgdmFsdWU9PSJzdHJpbmciJiZ0eXBlb2Ygb3RoZXI9PSJzdHJpbmciKSl7dmFsdWU9dG9OdW1iZXIodmFsdWUpO290aGVyPXRvTnVtYmVyKG90aGVyKX1yZXR1cm4gb3BlcmF0b3IodmFsdWUsb3RoZXIpfX1mdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsYml0bWFzayx3cmFwRnVuYyxwbGFjZWhvbGRlcix0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMsYXJnUG9zLGFyeSxhcml0eSl7dmFyIGlzQ3Vycnk9Yml0bWFzayZXUkFQX0NVUlJZX0ZMQUcsbmV3SG9sZGVycz1pc0N1cnJ5Pwpob2xkZXJzOnVuZGVmaW5lZCxuZXdIb2xkZXJzUmlnaHQ9aXNDdXJyeT91bmRlZmluZWQ6aG9sZGVycyxuZXdQYXJ0aWFscz1pc0N1cnJ5P3BhcnRpYWxzOnVuZGVmaW5lZCxuZXdQYXJ0aWFsc1JpZ2h0PWlzQ3Vycnk/dW5kZWZpbmVkOnBhcnRpYWxzO2JpdG1hc2t8PWlzQ3Vycnk/V1JBUF9QQVJUSUFMX0ZMQUc6V1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUc7Yml0bWFzayY9fihpc0N1cnJ5P1dSQVBfUEFSVElBTF9SSUdIVF9GTEFHOldSQVBfUEFSVElBTF9GTEFHKTtpZighKGJpdG1hc2smV1JBUF9DVVJSWV9CT1VORF9GTEFHKSliaXRtYXNrJj1+KFdSQVBfQklORF9GTEFHfFdSQVBfQklORF9LRVlfRkxBRyk7dmFyIG5ld0RhdGE9W2Z1bmMsYml0bWFzayx0aGlzQXJnLG5ld1BhcnRpYWxzLG5ld0hvbGRlcnMsbmV3UGFydGlhbHNSaWdodCxuZXdIb2xkZXJzUmlnaHQsYXJnUG9zLGFyeSxhcml0eV07dmFyIHJlc3VsdD13cmFwRnVuYy5hcHBseSh1bmRlZmluZWQsbmV3RGF0YSk7aWYoaXNMYXppYWJsZShmdW5jKSlzZXREYXRhKHJlc3VsdCwKbmV3RGF0YSk7cmVzdWx0LnBsYWNlaG9sZGVyPXBsYWNlaG9sZGVyO3JldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LGZ1bmMsYml0bWFzayl9ZnVuY3Rpb24gY3JlYXRlUm91bmQobWV0aG9kTmFtZSl7dmFyIGZ1bmM9TWF0aFttZXRob2ROYW1lXTtyZXR1cm4gZnVuY3Rpb24obnVtYmVyLHByZWNpc2lvbil7bnVtYmVyPXRvTnVtYmVyKG51bWJlcik7cHJlY2lzaW9uPXByZWNpc2lvbj09bnVsbD8wOm5hdGl2ZU1pbih0b0ludGVnZXIocHJlY2lzaW9uKSwyOTIpO2lmKHByZWNpc2lvbil7dmFyIHBhaXI9KHRvU3RyaW5nKG51bWJlcikrImUiKS5zcGxpdCgiZSIpLHZhbHVlPWZ1bmMocGFpclswXSsiZSIrKCtwYWlyWzFdK3ByZWNpc2lvbikpO3BhaXI9KHRvU3RyaW5nKHZhbHVlKSsiZSIpLnNwbGl0KCJlIik7cmV0dXJuKyhwYWlyWzBdKyJlIisoK3BhaXJbMV0tcHJlY2lzaW9uKSl9cmV0dXJuIGZ1bmMobnVtYmVyKX19dmFyIGNyZWF0ZVNldD0hKFNldCYmMS9zZXRUb0FycmF5KG5ldyBTZXQoWywKLTBdKSlbMV09PUlORklOSVRZKT9ub29wOmZ1bmN0aW9uKHZhbHVlcyl7cmV0dXJuIG5ldyBTZXQodmFsdWVzKX07ZnVuY3Rpb24gY3JlYXRlVG9QYWlycyhrZXlzRnVuYyl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7dmFyIHRhZz1nZXRUYWcob2JqZWN0KTtpZih0YWc9PW1hcFRhZylyZXR1cm4gbWFwVG9BcnJheShvYmplY3QpO2lmKHRhZz09c2V0VGFnKXJldHVybiBzZXRUb1BhaXJzKG9iamVjdCk7cmV0dXJuIGJhc2VUb1BhaXJzKG9iamVjdCxrZXlzRnVuYyhvYmplY3QpKX19ZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzLGFyZ1BvcyxhcnksYXJpdHkpe3ZhciBpc0JpbmRLZXk9Yml0bWFzayZXUkFQX0JJTkRfS0VZX0ZMQUc7aWYoIWlzQmluZEtleSYmdHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3ZhciBsZW5ndGg9cGFydGlhbHM/cGFydGlhbHMubGVuZ3RoOgowO2lmKCFsZW5ndGgpe2JpdG1hc2smPX4oV1JBUF9QQVJUSUFMX0ZMQUd8V1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpO3BhcnRpYWxzPWhvbGRlcnM9dW5kZWZpbmVkfWFyeT1hcnk9PT11bmRlZmluZWQ/YXJ5Om5hdGl2ZU1heCh0b0ludGVnZXIoYXJ5KSwwKTthcml0eT1hcml0eT09PXVuZGVmaW5lZD9hcml0eTp0b0ludGVnZXIoYXJpdHkpO2xlbmd0aC09aG9sZGVycz9ob2xkZXJzLmxlbmd0aDowO2lmKGJpdG1hc2smV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpe3ZhciBwYXJ0aWFsc1JpZ2h0PXBhcnRpYWxzLGhvbGRlcnNSaWdodD1ob2xkZXJzO3BhcnRpYWxzPWhvbGRlcnM9dW5kZWZpbmVkfXZhciBkYXRhPWlzQmluZEtleT91bmRlZmluZWQ6Z2V0RGF0YShmdW5jKTt2YXIgbmV3RGF0YT1bZnVuYyxiaXRtYXNrLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxwYXJ0aWFsc1JpZ2h0LGhvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5XTtpZihkYXRhKW1lcmdlRGF0YShuZXdEYXRhLApkYXRhKTtmdW5jPW5ld0RhdGFbMF07Yml0bWFzaz1uZXdEYXRhWzFdO3RoaXNBcmc9bmV3RGF0YVsyXTtwYXJ0aWFscz1uZXdEYXRhWzNdO2hvbGRlcnM9bmV3RGF0YVs0XTthcml0eT1uZXdEYXRhWzldPW5ld0RhdGFbOV09PT11bmRlZmluZWQ/aXNCaW5kS2V5PzA6ZnVuYy5sZW5ndGg6bmF0aXZlTWF4KG5ld0RhdGFbOV0tbGVuZ3RoLDApO2lmKCFhcml0eSYmYml0bWFzayYoV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRykpYml0bWFzayY9fihXUkFQX0NVUlJZX0ZMQUd8V1JBUF9DVVJSWV9SSUdIVF9GTEFHKTtpZighYml0bWFza3x8Yml0bWFzaz09V1JBUF9CSU5EX0ZMQUcpdmFyIHJlc3VsdD1jcmVhdGVCaW5kKGZ1bmMsYml0bWFzayx0aGlzQXJnKTtlbHNlIGlmKGJpdG1hc2s9PVdSQVBfQ1VSUllfRkxBR3x8Yml0bWFzaz09V1JBUF9DVVJSWV9SSUdIVF9GTEFHKXJlc3VsdD1jcmVhdGVDdXJyeShmdW5jLGJpdG1hc2ssYXJpdHkpO2Vsc2UgaWYoKGJpdG1hc2s9PQpXUkFQX1BBUlRJQUxfRkxBR3x8Yml0bWFzaz09KFdSQVBfQklORF9GTEFHfFdSQVBfUEFSVElBTF9GTEFHKSkmJiFob2xkZXJzLmxlbmd0aClyZXN1bHQ9Y3JlYXRlUGFydGlhbChmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyk7ZWxzZSByZXN1bHQ9Y3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCxuZXdEYXRhKTt2YXIgc2V0dGVyPWRhdGE/YmFzZVNldERhdGE6c2V0RGF0YTtyZXR1cm4gc2V0V3JhcFRvU3RyaW5nKHNldHRlcihyZXN1bHQsbmV3RGF0YSksZnVuYyxiaXRtYXNrKX1mdW5jdGlvbiBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKG9ialZhbHVlLHNyY1ZhbHVlLGtleSxvYmplY3Qpe2lmKG9ialZhbHVlPT09dW5kZWZpbmVkfHxlcShvYmpWYWx1ZSxvYmplY3RQcm90b1trZXldKSYmIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpcmV0dXJuIHNyY1ZhbHVlO3JldHVybiBvYmpWYWx1ZX1mdW5jdGlvbiBjdXN0b21EZWZhdWx0c01lcmdlKG9ialZhbHVlLHNyY1ZhbHVlLAprZXksb2JqZWN0LHNvdXJjZSxzdGFjayl7aWYoaXNPYmplY3Qob2JqVmFsdWUpJiZpc09iamVjdChzcmNWYWx1ZSkpe3N0YWNrLnNldChzcmNWYWx1ZSxvYmpWYWx1ZSk7YmFzZU1lcmdlKG9ialZhbHVlLHNyY1ZhbHVlLHVuZGVmaW5lZCxjdXN0b21EZWZhdWx0c01lcmdlLHN0YWNrKTtzdGFja1siZGVsZXRlIl0oc3JjVmFsdWUpfXJldHVybiBvYmpWYWx1ZX1mdW5jdGlvbiBjdXN0b21PbWl0Q2xvbmUodmFsdWUpe3JldHVybiBpc1BsYWluT2JqZWN0KHZhbHVlKT91bmRlZmluZWQ6dmFsdWV9ZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIGlzUGFydGlhbD1iaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHLGFyckxlbmd0aD1hcnJheS5sZW5ndGgsb3RoTGVuZ3RoPW90aGVyLmxlbmd0aDtpZihhcnJMZW5ndGghPW90aExlbmd0aCYmIShpc1BhcnRpYWwmJm90aExlbmd0aD5hcnJMZW5ndGgpKXJldHVybiBmYWxzZTsKdmFyIHN0YWNrZWQ9c3RhY2suZ2V0KGFycmF5KTtpZihzdGFja2VkJiZzdGFjay5nZXQob3RoZXIpKXJldHVybiBzdGFja2VkPT1vdGhlcjt2YXIgaW5kZXg9LTEscmVzdWx0PXRydWUsc2Vlbj1iaXRtYXNrJkNPTVBBUkVfVU5PUkRFUkVEX0ZMQUc/bmV3IFNldENhY2hlOnVuZGVmaW5lZDtzdGFjay5zZXQoYXJyYXksb3RoZXIpO3N0YWNrLnNldChvdGhlcixhcnJheSk7d2hpbGUoKytpbmRleDxhcnJMZW5ndGgpe3ZhciBhcnJWYWx1ZT1hcnJheVtpbmRleF0sb3RoVmFsdWU9b3RoZXJbaW5kZXhdO2lmKGN1c3RvbWl6ZXIpdmFyIGNvbXBhcmVkPWlzUGFydGlhbD9jdXN0b21pemVyKG90aFZhbHVlLGFyclZhbHVlLGluZGV4LG90aGVyLGFycmF5LHN0YWNrKTpjdXN0b21pemVyKGFyclZhbHVlLG90aFZhbHVlLGluZGV4LGFycmF5LG90aGVyLHN0YWNrKTtpZihjb21wYXJlZCE9PXVuZGVmaW5lZCl7aWYoY29tcGFyZWQpY29udGludWU7cmVzdWx0PWZhbHNlO2JyZWFrfWlmKHNlZW4pe2lmKCFhcnJheVNvbWUob3RoZXIsCmZ1bmN0aW9uKG90aFZhbHVlLG90aEluZGV4KXtpZighY2FjaGVIYXMoc2VlbixvdGhJbmRleCkmJihhcnJWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMoYXJyVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKSkpcmV0dXJuIHNlZW4ucHVzaChvdGhJbmRleCl9KSl7cmVzdWx0PWZhbHNlO2JyZWFrfX1lbHNlIGlmKCEoYXJyVmFsdWU9PT1vdGhWYWx1ZXx8ZXF1YWxGdW5jKGFyclZhbHVlLG90aFZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixzdGFjaykpKXtyZXN1bHQ9ZmFsc2U7YnJlYWt9fXN0YWNrWyJkZWxldGUiXShhcnJheSk7c3RhY2tbImRlbGV0ZSJdKG90aGVyKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LG90aGVyLHRhZyxiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXtzd2l0Y2godGFnKXtjYXNlIGRhdGFWaWV3VGFnOmlmKG9iamVjdC5ieXRlTGVuZ3RoIT1vdGhlci5ieXRlTGVuZ3RofHxvYmplY3QuYnl0ZU9mZnNldCE9Cm90aGVyLmJ5dGVPZmZzZXQpcmV0dXJuIGZhbHNlO29iamVjdD1vYmplY3QuYnVmZmVyO290aGVyPW90aGVyLmJ1ZmZlcjtjYXNlIGFycmF5QnVmZmVyVGFnOmlmKG9iamVjdC5ieXRlTGVuZ3RoIT1vdGhlci5ieXRlTGVuZ3RofHwhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWU7Y2FzZSBib29sVGFnOmNhc2UgZGF0ZVRhZzpjYXNlIG51bWJlclRhZzpyZXR1cm4gZXEoK29iamVjdCwrb3RoZXIpO2Nhc2UgZXJyb3JUYWc6cmV0dXJuIG9iamVjdC5uYW1lPT1vdGhlci5uYW1lJiZvYmplY3QubWVzc2FnZT09b3RoZXIubWVzc2FnZTtjYXNlIHJlZ2V4cFRhZzpjYXNlIHN0cmluZ1RhZzpyZXR1cm4gb2JqZWN0PT1vdGhlcisiIjtjYXNlIG1hcFRhZzp2YXIgY29udmVydD1tYXBUb0FycmF5O2Nhc2Ugc2V0VGFnOnZhciBpc1BhcnRpYWw9Yml0bWFzayZDT01QQVJFX1BBUlRJQUxfRkxBRztjb252ZXJ0fHwKKGNvbnZlcnQ9c2V0VG9BcnJheSk7aWYob2JqZWN0LnNpemUhPW90aGVyLnNpemUmJiFpc1BhcnRpYWwpcmV0dXJuIGZhbHNlO3ZhciBzdGFja2VkPXN0YWNrLmdldChvYmplY3QpO2lmKHN0YWNrZWQpcmV0dXJuIHN0YWNrZWQ9PW90aGVyO2JpdG1hc2t8PUNPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7c3RhY2suc2V0KG9iamVjdCxvdGhlcik7dmFyIHJlc3VsdD1lcXVhbEFycmF5cyhjb252ZXJ0KG9iamVjdCksY29udmVydChvdGhlciksYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayk7c3RhY2tbImRlbGV0ZSJdKG9iamVjdCk7cmV0dXJuIHJlc3VsdDtjYXNlIHN5bWJvbFRhZzppZihzeW1ib2xWYWx1ZU9mKXJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KT09c3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXt2YXIgaXNQYXJ0aWFsPQpiaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHLG9ialByb3BzPWdldEFsbEtleXMob2JqZWN0KSxvYmpMZW5ndGg9b2JqUHJvcHMubGVuZ3RoLG90aFByb3BzPWdldEFsbEtleXMob3RoZXIpLG90aExlbmd0aD1vdGhQcm9wcy5sZW5ndGg7aWYob2JqTGVuZ3RoIT1vdGhMZW5ndGgmJiFpc1BhcnRpYWwpcmV0dXJuIGZhbHNlO3ZhciBpbmRleD1vYmpMZW5ndGg7d2hpbGUoaW5kZXgtLSl7dmFyIGtleT1vYmpQcm9wc1tpbmRleF07aWYoIShpc1BhcnRpYWw/a2V5IGluIG90aGVyOmhhc093blByb3BlcnR5LmNhbGwob3RoZXIsa2V5KSkpcmV0dXJuIGZhbHNlfXZhciBzdGFja2VkPXN0YWNrLmdldChvYmplY3QpO2lmKHN0YWNrZWQmJnN0YWNrLmdldChvdGhlcikpcmV0dXJuIHN0YWNrZWQ9PW90aGVyO3ZhciByZXN1bHQ9dHJ1ZTtzdGFjay5zZXQob2JqZWN0LG90aGVyKTtzdGFjay5zZXQob3RoZXIsb2JqZWN0KTt2YXIgc2tpcEN0b3I9aXNQYXJ0aWFsO3doaWxlKCsraW5kZXg8b2JqTGVuZ3RoKXtrZXk9Cm9ialByb3BzW2luZGV4XTt2YXIgb2JqVmFsdWU9b2JqZWN0W2tleV0sb3RoVmFsdWU9b3RoZXJba2V5XTtpZihjdXN0b21pemVyKXZhciBjb21wYXJlZD1pc1BhcnRpYWw/Y3VzdG9taXplcihvdGhWYWx1ZSxvYmpWYWx1ZSxrZXksb3RoZXIsb2JqZWN0LHN0YWNrKTpjdXN0b21pemVyKG9ialZhbHVlLG90aFZhbHVlLGtleSxvYmplY3Qsb3RoZXIsc3RhY2spO2lmKCEoY29tcGFyZWQ9PT11bmRlZmluZWQ/b2JqVmFsdWU9PT1vdGhWYWx1ZXx8ZXF1YWxGdW5jKG9ialZhbHVlLG90aFZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayk6Y29tcGFyZWQpKXtyZXN1bHQ9ZmFsc2U7YnJlYWt9c2tpcEN0b3J8fChza2lwQ3Rvcj1rZXk9PSJjb25zdHJ1Y3RvciIpfWlmKHJlc3VsdCYmIXNraXBDdG9yKXt2YXIgb2JqQ3Rvcj1vYmplY3QuY29uc3RydWN0b3Isb3RoQ3Rvcj1vdGhlci5jb25zdHJ1Y3RvcjtpZihvYmpDdG9yIT1vdGhDdG9yJiYoImNvbnN0cnVjdG9yImluIG9iamVjdCYmImNvbnN0cnVjdG9yImluCm90aGVyKSYmISh0eXBlb2Ygb2JqQ3Rvcj09ImZ1bmN0aW9uIiYmb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3ImJnR5cGVvZiBvdGhDdG9yPT0iZnVuY3Rpb24iJiZvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpcmVzdWx0PWZhbHNlfXN0YWNrWyJkZWxldGUiXShvYmplY3QpO3N0YWNrWyJkZWxldGUiXShvdGhlcik7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBmbGF0UmVzdChmdW5jKXtyZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYyx1bmRlZmluZWQsZmxhdHRlbiksZnVuYysiIil9ZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3Qpe3JldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3Qsa2V5cyxnZXRTeW1ib2xzKX1mdW5jdGlvbiBnZXRBbGxLZXlzSW4ob2JqZWN0KXtyZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LGtleXNJbixnZXRTeW1ib2xzSW4pfXZhciBnZXREYXRhPSFtZXRhTWFwP25vb3A6ZnVuY3Rpb24oZnVuYyl7cmV0dXJuIG1ldGFNYXAuZ2V0KGZ1bmMpfTsKZnVuY3Rpb24gZ2V0RnVuY05hbWUoZnVuYyl7dmFyIHJlc3VsdD1mdW5jLm5hbWUrIiIsYXJyYXk9cmVhbE5hbWVzW3Jlc3VsdF0sbGVuZ3RoPWhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLHJlc3VsdCk/YXJyYXkubGVuZ3RoOjA7d2hpbGUobGVuZ3RoLS0pe3ZhciBkYXRhPWFycmF5W2xlbmd0aF0sb3RoZXJGdW5jPWRhdGEuZnVuYztpZihvdGhlckZ1bmM9PW51bGx8fG90aGVyRnVuYz09ZnVuYylyZXR1cm4gZGF0YS5uYW1lfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gZ2V0SG9sZGVyKGZ1bmMpe3ZhciBvYmplY3Q9aGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gsInBsYWNlaG9sZGVyIik/bG9kYXNoOmZ1bmM7cmV0dXJuIG9iamVjdC5wbGFjZWhvbGRlcn1mdW5jdGlvbiBnZXRJdGVyYXRlZSgpe3ZhciByZXN1bHQ9bG9kYXNoLml0ZXJhdGVlfHxpdGVyYXRlZTtyZXN1bHQ9cmVzdWx0PT09aXRlcmF0ZWU/YmFzZUl0ZXJhdGVlOnJlc3VsdDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8KcmVzdWx0KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOnJlc3VsdH1mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCxrZXkpe3ZhciBkYXRhPW1hcC5fX2RhdGFfXztyZXR1cm4gaXNLZXlhYmxlKGtleSk/ZGF0YVt0eXBlb2Yga2V5PT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOmRhdGEubWFwfWZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3Qpe3ZhciByZXN1bHQ9a2V5cyhvYmplY3QpLGxlbmd0aD1yZXN1bHQubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXt2YXIga2V5PXJlc3VsdFtsZW5ndGhdLHZhbHVlPW9iamVjdFtrZXldO3Jlc3VsdFtsZW5ndGhdPVtrZXksdmFsdWUsaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LGtleSl7dmFyIHZhbHVlPWdldFZhbHVlKG9iamVjdCxrZXkpO3JldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpP3ZhbHVlOnVuZGVmaW5lZH1mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpe3ZhciBpc093bj0KaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxzeW1Ub1N0cmluZ1RhZyksdGFnPXZhbHVlW3N5bVRvU3RyaW5nVGFnXTt0cnl7dmFsdWVbc3ltVG9TdHJpbmdUYWddPXVuZGVmaW5lZDt2YXIgdW5tYXNrZWQ9dHJ1ZX1jYXRjaChlKXt9dmFyIHJlc3VsdD1uYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtpZih1bm1hc2tlZClpZihpc093bil2YWx1ZVtzeW1Ub1N0cmluZ1RhZ109dGFnO2Vsc2UgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtyZXR1cm4gcmVzdWx0fXZhciBnZXRTeW1ib2xzPSFuYXRpdmVHZXRTeW1ib2xzP3N0dWJBcnJheTpmdW5jdGlvbihvYmplY3Qpe2lmKG9iamVjdD09bnVsbClyZXR1cm5bXTtvYmplY3Q9T2JqZWN0KG9iamVjdCk7cmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSxmdW5jdGlvbihzeW1ib2wpe3JldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCxzeW1ib2wpfSl9O3ZhciBnZXRTeW1ib2xzSW49CiFuYXRpdmVHZXRTeW1ib2xzP3N0dWJBcnJheTpmdW5jdGlvbihvYmplY3Qpe3ZhciByZXN1bHQ9W107d2hpbGUob2JqZWN0KXthcnJheVB1c2gocmVzdWx0LGdldFN5bWJvbHMob2JqZWN0KSk7b2JqZWN0PWdldFByb3RvdHlwZShvYmplY3QpfXJldHVybiByZXN1bHR9O3ZhciBnZXRUYWc9YmFzZUdldFRhZztpZihEYXRhVmlldyYmZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSE9ZGF0YVZpZXdUYWd8fE1hcCYmZ2V0VGFnKG5ldyBNYXApIT1tYXBUYWd8fFByb21pc2UmJmdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkhPXByb21pc2VUYWd8fFNldCYmZ2V0VGFnKG5ldyBTZXQpIT1zZXRUYWd8fFdlYWtNYXAmJmdldFRhZyhuZXcgV2Vha01hcCkhPXdlYWtNYXBUYWcpZ2V0VGFnPWZ1bmN0aW9uKHZhbHVlKXt2YXIgcmVzdWx0PWJhc2VHZXRUYWcodmFsdWUpLEN0b3I9cmVzdWx0PT1vYmplY3RUYWc/dmFsdWUuY29uc3RydWN0b3I6dW5kZWZpbmVkLGN0b3JTdHJpbmc9CkN0b3I/dG9Tb3VyY2UoQ3Rvcik6IiI7aWYoY3RvclN0cmluZylzd2l0Y2goY3RvclN0cmluZyl7Y2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6cmV0dXJuIGRhdGFWaWV3VGFnO2Nhc2UgbWFwQ3RvclN0cmluZzpyZXR1cm4gbWFwVGFnO2Nhc2UgcHJvbWlzZUN0b3JTdHJpbmc6cmV0dXJuIHByb21pc2VUYWc7Y2FzZSBzZXRDdG9yU3RyaW5nOnJldHVybiBzZXRUYWc7Y2FzZSB3ZWFrTWFwQ3RvclN0cmluZzpyZXR1cm4gd2Vha01hcFRhZ31yZXR1cm4gcmVzdWx0fTtmdW5jdGlvbiBnZXRWaWV3KHN0YXJ0LGVuZCx0cmFuc2Zvcm1zKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXRyYW5zZm9ybXMubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZGF0YT10cmFuc2Zvcm1zW2luZGV4XSxzaXplPWRhdGEuc2l6ZTtzd2l0Y2goZGF0YS50eXBlKXtjYXNlICJkcm9wIjpzdGFydCs9c2l6ZTticmVhaztjYXNlICJkcm9wUmlnaHQiOmVuZC09c2l6ZTticmVhaztjYXNlICJ0YWtlIjplbmQ9bmF0aXZlTWluKGVuZCwKc3RhcnQrc2l6ZSk7YnJlYWs7Y2FzZSAidGFrZVJpZ2h0IjpzdGFydD1uYXRpdmVNYXgoc3RhcnQsZW5kLXNpemUpO2JyZWFrfX1yZXR1cm57InN0YXJ0IjpzdGFydCwiZW5kIjplbmR9fWZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSl7dmFyIG1hdGNoPXNvdXJjZS5tYXRjaChyZVdyYXBEZXRhaWxzKTtyZXR1cm4gbWF0Y2g/bWF0Y2hbMV0uc3BsaXQocmVTcGxpdERldGFpbHMpOltdfWZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LHBhdGgsaGFzRnVuYyl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRoLmxlbmd0aCxyZXN1bHQ9ZmFsc2U7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9dG9LZXkocGF0aFtpbmRleF0pO2lmKCEocmVzdWx0PW9iamVjdCE9bnVsbCYmaGFzRnVuYyhvYmplY3Qsa2V5KSkpYnJlYWs7b2JqZWN0PW9iamVjdFtrZXldfWlmKHJlc3VsdHx8KytpbmRleCE9bGVuZ3RoKXJldHVybiByZXN1bHQ7bGVuZ3RoPQpvYmplY3Q9PW51bGw/MDpvYmplY3QubGVuZ3RoO3JldHVybiEhbGVuZ3RoJiZpc0xlbmd0aChsZW5ndGgpJiZpc0luZGV4KGtleSxsZW5ndGgpJiYoaXNBcnJheShvYmplY3QpfHxpc0FyZ3VtZW50cyhvYmplY3QpKX1mdW5jdGlvbiBpbml0Q2xvbmVBcnJheShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGgscmVzdWx0PW5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO2lmKGxlbmd0aCYmdHlwZW9mIGFycmF5WzBdPT0ic3RyaW5nIiYmaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwiaW5kZXgiKSl7cmVzdWx0LmluZGV4PWFycmF5LmluZGV4O3Jlc3VsdC5pbnB1dD1hcnJheS5pbnB1dH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3Qpe3JldHVybiB0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yPT0iZnVuY3Rpb24iJiYhaXNQcm90b3R5cGUob2JqZWN0KT9iYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKTp7fX1mdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsCnRhZyxpc0RlZXApe3ZhciBDdG9yPW9iamVjdC5jb25zdHJ1Y3Rvcjtzd2l0Y2godGFnKXtjYXNlIGFycmF5QnVmZmVyVGFnOnJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7Y2FzZSBib29sVGFnOmNhc2UgZGF0ZVRhZzpyZXR1cm4gbmV3IEN0b3IoK29iamVjdCk7Y2FzZSBkYXRhVmlld1RhZzpyZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsaXNEZWVwKTtjYXNlIGZsb2F0MzJUYWc6Y2FzZSBmbG9hdDY0VGFnOmNhc2UgaW50OFRhZzpjYXNlIGludDE2VGFnOmNhc2UgaW50MzJUYWc6Y2FzZSB1aW50OFRhZzpjYXNlIHVpbnQ4Q2xhbXBlZFRhZzpjYXNlIHVpbnQxNlRhZzpjYXNlIHVpbnQzMlRhZzpyZXR1cm4gY2xvbmVUeXBlZEFycmF5KG9iamVjdCxpc0RlZXApO2Nhc2UgbWFwVGFnOnJldHVybiBuZXcgQ3RvcjtjYXNlIG51bWJlclRhZzpjYXNlIHN0cmluZ1RhZzpyZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTtjYXNlIHJlZ2V4cFRhZzpyZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTsKY2FzZSBzZXRUYWc6cmV0dXJuIG5ldyBDdG9yO2Nhc2Ugc3ltYm9sVGFnOnJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpfX1mdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsZGV0YWlscyl7dmFyIGxlbmd0aD1kZXRhaWxzLmxlbmd0aDtpZighbGVuZ3RoKXJldHVybiBzb3VyY2U7dmFyIGxhc3RJbmRleD1sZW5ndGgtMTtkZXRhaWxzW2xhc3RJbmRleF09KGxlbmd0aD4xPyJceDI2ICI6IiIpK2RldGFpbHNbbGFzdEluZGV4XTtkZXRhaWxzPWRldGFpbHMuam9pbihsZW5ndGg+Mj8iLCAiOiIgIik7cmV0dXJuIHNvdXJjZS5yZXBsYWNlKHJlV3JhcENvbW1lbnQsIntcbi8qIFt3cmFwcGVkIHdpdGggIitkZXRhaWxzKyJdICovXG4iKX1mdW5jdGlvbiBpc0ZsYXR0ZW5hYmxlKHZhbHVlKXtyZXR1cm4gaXNBcnJheSh2YWx1ZSl8fGlzQXJndW1lbnRzKHZhbHVlKXx8ISEoc3ByZWFkYWJsZVN5bWJvbCYmdmFsdWUmJnZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKX1mdW5jdGlvbiBpc0luZGV4KHZhbHVlLApsZW5ndGgpe3ZhciB0eXBlPXR5cGVvZiB2YWx1ZTtsZW5ndGg9bGVuZ3RoPT1udWxsP01BWF9TQUZFX0lOVEVHRVI6bGVuZ3RoO3JldHVybiEhbGVuZ3RoJiYodHlwZT09Im51bWJlciJ8fHR5cGUhPSJzeW1ib2wiJiZyZUlzVWludC50ZXN0KHZhbHVlKSkmJih2YWx1ZT4tMSYmdmFsdWUlMT09MCYmdmFsdWU8bGVuZ3RoKX1mdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSxpbmRleCxvYmplY3Qpe2lmKCFpc09iamVjdChvYmplY3QpKXJldHVybiBmYWxzZTt2YXIgdHlwZT10eXBlb2YgaW5kZXg7aWYodHlwZT09Im51bWJlciI/aXNBcnJheUxpa2Uob2JqZWN0KSYmaXNJbmRleChpbmRleCxvYmplY3QubGVuZ3RoKTp0eXBlPT0ic3RyaW5nIiYmaW5kZXggaW4gb2JqZWN0KXJldHVybiBlcShvYmplY3RbaW5kZXhdLHZhbHVlKTtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gaXNLZXkodmFsdWUsb2JqZWN0KXtpZihpc0FycmF5KHZhbHVlKSlyZXR1cm4gZmFsc2U7dmFyIHR5cGU9dHlwZW9mIHZhbHVlOwppZih0eXBlPT0ibnVtYmVyInx8dHlwZT09InN5bWJvbCJ8fHR5cGU9PSJib29sZWFuInx8dmFsdWU9PW51bGx8fGlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKXx8IXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKXx8b2JqZWN0IT1udWxsJiZ2YWx1ZSBpbiBPYmplY3Qob2JqZWN0KX1mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpe3ZhciB0eXBlPXR5cGVvZiB2YWx1ZTtyZXR1cm4gdHlwZT09InN0cmluZyJ8fHR5cGU9PSJudW1iZXIifHx0eXBlPT0ic3ltYm9sInx8dHlwZT09ImJvb2xlYW4iP3ZhbHVlIT09Il9fcHJvdG9fXyI6dmFsdWU9PT1udWxsfWZ1bmN0aW9uIGlzTGF6aWFibGUoZnVuYyl7dmFyIGZ1bmNOYW1lPWdldEZ1bmNOYW1lKGZ1bmMpLG90aGVyPWxvZGFzaFtmdW5jTmFtZV07aWYodHlwZW9mIG90aGVyIT0iZnVuY3Rpb24ifHwhKGZ1bmNOYW1lIGluIExhenlXcmFwcGVyLnByb3RvdHlwZSkpcmV0dXJuIGZhbHNlOwppZihmdW5jPT09b3RoZXIpcmV0dXJuIHRydWU7dmFyIGRhdGE9Z2V0RGF0YShvdGhlcik7cmV0dXJuISFkYXRhJiZmdW5jPT09ZGF0YVswXX1mdW5jdGlvbiBpc01hc2tlZChmdW5jKXtyZXR1cm4hIW1hc2tTcmNLZXkmJm1hc2tTcmNLZXkgaW4gZnVuY312YXIgaXNNYXNrYWJsZT1jb3JlSnNEYXRhP2lzRnVuY3Rpb246c3R1YkZhbHNlO2Z1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKXt2YXIgQ3Rvcj12YWx1ZSYmdmFsdWUuY29uc3RydWN0b3IscHJvdG89dHlwZW9mIEN0b3I9PSJmdW5jdGlvbiImJkN0b3IucHJvdG90eXBlfHxvYmplY3RQcm90bztyZXR1cm4gdmFsdWU9PT1wcm90b31mdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpe3JldHVybiB2YWx1ZT09PXZhbHVlJiYhaXNPYmplY3QodmFsdWUpfWZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKGtleSxzcmNWYWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7aWYob2JqZWN0PT1udWxsKXJldHVybiBmYWxzZTsKcmV0dXJuIG9iamVjdFtrZXldPT09c3JjVmFsdWUmJihzcmNWYWx1ZSE9PXVuZGVmaW5lZHx8a2V5IGluIE9iamVjdChvYmplY3QpKX19ZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKXt2YXIgcmVzdWx0PW1lbW9pemUoZnVuYyxmdW5jdGlvbihrZXkpe2lmKGNhY2hlLnNpemU9PT1NQVhfTUVNT0laRV9TSVpFKWNhY2hlLmNsZWFyKCk7cmV0dXJuIGtleX0pO3ZhciBjYWNoZT1yZXN1bHQuY2FjaGU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtZXJnZURhdGEoZGF0YSxzb3VyY2Upe3ZhciBiaXRtYXNrPWRhdGFbMV0sc3JjQml0bWFzaz1zb3VyY2VbMV0sbmV3Qml0bWFzaz1iaXRtYXNrfHNyY0JpdG1hc2ssaXNDb21tb249bmV3Qml0bWFzazwoV1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHfFdSQVBfQVJZX0ZMQUcpO3ZhciBpc0NvbWJvPXNyY0JpdG1hc2s9PVdSQVBfQVJZX0ZMQUcmJmJpdG1hc2s9PVdSQVBfQ1VSUllfRkxBR3x8c3JjQml0bWFzaz09V1JBUF9BUllfRkxBRyYmCmJpdG1hc2s9PVdSQVBfUkVBUkdfRkxBRyYmZGF0YVs3XS5sZW5ndGg8PXNvdXJjZVs4XXx8c3JjQml0bWFzaz09KFdSQVBfQVJZX0ZMQUd8V1JBUF9SRUFSR19GTEFHKSYmc291cmNlWzddLmxlbmd0aDw9c291cmNlWzhdJiZiaXRtYXNrPT1XUkFQX0NVUlJZX0ZMQUc7aWYoIShpc0NvbW1vbnx8aXNDb21ibykpcmV0dXJuIGRhdGE7aWYoc3JjQml0bWFzayZXUkFQX0JJTkRfRkxBRyl7ZGF0YVsyXT1zb3VyY2VbMl07bmV3Qml0bWFza3w9Yml0bWFzayZXUkFQX0JJTkRfRkxBRz8wOldSQVBfQ1VSUllfQk9VTkRfRkxBR312YXIgdmFsdWU9c291cmNlWzNdO2lmKHZhbHVlKXt2YXIgcGFydGlhbHM9ZGF0YVszXTtkYXRhWzNdPXBhcnRpYWxzP2NvbXBvc2VBcmdzKHBhcnRpYWxzLHZhbHVlLHNvdXJjZVs0XSk6dmFsdWU7ZGF0YVs0XT1wYXJ0aWFscz9yZXBsYWNlSG9sZGVycyhkYXRhWzNdLFBMQUNFSE9MREVSKTpzb3VyY2VbNF19dmFsdWU9c291cmNlWzVdO2lmKHZhbHVlKXtwYXJ0aWFscz0KZGF0YVs1XTtkYXRhWzVdPXBhcnRpYWxzP2NvbXBvc2VBcmdzUmlnaHQocGFydGlhbHMsdmFsdWUsc291cmNlWzZdKTp2YWx1ZTtkYXRhWzZdPXBhcnRpYWxzP3JlcGxhY2VIb2xkZXJzKGRhdGFbNV0sUExBQ0VIT0xERVIpOnNvdXJjZVs2XX12YWx1ZT1zb3VyY2VbN107aWYodmFsdWUpZGF0YVs3XT12YWx1ZTtpZihzcmNCaXRtYXNrJldSQVBfQVJZX0ZMQUcpZGF0YVs4XT1kYXRhWzhdPT1udWxsP3NvdXJjZVs4XTpuYXRpdmVNaW4oZGF0YVs4XSxzb3VyY2VbOF0pO2lmKGRhdGFbOV09PW51bGwpZGF0YVs5XT1zb3VyY2VbOV07ZGF0YVswXT1zb3VyY2VbMF07ZGF0YVsxXT1uZXdCaXRtYXNrO3JldHVybiBkYXRhfWZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3Qpe3ZhciByZXN1bHQ9W107aWYob2JqZWN0IT1udWxsKWZvcih2YXIga2V5IGluIE9iamVjdChvYmplY3QpKXJlc3VsdC5wdXNoKGtleSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSl7cmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpfQpmdW5jdGlvbiBvdmVyUmVzdChmdW5jLHN0YXJ0LHRyYW5zZm9ybSl7c3RhcnQ9bmF0aXZlTWF4KHN0YXJ0PT09dW5kZWZpbmVkP2Z1bmMubGVuZ3RoLTE6c3RhcnQsMCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzLGluZGV4PS0xLGxlbmd0aD1uYXRpdmVNYXgoYXJncy5sZW5ndGgtc3RhcnQsMCksYXJyYXk9QXJyYXkobGVuZ3RoKTt3aGlsZSgrK2luZGV4PGxlbmd0aClhcnJheVtpbmRleF09YXJnc1tzdGFydCtpbmRleF07aW5kZXg9LTE7dmFyIG90aGVyQXJncz1BcnJheShzdGFydCsxKTt3aGlsZSgrK2luZGV4PHN0YXJ0KW90aGVyQXJnc1tpbmRleF09YXJnc1tpbmRleF07b3RoZXJBcmdzW3N0YXJ0XT10cmFuc2Zvcm0oYXJyYXkpO3JldHVybiBhcHBseShmdW5jLHRoaXMsb3RoZXJBcmdzKX19ZnVuY3Rpb24gcGFyZW50KG9iamVjdCxwYXRoKXtyZXR1cm4gcGF0aC5sZW5ndGg8Mj9vYmplY3Q6YmFzZUdldChvYmplY3QsYmFzZVNsaWNlKHBhdGgsMCwtMSkpfQpmdW5jdGlvbiByZW9yZGVyKGFycmF5LGluZGV4ZXMpe3ZhciBhcnJMZW5ndGg9YXJyYXkubGVuZ3RoLGxlbmd0aD1uYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsYXJyTGVuZ3RoKSxvbGRBcnJheT1jb3B5QXJyYXkoYXJyYXkpO3doaWxlKGxlbmd0aC0tKXt2YXIgaW5kZXg9aW5kZXhlc1tsZW5ndGhdO2FycmF5W2xlbmd0aF09aXNJbmRleChpbmRleCxhcnJMZW5ndGgpP29sZEFycmF5W2luZGV4XTp1bmRlZmluZWR9cmV0dXJuIGFycmF5fXZhciBzZXREYXRhPXNob3J0T3V0KGJhc2VTZXREYXRhKTt2YXIgc2V0VGltZW91dD1jdHhTZXRUaW1lb3V0fHxmdW5jdGlvbihmdW5jLHdhaXQpe3JldHVybiByb290LnNldFRpbWVvdXQoZnVuYyx3YWl0KX07dmFyIHNldFRvU3RyaW5nPXNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7ZnVuY3Rpb24gc2V0V3JhcFRvU3RyaW5nKHdyYXBwZXIscmVmZXJlbmNlLGJpdG1hc2spe3ZhciBzb3VyY2U9cmVmZXJlbmNlKyIiO3JldHVybiBzZXRUb1N0cmluZyh3cmFwcGVyLAppbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsdXBkYXRlV3JhcERldGFpbHMoZ2V0V3JhcERldGFpbHMoc291cmNlKSxiaXRtYXNrKSkpfWZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpe3ZhciBjb3VudD0wLGxhc3RDYWxsZWQ9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgc3RhbXA9bmF0aXZlTm93KCkscmVtYWluaW5nPUhPVF9TUEFOLShzdGFtcC1sYXN0Q2FsbGVkKTtsYXN0Q2FsbGVkPXN0YW1wO2lmKHJlbWFpbmluZz4wKXtpZigrK2NvdW50Pj1IT1RfQ09VTlQpcmV0dXJuIGFyZ3VtZW50c1swXX1lbHNlIGNvdW50PTA7cmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHNodWZmbGVTZWxmKGFycmF5LHNpemUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoLGxhc3RJbmRleD1sZW5ndGgtMTtzaXplPXNpemU9PT11bmRlZmluZWQ/bGVuZ3RoOnNpemU7d2hpbGUoKytpbmRleDxzaXplKXt2YXIgcmFuZD1iYXNlUmFuZG9tKGluZGV4LGxhc3RJbmRleCksCnZhbHVlPWFycmF5W3JhbmRdO2FycmF5W3JhbmRdPWFycmF5W2luZGV4XTthcnJheVtpbmRleF09dmFsdWV9YXJyYXkubGVuZ3RoPXNpemU7cmV0dXJuIGFycmF5fXZhciBzdHJpbmdUb1BhdGg9bWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpe3ZhciByZXN1bHQ9W107aWYoc3RyaW5nLmNoYXJDb2RlQXQoMCk9PT00NilyZXN1bHQucHVzaCgiIik7c3RyaW5nLnJlcGxhY2UocmVQcm9wTmFtZSxmdW5jdGlvbihtYXRjaCxudW1iZXIscXVvdGUsc3ViU3RyaW5nKXtyZXN1bHQucHVzaChxdW90ZT9zdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsIiQxIik6bnVtYmVyfHxtYXRjaCl9KTtyZXR1cm4gcmVzdWx0fSk7ZnVuY3Rpb24gdG9LZXkodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyJ8fGlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gdmFsdWU7dmFyIHJlc3VsdD12YWx1ZSsiIjtyZXR1cm4gcmVzdWx0PT0iMCImJjEvdmFsdWU9PS1JTkZJTklUWT8iLTAiOnJlc3VsdH0KZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYyl7aWYoZnVuYyE9bnVsbCl7dHJ5e3JldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKX1jYXRjaChlKXt9dHJ5e3JldHVybiBmdW5jKyIifWNhdGNoKGUkMCl7fX1yZXR1cm4iIn1mdW5jdGlvbiB1cGRhdGVXcmFwRGV0YWlscyhkZXRhaWxzLGJpdG1hc2spe2FycmF5RWFjaCh3cmFwRmxhZ3MsZnVuY3Rpb24ocGFpcil7dmFyIHZhbHVlPSJfLiIrcGFpclswXTtpZihiaXRtYXNrJnBhaXJbMV0mJiFhcnJheUluY2x1ZGVzKGRldGFpbHMsdmFsdWUpKWRldGFpbHMucHVzaCh2YWx1ZSl9KTtyZXR1cm4gZGV0YWlscy5zb3J0KCl9ZnVuY3Rpb24gd3JhcHBlckNsb25lKHdyYXBwZXIpe2lmKHdyYXBwZXIgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcilyZXR1cm4gd3JhcHBlci5jbG9uZSgpO3ZhciByZXN1bHQ9bmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXyx3cmFwcGVyLl9fY2hhaW5fXyk7cmVzdWx0Ll9fYWN0aW9uc19fPWNvcHlBcnJheSh3cmFwcGVyLl9fYWN0aW9uc19fKTsKcmVzdWx0Ll9faW5kZXhfXz13cmFwcGVyLl9faW5kZXhfXztyZXN1bHQuX192YWx1ZXNfXz13cmFwcGVyLl9fdmFsdWVzX187cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjaHVuayhhcnJheSxzaXplLGd1YXJkKXtpZihndWFyZD9pc0l0ZXJhdGVlQ2FsbChhcnJheSxzaXplLGd1YXJkKTpzaXplPT09dW5kZWZpbmVkKXNpemU9MTtlbHNlIHNpemU9bmF0aXZlTWF4KHRvSW50ZWdlcihzaXplKSwwKTt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGh8fHNpemU8MSlyZXR1cm5bXTt2YXIgaW5kZXg9MCxyZXNJbmRleD0wLHJlc3VsdD1BcnJheShuYXRpdmVDZWlsKGxlbmd0aC9zaXplKSk7d2hpbGUoaW5kZXg8bGVuZ3RoKXJlc3VsdFtyZXNJbmRleCsrXT1iYXNlU2xpY2UoYXJyYXksaW5kZXgsaW5kZXgrPXNpemUpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY29tcGFjdChhcnJheSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCwKcmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYodmFsdWUpcmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY29uY2F0KCl7dmFyIGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107dmFyIGFyZ3M9QXJyYXkobGVuZ3RoLTEpLGFycmF5PWFyZ3VtZW50c1swXSxpbmRleD1sZW5ndGg7d2hpbGUoaW5kZXgtLSlhcmdzW2luZGV4LTFdPWFyZ3VtZW50c1tpbmRleF07cmV0dXJuIGFycmF5UHVzaChpc0FycmF5KGFycmF5KT9jb3B5QXJyYXkoYXJyYXkpOlthcnJheV0sYmFzZUZsYXR0ZW4oYXJncywxKSl9dmFyIGRpZmZlcmVuY2U9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LGJhc2VGbGF0dGVuKHZhbHVlcywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpKToKW119KTt2YXIgZGlmZmVyZW5jZUJ5PWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LHZhbHVlcyl7dmFyIGl0ZXJhdGVlPWxhc3QodmFsdWVzKTtpZihpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpaXRlcmF0ZWU9dW5kZWZpbmVkO3JldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSk/YmFzZURpZmZlcmVuY2UoYXJyYXksYmFzZUZsYXR0ZW4odmFsdWVzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdfSk7dmFyIGRpZmZlcmVuY2VXaXRoPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LHZhbHVlcyl7dmFyIGNvbXBhcmF0b3I9bGFzdCh2YWx1ZXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGNvbXBhcmF0b3IpKWNvbXBhcmF0b3I9dW5kZWZpbmVkO3JldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSk/YmFzZURpZmZlcmVuY2UoYXJyYXksYmFzZUZsYXR0ZW4odmFsdWVzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSksdW5kZWZpbmVkLGNvbXBhcmF0b3IpOgpbXX0pO2Z1bmN0aW9uIGRyb3AoYXJyYXksbixndWFyZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO249Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7cmV0dXJuIGJhc2VTbGljZShhcnJheSxuPDA/MDpuLGxlbmd0aCl9ZnVuY3Rpb24gZHJvcFJpZ2h0KGFycmF5LG4sZ3VhcmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO249bGVuZ3RoLW47cmV0dXJuIGJhc2VTbGljZShhcnJheSwwLG48MD8wOm4pfWZ1bmN0aW9uIGRyb3BSaWdodFdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVdoaWxlKGFycmF5LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSx0cnVlLHRydWUpOltdfWZ1bmN0aW9uIGRyb3BXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmCmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLHRydWUpOltdfWZ1bmN0aW9uIGZpbGwoYXJyYXksdmFsdWUsc3RhcnQsZW5kKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107aWYoc3RhcnQmJnR5cGVvZiBzdGFydCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKGFycmF5LHZhbHVlLHN0YXJ0KSl7c3RhcnQ9MDtlbmQ9bGVuZ3RofXJldHVybiBiYXNlRmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpfWZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSxwcmVkaWNhdGUsZnJvbUluZGV4KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuLTE7dmFyIGluZGV4PWZyb21JbmRleD09bnVsbD8wOnRvSW50ZWdlcihmcm9tSW5kZXgpO2lmKGluZGV4PDApaW5kZXg9bmF0aXZlTWF4KGxlbmd0aCtpbmRleCwwKTtyZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwKZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGluZGV4KX1mdW5jdGlvbiBmaW5kTGFzdEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9bGVuZ3RoLTE7aWYoZnJvbUluZGV4IT09dW5kZWZpbmVkKXtpbmRleD10b0ludGVnZXIoZnJvbUluZGV4KTtpbmRleD1mcm9tSW5kZXg8MD9uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApOm5hdGl2ZU1pbihpbmRleCxsZW5ndGgtMSl9cmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGluZGV4LHRydWUpfWZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlRmxhdHRlbihhcnJheSwxKTpbXX1mdW5jdGlvbiBmbGF0dGVuRGVlcChhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDsKcmV0dXJuIGxlbmd0aD9iYXNlRmxhdHRlbihhcnJheSxJTkZJTklUWSk6W119ZnVuY3Rpb24gZmxhdHRlbkRlcHRoKGFycmF5LGRlcHRoKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107ZGVwdGg9ZGVwdGg9PT11bmRlZmluZWQ/MTp0b0ludGVnZXIoZGVwdGgpO3JldHVybiBiYXNlRmxhdHRlbihhcnJheSxkZXB0aCl9ZnVuY3Rpb24gZnJvbVBhaXJzKHBhaXJzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhaXJzPT1udWxsPzA6cGFpcnMubGVuZ3RoLHJlc3VsdD17fTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHBhaXI9cGFpcnNbaW5kZXhdO3Jlc3VsdFtwYWlyWzBdXT1wYWlyWzFdfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gaGVhZChhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YXJyYXlbMF06dW5kZWZpbmVkfWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgbGVuZ3RoPWFycmF5PT0KbnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1mcm9tSW5kZXg9PW51bGw/MDp0b0ludGVnZXIoZnJvbUluZGV4KTtpZihpbmRleDwwKWluZGV4PW5hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk7cmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LHZhbHVlLGluZGV4KX1mdW5jdGlvbiBpbml0aWFsKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YmFzZVNsaWNlKGFycmF5LDAsLTEpOltdfXZhciBpbnRlcnNlY3Rpb249YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgbWFwcGVkPWFycmF5TWFwKGFycmF5cyxjYXN0QXJyYXlMaWtlT2JqZWN0KTtyZXR1cm4gbWFwcGVkLmxlbmd0aCYmbWFwcGVkWzBdPT09YXJyYXlzWzBdP2Jhc2VJbnRlcnNlY3Rpb24obWFwcGVkKTpbXX0pO3ZhciBpbnRlcnNlY3Rpb25CeT1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBpdGVyYXRlZT1sYXN0KGFycmF5cyksCm1hcHBlZD1hcnJheU1hcChhcnJheXMsY2FzdEFycmF5TGlrZU9iamVjdCk7aWYoaXRlcmF0ZWU9PT1sYXN0KG1hcHBlZCkpaXRlcmF0ZWU9dW5kZWZpbmVkO2Vsc2UgbWFwcGVkLnBvcCgpO3JldHVybiBtYXBwZWQubGVuZ3RoJiZtYXBwZWRbMF09PT1hcnJheXNbMF0/YmFzZUludGVyc2VjdGlvbihtYXBwZWQsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdfSk7dmFyIGludGVyc2VjdGlvbldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyksbWFwcGVkPWFycmF5TWFwKGFycmF5cyxjYXN0QXJyYXlMaWtlT2JqZWN0KTtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO2lmKGNvbXBhcmF0b3IpbWFwcGVkLnBvcCgpO3JldHVybiBtYXBwZWQubGVuZ3RoJiZtYXBwZWRbMF09PT1hcnJheXNbMF0/YmFzZUludGVyc2VjdGlvbihtYXBwZWQsdW5kZWZpbmVkLGNvbXBhcmF0b3IpOgpbXX0pO2Z1bmN0aW9uIGpvaW4oYXJyYXksc2VwYXJhdG9yKXtyZXR1cm4gYXJyYXk9PW51bGw/IiI6bmF0aXZlSm9pbi5jYWxsKGFycmF5LHNlcGFyYXRvcil9ZnVuY3Rpb24gbGFzdChhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2FycmF5W2xlbmd0aC0xXTp1bmRlZmluZWR9ZnVuY3Rpb24gbGFzdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuLTE7dmFyIGluZGV4PWxlbmd0aDtpZihmcm9tSW5kZXghPT11bmRlZmluZWQpe2luZGV4PXRvSW50ZWdlcihmcm9tSW5kZXgpO2luZGV4PWluZGV4PDA/bmF0aXZlTWF4KGxlbmd0aCtpbmRleCwwKTpuYXRpdmVNaW4oaW5kZXgsbGVuZ3RoLTEpfXJldHVybiB2YWx1ZT09PXZhbHVlP3N0cmljdExhc3RJbmRleE9mKGFycmF5LHZhbHVlLGluZGV4KTpiYXNlRmluZEluZGV4KGFycmF5LApiYXNlSXNOYU4saW5kZXgsdHJ1ZSl9ZnVuY3Rpb24gbnRoKGFycmF5LG4pe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VOdGgoYXJyYXksdG9JbnRlZ2VyKG4pKTp1bmRlZmluZWR9dmFyIHB1bGw9YmFzZVJlc3QocHVsbEFsbCk7ZnVuY3Rpb24gcHVsbEFsbChhcnJheSx2YWx1ZXMpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoJiZ2YWx1ZXMmJnZhbHVlcy5sZW5ndGg/YmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzKTphcnJheX1mdW5jdGlvbiBwdWxsQWxsQnkoYXJyYXksdmFsdWVzLGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aCYmdmFsdWVzJiZ2YWx1ZXMubGVuZ3RoP2Jhc2VQdWxsQWxsKGFycmF5LHZhbHVlcyxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6YXJyYXl9ZnVuY3Rpb24gcHVsbEFsbFdpdGgoYXJyYXksdmFsdWVzLGNvbXBhcmF0b3Ipe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoJiZ2YWx1ZXMmJnZhbHVlcy5sZW5ndGg/YmFzZVB1bGxBbGwoYXJyYXksCnZhbHVlcyx1bmRlZmluZWQsY29tcGFyYXRvcik6YXJyYXl9dmFyIHB1bGxBdD1mbGF0UmVzdChmdW5jdGlvbihhcnJheSxpbmRleGVzKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHJlc3VsdD1iYXNlQXQoYXJyYXksaW5kZXhlcyk7YmFzZVB1bGxBdChhcnJheSxhcnJheU1hcChpbmRleGVzLGZ1bmN0aW9uKGluZGV4KXtyZXR1cm4gaXNJbmRleChpbmRleCxsZW5ndGgpPytpbmRleDppbmRleH0pLnNvcnQoY29tcGFyZUFzY2VuZGluZykpO3JldHVybiByZXN1bHR9KTtmdW5jdGlvbiByZW1vdmUoYXJyYXkscHJlZGljYXRlKXt2YXIgcmVzdWx0PVtdO2lmKCEoYXJyYXkmJmFycmF5Lmxlbmd0aCkpcmV0dXJuIHJlc3VsdDt2YXIgaW5kZXg9LTEsaW5kZXhlcz1bXSxsZW5ndGg9YXJyYXkubGVuZ3RoO3ByZWRpY2F0ZT1nZXRJdGVyYXRlZShwcmVkaWNhdGUsMyk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYocHJlZGljYXRlKHZhbHVlLAppbmRleCxhcnJheSkpe3Jlc3VsdC5wdXNoKHZhbHVlKTtpbmRleGVzLnB1c2goaW5kZXgpfX1iYXNlUHVsbEF0KGFycmF5LGluZGV4ZXMpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gcmV2ZXJzZShhcnJheSl7cmV0dXJuIGFycmF5PT1udWxsP2FycmF5Om5hdGl2ZVJldmVyc2UuY2FsbChhcnJheSl9ZnVuY3Rpb24gc2xpY2UoYXJyYXksc3RhcnQsZW5kKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107aWYoZW5kJiZ0eXBlb2YgZW5kIT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoYXJyYXksc3RhcnQsZW5kKSl7c3RhcnQ9MDtlbmQ9bGVuZ3RofWVsc2V7c3RhcnQ9c3RhcnQ9PW51bGw/MDp0b0ludGVnZXIoc3RhcnQpO2VuZD1lbmQ9PT11bmRlZmluZWQ/bGVuZ3RoOnRvSW50ZWdlcihlbmQpfXJldHVybiBiYXNlU2xpY2UoYXJyYXksc3RhcnQsZW5kKX1mdW5jdGlvbiBzb3J0ZWRJbmRleChhcnJheSx2YWx1ZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwKdmFsdWUpfWZ1bmN0aW9uIHNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSl9ZnVuY3Rpb24gc29ydGVkSW5kZXhPZihhcnJheSx2YWx1ZSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZihsZW5ndGgpe3ZhciBpbmRleD1iYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUpO2lmKGluZGV4PGxlbmd0aCYmZXEoYXJyYXlbaW5kZXhdLHZhbHVlKSlyZXR1cm4gaW5kZXh9cmV0dXJuLTF9ZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4KGFycmF5LHZhbHVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlLHRydWUpfWZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleEJ5KGFycmF5LHZhbHVlLGl0ZXJhdGVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksdHJ1ZSl9ZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4T2YoYXJyYXksCnZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGxlbmd0aCl7dmFyIGluZGV4PWJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSx0cnVlKS0xO2lmKGVxKGFycmF5W2luZGV4XSx2YWx1ZSkpcmV0dXJuIGluZGV4fXJldHVybi0xfWZ1bmN0aW9uIHNvcnRlZFVuaXEoYXJyYXkpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VTb3J0ZWRVbmlxKGFycmF5KTpbXX1mdW5jdGlvbiBzb3J0ZWRVbmlxQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VTb3J0ZWRVbmlxKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX1mdW5jdGlvbiB0YWlsKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YmFzZVNsaWNlKGFycmF5LDEsbGVuZ3RoKTpbXX1mdW5jdGlvbiB0YWtlKGFycmF5LG4sZ3VhcmQpe2lmKCEoYXJyYXkmJmFycmF5Lmxlbmd0aCkpcmV0dXJuW107Cm49Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7cmV0dXJuIGJhc2VTbGljZShhcnJheSwwLG48MD8wOm4pfWZ1bmN0aW9uIHRha2VSaWdodChhcnJheSxuLGd1YXJkKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtuPWxlbmd0aC1uO3JldHVybiBiYXNlU2xpY2UoYXJyYXksbjwwPzA6bixsZW5ndGgpfWZ1bmN0aW9uIHRha2VSaWdodFdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVdoaWxlKGFycmF5LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxmYWxzZSx0cnVlKTpbXX1mdW5jdGlvbiB0YWtlV2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKTpbXX12YXIgdW5pb249YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXtyZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLAoxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpKX0pO3ZhciB1bmlvbkJ5PWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGl0ZXJhdGVlPWxhc3QoYXJyYXlzKTtpZihpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpaXRlcmF0ZWU9dW5kZWZpbmVkO3JldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSl9KTt2YXIgdW5pb25XaXRoPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGNvbXBhcmF0b3I9bGFzdChhcnJheXMpO2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PSJmdW5jdGlvbiI/Y29tcGFyYXRvcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLHVuZGVmaW5lZCxjb21wYXJhdG9yKX0pO2Z1bmN0aW9uIHVuaXEoYXJyYXkpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5KToKW119ZnVuY3Rpb24gdW5pcUJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlVW5pcShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119ZnVuY3Rpb24gdW5pcVdpdGgoYXJyYXksY29tcGFyYXRvcil7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlVW5pcShhcnJheSx1bmRlZmluZWQsY29tcGFyYXRvcik6W119ZnVuY3Rpb24gdW56aXAoYXJyYXkpe2lmKCEoYXJyYXkmJmFycmF5Lmxlbmd0aCkpcmV0dXJuW107dmFyIGxlbmd0aD0wO2FycmF5PWFycmF5RmlsdGVyKGFycmF5LGZ1bmN0aW9uKGdyb3VwKXtpZihpc0FycmF5TGlrZU9iamVjdChncm91cCkpe2xlbmd0aD1uYXRpdmVNYXgoZ3JvdXAubGVuZ3RoLGxlbmd0aCk7cmV0dXJuIHRydWV9fSk7cmV0dXJuIGJhc2VUaW1lcyhsZW5ndGgsZnVuY3Rpb24oaW5kZXgpe3JldHVybiBhcnJheU1hcChhcnJheSwKYmFzZVByb3BlcnR5KGluZGV4KSl9KX1mdW5jdGlvbiB1bnppcFdpdGgoYXJyYXksaXRlcmF0ZWUpe2lmKCEoYXJyYXkmJmFycmF5Lmxlbmd0aCkpcmV0dXJuW107dmFyIHJlc3VsdD11bnppcChhcnJheSk7aWYoaXRlcmF0ZWU9PW51bGwpcmV0dXJuIHJlc3VsdDtyZXR1cm4gYXJyYXlNYXAocmVzdWx0LGZ1bmN0aW9uKGdyb3VwKXtyZXR1cm4gYXBwbHkoaXRlcmF0ZWUsdW5kZWZpbmVkLGdyb3VwKX0pfXZhciB3aXRob3V0PWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LHZhbHVlcyl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSx2YWx1ZXMpOltdfSk7dmFyIHhvcj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3JldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cyxpc0FycmF5TGlrZU9iamVjdCkpfSk7dmFyIHhvckJ5PWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGl0ZXJhdGVlPWxhc3QoYXJyYXlzKTtpZihpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpaXRlcmF0ZWU9CnVuZGVmaW5lZDtyZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsaXNBcnJheUxpa2VPYmplY3QpLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX0pO3ZhciB4b3JXaXRoPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGNvbXBhcmF0b3I9bGFzdChhcnJheXMpO2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PSJmdW5jdGlvbiI/Y29tcGFyYXRvcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLGlzQXJyYXlMaWtlT2JqZWN0KSx1bmRlZmluZWQsY29tcGFyYXRvcil9KTt2YXIgemlwPWJhc2VSZXN0KHVuemlwKTtmdW5jdGlvbiB6aXBPYmplY3QocHJvcHMsdmFsdWVzKXtyZXR1cm4gYmFzZVppcE9iamVjdChwcm9wc3x8W10sdmFsdWVzfHxbXSxhc3NpZ25WYWx1ZSl9ZnVuY3Rpb24gemlwT2JqZWN0RGVlcChwcm9wcyx2YWx1ZXMpe3JldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzfHxbXSx2YWx1ZXN8fFtdLGJhc2VTZXQpfXZhciB6aXBXaXRoPQpiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBsZW5ndGg9YXJyYXlzLmxlbmd0aCxpdGVyYXRlZT1sZW5ndGg+MT9hcnJheXNbbGVuZ3RoLTFdOnVuZGVmaW5lZDtpdGVyYXRlZT10eXBlb2YgaXRlcmF0ZWU9PSJmdW5jdGlvbiI/KGFycmF5cy5wb3AoKSxpdGVyYXRlZSk6dW5kZWZpbmVkO3JldHVybiB1bnppcFdpdGgoYXJyYXlzLGl0ZXJhdGVlKX0pO2Z1bmN0aW9uIGNoYWluKHZhbHVlKXt2YXIgcmVzdWx0PWxvZGFzaCh2YWx1ZSk7cmVzdWx0Ll9fY2hhaW5fXz10cnVlO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdGFwKHZhbHVlLGludGVyY2VwdG9yKXtpbnRlcmNlcHRvcih2YWx1ZSk7cmV0dXJuIHZhbHVlfWZ1bmN0aW9uIHRocnUodmFsdWUsaW50ZXJjZXB0b3Ipe3JldHVybiBpbnRlcmNlcHRvcih2YWx1ZSl9dmFyIHdyYXBwZXJBdD1mbGF0UmVzdChmdW5jdGlvbihwYXRocyl7dmFyIGxlbmd0aD1wYXRocy5sZW5ndGgsc3RhcnQ9bGVuZ3RoP3BhdGhzWzBdOjAsdmFsdWU9CnRoaXMuX193cmFwcGVkX18saW50ZXJjZXB0b3I9ZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gYmFzZUF0KG9iamVjdCxwYXRocyl9O2lmKGxlbmd0aD4xfHx0aGlzLl9fYWN0aW9uc19fLmxlbmd0aHx8ISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKXx8IWlzSW5kZXgoc3RhcnQpKXJldHVybiB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO3ZhbHVlPXZhbHVlLnNsaWNlKHN0YXJ0LCtzdGFydCsobGVuZ3RoPzE6MCkpO3ZhbHVlLl9fYWN0aW9uc19fLnB1c2goeyJmdW5jIjp0aHJ1LCJhcmdzIjpbaW50ZXJjZXB0b3JdLCJ0aGlzQXJnIjp1bmRlZmluZWR9KTtyZXR1cm4obmV3IExvZGFzaFdyYXBwZXIodmFsdWUsdGhpcy5fX2NoYWluX18pKS50aHJ1KGZ1bmN0aW9uKGFycmF5KXtpZihsZW5ndGgmJiFhcnJheS5sZW5ndGgpYXJyYXkucHVzaCh1bmRlZmluZWQpO3JldHVybiBhcnJheX0pfSk7ZnVuY3Rpb24gd3JhcHBlckNoYWluKCl7cmV0dXJuIGNoYWluKHRoaXMpfWZ1bmN0aW9uIHdyYXBwZXJDb21taXQoKXtyZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodGhpcy52YWx1ZSgpLAp0aGlzLl9fY2hhaW5fXyl9ZnVuY3Rpb24gd3JhcHBlck5leHQoKXtpZih0aGlzLl9fdmFsdWVzX189PT11bmRlZmluZWQpdGhpcy5fX3ZhbHVlc19fPXRvQXJyYXkodGhpcy52YWx1ZSgpKTt2YXIgZG9uZT10aGlzLl9faW5kZXhfXz49dGhpcy5fX3ZhbHVlc19fLmxlbmd0aCx2YWx1ZT1kb25lP3VuZGVmaW5lZDp0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK107cmV0dXJueyJkb25lIjpkb25lLCJ2YWx1ZSI6dmFsdWV9fWZ1bmN0aW9uIHdyYXBwZXJUb0l0ZXJhdG9yKCl7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gd3JhcHBlclBsYW50KHZhbHVlKXt2YXIgcmVzdWx0LHBhcmVudD10aGlzO3doaWxlKHBhcmVudCBpbnN0YW5jZW9mIGJhc2VMb2Rhc2gpe3ZhciBjbG9uZT13cmFwcGVyQ2xvbmUocGFyZW50KTtjbG9uZS5fX2luZGV4X189MDtjbG9uZS5fX3ZhbHVlc19fPXVuZGVmaW5lZDtpZihyZXN1bHQpcHJldmlvdXMuX193cmFwcGVkX189Y2xvbmU7ZWxzZSByZXN1bHQ9Y2xvbmU7CnZhciBwcmV2aW91cz1jbG9uZTtwYXJlbnQ9cGFyZW50Ll9fd3JhcHBlZF9ffXByZXZpb3VzLl9fd3JhcHBlZF9fPXZhbHVlO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gd3JhcHBlclJldmVyc2UoKXt2YXIgdmFsdWU9dGhpcy5fX3dyYXBwZWRfXztpZih2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKXt2YXIgd3JhcHBlZD12YWx1ZTtpZih0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCl3cmFwcGVkPW5ldyBMYXp5V3JhcHBlcih0aGlzKTt3cmFwcGVkPXdyYXBwZWQucmV2ZXJzZSgpO3dyYXBwZWQuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltyZXZlcnNlXSwidGhpc0FyZyI6dW5kZWZpbmVkfSk7cmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZWQsdGhpcy5fX2NoYWluX18pfXJldHVybiB0aGlzLnRocnUocmV2ZXJzZSl9ZnVuY3Rpb24gd3JhcHBlclZhbHVlKCl7cmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUodGhpcy5fX3dyYXBwZWRfXyx0aGlzLl9fYWN0aW9uc19fKX0KdmFyIGNvdW50Qnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsa2V5KXtpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCxrZXkpKSsrcmVzdWx0W2tleV07ZWxzZSBiYXNlQXNzaWduVmFsdWUocmVzdWx0LGtleSwxKX0pO2Z1bmN0aW9uIGV2ZXJ5KGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5RXZlcnk6YmFzZUV2ZXJ5O2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCkpcHJlZGljYXRlPXVuZGVmaW5lZDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSl9ZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5RmlsdGVyOmJhc2VGaWx0ZXI7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpfXZhciBmaW5kPQpjcmVhdGVGaW5kKGZpbmRJbmRleCk7dmFyIGZpbmRMYXN0PWNyZWF0ZUZpbmQoZmluZExhc3RJbmRleCk7ZnVuY3Rpb24gZmxhdE1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKXtyZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpLDEpfWZ1bmN0aW9uIGZsYXRNYXBEZWVwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3JldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbixpdGVyYXRlZSksSU5GSU5JVFkpfWZ1bmN0aW9uIGZsYXRNYXBEZXB0aChjb2xsZWN0aW9uLGl0ZXJhdGVlLGRlcHRoKXtkZXB0aD1kZXB0aD09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihkZXB0aCk7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSxkZXB0aCl9ZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLGl0ZXJhdGVlKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5RWFjaDpiYXNlRWFjaDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLAozKSl9ZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFYWNoUmlnaHQ6YmFzZUVhY2hSaWdodDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX12YXIgZ3JvdXBCeT1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LGtleSkpcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7ZWxzZSBiYXNlQXNzaWduVmFsdWUocmVzdWx0LGtleSxbdmFsdWVdKX0pO2Z1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sdmFsdWUsZnJvbUluZGV4LGd1YXJkKXtjb2xsZWN0aW9uPWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pP2NvbGxlY3Rpb246dmFsdWVzKGNvbGxlY3Rpb24pO2Zyb21JbmRleD1mcm9tSW5kZXgmJiFndWFyZD90b0ludGVnZXIoZnJvbUluZGV4KTowO3ZhciBsZW5ndGg9Y29sbGVjdGlvbi5sZW5ndGg7CmlmKGZyb21JbmRleDwwKWZyb21JbmRleD1uYXRpdmVNYXgobGVuZ3RoK2Zyb21JbmRleCwwKTtyZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbik/ZnJvbUluZGV4PD1sZW5ndGgmJmNvbGxlY3Rpb24uaW5kZXhPZih2YWx1ZSxmcm9tSW5kZXgpPi0xOiEhbGVuZ3RoJiZiYXNlSW5kZXhPZihjb2xsZWN0aW9uLHZhbHVlLGZyb21JbmRleCk+LTF9dmFyIGludm9rZU1hcD1iYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLHBhdGgsYXJncyl7dmFyIGluZGV4PS0xLGlzRnVuYz10eXBlb2YgcGF0aD09ImZ1bmN0aW9uIixyZXN1bHQ9aXNBcnJheUxpa2UoY29sbGVjdGlvbik/QXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpOltdO2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUpe3Jlc3VsdFsrK2luZGV4XT1pc0Z1bmM/YXBwbHkocGF0aCx2YWx1ZSxhcmdzKTpiYXNlSW52b2tlKHZhbHVlLHBhdGgsYXJncyl9KTtyZXR1cm4gcmVzdWx0fSk7dmFyIGtleUJ5PWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LAp2YWx1ZSxrZXkpe2Jhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LHZhbHVlKX0pO2Z1bmN0aW9uIG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5TWFwOmJhc2VNYXA7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSl9ZnVuY3Rpb24gb3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMsZ3VhcmQpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuW107aWYoIWlzQXJyYXkoaXRlcmF0ZWVzKSlpdGVyYXRlZXM9aXRlcmF0ZWVzPT1udWxsP1tdOltpdGVyYXRlZXNdO29yZGVycz1ndWFyZD91bmRlZmluZWQ6b3JkZXJzO2lmKCFpc0FycmF5KG9yZGVycykpb3JkZXJzPW9yZGVycz09bnVsbD9bXTpbb3JkZXJzXTtyZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbixpdGVyYXRlZXMsb3JkZXJzKX12YXIgcGFydGl0aW9uPWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLAprZXkpe3Jlc3VsdFtrZXk/MDoxXS5wdXNoKHZhbHVlKX0sZnVuY3Rpb24oKXtyZXR1cm5bW10sW11dfSk7ZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlSZWR1Y2U6YmFzZVJlZHVjZSxpbml0QWNjdW09YXJndW1lbnRzLmxlbmd0aDwzO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsNCksYWNjdW11bGF0b3IsaW5pdEFjY3VtLGJhc2VFYWNoKX1mdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5UmVkdWNlUmlnaHQ6YmFzZVJlZHVjZSxpbml0QWNjdW09YXJndW1lbnRzLmxlbmd0aDwzO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsNCksYWNjdW11bGF0b3IsaW5pdEFjY3VtLGJhc2VFYWNoUmlnaHQpfWZ1bmN0aW9uIHJlamVjdChjb2xsZWN0aW9uLApwcmVkaWNhdGUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlGaWx0ZXI6YmFzZUZpbHRlcjtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpKX1mdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNhbXBsZTpiYXNlU2FtcGxlO3JldHVybiBmdW5jKGNvbGxlY3Rpb24pfWZ1bmN0aW9uIHNhbXBsZVNpemUoY29sbGVjdGlvbixuLGd1YXJkKXtpZihndWFyZD9pc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLG4sZ3VhcmQpOm49PT11bmRlZmluZWQpbj0xO2Vsc2Ugbj10b0ludGVnZXIobik7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNhbXBsZVNpemU6YmFzZVNhbXBsZVNpemU7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixuKX1mdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTaHVmZmxlOgpiYXNlU2h1ZmZsZTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uKX1mdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuIDA7aWYoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pP3N0cmluZ1NpemUoY29sbGVjdGlvbik6Y29sbGVjdGlvbi5sZW5ndGg7dmFyIHRhZz1nZXRUYWcoY29sbGVjdGlvbik7aWYodGFnPT1tYXBUYWd8fHRhZz09c2V0VGFnKXJldHVybiBjb2xsZWN0aW9uLnNpemU7cmV0dXJuIGJhc2VLZXlzKGNvbGxlY3Rpb24pLmxlbmd0aH1mdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U29tZTpiYXNlU29tZTtpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpKXByZWRpY2F0ZT11bmRlZmluZWQ7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShwcmVkaWNhdGUsCjMpKX12YXIgc29ydEJ5PWJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWVzKXtpZihjb2xsZWN0aW9uPT1udWxsKXJldHVybltdO3ZhciBsZW5ndGg9aXRlcmF0ZWVzLmxlbmd0aDtpZihsZW5ndGg+MSYmaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbixpdGVyYXRlZXNbMF0saXRlcmF0ZWVzWzFdKSlpdGVyYXRlZXM9W107ZWxzZSBpZihsZW5ndGg+MiYmaXNJdGVyYXRlZUNhbGwoaXRlcmF0ZWVzWzBdLGl0ZXJhdGVlc1sxXSxpdGVyYXRlZXNbMl0pKWl0ZXJhdGVlcz1baXRlcmF0ZWVzWzBdXTtyZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbixiYXNlRmxhdHRlbihpdGVyYXRlZXMsMSksW10pfSk7dmFyIG5vdz1jdHhOb3d8fGZ1bmN0aW9uKCl7cmV0dXJuIHJvb3QuRGF0ZS5ub3coKX07ZnVuY3Rpb24gYWZ0ZXIobixmdW5jKXtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7bj10b0ludGVnZXIobik7CnJldHVybiBmdW5jdGlvbigpe2lmKC0tbjwxKXJldHVybiBmdW5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gYXJ5KGZ1bmMsbixndWFyZCl7bj1ndWFyZD91bmRlZmluZWQ6bjtuPWZ1bmMmJm49PW51bGw/ZnVuYy5sZW5ndGg6bjtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfQVJZX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLG4pfWZ1bmN0aW9uIGJlZm9yZShuLGZ1bmMpe3ZhciByZXN1bHQ7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO249dG9JbnRlZ2VyKG4pO3JldHVybiBmdW5jdGlvbigpe2lmKC0tbj4wKXJlc3VsdD1mdW5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihuPD0xKWZ1bmM9dW5kZWZpbmVkO3JldHVybiByZXN1bHR9fXZhciBiaW5kPWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsdGhpc0FyZyxwYXJ0aWFscyl7dmFyIGJpdG1hc2s9V1JBUF9CSU5EX0ZMQUc7CmlmKHBhcnRpYWxzLmxlbmd0aCl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKGJpbmQpKTtiaXRtYXNrfD1XUkFQX1BBUlRJQUxfRkxBR31yZXR1cm4gY3JlYXRlV3JhcChmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzKX0pO3ZhciBiaW5kS2V5PWJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxrZXkscGFydGlhbHMpe3ZhciBiaXRtYXNrPVdSQVBfQklORF9GTEFHfFdSQVBfQklORF9LRVlfRkxBRztpZihwYXJ0aWFscy5sZW5ndGgpe3ZhciBob2xkZXJzPXJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLGdldEhvbGRlcihiaW5kS2V5KSk7Yml0bWFza3w9V1JBUF9QQVJUSUFMX0ZMQUd9cmV0dXJuIGNyZWF0ZVdyYXAoa2V5LGJpdG1hc2ssb2JqZWN0LHBhcnRpYWxzLGhvbGRlcnMpfSk7ZnVuY3Rpb24gY3VycnkoZnVuYyxhcml0eSxndWFyZCl7YXJpdHk9Z3VhcmQ/dW5kZWZpbmVkOmFyaXR5O3ZhciByZXN1bHQ9Y3JlYXRlV3JhcChmdW5jLApXUkFQX0NVUlJZX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxhcml0eSk7cmVzdWx0LnBsYWNlaG9sZGVyPWN1cnJ5LnBsYWNlaG9sZGVyO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY3VycnlSaWdodChmdW5jLGFyaXR5LGd1YXJkKXthcml0eT1ndWFyZD91bmRlZmluZWQ6YXJpdHk7dmFyIHJlc3VsdD1jcmVhdGVXcmFwKGZ1bmMsV1JBUF9DVVJSWV9SSUdIVF9GTEFHLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsYXJpdHkpO3Jlc3VsdC5wbGFjZWhvbGRlcj1jdXJyeVJpZ2h0LnBsYWNlaG9sZGVyO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gZGVib3VuY2UoZnVuYyx3YWl0LG9wdGlvbnMpe3ZhciBsYXN0QXJncyxsYXN0VGhpcyxtYXhXYWl0LHJlc3VsdCx0aW1lcklkLGxhc3RDYWxsVGltZSxsYXN0SW52b2tlVGltZT0wLGxlYWRpbmc9ZmFsc2UsbWF4aW5nPWZhbHNlLHRyYWlsaW5nPXRydWU7CmlmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt3YWl0PXRvTnVtYmVyKHdhaXQpfHwwO2lmKGlzT2JqZWN0KG9wdGlvbnMpKXtsZWFkaW5nPSEhb3B0aW9ucy5sZWFkaW5nO21heGluZz0ibWF4V2FpdCJpbiBvcHRpb25zO21heFdhaXQ9bWF4aW5nP25hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpfHwwLHdhaXQpOm1heFdhaXQ7dHJhaWxpbmc9InRyYWlsaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLnRyYWlsaW5nOnRyYWlsaW5nfWZ1bmN0aW9uIGludm9rZUZ1bmModGltZSl7dmFyIGFyZ3M9bGFzdEFyZ3MsdGhpc0FyZz1sYXN0VGhpcztsYXN0QXJncz1sYXN0VGhpcz11bmRlZmluZWQ7bGFzdEludm9rZVRpbWU9dGltZTtyZXN1bHQ9ZnVuYy5hcHBseSh0aGlzQXJnLGFyZ3MpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSl7bGFzdEludm9rZVRpbWU9dGltZTt0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLAp3YWl0KTtyZXR1cm4gbGVhZGluZz9pbnZva2VGdW5jKHRpbWUpOnJlc3VsdH1mdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpe3ZhciB0aW1lU2luY2VMYXN0Q2FsbD10aW1lLWxhc3RDYWxsVGltZSx0aW1lU2luY2VMYXN0SW52b2tlPXRpbWUtbGFzdEludm9rZVRpbWUsdGltZVdhaXRpbmc9d2FpdC10aW1lU2luY2VMYXN0Q2FsbDtyZXR1cm4gbWF4aW5nP25hdGl2ZU1pbih0aW1lV2FpdGluZyxtYXhXYWl0LXRpbWVTaW5jZUxhc3RJbnZva2UpOnRpbWVXYWl0aW5nfWZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKXt2YXIgdGltZVNpbmNlTGFzdENhbGw9dGltZS1sYXN0Q2FsbFRpbWUsdGltZVNpbmNlTGFzdEludm9rZT10aW1lLWxhc3RJbnZva2VUaW1lO3JldHVybiBsYXN0Q2FsbFRpbWU9PT11bmRlZmluZWR8fHRpbWVTaW5jZUxhc3RDYWxsPj13YWl0fHx0aW1lU2luY2VMYXN0Q2FsbDwwfHxtYXhpbmcmJnRpbWVTaW5jZUxhc3RJbnZva2U+PW1heFdhaXR9ZnVuY3Rpb24gdGltZXJFeHBpcmVkKCl7dmFyIHRpbWU9Cm5vdygpO2lmKHNob3VsZEludm9rZSh0aW1lKSlyZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO3RpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQscmVtYWluaW5nV2FpdCh0aW1lKSl9ZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpe3RpbWVySWQ9dW5kZWZpbmVkO2lmKHRyYWlsaW5nJiZsYXN0QXJncylyZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtsYXN0QXJncz1sYXN0VGhpcz11bmRlZmluZWQ7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjYW5jZWwoKXtpZih0aW1lcklkIT09dW5kZWZpbmVkKWNsZWFyVGltZW91dCh0aW1lcklkKTtsYXN0SW52b2tlVGltZT0wO2xhc3RBcmdzPWxhc3RDYWxsVGltZT1sYXN0VGhpcz10aW1lcklkPXVuZGVmaW5lZH1mdW5jdGlvbiBmbHVzaCgpe3JldHVybiB0aW1lcklkPT09dW5kZWZpbmVkP3Jlc3VsdDp0cmFpbGluZ0VkZ2Uobm93KCkpfWZ1bmN0aW9uIGRlYm91bmNlZCgpe3ZhciB0aW1lPW5vdygpLGlzSW52b2tpbmc9c2hvdWxkSW52b2tlKHRpbWUpOwpsYXN0QXJncz1hcmd1bWVudHM7bGFzdFRoaXM9dGhpcztsYXN0Q2FsbFRpbWU9dGltZTtpZihpc0ludm9raW5nKXtpZih0aW1lcklkPT09dW5kZWZpbmVkKXJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO2lmKG1heGluZyl7dGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCx3YWl0KTtyZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpfX1pZih0aW1lcklkPT09dW5kZWZpbmVkKXRpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsd2FpdCk7cmV0dXJuIHJlc3VsdH1kZWJvdW5jZWQuY2FuY2VsPWNhbmNlbDtkZWJvdW5jZWQuZmx1c2g9Zmx1c2g7cmV0dXJuIGRlYm91bmNlZH12YXIgZGVmZXI9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyxhcmdzKXtyZXR1cm4gYmFzZURlbGF5KGZ1bmMsMSxhcmdzKX0pO3ZhciBkZWxheT1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHdhaXQsYXJncyl7cmV0dXJuIGJhc2VEZWxheShmdW5jLHRvTnVtYmVyKHdhaXQpfHwwLGFyZ3MpfSk7CmZ1bmN0aW9uIGZsaXAoZnVuYyl7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX0ZMSVBfRkxBRyl9ZnVuY3Rpb24gbWVtb2l6ZShmdW5jLHJlc29sdmVyKXtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uInx8cmVzb2x2ZXIhPW51bGwmJnR5cGVvZiByZXNvbHZlciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7dmFyIG1lbW9pemVkPWZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzLGtleT1yZXNvbHZlcj9yZXNvbHZlci5hcHBseSh0aGlzLGFyZ3MpOmFyZ3NbMF0sY2FjaGU9bWVtb2l6ZWQuY2FjaGU7aWYoY2FjaGUuaGFzKGtleSkpcmV0dXJuIGNhY2hlLmdldChrZXkpO3ZhciByZXN1bHQ9ZnVuYy5hcHBseSh0aGlzLGFyZ3MpO21lbW9pemVkLmNhY2hlPWNhY2hlLnNldChrZXkscmVzdWx0KXx8Y2FjaGU7cmV0dXJuIHJlc3VsdH07bWVtb2l6ZWQuY2FjaGU9bmV3IChtZW1vaXplLkNhY2hlfHxNYXBDYWNoZSk7cmV0dXJuIG1lbW9pemVkfQptZW1vaXplLkNhY2hlPU1hcENhY2hlO2Z1bmN0aW9uIG5lZ2F0ZShwcmVkaWNhdGUpe2lmKHR5cGVvZiBwcmVkaWNhdGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3JldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cztzd2l0Y2goYXJncy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4hcHJlZGljYXRlLmNhbGwodGhpcyk7Y2FzZSAxOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0pO2Nhc2UgMjpyZXR1cm4hcHJlZGljYXRlLmNhbGwodGhpcyxhcmdzWzBdLGFyZ3NbMV0pO2Nhc2UgMzpyZXR1cm4hcHJlZGljYXRlLmNhbGwodGhpcyxhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSl9cmV0dXJuIXByZWRpY2F0ZS5hcHBseSh0aGlzLGFyZ3MpfX1mdW5jdGlvbiBvbmNlKGZ1bmMpe3JldHVybiBiZWZvcmUoMixmdW5jKX12YXIgb3ZlckFyZ3M9Y2FzdFJlc3QoZnVuY3Rpb24oZnVuYyx0cmFuc2Zvcm1zKXt0cmFuc2Zvcm1zPXRyYW5zZm9ybXMubGVuZ3RoPT0KMSYmaXNBcnJheSh0cmFuc2Zvcm1zWzBdKT9hcnJheU1hcCh0cmFuc2Zvcm1zWzBdLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk6YXJyYXlNYXAoYmFzZUZsYXR0ZW4odHJhbnNmb3JtcywxKSxiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO3ZhciBmdW5jc0xlbmd0aD10cmFuc2Zvcm1zLmxlbmd0aDtyZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncyl7dmFyIGluZGV4PS0xLGxlbmd0aD1uYXRpdmVNaW4oYXJncy5sZW5ndGgsZnVuY3NMZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFyZ3NbaW5kZXhdPXRyYW5zZm9ybXNbaW5kZXhdLmNhbGwodGhpcyxhcmdzW2luZGV4XSk7cmV0dXJuIGFwcGx5KGZ1bmMsdGhpcyxhcmdzKX0pfSk7dmFyIHBhcnRpYWw9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyxwYXJ0aWFscyl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKHBhcnRpYWwpKTtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfUEFSVElBTF9GTEFHLAp1bmRlZmluZWQscGFydGlhbHMsaG9sZGVycyl9KTt2YXIgcGFydGlhbFJpZ2h0PWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMscGFydGlhbHMpe3ZhciBob2xkZXJzPXJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLGdldEhvbGRlcihwYXJ0aWFsUmlnaHQpKTtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHLHVuZGVmaW5lZCxwYXJ0aWFscyxob2xkZXJzKX0pO3ZhciByZWFyZz1mbGF0UmVzdChmdW5jdGlvbihmdW5jLGluZGV4ZXMpe3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9SRUFSR19GTEFHLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGluZGV4ZXMpfSk7ZnVuY3Rpb24gcmVzdChmdW5jLHN0YXJ0KXtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7c3RhcnQ9c3RhcnQ9PT11bmRlZmluZWQ/c3RhcnQ6dG9JbnRlZ2VyKHN0YXJ0KTtyZXR1cm4gYmFzZVJlc3QoZnVuYyxzdGFydCl9CmZ1bmN0aW9uIHNwcmVhZChmdW5jLHN0YXJ0KXtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7c3RhcnQ9c3RhcnQ9PW51bGw/MDpuYXRpdmVNYXgodG9JbnRlZ2VyKHN0YXJ0KSwwKTtyZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncyl7dmFyIGFycmF5PWFyZ3Nbc3RhcnRdLG90aGVyQXJncz1jYXN0U2xpY2UoYXJncywwLHN0YXJ0KTtpZihhcnJheSlhcnJheVB1c2gob3RoZXJBcmdzLGFycmF5KTtyZXR1cm4gYXBwbHkoZnVuYyx0aGlzLG90aGVyQXJncyl9KX1mdW5jdGlvbiB0aHJvdHRsZShmdW5jLHdhaXQsb3B0aW9ucyl7dmFyIGxlYWRpbmc9dHJ1ZSx0cmFpbGluZz10cnVlO2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtpZihpc09iamVjdChvcHRpb25zKSl7bGVhZGluZz0ibGVhZGluZyJpbiBvcHRpb25zPyEhb3B0aW9ucy5sZWFkaW5nOgpsZWFkaW5nO3RyYWlsaW5nPSJ0cmFpbGluZyJpbiBvcHRpb25zPyEhb3B0aW9ucy50cmFpbGluZzp0cmFpbGluZ31yZXR1cm4gZGVib3VuY2UoZnVuYyx3YWl0LHsibGVhZGluZyI6bGVhZGluZywibWF4V2FpdCI6d2FpdCwidHJhaWxpbmciOnRyYWlsaW5nfSl9ZnVuY3Rpb24gdW5hcnkoZnVuYyl7cmV0dXJuIGFyeShmdW5jLDEpfWZ1bmN0aW9uIHdyYXAodmFsdWUsd3JhcHBlcil7cmV0dXJuIHBhcnRpYWwoY2FzdEZ1bmN0aW9uKHdyYXBwZXIpLHZhbHVlKX1mdW5jdGlvbiBjYXN0QXJyYXkoKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bXTt2YXIgdmFsdWU9YXJndW1lbnRzWzBdO3JldHVybiBpc0FycmF5KHZhbHVlKT92YWx1ZTpbdmFsdWVdfWZ1bmN0aW9uIGNsb25lKHZhbHVlKXtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX1NZTUJPTFNfRkxBRyl9ZnVuY3Rpb24gY2xvbmVXaXRoKHZhbHVlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PQoiZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfU1lNQk9MU19GTEFHLGN1c3RvbWl6ZXIpfWZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSl7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9ERUVQX0ZMQUd8Q0xPTkVfU1lNQk9MU19GTEFHKX1mdW5jdGlvbiBjbG9uZURlZXBXaXRoKHZhbHVlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9ERUVQX0ZMQUd8Q0xPTkVfU1lNQk9MU19GTEFHLGN1c3RvbWl6ZXIpfWZ1bmN0aW9uIGNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSl7cmV0dXJuIHNvdXJjZT09bnVsbHx8YmFzZUNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSxrZXlzKHNvdXJjZSkpfWZ1bmN0aW9uIGVxKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU9PT1vdGhlcnx8dmFsdWUhPT12YWx1ZSYmCm90aGVyIT09b3RoZXJ9dmFyIGd0PWNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUd0KTt2YXIgZ3RlPWNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT49b3RoZXJ9KTt2YXIgaXNBcmd1bWVudHM9YmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/YmFzZUlzQXJndW1lbnRzOmZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwiY2FsbGVlIikmJiFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCJjYWxsZWUiKX07dmFyIGlzQXJyYXk9QXJyYXkuaXNBcnJheTt2YXIgaXNBcnJheUJ1ZmZlcj1ub2RlSXNBcnJheUJ1ZmZlcj9iYXNlVW5hcnkobm9kZUlzQXJyYXlCdWZmZXIpOmJhc2VJc0FycmF5QnVmZmVyO2Z1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKXtyZXR1cm4gdmFsdWUhPW51bGwmJmlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkmJgohaXNGdW5jdGlvbih2YWx1ZSl9ZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZpc0FycmF5TGlrZSh2YWx1ZSl9ZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKXtyZXR1cm4gdmFsdWU9PT10cnVlfHx2YWx1ZT09PWZhbHNlfHxpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09Ym9vbFRhZ312YXIgaXNCdWZmZXI9bmF0aXZlSXNCdWZmZXJ8fHN0dWJGYWxzZTt2YXIgaXNEYXRlPW5vZGVJc0RhdGU/YmFzZVVuYXJ5KG5vZGVJc0RhdGUpOmJhc2VJc0RhdGU7ZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmdmFsdWUubm9kZVR5cGU9PT0xJiYhaXNQbGFpbk9iamVjdCh2YWx1ZSl9ZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSl7aWYodmFsdWU9PW51bGwpcmV0dXJuIHRydWU7aWYoaXNBcnJheUxpa2UodmFsdWUpJiYoaXNBcnJheSh2YWx1ZSl8fHR5cGVvZiB2YWx1ZT09CiJzdHJpbmcifHx0eXBlb2YgdmFsdWUuc3BsaWNlPT0iZnVuY3Rpb24ifHxpc0J1ZmZlcih2YWx1ZSl8fGlzVHlwZWRBcnJheSh2YWx1ZSl8fGlzQXJndW1lbnRzKHZhbHVlKSkpcmV0dXJuIXZhbHVlLmxlbmd0aDt2YXIgdGFnPWdldFRhZyh2YWx1ZSk7aWYodGFnPT1tYXBUYWd8fHRhZz09c2V0VGFnKXJldHVybiF2YWx1ZS5zaXplO2lmKGlzUHJvdG90eXBlKHZhbHVlKSlyZXR1cm4hYmFzZUtleXModmFsdWUpLmxlbmd0aDtmb3IodmFyIGtleSBpbiB2YWx1ZSlpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLGtleSkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsb3RoZXIpe3JldHVybiBiYXNlSXNFcXVhbCh2YWx1ZSxvdGhlcil9ZnVuY3Rpb24gaXNFcXVhbFdpdGgodmFsdWUsb3RoZXIsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDt2YXIgcmVzdWx0PQpjdXN0b21pemVyP2N1c3RvbWl6ZXIodmFsdWUsb3RoZXIpOnVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0PT09dW5kZWZpbmVkP2Jhc2VJc0VxdWFsKHZhbHVlLG90aGVyLHVuZGVmaW5lZCxjdXN0b21pemVyKTohIXJlc3VsdH1mdW5jdGlvbiBpc0Vycm9yKHZhbHVlKXtpZighaXNPYmplY3RMaWtlKHZhbHVlKSlyZXR1cm4gZmFsc2U7dmFyIHRhZz1iYXNlR2V0VGFnKHZhbHVlKTtyZXR1cm4gdGFnPT1lcnJvclRhZ3x8dGFnPT1kb21FeGNUYWd8fHR5cGVvZiB2YWx1ZS5tZXNzYWdlPT0ic3RyaW5nIiYmdHlwZW9mIHZhbHVlLm5hbWU9PSJzdHJpbmciJiYhaXNQbGFpbk9iamVjdCh2YWx1ZSl9ZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJudW1iZXIiJiZuYXRpdmVJc0Zpbml0ZSh2YWx1ZSl9ZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSl7aWYoIWlzT2JqZWN0KHZhbHVlKSlyZXR1cm4gZmFsc2U7dmFyIHRhZz1iYXNlR2V0VGFnKHZhbHVlKTtyZXR1cm4gdGFnPT0KZnVuY1RhZ3x8dGFnPT1nZW5UYWd8fHRhZz09YXN5bmNUYWd8fHRhZz09cHJveHlUYWd9ZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0ibnVtYmVyIiYmdmFsdWU9PXRvSW50ZWdlcih2YWx1ZSl9ZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJudW1iZXIiJiZ2YWx1ZT4tMSYmdmFsdWUlMT09MCYmdmFsdWU8PU1BWF9TQUZFX0lOVEVHRVJ9ZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpe3ZhciB0eXBlPXR5cGVvZiB2YWx1ZTtyZXR1cm4gdmFsdWUhPW51bGwmJih0eXBlPT0ib2JqZWN0Inx8dHlwZT09ImZ1bmN0aW9uIil9ZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKXtyZXR1cm4gdmFsdWUhPW51bGwmJnR5cGVvZiB2YWx1ZT09Im9iamVjdCJ9dmFyIGlzTWFwPW5vZGVJc01hcD9iYXNlVW5hcnkobm9kZUlzTWFwKTpiYXNlSXNNYXA7ZnVuY3Rpb24gaXNNYXRjaChvYmplY3Qsc291cmNlKXtyZXR1cm4gb2JqZWN0PT09CnNvdXJjZXx8YmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxnZXRNYXRjaERhdGEoc291cmNlKSl9ZnVuY3Rpb24gaXNNYXRjaFdpdGgob2JqZWN0LHNvdXJjZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLGdldE1hdGNoRGF0YShzb3VyY2UpLGN1c3RvbWl6ZXIpfWZ1bmN0aW9uIGlzTmFOKHZhbHVlKXtyZXR1cm4gaXNOdW1iZXIodmFsdWUpJiZ2YWx1ZSE9K3ZhbHVlfWZ1bmN0aW9uIGlzTmF0aXZlKHZhbHVlKXtpZihpc01hc2thYmxlKHZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoQ09SRV9FUlJPUl9URVhUKTtyZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKX1mdW5jdGlvbiBpc051bGwodmFsdWUpe3JldHVybiB2YWx1ZT09PW51bGx9ZnVuY3Rpb24gaXNOaWwodmFsdWUpe3JldHVybiB2YWx1ZT09bnVsbH1mdW5jdGlvbiBpc051bWJlcih2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09CiJudW1iZXIifHxpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09bnVtYmVyVGFnfWZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpe2lmKCFpc09iamVjdExpa2UodmFsdWUpfHxiYXNlR2V0VGFnKHZhbHVlKSE9b2JqZWN0VGFnKXJldHVybiBmYWxzZTt2YXIgcHJvdG89Z2V0UHJvdG90eXBlKHZhbHVlKTtpZihwcm90bz09PW51bGwpcmV0dXJuIHRydWU7dmFyIEN0b3I9aGFzT3duUHJvcGVydHkuY2FsbChwcm90bywiY29uc3RydWN0b3IiKSYmcHJvdG8uY29uc3RydWN0b3I7cmV0dXJuIHR5cGVvZiBDdG9yPT0iZnVuY3Rpb24iJiZDdG9yIGluc3RhbmNlb2YgQ3RvciYmZnVuY1RvU3RyaW5nLmNhbGwoQ3Rvcik9PW9iamVjdEN0b3JTdHJpbmd9dmFyIGlzUmVnRXhwPW5vZGVJc1JlZ0V4cD9iYXNlVW5hcnkobm9kZUlzUmVnRXhwKTpiYXNlSXNSZWdFeHA7ZnVuY3Rpb24gaXNTYWZlSW50ZWdlcih2YWx1ZSl7cmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkmJnZhbHVlPj0KLU1BWF9TQUZFX0lOVEVHRVImJnZhbHVlPD1NQVhfU0FGRV9JTlRFR0VSfXZhciBpc1NldD1ub2RlSXNTZXQ/YmFzZVVuYXJ5KG5vZGVJc1NldCk6YmFzZUlzU2V0O2Z1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0ic3RyaW5nInx8IWlzQXJyYXkodmFsdWUpJiZpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09c3RyaW5nVGFnfWZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0ic3ltYm9sInx8aXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PXN5bWJvbFRhZ312YXIgaXNUeXBlZEFycmF5PW5vZGVJc1R5cGVkQXJyYXk/YmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpOmJhc2VJc1R5cGVkQXJyYXk7ZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpe3JldHVybiB2YWx1ZT09PXVuZGVmaW5lZH1mdW5jdGlvbiBpc1dlYWtNYXAodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiYKZ2V0VGFnKHZhbHVlKT09d2Vha01hcFRhZ31mdW5jdGlvbiBpc1dlYWtTZXQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09d2Vha1NldFRhZ312YXIgbHQ9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlTHQpO3ZhciBsdGU9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPD1vdGhlcn0pO2Z1bmN0aW9uIHRvQXJyYXkodmFsdWUpe2lmKCF2YWx1ZSlyZXR1cm5bXTtpZihpc0FycmF5TGlrZSh2YWx1ZSkpcmV0dXJuIGlzU3RyaW5nKHZhbHVlKT9zdHJpbmdUb0FycmF5KHZhbHVlKTpjb3B5QXJyYXkodmFsdWUpO2lmKHN5bUl0ZXJhdG9yJiZ2YWx1ZVtzeW1JdGVyYXRvcl0pcmV0dXJuIGl0ZXJhdG9yVG9BcnJheSh2YWx1ZVtzeW1JdGVyYXRvcl0oKSk7dmFyIHRhZz1nZXRUYWcodmFsdWUpLGZ1bmM9dGFnPT1tYXBUYWc/bWFwVG9BcnJheTp0YWc9PXNldFRhZz9zZXRUb0FycmF5Ogp2YWx1ZXM7cmV0dXJuIGZ1bmModmFsdWUpfWZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKXtpZighdmFsdWUpcmV0dXJuIHZhbHVlPT09MD92YWx1ZTowO3ZhbHVlPXRvTnVtYmVyKHZhbHVlKTtpZih2YWx1ZT09PUlORklOSVRZfHx2YWx1ZT09PS1JTkZJTklUWSl7dmFyIHNpZ249dmFsdWU8MD8tMToxO3JldHVybiBzaWduKk1BWF9JTlRFR0VSfXJldHVybiB2YWx1ZT09PXZhbHVlP3ZhbHVlOjB9ZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKXt2YXIgcmVzdWx0PXRvRmluaXRlKHZhbHVlKSxyZW1haW5kZXI9cmVzdWx0JTE7cmV0dXJuIHJlc3VsdD09PXJlc3VsdD9yZW1haW5kZXI/cmVzdWx0LXJlbWFpbmRlcjpyZXN1bHQ6MH1mdW5jdGlvbiB0b0xlbmd0aCh2YWx1ZSl7cmV0dXJuIHZhbHVlP2Jhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLDAsTUFYX0FSUkFZX0xFTkdUSCk6MH1mdW5jdGlvbiB0b051bWJlcih2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ibnVtYmVyIilyZXR1cm4gdmFsdWU7CmlmKGlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gTkFOO2lmKGlzT2JqZWN0KHZhbHVlKSl7dmFyIG90aGVyPXR5cGVvZiB2YWx1ZS52YWx1ZU9mPT0iZnVuY3Rpb24iP3ZhbHVlLnZhbHVlT2YoKTp2YWx1ZTt2YWx1ZT1pc09iamVjdChvdGhlcik/b3RoZXIrIiI6b3RoZXJ9aWYodHlwZW9mIHZhbHVlIT0ic3RyaW5nIilyZXR1cm4gdmFsdWU9PT0wP3ZhbHVlOit2YWx1ZTt2YWx1ZT12YWx1ZS5yZXBsYWNlKHJlVHJpbSwiIik7dmFyIGlzQmluYXJ5PXJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7cmV0dXJuIGlzQmluYXJ5fHxyZUlzT2N0YWwudGVzdCh2YWx1ZSk/ZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLGlzQmluYXJ5PzI6OCk6cmVJc0JhZEhleC50ZXN0KHZhbHVlKT9OQU46K3ZhbHVlfWZ1bmN0aW9uIHRvUGxhaW5PYmplY3QodmFsdWUpe3JldHVybiBjb3B5T2JqZWN0KHZhbHVlLGtleXNJbih2YWx1ZSkpfWZ1bmN0aW9uIHRvU2FmZUludGVnZXIodmFsdWUpe3JldHVybiB2YWx1ZT8KYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksLU1BWF9TQUZFX0lOVEVHRVIsTUFYX1NBRkVfSU5URUdFUik6dmFsdWU9PT0wP3ZhbHVlOjB9ZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpe3JldHVybiB2YWx1ZT09bnVsbD8iIjpiYXNlVG9TdHJpbmcodmFsdWUpfXZhciBhc3NpZ249Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSl7aWYoaXNQcm90b3R5cGUoc291cmNlKXx8aXNBcnJheUxpa2Uoc291cmNlKSl7Y29weU9iamVjdChzb3VyY2Usa2V5cyhzb3VyY2UpLG9iamVjdCk7cmV0dXJufWZvcih2YXIga2V5IGluIHNvdXJjZSlpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKWFzc2lnblZhbHVlKG9iamVjdCxrZXksc291cmNlW2tleV0pfSk7dmFyIGFzc2lnbkluPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Upe2NvcHlPYmplY3Qoc291cmNlLGtleXNJbihzb3VyY2UpLG9iamVjdCl9KTt2YXIgYXNzaWduSW5XaXRoPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwKc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIpe2NvcHlPYmplY3Qoc291cmNlLGtleXNJbihzb3VyY2UpLG9iamVjdCxjdXN0b21pemVyKX0pO3ZhciBhc3NpZ25XaXRoPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcil7Y29weU9iamVjdChzb3VyY2Usa2V5cyhzb3VyY2UpLG9iamVjdCxjdXN0b21pemVyKX0pO3ZhciBhdD1mbGF0UmVzdChiYXNlQXQpO2Z1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUscHJvcGVydGllcyl7dmFyIHJlc3VsdD1iYXNlQ3JlYXRlKHByb3RvdHlwZSk7cmV0dXJuIHByb3BlcnRpZXM9PW51bGw/cmVzdWx0OmJhc2VBc3NpZ24ocmVzdWx0LHByb3BlcnRpZXMpfXZhciBkZWZhdWx0cz1iYXNlUmVzdChmdW5jdGlvbihvYmplY3Qsc291cmNlcyl7b2JqZWN0PU9iamVjdChvYmplY3QpO3ZhciBpbmRleD0tMTt2YXIgbGVuZ3RoPXNvdXJjZXMubGVuZ3RoO3ZhciBndWFyZD1sZW5ndGg+Mj9zb3VyY2VzWzJdOgp1bmRlZmluZWQ7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sc291cmNlc1sxXSxndWFyZCkpbGVuZ3RoPTE7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBzb3VyY2U9c291cmNlc1tpbmRleF07dmFyIHByb3BzPWtleXNJbihzb3VyY2UpO3ZhciBwcm9wc0luZGV4PS0xO3ZhciBwcm9wc0xlbmd0aD1wcm9wcy5sZW5ndGg7d2hpbGUoKytwcm9wc0luZGV4PHByb3BzTGVuZ3RoKXt2YXIga2V5PXByb3BzW3Byb3BzSW5kZXhdO3ZhciB2YWx1ZT1vYmplY3Rba2V5XTtpZih2YWx1ZT09PXVuZGVmaW5lZHx8ZXEodmFsdWUsb2JqZWN0UHJvdG9ba2V5XSkmJiFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpKW9iamVjdFtrZXldPXNvdXJjZVtrZXldfX1yZXR1cm4gb2JqZWN0fSk7dmFyIGRlZmF1bHRzRGVlcD1iYXNlUmVzdChmdW5jdGlvbihhcmdzKXthcmdzLnB1c2godW5kZWZpbmVkLGN1c3RvbURlZmF1bHRzTWVyZ2UpO3JldHVybiBhcHBseShtZXJnZVdpdGgsCnVuZGVmaW5lZCxhcmdzKX0pO2Z1bmN0aW9uIGZpbmRLZXkob2JqZWN0LHByZWRpY2F0ZSl7cmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksYmFzZUZvck93bil9ZnVuY3Rpb24gZmluZExhc3RLZXkob2JqZWN0LHByZWRpY2F0ZSl7cmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksYmFzZUZvck93blJpZ2h0KX1mdW5jdGlvbiBmb3JJbihvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VGb3Iob2JqZWN0LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpLGtleXNJbil9ZnVuY3Rpb24gZm9ySW5SaWdodChvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VGb3JSaWdodChvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksa2V5c0luKX1mdW5jdGlvbiBmb3JPd24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yT3duKG9iamVjdCwKZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfWZ1bmN0aW9uIGZvck93blJpZ2h0KG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdCYmYmFzZUZvck93blJpZ2h0KG9iamVjdCxnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSl9ZnVuY3Rpb24gZnVuY3Rpb25zKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlRnVuY3Rpb25zKG9iamVjdCxrZXlzKG9iamVjdCkpfWZ1bmN0aW9uIGZ1bmN0aW9uc0luKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlRnVuY3Rpb25zKG9iamVjdCxrZXlzSW4ob2JqZWN0KSl9ZnVuY3Rpb24gZ2V0KG9iamVjdCxwYXRoLGRlZmF1bHRWYWx1ZSl7dmFyIHJlc3VsdD1vYmplY3Q9PW51bGw/dW5kZWZpbmVkOmJhc2VHZXQob2JqZWN0LHBhdGgpO3JldHVybiByZXN1bHQ9PT11bmRlZmluZWQ/ZGVmYXVsdFZhbHVlOnJlc3VsdH1mdW5jdGlvbiBoYXMob2JqZWN0LHBhdGgpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc1BhdGgob2JqZWN0LApwYXRoLGJhc2VIYXMpfWZ1bmN0aW9uIGhhc0luKG9iamVjdCxwYXRoKXtyZXR1cm4gb2JqZWN0IT1udWxsJiZoYXNQYXRoKG9iamVjdCxwYXRoLGJhc2VIYXNJbil9dmFyIGludmVydD1jcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsa2V5KXtpZih2YWx1ZSE9bnVsbCYmdHlwZW9mIHZhbHVlLnRvU3RyaW5nIT0iZnVuY3Rpb24iKXZhbHVlPW5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO3Jlc3VsdFt2YWx1ZV09a2V5fSxjb25zdGFudChpZGVudGl0eSkpO3ZhciBpbnZlcnRCeT1jcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsa2V5KXtpZih2YWx1ZSE9bnVsbCYmdHlwZW9mIHZhbHVlLnRvU3RyaW5nIT0iZnVuY3Rpb24iKXZhbHVlPW5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO2lmKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LHZhbHVlKSlyZXN1bHRbdmFsdWVdLnB1c2goa2V5KTtlbHNlIHJlc3VsdFt2YWx1ZV09W2tleV19LApnZXRJdGVyYXRlZSk7dmFyIGludm9rZT1iYXNlUmVzdChiYXNlSW52b2tlKTtmdW5jdGlvbiBrZXlzKG9iamVjdCl7cmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCk/YXJyYXlMaWtlS2V5cyhvYmplY3QpOmJhc2VLZXlzKG9iamVjdCl9ZnVuY3Rpb24ga2V5c0luKG9iamVjdCl7cmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCk/YXJyYXlMaWtlS2V5cyhvYmplY3QsdHJ1ZSk6YmFzZUtleXNJbihvYmplY3QpfWZ1bmN0aW9uIG1hcEtleXMob2JqZWN0LGl0ZXJhdGVlKXt2YXIgcmVzdWx0PXt9O2l0ZXJhdGVlPWdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpO2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe2Jhc2VBc3NpZ25WYWx1ZShyZXN1bHQsaXRlcmF0ZWUodmFsdWUsa2V5LG9iamVjdCksdmFsdWUpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LGl0ZXJhdGVlKXt2YXIgcmVzdWx0PXt9O2l0ZXJhdGVlPWdldEl0ZXJhdGVlKGl0ZXJhdGVlLAozKTtiYXNlRm9yT3duKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxrZXksb2JqZWN0KXtiYXNlQXNzaWduVmFsdWUocmVzdWx0LGtleSxpdGVyYXRlZSh2YWx1ZSxrZXksb2JqZWN0KSl9KTtyZXR1cm4gcmVzdWx0fXZhciBtZXJnZT1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlLHNyY0luZGV4KXtiYXNlTWVyZ2Uob2JqZWN0LHNvdXJjZSxzcmNJbmRleCl9KTt2YXIgbWVyZ2VXaXRoPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcil7YmFzZU1lcmdlKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcil9KTt2YXIgb21pdD1mbGF0UmVzdChmdW5jdGlvbihvYmplY3QscGF0aHMpe3ZhciByZXN1bHQ9e307aWYob2JqZWN0PT1udWxsKXJldHVybiByZXN1bHQ7dmFyIGlzRGVlcD1mYWxzZTtwYXRocz1hcnJheU1hcChwYXRocyxmdW5jdGlvbihwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTtpc0RlZXB8fAooaXNEZWVwPXBhdGgubGVuZ3RoPjEpO3JldHVybiBwYXRofSk7Y29weU9iamVjdChvYmplY3QsZ2V0QWxsS2V5c0luKG9iamVjdCkscmVzdWx0KTtpZihpc0RlZXApcmVzdWx0PWJhc2VDbG9uZShyZXN1bHQsQ0xPTkVfREVFUF9GTEFHfENMT05FX0ZMQVRfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9tT21pdENsb25lKTt2YXIgbGVuZ3RoPXBhdGhzLmxlbmd0aDt3aGlsZShsZW5ndGgtLSliYXNlVW5zZXQocmVzdWx0LHBhdGhzW2xlbmd0aF0pO3JldHVybiByZXN1bHR9KTtmdW5jdGlvbiBvbWl0Qnkob2JqZWN0LHByZWRpY2F0ZSl7cmV0dXJuIHBpY2tCeShvYmplY3QsbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKX12YXIgcGljaz1mbGF0UmVzdChmdW5jdGlvbihvYmplY3QscGF0aHMpe3JldHVybiBvYmplY3Q9PW51bGw/e306YmFzZVBpY2sob2JqZWN0LHBhdGhzKX0pO2Z1bmN0aW9uIHBpY2tCeShvYmplY3QscHJlZGljYXRlKXtpZihvYmplY3Q9PW51bGwpcmV0dXJue307CnZhciBwcm9wcz1hcnJheU1hcChnZXRBbGxLZXlzSW4ob2JqZWN0KSxmdW5jdGlvbihwcm9wKXtyZXR1cm5bcHJvcF19KTtwcmVkaWNhdGU9Z2V0SXRlcmF0ZWUocHJlZGljYXRlKTtyZXR1cm4gYmFzZVBpY2tCeShvYmplY3QscHJvcHMsZnVuY3Rpb24odmFsdWUscGF0aCl7cmV0dXJuIHByZWRpY2F0ZSh2YWx1ZSxwYXRoWzBdKX0pfWZ1bmN0aW9uIHJlc3VsdChvYmplY3QscGF0aCxkZWZhdWx0VmFsdWUpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aC5sZW5ndGg7aWYoIWxlbmd0aCl7bGVuZ3RoPTE7b2JqZWN0PXVuZGVmaW5lZH13aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPW9iamVjdD09bnVsbD91bmRlZmluZWQ6b2JqZWN0W3RvS2V5KHBhdGhbaW5kZXhdKV07aWYodmFsdWU9PT11bmRlZmluZWQpe2luZGV4PWxlbmd0aDt2YWx1ZT1kZWZhdWx0VmFsdWV9b2JqZWN0PWlzRnVuY3Rpb24odmFsdWUpP3ZhbHVlLmNhbGwob2JqZWN0KToKdmFsdWV9cmV0dXJuIG9iamVjdH1mdW5jdGlvbiBzZXQob2JqZWN0LHBhdGgsdmFsdWUpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUpfWZ1bmN0aW9uIHNldFdpdGgob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gb2JqZWN0PT1udWxsP29iamVjdDpiYXNlU2V0KG9iamVjdCxwYXRoLHZhbHVlLGN1c3RvbWl6ZXIpfXZhciB0b1BhaXJzPWNyZWF0ZVRvUGFpcnMoa2V5cyk7dmFyIHRvUGFpcnNJbj1jcmVhdGVUb1BhaXJzKGtleXNJbik7ZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCxpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGlzQXJyPWlzQXJyYXkob2JqZWN0KSxpc0Fyckxpa2U9aXNBcnJ8fGlzQnVmZmVyKG9iamVjdCl8fGlzVHlwZWRBcnJheShvYmplY3QpO2l0ZXJhdGVlPWdldEl0ZXJhdGVlKGl0ZXJhdGVlLAo0KTtpZihhY2N1bXVsYXRvcj09bnVsbCl7dmFyIEN0b3I9b2JqZWN0JiZvYmplY3QuY29uc3RydWN0b3I7aWYoaXNBcnJMaWtlKWFjY3VtdWxhdG9yPWlzQXJyP25ldyBDdG9yOltdO2Vsc2UgaWYoaXNPYmplY3Qob2JqZWN0KSlhY2N1bXVsYXRvcj1pc0Z1bmN0aW9uKEN0b3IpP2Jhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpOnt9O2Vsc2UgYWNjdW11bGF0b3I9e319KGlzQXJyTGlrZT9hcnJheUVhY2g6YmFzZUZvck93bikob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGluZGV4LG9iamVjdCl7cmV0dXJuIGl0ZXJhdGVlKGFjY3VtdWxhdG9yLHZhbHVlLGluZGV4LG9iamVjdCl9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gdW5zZXQob2JqZWN0LHBhdGgpe3JldHVybiBvYmplY3Q9PW51bGw/dHJ1ZTpiYXNlVW5zZXQob2JqZWN0LHBhdGgpfWZ1bmN0aW9uIHVwZGF0ZShvYmplY3QscGF0aCx1cGRhdGVyKXtyZXR1cm4gb2JqZWN0PT1udWxsP29iamVjdDpiYXNlVXBkYXRlKG9iamVjdCwKcGF0aCxjYXN0RnVuY3Rpb24odXBkYXRlcikpfWZ1bmN0aW9uIHVwZGF0ZVdpdGgob2JqZWN0LHBhdGgsdXBkYXRlcixjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VVcGRhdGUob2JqZWN0LHBhdGgsY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpLGN1c3RvbWl6ZXIpfWZ1bmN0aW9uIHZhbHVlcyhvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/W106YmFzZVZhbHVlcyhvYmplY3Qsa2V5cyhvYmplY3QpKX1mdW5jdGlvbiB2YWx1ZXNJbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/W106YmFzZVZhbHVlcyhvYmplY3Qsa2V5c0luKG9iamVjdCkpfWZ1bmN0aW9uIGNsYW1wKG51bWJlcixsb3dlcix1cHBlcil7aWYodXBwZXI9PT11bmRlZmluZWQpe3VwcGVyPWxvd2VyO2xvd2VyPXVuZGVmaW5lZH1pZih1cHBlciE9PXVuZGVmaW5lZCl7dXBwZXI9CnRvTnVtYmVyKHVwcGVyKTt1cHBlcj11cHBlcj09PXVwcGVyP3VwcGVyOjB9aWYobG93ZXIhPT11bmRlZmluZWQpe2xvd2VyPXRvTnVtYmVyKGxvd2VyKTtsb3dlcj1sb3dlcj09PWxvd2VyP2xvd2VyOjB9cmV0dXJuIGJhc2VDbGFtcCh0b051bWJlcihudW1iZXIpLGxvd2VyLHVwcGVyKX1mdW5jdGlvbiBpblJhbmdlKG51bWJlcixzdGFydCxlbmQpe3N0YXJ0PXRvRmluaXRlKHN0YXJ0KTtpZihlbmQ9PT11bmRlZmluZWQpe2VuZD1zdGFydDtzdGFydD0wfWVsc2UgZW5kPXRvRmluaXRlKGVuZCk7bnVtYmVyPXRvTnVtYmVyKG51bWJlcik7cmV0dXJuIGJhc2VJblJhbmdlKG51bWJlcixzdGFydCxlbmQpfWZ1bmN0aW9uIHJhbmRvbShsb3dlcix1cHBlcixmbG9hdGluZyl7aWYoZmxvYXRpbmcmJnR5cGVvZiBmbG9hdGluZyE9ImJvb2xlYW4iJiZpc0l0ZXJhdGVlQ2FsbChsb3dlcix1cHBlcixmbG9hdGluZykpdXBwZXI9ZmxvYXRpbmc9dW5kZWZpbmVkO2lmKGZsb2F0aW5nPT09dW5kZWZpbmVkKWlmKHR5cGVvZiB1cHBlcj09CiJib29sZWFuIil7ZmxvYXRpbmc9dXBwZXI7dXBwZXI9dW5kZWZpbmVkfWVsc2UgaWYodHlwZW9mIGxvd2VyPT0iYm9vbGVhbiIpe2Zsb2F0aW5nPWxvd2VyO2xvd2VyPXVuZGVmaW5lZH1pZihsb3dlcj09PXVuZGVmaW5lZCYmdXBwZXI9PT11bmRlZmluZWQpe2xvd2VyPTA7dXBwZXI9MX1lbHNle2xvd2VyPXRvRmluaXRlKGxvd2VyKTtpZih1cHBlcj09PXVuZGVmaW5lZCl7dXBwZXI9bG93ZXI7bG93ZXI9MH1lbHNlIHVwcGVyPXRvRmluaXRlKHVwcGVyKX1pZihsb3dlcj51cHBlcil7dmFyIHRlbXA9bG93ZXI7bG93ZXI9dXBwZXI7dXBwZXI9dGVtcH1pZihmbG9hdGluZ3x8bG93ZXIlMXx8dXBwZXIlMSl7dmFyIHJhbmQ9bmF0aXZlUmFuZG9tKCk7cmV0dXJuIG5hdGl2ZU1pbihsb3dlcityYW5kKih1cHBlci1sb3dlcitmcmVlUGFyc2VGbG9hdCgiMWUtIisoKHJhbmQrIiIpLmxlbmd0aC0xKSkpLHVwcGVyKX1yZXR1cm4gYmFzZVJhbmRvbShsb3dlcix1cHBlcil9dmFyIGNhbWVsQ2FzZT0KY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7d29yZD13b3JkLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHJlc3VsdCsoaW5kZXg/Y2FwaXRhbGl6ZSh3b3JkKTp3b3JkKX0pO2Z1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKXtyZXR1cm4gdXBwZXJGaXJzdCh0b1N0cmluZyhzdHJpbmcpLnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIGRlYnVycihzdHJpbmcpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3JldHVybiBzdHJpbmcmJnN0cmluZy5yZXBsYWNlKHJlTGF0aW4sZGVidXJyTGV0dGVyKS5yZXBsYWNlKHJlQ29tYm9NYXJrLCIiKX1mdW5jdGlvbiBlbmRzV2l0aChzdHJpbmcsdGFyZ2V0LHBvc2l0aW9uKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTt0YXJnZXQ9YmFzZVRvU3RyaW5nKHRhcmdldCk7dmFyIGxlbmd0aD1zdHJpbmcubGVuZ3RoO3Bvc2l0aW9uPXBvc2l0aW9uPT09dW5kZWZpbmVkP2xlbmd0aDpiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwKMCxsZW5ndGgpO3ZhciBlbmQ9cG9zaXRpb247cG9zaXRpb24tPXRhcmdldC5sZW5ndGg7cmV0dXJuIHBvc2l0aW9uPj0wJiZzdHJpbmcuc2xpY2UocG9zaXRpb24sZW5kKT09dGFyZ2V0fWZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3JldHVybiBzdHJpbmcmJnJlSGFzVW5lc2NhcGVkSHRtbC50ZXN0KHN0cmluZyk/c3RyaW5nLnJlcGxhY2UocmVVbmVzY2FwZWRIdG1sLGVzY2FwZUh0bWxDaGFyKTpzdHJpbmd9ZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmcmVIYXNSZWdFeHBDaGFyLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZVJlZ0V4cENoYXIsIlxcJFx4MjYiKTpzdHJpbmd9dmFyIGtlYmFiQ2FzZT1jcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXtyZXR1cm4gcmVzdWx0KyhpbmRleD8iLSI6IiIpK3dvcmQudG9Mb3dlckNhc2UoKX0pOwp2YXIgbG93ZXJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyIgIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7dmFyIGxvd2VyRmlyc3Q9Y3JlYXRlQ2FzZUZpcnN0KCJ0b0xvd2VyQ2FzZSIpO2Z1bmN0aW9uIHBhZChzdHJpbmcsbGVuZ3RoLGNoYXJzKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtsZW5ndGg9dG9JbnRlZ2VyKGxlbmd0aCk7dmFyIHN0ckxlbmd0aD1sZW5ndGg/c3RyaW5nU2l6ZShzdHJpbmcpOjA7aWYoIWxlbmd0aHx8c3RyTGVuZ3RoPj1sZW5ndGgpcmV0dXJuIHN0cmluZzt2YXIgbWlkPShsZW5ndGgtc3RyTGVuZ3RoKS8yO3JldHVybiBjcmVhdGVQYWRkaW5nKG5hdGl2ZUZsb29yKG1pZCksY2hhcnMpK3N0cmluZytjcmVhdGVQYWRkaW5nKG5hdGl2ZUNlaWwobWlkKSxjaGFycyl9ZnVuY3Rpb24gcGFkRW5kKHN0cmluZyxsZW5ndGgsY2hhcnMpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpOwpsZW5ndGg9dG9JbnRlZ2VyKGxlbmd0aCk7dmFyIHN0ckxlbmd0aD1sZW5ndGg/c3RyaW5nU2l6ZShzdHJpbmcpOjA7cmV0dXJuIGxlbmd0aCYmc3RyTGVuZ3RoPGxlbmd0aD9zdHJpbmcrY3JlYXRlUGFkZGluZyhsZW5ndGgtc3RyTGVuZ3RoLGNoYXJzKTpzdHJpbmd9ZnVuY3Rpb24gcGFkU3RhcnQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7bGVuZ3RoPXRvSW50ZWdlcihsZW5ndGgpO3ZhciBzdHJMZW5ndGg9bGVuZ3RoP3N0cmluZ1NpemUoc3RyaW5nKTowO3JldHVybiBsZW5ndGgmJnN0ckxlbmd0aDxsZW5ndGg/Y3JlYXRlUGFkZGluZyhsZW5ndGgtc3RyTGVuZ3RoLGNoYXJzKStzdHJpbmc6c3RyaW5nfWZ1bmN0aW9uIHBhcnNlSW50KHN0cmluZyxyYWRpeCxndWFyZCl7aWYoZ3VhcmR8fHJhZGl4PT1udWxsKXJhZGl4PTA7ZWxzZSBpZihyYWRpeClyYWRpeD0rcmFkaXg7cmV0dXJuIG5hdGl2ZVBhcnNlSW50KHRvU3RyaW5nKHN0cmluZykucmVwbGFjZShyZVRyaW1TdGFydCwKIiIpLHJhZGl4fHwwKX1mdW5jdGlvbiByZXBlYXQoc3RyaW5nLG4sZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKHN0cmluZyxuLGd1YXJkKTpuPT09dW5kZWZpbmVkKW49MTtlbHNlIG49dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlUmVwZWF0KHRvU3RyaW5nKHN0cmluZyksbil9ZnVuY3Rpb24gcmVwbGFjZSgpe3ZhciBhcmdzPWFyZ3VtZW50cyxzdHJpbmc9dG9TdHJpbmcoYXJnc1swXSk7cmV0dXJuIGFyZ3MubGVuZ3RoPDM/c3RyaW5nOnN0cmluZy5yZXBsYWNlKGFyZ3NbMV0sYXJnc1syXSl9dmFyIHNuYWtlQ2FzZT1jcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXtyZXR1cm4gcmVzdWx0KyhpbmRleD8iXyI6IiIpK3dvcmQudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHNwbGl0KHN0cmluZyxzZXBhcmF0b3IsbGltaXQpe2lmKGxpbWl0JiZ0eXBlb2YgbGltaXQhPSJudW1iZXIiJiZpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsc2VwYXJhdG9yLGxpbWl0KSlzZXBhcmF0b3I9CmxpbWl0PXVuZGVmaW5lZDtsaW1pdD1saW1pdD09PXVuZGVmaW5lZD9NQVhfQVJSQVlfTEVOR1RIOmxpbWl0Pj4+MDtpZighbGltaXQpcmV0dXJuW107c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYodHlwZW9mIHNlcGFyYXRvcj09InN0cmluZyJ8fHNlcGFyYXRvciE9bnVsbCYmIWlzUmVnRXhwKHNlcGFyYXRvcikpKXtzZXBhcmF0b3I9YmFzZVRvU3RyaW5nKHNlcGFyYXRvcik7aWYoIXNlcGFyYXRvciYmaGFzVW5pY29kZShzdHJpbmcpKXJldHVybiBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShzdHJpbmcpLDAsbGltaXQpfXJldHVybiBzdHJpbmcuc3BsaXQoc2VwYXJhdG9yLGxpbWl0KX12YXIgc3RhcnRDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyIgIjoiIikrdXBwZXJGaXJzdCh3b3JkKX0pO2Z1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyaW5nLHRhcmdldCxwb3NpdGlvbil7c3RyaW5nPQp0b1N0cmluZyhzdHJpbmcpO3Bvc2l0aW9uPXBvc2l0aW9uPT1udWxsPzA6YmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksMCxzdHJpbmcubGVuZ3RoKTt0YXJnZXQ9YmFzZVRvU3RyaW5nKHRhcmdldCk7cmV0dXJuIHN0cmluZy5zbGljZShwb3NpdGlvbixwb3NpdGlvbit0YXJnZXQubGVuZ3RoKT09dGFyZ2V0fWZ1bmN0aW9uIHRlbXBsYXRlKHN0cmluZyxvcHRpb25zLGd1YXJkKXt2YXIgc2V0dGluZ3M9bG9kYXNoLnRlbXBsYXRlU2V0dGluZ3M7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKHN0cmluZyxvcHRpb25zLGd1YXJkKSlvcHRpb25zPXVuZGVmaW5lZDtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtvcHRpb25zPWFzc2lnbkluV2l0aCh7fSxvcHRpb25zLHNldHRpbmdzLGN1c3RvbURlZmF1bHRzQXNzaWduSW4pO3ZhciBpbXBvcnRzPWFzc2lnbkluV2l0aCh7fSxvcHRpb25zLmltcG9ydHMsc2V0dGluZ3MuaW1wb3J0cyxjdXN0b21EZWZhdWx0c0Fzc2lnbkluKSxpbXBvcnRzS2V5cz0Ka2V5cyhpbXBvcnRzKSxpbXBvcnRzVmFsdWVzPWJhc2VWYWx1ZXMoaW1wb3J0cyxpbXBvcnRzS2V5cyk7dmFyIGlzRXNjYXBpbmcsaXNFdmFsdWF0aW5nLGluZGV4PTAsaW50ZXJwb2xhdGU9b3B0aW9ucy5pbnRlcnBvbGF0ZXx8cmVOb01hdGNoLHNvdXJjZT0iX19wICtceDNkICciO3ZhciByZURlbGltaXRlcnM9UmVnRXhwKChvcHRpb25zLmVzY2FwZXx8cmVOb01hdGNoKS5zb3VyY2UrInwiK2ludGVycG9sYXRlLnNvdXJjZSsifCIrKGludGVycG9sYXRlPT09cmVJbnRlcnBvbGF0ZT9yZUVzVGVtcGxhdGU6cmVOb01hdGNoKS5zb3VyY2UrInwiKyhvcHRpb25zLmV2YWx1YXRlfHxyZU5vTWF0Y2gpLnNvdXJjZSsifCQiLCJnIik7dmFyIHNvdXJjZVVSTD0iLy8jIHNvdXJjZVVSTFx4M2QiKygic291cmNlVVJMImluIG9wdGlvbnM/b3B0aW9ucy5zb3VyY2VVUkw6ImxvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbIisgKyt0ZW1wbGF0ZUNvdW50ZXIrIl0iKSsiXG4iO3N0cmluZy5yZXBsYWNlKHJlRGVsaW1pdGVycywKZnVuY3Rpb24obWF0Y2gsZXNjYXBlVmFsdWUsaW50ZXJwb2xhdGVWYWx1ZSxlc1RlbXBsYXRlVmFsdWUsZXZhbHVhdGVWYWx1ZSxvZmZzZXQpe2ludGVycG9sYXRlVmFsdWV8fChpbnRlcnBvbGF0ZVZhbHVlPWVzVGVtcGxhdGVWYWx1ZSk7c291cmNlKz1zdHJpbmcuc2xpY2UoaW5kZXgsb2Zmc2V0KS5yZXBsYWNlKHJlVW5lc2NhcGVkU3RyaW5nLGVzY2FwZVN0cmluZ0NoYXIpO2lmKGVzY2FwZVZhbHVlKXtpc0VzY2FwaW5nPXRydWU7c291cmNlKz0iJyArXG5fX2UoIitlc2NhcGVWYWx1ZSsiKSArXG4nIn1pZihldmFsdWF0ZVZhbHVlKXtpc0V2YWx1YXRpbmc9dHJ1ZTtzb3VyY2UrPSInO1xuIitldmFsdWF0ZVZhbHVlKyI7XG5fX3AgK1x4M2QgJyJ9aWYoaW50ZXJwb2xhdGVWYWx1ZSlzb3VyY2UrPSInICtcbigoX190IFx4M2QgKCIraW50ZXJwb2xhdGVWYWx1ZSsiKSkgXHgzZFx4M2QgbnVsbCA/ICcnIDogX190KSArXG4nIjtpbmRleD1vZmZzZXQrbWF0Y2gubGVuZ3RoO3JldHVybiBtYXRjaH0pOwpzb3VyY2UrPSInO1xuIjt2YXIgdmFyaWFibGU9b3B0aW9ucy52YXJpYWJsZTtpZighdmFyaWFibGUpc291cmNlPSJ3aXRoIChvYmopIHtcbiIrc291cmNlKyJcbn1cbiI7c291cmNlPShpc0V2YWx1YXRpbmc/c291cmNlLnJlcGxhY2UocmVFbXB0eVN0cmluZ0xlYWRpbmcsIiIpOnNvdXJjZSkucmVwbGFjZShyZUVtcHR5U3RyaW5nTWlkZGxlLCIkMSIpLnJlcGxhY2UocmVFbXB0eVN0cmluZ1RyYWlsaW5nLCIkMTsiKTtzb3VyY2U9ImZ1bmN0aW9uKCIrKHZhcmlhYmxlfHwib2JqIikrIikge1xuIisodmFyaWFibGU/IiI6Im9iaiB8fCAob2JqIFx4M2Qge30pO1xuIikrInZhciBfX3QsIF9fcCBceDNkICcnIisoaXNFc2NhcGluZz8iLCBfX2UgXHgzZCBfLmVzY2FwZSI6IiIpKyhpc0V2YWx1YXRpbmc/IiwgX19qIFx4M2QgQXJyYXkucHJvdG90eXBlLmpvaW47XG4iKyJmdW5jdGlvbiBwcmludCgpIHsgX19wICtceDNkIF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cbiI6IjtcbiIpK3NvdXJjZSsKInJldHVybiBfX3Bcbn0iO3ZhciByZXN1bHQ9YXR0ZW1wdChmdW5jdGlvbigpe3JldHVybiBGdW5jdGlvbihpbXBvcnRzS2V5cyxzb3VyY2VVUkwrInJldHVybiAiK3NvdXJjZSkuYXBwbHkodW5kZWZpbmVkLGltcG9ydHNWYWx1ZXMpfSk7cmVzdWx0LnNvdXJjZT1zb3VyY2U7aWYoaXNFcnJvcihyZXN1bHQpKXRocm93IHJlc3VsdDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRvTG93ZXIodmFsdWUpe3JldHVybiB0b1N0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiB0b1VwcGVyKHZhbHVlKXtyZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gdHJpbShzdHJpbmcsY2hhcnMsZ3VhcmQpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2lmKHN0cmluZyYmKGd1YXJkfHxjaGFycz09PXVuZGVmaW5lZCkpcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbSwiIik7aWYoIXN0cmluZ3x8IShjaGFycz1iYXNlVG9TdHJpbmcoY2hhcnMpKSlyZXR1cm4gc3RyaW5nOwp2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyksY2hyU3ltYm9scz1zdHJpbmdUb0FycmF5KGNoYXJzKSxzdGFydD1jaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scyxjaHJTeW1ib2xzKSxlbmQ9Y2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpKzE7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLHN0YXJ0LGVuZCkuam9pbigiIil9ZnVuY3Rpb24gdHJpbUVuZChzdHJpbmcsY2hhcnMsZ3VhcmQpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2lmKHN0cmluZyYmKGd1YXJkfHxjaGFycz09PXVuZGVmaW5lZCkpcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbUVuZCwiIik7aWYoIXN0cmluZ3x8IShjaGFycz1iYXNlVG9TdHJpbmcoY2hhcnMpKSlyZXR1cm4gc3RyaW5nO3ZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxlbmQ9Y2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLHN0cmluZ1RvQXJyYXkoY2hhcnMpKSsxO3JldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywKMCxlbmQpLmpvaW4oIiIpfWZ1bmN0aW9uIHRyaW1TdGFydChzdHJpbmcsY2hhcnMsZ3VhcmQpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2lmKHN0cmluZyYmKGd1YXJkfHxjaGFycz09PXVuZGVmaW5lZCkpcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbVN0YXJ0LCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7dmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpLHN0YXJ0PWNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLHN0cmluZ1RvQXJyYXkoY2hhcnMpKTtyZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsc3RhcnQpLmpvaW4oIiIpfWZ1bmN0aW9uIHRydW5jYXRlKHN0cmluZyxvcHRpb25zKXt2YXIgbGVuZ3RoPURFRkFVTFRfVFJVTkNfTEVOR1RILG9taXNzaW9uPURFRkFVTFRfVFJVTkNfT01JU1NJT047aWYoaXNPYmplY3Qob3B0aW9ucykpe3ZhciBzZXBhcmF0b3I9InNlcGFyYXRvciJpbiBvcHRpb25zPwpvcHRpb25zLnNlcGFyYXRvcjpzZXBhcmF0b3I7bGVuZ3RoPSJsZW5ndGgiaW4gb3B0aW9ucz90b0ludGVnZXIob3B0aW9ucy5sZW5ndGgpOmxlbmd0aDtvbWlzc2lvbj0ib21pc3Npb24iaW4gb3B0aW9ucz9iYXNlVG9TdHJpbmcob3B0aW9ucy5vbWlzc2lvbik6b21pc3Npb259c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7dmFyIHN0ckxlbmd0aD1zdHJpbmcubGVuZ3RoO2lmKGhhc1VuaWNvZGUoc3RyaW5nKSl7dmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpO3N0ckxlbmd0aD1zdHJTeW1ib2xzLmxlbmd0aH1pZihsZW5ndGg+PXN0ckxlbmd0aClyZXR1cm4gc3RyaW5nO3ZhciBlbmQ9bGVuZ3RoLXN0cmluZ1NpemUob21pc3Npb24pO2lmKGVuZDwxKXJldHVybiBvbWlzc2lvbjt2YXIgcmVzdWx0PXN0clN5bWJvbHM/Y2FzdFNsaWNlKHN0clN5bWJvbHMsMCxlbmQpLmpvaW4oIiIpOnN0cmluZy5zbGljZSgwLGVuZCk7aWYoc2VwYXJhdG9yPT09dW5kZWZpbmVkKXJldHVybiByZXN1bHQrCm9taXNzaW9uO2lmKHN0clN5bWJvbHMpZW5kKz1yZXN1bHQubGVuZ3RoLWVuZDtpZihpc1JlZ0V4cChzZXBhcmF0b3IpKXtpZihzdHJpbmcuc2xpY2UoZW5kKS5zZWFyY2goc2VwYXJhdG9yKSl7dmFyIG1hdGNoLHN1YnN0cmluZz1yZXN1bHQ7aWYoIXNlcGFyYXRvci5nbG9iYWwpc2VwYXJhdG9yPVJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLHRvU3RyaW5nKHJlRmxhZ3MuZXhlYyhzZXBhcmF0b3IpKSsiZyIpO3NlcGFyYXRvci5sYXN0SW5kZXg9MDt3aGlsZShtYXRjaD1zZXBhcmF0b3IuZXhlYyhzdWJzdHJpbmcpKXZhciBuZXdFbmQ9bWF0Y2guaW5kZXg7cmVzdWx0PXJlc3VsdC5zbGljZSgwLG5ld0VuZD09PXVuZGVmaW5lZD9lbmQ6bmV3RW5kKX19ZWxzZSBpZihzdHJpbmcuaW5kZXhPZihiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKSxlbmQpIT1lbmQpe3ZhciBpbmRleD1yZXN1bHQubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTtpZihpbmRleD4tMSlyZXN1bHQ9cmVzdWx0LnNsaWNlKDAsaW5kZXgpfXJldHVybiByZXN1bHQrCm9taXNzaW9ufWZ1bmN0aW9uIHVuZXNjYXBlKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmcmVIYXNFc2NhcGVkSHRtbC50ZXN0KHN0cmluZyk/c3RyaW5nLnJlcGxhY2UocmVFc2NhcGVkSHRtbCx1bmVzY2FwZUh0bWxDaGFyKTpzdHJpbmd9dmFyIHVwcGVyQ2FzZT1jcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXtyZXR1cm4gcmVzdWx0KyhpbmRleD8iICI6IiIpK3dvcmQudG9VcHBlckNhc2UoKX0pO3ZhciB1cHBlckZpcnN0PWNyZWF0ZUNhc2VGaXJzdCgidG9VcHBlckNhc2UiKTtmdW5jdGlvbiB3b3JkcyhzdHJpbmcscGF0dGVybixndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cGF0dGVybj1ndWFyZD91bmRlZmluZWQ6cGF0dGVybjtpZihwYXR0ZXJuPT09dW5kZWZpbmVkKXJldHVybiBoYXNVbmljb2RlV29yZChzdHJpbmcpP3VuaWNvZGVXb3JkcyhzdHJpbmcpOmFzY2lpV29yZHMoc3RyaW5nKTtyZXR1cm4gc3RyaW5nLm1hdGNoKHBhdHRlcm4pfHwKW119dmFyIGF0dGVtcHQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyxhcmdzKXt0cnl7cmV0dXJuIGFwcGx5KGZ1bmMsdW5kZWZpbmVkLGFyZ3MpfWNhdGNoKGUpe3JldHVybiBpc0Vycm9yKGUpP2U6bmV3IEVycm9yKGUpfX0pO3ZhciBiaW5kQWxsPWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxtZXRob2ROYW1lcyl7YXJyYXlFYWNoKG1ldGhvZE5hbWVzLGZ1bmN0aW9uKGtleSl7a2V5PXRvS2V5KGtleSk7YmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksYmluZChvYmplY3Rba2V5XSxvYmplY3QpKX0pO3JldHVybiBvYmplY3R9KTtmdW5jdGlvbiBjb25kKHBhaXJzKXt2YXIgbGVuZ3RoPXBhaXJzPT1udWxsPzA6cGFpcnMubGVuZ3RoLHRvSXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoKTtwYWlycz0hbGVuZ3RoP1tdOmFycmF5TWFwKHBhaXJzLGZ1bmN0aW9uKHBhaXIpe2lmKHR5cGVvZiBwYWlyWzFdIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtyZXR1cm5bdG9JdGVyYXRlZShwYWlyWzBdKSwKcGFpclsxXV19KTtyZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncyl7dmFyIGluZGV4PS0xO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGFpcj1wYWlyc1tpbmRleF07aWYoYXBwbHkocGFpclswXSx0aGlzLGFyZ3MpKXJldHVybiBhcHBseShwYWlyWzFdLHRoaXMsYXJncyl9fSl9ZnVuY3Rpb24gY29uZm9ybXMoc291cmNlKXtyZXR1cm4gYmFzZUNvbmZvcm1zKGJhc2VDbG9uZShzb3VyY2UsQ0xPTkVfREVFUF9GTEFHKSl9ZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB2YWx1ZX19ZnVuY3Rpb24gZGVmYXVsdFRvKHZhbHVlLGRlZmF1bHRWYWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsfHx2YWx1ZSE9PXZhbHVlP2RlZmF1bHRWYWx1ZTp2YWx1ZX12YXIgZmxvdz1jcmVhdGVGbG93KCk7dmFyIGZsb3dSaWdodD1jcmVhdGVGbG93KHRydWUpO2Z1bmN0aW9uIGlkZW50aXR5KHZhbHVlKXtyZXR1cm4gdmFsdWV9ZnVuY3Rpb24gaXRlcmF0ZWUoZnVuYyl7cmV0dXJuIGJhc2VJdGVyYXRlZSh0eXBlb2YgZnVuYz09CiJmdW5jdGlvbiI/ZnVuYzpiYXNlQ2xvbmUoZnVuYyxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBtYXRjaGVzKHNvdXJjZSl7cmV0dXJuIGJhc2VNYXRjaGVzKGJhc2VDbG9uZShzb3VyY2UsQ0xPTkVfREVFUF9GTEFHKSl9ZnVuY3Rpb24gbWF0Y2hlc1Byb3BlcnR5KHBhdGgsc3JjVmFsdWUpe3JldHVybiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsYmFzZUNsb25lKHNyY1ZhbHVlLENMT05FX0RFRVBfRkxBRykpfXZhciBtZXRob2Q9YmFzZVJlc3QoZnVuY3Rpb24ocGF0aCxhcmdzKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gYmFzZUludm9rZShvYmplY3QscGF0aCxhcmdzKX19KTt2YXIgbWV0aG9kT2Y9YmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LGFyZ3Mpe3JldHVybiBmdW5jdGlvbihwYXRoKXtyZXR1cm4gYmFzZUludm9rZShvYmplY3QscGF0aCxhcmdzKX19KTtmdW5jdGlvbiBtaXhpbihvYmplY3Qsc291cmNlLG9wdGlvbnMpe3ZhciBwcm9wcz1rZXlzKHNvdXJjZSksCm1ldGhvZE5hbWVzPWJhc2VGdW5jdGlvbnMoc291cmNlLHByb3BzKTtpZihvcHRpb25zPT1udWxsJiYhKGlzT2JqZWN0KHNvdXJjZSkmJihtZXRob2ROYW1lcy5sZW5ndGh8fCFwcm9wcy5sZW5ndGgpKSl7b3B0aW9ucz1zb3VyY2U7c291cmNlPW9iamVjdDtvYmplY3Q9dGhpczttZXRob2ROYW1lcz1iYXNlRnVuY3Rpb25zKHNvdXJjZSxrZXlzKHNvdXJjZSkpfXZhciBjaGFpbj0hKGlzT2JqZWN0KG9wdGlvbnMpJiYiY2hhaW4iaW4gb3B0aW9ucyl8fCEhb3B0aW9ucy5jaGFpbixpc0Z1bmM9aXNGdW5jdGlvbihvYmplY3QpO2FycmF5RWFjaChtZXRob2ROYW1lcyxmdW5jdGlvbihtZXRob2ROYW1lKXt2YXIgZnVuYz1zb3VyY2VbbWV0aG9kTmFtZV07b2JqZWN0W21ldGhvZE5hbWVdPWZ1bmM7aWYoaXNGdW5jKW9iamVjdC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgY2hhaW5BbGw9dGhpcy5fX2NoYWluX187aWYoY2hhaW58fGNoYWluQWxsKXt2YXIgcmVzdWx0PQpvYmplY3QodGhpcy5fX3dyYXBwZWRfXyksYWN0aW9ucz1yZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO2FjdGlvbnMucHVzaCh7ImZ1bmMiOmZ1bmMsImFyZ3MiOmFyZ3VtZW50cywidGhpc0FyZyI6b2JqZWN0fSk7cmVzdWx0Ll9fY2hhaW5fXz1jaGFpbkFsbDtyZXR1cm4gcmVzdWx0fXJldHVybiBmdW5jLmFwcGx5KG9iamVjdCxhcnJheVB1c2goW3RoaXMudmFsdWUoKV0sYXJndW1lbnRzKSl9fSk7cmV0dXJuIG9iamVjdH1mdW5jdGlvbiBub0NvbmZsaWN0KCl7aWYocm9vdC5fPT09dGhpcylyb290Ll89b2xkRGFzaDtyZXR1cm4gdGhpc31mdW5jdGlvbiBub29wKCl7fWZ1bmN0aW9uIG50aEFyZyhuKXtuPXRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncyl7cmV0dXJuIGJhc2VOdGgoYXJncyxuKX0pfXZhciBvdmVyPWNyZWF0ZU92ZXIoYXJyYXlNYXApO3ZhciBvdmVyRXZlcnk9Y3JlYXRlT3ZlcihhcnJheUV2ZXJ5KTsKdmFyIG92ZXJTb21lPWNyZWF0ZU92ZXIoYXJyYXlTb21lKTtmdW5jdGlvbiBwcm9wZXJ0eShwYXRoKXtyZXR1cm4gaXNLZXkocGF0aCk/YmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKTpiYXNlUHJvcGVydHlEZWVwKHBhdGgpfWZ1bmN0aW9uIHByb3BlcnR5T2Yob2JqZWN0KXtyZXR1cm4gZnVuY3Rpb24ocGF0aCl7cmV0dXJuIG9iamVjdD09bnVsbD91bmRlZmluZWQ6YmFzZUdldChvYmplY3QscGF0aCl9fXZhciByYW5nZT1jcmVhdGVSYW5nZSgpO3ZhciByYW5nZVJpZ2h0PWNyZWF0ZVJhbmdlKHRydWUpO2Z1bmN0aW9uIHN0dWJBcnJheSgpe3JldHVybltdfWZ1bmN0aW9uIHN0dWJGYWxzZSgpe3JldHVybiBmYWxzZX1mdW5jdGlvbiBzdHViT2JqZWN0KCl7cmV0dXJue319ZnVuY3Rpb24gc3R1YlN0cmluZygpe3JldHVybiIifWZ1bmN0aW9uIHN0dWJUcnVlKCl7cmV0dXJuIHRydWV9ZnVuY3Rpb24gdGltZXMobixpdGVyYXRlZSl7bj10b0ludGVnZXIobik7aWYobjwxfHxuPk1BWF9TQUZFX0lOVEVHRVIpcmV0dXJuW107CnZhciBpbmRleD1NQVhfQVJSQVlfTEVOR1RILGxlbmd0aD1uYXRpdmVNaW4obixNQVhfQVJSQVlfTEVOR1RIKTtpdGVyYXRlZT1nZXRJdGVyYXRlZShpdGVyYXRlZSk7bi09TUFYX0FSUkFZX0xFTkdUSDt2YXIgcmVzdWx0PWJhc2VUaW1lcyhsZW5ndGgsaXRlcmF0ZWUpO3doaWxlKCsraW5kZXg8bilpdGVyYXRlZShpbmRleCk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0b1BhdGgodmFsdWUpe2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBhcnJheU1hcCh2YWx1ZSx0b0tleSk7cmV0dXJuIGlzU3ltYm9sKHZhbHVlKT9bdmFsdWVdOmNvcHlBcnJheShzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKSl9ZnVuY3Rpb24gdW5pcXVlSWQocHJlZml4KXt2YXIgaWQ9KytpZENvdW50ZXI7cmV0dXJuIHRvU3RyaW5nKHByZWZpeCkraWR9dmFyIGFkZD1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGF1Z2VuZCxhZGRlbmQpe3JldHVybiBhdWdlbmQrYWRkZW5kfSwwKTt2YXIgY2VpbD1jcmVhdGVSb3VuZCgiY2VpbCIpOwp2YXIgZGl2aWRlPWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oZGl2aWRlbmQsZGl2aXNvcil7cmV0dXJuIGRpdmlkZW5kL2Rpdmlzb3J9LDEpO3ZhciBmbG9vcj1jcmVhdGVSb3VuZCgiZmxvb3IiKTtmdW5jdGlvbiBtYXgoYXJyYXkpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VFeHRyZW11bShhcnJheSxpZGVudGl0eSxiYXNlR3QpOnVuZGVmaW5lZH1mdW5jdGlvbiBtYXhCeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZUV4dHJlbXVtKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLGJhc2VHdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1lYW4oYXJyYXkpe3JldHVybiBiYXNlTWVhbihhcnJheSxpZGVudGl0eSl9ZnVuY3Rpb24gbWVhbkJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYmFzZU1lYW4oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfWZ1bmN0aW9uIG1pbihhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/CmJhc2VFeHRyZW11bShhcnJheSxpZGVudGl0eSxiYXNlTHQpOnVuZGVmaW5lZH1mdW5jdGlvbiBtaW5CeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZUV4dHJlbXVtKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLGJhc2VMdCk6dW5kZWZpbmVkfXZhciBtdWx0aXBseT1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG11bHRpcGxpZXIsbXVsdGlwbGljYW5kKXtyZXR1cm4gbXVsdGlwbGllciptdWx0aXBsaWNhbmR9LDEpO3ZhciByb3VuZD1jcmVhdGVSb3VuZCgicm91bmQiKTt2YXIgc3VidHJhY3Q9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtaW51ZW5kLHN1YnRyYWhlbmQpe3JldHVybiBtaW51ZW5kLXN1YnRyYWhlbmR9LDApO2Z1bmN0aW9uIHN1bShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVN1bShhcnJheSxpZGVudGl0eSk6MH1mdW5jdGlvbiBzdW1CeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiYKYXJyYXkubGVuZ3RoP2Jhc2VTdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOjB9bG9kYXNoLmFmdGVyPWFmdGVyO2xvZGFzaC5hcnk9YXJ5O2xvZGFzaC5hc3NpZ249YXNzaWduO2xvZGFzaC5hc3NpZ25Jbj1hc3NpZ25Jbjtsb2Rhc2guYXNzaWduSW5XaXRoPWFzc2lnbkluV2l0aDtsb2Rhc2guYXNzaWduV2l0aD1hc3NpZ25XaXRoO2xvZGFzaC5hdD1hdDtsb2Rhc2guYmVmb3JlPWJlZm9yZTtsb2Rhc2guYmluZD1iaW5kO2xvZGFzaC5iaW5kQWxsPWJpbmRBbGw7bG9kYXNoLmJpbmRLZXk9YmluZEtleTtsb2Rhc2guY2FzdEFycmF5PWNhc3RBcnJheTtsb2Rhc2guY2hhaW49Y2hhaW47bG9kYXNoLmNodW5rPWNodW5rO2xvZGFzaC5jb21wYWN0PWNvbXBhY3Q7bG9kYXNoLmNvbmNhdD1jb25jYXQ7bG9kYXNoLmNvbmQ9Y29uZDtsb2Rhc2guY29uZm9ybXM9Y29uZm9ybXM7bG9kYXNoLmNvbnN0YW50PWNvbnN0YW50O2xvZGFzaC5jb3VudEJ5PWNvdW50Qnk7bG9kYXNoLmNyZWF0ZT0KY3JlYXRlO2xvZGFzaC5jdXJyeT1jdXJyeTtsb2Rhc2guY3VycnlSaWdodD1jdXJyeVJpZ2h0O2xvZGFzaC5kZWJvdW5jZT1kZWJvdW5jZTtsb2Rhc2guZGVmYXVsdHM9ZGVmYXVsdHM7bG9kYXNoLmRlZmF1bHRzRGVlcD1kZWZhdWx0c0RlZXA7bG9kYXNoLmRlZmVyPWRlZmVyO2xvZGFzaC5kZWxheT1kZWxheTtsb2Rhc2guZGlmZmVyZW5jZT1kaWZmZXJlbmNlO2xvZGFzaC5kaWZmZXJlbmNlQnk9ZGlmZmVyZW5jZUJ5O2xvZGFzaC5kaWZmZXJlbmNlV2l0aD1kaWZmZXJlbmNlV2l0aDtsb2Rhc2guZHJvcD1kcm9wO2xvZGFzaC5kcm9wUmlnaHQ9ZHJvcFJpZ2h0O2xvZGFzaC5kcm9wUmlnaHRXaGlsZT1kcm9wUmlnaHRXaGlsZTtsb2Rhc2guZHJvcFdoaWxlPWRyb3BXaGlsZTtsb2Rhc2guZmlsbD1maWxsO2xvZGFzaC5maWx0ZXI9ZmlsdGVyO2xvZGFzaC5mbGF0TWFwPWZsYXRNYXA7bG9kYXNoLmZsYXRNYXBEZWVwPWZsYXRNYXBEZWVwO2xvZGFzaC5mbGF0TWFwRGVwdGg9ZmxhdE1hcERlcHRoOwpsb2Rhc2guZmxhdHRlbj1mbGF0dGVuO2xvZGFzaC5mbGF0dGVuRGVlcD1mbGF0dGVuRGVlcDtsb2Rhc2guZmxhdHRlbkRlcHRoPWZsYXR0ZW5EZXB0aDtsb2Rhc2guZmxpcD1mbGlwO2xvZGFzaC5mbG93PWZsb3c7bG9kYXNoLmZsb3dSaWdodD1mbG93UmlnaHQ7bG9kYXNoLmZyb21QYWlycz1mcm9tUGFpcnM7bG9kYXNoLmZ1bmN0aW9ucz1mdW5jdGlvbnM7bG9kYXNoLmZ1bmN0aW9uc0luPWZ1bmN0aW9uc0luO2xvZGFzaC5ncm91cEJ5PWdyb3VwQnk7bG9kYXNoLmluaXRpYWw9aW5pdGlhbDtsb2Rhc2guaW50ZXJzZWN0aW9uPWludGVyc2VjdGlvbjtsb2Rhc2guaW50ZXJzZWN0aW9uQnk9aW50ZXJzZWN0aW9uQnk7bG9kYXNoLmludGVyc2VjdGlvbldpdGg9aW50ZXJzZWN0aW9uV2l0aDtsb2Rhc2guaW52ZXJ0PWludmVydDtsb2Rhc2guaW52ZXJ0Qnk9aW52ZXJ0Qnk7bG9kYXNoLmludm9rZU1hcD1pbnZva2VNYXA7bG9kYXNoLml0ZXJhdGVlPWl0ZXJhdGVlO2xvZGFzaC5rZXlCeT0Ka2V5Qnk7bG9kYXNoLmtleXM9a2V5cztsb2Rhc2gua2V5c0luPWtleXNJbjtsb2Rhc2gubWFwPW1hcDtsb2Rhc2gubWFwS2V5cz1tYXBLZXlzO2xvZGFzaC5tYXBWYWx1ZXM9bWFwVmFsdWVzO2xvZGFzaC5tYXRjaGVzPW1hdGNoZXM7bG9kYXNoLm1hdGNoZXNQcm9wZXJ0eT1tYXRjaGVzUHJvcGVydHk7bG9kYXNoLm1lbW9pemU9bWVtb2l6ZTtsb2Rhc2gubWVyZ2U9bWVyZ2U7bG9kYXNoLm1lcmdlV2l0aD1tZXJnZVdpdGg7bG9kYXNoLm1ldGhvZD1tZXRob2Q7bG9kYXNoLm1ldGhvZE9mPW1ldGhvZE9mO2xvZGFzaC5taXhpbj1taXhpbjtsb2Rhc2gubmVnYXRlPW5lZ2F0ZTtsb2Rhc2gubnRoQXJnPW50aEFyZztsb2Rhc2gub21pdD1vbWl0O2xvZGFzaC5vbWl0Qnk9b21pdEJ5O2xvZGFzaC5vbmNlPW9uY2U7bG9kYXNoLm9yZGVyQnk9b3JkZXJCeTtsb2Rhc2gub3Zlcj1vdmVyO2xvZGFzaC5vdmVyQXJncz1vdmVyQXJncztsb2Rhc2gub3ZlckV2ZXJ5PW92ZXJFdmVyeTtsb2Rhc2gub3ZlclNvbWU9Cm92ZXJTb21lO2xvZGFzaC5wYXJ0aWFsPXBhcnRpYWw7bG9kYXNoLnBhcnRpYWxSaWdodD1wYXJ0aWFsUmlnaHQ7bG9kYXNoLnBhcnRpdGlvbj1wYXJ0aXRpb247bG9kYXNoLnBpY2s9cGljaztsb2Rhc2gucGlja0J5PXBpY2tCeTtsb2Rhc2gucHJvcGVydHk9cHJvcGVydHk7bG9kYXNoLnByb3BlcnR5T2Y9cHJvcGVydHlPZjtsb2Rhc2gucHVsbD1wdWxsO2xvZGFzaC5wdWxsQWxsPXB1bGxBbGw7bG9kYXNoLnB1bGxBbGxCeT1wdWxsQWxsQnk7bG9kYXNoLnB1bGxBbGxXaXRoPXB1bGxBbGxXaXRoO2xvZGFzaC5wdWxsQXQ9cHVsbEF0O2xvZGFzaC5yYW5nZT1yYW5nZTtsb2Rhc2gucmFuZ2VSaWdodD1yYW5nZVJpZ2h0O2xvZGFzaC5yZWFyZz1yZWFyZztsb2Rhc2gucmVqZWN0PXJlamVjdDtsb2Rhc2gucmVtb3ZlPXJlbW92ZTtsb2Rhc2gucmVzdD1yZXN0O2xvZGFzaC5yZXZlcnNlPXJldmVyc2U7bG9kYXNoLnNhbXBsZVNpemU9c2FtcGxlU2l6ZTtsb2Rhc2guc2V0PXNldDtsb2Rhc2guc2V0V2l0aD0Kc2V0V2l0aDtsb2Rhc2guc2h1ZmZsZT1zaHVmZmxlO2xvZGFzaC5zbGljZT1zbGljZTtsb2Rhc2guc29ydEJ5PXNvcnRCeTtsb2Rhc2guc29ydGVkVW5pcT1zb3J0ZWRVbmlxO2xvZGFzaC5zb3J0ZWRVbmlxQnk9c29ydGVkVW5pcUJ5O2xvZGFzaC5zcGxpdD1zcGxpdDtsb2Rhc2guc3ByZWFkPXNwcmVhZDtsb2Rhc2gudGFpbD10YWlsO2xvZGFzaC50YWtlPXRha2U7bG9kYXNoLnRha2VSaWdodD10YWtlUmlnaHQ7bG9kYXNoLnRha2VSaWdodFdoaWxlPXRha2VSaWdodFdoaWxlO2xvZGFzaC50YWtlV2hpbGU9dGFrZVdoaWxlO2xvZGFzaC50YXA9dGFwO2xvZGFzaC50aHJvdHRsZT10aHJvdHRsZTtsb2Rhc2gudGhydT10aHJ1O2xvZGFzaC50b0FycmF5PXRvQXJyYXk7bG9kYXNoLnRvUGFpcnM9dG9QYWlycztsb2Rhc2gudG9QYWlyc0luPXRvUGFpcnNJbjtsb2Rhc2gudG9QYXRoPXRvUGF0aDtsb2Rhc2gudG9QbGFpbk9iamVjdD10b1BsYWluT2JqZWN0O2xvZGFzaC50cmFuc2Zvcm09CnRyYW5zZm9ybTtsb2Rhc2gudW5hcnk9dW5hcnk7bG9kYXNoLnVuaW9uPXVuaW9uO2xvZGFzaC51bmlvbkJ5PXVuaW9uQnk7bG9kYXNoLnVuaW9uV2l0aD11bmlvbldpdGg7bG9kYXNoLnVuaXE9dW5pcTtsb2Rhc2gudW5pcUJ5PXVuaXFCeTtsb2Rhc2gudW5pcVdpdGg9dW5pcVdpdGg7bG9kYXNoLnVuc2V0PXVuc2V0O2xvZGFzaC51bnppcD11bnppcDtsb2Rhc2gudW56aXBXaXRoPXVuemlwV2l0aDtsb2Rhc2gudXBkYXRlPXVwZGF0ZTtsb2Rhc2gudXBkYXRlV2l0aD11cGRhdGVXaXRoO2xvZGFzaC52YWx1ZXM9dmFsdWVzO2xvZGFzaC52YWx1ZXNJbj12YWx1ZXNJbjtsb2Rhc2gud2l0aG91dD13aXRob3V0O2xvZGFzaC53b3Jkcz13b3Jkcztsb2Rhc2gud3JhcD13cmFwO2xvZGFzaC54b3I9eG9yO2xvZGFzaC54b3JCeT14b3JCeTtsb2Rhc2gueG9yV2l0aD14b3JXaXRoO2xvZGFzaC56aXA9emlwO2xvZGFzaC56aXBPYmplY3Q9emlwT2JqZWN0O2xvZGFzaC56aXBPYmplY3REZWVwPQp6aXBPYmplY3REZWVwO2xvZGFzaC56aXBXaXRoPXppcFdpdGg7bG9kYXNoLmVudHJpZXM9dG9QYWlycztsb2Rhc2guZW50cmllc0luPXRvUGFpcnNJbjtsb2Rhc2guZXh0ZW5kPWFzc2lnbkluO2xvZGFzaC5leHRlbmRXaXRoPWFzc2lnbkluV2l0aDttaXhpbihsb2Rhc2gsbG9kYXNoKTtsb2Rhc2guYWRkPWFkZDtsb2Rhc2guYXR0ZW1wdD1hdHRlbXB0O2xvZGFzaC5jYW1lbENhc2U9Y2FtZWxDYXNlO2xvZGFzaC5jYXBpdGFsaXplPWNhcGl0YWxpemU7bG9kYXNoLmNlaWw9Y2VpbDtsb2Rhc2guY2xhbXA9Y2xhbXA7bG9kYXNoLmNsb25lPWNsb25lO2xvZGFzaC5jbG9uZURlZXA9Y2xvbmVEZWVwO2xvZGFzaC5jbG9uZURlZXBXaXRoPWNsb25lRGVlcFdpdGg7bG9kYXNoLmNsb25lV2l0aD1jbG9uZVdpdGg7bG9kYXNoLmNvbmZvcm1zVG89Y29uZm9ybXNUbztsb2Rhc2guZGVidXJyPWRlYnVycjtsb2Rhc2guZGVmYXVsdFRvPWRlZmF1bHRUbztsb2Rhc2guZGl2aWRlPWRpdmlkZTtsb2Rhc2guZW5kc1dpdGg9CmVuZHNXaXRoO2xvZGFzaC5lcT1lcTtsb2Rhc2guZXNjYXBlPWVzY2FwZTtsb2Rhc2guZXNjYXBlUmVnRXhwPWVzY2FwZVJlZ0V4cDtsb2Rhc2guZXZlcnk9ZXZlcnk7bG9kYXNoLmZpbmQ9ZmluZDtsb2Rhc2guZmluZEluZGV4PWZpbmRJbmRleDtsb2Rhc2guZmluZEtleT1maW5kS2V5O2xvZGFzaC5maW5kTGFzdD1maW5kTGFzdDtsb2Rhc2guZmluZExhc3RJbmRleD1maW5kTGFzdEluZGV4O2xvZGFzaC5maW5kTGFzdEtleT1maW5kTGFzdEtleTtsb2Rhc2guZmxvb3I9Zmxvb3I7bG9kYXNoLmZvckVhY2g9Zm9yRWFjaDtsb2Rhc2guZm9yRWFjaFJpZ2h0PWZvckVhY2hSaWdodDtsb2Rhc2guZm9ySW49Zm9ySW47bG9kYXNoLmZvckluUmlnaHQ9Zm9ySW5SaWdodDtsb2Rhc2guZm9yT3duPWZvck93bjtsb2Rhc2guZm9yT3duUmlnaHQ9Zm9yT3duUmlnaHQ7bG9kYXNoLmdldD1nZXQ7bG9kYXNoLmd0PWd0O2xvZGFzaC5ndGU9Z3RlO2xvZGFzaC5oYXM9aGFzO2xvZGFzaC5oYXNJbj1oYXNJbjsKbG9kYXNoLmhlYWQ9aGVhZDtsb2Rhc2guaWRlbnRpdHk9aWRlbnRpdHk7bG9kYXNoLmluY2x1ZGVzPWluY2x1ZGVzO2xvZGFzaC5pbmRleE9mPWluZGV4T2Y7bG9kYXNoLmluUmFuZ2U9aW5SYW5nZTtsb2Rhc2guaW52b2tlPWludm9rZTtsb2Rhc2guaXNBcmd1bWVudHM9aXNBcmd1bWVudHM7bG9kYXNoLmlzQXJyYXk9aXNBcnJheTtsb2Rhc2guaXNBcnJheUJ1ZmZlcj1pc0FycmF5QnVmZmVyO2xvZGFzaC5pc0FycmF5TGlrZT1pc0FycmF5TGlrZTtsb2Rhc2guaXNBcnJheUxpa2VPYmplY3Q9aXNBcnJheUxpa2VPYmplY3Q7bG9kYXNoLmlzQm9vbGVhbj1pc0Jvb2xlYW47bG9kYXNoLmlzQnVmZmVyPWlzQnVmZmVyO2xvZGFzaC5pc0RhdGU9aXNEYXRlO2xvZGFzaC5pc0VsZW1lbnQ9aXNFbGVtZW50O2xvZGFzaC5pc0VtcHR5PWlzRW1wdHk7bG9kYXNoLmlzRXF1YWw9aXNFcXVhbDtsb2Rhc2guaXNFcXVhbFdpdGg9aXNFcXVhbFdpdGg7bG9kYXNoLmlzRXJyb3I9aXNFcnJvcjtsb2Rhc2guaXNGaW5pdGU9CmlzRmluaXRlO2xvZGFzaC5pc0Z1bmN0aW9uPWlzRnVuY3Rpb247bG9kYXNoLmlzSW50ZWdlcj1pc0ludGVnZXI7bG9kYXNoLmlzTGVuZ3RoPWlzTGVuZ3RoO2xvZGFzaC5pc01hcD1pc01hcDtsb2Rhc2guaXNNYXRjaD1pc01hdGNoO2xvZGFzaC5pc01hdGNoV2l0aD1pc01hdGNoV2l0aDtsb2Rhc2guaXNOYU49aXNOYU47bG9kYXNoLmlzTmF0aXZlPWlzTmF0aXZlO2xvZGFzaC5pc05pbD1pc05pbDtsb2Rhc2guaXNOdWxsPWlzTnVsbDtsb2Rhc2guaXNOdW1iZXI9aXNOdW1iZXI7bG9kYXNoLmlzT2JqZWN0PWlzT2JqZWN0O2xvZGFzaC5pc09iamVjdExpa2U9aXNPYmplY3RMaWtlO2xvZGFzaC5pc1BsYWluT2JqZWN0PWlzUGxhaW5PYmplY3Q7bG9kYXNoLmlzUmVnRXhwPWlzUmVnRXhwO2xvZGFzaC5pc1NhZmVJbnRlZ2VyPWlzU2FmZUludGVnZXI7bG9kYXNoLmlzU2V0PWlzU2V0O2xvZGFzaC5pc1N0cmluZz1pc1N0cmluZztsb2Rhc2guaXNTeW1ib2w9aXNTeW1ib2w7bG9kYXNoLmlzVHlwZWRBcnJheT0KaXNUeXBlZEFycmF5O2xvZGFzaC5pc1VuZGVmaW5lZD1pc1VuZGVmaW5lZDtsb2Rhc2guaXNXZWFrTWFwPWlzV2Vha01hcDtsb2Rhc2guaXNXZWFrU2V0PWlzV2Vha1NldDtsb2Rhc2guam9pbj1qb2luO2xvZGFzaC5rZWJhYkNhc2U9a2ViYWJDYXNlO2xvZGFzaC5sYXN0PWxhc3Q7bG9kYXNoLmxhc3RJbmRleE9mPWxhc3RJbmRleE9mO2xvZGFzaC5sb3dlckNhc2U9bG93ZXJDYXNlO2xvZGFzaC5sb3dlckZpcnN0PWxvd2VyRmlyc3Q7bG9kYXNoLmx0PWx0O2xvZGFzaC5sdGU9bHRlO2xvZGFzaC5tYXg9bWF4O2xvZGFzaC5tYXhCeT1tYXhCeTtsb2Rhc2gubWVhbj1tZWFuO2xvZGFzaC5tZWFuQnk9bWVhbkJ5O2xvZGFzaC5taW49bWluO2xvZGFzaC5taW5CeT1taW5CeTtsb2Rhc2guc3R1YkFycmF5PXN0dWJBcnJheTtsb2Rhc2guc3R1YkZhbHNlPXN0dWJGYWxzZTtsb2Rhc2guc3R1Yk9iamVjdD1zdHViT2JqZWN0O2xvZGFzaC5zdHViU3RyaW5nPXN0dWJTdHJpbmc7bG9kYXNoLnN0dWJUcnVlPQpzdHViVHJ1ZTtsb2Rhc2gubXVsdGlwbHk9bXVsdGlwbHk7bG9kYXNoLm50aD1udGg7bG9kYXNoLm5vQ29uZmxpY3Q9bm9Db25mbGljdDtsb2Rhc2gubm9vcD1ub29wO2xvZGFzaC5ub3c9bm93O2xvZGFzaC5wYWQ9cGFkO2xvZGFzaC5wYWRFbmQ9cGFkRW5kO2xvZGFzaC5wYWRTdGFydD1wYWRTdGFydDtsb2Rhc2gucGFyc2VJbnQ9cGFyc2VJbnQ7bG9kYXNoLnJhbmRvbT1yYW5kb207bG9kYXNoLnJlZHVjZT1yZWR1Y2U7bG9kYXNoLnJlZHVjZVJpZ2h0PXJlZHVjZVJpZ2h0O2xvZGFzaC5yZXBlYXQ9cmVwZWF0O2xvZGFzaC5yZXBsYWNlPXJlcGxhY2U7bG9kYXNoLnJlc3VsdD1yZXN1bHQ7bG9kYXNoLnJvdW5kPXJvdW5kO2xvZGFzaC5ydW5JbkNvbnRleHQ9cnVuSW5Db250ZXh0O2xvZGFzaC5zYW1wbGU9c2FtcGxlO2xvZGFzaC5zaXplPXNpemU7bG9kYXNoLnNuYWtlQ2FzZT1zbmFrZUNhc2U7bG9kYXNoLnNvbWU9c29tZTtsb2Rhc2guc29ydGVkSW5kZXg9c29ydGVkSW5kZXg7bG9kYXNoLnNvcnRlZEluZGV4Qnk9CnNvcnRlZEluZGV4Qnk7bG9kYXNoLnNvcnRlZEluZGV4T2Y9c29ydGVkSW5kZXhPZjtsb2Rhc2guc29ydGVkTGFzdEluZGV4PXNvcnRlZExhc3RJbmRleDtsb2Rhc2guc29ydGVkTGFzdEluZGV4Qnk9c29ydGVkTGFzdEluZGV4Qnk7bG9kYXNoLnNvcnRlZExhc3RJbmRleE9mPXNvcnRlZExhc3RJbmRleE9mO2xvZGFzaC5zdGFydENhc2U9c3RhcnRDYXNlO2xvZGFzaC5zdGFydHNXaXRoPXN0YXJ0c1dpdGg7bG9kYXNoLnN1YnRyYWN0PXN1YnRyYWN0O2xvZGFzaC5zdW09c3VtO2xvZGFzaC5zdW1CeT1zdW1CeTtsb2Rhc2gudGVtcGxhdGU9dGVtcGxhdGU7bG9kYXNoLnRpbWVzPXRpbWVzO2xvZGFzaC50b0Zpbml0ZT10b0Zpbml0ZTtsb2Rhc2gudG9JbnRlZ2VyPXRvSW50ZWdlcjtsb2Rhc2gudG9MZW5ndGg9dG9MZW5ndGg7bG9kYXNoLnRvTG93ZXI9dG9Mb3dlcjtsb2Rhc2gudG9OdW1iZXI9dG9OdW1iZXI7bG9kYXNoLnRvU2FmZUludGVnZXI9dG9TYWZlSW50ZWdlcjtsb2Rhc2gudG9TdHJpbmc9CnRvU3RyaW5nO2xvZGFzaC50b1VwcGVyPXRvVXBwZXI7bG9kYXNoLnRyaW09dHJpbTtsb2Rhc2gudHJpbUVuZD10cmltRW5kO2xvZGFzaC50cmltU3RhcnQ9dHJpbVN0YXJ0O2xvZGFzaC50cnVuY2F0ZT10cnVuY2F0ZTtsb2Rhc2gudW5lc2NhcGU9dW5lc2NhcGU7bG9kYXNoLnVuaXF1ZUlkPXVuaXF1ZUlkO2xvZGFzaC51cHBlckNhc2U9dXBwZXJDYXNlO2xvZGFzaC51cHBlckZpcnN0PXVwcGVyRmlyc3Q7bG9kYXNoLmVhY2g9Zm9yRWFjaDtsb2Rhc2guZWFjaFJpZ2h0PWZvckVhY2hSaWdodDtsb2Rhc2guZmlyc3Q9aGVhZDttaXhpbihsb2Rhc2gsZnVuY3Rpb24oKXt2YXIgc291cmNlPXt9O2Jhc2VGb3JPd24obG9kYXNoLGZ1bmN0aW9uKGZ1bmMsbWV0aG9kTmFtZSl7aWYoIWhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLnByb3RvdHlwZSxtZXRob2ROYW1lKSlzb3VyY2VbbWV0aG9kTmFtZV09ZnVuY30pO3JldHVybiBzb3VyY2V9KCkseyJjaGFpbiI6ZmFsc2V9KTtsb2Rhc2guVkVSU0lPTj0KVkVSU0lPTjthcnJheUVhY2goWyJiaW5kIiwiYmluZEtleSIsImN1cnJ5IiwiY3VycnlSaWdodCIsInBhcnRpYWwiLCJwYXJ0aWFsUmlnaHQiXSxmdW5jdGlvbihtZXRob2ROYW1lKXtsb2Rhc2hbbWV0aG9kTmFtZV0ucGxhY2Vob2xkZXI9bG9kYXNofSk7YXJyYXlFYWNoKFsiZHJvcCIsInRha2UiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24obil7bj1uPT09dW5kZWZpbmVkPzE6bmF0aXZlTWF4KHRvSW50ZWdlcihuKSwwKTt2YXIgcmVzdWx0PXRoaXMuX19maWx0ZXJlZF9fJiYhaW5kZXg/bmV3IExhenlXcmFwcGVyKHRoaXMpOnRoaXMuY2xvbmUoKTtpZihyZXN1bHQuX19maWx0ZXJlZF9fKXJlc3VsdC5fX3Rha2VDb3VudF9fPW5hdGl2ZU1pbihuLHJlc3VsdC5fX3Rha2VDb3VudF9fKTtlbHNlIHJlc3VsdC5fX3ZpZXdzX18ucHVzaCh7InNpemUiOm5hdGl2ZU1pbihuLE1BWF9BUlJBWV9MRU5HVEgpLAoidHlwZSI6bWV0aG9kTmFtZSsocmVzdWx0Ll9fZGlyX188MD8iUmlnaHQiOiIiKX0pO3JldHVybiByZXN1bHR9O0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lKyJSaWdodCJdPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLnJldmVyc2UoKVttZXRob2ROYW1lXShuKS5yZXZlcnNlKCl9fSk7YXJyYXlFYWNoKFsiZmlsdGVyIiwibWFwIiwidGFrZVdoaWxlIl0sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7dmFyIHR5cGU9aW5kZXgrMSxpc0ZpbHRlcj10eXBlPT1MQVpZX0ZJTFRFUl9GTEFHfHx0eXBlPT1MQVpZX1dISUxFX0ZMQUc7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKGl0ZXJhdGVlKXt2YXIgcmVzdWx0PXRoaXMuY2xvbmUoKTtyZXN1bHQuX19pdGVyYXRlZXNfXy5wdXNoKHsiaXRlcmF0ZWUiOmdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpLCJ0eXBlIjp0eXBlfSk7cmVzdWx0Ll9fZmlsdGVyZWRfXz1yZXN1bHQuX19maWx0ZXJlZF9ffHwKaXNGaWx0ZXI7cmV0dXJuIHJlc3VsdH19KTthcnJheUVhY2goWyJoZWFkIiwibGFzdCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe3ZhciB0YWtlTmFtZT0idGFrZSIrKGluZGV4PyJSaWdodCI6IiIpO0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3JldHVybiB0aGlzW3Rha2VOYW1lXSgxKS52YWx1ZSgpWzBdfX0pO2FycmF5RWFjaChbImluaXRpYWwiLCJ0YWlsIl0sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7dmFyIGRyb3BOYW1lPSJkcm9wIisoaW5kZXg/IiI6IlJpZ2h0Iik7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fP25ldyBMYXp5V3JhcHBlcih0aGlzKTp0aGlzW2Ryb3BOYW1lXSgxKX19KTtMYXp5V3JhcHBlci5wcm90b3R5cGUuY29tcGFjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcihpZGVudGl0eSl9O0xhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kPQpmdW5jdGlvbihwcmVkaWNhdGUpe3JldHVybiB0aGlzLmZpbHRlcihwcmVkaWNhdGUpLmhlYWQoKX07TGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmRMYXN0PWZ1bmN0aW9uKHByZWRpY2F0ZSl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpLmZpbmQocHJlZGljYXRlKX07TGF6eVdyYXBwZXIucHJvdG90eXBlLmludm9rZU1hcD1iYXNlUmVzdChmdW5jdGlvbihwYXRoLGFyZ3Mpe2lmKHR5cGVvZiBwYXRoPT0iZnVuY3Rpb24iKXJldHVybiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gYmFzZUludm9rZSh2YWx1ZSxwYXRoLGFyZ3MpfSl9KTtMYXp5V3JhcHBlci5wcm90b3R5cGUucmVqZWN0PWZ1bmN0aW9uKHByZWRpY2F0ZSl7cmV0dXJuIHRoaXMuZmlsdGVyKG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSl9O0xhenlXcmFwcGVyLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihzdGFydCxlbmQpe3N0YXJ0PXRvSW50ZWdlcihzdGFydCk7CnZhciByZXN1bHQ9dGhpcztpZihyZXN1bHQuX19maWx0ZXJlZF9fJiYoc3RhcnQ+MHx8ZW5kPDApKXJldHVybiBuZXcgTGF6eVdyYXBwZXIocmVzdWx0KTtpZihzdGFydDwwKXJlc3VsdD1yZXN1bHQudGFrZVJpZ2h0KC1zdGFydCk7ZWxzZSBpZihzdGFydClyZXN1bHQ9cmVzdWx0LmRyb3Aoc3RhcnQpO2lmKGVuZCE9PXVuZGVmaW5lZCl7ZW5kPXRvSW50ZWdlcihlbmQpO3Jlc3VsdD1lbmQ8MD9yZXN1bHQuZHJvcFJpZ2h0KC1lbmQpOnJlc3VsdC50YWtlKGVuZC1zdGFydCl9cmV0dXJuIHJlc3VsdH07TGF6eVdyYXBwZXIucHJvdG90eXBlLnRha2VSaWdodFdoaWxlPWZ1bmN0aW9uKHByZWRpY2F0ZSl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpLnRha2VXaGlsZShwcmVkaWNhdGUpLnJldmVyc2UoKX07TGF6eVdyYXBwZXIucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWtlKE1BWF9BUlJBWV9MRU5HVEgpfTtiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwKZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXt2YXIgY2hlY2tJdGVyYXRlZT0vXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChtZXRob2ROYW1lKSxpc1Rha2VyPS9eKD86aGVhZHxsYXN0KSQvLnRlc3QobWV0aG9kTmFtZSksbG9kYXNoRnVuYz1sb2Rhc2hbaXNUYWtlcj8idGFrZSIrKG1ldGhvZE5hbWU9PSJsYXN0Ij8iUmlnaHQiOiIiKTptZXRob2ROYW1lXSxyZXRVbndyYXBwZWQ9aXNUYWtlcnx8L15maW5kLy50ZXN0KG1ldGhvZE5hbWUpO2lmKCFsb2Rhc2hGdW5jKXJldHVybjtsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7dmFyIHZhbHVlPXRoaXMuX193cmFwcGVkX18sYXJncz1pc1Rha2VyP1sxXTphcmd1bWVudHMsaXNMYXp5PXZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIsaXRlcmF0ZWU9YXJnc1swXSx1c2VMYXp5PWlzTGF6eXx8aXNBcnJheSh2YWx1ZSk7dmFyIGludGVyY2VwdG9yPWZ1bmN0aW9uKHZhbHVlKXt2YXIgcmVzdWx0PQpsb2Rhc2hGdW5jLmFwcGx5KGxvZGFzaCxhcnJheVB1c2goW3ZhbHVlXSxhcmdzKSk7cmV0dXJuIGlzVGFrZXImJmNoYWluQWxsP3Jlc3VsdFswXTpyZXN1bHR9O2lmKHVzZUxhenkmJmNoZWNrSXRlcmF0ZWUmJnR5cGVvZiBpdGVyYXRlZT09ImZ1bmN0aW9uIiYmaXRlcmF0ZWUubGVuZ3RoIT0xKWlzTGF6eT11c2VMYXp5PWZhbHNlO3ZhciBjaGFpbkFsbD10aGlzLl9fY2hhaW5fXyxpc0h5YnJpZD0hIXRoaXMuX19hY3Rpb25zX18ubGVuZ3RoLGlzVW53cmFwcGVkPXJldFVud3JhcHBlZCYmIWNoYWluQWxsLG9ubHlMYXp5PWlzTGF6eSYmIWlzSHlicmlkO2lmKCFyZXRVbndyYXBwZWQmJnVzZUxhenkpe3ZhbHVlPW9ubHlMYXp5P3ZhbHVlOm5ldyBMYXp5V3JhcHBlcih0aGlzKTt2YXIgcmVzdWx0PWZ1bmMuYXBwbHkodmFsdWUsYXJncyk7cmVzdWx0Ll9fYWN0aW9uc19fLnB1c2goeyJmdW5jIjp0aHJ1LCJhcmdzIjpbaW50ZXJjZXB0b3JdLCJ0aGlzQXJnIjp1bmRlZmluZWR9KTtyZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIocmVzdWx0LApjaGFpbkFsbCl9aWYoaXNVbndyYXBwZWQmJm9ubHlMYXp5KXJldHVybiBmdW5jLmFwcGx5KHRoaXMsYXJncyk7cmVzdWx0PXRoaXMudGhydShpbnRlcmNlcHRvcik7cmV0dXJuIGlzVW53cmFwcGVkP2lzVGFrZXI/cmVzdWx0LnZhbHVlKClbMF06cmVzdWx0LnZhbHVlKCk6cmVzdWx0fX0pO2FycmF5RWFjaChbInBvcCIsInB1c2giLCJzaGlmdCIsInNvcnQiLCJzcGxpY2UiLCJ1bnNoaWZ0Il0sZnVuY3Rpb24obWV0aG9kTmFtZSl7dmFyIGZ1bmM9YXJyYXlQcm90b1ttZXRob2ROYW1lXSxjaGFpbk5hbWU9L14oPzpwdXNofHNvcnR8dW5zaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpPyJ0YXAiOiJ0aHJ1IixyZXRVbndyYXBwZWQ9L14oPzpwb3B8c2hpZnQpJC8udGVzdChtZXRob2ROYW1lKTtsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzO2lmKHJldFVud3JhcHBlZCYmIXRoaXMuX19jaGFpbl9fKXt2YXIgdmFsdWU9dGhpcy52YWx1ZSgpOwpyZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKT92YWx1ZTpbXSxhcmdzKX1yZXR1cm4gdGhpc1tjaGFpbk5hbWVdKGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKT92YWx1ZTpbXSxhcmdzKX0pfX0pO2Jhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLGZ1bmN0aW9uKGZ1bmMsbWV0aG9kTmFtZSl7dmFyIGxvZGFzaEZ1bmM9bG9kYXNoW21ldGhvZE5hbWVdO2lmKGxvZGFzaEZ1bmMpe3ZhciBrZXk9bG9kYXNoRnVuYy5uYW1lKyIiLG5hbWVzPXJlYWxOYW1lc1trZXldfHwocmVhbE5hbWVzW2tleV09W10pO25hbWVzLnB1c2goeyJuYW1lIjptZXRob2ROYW1lLCJmdW5jIjpsb2Rhc2hGdW5jfSl9fSk7cmVhbE5hbWVzW2NyZWF0ZUh5YnJpZCh1bmRlZmluZWQsV1JBUF9CSU5EX0tFWV9GTEFHKS5uYW1lXT1beyJuYW1lIjoid3JhcHBlciIsImZ1bmMiOnVuZGVmaW5lZH1dO0xhenlXcmFwcGVyLnByb3RvdHlwZS5jbG9uZT1sYXp5Q2xvbmU7CkxhenlXcmFwcGVyLnByb3RvdHlwZS5yZXZlcnNlPWxhenlSZXZlcnNlO0xhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZT1sYXp5VmFsdWU7bG9kYXNoLnByb3RvdHlwZS5hdD13cmFwcGVyQXQ7bG9kYXNoLnByb3RvdHlwZS5jaGFpbj13cmFwcGVyQ2hhaW47bG9kYXNoLnByb3RvdHlwZS5jb21taXQ9d3JhcHBlckNvbW1pdDtsb2Rhc2gucHJvdG90eXBlLm5leHQ9d3JhcHBlck5leHQ7bG9kYXNoLnByb3RvdHlwZS5wbGFudD13cmFwcGVyUGxhbnQ7bG9kYXNoLnByb3RvdHlwZS5yZXZlcnNlPXdyYXBwZXJSZXZlcnNlO2xvZGFzaC5wcm90b3R5cGUudG9KU09OPWxvZGFzaC5wcm90b3R5cGUudmFsdWVPZj1sb2Rhc2gucHJvdG90eXBlLnZhbHVlPXdyYXBwZXJWYWx1ZTtsb2Rhc2gucHJvdG90eXBlLmZpcnN0PWxvZGFzaC5wcm90b3R5cGUuaGVhZDtpZihzeW1JdGVyYXRvcilsb2Rhc2gucHJvdG90eXBlW3N5bUl0ZXJhdG9yXT13cmFwcGVyVG9JdGVyYXRvcjtyZXR1cm4gbG9kYXNofTsKdmFyIF89cnVuSW5Db250ZXh0KCk7aWYodHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmdHlwZW9mIGRlZmluZS5hbWQ9PSJvYmplY3QiJiZkZWZpbmUuYW1kKXtyb290Ll89XztkZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gX30pfWVsc2UgaWYoZnJlZU1vZHVsZSl7KGZyZWVNb2R1bGUuZXhwb3J0cz1fKS5fPV87ZnJlZUV4cG9ydHMuXz1ffWVsc2Ugcm9vdC5fPV99KS5jYWxsKHRoaXMpOwovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotc29ydGluZy9zb3J0aW5nLmpzCnZhciByYzsKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoayx0KXtsZXQgbDsoZnVuY3Rpb24obSl7bVttLk5BVFVSQUw9MF09Ik5BVFVSQUwiO21bbS5SRUFMPTFdPSJSRUFMIjttW20uRVhQT05FTlRfU0lHTj0yXT0iRVhQT05FTlRfU0lHTiI7bVttLkVYUE9ORU5UPTNdPSJFWFBPTkVOVCJ9KShsfHwobD17fSkpO2xldCBwPWwuTkFUVVJBTDtmb3IoO3Q8ay5sZW5ndGg7dCsrKWlmKHA9PT1sLk5BVFVSQUwpaWYoIi4iPT09a1t0XSlwPWwuUkVBTDtlbHNlIGlmKCJlIj09PWtbdF18fCJFIj09PWtbdF0pcD1sLkVYUE9ORU5UX1NJR047ZWxzZXtpZighZihrW3RdKSlicmVha31lbHNlIGlmKHA9PT1sLlJFQUwpaWYoImUiPT09a1t0XXx8IkUiPT09a1t0XSlwPWwuRVhQT05FTlRfU0lHTjtlbHNle2lmKCFmKGtbdF0pKWJyZWFrfWVsc2UgaWYocD09PWwuRVhQT05FTlRfU0lHTilpZihmKGtbdF0pfHwiKyI9PT1rW3RdfHwiLSI9PT1rW3RdKXA9bC5FWFBPTkVOVDtlbHNlIGJyZWFrO2Vsc2UgaWYocD09PWwuRVhQT05FTlQmJgohZihrW3RdKSlicmVhaztyZXR1cm4gdH1mdW5jdGlvbiBmKGspe3JldHVybiIwIjw9ayYmIjkiPj1rfWZ1bmN0aW9uIGgoayl7cmV0dXJuIi8iPT09a3x8Il8iPT09a3x8ZihrKX1iLmNvbXBhcmVUYWdOYW1lcz1mdW5jdGlvbihrLHQpe2xldCBsPTAscD0wO2Zvcig7Oyl7aWYobD09PWsubGVuZ3RoKXJldHVybiBwPT09dC5sZW5ndGg/MDotMTtpZihwPT09dC5sZW5ndGgpcmV0dXJuIDE7aWYoZihrW2xdKSYmZih0W3BdKSl7dmFyIG09bCxuPXA7bD1kKGssbCsxKTtwPWQodCxwKzEpO209cGFyc2VGbG9hdChrLnNsaWNlKG0sbCkpO249cGFyc2VGbG9hdCh0LnNsaWNlKG4scCkpO2lmKG08bilyZXR1cm4tMTtpZihtPm4pcmV0dXJuIDF9ZWxzZXtpZihoKGtbbF0pKXtpZighaCh0W3BdKSlyZXR1cm4tMX1lbHNle2lmKGgodFtwXSkpcmV0dXJuIDE7aWYoa1tsXTx0W3BdKXJldHVybi0xO2lmKGtbbF0+dFtwXSlyZXR1cm4gMX1sKys7cCsrfX19fSkocmN8fChyYz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcmVxdWVzdE1hbmFnZXIuanMKdmFyIHZjOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChxLHUseCxBKXtjb25zdCB5PW5ldyBYTUxIdHRwUmVxdWVzdDt5Lm9wZW4ocSx1KTt4JiYoeS53aXRoQ3JlZGVudGlhbHM9eCk7QSYmeS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLEEpO3JldHVybiB5fWZ1bmN0aW9uIGYocSl7Y29uc3QgdT1uZXcgbTtpZighcSlyZXR1cm4gdS5tZXRob2RUeXBlPXAuR0VULHU7dS5tZXRob2RUeXBlPXAuUE9TVDt1LmJvZHk9aChxKTtyZXR1cm4gdX1mdW5jdGlvbiBoKHEpe2NvbnN0IHU9bmV3IEZvcm1EYXRhO2ZvcihsZXQgeCBpbiBxKXgmJnUuYXBwZW5kKHgscVt4XSk7cmV0dXJuIHV9Y2xhc3MgayBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTt0aGlzLm5hbWU9IlJlcXVlc3RDYW5jZWxsYXRpb25FcnJvciJ9fWIuUmVxdWVzdENhbmNlbGxhdGlvbkVycm9yPWs7Y2xhc3MgdCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHEpe3N1cGVyKHEpO3RoaXMubmFtZT0KIkludmFsaWRSZXF1ZXN0T3B0aW9uc0Vycm9yIjtPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyx0LnByb3RvdHlwZSl9fWIuSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3I9dDtjbGFzcyBsIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IocSx1KXtzdXBlcigpO3RoaXMubWVzc2FnZT1gUmVxdWVzdE5ldHdvcmtFcnJvcjogJHtxLnN0YXR1c30gYXQgJHt1fWA7dGhpcy5uYW1lPSJSZXF1ZXN0TmV0d29ya0Vycm9yIjt0aGlzLnJlcT1xO3RoaXMudXJsPXV9fWIuUmVxdWVzdE5ldHdvcmtFcnJvcj1sO2xldCBwOyhmdW5jdGlvbihxKXtxLkdFVD0iR0VUIjtxLlBPU1Q9IlBPU1QifSkocD1iLkh0dHBNZXRob2RUeXBlfHwoYi5IdHRwTWV0aG9kVHlwZT17fSkpO2NsYXNzIG17dmFsaWRhdGUoKXtpZih0aGlzLm1ldGhvZFR5cGU9PT1wLkdFVCYmdGhpcy5ib2R5KXRocm93IG5ldyB0KCJib2R5IG11c3QgYmUgbWlzc2luZyBmb3IgYSBHRVQgcmVxdWVzdC4iKTt9fWIuUmVxdWVzdE9wdGlvbnM9Cm07Y2xhc3Mgbntjb25zdHJ1Y3RvcihxPTFFMyx1PTMpe3RoaXMuX3F1ZXVlPVtdO3RoaXMuX25BY3RpdmVSZXF1ZXN0cz0wO3RoaXMuX25TaW11bHRhbmVvdXNSZXF1ZXN0cz1xO3RoaXMuX21heFJldHJpZXM9dX1yZXF1ZXN0KHEsdSl7dT1mKHUpO3JldHVybiB0aGlzLnJlcXVlc3RXaXRoT3B0aW9ucyhxLHUpfXJlcXVlc3RXaXRoT3B0aW9ucyhxLHUpe3UudmFsaWRhdGUoKTtyZXR1cm4obmV3IFByb21pc2UoKHgsQSk9Pnt0aGlzLl9xdWV1ZS5wdXNoKHtyZXNvbHZlOngscmVqZWN0OkF9KTt0aGlzLmxhdW5jaFJlcXVlc3RzKCl9KSkudGhlbigoKT0+dGhpcy5wcm9taXNlV2l0aFJldHJpZXMocSx0aGlzLl9tYXhSZXRyaWVzLHUpKS50aGVuKHg9Pnt0aGlzLl9uQWN0aXZlUmVxdWVzdHMtLTt0aGlzLmxhdW5jaFJlcXVlc3RzKCk7cmV0dXJuIHh9LHg9PnsiUmVxdWVzdE5ldHdvcmtFcnJvciI9PT14Lm5hbWUmJih0aGlzLl9uQWN0aXZlUmVxdWVzdHMtLSx0aGlzLmxhdW5jaFJlcXVlc3RzKCkpOwpyZXR1cm4gUHJvbWlzZS5yZWplY3QoeCl9KX1mZXRjaChxLHUpe3JldHVybihuZXcgUHJvbWlzZSgoeCxBKT0+e3RoaXMuX3F1ZXVlLnB1c2goe3Jlc29sdmU6eCxyZWplY3Q6QX0pO3RoaXMubGF1bmNoUmVxdWVzdHMoKX0pKS50aGVuKCgpPT57bGV0IHg9MTtyZXR1cm4gbmV3IFByb21pc2UoQT0+e2NvbnN0IHk9KCk9PntmZXRjaChxLHUpLnRoZW4odz0+eyF3Lm9rJiZ0aGlzLl9tYXhSZXRyaWVzPng/KHgrKyx5KCkpOihBKHcpLHRoaXMuX25BY3RpdmVSZXF1ZXN0cy0tLHRoaXMubGF1bmNoUmVxdWVzdHMoKSl9KX07eSgpfSl9KX1jbGVhclF1ZXVlKCl7Zm9yKDswPHRoaXMuX3F1ZXVlLmxlbmd0aDspdGhpcy5fcXVldWUucG9wKCkucmVqZWN0KG5ldyBrKCJSZXF1ZXN0IGNhbmNlbGxlZCBieSBjbGVhclF1ZXVlIikpfWFjdGl2ZVJlcXVlc3RzKCl7cmV0dXJuIHRoaXMuX25BY3RpdmVSZXF1ZXN0c31vdXRzdGFuZGluZ1JlcXVlc3RzKCl7cmV0dXJuIHRoaXMuX25BY3RpdmVSZXF1ZXN0cysKdGhpcy5fcXVldWUubGVuZ3RofWxhdW5jaFJlcXVlc3RzKCl7Zm9yKDt0aGlzLl9uQWN0aXZlUmVxdWVzdHM8dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzJiYwPHRoaXMuX3F1ZXVlLmxlbmd0aDspdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKyssdGhpcy5fcXVldWUucG9wKCkucmVzb2x2ZSgpfXByb21pc2VXaXRoUmV0cmllcyhxLHUseCl7cmV0dXJuIHRoaXMuX3Byb21pc2VGcm9tVXJsKHEseCkudGhlbihBPT5BLEE9PjA8dT90aGlzLnByb21pc2VXaXRoUmV0cmllcyhxLHUtMSx4KTpQcm9taXNlLnJlamVjdChBKSl9X3Byb21pc2VGcm9tVXJsKHEsdSl7cmV0dXJuIG5ldyBQcm9taXNlKCh4LEEpPT57Y29uc3QgeT1kKHUubWV0aG9kVHlwZSxxLHUud2l0aENyZWRlbnRpYWxzLHUuY29udGVudFR5cGUpO3kub25sb2FkPWZ1bmN0aW9uKCl7MjAwPT09eS5zdGF0dXM/eChKU09OLnBhcnNlKHkucmVzcG9uc2VUZXh0KSk6QShuZXcgbCh5LHEpKX07eS5vbmVycm9yPWZ1bmN0aW9uKCl7QShuZXcgbCh5LApxKSl9O3UuYm9keT95LnNlbmQodS5ib2R5KTp5LnNlbmQoKX0pfX1iLlJlcXVlc3RNYW5hZ2VyPW59KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC91cmxQYXRoSGVscGVycy5qcwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChmKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGYpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpfWIuYWRkUGFyYW1zPWZ1bmN0aW9uKGYsaCl7dmFyIGs9T2JqZWN0LmtleXMoaCkuc29ydCgpLmZpbHRlcihsPT52b2lkIDAhPT1oW2xdKTtpZighay5sZW5ndGgpcmV0dXJuIGY7Y29uc3QgdD0tMSE9PWYuaW5kZXhPZigiPyIpPyJceDI2IjoiPyI7az1bXS5jb25jYXQoLi4uay5tYXAobD0+e2NvbnN0IHA9aFtsXTtyZXR1cm4oQXJyYXkuaXNBcnJheShwKT9wOltwXSkubWFwKG09PmAke2x9PSR7ZChtKX1gKX0pKS5qb2luKCJceDI2Iik7cmV0dXJuIGYrdCtrfX0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3JvdXRlci5qcwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZCh0PSJkYXRhIixsPW5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkpeyIvIj09PXRbdC5sZW5ndGgtMV0mJih0PXQuc2xpY2UoMCx0Lmxlbmd0aC0xKSk7cmV0dXJue2Vudmlyb25tZW50OigpPT5mKHQsIi9lbnZpcm9ubWVudCIpLGV4cGVyaW1lbnRzOigpPT5mKHQsIi9leHBlcmltZW50cyIpLHBsdWdpblJvdXRlOihwLG0sbik9PmYodCsiL3BsdWdpbiIsYC8ke3B9JHttfWAsbikscGx1Z2luc0xpc3Rpbmc6KCk9PmYodCwiL3BsdWdpbnNfbGlzdGluZyIsaCh7WyJleHBlcmltZW50YWxQbHVnaW4iXTpsLmdldEFsbCgiZXhwZXJpbWVudGFsUGx1Z2luIil9KSkscnVuczooKT0+Zih0LCIvcnVucyIpLHJ1bnNGb3JFeHBlcmltZW50OnA9PmYodCwiL2V4cGVyaW1lbnRfcnVucyIsaCh7ZXhwZXJpbWVudDpTdHJpbmcocCl9KSl9fWZ1bmN0aW9uIGYodCxsLHA9bmV3IFVSTFNlYXJjaFBhcmFtcyl7dCs9bDtTdHJpbmcocCkmJgoobD1sLmluY2x1ZGVzKCI/Iik/Ilx4MjYiOiI/Iix0Kz1sK1N0cmluZyhwKSk7cmV0dXJuIHR9ZnVuY3Rpb24gaCh0PXt9KXtjb25zdCBsPU9iamVjdC5rZXlzKHQpLnNvcnQoKS5maWx0ZXIobT0+dFttXSkscD1uZXcgVVJMU2VhcmNoUGFyYW1zO2wuZm9yRWFjaChtPT57Y29uc3Qgbj10W21dOyhBcnJheS5pc0FycmF5KG4pP246W25dKS5mb3JFYWNoKHE9PnAuYXBwZW5kKG0scSkpfSk7cmV0dXJuIHB9bGV0IGs9ZCgpO2IuY3JlYXRlUm91dGVyPWQ7Yi5nZXRSb3V0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4ga307Yi5zZXRSb3V0ZXI9ZnVuY3Rpb24odCl7aWYobnVsbD09dCl0aHJvdyBFcnJvcigiUm91dGVyIHJlcXVpcmVkLCBidXQgZ290OiAiK3QpO2s9dH07Yi5jcmVhdGVTZWFyY2hQYXJhbT1ofSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvYmFzZVN0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGgpe3RoaXMubGlzdGVuZXI9aH19Yi5MaXN0ZW5LZXk9ZDtjbGFzcyBme2NvbnN0cnVjdG9yKCl7dGhpcy5yZXF1ZXN0TWFuYWdlcj1uZXcgYi5SZXF1ZXN0TWFuYWdlcigxKTt0aGlzLl9saXN0ZW5lcnM9bmV3IFNldDt0aGlzLmluaXRpYWxpemVkPSExfXJlZnJlc2goKXtyZXR1cm4gdGhpcy5sb2FkKCkudGhlbigoKT0+e3RoaXMuaW5pdGlhbGl6ZWQ9ITB9KX1hZGRMaXN0ZW5lcihoKXtoPW5ldyBkKGgpO3RoaXMuX2xpc3RlbmVycy5hZGQoaCk7cmV0dXJuIGh9cmVtb3ZlTGlzdGVuZXJCeUtleShoKXt0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGgpfWVtaXRDaGFuZ2UoKXt0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaChoPT57dHJ5e2gubGlzdGVuZXIoKX1jYXRjaChrKXt9fSl9fWIuQmFzZVN0b3JlPWZ9KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9lbnZpcm9ubWVudFN0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7bG9hZCgpe2NvbnN0IGY9Yi5nZXRSb3V0ZXIoKS5lbnZpcm9ubWVudCgpO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZikudGhlbihoPT57Y29uc3Qgaz17ZGF0YUxvY2F0aW9uOmguZGF0YV9sb2NhdGlvbix3aW5kb3dUaXRsZTpoLndpbmRvd190aXRsZX07dm9pZCAwIT09aC5leHBlcmltZW50X25hbWUmJihrLmV4cGVyaW1lbnROYW1lPWguZXhwZXJpbWVudF9uYW1lKTt2b2lkIDAhPT1oLmV4cGVyaW1lbnRfZGVzY3JpcHRpb24mJihrLmV4cGVyaW1lbnREZXNjcmlwdGlvbj1oLmV4cGVyaW1lbnRfZGVzY3JpcHRpb24pO3ZvaWQgMCE9PWguY3JlYXRpb25fdGltZSYmKGsuY3JlYXRpb25UaW1lPWguY3JlYXRpb25fdGltZSk7Xy5pc0VxdWFsKHRoaXMuZW52aXJvbm1lbnQsayl8fCh0aGlzLmVudmlyb25tZW50PWssdGhpcy5lbWl0Q2hhbmdlKCkpfSl9Z2V0RGF0YUxvY2F0aW9uKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/CnRoaXMuZW52aXJvbm1lbnQuZGF0YUxvY2F0aW9uOiIifWdldFdpbmRvd1RpdGxlKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC53aW5kb3dUaXRsZToiIn1nZXRFeHBlcmltZW50TmFtZSgpe3JldHVybiB0aGlzLmVudmlyb25tZW50P3RoaXMuZW52aXJvbm1lbnQuZXhwZXJpbWVudE5hbWU6IiJ9Z2V0RXhwZXJpbWVudERlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5leHBlcmltZW50RGVzY3JpcHRpb246IiJ9Z2V0Q3JlYXRpb25UaW1lKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5jcmVhdGlvblRpbWU6bnVsbH19Yi5FbnZpcm9ubWVudFN0b3JlPWQ7Yi5lbnZpcm9ubWVudFN0b3JlPW5ldyBkfSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvZXhwZXJpbWVudHNTdG9yZS5qcwooZnVuY3Rpb24oYil7Y2xhc3MgZCBleHRlbmRzIGIuQmFzZVN0b3Jle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTt0aGlzLl9leHBlcmltZW50cz1bXX1sb2FkKCl7Y29uc3QgZj1iLmdldFJvdXRlcigpLmV4cGVyaW1lbnRzKCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9PntfLmlzRXF1YWwodGhpcy5fZXhwZXJpbWVudHMsaCl8fCh0aGlzLl9leHBlcmltZW50cz1oLHRoaXMuZW1pdENoYW5nZSgpKX0pfWdldEV4cGVyaW1lbnRzKCl7cmV0dXJuIHRoaXMuX2V4cGVyaW1lbnRzLnNsaWNlKCl9fWIuRXhwZXJpbWVudHNTdG9yZT1kO2IuZXhwZXJpbWVudHNTdG9yZT1uZXcgZH0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3J1bnNTdG9yZS5qcwooZnVuY3Rpb24oYil7Y2xhc3MgZCBleHRlbmRzIGIuQmFzZVN0b3Jle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTt0aGlzLl9ydW5zPVtdfWxvYWQoKXtjb25zdCBmPWIuZ2V0Um91dGVyKCkucnVucygpO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZikudGhlbihoPT57Xy5pc0VxdWFsKHRoaXMuX3J1bnMsaCl8fCh0aGlzLl9ydW5zPWgsdGhpcy5lbWl0Q2hhbmdlKCkpfSl9Z2V0UnVucygpe3JldHVybiB0aGlzLl9ydW5zLnNsaWNlKCl9fWIuUnVuc1N0b3JlPWQ7Yi5ydW5zU3RvcmU9bmV3IGR9KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9iYWNrZW5kLmpzCihmdW5jdGlvbihiKXtiLlRZUEVTPVtdO2IuZ2V0UnVuc05hbWVkPWZ1bmN0aW9uKGQpe3JldHVybiBfLmtleXMoZCkuc29ydChyYy5jb21wYXJlVGFnTmFtZXMpfTtiLmdldFRhZ3M9ZnVuY3Rpb24oZCl7cmV0dXJuIF8udW5pb24uYXBwbHkobnVsbCxfLnZhbHVlcyhkKSkuc29ydChyYy5jb21wYXJlVGFnTmFtZXMpfTtiLmZpbHRlclRhZ3M9ZnVuY3Rpb24oZCxmKXtsZXQgaD1bXTtmLmZvckVhY2goaz0+aD1oLmNvbmNhdChkW2tdKSk7cmV0dXJuIF8udW5pcShoKS5zb3J0KHJjLmNvbXBhcmVUYWdOYW1lcyl9fSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvY2FuY2VsbGVyLmpzCihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKCl7dGhpcy5jYW5jZWxsYXRpb25Db3VudD0wfWNhbmNlbGxhYmxlKGYpe2NvbnN0IGg9dGhpcy5jYW5jZWxsYXRpb25Db3VudDtyZXR1cm4gaz0+Zih7dmFsdWU6ayxjYW5jZWxsZWQ6dGhpcy5jYW5jZWxsYXRpb25Db3VudCE9PWh9KX1jYW5jZWxBbGwoKXt0aGlzLmNhbmNlbGxhdGlvbkNvdW50Kyt9fWIuQ2FuY2VsbGVyPWR9KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC90Zi1iYWNrZW5kLXBvbHltZXIuanMKKGZ1bmN0aW9uKGIpe1BvbHltZXIoe2lzOiJ0Zi1iYWNrZW5kIixfdGVtcGxhdGU6bnVsbCx0Zl9iYWNrZW5kOmJ9KX0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXRlZ29yaXphdGlvbi11dGlscy9jYXRlZ29yaXphdGlvblV0aWxzLmpzCnZhciAkYzsKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobSxuKXtjb25zdCBxPSgoKT0+e3RyeXtyZXR1cm4gbmV3IFJlZ0V4cChuKX1jYXRjaCh1KXtyZXR1cm4gbnVsbH19KSgpO3JldHVybntuYW1lOm4sbWV0YWRhdGE6e3R5cGU6cC5TRUFSQ0hfUkVTVUxUUyx2YWxpZFJlZ2V4OiEhcSx1bml2ZXJzYWxSZWdleDoiLioiPT09bn0saXRlbXM6cT9tLmZpbHRlcih1PT51Lm1hdGNoKHEpKTpbXX19ZnVuY3Rpb24gZihtLG49Ii8iKXtjb25zdCBxPVtdLHU9e307bS5mb3JFYWNoKHg9Pnt2YXIgQT14LmluZGV4T2Yobik7QT0wPD1BP3guc2xpY2UoMCxBKTp4O2lmKCF1W0FdKXtjb25zdCB5PXtuYW1lOkEsbWV0YWRhdGE6e3R5cGU6cC5QUkVGSVhfR1JPVVB9LGl0ZW1zOltdfTt1W0FdPXk7cS5wdXNoKHkpfXVbQV0uaXRlbXMucHVzaCh4KX0pO3JldHVybiBxfWZ1bmN0aW9uIGgobSxuPSIiKXtuPVtkKG0sbildO209ZihtKTtyZXR1cm5bXS5jb25jYXQobixtKX1mdW5jdGlvbiBrKG0sbixxKXtjb25zdCB1PQp2Yy5nZXRUYWdzKG0pO3E9aCh1LHEpO2NvbnN0IHg9dChfLnBpY2sobSxuKSk7cmV0dXJuIHEubWFwKCh7bmFtZTpBLG1ldGFkYXRhOnksaXRlbXM6d30pPT4oe25hbWU6QSxtZXRhZGF0YTp5LGl0ZW1zOncubWFwKEM9Pih7dGFnOkMscnVuczooeC5nZXQoQyl8fFtdKS5zbGljZSgpfSkpfSkpfWZ1bmN0aW9uIHQobSl7Y29uc3Qgbj1uZXcgTWFwO09iamVjdC5rZXlzKG0pLmZvckVhY2gocT0+e21bcV0uZm9yRWFjaCh1PT57Y29uc3QgeD1uLmdldCh1KXx8W107eC5wdXNoKHEpO24uc2V0KHUseCl9KX0pO3JldHVybiBufWZ1bmN0aW9uIGwobSxuKXtjb25zdCBxPXJjLmNvbXBhcmVUYWdOYW1lcyhtLnRhZyxuLnRhZyk7cmV0dXJuIDAhPXE/cTpyYy5jb21wYXJlVGFnTmFtZXMobS5ydW4sbi5ydW4pfWxldCBwOyhmdW5jdGlvbihtKXttW20uU0VBUkNIX1JFU1VMVFM9MF09IlNFQVJDSF9SRVNVTFRTIjttW20uUFJFRklYX0dST1VQPTFdPSJQUkVGSVhfR1JPVVAifSkocD1iLkNhdGVnb3J5VHlwZXx8CihiLkNhdGVnb3J5VHlwZT17fSkpO2IuY2F0ZWdvcml6ZUJ5U2VhcmNoUXVlcnk9ZDtiLmNhdGVnb3JpemVCeVByZWZpeD1mO2IuY2F0ZWdvcml6ZT1oO2IuY2F0ZWdvcml6ZVRhZ3M9aztiLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnM9ZnVuY3Rpb24obSxuLHEpe3JldHVybiBrKG0sbixxKS5tYXAoZnVuY3Rpb24odSl7Y29uc3QgeD1fLmZsYXR0ZW4odS5pdGVtcy5tYXAoKHt0YWc6QSxydW5zOnl9KT0+eS5tYXAodz0+KHt0YWc6QSxydW46d30pKSkpO3guc29ydChsKTtyZXR1cm57bmFtZTp1Lm5hbWUsbWV0YWRhdGE6dS5tZXRhZGF0YSxpdGVtczp4fX0pfX0pKCRjfHwoJGM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1nbG9iYWxzL2dsb2JhbHMuanMKdmFyIGFkOyhmdW5jdGlvbihiKXtsZXQgZD0hMTtiLnNldFVzZUhhc2g9ZnVuY3Rpb24oaCl7ZD1ofTtiLnVzZUhhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gZH07bGV0IGY9IiI7Yi5zZXRGYWtlSGFzaD1mdW5jdGlvbihoKXtmPWh9O2IuZ2V0RmFrZUhhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gZn19KShhZHx8KGFkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ2xvYmFscy9nbG9iYWxzLXBvbHltZXIuanMKKGZ1bmN0aW9uKGIpe1BvbHltZXIoe2lzOiJ0Zi1nbG9iYWxzIixfdGVtcGxhdGU6bnVsbCx0Zl9nbG9iYWxzOmJ9KX0pKGFkfHwoYWQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zdG9yYWdlL2xpc3RlbmVycy5qcwp2YXIgcGQ7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGspe3RoaXMubGlzdGVuZXI9a319Yi5MaXN0ZW5LZXk9ZDtjb25zdCBmPW5ldyBTZXQsaD1uZXcgU2V0O3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwoKT0+e2YuZm9yRWFjaChrPT5rLmxpc3RlbmVyKCkpfSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInN0b3JhZ2UiLCgpPT57aC5mb3JFYWNoKGs9PmsubGlzdGVuZXIoKSl9KTtiLmFkZEhhc2hMaXN0ZW5lcj1mdW5jdGlvbihrKXtrPW5ldyBkKGspO2YuYWRkKGspO3JldHVybiBrfTtiLmFkZFN0b3JhZ2VMaXN0ZW5lcj1mdW5jdGlvbihrKXtrPW5ldyBkKGspO2guYWRkKGspO3JldHVybiBrfTtiLmZpcmVTdG9yYWdlQ2hhbmdlZD1mdW5jdGlvbigpe2guZm9yRWFjaChrPT5rLmxpc3RlbmVyKCkpfTtiLnJlbW92ZUhhc2hMaXN0ZW5lckJ5S2V5PWZ1bmN0aW9uKGspe2YuZGVsZXRlKGspfTtiLnJlbW92ZVN0b3JhZ2VMaXN0ZW5lckJ5S2V5PWZ1bmN0aW9uKGspe2guZGVsZXRlKGspfX0pKHBkfHwKKHBkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc3RvcmFnZS9zdG9yYWdlLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKG4scSl7ZnVuY3Rpb24gdSh3LEM9e30pe2NvbnN0IHtkZWZhdWx0VmFsdWU6Rix1c2VMb2NhbFN0b3JhZ2U6RD0hMX09Qzt3PUQ/d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHcpOmwoaCgpKVt3XTtyZXR1cm4gdm9pZCAwPT13P18uY2xvbmVEZWVwKEYpOm4odyl9ZnVuY3Rpb24geCh3LEMsRj17fSl7Y29uc3Qge2RlZmF1bHRWYWx1ZTpELHVzZUxvY2FsU3RvcmFnZTpCPSExLHVzZUxvY2F0aW9uUmVwbGFjZTpJPSExfT1GO0Y9cShDKTtCPyh3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odyxGKSxiLmZpcmVTdG9yYWdlQ2hhbmdlZCgpKTpfLmlzRXF1YWwoQyx1KHcse3VzZUxvY2FsU3RvcmFnZTpCfSkpfHwoXy5pc0VxdWFsKEMsRCk/cCh3KTooQz1sKGgoKSksQ1t3XT1GLGsodChDKSxJKSkpfWNvbnN0IEE9W10seT1bXTtyZXR1cm57Z2V0OnUsc2V0OngsZ2V0SW5pdGlhbGl6ZXI6ZnVuY3Rpb24odyxDKXtjb25zdCBGPU9iamVjdC5hc3NpZ24oe2RlZmF1bHRWYWx1ZTpDLmRlZmF1bHRWYWx1ZSwKcG9seW1lclByb3BlcnR5OncsdXNlTG9jYWxTdG9yYWdlOiExfSxDKTtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBEPWYodGhpcyx3KSxCPSgpPT57Y29uc3QgTj11KEQsRik7Xy5pc0VxdWFsKE4sdGhpc1tGLnBvbHltZXJQcm9wZXJ0eV0pfHwodGhpc1tGLnBvbHltZXJQcm9wZXJ0eV09Til9LEk9KEYudXNlTG9jYWxTdG9yYWdlP2IuYWRkU3RvcmFnZUxpc3RlbmVyOmIuYWRkSGFzaExpc3RlbmVyKSgoKT0+QigpKTtGLnVzZUxvY2FsU3RvcmFnZT95LnB1c2goSSk6QS5wdXNoKEkpO0IoKTtyZXR1cm4gdGhpc1tGLnBvbHltZXJQcm9wZXJ0eV19fSxnZXRPYnNlcnZlcjpmdW5jdGlvbih3LEMpe2NvbnN0IEY9T2JqZWN0LmFzc2lnbih7ZGVmYXVsdFZhbHVlOkMuZGVmYXVsdFZhbHVlLHBvbHltZXJQcm9wZXJ0eTp3LHVzZUxvY2FsU3RvcmFnZTohMX0sQyk7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgRD1mKHRoaXMsdyk7eChELHRoaXNbRi5wb2x5bWVyUHJvcGVydHldLEYpfX0sZGlzcG9zZUJpbmRpbmc6ZnVuY3Rpb24oKXtBLmZvckVhY2godz0+CmIucmVtb3ZlSGFzaExpc3RlbmVyQnlLZXkodykpO3kuZm9yRWFjaCh3PT5iLnJlbW92ZVN0b3JhZ2VMaXN0ZW5lckJ5S2V5KHcpKX19fWZ1bmN0aW9uIGYobixxKXtuPW5bYi5ESVNBTUJJR1VBVE9SXTtyZXR1cm4obnVsbD09bj9bcV06W24scV0pLmpvaW4oIi4iKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGFkLnVzZUhhc2goKT93aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKTphZC5nZXRGYWtlSGFzaCgpfWZ1bmN0aW9uIGsobixxPSExKXthZC51c2VIYXNoKCk/cT93aW5kb3cubG9jYXRpb24ucmVwbGFjZSgiIyIrbik6d2luZG93LmxvY2F0aW9uLmhhc2g9bjphZC5zZXRGYWtlSGFzaChuKX1mdW5jdGlvbiB0KG4pe2xldCBxPSIiO3ZvaWQgMCE9PW5bYi5UQUJdJiYocSs9bltiLlRBQl0pO2NvbnN0IHU9T2JqZWN0LmtleXMobikubWFwKHg9Plt4LG5beF1dKS5maWx0ZXIoeD0+eFswXSE9PWIuVEFCKS5tYXAoeD0+ZW5jb2RlVVJJQ29tcG9uZW50KHhbMF0pKyJceDNkIitlbmNvZGVVUklDb21wb25lbnQoeFsxXSkpLmpvaW4oIlx4MjYiKTsKcmV0dXJuIDA8dS5sZW5ndGg/cSsiXHgyNiIrdTpxfWZ1bmN0aW9uIGwobil7Y29uc3QgcT17fTtuLnNwbGl0KCJceDI2IikuZm9yRWFjaCh1PT57dT11LnNwbGl0KCJceDNkIik7MT09PXUubGVuZ3RoP3FbYi5UQUJdPXVbMF06Mj09PXUubGVuZ3RoJiYocVtkZWNvZGVVUklDb21wb25lbnQodVswXSldPWRlY29kZVVSSUNvbXBvbmVudCh1WzFdKSl9KTtyZXR1cm4gcX1mdW5jdGlvbiBwKG4pe2NvbnN0IHE9bChoKCkpO2RlbGV0ZSBxW25dO2sodChxKSl9Yi5UQUI9Il9fdGFiX18iO2IuRElTQU1CSUdVQVRPUj0iZGlzYW1iaWd1YXRvciI7Yi51cmxEaWN0PWwoaCgpKTtiLmFkZEhhc2hMaXN0ZW5lcigoKT0+e2IudXJsRGljdD1sKGgoKSl9KTt2YXIgbT1kKG49Pm4sbj0+bik7Yi5nZXRTdHJpbmc9bS5nZXQ7Yi5zZXRTdHJpbmc9bS5zZXQ7Yi5nZXRTdHJpbmdJbml0aWFsaXplcj1tLmdldEluaXRpYWxpemVyO2IuZ2V0U3RyaW5nT2JzZXJ2ZXI9bS5nZXRPYnNlcnZlcjtiLmRpc3Bvc2VTdHJpbmdCaW5kaW5nPQptLmRpc3Bvc2VCaW5kaW5nO209ZChuPT4idHJ1ZSI9PT1uPyEwOiJmYWxzZSI9PT1uPyExOnZvaWQgMCxuPT5uLnRvU3RyaW5nKCkpO2IuZ2V0Qm9vbGVhbj1tLmdldDtiLnNldEJvb2xlYW49bS5zZXQ7Yi5nZXRCb29sZWFuSW5pdGlhbGl6ZXI9bS5nZXRJbml0aWFsaXplcjtiLmdldEJvb2xlYW5PYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZUJvb2xlYW5CaW5kaW5nPW0uZGlzcG9zZUJpbmRpbmc7bT1kKG49PituLG49Pm4udG9TdHJpbmcoKSk7Yi5nZXROdW1iZXI9bS5nZXQ7Yi5zZXROdW1iZXI9bS5zZXQ7Yi5nZXROdW1iZXJJbml0aWFsaXplcj1tLmdldEluaXRpYWxpemVyO2IuZ2V0TnVtYmVyT2JzZXJ2ZXI9bS5nZXRPYnNlcnZlcjtiLmRpc3Bvc2VOdW1iZXJCaW5kaW5nPW0uZGlzcG9zZUJpbmRpbmc7bT1kKG49PkpTT04ucGFyc2UoYXRvYihuKSksbj0+YnRvYShKU09OLnN0cmluZ2lmeShuKSkpO2IuZ2V0T2JqZWN0PW0uZ2V0O2Iuc2V0T2JqZWN0PW0uc2V0O2IuZ2V0T2JqZWN0SW5pdGlhbGl6ZXI9Cm0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXRPYmplY3RPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZU9iamVjdEJpbmRpbmc9bS5kaXNwb3NlQmluZGluZztiLm1ha2VCaW5kaW5ncz1kO2IubWlncmF0ZUxlZ2FjeVVSTFNjaGVtZT1mdW5jdGlvbigpe2NvbnN0IG49bmV3IFNldCgiZXhhbXBsZXNQYXRoIGhpZGVNb2RlbFBhbmUyIG1vZGVsTmFtZTEgbW9kZWxOYW1lMiBpbmZlcmVuY2VBZGRyZXNzMSBpbmZlcmVuY2VBZGRyZXNzMiBtb2RlbFR5cGUgbW9kZWxWZXJzaW9uMSBtb2RlbFZlcnNpb24yIG1vZGVsU2lnbmF0dXJlMSBtb2RlbFNpZ25hdHVyZTIgbWF4RXhhbXBsZXMgbGFiZWxWb2NhYlBhdGggbXVsdGlDbGFzcyBzZXF1ZW5jZUV4YW1wbGVzIG1heENsYXNzZXNUb0Rpc3BsYXkgc2FtcGxpbmdPZGRzIHVzZVByZWRpY3RBcGkgcHJlZGljdElucHV0VGVuc29yIHByZWRpY3RPdXRwdXRUZW5zb3IiLnNwbGl0KCIgIikpLHE9bChoKCkpO2lmKCJ3aGF0aWYiPT09cVtiLlRBQl0pZm9yKGxldCB1IG9mIG4pdSBpbgpxJiYocVtgcC53aGF0aWYuJHt1fWBdPXFbdV0pO2sodChxKSk7dGhpcy51cmxEaWN0PXF9fSkocGR8fChwZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXN0b3JhZ2UvdGYtc3RvcmFnZS1wb2x5bWVyLmpzCihmdW5jdGlvbihiKXtQb2x5bWVyKHtpczoidGYtc3RvcmFnZSIsX3RlbXBsYXRlOm51bGwsdGZfc3RvcmFnZTpifSl9KShwZHx8KHBkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2F0ZWdvcml6YXRpb24tdXRpbHMvdGYtdGFnLWZpbHRlcmVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRhZy1maWx0ZXJlciIscHJvcGVydGllczp7dGFnRmlsdGVyOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlVGFnRmlsdGVyKF90YWdGaWx0ZXIpIn0sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6cGQuZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoInRhZ0ZpbHRlciIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITEscG9seW1lclByb3BlcnR5OiJfdGFnRmlsdGVyIn0pLG9ic2VydmVyOiJfdGFnRmlsdGVyT2JzZXJ2ZXIifX0sX3RhZ0ZpbHRlck9ic2VydmVyOnBkLmdldFN0cmluZ09ic2VydmVyKCJ0YWdGaWx0ZXIiLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExLHBvbHltZXJQcm9wZXJ0eToiX3RhZ0ZpbHRlciJ9KSxfY29tcHV0ZVRhZ0ZpbHRlcigpe3JldHVybiB0aGlzLl90YWdGaWx0ZXJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi9hcnJheS11cGRhdGUtaGVscGVyLmpzCnZhciBxZDsoZnVuY3Rpb24oYil7Yi5BcnJheVVwZGF0ZUhlbHBlcj17dXBkYXRlQXJyYXlQcm9wKGQsZixoKXtsZXQgaz10aGlzLmdldChkKTtpZighQXJyYXkuaXNBcnJheShmKSl0aHJvdyBSYW5nZUVycm9yKGBFeHBlY3RlZCBuZXcgdmFsdWUgdG8gJyR7ZH0nIHRvIGJlIGFuIGFycmF5LmApO0FycmF5LmlzQXJyYXkoayl8fChrPVtdLHRoaXMuc2V0KGQsaykpO2NvbnN0IHQ9bmV3IFNldChmLm1hcCgobSxuKT0+aChtLG4pKSk7bGV0IGw9MCxwPTA7Zm9yKDtsPGsubGVuZ3RoJiZwPGYubGVuZ3RoOyl0LmhhcyhoKGtbbF0sbCkpPyhoKGtbbF0sbCk9PWgoZltwXSxwKT90aGlzLnNldChgJHtkfS4ke2x9YCxmW3BdKTp0aGlzLnNwbGljZShkLGwsMCxmW3BdKSxwKyssbCsrKTp0aGlzLnNwbGljZShkLGwsMSk7bDxrLmxlbmd0aCYmdGhpcy5zcGxpY2UoZCxsKTtwPGYubGVuZ3RoJiZ0aGlzLnB1c2goZCwuLi5mLnNsaWNlKHApKX19fSkocWR8fChxZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRhc2hib2FyZC1jb21tb24vdGYtZGFzaGJvYXJkLWxheW91dC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kYXNoYm9hcmQtbGF5b3V0In0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRhc2hib2FyZC1jb21tb24vdGYtb3B0aW9uLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLW9wdGlvbi1zZWxlY3RvciIscHJvcGVydGllczp7bmFtZTpTdHJpbmcsc2VsZWN0ZWRJZDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLG9ic2VydmVyOiJfc2VsZWN0ZWRJZENoYW5nZWQifX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24oYil7dGhpcy5saXN0ZW4oYiwidGFwIiwiX3NlbGVjdFRhcmdldCIpfS5iaW5kKHRoaXMpKX0pfSxfc2VsZWN0VGFyZ2V0OmZ1bmN0aW9uKGIpe3RoaXMuc2VsZWN0ZWRJZD1iLmN1cnJlbnRUYXJnZXQuaWR9LF9zZWxlY3RlZElkQ2hhbmdlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucXVlcnlFZmZlY3RpdmVDaGlsZHJlbigiIyIrdGhpcy5zZWxlY3RlZElkKTtiJiYodGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5jbGFzc0xpc3QucmVtb3ZlKCJzZWxlY3RlZCIpfSksYi5jbGFzc0xpc3QuYWRkKCJzZWxlY3RlZCIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWNvbGxhcHNlL2lyb24tY29sbGFwc2UuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1jb2xsYXBzZSIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcl0scHJvcGVydGllczp7aG9yaXpvbnRhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaG9yaXpvbnRhbENoYW5nZWQifSxvcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIn0sdHJhbnNpdGlvbmluZzp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMH0sbm9BbmltYXRpb246e3R5cGU6Qm9vbGVhbn0sX2Rlc2lyZWRTaXplOnt0eXBlOlN0cmluZyx2YWx1ZToiIn19LGdldCBkaW1lbnNpb24oKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJ3aWR0aCI6ImhlaWdodCJ9LGdldCBfZGltZW5zaW9uTWF4KCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8ibWF4V2lkdGgiOiJtYXhIZWlnaHQifSxnZXQgX2RpbWVuc2lvbk1heENzcygpe3JldHVybiB0aGlzLmhvcml6b250YWw/Im1heC13aWR0aCI6CiJtYXgtaGVpZ2h0In0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6Imdyb3VwIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIn0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uRW5kIn0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9IXRoaXMub3BlbmVkfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9ITB9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sdXBkYXRlU2l6ZTpmdW5jdGlvbihiLGQpe2I9ImF1dG8iPT09Yj8iIjpiO2Q9ZCYmIXRoaXMubm9BbmltYXRpb24mJnRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fZGVzaXJlZFNpemUhPT1iO3RoaXMuX2Rlc2lyZWRTaXplPWI7dGhpcy5fdXBkYXRlVHJhbnNpdGlvbighMSk7ZCYmKGQ9dGhpcy5fY2FsY1NpemUoKSwiIj09PWImJih0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09IiIsYj10aGlzLl9jYWxjU2l6ZSgpKSx0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09ZCx0aGlzLnNjcm9sbFRvcD0KdGhpcy5zY3JvbGxUb3AsdGhpcy5fdXBkYXRlVHJhbnNpdGlvbighMCksZD1iIT09ZCk7dGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPWI7ZHx8dGhpcy5fdHJhbnNpdGlvbkVuZCgpfSxlbmFibGVUcmFuc2l0aW9uOmZ1bmN0aW9uKGIpe1BvbHltZXIuQmFzZS5fd2FybigiYGVuYWJsZVRyYW5zaXRpb24oKWAgaXMgZGVwcmVjYXRlZCwgdXNlIGBub0FuaW1hdGlvbmAgaW5zdGVhZC4iKTt0aGlzLm5vQW5pbWF0aW9uPSFifSxfdXBkYXRlVHJhbnNpdGlvbjpmdW5jdGlvbihiKXt0aGlzLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj1iJiYhdGhpcy5ub0FuaW1hdGlvbj8iIjoiMHMifSxfaG9yaXpvbnRhbENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnRyYW5zaXRpb25Qcm9wZXJ0eT10aGlzLl9kaW1lbnNpb25NYXhDc3M7dGhpcy5zdHlsZVsibWF4V2lkdGgiPT09dGhpcy5fZGltZW5zaW9uTWF4PyJtYXhIZWlnaHQiOiJtYXhXaWR0aCJdPSIiO3RoaXMudXBkYXRlU2l6ZSh0aGlzLm9wZW5lZD8KImF1dG8iOiIwcHgiLCExKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCF0aGlzLm9wZW5lZCk7dGhpcy5fc2V0VHJhbnNpdGlvbmluZyghMCk7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1jbG9zZWQiLCExKTt0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLW9wZW5lZCIsITEpO3RoaXMudXBkYXRlU2l6ZSh0aGlzLm9wZW5lZD8iYXV0byI6IjBweCIsITApO3RoaXMub3BlbmVkJiZ0aGlzLmZvY3VzKCl9LF90cmFuc2l0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPXRoaXMuX2Rlc2lyZWRTaXplO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2UtY2xvc2VkIiwhdGhpcy5vcGVuZWQpO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2Utb3BlbmVkIix0aGlzLm9wZW5lZCk7dGhpcy5fdXBkYXRlVHJhbnNpdGlvbighMSk7dGhpcy5ub3RpZnlSZXNpemUoKTsKdGhpcy5fc2V0VHJhbnNpdGlvbmluZyghMSl9LF9vblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oYil7UG9seW1lci5kb20oYikucm9vdFRhcmdldD09PXRoaXMmJnRoaXMuX3RyYW5zaXRpb25FbmQoKX0sX2NhbGNTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbdGhpcy5kaW1lbnNpb25dKyJweCJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGFnaW5hdGVkLXZpZXcvdGYtZG9tLXJlcGVhdC5odG1sLmpzCnZhciBKZDsKKGZ1bmN0aW9uKGIpe2IuVGZEb21SZXBlYXRCZWhhdmlvcj1bcWQuQXJyYXlVcGRhdGVIZWxwZXIse3Byb3BlcnRpZXM6e2FzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LF9jb250ZW50QWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9kb21Cb290c3RyYXBwZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2N0b3I6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pm51bGx9LF9yZW5kZXJlZEl0ZW1zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3JlbmRlcmVkVGVtcGxhdGVJbnN0Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IE1hcH0sX2xydUNhY2hlZEl0ZW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IE1hcH0sX2NhY2hlU2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTB9LF9nZXRJdGVtS2V5Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT5kPT5KU09OLnN0cmluZ2lmeShkKX19LG9ic2VydmVyczpbIl9ib290c3RyYXBEb20oX2l0ZW1zUmVuZGVyZWQsIGlzQXR0YWNoZWQpIiwiX3VwZGF0ZURvbShfcmVuZGVyZWRJdGVtcy4qLCBfZG9tQm9vdHN0cmFwcGVkKSIsCiJfdXBkYXRlQWN0aXZlKF9jb250ZW50QWN0aXZlKSIsIl90cmltQ2FjaGUoX2NhY2hlU2l6ZSkiXSxzZXRDYWNoZVNpemUoZCl7dGhpcy5fY2FjaGVTaXplPWR9LHNldEdldEl0ZW1LZXkoZCl7dGhpcy5fZ2V0SXRlbUtleT1kfSx1cGRhdGVEb20oZCl7dGhpcy51cGRhdGVBcnJheVByb3AoIl9yZW5kZXJlZEl0ZW1zIixkLHRoaXMuX2dldEl0ZW1LZXkpfSxfZW5zdXJlVGVtcGxhdGl6ZWQoKXtpZighdGhpcy5pc0F0dGFjaGVkKXJldHVybiExO3RoaXMuX2N0b3J8fCh0aGlzLl9jdG9yPVBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRoaXMucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKSx0aGlzLHtwYXJlbnRNb2RlbDohMCxpbnN0YW5jZVByb3BzOntbdGhpcy5hc106ITAsYWN0aXZlOnRoaXMuX2NvbnRlbnRBY3RpdmV9LGZvcndhcmRIb3N0UHJvcDpmdW5jdGlvbihkLGYpe3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmZvckVhY2goaD0+e2guZm9yd2FyZEhvc3RQcm9wKGQsCmYpfSl9fSkpO3JldHVybiEwfSxfYm9vdHN0cmFwRG9tKCl7dGhpcy5faXRlbXNSZW5kZXJlZCYmdGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKSYmIXRoaXMuX2RvbUJvb3RzdHJhcHBlZCYmKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikuZm9yRWFjaChkPT57UG9seW1lci5kb20odGhpcykucmVtb3ZlQ2hpbGQoZCl9KSx0aGlzLl9scnVDYWNoZWRJdGVtcy5jbGVhcigpLHRoaXMuX3JlbmRlcmVkSXRlbXMuZm9yRWFjaCgoZCxmKT0+dGhpcy5faW5zZXJ0SXRlbShkLGYpKSx0aGlzLl9kb21Cb290c3RyYXBwZWQ9ITApfSxfdXBkYXRlQWN0aXZlKCl7dGhpcy5fZG9tQm9vdHN0cmFwcGVkJiZBcnJheS5mcm9tKHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LnZhbHVlcygpKS5mb3JFYWNoKGQ9PntkLm5vdGlmeVBhdGgoImFjdGl2ZSIsdGhpcy5fY29udGVudEFjdGl2ZSl9KX0sX3VwZGF0ZURvbShkKXtpZih0aGlzLl9kb21Cb290c3RyYXBwZWQmJiJfcmVuZGVyZWRJdGVtcyIhPWQucGF0aCYmCiJfcmVuZGVyZWRJdGVtcy5sZW5ndGgiIT1kLnBhdGgpaWYoIl9yZW5kZXJlZEl0ZW1zLnNwbGljZXMiPT09ZC5wYXRoKWQudmFsdWUuaW5kZXhTcGxpY2VzLmZvckVhY2goZj0+e2NvbnN0IGg9Zi5pbmRleCxrPWYuYWRkZWRDb3VudCx0PWYub2JqZWN0O2YucmVtb3ZlZC5mb3JFYWNoKGw9Pnt0aGlzLl9yZW1vdmVJdGVtKGwsdGhpcy5jaGlsZHJlbltoXSl9KTt0LnNsaWNlKGgsaCtrKS5mb3JFYWNoKChsLHApPT50aGlzLl9pbnNlcnRJdGVtKGwsaCtwKSk7dGhpcy5fdHJpbUNhY2hlKCl9KTtlbHNle2NvbnN0IGY9dGhpcy5fZ2V0SXRlbUtleShkLnZhbHVlKTt0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5oYXMoZik/dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KGYpLm5vdGlmeVBhdGgodGhpcy5hcyxkLnZhbHVlKTpjb25zb2xlLndhcm4oYEV4cGVjdGVkICcke2Z9JyB0byBleGlzdCBpbiB0aGUgRE9NIGJ1dCBgKyJjb3VsZCBub3QgZmluZCBvbmUuIil9fSxfaW5zZXJ0SXRlbShkLApmKXtpZighdGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKSl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdGVtcGxhdGl6ZWQgYmVmb3JlIGluc2VydGluZyBhbiBpdGVtIik7Y29uc3QgaD10aGlzLl9nZXRJdGVtS2V5KGQpO2lmKHRoaXMuX2xydUNhY2hlZEl0ZW1zLmhhcyhoKSlkPXRoaXMuX2xydUNhY2hlZEl0ZW1zLmdldChoKSx0aGlzLl9scnVDYWNoZWRJdGVtcy5kZWxldGUoaCksdGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KGgpLm5vdGlmeVBhdGgoImFjdGl2ZSIsdGhpcy5fY29udGVudEFjdGl2ZSk7ZWxzZXtjb25zdCBrPW5ldyB0aGlzLl9jdG9yKHtbdGhpcy5hc106ZCxhY3RpdmU6dGhpcy5fY29udGVudEFjdGl2ZX0pO2Q9ay5yb290O3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LnNldChoLGspfXRoaXMuY2hpbGRyZW5bZl0/UG9seW1lci5kb20odGhpcykuaW5zZXJ0QmVmb3JlKGQsdGhpcy5jaGlsZHJlbltmXSk6KChkLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/CkFycmF5LmZyb20oZC5jaGlsZHJlbik6W2RdKS5mb3JFYWNoKGs9Pmsuc2V0QXR0cmlidXRlKCJzbG90IiwiaXRlbXMiKSksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQoZCkpfSxfcmVtb3ZlSXRlbShkLGYpe1BvbHltZXIuZG9tKGYucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQoZik7ZD10aGlzLl9nZXRJdGVtS2V5KGQpO3RoaXMuX2xydUNhY2hlZEl0ZW1zLnNldChkLGYpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmdldChkKS5ub3RpZnlQYXRoKCJhY3RpdmUiLCExKX0sX3RyaW1DYWNoZSgpe2Zvcig7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuc2l6ZT50aGlzLl9jYWNoZVNpemU7KXtjb25zdCBbZF09dGhpcy5fbHJ1Q2FjaGVkSXRlbXMua2V5cygpO3RoaXMuX2xydUNhY2hlZEl0ZW1zLmRlbGV0ZShkKTt0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5kZWxldGUoZCl9fX1dfSkoSmR8fChKZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3BhZ2luYXRlZFZpZXdTdG9yZS5qcwp2YXIgbmU7CihmdW5jdGlvbihiKXtsZXQgZD1udWxsO2NvbnN0IGY9bmV3IFNldDtiLmFkZExpbWl0TGlzdGVuZXI9ZnVuY3Rpb24oaCl7Zi5hZGQoaCl9O2IucmVtb3ZlTGltaXRMaXN0ZW5lcj1mdW5jdGlvbihoKXtmLmRlbGV0ZShoKX07Yi5nZXRMaW1pdD1mdW5jdGlvbigpe251bGw9PWQmJihkPXBkLmdldE51bWJlcigiVEYuVGVuc29yQm9hcmQuUGFnaW5hdGVkVmlldy5saW1pdCIse3VzZUxvY2FsU3RvcmFnZTohMH0pLG51bGw9PWR8fCFpc0Zpbml0ZShkKXx8MD49ZCkmJihkPTEyKTtyZXR1cm4gZH07Yi5zZXRMaW1pdD1mdW5jdGlvbihoKXtpZihoIT09TWF0aC5mbG9vcihoKSl0aHJvdyBFcnJvcihgbGltaXQgbXVzdCBiZSBhbiBpbnRlZ2VyLCBidXQgZ290OiAke2h9YCk7aWYoMD49aCl0aHJvdyBFcnJvcihgbGltaXQgbXVzdCBiZSBwb3NpdGl2ZSwgYnV0IGdvdDogJHtofWApO2ghPT1kJiYoZD1oLHBkLnNldE51bWJlcigiVEYuVGVuc29yQm9hcmQuUGFnaW5hdGVkVmlldy5saW1pdCIsZCwKe3VzZUxvY2FsU3RvcmFnZTohMH0pLGYuZm9yRWFjaChrPT57aygpfSkpfX0pKG5lfHwobmU9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wYWdpbmF0ZWQtdmlldy90Zi1wYWdpbmF0ZWQtdmlldy1zdG9yZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wYWdpbmF0ZWQtdmlldy1zdG9yZSIsX3RlbXBsYXRlOm51bGwsdGZfcGFnaW5hdGVkX3ZpZXc6bmV9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wYWdpbmF0ZWQtdmlldy90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyIscHJvcGVydGllczp7Y2F0ZWdvcnk6T2JqZWN0LGluaXRpYWxPcGVuZWQ6Qm9vbGVhbixvcGVuZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITB9LF9jb250ZW50QWN0aXZlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQ29udGVudEFjdGl2ZShvcGVuZWQpIn0sZGlzYWJsZVBhZ2luYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NvdW50Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVDb3VudChjYXRlZ29yeS5pdGVtcy4qKSJ9LF9oYXNNdWx0aXBsZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlKF9jb3VudCkifSxfcGFuZVJlbmRlcmVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlUGFuZVJlbmRlcmVkKGNhdGVnb3J5KSIsb2JzZXJ2ZXI6Il9vblBhbmVSZW5kZXJlZENoYW5nZWQifSxfaXRlbXNSZW5kZXJlZDp7dHlwZTpCb29sZWFuLApjb21wdXRlZDoiX2NvbXB1dGVJdGVtc1JlbmRlcmVkKG9wZW5lZCwgX3BhbmVSZW5kZXJlZCkifSxfaXNTZWFyY2hSZXN1bHRzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNTZWFyY2hSZXN1bHRzKGNhdGVnb3J5Lm1ldGFkYXRhLnR5cGUpIn0sX2lzSW52YWxpZFNlYXJjaFJlc3VsdHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc0ludmFsaWRTZWFyY2hSZXN1bHRzKGNhdGVnb3J5Lm1ldGFkYXRhKSJ9LF9pc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNVbml2ZXJzYWxTZWFyY2hRdWVyeShjYXRlZ29yeS5tZXRhZGF0YSkifSxnZXRDYXRlZ29yeUl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmI9PkpTT04uc3RyaW5naWZ5KGIpLG9ic2VydmVyOiJfZ2V0Q2F0ZWdvcnlJdGVtS2V5Q2hhbmdlZCJ9LF9saW1pdDp7dHlwZTpOdW1iZXIsdmFsdWU6MTIsb2JzZXJ2ZXI6Il9saW1pdENoYW5nZWQifSwKX2FjdGl2ZUluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfY3VycmVudFBhZ2U6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRQYWdlKF9saW1pdCwgX2FjdGl2ZUluZGV4KSJ9LF9wYWdlQ291bnQ6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VDb3VudChjYXRlZ29yeS5pdGVtcy4qLCBfbGltaXQpIn0sX211bHRpcGxlUGFnZXNFeGlzdDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZU11bHRpcGxlUGFnZXNFeGlzdChfcGFnZUNvdW50LCBkaXNhYmxlUGFnaW5hdGlvbikifSxfaGFzUHJldmlvdXNQYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzUHJldmlvdXNQYWdlKF9jdXJyZW50UGFnZSkifSxfaGFzTmV4dFBhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNOZXh0UGFnZShfY3VycmVudFBhZ2UsIF9wYWdlQ291bnQpIn0sX2lucHV0V2lkdGg6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUlucHV0V2lkdGgoX3BhZ2VDb3VudCkiLApvYnNlcnZlcjoiX3VwZGF0ZUlucHV0V2lkdGgifSxfcGFnZUlucHV0VmFsdWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VJbnB1dFZhbHVlKF9wYWdlSW5wdXRGb2N1c2VkLCBfcGFnZUlucHV0UmF3VmFsdWUsIF9jdXJyZW50UGFnZSkiLG9ic2VydmVyOiJfdXBkYXRlUGFnZUlucHV0VmFsdWUifSxfcGFnZUlucHV0UmF3VmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfcGFnZUlucHV0Rm9jdXNlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsiX2NsYW1wQWN0aXZlSW5kZXgoY2F0ZWdvcnkuaXRlbXMuKikiLCJfdXBkYXRlUmVuZGVyZWRJdGVtcyhfaXRlbXNSZW5kZXJlZCwgY2F0ZWdvcnkuaXRlbXMuKiwgX2xpbWl0LCBfYWN0aXZlSW5kZXgsIF9wYWdlQ291bnQsIGRpc2FibGVQYWdpbmF0aW9uKSJdLGJlaGF2aW9yczpbSmQuVGZEb21SZXBlYXRCZWhhdmlvcl0sX2NvbXB1dGVDb3VudCgpe3JldHVybiB0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aH0sCl9jb21wdXRlSGFzTXVsdGlwbGUoKXtyZXR1cm4gMTx0aGlzLl9jb3VudH0sX3RvZ2dsZVBhbmUoKXt0aGlzLl9zZXRPcGVuZWQoIXRoaXMub3BlbmVkKX0sX2NvbXB1dGVDb250ZW50QWN0aXZlKCl7cmV0dXJuIHRoaXMub3BlbmVkfSxfb25QYW5lUmVuZGVyZWRDaGFuZ2VkKGIsZCl7YiYmYiE9PWQmJnRoaXMuJC5pZlJlbmRlcmVkLnJlbmRlcigpfSxfY29tcHV0ZVBhbmVSZW5kZXJlZChiKXtyZXR1cm4hKGIubWV0YWRhdGEudHlwZT09PSRjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUyYmIiI9PT1iLm5hbWUpfSxfY29tcHV0ZUl0ZW1zUmVuZGVyZWQoKXtyZXR1cm4gdGhpcy5fcGFuZVJlbmRlcmVkJiZ0aGlzLm9wZW5lZH0sX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoYil7cmV0dXJuIGI9PT0kYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFN9LF9jb21wdXRlSXNJbnZhbGlkU2VhcmNoUmVzdWx0cyhiKXtyZXR1cm4gYi50eXBlPT09JGMuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTJiYKIWIudmFsaWRSZWdleH0sX2NvbXB1dGVJc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5KGIpe3JldHVybiBiLnR5cGU9PT0kYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFMmJmIudW5pdmVyc2FsUmVnZXh9LF9pc0NvbXBvc2l0ZVNlYXJjaCgpe2NvbnN0IGI9dGhpcy5jYXRlZ29yeS5tZXRhZGF0YS50eXBlO3JldHVybiB0aGlzLmNhdGVnb3J5Lm1ldGFkYXRhLmNvbXBvc2l0ZVNlYXJjaCYmYj09PSRjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUU30scmVhZHkoKXt0aGlzLl9zZXRPcGVuZWQobnVsbD09dGhpcy5pbml0aWFsT3BlbmVkPyEwOnRoaXMuaW5pdGlhbE9wZW5lZCk7dGhpcy5fbGltaXRMaXN0ZW5lcj0oKT0+e3RoaXMuc2V0KCJfbGltaXQiLG5lLmdldExpbWl0KCkpfTtuZS5hZGRMaW1pdExpc3RlbmVyKHRoaXMuX2xpbWl0TGlzdGVuZXIpO3RoaXMuX2xpbWl0TGlzdGVuZXIoKX0sZGV0YWNoZWQoKXtuZS5yZW1vdmVMaW1pdExpc3RlbmVyKHRoaXMuX2xpbWl0TGlzdGVuZXIpfSwKX3VwZGF0ZVJlbmRlcmVkSXRlbXMoYixkLGYsaCxrLHQpe2ImJihiPU1hdGguZmxvb3IoaC9mKSxkPXRoaXMuY2F0ZWdvcnkuaXRlbXN8fFtdLHRoaXMudXBkYXRlRG9tKHQ/ZDpkLnNsaWNlKGIqZiwoYisxKSpmKSx0aGlzLmdldENhdGVnb3J5SXRlbUtleSkpfSxfbGltaXRDaGFuZ2VkKGIpe3RoaXMuc2V0Q2FjaGVTaXplKDIqYil9LF9nZXRDYXRlZ29yeUl0ZW1LZXlDaGFuZ2VkKCl7dGhpcy5zZXRHZXRJdGVtS2V5KHRoaXMuZ2V0Q2F0ZWdvcnlJdGVtS2V5KX0sX2NvbXB1dGVDdXJyZW50UGFnZShiLGQpe3JldHVybiBNYXRoLmZsb29yKGQvYikrMX0sX2NvbXB1dGVQYWdlQ291bnQoYixkKXtyZXR1cm4gdGhpcy5jYXRlZ29yeT9NYXRoLmNlaWwodGhpcy5jYXRlZ29yeS5pdGVtcy5sZW5ndGgvZCk6MH0sX2NvbXB1dGVNdWx0aXBsZVBhZ2VzRXhpc3QoYixkKXtyZXR1cm4hZCYmMTxifSxfY29tcHV0ZUhhc1ByZXZpb3VzUGFnZShiKXtyZXR1cm4gMTxifSxfY29tcHV0ZUhhc05leHRQYWdlKGIsCmQpe3JldHVybiBiPGR9LF9jb21wdXRlSW5wdXRXaWR0aChiKXtyZXR1cm5gY2FsYygke2IudG9TdHJpbmcoKS5sZW5ndGh9ZW0gKyAyMHB4KWB9LF9zZXRBY3RpdmVJbmRleChiKXtjb25zdCBkPSh0aGlzLmNhdGVnb3J5Lml0ZW1zfHxbXSkubGVuZ3RoLTE7Yj5kJiYoYj1kKTswPmImJihiPTApO3RoaXMuc2V0KCJfYWN0aXZlSW5kZXgiLGIpfSxfY2xhbXBBY3RpdmVJbmRleCgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4KX0sX3BlcmZvcm1QcmV2aW91c1BhZ2UoKXt0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9hY3RpdmVJbmRleC10aGlzLl9saW1pdCl9LF9wZXJmb3JtTmV4dFBhZ2UoKXt0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9hY3RpdmVJbmRleCt0aGlzLl9saW1pdCl9LF9jb21wdXRlUGFnZUlucHV0VmFsdWUoYixkLGYpe3JldHVybiBiP2Q6Zi50b1N0cmluZygpfSxfaGFuZGxlUGFnZUlucHV0RXZlbnQoYil7dGhpcy5zZXQoIl9wYWdlSW5wdXRSYXdWYWx1ZSIsCmIudGFyZ2V0LnZhbHVlKTtiPU51bWJlcihiLnRhcmdldC52YWx1ZXx8TmFOKTtpc05hTihiKXx8dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fbGltaXQqKE1hdGgubWF4KDEsTWF0aC5taW4oYix0aGlzLl9wYWdlQ291bnQpKS0xKSl9LF9oYW5kbGVQYWdlQ2hhbmdlRXZlbnQoKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIix0aGlzLl9jdXJyZW50UGFnZS50b1N0cmluZygpKX0sX2hhbmRsZVBhZ2VGb2N1c0V2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRSYXdWYWx1ZSIsdGhpcy5fcGFnZUlucHV0VmFsdWUpO3RoaXMuc2V0KCJfcGFnZUlucHV0Rm9jdXNlZCIsITApfSxfaGFuZGxlUGFnZUJsdXJFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0Rm9jdXNlZCIsITEpfSxfdXBkYXRlUGFnZUlucHV0VmFsdWUoYil7Y29uc3QgZD10aGlzLiQkKCIjcGFnZS1pbnB1dCBpbnB1dCIpO2QmJihkLnZhbHVlPWIpfSxfdXBkYXRlSW5wdXRXaWR0aCgpe3RoaXMudXBkYXRlU3R5bGVzKHsiLS10Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy1wYWdlLWlucHV0LXdpZHRoIjp0aGlzLl9pbnB1dFdpZHRofSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItZGlhbG9nLWJlaGF2aW9yL3BhcGVyLWRpYWxvZy1iZWhhdmlvci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvckltcGw9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJkaWFsb2ciLHRhYmluZGV4OiItMSJ9LHByb3BlcnRpZXM6e21vZGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9fcmVhZGllZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsiX21vZGFsQ2hhbmdlZChtb2RhbCwgX19yZWFkaWVkKSJdLGxpc3RlbmVyczp7dGFwOiJfb25EaWFsb2dDbGljayJ9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljazt0aGlzLl9fcHJldk5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uRXNjS2V5O3RoaXMuX19wcmV2V2l0aEJhY2tkcm9wPXRoaXMud2l0aEJhY2tkcm9wO3RoaXMuX19yZWFkaWVkPSEwfSxfbW9kYWxDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmKGI/KHRoaXMuX19wcmV2Tm9DYW5jZWxPbk91dHNpZGVDbGljaz0KdGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrLHRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXksdGhpcy5fX3ByZXZXaXRoQmFja2Ryb3A9dGhpcy53aXRoQmFja2Ryb3AsdGhpcy53aXRoQmFja2Ryb3A9dGhpcy5ub0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljaz0hMCk6KHRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljaz10aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2smJnRoaXMuX19wcmV2Tm9DYW5jZWxPbk91dHNpZGVDbGljayx0aGlzLm5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uRXNjS2V5JiZ0aGlzLl9fcHJldk5vQ2FuY2VsT25Fc2NLZXksdGhpcy53aXRoQmFja2Ryb3A9dGhpcy53aXRoQmFja2Ryb3AmJnRoaXMuX19wcmV2V2l0aEJhY2tkcm9wKSl9LF91cGRhdGVDbG9zaW5nUmVhc29uQ29uZmlybWVkOmZ1bmN0aW9uKGIpe3RoaXMuY2xvc2luZ1JlYXNvbj10aGlzLmNsb3NpbmdSZWFzb258fAp7fTt0aGlzLmNsb3NpbmdSZWFzb24uY29uZmlybWVkPWJ9LF9vbkRpYWxvZ0NsaWNrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZD1Qb2x5bWVyLmRvbShiKS5wYXRoLGY9MCxoPWQuaW5kZXhPZih0aGlzKTtmPGg7ZisrKXt2YXIgaz1kW2ZdO2lmKGsuaGFzQXR0cmlidXRlJiYoay5oYXNBdHRyaWJ1dGUoImRpYWxvZy1kaXNtaXNzIil8fGsuaGFzQXR0cmlidXRlKCJkaWFsb2ctY29uZmlybSIpKSl7dGhpcy5fdXBkYXRlQ2xvc2luZ1JlYXNvbkNvbmZpcm1lZChrLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWNvbmZpcm0iKSk7dGhpcy5jbG9zZSgpO2Iuc3RvcFByb3BhZ2F0aW9uKCk7YnJlYWt9fX19O1BvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvcj1bUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yLFBvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvckltcGxdfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1kaWFsb2cvcGFwZXItZGlhbG9nLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWRpYWxvZyIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3IsUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JdLGxpc3RlbmVyczp7Im5lb24tYW5pbWF0aW9uLWZpbmlzaCI6Il9vbk5lb25BbmltYXRpb25GaW5pc2gifSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxBbmltYXRpb24oKTt0aGlzLnBsYXlBbmltYXRpb24oImVudHJ5Iil9LF9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEFuaW1hdGlvbigpO3RoaXMucGxheUFuaW1hdGlvbigiZXhpdCIpfSxfb25OZW9uQW5pbWF0aW9uRmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9fSk7CgovLyBodHRwczovL2QzanMub3JnIHY1LjcuMCBDb3B5cmlnaHQgMjAxOCBNaWtlIEJvc3RvY2sKIWZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9uKGV4cG9ydHMpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZXhwb3J0cyJdLG4pOm4odC5kMz10LmQzfHx7fSl9KHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxuKXtyZXR1cm4gdDxuPy0xOnQ+bj8xOnQ+PW4/MDpOYU59ZnVuY3Rpb24gZSh0KXt2YXIgZTtyZXR1cm4gMT09PXQubGVuZ3RoJiYoZT10LHQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbihlKHQpLHIpfSkse2xlZnQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKTwwP3I9bysxOmk9b31yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKT4wP2k9bzpyPW8rMX1yZXR1cm4gcn19fXZhciByPWUobiksaT1yLnJpZ2h0LG89ci5sZWZ0O2Z1bmN0aW9uIGEodCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9ZnVuY3Rpb24gZih0LG4pe3ZhciBlLHIsaT10Lmxlbmd0aCxvPTAsYT0tMSxmPTAsYz0wO2lmKG51bGw9PW4pZm9yKDsrK2E8aTspaXNOYU4oZT11KHRbYV0pKXx8KGMrPShyPWUtZikqKGUtKGYrPXIvKytvKSkpO2Vsc2UgZm9yKDsrK2E8aTspaXNOYU4oZT11KG4odFthXSxhLHQpKSl8fChjKz0ocj1lLWYpKihlLShmKz1yLysrbykpKTtpZihvPjEpcmV0dXJuIGMvKG8tMSl9ZnVuY3Rpb24gYyh0LG4pe3ZhciBlPWYodCxuKTtyZXR1cm4gZT9NYXRoLnNxcnQoZSk6ZX1mdW5jdGlvbiBzKHQsbil7dmFyIGUscixpLG89dC5sZW5ndGgsYT0tMTtpZihudWxsPT1uKXtmb3IoOysrYTxvOylpZihudWxsIT0oZT10W2FdKSYmZT49ZSlmb3Iocj1pPWU7KythPG87KW51bGwhPShlPXRbYV0pJiYocj5lJiYocj1lKSxpPGUmJihpPWUpKX1lbHNlIGZvcig7KythPG87KWlmKG51bGwhPShlPW4odFthXSxhLHQpKSYmZT49ZSlmb3Iocj1pPWU7KythPG87KW51bGwhPShlPW4odFthXSxhLHQpKSYmKHI+ZSYmKHI9ZSksaTxlJiYoaT1lKSk7cmV0dXJuW3IsaV19dmFyIGw9QXJyYXkucHJvdG90eXBlLGg9bC5zbGljZSxkPWwubWFwO2Z1bmN0aW9uIHAodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHYodCl7cmV0dXJuIHR9ZnVuY3Rpb24gZyh0LG4sZSl7dD0rdCxuPStuLGU9KGk9YXJndW1lbnRzLmxlbmd0aCk8Mj8obj10LHQ9MCwxKTppPDM/MTorZTtmb3IodmFyIHI9LTEsaT0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChuLXQpL2UpKSxvPW5ldyBBcnJheShpKTsrK3I8aTspb1tyXT10K3IqZTtyZXR1cm4gb312YXIgeT1NYXRoLnNxcnQoNTApLF89TWF0aC5zcXJ0KDEwKSxiPU1hdGguc3FydCgyKTtmdW5jdGlvbiBtKHQsbixlKXt2YXIgcixpLG8sYSx1PS0xO2lmKGU9K2UsKHQ9K3QpPT09KG49K24pJiZlPjApcmV0dXJuW3RdO2lmKChyPW48dCkmJihpPXQsdD1uLG49aSksMD09PShhPXgodCxuLGUpKXx8IWlzRmluaXRlKGEpKXJldHVybltdO2lmKGE+MClmb3IodD1NYXRoLmNlaWwodC9hKSxuPU1hdGguZmxvb3Iobi9hKSxvPW5ldyBBcnJheShpPU1hdGguY2VpbChuLXQrMSkpOysrdTxpOylvW3VdPSh0K3UpKmE7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqYSksbj1NYXRoLmNlaWwobiphKSxvPW5ldyBBcnJheShpPU1hdGguY2VpbCh0LW4rMSkpOysrdTxpOylvW3VdPSh0LXUpL2E7cmV0dXJuIHImJm8ucmV2ZXJzZSgpLG99ZnVuY3Rpb24geCh0LG4sZSl7dmFyIHI9KG4tdCkvTWF0aC5tYXgoMCxlKSxpPU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjEwKSxvPXIvTWF0aC5wb3coMTAsaSk7cmV0dXJuIGk+PTA/KG8+PXk/MTA6bz49Xz81Om8+PWI/MjoxKSpNYXRoLnBvdygxMCxpKTotTWF0aC5wb3coMTAsLWkpLyhvPj15PzEwOm8+PV8/NTpvPj1iPzI6MSl9ZnVuY3Rpb24gdyh0LG4sZSl7dmFyIHI9TWF0aC5hYnMobi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApKSxvPXIvaTtyZXR1cm4gbz49eT9pKj0xMDpvPj1fP2kqPTU6bz49YiYmKGkqPTIpLG48dD8taTppfWZ1bmN0aW9uIE0odCl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIpKzF9ZnVuY3Rpb24gQSh0LG4sZSl7aWYobnVsbD09ZSYmKGU9dSkscj10Lmxlbmd0aCl7aWYoKG49K24pPD0wfHxyPDIpcmV0dXJuK2UodFswXSwwLHQpO2lmKG4+PTEpcmV0dXJuK2UodFtyLTFdLHItMSx0KTt2YXIgcixpPShyLTEpKm4sbz1NYXRoLmZsb29yKGkpLGE9K2UodFtvXSxvLHQpO3JldHVybiBhKygrZSh0W28rMV0sbysxLHQpLWEpKihpLW8pfX1mdW5jdGlvbiBUKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89LTE7aWYobnVsbD09bil7Zm9yKDsrK288aTspaWYobnVsbCE9KGU9dFtvXSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9dFtvXSkmJmU+ciYmKHI9ZSl9ZWxzZSBmb3IoOysrbzxpOylpZihudWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9bih0W29dLG8sdCkpJiZlPnImJihyPWUpO3JldHVybiByfWZ1bmN0aW9uIE4odCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89LTEsYT0wOysrbzxpOylhKz10W29dLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSk7LS1pPj0wOylmb3Iobj0ocj10W2ldKS5sZW5ndGg7LS1uPj0wOyllWy0tYV09cltuXTtyZXR1cm4gZX1mdW5jdGlvbiBTKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89LTE7aWYobnVsbD09bil7Zm9yKDsrK288aTspaWYobnVsbCE9KGU9dFtvXSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9dFtvXSkmJnI+ZSYmKHI9ZSl9ZWxzZSBmb3IoOysrbzxpOylpZihudWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9bih0W29dLG8sdCkpJiZyPmUmJihyPWUpO3JldHVybiByfWZ1bmN0aW9uIEUodCl7aWYoIShpPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIG49LTEsZT1TKHQsaykscj1uZXcgQXJyYXkoZSk7KytuPGU7KWZvcih2YXIgaSxvPS0xLGE9cltuXT1uZXcgQXJyYXkoaSk7KytvPGk7KWFbb109dFtvXVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBrKHQpe3JldHVybiB0Lmxlbmd0aH12YXIgQz1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gUCh0KXtyZXR1cm4gdH12YXIgej0xLFI9MixMPTMsRD00LFU9MWUtNjtmdW5jdGlvbiBxKHQpe3JldHVybiJ0cmFuc2xhdGUoIisodCsuNSkrIiwwKSJ9ZnVuY3Rpb24gTyh0KXtyZXR1cm4idHJhbnNsYXRlKDAsIisodCsuNSkrIikifWZ1bmN0aW9uIFkoKXtyZXR1cm4hdGhpcy5fX2F4aXN9ZnVuY3Rpb24gQih0LG4pe3ZhciBlPVtdLHI9bnVsbCxpPW51bGwsbz02LGE9Nix1PTMsZj10PT09enx8dD09PUQ/LTE6MSxjPXQ9PT1EfHx0PT09Uj8ieCI6InkiLHM9dD09PXp8fHQ9PT1MP3E6TztmdW5jdGlvbiBsKGwpe3ZhciBoPW51bGw9PXI/bi50aWNrcz9uLnRpY2tzLmFwcGx5KG4sZSk6bi5kb21haW4oKTpyLGQ9bnVsbD09aT9uLnRpY2tGb3JtYXQ/bi50aWNrRm9ybWF0LmFwcGx5KG4sZSk6UDppLHA9TWF0aC5tYXgobywwKSt1LHY9bi5yYW5nZSgpLGc9K3ZbMF0rLjUseT0rdlt2Lmxlbmd0aC0xXSsuNSxfPShuLmJhbmR3aWR0aD9mdW5jdGlvbih0KXt2YXIgbj1NYXRoLm1heCgwLHQuYmFuZHdpZHRoKCktMSkvMjtyZXR1cm4gdC5yb3VuZCgpJiYobj1NYXRoLnJvdW5kKG4pKSxmdW5jdGlvbihlKXtyZXR1cm4rdChlKStufX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybit0KG4pfX0pKG4uY29weSgpKSxiPWwuc2VsZWN0aW9uP2wuc2VsZWN0aW9uKCk6bCxtPWIuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbbnVsbF0pLHg9Yi5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShoLG4pLm9yZGVyKCksdz14LmV4aXQoKSxNPXguZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInRpY2siKSxBPXguc2VsZWN0KCJsaW5lIiksVD14LnNlbGVjdCgidGV4dCIpO209bS5tZXJnZShtLmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwiLnRpY2siKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLmF0dHIoInN0cm9rZSIsImN1cnJlbnRDb2xvciIpKSx4PXgubWVyZ2UoTSksQT1BLm1lcmdlKE0uYXBwZW5kKCJsaW5lIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikuYXR0cihjKyIyIixmKm8pKSxUPVQubWVyZ2UoTS5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiY3VycmVudENvbG9yIikuYXR0cihjLGYqcCkuYXR0cigiZHkiLHQ9PT16PyIwZW0iOnQ9PT1MPyIwLjcxZW0iOiIwLjMyZW0iKSksbCE9PWImJihtPW0udHJhbnNpdGlvbihsKSx4PXgudHJhbnNpdGlvbihsKSxBPUEudHJhbnNpdGlvbihsKSxUPVQudHJhbnNpdGlvbihsKSx3PXcudHJhbnNpdGlvbihsKS5hdHRyKCJvcGFjaXR5IixVKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PV8odCkpP3ModCk6dGhpcy5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSksTS5hdHRyKCJvcGFjaXR5IixVKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZS5fX2F4aXM7cmV0dXJuIHMobiYmaXNGaW5pdGUobj1uKHQpKT9uOl8odCkpfSkpLHcucmVtb3ZlKCksbS5hdHRyKCJkIix0PT09RHx8dD09Uj9hPyJNIitmKmErIiwiK2crIkgwLjVWIit5KyJIIitmKmE6Ik0wLjUsIitnKyJWIit5OmE/Ik0iK2crIiwiK2YqYSsiVjAuNUgiK3krIlYiK2YqYToiTSIrZysiLDAuNUgiK3kpLHguYXR0cigib3BhY2l0eSIsMSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXtyZXR1cm4gcyhfKHQpKX0pLEEuYXR0cihjKyIyIixmKm8pLFQuYXR0cihjLGYqcCkudGV4dChkKSxiLmZpbHRlcihZKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoImZvbnQtc2l6ZSIsMTApLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoInRleHQtYW5jaG9yIix0PT09Uj8ic3RhcnQiOnQ9PT1EPyJlbmQiOiJtaWRkbGUiKSxiLmVhY2goZnVuY3Rpb24oKXt0aGlzLl9fYXhpcz1ffSl9cmV0dXJuIGwuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxsKTpufSxsLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGU9Qy5jYWxsKGFyZ3VtZW50cyksbH0sbC50aWNrQXJndW1lbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/W106Qy5jYWxsKHQpLGwpOmUuc2xpY2UoKX0sbC50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDpDLmNhbGwodCksbCk6ciYmci5zbGljZSgpfSxsLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxsKTppfSxsLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWE9K3QsbCk6b30sbC50aWNrU2l6ZUlubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LGwpOm99LGwudGlja1NpemVPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxsKTphfSxsLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LGwpOnV9LGx9dmFyIEY9e3ZhbHVlOmZ1bmN0aW9uKCl7fX07ZnVuY3Rpb24gSSgpe2Zvcih2YXIgdCxuPTAsZT1hcmd1bWVudHMubGVuZ3RoLHI9e307bjxlOysrbil7aWYoISh0PWFyZ3VtZW50c1tuXSsiIil8fHQgaW4gcil0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIit0KTtyW3RdPVtdfXJldHVybiBuZXcgSChyKX1mdW5jdGlvbiBIKHQpe3RoaXMuXz10fWZ1bmN0aW9uIGoodCxuKXtmb3IodmFyIGUscj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZigoZT10W3JdKS5uYW1lPT09bilyZXR1cm4gZS52YWx1ZX1mdW5jdGlvbiBYKHQsbixlKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTsrK3IpaWYodFtyXS5uYW1lPT09bil7dFtyXT1GLHQ9dC5zbGljZSgwLHIpLmNvbmNhdCh0LnNsaWNlKHIrMSkpO2JyZWFrfXJldHVybiBudWxsIT1lJiZ0LnB1c2goe25hbWU6bix2YWx1ZTplfSksdH1ILnByb3RvdHlwZT1JLnByb3RvdHlwZT17Y29uc3RydWN0b3I6SCxvbjpmdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10aGlzLl8sbz0ocj1pLCh0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGU9dC5pbmRleE9mKCIuIik7aWYoZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx0JiYhci5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSksYT0tMSx1PW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9biYmImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK24pO2Zvcig7KythPHU7KWlmKGU9KHQ9b1thXSkudHlwZSlpW2VdPVgoaVtlXSx0Lm5hbWUsbik7ZWxzZSBpZihudWxsPT1uKWZvcihlIGluIGkpaVtlXT1YKGlbZV0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KythPHU7KWlmKChlPSh0PW9bYV0pLnR5cGUpJiYoZT1qKGlbZV0sdC5uYW1lKSkpcmV0dXJuIGV9LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxuPXRoaXMuXztmb3IodmFyIGUgaW4gbil0W2VdPW5bZV0uc2xpY2UoKTtyZXR1cm4gbmV3IEgodCl9LGNhbGw6ZnVuY3Rpb24odCxuKXtpZigoZT1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciBlLHIsaT1uZXcgQXJyYXkoZSksbz0wO288ZTsrK28paVtvXT1hcmd1bWVudHNbbysyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihvPTAsZT0ocj10aGlzLl9bdF0pLmxlbmd0aDtvPGU7KytvKXJbb10udmFsdWUuYXBwbHkobixpKX0sYXBwbHk6ZnVuY3Rpb24odCxuLGUpe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciByPXRoaXMuX1t0XSxpPTAsbz1yLmxlbmd0aDtpPG87KytpKXJbaV0udmFsdWUuYXBwbHkobixlKX19O3ZhciBHPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixWPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpHLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn07ZnVuY3Rpb24gJCh0KXt2YXIgbj10Kz0iIixlPW4uaW5kZXhPZigiOiIpO3JldHVybiBlPj0wJiYieG1sbnMiIT09KG49dC5zbGljZSgwLGUpKSYmKHQ9dC5zbGljZShlKzEpKSxWLmhhc093blByb3BlcnR5KG4pP3tzcGFjZTpWW25dLGxvY2FsOnR9OnR9ZnVuY3Rpb24gVyh0KXt2YXIgbj0kKHQpO3JldHVybihuLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLm93bmVyRG9jdW1lbnQsZT10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gZT09PUcmJm4uZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PUc/bi5jcmVhdGVFbGVtZW50KHQpOm4uY3JlYXRlRWxlbWVudE5TKGUsdCl9fSkobil9ZnVuY3Rpb24gWigpe31mdW5jdGlvbiBRKHQpe3JldHVybiBudWxsPT10P1o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiBKKCl7cmV0dXJuW119ZnVuY3Rpb24gSyh0KXtyZXR1cm4gbnVsbD09dD9KOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19dmFyIHR0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgbnQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2lmKCFudC5tYXRjaGVzKXt2YXIgZXQ9bnQud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxudC5tc01hdGNoZXNTZWxlY3Rvcnx8bnQubW96TWF0Y2hlc1NlbGVjdG9yfHxudC5vTWF0Y2hlc1NlbGVjdG9yO3R0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBldC5jYWxsKHRoaXMsdCl9fX19dmFyIHJ0PXR0O2Z1bmN0aW9uIGl0KHQpe3JldHVybiBuZXcgQXJyYXkodC5sZW5ndGgpfWZ1bmN0aW9uIG90KHQsbil7dGhpcy5vd25lckRvY3VtZW50PXQub3duZXJEb2N1bWVudCx0aGlzLm5hbWVzcGFjZVVSST10Lm5hbWVzcGFjZVVSSSx0aGlzLl9uZXh0PW51bGwsdGhpcy5fcGFyZW50PXQsdGhpcy5fX2RhdGFfXz1ufW90LnByb3RvdHlwZT17Y29uc3RydWN0b3I6b3QsYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCx0aGlzLl9uZXh0KX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCxuKX0scXVlcnlTZWxlY3RvcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3IodCl9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHQpfX07dmFyIGF0PSIkIjtmdW5jdGlvbiB1dCh0LG4sZSxyLGksbyl7Zm9yKHZhciBhLHU9MCxmPW4ubGVuZ3RoLGM9by5sZW5ndGg7dTxjOysrdSkoYT1uW3VdKT8oYS5fX2RhdGFfXz1vW3VdLHJbdV09YSk6ZVt1XT1uZXcgb3QodCxvW3VdKTtmb3IoO3U8ZjsrK3UpKGE9blt1XSkmJihpW3VdPWEpfWZ1bmN0aW9uIGZ0KHQsbixlLHIsaSxvLGEpe3ZhciB1LGYsYyxzPXt9LGw9bi5sZW5ndGgsaD1vLmxlbmd0aCxkPW5ldyBBcnJheShsKTtmb3IodT0wO3U8bDsrK3UpKGY9blt1XSkmJihkW3VdPWM9YXQrYS5jYWxsKGYsZi5fX2RhdGFfXyx1LG4pLGMgaW4gcz9pW3VdPWY6c1tjXT1mKTtmb3IodT0wO3U8aDsrK3UpKGY9c1tjPWF0K2EuY2FsbCh0LG9bdV0sdSxvKV0pPyhyW3VdPWYsZi5fX2RhdGFfXz1vW3VdLHNbY109bnVsbCk6ZVt1XT1uZXcgb3QodCxvW3VdKTtmb3IodT0wO3U8bDsrK3UpKGY9blt1XSkmJnNbZFt1XV09PT1mJiYoaVt1XT1mKX1mdW5jdGlvbiBjdCh0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBzdCh0KXtyZXR1cm4gdC5vd25lckRvY3VtZW50JiZ0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHQuZG9jdW1lbnQmJnR8fHQuZGVmYXVsdFZpZXd9ZnVuY3Rpb24gbHQodCxuKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG4pfHxzdCh0KS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKX1mdW5jdGlvbiBodCh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gZHQodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgcHQodCl9ZnVuY3Rpb24gcHQodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPWh0KHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gdnQodCxuKXtmb3IodmFyIGU9ZHQodCkscj0tMSxpPW4ubGVuZ3RoOysrcjxpOyllLmFkZChuW3JdKX1mdW5jdGlvbiBndCh0LG4pe2Zvcih2YXIgZT1kdCh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUucmVtb3ZlKG5bcl0pfWZ1bmN0aW9uIHl0KCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBfdCgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIGJ0KCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIG10KCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24geHQoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiB3dCgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIE10KCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5jbG9uZU5vZGUoITEpLHRoaXMubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIEF0KCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5jbG9uZU5vZGUoITApLHRoaXMubmV4dFNpYmxpbmcpfXB0LnByb3RvdHlwZT17YWRkOmZ1bmN0aW9uKHQpe3RoaXMuX25hbWVzLmluZGV4T2YodCk8MCYmKHRoaXMuX25hbWVzLnB1c2godCksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWVzLmluZGV4T2YodCk7bj49MCYmKHRoaXMuX25hbWVzLnNwbGljZShuLDEpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LGNvbnRhaW5zOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKHQpPj0wfX07dmFyIFR0PXt9Oyh0LmV2ZW50PW51bGwsInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCkmJigib25tb3VzZWVudGVyImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KFR0PXttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pKTtmdW5jdGlvbiBOdCh0LG4sZSl7cmV0dXJuIHQ9U3QodCxuLGUpLGZ1bmN0aW9uKG4pe3ZhciBlPW4ucmVsYXRlZFRhcmdldDtlJiYoZT09PXRoaXN8fDgmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLG4pfX1mdW5jdGlvbiBTdChuLGUscil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBvPXQuZXZlbnQ7dC5ldmVudD1pO3RyeXtuLmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLGUscil9ZmluYWxseXt0LmV2ZW50PW99fX1mdW5jdGlvbiBFdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9fb247aWYobil7Zm9yKHZhciBlLHI9MCxpPS0xLG89bi5sZW5ndGg7cjxvOysrcillPW5bcl0sdC50eXBlJiZlLnR5cGUhPT10LnR5cGV8fGUubmFtZSE9PXQubmFtZT9uWysraV09ZTp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZS50eXBlLGUubGlzdGVuZXIsZS5jYXB0dXJlKTsrK2k/bi5sZW5ndGg9aTpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24ga3QodCxuLGUpe3ZhciByPVR0Lmhhc093blByb3BlcnR5KHQudHlwZSk/TnQ6U3Q7cmV0dXJuIGZ1bmN0aW9uKGksbyxhKXt2YXIgdSxmPXRoaXMuX19vbixjPXIobixvLGEpO2lmKGYpZm9yKHZhciBzPTAsbD1mLmxlbmd0aDtzPGw7KytzKWlmKCh1PWZbc10pLnR5cGU9PT10LnR5cGUmJnUubmFtZT09PXQubmFtZSlyZXR1cm4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHUudHlwZSx1Lmxpc3RlbmVyLHUuY2FwdHVyZSksdGhpcy5hZGRFdmVudExpc3RlbmVyKHUudHlwZSx1Lmxpc3RlbmVyPWMsdS5jYXB0dXJlPWUpLHZvaWQodS52YWx1ZT1uKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIodC50eXBlLGMsZSksdT17dHlwZTp0LnR5cGUsbmFtZTp0Lm5hbWUsdmFsdWU6bixsaXN0ZW5lcjpjLGNhcHR1cmU6ZX0sZj9mLnB1c2godSk6dGhpcy5fX29uPVt1XX19ZnVuY3Rpb24gQ3QobixlLHIsaSl7dmFyIG89dC5ldmVudDtuLnNvdXJjZUV2ZW50PXQuZXZlbnQsdC5ldmVudD1uO3RyeXtyZXR1cm4gZS5hcHBseShyLGkpfWZpbmFsbHl7dC5ldmVudD1vfX1mdW5jdGlvbiBQdCh0LG4sZSl7dmFyIHI9c3QodCksaT1yLkN1c3RvbUV2ZW50OyJmdW5jdGlvbiI9PXR5cGVvZiBpP2k9bmV3IGkobixlKTooaT1yLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGU/KGkuaW5pdEV2ZW50KG4sZS5idWJibGVzLGUuY2FuY2VsYWJsZSksaS5kZXRhaWw9ZS5kZXRhaWwpOmkuaW5pdEV2ZW50KG4sITEsITEpKSx0LmRpc3BhdGNoRXZlbnQoaSl9dmFyIHp0PVtudWxsXTtmdW5jdGlvbiBSdCh0LG4pe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bn1mdW5jdGlvbiBMdCgpe3JldHVybiBuZXcgUnQoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSx6dCl9ZnVuY3Rpb24gRHQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBSdChbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCldXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFJ0KFtbdF1dLHp0KX1SdC5wcm90b3R5cGU9THQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpSdCxzZWxlY3Q6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVEodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sYSx1PW5baV0sZj11Lmxlbmd0aCxjPXJbaV09bmV3IEFycmF5KGYpLHM9MDtzPGY7KytzKShvPXVbc10pJiYoYT10LmNhbGwobyxvLl9fZGF0YV9fLHMsdSkpJiYoIl9fZGF0YV9fImluIG8mJihhLl9fZGF0YV9fPW8uX19kYXRhX18pLGNbc109YSk7cmV0dXJuIG5ldyBSdChyLHRoaXMuX3BhcmVudHMpfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUsodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPVtdLGk9W10sbz0wO288ZTsrK28pZm9yKHZhciBhLHU9bltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKShhPXVbY10pJiYoci5wdXNoKHQuY2FsbChhLGEuX19kYXRhX18sYyx1KSksaS5wdXNoKGEpKTtyZXR1cm4gbmV3IFJ0KHIsaSl9LGZpbHRlcjpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9cnQodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sYT1uW2ldLHU9YS5sZW5ndGgsZj1yW2ldPVtdLGM9MDtjPHU7KytjKShvPWFbY10pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLGMsYSkmJmYucHVzaChvKTtyZXR1cm4gbmV3IFJ0KHIsdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24odCxuKXtpZighdClyZXR1cm4gcD1uZXcgQXJyYXkodGhpcy5zaXplKCkpLHM9LTEsdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3BbKytzXT10fSkscDt2YXIgZSxyPW4/ZnQ6dXQsaT10aGlzLl9wYXJlbnRzLG89dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYoZT10LHQ9ZnVuY3Rpb24oKXtyZXR1cm4gZX0pO2Zvcih2YXIgYT1vLmxlbmd0aCx1PW5ldyBBcnJheShhKSxmPW5ldyBBcnJheShhKSxjPW5ldyBBcnJheShhKSxzPTA7czxhOysrcyl7dmFyIGw9aVtzXSxoPW9bc10sZD1oLmxlbmd0aCxwPXQuY2FsbChsLGwmJmwuX19kYXRhX18scyxpKSx2PXAubGVuZ3RoLGc9ZltzXT1uZXcgQXJyYXkodikseT11W3NdPW5ldyBBcnJheSh2KTtyKGwsaCxnLHksY1tzXT1uZXcgQXJyYXkoZCkscCxuKTtmb3IodmFyIF8sYixtPTAseD0wO208djsrK20paWYoXz1nW21dKXtmb3IobT49eCYmKHg9bSsxKTshKGI9eVt4XSkmJisreDx2Oyk7Xy5fbmV4dD1ifHxudWxsfX1yZXR1cm4odT1uZXcgUnQodSxpKSkuX2VudGVyPWYsdS5fZXhpdD1jLHV9LGVudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBSdCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChpdCksdGhpcy5fcGFyZW50cyl9LGV4aXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJ0KHRoaXMuX2V4aXR8fHRoaXMuX2dyb3Vwcy5tYXAoaXQpLHRoaXMuX3BhcmVudHMpfSxtZXJnZTpmdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksYT1uZXcgQXJyYXkociksdT0wO3U8bzsrK3UpZm9yKHZhciBmLGM9blt1XSxzPWVbdV0sbD1jLmxlbmd0aCxoPWFbdV09bmV3IEFycmF5KGwpLGQ9MDtkPGw7KytkKShmPWNbZF18fHNbZF0pJiYoaFtkXT1mKTtmb3IoO3U8cjsrK3UpYVt1XT1uW3VdO3JldHVybiBuZXcgUnQoYSx0aGlzLl9wYXJlbnRzKX0sb3JkZXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49LTEsZT10Lmxlbmd0aDsrK248ZTspZm9yKHZhciByLGk9dFtuXSxvPWkubGVuZ3RoLTEsYT1pW29dOy0tbz49MDspKHI9aVtvXSkmJihhJiZhIT09ci5uZXh0U2libGluZyYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLGEpLGE9cik7cmV0dXJuIHRoaXN9LHNvcnQ6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuLGUpe3JldHVybiBuJiZlP3Qobi5fX2RhdGFfXyxlLl9fZGF0YV9fKTohbi0hZX10fHwodD1jdCk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxyPWUubGVuZ3RoLGk9bmV3IEFycmF5KHIpLG89MDtvPHI7KytvKXtmb3IodmFyIGEsdT1lW29dLGY9dS5sZW5ndGgsYz1pW29dPW5ldyBBcnJheShmKSxzPTA7czxmOysrcykoYT11W3NdKSYmKGNbc109YSk7Yy5zb3J0KG4pfXJldHVybiBuZXcgUnQoaSx0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksbj0tMTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dFsrK25dPXRoaXN9KSx0fSxub2RlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxuPTAsZT10Lmxlbmd0aDtuPGU7KytuKWZvcih2YXIgcj10W25dLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpe3ZhciBhPXJbaV07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeysrdH0pLHR9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlmb3IodmFyIGksbz1uW2VdLGE9MCx1PW8ubGVuZ3RoO2E8dTsrK2EpKGk9b1thXSkmJnQuY2FsbChpLGkuX19kYXRhX18sYSxvKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbih0LG4pe3ZhciBlPSQodCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgcj10aGlzLm5vZGUoKTtyZXR1cm4gZS5sb2NhbD9yLmdldEF0dHJpYnV0ZU5TKGUuc3BhY2UsZS5sb2NhbCk6ci5nZXRBdHRyaWJ1dGUoZSl9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9lLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX06ImZ1bmN0aW9uIj09dHlwZW9mIG4/ZS5sb2NhbD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsZSl9fTplLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKHQsbil9fSkoZSxuKSl9LHN0eWxlOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX06ImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQscixlKX19OmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbixlKX19KSh0LG4sbnVsbD09ZT8iIjplKSk6bHQodGhpcy5ub2RlKCksdCl9LHByb3BlcnR5OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PW4/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1lfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPW59fSkodCxuKSk6dGhpcy5ub2RlKClbdF19LGNsYXNzZWQ6ZnVuY3Rpb24odCxuKXt2YXIgZT1odCh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcj1kdCh0aGlzLm5vZGUoKSksaT0tMSxvPWUubGVuZ3RoOysraTxvOylpZighci5jb250YWlucyhlW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpeyhuLmFwcGx5KHRoaXMsYXJndW1lbnRzKT92dDpndCkodGhpcyx0KX19Om4/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dnQodGhpcyx0KX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2d0KHRoaXMsdCl9fSkoZSxuKSl9LHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/eXQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX0pKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0saHRtbDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9fdDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09bj8iIjpufX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH19KSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxyYWlzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goYnQpfSxsb3dlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2gobXQpfSxhcHBlbmQ6ZnVuY3Rpb24odCl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpXKHQpO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pfSxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlcodCkscj1udWxsPT1uP3h0OiJmdW5jdGlvbiI9PXR5cGVvZiBuP246UShuKTtyZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksci5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2god3QpfSxjbG9uZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZWxlY3QodD9BdDpNdCl9LGRhdHVtOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sb246ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbz1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJihuPXQuc2xpY2UoZSsxKSx0PXQuc2xpY2UoMCxlKSkse3R5cGU6dCxuYW1lOm59fSl9KHQrIiIpLGE9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3IodT1uP2t0OkV0LG51bGw9PWUmJihlPSExKSxyPTA7cjxhOysrcil0aGlzLmVhY2godShvW3JdLG4sZSkpO3JldHVybiB0aGlzfXZhciB1PXRoaXMubm9kZSgpLl9fb247aWYodSlmb3IodmFyIGYsYz0wLHM9dS5sZW5ndGg7YzxzOysrYylmb3Iocj0wLGY9dVtjXTtyPGE7KytyKWlmKChpPW9bcl0pLnR5cGU9PT1mLnR5cGUmJmkubmFtZT09PWYubmFtZSlyZXR1cm4gZi52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQsbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gUHQodGhpcyx0LG4pfX0pKHQsbikpfX07dmFyIFV0PTA7ZnVuY3Rpb24gcXQoKXtyZXR1cm4gbmV3IE90fWZ1bmN0aW9uIE90KCl7dGhpcy5fPSJAIisoKytVdCkudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIFl0KCl7Zm9yKHZhciBuLGU9dC5ldmVudDtuPWUuc291cmNlRXZlbnQ7KWU9bjtyZXR1cm4gZX1mdW5jdGlvbiBCdCh0LG4pe3ZhciBlPXQub3duZXJTVkdFbGVtZW50fHx0O2lmKGUuY3JlYXRlU1ZHUG9pbnQpe3ZhciByPWUuY3JlYXRlU1ZHUG9pbnQoKTtyZXR1cm4gci54PW4uY2xpZW50WCxyLnk9bi5jbGllbnRZLFsocj1yLm1hdHJpeFRyYW5zZm9ybSh0LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSkpLngsci55XX12YXIgaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltuLmNsaWVudFgtaS5sZWZ0LXQuY2xpZW50TGVmdCxuLmNsaWVudFktaS50b3AtdC5jbGllbnRUb3BdfWZ1bmN0aW9uIEZ0KHQpe3ZhciBuPVl0KCk7cmV0dXJuIG4uY2hhbmdlZFRvdWNoZXMmJihuPW4uY2hhbmdlZFRvdWNoZXNbMF0pLEJ0KHQsbil9ZnVuY3Rpb24gSXQodCxuLGUpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGU9bixuPVl0KCkuY2hhbmdlZFRvdWNoZXMpO2Zvcih2YXIgcixpPTAsbz1uP24ubGVuZ3RoOjA7aTxvOysraSlpZigocj1uW2ldKS5pZGVudGlmaWVyPT09ZSlyZXR1cm4gQnQodCxyKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBIdCgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24ganQoKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBYdCh0KXt2YXIgbj10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlPUR0KHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsanQsITApOyJvbnNlbGVjdHN0YXJ0ImluIG4/ZS5vbigic2VsZWN0c3RhcnQuZHJhZyIsanQsITApOihuLl9fbm9zZWxlY3Q9bi5zdHlsZS5Nb3pVc2VyU2VsZWN0LG4uc3R5bGUuTW96VXNlclNlbGVjdD0ibm9uZSIpfWZ1bmN0aW9uIEd0KHQsbil7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQscj1EdCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLG51bGwpO24mJihyLm9uKCJjbGljay5kcmFnIixqdCwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe3Iub24oImNsaWNrLmRyYWciLG51bGwpfSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gZT9yLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKTooZS5zdHlsZS5Nb3pVc2VyU2VsZWN0PWUuX19ub3NlbGVjdCxkZWxldGUgZS5fX25vc2VsZWN0KX1mdW5jdGlvbiBWdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gJHQodCxuLGUscixpLG8sYSx1LGYsYyl7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9bix0aGlzLnN1YmplY3Q9ZSx0aGlzLmlkZW50aWZpZXI9cix0aGlzLmFjdGl2ZT1pLHRoaXMueD1vLHRoaXMueT1hLHRoaXMuZHg9dSx0aGlzLmR5PWYsdGhpcy5fPWN9ZnVuY3Rpb24gV3QoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gWnQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlfWZ1bmN0aW9uIFF0KG4pe3JldHVybiBudWxsPT1uP3t4OnQuZXZlbnQueCx5OnQuZXZlbnQueX06bn1mdW5jdGlvbiBKdCgpe3JldHVybiJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiBLdCh0LG4sZSl7dC5wcm90b3R5cGU9bi5wcm90b3R5cGU9ZSxlLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gdG4odCxuKXt2YXIgZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIHIgaW4gbillW3JdPW5bcl07cmV0dXJuIGV9ZnVuY3Rpb24gbm4oKXt9T3QucHJvdG90eXBlPXF0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6T3QsZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl87IShuIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbbl19LHNldDpmdW5jdGlvbih0LG4pe3JldHVybiB0W3RoaXMuX109bn0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX0sJHQucHJvdG90eXBlLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fLm9uLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpO3JldHVybiB0PT09dGhpcy5fP3RoaXM6dH07dmFyIGVuPSJcXHMqKFsrLV0/XFxkKylcXHMqIixybj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixvbj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsYW49L14jKFswLTlhLWZdezN9KSQvLHVuPS9eIyhbMC05YS1mXXs2fSkkLyxmbj1uZXcgUmVnRXhwKCJecmdiXFwoIitbZW4sZW4sZW5dKyJcXCkkIiksY249bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW29uLG9uLG9uXSsiXFwpJCIpLHNuPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbZW4sZW4sZW4scm5dKyJcXCkkIiksbG49bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tvbixvbixvbixybl0rIlxcKSQiKSxobj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbcm4sb24sb25dKyJcXCkkIiksZG49bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tybixvbixvbixybl0rIlxcKSQiKSxwbj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiB2bih0KXt2YXIgbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKG49YW4uZXhlYyh0KSk/bmV3IG1uKChuPXBhcnNlSW50KG5bMV0sMTYpKT4+OCYxNXxuPj40JjI0MCxuPj40JjE1fDI0MCZuLCgxNSZuKTw8NHwxNSZuLDEpOihuPXVuLmV4ZWModCkpP2duKHBhcnNlSW50KG5bMV0sMTYpKToobj1mbi5leGVjKHQpKT9uZXcgbW4oblsxXSxuWzJdLG5bM10sMSk6KG49Y24uZXhlYyh0KSk/bmV3IG1uKDI1NSpuWzFdLzEwMCwyNTUqblsyXS8xMDAsMjU1Km5bM10vMTAwLDEpOihuPXNuLmV4ZWModCkpP3luKG5bMV0sblsyXSxuWzNdLG5bNF0pOihuPWxuLmV4ZWModCkpP3luKDI1NSpuWzFdLzEwMCwyNTUqblsyXS8xMDAsMjU1Km5bM10vMTAwLG5bNF0pOihuPWhuLmV4ZWModCkpP3duKG5bMV0sblsyXS8xMDAsblszXS8xMDAsMSk6KG49ZG4uZXhlYyh0KSk/d24oblsxXSxuWzJdLzEwMCxuWzNdLzEwMCxuWzRdKTpwbi5oYXNPd25Qcm9wZXJ0eSh0KT9nbihwblt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IG1uKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gZ24odCl7cmV0dXJuIG5ldyBtbih0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24geW4odCxuLGUscil7cmV0dXJuIHI8PTAmJih0PW49ZT1OYU4pLG5ldyBtbih0LG4sZSxyKX1mdW5jdGlvbiBfbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIG5ufHwodD12bih0KSksdD9uZXcgbW4oKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IG1ufWZ1bmN0aW9uIGJuKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9fbih0KTpuZXcgbW4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIG1uKHQsbixlLHIpe3RoaXMucj0rdCx0aGlzLmc9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiB4bih0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIHduKHQsbixlLHIpe3JldHVybiByPD0wP3Q9bj1lPU5hTjplPD0wfHxlPj0xP3Q9bj1OYU46bjw9MCYmKHQ9TmFOKSxuZXcgQW4odCxuLGUscil9ZnVuY3Rpb24gTW4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2Z1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBBbilyZXR1cm4gbmV3IEFuKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIG5ufHwodD12bih0KSksIXQpcmV0dXJuIG5ldyBBbjtpZih0IGluc3RhbmNlb2YgQW4pcmV0dXJuIHQ7dmFyIG49KHQ9dC5yZ2IoKSkuci8yNTUsZT10LmcvMjU1LHI9dC5iLzI1NSxpPU1hdGgubWluKG4sZSxyKSxvPU1hdGgubWF4KG4sZSxyKSxhPU5hTix1PW8taSxmPShvK2kpLzI7cmV0dXJuIHU/KGE9bj09PW8/KGUtcikvdSs2KihlPHIpOmU9PT1vPyhyLW4pL3UrMjoobi1lKS91KzQsdS89ZjwuNT9vK2k6Mi1vLWksYSo9NjApOnU9Zj4wJiZmPDE/MDphLG5ldyBBbihhLHUsZix0Lm9wYWNpdHkpfSh0KTpuZXcgQW4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIEFuKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBUbih0LG4sZSl7cmV0dXJuIDI1NSoodDw2MD9uKyhlLW4pKnQvNjA6dDwxODA/ZTp0PDI0MD9uKyhlLW4pKigyNDAtdCkvNjA6bil9S3Qobm4sdm4se2Rpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuaGV4KCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9fSksS3QobW4sYm4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBtbih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgbW4odGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PXRoaXMuciYmdGhpcy5yPD0yNTUmJjA8PXRoaXMuZyYmdGhpcy5nPD0yNTUmJjA8PXRoaXMuYiYmdGhpcy5iPD0yNTUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6ZnVuY3Rpb24oKXtyZXR1cm4iIyIreG4odGhpcy5yKSt4bih0aGlzLmcpK3huKHRoaXMuYil9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8icmdiKCI6InJnYmEoIikrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLnIpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuZyl8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5iKXx8MCkpKygxPT09dD8iKSI6IiwgIit0KyIpIil9fSkpLEt0KEFuLE1uLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgQW4odGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgQW4odGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLG49aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsZT10aGlzLmwscj1lKyhlPC41P2U6MS1lKSpuLGk9MiplLXI7cmV0dXJuIG5ldyBtbihUbih0Pj0yNDA/dC0yNDA6dCsxMjAsaSxyKSxUbih0LGksciksVG4odDwxMjA/dCsyNDA6dC0xMjAsaSxyKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX19KSk7dmFyIE5uPU1hdGguUEkvMTgwLFNuPTE4MC9NYXRoLlBJLEVuPS45NjQyMixrbj0xLENuPS44MjUyMSxQbj00LzI5LHpuPTYvMjksUm49Myp6bip6bixMbj16bip6bip6bjtmdW5jdGlvbiBEbih0KXtpZih0IGluc3RhbmNlb2YgcW4pcmV0dXJuIG5ldyBxbih0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBqbil7aWYoaXNOYU4odC5oKSlyZXR1cm4gbmV3IHFuKHQubCwwLDAsdC5vcGFjaXR5KTt2YXIgbj10LmgqTm47cmV0dXJuIG5ldyBxbih0LmwsTWF0aC5jb3MobikqdC5jLE1hdGguc2luKG4pKnQuYyx0Lm9wYWNpdHkpfXQgaW5zdGFuY2VvZiBtbnx8KHQ9X24odCkpO3ZhciBlLHIsaT1Gbih0LnIpLG89Rm4odC5nKSxhPUZuKHQuYiksdT1PbigoLjIyMjUwNDUqaSsuNzE2ODc4NipvKy4wNjA2MTY5KmEpL2tuKTtyZXR1cm4gaT09PW8mJm89PT1hP2U9cj11OihlPU9uKCguNDM2MDc0NyppKy4zODUwNjQ5Km8rLjE0MzA4MDQqYSkvRW4pLHI9T24oKC4wMTM5MzIyKmkrLjA5NzEwNDUqbysuNzE0MTczMyphKS9DbikpLG5ldyBxbigxMTYqdS0xNiw1MDAqKGUtdSksMjAwKih1LXIpLHQub3BhY2l0eSl9ZnVuY3Rpb24gVW4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0RuKHQpOm5ldyBxbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gcW4odCxuLGUscil7dGhpcy5sPSt0LHRoaXMuYT0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIE9uKHQpe3JldHVybiB0PkxuP01hdGgucG93KHQsMS8zKTp0L1JuK1BufWZ1bmN0aW9uIFluKHQpe3JldHVybiB0PnpuP3QqdCp0OlJuKih0LVBuKX1mdW5jdGlvbiBCbih0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIEZuKHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIEluKHQpe2lmKHQgaW5zdGFuY2VvZiBqbilyZXR1cm4gbmV3IGpuKHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIHFufHwodD1Ebih0KSksMD09PXQuYSYmMD09PXQuYilyZXR1cm4gbmV3IGpuKE5hTiwwLHQubCx0Lm9wYWNpdHkpO3ZhciBuPU1hdGguYXRhbjIodC5iLHQuYSkqU247cmV0dXJuIG5ldyBqbihuPDA/biszNjA6bixNYXRoLnNxcnQodC5hKnQuYSt0LmIqdC5iKSx0LmwsdC5vcGFjaXR5KX1mdW5jdGlvbiBIbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/SW4odCk6bmV3IGpuKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBqbih0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5jPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9S3QocW4sVW4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcW4odGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBxbih0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PSh0aGlzLmwrMTYpLzExNixuPWlzTmFOKHRoaXMuYSk/dDp0K3RoaXMuYS81MDAsZT1pc05hTih0aGlzLmIpP3Q6dC10aGlzLmIvMjAwO3JldHVybiBuZXcgbW4oQm4oMy4xMzM4NTYxKihuPUVuKlluKG4pKS0xLjYxNjg2NjcqKHQ9a24qWW4odCkpLS40OTA2MTQ2KihlPUNuKlluKGUpKSksQm4oLS45Nzg3Njg0Km4rMS45MTYxNDE1KnQrLjAzMzQ1NCplKSxCbiguMDcxOTQ1MypuLS4yMjg5OTE0KnQrMS40MDUyNDI3KmUpLHRoaXMub3BhY2l0eSl9fSkpLEt0KGpuLEhuLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGpuKHRoaXMuaCx0aGlzLmMsdGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgam4odGhpcy5oLHRoaXMuYyx0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gRG4odGhpcykucmdiKCl9fSkpO3ZhciBYbj0tLjE0ODYxLEduPTEuNzgyNzcsVm49LS4yOTIyNywkbj0tLjkwNjQ5LFduPTEuOTcyOTQsWm49V24qJG4sUW49V24qR24sSm49R24qVm4tJG4qWG47ZnVuY3Rpb24gS24odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2Z1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiB0ZSlyZXR1cm4gbmV3IHRlKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIG1ufHwodD1fbih0KSk7dmFyIG49dC5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9KEpuKnIrWm4qbi1RbiplKS8oSm4rWm4tUW4pLG89ci1pLGE9KFduKihlLWkpLVZuKm8pLyRuLHU9TWF0aC5zcXJ0KGEqYStvKm8pLyhXbippKigxLWkpKSxmPXU/TWF0aC5hdGFuMihhLG8pKlNuLTEyMDpOYU47cmV0dXJuIG5ldyB0ZShmPDA/ZiszNjA6Zix1LGksdC5vcGFjaXR5KX0odCk6bmV3IHRlKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiB0ZSh0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5zPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gbmUodCxuLGUscixpKXt2YXIgbz10KnQsYT1vKnQ7cmV0dXJuKCgxLTMqdCszKm8tYSkqbisoNC02Km8rMyphKSplKygxKzMqdCszKm8tMyphKSpyK2EqaSkvNn1mdW5jdGlvbiBlZSh0KXt2YXIgbj10Lmxlbmd0aC0xO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1lPD0wP2U9MDplPj0xPyhlPTEsbi0xKTpNYXRoLmZsb29yKGUqbiksaT10W3JdLG89dFtyKzFdLGE9cj4wP3Rbci0xXToyKmktbyx1PXI8bi0xP3RbcisyXToyKm8taTtyZXR1cm4gbmUoKGUtci9uKSpuLGEsaSxvLHUpfX1mdW5jdGlvbiByZSh0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9TWF0aC5mbG9vcigoKGUlPTEpPDA/KytlOmUpKm4pLGk9dFsocituLTEpJW5dLG89dFtyJW5dLGE9dFsocisxKSVuXSx1PXRbKHIrMiklbl07cmV0dXJuIG5lKChlLXIvbikqbixpLG8sYSx1KX19ZnVuY3Rpb24gaWUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIG9lKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0K2Uqbn19ZnVuY3Rpb24gYWUodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/b2UodCxlPjE4MHx8ZTwtMTgwP2UtMzYwKk1hdGgucm91bmQoZS8zNjApOmUpOmllKGlzTmFOKHQpP246dCl9ZnVuY3Rpb24gdWUodCl7cmV0dXJuIDE9PSh0PSt0KT9mZTpmdW5jdGlvbihuLGUpe3JldHVybiBlLW4/ZnVuY3Rpb24odCxuLGUpe3JldHVybiB0PU1hdGgucG93KHQsZSksbj1NYXRoLnBvdyhuLGUpLXQsZT0xL2UsZnVuY3Rpb24ocil7cmV0dXJuIE1hdGgucG93KHQrcipuLGUpfX0obixlLHQpOmllKGlzTmFOKG4pP2U6bil9fWZ1bmN0aW9uIGZlKHQsbil7dmFyIGU9bi10O3JldHVybiBlP29lKHQsZSk6aWUoaXNOYU4odCk/bjp0KX1LdCh0ZSxLbix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IHRlKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Ljc6TWF0aC5wb3coLjcsdCksbmV3IHRlKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpObixuPSt0aGlzLmwsZT1pc05hTih0aGlzLnMpPzA6dGhpcy5zKm4qKDEtbikscj1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpO3JldHVybiBuZXcgbW4oMjU1KihuK2UqKFhuKnIrR24qaSkpLDI1NSoobitlKihWbipyKyRuKmkpKSwyNTUqKG4rZSooV24qcikpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBjZT1mdW5jdGlvbiB0KG4pe3ZhciBlPXVlKG4pO2Z1bmN0aW9uIHIodCxuKXt2YXIgcj1lKCh0PWJuKHQpKS5yLChuPWJuKG4pKS5yKSxpPWUodC5nLG4uZyksbz1lKHQuYixuLmIpLGE9ZmUodC5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0LnI9cihuKSx0Lmc9aShuKSx0LmI9byhuKSx0Lm9wYWNpdHk9YShuKSx0KyIifX1yZXR1cm4gci5nYW1tYT10LHJ9KDEpO2Z1bmN0aW9uIHNlKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZSxyLGk9bi5sZW5ndGgsbz1uZXcgQXJyYXkoaSksYT1uZXcgQXJyYXkoaSksdT1uZXcgQXJyYXkoaSk7Zm9yKGU9MDtlPGk7KytlKXI9Ym4obltlXSksb1tlXT1yLnJ8fDAsYVtlXT1yLmd8fDAsdVtlXT1yLmJ8fDA7cmV0dXJuIG89dChvKSxhPXQoYSksdT10KHUpLHIub3BhY2l0eT0xLGZ1bmN0aW9uKHQpe3JldHVybiByLnI9byh0KSxyLmc9YSh0KSxyLmI9dSh0KSxyKyIifX19dmFyIGxlPXNlKGVlKSxoZT1zZShyZSk7ZnVuY3Rpb24gZGUodCxuKXt2YXIgZSxyPW4/bi5sZW5ndGg6MCxpPXQ/TWF0aC5taW4ocix0Lmxlbmd0aCk6MCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShyKTtmb3IoZT0wO2U8aTsrK2Upb1tlXT1tZSh0W2VdLG5bZV0pO2Zvcig7ZTxyOysrZSlhW2VdPW5bZV07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihlPTA7ZTxpOysrZSlhW2VdPW9bZV0odCk7cmV0dXJuIGF9fWZ1bmN0aW9uIHBlKHQsbil7dmFyIGU9bmV3IERhdGU7cmV0dXJuIG4tPXQ9K3QsZnVuY3Rpb24ocil7cmV0dXJuIGUuc2V0VGltZSh0K24qciksZX19ZnVuY3Rpb24gdmUodCxuKXtyZXR1cm4gbi09dD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gdCtuKmV9fWZ1bmN0aW9uIGdlKHQsbil7dmFyIGUscj17fSxpPXt9O2ZvcihlIGluIG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR8fCh0PXt9KSxudWxsIT09biYmIm9iamVjdCI9PXR5cGVvZiBufHwobj17fSksbillIGluIHQ/cltlXT1tZSh0W2VdLG5bZV0pOmlbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGUgaW4gcilpW2VdPXJbZV0odCk7cmV0dXJuIGl9fXZhciB5ZT0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csX2U9bmV3IFJlZ0V4cCh5ZS5zb3VyY2UsImciKTtmdW5jdGlvbiBiZSh0LG4pe3ZhciBlLHIsaSxvPXllLmxhc3RJbmRleD1fZS5sYXN0SW5kZXg9MCxhPS0xLHU9W10sZj1bXTtmb3IodCs9IiIsbis9IiI7KGU9eWUuZXhlYyh0KSkmJihyPV9lLmV4ZWMobikpOykoaT1yLmluZGV4KT5vJiYoaT1uLnNsaWNlKG8saSksdVthXT91W2FdKz1pOnVbKythXT1pKSwoZT1lWzBdKT09PShyPXJbMF0pP3VbYV0/dVthXSs9cjp1WysrYV09cjoodVsrK2FdPW51bGwsZi5wdXNoKHtpOmEseDp2ZShlLHIpfSkpLG89X2UubGFzdEluZGV4O3JldHVybiBvPG4ubGVuZ3RoJiYoaT1uLnNsaWNlKG8pLHVbYV0/dVthXSs9aTp1WysrYV09aSksdS5sZW5ndGg8Mj9mWzBdP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChuKSsiIn19KGZbMF0ueCk6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fShuKToobj1mLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIGUscj0wO3I8bjsrK3IpdVsoZT1mW3JdKS5pXT1lLngodCk7cmV0dXJuIHUuam9pbigiIil9KX1mdW5jdGlvbiBtZSh0LG4pe3ZhciBlLHI9dHlwZW9mIG47cmV0dXJuIG51bGw9PW58fCJib29sZWFuIj09PXI/aWUobik6KCJudW1iZXIiPT09cj92ZToic3RyaW5nIj09PXI/KGU9dm4obikpPyhuPWUsY2UpOmJlOm4gaW5zdGFuY2VvZiB2bj9jZTpuIGluc3RhbmNlb2YgRGF0ZT9wZTpBcnJheS5pc0FycmF5KG4pP2RlOiJmdW5jdGlvbiIhPXR5cGVvZiBuLnZhbHVlT2YmJiJmdW5jdGlvbiIhPXR5cGVvZiBuLnRvU3RyaW5nfHxpc05hTihuKT9nZTp2ZSkodCxuKX1mdW5jdGlvbiB4ZSh0LG4pe3JldHVybiBuLT10PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKHQrbiplKX19dmFyIHdlLE1lLEFlLFRlLE5lPTE4MC9NYXRoLlBJLFNlPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIEVlKHQsbixlLHIsaSxvKXt2YXIgYSx1LGY7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtuKm4pKSYmKHQvPWEsbi89YSksKGY9dCplK24qcikmJihlLT10KmYsci09bipmKSwodT1NYXRoLnNxcnQoZSplK3IqcikpJiYoZS89dSxyLz11LGYvPXUpLHQqcjxuKmUmJih0PS10LG49LW4sZj0tZixhPS1hKSx7dHJhbnNsYXRlWDppLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihuLHQpKk5lLHNrZXdYOk1hdGguYXRhbihmKSpOZSxzY2FsZVg6YSxzY2FsZVk6dX19ZnVuY3Rpb24ga2UodCxuLGUscil7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKG8sYSl7dmFyIHU9W10sZj1bXTtyZXR1cm4gbz10KG8pLGE9dChhKSxmdW5jdGlvbih0LHIsaSxvLGEsdSl7aWYodCE9PWl8fHIhPT1vKXt2YXIgZj1hLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsbixudWxsLGUpO3UucHVzaCh7aTpmLTQseDp2ZSh0LGkpfSx7aTpmLTIseDp2ZShyLG8pfSl9ZWxzZShpfHxvKSYmYS5wdXNoKCJ0cmFuc2xhdGUoIitpK24rbytlKX0oby50cmFuc2xhdGVYLG8udHJhbnNsYXRlWSxhLnRyYW5zbGF0ZVgsYS50cmFuc2xhdGVZLHUsZiksZnVuY3Rpb24odCxuLGUsbyl7dCE9PW4/KHQtbj4xODA/bis9MzYwOm4tdD4xODAmJih0Kz0zNjApLG8ucHVzaCh7aTplLnB1c2goaShlKSsicm90YXRlKCIsbnVsbCxyKS0yLHg6dmUodCxuKX0pKTpuJiZlLnB1c2goaShlKSsicm90YXRlKCIrbityKX0oby5yb3RhdGUsYS5yb3RhdGUsdSxmKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj9vLnB1c2goe2k6ZS5wdXNoKGkoZSkrInNrZXdYKCIsbnVsbCxyKS0yLHg6dmUodCxuKX0pOm4mJmUucHVzaChpKGUpKyJza2V3WCgiK24rcil9KG8uc2tld1gsYS5za2V3WCx1LGYpLGZ1bmN0aW9uKHQsbixlLHIsbyxhKXtpZih0IT09ZXx8biE9PXIpe3ZhciB1PW8ucHVzaChpKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6dS00LHg6dmUodCxlKX0se2k6dS0yLHg6dmUobixyKX0pfWVsc2UgMT09PWUmJjE9PT1yfHxvLnB1c2goaShvKSsic2NhbGUoIitlKyIsIityKyIpIil9KG8uc2NhbGVYLG8uc2NhbGVZLGEuc2NhbGVYLGEuc2NhbGVZLHUsZiksbz1hPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj1mLmxlbmd0aDsrK2U8cjspdVsobj1mW2VdKS5pXT1uLngodCk7cmV0dXJuIHUuam9pbigiIil9fX12YXIgQ2U9a2UoZnVuY3Rpb24odCl7cmV0dXJuIm5vbmUiPT09dD9TZTood2V8fCh3ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxNZT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsQWU9ZG9jdW1lbnQuZGVmYXVsdFZpZXcpLHdlLnN0eWxlLnRyYW5zZm9ybT10LHQ9QWUuZ2V0Q29tcHV0ZWRTdHlsZShNZS5hcHBlbmRDaGlsZCh3ZSksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIiksTWUucmVtb3ZlQ2hpbGQod2UpLEVlKCsodD10LnNsaWNlKDcsLTEpLnNwbGl0KCIsIikpWzBdLCt0WzFdLCt0WzJdLCt0WzNdLCt0WzRdLCt0WzVdKSl9LCJweCwgIiwicHgpIiwiZGVnKSIpLFBlPWtlKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1NlOihUZXx8KFRlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpLFRlLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix0KSwodD1UZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKT9FZSgodD10Lm1hdHJpeCkuYSx0LmIsdC5jLHQuZCx0LmUsdC5mKTpTZSl9LCIsICIsIikiLCIpIiksemU9TWF0aC5TUVJUMixSZT0yLExlPTQsRGU9MWUtMTI7ZnVuY3Rpb24gVWUodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9ZnVuY3Rpb24gcWUodCxuKXt2YXIgZSxyLGk9dFswXSxvPXRbMV0sYT10WzJdLHU9blswXSxmPW5bMV0sYz1uWzJdLHM9dS1pLGw9Zi1vLGg9cypzK2wqbDtpZihoPERlKXI9TWF0aC5sb2coYy9hKS96ZSxlPWZ1bmN0aW9uKHQpe3JldHVybltpK3QqcyxvK3QqbCxhKk1hdGguZXhwKHplKnQqcildfTtlbHNle3ZhciBkPU1hdGguc3FydChoKSxwPShjKmMtYSphK0xlKmgpLygyKmEqUmUqZCksdj0oYypjLWEqYS1MZSpoKS8oMipjKlJlKmQpLGc9TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSx5PU1hdGgubG9nKE1hdGguc3FydCh2KnYrMSktdik7cj0oeS1nKS96ZSxlPWZ1bmN0aW9uKHQpe3ZhciBuLGU9dCpyLHU9VWUoZyksZj1hLyhSZSpkKSoodSoobj16ZSplK2csKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpKS1mdW5jdGlvbih0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpLTEvdCkvMn0oZykpO3JldHVybltpK2YqcyxvK2YqbCxhKnUvVWUoemUqZStnKV19fXJldHVybiBlLmR1cmF0aW9uPTFlMypyLGV9ZnVuY3Rpb24gT2UodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dCgobj1NbihuKSkuaCwoZT1NbihlKSkuaCksaT1mZShuLnMsZS5zKSxvPWZlKG4ubCxlLmwpLGE9ZmUobi5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9cih0KSxuLnM9aSh0KSxuLmw9byh0KSxuLm9wYWNpdHk9YSh0KSxuKyIifX19dmFyIFllPU9lKGFlKSxCZT1PZShmZSk7ZnVuY3Rpb24gRmUodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dCgobj1IbihuKSkuaCwoZT1IbihlKSkuaCksaT1mZShuLmMsZS5jKSxvPWZlKG4ubCxlLmwpLGE9ZmUobi5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9cih0KSxuLmM9aSh0KSxuLmw9byh0KSxuLm9wYWNpdHk9YSh0KSxuKyIifX19dmFyIEllPUZlKGFlKSxIZT1GZShmZSk7ZnVuY3Rpb24gamUodCl7cmV0dXJuIGZ1bmN0aW9uIG4oZSl7ZnVuY3Rpb24gcihuLHIpe3ZhciBpPXQoKG49S24obikpLmgsKHI9S24ocikpLmgpLG89ZmUobi5zLHIucyksYT1mZShuLmwsci5sKSx1PWZlKG4ub3BhY2l0eSxyLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5oPWkodCksbi5zPW8odCksbi5sPWEoTWF0aC5wb3codCxlKSksbi5vcGFjaXR5PXUodCksbisiIn19cmV0dXJuIGU9K2Usci5nYW1tYT1uLHJ9KDEpfXZhciBYZT1qZShhZSksR2U9amUoZmUpO3ZhciBWZSwkZSxXZT0wLFplPTAsUWU9MCxKZT0xZTMsS2U9MCx0cj0wLG5yPTAsZXI9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUscnI9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6ZnVuY3Rpb24odCl7c2V0VGltZW91dCh0LDE3KX07ZnVuY3Rpb24gaXIoKXtyZXR1cm4gdHJ8fChycihvciksdHI9ZXIubm93KCkrbnIpfWZ1bmN0aW9uIG9yKCl7dHI9MH1mdW5jdGlvbiBhcigpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gdXIodCxuLGUpe3ZhciByPW5ldyBhcjtyZXR1cm4gci5yZXN0YXJ0KHQsbixlKSxyfWZ1bmN0aW9uIGZyKCl7aXIoKSwrK1dlO2Zvcih2YXIgdCxuPVZlO247KSh0PXRyLW4uX3RpbWUpPj0wJiZuLl9jYWxsLmNhbGwobnVsbCx0KSxuPW4uX25leHQ7LS1XZX1mdW5jdGlvbiBjcigpe3RyPShLZT1lci5ub3coKSkrbnIsV2U9WmU9MDt0cnl7ZnIoKX1maW5hbGx5e1dlPTAsZnVuY3Rpb24oKXt2YXIgdCxuLGU9VmUscj0xLzA7Zm9yKDtlOyllLl9jYWxsPyhyPmUuX3RpbWUmJihyPWUuX3RpbWUpLHQ9ZSxlPWUuX25leHQpOihuPWUuX25leHQsZS5fbmV4dD1udWxsLGU9dD90Ll9uZXh0PW46VmU9bik7JGU9dCxscihyKX0oKSx0cj0wfX1mdW5jdGlvbiBzcigpe3ZhciB0PWVyLm5vdygpLG49dC1LZTtuPkplJiYobnItPW4sS2U9dCl9ZnVuY3Rpb24gbHIodCl7V2V8fChaZSYmKFplPWNsZWFyVGltZW91dChaZSkpLHQtdHI+MjQ/KHQ8MS8wJiYoWmU9c2V0VGltZW91dChjcix0LWVyLm5vdygpLW5yKSksUWUmJihRZT1jbGVhckludGVydmFsKFFlKSkpOihRZXx8KEtlPWVyLm5vdygpLFFlPXNldEludGVydmFsKHNyLEplKSksV2U9MSxycihjcikpKX1mdW5jdGlvbiBocih0LG4sZSl7dmFyIHI9bmV3IGFyO3JldHVybiBuPW51bGw9PW4/MDorbixyLnJlc3RhcnQoZnVuY3Rpb24oZSl7ci5zdG9wKCksdChlK24pfSxuLGUpLHJ9YXIucHJvdG90eXBlPXVyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YXIscmVzdGFydDpmdW5jdGlvbih0LG4sZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtlPShudWxsPT1lP2lyKCk6K2UpKyhudWxsPT1uPzA6K24pLHRoaXMuX25leHR8fCRlPT09dGhpc3x8KCRlPyRlLl9uZXh0PXRoaXM6VmU9dGhpcywkZT10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1lLGxyKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLGxyKCkpfX07dmFyIGRyPUkoInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikscHI9W10sdnI9MCxncj0xLHlyPTIsX3I9Myxicj00LG1yPTUseHI9NjtmdW5jdGlvbiB3cih0LG4sZSxyLGksbyl7dmFyIGE9dC5fX3RyYW5zaXRpb247aWYoYSl7aWYoZSBpbiBhKXJldHVybn1lbHNlIHQuX190cmFuc2l0aW9uPXt9OyFmdW5jdGlvbih0LG4sZSl7dmFyIHIsaT10Ll9fdHJhbnNpdGlvbjtmdW5jdGlvbiBvKGYpe3ZhciBjLHMsbCxoO2lmKGUuc3RhdGUhPT1ncilyZXR1cm4gdSgpO2ZvcihjIGluIGkpaWYoKGg9aVtjXSkubmFtZT09PWUubmFtZSl7aWYoaC5zdGF0ZT09PV9yKXJldHVybiBocihvKTtoLnN0YXRlPT09YnI/KGguc3RhdGU9eHIsaC50aW1lci5zdG9wKCksaC5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxoLmluZGV4LGguZ3JvdXApLGRlbGV0ZSBpW2NdKTorYzxuJiYoaC5zdGF0ZT14cixoLnRpbWVyLnN0b3AoKSxkZWxldGUgaVtjXSl9aWYoaHIoZnVuY3Rpb24oKXtlLnN0YXRlPT09X3ImJihlLnN0YXRlPWJyLGUudGltZXIucmVzdGFydChhLGUuZGVsYXksZS50aW1lKSxhKGYpKX0pLGUuc3RhdGU9eXIsZS5vbi5jYWxsKCJzdGFydCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksZS5zdGF0ZT09PXlyKXtmb3IoZS5zdGF0ZT1fcixyPW5ldyBBcnJheShsPWUudHdlZW4ubGVuZ3RoKSxjPTAscz0tMTtjPGw7KytjKShoPWUudHdlZW5bY10udmFsdWUuY2FsbCh0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSkmJihyWysrc109aCk7ci5sZW5ndGg9cysxfX1mdW5jdGlvbiBhKG4pe2Zvcih2YXIgaT1uPGUuZHVyYXRpb24/ZS5lYXNlLmNhbGwobnVsbCxuL2UuZHVyYXRpb24pOihlLnRpbWVyLnJlc3RhcnQodSksZS5zdGF0ZT1tciwxKSxvPS0xLGE9ci5sZW5ndGg7KytvPGE7KXJbb10uY2FsbChudWxsLGkpO2Uuc3RhdGU9PT1tciYmKGUub24uY2FsbCgiZW5kIix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSx1KCkpfWZ1bmN0aW9uIHUoKXtmb3IodmFyIHIgaW4gZS5zdGF0ZT14cixlLnRpbWVyLnN0b3AoKSxkZWxldGUgaVtuXSxpKXJldHVybjtkZWxldGUgdC5fX3RyYW5zaXRpb259aVtuXT1lLGUudGltZXI9dXIoZnVuY3Rpb24odCl7ZS5zdGF0ZT1ncixlLnRpbWVyLnJlc3RhcnQobyxlLmRlbGF5LGUudGltZSksZS5kZWxheTw9dCYmbyh0LWUuZGVsYXkpfSwwLGUudGltZSl9KHQsZSx7bmFtZTpuLGluZGV4OnIsZ3JvdXA6aSxvbjpkcix0d2Vlbjpwcix0aW1lOm8udGltZSxkZWxheTpvLmRlbGF5LGR1cmF0aW9uOm8uZHVyYXRpb24sZWFzZTpvLmVhc2UsdGltZXI6bnVsbCxzdGF0ZTp2cn0pfWZ1bmN0aW9uIE1yKHQsbil7dmFyIGU9VHIodCxuKTtpZihlLnN0YXRlPnZyKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkIik7cmV0dXJuIGV9ZnVuY3Rpb24gQXIodCxuKXt2YXIgZT1Ucih0LG4pO2lmKGUuc3RhdGU+eXIpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzdGFydGVkIik7cmV0dXJuIGV9ZnVuY3Rpb24gVHIodCxuKXt2YXIgZT10Ll9fdHJhbnNpdGlvbjtpZighZXx8IShlPWVbbl0pKXRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTtyZXR1cm4gZX1mdW5jdGlvbiBOcih0LG4pe3ZhciBlLHIsaSxvPXQuX190cmFuc2l0aW9uLGE9ITA7aWYobyl7Zm9yKGkgaW4gbj1udWxsPT1uP251bGw6bisiIixvKShlPW9baV0pLm5hbWU9PT1uPyhyPWUuc3RhdGU+eXImJmUuc3RhdGU8bXIsZS5zdGF0ZT14cixlLnRpbWVyLnN0b3AoKSxyJiZlLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksZGVsZXRlIG9baV0pOmE9ITE7YSYmZGVsZXRlIHQuX190cmFuc2l0aW9ufX1mdW5jdGlvbiBTcih0LG4sZSl7dmFyIHI9dC5faWQ7cmV0dXJuIHQuZWFjaChmdW5jdGlvbigpe3ZhciB0PUFyKHRoaXMscik7KHQudmFsdWV8fCh0LnZhbHVlPXt9KSlbbl09ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxmdW5jdGlvbih0KXtyZXR1cm4gVHIodCxyKS52YWx1ZVtuXX19ZnVuY3Rpb24gRXIodCxuKXt2YXIgZTtyZXR1cm4oIm51bWJlciI9PXR5cGVvZiBuP3ZlOm4gaW5zdGFuY2VvZiB2bj9jZTooZT12bihuKSk/KG49ZSxjZSk6YmUpKHQsbil9dmFyIGtyPUx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcjt2YXIgQ3I9MDtmdW5jdGlvbiBQcih0LG4sZSxyKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPW4sdGhpcy5fbmFtZT1lLHRoaXMuX2lkPXJ9ZnVuY3Rpb24genIodCl7cmV0dXJuIEx0KCkudHJhbnNpdGlvbih0KX1mdW5jdGlvbiBScigpe3JldHVybisrQ3J9dmFyIExyPUx0LnByb3RvdHlwZTtmdW5jdGlvbiBEcih0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdDotLXQqKDItdCkrMSkvMn1mdW5jdGlvbiBVcih0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn1Qci5wcm90b3R5cGU9enIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQcixzZWxlY3Q6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZSxlPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RKHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1uZXcgQXJyYXkoaSksYT0wO2E8aTsrK2EpZm9yKHZhciB1LGYsYz1yW2FdLHM9Yy5sZW5ndGgsbD1vW2FdPW5ldyBBcnJheShzKSxoPTA7aDxzOysraCkodT1jW2hdKSYmKGY9dC5jYWxsKHUsdS5fX2RhdGFfXyxoLGMpKSYmKCJfX2RhdGFfXyJpbiB1JiYoZi5fX2RhdGFfXz11Ll9fZGF0YV9fKSxsW2hdPWYsd3IobFtoXSxuLGUsaCxsLFRyKHUsZSkpKTtyZXR1cm4gbmV3IFByKG8sdGhpcy5fcGFyZW50cyxuLGUpfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZSxlPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1LKHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1bXSxhPVtdLHU9MDt1PGk7Kyt1KWZvcih2YXIgZixjPXJbdV0scz1jLmxlbmd0aCxsPTA7bDxzOysrbClpZihmPWNbbF0pe2Zvcih2YXIgaCxkPXQuY2FsbChmLGYuX19kYXRhX18sbCxjKSxwPVRyKGYsZSksdj0wLGc9ZC5sZW5ndGg7djxnOysrdikoaD1kW3ZdKSYmd3IoaCxuLGUsdixkLHApO28ucHVzaChkKSxhLnB1c2goZil9cmV0dXJuIG5ldyBQcihvLGEsbixlKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ydCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxmPXJbaV09W10sYz0wO2M8dTsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmZi5wdXNoKG8pO3JldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxtZXJnZTpmdW5jdGlvbih0KXtpZih0Ll9pZCE9PXRoaXMuX2lkKXRocm93IG5ldyBFcnJvcjtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksYT1uZXcgQXJyYXkociksdT0wO3U8bzsrK3UpZm9yKHZhciBmLGM9blt1XSxzPWVbdV0sbD1jLmxlbmd0aCxoPWFbdV09bmV3IEFycmF5KGwpLGQ9MDtkPGw7KytkKShmPWNbZF18fHNbZF0pJiYoaFtkXT1mKTtmb3IoO3U8cjsrK3UpYVt1XT1uW3VdO3JldHVybiBuZXcgUHIoYSx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxzZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGtyKHRoaXMuX2dyb3Vwcyx0aGlzLl9wYXJlbnRzKX0sdHJhbnNpdGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9uYW1lLG49dGhpcy5faWQsZT1ScigpLHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKWlmKGE9dVtjXSl7dmFyIHM9VHIoYSxuKTt3cihhLHQsZSxjLHUse3RpbWU6cy50aW1lK3MuZGVsYXkrcy5kdXJhdGlvbixkZWxheTowLGR1cmF0aW9uOnMuZHVyYXRpb24sZWFzZTpzLmVhc2V9KX1yZXR1cm4gbmV3IFByKHIsdGhpcy5fcGFyZW50cyx0LGUpfSxjYWxsOkxyLmNhbGwsbm9kZXM6THIubm9kZXMsbm9kZTpMci5ub2RlLHNpemU6THIuc2l6ZSxlbXB0eTpMci5lbXB0eSxlYWNoOkxyLmVhY2gsb246ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP1RyKHRoaXMubm9kZSgpLGUpLm9uLm9uKHQpOnRoaXMuZWFjaChmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWZ1bmN0aW9uKHQpe3JldHVybih0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCl7dmFyIG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJih0PXQuc2xpY2UoMCxuKSksIXR8fCJzdGFydCI9PT10fSl9KG4pP01yOkFyO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPW8odGhpcyx0KSx1PWEub247dSE9PXImJihpPShyPXUpLmNvcHkoKSkub24obixlKSxhLm9uPWl9fShlLHQsbikpfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9JCh0KSxyPSJ0cmFuc2Zvcm0iPT09ZT9QZTpFcjtyZXR1cm4gdGhpcy5hdHRyVHdlZW4odCwiZnVuY3Rpb24iPT10eXBlb2Ygbj8oZS5sb2NhbD9mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvO3JldHVybiBmdW5jdGlvbigpe3ZhciBhLHU9ZSh0aGlzKTtpZihudWxsIT11KXJldHVybihhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKSk9PT11P251bGw6YT09PXImJnU9PT1pP286bz1uKHI9YSxpPXUpO3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdT1lKHRoaXMpO2lmKG51bGwhPXUpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGUodCkpPT09dT9udWxsOmE9PT1yJiZ1PT09aT9vOm89bihyPWEsaT11KTt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19KShlLHIsU3IodGhpcywiYXR0ci4iK3QsbikpOm51bGw9PW4/KGUubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fSkoZSk6KGUubG9jYWw/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19OmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMuZ2V0QXR0cmlidXRlKHQpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19KShlLHIsbisiIikpfSxhdHRyVHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT0iYXR0ci4iK3Q7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihlPXRoaXMudHdlZW4oZSkpJiZlLl92YWx1ZTtpZihudWxsPT1uKXJldHVybiB0aGlzLnR3ZWVuKGUsbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3ZhciByPSQodCk7cmV0dXJuIHRoaXMudHdlZW4oZSwoci5sb2NhbD9mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZT10aGlzLHI9bi5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe2Uuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLHIobikpfX1yZXR1cm4gZS5fdmFsdWU9bixlfTpmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZT10aGlzLHI9bi5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe2Uuc2V0QXR0cmlidXRlKHQscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9KShyLG4pKX0sc3R5bGU6ZnVuY3Rpb24odCxuLGUpe3ZhciByPSJ0cmFuc2Zvcm0iPT0odCs9IiIpP0NlOkVyO3JldHVybiBudWxsPT1uP3RoaXMuc3R5bGVUd2Vlbih0LGZ1bmN0aW9uKHQsbil7dmFyIGUscixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWx0KHRoaXMsdCksYT0odGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxsdCh0aGlzLHQpKTtyZXR1cm4gbz09PWE/bnVsbDpvPT09ZSYmYT09PXI/aTppPW4oZT1vLHI9YSl9fSh0LHIpKS5vbigiZW5kLnN0eWxlLiIrdCxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX0odCkpOnRoaXMuc3R5bGVUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9bHQodGhpcyx0KSx1PWUodGhpcyk7cmV0dXJuIG51bGw9PXUmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLHU9bHQodGhpcyx0KSksYT09PXU/bnVsbDphPT09ciYmdT09PWk/bzpvPW4ocj1hLGk9dSl9fSh0LHIsU3IodGhpcywic3R5bGUuIit0LG4pKTpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1sdCh0aGlzLHQpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19KHQscixuKyIiKSxlKX0sc3R5bGVUd2VlbjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKHI9dGhpcy50d2VlbihyKSkmJnIuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4ocixudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4ocixmdW5jdGlvbih0LG4sZSl7ZnVuY3Rpb24gcigpe3ZhciByPXRoaXMsaT1uLmFwcGx5KHIsYXJndW1lbnRzKTtyZXR1cm4gaSYmZnVuY3Rpb24obil7ci5zdHlsZS5zZXRQcm9wZXJ0eSh0LGkobiksZSl9fXJldHVybiByLl92YWx1ZT1uLHJ9KHQsbixudWxsPT1lPyIiOmUpKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50d2VlbigidGV4dCIsImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dCh0aGlzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PW4/IiI6bn19KFNyKHRoaXMsInRleHQiLHQpKTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fShudWxsPT10PyIiOnQrIiIpKX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLCh0PXRoaXMuX2lkLGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO2Zvcih2YXIgZSBpbiB0aGlzLl9fdHJhbnNpdGlvbilpZigrZSE9PXQpcmV0dXJuO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9KSk7dmFyIHR9LHR3ZWVuOmZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcy5faWQ7aWYodCs9IiIsYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIHIsaT1Ucih0aGlzLm5vZGUoKSxlKS50d2VlbixvPTAsYT1pLmxlbmd0aDtvPGE7KytvKWlmKChyPWlbb10pLm5hbWU9PT10KXJldHVybiByLnZhbHVlO3JldHVybiBudWxsfXJldHVybiB0aGlzLmVhY2goKG51bGw9PW4/ZnVuY3Rpb24odCxuKXt2YXIgZSxyO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPUFyKHRoaXMsdCksbz1pLnR3ZWVuO2lmKG8hPT1lKWZvcih2YXIgYT0wLHU9KHI9ZT1vKS5sZW5ndGg7YTx1OysrYSlpZihyW2FdLm5hbWU9PT1uKXsocj1yLnNsaWNlKCkpLnNwbGljZShhLDEpO2JyZWFrfWkudHdlZW49cn19OmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1Bcih0aGlzLHQpLGE9by50d2VlbjtpZihhIT09cil7aT0ocj1hKS5zbGljZSgpO2Zvcih2YXIgdT17bmFtZTpuLHZhbHVlOmV9LGY9MCxjPWkubGVuZ3RoO2Y8YzsrK2YpaWYoaVtmXS5uYW1lPT09bil7aVtmXT11O2JyZWFrfWY9PT1jJiZpLnB1c2godSl9by50d2Vlbj1pfX0pKGUsdCxuKSl9LGRlbGF5OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtNcih0aGlzLHQpLmRlbGF5PStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIG49K24sZnVuY3Rpb24oKXtNcih0aGlzLHQpLmRlbGF5PW59fSkobix0KSk6VHIodGhpcy5ub2RlKCksbikuZGVsYXl9LGR1cmF0aW9uOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtBcih0aGlzLHQpLmR1cmF0aW9uPStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIG49K24sZnVuY3Rpb24oKXtBcih0aGlzLHQpLmR1cmF0aW9uPW59fSkobix0KSk6VHIodGhpcy5ub2RlKCksbikuZHVyYXRpb259LGVhc2U6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKGZ1bmN0aW9uKHQsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe0FyKHRoaXMsdCkuZWFzZT1ufX0obix0KSk6VHIodGhpcy5ub2RlKCksbikuZWFzZX19O3ZhciBxcj1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIE1hdGgucG93KHQsbil9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KDMpLE9yPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gMS1NYXRoLnBvdygxLXQsbil9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KDMpLFlyPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KHQsbik6Mi1NYXRoLnBvdygyLXQsbikpLzJ9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KDMpLEJyPU1hdGguUEksRnI9QnIvMjtmdW5jdGlvbiBJcih0KXtyZXR1cm4oMS1NYXRoLmNvcyhCcip0KSkvMn1mdW5jdGlvbiBIcih0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KDIsMTAqdC0xMCk6Mi1NYXRoLnBvdygyLDEwLTEwKnQpKS8yfWZ1bmN0aW9uIGpyKHQpe3JldHVybigodCo9Mik8PTE/MS1NYXRoLnNxcnQoMS10KnQpOk1hdGguc3FydCgxLSh0LT0yKSp0KSsxKS8yfXZhciBYcj00LzExLEdyPTYvMTEsVnI9OC8xMSwkcj0uNzUsV3I9OS8xMSxacj0xMC8xMSxRcj0uOTM3NSxKcj0yMS8yMixLcj02My82NCx0aT0xL1hyL1hyO2Z1bmN0aW9uIG5pKHQpe3JldHVybih0PSt0KTxYcj90aSp0KnQ6dDxWcj90aSoodC09R3IpKnQrJHI6dDxacj90aSoodC09V3IpKnQrUXI6dGkqKHQtPUpyKSp0K0tyfXZhciBlaT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHQqdCooKG4rMSkqdC1uKX1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KDEuNzAxNTgpLHJpPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4tLXQqdCooKG4rMSkqdCtuKSsxfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksaWk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8MT90KnQqKChuKzEpKnQtbik6KHQtPTIpKnQqKChuKzEpKnQrbikrMikvMn1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KDEuNzAxNTgpLG9pPTIqTWF0aC5QSSxhaT1mdW5jdGlvbiB0KG4sZSl7dmFyIHI9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1vaSk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gbipNYXRoLnBvdygyLDEwKi0tdCkqTWF0aC5zaW4oKHItdCkvZSl9cmV0dXJuIGkuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSpvaSl9LGkucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LGl9KDEsLjMpLHVpPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9pKTtmdW5jdGlvbiBpKHQpe3JldHVybiAxLW4qTWF0aC5wb3coMiwtMTAqKHQ9K3QpKSpNYXRoLnNpbigodCtyKS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksZmk9ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89b2kpO2Z1bmN0aW9uIGkodCl7cmV0dXJuKCh0PTIqdC0xKTwwP24qTWF0aC5wb3coMiwxMCp0KSpNYXRoLnNpbigoci10KS9lKToyLW4qTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKHIrdCkvZSkpLzJ9cmV0dXJuIGkuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSpvaSl9LGkucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LGl9KDEsLjMpLGNpPXt0aW1lOm51bGwsZGVsYXk6MCxkdXJhdGlvbjoyNTAsZWFzZTpVcn07ZnVuY3Rpb24gc2kodCxuKXtmb3IodmFyIGU7IShlPXQuX190cmFuc2l0aW9uKXx8IShlPWVbbl0pOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm4gY2kudGltZT1pcigpLGNpO3JldHVybiBlfUx0LnByb3RvdHlwZS5pbnRlcnJ1cHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe05yKHRoaXMsdCl9KX0sTHQucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24odCl7dmFyIG4sZTt0IGluc3RhbmNlb2YgUHI/KG49dC5faWQsdD10Ll9uYW1lKToobj1ScigpLChlPWNpKS50aW1lPWlyKCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciByPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89MDtvPGk7KytvKWZvcih2YXIgYSx1PXJbb10sZj11Lmxlbmd0aCxjPTA7YzxmOysrYykoYT11W2NdKSYmd3IoYSx0LG4sYyx1LGV8fHNpKGEsbikpO3JldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHQsbil9O3ZhciBsaT1bbnVsbF07ZnVuY3Rpb24gaGkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIGRpKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc2VsZWN0aW9uPWV9ZnVuY3Rpb24gcGkoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIHZpKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9dmFyIGdpPXtuYW1lOiJkcmFnIn0seWk9e25hbWU6InNwYWNlIn0sX2k9e25hbWU6ImhhbmRsZSJ9LGJpPXtuYW1lOiJjZW50ZXIifSxtaT17bmFtZToieCIsaGFuZGxlczpbImUiLCJ3Il0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW3RbMF0sblswXVsxXV0sW3RbMV0sblsxXVsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzBdLHRbMV1bMF1dfX0seGk9e25hbWU6InkiLGhhbmRsZXM6WyJuIiwicyJdLm1hcChFaSksaW5wdXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdCYmW1tuWzBdWzBdLHRbMF1dLFtuWzFdWzBdLHRbMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVsxXSx0WzFdWzFdXX19LHdpPXtuYW1lOiJ4eSIsaGFuZGxlczpbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLm1hcChFaSksaW5wdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH19LE1pPXtvdmVybGF5OiJjcm9zc2hhaXIiLHNlbGVjdGlvbjoibW92ZSIsbjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSxBaT17ZToidyIsdzoiZSIsbnc6Im5lIixuZToibnciLHNlOiJzdyIsc3c6InNlIn0sVGk9e246InMiLHM6Im4iLG53OiJzdyIsbmU6InNlIixzZToibmUiLHN3OiJudyJ9LE5pPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjpudWxsLGU6MSxzOm51bGwsdzotMSxudzotMSxuZToxLHNlOjEsc3c6LTF9LFNpPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjotMSxlOm51bGwsczoxLHc6bnVsbCxudzotMSxuZTotMSxzZToxLHN3OjF9O2Z1bmN0aW9uIEVpKHQpe3JldHVybnt0eXBlOnR9fWZ1bmN0aW9uIGtpKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIENpKCl7dmFyIHQ9dGhpcy5vd25lclNWR0VsZW1lbnR8fHRoaXM7cmV0dXJuW1swLDBdLFt0LndpZHRoLmJhc2VWYWwudmFsdWUsdC5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dfWZ1bmN0aW9uIFBpKHQpe2Zvcig7IXQuX19icnVzaDspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0Ll9fYnJ1c2h9ZnVuY3Rpb24gemkodCl7cmV0dXJuIHRbMF1bMF09PT10WzFdWzBdfHx0WzBdWzFdPT09dFsxXVsxXX1mdW5jdGlvbiBSaShuKXt2YXIgZSxyPUNpLGk9a2ksbz1JKHUsInN0YXJ0IiwiYnJ1c2giLCJlbmQiKSxhPTY7ZnVuY3Rpb24gdSh0KXt2YXIgZT10LnByb3BlcnR5KCJfX2JydXNoIixoKS5zZWxlY3RBbGwoIi5vdmVybGF5IikuZGF0YShbRWkoIm92ZXJsYXkiKV0pO2UuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsIm92ZXJsYXkiKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLmF0dHIoImN1cnNvciIsTWkub3ZlcmxheSkubWVyZ2UoZSkuZWFjaChmdW5jdGlvbigpe3ZhciB0PVBpKHRoaXMpLmV4dGVudDtEdCh0aGlzKS5hdHRyKCJ4Iix0WzBdWzBdKS5hdHRyKCJ5Iix0WzBdWzFdKS5hdHRyKCJ3aWR0aCIsdFsxXVswXS10WzBdWzBdKS5hdHRyKCJoZWlnaHQiLHRbMV1bMV0tdFswXVsxXSl9KSx0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLmRhdGEoW0VpKCJzZWxlY3Rpb24iKV0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJzZWxlY3Rpb24iKS5hdHRyKCJjdXJzb3IiLE1pLnNlbGVjdGlvbikuYXR0cigiZmlsbCIsIiM3NzciKS5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKS5hdHRyKCJzdHJva2UiLCIjZmZmIikuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpO3ZhciByPXQuc2VsZWN0QWxsKCIuaGFuZGxlIikuZGF0YShuLmhhbmRsZXMsZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZX0pO3IuZXhpdCgpLnJlbW92ZSgpLHIuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24odCl7cmV0dXJuImhhbmRsZSBoYW5kbGUtLSIrdC50eXBlfSkuYXR0cigiY3Vyc29yIixmdW5jdGlvbih0KXtyZXR1cm4gTWlbdC50eXBlXX0pLHQuZWFjaChmKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKS5vbigibW91c2Vkb3duLmJydXNoIHRvdWNoc3RhcnQuYnJ1c2giLGwpfWZ1bmN0aW9uIGYoKXt2YXIgdD1EdCh0aGlzKSxuPVBpKHRoaXMpLnNlbGVjdGlvbjtuPyh0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixuWzBdWzBdKS5hdHRyKCJ5IixuWzBdWzFdKS5hdHRyKCJ3aWR0aCIsblsxXVswXS1uWzBdWzBdKS5hdHRyKCJoZWlnaHQiLG5bMV1bMV0tblswXVsxXSksdC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlW3QudHlwZS5sZW5ndGgtMV0/blsxXVswXS1hLzI6blswXVswXS1hLzJ9KS5hdHRyKCJ5IixmdW5jdGlvbih0KXtyZXR1cm4icyI9PT10LnR5cGVbMF0/blsxXVsxXS1hLzI6blswXVsxXS1hLzJ9KS5hdHRyKCJ3aWR0aCIsZnVuY3Rpb24odCl7cmV0dXJuIm4iPT09dC50eXBlfHwicyI9PT10LnR5cGU/blsxXVswXS1uWzBdWzBdK2E6YX0pLmF0dHIoImhlaWdodCIsZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlfHwidyI9PT10LnR5cGU/blsxXVsxXS1uWzBdWzFdK2E6YX0pKTp0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiwuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLCJub25lIikuYXR0cigieCIsbnVsbCkuYXR0cigieSIsbnVsbCkuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCl9ZnVuY3Rpb24gYyh0LG4pe3JldHVybiB0Ll9fYnJ1c2guZW1pdHRlcnx8bmV3IHModCxuKX1mdW5jdGlvbiBzKHQsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPW4sdGhpcy5zdGF0ZT10Ll9fYnJ1c2gsdGhpcy5hY3RpdmU9MH1mdW5jdGlvbiBsKCl7aWYodC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDx0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybiB2aSgpfWVsc2UgaWYoZSlyZXR1cm47aWYoaS5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciByLG8sYSx1LHMsbCxoLGQscCx2LGcseSxfLGI9dGhpcyxtPXQuZXZlbnQudGFyZ2V0Ll9fZGF0YV9fLnR5cGUseD0ic2VsZWN0aW9uIj09PSh0LmV2ZW50Lm1ldGFLZXk/bT0ib3ZlcmxheSI6bSk/Z2k6dC5ldmVudC5hbHRLZXk/Ymk6X2ksdz1uPT09eGk/bnVsbDpOaVttXSxNPW49PT1taT9udWxsOlNpW21dLEE9UGkoYiksVD1BLmV4dGVudCxOPUEuc2VsZWN0aW9uLFM9VFswXVswXSxFPVRbMF1bMV0saz1UWzFdWzBdLEM9VFsxXVsxXSxQPXcmJk0mJnQuZXZlbnQuc2hpZnRLZXksej1GdChiKSxSPXosTD1jKGIsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpOyJvdmVybGF5Ij09PW0/QS5zZWxlY3Rpb249Tj1bW3I9bj09PXhpP1M6elswXSxhPW49PT1taT9FOnpbMV1dLFtzPW49PT14aT9rOnIsaD1uPT09bWk/QzphXV06KHI9TlswXVswXSxhPU5bMF1bMV0scz1OWzFdWzBdLGg9TlsxXVsxXSksbz1yLHU9YSxsPXMsZD1oO3ZhciBEPUR0KGIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLFU9RC5zZWxlY3RBbGwoIi5vdmVybGF5IikuYXR0cigiY3Vyc29yIixNaVttXSk7aWYodC5ldmVudC50b3VjaGVzKUQub24oInRvdWNobW92ZS5icnVzaCIsTywhMCkub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIixCLCEwKTtlbHNle3ZhciBxPUR0KHQuZXZlbnQudmlldykub24oImtleWRvd24uYnJ1c2giLGZ1bmN0aW9uKCl7c3dpdGNoKHQuZXZlbnQua2V5Q29kZSl7Y2FzZSAxNjpQPXcmJk07YnJlYWs7Y2FzZSAxODp4PT09X2kmJih3JiYocz1sLXAqdyxyPW8rcCp3KSxNJiYoaD1kLXYqTSxhPXUrdipNKSx4PWJpLFkoKSk7YnJlYWs7Y2FzZSAzMjp4IT09X2kmJnghPT1iaXx8KHc8MD9zPWwtcDp3PjAmJihyPW8tcCksTTwwP2g9ZC12Ok0+MCYmKGE9dS12KSx4PXlpLFUuYXR0cigiY3Vyc29yIixNaS5zZWxlY3Rpb24pLFkoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dmkoKX0sITApLm9uKCJrZXl1cC5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlAmJih5PV89UD0hMSxZKCkpO2JyZWFrO2Nhc2UgMTg6eD09PWJpJiYodzwwP3M9bDp3PjAmJihyPW8pLE08MD9oPWQ6TT4wJiYoYT11KSx4PV9pLFkoKSk7YnJlYWs7Y2FzZSAzMjp4PT09eWkmJih0LmV2ZW50LmFsdEtleT8odyYmKHM9bC1wKncscj1vK3AqdyksTSYmKGg9ZC12Kk0sYT11K3YqTSkseD1iaSk6KHc8MD9zPWw6dz4wJiYocj1vKSxNPDA/aD1kOk0+MCYmKGE9dSkseD1faSksVS5hdHRyKCJjdXJzb3IiLE1pW21dKSxZKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufXZpKCl9LCEwKS5vbigibW91c2Vtb3ZlLmJydXNoIixPLCEwKS5vbigibW91c2V1cC5icnVzaCIsQiwhMCk7WHQodC5ldmVudC52aWV3KX1waSgpLE5yKGIpLGYuY2FsbChiKSxMLnN0YXJ0KCl9ZnVuY3Rpb24gTygpe3ZhciB0PUZ0KGIpOyFQfHx5fHxffHwoTWF0aC5hYnModFswXS1SWzBdKT5NYXRoLmFicyh0WzFdLVJbMV0pP189ITA6eT0hMCksUj10LGc9ITAsdmkoKSxZKCl9ZnVuY3Rpb24gWSgpe3ZhciB0O3N3aXRjaChwPVJbMF0telswXSx2PVJbMV0telsxXSx4KXtjYXNlIHlpOmNhc2UgZ2k6dyYmKHA9TWF0aC5tYXgoUy1yLE1hdGgubWluKGstcyxwKSksbz1yK3AsbD1zK3ApLE0mJih2PU1hdGgubWF4KEUtYSxNYXRoLm1pbihDLWgsdikpLHU9YSt2LGQ9aCt2KTticmVhaztjYXNlIF9pOnc8MD8ocD1NYXRoLm1heChTLXIsTWF0aC5taW4oay1yLHApKSxvPXIrcCxsPXMpOnc+MCYmKHA9TWF0aC5tYXgoUy1zLE1hdGgubWluKGstcyxwKSksbz1yLGw9cytwKSxNPDA/KHY9TWF0aC5tYXgoRS1hLE1hdGgubWluKEMtYSx2KSksdT1hK3YsZD1oKTpNPjAmJih2PU1hdGgubWF4KEUtaCxNYXRoLm1pbihDLWgsdikpLHU9YSxkPWgrdik7YnJlYWs7Y2FzZSBiaTp3JiYobz1NYXRoLm1heChTLE1hdGgubWluKGssci1wKncpKSxsPU1hdGgubWF4KFMsTWF0aC5taW4oayxzK3AqdykpKSxNJiYodT1NYXRoLm1heChFLE1hdGgubWluKEMsYS12Kk0pKSxkPU1hdGgubWF4KEUsTWF0aC5taW4oQyxoK3YqTSkpKX1sPG8mJih3Kj0tMSx0PXIscj1zLHM9dCx0PW8sbz1sLGw9dCxtIGluIEFpJiZVLmF0dHIoImN1cnNvciIsTWlbbT1BaVttXV0pKSxkPHUmJihNKj0tMSx0PWEsYT1oLGg9dCx0PXUsdT1kLGQ9dCxtIGluIFRpJiZVLmF0dHIoImN1cnNvciIsTWlbbT1UaVttXV0pKSxBLnNlbGVjdGlvbiYmKE49QS5zZWxlY3Rpb24pLHkmJihvPU5bMF1bMF0sbD1OWzFdWzBdKSxfJiYodT1OWzBdWzFdLGQ9TlsxXVsxXSksTlswXVswXT09PW8mJk5bMF1bMV09PT11JiZOWzFdWzBdPT09bCYmTlsxXVsxXT09PWR8fChBLnNlbGVjdGlvbj1bW28sdV0sW2wsZF1dLGYuY2FsbChiKSxMLmJydXNoKCkpfWZ1bmN0aW9uIEIoKXtpZihwaSgpLHQuZXZlbnQudG91Y2hlcyl7aWYodC5ldmVudC50b3VjaGVzLmxlbmd0aClyZXR1cm47ZSYmY2xlYXJUaW1lb3V0KGUpLGU9c2V0VGltZW91dChmdW5jdGlvbigpe2U9bnVsbH0sNTAwKSxELm9uKCJ0b3VjaG1vdmUuYnJ1c2ggdG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLG51bGwpfWVsc2UgR3QodC5ldmVudC52aWV3LGcpLHEub24oImtleWRvd24uYnJ1c2gga2V5dXAuYnJ1c2ggbW91c2Vtb3ZlLmJydXNoIG1vdXNldXAuYnJ1c2giLG51bGwpO0QuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKSxVLmF0dHIoImN1cnNvciIsTWkub3ZlcmxheSksQS5zZWxlY3Rpb24mJihOPUEuc2VsZWN0aW9uKSx6aShOKSYmKEEuc2VsZWN0aW9uPW51bGwsZi5jYWxsKGIpKSxMLmVuZCgpfX1mdW5jdGlvbiBoKCl7dmFyIHQ9dGhpcy5fX2JydXNofHx7c2VsZWN0aW9uOm51bGx9O3JldHVybiB0LmV4dGVudD1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmRpbT1uLHR9cmV0dXJuIHUubW92ZT1mdW5jdGlvbih0LGUpe3Quc2VsZWN0aW9uP3Qub24oInN0YXJ0LmJydXNoIixmdW5jdGlvbigpe2ModGhpcyxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQoKX0pLm9uKCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoIixmdW5jdGlvbigpe2ModGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oImJydXNoIixmdW5jdGlvbigpe3ZhciB0PXRoaXMscj10Ll9fYnJ1c2gsaT1jKHQsYXJndW1lbnRzKSxvPXIuc2VsZWN0aW9uLGE9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplLHIuZXh0ZW50KSx1PW1lKG8sYSk7ZnVuY3Rpb24gcyhuKXtyLnNlbGVjdGlvbj0xPT09biYmemkoYSk/bnVsbDp1KG4pLGYuY2FsbCh0KSxpLmJydXNoKCl9cmV0dXJuIG8mJmE/czpzKDEpfSk6dC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dGhpcy5fX2JydXNoLGk9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsdCk6ZSxyLmV4dGVudCksbz1jKHRoaXMsdCkuYmVmb3Jlc3RhcnQoKTtOcih0aGlzKSxyLnNlbGVjdGlvbj1udWxsPT1pfHx6aShpKT9udWxsOmksZi5jYWxsKHRoaXMpLG8uc3RhcnQoKS5icnVzaCgpLmVuZCgpfSl9LHMucHJvdG90eXBlPXtiZWZvcmVzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT0rK3RoaXMuYWN0aXZlJiYodGhpcy5zdGF0ZS5lbWl0dGVyPXRoaXMsdGhpcy5zdGFydGluZz0hMCksdGhpc30sc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydGluZyYmKHRoaXMuc3RhcnRpbmc9ITEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSxicnVzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVtaXQoImJydXNoIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLHRoaXMuZW1pdCgiZW5kIikpLHRoaXN9LGVtaXQ6ZnVuY3Rpb24odCl7Q3QobmV3IGRpKHUsdCxuLm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbikpLG8uYXBwbHksbyxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSx1LmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmhpKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSx1KTpyfSx1LmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmhpKCEhdCksdSk6aX0sdS5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LHUpOmF9LHUub249ZnVuY3Rpb24oKXt2YXIgdD1vLm9uLmFwcGx5KG8sYXJndW1lbnRzKTtyZXR1cm4gdD09PW8/dTp0fSx1fXZhciBMaT1NYXRoLmNvcyxEaT1NYXRoLnNpbixVaT1NYXRoLlBJLHFpPVVpLzIsT2k9MipVaSxZaT1NYXRoLm1heDt2YXIgQmk9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIEZpKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgSWk9TWF0aC5QSSxIaT0yKklpLGppPUhpLTFlLTY7ZnVuY3Rpb24gWGkoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1mdW5jdGlvbiBHaSgpe3JldHVybiBuZXcgWGl9ZnVuY3Rpb24gVmkodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uICRpKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiBXaSh0KXtyZXR1cm4gdC5yYWRpdXN9ZnVuY3Rpb24gWmkodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiBRaSh0KXtyZXR1cm4gdC5lbmRBbmdsZX1YaS5wcm90b3R5cGU9R2kucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpYaSxtb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K24pfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9LGxpbmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9IkwiKyh0aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MT0rbil9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iUSIrICt0KyIsIisgK24rIiwiKyh0aGlzLl94MT0rZSkrIiwiKyh0aGlzLl95MT0rcil9LGJlemllckN1cnZlVG86ZnVuY3Rpb24odCxuLGUscixpLG8pe3RoaXMuXys9IkMiKyArdCsiLCIrICtuKyIsIisgK2UrIiwiKyArcisiLCIrKHRoaXMuX3gxPStpKSsiLCIrKHRoaXMuX3kxPStvKX0sYXJjVG86ZnVuY3Rpb24odCxuLGUscixpKXt0PSt0LG49K24sZT0rZSxyPStyLGk9K2k7dmFyIG89dGhpcy5feDEsYT10aGlzLl95MSx1PWUtdCxmPXItbixjPW8tdCxzPWEtbixsPWMqYytzKnM7aWYoaTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK2kpO2lmKG51bGw9PT10aGlzLl94MSl0aGlzLl8rPSJNIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1uKTtlbHNlIGlmKGw+MWUtNilpZihNYXRoLmFicyhzKnUtZipjKT4xZS02JiZpKXt2YXIgaD1lLW8sZD1yLWEscD11KnUrZipmLHY9aCpoK2QqZCxnPU1hdGguc3FydChwKSx5PU1hdGguc3FydChsKSxfPWkqTWF0aC50YW4oKElpLU1hdGguYWNvcygocCtsLXYpLygyKmcqeSkpKS8yKSxiPV8veSxtPV8vZztNYXRoLmFicyhiLTEpPjFlLTYmJih0aGlzLl8rPSJMIisodCtiKmMpKyIsIisobitiKnMpKSx0aGlzLl8rPSJBIitpKyIsIitpKyIsMCwwLCIrICsocypoPmMqZCkrIiwiKyh0aGlzLl94MT10K20qdSkrIiwiKyh0aGlzLl95MT1uK20qZil9ZWxzZSB0aGlzLl8rPSJMIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1uKTtlbHNlO30sYXJjOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0PSt0LG49K247dmFyIGE9KGU9K2UpKk1hdGguY29zKHIpLHU9ZSpNYXRoLnNpbihyKSxmPXQrYSxjPW4rdSxzPTFebyxsPW8/ci1pOmktcjtpZihlPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIrZSk7bnVsbD09PXRoaXMuX3gxP3RoaXMuXys9Ik0iK2YrIiwiK2M6KE1hdGguYWJzKHRoaXMuX3gxLWYpPjFlLTZ8fE1hdGguYWJzKHRoaXMuX3kxLWMpPjFlLTYpJiYodGhpcy5fKz0iTCIrZisiLCIrYyksZSYmKGw8MCYmKGw9bCVIaStIaSksbD5qaT90aGlzLl8rPSJBIitlKyIsIitlKyIsMCwxLCIrcysiLCIrKHQtYSkrIiwiKyhuLXUpKyJBIitlKyIsIitlKyIsMCwxLCIrcysiLCIrKHRoaXMuX3gxPWYpKyIsIisodGhpcy5feTE9Yyk6bD4xZS02JiYodGhpcy5fKz0iQSIrZSsiLCIrZSsiLDAsIisgKyhsPj1JaSkrIiwiK3MrIiwiKyh0aGlzLl94MT10K2UqTWF0aC5jb3MoaSkpKyIsIisodGhpcy5feTE9bitlKk1hdGguc2luKGkpKSkpfSxyZWN0OmZ1bmN0aW9uKHQsbixlLHIpe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbikrImgiKyArZSsidiIrICtyKyJoIistZSsiWiJ9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX319O2Z1bmN0aW9uIEppKCl7fWZ1bmN0aW9uIEtpKHQsbil7dmFyIGU9bmV3IEppO2lmKHQgaW5zdGFuY2VvZiBKaSl0LmVhY2goZnVuY3Rpb24odCxuKXtlLnNldChuLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgcixpPS0xLG89dC5sZW5ndGg7aWYobnVsbD09bilmb3IoOysraTxvOyllLnNldChpLHRbaV0pO2Vsc2UgZm9yKDsrK2k8bzspZS5zZXQobihyPXRbaV0saSx0KSxyKX1lbHNlIGlmKHQpZm9yKHZhciBhIGluIHQpZS5zZXQoYSx0W2FdKTtyZXR1cm4gZX1mdW5jdGlvbiB0bygpe3JldHVybnt9fWZ1bmN0aW9uIG5vKHQsbixlKXt0W25dPWV9ZnVuY3Rpb24gZW8oKXtyZXR1cm4gS2koKX1mdW5jdGlvbiBybyh0LG4sZSl7dC5zZXQobixlKX1mdW5jdGlvbiBpbygpe31KaS5wcm90b3R5cGU9S2kucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpKaSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIiQiK3QgaW4gdGhpc30sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIit0XX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXNbIiQiK3RdPW4sdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBuPSIkIit0O3JldHVybiBuIGluIHRoaXMmJmRlbGV0ZSB0aGlzW25dfSxjbGVhcjpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKSIkIj09PXRbMF0mJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmdC5wdXNoKG4uc2xpY2UoMSkpO3JldHVybiB0fSx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2godGhpc1tuXSk7cmV0dXJuIHR9LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2goe2tleTpuLnNsaWNlKDEpLHZhbHVlOnRoaXNbbl19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmKyt0O3JldHVybiB0fSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKWlmKCIkIj09PXRbMF0pcmV0dXJuITE7cmV0dXJuITB9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmdCh0aGlzW25dLG4uc2xpY2UoMSksdGhpcyl9fTt2YXIgb289S2kucHJvdG90eXBlO2Z1bmN0aW9uIGFvKHQsbil7dmFyIGU9bmV3IGlvO2lmKHQgaW5zdGFuY2VvZiBpbyl0LmVhY2goZnVuY3Rpb24odCl7ZS5hZGQodCl9KTtlbHNlIGlmKHQpe3ZhciByPS0xLGk9dC5sZW5ndGg7aWYobnVsbD09bilmb3IoOysrcjxpOyllLmFkZCh0W3JdKTtlbHNlIGZvcig7KytyPGk7KWUuYWRkKG4odFtyXSxyLHQpKX1yZXR1cm4gZX1pby5wcm90b3R5cGU9YW8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjppbyxoYXM6b28uaGFzLGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1siJCIrKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6b28ucmVtb3ZlLGNsZWFyOm9vLmNsZWFyLHZhbHVlczpvby5rZXlzLHNpemU6b28uc2l6ZSxlbXB0eTpvby5lbXB0eSxlYWNoOm9vLmVhY2h9O3ZhciB1bz1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gZm8odCxuKXtyZXR1cm4gdC1ufWZ1bmN0aW9uIGNvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBzbyh0LG4pe2Zvcih2YXIgZSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWlmKGU9bG8odCxuW3JdKSlyZXR1cm4gZTtyZXR1cm4gMH1mdW5jdGlvbiBsbyh0LG4pe2Zvcih2YXIgZT1uWzBdLHI9blsxXSxpPS0xLG89MCxhPXQubGVuZ3RoLHU9YS0xO288YTt1PW8rKyl7dmFyIGY9dFtvXSxjPWZbMF0scz1mWzFdLGw9dFt1XSxoPWxbMF0sZD1sWzFdO2lmKGhvKGYsbCxuKSlyZXR1cm4gMDtzPnIhPWQ+ciYmZTwoaC1jKSooci1zKS8oZC1zKStjJiYoaT0taSl9cmV0dXJuIGl9ZnVuY3Rpb24gaG8odCxuLGUpe3ZhciByLGksbyxhO3JldHVybiBmdW5jdGlvbih0LG4sZSl7cmV0dXJuKG5bMF0tdFswXSkqKGVbMV0tdFsxXSk9PShlWzBdLXRbMF0pKihuWzFdLXRbMV0pfSh0LG4sZSkmJihpPXRbcj0rKHRbMF09PT1uWzBdKV0sbz1lW3JdLGE9bltyXSxpPD1vJiZvPD1hfHxhPD1vJiZvPD1pKX1mdW5jdGlvbiBwbygpe312YXIgdm89W1tdLFtbWzEsMS41XSxbLjUsMV1dXSxbW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbLjUsMV1dXSxbW1sxLC41XSxbMS41LDFdXV0sW1tbMSwxLjVdLFsuNSwxXV0sW1sxLC41XSxbMS41LDFdXV0sW1tbMSwuNV0sWzEsMS41XV1dLFtbWzEsLjVdLFsuNSwxXV1dLFtbWy41LDFdLFsxLC41XV1dLFtbWzEsMS41XSxbMSwuNV1dXSxbW1suNSwxXSxbMSwuNV1dLFtbMS41LDFdLFsxLDEuNV1dXSxbW1sxLjUsMV0sWzEsLjVdXV0sW1tbLjUsMV0sWzEuNSwxXV1dLFtbWzEsMS41XSxbMS41LDFdXV0sW1tbLjUsMV0sWzEsMS41XV1dLFtdXTtmdW5jdGlvbiBnbygpe3ZhciB0PTEsbj0xLGU9TSxyPXU7ZnVuY3Rpb24gaSh0KXt2YXIgbj1lKHQpO2lmKEFycmF5LmlzQXJyYXkobikpbj1uLnNsaWNlKCkuc29ydChmbyk7ZWxzZXt2YXIgcj1zKHQpLGk9clswXSxhPXJbMV07bj13KGksYSxuKSxuPWcoTWF0aC5mbG9vcihpL24pKm4sTWF0aC5mbG9vcihhL24pKm4sbil9cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKHQsbil9KX1mdW5jdGlvbiBvKGUsaSl7dmFyIG89W10sdT1bXTtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe3ZhciBvLHUsZixjLHMsbCxoPW5ldyBBcnJheSxkPW5ldyBBcnJheTtvPXU9LTEsYz1lWzBdPj1yLHZvW2M8PDFdLmZvckVhY2gocCk7Zm9yKDsrK288dC0xOylmPWMsYz1lW28rMV0+PXIsdm9bZnxjPDwxXS5mb3JFYWNoKHApO3ZvW2M8PDBdLmZvckVhY2gocCk7Zm9yKDsrK3U8bi0xOyl7Zm9yKG89LTEsYz1lW3UqdCt0XT49cixzPWVbdSp0XT49cix2b1tjPDwxfHM8PDJdLmZvckVhY2gocCk7KytvPHQtMTspZj1jLGM9ZVt1KnQrdCtvKzFdPj1yLGw9cyxzPWVbdSp0K28rMV0+PXIsdm9bZnxjPDwxfHM8PDJ8bDw8M10uZm9yRWFjaChwKTt2b1tjfHM8PDNdLmZvckVhY2gocCl9bz0tMSxzPWVbdSp0XT49cix2b1tzPDwyXS5mb3JFYWNoKHApO2Zvcig7KytvPHQtMTspbD1zLHM9ZVt1KnQrbysxXT49cix2b1tzPDwyfGw8PDNdLmZvckVhY2gocCk7ZnVuY3Rpb24gcCh0KXt2YXIgbixlLHI9W3RbMF1bMF0rbyx0WzBdWzFdK3VdLGY9W3RbMV1bMF0rbyx0WzFdWzFdK3VdLGM9YShyKSxzPWEoZik7KG49ZFtjXSk/KGU9aFtzXSk/KGRlbGV0ZSBkW24uZW5kXSxkZWxldGUgaFtlLnN0YXJ0XSxuPT09ZT8obi5yaW5nLnB1c2goZiksaShuLnJpbmcpKTpoW24uc3RhcnRdPWRbZS5lbmRdPXtzdGFydDpuLnN0YXJ0LGVuZDplLmVuZCxyaW5nOm4ucmluZy5jb25jYXQoZS5yaW5nKX0pOihkZWxldGUgZFtuLmVuZF0sbi5yaW5nLnB1c2goZiksZFtuLmVuZD1zXT1uKToobj1oW3NdKT8oZT1kW2NdKT8oZGVsZXRlIGhbbi5zdGFydF0sZGVsZXRlIGRbZS5lbmRdLG49PT1lPyhuLnJpbmcucHVzaChmKSxpKG4ucmluZykpOmhbZS5zdGFydF09ZFtuLmVuZF09e3N0YXJ0OmUuc3RhcnQsZW5kOm4uZW5kLHJpbmc6ZS5yaW5nLmNvbmNhdChuLnJpbmcpfSk6KGRlbGV0ZSBoW24uc3RhcnRdLG4ucmluZy51bnNoaWZ0KHIpLGhbbi5zdGFydD1jXT1uKTpoW2NdPWRbc109e3N0YXJ0OmMsZW5kOnMscmluZzpbcixmXX19dm9bczw8M10uZm9yRWFjaChwKX0oZSxpLGZ1bmN0aW9uKHQpe3IodCxlLGkpLGZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGgscj10W2UtMV1bMV0qdFswXVswXS10W2UtMV1bMF0qdFswXVsxXTsrK248ZTspcis9dFtuLTFdWzFdKnRbbl1bMF0tdFtuLTFdWzBdKnRbbl1bMV07cmV0dXJuIHJ9KHQpPjA/by5wdXNoKFt0XSk6dS5wdXNoKHQpfSksdS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPTAscj1vLmxlbmd0aDtlPHI7KytlKWlmKC0xIT09c28oKG49b1tlXSlbMF0sdCkpcmV0dXJuIHZvaWQgbi5wdXNoKHQpfSkse3R5cGU6Ik11bHRpUG9seWdvbiIsdmFsdWU6aSxjb29yZGluYXRlczpvfX1mdW5jdGlvbiBhKG4pe3JldHVybiAyKm5bMF0rblsxXSoodCsxKSo0fWZ1bmN0aW9uIHUoZSxyLGkpe2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbyxhPWVbMF0sdT1lWzFdLGY9MHxhLGM9MHx1LHM9cltjKnQrZl07YT4wJiZhPHQmJmY9PT1hJiYobz1yW2MqdCtmLTFdLGVbMF09YSsoaS1vKS8ocy1vKS0uNSksdT4wJiZ1PG4mJmM9PT11JiYobz1yWyhjLTEpKnQrZl0sZVsxXT11KyhpLW8pLyhzLW8pLS41KX0pfXJldHVybiBpLmNvbnRvdXI9byxpLnNpemU9ZnVuY3Rpb24oZSl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3Qsbl07dmFyIHI9TWF0aC5jZWlsKGVbMF0pLG89TWF0aC5jZWlsKGVbMV0pO2lmKCEocj4wJiZvPjApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaXplIik7cmV0dXJuIHQ9cixuPW8saX0saS50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9jbyh1by5jYWxsKHQpKTpjbyh0KSxpKTplfSxpLnNtb290aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10P3U6cG8saSk6cj09PXV9LGl9ZnVuY3Rpb24geW8odCxuLGUpe2Zvcih2YXIgcj10LndpZHRoLGk9dC5oZWlnaHQsbz0xKyhlPDwxKSxhPTA7YTxpOysrYSlmb3IodmFyIHU9MCxmPTA7dTxyK2U7Kyt1KXU8ciYmKGYrPXQuZGF0YVt1K2Eqcl0pLHU+PWUmJih1Pj1vJiYoZi09dC5kYXRhW3UtbythKnJdKSxuLmRhdGFbdS1lK2Eqcl09Zi9NYXRoLm1pbih1KzEsci0xK28tdSxvKSl9ZnVuY3Rpb24gX28odCxuLGUpe2Zvcih2YXIgcj10LndpZHRoLGk9dC5oZWlnaHQsbz0xKyhlPDwxKSxhPTA7YTxyOysrYSlmb3IodmFyIHU9MCxmPTA7dTxpK2U7Kyt1KXU8aSYmKGYrPXQuZGF0YVthK3Uqcl0pLHU+PWUmJih1Pj1vJiYoZi09dC5kYXRhW2ErKHUtbykqcl0pLG4uZGF0YVthKyh1LWUpKnJdPWYvTWF0aC5taW4odSsxLGktMStvLXUsbykpfWZ1bmN0aW9uIGJvKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG1vKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHhvKCl7cmV0dXJuIDF9dmFyIHdvPXt9LE1vPXt9LEFvPTM0LFRvPTEwLE5vPTEzO2Z1bmN0aW9uIFNvKHQpe3JldHVybiBuZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrdC5tYXAoZnVuY3Rpb24odCxuKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkrIjogZFsiK24rIl0ifSkuam9pbigiLCIpKyJ9Iil9ZnVuY3Rpb24gRW8odCl7dmFyIG49bmV3IFJlZ0V4cCgnWyInK3QrIlxuXHJdIiksZT10LmNoYXJDb2RlQXQoMCk7ZnVuY3Rpb24gcih0LG4pe3ZhciByLGk9W10sbz10Lmxlbmd0aCxhPTAsdT0wLGY9bzw9MCxjPSExO2Z1bmN0aW9uIHMoKXtpZihmKXJldHVybiBNbztpZihjKXJldHVybiBjPSExLHdvO3ZhciBuLHIsaT1hO2lmKHQuY2hhckNvZGVBdChpKT09PUFvKXtmb3IoO2ErKzxvJiZ0LmNoYXJDb2RlQXQoYSkhPT1Bb3x8dC5jaGFyQ29kZUF0KCsrYSk9PT1BbzspO3JldHVybihuPWEpPj1vP2Y9ITA6KHI9dC5jaGFyQ29kZUF0KGErKykpPT09VG8/Yz0hMDpyPT09Tm8mJihjPSEwLHQuY2hhckNvZGVBdChhKT09PVRvJiYrK2EpLHQuc2xpY2UoaSsxLG4tMSkucmVwbGFjZSgvIiIvZywnIicpfWZvcig7YTxvOyl7aWYoKHI9dC5jaGFyQ29kZUF0KG49YSsrKSk9PT1UbyljPSEwO2Vsc2UgaWYocj09PU5vKWM9ITAsdC5jaGFyQ29kZUF0KGEpPT09VG8mJisrYTtlbHNlIGlmKHIhPT1lKWNvbnRpbnVlO3JldHVybiB0LnNsaWNlKGksbil9cmV0dXJuIGY9ITAsdC5zbGljZShpLG8pfWZvcih0LmNoYXJDb2RlQXQoby0xKT09PVRvJiYtLW8sdC5jaGFyQ29kZUF0KG8tMSk9PT1ObyYmLS1vOyhyPXMoKSkhPT1Nbzspe2Zvcih2YXIgbD1bXTtyIT09d28mJnIhPT1NbzspbC5wdXNoKHIpLHI9cygpO24mJm51bGw9PShsPW4obCx1KyspKXx8aS5wdXNoKGwpfXJldHVybiBpfWZ1bmN0aW9uIGkobil7cmV0dXJuIG4ubWFwKG8pLmpvaW4odCl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbnVsbD09dD8iIjpuLnRlc3QodCs9IiIpPyciJyt0LnJlcGxhY2UoLyIvZywnIiInKSsnIic6dH1yZXR1cm57cGFyc2U6ZnVuY3Rpb24odCxuKXt2YXIgZSxpLG89cih0LGZ1bmN0aW9uKHQscil7aWYoZSlyZXR1cm4gZSh0LHItMSk7aT10LGU9bj9mdW5jdGlvbih0LG4pe3ZhciBlPVNvKHQpO3JldHVybiBmdW5jdGlvbihyLGkpe3JldHVybiBuKGUociksaSx0KX19KHQsbik6U28odCl9KTtyZXR1cm4gby5jb2x1bW5zPWl8fFtdLG99LHBhcnNlUm93czpyLGZvcm1hdDpmdW5jdGlvbihuLGUpe3JldHVybiBudWxsPT1lJiYoZT1mdW5jdGlvbih0KXt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLGU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtmb3IodmFyIHIgaW4gdClyIGluIG58fGUucHVzaChuW3JdPXIpfSksZX0obikpLFtlLm1hcChvKS5qb2luKHQpXS5jb25jYXQobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBvKG5bdF0pfSkuam9pbih0KX0pKS5qb2luKCJcbiIpfSxmb3JtYXRSb3dzOmZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChpKS5qb2luKCJcbiIpfX19dmFyIGtvPUVvKCIsIiksQ289a28ucGFyc2UsUG89a28ucGFyc2VSb3dzLHpvPWtvLmZvcm1hdCxSbz1rby5mb3JtYXRSb3dzLExvPUVvKCJcdCIpLERvPUxvLnBhcnNlLFVvPUxvLnBhcnNlUm93cyxxbz1Mby5mb3JtYXQsT289TG8uZm9ybWF0Um93cztmdW5jdGlvbiBZbyh0KXtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IodC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dCk7cmV0dXJuIHQuYmxvYigpfWZ1bmN0aW9uIEJvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5hcnJheUJ1ZmZlcigpfWZ1bmN0aW9uIEZvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC50ZXh0KCl9ZnVuY3Rpb24gSW8odCxuKXtyZXR1cm4gZmV0Y2godCxuKS50aGVuKEZvKX1mdW5jdGlvbiBIbyh0KXtyZXR1cm4gZnVuY3Rpb24obixlLHIpe3JldHVybiAyPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApLElvKG4sZSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4gdChuLHIpfSl9fXZhciBqbz1IbyhDbyksWG89SG8oRG8pO2Z1bmN0aW9uIEdvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5qc29uKCl9ZnVuY3Rpb24gVm8odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7cmV0dXJuIElvKG4sZSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKG4sdCl9KX19dmFyICRvPVZvKCJhcHBsaWNhdGlvbi94bWwiKSxXbz1WbygidGV4dC9odG1sIiksWm89Vm8oImltYWdlL3N2Zyt4bWwiKTtmdW5jdGlvbiBRbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gSm8oKXtyZXR1cm4gMWUtNiooTWF0aC5yYW5kb20oKS0uNSl9ZnVuY3Rpb24gS28odCxuLGUscil7aWYoaXNOYU4obil8fGlzTmFOKGUpKXJldHVybiB0O3ZhciBpLG8sYSx1LGYsYyxzLGwsaCxkPXQuX3Jvb3QscD17ZGF0YTpyfSx2PXQuX3gwLGc9dC5feTAseT10Ll94MSxfPXQuX3kxO2lmKCFkKXJldHVybiB0Ll9yb290PXAsdDtmb3IoO2QubGVuZ3RoOylpZigoYz1uPj0obz0odit5KS8yKSk/dj1vOnk9bywocz1lPj0oYT0oZytfKS8yKSk/Zz1hOl89YSxpPWQsIShkPWRbbD1zPDwxfGNdKSlyZXR1cm4gaVtsXT1wLHQ7aWYodT0rdC5feC5jYWxsKG51bGwsZC5kYXRhKSxmPSt0Ll95LmNhbGwobnVsbCxkLmRhdGEpLG49PT11JiZlPT09ZilyZXR1cm4gcC5uZXh0PWQsaT9pW2xdPXA6dC5fcm9vdD1wLHQ7ZG97aT1pP2lbbF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChjPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChzPWU+PShhPShnK18pLzIpKT9nPWE6Xz1hfXdoaWxlKChsPXM8PDF8Yyk9PShoPShmPj1hKTw8MXx1Pj1vKSk7cmV0dXJuIGlbaF09ZCxpW2xdPXAsdH1mdW5jdGlvbiB0YSh0LG4sZSxyLGkpe3RoaXMubm9kZT10LHRoaXMueDA9bix0aGlzLnkwPWUsdGhpcy54MT1yLHRoaXMueTE9aX1mdW5jdGlvbiBuYSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBlYSh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiByYSh0LG4sZSl7dmFyIHI9bmV3IGlhKG51bGw9PW4/bmE6bixudWxsPT1lP2VhOmUsTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9yOnIuYWRkQWxsKHQpfWZ1bmN0aW9uIGlhKHQsbixlLHIsaSxvKXt0aGlzLl94PXQsdGhpcy5feT1uLHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24gb2EodCl7Zm9yKHZhciBuPXtkYXRhOnQuZGF0YX0sZT1uO3Q9dC5uZXh0OyllPWUubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBufXZhciBhYT1yYS5wcm90b3R5cGU9aWEucHJvdG90eXBlO2Z1bmN0aW9uIHVhKHQpe3JldHVybiB0LngrdC52eH1mdW5jdGlvbiBmYSh0KXtyZXR1cm4gdC55K3Qudnl9ZnVuY3Rpb24gY2EodCl7cmV0dXJuIHQuaW5kZXh9ZnVuY3Rpb24gc2EodCxuKXt2YXIgZT10LmdldChuKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrbik7cmV0dXJuIGV9ZnVuY3Rpb24gbGEodCl7cmV0dXJuIHQueH1mdW5jdGlvbiBoYSh0KXtyZXR1cm4gdC55fWFhLmNvcHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9bmV3IGlhKHRoaXMuX3gsdGhpcy5feSx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkscj10aGlzLl9yb290O2lmKCFyKXJldHVybiBlO2lmKCFyLmxlbmd0aClyZXR1cm4gZS5fcm9vdD1vYShyKSxlO2Zvcih0PVt7c291cmNlOnIsdGFyZ2V0OmUuX3Jvb3Q9bmV3IEFycmF5KDQpfV07cj10LnBvcCgpOylmb3IodmFyIGk9MDtpPDQ7KytpKShuPXIuc291cmNlW2ldKSYmKG4ubGVuZ3RoP3QucHVzaCh7c291cmNlOm4sdGFyZ2V0OnIudGFyZ2V0W2ldPW5ldyBBcnJheSg0KX0pOnIudGFyZ2V0W2ldPW9hKG4pKTtyZXR1cm4gZX0sYWEuYWRkPWZ1bmN0aW9uKHQpe3ZhciBuPSt0aGlzLl94LmNhbGwobnVsbCx0KSxlPSt0aGlzLl95LmNhbGwobnVsbCx0KTtyZXR1cm4gS28odGhpcy5jb3ZlcihuLGUpLG4sZSx0KX0sYWEuYWRkQWxsPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG89dC5sZW5ndGgsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksZj0xLzAsYz0xLzAscz0tMS8wLGw9LTEvMDtmb3IoZT0wO2U8bzsrK2UpaXNOYU4ocj0rdGhpcy5feC5jYWxsKG51bGwsbj10W2VdKSl8fGlzTmFOKGk9K3RoaXMuX3kuY2FsbChudWxsLG4pKXx8KGFbZV09cix1W2VdPWkscjxmJiYoZj1yKSxyPnMmJihzPXIpLGk8YyYmKGM9aSksaT5sJiYobD1pKSk7Zm9yKHM8ZiYmKGY9dGhpcy5feDAscz10aGlzLl94MSksbDxjJiYoYz10aGlzLl95MCxsPXRoaXMuX3kxKSx0aGlzLmNvdmVyKGYsYykuY292ZXIocyxsKSxlPTA7ZTxvOysrZSlLbyh0aGlzLGFbZV0sdVtlXSx0W2VdKTtyZXR1cm4gdGhpc30sYWEuY292ZXI9ZnVuY3Rpb24odCxuKXtpZihpc05hTih0PSt0KXx8aXNOYU4obj0rbikpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5feDAscj10aGlzLl95MCxpPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4oZSkpaT0oZT1NYXRoLmZsb29yKHQpKSsxLG89KHI9TWF0aC5mbG9vcihuKSkrMTtlbHNle2lmKCEoZT50fHx0Pml8fHI+bnx8bj5vKSlyZXR1cm4gdGhpczt2YXIgYSx1LGY9aS1lLGM9dGhpcy5fcm9vdDtzd2l0Y2godT0objwocitvKS8yKTw8MXx0PChlK2kpLzIpe2Nhc2UgMDpkb3soYT1uZXcgQXJyYXkoNCkpW3VdPWMsYz1hfXdoaWxlKG89cisoZio9MiksdD4oaT1lK2YpfHxuPm8pO2JyZWFrO2Nhc2UgMTpkb3soYT1uZXcgQXJyYXkoNCkpW3VdPWMsYz1hfXdoaWxlKG89cisoZio9MiksKGU9aS1mKT50fHxuPm8pO2JyZWFrO2Nhc2UgMjpkb3soYT1uZXcgQXJyYXkoNCkpW3VdPWMsYz1hfXdoaWxlKHI9by0oZio9MiksdD4oaT1lK2YpfHxyPm4pO2JyZWFrO2Nhc2UgMzpkb3soYT1uZXcgQXJyYXkoNCkpW3VdPWMsYz1hfXdoaWxlKHI9by0oZio9MiksKGU9aS1mKT50fHxyPm4pfXRoaXMuX3Jvb3QmJnRoaXMuX3Jvb3QubGVuZ3RoJiYodGhpcy5fcm9vdD1jKX1yZXR1cm4gdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzfSxhYS5kYXRhPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMudmlzaXQoZnVuY3Rpb24obil7aWYoIW4ubGVuZ3RoKWRve3QucHVzaChuLmRhdGEpfXdoaWxlKG49bi5uZXh0KX0pLHR9LGFhLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0sYWEuZmluZD1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvLGEsdSxmLGMscz10aGlzLl94MCxsPXRoaXMuX3kwLGg9dGhpcy5feDEsZD10aGlzLl95MSxwPVtdLHY9dGhpcy5fcm9vdDtmb3IodiYmcC5wdXNoKG5ldyB0YSh2LHMsbCxoLGQpKSxudWxsPT1lP2U9MS8wOihzPXQtZSxsPW4tZSxoPXQrZSxkPW4rZSxlKj1lKTtmPXAucG9wKCk7KWlmKCEoISh2PWYubm9kZSl8fChpPWYueDApPmh8fChvPWYueTApPmR8fChhPWYueDEpPHN8fCh1PWYueTEpPGwpKWlmKHYubGVuZ3RoKXt2YXIgZz0oaSthKS8yLHk9KG8rdSkvMjtwLnB1c2gobmV3IHRhKHZbM10sZyx5LGEsdSksbmV3IHRhKHZbMl0saSx5LGcsdSksbmV3IHRhKHZbMV0sZyxvLGEseSksbmV3IHRhKHZbMF0saSxvLGcseSkpLChjPShuPj15KTw8MXx0Pj1nKSYmKGY9cFtwLmxlbmd0aC0xXSxwW3AubGVuZ3RoLTFdPXBbcC5sZW5ndGgtMS1jXSxwW3AubGVuZ3RoLTEtY109Zil9ZWxzZXt2YXIgXz10LSt0aGlzLl94LmNhbGwobnVsbCx2LmRhdGEpLGI9bi0rdGhpcy5feS5jYWxsKG51bGwsdi5kYXRhKSxtPV8qXytiKmI7aWYobTxlKXt2YXIgeD1NYXRoLnNxcnQoZT1tKTtzPXQteCxsPW4teCxoPXQreCxkPW4reCxyPXYuZGF0YX19cmV0dXJuIHJ9LGFhLnJlbW92ZT1mdW5jdGlvbih0KXtpZihpc05hTihvPSt0aGlzLl94LmNhbGwobnVsbCx0KSl8fGlzTmFOKGE9K3RoaXMuX3kuY2FsbChudWxsLHQpKSlyZXR1cm4gdGhpczt2YXIgbixlLHIsaSxvLGEsdSxmLGMscyxsLGgsZD10aGlzLl9yb290LHA9dGhpcy5feDAsdj10aGlzLl95MCxnPXRoaXMuX3gxLHk9dGhpcy5feTE7aWYoIWQpcmV0dXJuIHRoaXM7aWYoZC5sZW5ndGgpZm9yKDs7KXtpZigoYz1vPj0odT0ocCtnKS8yKSk/cD11Omc9dSwocz1hPj0oZj0odit5KS8yKSk/dj1mOnk9ZixuPWQsIShkPWRbbD1zPDwxfGNdKSlyZXR1cm4gdGhpcztpZighZC5sZW5ndGgpYnJlYWs7KG5bbCsxJjNdfHxuW2wrMiYzXXx8bltsKzMmM10pJiYoZT1uLGg9bCl9Zm9yKDtkLmRhdGEhPT10OylpZihyPWQsIShkPWQubmV4dCkpcmV0dXJuIHRoaXM7cmV0dXJuKGk9ZC5uZXh0KSYmZGVsZXRlIGQubmV4dCxyPyhpP3IubmV4dD1pOmRlbGV0ZSByLm5leHQsdGhpcyk6bj8oaT9uW2xdPWk6ZGVsZXRlIG5bbF0sKGQ9blswXXx8blsxXXx8blsyXXx8blszXSkmJmQ9PT0oblszXXx8blsyXXx8blsxXXx8blswXSkmJiFkLmxlbmd0aCYmKGU/ZVtoXT1kOnRoaXMuX3Jvb3Q9ZCksdGhpcyk6KHRoaXMuX3Jvb3Q9aSx0aGlzKX0sYWEucmVtb3ZlQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLnJlbW92ZSh0W25dKTtyZXR1cm4gdGhpc30sYWEucm9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSxhYS5zaXplPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97Kyt0fXdoaWxlKG49bi5uZXh0KX0pLHR9LGFhLnZpc2l0PWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sYSx1PVtdLGY9dGhpcy5fcm9vdDtmb3IoZiYmdS5wdXNoKG5ldyB0YShmLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7bj11LnBvcCgpOylpZighdChmPW4ubm9kZSxyPW4ueDAsaT1uLnkwLG89bi54MSxhPW4ueTEpJiZmLmxlbmd0aCl7dmFyIGM9KHIrbykvMixzPShpK2EpLzI7KGU9ZlszXSkmJnUucHVzaChuZXcgdGEoZSxjLHMsbyxhKSksKGU9ZlsyXSkmJnUucHVzaChuZXcgdGEoZSxyLHMsYyxhKSksKGU9ZlsxXSkmJnUucHVzaChuZXcgdGEoZSxjLGksbyxzKSksKGU9ZlswXSkmJnUucHVzaChuZXcgdGEoZSxyLGksYyxzKSl9cmV0dXJuIHRoaXN9LGFhLnZpc2l0QWZ0ZXI9ZnVuY3Rpb24odCl7dmFyIG4sZT1bXSxyPVtdO2Zvcih0aGlzLl9yb290JiZlLnB1c2gobmV3IHRhKHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPWUucG9wKCk7KXt2YXIgaT1uLm5vZGU7aWYoaS5sZW5ndGgpe3ZhciBvLGE9bi54MCx1PW4ueTAsZj1uLngxLGM9bi55MSxzPShhK2YpLzIsbD0odStjKS8yOyhvPWlbMF0pJiZlLnB1c2gobmV3IHRhKG8sYSx1LHMsbCkpLChvPWlbMV0pJiZlLnB1c2gobmV3IHRhKG8scyx1LGYsbCkpLChvPWlbMl0pJiZlLnB1c2gobmV3IHRhKG8sYSxsLHMsYykpLChvPWlbM10pJiZlLnB1c2gobmV3IHRhKG8scyxsLGYsYykpfXIucHVzaChuKX1mb3IoO249ci5wb3AoKTspdChuLm5vZGUsbi54MCxuLnkwLG4ueDEsbi55MSk7cmV0dXJuIHRoaXN9LGFhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxhYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX07dmFyIGRhPTEwLHBhPU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKTtmdW5jdGlvbiB2YSh0LG4pe2lmKChlPSh0PW4/dC50b0V4cG9uZW50aWFsKG4tMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgZSxyPXQuc2xpY2UoMCxlKTtyZXR1cm5bci5sZW5ndGg+MT9yWzBdK3Iuc2xpY2UoMik6ciwrdC5zbGljZShlKzEpXX1mdW5jdGlvbiBnYSh0KXtyZXR1cm4odD12YShNYXRoLmFicyh0KSkpP3RbMV06TmFOfXZhciB5YSxfYT0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBiYSh0KXtyZXR1cm4gbmV3IG1hKHQpfWZ1bmN0aW9uIG1hKHQpe2lmKCEobj1fYS5leGVjKHQpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiK3QpO3ZhciBuO3RoaXMuZmlsbD1uWzFdfHwiICIsdGhpcy5hbGlnbj1uWzJdfHwiPiIsdGhpcy5zaWduPW5bM118fCItIix0aGlzLnN5bWJvbD1uWzRdfHwiIix0aGlzLnplcm89ISFuWzVdLHRoaXMud2lkdGg9bls2XSYmK25bNl0sdGhpcy5jb21tYT0hIW5bN10sdGhpcy5wcmVjaXNpb249bls4XSYmK25bOF0uc2xpY2UoMSksdGhpcy50cmltPSEhbls5XSx0aGlzLnR5cGU9blsxMF18fCIifWZ1bmN0aW9uIHhhKHQsbil7dmFyIGU9dmEodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXTtyZXR1cm4gaTwwPyIwLiIrbmV3IEFycmF5KC1pKS5qb2luKCIwIikrcjpyLmxlbmd0aD5pKzE/ci5zbGljZSgwLGkrMSkrIi4iK3Iuc2xpY2UoaSsxKTpyK25ldyBBcnJheShpLXIubGVuZ3RoKzIpLmpvaW4oIjAiKX1iYS5wcm90b3R5cGU9bWEucHJvdG90eXBlLG1hLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyhudWxsPT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsobnVsbD09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O3ZhciB3YT17IiUiOmZ1bmN0aW9uKHQsbil7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKG4pfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRXhwb25lbnRpYWwobil9LGY6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b0ZpeGVkKG4pfSxnOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9QcmVjaXNpb24obil9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxuKXtyZXR1cm4geGEoMTAwKnQsbil9LHI6eGEsczpmdW5jdGlvbih0LG4pe3ZhciBlPXZhKHQsbik7aWYoIWUpcmV0dXJuIHQrIiI7dmFyIHI9ZVswXSxpPWVbMV0sbz1pLSh5YT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihpLzMpKSkpKzEsYT1yLmxlbmd0aDtyZXR1cm4gbz09PWE/cjpvPmE/cituZXcgQXJyYXkoby1hKzEpLmpvaW4oIjAiKTpvPjA/ci5zbGljZSgwLG8pKyIuIityLnNsaWNlKG8pOiIwLiIrbmV3IEFycmF5KDEtbykuam9pbigiMCIpK3ZhKHQsTWF0aC5tYXgoMCxuK28tMSkpWzBdfSxYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19O2Z1bmN0aW9uIE1hKHQpe3JldHVybiB0fXZhciBBYSxUYT1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07ZnVuY3Rpb24gTmEodCl7dmFyIG4sZSxyPXQuZ3JvdXBpbmcmJnQudGhvdXNhbmRzPyhuPXQuZ3JvdXBpbmcsZT10LnRob3VzYW5kcyxmdW5jdGlvbih0LHIpe2Zvcih2YXIgaT10Lmxlbmd0aCxvPVtdLGE9MCx1PW5bMF0sZj0wO2k+MCYmdT4wJiYoZit1KzE+ciYmKHU9TWF0aC5tYXgoMSxyLWYpKSxvLnB1c2godC5zdWJzdHJpbmcoaS09dSxpK3UpKSwhKChmKz11KzEpPnIpKTspdT1uW2E9KGErMSklbi5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGUpfSk6TWEsaT10LmN1cnJlbmN5LG89dC5kZWNpbWFsLGE9dC5udW1lcmFscz9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvWzAtOV0vZyxmdW5jdGlvbihuKXtyZXR1cm4gdFsrbl19KX19KHQubnVtZXJhbHMpOk1hLHU9dC5wZXJjZW50fHwiJSI7ZnVuY3Rpb24gZih0KXt2YXIgbj0odD1iYSh0KSkuZmlsbCxlPXQuYWxpZ24sZj10LnNpZ24sYz10LnN5bWJvbCxzPXQuemVybyxsPXQud2lkdGgsaD10LmNvbW1hLGQ9dC5wcmVjaXNpb24scD10LnRyaW0sdj10LnR5cGU7Im4iPT09dj8oaD0hMCx2PSJnIik6d2Fbdl18fChudWxsPT1kJiYoZD0xMikscD0hMCx2PSJnIiksKHN8fCIwIj09PW4mJiI9Ij09PWUpJiYocz0hMCxuPSIwIixlPSI9Iik7dmFyIGc9IiQiPT09Yz9pWzBdOiIjIj09PWMmJi9bYm94WF0vLnRlc3Qodik/IjAiK3YudG9Mb3dlckNhc2UoKToiIix5PSIkIj09PWM/aVsxXTovWyVwXS8udGVzdCh2KT91OiIiLF89d2Fbdl0sYj0vW2RlZmdwcnMlXS8udGVzdCh2KTtmdW5jdGlvbiBtKHQpe3ZhciBpLHUsYyxtPWcseD15O2lmKCJjIj09PXYpeD1fKHQpK3gsdD0iIjtlbHNle3ZhciB3PSh0PSt0KTwwO2lmKHQ9XyhNYXRoLmFicyh0KSxkKSxwJiYodD1mdW5jdGlvbih0KXt0OmZvcih2YXIgbixlPXQubGVuZ3RoLHI9MSxpPS0xO3I8ZTsrK3Ipc3dpdGNoKHRbcl0pe2Nhc2UiLiI6aT1uPXI7YnJlYWs7Y2FzZSIwIjowPT09aSYmKGk9ciksbj1yO2JyZWFrO2RlZmF1bHQ6aWYoaT4wKXtpZighK3Rbcl0pYnJlYWsgdDtpPTB9fXJldHVybiBpPjA/dC5zbGljZSgwLGkpK3Quc2xpY2UobisxKTp0fSh0KSksdyYmMD09K3QmJih3PSExKSxtPSh3PyIoIj09PWY/ZjoiLSI6Ii0iPT09Znx8IigiPT09Zj8iIjpmKSttLHg9KCJzIj09PXY/VGFbOCt5YS8zXToiIikreCsodyYmIigiPT09Zj8iKSI6IiIpLGIpZm9yKGk9LTEsdT10Lmxlbmd0aDsrK2k8dTspaWYoNDg+KGM9dC5jaGFyQ29kZUF0KGkpKXx8Yz41Nyl7eD0oNDY9PT1jP28rdC5zbGljZShpKzEpOnQuc2xpY2UoaSkpK3gsdD10LnNsaWNlKDAsaSk7YnJlYWt9fWgmJiFzJiYodD1yKHQsMS8wKSk7dmFyIE09bS5sZW5ndGgrdC5sZW5ndGgreC5sZW5ndGgsQT1NPGw/bmV3IEFycmF5KGwtTSsxKS5qb2luKG4pOiIiO3N3aXRjaChoJiZzJiYodD1yKEErdCxBLmxlbmd0aD9sLXgubGVuZ3RoOjEvMCksQT0iIiksZSl7Y2FzZSI8Ijp0PW0rdCt4K0E7YnJlYWs7Y2FzZSI9Ijp0PW0rQSt0K3g7YnJlYWs7Y2FzZSJeIjp0PUEuc2xpY2UoMCxNPUEubGVuZ3RoPj4xKSttK3QreCtBLnNsaWNlKE0pO2JyZWFrO2RlZmF1bHQ6dD1BK20rdCt4fXJldHVybiBhKHQpfXJldHVybiBkPW51bGw9PWQ/NjovW2dwcnNdLy50ZXN0KHYpP01hdGgubWF4KDEsTWF0aC5taW4oMjEsZCkpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAsZCkpLG0udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sbX1yZXR1cm57Zm9ybWF0OmYsZm9ybWF0UHJlZml4OmZ1bmN0aW9uKHQsbil7dmFyIGU9ZigoKHQ9YmEodCkpLnR5cGU9ImYiLHQpKSxyPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGdhKG4pLzMpKSksaT1NYXRoLnBvdygxMCwtciksbz1UYVs4K3IvM107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlKGkqdCkrb319fX1mdW5jdGlvbiBTYShuKXtyZXR1cm4gQWE9TmEobiksdC5mb3JtYXQ9QWEuZm9ybWF0LHQuZm9ybWF0UHJlZml4PUFhLmZvcm1hdFByZWZpeCxBYX1mdW5jdGlvbiBFYSh0KXtyZXR1cm4gTWF0aC5tYXgoMCwtZ2EoTWF0aC5hYnModCkpKX1mdW5jdGlvbiBrYSh0LG4pe3JldHVybiBNYXRoLm1heCgwLDMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGdhKG4pLzMpKSktZ2EoTWF0aC5hYnModCkpKX1mdW5jdGlvbiBDYSh0LG4pe3JldHVybiB0PU1hdGguYWJzKHQpLG49TWF0aC5hYnMobiktdCxNYXRoLm1heCgwLGdhKG4pLWdhKHQpKSsxfWZ1bmN0aW9uIFBhKCl7cmV0dXJuIG5ldyB6YX1mdW5jdGlvbiB6YSgpe3RoaXMucmVzZXQoKX1TYSh7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KSx6YS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnphLHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSxhZGQ6ZnVuY3Rpb24odCl7TGEoUmEsdCx0aGlzLnQpLExhKHRoaXMsUmEucyx0aGlzLnMpLHRoaXMucz90aGlzLnQrPVJhLnQ6dGhpcy5zPVJhLnR9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIFJhPW5ldyB6YTtmdW5jdGlvbiBMYSh0LG4sZSl7dmFyIHI9dC5zPW4rZSxpPXItbixvPXItaTt0LnQ9bi1vKyhlLWkpfXZhciBEYT0xZS02LFVhPTFlLTEyLHFhPU1hdGguUEksT2E9cWEvMixZYT1xYS80LEJhPTIqcWEsRmE9MTgwL3FhLElhPXFhLzE4MCxIYT1NYXRoLmFicyxqYT1NYXRoLmF0YW4sWGE9TWF0aC5hdGFuMixHYT1NYXRoLmNvcyxWYT1NYXRoLmNlaWwsJGE9TWF0aC5leHAsV2E9TWF0aC5sb2csWmE9TWF0aC5wb3csUWE9TWF0aC5zaW4sSmE9TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9LEthPU1hdGguc3FydCx0dT1NYXRoLnRhbjtmdW5jdGlvbiBudSh0KXtyZXR1cm4gdD4xPzA6dDwtMT9xYTpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gZXUodCl7cmV0dXJuIHQ+MT9PYTp0PC0xPy1PYTpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gcnUodCl7cmV0dXJuKHQ9UWEodC8yKSkqdH1mdW5jdGlvbiBpdSgpe31mdW5jdGlvbiBvdSh0LG4pe3QmJnV1Lmhhc093blByb3BlcnR5KHQudHlwZSkmJnV1W3QudHlwZV0odCxuKX12YXIgYXU9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtvdSh0Lmdlb21ldHJ5LG4pfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmZlYXR1cmVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspb3UoZVtyXS5nZW9tZXRyeSxuKX19LHV1PXtTcGhlcmU6ZnVuY3Rpb24odCxuKXtuLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LG4pe3Q9dC5jb29yZGluYXRlcyxuLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspdD1lW3JdLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7ZnUodC5jb29yZGluYXRlcyxuLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWZ1KGVbcl0sbiwwKX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe2N1KHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspY3UoZVtyXSxuKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KW91KGVbcl0sbil9fTtmdW5jdGlvbiBmdSh0LG4sZSl7dmFyIHIsaT0tMSxvPXQubGVuZ3RoLWU7Zm9yKG4ubGluZVN0YXJ0KCk7KytpPG87KXI9dFtpXSxuLnBvaW50KHJbMF0sclsxXSxyWzJdKTtuLmxpbmVFbmQoKX1mdW5jdGlvbiBjdSh0LG4pe3ZhciBlPS0xLHI9dC5sZW5ndGg7Zm9yKG4ucG9seWdvblN0YXJ0KCk7KytlPHI7KWZ1KHRbZV0sbiwxKTtuLnBvbHlnb25FbmQoKX1mdW5jdGlvbiBzdSh0LG4pe3QmJmF1Lmhhc093blByb3BlcnR5KHQudHlwZSk/YXVbdC50eXBlXSh0LG4pOm91KHQsbil9dmFyIGx1LGh1LGR1LHB1LHZ1LGd1PVBhKCkseXU9UGEoKSxfdT17cG9pbnQ6aXUsbGluZVN0YXJ0Oml1LGxpbmVFbmQ6aXUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Z3UucmVzZXQoKSxfdS5saW5lU3RhcnQ9YnUsX3UubGluZUVuZD1tdX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciB0PStndTt5dS5hZGQodDwwP0JhK3Q6dCksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9aXV9LHNwaGVyZTpmdW5jdGlvbigpe3l1LmFkZChCYSl9fTtmdW5jdGlvbiBidSgpe191LnBvaW50PXh1fWZ1bmN0aW9uIG11KCl7d3UobHUsaHUpfWZ1bmN0aW9uIHh1KHQsbil7X3UucG9pbnQ9d3UsbHU9dCxodT1uLGR1PXQqPUlhLHB1PUdhKG49KG4qPUlhKS8yK1lhKSx2dT1RYShuKX1mdW5jdGlvbiB3dSh0LG4pe3ZhciBlPSh0Kj1JYSktZHUscj1lPj0wPzE6LTEsaT1yKmUsbz1HYShuPShuKj1JYSkvMitZYSksYT1RYShuKSx1PXZ1KmEsZj1wdSpvK3UqR2EoaSksYz11KnIqUWEoaSk7Z3UuYWRkKFhhKGMsZikpLGR1PXQscHU9byx2dT1hfWZ1bmN0aW9uIE11KHQpe3JldHVybltYYSh0WzFdLHRbMF0pLGV1KHRbMl0pXX1mdW5jdGlvbiBBdSh0KXt2YXIgbj10WzBdLGU9dFsxXSxyPUdhKGUpO3JldHVybltyKkdhKG4pLHIqUWEobiksUWEoZSldfWZ1bmN0aW9uIFR1KHQsbil7cmV0dXJuIHRbMF0qblswXSt0WzFdKm5bMV0rdFsyXSpuWzJdfWZ1bmN0aW9uIE51KHQsbil7cmV0dXJuW3RbMV0qblsyXS10WzJdKm5bMV0sdFsyXSpuWzBdLXRbMF0qblsyXSx0WzBdKm5bMV0tdFsxXSpuWzBdXX1mdW5jdGlvbiBTdSh0LG4pe3RbMF0rPW5bMF0sdFsxXSs9blsxXSx0WzJdKz1uWzJdfWZ1bmN0aW9uIEV1KHQsbil7cmV0dXJuW3RbMF0qbix0WzFdKm4sdFsyXSpuXX1mdW5jdGlvbiBrdSh0KXt2YXIgbj1LYSh0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSk7dFswXS89bix0WzFdLz1uLHRbMl0vPW59dmFyIEN1LFB1LHp1LFJ1LEx1LER1LFV1LHF1LE91LFl1LEJ1LEZ1LEl1LEh1LGp1LFh1LEd1LFZ1LCR1LFd1LFp1LFF1LEp1LEt1LHRmLG5mLGVmPVBhKCkscmY9e3BvaW50Om9mLGxpbmVTdGFydDp1ZixsaW5lRW5kOmZmLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3JmLnBvaW50PWNmLHJmLmxpbmVTdGFydD1zZixyZi5saW5lRW5kPWxmLGVmLnJlc2V0KCksX3UucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtfdS5wb2x5Z29uRW5kKCkscmYucG9pbnQ9b2YscmYubGluZVN0YXJ0PXVmLHJmLmxpbmVFbmQ9ZmYsZ3U8MD8oQ3U9LSh6dT0xODApLFB1PS0oUnU9OTApKTplZj5EYT9SdT05MDplZjwtRGEmJihQdT0tOTApLFl1WzBdPUN1LFl1WzFdPXp1fX07ZnVuY3Rpb24gb2YodCxuKXtPdS5wdXNoKFl1PVtDdT10LHp1PXRdKSxuPFB1JiYoUHU9biksbj5SdSYmKFJ1PW4pfWZ1bmN0aW9uIGFmKHQsbil7dmFyIGU9QXUoW3QqSWEsbipJYV0pO2lmKHF1KXt2YXIgcj1OdShxdSxlKSxpPU51KFtyWzFdLC1yWzBdLDBdLHIpO2t1KGkpLGk9TXUoaSk7dmFyIG8sYT10LUx1LHU9YT4wPzE6LTEsZj1pWzBdKkZhKnUsYz1IYShhKT4xODA7Y14odSpMdTxmJiZmPHUqdCk/KG89aVsxXSpGYSk+UnUmJihSdT1vKTpjXih1Kkx1PChmPShmKzM2MCklMzYwLTE4MCkmJmY8dSp0KT8obz0taVsxXSpGYSk8UHUmJihQdT1vKToobjxQdSYmKFB1PW4pLG4+UnUmJihSdT1uKSksYz90PEx1P2hmKEN1LHQpPmhmKEN1LHp1KSYmKHp1PXQpOmhmKHQsenUpPmhmKEN1LHp1KSYmKEN1PXQpOnp1Pj1DdT8odDxDdSYmKEN1PXQpLHQ+enUmJih6dT10KSk6dD5MdT9oZihDdSx0KT5oZihDdSx6dSkmJih6dT10KTpoZih0LHp1KT5oZihDdSx6dSkmJihDdT10KX1lbHNlIE91LnB1c2goWXU9W0N1PXQsenU9dF0pO248UHUmJihQdT1uKSxuPlJ1JiYoUnU9bikscXU9ZSxMdT10fWZ1bmN0aW9uIHVmKCl7cmYucG9pbnQ9YWZ9ZnVuY3Rpb24gZmYoKXtZdVswXT1DdSxZdVsxXT16dSxyZi5wb2ludD1vZixxdT1udWxsfWZ1bmN0aW9uIGNmKHQsbil7aWYocXUpe3ZhciBlPXQtTHU7ZWYuYWRkKEhhKGUpPjE4MD9lKyhlPjA/MzYwOi0zNjApOmUpfWVsc2UgRHU9dCxVdT1uO191LnBvaW50KHQsbiksYWYodCxuKX1mdW5jdGlvbiBzZigpe191LmxpbmVTdGFydCgpfWZ1bmN0aW9uIGxmKCl7Y2YoRHUsVXUpLF91LmxpbmVFbmQoKSxIYShlZik+RGEmJihDdT0tKHp1PTE4MCkpLFl1WzBdPUN1LFl1WzFdPXp1LHF1PW51bGx9ZnVuY3Rpb24gaGYodCxuKXtyZXR1cm4obi09dCk8MD9uKzM2MDpufWZ1bmN0aW9uIGRmKHQsbil7cmV0dXJuIHRbMF0tblswXX1mdW5jdGlvbiBwZih0LG4pe3JldHVybiB0WzBdPD10WzFdP3RbMF08PW4mJm48PXRbMV06bjx0WzBdfHx0WzFdPG59dmFyIHZmPXtzcGhlcmU6aXUscG9pbnQ6Z2YsbGluZVN0YXJ0Ol9mLGxpbmVFbmQ6eGYscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dmYubGluZVN0YXJ0PXdmLHZmLmxpbmVFbmQ9TWZ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2Zi5saW5lU3RhcnQ9X2YsdmYubGluZUVuZD14Zn19O2Z1bmN0aW9uIGdmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpO3lmKGUqR2EodCksZSpRYSh0KSxRYShuKSl9ZnVuY3Rpb24geWYodCxuLGUpe0l1Kz0odC1JdSkvKytCdSxIdSs9KG4tSHUpL0J1LGp1Kz0oZS1qdSkvQnV9ZnVuY3Rpb24gX2YoKXt2Zi5wb2ludD1iZn1mdW5jdGlvbiBiZih0LG4pe3QqPUlhO3ZhciBlPUdhKG4qPUlhKTtLdT1lKkdhKHQpLHRmPWUqUWEodCksbmY9UWEobiksdmYucG9pbnQ9bWYseWYoS3UsdGYsbmYpfWZ1bmN0aW9uIG1mKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpLHI9ZSpHYSh0KSxpPWUqUWEodCksbz1RYShuKSxhPVhhKEthKChhPXRmKm8tbmYqaSkqYSsoYT1uZipyLUt1Km8pKmErKGE9S3UqaS10ZipyKSphKSxLdSpyK3RmKmkrbmYqbyk7RnUrPWEsWHUrPWEqKEt1KyhLdT1yKSksR3UrPWEqKHRmKyh0Zj1pKSksVnUrPWEqKG5mKyhuZj1vKSkseWYoS3UsdGYsbmYpfWZ1bmN0aW9uIHhmKCl7dmYucG9pbnQ9Z2Z9ZnVuY3Rpb24gd2YoKXt2Zi5wb2ludD1BZn1mdW5jdGlvbiBNZigpe1RmKFF1LEp1KSx2Zi5wb2ludD1nZn1mdW5jdGlvbiBBZih0LG4pe1F1PXQsSnU9bix0Kj1JYSxuKj1JYSx2Zi5wb2ludD1UZjt2YXIgZT1HYShuKTtLdT1lKkdhKHQpLHRmPWUqUWEodCksbmY9UWEobikseWYoS3UsdGYsbmYpfWZ1bmN0aW9uIFRmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpLHI9ZSpHYSh0KSxpPWUqUWEodCksbz1RYShuKSxhPXRmKm8tbmYqaSx1PW5mKnItS3UqbyxmPUt1KmktdGYqcixjPUthKGEqYSt1KnUrZipmKSxzPWV1KGMpLGw9YyYmLXMvYzskdSs9bCphLFd1Kz1sKnUsWnUrPWwqZixGdSs9cyxYdSs9cyooS3UrKEt1PXIpKSxHdSs9cyoodGYrKHRmPWkpKSxWdSs9cyoobmYrKG5mPW8pKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24gTmYodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIFNmKHQsbil7ZnVuY3Rpb24gZShlLHIpe3JldHVybiBlPXQoZSxyKSxuKGVbMF0sZVsxXSl9cmV0dXJuIHQuaW52ZXJ0JiZuLmludmVydCYmKGUuaW52ZXJ0PWZ1bmN0aW9uKGUscil7cmV0dXJuKGU9bi5pbnZlcnQoZSxyKSkmJnQuaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIEVmKHQsbil7cmV0dXJuW3Q+cWE/dC1CYTp0PC1xYT90K0JhOnQsbl19ZnVuY3Rpb24ga2YodCxuLGUpe3JldHVybih0JT1CYSk/bnx8ZT9TZihQZih0KSx6ZihuLGUpKTpQZih0KTpufHxlP3pmKG4sZSk6RWZ9ZnVuY3Rpb24gQ2YodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7cmV0dXJuWyhuKz10KT5xYT9uLUJhOm48LXFhP24rQmE6bixlXX19ZnVuY3Rpb24gUGYodCl7dmFyIG49Q2YodCk7cmV0dXJuIG4uaW52ZXJ0PUNmKC10KSxufWZ1bmN0aW9uIHpmKHQsbil7dmFyIGU9R2EodCkscj1RYSh0KSxpPUdhKG4pLG89UWEobik7ZnVuY3Rpb24gYSh0LG4pe3ZhciBhPUdhKG4pLHU9R2EodCkqYSxmPVFhKHQpKmEsYz1RYShuKSxzPWMqZSt1KnI7cmV0dXJuW1hhKGYqaS1zKm8sdSplLWMqciksZXUocyppK2YqbyldfXJldHVybiBhLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciBhPUdhKG4pLHU9R2EodCkqYSxmPVFhKHQpKmEsYz1RYShuKSxzPWMqaS1mKm87cmV0dXJuW1hhKGYqaStjKm8sdSplK3MqciksZXUocyplLXUqcildfSxhfWZ1bmN0aW9uIFJmKHQpe2Z1bmN0aW9uIG4obil7cmV0dXJuKG49dChuWzBdKklhLG5bMV0qSWEpKVswXSo9RmEsblsxXSo9RmEsbn1yZXR1cm4gdD1rZih0WzBdKklhLHRbMV0qSWEsdC5sZW5ndGg+Mj90WzJdKklhOjApLG4uaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybihuPXQuaW52ZXJ0KG5bMF0qSWEsblsxXSpJYSkpWzBdKj1GYSxuWzFdKj1GYSxufSxufWZ1bmN0aW9uIExmKHQsbixlLHIsaSxvKXtpZihlKXt2YXIgYT1HYShuKSx1PVFhKG4pLGY9ciplO251bGw9PWk/KGk9bityKkJhLG89bi1mLzIpOihpPURmKGEsaSksbz1EZihhLG8pLChyPjA/aTxvOmk+bykmJihpKz1yKkJhKSk7Zm9yKHZhciBjLHM9aTtyPjA/cz5vOnM8bztzLT1mKWM9TXUoW2EsLXUqR2EocyksLXUqUWEocyldKSx0LnBvaW50KGNbMF0sY1sxXSl9fWZ1bmN0aW9uIERmKHQsbil7KG49QXUobikpWzBdLT10LGt1KG4pO3ZhciBlPW51KC1uWzFdKTtyZXR1cm4oKC1uWzJdPDA/LWU6ZSkrQmEtRGEpJUJhfWZ1bmN0aW9uIFVmKCl7dmFyIHQsbj1bXTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obixlKXt0LnB1c2goW24sZV0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLnB1c2godD1bXSl9LGxpbmVFbmQ6aXUscmVqb2luOmZ1bmN0aW9uKCl7bi5sZW5ndGg+MSYmbi5wdXNoKG4ucG9wKCkuY29uY2F0KG4uc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgZT1uO3JldHVybiBuPVtdLHQ9bnVsbCxlfX19ZnVuY3Rpb24gcWYodCxuKXtyZXR1cm4gSGEodFswXS1uWzBdKTxEYSYmSGEodFsxXS1uWzFdKTxEYX1mdW5jdGlvbiBPZih0LG4sZSxyKXt0aGlzLng9dCx0aGlzLno9bix0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIFlmKHQsbixlLHIsaSl7dmFyIG8sYSx1PVtdLGY9W107aWYodC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCEoKG49dC5sZW5ndGgtMSk8PTApKXt2YXIgbixlLHI9dFswXSxhPXRbbl07aWYocWYocixhKSl7Zm9yKGkubGluZVN0YXJ0KCksbz0wO288bjsrK28paS5wb2ludCgocj10W29dKVswXSxyWzFdKTtpLmxpbmVFbmQoKX1lbHNlIHUucHVzaChlPW5ldyBPZihyLHQsbnVsbCwhMCkpLGYucHVzaChlLm89bmV3IE9mKHIsbnVsbCxlLCExKSksdS5wdXNoKGU9bmV3IE9mKGEsdCxudWxsLCExKSksZi5wdXNoKGUubz1uZXcgT2YoYSxudWxsLGUsITApKX19KSx1Lmxlbmd0aCl7Zm9yKGYuc29ydChuKSxCZih1KSxCZihmKSxvPTAsYT1mLmxlbmd0aDtvPGE7KytvKWZbb10uZT1lPSFlO2Zvcih2YXIgYyxzLGw9dVswXTs7KXtmb3IodmFyIGg9bCxkPSEwO2gudjspaWYoKGg9aC5uKT09PWwpcmV0dXJuO2M9aC56LGkubGluZVN0YXJ0KCk7ZG97aWYoaC52PWguby52PSEwLGguZSl7aWYoZClmb3Iobz0wLGE9Yy5sZW5ndGg7bzxhOysrbylpLnBvaW50KChzPWNbb10pWzBdLHNbMV0pO2Vsc2UgcihoLngsaC5uLngsMSxpKTtoPWgubn1lbHNle2lmKGQpZm9yKGM9aC5wLnosbz1jLmxlbmd0aC0xO28+PTA7LS1vKWkucG9pbnQoKHM9Y1tvXSlbMF0sc1sxXSk7ZWxzZSByKGgueCxoLnAueCwtMSxpKTtoPWgucH1jPShoPWgubykueixkPSFkfXdoaWxlKCFoLnYpO2kubGluZUVuZCgpfX19ZnVuY3Rpb24gQmYodCl7aWYobj10Lmxlbmd0aCl7Zm9yKHZhciBuLGUscj0wLGk9dFswXTsrK3I8bjspaS5uPWU9dFtyXSxlLnA9aSxpPWU7aS5uPWU9dFswXSxlLnA9aX19RWYuaW52ZXJ0PUVmO3ZhciBGZj1QYSgpO2Z1bmN0aW9uIElmKHQsbil7dmFyIGU9blswXSxyPW5bMV0saT1RYShyKSxvPVtRYShlKSwtR2EoZSksMF0sYT0wLHU9MDtGZi5yZXNldCgpLDE9PT1pP3I9T2ErRGE6LTE9PT1pJiYocj0tT2EtRGEpO2Zvcih2YXIgZj0wLGM9dC5sZW5ndGg7ZjxjOysrZilpZihsPShzPXRbZl0pLmxlbmd0aClmb3IodmFyIHMsbCxoPXNbbC0xXSxkPWhbMF0scD1oWzFdLzIrWWEsdj1RYShwKSxnPUdhKHApLHk9MDt5PGw7Kyt5LGQ9Yix2PXgsZz13LGg9Xyl7dmFyIF89c1t5XSxiPV9bMF0sbT1fWzFdLzIrWWEseD1RYShtKSx3PUdhKG0pLE09Yi1kLEE9TT49MD8xOi0xLFQ9QSpNLE49VD5xYSxTPXYqeDtpZihGZi5hZGQoWGEoUypBKlFhKFQpLGcqdytTKkdhKFQpKSksYSs9Tj9NK0EqQmE6TSxOXmQ+PWVeYj49ZSl7dmFyIEU9TnUoQXUoaCksQXUoXykpO2t1KEUpO3ZhciBrPU51KG8sRSk7a3Uoayk7dmFyIEM9KE5eTT49MD8tMToxKSpldShrWzJdKTsocj5DfHxyPT09QyYmKEVbMF18fEVbMV0pKSYmKHUrPU5eTT49MD8xOi0xKX19cmV0dXJuKGE8LURhfHxhPERhJiZGZjwtRGEpXjEmdX1mdW5jdGlvbiBIZih0LG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG8sYSx1LGY9bihpKSxjPVVmKCkscz1uKGMpLGw9ITEsaD17cG9pbnQ6ZCxsaW5lU3RhcnQ6dixsaW5lRW5kOmcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7aC5wb2ludD15LGgubGluZVN0YXJ0PV8saC5saW5lRW5kPWIsYT1bXSxvPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7aC5wb2ludD1kLGgubGluZVN0YXJ0PXYsaC5saW5lRW5kPWcsYT1OKGEpO3ZhciB0PUlmKG8scik7YS5sZW5ndGg/KGx8fChpLnBvbHlnb25TdGFydCgpLGw9ITApLFlmKGEsWGYsdCxlLGkpKTp0JiYobHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpKSxsJiYoaS5wb2x5Z29uRW5kKCksbD0hMSksYT1vPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2kucG9seWdvblN0YXJ0KCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpLGkucG9seWdvbkVuZCgpfX07ZnVuY3Rpb24gZChuLGUpe3QobixlKSYmaS5wb2ludChuLGUpfWZ1bmN0aW9uIHAodCxuKXtmLnBvaW50KHQsbil9ZnVuY3Rpb24gdigpe2gucG9pbnQ9cCxmLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGcoKXtoLnBvaW50PWQsZi5saW5lRW5kKCl9ZnVuY3Rpb24geSh0LG4pe3UucHVzaChbdCxuXSkscy5wb2ludCh0LG4pfWZ1bmN0aW9uIF8oKXtzLmxpbmVTdGFydCgpLHU9W119ZnVuY3Rpb24gYigpe3kodVswXVswXSx1WzBdWzFdKSxzLmxpbmVFbmQoKTt2YXIgdCxuLGUscixmPXMuY2xlYW4oKSxoPWMucmVzdWx0KCksZD1oLmxlbmd0aDtpZih1LnBvcCgpLG8ucHVzaCh1KSx1PW51bGwsZClpZigxJmYpe2lmKChuPShlPWhbMF0pLmxlbmd0aC0xKT4wKXtmb3IobHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksaS5saW5lU3RhcnQoKSx0PTA7dDxuOysrdClpLnBvaW50KChyPWVbdF0pWzBdLHJbMV0pO2kubGluZUVuZCgpfX1lbHNlIGQ+MSYmMiZmJiZoLnB1c2goaC5wb3AoKS5jb25jYXQoaC5zaGlmdCgpKSksYS5wdXNoKGguZmlsdGVyKGpmKSl9cmV0dXJuIGh9fWZ1bmN0aW9uIGpmKHQpe3JldHVybiB0Lmxlbmd0aD4xfWZ1bmN0aW9uIFhmKHQsbil7cmV0dXJuKCh0PXQueClbMF08MD90WzFdLU9hLURhOk9hLXRbMV0pLSgobj1uLngpWzBdPDA/blsxXS1PYS1EYTpPYS1uWzFdKX12YXIgR2Y9SGYoZnVuY3Rpb24oKXtyZXR1cm4hMH0sZnVuY3Rpb24odCl7dmFyIG4sZT1OYU4scj1OYU4saT1OYU47cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksbj0xfSxwb2ludDpmdW5jdGlvbihvLGEpe3ZhciB1PW8+MD9xYTotcWEsZj1IYShvLWUpO0hhKGYtcWEpPERhPyh0LnBvaW50KGUscj0ocithKS8yPjA/T2E6LU9hKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksdC5wb2ludChvLHIpLG49MCk6aSE9PXUmJmY+PXFhJiYoSGEoZS1pKTxEYSYmKGUtPWkqRGEpLEhhKG8tdSk8RGEmJihvLT11KkRhKSxyPWZ1bmN0aW9uKHQsbixlLHIpe3ZhciBpLG8sYT1RYSh0LWUpO3JldHVybiBIYShhKT5EYT9qYSgoUWEobikqKG89R2EocikpKlFhKGUpLVFhKHIpKihpPUdhKG4pKSpRYSh0KSkvKGkqbyphKSk6KG4rcikvMn0oZSxyLG8sYSksdC5wb2ludChpLHIpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludCh1LHIpLG49MCksdC5wb2ludChlPW8scj1hKSxpPXV9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKSxlPXI9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLW59fX0sZnVuY3Rpb24odCxuLGUscil7dmFyIGk7aWYobnVsbD09dClpPWUqT2Esci5wb2ludCgtcWEsaSksci5wb2ludCgwLGkpLHIucG9pbnQocWEsaSksci5wb2ludChxYSwwKSxyLnBvaW50KHFhLC1pKSxyLnBvaW50KDAsLWkpLHIucG9pbnQoLXFhLC1pKSxyLnBvaW50KC1xYSwwKSxyLnBvaW50KC1xYSxpKTtlbHNlIGlmKEhhKHRbMF0tblswXSk+RGEpe3ZhciBvPXRbMF08blswXT9xYTotcWE7aT1lKm8vMixyLnBvaW50KC1vLGkpLHIucG9pbnQoMCxpKSxyLnBvaW50KG8saSl9ZWxzZSByLnBvaW50KG5bMF0sblsxXSl9LFstcWEsLU9hXSk7ZnVuY3Rpb24gVmYodCl7dmFyIG49R2EodCksZT02KklhLHI9bj4wLGk9SGEobik+RGE7ZnVuY3Rpb24gbyh0LGUpe3JldHVybiBHYSh0KSpHYShlKT5ufWZ1bmN0aW9uIGEodCxlLHIpe3ZhciBpPVsxLDAsMF0sbz1OdShBdSh0KSxBdShlKSksYT1UdShvLG8pLHU9b1swXSxmPWEtdSp1O2lmKCFmKXJldHVybiFyJiZ0O3ZhciBjPW4qYS9mLHM9LW4qdS9mLGw9TnUoaSxvKSxoPUV1KGksYyk7U3UoaCxFdShvLHMpKTt2YXIgZD1sLHA9VHUoaCxkKSx2PVR1KGQsZCksZz1wKnAtdiooVHUoaCxoKS0xKTtpZighKGc8MCkpe3ZhciB5PUthKGcpLF89RXUoZCwoLXAteSkvdik7aWYoU3UoXyxoKSxfPU11KF8pLCFyKXJldHVybiBfO3ZhciBiLG09dFswXSx4PWVbMF0sdz10WzFdLE09ZVsxXTt4PG0mJihiPW0sbT14LHg9Yik7dmFyIEE9eC1tLFQ9SGEoQS1xYSk8RGE7aWYoIVQmJk08dyYmKGI9dyx3PU0sTT1iKSxUfHxBPERhP1Q/dytNPjBeX1sxXTwoSGEoX1swXS1tKTxEYT93Ok0pOnc8PV9bMV0mJl9bMV08PU06QT5xYV4obTw9X1swXSYmX1swXTw9eCkpe3ZhciBOPUV1KGQsKC1wK3kpL3YpO3JldHVybiBTdShOLGgpLFtfLE11KE4pXX19fWZ1bmN0aW9uIHUobixlKXt2YXIgaT1yP3Q6cWEtdCxvPTA7cmV0dXJuIG48LWk/b3w9MTpuPmkmJihvfD0yKSxlPC1pP298PTQ6ZT5pJiYob3w9OCksb31yZXR1cm4gSGYobyxmdW5jdGlvbih0KXt2YXIgbixlLGYsYyxzO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtjPWY9ITEscz0xfSxwb2ludDpmdW5jdGlvbihsLGgpe3ZhciBkLHA9W2wsaF0sdj1vKGwsaCksZz1yP3Y/MDp1KGwsaCk6dj91KGwrKGw8MD9xYTotcWEpLGgpOjA7aWYoIW4mJihjPWY9dikmJnQubGluZVN0YXJ0KCksdiE9PWYmJighKGQ9YShuLHApKXx8cWYobixkKXx8cWYocCxkKSkmJihwWzBdKz1EYSxwWzFdKz1EYSx2PW8ocFswXSxwWzFdKSksdiE9PWYpcz0wLHY/KHQubGluZVN0YXJ0KCksZD1hKHAsbiksdC5wb2ludChkWzBdLGRbMV0pKTooZD1hKG4scCksdC5wb2ludChkWzBdLGRbMV0pLHQubGluZUVuZCgpKSxuPWQ7ZWxzZSBpZihpJiZuJiZyXnYpe3ZhciB5O2cmZXx8ISh5PWEocCxuLCEwKSl8fChzPTAscj8odC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSksdC5wb2ludCh5WzFdWzBdLHlbMV1bMV0pLHQubGluZUVuZCgpKToodC5wb2ludCh5WzFdWzBdLHlbMV1bMV0pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludCh5WzBdWzBdLHlbMF1bMV0pKSl9IXZ8fG4mJnFmKG4scCl8fHQucG9pbnQocFswXSxwWzFdKSxuPXAsZj12LGU9Z30sbGluZUVuZDpmdW5jdGlvbigpe2YmJnQubGluZUVuZCgpLG49bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gc3woYyYmZik8PDF9fX0sZnVuY3Rpb24obixyLGksbyl7TGYobyx0LGUsaSxuLHIpfSxyP1swLC10XTpbLXFhLHQtcWFdKX12YXIgJGY9MWU5LFdmPS0kZjtmdW5jdGlvbiBaZih0LG4sZSxyKXtmdW5jdGlvbiBpKGksbyl7cmV0dXJuIHQ8PWkmJmk8PWUmJm48PW8mJm88PXJ9ZnVuY3Rpb24gbyhpLG8sdSxjKXt2YXIgcz0wLGw9MDtpZihudWxsPT1pfHwocz1hKGksdSkpIT09KGw9YShvLHUpKXx8ZihpLG8pPDBedT4wKWRve2MucG9pbnQoMD09PXN8fDM9PT1zP3Q6ZSxzPjE/cjpuKX13aGlsZSgocz0ocyt1KzQpJTQpIT09bCk7ZWxzZSBjLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gYShyLGkpe3JldHVybiBIYShyWzBdLXQpPERhP2k+MD8wOjM6SGEoclswXS1lKTxEYT9pPjA/MjoxOkhhKHJbMV0tbik8RGE/aT4wPzE6MDppPjA/MzoyfWZ1bmN0aW9uIHUodCxuKXtyZXR1cm4gZih0Lngsbi54KX1mdW5jdGlvbiBmKHQsbil7dmFyIGU9YSh0LDEpLHI9YShuLDEpO3JldHVybiBlIT09cj9lLXI6MD09PWU/blsxXS10WzFdOjE9PT1lP3RbMF0tblswXToyPT09ZT90WzFdLW5bMV06blswXS10WzBdfXJldHVybiBmdW5jdGlvbihhKXt2YXIgZixjLHMsbCxoLGQscCx2LGcseSxfLGI9YSxtPVVmKCkseD17cG9pbnQ6dyxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt4LnBvaW50PU0sYyYmYy5wdXNoKHM9W10pO3k9ITAsZz0hMSxwPXY9TmFOfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZiYmKE0obCxoKSxkJiZnJiZtLnJlam9pbigpLGYucHVzaChtLnJlc3VsdCgpKSk7eC5wb2ludD13LGcmJmIubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtiPW0sZj1bXSxjPVtdLF89ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgbj1mdW5jdGlvbigpe2Zvcih2YXIgbj0wLGU9MCxpPWMubGVuZ3RoO2U8aTsrK2UpZm9yKHZhciBvLGEsdT1jW2VdLGY9MSxzPXUubGVuZ3RoLGw9dVswXSxoPWxbMF0sZD1sWzFdO2Y8czsrK2Ypbz1oLGE9ZCxsPXVbZl0saD1sWzBdLGQ9bFsxXSxhPD1yP2Q+ciYmKGgtbykqKHItYSk+KGQtYSkqKHQtbykmJisrbjpkPD1yJiYoaC1vKSooci1hKTwoZC1hKSoodC1vKSYmLS1uO3JldHVybiBufSgpLGU9XyYmbixpPShmPU4oZikpLmxlbmd0aDsoZXx8aSkmJihhLnBvbHlnb25TdGFydCgpLGUmJihhLmxpbmVTdGFydCgpLG8obnVsbCxudWxsLDEsYSksYS5saW5lRW5kKCkpLGkmJllmKGYsdSxuLG8sYSksYS5wb2x5Z29uRW5kKCkpO2I9YSxmPWM9cz1udWxsfX07ZnVuY3Rpb24gdyh0LG4pe2kodCxuKSYmYi5wb2ludCh0LG4pfWZ1bmN0aW9uIE0obyxhKXt2YXIgdT1pKG8sYSk7aWYoYyYmcy5wdXNoKFtvLGFdKSx5KWw9byxoPWEsZD11LHk9ITEsdSYmKGIubGluZVN0YXJ0KCksYi5wb2ludChvLGEpKTtlbHNlIGlmKHUmJmcpYi5wb2ludChvLGEpO2Vsc2V7dmFyIGY9W3A9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYscCkpLHY9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsdikpXSxtPVtvPU1hdGgubWF4KFdmLE1hdGgubWluKCRmLG8pKSxhPU1hdGgubWF4KFdmLE1hdGgubWluKCRmLGEpKV07IWZ1bmN0aW9uKHQsbixlLHIsaSxvKXt2YXIgYSx1PXRbMF0sZj10WzFdLGM9MCxzPTEsbD1uWzBdLXUsaD1uWzFdLWY7aWYoYT1lLXUsbHx8IShhPjApKXtpZihhLz1sLGw8MCl7aWYoYTxjKXJldHVybjthPHMmJihzPWEpfWVsc2UgaWYobD4wKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9aWYoYT1pLXUsbHx8IShhPDApKXtpZihhLz1sLGw8MCl7aWYoYT5zKXJldHVybjthPmMmJihjPWEpfWVsc2UgaWYobD4wKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9aWYoYT1yLWYsaHx8IShhPjApKXtpZihhLz1oLGg8MCl7aWYoYTxjKXJldHVybjthPHMmJihzPWEpfWVsc2UgaWYoaD4wKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9aWYoYT1vLWYsaHx8IShhPDApKXtpZihhLz1oLGg8MCl7aWYoYT5zKXJldHVybjthPmMmJihjPWEpfWVsc2UgaWYoaD4wKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9cmV0dXJuIGM+MCYmKHRbMF09dStjKmwsdFsxXT1mK2MqaCksczwxJiYoblswXT11K3MqbCxuWzFdPWYrcypoKSwhMH19fX19KGYsbSx0LG4sZSxyKT91JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSksXz0hMSk6KGd8fChiLmxpbmVTdGFydCgpLGIucG9pbnQoZlswXSxmWzFdKSksYi5wb2ludChtWzBdLG1bMV0pLHV8fGIubGluZUVuZCgpLF89ITEpfXA9byx2PWEsZz11fXJldHVybiB4fX12YXIgUWYsSmYsS2YsdGM9UGEoKSxuYz17c3BoZXJlOml1LHBvaW50Oml1LGxpbmVTdGFydDpmdW5jdGlvbigpe25jLnBvaW50PXJjLG5jLmxpbmVFbmQ9ZWN9LGxpbmVFbmQ6aXUscG9seWdvblN0YXJ0Oml1LHBvbHlnb25FbmQ6aXV9O2Z1bmN0aW9uIGVjKCl7bmMucG9pbnQ9bmMubGluZUVuZD1pdX1mdW5jdGlvbiByYyh0LG4pe1FmPXQqPUlhLEpmPVFhKG4qPUlhKSxLZj1HYShuKSxuYy5wb2ludD1pY31mdW5jdGlvbiBpYyh0LG4pe3QqPUlhO3ZhciBlPVFhKG4qPUlhKSxyPUdhKG4pLGk9SGEodC1RZiksbz1HYShpKSxhPXIqUWEoaSksdT1LZiplLUpmKnIqbyxmPUpmKmUrS2YqcipvO3RjLmFkZChYYShLYShhKmErdSp1KSxmKSksUWY9dCxKZj1lLEtmPXJ9ZnVuY3Rpb24gb2ModCl7cmV0dXJuIHRjLnJlc2V0KCksc3UodCxuYyksK3RjfXZhciBhYz1bbnVsbCxudWxsXSx1Yz17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6YWN9O2Z1bmN0aW9uIGZjKHQsbil7cmV0dXJuIGFjWzBdPXQsYWNbMV09bixvYyh1Yyl9dmFyIGNjPXtGZWF0dXJlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGxjKHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihsYyhlW3JdLmdlb21ldHJ5LG4pKXJldHVybiEwO3JldHVybiExfX0sc2M9e1NwaGVyZTpmdW5jdGlvbigpe3JldHVybiEwfSxQb2ludDpmdW5jdGlvbih0LG4pe3JldHVybiBoYyh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihoYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGRjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoZGMoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe3JldHVybiBwYyh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKHBjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10Lmdlb21ldHJpZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihsYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfX07ZnVuY3Rpb24gbGModCxuKXtyZXR1cm4hKCF0fHwhc2MuaGFzT3duUHJvcGVydHkodC50eXBlKSkmJnNjW3QudHlwZV0odCxuKX1mdW5jdGlvbiBoYyh0LG4pe3JldHVybiAwPT09ZmModCxuKX1mdW5jdGlvbiBkYyh0LG4pe3ZhciBlPWZjKHRbMF0sdFsxXSk7cmV0dXJuIGZjKHRbMF0sbikrZmMobix0WzFdKTw9ZStEYX1mdW5jdGlvbiBwYyh0LG4pe3JldHVybiEhSWYodC5tYXAodmMpLGdjKG4pKX1mdW5jdGlvbiB2Yyh0KXtyZXR1cm4odD10Lm1hcChnYykpLnBvcCgpLHR9ZnVuY3Rpb24gZ2ModCl7cmV0dXJuW3RbMF0qSWEsdFsxXSpJYV19ZnVuY3Rpb24geWModCxuLGUpe3ZhciByPWcodCxuLURhLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVyblt0LG5dfSl9fWZ1bmN0aW9uIF9jKHQsbixlKXt2YXIgcj1nKHQsbi1EYSxlKS5jb25jYXQobik7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByLm1hcChmdW5jdGlvbihuKXtyZXR1cm5bbix0XX0pfX1mdW5jdGlvbiBiYygpe3ZhciB0LG4sZSxyLGksbyxhLHUsZixjLHMsbCxoPTEwLGQ9aCxwPTkwLHY9MzYwLHk9Mi41O2Z1bmN0aW9uIF8oKXtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpiKCl9fWZ1bmN0aW9uIGIoKXtyZXR1cm4gZyhWYShyL3ApKnAsZSxwKS5tYXAocykuY29uY2F0KGcoVmEodS92KSp2LGEsdikubWFwKGwpKS5jb25jYXQoZyhWYShuL2gpKmgsdCxoKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIEhhKHQlcCk+RGF9KS5tYXAoZikpLmNvbmNhdChnKFZhKG8vZCkqZCxpLGQpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gSGEodCV2KT5EYX0pLm1hcChjKSl9cmV0dXJuIF8ubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYigpLm1hcChmdW5jdGlvbih0KXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH19KX0sXy5vdXRsaW5lPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltzKHIpLmNvbmNhdChsKGEpLnNsaWNlKDEpLHMoZSkucmV2ZXJzZSgpLnNsaWNlKDEpLGwodSkucmV2ZXJzZSgpLnNsaWNlKDEpKV19fSxfLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9fLmV4dGVudE1ham9yKHQpLmV4dGVudE1pbm9yKHQpOl8uZXh0ZW50TWlub3IoKX0sXy5leHRlbnRNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdFswXVswXSxlPSt0WzFdWzBdLHU9K3RbMF1bMV0sYT0rdFsxXVsxXSxyPmUmJih0PXIscj1lLGU9dCksdT5hJiYodD11LHU9YSxhPXQpLF8ucHJlY2lzaW9uKHkpKTpbW3IsdV0sW2UsYV1dfSxfLmV4dGVudE1pbm9yPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlWzBdWzBdLHQ9K2VbMV1bMF0sbz0rZVswXVsxXSxpPStlWzFdWzFdLG4+dCYmKGU9bixuPXQsdD1lKSxvPmkmJihlPW8sbz1pLGk9ZSksXy5wcmVjaXNpb24oeSkpOltbbixvXSxbdCxpXV19LF8uc3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9fLnN0ZXBNYWpvcih0KS5zdGVwTWlub3IodCk6Xy5zdGVwTWlub3IoKX0sXy5zdGVwTWFqb3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K3RbMF0sdj0rdFsxXSxfKTpbcCx2XX0sXy5zdGVwTWlub3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3RbMF0sZD0rdFsxXSxfKTpbaCxkXX0sXy5wcmVjaXNpb249ZnVuY3Rpb24oaCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K2gsZj15YyhvLGksOTApLGM9X2Mobix0LHkpLHM9eWModSxhLDkwKSxsPV9jKHIsZSx5KSxfKTp5fSxfLmV4dGVudE1ham9yKFtbLTE4MCwtOTArRGFdLFsxODAsOTAtRGFdXSkuZXh0ZW50TWlub3IoW1stMTgwLC04MC1EYV0sWzE4MCw4MCtEYV1dKX1mdW5jdGlvbiBtYyh0KXtyZXR1cm4gdH12YXIgeGMsd2MsTWMsQWMsVGM9UGEoKSxOYz1QYSgpLFNjPXtwb2ludDppdSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtTYy5saW5lU3RhcnQ9RWMsU2MubGluZUVuZD1QY30scG9seWdvbkVuZDpmdW5jdGlvbigpe1NjLmxpbmVTdGFydD1TYy5saW5lRW5kPVNjLnBvaW50PWl1LFRjLmFkZChIYShOYykpLE5jLnJlc2V0KCl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVRjLzI7cmV0dXJuIFRjLnJlc2V0KCksdH19O2Z1bmN0aW9uIEVjKCl7U2MucG9pbnQ9a2N9ZnVuY3Rpb24ga2ModCxuKXtTYy5wb2ludD1DYyx4Yz1NYz10LHdjPUFjPW59ZnVuY3Rpb24gQ2ModCxuKXtOYy5hZGQoQWMqdC1NYypuKSxNYz10LEFjPW59ZnVuY3Rpb24gUGMoKXtDYyh4Yyx3Yyl9dmFyIHpjPTEvMCxSYz16YyxMYz0temMsRGM9TGMsVWM9e3BvaW50OmZ1bmN0aW9uKHQsbil7dDx6YyYmKHpjPXQpO3Q+TGMmJihMYz10KTtuPFJjJiYoUmM9bik7bj5EYyYmKERjPW4pfSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6aXUscG9seWdvbkVuZDppdSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1bW3pjLFJjXSxbTGMsRGNdXTtyZXR1cm4gTGM9RGM9LShSYz16Yz0xLzApLHR9fTt2YXIgcWMsT2MsWWMsQmMsRmM9MCxJYz0wLEhjPTAsamM9MCxYYz0wLEdjPTAsVmM9MCwkYz0wLFdjPTAsWmM9e3BvaW50OlFjLGxpbmVTdGFydDpKYyxsaW5lRW5kOm5zLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1pjLmxpbmVTdGFydD1lcyxaYy5saW5lRW5kPXJzfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7WmMucG9pbnQ9UWMsWmMubGluZVN0YXJ0PUpjLFpjLmxpbmVFbmQ9bnN9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVdjP1tWYy9XYywkYy9XY106R2M/W2pjL0djLFhjL0djXTpIYz9bRmMvSGMsSWMvSGNdOltOYU4sTmFOXTtyZXR1cm4gRmM9SWM9SGM9amM9WGM9R2M9VmM9JGM9V2M9MCx0fX07ZnVuY3Rpb24gUWModCxuKXtGYys9dCxJYys9biwrK0hjfWZ1bmN0aW9uIEpjKCl7WmMucG9pbnQ9S2N9ZnVuY3Rpb24gS2ModCxuKXtaYy5wb2ludD10cyxRYyhZYz10LEJjPW4pfWZ1bmN0aW9uIHRzKHQsbil7dmFyIGU9dC1ZYyxyPW4tQmMsaT1LYShlKmUrcipyKTtqYys9aSooWWMrdCkvMixYYys9aSooQmMrbikvMixHYys9aSxRYyhZYz10LEJjPW4pfWZ1bmN0aW9uIG5zKCl7WmMucG9pbnQ9UWN9ZnVuY3Rpb24gZXMoKXtaYy5wb2ludD1pc31mdW5jdGlvbiBycygpe29zKHFjLE9jKX1mdW5jdGlvbiBpcyh0LG4pe1pjLnBvaW50PW9zLFFjKHFjPVljPXQsT2M9QmM9bil9ZnVuY3Rpb24gb3ModCxuKXt2YXIgZT10LVljLHI9bi1CYyxpPUthKGUqZStyKnIpO2pjKz1pKihZYyt0KS8yLFhjKz1pKihCYytuKS8yLEdjKz1pLFZjKz0oaT1CYyp0LVljKm4pKihZYyt0KSwkYys9aSooQmMrbiksV2MrPTMqaSxRYyhZYz10LEJjPW4pfWZ1bmN0aW9uIGFzKHQpe3RoaXMuX2NvbnRleHQ9dH1hcy5wcm90b3R5cGU9e19yYWRpdXM6NC41LHBvaW50UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yYWRpdXM9dCx0aGlzfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA9PT10aGlzLl9saW5lJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX3BvaW50PU5hTn0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX2NvbnRleHQubGluZVRvKHQsbik7YnJlYWs7ZGVmYXVsdDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0K3RoaXMuX3JhZGl1cyxuKSx0aGlzLl9jb250ZXh0LmFyYyh0LG4sdGhpcy5fcmFkaXVzLDAsQmEpfX0scmVzdWx0Oml1fTt2YXIgdXMsZnMsY3Msc3MsbHMsaHM9UGEoKSxkcz17cG9pbnQ6aXUsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7ZHMucG9pbnQ9cHN9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt1cyYmdnMoZnMsY3MpLGRzLnBvaW50PWl1fSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt1cz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3VzPW51bGx9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PStocztyZXR1cm4gaHMucmVzZXQoKSx0fX07ZnVuY3Rpb24gcHModCxuKXtkcy5wb2ludD12cyxmcz1zcz10LGNzPWxzPW59ZnVuY3Rpb24gdnModCxuKXtzcy09dCxscy09bixocy5hZGQoS2Eoc3Mqc3MrbHMqbHMpKSxzcz10LGxzPW59ZnVuY3Rpb24gZ3MoKXt0aGlzLl9zdHJpbmc9W119ZnVuY3Rpb24geXModCl7cmV0dXJuIm0wLCIrdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIistMip0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKzIqdCsieiJ9ZnVuY3Rpb24gX3ModCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPW5ldyBicztmb3IodmFyIHIgaW4gdCllW3JdPXRbcl07cmV0dXJuIGUuc3RyZWFtPW4sZX19ZnVuY3Rpb24gYnMoKXt9ZnVuY3Rpb24gbXModCxuLGUpe3ZhciByPXQuY2xpcEV4dGVudCYmdC5jbGlwRXh0ZW50KCk7cmV0dXJuIHQuc2NhbGUoMTUwKS50cmFuc2xhdGUoWzAsMF0pLG51bGwhPXImJnQuY2xpcEV4dGVudChudWxsKSxzdShlLHQuc3RyZWFtKFVjKSksbihVYy5yZXN1bHQoKSksbnVsbCE9ciYmdC5jbGlwRXh0ZW50KHIpLHR9ZnVuY3Rpb24geHModCxuLGUpe3JldHVybiBtcyh0LGZ1bmN0aW9uKGUpe3ZhciByPW5bMV1bMF0tblswXVswXSxpPW5bMV1bMV0tblswXVsxXSxvPU1hdGgubWluKHIvKGVbMV1bMF0tZVswXVswXSksaS8oZVsxXVsxXS1lWzBdWzFdKSksYT0rblswXVswXSsoci1vKihlWzFdWzBdK2VbMF1bMF0pKS8yLHU9K25bMF1bMV0rKGktbyooZVsxXVsxXStlWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCpvKS50cmFuc2xhdGUoW2EsdV0pfSxlKX1mdW5jdGlvbiB3cyh0LG4sZSl7cmV0dXJuIHhzKHQsW1swLDBdLG5dLGUpfWZ1bmN0aW9uIE1zKHQsbixlKXtyZXR1cm4gbXModCxmdW5jdGlvbihlKXt2YXIgcj0rbixpPXIvKGVbMV1bMF0tZVswXVswXSksbz0oci1pKihlWzFdWzBdK2VbMF1bMF0pKS8yLGE9LWkqZVswXVsxXTt0LnNjYWxlKDE1MCppKS50cmFuc2xhdGUoW28sYV0pfSxlKX1mdW5jdGlvbiBBcyh0LG4sZSl7cmV0dXJuIG1zKHQsZnVuY3Rpb24oZSl7dmFyIHI9K24saT1yLyhlWzFdWzFdLWVbMF1bMV0pLG89LWkqZVswXVswXSxhPShyLWkqKGVbMV1bMV0rZVswXVsxXSkpLzI7dC5zY2FsZSgxNTAqaSkudHJhbnNsYXRlKFtvLGFdKX0sZSl9Z3MucHJvdG90eXBlPXtfcmFkaXVzOjQuNSxfY2lyY2xlOnlzKDQuNSkscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9K3QpIT09dGhpcy5fcmFkaXVzJiYodGhpcy5fcmFkaXVzPXQsdGhpcy5fY2lyY2xlPW51bGwpLHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX3N0cmluZy5wdXNoKCJaIiksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3N0cmluZy5wdXNoKCJNIix0LCIsIixuKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9zdHJpbmcucHVzaCgiTCIsdCwiLCIsbik7YnJlYWs7ZGVmYXVsdDpudWxsPT10aGlzLl9jaXJjbGUmJih0aGlzLl9jaXJjbGU9eXModGhpcy5fcmFkaXVzKSksdGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4sdGhpcy5fY2lyY2xlKX19LHJlc3VsdDpmdW5jdGlvbigpe2lmKHRoaXMuX3N0cmluZy5sZW5ndGgpe3ZhciB0PXRoaXMuX3N0cmluZy5qb2luKCIiKTtyZXR1cm4gdGhpcy5fc3RyaW5nPVtdLHR9cmV0dXJuIG51bGx9fSxicy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmJzLHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5zdHJlYW0ucG9pbnQodCxuKX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19O3ZhciBUcz0xNixOcz1HYSgzMCpJYSk7ZnVuY3Rpb24gU3ModCxuKXtyZXR1cm4rbj9mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUocixpLG8sYSx1LGYsYyxzLGwsaCxkLHAsdixnKXt2YXIgeT1jLXIsXz1zLWksYj15KnkrXypfO2lmKGI+NCpuJiZ2LS0pe3ZhciBtPWEraCx4PXUrZCx3PWYrcCxNPUthKG0qbSt4Kngrdyp3KSxBPWV1KHcvPU0pLFQ9SGEoSGEodyktMSk8RGF8fEhhKG8tbCk8RGE/KG8rbCkvMjpYYSh4LG0pLE49dChULEEpLFM9TlswXSxFPU5bMV0saz1TLXIsQz1FLWksUD1fKmsteSpDOyhQKlAvYj5ufHxIYSgoeSprK18qQykvYi0uNSk+LjN8fGEqaCt1KmQrZipwPE5zKSYmKGUocixpLG8sYSx1LGYsUyxFLFQsbS89TSx4Lz1NLHcsdixnKSxnLnBvaW50KFMsRSksZShTLEUsVCxtLHgsdyxjLHMsbCxoLGQscCx2LGcpKX19cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciByLGksbyxhLHUsZixjLHMsbCxoLGQscCx2PXtwb2ludDpnLGxpbmVTdGFydDp5LGxpbmVFbmQ6Yixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpLHYubGluZVN0YXJ0PW19LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25FbmQoKSx2LmxpbmVTdGFydD15fX07ZnVuY3Rpb24gZyhlLHIpe2U9dChlLHIpLG4ucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiB5KCl7cz1OYU4sdi5wb2ludD1fLG4ubGluZVN0YXJ0KCl9ZnVuY3Rpb24gXyhyLGkpe3ZhciBvPUF1KFtyLGldKSxhPXQocixpKTtlKHMsbCxjLGgsZCxwLHM9YVswXSxsPWFbMV0sYz1yLGg9b1swXSxkPW9bMV0scD1vWzJdLFRzLG4pLG4ucG9pbnQocyxsKX1mdW5jdGlvbiBiKCl7di5wb2ludD1nLG4ubGluZUVuZCgpfWZ1bmN0aW9uIG0oKXt5KCksdi5wb2ludD14LHYubGluZUVuZD13fWZ1bmN0aW9uIHgodCxuKXtfKHI9dCxuKSxpPXMsbz1sLGE9aCx1PWQsZj1wLHYucG9pbnQ9X31mdW5jdGlvbiB3KCl7ZShzLGwsYyxoLGQscCxpLG8scixhLHUsZixUcyxuKSx2LmxpbmVFbmQ9YixiKCl9cmV0dXJuIHZ9fSh0LG4pOmZ1bmN0aW9uKHQpe3JldHVybiBfcyh7cG9pbnQ6ZnVuY3Rpb24obixlKXtuPXQobixlKSx0aGlzLnN0cmVhbS5wb2ludChuWzBdLG5bMV0pfX0pfSh0KX12YXIgRXM9X3Moe3BvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5zdHJlYW0ucG9pbnQodCpJYSxuKklhKX19KTtmdW5jdGlvbiBrcyh0LG4sZSxyKXt2YXIgaT1HYShyKSxvPVFhKHIpLGE9aSp0LHU9byp0LGY9aS90LGM9by90LHM9KG8qZS1pKm4pL3QsbD0obypuK2kqZSkvdDtmdW5jdGlvbiBoKHQscil7cmV0dXJuW2EqdC11KnIrbixlLXUqdC1hKnJdfXJldHVybiBoLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVybltmKnQtYypuK3MsbC1jKnQtZipuXX0saH1mdW5jdGlvbiBDcyh0KXtyZXR1cm4gUHMoZnVuY3Rpb24oKXtyZXR1cm4gdH0pKCl9ZnVuY3Rpb24gUHModCl7dmFyIG4sZSxyLGksbyxhLHUsZixjLHMsbD0xNTAsaD00ODAsZD0yNTAscD0wLHY9MCxnPTAseT0wLF89MCxiPTAsbT1udWxsLHg9R2Ysdz1udWxsLE09bWMsQT0uNTtmdW5jdGlvbiBUKHQpe3JldHVybiBmKHRbMF0qSWEsdFsxXSpJYSl9ZnVuY3Rpb24gTih0KXtyZXR1cm4odD1mLmludmVydCh0WzBdLHRbMV0pKSYmW3RbMF0qRmEsdFsxXSpGYV19ZnVuY3Rpb24gUygpe3ZhciB0PWtzKGwsMCwwLGIpLmFwcGx5KG51bGwsbihwLHYpKSxyPShiP2tzOmZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKHIsaSl7cmV0dXJuW24rdCpyLGUtdCppXX1yZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24ocixpKXtyZXR1cm5bKHItbikvdCwoZS1pKS90XX0scn0pKGwsaC10WzBdLGQtdFsxXSxiKTtyZXR1cm4gZT1rZihnLHksXyksdT1TZihuLHIpLGY9U2YoZSx1KSxhPVNzKHUsQSksRSgpfWZ1bmN0aW9uIEUoKXtyZXR1cm4gYz1zPW51bGwsVH1yZXR1cm4gVC5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGMmJnM9PT10P2M6Yz1FcyhmdW5jdGlvbih0KXtyZXR1cm4gX3Moe3BvaW50OmZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuLGUpO3JldHVybiB0aGlzLnN0cmVhbS5wb2ludChyWzBdLHJbMV0pfX0pfShlKSh4KGEoTShzPXQpKSkpKX0sVC5wcmVjbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PXQsbT12b2lkIDAsRSgpKTp4fSxULnBvc3RjbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPXQsdz1yPWk9bz1udWxsLEUoKSk6TX0sVC5jbGlwQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9K3Q/VmYobT10KklhKToobT1udWxsLEdmKSxFKCkpOm0qRmF9LFQuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT1udWxsPT10Pyh3PXI9aT1vPW51bGwsbWMpOlpmKHc9K3RbMF1bMF0scj0rdFswXVsxXSxpPSt0WzFdWzBdLG89K3RbMV1bMV0pLEUoKSk6bnVsbD09dz9udWxsOltbdyxyXSxbaSxvXV19LFQuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9K3QsUygpKTpsfSxULnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLFMoKSk6W2gsZF19LFQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPXRbMF0lMzYwKklhLHY9dFsxXSUzNjAqSWEsUygpKTpbcCpGYSx2KkZhXX0sVC5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9dFswXSUzNjAqSWEseT10WzFdJTM2MCpJYSxfPXQubGVuZ3RoPjI/dFsyXSUzNjAqSWE6MCxTKCkpOltnKkZhLHkqRmEsXypGYV19LFQuYW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9dCUzNjAqSWEsUygpKTpiKkZhfSxULnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1Tcyh1LEE9dCp0KSxFKCkpOkthKEEpfSxULmZpdEV4dGVudD1mdW5jdGlvbih0LG4pe3JldHVybiB4cyhULHQsbil9LFQuZml0U2l6ZT1mdW5jdGlvbih0LG4pe3JldHVybiB3cyhULHQsbil9LFQuZml0V2lkdGg9ZnVuY3Rpb24odCxuKXtyZXR1cm4gTXMoVCx0LG4pfSxULmZpdEhlaWdodD1mdW5jdGlvbih0LG4pe3JldHVybiBBcyhULHQsbil9LGZ1bmN0aW9uKCl7cmV0dXJuIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksVC5pbnZlcnQ9bi5pbnZlcnQmJk4sUygpfX1mdW5jdGlvbiB6cyh0KXt2YXIgbj0wLGU9cWEvMyxyPVBzKHQpLGk9cihuLGUpO3JldHVybiBpLnBhcmFsbGVscz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9yKG49dFswXSpJYSxlPXRbMV0qSWEpOltuKkZhLGUqRmFdfSxpfWZ1bmN0aW9uIFJzKHQsbil7dmFyIGU9UWEodCkscj0oZStRYShuKSkvMjtpZihIYShyKTxEYSlyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49R2EodCk7ZnVuY3Rpb24gZSh0LGUpe3JldHVyblt0Km4sUWEoZSkvbl19cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuW3QvbixldShlKm4pXX0sZX0odCk7dmFyIGk9MStlKigyKnItZSksbz1LYShpKS9yO2Z1bmN0aW9uIGEodCxuKXt2YXIgZT1LYShpLTIqcipRYShuKSkvcjtyZXR1cm5bZSpRYSh0Kj1yKSxvLWUqR2EodCldfXJldHVybiBhLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciBlPW8tbjtyZXR1cm5bWGEodCxIYShlKSkvcipKYShlKSxldSgoaS0odCp0K2UqZSkqcipyKS8oMipyKSldfSxhfWZ1bmN0aW9uIExzKCl7cmV0dXJuIHpzKFJzKS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfWZ1bmN0aW9uIERzKCl7cmV0dXJuIExzKCkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKS50cmFuc2xhdGUoWzQ4MCwyNTBdKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSl9ZnVuY3Rpb24gVXModCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9R2EobiksaT1HYShlKSxvPXQocippKTtyZXR1cm5bbyppKlFhKG4pLG8qUWEoZSldfX1mdW5jdGlvbiBxcyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1LYShuKm4rZSplKSxpPXQociksbz1RYShpKSxhPUdhKGkpO3JldHVybltYYShuKm8sciphKSxldShyJiZlKm8vcildfX12YXIgT3M9VXMoZnVuY3Rpb24odCl7cmV0dXJuIEthKDIvKDErdCkpfSk7T3MuaW52ZXJ0PXFzKGZ1bmN0aW9uKHQpe3JldHVybiAyKmV1KHQvMil9KTt2YXIgWXM9VXMoZnVuY3Rpb24odCl7cmV0dXJuKHQ9bnUodCkpJiZ0L1FhKHQpfSk7ZnVuY3Rpb24gQnModCxuKXtyZXR1cm5bdCxXYSh0dSgoT2ErbikvMikpXX1mdW5jdGlvbiBGcyh0KXt2YXIgbixlLHIsaT1Dcyh0KSxvPWkuY2VudGVyLGE9aS5zY2FsZSx1PWkudHJhbnNsYXRlLGY9aS5jbGlwRXh0ZW50LGM9bnVsbDtmdW5jdGlvbiBzKCl7dmFyIG89cWEqYSgpLHU9aShSZihpLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gZihudWxsPT1jP1tbdVswXS1vLHVbMV0tb10sW3VbMF0rbyx1WzFdK29dXTp0PT09QnM/W1tNYXRoLm1heCh1WzBdLW8sYyksbl0sW01hdGgubWluKHVbMF0rbyxlKSxyXV06W1tjLE1hdGgubWF4KHVbMV0tbyxuKV0sW2UsTWF0aC5taW4odVsxXStvLHIpXV0pfXJldHVybiBpLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhKHQpLHMoKSk6YSgpfSxpLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odSh0KSxzKCkpOnUoKX0saS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG8odCkscygpKTpvKCl9LGkuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9jPW49ZT1yPW51bGw6KGM9K3RbMF1bMF0sbj0rdFswXVsxXSxlPSt0WzFdWzBdLHI9K3RbMV1bMV0pLHMoKSk6bnVsbD09Yz9udWxsOltbYyxuXSxbZSxyXV19LHMoKX1mdW5jdGlvbiBJcyh0KXtyZXR1cm4gdHUoKE9hK3QpLzIpfWZ1bmN0aW9uIEhzKHQsbil7dmFyIGU9R2EodCkscj10PT09bj9RYSh0KTpXYShlL0dhKG4pKS9XYShJcyhuKS9Jcyh0KSksaT1lKlphKElzKHQpLHIpL3I7aWYoIXIpcmV0dXJuIEJzO2Z1bmN0aW9uIG8odCxuKXtpPjA/bjwtT2ErRGEmJihuPS1PYStEYSk6bj5PYS1EYSYmKG49T2EtRGEpO3ZhciBlPWkvWmEoSXMobikscik7cmV0dXJuW2UqUWEocip0KSxpLWUqR2Eocip0KV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9aS1uLG89SmEocikqS2EodCp0K2UqZSk7cmV0dXJuW1hhKHQsSGEoZSkpL3IqSmEoZSksMipqYShaYShpL28sMS9yKSktT2FdfSxvfWZ1bmN0aW9uIGpzKHQsbil7cmV0dXJuW3Qsbl19ZnVuY3Rpb24gWHModCxuKXt2YXIgZT1HYSh0KSxyPXQ9PT1uP1FhKHQpOihlLUdhKG4pKS8obi10KSxpPWUvcit0O2lmKEhhKHIpPERhKXJldHVybiBqcztmdW5jdGlvbiBvKHQsbil7dmFyIGU9aS1uLG89cip0O3JldHVybltlKlFhKG8pLGktZSpHYShvKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9aS1uO3JldHVybltYYSh0LEhhKGUpKS9yKkphKGUpLGktSmEocikqS2EodCp0K2UqZSldfSxvfVlzLmludmVydD1xcyhmdW5jdGlvbih0KXtyZXR1cm4gdH0pLEJzLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0LDIqamEoJGEobikpLU9hXX0sanMuaW52ZXJ0PWpzO3ZhciBHcz0xLjM0MDI2NCxWcz0tLjA4MTEwNiwkcz04OTNlLTYsV3M9LjAwMzc5Nixacz1LYSgzKS8yO2Z1bmN0aW9uIFFzKHQsbil7dmFyIGU9ZXUoWnMqUWEobikpLHI9ZSplLGk9cipyKnI7cmV0dXJuW3QqR2EoZSkvKFpzKihHcyszKlZzKnIraSooNyokcys5KldzKnIpKSksZSooR3MrVnMqcitpKigkcytXcypyKSldfWZ1bmN0aW9uIEpzKHQsbil7dmFyIGU9R2Eobikscj1HYSh0KSplO3JldHVybltlKlFhKHQpL3IsUWEobikvcl19ZnVuY3Rpb24gS3ModCxuLGUscil7cmV0dXJuIDE9PT10JiYxPT09biYmMD09PWUmJjA9PT1yP21jOl9zKHtwb2ludDpmdW5jdGlvbihpLG8pe3RoaXMuc3RyZWFtLnBvaW50KGkqdCtlLG8qbityKX19KX1mdW5jdGlvbiB0bCh0LG4pe3ZhciBlPW4qbixyPWUqZTtyZXR1cm5bdCooLjg3MDctLjEzMTk3OSplK3IqKHIqKC4wMDM5NzEqZS0uMDAxNTI5KnIpLS4wMTM3OTEpKSxuKigxLjAwNzIyNitlKiguMDE1MDg1K3IqKC4wMjg4NzQqZS0uMDQ0NDc1LS4wMDU5MTYqcikpKV19ZnVuY3Rpb24gbmwodCxuKXtyZXR1cm5bR2EobikqUWEodCksUWEobildfWZ1bmN0aW9uIGVsKHQsbil7dmFyIGU9R2Eobikscj0xK0dhKHQpKmU7cmV0dXJuW2UqUWEodCkvcixRYShuKS9yXX1mdW5jdGlvbiBybCh0LG4pe3JldHVybltXYSh0dSgoT2ErbikvMikpLC10XX1mdW5jdGlvbiBpbCh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBvbCh0LG4pe3JldHVybiB0K24ueH1mdW5jdGlvbiBhbCh0LG4pe3JldHVybiBNYXRoLm1heCh0LG4ueSl9ZnVuY3Rpb24gdWwodCl7dmFyIG49MCxlPXQuY2hpbGRyZW4scj1lJiZlLmxlbmd0aDtpZihyKWZvcig7LS1yPj0wOyluKz1lW3JdLnZhbHVlO2Vsc2Ugbj0xO3QudmFsdWU9bn1mdW5jdGlvbiBmbCh0LG4pe3ZhciBlLHIsaSxvLGEsdT1uZXcgaGwodCksZj0rdC52YWx1ZSYmKHUudmFsdWU9dC52YWx1ZSksYz1bdV07Zm9yKG51bGw9PW4mJihuPWNsKTtlPWMucG9wKCk7KWlmKGYmJihlLnZhbHVlPStlLmRhdGEudmFsdWUpLChpPW4oZS5kYXRhKSkmJihhPWkubGVuZ3RoKSlmb3IoZS5jaGlsZHJlbj1uZXcgQXJyYXkoYSksbz1hLTE7bz49MDstLW8pYy5wdXNoKHI9ZS5jaGlsZHJlbltvXT1uZXcgaGwoaVtvXSkpLHIucGFyZW50PWUsci5kZXB0aD1lLmRlcHRoKzE7cmV0dXJuIHUuZWFjaEJlZm9yZShsbCl9ZnVuY3Rpb24gY2wodCl7cmV0dXJuIHQuY2hpbGRyZW59ZnVuY3Rpb24gc2wodCl7dC5kYXRhPXQuZGF0YS5kYXRhfWZ1bmN0aW9uIGxsKHQpe3ZhciBuPTA7ZG97dC5oZWlnaHQ9bn13aGlsZSgodD10LnBhcmVudCkmJnQuaGVpZ2h0PCsrbil9ZnVuY3Rpb24gaGwodCl7dGhpcy5kYXRhPXQsdGhpcy5kZXB0aD10aGlzLmhlaWdodD0wLHRoaXMucGFyZW50PW51bGx9UXMuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHI9bixpPXIqcixvPWkqaSppLGE9MDthPDEyJiYobz0oaT0oci09ZT0ociooR3MrVnMqaStvKigkcytXcyppKSktbikvKEdzKzMqVnMqaStvKig3KiRzKzkqV3MqaSkpKSpyKSppKmksIShIYShlKTxVYSkpOysrYSk7cmV0dXJuW1pzKnQqKEdzKzMqVnMqaStvKig3KiRzKzkqV3MqaSkpL0dhKHIpLGV1KFFhKHIpL1pzKV19LEpzLmludmVydD1xcyhqYSksdGwuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGUscj1uLGk9MjU7ZG97dmFyIG89cipyLGE9bypvO3ItPWU9KHIqKDEuMDA3MjI2K28qKC4wMTUwODUrYSooLjAyODg3NCpvLS4wNDQ0NzUtLjAwNTkxNiphKSkpLW4pLygxLjAwNzIyNitvKiguMDQ1MjU1K2EqKC4yNTk4NjYqby0uMzExMzI1LS4wMDU5MTYqMTEqYSkpKX13aGlsZShIYShlKT5EYSYmLS1pPjApO3JldHVyblt0LyguODcwNysobz1yKnIpKihvKihvKm8qbyooLjAwMzk3MS0uMDAxNTI5Km8pLS4wMTM3OTEpLS4xMzE5NzkpKSxyXX0sbmwuaW52ZXJ0PXFzKGV1KSxlbC5pbnZlcnQ9cXMoZnVuY3Rpb24odCl7cmV0dXJuIDIqamEodCl9KSxybC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bLW4sMipqYSgkYSh0KSktT2FdfSxobC5wcm90b3R5cGU9ZmwucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpobCxjb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2hBZnRlcih1bCl9LGVhY2g6ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10aGlzLGE9W29dO2Rve2ZvcihuPWEucmV2ZXJzZSgpLGE9W107bz1uLnBvcCgpOylpZih0KG8pLGU9by5jaGlsZHJlbilmb3Iocj0wLGk9ZS5sZW5ndGg7cjxpOysrcilhLnB1c2goZVtyXSl9d2hpbGUoYS5sZW5ndGgpO3JldHVybiB0aGlzfSxlYWNoQWZ0ZXI6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscixpPXRoaXMsbz1baV0sYT1bXTtpPW8ucG9wKCk7KWlmKGEucHVzaChpKSxuPWkuY2hpbGRyZW4pZm9yKGU9MCxyPW4ubGVuZ3RoO2U8cjsrK2Upby5wdXNoKG5bZV0pO2Zvcig7aT1hLnBvcCgpOyl0KGkpO3JldHVybiB0aGlzfSxlYWNoQmVmb3JlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dGhpcyxpPVtyXTtyPWkucG9wKCk7KWlmKHQociksbj1yLmNoaWxkcmVuKWZvcihlPW4ubGVuZ3RoLTE7ZT49MDstLWUpaS5wdXNoKG5bZV0pO3JldHVybiB0aGlzfSxzdW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe2Zvcih2YXIgZT0rdChuLmRhdGEpfHwwLHI9bi5jaGlsZHJlbixpPXImJnIubGVuZ3RoOy0taT49MDspZSs9cltpXS52YWx1ZTtuLnZhbHVlPWV9KX0sc29ydDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJm4uY2hpbGRyZW4uc29ydCh0KX0pfSxwYXRoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLGU9ZnVuY3Rpb24odCxuKXtpZih0PT09bilyZXR1cm4gdDt2YXIgZT10LmFuY2VzdG9ycygpLHI9bi5hbmNlc3RvcnMoKSxpPW51bGw7Zm9yKHQ9ZS5wb3AoKSxuPXIucG9wKCk7dD09PW47KWk9dCx0PWUucG9wKCksbj1yLnBvcCgpO3JldHVybiBpfShuLHQpLHI9W25dO24hPT1lOyluPW4ucGFyZW50LHIucHVzaChuKTtmb3IodmFyIGk9ci5sZW5ndGg7dCE9PWU7KXIuc3BsaWNlKGksMCx0KSx0PXQucGFyZW50O3JldHVybiByfSxhbmNlc3RvcnM6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxuPVt0XTt0PXQucGFyZW50OyluLnB1c2godCk7cmV0dXJuIG59LGRlc2NlbmRhbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt0LnB1c2gobil9KSx0fSxsZWF2ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG4pe24uY2hpbGRyZW58fHQucHVzaChuKX0pLHR9LGxpbmtzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPVtdO3JldHVybiB0LmVhY2goZnVuY3Rpb24oZSl7ZSE9PXQmJm4ucHVzaCh7c291cmNlOmUucGFyZW50LHRhcmdldDplfSl9KSxufSxjb3B5OmZ1bmN0aW9uKCl7cmV0dXJuIGZsKHRoaXMpLmVhY2hCZWZvcmUoc2wpfX07dmFyIGRsPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBwbCh0KXtmb3IodmFyIG4sZSxyPTAsaT0odD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPXQubGVuZ3RoO3I7KWU9TWF0aC5yYW5kb20oKSpyLS18MCxuPXRbcl0sdFtyXT10W2VdLHRbZV09bjtyZXR1cm4gdH0oZGwuY2FsbCh0KSkpLmxlbmd0aCxvPVtdO3I8aTspbj10W3JdLGUmJnlsKGUsbik/KytyOihlPWJsKG89dmwobyxuKSkscj0wKTtyZXR1cm4gZX1mdW5jdGlvbiB2bCh0LG4pe3ZhciBlLHI7aWYoX2wobix0KSlyZXR1cm5bbl07Zm9yKGU9MDtlPHQubGVuZ3RoOysrZSlpZihnbChuLHRbZV0pJiZfbChtbCh0W2VdLG4pLHQpKXJldHVyblt0W2VdLG5dO2ZvcihlPTA7ZTx0Lmxlbmd0aC0xOysrZSlmb3Iocj1lKzE7cjx0Lmxlbmd0aDsrK3IpaWYoZ2wobWwodFtlXSx0W3JdKSxuKSYmZ2wobWwodFtlXSxuKSx0W3JdKSYmZ2wobWwodFtyXSxuKSx0W2VdKSYmX2woeGwodFtlXSx0W3JdLG4pLHQpKXJldHVyblt0W2VdLHRbcl0sbl07dGhyb3cgbmV3IEVycm9yfWZ1bmN0aW9uIGdsKHQsbil7dmFyIGU9dC5yLW4ucixyPW4ueC10LngsaT1uLnktdC55O3JldHVybiBlPDB8fGUqZTxyKnIraSppfWZ1bmN0aW9uIHlsKHQsbil7dmFyIGU9dC5yLW4ucisxZS02LHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU+MCYmZSplPnIqcitpKml9ZnVuY3Rpb24gX2wodCxuKXtmb3IodmFyIGU9MDtlPG4ubGVuZ3RoOysrZSlpZigheWwodCxuW2VdKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBibCh0KXtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMTpyZXR1cm57eDoobj10WzBdKS54LHk6bi55LHI6bi5yfTtjYXNlIDI6cmV0dXJuIG1sKHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiB4bCh0WzBdLHRbMV0sdFsyXSl9dmFyIG59ZnVuY3Rpb24gbWwodCxuKXt2YXIgZT10Lngscj10LnksaT10LnIsbz1uLngsYT1uLnksdT1uLnIsZj1vLWUsYz1hLXIscz11LWksbD1NYXRoLnNxcnQoZipmK2MqYyk7cmV0dXJue3g6KGUrbytmL2wqcykvMix5OihyK2ErYy9sKnMpLzIscjoobCtpK3UpLzJ9fWZ1bmN0aW9uIHhsKHQsbixlKXt2YXIgcj10LngsaT10Lnksbz10LnIsYT1uLngsdT1uLnksZj1uLnIsYz1lLngscz1lLnksbD1lLnIsaD1yLWEsZD1yLWMscD1pLXUsdj1pLXMsZz1mLW8seT1sLW8sXz1yKnIraSppLW8qbyxiPV8tYSphLXUqdStmKmYsbT1fLWMqYy1zKnMrbCpsLHg9ZCpwLWgqdix3PShwKm0tdipiKS8oMip4KS1yLE09KHYqZy1wKnkpL3gsQT0oZCpiLWgqbSkvKDIqeCktaSxUPShoKnktZCpnKS94LE49TSpNK1QqVC0xLFM9Mioobyt3Kk0rQSpUKSxFPXcqdytBKkEtbypvLGs9LShOPyhTK01hdGguc3FydChTKlMtNCpOKkUpKS8oMipOKTpFL1MpO3JldHVybnt4OnIrdytNKmsseTppK0ErVCprLHI6a319ZnVuY3Rpb24gd2wodCxuLGUpe3ZhciByLGksbyxhLHU9dC54LW4ueCxmPXQueS1uLnksYz11KnUrZipmO2M/KGk9bi5yK2UucixpKj1pLGE9dC5yK2UucixpPihhKj1hKT8ocj0oYythLWkpLygyKmMpLG89TWF0aC5zcXJ0KE1hdGgubWF4KDAsYS9jLXIqcikpLGUueD10Lngtcip1LW8qZixlLnk9dC55LXIqZitvKnUpOihyPShjK2ktYSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxpL2MtcipyKSksZS54PW4ueCtyKnUtbypmLGUueT1uLnkrcipmK28qdSkpOihlLng9bi54K2UucixlLnk9bi55KX1mdW5jdGlvbiBNbCh0LG4pe3ZhciBlPXQucituLnItMWUtNixyPW4ueC10LngsaT1uLnktdC55O3JldHVybiBlPjAmJmUqZT5yKnIraSppfWZ1bmN0aW9uIEFsKHQpe3ZhciBuPXQuXyxlPXQubmV4dC5fLHI9bi5yK2UucixpPShuLngqZS5yK2UueCpuLnIpL3Isbz0obi55KmUucitlLnkqbi5yKS9yO3JldHVybiBpKmkrbypvfWZ1bmN0aW9uIFRsKHQpe3RoaXMuXz10LHRoaXMubmV4dD1udWxsLHRoaXMucHJldmlvdXM9bnVsbH1mdW5jdGlvbiBObCh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybiAwO3ZhciBuLGUscixpLG8sYSx1LGYsYyxzLGw7aWYoKG49dFswXSkueD0wLG4ueT0wLCEoaT4xKSlyZXR1cm4gbi5yO2lmKGU9dFsxXSxuLng9LWUucixlLng9bi5yLGUueT0wLCEoaT4yKSlyZXR1cm4gbi5yK2Uucjt3bChlLG4scj10WzJdKSxuPW5ldyBUbChuKSxlPW5ldyBUbChlKSxyPW5ldyBUbChyKSxuLm5leHQ9ci5wcmV2aW91cz1lLGUubmV4dD1uLnByZXZpb3VzPXIsci5uZXh0PWUucHJldmlvdXM9bjt0OmZvcih1PTM7dTxpOysrdSl7d2wobi5fLGUuXyxyPXRbdV0pLHI9bmV3IFRsKHIpLGY9ZS5uZXh0LGM9bi5wcmV2aW91cyxzPWUuXy5yLGw9bi5fLnI7ZG97aWYoczw9bCl7aWYoTWwoZi5fLHIuXykpe2U9ZixuLm5leHQ9ZSxlLnByZXZpb3VzPW4sLS11O2NvbnRpbnVlIHR9cys9Zi5fLnIsZj1mLm5leHR9ZWxzZXtpZihNbChjLl8sci5fKSl7KG49YykubmV4dD1lLGUucHJldmlvdXM9biwtLXU7Y29udGludWUgdH1sKz1jLl8ucixjPWMucHJldmlvdXN9fXdoaWxlKGYhPT1jLm5leHQpO2ZvcihyLnByZXZpb3VzPW4sci5uZXh0PWUsbi5uZXh0PWUucHJldmlvdXM9ZT1yLG89QWwobik7KHI9ci5uZXh0KSE9PWU7KShhPUFsKHIpKTxvJiYobj1yLG89YSk7ZT1uLm5leHR9Zm9yKG49W2UuX10scj1lOyhyPXIubmV4dCkhPT1lOyluLnB1c2goci5fKTtmb3Iocj1wbChuKSx1PTA7dTxpOysrdSkobj10W3VdKS54LT1yLngsbi55LT1yLnk7cmV0dXJuIHIucn1mdW5jdGlvbiBTbCh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHR9ZnVuY3Rpb24gRWwoKXtyZXR1cm4gMH1mdW5jdGlvbiBrbCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gQ2wodCl7cmV0dXJuIE1hdGguc3FydCh0LnZhbHVlKX1mdW5jdGlvbiBQbCh0KXtyZXR1cm4gZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8KG4ucj1NYXRoLm1heCgwLCt0KG4pfHwwKSl9fWZ1bmN0aW9uIHpsKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHI9ZS5jaGlsZHJlbil7dmFyIHIsaSxvLGE9ci5sZW5ndGgsdT10KGUpKm58fDA7aWYodSlmb3IoaT0wO2k8YTsrK2kpcltpXS5yKz11O2lmKG89TmwociksdSlmb3IoaT0wO2k8YTsrK2kpcltpXS5yLT11O2Uucj1vK3V9fX1mdW5jdGlvbiBSbCh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bi5wYXJlbnQ7bi5yKj10LGUmJihuLng9ZS54K3Qqbi54LG4ueT1lLnkrdCpuLnkpfX1mdW5jdGlvbiBMbCh0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9ZnVuY3Rpb24gRGwodCxuLGUscixpKXtmb3IodmFyIG8sYT10LmNoaWxkcmVuLHU9LTEsZj1hLmxlbmd0aCxjPXQudmFsdWUmJihyLW4pL3QudmFsdWU7Kyt1PGY7KShvPWFbdV0pLnkwPWUsby55MT1pLG8ueDA9bixvLngxPW4rPW8udmFsdWUqY312YXIgVWw9IiQiLHFsPXtkZXB0aDotMX0sT2w9e307ZnVuY3Rpb24gWWwodCl7cmV0dXJuIHQuaWR9ZnVuY3Rpb24gQmwodCl7cmV0dXJuIHQucGFyZW50SWR9ZnVuY3Rpb24gRmwodCxuKXtyZXR1cm4gdC5wYXJlbnQ9PT1uLnBhcmVudD8xOjJ9ZnVuY3Rpb24gSWwodCl7dmFyIG49dC5jaGlsZHJlbjtyZXR1cm4gbj9uWzBdOnQudH1mdW5jdGlvbiBIbCh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bbi5sZW5ndGgtMV06dC50fWZ1bmN0aW9uIGpsKHQsbixlKXt2YXIgcj1lLyhuLmktdC5pKTtuLmMtPXIsbi5zKz1lLHQuYys9cixuLnorPWUsbi5tKz1lfWZ1bmN0aW9uIFhsKHQsbixlKXtyZXR1cm4gdC5hLnBhcmVudD09PW4ucGFyZW50P3QuYTplfWZ1bmN0aW9uIEdsKHQsbil7dGhpcy5fPXQsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPW51bGwsdGhpcy5BPW51bGwsdGhpcy5hPXRoaXMsdGhpcy56PTAsdGhpcy5tPTAsdGhpcy5jPTAsdGhpcy5zPTAsdGhpcy50PW51bGwsdGhpcy5pPW59ZnVuY3Rpb24gVmwodCxuLGUscixpKXtmb3IodmFyIG8sYT10LmNoaWxkcmVuLHU9LTEsZj1hLmxlbmd0aCxjPXQudmFsdWUmJihpLWUpL3QudmFsdWU7Kyt1PGY7KShvPWFbdV0pLngwPW4sby54MT1yLG8ueTA9ZSxvLnkxPWUrPW8udmFsdWUqY31HbC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShobC5wcm90b3R5cGUpO3ZhciAkbD0oMStNYXRoLnNxcnQoNSkpLzI7ZnVuY3Rpb24gV2wodCxuLGUscixpLG8pe2Zvcih2YXIgYSx1LGYsYyxzLGwsaCxkLHAsdixnLHk9W10sXz1uLmNoaWxkcmVuLGI9MCxtPTAseD1fLmxlbmd0aCx3PW4udmFsdWU7Yjx4Oyl7Zj1pLWUsYz1vLXI7ZG97cz1fW20rK10udmFsdWV9d2hpbGUoIXMmJm08eCk7Zm9yKGw9aD1zLGc9cypzKih2PU1hdGgubWF4KGMvZixmL2MpLyh3KnQpKSxwPU1hdGgubWF4KGgvZyxnL2wpO208eDsrK20pe2lmKHMrPXU9X1ttXS52YWx1ZSx1PGwmJihsPXUpLHU+aCYmKGg9dSksZz1zKnMqdiwoZD1NYXRoLm1heChoL2csZy9sKSk+cCl7cy09dTticmVha31wPWR9eS5wdXNoKGE9e3ZhbHVlOnMsZGljZTpmPGMsY2hpbGRyZW46Xy5zbGljZShiLG0pfSksYS5kaWNlP0RsKGEsZSxyLGksdz9yKz1jKnMvdzpvKTpWbChhLGUscix3P2UrPWYqcy93Omksbyksdy09cyxiPW19cmV0dXJuIHl9dmFyIFpsPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe1dsKG4sdCxlLHIsaSxvKX1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfSgkbCk7dmFyIFFsPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe2lmKChhPXQuX3NxdWFyaWZ5KSYmYS5yYXRpbz09PW4pZm9yKHZhciBhLHUsZixjLHMsbD0tMSxoPWEubGVuZ3RoLGQ9dC52YWx1ZTsrK2w8aDspe2ZvcihmPSh1PWFbbF0pLmNoaWxkcmVuLGM9dS52YWx1ZT0wLHM9Zi5sZW5ndGg7YzxzOysrYyl1LnZhbHVlKz1mW2NdLnZhbHVlO3UuZGljZT9EbCh1LGUscixpLHIrPShvLXIpKnUudmFsdWUvZCk6VmwodSxlLHIsZSs9KGktZSkqdS52YWx1ZS9kLG8pLGQtPXUudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT1hPVdsKG4sdCxlLHIsaSxvKSxhLnJhdGlvPW59cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oJGwpO2Z1bmN0aW9uIEpsKHQsbil7cmV0dXJuIHRbMF0tblswXXx8dFsxXS1uWzFdfWZ1bmN0aW9uIEtsKHQpe2Zvcih2YXIgbixlLHIsaT10Lmxlbmd0aCxvPVswLDFdLGE9Mix1PTI7dTxpOysrdSl7Zm9yKDthPjEmJihuPXRbb1thLTJdXSxlPXRbb1thLTFdXSxyPXRbdV0sKGVbMF0tblswXSkqKHJbMV0tblsxXSktKGVbMV0tblsxXSkqKHJbMF0tblswXSk8PTApOyktLWE7b1thKytdPXV9cmV0dXJuIG8uc2xpY2UoMCxhKX1mdW5jdGlvbiB0aCgpe3JldHVybiBNYXRoLnJhbmRvbSgpfXZhciBuaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlKXtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsMT09PWFyZ3VtZW50cy5sZW5ndGg/KGU9dCx0PTApOmUtPXQsZnVuY3Rpb24oKXtyZXR1cm4gbigpKmUrdH19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGVoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3ZhciByLGk7cmV0dXJuIHQ9bnVsbD09dD8wOit0LGU9bnVsbD09ZT8xOitlLGZ1bmN0aW9uKCl7dmFyIG87aWYobnVsbCE9cilvPXIscj1udWxsO2Vsc2UgZG97cj0yKm4oKS0xLG89MipuKCktMSxpPXIqcitvKm99d2hpbGUoIWl8fGk+MSk7cmV0dXJuIHQrZSpvKk1hdGguc3FydCgtMipNYXRoLmxvZyhpKS9pKX19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLHJoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSgpe3ZhciB0PWVoLnNvdXJjZShuKS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKHQoKSl9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxpaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTAscj0wO3I8dDsrK3IpZSs9bigpO3JldHVybiBlfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksb2g9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3ZhciBlPWloLnNvdXJjZShuKSh0KTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSgpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxhaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuLU1hdGgubG9nKDEtbigpKS90fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksdWg9QXJyYXkucHJvdG90eXBlLGZoPXVoLm1hcCxjaD11aC5zbGljZSxzaD17bmFtZToiaW1wbGljaXQifTtmdW5jdGlvbiBsaCh0KXt2YXIgbj1LaSgpLGU9W10scj1zaDtmdW5jdGlvbiBpKGkpe3ZhciBvPWkrIiIsYT1uLmdldChvKTtpZighYSl7aWYociE9PXNoKXJldHVybiByO24uc2V0KG8sYT1lLnB1c2goaSkpfXJldHVybiB0WyhhLTEpJXQubGVuZ3RoXX1yZXR1cm4gdD1udWxsPT10P1tdOmNoLmNhbGwodCksaS5kb21haW49ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdLG49S2koKTtmb3IodmFyIHIsbyxhPS0xLHU9dC5sZW5ndGg7KythPHU7KW4uaGFzKG89KHI9dFthXSkrIiIpfHxuLnNldChvLGUucHVzaChyKSk7cmV0dXJuIGl9LGkucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9Y2guY2FsbChuKSxpKTp0LnNsaWNlKCl9LGkudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LGkpOnJ9LGkuY29weT1mdW5jdGlvbigpe3JldHVybiBsaCgpLmRvbWFpbihlKS5yYW5nZSh0KS51bmtub3duKHIpfSxpfWZ1bmN0aW9uIGhoKCl7dmFyIHQsbixlPWxoKCkudW5rbm93bih2b2lkIDApLHI9ZS5kb21haW4saT1lLnJhbmdlLG89WzAsMV0sYT0hMSx1PTAsZj0wLGM9LjU7ZnVuY3Rpb24gcygpe3ZhciBlPXIoKS5sZW5ndGgscz1vWzFdPG9bMF0sbD1vW3MtMF0saD1vWzEtc107dD0oaC1sKS9NYXRoLm1heCgxLGUtdSsyKmYpLGEmJih0PU1hdGguZmxvb3IodCkpLGwrPShoLWwtdCooZS11KSkqYyxuPXQqKDEtdSksYSYmKGw9TWF0aC5yb3VuZChsKSxuPU1hdGgucm91bmQobikpO3ZhciBkPWcoZSkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBsK3Qqbn0pO3JldHVybiBpKHM/ZC5yZXZlcnNlKCk6ZCl9cmV0dXJuIGRlbGV0ZSBlLnVua25vd24sZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHIodCkscygpKTpyKCl9LGUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89Wyt0WzBdLCt0WzFdXSxzKCkpOm8uc2xpY2UoKX0sZS5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBvPVsrdFswXSwrdFsxXV0sYT0hMCxzKCl9LGUuYmFuZHdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIG59LGUuc3RlcD1mdW5jdGlvbigpe3JldHVybiB0fSxlLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSEhdCxzKCkpOmF9LGUucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1mPU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkscygpKTp1fSxlLnBhZGRpbmdJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6dX0sZS5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOmZ9LGUuYWxpZ249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOmN9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBoaCgpLmRvbWFpbihyKCkpLnJhbmdlKG8pLnJvdW5kKGEpLnBhZGRpbmdJbm5lcih1KS5wYWRkaW5nT3V0ZXIoZikuYWxpZ24oYyl9LHMoKX1mdW5jdGlvbiBkaCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gcGgodCl7cmV0dXJuK3R9dmFyIHZoPVswLDFdO2Z1bmN0aW9uIGdoKHQsbil7cmV0dXJuKG4tPXQ9K3QpP2Z1bmN0aW9uKGUpe3JldHVybihlLXQpL259OmRoKG4pfWZ1bmN0aW9uIHloKHQsbixlLHIpe3ZhciBpPXRbMF0sbz10WzFdLGE9blswXSx1PW5bMV07cmV0dXJuIG88aT8oaT1lKG8saSksYT1yKHUsYSkpOihpPWUoaSxvKSxhPXIoYSx1KSksZnVuY3Rpb24odCl7cmV0dXJuIGEoaSh0KSl9fWZ1bmN0aW9uIF9oKHQsbixlLHIpe3ZhciBvPU1hdGgubWluKHQubGVuZ3RoLG4ubGVuZ3RoKS0xLGE9bmV3IEFycmF5KG8pLHU9bmV3IEFycmF5KG8pLGY9LTE7Zm9yKHRbb108dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxuPW4uc2xpY2UoKS5yZXZlcnNlKCkpOysrZjxvOylhW2ZdPWUodFtmXSx0W2YrMV0pLHVbZl09cihuW2ZdLG5bZisxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPWkodCxuLDEsbyktMTtyZXR1cm4gdVtlXShhW2VdKG4pKX19ZnVuY3Rpb24gYmgodCxuKXtyZXR1cm4gbi5kb21haW4odC5kb21haW4oKSkucmFuZ2UodC5yYW5nZSgpKS5pbnRlcnBvbGF0ZSh0LmludGVycG9sYXRlKCkpLmNsYW1wKHQuY2xhbXAoKSl9ZnVuY3Rpb24gbWgodCxuKXt2YXIgZSxyLGksbz12aCxhPXZoLHU9bWUsZj0hMTtmdW5jdGlvbiBjKCl7cmV0dXJuIGU9TWF0aC5taW4oby5sZW5ndGgsYS5sZW5ndGgpPjI/X2g6eWgscj1pPW51bGwsc31mdW5jdGlvbiBzKG4pe3JldHVybihyfHwocj1lKG8sYSxmP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PW4/MDp0Pj1lPzE6cih0KX19fSh0KTp0LHUpKSkoK24pfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4oaXx8KGk9ZShhLG8sZ2gsZj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KG49K24sZT0rZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD0wP246dD49MT9lOnIodCl9fX0obik6bikpKSgrdCl9LHMuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWZoLmNhbGwodCxwaCksYygpKTpvLnNsaWNlKCl9LHMucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9Y2guY2FsbCh0KSxjKCkpOmEuc2xpY2UoKX0scy5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhPWNoLmNhbGwodCksdT14ZSxjKCl9LHMuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ISF0LGMoKSk6Zn0scy5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGMoKSk6dX0sYygpfWZ1bmN0aW9uIHhoKG4pe3ZhciBlPW4uZG9tYWluO3JldHVybiBuLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuPWUoKTtyZXR1cm4gbShuWzBdLG5bbi5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sbi50aWNrRm9ybWF0PWZ1bmN0aW9uKG4scil7cmV0dXJuIGZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvPW5bMF0sYT1uW24ubGVuZ3RoLTFdLHU9dyhvLGEsbnVsbD09ZT8xMDplKTtzd2l0Y2goKHI9YmEobnVsbD09cj8iLGYiOnIpKS50eXBlKXtjYXNlInMiOnZhciBmPU1hdGgubWF4KE1hdGguYWJzKG8pLE1hdGguYWJzKGEpKTtyZXR1cm4gbnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9a2EodSxmKSl8fChyLnByZWNpc2lvbj1pKSx0LmZvcm1hdFByZWZpeChyLGYpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPXIucHJlY2lzaW9ufHxpc05hTihpPUNhKHUsTWF0aC5tYXgoTWF0aC5hYnMobyksTWF0aC5hYnMoYSkpKSl8fChyLnByZWNpc2lvbj1pLSgiZSI9PT1yLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9RWEodSkpfHwoci5wcmVjaXNpb249aS0yKigiJSI9PT1yLnR5cGUpKX1yZXR1cm4gdC5mb3JtYXQocil9KGUoKSxuLHIpfSxuLm5pY2U9ZnVuY3Rpb24odCl7bnVsbD09dCYmKHQ9MTApO3ZhciByLGk9ZSgpLG89MCxhPWkubGVuZ3RoLTEsdT1pW29dLGY9aVthXTtyZXR1cm4gZjx1JiYocj11LHU9ZixmPXIscj1vLG89YSxhPXIpLChyPXgodSxmLHQpKT4wP3I9eCh1PU1hdGguZmxvb3IodS9yKSpyLGY9TWF0aC5jZWlsKGYvcikqcix0KTpyPDAmJihyPXgodT1NYXRoLmNlaWwodSpyKS9yLGY9TWF0aC5mbG9vcihmKnIpL3IsdCkpLHI+MD8oaVtvXT1NYXRoLmZsb29yKHUvcikqcixpW2FdPU1hdGguY2VpbChmL3IpKnIsZShpKSk6cjwwJiYoaVtvXT1NYXRoLmNlaWwodSpyKS9yLGlbYV09TWF0aC5mbG9vcihmKnIpL3IsZShpKSksbn0sbn1mdW5jdGlvbiB3aCh0LG4pe3ZhciBlLHI9MCxpPSh0PXQuc2xpY2UoKSkubGVuZ3RoLTEsbz10W3JdLGE9dFtpXTtyZXR1cm4gYTxvJiYoZT1yLHI9aSxpPWUsZT1vLG89YSxhPWUpLHRbcl09bi5mbG9vcihvKSx0W2ldPW4uY2VpbChhKSx0fWZ1bmN0aW9uIE1oKHQsbil7cmV0dXJuKG49TWF0aC5sb2cobi90KSk/ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUvdCkvbn06ZGgobil9ZnVuY3Rpb24gQWgodCxuKXtyZXR1cm4gdDwwP2Z1bmN0aW9uKGUpe3JldHVybi1NYXRoLnBvdygtbixlKSpNYXRoLnBvdygtdCwxLWUpfTpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3cobixlKSpNYXRoLnBvdyh0LDEtZSl9fWZ1bmN0aW9uIFRoKHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBOaCh0KXtyZXR1cm4gMTA9PT10P1RoOnQ9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KHQsbil9fWZ1bmN0aW9uIFNoKHQpe3JldHVybiB0PT09TWF0aC5FP01hdGgubG9nOjEwPT09dCYmTWF0aC5sb2cxMHx8Mj09PXQmJk1hdGgubG9nMnx8KHQ9TWF0aC5sb2codCksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubG9nKG4pL3R9KX1mdW5jdGlvbiBFaCh0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuLXQoLW4pfX1mdW5jdGlvbiBraCh0LG4pe3JldHVybiB0PDA/LU1hdGgucG93KC10LG4pOk1hdGgucG93KHQsbil9ZnVuY3Rpb24gQ2goKXt2YXIgdD0xLG49bWgoZnVuY3Rpb24obixlKXtyZXR1cm4oZT1raChlLHQpLShuPWtoKG4sdCkpKT9mdW5jdGlvbihyKXtyZXR1cm4oa2gocix0KS1uKS9lfTpkaChlKX0sZnVuY3Rpb24obixlKXtyZXR1cm4gZT1raChlLHQpLShuPWtoKG4sdCkpLGZ1bmN0aW9uKHIpe3JldHVybiBraChuK2UqciwxL3QpfX0pLGU9bi5kb21haW47cmV0dXJuIG4uZXhwb25lbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K24sZShlKCkpKTp0fSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gYmgobixDaCgpLmV4cG9uZW50KHQpKX0seGgobil9dmFyIFBoPW5ldyBEYXRlLHpoPW5ldyBEYXRlO2Z1bmN0aW9uIFJoKHQsbixlLHIpe2Z1bmN0aW9uIGkobil7cmV0dXJuIHQobj1uZXcgRGF0ZSgrbikpLG59cmV0dXJuIGkuZmxvb3I9aSxpLmNlaWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZT1uZXcgRGF0ZShlLTEpKSxuKGUsMSksdChlKSxlfSxpLnJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBuPWkodCksZT1pLmNlaWwodCk7cmV0dXJuIHQtbjxlLXQ/bjplfSxpLm9mZnNldD1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQ9bmV3IERhdGUoK3QpLG51bGw9PWU/MTpNYXRoLmZsb29yKGUpKSx0fSxpLnJhbmdlPWZ1bmN0aW9uKGUscixvKXt2YXIgYSx1PVtdO2lmKGU9aS5jZWlsKGUpLG89bnVsbD09bz8xOk1hdGguZmxvb3IobyksIShlPHImJm8+MCkpcmV0dXJuIHU7ZG97dS5wdXNoKGE9bmV3IERhdGUoK2UpKSxuKGUsbyksdChlKX13aGlsZShhPGUmJmU8cik7cmV0dXJuIHV9LGkuZmlsdGVyPWZ1bmN0aW9uKGUpe3JldHVybiBSaChmdW5jdGlvbihuKXtpZihuPj1uKWZvcig7dChuKSwhZShuKTspbi5zZXRUaW1lKG4tMSl9LGZ1bmN0aW9uKHQscil7aWYodD49dClpZihyPDApZm9yKDsrK3I8PTA7KWZvcig7bih0LC0xKSwhZSh0KTspO2Vsc2UgZm9yKDstLXI+PTA7KWZvcig7bih0LDEpLCFlKHQpOyk7fSl9LGUmJihpLmNvdW50PWZ1bmN0aW9uKG4scil7cmV0dXJuIFBoLnNldFRpbWUoK24pLHpoLnNldFRpbWUoK3IpLHQoUGgpLHQoemgpLE1hdGguZmxvb3IoZShQaCx6aCkpfSxpLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/aS5maWx0ZXIocj9mdW5jdGlvbihuKXtyZXR1cm4gcihuKSV0PT0wfTpmdW5jdGlvbihuKXtyZXR1cm4gaS5jb3VudCgwLG4pJXQ9PTB9KTppOm51bGx9KSxpfXZhciBMaD1SaChmdW5jdGlvbigpe30sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3Qrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4tdH0pO0xoLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/UmgoZnVuY3Rpb24obil7bi5zZXRUaW1lKE1hdGguZmxvb3Iobi90KSp0KX0sZnVuY3Rpb24obixlKXtuLnNldFRpbWUoK24rZSp0KX0sZnVuY3Rpb24obixlKXtyZXR1cm4oZS1uKS90fSk6TGg6bnVsbH07dmFyIERoPUxoLnJhbmdlLFVoPTZlNCxxaD02MDQ4ZTUsT2g9UmgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKDFlMypNYXRoLmZsb29yKHQvMWUzKSl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzFlMypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS8xZTN9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ1NlY29uZHMoKX0pLFloPU9oLnJhbmdlLEJoPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZShNYXRoLmZsb29yKHQvVWgpKlVoKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipVaCl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVWh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1pbnV0ZXMoKX0pLEZoPUJoLnJhbmdlLEloPVJoKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSpVaCUzNmU1O248MCYmKG4rPTM2ZTUpLHQuc2V0VGltZSgzNmU1Kk1hdGguZmxvb3IoKCt0LW4pLzM2ZTUpK24pfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCszNmU1Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzM2ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEhvdXJzKCl9KSxIaD1JaC5yYW5nZSxqaD1SaChmdW5jdGlvbih0KXt0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RGF0ZSh0LmdldERhdGUoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpVaCkvODY0ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERhdGUoKS0xfSksWGg9amgucmFuZ2U7ZnVuY3Rpb24gR2godCl7cmV0dXJuIFJoKGZ1bmN0aW9uKG4pe24uc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSs3LXQpJTcpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdC0obi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqVWgpL3FofSl9dmFyIFZoPUdoKDApLCRoPUdoKDEpLFdoPUdoKDIpLFpoPUdoKDMpLFFoPUdoKDQpLEpoPUdoKDUpLEtoPUdoKDYpLHRkPVZoLnJhbmdlLG5kPSRoLnJhbmdlLGVkPVdoLnJhbmdlLHJkPVpoLnJhbmdlLGlkPVFoLnJhbmdlLG9kPUpoLnJhbmdlLGFkPUtoLnJhbmdlLHVkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0TW9udGgodC5nZXRNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldE1vbnRoKCktdC5nZXRNb250aCgpKzEyKihuLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pLGZkPXVkLnJhbmdlLGNkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0TW9udGgoMCwxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRGdWxsWWVhcigpfSk7Y2QuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9SaChmdW5jdGlvbihuKXtuLnNldEZ1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRGdWxsWWVhcigpL3QpKnQpLG4uc2V0TW9udGgoMCwxKSxuLnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgc2Q9Y2QucmFuZ2UsbGQ9UmgoZnVuY3Rpb24odCl7dC5zZXRVVENTZWNvbmRzKDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qVWgpfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL1VofSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNaW51dGVzKCl9KSxoZD1sZC5yYW5nZSxkZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ01pbnV0ZXMoMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCszNmU1Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzM2ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0hvdXJzKCl9KSxwZD1kZC5yYW5nZSx2ZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDRGF0ZSgpLTF9KSxnZD12ZC5yYW5nZTtmdW5jdGlvbiB5ZCh0KXtyZXR1cm4gUmgoZnVuY3Rpb24obil7bi5zZXRVVENEYXRlKG4uZ2V0VVRDRGF0ZSgpLShuLmdldFVUQ0RheSgpKzctdCklNyksbi5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9xaH0pfXZhciBfZD15ZCgwKSxiZD15ZCgxKSxtZD15ZCgyKSx4ZD15ZCgzKSx3ZD15ZCg0KSxNZD15ZCg1KSxBZD15ZCg2KSxUZD1fZC5yYW5nZSxOZD1iZC5yYW5nZSxTZD1tZC5yYW5nZSxFZD14ZC5yYW5nZSxrZD13ZC5yYW5nZSxDZD1NZC5yYW5nZSxQZD1BZC5yYW5nZSx6ZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ0RhdGUoMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ01vbnRoKHQuZ2V0VVRDTW9udGgoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5nZXRVVENNb250aCgpLXQuZ2V0VVRDTW9udGgoKSsxMioobi5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKSl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01vbnRoKCl9KSxSZD16ZC5yYW5nZSxMZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ01vbnRoKDAsMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0Z1bGxZZWFyKHQuZ2V0VVRDRnVsbFllYXIoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDRnVsbFllYXIoKX0pO0xkLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/UmgoZnVuY3Rpb24obil7bi5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKG4uZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxuLnNldFVUQ01vbnRoKDAsMSksbi5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24obixlKXtuLnNldFVUQ0Z1bGxZZWFyKG4uZ2V0VVRDRnVsbFllYXIoKStlKnQpfSk6bnVsbH07dmFyIERkPUxkLnJhbmdlO2Z1bmN0aW9uIFVkKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBuLnNldEZ1bGxZZWFyKHQueSksbn1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBxZCh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBuPW5ldyBEYXRlKERhdGUuVVRDKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSk7cmV0dXJuIG4uc2V0VVRDRnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKX1mdW5jdGlvbiBPZCh0KXtyZXR1cm57eTp0LG06MCxkOjEsSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBZZCh0KXt2YXIgbj10LmRhdGVUaW1lLGU9dC5kYXRlLHI9dC50aW1lLGk9dC5wZXJpb2RzLG89dC5kYXlzLGE9dC5zaG9ydERheXMsdT10Lm1vbnRocyxmPXQuc2hvcnRNb250aHMsYz1WZChpKSxzPSRkKGkpLGw9VmQobyksaD0kZChvKSxkPVZkKGEpLHA9JGQoYSksdj1WZCh1KSxnPSRkKHUpLHk9VmQoZiksXz0kZChmKSxiPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBmW3QuZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6cHAsZTpwcCxmOmJwLEg6dnAsSTpncCxqOnlwLEw6X3AsbTptcCxNOnhwLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGlbKyh0LmdldEhvdXJzKCk+PTEyKV19LFE6V3AsczpacCxTOndwLHU6TXAsVTpBcCxWOlRwLHc6TnAsVzpTcCx4Om51bGwsWDpudWxsLHk6RXAsWTprcCxaOkNwLCIlIjokcH0sbT17YTpmdW5jdGlvbih0KXtyZXR1cm4gYVt0LmdldFVUQ0RheSgpXX0sQTpmdW5jdGlvbih0KXtyZXR1cm4gb1t0LmdldFVUQ0RheSgpXX0sYjpmdW5jdGlvbih0KXtyZXR1cm4gZlt0LmdldFVUQ01vbnRoKCldfSxCOmZ1bmN0aW9uKHQpe3JldHVybiB1W3QuZ2V0VVRDTW9udGgoKV19LGM6bnVsbCxkOlBwLGU6UHAsZjpVcCxIOnpwLEk6UnAsajpMcCxMOkRwLG06cXAsTTpPcCxwOmZ1bmN0aW9uKHQpe3JldHVybiBpWysodC5nZXRVVENIb3VycygpPj0xMildfSxROldwLHM6WnAsUzpZcCx1OkJwLFU6RnAsVjpJcCx3OkhwLFc6anAseDpudWxsLFg6bnVsbCx5OlhwLFk6R3AsWjpWcCwiJSI6JHB9LHg9e2E6ZnVuY3Rpb24odCxuLGUpe3ZhciByPWQuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC53PXBbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9bC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9aFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxiOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj15LmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQubT1fW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LEI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXYuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPWdbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sYzpmdW5jdGlvbih0LGUscil7cmV0dXJuIEEodCxuLGUscil9LGQ6aXAsZTppcCxmOnNwLEg6YXAsSTphcCxqOm9wLEw6Y3AsbTpycCxNOnVwLHA6ZnVuY3Rpb24odCxuLGUpe3ZhciByPWMuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5wPXNbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sUTpocCxzOmRwLFM6ZnAsdTpaZCxVOlFkLFY6SmQsdzpXZCxXOktkLHg6ZnVuY3Rpb24odCxuLHIpe3JldHVybiBBKHQsZSxuLHIpfSxYOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gQSh0LHIsbixlKX0seTpucCxZOnRwLFo6ZXAsIiUiOmxwfTtmdW5jdGlvbiB3KHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbyxhPVtdLHU9LTEsZj0wLGM9dC5sZW5ndGg7Zm9yKGUgaW5zdGFuY2VvZiBEYXRlfHwoZT1uZXcgRGF0ZSgrZSkpOysrdTxjOykzNz09PXQuY2hhckNvZGVBdCh1KSYmKGEucHVzaCh0LnNsaWNlKGYsdSkpLG51bGwhPShpPUZkW3I9dC5jaGFyQXQoKyt1KV0pP3I9dC5jaGFyQXQoKyt1KTppPSJlIj09PXI/IiAiOiIwIiwobz1uW3JdKSYmKHI9byhlLGkpKSxhLnB1c2gociksZj11KzEpO3JldHVybiBhLnB1c2godC5zbGljZShmLHUpKSxhLmpvaW4oIiIpfX1mdW5jdGlvbiBNKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbz1PZCgxOTAwKTtpZihBKG8sdCxlKz0iIiwwKSE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gbylyZXR1cm4gbmV3IERhdGUoby5RKTtpZigicCJpbiBvJiYoby5IPW8uSCUxMisxMipvLnApLCJWImluIG8pe2lmKG8uVjwxfHxvLlY+NTMpcmV0dXJuIG51bGw7InciaW4gb3x8KG8udz0xKSwiWiJpbiBvPyhpPShyPXFkKE9kKG8ueSkpKS5nZXRVVENEYXkoKSxyPWk+NHx8MD09PWk/YmQuY2VpbChyKTpiZChyKSxyPXZkLm9mZnNldChyLDcqKG8uVi0xKSksby55PXIuZ2V0VVRDRnVsbFllYXIoKSxvLm09ci5nZXRVVENNb250aCgpLG8uZD1yLmdldFVUQ0RhdGUoKSsoby53KzYpJTcpOihpPShyPW4oT2Qoby55KSkpLmdldERheSgpLHI9aT40fHwwPT09aT8kaC5jZWlsKHIpOiRoKHIpLHI9amgub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRGdWxsWWVhcigpLG8ubT1yLmdldE1vbnRoKCksby5kPXIuZ2V0RGF0ZSgpKyhvLncrNiklNyl9ZWxzZSgiVyJpbiBvfHwiVSJpbiBvKSYmKCJ3ImluIG98fChvLnc9InUiaW4gbz9vLnUlNzoiVyJpbiBvPzE6MCksaT0iWiJpbiBvP3FkKE9kKG8ueSkpLmdldFVUQ0RheSgpOm4oT2Qoby55KSkuZ2V0RGF5KCksby5tPTAsby5kPSJXImluIG8/KG8udys2KSU3Kzcqby5XLShpKzUpJTc6by53Kzcqby5VLShpKzYpJTcpO3JldHVybiJaImluIG8/KG8uSCs9by5aLzEwMHwwLG8uTSs9by5aJTEwMCxxZChvKSk6bihvKX19ZnVuY3Rpb24gQSh0LG4sZSxyKXtmb3IodmFyIGksbyxhPTAsdT1uLmxlbmd0aCxmPWUubGVuZ3RoO2E8dTspe2lmKHI+PWYpcmV0dXJuLTE7aWYoMzc9PT0oaT1uLmNoYXJDb2RlQXQoYSsrKSkpe2lmKGk9bi5jaGFyQXQoYSsrKSwhKG89eFtpIGluIEZkP24uY2hhckF0KGErKyk6aV0pfHwocj1vKHQsZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKGkhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfXJldHVybiBiLng9dyhlLGIpLGIuWD13KHIsYiksYi5jPXcobixiKSxtLng9dyhlLG0pLG0uWD13KHIsbSksbS5jPXcobixtKSx7Zm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBuPXcodCs9IiIsYik7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0scGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49TSh0Kz0iIixVZCk7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0sdXRjRm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBuPXcodCs9IiIsbSk7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0sdXRjUGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49TSh0LHFkKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufX19dmFyIEJkLEZkPXsiLSI6IiIsXzoiICIsMDoiMCJ9LElkPS9eXHMqXGQrLyxIZD0vXiUvLGpkPS9bXFxeJCorP3xbXF0oKS57fV0vZztmdW5jdGlvbiBYZCh0LG4sZSl7dmFyIHI9dDwwPyItIjoiIixpPShyPy10OnQpKyIiLG89aS5sZW5ndGg7cmV0dXJuIHIrKG88ZT9uZXcgQXJyYXkoZS1vKzEpLmpvaW4obikraTppKX1mdW5jdGlvbiBHZCh0KXtyZXR1cm4gdC5yZXBsYWNlKGpkLCJcXCQmIil9ZnVuY3Rpb24gVmQodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKEdkKS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gJGQodCl7Zm9yKHZhciBuPXt9LGU9LTEscj10Lmxlbmd0aDsrK2U8cjspblt0W2VdLnRvTG93ZXJDYXNlKCldPWU7cmV0dXJuIG59ZnVuY3Rpb24gV2QodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByPyh0Lnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWmQodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByPyh0LnU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUWQodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LlU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSmQodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LlY9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gS2QodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Llc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdHAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrNCkpO3JldHVybiByPyh0Lnk9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbnAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lnk9K3JbMF0rKCtyWzBdPjY4PzE5MDA6MmUzKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBlcCh0LG4sZSl7dmFyIHI9L14oWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8vLmV4ZWMobi5zbGljZShlLGUrNikpO3JldHVybiByPyh0Llo9clsxXT8wOi0oclsyXSsoclszXXx8IjAwIikpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KHQubT0wLHQuZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBhcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuSD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1cCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuTT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBmcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuUz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBjcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KHQuTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBzcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuTD1NYXRoLmZsb29yKHJbMF0vMWUzKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBscCh0LG4sZSl7dmFyIHI9SGQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiBocCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5RPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGRwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlE9MWUzKityWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHBwKHQsbil7cmV0dXJuIFhkKHQuZ2V0RGF0ZSgpLG4sMil9ZnVuY3Rpb24gdnAodCxuKXtyZXR1cm4gWGQodC5nZXRIb3VycygpLG4sMil9ZnVuY3Rpb24gZ3AodCxuKXtyZXR1cm4gWGQodC5nZXRIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIHlwKHQsbil7cmV0dXJuIFhkKDEramguY291bnQoY2QodCksdCksbiwzKX1mdW5jdGlvbiBfcCh0LG4pe3JldHVybiBYZCh0LmdldE1pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24gYnAodCxuKXtyZXR1cm4gX3AodCxuKSsiMDAwIn1mdW5jdGlvbiBtcCh0LG4pe3JldHVybiBYZCh0LmdldE1vbnRoKCkrMSxuLDIpfWZ1bmN0aW9uIHhwKHQsbil7cmV0dXJuIFhkKHQuZ2V0TWludXRlcygpLG4sMil9ZnVuY3Rpb24gd3AodCxuKXtyZXR1cm4gWGQodC5nZXRTZWNvbmRzKCksbiwyKX1mdW5jdGlvbiBNcCh0KXt2YXIgbj10LmdldERheSgpO3JldHVybiAwPT09bj83Om59ZnVuY3Rpb24gQXAodCxuKXtyZXR1cm4gWGQoVmguY291bnQoY2QodCksdCksbiwyKX1mdW5jdGlvbiBUcCh0LG4pe3ZhciBlPXQuZ2V0RGF5KCk7cmV0dXJuIHQ9ZT49NHx8MD09PWU/UWgodCk6UWguY2VpbCh0KSxYZChRaC5jb3VudChjZCh0KSx0KSsoND09PWNkKHQpLmdldERheSgpKSxuLDIpfWZ1bmN0aW9uIE5wKHQpe3JldHVybiB0LmdldERheSgpfWZ1bmN0aW9uIFNwKHQsbil7cmV0dXJuIFhkKCRoLmNvdW50KGNkKHQpLHQpLG4sMil9ZnVuY3Rpb24gRXAodCxuKXtyZXR1cm4gWGQodC5nZXRGdWxsWWVhcigpJTEwMCxuLDIpfWZ1bmN0aW9uIGtwKHQsbil7cmV0dXJuIFhkKHQuZ2V0RnVsbFllYXIoKSUxZTQsbiw0KX1mdW5jdGlvbiBDcCh0KXt2YXIgbj10LmdldFRpbWV6b25lT2Zmc2V0KCk7cmV0dXJuKG4+MD8iLSI6KG4qPS0xLCIrIikpK1hkKG4vNjB8MCwiMCIsMikrWGQobiU2MCwiMCIsMil9ZnVuY3Rpb24gUHAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENEYXRlKCksbiwyKX1mdW5jdGlvbiB6cCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0hvdXJzKCksbiwyKX1mdW5jdGlvbiBScCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0hvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24gTHAodCxuKXtyZXR1cm4gWGQoMSt2ZC5jb3VudChMZCh0KSx0KSxuLDMpfWZ1bmN0aW9uIERwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBVcCh0LG4pe3JldHVybiBEcCh0LG4pKyIwMDAifWZ1bmN0aW9uIHFwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDTW9udGgoKSsxLG4sMil9ZnVuY3Rpb24gT3AodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNaW51dGVzKCksbiwyKX1mdW5jdGlvbiBZcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ1NlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIEJwKHQpe3ZhciBuPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBGcCh0LG4pe3JldHVybiBYZChfZC5jb3VudChMZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIElwKHQsbil7dmFyIGU9dC5nZXRVVENEYXkoKTtyZXR1cm4gdD1lPj00fHwwPT09ZT93ZCh0KTp3ZC5jZWlsKHQpLFhkKHdkLmNvdW50KExkKHQpLHQpKyg0PT09TGQodCkuZ2V0VVRDRGF5KCkpLG4sMil9ZnVuY3Rpb24gSHAodCl7cmV0dXJuIHQuZ2V0VVRDRGF5KCl9ZnVuY3Rpb24ganAodCxuKXtyZXR1cm4gWGQoYmQuY291bnQoTGQodCksdCksbiwyKX1mdW5jdGlvbiBYcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0Z1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24gR3AodCxuKXtyZXR1cm4gWGQodC5nZXRVVENGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIFZwKCl7cmV0dXJuIiswMDAwIn1mdW5jdGlvbiAkcCgpe3JldHVybiIlIn1mdW5jdGlvbiBXcCh0KXtyZXR1cm4rdH1mdW5jdGlvbiBacCh0KXtyZXR1cm4gTWF0aC5mbG9vcigrdC8xZTMpfWZ1bmN0aW9uIFFwKG4pe3JldHVybiBCZD1ZZChuKSx0LnRpbWVGb3JtYXQ9QmQuZm9ybWF0LHQudGltZVBhcnNlPUJkLnBhcnNlLHQudXRjRm9ybWF0PUJkLnV0Y0Zvcm1hdCx0LnV0Y1BhcnNlPUJkLnV0Y1BhcnNlLEJkfVFwKHtkYXRlVGltZToiJXgsICVYIixkYXRlOiIlLW0vJS1kLyVZIix0aW1lOiIlLUk6JU06JVMgJXAiLHBlcmlvZHM6WyJBTSIsIlBNIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7dmFyIEpwPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nP2Z1bmN0aW9uKHQpe3JldHVybiB0LnRvSVNPU3RyaW5nKCl9OnQudXRjRm9ybWF0KCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKTt2YXIgS3A9K25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKT9mdW5jdGlvbih0KXt2YXIgbj1uZXcgRGF0ZSh0KTtyZXR1cm4gaXNOYU4obik/bnVsbDpufTp0LnV0Y1BhcnNlKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKSx0dj0xZTMsbnY9NjAqdHYsZXY9NjAqbnYscnY9MjQqZXYsaXY9Nypydixvdj0zMCpydixhdj0zNjUqcnY7ZnVuY3Rpb24gdXYodCl7cmV0dXJuIG5ldyBEYXRlKHQpfWZ1bmN0aW9uIGZ2KHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT8rdDorbmV3IERhdGUoK3QpfWZ1bmN0aW9uIGN2KHQsbixyLGksbyxhLHUsZixjKXt2YXIgcz1taChnaCx2ZSksbD1zLmludmVydCxoPXMuZG9tYWluLGQ9YygiLiVMIikscD1jKCI6JVMiKSx2PWMoIiVJOiVNIiksZz1jKCIlSSAlcCIpLHk9YygiJWEgJWQiKSxfPWMoIiViICVkIiksYj1jKCIlQiIpLG09YygiJVkiKSx4PVtbdSwxLHR2XSxbdSw1LDUqdHZdLFt1LDE1LDE1KnR2XSxbdSwzMCwzMCp0dl0sW2EsMSxudl0sW2EsNSw1Km52XSxbYSwxNSwxNSpudl0sW2EsMzAsMzAqbnZdLFtvLDEsZXZdLFtvLDMsMypldl0sW28sNiw2KmV2XSxbbywxMiwxMipldl0sW2ksMSxydl0sW2ksMiwyKnJ2XSxbciwxLGl2XSxbbiwxLG92XSxbbiwzLDMqb3ZdLFt0LDEsYXZdXTtmdW5jdGlvbiBNKGUpe3JldHVybih1KGUpPGU/ZDphKGUpPGU/cDpvKGUpPGU/djppKGUpPGU/ZzpuKGUpPGU/cihlKTxlP3k6Xzp0KGUpPGU/YjptKShlKX1mdW5jdGlvbiBBKG4scixpLG8pe2lmKG51bGw9PW4mJihuPTEwKSwibnVtYmVyIj09dHlwZW9mIG4pe3ZhciBhPU1hdGguYWJzKGktcikvbix1PWUoZnVuY3Rpb24odCl7cmV0dXJuIHRbMl19KS5yaWdodCh4LGEpO3U9PT14Lmxlbmd0aD8obz13KHIvYXYsaS9hdixuKSxuPXQpOnU/KG89KHU9eFthL3hbdS0xXVsyXTx4W3VdWzJdL2E/dS0xOnVdKVsxXSxuPXVbMF0pOihvPU1hdGgubWF4KHcocixpLG4pLDEpLG49Zil9cmV0dXJuIG51bGw9PW8/bjpuLmV2ZXJ5KG8pfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IERhdGUobCh0KSl9LHMuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2goZmguY2FsbCh0LGZ2KSk6aCgpLm1hcCh1dil9LHMudGlja3M9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPWgoKSxpPXJbMF0sbz1yW3IubGVuZ3RoLTFdLGE9bzxpO3JldHVybiBhJiYoZT1pLGk9byxvPWUpLGU9KGU9QSh0LGksbyxuKSk/ZS5yYW5nZShpLG8rMSk6W10sYT9lLnJldmVyc2UoKTplfSxzLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09bj9NOmMobil9LHMubmljZT1mdW5jdGlvbih0LG4pe3ZhciBlPWgoKTtyZXR1cm4odD1BKHQsZVswXSxlW2UubGVuZ3RoLTFdLG4pKT9oKHdoKGUsdCkpOnN9LHMuY29weT1mdW5jdGlvbigpe3JldHVybiBiaChzLGN2KHQsbixyLGksbyxhLHUsZixjKSl9LHN9ZnVuY3Rpb24gc3YodCl7Zm9yKHZhciBuPXQubGVuZ3RoLzZ8MCxlPW5ldyBBcnJheShuKSxyPTA7cjxuOyllW3JdPSIjIit0LnNsaWNlKDYqciw2Kisrcik7cmV0dXJuIGV9dmFyIGx2PXN2KCIxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2YiKSxodj1zdigiN2ZjOTdmYmVhZWQ0ZmRjMDg2ZmZmZjk5Mzg2Y2IwZjAwMjdmYmY1YjE3NjY2NjY2IiksZHY9c3YoIjFiOWU3N2Q5NWYwMjc1NzBiM2U3Mjk4YTY2YTYxZWU2YWIwMmE2NzYxZDY2NjY2NiIpLHB2PXN2KCJhNmNlZTMxZjc4YjRiMmRmOGEzM2EwMmNmYjlhOTllMzFhMWNmZGJmNmZmZjdmMDBjYWIyZDY2YTNkOWFmZmZmOTliMTU5MjgiKSx2dj1zdigiZmJiNGFlYjNjZGUzY2NlYmM1ZGVjYmU0ZmVkOWE2ZmZmZmNjZTVkOGJkZmRkYWVjZjJmMmYyIiksZ3Y9c3YoImIzZTJjZGZkY2RhY2NiZDVlOGY0Y2FlNGU2ZjVjOWZmZjJhZWYxZTJjY2NjY2NjYyIpLHl2PXN2KCJlNDFhMWMzNzdlYjg0ZGFmNGE5ODRlYTNmZjdmMDBmZmZmMzNhNjU2MjhmNzgxYmY5OTk5OTkiKSxfdj1zdigiNjZjMmE1ZmM4ZDYyOGRhMGNiZTc4YWMzYTZkODU0ZmZkOTJmZTVjNDk0YjNiM2IzIiksYnY9c3YoIjhkZDNjN2ZmZmZiM2JlYmFkYWZiODA3MjgwYjFkM2ZkYjQ2MmIzZGU2OWZjY2RlNWQ5ZDlkOWJjODBiZGNjZWJjNWZmZWQ2ZiIpO2Z1bmN0aW9uIG12KHQpe3JldHVybiBsZSh0W3QubGVuZ3RoLTFdKX12YXIgeHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZDhiMzY1ZjVmNWY1NWFiNGFjIiwiYTY2MTFhZGZjMjdkODBjZGMxMDE4NTcxIiwiYTY2MTFhZGZjMjdkZjVmNWY1ODBjZGMxMDE4NTcxIiwiOGM1MTBhZDhiMzY1ZjZlOGMzYzdlYWU1NWFiNGFjMDE2NjVlIiwiOGM1MTBhZDhiMzY1ZjZlOGMzZjVmNWY1YzdlYWU1NWFiNGFjMDE2NjVlIiwiOGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwiOGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwiNTQzMDA1OGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAzYzMwIiwiNTQzMDA1OGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAzYzMwIikubWFwKHN2KSx3dj1tdih4diksTXY9bmV3IEFycmF5KDMpLmNvbmNhdCgiYWY4ZGMzZjdmN2Y3N2ZiZjdiIiwiN2IzMjk0YzJhNWNmYTZkYmEwMDA4ODM3IiwiN2IzMjk0YzJhNWNmZjdmN2Y3YTZkYmEwMDA4ODM3IiwiNzYyYTgzYWY4ZGMzZTdkNGU4ZDlmMGQzN2ZiZjdiMWI3ODM3IiwiNzYyYTgzYWY4ZGMzZTdkNGU4ZjdmN2Y3ZDlmMGQzN2ZiZjdiMWI3ODM3IiwiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3IiwiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZjdmN2Y3ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3IiwiNDAwMDRiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3MDA0NDFiIiwiNDAwMDRiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZjdmN2Y3ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3MDA0NDFiIikubWFwKHN2KSxBdj1tdihNdiksVHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTlhM2M5ZjdmN2Y3YTFkNzZhIiwiZDAxYzhiZjFiNmRhYjhlMTg2NGRhYzI2IiwiZDAxYzhiZjFiNmRhZjdmN2Y3YjhlMTg2NGRhYzI2IiwiYzUxYjdkZTlhM2M5ZmRlMGVmZTZmNWQwYTFkNzZhNGQ5MjIxIiwiYzUxYjdkZTlhM2M5ZmRlMGVmZjdmN2Y3ZTZmNWQwYTFkNzZhNGQ5MjIxIiwiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwiOGUwMTUyYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5IiwiOGUwMTUyYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5IikubWFwKHN2KSxOdj1tdihUdiksU3Y9bmV3IEFycmF5KDMpLmNvbmNhdCgiOTk4ZWMzZjdmN2Y3ZjFhMzQwIiwiNWUzYzk5YjJhYmQyZmRiODYzZTY2MTAxIiwiNWUzYzk5YjJhYmQyZjdmN2Y3ZmRiODYzZTY2MTAxIiwiNTQyNzg4OTk4ZWMzZDhkYWViZmVlMGI2ZjFhMzQwYjM1ODA2IiwiNTQyNzg4OTk4ZWMzZDhkYWViZjdmN2Y3ZmVlMGI2ZjFhMzQwYjM1ODA2IiwiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2IiwiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZjdmN2Y3ZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2IiwiMmQwMDRiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2N2YzYjA4IiwiMmQwMDRiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZjdmN2Y3ZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2N2YzYjA4IikubWFwKHN2KSxFdj1tdihTdiksa3Y9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWY4YTYyZjdmN2Y3NjdhOWNmIiwiY2EwMDIwZjRhNTgyOTJjNWRlMDU3MWIwIiwiY2EwMDIwZjRhNTgyZjdmN2Y3OTJjNWRlMDU3MWIwIiwiYjIxODJiZWY4YTYyZmRkYmM3ZDFlNWYwNjdhOWNmMjE2NmFjIiwiYjIxODJiZWY4YTYyZmRkYmM3ZjdmN2Y3ZDFlNWYwNjdhOWNmMjE2NmFjIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZjdmN2Y3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjMDUzMDYxIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZjdmN2Y3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjMDUzMDYxIikubWFwKHN2KSxDdj1tdihrdiksUHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWY4YTYyZmZmZmZmOTk5OTk5IiwiY2EwMDIwZjRhNTgyYmFiYWJhNDA0MDQwIiwiY2EwMDIwZjRhNTgyZmZmZmZmYmFiYWJhNDA0MDQwIiwiYjIxODJiZWY4YTYyZmRkYmM3ZTBlMGUwOTk5OTk5NGQ0ZDRkIiwiYjIxODJiZWY4YTYyZmRkYmM3ZmZmZmZmZTBlMGUwOTk5OTk5NGQ0ZDRkIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIikubWFwKHN2KSx6dj1tdihQdiksUnY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTFiZmRiIiwiZDcxOTFjZmRhZTYxYWJkOWU5MmM3YmI2IiwiZDcxOTFjZmRhZTYxZmZmZmJmYWJkOWU5MmM3YmI2IiwiZDczMDI3ZmM4ZDU5ZmVlMDkwZTBmM2Y4OTFiZmRiNDU3NWI0IiwiZDczMDI3ZmM4ZDU5ZmVlMDkwZmZmZmJmZTBmM2Y4OTFiZmRiNDU3NWI0IiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0IiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZmZmZmJmZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0MzEzNjk1IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZmZmZmJmZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0MzEzNjk1IikubWFwKHN2KSxMdj1tdihSdiksRHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTFjZjYwIiwiZDcxOTFjZmRhZTYxYTZkOTZhMWE5NjQxIiwiZDcxOTFjZmRhZTYxZmZmZmJmYTZkOTZhMWE5NjQxIiwiZDczMDI3ZmM4ZDU5ZmVlMDhiZDllZjhiOTFjZjYwMWE5ODUwIiwiZDczMDI3ZmM4ZDU5ZmVlMDhiZmZmZmJmZDllZjhiOTFjZjYwMWE5ODUwIiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwIiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwIiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwMDA2ODM3IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwMDA2ODM3IikubWFwKHN2KSxVdj1tdihEdikscXY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTlkNTk0IiwiZDcxOTFjZmRhZTYxYWJkZGE0MmI4M2JhIiwiZDcxOTFjZmRhZTYxZmZmZmJmYWJkZGE0MmI4M2JhIiwiZDUzZTRmZmM4ZDU5ZmVlMDhiZTZmNTk4OTlkNTk0MzI4OGJkIiwiZDUzZTRmZmM4ZDU5ZmVlMDhiZmZmZmJmZTZmNTk4OTlkNTk0MzI4OGJkIiwiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkIiwiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkIiwiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyIiwiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyIikubWFwKHN2KSxPdj1tdihxdiksWXY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTVmNWY5OTlkOGM5MmNhMjVmIiwiZWRmOGZiYjJlMmUyNjZjMmE0MjM4YjQ1IiwiZWRmOGZiYjJlMmUyNjZjMmE0MmNhMjVmMDA2ZDJjIiwiZWRmOGZiY2NlY2U2OTlkOGM5NjZjMmE0MmNhMjVmMDA2ZDJjIiwiZWRmOGZiY2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA2ZDJjMDA0NDFiIikubWFwKHN2KSxCdj1tdihZdiksRnY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTBlY2Y0OWViY2RhODg1NmE3IiwiZWRmOGZiYjNjZGUzOGM5NmM2ODg0MTlkIiwiZWRmOGZiYjNjZGUzOGM5NmM2ODg1NmE3ODEwZjdjIiwiZWRmOGZiYmZkM2U2OWViY2RhOGM5NmM2ODg1NmE3ODEwZjdjIiwiZWRmOGZiYmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkNmUwMTZiIiwiZjdmY2ZkZTBlY2Y0YmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkNmUwMTZiIiwiZjdmY2ZkZTBlY2Y0YmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkODEwZjdjNGQwMDRiIikubWFwKHN2KSxJdj1tdihGdiksSHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTBmM2RiYThkZGI1NDNhMmNhIiwiZjBmOWU4YmFlNGJjN2JjY2M0MmI4Y2JlIiwiZjBmOWU4YmFlNGJjN2JjY2M0NDNhMmNhMDg2OGFjIiwiZjBmOWU4Y2NlYmM1YThkZGI1N2JjY2M0NDNhMmNhMDg2OGFjIiwiZjBmOWU4Y2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllIiwiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllIiwiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg2OGFjMDg0MDgxIikubWFwKHN2KSxqdj1tdihIdiksWHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlOGM4ZmRiYjg0ZTM0YTMzIiwiZmVmMGQ5ZmRjYzhhZmM4ZDU5ZDczMDFmIiwiZmVmMGQ5ZmRjYzhhZmM4ZDU5ZTM0YTMzYjMwMDAwIiwiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZTM0YTMzYjMwMDAwIiwiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkwMDAwIiwiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkwMDAwIiwiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmYjMwMDAwN2YwMDAwIikubWFwKHN2KSxHdj1tdihYdiksVnY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWNlMmYwYTZiZGRiMWM5MDk5IiwiZjZlZmY3YmRjOWUxNjdhOWNmMDI4MThhIiwiZjZlZmY3YmRjOWUxNjdhOWNmMWM5MDk5MDE2YzU5IiwiZjZlZmY3ZDBkMWU2YTZiZGRiNjdhOWNmMWM5MDk5MDE2YzU5IiwiZjZlZmY3ZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2NDUwIiwiZmZmN2ZiZWNlMmYwZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2NDUwIiwiZmZmN2ZiZWNlMmYwZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2YzU5MDE0NjM2IikubWFwKHN2KSwkdj1tdihWdiksV3Y9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWNlN2YyYTZiZGRiMmI4Y2JlIiwiZjFlZWY2YmRjOWUxNzRhOWNmMDU3MGIwIiwiZjFlZWY2YmRjOWUxNzRhOWNmMmI4Y2JlMDQ1YThkIiwiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMmI4Y2JlMDQ1YThkIiwiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDM0ZTdiIiwiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDM0ZTdiIiwiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDQ1YThkMDIzODU4IikubWFwKHN2KSxadj1tdihXdiksUXY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTdlMWVmYzk5NGM3ZGQxYzc3IiwiZjFlZWY2ZDdiNWQ4ZGY2NWIwY2UxMjU2IiwiZjFlZWY2ZDdiNWQ4ZGY2NWIwZGQxYzc3OTgwMDQzIiwiZjFlZWY2ZDRiOWRhYzk5NGM3ZGY2NWIwZGQxYzc3OTgwMDQzIiwiZjFlZWY2ZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTEwMDNmIiwiZjdmNGY5ZTdlMWVmZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTEwMDNmIiwiZjdmNGY5ZTdlMWVmZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTgwMDQzNjcwMDFmIikubWFwKHN2KSxKdj1tdihRdiksS3Y9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmRlMGRkZmE5ZmI1YzUxYjhhIiwiZmVlYmUyZmJiNGI5Zjc2OGExYWUwMTdlIiwiZmVlYmUyZmJiNGI5Zjc2OGExYzUxYjhhN2EwMTc3IiwiZmVlYmUyZmNjNWMwZmE5ZmI1Zjc2OGExYzUxYjhhN2EwMTc3IiwiZmVlYmUyZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3IiwiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3IiwiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3NDkwMDZhIikubWFwKHN2KSx0Zz1tdihLdiksbmc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWRmOGIxN2ZjZGJiMmM3ZmI4IiwiZmZmZmNjYTFkYWI0NDFiNmM0MjI1ZWE4IiwiZmZmZmNjYTFkYWI0NDFiNmM0MmM3ZmI4MjUzNDk0IiwiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MmM3ZmI4MjUzNDk0IiwiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MGMyYzg0IiwiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MGMyYzg0IiwiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MjUzNDk0MDgxZDU4IikubWFwKHN2KSxlZz1tdihuZykscmc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZjdmY2I5YWRkZDhlMzFhMzU0IiwiZmZmZmNjYzJlNjk5NzhjNjc5MjM4NDQzIiwiZmZmZmNjYzJlNjk5NzhjNjc5MzFhMzU0MDA2ODM3IiwiZmZmZmNjZDlmMGEzYWRkZDhlNzhjNjc5MzFhMzU0MDA2ODM3IiwiZmZmZmNjZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA1YTMyIiwiZmZmZmU1ZjdmY2I5ZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA1YTMyIiwiZmZmZmU1ZjdmY2I5ZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA2ODM3MDA0NTI5IikubWFwKHN2KSxpZz1tdihyZyksb2c9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmZmN2JjZmVjNDRmZDk1ZjBlIiwiZmZmZmQ0ZmVkOThlZmU5OTI5Y2M0YzAyIiwiZmZmZmQ0ZmVkOThlZmU5OTI5ZDk1ZjBlOTkzNDA0IiwiZmZmZmQ0ZmVlMzkxZmVjNDRmZmU5OTI5ZDk1ZjBlOTkzNDA0IiwiZmZmZmQ0ZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOGMyZDA0IiwiZmZmZmU1ZmZmN2JjZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOGMyZDA0IiwiZmZmZmU1ZmZmN2JjZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOTkzNDA0NjYyNTA2IikubWFwKHN2KSxhZz1tdihvZyksdWc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmZlZGEwZmViMjRjZjAzYjIwIiwiZmZmZmIyZmVjYzVjZmQ4ZDNjZTMxYTFjIiwiZmZmZmIyZmVjYzVjZmQ4ZDNjZjAzYjIwYmQwMDI2IiwiZmZmZmIyZmVkOTc2ZmViMjRjZmQ4ZDNjZjAzYjIwYmQwMDI2IiwiZmZmZmIyZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2IiwiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2IiwiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYmQwMDI2ODAwMDI2IikubWFwKHN2KSxmZz1tdih1ZyksY2c9bmV3IEFycmF5KDMpLmNvbmNhdCgiZGVlYmY3OWVjYWUxMzE4MmJkIiwiZWZmM2ZmYmRkN2U3NmJhZWQ2MjE3MWI1IiwiZWZmM2ZmYmRkN2U3NmJhZWQ2MzE4MmJkMDg1MTljIiwiZWZmM2ZmYzZkYmVmOWVjYWUxNmJhZWQ2MzE4MmJkMDg1MTljIiwiZWZmM2ZmYzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg0NTk0IiwiZjdmYmZmZGVlYmY3YzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg0NTk0IiwiZjdmYmZmZGVlYmY3YzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg1MTljMDgzMDZiIikubWFwKHN2KSxzZz1tdihjZyksbGc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTVmNWUwYTFkOTliMzFhMzU0IiwiZWRmOGU5YmFlNGIzNzRjNDc2MjM4YjQ1IiwiZWRmOGU5YmFlNGIzNzRjNDc2MzFhMzU0MDA2ZDJjIiwiZWRmOGU5YzdlOWMwYTFkOTliNzRjNDc2MzFhMzU0MDA2ZDJjIiwiZWRmOGU5YzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA1YTMyIiwiZjdmY2Y1ZTVmNWUwYzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA1YTMyIiwiZjdmY2Y1ZTVmNWUwYzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA2ZDJjMDA0NDFiIikubWFwKHN2KSxoZz1tdihsZyksZGc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZjBmMGYwYmRiZGJkNjM2MzYzIiwiZjdmN2Y3Y2NjY2NjOTY5Njk2NTI1MjUyIiwiZjdmN2Y3Y2NjY2NjOTY5Njk2NjM2MzYzMjUyNTI1IiwiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NjM2MzYzMjUyNTI1IiwiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1IiwiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1IiwiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1MDAwMDAwIikubWFwKHN2KSxwZz1tdihkZyksdmc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWZlZGY1YmNiZGRjNzU2YmIxIiwiZjJmMGY3Y2JjOWUyOWU5YWM4NmE1MWEzIiwiZjJmMGY3Y2JjOWUyOWU5YWM4NzU2YmIxNTQyNzhmIiwiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4NzU2YmIxNTQyNzhmIiwiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwiZmNmYmZkZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwiZmNmYmZkZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNTQyNzhmM2YwMDdkIikubWFwKHN2KSxnZz1tdih2ZykseWc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlMGQyZmM5MjcyZGUyZDI2IiwiZmVlNWQ5ZmNhZTkxZmI2YTRhY2IxODFkIiwiZmVlNWQ5ZmNhZTkxZmI2YTRhZGUyZDI2YTUwZjE1IiwiZmVlNWQ5ZmNiYmExZmM5MjcyZmI2YTRhZGUyZDI2YTUwZjE1IiwiZmVlNWQ5ZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkOTkwMDBkIiwiZmZmNWYwZmVlMGQyZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkOTkwMDBkIiwiZmZmNWYwZmVlMGQyZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkYTUwZjE1NjcwMDBkIikubWFwKHN2KSxfZz1tdih5ZyksYmc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlNmNlZmRhZTZiZTY1NTBkIiwiZmVlZGRlZmRiZTg1ZmQ4ZDNjZDk0NzAxIiwiZmVlZGRlZmRiZTg1ZmQ4ZDNjZTY1NTBkYTYzNjAzIiwiZmVlZGRlZmRkMGEyZmRhZTZiZmQ4ZDNjZTY1NTBkYTYzNjAzIiwiZmVlZGRlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0IiwiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0IiwiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxYTYzNjAzN2YyNzA0IikubWFwKHN2KSxtZz1tdihiZykseGc9R2UoS24oMzAwLC41LDApLEtuKC0yNDAsLjUsMSkpLHdnPUdlKEtuKC0xMDAsLjc1LC4zNSksS24oODAsMS41LC44KSksTWc9R2UoS24oMjYwLC43NSwuMzUpLEtuKDgwLDEuNSwuOCkpLEFnPUtuKCk7dmFyIFRnPWJuKCksTmc9TWF0aC5QSS8zLFNnPTIqTWF0aC5QSS8zO2Z1bmN0aW9uIEVnKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fXZhciBrZz1FZyhzdigiNDQwMTU0NDQwMjU2NDUwNDU3NDUwNTU5NDYwNzVhNDYwODVjNDYwYTVkNDYwYjVlNDcwZDYwNDcwZTYxNDcxMDYzNDcxMTY0NDcxMzY1NDgxNDY3NDgxNjY4NDgxNzY5NDgxODZhNDgxYTZjNDgxYjZkNDgxYzZlNDgxZDZmNDgxZjcwNDgyMDcxNDgyMTczNDgyMzc0NDgyNDc1NDgyNTc2NDgyNjc3NDgyODc4NDgyOTc5NDcyYTdhNDcyYzdhNDcyZDdiNDcyZTdjNDcyZjdkNDYzMDdlNDYzMjdlNDYzMzdmNDYzNDgwNDUzNTgxNDUzNzgxNDUzODgyNDQzOTgzNDQzYTgzNDQzYjg0NDMzZDg0NDMzZTg1NDIzZjg1NDI0MDg2NDI0MTg2NDE0Mjg3NDE0NDg3NDA0NTg4NDA0Njg4M2Y0Nzg4M2Y0ODg5M2U0OTg5M2U0YTg5M2U0YzhhM2Q0ZDhhM2Q0ZThhM2M0ZjhhM2M1MDhiM2I1MThiM2I1MjhiM2E1MzhiM2E1NDhjMzk1NThjMzk1NjhjMzg1ODhjMzg1OThjMzc1YThjMzc1YjhkMzY1YzhkMzY1ZDhkMzU1ZThkMzU1ZjhkMzQ2MDhkMzQ2MThkMzM2MjhkMzM2MzhkMzI2NDhlMzI2NThlMzE2NjhlMzE2NzhlMzE2ODhlMzA2OThlMzA2YThlMmY2YjhlMmY2YzhlMmU2ZDhlMmU2ZThlMmU2ZjhlMmQ3MDhlMmQ3MThlMmM3MThlMmM3MjhlMmM3MzhlMmI3NDhlMmI3NThlMmE3NjhlMmE3NzhlMmE3ODhlMjk3OThlMjk3YThlMjk3YjhlMjg3YzhlMjg3ZDhlMjc3ZThlMjc3ZjhlMjc4MDhlMjY4MThlMjY4MjhlMjY4MjhlMjU4MzhlMjU4NDhlMjU4NThlMjQ4NjhlMjQ4NzhlMjM4ODhlMjM4OThlMjM4YThkMjI4YjhkMjI4YzhkMjI4ZDhkMjE4ZThkMjE4ZjhkMjE5MDhkMjE5MThjMjA5MjhjMjA5MjhjMjA5MzhjMWY5NDhjMWY5NThiMWY5NjhiMWY5NzhiMWY5ODhiMWY5OThhMWY5YThhMWU5YjhhMWU5Yzg5MWU5ZDg5MWY5ZTg5MWY5Zjg4MWZhMDg4MWZhMTg4MWZhMTg3MWZhMjg3MjBhMzg2MjBhNDg2MjFhNTg1MjFhNjg1MjJhNzg1MjJhODg0MjNhOTgzMjRhYTgzMjVhYjgyMjVhYzgyMjZhZDgxMjdhZDgxMjhhZTgwMjlhZjdmMmFiMDdmMmNiMTdlMmRiMjdkMmViMzdjMmZiNDdjMzFiNTdiMzJiNjdhMzRiNjc5MzViNzc5MzdiODc4MzhiOTc3M2FiYTc2M2JiYjc1M2RiYzc0M2ZiYzczNDBiZDcyNDJiZTcxNDRiZjcwNDZjMDZmNDhjMTZlNGFjMTZkNGNjMjZjNGVjMzZiNTBjNDZhNTJjNTY5NTRjNTY4NTZjNjY3NThjNzY1NWFjODY0NWNjODYzNWVjOTYyNjBjYTYwNjNjYjVmNjVjYjVlNjdjYzVjNjljZDViNmNjZDVhNmVjZTU4NzBjZjU3NzNkMDU2NzVkMDU0NzdkMTUzN2FkMTUxN2NkMjUwN2ZkMzRlODFkMzRkODRkNDRiODZkNTQ5ODlkNTQ4OGJkNjQ2OGVkNjQ1OTBkNzQzOTNkNzQxOTVkODQwOThkODNlOWJkOTNjOWRkOTNiYTBkYTM5YTJkYTM3YTVkYjM2YThkYjM0YWFkYzMyYWRkYzMwYjBkZDJmYjJkZDJkYjVkZTJiYjhkZTI5YmFkZTI4YmRkZjI2YzBkZjI1YzJkZjIzYzVlMDIxYzhlMDIwY2FlMTFmY2RlMTFkZDBlMTFjZDJlMjFiZDVlMjFhZDhlMjE5ZGFlMzE5ZGRlMzE4ZGZlMzE4ZTJlNDE4ZTVlNDE5ZTdlNDE5ZWFlNTFhZWNlNTFiZWZlNTFjZjFlNTFkZjRlNjFlZjZlNjIwZjhlNjIxZmJlNzIzZmRlNzI1IikpLENnPUVnKHN2KCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYiKSksUGc9RWcoc3YoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAyMDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcyMjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODkyMjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2IwMzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNiNDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIzZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUyNTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQyOWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYyNzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQxMGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2ZiOTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYwY2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZiYmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2IzNWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5ZmM5ZGZhZmRhMWZjZmZhNCIpKSx6Zz1FZyhzdigiMGQwODg3MTAwNzg4MTMwNzg5MTYwNzhhMTkwNjhjMWIwNjhkMWQwNjhlMjAwNjhmMjIwNjkwMjQwNjkxMjYwNTkxMjgwNTkyMmEwNTkzMmMwNTk0MmUwNTk1MmYwNTk2MzEwNTk3MzMwNTk3MzUwNDk4MzcwNDk5MzgwNDlhM2EwNDlhM2MwNDliM2UwNDljM2YwNDljNDEwNDlkNDMwMzllNDQwMzllNDYwMzlmNDgwMzlmNDkwM2EwNGIwM2ExNGMwMmExNGUwMmEyNTAwMmEyNTEwMmEzNTMwMmEzNTUwMmE0NTYwMWE0NTgwMWE0NTkwMWE1NWIwMWE1NWMwMWE2NWUwMWE2NjAwMWE2NjEwMGE3NjMwMGE3NjQwMGE3NjYwMGE3NjcwMGE4NjkwMGE4NmEwMGE4NmMwMGE4NmUwMGE4NmYwMGE4NzEwMGE4NzIwMWE4NzQwMWE4NzUwMWE4NzcwMWE4NzgwMWE4N2EwMmE4N2IwMmE4N2QwM2E4N2UwM2E4ODAwNGE4ODEwNGE3ODMwNWE3ODQwNWE3ODYwNmE2ODcwN2E2ODgwOGE2OGEwOWE1OGIwYWE1OGQwYmE1OGUwY2E0OGYwZGE0OTEwZWEzOTIwZmEzOTQxMGEyOTUxMWExOTYxM2ExOTgxNGEwOTkxNTlmOWExNjlmOWMxNzllOWQxODlkOWUxOTlkYTAxYTljYTExYjliYTIxZDlhYTMxZTlhYTUxZjk5YTYyMDk4YTcyMTk3YTgyMjk2YWEyMzk1YWIyNDk0YWMyNjk0YWQyNzkzYWUyODkyYjAyOTkxYjEyYTkwYjIyYjhmYjMyYzhlYjQyZThkYjUyZjhjYjYzMDhiYjczMThhYjgzMjg5YmEzMzg4YmIzNDg4YmMzNTg3YmQzNzg2YmUzODg1YmYzOTg0YzAzYTgzYzEzYjgyYzIzYzgxYzMzZDgwYzQzZTdmYzU0MDdlYzY0MTdkYzc0MjdjYzg0MzdiYzk0NDdhY2E0NTdhY2I0Njc5Y2M0Nzc4Y2M0OTc3Y2Q0YTc2Y2U0Yjc1Y2Y0Yzc0ZDA0ZDczZDE0ZTcyZDI0ZjcxZDM1MTcxZDQ1MjcwZDU1MzZmZDU1NDZlZDY1NTZkZDc1NjZjZDg1NzZiZDk1ODZhZGE1YTZhZGE1YjY5ZGI1YzY4ZGM1ZDY3ZGQ1ZTY2ZGU1ZjY1ZGU2MTY0ZGY2MjYzZTA2MzYzZTE2NDYyZTI2NTYxZTI2NjYwZTM2ODVmZTQ2OTVlZTU2YTVkZTU2YjVkZTY2YzVjZTc2ZTViZTc2ZjVhZTg3MDU5ZTk3MTU4ZTk3MjU3ZWE3NDU3ZWI3NTU2ZWI3NjU1ZWM3NzU0ZWQ3OTUzZWQ3YTUyZWU3YjUxZWY3YzUxZWY3ZTUwZjA3ZjRmZjA4MDRlZjE4MTRkZjE4MzRjZjI4NDRiZjM4NTRiZjM4NzRhZjQ4ODQ5ZjQ4OTQ4ZjU4YjQ3ZjU4YzQ2ZjY4ZDQ1ZjY4ZjQ0Zjc5MDQ0Zjc5MTQzZjc5MzQyZjg5NDQxZjg5NTQwZjk5NzNmZjk5ODNlZjk5YTNlZmE5YjNkZmE5YzNjZmE5ZTNiZmI5ZjNhZmJhMTM5ZmJhMjM4ZmNhMzM4ZmNhNTM3ZmNhNjM2ZmNhODM1ZmNhOTM0ZmRhYjMzZmRhYzMzZmRhZTMyZmRhZjMxZmRiMTMwZmRiMjJmZmRiNDJmZmRiNTJlZmViNzJkZmViODJjZmViYTJjZmViYjJiZmViZDJhZmViZTJhZmVjMDI5ZmRjMjI5ZmRjMzI4ZmRjNTI3ZmRjNjI3ZmRjODI3ZmRjYTI2ZmRjYjI2ZmNjZDI1ZmNjZTI1ZmNkMDI1ZmNkMjI1ZmJkMzI0ZmJkNTI0ZmJkNzI0ZmFkODI0ZmFkYTI0ZjlkYzI0ZjlkZDI1ZjhkZjI1ZjhlMTI1ZjdlMjI1ZjdlNDI1ZjZlNjI2ZjZlODI2ZjVlOTI2ZjVlYjI3ZjRlZDI3ZjNlZTI3ZjNmMDI3ZjJmMjI3ZjFmNDI2ZjFmNTI1ZjBmNzI0ZjBmOTIxIikpO2Z1bmN0aW9uIFJnKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgTGc9TWF0aC5hYnMsRGc9TWF0aC5hdGFuMixVZz1NYXRoLmNvcyxxZz1NYXRoLm1heCxPZz1NYXRoLm1pbixZZz1NYXRoLnNpbixCZz1NYXRoLnNxcnQsRmc9MWUtMTIsSWc9TWF0aC5QSSxIZz1JZy8yLGpnPTIqSWc7ZnVuY3Rpb24gWGcodCl7cmV0dXJuIHQ+PTE/SGc6dDw9LTE/LUhnOk1hdGguYXNpbih0KX1mdW5jdGlvbiBHZyh0KXtyZXR1cm4gdC5pbm5lclJhZGl1c31mdW5jdGlvbiBWZyh0KXtyZXR1cm4gdC5vdXRlclJhZGl1c31mdW5jdGlvbiAkZyh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIFdnKHQpe3JldHVybiB0LmVuZEFuZ2xlfWZ1bmN0aW9uIFpnKHQpe3JldHVybiB0JiZ0LnBhZEFuZ2xlfWZ1bmN0aW9uIFFnKHQsbixlLHIsaSxvLGEpe3ZhciB1PXQtZSxmPW4tcixjPShhP286LW8pL0JnKHUqdStmKmYpLHM9YypmLGw9LWMqdSxoPXQrcyxkPW4rbCxwPWUrcyx2PXIrbCxnPShoK3ApLzIseT0oZCt2KS8yLF89cC1oLGI9di1kLG09XypfK2IqYix4PWktbyx3PWgqdi1wKmQsTT0oYjwwPy0xOjEpKkJnKHFnKDAseCp4Km0tdyp3KSksQT0odypiLV8qTSkvbSxUPSgtdypfLWIqTSkvbSxOPSh3KmIrXypNKS9tLFM9KC13Kl8rYipNKS9tLEU9QS1nLGs9VC15LEM9Ti1nLFA9Uy15O3JldHVybiBFKkUrayprPkMqQytQKlAmJihBPU4sVD1TKSx7Y3g6QSxjeTpULHgwMTotcyx5MDE6LWwseDExOkEqKGkveC0xKSx5MTE6VCooaS94LTEpfX1mdW5jdGlvbiBKZyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gS2codCl7cmV0dXJuIG5ldyBKZyh0KX1mdW5jdGlvbiB0eSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBueSh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBleSgpe3ZhciB0PXR5LG49bnksZT1SZyghMCkscj1udWxsLGk9S2csbz1udWxsO2Z1bmN0aW9uIGEoYSl7dmFyIHUsZixjLHM9YS5sZW5ndGgsbD0hMTtmb3IobnVsbD09ciYmKG89aShjPUdpKCkpKSx1PTA7dTw9czsrK3UpISh1PHMmJmUoZj1hW3VdLHUsYSkpPT09bCYmKChsPSFsKT9vLmxpbmVTdGFydCgpOm8ubGluZUVuZCgpKSxsJiZvLnBvaW50KCt0KGYsdSxhKSwrbihmLHUsYSkpO2lmKGMpcmV0dXJuIG89bnVsbCxjKyIifHxudWxsfXJldHVybiBhLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpSZygrbiksYSk6dH0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOm59LGEuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCEhdCksYSk6ZX0sYS5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG51bGwhPXImJihvPWkocikpLGEpOml9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9yPW89bnVsbDpvPWkocj10KSxhKTpyfSxhfWZ1bmN0aW9uIHJ5KCl7dmFyIHQ9dHksbj1udWxsLGU9UmcoMCkscj1ueSxpPVJnKCEwKSxvPW51bGwsYT1LZyx1PW51bGw7ZnVuY3Rpb24gZihmKXt2YXIgYyxzLGwsaCxkLHA9Zi5sZW5ndGgsdj0hMSxnPW5ldyBBcnJheShwKSx5PW5ldyBBcnJheShwKTtmb3IobnVsbD09byYmKHU9YShkPUdpKCkpKSxjPTA7Yzw9cDsrK2Mpe2lmKCEoYzxwJiZpKGg9ZltjXSxjLGYpKT09PXYpaWYodj0hdilzPWMsdS5hcmVhU3RhcnQoKSx1LmxpbmVTdGFydCgpO2Vsc2V7Zm9yKHUubGluZUVuZCgpLHUubGluZVN0YXJ0KCksbD1jLTE7bD49czstLWwpdS5wb2ludChnW2xdLHlbbF0pO3UubGluZUVuZCgpLHUuYXJlYUVuZCgpfXYmJihnW2NdPSt0KGgsYyxmKSx5W2NdPStlKGgsYyxmKSx1LnBvaW50KG4/K24oaCxjLGYpOmdbY10scj8rcihoLGMsZik6eVtjXSkpfWlmKGQpcmV0dXJuIHU9bnVsbCxkKyIifHxudWxsfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZXkoKS5kZWZpbmVkKGkpLmN1cnZlKGEpLmNvbnRleHQobyl9cmV0dXJuIGYueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlJnKCtlKSxuPW51bGwsZik6dH0sZi54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxmKTp0fSxmLngxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpufSxmLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCkscj1udWxsLGYpOmV9LGYueTA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6ZX0sZi55MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT10P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6cn0sZi5saW5lWDA9Zi5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngodCkueShlKX0sZi5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngodCkueShyKX0sZi5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngobikueShlKX0sZi5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoISF0KSxmKTppfSxmLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbnVsbCE9byYmKHU9YShvKSksZik6YX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P289dT1udWxsOnU9YShvPXQpLGYpOm99LGZ9ZnVuY3Rpb24gaXkodCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59ZnVuY3Rpb24gb3kodCl7cmV0dXJuIHR9SmcucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OnRoaXMuX2NvbnRleHQubGluZVRvKHQsbil9fX07dmFyIGF5PWZ5KEtnKTtmdW5jdGlvbiB1eSh0KXt0aGlzLl9jdXJ2ZT10fWZ1bmN0aW9uIGZ5KHQpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG5ldyB1eSh0KG4pKX1yZXR1cm4gbi5fY3VydmU9dCxufWZ1bmN0aW9uIGN5KHQpe3ZhciBuPXQuY3VydmU7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGZ5KHQpKTpuKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIHN5KCl7cmV0dXJuIGN5KGV5KCkuY3VydmUoYXkpKX1mdW5jdGlvbiBseSgpe3ZhciB0PXJ5KCkuY3VydmUoYXkpLG49dC5jdXJ2ZSxlPXQubGluZVgwLHI9dC5saW5lWDEsaT10LmxpbmVZMCxvPXQubGluZVkxO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQuc3RhcnRBbmdsZT10LngwLGRlbGV0ZSB0LngwLHQuZW5kQW5nbGU9dC54MSxkZWxldGUgdC54MSx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmlubmVyUmFkaXVzPXQueTAsZGVsZXRlIHQueTAsdC5vdXRlclJhZGl1cz10LnkxLGRlbGV0ZSB0LnkxLHQubGluZVN0YXJ0QW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gY3koZSgpKX0sZGVsZXRlIHQubGluZVgwLHQubGluZUVuZEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGN5KHIoKSl9LGRlbGV0ZSB0LmxpbmVYMSx0LmxpbmVJbm5lclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBjeShpKCkpfSxkZWxldGUgdC5saW5lWTAsdC5saW5lT3V0ZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gY3kobygpKX0sZGVsZXRlIHQubGluZVkxLHQuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihmeSh0KSk6bigpLl9jdXJ2ZX0sdH1mdW5jdGlvbiBoeSh0LG4pe3JldHVyblsobj0rbikqTWF0aC5jb3ModC09TWF0aC5QSS8yKSxuKk1hdGguc2luKHQpXX11eS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmFyZWFTdGFydCgpfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYUVuZCgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl9jdXJ2ZS5wb2ludChuKk1hdGguc2luKHQpLG4qLU1hdGguY29zKHQpKX19O3ZhciBkeT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gcHkodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIHZ5KHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiBneSh0KXt2YXIgbj1weSxlPXZ5LHI9dHksaT1ueSxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHU9ZHkuY2FsbChhcmd1bWVudHMpLGY9bi5hcHBseSh0aGlzLHUpLGM9ZS5hcHBseSh0aGlzLHUpO2lmKG98fChvPWE9R2koKSksdChvLCtyLmFwcGx5KHRoaXMsKHVbMF09Zix1KSksK2kuYXBwbHkodGhpcyx1KSwrci5hcHBseSh0aGlzLCh1WzBdPWMsdSkpLCtpLmFwcGx5KHRoaXMsdSkpLGEpcmV0dXJuIG89bnVsbCxhKyIifHxudWxsfXJldHVybiBhLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsYSk6ZX0sYS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOnJ9LGEueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTppfSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX1mdW5jdGlvbiB5eSh0LG4sZSxyLGkpe3QubW92ZVRvKG4sZSksdC5iZXppZXJDdXJ2ZVRvKG49KG4rcikvMixlLG4saSxyLGkpfWZ1bmN0aW9uIF95KHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obixlPShlK2kpLzIscixlLHIsaSl9ZnVuY3Rpb24gYnkodCxuLGUscixpKXt2YXIgbz1oeShuLGUpLGE9aHkobixlPShlK2kpLzIpLHU9aHkocixlKSxmPWh5KHIsaSk7dC5tb3ZlVG8ob1swXSxvWzFdKSx0LmJlemllckN1cnZlVG8oYVswXSxhWzFdLHVbMF0sdVsxXSxmWzBdLGZbMV0pfXZhciBteT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL0lnKTt0Lm1vdmVUbyhlLDApLHQuYXJjKDAsMCxlLDAsamcpfX0seHk9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobi81KS8yO3QubW92ZVRvKC0zKmUsLWUpLHQubGluZVRvKC1lLC1lKSx0LmxpbmVUbygtZSwtMyplKSx0LmxpbmVUbyhlLC0zKmUpLHQubGluZVRvKGUsLWUpLHQubGluZVRvKDMqZSwtZSksdC5saW5lVG8oMyplLGUpLHQubGluZVRvKGUsZSksdC5saW5lVG8oZSwzKmUpLHQubGluZVRvKC1lLDMqZSksdC5saW5lVG8oLWUsZSksdC5saW5lVG8oLTMqZSxlKSx0LmNsb3NlUGF0aCgpfX0sd3k9TWF0aC5zcXJ0KDEvMyksTXk9Mip3eSxBeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL015KSxyPWUqd3k7dC5tb3ZlVG8oMCwtZSksdC5saW5lVG8ociwwKSx0LmxpbmVUbygwLGUpLHQubGluZVRvKC1yLDApLHQuY2xvc2VQYXRoKCl9fSxUeT1NYXRoLnNpbihJZy8xMCkvTWF0aC5zaW4oNypJZy8xMCksTnk9TWF0aC5zaW4oamcvMTApKlR5LFN5PS1NYXRoLmNvcyhqZy8xMCkqVHksRXk9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQoLjg5MDgxMzA5MTUyOTI4NTIqbikscj1OeSplLGk9U3kqZTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLGkpO2Zvcih2YXIgbz0xO288NTsrK28pe3ZhciBhPWpnKm8vNSx1PU1hdGguY29zKGEpLGY9TWF0aC5zaW4oYSk7dC5saW5lVG8oZiplLC11KmUpLHQubGluZVRvKHUqci1mKmksZipyK3UqaSl9dC5jbG9zZVBhdGgoKX19LGt5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4pLHI9LWUvMjt0LnJlY3QocixyLGUsZSl9fSxDeT1NYXRoLnNxcnQoMyksUHk9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT0tTWF0aC5zcXJ0KG4vKDMqQ3kpKTt0Lm1vdmVUbygwLDIqZSksdC5saW5lVG8oLUN5KmUsLWUpLHQubGluZVRvKEN5KmUsLWUpLHQuY2xvc2VQYXRoKCl9fSx6eT1NYXRoLnNxcnQoMykvMixSeT0xL01hdGguc3FydCgxMiksTHk9MyooUnkvMisxKSxEeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL0x5KSxyPWUvMixpPWUqUnksbz1yLGE9ZSpSeStlLHU9LW8sZj1hO3QubW92ZVRvKHIsaSksdC5saW5lVG8obyxhKSx0LmxpbmVUbyh1LGYpLHQubGluZVRvKC0uNSpyLXp5KmksenkqcistLjUqaSksdC5saW5lVG8oLS41Km8tenkqYSx6eSpvKy0uNSphKSx0LmxpbmVUbygtLjUqdS16eSpmLHp5KnUrLS41KmYpLHQubGluZVRvKC0uNSpyK3p5KmksLS41KmktenkqciksdC5saW5lVG8oLS41Km8renkqYSwtLjUqYS16eSpvKSx0LmxpbmVUbygtLjUqdSt6eSpmLC0uNSpmLXp5KnUpLHQuY2xvc2VQYXRoKCl9fSxVeT1bbXkseHksQXksa3ksRXksUHksRHldO2Z1bmN0aW9uIHF5KCl7fWZ1bmN0aW9uIE95KHQsbixlKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oKDIqdC5feDArdC5feDEpLzMsKDIqdC5feTArdC5feTEpLzMsKHQuX3gwKzIqdC5feDEpLzMsKHQuX3kwKzIqdC5feTEpLzMsKHQuX3gwKzQqdC5feDErbikvNiwodC5feTArNCp0Ll95MStlKS82KX1mdW5jdGlvbiBZeSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gQnkodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEZ5KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBJeSh0LG4pe3RoaXMuX2Jhc2lzPW5ldyBZeSh0KSx0aGlzLl9iZXRhPW59WXkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMzpPeSh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKTtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9jb250ZXh0LmxpbmVUbygoNSp0aGlzLl94MCt0aGlzLl94MSkvNiwoNSp0aGlzLl95MCt0aGlzLl95MSkvNik7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sQnkucHJvdG90eXBlPXthcmVhU3RhcnQ6cXksYXJlYUVuZDpxeSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMjp0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDIrMip0aGlzLl94MykvMywodGhpcy5feTIrMip0aGlzLl95MykvMyksdGhpcy5fY29udGV4dC5saW5lVG8oKHRoaXMuX3gzKzIqdGhpcy5feDIpLzMsKHRoaXMuX3kzKzIqdGhpcy5feTIpLzMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpLHRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mj10LHRoaXMuX3kyPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g0PXQsdGhpcy5feTQ9bix0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDArNCp0aGlzLl94MSt0KS82LCh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzYpO2JyZWFrO2RlZmF1bHQ6T3kodGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19LEZ5LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO3ZhciBlPSh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYscj0odGhpcy5feTArNCp0aGlzLl95MStuKS82O3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8oZSxyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyhlLHIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6T3kodGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19LEl5LnByb3RvdHlwZT17bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdLHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aC0xO2lmKGU+MClmb3IodmFyIHIsaT10WzBdLG89blswXSxhPXRbZV0taSx1PW5bZV0tbyxmPS0xOysrZjw9ZTspcj1mL2UsdGhpcy5fYmFzaXMucG9pbnQodGhpcy5fYmV0YSp0W2ZdKygxLXRoaXMuX2JldGEpKihpK3IqYSksdGhpcy5fYmV0YSpuW2ZdKygxLXRoaXMuX2JldGEpKihvK3IqdSkpO3RoaXMuX3g9dGhpcy5feT1udWxsLHRoaXMuX2Jhc2lzLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl94LnB1c2goK3QpLHRoaXMuX3kucHVzaCgrbil9fTt2YXIgSHk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxPT09bj9uZXcgWXkodCk6bmV3IEl5KHQsbil9cmV0dXJuIGUuYmV0YT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC44NSk7ZnVuY3Rpb24gankodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh0Ll94MSt0Ll9rKih0Ll94Mi10Ll94MCksdC5feTErdC5fayoodC5feTItdC5feTApLHQuX3gyK3QuX2sqKHQuX3gxLW4pLHQuX3kyK3QuX2sqKHQuX3kxLWUpLHQuX3gyLHQuX3kyKX1mdW5jdGlvbiBYeSh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9WHkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOmp5KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94MT10LHRoaXMuX3kxPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEd5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFh5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFZ5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1WeS5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6ankodGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciAkeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBWeSh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtmdW5jdGlvbiBXeSh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9V3kucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6ankodGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBaeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBXeSh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtmdW5jdGlvbiBReSh0LG4sZSl7dmFyIHI9dC5feDEsaT10Ll95MSxvPXQuX3gyLGE9dC5feTI7aWYodC5fbDAxX2E+Rmcpe3ZhciB1PTIqdC5fbDAxXzJhKzMqdC5fbDAxX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGY9Myp0Ll9sMDFfYSoodC5fbDAxX2ErdC5fbDEyX2EpO3I9KHIqdS10Ll94MCp0Ll9sMTJfMmErdC5feDIqdC5fbDAxXzJhKS9mLGk9KGkqdS10Ll95MCp0Ll9sMTJfMmErdC5feTIqdC5fbDAxXzJhKS9mfWlmKHQuX2wyM19hPkZnKXt2YXIgYz0yKnQuX2wyM18yYSszKnQuX2wyM19hKnQuX2wxMl9hK3QuX2wxMl8yYSxzPTMqdC5fbDIzX2EqKHQuX2wyM19hK3QuX2wxMl9hKTtvPShvKmMrdC5feDEqdC5fbDIzXzJhLW4qdC5fbDEyXzJhKS9zLGE9KGEqYyt0Ll95MSp0Ll9sMjNfMmEtZSp0Ll9sMTJfMmEpL3N9dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIsaSxvLGEsdC5feDIsdC5feTIpfWZ1bmN0aW9uIEp5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59SnkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpReSh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBLeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IEp5KHQsbik6bmV3IFh5KHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7ZnVuY3Rpb24gdF8odCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn10Xy5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gzPXQsdGhpcy5feTM9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND10LHRoaXMuX3k0PW4pO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g1PXQsdGhpcy5feTU9bjticmVhaztkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIG5fPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgdF8odCxuKTpuZXcgVnkodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBlXyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufWVfLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpReSh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciByXz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IGVfKHQsbik6bmV3IFd5KHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7ZnVuY3Rpb24gaV8odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIG9fKHQpe3JldHVybiB0PDA/LTE6MX1mdW5jdGlvbiBhXyh0LG4sZSl7dmFyIHI9dC5feDEtdC5feDAsaT1uLXQuX3gxLG89KHQuX3kxLXQuX3kwKS8ocnx8aTwwJiYtMCksYT0oZS10Ll95MSkvKGl8fHI8MCYmLTApLHU9KG8qaSthKnIpLyhyK2kpO3JldHVybihvXyhvKStvXyhhKSkqTWF0aC5taW4oTWF0aC5hYnMobyksTWF0aC5hYnMoYSksLjUqTWF0aC5hYnModSkpfHwwfWZ1bmN0aW9uIHVfKHQsbil7dmFyIGU9dC5feDEtdC5feDA7cmV0dXJuIGU/KDMqKHQuX3kxLXQuX3kwKS9lLW4pLzI6bn1mdW5jdGlvbiBmXyh0LG4sZSl7dmFyIHI9dC5feDAsaT10Ll95MCxvPXQuX3gxLGE9dC5feTEsdT0oby1yKS8zO3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyK3UsaSt1Km4sby11LGEtdSplLG8sYSl9ZnVuY3Rpb24gY18odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHNfKHQpe3RoaXMuX2NvbnRleHQ9bmV3IGxfKHQpfWZ1bmN0aW9uIGxfKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBoXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gZF8odCl7dmFyIG4sZSxyPXQubGVuZ3RoLTEsaT1uZXcgQXJyYXkociksbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkocik7Zm9yKGlbMF09MCxvWzBdPTIsYVswXT10WzBdKzIqdFsxXSxuPTE7bjxyLTE7KytuKWlbbl09MSxvW25dPTQsYVtuXT00KnRbbl0rMip0W24rMV07Zm9yKGlbci0xXT0yLG9bci0xXT03LGFbci0xXT04KnRbci0xXSt0W3JdLG49MTtuPHI7KytuKWU9aVtuXS9vW24tMV0sb1tuXS09ZSxhW25dLT1lKmFbbi0xXTtmb3IoaVtyLTFdPWFbci0xXS9vW3ItMV0sbj1yLTI7bj49MDstLW4paVtuXT0oYVtuXS1pW24rMV0pL29bbl07Zm9yKG9bci0xXT0odFtyXStpW3ItMV0pLzIsbj0wO248ci0xOysrbilvW25dPTIqdFtuKzFdLWlbbisxXTtyZXR1cm5baSxvXX1mdW5jdGlvbiBwXyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl90PW59ZnVuY3Rpb24gdl8odCxuKXtpZigoaT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG89MSxhPXRbblswXV0sdT1hLmxlbmd0aDtvPGk7KytvKWZvcihyPWEsYT10W25bb11dLGU9MDtlPHU7KytlKWFbZV1bMV0rPWFbZV1bMF09aXNOYU4ocltlXVsxXSk/cltlXVswXTpyW2VdWzFdfWZ1bmN0aW9uIGdfKHQpe2Zvcih2YXIgbj10Lmxlbmd0aCxlPW5ldyBBcnJheShuKTstLW4+PTA7KWVbbl09bjtyZXR1cm4gZX1mdW5jdGlvbiB5Xyh0LG4pe3JldHVybiB0W25dfWZ1bmN0aW9uIF9fKHQpe3ZhciBuPXQubWFwKGJfKTtyZXR1cm4gZ18odCkuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBuW3RdLW5bZV19KX1mdW5jdGlvbiBiXyh0KXtmb3IodmFyIG4sZT0wLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspKG49K3Rbcl1bMV0pJiYoZSs9bik7cmV0dXJuIGV9ZnVuY3Rpb24gbV8odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHhfKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIHdfKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIE1fKCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24gQV8odCl7dC5VPXQuQz10Lkw9dC5SPXQuUD10Lk49bnVsbH1mdW5jdGlvbiBUXyh0LG4pe3ZhciBlPW4scj1uLlIsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuUj1yLkwsZS5SJiYoZS5SLlU9ZSksci5MPWV9ZnVuY3Rpb24gTl8odCxuKXt2YXIgZT1uLHI9bi5MLGk9ZS5VO2k/aS5MPT09ZT9pLkw9cjppLlI9cjp0Ll89cixyLlU9aSxlLlU9cixlLkw9ci5SLGUuTCYmKGUuTC5VPWUpLHIuUj1lfWZ1bmN0aW9uIFNfKHQpe2Zvcig7dC5MOyl0PXQuTDtyZXR1cm4gdH1mdW5jdGlvbiBFXyh0LG4sZSxyKXt2YXIgaT1bbnVsbCxudWxsXSxvPUpfLnB1c2goaSktMTtyZXR1cm4gaS5sZWZ0PXQsaS5yaWdodD1uLGUmJkNfKGksdCxuLGUpLHImJkNfKGksbix0LHIpLFpfW3QuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLFpfW24uaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLGl9ZnVuY3Rpb24ga18odCxuLGUpe3ZhciByPVtuLGVdO3JldHVybiByLmxlZnQ9dCxyfWZ1bmN0aW9uIENfKHQsbixlLHIpe3RbMF18fHRbMV0/dC5sZWZ0PT09ZT90WzFdPXI6dFswXT1yOih0WzBdPXIsdC5sZWZ0PW4sdC5yaWdodD1lKX1mdW5jdGlvbiBQXyh0LG4sZSxyLGkpe3ZhciBvLGE9dFswXSx1PXRbMV0sZj1hWzBdLGM9YVsxXSxzPTAsbD0xLGg9dVswXS1mLGQ9dVsxXS1jO2lmKG89bi1mLGh8fCEobz4wKSl7aWYoby89aCxoPDApe2lmKG88cylyZXR1cm47bzxsJiYobD1vKX1lbHNlIGlmKGg+MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWlmKG89ci1mLGh8fCEobzwwKSl7aWYoby89aCxoPDApe2lmKG8+bClyZXR1cm47bz5zJiYocz1vKX1lbHNlIGlmKGg+MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWlmKG89ZS1jLGR8fCEobz4wKSl7aWYoby89ZCxkPDApe2lmKG88cylyZXR1cm47bzxsJiYobD1vKX1lbHNlIGlmKGQ+MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWlmKG89aS1jLGR8fCEobzwwKSl7aWYoby89ZCxkPDApe2lmKG8+bClyZXR1cm47bz5zJiYocz1vKX1lbHNlIGlmKGQ+MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfXJldHVybiEocz4wfHxsPDEpfHwocz4wJiYodFswXT1bZitzKmgsYytzKmRdKSxsPDEmJih0WzFdPVtmK2wqaCxjK2wqZF0pLCEwKX19fX19ZnVuY3Rpb24gel8odCxuLGUscixpKXt2YXIgbz10WzFdO2lmKG8pcmV0dXJuITA7dmFyIGEsdSxmPXRbMF0sYz10LmxlZnQscz10LnJpZ2h0LGw9Y1swXSxoPWNbMV0sZD1zWzBdLHA9c1sxXSx2PShsK2QpLzIsZz0oaCtwKS8yO2lmKHA9PT1oKXtpZih2PG58fHY+PXIpcmV0dXJuO2lmKGw+ZCl7aWYoZil7aWYoZlsxXT49aSlyZXR1cm59ZWxzZSBmPVt2LGVdO289W3YsaV19ZWxzZXtpZihmKXtpZihmWzFdPGUpcmV0dXJufWVsc2UgZj1bdixpXTtvPVt2LGVdfX1lbHNlIGlmKHU9Zy0oYT0obC1kKS8ocC1oKSkqdixhPC0xfHxhPjEpaWYobD5kKXtpZihmKXtpZihmWzFdPj1pKXJldHVybn1lbHNlIGY9WyhlLXUpL2EsZV07bz1bKGktdSkvYSxpXX1lbHNle2lmKGYpe2lmKGZbMV08ZSlyZXR1cm59ZWxzZSBmPVsoaS11KS9hLGldO289WyhlLXUpL2EsZV19ZWxzZSBpZihoPHApe2lmKGYpe2lmKGZbMF0+PXIpcmV0dXJufWVsc2UgZj1bbixhKm4rdV07bz1bcixhKnIrdV19ZWxzZXtpZihmKXtpZihmWzBdPG4pcmV0dXJufWVsc2UgZj1bcixhKnIrdV07bz1bbixhKm4rdV19cmV0dXJuIHRbMF09Zix0WzFdPW8sITB9ZnVuY3Rpb24gUl8odCxuKXt2YXIgZT10LnNpdGUscj1uLmxlZnQsaT1uLnJpZ2h0O3JldHVybiBlPT09aSYmKGk9cixyPWUpLGk/TWF0aC5hdGFuMihpWzFdLXJbMV0saVswXS1yWzBdKTooZT09PXI/KHI9blsxXSxpPW5bMF0pOihyPW5bMF0saT1uWzFdKSxNYXRoLmF0YW4yKHJbMF0taVswXSxpWzFdLXJbMV0pKX1mdW5jdGlvbiBMXyh0LG4pe3JldHVybiBuWysobi5sZWZ0IT09dC5zaXRlKV19ZnVuY3Rpb24gRF8odCxuKXtyZXR1cm4gblsrKG4ubGVmdD09PXQuc2l0ZSldfWlfLnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX3BvaW50JiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3Q9K3Qsbj0rbix0aGlzLl9wb2ludD90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOih0aGlzLl9wb2ludD0xLHRoaXMuX2NvbnRleHQubW92ZVRvKHQsbikpfX0sY18ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5fdDA9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSk7YnJlYWs7Y2FzZSAzOmZfKHRoaXMsdGhpcy5fdDAsdV8odGhpcyx0aGlzLl90MCkpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt2YXIgZT1OYU47aWYobj0rbiwodD0rdCkhPT10aGlzLl94MXx8biE9PXRoaXMuX3kxKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLGZfKHRoaXMsdV8odGhpcyxlPWFfKHRoaXMsdCxuKSksZSk7YnJlYWs7ZGVmYXVsdDpmXyh0aGlzLHRoaXMuX3QwLGU9YV8odGhpcyx0LG4pKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW4sdGhpcy5fdDA9ZX19fSwoc18ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoY18ucHJvdG90eXBlKSkucG9pbnQ9ZnVuY3Rpb24odCxuKXtjXy5wcm90b3R5cGUucG9pbnQuY2FsbCh0aGlzLG4sdCl9LGxfLnByb3RvdHlwZT17bW92ZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fY29udGV4dC5tb3ZlVG8obix0KX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fY29udGV4dC5saW5lVG8obix0KX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKG4sdCxyLGUsbyxpKX19LGhfLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9W10sdGhpcy5feT1bXX0sbGluZUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3gsbj10aGlzLl95LGU9dC5sZW5ndGg7aWYoZSlpZih0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRbMF0sblswXSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odFswXSxuWzBdKSwyPT09ZSl0aGlzLl9jb250ZXh0LmxpbmVUbyh0WzFdLG5bMV0pO2Vsc2UgZm9yKHZhciByPWRfKHQpLGk9ZF8obiksbz0wLGE9MTthPGU7KytvLCsrYSl0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oclswXVtvXSxpWzBdW29dLHJbMV1bb10saVsxXVtvXSx0W2FdLG5bYV0pOyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PWUpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lLHRoaXMuX3g9dGhpcy5feT1udWxsfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19LHBfLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9dGhpcy5feT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA8dGhpcy5fdCYmdGhpcy5fdDwxJiYyPT09dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsdGhpcy5feSksKHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU+PTAmJih0aGlzLl90PTEtdGhpcy5fdCx0aGlzLl9saW5lPTEtdGhpcy5fbGluZSl9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDppZih0aGlzLl90PD0wKXRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsbiksdGhpcy5fY29udGV4dC5saW5lVG8odCxuKTtlbHNle3ZhciBlPXRoaXMuX3gqKDEtdGhpcy5fdCkrdCp0aGlzLl90O3RoaXMuX2NvbnRleHQubGluZVRvKGUsdGhpcy5feSksdGhpcy5fY29udGV4dC5saW5lVG8oZSxuKX19dGhpcy5feD10LHRoaXMuX3k9bn19LE1fLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TV8saW5zZXJ0OmZ1bmN0aW9uKHQsbil7dmFyIGUscixpO2lmKHQpe2lmKG4uUD10LG4uTj10Lk4sdC5OJiYodC5OLlA9biksdC5OPW4sdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9bn1lbHNlIHQuUj1uO2U9dH1lbHNlIHRoaXMuXz8odD1TXyh0aGlzLl8pLG4uUD1udWxsLG4uTj10LHQuUD10Lkw9bixlPXQpOihuLlA9bi5OPW51bGwsdGhpcy5fPW4sZT1udWxsKTtmb3Iobi5MPW4uUj1udWxsLG4uVT1lLG4uQz0hMCx0PW47ZSYmZS5DOyllPT09KHI9ZS5VKS5MPyhpPXIuUikmJmkuQz8oZS5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PWUuUiYmKFRfKHRoaXMsZSksZT0odD1lKS5VKSxlLkM9ITEsci5DPSEwLE5fKHRoaXMscikpOihpPXIuTCkmJmkuQz8oZS5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PWUuTCYmKE5fKHRoaXMsZSksZT0odD1lKS5VKSxlLkM9ITEsci5DPSEwLFRfKHRoaXMscikpLGU9dC5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24odCl7dC5OJiYodC5OLlA9dC5QKSx0LlAmJih0LlAuTj10Lk4pLHQuTj10LlA9bnVsbDt2YXIgbixlLHIsaT10LlUsbz10LkwsYT10LlI7aWYoZT1vP2E/U18oYSk6bzphLGk/aS5MPT09dD9pLkw9ZTppLlI9ZTp0aGlzLl89ZSxvJiZhPyhyPWUuQyxlLkM9dC5DLGUuTD1vLG8uVT1lLGUhPT1hPyhpPWUuVSxlLlU9dC5VLHQ9ZS5SLGkuTD10LGUuUj1hLGEuVT1lKTooZS5VPWksaT1lLHQ9ZS5SKSk6KHI9dC5DLHQ9ZSksdCYmKHQuVT1pKSwhcilpZih0JiZ0LkMpdC5DPSExO2Vsc2V7ZG97aWYodD09PXRoaXMuXylicmVhaztpZih0PT09aS5MKXtpZigobj1pLlIpLkMmJihuLkM9ITEsaS5DPSEwLFRfKHRoaXMsaSksbj1pLlIpLG4uTCYmbi5MLkN8fG4uUiYmbi5SLkMpe24uUiYmbi5SLkN8fChuLkwuQz0hMSxuLkM9ITAsTl8odGhpcyxuKSxuPWkuUiksbi5DPWkuQyxpLkM9bi5SLkM9ITEsVF8odGhpcyxpKSx0PXRoaXMuXzticmVha319ZWxzZSBpZigobj1pLkwpLkMmJihuLkM9ITEsaS5DPSEwLE5fKHRoaXMsaSksbj1pLkwpLG4uTCYmbi5MLkN8fG4uUiYmbi5SLkMpe24uTCYmbi5MLkN8fChuLlIuQz0hMSxuLkM9ITAsVF8odGhpcyxuKSxuPWkuTCksbi5DPWkuQyxpLkM9bi5MLkM9ITEsTl8odGhpcyxpKSx0PXRoaXMuXzticmVha31uLkM9ITAsdD1pLGk9aS5VfXdoaWxlKCF0LkMpO3QmJih0LkM9ITEpfX19O3ZhciBVXyxxXz1bXTtmdW5jdGlvbiBPXygpe0FfKHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBZXyh0KXt2YXIgbj10LlAsZT10Lk47aWYobiYmZSl7dmFyIHI9bi5zaXRlLGk9dC5zaXRlLG89ZS5zaXRlO2lmKHIhPT1vKXt2YXIgYT1pWzBdLHU9aVsxXSxmPXJbMF0tYSxjPXJbMV0tdSxzPW9bMF0tYSxsPW9bMV0tdSxoPTIqKGYqbC1jKnMpO2lmKCEoaD49LXRiKSl7dmFyIGQ9ZipmK2MqYyxwPXMqcytsKmwsdj0obCpkLWMqcCkvaCxnPShmKnAtcypkKS9oLHk9cV8ucG9wKCl8fG5ldyBPXzt5LmFyYz10LHkuc2l0ZT1pLHkueD12K2EseS55PSh5LmN5PWcrdSkrTWF0aC5zcXJ0KHYqditnKmcpLHQuY2lyY2xlPXk7Zm9yKHZhciBfPW51bGwsYj1RXy5fO2I7KWlmKHkueTxiLnl8fHkueT09PWIueSYmeS54PD1iLngpe2lmKCFiLkwpe189Yi5QO2JyZWFrfWI9Yi5MfWVsc2V7aWYoIWIuUil7Xz1iO2JyZWFrfWI9Yi5SfVFfLmluc2VydChfLHkpLF98fChVXz15KX19fX1mdW5jdGlvbiBCXyh0KXt2YXIgbj10LmNpcmNsZTtuJiYobi5QfHwoVV89bi5OKSxRXy5yZW1vdmUobikscV8ucHVzaChuKSxBXyhuKSx0LmNpcmNsZT1udWxsKX12YXIgRl89W107ZnVuY3Rpb24gSV8oKXtBXyh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gSF8odCl7dmFyIG49Rl8ucG9wKCl8fG5ldyBJXztyZXR1cm4gbi5zaXRlPXQsbn1mdW5jdGlvbiBqXyh0KXtCXyh0KSxXXy5yZW1vdmUodCksRl8ucHVzaCh0KSxBXyh0KX1mdW5jdGlvbiBYXyh0KXt2YXIgbj10LmNpcmNsZSxlPW4ueCxyPW4uY3ksaT1bZSxyXSxvPXQuUCxhPXQuTix1PVt0XTtqXyh0KTtmb3IodmFyIGY9bztmLmNpcmNsZSYmTWF0aC5hYnMoZS1mLmNpcmNsZS54KTxLXyYmTWF0aC5hYnMoci1mLmNpcmNsZS5jeSk8S187KW89Zi5QLHUudW5zaGlmdChmKSxqXyhmKSxmPW87dS51bnNoaWZ0KGYpLEJfKGYpO2Zvcih2YXIgYz1hO2MuY2lyY2xlJiZNYXRoLmFicyhlLWMuY2lyY2xlLngpPEtfJiZNYXRoLmFicyhyLWMuY2lyY2xlLmN5KTxLXzspYT1jLk4sdS5wdXNoKGMpLGpfKGMpLGM9YTt1LnB1c2goYyksQl8oYyk7dmFyIHMsbD11Lmxlbmd0aDtmb3Iocz0xO3M8bDsrK3MpYz11W3NdLGY9dVtzLTFdLENfKGMuZWRnZSxmLnNpdGUsYy5zaXRlLGkpO2Y9dVswXSwoYz11W2wtMV0pLmVkZ2U9RV8oZi5zaXRlLGMuc2l0ZSxudWxsLGkpLFlfKGYpLFlfKGMpfWZ1bmN0aW9uIEdfKHQpe2Zvcih2YXIgbixlLHIsaSxvPXRbMF0sYT10WzFdLHU9V18uXzt1OylpZigocj1WXyh1LGEpLW8pPktfKXU9dS5MO2Vsc2V7aWYoISgoaT1vLSRfKHUsYSkpPktfKSl7cj4tS18/KG49dS5QLGU9dSk6aT4tS18/KG49dSxlPXUuTik6bj1lPXU7YnJlYWt9aWYoIXUuUil7bj11O2JyZWFrfXU9dS5SfSFmdW5jdGlvbih0KXtaX1t0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19KHQpO3ZhciBmPUhfKHQpO2lmKFdfLmluc2VydChuLGYpLG58fGUpe2lmKG49PT1lKXJldHVybiBCXyhuKSxlPUhfKG4uc2l0ZSksV18uaW5zZXJ0KGYsZSksZi5lZGdlPWUuZWRnZT1FXyhuLnNpdGUsZi5zaXRlKSxZXyhuKSx2b2lkIFlfKGUpO2lmKGUpe0JfKG4pLEJfKGUpO3ZhciBjPW4uc2l0ZSxzPWNbMF0sbD1jWzFdLGg9dFswXS1zLGQ9dFsxXS1sLHA9ZS5zaXRlLHY9cFswXS1zLGc9cFsxXS1sLHk9MiooaCpnLWQqdiksXz1oKmgrZCpkLGI9dip2K2cqZyxtPVsoZypfLWQqYikveStzLChoKmItdipfKS95K2xdO0NfKGUuZWRnZSxjLHAsbSksZi5lZGdlPUVfKGMsdCxudWxsLG0pLGUuZWRnZT1FXyh0LHAsbnVsbCxtKSxZXyhuKSxZXyhlKX1lbHNlIGYuZWRnZT1FXyhuLnNpdGUsZi5zaXRlKX19ZnVuY3Rpb24gVl8odCxuKXt2YXIgZT10LnNpdGUscj1lWzBdLGk9ZVsxXSxvPWktbjtpZighbylyZXR1cm4gcjt2YXIgYT10LlA7aWYoIWEpcmV0dXJuLTEvMDt2YXIgdT0oZT1hLnNpdGUpWzBdLGY9ZVsxXSxjPWYtbjtpZighYylyZXR1cm4gdTt2YXIgcz11LXIsbD0xL28tMS9jLGg9cy9jO3JldHVybiBsPygtaCtNYXRoLnNxcnQoaCpoLTIqbCoocypzLygtMipjKS1mK2MvMitpLW8vMikpKS9sK3I6KHIrdSkvMn1mdW5jdGlvbiAkXyh0LG4pe3ZhciBlPXQuTjtpZihlKXJldHVybiBWXyhlLG4pO3ZhciByPXQuc2l0ZTtyZXR1cm4gclsxXT09PW4/clswXToxLzB9dmFyIFdfLFpfLFFfLEpfLEtfPTFlLTYsdGI9MWUtMTI7ZnVuY3Rpb24gbmIodCxuKXtyZXR1cm4gblsxXS10WzFdfHxuWzBdLXRbMF19ZnVuY3Rpb24gZWIodCxuKXt2YXIgZSxyLGksbz10LnNvcnQobmIpLnBvcCgpO2ZvcihKXz1bXSxaXz1uZXcgQXJyYXkodC5sZW5ndGgpLFdfPW5ldyBNXyxRXz1uZXcgTV87OylpZihpPVVfLG8mJighaXx8b1sxXTxpLnl8fG9bMV09PT1pLnkmJm9bMF08aS54KSlvWzBdPT09ZSYmb1sxXT09PXJ8fChHXyhvKSxlPW9bMF0scj1vWzFdKSxvPXQucG9wKCk7ZWxzZXtpZighaSlicmVhaztYXyhpLmFyYyl9aWYoZnVuY3Rpb24oKXtmb3IodmFyIHQsbixlLHIsaT0wLG89Wl8ubGVuZ3RoO2k8bzsrK2kpaWYoKHQ9Wl9baV0pJiYocj0obj10LmhhbGZlZGdlcykubGVuZ3RoKSl7dmFyIGE9bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxyOysrZSlhW2VdPWUsdVtlXT1SXyh0LEpfW25bZV1dKTtmb3IoYS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHVbbl0tdVt0XX0pLGU9MDtlPHI7KytlKXVbZV09blthW2VdXTtmb3IoZT0wO2U8cjsrK2UpbltlXT11W2VdfX0oKSxuKXt2YXIgYT0rblswXVswXSx1PStuWzBdWzFdLGY9K25bMV1bMF0sYz0rblsxXVsxXTshZnVuY3Rpb24odCxuLGUscil7Zm9yKHZhciBpLG89Sl8ubGVuZ3RoO28tLTspel8oaT1KX1tvXSx0LG4sZSxyKSYmUF8oaSx0LG4sZSxyKSYmKE1hdGguYWJzKGlbMF1bMF0taVsxXVswXSk+S198fE1hdGguYWJzKGlbMF1bMV0taVsxXVsxXSk+S18pfHxkZWxldGUgSl9bb119KGEsdSxmLGMpLGZ1bmN0aW9uKHQsbixlLHIpe3ZhciBpLG8sYSx1LGYsYyxzLGwsaCxkLHAsdixnPVpfLmxlbmd0aCx5PSEwO2ZvcihpPTA7aTxnOysraSlpZihvPVpfW2ldKXtmb3IoYT1vLnNpdGUsdT0oZj1vLmhhbGZlZGdlcykubGVuZ3RoO3UtLTspSl9bZlt1XV18fGYuc3BsaWNlKHUsMSk7Zm9yKHU9MCxjPWYubGVuZ3RoO3U8YzspcD0oZD1EXyhvLEpfW2ZbdV1dKSlbMF0sdj1kWzFdLGw9KHM9TF8obyxKX1tmWysrdSVjXV0pKVswXSxoPXNbMV0sKE1hdGguYWJzKHAtbCk+S198fE1hdGguYWJzKHYtaCk+S18pJiYoZi5zcGxpY2UodSwwLEpfLnB1c2goa18oYSxkLE1hdGguYWJzKHAtdCk8S18mJnItdj5LXz9bdCxNYXRoLmFicyhsLXQpPEtfP2g6cl06TWF0aC5hYnModi1yKTxLXyYmZS1wPktfP1tNYXRoLmFicyhoLXIpPEtfP2w6ZSxyXTpNYXRoLmFicyhwLWUpPEtfJiZ2LW4+S18/W2UsTWF0aC5hYnMobC1lKTxLXz9oOm5dOk1hdGguYWJzKHYtbik8S18mJnAtdD5LXz9bTWF0aC5hYnMoaC1uKTxLXz9sOnQsbl06bnVsbCkpLTEpLCsrYyk7YyYmKHk9ITEpfWlmKHkpe3ZhciBfLGIsbSx4PTEvMDtmb3IoaT0wLHk9bnVsbDtpPGc7KytpKShvPVpfW2ldKSYmKG09KF89KGE9by5zaXRlKVswXS10KSpfKyhiPWFbMV0tbikqYik8eCYmKHg9bSx5PW8pO2lmKHkpe3ZhciB3PVt0LG5dLE09W3Qscl0sQT1bZSxyXSxUPVtlLG5dO3kuaGFsZmVkZ2VzLnB1c2goSl8ucHVzaChrXyhhPXkuc2l0ZSx3LE0pKS0xLEpfLnB1c2goa18oYSxNLEEpKS0xLEpfLnB1c2goa18oYSxBLFQpKS0xLEpfLnB1c2goa18oYSxULHcpKS0xKX19Zm9yKGk9MDtpPGc7KytpKShvPVpfW2ldKSYmKG8uaGFsZmVkZ2VzLmxlbmd0aHx8ZGVsZXRlIFpfW2ldKX0oYSx1LGYsYyl9dGhpcy5lZGdlcz1KXyx0aGlzLmNlbGxzPVpfLFdfPVFfPUpfPVpfPW51bGx9ZnVuY3Rpb24gcmIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIGliKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMudHJhbnNmb3JtPWV9ZnVuY3Rpb24gb2IodCxuLGUpe3RoaXMuaz10LHRoaXMueD1uLHRoaXMueT1lfWViLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZWIscG9seWdvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLm1hcChmdW5jdGlvbihuKXt2YXIgZT1uLmhhbGZlZGdlcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIExfKG4sdFtlXSl9KTtyZXR1cm4gZS5kYXRhPW4uc2l0ZS5kYXRhLGV9KX0sdHJpYW5nbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9W10sbj10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oZSxyKXtpZihvPShpPWUuaGFsZmVkZ2VzKS5sZW5ndGgpZm9yKHZhciBpLG8sYSx1LGYsYyxzPWUuc2l0ZSxsPS0xLGg9bltpW28tMV1dLGQ9aC5sZWZ0PT09cz9oLnJpZ2h0OmgubGVmdDsrK2w8bzspYT1kLGQ9KGg9bltpW2xdXSkubGVmdD09PXM/aC5yaWdodDpoLmxlZnQsYSYmZCYmcjxhLmluZGV4JiZyPGQuaW5kZXgmJihmPWEsYz1kLCgodT1zKVswXS1jWzBdKSooZlsxXS11WzFdKS0odVswXS1mWzBdKSooY1sxXS11WzFdKTwwKSYmdC5wdXNoKFtzLmRhdGEsYS5kYXRhLGQuZGF0YV0pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQucmlnaHR9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTp0LmxlZnQuZGF0YSx0YXJnZXQ6dC5yaWdodC5kYXRhfX0pfSxmaW5kOmZ1bmN0aW9uKHQsbixlKXtmb3IodmFyIHIsaSxvPXRoaXMsYT1vLl9mb3VuZHx8MCx1PW8uY2VsbHMubGVuZ3RoOyEoaT1vLmNlbGxzW2FdKTspaWYoKythPj11KXJldHVybiBudWxsO3ZhciBmPXQtaS5zaXRlWzBdLGM9bi1pLnNpdGVbMV0scz1mKmYrYypjO2Rve2k9by5jZWxsc1tyPWFdLGE9bnVsbCxpLmhhbGZlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciByPW8uZWRnZXNbZV0sdT1yLmxlZnQ7aWYodSE9PWkuc2l0ZSYmdXx8KHU9ci5yaWdodCkpe3ZhciBmPXQtdVswXSxjPW4tdVsxXSxsPWYqZitjKmM7bDxzJiYocz1sLGE9dS5pbmRleCl9fSl9d2hpbGUobnVsbCE9PWEpO3JldHVybiBvLl9mb3VuZD1yLG51bGw9PWV8fHM8PWUqZT9pLnNpdGU6bnVsbH19LG9iLnByb3RvdHlwZT17Y29uc3RydWN0b3I6b2Isc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10P3RoaXM6bmV3IG9iKHRoaXMuayp0LHRoaXMueCx0aGlzLnkpfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gMD09PXQmMD09PW4/dGhpczpuZXcgb2IodGhpcy5rLHRoaXMueCt0aGlzLmsqdCx0aGlzLnkrdGhpcy5rKm4pfSxhcHBseTpmdW5jdGlvbih0KXtyZXR1cm5bdFswXSp0aGlzLmsrdGhpcy54LHRbMV0qdGhpcy5rK3RoaXMueV19LGFwcGx5WDpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy54fSxhcHBseVk6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueX0saW52ZXJ0OmZ1bmN0aW9uKHQpe3JldHVyblsodFswXS10aGlzLngpL3RoaXMuaywodFsxXS10aGlzLnkpL3RoaXMua119LGludmVydFg6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy54KS90aGlzLmt9LGludmVydFk6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy55KS90aGlzLmt9LHJlc2NhbGVYOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0scmVzY2FsZVk6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIit0aGlzLngrIiwiK3RoaXMueSsiKSBzY2FsZSgiK3RoaXMuaysiKSJ9fTt2YXIgYWI9bmV3IG9iKDEsMCwwKTtmdW5jdGlvbiB1Yih0KXtyZXR1cm4gdC5fX3pvb218fGFifWZ1bmN0aW9uIGZiKCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBjYigpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIHNiKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIGxiKCl7dmFyIHQsbixlPXRoaXM7cmV0dXJuIGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50Pyh0PShlPWUub3duZXJTVkdFbGVtZW50fHxlKS53aWR0aC5iYXNlVmFsLnZhbHVlLG49ZS5oZWlnaHQuYmFzZVZhbC52YWx1ZSk6KHQ9ZS5jbGllbnRXaWR0aCxuPWUuY2xpZW50SGVpZ2h0KSxbWzAsMF0sW3Qsbl1dfWZ1bmN0aW9uIGhiKCl7cmV0dXJuIHRoaXMuX196b29tfHxhYn1mdW5jdGlvbiBkYigpe3JldHVybi10LmV2ZW50LmRlbHRhWSoodC5ldmVudC5kZWx0YU1vZGU/MTIwOjEpLzUwMH1mdW5jdGlvbiBwYigpe3JldHVybiJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiB2Yih0LG4sZSl7dmFyIHI9dC5pbnZlcnRYKG5bMF1bMF0pLWVbMF1bMF0saT10LmludmVydFgoblsxXVswXSktZVsxXVswXSxvPXQuaW52ZXJ0WShuWzBdWzFdKS1lWzBdWzFdLGE9dC5pbnZlcnRZKG5bMV1bMV0pLWVbMV1bMV07cmV0dXJuIHQudHJhbnNsYXRlKGk+cj8ocitpKS8yOk1hdGgubWluKDAscil8fE1hdGgubWF4KDAsaSksYT5vPyhvK2EpLzI6TWF0aC5taW4oMCxvKXx8TWF0aC5tYXgoMCxhKSl9dWIucHJvdG90eXBlPW9iLnByb3RvdHlwZSx0LnZlcnNpb249IjUuNy4wIix0LmJpc2VjdD1pLHQuYmlzZWN0UmlnaHQ9aSx0LmJpc2VjdExlZnQ9byx0LmFzY2VuZGluZz1uLHQuYmlzZWN0b3I9ZSx0LmNyb3NzPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sdSxmPXQubGVuZ3RoLGM9bi5sZW5ndGgscz1uZXcgQXJyYXkoZipjKTtmb3IobnVsbD09ZSYmKGU9YSkscj1vPTA7cjxmOysrcilmb3IodT10W3JdLGk9MDtpPGM7KytpLCsrbylzW29dPWUodSxuW2ldKTtyZXR1cm4gc30sdC5kZXNjZW5kaW5nPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG48dD8tMTpuPnQ/MTpuPj10PzA6TmFOfSx0LmRldmlhdGlvbj1jLHQuZXh0ZW50PXMsdC5oaXN0b2dyYW09ZnVuY3Rpb24oKXt2YXIgdD12LG49cyxlPU07ZnVuY3Rpb24gcihyKXt2YXIgbyxhLHU9ci5sZW5ndGgsZj1uZXcgQXJyYXkodSk7Zm9yKG89MDtvPHU7KytvKWZbb109dChyW29dLG8scik7dmFyIGM9bihmKSxzPWNbMF0sbD1jWzFdLGg9ZShmLHMsbCk7QXJyYXkuaXNBcnJheShoKXx8KGg9dyhzLGwsaCksaD1nKE1hdGguY2VpbChzL2gpKmgsbCxoKSk7Zm9yKHZhciBkPWgubGVuZ3RoO2hbMF08PXM7KWguc2hpZnQoKSwtLWQ7Zm9yKDtoW2QtMV0+bDspaC5wb3AoKSwtLWQ7dmFyIHAsdj1uZXcgQXJyYXkoZCsxKTtmb3Iobz0wO288PWQ7KytvKShwPXZbb109W10pLngwPW8+MD9oW28tMV06cyxwLngxPW88ZD9oW29dOmw7Zm9yKG89MDtvPHU7KytvKXM8PShhPWZbb10pJiZhPD1sJiZ2W2koaCxhLDAsZCldLnB1c2gocltvXSk7cmV0dXJuIHZ9cmV0dXJuIHIudmFsdWU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpwKG4pLHIpOnR9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cChbdFswXSx0WzFdXSkscik6bn0sci50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9wKGguY2FsbCh0KSk6cCh0KSxyKTplfSxyfSx0LnRocmVzaG9sZEZyZWVkbWFuRGlhY29uaXM9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PWQuY2FsbCh0LHUpLnNvcnQobiksTWF0aC5jZWlsKChyLWUpLygyKihBKHQsLjc1KS1BKHQsLjI1KSkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdC50aHJlc2hvbGRTY290dD1mdW5jdGlvbih0LG4sZSl7cmV0dXJuIE1hdGguY2VpbCgoZS1uKS8oMy41KmModCkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdC50aHJlc2hvbGRTdHVyZ2VzPU0sdC5tYXg9VCx0Lm1lYW49ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9cixvPS0xLGE9MDtpZihudWxsPT1uKWZvcig7KytvPHI7KWlzTmFOKGU9dSh0W29dKSk/LS1pOmErPWU7ZWxzZSBmb3IoOysrbzxyOylpc05hTihlPXUobih0W29dLG8sdCkpKT8tLWk6YSs9ZTtpZihpKXJldHVybiBhL2l9LHQubWVkaWFuPWZ1bmN0aW9uKHQsZSl7dmFyIHIsaT10Lmxlbmd0aCxvPS0xLGE9W107aWYobnVsbD09ZSlmb3IoOysrbzxpOylpc05hTihyPXUodFtvXSkpfHxhLnB1c2gocik7ZWxzZSBmb3IoOysrbzxpOylpc05hTihyPXUoZSh0W29dLG8sdCkpKXx8YS5wdXNoKHIpO3JldHVybiBBKGEuc29ydChuKSwuNSl9LHQubWVyZ2U9Tix0Lm1pbj1TLHQucGFpcnM9ZnVuY3Rpb24odCxuKXtudWxsPT1uJiYobj1hKTtmb3IodmFyIGU9MCxyPXQubGVuZ3RoLTEsaT10WzBdLG89bmV3IEFycmF5KHI8MD8wOnIpO2U8cjspb1tlXT1uKGksaT10WysrZV0pO3JldHVybiBvfSx0LnBlcm11dGU9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPXRbbltlXV07cmV0dXJuIHJ9LHQucXVhbnRpbGU9QSx0LnJhbmdlPWcsdC5zY2FuPWZ1bmN0aW9uKHQsZSl7aWYocj10Lmxlbmd0aCl7dmFyIHIsaSxvPTAsYT0wLHU9dFthXTtmb3IobnVsbD09ZSYmKGU9bik7KytvPHI7KShlKGk9dFtvXSx1KTwwfHwwIT09ZSh1LHUpKSYmKHU9aSxhPW8pO3JldHVybiAwPT09ZSh1LHUpP2E6dm9pZCAwfX0sdC5zaHVmZmxlPWZ1bmN0aW9uKHQsbixlKXtmb3IodmFyIHIsaSxvPShudWxsPT1lP3QubGVuZ3RoOmUpLShuPW51bGw9PW4/MDorbik7bzspaT1NYXRoLnJhbmRvbSgpKm8tLXwwLHI9dFtvK25dLHRbbytuXT10W2krbl0sdFtpK25dPXI7cmV0dXJuIHR9LHQuc3VtPWZ1bmN0aW9uKHQsbil7dmFyIGUscj10Lmxlbmd0aCxpPS0xLG89MDtpZihudWxsPT1uKWZvcig7KytpPHI7KShlPSt0W2ldKSYmKG8rPWUpO2Vsc2UgZm9yKDsrK2k8cjspKGU9K24odFtpXSxpLHQpKSYmKG8rPWUpO3JldHVybiBvfSx0LnRpY2tzPW0sdC50aWNrSW5jcmVtZW50PXgsdC50aWNrU3RlcD13LHQudHJhbnNwb3NlPUUsdC52YXJpYW5jZT1mLHQuemlwPWZ1bmN0aW9uKCl7cmV0dXJuIEUoYXJndW1lbnRzKX0sdC5heGlzVG9wPWZ1bmN0aW9uKHQpe3JldHVybiBCKHosdCl9LHQuYXhpc1JpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiBCKFIsdCl9LHQuYXhpc0JvdHRvbT1mdW5jdGlvbih0KXtyZXR1cm4gQihMLHQpfSx0LmF4aXNMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiBCKEQsdCl9LHQuYnJ1c2g9ZnVuY3Rpb24oKXtyZXR1cm4gUmkod2kpfSx0LmJydXNoWD1mdW5jdGlvbigpe3JldHVybiBSaShtaSl9LHQuYnJ1c2hZPWZ1bmN0aW9uKCl7cmV0dXJuIFJpKHhpKX0sdC5icnVzaFNlbGVjdGlvbj1mdW5jdGlvbih0KXt2YXIgbj10Ll9fYnJ1c2g7cmV0dXJuIG4/bi5kaW0ub3V0cHV0KG4uc2VsZWN0aW9uKTpudWxsfSx0LmNob3JkPWZ1bmN0aW9uKCl7dmFyIHQ9MCxuPW51bGwsZT1udWxsLHI9bnVsbDtmdW5jdGlvbiBpKGkpe3ZhciBvLGEsdSxmLGMscyxsPWkubGVuZ3RoLGg9W10sZD1nKGwpLHA9W10sdj1bXSx5PXYuZ3JvdXBzPW5ldyBBcnJheShsKSxfPW5ldyBBcnJheShsKmwpO2ZvcihvPTAsYz0tMTsrK2M8bDspe2ZvcihhPTAscz0tMTsrK3M8bDspYSs9aVtjXVtzXTtoLnB1c2goYSkscC5wdXNoKGcobCkpLG8rPWF9Zm9yKG4mJmQuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBuKGhbdF0saFtlXSl9KSxlJiZwLmZvckVhY2goZnVuY3Rpb24odCxuKXt0LnNvcnQoZnVuY3Rpb24odCxyKXtyZXR1cm4gZShpW25dW3RdLGlbbl1bcl0pfSl9KSxmPShvPVlpKDAsT2ktdCpsKS9vKT90Ok9pL2wsYT0wLGM9LTE7KytjPGw7KXtmb3IodT1hLHM9LTE7KytzPGw7KXt2YXIgYj1kW2NdLG09cFtiXVtzXSx4PWlbYl1bbV0sdz1hLE09YSs9eCpvO19bbSpsK2JdPXtpbmRleDpiLHN1YmluZGV4Om0sc3RhcnRBbmdsZTp3LGVuZEFuZ2xlOk0sdmFsdWU6eH19eVtiXT17aW5kZXg6YixzdGFydEFuZ2xlOnUsZW5kQW5nbGU6YSx2YWx1ZTpoW2JdfSxhKz1mfWZvcihjPS0xOysrYzxsOylmb3Iocz1jLTE7KytzPGw7KXt2YXIgQT1fW3MqbCtjXSxUPV9bYypsK3NdOyhBLnZhbHVlfHxULnZhbHVlKSYmdi5wdXNoKEEudmFsdWU8VC52YWx1ZT97c291cmNlOlQsdGFyZ2V0OkF9Ontzb3VyY2U6QSx0YXJnZXQ6VH0pfXJldHVybiByP3Yuc29ydChyKTp2fXJldHVybiBpLnBhZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVlpKDAsbiksaSk6dH0saS5zb3J0R3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsaSk6bn0saS5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsaSk6ZX0saS5zb3J0Q2hvcmRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P3I9bnVsbDoobj10LHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0LnNvdXJjZS52YWx1ZSt0LnRhcmdldC52YWx1ZSxlLnNvdXJjZS52YWx1ZStlLnRhcmdldC52YWx1ZSl9KS5fPXQsaSk6ciYmci5fO3ZhciBufSxpfSx0LnJpYmJvbj1mdW5jdGlvbigpe3ZhciB0PVZpLG49JGksZT1XaSxyPVppLGk9UWksbz1udWxsO2Z1bmN0aW9uIGEoKXt2YXIgYSx1PUJpLmNhbGwoYXJndW1lbnRzKSxmPXQuYXBwbHkodGhpcyx1KSxjPW4uYXBwbHkodGhpcyx1KSxzPStlLmFwcGx5KHRoaXMsKHVbMF09Zix1KSksbD1yLmFwcGx5KHRoaXMsdSktcWksaD1pLmFwcGx5KHRoaXMsdSktcWksZD1zKkxpKGwpLHA9cypEaShsKSx2PStlLmFwcGx5KHRoaXMsKHVbMF09Yyx1KSksZz1yLmFwcGx5KHRoaXMsdSktcWkseT1pLmFwcGx5KHRoaXMsdSktcWk7aWYob3x8KG89YT1HaSgpKSxvLm1vdmVUbyhkLHApLG8uYXJjKDAsMCxzLGwsaCksbD09PWcmJmg9PT15fHwoby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCx2KkxpKGcpLHYqRGkoZykpLG8uYXJjKDAsMCx2LGcseSkpLG8ucXVhZHJhdGljQ3VydmVUbygwLDAsZCxwKSxvLmNsb3NlUGF0aCgpLGEpcmV0dXJuIG89bnVsbCxhKyIifHxudWxsfXJldHVybiBhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTplfSxhLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpGaSgrdCksYSk6cn0sYS5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTppfSxhLnNvdXJjZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGEpOnR9LGEudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsYSk6bn0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW51bGw9PXQ/bnVsbDp0LGEpOm99LGF9LHQubmVzdD1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPVtdLGk9W107ZnVuY3Rpb24gbyhlLGksYSx1KXtpZihpPj1yLmxlbmd0aClyZXR1cm4gbnVsbCE9dCYmZS5zb3J0KHQpLG51bGwhPW4/bihlKTplO2Zvcih2YXIgZixjLHMsbD0tMSxoPWUubGVuZ3RoLGQ9cltpKytdLHA9S2koKSx2PWEoKTsrK2w8aDspKHM9cC5nZXQoZj1kKGM9ZVtsXSkrIiIpKT9zLnB1c2goYyk6cC5zZXQoZixbY10pO3JldHVybiBwLmVhY2goZnVuY3Rpb24odCxuKXt1KHYsbixvKHQsaSxhLHUpKX0pLHZ9cmV0dXJuIGU9e29iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsdG8sbm8pfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCwwLGVvLHJvKX0sZW50cmllczpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gdChlLG8pe2lmKCsrbz5yLmxlbmd0aClyZXR1cm4gZTt2YXIgYSx1PWlbby0xXTtyZXR1cm4gbnVsbCE9biYmbz49ci5sZW5ndGg/YT1lLmVudHJpZXMoKTooYT1bXSxlLmVhY2goZnVuY3Rpb24obixlKXthLnB1c2goe2tleTplLHZhbHVlczp0KG4sbyl9KX0pKSxudWxsIT11P2Euc29ydChmdW5jdGlvbih0LG4pe3JldHVybiB1KHQua2V5LG4ua2V5KX0pOmF9KG8odCwwLGVvLHJvKSwwKX0sa2V5OmZ1bmN0aW9uKHQpe3JldHVybiByLnB1c2godCksZX0sc29ydEtleXM6ZnVuY3Rpb24odCl7cmV0dXJuIGlbci5sZW5ndGgtMV09dCxlfSxzb3J0VmFsdWVzOmZ1bmN0aW9uKG4pe3JldHVybiB0PW4sZX0scm9sbHVwOmZ1bmN0aW9uKHQpe3JldHVybiBuPXQsZX19fSx0LnNldD1hbyx0Lm1hcD1LaSx0LmtleXM9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKGUpO3JldHVybiBufSx0LnZhbHVlcz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2godFtlXSk7cmV0dXJuIG59LHQuZW50cmllcz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goe2tleTplLHZhbHVlOnRbZV19KTtyZXR1cm4gbn0sdC5jb2xvcj12bix0LnJnYj1ibix0LmhzbD1Nbix0LmxhYj1Vbix0LmhjbD1Ibix0LmxjaD1mdW5jdGlvbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/SW4odCk6bmV3IGpuKGUsbix0LG51bGw9PXI/MTpyKX0sdC5ncmF5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBxbih0LDAsMCxudWxsPT1uPzE6bil9LHQuY3ViZWhlbGl4PUtuLHQuY29udG91cnM9Z28sdC5jb250b3VyRGVuc2l0eT1mdW5jdGlvbigpe3ZhciB0PWJvLG49bW8sZT14byxyPTk2MCxpPTUwMCxvPTIwLGE9Mix1PTMqbyxmPXIrMip1Pj5hLGM9aSsyKnU+PmEscz1jbygyMCk7ZnVuY3Rpb24gbChyKXt2YXIgaT1uZXcgRmxvYXQzMkFycmF5KGYqYyksbD1uZXcgRmxvYXQzMkFycmF5KGYqYyk7ci5mb3JFYWNoKGZ1bmN0aW9uKHIsbyxzKXt2YXIgbD0rdChyLG8scykrdT4+YSxoPStuKHIsbyxzKSt1Pj5hLGQ9K2UocixvLHMpO2w+PTAmJmw8ZiYmaD49MCYmaDxjJiYoaVtsK2gqZl0rPWQpfSkseW8oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LG8+PmEpLF9vKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSxvPj5hKSx5byh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0sbz4+YSksX28oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LG8+PmEpLHlvKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSxvPj5hKSxfbyh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0sbz4+YSk7dmFyIGQ9cyhpKTtpZighQXJyYXkuaXNBcnJheShkKSl7dmFyIHA9VChpKTtkPXcoMCxwLGQpLChkPWcoMCxNYXRoLmZsb29yKHAvZCkqZCxkKSkuc2hpZnQoKX1yZXR1cm4gZ28oKS50aHJlc2hvbGRzKGQpLnNpemUoW2YsY10pKGkpLm1hcChoKX1mdW5jdGlvbiBoKHQpe3JldHVybiB0LnZhbHVlKj1NYXRoLnBvdygyLC0yKmEpLHQuY29vcmRpbmF0ZXMuZm9yRWFjaChkKSx0fWZ1bmN0aW9uIGQodCl7dC5mb3JFYWNoKHApfWZ1bmN0aW9uIHAodCl7dC5mb3JFYWNoKHYpfWZ1bmN0aW9uIHYodCl7dFswXT10WzBdKk1hdGgucG93KDIsYSktdSx0WzFdPXRbMV0qTWF0aC5wb3coMixhKS11fWZ1bmN0aW9uIHkoKXtyZXR1cm4gZj1yKzIqKHU9MypvKT4+YSxjPWkrMip1Pj5hLGx9cmV0dXJuIGwueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNvKCtuKSxsKTp0fSxsLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjbygrdCksbCk6bn0sbC53ZWlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjbygrdCksbCk6ZX0sbC5zaXplPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltyLGldO3ZhciBuPU1hdGguY2VpbCh0WzBdKSxlPU1hdGguY2VpbCh0WzFdKTtpZighKG4+PTB8fG4+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaXplIik7cmV0dXJuIHI9bixpPWUseSgpfSxsLmNlbGxTaXplPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiAxPDxhO2lmKCEoKHQ9K3QpPj0xKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2VsbCBzaXplIik7cmV0dXJuIGE9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMikseSgpfSxsLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP2NvKHVvLmNhbGwodCkpOmNvKHQpLGwpOnN9LGwuYmFuZHdpZHRoPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBNYXRoLnNxcnQobyoobysxKSk7aWYoISgodD0rdCk+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiYW5kd2lkdGgiKTtyZXR1cm4gbz1NYXRoLnJvdW5kKChNYXRoLnNxcnQoNCp0KnQrMSktMSkvMikseSgpfSxsfSx0LmRpc3BhdGNoPUksdC5kcmFnPWZ1bmN0aW9uKCl7dmFyIG4sZSxyLGksbz1XdCxhPVp0LHU9UXQsZj1KdCxjPXt9LHM9SSgic3RhcnQiLCJkcmFnIiwiZW5kIiksbD0wLGg9MDtmdW5jdGlvbiBkKHQpe3Qub24oIm1vdXNlZG93bi5kcmFnIixwKS5maWx0ZXIoZikub24oInRvdWNoc3RhcnQuZHJhZyIseSkub24oInRvdWNobW92ZS5kcmFnIixfKS5vbigidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnIixiKS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gcCgpe2lmKCFpJiZvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHU9bSgibW91c2UiLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpLEZ0LHRoaXMsYXJndW1lbnRzKTt1JiYoRHQodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWciLHYsITApLm9uKCJtb3VzZXVwLmRyYWciLGcsITApLFh0KHQuZXZlbnQudmlldyksSHQoKSxyPSExLG49dC5ldmVudC5jbGllbnRYLGU9dC5ldmVudC5jbGllbnRZLHUoInN0YXJ0IikpfX1mdW5jdGlvbiB2KCl7aWYoanQoKSwhcil7dmFyIGk9dC5ldmVudC5jbGllbnRYLW4sbz10LmV2ZW50LmNsaWVudFktZTtyPWkqaStvKm8+aH1jLm1vdXNlKCJkcmFnIil9ZnVuY3Rpb24gZygpe0R0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS5kcmFnIG1vdXNldXAuZHJhZyIsbnVsbCksR3QodC5ldmVudC52aWV3LHIpLGp0KCksYy5tb3VzZSgiZW5kIil9ZnVuY3Rpb24geSgpe2lmKG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixlLHI9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxpPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLHU9ci5sZW5ndGg7Zm9yKG49MDtuPHU7KytuKShlPW0ocltuXS5pZGVudGlmaWVyLGksSXQsdGhpcyxhcmd1bWVudHMpKSYmKEh0KCksZSgic3RhcnQiKSl9fWZ1bmN0aW9uIF8oKXt2YXIgbixlLHI9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxpPXIubGVuZ3RoO2ZvcihuPTA7bjxpOysrbikoZT1jW3Jbbl0uaWRlbnRpZmllcl0pJiYoanQoKSxlKCJkcmFnIikpfWZ1bmN0aW9uIGIoKXt2YXIgbixlLHI9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxvPXIubGVuZ3RoO2ZvcihpJiZjbGVhclRpbWVvdXQoaSksaT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aT1udWxsfSw1MDApLG49MDtuPG87KytuKShlPWNbcltuXS5pZGVudGlmaWVyXSkmJihIdCgpLGUoImVuZCIpKX1mdW5jdGlvbiBtKG4sZSxyLGksbyl7dmFyIGEsZixoLHA9cihlLG4pLHY9cy5jb3B5KCk7aWYoQ3QobmV3ICR0KGQsImJlZm9yZXN0YXJ0IixhLG4sbCxwWzBdLHBbMV0sMCwwLHYpLGZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPSh0LmV2ZW50LnN1YmplY3Q9YT11LmFwcGx5KGksbykpJiYoZj1hLngtcFswXXx8MCxoPWEueS1wWzFdfHwwLCEwKX0pKXJldHVybiBmdW5jdGlvbiB0KHUpe3ZhciBzLGc9cDtzd2l0Y2godSl7Y2FzZSJzdGFydCI6Y1tuXT10LHM9bCsrO2JyZWFrO2Nhc2UiZW5kIjpkZWxldGUgY1tuXSwtLWw7Y2FzZSJkcmFnIjpwPXIoZSxuKSxzPWx9Q3QobmV3ICR0KGQsdSxhLG4scyxwWzBdK2YscFsxXStoLHBbMF0tZ1swXSxwWzFdLWdbMV0sdiksdi5hcHBseSx2LFt1LGksb10pfX1yZXR1cm4gZC5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCghIXQpLGQpOm99LGQuY29udGFpbmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VnQodCksZCk6YX0sZC5zdWJqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VnQodCksZCk6dX0sZC50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCghIXQpLGQpOmZ9LGQub249ZnVuY3Rpb24oKXt2YXIgdD1zLm9uLmFwcGx5KHMsYXJndW1lbnRzKTtyZXR1cm4gdD09PXM/ZDp0fSxkLmNsaWNrRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9KHQ9K3QpKnQsZCk6TWF0aC5zcXJ0KGgpfSxkfSx0LmRyYWdEaXNhYmxlPVh0LHQuZHJhZ0VuYWJsZT1HdCx0LmRzdkZvcm1hdD1Fbyx0LmNzdlBhcnNlPUNvLHQuY3N2UGFyc2VSb3dzPVBvLHQuY3N2Rm9ybWF0PXpvLHQuY3N2Rm9ybWF0Um93cz1Sbyx0LnRzdlBhcnNlPURvLHQudHN2UGFyc2VSb3dzPVVvLHQudHN2Rm9ybWF0PXFvLHQudHN2Rm9ybWF0Um93cz1Pbyx0LmVhc2VMaW5lYXI9ZnVuY3Rpb24odCl7cmV0dXJuK3R9LHQuZWFzZVF1YWQ9RHIsdC5lYXNlUXVhZEluPWZ1bmN0aW9uKHQpe3JldHVybiB0KnR9LHQuZWFzZVF1YWRPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQqKDItdCl9LHQuZWFzZVF1YWRJbk91dD1Ecix0LmVhc2VDdWJpYz1Vcix0LmVhc2VDdWJpY0luPWZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdH0sdC5lYXNlQ3ViaWNPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuLS10KnQqdCsxfSx0LmVhc2VDdWJpY0luT3V0PVVyLHQuZWFzZVBvbHk9WXIsdC5lYXNlUG9seUluPXFyLHQuZWFzZVBvbHlPdXQ9T3IsdC5lYXNlUG9seUluT3V0PVlyLHQuZWFzZVNpbj1Jcix0LmVhc2VTaW5Jbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLmNvcyh0KkZyKX0sdC5lYXNlU2luT3V0PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNpbih0KkZyKX0sdC5lYXNlU2luSW5PdXQ9SXIsdC5lYXNlRXhwPUhyLHQuZWFzZUV4cEluPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdygyLDEwKnQtMTApfSx0LmVhc2VFeHBPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqdCl9LHQuZWFzZUV4cEluT3V0PUhyLHQuZWFzZUNpcmNsZT1qcix0LmVhc2VDaXJjbGVJbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnNxcnQoMS10KnQpfSx0LmVhc2VDaXJjbGVPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLXQqdCl9LHQuZWFzZUNpcmNsZUluT3V0PWpyLHQuZWFzZUJvdW5jZT1uaSx0LmVhc2VCb3VuY2VJbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1uaSgxLXQpfSx0LmVhc2VCb3VuY2VPdXQ9bmksdC5lYXNlQm91bmNlSW5PdXQ9ZnVuY3Rpb24odCl7cmV0dXJuKCh0Kj0yKTw9MT8xLW5pKDEtdCk6bmkodC0xKSsxKS8yfSx0LmVhc2VCYWNrPWlpLHQuZWFzZUJhY2tJbj1laSx0LmVhc2VCYWNrT3V0PXJpLHQuZWFzZUJhY2tJbk91dD1paSx0LmVhc2VFbGFzdGljPXVpLHQuZWFzZUVsYXN0aWNJbj1haSx0LmVhc2VFbGFzdGljT3V0PXVpLHQuZWFzZUVsYXN0aWNJbk91dD1maSx0LmJsb2I9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZmV0Y2godCxuKS50aGVuKFlvKX0sdC5idWZmZXI9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZmV0Y2godCxuKS50aGVuKEJvKX0sdC5kc3Y9ZnVuY3Rpb24odCxuLGUscil7Mz09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9dm9pZCAwKTt2YXIgaT1Fbyh0KTtyZXR1cm4gSW8obixlKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBpLnBhcnNlKHQscil9KX0sdC5jc3Y9am8sdC50c3Y9WG8sdC5pbWFnZT1mdW5jdGlvbih0LG4pe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHIpe3ZhciBpPW5ldyBJbWFnZTtmb3IodmFyIG8gaW4gbilpW29dPW5bb107aS5vbmVycm9yPXIsaS5vbmxvYWQ9ZnVuY3Rpb24oKXtlKGkpfSxpLnNyYz10fSl9LHQuanNvbj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oR28pfSx0LnRleHQ9SW8sdC54bWw9JG8sdC5odG1sPVdvLHQuc3ZnPVpvLHQuZm9yY2VDZW50ZXI9ZnVuY3Rpb24odCxuKXt2YXIgZTtmdW5jdGlvbiByKCl7dmFyIHIsaSxvPWUubGVuZ3RoLGE9MCx1PTA7Zm9yKHI9MDtyPG87KytyKWErPShpPWVbcl0pLngsdSs9aS55O2ZvcihhPWEvby10LHU9dS9vLW4scj0wO3I8bzsrK3IpKGk9ZVtyXSkueC09YSxpLnktPXV9cmV0dXJuIG51bGw9PXQmJih0PTApLG51bGw9PW4mJihuPTApLHIuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtlPXR9LHIueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixyKTp0fSxyLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3Qscik6bn0scn0sdC5mb3JjZUNvbGxpZGU9ZnVuY3Rpb24odCl7dmFyIG4sZSxyPTEsaT0xO2Z1bmN0aW9uIG8oKXtmb3IodmFyIHQsbyx1LGYsYyxzLGwsaD1uLmxlbmd0aCxkPTA7ZDxpOysrZClmb3Iobz1yYShuLHVhLGZhKS52aXNpdEFmdGVyKGEpLHQ9MDt0PGg7Kyt0KXU9blt0XSxzPWVbdS5pbmRleF0sbD1zKnMsZj11LngrdS52eCxjPXUueSt1LnZ5LG8udmlzaXQocCk7ZnVuY3Rpb24gcCh0LG4sZSxpLG8pe3ZhciBhPXQuZGF0YSxoPXQucixkPXMraDtpZighYSlyZXR1cm4gbj5mK2R8fGk8Zi1kfHxlPmMrZHx8bzxjLWQ7aWYoYS5pbmRleD51LmluZGV4KXt2YXIgcD1mLWEueC1hLnZ4LHY9Yy1hLnktYS52eSxnPXAqcCt2KnY7ZzxkKmQmJigwPT09cCYmKGcrPShwPUpvKCkpKnApLDA9PT12JiYoZys9KHY9Sm8oKSkqdiksZz0oZC0oZz1NYXRoLnNxcnQoZykpKS9nKnIsdS52eCs9KHAqPWcpKihkPShoKj1oKS8obCtoKSksdS52eSs9KHYqPWcpKmQsYS52eC09cCooZD0xLWQpLGEudnktPXYqZCl9fX1mdW5jdGlvbiBhKHQpe2lmKHQuZGF0YSlyZXR1cm4gdC5yPWVbdC5kYXRhLmluZGV4XTtmb3IodmFyIG49dC5yPTA7bjw0Oysrbil0W25dJiZ0W25dLnI+dC5yJiYodC5yPXRbbl0ucil9ZnVuY3Rpb24gdSgpe2lmKG4pe3ZhciByLGksbz1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobykscj0wO3I8bzsrK3IpaT1uW3JdLGVbaS5pbmRleF09K3QoaSxyLG4pfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UW8obnVsbD09dD8xOit0KSksby5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe249dCx1KCl9LG8uaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxvKTppfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG8pOnJ9LG8ucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLHUoKSxvKTp0fSxvfSx0LmZvcmNlTGluaz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGE9Y2EsdT1mdW5jdGlvbih0KXtyZXR1cm4gMS9NYXRoLm1pbihpW3Quc291cmNlLmluZGV4XSxpW3QudGFyZ2V0LmluZGV4XSl9LGY9UW8oMzApLGM9MTtmdW5jdGlvbiBzKHIpe2Zvcih2YXIgaT0wLGE9dC5sZW5ndGg7aTxjOysraSlmb3IodmFyIHUsZixzLGwsaCxkLHAsdj0wO3Y8YTsrK3YpZj0odT10W3ZdKS5zb3VyY2UsbD0ocz11LnRhcmdldCkueCtzLnZ4LWYueC1mLnZ4fHxKbygpLGg9cy55K3MudnktZi55LWYudnl8fEpvKCksbCo9ZD0oKGQ9TWF0aC5zcXJ0KGwqbCtoKmgpKS1lW3ZdKS9kKnIqblt2XSxoKj1kLHMudngtPWwqKHA9b1t2XSkscy52eS09aCpwLGYudngrPWwqKHA9MS1wKSxmLnZ5Kz1oKnB9ZnVuY3Rpb24gbCgpe2lmKHIpe3ZhciB1LGYsYz1yLmxlbmd0aCxzPXQubGVuZ3RoLGw9S2kocixhKTtmb3IodT0wLGk9bmV3IEFycmF5KGMpO3U8czsrK3UpKGY9dFt1XSkuaW5kZXg9dSwib2JqZWN0IiE9dHlwZW9mIGYuc291cmNlJiYoZi5zb3VyY2U9c2EobCxmLnNvdXJjZSkpLCJvYmplY3QiIT10eXBlb2YgZi50YXJnZXQmJihmLnRhcmdldD1zYShsLGYudGFyZ2V0KSksaVtmLnNvdXJjZS5pbmRleF09KGlbZi5zb3VyY2UuaW5kZXhdfHwwKSsxLGlbZi50YXJnZXQuaW5kZXhdPShpW2YudGFyZ2V0LmluZGV4XXx8MCkrMTtmb3IodT0wLG89bmV3IEFycmF5KHMpO3U8czsrK3UpZj10W3VdLG9bdV09aVtmLnNvdXJjZS5pbmRleF0vKGlbZi5zb3VyY2UuaW5kZXhdK2lbZi50YXJnZXQuaW5kZXhdKTtuPW5ldyBBcnJheShzKSxoKCksZT1uZXcgQXJyYXkocyksZCgpfX1mdW5jdGlvbiBoKCl7aWYocilmb3IodmFyIGU9MCxpPXQubGVuZ3RoO2U8aTsrK2UpbltlXT0rdSh0W2VdLGUsdCl9ZnVuY3Rpb24gZCgpe2lmKHIpZm9yKHZhciBuPTAsaT10Lmxlbmd0aDtuPGk7KytuKWVbbl09K2YodFtuXSxuLHQpfXJldHVybiBudWxsPT10JiYodD1bXSkscy5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dCxsKCl9LHMubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixsKCkscyk6dH0scy5pZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LHMpOmF9LHMuaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0rdCxzKTpjfSxzLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGgoKSxzKTp1fSxzLmRpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGQoKSxzKTpmfSxzfSx0LmZvcmNlTWFueUJvZHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpPVFvKC0zMCksbz0xLGE9MS8wLHU9LjgxO2Z1bmN0aW9uIGYocil7dmFyIGksbz10Lmxlbmd0aCxhPXJhKHQsbGEsaGEpLnZpc2l0QWZ0ZXIocyk7Zm9yKGU9cixpPTA7aTxvOysraSluPXRbaV0sYS52aXNpdChsKX1mdW5jdGlvbiBjKCl7aWYodCl7dmFyIG4sZSxvPXQubGVuZ3RoO2ZvcihyPW5ldyBBcnJheShvKSxuPTA7bjxvOysrbillPXRbbl0scltlLmluZGV4XT0raShlLG4sdCl9fWZ1bmN0aW9uIHModCl7dmFyIG4sZSxpLG8sYSx1PTAsZj0wO2lmKHQubGVuZ3RoKXtmb3IoaT1vPWE9MDthPDQ7KythKShuPXRbYV0pJiYoZT1NYXRoLmFicyhuLnZhbHVlKSkmJih1Kz1uLnZhbHVlLGYrPWUsaSs9ZSpuLngsbys9ZSpuLnkpO3QueD1pL2YsdC55PW8vZn1lbHNleyhuPXQpLng9bi5kYXRhLngsbi55PW4uZGF0YS55O2Rve3UrPXJbbi5kYXRhLmluZGV4XX13aGlsZShuPW4ubmV4dCl9dC52YWx1ZT11fWZ1bmN0aW9uIGwodCxpLGYsYyl7aWYoIXQudmFsdWUpcmV0dXJuITA7dmFyIHM9dC54LW4ueCxsPXQueS1uLnksaD1jLWksZD1zKnMrbCpsO2lmKGgqaC91PGQpcmV0dXJuIGQ8YSYmKDA9PT1zJiYoZCs9KHM9Sm8oKSkqcyksMD09PWwmJihkKz0obD1KbygpKSpsKSxkPG8mJihkPU1hdGguc3FydChvKmQpKSxuLnZ4Kz1zKnQudmFsdWUqZS9kLG4udnkrPWwqdC52YWx1ZSplL2QpLCEwO2lmKCEodC5sZW5ndGh8fGQ+PWEpKXsodC5kYXRhIT09bnx8dC5uZXh0KSYmKDA9PT1zJiYoZCs9KHM9Sm8oKSkqcyksMD09PWwmJihkKz0obD1KbygpKSpsKSxkPG8mJihkPU1hdGguc3FydChvKmQpKSk7ZG97dC5kYXRhIT09biYmKGg9clt0LmRhdGEuaW5kZXhdKmUvZCxuLnZ4Kz1zKmgsbi52eSs9bCpoKX13aGlsZSh0PXQubmV4dCl9fXJldHVybiBmLmluaXRpYWxpemU9ZnVuY3Rpb24obil7dD1uLGMoKX0sZi5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxjKCksZik6aX0sZi5kaXN0YW5jZU1pbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10KnQsZik6TWF0aC5zcXJ0KG8pfSxmLmRpc3RhbmNlTWF4PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQqdCxmKTpNYXRoLnNxcnQoYSl9LGYudGhldGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCp0LGYpOk1hdGguc3FydCh1KX0sZn0sdC5mb3JjZVJhZGlhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvLGE9UW8oLjEpO2Z1bmN0aW9uIHUodCl7Zm9yKHZhciBhPTAsdT1yLmxlbmd0aDthPHU7KythKXt2YXIgZj1yW2FdLGM9Zi54LW58fDFlLTYscz1mLnktZXx8MWUtNixsPU1hdGguc3FydChjKmMrcypzKSxoPShvW2FdLWwpKmlbYV0qdC9sO2YudngrPWMqaCxmLnZ5Kz1zKmh9fWZ1bmN0aW9uIGYoKXtpZihyKXt2YXIgbixlPXIubGVuZ3RoO2ZvcihpPW5ldyBBcnJheShlKSxvPW5ldyBBcnJheShlKSxuPTA7bjxlOysrbilvW25dPSt0KHJbbl0sbixyKSxpW25dPWlzTmFOKG9bbl0pPzA6K2EocltuXSxuLHIpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UW8oK3QpKSxudWxsPT1uJiYobj0wKSxudWxsPT1lJiYoZT0wKSx1LmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGYoKX0sdS5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxmKCksdSk6YX0sdS5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksZigpLHUpOnR9LHUueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCx1KTpufSx1Lnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3QsdSk6ZX0sdX0sdC5mb3JjZVNpbXVsYXRpb249ZnVuY3Rpb24odCl7dmFyIG4sZT0xLHI9LjAwMSxpPTEtTWF0aC5wb3cociwxLzMwMCksbz0wLGE9LjYsdT1LaSgpLGY9dXIocyksYz1JKCJ0aWNrIiwiZW5kIik7ZnVuY3Rpb24gcygpe2woKSxjLmNhbGwoInRpY2siLG4pLGU8ciYmKGYuc3RvcCgpLGMuY2FsbCgiZW5kIixuKSl9ZnVuY3Rpb24gbCgpe3ZhciBuLHIsZj10Lmxlbmd0aDtmb3IoZSs9KG8tZSkqaSx1LmVhY2goZnVuY3Rpb24odCl7dChlKX0pLG49MDtuPGY7KytuKW51bGw9PShyPXRbbl0pLmZ4P3IueCs9ci52eCo9YTooci54PXIuZngsci52eD0wKSxudWxsPT1yLmZ5P3IueSs9ci52eSo9YTooci55PXIuZnksci52eT0wKX1mdW5jdGlvbiBoKCl7Zm9yKHZhciBuLGU9MCxyPXQubGVuZ3RoO2U8cjsrK2Upe2lmKChuPXRbZV0pLmluZGV4PWUsaXNOYU4obi54KXx8aXNOYU4obi55KSl7dmFyIGk9ZGEqTWF0aC5zcXJ0KGUpLG89ZSpwYTtuLng9aSpNYXRoLmNvcyhvKSxuLnk9aSpNYXRoLnNpbihvKX0oaXNOYU4obi52eCl8fGlzTmFOKG4udnkpKSYmKG4udng9bi52eT0wKX19ZnVuY3Rpb24gZChuKXtyZXR1cm4gbi5pbml0aWFsaXplJiZuLmluaXRpYWxpemUodCksbn1yZXR1cm4gbnVsbD09dCYmKHQ9W10pLGgoKSxuPXt0aWNrOmwscmVzdGFydDpmdW5jdGlvbigpe3JldHVybiBmLnJlc3RhcnQocyksbn0sc3RvcDpmdW5jdGlvbigpe3JldHVybiBmLnN0b3AoKSxufSxub2RlczpmdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLGgoKSx1LmVhY2goZCksbik6dH0sYWxwaGE6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3Qsbik6ZX0sYWxwaGFNaW46ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbik6cn0sYWxwaGFEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKToraX0sYWxwaGFUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3Qsbik6b30sdmVsb2NpdHlEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0xLXQsbik6MS1hfSxmb3JjZTpmdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KG51bGw9PWU/dS5yZW1vdmUodCk6dS5zZXQodCxkKGUpKSxuKTp1LmdldCh0KX0sZmluZDpmdW5jdGlvbihuLGUscil7dmFyIGksbyxhLHUsZixjPTAscz10Lmxlbmd0aDtmb3IobnVsbD09cj9yPTEvMDpyKj1yLGM9MDtjPHM7KytjKShhPShpPW4tKHU9dFtjXSkueCkqaSsobz1lLXUueSkqbyk8ciYmKGY9dSxyPWEpO3JldHVybiBmfSxvbjpmdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KGMub24odCxlKSxuKTpjLm9uKHQpfX19LHQuZm9yY2VYPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVFvKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ4Kz0ocltvXS1pLngpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxhKCksbyk6aX0sby54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLGEoKSxvKTp0fSxvfSx0LmZvcmNlWT1mdW5jdGlvbih0KXt2YXIgbixlLHIsaT1RbyguMSk7ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGksbz0wLGE9bi5sZW5ndGg7bzxhOysrbykoaT1uW29dKS52eSs9KHJbb10taS55KSplW29dKnR9ZnVuY3Rpb24gYSgpe2lmKG4pe3ZhciBvLGE9bi5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KGEpLHI9bmV3IEFycmF5KGEpLG89MDtvPGE7KytvKWVbb109aXNOYU4ocltvXT0rdChuW29dLG8sbikpPzA6K2kobltvXSxvLG4pfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UW8obnVsbD09dD8wOit0KSksby5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe249dCxhKCl9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksYSgpLG8pOml9LG8ueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlFvKCtuKSxhKCksbyk6dH0sb30sdC5mb3JtYXREZWZhdWx0TG9jYWxlPVNhLHQuZm9ybWF0TG9jYWxlPU5hLHQuZm9ybWF0U3BlY2lmaWVyPWJhLHQucHJlY2lzaW9uRml4ZWQ9RWEsdC5wcmVjaXNpb25QcmVmaXg9a2EsdC5wcmVjaXNpb25Sb3VuZD1DYSx0Lmdlb0FyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHl1LnJlc2V0KCksc3UodCxfdSksMip5dX0sdC5nZW9Cb3VuZHM9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU7aWYoUnU9enU9LShDdT1QdT0xLzApLE91PVtdLHN1KHQscmYpLGU9T3UubGVuZ3RoKXtmb3IoT3Uuc29ydChkZiksbj0xLG89W3I9T3VbMF1dO248ZTsrK24pcGYociwoaT1PdVtuXSlbMF0pfHxwZihyLGlbMV0pPyhoZihyWzBdLGlbMV0pPmhmKHJbMF0sclsxXSkmJihyWzFdPWlbMV0pLGhmKGlbMF0sclsxXSk+aGYoclswXSxyWzFdKSYmKHJbMF09aVswXSkpOm8ucHVzaChyPWkpO2ZvcihhPS0xLzAsbj0wLHI9b1tlPW8ubGVuZ3RoLTFdO248PWU7cj1pLCsrbilpPW9bbl0sKHU9aGYoclsxXSxpWzBdKSk+YSYmKGE9dSxDdT1pWzBdLHp1PXJbMV0pfXJldHVybiBPdT1ZdT1udWxsLEN1PT09MS8wfHxQdT09PTEvMD9bW05hTixOYU5dLFtOYU4sTmFOXV06W1tDdSxQdV0sW3p1LFJ1XV19LHQuZ2VvQ2VudHJvaWQ9ZnVuY3Rpb24odCl7QnU9RnU9SXU9SHU9anU9WHU9R3U9VnU9JHU9V3U9WnU9MCxzdSh0LHZmKTt2YXIgbj0kdSxlPVd1LHI9WnUsaT1uKm4rZSplK3IqcjtyZXR1cm4gaTxVYSYmKG49WHUsZT1HdSxyPVZ1LEZ1PERhJiYobj1JdSxlPUh1LHI9anUpLChpPW4qbitlKmUrcipyKTxVYSk/W05hTixOYU5dOltYYShlLG4pKkZhLGV1KHIvS2EoaSkpKkZhXX0sdC5nZW9DaXJjbGU9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9TmYoWzAsMF0pLHI9TmYoOTApLGk9TmYoNiksbz17cG9pbnQ6ZnVuY3Rpb24oZSxyKXt0LnB1c2goZT1uKGUscikpLGVbMF0qPUZhLGVbMV0qPUZhfX07ZnVuY3Rpb24gYSgpe3ZhciBhPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHU9ci5hcHBseSh0aGlzLGFyZ3VtZW50cykqSWEsZj1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpJYTtyZXR1cm4gdD1bXSxuPWtmKC1hWzBdKklhLC1hWzFdKklhLDApLmludmVydCxMZihvLHUsZiwxKSxhPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdF19LHQ9bj1udWxsLGF9cmV0dXJuIGEuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TmYoWyt0WzBdLCt0WzFdXSksYSk6ZX0sYS5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZigrdCksYSk6cn0sYS5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZigrdCksYSk6aX0sYX0sdC5nZW9DbGlwQW50aW1lcmlkaWFuPUdmLHQuZ2VvQ2xpcENpcmNsZT1WZix0Lmdlb0NsaXBFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscj0wLGk9MCxvPTk2MCxhPTUwMDtyZXR1cm4gZT17c3RyZWFtOmZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OnQ9WmYocixpLG8sYSkobj1lKX0sZXh0ZW50OmZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt1WzBdWzBdLGk9K3VbMF1bMV0sbz0rdVsxXVswXSxhPSt1WzFdWzFdLHQ9bj1udWxsLGUpOltbcixpXSxbbyxhXV19fX0sdC5nZW9DbGlwUmVjdGFuZ2xlPVpmLHQuZ2VvQ29udGFpbnM9ZnVuY3Rpb24odCxuKXtyZXR1cm4odCYmY2MuaGFzT3duUHJvcGVydHkodC50eXBlKT9jY1t0LnR5cGVdOmxjKSh0LG4pfSx0Lmdlb0Rpc3RhbmNlPWZjLHQuZ2VvR3JhdGljdWxlPWJjLHQuZ2VvR3JhdGljdWxlMTA9ZnVuY3Rpb24oKXtyZXR1cm4gYmMoKSgpfSx0Lmdlb0ludGVycG9sYXRlPWZ1bmN0aW9uKHQsbil7dmFyIGU9dFswXSpJYSxyPXRbMV0qSWEsaT1uWzBdKklhLG89blsxXSpJYSxhPUdhKHIpLHU9UWEociksZj1HYShvKSxjPVFhKG8pLHM9YSpHYShlKSxsPWEqUWEoZSksaD1mKkdhKGkpLGQ9ZipRYShpKSxwPTIqZXUoS2EocnUoby1yKSthKmYqcnUoaS1lKSkpLHY9UWEocCksZz1wP2Z1bmN0aW9uKHQpe3ZhciBuPVFhKHQqPXApL3YsZT1RYShwLXQpL3Yscj1lKnMrbipoLGk9ZSpsK24qZCxvPWUqdStuKmM7cmV0dXJuW1hhKGkscikqRmEsWGEobyxLYShyKnIraSppKSkqRmFdfTpmdW5jdGlvbigpe3JldHVybltlKkZhLHIqRmFdfTtyZXR1cm4gZy5kaXN0YW5jZT1wLGd9LHQuZ2VvTGVuZ3RoPW9jLHQuZ2VvUGF0aD1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT00LjU7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiZyLnBvaW50UmFkaXVzKCtpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksc3UodCxlKHIpKSksci5yZXN1bHQoKX1yZXR1cm4gby5hcmVhPWZ1bmN0aW9uKHQpe3JldHVybiBzdSh0LGUoU2MpKSxTYy5yZXN1bHQoKX0sby5tZWFzdXJlPWZ1bmN0aW9uKHQpe3JldHVybiBzdSh0LGUoZHMpKSxkcy5yZXN1bHQoKX0sby5ib3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShVYykpLFVjLnJlc3VsdCgpfSxvLmNlbnRyb2lkPWZ1bmN0aW9uKHQpe3JldHVybiBzdSh0LGUoWmMpKSxaYy5yZXN1bHQoKX0sby5wcm9qZWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PW4/KHQ9bnVsbCxtYyk6KHQ9bikuc3RyZWFtLG8pOnR9LG8uY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT10PyhuPW51bGwsbmV3IGdzKTpuZXcgYXMobj10KSwiZnVuY3Rpb24iIT10eXBlb2YgaSYmci5wb2ludFJhZGl1cyhpKSxvKTpufSxvLnBvaW50UmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6KHIucG9pbnRSYWRpdXMoK3QpLCt0KSxvKTppfSxvLnByb2plY3Rpb24odCkuY29udGV4dChuKX0sdC5nZW9BbGJlcnM9RHMsdC5nZW9BbGJlcnNVc2E9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpLG8sYT1EcygpLHU9THMoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGY9THMoKS5yb3RhdGUoWzE1NywwXSkuY2VudGVyKFstMywxOS45XSkucGFyYWxsZWxzKFs4LDE4XSksYz17cG9pbnQ6ZnVuY3Rpb24odCxuKXtvPVt0LG5dfX07ZnVuY3Rpb24gcyh0KXt2YXIgbj10WzBdLGE9dFsxXTtyZXR1cm4gbz1udWxsLGUucG9pbnQobixhKSxvfHwoci5wb2ludChuLGEpLG8pfHwoaS5wb2ludChuLGEpLG8pfWZ1bmN0aW9uIGwoKXtyZXR1cm4gdD1uPW51bGwsc31yZXR1cm4gcy5pbnZlcnQ9ZnVuY3Rpb24odCl7dmFyIG49YS5zY2FsZSgpLGU9YS50cmFuc2xhdGUoKSxyPSh0WzBdLWVbMF0pL24saT0odFsxXS1lWzFdKS9uO3JldHVybihpPj0uMTImJmk8LjIzNCYmcj49LS40MjUmJnI8LS4yMTQ/dTppPj0uMTY2JiZpPC4yMzQmJnI+PS0uMjE0JiZyPC0uMTE1P2Y6YSkuaW52ZXJ0KHQpfSxzLnN0cmVhbT1mdW5jdGlvbihlKXtyZXR1cm4gdCYmbj09PWU/dDoocj1bYS5zdHJlYW0obj1lKSx1LnN0cmVhbShlKSxmLnN0cmVhbShlKV0saT1yLmxlbmd0aCx0PXtwb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT0tMTsrK2U8aTspcltlXS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9LTE7Kyt0PGk7KXJbdF0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5wb2x5Z29uRW5kKCl9fSk7dmFyIHIsaX0scy5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEucHJlY2lzaW9uKHQpLHUucHJlY2lzaW9uKHQpLGYucHJlY2lzaW9uKHQpLGwoKSk6YS5wcmVjaXNpb24oKX0scy5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5zY2FsZSh0KSx1LnNjYWxlKC4zNSp0KSxmLnNjYWxlKHQpLHMudHJhbnNsYXRlKGEudHJhbnNsYXRlKCkpKTphLnNjYWxlKCl9LHMudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBhLnRyYW5zbGF0ZSgpO3ZhciBuPWEuc2NhbGUoKSxvPSt0WzBdLHM9K3RbMV07cmV0dXJuIGU9YS50cmFuc2xhdGUodCkuY2xpcEV4dGVudChbW28tLjQ1NSpuLHMtLjIzOCpuXSxbbysuNDU1Km4scysuMjM4Km5dXSkuc3RyZWFtKGMpLHI9dS50cmFuc2xhdGUoW28tLjMwNypuLHMrLjIwMSpuXSkuY2xpcEV4dGVudChbW28tLjQyNSpuK0RhLHMrLjEyKm4rRGFdLFtvLS4yMTQqbi1EYSxzKy4yMzQqbi1EYV1dKS5zdHJlYW0oYyksaT1mLnRyYW5zbGF0ZShbby0uMjA1Km4scysuMjEyKm5dKS5jbGlwRXh0ZW50KFtbby0uMjE0Km4rRGEscysuMTY2Km4rRGFdLFtvLS4xMTUqbi1EYSxzKy4yMzQqbi1EYV1dKS5zdHJlYW0oYyksbCgpfSxzLmZpdEV4dGVudD1mdW5jdGlvbih0LG4pe3JldHVybiB4cyhzLHQsbil9LHMuZml0U2l6ZT1mdW5jdGlvbih0LG4pe3JldHVybiB3cyhzLHQsbil9LHMuZml0V2lkdGg9ZnVuY3Rpb24odCxuKXtyZXR1cm4gTXMocyx0LG4pfSxzLmZpdEhlaWdodD1mdW5jdGlvbih0LG4pe3JldHVybiBBcyhzLHQsbil9LHMuc2NhbGUoMTA3MCl9LHQuZ2VvQXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIENzKE9zKS5zY2FsZSgxMjQuNzUpLmNsaXBBbmdsZSgxNzkuOTk5KX0sdC5nZW9BemltdXRoYWxFcXVhbEFyZWFSYXc9T3MsdC5nZW9BemltdXRoYWxFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBDcyhZcykuc2NhbGUoNzkuNDE4OCkuY2xpcEFuZ2xlKDE3OS45OTkpfSx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3PVlzLHQuZ2VvQ29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4genMoSHMpLnNjYWxlKDEwOS41KS5wYXJhbGxlbHMoWzMwLDMwXSl9LHQuZ2VvQ29uaWNDb25mb3JtYWxSYXc9SHMsdC5nZW9Db25pY0VxdWFsQXJlYT1Mcyx0Lmdlb0NvbmljRXF1YWxBcmVhUmF3PVJzLHQuZ2VvQ29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiB6cyhYcykuc2NhbGUoMTMxLjE1NCkuY2VudGVyKFswLDEzLjkzODldKX0sdC5nZW9Db25pY0VxdWlkaXN0YW50UmF3PVhzLHQuZ2VvRXF1YWxFYXJ0aD1mdW5jdGlvbigpe3JldHVybiBDcyhRcykuc2NhbGUoMTc3LjE1OCl9LHQuZ2VvRXF1YWxFYXJ0aFJhdz1Rcyx0Lmdlb0VxdWlyZWN0YW5ndWxhcj1mdW5jdGlvbigpe3JldHVybiBDcyhqcykuc2NhbGUoMTUyLjYzKX0sdC5nZW9FcXVpcmVjdGFuZ3VsYXJSYXc9anMsdC5nZW9Hbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiBDcyhKcykuc2NhbGUoMTQ0LjA0OSkuY2xpcEFuZ2xlKDYwKX0sdC5nZW9Hbm9tb25pY1Jhdz1Kcyx0Lmdlb0lkZW50aXR5PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHIsaSxvLGE9MSx1PTAsZj0wLGM9MSxzPTEsbD1tYyxoPW51bGwsZD1tYztmdW5jdGlvbiBwKCl7cmV0dXJuIHI9aT1udWxsLG99cmV0dXJuIG89e3N0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gciYmaT09PXQ/cjpyPWwoZChpPXQpKX0scG9zdGNsaXA6ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9cixoPXQ9bj1lPW51bGwscCgpKTpkfSxjbGlwRXh0ZW50OmZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW51bGw9PXI/KGg9dD1uPWU9bnVsbCxtYyk6WmYoaD0rclswXVswXSx0PStyWzBdWzFdLG49K3JbMV1bMF0sZT0rclsxXVsxXSkscCgpKTpudWxsPT1oP251bGw6W1toLHRdLFtuLGVdXX0sc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoKGE9K3QpKmMsYSpzLHUsZikscCgpKTphfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSpjLGEqcyx1PSt0WzBdLGY9K3RbMV0pLHAoKSk6W3UsZl19LHJlZmxlY3RYOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPUtzKGEqKGM9dD8tMToxKSxhKnMsdSxmKSxwKCkpOmM8MH0scmVmbGVjdFk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSpjLGEqKHM9dD8tMToxKSx1LGYpLHAoKSk6czwwfSxmaXRFeHRlbnQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4geHMobyx0LG4pfSxmaXRTaXplOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKG8sdCxuKX0sZml0V2lkdGg6ZnVuY3Rpb24odCxuKXtyZXR1cm4gTXMobyx0LG4pfSxmaXRIZWlnaHQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gQXMobyx0LG4pfX19LHQuZ2VvUHJvamVjdGlvbj1Dcyx0Lmdlb1Byb2plY3Rpb25NdXRhdG9yPVBzLHQuZ2VvTWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gRnMoQnMpLnNjYWxlKDk2MS9CYSl9LHQuZ2VvTWVyY2F0b3JSYXc9QnMsdC5nZW9OYXR1cmFsRWFydGgxPWZ1bmN0aW9uKCl7cmV0dXJuIENzKHRsKS5zY2FsZSgxNzUuMjk1KX0sdC5nZW9OYXR1cmFsRWFydGgxUmF3PXRsLHQuZ2VvT3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKG5sKS5zY2FsZSgyNDkuNSkuY2xpcEFuZ2xlKDkwK0RhKX0sdC5nZW9PcnRob2dyYXBoaWNSYXc9bmwsdC5nZW9TdGVyZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKGVsKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfSx0Lmdlb1N0ZXJlb2dyYXBoaWNSYXc9ZWwsdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgdD1GcyhybCksbj10LmNlbnRlcixlPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKFstdFsxXSx0WzBdXSk6Wyh0PW4oKSlbMV0sLXRbMF1dfSx0LnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKFt0WzBdLHRbMV0sdC5sZW5ndGg+Mj90WzJdKzkwOjkwXSk6Wyh0PWUoKSlbMF0sdFsxXSx0WzJdLTkwXX0sZShbMCwwLDkwXSkuc2NhbGUoMTU5LjE1NSl9LHQuZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3PXJsLHQuZ2VvUm90YXRpb249UmYsdC5nZW9TdHJlYW09c3UsdC5nZW9UcmFuc2Zvcm09ZnVuY3Rpb24odCl7cmV0dXJue3N0cmVhbTpfcyh0KX19LHQuY2x1c3Rlcj1mdW5jdGlvbigpe3ZhciB0PWlsLG49MSxlPTEscj0hMTtmdW5jdGlvbiBpKGkpe3ZhciBvLGE9MDtpLmVhY2hBZnRlcihmdW5jdGlvbihuKXt2YXIgZT1uLmNoaWxkcmVuO2U/KG4ueD1mdW5jdGlvbih0KXtyZXR1cm4gdC5yZWR1Y2Uob2wsMCkvdC5sZW5ndGh9KGUpLG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gMSt0LnJlZHVjZShhbCwwKX0oZSkpOihuLng9bz9hKz10KG4sbyk6MCxuLnk9MCxvPW4pfSk7dmFyIHU9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uWzBdO3JldHVybiB0fShpKSxmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbjtuPXQuY2hpbGRyZW47KXQ9bltuLmxlbmd0aC0xXTtyZXR1cm4gdH0oaSksYz11LngtdCh1LGYpLzIscz1mLngrdChmLHUpLzI7cmV0dXJuIGkuZWFjaEFmdGVyKHI/ZnVuY3Rpb24odCl7dC54PSh0LngtaS54KSpuLHQueT0oaS55LXQueSkqZX06ZnVuY3Rpb24odCl7dC54PSh0LngtYykvKHMtYykqbix0Lnk9KDEtKGkueT90LnkvaS55OjEpKSplfSl9cmV0dXJuIGkuc2VwYXJhdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGkpOnR9LGkuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMSxuPSt0WzBdLGU9K3RbMV0saSk6cj9udWxsOltuLGVdfSxpLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSEwLG49K3RbMF0sZT0rdFsxXSxpKTpyP1tuLGVdOm51bGx9LGl9LHQuaGllcmFyY2h5PWZsLHQucGFjaz1mdW5jdGlvbigpe3ZhciB0PW51bGwsbj0xLGU9MSxyPUVsO2Z1bmN0aW9uIGkoaSl7cmV0dXJuIGkueD1uLzIsaS55PWUvMix0P2kuZWFjaEJlZm9yZShQbCh0KSkuZWFjaEFmdGVyKHpsKHIsLjUpKS5lYWNoQmVmb3JlKFJsKDEpKTppLmVhY2hCZWZvcmUoUGwoQ2wpKS5lYWNoQWZ0ZXIoemwoRWwsMSkpLmVhY2hBZnRlcih6bChyLGkuci9NYXRoLm1pbihuLGUpKSkuZWFjaEJlZm9yZShSbChNYXRoLm1pbihuLGUpLygyKmkucikpKSxpfXJldHVybiBpLnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT0oZT1uKT9udWxsOlNsKGUpLGkpOnQ7dmFyIGV9LGkuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxlPSt0WzFdLGkpOltuLGVdfSxpLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCksaSk6cn0saX0sdC5wYWNrU2libGluZ3M9ZnVuY3Rpb24odCl7cmV0dXJuIE5sKHQpLHR9LHQucGFja0VuY2xvc2U9cGwsdC5wYXJ0aXRpb249ZnVuY3Rpb24oKXt2YXIgdD0xLG49MSxlPTAscj0hMTtmdW5jdGlvbiBpKGkpe3ZhciBvPWkuaGVpZ2h0KzE7cmV0dXJuIGkueDA9aS55MD1lLGkueDE9dCxpLnkxPW4vbyxpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7ci5jaGlsZHJlbiYmRGwocixyLngwLHQqKHIuZGVwdGgrMSkvbixyLngxLHQqKHIuZGVwdGgrMikvbik7dmFyIGk9ci54MCxvPXIueTAsYT1yLngxLWUsdT1yLnkxLWU7YTxpJiYoaT1hPShpK2EpLzIpLHU8byYmKG89dT0obyt1KS8yKSxyLngwPWksci55MD1vLHIueDE9YSxyLnkxPXV9fShuLG8pKSxyJiZpLmVhY2hCZWZvcmUoTGwpLGl9cmV0dXJuIGkucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ISF0LGkpOnJ9LGkuc2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZVswXSxuPStlWzFdLGkpOlt0LG5dfSxpLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3QsaSk6ZX0saX0sdC5zdHJhdGlmeT1mdW5jdGlvbigpe3ZhciB0PVlsLG49Qmw7ZnVuY3Rpb24gZShlKXt2YXIgcixpLG8sYSx1LGYsYyxzPWUubGVuZ3RoLGw9bmV3IEFycmF5KHMpLGg9e307Zm9yKGk9MDtpPHM7KytpKXI9ZVtpXSx1PWxbaV09bmV3IGhsKHIpLG51bGwhPShmPXQocixpLGUpKSYmKGYrPSIiKSYmKGhbYz1VbCsodS5pZD1mKV09YyBpbiBoP09sOnUpO2ZvcihpPTA7aTxzOysraSlpZih1PWxbaV0sbnVsbCE9KGY9bihlW2ldLGksZSkpJiYoZis9IiIpKXtpZighKGE9aFtVbCtmXSkpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2YpO2lmKGE9PT1PbCl0aHJvdyBuZXcgRXJyb3IoImFtYmlndW91czogIitmKTthLmNoaWxkcmVuP2EuY2hpbGRyZW4ucHVzaCh1KTphLmNoaWxkcmVuPVt1XSx1LnBhcmVudD1hfWVsc2V7aWYobyl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7bz11fWlmKCFvKXRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpO2lmKG8ucGFyZW50PXFsLG8uZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0LmRlcHRoPXQucGFyZW50LmRlcHRoKzEsLS1zfSkuZWFjaEJlZm9yZShsbCksby5wYXJlbnQ9bnVsbCxzPjApdGhyb3cgbmV3IEVycm9yKCJjeWNsZSIpO3JldHVybiBvfXJldHVybiBlLmlkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVNsKG4pLGUpOnR9LGUucGFyZW50SWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49U2wodCksZSk6bn0sZX0sdC50cmVlPWZ1bmN0aW9uKCl7dmFyIHQ9Rmwsbj0xLGU9MSxyPW51bGw7ZnVuY3Rpb24gaShpKXt2YXIgZj1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGksbyxhPW5ldyBHbCh0LDApLHU9W2FdO249dS5wb3AoKTspaWYocj1uLl8uY2hpbGRyZW4pZm9yKG4uY2hpbGRyZW49bmV3IEFycmF5KG89ci5sZW5ndGgpLGk9by0xO2k+PTA7LS1pKXUucHVzaChlPW4uY2hpbGRyZW5baV09bmV3IEdsKHJbaV0saSkpLGUucGFyZW50PW47cmV0dXJuKGEucGFyZW50PW5ldyBHbChudWxsLDApKS5jaGlsZHJlbj1bYV0sYX0oaSk7aWYoZi5lYWNoQWZ0ZXIobyksZi5wYXJlbnQubT0tZi56LGYuZWFjaEJlZm9yZShhKSxyKWkuZWFjaEJlZm9yZSh1KTtlbHNle3ZhciBjPWkscz1pLGw9aTtpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PGMueCYmKGM9dCksdC54PnMueCYmKHM9dCksdC5kZXB0aD5sLmRlcHRoJiYobD10KX0pO3ZhciBoPWM9PT1zPzE6dChjLHMpLzIsZD1oLWMueCxwPW4vKHMueCtoK2QpLHY9ZS8obC5kZXB0aHx8MSk7aS5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QueD0odC54K2QpKnAsdC55PXQuZGVwdGgqdn0pfXJldHVybiBpfWZ1bmN0aW9uIG8obil7dmFyIGU9bi5jaGlsZHJlbixyPW4ucGFyZW50LmNoaWxkcmVuLGk9bi5pP3Jbbi5pLTFdOm51bGw7aWYoZSl7IWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPTAscj0wLGk9dC5jaGlsZHJlbixvPWkubGVuZ3RoOy0tbz49MDspKG49aVtvXSkueis9ZSxuLm0rPWUsZSs9bi5zKyhyKz1uLmMpfShuKTt2YXIgbz0oZVswXS56K2VbZS5sZW5ndGgtMV0ueikvMjtpPyhuLno9aS56K3Qobi5fLGkuXyksbi5tPW4uei1vKTpuLno9b31lbHNlIGkmJihuLno9aS56K3Qobi5fLGkuXykpO24ucGFyZW50LkE9ZnVuY3Rpb24obixlLHIpe2lmKGUpe2Zvcih2YXIgaSxvPW4sYT1uLHU9ZSxmPW8ucGFyZW50LmNoaWxkcmVuWzBdLGM9by5tLHM9YS5tLGw9dS5tLGg9Zi5tO3U9SGwodSksbz1JbChvKSx1JiZvOylmPUlsKGYpLChhPUhsKGEpKS5hPW4sKGk9dS56K2wtby56LWMrdCh1Ll8sby5fKSk+MCYmKGpsKFhsKHUsbixyKSxuLGkpLGMrPWkscys9aSksbCs9dS5tLGMrPW8ubSxoKz1mLm0scys9YS5tO3UmJiFIbChhKSYmKGEudD11LGEubSs9bC1zKSxvJiYhSWwoZikmJihmLnQ9byxmLm0rPWMtaCxyPW4pfXJldHVybiByfShuLGksbi5wYXJlbnQuQXx8clswXSl9ZnVuY3Rpb24gYSh0KXt0Ll8ueD10LnordC5wYXJlbnQubSx0Lm0rPXQucGFyZW50Lm19ZnVuY3Rpb24gdSh0KXt0LngqPW4sdC55PXQuZGVwdGgqZX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC50cmVlbWFwPWZ1bmN0aW9uKCl7dmFyIHQ9Wmwsbj0hMSxlPTEscj0xLGk9WzBdLG89RWwsYT1FbCx1PUVsLGY9RWwsYz1FbDtmdW5jdGlvbiBzKHQpe3JldHVybiB0LngwPXQueTA9MCx0LngxPWUsdC55MT1yLHQuZWFjaEJlZm9yZShsKSxpPVswXSxuJiZ0LmVhY2hCZWZvcmUoTGwpLHR9ZnVuY3Rpb24gbChuKXt2YXIgZT1pW24uZGVwdGhdLHI9bi54MCtlLHM9bi55MCtlLGw9bi54MS1lLGg9bi55MS1lO2w8ciYmKHI9bD0ocitsKS8yKSxoPHMmJihzPWg9KHMraCkvMiksbi54MD1yLG4ueTA9cyxuLngxPWwsbi55MT1oLG4uY2hpbGRyZW4mJihlPWlbbi5kZXB0aCsxXT1vKG4pLzIscis9YyhuKS1lLHMrPWEobiktZSwobC09dShuKS1lKTxyJiYocj1sPShyK2wpLzIpLChoLT1mKG4pLWUpPHMmJihzPWg9KHMraCkvMiksdChuLHIscyxsLGgpKX1yZXR1cm4gcy5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0hIXQscyk6bn0scy5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0scyk6W2Uscl19LHMudGlsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1TbChuKSxzKTp0fSxzLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nSW5uZXIodCkucGFkZGluZ091dGVyKHQpOnMucGFkZGluZ0lubmVyKCl9LHMucGFkZGluZ0lubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOm99LHMucGFkZGluZ091dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3MucGFkZGluZ1RvcCh0KS5wYWRkaW5nUmlnaHQodCkucGFkZGluZ0JvdHRvbSh0KS5wYWRkaW5nTGVmdCh0KTpzLnBhZGRpbmdUb3AoKX0scy5wYWRkaW5nVG9wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmF9LHMucGFkZGluZ1JpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOnV9LHMucGFkZGluZ0JvdHRvbT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtsKCt0KSxzKTpmfSxzLnBhZGRpbmdMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmN9LHN9LHQudHJlZW1hcEJpbmFyeT1mdW5jdGlvbih0LG4sZSxyLGkpe3ZhciBvLGEsdT10LmNoaWxkcmVuLGY9dS5sZW5ndGgsYz1uZXcgQXJyYXkoZisxKTtmb3IoY1swXT1hPW89MDtvPGY7KytvKWNbbysxXT1hKz11W29dLnZhbHVlOyFmdW5jdGlvbiB0KG4sZSxyLGksbyxhLGYpe2lmKG4+PWUtMSl7dmFyIHM9dVtuXTtyZXR1cm4gcy54MD1pLHMueTA9byxzLngxPWEsdm9pZChzLnkxPWYpfWZvcih2YXIgbD1jW25dLGg9ci8yK2wsZD1uKzEscD1lLTE7ZDxwOyl7dmFyIHY9ZCtwPj4+MTtjW3ZdPGg/ZD12KzE6cD12fWgtY1tkLTFdPGNbZF0taCYmbisxPGQmJi0tZDt2YXIgZz1jW2RdLWwseT1yLWc7aWYoYS1pPmYtbyl7dmFyIF89KGkqeSthKmcpL3I7dChuLGQsZyxpLG8sXyxmKSx0KGQsZSx5LF8sbyxhLGYpfWVsc2V7dmFyIGI9KG8qeStmKmcpL3I7dChuLGQsZyxpLG8sYSxiKSx0KGQsZSx5LGksYixhLGYpfX0oMCxmLHQudmFsdWUsbixlLHIsaSl9LHQudHJlZW1hcERpY2U9RGwsdC50cmVlbWFwU2xpY2U9VmwsdC50cmVlbWFwU2xpY2VEaWNlPWZ1bmN0aW9uKHQsbixlLHIsaSl7KDEmdC5kZXB0aD9WbDpEbCkodCxuLGUscixpKX0sdC50cmVlbWFwU3F1YXJpZnk9WmwsdC50cmVlbWFwUmVzcXVhcmlmeT1RbCx0LmludGVycG9sYXRlPW1lLHQuaW50ZXJwb2xhdGVBcnJheT1kZSx0LmludGVycG9sYXRlQmFzaXM9ZWUsdC5pbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkPXJlLHQuaW50ZXJwb2xhdGVEYXRlPXBlLHQuaW50ZXJwb2xhdGVEaXNjcmV0ZT1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRbTWF0aC5tYXgoMCxNYXRoLm1pbihuLTEsTWF0aC5mbG9vcihlKm4pKSldfX0sdC5pbnRlcnBvbGF0ZUh1ZT1mdW5jdGlvbih0LG4pe3ZhciBlPWFlKCt0LCtuKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49ZSh0KTtyZXR1cm4gbi0zNjAqTWF0aC5mbG9vcihuLzM2MCl9fSx0LmludGVycG9sYXRlTnVtYmVyPXZlLHQuaW50ZXJwb2xhdGVPYmplY3Q9Z2UsdC5pbnRlcnBvbGF0ZVJvdW5kPXhlLHQuaW50ZXJwb2xhdGVTdHJpbmc9YmUsdC5pbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcz1DZSx0LmludGVycG9sYXRlVHJhbnNmb3JtU3ZnPVBlLHQuaW50ZXJwb2xhdGVab29tPXFlLHQuaW50ZXJwb2xhdGVSZ2I9Y2UsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzPWxlLHQuaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZD1oZSx0LmludGVycG9sYXRlSHNsPVllLHQuaW50ZXJwb2xhdGVIc2xMb25nPUJlLHQuaW50ZXJwb2xhdGVMYWI9ZnVuY3Rpb24odCxuKXt2YXIgZT1mZSgodD1Vbih0KSkubCwobj1VbihuKSkubCkscj1mZSh0LmEsbi5hKSxpPWZlKHQuYixuLmIpLG89ZmUodC5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0Lmw9ZShuKSx0LmE9cihuKSx0LmI9aShuKSx0Lm9wYWNpdHk9byhuKSx0KyIifX0sdC5pbnRlcnBvbGF0ZUhjbD1JZSx0LmludGVycG9sYXRlSGNsTG9uZz1IZSx0LmludGVycG9sYXRlQ3ViZWhlbGl4PVhlLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nPUdlLHQucGllY2V3aXNlPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPTAscj1uLmxlbmd0aC0xLGk9blswXSxvPW5ldyBBcnJheShyPDA/MDpyKTtlPHI7KW9bZV09dChpLGk9blsrK2VdKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49TWF0aC5tYXgoMCxNYXRoLm1pbihyLTEsTWF0aC5mbG9vcih0Kj1yKSkpO3JldHVybiBvW25dKHQtbil9fSx0LnF1YW50aXplPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcillW3JdPXQoci8obi0xKSk7cmV0dXJuIGV9LHQucGF0aD1HaSx0LnBvbHlnb25BcmVhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPS0xLHI9dC5sZW5ndGgsaT10W3ItMV0sbz0wOysrZTxyOyluPWksaT10W2VdLG8rPW5bMV0qaVswXS1uWzBdKmlbMV07cmV0dXJuIG8vMn0sdC5wb2x5Z29uQ2VudHJvaWQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89MCxhPTAsdT10W2ktMV0sZj0wOysrcjxpOyluPXUsdT10W3JdLGYrPWU9blswXSp1WzFdLXVbMF0qblsxXSxvKz0oblswXSt1WzBdKSplLGErPShuWzFdK3VbMV0pKmU7cmV0dXJuW28vKGYqPTMpLGEvZl19LHQucG9seWdvbkh1bGw9ZnVuY3Rpb24odCl7aWYoKGU9dC5sZW5ndGgpPDMpcmV0dXJuIG51bGw7dmFyIG4sZSxyPW5ldyBBcnJheShlKSxpPW5ldyBBcnJheShlKTtmb3Iobj0wO248ZTsrK24pcltuXT1bK3Rbbl1bMF0sK3Rbbl1bMV0sbl07Zm9yKHIuc29ydChKbCksbj0wO248ZTsrK24paVtuXT1bcltuXVswXSwtcltuXVsxXV07dmFyIG89S2wociksYT1LbChpKSx1PWFbMF09PT1vWzBdLGY9YVthLmxlbmd0aC0xXT09PW9bby5sZW5ndGgtMV0sYz1bXTtmb3Iobj1vLmxlbmd0aC0xO24+PTA7LS1uKWMucHVzaCh0W3Jbb1tuXV1bMl1dKTtmb3Iobj0rdTtuPGEubGVuZ3RoLWY7KytuKWMucHVzaCh0W3JbYVtuXV1bMl1dKTtyZXR1cm4gY30sdC5wb2x5Z29uQ29udGFpbnM9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscixpPXQubGVuZ3RoLG89dFtpLTFdLGE9blswXSx1PW5bMV0sZj1vWzBdLGM9b1sxXSxzPSExLGw9MDtsPGk7KytsKWU9KG89dFtsXSlbMF0sKHI9b1sxXSk+dSE9Yz51JiZhPChmLWUpKih1LXIpLyhjLXIpK2UmJihzPSFzKSxmPWUsYz1yO3JldHVybiBzfSx0LnBvbHlnb25MZW5ndGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89dFtpLTFdLGE9b1swXSx1PW9bMV0sZj0wOysrcjxpOyluPWEsZT11LG4tPWE9KG89dFtyXSlbMF0sZS09dT1vWzFdLGYrPU1hdGguc3FydChuKm4rZSplKTtyZXR1cm4gZn0sdC5xdWFkdHJlZT1yYSx0LnJhbmRvbVVuaWZvcm09bmgsdC5yYW5kb21Ob3JtYWw9ZWgsdC5yYW5kb21Mb2dOb3JtYWw9cmgsdC5yYW5kb21CYXRlcz1vaCx0LnJhbmRvbUlyd2luSGFsbD1paCx0LnJhbmRvbUV4cG9uZW50aWFsPWFoLHQuc2NhbGVCYW5kPWhoLHQuc2NhbGVQb2ludD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiB0KG4pe3ZhciBlPW4uY29weTtyZXR1cm4gbi5wYWRkaW5nPW4ucGFkZGluZ091dGVyLGRlbGV0ZSBuLnBhZGRpbmdJbm5lcixkZWxldGUgbi5wYWRkaW5nT3V0ZXIsbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoZSgpKX0sbn0oaGgoKS5wYWRkaW5nSW5uZXIoMSkpfSx0LnNjYWxlSWRlbnRpdHk9ZnVuY3Rpb24gdCgpe3ZhciBuPVswLDFdO2Z1bmN0aW9uIGUodCl7cmV0dXJuK3R9cmV0dXJuIGUuaW52ZXJ0PWUsZS5kb21haW49ZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1maC5jYWxsKHQscGgpLGUpOm4uc2xpY2UoKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4obil9LHhoKGUpfSx0LnNjYWxlTGluZWFyPWZ1bmN0aW9uIHQoKXt2YXIgbj1taChnaCx2ZSk7cmV0dXJuIG4uY29weT1mdW5jdGlvbigpe3JldHVybiBiaChuLHQoKSl9LHhoKG4pfSx0LnNjYWxlTG9nPWZ1bmN0aW9uIG4oKXt2YXIgZT1taChNaCxBaCkuZG9tYWluKFsxLDEwXSkscj1lLmRvbWFpbixpPTEwLG89U2goMTApLGE9TmgoMTApO2Z1bmN0aW9uIHUoKXtyZXR1cm4gbz1TaChpKSxhPU5oKGkpLHIoKVswXTwwJiYobz1FaChvKSxhPUVoKGEpKSxlfXJldHVybiBlLmJhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3QsdSgpKTppfSxlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSx1KCkpOnIoKX0sZS50aWNrcz1mdW5jdGlvbih0KXt2YXIgbixlPXIoKSx1PWVbMF0sZj1lW2UubGVuZ3RoLTFdOyhuPWY8dSkmJihoPXUsdT1mLGY9aCk7dmFyIGMscyxsLGg9byh1KSxkPW8oZikscD1udWxsPT10PzEwOit0LHY9W107aWYoIShpJTEpJiZkLWg8cCl7aWYoaD1NYXRoLnJvdW5kKGgpLTEsZD1NYXRoLnJvdW5kKGQpKzEsdT4wKXtmb3IoO2g8ZDsrK2gpZm9yKHM9MSxjPWEoaCk7czxpOysrcylpZighKChsPWMqcyk8dSkpe2lmKGw+ZilicmVhazt2LnB1c2gobCl9fWVsc2UgZm9yKDtoPGQ7KytoKWZvcihzPWktMSxjPWEoaCk7cz49MTstLXMpaWYoISgobD1jKnMpPHUpKXtpZihsPmYpYnJlYWs7di5wdXNoKGwpfX1lbHNlIHY9bShoLGQsTWF0aC5taW4oZC1oLHApKS5tYXAoYSk7cmV0dXJuIG4/di5yZXZlcnNlKCk6dn0sZS50aWNrRm9ybWF0PWZ1bmN0aW9uKG4scil7aWYobnVsbD09ciYmKHI9MTA9PT1pPyIuMGUiOiIsIiksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPXQuZm9ybWF0KHIpKSxuPT09MS8wKXJldHVybiByO251bGw9PW4mJihuPTEwKTt2YXIgdT1NYXRoLm1heCgxLGkqbi9lLnRpY2tzKCkubGVuZ3RoKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC9hKE1hdGgucm91bmQobyh0KSkpO3JldHVybiBuKmk8aS0uNSYmKG4qPWkpLG48PXU/cih0KToiIn19LGUubmljZT1mdW5jdGlvbigpe3JldHVybiByKHdoKHIoKSx7Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIGEoTWF0aC5mbG9vcihvKHQpKSl9LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIGEoTWF0aC5jZWlsKG8odCkpKX19KSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBiaChlLG4oKS5iYXNlKGkpKX0sZX0sdC5zY2FsZU9yZGluYWw9bGgsdC5zY2FsZUltcGxpY2l0PXNoLHQuc2NhbGVQb3c9Q2gsdC5zY2FsZVNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gQ2goKS5leHBvbmVudCguNSl9LHQuc2NhbGVRdWFudGlsZT1mdW5jdGlvbiB0KCl7dmFyIGU9W10scj1bXSxvPVtdO2Z1bmN0aW9uIGEoKXt2YXIgdD0wLG49TWF0aC5tYXgoMSxyLmxlbmd0aCk7Zm9yKG89bmV3IEFycmF5KG4tMSk7Kyt0PG47KW9bdC0xXT1BKGUsdC9uKTtyZXR1cm4gdX1mdW5jdGlvbiB1KHQpe2lmKCFpc05hTih0PSt0KSlyZXR1cm4gcltpKG8sdCldfXJldHVybiB1LmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgbj1yLmluZGV4T2YodCk7cmV0dXJuIG48MD9bTmFOLE5hTl06W24+MD9vW24tMV06ZVswXSxuPG8ubGVuZ3RoP29bbl06ZVtlLmxlbmd0aC0xXV19LHUuZG9tYWluPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLnNsaWNlKCk7ZT1bXTtmb3IodmFyIHIsaT0wLG89dC5sZW5ndGg7aTxvOysraSludWxsPT0ocj10W2ldKXx8aXNOYU4ocj0rcil8fGUucHVzaChyKTtyZXR1cm4gZS5zb3J0KG4pLGEoKX0sdS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1jaC5jYWxsKHQpLGEoKSk6ci5zbGljZSgpfSx1LnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBvLnNsaWNlKCl9LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKGUpLnJhbmdlKHIpfSx1fSx0LnNjYWxlUXVhbnRpemU9ZnVuY3Rpb24gdCgpe3ZhciBuPTAsZT0xLHI9MSxvPVsuNV0sYT1bMCwxXTtmdW5jdGlvbiB1KHQpe2lmKHQ8PXQpcmV0dXJuIGFbaShvLHQsMCxyKV19ZnVuY3Rpb24gZigpe3ZhciB0PS0xO2ZvcihvPW5ldyBBcnJheShyKTsrK3Q8cjspb1t0XT0oKHQrMSkqZS0odC1yKSpuKS8ocisxKTtyZXR1cm4gdX1yZXR1cm4gdS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3RbMF0sZT0rdFsxXSxmKCkpOltuLGVdfSx1LnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPShhPWNoLmNhbGwodCkpLmxlbmd0aC0xLGYoKSk6YS5zbGljZSgpfSx1LmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgaT1hLmluZGV4T2YodCk7cmV0dXJuIGk8MD9bTmFOLE5hTl06aTwxP1tuLG9bMF1dOmk+PXI/W29bci0xXSxlXTpbb1tpLTFdLG9baV1dfSx1LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihbbixlXSkucmFuZ2UoYSl9LHhoKHUpfSx0LnNjYWxlVGhyZXNob2xkPWZ1bmN0aW9uIHQoKXt2YXIgbj1bLjVdLGU9WzAsMV0scj0xO2Z1bmN0aW9uIG8odCl7aWYodDw9dClyZXR1cm4gZVtpKG4sdCwwLHIpXX1yZXR1cm4gby5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49Y2guY2FsbCh0KSxyPU1hdGgubWluKG4ubGVuZ3RoLGUubGVuZ3RoLTEpLG8pOm4uc2xpY2UoKX0sby5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1jaC5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksbyk6ZS5zbGljZSgpfSxvLmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgcj1lLmluZGV4T2YodCk7cmV0dXJuW25bci0xXSxuW3JdXX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4obikucmFuZ2UoZSl9LG99LHQuc2NhbGVUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGN2KGNkLHVkLFZoLGpoLEloLEJoLE9oLExoLHQudGltZUZvcm1hdCkuZG9tYWluKFtuZXcgRGF0ZSgyZTMsMCwxKSxuZXcgRGF0ZSgyZTMsMCwyKV0pfSx0LnNjYWxlVXRjPWZ1bmN0aW9uKCl7cmV0dXJuIGN2KExkLHpkLF9kLHZkLGRkLGxkLE9oLExoLHQudXRjRm9ybWF0KS5kb21haW4oW0RhdGUuVVRDKDJlMywwLDEpLERhdGUuVVRDKDJlMywwLDIpXSl9LHQuc2NhbGVTZXF1ZW50aWFsPWZ1bmN0aW9uIHQobil7dmFyIGU9MCxyPTEsaT0xLG89ITE7ZnVuY3Rpb24gYSh0KXt2YXIgcj0odC1lKSppO3JldHVybiBuKG8/TWF0aC5tYXgoMCxNYXRoLm1pbigxLHIpKTpyKX1yZXR1cm4gYS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxpPWU9PT1yPzA6MS8oci1lKSxhKTpbZSxyXX0sYS5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0hIXQsYSk6b30sYS5pbnRlcnBvbGF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChuKS5kb21haW4oW2Uscl0pLmNsYW1wKG8pfSx4aChhKX0sdC5zY2FsZURpdmVyZ2luZz1mdW5jdGlvbiB0KG4pe3ZhciBlPTAscj0uNSxpPTEsbz0xLGE9MSx1PSExO2Z1bmN0aW9uIGYodCl7dmFyIGU9LjUrKCh0PSt0KS1yKSoodDxyP286YSk7cmV0dXJuIG4odT9NYXRoLm1heCgwLE1hdGgubWluKDEsZSkpOmUpfXJldHVybiBmLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLGk9K3RbMl0sbz1lPT09cj8wOi41LyhyLWUpLGE9cj09PWk/MDouNS8oaS1yKSxmKTpbZSxyLGldfSxmLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSEhdCxmKTp1fSxmLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGYpOm59LGYuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihbZSxyLGldKS5jbGFtcCh1KX0seGgoZil9LHQuc2NoZW1lQ2F0ZWdvcnkxMD1sdix0LnNjaGVtZUFjY2VudD1odix0LnNjaGVtZURhcmsyPWR2LHQuc2NoZW1lUGFpcmVkPXB2LHQuc2NoZW1lUGFzdGVsMT12dix0LnNjaGVtZVBhc3RlbDI9Z3YsdC5zY2hlbWVTZXQxPXl2LHQuc2NoZW1lU2V0Mj1fdix0LnNjaGVtZVNldDM9YnYsdC5pbnRlcnBvbGF0ZUJyQkc9d3YsdC5zY2hlbWVCckJHPXh2LHQuaW50ZXJwb2xhdGVQUkduPUF2LHQuc2NoZW1lUFJHbj1Ndix0LmludGVycG9sYXRlUGlZRz1Odix0LnNjaGVtZVBpWUc9VHYsdC5pbnRlcnBvbGF0ZVB1T3I9RXYsdC5zY2hlbWVQdU9yPVN2LHQuaW50ZXJwb2xhdGVSZEJ1PUN2LHQuc2NoZW1lUmRCdT1rdix0LmludGVycG9sYXRlUmRHeT16dix0LnNjaGVtZVJkR3k9UHYsdC5pbnRlcnBvbGF0ZVJkWWxCdT1Mdix0LnNjaGVtZVJkWWxCdT1Sdix0LmludGVycG9sYXRlUmRZbEduPVV2LHQuc2NoZW1lUmRZbEduPUR2LHQuaW50ZXJwb2xhdGVTcGVjdHJhbD1Pdix0LnNjaGVtZVNwZWN0cmFsPXF2LHQuaW50ZXJwb2xhdGVCdUduPUJ2LHQuc2NoZW1lQnVHbj1Zdix0LmludGVycG9sYXRlQnVQdT1Jdix0LnNjaGVtZUJ1UHU9RnYsdC5pbnRlcnBvbGF0ZUduQnU9anYsdC5zY2hlbWVHbkJ1PUh2LHQuaW50ZXJwb2xhdGVPclJkPUd2LHQuc2NoZW1lT3JSZD1Ydix0LmludGVycG9sYXRlUHVCdUduPSR2LHQuc2NoZW1lUHVCdUduPVZ2LHQuaW50ZXJwb2xhdGVQdUJ1PVp2LHQuc2NoZW1lUHVCdT1Xdix0LmludGVycG9sYXRlUHVSZD1Kdix0LnNjaGVtZVB1UmQ9UXYsdC5pbnRlcnBvbGF0ZVJkUHU9dGcsdC5zY2hlbWVSZFB1PUt2LHQuaW50ZXJwb2xhdGVZbEduQnU9ZWcsdC5zY2hlbWVZbEduQnU9bmcsdC5pbnRlcnBvbGF0ZVlsR249aWcsdC5zY2hlbWVZbEduPXJnLHQuaW50ZXJwb2xhdGVZbE9yQnI9YWcsdC5zY2hlbWVZbE9yQnI9b2csdC5pbnRlcnBvbGF0ZVlsT3JSZD1mZyx0LnNjaGVtZVlsT3JSZD11Zyx0LmludGVycG9sYXRlQmx1ZXM9c2csdC5zY2hlbWVCbHVlcz1jZyx0LmludGVycG9sYXRlR3JlZW5zPWhnLHQuc2NoZW1lR3JlZW5zPWxnLHQuaW50ZXJwb2xhdGVHcmV5cz1wZyx0LnNjaGVtZUdyZXlzPWRnLHQuaW50ZXJwb2xhdGVQdXJwbGVzPWdnLHQuc2NoZW1lUHVycGxlcz12Zyx0LmludGVycG9sYXRlUmVkcz1fZyx0LnNjaGVtZVJlZHM9eWcsdC5pbnRlcnBvbGF0ZU9yYW5nZXM9bWcsdC5zY2hlbWVPcmFuZ2VzPWJnLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0PXhnLHQuaW50ZXJwb2xhdGVSYWluYm93PWZ1bmN0aW9uKHQpeyh0PDB8fHQ+MSkmJih0LT1NYXRoLmZsb29yKHQpKTt2YXIgbj1NYXRoLmFicyh0LS41KTtyZXR1cm4gQWcuaD0zNjAqdC0xMDAsQWcucz0xLjUtMS41Km4sQWcubD0uOC0uOSpuLEFnKyIifSx0LmludGVycG9sYXRlV2FybT13Zyx0LmludGVycG9sYXRlQ29vbD1NZyx0LmludGVycG9sYXRlU2luZWJvdz1mdW5jdGlvbih0KXt2YXIgbjtyZXR1cm4gdD0oLjUtdCkqTWF0aC5QSSxUZy5yPTI1NSoobj1NYXRoLnNpbih0KSkqbixUZy5nPTI1NSoobj1NYXRoLnNpbih0K05nKSkqbixUZy5iPTI1NSoobj1NYXRoLnNpbih0K1NnKSkqbixUZysiIn0sdC5pbnRlcnBvbGF0ZVZpcmlkaXM9a2csdC5pbnRlcnBvbGF0ZU1hZ21hPUNnLHQuaW50ZXJwb2xhdGVJbmZlcm5vPVBnLHQuaW50ZXJwb2xhdGVQbGFzbWE9emcsdC5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIER0KFcodCkuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKX0sdC5jcmVhdG9yPVcsdC5sb2NhbD1xdCx0Lm1hdGNoZXI9cnQsdC5tb3VzZT1GdCx0Lm5hbWVzcGFjZT0kLHQubmFtZXNwYWNlcz1WLHQuY2xpZW50UG9pbnQ9QnQsdC5zZWxlY3Q9RHQsdC5zZWxlY3RBbGw9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBSdChbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyBSdChbbnVsbD09dD9bXTp0XSx6dCl9LHQuc2VsZWN0aW9uPUx0LHQuc2VsZWN0b3I9USx0LnNlbGVjdG9yQWxsPUssdC5zdHlsZT1sdCx0LnRvdWNoPUl0LHQudG91Y2hlcz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPVl0KCkudG91Y2hlcyk7Zm9yKHZhciBlPTAscj1uP24ubGVuZ3RoOjAsaT1uZXcgQXJyYXkocik7ZTxyOysrZSlpW2VdPUJ0KHQsbltlXSk7cmV0dXJuIGl9LHQud2luZG93PXN0LHQuY3VzdG9tRXZlbnQ9Q3QsdC5hcmM9ZnVuY3Rpb24oKXt2YXIgdD1HZyxuPVZnLGU9UmcoMCkscj1udWxsLGk9JGcsbz1XZyxhPVpnLHU9bnVsbDtmdW5jdGlvbiBmKCl7dmFyIGYsYyxzLGw9K3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLGg9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpLGQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyktSGcscD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1IZyx2PUxnKHAtZCksZz1wPmQ7aWYodXx8KHU9Zj1HaSgpKSxoPGwmJihjPWgsaD1sLGw9YyksaD5GZylpZih2PmpnLUZnKXUubW92ZVRvKGgqVWcoZCksaCpZZyhkKSksdS5hcmMoMCwwLGgsZCxwLCFnKSxsPkZnJiYodS5tb3ZlVG8obCpVZyhwKSxsKllnKHApKSx1LmFyYygwLDAsbCxwLGQsZykpO2Vsc2V7dmFyIHksXyxiPWQsbT1wLHg9ZCx3PXAsTT12LEE9dixUPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLzIsTj1UPkZnJiYocj8rci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6QmcobCpsK2gqaCkpLFM9T2coTGcoaC1sKS8yLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksRT1TLGs9UztpZihOPkZnKXt2YXIgQz1YZyhOL2wqWWcoVCkpLFA9WGcoTi9oKllnKFQpKTsoTS09MipDKT5GZz8oeCs9Qyo9Zz8xOi0xLHctPUMpOihNPTAseD13PShkK3ApLzIpLChBLT0yKlApPkZnPyhiKz1QKj1nPzE6LTEsbS09UCk6KEE9MCxiPW09KGQrcCkvMil9dmFyIHo9aCpVZyhiKSxSPWgqWWcoYiksTD1sKlVnKHcpLEQ9bCpZZyh3KTtpZihTPkZnKXt2YXIgVT1oKlVnKG0pLHE9aCpZZyhtKSxPPWwqVWcoeCksWT1sKllnKHgpO2lmKHY8SWcpe3ZhciBCPU0+Rmc/ZnVuY3Rpb24odCxuLGUscixpLG8sYSx1KXt2YXIgZj1lLXQsYz1yLW4scz1hLWksbD11LW8saD0ocyoobi1vKS1sKih0LWkpKS8obCpmLXMqYyk7cmV0dXJuW3QraCpmLG4raCpjXX0oeixSLE8sWSxVLHEsTCxEKTpbTCxEXSxGPXotQlswXSxJPVItQlsxXSxIPVUtQlswXSxqPXEtQlsxXSxYPTEvWWcoKChzPShGKkgrSSpqKS8oQmcoRipGK0kqSSkqQmcoSCpIK2oqaikpKT4xPzA6czwtMT9JZzpNYXRoLmFjb3MocykpLzIpLEc9QmcoQlswXSpCWzBdK0JbMV0qQlsxXSk7RT1PZyhTLChsLUcpLyhYLTEpKSxrPU9nKFMsKGgtRykvKFgrMSkpfX1BPkZnP2s+Rmc/KHk9UWcoTyxZLHosUixoLGssZyksXz1RZyhVLHEsTCxELGgsayxnKSx1Lm1vdmVUbyh5LmN4K3kueDAxLHkuY3kreS55MDEpLGs8Uz91LmFyYyh5LmN4LHkuY3ksayxEZyh5LnkwMSx5LngwMSksRGcoXy55MDEsXy54MDEpLCFnKToodS5hcmMoeS5jeCx5LmN5LGssRGcoeS55MDEseS54MDEpLERnKHkueTExLHkueDExKSwhZyksdS5hcmMoMCwwLGgsRGcoeS5jeSt5LnkxMSx5LmN4K3kueDExKSxEZyhfLmN5K18ueTExLF8uY3grXy54MTEpLCFnKSx1LmFyYyhfLmN4LF8uY3ksayxEZyhfLnkxMSxfLngxMSksRGcoXy55MDEsXy54MDEpLCFnKSkpOih1Lm1vdmVUbyh6LFIpLHUuYXJjKDAsMCxoLGIsbSwhZykpOnUubW92ZVRvKHosUiksbD5GZyYmTT5GZz9FPkZnPyh5PVFnKEwsRCxVLHEsbCwtRSxnKSxfPVFnKHosUixPLFksbCwtRSxnKSx1LmxpbmVUbyh5LmN4K3kueDAxLHkuY3kreS55MDEpLEU8Uz91LmFyYyh5LmN4LHkuY3ksRSxEZyh5LnkwMSx5LngwMSksRGcoXy55MDEsXy54MDEpLCFnKToodS5hcmMoeS5jeCx5LmN5LEUsRGcoeS55MDEseS54MDEpLERnKHkueTExLHkueDExKSwhZyksdS5hcmMoMCwwLGwsRGcoeS5jeSt5LnkxMSx5LmN4K3kueDExKSxEZyhfLmN5K18ueTExLF8uY3grXy54MTEpLGcpLHUuYXJjKF8uY3gsXy5jeSxFLERnKF8ueTExLF8ueDExKSxEZyhfLnkwMSxfLngwMSksIWcpKSk6dS5hcmMoMCwwLGwsdyx4LGcpOnUubGluZVRvKEwsRCl9ZWxzZSB1Lm1vdmVUbygwLDApO2lmKHUuY2xvc2VQYXRoKCksZilyZXR1cm4gdT1udWxsLGYrIiJ8fG51bGx9cmV0dXJuIGYuY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgZT0oK3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIscj0oK2kuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItSWcvMjtyZXR1cm5bVWcocikqZSxZZyhyKSplXX0sZi5pbm5lclJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxmKTp0fSxmLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm59LGYuY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOmV9LGYucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpyfSxmLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6aX0sZi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpvfSxmLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOmF9LGYuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1udWxsPT10P251bGw6dCxmKTp1fSxmfSx0LmFyZWE9cnksdC5saW5lPWV5LHQucGllPWZ1bmN0aW9uKCl7dmFyIHQ9b3ksbj1peSxlPW51bGwscj1SZygwKSxpPVJnKGpnKSxvPVJnKDApO2Z1bmN0aW9uIGEoYSl7dmFyIHUsZixjLHMsbCxoPWEubGVuZ3RoLGQ9MCxwPW5ldyBBcnJheShoKSx2PW5ldyBBcnJheShoKSxnPStyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx5PU1hdGgubWluKGpnLE1hdGgubWF4KC1qZyxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1nKSksXz1NYXRoLm1pbihNYXRoLmFicyh5KS9oLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxiPV8qKHk8MD8tMToxKTtmb3IodT0wO3U8aDsrK3UpKGw9dltwW3VdPXVdPSt0KGFbdV0sdSxhKSk+MCYmKGQrPWwpO2ZvcihudWxsIT1uP3Auc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBuKHZbdF0sdltlXSl9KTpudWxsIT1lJiZwLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShhW3RdLGFbbl0pfSksdT0wLGM9ZD8oeS1oKmIpL2Q6MDt1PGg7Kyt1LGc9cylmPXBbdV0scz1nKygobD12W2ZdKT4wP2wqYzowKStiLHZbZl09e2RhdGE6YVtmXSxpbmRleDp1LHZhbHVlOmwsc3RhcnRBbmdsZTpnLGVuZEFuZ2xlOnMscGFkQW5nbGU6X307cmV0dXJuIHZ9cmV0dXJuIGEudmFsdWU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpSZygrbiksYSk6dH0sYS5zb3J0VmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZT1udWxsLGEpOm59LGEuc29ydD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG49bnVsbCxhKTplfSxhLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6cn0sYS5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTppfSxhLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOm99LGF9LHQuYXJlYVJhZGlhbD1seSx0LnJhZGlhbEFyZWE9bHksdC5saW5lUmFkaWFsPXN5LHQucmFkaWFsTGluZT1zeSx0LnBvaW50UmFkaWFsPWh5LHQubGlua0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4gZ3koeXkpfSx0LmxpbmtWZXJ0aWNhbD1mdW5jdGlvbigpe3JldHVybiBneShfeSl9LHQubGlua1JhZGlhbD1mdW5jdGlvbigpe3ZhciB0PWd5KGJ5KTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0fSx0LnN5bWJvbD1mdW5jdGlvbigpe3ZhciB0PVJnKG15KSxuPVJnKDY0KSxlPW51bGw7ZnVuY3Rpb24gcigpe3ZhciByO2lmKGV8fChlPXI9R2koKSksdC5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhlLCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscilyZXR1cm4gZT1udWxsLHIrIiJ8fG51bGx9cmV0dXJuIHIudHlwZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKG4pLHIpOnR9LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxyKTpufSxyLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOnQscik6ZX0scn0sdC5zeW1ib2xzPVV5LHQuc3ltYm9sQ2lyY2xlPW15LHQuc3ltYm9sQ3Jvc3M9eHksdC5zeW1ib2xEaWFtb25kPUF5LHQuc3ltYm9sU3F1YXJlPWt5LHQuc3ltYm9sU3Rhcj1FeSx0LnN5bWJvbFRyaWFuZ2xlPVB5LHQuc3ltYm9sV3llPUR5LHQuY3VydmVCYXNpc0Nsb3NlZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEJ5KHQpfSx0LmN1cnZlQmFzaXNPcGVuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnkodCl9LHQuY3VydmVCYXNpcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFl5KHQpfSx0LmN1cnZlQnVuZGxlPUh5LHQuY3VydmVDYXJkaW5hbENsb3NlZD0keSx0LmN1cnZlQ2FyZGluYWxPcGVuPVp5LHQuY3VydmVDYXJkaW5hbD1HeSx0LmN1cnZlQ2F0bXVsbFJvbUNsb3NlZD1uXyx0LmN1cnZlQ2F0bXVsbFJvbU9wZW49cl8sdC5jdXJ2ZUNhdG11bGxSb209S3ksdC5jdXJ2ZUxpbmVhckNsb3NlZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGlfKHQpfSx0LmN1cnZlTGluZWFyPUtnLHQuY3VydmVNb25vdG9uZVg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjXyh0KX0sdC5jdXJ2ZU1vbm90b25lWT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHNfKHQpfSx0LmN1cnZlTmF0dXJhbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGhfKHQpfSx0LmN1cnZlU3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBfKHQsLjUpfSx0LmN1cnZlU3RlcEFmdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcF8odCwxKX0sdC5jdXJ2ZVN0ZXBCZWZvcmU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwXyh0LDApfSx0LnN0YWNrPWZ1bmN0aW9uKCl7dmFyIHQ9UmcoW10pLG49Z18sZT12XyxyPXlfO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1PXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGY9aS5sZW5ndGgsYz11Lmxlbmd0aCxzPW5ldyBBcnJheShjKTtmb3Iobz0wO288YzsrK28pe2Zvcih2YXIgbCxoPXVbb10sZD1zW29dPW5ldyBBcnJheShmKSxwPTA7cDxmOysrcClkW3BdPWw9WzAsK3IoaVtwXSxoLHAsaSldLGwuZGF0YT1pW3BdO2Qua2V5PWh9Zm9yKG89MCxhPW4ocyk7bzxjOysrbylzW2Fbb11dLmluZGV4PW87cmV0dXJuIGUocyxhKSxzfXJldHVybiBpLmtleXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpSZyhkeS5jYWxsKG4pKSxpKTp0fSxpLnZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGkpOnJ9LGkub3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9nXzoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKGR5LmNhbGwodCkpLGkpOm59LGkub2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/dl86dCxpKTplfSxpfSx0LnN0YWNrT2Zmc2V0RXhwYW5kPWZ1bmN0aW9uKHQsbil7aWYoKHI9dC5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9dFswXS5sZW5ndGg7bzxhOysrbyl7Zm9yKGk9ZT0wO2U8cjsrK2UpaSs9dFtlXVtvXVsxXXx8MDtpZihpKWZvcihlPTA7ZTxyOysrZSl0W2VdW29dWzFdLz1pfXZfKHQsbil9fSx0LnN0YWNrT2Zmc2V0RGl2ZXJnaW5nPWZ1bmN0aW9uKHQsbil7aWYoKHU9dC5sZW5ndGgpPjEpZm9yKHZhciBlLHIsaSxvLGEsdSxmPTAsYz10W25bMF1dLmxlbmd0aDtmPGM7KytmKWZvcihvPWE9MCxlPTA7ZTx1OysrZSkoaT0ocj10W25bZV1dW2ZdKVsxXS1yWzBdKT49MD8oclswXT1vLHJbMV09bys9aSk6aTwwPyhyWzFdPWEsclswXT1hKz1pKTpyWzBdPW99LHQuc3RhY2tPZmZzZXROb25lPXZfLHQuc3RhY2tPZmZzZXRTaWxob3VldHRlPWZ1bmN0aW9uKHQsbil7aWYoKGU9dC5sZW5ndGgpPjApe2Zvcih2YXIgZSxyPTAsaT10W25bMF1dLG89aS5sZW5ndGg7cjxvOysrcil7Zm9yKHZhciBhPTAsdT0wO2E8ZTsrK2EpdSs9dFthXVtyXVsxXXx8MDtpW3JdWzFdKz1pW3JdWzBdPS11LzJ9dl8odCxuKX19LHQuc3RhY2tPZmZzZXRXaWdnbGU9ZnVuY3Rpb24odCxuKXtpZigoaT10Lmxlbmd0aCk+MCYmKHI9KGU9dFtuWzBdXSkubGVuZ3RoKT4wKXtmb3IodmFyIGUscixpLG89MCxhPTE7YTxyOysrYSl7Zm9yKHZhciB1PTAsZj0wLGM9MDt1PGk7Kyt1KXtmb3IodmFyIHM9dFtuW3VdXSxsPXNbYV1bMV18fDAsaD0obC0oc1thLTFdWzFdfHwwKSkvMixkPTA7ZDx1OysrZCl7dmFyIHA9dFtuW2RdXTtoKz0ocFthXVsxXXx8MCktKHBbYS0xXVsxXXx8MCl9Zis9bCxjKz1oKmx9ZVthLTFdWzFdKz1lW2EtMV1bMF09byxmJiYoby09Yy9mKX1lW2EtMV1bMV0rPWVbYS0xXVswXT1vLHZfKHQsbil9fSx0LnN0YWNrT3JkZXJBc2NlbmRpbmc9X18sdC5zdGFja09yZGVyRGVzY2VuZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gX18odCkucmV2ZXJzZSgpfSx0LnN0YWNrT3JkZXJJbnNpZGVPdXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyPXQubGVuZ3RoLGk9dC5tYXAoYl8pLG89Z18odCkuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBpW25dLWlbdF19KSxhPTAsdT0wLGY9W10sYz1bXTtmb3Iobj0wO248cjsrK24pZT1vW25dLGE8dT8oYSs9aVtlXSxmLnB1c2goZSkpOih1Kz1pW2VdLGMucHVzaChlKSk7cmV0dXJuIGMucmV2ZXJzZSgpLmNvbmNhdChmKX0sdC5zdGFja09yZGVyTm9uZT1nXyx0LnN0YWNrT3JkZXJSZXZlcnNlPWZ1bmN0aW9uKHQpe3JldHVybiBnXyh0KS5yZXZlcnNlKCl9LHQudGltZUludGVydmFsPVJoLHQudGltZU1pbGxpc2Vjb25kPUxoLHQudGltZU1pbGxpc2Vjb25kcz1EaCx0LnV0Y01pbGxpc2Vjb25kPUxoLHQudXRjTWlsbGlzZWNvbmRzPURoLHQudGltZVNlY29uZD1PaCx0LnRpbWVTZWNvbmRzPVloLHQudXRjU2Vjb25kPU9oLHQudXRjU2Vjb25kcz1ZaCx0LnRpbWVNaW51dGU9QmgsdC50aW1lTWludXRlcz1GaCx0LnRpbWVIb3VyPUloLHQudGltZUhvdXJzPUhoLHQudGltZURheT1qaCx0LnRpbWVEYXlzPVhoLHQudGltZVdlZWs9VmgsdC50aW1lV2Vla3M9dGQsdC50aW1lU3VuZGF5PVZoLHQudGltZVN1bmRheXM9dGQsdC50aW1lTW9uZGF5PSRoLHQudGltZU1vbmRheXM9bmQsdC50aW1lVHVlc2RheT1XaCx0LnRpbWVUdWVzZGF5cz1lZCx0LnRpbWVXZWRuZXNkYXk9WmgsdC50aW1lV2VkbmVzZGF5cz1yZCx0LnRpbWVUaHVyc2RheT1RaCx0LnRpbWVUaHVyc2RheXM9aWQsdC50aW1lRnJpZGF5PUpoLHQudGltZUZyaWRheXM9b2QsdC50aW1lU2F0dXJkYXk9S2gsdC50aW1lU2F0dXJkYXlzPWFkLHQudGltZU1vbnRoPXVkLHQudGltZU1vbnRocz1mZCx0LnRpbWVZZWFyPWNkLHQudGltZVllYXJzPXNkLHQudXRjTWludXRlPWxkLHQudXRjTWludXRlcz1oZCx0LnV0Y0hvdXI9ZGQsdC51dGNIb3Vycz1wZCx0LnV0Y0RheT12ZCx0LnV0Y0RheXM9Z2QsdC51dGNXZWVrPV9kLHQudXRjV2Vla3M9VGQsdC51dGNTdW5kYXk9X2QsdC51dGNTdW5kYXlzPVRkLHQudXRjTW9uZGF5PWJkLHQudXRjTW9uZGF5cz1OZCx0LnV0Y1R1ZXNkYXk9bWQsdC51dGNUdWVzZGF5cz1TZCx0LnV0Y1dlZG5lc2RheT14ZCx0LnV0Y1dlZG5lc2RheXM9RWQsdC51dGNUaHVyc2RheT13ZCx0LnV0Y1RodXJzZGF5cz1rZCx0LnV0Y0ZyaWRheT1NZCx0LnV0Y0ZyaWRheXM9Q2QsdC51dGNTYXR1cmRheT1BZCx0LnV0Y1NhdHVyZGF5cz1QZCx0LnV0Y01vbnRoPXpkLHQudXRjTW9udGhzPVJkLHQudXRjWWVhcj1MZCx0LnV0Y1llYXJzPURkLHQudGltZUZvcm1hdERlZmF1bHRMb2NhbGU9UXAsdC50aW1lRm9ybWF0TG9jYWxlPVlkLHQuaXNvRm9ybWF0PUpwLHQuaXNvUGFyc2U9S3AsdC5ub3c9aXIsdC50aW1lcj11cix0LnRpbWVyRmx1c2g9ZnIsdC50aW1lb3V0PWhyLHQuaW50ZXJ2YWw9ZnVuY3Rpb24odCxuLGUpe3ZhciByPW5ldyBhcixpPW47cmV0dXJuIG51bGw9PW4/KHIucmVzdGFydCh0LG4sZSkscik6KG49K24sZT1udWxsPT1lP2lyKCk6K2Usci5yZXN0YXJ0KGZ1bmN0aW9uIG8oYSl7YSs9aSxyLnJlc3RhcnQobyxpKz1uLGUpLHQoYSl9LG4sZSkscil9LHQudHJhbnNpdGlvbj16cix0LmFjdGl2ZT1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10Ll9fdHJhbnNpdGlvbjtpZihpKWZvcihyIGluIG49bnVsbD09bj9udWxsOm4rIiIsaSlpZigoZT1pW3JdKS5zdGF0ZT5nciYmZS5uYW1lPT09bilyZXR1cm4gbmV3IFByKFtbdF1dLGxpLG4sK3IpO3JldHVybiBudWxsfSx0LmludGVycnVwdD1Ocix0LnZvcm9ub2k9ZnVuY3Rpb24oKXt2YXIgdD14XyxuPXdfLGU9bnVsbDtmdW5jdGlvbiByKHIpe3JldHVybiBuZXcgZWIoci5tYXAoZnVuY3Rpb24oZSxpKXt2YXIgbz1bTWF0aC5yb3VuZCh0KGUsaSxyKS9LXykqS18sTWF0aC5yb3VuZChuKGUsaSxyKS9LXykqS19dO3JldHVybiBvLmluZGV4PWksby5kYXRhPWUsb30pLGUpfXJldHVybiByLnBvbHlnb25zPWZ1bmN0aW9uKHQpe3JldHVybiByKHQpLnBvbHlnb25zKCl9LHIubGlua3M9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkubGlua3MoKX0sci50cmlhbmdsZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkudHJpYW5nbGVzKCl9LHIueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOm1fKCtuKSxyKTp0fSxyLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDptXygrdCkscik6bn0sci5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOltbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dLHIpOmUmJltbZVswXVswXSxlWzBdWzFdXSxbZVsxXVswXSxlWzFdWzFdXV19LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6W1swLDBdLFsrdFswXSwrdFsxXV1dLHIpOmUmJltlWzFdWzBdLWVbMF1bMF0sZVsxXVsxXS1lWzBdWzFdXX0scn0sdC56b29tPWZ1bmN0aW9uKCl7dmFyIG4sZSxyPXNiLGk9bGIsbz12YixhPWRiLHU9cGIsZj1bMCwxLzBdLGM9W1stMS8wLC0xLzBdLFsxLzAsMS8wXV0scz0yNTAsbD1xZSxoPVtdLGQ9SSgic3RhcnQiLCJ6b29tIiwiZW5kIikscD01MDAsdj0xNTAsZz0wO2Z1bmN0aW9uIHkodCl7dC5wcm9wZXJ0eSgiX196b29tIixoYikub24oIndoZWVsLnpvb20iLEEpLm9uKCJtb3VzZWRvd24uem9vbSIsVCkub24oImRibGNsaWNrLnpvb20iLE4pLmZpbHRlcih1KS5vbigidG91Y2hzdGFydC56b29tIixTKS5vbigidG91Y2htb3ZlLnpvb20iLEUpLm9uKCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb20iLGspLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBfKHQsbil7cmV0dXJuKG49TWF0aC5tYXgoZlswXSxNYXRoLm1pbihmWzFdLG4pKSk9PT10Lms/dDpuZXcgb2Iobix0LngsdC55KX1mdW5jdGlvbiBiKHQsbixlKXt2YXIgcj1uWzBdLWVbMF0qdC5rLGk9blsxXS1lWzFdKnQuaztyZXR1cm4gcj09PXQueCYmaT09PXQueT90Om5ldyBvYih0LmsscixpKX1mdW5jdGlvbiBtKHQpe3JldHVyblsoK3RbMF1bMF0rICt0WzFdWzBdKS8yLCgrdFswXVsxXSsgK3RbMV1bMV0pLzJdfWZ1bmN0aW9uIHgodCxuLGUpe3Qub24oInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7dyh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKX0pLm9uKCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbSIsZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pLnR3ZWVuKCJ6b29tIixmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cyxyPXcodGhpcyx0KSxvPWkuYXBwbHkodGhpcyx0KSxhPWV8fG0obyksdT1NYXRoLm1heChvWzFdWzBdLW9bMF1bMF0sb1sxXVsxXS1vWzBdWzFdKSxmPXRoaXMuX196b29tLGM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLHQpOm4scz1sKGYuaW52ZXJ0KGEpLmNvbmNhdCh1L2YuayksYy5pbnZlcnQoYSkuY29uY2F0KHUvYy5rKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKDE9PT10KXQ9YztlbHNle3ZhciBuPXModCksZT11L25bMl07dD1uZXcgb2IoZSxhWzBdLW5bMF0qZSxhWzFdLW5bMV0qZSl9ci56b29tKG51bGwsdCl9fSl9ZnVuY3Rpb24gdyh0LG4pe2Zvcih2YXIgZSxyPTAsaT1oLmxlbmd0aDtyPGk7KytyKWlmKChlPWhbcl0pLnRoYXQ9PT10KXJldHVybiBlO3JldHVybiBuZXcgTSh0LG4pfWZ1bmN0aW9uIE0odCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLmluZGV4PS0xLHRoaXMuYWN0aXZlPTAsdGhpcy5leHRlbnQ9aS5hcHBseSh0LG4pfWZ1bmN0aW9uIEEoKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHQ9dyh0aGlzLGFyZ3VtZW50cyksbj10aGlzLl9fem9vbSxlPU1hdGgubWF4KGZbMF0sTWF0aC5taW4oZlsxXSxuLmsqTWF0aC5wb3coMixhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpKSxpPUZ0KHRoaXMpO2lmKHQud2hlZWwpdC5tb3VzZVswXVswXT09PWlbMF0mJnQubW91c2VbMF1bMV09PT1pWzFdfHwodC5tb3VzZVsxXT1uLmludmVydCh0Lm1vdXNlWzBdPWkpKSxjbGVhclRpbWVvdXQodC53aGVlbCk7ZWxzZXtpZihuLms9PT1lKXJldHVybjt0Lm1vdXNlPVtpLG4uaW52ZXJ0KGkpXSxOcih0aGlzKSx0LnN0YXJ0KCl9Y2IoKSx0LndoZWVsPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LndoZWVsPW51bGwsdC5lbmQoKX0sdiksdC56b29tKCJtb3VzZSIsbyhiKF8obixlKSx0Lm1vdXNlWzBdLHQubW91c2VbMV0pLHQuZXh0ZW50LGMpKX19ZnVuY3Rpb24gVCgpe2lmKCFlJiZyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG49dyh0aGlzLGFyZ3VtZW50cyksaT1EdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuem9vbSIsZnVuY3Rpb24oKXtpZihjYigpLCFuLm1vdmVkKXt2YXIgZT10LmV2ZW50LmNsaWVudFgtdSxyPXQuZXZlbnQuY2xpZW50WS1mO24ubW92ZWQ9ZSplK3Iqcj5nfW4uem9vbSgibW91c2UiLG8oYihuLnRoYXQuX196b29tLG4ubW91c2VbMF09RnQobi50aGF0KSxuLm1vdXNlWzFdKSxuLmV4dGVudCxjKSl9LCEwKS5vbigibW91c2V1cC56b29tIixmdW5jdGlvbigpe2kub24oIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbSIsbnVsbCksR3QodC5ldmVudC52aWV3LG4ubW92ZWQpLGNiKCksbi5lbmQoKX0sITApLGE9RnQodGhpcyksdT10LmV2ZW50LmNsaWVudFgsZj10LmV2ZW50LmNsaWVudFk7WHQodC5ldmVudC52aWV3KSxmYigpLG4ubW91c2U9W2EsdGhpcy5fX3pvb20uaW52ZXJ0KGEpXSxOcih0aGlzKSxuLnN0YXJ0KCl9fWZ1bmN0aW9uIE4oKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG49dGhpcy5fX3pvb20sZT1GdCh0aGlzKSxhPW4uaW52ZXJ0KGUpLHU9bi5rKih0LmV2ZW50LnNoaWZ0S2V5Py41OjIpLGY9byhiKF8obix1KSxlLGEpLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGMpO2NiKCkscz4wP0R0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihzKS5jYWxsKHgsZixlKTpEdCh0aGlzKS5jYWxsKHkudHJhbnNmb3JtLGYpfX1mdW5jdGlvbiBTKCl7aWYoci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBlLGksbyxhLHU9dyh0aGlzLGFyZ3VtZW50cyksZj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGM9Zi5sZW5ndGg7Zm9yKGZiKCksaT0wO2k8YzsrK2kpYT1bYT1JdCh0aGlzLGYsKG89ZltpXSkuaWRlbnRpZmllciksdGhpcy5fX3pvb20uaW52ZXJ0KGEpLG8uaWRlbnRpZmllcl0sdS50b3VjaDA/dS50b3VjaDF8fCh1LnRvdWNoMT1hKToodS50b3VjaDA9YSxlPSEwKTtpZihuJiYobj1jbGVhclRpbWVvdXQobiksIXUudG91Y2gxKSlyZXR1cm4gdS5lbmQoKSx2b2lkKChhPUR0KHRoaXMpLm9uKCJkYmxjbGljay56b29tIikpJiZhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7ZSYmKG49c2V0VGltZW91dChmdW5jdGlvbigpe249bnVsbH0scCksTnIodGhpcyksdS5zdGFydCgpKX19ZnVuY3Rpb24gRSgpe3ZhciBlLHIsaSxhLHU9dyh0aGlzLGFyZ3VtZW50cyksZj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLHM9Zi5sZW5ndGg7Zm9yKGNiKCksbiYmKG49Y2xlYXJUaW1lb3V0KG4pKSxlPTA7ZTxzOysrZSlpPUl0KHRoaXMsZiwocj1mW2VdKS5pZGVudGlmaWVyKSx1LnRvdWNoMCYmdS50b3VjaDBbMl09PT1yLmlkZW50aWZpZXI/dS50b3VjaDBbMF09aTp1LnRvdWNoMSYmdS50b3VjaDFbMl09PT1yLmlkZW50aWZpZXImJih1LnRvdWNoMVswXT1pKTtpZihyPXUudGhhdC5fX3pvb20sdS50b3VjaDEpe3ZhciBsPXUudG91Y2gwWzBdLGg9dS50b3VjaDBbMV0sZD11LnRvdWNoMVswXSxwPXUudG91Y2gxWzFdLHY9KHY9ZFswXS1sWzBdKSp2Kyh2PWRbMV0tbFsxXSkqdixnPShnPXBbMF0taFswXSkqZysoZz1wWzFdLWhbMV0pKmc7cj1fKHIsTWF0aC5zcXJ0KHYvZykpLGk9WyhsWzBdK2RbMF0pLzIsKGxbMV0rZFsxXSkvMl0sYT1bKGhbMF0rcFswXSkvMiwoaFsxXStwWzFdKS8yXX1lbHNle2lmKCF1LnRvdWNoMClyZXR1cm47aT11LnRvdWNoMFswXSxhPXUudG91Y2gwWzFdfXUuem9vbSgidG91Y2giLG8oYihyLGksYSksdS5leHRlbnQsYykpfWZ1bmN0aW9uIGsoKXt2YXIgbixyLGk9dyh0aGlzLGFyZ3VtZW50cyksbz10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGE9by5sZW5ndGg7Zm9yKGZiKCksZSYmY2xlYXJUaW1lb3V0KGUpLGU9c2V0VGltZW91dChmdW5jdGlvbigpe2U9bnVsbH0scCksbj0wO248YTsrK24pcj1vW25dLGkudG91Y2gwJiZpLnRvdWNoMFsyXT09PXIuaWRlbnRpZmllcj9kZWxldGUgaS50b3VjaDA6aS50b3VjaDEmJmkudG91Y2gxWzJdPT09ci5pZGVudGlmaWVyJiZkZWxldGUgaS50b3VjaDE7aS50b3VjaDEmJiFpLnRvdWNoMCYmKGkudG91Y2gwPWkudG91Y2gxLGRlbGV0ZSBpLnRvdWNoMSksaS50b3VjaDA/aS50b3VjaDBbMV09dGhpcy5fX3pvb20uaW52ZXJ0KGkudG91Y2gwWzBdKTppLmVuZCgpfXJldHVybiB5LnRyYW5zZm9ybT1mdW5jdGlvbih0LG4pe3ZhciBlPXQuc2VsZWN0aW9uP3Quc2VsZWN0aW9uKCk6dDtlLnByb3BlcnR5KCJfX3pvb20iLGhiKSx0IT09ZT94KHQsbik6ZS5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCl7dyh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKS56b29tKG51bGwsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bikuZW5kKCl9KX0seS5zY2FsZUJ5PWZ1bmN0aW9uKHQsbil7eS5zY2FsZVRvKHQsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3pvb20uayooImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bil9KX0seS5zY2FsZVRvPWZ1bmN0aW9uKHQsbil7eS50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dGhpcy5fX3pvb20scj1tKHQpLGE9ZS5pbnZlcnQociksdT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuO3JldHVybiBvKGIoXyhlLHUpLHIsYSksdCxjKX0pfSx5LnRyYW5zbGF0ZUJ5PWZ1bmN0aW9uKHQsbixlKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7cmV0dXJuIG8odGhpcy5fX3pvb20udHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4sImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYyl9KX0seS50cmFuc2xhdGVUbz1mdW5jdGlvbih0LG4sZSl7eS50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLHI9dGhpcy5fX3pvb20sYT1tKHQpO3JldHVybiBvKGFiLnRyYW5zbGF0ZShhWzBdLGFbMV0pLnNjYWxlKHIuaykudHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBuPy1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotbiwiZnVuY3Rpb24iPT10eXBlb2YgZT8tZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6LWUpLHQsYyl9KX0sTS5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLmluZGV4PWgucHVzaCh0aGlzKS0xLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sem9vbTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLm1vdXNlJiYibW91c2UiIT09dCYmKHRoaXMubW91c2VbMV09bi5pbnZlcnQodGhpcy5tb3VzZVswXSkpLHRoaXMudG91Y2gwJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gwWzFdPW4uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKSksdGhpcy50b3VjaDEmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDFbMV09bi5pbnZlcnQodGhpcy50b3VjaDFbMF0pKSx0aGlzLnRoYXQuX196b29tPW4sdGhpcy5lbWl0KCJ6b29tIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihoLnNwbGljZSh0aGlzLmluZGV4LDEpLHRoaXMuaW5kZXg9LTEsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtDdChuZXcgaWIoeSx0LHRoaXMudGhhdC5fX3pvb20pLGQuYXBwbHksZCxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSx5LndoZWVsRGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYigrdCkseSk6YX0seS5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYighIXQpLHkpOnJ9LHkudG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cmIoISF0KSx5KTp1fSx5LmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSx5KTppfSx5LnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmWzBdPSt0WzBdLGZbMV09K3RbMV0seSk6W2ZbMF0sZlsxXV19LHkudHJhbnNsYXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjWzBdWzBdPSt0WzBdWzBdLGNbMV1bMF09K3RbMV1bMF0sY1swXVsxXT0rdFswXVsxXSxjWzFdWzFdPSt0WzFdWzFdLHkpOltbY1swXVswXSxjWzBdWzFdXSxbY1sxXVswXSxjWzFdWzFdXV19LHkuY29uc3RyYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQseSk6b30seS5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0rdCx5KTpzfSx5LmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQseSk6bH0seS5vbj1mdW5jdGlvbigpe3ZhciB0PWQub24uYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiB0PT09ZD95OnR9LHkuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0odD0rdCkqdCx5KTpNYXRoLnNxcnQoZyl9LHl9LHQuem9vbVRyYW5zZm9ybT11Yix0Lnpvb21JZGVudGl0eT1hYixPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jb2xvci1zY2FsZS9wYWxldHRlcy5qcwp2YXIgcGY7CihmdW5jdGlvbihiKXtiLnBhbGV0dGVzPXtnb29nbGVTdGFuZGFyZDoiI2RiNDQzNyAjZmY3MDQzICNmNGI0MDAgIzBmOWQ1OCAjMDA3OTZiICMwMGFjYzEgIzQyODVmNCAjNWM2YmMwICNhYjQ3YmMiLnNwbGl0KCIgIiksZ29vZ2xlQ29vbDoiIzllOWQyNCAjMGY5ZDU4ICMwMDc5NmIgIzAwYWNjMSAjNDI4NWY0ICM1YzZiYzAgIzYwN2Q4YiIuc3BsaXQoIiAiKSxnb29nbGVXYXJtOiIjNzk1NTQ4ICNhYjQ3YmMgI2YwNjI5MiAjYzIxODViICNkYjQ0MzcgI2ZmNzA0MyAjZjRiNDAwIi5zcGxpdCgiICIpLGdvb2dsZUNvbG9yQmxpbmRBc3Npc3Q6IiNmZjcwNDMgIzAwQUNDMSAjQUI0N0JDICMyQTU2QzYgIzBiODA0MyAjRjdDQjREICNjMGNhMzMgIzVlMzViMSAjQTUyNzE0Ii5zcGxpdCgiICIpLHRlbnNvcmJvYXJkQ29sb3JCbGluZEFzc2lzdDoiI2ZmNzA0MyAjMDA3N2JiICNjYzMzMTEgIzMzYmJlZSAjZWUzMzc3ICMwMDk5ODggI2JiYmJiYiIuc3BsaXQoIiAiKSxjb2xvckJsaW5kQXNzaXN0MToiIzQ0NzdhYSAjNDRhYWFhICNhYWFhNDQgI2FhNzc0NCAjYWE0NDU1ICNhYTQ0ODgiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDI6IiM4OGNjZWUgIzQ0YWE5OSAjMTE3NzMzICM5OTk5MzMgI2RkY2M3NyAjY2M2Njc3ICM4ODIyNTUgI2FhNDQ5OSIuc3BsaXQoIiAiKSwKY29sb3JCbGluZEFzc2lzdDM6IiMzMzIyODggIzY2OTljYyAjODhjY2VlICM0NGFhOTkgIzExNzczMyAjOTk5OTMzICNkZGNjNzcgI2NjNjY3NyAjYWE0NDY2ICM4ODIyNTUgIzY2MTEwMCAjYWE0NDk5Ii5zcGxpdCgiICIpLGNvbG9yQmxpbmRBc3Npc3Q0OiIjNDQ3N2FhICM2NmNjZWUgIzIyODgzMyAjY2NiYjQ0ICNlZTY2NzcgI2FhMzM3NyAjYmJiYmJiIi5zcGxpdCgiICIpLGNvbG9yQmxpbmRBc3Npc3Q1OiIjRkY2REI2ICM5MjAwMDAgIzkyNDkwMCAjREJEMTAwICMyNEZGMjQgIzAwNkREQiAjNDkwMDkyIi5zcGxpdCgiICIpLG1sZGFzaDoiI0U0N0VBRCAjRjQ2NDBEICNGQUEzMDAgI0Y1RTYzNiAjMDBBMDc3ICMwMDc3QjggIzAwQjdFRCIuc3BsaXQoIiAiKX07Yi5zdGFuZGFyZD1iLnBhbGV0dGVzLnRlbnNvcmJvYXJkQ29sb3JCbGluZEFzc2lzdH0pKHBmfHwocGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jb2xvci1zY2FsZS9jb2xvclNjYWxlLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGgsayl7ZnVuY3Rpb24gdCgpe2wuc2V0RG9tYWluKGsoKSl9Y29uc3QgbD1uZXcgZjtoLmFkZExpc3RlbmVyKHQpO3QoKTtyZXR1cm4gcD0+bC5nZXRDb2xvcihwKX1jbGFzcyBme2NvbnN0cnVjdG9yKGg9Yi5zdGFuZGFyZCl7dGhpcy5wYWxldHRlPWg7dGhpcy5pZGVudGlmaWVycz1kMy5tYXAoKX1zZXREb21haW4oaCl7dGhpcy5pZGVudGlmaWVycz1kMy5tYXAoKTtoLmZvckVhY2goKGssdCk9Pnt0aGlzLmlkZW50aWZpZXJzLnNldChrLHRoaXMucGFsZXR0ZVt0JXRoaXMucGFsZXR0ZS5sZW5ndGhdKX0pfWdldENvbG9yKGgpe2lmKCF0aGlzLmlkZW50aWZpZXJzLmhhcyhoKSl0aHJvdyBFcnJvcihgU3RyaW5nICR7aH0gd2FzIG5vdCBpbiB0aGUgZG9tYWluLmApO3JldHVybiB0aGlzLmlkZW50aWZpZXJzLmdldChoKX19Yi5Db2xvclNjYWxlPWY7Yi5ydW5zQ29sb3JTY2FsZT1kKHZjLnJ1bnNTdG9yZSwoKT0+dmMucnVuc1N0b3JlLmdldFJ1bnMoKSk7CmIuZXhwZXJpbWVudHNDb2xvclNjYWxlPWQodmMuZXhwZXJpbWVudHNTdG9yZSwoKT0+dmMuZXhwZXJpbWVudHNTdG9yZS5nZXRFeHBlcmltZW50cygpLm1hcCgoe25hbWU6aH0pPT5oKSl9KShwZnx8KHBmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaWNvbi1idXR0b24vcGFwZXItaWNvbi1idXR0b24uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaWNvbi1idXR0b24iLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJidXR0b24iLHRhYmluZGV4OiIwIn0sYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NyYzp7dHlwZTpTdHJpbmd9LGljb246e3R5cGU6U3RyaW5nfSxhbHQ6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfYWx0Q2hhbmdlZCJ9fSxfYWx0Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3ZhciBmPXRoaXMuZ2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIik7ZiYmZCE9Znx8dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRhc2hib2FyZC1jb21tb24vdGYtbXVsdGktY2hlY2tib3guanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLW11bHRpLWNoZWNrYm94Iixwcm9wZXJ0aWVzOntuYW1lczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LGNvbG9yaW5nOnt0eXBlOk9iamVjdCx2YWx1ZTp7Z2V0Q29sb3I6KCk9PiIifX0scmVnZXg6e3R5cGU6U3RyaW5nLG5vdGlmeTohMCx2YWx1ZToiIn0sX3JlZ2V4Ont0eXBlOk9iamVjdCxjb21wdXRlZDoiX21ha2VSZWdleChyZWdleCkifSxuYW1lc01hdGNoaW5nUmVnZXg6e3R5cGU6QXJyYXksY29tcHV0ZWQ6ImNvbXB1dGVOYW1lc01hdGNoaW5nUmVnZXgobmFtZXMuKiwgX3JlZ2V4KSJ9LHNlbGVjdGlvblN0YXRlOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6KCk9Pih7fSl9LG91dFNlbGVjdGVkOnt0eXBlOkFycmF5LG5vdGlmeTohMCxjb21wdXRlZDoiY29tcHV0ZU91dFNlbGVjdGVkKG5hbWVzTWF0Y2hpbmdSZWdleC4qLCBzZWxlY3Rpb25TdGF0ZS4qKSJ9LG1heE5hbWVzVG9FbmFibGVCeURlZmF1bHQ6e3R5cGU6TnVtYmVyLAp2YWx1ZTo0MH0sX2RlYm91bmNlZFJlZ2V4Q2hhbmdlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3ZhciBiPV8uZGVib3VuY2UoZD0+e3RoaXMucmVnZXg9ZH0sMTUwLHtsZWFkaW5nOiExfSk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy4kJCgiI25hbWVzLXJlZ2V4IikudmFsdWU7IiI9PWQ/dGhpcy5hc3luYygoKT0+e3RoaXMucmVnZXg9ZH0sMzApOmIoZCl9fX19LG9ic2VydmVyczpbIl9zZXRJc29sYXRvckljb24oc2VsZWN0aW9uU3RhdGUsIG5hbWVzKSJdLF9tYWtlUmVnZXg6ZnVuY3Rpb24oYil7dHJ5e3JldHVybiBuZXcgUmVnRXhwKGIpfWNhdGNoKGQpe3JldHVybiBudWxsfX0sX3NldElzb2xhdG9ySWNvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuc2VsZWN0aW9uU3RhdGUsZD1fLmZpbHRlcihfLnZhbHVlcyhiKSkubGVuZ3RoO0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuaXNvbGF0b3IiKSkuZm9yRWFjaChmdW5jdGlvbihmKXtmLmljb249CjE9PT1kJiZiW2YubmFtZV0/InJhZGlvLWJ1dHRvbi1jaGVja2VkIjoicmFkaW8tYnV0dG9uLXVuY2hlY2tlZCJ9KX0sY29tcHV0ZU5hbWVzTWF0Y2hpbmdSZWdleDpmdW5jdGlvbigpe2NvbnN0IGI9dGhpcy5fcmVnZXg7cmV0dXJuIGI/dGhpcy5uYW1lcy5maWx0ZXIoZD0+Yi50ZXN0KGQpKTp0aGlzLm5hbWVzfSxjb21wdXRlT3V0U2VsZWN0ZWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNlbGVjdGlvblN0YXRlLGQ9dGhpcy5uYW1lc01hdGNoaW5nUmVnZXgubGVuZ3RoPD10aGlzLm1heE5hbWVzVG9FbmFibGVCeURlZmF1bHQ7cmV0dXJuIHRoaXMubmFtZXNNYXRjaGluZ1JlZ2V4LmZpbHRlcihmPT5udWxsPT1iW2ZdP2Q6YltmXSl9LHN5bmNocm9uaXplQ29sb3JzOmZ1bmN0aW9uKCl7dGhpcy5fc2V0SXNvbGF0b3JJY29uKCk7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInBhcGVyLWNoZWNrYm94IikuZm9yRWFjaChiPT57Y29uc3QgZD10aGlzLmNvbG9yaW5nLmdldENvbG9yKGIubmFtZSk7CmIudXBkYXRlU3R5bGVzKHsiLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yIjpkLCItLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yIjpkLCItLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciI6ZCwiLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yIjpkfSl9KTt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmlzb2xhdG9yIikuZm9yRWFjaChiPT57Y29uc3QgZD10aGlzLmNvbG9yaW5nLmdldENvbG9yKGIubmFtZSk7Yi5zdHlsZS5jb2xvcj1kfSk7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMudXBkYXRlU3R5bGVzKCl9KX0sX2lzb2xhdGVOYW1lOmZ1bmN0aW9uKGIpe3ZhciBkPVBvbHltZXIuZG9tKGIpLmxvY2FsVGFyZ2V0Lm5hbWUsZj17fTt0aGlzLm5hbWVzLmZvckVhY2goZnVuY3Rpb24oaCl7ZltoXT1oPT1kfSk7dGhpcy5zZWxlY3Rpb25TdGF0ZT1mfSxfY2hlY2tib3hDaGFuZ2U6ZnVuY3Rpb24oYil7Yj0KUG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7Y29uc3QgZD1fLmNsb25lKHRoaXMuc2VsZWN0aW9uU3RhdGUpO2RbYi5uYW1lXT1iLmNoZWNrZWQ7dGhpcy5zZWxlY3Rpb25TdGF0ZT1kfSxfaXNDaGVja2VkOmZ1bmN0aW9uKGIpe3JldHVybi0xIT10aGlzLm91dFNlbGVjdGVkLmluZGV4T2YoYil9LHRvZ2dsZUFsbDpmdW5jdGlvbigpe2NvbnN0IGI9dGhpcy5uYW1lc01hdGNoaW5nUmVnZXguc29tZShmPT50aGlzLm91dFNlbGVjdGVkLmluY2x1ZGVzKGYpKSxkPXt9O3RoaXMubmFtZXMuZm9yRWFjaChmPT57ZFtmXT0hYn0pO3RoaXMuc2VsZWN0aW9uU3RhdGU9ZH19KX0pKHFkfHwocWQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ydW5zLXNlbGVjdG9yL3RmLXdici1zdHJpbmcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtd2JyLXN0cmluZyIscHJvcGVydGllczp7dmFsdWU6U3RyaW5nLF9wYXJ0czp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVQYXJ0cyh2YWx1ZSkifX0sX2NvbXB1dGVQYXJ0cyhiKXtjb25zdCBkPVtdLGY9L1svPV8sLV0vO2ZvcihudWxsPT1iJiYoYj0iIik7Oyl7Y29uc3QgaD1iLnNlYXJjaChmKTtpZigtMT09PWgpe2QucHVzaChiKTticmVha31lbHNlIGQucHVzaChiLnNsaWNlKDAsaCsxKSksYj1iLnNsaWNlKGgrMSl9cmV0dXJuIGR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcnVucy1zZWxlY3Rvci90Zi1ydW5zLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXJ1bnMtc2VsZWN0b3IiLHByb3BlcnRpZXM6e3J1blNlbGVjdGlvblN0YXRlOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3N0b3JlUnVuU2VsZWN0aW9uU3RhdGUiLHZhbHVlOnBkLmdldE9iamVjdEluaXRpYWxpemVyKCJydW5TZWxlY3Rpb25TdGF0ZSIse2RlZmF1bHRWYWx1ZTp7fX0pfSxyZWdleElucHV0Ont0eXBlOlN0cmluZyx2YWx1ZTpwZC5nZXRTdHJpbmdJbml0aWFsaXplcigicmVnZXhJbnB1dCIse2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJfcmVnZXhPYnNlcnZlciJ9LHNlbGVjdGVkUnVuczp7dHlwZTpBcnJheSxub3RpZnk6ITB9LHJ1bnM6QXJyYXksZGF0YUxvY2F0aW9uOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9jbGlwcGVkRGF0YUxvY2F0aW9uOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2dldENsaXBwZWREYXRhTG9jYXRpb24oZGF0YUxvY2F0aW9uLCBfZGF0YUxvY2F0aW9uQ2xpcExlbmd0aCkifSxfZGF0YUxvY2F0aW9uQ2xpcExlbmd0aDp7dHlwZTpOdW1iZXIsCnZhbHVlOjI1MCxyZWFkT25seTohMH0sY29sb3Jpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOntnZXRDb2xvcjpwZi5ydW5zQ29sb3JTY2FsZX19fSxhdHRhY2hlZCgpe3RoaXMuX3J1blN0b3JlTGlzdGVuZXI9dmMucnVuc1N0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5zZXQoInJ1bnMiLHZjLnJ1bnNTdG9yZS5nZXRSdW5zKCkpfSk7dGhpcy5zZXQoInJ1bnMiLHZjLnJ1bnNTdG9yZS5nZXRSdW5zKCkpO3RoaXMuX2VudlN0b3JlTGlzdGVuZXI9dmMuZW52aXJvbm1lbnRTdG9yZS5hZGRMaXN0ZW5lcigoKT0+e3RoaXMuc2V0KCJkYXRhTG9jYXRpb24iLHZjLmVudmlyb25tZW50U3RvcmUuZ2V0RGF0YUxvY2F0aW9uKCkpfSk7dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsdmMuZW52aXJvbm1lbnRTdG9yZS5nZXREYXRhTG9jYXRpb24oKSl9LGRldGFjaGVkKCl7dmMucnVuc1N0b3JlLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fcnVuU3RvcmVMaXN0ZW5lcik7dmMuZW52aXJvbm1lbnRTdG9yZS5yZW1vdmVMaXN0ZW5lckJ5S2V5KHRoaXMuX2VudlN0b3JlTGlzdGVuZXIpfSwKX3RvZ2dsZUFsbDpmdW5jdGlvbigpe3RoaXMuJC5tdWx0aUNoZWNrYm94LnRvZ2dsZUFsbCgpfSxfZ2V0Q2xpcHBlZERhdGFMb2NhdGlvbjpmdW5jdGlvbihiLGQpe2lmKHZvaWQgMCE9PWImJiEoYi5sZW5ndGg+ZCkpcmV0dXJuIGJ9LF9vcGVuRGF0YUxvY2F0aW9uRGlhbG9nOmZ1bmN0aW9uKGIpe2IucHJldmVudERlZmF1bHQoKTt0aGlzLiQkKCIjZGF0YS1sb2NhdGlvbi1kaWFsb2ciKS5vcGVuKCl9LF9zaG91bGRTaG93RXhwYW5kRGF0YUxvY2F0aW9uQnV0dG9uKGIsZCl7cmV0dXJuIGImJmIubGVuZ3RoPmR9LF9zdG9yZVJ1blNlbGVjdGlvblN0YXRlOnBkLmdldE9iamVjdE9ic2VydmVyKCJydW5TZWxlY3Rpb25TdGF0ZSIse2RlZmF1bHRWYWx1ZTp7fX0pLF9yZWdleE9ic2VydmVyOnBkLmdldFN0cmluZ09ic2VydmVyKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSl9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi10ZW5zb3Jib2FyZC9yZWdpc3RyeS5qcwp2YXIgcWY7CihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7ZC5OT1RfTE9BREVEPSJOT1RfTE9BREVEIjtkLkxPQURFRD0iTE9BREVEIjtkLkZBSUxFRD0iRkFJTEVEIn0pKGIuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZXx8KGIuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT17fSkpO2IuZGFzaGJvYXJkUmVnaXN0cnk9e307Yi5yZWdpc3RlckRhc2hib2FyZD1mdW5jdGlvbigpe3ZhciBkPXtwbHVnaW46ImJlaG9sZGVyIixlbGVtZW50TmFtZToidGYtYmVob2xkZXItZGFzaGJvYXJkIixzaG91bGRSZW1vdmVEb206ITB9O2lmKCFkLnBsdWdpbil0aHJvdyBFcnJvcigiRGFzaGJvYXJkLnBsdWdpbiBtdXN0IGJlIHByZXNlbnQiKTtpZighZC5lbGVtZW50TmFtZSl0aHJvdyBFcnJvcigiRGFzaGJvYXJkLmVsZW1lbnROYW1lIG11c3QgYmUgcHJlc2VudCIpO2lmKGQucGx1Z2luIGluIGIuZGFzaGJvYXJkUmVnaXN0cnkpdGhyb3cgRXJyb3IoYFBsdWdpbiBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7ZC5wbHVnaW59YCk7ZC50YWJOYW1lfHwKKGQudGFiTmFtZT1kLnBsdWdpbik7Yi5kYXNoYm9hcmRSZWdpc3RyeVtkLnBsdWdpbl09ZH19KShxZnx8KHFmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdXRpbHMvdXRpbHMuanMKdmFyIHJmOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChmLGgsayl7cmV0dXJuIDE9PT1mP2g6a31iLmFnZ3JlZ2F0ZVRhZ0luZm89ZnVuY3Rpb24oZixoKXtsZXQgaz12b2lkIDA7Y29uc3QgdD17fTtPYmplY3Qua2V5cyhmKS5mb3JFYWNoKHA9Pntjb25zdCBtPWZbcF07dm9pZCAwPT09ayYmKGs9bS5kaXNwbGF5TmFtZSk7ayE9PW0uZGlzcGxheU5hbWUmJihrPW51bGwpO3ZvaWQgMD09PXRbbS5kZXNjcmlwdGlvbl0mJih0W20uZGVzY3JpcHRpb25dPVtdKTt0W20uZGVzY3JpcHRpb25dLnB1c2gocCl9KTtoPW51bGwhPWs/azpoO2NvbnN0IGw9KCgpPT57Y29uc3QgcD1PYmplY3Qua2V5cyh0KTtyZXR1cm4gMD09PXAubGVuZ3RoPyIiOjE9PT1wLmxlbmd0aD9wWzBdOmAkeyJceDNjcFx4M2VceDNjc3Ryb25nXHgzZU11bHRpcGxlIGRlc2NyaXB0aW9uczpceDNjL3N0cm9uZ1x4M2VceDNjL3BceDNlIn08dWw+JHtwLm1hcChtPT57Y29uc3Qgbj10W21dLm1hcCh1PT5gPGNvZGU+JHt1LnJlcGxhY2UoLzwvZywiXHgyNmx0OyIpLnJlcGxhY2UoLz4vZywKIlx4MjZndDsiKS5yZXBsYWNlKC8mL2csIlx4MjZhbXA7Iil9PC9jb2RlPmApLHE9MjxuLmxlbmd0aD9uLnNsaWNlKDAsbi5sZW5ndGgtMSkuam9pbigiLCAiKSsiLCBhbmQgIituW24ubGVuZ3RoLTFdOm4uam9pbigiIGFuZCAiKTtyZXR1cm5gPGxpPjxwPkZvciAke2Qobi5sZW5ndGgsInJ1biIsInJ1bnMiKX0gJHtxfTo8L3A+JHttfTwvbGk+YH0pLmpvaW4oIiIpfTwvdWw+YH0pKCk7cmV0dXJue2Rpc3BsYXlOYW1lOmgsZGVzY3JpcHRpb246bH19fSkocmZ8fChyZj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXNwaW5uZXIvcGFwZXItc3Bpbm5lci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxvYnNlcnZlcjoiX19hY3RpdmVDaGFuZ2VkIn0sYWx0Ont0eXBlOlN0cmluZyx2YWx1ZToibG9hZGluZyIsb2JzZXJ2ZXI6Il9fYWx0Q2hhbmdlZCJ9LF9fY29vbGluZ0Rvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LF9fY29tcHV0ZUNvbnRhaW5lckNsYXNzZXM6ZnVuY3Rpb24oYixkKXtyZXR1cm5bYnx8ZD8iYWN0aXZlIjoiIixkPyJjb29sZG93biI6IiJdLmpvaW4oIiAiKX0sX19hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dGhpcy5fX3NldEFyaWFIaWRkZW4oIWIpO3RoaXMuX19jb29saW5nRG93bj0hYiYmZH0sX19hbHRDaGFuZ2VkOmZ1bmN0aW9uKGIpeyJsb2FkaW5nIj09PWI/dGhpcy5hbHQ9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKXx8YjoodGhpcy5fX3NldEFyaWFIaWRkZW4oIiI9PT0KYiksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGIpKX0sX19zZXRBcmlhSGlkZGVuOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfSxfX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fX2Nvb2xpbmdEb3duPXRoaXMuYWN0aXZlPSExfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItc3Bpbm5lci9wYXBlci1zcGlubmVyLWxpdGUuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItc3Bpbm5lci1saXRlIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3JdfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi9kYXRhLWxvYWRlci1iZWhhdmlvci5qcwooZnVuY3Rpb24oYil7bGV0IGQ7KGZ1bmN0aW9uKGYpe2ZbZi5MT0FESU5HPTBdPSJMT0FESU5HIjtmW2YuTE9BREVEPTFdPSJMT0FERUQifSkoZHx8KGQ9e30pKTtiLkRhdGFMb2FkZXJCZWhhdmlvcj17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9sb2FkRGF0YUlmQWN0aXZlIn0sbG9hZEtleTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmY9PlN0cmluZyhmKX0sbG9hZERhdGFDYWxsYmFjazpGdW5jdGlvbixyZXF1ZXN0RGF0YTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBmPT50aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodGhpcy5nZXREYXRhTG9hZFVybChmKSl9fSxnZXREYXRhTG9hZFVybDpGdW5jdGlvbixkYXRhTG9hZGluZzp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCwKdmFsdWU6ITF9LF9kYXRhTG9hZFN0YXRlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IE1hcH0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9sb2FkRGF0YUFzeW5jOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX2RhdGFUb0xvYWRDaGFuZ2VkKGlzQXR0YWNoZWQsIGRhdGFUb0xvYWQuKikiXSxvbkxvYWRGaW5pc2goKXt9LHJlbG9hZCgpe3RoaXMuX2RhdGFMb2FkU3RhdGUuY2xlYXIoKTt0aGlzLl9sb2FkRGF0YSgpfSxyZXNldCgpe251bGwhPXRoaXMuX2xvYWREYXRhQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCk7dGhpcy5fY2FuY2VsbGVyJiZ0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7dGhpcy5fZGF0YUxvYWRTdGF0ZSYmdGhpcy5fZGF0YUxvYWRTdGF0ZS5jbGVhcigpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbG9hZERhdGEoKX0sCl9kYXRhVG9Mb2FkQ2hhbmdlZCgpe3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbG9hZERhdGEoKX0sY3JlYXRlZCgpe3RoaXMuX2xvYWREYXRhPV8udGhyb3R0bGUodGhpcy5fbG9hZERhdGFJbXBsLDEwMCx7bGVhZGluZzohMCx0cmFpbGluZzohMH0pfSxkZXRhY2hlZCgpe251bGwhPXRoaXMuX2xvYWREYXRhQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCl9LF9sb2FkRGF0YUlmQWN0aXZlKCl7dGhpcy5hY3RpdmUmJnRoaXMuX2xvYWREYXRhKCl9LF9sb2FkRGF0YUltcGwoKXt0aGlzLmFjdGl2ZSYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz10aGlzLmFzeW5jKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT57aWYoIWYuY2FuY2VsbGVkKXJldHVybiB0aGlzLl9zZXREYXRhTG9hZGluZyghMCksZj10aGlzLmRhdGFUb0xvYWQuZmlsdGVyKGg9Pgp7aD10aGlzLmdldERhdGFMb2FkTmFtZShoKTtyZXR1cm4hdGhpcy5fZGF0YUxvYWRTdGF0ZS5oYXMoaCl9KS5tYXAoaD0+e2NvbnN0IGs9dGhpcy5nZXREYXRhTG9hZE5hbWUoaCk7dGhpcy5fZGF0YUxvYWRTdGF0ZS5zZXQoayxkLkxPQURJTkcpO3JldHVybiB0aGlzLnJlcXVlc3REYXRhKGgpLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKHQ9Pnt0LmNhbmNlbGxlZHx8KHRoaXMuX2RhdGFMb2FkU3RhdGUuc2V0KGssZC5MT0FERUQpLHRoaXMubG9hZERhdGFDYWxsYmFjayh0aGlzLGgsdC52YWx1ZSkpO3JldHVybiBrfSkpfSksUHJvbWlzZS5hbGwoZikudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoaD0+e2lmKCFoLmNhbmNlbGxlZCl7Y29uc3Qgaz1uZXcgU2V0KGgudmFsdWUpO2lmKHRoaXMuZGF0YVRvTG9hZC5zb21lKHQ9PmsuaGFzKHRoaXMuZ2V0RGF0YUxvYWROYW1lKHQpKSkpdGhpcy5vbkxvYWRGaW5pc2goKX1BcnJheS5mcm9tKHRoaXMuX2RhdGFMb2FkU3RhdGUudmFsdWVzKCkpLnNvbWUoaz0+Cms9PT1kLkxPQURJTkcpfHx0aGlzLl9zZXREYXRhTG9hZGluZyghMSl9KSwoKT0+e30pLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh7Y2FuY2VsbGVkOmh9KT0+e2h8fCh0aGlzLl9sb2FkRGF0YUFzeW5jPW51bGwpfSkpfSkpKX19fSkocWR8fChxZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvcGxvdHRhYmxlLmpzCi8qCiBNSVQKIE1JVAogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIHRoZSBTaWduYXR1cmUgQVBJIHRvIGhlbHAgaW4gY29tcGFyaW5nIHdoZW4gdHdvCiBQbG90dGFibGUgb2JqZWN0cyBoYXZlICJjaGFuZ2VkIi4KCiBNZW1vaXphdGlvbiBpbiBQbG90dGFibGUgaXMgY29tcGxpY2F0ZWQgYnkgbXV0YWJsZSBzY2FsZXMgYW5kIGRhdGFzZXRzLiBXZSBjYW5ub3Qgc2ltcGx5CiByZWZlcmVuY2UgY29tcGFyZSB0d28gZS5nLiBzY2FsZXMgc2luY2UgaXQgbWF5IGhhdmUgaW50ZXJuYWxseSBtdXRhdGVkLiBUbyByZXNvbHZlIHRoaXMsCiB3ZSB3cml0ZSBhIHJlY3Vyc2l2ZSBTaWduYXR1cmUgaW50ZXJmYWNlIHRoYXQgaG9sZHMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIHdoYXRldmVyCiBzdGF0ZSB0aGUgc2NhbGUvZGF0YSB3YXMgaW4gYXQgdGhlIHRpbWUuIFRoZW4gb24gbWVtb2l6ZWQgZnVuY3Rpb24gaW52b2NhdGlvbiB3ZSBzaWduIHRoZQogbmV3IGlucHV0cyBhbmQgY29tcGFyZSB0aGUgc2lnbmF0dXJlcyB0byBkZWNpZGUgaWYgd2Ugc2hvdWxkIHJlY29tcHV0ZS4KCiBXZSBtdXN0IGhhbmQtd3JpdGUgYSBzaWduYXR1cmUgZm9yIGVhY2ggY3VzdG9tIGNsYXNzIHdlIHdpc2ggdG8gc3VwcG9ydC4KIE1JVAoKIEBmaWxlb3ZlcnZpZXcgbWFudWFsbHkgYWRkIGQzLXNlbGVjdGlvbi1tdWx0aSB0byBkMyBkZWZhdWx0IGJ1bmRsZS4gTW9zdCBvZiB0aGlzIGNvZGUgaXMKIGNvcGllZCBmcm9tIGQzLXNlbGVjdGlvbi1tdWx0aUAxLjAuMC4KIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtc2VsZWN0aW9uLW11bHRpL2lzc3Vlcy8xMSBmb3Igd2h5IHdlIGhhdmUgdG8gZG8gdGhpcwogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgYSBjb252ZW5pZW50IHRodW5rIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgY29tbW9uIGNhc2UKIG9mIGNyZWF0aW5nIGEgbWVtb2l6ZWQgZnVuY3Rpb24gdGhhdCB0YWtlcyBpdHMgaW5wdXRzIGZyb20gbXV0YWJsZSBjbGFzcyBwcm9wZXJ0aWVzLgogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgYSBmdW5jdGlvbiBtZW1vaXplciB1c2luZyB0aGUgU2lnbmF0dXJlIEFQSS4KIFBsb3R0YWJsZSAzLjcuMCAoaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3Bsb3R0YWJsZSkKIENvcHlyaWdodCAyMDE0LTIwMTcgUGFsYW50aXIgVGVjaG5vbG9naWVzCiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci9wbG90dGFibGUvYmxvYi9tYXN0ZXIvTElDRU5TRSkKIGlzLXBsYWluLW9iamVjdCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtcGxhaW4tb2JqZWN0PgoKIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC4KIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KIGlzb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pc29iamVjdD4KCiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgSm9uIFNjaGxpbmtlcnQuCiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiovCihmdW5jdGlvbihiLGQpeyJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHMmJiJvYmplY3QiPT09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1kKHJlcXVpcmUoImQzIikpOiJmdW5jdGlvbiI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImQzIl0sZCk6Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLlBsb3R0YWJsZT1kKHJlcXVpcmUoImQzIikpOmIuUGxvdHRhYmxlPWQoYi5kMyl9KSh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBmdW5jdGlvbihkKXtmdW5jdGlvbiBmKGspe2lmKGhba10pcmV0dXJuIGhba10uZXhwb3J0czt2YXIgdD1oW2tdPXtpOmssbDohMSxleHBvcnRzOnt9fTtkW2tdLmNhbGwodC5leHBvcnRzLHQsdC5leHBvcnRzLGYpO3QubD0hMDtyZXR1cm4gdC5leHBvcnRzfXZhciBoPXt9O2YubT1kO2YuYz1oO2YuaT1mdW5jdGlvbihrKXtyZXR1cm4ga307Zi5kPWZ1bmN0aW9uKGssdCxsKXtmLm8oayx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGssCnQse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDpsfSl9O2Yubj1mdW5jdGlvbihrKXt2YXIgdD1rJiZrLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4ga1siZGVmYXVsdCJdfTpmdW5jdGlvbigpe3JldHVybiBrfTtmLmQodCwiYSIsdCk7cmV0dXJuIHR9O2Yubz1mdW5jdGlvbihrLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoayx0KX07Zi5wPSIiO3JldHVybiBmKGYucz0xNDApfShbZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ZD1oKDEwNyk7Zi5BcnJheT1kO2Q9aCgxMTApO2YuQ29sb3I9ZDtkPWgoNTUpO2YuRE9NPWQ7ZD1oKDU2KTtmLk1hdGg9ZDtkPWgoMTEzKTtmLk9iamVjdD1kO2Q9aCg1Nyk7Zi5SVHJlZT1kO2Q9aCgxMTUpO2YuU3RhY2tpbmc9ZDtkPWgoMzUpO2YuV2luZG93PWQ7ayhoKDEwOCkpO2soaCgxMDkpKTtrKGgoMTIpKTsKayhoKDExMSkpO2soaCgxMTIpKTtrKGgoNTgpKTtrKGgoMTE2KSl9LGZ1bmN0aW9uKGQpe2QuZXhwb3J0cz1ifSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhGLEQsQil7dmFyIEk9RC5hY2Nlc3NvcjtEPUQuc2NhbGU7aWYobnVsbD09RClyZXR1cm5bXTt2YXIgTj1GLmRhdGEoKTtudWxsIT1CJiYoTj1OLmZpbHRlcihmdW5jdGlvbihPLEgpe3JldHVybiBCKE8sSCxGKX0pKTtOPU4ubWFwKGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEkoTyxILEYpfSk7cmV0dXJuIEQuZXh0ZW50T2ZWYWx1ZXMoTil9dmFyIHQ9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEYsRCl7ZnVuY3Rpb24gQigpe3RoaXMuY29uc3RydWN0b3I9Rn1mb3IodmFyIEkgaW4gRClELmhhc093blByb3BlcnR5KEkpJiYoRltJXT1EW0ldKTtGLnByb3RvdHlwZT1udWxsPT09RD9PYmplY3QuY3JlYXRlKEQpOihCLnByb3RvdHlwZT1ELnByb3RvdHlwZSxuZXcgQil9LGw9aCgxKSxwPWgoNyk7ZD1oKDQpO3ZhciBtPQpoKDE4KSxuPWgoNikscT1oKDkpLHU9aCgyMCkseD1oKDApLEE9aCgxMikseT1oKDEwKSx3PWgoNTEpLEM9aCg1Mik7Zi5SZW5kZXJlcj15Lm1ha2VFbnVtKFsic3ZnIiwiY2FudmFzIl0pO2g9ZnVuY3Rpb24oRil7ZnVuY3Rpb24gRCgpe3ZhciBCPUYuY2FsbCh0aGlzKXx8dGhpcztCLl9kYXRhQ2hhbmdlZD0hMTtCLl9hdHRyRXh0ZW50cz17fTtCLl9hbmltYXRlPSExO0IuX2FuaW1hdG9ycz17fTtCLl9wcm9wZXJ0eUV4dGVudHM9e307Qi5fcmVzZXRFbnRpdHlTdG9yZT1mdW5jdGlvbigpe0IuX2NhY2hlZEVudGl0eVN0b3JlPXZvaWQgMH07Qi5fb3ZlcmZsb3dIaWRkZW49ITA7Qi5hZGRDbGFzcygicGxvdCIpO0IuX2RhdGFzZXRUb0RyYXdlcj1uZXcgeC5NYXA7Qi5fYXR0ckJpbmRpbmdzPWwubWFwKCk7Qi5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbihOLE8pe3JldHVybiBCLl9pbmNsdWRlZFZhbHVlc0ZvclNjYWxlKE4sTyl9O0IuX3JlbmRlckNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEIucmVuZGVyKCl9OwpCLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBCLl9vbkRhdGFzZXRVcGRhdGUoKX07Qi5fcHJvcGVydHlCaW5kaW5ncz1sLm1hcCgpO3ZhciBJPShuZXcgcC5FYXNpbmcpLm1heFRvdGFsRHVyYXRpb24oRC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7Qi5hbmltYXRvcih3LkFuaW1hdG9yLk1BSU4sSSk7Qi5hbmltYXRvcih3LkFuaW1hdG9yLlJFU0VULG5ldyBwLk51bGwpO0IuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZT14LldpbmRvdy5kZWJvdW5jZShDLkRlZmVycmVkUmVuZGVyZXIuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZLEIuX3Jlc2V0RW50aXR5U3RvcmUpO3JldHVybiBCfXQoRCxGKTtELmdldFRvdGFsRHJhd1RpbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gSS5yZWR1Y2UoZnVuY3Rpb24oTixPKXtyZXR1cm4gTitPLmFuaW1hdG9yLnRvdGFsVGltZShCLmxlbmd0aCl9LDApfTtELmFwcGx5RHJhd1N0ZXBzPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEIubWFwKGZ1bmN0aW9uKE4pe3ZhciBPPQpOLmF0dHJUb1Byb2plY3RvcixIPXt9O09iamVjdC5rZXlzKE8pLmZvckVhY2goZnVuY3Rpb24oSyl7SFtLXT1mdW5jdGlvbihNLEwpe3JldHVybiBPW0tdKE0sTCxJKX19KTtyZXR1cm57YXR0clRvQXBwbGllZFByb2plY3RvcjpILGFuaW1hdG9yOk4uYW5pbWF0b3J9fSl9O0QucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihCKXtCPUEuY29lcmNlRXh0ZXJuYWxEMyhCKTtGLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLEIpO3RoaXMuX2RhdGFDaGFuZ2VkPSEwO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBCPXRoaXM7dGhpcy5faXNTZXR1cHx8KEYucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLG51bGwhPXRoaXMuX2NhbnZhcyYmdGhpcy5fYXBwZW5kQ2FudmFzTm9kZSgpLHRoaXMuX3JlbmRlckFyZWE9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgicmVuZGVyLWFyZWEiLAohMCksdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEIuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldChJKX0pKX07RC5wcm90b3R5cGUuX2FwcGVuZENhbnZhc05vZGU9ZnVuY3Rpb24oKXt2YXIgQj10aGlzLmVsZW1lbnQoKS5zZWxlY3QoIi5wbG90LWNhbnZhcy1jb250YWluZXIiKTtCLmVtcHR5KCkmJihCPXRoaXMuZWxlbWVudCgpLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgicGxvdC1jYW52YXMtY29udGFpbmVyIiwhMCksQi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fY2FudmFzLm5vZGUoKSkpfTtELnByb3RvdHlwZS5zZXRCb3VuZHM9ZnVuY3Rpb24oQixJLE4sTyl7Ri5wcm90b3R5cGUuc2V0Qm91bmRzLmNhbGwodGhpcyxCLEksTixPKTt0aGlzLl9yZXNldEVudGl0eVN0b3JlKCk7bnVsbCE9dGhpcy5fY2FudmFzJiYodGhpcy5fYnVmZmVyQ2FudmFzJiYhdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQmJih0aGlzLl9idWZmZXJDYW52YXMuYXR0cigid2lkdGgiLAp0aGlzLl9jYW52YXMuYXR0cigid2lkdGgiKSksdGhpcy5fYnVmZmVyQ2FudmFzLmF0dHIoImhlaWdodCIsdGhpcy5fY2FudmFzLmF0dHIoImhlaWdodCIpKSwoTj10aGlzLl9idWZmZXJDYW52YXMubm9kZSgpLmdldENvbnRleHQoIjJkIikpJiZOLmRyYXdJbWFnZSh0aGlzLl9jYW52YXMubm9kZSgpLDAsMCksdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQ9ITApLE49bnVsbCE9d2luZG93LmRldmljZVBpeGVsUmF0aW8/d2luZG93LmRldmljZVBpeGVsUmF0aW86MSx0aGlzLl9jYW52YXMuYXR0cigid2lkdGgiLEIqTiksdGhpcy5fY2FudmFzLmF0dHIoImhlaWdodCIsSSpOKSxPPXRoaXMuX2NhbnZhcy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSkmJihPLnNldFRyYW5zZm9ybShOLDAsMCxOLDAsMCksdGhpcy5fYnVmZmVyQ2FudmFzJiZPLmRyYXdJbWFnZSh0aGlzLl9idWZmZXJDYW52YXMubm9kZSgpLDAsMCxCLEkpKX07RC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBCPXRoaXM7CkYucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEkpe3JldHVybiBJLm9mZlVwZGF0ZShCLl9yZW5kZXJDYWxsYmFjayl9KTt0aGlzLmRhdGFzZXRzKFtdKX07RC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbihCKXtCPXRoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQoQik7InN2ZyI9PT10aGlzLnJlbmRlcmVyKCk/Qi51c2VTVkcodGhpcy5fcmVuZGVyQXJlYSk6Qi51c2VDYW52YXModGhpcy5fY2FudmFzKTtyZXR1cm4gQn07RC5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgbi5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgcS5TVkdEcmF3ZXIoInBhdGgiLCIiKX0sZnVuY3Rpb24oQil7cmV0dXJuIG5ldyBtLkNhbnZhc0RyYXdlcihCLGZ1bmN0aW9uKCl7fSl9KX07RC5wcm90b3R5cGUuX2dldEFuaW1hdG9yPWZ1bmN0aW9uKEIpe3JldHVybiB0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCk/CnRoaXMuX2FuaW1hdG9yc1tCXXx8bmV3IHAuTnVsbDpuZXcgcC5OdWxsfTtELnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlRXh0ZW50cygpO3RoaXMuX2RhdGFDaGFuZ2VkPSEwO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTt0aGlzLnJlbmRlckxvd1ByaW9yaXR5KCl9O0QucHJvdG90eXBlLmF0dHI9ZnVuY3Rpb24oQixJLE4pe2lmKG51bGw9PUkpcmV0dXJuIHRoaXMuX2F0dHJCaW5kaW5ncy5nZXQoQik7dGhpcy5fYmluZEF0dHIoQixJLE4pO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9iaW5kUHJvcGVydHk9ZnVuY3Rpb24oQixJLE4sTyl7dmFyIEg9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoQik7SD1udWxsIT1IP0guc2NhbGU6bnVsbDt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLnNldChCLHthY2Nlc3NvcjoiZnVuY3Rpb24iPT09dHlwZW9mIEk/STpmdW5jdGlvbigpe3JldHVybiBJfSxzY2FsZTpOLHBvc3RTY2FsZTpPfSk7Cm51bGwhPUgmJnRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KEgsQik7bnVsbCE9TiYmdGhpcy5faW5zdGFsbFNjYWxlRm9yS2V5KE4sQik7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpfTtELnByb3RvdHlwZS5fYmluZEF0dHI9ZnVuY3Rpb24oQixJLE4pe3ZhciBPPXRoaXMuX2F0dHJCaW5kaW5ncy5nZXQoQik7Tz1udWxsIT1PP08uc2NhbGU6bnVsbDt0aGlzLl9hdHRyQmluZGluZ3Muc2V0KEIse2FjY2Vzc29yOiJmdW5jdGlvbiI9PT10eXBlb2YgST9JOmZ1bmN0aW9uKCl7cmV0dXJuIEl9LHNjYWxlOk59KTtudWxsIT1PJiZ0aGlzLl91bmluc3RhbGxTY2FsZUZvcktleShPLEIpO251bGwhPU4mJnRoaXMuX2luc3RhbGxTY2FsZUZvcktleShOLEIpO3RoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKX07RC5wcm90b3R5cGUuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGU9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yfTtELnByb3RvdHlwZS5fZ2V0QXR0clRvUHJvamVjdG9yPQpmdW5jdGlvbigpe251bGw9PXRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3RvciYmKHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcj10aGlzLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvcigpKTtyZXR1cm4geC5PYmplY3QuYXNzaWduKHt9LHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcil9O0QucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBCPXt9O3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKE4sTyl7QltPXT1ELl9zY2FsZWRBY2Nlc3NvcihOKX0pO3ZhciBJPXRoaXMuX3Byb3BlcnR5UHJvamVjdG9ycygpO09iamVjdC5rZXlzKEkpLmZvckVhY2goZnVuY3Rpb24oTil7bnVsbD09QltOXSYmKEJbTl09SVtOXSl9KTtyZXR1cm4gQn07RC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtGLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3RoaXMuX2lzQW5jaG9yZWQmJih0aGlzLl9wYWludCgpLAp0aGlzLl9kYXRhQ2hhbmdlZD0hMSk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLnJlbmRlckxvd1ByaW9yaXR5PWZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyQ2FsbGJhY2soKX07RC5wcm90b3R5cGUuYW5pbWF0ZWQ9ZnVuY3Rpb24oQil7aWYobnVsbD09QilyZXR1cm4gdGhpcy5fYW5pbWF0ZTt0aGlzLl9hbmltYXRlPUI7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe0YucHJvdG90eXBlLmRldGFjaC5jYWxsKHRoaXMpO3RoaXMuX3VwZGF0ZUV4dGVudHMoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3NjYWxlcz1mdW5jdGlvbigpe3ZhciBCPVtdO3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEkpe0k9SS5zY2FsZTtudWxsIT1JJiYtMT09PUIuaW5kZXhPZihJKSYmQi5wdXNoKEkpfSk7dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEkpe0k9SS5zY2FsZTtudWxsIT1JJiYtMT09PUIuaW5kZXhPZihJKSYmQi5wdXNoKEkpfSk7CnJldHVybiBCfTtELnByb3RvdHlwZS5fdXBkYXRlRXh0ZW50cz1mdW5jdGlvbigpe3ZhciBCPXRoaXM7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMuX3NjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEkuYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcihCLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKX0pfTtELnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH07RC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvckF0dHI9ZnVuY3Rpb24oQil7dmFyIEk9dGhpcztudWxsPT10aGlzLl9hdHRyRXh0ZW50c1tCXSYmKHRoaXMuX2F0dHJFeHRlbnRzW0JdPXUubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4gSS5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiBJLl9hdHRyQmluZGluZ3MuZ2V0KEIpfSxmdW5jdGlvbihOLE8pe3JldHVybiBudWxsPT1PfHxudWxsPT1PLmFjY2Vzc29yP251bGw6Ti5tYXAoZnVuY3Rpb24oSCl7cmV0dXJuIGsoSCwKTyxudWxsKX0pfSkpO3JldHVybiB0aGlzLl9hdHRyRXh0ZW50c1tCXSgpfTtELnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oQil7dmFyIEk9dGhpcztudWxsPT10aGlzLl9wcm9wZXJ0eUV4dGVudHNbQl0mJih0aGlzLl9wcm9wZXJ0eUV4dGVudHNbQl09dS5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiBJLmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIEkuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEIpfSxmdW5jdGlvbigpe3JldHVybiBJLl9maWx0ZXJGb3JQcm9wZXJ0eShCKX0sZnVuY3Rpb24oTixPLEgpe3JldHVybiBudWxsPT1PfHxudWxsPT1PLmFjY2Vzc29yP251bGw6Ti5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIGsoSyxPLEgpfSl9KSk7cmV0dXJuIHRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXSgpfTtELnByb3RvdHlwZS5faW5jbHVkZWRWYWx1ZXNGb3JTY2FsZT1mdW5jdGlvbihCLEkpe3ZhciBOPXRoaXM7aWYoIXRoaXMuX2lzQW5jaG9yZWQmJgohSSlyZXR1cm5bXTt2YXIgTz1bXTt0aGlzLl9hdHRyQmluZGluZ3MuZWFjaChmdW5jdGlvbihILEspe0guc2NhbGU9PT1CJiYoSD1OLmdldEV4dGVudHNGb3JBdHRyKEspLG51bGwhPUgmJihPPU8uY29uY2F0KGwubWVyZ2UoSCkpKSl9KTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSCxLKXtILnNjYWxlPT09QiYmKEg9Ti5nZXRFeHRlbnRzRm9yUHJvcGVydHkoSyksbnVsbCE9SCYmKE89Ty5jb25jYXQobC5tZXJnZShIKSkpKX0pO3JldHVybiBPfTtELnByb3RvdHlwZS5hbmltYXRvcj1mdW5jdGlvbihCLEkpe2lmKHZvaWQgMD09PUkpcmV0dXJuIHRoaXMuX2FuaW1hdG9yc1tCXTt0aGlzLl9hbmltYXRvcnNbQl09STtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUucmVuZGVyZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5fY2FudmFzPyJzdmciOiJjYW52YXMifTtELnByb3RvdHlwZS5hZGREYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX2FkZERhdGFzZXQoQik7CnRoaXMuX29uRGF0YXNldFVwZGF0ZSgpfTtELnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihCKXt0aGlzLl9yZW1vdmVEYXRhc2V0KEIpO3ZhciBJPXRoaXMuX2NyZWF0ZURyYXdlcihCKTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuc2V0KEIsSSk7dGhpcy5faXNTZXR1cCYmdGhpcy5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0KEIpO0Iub25VcGRhdGUodGhpcy5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2spO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX3JlbW92ZURhdGFzZXQoQik7dGhpcy5fb25EYXRhc2V0VXBkYXRlKCl9O0QucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEIpe2lmKC0xPT09dGhpcy5kYXRhc2V0cygpLmluZGV4T2YoQikpcmV0dXJuIHRoaXM7dGhpcy5fcmVtb3ZlRGF0YXNldE5vZGVzKEIpO0Iub2ZmVXBkYXRlKHRoaXMuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrKTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZGVsZXRlKEIpOwpyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihCKXt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KEIpLnJlbW92ZSgpfTtELnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihCKXt2YXIgST10aGlzLE49W107dGhpcy5fZGF0YXNldFRvRHJhd2VyLmZvckVhY2goZnVuY3Rpb24oTyxIKXtyZXR1cm4gTi5wdXNoKEgpfSk7aWYobnVsbD09QilyZXR1cm4gTjtOLmZvckVhY2goZnVuY3Rpb24oTyl7cmV0dXJuIEkuX3JlbW92ZURhdGFzZXQoTyl9KTtCLmZvckVhY2goZnVuY3Rpb24oTyl7cmV0dXJuIEkuX2FkZERhdGFzZXQoTyl9KTt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IHAuTnVsbH1dfTtELnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PQpmdW5jdGlvbigpe307RC5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXM9ZnVuY3Rpb24oQil7dmFyIEk9dGhpcyxOPVtdO0IuZm9yRWFjaChmdW5jdGlvbihPLEgpe3ZhciBLPUkuX2RhdGFzZXRUb0RyYXdlci5nZXQoTyksTT0wO08uZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oTCxRKXt2YXIgVD1JLl9waXhlbFBvaW50KEwsUSxPKTt4Lk1hdGguaXNOYU4oVC54KXx8eC5NYXRoLmlzTmFOKFQueSl8fChOLnB1c2goe2RhdHVtOkwsZ2V0IHBvc2l0aW9uKCl7cmV0dXJuIEkuX3BpeGVsUG9pbnQuY2FsbChJLEwsUSxPKX0saW5kZXg6USxkYXRhc2V0Ok8sZGF0YXNldEluZGV4OkgsY29tcG9uZW50OkksZHJhd2VyOkssdmFsaWREYXR1bUluZGV4Ok19KSxNKyspfSl9KTtyZXR1cm4gTn07RC5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgQj1uZXcgeC5NYXA7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEIuc2V0KEksCkkuZGF0YSgpKX0pO3JldHVybiBCfTtELnByb3RvdHlwZS5fcGFpbnQ9ZnVuY3Rpb24oKXt2YXIgQj10aGlzO2RlbGV0ZSB0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3I7dmFyIEk9dGhpcy5fZ2VuZXJhdGVEcmF3U3RlcHMoKSxOPXRoaXMuX2dldERhdGFUb0RyYXcoKSxPPXRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEIuX2RhdGFzZXRUb0RyYXdlci5nZXQoSyl9KTtpZigiY2FudmFzIj09PXRoaXMucmVuZGVyZXIoKSl7dmFyIEg9dGhpcy5fY2FudmFzLm5vZGUoKTtILmdldENvbnRleHQoIjJkIikuY2xlYXJSZWN0KDAsMCxILmNsaWVudFdpZHRoLEguY2xpZW50SGVpZ2h0KTt0aGlzLl9idWZmZXJDYW52YXNWYWxpZD0hMX10aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihLLE0pe3ZhciBMPUQuYXBwbHlEcmF3U3RlcHMoSSxLKTtPW01dLmRyYXcoTi5nZXQoSyksTCl9KTtIPXRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEQuZ2V0VG90YWxEcmF3VGltZShOLmdldChLKSwKSSl9KTtIPXguTWF0aC5tYXgoSCwwKTt0aGlzLl9hZGRpdGlvbmFsUGFpbnQoSCl9O0QucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oQil7dmFyIEk9dGhpczt2b2lkIDA9PT1CJiYoQj10aGlzLmRhdGFzZXRzKCkpO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiBsLnNlbGVjdEFsbCgpO3ZhciBOPVtdO0IuZm9yRWFjaChmdW5jdGlvbihPKXtPPUkuX2RhdGFzZXRUb0RyYXdlci5nZXQoTyk7bnVsbCE9TyYmKE89Ty5nZXRWaXN1YWxQcmltaXRpdmVzKCksTi5wdXNoLmFwcGx5KE4sTykpfSk7cmV0dXJuIGwuc2VsZWN0QWxsKE4pfTtELnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihCKXt2YXIgST10aGlzO3JldHVybiB0aGlzLl9nZXRFbnRpdHlTdG9yZShCKS5lbnRpdGllcygpLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE4pfSl9O0QucHJvdG90eXBlLl9nZXRFbnRpdHlTdG9yZT1mdW5jdGlvbihCKXtmdW5jdGlvbiBJKEgpe3JldHVybiBOLl9lbnRpdHlCb3VuZHMoSCl9CnZhciBOPXRoaXM7aWYodm9pZCAwIT09Qil7dmFyIE89bmV3IHguRW50aXR5U3RvcmU7Ty5hZGRBbGwodGhpcy5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcyhCKSxJLHRoaXMuX2xvY2FsT3JpZ2luQm91bmRzKCkpO3JldHVybiBPfXZvaWQgMD09PXRoaXMuX2NhY2hlZEVudGl0eVN0b3JlJiYoTz1uZXcgeC5FbnRpdHlTdG9yZSxPLmFkZEFsbCh0aGlzLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzKHRoaXMuZGF0YXNldHMoKSksSSx0aGlzLl9sb2NhbE9yaWdpbkJvdW5kcygpKSx0aGlzLl9jYWNoZWRFbnRpdHlTdG9yZT1PKTtyZXR1cm4gdGhpcy5fY2FjaGVkRW50aXR5U3RvcmV9O0QucHJvdG90eXBlLl9sb2NhbE9yaWdpbkJvdW5kcz1mdW5jdGlvbigpe3JldHVybnt0b3BMZWZ0Ont4OjAseTowfSxib3R0b21SaWdodDp7eDp0aGlzLndpZHRoKCkseTp0aGlzLmhlaWdodCgpfX19O0QucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQil7Qj10aGlzLl9waXhlbFBvaW50KEIuZGF0dW0sCkIuaW5kZXgsQi5kYXRhc2V0KTtyZXR1cm57eDpCLngseTpCLnksd2lkdGg6MCxoZWlnaHQ6MH19O0QucHJvdG90eXBlLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHk9ZnVuY3Rpb24oQil7cmV0dXJue2JvdW5kczp0aGlzLl9lbnRpdHlCb3VuZHMoQiksY29tcG9uZW50OkIuY29tcG9uZW50LGRhdGFzZXQ6Qi5kYXRhc2V0LGRhdGFzZXRJbmRleDpCLmRhdGFzZXRJbmRleCxkYXR1bTpCLmRhdHVtLGluZGV4OkIuaW5kZXgscG9zaXRpb246Qi5wb3NpdGlvbixzZWxlY3Rpb246bC5zZWxlY3QoQi5kcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpW0IudmFsaWREYXR1bUluZGV4XSl9fTtELnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoInBsb3RzIG11c3QgaW1wbGVtZW50IGVudGl0aWVzQXQiKTt9O0QucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oQil7Qj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0eU5lYXJlc3QoQik7CnJldHVybiB2b2lkIDA9PT1CP3ZvaWQgMDp0aGlzLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoQil9O0QucHJvdG90eXBlLmVudGl0aWVzSW49ZnVuY3Rpb24oQixJKXtyZXR1cm4gdGhpcy5lbnRpdGllc0luQm91bmRzKG51bGw9PUk/e3g6Qi50b3BMZWZ0LngseTpCLnRvcExlZnQueSx3aWR0aDpCLmJvdHRvbVJpZ2h0LngtQi50b3BMZWZ0LngsaGVpZ2h0OkIuYm90dG9tUmlnaHQueS1CLnRvcExlZnQueX06e3g6Qi5taW4seTpJLm1pbix3aWR0aDpCLm1heC1CLm1pbixoZWlnaHQ6SS5tYXgtSS5taW59KX07RC5wcm90b3R5cGUuZW50aXRpZXNJbkJvdW5kcz1mdW5jdGlvbihCKXt2YXIgST10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE4pfSl9O0QucHJvdG90eXBlLmVudGl0aWVzSW5YQm91bmRzPQpmdW5jdGlvbihCKXt2YXIgST10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWEJvdW5kcyhCKSlyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIEkuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShOKX0pfTtELnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbihCKXt2YXIgST10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWUJvdW5kcyhCKSlyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIEkuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShOKX0pfTtELnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24oQil7Qi5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO0Iub2ZmVXBkYXRlKHRoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSk7Qi5yZW1vdmVJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfTsKRC5wcm90b3R5cGUuX2luc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihCKXtCLm9uVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTtCLm9uVXBkYXRlKHRoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSk7Qi5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfTtELnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7cmV0dXJue319O0QuX3NjYWxlZEFjY2Vzc29yPWZ1bmN0aW9uKEIpe3ZhciBJPUIuc2NhbGUsTj1CLmFjY2Vzc29yLE89Qi5wb3N0U2NhbGUsSD1udWxsPT1JP046ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBJLnNjYWxlKE4oSyxNLEwpKX07cmV0dXJuIG51bGw9PU8/SDpmdW5jdGlvbihLLE0sTCl7cmV0dXJuIE8oSChLLE0sTCksSyxNLEwpfX07RC5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm57eDowLHk6MH19O0QucHJvdG90eXBlLl9hbmltYXRlT25OZXh0UmVuZGVyPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbmltYXRlJiZ0aGlzLl9kYXRhQ2hhbmdlZH07cmV0dXJuIER9KGQuQ29tcG9uZW50KTtoLl9BTklNQVRJT05fTUFYX0RVUkFUSU9OPTYwMDtmLlBsb3Q9aH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocCl7Zm9yKHZhciBtIGluIHApZi5oYXNPd25Qcm9wZXJ0eShtKXx8KGZbbV09cFttXSl9ZD1oKDEwNSk7Zi5UaWNrR2VuZXJhdG9ycz1kO2soaCg1NCkpO2soaCgxMDEpKTtrKGgoMTAyKSk7ayhoKDEwMykpO2soaCgxMDQpKTtrKGgoMTA2KSk7dmFyIHQ9aCg1NCksbD1oKDExKTtmLmlzVHJhbnNmb3JtYWJsZT1mdW5jdGlvbihwKXtyZXR1cm4gcCBpbnN0YW5jZW9mIGwuUXVhbnRpdGF0aXZlU2NhbGV8fHAgaW5zdGFuY2VvZiB0LkNhdGVnb3J5fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMSksdD1oKDMwKSxsPWgoMCkscD1oKDEyKTtkPWgoMTApO2YuWEFsaWdubWVudD1kLm1ha2VFbnVtKFsibGVmdCIsImNlbnRlciIsInJpZ2h0Il0pOwpmLllBbGlnbm1lbnQ9ZC5tYWtlRW51bShbInRvcCIsImNlbnRlciIsImJvdHRvbSJdKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbSgpe3RoaXMuX292ZXJmbG93SGlkZGVuPSExO3RoaXMuX29yaWdpbj17eDowLHk6MH07dGhpcy5feEFsaWdubWVudD0ibGVmdCI7dGhpcy5feUFsaWdubWVudD0idG9wIjt0aGlzLl9pc0FuY2hvcmVkPXRoaXMuX2lzU2V0dXA9ITE7dGhpcy5fY3NzQ2xhc3Nlcz1uZXcgbC5TZXQ7dGhpcy5fZGVzdHJveWVkPSExO3RoaXMuX29uQW5jaG9yQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3RoaXMuX29uRGV0YWNoQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3RoaXMuX2Nzc0NsYXNzZXMuYWRkKCJjb21wb25lbnQiKX1tLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24obil7bj1wLmNvZXJjZUV4dGVybmFsRDMobik7aWYodGhpcy5fZGVzdHJveWVkKXRocm93IEVycm9yKCJDYW4ndCByZXVzZSBkZXN0cm95KCktZWQgQ29tcG9uZW50cyEiKTt0aGlzLmlzUm9vdCgpJiYKKHRoaXMuX3Jvb3RFbGVtZW50PW4sdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NlZCgicGxvdHRhYmxlIiwhMCkpO251bGwhPXRoaXMuX2VsZW1lbnQ/bi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudC5ub2RlKCkpOih0aGlzLl9lbGVtZW50PW4uYXBwZW5kKCJkaXYiKSx0aGlzLl9zZXR1cCgpKTt0aGlzLl9pc0FuY2hvcmVkPSEwO3RoaXMuX29uQW5jaG9yQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uQW5jaG9yPWZ1bmN0aW9uKG4pe3RoaXMuX2lzQW5jaG9yZWQmJm4odGhpcyk7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZBbmNob3I9ZnVuY3Rpb24obil7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuZGVsZXRlKG4pfTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMuX2lzU2V0dXB8fCh0aGlzLl9jc3NDbGFzc2VzLmZvckVhY2goZnVuY3Rpb24ocSl7bi5fZWxlbWVudC5jbGFzc2VkKHEsCiEwKX0pLHRoaXMuX2Nzc0NsYXNzZXM9bmV3IGwuU2V0LHRoaXMuX2JhY2tncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImJhY2tncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fY29udGVudD10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiY29udGVudCIsITApLHRoaXMuX2ZvcmVncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImZvcmVncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fb3ZlcmZsb3dIaWRkZW4/dGhpcy5fY29udGVudC5jbGFzc2VkKCJjb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIiwhMCk6dGhpcy5fY29udGVudC5jbGFzc2VkKCJjb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSIsITApLHRoaXMuX2lzU2V0dXA9ITApfTttLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3JldHVybnttaW5XaWR0aDowLG1pbkhlaWdodDowfX07bS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD0KZnVuY3Rpb24obixxLHUpe2lmKG51bGw9PW58fG51bGw9PXF8fG51bGw9PXUpe2lmKG51bGw9PXRoaXMuX2VsZW1lbnQpdGhyb3cgRXJyb3IoImFuY2hvcigpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjb21wdXRlTGF5b3V0KCkiKTtpZihudWxsIT10aGlzLl9yb290RWxlbWVudCluPXt4OjAseTowfSx1PXRoaXMuX3Jvb3RFbGVtZW50Lm5vZGUoKSxxPWwuRE9NLmVsZW1lbnRXaWR0aCh1KSx1PWwuRE9NLmVsZW1lbnRIZWlnaHQodSk7ZWxzZSB0aHJvdyBFcnJvcigibnVsbCBhcmd1bWVudHMgY2Fubm90IGJlIHBhc3NlZCB0byBjb21wdXRlTGF5b3V0KCkgb24gYSBub24tcm9vdCwgdW5hbmNob3JlZCBub2RlIik7fXZhciB4PXRoaXMuX3NpemVGcm9tT2ZmZXIocSx1KSxBPXguaGVpZ2h0O3g9eC53aWR0aDt0aGlzLnNldEJvdW5kcyh4LEEsbi54KyhxLXgpKm0uX3hBbGlnblRvUHJvcG9ydGlvblt0aGlzLl94QWxpZ25tZW50XSxuLnkrKHUtQSkqbS5feUFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3lBbGlnbm1lbnRdKTsKcmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihuLHEsdSx4KXt2b2lkIDA9PT11JiYodT0wKTt2b2lkIDA9PT14JiYoeD0wKTt0aGlzLl93aWR0aD1uO3RoaXMuX2hlaWdodD1xO3RoaXMuX29yaWdpbj17eDp1LHk6eH07bnVsbCE9dGhpcy5fZWxlbWVudCYmdGhpcy5fZWxlbWVudC5zdHlsZXMoe2xlZnQ6dSsicHgiLGhlaWdodDpxKyJweCIsdG9wOngrInB4Iix3aWR0aDpuKyJweCJ9KTtudWxsIT10aGlzLl9yZXNpemVIYW5kbGVyJiZ0aGlzLl9yZXNpemVIYW5kbGVyKHt3aWR0aDpuLGhlaWdodDpxfSl9O20ucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcy5yZXF1ZXN0ZWRTcGFjZShuLHEpO3JldHVybnt3aWR0aDp0aGlzLmZpeGVkV2lkdGgoKT9NYXRoLm1pbihuLHUubWluV2lkdGgpOm4saGVpZ2h0OnRoaXMuZml4ZWRIZWlnaHQoKT9NYXRoLm1pbihxLHUubWluSGVpZ2h0KTpxfX07bS5wcm90b3R5cGUucmVuZGVyPQpmdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJjA8PXRoaXMud2lkdGgoKSYmMDw9dGhpcy5oZWlnaHQoKSYmdC5yZWdpc3RlclRvUmVuZGVyKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5yZW5kZXJMb3dQcmlvcml0eT1mdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9O20ucHJvdG90eXBlLl9zY2hlZHVsZUNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl9pc1NldHVwJiZ0LnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0QW5kUmVuZGVyKHRoaXMpfTttLnByb3RvdHlwZS5vblJlc2l6ZT1mdW5jdGlvbihuKXt0aGlzLl9yZXNpemVIYW5kbGVyPW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJih0aGlzLmlzUm9vdCgpP3RoaXMuX3NjaGVkdWxlQ29tcHV0ZUxheW91dCgpOgp0aGlzLnBhcmVudCgpLnJlZHJhdygpKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7fTttLnByb3RvdHlwZS5yZW5kZXJUbz1mdW5jdGlvbihuKXt0aGlzLmRldGFjaCgpO2lmKG51bGwhPW4pe249InN0cmluZyI9PT10eXBlb2Ygbj9rLnNlbGVjdChuKTpuIGluc3RhbmNlb2YgRWxlbWVudD9rLnNlbGVjdChuKTpwLmNvZXJjZUV4dGVybmFsRDMobik7aWYoIW4ubm9kZSgpfHxudWxsPT1uLm5vZGUoKS5ub2RlTmFtZSl0aHJvdyBFcnJvcigiUGxvdHRhYmxlIHJlcXVpcmVzIGEgdmFsaWQgRWxlbWVudCB0byByZW5kZXJUbyIpO2lmKCJzdmciPT09bi5ub2RlKCkubm9kZU5hbWUpdGhyb3cgRXJyb3IoIlBsb3R0YWJsZSAzLnggYW5kIGxhdGVyIGNhbiBvbmx5IHJlbmRlclRvIGFuIEhUTUwgY29tcG9uZW50OyBwYXNzIGEgZGl2IGluc3RlYWQhIik7dGhpcy5hbmNob3Iobil9aWYobnVsbD09dGhpcy5fZWxlbWVudCl0aHJvdyBFcnJvcigiSWYgYSBDb21wb25lbnQgaGFzIG5ldmVyIGJlZW4gcmVuZGVyZWQgYmVmb3JlLCB0aGVuIHJlbmRlclRvIG11c3QgYmUgZ2l2ZW4gYSBub2RlIHRvIHJlbmRlciB0bywgb3IgYSBkMy5TZWxlY3Rpb24sIG9yIGEgc2VsZWN0b3Igc3RyaW5nIik7CnQucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIodGhpcyk7dC5mbHVzaCgpfTttLnByb3RvdHlwZS54QWxpZ25tZW50PWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3hBbGlnbm1lbnQ7bj1uLnRvTG93ZXJDYXNlKCk7aWYobnVsbD09bS5feEFsaWduVG9Qcm9wb3J0aW9uW25dKXRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBhbGlnbm1lbnQ6ICIrbik7dGhpcy5feEFsaWdubWVudD1uO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnlBbGlnbm1lbnQ9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5feUFsaWdubWVudDtuPW4udG9Mb3dlckNhc2UoKTtpZihudWxsPT1tLl95QWxpZ25Ub1Byb3BvcnRpb25bbl0pdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIituKTt0aGlzLl95QWxpZ25tZW50PW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuaGFzQ2xhc3M9ZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PQpuPyExOm51bGw9PXRoaXMuX2VsZW1lbnQ/dGhpcy5fY3NzQ2xhc3Nlcy5oYXMobik6dGhpcy5fZWxlbWVudC5jbGFzc2VkKG4pfTttLnByb3RvdHlwZS5hZGRDbGFzcz1mdW5jdGlvbihuKXtudWxsIT1uJiYobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmFkZChuKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQobiwhMCkpfTttLnByb3RvdHlwZS5yZW1vdmVDbGFzcz1mdW5jdGlvbihuKXtudWxsIT1uJiYobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmRlbGV0ZShuKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQobiwhMSkpfTttLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITF9O20ucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITF9O20ucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMucGFyZW50KG51bGwpO3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7dGhpcy5faXNBbmNob3JlZD0KITE7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25EZXRhY2g9ZnVuY3Rpb24obil7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZEZXRhY2g9ZnVuY3Rpb24obil7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuZGVsZXRlKG4pfTttLnByb3RvdHlwZS5wYXJlbnQ9ZnVuY3Rpb24obil7aWYodm9pZCAwPT09bilyZXR1cm4gdGhpcy5fcGFyZW50O2lmKG51bGwhPT1uJiYhbi5oYXModGhpcykpdGhyb3cgRXJyb3IoIlBhc3NlZCBpbnZhbGlkIHBhcmVudCIpO3RoaXMuX3BhcmVudD1uO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLm9yaWdpbigpO3JldHVybnt0b3BMZWZ0Om4sYm90dG9tUmlnaHQ6e3g6bi54K3RoaXMud2lkdGgoKSx5Om4ueSt0aGlzLmhlaWdodCgpfX19O20ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9kZXN0cm95ZWQ9CiEwO3RoaXMuZGV0YWNoKCl9O20ucHJvdG90eXBlLndpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZHRofTttLnByb3RvdHlwZS5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGVpZ2h0fTttLnByb3RvdHlwZS5vcmlnaW49ZnVuY3Rpb24oKXtyZXR1cm57eDp0aGlzLl9vcmlnaW4ueCx5OnRoaXMuX29yaWdpbi55fX07bS5wcm90b3R5cGUub3JpZ2luVG9Sb290PWZ1bmN0aW9uKCl7Zm9yKHZhciBuPXRoaXMub3JpZ2luKCkscT10aGlzLnBhcmVudCgpO251bGwhPXE7KXt2YXIgdT1xLm9yaWdpbigpO24ueCs9dS54O24ueSs9dS55O3E9cS5wYXJlbnQoKX1yZXR1cm4gbn07bS5wcm90b3R5cGUucm9vdD1mdW5jdGlvbigpe2Zvcih2YXIgbj10aGlzOyFuLmlzUm9vdCgpOyluPW4ucGFyZW50KCk7cmV0dXJuIG59O20ucHJvdG90eXBlLmlzUm9vdD1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLnBhcmVudCgpfTttLnByb3RvdHlwZS5mb3JlZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvcmVncm91bmRDb250YWluZXJ9OwptLnByb3RvdHlwZS5jb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnR9O20ucHJvdG90eXBlLmVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudH07bS5wcm90b3R5cGUucm9vdEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290KCkuX3Jvb3RFbGVtZW50fTttLnByb3RvdHlwZS5iYWNrZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb250YWluZXJ9O3JldHVybiBtfSgpO2QuX3hBbGlnblRvUHJvcG9ydGlvbj17bGVmdDowLGNlbnRlcjouNSxyaWdodDoxfTtkLl95QWxpZ25Ub1Byb3BvcnRpb249e3RvcDowLGNlbnRlcjouNSxib3R0b206MX07Zi5Db21wb25lbnQ9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDU5KSk7ayhoKDYyKSk7ayhoKDEzMykpO2soaCgyMSkpO2soaCg2NCkpO2soaCg2NikpfSwKZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQpe3RoaXMuX3N2Z0RyYXdlckZhY3Rvcnk9azt0aGlzLl9jYW52YXNEcmF3ZXJGYWN0b3J5PXR9aC5wcm90b3R5cGUudXNlU1ZHPWZ1bmN0aW9uKGspe251bGwhPXRoaXMuX2N1cnJlbnREcmF3ZXImJnRoaXMuX2N1cnJlbnREcmF3ZXIucmVtb3ZlKCk7dmFyIHQ9dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeSgpO3QuYXR0YWNoVG8oayk7dGhpcy5fY3VycmVudERyYXdlcj10fTtoLnByb3RvdHlwZS51c2VDYW52YXM9ZnVuY3Rpb24oayl7bnVsbCE9dGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKTt0aGlzLl9jdXJyZW50RHJhd2VyPXRoaXMuX2NhbnZhc0RyYXdlckZhY3Rvcnkoay5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSl9O2gucHJvdG90eXBlLmdldERyYXdlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyfTtoLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtudWxsIT0KdGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKX07aC5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihrLHQpe3RoaXMuX2N1cnJlbnREcmF3ZXIuZHJhdyhrLHQpfTtoLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpfTtoLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKGspe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgoayl9O3JldHVybiBofSgpO2YuUHJveHlEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDcwKSk7ayhoKDcxKSl9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHApe3ZvaWQgMD09PXAmJihwPTMpO3QocCk7cmV0dXJuIGZ1bmN0aW9uKG0pe3JldHVybiBtLnRvRml4ZWQocCl9fQpmdW5jdGlvbiB0KHApe2lmKDA+cHx8MjA8cCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjAiKTtpZihwIT09TWF0aC5mbG9vcihwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGFuIGludGVnZXIiKTt9dmFyIGw9aCgxKTtmLmN1cnJlbmN5PWZ1bmN0aW9uKHAsbSxuKXt2b2lkIDA9PT1wJiYocD0yKTt2b2lkIDA9PT1tJiYobT0iJCIpO3ZvaWQgMD09PW4mJihuPSEwKTt2YXIgcT1rKHApO3JldHVybiBmdW5jdGlvbih1KXt2YXIgeD1xKE1hdGguYWJzKHUpKTsiIiE9PXgmJih4PW4/bSt4OngrbSwwPnUmJih4PSItIit4KSk7cmV0dXJuIHh9fTtmLmZpeGVkPWs7Zi5nZW5lcmFsPWZ1bmN0aW9uKCl7dmFyIHA7dm9pZCAwPT09cCYmKHA9Myk7dChwKTtyZXR1cm4gZnVuY3Rpb24obSl7aWYoIm51bWJlciI9PT10eXBlb2YgbSl7dmFyIG49TWF0aC5wb3coMTAscCk7cmV0dXJuIFN0cmluZyhNYXRoLnJvdW5kKG0qCm4pL24pfXJldHVybiBTdHJpbmcobSl9fTtmLmlkZW50aXR5PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHApe3JldHVybiBTdHJpbmcocCl9fTtmLnBlcmNlbnRhZ2U9ZnVuY3Rpb24ocCl7dm9pZCAwPT09cCYmKHA9MCk7dmFyIG09ayhwKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIHE9bi50b1N0cmluZygpO3E9TWF0aC5wb3coMTAscS5sZW5ndGgtKHEuaW5kZXhPZigiLiIpKzEpKTtyZXR1cm4gbShwYXJzZUludCgoMTAwKm4qcSkudG9TdHJpbmcoKSwxMCkvcSkrIiUifX07Zi5zaVN1ZmZpeD1mdW5jdGlvbihwKXt2b2lkIDA9PT1wJiYocD0zKTt0KHApO3JldHVybiBmdW5jdGlvbihtKXtyZXR1cm4gbC5mb3JtYXQoIi4iK3ArInMiKShtKX19O2Yuc2hvcnRTY2FsZT1mdW5jdGlvbihwKXt2b2lkIDA9PT1wJiYocD0zKTt0KHApO3ZhciBtPWwuZm9ybWF0KCIuIitwKyJlIiksbj1sLmZvcm1hdCgiLiIrcCsiZiIpLHE9TWF0aC5wb3coMTAsMTgpLHU9TWF0aC5wb3coMTAsLXApOwpyZXR1cm4gZnVuY3Rpb24oeCl7dmFyIEE9TWF0aC5hYnMoeCk7aWYoKEE8dXx8QT49cSkmJjAhPT1BKXJldHVybiBtKHgpO2Zvcih2YXIgeT0tMTtBPj1NYXRoLnBvdygxRTMseSsyKSYmND55Oyl5Kys7QT0tMT09PXk/bih4KTpuKHgvTWF0aC5wb3coMUUzLHkrMSkpKyJLTUJUUSJbeV07aWYoMDx4JiYiMTAwMCI9PT1BLnN1YnN0cigwLDQpfHwwPngmJiItMTAwMCI9PT1BLnN1YnN0cigwLDUpKTQ+eT8oeSsrLEE9bih4L01hdGgucG93KDFFMyx5KzEpKSsiS01CVFEiW3ldKTpBPW0oeCk7cmV0dXJuIEF9fTtmLm11bHRpVGltZT1mdW5jdGlvbigpe3ZhciBwPVt7c3BlY2lmaWVyOiIuJUwiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0TWlsbGlzZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiI6JVMiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0U2Vjb25kcygpfX0se3NwZWNpZmllcjoiJUk6JU0iLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PQptLmdldE1pbnV0ZXMoKX19LHtzcGVjaWZpZXI6IiVJICVwIixwcmVkaWNhdGU6ZnVuY3Rpb24obSl7cmV0dXJuIDAhPT1tLmdldEhvdXJzKCl9fSx7c3BlY2lmaWVyOiIlYSAlZCIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXREYXkoKSYmMSE9PW0uZ2V0RGF0ZSgpfX0se3NwZWNpZmllcjoiJWIgJWQiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMSE9PW0uZ2V0RGF0ZSgpfX0se3NwZWNpZmllcjoiJWIiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0TW9udGgoKX19XTtyZXR1cm4gZnVuY3Rpb24obSl7dmFyIG49cC5maWx0ZXIoZnVuY3Rpb24ocSl7cmV0dXJuIHEucHJlZGljYXRlKG0pfSk7cmV0dXJuIGwudGltZUZvcm1hdCgwPG4ubGVuZ3RoP25bMF0uc3BlY2lmaWVyOiIlWSIpKG0pfX07Zi50aW1lPWZ1bmN0aW9uKHApe3JldHVybiBsLnRpbWVGb3JtYXQocCl9fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSx0PWgoMCk7CmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKHAsbSl7dGhpcy5fcm9vdD1rLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKTt0aGlzLl9jbGFzc05hbWU9bTt0aGlzLl9zdmdFbGVtZW50TmFtZT1wfWwucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24ocCxtKXt2YXIgbj10aGlzO3RoaXMuX2NyZWF0ZUFuZERlc3Ryb3lET01FbGVtZW50cyhwKTt2YXIgcT0wO20uZm9yRWFjaChmdW5jdGlvbih1KXt0LldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIG4uX2RyYXdTdGVwKHUpfSxxKTtxKz11LmFuaW1hdG9yLnRvdGFsVGltZShwLmxlbmd0aCl9KX07bC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe251bGw9PXRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2RlcyYmKHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlcz10aGlzLl9zZWxlY3Rpb24ubm9kZXMoKSk7cmV0dXJuIHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlc307CmwucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuZ2V0VmlzdWFsUHJpbWl0aXZlcygpW3BdfTtsLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9yb290LnJlbW92ZSgpfTtsLnByb3RvdHlwZS5hdHRhY2hUbz1mdW5jdGlvbihwKXtwLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9yb290Lm5vZGUoKSl9O2wucHJvdG90eXBlLmdldFJvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH07bC5wcm90b3R5cGUuc2VsZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3ZnRWxlbWVudE5hbWV9O2wucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7fTtsLnByb3RvdHlwZS5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzPWZ1bmN0aW9uKHApe3A9cC5maWx0ZXIoZnVuY3Rpb24obSl7cmV0dXJuIG51bGwhPW19KTtwPXRoaXMuX3Jvb3Quc2VsZWN0QWxsKHRoaXMuc2VsZWN0b3IoKSkuZGF0YShwKTsKdGhpcy5fc2VsZWN0aW9uPXAuZW50ZXIoKS5hcHBlbmQodGhpcy5fc3ZnRWxlbWVudE5hbWUpLm1lcmdlKHApO3AuZXhpdCgpLnJlbW92ZSgpO3RoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlcz1udWxsO251bGwhPXRoaXMuX2NsYXNzTmFtZSYmdGhpcy5fc2VsZWN0aW9uLmNsYXNzZWQodGhpcy5fY2xhc3NOYW1lLCEwKTt0aGlzLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzKHRoaXMuX3NlbGVjdGlvbil9O2wucHJvdG90eXBlLl9kcmF3U3RlcD1mdW5jdGlvbihwKXt2YXIgbT10aGlzO1siZmlsbCIsInN0cm9rZSJdLmZvckVhY2goZnVuY3Rpb24obil7bnVsbCE9cC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yW25dJiZtLl9zZWxlY3Rpb24uYXR0cihuLHAuYXR0clRvQXBwbGllZFByb2plY3RvcltuXSl9KTtwLmFuaW1hdG9yLmFuaW1hdGUodGhpcy5fc2VsZWN0aW9uLHAuYXR0clRvQXBwbGllZFByb2plY3Rvcik7bnVsbCE9dGhpcy5fY2xhc3NOYW1lJiZ0aGlzLl9zZWxlY3Rpb24uY2xhc3NlZCh0aGlzLl9jbGFzc05hbWUsCiEwKX07cmV0dXJuIGx9KCk7Zi5TVkdEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmKXtmLm1ha2VFbnVtPWZ1bmN0aW9uKGgpe3JldHVybiBoLnJlZHVjZShmdW5jdGlvbihrLHQpe2tbdF09dDtyZXR1cm4ga30se30pfX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihtLG4pe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPW19Zm9yKHZhciB1IGluIG4pbi5oYXNPd25Qcm9wZXJ0eSh1KSYmKG1bdV09blt1XSk7bS5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKToocS5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHEpfSx0PWgoMSksbD1oKDI2KSxwPWgoMCk7ZD1mdW5jdGlvbihtKXtmdW5jdGlvbiBuKCl7dmFyIHE9bS5jYWxsKHRoaXMpfHx0aGlzO3EuX3RpY2tHZW5lcmF0b3I9ZnVuY3Rpb24odSl7cmV0dXJuIHUuZGVmYXVsdFRpY2tzKCl9O3EuX3BhZFByb3BvcnRpb249LjA1O3EuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD0KITA7cS5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnM9bmV3IHAuU2V0O3JldHVybiBxfWsobixtKTtuLnByb3RvdHlwZS5hdXRvRG9tYWluPWZ1bmN0aW9uKCl7dGhpcy5fZG9tYWluTWF4PXRoaXMuX2RvbWFpbk1pbj1udWxsO20ucHJvdG90eXBlLmF1dG9Eb21haW4uY2FsbCh0aGlzKX07bi5wcm90b3R5cGUuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGU9ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLl9kb21haW5NaW4mJm51bGwhPXRoaXMuX2RvbWFpbk1heCl0aGlzLl9zZXREb21haW4oW3RoaXMuX2RvbWFpbk1pbix0aGlzLl9kb21haW5NYXhdKTtlbHNle3ZhciBxPXRoaXMuX2dldEV4dGVudCgpO251bGwhPXRoaXMuX2RvbWFpbk1pbj8ocT1xWzFdLHRoaXMuX2RvbWFpbk1pbj49cSYmKHE9dGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4oW3RoaXMuX2RvbWFpbk1pbix0aGlzLl9kb21haW5NaW5dKVsxXSksdGhpcy5fc2V0RG9tYWluKFt0aGlzLl9kb21haW5NaW4scV0pKToKbnVsbCE9dGhpcy5fZG9tYWluTWF4PyhxPXFbMF0sdGhpcy5fZG9tYWluTWF4PD1xJiYocT10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWF4LHRoaXMuX2RvbWFpbk1heF0pWzBdKSx0aGlzLl9zZXREb21haW4oW3EsdGhpcy5fZG9tYWluTWF4XSkpOm0ucHJvdG90eXBlLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlLmNhbGwodGhpcyl9fTtuLnByb3RvdHlwZS5fZ2V0VW5ib3VuZGVkRXh0ZW50PWZ1bmN0aW9uKHEpe3ZvaWQgMD09PXEmJihxPSExKTtxPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKHEpO3ZhciB1PXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09cS5sZW5ndGgmJihxPVtwLk1hdGgubWluKHEsdVswXSkscC5NYXRoLm1heChxLHVbMV0pXSx1PXRoaXMuX3BhZERvbWFpbihxKSk7cmV0dXJuIHV9O24ucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgcT10aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoKTtudWxsIT10aGlzLl9kb21haW5NaW4mJgoocVswXT10aGlzLl9kb21haW5NaW4pO251bGwhPXRoaXMuX2RvbWFpbk1heCYmKHFbMV09dGhpcy5fZG9tYWluTWF4KTtyZXR1cm4gcX07bi5wcm90b3R5cGUuYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcj1mdW5jdGlvbihxKXt0aGlzLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycy5hZGQocSk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpfTtuLnByb3RvdHlwZS5yZW1vdmVQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyPWZ1bmN0aW9uKHEpe3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmRlbGV0ZShxKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCl9O24ucHJvdG90eXBlLnBhZFByb3BvcnRpb249ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fcGFkUHJvcG9ydGlvbjtpZigwPnEpdGhyb3cgRXJyb3IoInBhZFByb3BvcnRpb24gbXVzdCBiZSBub24tbmVnYXRpdmUiKTt0aGlzLl9wYWRQcm9wb3J0aW9uPXE7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpOwpyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuX3BhZERvbWFpbj1mdW5jdGlvbihxKXt2YXIgdT10aGlzO2lmKHFbMF0udmFsdWVPZigpPT09cVsxXS52YWx1ZU9mKCkpcmV0dXJuIHRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKHEpO2lmKDA9PT10aGlzLl9wYWRQcm9wb3J0aW9uKXJldHVybiBxO3ZhciB4PXRoaXMuX3BhZFByb3BvcnRpb24vMixBPXFbMF0seT1xWzFdLHc9ITEsQz0hMTt0aGlzLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uKEQpe0QodSkuZm9yRWFjaChmdW5jdGlvbihCKXtCLnZhbHVlT2YoKT09PUEudmFsdWVPZigpJiYodz0hMCk7Qi52YWx1ZU9mKCk9PT15LnZhbHVlT2YoKSYmKEM9ITApfSl9KTt2YXIgRj10aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKTt0aGlzLl9iYWNraW5nU2NhbGVEb21haW4ocSk7cT13P0E6dGhpcy5pbnZlcnQodGhpcy5zY2FsZShBKS0odGhpcy5zY2FsZSh5KS10aGlzLnNjYWxlKEEpKSp4KTt4PUM/Cnk6dGhpcy5pbnZlcnQodGhpcy5zY2FsZSh5KSsodGhpcy5zY2FsZSh5KS10aGlzLnNjYWxlKEEpKSp4KTt0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oRik7cmV0dXJuIHRoaXMuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD90aGlzLl9uaWNlRG9tYWluKFtxLHhdKTpbcSx4XX07bi5wcm90b3R5cGUuc25hcHBpbmdEb21haW5FbmFibGVkPWZ1bmN0aW9uKHEpe251bGwhPXEmJih0aGlzLl9zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9cSx0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCkpfTtuLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24ocSl7cmV0dXJuIHF9O24ucHJvdG90eXBlLmludmVydD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpbnZlcnQiKTt9O24ucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbihxKXtudWxsIT1xJiYodGhpcy5fZG9tYWluTWluPXFbMF0sdGhpcy5fZG9tYWluTWF4PXFbMV0pOwpyZXR1cm4gbS5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyxxKX07bi5wcm90b3R5cGUuZG9tYWluTWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuZG9tYWluKClbMF07dGhpcy5fZG9tYWluTWluPXE7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5kb21haW5NYXg9ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5kb21haW4oKVsxXTt0aGlzLl9kb21haW5NYXg9cTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHEpe3E9dC5leHRlbnQocS5maWx0ZXIoZnVuY3Rpb24odSl7cmV0dXJuIHAuTWF0aC5pc1ZhbGlkTnVtYmVyKCt1KX0pKTtyZXR1cm4gbnVsbD09cVswXXx8bnVsbD09cVsxXT9bXTpxfTtuLnByb3RvdHlwZS56b29tPWZ1bmN0aW9uKHEsdSl7dmFyIHg9dGhpczt0aGlzLmRvbWFpbih0aGlzLnJhbmdlKCkubWFwKGZ1bmN0aW9uKEEpe3JldHVybiB4LmludmVydChsLnpvb21PdXQoQSwKcSx1KSl9KSl9O24ucHJvdG90eXBlLnBhbj1mdW5jdGlvbihxKXt2YXIgdT10aGlzO3RoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHUuaW52ZXJ0KHgrcSl9KSl9O24ucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgc2NhbGVUcmFuc2Zvcm1hdGlvbiIpO307bi5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpbnZlcnRlZFRyYW5zZm9ybWF0aW9uIik7fTtuLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBnZXRUcmFuc2Zvcm1hdGlvbkV4dGVudCIpO307bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4iKTsKfTtuLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiIpO307bi5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KHgpe3JldHVybiBwLk1hdGguaXNOYU4oeCl8fEluZmluaXR5PT09eHx8LUluZmluaXR5PT09eH11KHFbMF0pfHx1KHFbMV0pP3AuV2luZG93Lndhcm4oIldhcm5pbmc6IFF1YW50aXRhdGl2ZVNjYWxlcyBjYW5ub3QgdGFrZSBOYU4gb3IgSW5maW5pdHkgYXMgYSBkb21haW4gdmFsdWUuIElnbm9yaW5nLiIpOm0ucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLHEpfTtuLnByb3RvdHlwZS5kZWZhdWx0VGlja3M9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERlZmF1bHRUaWNrcyIpO307bi5wcm90b3R5cGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0dlbmVyYXRvcih0aGlzKX07Cm4ucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9uaWNlRG9tYWluIik7fTtuLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZGVmYXVsdEV4dGVudCIpO307bi5wcm90b3R5cGUudGlja0dlbmVyYXRvcj1mdW5jdGlvbigpe3ZhciBxPVBsb3R0YWJsZS5TY2FsZXMuVGlja0dlbmVyYXRvcnMuaW50ZWdlclRpY2tHZW5lcmF0b3IoKTtudWxsIT1xJiYodGhpcy5fdGlja0dlbmVyYXRvcj1xKX07cmV0dXJuIG59KGgoMTcpLlNjYWxlKTtkLl9ERUZBVUxUX05VTV9USUNLUz0xMDtmLlF1YW50aXRhdGl2ZVNjYWxlPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpO2YuY29lcmNlRXh0ZXJuYWxEMz1mdW5jdGlvbih0KXtpZihudWxsPT10LmF0dHJzKXtpZihudWxsPT10Lm5vZGVzKXt2YXIgbD1bXTt0LmVhY2goZnVuY3Rpb24oKXtsLnB1c2godGhpcyl9KTsKcmV0dXJuIGsuc2VsZWN0QWxsKGwpfXJldHVybiBrLnNlbGVjdEFsbCh0Lm5vZGVzKCkpfXJldHVybiB0fX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDgzKSk7ayhoKDg0KSk7ayhoKDg1KSl9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCg0NCkpO2soaCg0NSkpO2soaCg0NikpO2soaCgxOCkpO2soaCg2KSk7ayhoKDMzKSk7ayhoKDM0KSk7ayhoKDQ3KSk7ayhoKDkpKTtrKGgoNDgpKX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe3ZhciBrPXRoaXM7dGhpcy5fYW5jaG9yQ2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIGsuX2FuY2hvcih0KX07dGhpcy5fZW5hYmxlZD0hMH1oLnByb3RvdHlwZS5hdHRhY2hUbz1mdW5jdGlvbihrKXt0aGlzLl9kaXNjb25uZWN0KCk7CnRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG89azt0aGlzLl9jb25uZWN0KCk7cmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmRldGFjaEZyb209ZnVuY3Rpb24oKXt0aGlzLmRldGFjaCgpfTtoLnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLl9kaXNjb25uZWN0KCk7dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbz1udWxsO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5lbmFibGVkPWZ1bmN0aW9uKGspe2lmKG51bGw9PWspcmV0dXJuIHRoaXMuX2VuYWJsZWQ7KHRoaXMuX2VuYWJsZWQ9ayk/dGhpcy5fY29ubmVjdCgpOnRoaXMuX2Rpc2Nvbm5lY3QoKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuX2FuY2hvcj1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQ9ITB9O2gucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQ9ITF9O2gucHJvdG90eXBlLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlPWZ1bmN0aW9uKGspe3ZhciB0PXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub3JpZ2luVG9Sb290KCk7CnJldHVybnt4OmsueC10LngseTprLnktdC55fX07aC5wcm90b3R5cGUuX2lzSW5zaWRlQ29tcG9uZW50PWZ1bmN0aW9uKGspe3JldHVybiAwPD1rLngmJjA8PWsueSYmay54PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJmsueTw9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5oZWlnaHQoKX07aC5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXtpZih0aGlzLmVuYWJsZWQoKSYmbnVsbCE9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyYmIXRoaXMuX2lzQW5jaG9yZWQpdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vbkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayl9O2gucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fdW5hbmNob3IoKTtudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiZ0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9mZkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayl9O3JldHVybiBofSgpOwpmLkludGVyYWN0aW9uPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgeCBpbiBxKXEuaGFzT3duUHJvcGVydHkoeCkmJihuW3hdPXFbeF0pO24ucHJvdG90eXBlPW51bGw9PT1xP09iamVjdC5jcmVhdGUocSk6KHUucHJvdG90eXBlPXEucHJvdG90eXBlLG5ldyB1KX0sdD1oKDMpLGw9aCgwKSxwPWgoNTIpLG09aCgyKTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXt2YXIgdT1uLmNhbGwodGhpcyl8fHRoaXM7dS5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMTt1Ll9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPSExO3UuX2RlZmVycmVkUmVuZGVyaW5nPSExO3UuX2FwcGx5RGVmZXJyZWRSZW5kZXJpbmdUcmFuc2Zvcm09ZnVuY3Rpb24oeCxBLHksdyl7dS5faXNBbmNob3JlZCYmKG51bGwhPXUuX3JlbmRlckFyZWEmJnUuX3JlbmRlckFyZWEuYXR0cigidHJhbnNmb3JtIiwKInRyYW5zbGF0ZSgiK3grIiwgIitBKyIpIHNjYWxlKCIreSsiLCAiK3crIikiKSxudWxsIT11Ll9jYW52YXMmJnUuX2NhbnZhcy5zdHlsZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIreCsicHgsICIrQSsicHgpIHNjYWxlKCIreSsiLCAiK3crIikiKSl9O3UuYWRkQ2xhc3MoInh5LXBsb3QiKTt1Ll9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHUuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YKCl9O3UuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdS5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKX07dS5fcmVuZGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtpZih1LmRlZmVycmVkUmVuZGVyaW5nKCkpe3ZhciB4PXUueCgpJiZ1LngoKS5zY2FsZSxBPXUueSgpJiZ1LnkoKS5zY2FsZTt1Ll9kZWZlcnJlZFJlbmRlcmVyLnVwZGF0ZURvbWFpbnMoeCxBKX1lbHNlIHUucmVuZGVyKCl9Owp1Ll9kZWZlcnJlZFJlbmRlcmVyPW5ldyBwLkRlZmVycmVkUmVuZGVyZXIoZnVuY3Rpb24oKXtyZXR1cm4gdS5yZW5kZXIoKX0sdS5fYXBwbHlEZWZlcnJlZFJlbmRlcmluZ1RyYW5zZm9ybSk7cmV0dXJuIHV9ayhxLG4pO3EucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RoaXMuZGVmZXJyZWRSZW5kZXJpbmcoKSYmdGhpcy5fZGVmZXJyZWRSZW5kZXJlci5yZXNldFRyYW5zZm9ybXMoKTtyZXR1cm4gbi5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyl9O3EucHJvdG90eXBlLmRlZmVycmVkUmVuZGVyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlZmVycmVkUmVuZGVyaW5nfTtxLnByb3RvdHlwZS54PWZ1bmN0aW9uKHUseCxBKXtpZihudWxsPT11KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChxLl9YX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHEuX1hfS0VZLHUseCxBKTt1PXRoaXMud2lkdGgoKTtudWxsIT14JiZudWxsIT11JiZ4LnJhbmdlKFswLHVdKTsKdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUueT1mdW5jdGlvbih1LHgsQSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQocS5fWV9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShxLl9ZX0tFWSx1LHgsQSk7dT10aGlzLmhlaWdodCgpO251bGwhPXgmJm51bGwhPXUmJih4IGluc3RhbmNlb2YgdC5DYXRlZ29yeT94LnJhbmdlKFswLHVdKTp4LnJhbmdlKFt1LDBdKSk7dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5PWZ1bmN0aW9uKHUpe3JldHVybiJ4Ij09PXUmJnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4/dGhpcy5fbWFrZUZpbHRlckJ5UHJvcGVydHkoInkiKToKInkiPT09dSYmdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj90aGlzLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSgieCIpOm51bGx9O3EucHJvdG90eXBlLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eT1mdW5jdGlvbih1KXt1PXRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHUpO2lmKG51bGwhPXUpe3ZhciB4PXUuYWNjZXNzb3IsQT11LnNjYWxlO2lmKG51bGwhPUEpcmV0dXJuIGZ1bmN0aW9uKHksdyxDKXt2YXIgRj1BLnJhbmdlKCk7cmV0dXJuIGwuTWF0aC5pblJhbmdlKEEuc2NhbGUoeCh5LHcsQykpLEZbMF0sRlsxXSl9fXJldHVybiBudWxsfTtxLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24odSx4KXtuLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLHUseCk7dS5vZmZVcGRhdGUoeD09PXEuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9OwpxLnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKHUseCl7bi5wcm90b3R5cGUuX2luc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsdSx4KTt1Lm9uVXBkYXRlKHg9PT1xLl9YX0tFWT90aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrOnRoaXMuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2spfTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMueCgpLnNjYWxlJiZ0aGlzLngoKS5zY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjayk7dGhpcy55KCkuc2NhbGUmJnRoaXMueSgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZT1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPwoieCI6dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj8ieSI6Im5vbmUiO3N3aXRjaCh1KXtjYXNlICJ4Ijp0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSEwO3RoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITE7dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKTticmVhaztjYXNlICJ5Ijp0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSExO3RoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITA7dGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVgoKTticmVhaztjYXNlICJub25lIjp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPXRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITE7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiSW52YWxpZCBzY2FsZSBuYW1lICciK3UrIicsIG11c3QgYmUgJ3gnLCAneScgb3IgJ25vbmUnIik7fXJldHVybiB0aGlzfTtxLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKHUseCxBKXtuLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcywKdSx4LEEpO3U9KHU9dGhpcy54KCkpJiZ1LnNjYWxlO251bGwhPXUmJnUucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk7dT0odT10aGlzLnkoKSkmJnUuc2NhbGU7bnVsbCE9dSYmKHUgaW5zdGFuY2VvZiB0LkNhdGVnb3J5P3UucmFuZ2UoWzAsdGhpcy5oZWlnaHQoKV0pOnUucmFuZ2UoW3RoaXMuaGVpZ2h0KCksMF0pKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX3VwZGF0ZVhFeHRlbnRzQW5kQXV0b2RvbWFpbj1mdW5jdGlvbigpe3ZhciB1PXRoaXMueCgpLnNjYWxlO251bGwhPXUmJnUuYXV0b0RvbWFpbigpfTtxLnByb3RvdHlwZS5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy55KCkuc2NhbGU7bnVsbCE9dSYmdS5hdXRvRG9tYWluKCl9O3EucHJvdG90eXBlLnNob3dBbGxEYXRhPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCk7dGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCk7cmV0dXJuIHRoaXN9OwpxLnByb3RvdHlwZS5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVg9ZnVuY3Rpb24oKXt0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSYmdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCl9O3EucHJvdG90eXBlLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWT1mdW5jdGlvbigpe3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpJiZ0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKX07cS5wcm90b3R5cGUuX3Byb2plY3RvcnNSZWFkeT1mdW5jdGlvbigpe3ZhciB1PXRoaXMueCgpLHg9dGhpcy55KCk7cmV0dXJuIG51bGwhPXUmJm51bGwhPXUuYWNjZXNzb3ImJm51bGwhPXgmJm51bGwhPXguYWNjZXNzb3J9O3EucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKHUseCxBKXt2YXIgeT1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx3PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOwpyZXR1cm57eDp5KHUseCxBKSx5OncodSx4LEEpfX07cS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB1KHksdyxDKXt2YXIgRj1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHgueCgpKSh5LHcsQyk7eT1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHgueSgpKSh5LHcsQyk7cmV0dXJuIGwuTWF0aC5pc1ZhbGlkTnVtYmVyKEYpJiZsLk1hdGguaXNWYWxpZE51bWJlcih5KX12YXIgeD10aGlzLEE9bi5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbih5KXtBLnNldCh5LEEuZ2V0KHkpLmZpbHRlcihmdW5jdGlvbih3LEMpe3JldHVybiB1KHcsQyx5KX0pKX0pO3JldHVybiBBfTtyZXR1cm4gcX0obS5QbG90KTtkLl9YX0tFWT0ieCI7ZC5fWV9LRVk9InkiO2YuWFlQbG90PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHk9CiEwO3RoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3M9ITE7dGhpcy5fdXBkYXRlSWQ9MDt0aGlzLl9jYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnM9bmV3IGsuU2V0fXQucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3QucHJvdG90eXBlLl9nZXRBbGxJbmNsdWRlZFZhbHVlcz1mdW5jdGlvbihsKXt2YXIgcD10aGlzO3ZvaWQgMD09PWwmJihsPSExKTt2YXIgbT1bXTt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uKG4pe249bihwLGwpO209bS5jb25jYXQobil9KTtyZXR1cm4gbX07dC5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybltdfTt0LnByb3RvdHlwZS5vblVwZGF0ZT1mdW5jdGlvbihsKXt0aGlzLl9jYWxsYmFja3MuYWRkKGwpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5vZmZVcGRhdGU9ZnVuY3Rpb24obCl7dGhpcy5fY2FsbGJhY2tzLmRlbGV0ZShsKTsKcmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLl9kaXNwYXRjaFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUlkKys7dGhpcy5fY2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyl9O3QucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0hMDt0aGlzLl9zZXREb21haW4odGhpcy5fZ2V0RXh0ZW50KCkpfTt0LnByb3RvdHlwZS5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZT1mdW5jdGlvbigpe3RoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5JiZ0aGlzLmF1dG9Eb21haW4oKX07dC5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgc2NhbGUiKTt9O3QucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9O3QucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbihsKXtpZihudWxsPT1sKXJldHVybiB0aGlzLl9nZXREb21haW4oKTsKdGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHk9ITE7dGhpcy5fc2V0RG9tYWluKGwpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9nZXREb21haW4iKTt9O3QucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24obCl7dGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzc3x8KHRoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3M9ITAsdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKGwpLHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCksdGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMSl9O3QucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2JhY2tpbmdEb21haW4iKTt9O3QucHJvdG90eXBlLnJhbmdlPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX2dldFJhbmdlKCk7CnRoaXMuX3NldFJhbmdlKGwpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldFJhbmdlIik7fTt0LnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX3NldFJhbmdlIik7fTt0LnByb3RvdHlwZS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKGwpe3RoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmFkZChsKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLnJlbW92ZUluY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24obCl7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuZGVsZXRlKGwpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKX07dC5wcm90b3R5cGUudXBkYXRlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlSWR9OwpyZXR1cm4gdH0oKTtmLlNjYWxlPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHEsdSx4LEEpe2Zvcih2YXIgeT17fSx3PTA7dzx1Lmxlbmd0aDt3Kyspe3ZhciBDPXVbd107cS5oYXNPd25Qcm9wZXJ0eShDKSYmKHlbQ109cVtDXSh4LEEpKX1yZXR1cm4geX1mdW5jdGlvbiB0KHEpe3JldHVybihudWxsIT1xWyJzdHJva2Utb3BhY2l0eSJdP3BhcnNlRmxvYXQocVsic3Ryb2tlLW9wYWNpdHkiXSk6MSkqKG51bGwhPXEub3BhY2l0eT9wYXJzZUZsb2F0KHEub3BhY2l0eSk6MSl9ZnVuY3Rpb24gbChxKXtyZXR1cm4obnVsbCE9cVsiZmlsbC1vcGFjaXR5Il0/cGFyc2VGbG9hdChxWyJmaWxsLW9wYWNpdHkiXSk6MSkqKG51bGwhPXEub3BhY2l0eT9wYXJzZUZsb2F0KHEub3BhY2l0eSk6MSl9ZnVuY3Rpb24gcChxKXtyZXR1cm4gbnVsbCE9cVsic3Ryb2tlLXdpZHRoIl0/cGFyc2VGbG9hdChxWyJzdHJva2Utd2lkdGgiXSk6MX1mdW5jdGlvbiBtKHEsdSl7aWYodS5zdHJva2Upe3EubGluZVdpZHRoPQpwKHUpO3ZhciB4PW4uY29sb3IodS5zdHJva2UpO3gub3BhY2l0eSo9dCh1KTtxLnN0cm9rZVN0eWxlPXgudG9TdHJpbmcoKTtxLnN0cm9rZSgpfXUuZmlsbCYmKHg9bi5jb2xvcih1LmZpbGwpLHgub3BhY2l0eSo9bCh1KSxxLmZpbGxTdHlsZT14LnRvU3RyaW5nKCkscS5maWxsKCkpfXZhciBuPWgoMSk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHEodSx4KXt0aGlzLl9jb250ZXh0PXU7dGhpcy5fZHJhd1N0ZXA9eH1xLnByb3RvdHlwZS5nZXREcmF3U3RlcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmF3U3RlcH07cS5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbih1LHgpe3g9eFt4Lmxlbmd0aC0xXS5hdHRyVG9BcHBsaWVkUHJvamVjdG9yO3RoaXMuX2NvbnRleHQuc2F2ZSgpO3RoaXMuX2RyYXdTdGVwKHRoaXMuX2NvbnRleHQsdSx4KTt0aGlzLl9jb250ZXh0LnJlc3RvcmUoKX07cS5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe3JldHVybltdfTtxLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PQpmdW5jdGlvbigpe3JldHVybiBudWxsfTtxLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt9O3JldHVybiBxfSgpO2YuQ2FudmFzRHJhd2VyPWQ7Zi5Db250ZXh0U3R5bGVBdHRycz0iZmlsbC1vcGFjaXR5IGZpbGwgb3BhY2l0eSBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggc3Ryb2tlIi5zcGxpdCgiICIpO2YucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzPWZ1bmN0aW9uKHEsdSx4LEEpe3JldHVybiBrKHEsZi5Db250ZXh0U3R5bGVBdHRycy5jb25jYXQodSkseCxBKX07Zi5yZXNvbHZlQXR0cmlidXRlcz1rO2YuZ2V0U3Ryb2tlV2lkdGg9cDtmLnJlbmRlckFyZWE9ZnVuY3Rpb24ocSx1LHgsQSl7cS5zYXZlKCk7cS5iZWdpblBhdGgoKTt1LmNvbnRleHQocSk7dSh4KTtxLmxpbmVKb2luPSJyb3VuZCI7bShxLEEpO3EucmVzdG9yZSgpfTtmLnJlbmRlckxpbmU9ZnVuY3Rpb24ocSx1LHgsQSl7cS5zYXZlKCk7cS5iZWdpblBhdGgoKTt1LmNvbnRleHQocSk7dSh4KTsKcS5saW5lSm9pbj0icm91bmQiO20ocSxBKTtxLnJlc3RvcmUoKX07Zi5yZW5kZXJQYXRoV2l0aFN0eWxlPW19LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCg1MCkpO2soaCgyNykpO2soaCg1MSkpO2soaCg5MykpO2soaCg1MykpO2soaCg5NCkpO2soaCg5NSkpO2soaCg5NikpO2soaCg5NykpO2soaCg5OCkpO2soaCg5OSkpO2soaCgxMDApKX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDkyKSk7ayhoKDkxKSk7ZD1oKDQ5KTtmLnNpZ249ZC5zaWdufSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoMTM0KSk7ayhoKDEzNSkpO2soaCgxMzYpKTtrKGgoMTM3KSl9LGZ1bmN0aW9uKGQsCmYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHggaW4gcSlxLmhhc093blByb3BlcnR5KHgpJiYoblt4XT1xW3hdKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHQ9aCgxKSxsPWgoNSk7ZD1oKDQpO3ZhciBwPWgoOCksbT1oKDApO2g9aCgxMCk7Zi5BeGlzT3JpZW50YXRpb249aC5tYWtlRW51bShbImJvdHRvbSIsImxlZnQiLCJyaWdodCIsInRvcCJdKTtoPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEodSx4KXt2YXIgQT1uLmNhbGwodGhpcyl8fHRoaXM7QS5fZW5kVGlja0xlbmd0aD01O0EuX2lubmVyVGlja0xlbmd0aD01O0EuX3RpY2tMYWJlbFBhZGRpbmc9MTA7QS5fbWFyZ2luPTE1O0EuX3Nob3dFbmRUaWNrTGFiZWxzPSExO0EuX2Fubm90YXRpb25zRW5hYmxlZD0hMTtBLl9hbm5vdGF0aW9uVGllckNvdW50PQoxO2lmKG51bGw9PXV8fG51bGw9PXgpdGhyb3cgRXJyb3IoIkF4aXMgcmVxdWlyZXMgYSBzY2FsZSBhbmQgb3JpZW50YXRpb24iKTtBLl9zY2FsZT11O0Eub3JpZW50YXRpb24oeCk7QS5fc2V0RGVmYXVsdEFsaWdubWVudCgpO0EuYWRkQ2xhc3MoImF4aXMiKTtBLmlzSG9yaXpvbnRhbCgpP0EuYWRkQ2xhc3MoIngtYXhpcyIpOkEuYWRkQ2xhc3MoInktYXhpcyIpO0EuZm9ybWF0dGVyKHAuaWRlbnRpdHkoKSk7QS5fcmVzY2FsZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEEuX3Jlc2NhbGUoKX07QS5fc2NhbGUub25VcGRhdGUoQS5fcmVzY2FsZUNhbGxiYWNrKTtBLl9hbm5vdGF0ZWRUaWNrcz1bXTtBLl9hbm5vdGF0aW9uRm9ybWF0dGVyPXAuaWRlbnRpdHkoKTtyZXR1cm4gQX1rKHEsbik7cS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe24ucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVzY2FsZUNhbGxiYWNrKX07CnEucHJvdG90eXBlLnRpY2tMYWJlbERhdGFPbkVsZW1lbnQ9ZnVuY3Rpb24odSl7aWYobnVsbCE9dSl7Zm9yKHZhciB4O251bGwhPXUmJnUuY2xhc3NMaXN0JiZ2b2lkIDA9PT14Oyl1LmNsYXNzTGlzdC5jb250YWlucyhxLlRJQ0tfTEFCRUxfQ0xBU1MpP3g9dTp1PXUucGFyZW50Tm9kZTtyZXR1cm4gdm9pZCAwPT09dT92b2lkIDA6dC5zZWxlY3QodSkuZGF0dW0oKX19O3EucHJvdG90eXBlLl9jb21wdXRlV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCl9O3EucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpfTtxLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3ZhciB1PTAseD0wO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpe2lmKHg9dGhpcy5fY29tcHV0ZUhlaWdodCgpK3RoaXMuX21hcmdpbix0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpKXt2YXIgQT0KdGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQrMipxLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkc7eCs9QSp0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKX19ZWxzZSB1PXRoaXMuX2NvbXB1dGVXaWR0aCgpK3RoaXMuX21hcmdpbix0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpJiYoQT10aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKnEuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyx1Kz1BKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpKTtyZXR1cm57bWluV2lkdGg6dSxtaW5IZWlnaHQ6eH19O3EucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsKCl9O3EucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0hvcml6b250YWwoKX07cS5wcm90b3R5cGUuX3Jlc2NhbGU9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcigpfTtxLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbih1LHgsQSl7bi5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsdSx4LEEpO3RoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5fc2NhbGUucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk6dGhpcy5fc2NhbGUucmFuZ2UoW3RoaXMuaGVpZ2h0KCksMF0pO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbih1LHgpe3ZhciBBPXRoaXMucmVxdWVzdGVkU3BhY2UodSx4KTtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT97d2lkdGg6dSxoZWlnaHQ6QS5taW5IZWlnaHR9OntoZWlnaHQ6eCx3aWR0aDpBLm1pbldpZHRofX07cS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fdGlja01hcmtDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLlRJQ0tfTUFSS19DTEFTUysiLWNvbnRhaW5lciIsITApO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lcj0KdGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLlRJQ0tfTEFCRUxfQ0xBU1MrIi1jb250YWluZXIiLCEwKTt0aGlzLl9iYXNlbGluZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jb250YWluZXIiLCEwKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLmFwcGVuZCgiZyIpLmNsYXNzZWQoImFubm90YXRpb24tbGluZS1jb250YWluZXIiLCEwKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLmFwcGVuZCgiZyIpLmNsYXNzZWQoImFubm90YXRpb24tY2lyY2xlLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1yZWN0LWNvbnRhaW5lciIsITApO3ZhciB1PXRoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1sYWJlbC1jb250YWluZXIiLAohMCk7dT1uZXcgbC5TdmdDb250ZXh0KHUubm9kZSgpKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih1KTt0aGlzLl9hbm5vdGF0aW9uV3JpdGVyPW5ldyBsLldyaXRlcih0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIsdSl9O3EucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLHg9dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIitxLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh1KSxBPXguZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKHEuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZSh4KTtBLmF0dHJzKHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpKTt0LnNlbGVjdChBLm5vZGVzKClbMF0pLmNsYXNzZWQocS5FTkRfVElDS19NQVJLX0NMQVNTLCEwKS5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goITApKTsKdC5zZWxlY3QoQS5ub2RlcygpW3UubGVuZ3RoLTFdKS5jbGFzc2VkKHEuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCkuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCEwKSk7eC5leGl0KCkucmVtb3ZlKCk7dGhpcy5fYmFzZWxpbmUuYXR0cnModGhpcy5fZ2VuZXJhdGVCYXNlbGluZUF0dHJIYXNoKCkpO3RoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5fZHJhd0Fubm90YXRpb25zKCk6dGhpcy5fcmVtb3ZlQW5ub3RhdGlvbnMoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuYW5ub3RhdGVkVGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5ub3RhdGVkVGlja3N9O3EucHJvdG90eXBlLmFubm90YXRpb25Gb3JtYXR0ZXI9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fYW5ub3RhdGlvbkZvcm1hdHRlcjt0aGlzLl9hbm5vdGF0aW9uRm9ybWF0dGVyPXU7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuYW5ub3RhdGlvbnNFbmFibGVkPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uc0VuYWJsZWR9O3EucHJvdG90eXBlLmFubm90YXRpb25UaWVyQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5ub3RhdGlvblRpZXJDb3VudH07cS5wcm90b3R5cGUuX2RyYXdBbm5vdGF0aW9ucz1mdW5jdGlvbigpe2Z1bmN0aW9uIHUoYWEpe3N3aXRjaChDLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnJldHVybiB5KGFhKTtjYXNlICJ0b3AiOmNhc2UgImxlZnQiOnJldHVybiB5KGFhKS1ELmdldChhYSkuaGVpZ2h0fX1mdW5jdGlvbiB4KGFhKXtyZXR1cm4gTy5oYXMoYWEpPyJoaWRkZW4iOiJ2aXNpYmxlIn1mdW5jdGlvbiBBKGFhKXtyZXR1cm4gQy5fc2NhbGUuc2NhbGUoYWEpfWZ1bmN0aW9uIHkoYWEpe3N3aXRjaChDLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnJldHVybiBOLmdldChhYSkqSStLO2Nhc2UgInRvcCI6Y2FzZSAibGVmdCI6cmV0dXJuIEgtCkstTi5nZXQoYWEpKkl9fWZ1bmN0aW9uIHcoYWEsbGEsWil7YWE9YWEuc2VsZWN0QWxsKCIuIitaKS5kYXRhKEIpO2xhPWFhLmVudGVyKCkuYXBwZW5kKGxhKS5jbGFzc2VkKFosITApLm1lcmdlKGFhKTthYS5leGl0KCkucmVtb3ZlKCk7cmV0dXJuIGxhfXZhciBDPXRoaXMsRj1xLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkcsRD1uZXcgbS5NYXAsQj10aGlzLl9hbm5vdGF0ZWRUaWNrc1RvUmVuZGVyKCk7Qi5mb3JFYWNoKGZ1bmN0aW9uKGFhKXt2YXIgbGE9Qy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoQy5hbm5vdGF0aW9uRm9ybWF0dGVyKCkoYWEpKTtELnNldChhYSx7d2lkdGg6bGEud2lkdGgrMipGLGhlaWdodDpsYS5oZWlnaHQrMipGfSl9KTt2YXIgST10aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKkYsTj10aGlzLl9hbm5vdGF0aW9uVG9UaWVyKEQpLE89bmV3IG0uU2V0LEg9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLmhlaWdodCgpOgp0aGlzLndpZHRoKCksSz10aGlzLl9jb3JlU2l6ZSgpLE09TWF0aC5taW4odGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCksTWF0aC5mbG9vcigoSC1LKS9JKSk7Ti5mb3JFYWNoKGZ1bmN0aW9uKGFhLGxhKXsoLTE9PT1hYXx8YWE+PU0pJiZPLmFkZChsYSl9KTtzd2l0Y2godGhpcy5vcmllbnRhdGlvbigpKXtjYXNlICJib3R0b20iOmNhc2UgInJpZ2h0Ijp2YXIgTD0wO2JyZWFrO2Nhc2UgInRvcCI6TD10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UgImxlZnQiOkw9dGhpcy53aWR0aCgpfXZhciBRPXRoaXMuaXNIb3Jpem9udGFsKCk7dyh0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdCgiLmFubm90YXRpb24tbGluZS1jb250YWluZXIiKSwibGluZSIscS5BTk5PVEFUSU9OX0xJTkVfQ0xBU1MpLmF0dHJzKHt4MTpRP0E6TCx4MjpRP0E6eSx5MTpRP0w6QSx5MjpRP3k6QSx2aXNpYmlsaXR5Onh9KTt3KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiksCiJjaXJjbGUiLHEuQU5OT1RBVElPTl9DSVJDTEVfQ0xBU1MpLmF0dHJzKHtjeDpRP0E6TCxjeTpRP0w6QSxyOjN9KTt3KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1yZWN0LWNvbnRhaW5lciIpLCJyZWN0IixxLkFOTk9UQVRJT05fUkVDVF9DTEFTUykuYXR0cnMoe3g6UT9BOnUseTpRP3U6QSx3aWR0aDpRP2Z1bmN0aW9uKGFhKXtyZXR1cm4gRC5nZXQoYWEpLndpZHRofTpmdW5jdGlvbihhYSl7cmV0dXJuIEQuZ2V0KGFhKS5oZWlnaHR9LGhlaWdodDpRP2Z1bmN0aW9uKGFhKXtyZXR1cm4gRC5nZXQoYWEpLmhlaWdodH06ZnVuY3Rpb24oYWEpe3JldHVybiBELmdldChhYSkud2lkdGh9LHZpc2liaWxpdHk6eH0pO3ZhciBUPXRoaXMuX2Fubm90YXRpb25Xcml0ZXIsWD10aGlzLmFubm90YXRpb25Gb3JtYXR0ZXIoKTtMPXcodGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLWxhYmVsLWNvbnRhaW5lciIpLCJnIixxLkFOTk9UQVRJT05fTEFCRUxfQ0xBU1MpOwpMLnNlbGVjdEFsbCgiLnRleHQtY29udGFpbmVyIikucmVtb3ZlKCk7TC5hdHRycyh7dHJhbnNmb3JtOmZ1bmN0aW9uKGFhKXt2YXIgbGE9UT9BKGFhKTp1KGFhKTthYT1RP3UoYWEpOkEoYWEpO3JldHVybiJ0cmFuc2xhdGUoIitsYSsiLCIrYWErIikifSx2aXNpYmlsaXR5Onh9KS5lYWNoKGZ1bmN0aW9uKGFhKXtULndyaXRlKFgoYWEpLFE/RC5nZXQoYWEpLndpZHRoOkQuZ2V0KGFhKS5oZWlnaHQsUT9ELmdldChhYSkuaGVpZ2h0OkQuZ2V0KGFhKS53aWR0aCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246UT8wOjkwfSx0LnNlbGVjdCh0aGlzKS5ub2RlKCkpfSl9O3EucHJvdG90eXBlLl9hbm5vdGF0ZWRUaWNrc1RvUmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcyx4PXRoaXMuX3NjYWxlLnJhbmdlKCk7cmV0dXJuIG0uQXJyYXkudW5pcSh0aGlzLmFubm90YXRlZFRpY2tzKCkuZmlsdGVyKGZ1bmN0aW9uKEEpe3JldHVybiBudWxsPT1BPyExOm0uTWF0aC5pblJhbmdlKHUuX3NjYWxlLnNjYWxlKEEpLAp4WzBdLHhbMV0pfSkpfTtxLnByb3RvdHlwZS5fY29yZVNpemU9ZnVuY3Rpb24oKXt2YXIgdT10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLHg9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLl9jb21wdXRlSGVpZ2h0KCk6dGhpcy5fY29tcHV0ZVdpZHRoKCk7cmV0dXJuIE1hdGgubWluKHgsdSl9O3EucHJvdG90eXBlLl9hbm5vdGF0aW9uVGllckhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKnEuX0FOTk9UQVRJT05fTEFCRUxfUEFERElOR307cS5wcm90b3R5cGUuX2Fubm90YXRpb25Ub1RpZXI9ZnVuY3Rpb24odSl7dmFyIHg9dGhpcyxBPVtbXV0seT1uZXcgbS5NYXAsdz10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMud2lkdGgoKTp0aGlzLmhlaWdodCgpO3RoaXMuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXIoKS5mb3JFYWNoKGZ1bmN0aW9uKEMpe3ZhciBGPXguX3NjYWxlLnNjYWxlKEMpLApEPXUuZ2V0KEMpLndpZHRoO2lmKDA+Rnx8RitEPncpeS5zZXQoQywtMSk7ZWxzZXtmb3IodmFyIEI9ZnVuY3Rpb24oTil7cmV0dXJuIEFbTl0uc29tZShmdW5jdGlvbihPKXt2YXIgSD14Ll9zY2FsZS5zY2FsZShPKTtPPXUuZ2V0KE8pLndpZHRoO3JldHVybiBGK0Q+PUgmJkY8PUgrT30pfSxJPTA7QihJKTspSSsrLEEubGVuZ3RoPT09SSYmQS5wdXNoKFtdKTtBW0ldLnB1c2goQyk7eS5zZXQoQyxJKX19KTtyZXR1cm4geX07cS5wcm90b3R5cGUuX3JlbW92ZUFubm90YXRpb25zPWZ1bmN0aW9uKCl7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3RBbGwoIi5hbm5vdGF0aW9uLWxpbmUiKS5yZW1vdmUoKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tY2lyY2xlIikucmVtb3ZlKCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3RBbGwoIi5hbm5vdGF0aW9uLXJlY3QiKS5yZW1vdmUoKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGFiZWwiKS5yZW1vdmUoKX07CnEucHJvdG90eXBlLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2g9ZnVuY3Rpb24oKXt2YXIgdT17eDE6MCx5MTowLHgyOjAseTI6MH07c3dpdGNoKHRoaXMuX29yaWVudGF0aW9uKXtjYXNlICJib3R0b20iOnUueDI9dGhpcy53aWR0aCgpO2JyZWFrO2Nhc2UgInRvcCI6dS54Mj10aGlzLndpZHRoKCk7dS55MT10aGlzLmhlaWdodCgpO3UueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlICJsZWZ0Ijp1LngxPXRoaXMud2lkdGgoKTt1LngyPXRoaXMud2lkdGgoKTt1LnkyPXRoaXMuaGVpZ2h0KCk7YnJlYWs7Y2FzZSAicmlnaHQiOnUueTI9dGhpcy5oZWlnaHQoKX1yZXR1cm4gdX07cS5wcm90b3R5cGUuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaD1mdW5jdGlvbih1KXtmdW5jdGlvbiB4KHcpe3JldHVybiBBLl9zY2FsZS5zY2FsZSh3KX12YXIgQT10aGlzO3ZvaWQgMD09PXUmJih1PSExKTt2YXIgeT17eDE6MCx5MTowLHgyOjAseTI6MH07dGhpcy5pc0hvcml6b250YWwoKT8oeS54MT0KeCx5LngyPXgpOih5LnkxPXgseS55Mj14KTt1PXU/dGhpcy5fZW5kVGlja0xlbmd0aDp0aGlzLl9pbm5lclRpY2tMZW5ndGg7c3dpdGNoKHRoaXMuX29yaWVudGF0aW9uKXtjYXNlICJib3R0b20iOnkueTI9dTticmVhaztjYXNlICJ0b3AiOnkueTE9dGhpcy5oZWlnaHQoKTt5LnkyPXRoaXMuaGVpZ2h0KCktdTticmVhaztjYXNlICJsZWZ0Ijp5LngxPXRoaXMud2lkdGgoKTt5LngyPXRoaXMud2lkdGgoKS11O2JyZWFrO2Nhc2UgInJpZ2h0Ijp5LngyPXV9cmV0dXJuIHl9O3EucHJvdG90eXBlLl9zZXREZWZhdWx0QWxpZ25tZW50PWZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX29yaWVudGF0aW9uKXtjYXNlICJib3R0b20iOnRoaXMueUFsaWdubWVudCgidG9wIik7YnJlYWs7Y2FzZSAidG9wIjp0aGlzLnlBbGlnbm1lbnQoImJvdHRvbSIpO2JyZWFrO2Nhc2UgImxlZnQiOnRoaXMueEFsaWdubWVudCgicmlnaHQiKTticmVhaztjYXNlICJyaWdodCI6dGhpcy54QWxpZ25tZW50KCJsZWZ0Iil9fTsKcS5wcm90b3R5cGUuaXNIb3Jpem9udGFsPWZ1bmN0aW9uKCl7cmV0dXJuInRvcCI9PT10aGlzLl9vcmllbnRhdGlvbnx8ImJvdHRvbSI9PT10aGlzLl9vcmllbnRhdGlvbn07cS5wcm90b3R5cGUuZ2V0U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NhbGV9O3EucHJvdG90eXBlLmZvcm1hdHRlcj1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXU7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuaW5uZXJUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lubmVyVGlja0xlbmd0aH07cS5wcm90b3R5cGUuZW5kVGlja0xlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmRUaWNrTGVuZ3RofTtxLnByb3RvdHlwZS5fbWF4TGFiZWxUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2hvd0VuZFRpY2tMYWJlbHMoKT9NYXRoLm1heCh0aGlzLmlubmVyVGlja0xlbmd0aCgpLAp0aGlzLmVuZFRpY2tMZW5ndGgoKSk6dGhpcy5pbm5lclRpY2tMZW5ndGgoKX07cS5wcm90b3R5cGUudGlja0xhYmVsUGFkZGluZz1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl90aWNrTGFiZWxQYWRkaW5nO2lmKDA+dSl0aHJvdyBFcnJvcigidGljayBsYWJlbCBwYWRkaW5nIG11c3QgYmUgcG9zaXRpdmUiKTt0aGlzLl90aWNrTGFiZWxQYWRkaW5nPXU7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUubWFyZ2luPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX21hcmdpbjtpZigwPnUpdGhyb3cgRXJyb3IoIm1hcmdpbiBzaXplIG11c3QgYmUgcG9zaXRpdmUiKTt0aGlzLl9tYXJnaW49dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9vcmllbnRhdGlvbjt1PXUudG9Mb3dlckNhc2UoKTtpZigidG9wIiE9PXUmJiJib3R0b20iIT09CnUmJiJsZWZ0IiE9PXUmJiJyaWdodCIhPT11KXRocm93IEVycm9yKCJ1bnN1cHBvcnRlZCBvcmllbnRhdGlvbiIpO3RoaXMuX29yaWVudGF0aW9uPXU7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuc2hvd0VuZFRpY2tMYWJlbHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd0VuZFRpY2tMYWJlbHN9O3EucHJvdG90eXBlLl9zaG93QWxsVGlja01hcmtzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIitxLlRJQ0tfTUFSS19DTEFTUykuZWFjaChmdW5jdGlvbigpe3Quc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpfSl9O3EucHJvdG90eXBlLl9zaG93QWxsVGlja0xhYmVscz1mdW5jdGlvbigpe3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19MQUJFTF9DTEFTUykuZWFjaChmdW5jdGlvbigpe3Quc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpfSl9OwpxLnByb3RvdHlwZS5faGlkZU92ZXJmbG93aW5nVGlja0xhYmVscz1mdW5jdGlvbigpe3ZhciB1PXRoaXMuZWxlbWVudCgpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx4PXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19MQUJFTF9DTEFTUyk7eC5lbXB0eSgpfHx4LmVhY2goZnVuY3Rpb24oKXttLkRPTS5jbGllbnRSZWN0SW5zaWRlKHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdSl8fHQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9KX07cS5wcm90b3R5cGUuX2hpZGVUaWNrTWFya3NXaXRob3V0TGFiZWw9ZnVuY3Rpb24oKXt2YXIgdT10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19NQVJLX0NMQVNTKSx4PXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19MQUJFTF9DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIEE9dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTsKcmV0dXJuImluaGVyaXQiPT09QXx8InZpc2libGUiPT09QX0pLmRhdGEoKTt1LmVhY2goZnVuY3Rpb24oQSl7LTE9PT14LmluZGV4T2YoQSkmJnQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9KX07cS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLnJlc2V0KCl9O3JldHVybiBxfShkLkNvbXBvbmVudCk7aC5FTkRfVElDS19NQVJLX0NMQVNTPSJlbmQtdGljay1tYXJrIjtoLlRJQ0tfTUFSS19DTEFTUz0idGljay1tYXJrIjtoLlRJQ0tfTEFCRUxfQ0xBU1M9InRpY2stbGFiZWwiO2guQU5OT1RBVElPTl9MSU5FX0NMQVNTPSJhbm5vdGF0aW9uLWxpbmUiO2guQU5OT1RBVElPTl9SRUNUX0NMQVNTPSJhbm5vdGF0aW9uLXJlY3QiO2guQU5OT1RBVElPTl9DSVJDTEVfQ0xBU1M9ImFubm90YXRpb24tY2lyY2xlIjtoLkFOTk9UQVRJT05fTEFCRUxfQ0xBU1M9CiJhbm5vdGF0aW9uLWxhYmVsIjtoLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkc9NDtmLkF4aXM9aH0sZnVuY3Rpb24oZCxmKXtmLlNIT1dfV0FSTklOR1M9ITA7Zi5BRERfVElUTEVfRUxFTUVOVFM9ITB9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbj17fTt0aGlzLl9ldmVudFRhcmdldD1kb2N1bWVudDt0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0PXt9O3RoaXMuX2Nvbm5lY3RlZD0hMX10LnByb3RvdHlwZS5faGFzTm9DYWxsYmFja3M9ZnVuY3Rpb24oKXtmb3IodmFyIGw9T2JqZWN0LmtleXModGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldCkscD0wO3A8bC5sZW5ndGg7cCsrKWlmKDAhPT10aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xbcF1dLnNpemUpcmV0dXJuITE7cmV0dXJuITB9O3QucHJvdG90eXBlLl9jb25uZWN0PWZ1bmN0aW9uKCl7dmFyIGw9dGhpczsKdGhpcy5fY29ubmVjdGVkfHwoT2JqZWN0LmtleXModGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbikuZm9yRWFjaChmdW5jdGlvbihwKXtsLl9ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHAsbC5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwXSl9KSx0aGlzLl9jb25uZWN0ZWQ9ITApfTt0LnByb3RvdHlwZS5fZGlzY29ubmVjdD1mdW5jdGlvbigpe3ZhciBsPXRoaXM7dGhpcy5fY29ubmVjdGVkJiZ0aGlzLl9oYXNOb0NhbGxiYWNrcygpJiYoT2JqZWN0LmtleXModGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbikuZm9yRWFjaChmdW5jdGlvbihwKXtsLl9ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHAsbC5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwXSl9KSx0aGlzLl9jb25uZWN0ZWQ9ITEpfTt0LnByb3RvdHlwZS5fYWRkQ2FsbGJhY2tGb3JFdmVudD1mdW5jdGlvbihsLHApe251bGw9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbbF0mJgoodGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXT1uZXcgay5DYWxsYmFja1NldCk7dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXS5hZGQocCk7dGhpcy5fY29ubmVjdCgpfTt0LnByb3RvdHlwZS5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudD1mdW5jdGlvbihsLHApe251bGwhPXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbbF0mJnRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbbF0uZGVsZXRlKHApO3RoaXMuX2Rpc2Nvbm5lY3QoKX07dC5wcm90b3R5cGUuX2NhbGxDYWxsYmFja3NGb3JFdmVudD1mdW5jdGlvbihsKXtmb3IodmFyIHA9W10sbT0xO208YXJndW1lbnRzLmxlbmd0aDttKyspcFttLTFdPWFyZ3VtZW50c1ttXTttPXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbbF07bnVsbCE9bSYmbS5jYWxsQ2FsbGJhY2tzLmFwcGx5KG0scCl9O3JldHVybiB0fSgpO2YuRGlzcGF0Y2hlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwKKGZbbF09dFtsXSl9ayhoKDg3KSk7ayhoKDg4KSk7ayhoKDQwKSk7ayhoKDg5KSk7ayhoKDkwKSk7ZD1oKDI2KTtmLnpvb21PdXQ9ZC56b29tT3V0fSxmdW5jdGlvbihkLGYpe2Z1bmN0aW9uIGgobixxLHUpe3JldHVybiB1LSh1LW4pKnF9ZnVuY3Rpb24gayhuLHEsdSl7cmV0dXJuKG4qcS11KS8ocS0xKX1mdW5jdGlvbiB0KG4scSx1LHgpe3ZhciBBPTE8cTt1PUE/eDp1O2lmKG51bGw9PXUpcmV0dXJuIHE7bj1uLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCk7cmV0dXJuKEE/TWF0aC5taW46TWF0aC5tYXgpKHEsdS9NYXRoLmFicyhuWzFdLW5bMF0pKX1mdW5jdGlvbiBsKG4scSx1LHgsQSl7aWYoMT49cSlyZXR1cm57Y2VudGVyUG9pbnQ6dSx6b29tQW1vdW50OnF9O2lmKG51bGw9PXgmJm51bGw9PUEpcmV0dXJue2NlbnRlclBvaW50OnUsem9vbUFtb3VudDpxfTt2YXIgeT1wKG4pLHc9bShuKSxDPXc/SW5maW5pdHk6LUluZmluaXR5O3c9dz8tSW5maW5pdHk6SW5maW5pdHk7eD1udWxsPT0KeD9DOng7QT1udWxsPT1BP3c6QTt3PW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtDPXdbMF07dz13WzFdO0E9bi5zY2FsZVRyYW5zZm9ybWF0aW9uKEEpO3c9bi5zY2FsZVRyYW5zZm9ybWF0aW9uKHcpO3ZhciBGPWgodyxxLHUpO3g9bi5zY2FsZVRyYW5zZm9ybWF0aW9uKHgpO249bi5zY2FsZVRyYW5zZm9ybWF0aW9uKEMpO0M9aChuLHEsdSk7cmV0dXJuIE1hdGguYWJzKEYtQyk+TWF0aC5hYnMoQS14KT8ocT0oQS14KS8ody1uKSwxIT09cT97Y2VudGVyUG9pbnQ6ayh3LHEsQSksem9vbUFtb3VudDpxfTp7Y2VudGVyUG9pbnQ6dSx6b29tQW1vdW50OnF9KTpGPkEhPXk/e2NlbnRlclBvaW50OmsodyxxLEEpLHpvb21BbW91bnQ6cX06Qzx4IT15P3tjZW50ZXJQb2ludDprKG4scSx4KSx6b29tQW1vdW50OnF9OntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX19ZnVuY3Rpb24gcChuKXtuPW4ucmFuZ2UoKTtyZXR1cm4gblsxXTxuWzBdfWZ1bmN0aW9uIG0obil7bj1uLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCk7CnJldHVybiBuWzFdPG5bMF19Zi56b29tT3V0PWg7Zi5jb25zdHJhaW5lZFpvb209ZnVuY3Rpb24obixxLHUseCxBLHksdyl7cT10KG4scSx4LEEpO3JldHVybiBsKG4scSx1LHksdyl9O2YuY29uc3RyYWluWm9vbUV4dGVudHM9dDtmLmNvbnN0cmFpblpvb21WYWx1ZXM9bDtmLmNvbnN0cmFpbmVkVHJhbnNsYXRpb249ZnVuY3Rpb24obixxLHUseCl7dmFyIEE9bi5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpLHk9QVswXSx3PUFbMV07QT1wKG4pOzA8cSE9PUE/KHU9eCxudWxsIT11JiYoeT1uLnNjYWxlVHJhbnNmb3JtYXRpb24odyksbj1uLnNjYWxlVHJhbnNmb3JtYXRpb24odSkscT0oQT9NYXRoLm1heDpNYXRoLm1pbikoeStxLG4pLXkpKTpudWxsIT11JiYoeT1uLnNjYWxlVHJhbnNmb3JtYXRpb24oeSksbj1uLnNjYWxlVHJhbnNmb3JtYXRpb24odSkscT0oQT9NYXRoLm1pbjpNYXRoLm1heCkoeStxLG4pLXkpO3JldHVybiBxfX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsoSSwKTixPKXt2YXIgSD1JLnNjYWxlO2lmKEggaW5zdGFuY2VvZiB5LkNhdGVnb3J5KU89SC5yYW5nZUJhbmQoKTtlbHNle3ZhciBLPUkuYWNjZXNzb3I7ST1sLnNldChDLkFycmF5LmZsYXR0ZW4oTi5tYXAoZnVuY3Rpb24oTSl7cmV0dXJuIE0uZGF0YSgpLm1hcChmdW5jdGlvbihMLFEpe3JldHVybiBLKEwsUSxNKX0pLmZpbHRlcihmdW5jdGlvbihMKXtyZXR1cm4gbnVsbCE9TH0pLm1hcChmdW5jdGlvbihMKXtyZXR1cm4gTC52YWx1ZU9mKCl9KX0pKSkudmFsdWVzKCkubWFwKGZ1bmN0aW9uKE0pe3JldHVybitNfSk7SS5zb3J0KGZ1bmN0aW9uKE0sTCl7cmV0dXJuIE0tTH0pO0k9SS5tYXAoZnVuY3Rpb24oTSl7cmV0dXJuIEguc2NhbGUoTSl9KTtJPWwucGFpcnMoSSk7Tz1DLk1hdGgubWluKEksZnVuY3Rpb24oTSl7cmV0dXJuIE1hdGguYWJzKE1bMV0tTVswXSl9LE8qQi5fU0lOR0xFX0JBUl9ESU1FTlNJT05fUkFUSU8pO08qPUIuX0JBUl9USElDS05FU1NfUkFUSU99cmV0dXJuIE99CnZhciB0PXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihJLE4pe2Z1bmN0aW9uIE8oKXt0aGlzLmNvbnN0cnVjdG9yPUl9Zm9yKHZhciBIIGluIE4pTi5oYXNPd25Qcm9wZXJ0eShIKSYmKElbSF09TltIXSk7SS5wcm90b3R5cGU9bnVsbD09PU4/T2JqZWN0LmNyZWF0ZShOKTooTy5wcm90b3R5cGU9Ti5wcm90b3R5cGUsbmV3IE8pfSxsPWgoMSkscD1oKDUpLG09aCg3KSxuPWgoOCkscT1oKDE0KSx1PWgoNikseD1oKDM0KSxBPWgoMjApLHk9aCgzKSx3PWgoMTEpLEM9aCgwKTtkPWgoMTApO3ZhciBGPWgoMTkpLEQ9aCgyKTtoPWgoMTYpO2YuQmFyT3JpZW50YXRpb249ZC5tYWtlRW51bShbInZlcnRpY2FsIiwiaG9yaXpvbnRhbCJdKTtmLkxhYmVsc1Bvc2l0aW9uPWQubWFrZUVudW0oWyJzdGFydCIsIm1pZGRsZSIsImVuZCIsIm91dHNpZGUiXSk7Zi5CYXJBbGlnbm1lbnQ9ZC5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIl0pO3ZhciBCPWZ1bmN0aW9uKEkpe2Z1bmN0aW9uIE4oTyl7dm9pZCAwPT09Ck8mJihPPSJ2ZXJ0aWNhbCIpO3ZhciBIPUkuY2FsbCh0aGlzKXx8dGhpcztILl9sYWJlbEZvcm1hdHRlcj1uLmlkZW50aXR5KCk7SC5fbGFiZWxzRW5hYmxlZD0hMTtILl9sYWJlbHNQb3NpdGlvbj1mLkxhYmVsc1Bvc2l0aW9uLmVuZDtILl9oaWRlQmFyc0lmQW55QXJlVG9vV2lkZT0hMDtILl9iYXJBbGlnbm1lbnQ9Im1pZGRsZSI7SC5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzPUEubWVtb2l6ZShrKTtILl9maXhlZEJhclBpeGVsVGhpY2tuZXNzPSEwO0guYWRkQ2xhc3MoImJhci1wbG90Iik7aWYoInZlcnRpY2FsIiE9PU8mJiJob3Jpem9udGFsIiE9PU8pdGhyb3cgRXJyb3IoTysiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBQbG90cy5CYXIiKTtILl9pc1ZlcnRpY2FsPSJ2ZXJ0aWNhbCI9PT1PO0guYW5pbWF0b3IoImJhc2VsaW5lIixuZXcgbS5OdWxsKTtILmF0dHIoImZpbGwiLChuZXcgeS5Db2xvcikucmFuZ2UoKVswXSk7SC5hdHRyKE4uX0JBUl9USElDS05FU1NfS0VZLApmdW5jdGlvbigpe3JldHVybiBILl9iYXJQaXhlbFRoaWNrbmVzcygpfSk7SC5fbGFiZWxDb25maWc9bmV3IEMuTWFwO0guX2Jhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybltILmJhc2VsaW5lVmFsdWUoKV19O3JldHVybiBIfXQoTixJKTtOLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKE8sSCxLKXtJLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxPLEgsSyk7dGhpcy5fdXBkYXRlRXh0ZW50cygpO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS54PWZ1bmN0aW9uKE8sSCl7aWYobnVsbD09TylyZXR1cm4gSS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PUg/SS5wcm90b3R5cGUueC5jYWxsKHRoaXMsTyk6SS5wcm90b3R5cGUueC5jYWxsKHRoaXMsTyxIKTt0aGlzLl91cGRhdGVUaGlja25lc3NBdHRyKCk7dGhpcy5fdXBkYXRlTGVuZ3RoU2NhbGUoKTtyZXR1cm4gdGhpc307Ti5wcm90b3R5cGUueT1mdW5jdGlvbihPLEgpe2lmKG51bGw9PQpPKXJldHVybiBJLnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09SD9JLnByb3RvdHlwZS55LmNhbGwodGhpcyxPKTpJLnByb3RvdHlwZS55LmNhbGwodGhpcyxPLEgpO3RoaXMuX3VwZGF0ZUxlbmd0aFNjYWxlKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLmxlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP3RoaXMueSgpOnRoaXMueCgpfTtOLnByb3RvdHlwZS5wb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP3RoaXMueCgpOnRoaXMueSgpfTtOLnByb3RvdHlwZS5iYXJFbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoTi5fQkFSX0VORF9LRVkpfTtOLnByb3RvdHlwZS5iYXJBbGlnbm1lbnQ9ZnVuY3Rpb24oTyl7aWYobnVsbD09TylyZXR1cm4gdGhpcy5fYmFyQWxpZ25tZW50O3RoaXMuX2JhckFsaWdubWVudD1PO3RoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKTt0aGlzLnJlbmRlcigpOwpyZXR1cm4gdGhpc307Ti5wcm90b3R5cGUub3JpZW50YXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWZXJ0aWNhbD8idmVydGljYWwiOiJob3Jpem9udGFsIn07Ti5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgdS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgeC5SZWN0YW5nbGVTVkdEcmF3ZXIoTi5fQkFSX0FSRUFfQ0xBU1MpfSxmdW5jdGlvbihPKXtyZXR1cm4gbmV3IHEuUmVjdGFuZ2xlQ2FudmFzRHJhd2VyKE8pfSl9O04ucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe0kucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2Jhc2VsaW5lPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCEwKX07Ti5wcm90b3R5cGUuYmFzZWxpbmVWYWx1ZT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuX2Jhc2VsaW5lVmFsdWUpcmV0dXJuIHRoaXMuX2Jhc2VsaW5lVmFsdWU7aWYoIXRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXJldHVybiAwOwp2YXIgTz10aGlzLmxlbmd0aCgpLnNjYWxlO3JldHVybiBPP08gaW5zdGFuY2VvZiB5LlRpbWU/bmV3IERhdGUoMCk6MDowfTtOLnByb3RvdHlwZS5hZGREYXRhc2V0PWZ1bmN0aW9uKE8pe0kucHJvdG90eXBlLmFkZERhdGFzZXQuY2FsbCh0aGlzLE8pfTtOLnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihPKXtJLnByb3RvdHlwZS5fYWRkRGF0YXNldC5jYWxsKHRoaXMsTyk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oTyl7SS5wcm90b3R5cGUucmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsTyl9O04ucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKE8pe0kucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxPKTtyZXR1cm4gdGhpc307Ti5wcm90b3R5cGUuZGF0YXNldHM9ZnVuY3Rpb24oTyl7aWYobnVsbD09TylyZXR1cm4gSS5wcm90b3R5cGUuZGF0YXNldHMuY2FsbCh0aGlzKTtJLnByb3RvdHlwZS5kYXRhc2V0cy5jYWxsKHRoaXMsCk8pO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS5sYWJlbHNFbmFibGVkPWZ1bmN0aW9uKE8sSCl7aWYobnVsbD09TylyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDt0aGlzLl9sYWJlbHNFbmFibGVkPU87bnVsbCE9SCYmKHRoaXMuX2xhYmVsc1Bvc2l0aW9uPUgpO3RoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS5sYWJlbEZvcm1hdHRlcj1mdW5jdGlvbihPKXtpZihudWxsPT1PKXJldHVybiB0aGlzLl9sYWJlbEZvcm1hdHRlcjt0aGlzLl9sYWJlbEZvcm1hdHRlcj1PO3RoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKE8pe3ZhciBIPUkucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLE8pLEs9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKE4uX0xBQkVMX0FSRUFfQ0xBU1MsCiEwKSxNPW5ldyBwLlN2Z0NvbnRleHQoSy5ub2RlKCkpLEw9bmV3IHAuQ2FjaGVNZWFzdXJlcihNKTtNPW5ldyBwLldyaXRlcihMLE0pO3RoaXMuX2xhYmVsQ29uZmlnLnNldChPLHtsYWJlbEFyZWE6SyxtZWFzdXJlcjpMLHdyaXRlcjpNfSk7cmV0dXJuIEh9O04ucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oTyl7SS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsTyk7dmFyIEg9dGhpcy5fbGFiZWxDb25maWcuZ2V0KE8pO251bGwhPUgmJihILmxhYmVsQXJlYS5yZW1vdmUoKSx0aGlzLl9sYWJlbENvbmZpZy5kZWxldGUoTykpfTtOLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKE8pe3ZhciBIPXRoaXM7cmV0dXJuIHRoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZChmdW5jdGlvbigpe2Z1bmN0aW9uIEsoY2Esa2EsWSxFYSl7cmV0dXJuIEguX3BpeGVsUG9pbnRCYXIoYWEoY2Esa2EsWSksbGEsRWEpfQp2YXIgTT1ILl9pc1ZlcnRpY2FsP08ueDpPLnksTD1ILl9pc1ZlcnRpY2FsP08ueTpPLngsUT1ILmJvdW5kcygpLFQ9e21pbjowLG1heDpRLmJvdHRvbVJpZ2h0LngtUS50b3BMZWZ0Lnh9LFg9e21pbjowLG1heDpRLmJvdHRvbVJpZ2h0LnktUS50b3BMZWZ0Lnl9LGFhPUQuUGxvdC5fc2NhbGVkQWNjZXNzb3IoSC5sZW5ndGgoKSksbGE9SC5sZW5ndGgoKS5zY2FsZS5zY2FsZShILmJhc2VsaW5lVmFsdWUoKSksWj1JbmZpbml0eSxiYT1JbmZpbml0eSxlYTtILl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihjYSl7dmFyIGthPUguX2VudGl0eUJvdW5kcyhjYSk7aWYoQy5ET00uaW50ZXJzZWN0c0JCb3goVCxYLGthKSl7dmFyIFk9MCxFYT0wO2lmKCFDLkRPTS5pbnRlcnNlY3RzQkJveChPLngsTy55LGthLC41KSl7RWE9SyhjYS5kYXR1bSxjYS5pbmRleCxjYS5kYXRhc2V0LGthKTtZPU1hdGguYWJzKE0tKEguX2lzVmVydGljYWw/RWEueDpFYS55KSk7CnZhciB2YT1ILl9pc1ZlcnRpY2FsP2thLnk6a2EueDtrYT12YSsoSC5faXNWZXJ0aWNhbD9rYS5oZWlnaHQ6a2Eud2lkdGgpO0VhPUw+PXZhLS41JiZMPD1rYSsuNT8wOk1hdGguYWJzKEwtKEguX2lzVmVydGljYWw/RWEueTpFYS54KSl9aWYoWTxafHxZPT09WiYmRWE8YmEpZWE9Y2EsWj1ZLGJhPUVhfX0pO2lmKHZvaWQgMCE9PWVhKXJldHVybiBILl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoZWEpfSl9O04ucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oTyl7cmV0dXJuIHRoaXMuX2VudGl0aWVzSW50ZXJzZWN0aW5nKE8ueCxPLnkpfTtOLnByb3RvdHlwZS5fZW50aXRpZXNJbnRlcnNlY3Rpbmc9ZnVuY3Rpb24oTyxIKXt2YXIgSz10aGlzLE09W107dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24oTCl7Qy5ET00uaW50ZXJzZWN0c0JCb3goTyxILEsuX2VudGl0eUJvdW5kcyhMKSkmJk0ucHVzaChLLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoTCkpfSk7CnJldHVybiBNfTtOLnByb3RvdHlwZS5fdXBkYXRlTGVuZ3RoU2NhbGU9ZnVuY3Rpb24oKXtpZih0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSl7dmFyIE89dGhpcy5sZW5ndGgoKS5zY2FsZTtPIGluc3RhbmNlb2Ygdy5RdWFudGl0YXRpdmVTY2FsZSYmKE8uYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpLE8uYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpKX19O04ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIE89dGhpczt0aGlzLl9iYXJQaXhlbFRoaWNrbmVzcygpO3JldHVybiB0aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQoZnVuY3Rpb24oKXtyZXR1cm4gSS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbChPKX0pfTtOLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKE8pe3ZhciBIPXRoaXMsSz10aGlzLmxlbmd0aCgpLnNjYWxlLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTsKSz17eDE6dGhpcy5faXNWZXJ0aWNhbD8wOksseTE6dGhpcy5faXNWZXJ0aWNhbD9LOjAseDI6dGhpcy5faXNWZXJ0aWNhbD90aGlzLndpZHRoKCk6Syx5Mjp0aGlzLl9pc1ZlcnRpY2FsP0s6dGhpcy5oZWlnaHQoKX07dGhpcy5fZ2V0QW5pbWF0b3IoImJhc2VsaW5lIikuYW5pbWF0ZSh0aGlzLl9iYXNlbGluZSxLKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihNKXtyZXR1cm4gSC5fbGFiZWxDb25maWcuZ2V0KE0pLmxhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKX0pO3RoaXMuX2xhYmVsc0VuYWJsZWQmJkMuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gSC5fZHJhd0xhYmVscygpfSxPKX07Ti5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKE8pe3ZhciBIPXRoaXMsSz1JLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLE8pO2lmKCJ4Ij09PU8mJnRoaXMuX2lzVmVydGljYWwpTz10aGlzLngoKTsKZWxzZXtpZigieSIhPT1PfHx0aGlzLl9pc1ZlcnRpY2FsKXJldHVybiBLO089dGhpcy55KCl9aWYoIShPJiZPLnNjYWxlJiZPLnNjYWxlIGluc3RhbmNlb2Ygdy5RdWFudGl0YXRpdmVTY2FsZSkpcmV0dXJuIEs7dmFyIE09Ty5zY2FsZSxMPXRoaXMuX2JhclBpeGVsVGhpY2tuZXNzKCk7cmV0dXJuIEs9Sy5tYXAoZnVuY3Rpb24oUSl7cmV0dXJuIGwuZXh0ZW50KFtNLmludmVydChILl9nZXRQb3NpdGlvbkF0dHIoTS5zY2FsZShRWzBdKSxMKSksTS5pbnZlcnQoSC5fZ2V0UG9zaXRpb25BdHRyKE0uc2NhbGUoUVswXSksTCkrTCksTS5pbnZlcnQoSC5fZ2V0UG9zaXRpb25BdHRyKE0uc2NhbGUoUVsxXSksTCkpLE0uaW52ZXJ0KEguX2dldFBvc2l0aW9uQXR0cihNLnNjYWxlKFFbMV0pLEwpK0wpXSl9KX07Ti5wcm90b3R5cGUuX2dldFBvc2l0aW9uQXR0cj1mdW5jdGlvbihPLEgpe3RoaXMuX2lzVmVydGljYWx8fChPLT1ILEgqPS0xKTtzd2l0Y2godGhpcy5fYmFyQWxpZ25tZW50KXtjYXNlICJzdGFydCI6cmV0dXJuIE87CmNhc2UgImVuZCI6cmV0dXJuIE8tSDtkZWZhdWx0OnJldHVybiBPLUgvMn19O04ucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7dmFyIE89dGhpcyxIPXRoaXMuX2dldERhdGFUb0RyYXcoKSxLPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLE09dGhpcy5kYXRhc2V0cygpLnNvbWUoZnVuY3Rpb24oTCl7cmV0dXJuIEguZ2V0KEwpLnNvbWUoZnVuY3Rpb24oUSxUKXtyZXR1cm4gbnVsbD09UT8hMTpPLl9kcmF3TGFiZWwoUSxULEwsSyl9KX0pO3RoaXMuX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlJiZNJiZ0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihMKXtyZXR1cm4gTy5fbGFiZWxDb25maWcuZ2V0KEwpLmxhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKX0pfTtOLnByb3RvdHlwZS5fZHJhd0xhYmVsPWZ1bmN0aW9uKE8sSCxLLE0pe3ZhciBMPXRoaXMuX2xhYmVsQ29uZmlnLmdldChLKSxRPUwubGFiZWxBcmVhLFQ9TC5tZWFzdXJlcjtMPUwud3JpdGVyOwp2YXIgWD10aGlzLmxlbmd0aCgpLmFjY2Vzc29yLGFhPVgoTyxILEspO1g9dGhpcy5sZW5ndGgoKS5zY2FsZTt2YXIgbGE9bnVsbCE9WD9YLnNjYWxlKGFhKTphYSxaPW51bGwhPVg/WC5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSk6dGhpcy5iYXNlbGluZVZhbHVlKCksYmE9e3g6TS54KE8sSCxLKSx5Ok0ueShPLEgsSyl9O1g9e3dpZHRoOk0ud2lkdGgoTyxILEspLGhlaWdodDpNLmhlaWdodChPLEgsSyl9O2FhPXRoaXMuX2xhYmVsRm9ybWF0dGVyKGFhLE8sSCxLKTtUPVQubWVhc3VyZShhYSk7dmFyIGVhPXRoaXMuX3Nob3VsZFNob3dMYWJlbE9uQmFyKGJhLFgsVCk7YmE9dGhpcy5fY2FsY3VsYXRlTGFiZWxQcm9wZXJ0aWVzKGJhLFgsVCxlYSx0aGlzLl9pc1ZlcnRpY2FsP2xhPD1aOmxhPFopO2xhPWJhLmNvbnRhaW5lckRpbWVuc2lvbnM7Wj1iYS5sYWJlbENvbnRhaW5lck9yaWdpbjtiYT1iYS5hbGlnbm1lbnQ7Tz1NLmZpbGwoTyxILEspO1E9dGhpcy5fY3JlYXRlTGFiZWxDb250YWluZXIoUSwKWixlYSxPKTtMLndyaXRlKGFhLGxhLndpZHRoLGxhLmhlaWdodCx7eEFsaWduOmJhLngseUFsaWduOmJhLnl9LFEubm9kZSgpKTtyZXR1cm4gdGhpcy5faXNWZXJ0aWNhbD9YLndpZHRoPFQud2lkdGg6WC5oZWlnaHQ8VC5oZWlnaHR9O04ucHJvdG90eXBlLl9zaG91bGRTaG93TGFiZWxPbkJhcj1mdW5jdGlvbihPLEgsSyl7aWYodGhpcy5fbGFiZWxzUG9zaXRpb249PT1mLkxhYmVsc1Bvc2l0aW9uLm91dHNpZGUpcmV0dXJuITE7Tz10aGlzLl9pc1ZlcnRpY2FsP08ueTpPLng7dmFyIE09dGhpcy5faXNWZXJ0aWNhbD9ILmhlaWdodDpILndpZHRoO0g9dGhpcy5faXNWZXJ0aWNhbD90aGlzLmhlaWdodCgpOnRoaXMud2lkdGgoKTtLPXRoaXMuX2lzVmVydGljYWw/Sy5oZWlnaHQ6Sy53aWR0aDt2YXIgTD1PK007TD5IP009SC1POjA+TyYmKE09TCk7cmV0dXJuIEsrTi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI8PU19O04ucHJvdG90eXBlLl9jYWxjdWxhdGVMYWJlbFByb3BlcnRpZXM9CmZ1bmN0aW9uKE8sSCxLLE0sTCl7ZnVuY3Rpb24gUShrYSl7c3dpdGNoKGthKXtjYXNlICJ0b3BMZWZ0IjpaPVQuX2lzVmVydGljYWw/InRvcCI6ImxlZnQiO2VhKz1OLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjtjYSs9Ti5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI7YnJlYWs7Y2FzZSAiY2VudGVyIjpjYSs9KGFhK2xhKS8yO2JyZWFrO2Nhc2UgImJvdHRvbVJpZ2h0IjpaPVQuX2lzVmVydGljYWw/ImJvdHRvbSI6InJpZ2h0IixlYS09Ti5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIsY2ErPWJhLU4uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSLWxhfX12YXIgVD10aGlzLFg9dGhpcy5faXNWZXJ0aWNhbD9PLnk6Ty54LGFhPXRoaXMuX2lzVmVydGljYWw/SC5oZWlnaHQ6SC53aWR0aCxsYT10aGlzLl9pc1ZlcnRpY2FsP0suaGVpZ2h0Oksud2lkdGgsWj0iY2VudGVyIixiYT1hYSxlYT1YLGNhPVg7aWYoTSlzd2l0Y2godGhpcy5fbGFiZWxzUG9zaXRpb24pe2Nhc2UgZi5MYWJlbHNQb3NpdGlvbi5zdGFydDpMPwpRKCJib3R0b21SaWdodCIpOlEoInRvcExlZnQiKTticmVhaztjYXNlIGYuTGFiZWxzUG9zaXRpb24ubWlkZGxlOlEoImNlbnRlciIpO2JyZWFrO2Nhc2UgZi5MYWJlbHNQb3NpdGlvbi5lbmQ6TD9RKCJ0b3BMZWZ0Iik6USgiYm90dG9tUmlnaHQiKX1lbHNlIEw/KFo9dGhpcy5faXNWZXJ0aWNhbD8idG9wIjoibGVmdCIsYmE9YWErTi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrbGEsZWEtPU4uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK2xhLGNhLT1OLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitsYSk6KFo9dGhpcy5faXNWZXJ0aWNhbD8iYm90dG9tIjoicmlnaHQiLGJhPWFhK04uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK2xhLGNhKz1hYStOLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUik7cmV0dXJue2NvbnRhaW5lckRpbWVuc2lvbnM6e3dpZHRoOnRoaXMuX2lzVmVydGljYWw/SC53aWR0aDpiYSxoZWlnaHQ6dGhpcy5faXNWZXJ0aWNhbD9iYTpILmhlaWdodH0sbGFiZWxDb250YWluZXJPcmlnaW46e3g6dGhpcy5faXNWZXJ0aWNhbD8KTy54OmVhLHk6dGhpcy5faXNWZXJ0aWNhbD9lYTpPLnl9LGxhYmVsT3JpZ2luOnt4OnRoaXMuX2lzVmVydGljYWw/Ty54K0gud2lkdGgvMi1LLndpZHRoLzI6Y2EseTp0aGlzLl9pc1ZlcnRpY2FsP2NhOk8ueStILmhlaWdodC8yLUsuaGVpZ2h0LzJ9LGFsaWdubWVudDp7eDp0aGlzLl9pc1ZlcnRpY2FsPyJjZW50ZXIiOloseTp0aGlzLl9pc1ZlcnRpY2FsP1o6ImNlbnRlciJ9fX07Ti5wcm90b3R5cGUuX2NyZWF0ZUxhYmVsQ29udGFpbmVyPWZ1bmN0aW9uKE8sSCxLLE0pe089Ty5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitILngrIiwgIitILnkrIikiKTtLPyhPLmNsYXNzZWQoIm9uLWJhci1sYWJlbCIsITApLEs9MS42KkMuQ29sb3IuY29udHJhc3QoIndoaXRlIixNKTxDLkNvbG9yLmNvbnRyYXN0KCJibGFjayIsTSksTy5jbGFzc2VkKEs/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApKTpPLmNsYXNzZWQoIm9mZi1iYXItbGFiZWwiLCEwKTtyZXR1cm4gT307Ck4ucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBPPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEg9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksSz10aGlzLmxlbmd0aCgpLnNjYWxlLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKSxNPXRoaXMuX2lzVmVydGljYWw/ImhlaWdodCI6IndpZHRoIjtIW3RoaXMuX2lzVmVydGljYWw/InkiOiJ4Il09ZnVuY3Rpb24oKXtyZXR1cm4gS307SFtNXT1mdW5jdGlvbigpe3JldHVybiAwfTtPLnB1c2goe2F0dHJUb1Byb2plY3RvcjpILGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKEYuQW5pbWF0b3IuUkVTRVQpfSl9Ty5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoRi5BbmltYXRvci5NQUlOKX0pO3JldHVybiBPfTtOLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBPKGJhLAplYSxjYSl7cmV0dXJuIE1hdGguYWJzKE0tWChiYSxlYSxjYSkpfXZhciBIPXRoaXMsSz1JLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSxNPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpLEw9dGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiLFE9dGhpcy5faXNWZXJ0aWNhbD8ieCI6InkiLFQ9RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnBvc2l0aW9uKCkpLFg9RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLmxlbmd0aCgpKSxhYT1LW04uX0JBUl9USElDS05FU1NfS0VZXSxsYT1LLmdhcCxaPW51bGw9PWxhP2FhOmZ1bmN0aW9uKGJhLGVhLGNhKXtyZXR1cm4gYWEoYmEsZWEsY2EpLWxhKGJhLGVhLGNhKX07Sy53aWR0aD10aGlzLl9pc1ZlcnRpY2FsP1o6TztLLmhlaWdodD10aGlzLl9pc1ZlcnRpY2FsP086WjtLW0xdPWZ1bmN0aW9uKGJhLGVhLGNhKXtiYT1YKGJhLGVhLGNhKTtyZXR1cm4gYmE+TT9NOmJhfTsKS1tRXT1mdW5jdGlvbihiYSxlYSxjYSl7cmV0dXJuIEguX2dldFBvc2l0aW9uQXR0cihUKGJhLGVhLGNhKSxhYShiYSxlYSxjYSkpfTtyZXR1cm4gS307Ti5wcm90b3R5cGUuX3VwZGF0ZVRoaWNrbmVzc0F0dHI9ZnVuY3Rpb24oKXt2YXIgTz10aGlzLEg9dGhpcy5wb3NpdGlvbigpLEs9dGhpcy5iYXJFbmQoKTtudWxsIT1IJiZudWxsIT1LPyh0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzPSExLHRoaXMuYXR0cihOLl9CQVJfVEhJQ0tORVNTX0tFWSxmdW5jdGlvbihNLEwsUSl7dmFyIFQ9SC5hY2Nlc3NvcihNLEwsUSk7TT1LLmFjY2Vzc29yKE0sTCxRKTtUPUguc2NhbGU/SC5zY2FsZS5zY2FsZShUKTpUO009Sy5zY2FsZT9LLnNjYWxlLnNjYWxlKE0pOk07cmV0dXJuIE1hdGguYWJzKE0tVCl9KSk6KHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITAsdGhpcy5hdHRyKE4uX0JBUl9USElDS05FU1NfS0VZLGZ1bmN0aW9uKCl7cmV0dXJuIE8uX2JhclBpeGVsVGhpY2tuZXNzKCl9KSl9OwpOLnByb3RvdHlwZS5fYmFyUGl4ZWxUaGlja25lc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz90aGlzLl9wcm9qZWN0b3JzUmVhZHkoKT90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3ModGhpcy5wb3NpdGlvbigpLHRoaXMuZGF0YXNldHMoKSx0aGlzLl9pc1ZlcnRpY2FsP3RoaXMud2lkdGgoKTp0aGlzLmhlaWdodCgpKTowOjB9O04ucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKE8pe3ZvaWQgMD09PU8mJihPPXRoaXMuZGF0YXNldHMoKSk7cmV0dXJuIHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpP0kucHJvdG90eXBlLmVudGl0aWVzLmNhbGwodGhpcyxPKTpbXX07Ti5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbihPKXtyZXR1cm4gdGhpcy5fcGl4ZWxCb3VuZHMoTy5kYXR1bSxPLmluZGV4LE8uZGF0YXNldCl9O04ucHJvdG90eXBlLl9waXhlbEJvdW5kcz1mdW5jdGlvbihPLEgsSyl7dmFyIE09dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7CnJldHVybnt4Ok0ueChPLEgsSykseTpNLnkoTyxILEspLHdpZHRoOk0ud2lkdGgoTyxILEspLGhlaWdodDpNLmhlaWdodChPLEgsSyl9fTtOLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbihPLEgsSyl7dmFyIE09dGhpcy5fcGl4ZWxCb3VuZHMoTyxILEspO089KHRoaXMuX2lzVmVydGljYWw/RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk6RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkpKE8sSCxLKTtIPSh0aGlzLl9pc1ZlcnRpY2FsP3RoaXMueSgpLnNjYWxlOnRoaXMueCgpLnNjYWxlKS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSk7cmV0dXJuIHRoaXMuX3BpeGVsUG9pbnRCYXIoTyxILE0pfTtOLnByb3RvdHlwZS5fcGl4ZWxQb2ludEJhcj1mdW5jdGlvbihPLEgsSyl7aWYodGhpcy5faXNWZXJ0aWNhbCl7dmFyIE09Sy54K0sud2lkdGgvMjtPPU88PUg/Sy55OksueStLLmhlaWdodH1lbHNlIE09Tz49SD9LLngrSy53aWR0aDpLLngsTz1LLnkrSy5oZWlnaHQvCjI7cmV0dXJue3g6TSx5Ok99fTtOLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24oTyxIKXtJLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLE8sSCl9O04ucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIE89dGhpcyxIPW5ldyBDLk1hcCxLPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLE09dGhpcy53aWR0aCgpLEw9dGhpcy5oZWlnaHQoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihRKXt2YXIgVD1RLmRhdGEoKS5tYXAoZnVuY3Rpb24oWCxhYSl7cmV0dXJuIE8uX2lzRGF0dW1PblNjcmVlbihLLE0sTCxYLGFhLFEpP1g6bnVsbH0pO0guc2V0KFEsVCl9KTtyZXR1cm4gSH07Ti5wcm90b3R5cGUuX2lzRGF0dW1PblNjcmVlbj1mdW5jdGlvbihPLEgsSyxNLEwsUSl7dmFyIFQ9Ty54KE0sTCxRKSxYPU8ueShNLEwsUSksYWE9Ty53aWR0aChNLEwsUSk7Tz1PLmhlaWdodChNLEwsUSk7cmV0dXJuIEMuTWF0aC5pc1ZhbGlkTnVtYmVyKFQpJiYKQy5NYXRoLmlzVmFsaWROdW1iZXIoWCkmJkMuTWF0aC5pc1ZhbGlkTnVtYmVyKGFhKSYmQy5NYXRoLmlzVmFsaWROdW1iZXIoTyk/Qy5NYXRoLmJvdW5kc0ludGVyc2VjdHMoVCxYLGFhLE8sSCxLKTohMX07cmV0dXJuIE59KGguWFlQbG90KTtCLl9CQVJfVEhJQ0tORVNTX1JBVElPPS45NTtCLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTz0uNDtCLl9CQVJfQVJFQV9DTEFTUz0iYmFyLWFyZWEiO0IuX0JBUl9FTkRfS0VZPSJiYXJFbmQiO0IuX0JBUl9USElDS05FU1NfS0VZPSJ3aWR0aCI7Qi5fTEFCRUxfQVJFQV9DTEFTUz0iYmFyLWxhYmVsLXRleHQtYXJlYSI7Qi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI9MTA7Zi5CYXI9Qn0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih4LEEpe2Z1bmN0aW9uIHkoKXt0aGlzLmNvbnN0cnVjdG9yPXh9Zm9yKHZhciB3IGluIEEpQS5oYXNPd25Qcm9wZXJ0eSh3KSYmKHhbd109QVt3XSk7eC5wcm90b3R5cGU9Cm51bGw9PT1BP09iamVjdC5jcmVhdGUoQSk6KHkucHJvdG90eXBlPUEucHJvdG90eXBlLG5ldyB5KX0sdD1oKDEpLGw9aCg1KSxwPWgoOCksbT1oKDMpLG49aCgwKTtkPWgoMTApO3ZhciBxPWgoMjIpO2YuVGltZUludGVydmFsPWQubWFrZUVudW0oInNlY29uZCBtaW51dGUgaG91ciBkYXkgd2VlayBtb250aCB5ZWFyIi5zcGxpdCgiICIpKTtmLlRpbWVBeGlzT3JpZW50YXRpb249ZC5tYWtlRW51bShbInRvcCIsImJvdHRvbSJdKTtmLlRpZXJMYWJlbFBvc2l0aW9uPWQubWFrZUVudW0oWyJiZXR3ZWVuIiwiY2VudGVyIl0pO2g9ZnVuY3Rpb24oeCl7ZnVuY3Rpb24gQSh5LHcpe3k9eC5jYWxsKHRoaXMseSx3KXx8dGhpczt5Ll9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb249bnVsbDt5Ll90aWVyTGFiZWxQb3NpdGlvbnM9W107eS5hZGRDbGFzcygidGltZS1heGlzIik7eS50aWNrTGFiZWxQYWRkaW5nKDUpO3kuYXhpc0NvbmZpZ3VyYXRpb25zKEEuX0RFRkFVTFRfVElNRV9BWElTX0NPTkZJR1VSQVRJT05TKTsKeS5hbm5vdGF0aW9uRm9ybWF0dGVyKHAudGltZSgiJWEgJWIgJWQsICVZIikpO3JldHVybiB5fWsoQSx4KTtBLnByb3RvdHlwZS50aWVyTGFiZWxQb3NpdGlvbnM9ZnVuY3Rpb24oeSl7aWYobnVsbD09eSlyZXR1cm4gdGhpcy5fdGllckxhYmVsUG9zaXRpb25zO2lmKCF5LmV2ZXJ5KGZ1bmN0aW9uKHcpe3JldHVybiJiZXR3ZWVuIj09PXcudG9Mb3dlckNhc2UoKXx8ImNlbnRlciI9PT13LnRvTG93ZXJDYXNlKCl9KSl0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgcG9zaXRpb24gZm9yIHRpZXIgbGFiZWxzIik7dGhpcy5fdGllckxhYmVsUG9zaXRpb25zPXk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307QS5wcm90b3R5cGUubWF4VGltZUludGVydmFsUHJlY2lzaW9uPWZ1bmN0aW9uKHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbjt0aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb249eTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtBLnByb3RvdHlwZS5jdXJyZW50QXhpc0NvbmZpZ3VyYXRpb249CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XX07QS5wcm90b3R5cGUuYXhpc0NvbmZpZ3VyYXRpb25zPWZ1bmN0aW9uKHkpe2lmKG51bGwhPXkpe3RoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucz15O3RoaXMuX251bVRpZXJzPW4uTWF0aC5tYXgodGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLm1hcChmdW5jdGlvbihGKXtyZXR1cm4gRi5sZW5ndGh9KSwwKTt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl9zZXR1cERvbUVsZW1lbnRzKCk7eT10aGlzLnRpZXJMYWJlbFBvc2l0aW9ucygpO2Zvcih2YXIgdz1bXSxDPTA7Qzx0aGlzLl9udW1UaWVycztDKyspdy5wdXNoKHlbQ118fCJiZXR3ZWVuIik7dGhpcy50aWVyTGFiZWxQb3NpdGlvbnModyk7dGhpcy5yZWRyYXcoKX19O0EucHJvdG90eXBlLl9nZXRNb3N0UHJlY2lzZUNvbmZpZ3VyYXRpb25JbmRleD0KZnVuY3Rpb24oKXt2YXIgeT10aGlzLHc9dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmxlbmd0aDt0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihDLEYpe0Y8dyYmQy5ldmVyeShmdW5jdGlvbihEKXtyZXR1cm4geS5fY2hlY2tUaW1lQXhpc1RpZXJDb25maWd1cmF0aW9uKEQpfSkmJih3PUYpfSk7dz09PXRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5sZW5ndGgmJihuLldpbmRvdy53YXJuKCJ6b29tZWQgb3V0IHRvbyBmYXI6IGNvdWxkIG5vdCBmaW5kIHN1aXRhYmxlIGludGVydmFsIHRvIGRpc3BsYXkgbGFiZWxzIiksLS13KTtyZXR1cm4gd307QS5wcm90b3R5cGUub3JpZW50YXRpb249ZnVuY3Rpb24oeSl7aWYoeSYmKCJyaWdodCI9PT15LnRvTG93ZXJDYXNlKCl8fCJsZWZ0Ij09PXkudG9Mb3dlckNhc2UoKSkpdGhyb3cgRXJyb3IoeSsiIGlzIG5vdCBhIHN1cHBvcnRlZCBvcmllbnRhdGlvbiBmb3IgVGltZUF4aXMgLSBvbmx5IGhvcml6b250YWwgb3JpZW50YXRpb25zIGFyZSBzdXBwb3J0ZWQiKTsKcmV0dXJuIHgucHJvdG90eXBlLm9yaWVudGF0aW9uLmNhbGwodGhpcyx5KX07QS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgeT10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0O3RoaXMuX3RpZXJIZWlnaHRzPVtdO2Zvcih2YXIgdz0wO3c8dGhpcy5fbnVtVGllcnM7dysrKXRoaXMuX3RpZXJIZWlnaHRzLnB1c2goeSt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSsoImJldHdlZW4iPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3ddPzA6dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkpKTtyZXR1cm4gdC5zdW0odGhpcy5fdGllckhlaWdodHMpfTtBLnByb3RvdHlwZS5fZ2V0SW50ZXJ2YWxMZW5ndGg9ZnVuY3Rpb24oeSl7dmFyIHc9dGhpcy5fc2NhbGUuZG9tYWluKClbMF07eT1tLlRpbWUudGltZUludGVydmFsVG9EM1RpbWUoeS5pbnRlcnZhbCkub2Zmc2V0KHcseS5zdGVwKTtyZXR1cm4geT50aGlzLl9zY2FsZS5kb21haW4oKVsxXT90aGlzLndpZHRoKCk6Ck1hdGguYWJzKHRoaXMuX3NjYWxlLnNjYWxlKHkpLXRoaXMuX3NjYWxlLnNjYWxlKHcpKX07QS5wcm90b3R5cGUuX21heFdpZHRoRm9ySW50ZXJ2YWw9ZnVuY3Rpb24oeSl7cmV0dXJuIHRoaXMuX21lYXN1cmVyLm1lYXN1cmUoeS5mb3JtYXR0ZXIoQS5fTE9OR19EQVRFKSkud2lkdGh9O0EucHJvdG90eXBlLl9jaGVja1RpbWVBeGlzVGllckNvbmZpZ3VyYXRpb249ZnVuY3Rpb24oeSl7aWYobnVsbCE9dGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uKXt2YXIgdz1BLl9TT1JURURfVElNRV9JTlRFUlZBTF9JTkRFWFt0aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb25dLEM9QS5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVhbeS5pbnRlcnZhbF07aWYobnVsbCE9dyYmbnVsbCE9QyYmQzx3KXJldHVybiExfXc9dGhpcy5fbWF4V2lkdGhGb3JJbnRlcnZhbCh5KSsyKnRoaXMudGlja0xhYmVsUGFkZGluZygpO3JldHVybiBNYXRoLm1pbih0aGlzLl9nZXRJbnRlcnZhbExlbmd0aCh5KSwKdGhpcy53aWR0aCgpKT49d307QS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24oeSx3KXt2YXIgQz14LnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlci5jYWxsKHRoaXMseSx3KTt5PXRoaXMuX3RpZXJIZWlnaHRzLnJlZHVjZShmdW5jdGlvbihGLEQpe3JldHVybiBGK0Q+Qy5oZWlnaHQ/RjpGK0R9KTt3PXRoaXMubWFyZ2luKCkrKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCkqdGhpcy5fYW5ub3RhdGlvblRpZXJIZWlnaHQoKTowKTtDLmhlaWdodD1NYXRoLm1pbihDLmhlaWdodCx5K3cpO3JldHVybiBDfTtBLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt4LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9zZXR1cERvbUVsZW1lbnRzKCl9O0EucHJvdG90eXBlLl9zZXR1cERvbUVsZW1lbnRzPWZ1bmN0aW9uKCl7dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIitBLlRJTUVfQVhJU19USUVSX0NMQVNTKS5yZW1vdmUoKTsKdGhpcy5fdGllckxhYmVsQ29udGFpbmVycz1bXTt0aGlzLl90aWVyTWFya0NvbnRhaW5lcnM9W107dGhpcy5fdGllckJhc2VsaW5lcz1bXTt0aGlzLl90aWNrTGFiZWxDb250YWluZXIucmVtb3ZlKCk7dGhpcy5fYmFzZWxpbmUucmVtb3ZlKCk7Zm9yKHZhciB5PTA7eTx0aGlzLl9udW1UaWVyczsrK3kpe3ZhciB3PXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoQS5USU1FX0FYSVNfVElFUl9DTEFTUywhMCk7dGhpcy5fdGllckxhYmVsQ29udGFpbmVycy5wdXNoKHcuYXBwZW5kKCJnIikuY2xhc3NlZChxLkF4aXMuVElDS19MQUJFTF9DTEFTUysiLWNvbnRhaW5lciIsITApKTt0aGlzLl90aWVyTWFya0NvbnRhaW5lcnMucHVzaCh3LmFwcGVuZCgiZyIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTUFSS19DTEFTUysiLWNvbnRhaW5lciIsITApKTt0aGlzLl90aWVyQmFzZWxpbmVzLnB1c2gody5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApKX15PW5ldyBsLlN2Z0NvbnRleHQodGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1swXS5ub2RlKCkpOwp0aGlzLl9tZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHkpfTtBLnByb3RvdHlwZS5fZ2V0VGlja0ludGVydmFsVmFsdWVzPWZ1bmN0aW9uKHkpe3JldHVybiB0aGlzLl9zY2FsZS50aWNrSW50ZXJ2YWwoeS5pbnRlcnZhbCx5LnN0ZXApfTtBLnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlcz1mdW5jdGlvbigpe3ZhciB5PXRoaXM7cmV0dXJuIHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XS5yZWR1Y2UoZnVuY3Rpb24odyxDKXtyZXR1cm4gdy5jb25jYXQoeS5fZ2V0VGlja0ludGVydmFsVmFsdWVzKEMpKX0sW10pfTtBLnByb3RvdHlwZS5fY2xlYW5UaWVycz1mdW5jdGlvbigpe2Zvcih2YXIgeT0wO3k8dGhpcy5fdGllckxhYmVsQ29udGFpbmVycy5sZW5ndGg7eSsrKXRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbeV0uc2VsZWN0QWxsKCIuIitxLkF4aXMuVElDS19MQUJFTF9DTEFTUykucmVtb3ZlKCksdGhpcy5fdGllck1hcmtDb250YWluZXJzW3ldLnNlbGVjdEFsbCgiLiIrCnEuQXhpcy5USUNLX01BUktfQ0xBU1MpLnJlbW92ZSgpLHRoaXMuX3RpZXJCYXNlbGluZXNbeV0uc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX07QS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uPWZ1bmN0aW9uKHkpe3k9dGhpcy5fc2NhbGUudGlja0ludGVydmFsKHkuaW50ZXJ2YWwseS5zdGVwKTt2YXIgdz10aGlzLl9zY2FsZS5kb21haW4oKSxDPXkubWFwKGZ1bmN0aW9uKEYpe3JldHVybiBGLnZhbHVlT2YoKX0pOy0xPT09Qy5pbmRleE9mKHdbMF0udmFsdWVPZigpKSYmeS51bnNoaWZ0KHdbMF0pOy0xPT09Qy5pbmRleE9mKHdbMV0udmFsdWVPZigpKSYmeS5wdXNoKHdbMV0pO3JldHVybiB5fTtBLnByb3RvdHlwZS5fcmVuZGVyVGllckxhYmVscz1mdW5jdGlvbih5LHcsQyl7dmFyIEY9dGhpcyxEPXRoaXMuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uKHcpLEI9W107ImJldHdlZW4iPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdJiYKMT09PXcuc3RlcD9ELm1hcChmdW5jdGlvbihLLE0pe00rMT49RC5sZW5ndGh8fEIucHVzaChuZXcgRGF0ZSgoRFtNKzFdLnZhbHVlT2YoKS1EW01dLnZhbHVlT2YoKSkvMitEW01dLnZhbHVlT2YoKSkpfSk6Qj1EO3k9eS5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5kYXRhKEIsZnVuY3Rpb24oSyl7cmV0dXJuIFN0cmluZyhLLnZhbHVlT2YoKSl9KTt2YXIgST15LmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLkF4aXMuVElDS19MQUJFTF9DTEFTUywhMCk7SS5hcHBlbmQoInRleHQiKTt2YXIgTj0iY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXXx8MT09PXcuc3RlcD8wOnRoaXMudGlja0xhYmVsUGFkZGluZygpO3ZhciBPPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3Quc3VtKHRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsQysxKSktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk6ImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ10/CnRoaXMuaGVpZ2h0KCktdC5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxDKSktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCktdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCk6dGhpcy5oZWlnaHQoKS10LnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLEMpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTtJPXkubWVyZ2UoSSk7dmFyIEg9SS5zZWxlY3RBbGwoInRleHQiKTswPEguc2l6ZSgpJiZILmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK04rIiwiK08rIikiKTt5LmV4aXQoKS5yZW1vdmUoKTtJLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oSyl7cmV0dXJuInRyYW5zbGF0ZSgiK0YuX3NjYWxlLnNjYWxlKEspKyIsMCkifSk7Qz0iY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXXx8MT09PXcuc3RlcD8ibWlkZGxlIjoic3RhcnQiO0kuc2VsZWN0QWxsKCJ0ZXh0IikudGV4dCh3LmZvcm1hdHRlcikuc3R5bGUoInRleHQtYW5jaG9yIixDKX07QS5wcm90b3R5cGUuX3JlbmRlclRpY2tNYXJrcz0KZnVuY3Rpb24oeSx3KXt5PXRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1t3XS5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX01BUktfQ0xBU1MpLmRhdGEoeSk7dmFyIEM9eS5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTUFSS19DTEFTUywhMCkubWVyZ2UoeSksRj10aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKSxEPXRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsdykucmVkdWNlKGZ1bmN0aW9uKEIsSSl7cmV0dXJuIEIrSX0sMCk7ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/KEYueTE9RCxGLnkyPUQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3ddP3RoaXMuaW5uZXJUaWNrTGVuZ3RoKCk6dGhpcy5fdGllckhlaWdodHNbd10pKTooRi55MT10aGlzLmhlaWdodCgpLUQsRi55Mj10aGlzLmhlaWdodCgpLShEKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t3XT90aGlzLmlubmVyVGlja0xlbmd0aCgpOgp0aGlzLl90aWVySGVpZ2h0c1t3XSkpKTtDLmF0dHJzKEYpOyJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpPyhGLnkxPUQsRi55Mj1EKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t3XT90aGlzLmVuZFRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1t3XSkpOihGLnkxPXRoaXMuaGVpZ2h0KCktRCxGLnkyPXRoaXMuaGVpZ2h0KCktKEQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3ddP3RoaXMuZW5kVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW3ddKSkpO3Quc2VsZWN0KEMubm9kZXMoKVswXSkuYXR0cnMoRik7dC5zZWxlY3QoQy5ub2RlcygpW0Muc2l6ZSgpLTFdKS5hdHRycyhGKTt0LnNlbGVjdChDLm5vZGVzKClbMF0pLmNsYXNzZWQocS5BeGlzLkVORF9USUNLX01BUktfQ0xBU1MsITApO3Quc2VsZWN0KEMubm9kZXMoKVtDLnNpemUoKS0xXSkuY2xhc3NlZChxLkF4aXMuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCk7eS5leGl0KCkucmVtb3ZlKCl9OwpBLnByb3RvdHlwZS5fcmVuZGVyTGFiZWxsZXNzVGlja01hcmtzPWZ1bmN0aW9uKHkpe3k9dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIitxLkF4aXMuVElDS19NQVJLX0NMQVNTKS5kYXRhKHkpO3ZhciB3PXkuZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKHEuQXhpcy5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKHkpLEM9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCk7Qy55Mj0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTp0aGlzLmhlaWdodCgpLXRoaXMudGlja0xhYmVsUGFkZGluZygpO3cuYXR0cnMoQyk7eS5leGl0KCkucmVtb3ZlKCl9O0EucHJvdG90eXBlLl9nZW5lcmF0ZUxhYmVsbGVzc1RpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIDE+dGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleD9bXTp0aGlzLl9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXModGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXgtCjFdWzBdKX07QS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgeT10aGlzO3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXg9dGhpcy5fZ2V0TW9zdFByZWNpc2VDb25maWd1cmF0aW9uSW5kZXgoKTt2YXIgdz10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleF07dGhpcy5fY2xlYW5UaWVycygpO3cuZm9yRWFjaChmdW5jdGlvbihJLE4pe3JldHVybiB5Ll9yZW5kZXJUaWVyTGFiZWxzKHkuX3RpZXJMYWJlbENvbnRhaW5lcnNbTl0sSSxOKX0pO2Zvcih2YXIgQz13Lm1hcChmdW5jdGlvbihJKXtyZXR1cm4geS5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb24oSSl9KSxGPTAsRD0wO0Q8TWF0aC5tYXgody5sZW5ndGgsMSk7KytEKXt2YXIgQj10aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKTtCLnkxKz0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT9GOi1GO0IueTI9Qi55MTsKdGhpcy5fdGllckJhc2VsaW5lc1tEXS5hdHRycyhCKS5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKTtGKz10aGlzLl90aWVySGVpZ2h0c1tEXX1GPVtdO0Q9dGhpcy5fc2NhbGUuZG9tYWluKCk7RD10aGlzLl9zY2FsZS5zY2FsZShEWzFdKS10aGlzLl9zY2FsZS5zY2FsZShEWzBdKTsxLjUqdGhpcy5fZ2V0SW50ZXJ2YWxMZW5ndGgod1swXSk+PUQmJihGPXRoaXMuX2dlbmVyYXRlTGFiZWxsZXNzVGlja3MoKSk7dGhpcy5fcmVuZGVyTGFiZWxsZXNzVGlja01hcmtzKEYpO3RoaXMuX2hpZGVPdmVyZmxvd2luZ1RpZXJzKCk7Zm9yKEQ9MDtEPHcubGVuZ3RoOysrRCl0aGlzLl9yZW5kZXJUaWNrTWFya3MoQ1tEXSxEKSx0aGlzLl9oaWRlT3ZlcmxhcHBpbmdBbmRDdXRPZmZMYWJlbHMoRCk7dGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTp0aGlzLl9yZW1vdmVBbm5vdGF0aW9ucygpO3JldHVybiB0aGlzfTtBLnByb3RvdHlwZS5faGlkZU92ZXJmbG93aW5nVGllcnM9CmZ1bmN0aW9uKCl7dmFyIHk9dGhpcyx3PXRoaXMuaGVpZ2h0KCksQz0wO3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiLiIrQS5USU1FX0FYSVNfVElFUl9DTEFTUykuYXR0cigidmlzaWJpbGl0eSIsZnVuY3Rpb24oRixEKXtDKz15Ll90aWVySGVpZ2h0c1tEXTtyZXR1cm4gQzw9dz8iaW5oZXJpdCI6ImhpZGRlbiJ9KX07QS5wcm90b3R5cGUuX2hpZGVPdmVybGFwcGluZ0FuZEN1dE9mZkxhYmVscz1mdW5jdGlvbih5KXtmdW5jdGlvbiB3KEkpe3JldHVybiBNYXRoLmZsb29yKEYubGVmdCk8PU1hdGguY2VpbChJLmxlZnQpJiZNYXRoLmZsb29yKEYudG9wKTw9TWF0aC5jZWlsKEkudG9wKSYmTWF0aC5mbG9vcihJLnJpZ2h0KTw9TWF0aC5jZWlsKEYubGVmdCtDLndpZHRoKCkpJiZNYXRoLmZsb29yKEkuYm90dG9tKTw9TWF0aC5jZWlsKEYudG9wK0MuaGVpZ2h0KCkpfXZhciBDPXRoaXMsRj10aGlzLmVsZW1lbnQoKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksRD10aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbeV0uc2VsZWN0QWxsKCIuIisKcS5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIEk9dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4idmlzaWJsZSI9PT1JfHwiaW5oZXJpdCI9PT1JfSkubm9kZXMoKS5tYXAoZnVuY3Rpb24oSSl7cmV0dXJuIEkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9KSxCO3RoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbeV0uc2VsZWN0QWxsKCIuIitxLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIEk9dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4idmlzaWJsZSI9PT1JfHwiaW5oZXJpdCI9PT1JfSkuZWFjaChmdW5jdGlvbihJLE4pe0k9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgTz10LnNlbGVjdCh0aGlzKSxIPURbTl0sSz1EW04rMV07Tj1udWxsIT1CJiZuLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoSSxCKTtIPW51bGwhPUgmJm4uRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChJLApIKTtLPW51bGwhPUsmJm4uRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChJLEspOyF3KEkpfHxOfHxIfHxLP08uc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTooQj1JLE8uc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0IikpfSl9O0EucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3gucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiBBfShxLkF4aXMpO2guVElNRV9BWElTX1RJRVJfQ0xBU1M9InRpbWUtYXhpcy10aWVyIjtoLl9TT1JURURfVElNRV9JTlRFUlZBTF9JTkRFWD0odT17fSx1W2YuVGltZUludGVydmFsLnNlY29uZF09MCx1W2YuVGltZUludGVydmFsLm1pbnV0ZV09MSx1W2YuVGltZUludGVydmFsLmhvdXJdPTIsdVtmLlRpbWVJbnRlcnZhbC5kYXldPTMsdVtmLlRpbWVJbnRlcnZhbC53ZWVrXT00LHVbZi5UaW1lSW50ZXJ2YWwubW9udGhdPTUsdVtmLlRpbWVJbnRlcnZhbC55ZWFyXT0KNix1KTtoLl9ERUZBVUxUX1RJTUVfQVhJU19DT05GSUdVUkFUSU9OUz1bW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDo1LGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxMCxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MTUsCmZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDozMCxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6NSxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLApbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjEwLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDoxNSxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MzAsZm9ybWF0dGVyOnAudGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLmhvdXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVJICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksCnN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjMsZm9ybWF0dGVyOnAudGltZSgiJUkgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLmhvdXIsc3RlcDo2LGZvcm1hdHRlcjpwLnRpbWUoIiVJICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6MTIsZm9ybWF0dGVyOnAudGltZSgiJUkgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJWEgJWUiKX0sCntpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlZSIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiViIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjMsZm9ybWF0dGVyOnAudGltZSgiJWIiKX0sCntpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjYsZm9ybWF0dGVyOnAudGltZSgiJWIiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiV5Iil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDo1LGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoyNSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6NTAsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLApbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxMDAsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjIwMCxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6NTAwLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxRTMsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dXTtoLl9MT05HX0RBVEU9bmV3IERhdGUoOTk5OSw4LDI5LDEyLDU5LDk5OTkpO2YuVGltZT1oO3ZhciB1fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT0KcC5wcm90b3R5cGUsbmV3IG0pfSx0PWgoMTIpO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcCgpe3ZhciBtPWwuY2FsbCh0aGlzKXx8dGhpczttLl9kZXRhY2hDYWxsYmFjaz1mdW5jdGlvbihuKXtyZXR1cm4gbS5yZW1vdmUobil9O3JldHVybiBtfWsocCxsKTtwLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24obSl7dmFyIG49dGhpczttPXQuY29lcmNlRXh0ZXJuYWxEMyhtKTtsLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLG0pO3RoaXMuX2ZvckVhY2goZnVuY3Rpb24ocSl7cmV0dXJuIHEuYW5jaG9yKG4uZWxlbWVudCgpKX0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKG0pe3JldHVybiBtLnJlbmRlcigpfSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLmhhcz1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJoYXMoKSBpcyBub3QgaW1wbGVtZW50ZWQgb24gQ29tcG9uZW50Q29udGFpbmVyIik7fTtwLnByb3RvdHlwZS5fYWRvcHRBbmRBbmNob3I9CmZ1bmN0aW9uKG0pe20ucGFyZW50KHRoaXMpO20ub25EZXRhY2godGhpcy5fZGV0YWNoQ2FsbGJhY2spO3RoaXMuX2lzQW5jaG9yZWQmJm0uYW5jaG9yKHRoaXMuZWxlbWVudCgpKX07cC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKG0pe3RoaXMuaGFzKG0pJiYobS5vZmZEZXRhY2godGhpcy5fZGV0YWNoQ2FsbGJhY2spLHRoaXMuX3JlbW92ZShtKSxtLmRldGFjaCgpLHRoaXMucmVkcmF3KCkpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fcmVtb3ZlPWZ1bmN0aW9uKCl7fTtwLnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJfZm9yRWFjaCgpIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBDb21wb25lbnRDb250YWluZXIiKTt9O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihtKXtyZXR1cm4gbS5kZXN0cm95KCl9KX07cC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPQpmdW5jdGlvbigpe3RoaXMuX2ZvckVhY2goZnVuY3Rpb24obSl7cmV0dXJuIG0uaW52YWxpZGF0ZUNhY2hlKCl9KX07cmV0dXJuIHB9KGgoNCkuQ29tcG9uZW50KTtmLkNvbXBvbmVudENvbnRhaW5lcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhBKXtuLmFkZChBKTttLmFkZChBKTt0KCl9ZnVuY3Rpb24gdCgpe3F8fChxPSEwLHgucmVuZGVyKCkpfXZhciBsPWgoMCk7ZD1oKDEwKTt2YXIgcD1oKDM5KSxtPW5ldyBsLlNldCxuPW5ldyBsLlNldCxxPSExLHU9ITE7Zi5Qb2xpY3k9ZC5tYWtlRW51bShbImltbWVkaWF0ZSIsImFuaW1hdGlvbkZyYW1lIiwidGltZW91dCJdKTt2YXIgeD1uZXcgcC5BbmltYXRpb25GcmFtZTtmLnJlbmRlclBvbGljeT1mdW5jdGlvbihBKXtpZihudWxsPT1BKXJldHVybiB4O3N3aXRjaChBKXtjYXNlIGYuUG9saWN5LmltbWVkaWF0ZTp4PW5ldyBwLkltbWVkaWF0ZTticmVhaztjYXNlIGYuUG9saWN5LmFuaW1hdGlvbkZyYW1lOng9bmV3IHAuQW5pbWF0aW9uRnJhbWU7CmJyZWFrO2Nhc2UgZi5Qb2xpY3kudGltZW91dDp4PW5ldyBwLlRpbWVvdXQ7YnJlYWs7ZGVmYXVsdDpsLldpbmRvdy53YXJuKCJVbnJlY29nbml6ZWQgcmVuZGVyUG9saWN5OiAiK0EpfX07Zi5yZWdpc3RlclRvUmVuZGVyPWZ1bmN0aW9uKEEpe3UmJmwuV2luZG93Lndhcm4oIlJlZ2lzdGVyZWQgdG8gcmVuZGVyIHdoaWxlIG90aGVyIGNvbXBvbmVudHMgYXJlIGZsdXNoaW5nOiByZXF1ZXN0IG1heSBiZSBpZ25vcmVkIik7bS5hZGQoQSk7dCgpfTtmLnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0QW5kUmVuZGVyPWs7Zi5yZWdpc3RlclRvQ29tcHV0ZUxheW91dD1mdW5jdGlvbihBKXtrKEEpfTtmLmZsdXNoPWZ1bmN0aW9uKCl7aWYocSl7bi5mb3JFYWNoKGZ1bmN0aW9uKHkpe3JldHVybiB5LmNvbXB1dGVMYXlvdXQoKX0pO20uZm9yRWFjaChmdW5jdGlvbih5KXtyZXR1cm4geS5yZW5kZXIoKX0pO3U9ITA7dmFyIEE9bmV3IGwuU2V0O20uZm9yRWFjaChmdW5jdGlvbih5KXt0cnl7eS5yZW5kZXJJbW1lZGlhdGVseSgpfWNhdGNoKHcpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgdzsKfSwwKSxBLmFkZCh5KX19KTtuPW5ldyBsLlNldDttPUE7dT1xPSExfX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpO2YuY2lyY2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xDaXJjbGUpLnNpemUoTWF0aC5QSSpNYXRoLnBvdyhsLzIsMikpfX07Zi5zcXVhcmU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbFNxdWFyZSkuc2l6ZShNYXRoLnBvdyhsLDIpKX19O2YuY3Jvc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbENyb3NzKS5zaXplKDUvOSpNYXRoLnBvdyhsLDIpKX19O2YuZGlhbW9uZD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sRGlhbW9uZCkuc2l6ZShNYXRoLnRhbihNYXRoLlBJLzYpKk1hdGgucG93KGwsMikvCjIpfX07Zi50cmlhbmdsZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sVHJpYW5nbGUpLnNpemUoTWF0aC5zcXJ0KDMpKk1hdGgucG93KGwvMiwyKSl9fTtmLnN0YXI9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbFN0YXIpLnNpemUoLjg5MDgxMzA5MTUyOTI4NTIqTWF0aC5wb3cobC8yLDIpKX19O3ZhciB0PTMqKDEvTWF0aC5zcXJ0KDEyKS8yKzEpO2Yud3llPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xXeWUpLnNpemUodCpNYXRoLnBvdyhsLzIuNCwyKSl9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09CnFbeF0pO24ucHJvdG90eXBlPW51bGw9PT1xP09iamVjdC5jcmVhdGUocSk6KHUucHJvdG90eXBlPXEucHJvdG90eXBlLG5ldyB1KX0sdD1oKDI1KSxsPWgoMCkscD1oKDEyKSxtPWgoMzcpO2Q9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSgpe3ZhciB1PW4uY2FsbCh0aGlzKXx8dGhpczt1Ll9kZXRlY3Rpb25SYWRpdXM9Mzt1Ll9yZXNpemFibGU9ITE7dS5fbW92YWJsZT0hMTt1Ll9oYXNDb3JuZXJzPSEwO3UuYWRkQ2xhc3MoImRyYWctYm94LWxheWVyIik7dS5fZHJhZ0ludGVyYWN0aW9uPW5ldyB0LkRyYWc7dS5fc2V0VXBDYWxsYmFja3MoKTt1Ll9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8odSk7dS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3UuX2RyYWdDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dS5fZHJhZ0VuZENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtyZXR1cm4gdX1rKHEsbik7cS5wcm90b3R5cGUuX3NldFVwQ2FsbGJhY2tzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdShJLApOKXswPT09QiYmSS54PT09Ti54JiZJLnk9PT1OLnkmJnkuYm94VmlzaWJsZSghMSk7eS5fZHJhZ0VuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHkuYm91bmRzKCkpfWZ1bmN0aW9uIHgoSSxOKXtzd2l0Y2goQil7Y2FzZSAwOkYueD1OLng7Ri55PU4ueTticmVhaztjYXNlIDE6dy5ib3R0b20/Ri55PU4ueTp3LnRvcCYmKEMueT1OLnkpO3cucmlnaHQ/Ri54PU4ueDp3LmxlZnQmJihDLng9Ti54KTticmVhaztjYXNlIDI6ST1OLngtRC54O3ZhciBPPU4ueS1ELnk7Qy54Kz1JO0MueSs9TztGLngrPUk7Ri55Kz1PO0Q9Tn15Ll9zZXRCb3VuZHMoe3RvcExlZnQ6Qyxib3R0b21SaWdodDpGfSk7eS5feEJvdW5kc01vZGU9PT1tLlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9eS54U2NhbGUoKSYmeS5fc2V0WEV4dGVudChbeS54U2NhbGUoKS5pbnZlcnQoQy54KSx5LnhTY2FsZSgpLmludmVydChGLngpXSk7eS5feUJvdW5kc01vZGU9PT1tLlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9eS55U2NhbGUoKSYmCnkuX3NldFlFeHRlbnQoW3kueVNjYWxlKCkuaW52ZXJ0KEMueSkseS55U2NhbGUoKS5pbnZlcnQoRi55KV0pO3kucmVuZGVyKCk7eS5fZHJhZ0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHkuYm91bmRzKCkpfWZ1bmN0aW9uIEEoSSl7dz15Ll9nZXRSZXNpemluZ0VkZ2VzKEkpO3ZhciBOPXkuYm91bmRzKCk7Tj1OLnRvcExlZnQueDw9SS54JiZJLng8PU4uYm90dG9tUmlnaHQueCYmTi50b3BMZWZ0Lnk8PUkueSYmSS55PD1OLmJvdHRvbVJpZ2h0Lnk7eS5ib3hWaXNpYmxlKCkmJih3LnRvcHx8dy5ib3R0b218fHcubGVmdHx8dy5yaWdodCk/Qj0xOnkuYm94VmlzaWJsZSgpJiZ5Lm1vdmFibGUoKSYmTj9CPTI6KEI9MCx5Ll9zZXRCb3VuZHMoe3RvcExlZnQ6SSxib3R0b21SaWdodDpJfSkseS5feEJvdW5kc01vZGU9PT1tLlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9eS54U2NhbGUoKSYmeS5fc2V0WEV4dGVudChbeS54U2NhbGUoKS5pbnZlcnQoSS54KSx5LnhTY2FsZSgpLmludmVydChJLngpXSksCnkuX3lCb3VuZHNNb2RlPT09bS5Qcm9wZXJ0eU1vZGUuVkFMVUUmJm51bGwhPXkueVNjYWxlKCkmJnkuX3NldFlFeHRlbnQoW3kueVNjYWxlKCkuaW52ZXJ0KEkueSkseS55U2NhbGUoKS5pbnZlcnQoSS55KV0pLHkucmVuZGVyKCkpO3kuYm94VmlzaWJsZSghMCk7Tj15LmJvdW5kcygpO0M9e3g6Ti50b3BMZWZ0LngseTpOLnRvcExlZnQueX07Rj17eDpOLmJvdHRvbVJpZ2h0LngseTpOLmJvdHRvbVJpZ2h0Lnl9O0Q9STt5Ll9kcmFnU3RhcnRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhOKX12YXIgeT10aGlzLHcsQyxGLEQsQj0wO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydChBKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKHgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdFbmQodSk7dGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uPWZ1bmN0aW9uKCl7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWdTdGFydChBKTt5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZyh4KTsKeS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWdFbmQodSk7eS5fZHJhZ0ludGVyYWN0aW9uLmRldGFjaCgpfX07cS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdSgpe3JldHVybiB4Ll9ib3guYXBwZW5kKCJsaW5lIikuc3R5bGVzKHtvcGFjaXR5OjAsc3Ryb2tlOiJwaW5rIiwicG9pbnRlci1ldmVudHMiOiJ2aXNpYmxlU3Ryb2tlIn0pfXZhciB4PXRoaXM7bi5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fZGV0ZWN0aW9uRWRnZVQ9dSgpLmNsYXNzZWQoImRyYWctZWRnZS10YiIsITApO3RoaXMuX2RldGVjdGlvbkVkZ2VCPXUoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtdGIiLCEwKTt0aGlzLl9kZXRlY3Rpb25FZGdlTD11KCkuY2xhc3NlZCgiZHJhZy1lZGdlLWxyIiwhMCk7dGhpcy5fZGV0ZWN0aW9uRWRnZVI9dSgpLmNsYXNzZWQoImRyYWctZWRnZS1sciIsITApO2lmKHRoaXMuX2hhc0Nvcm5lcnMpe3ZhciBBPWZ1bmN0aW9uKCl7cmV0dXJuIHguX2JveC5hcHBlbmQoImNpcmNsZSIpLnN0eWxlcyh7b3BhY2l0eTowLApmaWxsOiJwaW5rIiwicG9pbnRlci1ldmVudHMiOiJ2aXNpYmxlRmlsbCJ9KX07dGhpcy5fZGV0ZWN0aW9uQ29ybmVyVEw9QSgpLmNsYXNzZWQoImRyYWctY29ybmVyLXRsIiwhMCk7dGhpcy5fZGV0ZWN0aW9uQ29ybmVyVFI9QSgpLmNsYXNzZWQoImRyYWctY29ybmVyLXRyIiwhMCk7dGhpcy5fZGV0ZWN0aW9uQ29ybmVyQkw9QSgpLmNsYXNzZWQoImRyYWctY29ybmVyLWJsIiwhMCk7dGhpcy5fZGV0ZWN0aW9uQ29ybmVyQlI9QSgpLmNsYXNzZWQoImRyYWctY29ybmVyLWJyIiwhMCl9fTtxLnByb3RvdHlwZS5fZ2V0UmVzaXppbmdFZGdlcz1mdW5jdGlvbih1KXt2YXIgeD17dG9wOiExLGJvdHRvbTohMSxsZWZ0OiExLHJpZ2h0OiExfTtpZighdGhpcy5yZXNpemFibGUoKSlyZXR1cm4geDt2YXIgQT10aGlzLmJvdW5kcygpLHk9QS50b3BMZWZ0Lnksdz1BLmJvdHRvbVJpZ2h0LnksQz1BLnRvcExlZnQueDtBPUEuYm90dG9tUmlnaHQueDt2YXIgRj10aGlzLl9kZXRlY3Rpb25SYWRpdXM7CkMtRjw9dS54JiZ1Lng8PUErRiYmKHgudG9wPXktRjw9dS55JiZ1Lnk8PXkrRix4LmJvdHRvbT13LUY8PXUueSYmdS55PD13K0YpO3ktRjw9dS55JiZ1Lnk8PXcrRiYmKHgubGVmdD1DLUY8PXUueCYmdS54PD1DK0YseC5yaWdodD1BLUY8PXUueCYmdS54PD1BK0YpO3JldHVybiB4fTtxLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe24ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7aWYodGhpcy5ib3hWaXNpYmxlKCkpe3ZhciB1PXRoaXMuYm91bmRzKCkseD11LnRvcExlZnQueSxBPXUuYm90dG9tUmlnaHQueSx5PXUudG9wTGVmdC54O3U9dS5ib3R0b21SaWdodC54O3RoaXMuX2RldGVjdGlvbkVkZ2VULmF0dHJzKHt4MTp5LHkxOngseDI6dSx5Mjp4LCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7dGhpcy5fZGV0ZWN0aW9uRWRnZUIuYXR0cnMoe3gxOnkseTE6QSx4Mjp1LHkyOkEsInN0cm9rZS13aWR0aCI6MioKdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7dGhpcy5fZGV0ZWN0aW9uRWRnZUwuYXR0cnMoe3gxOnkseTE6eCx4Mjp5LHkyOkEsInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9kZXRlY3Rpb25FZGdlUi5hdHRycyh7eDE6dSx5MTp4LHgyOnUseTI6QSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3RoaXMuX2hhc0Nvcm5lcnMmJih0aGlzLl9kZXRlY3Rpb25Db3JuZXJUTC5hdHRycyh7Y3g6eSxjeTp4LHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uQ29ybmVyVFIuYXR0cnMoe2N4OnUsY3k6eCxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lckJMLmF0dHJzKHtjeDp5LGN5OkEscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJCUi5hdHRycyh7Y3g6dSxjeTpBLHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSkpfXJldHVybiB0aGlzfTsKcS5wcm90b3R5cGUuZGV0ZWN0aW9uUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RldGVjdGlvblJhZGl1c307cS5wcm90b3R5cGUucmVzaXphYmxlPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX3Jlc2l6YWJsZTt0aGlzLl9yZXNpemFibGU9dTt0aGlzLl9zZXRSZXNpemFibGVDbGFzc2VzKHUpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fc2V0UmVzaXphYmxlQ2xhc3Nlcz1mdW5jdGlvbih1KXt1JiZ0aGlzLmVuYWJsZWQoKT8odGhpcy5hZGRDbGFzcygieC1yZXNpemFibGUiKSx0aGlzLmFkZENsYXNzKCJ5LXJlc2l6YWJsZSIpKToodGhpcy5yZW1vdmVDbGFzcygieC1yZXNpemFibGUiKSx0aGlzLnJlbW92ZUNsYXNzKCJ5LXJlc2l6YWJsZSIpKX07cS5wcm90b3R5cGUubW92YWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb3ZhYmxlfTtxLnByb3RvdHlwZS5fc2V0TW92YWJsZUNsYXNzPWZ1bmN0aW9uKCl7dGhpcy5tb3ZhYmxlKCkmJnRoaXMuZW5hYmxlZCgpPwp0aGlzLmFkZENsYXNzKCJtb3ZhYmxlIik6dGhpcy5yZW1vdmVDbGFzcygibW92YWJsZSIpfTtxLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuYWRkKHUpfTtxLnByb3RvdHlwZS5vZmZEcmFnU3RhcnQ9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmRlbGV0ZSh1KX07cS5wcm90b3R5cGUub25EcmFnPWZ1bmN0aW9uKHUpe3RoaXMuX2RyYWdDYWxsYmFja3MuYWRkKHUpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5vZmZEcmFnPWZ1bmN0aW9uKHUpe3RoaXMuX2RyYWdDYWxsYmFja3MuZGVsZXRlKHUpfTtxLnByb3RvdHlwZS5vbkRyYWdFbmQ9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5hZGQodSl9O3EucHJvdG90eXBlLm9mZkRyYWdFbmQ9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUodSl9O3EucHJvdG90eXBlLmRyYWdJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259OwpxLnByb3RvdHlwZS5lbmFibGVkPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKCk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQodSk7dGhpcy5fc2V0UmVzaXphYmxlQ2xhc3Nlcyh0aGlzLnJlc2l6YWJsZSgpKTt0aGlzLl9zZXRNb3ZhYmxlQ2xhc3MoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB1PXRoaXM7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHgpe3JldHVybiB1Ll9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh4KX0pO3RoaXMuX2RyYWdDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbih4KXtyZXR1cm4gdS5fZHJhZ0NhbGxiYWNrcy5kZWxldGUoeCl9KTt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24oeCl7cmV0dXJuIHUuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKHgpfSk7CnRoaXMuX2Rpc2Nvbm5lY3RJbnRlcmFjdGlvbigpfTtxLnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLl9yZXNldFN0YXRlKCk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmRldGFjaCgpO24ucHJvdG90eXBlLmRldGFjaC5jYWxsKHRoaXMpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24odSl7dT1wLmNvZXJjZUV4dGVybmFsRDModSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpO24ucHJvdG90eXBlLmFuY2hvci5jYWxsKHRoaXMsdSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLl9yZXNldFN0YXRlPWZ1bmN0aW9uKCl7dGhpcy5ib3VuZHMoe3RvcExlZnQ6e3g6MCx5OjB9LGJvdHRvbVJpZ2h0Ont4OjAseTowfX0pfTtyZXR1cm4gcX0oaCg0MykuU2VsZWN0aW9uQm94TGF5ZXIpO2YuRHJhZ0JveExheWVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxOCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7cmV0dXJuIHAuY2FsbCh0aGlzLCJwYXRoIiwibGluZSIpfHx0aGlzfWsobSxwKTttLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbihuKXtuLnN0eWxlKCJmaWxsIiwibm9uZSIpfTttLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHAucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXguY2FsbCh0aGlzLDApfTtyZXR1cm4gbX0oaCg5KS5TVkdEcmF3ZXIpO2YuTGluZVNWR0RyYXdlcj1kO3ZhciBsPVsib3BhY2l0eSIsInN0cm9rZS1vcGFjaXR5Iiwic3Ryb2tlLXdpZHRoIiwic3Ryb2tlIl07Zi5tYWtlTGluZUNhbnZhc0RyYXdTdGVwPQpmdW5jdGlvbihwKXtyZXR1cm4gZnVuY3Rpb24obSxuLHEpe3E9dC5yZXNvbHZlQXR0cmlidXRlcyhxLGwsblswXSwwKTt0LnJlbmRlckxpbmUobSxwKCksblswXSxxKX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxOCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZvaWQgMD09PW4mJihuPSIiKTt2YXIgcT1wLmNhbGwodGhpcywicmVjdCIsIiIpfHx0aGlzO3EuX3Jvb3RDbGFzc05hbWU9bjtxLl9yb290LmNsYXNzZWQocS5fcm9vdENsYXNzTmFtZSwhMCk7cmV0dXJuIHF9ayhtLHApO3JldHVybiBtfShoKDkpLlNWR0RyYXdlcik7Zi5SZWN0YW5nbGVTVkdEcmF3ZXI9CmQ7dmFyIGw9WyJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0Il07Zi5SZWN0YW5nbGVDYW52YXNEcmF3U3RlcD1mdW5jdGlvbihwLG0sbil7cC5zYXZlKCk7bS5mb3JFYWNoKGZ1bmN0aW9uKHEsdSl7bnVsbCE9cSYmKHE9dC5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXMobixsLHEsdSkscC5iZWdpblBhdGgoKSxwLnJlY3QocS54LHEueSxxLndpZHRoLHEuaGVpZ2h0KSx0LnJlbmRlclBhdGhXaXRoU3R5bGUocCxxKSl9KTtwLnJlc3RvcmUoKX07ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3JldHVybiBwLmNhbGwodGhpcyxuLGYuUmVjdGFuZ2xlQ2FudmFzRHJhd1N0ZXApfHx0aGlzfWsobSxwKTtyZXR1cm4gbX0odC5DYW52YXNEcmF3ZXIpO2YuUmVjdGFuZ2xlQ2FudmFzRHJhd2VyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHApe2wuU0hPV19XQVJOSU5HUyYmY29uc29sZS53YXJuKHApfWZ1bmN0aW9uIHQocCxtKXtmb3IodmFyIG49W10scT0yO3E8YXJndW1lbnRzLmxlbmd0aDtxKyspbltxLQoyXT1hcmd1bWVudHNbcV07cmV0dXJuIDA9PT1tPyhwKG4pLC0xKTp3aW5kb3cuc2V0VGltZW91dChwLG0sbil9dmFyIGw9aCgyMyk7Zi53YXJuPWs7Zi5zZXRUaW1lb3V0PXQ7Zi5kZWJvdW5jZT1mdW5jdGlvbihwLG0sbil7ZnVuY3Rpb24gcSgpe20uYXBwbHkobix4KX12YXIgdT1udWxsLHg9W107cmV0dXJuIGZ1bmN0aW9uKCl7eD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO2NsZWFyVGltZW91dCh1KTt1PXQocSxwKX19O2YuZGVwcmVjYXRlZD1mdW5jdGlvbihwLG0sbil7dm9pZCAwPT09biYmKG49IiIpO2soIk1ldGhvZCAiK3ArIiBoYXMgYmVlbiBkZXByZWNhdGVkIGluIHZlcnNpb24gIittKyIuIFBsZWFzZSByZWZlciB0byB0aGUgcmVsZWFzZSBub3Rlcy4gIituKX19LGZ1bmN0aW9uKGQsZil7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoayl7dGhpcy5ydWxlcj1udWxsIT1rLmNyZWF0ZVJ1bGVyP2suY3JlYXRlUnVsZXIoKTprfWgucHJvdG90eXBlLm1lYXN1cmU9CmZ1bmN0aW9uKGspe3ZvaWQgMD09PWsmJihrPWguSEVJR0hUX1RFWFQpO3JldHVybiB0aGlzLnJ1bGVyKGspfTtyZXR1cm4gaH0oKTtkLkhFSUdIVF9URVhUPSJiZHBxbCI7Zi5BYnN0cmFjdE1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgzMikpO2soaCg3NCkpO2soaCg3NSkpO2soaCg0MSkpO2soaCg0MikpO2soaCg3NikpO2soaCg3NykpO2soaCg3OCkpO2soaCg3OSkpO2soaCg0MykpO2soaCg4MCkpO2soaCg4MSkpO2soaCg4MikpfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgwKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChsLHApe3ZvaWQgMD09PWwmJihsPVtdKTt2b2lkIDA9PT1wJiYocD17fSk7dGhpcy5fdXBkYXRlSWQ9MDt0aGlzLl9kYXRhPWw7dGhpcy5fbWV0YWRhdGE9cDt0aGlzLl9jYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXR9dC5wcm90b3R5cGUub25VcGRhdGU9CmZ1bmN0aW9uKGwpe3RoaXMuX2NhbGxiYWNrcy5hZGQobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLm9mZlVwZGF0ZT1mdW5jdGlvbihsKXt0aGlzLl9jYWxsYmFja3MuZGVsZXRlKGwpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5kYXRhPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX2RhdGE7dGhpcy5fZGF0YT1sO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLm1ldGFkYXRhPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX21ldGFkYXRhO3RoaXMuX21ldGFkYXRhPWw7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUudXBkYXRlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlSWR9O3QucHJvdG90eXBlLl9kaXNwYXRjaFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUlkKys7dGhpcy5fY2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyl9O3JldHVybiB0fSgpOwpmLkRhdGFzZXQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCksdD1oKDMwKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe31sLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0LmZsdXNoKCl9O3JldHVybiBsfSgpO2YuSW1tZWRpYXRlPWQ7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwoKXt9bC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7ay5ET00ucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwodC5mbHVzaCl9O3JldHVybiBsfSgpO2YuQW5pbWF0aW9uRnJhbWU9ZDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe3RoaXMuX3RpbWVvdXRNc2VjPWsuRE9NLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTfWwucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3NldFRpbWVvdXQodC5mbHVzaCx0aGlzLl90aW1lb3V0TXNlYyl9O3JldHVybiBsfSgpO2YuVGltZW91dD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsCm0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMTMpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1udWxsIT09cCYmcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7bi5fa2V5UHJlc3NDYWxsYmFja3M9e307bi5fa2V5UmVsZWFzZUNhbGxiYWNrcz17fTtuLl9tb3VzZU1vdmVDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiExfTtuLl9kb3duZWRLZXlzPW5ldyBsLlNldDtuLl9rZXlEb3duQ2FsbGJhY2s9ZnVuY3Rpb24ocSx1KXtyZXR1cm4gbi5faGFuZGxlS2V5RG93bkV2ZW50KHEsdSl9O24uX2tleVVwQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2hhbmRsZUtleVVwRXZlbnQocSl9O3JldHVybiBufWsobSxwKTsKbS5wcm90b3R5cGUuX2FuY2hvcj1mdW5jdGlvbihuKXtwLnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcyxuKTt0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXI9dC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlci5vbk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlcj10LktleS5nZXREaXNwYXRjaGVyKCk7dGhpcy5fa2V5RGlzcGF0Y2hlci5vbktleURvd24odGhpcy5fa2V5RG93bkNhbGxiYWNrKTt0aGlzLl9rZXlEaXNwYXRjaGVyLm9uS2V5VXAodGhpcy5fa2V5VXBDYWxsYmFjayl9O20ucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3AucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlcj1udWxsOwp0aGlzLl9rZXlEaXNwYXRjaGVyLm9mZktleURvd24odGhpcy5fa2V5RG93bkNhbGxiYWNrKTt0aGlzLl9rZXlEaXNwYXRjaGVyLm9mZktleVVwKHRoaXMuX2tleVVwQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX2hhbmRsZUtleURvd25FdmVudD1mdW5jdGlvbihuLHEpe3ZhciB1PXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLmxhc3RNb3VzZVBvc2l0aW9uKCkpO3RoaXMuX2lzSW5zaWRlQ29tcG9uZW50KHUpJiYhcS5yZXBlYXQmJih0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXSYmdGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl0uY2FsbENhbGxiYWNrcyhuKSx0aGlzLl9kb3duZWRLZXlzLmFkZChuKSl9O20ucHJvdG90eXBlLl9oYW5kbGVLZXlVcEV2ZW50PWZ1bmN0aW9uKG4pe3RoaXMuX2Rvd25lZEtleXMuaGFzKG4pJiZ0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dJiZ0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dLmNhbGxDYWxsYmFja3Mobik7CnRoaXMuX2Rvd25lZEtleXMuZGVsZXRlKG4pfTttLnByb3RvdHlwZS5vbktleVByZXNzPWZ1bmN0aW9uKG4scSl7dGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl18fCh0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXT1uZXcgbC5DYWxsYmFja1NldCk7dGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl0uYWRkKHEpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZLZXlQcmVzcz1mdW5jdGlvbihuLHEpe3RoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dLmRlbGV0ZShxKTswPT09dGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl0uc2l6ZSYmZGVsZXRlIHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vbktleVJlbGVhc2U9ZnVuY3Rpb24obixxKXt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dfHwodGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXT1uZXcgbC5DYWxsYmFja1NldCk7dGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXS5hZGQocSk7cmV0dXJuIHRoaXN9OwptLnByb3RvdHlwZS5vZmZLZXlSZWxlYXNlPWZ1bmN0aW9uKG4scSl7dGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXS5kZWxldGUocSk7MD09PXRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0uc2l6ZSYmZGVsZXRlIHRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl07cmV0dXJuIHRoaXN9O3JldHVybiBtfShoKDE1KS5JbnRlcmFjdGlvbik7Zi5LZXk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSx0PWgoMCk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0pe3ZvaWQgMD09PW0mJihtPVtdKTt2YXIgbj1sLmNhbGwodGhpcyl8fHRoaXM7bi5fY29tcG9uZW50cz0KW107bi5hZGRDbGFzcygiY29tcG9uZW50LWdyb3VwIik7bS5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLmFwcGVuZChxKX0pO3JldHVybiBufWsocCxsKTtwLnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbihtKXt0aGlzLmNvbXBvbmVudHMoKS5mb3JFYWNoKG0pfTtwLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24obSl7cmV0dXJuIDA8PXRoaXMuX2NvbXBvbmVudHMuaW5kZXhPZihtKX07cC5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24obSxuKXt2YXIgcT10aGlzLl9jb21wb25lbnRzLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gdS5yZXF1ZXN0ZWRTcGFjZShtLG4pfSk7cmV0dXJue21pbldpZHRoOnQuTWF0aC5tYXgocSxmdW5jdGlvbih1KXtyZXR1cm4gdS5taW5XaWR0aH0sMCksbWluSGVpZ2h0OnQuTWF0aC5tYXgocSxmdW5jdGlvbih1KXtyZXR1cm4gdS5taW5IZWlnaHR9LDApfX07cC5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihtLG4scSl7dmFyIHU9CnRoaXM7bC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsbSxuLHEpO3RoaXMuX2ZvckVhY2goZnVuY3Rpb24oeCl7eC5jb21wdXRlTGF5b3V0KHt4OjAseTowfSx1LndpZHRoKCksdS5oZWlnaHQoKSl9KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24obSxuKXtyZXR1cm57d2lkdGg6bSxoZWlnaHQ6bn19O3AucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50cy5ldmVyeShmdW5jdGlvbihtKXtyZXR1cm4gbS5maXhlZFdpZHRoKCl9KX07cC5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50cy5ldmVyeShmdW5jdGlvbihtKXtyZXR1cm4gbS5maXhlZEhlaWdodCgpfSl9O3AucHJvdG90eXBlLmNvbXBvbmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50cy5zbGljZSgpfTtwLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24obSl7bnVsbD09Cm18fHRoaXMuaGFzKG0pfHwobS5kZXRhY2goKSx0aGlzLl9jb21wb25lbnRzLnB1c2gobSksdGhpcy5fYWRvcHRBbmRBbmNob3IobSksdGhpcy5yZWRyYXcoKSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24obSl7bT10aGlzLl9jb21wb25lbnRzLmluZGV4T2YobSk7MDw9bSYmdGhpcy5fY29tcG9uZW50cy5zcGxpY2UobSwxKX07cmV0dXJuIHB9KGgoMjkpLkNvbXBvbmVudENvbnRhaW5lcik7Zi5Hcm91cD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9O2goMCk7ZD1oKDQpO3ZhciB0OyhmdW5jdGlvbihsKXtsW2wuVkFMVUU9MF09CiJWQUxVRSI7bFtsLlBJWEVMPTFdPSJQSVhFTCJ9KSh0fHwodD17fSkpO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtKXt2YXIgbj1sLmNhbGwodGhpcyl8fHRoaXM7bi5fbW9kZT10LlZBTFVFO2lmKG0hPT1wLk9SSUVOVEFUSU9OX1ZFUlRJQ0FMJiZtIT09cC5PUklFTlRBVElPTl9IT1JJWk9OVEFMKXRocm93IEVycm9yKG0rIiBpcyBub3QgYSB2YWxpZCBvcmllbnRhdGlvbiBmb3IgR3VpZGVMaW5lTGF5ZXIiKTtuLl9vcmllbnRhdGlvbj1tO24uX292ZXJmbG93SGlkZGVuPSEwO24uYWRkQ2xhc3MoImd1aWRlLWxpbmUtbGF5ZXIiKTtuLl9pc1ZlcnRpY2FsKCk/bi5hZGRDbGFzcygidmVydGljYWwiKTpuLmFkZENsYXNzKCJob3Jpem9udGFsIik7bi5fc2NhbGVVcGRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe24uX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKTtuLnJlbmRlcigpfTtyZXR1cm4gbn1rKHAsbCk7cC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CnRoaXMuX2d1aWRlTGluZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJndWlkZS1saW5lIiwhMCl9O3AucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKG0sbil7cmV0dXJue3dpZHRoOm0saGVpZ2h0Om59fTtwLnByb3RvdHlwZS5faXNWZXJ0aWNhbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmllbnRhdGlvbj09PXAuT1JJRU5UQVRJT05fVkVSVElDQUx9O3AucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07cC5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07cC5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihtLG4scSl7bC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsbSxuLHEpO251bGwhPXRoaXMuc2NhbGUoKSYmKHRoaXMuX2lzVmVydGljYWwoKT90aGlzLnNjYWxlKCkucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk6dGhpcy5zY2FsZSgpLnJhbmdlKFt0aGlzLmhlaWdodCgpLAowXSkpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe2wucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO3RoaXMuX2d1aWRlTGluZS5hdHRycyh7eDE6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOjAseTE6dGhpcy5faXNWZXJ0aWNhbCgpPzA6dGhpcy5waXhlbFBvc2l0aW9uKCkseDI6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOnRoaXMud2lkdGgoKSx5Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLnBpeGVsUG9zaXRpb24oKX0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZT1mdW5jdGlvbigpe251bGwhPXRoaXMuc2NhbGUoKSYmKHRoaXMuX21vZGU9PT10LlZBTFVFJiZudWxsIT10aGlzLnZhbHVlKCk/dGhpcy5fcGl4ZWxQb3NpdGlvbj0KdGhpcy5zY2FsZSgpLnNjYWxlKHRoaXMudmFsdWUoKSk6dGhpcy5fbW9kZT09PXQuUElYRUwmJm51bGwhPXRoaXMucGl4ZWxQb3NpdGlvbigpJiYodGhpcy5fdmFsdWU9dGhpcy5zY2FsZSgpLmludmVydCh0aGlzLnBpeGVsUG9zaXRpb24oKSkpKX07cC5wcm90b3R5cGUuX3NldFBpeGVsUG9zaXRpb25XaXRob3V0Q2hhbmdpbmdNb2RlPWZ1bmN0aW9uKG0pe3RoaXMuX3BpeGVsUG9zaXRpb249bTtudWxsIT10aGlzLnNjYWxlKCkmJih0aGlzLl92YWx1ZT10aGlzLnNjYWxlKCkuaW52ZXJ0KHRoaXMucGl4ZWxQb3NpdGlvbigpKSk7dGhpcy5yZW5kZXIoKX07cC5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fc2NhbGU7dmFyIG49dGhpcy5fc2NhbGU7bnVsbCE9biYmbi5vZmZVcGRhdGUodGhpcy5fc2NhbGVVcGRhdGVDYWxsYmFjayk7dGhpcy5fc2NhbGU9bTt0aGlzLl9zY2FsZS5vblVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKTsKdGhpcy5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKG0pe2lmKG51bGw9PW0pcmV0dXJuIHRoaXMuX3ZhbHVlO3RoaXMuX3ZhbHVlPW07dGhpcy5fbW9kZT10LlZBTFVFO3RoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5waXhlbFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BpeGVsUG9zaXRpb259O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7bnVsbCE9dGhpcy5zY2FsZSgpJiZ0aGlzLnNjYWxlKCkub2ZmVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spfTtyZXR1cm4gcH0oZC5Db21wb25lbnQpO2QuT1JJRU5UQVRJT05fVkVSVElDQUw9InZlcnRpY2FsIjtkLk9SSUVOVEFUSU9OX0hPUklaT05UQUw9Imhvcml6b250YWwiOwpmLkd1aWRlTGluZUxheWVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDApO2Q9aCg0KTt2YXIgbDsoZnVuY3Rpb24ocCl7cFtwLlZBTFVFPTBdPSJWQUxVRSI7cFtwLlBJWEVMPTFdPSJQSVhFTCJ9KShsPWYuUHJvcGVydHlNb2RlfHwoZi5Qcm9wZXJ0eU1vZGU9e30pKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1wLmNhbGwodGhpcyl8fHRoaXM7bi5fYm94VmlzaWJsZT0hMTtuLl9ib3hCb3VuZHM9e3RvcExlZnQ6e3g6MCx5OjB9LGJvdHRvbVJpZ2h0Ont4OjAseTowfX07bi5feEJvdW5kc01vZGU9bC5QSVhFTDtuLl95Qm91bmRzTW9kZT0KbC5QSVhFTDtuLmFkZENsYXNzKCJzZWxlY3Rpb24tYm94LWxheWVyIik7bi5fYWRqdXN0Qm91bmRzQ2FsbGJhY2s9ZnVuY3Rpb24oKXtuLnJlbmRlcigpfTtuLl9vdmVyZmxvd0hpZGRlbj0hMDtuLl94RXh0ZW50PVt2b2lkIDAsdm9pZCAwXTtuLl95RXh0ZW50PVt2b2lkIDAsdm9pZCAwXTtyZXR1cm4gbn1rKG0scCk7bS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fYm94PXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInNlbGVjdGlvbi1ib3giLCEwKS5yZW1vdmUoKTt0aGlzLl9ib3hBcmVhPXRoaXMuX2JveC5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzZWxlY3Rpb24tYXJlYSIsITApfTttLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbihuLHEpe3JldHVybnt3aWR0aDpuLGhlaWdodDpxfX07bS5wcm90b3R5cGUuYm91bmRzPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2dldEJvdW5kcygpOwp0aGlzLl9zZXRCb3VuZHMobik7dGhpcy5feUJvdW5kc01vZGU9dGhpcy5feEJvdW5kc01vZGU9bC5QSVhFTDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fc2V0Qm91bmRzPWZ1bmN0aW9uKG4pe3RoaXMuX2JveEJvdW5kcz17dG9wTGVmdDp7eDpNYXRoLm1pbihuLnRvcExlZnQueCxuLmJvdHRvbVJpZ2h0LngpLHk6TWF0aC5taW4obi50b3BMZWZ0Lnksbi5ib3R0b21SaWdodC55KX0sYm90dG9tUmlnaHQ6e3g6TWF0aC5tYXgobi50b3BMZWZ0Lngsbi5ib3R0b21SaWdodC54KSx5Ok1hdGgubWF4KG4udG9wTGVmdC55LG4uYm90dG9tUmlnaHQueSl9fX07bS5wcm90b3R5cGUuX2dldEJvdW5kcz1mdW5jdGlvbigpe3JldHVybnt0b3BMZWZ0Ont4OnRoaXMuX3hCb3VuZHNNb2RlPT09bC5QSVhFTD90aGlzLl9ib3hCb3VuZHMudG9wTGVmdC54Om51bGw9PXRoaXMuX3hTY2FsZT8wOk1hdGgubWluKHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMF0pLAp0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzFdKSkseTp0aGlzLl95Qm91bmRzTW9kZT09PWwuUElYRUw/dGhpcy5fYm94Qm91bmRzLnRvcExlZnQueTpudWxsPT10aGlzLl95U2NhbGU/MDpNYXRoLm1pbih0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzBdKSx0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzFdKSl9LGJvdHRvbVJpZ2h0Ont4OnRoaXMuX3hCb3VuZHNNb2RlPT09bC5QSVhFTD90aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueDpudWxsPT10aGlzLl94U2NhbGU/MDpNYXRoLm1heCh0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzBdKSx0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzFdKSkseTp0aGlzLl95Qm91bmRzTW9kZT09PWwuUElYRUw/dGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0Lnk6bnVsbD09dGhpcy5feVNjYWxlPzA6TWF0aC5tYXgodGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVswXSksCnRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMV0pKX19fTttLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7aWYodGhpcy5fYm94VmlzaWJsZSl7dmFyIG49dGhpcy5ib3VuZHMoKSxxPW4udG9wTGVmdC55LHU9bi5ib3R0b21SaWdodC55LHg9bi50b3BMZWZ0Lng7bj1uLmJvdHRvbVJpZ2h0Lng7aWYoISh0Lk1hdGguaXNWYWxpZE51bWJlcihxKSYmdC5NYXRoLmlzVmFsaWROdW1iZXIodSkmJnQuTWF0aC5pc1ZhbGlkTnVtYmVyKHgpJiZ0Lk1hdGguaXNWYWxpZE51bWJlcihuKSkpdGhyb3cgRXJyb3IoImJvdW5kcyBoYXZlIG5vdCBiZWVuIHByb3Blcmx5IHNldCIpO3RoaXMuX2JveEFyZWEuYXR0cnMoe3gseTpxLHdpZHRoOm4teCxoZWlnaHQ6dS1xfSk7dGhpcy5jb250ZW50KCkubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX2JveC5ub2RlKCkpfWVsc2UgdGhpcy5fYm94LnJlbW92ZSgpOwpyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuYm94VmlzaWJsZT1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9ib3hWaXNpYmxlO3RoaXMuX2JveFZpc2libGU9bjt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O20ucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O20ucHJvdG90eXBlLnhTY2FsZT1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl94U2NhbGU7bnVsbCE9dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLl94U2NhbGU9bjt0aGlzLl94Qm91bmRzTW9kZT1sLlZBTFVFO3RoaXMuX3hTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUueVNjYWxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PQpuKXJldHVybiB0aGlzLl95U2NhbGU7bnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLl95U2NhbGU9bjt0aGlzLl95Qm91bmRzTW9kZT1sLlZBTFVFO3RoaXMuX3lTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRYRXh0ZW50KCl9O20ucHJvdG90eXBlLl9nZXRYRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3hCb3VuZHNNb2RlPT09bC5WQUxVRT90aGlzLl94RXh0ZW50Om51bGw9PXRoaXMuX3hTY2FsZT9bdm9pZCAwLHZvaWQgMF06W3RoaXMuX3hTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLnRvcExlZnQueCksdGhpcy5feFNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueCldfTttLnByb3RvdHlwZS5fc2V0WEV4dGVudD0KZnVuY3Rpb24obil7dGhpcy5feEV4dGVudD1ufTttLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFlFeHRlbnQoKX07bS5wcm90b3R5cGUuX2dldFlFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feUJvdW5kc01vZGU9PT1sLlZBTFVFP3RoaXMuX3lFeHRlbnQ6bnVsbD09dGhpcy5feVNjYWxlP1t2b2lkIDAsdm9pZCAwXTpbdGhpcy5feVNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMudG9wTGVmdC55KSx0aGlzLl95U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC55KV19O20ucHJvdG90eXBlLl9zZXRZRXh0ZW50PWZ1bmN0aW9uKG4pe3RoaXMuX3lFeHRlbnQ9bn07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3AucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtudWxsIT10aGlzLl94U2NhbGUmJnRoaXMueFNjYWxlKCkub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTtudWxsIT10aGlzLl95U2NhbGUmJgp0aGlzLnlTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayl9O3JldHVybiBtfShkLkNvbXBvbmVudCk7Zi5TZWxlY3Rpb25Cb3hMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3JldHVybiB0LmNhbGwodGhpcywicGF0aCIsImFyYyBmaWxsIil8fHRoaXN9ayhsLHQpO2wucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHApe3Auc3R5bGUoInN0cm9rZSIsIm5vbmUiKX07cmV0dXJuIGx9KGgoOSkuU1ZHRHJhd2VyKTtmLkFyY1NWR0RyYXdlcj0KZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHRbbV09bFttXSk7dC5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gdC5jYWxsKHRoaXMsInBhdGgiLCJhcmMgb3V0bGluZSIpfHx0aGlzfWsobCx0KTtsLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbihwKXtwLnN0eWxlKCJmaWxsIiwibm9uZSIpfTtyZXR1cm4gbH0oaCg5KS5TVkdEcmF3ZXIpO2YuQXJjT3V0bGluZVNWR0RyYXdlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9CnB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMTgpO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3JldHVybiBwLmNhbGwodGhpcywicGF0aCIsImFyZWEiKXx8dGhpc31rKG0scCk7bS5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24obil7bi5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfTttLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHAucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXguY2FsbCh0aGlzLDApfTtyZXR1cm4gbX0oaCg5KS5TVkdEcmF3ZXIpO2YuQXJlYVNWR0RyYXdlcj1kO3ZhciBsPVsiZmlsbCIsIm9wYWNpdHkiLCJmaWxsLW9wYWNpdHkiXTtmLm1ha2VBcmVhQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24ocCl7cmV0dXJuIGZ1bmN0aW9uKG0sCm4scSl7cT10LnJlc29sdmVBdHRyaWJ1dGVzKHEsbCxuWzBdLDApO3QucmVuZGVyQXJlYShtLHAoKSxuWzBdLHEpfX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJsaW5lIiwiIil8fHRoaXN9ayhsLHQpO3JldHVybiBsfShoKDkpLlNWR0RyYXdlcik7Zi5TZWdtZW50U1ZHRHJhd2VyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKG4scSx1LHgsQSl7cmV0dXJuIDA8PXUrQSYmdS1BPD1uJiYwPD14K0EmJngtQTw9cX1mdW5jdGlvbiB0KG4scSx1KXtpZihudWxsPT1uKXJldHVybiExOwpmb3IodmFyIHg9MDt4PHUubGVuZ3RoO3grKyl7dmFyIEE9dVt4XTtpZihuW0FdIT1xW0FdKXJldHVybiExfXJldHVybiEwfXZhciBsPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSxwPWgoODYpLG09aCgxOCk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKCl7cmV0dXJuIG4uY2FsbCh0aGlzLCJwYXRoIiwic3ltYm9sIil8fHRoaXN9bChxLG4pO3JldHVybiBxfShoKDkpLlNWR0RyYXdlcik7Zi5TeW1ib2xTVkdEcmF3ZXI9ZDtmLm1ha2VTeW1ib2xDYW52YXNEcmF3U3RlcD1mdW5jdGlvbihuLHEsdSl7dmFyIHg9dGhpcztyZXR1cm4gZnVuY3Rpb24oQSx5LHcpe3ZhciBDPUEuY2FudmFzLEY9Qy5jbGllbnRXaWR0aDsKQz1DLmNsaWVudEhlaWdodDtmb3IodmFyIEQ9bmV3IHAuQ2FudmFzQnVmZmVyKDAsMCksQj1xKCksST11KCksTj1udWxsLE89bnVsbCxIPW51bGwsSz0wO0s8eS5sZW5ndGg7SysrKXt2YXIgTT15W0tdO2lmKG51bGwhPU0pe3ZhciBMPW0ucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzKHcsWyJ4IiwieSJdLE0sSyksUT1JKE0sSyxuKTtpZihrKEYsQyxMLngsTC55LFEpKXt2YXIgVD10KE4sTCxtLkNvbnRleHRTdHlsZUF0dHJzKTtNPUIoTSxLLHguX2RhdGFzZXQpO1QmJkg9PVEmJk89PU18fChOPW0uZ2V0U3Ryb2tlV2lkdGgoTCksTj1RK04rMSwoTj5ELnNjcmVlbldpZHRofHxOPkQuc2NyZWVuSGVpZ2h0KSYmRC5yZXNpemUoTixOLCEwKSxELmNsZWFyKCksTj1ELmN0eCxOLmJlZ2luUGF0aCgpLE0oUSkuY29udGV4dChOKShudWxsKSxOLmNsb3NlUGF0aCgpLG0ucmVuZGVyUGF0aFdpdGhTdHlsZShOLEwpLE89TSxIPVEsTj1MKTtELmJsaXRDZW50ZXIoQSxMLngsTC55KX19fX19fSwKZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsoRCl7cmV0dXJuIEQgaW5zdGFuY2VvZiB5P0Q6RCBpbnN0YW5jZW9mIERhdGU/cChELnZhbHVlT2YoKSk6RCBpbnN0YW5jZW9mIEEuU2NhbGU/dChEKTpEIGluc3RhbmNlb2YgeC5EYXRhc2V0P2woRCk6dShEKT9uKEQpOkFycmF5LmlzQXJyYXkoRCk/bShEKTpwKEQpfWZ1bmN0aW9uIHQoRCl7RD17ZG9tYWluOkQuZG9tYWluKCkscmFuZ2U6RC5yYW5nZSgpLHVwZGF0ZUlkOkQudXBkYXRlSWQoKSxyZWY6cChEKX07cmV0dXJuIG4oRCl9ZnVuY3Rpb24gbChEKXtEPXtyZWY6cChEKSx1cGRhdGVJZDpELnVwZGF0ZUlkKCl9O3JldHVybiBuKEQpfWZ1bmN0aW9uIHAoRCl7cmV0dXJuIG5ldyBDKEQpfWZ1bmN0aW9uIG0oRCl7cmV0dXJuIG5ldyB3KEQubWFwKGZ1bmN0aW9uKEIpe3JldHVybiBrKEIpfSkpfWZ1bmN0aW9uIG4oRCl7dmFyIEI9e30sSTtmb3IoSSBpbiBEKUQuaGFzT3duUHJvcGVydHkoSSkmJihCW0ldPWsoRFtJXSkpO3JldHVybiBuZXcgRihCKX0KdmFyIHE9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEQsQil7ZnVuY3Rpb24gSSgpe3RoaXMuY29uc3RydWN0b3I9RH1mb3IodmFyIE4gaW4gQilCLmhhc093blByb3BlcnR5KE4pJiYoRFtOXT1CW05dKTtELnByb3RvdHlwZT1udWxsPT09Qj9PYmplY3QuY3JlYXRlKEIpOihJLnByb3RvdHlwZT1CLnByb3RvdHlwZSxuZXcgSSl9LHU9aCgxMjgpLHg9aCgzOCksQT1oKDE3KTtmLnNpZ249aztmLnNpZ25TY2FsZT10O2Yuc2lnbkRhdGFzZXQ9bDtmLnNpZ25SZWY9cDtmLnNpZ25BcnJheT1tO2Yuc2lnbk9iaj1uO3ZhciB5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRCgpe31ELnByb3RvdHlwZS5pc0RpZmZlcmVudD1mdW5jdGlvbihCKXtyZXR1cm4gQiBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/dGhpcy5pc1NpZ25hdHVyZURpZmZlcmVudChCKTohMH07cmV0dXJuIER9KCk7Zi5TaWduYXR1cmU9eTt2YXIgdz1mdW5jdGlvbihEKXtmdW5jdGlvbiBCKEkpe3ZhciBOPUQuY2FsbCh0aGlzKXx8CnRoaXM7Ti5hcnJheT1JO3JldHVybiBOfXEoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihJKXtpZihJLmFycmF5Lmxlbmd0aCE9PXRoaXMuYXJyYXkubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgTj0wO048dGhpcy5hcnJheS5sZW5ndGg7TisrKWlmKHRoaXMuYXJyYXlbTl0uaXNEaWZmZXJlbnQoSS5hcnJheVtOXSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiBCfSh5KTtmLkFycmF5U2lnbmF0dXJlPXc7dmFyIEM9ZnVuY3Rpb24oRCl7ZnVuY3Rpb24gQihJKXt2YXIgTj1ELmNhbGwodGhpcyl8fHRoaXM7Ti5yZWY9STtyZXR1cm4gTn1xKEIsRCk7Qi5wcm90b3R5cGUuaXNTaWduYXR1cmVEaWZmZXJlbnQ9ZnVuY3Rpb24oSSl7cmV0dXJuIHRoaXMucmVmIT09SS5yZWZ9O3JldHVybiBCfSh5KTtmLlJlZmVyZW5jZVNpZ25hdHVyZT1DO3ZhciBGPWZ1bmN0aW9uKEQpe2Z1bmN0aW9uIEIoSSl7dmFyIE49RC5jYWxsKHRoaXMpfHx0aGlzO04ub2JqPQpJO3JldHVybiBOfXEoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihJKXt2YXIgTj1PYmplY3Qua2V5cyh0aGlzLm9iaiksTz1PYmplY3Qua2V5cyhJLm9iaik7aWYoTi5sZW5ndGghPT1PLmxlbmd0aClyZXR1cm4hMDtmb3IoTz0wO088Ti5sZW5ndGg7TysrKXt2YXIgSD1OW09dO2lmKCFJLm9iai5oYXNPd25Qcm9wZXJ0eShIKXx8dGhpcy5vYmpbSF0uaXNEaWZmZXJlbnQoSS5vYmpbSF0pKXJldHVybiEwfXJldHVybiExfTtyZXR1cm4gQn0oeSk7Zi5PYmplY3RTaWduYXR1cmU9Rn0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih5LHcpe2Z1bmN0aW9uIEMoKXt0aGlzLmNvbnN0cnVjdG9yPXl9Zm9yKHZhciBGIGluIHcpdy5oYXNPd25Qcm9wZXJ0eShGKSYmKHlbRl09d1tGXSk7eS5wcm90b3R5cGU9bnVsbD09PXc/T2JqZWN0LmNyZWF0ZSh3KTooQy5wcm90b3R5cGU9dy5wcm90b3R5cGUsbmV3IEMpfSwKdD1oKDEpLGw9aCgzKSxwPWgoMCksbT1oKDE0KSxuPWgoNDYpLHE9aCg2KSx1PWgoMzMpLHg9aCgxOSk7ZD1oKDUzKTt2YXIgQT1oKDIpO2g9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24gdygpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLmFkZENsYXNzKCJhcmVhLXBsb3QiKTtDLnkwKDApO0MuYXR0cigiZmlsbC1vcGFjaXR5IiwuMjUpO0MuYXR0cigiZmlsbCIsKG5ldyBsLkNvbG9yKS5yYW5nZSgpWzBdKTtDLl9saW5lRHJhd2Vycz1uZXcgcC5NYXA7cmV0dXJuIEN9ayh3LHkpO3cucHJvdG90eXBlLnk9ZnVuY3Rpb24oQyxGKXtpZihudWxsPT1DKXJldHVybiB5LnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09Rj95LnByb3RvdHlwZS55LmNhbGwodGhpcyxDKTp5LnByb3RvdHlwZS55LmNhbGwodGhpcyxDLEYpO251bGwhPUYmJihDPXRoaXMueTAoKS5hY2Nlc3NvcixudWxsIT1DJiZ0aGlzLl9iaW5kUHJvcGVydHkody5fWTBfS0VZLEMsRiksdGhpcy5fdXBkYXRlWVNjYWxlKCkpOwpyZXR1cm4gdGhpc307dy5wcm90b3R5cGUueTA9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQody5fWTBfS0VZKTt2YXIgRj10aGlzLnkoKTt0aGlzLl9iaW5kUHJvcGVydHkody5fWTBfS0VZLEMsRiYmRi5zY2FsZSk7dGhpcy5fdXBkYXRlWVNjYWxlKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3kucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTt0aGlzLl91cGRhdGVZU2NhbGUoKX07dy5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24oQyl7dmFyIEY9dGhpczt0aGlzLl9saW5lRHJhd2Vycy5zZXQoQyxuZXcgbS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgdS5MaW5lU1ZHRHJhd2VyfSxmdW5jdGlvbihEKXtyZXR1cm4gbmV3IG0uQ2FudmFzRHJhd2VyKEQsdS5tYWtlTGluZUNhbnZhc0RyYXdTdGVwKGZ1bmN0aW9uKCl7dmFyIEI9CkEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi54KCkpLEk9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnkoKSk7cmV0dXJuIEYuX2QzTGluZUZhY3RvcnkoQyxCLEkpfSkpfSkpO3kucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxDKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbihDKXt5LnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0LmNhbGwodGhpcyxDKTtDPXRoaXMuX2xpbmVEcmF3ZXJzLmdldChDKTsic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9DLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTpDLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpO3JldHVybiBDfTt3LnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEMpe3kucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMuY2FsbCh0aGlzLEMpO3RoaXMuX2xpbmVEcmF3ZXJzLmdldChDKS5yZW1vdmUoKX07dy5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD0KZnVuY3Rpb24oKXt2YXIgQz10aGlzLEY9dGhpcy5fZ2VuZXJhdGVMaW5lRHJhd1N0ZXBzKCksRD10aGlzLl9nZXREYXRhVG9EcmF3KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oQil7dmFyIEk9QS5QbG90LmFwcGx5RHJhd1N0ZXBzKEYsQik7Qy5fbGluZURyYXdlcnMuZ2V0KEIpLmRyYXcoRC5nZXQoQiksSSl9KX07dy5wcm90b3R5cGUuX2dlbmVyYXRlTGluZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBDPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEY9dGhpcy5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yKCk7Ri5kPXRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IoQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksdGhpcy5fZ2V0UmVzZXRZRnVuY3Rpb24oKSk7Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6RixhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLlJFU0VUKX0pfUMucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dlbmVyYXRlTGluZUF0dHJUb1Byb2plY3RvcigpLAphbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtDLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oQyl7dmFyIEY9dGhpcztyZXR1cm4gbmV3IHEuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uQXJlYVNWR0RyYXdlcn0sZnVuY3Rpb24oRCl7cmV0dXJuIG5ldyBtLkNhbnZhc0RyYXdlcihELG4ubWFrZUFyZWFDYW52YXNEcmF3U3RlcChmdW5jdGlvbigpe3ZhciBCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi54KCkpLEk9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnkoKSksCk49QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnkwKCkpO3JldHVybiBGLl9jcmVhdGVBcmVhR2VuZXJhdG9yKEIsSSxOLEYuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoQixJKSxDKX0pKX0pfTt3LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgQz1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBGPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0YuZD10aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCksQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkwKCkpKTtDLnB1c2goe2F0dHJUb1Byb2plY3RvcjpGLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHguQW5pbWF0b3IuUkVTRVQpfSl9Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoeC5BbmltYXRvci5NQUlOKX0pOwpyZXR1cm4gQ307dy5wcm90b3R5cGUuX3VwZGF0ZVlTY2FsZT1mdW5jdGlvbigpe3ZhciBDPXRoaXMuZ2V0RXh0ZW50c0ZvclByb3BlcnR5KCJ5MCIpO0M9cC5BcnJheS51bmlxKHAuQXJyYXkuZmxhdHRlbihDKSk7dmFyIEY9MT09PUMubGVuZ3RoP0NbMF06bnVsbDtDPShDPXRoaXMueSgpKSYmQy5zY2FsZTtudWxsIT1DJiYobnVsbCE9dGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXImJihDLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXIpLHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyPW51bGwpLG51bGwhPUYmJih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybltGXX0sQy5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSkpfTt3LnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249CmZ1bmN0aW9uKCl7cmV0dXJuIEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MCgpKX07dy5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBDPXkucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtDLmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSkpO3JldHVybiBDfTt3LnByb3RvdHlwZS5zZWxlY3Rpb25zPWZ1bmN0aW9uKEMpe3ZhciBGPXRoaXM7dm9pZCAwPT09QyYmKEM9dGhpcy5kYXRhc2V0cygpKTtpZigiY2FudmFzIj09PXRoaXMucmVuZGVyZXIoKSlyZXR1cm4gdC5zZWxlY3RBbGwoKTt2YXIgRD15LnByb3RvdHlwZS5zZWxlY3Rpb25zLmNhbGwodGhpcyxDKS5ub2RlcygpO0MubWFwKGZ1bmN0aW9uKEIpe3JldHVybiBGLl9saW5lRHJhd2Vycy5nZXQoQil9KS5maWx0ZXIoZnVuY3Rpb24oQil7cmV0dXJuIG51bGwhPQpCfSkuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gRC5wdXNoLmFwcGx5KEQsQi5nZXRWaXN1YWxQcmltaXRpdmVzKCkpfSk7cmV0dXJuIHQuc2VsZWN0QWxsKEQpfTt3LnByb3RvdHlwZS5fY29uc3RydWN0QXJlYVByb2plY3Rvcj1mdW5jdGlvbihDLEYsRCl7dmFyIEI9dGhpcyxJPXRoaXMuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiBmdW5jdGlvbihOLE8sSCl7cmV0dXJuIEIuX2NyZWF0ZUFyZWFHZW5lcmF0b3IoQyxGLEQsSSxIKShOKX19O3cucHJvdG90eXBlLl9jcmVhdGVEZWZpbmVkUHJvamVjdG9yPWZ1bmN0aW9uKEMsRil7cmV0dXJuIGZ1bmN0aW9uKEQsQixJKXt2YXIgTj1DKEQsQixJKTtEPUYoRCxCLEkpO3JldHVybiBwLk1hdGguaXNWYWxpZE51bWJlcihOKSYmcC5NYXRoLmlzVmFsaWROdW1iZXIoRCl9fTt3LnByb3RvdHlwZS5fY3JlYXRlQXJlYUdlbmVyYXRvcj0KZnVuY3Rpb24oQyxGLEQsQixJKXt2YXIgTj10aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKTtyZXR1cm4gdC5hcmVhKCkueChmdW5jdGlvbihPLEgpe3JldHVybiBDKE8sSCxJKX0pLnkxKGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEYoTyxILEkpfSkueTAoZnVuY3Rpb24oTyxIKXtyZXR1cm4gRChPLEgsSSl9KS5jdXJ2ZShOKS5kZWZpbmVkKGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEIoTyxILEkpfSl9O3JldHVybiB3fShkLkxpbmUpO2guX1kwX0tFWT0ieTAiO2YuQXJlYT1ofSxmdW5jdGlvbihkLGYpeyhmdW5jdGlvbihoKXtoLk1BSU49Im1haW4iO2guUkVTRVQ9InJlc2V0In0pKGYuQW5pbWF0b3J8fChmLkFuaW1hdG9yPXt9KSl9LGZ1bmN0aW9uKGQsZil7dmFyIGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKCl7dmFyIHQ9dGhpczt0aGlzLnRyYW5zbGF0ZT10aGlzLnNjYWxlPTA7dGhpcy5jYWNoZWREb21haW49W251bGwsbnVsbF07dGhpcy5sYXN0U2VlbkRvbWFpbj1bbnVsbCxudWxsXTt0aGlzLnVwZGF0ZURvbWFpbj0KZnVuY3Rpb24obCl7dC5sYXN0U2VlbkRvbWFpbj1sLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCk7dmFyIHA9bC5zY2FsZVRyYW5zZm9ybWF0aW9uKHQuY2FjaGVkRG9tYWluWzFdKS1sLnNjYWxlVHJhbnNmb3JtYXRpb24odC5jYWNoZWREb21haW5bMF0pLG09bC5zY2FsZVRyYW5zZm9ybWF0aW9uKHQubGFzdFNlZW5Eb21haW5bMV0pLWwuc2NhbGVUcmFuc2Zvcm1hdGlvbih0Lmxhc3RTZWVuRG9tYWluWzBdKTt0LnNjYWxlPXAvbXx8MTt0LnRyYW5zbGF0ZT1sLnNjYWxlVHJhbnNmb3JtYXRpb24odC5jYWNoZWREb21haW5bMF0pLWwuc2NhbGVUcmFuc2Zvcm1hdGlvbih0Lmxhc3RTZWVuRG9tYWluWzBdKSp0LnNjYWxlfHwwfX1rLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuc2NhbGU9MTt0aGlzLnRyYW5zbGF0ZT0wO3RoaXMuY2FjaGVkRG9tYWluPXRoaXMubGFzdFNlZW5Eb21haW59O2sucHJvdG90eXBlLnNldERvbWFpbj1mdW5jdGlvbih0KXt0aGlzLmNhY2hlZERvbWFpbj0KdC5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpfTtyZXR1cm4ga30oKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gayh0LGwpe3ZhciBwPXRoaXM7dGhpcy5yZW5kZXJDYWxsYmFjaz10O3RoaXMuYXBwbHlUcmFuc2Zvcm1DYWxsYmFjaz1sO3RoaXMuZG9tYWluVHJhbnNmb3JtWD1uZXcgaDt0aGlzLmRvbWFpblRyYW5zZm9ybVk9bmV3IGg7dGhpcy5yZW5kZXJEZWZlcnJlZD1mdW5jdGlvbigpe3AuYXBwbHlUcmFuc2Zvcm0oKTtjbGVhclRpbWVvdXQocC50aW1lb3V0VG9rZW4pO3AudGltZW91dFRva2VuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtwLnJlbmRlckNhbGxiYWNrKCl9LGsuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZKX19ay5wcm90b3R5cGUuc2V0RG9tYWlucz1mdW5jdGlvbih0LGwpe3QmJnRoaXMuZG9tYWluVHJhbnNmb3JtWC5zZXREb21haW4odCk7bCYmdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnNldERvbWFpbihsKTt0aGlzLnJlbmRlckRlZmVycmVkKCl9O2sucHJvdG90eXBlLnVwZGF0ZURvbWFpbnM9CmZ1bmN0aW9uKHQsbCl7dCYmdGhpcy5kb21haW5UcmFuc2Zvcm1YLnVwZGF0ZURvbWFpbih0KTtsJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVkudXBkYXRlRG9tYWluKGwpO3RoaXMucmVuZGVyRGVmZXJyZWQoKX07ay5wcm90b3R5cGUucmVzZXRUcmFuc2Zvcm1zPWZ1bmN0aW9uKCl7dGhpcy5kb21haW5UcmFuc2Zvcm1YLnJlc2V0KCk7dGhpcy5kb21haW5UcmFuc2Zvcm1ZLnJlc2V0KCk7dGhpcy5hcHBseVRyYW5zZm9ybSgpfTtrLnByb3RvdHlwZS5hcHBseVRyYW5zZm9ybT1mdW5jdGlvbigpe3RoaXMuYXBwbHlUcmFuc2Zvcm1DYWxsYmFjayh0aGlzLmRvbWFpblRyYW5zZm9ybVgudHJhbnNsYXRlLHRoaXMuZG9tYWluVHJhbnNmb3JtWS50cmFuc2xhdGUsdGhpcy5kb21haW5UcmFuc2Zvcm1YLnNjYWxlLHRoaXMuZG9tYWluVHJhbnNmb3JtWS5zY2FsZSl9O3JldHVybiBrfSgpO2QuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZPTIwMDtmLkRlZmVycmVkUmVuZGVyZXI9ZH0sZnVuY3Rpb24oZCwKZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oQyxGKXtmdW5jdGlvbiBEKCl7dGhpcy5jb25zdHJ1Y3Rvcj1DfWZvcih2YXIgQiBpbiBGKUYuaGFzT3duUHJvcGVydHkoQikmJihDW0JdPUZbQl0pO0MucHJvdG90eXBlPW51bGw9PT1GP09iamVjdC5jcmVhdGUoRik6KEQucHJvdG90eXBlPUYucHJvdG90eXBlLG5ldyBEKX0sdD1oKDEpLGw9aCg3KSxwPWgoMTQpLG09aCg2KSxuPWgoMzMpLHE9aCgzKSx1PWgoMTEpLHg9aCgwKTtkPWgoMTApO3ZhciBBPWgoMTkpLHk9aCgyKTtoPWgoMTYpO3ZhciB3PXtsaW5lYXI6dC5jdXJ2ZUxpbmVhcixsaW5lYXJDbG9zZWQ6dC5jdXJ2ZUxpbmVhckNsb3NlZCxzdGVwOnQuY3VydmVTdGVwLHN0ZXBCZWZvcmU6dC5jdXJ2ZVN0ZXBCZWZvcmUsc3RlcEFmdGVyOnQuY3VydmVTdGVwQWZ0ZXIsYmFzaXM6dC5jdXJ2ZUJhc2lzLGJhc2lzT3Blbjp0LmN1cnZlQmFzaXNPcGVuLGJhc2lzQ2xvc2VkOnQuY3VydmVCYXNpc0Nsb3NlZCwKYnVuZGxlOnQuY3VydmVCdW5kbGUsY2FyZGluYWw6dC5jdXJ2ZUNhcmRpbmFsLGNhcmRpbmFsT3Blbjp0LmN1cnZlQ2FyZGluYWxPcGVuLGNhcmRpbmFsQ2xvc2VkOnQuY3VydmVDYXJkaW5hbENsb3NlZCxtb25vdG9uZTp0LmN1cnZlTW9ub3RvbmVYfTtmLkN1cnZlTmFtZT1kLm1ha2VFbnVtKCJsaW5lYXIgbGluZWFyQ2xvc2VkIHN0ZXAgc3RlcEJlZm9yZSBzdGVwQWZ0ZXIgYmFzaXMgYmFzaXNPcGVuIGJhc2lzQ2xvc2VkIGJ1bmRsZSBjYXJkaW5hbCBjYXJkaW5hbE9wZW4gY2FyZGluYWxDbG9zZWQgbW9ub3RvbmUiLnNwbGl0KCIgIikpO2g9ZnVuY3Rpb24oQyl7ZnVuY3Rpb24gRigpe3ZhciBEPUMuY2FsbCh0aGlzKXx8dGhpcztELl9jdXJ2ZT0ibGluZWFyIjtELl9hdXRvcmFuZ2VTbW9vdGg9ITE7RC5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQ9ITA7RC5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkPSExO0QuX2Rvd25zYW1wbGluZ0VuYWJsZWQ9ITE7RC5hZGRDbGFzcygibGluZS1wbG90Iik7CnZhciBCPW5ldyBsLkVhc2luZztCLnN0ZXBEdXJhdGlvbih5LlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0IuZWFzaW5nTW9kZSgiZXhwSW5PdXQiKTtCLm1heFRvdGFsRHVyYXRpb24oeS5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtELmFuaW1hdG9yKEEuQW5pbWF0b3IuTUFJTixCKTtELmF0dHIoInN0cm9rZSIsKG5ldyBxLkNvbG9yKS5yYW5nZSgpWzBdKTtELmF0dHIoInN0cm9rZS13aWR0aCIsIjJweCIpO3JldHVybiBEfWsoRixDKTtGLnByb3RvdHlwZS54PWZ1bmN0aW9uKEQsQixJKXtpZihudWxsPT1EKXJldHVybiBDLnByb3RvdHlwZS54LmNhbGwodGhpcyk7Qy5wcm90b3R5cGUueC5jYWxsKHRoaXMsRCxCLEkpO3RoaXMuX3NldFNjYWxlU25hcHBpbmcoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUueT1mdW5jdGlvbihELEIsSSl7aWYobnVsbD09RClyZXR1cm4gQy5wcm90b3R5cGUueS5jYWxsKHRoaXMpO0MucHJvdG90eXBlLnkuY2FsbCh0aGlzLEQsQiwKSSk7dGhpcy5fc2V0U2NhbGVTbmFwcGluZygpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIEMucHJvdG90eXBlLmF1dG9yYW5nZU1vZGUuY2FsbCh0aGlzKTtDLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlLmNhbGwodGhpcyxEKTt0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmF1dG9yYW5nZVNtb290aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hdXRvcmFuZ2VTbW9vdGh9O0YucHJvdG90eXBlLl9zZXRTY2FsZVNuYXBwaW5nPWZ1bmN0aW9uKCl7IngiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJnRoaXMueCgpJiZ0aGlzLngoKS5zY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiB1LlF1YW50aXRhdGl2ZVNjYWxlJiZ0aGlzLngoKS5zY2FsZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQoIXRoaXMuYXV0b3JhbmdlU21vb3RoKCkpOyJ5Ij09PXRoaXMuYXV0b3JhbmdlTW9kZSgpJiYKdGhpcy55KCkmJnRoaXMueSgpLnNjYWxlJiZ0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIHUuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueSgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSl9O0YucHJvdG90eXBlLmN1cnZlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2N1cnZlO3RoaXMuX2N1cnZlPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3duc2FtcGxpbmdFbmFibGVkfTtGLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZDt0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmNvbGxhcHNlRGVuc2VMaW5lc0VuYWJsZWQ9CmZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZDt0aGlzLl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQ9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7cmV0dXJuIG5ldyBtLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuLkxpbmVTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEkpe3JldHVybiBuZXcgcC5DYW52YXNEcmF3ZXIoSSxuLm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoZnVuY3Rpb24oKXtyZXR1cm4gQi5fZDNMaW5lRmFjdG9yeShEKX0pKX0pfTtGLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oRCl7dmFyIEI9Qy5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyxEKTtpZighdGhpcy5fYXV0b3JhbmdlU21vb3RofHx0aGlzLmF1dG9yYW5nZU1vZGUoKSE9PQpEfHwieCIhPT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmInkiIT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkpcmV0dXJuIEI7RD10aGlzLl9nZXRFZGdlSW50ZXJzZWN0aW9uUG9pbnRzKCk7dmFyIEk9InkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCk/RC5sZWZ0LmNvbmNhdChELnJpZ2h0KS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4ueX0pOkQudG9wLmNvbmNhdChELmJvdHRvbSkubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBOLnh9KTtyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIHQuZXh0ZW50KHQubWVyZ2UoW04sSV0pKX0pfTtGLnByb3RvdHlwZS5fZ2V0RWRnZUludGVyc2VjdGlvblBvaW50cz1mdW5jdGlvbigpe3ZhciBEPXRoaXM7aWYoISh0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIHUuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueCgpLnNjYWxlIGluc3RhbmNlb2YgdS5RdWFudGl0YXRpdmVTY2FsZSkpcmV0dXJue2xlZnQ6W10scmlnaHQ6W10sdG9wOltdLGJvdHRvbTpbXX07CnZhciBCPXRoaXMueSgpLnNjYWxlLEk9dGhpcy54KCkuc2NhbGUsTj17bGVmdDpbXSxyaWdodDpbXSx0b3A6W10sYm90dG9tOltdfSxPPUkuc2NhbGUoSS5kb21haW4oKVswXSksSD1JLnNjYWxlKEkuZG9tYWluKClbMV0pLEs9Qi5zY2FsZShCLmRvbWFpbigpWzBdKSxNPUIuc2NhbGUoQi5kb21haW4oKVsxXSk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oTCl7Zm9yKHZhciBRPUwuZGF0YSgpLFQsWCxhYSxsYSxaLGJhLGVhLGNhPTE7Y2E8US5sZW5ndGg7Y2ErKylsYT1iYXx8SS5zY2FsZShELngoKS5hY2Nlc3NvcihRW2NhLTFdLGNhLTEsTCkpLFo9ZWF8fEIuc2NhbGUoRC55KCkuYWNjZXNzb3IoUVtjYS0xXSxjYS0xLEwpKSxiYT1JLnNjYWxlKEQueCgpLmFjY2Vzc29yKFFbY2FdLGNhLEwpKSxlYT1CLnNjYWxlKEQueSgpLmFjY2Vzc29yKFFbY2FdLGNhLEwpKSxsYTxPPT09Tzw9YmEmJihUPU8tbGEsWD1iYS1sYSxhYT1lYS1aLFQ9VCphYS9YLE4ubGVmdC5wdXNoKHt4Ok8sCnk6Qi5pbnZlcnQoWitUKX0pKSxsYTxIPT09SDw9YmEmJihUPUgtbGEsWD1iYS1sYSxhYT1lYS1aLFQ9VCphYS9YLE4ucmlnaHQucHVzaCh7eDpILHk6Qi5pbnZlcnQoWitUKX0pKSxaPE09PT1NPD1lYSYmKFg9YmEtbGEsVD1NLVosYWE9ZWEtWixUPVQqWC9hYSxOLnRvcC5wdXNoKHt4OkkuaW52ZXJ0KGxhK1QpLHk6TX0pKSxaPEs9PT1LPD1lYSYmKFg9YmEtbGEsVD1LLVosYWE9ZWEtWixUPVQqWC9hYSxOLmJvdHRvbS5wdXNoKHt4OkkuaW52ZXJ0KGxhK1QpLHk6S30pKX0pO3JldHVybiBOfTtGLnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249ZnVuY3Rpb24oKXt2YXIgRD10aGlzLnkoKS5zY2FsZS5kb21haW4oKSxCPU1hdGgubWF4KERbMF0sRFsxXSk7RD1NYXRoLm1pbihEWzBdLERbMV0pO0I9MD5CJiZCfHwwPEQmJkR8fDA7dmFyIEk9dGhpcy55KCkuc2NhbGUuc2NhbGUoQik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEl9fTtGLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9CmZ1bmN0aW9uKCl7dmFyIEQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtCLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3Rvcih5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpKTtELnB1c2goe2F0dHJUb1Byb2plY3RvcjpCLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKEEuQW5pbWF0b3IuUkVTRVQpfSl9RC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoQS5BbmltYXRvci5NQUlOKX0pO3JldHVybiBEfTtGLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgRD1DLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKTtPYmplY3Qua2V5cyhEKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe2lmKCJkIiE9PQpCKXt2YXIgST1EW0JdO0RbQl09ZnVuY3Rpb24oTixPLEgpe3JldHVybiAwPE4ubGVuZ3RoP0koTlswXSxPLEgpOm51bGx9fX0pO3JldHVybiBEfTtGLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEQpe0Q9dGhpcy5lbnRpdHlOZWFyZXN0QnlYVGhlblkoRCk7cmV0dXJuIG51bGwhPUQ/W0RdOltdfTtGLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0QnlYVGhlblk9ZnVuY3Rpb24oRCl7dmFyIEI9SW5maW5pdHksST1JbmZpbml0eSxOLE89dGhpcy5ib3VuZHMoKTt0aGlzLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihIKXtpZih4Lk1hdGgud2l0aGluKEgucG9zaXRpb24sTykpe3ZhciBLPU1hdGguYWJzKEQueC1ILnBvc2l0aW9uLngpLE09TWF0aC5hYnMoRC55LUgucG9zaXRpb24ueSk7aWYoSzxCfHxLPT09QiYmTTxJKU49SCxCPUssST1NfX0pO3JldHVybiBOfTtGLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEQ9Qy5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpOwpELmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3Rvcih5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIER9O0YucHJvdG90eXBlLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yPWZ1bmN0aW9uKEQsQil7dmFyIEk9dGhpcztyZXR1cm4gZnVuY3Rpb24oTixPLEgpe3JldHVybiBJLl9kM0xpbmVGYWN0b3J5KEgsRCxCKShOKX19O0YucHJvdG90eXBlLl9kM0xpbmVGYWN0b3J5PWZ1bmN0aW9uKEQsQixJKXtmdW5jdGlvbiBOKE8sSCxLKXt2YXIgTT1CKE8sSCxLKTtPPUkoTyxILEspO3JldHVybiB4Lk1hdGguaXNWYWxpZE51bWJlcihNKSYmeC5NYXRoLmlzVmFsaWROdW1iZXIoTyl9dm9pZCAwPT09QiYmKEI9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkpO3ZvaWQgMD09PUkmJihJPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gdC5saW5lKCkueChmdW5jdGlvbihPLEgpe3JldHVybiBCKE8sCkgsRCl9KS55KGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEkoTyxILEQpfSkuY3VydmUodGhpcy5fZ2V0Q3VydmVGYWN0b3J5KCkpLmRlZmluZWQoZnVuY3Rpb24oTyxIKXtyZXR1cm4gTihPLEgsRCl9KX07Ri5wcm90b3R5cGUuX2dldEN1cnZlRmFjdG9yeT1mdW5jdGlvbigpe3ZhciBEPXRoaXMuY3VydmUoKTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBEPyhEPXdbRF0sbnVsbD09RD93LmxpbmVhcjpEKTpEfTtGLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj1uZXcgeC5NYXA7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSSl7dmFyIE49SS5kYXRhKCk7aWYoRC5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWR8fEQuX2Rvd25zYW1wbGluZ0VuYWJsZWQpe3ZhciBPPU4ubWFwKGZ1bmN0aW9uKEgsSyl7cmV0dXJuIEt9KTtELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCYmKE89RC5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZyhJLE8pKTtELl9kb3duc2FtcGxpbmdFbmFibGVkJiYKKE89RC5fZmlsdGVyRG93bnNhbXBsaW5nKEksTykpO0QuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZCYmKE89RC5fZmlsdGVyRGVuc2VMaW5lcyhJLE8pKTtCLnNldChJLFtPLm1hcChmdW5jdGlvbihIKXtyZXR1cm4gTltIXX0pXSl9ZWxzZSBCLnNldChJLFtOXSl9KTtyZXR1cm4gQn07Ri5wcm90b3R5cGUuX2ZpbHRlckNyb3BwZWRSZW5kZXJpbmc9ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBJKGFhLGxhKXtyZXR1cm4geC5NYXRoLmluUmFuZ2UoYWEsMCxOLndpZHRoKCkpJiZ4Lk1hdGguaW5SYW5nZShsYSwwLE4uaGVpZ2h0KCkpfWZvcih2YXIgTj10aGlzLE89eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksSD15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxLPUQuZGF0YSgpLE09W10sTD0wO0w8Qi5sZW5ndGg7TCsrKXt2YXIgUT1PKEtbQltMXV0sQltMXSxEKSxUPUgoS1tCW0xdXSxCW0xdLEQpO1E9SShRLFQpO2lmKCFRJiZudWxsIT1CW0wtCjFdJiZudWxsIT1LW0JbTC0xXV0pe1Q9TyhLW0JbTC0xXV0sQltMLTFdLEQpO3ZhciBYPUgoS1tCW0wtMV1dLEJbTC0xXSxEKTtRPVF8fEkoVCxYKX1RfHxudWxsPT1CW0wrMV18fG51bGw9PUtbQltMKzFdXXx8KFQ9TyhLW0JbTCsxXV0sQltMKzFdLEQpLFg9SChLW0JbTCsxXV0sQltMKzFdLEQpLFE9UXx8SShULFgpKTtRJiZNLnB1c2goQltMXSl9cmV0dXJuIE19O0YucHJvdG90eXBlLl9maWx0ZXJEb3duc2FtcGxpbmc9ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBJKGVhLGNhKXt2YXIga2E9TyhOW0JbZWFdXSxCW2VhXSxEKSxZPUgoTltCW2VhXV0sQltlYV0sRCksRWE9TyhOW0JbZWErMV1dLEJbZWErMV0sRCk7ZWE9SChOW0JbZWErMV1dLEJbZWErMV0sRCk7cmV0dXJuIEluZmluaXR5PT09Y2E/TWF0aC5mbG9vcihrYSk9PT1NYXRoLmZsb29yKEVhKTpNYXRoLmZsb29yKGVhKT09PU1hdGguZmxvb3IoWSsoRWEta2EpKmNhKX1pZigwPT09Qi5sZW5ndGgpcmV0dXJuW107Zm9yKHZhciBOPQpELmRhdGEoKSxPPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEg9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksSz1bQlswXV0sTT0wO008Qi5sZW5ndGgtMTspe3ZhciBMPUJbTV0sUT1PKE5bQltNXV0sQltNXSxEKSxUPUgoTltCW01dXSxCW01dLEQpLFg9TyhOW0JbTSsxXV0sQltNKzFdLEQpLGFhPUgoTltCW00rMV1dLEJbTSsxXSxEKTthYT1NYXRoLmZsb29yKFEpPT09TWF0aC5mbG9vcihYKT9JbmZpbml0eTooYWEtVCkvKFgtUSk7WD1CW01dO1Q9SW5maW5pdHk9PT1hYT9UOlE7UT1YO2Zvcih2YXIgbGE9VCxaPSEwO008Qi5sZW5ndGgtMSYmKFp8fEkoTSxhYSkpOyl7TSsrO1o9ITE7dmFyIGJhPUluZmluaXR5PT09YWE/SChOW0JbTV1dLEJbTV0sRCk6TyhOW0JbTV1dLEJbTV0sRCk7YmE+bGEmJihsYT1iYSxRPUJbTV0pO2JhPFQmJihUPWJhLFg9QltNXSl9YWE9QltNXTtYIT09TCYmSy5wdXNoKFgpO1EhPT1YJiZRIT09TCYmSy5wdXNoKFEpO2FhIT09CkwmJmFhIT09WCYmYWEhPT1RJiZLLnB1c2goYWEpfXJldHVybiBLfTtGLnByb3RvdHlwZS5fZmlsdGVyRGVuc2VMaW5lcz1mdW5jdGlvbihELEIpe2lmKDA9PT1CLmxlbmd0aClyZXR1cm5bXTt2YXIgST1ELmRhdGEoKSxOPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLE89eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7cmV0dXJuIHRoaXMuX2J1Y2tldEJ5WChELEIsZnVuY3Rpb24oSCl7cmV0dXJuIE4oSVtIXSxILEQpfSxmdW5jdGlvbihIKXtyZXR1cm4gTyhJW0hdLEgsRCl9KX07Ri5wcm90b3R5cGUuX2J1Y2tldEJ5WD1mdW5jdGlvbihELEIsSSxOKXt2YXIgTz1bXTtEPUQuZGF0YSgpO2Zvcih2YXIgSD1udWxsLEs9MDtLPD1CLmxlbmd0aDsrK0spe3ZhciBNPUJbS107aWYobnVsbCE9RFtNXSl7dmFyIEw9TWF0aC5mbG9vcihJKE0pKSxRPU4oTSk7bnVsbD09SD9IPW5ldyB4LkJ1Y2tldChNLEwsUSk6SC5pc0luQnVja2V0KEwpP0guYWRkVG9CdWNrZXQoUSwKTSk6KE8ucHVzaC5hcHBseShPLEguZ2V0VW5pcXVlSW5kaWNlcygpKSxIPW5ldyB4LkJ1Y2tldChNLEwsUSkpfX1udWxsIT1IJiZPLnB1c2guYXBwbHkoTyxILmdldFVuaXF1ZUluZGljZXMoKSk7cmV0dXJuIE99O3JldHVybiBGfShoLlhZUGxvdCk7Zi5MaW5lPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgeCBpbiBxKXEuaGFzT3duUHJvcGVydHkoeCkmJihuW3hdPXFbeF0pO24ucHJvdG90eXBlPW51bGw9PT1xP09iamVjdC5jcmVhdGUocSk6KHUucHJvdG90eXBlPXEucHJvdG90eXBlLG5ldyB1KX0sdD1oKDEpLGw9aCgyNikscD1oKDApLG09WzAsMV07ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKCl7dmFyIHU9bi5jYWxsKHRoaXMpfHx0aGlzO3UuX3JhbmdlPVswLDFdO3UuX2QzU2NhbGU9dC5zY2FsZUJhbmQoKTt1Ll9kM1NjYWxlLnJhbmdlKG0pOwp1Ll9kM1RyYW5zZm9ybWF0aW9uU2NhbGU9dC5zY2FsZUxpbmVhcigpO3UuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4obSk7dS5faW5uZXJQYWRkaW5nPXEuX2NvbnZlcnRUb1Bsb3R0YWJsZUlubmVyUGFkZGluZygpO3UuX291dGVyUGFkZGluZz1xLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmcoKTtyZXR1cm4gdX1rKHEsbik7cS5wcm90b3R5cGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzPWZ1bmN0aW9uKCl7dmFyIHU9KG5ldyBxKS5kb21haW4odGhpcy5kb21haW4oKSkucmFuZ2UodGhpcy5yYW5nZSgpKS5pbm5lclBhZGRpbmcodGhpcy5pbm5lclBhZGRpbmcoKSkub3V0ZXJQYWRkaW5nKHRoaXMub3V0ZXJQYWRkaW5nKCkpO3UuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbigpKTtyZXR1cm4gdX07cS5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24odSl7cmV0dXJuIHAuQXJyYXkudW5pcSh1KX07CnEucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gcC5BcnJheS51bmlxKHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkpfTtxLnByb3RvdHlwZS5kb21haW49ZnVuY3Rpb24odSl7cmV0dXJuIG4ucHJvdG90eXBlLmRvbWFpbi5jYWxsKHRoaXMsdSl9O3EucHJvdG90eXBlLmludmVydFJhbmdlPWZ1bmN0aW9uKCl7dmFyIHUseD10aGlzO3ZvaWQgMD09PXUmJih1PXRoaXMucmFuZ2UoKSk7dmFyIEE9dGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSx5PXRoaXMuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbih1WzBdKSx3PXRoaXMuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbih1WzFdKTt1PXRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dmFyIEM9dS5tYXAoZnVuY3Rpb24oRil7cmV0dXJuIHguX2QzU2NhbGUoRikrQS8yfSk7eT10LmJpc2VjdChDLHkpO3c9dC5iaXNlY3QoQyx3KTtyZXR1cm4gdS5zbGljZSh5LHcpfTtxLnByb3RvdHlwZS5yYW5nZT1mdW5jdGlvbih1KXtyZXR1cm4gbi5wcm90b3R5cGUucmFuZ2UuY2FsbCh0aGlzLAp1KX07cS5fY29udmVydFRvUGxvdHRhYmxlSW5uZXJQYWRkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIDEvLjctMX07cS5fY29udmVydFRvUGxvdHRhYmxlT3V0ZXJQYWRkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuLjUvLjd9O3EucHJvdG90eXBlLl9zZXRCYW5kcz1mdW5jdGlvbigpe3ZhciB1PTEtMS8oMSt0aGlzLmlubmVyUGFkZGluZygpKSx4PXRoaXMub3V0ZXJQYWRkaW5nKCkvKDErdGhpcy5pbm5lclBhZGRpbmcoKSk7dGhpcy5fZDNTY2FsZS5wYWRkaW5nSW5uZXIodSk7dGhpcy5fZDNTY2FsZS5wYWRkaW5nT3V0ZXIoeCl9O3EucHJvdG90eXBlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXNjYWxlQmFuZCh0aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpKX07cS5wcm90b3R5cGUuc3RlcFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkqKDErdGhpcy5pbm5lclBhZGRpbmcoKSkpfTtxLnByb3RvdHlwZS50aWNrcz0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07cS5wcm90b3R5cGUuaW5uZXJQYWRkaW5nPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2lubmVyUGFkZGluZzt0aGlzLl9pbm5lclBhZGRpbmc9dTt0aGlzLnJhbmdlKHRoaXMucmFuZ2UoKSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUub3V0ZXJQYWRkaW5nPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX291dGVyUGFkZGluZzt0aGlzLl9vdXRlclBhZGRpbmc9dTt0aGlzLnJhbmdlKHRoaXMucmFuZ2UoKSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odSl7dT10aGlzLl9kM1NjYWxlKHUpK3RoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkvMjtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHUpfTtxLnByb3RvdHlwZS56b29tPWZ1bmN0aW9uKHUseCl7dmFyIEE9dGhpczsKdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIEEuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQobC56b29tT3V0KHksdSx4KSl9KSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKX07cS5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHUpe3ZhciB4PXRoaXM7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUucmFuZ2UoKS5tYXAoZnVuY3Rpb24oQSl7cmV0dXJuIHguX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQoQSt1KX0pKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHUpe3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodSl9O3EucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odSl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQodSl9OwpxLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3JldHVybiBtfTtxLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKCl9O3EucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHUpe3RoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKX07cS5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07cS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKHUpO3RoaXMuX3NldEJhbmRzKCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYW5nZX07CnEucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbih1KXt0aGlzLl9yYW5nZT11O3RoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSh1KTt0aGlzLl9zZXRCYW5kcygpfTtxLnByb3RvdHlwZS5fcmVzY2FsZUJhbmQ9ZnVuY3Rpb24odSl7cmV0dXJuIE1hdGguYWJzKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSh1KS10aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUoMCkpfTtyZXR1cm4gcX0oaCgxNykuU2NhbGUpO2YuQ2F0ZWdvcnk9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodyl7dHJ5e3ZhciBDPXcubm9kZSgpLmdldEJCb3goKX1jYXRjaChGKXtDPXt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9fXJldHVybiBDfWZ1bmN0aW9uIHQodyl7aWYoIm51bWJlciI9PT10eXBlb2YgdylyZXR1cm57bWluOncsbWF4Ond9O2lmKHcgaW5zdGFuY2VvZiBPYmplY3QmJiJtaW4iaW4gdyYmIm1heCJpbiB3KXJldHVybiB3O3Rocm93IEVycm9yKCJpbnB1dCAnIit3KyInIGNhbid0IGJlIHBhcnNlZCBhcyBhbiBSYW5nZSIpOwp9ZnVuY3Rpb24gbCh3LEMpe3c9dy5nZXRQcm9wZXJ0eVZhbHVlKEMpO3JldHVybiBwYXJzZUZsb2F0KHcpfHwwfWZ1bmN0aW9uIHAodyl7aWYobnVsbD09d3x8Im5vbmUiPT09dylyZXR1cm4gbnVsbDt3PXcubWF0Y2goQSk7aWYobnVsbD09d3x8Mj53Lmxlbmd0aClyZXR1cm4gbnVsbDt3PXdbMV0uc3BsaXQoeSkubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBwYXJzZUZsb2F0KEMpfSk7cmV0dXJuIDYhPXcubGVuZ3RoP251bGw6d312YXIgbT1oKDEpLG49TWF0aDtmLmNvbnRhaW5zPWZ1bmN0aW9uKHcsQyl7Zm9yKDtudWxsIT1DJiZDIT09dzspQz1DLnBhcmVudE5vZGU7cmV0dXJuIEM9PT13fTtmLmVsZW1lbnRCQm94PWs7Zi5lbnRpdHlCb3VuZHM9ZnVuY3Rpb24odyl7cmV0dXJuIHcgaW5zdGFuY2VvZiBTVkdFbGVtZW50P2sobS5zZWxlY3QodykpOncgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD8odz13LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHt4OncubGVmdCx5OncudG9wLHdpZHRoOncud2lkdGgsCmhlaWdodDp3LmhlaWdodH0pOnt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9fTtmLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTPTFFMy82MDtmLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsPWZ1bmN0aW9uKHcpe251bGwhPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh3KTpzZXRUaW1lb3V0KHcsZi5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EUyl9O2YuZWxlbWVudFdpZHRoPWZ1bmN0aW9uKHcpe3c9dyBpbnN0YW5jZW9mIG0uc2VsZWN0aW9uP3cubm9kZSgpOnc7dz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh3KTtyZXR1cm4gbCh3LCJ3aWR0aCIpK2wodywicGFkZGluZy1sZWZ0IikrbCh3LCJwYWRkaW5nLXJpZ2h0IikrbCh3LCJib3JkZXItbGVmdC13aWR0aCIpK2wodywiYm9yZGVyLXJpZ2h0LXdpZHRoIil9O2YuZWxlbWVudEhlaWdodD1mdW5jdGlvbih3KXt3PXcgaW5zdGFuY2VvZiBtLnNlbGVjdGlvbj8Kdy5ub2RlKCk6dzt3PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHcpO3JldHVybiBsKHcsImhlaWdodCIpK2wodywicGFkZGluZy10b3AiKStsKHcsInBhZGRpbmctYm90dG9tIikrbCh3LCJib3JkZXItdG9wLXdpZHRoIikrbCh3LCJib3JkZXItYm90dG9tLXdpZHRoIil9O3ZhciBxPS90cmFuc2xhdGVccypcKFxzKigoPzpbLStdP1swLTldKlwuP1swLTldKykpKD86KD86KD86XHMrLD9ccyopfCg/OixccyopKSgoPzpbLStdP1swLTldKlwuP1swLTldKykpKT9ccypcKS8sdT0vcm90YXRlXHMqXChccyooKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKVxzKlwpLyx4PS9zY2FsZVxzKlwoXHMqKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkoPzooPzooPzpccyssP1xzKil8KD86LFxzKikpKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkpP1xzKlwpLztmLmdldFRyYW5zbGF0ZVZhbHVlcz1mdW5jdGlvbih3KXt3PXEuZXhlYyh3LmF0dHIoInRyYW5zZm9ybSIpKTtpZihudWxsIT13KXt2YXIgQz0Kd1syXTtyZXR1cm5bK3dbMV0sKyh2b2lkIDA9PT1DPzA6QyldfXJldHVyblswLDBdfTtmLmdldFJvdGF0ZT1mdW5jdGlvbih3KXt3PXUuZXhlYyh3LmF0dHIoInRyYW5zZm9ybSIpKTtyZXR1cm4gbnVsbCE9dz8rd1sxXTowfTtmLmdldFNjYWxlVmFsdWVzPWZ1bmN0aW9uKHcpe3ZhciBDPXguZXhlYyh3LmF0dHIoInRyYW5zZm9ybSIpKTtyZXR1cm4gbnVsbCE9Qz8odz1DWzFdLEM9Q1syXSxbK3csbnVsbD09Qz8rdzorQ10pOlswLDBdfTtmLmNsaWVudFJlY3RzT3ZlcmxhcD1mdW5jdGlvbih3LEMpe3JldHVybiBuLmZsb29yKHcucmlnaHQpPD1uLmNlaWwoQy5sZWZ0KXx8bi5jZWlsKHcubGVmdCk+PW4uZmxvb3IoQy5yaWdodCl8fG4uZmxvb3Iody5ib3R0b20pPD1uLmNlaWwoQy50b3ApfHxuLmNlaWwody50b3ApPj1uLmZsb29yKEMuYm90dG9tKT8hMTohMH07Zi5leHBhbmRSZWN0PWZ1bmN0aW9uKHcsQyl7cmV0dXJue2xlZnQ6dy5sZWZ0LUMsdG9wOncudG9wLUMscmlnaHQ6dy5yaWdodCsKQyxib3R0b206dy5ib3R0b20rQyx3aWR0aDp3LndpZHRoKzIqQyxoZWlnaHQ6dy5oZWlnaHQrMipDfX07Zi5jbGllbnRSZWN0SW5zaWRlPWZ1bmN0aW9uKHcsQyl7cmV0dXJuIG4uZmxvb3IoQy5sZWZ0KTw9bi5jZWlsKHcubGVmdCkmJm4uZmxvb3IoQy50b3ApPD1uLmNlaWwody50b3ApJiZuLmZsb29yKHcucmlnaHQpPD1uLmNlaWwoQy5yaWdodCkmJm4uZmxvb3Iody5ib3R0b20pPD1uLmNlaWwoQy5ib3R0b20pfTtmLmludGVyc2VjdHNCQm94PWZ1bmN0aW9uKHcsQyxGLEQpe3ZvaWQgMD09PUQmJihEPS41KTt3PXQodyk7Qz10KEMpO3JldHVybiBGLngrRi53aWR0aD49dy5taW4tRCYmRi54PD13Lm1heCtEJiZGLnkrRi5oZWlnaHQ+PUMubWluLUQmJkYueTw9Qy5tYXgrRH07Zi5nZXRIdG1sRWxlbWVudEFuY2VzdG9ycz1mdW5jdGlvbih3KXtmb3IodmFyIEM9W107dyYmdyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50OylDLnB1c2godyksdz13LnBhcmVudEVsZW1lbnQ7cmV0dXJuIEN9OwpmLmdldEVsZW1lbnRUcmFuc2Zvcm09ZnVuY3Rpb24odyl7dz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh3LG51bGwpO3c9dy5nZXRQcm9wZXJ0eVZhbHVlKCItd2Via2l0LXRyYW5zZm9ybSIpfHx3LmdldFByb3BlcnR5VmFsdWUoIi1tb3otdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgiLW1zLXRyYW5zZm9ybSIpfHx3LmdldFByb3BlcnR5VmFsdWUoIi1vLXRyYW5zZm9ybSIpfHx3LmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpO3JldHVybiBwKHcpfTt2YXIgQT0vXm1hdHJpeFwoKFteKV0rKVwpJC8seT0vWywgXSsvfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh1LHgpe3JldHVyblt1WzBdKnhbMF0rdVsyXSp4WzFdLHVbMV0qeFswXSt1WzNdKnhbMV0sdVswXSp4WzJdK3VbMl0qeFszXSx1WzFdKnhbMl0rdVszXSp4WzNdLHVbMF0qeFs0XSt1WzJdKnhbNV0rdVs0XSx1WzFdKnhbNF0rdVszXSp4WzVdK3VbNV1dfWZ1bmN0aW9uIHQodSx4KXtyZXR1cm5bdVswXSwKdVsxXSx1WzJdLHVbM10sdVswXSp4WzBdK3VbMl0qeFsxXSt1WzRdLHVbMV0qeFswXSt1WzNdKnhbMV0rdVs1XV19ZnVuY3Rpb24gbCh1KXt2YXIgeD11WzBdKnVbM10tdVsxXSp1WzJdO2lmKDA9PT14KXRocm93IEVycm9yKCJzaW5ndWxhciBtYXRyaXgiKTt4PTEveDtyZXR1cm5beCp1WzNdLHgqLXVbMV0seCotdVsyXSx4KnVbMF0seCooLXVbM10qdVs0XSt1WzJdKnVbNV0pLHgqKHVbMV0qdVs0XSstdVswXSp1WzVdKV19dmFyIHA9aCgxKSxtPWgoNTUpLG49TWF0aCxxPVsxLDAsMCwxLDAsMF07Zi5pblJhbmdlPWZ1bmN0aW9uKHUseCxBKXtyZXR1cm4gbi5taW4oeCxBKTw9dSYmdTw9bi5tYXgoeCxBKX07Zi5jbGFtcD1mdW5jdGlvbih1LHgsQSl7cmV0dXJuIG4ubWluKG4ubWF4KHgsdSksQSl9O2YubWF4PWZ1bmN0aW9uKHUseCxBKXt2YXIgeT0iZnVuY3Rpb24iPT09dHlwZW9mIHg/eDpudWxsO3g9bnVsbD09eT94OkE7dT1udWxsPT15P3AubWF4KHUpOnAubWF4KHUseSk7cmV0dXJuIHZvaWQgMCE9PQp1P3U6eH07Zi5taW49ZnVuY3Rpb24odSx4LEEpe3ZhciB5PSJmdW5jdGlvbiI9PT10eXBlb2YgeD94Om51bGw7eD1udWxsPT15P3g6QTt1PW51bGw9PXk/cC5taW4odSk6cC5taW4odSx5KTtyZXR1cm4gdm9pZCAwIT09dT91Onh9O2YuaXNOYU49ZnVuY3Rpb24odSl7cmV0dXJuIHUhPT11fTtmLmlzVmFsaWROdW1iZXI9ZnVuY3Rpb24odSl7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgdSYmMT51LXV9O2YucmFuZ2U9ZnVuY3Rpb24odSx4LEEpe3ZvaWQgMD09PUEmJihBPTEpO2lmKDA9PT1BKXRocm93IEVycm9yKCJzdGVwIGNhbm5vdCBiZSAwIik7eD1uLm1heChuLmNlaWwoKHgtdSkvQSksMCk7Zm9yKHZhciB5PVtdLHc9MDt3PHg7Kyt3KXlbd109dStBKnc7cmV0dXJuIHl9O2YuZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uKHUseCl7cmV0dXJuIG4ucG93KHgueS11LnksMikrbi5wb3coeC54LXUueCwyKX07Zi5kZWdyZWVzVG9SYWRpYW5zPWZ1bmN0aW9uKHUpe3JldHVybiB1LzM2MCoKbi5QSSoyfTtmLndpdGhpbj1mdW5jdGlvbih1LHgpe3JldHVybiB4LnRvcExlZnQueDw9dS54JiZ4LmJvdHRvbVJpZ2h0Lng+PXUueCYmeC50b3BMZWZ0Lnk8PXUueSYmeC5ib3R0b21SaWdodC55Pj11Lnl9O2YuYm91bmRzSW50ZXJzZWN0cz1mdW5jdGlvbih1LHgsQSx5LHcsQyl7cmV0dXJuIHU8PTArdyYmMDw9dStBJiZ4PD0wK0MmJjA8PXgreX07Zi5nZXRDdW11bGF0aXZlVHJhbnNmb3JtPWZ1bmN0aW9uKHUpe3U9bS5nZXRIdG1sRWxlbWVudEFuY2VzdG9ycyh1KTtmb3IodmFyIHg9cSxBPW51bGwseT0wO3k8dS5sZW5ndGg7eSsrKXt2YXIgdz11W3ldLEM9bS5nZXRFbGVtZW50VHJhbnNmb3JtKHcpO2lmKG51bGwhPUMpe3ZhciBGPXcuY2xpZW50V2lkdGgvMixEPXcuY2xpZW50SGVpZ2h0LzI7eD10KHgsW0YsRF0pO3g9ayh4LGwoQykpO3g9dCh4LFstRiwtRF0pfUM9dy5zY3JvbGxMZWZ0O0Y9dy5zY3JvbGxUb3A7aWYobnVsbD09PUF8fHc9PT1BKUMtPXcub2Zmc2V0TGVmdCt3LmNsaWVudExlZnQsCkYtPXcub2Zmc2V0VG9wK3cuY2xpZW50VG9wLEE9dy5vZmZzZXRQYXJlbnQ7eD10KHgsW0MsRl0pfXJldHVybiB4fTtmLm11bHRpcGx5TWF0cml4PWs7Zi5wcmVtdWx0aXBseVRyYW5zbGF0ZT1mdW5jdGlvbih1LHgpe3JldHVyblt4WzBdLHhbMV0seFsyXSx4WzNdLHhbNF0rdVswXSx4WzVdK3VbMV1dfTtmLm11bHRpcGx5VHJhbnNsYXRlPXQ7Zi5pbnZlcnRNYXRyaXg9bDtmLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKHUseCl7cmV0dXJue3g6dVswXSp4LngrdVsyXSp4LnkrdVs0XSx5OnVbMV0qeC54K3VbM10qeC55K3VbNV19fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPW5ldyAoaCgxMTQpLlNwbGl0U3RyYXRlZ3lMaW5lYXIpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBwKG0sbil7dm9pZCAwPT09bSYmKG09NSk7dm9pZCAwPT09biYmKG49ayk7dGhpcy5tYXhOb2RlQ2hpbGRyZW49bTt0aGlzLnNwbGl0U3RyYXRlZ3k9bjt0aGlzLnJvb3Q9bmV3IHQoITApO3RoaXMuc2l6ZT0wfXAucHJvdG90eXBlLmdldFJvb3Q9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm9vdH07cC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnJvb3Q9bmV3IHQoITApO3RoaXMuc2l6ZT0wfTtwLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24obSxuKXtmb3IodmFyIHE9dGhpcy5yb290OyFxLmxlYWY7KXE9cS5zdWJ0cmVlKG0pO209dC52YWx1ZU5vZGUobSxuKTtxLmluc2VydChtKTtmb3IodGhpcy5zaXplKz0xO3Eub3ZlcmZsb3codGhpcy5tYXhOb2RlQ2hpbGRyZW4pOylxPXEuc3BsaXQodGhpcy5zcGxpdFN0cmF0ZWd5KSxudWxsPT1xLnBhcmVudCYmKHRoaXMucm9vdD1xKX07cC5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBuLmNvbnRhaW5zKG0pfSl9O3AucHJvdG90eXBlLmludGVyc2VjdD1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbihuKXtyZXR1cm4gbC5pc0JvdW5kc092ZXJsYXBCb3VuZHMobixtKX0pfTtwLnByb3RvdHlwZS5pbnRlcnNlY3RYPQpmdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbihuKXtyZXR1cm4gbC5pc0JvdW5kc092ZXJsYXBYKG4sbSl9KX07cC5wcm90b3R5cGUuaW50ZXJzZWN0WT1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbihuKXtyZXR1cm4gbC5pc0JvdW5kc092ZXJsYXBZKG4sbSl9KX07cC5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24obSl7dmFyIG49W107aWYobnVsbCE9dGhpcy5yb290LmJvdW5kcyYmIW0odGhpcy5yb290LmJvdW5kcykpcmV0dXJuIG47Zm9yKHZhciBxPVt0aGlzLnJvb3RdOzA8cS5sZW5ndGg7KWZvcih2YXIgdT1xLnNoaWZ0KCkseD0wO3g8dS5lbnRyaWVzLmxlbmd0aDt4Kyspe3ZhciBBPXUuZW50cmllc1t4XTttKEEuYm91bmRzKSYmKHUubGVhZj9uLnB1c2goQS52YWx1ZSk6cS5wdXNoKEEpKX1yZXR1cm4gbn07cmV0dXJuIHB9KCk7Zi5SVHJlZT1kO3ZhciB0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChtKXt0aGlzLmxlYWY9bTt0aGlzLmJvdW5kcz0KbnVsbDt0aGlzLmVudHJpZXM9W107dGhpcy52YWx1ZT10aGlzLnBhcmVudD1udWxsfXAudmFsdWVOb2RlPWZ1bmN0aW9uKG0sbil7dmFyIHE9bmV3IHAoITApO3EuYm91bmRzPW07cS52YWx1ZT1uO3JldHVybiBxfTtwLnByb3RvdHlwZS5vdmVyZmxvdz1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5lbnRyaWVzLmxlbmd0aD5tfTtwLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24obSl7dGhpcy5lbnRyaWVzLnB1c2gobSk7bS5wYXJlbnQ9dGhpcztmb3IodmFyIG49dGhpcztudWxsIT1uOyluLmJvdW5kcz1sLnVuaW9uQWxsKFtuLmJvdW5kcyxtLmJvdW5kc10pLG49bi5wYXJlbnR9O3AucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihtKXttPXRoaXMuZW50cmllcy5pbmRleE9mKG0pO2lmKDA8PW0pZm9yKHRoaXMuZW50cmllcy5zcGxpY2UobSwxKSxtPXRoaXM7bnVsbCE9bTspbS5ib3VuZHM9bC51bmlvbkFsbChtLmVudHJpZXMubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLmJvdW5kc30pKSwKbT1tLnBhcmVudDtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuc3VidHJlZT1mdW5jdGlvbihtKXtmb3IodmFyIG49bnVsbCxxPTA7cTx0aGlzLmVudHJpZXMubGVuZ3RoO3ErKyl7dmFyIHU9dGhpcy5lbnRyaWVzW3FdLHg9dS51bmlvbkFyZWFEaWZmZXJlbmNlKG0pO2lmKEluZmluaXR5Pnh8fEluZmluaXR5PT09eCYmbnVsbCE9biYmdS5lbnRyaWVzLmxlbmd0aDxuLmVudHJpZXMubGVuZ3RoKW49dX1yZXR1cm4gbn07cC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24obSl7bnVsbCE9dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJlbW92ZSh0aGlzKTt2YXIgbj1bbmV3IHAodGhpcy5sZWFmKSxuZXcgcCh0aGlzLmxlYWYpXTttLnNwbGl0KHRoaXMuZW50cmllcyxuKTttPW51bGwhPXRoaXMucGFyZW50P3RoaXMucGFyZW50Om5ldyBwKCExKTttLmluc2VydChuWzBdKTttLmluc2VydChuWzFdKTtyZXR1cm4gbX07cC5wcm90b3R5cGUudW5pb25BcmVhRGlmZmVyZW5jZT1mdW5jdGlvbihtKXtyZXR1cm4gTWF0aC5hYnMobC51bmlvbih0aGlzLmJvdW5kcywKbSkuYXJlYSgpLXRoaXMuYm91bmRzLmFyZWEoKSl9O3AucHJvdG90eXBlLm1heERlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVhZj8xOjErdGhpcy5lbnRyaWVzLm1hcChmdW5jdGlvbihtKXtyZXR1cm4gbS5tYXhEZXB0aCgpfSkucmVkdWNlKGZ1bmN0aW9uKG0sbil7cmV0dXJuIE1hdGgubWF4KG0sbil9KX07cmV0dXJuIHB9KCk7Zi5SVHJlZU5vZGU9dDt2YXIgbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHAobSxuLHEsdSl7dGhpcy54bD1tO3RoaXMueWw9bjt0aGlzLnhoPXE7dGhpcy55aD11O3RoaXMud2lkdGg9dGhpcy54aC10aGlzLnhsO3RoaXMuaGVpZ2h0PXRoaXMueWgtdGhpcy55bH1wLnh5d2g9ZnVuY3Rpb24obSxuLHEsdSl7cmV0dXJuIG5ldyBwKG0sbixtK3Esbit1KX07cC5lbnRpdHlCb3VuZHM9ZnVuY3Rpb24obSl7cmV0dXJuIG5ldyBwKG0ueCxtLnksbS54K20ud2lkdGgsbS55K20uaGVpZ2h0KX07cC5ib3VuZHM9ZnVuY3Rpb24obSl7cmV0dXJuIHAucG9pbnRQYWlyKG0udG9wTGVmdCwKbS5ib3R0b21SaWdodCl9O3AucG9pbnRQYWlyPWZ1bmN0aW9uKG0sbil7cmV0dXJuIG5ldyBwKE1hdGgubWluKG0ueCxuLngpLE1hdGgubWluKG0ueSxuLnkpLE1hdGgubWF4KG0ueCxuLngpLE1hdGgubWF4KG0ueSxuLnkpKX07cC5wb2ludHM9ZnVuY3Rpb24obSl7aWYoMj5tLmxlbmd0aCl0aHJvdyBFcnJvcigibmVlZCBhdCBsZWFzdCAyIHBvaW50cyB0byBjcmVhdGUgYm91bmRzIik7dmFyIG49bS5tYXAoZnVuY3Rpb24ocSl7cmV0dXJuIHEueH0pO209bS5tYXAoZnVuY3Rpb24ocSl7cmV0dXJuIHEueX0pO3JldHVybiBuZXcgcChuLnJlZHVjZShmdW5jdGlvbihxLHUpe3JldHVybiBNYXRoLm1pbihxLHUpfSksbS5yZWR1Y2UoZnVuY3Rpb24ocSx1KXtyZXR1cm4gTWF0aC5taW4ocSx1KX0pLG4ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdSl9KSxtLnJlZHVjZShmdW5jdGlvbihxLHUpe3JldHVybiBNYXRoLm1heChxLHUpfSkpfTtwLnVuaW9uPWZ1bmN0aW9uKG0sCm4pe3JldHVybiBuZXcgcChNYXRoLm1pbihtLnhsLG4ueGwpLE1hdGgubWluKG0ueWwsbi55bCksTWF0aC5tYXgobS54aCxuLnhoKSxNYXRoLm1heChtLnloLG4ueWgpKX07cC51bmlvbkFsbD1mdW5jdGlvbihtKXttPW0uZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBudWxsIT1ufSk7cmV0dXJuIDA9PT1tLmxlbmd0aD9udWxsOm0ucmVkdWNlKGZ1bmN0aW9uKG4scSl7cmV0dXJuIHAudW5pb24obixxKX0pfTtwLmlzQm91bmRzT3ZlcmxhcEJvdW5kcz1mdW5jdGlvbihtLG4pe3JldHVybiBwLmlzQm91bmRzT3ZlcmxhcFgobSxuKSYmcC5pc0JvdW5kc092ZXJsYXBZKG0sbil9O3AuaXNCb3VuZHNPdmVybGFwWD1mdW5jdGlvbihtLG4pe3JldHVybiEobS54aDxuLnhsKSYmIShtLnhsPm4ueGgpfTtwLmlzQm91bmRzT3ZlcmxhcFk9ZnVuY3Rpb24obSxuKXtyZXR1cm4hKG0ueWg8bi55bCkmJiEobS55bD5uLnloKX07cC5wcm90b3R5cGUuYXJlYT1mdW5jdGlvbigpe251bGw9PXRoaXMuYXJlYUNhY2hlZCYmCih0aGlzLmFyZWFDYWNoZWQ9KHRoaXMueGgtdGhpcy54bCkqKHRoaXMueWgtdGhpcy55bCkpO3JldHVybiB0aGlzLmFyZWFDYWNoZWR9O3AucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnhsPD1tLngmJnRoaXMueGg+PW0ueCYmdGhpcy55bDw9bS55JiZ0aGlzLnloPj1tLnl9O3JldHVybiBwfSgpO2YuUlRyZWVCb3VuZHM9bH0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpeyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LlNldD90aGlzLl9lczZTZXQ9bmV3IHdpbmRvdy5TZXQ6dGhpcy5fdmFsdWVzPVtdO3RoaXMuc2l6ZT0wfWgucHJvdG90eXBlLmFkZD1mdW5jdGlvbihrKXtpZihudWxsIT10aGlzLl9lczZTZXQpcmV0dXJuIHRoaXMuX2VzNlNldC5hZGQoayksdGhpcy5zaXplPXRoaXMuX2VzNlNldC5zaXplLHRoaXM7dGhpcy5oYXMoayl8fCh0aGlzLl92YWx1ZXMucHVzaChrKSx0aGlzLnNpemU9dGhpcy5fdmFsdWVzLmxlbmd0aCk7CnJldHVybiB0aGlzfTtoLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24oayl7aWYobnVsbCE9dGhpcy5fZXM2U2V0KXJldHVybiBrPXRoaXMuX2VzNlNldC5kZWxldGUoayksdGhpcy5zaXplPXRoaXMuX2VzNlNldC5zaXplLGs7az10aGlzLl92YWx1ZXMuaW5kZXhPZihrKTtyZXR1cm4tMSE9PWs/KHRoaXMuX3ZhbHVlcy5zcGxpY2UoaywxKSx0aGlzLnNpemU9dGhpcy5fdmFsdWVzLmxlbmd0aCwhMCk6ITF9O2gucHJvdG90eXBlLmhhcz1mdW5jdGlvbihrKXtyZXR1cm4gbnVsbCE9dGhpcy5fZXM2U2V0P3RoaXMuX2VzNlNldC5oYXMoayk6LTEhPT10aGlzLl92YWx1ZXMuaW5kZXhPZihrKX07aC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihrLHQpe3ZhciBsPXRoaXM7bnVsbCE9dGhpcy5fZXM2U2V0P3RoaXMuX2VzNlNldC5mb3JFYWNoKGZ1bmN0aW9uKHAsbSl7cmV0dXJuIGsuY2FsbCh0LHAsbSxsKX0sdCk6dGhpcy5fdmFsdWVzLmZvckVhY2goZnVuY3Rpb24ocCl7ay5jYWxsKHQsCnAscCxsKX0pfTtyZXR1cm4gaH0oKTtmLlNldD1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoMTMxKSk7ayhoKDEzMCkpfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgyMSk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7dmFyIHE9bC5jYWxsKHRoaXMsbSxuKXx8dGhpcztxLmNhY2hlPW5ldyB0LkNhY2hlKGZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQ2hhcmFjdGVyTm90RnJvbUNhY2hlKHUpfSk7cmV0dXJuIHF9ayhwLGwpO3AucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyTm90RnJvbUNhY2hlPQpmdW5jdGlvbihtKXtyZXR1cm4gbC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXIuY2FsbCh0aGlzLG0pfTtwLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlcj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXQobSl9O3AucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5jYWNoZS5jbGVhcigpfTtyZXR1cm4gcH0oaCg2MSkuQ2hhcmFjdGVyTWVhc3VyZXIpO2YuQ2FjaGVDaGFyYWN0ZXJNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8CnRoaXN9ayhsLHQpO2wucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyPWZ1bmN0aW9uKHApe3JldHVybiB0LnByb3RvdHlwZS5fbWVhc3VyZUxpbmUuY2FsbCh0aGlzLHApfTtsLnByb3RvdHlwZS5fbWVhc3VyZUxpbmU9ZnVuY3Rpb24ocCl7dmFyIG09dGhpcztwPXAuc3BsaXQoIiIpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbS5fbWVhc3VyZUNoYXJhY3RlcihuKX0pO3JldHVybntoZWlnaHQ6cC5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gTWF0aC5tYXgobixxLmhlaWdodCl9LDApLHdpZHRoOnAucmVkdWNlKGZ1bmN0aW9uKG4scSl7cmV0dXJuIG4rcS53aWR0aH0sMCl9fTtyZXR1cm4gbH0oaCg2MykuTWVhc3VyZXIpO2YuQ2hhcmFjdGVyTWVhc3VyZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDM2KSk7ayhoKDYwKSk7ayhoKDEzMikpO2soaCg2MSkpO2soaCg2MykpfSwKZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSx0PWgoMzYpO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtLG4pe3ZvaWQgMD09PW4mJihuPSExKTttPWwuY2FsbCh0aGlzLG0pfHx0aGlzO20udXNlR3VhcmRzPW47cmV0dXJuIG19ayhwLGwpO3AucHJvdG90eXBlLl9hZGRHdWFyZHM9ZnVuY3Rpb24obSl7cmV0dXJuIHQuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCttK3QuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVH07cC5wcm90b3R5cGUuX21lYXN1cmVMaW5lPWZ1bmN0aW9uKG0pe3ZhciBuO3ZvaWQgMD09PW4mJihuPSExKTtuPXRoaXMudXNlR3VhcmRzfHwKbnx8L15bXHQgXSQvLnRlc3QobSk7bT1sLnByb3RvdHlwZS5tZWFzdXJlLmNhbGwodGhpcyxuP3RoaXMuX2FkZEd1YXJkcyhtKTptKTttLndpZHRoLT1uPzIqdGhpcy5nZXRHdWFyZFdpZHRoKCk6MDtyZXR1cm4gbX07cC5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihtKXt2YXIgbj10aGlzO3ZvaWQgMD09PW0mJihtPXQuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCk7aWYoIiI9PT1tLnRyaW0oKSlyZXR1cm57d2lkdGg6MCxoZWlnaHQ6MH07bT1tLnRyaW0oKS5zcGxpdCgiXG4iKS5tYXAoZnVuY3Rpb24ocSl7cmV0dXJuIG4uX21lYXN1cmVMaW5lKHEpfSk7cmV0dXJue2hlaWdodDptLnJlZHVjZShmdW5jdGlvbihxLHUpe3JldHVybiBxK3UuaGVpZ2h0fSwwKSx3aWR0aDptLnJlZHVjZShmdW5jdGlvbihxLHUpe3JldHVybiBNYXRoLm1heChxLHUud2lkdGgpfSwwKX19O3AucHJvdG90eXBlLmdldEd1YXJkV2lkdGg9ZnVuY3Rpb24oKXtudWxsPT10aGlzLmd1YXJkV2lkdGgmJgoodGhpcy5ndWFyZFdpZHRoPWwucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzKS53aWR0aCk7cmV0dXJuIHRoaXMuZ3VhcmRXaWR0aH07cmV0dXJuIHB9KHQuQWJzdHJhY3RNZWFzdXJlcik7Zi5NZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoMTM4KSk7ayhoKDY1KSl9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDIxKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMubWF4TGluZXMoSW5maW5pdHkpO3RoaXMudGV4dFRyaW1taW5nKCk7dGhpcy5hbGxvd0JyZWFraW5nV29yZHMoKTt0aGlzLl90b2tlbml6ZXI9bmV3IGsuVG9rZW5pemVyO3RoaXMuX2JyZWFraW5nQ2hhcmFjdGVyPSItIn10LnByb3RvdHlwZS5tYXhMaW5lcz1mdW5jdGlvbihsKXtpZihudWxsPT1sKXJldHVybiB0aGlzLl9tYXhMaW5lczt0aGlzLl9tYXhMaW5lcz1sO3JldHVybiB0aGlzfTsKdC5wcm90b3R5cGUudGV4dFRyaW1taW5nPWZ1bmN0aW9uKCl7dGhpcy5fdGV4dFRyaW1taW5nPSJlbGxpcHNpcyJ9O3QucHJvdG90eXBlLmFsbG93QnJlYWtpbmdXb3Jkcz1mdW5jdGlvbigpe3RoaXMuX2FsbG93QnJlYWtpbmdXb3Jkcz0hMH07dC5wcm90b3R5cGUud3JhcD1mdW5jdGlvbihsLHAsbSxuKXt2YXIgcT10aGlzO3ZvaWQgMD09PW4mJihuPUluZmluaXR5KTt2YXIgdT17bm9Ccm9rZVdvcmRzOjAsbm9MaW5lczowLG9yaWdpbmFsVGV4dDpsLHRydW5jYXRlZFRleHQ6IiIsd3JhcHBlZFRleHQ6IiJ9O209e2F2YWlsYWJsZUxpbmVzOk1hdGgubWluKE1hdGguZmxvb3Iobi9wLm1lYXN1cmUoKS5oZWlnaHQpLHRoaXMuX21heExpbmVzKSxhdmFpbGFibGVXaWR0aDptLGNhbkZpdFRleHQ6ITAsY3VycmVudExpbmU6IiIsd3JhcHBpbmc6dX07dmFyIHg9bC5zcGxpdCgiXG4iKTtyZXR1cm4geC5yZWR1Y2UoZnVuY3Rpb24oQSx5LHcpe3JldHVybiBxLmJyZWFrTGluZVRvRml0V2lkdGgoQSwKeSx3IT09eC5sZW5ndGgtMSxwKX0sbSkud3JhcHBpbmd9O3QucHJvdG90eXBlLmJyZWFrTGluZVRvRml0V2lkdGg9ZnVuY3Rpb24obCxwLG0sbil7dmFyIHE9dGhpcztsLmNhbkZpdFRleHR8fCIiPT09bC53cmFwcGluZy50cnVuY2F0ZWRUZXh0fHwobC53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz0iXG4iKTtsPXRoaXMuX3Rva2VuaXplci50b2tlbml6ZShwKS5yZWR1Y2UoZnVuY3Rpb24odSx4KXtyZXR1cm4gcS53cmFwTmV4dFRva2VuKHgsdSxuKX0sbCk7cD1rLlN0cmluZ01ldGhvZHMudHJpbUVuZChsLmN1cnJlbnRMaW5lKTtsLndyYXBwaW5nLm5vTGluZXMrPSsoIiIhPT1wKTtsLndyYXBwaW5nLm5vTGluZXM9PT1sLmF2YWlsYWJsZUxpbmVzJiYibm9uZSIhPT10aGlzLl90ZXh0VHJpbW1pbmcmJm0/bC5jYW5GaXRUZXh0PSExOmwud3JhcHBpbmcud3JhcHBlZFRleHQrPXA7bC5jdXJyZW50TGluZT0iXG4iO3JldHVybiBsfTt0LnByb3RvdHlwZS5jYW5GaXRUb2tlbj1mdW5jdGlvbihsLApwLG0pe3ZhciBuPXRoaXMscT10aGlzLl9hbGxvd0JyZWFraW5nV29yZHM/bC5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKHUseCl7cmV0dXJuIHghPT1sLmxlbmd0aC0xP3Urbi5fYnJlYWtpbmdDaGFyYWN0ZXI6dX0pOltsXTtyZXR1cm4gbS5tZWFzdXJlKGwpLndpZHRoPD1wfHxxLmV2ZXJ5KGZ1bmN0aW9uKHUpe3JldHVybiBtLm1lYXN1cmUodSkud2lkdGg8PXB9KX07dC5wcm90b3R5cGUuYWRkRWxsaXBzaXM9ZnVuY3Rpb24obCxwLG0pe2lmKCJub25lIj09PXRoaXMuX3RleHRUcmltbWluZylyZXR1cm57cmVtYWluaW5nVG9rZW46IiIsd3JhcHBlZFRva2VuOmx9O3ZhciBuPWwuc3Vic3RyaW5nKDApLnRyaW0oKSxxPW0ubWVhc3VyZShuKS53aWR0aCx1PW0ubWVhc3VyZSgiLi4uIikud2lkdGgseD0wPGwubGVuZ3RoJiYiXG4iPT09bFswXT8iXG4iOiIiO2lmKHA8PXUpcmV0dXJue3JlbWFpbmluZ1Rva2VuOmwsd3JhcHBlZFRva2VuOngrIi4uLiIuc3Vic3RyKDAsTWF0aC5mbG9vcihwLwoodS8zKSkpfTtmb3IoO3ErdT5wOyluPWsuU3RyaW5nTWV0aG9kcy50cmltRW5kKG4uc3Vic3RyKDAsbi5sZW5ndGgtMSkpLHE9bS5tZWFzdXJlKG4pLndpZHRoO3JldHVybntyZW1haW5pbmdUb2tlbjprLlN0cmluZ01ldGhvZHMudHJpbUVuZChsLnN1YnN0cmluZyhuLmxlbmd0aCksIi0iKS50cmltKCksd3JhcHBlZFRva2VuOngrbisiLi4uIn19O3QucHJvdG90eXBlLndyYXBOZXh0VG9rZW49ZnVuY3Rpb24obCxwLG0pe2lmKCFwLmNhbkZpdFRleHR8fHAuYXZhaWxhYmxlTGluZXM9PT1wLndyYXBwaW5nLm5vTGluZXN8fCF0aGlzLmNhbkZpdFRva2VuKGwscC5hdmFpbGFibGVXaWR0aCxtKSlyZXR1cm4gdGhpcy5maW5pc2hXcmFwcGluZyhsLHAsbSk7Zm9yKDtsOyl7dmFyIG49dGhpcy5icmVha1Rva2VuVG9GaXRJbldpZHRoKGwscC5jdXJyZW50TGluZSxwLmF2YWlsYWJsZVdpZHRoLG0pO3AuY3VycmVudExpbmU9bi5saW5lO2w9bi5yZW1haW5pbmdUb2tlbjtpZihudWxsIT1sKWlmKHAud3JhcHBpbmcubm9Ccm9rZVdvcmRzKz0KK24uYnJlYWtXb3JkLCsrcC53cmFwcGluZy5ub0xpbmVzLHAuYXZhaWxhYmxlTGluZXM9PT1wLndyYXBwaW5nLm5vTGluZXMpe209dGhpcy5hZGRFbGxpcHNpcyhwLmN1cnJlbnRMaW5lLHAuYXZhaWxhYmxlV2lkdGgsbSk7cC53cmFwcGluZy53cmFwcGVkVGV4dCs9bS53cmFwcGVkVG9rZW47cC53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz1tLnJlbWFpbmluZ1Rva2VuK2w7cC5jdXJyZW50TGluZT0iXG4iO2JyZWFrfWVsc2UgcC53cmFwcGluZy53cmFwcGVkVGV4dCs9ay5TdHJpbmdNZXRob2RzLnRyaW1FbmQocC5jdXJyZW50TGluZSkscC5jdXJyZW50TGluZT0iXG4ifXJldHVybiBwfTt0LnByb3RvdHlwZS5maW5pc2hXcmFwcGluZz1mdW5jdGlvbihsLHAsbSl7cC5jYW5GaXRUZXh0JiZwLmF2YWlsYWJsZUxpbmVzIT09cC53cmFwcGluZy5ub0xpbmVzJiZ0aGlzLl9hbGxvd0JyZWFraW5nV29yZHMmJiJub25lIiE9PXRoaXMuX3RleHRUcmltbWluZz8obT10aGlzLmFkZEVsbGlwc2lzKHAuY3VycmVudExpbmUrCmwscC5hdmFpbGFibGVXaWR0aCxtKSxwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1tLndyYXBwZWRUb2tlbixwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPW0ucmVtYWluaW5nVG9rZW4scC53cmFwcGluZy5ub0Jyb2tlV29yZHMrPSsobS5yZW1haW5pbmdUb2tlbi5sZW5ndGg8bC5sZW5ndGgpLHAud3JhcHBpbmcubm9MaW5lcys9KygwPG0ud3JhcHBlZFRva2VuLmxlbmd0aCkscC5jdXJyZW50TGluZT0iIik6cC53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz1sO3AuY2FuRml0VGV4dD0hMTtyZXR1cm4gcH07dC5wcm90b3R5cGUuYnJlYWtUb2tlblRvRml0SW5XaWR0aD1mdW5jdGlvbihsLHAsbSxuKXtpZih2b2lkIDA9PT1xKXZhciBxPXRoaXMuX2JyZWFraW5nQ2hhcmFjdGVyO2lmKG4ubWVhc3VyZShwK2wpLndpZHRoPD1tKXJldHVybnticmVha1dvcmQ6ITEsbGluZTpwK2wscmVtYWluaW5nVG9rZW46bnVsbH07aWYoIiI9PT1sLnRyaW0oKSlyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6cCwKcmVtYWluaW5nVG9rZW46IiJ9O2lmKCF0aGlzLl9hbGxvd0JyZWFraW5nV29yZHMpcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOnAscmVtYWluaW5nVG9rZW46bH07Zm9yKHZhciB1PTA7dTxsLmxlbmd0aDspaWYobi5tZWFzdXJlKHArbC5zdWJzdHJpbmcoMCx1KzEpK3EpLndpZHRoPD1tKSsrdTtlbHNlIGJyZWFrO209IiI7MDx1JiYobT1xKTtyZXR1cm57YnJlYWtXb3JkOjA8dSxsaW5lOnArbC5zdWJzdHJpbmcoMCx1KSttLHJlbWFpbmluZ1Rva2VuOmwuc3Vic3RyaW5nKHUpfX07cmV0dXJuIHR9KCk7Zi5XcmFwcGVyPWR9LGZ1bmN0aW9uKGQsZixoKXsoZnVuY3Rpb24oayl7Zm9yKHZhciB0IGluIGspZi5oYXNPd25Qcm9wZXJ0eSh0KXx8KGZbdF09a1t0XSl9KShoKDEzOSkpfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoNzIpKTtrKGgoNzMpKTtrKGgoMjgpKX0sZnVuY3Rpb24oZCwKZil7Zi52ZXJzaW9uPSIzLjcuMCJ9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHcsQyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBGPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEQ9eS5zZWxlY3QodGhpcyksQjtmb3IoQiBpbiBGKUQuYXR0cihCLEZbQl0pfSl9ZnVuY3Rpb24gdCh3LEMpe2Zvcih2YXIgRiBpbiBDKXcuYXR0cihGLENbRl0pO3JldHVybiB3fWZ1bmN0aW9uIGwodyxDLEYpe3JldHVybiB3LmVhY2goZnVuY3Rpb24oKXt2YXIgRD1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxCPXkuc2VsZWN0KHRoaXMpLEk7Zm9yKEkgaW4gRClCLnN0eWxlKEksRFtJXSxGKX0pfWZ1bmN0aW9uIHAodyxDLEYpe2Zvcih2YXIgRCBpbiBDKXcuc3R5bGUoRCxDW0RdLEYpO3JldHVybiB3fWZ1bmN0aW9uIG0odyxDKXtyZXR1cm4gdy5lYWNoKGZ1bmN0aW9uKCl7dmFyIEY9Qy5hcHBseSh0aGlzLGFyZ3VtZW50cyksRD15LnNlbGVjdCh0aGlzKSxCO2ZvcihCIGluIEYpRC5wcm9wZXJ0eShCLApGW0JdKX0pfWZ1bmN0aW9uIG4odyxDKXtmb3IodmFyIEYgaW4gQyl3LnByb3BlcnR5KEYsQ1tGXSk7cmV0dXJuIHd9ZnVuY3Rpb24gcSh3LEMpe3JldHVybiB3LmVhY2goZnVuY3Rpb24oKXt2YXIgRj1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxEPXkuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24odyksQjtmb3IoQiBpbiBGKUQuYXR0cihCLEZbQl0pfSl9ZnVuY3Rpb24gdSh3LEMpe2Zvcih2YXIgRiBpbiBDKXcuYXR0cihGLENbRl0pO3JldHVybiB3fWZ1bmN0aW9uIHgodyxDLEYpe3JldHVybiB3LmVhY2goZnVuY3Rpb24oKXt2YXIgRD1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxCPXkuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24odyksSTtmb3IoSSBpbiBEKUIuc3R5bGUoSSxEW0ldLEYpfSl9ZnVuY3Rpb24gQSh3LEMsRil7Zm9yKHZhciBEIGluIEMpdy5zdHlsZShELENbRF0sRik7cmV0dXJuIHd9dmFyIHk9ZD1oKDEpO3kuc2VsZWN0aW9uLnByb3RvdHlwZS5hdHRycz1mdW5jdGlvbih3KXtyZXR1cm4oImZ1bmN0aW9uIj09PQp0eXBlb2Ygdz9rOnQpKHRoaXMsdyl9O3kuc2VsZWN0aW9uLnByb3RvdHlwZS5zdHlsZXM9ZnVuY3Rpb24odyl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2Ygdz9sOnApKHRoaXMsdywiIil9O3kuc2VsZWN0aW9uLnByb3RvdHlwZS5wcm9wZXJ0aWVzPWZ1bmN0aW9uKHcpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHc/bTpuKSh0aGlzLHcpfTtkLnRyYW5zaXRpb24ucHJvdG90eXBlLmF0dHJzPWZ1bmN0aW9uKHcpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHc/cTp1KSh0aGlzLHcpfTtkLnRyYW5zaXRpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbih3KXtyZXR1cm4oImZ1bmN0aW9uIj09PXR5cGVvZiB3P3g6QSkodGhpcyx3LCIiKX19LGZ1bmN0aW9uKGQsZixoKXtkPWgoMTE3KTt2YXIgaz1oKDEyKTtoPWgoMTApO3ZhciB0PXtsaW5lYXI6ZC5lYXNlTGluZWFyLHF1YWQ6ZC5lYXNlUXVhZCxxdWFkSW46ZC5lYXNlUXVhZEluLHF1YWRPdXQ6ZC5lYXNlUXVhZE91dCwKcXVhZEluT3V0OmQuZWFzZVF1YWRJbk91dCxjdWJpYzpkLmVhc2VDdWJpYyxjdWJpY0luOmQuZWFzZUN1YmljSW4sY3ViaWNPdXQ6ZC5lYXNlQ3ViaWNPdXQsY3ViaWNJbk91dDpkLmVhc2VDdWJpY0luT3V0LHBvbHk6ZC5lYXNlUG9seSxwb2x5SW46ZC5lYXNlUG9seUluLHBvbHlPdXQ6ZC5lYXNlUG9seU91dCxwb2x5SW5PdXQ6ZC5lYXNlUG9seUluT3V0LHNpbjpkLmVhc2VTaW4sc2luSW46ZC5lYXNlU2luSW4sc2luT3V0OmQuZWFzZVNpbk91dCxzaW5Jbk91dDpkLmVhc2VTaW5Jbk91dCxleHA6ZC5lYXNlRXhwLGV4cEluOmQuZWFzZUV4cEluLGV4cE91dDpkLmVhc2VFeHBPdXQsZXhwSW5PdXQ6ZC5lYXNlRXhwSW5PdXQsY2lyY2xlOmQuZWFzZUNpcmNsZSxjaXJjbGVJbjpkLmVhc2VDaXJjbGVJbixjaXJjbGVPdXQ6ZC5lYXNlQ2lyY2xlT3V0LGNpcmNsZUluT3V0OmQuZWFzZUNpcmNsZUluT3V0LGJvdW5jZTpkLmVhc2VCb3VuY2UsYm91bmNlSW46ZC5lYXNlQm91bmNlSW4sYm91bmNlT3V0OmQuZWFzZUJvdW5jZU91dCwKYm91bmNlSW5PdXQ6ZC5lYXNlQm91bmNlSW5PdXQsYmFjazpkLmVhc2VCYWNrLGJhY2tJbjpkLmVhc2VCYWNrSW4sYmFja091dDpkLmVhc2VCYWNrT3V0LGJhY2tJbk91dDpkLmVhc2VCYWNrSW5PdXQsZWxhc3RpYzpkLmVhc2VFbGFzdGljLGVsYXN0aWNJbjpkLmVhc2VFbGFzdGljSW4sZWxhc3RpY091dDpkLmVhc2VFbGFzdGljT3V0LGVsYXN0aWNJbk91dDpkLmVhc2VFbGFzdGljSW5PdXR9O2YuRWFzZU5hbWU9aC5tYWtlRW51bSgibGluZWFyIHF1YWQgcXVhZEluIHF1YWRPdXQgcXVhZEluT3V0IGN1YmljIGN1YmljSW4gY3ViaWNPdXQgY3ViaWNJbk91dCBwb2x5IHBvbHlJbiBwb2x5T3V0IHBvbHlJbk91dCBzaW4gc2luSW4gc2luT3V0IHNpbkluT3V0IGV4cCBleHBJbiBleHBPdXQgZXhwSW5PdXQgY2lyY2xlIGNpcmNsZUluIGNpcmNsZU91dCBjaXJjbGVJbk91dCBib3VuY2UgYm91bmNlSW4gYm91bmNlT3V0IGJvdW5jZUluT3V0IGJhY2sgYmFja0luIGJhY2tPdXQgYmFja0luT3V0IGVsYXN0aWMgZWxhc3RpY0luIGVsYXN0aWNPdXQgZWxhc3RpY0luT3V0Ii5zcGxpdCgiICIpKTsKaD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwoKXt0aGlzLl9zdGFydERlbGF5PWwuX0RFRkFVTFRfU1RBUlRfREVMQVlfTUlMTElTRUNPTkRTO3RoaXMuX3N0ZXBEdXJhdGlvbj1sLl9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTO3RoaXMuX3N0ZXBEZWxheT1sLl9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFM7dGhpcy5fbWF4VG90YWxEdXJhdGlvbj1sLl9ERUZBVUxUX01BWF9UT1RBTF9EVVJBVElPTl9NSUxMSVNFQ09ORFM7dGhpcy5fZWFzaW5nTW9kZT1sLl9ERUZBVUxUX0VBU0lOR19NT0RFfWwucHJvdG90eXBlLnRvdGFsVGltZT1mdW5jdGlvbihwKXt2YXIgbT10aGlzLl9nZXRBZGp1c3RlZEl0ZXJhdGl2ZURlbGF5KHApO3JldHVybiB0aGlzLnN0YXJ0RGVsYXkoKSttKk1hdGgubWF4KHAtMSwwKSt0aGlzLnN0ZXBEdXJhdGlvbigpfTtsLnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKHAsbSl7dmFyIG49dGhpcztwPWsuY29lcmNlRXh0ZXJuYWxEMyhwKTsKdmFyIHE9cC5zaXplKCksdT10aGlzLl9nZXRBZGp1c3RlZEl0ZXJhdGl2ZURlbGF5KHEpO3JldHVybiBwLnRyYW5zaXRpb24oKS5lYXNlKHRoaXMuX2dldEVhc2VGYWN0b3J5KCkpLmR1cmF0aW9uKHRoaXMuc3RlcER1cmF0aW9uKCkpLmRlbGF5KGZ1bmN0aW9uKHgsQSl7cmV0dXJuIG4uc3RhcnREZWxheSgpK3UqQX0pLmF0dHJzKG0pfTtsLnByb3RvdHlwZS5zdGFydERlbGF5PWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX3N0YXJ0RGVsYXk7dGhpcy5fc3RhcnREZWxheT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5zdGVwRHVyYXRpb249ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gTWF0aC5taW4odGhpcy5fc3RlcER1cmF0aW9uLHRoaXMuX21heFRvdGFsRHVyYXRpb24pO3RoaXMuX3N0ZXBEdXJhdGlvbj1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5zdGVwRGVsYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RlcERlbGF5fTtsLnByb3RvdHlwZS5tYXhUb3RhbER1cmF0aW9uPQpmdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiB0aGlzLl9tYXhUb3RhbER1cmF0aW9uO3RoaXMuX21heFRvdGFsRHVyYXRpb249cDtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuZWFzaW5nTW9kZT1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiB0aGlzLl9lYXNpbmdNb2RlO3RoaXMuX2Vhc2luZ01vZGU9cDtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuX2dldEVhc2VGYWN0b3J5PWZ1bmN0aW9uKCl7dmFyIHA9dGhpcy5lYXNpbmdNb2RlKCk7cmV0dXJuInN0cmluZyI9PT10eXBlb2YgcD8ocD10W3BdLG51bGw9PXA/dC5saW5lYXI6cCk6cH07bC5wcm90b3R5cGUuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXk9ZnVuY3Rpb24ocCl7dmFyIG09dGhpcy5tYXhUb3RhbER1cmF0aW9uKCktdGhpcy5zdGVwRHVyYXRpb24oKTttPU1hdGgubWF4KG0sMCk7cD1tL01hdGgubWF4KHAtMSwxKTtyZXR1cm4gTWF0aC5taW4odGhpcy5zdGVwRGVsYXkoKSxwKX07cmV0dXJuIGx9KCk7aC5fREVGQVVMVF9TVEFSVF9ERUxBWV9NSUxMSVNFQ09ORFM9CjA7aC5fREVGQVVMVF9TVEVQX0RVUkFUSU9OX01JTExJU0VDT05EUz0zMDA7aC5fREVGQVVMVF9JVEVSQVRJVkVfREVMQVlfTUlMTElTRUNPTkRTPTE1O2guX0RFRkFVTFRfTUFYX1RPVEFMX0RVUkFUSU9OX01JTExJU0VDT05EUz1JbmZpbml0eTtoLl9ERUZBVUxUX0VBU0lOR19NT0RFPSJleHBPdXQiO2YuRWFzaW5nPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEyKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe310LnByb3RvdHlwZS50b3RhbFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gMH07dC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihsLHApe2w9ay5jb2VyY2VFeHRlcm5hbEQzKGwpO3JldHVybiBsLmF0dHJzKHApfTtyZXR1cm4gdH0oKTtmLk51bGw9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciBBIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShBKSYmCihxW0FdPXVbQV0pO3EucHJvdG90eXBlPW51bGw9PT11P09iamVjdC5jcmVhdGUodSk6KHgucHJvdG90eXBlPXUucHJvdG90eXBlLG5ldyB4KX0sdD1oKDEpLGw9aCg1KSxwPWgoNCksbT1oKDApLG49aCgyMik7ZD1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KHgsQSl7dm9pZCAwPT09QSYmKEE9ImJvdHRvbSIpO3g9cS5jYWxsKHRoaXMseCxBKXx8dGhpczt4Ll90aWNrTGFiZWxBbmdsZT0wO3guX3RpY2tMYWJlbFNoZWFyQW5nbGU9MDt4LmFkZENsYXNzKCJjYXRlZ29yeS1heGlzIik7cmV0dXJuIHh9ayh1LHEpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LnByb3RvdHlwZSwiX3dyYXBwZXIiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgeD1uZXcgbC5XcmFwcGVyO251bGwhPXRoaXMuX3RpY2tMYWJlbE1heExpbmVzJiZ4Lm1heExpbmVzKHRoaXMuX3RpY2tMYWJlbE1heExpbmVzKTtyZXR1cm4geH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodS5wcm90b3R5cGUsCiJfd3JpdGVyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBsLldyaXRlcih0aGlzLl9tZWFzdXJlcix0aGlzLl90eXBlc2V0dGVyQ29udGV4dCx0aGlzLl93cmFwcGVyKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTt1LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90eXBlc2V0dGVyQ29udGV4dD1uZXcgbC5TdmdDb250ZXh0KHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIodGhpcy5fdHlwZXNldHRlckNvbnRleHQpfTt1LnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlZHJhdygpfTt1LnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih4LEEpe3ZhciB5PXRoaXMuaXNIb3Jpem9udGFsKCk/MDp0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpK3RoaXMubWFyZ2luKCksdz10aGlzLmlzSG9yaXpvbnRhbCgpPwp0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpK3RoaXMubWFyZ2luKCk6MDtpZigwPT09dGhpcy5fc2NhbGUuZG9tYWluKCkubGVuZ3RoKXJldHVybnttaW5XaWR0aDowLG1pbkhlaWdodDowfTtpZih0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpKXt2YXIgQz10aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpO3RoaXMuaXNIb3Jpem9udGFsKCk/dys9Qzp5Kz1DfXg9dGhpcy5fbWVhc3VyZVRpY2tMYWJlbHMoeCxBKTtyZXR1cm57bWluV2lkdGg6eC51c2VkV2lkdGgreSxtaW5IZWlnaHQ6eC51c2VkSGVpZ2h0K3d9fTt1LnByb3RvdHlwZS5fY29yZVNpemU9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLEE9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKS5taW5IZWlnaHQ6dGhpcy5yZXF1ZXN0ZWRTcGFjZSh0aGlzLndpZHRoKCksCnRoaXMuaGVpZ2h0KCkpLm1pbldpZHRoLHk9dGhpcy5tYXJnaW4oKSt0aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpO3JldHVybiBNYXRoLm1pbihBLXkseCl9O3UucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RG93bnNhbXBsZUluZm8oKS5kb21haW59O3UucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHgsQSl7cmV0dXJuIHAuQ29tcG9uZW50LnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlci5jYWxsKHRoaXMseCxBKX07dS5wcm90b3R5cGUuZ2V0RG93bnNhbXBsZUluZm89ZnVuY3Rpb24oeCl7dmFyIEE7dm9pZCAwPT09eCYmKHg9dGhpcy5fc2NhbGUpO3ZvaWQgMD09PUEmJihBPXguaW52ZXJ0UmFuZ2UoKSk7dmFyIHk9TWF0aC5jZWlsKHUuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYKigwPT09dGhpcy5fdGlja0xhYmVsQW5nbGU/MToxL01hdGguY29zKHRoaXMuX3RpY2tMYWJlbFNoZWFyQW5nbGUvMTgwKk1hdGguUEkpKS8KeC5zdGVwV2lkdGgoKSk7cmV0dXJue2RvbWFpbjpBLmZpbHRlcihmdW5jdGlvbih3LEMpe3JldHVybiAwPT09QyV5fSksc3RlcFdpZHRoOnkqeC5zdGVwV2lkdGgoKX19O3UucHJvdG90eXBlLnRpY2tMYWJlbEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpY2tMYWJlbEFuZ2xlO3Rocm93IEVycm9yKCJBbmdsZSB1bmRlZmluZWQgbm90IHN1cHBvcnRlZDsgb25seSAwLCA5MCwgYW5kIC05MCBhcmUgdmFsaWQgdmFsdWVzIik7fTt1LnByb3RvdHlwZS50aWNrTGFiZWxTaGVhckFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpY2tMYWJlbFNoZWFyQW5nbGV9O3UucHJvdG90eXBlLnRpY2tMYWJlbE1heFdpZHRoPWZ1bmN0aW9uKHgpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90aWNrTGFiZWxNYXhXaWR0aDt0aGlzLl90aWNrTGFiZWxNYXhXaWR0aD14O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnRpY2tMYWJlbE1heExpbmVzPQpmdW5jdGlvbih4KXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fdGlja0xhYmVsTWF4TGluZXM7dGhpcy5fdGlja0xhYmVsTWF4TGluZXM9eDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS5fdGlja1NwYWNlUmVxdWlyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCl9O3UucHJvdG90eXBlLl9kcmF3VGlja3M9ZnVuY3Rpb24oeCxBKXt2YXIgeT10aGlzO3N3aXRjaCh0aGlzLnRpY2tMYWJlbEFuZ2xlKCkpe2Nhc2UgMDp2YXIgdz17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iix0b3A6ImNlbnRlciIsYm90dG9tOiJjZW50ZXIifTt2YXIgQz17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6ImJvdHRvbSIsYm90dG9tOiJ0b3AifTticmVhaztjYXNlIDkwOnc9e2xlZnQ6ImNlbnRlciIscmlnaHQ6ImNlbnRlciIsdG9wOiJyaWdodCIsYm90dG9tOiJsZWZ0In07CkM9e2xlZnQ6InRvcCIscmlnaHQ6ImJvdHRvbSIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn07YnJlYWs7Y2FzZSAtOTA6dz17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6ImxlZnQiLGJvdHRvbToicmlnaHQifSxDPXtsZWZ0OiJib3R0b20iLHJpZ2h0OiJ0b3AiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9fUEuZWFjaChmdW5jdGlvbihGKXt2YXIgRD10LnNlbGVjdCh0aGlzKSxCPXkuaXNIb3Jpem9udGFsKCk/eDp5LndpZHRoKCkteS5fdGlja1NwYWNlUmVxdWlyZWQoKSxJPXkuaXNIb3Jpem9udGFsKCk/eS5oZWlnaHQoKS15Ll90aWNrU3BhY2VSZXF1aXJlZCgpOngsTj17eEFsaWduOndbeS5vcmllbnRhdGlvbigpXSx5QWxpZ246Q1t5Lm9yaWVudGF0aW9uKCldLHRleHRSb3RhdGlvbjp5LnRpY2tMYWJlbEFuZ2xlKCksdGV4dFNoZWFyOnkudGlja0xhYmVsU2hlYXJBbmdsZSgpfTtpZihudWxsIT15Ll90aWNrTGFiZWxNYXhXaWR0aCl7aWYoImxlZnQiPT09Cnkub3JpZW50YXRpb24oKSYmQj55Ll90aWNrTGFiZWxNYXhXaWR0aCl7dmFyIE89Qi15Ll90aWNrTGFiZWxNYXhXaWR0aDtPPUQuYXR0cigidHJhbnNmb3JtIikrIiB0cmFuc2xhdGUoIitPKyIsIDApIjtELmF0dHIoInRyYW5zZm9ybSIsTyl9Qj1NYXRoLm1pbihCLHkuX3RpY2tMYWJlbE1heFdpZHRoKX15Ll93cml0ZXIud3JpdGUoeS5mb3JtYXR0ZXIoKShGKSxCLEksTixELm5vZGUoKSl9KX07dS5wcm90b3R5cGUuX21lYXN1cmVUaWNrTGFiZWxzPWZ1bmN0aW9uKHgsQSl7dmFyIHk9dGhpcyx3PXRoaXMuX3NjYWxlLmNsb25lV2l0aG91dFByb3ZpZGVycygpLnJhbmdlKFswLHRoaXMuaXNIb3Jpem9udGFsKCk/eDpBXSksQz10aGlzLmdldERvd25zYW1wbGVJbmZvKHcpO3c9Qy5kb21haW47Qz1DLnN0ZXBXaWR0aDt2YXIgRj14LXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk7dGhpcy5pc0hvcml6b250YWwoKSYmKEY9QywwIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihGPUEtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSksCkY9TWF0aC5tYXgoRiwwKSk7dmFyIEQ9Qzt0aGlzLmlzSG9yaXpvbnRhbCgpJiYoRD1BLXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCksMCE9PXRoaXMuX3RpY2tMYWJlbEFuZ2xlJiYoRD14LXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkpLEQ9TWF0aC5tYXgoRCwwKSk7bnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4V2lkdGgmJihGPU1hdGgubWluKEYsdGhpcy5fdGlja0xhYmVsTWF4V2lkdGgpKTtBPXcubWFwKGZ1bmN0aW9uKEIpe3JldHVybiB5Ll93cmFwcGVyLndyYXAoeS5mb3JtYXR0ZXIoKShCKSx5Ll9tZWFzdXJlcixGLEQpfSk7eD10aGlzLmlzSG9yaXpvbnRhbCgpJiYwPT09dGhpcy5fdGlja0xhYmVsQW5nbGU/dC5zdW06bS5NYXRoLm1heDt3PXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT9tLk1hdGgubWF4OnQuc3VtO3g9eChBLGZ1bmN0aW9uKEIpe3JldHVybiB5Ll9tZWFzdXJlci5tZWFzdXJlKEIud3JhcHBlZFRleHQpLndpZHRofSwwKTsKQT13KEEsZnVuY3Rpb24oQil7cmV0dXJuIHkuX21lYXN1cmVyLm1lYXN1cmUoQi53cmFwcGVkVGV4dCkuaGVpZ2h0fSwwKTswIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihBPVtBLHhdLHg9QVswXSxBPUFbMV0pO3JldHVybnt1c2VkV2lkdGg6eCx1c2VkSGVpZ2h0OkF9fTt1LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB4PXRoaXM7cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgQT10aGlzLl9zY2FsZSx5PXRoaXMuZ2V0RG93bnNhbXBsZUluZm8oQSksdz15LmRvbWFpbixDPXk9eS5zdGVwV2lkdGg7dGhpcy5pc0hvcml6b250YWwoKSYmbnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4V2lkdGgmJihDPU1hdGgubWluKEMsdGhpcy5fdGlja0xhYmVsTWF4V2lkdGgpKTt3PXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK24uQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5kYXRhKHcpO3ZhciBGPXcuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKG4uQXhpcy5USUNLX0xBQkVMX0NMQVNTLAohMCkubWVyZ2Uodyk7dy5leGl0KCkucmVtb3ZlKCk7Ri5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKEQpe3ZhciBCPUEuc2NhbGUoRCktQy8yO0Q9eC5pc0hvcml6b250YWwoKT9COjA7Qj14LmlzSG9yaXpvbnRhbCgpPzA6QjtyZXR1cm4idHJhbnNsYXRlKCIrRCsiLCIrQisiKSJ9KTtGLnRleHQoIiIpO3RoaXMuX2RyYXdUaWNrcyh5LEYpO3k9InJpZ2h0Ij09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpOjA7dz0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpOjA7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3krIiwiK3crIikiKTt0aGlzLl9zaG93QWxsVGlja01hcmtzKCk7dGhpcy5fc2hvd0FsbFRpY2tMYWJlbHMoKTt0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHgsQSx5KXtxLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyx4LEEseSk7dGhpcy5pc0hvcml6b250YWwoKXx8dGhpcy5fc2NhbGUucmFuZ2UoWzAsdGhpcy5oZWlnaHQoKV0pO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gdX0obi5BeGlzKTtkLl9NSU5JTVVNX1dJRFRIX1BFUl9MQUJFTF9QWD0xNTtmLkNhdGVnb3J5PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocSx1KXtmdW5jdGlvbiB4KCl7dGhpcy5jb25zdHJ1Y3Rvcj1xfWZvcih2YXIgQSBpbiB1KXUuaGFzT3duUHJvcGVydHkoQSkmJihxW0FdPXVbQV0pO3EucHJvdG90eXBlPW51bGw9PT11P09iamVjdC5jcmVhdGUodSk6KHgucHJvdG90eXBlPXUucHJvdG90eXBlLG5ldyB4KX0sCnQ9aCgxKSxsPWgoNSkscD1oKDgpLG09aCgwKSxuPWgoMjIpO2Q9ZnVuY3Rpb24ocSl7ZnVuY3Rpb24gdSh4LEEpe3g9cS5jYWxsKHRoaXMseCxBKXx8dGhpczt4Ll90aWNrTGFiZWxQb3NpdGlvbmluZz0iY2VudGVyIjt4Ll91c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj0hMTt4LmZvcm1hdHRlcihwLmdlbmVyYWwoKSk7cmV0dXJuIHh9ayh1LHEpO3UucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3EucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3ZhciB4PW5ldyBsLlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSxuLkF4aXMuVElDS19MQUJFTF9DTEFTUyk7dGhpcy5fbWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih4KTt0aGlzLl93cmFwcGVyPShuZXcgbC5XcmFwcGVyKS5tYXhMaW5lcygxKX07dS5wcm90b3R5cGUuX2NvbXB1dGVXaWR0aD1mdW5jdGlvbigpe3ZhciB4PXRoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uP3RoaXMuX2NvbXB1dGVBcHByb3hpbWF0ZVRleHRXaWR0aCgpOgp0aGlzLl9jb21wdXRlRXhhY3RUZXh0V2lkdGgoKTtyZXR1cm4iY2VudGVyIj09PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nP3RoaXMuX21heExhYmVsVGlja0xlbmd0aCgpK3RoaXMudGlja0xhYmVsUGFkZGluZygpK3g6TWF0aC5tYXgodGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCksdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkreCl9O3UucHJvdG90eXBlLl9jb21wdXRlRXhhY3RUZXh0V2lkdGg9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLEE9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLm1hcChmdW5jdGlvbih5KXt5PXguZm9ybWF0dGVyKCkoeSk7cmV0dXJuIHguX21lYXN1cmVyLm1lYXN1cmUoeSkud2lkdGh9KTtyZXR1cm4gbS5NYXRoLm1heChBLDApfTt1LnByb3RvdHlwZS5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHg9dGhpcyxBPXRoaXMuX2dldFRpY2tWYWx1ZXMoKSx5PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoIk0iKS53aWR0aDtBPUEubWFwKGZ1bmN0aW9uKHcpe3JldHVybiB4LmZvcm1hdHRlcigpKHcpLmxlbmd0aCoKeX0pO3JldHVybiBtLk1hdGgubWF4KEEsMCl9O3UucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDtyZXR1cm4iY2VudGVyIj09PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nP3RoaXMuX21heExhYmVsVGlja0xlbmd0aCgpK3RoaXMudGlja0xhYmVsUGFkZGluZygpK3g6TWF0aC5tYXgodGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCksdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkreCl9O3UucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5fc2NhbGUsQT14LmRvbWFpbigpLHk9QVswXTw9QVsxXT9BWzBdOkFbMV0sdz1BWzBdPj1BWzFdP0FbMF06QVsxXTtyZXR1cm4geC50aWNrcygpLmZpbHRlcihmdW5jdGlvbihDKXtyZXR1cm4gQz49eSYmQzw9d30pfTt1LnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX2lzU2V0dXApe2lmKCF0aGlzLmlzSG9yaXpvbnRhbCgpKXt2YXIgeD0KdGhpcy5fY29tcHV0ZVdpZHRoKCk7aWYoeD50aGlzLndpZHRoKCl8fHg8dGhpcy53aWR0aCgpLXRoaXMubWFyZ2luKCkpe3RoaXMucmVkcmF3KCk7cmV0dXJufX10aGlzLnJlbmRlcigpfX07dS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgeD10aGlzO3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dmFyIEE9e3g6MCx5OjAsZHg6IjBlbSIsZHk6IjAuM2VtIn0seT10aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx3PXRoaXMudGlja0xhYmVsUGFkZGluZygpLEM9Im1pZGRsZSIsRj0wLEQ9MCxCPTAsST0wO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpc3dpdGNoKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nKXtjYXNlICJsZWZ0IjpDPSJlbmQiO0Y9LXc7ST13O2JyZWFrO2Nhc2UgImNlbnRlciI6ST15K3c7YnJlYWs7Y2FzZSAicmlnaHQiOkM9InN0YXJ0IixJPUY9d31lbHNlIHN3aXRjaCh0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyl7Y2FzZSAidG9wIjpBLmR5PQoiLTAuM2VtIjtCPXc7RD0tdzticmVhaztjYXNlICJjZW50ZXIiOkI9eSt3O2JyZWFrO2Nhc2UgImJvdHRvbSI6QS5keT0iMWVtIixEPUI9d315PXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpO3N3aXRjaCh0aGlzLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6QS54PXkueDE7QS5keT0iMC45NWVtIjtEPXkueTErSTticmVhaztjYXNlICJ0b3AiOkEueD15LngxO0EuZHk9Ii0uMjVlbSI7RD15LnkxLUk7YnJlYWs7Y2FzZSAibGVmdCI6Qz0iZW5kIjtGPXkueDEtQjtBLnk9eS55MTticmVhaztjYXNlICJyaWdodCI6Qz0ic3RhcnQiLEY9eS54MStCLEEueT15LnkxfUI9dGhpcy5fZ2V0VGlja1ZhbHVlcygpO0I9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEoQik7Qi5leGl0KCkucmVtb3ZlKCk7Qi5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmNsYXNzZWQobi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsCiEwKS5tZXJnZShCKS5zdHlsZSgidGV4dC1hbmNob3IiLEMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpLmF0dHJzKEEpLnRleHQoZnVuY3Rpb24oTil7cmV0dXJuIHguZm9ybWF0dGVyKCkoTil9KTt0aGlzLl90aWNrTGFiZWxDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrRisiLCAiK0QrIikiKTt0aGlzLl9zaG93QWxsVGlja01hcmtzKCk7dGhpcy5zaG93RW5kVGlja0xhYmVscygpfHx0aGlzLl9oaWRlRW5kVGlja0xhYmVscygpO3RoaXMuX2hpZGVPdmVyZmxvd2luZ1RpY2tMYWJlbHMoKTt0aGlzLl9oaWRlT3ZlcmxhcHBpbmdUaWNrTGFiZWxzKCk7ImNlbnRlciIhPT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyYmdGhpcy5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbCgpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS50aWNrTGFiZWxQb3NpdGlvbj1mdW5jdGlvbih4KXtpZihudWxsPT14KXJldHVybiB0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZzsKeD14LnRvTG93ZXJDYXNlKCk7aWYodGhpcy5pc0hvcml6b250YWwoKSl7aWYoImxlZnQiIT09eCYmImNlbnRlciIhPT14JiYicmlnaHQiIT09eCl0aHJvdyBFcnJvcih4KyIgaXMgbm90IGEgdmFsaWQgdGljayBsYWJlbCBwb3NpdGlvbiBmb3IgYSBob3Jpem9udGFsIE51bWVyaWNBeGlzIik7fWVsc2UgaWYoInRvcCIhPT14JiYiY2VudGVyIiE9PXgmJiJib3R0b20iIT09eCl0aHJvdyBFcnJvcih4KyIgaXMgbm90IGEgdmFsaWQgdGljayBsYWJlbCBwb3NpdGlvbiBmb3IgYSB2ZXJ0aWNhbCBOdW1lcmljQXhpcyIpO3RoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nPXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb249ZnVuY3Rpb24oKXt0aGlzLl91c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj0hMH07dS5wcm90b3R5cGUuX2hpZGVFbmRUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLApBPXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK24uQXhpcy5USUNLX0xBQkVMX0NMQVNTKTtpZigwIT09QS5zaXplKCkpe3ZhciB5PUEubm9kZXMoKVswXTttLkRPTS5jbGllbnRSZWN0SW5zaWRlKHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseCl8fHQuc2VsZWN0KHkpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik7QT1BLm5vZGVzKClbQS5zaXplKCktMV07bS5ET00uY2xpZW50UmVjdEluc2lkZShBLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHgpfHx0LnNlbGVjdChBKS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfX07dS5wcm90b3R5cGUuX2hpZGVPdmVybGFwcGluZ1RpY2tMYWJlbHM9ZnVuY3Rpb24oKXtmb3IodmFyIHg9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmZpbHRlcihmdW5jdGlvbigpe3ZhciB3PXQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuImluaGVyaXQiPT09Cnd8fCJ2aXNpYmxlIj09PXd9KSxBPXgubm9kZXMoKS5tYXAoZnVuY3Rpb24odyl7cmV0dXJuIHcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9KSx5PTE7IXRoaXMuX2hhc092ZXJsYXBXaXRoSW50ZXJ2YWwoeSxBKSYmeTxBLmxlbmd0aDspeSs9MTt4LmVhY2goZnVuY3Rpb24odyxDKXt3PXQuc2VsZWN0KHRoaXMpOzAhPT1DJXkmJncuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTt1LnByb3RvdHlwZS5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbD1mdW5jdGlvbih4LEEpe3ZhciB5PSJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk6Myp0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTtBPUEubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBtLkRPTS5leHBhbmRSZWN0KEMseSl9KTtmb3IodmFyIHc9MDt3PEEubGVuZ3RoLXg7dys9eClpZihtLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoQVt3XSxBW3creF0pKXJldHVybiExO3JldHVybiEwfTsKdS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHV9KG4uQXhpcyk7Zi5OdW1lcmljPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX07ZD1oKDQyKTt2YXIgdD1oKDI1KSxsPWgoMCk7aD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe2Z1bmN0aW9uIHEoKXt3JiYodz0hMSx5Ll9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeSkpfWZ1bmN0aW9uIHUoQyxGKXt3JiYoeS5fc2V0UGl4ZWxQb3NpdGlvbldpdGhvdXRDaGFuZ2luZ01vZGUoeS5faXNWZXJ0aWNhbCgpPwpGLng6Ri55KSx5Ll9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeSkpfWZ1bmN0aW9uIHgoQyl7QShDKSYmKHc9ITAseS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeSkpfWZ1bmN0aW9uIEEoQyl7cmV0dXJuIHkuX2lzVmVydGljYWwoKSYmeS5waXhlbFBvc2l0aW9uKCkteS5kZXRlY3Rpb25SYWRpdXMoKTw9Qy54JiZDLng8PXkucGl4ZWxQb3NpdGlvbigpK3kuZGV0ZWN0aW9uUmFkaXVzKCl8fCF5Ll9pc1ZlcnRpY2FsKCkmJnkucGl4ZWxQb3NpdGlvbigpLXkuZGV0ZWN0aW9uUmFkaXVzKCk8PUMueSYmQy55PD15LnBpeGVsUG9zaXRpb24oKSt5LmRldGVjdGlvblJhZGl1cygpfXZhciB5PXAuY2FsbCh0aGlzLG4pfHx0aGlzO3kuX2RldGVjdGlvblJhZGl1cz0zO3kuX2VuYWJsZWQ9ITA7eS5hZGRDbGFzcygiZHJhZy1saW5lLWxheWVyIik7eS5hZGRDbGFzcygiZW5hYmxlZCIpO3kuX2RyYWdJbnRlcmFjdGlvbj1uZXcgdC5EcmFnO3kuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh5KTsKdmFyIHc9ITE7eS5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KHgpO3kuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcodSk7eS5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChxKTt5Ll9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KHgpO3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHUpO3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKHEpO3kuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX07eS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3kuX2RyYWdDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7eS5fZHJhZ0VuZENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtyZXR1cm4geX1rKG0scCk7bS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fZGV0ZWN0aW9uRWRnZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5zdHlsZXMoe29wYWNpdHk6MCwKc3Ryb2tlOiJwaW5rIiwicG9pbnRlci1ldmVudHMiOiJ2aXNpYmxlU3Ryb2tlIn0pLmNsYXNzZWQoImRyYWctZWRnZSIsITApfTttLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fZGV0ZWN0aW9uRWRnZS5hdHRycyh7eDE6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOjAseTE6dGhpcy5faXNWZXJ0aWNhbCgpPzA6dGhpcy5waXhlbFBvc2l0aW9uKCkseDI6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOnRoaXMud2lkdGgoKSx5Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLnBpeGVsUG9zaXRpb24oKSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5kZXRlY3Rpb25SYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfTsKbS5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9lbmFibGVkOyh0aGlzLl9lbmFibGVkPW4pP3RoaXMuYWRkQ2xhc3MoImVuYWJsZWQiKTp0aGlzLnJlbW92ZUNsYXNzKCJlbmFibGVkIik7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQobik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5hZGQobil9O20ucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKG4pfTttLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQobik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZChuKX07Cm0ucHJvdG90eXBlLm9mZkRyYWdFbmQ9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3AucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmRlbGV0ZShxKX0pO3RoaXMuX2RyYWdDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gbi5fZHJhZ0NhbGxiYWNrcy5kZWxldGUocSl9KTt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKHEpfSk7dGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCl9O3JldHVybiBtfShkLkd1aWRlTGluZUxheWVyKTtmLkRyYWdMaW5lTGF5ZXI9aH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsobCxwLG0pe3ZhciBuPQp7fTtpZih2b2lkIDAhPT1tKWZvcih2YXIgcT0wO3E8bS5sZW5ndGg7cSsrKW5bbVtxXV09bVtxLTFdO3JldHVybiBmdW5jdGlvbih1KXt2YXIgeD1sLnNjYWxlKHUpO2lmKCFwKXJldHVybiB4O3ZhciBBO3U9dm9pZCAwPT09blt1XT92b2lkIDA6bC5zY2FsZShuW3VdKTt2b2lkIDAhPT11JiYoQT11Kyh4LXUpLzIpO3JldHVybiBBfX12YXIgdD10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX07ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7dmFyIHE9bC5jYWxsKHRoaXMpfHx0aGlzO3EuYWRkQ2xhc3MoImdyaWRsaW5lcyIpO3EuX3hTY2FsZT1tO3EuX3lTY2FsZT1uO3EuX3JlbmRlckNhbGxiYWNrPQpmdW5jdGlvbigpe3JldHVybiBxLnJlbmRlcigpfTtpZihxLl94U2NhbGUpcS5feFNjYWxlLm9uVXBkYXRlKHEuX3JlbmRlckNhbGxiYWNrKTtpZihxLl95U2NhbGUpcS5feVNjYWxlLm9uVXBkYXRlKHEuX3JlbmRlckNhbGxiYWNrKTtyZXR1cm4gcX10KHAsbCk7cC5wcm90b3R5cGUuYmV0d2Vlblg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmV0d2Vlblh9O3AucHJvdG90eXBlLmJldHdlZW5ZPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JldHdlZW5ZfTtwLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3hTY2FsZSYmdGhpcy5feFNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayk7dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CnRoaXMuX3hMaW5lc0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ4LWdyaWRsaW5lcyIsITApO3RoaXMuX3lMaW5lc0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWdyaWRsaW5lcyIsITApfTtwLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe2wucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fcmVkcmF3WExpbmVzKCk7dGhpcy5fcmVkcmF3WUxpbmVzKCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24obSxuLHEpe2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLG0sbixxKTtudWxsIT10aGlzLl94U2NhbGUmJnRoaXMuX3hTY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTtudWxsIT10aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSk7cmV0dXJuIHRoaXN9OwpwLnByb3RvdHlwZS5fcmVkcmF3WExpbmVzPWZ1bmN0aW9uKCl7aWYodGhpcy5feFNjYWxlKXt2YXIgbT10aGlzLmJldHdlZW5YKCksbj10aGlzLl94U2NhbGUudGlja3MoKS5zbGljZShtPzE6MCk7bj10aGlzLl94TGluZXNDb250YWluZXIuc2VsZWN0QWxsKCJsaW5lIikuZGF0YShuKTtuLmVudGVyKCkuYXBwZW5kKCJsaW5lIikubWVyZ2UobikuYXR0cigieDEiLGsodGhpcy5feFNjYWxlLG0sdGhpcy5feFNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ5MSIsMCkuYXR0cigieDIiLGsodGhpcy5feFNjYWxlLG0sdGhpcy5feFNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ5MiIsdGhpcy5oZWlnaHQoKSkuY2xhc3NlZCgiYmV0d2VlbmxpbmUiLG0pLmNsYXNzZWQoInplcm9saW5lIixmdW5jdGlvbihxKXtyZXR1cm4gMD09PXF9KTtuLmV4aXQoKS5yZW1vdmUoKX19O3AucHJvdG90eXBlLl9yZWRyYXdZTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLl95U2NhbGUpe3ZhciBtPXRoaXMuYmV0d2VlblkoKSwKbj10aGlzLl95U2NhbGUudGlja3MoKS5zbGljZShtPzE6MCk7bj10aGlzLl95TGluZXNDb250YWluZXIuc2VsZWN0QWxsKCJsaW5lIikuZGF0YShuKTtuLmVudGVyKCkuYXBwZW5kKCJsaW5lIikubWVyZ2UobikuYXR0cigieDEiLDApLmF0dHIoInkxIixrKHRoaXMuX3lTY2FsZSxtLHRoaXMuX3lTY2FsZS50aWNrcygpKSkuYXR0cigieDIiLHRoaXMud2lkdGgoKSkuYXR0cigieTIiLGsodGhpcy5feVNjYWxlLG0sdGhpcy5feVNjYWxlLnRpY2tzKCkpKS5jbGFzc2VkKCJiZXR3ZWVubGluZSIsbSkuY2xhc3NlZCgiemVyb2xpbmUiLGZ1bmN0aW9uKHEpe3JldHVybiAwPT09cX0pO24uZXhpdCgpLnJlbW92ZSgpfX07cmV0dXJuIHB9KGgoNCkuQ29tcG9uZW50KTtmLkdyaWRsaW5lcz1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHggaW4gcSlxLmhhc093blByb3BlcnR5KHgpJiYKKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoNSksbD1oKDIzKSxwPWgoOCksbT1oKDApO2Q9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSh1KXt2YXIgeD1uLmNhbGwodGhpcyl8fHRoaXM7eC5fdGV4dFBhZGRpbmc9NTtpZihudWxsPT11KXRocm93IEVycm9yKCJJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZCByZXF1aXJlcyBhIGludGVycG9sYXRlZENvbG9yU2NhbGUiKTt4Ll9zY2FsZT11O3guX3JlZHJhd0NhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHgucmVkcmF3KCl9O3guX3NjYWxlLm9uVXBkYXRlKHguX3JlZHJhd0NhbGxiYWNrKTt4Ll9mb3JtYXR0ZXI9cC5nZW5lcmFsKCk7eC5fb3JpZW50YXRpb249Imhvcml6b250YWwiO3guX2V4cGFuZHM9ITE7eC5hZGRDbGFzcygibGVnZW5kIik7eC5hZGRDbGFzcygiaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCIpO3JldHVybiB4fWsocSwKbik7cS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe24ucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfTtxLnByb3RvdHlwZS5mb3JtYXR0ZXI9ZnVuY3Rpb24odSl7aWYodm9pZCAwPT09dSlyZXR1cm4gdGhpcy5fZm9ybWF0dGVyO3RoaXMuX2Zvcm1hdHRlcj11O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmV4cGFuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXhwYW5kc307cS5fZW5zdXJlT3JpZW50YXRpb249ZnVuY3Rpb24odSl7dT11LnRvTG93ZXJDYXNlKCk7aWYoImhvcml6b250YWwiPT09dXx8ImxlZnQiPT09dXx8InJpZ2h0Ij09PXUpcmV0dXJuIHU7dGhyb3cgRXJyb3IoJyInK3UrJyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIEludGVycG9sYXRlZENvbG9yTGVnZW5kJyk7fTtxLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih1KXtpZihudWxsPT0KdSlyZXR1cm4gdGhpcy5fb3JpZW50YXRpb247dGhpcy5fb3JpZW50YXRpb249cS5fZW5zdXJlT3JpZW50YXRpb24odSk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmV4cGFuZHMoKXx8dGhpcy5faXNWZXJ0aWNhbCgpfTtxLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmV4cGFuZHMoKXx8IXRoaXMuX2lzVmVydGljYWwoKX07cS5wcm90b3R5cGUuX2dlbmVyYXRlVGlja3M9ZnVuY3Rpb24odSl7dm9pZCAwPT09dSYmKHU9cS5fREVGQVVMVF9OVU1fU1dBVENIRVMpO3ZhciB4PXRoaXMuX3NjYWxlLmRvbWFpbigpO2lmKDE9PT11KXJldHVyblt4WzBdXTtmb3IodmFyIEE9KHhbMV0teFswXSkvKHUtMSkseT1bXSx3PTA7dzx1O3crKyl5LnB1c2goeFswXStBKncpO3JldHVybiB5fTtxLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5fc3dhdGNoQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInN3YXRjaC1jb250YWluZXIiLCEwKTt0aGlzLl9zd2F0Y2hCb3VuZGluZ0JveD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2gtYm91bmRpbmctYm94IiwhMCk7dGhpcy5fbG93ZXJMYWJlbD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuTEVHRU5EX0xBQkVMX0NMQVNTLCEwKTt0aGlzLl91cHBlckxhYmVsPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQocS5MRUdFTkRfTEFCRUxfQ0xBU1MsITApO3ZhciB1PW5ldyB0LlN2Z0NvbnRleHQodGhpcy5jb250ZW50KCkubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgdC5NZWFzdXJlcih1KTt0aGlzLl93cmFwcGVyPW5ldyB0LldyYXBwZXI7dGhpcy5fd3JpdGVyPW5ldyB0LldyaXRlcih0aGlzLl9tZWFzdXJlcix1LHRoaXMuX3dyYXBwZXIpfTtxLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT0KZnVuY3Rpb24oKXt2YXIgdT10aGlzLHg9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCxBPXRoaXMuX3NjYWxlLmRvbWFpbigpLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gdS5fbWVhc3VyZXIubWVhc3VyZSh1Ll9mb3JtYXR0ZXIoQykpLndpZHRofSkseT1xLl9ERUZBVUxUX05VTV9TV0FUQ0hFUztpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3ZhciB3PW0uTWF0aC5tYXgoQSwwKTtBPXgreCt0aGlzLl90ZXh0UGFkZGluZyt3K3RoaXMuX3RleHRQYWRkaW5nO3c9eSp4fWVsc2Ugdz14K3greCxBPXRoaXMuX3RleHRQYWRkaW5nK0FbMF0reSp4K0FbMV0rdGhpcy5fdGV4dFBhZGRpbmc7cmV0dXJue21pbldpZHRoOkEsbWluSGVpZ2h0Ond9fTtxLnByb3RvdHlwZS5faXNWZXJ0aWNhbD1mdW5jdGlvbigpe3JldHVybiJob3Jpem9udGFsIiE9PXRoaXMuX29yaWVudGF0aW9ufTtxLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB1PXRoaXM7bi5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTsKdmFyIHg9dGhpcy5fc2NhbGUuZG9tYWluKCksQT10aGlzLl9mb3JtYXR0ZXIoeFswXSkseT10aGlzLl9tZWFzdXJlci5tZWFzdXJlKEEpLndpZHRoLHc9dGhpcy5fZm9ybWF0dGVyKHhbMV0pO3g9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSh3KS53aWR0aDt2YXIgQz10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEY9dGhpcy5fdGV4dFBhZGRpbmcsRD0wLEI9MCxJPTAsTj0wLE89e3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciIsdGV4dFJvdGF0aW9uOjB9LEg9e3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciIsdGV4dFJvdGF0aW9uOjB9LEs9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH07aWYodGhpcy5faXNWZXJ0aWNhbCgpKXt2YXIgTT1NYXRoLmZsb29yKHRoaXMuaGVpZ2h0KCkpO3ZhciBMPU1hdGgubWF4KHkseCk7dmFyIFE9KHRoaXMud2lkdGgoKS1MLTIqdGhpcy5fdGV4dFBhZGRpbmcpLzI7eD1NYXRoLm1heCh0aGlzLndpZHRoKCktUS0yKkYtTCwwKTsKQz0xO3ZhciBUPWZ1bmN0aW9uKGFhLGxhKXtyZXR1cm4gdS5oZWlnaHQoKS0obGErMSl9O0gueUFsaWduPSJ0b3AiO0I9MDtPLnlBbGlnbj0iYm90dG9tIjtOPTA7aWYoImxlZnQiPT09dGhpcy5fb3JpZW50YXRpb24pe3ZhciBYPWZ1bmN0aW9uKCl7cmV0dXJuIEYrTCtGfTtILnhBbGlnbj0icmlnaHQiO0Q9LShRK3grRik7Ty54QWxpZ249InJpZ2h0IjtJPS0oUSt4K0YpfWVsc2UgWD1mdW5jdGlvbigpe3JldHVybiBRfSxILnhBbGlnbj0ibGVmdCIsRD1RK3grRixPLnhBbGlnbj0ibGVmdCIsST1RK3grRjtLLndpZHRoPXg7Sy5oZWlnaHQ9TSpDfWVsc2UgUT1NYXRoLm1heChGLCh0aGlzLmhlaWdodCgpLUMpLzIpLE09TWF0aC5tYXgoTWF0aC5mbG9vcih0aGlzLndpZHRoKCktNCpGLXkteCksMCkseD0xLEM9TWF0aC5tYXgodGhpcy5oZWlnaHQoKS0yKlEsMCksWD1mdW5jdGlvbihhYSxsYSl7cmV0dXJuIE1hdGguZmxvb3IoeSsyKkYpK2xhfSxUPWZ1bmN0aW9uKCl7cmV0dXJuIFF9LApILnhBbGlnbj0icmlnaHQiLEQ9LUYsTy54QWxpZ249ImxlZnQiLEk9RixLLnk9USxLLndpZHRoPU0qeCxLLmhlaWdodD1DO0sueD1YKG51bGwsMCk7dGhpcy5fdXBwZXJMYWJlbC50ZXh0KCIiKTt0aGlzLl93cml0ZXIud3JpdGUodyx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxILHRoaXMuX3VwcGVyTGFiZWwubm9kZSgpKTt0aGlzLl91cHBlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QrIiwgIitCKyIpIik7dGhpcy5fbG93ZXJMYWJlbC50ZXh0KCIiKTt0aGlzLl93cml0ZXIud3JpdGUoQSx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxPLHRoaXMuX2xvd2VyTGFiZWwubm9kZSgpKTt0aGlzLl9sb3dlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0krIiwgIitOKyIpIik7dGhpcy5fc3dhdGNoQm91bmRpbmdCb3guYXR0cnMoSyk7QT10aGlzLl9nZW5lcmF0ZVRpY2tzKE0pO0E9dGhpcy5fc3dhdGNoQ29udGFpbmVyLnNlbGVjdEFsbCgicmVjdC5zd2F0Y2giKS5kYXRhKEEpOwp3PUEuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2giLCEwKTtEPUEubWVyZ2Uodyk7QS5leGl0KCkucmVtb3ZlKCk7RC5hdHRycyh7ZmlsbDpmdW5jdGlvbihhYSl7cmV0dXJuIHUuX3NjYWxlLnNjYWxlKGFhKX0sd2lkdGg6eCxoZWlnaHQ6Qyx4OlgseTpULCJzaGFwZS1yZW5kZXJpbmciOiJjcmlzcEVkZ2VzIn0pO2wuQUREX1RJVExFX0VMRU1FTlRTJiZ3LmFwcGVuZCgidGl0bGUiKS50ZXh0KGZ1bmN0aW9uKGFhKXtyZXR1cm4gdS5fZm9ybWF0dGVyKGFhKX0pO3JldHVybiB0aGlzfTtyZXR1cm4gcX0oaCg0KS5Db21wb25lbnQpO2QuX0RFRkFVTFRfTlVNX1NXQVRDSEVTPTExO2QuTEVHRU5EX0xBQkVMX0NMQVNTPSJsZWdlbmQtbGFiZWwiO2YuSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmCihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0sdD1oKDUpO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtLG4pe3ZvaWQgMD09PW0mJihtPSIiKTt2b2lkIDA9PT1uJiYobj0wKTt2YXIgcT1sLmNhbGwodGhpcyl8fHRoaXM7cS5hZGRDbGFzcygibGFiZWwiKTtxLnRleHQobSk7cS5hbmdsZShuKTtxLnhBbGlnbm1lbnQoImNlbnRlciIpLnlBbGlnbm1lbnQoImNlbnRlciIpO3EuX3BhZGRpbmc9MDtyZXR1cm4gcX1rKHAsbCk7cC5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24oKXt2YXIgbT10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHRoaXMuX3RleHQpLG49KDA9PT10aGlzLmFuZ2xlKCk/bS53aWR0aDptLmhlaWdodCkrMip0aGlzLnBhZGRpbmcoKTttPSgwPT09dGhpcy5hbmdsZSgpP20uaGVpZ2h0Om0ud2lkdGgpKzIqdGhpcy5wYWRkaW5nKCk7cmV0dXJue21pbldpZHRoOm4sCm1pbkhlaWdodDptfX07cC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fdGV4dENvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKTt2YXIgbT1uZXcgdC5TdmdDb250ZXh0KHRoaXMuX3RleHRDb250YWluZXIubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgdC5DYWNoZU1lYXN1cmVyKG0pO3RoaXMuX3dyYXBwZXI9bmV3IHQuV3JhcHBlcjt0aGlzLl93cml0ZXI9bmV3IHQuV3JpdGVyKHRoaXMuX21lYXN1cmVyLG0sdGhpcy5fd3JhcHBlcik7dGhpcy50ZXh0KHRoaXMuX3RleHQpfTtwLnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uKG0pe2lmKG51bGw9PW0pcmV0dXJuIHRoaXMuX3RleHQ7aWYoInN0cmluZyIhPT10eXBlb2YgbSl0aHJvdyBFcnJvcigiTGFiZWwudGV4dCgpIG9ubHkgdGFrZXMgc3RyaW5ncyBhcyBpbnB1dCIpO3RoaXMuX3RleHQ9bTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5hbmdsZT0KZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fYW5nbGU7bSU9MzYwOzE4MDxtP20tPTM2MDotMTgwPm0mJihtKz0zNjApO2lmKC05MD09PW18fDA9PT1tfHw5MD09PW0pdGhpcy5fYW5nbGU9bTtlbHNlIHRocm93IEVycm9yKG0rIiBpcyBub3QgYSB2YWxpZCBhbmdsZSBmb3IgTGFiZWwiKTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5wYWRkaW5nPWZ1bmN0aW9uKG0pe2lmKG51bGw9PW0pcmV0dXJuIHRoaXMuX3BhZGRpbmc7bT0rbTtpZigwPm0pdGhyb3cgRXJyb3IobSsiIGlzIG5vdCBhIHZhbGlkIHBhZGRpbmcgdmFsdWUuIENhbm5vdCBiZSBsZXNzIHRoYW4gMC4iKTt0aGlzLl9wYWRkaW5nPW07dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfTtwLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfTtwLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT0KZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3RoaXMuX3RleHRDb250YWluZXIuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dmFyIG09dGhpcy5fbWVhc3VyZXIubWVhc3VyZSh0aGlzLl90ZXh0KSxuPU1hdGgubWF4KE1hdGgubWluKCh0aGlzLmhlaWdodCgpLW0uaGVpZ2h0KS8yLHRoaXMucGFkZGluZygpKSwwKTttPU1hdGgubWF4KE1hdGgubWluKCh0aGlzLndpZHRoKCktbS53aWR0aCkvMix0aGlzLnBhZGRpbmcoKSksMCk7dGhpcy5fdGV4dENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIittKyIsIituKyIpIik7bT10aGlzLndpZHRoKCktMiptO249dGhpcy5oZWlnaHQoKS0yKm47dmFyIHE9e3hBbGlnbjp0aGlzLnhBbGlnbm1lbnQoKSx5QWxpZ246dGhpcy55QWxpZ25tZW50KCksdGV4dFJvdGF0aW9uOnRoaXMuYW5nbGUoKX07dGhpcy5fd3JpdGVyLndyaXRlKHRoaXMuX3RleHQsbSxuLHEpO3JldHVybiB0aGlzfTsKcC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHB9KGgoNCkuQ29tcG9uZW50KTtmLkxhYmVsPWQ7aD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7bT1sLmNhbGwodGhpcyxtLG4pfHx0aGlzO20uYWRkQ2xhc3MocC5USVRMRV9MQUJFTF9DTEFTUyk7cmV0dXJuIG19ayhwLGwpO3JldHVybiBwfShkKTtoLlRJVExFX0xBQkVMX0NMQVNTPSJ0aXRsZS1sYWJlbCI7Zi5UaXRsZUxhYmVsPWg7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7bT1sLmNhbGwodGhpcyxtLG4pfHx0aGlzO20uYWRkQ2xhc3MocC5BWElTX0xBQkVMX0NMQVNTKTtyZXR1cm4gbX1rKHAsbCk7cmV0dXJuIHB9KGQpO2QuQVhJU19MQUJFTF9DTEFTUz0iYXhpcy1sYWJlbCI7Zi5BeGlzTGFiZWw9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHwKZnVuY3Rpb24oQSx5KXtmdW5jdGlvbiB3KCl7dGhpcy5jb25zdHJ1Y3Rvcj1BfWZvcih2YXIgQyBpbiB5KXkuaGFzT3duUHJvcGVydHkoQykmJihBW0NdPXlbQ10pO0EucHJvdG90eXBlPW51bGw9PT15P09iamVjdC5jcmVhdGUoeSk6KHcucHJvdG90eXBlPXkucHJvdG90eXBlLG5ldyB3KX0sdD1oKDEpLGw9aCg1KSxwPWgoMjMpLG09aCg4KSxuPWgoMzEpLHE9aCgwKTtkPWgoNCk7dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBKHksdyxDKXt2b2lkIDA9PT15JiYoeT1bXSk7dm9pZCAwPT09dyYmKHc9MCk7dm9pZCAwPT09QyYmKEM9SW5maW5pdHkpO3RoaXMuY29sdW1ucz15O3RoaXMuYm90dG9tUGFkZGluZz13O3RoaXMubWF4V2lkdGg9Q31BLnByb3RvdHlwZS5hZGRDb2x1bW49ZnVuY3Rpb24oeSl7dmFyIHc9eS53aWR0aCxDPXRoaXMuZ2V0V2lkdGhBdmFpbGFibGUoKTt5LndpZHRoPU1hdGgubWluKEMsdyk7dGhpcy5jb2x1bW5zLnB1c2goeSl9O0EucHJvdG90eXBlLmdldEJvdW5kcz0KZnVuY3Rpb24oeSl7Zm9yKHZhciB3PXRoaXMuY29sdW1uc1t5XSxDPTAsRj0wO0Y8eTtGKyspQys9dGhpcy5jb2x1bW5zW0ZdLndpZHRoO3JldHVybnt0b3BMZWZ0Ont4OkMseTowfSxib3R0b21SaWdodDp7eDpDK3cud2lkdGgseTp3LmhlaWdodH19fTtBLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcS5NYXRoLm1heCh0aGlzLmNvbHVtbnMubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5LmhlaWdodH0pLDApK3RoaXMuYm90dG9tUGFkZGluZ307QS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5jb2x1bW5zLnJlZHVjZShmdW5jdGlvbih5LHcpe3JldHVybiB5K3cud2lkdGh9LDApLHRoaXMubWF4V2lkdGgpfTtBLnByb3RvdHlwZS5nZXRXaWR0aEF2YWlsYWJsZT1mdW5jdGlvbigpe3ZhciB5PXRoaXMuZ2V0V2lkdGgoKTtyZXR1cm4gTWF0aC5tYXgodGhpcy5tYXhXaWR0aC15LDApfTtyZXR1cm4gQX0oKSx4PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQSh5LAp3LEMsRil7dm9pZCAwPT09eSYmKHk9SW5maW5pdHkpO3ZvaWQgMD09PXcmJih3PUluZmluaXR5KTt2b2lkIDA9PT1DJiYoQz0wKTt2b2lkIDA9PT1GJiYoRj1bXSk7dGhpcy5tYXhXaWR0aD15O3RoaXMubWF4SGVpZ2h0PXc7dGhpcy5wYWRkaW5nPUM7dGhpcy5yb3dzPUZ9QS5wcm90b3R5cGUuYWRkUm93PWZ1bmN0aW9uKHkpe3kubWF4V2lkdGg9dGhpcy5tYXhXaWR0aC0yKnRoaXMucGFkZGluZzt0aGlzLnJvd3MucHVzaCh5KX07QS5wcm90b3R5cGUuZ2V0Q29sdW1uQm91bmRzPWZ1bmN0aW9uKHksdyl7dmFyIEM9dGhpcy5nZXRSb3dCb3VuZHMoeSk7eT10aGlzLnJvd3NbeV0uZ2V0Qm91bmRzKHcpO3kudG9wTGVmdC54Kz1DLnRvcExlZnQueDt5LmJvdHRvbVJpZ2h0LngrPUMudG9wTGVmdC54O3kudG9wTGVmdC55Kz1DLnRvcExlZnQueTt5LmJvdHRvbVJpZ2h0LnkrPUMudG9wTGVmdC55O3JldHVybiB5fTtBLnByb3RvdHlwZS5nZXRSb3dCb3VuZHM9ZnVuY3Rpb24oeSl7Zm9yKHZhciB3PQp0aGlzLnBhZGRpbmcsQz10aGlzLnBhZGRpbmcsRj0wO0Y8eTtGKyspQys9dGhpcy5yb3dzW0ZdLmdldEhlaWdodCgpO3JldHVybnt0b3BMZWZ0Ont4OncseTpDfSxib3R0b21SaWdodDp7eDp3K3RoaXMucm93c1t5XS5nZXRXaWR0aCgpLHk6Qyt0aGlzLnJvd3NbeV0uZ2V0SGVpZ2h0KCl9fX07QS5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKHRoaXMucm93cy5yZWR1Y2UoZnVuY3Rpb24oeSx3KXtyZXR1cm4geSt3LmdldEhlaWdodCgpfSwwKSsyKnRoaXMucGFkZGluZyx0aGlzLm1heEhlaWdodCl9O0EucHJvdG90eXBlLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKHEuTWF0aC5tYXgodGhpcy5yb3dzLm1hcChmdW5jdGlvbih5KXtyZXR1cm4geS5nZXRXaWR0aCgpfSksMCkrMip0aGlzLnBhZGRpbmcsdGhpcy5tYXhXaWR0aCl9O3JldHVybiBBfSgpO2Q9ZnVuY3Rpb24oQSl7ZnVuY3Rpb24geSh3KXt2YXIgQz1BLmNhbGwodGhpcyl8fAp0aGlzO0MuX3BhZGRpbmc9NTtDLl9yb3dCb3R0b21QYWRkaW5nPTM7Qy5hZGRDbGFzcygibGVnZW5kIik7Qy5tYXhFbnRyaWVzUGVyUm93KDEpO2lmKG51bGw9PXcpdGhyb3cgRXJyb3IoIkxlZ2VuZCByZXF1aXJlcyBhIGNvbG9yU2NhbGUiKTtDLl9jb2xvclNjYWxlPXc7Qy5fcmVkcmF3Q2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gQy5yZWRyYXcoKX07Qy5fY29sb3JTY2FsZS5vblVwZGF0ZShDLl9yZWRyYXdDYWxsYmFjayk7Qy5fZm9ybWF0dGVyPW0uaWRlbnRpdHkoKTtDLm1heExpbmVzUGVyRW50cnkoMSk7Qy54QWxpZ25tZW50KCJyaWdodCIpLnlBbGlnbm1lbnQoInRvcCIpO0MuY29tcGFyYXRvcihmdW5jdGlvbihGLEQpe3ZhciBCPUMuX2NvbG9yU2NhbGUuZG9tYWluKCkuc2xpY2UoKS5tYXAoZnVuY3Rpb24oSSl7cmV0dXJuIEMuX2Zvcm1hdHRlcihJKX0pO3JldHVybiBCLmluZGV4T2YoRiktQi5pbmRleE9mKEQpfSk7Qy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yPWZ1bmN0aW9uKCl7cmV0dXJuIG4uY2lyY2xlKCl9OwpDLl9zeW1ib2xPcGFjaXR5QWNjZXNzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gMX07cmV0dXJuIEN9ayh5LEEpO3kucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe0EucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3ZhciB3PXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfUk9XX0NMQVNTLCEwKTt3LmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfRU5UUllfQ0xBU1MsITApLmFwcGVuZCgidGV4dCIpO3c9bmV3IGwuU3ZnQ29udGV4dCh3Lm5vZGUoKSxudWxsLHAuQUREX1RJVExFX0VMRU1FTlRTKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHcpO3RoaXMuX3dyYXBwZXI9KG5ldyBsLldyYXBwZXIpLm1heExpbmVzKHRoaXMubWF4TGluZXNQZXJFbnRyeSgpKTt0aGlzLl93cml0ZXI9bmV3IGwuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHcsdGhpcy5fd3JhcHBlcil9O3kucHJvdG90eXBlLmZvcm1hdHRlcj1mdW5jdGlvbih3KXtpZihudWxsPT0KdylyZXR1cm4gdGhpcy5fZm9ybWF0dGVyO3RoaXMuX2Zvcm1hdHRlcj13O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3kucHJvdG90eXBlLm1heEVudHJpZXNQZXJSb3c9ZnVuY3Rpb24odyl7aWYobnVsbD09dylyZXR1cm4gdGhpcy5fbWF4RW50cmllc1BlclJvdzt0aGlzLl9tYXhFbnRyaWVzUGVyUm93PXc7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUubWF4TGluZXNQZXJFbnRyeT1mdW5jdGlvbih3KXtpZihudWxsPT13KXJldHVybiB0aGlzLl9tYXhMaW5lc1BlckVudHJ5O3RoaXMuX21heExpbmVzUGVyRW50cnk9dzt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt5LnByb3RvdHlwZS5tYXhXaWR0aD1mdW5jdGlvbih3KXtpZihudWxsPT13KXJldHVybiB0aGlzLl9tYXhXaWR0aDt0aGlzLl9tYXhXaWR0aD13O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3kucHJvdG90eXBlLmNvbXBhcmF0b3I9ZnVuY3Rpb24odyl7bnVsbCE9dyYmKHRoaXMuX2NvbXBhcmF0b3I9CncsdGhpcy5yZWRyYXcoKSl9O3kucHJvdG90eXBlLmNvbG9yU2NhbGU9ZnVuY3Rpb24odyl7cmV0dXJuIG51bGwhPXc/KHRoaXMuX2NvbG9yU2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlZHJhd0NhbGxiYWNrKSx0aGlzLl9jb2xvclNjYWxlPXcsdGhpcy5fY29sb3JTY2FsZS5vblVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayksdGhpcy5yZWRyYXcoKSx0aGlzKTp0aGlzLl9jb2xvclNjYWxlfTt5LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7QS5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX2NvbG9yU2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlZHJhd0NhbGxiYWNrKX07eS5wcm90b3R5cGUuX2J1aWxkTGVnZW5kVGFibGU9ZnVuY3Rpb24odyxDKXt2YXIgRj10aGlzLEQ9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCxCPW5ldyB4KHcsQyx0aGlzLl9wYWRkaW5nKTt3PXRoaXMuX2NvbG9yU2NhbGUuZG9tYWluKCkuc2xpY2UoKS5zb3J0KGZ1bmN0aW9uKE4sCk8pe3JldHVybiBGLl9jb21wYXJhdG9yKEYuX2Zvcm1hdHRlcihOKSxGLl9mb3JtYXR0ZXIoTykpfSk7dmFyIEk9bmV3IHU7Qi5hZGRSb3coSSk7SS5ib3R0b21QYWRkaW5nPXRoaXMuX3Jvd0JvdHRvbVBhZGRpbmc7dy5mb3JFYWNoKGZ1bmN0aW9uKE4pe0kuY29sdW1ucy5sZW5ndGgvMj09PUYubWF4RW50cmllc1BlclJvdygpJiYoST1uZXcgdSxJLmJvdHRvbVBhZGRpbmc9Ri5fcm93Qm90dG9tUGFkZGluZyxCLmFkZFJvdyhJKSk7dmFyIE89SS5nZXRXaWR0aEF2YWlsYWJsZSgpLEg9Ri5fZm9ybWF0dGVyKE4pLEs9Ri5fbWVhc3VyZXIubWVhc3VyZShIKS53aWR0aDswPk8tRC1LJiYxPEkuY29sdW1ucy5sZW5ndGgmJihJPW5ldyB1LEkuYm90dG9tUGFkZGluZz1GLl9yb3dCb3R0b21QYWRkaW5nLEIuYWRkUm93KEkpKTtJLmFkZENvbHVtbih7d2lkdGg6RCxoZWlnaHQ6RCxkYXRhOntuYW1lOk4sdHlwZToic3ltYm9sIn19KTtPPUkuZ2V0V2lkdGhBdmFpbGFibGUoKTtPPU1hdGgubWluKE8sCkspO0YuX3dyYXBwZXIubWF4TGluZXMoRi5tYXhMaW5lc1BlckVudHJ5KCkpO0g9Ri5fd3JhcHBlci53cmFwKEgsRi5fbWVhc3VyZXIsTykubm9MaW5lcypEO0kuYWRkQ29sdW1uKHt3aWR0aDpPLGhlaWdodDpILGRhdGE6e25hbWU6Tix0eXBlOiJ0ZXh0In19KX0pO3JldHVybiBCfTt5LnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih3LEMpe3c9dGhpcy5fYnVpbGRMZWdlbmRUYWJsZShxLk1hdGgubWluKFt0aGlzLm1heFdpZHRoKCksd10sdyksQyk7cmV0dXJue21pbkhlaWdodDp3LmdldEhlaWdodCgpLG1pbldpZHRoOncuZ2V0V2lkdGgoKX19O3kucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24odyl7dmFyIEM9dGhpcztpZighdGhpcy5faXNTZXR1cClyZXR1cm5bXTt2YXIgRj10aGlzLl9idWlsZExlZ2VuZFRhYmxlKHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKTtyZXR1cm4gRi5yb3dzLnJlZHVjZShmdW5jdGlvbihELEIsSSl7aWYoMCE9PUQubGVuZ3RoKXJldHVybiBEOwp2YXIgTj1GLmdldFJvd0JvdW5kcyhJKTtyZXR1cm4gcS5NYXRoLndpdGhpbih3LE4pP0IuY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24oTyxILEspe3ZhciBNPUYuZ2V0Q29sdW1uQm91bmRzKEksSyk7aWYocS5NYXRoLndpdGhpbih3LE0pKXtPPUMuY29udGVudCgpLnNlbGVjdEFsbCgiLiIreS5MRUdFTkRfUk9XX0NMQVNTKS5ub2RlcygpW0ldO0s9dC5zZWxlY3QoTykuc2VsZWN0QWxsKCIuIit5LkxFR0VORF9FTlRSWV9DTEFTUykubm9kZXMoKVtNYXRoLmZsb29yKEsvMildO3ZhciBMPXQuc2VsZWN0KEspLnNlbGVjdCgiLiIreS5MRUdFTkRfU1lNQk9MX0NMQVNTKTtNPXEuRE9NLmdldFRyYW5zbGF0ZVZhbHVlcyh0LnNlbGVjdChPKSk7TD1xLkRPTS5nZXRUcmFuc2xhdGVWYWx1ZXMoTCk7cmV0dXJuW3tib3VuZHM6cS5ET00uZWxlbWVudEJCb3godC5zZWxlY3QoTykpLGRhdHVtOkguZGF0YS5uYW1lLHBvc2l0aW9uOnt4Ok1bMF0rTFswXSx5Ok1bMV0rTFsxXX0sc2VsZWN0aW9uOnQuc2VsZWN0KEspLApjb21wb25lbnQ6Q31dfXJldHVybiBPfSxEKTpEfSxbXSl9O3kucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7QS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgdz10aGlzLl9idWlsZExlZ2VuZFRhYmxlKHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKTt0aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTt2YXIgQz10aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoImcuIit5LkxFR0VORF9ST1dfQ0xBU1MpLmRhdGEody5yb3dzKSxGPUMuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKHkuTEVHRU5EX1JPV19DTEFTUywhMCkubWVyZ2UoQyk7Qy5leGl0KCkucmVtb3ZlKCk7Ri5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKEIsSSl7Qj13LmdldFJvd0JvdW5kcyhJKTtyZXR1cm4idHJhbnNsYXRlKCIrQi50b3BMZWZ0LngrIiwgIitCLnRvcExlZnQueSsiKSJ9KTt2YXIgRD10aGlzO0YuZWFjaChmdW5jdGlvbihCLEkpe2Zvcih2YXIgTj0KW10sTz0wO088Qi5jb2x1bW5zLmxlbmd0aDtPKz0yKU4ucHVzaChbQi5jb2x1bW5zW09dLEIuY29sdW1uc1tPKzFdXSk7Qj10LnNlbGVjdCh0aGlzKS5zZWxlY3RBbGwoImcuIit5LkxFR0VORF9FTlRSWV9DTEFTUykuZGF0YShOKTtOPUIuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKHkuTEVHRU5EX0VOVFJZX0NMQVNTLCEwKS5tZXJnZShCKTtOLmFwcGVuZCgicGF0aCIpLmF0dHIoImQiLGZ1bmN0aW9uKEgpe0g9SFswXTtyZXR1cm4gRC5zeW1ib2woKShILmRhdGEubmFtZSxJKSguNipILmhlaWdodCkobnVsbCl9KS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKEgpe0g9SFswXTtyZXR1cm4idHJhbnNsYXRlKCIrKHcuZ2V0Q29sdW1uQm91bmRzKEksdy5yb3dzW0ldLmNvbHVtbnMuaW5kZXhPZihIKSkudG9wTGVmdC54K0gud2lkdGgvMikrIiwgIitILmhlaWdodC8yKyIpIn0pLmF0dHIoImZpbGwiLGZ1bmN0aW9uKEgpe3JldHVybiBELl9jb2xvclNjYWxlLnNjYWxlKEhbMF0uZGF0YS5uYW1lKX0pLmF0dHIoIm9wYWNpdHkiLApmdW5jdGlvbihIKXtyZXR1cm4gRC5zeW1ib2xPcGFjaXR5KCkoSFswXS5kYXRhLm5hbWUsSSl9KS5jbGFzc2VkKHkuTEVHRU5EX1NZTUJPTF9DTEFTUywhMCk7Ti5hcHBlbmQoImciKS5jbGFzc2VkKCJ0ZXh0LWNvbnRhaW5lciIsITApLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oSCl7cmV0dXJuInRyYW5zbGF0ZSgiK3cuZ2V0Q29sdW1uQm91bmRzKEksdy5yb3dzW0ldLmNvbHVtbnMuaW5kZXhPZihIWzFdKSkudG9wTGVmdC54KyIsIDApIn0pLmVhY2goZnVuY3Rpb24oSCl7dmFyIEs9dC5zZWxlY3QodGhpcyk7SD1IWzFdO0QuX3dyaXRlci53cml0ZShELl9mb3JtYXR0ZXIoSC5kYXRhLm5hbWUpLEgud2lkdGgsRC5oZWlnaHQoKSx7eEFsaWduOiJsZWZ0Iix5QWxpZ246InRvcCIsdGV4dFJvdGF0aW9uOjB9LEsubm9kZSgpKX0pO0IuZXhpdCgpLnJlbW92ZSgpfSk7cmV0dXJuIHRoaXN9O3kucHJvdG90eXBlLnN5bWJvbD1mdW5jdGlvbih3KXtpZihudWxsPT13KXJldHVybiB0aGlzLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I7CnRoaXMuX3N5bWJvbEZhY3RvcnlBY2Nlc3Nvcj13O3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3kucHJvdG90eXBlLnN5bWJvbE9wYWNpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3ltYm9sT3BhY2l0eUFjY2Vzc29yfTt5LnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3kucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O3kucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiB5fShkLkNvbXBvbmVudCk7ZC5MRUdFTkRfUk9XX0NMQVNTPSJsZWdlbmQtcm93IjtkLkxFR0VORF9FTlRSWV9DTEFTUz0ibGVnZW5kLWVudHJ5IjtkLkxFR0VORF9TWU1CT0xfQ0xBU1M9ImxlZ2VuZC1zeW1ib2wiO2YuTGVnZW5kPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgyKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7cmV0dXJuIG51bGwhPT1wJiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKG0scCk7bS5wcm90b3R5cGUuZW50aXR5TmVhcmVzdD1mdW5jdGlvbihuKXt2YXIgcSx1PUluZmluaXR5O3RoaXMuY29tcG9uZW50cygpLmZvckVhY2goZnVuY3Rpb24oeCl7eD14LmVudGl0eU5lYXJlc3Qobik7aWYobnVsbCE9eCl7dmFyIEE9bC5NYXRoLmRpc3RhbmNlU3F1YXJlZCh4LnBvc2l0aW9uLG4pO0E8PXUmJih1PUEscT14KX19KTtyZXR1cm4gcX07bS5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKG4pe2lmKG51bGwhPW4mJiEobiBpbnN0YW5jZW9mIHQuUGxvdCkpdGhyb3cgRXJyb3IoIlBsb3QgR3JvdXAgb25seSBhY2NlcHRzIHBsb3RzIik7CnAucHJvdG90eXBlLmFwcGVuZC5jYWxsKHRoaXMsbik7cmV0dXJuIHRoaXN9O3JldHVybiBtfShoKDQxKS5Hcm91cCk7Zi5QbG90R3JvdXA9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2b2lkIDA9PT1uJiYobj1bXSk7dmFyIHE9cC5jYWxsKHRoaXMpfHx0aGlzO3EuX3Jvd1BhZGRpbmc9MDtxLl9jb2x1bW5QYWRkaW5nPTA7cS5fcm93cz1bXTtxLl9yb3dXZWlnaHRzPVtdO3EuX2NvbHVtbldlaWdodHM9W107cS5fblJvd3M9MDtxLl9uQ29scz0wO3EuX2NhbGN1bGF0ZWRMYXlvdXQ9Cm51bGw7cS5hZGRDbGFzcygidGFibGUiKTtuLmZvckVhY2goZnVuY3Rpb24odSx4KXt1LmZvckVhY2goZnVuY3Rpb24oQSx5KXtudWxsIT1BJiZxLmFkZChBLHgseSl9KX0pO3JldHVybiBxfWsobSxwKTttLnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKyludWxsIT10aGlzLl9yb3dzW3FdW3VdJiZuKHRoaXMuX3Jvd3NbcV1bdV0pfTttLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24obil7Zm9yKHZhciBxPTA7cTx0aGlzLl9uUm93cztxKyspZm9yKHZhciB1PTA7dTx0aGlzLl9uQ29sczt1KyspaWYodGhpcy5fcm93c1txXVt1XT09PW4pcmV0dXJuITA7cmV0dXJuITF9O20ucHJvdG90eXBlLmNvbXBvbmVudEF0PWZ1bmN0aW9uKG4scSl7cmV0dXJuIDA+bnx8bj49dGhpcy5fblJvd3N8fDA+cXx8cT49dGhpcy5fbkNvbHM/bnVsbDp0aGlzLl9yb3dzW25dW3FdfTttLnByb3RvdHlwZS5hZGQ9CmZ1bmN0aW9uKG4scSx1KXtpZihudWxsPT1uKXRocm93IEVycm9yKCJDYW5ub3QgYWRkIG51bGwgdG8gYSB0YWJsZSBjZWxsIik7aWYoIXRoaXMuaGFzKG4pKXtpZihudWxsIT0odGhpcy5fcm93c1txXSYmdGhpcy5fcm93c1txXVt1XSkpdGhyb3cgRXJyb3IoImNlbGwgaXMgb2NjdXBpZWQiKTtuLmRldGFjaCgpO3RoaXMuX25Sb3dzPU1hdGgubWF4KHErMSx0aGlzLl9uUm93cyk7dGhpcy5fbkNvbHM9TWF0aC5tYXgodSsxLHRoaXMuX25Db2xzKTt0aGlzLl9wYWRUYWJsZVRvU2l6ZSh0aGlzLl9uUm93cyx0aGlzLl9uQ29scyk7dGhpcy5fcm93c1txXVt1XT1uO3RoaXMuX2Fkb3B0QW5kQW5jaG9yKG4pO3RoaXMucmVkcmF3KCl9cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24obil7Zm9yKHZhciBxPTA7cTx0aGlzLl9uUm93cztxKyspZm9yKHZhciB1PTA7dTx0aGlzLl9uQ29sczt1KyspaWYodGhpcy5fcm93c1txXVt1XT09PW4pe3RoaXMuX3Jvd3NbcV1bdV09Cm51bGw7cmV0dXJufX07bS5wcm90b3R5cGUuX2l0ZXJhdGVMYXlvdXQ9ZnVuY3Rpb24obixxLHUpe3ZvaWQgMD09PXUmJih1PSExKTt2YXIgeD10aGlzLl9yb3dzLEE9dC50cmFuc3Bvc2UodGhpcy5fcm93cyk7bi09dGhpcy5fY29sdW1uUGFkZGluZyoodGhpcy5fbkNvbHMtMSk7cS09dGhpcy5fcm93UGFkZGluZyoodGhpcy5fblJvd3MtMSk7eD1tLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9yb3dXZWlnaHRzLHgsZnVuY3Rpb24oTCl7cmV0dXJuIG51bGw9PUx8fEwuZml4ZWRIZWlnaHQoKX0pO0E9bS5fY2FsY0NvbXBvbmVudFdlaWdodHModGhpcy5fY29sdW1uV2VpZ2h0cyxBLGZ1bmN0aW9uKEwpe3JldHVybiBudWxsPT1MfHxMLmZpeGVkV2lkdGgoKX0pO3ZhciB5PUEubWFwKGZ1bmN0aW9uKEwpe3JldHVybiAwPT09TD8uNTpMfSksdz14Lm1hcChmdW5jdGlvbihMKXtyZXR1cm4gMD09PUw/LjU6TH0pO3k9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHksbik7dmFyIEM9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHcsCnEpLEY9bC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Db2xzKSxEPWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uUm93cyk7dz0wO2Zvcih2YXIgQixJLE47Oyl7RD1sLkFycmF5LmFkZChELEMpO3k9bC5BcnJheS5hZGQoRix5KTtCPXRoaXMuX2RldGVybWluZUd1YXJhbnRlZXMoeSxELHUpO0Y9Qi5ndWFyYW50ZWVkV2lkdGhzO0Q9Qi5ndWFyYW50ZWVkSGVpZ2h0cztJPUIud2FudHNXaWR0aEFyci5zb21lKGZ1bmN0aW9uKEwpe3JldHVybiBMfSk7Tj1CLndhbnRzSGVpZ2h0QXJyLnNvbWUoZnVuY3Rpb24oTCl7cmV0dXJuIEx9KTt2YXIgTz1LLEg9TTt2YXIgSz1uLXQuc3VtKEIuZ3VhcmFudGVlZFdpZHRocyk7dmFyIE09cS10LnN1bShCLmd1YXJhbnRlZWRIZWlnaHRzKTt5PXZvaWQgMDtJPyh5PUIud2FudHNXaWR0aEFyci5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIEw/LjE6MH0pLHk9bC5BcnJheS5hZGQoeSxBKSk6eT1BO0M9dm9pZCAwO04/KEM9Qi53YW50c0hlaWdodEFyci5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIEw/Ci4xOjB9KSxDPWwuQXJyYXkuYWRkKEMseCkpOkM9eDt5PW0uX2NhbGNQcm9wb3J0aW9uYWxTcGFjZSh5LEspO0M9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKEMsTSk7dysrO0g9MDxNJiZNIT09SDtpZighKDA8SyYmSyE9PU98fEgpKWJyZWFrO2lmKDU8dylicmVha31LPW4tdC5zdW0oQi5ndWFyYW50ZWVkV2lkdGhzKTtNPXEtdC5zdW0oQi5ndWFyYW50ZWVkSGVpZ2h0cyk7eT1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoQSxLKTtDPW0uX2NhbGNQcm9wb3J0aW9uYWxTcGFjZSh4LE0pO3JldHVybntjb2xQcm9wb3J0aW9uYWxTcGFjZTp5LHJvd1Byb3BvcnRpb25hbFNwYWNlOkMsZ3VhcmFudGVlZFdpZHRoczpCLmd1YXJhbnRlZWRXaWR0aHMsZ3VhcmFudGVlZEhlaWdodHM6Qi5ndWFyYW50ZWVkSGVpZ2h0cyx3YW50c1dpZHRoOkksd2FudHNIZWlnaHQ6Tn19O20ucHJvdG90eXBlLl9kZXRlcm1pbmVHdWFyYW50ZWVzPWZ1bmN0aW9uKG4scSx1KXt2b2lkIDA9PT11JiYodT0hMSk7dmFyIHg9CmwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uQ29scyksQT1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fblJvd3MpLHk9bC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSghMSx0aGlzLl9uQ29scyksdz1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KCExLHRoaXMuX25Sb3dzKTt0aGlzLl9yb3dzLmZvckVhY2goZnVuY3Rpb24oQyxGKXtDLmZvckVhY2goZnVuY3Rpb24oRCxCKXtEPW51bGwhPUQ/RC5yZXF1ZXN0ZWRTcGFjZShuW0JdLHFbRl0pOnttaW5XaWR0aDowLG1pbkhlaWdodDowfTt4W0JdPU1hdGgubWF4KHhbQl0sdT9NYXRoLm1pbihELm1pbldpZHRoLG5bQl0pOkQubWluV2lkdGgpO0FbRl09TWF0aC5tYXgoQVtGXSx1P01hdGgubWluKEQubWluSGVpZ2h0LHFbRl0pOkQubWluSGVpZ2h0KTt2YXIgST1ELm1pbldpZHRoPm5bQl07eVtCXT15W0JdfHxJO0I9RC5taW5IZWlnaHQ+cVtGXTt3W0ZdPXdbRl18fEJ9KX0pO3JldHVybntndWFyYW50ZWVkV2lkdGhzOngsCmd1YXJhbnRlZWRIZWlnaHRzOkEsd2FudHNXaWR0aEFycjp5LHdhbnRzSGVpZ2h0QXJyOnd9fTttLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbihuLHEpe3RoaXMuX2NhbGN1bGF0ZWRMYXlvdXQ9dGhpcy5faXRlcmF0ZUxheW91dChuLHEpO3JldHVybnttaW5XaWR0aDp0LnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpLG1pbkhlaWdodDp0LnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRIZWlnaHRzKX19O20ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24obixxLHUpe3ZhciB4PXRoaXM7cC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsbixxLHUpO249dC5zdW0odGhpcy5fY2FsY3VsYXRlZExheW91dC5ndWFyYW50ZWVkV2lkdGhzKTtxPXQuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpO3U9dGhpcy5fY2FsY3VsYXRlZExheW91dDtpZihuPnRoaXMud2lkdGgoKXx8CnE+dGhpcy5oZWlnaHQoKSl1PXRoaXMuX2l0ZXJhdGVMYXlvdXQodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCksITApO3ZhciBBPTAseT1sLkFycmF5LmFkZCh1LnJvd1Byb3BvcnRpb25hbFNwYWNlLHUuZ3VhcmFudGVlZEhlaWdodHMpLHc9bC5BcnJheS5hZGQodS5jb2xQcm9wb3J0aW9uYWxTcGFjZSx1Lmd1YXJhbnRlZWRXaWR0aHMpO3RoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihDLEYpe3ZhciBEPTA7Qy5mb3JFYWNoKGZ1bmN0aW9uKEIsSSl7bnVsbCE9QiYmQi5jb21wdXRlTGF5b3V0KHt4OkQseTpBfSx3W0ldLHlbRl0pO0QrPXdbSV0reC5fY29sdW1uUGFkZGluZ30pO0ErPXlbRl0reC5fcm93UGFkZGluZ30pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5yb3dQYWRkaW5nPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3Jvd1BhZGRpbmc7aWYoIWwuTWF0aC5pc1ZhbGlkTnVtYmVyKG4pfHwwPm4pdGhyb3cgRXJyb3IoInJvd1BhZGRpbmcgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTsKdGhpcy5fcm93UGFkZGluZz1uO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmNvbHVtblBhZGRpbmc9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fY29sdW1uUGFkZGluZztpZighbC5NYXRoLmlzVmFsaWROdW1iZXIobil8fDA+bil0aHJvdyBFcnJvcigiY29sdW1uUGFkZGluZyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3RoaXMuX2NvbHVtblBhZGRpbmc9bjt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5yb3dXZWlnaHQ9ZnVuY3Rpb24obixxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9yb3dXZWlnaHRzW25dO2lmKCFsLk1hdGguaXNWYWxpZE51bWJlcihxKXx8MD5xKXRocm93IEVycm9yKCJyb3dXZWlnaHQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTt0aGlzLl9yb3dXZWlnaHRzW25dPXE7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuY29sdW1uV2VpZ2h0PQpmdW5jdGlvbihuLHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX2NvbHVtbldlaWdodHNbbl07aWYoIWwuTWF0aC5pc1ZhbGlkTnVtYmVyKHEpfHwwPnEpdGhyb3cgRXJyb3IoImNvbHVtbldlaWdodCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3RoaXMuX2NvbHVtbldlaWdodHNbbl09cTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7dmFyIG49dC50cmFuc3Bvc2UodGhpcy5fcm93cyk7cmV0dXJuIG0uX2ZpeGVkU3BhY2UobixmdW5jdGlvbihxKXtyZXR1cm4gbnVsbD09cXx8cS5maXhlZFdpZHRoKCl9KX07bS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gbS5fZml4ZWRTcGFjZSh0aGlzLl9yb3dzLGZ1bmN0aW9uKG4pe3JldHVybiBudWxsPT1ufHxuLmZpeGVkSGVpZ2h0KCl9KX07bS5wcm90b3R5cGUuX3BhZFRhYmxlVG9TaXplPWZ1bmN0aW9uKG4scSl7Zm9yKHZhciB1PQowO3U8bjt1Kyspe3ZvaWQgMD09PXRoaXMuX3Jvd3NbdV0mJih0aGlzLl9yb3dzW3VdPVtdLHRoaXMuX3Jvd1dlaWdodHNbdV09bnVsbCk7Zm9yKHZhciB4PTA7eDxxO3grKyl2b2lkIDA9PT10aGlzLl9yb3dzW3VdW3hdJiYodGhpcy5fcm93c1t1XVt4XT1udWxsKX1mb3IoeD0wO3g8cTt4Kyspdm9pZCAwPT09dGhpcy5fY29sdW1uV2VpZ2h0c1t4XSYmKHRoaXMuX2NvbHVtbldlaWdodHNbeF09bnVsbCl9O20uX2NhbGNDb21wb25lbnRXZWlnaHRzPWZ1bmN0aW9uKG4scSx1KXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24oeCxBKXtyZXR1cm4gbnVsbCE9eD94OnFbQV0ubWFwKHUpLnJlZHVjZShmdW5jdGlvbih5LHcpe3JldHVybiB5JiZ3fSwhMCk/MDoxfSl9O20uX2NhbGNQcm9wb3J0aW9uYWxTcGFjZT1mdW5jdGlvbihuLHEpe3ZhciB1PXQuc3VtKG4pO3JldHVybiAwPT09dT9sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsbi5sZW5ndGgpOm4ubWFwKGZ1bmN0aW9uKHgpe3JldHVybiBxKgp4L3V9KX07bS5fZml4ZWRTcGFjZT1mdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoeCl7cmV0dXJuIHgucmVkdWNlKGZ1bmN0aW9uKEEseSl7cmV0dXJuIEEmJnl9LCEwKX1yZXR1cm4gdShuLm1hcChmdW5jdGlvbih4KXtyZXR1cm4gdSh4Lm1hcChxKSl9KSl9O3JldHVybiBtfShoKDI5KS5Db21wb25lbnRDb250YWluZXIpO2YuVGFibGU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHRbbV09bFttXSk7dC5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXt2YXIgcD10LmNhbGwodGhpcyl8fHRoaXM7cC5hZGRDbGFzcygieC1kcmFnLWJveC1sYXllciIpO3AuX2hhc0Nvcm5lcnM9ITE7CnJldHVybiBwfWsobCx0KTtsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKHAsbSxuKXt0LnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxwLG0sbik7dGhpcy5fc2V0Qm91bmRzKHRoaXMuYm91bmRzKCkpO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5fc2V0Qm91bmRzPWZ1bmN0aW9uKHApe3QucHJvdG90eXBlLl9zZXRCb3VuZHMuY2FsbCh0aGlzLHt0b3BMZWZ0Ont4OnAudG9wTGVmdC54LHk6MH0sYm90dG9tUmlnaHQ6e3g6cC5ib3R0b21SaWdodC54LHk6dGhpcy5oZWlnaHQoKX19KX07bC5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24ocCl7cCYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieC1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ4LXJlc2l6YWJsZSIpfTtsLnByb3RvdHlwZS55U2NhbGU9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdC5wcm90b3R5cGUueVNjYWxlLmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoInlTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBYRHJhZ0JveExheWVyIik7Cn07bC5wcm90b3R5cGUueUV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS55RXh0ZW50LmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoIlhEcmFnQm94TGF5ZXIgaGFzIG5vIHlFeHRlbnQiKTt9O3JldHVybiBsfShoKDMyKS5EcmFnQm94TGF5ZXIpO2YuWERyYWdCb3hMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3ZhciBwPXQuY2FsbCh0aGlzKXx8dGhpcztwLmFkZENsYXNzKCJ5LWRyYWctYm94LWxheWVyIik7cC5faGFzQ29ybmVycz0hMTtyZXR1cm4gcH1rKGwsdCk7bC5wcm90b3R5cGUuY29tcHV0ZUxheW91dD0KZnVuY3Rpb24ocCxtLG4pe3QucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHAsbSxuKTt0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24ocCl7dC5wcm90b3R5cGUuX3NldEJvdW5kcy5jYWxsKHRoaXMse3RvcExlZnQ6e3g6MCx5OnAudG9wTGVmdC55fSxib3R0b21SaWdodDp7eDp0aGlzLndpZHRoKCkseTpwLmJvdHRvbVJpZ2h0Lnl9fSl9O2wucHJvdG90eXBlLl9zZXRSZXNpemFibGVDbGFzc2VzPWZ1bmN0aW9uKHApe3AmJnRoaXMuZW5hYmxlZCgpP3RoaXMuYWRkQ2xhc3MoInktcmVzaXphYmxlIik6dGhpcy5yZW1vdmVDbGFzcygieS1yZXNpemFibGUiKX07bC5wcm90b3R5cGUueFNjYWxlPWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHQucHJvdG90eXBlLnhTY2FsZS5jYWxsKHRoaXMpO3Rocm93IEVycm9yKCJ4U2NhbGVzIGNhbm5vdCBiZSBzZXQgb24gYW4gWURyYWdCb3hMYXllciIpOwp9O2wucHJvdG90eXBlLnhFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm90b3R5cGUueEV4dGVudC5jYWxsKHRoaXMpO3Rocm93IEVycm9yKCJZRHJhZ0JveExheWVyIGhhcyBubyB4RXh0ZW50Iik7fTtyZXR1cm4gbH0oaCgzMikuRHJhZ0JveExheWVyKTtmLllEcmFnQm94TGF5ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHRbbV09bFttXSk7dC5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXt2YXIgcD10LmNhbGwodGhpcyl8fHRoaXM7cC5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltsLl9LRVlET1dOX0VWRU5UX05BTUVdPWZ1bmN0aW9uKG0pe3JldHVybiBwLl9wcm9jZXNzS2V5ZG93bihtKX07CnAuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbC5fS0VZVVBfRVZFTlRfTkFNRV09ZnVuY3Rpb24obSl7cmV0dXJuIHAuX3Byb2Nlc3NLZXl1cChtKX07cmV0dXJuIHB9ayhsLHQpO2wuZ2V0RGlzcGF0Y2hlcj1mdW5jdGlvbigpe3ZhciBwPWRvY3VtZW50W2wuX0RJU1BBVENIRVJfS0VZXTtudWxsPT1wJiYocD1uZXcgbCxkb2N1bWVudFtsLl9ESVNQQVRDSEVSX0tFWV09cCk7cmV0dXJuIHB9O2wucHJvdG90eXBlLl9wcm9jZXNzS2V5ZG93bj1mdW5jdGlvbihwKXt0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQobC5fS0VZRE9XTl9FVkVOVF9OQU1FLHAua2V5Q29kZSxwKX07bC5wcm90b3R5cGUuX3Byb2Nlc3NLZXl1cD1mdW5jdGlvbihwKXt0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQobC5fS0VZVVBfRVZFTlRfTkFNRSxwLmtleUNvZGUscCl9O2wucHJvdG90eXBlLm9uS2V5RG93bj1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGwuX0tFWURPV05fRVZFTlRfTkFNRSwKcCl9O2wucHJvdG90eXBlLm9mZktleURvd249ZnVuY3Rpb24ocCl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChsLl9LRVlET1dOX0VWRU5UX05BTUUscCl9O2wucHJvdG90eXBlLm9uS2V5VXA9ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChsLl9LRVlVUF9FVkVOVF9OQU1FLHApfTtsLnByb3RvdHlwZS5vZmZLZXlVcD1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGwuX0tFWVVQX0VWRU5UX05BTUUscCl9O3JldHVybiBsfShoKDI0KS5EaXNwYXRjaGVyKTtkLl9ESVNQQVRDSEVSX0tFWT0iX19QbG90dGFibGVfRGlzcGF0Y2hlcl9LZXkiO2QuX0tFWURPV05fRVZFTlRfTkFNRT0ia2V5ZG93biI7ZC5fS0VZVVBfRVZFTlRfTkFNRT0ia2V5dXAiO2YuS2V5PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJgoobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgwKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSl7ZnVuY3Rpb24gbih1KXtyZXR1cm4gcS5fbWVhc3VyZUFuZERpc3BhdGNoKG0sdSxwLl9NT1VTRU1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfXZhciBxPWwuY2FsbCh0aGlzKXx8dGhpcztxLl9sYXN0TW91c2VQb3NpdGlvbj17eDotMSx5Oi0xfTtxLl90cmFuc2xhdG9yPXQuZ2V0VHJhbnNsYXRvcihtKTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX01PVVNFT1ZFUl9FVkVOVF9OQU1FXT1uO3EuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bcC5fTU9VU0VNT1ZFX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRU9VVF9FVkVOVF9OQU1FXT11PT57Y29uc29sZS5kZWJ1ZygibW9zdWVvdXQiLHUpO24odSl9O3EuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bcC5fTU9VU0VET1dOX0VWRU5UX05BTUVdPQpmdW5jdGlvbih1KXtyZXR1cm4gcS5fbWVhc3VyZUFuZERpc3BhdGNoKG0sdSxwLl9NT1VTRURPV05fRVZFTlRfTkFNRSl9O3EuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bcC5fTU9VU0VVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbih1KXtyZXR1cm4gcS5fbWVhc3VyZUFuZERpc3BhdGNoKG0sdSxwLl9NT1VTRVVQX0VWRU5UX05BTUUsInBhZ2UiKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9XSEVFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbih1KXtyZXR1cm4gcS5fbWVhc3VyZUFuZERpc3BhdGNoKG0sdSxwLl9XSEVFTF9FVkVOVF9OQU1FKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9EQkxDTElDS19FVkVOVF9OQU1FXT1mdW5jdGlvbih1KXtyZXR1cm4gcS5fbWVhc3VyZUFuZERpc3BhdGNoKG0sdSxwLl9EQkxDTElDS19FVkVOVF9OQU1FKX07cmV0dXJuIHF9ayhwLGwpO3AuZ2V0RGlzcGF0Y2hlcj1mdW5jdGlvbihtKXt2YXIgbj1tLnJvb3QoKS5yb290RWxlbWVudCgpLApxPW5bcC5fRElTUEFUQ0hFUl9LRVldO251bGw9PXEmJihxPW5ldyBwKG0pLG5bcC5fRElTUEFUQ0hFUl9LRVldPXEpO3JldHVybiBxfTtwLnByb3RvdHlwZS5vbk1vdXNlTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZNb3VzZU1vdmU9ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9NT1VTRU1PVkVfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25Nb3VzZURvd249ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9NT1VTRURPV05fRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub2ZmTW91c2VEb3duPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VET1dOX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9uTW91c2VVcD1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFVVBfRVZFTlRfTkFNRSwKbSl9O3AucHJvdG90eXBlLm9mZk1vdXNlVXA9ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9NT1VTRVVQX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9uV2hlZWw9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9XSEVFTF9FVkVOVF9OQU1FLG0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5vZmZXaGVlbD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1dIRUVMX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9uRGJsQ2xpY2s9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9EQkxDTElDS19FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZEYmxDbGljaz1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX0RCTENMSUNLX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2g9ZnVuY3Rpb24obSxuLHEsCnUpe3ZvaWQgMD09PXUmJih1PSJlbGVtZW50Iik7aWYoInBhZ2UiIT09dSYmImVsZW1lbnQiIT09dSl0aHJvdyBFcnJvcigiSW52YWxpZCBzY29wZSAnIit1KyInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTtpZigicGFnZSI9PT11fHx0aGlzLmV2ZW50SW5zaWRlKG0sbikpdGhpcy5fbGFzdE1vdXNlUG9zaXRpb249dGhpcy5fdHJhbnNsYXRvci5jb21wdXRlUG9zaXRpb24obi5jbGllbnRYLG4uY2xpZW50WSksdGhpcy5fY2FsbENhbGxiYWNrc0ZvckV2ZW50KHEsdGhpcy5sYXN0TW91c2VQb3NpdGlvbigpLG4pfTtwLnByb3RvdHlwZS5ldmVudEluc2lkZT1mdW5jdGlvbihtLG4pe3JldHVybiB0LlRyYW5zbGF0b3IuaXNFdmVudEluc2lkZShtLG4pfTtwLnByb3RvdHlwZS5sYXN0TW91c2VQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXN0TW91c2VQb3NpdGlvbn07cmV0dXJuIHB9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX01vdXNlIjsKZC5fTU9VU0VPVkVSX0VWRU5UX05BTUU9Im1vdXNlb3ZlciI7ZC5fTU9VU0VNT1ZFX0VWRU5UX05BTUU9Im1vdXNlbW92ZSI7ZC5fTU9VU0VPVVRfRVZFTlRfTkFNRT0ibW91c2VvdXQiO2QuX01PVVNFRE9XTl9FVkVOVF9OQU1FPSJtb3VzZWRvd24iO2QuX01PVVNFVVBfRVZFTlRfTkFNRT0ibW91c2V1cCI7ZC5fV0hFRUxfRVZFTlRfTkFNRT0id2hlZWwiO2QuX0RCTENMSUNLX0VWRU5UX05BTUU9ImRibGNsaWNrIjtmLk1vdXNlPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0sdD1oKDApO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtKXt2YXIgbj1sLmNhbGwodGhpcyl8fAp0aGlzO24uX3RyYW5zbGF0b3I9dC5nZXRUcmFuc2xhdG9yKG0pO24uX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bcC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0scSxwLl9UT1VDSFNUQVJUX0VWRU5UX05BTUUsInBhZ2UiKX07bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRV09ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX21lYXN1cmVBbmREaXNwYXRjaChtLHEscC5fVE9VQ0hNT1ZFX0VWRU5UX05BTUUsInBhZ2UiKX07bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSEVORF9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0scSxwLl9UT1VDSEVORF9FVkVOVF9OQU1FLCJwYWdlIil9O24uX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bcC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRV09ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX21lYXN1cmVBbmREaXNwYXRjaChtLApxLHAuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUUsInBhZ2UiKX07cmV0dXJuIG59ayhwLGwpO3AuZ2V0RGlzcGF0Y2hlcj1mdW5jdGlvbihtKXt2YXIgbj1tLnJvb3QoKS5yb290RWxlbWVudCgpLHE9bltwLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09cSYmKHE9bmV3IHAobSksbltwLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9O3AucHJvdG90eXBlLm9uVG91Y2hTdGFydD1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub2ZmVG91Y2hTdGFydD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25Ub3VjaE1vdmU9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub2ZmVG91Y2hNb3ZlPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hNT1ZFX0VWRU5UX05BTUUsCm0pfTtwLnByb3RvdHlwZS5vblRvdWNoRW5kPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hFTkRfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub2ZmVG91Y2hFbmQ9ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSEVORF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vblRvdWNoQ2FuY2VsPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub2ZmVG91Y2hDYW5jZWw9ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5fbWVhc3VyZUFuZERpc3BhdGNoPWZ1bmN0aW9uKG0sbixxLHUpe3ZvaWQgMD09PXUmJih1PSJlbGVtZW50Iik7aWYoInBhZ2UiIT09dSYmImVsZW1lbnQiIT09dSl0aHJvdyBFcnJvcigiSW52YWxpZCBzY29wZSAnIisKdSsiJywgbXVzdCBiZSAnZWxlbWVudCcgb3IgJ3BhZ2UnIik7aWYoImVsZW1lbnQiIT09dXx8dGhpcy5ldmVudEluc2lkZShtLG4pKXttPW4uY2hhbmdlZFRvdWNoZXM7dT17fTtmb3IodmFyIHg9W10sQT0wO0E8bS5sZW5ndGg7QSsrKXt2YXIgeT1tW0FdLHc9eS5pZGVudGlmaWVyO3k9dGhpcy5fdHJhbnNsYXRvci5jb21wdXRlUG9zaXRpb24oeS5jbGllbnRYLHkuY2xpZW50WSk7bnVsbCE9eSYmKHVbd109eSx4LnB1c2godykpfTA8eC5sZW5ndGgmJnRoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChxLHgsdSxuKX19O3AucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHQuVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlKG0sbil9O3JldHVybiBwfShoKDI0KS5EaXNwYXRjaGVyKTtkLl9ESVNQQVRDSEVSX0tFWT0iX19QbG90dGFibGVfRGlzcGF0Y2hlcl9Ub3VjaCI7ZC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FPSJ0b3VjaHN0YXJ0IjtkLl9UT1VDSE1PVkVfRVZFTlRfTkFNRT0KInRvdWNobW92ZSI7ZC5fVE9VQ0hFTkRfRVZFTlRfTkFNRT0idG91Y2hlbmQiO2QuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUU9InRvdWNoY2FuY2VsIjtmLlRvdWNoPWR9LGZ1bmN0aW9uKGQsZil7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoayx0LGwpe3ZvaWQgMD09PWwmJihsPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTt0aGlzLnNjcmVlbldpZHRoPWs7dGhpcy5zY3JlZW5IZWlnaHQ9dDt0aGlzLmRldmljZVBpeGVsUmF0aW89bDt0aGlzLnBpeGVsV2lkdGg9aypsO3RoaXMucGl4ZWxIZWlnaHQ9dCpsO3RoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3RoaXMuY3R4PXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIik7aC5zaXplUGl4ZWxzKHRoaXMuY3R4LGssdCxsKX1oLnNpemVQaXhlbHM9ZnVuY3Rpb24oayx0LGwscCl7dmFyIG09ay5jYW52YXM7bS53aWR0aD10KnA7bS5oZWlnaHQ9bCpwO20uc3R5bGUud2lkdGg9dCsicHgiO20uc3R5bGUuaGVpZ2h0PQpsKyJweCI7ay5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApO2suc2NhbGUocCxwKX07aC5wcm90b3R5cGUuYmxpdD1mdW5jdGlvbihrLHQsbCl7dm9pZCAwPT09dCYmKHQ9MCk7dm9pZCAwPT09bCYmKGw9MCk7ay5kcmF3SW1hZ2UodGhpcy5jYW52YXMsdCxsLHRoaXMuc2NyZWVuV2lkdGgsdGhpcy5zY3JlZW5IZWlnaHQpfTtoLnByb3RvdHlwZS5ibGl0Q2VudGVyPWZ1bmN0aW9uKGssdCxsKXt2b2lkIDA9PT10JiYodD0wKTt2b2lkIDA9PT1sJiYobD0wKTt0aGlzLmJsaXQoayxNYXRoLmZsb29yKHQtdGhpcy5zY3JlZW5XaWR0aC8yKSxNYXRoLmZsb29yKGwtdGhpcy5zY3JlZW5IZWlnaHQvMikpfTtoLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oayx0LGwpe3ZvaWQgMD09PWwmJihsPSExKTt2YXIgcD10aGlzLmRldmljZVBpeGVsUmF0aW87dGhpcy5zY3JlZW5XaWR0aD1rO3RoaXMuc2NyZWVuSGVpZ2h0PXQ7dGhpcy5waXhlbFdpZHRoPWsqcDt0aGlzLnBpeGVsSGVpZ2h0PXQqcDsKaC5zaXplUGl4ZWxzKHRoaXMuY3R4LGssdCxwKTtsJiZ0aGlzLmN0eC50cmFuc2xhdGUoay8yLGsvMik7cmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKGspe3ZhciB0PXRoaXMucGl4ZWxXaWR0aCxsPXRoaXMucGl4ZWxIZWlnaHQscD10aGlzLmN0eDtwLnNhdmUoKTtwLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7bnVsbD09az9wLmNsZWFyUmVjdCgwLDAsdCxsKToocC5maWxsU3R5bGU9ayxwLmZpbGxSZWN0KDAsMCx0LGwpKTtwLnJlc3RvcmUoKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuZ2V0SW1hZ2VEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmdldEltYWdlRGF0YSgwLDAsdGhpcy5waXhlbFdpZHRoLHRoaXMucGl4ZWxIZWlnaHQpfTtyZXR1cm4gaH0oKTtmLkNhbnZhc0J1ZmZlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9CnB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMTMpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1udWxsIT09cCYmcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7bi5fY2xpY2tlZERvd249ITE7bi5fZG91YmxlQ2xpY2tpbmc9ITE7bi5fb25DbGlja0NhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX21vdXNlRG93bkNhbGxiYWNrPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9oYW5kbGVDbGlja0Rvd24ocSl9O24uX21vdXNlVXBDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVDbGlja1VwKHEsdSl9O24uX2RibENsaWNrQ2FsbGJhY2s9ZnVuY3Rpb24ocSx1KXtyZXR1cm4gbi5faGFuZGxlRGJsQ2xpY2socSwKdSl9O24uX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVDbGlja0Rvd24odVtxWzBdXSl9O24uX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24ocSx1LHgpe3JldHVybiBuLl9oYW5kbGVDbGlja1VwKHVbcVswXV0seCl9O24uX3RvdWNoQ2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbi5fY2xpY2tlZERvd249ITF9O3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKG4pe3AucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLG4pO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj10Lk1vdXNlLmdldERpc3BhdGNoZXIobik7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uRGJsQ2xpY2sodGhpcy5fZGJsQ2xpY2tDYWxsYmFjayk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlcj10LlRvdWNoLmdldERpc3BhdGNoZXIobik7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spfTttLnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VVcCh0aGlzLl9tb3VzZVVwQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZEYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbDt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spOwp0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1udWxsfTttLnByb3RvdHlwZS5faGFuZGxlQ2xpY2tEb3duPWZ1bmN0aW9uKG4pe249dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShuKTt0aGlzLl9pc0luc2lkZUNvbXBvbmVudChuKSYmKHRoaXMuX2NsaWNrZWREb3duPSEwLHRoaXMuX2NsaWNrZWRQb2ludD1uKX07bS5wcm90b3R5cGUuX2hhbmRsZUNsaWNrVXA9ZnVuY3Rpb24obixxKXt2YXIgdT10aGlzLHg9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShuKTt0aGlzLl9jbGlja2VkRG93biYmbS5fcG9pbnRzRXF1YWwoeCx0aGlzLl9jbGlja2VkUG9pbnQpJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dS5fZG91YmxlQ2xpY2tpbmd8fHUuX29uQ2xpY2tDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh4LApxKX0sMCk7dGhpcy5fY2xpY2tlZERvd249ITF9O20ucHJvdG90eXBlLl9oYW5kbGVEYmxDbGljaz1mdW5jdGlvbihuLHEpe3ZhciB1PXRoaXM7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2RvdWJsZUNsaWNraW5nPSEwO3RoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhuLHEpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdS5fZG91YmxlQ2xpY2tpbmc9ITF9LDApfTttLl9wb2ludHNFcXVhbD1mdW5jdGlvbihuLHEpe3JldHVybiBuLng9PT1xLngmJm4ueT09PXEueX07bS5wcm90b3R5cGUub25DbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmQ2xpY2s9ZnVuY3Rpb24obil7dGhpcy5fb25DbGlja0NhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uRG91YmxlQ2xpY2s9ZnVuY3Rpb24obil7dGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5hZGQobil9OwptLnByb3RvdHlwZS5vZmZEb3VibGVDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzLmRlbGV0ZShuKTtyZXR1cm4gdGhpc307cmV0dXJuIG19KGgoMTUpLkludGVyYWN0aW9uKTtmLkNsaWNrPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDEzKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49bnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO24uX2RyYWdnaW5nPSExO24uX2NvbnN0cmFpbmVkVG9Db21wb25lbnQ9ITA7bi5fbW91c2VGaWx0ZXI9bS5fREVGQVVMVF9NT1VTRV9GSUxURVI7Cm4uX2RyYWdTdGFydENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9kcmFnQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX2RyYWdFbmRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fbW91c2VEb3duQ2FsbGJhY2s9ZnVuY3Rpb24ocSx1KXtyZXR1cm4gbi5fc3RhcnREcmFnKHEsdSl9O24uX21vdXNlTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9kb0RyYWcocSl9O24uX21vdXNlVXBDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9lbmREcmFnKHEsdSl9O24uX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX3N0YXJ0RHJhZyh1W3FbMF1dLHgpfTtuLl90b3VjaE1vdmVDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9kb0RyYWcodVtxWzBdXSl9O24uX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24ocSx1LHgpe3JldHVybiBuLl9lbmREcmFnKHVbcVswXV0seCl9O3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS5fYW5jaG9yPQpmdW5jdGlvbihuKXtwLnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcyxuKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9dC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPXQuVG91Y2guZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKX07Cm0ucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3AucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O20ucHJvdG90eXBlLl90cmFuc2xhdGVBbmRDb25zdHJhaW49CmZ1bmN0aW9uKG4pe249dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShuKTtyZXR1cm4gdGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudD97eDpsLk1hdGguY2xhbXAobi54LDAsdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby53aWR0aCgpKSx5OmwuTWF0aC5jbGFtcChuLnksMCx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpKX06bn07bS5wcm90b3R5cGUuX3N0YXJ0RHJhZz1mdW5jdGlvbihuLHEpe3EgaW5zdGFuY2VvZiBNb3VzZUV2ZW50JiYhdGhpcy5fbW91c2VGaWx0ZXIocSl8fChuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UobiksdGhpcy5faXNJbnNpZGVDb21wb25lbnQobikmJihxLnByZXZlbnREZWZhdWx0KCksdGhpcy5fZHJhZ2dpbmc9ITAsdGhpcy5fZHJhZ09yaWdpbj1uLHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4pKSl9O20ucHJvdG90eXBlLl9kb0RyYWc9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ2dpbmcmJgp0aGlzLl9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbix0aGlzLl90cmFuc2xhdGVBbmRDb25zdHJhaW4obikpfTttLnByb3RvdHlwZS5fZW5kRHJhZz1mdW5jdGlvbihuLHEpe3EgaW5zdGFuY2VvZiBNb3VzZUV2ZW50JiYwIT09cS5idXR0b258fCF0aGlzLl9kcmFnZ2luZ3x8KHRoaXMuX2RyYWdnaW5nPSExLHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luLHRoaXMuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbihuKSkpfTttLnByb3RvdHlwZS5jb25zdHJhaW5lZFRvQ29tcG9uZW50PWZ1bmN0aW9uKCl7dGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudD0hMX07bS5wcm90b3R5cGUubW91c2VGaWx0ZXI9ZnVuY3Rpb24obil7MCE9PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLl9tb3VzZUZpbHRlcj1uKX07bS5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZChuKX07Cm0ucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKG4pfTttLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQobik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZChuKX07bS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZShuKX07cmV0dXJuIG19KGgoMTUpLkludGVyYWN0aW9uKTtkLl9ERUZBVUxUX01PVVNFX0ZJTFRFUj1mdW5jdGlvbihwKXtyZXR1cm4gMD09PXAuYnV0dG9ufTtmLkRyYWc9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih1LHgpe2Z1bmN0aW9uIEEoKXt0aGlzLmNvbnN0cnVjdG9yPQp1fWZvcih2YXIgeSBpbiB4KXguaGFzT3duUHJvcGVydHkoeSkmJih1W3ldPXhbeV0pO3UucHJvdG90eXBlPW51bGw9PT14P09iamVjdC5jcmVhdGUoeCk6KEEucHJvdG90eXBlPXgucHJvdG90eXBlLG5ldyBBKX0sdD1oKDEpLGw9aCgxMykscD1oKDMpLG09aCgwKSxuPWgoMjUpO2Q9aCgxNSk7dmFyIHE9aCgyNik7aD1mdW5jdGlvbih1KXtmdW5jdGlvbiB4KEEseSl7dmFyIHc9dS5jYWxsKHRoaXMpfHx0aGlzO3cuX3doZWVsRmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3cuX3doZWVsQ2FsbGJhY2s9ZnVuY3Rpb24oQyxGKXtyZXR1cm4gdy5faGFuZGxlV2hlZWxFdmVudChDLEYpfTt3Ll90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24oQyxGKXtyZXR1cm4gdy5faGFuZGxlVG91Y2hTdGFydChDLEYpfTt3Ll90b3VjaE1vdmVDYWxsYmFjaz1mdW5jdGlvbihDLEYpe3JldHVybiB3Ll9oYW5kbGVQaW5jaChDLEYpfTt3Ll90b3VjaEVuZENhbGxiYWNrPWZ1bmN0aW9uKEMpe3JldHVybiB3Ll9oYW5kbGVUb3VjaEVuZChDKX07CncuX3RvdWNoQ2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oQyl7cmV0dXJuIHcuX2hhbmRsZVRvdWNoRW5kKEMpfTt3Ll9wYW5FbmRDYWxsYmFja3M9bmV3IG0uQ2FsbGJhY2tTZXQ7dy5fem9vbUVuZENhbGxiYWNrcz1uZXcgbS5DYWxsYmFja1NldDt3Ll9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzPW5ldyBtLkNhbGxiYWNrU2V0O3cuX3hTY2FsZXM9bmV3IG0uU2V0O3cuX3lTY2FsZXM9bmV3IG0uU2V0O3cuX2RyYWdJbnRlcmFjdGlvbj1uZXcgbi5EcmFnO3cuX3NldHVwRHJhZ0ludGVyYWN0aW9uKCk7dy5fdG91Y2hJZHM9dC5tYXAoKTt3Ll9taW5Eb21haW5FeHRlbnRzPW5ldyBtLk1hcDt3Ll9tYXhEb21haW5FeHRlbnRzPW5ldyBtLk1hcDt3Ll9taW5Eb21haW5WYWx1ZXM9bmV3IG0uTWFwO3cuX21heERvbWFpblZhbHVlcz1uZXcgbS5NYXA7bnVsbCE9QSYmdy5hZGRYU2NhbGUoQSk7bnVsbCE9eSYmdy5hZGRZU2NhbGUoeSk7cmV0dXJuIHd9ayh4LHUpO3gucHJvdG90eXBlLmRyYWdJbnRlcmFjdGlvbj0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9ufTt4LnByb3RvdHlwZS53aGVlbEZpbHRlcj1mdW5jdGlvbihBKXswIT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX3doZWVsRmlsdGVyPUEpfTt4LnByb3RvdHlwZS5wYW49ZnVuY3Rpb24oQSl7dmFyIHk9dGhpczt0aGlzLnhTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHcpe3cucGFuKHkuX2NvbnN0cmFpbmVkVHJhbnNsYXRpb24odyxBLngpKX0pO3RoaXMueVNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24odyl7dy5wYW4oeS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbih3LEEueSkpfSk7dGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9O3gucHJvdG90eXBlLnpvb209ZnVuY3Rpb24oQSx5LHcpe3ZhciBDPXRoaXM7dm9pZCAwPT09dyYmKHc9ITApO2lmKG51bGwhPXkpe3ZhciBGPXkueDt2YXIgRD15Lnk7dyYmKHRoaXMueFNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oQil7Qj1DLl9jb25zdHJhaW5lZFpvb20oQiwKQSxGKTtGPUIuY2VudGVyUG9pbnQ7QT1CLnpvb21BbW91bnR9KSx0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe0I9Qy5fY29uc3RyYWluZWRab29tKEIsQSxEKTtEPUIuY2VudGVyUG9pbnQ7QT1CLnpvb21BbW91bnR9KSl9dGhpcy54U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgST1CLnJhbmdlKCk7Qi56b29tKEEsbnVsbD09Rj8oSVsxXStJWzBdKS8yOkYpfSk7dGhpcy55U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgST1CLnJhbmdlKCk7Qi56b29tKEEsbnVsbD09RD8oSVsxXStJWzBdKS8yOkQpfSk7dGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCk7cmV0dXJue3pvb21BbW91bnQ6QSxjZW50ZXJWYWx1ZTp7Y2VudGVyWDpGLGNlbnRlclk6RH19fTt4LnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKEEpe3UucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLEEpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyhBKTsKdGhpcy5fbW91c2VEaXNwYXRjaGVyPWwuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25XaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bC5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spfTt4LnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmV2hlZWwodGhpcy5fd2hlZWxDYWxsYmFjayk7CnRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaENhbmNlbCh0aGlzLl90b3VjaENhbmNlbENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbDt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCl9O3gucHJvdG90eXBlLl9oYW5kbGVUb3VjaFN0YXJ0PWZ1bmN0aW9uKEEseSl7Zm9yKHZhciB3PTA7dzxBLmxlbmd0aCYmMj50aGlzLl90b3VjaElkcy5zaXplKCk7dysrKXt2YXIgQz1BW3ddO3RoaXMuX3RvdWNoSWRzLnNldChDLnRvU3RyaW5nKCksdGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZSh5W0NdKSl9fTsKeC5wcm90b3R5cGUuX2hhbmRsZVBpbmNoPWZ1bmN0aW9uKEEseSl7dmFyIHc9dGhpcztpZighKDI+dGhpcy5fdG91Y2hJZHMuc2l6ZSgpKSl7dmFyIEM9dGhpcy5fdG91Y2hJZHMudmFsdWVzKCk7aWYodGhpcy5faXNJbnNpZGVDb21wb25lbnQodGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShDWzBdKSkmJnRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KHRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoQ1sxXSkpKXt2YXIgRj14Ll9wb2ludERpc3RhbmNlKENbMF0sQ1sxXSk7aWYoMCE9PUYpe0EuZm9yRWFjaChmdW5jdGlvbihPKXt3Ll90b3VjaElkcy5oYXMoTy50b1N0cmluZygpKSYmdy5fdG91Y2hJZHMuc2V0KE8udG9TdHJpbmcoKSx3Ll90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHlbT10pKX0pO0E9dGhpcy5fdG91Y2hJZHMudmFsdWVzKCk7dmFyIEQ9eC5fcG9pbnREaXN0YW5jZShBWzBdLEFbMV0pO2lmKDAhPT1EKXt2YXIgQj1GL0QsST1BLm1hcChmdW5jdGlvbihPLApIKXtyZXR1cm57eDooTy54LUNbSF0ueCkvQix5OihPLnktQ1tIXS55KS9CfX0pO0Y9eC5jZW50ZXJQb2ludChDWzBdLENbMV0pO0Y9dGhpcy56b29tKEIsRik7QT1GLmNlbnRlclZhbHVlO3ZhciBOPUYuem9vbUFtb3VudDtGPUEuY2VudGVyWDtBPUEuY2VudGVyWTtEPUMubWFwKGZ1bmN0aW9uKE8sSCl7cmV0dXJue3g6SVtIXS54Kk4rTy54LHk6SVtIXS55Kk4rTy55fX0pO3RoaXMucGFuKHt4OkYtKERbMF0ueCtEWzFdLngpLzIseTpBLShEWzBdLnkrRFsxXS55KS8yfSl9fX19fTt4LmNlbnRlclBvaW50PWZ1bmN0aW9uKEEseSl7cmV0dXJue3g6KE1hdGgubWluKEEueCx5LngpK01hdGgubWF4KEEueCx5LngpKS8yLHk6KE1hdGgubWF4KEEueSx5LnkpK01hdGgubWluKEEueSx5LnkpKS8yfX07eC5fcG9pbnREaXN0YW5jZT1mdW5jdGlvbihBLHkpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coTWF0aC5tYXgoQS54LHkueCktTWF0aC5taW4oQS54LHkueCksMikrTWF0aC5wb3coTWF0aC5tYXgoQS55LAp5LnkpLU1hdGgubWluKEEueSx5LnkpLDIpKX07eC5wcm90b3R5cGUuX2hhbmRsZVRvdWNoRW5kPWZ1bmN0aW9uKEEpe3ZhciB5PXRoaXM7QS5mb3JFYWNoKGZ1bmN0aW9uKHcpe3kuX3RvdWNoSWRzLnJlbW92ZSh3LnRvU3RyaW5nKCkpfSk7MDx0aGlzLl90b3VjaElkcy5zaXplKCkmJnRoaXMuX3pvb21FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfTt4LnByb3RvdHlwZS5faGFuZGxlV2hlZWxFdmVudD1mdW5jdGlvbihBLHkpe3RoaXMuX3doZWVsRmlsdGVyKHkpJiYoQT10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKEEpLHRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KEEpJiYoeS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuem9vbShNYXRoLnBvdygyLCgwIT09eS5kZWx0YVk/eS5kZWx0YVk6eS5kZWx0YVgpKih5LmRlbHRhTW9kZT94Ll9QSVhFTFNfUEVSX0xJTkU6MSkqLjAwMiksQSksdGhpcy5fem9vbUVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCkpKX07eC5wcm90b3R5cGUuX2NvbnN0cmFpbmVkWm9vbT0KZnVuY3Rpb24oQSx5LHcpe3JldHVybiBxLmNvbnN0cmFpbmVkWm9vbShBLHksdyx0aGlzLm1pbkRvbWFpbkV4dGVudChBKSx0aGlzLm1heERvbWFpbkV4dGVudChBKSx0aGlzLm1pbkRvbWFpblZhbHVlKEEpLHRoaXMubWF4RG9tYWluVmFsdWUoQSkpfTt4LnByb3RvdHlwZS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbihBLHkpe3JldHVybiBxLmNvbnN0cmFpbmVkVHJhbnNsYXRpb24oQSx5LHRoaXMubWluRG9tYWluVmFsdWUoQSksdGhpcy5tYXhEb21haW5WYWx1ZShBKSl9O3gucHJvdG90eXBlLl9zZXR1cERyYWdJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3ZhciBBPXRoaXM7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmNvbnN0cmFpbmVkVG9Db21wb25lbnQoKTt2YXIgeTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoZnVuY3Rpb24oKXtyZXR1cm4geT1udWxsfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyhmdW5jdGlvbih3LEMpezI8PUEuX3RvdWNoSWRzLnNpemUoKXx8CihBLnBhbih7eDoobnVsbD09eT93Lng6eS54KS1DLngseToobnVsbD09eT93Lnk6eS55KS1DLnl9KSx5PUMpfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChmdW5jdGlvbigpe3JldHVybiBBLl9wYW5FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfSl9O3gucHJvdG90eXBlLl9ub25MaW5lYXJTY2FsZVdpdGhFeHRlbnRzPWZ1bmN0aW9uKEEpe3JldHVybiBudWxsIT10aGlzLm1pbkRvbWFpbkV4dGVudChBKSYmbnVsbCE9dGhpcy5tYXhEb21haW5FeHRlbnQoQSkmJiEoQSBpbnN0YW5jZW9mIHAuTGluZWFyKSYmIShBIGluc3RhbmNlb2YgcC5UaW1lKX07eC5wcm90b3R5cGUueFNjYWxlcz1mdW5jdGlvbigpe3ZhciBBPVtdO3RoaXMuX3hTY2FsZXMuZm9yRWFjaChmdW5jdGlvbih5KXtBLnB1c2goeSl9KTtyZXR1cm4gQX07eC5wcm90b3R5cGUueVNjYWxlcz1mdW5jdGlvbigpe3ZhciBBPVtdO3RoaXMuX3lTY2FsZXMuZm9yRWFjaChmdW5jdGlvbih5KXtBLnB1c2goeSl9KTsKcmV0dXJuIEF9O3gucHJvdG90eXBlLmFkZFhTY2FsZT1mdW5jdGlvbihBKXt0aGlzLl94U2NhbGVzLmFkZChBKX07eC5wcm90b3R5cGUucmVtb3ZlWFNjYWxlPWZ1bmN0aW9uKEEpe3RoaXMuX3hTY2FsZXMuZGVsZXRlKEEpO3RoaXMuX21pbkRvbWFpbkV4dGVudHMuZGVsZXRlKEEpO3RoaXMuX21heERvbWFpbkV4dGVudHMuZGVsZXRlKEEpO3RoaXMuX21pbkRvbWFpblZhbHVlcy5kZWxldGUoQSk7dGhpcy5fbWF4RG9tYWluVmFsdWVzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuYWRkWVNjYWxlPWZ1bmN0aW9uKEEpe3RoaXMuX3lTY2FsZXMuYWRkKEEpfTt4LnByb3RvdHlwZS5yZW1vdmVZU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feVNjYWxlcy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWF4RG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpOwpyZXR1cm4gdGhpc307eC5wcm90b3R5cGUubWluRG9tYWluRXh0ZW50PWZ1bmN0aW9uKEEpe3JldHVybiB0aGlzLl9taW5Eb21haW5FeHRlbnRzLmdldChBKX07eC5wcm90b3R5cGUubWF4RG9tYWluRXh0ZW50PWZ1bmN0aW9uKEEpe3JldHVybiB0aGlzLl9tYXhEb21haW5FeHRlbnRzLmdldChBKX07eC5wcm90b3R5cGUubWluRG9tYWluVmFsdWU9ZnVuY3Rpb24oQSx5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl9taW5Eb21haW5WYWx1ZXMuZ2V0KEEpO3RoaXMuX21pbkRvbWFpblZhbHVlcy5zZXQoQSx5KTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUubWF4RG9tYWluVmFsdWU9ZnVuY3Rpb24oQSx5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl9tYXhEb21haW5WYWx1ZXMuZ2V0KEEpO3RoaXMuX21heERvbWFpblZhbHVlcy5zZXQoQSx5KTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuc2V0TWluTWF4RG9tYWluVmFsdWVzVG89ZnVuY3Rpb24oQSl7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZShBKTsKdGhpcy5fbWF4RG9tYWluVmFsdWVzLmRlbGV0ZShBKTt2YXIgeT1BLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCksdz15WzFdO3RoaXMubWluRG9tYWluVmFsdWUoQSx5WzBdKTt0aGlzLm1heERvbWFpblZhbHVlKEEsdyk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLm9uUGFuRW5kPWZ1bmN0aW9uKEEpe3RoaXMuX3BhbkVuZENhbGxiYWNrcy5hZGQoQSl9O3gucHJvdG90eXBlLm9mZlBhbkVuZD1mdW5jdGlvbihBKXt0aGlzLl9wYW5FbmRDYWxsYmFja3MuZGVsZXRlKEEpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5vblpvb21FbmQ9ZnVuY3Rpb24oQSl7dGhpcy5fem9vbUVuZENhbGxiYWNrcy5hZGQoQSl9O3gucHJvdG90eXBlLm9mZlpvb21FbmQ9ZnVuY3Rpb24oQSl7dGhpcy5fem9vbUVuZENhbGxiYWNrcy5kZWxldGUoQSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLm9uUGFuWm9vbVVwZGF0ZT1mdW5jdGlvbihBKXt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmFkZChBKTsKcmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLm9mZlBhblpvb21VcGRhdGU9ZnVuY3Rpb24oQSl7dGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5kZWxldGUoQSk7cmV0dXJuIHRoaXN9O3JldHVybiB4fShkLkludGVyYWN0aW9uKTtoLl9QSVhFTFNfUEVSX0xJTkU9MTIwO2YuUGFuWm9vbT1ofSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxMyksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPW51bGwhPT1wJiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztuLl9vdmVyQ29tcG9uZW50PSExO24uX3BvaW50ZXJFbnRlckNhbGxiYWNrcz0KbmV3IGwuQ2FsbGJhY2tTZXQ7bi5fcG9pbnRlck1vdmVDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fcG9pbnRlckV4aXRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24ocSx1KXtyZXR1cm4gbi5faGFuZGxlTW91c2VFdmVudChxLHUpfTtuLl90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24ocSx1LHgpe3JldHVybiBuLl9oYW5kbGVUb3VjaEV2ZW50KHVbcVswXV0seCl9O3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKG4pe3AucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLG4pO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj10Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9dC5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pOwp0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayl9O20ucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3AucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O20ucHJvdG90eXBlLl9oYW5kbGVNb3VzZUV2ZW50PWZ1bmN0aW9uKG4scSl7cT10aGlzLl9tb3VzZURpc3BhdGNoZXIuZXZlbnRJbnNpZGUodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyxxKTt0aGlzLl9oYW5kbGVQb2ludGVyRXZlbnQobixxKX07bS5wcm90b3R5cGUuX2hhbmRsZVRvdWNoRXZlbnQ9ZnVuY3Rpb24obixxKXtxPXRoaXMuX3RvdWNoRGlzcGF0Y2hlci5ldmVudEluc2lkZSh0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLApxKTt0aGlzLl9oYW5kbGVQb2ludGVyRXZlbnQobixxKX07bS5wcm90b3R5cGUuX2hhbmRsZVBvaW50ZXJFdmVudD1mdW5jdGlvbihuLHEpe249dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShuKTt2YXIgdT10aGlzLl9pc0luc2lkZUNvbXBvbmVudChuKTt1JiZxPyh0aGlzLl9vdmVyQ29tcG9uZW50fHx0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhuKSx0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4pKTp0aGlzLl9vdmVyQ29tcG9uZW50JiZ0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4pO2NvbnNvbGUuZGVidWcodSxxLHRoaXMuX292ZXJDb21wb25lbnQpO3RoaXMuX292ZXJDb21wb25lbnQ9dSYmcX07bS5wcm90b3R5cGUub25Qb2ludGVyRW50ZXI9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmUG9pbnRlckVudGVyPQpmdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuZGVsZXRlKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vblBvaW50ZXJNb3ZlPWZ1bmN0aW9uKG4pe3RoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmFkZChuKX07bS5wcm90b3R5cGUub2ZmUG9pbnRlck1vdmU9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuZGVsZXRlKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vblBvaW50ZXJFeGl0PWZ1bmN0aW9uKG4pe3RoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmFkZChuKX07bS5wcm90b3R5cGUub2ZmUG9pbnRlckV4aXQ9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuZGVsZXRlKG4pO3JldHVybiB0aGlzfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2YuUG9pbnRlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgyMCk7Zi5tZW1UaHVuaz1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxsPTA7bDxhcmd1bWVudHMubGVuZ3RoO2wrKyl0W2xdPQphcmd1bWVudHNbbF07dmFyIHA9dC5zbGljZSgwLC0xKSxtPWsubWVtb2l6ZSh0W3QubGVuZ3RoLTFdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLHE9cC5tYXAoZnVuY3Rpb24odSl7cmV0dXJuIHUuYXBwbHkobil9KTtyZXR1cm4gbS5hcHBseSh2b2lkIDAscSl9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoNDkpO2YubWVtb2l6ZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7Zm9yKHZhciB1PVtdLHg9MDt4PGFyZ3VtZW50cy5sZW5ndGg7eCsrKXVbeF09YXJndW1lbnRzW3hdO2lmKG4pcmV0dXJuIG07eD1rLnNpZ25BcnJheSh1KTt2b2lkIDA9PT1wfHxwLmlzRGlmZmVyZW50KHgpPyhxJiZjb25zb2xlLmxvZygiY2FjaGUgbWlzcyEgY29tcHV0aW5nIikscD14LG09dC5hcHBseSh0aGlzLHUpKTpxJiZjb25zb2xlLmxvZygiY2FjaGUgaGl0ISIpO3JldHVybiBtfXZhciBwPXZvaWQgMCxtLG49ITEscT0hMTtsLmRvTG9ja2VkPWZ1bmN0aW9uKHUpe2lmKG4pdGhyb3cgRXJyb3IoIkxvY2tpbmcgYW4gYWxyZWFkeSBsb2NrZWQgbWVtb2l6ZSBmdW5jdGlvbiEiKTsKbj0hMDt1PXUuYXBwbHkodGhpcyk7bj0hMTtyZXR1cm4gdX07bC5sb2dQZXJmb3JtYW5jZT1mdW5jdGlvbih1KXt2b2lkIDA9PT11JiYodT0hMCk7cT11O3JldHVybiB0aGlzfTtyZXR1cm4gbH19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgeCBpbiBxKXEuaGFzT3duUHJvcGVydHkoeCkmJihuW3hdPXFbeF0pO24ucHJvdG90eXBlPW51bGw9PT1xP09iamVjdC5jcmVhdGUocSk6KHUucHJvdG90eXBlPXEucHJvdG90eXBlLG5ldyB1KX0sdD1oKDMpLGw9aCgwKSxwPWgoMjcpLG09aCgyKTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEodSl7dm9pZCAwPT09dSYmKHU9InZlcnRpY2FsIik7dT1uLmNhbGwodGhpcyx1KXx8dGhpczt1Ll9jbHVzdGVyT2Zmc2V0cz1uZXcgbC5NYXA7cmV0dXJuIHV9ayhxLG4pO3EucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj0KZnVuY3Rpb24oKXtmdW5jdGlvbiB1KCl7cmV0dXJuIHkucmFuZ2VCYW5kKCl9dmFyIHg9dGhpcyxBPW4ucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLHk9dGhpcy5fbWFrZUlubmVyU2NhbGUoKTtBLndpZHRoPXRoaXMuX2lzVmVydGljYWw/dTpBLndpZHRoO0EuaGVpZ2h0PXRoaXMuX2lzVmVydGljYWw/QS5oZWlnaHQ6dTt2YXIgdz1BLngsQz1BLnk7QS54PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24oRixELEIpe3JldHVybiB3KEYsRCxCKSt4Ll9jbHVzdGVyT2Zmc2V0cy5nZXQoQil9OmZ1bmN0aW9uKEYsRCxCKXtyZXR1cm4gdyhGLEQsQil9O0EueT10aGlzLl9pc1ZlcnRpY2FsP2Z1bmN0aW9uKEYsRCxCKXtyZXR1cm4gQyhGLEQsQil9OmZ1bmN0aW9uKEYsRCxCKXtyZXR1cm4gQyhGLEQsQikreC5fY2x1c3Rlck9mZnNldHMuZ2V0KEIpfTtyZXR1cm4gQX07cS5wcm90b3R5cGUuX3VwZGF0ZUNsdXN0ZXJQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciB1PQp0aGlzLHg9dGhpcy5fbWFrZUlubmVyU2NhbGUoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihBLHkpe3JldHVybiB1Ll9jbHVzdGVyT2Zmc2V0cy5zZXQoQSx4LnNjYWxlKFN0cmluZyh5KSkteC5yYW5nZUJhbmQoKS8yKX0pfTtxLnByb3RvdHlwZS5fbWFrZUlubmVyU2NhbGU9ZnVuY3Rpb24oKXt2YXIgdT1uZXcgdC5DYXRlZ29yeTt1LmRvbWFpbih0aGlzLmRhdGFzZXRzKCkubWFwKGZ1bmN0aW9uKEEseSl7cmV0dXJuIFN0cmluZyh5KX0pKTt2YXIgeD1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuYXR0cihwLkJhci5fQkFSX1RISUNLTkVTU19LRVkpKTt1LnJhbmdlKFswLHgobnVsbCwwLG51bGwpXSk7cmV0dXJuIHV9O3EucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uKCk7cmV0dXJuIG4ucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyl9O3JldHVybiBxfShwLkJhcik7Zi5DbHVzdGVyZWRCYXI9CmR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oQyxGKXtmdW5jdGlvbiBEKCl7dGhpcy5jb25zdHJ1Y3Rvcj1DfWZvcih2YXIgQiBpbiBGKUYuaGFzT3duUHJvcGVydHkoQikmJihDW0JdPUZbQl0pO0MucHJvdG90eXBlPW51bGw9PT1GP09iamVjdC5jcmVhdGUoRik6KEQucHJvdG90eXBlPUYucHJvdG90eXBlLG5ldyBEKX0sdD1oKDEpLGw9aCg1KSxwPWgoNyksbT1oKDgpLG49aCgzKSxxPWgoMCksdT1oKDQ0KSx4PWgoNDUpLEE9aCg2KSx5PWgoMzUpLHc9aCgyKTtkPWZ1bmN0aW9uKEMpe2Z1bmN0aW9uIEYoKXt2YXIgRD1DLmNhbGwodGhpcyl8fHRoaXM7RC5fc3RhcnRBbmdsZT0wO0QuX2VuZEFuZ2xlPTIqTWF0aC5QSTtELl9sYWJlbEZvcm1hdHRlcj1tLmlkZW50aXR5KCk7RC5fbGFiZWxzRW5hYmxlZD0hMTtELmlubmVyUmFkaXVzKDApO0Qub3V0ZXJSYWRpdXMoZnVuY3Rpb24oKXt2YXIgQj1ELl9waWVDZW50ZXIoKTtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoRC53aWR0aCgpLQpCLngsQi54KSxNYXRoLm1heChELmhlaWdodCgpLUIueSxCLnkpKX0pO0QuYWRkQ2xhc3MoInBpZS1wbG90Iik7RC5hdHRyKCJmaWxsIixmdW5jdGlvbihCLEkpe3JldHVybiBTdHJpbmcoSSl9LG5ldyBuLkNvbG9yKTtELl9zdHJva2VEcmF3ZXJzPW5ldyBxLk1hcDtyZXR1cm4gRH1rKEYsQyk7Ri5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcztDLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9zdHJva2VEcmF3ZXJzLmZvckVhY2goZnVuY3Rpb24oQil7cmV0dXJuIEIuYXR0YWNoVG8oRC5fcmVuZGVyQXJlYSl9KX07Ri5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihELEIsSSl7Qy5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsRCxCLEkpO0Q9dGhpcy5fcGllQ2VudGVyKCk7dGhpcy5fcmVuZGVyQXJlYS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitELngrIiwiK0QueSsiKSIpO0Q9TWF0aC5taW4oTWF0aC5tYXgodGhpcy53aWR0aCgpLQpELngsRC54KSxNYXRoLm1heCh0aGlzLmhlaWdodCgpLUQueSxELnkpKTtudWxsIT10aGlzLmlubmVyUmFkaXVzKCkuc2NhbGUmJnRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxEXSk7bnVsbCE9dGhpcy5vdXRlclJhZGl1cygpLnNjYWxlJiZ0aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUucmFuZ2UoWzAsRF0pO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5hZGREYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLmFkZERhdGFzZXQuY2FsbCh0aGlzLEQpfTtGLnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihEKXtpZigxPT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aClyZXR1cm4gcS5XaW5kb3cud2FybigiT25seSBvbmUgZGF0YXNldCBpcyBzdXBwb3J0ZWQgaW4gUGllIHBsb3RzIiksdGhpczt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt2YXIgQj1uZXcgeC5BcmNPdXRsaW5lU1ZHRHJhd2VyO3RoaXMuX2lzU2V0dXAmJkIuYXR0YWNoVG8odGhpcy5fcmVuZGVyQXJlYSk7CnRoaXMuX3N0cm9rZURyYXdlcnMuc2V0KEQsQik7Qy5wcm90b3R5cGUuX2FkZERhdGFzZXQuY2FsbCh0aGlzLEQpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLnJlbW92ZURhdGFzZXQuY2FsbCh0aGlzLEQpfTtGLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMuY2FsbCh0aGlzLEQpO3RoaXMuX3N0cm9rZURyYXdlcnMuZ2V0KEQpLnJlbW92ZSgpfTtGLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldD1mdW5jdGlvbihEKXtDLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsRCk7dGhpcy5fc3RhcnRBbmdsZXM9W107dGhpcy5fZW5kQW5nbGVzPVtdO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5zZWxlY3Rpb25zPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7dm9pZCAwPT09RCYmKEQ9dGhpcy5kYXRhc2V0cygpKTt2YXIgST1DLnByb3RvdHlwZS5zZWxlY3Rpb25zLmNhbGwodGhpcywKRCkubm9kZXMoKTtELmZvckVhY2goZnVuY3Rpb24oTil7Tj1CLl9zdHJva2VEcmF3ZXJzLmdldChOKTtudWxsIT1OJiZJLnB1c2guYXBwbHkoSSxOLmdldFZpc3VhbFByaW1pdGl2ZXMoKSl9KTtyZXR1cm4gdC5zZWxlY3RBbGwoSSl9O0YucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXtDLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyk7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKX07Ri5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgQS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgdS5BcmNTVkdEcmF3ZXJ9LGZ1bmN0aW9uKCl7eS53YXJuKCJjYW52YXMgcmVuZGVyZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBQaWUgUGxvdCEiKTtyZXR1cm4gbnVsbH0pfTtGLnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihEKXt2YXIgQj10aGlzO3ZvaWQgMD09PUQmJihEPXRoaXMuZGF0YXNldHMoKSk7CnJldHVybiBDLnByb3RvdHlwZS5lbnRpdGllcy5jYWxsKHRoaXMsRCkubWFwKGZ1bmN0aW9uKEkpe0kucG9zaXRpb24ueCs9Qi53aWR0aCgpLzI7SS5wb3NpdGlvbi55Kz1CLmhlaWdodCgpLzI7dmFyIE49dC5zZWxlY3QoQi5fc3Ryb2tlRHJhd2Vycy5nZXQoSS5kYXRhc2V0KS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4KEkuaW5kZXgpKTtJLnN0cm9rZVNlbGVjdGlvbj1OO3JldHVybiBJfSl9O0YucHJvdG90eXBlLnNlY3RvclZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEYuX1NFQ1RPUl9WQUxVRV9LRVkpfTtGLnByb3RvdHlwZS5pbm5lclJhZGl1cz1mdW5jdGlvbihELEIpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEYuX0lOTkVSX1JBRElVU19LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShGLl9JTk5FUl9SQURJVVNfS0VZLEQsQik7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUub3V0ZXJSYWRpdXM9CmZ1bmN0aW9uKEQsQil7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRi5fT1VURVJfUkFESVVTX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KEYuX09VVEVSX1JBRElVU19LRVksRCxCKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5zdGFydEFuZ2xlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX3N0YXJ0QW5nbGU7dGhpcy5fc3RhcnRBbmdsZT1EO3RoaXMuX3VwZGF0ZVBpZUFuZ2xlcygpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmVuZEFuZ2xlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2VuZEFuZ2xlO3RoaXMuX2VuZEFuZ2xlPUQ7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUubGFiZWxzRW5hYmxlZD1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9sYWJlbHNFbmFibGVkOwp0aGlzLl9sYWJlbHNFbmFibGVkPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUubGFiZWxGb3JtYXR0ZXI9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fbGFiZWxGb3JtYXR0ZXI7dGhpcy5fbGFiZWxGb3JtYXR0ZXI9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXMud2lkdGgoKS8yLEk9dGhpcy5oZWlnaHQoKS8yO0Q9dGhpcy5fc2xpY2VJbmRleEZvclBvaW50KHt4OkQueC1CLHk6RC55LUl9KTtyZXR1cm4gbnVsbD09RD9bXTpbdGhpcy5lbnRpdGllcygpW0RdXX07Ri5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj1DLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksST13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuaW5uZXJSYWRpdXMoKSksTj13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMub3V0ZXJSYWRpdXMoKSk7CkIuZD1mdW5jdGlvbihPLEgsSyl7cmV0dXJuIHQuYXJjKCkuaW5uZXJSYWRpdXMoSShPLEgsSykpLm91dGVyUmFkaXVzKE4oTyxILEspKS5zdGFydEFuZ2xlKEQuX3N0YXJ0QW5nbGVzW0hdKS5lbmRBbmdsZShELl9lbmRBbmdsZXNbSF0pKE8sSCl9O3JldHVybiBCfTtGLnByb3RvdHlwZS5fdXBkYXRlUGllQW5nbGVzPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5zZWN0b3JWYWx1ZSgpJiYwIT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aCl7dmFyIEQ9dy5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNlY3RvclZhbHVlKCkpLEI9dGhpcy5kYXRhc2V0cygpWzBdLEk9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLmdldChCKTtJPXQucGllKCkuc29ydChudWxsKS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKS52YWx1ZShmdW5jdGlvbihOLE8pe3JldHVybiBEKE4sTyxCKX0pKEkpO3RoaXMuX3N0YXJ0QW5nbGVzPUkubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBOLnN0YXJ0QW5nbGV9KTsKdGhpcy5fZW5kQW5nbGVzPUkubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBOLmVuZEFuZ2xlfSl9fTtGLnByb3RvdHlwZS5fcGllQ2VudGVyPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcy5fc3RhcnRBbmdsZTx0aGlzLl9lbmRBbmdsZT90aGlzLl9zdGFydEFuZ2xlOnRoaXMuX2VuZEFuZ2xlLEI9dGhpcy5fc3RhcnRBbmdsZTx0aGlzLl9lbmRBbmdsZT90aGlzLl9lbmRBbmdsZTp0aGlzLl9zdGFydEFuZ2xlLEk9TWF0aC5zaW4oRCk7RD1NYXRoLmNvcyhEKTt2YXIgTj1NYXRoLnNpbihCKTtCPU1hdGguY29zKEIpO3ZhciBPO2lmKDA8PUkmJjA8PU4paWYoMDw9RCYmMDw9Qil7dmFyIEg9RDt2YXIgSz1PPTA7dmFyIE09Tn1lbHNlIDA+RCYmMD5CPyhIPTAsTz0tQixLPTAsTT1JKTowPD1EJiYwPkI/KEg9RCxPPS1CLEs9MCxNPUkpOjA+RCYmMDw9QiYmKEs9Tz1IPTEsTT1NYXRoLm1heChJLE4pKTtlbHNlIDA8PUkmJjA+Tj8wPD1EJiYwPD1CPyhIPU1hdGgubWF4KEQsQiksTT1LPU89MSk6MD5EJiYKMD5CPyhIPTAsTz0xLEs9LU4sTT1JKTowPD1EJiYwPkI/KEg9RCxPPTEsSz0tTixNPTEpOjA+RCYmMDw9QiYmKEg9QixLPU89MSxNPUkpOjA+SSYmMDw9Tj8wPD1EJiYwPD1CPyhIPTEsTz0wLEs9LUksTT1OKTowPkQmJjA+Qj8oSD0xLE89TWF0aC5tYXgoLUQsLUIpLE09Sz0xKTowPD1EJiYwPkI/KEg9MSxPPS1CLEs9LUksTT0xKTowPkQmJjA8PUImJihIPTEsTz0tRCxLPTEsTT1OKTowPkkmJjA+TiYmKDA8PUQmJjA8PUI/KEg9QixPPTAsSz0tSSxNPTApOjA+RCYmMD5CPyhIPTAsTz0tRCxLPS1OLE09MCk6MDw9RCYmMD5CPyhPPUg9MSxLPU1hdGgubWF4KEQsLUIpLE09MSk6MD5EJiYwPD1CJiYoSD1CLE89LUQsSz0xLE09MCkpO3JldHVybnt4OjA9PUsrTT8wOksvKEsrTSkqdGhpcy53aWR0aCgpLHk6MD09SCtPPzA6SC8oSCtPKSp0aGlzLmhlaWdodCgpfX07Ri5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgRD1DLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdy5jYWxsKHRoaXMpOwppZigwPT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aClyZXR1cm4gRDt2YXIgQj13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSksST10aGlzLmRhdGFzZXRzKClbMF0sTj1ELmdldChJKS5maWx0ZXIoZnVuY3Rpb24oTyxIKXtyZXR1cm4gRi5faXNWYWxpZERhdGEoQihPLEgsSSkpfSk7RC5zZXQoSSxOKTtyZXR1cm4gRH07Ri5faXNWYWxpZERhdGE9ZnVuY3Rpb24oRCl7cmV0dXJuIHEuTWF0aC5pc1ZhbGlkTnVtYmVyKEQpJiYwPD1EfTtGLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbihELEIsSSl7dmFyIE49dy5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNlY3RvclZhbHVlKCkpO2lmKCFGLl9pc1ZhbGlkRGF0YShOKEQsQixJKSkpcmV0dXJue3g6TmFOLHk6TmFOfTt2YXIgTz13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuaW5uZXJSYWRpdXMoKSkoRCxCLEkpO0Q9dy5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLm91dGVyUmFkaXVzKCkpKEQsCkIsSSk7Tz0oTytEKS8yO0Q9dC5waWUoKS5zb3J0KG51bGwpLnZhbHVlKGZ1bmN0aW9uKEgsSyl7SD1OKEgsSyxJKTtyZXR1cm4gRi5faXNWYWxpZERhdGEoSCk/SDowfSkuc3RhcnRBbmdsZSh0aGlzLl9zdGFydEFuZ2xlKS5lbmRBbmdsZSh0aGlzLl9lbmRBbmdsZSkoSS5kYXRhKCkpO0I9KERbQl0uc3RhcnRBbmdsZStEW0JdLmVuZEFuZ2xlKS8yO3JldHVybnt4Ok8qTWF0aC5zaW4oQikseTotTypNYXRoLmNvcyhCKX19O0YucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTt0aGlzLl9sYWJlbHNFbmFibGVkJiZxLldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIEIuX2RyYXdMYWJlbHMoKX0sRCk7dmFyIEk9dGhpcy5fZ2VuZXJhdGVTdHJva2VEcmF3U3RlcHMoKSxOPXRoaXMuX2dldERhdGFUb0RyYXcoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihPKXt2YXIgSD0Kdy5QbG90LmFwcGx5RHJhd1N0ZXBzKEksTyk7Qi5fc3Ryb2tlRHJhd2Vycy5nZXQoTykuZHJhdyhOLmdldChPKSxIKX0pfTtGLnByb3RvdHlwZS5fZ2VuZXJhdGVTdHJva2VEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgcC5OdWxsfV19O0YucHJvdG90eXBlLl9zbGljZUluZGV4Rm9yUG9pbnQ9ZnVuY3Rpb24oRCl7dmFyIEI9TWF0aC5zcXJ0KE1hdGgucG93KEQueCwyKStNYXRoLnBvdyhELnksMikpLEk9TWF0aC5hY29zKC1ELnkvQik7MD5ELngmJihJPTIqTWF0aC5QSS1JKTtmb3IoRD0wO0Q8dGhpcy5fc3RhcnRBbmdsZXMubGVuZ3RoO0QrKylpZih0aGlzLl9zdGFydEFuZ2xlc1tEXTxJJiZ0aGlzLl9lbmRBbmdsZXNbRF0+SSl7dmFyIE49RDticmVha31pZih2b2lkIDAhPT1OKXtEPXRoaXMuZGF0YXNldHMoKVswXTt2YXIgTz1ELmRhdGEoKVtOXTtJPXRoaXMuaW5uZXJSYWRpdXMoKS5hY2Nlc3NvcihPLApOLEQpO0Q9dGhpcy5vdXRlclJhZGl1cygpLmFjY2Vzc29yKE8sTixEKTtpZihCPkkmJkI8RClyZXR1cm4gTn1yZXR1cm4gbnVsbH07Ri5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgRD10aGlzLEI9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksST10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoImxhYmVsLWFyZWEiLCEwKSxOPW5ldyBsLlN2Z0NvbnRleHQoSS5ub2RlKCkpLE89bmV3IGwuQ2FjaGVNZWFzdXJlcihOKSxIPW5ldyBsLldyaXRlcihPLE4pLEs9dGhpcy5kYXRhc2V0cygpWzBdO3RoaXMuX2dldERhdGFUb0RyYXcoKS5nZXQoSykuZm9yRWFjaChmdW5jdGlvbihNLEwpe3ZhciBRPUQuc2VjdG9yVmFsdWUoKS5hY2Nlc3NvcihNLEwsSyk7aWYocS5NYXRoLmlzVmFsaWROdW1iZXIoUSkpe1E9RC5fbGFiZWxGb3JtYXR0ZXIoUSxNLEwsSyk7dmFyIFQ9Ty5tZWFzdXJlKFEpLFg9KEQuX2VuZEFuZ2xlc1tMXStELl9zdGFydEFuZ2xlc1tMXSkvCjIsYWE9RC5vdXRlclJhZGl1cygpLmFjY2Vzc29yKE0sTCxLKTtELm91dGVyUmFkaXVzKCkuc2NhbGUmJihhYT1ELm91dGVyUmFkaXVzKCkuc2NhbGUuc2NhbGUoYWEpKTt2YXIgbGE9RC5pbm5lclJhZGl1cygpLmFjY2Vzc29yKE0sTCxLKTtELmlubmVyUmFkaXVzKCkuc2NhbGUmJihsYT1ELmlubmVyUmFkaXVzKCkuc2NhbGUuc2NhbGUobGEpKTtsYT0oYWErbGEpLzI7YWE9TWF0aC5zaW4oWCkqbGEtVC53aWR0aC8yO2xhPS1NYXRoLmNvcyhYKSpsYS1ULmhlaWdodC8yO3ZhciBaPVt7eDphYSx5OmxhfSx7eDphYSx5OmxhK1QuaGVpZ2h0fSx7eDphYStULndpZHRoLHk6bGF9LHt4OmFhK1Qud2lkdGgseTpsYStULmhlaWdodH1dOyhYPVouZXZlcnkoZnVuY3Rpb24oYmEpe3JldHVybiBNYXRoLmFicyhiYS54KTw9RC53aWR0aCgpLzImJk1hdGguYWJzKGJhLnkpPD1ELmhlaWdodCgpLzJ9KSkmJihYPVoubWFwKGZ1bmN0aW9uKGJhKXtyZXR1cm4gRC5fc2xpY2VJbmRleEZvclBvaW50KGJhKX0pLmV2ZXJ5KGZ1bmN0aW9uKGJhKXtyZXR1cm4gYmE9PT0KTH0pKTtNPUIuZmlsbChNLEwsSyk7TT0xLjYqcS5Db2xvci5jb250cmFzdCgid2hpdGUiLE0pPHEuQ29sb3IuY29udHJhc3QoImJsYWNrIixNKTthYT1JLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2FhKyIsIitsYSsiKSIpO2FhLmNsYXNzZWQoTT8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCk7YWEuc3R5bGUoInZpc2liaWxpdHkiLFg/ImluaGVyaXQiOiJoaWRkZW4iKTtILndyaXRlKFEsVC53aWR0aCxULmhlaWdodCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIn0sYWEubm9kZSgpKX19KX07cmV0dXJuIEZ9KHcuUGxvdCk7ZC5fSU5ORVJfUkFESVVTX0tFWT0iaW5uZXItcmFkaXVzIjtkLl9PVVRFUl9SQURJVVNfS0VZPSJvdXRlci1yYWRpdXMiO2QuX1NFQ1RPUl9WQUxVRV9LRVk9InNlY3Rvci12YWx1ZSI7Zi5QaWU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih5LHcpe2Z1bmN0aW9uIEMoKXt0aGlzLmNvbnN0cnVjdG9yPQp5fWZvcih2YXIgRiBpbiB3KXcuaGFzT3duUHJvcGVydHkoRikmJih5W0ZdPXdbRl0pO3kucHJvdG90eXBlPW51bGw9PT13P09iamVjdC5jcmVhdGUodyk6KEMucHJvdG90eXBlPXcucHJvdG90eXBlLG5ldyBDKX0sdD1oKDEpLGw9aCg1KSxwPWgoNyksbT1oKDE0KSxuPWgoNikscT1oKDM0KSx1PWgoMykseD1oKDApLEE9aCgyKTtkPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHcoKXt2YXIgQz15LmNhbGwodGhpcyl8fHRoaXM7Qy5fbGFiZWxzRW5hYmxlZD0hMTtDLl9sYWJlbD1udWxsO0MuYW5pbWF0b3IoInJlY3RhbmdsZXMiLG5ldyBwLk51bGwpO0MuYWRkQ2xhc3MoInJlY3RhbmdsZS1wbG90Iik7Qy5hdHRyKCJmaWxsIiwobmV3IHUuQ29sb3IpLnJhbmdlKClbMF0pO3JldHVybiBDfWsodyx5KTt3LnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxLlJlY3RhbmdsZVNWR0RyYXdlcn0sZnVuY3Rpb24oQyl7cmV0dXJuIG5ldyBtLlJlY3RhbmdsZUNhbnZhc0RyYXdlcihDKX0pfTsKdy5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIEM9dGhpcyxGPXkucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLEQ9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksQj1GW3cuX1gyX0tFWV0sST1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxOPUZbdy5fWTJfS0VZXSxPPXRoaXMueCgpLnNjYWxlLEg9dGhpcy55KCkuc2NhbGU7bnVsbCE9Qj8oRi53aWR0aD1mdW5jdGlvbihLLE0sTCl7cmV0dXJuIE1hdGguYWJzKEIoSyxNLEwpLUQoSyxNLEwpKX0sRi54PWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTWF0aC5taW4oQihLLE0sTCksRChLLE0sTCkpfSk6KEYud2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gQy5fcmVjdGFuZ2xlV2lkdGgoTyl9LEYueD1mdW5jdGlvbihLLE0sTCl7cmV0dXJuIEQoSyxNLEwpLS41KkYud2lkdGgoSyxNLEwpfSk7bnVsbCE9Tj8oRi5oZWlnaHQ9ZnVuY3Rpb24oSywKTSxMKXtyZXR1cm4gTWF0aC5hYnMoTihLLE0sTCktSShLLE0sTCkpfSxGLnk9ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBNYXRoLm1heChOKEssTSxMKSxJKEssTSxMKSktRi5oZWlnaHQoSyxNLEwpfSk6KEYuaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIEMuX3JlY3RhbmdsZVdpZHRoKEgpfSxGLnk9ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBJKEssTSxMKS0uNSpGLmhlaWdodChLLE0sTCl9KTtkZWxldGUgRlt3Ll9YMl9LRVldO2RlbGV0ZSBGW3cuX1kyX0tFWV07cmV0dXJuIEZ9O3cucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKCJyZWN0YW5nbGVzIil9XX07dy5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5PWZ1bmN0aW9uKEMpe3JldHVybiJ4MiI9PT1DP3kucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsCiJ4Iik6InkyIj09PUM/eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieSIpOnkucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsQyl9O3cucHJvdG90eXBlLng9ZnVuY3Rpb24oQyxGLEQpe2lmKG51bGw9PUMpcmV0dXJuIHkucHJvdG90eXBlLnguY2FsbCh0aGlzKTtudWxsPT1GP3kucHJvdG90eXBlLnguY2FsbCh0aGlzLEMpOnkucHJvdG90eXBlLnguY2FsbCh0aGlzLEMsRixEKTtudWxsIT1GJiYoRD0oQz10aGlzLngyKCkpJiZDLmFjY2Vzc29yLG51bGwhPUQmJnRoaXMuX2JpbmRQcm9wZXJ0eSh3Ll9YMl9LRVksRCxGLEMucG9zdFNjYWxlKSk7RiBpbnN0YW5jZW9mIHUuQ2F0ZWdvcnkmJkYuaW5uZXJQYWRkaW5nKDApLm91dGVyUGFkZGluZygwKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUueDI9ZnVuY3Rpb24oQyxGKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9YMl9LRVkpO3ZhciBEPQp0aGlzLngoKTt0aGlzLl9iaW5kUHJvcGVydHkody5fWDJfS0VZLEMsRCYmRC5zY2FsZSxGKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS55PWZ1bmN0aW9uKEMsRixEKXtpZihudWxsPT1DKXJldHVybiB5LnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09Rj95LnByb3RvdHlwZS55LmNhbGwodGhpcyxDKTp5LnByb3RvdHlwZS55LmNhbGwodGhpcyxDLEYsRCk7bnVsbCE9RiYmKEQ9KEM9dGhpcy55MigpKSYmQy5hY2Nlc3NvcixudWxsIT1EJiZ0aGlzLl9iaW5kUHJvcGVydHkody5fWTJfS0VZLEQsRixDLnBvc3RTY2FsZSkpO0YgaW5zdGFuY2VvZiB1LkNhdGVnb3J5JiZGLmlubmVyUGFkZGluZygwKS5vdXRlclBhZGRpbmcoMCk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLnkyPWZ1bmN0aW9uKEMsRil7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQody5fWTJfS0VZKTt2YXIgRD10aGlzLnkoKTt0aGlzLl9iaW5kUHJvcGVydHkody5fWTJfS0VZLApDLEQmJkQuc2NhbGUsRik7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbihDKXt2YXIgRj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcihmdW5jdGlvbihEKXt2YXIgQj1ELmRhdHVtLEk9RC5pbmRleCxOPUQuZGF0YXNldDtEPUYueChCLEksTik7dmFyIE89Ri55KEIsSSxOKSxIPUYud2lkdGgoQixJLE4pO0I9Ri5oZWlnaHQoQixJLE4pO3JldHVybiBEPD1DLngmJkMueDw9RCtIJiZPPD1DLnkmJkMueTw9TytCfSl9O3cucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQyl7cmV0dXJuIHRoaXMuX2VudGl0eUJCb3goQy5kYXR1bSxDLmluZGV4LEMuZGF0YXNldCx0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSl9O3cucHJvdG90eXBlLl9lbnRpdHlCQm94PWZ1bmN0aW9uKEMsRixELEIpe3JldHVybnt4OkIueChDLEYsRCkseTpCLnkoQyxGLEQpLHdpZHRoOkIud2lkdGgoQywKRixEKSxoZWlnaHQ6Qi5oZWlnaHQoQyxGLEQpfX07dy5wcm90b3R5cGUubGFiZWw9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fbGFiZWw7dGhpcy5fbGFiZWw9Qzt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5sYWJlbHNFbmFibGVkPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX2xhYmVsc0VuYWJsZWQ7dGhpcy5fbGFiZWxzRW5hYmxlZD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7bnVsbCE9dGhpcy54MigpJiYoQy54Mj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSkpO251bGwhPXRoaXMueTIoKSYmKEMueTI9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpKTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oQywKRixEKXt2YXIgQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxJPUIueChDLEYsRCksTj1CLnkoQyxGLEQpLE89Qi53aWR0aChDLEYsRCk7Qz1CLmhlaWdodChDLEYsRCk7cmV0dXJue3g6SStPLzIseTpOK0MvMn19O3cucHJvdG90eXBlLl9yZWN0YW5nbGVXaWR0aD1mdW5jdGlvbihDKXtpZihDIGluc3RhbmNlb2YgdS5DYXRlZ29yeSlyZXR1cm4gQy5yYW5nZUJhbmQoKTt2YXIgRj1DPT09dGhpcy54KCkuc2NhbGU/dGhpcy54KCkuYWNjZXNzb3I6dGhpcy55KCkuYWNjZXNzb3IsRD10LnNldCh4LkFycmF5LmZsYXR0ZW4odGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTi5kYXRhKCkubWFwKGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEYoTyxILE4pLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuK059KSxCPXguTWF0aC5taW4oRCwwKTtEPXguTWF0aC5tYXgoRCwwKTt2YXIgST1DLnNjYWxlKEIpO3JldHVybihDLnNjYWxlKEQpLQpJKS9NYXRoLmFicyhELUIpfTt3LnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBDPW5ldyB4Lk1hcCxGPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQpe3ZhciBCPUQuZGF0YSgpLm1hcChmdW5jdGlvbihJLE4pe3JldHVybiB4Lk1hdGguaXNWYWxpZE51bWJlcihGLngoSSxOLEQpKSYmeC5NYXRoLmlzVmFsaWROdW1iZXIoRi55KEksTixEKSkmJnguTWF0aC5pc1ZhbGlkTnVtYmVyKEYud2lkdGgoSSxOLEQpKSYmeC5NYXRoLmlzVmFsaWROdW1iZXIoRi5oZWlnaHQoSSxOLEQpKT9JOm51bGx9KTtDLnNldChELEIpfSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oQyl7dmFyIEY9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdEFsbCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTt0aGlzLl9sYWJlbHNFbmFibGVkJiZudWxsIT10aGlzLmxhYmVsKCkmJnguV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gRi5fZHJhd0xhYmVscygpfSwKQyl9O3cucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7dmFyIEM9dGhpcyxGPXRoaXMuX2dldERhdGFUb0RyYXcoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihELEIpe3JldHVybiBDLl9kcmF3TGFiZWwoRixELEIpfSl9O3cucHJvdG90eXBlLl9kcmF3TGFiZWw9ZnVuY3Rpb24oQyxGLEQpe3ZhciBCPXRoaXMsST10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxOPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLE89bmV3IGwuU3ZnQ29udGV4dChOLm5vZGUoKSksSD1uZXcgbC5DYWNoZU1lYXN1cmVyKE8pLEs9bmV3IGwuV3JpdGVyKEgsTyk7Tz10aGlzLngoKS5zY2FsZS5yYW5nZSgpO3ZhciBNPXRoaXMueSgpLnNjYWxlLnJhbmdlKCksTD1NYXRoLm1pbi5hcHBseShudWxsLE8pLFE9TWF0aC5tYXguYXBwbHkobnVsbCxPKSxUPU1hdGgubWluLmFwcGx5KG51bGwsTSksWD1NYXRoLm1heC5hcHBseShudWxsLApNKTtDLmdldChGKS5mb3JFYWNoKGZ1bmN0aW9uKGFhLGxhKXtpZihudWxsIT1hYSl7dmFyIFo9IiIrQi5sYWJlbCgpKGFhLGxhLEYpLGJhPUgubWVhc3VyZShaKSxlYT1JLngoYWEsbGEsRiksY2E9SS55KGFhLGxhLEYpLGthPUkud2lkdGgoYWEsbGEsRiksWT1JLmhlaWdodChhYSxsYSxGKTtiYS5oZWlnaHQ8PVkmJmJhLndpZHRoPD1rYSYmKFk9KFktYmEuaGVpZ2h0KS8yLGVhKz0oa2EtYmEud2lkdGgpLzIsY2ErPVksa2E9e21pbjplYSxtYXg6ZWErYmEud2lkdGh9LFk9e21pbjpjYSxtYXg6Y2ErYmEuaGVpZ2h0fSxrYS5taW48THx8a2EubWF4PlF8fFkubWluPFR8fFkubWF4Plh8fEIuX292ZXJsYXlMYWJlbChrYSxZLGxhLEQsQyl8fChhYT1JLmZpbGwoYWEsbGEsRiksYWE9MS42KnguQ29sb3IuY29udHJhc3QoIndoaXRlIixhYSk8eC5Db2xvci5jb250cmFzdCgiYmxhY2siLGFhKSxlYT1OLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2VhKyIsIisKY2ErIikiKSxlYS5jbGFzc2VkKGFhPyJkYXJrLWxhYmVsIjoibGlnaHQtbGFiZWwiLCEwKSxLLndyaXRlKFosYmEud2lkdGgsYmEuaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxlYS5ub2RlKCkpKSl9fSl9O3cucHJvdG90eXBlLl9vdmVybGF5TGFiZWw9ZnVuY3Rpb24oQyxGLEQsQixJKXtmb3IodmFyIE49dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTz10aGlzLmRhdGFzZXRzKCksSD1CO0g8Ty5sZW5ndGg7SCsrKWZvcih2YXIgSz1PW0hdLE09SS5nZXQoSyksTD1IPT09Qj9EKzE6MDtMPE0ubGVuZ3RoO0wrKylpZih4LkRPTS5pbnRlcnNlY3RzQkJveChDLEYsdGhpcy5fZW50aXR5QkJveChNW0xdLEwsSyxOKSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiB3fShoKDE2KS5YWVBsb3QpO2QuX1gyX0tFWT0ieDIiO2QuX1kyX0tFWT0ieTIiO2YuUmVjdGFuZ2xlPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oeSwKdyl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9eX1mb3IodmFyIEYgaW4gdyl3Lmhhc093blByb3BlcnR5KEYpJiYoeVtGXT13W0ZdKTt5LnByb3RvdHlwZT1udWxsPT09dz9PYmplY3QuY3JlYXRlKHcpOihDLnByb3RvdHlwZT13LnByb3RvdHlwZSxuZXcgQyl9LHQ9aCgzMSksbD1oKDYpLHA9aCg0OCksbT1oKDcpLG49aCgxNCkscT1oKDMpLHU9aCgwKSx4PWgoMTkpLEE9aCgyKTtkPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHcoKXt2YXIgQz15LmNhbGwodGhpcyl8fHRoaXM7Qy5hZGRDbGFzcygic2NhdHRlci1wbG90Iik7dmFyIEY9bmV3IG0uRWFzaW5nO0Yuc3RhcnREZWxheSg1KTtGLnN0ZXBEdXJhdGlvbigyNTApO0YubWF4VG90YWxEdXJhdGlvbihBLlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0MuYW5pbWF0b3IoeC5BbmltYXRvci5NQUlOLEYpO0MuYXR0cigib3BhY2l0eSIsLjYpO0MuYXR0cigiZmlsbCIsKG5ldyBxLkNvbG9yKS5yYW5nZSgpWzBdKTtDLnNpemUoNik7CnZhciBEPXQuY2lyY2xlKCk7Qy5zeW1ib2woZnVuY3Rpb24oKXtyZXR1cm4gRH0pO3JldHVybiBDfWsodyx5KTt3LnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcz1mdW5jdGlvbihDKXt2YXIgRj10aGlzO3JldHVybiB5LnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcy5jYWxsKHRoaXMsQykubWFwKGZ1bmN0aW9uKEQpe3ZhciBCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi5zaXplKCkpKEQuZGF0dW0sRC5pbmRleCxELmRhdGFzZXQpO0QuZGlhbWV0ZXI9QjtyZXR1cm4gRH0pfTt3LnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEMpe3ZhciBGPXRoaXM7cmV0dXJuIG5ldyBsLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwLlN5bWJvbFNWR0RyYXdlcn0sZnVuY3Rpb24oRCl7cmV0dXJuIG5ldyBuLkNhbnZhc0RyYXdlcihELHAubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwKEMsZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnN5bWJvbCgpKX0sCmZ1bmN0aW9uKCl7cmV0dXJuIEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi5zaXplKCkpfSkpfSl9O3cucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oQyxGKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9TSVpFX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHcuX1NJWkVfS0VZLEMsRik7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHcuX1NZTUJPTF9LRVkpO3RoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KHcuX1NZTUJPTF9LRVkse2FjY2Vzc29yOkN9KTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgQz1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBGPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEQ9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKTsKRi5kPWZ1bmN0aW9uKEIsSSxOKXtyZXR1cm4gRChCLEksTikoMCkobnVsbCl9O0MucHVzaCh7YXR0clRvUHJvamVjdG9yOkYsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoeC5BbmltYXRvci5SRVNFVCl9KX1DLnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksRj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxEPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpO0MueD1GO0MueT1EO0MudHJhbnNmb3JtPWZ1bmN0aW9uKEIsSSxOKXtyZXR1cm4idHJhbnNsYXRlKCIrRihCLEksTikrIiwiK0QoQixJLE4pKyIpIn07Qy5kPXRoaXMuX2NvbnN0cnVjdFN5bWJvbEdlbmVyYXRvcigpOwpyZXR1cm4gQ307dy5wcm90b3R5cGUuX2NvbnN0cnVjdFN5bWJvbEdlbmVyYXRvcj1mdW5jdGlvbigpe3ZhciBDPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zeW1ib2woKSksRj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2l6ZSgpKTtyZXR1cm4gZnVuY3Rpb24oRCxCLEkpe3JldHVybiBDKEQsQixJKShGKEQsQixJKSkobnVsbCl9fTt3LnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKEMpe3JldHVybnt4OkMucG9zaXRpb24ueC1DLmRpYW1ldGVyLzIseTpDLnBvc2l0aW9uLnktQy5kaWFtZXRlci8yLHdpZHRoOkMuZGlhbWV0ZXIsaGVpZ2h0OkMuZGlhbWV0ZXJ9fTt3LnByb3RvdHlwZS5fZW50aXR5VmlzaWJsZU9uUGxvdD1mdW5jdGlvbihDLEYpe3ZhciBEPXttaW46Ri50b3BMZWZ0LngsbWF4OkYuYm90dG9tUmlnaHQueH07Rj17bWluOkYudG9wTGVmdC55LG1heDpGLmJvdHRvbVJpZ2h0Lnl9O0M9dGhpcy5fZW50aXR5Qm91bmRzKEMpO3JldHVybiB1LkRPTS5pbnRlcnNlY3RzQkJveChELApGLEMpfTt3LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEMpe3ZhciBGPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEQ9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksQj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2l6ZSgpKTtyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcihmdW5jdGlvbihJKXt2YXIgTj1JLmRhdHVtLE89SS5pbmRleCxIPUkuZGF0YXNldDtJPUYoTixPLEgpO3ZhciBLPUQoTixPLEgpO049QihOLE8sSCk7cmV0dXJuIEktTi8yPD1DLngmJkMueDw9SStOLzImJkstTi8yPD1DLnkmJkMueTw9SytOLzJ9KX07cmV0dXJuIHd9KGgoMTYpLlhZUGxvdCk7ZC5fU0laRV9LRVk9InNpemUiO2QuX1NZTUJPTF9LRVk9InN5bWJvbCI7Zi5TY2F0dGVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odSx4KXtmdW5jdGlvbiBBKCl7dGhpcy5jb25zdHJ1Y3Rvcj11fWZvcih2YXIgeSBpbiB4KXguaGFzT3duUHJvcGVydHkoeSkmJgoodVt5XT14W3ldKTt1LnByb3RvdHlwZT1udWxsPT09eD9PYmplY3QuY3JlYXRlKHgpOihBLnByb3RvdHlwZT14LnByb3RvdHlwZSxuZXcgQSl9LHQ9aCg3KSxsPWgoNikscD1oKDQ3KSxtPWgoMyksbj1oKDM1KSxxPWgoMik7ZD1mdW5jdGlvbih1KXtmdW5jdGlvbiB4KCl7dmFyIEE9dS5jYWxsKHRoaXMpfHx0aGlzO0EuYWRkQ2xhc3MoInNlZ21lbnQtcGxvdCIpO0EuYXR0cigic3Ryb2tlIiwobmV3IG0uQ29sb3IpLnJhbmdlKClbMF0pO0EuYXR0cigic3Ryb2tlLXdpZHRoIiwiMnB4Iik7cmV0dXJuIEF9ayh4LHUpO3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHAuU2VnbWVudFNWR0RyYXdlcn0sZnVuY3Rpb24oKXtuLndhcm4oImNhbnZhcyByZW5kZXJlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFNlZ21lbnQgUGxvdCEiKTtyZXR1cm4gbnVsbH0pfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9CmZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IHQuTnVsbH1dfTt4LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oQSl7cmV0dXJuIngyIj09PUE/dS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieCIpOiJ5MiI9PT1BP3UucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsInkiKTp1LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLEEpfTt4LnByb3RvdHlwZS54PWZ1bmN0aW9uKEEseSl7aWYobnVsbD09QSlyZXR1cm4gdS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PXk/dS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQSk6KHUucHJvdG90eXBlLnguY2FsbCh0aGlzLEEseSksQT0oQT10aGlzLngyKCkpJiZBLmFjY2Vzc29yLG51bGwhPUEmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9YMl9LRVksQSx5KSk7cmV0dXJuIHRoaXN9Owp4LnByb3RvdHlwZS54Mj1mdW5jdGlvbihBKXtpZihudWxsPT1BKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh4Ll9YMl9LRVkpO3ZhciB5PXRoaXMueCgpO3RoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9YMl9LRVksQSx5JiZ5LnNjYWxlKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS55PWZ1bmN0aW9uKEEseSl7aWYobnVsbD09QSlyZXR1cm4gdS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PXk/dS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQSk6KHUucHJvdG90eXBlLnkuY2FsbCh0aGlzLEEseSksQT0oQT10aGlzLnkyKCkpJiZBLmFjY2Vzc29yLG51bGwhPUEmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9ZMl9LRVksQSx5KSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLnkyPWZ1bmN0aW9uKEEpe2lmKG51bGw9PUEpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1kyX0tFWSk7dmFyIHk9dGhpcy55KCk7dGhpcy5fYmluZFByb3BlcnR5KHguX1kyX0tFWSwKQSx5JiZ5LnNjYWxlKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEE9dS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpO0EueDE9cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSk7QS54Mj1udWxsPT10aGlzLngyKCk/cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSk6cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngyKCkpO0EueTE9cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7QS55Mj1udWxsPT10aGlzLnkyKCk/cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk6cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpO3JldHVybiBBfTt4LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEEpe0E9dGhpcy5lbnRpdHlOZWFyZXN0KEEpO3JldHVybiBudWxsIT1BP1tBXTpbXX07eC5wcm90b3R5cGUuZW50aXRpZXNJbj1mdW5jdGlvbihBLAp5KXtpZihudWxsPT15KXt2YXIgdz17bWluOkEudG9wTGVmdC54LG1heDpBLmJvdHRvbVJpZ2h0Lnh9O0E9e21pbjpBLnRvcExlZnQueSxtYXg6QS5ib3R0b21SaWdodC55fX1lbHNlIHc9QSxBPXk7cmV0dXJuIHRoaXMuX2VudGl0aWVzSW50ZXJzZWN0aW5nKHcsQSl9O3gucHJvdG90eXBlLl9lbnRpdGllc0ludGVyc2VjdGluZz1mdW5jdGlvbihBLHkpe3ZhciB3PXRoaXMsQz1bXSxGPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3RoaXMuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQpe3cuX2xpbmVJbnRlcnNlY3RzQm94KEQsQSx5LEYpJiZDLnB1c2goRCl9KTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzQm94PWZ1bmN0aW9uKEEseSx3LEMpe3ZhciBGPXRoaXMsRD1DLngxKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpLEI9Qy54MihBLmRhdHVtLEEuaW5kZXgsQS5kYXRhc2V0KSxJPUMueTEoQS5kYXR1bSxBLmluZGV4LEEuZGF0YXNldCk7QT1DLnkyKEEuZGF0dW0sCkEuaW5kZXgsQS5kYXRhc2V0KTtpZih5Lm1pbjw9RCYmRDw9eS5tYXgmJncubWluPD1JJiZJPD13Lm1heHx8eS5taW48PUImJkI8PXkubWF4JiZ3Lm1pbjw9QSYmQTw9dy5tYXgpcmV0dXJuITA7dmFyIE49e3g6RCx5Okl9LE89e3g6Qix5OkF9LEg9W3t4OnkubWluLHk6dy5taW59LHt4OnkubWluLHk6dy5tYXh9LHt4OnkubWF4LHk6dy5tYXh9LHt4OnkubWF4LHk6dy5taW59XTtyZXR1cm4gMDxILmZpbHRlcihmdW5jdGlvbihLLE0pe3JldHVybiAwIT09TT9GLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQoTixPLEssSFtNLTFdKSYmRi5fbGluZUludGVyc2VjdHNTZWdtZW50KEssSFtNLTFdLE4sTyk6ITF9KS5sZW5ndGh9O3gucHJvdG90eXBlLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQ9ZnVuY3Rpb24oQSx5LHcsQyl7ZnVuY3Rpb24gRihELEIsSSl7cmV0dXJuKEIueC1ELngpKihJLnktQi55KS0oQi55LUQueSkqKEkueC1CLngpfXJldHVybiAwPkYoQSx5LHcpKkYoQSx5LEMpfTtyZXR1cm4geH0oaCgxNikuWFlQbG90KTsKZC5fWDJfS0VZPSJ4MiI7ZC5fWTJfS0VZPSJ5MiI7Zi5TZWdtZW50PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocSx1KXtmdW5jdGlvbiB4KCl7dGhpcy5jb25zdHJ1Y3Rvcj1xfWZvcih2YXIgQSBpbiB1KXUuaGFzT3duUHJvcGVydHkoQSkmJihxW0FdPXVbQV0pO3EucHJvdG90eXBlPW51bGw9PT11P09iamVjdC5jcmVhdGUodSk6KHgucHJvdG90eXBlPXUucHJvdG90eXBlLG5ldyB4KX0sdD1oKDEpLGw9aCg3KSxwPWgoMjApLG09aCgwKTtkPWgoNTApO3ZhciBuPWgoMik7aD1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KCl7dmFyIHg9cS5jYWxsKHRoaXMpfHx0aGlzO3guX3N0YWNraW5nUmVzdWx0PXAubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4geC5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiB4LngoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4geC55KCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHguX3N0YWNraW5nT3JkZXJ9LApmdW5jdGlvbihBLHksdyxDKXtyZXR1cm4gbS5TdGFja2luZy5zdGFjayhBLHksdyxDKX0pO3guX3N0YWNrZWRFeHRlbnQ9cC5tZW1UaHVuayh4Ll9zdGFja2luZ1Jlc3VsdCxmdW5jdGlvbigpe3JldHVybiB4LngoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4geC5fZmlsdGVyRm9yUHJvcGVydHkoInkiKX0sZnVuY3Rpb24oQSx5LHcpe3JldHVybiBtLlN0YWNraW5nLnN0YWNrZWRFeHRlbnQoQSx5LHcpfSk7eC5fYmFzZWxpbmVWYWx1ZT0wO3guX3N0YWNraW5nT3JkZXI9ImJvdHRvbXVwIjt4LmFkZENsYXNzKCJzdGFja2VkLWFyZWEtcGxvdCIpO3guYXR0cigiZmlsbC1vcGFjaXR5IiwxKTt4Ll9iYXNlbGluZVZhbHVlUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm5beC5fYmFzZWxpbmVWYWx1ZV19O3guY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQoITEpO3JldHVybiB4fWsodSxxKTt1LnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbih4KXtyZXR1cm4gbnVsbD09Cng/cS5wcm90b3R5cGUuY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQuY2FsbCh0aGlzKTp4PyhtLldpbmRvdy53YXJuKCJXYXJuaW5nOiBTdGFja2VkIEFyZWEgUGxvdCBkb2VzIG5vdCBzdXBwb3J0IGNyb3BwZWQgcmVuZGVyaW5nLiIpLHRoaXMpOnEucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkLmNhbGwodGhpcyx4KX07dS5wcm90b3R5cGUuX2dldEFuaW1hdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBsLk51bGx9O3UucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3EucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2Jhc2VsaW5lPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCEwKX07dS5wcm90b3R5cGUueD1mdW5jdGlvbih4LEEpe2lmKG51bGw9PXgpcmV0dXJuIHEucHJvdG90eXBlLnguY2FsbCh0aGlzKTtudWxsPT1BP3EucHJvdG90eXBlLnguY2FsbCh0aGlzLHgpOnEucHJvdG90eXBlLnguY2FsbCh0aGlzLAp4LEEpO3RoaXMuX2NoZWNrU2FtZURvbWFpbigpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS55PWZ1bmN0aW9uKHgsQSl7aWYobnVsbD09eClyZXR1cm4gcS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PUE/cS5wcm90b3R5cGUueS5jYWxsKHRoaXMseCk6cS5wcm90b3R5cGUueS5jYWxsKHRoaXMseCxBKTt0aGlzLl9jaGVja1NhbWVEb21haW4oKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuc3RhY2tpbmdPcmRlcj1mdW5jdGlvbih4KXtpZihudWxsPT14KXJldHVybiB0aGlzLl9zdGFja2luZ09yZGVyO3RoaXMuX3N0YWNraW5nT3JkZXI9eDt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiBxLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkLmNhbGwodGhpcyl9O3UucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLnkoKS5zY2FsZS5zY2FsZSh0aGlzLl9iYXNlbGluZVZhbHVlKTsKeD17eDE6MCx5MTp4LHgyOnRoaXMud2lkdGgoKSx5Mjp4fTt0aGlzLl9nZXRBbmltYXRvcigiYmFzZWxpbmUiKS5hbmltYXRlKHRoaXMuX2Jhc2VsaW5lLHgpfTt1LnByb3RvdHlwZS5fdXBkYXRlWVNjYWxlPWZ1bmN0aW9uKCl7dmFyIHg9dGhpcy55KCk7eD14JiZ4LnNjYWxlO251bGwhPXgmJih4LmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSx4LmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSl9O3UucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9jaGVja1NhbWVEb21haW4oKTtxLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbih4KXtyZXR1cm4ieSI9PT14P1t0aGlzLl9zdGFja2VkRXh0ZW50KCldOnEucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsCngpfTt1LnByb3RvdHlwZS5fY2hlY2tTYW1lRG9tYWluPWZ1bmN0aW9uKCl7aWYodGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpe3ZhciB4PXRoaXMuZGF0YXNldHMoKSxBPXRoaXMueCgpLmFjY2Vzc29yLHk9eC5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIHQuc2V0KEMuZGF0YSgpLm1hcChmdW5jdGlvbihGLEQpe3JldHVybiBBKEYsRCxDKS50b1N0cmluZygpfSkpLnZhbHVlcygpfSksdz11Ll9kb21haW5LZXlzKHgsQSk7eS5zb21lKGZ1bmN0aW9uKEMpe3JldHVybiBDLmxlbmd0aCE9PXcubGVuZ3RofSkmJm0uV2luZG93Lndhcm4oInRoZSBkb21haW5zIGFjcm9zcyB0aGUgZGF0YXNldHMgYXJlIG5vdCB0aGUgc2FtZS4gUGxvdCBtYXkgcHJvZHVjZSB1bmludGVuZGVkIGJlaGF2aW9yLiIpfX07dS5fZG9tYWluS2V5cz1mdW5jdGlvbih4LEEpe3ZhciB5PXQuc2V0KCk7eC5mb3JFYWNoKGZ1bmN0aW9uKHcpe3cuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oQyxGKXt5LmFkZChBKEMsRix3KSl9KX0pOwpyZXR1cm4geS52YWx1ZXMoKX07dS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe2Z1bmN0aW9uIHgoRCxCLEkpe3JldHVybiBtLlN0YWNraW5nLm5vcm1hbGl6ZUtleShDKEQsQixJKSl9dmFyIEE9dGhpcyx5PXEucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKSx3PXRoaXMueSgpLmFjY2Vzc29yLEM9dGhpcy54KCkuYWNjZXNzb3IsRj10aGlzLl9zdGFja2luZ1Jlc3VsdCgpO3kuZD10aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKG4uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLGZ1bmN0aW9uKEQsQixJKXtyZXR1cm4gQS55KCkuc2NhbGUuc2NhbGUoK3coRCxCLEkpK0YuZ2V0KEkpLmdldCh4KEQsQixJKSkub2Zmc2V0KX0sZnVuY3Rpb24oRCxCLEkpe3JldHVybiBBLnkoKS5zY2FsZS5zY2FsZShGLmdldChJKS5nZXQoeChELEIsSSkpLm9mZnNldCl9KTtyZXR1cm4geX07dS5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oeCwKQSx5KXt2YXIgdz1xLnByb3RvdHlwZS5fcGl4ZWxQb2ludC5jYWxsKHRoaXMseCxBLHkpLEM9dGhpcy54KCkuYWNjZXNzb3IoeCxBLHkpO3g9dGhpcy55KCkuYWNjZXNzb3IoeCxBLHkpO3k9dGhpcy55KCkuc2NhbGUuc2NhbGUoK3grdGhpcy5fc3RhY2tpbmdSZXN1bHQoKS5nZXQoeSkuZ2V0KG0uU3RhY2tpbmcubm9ybWFsaXplS2V5KEMpKS5vZmZzZXQpO3JldHVybnt4OncueCx5fX07cmV0dXJuIHV9KGQuQXJlYSk7Zi5TdGFja2VkQXJlYT1ofSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHUseCl7ZnVuY3Rpb24gQSgpe3RoaXMuY29uc3RydWN0b3I9dX1mb3IodmFyIHkgaW4geCl4Lmhhc093blByb3BlcnR5KHkpJiYodVt5XT14W3ldKTt1LnByb3RvdHlwZT1udWxsPT09eD9PYmplY3QuY3JlYXRlKHgpOihBLnByb3RvdHlwZT14LnByb3RvdHlwZSxuZXcgQSl9LHQ9aCg1KSxsPWgoOCkscD1oKDIwKSxtPWgoMCksbj1oKDI3KSxxPQpoKDIpO2Q9ZnVuY3Rpb24odSl7ZnVuY3Rpb24geChBKXt2b2lkIDA9PT1BJiYoQT0idmVydGljYWwiKTt2YXIgeT11LmNhbGwodGhpcyxBKXx8dGhpczt5Ll9leHRyZW1hRm9ybWF0dGVyPWwuaWRlbnRpdHkoKTt5Ll9zdGFja2luZ1Jlc3VsdD1wLm1lbVRodW5rKGZ1bmN0aW9uKCl7cmV0dXJuIHkuZGF0YXNldHMoKX0sZnVuY3Rpb24oKXtyZXR1cm4geS5wb3NpdGlvbigpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB5Lmxlbmd0aCgpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB5Ll9zdGFja2luZ09yZGVyfSxmdW5jdGlvbih3LEMsRixEKXtyZXR1cm4gbS5TdGFja2luZy5zdGFjayh3LEMsRixEKX0pO3kuX3N0YWNrZWRFeHRlbnQ9cC5tZW1UaHVuayh5Ll9zdGFja2luZ1Jlc3VsdCxmdW5jdGlvbigpe3JldHVybiB5LnBvc2l0aW9uKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuX2ZpbHRlckZvclByb3BlcnR5KHkuX2lzVmVydGljYWw/InkiOiJ4Iil9LGZ1bmN0aW9uKHcsCkMsRil7cmV0dXJuIG0uU3RhY2tpbmcuc3RhY2tlZEV4dGVudCh3LEMsRil9KTt5LmFkZENsYXNzKCJzdGFja2VkLWJhci1wbG90Iik7eS5fc3RhY2tpbmdPcmRlcj0iYm90dG9tdXAiO3JldHVybiB5fWsoeCx1KTt4LnByb3RvdHlwZS5zdGFja2luZ09yZGVyPWZ1bmN0aW9uKEEpe2lmKG51bGw9PUEpcmV0dXJuIHRoaXMuX3N0YWNraW5nT3JkZXI7dGhpcy5fc3RhY2tpbmdPcmRlcj1BO3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5leHRyZW1hRm9ybWF0dGVyPWZ1bmN0aW9uKEEpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9leHRyZW1hRm9ybWF0dGVyO3RoaXMuX2V4dHJlbWFGb3JtYXR0ZXI9QTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9sYWJlbEFyZWE9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKG4uQmFyLl9MQUJFTF9BUkVBX0NMQVNTLAohMCk7dmFyIEE9bmV3IHQuU3ZnQ29udGV4dCh0aGlzLl9sYWJlbEFyZWEubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgdC5DYWNoZU1lYXN1cmVyKEEpO3RoaXMuX3dyaXRlcj1uZXcgdC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIsQSl9O3gucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQShPLEgpe3ZhciBLPXcuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yKCksTT13LndpZHRoKCksTD13LmhlaWdodCgpO08uZm9yRWFjaChmdW5jdGlvbihRKXtpZihRLmV4dGVudCE9PUMpe3ZhciBUPXcuZXh0cmVtYUZvcm1hdHRlcigpKFEuZXh0ZW50KSxYPXcuX21lYXN1cmVyLm1lYXN1cmUoVCksYWE9US5zdGFja2VkRGF0dW0sbGE9YWEub3JpZ2luYWxEYXR1bSxaPWFhLm9yaWdpbmFsSW5kZXg7YWE9YWEub3JpZ2luYWxEYXRhc2V0O3cuX2lzRGF0dW1PblNjcmVlbihLLE0sTCxsYSxaLGFhKSYmKGxhPXEuUGxvdC5fc2NhbGVkQWNjZXNzb3Iody5hdHRyKG4uQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKGxhLApaLGFhKSxaPUQuc2NhbGUoUS5leHRlbnQpLFE9dy5fZ2V0UG9zaXRpb25BdHRyKEYuc2NhbGUoUS5heGlzVmFsdWUpLGxhKStsYS8yLFE9SCh3Ll9pc1ZlcnRpY2FsP3t4OlEseTpafTp7eDpaLHk6UX0sWCxsYSksVD15KFQse3RvcExlZnQ6USxib3R0b21SaWdodDp7eDpRLngrWC53aWR0aCx5OlEueStYLmhlaWdodH19LGxhKSxOLnB1c2goVCkpfX0pfWZ1bmN0aW9uIHkoTyxILEspe3ZhciBNPUgudG9wTGVmdCxMPU0ueCxRPU0ueTtNPUguYm90dG9tUmlnaHQueC1ILnRvcExlZnQueDtIPUguYm90dG9tUmlnaHQueS1ILnRvcExlZnQueTtLPXcuX2lzVmVydGljYWw/TT5LOkg+SztLfHwoTD13Ll9sYWJlbEFyZWEuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTCsiLCAiK1ErIikiKSxMLmNsYXNzZWQoInN0YWNrZWQtYmFyLWxhYmVsIiwhMCksdy5fd3JpdGVyLndyaXRlKE8sTSxILHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxMLm5vZGUoKSkpOwpyZXR1cm4gS312YXIgdz10aGlzO3UucHJvdG90eXBlLl9kcmF3TGFiZWxzLmNhbGwodGhpcyk7dGhpcy5fbGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3ZhciBDPSt0aGlzLmJhc2VsaW5lVmFsdWUoKSxGPXRoaXMucG9zaXRpb24oKS5zY2FsZSxEPXRoaXMubGVuZ3RoKCkuc2NhbGUsQj1tLlN0YWNraW5nLnN0YWNrZWRFeHRlbnRzKHRoaXMuX3N0YWNraW5nUmVzdWx0KCkpLEk9Qi5taW5pbXVtRXh0ZW50cyxOPVtdO0EoQi5tYXhpbXVtRXh0ZW50cyxmdW5jdGlvbihPLEgpe3ZhciBLPXcuX2lzVmVydGljYWw/SC53aWR0aDpILmhlaWdodDtIPXcuX2lzVmVydGljYWw/SC5oZWlnaHQ6SC53aWR0aDtyZXR1cm57eDp3Ll9pc1ZlcnRpY2FsP08ueC1LLzI6Ty54K3guX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSLHk6dy5faXNWZXJ0aWNhbD9PLnktSDpPLnktSy8yfX0pO0EoSSxmdW5jdGlvbihPLEgpe3ZhciBLPXcuX2lzVmVydGljYWw/SC53aWR0aDpILmhlaWdodDsKSD13Ll9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGg7cmV0dXJue3g6dy5faXNWZXJ0aWNhbD9PLngtSy8yOk8ueC1ILHk6dy5faXNWZXJ0aWNhbD9PLnkreC5fRVhUUkVNQV9MQUJFTF9NQVJHSU5fRlJPTV9CQVI6Ty55LUsvMn19KTtOLnNvbWUoZnVuY3Rpb24oTyl7cmV0dXJuIE99KSYmdGhpcy5fbGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBKE0sTCxRKXtyZXR1cm4gMD4rTyhNLEwsUSk/QyhNLEwsUSk6dyhNLEwsUSl9ZnVuY3Rpb24geShNLEwsUSl7cmV0dXJuIE1hdGguYWJzKHcoTSxMLFEpLUMoTSxMLFEpKX1mdW5jdGlvbiB3KE0sTCxRKXtyZXR1cm4gTi5zY2FsZSgrTyhNLEwsUSkrSy5nZXQoUSkuZ2V0KEYoTSxMLFEpKS5vZmZzZXQpfWZ1bmN0aW9uIEMoTSxMLFEpe3JldHVybiBOLnNjYWxlKEsuZ2V0KFEpLmdldChGKE0sTCxRKSkub2Zmc2V0KX1mdW5jdGlvbiBGKE0sCkwsUSl7cmV0dXJuIG0uU3RhY2tpbmcubm9ybWFsaXplS2V5KEgoTSxMLFEpKX12YXIgRD10aGlzLEI9dS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksST10aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIsTj10aGlzLmxlbmd0aCgpLnNjYWxlLE89dGhpcy5sZW5ndGgoKS5hY2Nlc3NvcixIPXRoaXMucG9zaXRpb24oKS5hY2Nlc3NvcixLPXRoaXMuX3N0YWNraW5nUmVzdWx0KCk7Qlt0aGlzLl9pc1ZlcnRpY2FsPyJoZWlnaHQiOiJ3aWR0aCJdPXk7QltJXT1mdW5jdGlvbihNLEwsUSl7cmV0dXJuIEQuX2lzVmVydGljYWw/QShNLEwsUSk6QShNLEwsUSkteShNLEwsUSl9O3JldHVybiBCfTt4LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oQSl7cmV0dXJuIEE9PT0odGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiKT9bdGhpcy5fc3RhY2tlZEV4dGVudCgpXTp1LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLApBKX07eC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHh9KG4uQmFyKTtkLl9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUj01O2YuU3RhY2tlZEJhcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgwKTtkPWgoMjcpO3ZhciBsPWgoMik7aD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO24uX2Nvbm5lY3RvcnNFbmFibGVkPSExO24uYWRkQ2xhc3MoIndhdGVyZmFsbC1wbG90Iik7CnJldHVybiBufWsobSxwKTttLnByb3RvdHlwZS5jb25uZWN0b3JzRW5hYmxlZD1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9jb25uZWN0b3JzRW5hYmxlZDt0aGlzLl9jb25uZWN0b3JzRW5hYmxlZD1uO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS50b3RhbD1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChtLl9UT1RBTF9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShtLl9UT1RBTF9LRVksbixudWxsKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihuKXt2YXIgcT10aGlzO3RoaXMuX2Nvbm5lY3RvckFyZWEuc2VsZWN0QWxsKCJsaW5lIikucmVtb3ZlKCk7dGhpcy5fY29ubmVjdG9yc0VuYWJsZWQmJnQuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gcS5fZHJhd0Nvbm5lY3RvcnMoKX0sbil9O20ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9CmZ1bmN0aW9uKG4pe249cC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsbik7dGhpcy5fY29ubmVjdG9yQXJlYT10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQobS5fQ09OTkVDVE9SX0FSRUFfQ0xBU1MsITApO3JldHVybiBufTttLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24obil7cmV0dXJuInkiPT09bj9bdGhpcy5fZXh0ZW50XTpwLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLG4pfTttLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLHE9cC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksdT10aGlzLnkoKS5zY2FsZSx4PWwuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy50b3RhbCgpKTtudWxsPT10aGlzLmF0dHIoInkiKSYmKHEueT1mdW5jdGlvbihBLHksdyl7dmFyIEM9bi55KCkuYWNjZXNzb3IoQSwKeSx3KTtpZih4KEEseSx3KSlyZXR1cm4gTWF0aC5taW4odS5zY2FsZShDKSx1LnNjYWxlKDApKTtBPW4uX3N1YnRvdGFsc1t5XTtpZigwPT09eSlyZXR1cm4gMD5DP3Uuc2NhbGUoQS1DKTp1LnNjYWxlKEEpO3k9bi5fc3VidG90YWxzW3ktMV07cmV0dXJuIEE+eT91LnNjYWxlKEEpOnUuc2NhbGUoeSl9KTtudWxsPT10aGlzLmF0dHIoImhlaWdodCIpJiYocS5oZWlnaHQ9ZnVuY3Rpb24oQSx5LHcpe3ZhciBDPXgoQSx5LHcpO0E9bi55KCkuYWNjZXNzb3IoQSx5LHcpO2lmKEMpcmV0dXJuIE1hdGguYWJzKHUuc2NhbGUoQSktdS5zY2FsZSgwKSk7Qz1uLl9zdWJ0b3RhbHNbeV07aWYoMD09PXkpcmV0dXJuIE1hdGguYWJzKHUuc2NhbGUoQyktdS5zY2FsZShDLUEpKTt5PW4uX3N1YnRvdGFsc1t5LTFdO3JldHVybiBNYXRoLmFicyh1LnNjYWxlKEMpLXUuc2NhbGUoeSkpfSk7cVsiY2xhc3MiXT1mdW5jdGlvbihBLHksdyl7dmFyIEM9IiI7bnVsbCE9bi5hdHRyKCJjbGFzcyIpJiYoQz1uLmF0dHIoImNsYXNzIikuYWNjZXNzb3IoQSwKeSx3KSsiICIpO2lmKHgoQSx5LHcpKXJldHVybiBDK20uX0JBUl9UT1RBTF9DTEFTUztBPW4ueSgpLmFjY2Vzc29yKEEseSx3KTtyZXR1cm4gQysoMDxBP20uX0JBUl9HUk9XVEhfQ0xBU1M6bS5fQkFSX0RFQ0xJTkVfQ0xBU1MpfTtyZXR1cm4gcX07bS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVN1YnRvdGFscygpO3AucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2NhbGN1bGF0ZVN1YnRvdGFsc0FuZEV4dGVudD1mdW5jdGlvbihuKXt2YXIgcT10aGlzLHU9TnVtYmVyLk1BWF9WQUxVRSx4PU51bWJlci5NSU5fVkFMVUUsQT0wLHk9ITE7bi5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbih3LEMpe3ZhciBGPXEueSgpLmFjY2Vzc29yKHcsQyxuKTsodz1xLnRvdGFsKCkuYWNjZXNzb3IodyxDLG4pKSYmMCE9PUN8fChBKz1GKTtxLl9zdWJ0b3RhbHMucHVzaChBKTtBPHUmJih1PQpBKTtBPngmJih4PUEpO3cmJihGPHUmJih1PUYpLEY+eCYmKHg9RikpO2lmKCF5JiZ3KXtDPUYtQTtmb3IoRj0wO0Y8cS5fc3VidG90YWxzLmxlbmd0aDtGKyspcS5fc3VidG90YWxzW0ZdKz1DO3k9ITA7QSs9Qzt1Kz1DO3grPUN9fSk7dGhpcy5fZXh0ZW50PVt1LHhdfTttLnByb3RvdHlwZS5fZHJhd0Nvbm5lY3RvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIG49dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCkscT10aGlzLmRhdGFzZXRzKClbMF0sdT0xO3U8cS5kYXRhKCkubGVuZ3RoO3UrKyl7dmFyIHg9dS0xLEE9cS5kYXRhKClbdV0seT1xLmRhdGEoKVt4XTt5PW4ueCh5LHgscSk7dmFyIHc9bi54KEEsdSxxKStuLndpZHRoKEEsdSxxKSxDPW4ueShBLHUscSk7aWYoMDx0aGlzLl9zdWJ0b3RhbHNbdV0mJnRoaXMuX3N1YnRvdGFsc1t1XT50aGlzLl9zdWJ0b3RhbHNbeF18fDA+dGhpcy5fc3VidG90YWxzW3VdJiZ0aGlzLl9zdWJ0b3RhbHNbdV0+PXRoaXMuX3N1YnRvdGFsc1t4XSlDPW4ueShBLAp1LHEpK24uaGVpZ2h0KEEsdSxxKTt0aGlzLl9jb25uZWN0b3JBcmVhLmFwcGVuZCgibGluZSIpLmNsYXNzZWQobS5fQ09OTkVDVE9SX0NMQVNTLCEwKS5hdHRyKCJ4MSIseSkuYXR0cigieDIiLHcpLmF0dHIoInkxIixDKS5hdHRyKCJ5MiIsQyl9fTttLnByb3RvdHlwZS5fdXBkYXRlU3VidG90YWxzPWZ1bmN0aW9uKCl7dmFyIG49dGhpcy5kYXRhc2V0cygpOzA8bi5sZW5ndGgmJihuPW5bbi5sZW5ndGgtMV0sdGhpcy5fc3VidG90YWxzPVtdLHRoaXMuX2NhbGN1bGF0ZVN1YnRvdGFsc0FuZEV4dGVudChuKSl9O3JldHVybiBtfShkLkJhcik7aC5fQkFSX0RFQ0xJTkVfQ0xBU1M9IndhdGVyZmFsbC1kZWNsaW5lIjtoLl9CQVJfR1JPV1RIX0NMQVNTPSJ3YXRlcmZhbGwtZ3Jvd3RoIjtoLl9CQVJfVE9UQUxfQ0xBU1M9IndhdGVyZmFsbC10b3RhbCI7aC5fQ09OTkVDVE9SX0NMQVNTPSJjb25uZWN0b3IiO2guX0NPTk5FQ1RPUl9BUkVBX0NMQVNTPSJjb25uZWN0b3ItYXJlYSI7aC5fVE9UQUxfS0VZPQoidG90YWwiO2YuV2F0ZXJmYWxsPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDEpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7dmFyIHE9cC5jYWxsKHRoaXMpfHx0aGlzO3N3aXRjaChuKXtjYXNlIG51bGw6Y2FzZSB2b2lkIDA6bnVsbD09bS5fcGxvdHRhYmxlQ29sb3JDYWNoZSYmKG0uX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9bS5fZ2V0UGxvdHRhYmxlQ29sb3JzKCkpO249dC5zY2FsZU9yZGluYWwoKS5yYW5nZShtLl9wbG90dGFibGVDb2xvckNhY2hlKTticmVhaztjYXNlICJDYXRlZ29yeTEwIjpjYXNlICJjYXRlZ29yeTEwIjpjYXNlICIxMCI6bj0KdC5zY2FsZU9yZGluYWwodC5zY2hlbWVDYXRlZ29yeTEwKTticmVhaztjYXNlICJDYXRlZ29yeTIwIjpjYXNlICJjYXRlZ29yeTIwIjpjYXNlICIyMCI6bj10LnNjYWxlT3JkaW5hbCh0LnNjaGVtZUNhdGVnb3J5MjApO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MjBiIjpjYXNlICJjYXRlZ29yeTIwYiI6Y2FzZSAiMjBiIjpuPXQuc2NhbGVPcmRpbmFsKHQuc2NoZW1lQ2F0ZWdvcnkyMGIpO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MjBjIjpjYXNlICJjYXRlZ29yeTIwYyI6Y2FzZSAiMjBjIjpuPXQuc2NhbGVPcmRpbmFsKHQuc2NoZW1lQ2F0ZWdvcnkyMGMpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIENvbG9yU2NhbGUgdHlwZSIpO31xLl9kM1NjYWxlPW47cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBsLkFycmF5LnVuaXEobil9O20ucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbC5BcnJheS51bmlxKHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkpfTsKbS5pbnZhbGlkYXRlQ29sb3JDYWNoZT1mdW5jdGlvbigpe20uX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9bnVsbH07bS5fZ2V0UGxvdHRhYmxlQ29sb3JzPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPVtdLHE9dC5zZWxlY3QoImJvZHkiKS5hcHBlbmQoInBsb3R0YWJsZS1jb2xvci10ZXN0ZXIiKSx1PWwuQ29sb3IuY29sb3JUZXN0KHEsIiIpLHg9MCxBPWwuQ29sb3IuY29sb3JUZXN0KHEsInBsb3R0YWJsZS1jb2xvcnMtMCIpO251bGwhPUEmJng8dGhpcy5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1MmJihBIT09dXx8QSE9PW5bbi5sZW5ndGgtMV0pOyluLnB1c2goQSkseCsrLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0iK3gpO3EucmVtb3ZlKCk7cmV0dXJuIG59O20ucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKG4pe3ZhciBxPXRoaXMuX2QzU2NhbGUobik7bj10aGlzLmRvbWFpbigpLmluZGV4T2Yobik7bj1NYXRoLmZsb29yKG4vdGhpcy5yYW5nZSgpLmxlbmd0aCk7CnJldHVybiBsLkNvbG9yLmxpZ2h0ZW5Db2xvcihxLE1hdGgubG9nKG4qbS5fTE9PUF9MSUdIVEVOX0ZBQ1RPUisxKSl9O20ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O20ucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07bS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKG4pe3RoaXMuX2QzU2NhbGUucmFuZ2Uobil9O3JldHVybiBtfShoKDE3KS5TY2FsZSk7ZC5fTE9PUF9MSUdIVEVOX0ZBQ1RPUj0xLjY7ZC5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1M9MjU2O2YuQ29sb3I9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJgp0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDEpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7dm9pZCAwPT09biYmKG49ImxpbmVhciIpO3ZhciBxPXAuY2FsbCh0aGlzKXx8dGhpcztzd2l0Y2gobil7Y2FzZSAibGluZWFyIjpxLl9jb2xvclNjYWxlPXQuc2NhbGVMaW5lYXIoKTticmVhaztjYXNlICJsb2ciOnEuX2NvbG9yU2NhbGU9dC5zY2FsZUxvZygpO2JyZWFrO2Nhc2UgInNxcnQiOnEuX2NvbG9yU2NhbGU9dC5zY2FsZVNxcnQoKTticmVhaztjYXNlICJwb3ciOnEuX2NvbG9yU2NhbGU9dC5zY2FsZVBvdygpfWlmKG51bGw9PXEuX2NvbG9yU2NhbGUpdGhyb3cgRXJyb3IoInVua25vd24gUXVhbnRpdGF0aXZlU2NhbGUgc2NhbGUgdHlwZSAiKwpuKTtxLnJhbmdlKG0uUkVEUyk7cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKG4pe249dC5leHRlbnQobik7cmV0dXJuIG51bGw9PW5bMF18fG51bGw9PW5bMV0/W106bn07bS5wcm90b3R5cGUuX2QzSW50ZXJwb2xhdGVkU2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZS5yYW5nZShbMCwxXSkuaW50ZXJwb2xhdGUodGhpcy5faW50ZXJwb2xhdGVDb2xvcnMoKSl9O20ucHJvdG90eXBlLl9pbnRlcnBvbGF0ZUNvbG9ycz1mdW5jdGlvbigpe3ZhciBuPXRoaXMuX2NvbG9yUmFuZ2U7aWYoMj5uLmxlbmd0aCl0aHJvdyBFcnJvcigiQ29sb3Igc2NhbGUgYXJyYXlzIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuIik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHEpe3E9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHEpKTtxKj1uLmxlbmd0aC0xO3ZhciB1PU1hdGguZmxvb3IocSkseD1xLXU7cmV0dXJuIHQuaW50ZXJwb2xhdGVMYWIoblt1XSwKbltNYXRoLmNlaWwocSldKSh4KX19fTttLnByb3RvdHlwZS5fcmVzZXRTY2FsZT1mdW5jdGlvbigpe3RoaXMuX2QzU2NhbGU9dGhpcy5fZDNJbnRlcnBvbGF0ZWRTY2FsZSgpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTttLnByb3RvdHlwZS5hdXRvRG9tYWluPWZ1bmN0aW9uKCl7dmFyIG49dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKTswPG4ubGVuZ3RoJiZ0aGlzLl9zZXREb21haW4oW2wuTWF0aC5taW4obiwwKSxsLk1hdGgubWF4KG4sMCldKX07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O20ucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihuKTsKcmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2xvclJhbmdlfTttLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obil7dGhpcy5fY29sb3JSYW5nZT1uO3RoaXMuX3Jlc2V0U2NhbGUoKX07cmV0dXJuIG19KGgoMTcpLlNjYWxlKTtkLlJFRFM9IiNGRkZGRkYgI0ZGRjZFMSAjRkVGNEMwICNGRUQ5NzYgI0ZFQjI0QyAjRkQ4RDNDICNGQzRFMkEgI0UzMUExQyAjQjEwMDI2Ii5zcGxpdCgiICIpO2QuQkxVRVM9IiNGRkZGRkYgI0NDRkZGRiAjQTVGRkZEICM4NUY3RkIgIzZFRDNFRiAjNTVBN0UwICM0MTdGRDAgIzI1NDVEMyAjMEIwMkUxIi5zcGxpdCgiICIpO2QuUE9TTkVHPSIjMEIwMkUxICMyNTQ1RDMgIzQxN0ZEMCAjNTVBN0UwICM2RUQzRUYgIzg1RjdGQiAjQTVGRkZEICNDQ0ZGRkYgI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7CmYuSW50ZXJwb2xhdGVkQ29sb3I9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSx0PWgoMSk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKCl7dmFyIG09bC5jYWxsKHRoaXMpfHx0aGlzO20uX2QzU2NhbGU9dC5zY2FsZUxpbmVhcigpO3JldHVybiBtfWsocCxsKTtwLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLDFdfTtwLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24obSl7cmV0dXJuIG1bMF09PT1tWzFdP1ttWzBdLTEsbVsxXSsxXTptfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5fZDNTY2FsZShtKX07CnAucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMuc2NhbGUobSl9O3AucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMuaW52ZXJ0KG0pfTtwLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoITApfTtwLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtwLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbihtKXt0aGlzLmRvbWFpbihtKX07cC5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07cC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpOwp0aGlzLl9kM1NjYWxlLmRvbWFpbihtKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07cC5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKG0pe3RoaXMuX2QzU2NhbGUucmFuZ2UobSl9O3AucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5pbnZlcnQobSl9O3AucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKCl9O3AucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihtKS5uaWNlKG4pLmRvbWFpbigpfTtyZXR1cm4gcH0oaCgxMSkuUXVhbnRpdGF0aXZlU2NhbGUpO2YuTGluZWFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxuKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KbX1mb3IodmFyIHUgaW4gbiluLmhhc093blByb3BlcnR5KHUpJiYobVt1XT1uW3VdKTttLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihxLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcSl9LHQ9aCgxKSxsPWgoMCkscD1oKDMpO2Q9ZnVuY3Rpb24obSl7ZnVuY3Rpb24gbihxKXt2b2lkIDA9PT1xJiYocT0xMCk7dmFyIHU9bS5jYWxsKHRoaXMpfHx0aGlzO3UuX2QzU2NhbGU9dC5zY2FsZUxpbmVhcigpO3UuX2Jhc2U9cTt1Ll9waXZvdD11Ll9iYXNlO3UuX3NldERvbWFpbih1Ll9kZWZhdWx0RXh0ZW50KCkpO2lmKDE+PXEpdGhyb3cgRXJyb3IoIk1vZGlmaWVkTG9nU2NhbGU6IFRoZSBiYXNlIG11c3QgYmUgXHgzZSAxIik7cmV0dXJuIHV9ayhuLG0pO24ucHJvdG90eXBlLl9hZGp1c3RlZExvZz1mdW5jdGlvbihxKXt2YXIgdT0wPnE/LTE6MTtxKj11O3E8dGhpcy5fcGl2b3QmJihxKz0odGhpcy5fcGl2b3QtcSkvdGhpcy5fcGl2b3QpO3E9TWF0aC5sb2cocSkvCk1hdGgubG9nKHRoaXMuX2Jhc2UpO3JldHVybiBxKnV9O24ucHJvdG90eXBlLl9pbnZlcnRlZEFkanVzdGVkTG9nPWZ1bmN0aW9uKHEpe3ZhciB1PTA+cT8tMToxO3E9TWF0aC5wb3codGhpcy5fYmFzZSxxKnUpO3E8dGhpcy5fcGl2b3QmJihxPXRoaXMuX3Bpdm90KihxLTEpLyh0aGlzLl9waXZvdC0xKSk7cmV0dXJuIHEqdX07bi5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24ocSl7cmV0dXJuIHRoaXMuX2QzU2NhbGUodGhpcy5fYWRqdXN0ZWRMb2cocSkpfTtuLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24ocSl7cmV0dXJuIHRoaXMuX2ludmVydGVkQWRqdXN0ZWRMb2codGhpcy5fZDNTY2FsZS5pbnZlcnQocSkpfTtuLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLnNjYWxlKHEpfTtuLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLmludmVydChxKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9O24ucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9O24ucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHEpe3RoaXMuZG9tYWluKHEpfTtuLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VudHJhbnNmb3JtZWREb21haW59O24ucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24ocSl7dGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbj1xO20ucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLFt0aGlzLl9hZGp1c3RlZExvZyhxWzBdKSx0aGlzLl9hZGp1c3RlZExvZyhxWzFdKV0pfTtuLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4ocSk7CnJldHVybiB0aGlzfTtuLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHEoRixELEIpe3JldHVybltGLEQsQl0uc29ydChmdW5jdGlvbihJLE4pe3JldHVybiBJLU59KVsxXX12YXIgdT1sLk1hdGgubWluKHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCkseD1sLk1hdGgubWF4KHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCksQT1xKHUseCwtdGhpcy5fcGl2b3QpLHk9cSh1LHgsdGhpcy5fcGl2b3QpO0E9dGhpcy5fbG9nVGlja3MoLUEsLXUpLm1hcChmdW5jdGlvbihGKXtyZXR1cm4tRn0pLnJldmVyc2UoKTt5PXRoaXMuX2xvZ1RpY2tzKHkseCk7dmFyIHc9TWF0aC5tYXgodSwtdGhpcy5fcGl2b3QpLEM9TWF0aC5taW4oeCx0aGlzLl9waXZvdCk7dz10LnNjYWxlTGluZWFyKCkuZG9tYWluKFt3LENdKS50aWNrcyh0aGlzLl9ob3dNYW55VGlja3ModyxDKSk7QT1BLmNvbmNhdCh3KS5jb25jYXQoeSk7MT49QS5sZW5ndGgmJihBPXQuc2NhbGVMaW5lYXIoKS5kb21haW4oW3UsCnhdKS50aWNrcygpKTtyZXR1cm4gQX07bi5wcm90b3R5cGUuX2xvZ1RpY2tzPWZ1bmN0aW9uKHEsdSl7dmFyIHg9dGhpcyxBPXRoaXMuX2hvd01hbnlUaWNrcyhxLHUpO2lmKDA9PT1BKXJldHVybltdO3ZhciB5PU1hdGguZmxvb3IoTWF0aC5sb2cocSkvTWF0aC5sb2codGhpcy5fYmFzZSkpLHc9TWF0aC5jZWlsKE1hdGgubG9nKHUpL01hdGgubG9nKHRoaXMuX2Jhc2UpKTtBPXQucmFuZ2Uodyx5LC1NYXRoLmNlaWwoKHcteSkvQSkpO3k9dC5yYW5nZSh0aGlzLl9iYXNlLDEsLSh0aGlzLl9iYXNlLTEpKS5tYXAoTWF0aC5mbG9vcik7dmFyIEM9bC5BcnJheS51bmlxKHkpO0E9QS5tYXAoZnVuY3Rpb24oRil7cmV0dXJuIEMubWFwKGZ1bmN0aW9uKEQpe3JldHVybiBNYXRoLnBvdyh4Ll9iYXNlLEYtMSkqRH0pfSk7cmV0dXJuIGwuQXJyYXkuZmxhdHRlbihBKS5maWx0ZXIoZnVuY3Rpb24oRil7cmV0dXJuIHE8PUYmJkY8PXV9KS5zb3J0KGZ1bmN0aW9uKEYsRCl7cmV0dXJuIEYtRH0pfTsKbi5wcm90b3R5cGUuX2hvd01hbnlUaWNrcz1mdW5jdGlvbihxLHUpe3ZhciB4PXRoaXMuX2FkanVzdGVkTG9nKGwuTWF0aC5taW4odGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSksQT10aGlzLl9hZGp1c3RlZExvZyhsLk1hdGgubWF4KHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCkpO3JldHVybiBNYXRoLmNlaWwoKHRoaXMuX2FkanVzdGVkTG9nKHUpLXRoaXMuX2FkanVzdGVkTG9nKHEpKS8oQS14KSpwLk1vZGlmaWVkTG9nLl9ERUZBVUxUX05VTV9USUNLUyl9O24ucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKHEpe3JldHVybiBxfTtuLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLHRoaXMuX2Jhc2VdfTtuLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24ocSl7cmV0dXJuIHFbMF09PT1xWzFdPyhxPXFbMF0sMDxxP1txL3RoaXMuX2Jhc2UscSp0aGlzLl9iYXNlXTowPT09cT9bLXRoaXMuX2Jhc2UsCnRoaXMuX2Jhc2VdOltxKnRoaXMuX2Jhc2UscS90aGlzLl9iYXNlXSk6cX07bi5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07bi5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHEpe3RoaXMuX2QzU2NhbGUucmFuZ2UocSl9O24ucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKCl9O3JldHVybiBufShoKDExKS5RdWFudGl0YXRpdmVTY2FsZSk7Zi5Nb2RpZmllZExvZz1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgwKTtmLmludGVydmFsVGlja0dlbmVyYXRvcj1mdW5jdGlvbih0KXtpZigwPj10KXRocm93IEVycm9yKCJpbnRlcnZhbCBtdXN0IGJlIHBvc2l0aXZlIG51bWJlciIpO3JldHVybiBmdW5jdGlvbihsKXtsPWwuZG9tYWluKCk7dmFyIHA9TWF0aC5taW4obFswXSxsWzFdKTtsPU1hdGgubWF4KGxbMF0sbFsxXSk7dmFyIG09TWF0aC5jZWlsKHAvdCkqCnQ7cD0wPT09cCV0P1tdOltwXTt2YXIgbj1rLk1hdGgucmFuZ2UoMCxNYXRoLmZsb29yKChsLW0pL3QpKzEpLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gbStxKnR9KTtyZXR1cm4gcC5jb25jYXQobikuY29uY2F0KDA9PT1sJXQ/W106W2xdKX19O2YuaW50ZWdlclRpY2tHZW5lcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGw9dC5kZWZhdWx0VGlja3MoKTtyZXR1cm4gbC5maWx0ZXIoZnVuY3Rpb24ocCxtKXtyZXR1cm4gMD09PXAlMXx8MD09PW18fG09PT1sLmxlbmd0aC0xfSl9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksCmw9aCgyOCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO24uX2QzU2NhbGU9dC5zY2FsZVRpbWUoKTtuLmF1dG9Eb21haW4oKTtyZXR1cm4gbn1rKG0scCk7bS5wcm90b3R5cGUudGlja0ludGVydmFsPWZ1bmN0aW9uKG4scSl7dm9pZCAwPT09cSYmKHE9MSk7dmFyIHU9dC5zY2FsZVRpbWUoKTttLnRpbWVJbnRlcnZhbFRvRDNUaW1lKG4pLmV2ZXJ5KHEpO3UuZG9tYWluKHRoaXMuZG9tYWluKCkpO3UucmFuZ2UodGhpcy5yYW5nZSgpKTtyZXR1cm4gdS50aWNrcygpfTttLnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKG4pe2lmKG5bMV08blswXSl0aHJvdyBFcnJvcigiU2NhbGUuVGltZSBkb21haW4gdmFsdWVzIG11c3QgYmUgaW4gY2hyb25vbG9naWNhbCBvcmRlciIpO3JldHVybiBwLnByb3RvdHlwZS5fc2V0RG9tYWluLmNhbGwodGhpcyxuKX07bS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bbmV3IERhdGUoIjE5NzAtMDEtMDEiKSwKbmV3IERhdGUoIjE5NzAtMDEtMDIiKV19O20ucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbihuKXt2YXIgcT1uWzBdLmdldFRpbWUoKSx1PW5bMV0uZ2V0VGltZSgpO3JldHVybiBxPT09dT8obj1uZXcgRGF0ZShxKSxuLnNldERhdGUobi5nZXREYXRlKCktMSksdT1uZXcgRGF0ZSh1KSx1LnNldERhdGUodS5nZXREYXRlKCkrMSksW24sdV0pOm59O20ucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9kM1NjYWxlKG4pfTttLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLnNjYWxlKG5ldyBEYXRlKG4pKX07bS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5pbnZlcnQobikuZ2V0VGltZSgpfTttLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3ZhciBuPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCk7CnJldHVybltuWzBdLnZhbHVlT2YoKSxuWzFdLnZhbHVlT2YoKV19O20ucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7dmFyIG49dGhpcy5kb21haW4oKTtyZXR1cm5bblswXS52YWx1ZU9mKCksblsxXS52YWx1ZU9mKCldfTttLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbihuKXt0aGlzLmRvbWFpbihbbmV3IERhdGUoblswXSksbmV3IERhdGUoblsxXSldKX07bS5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07bS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTttLnByb3RvdHlwZS5fc2V0UmFuZ2U9CmZ1bmN0aW9uKG4pe3RoaXMuX2QzU2NhbGUucmFuZ2Uobil9O20ucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5pbnZlcnQobil9O20ucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKCl9O20ucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9kM1NjYWxlLmNvcHkoKS5kb21haW4obikubmljZSgpLmRvbWFpbigpfTttLnRpbWVJbnRlcnZhbFRvRDNUaW1lPWZ1bmN0aW9uKG4pe3N3aXRjaChuKXtjYXNlIGwuVGltZUludGVydmFsLnNlY29uZDpyZXR1cm4gdC50aW1lU2Vjb25kO2Nhc2UgbC5UaW1lSW50ZXJ2YWwubWludXRlOnJldHVybiB0LnRpbWVNaW51dGU7Y2FzZSBsLlRpbWVJbnRlcnZhbC5ob3VyOnJldHVybiB0LnRpbWVIb3VyO2Nhc2UgbC5UaW1lSW50ZXJ2YWwuZGF5OnJldHVybiB0LnRpbWVEYXk7Y2FzZSBsLlRpbWVJbnRlcnZhbC53ZWVrOnJldHVybiB0LnRpbWVXZWVrOwpjYXNlIGwuVGltZUludGVydmFsLm1vbnRoOnJldHVybiB0LnRpbWVNb250aDtjYXNlIGwuVGltZUludGVydmFsLnllYXI6cmV0dXJuIHQudGltZVllYXI7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVGltZUludGVydmFsIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdDogIituKTt9fTtyZXR1cm4gbX0oaCgxMSkuUXVhbnRpdGF0aXZlU2NhbGUpO2YuVGltZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSx0PUFycmF5O2YuYWRkPWZ1bmN0aW9uKGwscCl7aWYobC5sZW5ndGghPT1wLmxlbmd0aCl0aHJvdyBFcnJvcigiYXR0ZW1wdGVkIHRvIGFkZCBhcnJheXMgb2YgdW5lcXVhbCBsZW5ndGgiKTtyZXR1cm4gbC5tYXAoZnVuY3Rpb24obSxuKXtyZXR1cm4gbFtuXStwW25dfSl9O2YudW5pcT1mdW5jdGlvbihsKXt2YXIgcD1rLnNldCgpLG09W107bC5mb3JFYWNoKGZ1bmN0aW9uKG4pe3AuaGFzKFN0cmluZyhuKSl8fChwLmFkZChTdHJpbmcobikpLG0ucHVzaChuKSl9KTtyZXR1cm4gbX07CmYuZmxhdHRlbj1mdW5jdGlvbihsKXtyZXR1cm4gdC5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGwpfTtmLmNyZWF0ZUZpbGxlZEFycmF5PWZ1bmN0aW9uKGwscCl7Zm9yKHZhciBtPVtdLG49MDtuPHA7bisrKW1bbl09ImZ1bmN0aW9uIj09PXR5cGVvZiBsP2wobik6bDtyZXR1cm4gbX19LGZ1bmN0aW9uKGQsZil7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoayx0LGwpe3RoaXMubWF4SW5kZXg9dGhpcy5taW5JbmRleD10aGlzLmV4aXRJbmRleD10aGlzLmVudHJ5SW5kZXg9azt0aGlzLmJ1Y2tldFZhbHVlPXQ7dGhpcy5tYXhWYWx1ZT10aGlzLm1pblZhbHVlPWx9aC5wcm90b3R5cGUuaXNJbkJ1Y2tldD1mdW5jdGlvbihrKXtyZXR1cm4gaz09dGhpcy5idWNrZXRWYWx1ZX07aC5wcm90b3R5cGUuYWRkVG9CdWNrZXQ9ZnVuY3Rpb24oayx0KXtrPHRoaXMubWluVmFsdWUmJih0aGlzLm1pblZhbHVlPWssdGhpcy5taW5JbmRleD10KTtrPnRoaXMubWF4VmFsdWUmJih0aGlzLm1heFZhbHVlPQprLHRoaXMubWF4SW5kZXg9dCk7dGhpcy5leGl0SW5kZXg9dH07aC5wcm90b3R5cGUuZ2V0VW5pcXVlSW5kaWNlcz1mdW5jdGlvbigpe3ZhciBrPVt0aGlzLmVudHJ5SW5kZXgsdGhpcy5tYXhJbmRleCx0aGlzLm1pbkluZGV4LHRoaXMuZXhpdEluZGV4XTtyZXR1cm4gay5maWx0ZXIoZnVuY3Rpb24odCxsKXtyZXR1cm4gMD09bHx8dCE9a1tsLTFdfSl9O3JldHVybiBofSgpO2YuQnVja2V0PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8CnRoaXN9ayhsLHQpO2wucHJvdG90eXBlLmNhbGxDYWxsYmFja3M9ZnVuY3Rpb24oKXtmb3IodmFyIHA9dGhpcyxtPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKW1bbl09YXJndW1lbnRzW25dO3RoaXMuZm9yRWFjaChmdW5jdGlvbihxKXtxLmFwcGx5KHAsbSl9KTtyZXR1cm4gdGhpc307cmV0dXJuIGx9KGgoNTgpLlNldCk7Zi5DYWxsYmFja1NldD1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhwKXtmdW5jdGlvbiBtKHUpe3UvPTI1NTtyZXR1cm4uMDM5Mjg+PXU/dS8xMi45MjpsLnBvdygodSsuMDU1KS8xLjA1NSwyLjQpfXZhciBuPXQucmdiKHApO3A9bShuLnIpO3ZhciBxPW0obi5nKTtuPW0obi5iKTtyZXR1cm4uMjEyNipwKy43MTUyKnErLjA3MjIqbn12YXIgdD1oKDEpLGw9TWF0aDtmLmNvbnRyYXN0PWZ1bmN0aW9uKHAsbSl7cD1rKHApKy4wNTttPWsobSkrLjA1O3JldHVybiBwPm0/cC9tOm0vcH07Zi5saWdodGVuQ29sb3I9ZnVuY3Rpb24ocCxtKXtyZXR1cm4gdC5jb2xvcihwKS5icmlnaHRlcihtKS5yZ2IoKS50b1N0cmluZygpfTsKZi5jb2xvclRlc3Q9ZnVuY3Rpb24ocCxtKXtwLmNsYXNzZWQobSwhMCk7dmFyIG49cC5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIpO2lmKCJ0cmFuc3BhcmVudCI9PT1uKXJldHVybiBudWxsO249L1woKC4rKVwpLy5leGVjKG4pO2lmKCFuKXJldHVybiBudWxsO249blsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihxKXtxPStxO3ZhciB1PXEudG9TdHJpbmcoMTYpO3JldHVybiAxNj5xPyIwIit1OnV9KTtpZig0PT09bi5sZW5ndGgmJiIwMCI9PT1uWzNdKXJldHVybiBudWxsO249IiMiK24uam9pbigiIik7cC5jbGFzc2VkKG0sITEpO3JldHVybiBufX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMSksdD1oKDU3KTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe3RoaXMuX2VudGl0aWVzPVtdO3RoaXMuX3J0cmVlPW5ldyB0LlJUcmVlO3RoaXMuX3RyZWU9ay5xdWFkdHJlZSgpLngoZnVuY3Rpb24ocCl7cmV0dXJuIE1hdGguZmxvb3IocC5wb3NpdGlvbi54KX0pLnkoZnVuY3Rpb24ocCl7cmV0dXJuIE1hdGguZmxvb3IocC5wb3NpdGlvbi55KX0pfQpsLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24ocCxtLG4peyh4PXRoaXMuX2VudGl0aWVzKS5wdXNoLmFwcGx5KHgscCk7aWYodm9pZCAwIT09bilmb3Iobj10LlJUcmVlQm91bmRzLmJvdW5kcyhuKSx4PTA7eDxwLmxlbmd0aDt4Kyspe3ZhciBxPXBbeF0sdT10LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhtKHEpKTt0LlJUcmVlQm91bmRzLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyhuLHUpJiYodGhpcy5fdHJlZS5hZGQocSksdGhpcy5fcnRyZWUuaW5zZXJ0KHUscSkpfWVsc2UgZm9yKHRoaXMuX3RyZWUuYWRkQWxsKHApLHg9MDt4PHAubGVuZ3RoO3grKylxPXBbeF0sdT10LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhtKHEpKSx0aGlzLl9ydHJlZS5pbnNlcnQodSxxKTt2YXIgeH07bC5wcm90b3R5cGUuZW50aXR5TmVhcmVzdD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5fdHJlZS5maW5kKHAueCxwLnkpfTtsLnByb3RvdHlwZS5lbnRpdGllc0luQm91bmRzPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3QodC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMocCkpfTsKbC5wcm90b3R5cGUuZW50aXRpZXNJblhCb3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuX3J0cmVlLmludGVyc2VjdFgodC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMocCkpfTtsLnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WSh0LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9O2wucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VudGl0aWVzfTtyZXR1cm4gbH0oKTtmLkVudGl0eVN0b3JlPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDU2KTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93Lk1hcD90aGlzLl9lczZNYXA9bmV3IHdpbmRvdy5NYXA6dGhpcy5fa2V5VmFsdWVQYWlycz1bXX10LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24obCxwKXtpZihrLmlzTmFOKGwpKXRocm93IEVycm9yKCJOYU4gbWF5IG5vdCBiZSB1c2VkIGFzIGEga2V5IHRvIHRoZSBNYXAiKTsKaWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuc2V0KGwscCksdGhpcztmb3IodmFyIG09MDttPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO20rKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW21dLmtleT09PWwpcmV0dXJuIHRoaXMuX2tleVZhbHVlUGFpcnNbbV0udmFsdWU9cCx0aGlzO3RoaXMuX2tleVZhbHVlUGFpcnMucHVzaCh7a2V5OmwsdmFsdWU6cH0pO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24obCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuZ2V0KGwpO2Zvcih2YXIgcD0wO3A8dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7cCsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbcF0ua2V5PT09bClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1twXS52YWx1ZX07dC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGwpe2lmKG51bGwhPXRoaXMuX2VzNk1hcClyZXR1cm4gdGhpcy5fZXM2TWFwLmhhcyhsKTsKZm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiEwO3JldHVybiExfTt0LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGwscCl7dmFyIG09dGhpcztudWxsIT10aGlzLl9lczZNYXA/dGhpcy5fZXM2TWFwLmZvckVhY2goZnVuY3Rpb24obixxKXtyZXR1cm4gbC5jYWxsKHAsbixxLG0pfSxwKTp0aGlzLl9rZXlWYWx1ZVBhaXJzLmZvckVhY2goZnVuY3Rpb24obil7bC5jYWxsKHAsbi52YWx1ZSxuLmtleSxtKX0pfTt0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24obCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuZGVsZXRlKGwpO2Zvcih2YXIgcD0wO3A8dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7cCsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbcF0ua2V5PT09bClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlycy5zcGxpY2UocCwxKSwhMDtyZXR1cm4hMX07CnJldHVybiB0fSgpO2YuTWFwPWR9LGZ1bmN0aW9uKGQsZil7Zi5hc3NpZ249ZnVuY3Rpb24oKXtmb3IodmFyIGg9W10saz0wO2s8YXJndW1lbnRzLmxlbmd0aDtrKyspaFtrXT1hcmd1bWVudHNba107az17fTtmb3IodmFyIHQ9MDt0PGgubGVuZ3RoO3QrKylmb3IodmFyIGw9aFt0XSxwPTAsbT1PYmplY3Qua2V5cyhsKTtwPG0ubGVuZ3RoO3ArKyl7dmFyIG49bVtwXTtrW25dPWxbbl19cmV0dXJuIGt9fSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKCl7fWgucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKGssdCl7Zm9yKHZhciBsPU1hdGguY2VpbChrLmxlbmd0aC8yKSxwPTA7cDxsO3ArKyl0WzBdLmluc2VydChrW3BdKTtmb3IocD1sO3A8ay5sZW5ndGg7cCsrKXRbMV0uaW5zZXJ0KGtbcF0pfTtyZXR1cm4gaH0oKTtmLlNwbGl0U3RyYXRlZ3lUcml2aWFsPWQ7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oayx0KXtrPQprLnNsaWNlKCk7Zm9yKHRoaXMuY2hvb3NlRmlyc3RTcGxpdChrLHQpOzA8ay5sZW5ndGg7KXRoaXMuYWRkTmV4dChrLHQpfTtoLnByb3RvdHlwZS5jaG9vc2VGaXJzdFNwbGl0PWZ1bmN0aW9uKGssdCl7Zm9yKHZhciBsPTAscD0wLG09ay5sZW5ndGgtMSxuPWsubGVuZ3RoLTEscT0xO3E8ay5sZW5ndGgtMTtxKyspe3ZhciB1PWtbcV07dS5ib3VuZHMueGw+a1ttXS5ib3VuZHMueGw/bT1xOnUuYm91bmRzLnhoPGtbbF0uYm91bmRzLnhoJiYobD1xKTt1LmJvdW5kcy55bD5rW25dLmJvdW5kcy55bD9uPXE6dS5ib3VuZHMueWg8a1twXS5ib3VuZHMueWgmJihwPXEpfXA9TWF0aC5hYnMoa1tsXS5ib3VuZHMueGgta1ttXS5ib3VuZHMueGwpPk1hdGguYWJzKGtbcF0uYm91bmRzLnloLWtbbl0uYm91bmRzLnlsKT9bbCxtXTpbcCxuXTtsPXBbMF07cD1wWzFdO2w9PT1wJiYobD0wLHA9ay5sZW5ndGgtMSk7dFswXS5pbnNlcnQoay5zcGxpY2UoTWF0aC5tYXgobCxwKSwxKVswXSk7dFsxXS5pbnNlcnQoay5zcGxpY2UoTWF0aC5taW4obCwKcCksMSlbMF0pfTtoLnByb3RvdHlwZS5hZGROZXh0PWZ1bmN0aW9uKGssdCl7Zm9yKHZhciBsPW51bGwscD1udWxsLG09bnVsbCxuPTA7bjxrLmxlbmd0aDtuKyspe3ZhciBxPWtbbl0sdT10WzBdLnVuaW9uQXJlYURpZmZlcmVuY2UocS5ib3VuZHMpO3E9dFsxXS51bmlvbkFyZWFEaWZmZXJlbmNlKHEuYm91bmRzKTtpZih1PHB8fG51bGw9PWwpbD1uLHA9dSxtPXRbMF07cTxwJiYobD1uLHA9cSxtPXRbMV0pfW0uaW5zZXJ0KGsuc3BsaWNlKGwsMSlbMF0pfTtyZXR1cm4gaH0oKTtmLlNwbGl0U3RyYXRlZ3lMaW5lYXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsobSl7cmV0dXJuIFN0cmluZyhtKX12YXIgdD1oKDEpLGw9aCgwKTtkPWgoMTApO2YuSVN0YWNraW5nT3JkZXI9ZC5tYWtlRW51bShbInRvcGRvd24iLCJib3R0b211cCJdKTt2YXIgcD1NYXRoO2Yuc3RhY2s9ZnVuY3Rpb24obSxuLHEsdSl7dm9pZCAwPT09dSYmKHU9ImJvdHRvbXVwIik7dmFyIHg9dC5tYXAoKSxBPQp0Lm1hcCgpLHk9bmV3IGwuTWFwOyJ0b3Bkb3duIj09PXUmJihtPW0uc2xpY2UoKSxtLnJldmVyc2UoKSk7bS5mb3JFYWNoKGZ1bmN0aW9uKHcpe3ZhciBDPW5ldyBsLk1hcDt3LmRhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uKEYsRCl7dmFyIEI9ayhuKEYsRCx3KSksST0rcShGLEQsdyksTj0wPD1JP3g6QTtpZihOLmhhcyhCKSl7dmFyIE89Ti5nZXQoQik7Ti5zZXQoQixPK0kpfWVsc2UgTz0wLE4uc2V0KEIsSSk7Qy5zZXQoQix7b2Zmc2V0Ok8sdmFsdWU6SSxheGlzVmFsdWU6bihGLEQsdyksb3JpZ2luYWxEYXR1bTpGLG9yaWdpbmFsRGF0YXNldDp3LG9yaWdpbmFsSW5kZXg6RH0pfSk7eS5zZXQodyxDKX0pO3JldHVybiB5fTtmLnN0YWNrZWRFeHRlbnRzPWZ1bmN0aW9uKG0pe3ZhciBuPW5ldyBsLk1hcCxxPW5ldyBsLk1hcDttLmZvckVhY2goZnVuY3Rpb24odSl7dS5mb3JFYWNoKGZ1bmN0aW9uKHgsQSl7dmFyIHk9bC5NYXRoLm1heChbeC5vZmZzZXQreC52YWx1ZSx4Lm9mZnNldF0sCngub2Zmc2V0KSx3PWwuTWF0aC5taW4oW3gub2Zmc2V0K3gudmFsdWUseC5vZmZzZXRdLHgub2Zmc2V0KSxDPXguYXhpc1ZhbHVlO24uaGFzKEEpP24uZ2V0KEEpLmV4dGVudDx5JiZuLnNldChBLHtleHRlbnQ6eSxheGlzVmFsdWU6QyxzdGFja2VkRGF0dW06eH0pOm4uc2V0KEEse2V4dGVudDp5LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp4fSk7cS5oYXMoQSk/cS5nZXQoQSkuZXh0ZW50PncmJnEuc2V0KEEse2V4dGVudDp3LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp4fSk6cS5zZXQoQSx7ZXh0ZW50OncsYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnh9KX0pfSk7cmV0dXJue21heGltdW1FeHRlbnRzOm4sbWluaW11bUV4dGVudHM6cX19O2Yuc3RhY2tlZEV4dGVudD1mdW5jdGlvbihtLG4scSl7dmFyIHU9W107bS5mb3JFYWNoKGZ1bmN0aW9uKEEseSl7eS5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbih3LEMpe2lmKG51bGw9PXF8fHEodyxDLHkpKXc9QS5nZXQoayhuKHcsQyx5KSkpLAp1LnB1c2gody52YWx1ZSt3Lm9mZnNldCl9KX0pO209bC5NYXRoLm1heCh1LDApO3ZhciB4PWwuTWF0aC5taW4odSwwKTtyZXR1cm5bcC5taW4oeCwwKSxwLm1heCgwLG0pXX07Zi5ub3JtYWxpemVLZXk9a30sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7Zi5nZXRUcmFuc2xhdG9yPWZ1bmN0aW9uKGwpe2w9bC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7dmFyIHA9bC5fX1Bsb3R0YWJsZV9DbGllbnRUcmFuc2xhdG9yO251bGw9PXAmJihwPW5ldyB0KGwpLGwuX19QbG90dGFibGVfQ2xpZW50VHJhbnNsYXRvcj1wKTtyZXR1cm4gcH07dmFyIHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKHApe3RoaXMuX3Jvb3RFbGVtZW50PXB9bC5wcm90b3R5cGUuY29tcHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKHAsbSl7cD17eDpwLHk6bX07bT1rLk1hdGguZ2V0Q3VtdWxhdGl2ZVRyYW5zZm9ybSh0aGlzLl9yb290RWxlbWVudCk7cmV0dXJuIG51bGw9PW0/cDprLk1hdGguYXBwbHlUcmFuc2Zvcm0obSwKcCl9O2wuaXNFdmVudEluc2lkZT1mdW5jdGlvbihwLG0pe3JldHVybiBrLkRPTS5jb250YWlucyhwLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSxtLnRhcmdldCl9O3JldHVybiBsfSgpO2YuVHJhbnNsYXRvcj10fSxmdW5jdGlvbihkLGYsaCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBrPWgoMTI0KTtoLmQoZiwiZWFzZUxpbmVhciIsZnVuY3Rpb24oKXtyZXR1cm4gay5hfSk7dmFyIHQ9aCgxMjYpO2guZChmLCJlYXNlUXVhZCIsZnVuY3Rpb24oKXtyZXR1cm4gdC5hfSk7aC5kKGYsImVhc2VRdWFkSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHQuYn0pO2guZChmLCJlYXNlUXVhZE91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdC5jfSk7aC5kKGYsImVhc2VRdWFkSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHQuYX0pO3ZhciBsPWgoMTIxKTtoLmQoZiwiZWFzZUN1YmljIixmdW5jdGlvbigpe3JldHVybiBsLmF9KTtoLmQoZiwiZWFzZUN1YmljSW4iLApmdW5jdGlvbigpe3JldHVybiBsLmJ9KTtoLmQoZiwiZWFzZUN1YmljT3V0IixmdW5jdGlvbigpe3JldHVybiBsLmN9KTtoLmQoZiwiZWFzZUN1YmljSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuYX0pO3ZhciBwPWgoMTI1KTtoLmQoZiwiZWFzZVBvbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYX0pO2guZChmLCJlYXNlUG9seUluIixmdW5jdGlvbigpe3JldHVybiBwLmJ9KTtoLmQoZiwiZWFzZVBvbHlPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHAuY30pO2guZChmLCJlYXNlUG9seUluT3V0IixmdW5jdGlvbigpe3JldHVybiBwLmF9KTt2YXIgbT1oKDEyNyk7aC5kKGYsImVhc2VTaW4iLGZ1bmN0aW9uKCl7cmV0dXJuIG0uYX0pO2guZChmLCJlYXNlU2luSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIG0uYn0pO2guZChmLCJlYXNlU2luT3V0IixmdW5jdGlvbigpe3JldHVybiBtLmN9KTtoLmQoZiwiZWFzZVNpbkluT3V0IixmdW5jdGlvbigpe3JldHVybiBtLmF9KTt2YXIgbj1oKDEyMyk7aC5kKGYsCiJlYXNlRXhwIixmdW5jdGlvbigpe3JldHVybiBuLmF9KTtoLmQoZiwiZWFzZUV4cEluIixmdW5jdGlvbigpe3JldHVybiBuLmJ9KTtoLmQoZiwiZWFzZUV4cE91dCIsZnVuY3Rpb24oKXtyZXR1cm4gbi5jfSk7aC5kKGYsImVhc2VFeHBJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gbi5hfSk7dmFyIHE9aCgxMjApO2guZChmLCJlYXNlQ2lyY2xlIixmdW5jdGlvbigpe3JldHVybiBxLmF9KTtoLmQoZiwiZWFzZUNpcmNsZUluIixmdW5jdGlvbigpe3JldHVybiBxLmJ9KTtoLmQoZiwiZWFzZUNpcmNsZU91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcS5jfSk7aC5kKGYsImVhc2VDaXJjbGVJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcS5hfSk7dmFyIHU9aCgxMTkpO2guZChmLCJlYXNlQm91bmNlIixmdW5jdGlvbigpe3JldHVybiB1LmF9KTtoLmQoZiwiZWFzZUJvdW5jZUluIixmdW5jdGlvbigpe3JldHVybiB1LmJ9KTtoLmQoZiwiZWFzZUJvdW5jZU91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdS5hfSk7CmguZChmLCJlYXNlQm91bmNlSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHUuY30pO3ZhciB4PWgoMTE4KTtoLmQoZiwiZWFzZUJhY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHguYX0pO2guZChmLCJlYXNlQmFja0luIixmdW5jdGlvbigpe3JldHVybiB4LmJ9KTtoLmQoZiwiZWFzZUJhY2tPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHguY30pO2guZChmLCJlYXNlQmFja0luT3V0IixmdW5jdGlvbigpe3JldHVybiB4LmF9KTt2YXIgQT1oKDEyMik7aC5kKGYsImVhc2VFbGFzdGljIixmdW5jdGlvbigpe3JldHVybiBBLmF9KTtoLmQoZiwiZWFzZUVsYXN0aWNJbiIsZnVuY3Rpb24oKXtyZXR1cm4gQS5ifSk7aC5kKGYsImVhc2VFbGFzdGljT3V0IixmdW5jdGlvbigpe3JldHVybiBBLmF9KTtoLmQoZiwiZWFzZUVsYXN0aWNJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gQS5jfSl9LGZ1bmN0aW9uKGQsZixoKXtoLmQoZiwiYiIsZnVuY3Rpb24oKXtyZXR1cm4ga30pO2guZChmLCJjIixmdW5jdGlvbigpe3JldHVybiB0fSk7CmguZChmLCJhIixmdW5jdGlvbigpe3JldHVybiBsfSk7dmFyIGs9ZnVuY3Rpb24gbihtKXtmdW5jdGlvbiBxKHUpe3JldHVybiB1KnUqKChtKzEpKnUtbSl9bT0rbTtxLm92ZXJzaG9vdD1uO3JldHVybiBxfSgxLjcwMTU4KSx0PWZ1bmN0aW9uIHEobil7ZnVuY3Rpb24gdSh4KXtyZXR1cm4tLXgqeCooKG4rMSkqeCtuKSsxfW49K247dS5vdmVyc2hvb3Q9cTtyZXR1cm4gdX0oMS43MDE1OCksbD1mdW5jdGlvbiB1KHEpe2Z1bmN0aW9uIHgoQSl7cmV0dXJuKDE+KEEqPTIpP0EqQSooKHErMSkqQS1xKTooQS09MikqQSooKHErMSkqQStxKSsyKS8yfXE9K3E7eC5vdmVyc2hvb3Q9dTtyZXR1cm4geH0oMS43MDE1OCl9LGZ1bmN0aW9uKGQsZil7ZnVuY3Rpb24gaCh5KXtyZXR1cm4oeT0reSk8az9BKnkqeTp5PGw/QSooeS09dCkqeStwOnk8bj9BKih5LT1tKSp5K3E6QSooeS09dSkqeSt4fWYuYj1mdW5jdGlvbih5KXtyZXR1cm4gMS1oKDEteSl9O2YuYT1oO2YuYz1mdW5jdGlvbih5KXtyZXR1cm4oMT49Cih5Kj0yKT8xLWgoMS15KTpoKHktMSkrMSkvMn07dmFyIGs9NC8xMSx0PTYvMTEsbD04LzExLHA9Ljc1LG09OS8xMSxuPTEwLzExLHE9LjkzNzUsdT0yMS8yMix4PS45ODQzNzUsQT0xL2sva30sZnVuY3Rpb24oZCxmKXtmLmI9ZnVuY3Rpb24oaCl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtaCpoKX07Zi5jPWZ1bmN0aW9uKGgpe3JldHVybiBNYXRoLnNxcnQoMS0gLS1oKmgpfTtmLmE9ZnVuY3Rpb24oaCl7cmV0dXJuKDE+PShoKj0yKT8xLU1hdGguc3FydCgxLWgqaCk6TWF0aC5zcXJ0KDEtKGgtPTIpKmgpKzEpLzJ9fSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gaCpoKmh9O2YuYz1mdW5jdGlvbihoKXtyZXR1cm4tLWgqaCpoKzF9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP2gqaCpoOihoLT0yKSpoKmgrMikvMn19LGZ1bmN0aW9uKGQsZixoKXtoLmQoZiwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gdH0pO2guZChmLCJhIixmdW5jdGlvbigpe3JldHVybiBsfSk7CmguZChmLCJjIixmdW5jdGlvbigpe3JldHVybiBwfSk7dmFyIGs9MipNYXRoLlBJLHQ9ZnVuY3Rpb24gdShuLHEpe2Z1bmN0aW9uIHgoeSl7cmV0dXJuIG4qTWF0aC5wb3coMiwxMCotLXkpKk1hdGguc2luKChBLXkpL3EpfXZhciBBPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSoocS89ayk7eC5hbXBsaXR1ZGU9ZnVuY3Rpb24oeSl7cmV0dXJuIHUoeSxxKmspfTt4LnBlcmlvZD1mdW5jdGlvbih5KXtyZXR1cm4gdShuLHkpfTtyZXR1cm4geH0oMSwuMyksbD1mdW5jdGlvbiB4KHEsdSl7ZnVuY3Rpb24gQSh3KXtyZXR1cm4gMS1xKk1hdGgucG93KDIsLTEwKih3PSt3KSkqTWF0aC5zaW4oKHcreSkvdSl9dmFyIHk9TWF0aC5hc2luKDEvKHE9TWF0aC5tYXgoMSxxKSkpKih1Lz1rKTtBLmFtcGxpdHVkZT1mdW5jdGlvbih3KXtyZXR1cm4geCh3LHUqayl9O0EucGVyaW9kPWZ1bmN0aW9uKHcpe3JldHVybiB4KHEsdyl9O3JldHVybiBBfSgxLC4zKSxwPWZ1bmN0aW9uIEEodSx4KXtmdW5jdGlvbiB5KEMpe3JldHVybigwPgooQz0yKkMtMSk/dSpNYXRoLnBvdygyLDEwKkMpKk1hdGguc2luKCh3LUMpL3gpOjItdSpNYXRoLnBvdygyLC0xMCpDKSpNYXRoLnNpbigodytDKS94KSkvMn12YXIgdz1NYXRoLmFzaW4oMS8odT1NYXRoLm1heCgxLHUpKSkqKHgvPWspO3kuYW1wbGl0dWRlPWZ1bmN0aW9uKEMpe3JldHVybiBBKEMseCprKX07eS5wZXJpb2Q9ZnVuY3Rpb24oQyl7cmV0dXJuIEEodSxDKX07cmV0dXJuIHl9KDEsLjMpfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gTWF0aC5wb3coMiwxMCpoLTEwKX07Zi5jPWZ1bmN0aW9uKGgpe3JldHVybiAxLU1hdGgucG93KDIsLTEwKmgpfTtmLmE9ZnVuY3Rpb24oaCl7cmV0dXJuKDE+PShoKj0yKT9NYXRoLnBvdygyLDEwKmgtMTApOjItTWF0aC5wb3coMiwxMC0xMCpoKSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5hPWZ1bmN0aW9uKGgpe3JldHVybitofX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiBrfSk7aC5kKGYsCiJjIixmdW5jdGlvbigpe3JldHVybiB0fSk7aC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTt2YXIgaz1mdW5jdGlvbiBuKG0pe2Z1bmN0aW9uIHEodSl7cmV0dXJuIE1hdGgucG93KHUsbSl9bT0rbTtxLmV4cG9uZW50PW47cmV0dXJuIHF9KDMpLHQ9ZnVuY3Rpb24gcShuKXtmdW5jdGlvbiB1KHgpe3JldHVybiAxLU1hdGgucG93KDEteCxuKX1uPStuO3UuZXhwb25lbnQ9cTtyZXR1cm4gdX0oMyksbD1mdW5jdGlvbiB1KHEpe2Z1bmN0aW9uIHgoQSl7cmV0dXJuKDE+PShBKj0yKT9NYXRoLnBvdyhBLHEpOjItTWF0aC5wb3coMi1BLHEpKS8yfXE9K3E7eC5leHBvbmVudD11O3JldHVybiB4fSgzKX0sZnVuY3Rpb24oZCxmKXtmLmI9ZnVuY3Rpb24oaCl7cmV0dXJuIGgqaH07Zi5jPWZ1bmN0aW9uKGgpe3JldHVybiBoKigyLWgpfTtmLmE9ZnVuY3Rpb24oaCl7cmV0dXJuKDE+PShoKj0yKT9oKmg6LS1oKigyLWgpKzEpLzJ9fSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbih0KXtyZXR1cm4gMS0KTWF0aC5jb3ModCprKX07Zi5jPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNpbih0KmspfTtmLmE9ZnVuY3Rpb24odCl7cmV0dXJuKDEtTWF0aC5jb3MoaCp0KSkvMn07dmFyIGg9TWF0aC5QSSxrPWgvMn0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsobCl7cmV0dXJuITA9PT10KGwpJiYiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChsKX12YXIgdD1oKDEyOSk7ZC5leHBvcnRzPWZ1bmN0aW9uKGwpe2lmKCExPT09ayhsKSlyZXR1cm4hMTtsPWwuY29uc3RydWN0b3I7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBsKXJldHVybiExO2w9bC5wcm90b3R5cGU7cmV0dXJuITE9PT1rKGwpfHwhMT09PWwuaGFzT3duUHJvcGVydHkoImlzUHJvdG90eXBlT2YiKT8hMTohMH19LGZ1bmN0aW9uKGQpe2QuZXhwb3J0cz1mdW5jdGlvbihmKXtyZXR1cm4gbnVsbCE9ZiYmIm9iamVjdCI9PT10eXBlb2YgZiYmITE9PT1BcnJheS5pc0FycmF5KGYpfX0sZnVuY3Rpb24oZCwKZil7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoayx0LGwpe3ZvaWQgMD09PXQmJih0PTEwKTt2b2lkIDA9PT1sJiYobD17fSk7dmFyIHA9dGhpczt0aGlzLmN0eD1rO3RoaXMubGluZUhlaWdodD10O3RoaXMuc3R5bGU9bDt0aGlzLmNyZWF0ZVJ1bGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKG0pe3AuY3R4LmZvbnQ9cC5zdHlsZS5mb250O3JldHVybnt3aWR0aDpwLmN0eC5tZWFzdXJlVGV4dChtKS53aWR0aCxoZWlnaHQ6cC5saW5lSGVpZ2h0fX19O3RoaXMuY3JlYXRlUGVuPWZ1bmN0aW9uKG0sbixxKXtudWxsPT1xJiYocT1wLmN0eCk7cS5zYXZlKCk7cS50cmFuc2xhdGUobi50cmFuc2xhdGVbMF0sbi50cmFuc2xhdGVbMV0pO3Eucm90YXRlKG4ucm90YXRlKk1hdGguUEkvMTgwKTtyZXR1cm4gcC5jcmVhdGVDYW52YXNQZW4ocSl9O3ZvaWQgMD09PXRoaXMuc3R5bGUuZmlsbCYmKHRoaXMuc3R5bGUuZmlsbD0iIzQ0NCIpfWgucHJvdG90eXBlLmNyZWF0ZUNhbnZhc1Blbj1mdW5jdGlvbihrKXt2YXIgdD0KdGhpcztyZXR1cm57ZGVzdHJveTpmdW5jdGlvbigpe2sucmVzdG9yZSgpfSx3cml0ZTpmdW5jdGlvbihsLHAsbSxuKXtrLnRleHRBbGlnbj1wO251bGwhPXQuc3R5bGUuZm9udCYmKGsuZm9udD10LnN0eWxlLmZvbnQpO251bGwhPXQuc3R5bGUuZmlsbCYmKGsuZmlsbFN0eWxlPXQuc3R5bGUuZmlsbCxrLmZpbGxUZXh0KGwsbSxuKSk7bnVsbCE9dC5zdHlsZS5zdHJva2UmJihrLnN0cm9rZVN0eWxlPXQuc3R5bGUuZmlsbCxrLnN0cm9rZVRleHQobCxtLG4pKX19fTtyZXR1cm4gaH0oKTtmLkNhbnZhc0NvbnRleHQ9ZH0sZnVuY3Rpb24oZCxmKXt2YXIgaD1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt9ay5hcHBlbmQ9ZnVuY3Rpb24odCxsKXtmb3IodmFyIHA9W10sbT0yO208YXJndW1lbnRzLmxlbmd0aDttKyspcFttLTJdPWFyZ3VtZW50c1ttXTtwPWsuY3JlYXRlLmFwcGx5KGssW2xdLmNvbmNhdChwKSk7dC5hcHBlbmRDaGlsZChwKTtyZXR1cm4gcH07ay5jcmVhdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBsPQpbXSxwPTE7cDxhcmd1bWVudHMubGVuZ3RoO3ArKylsW3AtMV09YXJndW1lbnRzW3BdO3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGsuU1ZHX05TLHQpO2suYWRkQ2xhc3Nlcy5hcHBseShrLFtwXS5jb25jYXQobCkpO3JldHVybiBwfTtrLmFkZENsYXNzZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBsPVtdLHA9MTtwPGFyZ3VtZW50cy5sZW5ndGg7cCsrKWxbcC0xXT1hcmd1bWVudHNbcF07bD1sLmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4gbnVsbCE9bX0pO251bGwhPXQuY2xhc3NMaXN0P2wuZm9yRWFjaChmdW5jdGlvbihtKXt0LmNsYXNzTGlzdC5hZGQobSl9KTp0LnNldEF0dHJpYnV0ZSgiY2xhc3MiLGwuam9pbigiICIpKX07ay5nZXREaW1lbnNpb25zPWZ1bmN0aW9uKHQpe2lmKHQuZ2V0QkJveCl0cnl7dmFyIGw9dC5nZXRCQm94KCk7cmV0dXJue3dpZHRoOmwud2lkdGgsaGVpZ2h0OmwuaGVpZ2h0fX1jYXRjaChwKXt9cmV0dXJue2hlaWdodDowLHdpZHRoOjB9fTtyZXR1cm4ga30oKTsKaC5TVkdfTlM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjtmLlN2Z1V0aWxzPWg7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGsodCxsLHApe3ZvaWQgMD09PXAmJihwPSExKTt2YXIgbT10aGlzO3RoaXMuZWxlbWVudD10O3RoaXMuY2xhc3NOYW1lPWw7dGhpcy5hZGRUaXRsZUVsZW1lbnQ9cDt0aGlzLmNyZWF0ZVJ1bGVyPWZ1bmN0aW9uKCl7dmFyIG49bS5nZXRUZXh0RWxlbWVudHMobS5lbGVtZW50KSxxPW4ucGFyZW50RWxlbWVudCx1PW4uY29udGFpbmVyRWxlbWVudCx4PW4udGV4dEVsZW1lbnQ7cmV0dXJuIGZ1bmN0aW9uKEEpe3EuYXBwZW5kQ2hpbGQodSk7eC50ZXh0Q29udGVudD1BO0E9aC5nZXREaW1lbnNpb25zKHgpO3EucmVtb3ZlQ2hpbGQodSk7cmV0dXJuIEF9fTt0aGlzLmNyZWF0ZVBlbj1mdW5jdGlvbihuLHEsdSl7bnVsbD09dSYmKHU9bS5lbGVtZW50KTt1PWguYXBwZW5kKHUsImciLCJ0ZXh0LWNvbnRhaW5lciIsbS5jbGFzc05hbWUpO20uYWRkVGl0bGVFbGVtZW50JiYKKGguYXBwZW5kKHUsInRpdGxlIikudGV4dENvbnRlbnQ9bix1LnNldEF0dHJpYnV0ZSgidGl0bGUiLG4pKTtuPWguYXBwZW5kKHUsImciLCJ0ZXh0LWFyZWEiKTtuLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrcS50cmFuc2xhdGVbMF0rIiwiK3EudHJhbnNsYXRlWzFdKyIpcm90YXRlKCIrKHEucm90YXRlKyIpIikpO3JldHVybiBtLmNyZWF0ZVN2Z0xpbmVQZW4obil9fWsucHJvdG90eXBlLnNldEFkZFRpdGxlRWxlbWVudD1mdW5jdGlvbih0KXt0aGlzLmFkZFRpdGxlRWxlbWVudD10fTtrLnByb3RvdHlwZS5jcmVhdGVTdmdMaW5lUGVuPWZ1bmN0aW9uKHQpe3JldHVybnt3cml0ZTpmdW5jdGlvbihsLHAsbSxuKXt2YXIgcT1oLmFwcGVuZCh0LCJ0ZXh0IiwidGV4dC1saW5lIik7cS50ZXh0Q29udGVudD1sO3Euc2V0QXR0cmlidXRlKCJ0ZXh0LWFuY2hvciIscCk7cS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK20rIiwiK24rIikiKTtxLnNldEF0dHJpYnV0ZSgieSIsCiItMC4yNWVtIil9fX07ay5wcm90b3R5cGUuZ2V0VGV4dEVsZW1lbnRzPWZ1bmN0aW9uKHQpe2lmKCJ0ZXh0Ij09PXQudGFnTmFtZSl7dmFyIGw9dC5wYXJlbnRFbGVtZW50O251bGw9PWwmJihsPXQucGFyZW50Tm9kZSk7bC5yZW1vdmVDaGlsZCh0KTtyZXR1cm57Y29udGFpbmVyRWxlbWVudDp0LHBhcmVudEVsZW1lbnQ6bCx0ZXh0RWxlbWVudDp0fX12YXIgcD10LnF1ZXJ5U2VsZWN0b3IoInRleHQiKTtpZihudWxsIT1wKXJldHVybiBsPXQucGFyZW50RWxlbWVudCxudWxsPT1sJiYobD10LnBhcmVudE5vZGUpLGwucmVtb3ZlQ2hpbGQodCkse2NvbnRhaW5lckVsZW1lbnQ6dCxwYXJlbnRFbGVtZW50OmwsdGV4dEVsZW1lbnQ6cH07bD1oLmNyZWF0ZSgidGV4dCIsdGhpcy5jbGFzc05hbWUpO3JldHVybntjb250YWluZXJFbGVtZW50OmwscGFyZW50RWxlbWVudDp0LHRleHRFbGVtZW50Omx9fTtyZXR1cm4ga30oKTtmLlN2Z0NvbnRleHQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPQp0aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDIxKSxsPWgoMzYpO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2YXIgcT1wLmNhbGwodGhpcyxuKXx8dGhpcztxLmRpbUNhY2hlPW5ldyB0LkNhY2hlKGZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlTm90RnJvbUNhY2hlKHUpfSk7cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLl9tZWFzdXJlTm90RnJvbUNhY2hlPWZ1bmN0aW9uKG4pe3JldHVybiBwLnByb3RvdHlwZS5tZWFzdXJlLmNhbGwodGhpcyxuKX07bS5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihuKXt2b2lkIDA9PT1uJiYobj1sLkFic3RyYWN0TWVhc3VyZXIuSEVJR0hUX1RFWFQpOwpyZXR1cm4gdGhpcy5kaW1DYWNoZS5nZXQobil9O20ucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5kaW1DYWNoZS5jbGVhcigpO3AucHJvdG90eXBlLnJlc2V0LmNhbGwodGhpcyl9O3JldHVybiBtfShoKDYwKS5DYWNoZUNoYXJhY3Rlck1lYXN1cmVyKTtmLkNhY2hlTWVhc3VyZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoNTkpLHQ9aCg2MiksbD1oKDY0KSxwPWgoNjYpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBtKG4pe3RoaXMuY29udGV4dD1uO3RoaXMubWVhc3VyZXI9bmV3IHQuQ2FjaGVNZWFzdXJlcih0aGlzLmNvbnRleHQpO3RoaXMud3JhcHBlcj1uZXcgbC5XcmFwcGVyO3RoaXMud3JpdGVyPW5ldyBwLldyaXRlcih0aGlzLm1lYXN1cmVyLHRoaXMuY29udGV4dCx0aGlzLndyYXBwZXIpfW0uc3ZnPWZ1bmN0aW9uKG4scSx1KXtyZXR1cm4gbmV3IG0obmV3IGsuU3ZnQ29udGV4dChuLHEsdSkpfTttLmNhbnZhcz1mdW5jdGlvbihuLHEsdSl7cmV0dXJuIG5ldyBtKG5ldyBrLkNhbnZhc0NvbnRleHQobiwKcSx1KSl9O20ucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKG4scSx1LHgsQSl7dGhpcy53cml0ZXIud3JpdGUobixxLHUseCxBKX07bS5wcm90b3R5cGUuY2xlYXJNZWFzdXJlckNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gbX0oKTtmLlR5cGVzZXR0ZXI9ZH0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrKXt0aGlzLmNhY2hlPXt9O3RoaXMuY29tcHV0ZT1rfWgucHJvdG90eXBlLmdldD1mdW5jdGlvbihrKXt0aGlzLmNhY2hlLmhhc093blByb3BlcnR5KGspfHwodGhpcy5jYWNoZVtrXT10aGlzLmNvbXB1dGUoaykpO3JldHVybiB0aGlzLmNhY2hlW2tdfTtoLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuY2FjaGU9e307cmV0dXJuIHRoaXN9O3JldHVybiBofSgpO2YuQ2FjaGU9ZH0sZnVuY3Rpb24oZCxmKXtmLk1ldGhvZHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKCl7fWguYXJyYXlFcT1mdW5jdGlvbihrLHQpe2lmKG51bGw9PQprfHxudWxsPT10KXJldHVybiBrPT09dDtpZihrLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgbD0wO2w8ay5sZW5ndGg7bCsrKWlmKGtbbF0hPT10W2xdKXJldHVybiExO3JldHVybiEwfTtoLm9iakVxPWZ1bmN0aW9uKGssdCl7aWYobnVsbD09a3x8bnVsbD09dClyZXR1cm4gaz09PXQ7dmFyIGw9T2JqZWN0LmtleXMoaykuc29ydCgpLHA9T2JqZWN0LmtleXModCkuc29ydCgpLG09bC5tYXAoZnVuY3Rpb24ocSl7cmV0dXJuIGtbcV19KSxuPXAubWFwKGZ1bmN0aW9uKHEpe3JldHVybiB0W3FdfSk7cmV0dXJuIGguYXJyYXlFcShsLHApJiZoLmFycmF5RXEobSxuKX07aC5zdHJpY3RFcT1mdW5jdGlvbihrLHQpe3JldHVybiBrPT09dH07aC5kZWZhdWx0cz1mdW5jdGlvbihrKXtmb3IodmFyIHQ9W10sbD0xO2w8YXJndW1lbnRzLmxlbmd0aDtsKyspdFtsLTFdPWFyZ3VtZW50c1tsXTtpZihudWxsPT1rKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCIpOwp2YXIgcD1PYmplY3Qoayk7dC5mb3JFYWNoKGZ1bmN0aW9uKG0pe2lmKG51bGwhPW0pZm9yKHZhciBuIGluIG0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG0sbikmJihwW25dPW1bbl0pfSk7cmV0dXJuIHB9O3JldHVybiBofSgpfSxmdW5jdGlvbihkLGYpe2YuU3RyaW5nTWV0aG9kcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5jb21iaW5lV2hpdGVzcGFjZT1mdW5jdGlvbihrKXtyZXR1cm4gay5yZXBsYWNlKC9bIFx0XSsvZywiICIpfTtoLmlzTm90RW1wdHlTdHJpbmc9ZnVuY3Rpb24oayl7cmV0dXJuIGsmJiIiIT09ay50cmltKCl9O2gudHJpbVN0YXJ0PWZ1bmN0aW9uKGssdCl7aWYoIWspcmV0dXJuIGs7az1rLnNwbGl0KCIiKTt2YXIgbD10P2Z1bmN0aW9uKHApe3JldHVybiBwLnNwbGl0KHQpLnNvbWUoaC5pc05vdEVtcHR5U3RyaW5nKX06aC5pc05vdEVtcHR5U3RyaW5nO3JldHVybiBrLnJlZHVjZShmdW5jdGlvbihwLG0pe3JldHVybiBsKHArbSk/CnArbTpwfSwiIil9O2gudHJpbUVuZD1mdW5jdGlvbihrLHQpe2lmKCFrKXJldHVybiBrO2s9ay5zcGxpdCgiIik7ay5yZXZlcnNlKCk7az1oLnRyaW1TdGFydChrLmpvaW4oIiIpLHQpLnNwbGl0KCIiKTtrLnJldmVyc2UoKTtyZXR1cm4gay5qb2luKCIiKX07cmV0dXJuIGh9KCl9LGZ1bmN0aW9uKGQsZil7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt0aGlzLldvcmREaXZpZGVyUmVnRXhwPS9cVy87dGhpcy5XaGl0ZXNwYWNlUmVnRXhwPS9ccy99aC5wcm90b3R5cGUudG9rZW5pemU9ZnVuY3Rpb24oayl7dmFyIHQ9dGhpcztyZXR1cm4gay5zcGxpdCgiIikucmVkdWNlKGZ1bmN0aW9uKGwscCl7cmV0dXJuIGwuc2xpY2UoMCwtMSkuY29uY2F0KHQuc2hvdWxkQ3JlYXRlTmV3VG9rZW4obFtsLmxlbmd0aC0xXSxwKSl9LFsiIl0pfTtoLnByb3RvdHlwZS5zaG91bGRDcmVhdGVOZXdUb2tlbj1mdW5jdGlvbihrLHQpe2lmKCFrKXJldHVyblt0XTt2YXIgbD1rW2subGVuZ3RoLTFdO3JldHVybiB0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChsKSYmCnRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KHQpP1trK3RdOnRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGwpfHx0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdCh0KT9bayx0XTp0aGlzLldvcmREaXZpZGVyUmVnRXhwLnRlc3QobCl8fHRoaXMuV29yZERpdmlkZXJSZWdFeHAudGVzdCh0KT9sPT09dD9bayt0XTpbayx0XTpbayt0XX07cmV0dXJuIGh9KCk7Zi5Ub2tlbml6ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHRbbV09bFttXSk7dC5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9ayhsLHQpO2wucHJvdG90eXBlLndyYXA9CmZ1bmN0aW9uKHAsbSxuLHEpe2Z1bmN0aW9uIHUoRCl7cmV0dXJuIHQucHJvdG90eXBlLndyYXAuY2FsbCh4LHAsbSxELHEpfXZhciB4PXRoaXM7dm9pZCAwPT09cSYmKHE9SW5maW5pdHkpO2lmKDE8cC5zcGxpdCgiXG4iKS5sZW5ndGgpdGhyb3cgRXJyb3IoIlNpbmdsZUxpbmVXcmFwcGVyIGlzIGRlc2lnbmVkIHRvIHdvcmsgb25seSBvbiBzaW5nbGUgbGluZSIpO3ZhciBBPXUobik7aWYoMj5BLm5vTGluZXMpcmV0dXJuIEE7Zm9yKHZhciB5PTAsdz0wO3c8bC5OT19XUkFQX0lURVJBVElPTlMmJm4+eTsrK3cpe3ZhciBDPShuK3kpLzIsRj11KEMpO3RoaXMuYXJlU2FtZVJlc3VsdHMoQSxGKT8obj1DLEE9Rik6eT1DfXJldHVybiBBfTtsLnByb3RvdHlwZS5hcmVTYW1lUmVzdWx0cz1mdW5jdGlvbihwLG0pe3JldHVybiBwLm5vTGluZXM9PT1tLm5vTGluZXMmJnAudHJ1bmNhdGVkVGV4dD09PW0udHJ1bmNhdGVkVGV4dH07cmV0dXJuIGx9KGgoNjUpLldyYXBwZXIpO2QuTk9fV1JBUF9JVEVSQVRJT05TPQo1O2YuU2luZ2xlTGluZVdyYXBwZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMjEpLHQ9e3RleHRSb3RhdGlvbjowLHRleHRTaGVhcjowLHhBbGlnbjoibGVmdCIseUFsaWduOiJ0b3AifTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbChwLG0sbil7dGhpcy5fbWVhc3VyZXI9cDt0aGlzLl9wZW5GYWN0b3J5PW07dGhpcy5fd3JhcHBlcj1ufWwucHJvdG90eXBlLm1lYXN1cmVyPWZ1bmN0aW9uKHApe3RoaXMuX21lYXN1cmVyPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLndyYXBwZXI9ZnVuY3Rpb24ocCl7dGhpcy5fd3JhcHBlcj1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5wZW5GYWN0b3J5PWZ1bmN0aW9uKHApe3RoaXMuX3BlbkZhY3Rvcnk9cDtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24ocCxtLG4scSx1KXt2b2lkIDA9PT1xJiYocT17fSk7cT1rLk1ldGhvZHMuZGVmYXVsdHMoe30sdCxxKTtpZigtMT09PWwuU3VwcG9ydGVkUm90YXRpb24uaW5kZXhPZihxLnRleHRSb3RhdGlvbikpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHJvdGF0aW9uIC0gIisKcS50ZXh0Um90YXRpb24rIi4gU3VwcG9ydGVkIHJvdGF0aW9ucyBhcmUgIitsLlN1cHBvcnRlZFJvdGF0aW9uLmpvaW4oIiwgIikpO2lmKG51bGwhPXEudGV4dFNoZWFyJiYtODA+cS50ZXh0U2hlYXJ8fDgwPHEudGV4dFNoZWFyKXRocm93IEVycm9yKCJ1bnN1cHBvcnRlZCBzaGVhciBhbmdsZSAtICIrcS50ZXh0U2hlYXIrIi4gTXVzdCBiZSBiZXR3ZWVuIC04MCBhbmQgODAiKTt2YXIgeD00NTxNYXRoLmFicyhNYXRoLmFicyhxLnRleHRSb3RhdGlvbiktOTApLEE9eD9tOm4seT14P246bSx3PXEudGV4dFNoZWFyLEM9dypNYXRoLlBJLzE4MDt4PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQ7dmFyIEY9eCpNYXRoLnRhbihDKTtBPUEvTWF0aC5jb3MoQyktTWF0aC5hYnMoRik7dmFyIEQ9eSpNYXRoLmNvcyhDKTt5PWsuU3RyaW5nTWV0aG9kcy5jb21iaW5lV2hpdGVzcGFjZShwKTt5PSh0aGlzLl93cmFwcGVyP3RoaXMuX3dyYXBwZXIud3JhcCh5LHRoaXMuX21lYXN1cmVyLApBLEQpLndyYXBwZWRUZXh0OnkpLnNwbGl0KCJcbiIpO0M9bC5YT2Zmc2V0RmFjdG9yW3EueEFsaWduXSpBKk1hdGguc2luKEMpLWwuWU9mZnNldEZhY3RvcltxLnlBbGlnbl0qKEQteS5sZW5ndGgqeCk7dz1xLnRleHRSb3RhdGlvbit3O3N3aXRjaChxLnRleHRSb3RhdGlvbil7Y2FzZSA5MDptPVttK0MsMF07YnJlYWs7Y2FzZSAtOTA6bT1bLUMsbl07YnJlYWs7Y2FzZSAxODA6bT1bbSxuK0NdO2JyZWFrO2RlZmF1bHQ6bT1bMCwtQ119cD10aGlzLl9wZW5GYWN0b3J5LmNyZWF0ZVBlbihwLHt0cmFuc2xhdGU6bSxyb3RhdGU6d30sdSk7dGhpcy53cml0ZUxpbmVzKHkscCxBLHgsRixxLnhBbGlnbik7bnVsbCE9cC5kZXN0cm95JiZwLmRlc3Ryb3koKX07bC5wcm90b3R5cGUud3JpdGVMaW5lcz1mdW5jdGlvbihwLG0sbixxLHUseCl7cC5mb3JFYWNoKGZ1bmN0aW9uKEEseSl7bS53cml0ZShBLGwuQW5jaG9yQ29udmVydGVyW3hdLCgwPHU/KHkrMSkqdTp5KnUpK24qbC5YT2Zmc2V0RmFjdG9yW3hdLAooeSsxKSpxKX0pfTtyZXR1cm4gbH0oKTtkLlN1cHBvcnRlZFJvdGF0aW9uPVstOTAsMCwxODAsOTBdO2QuQW5jaG9yQ29udmVydGVyPXtjZW50ZXI6Im1pZGRsZSIsbGVmdDoic3RhcnQiLHJpZ2h0OiJlbmQifTtkLlhPZmZzZXRGYWN0b3I9e2NlbnRlcjouNSxsZWZ0OjAscmlnaHQ6MX07ZC5ZT2Zmc2V0RmFjdG9yPXtib3R0b206MSxjZW50ZXI6LjUsdG9wOjB9O2YuV3JpdGVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWgoNjkpO2Q9aCg3KTtmLkFuaW1hdG9ycz1kO2Q9aCg2Nyk7Zi5BeGVzPWQ7ZD1oKDM3KTtmLkNvbXBvbmVudHM9ZDtkPWgoMjMpO2YuQ29uZmlncz1kO2Q9aCg4KTtmLkZvcm1hdHRlcnM9ZDtkPWgoMzApO2YuUmVuZGVyQ29udHJvbGxlcj1kO2Q9aCgzOSk7Zi5SZW5kZXJQb2xpY2llcz1kO2Q9aCgzMSk7Zi5TeW1ib2xGYWN0b3JpZXM9ZDtkPWgoMTMpO2YuRGlzcGF0Y2hlcnM9CmQ7ZD1oKDE0KTtmLkRyYXdlcnM9ZDtkPWgoMjUpO2YuSW50ZXJhY3Rpb25zPWQ7ZD1oKDE5KTtmLlBsb3RzPWQ7ZD1oKDMpO2YuU2NhbGVzPWQ7ZD1oKDApO2YuVXRpbHM9ZDtrKGgoMjIpKTtkPWgoMjgpO2YuVGltZUludGVydmFsPWQuVGltZUludGVydmFsO2soaCg0KSk7ayhoKDI5KSk7ayhoKDM4KSk7ZD1oKDY4KTtmLnZlcnNpb249ZC52ZXJzaW9uO2soaCgyNCkpO2soaCg2KSk7ayhoKDE1KSk7ayhoKDQwKSk7ayhoKDE2KSk7ayhoKDIpKTtrKGgoMTEpKTtrKGgoMTcpKX1dKX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWNoYXJ0LWhlbHBlcnMvcGxvdHRhYmxlLWludGVyYWN0aW9ucy5qcwp2YXIgcmc7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKG0pe2NvbnN0IG49W107Zm9yKDttJiZtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7KWlmKG4ucHVzaChtKSxtLmFzc2lnbmVkU2xvdCltPW0uYXNzaWduZWRTbG90O2Vsc2UgaWYobS5wYXJlbnRFbGVtZW50KW09bS5wYXJlbnRFbGVtZW50O2Vsc2V7Y29uc3QgcT1tLnBhcmVudE5vZGU7bT1xIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudD9xLmhvc3Q6cSE9PW0/cTpudWxsfXJldHVybiBufWZ1bmN0aW9uIGYobSl7dmFyIG49ZChtKTttPWg7bGV0IHE9bnVsbDtmb3IoY29uc3QgeCBvZiBuKXtuPVBsb3R0YWJsZS5VdGlscy5ET00uZ2V0RWxlbWVudFRyYW5zZm9ybSh4KTtpZihudWxsIT1uKXt2YXIgdT14LmNsaWVudFdpZHRoLzI7Y29uc3QgQT14LmNsaWVudEhlaWdodC8yO209UGxvdHRhYmxlLlV0aWxzLk1hdGgubXVsdGlwbHlUcmFuc2xhdGUobSxbdSxBXSk7bT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseU1hdHJpeChtLFBsb3R0YWJsZS5VdGlscy5NYXRoLmludmVydE1hdHJpeChuKSk7Cm09UGxvdHRhYmxlLlV0aWxzLk1hdGgubXVsdGlwbHlUcmFuc2xhdGUobSxbLXUsLUFdKX1uPXguc2Nyb2xsTGVmdDt1PXguc2Nyb2xsVG9wO2lmKG51bGw9PT1xfHx4PT09cSluLT14Lm9mZnNldExlZnQreC5jbGllbnRMZWZ0LHUtPXgub2Zmc2V0VG9wK3guY2xpZW50VG9wLHE9eC5vZmZzZXRQYXJlbnQ7bT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFtuLHVdKX1yZXR1cm4gbX1jb25zdCBoPVsxLDAsMCwxLDAsMF07Y2xhc3MgayBleHRlbmRzIFBsb3R0YWJsZS5VdGlscy5UcmFuc2xhdG9ye2NvbXB1dGVQb3NpdGlvbihtLG4pe209e3g6bSx5Om59O249Zih0aGlzLl9yb290RWxlbWVudCk7cmV0dXJuIG51bGw9PW4/bTpQbG90dGFibGUuVXRpbHMuTWF0aC5hcHBseVRyYW5zZm9ybShuLG0pfX1jbGFzcyB0IGV4dGVuZHMgUGxvdHRhYmxlLkRpc3BhdGNoZXJzLk1vdXNle2NvbnN0cnVjdG9yKG0pe3N1cGVyKG0pO3RoaXMuX2V2ZW50VGFyZ2V0PW0ucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpOwp0aGlzLl90cmFuc2xhdG9yPW5ldyBrKG0ucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKX1zdGF0aWMgZ2V0RGlzcGF0Y2hlcihtKXtjb25zdCBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCk7bGV0IHE9blt0Ll9ESVNQQVRDSEVSX0tFWV07cXx8KHE9bmV3IHQobSksblt0Ll9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9fWNsYXNzIGwgZXh0ZW5kcyBQbG90dGFibGUuRGlzcGF0Y2hlcnMuVG91Y2h7Y29uc3RydWN0b3IobSl7c3VwZXIobSk7dGhpcy5fZXZlbnRUYXJnZXQ9bS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7dGhpcy5fdHJhbnNsYXRvcj1uZXcgayhtLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSl9c3RhdGljIGdldERpc3BhdGNoZXIobSl7Y29uc3Qgbj1tLnJvb3QoKS5yb290RWxlbWVudCgpO2xldCBxPW5bbC5fRElTUEFUQ0hFUl9LRVldO3F8fChxPW5ldyBsKG0pLG5bbC5fRElTUEFUQ0hFUl9LRVldPXEpO3JldHVybiBxfX1QbG90dGFibGUuSW50ZXJhY3Rpb24ucHJvdG90eXBlLl9pc0luc2lkZUNvbXBvbmVudD0KZnVuY3Rpb24obSl7cmV0dXJuIDA8PW0ueCYmMDw9bS55JiZtLng8dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby53aWR0aCgpJiZtLnk8dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5oZWlnaHQoKX07Y2xhc3MgcCBleHRlbmRzIFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuUG9pbnRlcntfYW5jaG9yKCl7dGhpcy5faXNBbmNob3JlZD0hMDt0aGlzLl9tb3VzZURpc3BhdGNoZXI9dC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPWwuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayl9fWIuUG9pbnRlckludGVyYWN0aW9uPXB9KShyZ3x8KHJnPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy92ei1jaGFydC1oZWxwZXJzLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKCl7bGV0IHQ9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3QudGlja0dlbmVyYXRvcigpO2xldCBsPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKHQsImJvdHRvbSIpO2wuZm9ybWF0dGVyKGIuc3RlcEZvcm1hdHRlcik7cmV0dXJue3NjYWxlOnQsYXhpczpsLGFjY2Vzc29yOnA9PnAuc3RlcH19ZnVuY3Rpb24gZigpe2xldCB0PW5ldyBQbG90dGFibGUuU2NhbGVzLlRpbWU7cmV0dXJue3NjYWxlOnQsYXhpczpuZXcgUGxvdHRhYmxlLkF4ZXMuVGltZSh0LCJib3R0b20iKSxhY2Nlc3NvcjpsPT5sLndhbGxfdGltZX19ZnVuY3Rpb24gaCgpe2xldCB0PW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjtyZXR1cm57c2NhbGU6dCxheGlzOm5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKHQsImJvdHRvbSIpLGFjY2Vzc29yOmIucmVsYXRpdmVBY2Nlc3Nvcn19Yi5TWU1CT0xTX0xJU1Q9W3tjaGFyYWN0ZXI6Ilx1MjVmYyIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuc3F1YXJlfSwKe2NoYXJhY3RlcjoiXHUyNWM2IixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5kaWFtb25kfSx7Y2hhcmFjdGVyOiJcdTI1YjIiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLnRyaWFuZ2xlfSx7Y2hhcmFjdGVyOiJcdTI2MDUiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLnN0YXJ9LHtjaGFyYWN0ZXI6Ilx1MjcxYSIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuY3Jvc3N9XTtsZXQgazsoZnVuY3Rpb24odCl7dC5TVEVQPSJzdGVwIjt0LlJFTEFUSVZFPSJyZWxhdGl2ZSI7dC5XQUxMX1RJTUU9IndhbGxfdGltZSJ9KShrPWIuWFR5cGV8fChiLlhUeXBlPXt9KSk7Yi5ZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTj00O2IuU1RFUF9GT1JNQVRURVJfUFJFQ0lTSU9OPTQ7Yi5ZX0FYSVNfRk9STUFUVEVSX1BSRUNJU0lPTj0zO2IuVE9PTFRJUF9ZX1BJWEVMX09GRlNFVD0yMDtiLlRPT0xUSVBfQ0lSQ0xFX1NJWkU9NDtiLk5BTl9TWU1CT0xfU0laRT0KNjtiLm11bHRpc2NhbGVGb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGw9PntsZXQgcD1NYXRoLmFicyhsKTsxRS0xNT5wJiYocD0wKTtyZXR1cm4oMUU0PD1wP2QzLmZvcm1hdCgiLiIrdCsifmUiKTowPHAmJi4wMT5wP2QzLmZvcm1hdCgiLiIrdCsifmUiKTpkMy5mb3JtYXQoIi4iK3QrIn5nIikpKGwpfX07Yi5jb21wdXRlRG9tYWluPWZ1bmN0aW9uKHQsbCl7dD10LmZpbHRlcihuPT5pc0Zpbml0ZShuKSk7aWYoMD09PXQubGVuZ3RoKXJldHVyblstLjEsMS4xXTtsPyh0PV8uc29ydEJ5KHQpLGw9ZDMucXVhbnRpbGUodCwuMDUpLHQ9ZDMucXVhbnRpbGUodCwuOTUpKToobD1kMy5taW4odCksdD1kMy5tYXgodCkpO2xldCBwLG09dC1sO3A9MD09PW0/MS4xKk1hdGguYWJzKGwpKzEuMTouMiptO2w9WzA8PWwmJmw8bT8tLjEqdDpsLXAsdCtwXTtyZXR1cm4gbD1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihsKS5uaWNlKCkuZG9tYWluKCl9O2IuYWNjZXNzb3JpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGw9PgpsW3RdfTtiLnN0ZXBGb3JtYXR0ZXI9ZDMuZm9ybWF0KGAuJHtiLlNURVBfRk9STUFUVEVSX1BSRUNJU0lPTn1+c2ApO2Iuc3RlcFg9ZDtiLnRpbWVGb3JtYXR0ZXI9UGxvdHRhYmxlLkZvcm1hdHRlcnMudGltZSgiJWEgJWIgJWUsICVIOiVNOiVTIik7Yi53YWxsWD1mO2IucmVsYXRpdmVBY2Nlc3Nvcj0odCxsLHApPT57aWYobnVsbCE9dC5yZWxhdGl2ZSlyZXR1cm4gdC5yZWxhdGl2ZTtsPXAuZGF0YSgpO3JldHVybigrdC53YWxsX3RpbWUtKDA8bC5sZW5ndGg/K2xbMF0ud2FsbF90aW1lOjApKS8zNkU1fTtiLnJlbGF0aXZlRm9ybWF0dGVyPXQ9PntsZXQgbD0iIixwPU1hdGguZmxvb3IodC8yNCk7dC09MjQqcDtwJiYobCs9cCsiZCAiKTtsZXQgbT1NYXRoLmZsb29yKHQpO3Q9NjAqKHQtbSk7aWYobXx8cClsKz1tKyJoICI7bGV0IG49TWF0aC5mbG9vcih0KTt0PTYwKih0LW4pO2lmKG58fG18fHApbCs9bisibSAiO3JldHVybiBsK01hdGguZmxvb3IodCkrInMifTtiLnJlbGF0aXZlWD0KaDtiLmdldFhDb21wb25lbnRzPWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlIGsuU1RFUDpyZXR1cm4gZCgpO2Nhc2Ugay5XQUxMX1RJTUU6cmV0dXJuIGYoKTtjYXNlIGsuUkVMQVRJVkU6cmV0dXJuIGgoKTtkZWZhdWx0OnRocm93IEVycm9yKCJpbnZhbGlkIHhUeXBlOiAiK3QpO319fSkocmd8fChyZz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWNoYXJ0LWhlbHBlcnMvdnotY2hhcnQtdG9vbHRpcC5qcwp2YXIgRWg7CihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oaCl7aC5BVVRPPSJhdXRvIjtoLkJPVFRPTT0iYm90dG9tIjtoLlJJR0hUPSJyaWdodCJ9KShkPWIuVG9vbHRpcFBvc2l0aW9ufHwoYi5Ub29sdGlwUG9zaXRpb249e30pKTtjb25zdCBmPXtib3hTaGFkb3c6IjAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIC4zKSIsb3BhY2l0eTowLHBvc2l0aW9uOiJmaXhlZCIsd2lsbENoYW5nZToidHJhbnNmb3JtIix6SW5kZXg6NX07UG9seW1lcih7aXM6InZ6LWNoYXJ0LXRvb2x0aXAiLF90ZW1wbGF0ZTpudWxsLHByb3BlcnRpZXM6e2NvbnRlbnRDb21wb25lbnROYW1lOlN0cmluZyxwb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6ZC5BVVRPfSxtaW5EaXN0RnJvbUVkZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjE1fX0scmVhZHkoKXt0aGlzLl90dW5uZWw9dGhpcy5fcmFmPXRoaXMuX3N0eWxlQ2FjaGU9bnVsbH0sYXR0YWNoZWQoKXt0aGlzLl90dW5uZWw9dGhpcy5fY3JlYXRlVHVubmVsKCk7dGhpcy5faGlkZU9uQmx1cj0KKCk9Pntkb2N1bWVudC5oaWRkZW4mJnRoaXMuaGlkZSgpfTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdGhpcy5faGlkZU9uQmx1cil9LGRldGFjaGVkKCl7dGhpcy5oaWRlKCk7dGhpcy5fcmVtb3ZlVHVubmVsKHRoaXMuX3R1bm5lbCk7dGhpcy5fdHVubmVsPW51bGw7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRoaXMuX2hpZGVPbkJsdXIpfSxjb250ZW50KCl7cmV0dXJuIHRoaXMuX3R1bm5lbC5zaGFkb3dSb290fSxoaWRlKCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JhZik7dGhpcy5fc3R5bGVDYWNoZT1udWxsO3RoaXMuX3R1bm5lbC5zdHlsZS5vcGFjaXR5PTB9LHVwZGF0ZUFuZFBvc2l0aW9uKGgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWYpO3RoaXMuX3JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9yZXBvc2l0aW9uSW1wbChoKX0pfSwKX3JlcG9zaXRpb25JbXBsKGgpe2NvbnN0IGs9dGhpcy5fdHVubmVsO2g9aC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCB0PWsuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbD13aW5kb3cuaW5uZXJIZWlnaHQscD1kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLG09aC50b3Asbj1tK2guaGVpZ2h0LHE9dC5oZWlnaHQrcmcuVE9PTFRJUF9ZX1BJWEVMX09GRlNFVDtsZXQgdT1udWxsLHg9TWF0aC5tYXgodGhpcy5taW5EaXN0RnJvbUVkZ2UsaC5sZWZ0KSxBPW51bGwseT1tO3RoaXMucG9zaXRpb249PWQuUklHSFQ/eD1oLnJpZ2h0Oih5PW4rcmcuVE9PTFRJUF9ZX1BJWEVMX09GRlNFVCxwPHgrdC53aWR0aCt0aGlzLm1pbkRpc3RGcm9tRWRnZSYmKHg9bnVsbCxBPXRoaXMubWluRGlzdEZyb21FZGdlKSk7dGhpcy5wb3NpdGlvbj09ZC5BVVRPJiYwPGgudG9wLXEmJmw8aC50b3AraC5oZWlnaHQrcSYmKHk9bnVsbCx1PWwtbStyZy5UT09MVElQX1lfUElYRUxfT0ZGU0VUKTtoPXtvcGFjaXR5OjEsCmxlZnQ6eD9gJHt4fXB4YDpudWxsLHJpZ2h0OkE/YCR7QX1weGA6bnVsbCx0b3A6eT9gJHt5fXB4YDpudWxsLGJvdHRvbTp1P2Ake3V9cHhgOm51bGx9O18uaXNFcXVhbCh0aGlzLl9zdHlsZUNhY2hlLGgpfHwoT2JqZWN0LmFzc2lnbihrLnN0eWxlLGgpLHRoaXMuX3N0eWxlQ2FjaGU9aCl9LF9jcmVhdGVUdW5uZWwoKXtpZighdGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiUmVxdWlyZSBgY29udGVudENvbXBvbmVudE5hbWVgIHRvIGJlIGEgbmFtZSBvZiBhIFBvbHltZXIgY29tcG9uZW50Iik7Y29uc3QgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMuY29udGVudENvbXBvbmVudE5hbWUpO09iamVjdC5hc3NpZ24oaC5zdHlsZSxmKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3JldHVybiBofSxfcmVtb3ZlVHVubmVsKGgpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaCl9fSl9KShFaHx8KEVoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydC9kcmFnWm9vbUludGVyYWN0aW9uLmpzCnZhciBGaDsKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBQbG90dGFibGUuQ29tcG9uZW50cy5TZWxlY3Rpb25Cb3hMYXllcntjb25zdHJ1Y3RvcihmLGgsayl7c3VwZXIoKTt0aGlzLmVhc2VGbj1kMy5lYXNlQ3ViaWNJbk91dDt0aGlzLl9hbmltYXRpb25UaW1lPTc1MDt0aGlzLnhTY2FsZShmKTt0aGlzLnlTY2FsZShoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb249bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuRHJhZzt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uPW5ldyBQbG90dGFibGUuSW50ZXJhY3Rpb25zLkNsaWNrO3RoaXMuc2V0dXBDYWxsYmFja3MoKTt0aGlzLnVuem9vbU1ldGhvZD1rO3RoaXMub25EZXRhY2goKCk9Pnt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmRldGFjaEZyb20oKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSgpfSk7dGhpcy5vbkFuY2hvcigoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpfSl9aW50ZXJhY3Rpb25TdGFydChmKXt0aGlzLm9uU3RhcnQ9CmZ9aW50ZXJhY3Rpb25FbmQoZil7dGhpcy5vbkVuZD1mfWRyYWdJbnRlcmFjdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259c2V0dXBDYWxsYmFja3MoKXtsZXQgZj0hMTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoaD0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmgsYm90dG9tUmlnaHQ6aH0pO3RoaXMub25TdGFydCgpfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZygoaCxrKT0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmgsYm90dG9tUmlnaHQ6a30pO3RoaXMuYm94VmlzaWJsZSghMCk7Zj0hMH0pO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdFbmQoKGgsayk9Pnt0aGlzLmJveFZpc2libGUoITEpO3RoaXMuYm91bmRzKHt0b3BMZWZ0OmgsYm90dG9tUmlnaHQ6a30pO2lmKGYpdGhpcy56b29tKCk7ZWxzZSB0aGlzLm9uRW5kKCk7Zj0hMX0pO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24ub25Eb3VibGVDbGljayh0aGlzLnVuem9vbS5iaW5kKHRoaXMpKX1hbmltYXRpb25UaW1lKGYpe2lmKG51bGw9PQpmKXJldHVybiB0aGlzLl9hbmltYXRpb25UaW1lO2lmKDA+Zil0aHJvdyBFcnJvcigiYW5pbWF0aW9uVGltZSBjYW5ub3QgYmUgbmVnYXRpdmUiKTt0aGlzLl9hbmltYXRpb25UaW1lPWY7cmV0dXJuIHRoaXN9ZWFzZShmKXtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGYpdGhyb3cgRXJyb3IoImVhc2UgZnVuY3Rpb24gbXVzdCBiZSBhIGZ1bmN0aW9uIik7MD09PWYoMCkmJjE9PT1mKDEpfHxQbG90dGFibGUuVXRpbHMuV2luZG93Lndhcm4oIkVhc2luZyBmdW5jdGlvbiBkb2VzIG5vdCBtYWludGFpbiBpbnZhcmlhbnQgZigwKVx4M2RceDNkMCBceDI2XHgyNiBmKDEpXHgzZFx4M2QxLiBCYWQgYmVoYXZpb3IgbWF5IHJlc3VsdC4iKTt0aGlzLmVhc2VGbj1mO3JldHVybiB0aGlzfXpvb20oKXtsZXQgZj10aGlzLnhFeHRlbnQoKVswXS52YWx1ZU9mKCksaD10aGlzLnhFeHRlbnQoKVsxXS52YWx1ZU9mKCksaz10aGlzLnlFeHRlbnQoKVsxXS52YWx1ZU9mKCksdD10aGlzLnlFeHRlbnQoKVswXS52YWx1ZU9mKCk7CmYhPT1oJiZrIT09dCYmdGhpcy5pbnRlcnBvbGF0ZVpvb20oZixoLGssdCl9dW56b29tKCl7dmFyIGY9dGhpcy54U2NhbGUoKTtmLl9kb21haW5NaW49bnVsbDtmLl9kb21haW5NYXg9bnVsbDtmPWYuX2dldEV4dGVudCgpO3RoaXMueFNjYWxlKCkuZG9tYWluKGYpO3RoaXMudW56b29tTWV0aG9kKCl9aXNab29taW5nKGYpe3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKCFmKTt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmVuYWJsZWQoIWYpfWludGVycG9sYXRlWm9vbShmLGgsayx0KXtsZXQgbD10aGlzLnhTY2FsZSgpLmRvbWFpbigpWzBdLnZhbHVlT2YoKSxwPXRoaXMueFNjYWxlKCkuZG9tYWluKClbMV0udmFsdWVPZigpLG09dGhpcy55U2NhbGUoKS5kb21haW4oKVswXS52YWx1ZU9mKCksbj10aGlzLnlTY2FsZSgpLmRvbWFpbigpWzFdLnZhbHVlT2YoKSxxPXRoaXMuZWFzZUZuLHU9KHksdyxDKT0+ZDMuaW50ZXJwb2xhdGVOdW1iZXIoeSx3KShxKEMpKTt0aGlzLmlzWm9vbWluZyghMCk7CmxldCB4PURhdGUubm93KCksQT0oKT0+e3ZhciB5PURhdGUubm93KCkteDt5PTA9PT10aGlzLl9hbmltYXRpb25UaW1lPzE6TWF0aC5taW4oMSx5L3RoaXMuX2FuaW1hdGlvblRpbWUpO2xldCB3PXUobCxmLHkpLEM9dShwLGgseSksRj11KG0sayx5KSxEPXUobix0LHkpO3RoaXMueFNjYWxlKCkuZG9tYWluKFt3LENdKTt0aGlzLnlTY2FsZSgpLmRvbWFpbihbRixEXSk7MT55P1Bsb3R0YWJsZS5VdGlscy5ET00ucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoQSk6KHRoaXMub25FbmQoKSx0aGlzLmlzWm9vbWluZyghMSkpfTtBKCl9fWIuRHJhZ1pvb21MYXllcj1kfSkoRmh8fChGaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Bhblpvb21EcmFnTGF5ZXIuanMKdmFyIEdoOwooZnVuY3Rpb24oYil7bGV0IGQ7KGZ1bmN0aW9uKGgpe2hbaC5OT05FPTBdPSJOT05FIjtoW2guRFJBR19aT09NSU5HPTFdPSJEUkFHX1pPT01JTkciO2hbaC5QQU5OSU5HPTJdPSJQQU5OSU5HIn0pKGR8fChkPXt9KSk7Y2xhc3MgZiBleHRlbmRzIFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3Vwe2NvbnN0cnVjdG9yKGgsayx0KXtzdXBlcigpO3RoaXMuc3RhdGU9ZC5OT05FO3RoaXMucGFuU3RhcnRDYWxsYmFjaz1uZXcgUGxvdHRhYmxlLlV0aWxzLkNhbGxiYWNrU2V0O3RoaXMucGFuRW5kQ2FsbGJhY2s9bmV3IFBsb3R0YWJsZS5VdGlscy5DYWxsYmFja1NldDt0aGlzLnBhblpvb209bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuUGFuWm9vbShoLGspO3RoaXMucGFuWm9vbS5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcihwPT5mLmlzUGFuS2V5KHApJiYwPT09cC5idXR0b24pO3RoaXMucGFuWm9vbS53aGVlbEZpbHRlcih0aGlzLmNhblNjcm9sbFpvb20pO3RoaXMuZHJhZ1pvb21MYXllcj1uZXcgRmguRHJhZ1pvb21MYXllcihoLAprLHQpO3RoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcihwPT4hZi5pc1BhbktleShwKSYmMD09PXAuYnV0dG9uKTt0aGlzLmFwcGVuZCh0aGlzLmRyYWdab29tTGF5ZXIpO2NvbnN0IGw9dGhpcy5vbldoZWVsLmJpbmQodGhpcyk7dGhpcy5vbkFuY2hvcigoKT0+e3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1QbG90dGFibGUuRGlzcGF0Y2hlcnMuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25XaGVlbChsKTt0aGlzLnBhblpvb20uYXR0YWNoVG8odGhpcyl9KTt0aGlzLm9uRGV0YWNoKCgpPT57dGhpcy5wYW5ab29tLmRldGFjaEZyb20oKTt0aGlzLl9tb3VzZURpc3BhdGNoZXImJih0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmV2hlZWwobCksdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGwpfSk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ1N0YXJ0KCgpPT57dGhpcy5zdGF0ZT09ZC5OT05FJiYKdGhpcy5zZXRTdGF0ZShkLlBBTk5JTkcpfSk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ0VuZCgoKT0+e3RoaXMuc3RhdGU9PWQuUEFOTklORyYmdGhpcy5zZXRTdGF0ZShkLk5PTkUpfSk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ1N0YXJ0KCgpPT57dGhpcy5zdGF0ZT09ZC5OT05FJiZ0aGlzLnNldFN0YXRlKGQuRFJBR19aT09NSU5HKX0pO3RoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5vbkRyYWdFbmQoKCk9Pnt0aGlzLnN0YXRlPT1kLkRSQUdfWk9PTUlORyYmdGhpcy5zZXRTdGF0ZShkLk5PTkUpfSl9b25XaGVlbChoLGspe2lmKCF0aGlzLmNhblNjcm9sbFpvb20oaykmJihoPXRoaXMuZWxlbWVudCgpLGguc2VsZWN0KCIuaGVscCIpLmVtcHR5KCkpKXt2YXIgdD1oLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgiaGVscCIsITApO3QuYXBwZW5kKCJzcGFuIikudGV4dCgiQWx0ICsgU2Nyb2xsIHRvIFpvb20iKTsKdC5vbigiYW5pbWF0aW9uZW5kIiwoKT0+dm9pZCB0LnJlbW92ZSgpKX19c3RhdGljIGlzUGFuS2V5KGgpe3JldHVybiEhaC5hbHRLZXl8fCEhaC5zaGlmdEtleX1jYW5TY3JvbGxab29tKGgpe3JldHVybiBoLmFsdEtleX1zZXRTdGF0ZShoKXtpZih0aGlzLnN0YXRlIT1oKXt2YXIgaz10aGlzLnN0YXRlO3RoaXMuc3RhdGU9aDt0aGlzLnJvb3QoKS5yZW1vdmVDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGspKTt0aGlzLnJvb3QoKS5hZGRDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGgpKTtrPT1kLlBBTk5JTkcmJnRoaXMucGFuRW5kQ2FsbGJhY2suY2FsbENhbGxiYWNrcygpO2g9PWQuUEFOTklORyYmdGhpcy5wYW5TdGFydENhbGxiYWNrLmNhbGxDYWxsYmFja3MoKX19c3RhdGVDbGFzc05hbWUoaCl7c3dpdGNoKGgpe2Nhc2UgZC5QQU5OSU5HOnJldHVybiJwYW5uaW5nIjtjYXNlIGQuRFJBR19aT09NSU5HOnJldHVybiJkcmFnLXpvb21pbmciO2RlZmF1bHQ6cmV0dXJuIiJ9fW9uUGFuU3RhcnQoaCl7dGhpcy5wYW5TdGFydENhbGxiYWNrLmFkZChoKX1vblBhbkVuZChoKXt0aGlzLnBhbkVuZENhbGxiYWNrLmFkZChoKX1vblNjcm9sbFpvb20oaCl7dGhpcy5wYW5ab29tLm9uWm9vbUVuZChoKX1vbkRyYWdab29tU3RhcnQoaCl7dGhpcy5kcmFnWm9vbUxheWVyLmludGVyYWN0aW9uU3RhcnQoaCl9b25EcmFnWm9vbUVuZChoKXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25FbmQoaCl9fQpiLlBhblpvb21EcmFnTGF5ZXI9Zn0pKEdofHwoR2g9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi90Zi1zY2FsZS5qcwooZnVuY3Rpb24oYil7Y2xhc3MgZCBleHRlbmRzIFBsb3R0YWJsZS5RdWFudGl0YXRpdmVTY2FsZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dGhpcy5faWdub3JlT3V0bGllcj0hMX1zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKGYpe3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW49Zn1pZ25vcmVPdXRsaWVyKGYpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGY/KHRoaXMuX2lnbm9yZU91dGxpZXI9Zix0aGlzKTp0aGlzLl9pZ25vcmVPdXRsaWVyfV9nZXRBbGxJbmNsdWRlZFZhbHVlcygpe2NvbnN0IGY9dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj90aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluKCk6W107cmV0dXJuIHRoaXMuZXh0ZW50T2ZWYWx1ZXMoZil9fWIuVGZTY2FsZT1kfSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xpbmVhci1zY2FsZS5qcwooZnVuY3Rpb24oYil7Y2xhc3MgZCBleHRlbmRzIFBsb3R0YWJsZS5TY2FsZXMuTGluZWFye2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9pZ25vcmVPdXRsaWVyPSExO3RoaXMucGFkUHJvcG9ydGlvbiguMil9c2V0VmFsdWVQcm92aWRlckZvckRvbWFpbihmKXt0aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluPWZ9X25pY2VEb21haW4oZixoKXtjb25zdCBbayx0XT1mLGw9dC1rO2Y9MD09PWw/MS4xKk1hdGguYWJzKGspKzEuMTpsKnRoaXMucGFkUHJvcG9ydGlvbigpO3JldHVybiBzdXBlci5fbmljZURvbWFpbihbMDw9ayYmazxsPy0uMSp0OmstZix0K2ZdLGgpfV9nZXRVbmJvdW5kZWRFeHRlbnQoZil7Zj10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcyhmKTtsZXQgaD10aGlzLl9kZWZhdWx0RXh0ZW50KCk7MCE9PWYubGVuZ3RoJiYoZj1bUGxvdHRhYmxlLlV0aWxzLk1hdGgubWluKGYsaFswXSksUGxvdHRhYmxlLlV0aWxzLk1hdGgubWF4KGYsaFsxXSldLGg9dGhpcy5fbmljZURvbWFpbihmKSk7CnJldHVybiBofV9nZXRBbGxJbmNsdWRlZFZhbHVlcygpe2NvbnN0IGY9dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj90aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluKCk6W107cmV0dXJuIHRoaXMuZXh0ZW50T2ZWYWx1ZXMoZil9ZXh0ZW50T2ZWYWx1ZXMoZil7dmFyIGg9Zj1mLmZpbHRlcihrPT5QbG90dGFibGUuVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKGspKTtpZih0aGlzLmlnbm9yZU91dGxpZXIoKSl7aD1mLnNvcnQoKGwscCk9PmwtcCk7Y29uc3Qgaz1kMy5xdWFudGlsZShoLC4wNSksdD1kMy5xdWFudGlsZShoLC45NSk7aD1mLmZpbHRlcihsPT5sPj1rJiZsPD10KX1mPWQzLmV4dGVudChoKTtyZXR1cm4gbnVsbD09ZlswXXx8bnVsbD09ZlsxXT9bXTpmfWlnbm9yZU91dGxpZXIoZil7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZj8odGhpcy5faWdub3JlT3V0bGllcj1mLHRoaXMpOnRoaXMuX2lnbm9yZU91dGxpZXJ9fWIuTGluZWFyU2NhbGU9ZH0pKEdofHwoR2g9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9sb2ctc2NhbGUuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoayl7cmV0dXJuIE1hdGgubG9nMTAoayl9ZnVuY3Rpb24gZihrKXtyZXR1cm4gTWF0aC5wb3coMTAsayl9Yi5NSU5fUE9TSVRJVkVfVkFMVUU9TWF0aC5wb3coMiwtMTA3NCk7Y2xhc3MgaCBleHRlbmRzIGIuVGZTY2FsZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fZDNMb2dTY2FsZT1kMy5zY2FsZUxvZygpO3RoaXMucGFkUHJvcG9ydGlvbiguMil9c2NhbGUoayl7cmV0dXJuIDA+PWs/TmFOOnRoaXMuX2QzTG9nU2NhbGUoayl9aW52ZXJ0KGspe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLmludmVydChrKX1zY2FsZVRyYW5zZm9ybWF0aW9uKGspe3JldHVybiB0aGlzLnNjYWxlKGspfWludmVydGVkVHJhbnNmb3JtYXRpb24oayl7cmV0dXJuIHRoaXMuaW52ZXJ0KGspfWdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9X2dldERvbWFpbigpe3JldHVybiB0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWlufV9zZXREb21haW4oayl7dGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbj0Kaztjb25zdCBbdCxsXT1rO3N1cGVyLl9zZXREb21haW4oW01hdGgubWF4KGIuTUlOX1BPU0lUSVZFX1ZBTFVFLHQpLGxdKX1fbmljZURvbWFpbihrKXtjb25zdCBbdCxsXT1rO2s9TWF0aC5tYXgoZChiLk1JTl9QT1NJVElWRV9WQUxVRSksZCh0KSk7Y29uc3QgcD1kKGwpO3ZhciBtPXAtazttPW0/bSp0aGlzLnBhZFByb3BvcnRpb24oKToxO3JldHVybltmKE1hdGgubWF4KGQoYi5NSU5fUE9TSVRJVkVfVkFMVUUpLGstbSkpLGYocCttKV19X2dldFVuYm91bmRlZEV4dGVudChrKXtrPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKGspO2xldCB0PXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09ay5sZW5ndGgmJihrPVtQbG90dGFibGUuVXRpbHMuTWF0aC5taW4oayx0WzBdKSxQbG90dGFibGUuVXRpbHMuTWF0aC5tYXgoayx0WzFdKV0sdD10aGlzLl9uaWNlRG9tYWluKGspKTtyZXR1cm4gdH1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKXtyZXR1cm4gc3VwZXIuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkubWFwKGs9PgowPGs/azpiLk1JTl9QT1NJVElWRV9WQUxVRSl9X2RlZmF1bHRFeHRlbnQoKXtyZXR1cm5bMSwxMF19X2JhY2tpbmdTY2FsZURvbWFpbihrKXtpZihudWxsPT1rKXJldHVybiB0aGlzLl9kM0xvZ1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzTG9nU2NhbGUuZG9tYWluKGspO3JldHVybiB0aGlzfV9nZXRSYW5nZSgpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnJhbmdlKCl9X3NldFJhbmdlKGspe3RoaXMuX2QzTG9nU2NhbGUucmFuZ2Uoayl9ZGVmYXVsdFRpY2tzKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoKX10aWNrcygpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnRpY2tzKCl9ZXh0ZW50T2ZWYWx1ZXMoayl7bGV0IHQ9az1rLmZpbHRlcihsPT5QbG90dGFibGUuVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKGwpJiYwPGwpO2lmKHRoaXMuaWdub3JlT3V0bGllcigpKXtrPWsubWFwKGQpLnNvcnQoKG0sbik9Pm0tbik7Y29uc3QgbD1kMy5xdWFudGlsZShrLC4wNSkscD1kMy5xdWFudGlsZShrLAouOTUpO3Q9ay5maWx0ZXIobT0+bT49bCYmbTw9cCkubWFwKGYpfWs9ZDMuZXh0ZW50KHQpO3JldHVybiBudWxsPT1rWzBdfHxudWxsPT1rWzFdP1tdOmt9fWIuTG9nU2NhbGU9aH0pKEdofHwoR2g9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9saW5lLWNoYXJ0LmpzCihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oayl7a1trLlRFWFQ9MF09IlRFWFQiO2tbay5ET009MV09IkRPTSJ9KShkfHwoZD17fSkpO2xldCBmOyhmdW5jdGlvbihrKXtrLkxPRz0ibG9nIjtrLkxJTkVBUj0ibGluZWFyIn0pKGZ8fChmPXt9KSk7Y2xhc3MgaHtjb25zdHJ1Y3RvcihrLHQsbCxwLG0sbixxLHUseCxBLHkpe3RoaXMuc2VyaWVzTmFtZXM9W107dGhpcy5uYW1lMmRhdGFzZXRzPXt9O3RoaXMuY29sb3JTY2FsZT1wO3RoaXMudG9vbHRpcD1tO3RoaXMuZGF0YXNldHM9W107dGhpcy5faWdub3JlWU91dGxpZXJzPSExO3RoaXMubGFzdFBvaW50c0RhdGFzZXQ9bmV3IFBsb3R0YWJsZS5EYXRhc2V0O3RoaXMubmFuRGF0YXNldD1uZXcgUGxvdHRhYmxlLkRhdGFzZXQ7dGhpcy55VmFsdWVBY2Nlc3Nvcj10O3RoaXMuc3ltYm9sRnVuY3Rpb249QTt0aGlzLm9uRGF0YXNldENoYW5nZWQ9dGhpcy5fb25EYXRhc2V0Q2hhbmdlZC5iaW5kKHRoaXMpO3RoaXMuX2RlZmF1bHRYUmFuZ2U9CnU7dGhpcy5fZGVmYXVsdFlSYW5nZT14O3RoaXMudG9vbHRpcENvbHVtbnM9bjt0aGlzLmJ1aWxkQ2hhcnQoayxsLHEseSl9YnVpbGRDaGFydChrLHQsbCxwKXt0aGlzLmRlc3Ryb3koKTtrPWsoKTt0aGlzLnhBY2Nlc3Nvcj1rLmFjY2Vzc29yO3RoaXMueFNjYWxlPWsuc2NhbGU7dGhpcy54QXhpcz1rLmF4aXM7dGhpcy54QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZygzKTtwJiZ0aGlzLnhBeGlzLmZvcm1hdHRlcihwKTt0aGlzLnlTY2FsZT1oLmdldFlTY2FsZUZyb21UeXBlKHQpO3RoaXMueVNjYWxlLnNldFZhbHVlUHJvdmlkZXJGb3JEb21haW4oKCk9PnRoaXMuZ2V0VmFsdWVzRm9yWUF4aXNEb21haW5Db21wdXRlKCkpO3RoaXMueUF4aXM9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModGhpcy55U2NhbGUsImxlZnQiKTtwPXJnLm11bHRpc2NhbGVGb3JtYXR0ZXIocmcuWV9BWElTX0ZPUk1BVFRFUl9QUkVDSVNJT04pO3RoaXMueUF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoNSkuZm9ybWF0dGVyKHApOwp0aGlzLnlBeGlzLnVzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uKCk7dGhpcy5maWxsQXJlYT1sO3A9bmV3IGIuUGFuWm9vbURyYWdMYXllcih0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSwoKT0+dGhpcy5yZXNldERvbWFpbigpKTt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbj10aGlzLmNyZWF0ZVRvb2x0aXBJbnRlcmFjdGlvbihwKTt0aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQ9bmV3IFBsb3R0YWJsZS5Db21wb25lbnQ7bD10aGlzLmJ1aWxkUGxvdCh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSxsKTt0aGlzLmdyaWRsaW5lcz1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JpZGxpbmVzKHRoaXMueFNjYWxlLHRoaXMueVNjYWxlKTtrPW51bGw7dCE9PWYuTE9HJiYoaz1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3VpZGVMaW5lTGF5ZXIoImhvcml6b250YWwiKSxrLnNjYWxlKHRoaXMueVNjYWxlKS52YWx1ZSgwKSk7dD1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3VpZGVMaW5lTGF5ZXIoInZlcnRpY2FsIik7CnQuc2NhbGUodGhpcy54U2NhbGUpLnZhbHVlKDApO3RoaXMuY2VudGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChbdGhpcy5ncmlkbGluZXMsayx0LGwsdGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LHBdKTt0aGlzLmNlbnRlci5hZGRDbGFzcygibWFpbiIpO3RoaXMub3V0ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLlRhYmxlKFtbdGhpcy55QXhpcyx0aGlzLmNlbnRlcl0sW251bGwsdGhpcy54QXhpc11dKX1idWlsZFBsb3Qoayx0LGwpe2wmJih0aGlzLm1hcmdpbkFyZWFQbG90PW5ldyBQbG90dGFibGUuUGxvdHMuQXJlYSx0aGlzLm1hcmdpbkFyZWFQbG90LngodGhpcy54QWNjZXNzb3IsayksdGhpcy5tYXJnaW5BcmVhUGxvdC55KGwuaGlnaGVyQWNjZXNzb3IsdCksdGhpcy5tYXJnaW5BcmVhUGxvdC55MChsLmxvd2VyQWNjZXNzb3IpLHRoaXMubWFyZ2luQXJlYVBsb3QuYXR0cigiZmlsbCIsKHEsdSx4KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHgubWV0YWRhdGEoKS5uYW1lKSksCnRoaXMubWFyZ2luQXJlYVBsb3QuYXR0cigiZmlsbC1vcGFjaXR5IiwuMyksdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJzdHJva2Utd2lkdGgiLDApKTt0aGlzLnNtb290aGVkQWNjZXNzb3I9cT0+cS5zbW9vdGhlZDtsPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtsLngodGhpcy54QWNjZXNzb3Isayk7bC55KHRoaXMueVZhbHVlQWNjZXNzb3IsdCk7bC5hdHRyKCJzdHJva2UiLChxLHUseCk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh4Lm1ldGFkYXRhKCkubmFtZSkpO3RoaXMubGluZVBsb3Q9bDt0aGlzLnNldHVwVG9vbHRpcHMobCk7bGV0IHA9bmV3IFBsb3R0YWJsZS5QbG90cy5MaW5lO3AueCh0aGlzLnhBY2Nlc3NvcixrKTtwLnkodGhpcy5zbW9vdGhlZEFjY2Vzc29yLHQpO3AuYXR0cigic3Ryb2tlIiwocSx1LHgpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoeC5tZXRhZGF0YSgpLm5hbWUpKTt0aGlzLnNtb290aExpbmVQbG90PXA7aWYodGhpcy5zeW1ib2xGdW5jdGlvbil7dmFyIG09Cm5ldyBQbG90dGFibGUuUGxvdHMuU2NhdHRlcjttLngodGhpcy54QWNjZXNzb3Isayk7bS55KHRoaXMueVZhbHVlQWNjZXNzb3IsdCk7bS5hdHRyKCJmaWxsIiwocSx1LHgpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoeC5tZXRhZGF0YSgpLm5hbWUpKTttLmF0dHIoIm9wYWNpdHkiLDEpO20uc2l6ZSgyKnJnLlRPT0xUSVBfQ0lSQ0xFX1NJWkUpO20uc3ltYm9sKChxLHUseCk9PnRoaXMuc3ltYm9sRnVuY3Rpb24oeC5tZXRhZGF0YSgpLm5hbWUpKTt0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdD1tfW09bmV3IFBsb3R0YWJsZS5QbG90cy5TY2F0dGVyO20ueCh0aGlzLnhBY2Nlc3NvcixrKTttLnkodGhpcy55VmFsdWVBY2Nlc3Nvcix0KTttLmF0dHIoImZpbGwiLHE9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShxLm5hbWUpKTttLmF0dHIoIm9wYWNpdHkiLDEpO20uc2l6ZSgyKnJnLlRPT0xUSVBfQ0lSQ0xFX1NJWkUpO20uZGF0YXNldHMoW3RoaXMubGFzdFBvaW50c0RhdGFzZXRdKTt0aGlzLnNjYXR0ZXJQbG90PQptO2xldCBuPW5ldyBQbG90dGFibGUuUGxvdHMuU2NhdHRlcjtuLngodGhpcy54QWNjZXNzb3Isayk7bi55KHE9PnEuZGlzcGxheVksdCk7bi5hdHRyKCJmaWxsIixxPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUocS5uYW1lKSk7bi5hdHRyKCJvcGFjaXR5IiwxKTtuLnNpemUoMipyZy5OQU5fU1lNQk9MX1NJWkUpO24uZGF0YXNldHMoW3RoaXMubmFuRGF0YXNldF0pO24uc3ltYm9sKFBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMudHJpYW5nbGUpO3RoaXMubmFuRGlzcGxheT1uO2s9W24sbSxwLGxdO3RoaXMubWFyZ2luQXJlYVBsb3QmJmsucHVzaCh0aGlzLm1hcmdpbkFyZWFQbG90KTt0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmay5wdXNoKHRoaXMubWFya2Vyc1NjYXR0ZXJQbG90KTtyZXR1cm4gbmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKGspfV9vbkRhdGFzZXRDaGFuZ2VkKGspe3RoaXMuc21vb3RoaW5nRW5hYmxlZCYmdGhpcy5yZXNtb290aERhdGFzZXQoayk7dGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKX1pZ25vcmVZT3V0bGllcnMoayl7ayE9PQp0aGlzLl9pZ25vcmVZT3V0bGllcnMmJih0aGlzLl9pZ25vcmVZT3V0bGllcnM9ayx0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpLHRoaXMueVNjYWxlLmlnbm9yZU91dGxpZXIoayksdGhpcy5yZXNldFlEb21haW4oKSl9Z2V0VmFsdWVzRm9yWUF4aXNEb21haW5Db21wdXRlKCl7Y29uc3Qgaz10aGlzLmdldEFjY2Vzc29yc0ZvckNvbXB1dGluZ1lSYW5nZSgpO3JldHVybiBfLmZsYXR0ZW5EZWVwKHRoaXMuZGF0YXNldHMubWFwKHQ9PmsubWFwKGw9PnQuZGF0YSgpLm1hcChwPT5sKHAsLTEsdCkpKSkpLmZpbHRlcihpc0Zpbml0ZSl9dXBkYXRlU3BlY2lhbERhdGFzZXRzKCl7Y29uc3Qgaz10aGlzLmdldFlBeGlzQWNjZXNzb3IoKTt2YXIgdD10aGlzLmRhdGFzZXRzLm1hcChsPT57bGV0IHA9bnVsbCxtPWwuZGF0YSgpLmZpbHRlcihuPT4haXNOYU4oayhuLC0xLGwpKSk7MDxtLmxlbmd0aCYmKHA9bVttLmxlbmd0aC0xXSxwLm5hbWU9bC5tZXRhZGF0YSgpLm5hbWUscC5yZWxhdGl2ZT0KcmcucmVsYXRpdmVBY2Nlc3NvcihwLC0xLGwpKTtyZXR1cm4gcH0pLmZpbHRlcihsPT5udWxsIT1sKTt0aGlzLmxhc3RQb2ludHNEYXRhc2V0LmRhdGEodCk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJnRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMubWFwKHRoaXMuY3JlYXRlU2FtcGxlZERhdGFzZXRGb3JNYXJrZXJzKSk7dD1fLmZsYXR0ZW4odGhpcy5kYXRhc2V0cy5tYXAobD0+e2xldCBwPW51bGwsbT1sLmRhdGEoKSxuPTA7Zm9yKDtuPG0ubGVuZ3RoJiZudWxsPT1wOylpc05hTihrKG1bbl0sLTEsbCkpfHwocD1rKG1bbl0sLTEsbCkpLG4rKztudWxsPT1wJiYocD0wKTtsZXQgcT1bXTtmb3Iobj0wO248bS5sZW5ndGg7bisrKWlzTmFOKGsobVtuXSwtMSxsKSk/KG1bbl0ubmFtZT1sLm1ldGFkYXRhKCkubmFtZSxtW25dLmRpc3BsYXlZPXAsbVtuXS5yZWxhdGl2ZT1yZy5yZWxhdGl2ZUFjY2Vzc29yKG1bbl0sLTEsbCkscS5wdXNoKG1bbl0pKToKcD1rKG1bbl0sLTEsbCk7cmV0dXJuIHF9KSk7dGhpcy5uYW5EYXRhc2V0LmRhdGEodCl9cmVzZXREb21haW4oKXt0aGlzLnJlc2V0WERvbWFpbigpO3RoaXMucmVzZXRZRG9tYWluKCl9cmVzZXRYRG9tYWluKCl7aWYobnVsbCE9dGhpcy5fZGVmYXVsdFhSYW5nZSl2YXIgaz10aGlzLl9kZWZhdWx0WFJhbmdlO2Vsc2Ugaz10aGlzLnhTY2FsZSxrLl9kb21haW5NaW49bnVsbCxrLl9kb21haW5NYXg9bnVsbCxrPWsuX2dldEV4dGVudCgpO3RoaXMueFNjYWxlLmRvbWFpbihrKX1yZXNldFlEb21haW4oKXtudWxsIT10aGlzLl9kZWZhdWx0WVJhbmdlP3RoaXMueVNjYWxlLmRvbWFpbih0aGlzLl9kZWZhdWx0WVJhbmdlKToodGhpcy55U2NhbGUuYXV0b0RvbWFpbigpLHRoaXMueVNjYWxlLmRvbWFpbih0aGlzLnlTY2FsZS5kb21haW4oKSkpfWdldEFjY2Vzc29yc0ZvckNvbXB1dGluZ1lSYW5nZSgpe2NvbnN0IGs9W3RoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpXTt0aGlzLmZpbGxBcmVhJiZrLnB1c2godGhpcy5maWxsQXJlYS5sb3dlckFjY2Vzc29yLAp0aGlzLmZpbGxBcmVhLmhpZ2hlckFjY2Vzc29yKTtyZXR1cm4ga31nZXRZQXhpc0FjY2Vzc29yKCl7cmV0dXJuIHRoaXMuc21vb3RoaW5nRW5hYmxlZD90aGlzLnNtb290aGVkQWNjZXNzb3I6dGhpcy55VmFsdWVBY2Nlc3Nvcn1jcmVhdGVUb29sdGlwSW50ZXJhY3Rpb24oayl7Y29uc3QgdD1uZXcgcmcuUG9pbnRlckludGVyYWN0aW9uLGw9KCk9Pnt0LmVuYWJsZWQoITEpO3RoaXMuaGlkZVRvb2x0aXBzKCl9LHA9KCk9PnQuZW5hYmxlZCghMCk7ay5vblBhblN0YXJ0KGwpO2sub25EcmFnWm9vbVN0YXJ0KGwpO2sub25QYW5FbmQocCk7ay5vbkRyYWdab29tRW5kKHApO2sub25TY3JvbGxab29tKCgpPT50aGlzLnVwZGF0ZVRvb2x0aXBDb250ZW50KHRoaXMuX2xhc3RNb3VzZVBvc2l0aW9uKSk7dC5vblBvaW50ZXJNb3ZlKG09Pnt0aGlzLl9sYXN0TW91c2VQb3NpdGlvbj1tO3RoaXMudXBkYXRlVG9vbHRpcENvbnRlbnQobSl9KTt0Lm9uUG9pbnRlckV4aXQoKCk9PnRoaXMuaGlkZVRvb2x0aXBzKCkpOwpyZXR1cm4gdH11cGRhdGVUb29sdGlwQ29udGVudChrKXt0aGlzLmxpbmVQbG90JiYod2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Rvb2x0aXBVcGRhdGVBbmltYXRpb25GcmFtZSksdGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntsZXQgdD17eDprLngseTprLnksZGF0dW06bnVsbCxkYXRhc2V0Om51bGx9LGw9dGhpcy5ncmlkbGluZXMuY29udGVudCgpLm5vZGUoKS5nZXRCQm94KCk7dmFyIHA9dGhpcy5saW5lUGxvdC5kYXRhc2V0cygpLm1hcCh1PT50aGlzLmZpbmRDbG9zZXN0UG9pbnQodCx1KSkuZmlsdGVyKEJvb2xlYW4pO2xldCBtPVBsb3R0YWJsZS5VdGlscy5ET00uaW50ZXJzZWN0c0JCb3gsbj1wLmZpbHRlcih1PT5tKHUueCx1LnksbCl8fGlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IodS5kYXR1bSwwLHUuZGF0YXNldCkpKSxxPW4uZmlsdGVyKHU9PiFpc05hTih0aGlzLnlWYWx1ZUFjY2Vzc29yKHUuZGF0dW0sCjAsdS5kYXRhc2V0KSkpOzAhPT1wLmxlbmd0aD8odGhpcy5zY2F0dGVyUGxvdC5hdHRyKCJkaXNwbGF5Iiwibm9uZSIpLHA9dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LmNvbnRlbnQoKS5zZWxlY3RBbGwoIi5wb2ludCIpLmRhdGEocSx1PT51LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSxwLmVudGVyKCkuYXBwZW5kKCJjaXJjbGUiKS5jbGFzc2VkKCJwb2ludCIsITApLHAuYXR0cigiciIscmcuVE9PTFRJUF9DSVJDTEVfU0laRSkuYXR0cigiY3giLHU9PnUueCkuYXR0cigiY3kiLHU9PnUueSkuc3R5bGUoInN0cm9rZSIsIm5vbmUiKS5hdHRyKCJmaWxsIix1PT50aGlzLmNvbG9yU2NhbGUuc2NhbGUodS5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpLHAuZXhpdCgpLnJlbW92ZSgpLHRoaXMuZHJhd1Rvb2x0aXBzKG4sdCx0aGlzLnRvb2x0aXBDb2x1bW5zKSk6dGhpcy5oaWRlVG9vbHRpcHMoKX0pKX1oaWRlVG9vbHRpcHMoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKTsKdGhpcy50b29sdGlwLmhpZGUoKTt0aGlzLnNjYXR0ZXJQbG90LmF0dHIoImRpc3BsYXkiLCJibG9jayIpO3RoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudC5jb250ZW50KCkuc2VsZWN0QWxsKCIucG9pbnQiKS5yZW1vdmUoKX1zZXR1cFRvb2x0aXBzKGspe2sub25EZXRhY2goKCk9Pnt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5kZXRhY2hGcm9tKCk7dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZW5hYmxlZCghMSl9KTtrLm9uQW5jaG9yKCgpPT57dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uYXR0YWNoVG8oayk7dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZW5hYmxlZCghMCl9KX1kcmF3VG9vbHRpcHMoayx0LGwpe2lmKGsubGVuZ3RoKXt2YXIgcD10aGlzLmNvbG9yU2NhbGU7bD1be3RpdGxlOiIiLHN0YXRpYzohMSxldmFsVHlwZTpkLkRPTSxldmFsdWF0ZSh5KXtkMy5zZWxlY3QodGhpcykuc2VsZWN0KCJzcGFuIikuc3R5bGUoImJhY2tncm91bmQtY29sb3IiLCgpPT5wLnNjYWxlKHkuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpKTsKcmV0dXJuIiJ9LGVudGVyKHkpe2QzLnNlbGVjdCh0aGlzKS5hcHBlbmQoInNwYW4iKS5jbGFzc2VkKCJzd2F0Y2giLCEwKS5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsKCk9PnAuc2NhbGUoeS5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpfX0sLi4ubF07dmFyIG09eT0+TWF0aC5wb3coeS54LXQueCwyKStNYXRoLnBvdyh5LnktdC55LDIpLG49Xy5taW4oay5tYXAobSkpLHE9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3Nvcjp0aGlzLnlWYWx1ZUFjY2Vzc29yO2s9ImFzY2VuZGluZyI9PT10aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kP18uc29ydEJ5KGsseT0+cSh5LmRhdHVtLC0xLHkuZGF0YXNldCkpOiJkZXNjZW5kaW5nIj09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0Qnkoayx5PT5xKHkuZGF0dW0sLTEseS5kYXRhc2V0KSkucmV2ZXJzZSgpOiJuZWFyZXN0Ij09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0QnkoayxtKTprLnNsaWNlKDApLnJldmVyc2UoKTsKdmFyIHU9dGhpcyx4PWQzLnNlbGVjdCh0aGlzLnRvb2x0aXAuY29udGVudCgpKS5zZWxlY3QoInRhYmxlIiksQT14LnNlbGVjdCgidGhlYWQiKS5zZWxlY3RBbGwoInRoIikuZGF0YShsLHk9PnkudGl0bGUpO0EuZW50ZXIoKS5hcHBlbmQoInRoIikudGV4dCh5PT55LnRpdGxlKS5ub2RlcygpO0EuZXhpdCgpLnJlbW92ZSgpO2s9eC5zZWxlY3QoInRib2R5Iikuc2VsZWN0QWxsKCJ0ciIpLmRhdGEoayx5PT55LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKTtrLmNsYXNzZWQoImRpc3RhbnQiLHk9Pnt2YXIgdz15LmRhdGFzZXQuZGF0YSgpWzBdLEM9Xy5sYXN0KHkuZGF0YXNldC5kYXRhKCkpO3c9dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IodywwLHkuZGF0YXNldCkpO0M9dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IoQywwLHkuZGF0YXNldCkpO3k9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3kuZGF0dW0uc21vb3RoZWQ6dGhpcy55VmFsdWVBY2Nlc3Nvcih5LmRhdHVtLAowLHkuZGF0YXNldCk7cmV0dXJuIHQueDx3fHx0Lng+Q3x8aXNOYU4oeSl9KS5jbGFzc2VkKCJjbG9zZXN0Iix5PT5tKHkpPT09bikuZWFjaChmdW5jdGlvbih5KXt1LmRyYXdUb29sdGlwUm93KHRoaXMsbCx5KX0pLm9yZGVyKCk7ay5leGl0KCkucmVtb3ZlKCk7ay5lbnRlcigpLmFwcGVuZCgidHIiKS5lYWNoKGZ1bmN0aW9uKHkpe3UuZHJhd1Rvb2x0aXBSb3codGhpcyxsLHkpfSkubm9kZXMoKTt0aGlzLnRvb2x0aXAudXBkYXRlQW5kUG9zaXRpb24odGhpcy50YXJnZXRTVkcubm9kZSgpKX1lbHNlIHRoaXMudG9vbHRpcC5oaWRlKCl9ZHJhd1Rvb2x0aXBSb3coayx0LGwpe2NvbnN0IHA9dGhpcztrPWQzLnNlbGVjdChrKS5zZWxlY3RBbGwoInRkIikuZGF0YSh0KTtrLmVhY2goZnVuY3Rpb24obSl7bS5zdGF0aWN8fHAuZHJhd1Rvb2x0aXBDb2x1bW4uY2FsbChwLHRoaXMsbSxsKX0pO2suZW50ZXIoKS5hcHBlbmQoInRkIikuZWFjaChmdW5jdGlvbihtKXttLmVudGVyJiZtLmVudGVyLmNhbGwodGhpcywKbCk7cC5kcmF3VG9vbHRpcENvbHVtbi5jYWxsKHAsdGhpcyxtLGwpfSl9ZHJhd1Rvb2x0aXBDb2x1bW4oayx0LGwpe2NvbnN0IHA9dGhpcy5zbW9vdGhpbmdFbmFibGVkO3QuZXZhbFR5cGU9PWQuRE9NP3QuZXZhbHVhdGUuY2FsbChrLGwse3Ntb290aGluZ0VuYWJsZWQ6cH0pOmQzLnNlbGVjdChrKS50ZXh0KHQuZXZhbHVhdGUuY2FsbChrLGwse3Ntb290aGluZ0VuYWJsZWQ6cH0pKX1maW5kQ2xvc2VzdFBvaW50KGssdCl7Y29uc3QgbD10LmRhdGEoKS5tYXAoKG4scSk9PnRoaXMueFNjYWxlLnNjYWxlKHRoaXMueEFjY2Vzc29yKG4scSx0KSkpO2xldCBwPV8uc29ydGVkSW5kZXgobCxrLngpO2lmKDA9PWwubGVuZ3RoKXJldHVybiBudWxsO3A9PT1sLmxlbmd0aD8tLXA6MCE9PXAmJihwPU1hdGguYWJzKGxbcC0xXS1rLngpPE1hdGguYWJzKGxbcF0tay54KT9wLTE6cCk7az10LmRhdGEoKVtwXTtjb25zdCBtPXRoaXMuc21vb3RoaW5nRW5hYmxlZD90aGlzLnNtb290aGVkQWNjZXNzb3IoaywKcCx0KTp0aGlzLnlWYWx1ZUFjY2Vzc29yKGsscCx0KTtyZXR1cm57eDpsW3BdLHk6dGhpcy55U2NhbGUuc2NhbGUobSksZGF0dW06ayxkYXRhc2V0OnR9fXJlc21vb3RoRGF0YXNldChrKXtsZXQgdD1rLmRhdGEoKTtjb25zdCBsPXRoaXMuc21vb3RoaW5nV2VpZ2h0O2xldCBwPTA8dC5sZW5ndGg/MDpOYU4sbT0wO2NvbnN0IG49dC5tYXAoKHUseCk9PnRoaXMueVZhbHVlQWNjZXNzb3IodSx4LGspKSxxPW4uZXZlcnkodT0+dT09blswXSk7dC5mb3JFYWNoKCh1LHgpPT57eD1uW3hdO3F8fCFOdW1iZXIuaXNGaW5pdGUoeCk/dS5zbW9vdGhlZD14OihwPXAqbCsoMS1sKSp4LG0rKyx4PTEsMSE9PWwmJih4PTEtTWF0aC5wb3cobCxtKSksdS5zbW9vdGhlZD1wL3gpfSl9Z2V0RGF0YXNldChrKXt2b2lkIDA9PT10aGlzLm5hbWUyZGF0YXNldHNba10mJih0aGlzLm5hbWUyZGF0YXNldHNba109bmV3IFBsb3R0YWJsZS5EYXRhc2V0KFtdLHtuYW1lOmssbWV0YTpudWxsfSkpO3JldHVybiB0aGlzLm5hbWUyZGF0YXNldHNba119c3RhdGljIGdldFlTY2FsZUZyb21UeXBlKGspe2lmKGs9PT0KZi5MT0cpcmV0dXJuIG5ldyBiLkxvZ1NjYWxlO2lmKGs9PT1mLkxJTkVBUilyZXR1cm4gbmV3IGIuTGluZWFyU2NhbGU7dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCB5U2NhbGUgdHlwZSAiK2spO31zZXRWaXNpYmxlU2VyaWVzKGspe3RoaXMuc2VyaWVzTmFtZXM9az1rLnNvcnQoKTtrLnJldmVyc2UoKTt0aGlzLmRhdGFzZXRzLmZvckVhY2godD0+dC5vZmZVcGRhdGUodGhpcy5vbkRhdGFzZXRDaGFuZ2VkKSk7dGhpcy5kYXRhc2V0cz1rLm1hcCh0PT50aGlzLmdldERhdGFzZXQodCkpO3RoaXMuZGF0YXNldHMuZm9yRWFjaCh0PT50Lm9uVXBkYXRlKHRoaXMub25EYXRhc2V0Q2hhbmdlZCkpO3RoaXMubGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cyk7dGhpcy5zbW9vdGhpbmdFbmFibGVkJiZ0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMpO3RoaXMubWFyZ2luQXJlYVBsb3QmJnRoaXMubWFyZ2luQXJlYVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cyk7CnRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCl9Y3JlYXRlU2FtcGxlZERhdGFzZXRGb3JNYXJrZXJzKGspe2NvbnN0IHQ9ay5kYXRhKCk7aWYoMjA+PXQubGVuZ3RoKXJldHVybiBrO2NvbnN0IGw9TWF0aC5jZWlsKHQubGVuZ3RoLzIwKSxwPUFycmF5KE1hdGguZmxvb3IodC5sZW5ndGgvbCkpO2ZvcihsZXQgbT0wLG49MDttPHAubGVuZ3RoO20rKyxuKz1sKXBbbV09dFtuXTtyZXR1cm4gbmV3IFBsb3R0YWJsZS5EYXRhc2V0KHAsay5tZXRhZGF0YSgpKX1zZXRTZXJpZXNEYXRhKGssdCl7dGhpcy5nZXREYXRhc2V0KGspLmRhdGEodCk7dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dEluUmFmKCl9c2V0U2VyaWVzTWV0YWRhdGEoayx0KXt0PU9iamVjdC5hc3NpZ24oe30sdGhpcy5nZXREYXRhc2V0KGspLm1ldGFkYXRhKCkse21ldGE6dH0pO3RoaXMuZ2V0RGF0YXNldChrKS5tZXRhZGF0YSh0KX1zbW9vdGhpbmdVcGRhdGUoayl7dGhpcy5zbW9vdGhpbmdXZWlnaHQ9Cms7dGhpcy5kYXRhc2V0cy5mb3JFYWNoKHQ9PnRoaXMucmVzbW9vdGhEYXRhc2V0KHQpKTt0aGlzLnNtb290aGluZ0VuYWJsZWR8fCh0aGlzLmxpbmVQbG90LmFkZENsYXNzKCJnaG9zdCIpLHRoaXMuc2NhdHRlclBsb3QueSh0aGlzLnNtb290aGVkQWNjZXNzb3IsdGhpcy55U2NhbGUpLHRoaXMuc21vb3RoaW5nRW5hYmxlZD0hMCx0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMpKTt0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QueSh0aGlzLmdldFlBeGlzQWNjZXNzb3IoKSx0aGlzLnlTY2FsZSk7dGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKX1zbW9vdGhpbmdEaXNhYmxlKCl7dGhpcy5zbW9vdGhpbmdFbmFibGVkJiYodGhpcy5saW5lUGxvdC5yZW1vdmVDbGFzcygiZ2hvc3QiKSx0aGlzLnNjYXR0ZXJQbG90LnkodGhpcy55VmFsdWVBY2Nlc3Nvcix0aGlzLnlTY2FsZSksdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyhbXSksCnRoaXMuc21vb3RoaW5nRW5hYmxlZD0hMSx0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpKTt0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QueSh0aGlzLmdldFlBeGlzQWNjZXNzb3IoKSx0aGlzLnlTY2FsZSl9c2V0VG9vbHRpcFNvcnRpbmdNZXRob2Qoayl7dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD1rfXJlbmRlclRvKGspe3RoaXMudGFyZ2V0U1ZHPWs7dGhpcy5vdXRlci5yZW5kZXJUbyhrKTtudWxsIT10aGlzLl9kZWZhdWx0WFJhbmdlJiZ0aGlzLnJlc2V0WERvbWFpbigpO251bGwhPXRoaXMuX2RlZmF1bHRZUmFuZ2UmJnRoaXMucmVzZXRZRG9tYWluKCk7dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dEluUmFmKCl9cmVkcmF3KCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZik7dGhpcy5fcmVkcmF3UmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0KCk7CnRoaXMub3V0ZXIucmVkcmF3KCl9KX1tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dEluUmFmKCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2ludmFsaWRhdGVMYXlvdXRSYWYpO3RoaXMuX2ludmFsaWRhdGVMYXlvdXRSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKX0pfW1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0KCl7aWYodGhpcy5fbGFzdERyYXdCQm94KXtjb25zdCBrPXRoaXMuX2xhc3REcmF3QkJveC53aWR0aCx7d2lkdGg6dH09dGhpcy50YXJnZXRTVkcubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOzA9PWsmJms8dCYmdGhpcy5vdXRlci5pbnZhbGlkYXRlQ2FjaGUoKX10aGlzLl9sYXN0RHJhd0JCb3g9dGhpcy50YXJnZXRTVkcubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWRlc3Ryb3koKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTsKd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2ludmFsaWRhdGVMYXlvdXRSYWYpO3RoaXMub3V0ZXImJnRoaXMub3V0ZXIuZGVzdHJveSgpfW9uQW5jaG9yKGspe2lmKHRoaXMub3V0ZXIpdGhpcy5vdXRlci5vbkFuY2hvcihrKX19Yi5MaW5lQ2hhcnQ9aH0pKEdofHwoR2g9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi92ei1saW5lLWNoYXJ0Mi5qcwooZnVuY3Rpb24oYil7Y29uc3QgZD1yZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKSxmPWg9PmlzTmFOKGgpPyJOYU4iOmQoaCk7Yi5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OUz1be3RpdGxlOiJOYW1lIixldmFsdWF0ZTpoPT5oLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlNtb290aGVkIixldmFsdWF0ZShoLGspe3JldHVybiBmKGsuc21vb3RoaW5nRW5hYmxlZD9oLmRhdHVtLnNtb290aGVkOmguZGF0dW0uc2NhbGFyKX19LHt0aXRsZToiVmFsdWUiLGV2YWx1YXRlOmg9PmYoaC5kYXR1bS5zY2FsYXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOmg9PnJnLnN0ZXBGb3JtYXR0ZXIoaC5kYXR1bS5zdGVwKX0se3RpdGxlOiJUaW1lIixldmFsdWF0ZTpoPT5yZy50aW1lRm9ybWF0dGVyKGguZGF0dW0ud2FsbF90aW1lKX0se3RpdGxlOiJSZWxhdGl2ZSIsZXZhbHVhdGU6aD0+cmcucmVsYXRpdmVGb3JtYXR0ZXIocmcucmVsYXRpdmVBY2Nlc3NvcihoLmRhdHVtLAotMSxoLmRhdGFzZXQpKX1dO1BvbHltZXIoe2lzOiJ2ei1saW5lLWNoYXJ0MiIscHJvcGVydGllczp7Y29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGQzLnNjaGVtZUNhdGVnb3J5MTApfX0sc3ltYm9sRnVuY3Rpb246T2JqZWN0LHNtb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6ITF9LHNtb290aGluZ1dlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6LjZ9LHhUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0seENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LHhBeGlzRm9ybWF0dGVyOk9iamVjdCx5VmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pmg9Pmguc2NhbGFyfSx0b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+Yi5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OU30sZmlsbEFyZWE6T2JqZWN0LApkZWZhdWx0WFJhbmdlOkFycmF5LGRlZmF1bHRZUmFuZ2U6QXJyYXkseVNjYWxlVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImxpbmVhciJ9LGlnbm9yZVlPdXRsaWVyczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx0b29sdGlwU29ydGluZ01ldGhvZDp7dHlwZTpTdHJpbmcsdmFsdWU6ImRlZmF1bHQifSx0b29sdGlwUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOkVoLlRvb2x0aXBQb3NpdGlvbi5CT1RUT019LF9jaGFydDpPYmplY3QsX3Zpc2libGVTZXJpZXNDYWNoZTp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9zZXJpZXNEYXRhQ2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfc2VyaWVzTWV0YWRhdGFDYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfbWFrZUNoYXJ0KHhDb21wb25lbnRzQ3JlYXRpb25NZXRob2QsIHhUeXBlLCB5VmFsdWVBY2Nlc3NvciwgeVNjYWxlVHlwZSwgdG9vbHRpcENvbHVtbnMsIGNvbG9yU2NhbGUsIGlzQXR0YWNoZWQpIiwKIl9yZWxvYWRGcm9tQ2FjaGUoX2NoYXJ0LCBfdmlzaWJsZVNlcmllc0NhY2hlKSIsIl9zbW9vdGhpbmdDaGFuZ2VkKHNtb290aGluZ0VuYWJsZWQsIHNtb290aGluZ1dlaWdodCwgX2NoYXJ0KSIsIl90b29sdGlwU29ydGluZ01ldGhvZENoYW5nZWQodG9vbHRpcFNvcnRpbmdNZXRob2QsIF9jaGFydCkiLCJfb3V0bGllcnNDaGFuZ2VkKGlnbm9yZVlPdXRsaWVycywgX2NoYXJ0KSJdLHJlYWR5KCl7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLmNoYXJ0ZGl2LCEwKX0sYXR0YWNoZWQoKXtjb25zdCBoPXtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9O3RoaXMuX2xpc3Rlbih0aGlzLCJtb3VzZWRvd24iLHRoaXMuX29uTW91c2VEb3duLmJpbmQodGhpcyksaCk7dGhpcy5fbGlzdGVuKHRoaXMsIm1vdXNldXAiLHRoaXMuX29uTW91c2VVcC5iaW5kKHRoaXMpLGgpO3RoaXMuX2xpc3Rlbih3aW5kb3csImtleWRvd24iLHRoaXMuX29uS2V5RG93bi5iaW5kKHRoaXMpLGgpO3RoaXMuX2xpc3Rlbih3aW5kb3csCiJrZXl1cCIsdGhpcy5fb25LZXlVcC5iaW5kKHRoaXMpLGgpfSxkZXRhY2hlZCgpe3RoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKTt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3RoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKCh7bm9kZTpoLGV2ZW50TmFtZTprLGZ1bmM6dCxvcHRpb246bH0pPT57aC5yZW1vdmVFdmVudExpc3RlbmVyKGssdCxsKX0pLHRoaXMuX2xpc3RlbmVycy5jbGVhcigpKX0sX2xpc3RlbihoLGssdCxsPXt9KXt0aGlzLl9saXN0ZW5lcnN8fCh0aGlzLl9saXN0ZW5lcnM9bmV3IFNldCk7dGhpcy5fbGlzdGVuZXJzLmFkZCh7bm9kZTpoLGV2ZW50TmFtZTprLGZ1bmM6dCxvcHRpb246bH0pO2guYWRkRXZlbnRMaXN0ZW5lcihrLHQsbCl9LF9vbktleURvd24oaCl7dGhpcy50b2dnbGVDbGFzcygicGFua2V5IixiLlBhblpvb21EcmFnTGF5ZXIuaXNQYW5LZXkoaCkpfSxfb25LZXlVcChoKXt0aGlzLnRvZ2dsZUNsYXNzKCJwYW5rZXkiLApiLlBhblpvb21EcmFnTGF5ZXIuaXNQYW5LZXkoaCkpfSxfb25Nb3VzZURvd24oKXt0aGlzLnRvZ2dsZUNsYXNzKCJtb3VzZWRvd24iLCEwKX0sX29uTW91c2VVcCgpe3RoaXMudG9nZ2xlQ2xhc3MoIm1vdXNlZG93biIsITEpfSxzZXRWaXNpYmxlU2VyaWVzOmZ1bmN0aW9uKGgpe18uaXNFcXVhbCh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUsaCl8fCh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGU9aCl9LHNldFNlcmllc0RhdGE6ZnVuY3Rpb24oaCxrKXt0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbaF09azt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShoLGspfSxzZXRTZXJpZXNNZXRhZGF0YShoLGspe3RoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbaF09azt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0U2VyaWVzTWV0YWRhdGEoaCxrKX0scmVzZXREb21haW46ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQucmVzZXREb21haW4oKX0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJgp0aGlzLl9jaGFydC5yZWRyYXcoKX0sX21ha2VDaGFydDpmdW5jdGlvbihoLGssdCxsLHAsbSl7a3x8aD9rJiYoaD0oKT0+cmcuZ2V0WENvbXBvbmVudHMoaykpOmg9cmcuc3RlcFg7bnVsbCE9PXRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKSx0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbCk7dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbDtpZihoJiZ0aGlzLnlWYWx1ZUFjY2Vzc29yJiZ0aGlzLnRvb2x0aXBDb2x1bW5zKXt2YXIgbj1uZXcgYi5MaW5lQ2hhcnQoaCx0aGlzLnlWYWx1ZUFjY2Vzc29yLGwsbSx0aGlzLiQudG9vbHRpcCx0aGlzLnRvb2x0aXBDb2x1bW5zLHRoaXMuZmlsbEFyZWEsdGhpcy5kZWZhdWx0WFJhbmdlLHRoaXMuZGVmYXVsdFlSYW5nZSwKdGhpcy5zeW1ib2xGdW5jdGlvbix0aGlzLnhBeGlzRm9ybWF0dGVyKSxxPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnRkaXYpO24ucmVuZGVyVG8ocSk7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LmRlc3Ryb3koKTt0aGlzLl9jaGFydD1uO3RoaXMuX2NoYXJ0Lm9uQW5jaG9yKCgpPT50aGlzLmZpcmUoImNoYXJ0LWF0dGFjaGVkIikpfX0sMzUwKX0sX3JlbG9hZEZyb21DYWNoZTpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiYodGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZvckVhY2goaD0+e3RoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoaCx0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbaF18fFtdKX0pLHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5maWx0ZXIoaD0+dGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZVtoXSkuZm9yRWFjaChoPT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzTWV0YWRhdGEoaCx0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW2hdKX0pLHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlKSl9LApfc21vb3RoaW5nQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiYodGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuX2NoYXJ0LnNtb290aGluZ1VwZGF0ZSh0aGlzLnNtb290aGluZ1dlaWdodCk6dGhpcy5fY2hhcnQuc21vb3RoaW5nRGlzYWJsZSgpKX0sX291dGxpZXJzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5pZ25vcmVZT3V0bGllcnModGhpcy5pZ25vcmVZT3V0bGllcnMpfSxfdG9vbHRpcFNvcnRpbmdNZXRob2RDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFRvb2x0aXBTb3J0aW5nTWV0aG9kKHRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2QpfSxnZXRFeHBvcnRlcigpe3JldHVybiBuZXcgYi5MaW5lQ2hhcnRFeHBvcnRlcih0aGlzLiQuY2hhcnRkaXYpfX0pfSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Z6LWxpbmUtY2hhcnQyLmh0bWwuanMKUG9seW1lcih7aXM6InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCJ9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9saW5lLWNoYXJ0LWV4cG9ydGVyLmpzCihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oayl7ay5HUk9VUD0iRyI7ay5ESVY9IkRJViI7ay5TVkc9IlNWRyI7ay5URVhUPSJURVhUIn0pKGR8fChkPXt9KSk7Y2xhc3MgZntjb25zdHJ1Y3RvcihrKXt0aGlzLnVuaXF1ZUlkPTA7dGhpcy5yb290PWt9ZXhwb3J0QXNTdHJpbmcoKXtjb25zdCBrPXRoaXMuY29udmVydCh0aGlzLnJvb3QpO2lmKCFrKXJldHVybiIiO2NvbnN0IHQ9dGhpcy5jcmVhdGVSb290U3ZnKCk7dC5hcHBlbmRDaGlsZChrKTtyZXR1cm4gdC5vdXRlckhUTUx9Y3JlYXRlVW5pcXVlSWQoKXtyZXR1cm5gJHsiY2xpcCJ9XyR7dGhpcy51bmlxdWVJZCsrfWB9Z2V0U2l6ZSgpe3JldHVybiB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y3JlYXRlUm9vdFN2Zygpe2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3ZnIiksdD10aGlzLmdldFNpemUoKTtrLnNldEF0dHJpYnV0ZU5TKCJzdmciLCJ2aWV3Qm94IixgMCAwICR7dC53aWR0aH0gJHt0LmhlaWdodH1gKTsKay5zZXRBdHRyaWJ1dGUoInhtbG5zIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciKTtyZXR1cm4ga31jb252ZXJ0KGspe2xldCB0PW51bGw7dmFyIGw9ay5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO2lmKGsubm9kZVR5cGUhPU5vZGUuRUxFTUVOVF9OT0RFfHxsIT1kLkRJViYmbCE9ZC5TVkcpdD1rLmNsb25lTm9kZSgpO2Vsc2V7dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGQuR1JPVVApO3ZhciBwPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGspLG09cGFyc2VJbnQocC5sZWZ0LDEwKSxuPXBhcnNlSW50KHAudG9wLDEwKTtpZihtfHxuKWw9dGhpcy5jcmVhdGVVbmlxdWVJZCgpLHQuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLGB0cmFuc2xhdGUoJHttfSwgJHtufSlgKSx0LnNldEF0dHJpYnV0ZSgiY2xpcC1wYXRoIixgdXJsKCMke2x9KWApLG49cGFyc2VJbnQocC5oZWlnaHQsMTApLG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicmVjdCIpLG0uc2V0QXR0cmlidXRlKCJ3aWR0aCIsClN0cmluZyhwYXJzZUludChwLndpZHRoLDEwKSkpLG0uc2V0QXR0cmlidXRlKCJoZWlnaHQiLFN0cmluZyhuKSkscD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoInN2ZyIsImNsaXBQYXRoIikscC5pZD1sLHAuYXBwZW5kQ2hpbGQobSksdC5hcHBlbmRDaGlsZChwKX1BcnJheS5mcm9tKGsuY2hpbGROb2RlcykubWFwKHE9PnRoaXMuY29udmVydChxKSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2gocT0+dC5hcHBlbmRDaGlsZChxKSk7cmV0dXJuIHQubm9kZU5hbWUudG9VcHBlckNhc2UoKT09ZC5HUk9VUCYmIXQuaGFzQ2hpbGROb2RlcygpfHx0aGlzLnNob3VsZE9taXROb2RlKGspP251bGw6dGhpcy5zdHJpcENsYXNzKHRoaXMudHJhbnNmZXJTdHlsZShrLHQpKX1zdHJpcENsYXNzKGspe2subm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFJiZrLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTtyZXR1cm4ga310cmFuc2ZlclN0eWxlKGssdCl7aWYodC5ub2RlVHlwZSE9Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIHQ7CmNvbnN0IGw9dC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO2s9d2luZG93LmdldENvbXB1dGVkU3R5bGUoayk7bD09ZC5URVhUJiZPYmplY3QuYXNzaWduKHQuc3R5bGUse2ZvbnRGYW1pbHk6ay5mb250RmFtaWx5LGZvbnRTaXplOmsuZm9udFNpemUsZm9udFdlaWdodDprLmZvbnRXZWlnaHR9KTtsIT1kLkdST1VQJiYodC5zZXRBdHRyaWJ1dGUoImZpbGwiLGsuZmlsbCksdC5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsay5zdHJva2UpLHQuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLGsuc3Ryb2tlV2lkdGgpKTsiMSIhPWsub3BhY2l0eSYmdC5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLGsub3BhY2l0eSk7cmV0dXJuIHR9c2hvdWxkT21pdE5vZGUoKXtyZXR1cm4hMX19Yi5QbG90dGFibGVFeHBvcnRlcj1mO2NsYXNzIGggZXh0ZW5kcyBme3Nob3VsZE9taXROb2RlKGspe3JldHVybiBrLm5vZGVUeXBlPT1Ob2RlLkVMRU1FTlRfTk9ERT9rLmNsYXNzTGlzdC5jb250YWlucygic2NhdHRlci1wbG90Iik6CiExfX1iLkxpbmVDaGFydEV4cG9ydGVyPWh9KShHaHx8KEdoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYj1bXSxkPWZ1bmN0aW9uKCl7cmV0dXJuIF8udGhyb3R0bGUoZnVuY3Rpb24gaCgpe2lmKDAhPWIubGVuZ3RoKXt2YXIgaz1iLnNoaWZ0KCk7ay5hY3RpdmUmJihrLnJlZHJhdygpLGsuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSExKTt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoMCk7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShoKX19LDEwMCl9KCk7UG9seW1lcih7aXM6InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiLHByb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfZml4QmFkU3RhdGVXaGVuQWN0aXZlIn0sZGF0YVNlcmllczpBcnJheSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsbG9nU2NhbGVBY3RpdmU6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2xvZ1NjYWxlQ2hhbmdlZCJ9LHhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6T2JqZWN0LHhUeXBlOlN0cmluZyx5VmFsdWVBY2Nlc3NvcjpPYmplY3QsZmlsbEFyZWE6T2JqZWN0LApzbW9vdGhpbmdFbmFibGVkOkJvb2xlYW4sc21vb3RoaW5nV2VpZ2h0Ok51bWJlcix0b29sdGlwQ29sdW1uczpBcnJheSx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsdG9vbHRpcFBvc2l0aW9uOlN0cmluZyxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixkZWZhdWx0WFJhbmdlOkFycmF5LGRlZmF1bHRZUmFuZ2U6QXJyYXksc3ltYm9sRnVuY3Rpb246T2JqZWN0LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSl9LF9yZXNldERvbWFpbk9uTmV4dExvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sYmVoYXZpb3JzOltxZC5EYXRhTG9hZGVyQmVoYXZpb3JdLG9ic2VydmVyczpbIl9kYXRhU2VyaWVzQ2hhbmdlZChkYXRhU2VyaWVzLiopIiwiX2xvYWRLZXlDaGFuZ2VkKGxvYWRLZXkpIl0sb25Mb2FkRmluaXNoKCl7MDwKdGhpcy5kYXRhVG9Mb2FkLmxlbmd0aCYmdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkJiYodGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSExLHRoaXMuJC5jaGFydC5yZXNldERvbWFpbigpKTt0aGlzLnJlZHJhdygpfSxkZXRhY2hlZCgpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZil9LGV4cG9ydEFzU3ZnU3RyaW5nKCl7cmV0dXJuIHRoaXMuJC5jaGFydC5nZXRFeHBvcnRlcigpLmV4cG9ydEFzU3RyaW5nKCl9LHJlc2V0RG9tYWluKCl7dGhpcy4kLmNoYXJ0LnJlc2V0RG9tYWluKCl9LHNldFNlcmllc0RhdGEoZixoKXt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShmLGgpfSxzZXRTZXJpZXNNZXRhZGF0YShmLGgpe3RoaXMuJC5jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShmLGgpfSxyZWRyYXcoKXtjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpO3RoaXMuX3JlZHJhd1JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5hY3RpdmU/CnRoaXMuJC5jaGFydC5yZWRyYXcoKTp0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMH0pfSxfbG9hZEtleUNoYW5nZWQoKXt0aGlzLnJlc2V0KCk7dGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSEwfSxfZGF0YVNlcmllc0NoYW5nZWQoKXt0aGlzLiQuY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0aGlzLmRhdGFTZXJpZXMpfSxfbG9nU2NhbGVDaGFuZ2VkKGYpe3RoaXMuJC5jaGFydC55U2NhbGVUeXBlPWY/ImxvZyI6ImxpbmVhciI7dGhpcy5yZWRyYXcoKX0sX2ZpeEJhZFN0YXRlV2hlbkFjdGl2ZSgpe3RoaXMuYWN0aXZlJiZ0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZSYmKGIucHVzaCh0aGlzKSxkKCkpfSxfb25DaGFydEF0dGFjaGVkKCl7dGhpcy5hY3RpdmV8fCh0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMCl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRpYWxvZy1zY3JvbGxhYmxlL3BhcGVyLWRpYWxvZy1zY3JvbGxhYmxlLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlIixwcm9wZXJ0aWVzOntkaWFsb2dFbGVtZW50Ont0eXBlOk9iamVjdH19LGdldCBzY3JvbGxUYXJnZXQoKXtyZXR1cm4gdGhpcy4kLnNjcm9sbGFibGV9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGFyZ2V0KCk7dGhpcy5jbGFzc0xpc3QuYWRkKCJuby1wYWRkaW5nIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGFyZ2V0KCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMudXBkYXRlU2Nyb2xsU3RhdGUuYmluZCh0aGlzKSl9LHVwZGF0ZVNjcm9sbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDbGFzcygiaXMtc2Nyb2xsZWQiLDA8dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wKTt0aGlzLnRvZ2dsZUNsYXNzKCJjYW4tc2Nyb2xsIix0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQ8dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsSGVpZ2h0KTt0aGlzLnRvZ2dsZUNsYXNzKCJzY3JvbGxlZC10by1ib3R0b20iLAp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3ArdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0Pj10aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxIZWlnaHQpfSxfZW5zdXJlVGFyZ2V0OmZ1bmN0aW9uKCl7KHRoaXMuZGlhbG9nRWxlbWVudD10aGlzLmRpYWxvZ0VsZW1lbnR8fHRoaXMucGFyZW50RWxlbWVudCkmJnRoaXMuZGlhbG9nRWxlbWVudC5iZWhhdmlvcnMmJjA8PXRoaXMuZGlhbG9nRWxlbWVudC5iZWhhdmlvcnMuaW5kZXhPZihQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3JJbXBsKT8odGhpcy5kaWFsb2dFbGVtZW50LnNpemluZ1RhcmdldD10aGlzLnNjcm9sbFRhcmdldCx0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCJmaXQiKSk6dGhpcy5kaWFsb2dFbGVtZW50JiZ0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QuYWRkKCJmaXQiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1tYXJrZG93bi12aWV3L3RmLW1hcmtkb3duLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtbWFya2Rvd24tdmlldyIscHJvcGVydGllczp7aHRtbDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxhdHRhY2hlZCgpe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQubWFya2Rvd24sITApfSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2FyZC1oZWFkaW5nL3V0aWwuanMKdmFyIEhoOyhmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe2lmKCFmKXJldHVybiBudWxsO2xldCBoPWYubWF0Y2goL14jKFswLTlhLWZdezEsMn0pKFswLTlhLWZdezEsMn0pKFswLTlhLWZdezEsMn0pJC8pO2lmKCFoKXJldHVybiBudWxsO2lmKDQ9PWYubGVuZ3RoKWZvcihmPTE7Mz49ZjtmKyspaFtmXSs9aFtmXTtyZXR1cm5bcGFyc2VJbnQoaFsxXSwxNikscGFyc2VJbnQoaFsyXSwxNikscGFyc2VJbnQoaFszXSwxNildfWIuZm9ybWF0RGF0ZT1mdW5jdGlvbihmKXtyZXR1cm4gZj9mLnRvU3RyaW5nKCkucmVwbGFjZSgvR01ULVxkKyBcKChbXildKylcKS8sIiQxIik6IiJ9O2IucGlja1RleHRDb2xvcj1mdW5jdGlvbihmKXtyZXR1cm4oZj1kKGYpKT8xMjU8TWF0aC5yb3VuZCgoMjk5KmZbMF0rNTg3KmZbMV0rMTE0KmZbMl0pLzFFMyk/ImluaGVyaXQiOiIjZWVlIjoiaW5oZXJpdCJ9fSkoSGh8fChIaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNhcmQtaGVhZGluZy90Zi1jYXJkLWhlYWRpbmcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY2FyZC1oZWFkaW5nIixwcm9wZXJ0aWVzOntkaXNwbGF5TmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sdGFnOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxydW46e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGRlc2NyaXB0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxjb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3J1bkJhY2tncm91bmQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkJhY2tncm91bmQoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9LF9uYW1lTGFiZWw6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZU5hbWVMYWJlbChkaXNwbGF5TmFtZSwgdGFnKSJ9LF90YWdMYWJlbDp7dHlwZTpTdHJpbmcsCmNvbXB1dGVkOiJfY29tcHV0ZVRhZ0xhYmVsKGRpc3BsYXlOYW1lLCB0YWcpIn19LF91cGRhdGVIZWFkaW5nU3R5bGUoKXt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tdGYtY2FyZC1oZWFkaW5nLWJhY2tncm91bmQtY29sb3IiOnRoaXMuX3J1bkJhY2tncm91bmQsIi0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yIjp0aGlzLl9ydW5Db2xvcn0pfSxfY29tcHV0ZVJ1bkJhY2tncm91bmQoYil7cmV0dXJuIGJ8fCJub25lIn0sX2NvbXB1dGVSdW5Db2xvcihiKXtyZXR1cm4gSGgucGlja1RleHRDb2xvcihiKX0sX2NvbXB1dGVOYW1lTGFiZWwoYixkKXtyZXR1cm4gYnx8ZHx8IiJ9LF9jb21wdXRlVGFnTGFiZWwoYixkKXtyZXR1cm4gZCYmZCE9PWI/ZDoiIn0sX3RvZ2dsZURlc2NyaXB0aW9uRGlhbG9nKGIpe3RoaXMuJC5kZXNjcmlwdGlvbkRpYWxvZy5wb3NpdGlvblRhcmdldD1iLnRhcmdldDt0aGlzLiQuZGVzY3JpcHRpb25EaWFsb2cudG9nZ2xlKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1kb3dubG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRvd25sb2FkZXIiLHByb3BlcnRpZXM6e19ydW46e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxydW5zOkFycmF5LHRhZzpTdHJpbmcsdXJsRm46RnVuY3Rpb259LF9jc3ZVcmwoYixkLGYpe3JldHVybiBkP3ZjLmFkZFBhcmFtcyhmKGIsZCkse2Zvcm1hdDoiY3N2In0pOiIifSxfanNvblVybChiLGQsZil7cmV0dXJuIGQ/ZihiLGQpOiIifSxfY3N2TmFtZShiLGQpe3JldHVybiBkP2BydW4tJHtkfS10YWctJHtifS5jc3ZgOiIifSxfanNvbk5hbWUoYixkKXtyZXR1cm4gZD9gcnVuLSR7ZH0tdGFnLSR7Yn0uanNvbmA6IiJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zY2FsYXItY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zY2FsYXItY2FyZCIscHJvcGVydGllczp7dGFnOlN0cmluZyxkYXRhVG9Mb2FkOkFycmF5LHhUeXBlOlN0cmluZyxhY3RpdmU6Qm9vbGVhbixpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25MaW5rczpCb29sZWFuLHNtb290aGluZ0VuYWJsZWQ6Qm9vbGVhbixzbW9vdGhpbmdXZWlnaHQ6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsX2xvYWREYXRhQ2FsbGJhY2s6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGIsZCxmKT0+e2Y9Zi5tYXAoaz0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmtbMF0pLHN0ZXA6a1sxXSxzY2FsYXI6a1syXX0pKTtjb25zdCBoPXRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oZCk7Yi5zZXRTZXJpZXNNZXRhZGF0YShoLGQpO2Iuc2V0U2VyaWVzRGF0YShoLApmKX19LHJlYWRPbmx5OiEwfSxnZXREYXRhTG9hZFVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybih7dGFnOmIscnVuOmR9KT0+dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInNjYWxhcnMiLCIvc2NhbGFycyIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmIscnVuOmR9KSl9fSxfZG93bmxvYWRVcmxGbjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihiLGQpPT50aGlzLmdldERhdGFMb2FkVXJsKHt0YWc6YixydW46ZH0pfX0scmVxdWVzdERhdGE6RnVuY3Rpb24sX2dldERhdGFMb2FkTmFtZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGIpfX0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBiPQpHaC5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OUy5zbGljZSgpLGQ9Yi5maW5kSW5kZXgoZj0+Ik5hbWUiPT1mLnRpdGxlKTtiLnNwbGljZShkLDEse3RpdGxlOiJOYW1lIixldmFsdWF0ZTpmPT57Zj1mLmRhdGFzZXQubWV0YWRhdGEoKS5tZXRhO3JldHVybiB0aGlzLl9nZXRTZXJpZXNEaXNwbGF5TmFtZUZyb21EYXR1bShmKX19KTtyZXR1cm4gYn19fSxyZWxvYWQoKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwhdGhpcy5fbG9nU2NhbGVBY3RpdmUpfSxfcmVzZXREb21haW4oKXtjb25zdCBiPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKTsKYiYmYi5yZXNldERvbWFpbigpfSxfdXBkYXRlRG93bmxvYWRMaW5rKCl7Y29uc3QgYj10aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikuZXhwb3J0QXNTdmdTdHJpbmcoKTt0aGlzLiQkKCIjc3ZnTGluayIpLmhyZWY9YGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJHtidG9hKGIpfWB9LF9ydW5zRnJvbURhdGEoYil7cmV0dXJuIGIubWFwKGQ9PmQucnVuKX0sX2dldERhdGFTZXJpZXMoKXtyZXR1cm4gdGhpcy5kYXRhVG9Mb2FkLm1hcChiPT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGIpKX0sX2dldFNlcmllc05hbWVGcm9tRGF0dW0oe3J1bjpiLGV4cGVyaW1lbnQ6ZD17bmFtZToiX2RlZmF1bHQifX0pe3JldHVybiBKU09OLnN0cmluZ2lmeShbZC5uYW1lLGJdKX0sX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGIpe3JldHVybiBiLnJ1bn0sX2dldENvbG9yU2NhbGUoKXtyZXR1cm4gbnVsbCE9PXRoaXMuY29sb3JTY2FsZT90aGlzLmNvbG9yU2NhbGU6CntzY2FsZTpiPT57WyxiXT1KU09OLnBhcnNlKGIpO3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX19fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tcmFuZ2UtYmVoYXZpb3IvaXJvbi1yYW5nZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblJhbmdlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3ZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LG1pbjp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LG1heDp7dHlwZTpOdW1iZXIsdmFsdWU6MTAwLG5vdGlmeTohMH0sc3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MSxub3RpZnk6ITB9LHJhdGlvOnt0eXBlOk51bWJlcix2YWx1ZTowLHJlYWRPbmx5OiEwLG5vdGlmeTohMH19LG9ic2VydmVyczpbIl91cGRhdGUodmFsdWUsIG1pbiwgbWF4LCBzdGVwKSJdLF9jYWxjUmF0aW86ZnVuY3Rpb24oYil7cmV0dXJuKHRoaXMuX2NsYW1wVmFsdWUoYiktdGhpcy5taW4pLyh0aGlzLm1heC10aGlzLm1pbil9LF9jbGFtcFZhbHVlOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLm1pbih0aGlzLm1heCxNYXRoLm1heCh0aGlzLm1pbix0aGlzLl9jYWxjU3RlcChiKSkpfSxfY2FsY1N0ZXA6ZnVuY3Rpb24oYil7Yj1wYXJzZUZsb2F0KGIpOwppZighdGhpcy5zdGVwKXJldHVybiBiO2I9TWF0aC5yb3VuZCgoYi10aGlzLm1pbikvdGhpcy5zdGVwKTtyZXR1cm4gMT50aGlzLnN0ZXA/Yi8oMS90aGlzLnN0ZXApK3RoaXMubWluOmIqdGhpcy5zdGVwK3RoaXMubWlufSxfdmFsaWRhdGVWYWx1ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2NsYW1wVmFsdWUodGhpcy52YWx1ZSk7dGhpcy52YWx1ZT10aGlzLm9sZFZhbHVlPWlzTmFOKGIpP3RoaXMub2xkVmFsdWU6YjtyZXR1cm4gdGhpcy52YWx1ZSE9PWJ9LF91cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl92YWxpZGF0ZVZhbHVlKCk7dGhpcy5fc2V0UmF0aW8oMTAwKnRoaXMuX2NhbGNSYXRpbyh0aGlzLnZhbHVlKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1wcm9ncmVzcy9wYXBlci1wcm9ncmVzcy5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1wcm9ncmVzcyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SYW5nZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntzZWNvbmRhcnlQcm9ncmVzczp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sc2Vjb25kYXJ5UmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITB9LGluZGV0ZXJtaW5hdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3RvZ2dsZUluZGV0ZXJtaW5hdGUifSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxvYnNlcnZlcnM6WyJfcHJvZ3Jlc3NDaGFuZ2VkKHNlY29uZGFyeVByb2dyZXNzLCB2YWx1ZSwgbWluLCBtYXgsIGluZGV0ZXJtaW5hdGUpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InByb2dyZXNzYmFyIn0sX3RvZ2dsZUluZGV0ZXJtaW5hdGU6ZnVuY3Rpb24oYil7dGhpcy50b2dnbGVDbGFzcygiaW5kZXRlcm1pbmF0ZSIsCmIsdGhpcy4kLnByaW1hcnlQcm9ncmVzcyl9LF90cmFuc2Zvcm1Qcm9ncmVzczpmdW5jdGlvbihiLGQpe2Iuc3R5bGUudHJhbnNmb3JtPWIuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZVgoIitkLzEwMCsiKSJ9LF9tYWluUmF0aW9DaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsYil9LF9wcm9ncmVzc0NoYW5nZWQ6ZnVuY3Rpb24oYixkLGYsaCxrKXtiPXRoaXMuX2NsYW1wVmFsdWUoYik7ZD10aGlzLl9jbGFtcFZhbHVlKGQpO3ZhciB0PTEwMCp0aGlzLl9jYWxjUmF0aW8oYiksbD0xMDAqdGhpcy5fY2FsY1JhdGlvKGQpO3RoaXMuX3NldFNlY29uZGFyeVJhdGlvKHQpO3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5zZWNvbmRhcnlQcm9ncmVzcyx0KTt0aGlzLl90cmFuc2Zvcm1Qcm9ncmVzcyh0aGlzLiQucHJpbWFyeVByb2dyZXNzLGwpO3RoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3M9YjtrP3RoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLXZhbHVlbm93Iik6CnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbm93IixkKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1pbiIsZik7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVtYXgiLGgpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWRpc2FibGVkIixiPyJ0cnVlIjoiZmFsc2UiKX0sX2hpZGVTZWNvbmRhcnlQcm9ncmVzczpmdW5jdGlvbihiKXtyZXR1cm4gMD09PWJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItc2xpZGVyL3BhcGVyLXNsaWRlci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1zbGlkZXIiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcixQb2x5bWVyLklyb25SYW5nZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntzbmFwczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0scGluOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxzZWNvbmRhcnlQcm9ncmVzczp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWNvbmRhcnlQcm9ncmVzc0NoYW5nZWQifSxlZGl0YWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbW1lZGlhdGVWYWx1ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMCxub3RpZnk6ITB9LG1heE1hcmtlcnM6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxleHBhbmQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH0sCmlnbm9yZUJhclRvdWNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRyYWdnaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSx0cmFuc2l0aW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9LG1hcmtlcnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxvYnNlcnZlcnM6WyJfdXBkYXRlS25vYih2YWx1ZSwgbWluLCBtYXgsIHNuYXBzLCBzdGVwKSIsIl92YWx1ZUNoYW5nZWQodmFsdWUpIiwiX2ltbWVkaWF0ZVZhbHVlQ2hhbmdlZChpbW1lZGlhdGVWYWx1ZSkiLCJfdXBkYXRlTWFya2VycyhtYXhNYXJrZXJzLCBtaW4sIG1heCwgc25hcHMpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InNsaWRlciIsdGFiaW5kZXg6MH0sa2V5QmluZGluZ3M6e2xlZnQ6Il9sZWZ0S2V5IixyaWdodDoiX3JpZ2h0S2V5IiwiZG93biBwYWdlZG93biBob21lIjoiX2RlY3JlbWVudEtleSIsInVwIHBhZ2V1cCBlbmQiOiJfaW5jcmVtZW50S2V5In0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5pZ25vcmVCYXJUb3VjaCYmUG9seW1lci5HZXN0dXJlcy5zZXRUb3VjaEFjdGlvbih0aGlzLiQuc2xpZGVyQmFyLCJhdXRvIil9LGluY3JlbWVudDpmdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlK3RoaXMuc3RlcCl9LGRlY3JlbWVudDpmdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlLXRoaXMuc3RlcCl9LF91cGRhdGVLbm9iOmZ1bmN0aW9uKGIsZCxmKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1pbiIsZCk7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVtYXgiLGYpO3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbm93IixiKTt0aGlzLl9wb3NpdGlvbktub2IoMTAwKnRoaXMuX2NhbGNSYXRpbyhiKSl9LF92YWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoInZhbHVlLWNoYW5nZSIse2NvbXBvc2VkOiEwfSl9LF9pbW1lZGlhdGVWYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRyYWdnaW5nPwp0aGlzLmZpcmUoImltbWVkaWF0ZS12YWx1ZS1jaGFuZ2UiLHtjb21wb3NlZDohMH0pOnRoaXMudmFsdWU9dGhpcy5pbW1lZGlhdGVWYWx1ZX0sX3NlY29uZGFyeVByb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3M9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnNlY29uZGFyeVByb2dyZXNzKX0sX2V4cGFuZEtub2I6ZnVuY3Rpb24oKXt0aGlzLl9zZXRFeHBhbmQoITApfSxfcmVzZXRLbm9iOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoImV4cGFuZEtub2IiKTt0aGlzLl9zZXRFeHBhbmQoITEpfSxfcG9zaXRpb25Lbm9iOmZ1bmN0aW9uKGIpe3RoaXMuX3NldEltbWVkaWF0ZVZhbHVlKHRoaXMuX2NhbGNTdGVwKHRoaXMuX2NhbGNLbm9iUG9zaXRpb24oYikpKTt0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMuaW1tZWRpYXRlVmFsdWUpKTt0aGlzLiQuc2xpZGVyS25vYi5zdHlsZS5sZWZ0PXRoaXMucmF0aW8rIiUiO3RoaXMuZHJhZ2dpbmcmJgoodGhpcy5fa25vYnN0YXJ0eD10aGlzLnJhdGlvKnRoaXMuX3cvMTAwLHRoaXMudHJhbnNsYXRlM2QoMCwwLDAsdGhpcy4kLnNsaWRlcktub2IpKX0sX2NhbGNLbm9iUG9zaXRpb246ZnVuY3Rpb24oYil7cmV0dXJuKHRoaXMubWF4LXRoaXMubWluKSpiLzEwMCt0aGlzLm1pbn0sX29uVHJhY2s6ZnVuY3Rpb24oYil7Yi5zdG9wUHJvcGFnYXRpb24oKTtzd2l0Y2goYi5kZXRhaWwuc3RhdGUpe2Nhc2UgInN0YXJ0Ijp0aGlzLl90cmFja1N0YXJ0KGIpO2JyZWFrO2Nhc2UgInRyYWNrIjp0aGlzLl90cmFja1goYik7YnJlYWs7Y2FzZSAiZW5kIjp0aGlzLl90cmFja0VuZCgpfX0sX3RyYWNrU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9zZXRUcmFuc2l0aW5nKCExKTt0aGlzLl93PXRoaXMuJC5zbGlkZXJCYXIub2Zmc2V0V2lkdGg7dGhpcy5fa25vYnN0YXJ0eD10aGlzLl9zdGFydHg9dGhpcy5feD10aGlzLnJhdGlvKnRoaXMuX3cvMTAwO3RoaXMuX21pbng9LXRoaXMuX3N0YXJ0eDt0aGlzLl9tYXh4PQp0aGlzLl93LXRoaXMuX3N0YXJ0eDt0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QuYWRkKCJkcmFnZ2luZyIpO3RoaXMuX3NldERyYWdnaW5nKCEwKX0sX3RyYWNrWDpmdW5jdGlvbihiKXt0aGlzLmRyYWdnaW5nfHx0aGlzLl90cmFja1N0YXJ0KGIpO3RoaXMuX3g9dGhpcy5fc3RhcnR4K01hdGgubWluKHRoaXMuX21heHgsTWF0aC5tYXgodGhpcy5fbWlueCxiLmRldGFpbC5keCoodGhpcy5faXNSVEw/LTE6MSkpKTt0aGlzLl9zZXRJbW1lZGlhdGVWYWx1ZSh0aGlzLl9jYWxjU3RlcCh0aGlzLl9jYWxjS25vYlBvc2l0aW9uKHRoaXMuX3gvdGhpcy5fdyoxMDApKSk7dGhpcy50cmFuc2xhdGUzZCh0aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkqdGhpcy5fdy10aGlzLl9rbm9ic3RhcnR4KyJweCIsMCwwLHRoaXMuJC5zbGlkZXJLbm9iKX0sX3RyYWNrRW5kOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy4kLnNsaWRlcktub2Iuc3R5bGU7dGhpcy4kLnNsaWRlcktub2IuY2xhc3NMaXN0LnJlbW92ZSgiZHJhZ2dpbmciKTsKdGhpcy5fc2V0RHJhZ2dpbmcoITEpO3RoaXMuX3Jlc2V0S25vYigpO3RoaXMudmFsdWU9dGhpcy5pbW1lZGlhdGVWYWx1ZTtiLnRyYW5zZm9ybT1iLndlYmtpdFRyYW5zZm9ybT0iIjt0aGlzLmZpcmUoImNoYW5nZSIse2NvbXBvc2VkOiEwfSl9LF9rbm9iZG93bjpmdW5jdGlvbihiKXt0aGlzLl9leHBhbmRLbm9iKCk7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuZm9jdXMoKX0sX2JhcnRyYWNrOmZ1bmN0aW9uKGIpe3RoaXMuX2FsbG93QmFyRXZlbnQoYikmJnRoaXMuX29uVHJhY2soYil9LF9iYXJjbGljazpmdW5jdGlvbihiKXt0aGlzLl93PXRoaXMuJC5zbGlkZXJCYXIub2Zmc2V0V2lkdGg7dmFyIGQ9dGhpcy4kLnNsaWRlckJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtkPShiLmRldGFpbC54LWQubGVmdCkvdGhpcy5fdyoxMDA7dGhpcy5faXNSVEwmJihkPTEwMC1kKTt2YXIgZj10aGlzLnJhdGlvO3RoaXMuX3NldFRyYW5zaXRpbmcoITApO3RoaXMuX3Bvc2l0aW9uS25vYihkKTsKZj09PXRoaXMucmF0aW8mJnRoaXMuX3NldFRyYW5zaXRpbmcoITEpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmZpcmUoImNoYW5nZSIse2NvbXBvc2VkOiEwfSl9KTtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5mb2N1cygpfSxfYmFyZG93bjpmdW5jdGlvbihiKXt0aGlzLl9hbGxvd0JhckV2ZW50KGIpJiYodGhpcy5kZWJvdW5jZSgiZXhwYW5kS25vYiIsdGhpcy5fZXhwYW5kS25vYiw2MCksdGhpcy5fYmFyY2xpY2soYikpfSxfa25vYlRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oYil7Yi50YXJnZXQ9PT10aGlzLiQuc2xpZGVyS25vYiYmdGhpcy5fc2V0VHJhbnNpdGluZyghMSl9LF91cGRhdGVNYXJrZXJzOmZ1bmN0aW9uKGIsZCxmLGgpe2h8fHRoaXMuX3NldE1hcmtlcnMoW10pO2Q9TWF0aC5yb3VuZCgoZi1kKS90aGlzLnN0ZXApO2Q+YiYmKGQ9Yik7aWYoMD5kfHwhaXNGaW5pdGUoZCkpZD0wO3RoaXMuX3NldE1hcmtlcnMoQXJyYXkoZCkpfSxfbWVyZ2VDbGFzc2VzOmZ1bmN0aW9uKGIpe3JldHVybiBPYmplY3Qua2V5cyhiKS5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIGJbZF19KS5qb2luKCIgIil9LApfZ2V0Q2xhc3NOYW1lczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tZXJnZUNsYXNzZXMoe2Rpc2FibGVkOnRoaXMuZGlzYWJsZWQscGluOnRoaXMucGluLHNuYXBzOnRoaXMuc25hcHMscmluZzp0aGlzLmltbWVkaWF0ZVZhbHVlPD10aGlzLm1pbixleHBhbmQ6dGhpcy5leHBhbmQsZHJhZ2dpbmc6dGhpcy5kcmFnZ2luZyx0cmFuc2l0aW5nOnRoaXMudHJhbnNpdGluZyxlZGl0YWJsZTp0aGlzLmVkaXRhYmxlfSl9LF9hbGxvd0JhckV2ZW50OmZ1bmN0aW9uKGIpe3JldHVybiF0aGlzLmlnbm9yZUJhclRvdWNofHxiLmRldGFpbC5zb3VyY2VFdmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnR9LGdldCBfaXNSVEwoKXt2b2lkIDA9PT10aGlzLl9faXNSVEwmJih0aGlzLl9faXNSVEw9InJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb24pO3JldHVybiB0aGlzLl9faXNSVEx9LF9sZWZ0S2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2lzUlRMP3RoaXMuX2luY3JlbWVudEtleShiKToKdGhpcy5fZGVjcmVtZW50S2V5KGIpfSxfcmlnaHRLZXk6ZnVuY3Rpb24oYil7dGhpcy5faXNSVEw/dGhpcy5fZGVjcmVtZW50S2V5KGIpOnRoaXMuX2luY3JlbWVudEtleShiKX0sX2luY3JlbWVudEtleTpmdW5jdGlvbihiKXt0aGlzLmRpc2FibGVkfHwoImVuZCI9PT1iLmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1heDp0aGlzLmluY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksYi5wcmV2ZW50RGVmYXVsdCgpKX0sX2RlY3JlbWVudEtleTpmdW5jdGlvbihiKXt0aGlzLmRpc2FibGVkfHwoImhvbWUiPT09Yi5kZXRhaWwua2V5P3RoaXMudmFsdWU9dGhpcy5taW46dGhpcy5kZWNyZW1lbnQoKSx0aGlzLmZpcmUoImNoYW5nZSIpLGIucHJldmVudERlZmF1bHQoKSl9LF9jaGFuZ2VWYWx1ZTpmdW5jdGlvbihiKXt0aGlzLnZhbHVlPWIudGFyZ2V0LnZhbHVlO3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2lucHV0S2V5RG93bjpmdW5jdGlvbihiKXtiLnN0b3BQcm9wYWdhdGlvbigpfSwKX2NyZWF0ZVJpcHBsZTpmdW5jdGlvbigpe3RoaXMuX3JpcHBsZUNvbnRhaW5lcj10aGlzLiQuc2xpZGVyS25vYjtyZXR1cm4gUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbC5fY3JlYXRlUmlwcGxlLmNhbGwodGhpcyl9LF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbihiKXtiJiZ0aGlzLmVuc3VyZVJpcHBsZSgpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuc3R5bGUuZGlzcGxheT1iPyIiOiJub25lIix0aGlzLl9yaXBwbGUuaG9sZERvd249Yil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zbW9vdGhpbmctaW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc21vb3RoaW5nLWlucHV0Iixwcm9wZXJ0aWVzOntzdGVwOk51bWJlcixtYXg6TnVtYmVyLG1pbjpOdW1iZXIsd2VpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTouNixub3RpZnk6ITB9LF9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcjp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLG9ic2VydmVyOiJfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXJDaGFuZ2VkIn0sX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLG9ic2VydmVyOiJfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Q2hhbmdlZCJ9fSxfdXBkYXRlV2VpZ2h0Ol8uZGVib3VuY2UoZnVuY3Rpb24oYil7dGhpcy53ZWlnaHQ9Yn0sMjUwKSxfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXJDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PXRoaXMuX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyLnRvU3RyaW5nKCk7CnRoaXMuX3VwZGF0ZVdlaWdodC5jYWxsKHRoaXMsdGhpcy5faW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIpfSxfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Q2hhbmdlZDpmdW5jdGlvbigpezA+K3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD90aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9IjAiOjE8K3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dCYmKHRoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD0iMSIpO3ZhciBiPSt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ7aXNOYU4oYil8fHRoaXMuX3VwZGF0ZVdlaWdodC5jYWxsKHRoaXMsYil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zY2FsYXItZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNjYWxhci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19zaG93RG93bmxvYWRMaW5rczp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXIifSxfc21vb3RoaW5nV2VpZ2h0Ont0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6cGQuZ2V0TnVtYmVySW5pdGlhbGl6ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxvYnNlcnZlcjoiX3Ntb290aGluZ1dlaWdodE9ic2VydmVyIn0sX3Ntb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKF9zbW9vdGhpbmdXZWlnaHQpIn0sX2lnbm9yZVlPdXRsaWVyczp7dHlwZTpCb29sZWFuLHZhbHVlOnBkLmdldEJvb2xlYW5Jbml0aWFsaXplcigiX2lnbm9yZVlPdXRsaWVycyIsCntkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9pZ25vcmVZT3V0bGllcnNPYnNlcnZlciJ9LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6cmcuWFR5cGUuU1RFUH0sX3NlbGVjdGVkUnVuczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX2dldENhdGVnb3J5SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Yj0+Yi50YWd9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcig1MCl9fSxiZWhhdmlvcnM6W3FkLkFycmF5VXBkYXRlSGVscGVyXSxvYnNlcnZlcnM6WyJfdXBkYXRlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJdLApfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcjpwZC5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXI6cGQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI6cGQuZ2V0Qm9vbGVhbk9ic2VydmVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChiKXtyZXR1cm4gMDxifSxfZ2V0Q2F0ZWdvcnlLZXkoYil7cmV0dXJuIGIubWV0YWRhdGEudHlwZT09JGMuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTPyIiOmIubmFtZX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+Cnt0aGlzLl9yZWxvYWRDaGFydHMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgic2NhbGFycyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57aWYoIV8uaXNFcXVhbChkLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBmPV8ubWFwVmFsdWVzKGQsaD0+T2JqZWN0LmtleXMoaCkpO2Y9dmMuZ2V0VGFncyhmKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZENoYXJ0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3VwZGF0ZUNhdGVnb3JpZXMoYixkLGYpe2I9Xy5tYXBWYWx1ZXMoYixoPT5PYmplY3Qua2V5cyhoKSk7CmQ9JGMuY2F0ZWdvcml6ZVRhZ3MoYixkLGYpO2QuZm9yRWFjaChoPT57aC5pdGVtcz1oLml0ZW1zLm1hcChrPT4oe3RhZzprLnRhZyxzZXJpZXM6ay5ydW5zLm1hcCh0PT4oe3J1bjp0LHRhZzprLnRhZ30pKX0pKX0pO3RoaXMudXBkYXRlQXJyYXlQcm9wKCJfY2F0ZWdvcmllcyIsZCx0aGlzLl9nZXRDYXRlZ29yeUtleSl9LF90YWdNZXRhZGF0YShiLGQsZil7Y29uc3QgaD1mLnRhZyxrPXt9O2Yuc2VyaWVzLmZvckVhY2goKHtydW46cH0pPT57a1twXT1kW3BdW2hdfSk7Zj1oLnJlcGxhY2UoL1wvc2NhbGFyX3N1bW1hcnkkLywiIik7bGV0IHtkZXNjcmlwdGlvbjp0LGRpc3BsYXlOYW1lOmx9PXJmLmFnZ3JlZ2F0ZVRhZ0luZm8oayxmKTtiLm1ldGFkYXRhLnR5cGU9PSRjLkNhdGVnb3J5VHlwZS5QUkVGSVhfR1JPVVAmJmwuc3RhcnRzV2l0aChiLm5hbWUrIi8iKSYmKGw9bC5zbGljZShiLm5hbWUubGVuZ3RoKzEpKTtyZXR1cm57ZGVzY3JpcHRpb246dCxkaXNwbGF5TmFtZTpsfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC90Zi1jdXN0b20tc2NhbGFyLWhlbHBlcnMuanMKdmFyIFRpOwooZnVuY3Rpb24oYil7Y2xhc3MgZHtjb25zdHJ1Y3RvcihoLGssdCxsLHApe3RoaXMucnVuPWg7dGhpcy50YWc9azt0aGlzLm5hbWU9dDt0aGlzLnNjYWxhckRhdGE9bDt0aGlzLnN5bWJvbD1wfWdldE5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lfXNldERhdGEoaCl7dGhpcy5zY2FsYXJEYXRhPWh9Z2V0RGF0YSgpe3JldHVybiB0aGlzLnNjYWxhckRhdGF9Z2V0UnVuKCl7cmV0dXJuIHRoaXMucnVufWdldFRhZygpe3JldHVybiB0aGlzLnRhZ31nZXRTeW1ib2woKXtyZXR1cm4gdGhpcy5zeW1ib2x9fWIuRGF0YVNlcmllcz1kO2IuZ2VuZXJhdGVEYXRhU2VyaWVzTmFtZT1mdW5jdGlvbihoLGspe3JldHVybmAke2t9ICgke2h9KWB9O2NsYXNzIGZ7Y29uc3RydWN0b3IoaCl7dGhpcy5ydW5CYXNlZENvbG9yU2NhbGU9aH1zY2FsZShoKXtyZXR1cm4gdGhpcy5ydW5CYXNlZENvbG9yU2NhbGUuc2NhbGUodGhpcy5wYXJzZVJ1bk5hbWUoaCkpfXBhcnNlUnVuTmFtZShoKXtyZXR1cm4oaD1oLm1hdGNoKC9cKCguKilcKSQvKSk/CmhbMV06IiJ9fWIuRGF0YVNlcmllc0NvbG9yU2NhbGU9Zn0pKFRpfHwoVGk9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC90Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXkseFR5cGU6U3RyaW5nLGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSx0aXRsZTpTdHJpbmcsbWFyZ2luQ2hhcnRTZXJpZXM6QXJyYXksaWdub3JlWU91dGxpZXJzOkJvb2xlYW4scmVxdWVzdE1hbmFnZXI6T2JqZWN0LHNob3dEb3dubG9hZExpbmtzOkJvb2xlYW4sdGFnTWV0YWRhdGE6T2JqZWN0LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6bmV3IFRpLkRhdGFTZXJpZXNDb2xvclNjYWxlKHtzY2FsZTpwZi5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIobWFyZ2luQ2hhcnRTZXJpZXMpIn0sX3RhZ0ZpbHRlckludmFsaWQ6Qm9vbGVhbixfbmFtZVRvRGF0YVNlcmllczp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT4oe30pfSxfc2VyaWVzTmFtZXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVNlcmllc05hbWVzKF9uYW1lVG9EYXRhU2VyaWVzLCBydW5zKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2xvZ1NjYWxlQWN0aXZlOkJvb2xlYW4sX2RhdGFVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYj0+e2NvbnN0IGQ9dGhpcy5fdGFnRmlsdGVyO3JldHVybiB2Yy5hZGRQYXJhbXModmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL3NjYWxhcnMiKSx7dGFnOmQscnVuOmJ9KX19fSxfcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfbWF0Y2hlc0xpc3RPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3RpdGxlRGlzcGxheVN0cmluZzp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKHRpdGxlKSJ9LApfZmlsbEFyZWE6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOntsb3dlckFjY2Vzc29yOmI9PmIubG93ZXIsaGlnaGVyQWNjZXNzb3I6Yj0+Yi51cHBlcn19LF90b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe2NvbnN0IGI9cmcubXVsdGlzY2FsZUZvcm1hdHRlcihyZy5ZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTiksZD1mPT5pc05hTihmKT8iTmFOIjpiKGYpO3JldHVyblt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmY9PmYuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV9LHt0aXRsZToiVmFsdWUiLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS5zY2FsYXIpfSx7dGl0bGU6Ikxvd2VyIE1hcmdpbiIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLmxvd2VyKX0se3RpdGxlOiJVcHBlciBNYXJnaW4iLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS51cHBlcil9LHt0aXRsZToiU3RlcCIsZXZhbHVhdGU6Zj0+cmcuc3RlcEZvcm1hdHRlcihmLmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLApldmFsdWF0ZTpmPT5yZy50aW1lRm9ybWF0dGVyKGYuZGF0dW0ud2FsbF90aW1lKX0se3RpdGxlOiJSZWxhdGl2ZSIsZXZhbHVhdGU6Zj0+cmcucmVsYXRpdmVGb3JtYXR0ZXIocmcucmVsYXRpdmVBY2Nlc3NvcihmLmRhdHVtLC0xLGYuZGF0YXNldCkpfV19fSxfbWlzc2luZ1RhZ3M6e3R5cGU6QXJyYXksdmFsdWU6W119LF9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zdGVwc01pc21hdGNoOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZUNoYXJ0KF9uYW1lVG9EYXRhU2VyaWVzKSIsIl9yZWZyZXNoRGF0YVNlcmllcyhfdGFnRmlsdGVyKSJdLHJlbG9hZCgpe3RoaXMuJC5sb2FkZXIucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJC5sb2FkZXIucmVkcmF3KCl9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX0sX3RvZ2dsZUxvZ1NjYWxlKCl7dGhpcy5zZXQoIl9sb2dTY2FsZUFjdGl2ZSIsCiF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9LF9yZXNldERvbWFpbigpe2NvbnN0IGI9dGhpcy4kLmxvYWRlcjtiJiZiLnJlc2V0RG9tYWluKCl9LF9jc3ZVcmwoYixkKXtpZighZClyZXR1cm4iIjtiPXRoaXMuX2Rvd25sb2FkRGF0YVVybChiLGQpO3JldHVybiB2Yy5hZGRQYXJhbXMoYix7Zm9ybWF0OiJjc3YifSl9LF9qc29uVXJsKGIsZCl7aWYoIWQpcmV0dXJuIiI7Yj10aGlzLl9kb3dubG9hZERhdGFVcmwoYixkKTtyZXR1cm4gdmMuYWRkUGFyYW1zKGIse2Zvcm1hdDoianNvbiJ9KX0sX2Rvd25sb2FkRGF0YVVybChiLGQpe2I9YltkXTtiPXt0YWc6Yi5nZXRUYWcoKSxydW46Yi5nZXRSdW4oKX07cmV0dXJuIHZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvZG93bmxvYWRfZGF0YSIpLGIpfSxfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbihiKXtyZXR1cm4oZCxmLGgpPT57aWYoaC5yZWdleF92YWxpZCl7dmFyIGs9Xy5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKSwKdD1bXTtfLmZvckVhY2goYixsPT57dmFyIHA9ITEsbT1oLnRhZ190b19ldmVudHNbbC52YWx1ZV07Y29uc3Qgbj1oLnRhZ190b19ldmVudHNbbC5sb3dlcl0scT1oLnRhZ190b19ldmVudHNbbC51cHBlcl07Xy5pc1VuZGVmaW5lZChtKSYmKHQucHVzaChsLnZhbHVlKSxwPSEwKTtfLmlzVW5kZWZpbmVkKG4pJiYodC5wdXNoKGwubG93ZXIpLHA9ITApO18uaXNVbmRlZmluZWQocSkmJih0LnB1c2gobC51cHBlcikscD0hMCk7aWYoIXApe3ZhciB1PXk9PnlbMV07aWYocD10aGlzLl9maW5kU3RlcE1pc21hdGNoKGwsbS5tYXAodSksbi5tYXAodSkscS5tYXAodSkpKXRoaXMuc2V0KCJfc3RlcHNNaXNtYXRjaCIscCk7ZWxzZXt2YXIgeD15PT55WzJdO3A9bS5tYXAoKHksdyk9Pih7d2FsbF90aW1lOm5ldyBEYXRlKDFFMyp5WzBdKSxzdGVwOnUoeSksc2NhbGFyOngoeSksbG93ZXI6eChuW3ddKSx1cHBlcjp4KHFbd10pfSkpO209VGkuZ2VuZXJhdGVEYXRhU2VyaWVzTmFtZShmLGwudmFsdWUpOwp2YXIgQT1rW21dO0E/QS5zZXREYXRhKHApOihsPXRoaXMuX2NyZWF0ZU5ld0RhdGFTZXJpZXMoZixsLnZhbHVlLG0scCksa1ttXT1sKX19fSk7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIixrKTtkPV8uZmluZEluZGV4KHRoaXMuX21pc3NpbmdUYWdzLGw9PmwucnVuPT09Zik7aWYodC5sZW5ndGgmJjMhPXQubGVuZ3RoKXtjb25zdCBsPXtydW46Zix0YWdzOnR9OzA8PWQ/dGhpcy5zcGxpY2UoIl9taXNzaW5nVGFncyIsZCwxLGwpOnRoaXMucHVzaCgiX21pc3NpbmdUYWdzIixsKX1lbHNlIDA8PWQmJnRoaXMuc3BsaWNlKCJfbWlzc2luZ1RhZ3MiLGQsMSl9ZWxzZSB0aGlzLnNldCgiX3RhZ0ZpbHRlckludmFsaWQiLCEwKX19LF9maW5kU3RlcE1pc21hdGNoKGIsZCxmLGgpe3JldHVybiBfLmlzRXF1YWwoZixkKSYmXy5pc0VxdWFsKGgsZCk/bnVsbDp7c2VyaWVzT2JqZWN0OmIsdmFsdWVTdGVwczpkLGxvd2VyU3RlcHM6Zix1cHBlclN0ZXBzOmh9fSxfY3JlYXRlTmV3RGF0YVNlcmllcyhiLApkLGYsaCl7dGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbYl18PTA7ZD1uZXcgVGkuRGF0YVNlcmllcyhiLGQsZixoLHJnLlNZTUJPTFNfTElTVFt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtiXV0pO3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2JdPSh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtiXSsxKSVyZy5TWU1CT0xTX0xJU1QubGVuZ3RoO3JldHVybiBkfSxfdXBkYXRlQ2hhcnQoYil7Xy5mb3JPd24oYixkPT57dGhpcy4kLmxvYWRlci5zZXRTZXJpZXNEYXRhKGQuZ2V0TmFtZSgpLGQuZ2V0RGF0YSgpKX0pfSxfY29tcHV0ZVNlcmllc05hbWVzKCl7Y29uc3QgYj1uZXcgU2V0KHRoaXMucnVucyk7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLmZpbHRlcigoWyxkXSk9PmIuaGFzKGQucnVuKSkubWFwKChbZF0pPT5kKX0sX2RldGVybWluZUNvbG9yKGIsZCl7cmV0dXJuIGIuc2NhbGUoZCl9LApfcmVmcmVzaERhdGFTZXJpZXMoKXt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLHt9KX0sX2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCl7cmV0dXJuIGI9PnRoaXMuX25hbWVUb0RhdGFTZXJpZXNbYl0uZ2V0U3ltYm9sKCkubWV0aG9kKCl9LF9kZXRlcm1pbmVTeW1ib2woYixkKXtyZXR1cm4gYltkXS5nZXRTeW1ib2woKS5jaGFyYWN0ZXJ9LF9jb21wdXRlVGFnRmlsdGVyKGIpe3JldHVybiBfLmZsYXR0ZW4oYi5tYXAoZD0+W2QudmFsdWUsZC5sb3dlcixkLnVwcGVyXSkpLm1hcChkPT4iKCIrdGhpcy5fZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKGQpKyIpIikuam9pbigifCIpfSxfZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKGIpe3JldHVybiBiLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCJcXCRceDI2Iil9LF9nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24oYil7cmV0dXJuIGI/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfdG9nZ2xlTWF0Y2hlc09wZW4oKXt0aGlzLnNldCgiX21hdGNoZXNMaXN0T3BlbmVkIiwKIXRoaXMuX21hdGNoZXNMaXN0T3BlbmVkKX0sX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcoYil7cmV0dXJuIGJ8fCJ1bnRpdGxlZCJ9LF9zZXBhcmF0ZVdpdGhDb21tYXMoYil7cmV0dXJuIGIuam9pbigiLCAiKX0sX3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuKCl7dGhpcy5zZXQoIl9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkIiwhdGhpcy5fbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCl9LF9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCgpe2NvbnN0IGI9dGhpcy4kJCgiI21hdGNoLWxpc3QtcmVwZWF0Iik7YiYmdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tYXRjaC1saXN0LWVudHJ5IikuZm9yRWFjaChkPT57Y29uc3QgZj1iLml0ZW1Gb3JFbGVtZW50KGQpO2Quc3R5bGUuY29sb3I9dGhpcy5fZGV0ZXJtaW5lQ29sb3IodGhpcy5fY29sb3JTY2FsZSxmKX0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHhUeXBlOlN0cmluZyxhY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMH0sdGl0bGU6U3RyaW5nLHRhZ1JlZ2V4ZXM6QXJyYXksaWdub3JlWU91dGxpZXJzOkJvb2xlYW4scmVxdWVzdE1hbmFnZXI6T2JqZWN0LHNob3dEb3dubG9hZExpbmtzOkJvb2xlYW4sc21vb3RoaW5nRW5hYmxlZDpCb29sZWFuLHNtb290aGluZ1dlaWdodDpOdW1iZXIsdGFnTWV0YWRhdGE6T2JqZWN0LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6bmV3IFRpLkRhdGFTZXJpZXNDb2xvclNjYWxlKHtzY2FsZTpwZi5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIodGFnUmVnZXhlcykifSxfbmFtZVRvRGF0YVNlcmllczp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT4oe30pfSxfc2VyaWVzTmFtZXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVNlcmllc05hbWVzKF9uYW1lVG9EYXRhU2VyaWVzLCBydW5zKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2xvZ1NjYWxlQWN0aXZlOkJvb2xlYW4sX2RhdGFVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYj0+e2NvbnN0IGQ9dGhpcy5fdGFnRmlsdGVyO3JldHVybiB2Yy5hZGRQYXJhbXModmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL3NjYWxhcnMiKSx7dGFnOmQscnVuOmJ9KX19fSxfcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfbWF0Y2hlc0xpc3RPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3RpdGxlRGlzcGxheVN0cmluZzp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKHRpdGxlKSJ9fSwKb2JzZXJ2ZXJzOlsiX3VwZGF0ZUNoYXJ0KF9uYW1lVG9EYXRhU2VyaWVzKSIsIl9yZWZyZXNoRGF0YVNlcmllcyhfdGFnRmlsdGVyKSJdLHJlbG9hZCgpe3RoaXMuJC5sb2FkZXIucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJC5sb2FkZXIucmVkcmF3KCl9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX0sX3RvZ2dsZUxvZ1NjYWxlKCl7dGhpcy5zZXQoIl9sb2dTY2FsZUFjdGl2ZSIsIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKX0sX3Jlc2V0RG9tYWluKCl7Y29uc3QgYj10aGlzLiQubG9hZGVyO2ImJmIucmVzZXREb21haW4oKX0sX2NzdlVybChiLGQpe2lmKCFkKXJldHVybiIiO2I9dGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCk7cmV0dXJuIHZjLmFkZFBhcmFtcyhiLHtmb3JtYXQ6ImNzdiJ9KX0sX2pzb25VcmwoYixkKXtpZighZClyZXR1cm4iIjtiPXRoaXMuX2Rvd25sb2FkRGF0YVVybChiLGQpO3JldHVybiB2Yy5hZGRQYXJhbXMoYiwKe2Zvcm1hdDoianNvbiJ9KX0sX2Rvd25sb2FkRGF0YVVybChiLGQpe2I9YltkXTtiPXt0YWc6Yi5nZXRUYWcoKSxydW46Yi5nZXRSdW4oKX07cmV0dXJuIHZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvZG93bmxvYWRfZGF0YSIpLGIpfSxfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpe3JldHVybihiLGQsZik9PntpZihmLnJlZ2V4X3ZhbGlkKXtjb25zdCBoPV8uY2xvbmUodGhpcy5fbmFtZVRvRGF0YVNlcmllcyk7Xy5mb3JPd24oZi50YWdfdG9fZXZlbnRzLChrLHQpPT57Y29uc3QgbD1rLm1hcChtPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqbVswXSksc3RlcDptWzFdLHNjYWxhcjptWzJdfSkpO2s9VGkuZ2VuZXJhdGVEYXRhU2VyaWVzTmFtZShkLHQpO2NvbnN0IHA9aFtrXTtwP3Auc2V0RGF0YShsKTooXy5pc1VuZGVmaW5lZCh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtkXSkmJih0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtkXT0KMCksdD1uZXcgVGkuRGF0YVNlcmllcyhkLHQsayxsLHJnLlNZTUJPTFNfTElTVFt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtkXV0pLGhba109dCx0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtkXT0odGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZF0rMSklcmcuU1lNQk9MU19MSVNULmxlbmd0aCl9KTt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLGgpfX19LF91cGRhdGVDaGFydChiKXtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbZCxmXSk9Pnt0aGlzLiQubG9hZGVyLnNldFNlcmllc0RhdGEoZCxmLmdldERhdGEoKSl9KX0sX2NvbXB1dGVTZWxlY3RlZFJ1bnNTZXQoYil7Y29uc3QgZD17fTtfLmZvckVhY2goYixmPT57ZFtmXT0xfSk7cmV0dXJuIGR9LF9jb21wdXRlU2VyaWVzTmFtZXMoKXtjb25zdCBiPW5ldyBTZXQodGhpcy5ydW5zKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5fbmFtZVRvRGF0YVNlcmllcykuZmlsdGVyKChbLApkXSk9PmIuaGFzKGQucnVuKSkubWFwKChbZF0pPT5kKX0sX2RldGVybWluZUNvbG9yKGIsZCl7cmV0dXJuIGIuc2NhbGUoZCl9LF9yZWZyZXNoRGF0YVNlcmllcygpe3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIse30pfSxfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKXtyZXR1cm4gYj0+dGhpcy5fbmFtZVRvRGF0YVNlcmllc1tiXS5nZXRTeW1ib2woKS5tZXRob2QoKX0sX2RldGVybWluZVN5bWJvbChiLGQpe3JldHVybiBiW2RdLmdldFN5bWJvbCgpLmNoYXJhY3Rlcn0sX2NvbXB1dGVUYWdGaWx0ZXIoYil7cmV0dXJuIDE9PT1iLmxlbmd0aD9iWzBdOmIubWFwKGQ9PiIoIitkKyIpIikuam9pbigifCIpfSxfZ2V0VG9nZ2xlTWF0Y2hlc0ljb24oYil7cmV0dXJuIGI/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfdG9nZ2xlTWF0Y2hlc09wZW4oKXt0aGlzLnNldCgiX21hdGNoZXNMaXN0T3BlbmVkIiwhdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQpfSxfY29tcHV0ZVRpdGxlRGlzcGxheVN0cmluZyhiKXtyZXR1cm4gYnx8CiJ1bnRpdGxlZCJ9LF9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCgpe2NvbnN0IGI9dGhpcy4kJCgiI21hdGNoLWxpc3QtcmVwZWF0Iik7YiYmdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tYXRjaC1saXN0LWVudHJ5IikuZm9yRWFjaChkPT57Y29uc3QgZj1iLml0ZW1Gb3JFbGVtZW50KGQpO2Quc3R5bGUuY29sb3I9dGhpcy5fZGV0ZXJtaW5lQ29sb3IodGhpcy5fY29sb3JTY2FsZSxmKX0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXIoNTApfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX3NlbGVjdGVkUnVuczpBcnJheSxfc2hvd0Rvd25sb2FkTGlua3M6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6cGQuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9zaG93RG93bmxvYWRMaW5rc09ic2VydmVyIn0sX3Ntb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKF9zbW9vdGhpbmdXZWlnaHQpIn0sX3Ntb290aGluZ1dlaWdodDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOnBkLmdldE51bWJlckluaXRpYWxpemVyKCJfc21vb3RoaW5nV2VpZ2h0IiwKe2RlZmF1bHRWYWx1ZTouNn0pLG9ic2VydmVyOiJfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXIifSxfaWdub3JlWU91dGxpZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6cGQuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLG9ic2VydmVyOiJfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXIifSxfeFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX2xheW91dDpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX2xheW91dCkifSxfb3BlbmVkQ2F0ZWdvcmllczp7dHlwZTpPYmplY3R9LF9hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMH19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpLGQ9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGY9Pgp7Zi5jYW5jZWxsZWR8fCh0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsIWYudmFsdWUuY3VzdG9tX3NjYWxhcnMpLHRoaXMuX2RhdGFOb3RGb3VuZHx8dGhpcy5fcmV0cmlldmVMYXlvdXRBbmREYXRhKCkpfSk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfSxfcmVsb2FkQ2hhcnRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQsIHRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfcmV0cmlldmVMYXlvdXRBbmREYXRhKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvbGF5b3V0IiksZD10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwodGhpcy5zZXQoIl9sYXlvdXQiLGYudmFsdWUpLHRoaXMuX2RhdGFOb3RGb3VuZHx8dGhpcy5fcmVsb2FkQ2hhcnRzKCkpfSk7CnRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkKX0sX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXI6cGQuZ2V0Qm9vbGVhbk9ic2VydmVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSksX3Ntb290aGluZ1dlaWdodE9ic2VydmVyOnBkLmdldE51bWJlck9ic2VydmVyKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSksX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyOnBkLmdldEJvb2xlYW5PYnNlcnZlcigiX2lnbm9yZVlPdXRsaWVycyIse2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoYil7cmV0dXJuIDA8Yn0sX21ha2VDYXRlZ29yaWVzKGIpe2lmKCFiLmNhdGVnb3J5KXJldHVybltdO2xldCBkPSExO3RoaXMuX29wZW5lZENhdGVnb3JpZXN8fChkPSEwLHRoaXMuX29wZW5lZENhdGVnb3JpZXM9e30pO3JldHVybiBiLmNhdGVnb3J5Lm1hcChmPT4Ke2QmJiFmLmNsb3NlZCYmKHRoaXMuX29wZW5lZENhdGVnb3JpZXNbZi50aXRsZV09ITApO3JldHVybntuYW1lOmYudGl0bGUsaXRlbXM6Zi5jaGFydCxtZXRhZGF0YTp7b3BlbmVkOiEhdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tmLnRpdGxlXX19fSl9LF9jYXRlZ29yeU9wZW5lZFRvZ2dsZWQoYil7Yj1iLnRhcmdldDtiLm9wZW5lZD90aGlzLl9vcGVuZWRDYXRlZ29yaWVzW2IuY2F0ZWdvcnkubmFtZV09ITA6ZGVsZXRlIHRoaXMuX29wZW5lZENhdGVnb3JpZXNbYi5jYXRlZ29yeS5uYW1lXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbWFnZS1kYXNoYm9hcmQvdGYtaW1hZ2UtbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWltYWdlLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHNhbXBsZTpOdW1iZXIsb2ZTYW1wbGVzOk51bWJlcix0YWdNZXRhZGF0YTpPYmplY3QsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sYWN0dWFsU2l6ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sYnJpZ2h0bmVzc0FkanVzdG1lbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOi41fSxjb250cmFzdFBlcmNlbnRhZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfbWV0YWRhdGFDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuQ2FuY2VsbGVyfSxfaW1hZ2VDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuQ2FuY2VsbGVyfSxfc3RlcHM6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwfSxfc3RlcEluZGV4Ont0eXBlOk51bWJlciwKbm90aWZ5OiEwfSxfY3VycmVudFN0ZXA6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRTdGVwKF9zdGVwcywgX3N0ZXBJbmRleCkifSxfaGFzQXRMZWFzdE9uZVN0ZXA6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChfc3RlcHMpIn0sX2hhc011bHRpcGxlU3RlcHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNNdWx0aXBsZVN0ZXBzKF9zdGVwcykifSxfc3RlcFZhbHVlOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVTdGVwVmFsdWUoX2N1cnJlbnRTdGVwKSJ9LF9jdXJyZW50V2FsbFRpbWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRXYWxsVGltZShfY3VycmVudFN0ZXApIn0sX21heFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4U3RlcEluZGV4KF9zdGVwcykifSxfc2FtcGxlVGV4dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlU2FtcGxlVGV4dChzYW1wbGUpIn0sCl9oYXNNdWx0aXBsZVNhbXBsZXM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMob2ZTYW1wbGVzKSJ9LF9pc0ltYWdlTG9hZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1biwgdGFnKSIsIl91cGRhdGVJbWFnZVVybChfY3VycmVudFN0ZXAsIGJyaWdodG5lc3NBZGp1c3RtZW50LCBjb250cmFzdFBlcmNlbnRhZ2UpIl0sX2NvbXB1dGVSdW5Db2xvcihiKXtyZXR1cm4gcGYucnVuc0NvbG9yU2NhbGUoYil9LF9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoYil7cmV0dXJuISFiJiYwPGIubGVuZ3RofSxfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoYil7cmV0dXJuISFiJiYxPGIubGVuZ3RofSxfY29tcHV0ZUN1cnJlbnRTdGVwKGIsZCl7cmV0dXJuIGJbZF18fG51bGx9LF9jb21wdXRlU3RlcFZhbHVlKGIpe3JldHVybiBiP2Iuc3RlcDowfSxfY29tcHV0ZUN1cnJlbnRXYWxsVGltZShiKXtyZXR1cm4gYj8KSGguZm9ybWF0RGF0ZShiLndhbGxfdGltZSk6IiJ9LF9jb21wdXRlTWF4U3RlcEluZGV4KGIpe3JldHVybiBiLmxlbmd0aC0xfSxfY29tcHV0ZVNhbXBsZVRleHQoYil7cmV0dXJuYCR7YisxfWB9LF9jb21wdXRlSGFzTXVsdGlwbGVTYW1wbGVzKGIpe3JldHVybiAxPGJ9LF9nZXRBcmlhRXhwYW5kZWQoKXtyZXR1cm4gdGhpcy5hY3R1YWxTaXplPyJ0cnVlIjoiZmFsc2UifSxhdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwO3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2F0dGFjaGVkKXt0aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxBbGwoKTt2YXIgYj12Yy5hZGRQYXJhbXModmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbWFnZXMiKSx7dGFnOnRoaXMudGFnLHJ1bjp0aGlzLnJ1bixzYW1wbGU6dGhpcy5zYW1wbGV9KSxkPXRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKGY9PntmLmNhbmNlbGxlZHx8KGY9Zi52YWx1ZS5tYXAodGhpcy5fY3JlYXRlU3RlcERhdHVtLmJpbmQodGhpcykpLAp0aGlzLnNldCgiX3N0ZXBzIixmKSx0aGlzLnNldCgiX3N0ZXBJbmRleCIsZi5sZW5ndGgtMSkpfSk7dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZCl9fSxfY3JlYXRlU3RlcERhdHVtKGIpe2xldCBkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJpbWFnZXMiLCIvaW5kaXZpZHVhbEltYWdlIik7ZD12Yy5hZGRQYXJhbXMoZCx7dHM6Yi53YWxsX3RpbWV9KTtkKz0iXHgyNiIrYi5xdWVyeTtyZXR1cm57d2FsbF90aW1lOm5ldyBEYXRlKDFFMypiLndhbGxfdGltZSksc3RlcDpiLnN0ZXAsdXJsOmR9fSxfdXBkYXRlSW1hZ2VVcmwoYixkLGYpe2lmKGIpe3ZhciBoPW5ldyBJbWFnZTt0aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxBbGwoKTtoLm9ubG9hZD1oLm9uZXJyb3I9dGhpcy5faW1hZ2VDYW5jZWxsZXIuY2FuY2VsbGFibGUoaz0+e2suY2FuY2VsbGVkfHwoaz10aGlzLiQkKCIjbWFpbi1pbWFnZS1jb250YWluZXIiKSxrLmlubmVySFRNTD0iIixQb2x5bWVyLmRvbShrKS5hcHBlbmRDaGlsZChoKSwKdGhpcy5zZXQoIl9pc0ltYWdlTG9hZGluZyIsITEpKX0pLmJpbmQodGhpcyk7aC5zdHlsZS5maWx0ZXI9YGNvbnRyYXN0KCR7Zn0lKSBgO2guc3R5bGUuZmlsdGVyKz1gYnJpZ2h0bmVzcygke2R9KWA7dGhpcy5zZXQoIl9pc0ltYWdlTG9hZGluZyIsITApO2guc3JjPWIudXJsfX0sX2hhbmRsZVRhcCgpe3RoaXMuc2V0KCJhY3R1YWxTaXplIiwhdGhpcy5hY3R1YWxTaXplKX0sX3RvTG9jYWxlU3RyaW5nKGIpe3JldHVybiBiLnRvTG9jYWxlU3RyaW5nKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1hZ2UtZGFzaGJvYXJkL3RmLWltYWdlLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1pbWFnZS1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF9hY3R1YWxTaXplOkJvb2xlYW4sX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudDp7dHlwZTpOdW1iZXIsdmFsdWU6MSxyZWFkT25seTohMH0sX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjEwMCxyZWFkT25seTohMH0sX2JyaWdodG5lc3NBZGp1c3RtZW50Ont0eXBlOk51bWJlcix2YWx1ZToxfSxfY29udHJhc3RQZXJjZW50YWdlOnt0eXBlOk51bWJlcix2YWx1ZToxMDB9LF90YWdGaWx0ZXI6U3RyaW5nLF9icmlnaHRuZXNzSXNEZWZhdWx0Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQnJpZ2h0bmVzc0lzRGVmYXVsdChfYnJpZ2h0bmVzc0FkanVzdG1lbnQpIn0sX2NvbnRyYXN0SXNEZWZhdWx0Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQ29udHJhc3RJc0RlZmF1bHQoX2NvbnRyYXN0UGVyY2VudGFnZSkifSwKX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRJbWFnZXMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5PYmplY3Qua2V5cyhoKSk7Zj12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwKMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZEltYWdlcygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1pbWFnZS1sb2FkZXIiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfcmVzZXRCcmlnaHRuZXNzKCl7dGhpcy5fYnJpZ2h0bmVzc0FkanVzdG1lbnQ9dGhpcy5fZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50fSxfcmVzZXRDb250cmFzdCgpe3RoaXMuX2NvbnRyYXN0UGVyY2VudGFnZT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfSxfY29tcHV0ZUJyaWdodG5lc3NJc0RlZmF1bHQoYil7cmV0dXJuIGI9PT10aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnR9LF9jb21wdXRlQ29udHJhc3RJc0RlZmF1bHQoYil7cmV0dXJuIGI9PT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfSwKX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtmdW5jdGlvbiBoKHQpe2NvbnN0IGw9Ylt0LnJ1bl1bdC50YWddLnNhbXBsZXM7cmV0dXJuIF8ucmFuZ2UobCkubWFwKHA9Pk9iamVjdC5hc3NpZ24oe30sdCx7c2FtcGxlOnAsb2ZTYW1wbGVzOmx9KSl9Y29uc3Qgaz1fLm1hcFZhbHVlcyhiLHQ9Pk9iamVjdC5rZXlzKHQpKTtyZXR1cm4gJGMuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhrLGQsZikubWFwKHQ9Pk9iamVjdC5hc3NpZ24oe30sdCx7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLHQuaXRlbXMubWFwKGgpKX0pKX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtyZXR1cm4gYltkXVtmXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1hdWRpby1kYXNoYm9hcmQvdGYtYXVkaW8tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWF1ZGlvLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHNhbXBsZTpOdW1iZXIsdG90YWxTYW1wbGVzOk51bWJlcix0YWdNZXRhZGF0YTpPYmplY3QsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXRhZGF0YUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9zdGVwSW5kZXg6TnVtYmVyLF9oYXNBdExlYXN0T25lU3RlcDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKF9zdGVwcykifSxfaGFzTXVsdGlwbGVTdGVwczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoX3N0ZXBzKSJ9LF9jdXJyZW50RGF0dW06e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnREYXR1bShfc3RlcHMsIF9zdGVwSW5kZXgpIn0sCl9tYXhTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFN0ZXBJbmRleChfc3RlcHMpIn0sX3NhbXBsZVRleHQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVNhbXBsZVRleHQoc2FtcGxlKSJ9LF9oYXNNdWx0aXBsZVNhbXBsZXM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXModG90YWxTYW1wbGVzKSJ9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIl0sX2NvbXB1dGVSdW5Db2xvcihiKXtyZXR1cm4gcGYucnVuc0NvbG9yU2NhbGUoYil9LF9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoYil7cmV0dXJuISFiJiYwPGIubGVuZ3RofSxfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoYil7cmV0dXJuISFiJiYxPGIubGVuZ3RofSxfY29tcHV0ZU1heFN0ZXBJbmRleChiKXtyZXR1cm4gYi5sZW5ndGgtMX0sX2NvbXB1dGVDdXJyZW50RGF0dW0oYixkKXtyZXR1cm4gYltkXX0sX2NvbXB1dGVTYW1wbGVUZXh0KGIpe3JldHVybmAke2IrCjF9YH0sX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMoYil7cmV0dXJuIDE8Yn0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9hdHRhY2hlZCl7dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsQWxsKCk7dmFyIGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL2F1ZGlvIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVuLHNhbXBsZTp0aGlzLnNhbXBsZX0pKSxkPXRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKGY9PntmLmNhbmNlbGxlZHx8KGY9Zi52YWx1ZS5tYXAodGhpcy5fY3JlYXRlU3RlcERhdHVtLmJpbmQodGhpcykpLHRoaXMuc2V0KCJfc3RlcHMiLGYpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixmLmxlbmd0aC0xKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkKX19LF9jcmVhdGVTdGVwRGF0dW0oYil7dmFyIGQ9Cm5ldyBVUkxTZWFyY2hQYXJhbXMoYi5xdWVyeSk7ZC5hcHBlbmQoInRzIixiLndhbGxfdGltZSk7ZD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvaW5kaXZpZHVhbEF1ZGlvIixkKTtyZXR1cm57d2FsbF90aW1lOkhoLmZvcm1hdERhdGUobmV3IERhdGUoMUUzKmIud2FsbF90aW1lKSksc3RlcDpiLnN0ZXAsbGFiZWw6Yi5sYWJlbCxjb250ZW50VHlwZTpiLmNvbnRlbnRUeXBlLHVybDpkfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1hdWRpby1kYXNoYm9hcmQvdGYtYXVkaW8tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWF1ZGlvLWRhc2hib2FyZCIscHJvcGVydGllczp7X3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlcikifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRBdWRpbygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJhdWRpbyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57aWYoIV8uaXNFcXVhbChkLAp0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZj1fLm1hcFZhbHVlcyhkLGg9Pk9iamVjdC5rZXlzKGgpKTtmPXZjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGQpfX0pfSxfcmVsb2FkQXVkaW8oKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtYXVkaW8tbG9hZGVyIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtmdW5jdGlvbiBoKHQpe2NvbnN0IGw9Ylt0LnJ1bl1bdC50YWddLnNhbXBsZXM7cmV0dXJuIF8ucmFuZ2UobCkubWFwKHA9Pk9iamVjdC5hc3NpZ24oe30sdCx7c2FtcGxlOnAsdG90YWxTYW1wbGVzOmx9KSl9Y29uc3Qgaz1fLm1hcFZhbHVlcyhiLHQ9Pk9iamVjdC5rZXlzKHQpKTtyZXR1cm4gJGMuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhrLGQsZikubWFwKHQ9Pk9iamVjdC5hc3NpZ24oe30sCnQse2l0ZW1zOltdLmNvbmNhdC5hcHBseShbXSx0Lml0ZW1zLm1hcChoKSl9KSl9LF90YWdNZXRhZGF0YShiLGQsZil7cmV0dXJuIGJbZF1bZl19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS9pcm9uLWF1dG9ncm93LXRleHRhcmVhLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24tYXV0b2dyb3ctdGV4dGFyZWEiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25Db250cm9sU3RhdGVdLHByb3BlcnRpZXM6e3ZhbHVlOntvYnNlcnZlcjoiX3ZhbHVlQ2hhbmdlZCIsdHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxiaW5kVmFsdWU6e29ic2VydmVyOiJfYmluZFZhbHVlQ2hhbmdlZCIsdHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxyb3dzOnt0eXBlOk51bWJlcix2YWx1ZToxLG9ic2VydmVyOiJfdXBkYXRlQ2FjaGVkIn0sbWF4Um93czp7dHlwZTpOdW1iZXIsdmFsdWU6MCxvYnNlcnZlcjoiX3VwZGF0ZUNhY2hlZCJ9LGF1dG9jb21wbGV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZiJ9LGF1dG9mb2N1czp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnB1dG1vZGU6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmd9LHJlYWRvbmx5Ont0eXBlOlN0cmluZ30scmVxdWlyZWQ6e3R5cGU6Qm9vbGVhbn0sCm1pbmxlbmd0aDp7dHlwZTpOdW1iZXJ9LG1heGxlbmd0aDp7dHlwZTpOdW1iZXJ9LGxhYmVsOnt0eXBlOlN0cmluZ319LGxpc3RlbmVyczp7aW5wdXQ6Il9vbklucHV0In0sZ2V0IHRleHRhcmVhKCl7cmV0dXJuIHRoaXMuJC50ZXh0YXJlYX0sZ2V0IHNlbGVjdGlvblN0YXJ0KCl7cmV0dXJuIHRoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydH0sZ2V0IHNlbGVjdGlvbkVuZCgpe3JldHVybiB0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uRW5kfSxzZXQgc2VsZWN0aW9uU3RhcnQoYil7dGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0PWJ9LHNldCBzZWxlY3Rpb25FbmQoYil7dGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvbkVuZD1ifSxhdHRhY2hlZDpmdW5jdGlvbigpe25hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86W29hXWR8aG9uZSkvKSYmKHRoaXMuJC50ZXh0YXJlYS5zdHlsZS5tYXJnaW5MZWZ0PSItM3B4Iil9LHZhbGlkYXRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy4kLnRleHRhcmVhLnZhbGlkaXR5LnZhbGlkOwpiJiYodGhpcy5yZXF1aXJlZCYmIiI9PT10aGlzLnZhbHVlP2I9ITE6dGhpcy5oYXNWYWxpZGF0b3IoKSYmKGI9UG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvci52YWxpZGF0ZS5jYWxsKHRoaXMsdGhpcy52YWx1ZSkpKTt0aGlzLmludmFsaWQ9IWI7dGhpcy5maXJlKCJpcm9uLWlucHV0LXZhbGlkYXRlIik7cmV0dXJuIGJ9LF9iaW5kVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMudmFsdWU9Yn0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLnRleHRhcmVhO2QmJihkLnZhbHVlIT09YiYmKGQudmFsdWU9Ynx8MD09PWI/YjoiIiksdGhpcy5iaW5kVmFsdWU9Yix0aGlzLiQubWlycm9yLmlubmVySFRNTD10aGlzLl92YWx1ZUZvck1pcnJvcigpLHRoaXMuZmlyZSgiYmluZC12YWx1ZS1jaGFuZ2VkIix7dmFsdWU6dGhpcy5iaW5kVmFsdWV9KSl9LF9vbklucHV0OmZ1bmN0aW9uKGIpe3ZhciBkPVBvbHltZXIuZG9tKGIpLnBhdGg7dGhpcy52YWx1ZT1kP2RbMF0udmFsdWU6CmIudGFyZ2V0LnZhbHVlfSxfY29uc3RyYWluOmZ1bmN0aW9uKGIpe2I9Ynx8WyIiXTtmb3IoYj0wPHRoaXMubWF4Um93cyYmYi5sZW5ndGg+dGhpcy5tYXhSb3dzP2Iuc2xpY2UoMCx0aGlzLm1heFJvd3MpOmIuc2xpY2UoMCk7MDx0aGlzLnJvd3MmJmIubGVuZ3RoPHRoaXMucm93czspYi5wdXNoKCIiKTtyZXR1cm4gYi5qb2luKCJceDNjYnIvXHgzZSIpKyJceDI2IzE2MDsifSxfdmFsdWVGb3JNaXJyb3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnRleHRhcmVhO2lmKGIpcmV0dXJuIHRoaXMudG9rZW5zPWImJmIudmFsdWU/Yi52YWx1ZS5yZXBsYWNlKC8mL2dtLCJceDI2YW1wOyIpLnJlcGxhY2UoLyIvZ20sIlx4MjZxdW90OyIpLnJlcGxhY2UoLycvZ20sIlx4MjYjMzk7IikucmVwbGFjZSgvPC9nbSwiXHgyNmx0OyIpLnJlcGxhY2UoLz4vZ20sIlx4MjZndDsiKS5zcGxpdCgiXG4iKTpbIiJdLHRoaXMuX2NvbnN0cmFpbih0aGlzLnRva2Vucyl9LF91cGRhdGVDYWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLiQubWlycm9yLmlubmVySFRNTD0KdGhpcy5fY29uc3RyYWluKHRoaXMudG9rZW5zKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pbnB1dC9wYXBlci10ZXh0YXJlYS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10ZXh0YXJlYSIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySW5wdXRCZWhhdmlvcixQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yXSxwcm9wZXJ0aWVzOntfYXJpYUxhYmVsbGVkQnk6e29ic2VydmVyOiJfYXJpYUxhYmVsbGVkQnlDaGFuZ2VkIix0eXBlOlN0cmluZ30sX2FyaWFEZXNjcmliZWRCeTp7b2JzZXJ2ZXI6Il9hcmlhRGVzY3JpYmVkQnlDaGFuZ2VkIix0eXBlOlN0cmluZ30sdmFsdWU6e3R5cGU6U3RyaW5nfSxyb3dzOnt0eXBlOk51bWJlcix2YWx1ZToxfSxtYXhSb3dzOnt0eXBlOk51bWJlcix2YWx1ZTowfX0sZ2V0IHNlbGVjdGlvblN0YXJ0KCl7cmV0dXJuIHRoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydH0sc2V0IHNlbGVjdGlvblN0YXJ0KGIpe3RoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydD1ifSxnZXQgc2VsZWN0aW9uRW5kKCl7cmV0dXJuIHRoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25FbmR9LApzZXQgc2VsZWN0aW9uRW5kKGIpe3RoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25FbmQ9Yn0sX2FyaWFMYWJlbGxlZEJ5Q2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c2FibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixiKX0sX2FyaWFEZXNjcmliZWRCeUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiLGIpfSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnQudGV4dGFyZWF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItdG9hc3QvcGFwZXItdG9hc3QuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj1udWxsO1BvbHltZXIoe2lzOiJwYXBlci10b2FzdCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JdLHByb3BlcnRpZXM6e2ZpdEludG86e3R5cGU6T2JqZWN0LHZhbHVlOndpbmRvdyxvYnNlcnZlcjoiX29uRml0SW50b0NoYW5nZWQifSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0In0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImJvdHRvbSJ9LGR1cmF0aW9uOnt0eXBlOk51bWJlcix2YWx1ZTozRTN9LHRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxub0NhbmNlbE9uT3V0c2lkZUNsaWNrOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LG5vQXV0b0ZvY3VzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9fSxsaXN0ZW5lcnM6e3RyYW5zaXRpb25lbmQ6Il9fb25UcmFuc2l0aW9uRW5kIn0sZ2V0IHZpc2libGUoKXtQb2x5bWVyLkJhc2UuX3dhcm4oImB2aXNpYmxlYCBpcyBkZXByZWNhdGVkLCB1c2UgYG9wZW5lZGAgaW5zdGVhZCIpOwpyZXR1cm4gdGhpcy5vcGVuZWR9LGdldCBfY2FuQXV0b0Nsb3NlKCl7cmV0dXJuIDA8dGhpcy5kdXJhdGlvbiYmSW5maW5pdHkhPT10aGlzLmR1cmF0aW9ufSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXV0b0Nsb3NlPW51bGw7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5KCl9LHNob3c6ZnVuY3Rpb24oZCl7InN0cmluZyI9PXR5cGVvZiBkJiYoZD17dGV4dDpkfSk7Zm9yKHZhciBmIGluIGQpMD09PWYuaW5kZXhPZigiXyIpP1BvbHltZXIuQmFzZS5fd2FybignVGhlIHByb3BlcnR5ICInK2YrJyIgaXMgcHJpdmF0ZSBhbmQgd2FzIG5vdCBzZXQuJyk6ZiBpbiB0aGlzP3RoaXNbZl09ZFtmXTpQb2x5bWVyLkJhc2UuX3dhcm4oJ1RoZSBwcm9wZXJ0eSAiJytmKyciIGlzIG5vdCB2YWxpZC4nKTt0aGlzLm9wZW4oKX0saGlkZTpmdW5jdGlvbigpe3RoaXMuY2xvc2UoKX0sX19vblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oZCl7ZCYmZC50YXJnZXQ9PT0KdGhpcyYmIm9wYWNpdHkiPT09ZC5wcm9wZXJ0eU5hbWUmJih0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKTp0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKSl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX2F1dG9DbG9zZSYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fYXV0b0Nsb3NlKSx0aGlzLl9hdXRvQ2xvc2U9bnVsbCk7dGhpcy5vcGVuZWQ/KGImJmIhPT10aGlzJiZiLmNsb3NlKCksYj10aGlzLHRoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6dGhpcy50ZXh0fSksdGhpcy5fY2FuQXV0b0Nsb3NlJiYodGhpcy5fYXV0b0Nsb3NlPXRoaXMuYXN5bmModGhpcy5jbG9zZSx0aGlzLmR1cmF0aW9uKSkpOmI9PT10aGlzJiYoYj1udWxsKTtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9vcGVuZWRDaGFuZ2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LmFkZCgicGFwZXItdG9hc3Qtb3BlbiIpfSwKX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LnJlbW92ZSgicGFwZXItdG9hc3Qtb3BlbiIpfSxfb25GaXRJbnRvQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLnBvc2l0aW9uVGFyZ2V0PWR9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvZ2dsZS1idXR0b24vcGFwZXItdG9nZ2xlLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b2dnbGUtYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIiwiYXJpYS1wcmVzc2VkIjoiZmFsc2UiLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e30sbGlzdGVuZXJzOnt0cmFjazoiX29udHJhY2sifSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7UG9seW1lci5HZXN0dXJlcy5zZXRUb3VjaEFjdGlvbih0aGlzLCJwYW4teSIpfSl9LF9vbnRyYWNrOmZ1bmN0aW9uKGIpe2I9Yi5kZXRhaWw7InN0YXJ0Ij09PWIuc3RhdGU/dGhpcy5fdHJhY2tTdGFydChiKToidHJhY2siPT09Yi5zdGF0ZT90aGlzLl90cmFja01vdmUoYik6ImVuZCI9PT1iLnN0YXRlJiZ0aGlzLl90cmFja0VuZChiKX0sX3RyYWNrU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl93aWR0aD10aGlzLiQudG9nZ2xlQmFyLm9mZnNldFdpZHRoLwoyO3RoaXMuX3RyYWNrQ2hlY2tlZD10aGlzLmNoZWNrZWQ7dGhpcy4kLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJkcmFnZ2luZyIpfSxfdHJhY2tNb3ZlOmZ1bmN0aW9uKGIpe2I9Yi5keDt0aGlzLl94PU1hdGgubWluKHRoaXMuX3dpZHRoLE1hdGgubWF4KDAsdGhpcy5fdHJhY2tDaGVja2VkP3RoaXMuX3dpZHRoK2I6YikpO3RoaXMudHJhbnNsYXRlM2QodGhpcy5feCsicHgiLDAsMCx0aGlzLiQudG9nZ2xlQnV0dG9uKTt0aGlzLl91c2VyQWN0aXZhdGUodGhpcy5feD50aGlzLl93aWR0aC8yKX0sX3RyYWNrRW5kOmZ1bmN0aW9uKCl7dGhpcy4kLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpO3RoaXMudHJhbnNmb3JtKCIiLHRoaXMuJC50b2dnbGVCdXR0b24pfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC50b2dnbGVCdXR0b247dmFyIGI9UG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLl9jcmVhdGVSaXBwbGUoKTsKYi5pZD0iaW5rIjtiLnNldEF0dHJpYnV0ZSgicmVjZW50ZXJzIiwiIik7Yi5jbGFzc0xpc3QuYWRkKCJjaXJjbGUiLCJ0b2dnbGUtaW5rIik7cmV0dXJuIGJ9fSk7CgooZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZSE9PSJ1bmRlZmluZWQiKW1vZHVsZS5leHBvcnRzPWYoKTtlbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKWRlZmluZShbXSxmKTtlbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5kb3chPT0idW5kZWZpbmVkIilnPXdpbmRvdztlbHNlIGlmKHR5cGVvZiBnbG9iYWwhPT0idW5kZWZpbmVkIilnPWdsb2JhbDtlbHNlIGlmKHR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCIpZz1zZWxmO2Vsc2UgZz10aGlzO2cuZ3JhcGhsaWI9ZigpfX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTsKdmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZjt9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGxpYj1yZXF1aXJlKCIuL2xpYiIpO21vZHVsZS5leHBvcnRzPXtHcmFwaDpsaWIuR3JhcGgsanNvbjpyZXF1aXJlKCIuL2xpYi9qc29uIiksYWxnOnJlcXVpcmUoIi4vbGliL2FsZyIpLHZlcnNpb246bGliLnZlcnNpb259fSx7Ii4vbGliIjoxNywiLi9saWIvYWxnIjo4LCIuL2xpYi9qc29uIjoxOH1dLAoyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1jb21wb25lbnRzO2Z1bmN0aW9uIGNvbXBvbmVudHMoZyl7dmFyIHZpc2l0ZWQ9e30sY21wdHM9W10sY21wdDtmdW5jdGlvbiBkZnModil7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm47dmlzaXRlZFt2XT10cnVlO2NtcHQucHVzaCh2KTtfLmVhY2goZy5zdWNjZXNzb3JzKHYpLGRmcyk7Xy5lYWNoKGcucHJlZGVjZXNzb3JzKHYpLGRmcyl9Xy5lYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtjbXB0PVtdO2Rmcyh2KTtpZihjbXB0Lmxlbmd0aCljbXB0cy5wdXNoKGNtcHQpfSk7cmV0dXJuIGNtcHRzfX0seyIuLi9sb2Rhc2giOjE5fV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9ZGZzO2Z1bmN0aW9uIGRmcyhnLHZzLG9yZGVyKXtpZighXy5pc0FycmF5KHZzKSl2cz0KW3ZzXTt2YXIgbmF2aWdhdGlvbj0oZy5pc0RpcmVjdGVkKCk/Zy5zdWNjZXNzb3JzOmcubmVpZ2hib3JzKS5iaW5kKGcpO3ZhciBhY2M9W10sdmlzaXRlZD17fTtfLmVhY2godnMsZnVuY3Rpb24odil7aWYoIWcuaGFzTm9kZSh2KSl0aHJvdyBuZXcgRXJyb3IoIkdyYXBoIGRvZXMgbm90IGhhdmUgbm9kZTogIit2KTtkb0RmcyhnLHYsb3JkZXI9PT0icG9zdCIsdmlzaXRlZCxuYXZpZ2F0aW9uLGFjYyl9KTtyZXR1cm4gYWNjfWZ1bmN0aW9uIGRvRGZzKGcsdixwb3N0b3JkZXIsdmlzaXRlZCxuYXZpZ2F0aW9uLGFjYyl7aWYoIV8uaGFzKHZpc2l0ZWQsdikpe3Zpc2l0ZWRbdl09dHJ1ZTtpZighcG9zdG9yZGVyKWFjYy5wdXNoKHYpO18uZWFjaChuYXZpZ2F0aW9uKHYpLGZ1bmN0aW9uKHcpe2RvRGZzKGcsdyxwb3N0b3JkZXIsdmlzaXRlZCxuYXZpZ2F0aW9uLGFjYyl9KTtpZihwb3N0b3JkZXIpYWNjLnB1c2godil9fX0seyIuLi9sb2Rhc2giOjE5fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSwKbW9kdWxlLGV4cG9ydHMpe3ZhciBkaWprc3RyYT1yZXF1aXJlKCIuL2RpamtzdHJhIiksXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1kaWprc3RyYUFsbDtmdW5jdGlvbiBkaWprc3RyYUFsbChnLHdlaWdodEZ1bmMsZWRnZUZ1bmMpe3JldHVybiBfLnRyYW5zZm9ybShnLm5vZGVzKCksZnVuY3Rpb24oYWNjLHYpe2FjY1t2XT1kaWprc3RyYShnLHYsd2VpZ2h0RnVuYyxlZGdlRnVuYyl9LHt9KX19LHsiLi4vbG9kYXNoIjoxOSwiLi9kaWprc3RyYSI6NX1dLDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLFByaW9yaXR5UXVldWU9cmVxdWlyZSgiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSIpO21vZHVsZS5leHBvcnRzPWRpamtzdHJhO3ZhciBERUZBVUxUX1dFSUdIVF9GVU5DPV8uY29uc3RhbnQoMSk7ZnVuY3Rpb24gZGlqa3N0cmEoZyxzb3VyY2Usd2VpZ2h0Rm4sZWRnZUZuKXtyZXR1cm4gcnVuRGlqa3N0cmEoZywKU3RyaW5nKHNvdXJjZSksd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZVTkMsZWRnZUZufHxmdW5jdGlvbih2KXtyZXR1cm4gZy5vdXRFZGdlcyh2KX0pfWZ1bmN0aW9uIHJ1bkRpamtzdHJhKGcsc291cmNlLHdlaWdodEZuLGVkZ2VGbil7dmFyIHJlc3VsdHM9e30scHE9bmV3IFByaW9yaXR5UXVldWUsdix2RW50cnk7dmFyIHVwZGF0ZU5laWdoYm9ycz1mdW5jdGlvbihlZGdlKXt2YXIgdz1lZGdlLnYhPT12P2VkZ2UudjplZGdlLncsd0VudHJ5PXJlc3VsdHNbd10sd2VpZ2h0PXdlaWdodEZuKGVkZ2UpLGRpc3RhbmNlPXZFbnRyeS5kaXN0YW5jZSt3ZWlnaHQ7aWYod2VpZ2h0PDApdGhyb3cgbmV3IEVycm9yKCJkaWprc3RyYSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSBlZGdlIHdlaWdodHMuICIrIkJhZCBlZGdlOiAiK2VkZ2UrIiBXZWlnaHQ6ICIrd2VpZ2h0KTtpZihkaXN0YW5jZTx3RW50cnkuZGlzdGFuY2Upe3dFbnRyeS5kaXN0YW5jZT1kaXN0YW5jZTt3RW50cnkucHJlZGVjZXNzb3I9CnY7cHEuZGVjcmVhc2UodyxkaXN0YW5jZSl9fTtnLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KXt2YXIgZGlzdGFuY2U9dj09PXNvdXJjZT8wOk51bWJlci5QT1NJVElWRV9JTkZJTklUWTtyZXN1bHRzW3ZdPXtkaXN0YW5jZTpkaXN0YW5jZX07cHEuYWRkKHYsZGlzdGFuY2UpfSk7d2hpbGUocHEuc2l6ZSgpPjApe3Y9cHEucmVtb3ZlTWluKCk7dkVudHJ5PXJlc3VsdHNbdl07aWYodkVudHJ5LmRpc3RhbmNlPT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKWJyZWFrO2VkZ2VGbih2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyl9cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2RhdGEvcHJpb3JpdHktcXVldWUiOjE1LCIuLi9sb2Rhc2giOjE5fV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksdGFyamFuPXJlcXVpcmUoIi4vdGFyamFuIik7bW9kdWxlLmV4cG9ydHM9ZmluZEN5Y2xlcztmdW5jdGlvbiBmaW5kQ3ljbGVzKGcpe3JldHVybiBfLmZpbHRlcih0YXJqYW4oZyksCmZ1bmN0aW9uKGNtcHQpe3JldHVybiBjbXB0Lmxlbmd0aD4xfHxjbXB0Lmxlbmd0aD09PTEmJmcuaGFzRWRnZShjbXB0WzBdLGNtcHRbMF0pfSl9fSx7Ii4uL2xvZGFzaCI6MTksIi4vdGFyamFuIjoxM31dLDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWZsb3lkV2Fyc2hhbGw7dmFyIERFRkFVTFRfV0VJR0hUX0ZVTkM9Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBmbG95ZFdhcnNoYWxsKGcsd2VpZ2h0Rm4sZWRnZUZuKXtyZXR1cm4gcnVuRmxveWRXYXJzaGFsbChnLHdlaWdodEZufHxERUZBVUxUX1dFSUdIVF9GVU5DLGVkZ2VGbnx8ZnVuY3Rpb24odil7cmV0dXJuIGcub3V0RWRnZXModil9KX1mdW5jdGlvbiBydW5GbG95ZFdhcnNoYWxsKGcsd2VpZ2h0Rm4sZWRnZUZuKXt2YXIgcmVzdWx0cz17fSxub2Rlcz1nLm5vZGVzKCk7bm9kZXMuZm9yRWFjaChmdW5jdGlvbih2KXtyZXN1bHRzW3ZdPQp7fTtyZXN1bHRzW3ZdW3ZdPXtkaXN0YW5jZTowfTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHcpe2lmKHYhPT13KXJlc3VsdHNbdl1bd109e2Rpc3RhbmNlOk51bWJlci5QT1NJVElWRV9JTkZJTklUWX19KTtlZGdlRm4odikuZm9yRWFjaChmdW5jdGlvbihlZGdlKXt2YXIgdz1lZGdlLnY9PT12P2VkZ2UudzplZGdlLnYsZD13ZWlnaHRGbihlZGdlKTtyZXN1bHRzW3ZdW3ddPXtkaXN0YW5jZTpkLHByZWRlY2Vzc29yOnZ9fSl9KTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGspe3ZhciByb3dLPXJlc3VsdHNba107bm9kZXMuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgcm93ST1yZXN1bHRzW2ldO25vZGVzLmZvckVhY2goZnVuY3Rpb24oail7dmFyIGlrPXJvd0lba107dmFyIGtqPXJvd0tbal07dmFyIGlqPXJvd0lbal07dmFyIGFsdERpc3RhbmNlPWlrLmRpc3RhbmNlK2tqLmRpc3RhbmNlO2lmKGFsdERpc3RhbmNlPGlqLmRpc3RhbmNlKXtpai5kaXN0YW5jZT1hbHREaXN0YW5jZTtpai5wcmVkZWNlc3Nvcj0Ka2oucHJlZGVjZXNzb3J9fSl9KX0pO3JldHVybiByZXN1bHRzfX0seyIuLi9sb2Rhc2giOjE5fV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9e2NvbXBvbmVudHM6cmVxdWlyZSgiLi9jb21wb25lbnRzIiksZGlqa3N0cmE6cmVxdWlyZSgiLi9kaWprc3RyYSIpLGRpamtzdHJhQWxsOnJlcXVpcmUoIi4vZGlqa3N0cmEtYWxsIiksZmluZEN5Y2xlczpyZXF1aXJlKCIuL2ZpbmQtY3ljbGVzIiksZmxveWRXYXJzaGFsbDpyZXF1aXJlKCIuL2Zsb3lkLXdhcnNoYWxsIiksaXNBY3ljbGljOnJlcXVpcmUoIi4vaXMtYWN5Y2xpYyIpLHBvc3RvcmRlcjpyZXF1aXJlKCIuL3Bvc3RvcmRlciIpLHByZW9yZGVyOnJlcXVpcmUoIi4vcHJlb3JkZXIiKSxwcmltOnJlcXVpcmUoIi4vcHJpbSIpLHRhcmphbjpyZXF1aXJlKCIuL3RhcmphbiIpLHRvcHNvcnQ6cmVxdWlyZSgiLi90b3Bzb3J0Iil9fSx7Ii4vY29tcG9uZW50cyI6MiwiLi9kaWprc3RyYSI6NSwKIi4vZGlqa3N0cmEtYWxsIjo0LCIuL2ZpbmQtY3ljbGVzIjo2LCIuL2Zsb3lkLXdhcnNoYWxsIjo3LCIuL2lzLWFjeWNsaWMiOjksIi4vcG9zdG9yZGVyIjoxMCwiLi9wcmVvcmRlciI6MTEsIi4vcHJpbSI6MTIsIi4vdGFyamFuIjoxMywiLi90b3Bzb3J0IjoxNH1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciB0b3Bzb3J0PXJlcXVpcmUoIi4vdG9wc29ydCIpO21vZHVsZS5leHBvcnRzPWlzQWN5Y2xpYztmdW5jdGlvbiBpc0FjeWNsaWMoZyl7dHJ5e3RvcHNvcnQoZyl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHRvcHNvcnQuQ3ljbGVFeGNlcHRpb24pcmV0dXJuIGZhbHNlO3Rocm93IGU7fXJldHVybiB0cnVlfX0seyIuL3RvcHNvcnQiOjE0fV0sMTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBkZnM9cmVxdWlyZSgiLi9kZnMiKTttb2R1bGUuZXhwb3J0cz1wb3N0b3JkZXI7ZnVuY3Rpb24gcG9zdG9yZGVyKGcsdnMpe3JldHVybiBkZnMoZywKdnMsInBvc3QiKX19LHsiLi9kZnMiOjN9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGRmcz1yZXF1aXJlKCIuL2RmcyIpO21vZHVsZS5leHBvcnRzPXByZW9yZGVyO2Z1bmN0aW9uIHByZW9yZGVyKGcsdnMpe3JldHVybiBkZnMoZyx2cywicHJlIil9fSx7Ii4vZGZzIjozfV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBoIiksUHJpb3JpdHlRdWV1ZT1yZXF1aXJlKCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIik7bW9kdWxlLmV4cG9ydHM9cHJpbTtmdW5jdGlvbiBwcmltKGcsd2VpZ2h0RnVuYyl7dmFyIHJlc3VsdD1uZXcgR3JhcGgscGFyZW50cz17fSxwcT1uZXcgUHJpb3JpdHlRdWV1ZSx2O2Z1bmN0aW9uIHVwZGF0ZU5laWdoYm9ycyhlZGdlKXt2YXIgdz1lZGdlLnY9PT12P2VkZ2UudzplZGdlLnYscHJpPXBxLnByaW9yaXR5KHcpO2lmKHByaSE9PQp1bmRlZmluZWQpe3ZhciBlZGdlV2VpZ2h0PXdlaWdodEZ1bmMoZWRnZSk7aWYoZWRnZVdlaWdodDxwcmkpe3BhcmVudHNbd109djtwcS5kZWNyZWFzZSh3LGVkZ2VXZWlnaHQpfX19aWYoZy5ub2RlQ291bnQoKT09PTApcmV0dXJuIHJlc3VsdDtfLmVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3BxLmFkZCh2LE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7cmVzdWx0LnNldE5vZGUodil9KTtwcS5kZWNyZWFzZShnLm5vZGVzKClbMF0sMCk7dmFyIGluaXQ9ZmFsc2U7d2hpbGUocHEuc2l6ZSgpPjApe3Y9cHEucmVtb3ZlTWluKCk7aWYoXy5oYXMocGFyZW50cyx2KSlyZXN1bHQuc2V0RWRnZSh2LHBhcmVudHNbdl0pO2Vsc2UgaWYoaW5pdCl0aHJvdyBuZXcgRXJyb3IoIklucHV0IGdyYXBoIGlzIG5vdCBjb25uZWN0ZWQ6ICIrZyk7ZWxzZSBpbml0PXRydWU7Zy5ub2RlRWRnZXModikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpfXJldHVybiByZXN1bHR9fSx7Ii4uL2RhdGEvcHJpb3JpdHktcXVldWUiOjE1LAoiLi4vZ3JhcGgiOjE2LCIuLi9sb2Rhc2giOjE5fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXRhcmphbjtmdW5jdGlvbiB0YXJqYW4oZyl7dmFyIGluZGV4PTAsc3RhY2s9W10sdmlzaXRlZD17fSxyZXN1bHRzPVtdO2Z1bmN0aW9uIGRmcyh2KXt2YXIgZW50cnk9dmlzaXRlZFt2XT17b25TdGFjazp0cnVlLGxvd2xpbms6aW5kZXgsaW5kZXg6aW5kZXgrK307c3RhY2sucHVzaCh2KTtnLnN1Y2Nlc3NvcnModikuZm9yRWFjaChmdW5jdGlvbih3KXtpZighXy5oYXModmlzaXRlZCx3KSl7ZGZzKHcpO2VudHJ5Lmxvd2xpbms9TWF0aC5taW4oZW50cnkubG93bGluayx2aXNpdGVkW3ddLmxvd2xpbmspfWVsc2UgaWYodmlzaXRlZFt3XS5vblN0YWNrKWVudHJ5Lmxvd2xpbms9TWF0aC5taW4oZW50cnkubG93bGluayx2aXNpdGVkW3ddLmluZGV4KX0pO2lmKGVudHJ5Lmxvd2xpbms9PT1lbnRyeS5pbmRleCl7dmFyIGNtcHQ9CltdLHc7ZG97dz1zdGFjay5wb3AoKTt2aXNpdGVkW3ddLm9uU3RhY2s9ZmFsc2U7Y21wdC5wdXNoKHcpfXdoaWxlKHYhPT13KTtyZXN1bHRzLnB1c2goY21wdCl9fWcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpe2lmKCFfLmhhcyh2aXNpdGVkLHYpKWRmcyh2KX0pO3JldHVybiByZXN1bHRzfX0seyIuLi9sb2Rhc2giOjE5fV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXRvcHNvcnQ7dG9wc29ydC5DeWNsZUV4Y2VwdGlvbj1DeWNsZUV4Y2VwdGlvbjtmdW5jdGlvbiB0b3Bzb3J0KGcpe3ZhciB2aXNpdGVkPXt9LHN0YWNrPXt9LHJlc3VsdHM9W107ZnVuY3Rpb24gdmlzaXQobm9kZSl7aWYoXy5oYXMoc3RhY2ssbm9kZSkpdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uO2lmKCFfLmhhcyh2aXNpdGVkLG5vZGUpKXtzdGFja1tub2RlXT10cnVlO3Zpc2l0ZWRbbm9kZV09dHJ1ZTtfLmVhY2goZy5wcmVkZWNlc3NvcnMobm9kZSksCnZpc2l0KTtkZWxldGUgc3RhY2tbbm9kZV07cmVzdWx0cy5wdXNoKG5vZGUpfX1fLmVhY2goZy5zaW5rcygpLHZpc2l0KTtpZihfLnNpemUodmlzaXRlZCkhPT1nLm5vZGVDb3VudCgpKXRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbjtyZXR1cm4gcmVzdWx0c31mdW5jdGlvbiBDeWNsZUV4Y2VwdGlvbigpe319LHsiLi4vbG9kYXNoIjoxOX1dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1Qcmlvcml0eVF1ZXVlO2Z1bmN0aW9uIFByaW9yaXR5UXVldWUoKXt0aGlzLl9hcnI9W107dGhpcy5fa2V5SW5kaWNlcz17fX1Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fyci5sZW5ndGh9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXJyLm1hcChmdW5jdGlvbih4KXtyZXR1cm4geC5rZXl9KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuaGFzPQpmdW5jdGlvbihrZXkpe3JldHVybiBfLmhhcyh0aGlzLl9rZXlJbmRpY2VzLGtleSl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLnByaW9yaXR5PWZ1bmN0aW9uKGtleSl7dmFyIGluZGV4PXRoaXMuX2tleUluZGljZXNba2V5XTtpZihpbmRleCE9PXVuZGVmaW5lZClyZXR1cm4gdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUubWluPWZ1bmN0aW9uKCl7aWYodGhpcy5zaXplKCk9PT0wKXRocm93IG5ldyBFcnJvcigiUXVldWUgdW5kZXJmbG93Iik7cmV0dXJuIHRoaXMuX2FyclswXS5rZXl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihrZXkscHJpb3JpdHkpe3ZhciBrZXlJbmRpY2VzPXRoaXMuX2tleUluZGljZXM7a2V5PVN0cmluZyhrZXkpO2lmKCFfLmhhcyhrZXlJbmRpY2VzLGtleSkpe3ZhciBhcnI9dGhpcy5fYXJyO3ZhciBpbmRleD1hcnIubGVuZ3RoO2tleUluZGljZXNba2V5XT1pbmRleDthcnIucHVzaCh7a2V5OmtleSwKcHJpb3JpdHk6cHJpb3JpdHl9KTt0aGlzLl9kZWNyZWFzZShpbmRleCk7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5yZW1vdmVNaW49ZnVuY3Rpb24oKXt0aGlzLl9zd2FwKDAsdGhpcy5fYXJyLmxlbmd0aC0xKTt2YXIgbWluPXRoaXMuX2Fyci5wb3AoKTtkZWxldGUgdGhpcy5fa2V5SW5kaWNlc1ttaW4ua2V5XTt0aGlzLl9oZWFwaWZ5KDApO3JldHVybiBtaW4ua2V5fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5kZWNyZWFzZT1mdW5jdGlvbihrZXkscHJpb3JpdHkpe3ZhciBpbmRleD10aGlzLl9rZXlJbmRpY2VzW2tleV07aWYocHJpb3JpdHk+dGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSl0aHJvdyBuZXcgRXJyb3IoIk5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBwcmlvcml0eS4gIisiS2V5OiAiK2tleSsiIE9sZDogIit0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5KyIgTmV3OiAiK3ByaW9yaXR5KTt0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5PQpwcmlvcml0eTt0aGlzLl9kZWNyZWFzZShpbmRleCl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9oZWFwaWZ5PWZ1bmN0aW9uKGkpe3ZhciBhcnI9dGhpcy5fYXJyO3ZhciBsPTIqaSxyPWwrMSxsYXJnZXN0PWk7aWYobDxhcnIubGVuZ3RoKXtsYXJnZXN0PWFycltsXS5wcmlvcml0eTxhcnJbbGFyZ2VzdF0ucHJpb3JpdHk/bDpsYXJnZXN0O2lmKHI8YXJyLmxlbmd0aClsYXJnZXN0PWFycltyXS5wcmlvcml0eTxhcnJbbGFyZ2VzdF0ucHJpb3JpdHk/cjpsYXJnZXN0O2lmKGxhcmdlc3QhPT1pKXt0aGlzLl9zd2FwKGksbGFyZ2VzdCk7dGhpcy5faGVhcGlmeShsYXJnZXN0KX19fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fZGVjcmVhc2U9ZnVuY3Rpb24oaW5kZXgpe3ZhciBhcnI9dGhpcy5fYXJyO3ZhciBwcmlvcml0eT1hcnJbaW5kZXhdLnByaW9yaXR5O3ZhciBwYXJlbnQ7d2hpbGUoaW5kZXghPT0wKXtwYXJlbnQ9aW5kZXg+PjE7aWYoYXJyW3BhcmVudF0ucHJpb3JpdHk8cHJpb3JpdHkpYnJlYWs7CnRoaXMuX3N3YXAoaW5kZXgscGFyZW50KTtpbmRleD1wYXJlbnR9fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fc3dhcD1mdW5jdGlvbihpLGope3ZhciBhcnI9dGhpcy5fYXJyO3ZhciBrZXlJbmRpY2VzPXRoaXMuX2tleUluZGljZXM7dmFyIG9yaWdBcnJJPWFycltpXTt2YXIgb3JpZ0Fycko9YXJyW2pdO2FycltpXT1vcmlnQXJySjthcnJbal09b3JpZ0Fyckk7a2V5SW5kaWNlc1tvcmlnQXJySi5rZXldPWk7a2V5SW5kaWNlc1tvcmlnQXJySS5rZXldPWp9fSx7Ii4uL2xvZGFzaCI6MTl9XSwxNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1HcmFwaDt2YXIgREVGQVVMVF9FREdFX05BTUU9Ilx4MDAiLEdSQVBIX05PREU9Ilx4MDAiLEVER0VfS0VZX0RFTElNPSJcdTAwMDEiO2Z1bmN0aW9uIEdyYXBoKG9wdHMpe3RoaXMuX2lzRGlyZWN0ZWQ9Xy5oYXMob3B0cywiZGlyZWN0ZWQiKT9vcHRzLmRpcmVjdGVkOgp0cnVlO3RoaXMuX2lzTXVsdGlncmFwaD1fLmhhcyhvcHRzLCJtdWx0aWdyYXBoIik/b3B0cy5tdWx0aWdyYXBoOmZhbHNlO3RoaXMuX2lzQ29tcG91bmQ9Xy5oYXMob3B0cywiY29tcG91bmQiKT9vcHRzLmNvbXBvdW5kOmZhbHNlO3RoaXMuX2xhYmVsPXVuZGVmaW5lZDt0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm49Xy5jb25zdGFudCh1bmRlZmluZWQpO3RoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbj1fLmNvbnN0YW50KHVuZGVmaW5lZCk7dGhpcy5fbm9kZXM9e307aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcGFyZW50PXt9O3RoaXMuX2NoaWxkcmVuPXt9O3RoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdPXt9fXRoaXMuX2luPXt9O3RoaXMuX3ByZWRzPXt9O3RoaXMuX291dD17fTt0aGlzLl9zdWNzPXt9O3RoaXMuX2VkZ2VPYmpzPXt9O3RoaXMuX2VkZ2VMYWJlbHM9e319R3JhcGgucHJvdG90eXBlLl9ub2RlQ291bnQ9MDtHcmFwaC5wcm90b3R5cGUuX2VkZ2VDb3VudD0wO0dyYXBoLnByb3RvdHlwZS5pc0RpcmVjdGVkPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0RpcmVjdGVkfTtHcmFwaC5wcm90b3R5cGUuaXNNdWx0aWdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzTXVsdGlncmFwaH07R3JhcGgucHJvdG90eXBlLmlzQ29tcG91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNDb21wb3VuZH07R3JhcGgucHJvdG90eXBlLnNldEdyYXBoPWZ1bmN0aW9uKGxhYmVsKXt0aGlzLl9sYWJlbD1sYWJlbDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfTtHcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdE5vZGVMYWJlbD1mdW5jdGlvbihuZXdEZWZhdWx0KXtpZighXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKW5ld0RlZmF1bHQ9Xy5jb25zdGFudChuZXdEZWZhdWx0KTt0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm49bmV3RGVmYXVsdDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLm5vZGVDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlQ291bnR9OwpHcmFwaC5wcm90b3R5cGUubm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gXy5rZXlzKHRoaXMuX25vZGVzKX07R3JhcGgucHJvdG90eXBlLnNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3JldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIF8uaXNFbXB0eShzZWxmLl9pblt2XSl9KX07R3JhcGgucHJvdG90eXBlLnNpbmtzPWZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpcztyZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBfLmlzRW1wdHkoc2VsZi5fb3V0W3ZdKX0pfTtHcmFwaC5wcm90b3R5cGUuc2V0Tm9kZXM9ZnVuY3Rpb24odnMsdmFsdWUpe3ZhciBhcmdzPWFyZ3VtZW50czt2YXIgc2VsZj10aGlzO18uZWFjaCh2cyxmdW5jdGlvbih2KXtpZihhcmdzLmxlbmd0aD4xKXNlbGYuc2V0Tm9kZSh2LHZhbHVlKTtlbHNlIHNlbGYuc2V0Tm9kZSh2KX0pO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuc2V0Tm9kZT0KZnVuY3Rpb24odix2YWx1ZSl7aWYoXy5oYXModGhpcy5fbm9kZXMsdikpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl0aGlzLl9ub2Rlc1t2XT12YWx1ZTtyZXR1cm4gdGhpc310aGlzLl9ub2Rlc1t2XT1hcmd1bWVudHMubGVuZ3RoPjE/dmFsdWU6dGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuKHYpO2lmKHRoaXMuX2lzQ29tcG91bmQpe3RoaXMuX3BhcmVudFt2XT1HUkFQSF9OT0RFO3RoaXMuX2NoaWxkcmVuW3ZdPXt9O3RoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdW3ZdPXRydWV9dGhpcy5faW5bdl09e307dGhpcy5fcHJlZHNbdl09e307dGhpcy5fb3V0W3ZdPXt9O3RoaXMuX3N1Y3Nbdl09e307Kyt0aGlzLl9ub2RlQ291bnQ7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5ub2RlPWZ1bmN0aW9uKHYpe3JldHVybiB0aGlzLl9ub2Rlc1t2XX07R3JhcGgucHJvdG90eXBlLmhhc05vZGU9ZnVuY3Rpb24odil7cmV0dXJuIF8uaGFzKHRoaXMuX25vZGVzLHYpfTtHcmFwaC5wcm90b3R5cGUucmVtb3ZlTm9kZT0KZnVuY3Rpb24odil7dmFyIHNlbGY9dGhpcztpZihfLmhhcyh0aGlzLl9ub2Rlcyx2KSl7dmFyIHJlbW92ZUVkZ2U9ZnVuY3Rpb24oZSl7c2VsZi5yZW1vdmVFZGdlKHNlbGYuX2VkZ2VPYmpzW2VdKX07ZGVsZXRlIHRoaXMuX25vZGVzW3ZdO2lmKHRoaXMuX2lzQ29tcG91bmQpe3RoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpO2RlbGV0ZSB0aGlzLl9wYXJlbnRbdl07Xy5lYWNoKHRoaXMuY2hpbGRyZW4odiksZnVuY3Rpb24oY2hpbGQpe3NlbGYuc2V0UGFyZW50KGNoaWxkKX0pO2RlbGV0ZSB0aGlzLl9jaGlsZHJlblt2XX1fLmVhY2goXy5rZXlzKHRoaXMuX2luW3ZdKSxyZW1vdmVFZGdlKTtkZWxldGUgdGhpcy5faW5bdl07ZGVsZXRlIHRoaXMuX3ByZWRzW3ZdO18uZWFjaChfLmtleXModGhpcy5fb3V0W3ZdKSxyZW1vdmVFZGdlKTtkZWxldGUgdGhpcy5fb3V0W3ZdO2RlbGV0ZSB0aGlzLl9zdWNzW3ZdOy0tdGhpcy5fbm9kZUNvdW50fXJldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuc2V0UGFyZW50PQpmdW5jdGlvbih2LHBhcmVudCl7aWYoIXRoaXMuX2lzQ29tcG91bmQpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IHBhcmVudCBpbiBhIG5vbi1jb21wb3VuZCBncmFwaCIpO2lmKF8uaXNVbmRlZmluZWQocGFyZW50KSlwYXJlbnQ9R1JBUEhfTk9ERTtlbHNle3BhcmVudCs9IiI7Zm9yKHZhciBhbmNlc3Rvcj1wYXJlbnQ7IV8uaXNVbmRlZmluZWQoYW5jZXN0b3IpO2FuY2VzdG9yPXRoaXMucGFyZW50KGFuY2VzdG9yKSlpZihhbmNlc3Rvcj09PXYpdGhyb3cgbmV3IEVycm9yKCJTZXR0aW5nICIrcGFyZW50KyIgYXMgcGFyZW50IG9mICIrdisiIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlIik7dGhpcy5zZXROb2RlKHBhcmVudCl9dGhpcy5zZXROb2RlKHYpO3RoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpO3RoaXMuX3BhcmVudFt2XT1wYXJlbnQ7dGhpcy5fY2hpbGRyZW5bcGFyZW50XVt2XT10cnVlO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0PQpmdW5jdGlvbih2KXtkZWxldGUgdGhpcy5fY2hpbGRyZW5bdGhpcy5fcGFyZW50W3ZdXVt2XX07R3JhcGgucHJvdG90eXBlLnBhcmVudD1mdW5jdGlvbih2KXtpZih0aGlzLl9pc0NvbXBvdW5kKXt2YXIgcGFyZW50PXRoaXMuX3BhcmVudFt2XTtpZihwYXJlbnQhPT1HUkFQSF9OT0RFKXJldHVybiBwYXJlbnR9fTtHcmFwaC5wcm90b3R5cGUuY2hpbGRyZW49ZnVuY3Rpb24odil7aWYoXy5pc1VuZGVmaW5lZCh2KSl2PUdSQVBIX05PREU7aWYodGhpcy5faXNDb21wb3VuZCl7dmFyIGNoaWxkcmVuPXRoaXMuX2NoaWxkcmVuW3ZdO2lmKGNoaWxkcmVuKXJldHVybiBfLmtleXMoY2hpbGRyZW4pfWVsc2UgaWYodj09PUdSQVBIX05PREUpcmV0dXJuIHRoaXMubm9kZXMoKTtlbHNlIGlmKHRoaXMuaGFzTm9kZSh2KSlyZXR1cm5bXX07R3JhcGgucHJvdG90eXBlLnByZWRlY2Vzc29ycz1mdW5jdGlvbih2KXt2YXIgcHJlZHNWPXRoaXMuX3ByZWRzW3ZdO2lmKHByZWRzVilyZXR1cm4gXy5rZXlzKHByZWRzVil9OwpHcmFwaC5wcm90b3R5cGUuc3VjY2Vzc29ycz1mdW5jdGlvbih2KXt2YXIgc3Vjc1Y9dGhpcy5fc3Vjc1t2XTtpZihzdWNzVilyZXR1cm4gXy5rZXlzKHN1Y3NWKX07R3JhcGgucHJvdG90eXBlLm5laWdoYm9ycz1mdW5jdGlvbih2KXt2YXIgcHJlZHM9dGhpcy5wcmVkZWNlc3NvcnModik7aWYocHJlZHMpcmV0dXJuIF8udW5pb24ocHJlZHMsdGhpcy5zdWNjZXNzb3JzKHYpKX07R3JhcGgucHJvdG90eXBlLmlzTGVhZj1mdW5jdGlvbih2KXt2YXIgbmVpZ2hib3JzO2lmKHRoaXMuaXNEaXJlY3RlZCgpKW5laWdoYm9ycz10aGlzLnN1Y2Nlc3NvcnModik7ZWxzZSBuZWlnaGJvcnM9dGhpcy5uZWlnaGJvcnModik7cmV0dXJuIG5laWdoYm9ycy5sZW5ndGg9PT0wfTtHcmFwaC5wcm90b3R5cGUuZmlsdGVyTm9kZXM9ZnVuY3Rpb24oZmlsdGVyKXt2YXIgY29weT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih7ZGlyZWN0ZWQ6dGhpcy5faXNEaXJlY3RlZCxtdWx0aWdyYXBoOnRoaXMuX2lzTXVsdGlncmFwaCwKY29tcG91bmQ6dGhpcy5faXNDb21wb3VuZH0pO2NvcHkuc2V0R3JhcGgodGhpcy5ncmFwaCgpKTt2YXIgc2VsZj10aGlzO18uZWFjaCh0aGlzLl9ub2RlcyxmdW5jdGlvbih2YWx1ZSx2KXtpZihmaWx0ZXIodikpY29weS5zZXROb2RlKHYsdmFsdWUpfSk7Xy5lYWNoKHRoaXMuX2VkZ2VPYmpzLGZ1bmN0aW9uKGUpe2lmKGNvcHkuaGFzTm9kZShlLnYpJiZjb3B5Lmhhc05vZGUoZS53KSljb3B5LnNldEVkZ2UoZSxzZWxmLmVkZ2UoZSkpfSk7dmFyIHBhcmVudHM9e307ZnVuY3Rpb24gZmluZFBhcmVudCh2KXt2YXIgcGFyZW50PXNlbGYucGFyZW50KHYpO2lmKHBhcmVudD09PXVuZGVmaW5lZHx8Y29weS5oYXNOb2RlKHBhcmVudCkpe3BhcmVudHNbdl09cGFyZW50O3JldHVybiBwYXJlbnR9ZWxzZSBpZihwYXJlbnQgaW4gcGFyZW50cylyZXR1cm4gcGFyZW50c1twYXJlbnRdO2Vsc2UgcmV0dXJuIGZpbmRQYXJlbnQocGFyZW50KX1pZih0aGlzLl9pc0NvbXBvdW5kKV8uZWFjaChjb3B5Lm5vZGVzKCksCmZ1bmN0aW9uKHYpe2NvcHkuc2V0UGFyZW50KHYsZmluZFBhcmVudCh2KSl9KTtyZXR1cm4gY29weX07R3JhcGgucHJvdG90eXBlLnNldERlZmF1bHRFZGdlTGFiZWw9ZnVuY3Rpb24obmV3RGVmYXVsdCl7aWYoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSluZXdEZWZhdWx0PV8uY29uc3RhbnQobmV3RGVmYXVsdCk7dGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPW5ld0RlZmF1bHQ7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5lZGdlQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZUNvdW50fTtHcmFwaC5wcm90b3R5cGUuZWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gXy52YWx1ZXModGhpcy5fZWRnZU9ianMpfTtHcmFwaC5wcm90b3R5cGUuc2V0UGF0aD1mdW5jdGlvbih2cyx2YWx1ZSl7dmFyIHNlbGY9dGhpcyxhcmdzPWFyZ3VtZW50cztfLnJlZHVjZSh2cyxmdW5jdGlvbih2LHcpe2lmKGFyZ3MubGVuZ3RoPjEpc2VsZi5zZXRFZGdlKHYsdyx2YWx1ZSk7ZWxzZSBzZWxmLnNldEVkZ2UodiwKdyk7cmV0dXJuIHd9KTtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLnNldEVkZ2U9ZnVuY3Rpb24oKXt2YXIgdix3LG5hbWUsdmFsdWUsdmFsdWVTcGVjaWZpZWQ9ZmFsc2UsYXJnMD1hcmd1bWVudHNbMF07aWYodHlwZW9mIGFyZzA9PT0ib2JqZWN0IiYmYXJnMCE9PW51bGwmJiJ2ImluIGFyZzApe3Y9YXJnMC52O3c9YXJnMC53O25hbWU9YXJnMC5uYW1lO2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yKXt2YWx1ZT1hcmd1bWVudHNbMV07dmFsdWVTcGVjaWZpZWQ9dHJ1ZX19ZWxzZXt2PWFyZzA7dz1hcmd1bWVudHNbMV07bmFtZT1hcmd1bWVudHNbM107aWYoYXJndW1lbnRzLmxlbmd0aD4yKXt2YWx1ZT1hcmd1bWVudHNbMl07dmFsdWVTcGVjaWZpZWQ9dHJ1ZX19dj0iIit2O3c9IiIrdztpZighXy5pc1VuZGVmaW5lZChuYW1lKSluYW1lPSIiK25hbWU7dmFyIGU9ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO2lmKF8uaGFzKHRoaXMuX2VkZ2VMYWJlbHMsCmUpKXtpZih2YWx1ZVNwZWNpZmllZCl0aGlzLl9lZGdlTGFiZWxzW2VdPXZhbHVlO3JldHVybiB0aGlzfWlmKCFfLmlzVW5kZWZpbmVkKG5hbWUpJiYhdGhpcy5faXNNdWx0aWdyYXBoKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNldCBhIG5hbWVkIGVkZ2Ugd2hlbiBpc011bHRpZ3JhcGggXHgzZCBmYWxzZSIpO3RoaXMuc2V0Tm9kZSh2KTt0aGlzLnNldE5vZGUodyk7dGhpcy5fZWRnZUxhYmVsc1tlXT12YWx1ZVNwZWNpZmllZD92YWx1ZTp0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4odix3LG5hbWUpO3ZhciBlZGdlT2JqPWVkZ2VBcmdzVG9PYmoodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7dj1lZGdlT2JqLnY7dz1lZGdlT2JqLnc7T2JqZWN0LmZyZWV6ZShlZGdlT2JqKTt0aGlzLl9lZGdlT2Jqc1tlXT1lZGdlT2JqO2luY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3ByZWRzW3ddLHYpO2luY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3N1Y3Nbdl0sdyk7dGhpcy5faW5bd11bZV09CmVkZ2VPYmo7dGhpcy5fb3V0W3ZdW2VdPWVkZ2VPYmo7dGhpcy5fZWRnZUNvdW50Kys7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5lZGdlPWZ1bmN0aW9uKHYsdyxuYW1lKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPT09MT9lZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO3JldHVybiB0aGlzLl9lZGdlTGFiZWxzW2VdfTtHcmFwaC5wcm90b3R5cGUuaGFzRWRnZT1mdW5jdGlvbih2LHcsbmFtZSl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD09PTE/ZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOmVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTtyZXR1cm4gXy5oYXModGhpcy5fZWRnZUxhYmVscyxlKX07R3JhcGgucHJvdG90eXBlLnJlbW92ZUVkZ2U9ZnVuY3Rpb24odix3LG5hbWUpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg9PT0xPwplZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpLGVkZ2U9dGhpcy5fZWRnZU9ianNbZV07aWYoZWRnZSl7dj1lZGdlLnY7dz1lZGdlLnc7ZGVsZXRlIHRoaXMuX2VkZ2VMYWJlbHNbZV07ZGVsZXRlIHRoaXMuX2VkZ2VPYmpzW2VdO2RlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fcHJlZHNbd10sdik7ZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9zdWNzW3ZdLHcpO2RlbGV0ZSB0aGlzLl9pblt3XVtlXTtkZWxldGUgdGhpcy5fb3V0W3ZdW2VdO3RoaXMuX2VkZ2VDb3VudC0tfXJldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuaW5FZGdlcz1mdW5jdGlvbih2LHUpe3ZhciBpblY9dGhpcy5faW5bdl07aWYoaW5WKXt2YXIgZWRnZXM9Xy52YWx1ZXMoaW5WKTtpZighdSlyZXR1cm4gZWRnZXM7cmV0dXJuIF8uZmlsdGVyKGVkZ2VzLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBlZGdlLnY9PT0KdX0pfX07R3JhcGgucHJvdG90eXBlLm91dEVkZ2VzPWZ1bmN0aW9uKHYsdyl7dmFyIG91dFY9dGhpcy5fb3V0W3ZdO2lmKG91dFYpe3ZhciBlZGdlcz1fLnZhbHVlcyhvdXRWKTtpZighdylyZXR1cm4gZWRnZXM7cmV0dXJuIF8uZmlsdGVyKGVkZ2VzLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBlZGdlLnc9PT13fSl9fTtHcmFwaC5wcm90b3R5cGUubm9kZUVkZ2VzPWZ1bmN0aW9uKHYsdyl7dmFyIGluRWRnZXM9dGhpcy5pbkVkZ2VzKHYsdyk7aWYoaW5FZGdlcylyZXR1cm4gaW5FZGdlcy5jb25jYXQodGhpcy5vdXRFZGdlcyh2LHcpKX07ZnVuY3Rpb24gaW5jcmVtZW50T3JJbml0RW50cnkobWFwLGspe2lmKG1hcFtrXSltYXBba10rKztlbHNlIG1hcFtrXT0xfWZ1bmN0aW9uIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkobWFwLGspe2lmKCEtLW1hcFtrXSlkZWxldGUgbWFwW2tdfWZ1bmN0aW9uIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLHZfLHdfLG5hbWUpe3ZhciB2PSIiK3ZfO3ZhciB3PQoiIit3XztpZighaXNEaXJlY3RlZCYmdj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXJldHVybiB2K0VER0VfS0VZX0RFTElNK3crRURHRV9LRVlfREVMSU0rKF8uaXNVbmRlZmluZWQobmFtZSk/REVGQVVMVF9FREdFX05BTUU6bmFtZSl9ZnVuY3Rpb24gZWRnZUFyZ3NUb09iaihpc0RpcmVjdGVkLHZfLHdfLG5hbWUpe3ZhciB2PSIiK3ZfO3ZhciB3PSIiK3dfO2lmKCFpc0RpcmVjdGVkJiZ2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9dmFyIGVkZ2VPYmo9e3Y6dix3Ond9O2lmKG5hbWUpZWRnZU9iai5uYW1lPW5hbWU7cmV0dXJuIGVkZ2VPYmp9ZnVuY3Rpb24gZWRnZU9ialRvSWQoaXNEaXJlY3RlZCxlZGdlT2JqKXtyZXR1cm4gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsZWRnZU9iai52LGVkZ2VPYmoudyxlZGdlT2JqLm5hbWUpfX0seyIuL2xvZGFzaCI6MTl9XSwxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9e0dyYXBoOnJlcXVpcmUoIi4vZ3JhcGgiKSwKdmVyc2lvbjpyZXF1aXJlKCIuL3ZlcnNpb24iKX19LHsiLi9ncmFwaCI6MTYsIi4vdmVyc2lvbiI6MjB9XSwxODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBoIik7bW9kdWxlLmV4cG9ydHM9e3dyaXRlOndyaXRlLHJlYWQ6cmVhZH07ZnVuY3Rpb24gd3JpdGUoZyl7dmFyIGpzb249e29wdGlvbnM6e2RpcmVjdGVkOmcuaXNEaXJlY3RlZCgpLG11bHRpZ3JhcGg6Zy5pc011bHRpZ3JhcGgoKSxjb21wb3VuZDpnLmlzQ29tcG91bmQoKX0sbm9kZXM6d3JpdGVOb2RlcyhnKSxlZGdlczp3cml0ZUVkZ2VzKGcpfTtpZighXy5pc1VuZGVmaW5lZChnLmdyYXBoKCkpKWpzb24udmFsdWU9Xy5jbG9uZShnLmdyYXBoKCkpO3JldHVybiBqc29ufWZ1bmN0aW9uIHdyaXRlTm9kZXMoZyl7cmV0dXJuIF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZVZhbHVlPWcubm9kZSh2KSxwYXJlbnQ9CmcucGFyZW50KHYpLG5vZGU9e3Y6dn07aWYoIV8uaXNVbmRlZmluZWQobm9kZVZhbHVlKSlub2RlLnZhbHVlPW5vZGVWYWx1ZTtpZighXy5pc1VuZGVmaW5lZChwYXJlbnQpKW5vZGUucGFyZW50PXBhcmVudDtyZXR1cm4gbm9kZX0pfWZ1bmN0aW9uIHdyaXRlRWRnZXMoZyl7cmV0dXJuIF8ubWFwKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZVZhbHVlPWcuZWRnZShlKSxlZGdlPXt2OmUudix3OmUud307aWYoIV8uaXNVbmRlZmluZWQoZS5uYW1lKSllZGdlLm5hbWU9ZS5uYW1lO2lmKCFfLmlzVW5kZWZpbmVkKGVkZ2VWYWx1ZSkpZWRnZS52YWx1ZT1lZGdlVmFsdWU7cmV0dXJuIGVkZ2V9KX1mdW5jdGlvbiByZWFkKGpzb24pe3ZhciBnPShuZXcgR3JhcGgoanNvbi5vcHRpb25zKSkuc2V0R3JhcGgoanNvbi52YWx1ZSk7Xy5lYWNoKGpzb24ubm9kZXMsZnVuY3Rpb24oZW50cnkpe2cuc2V0Tm9kZShlbnRyeS52LGVudHJ5LnZhbHVlKTtpZihlbnRyeS5wYXJlbnQpZy5zZXRQYXJlbnQoZW50cnkudiwKZW50cnkucGFyZW50KX0pO18uZWFjaChqc29uLmVkZ2VzLGZ1bmN0aW9uKGVudHJ5KXtnLnNldEVkZ2Uoe3Y6ZW50cnkudix3OmVudHJ5LncsbmFtZTplbnRyeS5uYW1lfSxlbnRyeS52YWx1ZSl9KTtyZXR1cm4gZ319LHsiLi9ncmFwaCI6MTYsIi4vbG9kYXNoIjoxOX1dLDE5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgbG9kYXNoO2lmKHR5cGVvZiByZXF1aXJlPT09ImZ1bmN0aW9uIil0cnl7bG9kYXNoPXJlcXVpcmUoImxvZGFzaCIpfWNhdGNoKGUpe31pZighbG9kYXNoKWxvZGFzaD13aW5kb3cuXzttb2R1bGUuZXhwb3J0cz1sb2Rhc2h9LHsibG9kYXNoIjp1bmRlZmluZWR9XSwyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9IjIuMS41In0se31dfSx7fSxbMV0pKDEpfSk7CihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpbW9kdWxlLmV4cG9ydHM9ZigpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpZGVmaW5lKFtdLGYpO2Vsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiKWc9d2luZG93O2Vsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKWc9Z2xvYmFsO2Vsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIilnPXNlbGY7ZWxzZSBnPXRoaXM7Zy5kYWdyZT1mKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPQpuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixmO312YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17Z3JhcGhsaWI6cmVxdWlyZSgiLi9saWIvZ3JhcGhsaWIiKSxsYXlvdXQ6cmVxdWlyZSgiLi9saWIvbGF5b3V0IiksZGVidWc6cmVxdWlyZSgiLi9saWIvZGVidWciKSx1dGlsOnt0aW1lOnJlcXVpcmUoIi4vbGliL3V0aWwiKS50aW1lLG5vdGltZTpyZXF1aXJlKCIuL2xpYi91dGlsIikubm90aW1lfSwKdmVyc2lvbjpyZXF1aXJlKCIuL2xpYi92ZXJzaW9uIil9fSx7Ii4vbGliL2RlYnVnIjo2LCIuL2xpYi9ncmFwaGxpYiI6NywiLi9saWIvbGF5b3V0Ijo5LCIuL2xpYi91dGlsIjoyOSwiLi9saWIvdmVyc2lvbiI6MzB9XSwyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLGdyZWVkeUZBUz1yZXF1aXJlKCIuL2dyZWVkeS1mYXMiKTttb2R1bGUuZXhwb3J0cz17cnVuOnJ1bix1bmRvOnVuZG99O2Z1bmN0aW9uIHJ1bihnKXt2YXIgZmFzPWcuZ3JhcGgoKS5hY3ljbGljZXI9PT0iZ3JlZWR5Ij9ncmVlZHlGQVMoZyx3ZWlnaHRGbihnKSk6ZGZzRkFTKGcpO18uZm9yRWFjaChmYXMsZnVuY3Rpb24oZSl7dmFyIGxhYmVsPWcuZWRnZShlKTtnLnJlbW92ZUVkZ2UoZSk7bGFiZWwuZm9yd2FyZE5hbWU9ZS5uYW1lO2xhYmVsLnJldmVyc2VkPXRydWU7Zy5zZXRFZGdlKGUudyxlLnYsbGFiZWwsXy51bmlxdWVJZCgicmV2IikpfSk7ZnVuY3Rpb24gd2VpZ2h0Rm4oZyl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBnLmVkZ2UoZSkud2VpZ2h0fX0KfWZ1bmN0aW9uIGRmc0ZBUyhnKXt2YXIgZmFzPVtdLHN0YWNrPXt9LHZpc2l0ZWQ9e307ZnVuY3Rpb24gZGZzKHYpe2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuO3Zpc2l0ZWRbdl09dHJ1ZTtzdGFja1t2XT10cnVlO18uZm9yRWFjaChnLm91dEVkZ2VzKHYpLGZ1bmN0aW9uKGUpe2lmKF8uaGFzKHN0YWNrLGUudykpZmFzLnB1c2goZSk7ZWxzZSBkZnMoZS53KX0pO2RlbGV0ZSBzdGFja1t2XX1fLmZvckVhY2goZy5ub2RlcygpLGRmcyk7cmV0dXJuIGZhc31mdW5jdGlvbiB1bmRvKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGxhYmVsPWcuZWRnZShlKTtpZihsYWJlbC5yZXZlcnNlZCl7Zy5yZW1vdmVFZGdlKGUpO3ZhciBmb3J3YXJkTmFtZT1sYWJlbC5mb3J3YXJkTmFtZTtkZWxldGUgbGFiZWwucmV2ZXJzZWQ7ZGVsZXRlIGxhYmVsLmZvcndhcmROYW1lO2cuc2V0RWRnZShlLncsZS52LGxhYmVsLGZvcndhcmROYW1lKX19KX19LHsiLi9ncmVlZHktZmFzIjo4LAoiLi9sb2Rhc2giOjEwfV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPWFkZEJvcmRlclNlZ21lbnRzO2Z1bmN0aW9uIGFkZEJvcmRlclNlZ21lbnRzKGcpe2Z1bmN0aW9uIGRmcyh2KXt2YXIgY2hpbGRyZW49Zy5jaGlsZHJlbih2KSxub2RlPWcubm9kZSh2KTtpZihjaGlsZHJlbi5sZW5ndGgpXy5mb3JFYWNoKGNoaWxkcmVuLGRmcyk7aWYoXy5oYXMobm9kZSwibWluUmFuayIpKXtub2RlLmJvcmRlckxlZnQ9W107bm9kZS5ib3JkZXJSaWdodD1bXTtmb3IodmFyIHJhbms9bm9kZS5taW5SYW5rLG1heFJhbms9bm9kZS5tYXhSYW5rKzE7cmFuazxtYXhSYW5rOysrcmFuayl7YWRkQm9yZGVyTm9kZShnLCJib3JkZXJMZWZ0IiwiX2JsIix2LG5vZGUscmFuayk7YWRkQm9yZGVyTm9kZShnLCJib3JkZXJSaWdodCIsIl9iciIsdixub2RlLHJhbmspfX19Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwKZGZzKX1mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcscHJvcCxwcmVmaXgsc2csc2dOb2RlLHJhbmspe3ZhciBsYWJlbD17d2lkdGg6MCxoZWlnaHQ6MCxyYW5rOnJhbmssYm9yZGVyVHlwZTpwcm9wfSxwcmV2PXNnTm9kZVtwcm9wXVtyYW5rLTFdLGN1cnI9dXRpbC5hZGREdW1teU5vZGUoZywiYm9yZGVyIixsYWJlbCxwcmVmaXgpO3NnTm9kZVtwcm9wXVtyYW5rXT1jdXJyO2cuc2V0UGFyZW50KGN1cnIsc2cpO2lmKHByZXYpZy5zZXRFZGdlKHByZXYsY3Vycix7d2VpZ2h0OjF9KX19LHsiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz17YWRqdXN0OmFkanVzdCx1bmRvOnVuZG99O2Z1bmN0aW9uIGFkanVzdChnKXt2YXIgcmFua0Rpcj1nLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO2lmKHJhbmtEaXI9PT0ibHIifHxyYW5rRGlyPT09InJsIilzd2FwV2lkdGhIZWlnaHQoZyl9CmZ1bmN0aW9uIHVuZG8oZyl7dmFyIHJhbmtEaXI9Zy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtpZihyYW5rRGlyPT09ImJ0Inx8cmFua0Rpcj09PSJybCIpcmV2ZXJzZVkoZyk7aWYocmFua0Rpcj09PSJsciJ8fHJhbmtEaXI9PT0icmwiKXtzd2FwWFkoZyk7c3dhcFdpZHRoSGVpZ2h0KGcpfX1mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHQoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtzd2FwV2lkdGhIZWlnaHRPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7c3dhcFdpZHRoSGVpZ2h0T25lKGcuZWRnZShlKSl9KX1mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHRPbmUoYXR0cnMpe3ZhciB3PWF0dHJzLndpZHRoO2F0dHJzLndpZHRoPWF0dHJzLmhlaWdodDthdHRycy5oZWlnaHQ9d31mdW5jdGlvbiByZXZlcnNlWShnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldmVyc2VZT25lKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7Xy5mb3JFYWNoKGVkZ2UucG9pbnRzLHJldmVyc2VZT25lKTtpZihfLmhhcyhlZGdlLCJ5IikpcmV2ZXJzZVlPbmUoZWRnZSl9KX1mdW5jdGlvbiByZXZlcnNlWU9uZShhdHRycyl7YXR0cnMueT0tYXR0cnMueX1mdW5jdGlvbiBzd2FwWFkoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtzd2FwWFlPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO18uZm9yRWFjaChlZGdlLnBvaW50cyxzd2FwWFlPbmUpO2lmKF8uaGFzKGVkZ2UsIngiKSlzd2FwWFlPbmUoZWRnZSl9KX1mdW5jdGlvbiBzd2FwWFlPbmUoYXR0cnMpe3ZhciB4PWF0dHJzLng7YXR0cnMueD1hdHRycy55O2F0dHJzLnk9eH19LHsiLi9sb2Rhc2giOjEwfV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9TGlzdDtmdW5jdGlvbiBMaXN0KCl7dmFyIHNlbnRpbmVsPQp7fTtzZW50aW5lbC5fbmV4dD1zZW50aW5lbC5fcHJldj1zZW50aW5lbDt0aGlzLl9zZW50aW5lbD1zZW50aW5lbH1MaXN0LnByb3RvdHlwZS5kZXF1ZXVlPWZ1bmN0aW9uKCl7dmFyIHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsLGVudHJ5PXNlbnRpbmVsLl9wcmV2O2lmKGVudHJ5IT09c2VudGluZWwpe3VubGluayhlbnRyeSk7cmV0dXJuIGVudHJ5fX07TGlzdC5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbihlbnRyeSl7dmFyIHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsO2lmKGVudHJ5Ll9wcmV2JiZlbnRyeS5fbmV4dCl1bmxpbmsoZW50cnkpO2VudHJ5Ll9uZXh0PXNlbnRpbmVsLl9uZXh0O3NlbnRpbmVsLl9uZXh0Ll9wcmV2PWVudHJ5O3NlbnRpbmVsLl9uZXh0PWVudHJ5O2VudHJ5Ll9wcmV2PXNlbnRpbmVsfTtMaXN0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBzdHJzPVtdLHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsLGN1cnI9c2VudGluZWwuX3ByZXY7d2hpbGUoY3VyciE9PQpzZW50aW5lbCl7c3Rycy5wdXNoKEpTT04uc3RyaW5naWZ5KGN1cnIsZmlsdGVyT3V0TGlua3MpKTtjdXJyPWN1cnIuX3ByZXZ9cmV0dXJuIlsiK3N0cnMuam9pbigiLCAiKSsiXSJ9O2Z1bmN0aW9uIHVubGluayhlbnRyeSl7ZW50cnkuX3ByZXYuX25leHQ9ZW50cnkuX25leHQ7ZW50cnkuX25leHQuX3ByZXY9ZW50cnkuX3ByZXY7ZGVsZXRlIGVudHJ5Ll9uZXh0O2RlbGV0ZSBlbnRyeS5fcHJldn1mdW5jdGlvbiBmaWx0ZXJPdXRMaW5rcyhrLHYpe2lmKGshPT0iX25leHQiJiZrIT09Il9wcmV2IilyZXR1cm4gdn19LHt9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPXtkZWJ1Z09yZGVyaW5nOmRlYnVnT3JkZXJpbmd9O2Z1bmN0aW9uIGRlYnVnT3JkZXJpbmcoZyl7dmFyIGxheWVyTWF0cml4PQp1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7dmFyIGg9KG5ldyBHcmFwaCh7Y29tcG91bmQ6dHJ1ZSxtdWx0aWdyYXBoOnRydWV9KSkuc2V0R3JhcGgoe30pO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7aC5zZXROb2RlKHYse2xhYmVsOnZ9KTtoLnNldFBhcmVudCh2LCJsYXllciIrZy5ub2RlKHYpLnJhbmspfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtoLnNldEVkZ2UoZS52LGUudyx7fSxlLm5hbWUpfSk7Xy5mb3JFYWNoKGxheWVyTWF0cml4LGZ1bmN0aW9uKGxheWVyLGkpe3ZhciBsYXllclY9ImxheWVyIitpO2guc2V0Tm9kZShsYXllclYse3Jhbms6InNhbWUifSk7Xy5yZWR1Y2UobGF5ZXIsZnVuY3Rpb24odSx2KXtoLnNldEVkZ2UodSx2LHtzdHlsZToiaW52aXMifSk7cmV0dXJuIHZ9KX0pO3JldHVybiBofX0seyIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZ3JhcGhsaWI7CmlmKHR5cGVvZiByZXF1aXJlPT09ImZ1bmN0aW9uIil0cnl7Z3JhcGhsaWI9cmVxdWlyZSgiZ3JhcGhsaWIiKX1jYXRjaChlKXt9aWYoIWdyYXBobGliKWdyYXBobGliPXdpbmRvdy5ncmFwaGxpYjttb2R1bGUuZXhwb3J0cz1ncmFwaGxpYn0seyJncmFwaGxpYiI6dW5kZWZpbmVkfV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGgsTGlzdD1yZXF1aXJlKCIuL2RhdGEvbGlzdCIpO21vZHVsZS5leHBvcnRzPWdyZWVkeUZBUzt2YXIgREVGQVVMVF9XRUlHSFRfRk49Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBncmVlZHlGQVMoZyx3ZWlnaHRGbil7aWYoZy5ub2RlQ291bnQoKTw9MSlyZXR1cm5bXTt2YXIgc3RhdGU9YnVpbGRTdGF0ZShnLHdlaWdodEZufHxERUZBVUxUX1dFSUdIVF9GTik7dmFyIHJlc3VsdHM9ZG9HcmVlZHlGQVMoc3RhdGUuZ3JhcGgsc3RhdGUuYnVja2V0cywKc3RhdGUuemVyb0lkeCk7cmV0dXJuIF8uZmxhdHRlbihfLm1hcChyZXN1bHRzLGZ1bmN0aW9uKGUpe3JldHVybiBnLm91dEVkZ2VzKGUudixlLncpfSksdHJ1ZSl9ZnVuY3Rpb24gZG9HcmVlZHlGQVMoZyxidWNrZXRzLHplcm9JZHgpe3ZhciByZXN1bHRzPVtdLHNvdXJjZXM9YnVja2V0c1tidWNrZXRzLmxlbmd0aC0xXSxzaW5rcz1idWNrZXRzWzBdO3ZhciBlbnRyeTt3aGlsZShnLm5vZGVDb3VudCgpKXt3aGlsZShlbnRyeT1zaW5rcy5kZXF1ZXVlKCkpcmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCxlbnRyeSk7d2hpbGUoZW50cnk9c291cmNlcy5kZXF1ZXVlKCkpcmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCxlbnRyeSk7aWYoZy5ub2RlQ291bnQoKSlmb3IodmFyIGk9YnVja2V0cy5sZW5ndGgtMjtpPjA7LS1pKXtlbnRyeT1idWNrZXRzW2ldLmRlcXVldWUoKTtpZihlbnRyeSl7cmVzdWx0cz1yZXN1bHRzLmNvbmNhdChyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LAplbnRyeSx0cnVlKSk7YnJlYWt9fX1yZXR1cm4gcmVzdWx0c31mdW5jdGlvbiByZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5LGNvbGxlY3RQcmVkZWNlc3NvcnMpe3ZhciByZXN1bHRzPWNvbGxlY3RQcmVkZWNlc3NvcnM/W106dW5kZWZpbmVkO18uZm9yRWFjaChnLmluRWRnZXMoZW50cnkudiksZnVuY3Rpb24oZWRnZSl7dmFyIHdlaWdodD1nLmVkZ2UoZWRnZSksdUVudHJ5PWcubm9kZShlZGdlLnYpO2lmKGNvbGxlY3RQcmVkZWNlc3NvcnMpcmVzdWx0cy5wdXNoKHt2OmVkZ2Uudix3OmVkZ2Uud30pO3VFbnRyeS5vdXQtPXdlaWdodDthc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LHVFbnRyeSl9KTtfLmZvckVhY2goZy5vdXRFZGdlcyhlbnRyeS52KSxmdW5jdGlvbihlZGdlKXt2YXIgd2VpZ2h0PWcuZWRnZShlZGdlKSx3PWVkZ2Uudyx3RW50cnk9Zy5ub2RlKHcpO3dFbnRyeVsiaW4iXS09d2VpZ2h0O2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsd0VudHJ5KX0pOwpnLnJlbW92ZU5vZGUoZW50cnkudik7cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gYnVpbGRTdGF0ZShnLHdlaWdodEZuKXt2YXIgZmFzR3JhcGg9bmV3IEdyYXBoLG1heEluPTAsbWF4T3V0PTA7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtmYXNHcmFwaC5zZXROb2RlKHYse3Y6diwiaW4iOjAsb3V0OjB9KX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIHByZXZXZWlnaHQ9ZmFzR3JhcGguZWRnZShlLnYsZS53KXx8MCx3ZWlnaHQ9d2VpZ2h0Rm4oZSksZWRnZVdlaWdodD1wcmV2V2VpZ2h0K3dlaWdodDtmYXNHcmFwaC5zZXRFZGdlKGUudixlLncsZWRnZVdlaWdodCk7bWF4T3V0PU1hdGgubWF4KG1heE91dCxmYXNHcmFwaC5ub2RlKGUudikub3V0Kz13ZWlnaHQpO21heEluPU1hdGgubWF4KG1heEluLGZhc0dyYXBoLm5vZGUoZS53KVsiaW4iXSs9d2VpZ2h0KX0pO3ZhciBidWNrZXRzPV8ucmFuZ2UobWF4T3V0K21heEluKzMpLm1hcChmdW5jdGlvbigpe3JldHVybiBuZXcgTGlzdH0pOwp2YXIgemVyb0lkeD1tYXhJbisxO18uZm9yRWFjaChmYXNHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsZmFzR3JhcGgubm9kZSh2KSl9KTtyZXR1cm57Z3JhcGg6ZmFzR3JhcGgsYnVja2V0czpidWNrZXRzLHplcm9JZHg6emVyb0lkeH19ZnVuY3Rpb24gYXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCxlbnRyeSl7aWYoIWVudHJ5Lm91dClidWNrZXRzWzBdLmVucXVldWUoZW50cnkpO2Vsc2UgaWYoIWVudHJ5WyJpbiJdKWJ1Y2tldHNbYnVja2V0cy5sZW5ndGgtMV0uZW5xdWV1ZShlbnRyeSk7ZWxzZSBidWNrZXRzW2VudHJ5Lm91dC1lbnRyeVsiaW4iXSt6ZXJvSWR4XS5lbnF1ZXVlKGVudHJ5KX19LHsiLi9kYXRhL2xpc3QiOjUsIi4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMH1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksYWN5Y2xpYz1yZXF1aXJlKCIuL2FjeWNsaWMiKSwKbm9ybWFsaXplPXJlcXVpcmUoIi4vbm9ybWFsaXplIikscmFuaz1yZXF1aXJlKCIuL3JhbmsiKSxub3JtYWxpemVSYW5rcz1yZXF1aXJlKCIuL3V0aWwiKS5ub3JtYWxpemVSYW5rcyxwYXJlbnREdW1teUNoYWlucz1yZXF1aXJlKCIuL3BhcmVudC1kdW1teS1jaGFpbnMiKSxyZW1vdmVFbXB0eVJhbmtzPXJlcXVpcmUoIi4vdXRpbCIpLnJlbW92ZUVtcHR5UmFua3MsbmVzdGluZ0dyYXBoPXJlcXVpcmUoIi4vbmVzdGluZy1ncmFwaCIpLGFkZEJvcmRlclNlZ21lbnRzPXJlcXVpcmUoIi4vYWRkLWJvcmRlci1zZWdtZW50cyIpLGNvb3JkaW5hdGVTeXN0ZW09cmVxdWlyZSgiLi9jb29yZGluYXRlLXN5c3RlbSIpLG9yZGVyPXJlcXVpcmUoIi4vb3JkZXIiKSxwb3NpdGlvbj1yZXF1aXJlKCIuL3Bvc2l0aW9uIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9bGF5b3V0O2Z1bmN0aW9uIGxheW91dChnLG9wdHMpe3ZhciB0aW1lPQpvcHRzJiZvcHRzLmRlYnVnVGltaW5nP3V0aWwudGltZTp1dGlsLm5vdGltZTt0aW1lKCJsYXlvdXQiLGZ1bmN0aW9uKCl7dmFyIGxheW91dEdyYXBoPXRpbWUoIiAgYnVpbGRMYXlvdXRHcmFwaCIsZnVuY3Rpb24oKXtyZXR1cm4gYnVpbGRMYXlvdXRHcmFwaChnKX0pO3RpbWUoIiAgcnVuTGF5b3V0IixmdW5jdGlvbigpe3J1bkxheW91dChsYXlvdXRHcmFwaCx0aW1lKX0pO3RpbWUoIiAgdXBkYXRlSW5wdXRHcmFwaCIsZnVuY3Rpb24oKXt1cGRhdGVJbnB1dEdyYXBoKGcsbGF5b3V0R3JhcGgpfSl9KX1mdW5jdGlvbiBydW5MYXlvdXQoZyx0aW1lKXt0aW1lKCIgICAgbWFrZVNwYWNlRm9yRWRnZUxhYmVscyIsZnVuY3Rpb24oKXttYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpfSk7dGltZSgiICAgIHJlbW92ZVNlbGZFZGdlcyIsZnVuY3Rpb24oKXtyZW1vdmVTZWxmRWRnZXMoZyl9KTt0aW1lKCIgICAgYWN5Y2xpYyIsZnVuY3Rpb24oKXthY3ljbGljLnJ1bihnKX0pO3RpbWUoIiAgICBuZXN0aW5nR3JhcGgucnVuIiwKZnVuY3Rpb24oKXtuZXN0aW5nR3JhcGgucnVuKGcpfSk7dGltZSgiICAgIHJhbmsiLGZ1bmN0aW9uKCl7cmFuayh1dGlsLmFzTm9uQ29tcG91bmRHcmFwaChnKSl9KTt0aW1lKCIgICAgaW5qZWN0RWRnZUxhYmVsUHJveGllcyIsZnVuY3Rpb24oKXtpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpfSk7dGltZSgiICAgIHJlbW92ZUVtcHR5UmFua3MiLGZ1bmN0aW9uKCl7cmVtb3ZlRW1wdHlSYW5rcyhnKX0pO3RpbWUoIiAgICBuZXN0aW5nR3JhcGguY2xlYW51cCIsZnVuY3Rpb24oKXtuZXN0aW5nR3JhcGguY2xlYW51cChnKX0pO3RpbWUoIiAgICBub3JtYWxpemVSYW5rcyIsZnVuY3Rpb24oKXtub3JtYWxpemVSYW5rcyhnKX0pO3RpbWUoIiAgICBhc3NpZ25SYW5rTWluTWF4IixmdW5jdGlvbigpe2Fzc2lnblJhbmtNaW5NYXgoZyl9KTt0aW1lKCIgICAgcmVtb3ZlRWRnZUxhYmVsUHJveGllcyIsZnVuY3Rpb24oKXtyZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZS5ydW4iLApmdW5jdGlvbigpe25vcm1hbGl6ZS5ydW4oZyl9KTt0aW1lKCIgICAgcGFyZW50RHVtbXlDaGFpbnMiLGZ1bmN0aW9uKCl7cGFyZW50RHVtbXlDaGFpbnMoZyl9KTt0aW1lKCIgICAgYWRkQm9yZGVyU2VnbWVudHMiLGZ1bmN0aW9uKCl7YWRkQm9yZGVyU2VnbWVudHMoZyl9KTt0aW1lKCIgICAgb3JkZXIiLGZ1bmN0aW9uKCl7b3JkZXIoZyl9KTt0aW1lKCIgICAgaW5zZXJ0U2VsZkVkZ2VzIixmdW5jdGlvbigpe2luc2VydFNlbGZFZGdlcyhnKX0pO3RpbWUoIiAgICBhZGp1c3RDb29yZGluYXRlU3lzdGVtIixmdW5jdGlvbigpe2Nvb3JkaW5hdGVTeXN0ZW0uYWRqdXN0KGcpfSk7dGltZSgiICAgIHBvc2l0aW9uIixmdW5jdGlvbigpe3Bvc2l0aW9uKGcpfSk7dGltZSgiICAgIHBvc2l0aW9uU2VsZkVkZ2VzIixmdW5jdGlvbigpe3Bvc2l0aW9uU2VsZkVkZ2VzKGcpfSk7dGltZSgiICAgIHJlbW92ZUJvcmRlck5vZGVzIixmdW5jdGlvbigpe3JlbW92ZUJvcmRlck5vZGVzKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZS51bmRvIiwKZnVuY3Rpb24oKXtub3JtYWxpemUudW5kbyhnKX0pO3RpbWUoIiAgICBmaXh1cEVkZ2VMYWJlbENvb3JkcyIsZnVuY3Rpb24oKXtmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKX0pO3RpbWUoIiAgICB1bmRvQ29vcmRpbmF0ZVN5c3RlbSIsZnVuY3Rpb24oKXtjb29yZGluYXRlU3lzdGVtLnVuZG8oZyl9KTt0aW1lKCIgICAgdHJhbnNsYXRlR3JhcGgiLGZ1bmN0aW9uKCl7dHJhbnNsYXRlR3JhcGgoZyl9KTt0aW1lKCIgICAgYXNzaWduTm9kZUludGVyc2VjdHMiLGZ1bmN0aW9uKCl7YXNzaWduTm9kZUludGVyc2VjdHMoZyl9KTt0aW1lKCIgICAgcmV2ZXJzZVBvaW50cyIsZnVuY3Rpb24oKXtyZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKX0pO3RpbWUoIiAgICBhY3ljbGljLnVuZG8iLGZ1bmN0aW9uKCl7YWN5Y2xpYy51bmRvKGcpfSl9ZnVuY3Rpb24gdXBkYXRlSW5wdXRHcmFwaChpbnB1dEdyYXBoLGxheW91dEdyYXBoKXtfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBpbnB1dExhYmVsPQppbnB1dEdyYXBoLm5vZGUodiksbGF5b3V0TGFiZWw9bGF5b3V0R3JhcGgubm9kZSh2KTtpZihpbnB1dExhYmVsKXtpbnB1dExhYmVsLng9bGF5b3V0TGFiZWwueDtpbnB1dExhYmVsLnk9bGF5b3V0TGFiZWwueTtpZihsYXlvdXRHcmFwaC5jaGlsZHJlbih2KS5sZW5ndGgpe2lucHV0TGFiZWwud2lkdGg9bGF5b3V0TGFiZWwud2lkdGg7aW5wdXRMYWJlbC5oZWlnaHQ9bGF5b3V0TGFiZWwuaGVpZ2h0fX19KTtfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBpbnB1dExhYmVsPWlucHV0R3JhcGguZWRnZShlKSxsYXlvdXRMYWJlbD1sYXlvdXRHcmFwaC5lZGdlKGUpO2lucHV0TGFiZWwucG9pbnRzPWxheW91dExhYmVsLnBvaW50cztpZihfLmhhcyhsYXlvdXRMYWJlbCwieCIpKXtpbnB1dExhYmVsLng9bGF5b3V0TGFiZWwueDtpbnB1dExhYmVsLnk9bGF5b3V0TGFiZWwueX19KTtpbnB1dEdyYXBoLmdyYXBoKCkud2lkdGg9bGF5b3V0R3JhcGguZ3JhcGgoKS53aWR0aDsKaW5wdXRHcmFwaC5ncmFwaCgpLmhlaWdodD1sYXlvdXRHcmFwaC5ncmFwaCgpLmhlaWdodH12YXIgZ3JhcGhOdW1BdHRycz1bIm5vZGVzZXAiLCJlZGdlc2VwIiwicmFua3NlcCIsIm1hcmdpbngiLCJtYXJnaW55Il0sZ3JhcGhEZWZhdWx0cz17cmFua3NlcDo1MCxlZGdlc2VwOjIwLG5vZGVzZXA6NTAscmFua2RpcjoidGIifSxncmFwaEF0dHJzPVsiYWN5Y2xpY2VyIiwicmFua2VyIiwicmFua2RpciIsImFsaWduIl0sbm9kZU51bUF0dHJzPVsid2lkdGgiLCJoZWlnaHQiXSxub2RlRGVmYXVsdHM9e3dpZHRoOjAsaGVpZ2h0OjB9LGVkZ2VOdW1BdHRycz1bIm1pbmxlbiIsIndlaWdodCIsIndpZHRoIiwiaGVpZ2h0IiwibGFiZWxvZmZzZXQiXSxlZGdlRGVmYXVsdHM9e21pbmxlbjoxLHdlaWdodDoxLHdpZHRoOjAsaGVpZ2h0OjAsbGFiZWxvZmZzZXQ6MTAsbGFiZWxwb3M6InIifSxlZGdlQXR0cnM9WyJsYWJlbHBvcyJdO2Z1bmN0aW9uIGJ1aWxkTGF5b3V0R3JhcGgoaW5wdXRHcmFwaCl7dmFyIGc9Cm5ldyBHcmFwaCh7bXVsdGlncmFwaDp0cnVlLGNvbXBvdW5kOnRydWV9KSxncmFwaD1jYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTtnLnNldEdyYXBoKF8ubWVyZ2Uoe30sZ3JhcGhEZWZhdWx0cyxzZWxlY3ROdW1iZXJBdHRycyhncmFwaCxncmFwaE51bUF0dHJzKSxfLnBpY2soZ3JhcGgsZ3JhcGhBdHRycykpKTtfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLm5vZGUodikpO2cuc2V0Tm9kZSh2LF8uZGVmYXVsdHMoc2VsZWN0TnVtYmVyQXR0cnMobm9kZSxub2RlTnVtQXR0cnMpLG5vZGVEZWZhdWx0cykpO2cuc2V0UGFyZW50KHYsaW5wdXRHcmFwaC5wYXJlbnQodikpfSk7Xy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1jYW5vbmljYWxpemUoaW5wdXRHcmFwaC5lZGdlKGUpKTtnLnNldEVkZ2UoZSxfLm1lcmdlKHt9LGVkZ2VEZWZhdWx0cyxzZWxlY3ROdW1iZXJBdHRycyhlZGdlLAplZGdlTnVtQXR0cnMpLF8ucGljayhlZGdlLGVkZ2VBdHRycykpKX0pO3JldHVybiBnfWZ1bmN0aW9uIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZyl7dmFyIGdyYXBoPWcuZ3JhcGgoKTtncmFwaC5yYW5rc2VwLz0yO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2VkZ2UubWlubGVuKj0yO2lmKGVkZ2UubGFiZWxwb3MudG9Mb3dlckNhc2UoKSE9PSJjIilpZihncmFwaC5yYW5rZGlyPT09IlRCInx8Z3JhcGgucmFua2Rpcj09PSJCVCIpZWRnZS53aWR0aCs9ZWRnZS5sYWJlbG9mZnNldDtlbHNlIGVkZ2UuaGVpZ2h0Kz1lZGdlLmxhYmVsb2Zmc2V0fSl9ZnVuY3Rpb24gaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihlZGdlLndpZHRoJiZlZGdlLmhlaWdodCl7dmFyIHY9Zy5ub2RlKGUudiksdz1nLm5vZGUoZS53KSxsYWJlbD17cmFuazoody5yYW5rLQp2LnJhbmspLzIrdi5yYW5rLGU6ZX07dXRpbC5hZGREdW1teU5vZGUoZywiZWRnZS1wcm94eSIsbGFiZWwsIl9lcCIpfX0pfWZ1bmN0aW9uIGFzc2lnblJhbmtNaW5NYXgoZyl7dmFyIG1heFJhbms9MDtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmJvcmRlclRvcCl7bm9kZS5taW5SYW5rPWcubm9kZShub2RlLmJvcmRlclRvcCkucmFuaztub2RlLm1heFJhbms9Zy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKS5yYW5rO21heFJhbms9Xy5tYXgobWF4UmFuayxub2RlLm1heFJhbmspfX0pO2cuZ3JhcGgoKS5tYXhSYW5rPW1heFJhbmt9ZnVuY3Rpb24gcmVtb3ZlRWRnZUxhYmVsUHJveGllcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmR1bW15PT09ImVkZ2UtcHJveHkiKXtnLmVkZ2Uobm9kZS5lKS5sYWJlbFJhbms9bm9kZS5yYW5rO2cucmVtb3ZlTm9kZSh2KX19KX0KZnVuY3Rpb24gdHJhbnNsYXRlR3JhcGgoZyl7dmFyIG1pblg9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG1heFg9MCxtaW5ZPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxtYXhZPTAsZ3JhcGhMYWJlbD1nLmdyYXBoKCksbWFyZ2luWD1ncmFwaExhYmVsLm1hcmdpbnh8fDAsbWFyZ2luWT1ncmFwaExhYmVsLm1hcmdpbnl8fDA7ZnVuY3Rpb24gZ2V0RXh0cmVtZXMoYXR0cnMpe3ZhciB4PWF0dHJzLngseT1hdHRycy55LHc9YXR0cnMud2lkdGgsaD1hdHRycy5oZWlnaHQ7bWluWD1NYXRoLm1pbihtaW5YLHgtdy8yKTttYXhYPU1hdGgubWF4KG1heFgseCt3LzIpO21pblk9TWF0aC5taW4obWluWSx5LWgvMik7bWF4WT1NYXRoLm1heChtYXhZLHkraC8yKX1fLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2dldEV4dHJlbWVzKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihfLmhhcyhlZGdlLCJ4IikpZ2V0RXh0cmVtZXMoZWRnZSl9KTsKbWluWC09bWFyZ2luWDttaW5ZLT1tYXJnaW5ZO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO25vZGUueC09bWluWDtub2RlLnktPW1pbll9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtfLmZvckVhY2goZWRnZS5wb2ludHMsZnVuY3Rpb24ocCl7cC54LT1taW5YO3AueS09bWluWX0pO2lmKF8uaGFzKGVkZ2UsIngiKSllZGdlLngtPW1pblg7aWYoXy5oYXMoZWRnZSwieSIpKWVkZ2UueS09bWluWX0pO2dyYXBoTGFiZWwud2lkdGg9bWF4WC1taW5YK21hcmdpblg7Z3JhcGhMYWJlbC5oZWlnaHQ9bWF4WS1taW5ZK21hcmdpbll9ZnVuY3Rpb24gYXNzaWduTm9kZUludGVyc2VjdHMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSksbm9kZVY9Zy5ub2RlKGUudiksbm9kZVc9Zy5ub2RlKGUudykscDEscDI7aWYoIWVkZ2UucG9pbnRzKXtlZGdlLnBvaW50cz0KW107cDE9bm9kZVc7cDI9bm9kZVZ9ZWxzZXtwMT1lZGdlLnBvaW50c1swXTtwMj1lZGdlLnBvaW50c1tlZGdlLnBvaW50cy5sZW5ndGgtMV19ZWRnZS5wb2ludHMudW5zaGlmdCh1dGlsLmludGVyc2VjdFJlY3Qobm9kZVYscDEpKTtlZGdlLnBvaW50cy5wdXNoKHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVyxwMikpfSl9ZnVuY3Rpb24gZml4dXBFZGdlTGFiZWxDb29yZHMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoXy5oYXMoZWRnZSwieCIpKXtpZihlZGdlLmxhYmVscG9zPT09ImwifHxlZGdlLmxhYmVscG9zPT09InIiKWVkZ2Uud2lkdGgtPWVkZ2UubGFiZWxvZmZzZXQ7c3dpdGNoKGVkZ2UubGFiZWxwb3Mpe2Nhc2UgImwiOmVkZ2UueC09ZWRnZS53aWR0aC8yK2VkZ2UubGFiZWxvZmZzZXQ7YnJlYWs7Y2FzZSAiciI6ZWRnZS54Kz1lZGdlLndpZHRoLzIrZWRnZS5sYWJlbG9mZnNldDticmVha319fSl9ZnVuY3Rpb24gcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSwKZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2UucmV2ZXJzZWQpZWRnZS5wb2ludHMucmV2ZXJzZSgpfSl9ZnVuY3Rpb24gcmVtb3ZlQm9yZGVyTm9kZXMoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZihnLmNoaWxkcmVuKHYpLmxlbmd0aCl7dmFyIG5vZGU9Zy5ub2RlKHYpLHQ9Zy5ub2RlKG5vZGUuYm9yZGVyVG9wKSxiPWcubm9kZShub2RlLmJvcmRlckJvdHRvbSksbD1nLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyTGVmdCkpLHI9Zy5ub2RlKF8ubGFzdChub2RlLmJvcmRlclJpZ2h0KSk7bm9kZS53aWR0aD1NYXRoLmFicyhyLngtbC54KTtub2RlLmhlaWdodD1NYXRoLmFicyhiLnktdC55KTtub2RlLng9bC54K25vZGUud2lkdGgvMjtub2RlLnk9dC55K25vZGUuaGVpZ2h0LzJ9fSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZihnLm5vZGUodikuZHVtbXk9PT0iYm9yZGVyIilnLnJlbW92ZU5vZGUodil9KX1mdW5jdGlvbiByZW1vdmVTZWxmRWRnZXMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSwKZnVuY3Rpb24oZSl7aWYoZS52PT09ZS53KXt2YXIgbm9kZT1nLm5vZGUoZS52KTtpZighbm9kZS5zZWxmRWRnZXMpbm9kZS5zZWxmRWRnZXM9W107bm9kZS5zZWxmRWRnZXMucHVzaCh7ZTplLGxhYmVsOmcuZWRnZShlKX0pO2cucmVtb3ZlRWRnZShlKX19KX1mdW5jdGlvbiBpbnNlcnRTZWxmRWRnZXMoZyl7dmFyIGxheWVycz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7Xy5mb3JFYWNoKGxheWVycyxmdW5jdGlvbihsYXllcil7dmFyIG9yZGVyU2hpZnQ9MDtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixpKXt2YXIgbm9kZT1nLm5vZGUodik7bm9kZS5vcmRlcj1pK29yZGVyU2hpZnQ7Xy5mb3JFYWNoKG5vZGUuc2VsZkVkZ2VzLGZ1bmN0aW9uKHNlbGZFZGdlKXt1dGlsLmFkZER1bW15Tm9kZShnLCJzZWxmZWRnZSIse3dpZHRoOnNlbGZFZGdlLmxhYmVsLndpZHRoLGhlaWdodDpzZWxmRWRnZS5sYWJlbC5oZWlnaHQscmFuazpub2RlLnJhbmssb3JkZXI6aSsgKytvcmRlclNoaWZ0LAplOnNlbGZFZGdlLmUsbGFiZWw6c2VsZkVkZ2UubGFiZWx9LCJfc2UiKX0pO2RlbGV0ZSBub2RlLnNlbGZFZGdlc30pfSl9ZnVuY3Rpb24gcG9zaXRpb25TZWxmRWRnZXMoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYobm9kZS5kdW1teT09PSJzZWxmZWRnZSIpe3ZhciBzZWxmTm9kZT1nLm5vZGUobm9kZS5lLnYpLHg9c2VsZk5vZGUueCtzZWxmTm9kZS53aWR0aC8yLHk9c2VsZk5vZGUueSxkeD1ub2RlLngteCxkeT1zZWxmTm9kZS5oZWlnaHQvMjtnLnNldEVkZ2Uobm9kZS5lLG5vZGUubGFiZWwpO2cucmVtb3ZlTm9kZSh2KTtub2RlLmxhYmVsLnBvaW50cz1be3g6eCsyKmR4LzMseTp5LWR5fSx7eDp4KzUqZHgvNix5OnktZHl9LHt4OngrZHgseTp5fSx7eDp4KzUqZHgvNix5OnkrZHl9LHt4OngrMipkeC8zLHk6eStkeX1dO25vZGUubGFiZWwueD1ub2RlLng7bm9kZS5sYWJlbC55PW5vZGUueX19KX1mdW5jdGlvbiBzZWxlY3ROdW1iZXJBdHRycyhvYmosCmF0dHJzKXtyZXR1cm4gXy5tYXBWYWx1ZXMoXy5waWNrKG9iaixhdHRycyksTnVtYmVyKX1mdW5jdGlvbiBjYW5vbmljYWxpemUoYXR0cnMpe3ZhciBuZXdBdHRycz17fTtfLmZvckVhY2goYXR0cnMsZnVuY3Rpb24odixrKXtuZXdBdHRyc1trLnRvTG93ZXJDYXNlKCldPXZ9KTtyZXR1cm4gbmV3QXR0cnN9fSx7Ii4vYWN5Y2xpYyI6MiwiLi9hZGQtYm9yZGVyLXNlZ21lbnRzIjozLCIuL2Nvb3JkaW5hdGUtc3lzdGVtIjo0LCIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTAsIi4vbmVzdGluZy1ncmFwaCI6MTEsIi4vbm9ybWFsaXplIjoxMiwiLi9vcmRlciI6MTcsIi4vcGFyZW50LWR1bW15LWNoYWlucyI6MjIsIi4vcG9zaXRpb24iOjI0LCIuL3JhbmsiOjI2LCIuL3V0aWwiOjI5fV0sMTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsb2Rhc2g7aWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtsb2Rhc2g9cmVxdWlyZSgibG9kYXNoIil9Y2F0Y2goZSl7fWlmKCFsb2Rhc2gpbG9kYXNoPQp3aW5kb3cuXzttb2R1bGUuZXhwb3J0cz1sb2Rhc2h9LHsibG9kYXNoIjp1bmRlZmluZWR9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLGNsZWFudXA6Y2xlYW51cH07ZnVuY3Rpb24gcnVuKGcpe3ZhciByb290PXV0aWwuYWRkRHVtbXlOb2RlKGcsInJvb3QiLHt9LCJfcm9vdCIpO3ZhciBkZXB0aHM9dHJlZURlcHRocyhnKTt2YXIgaGVpZ2h0PV8ubWF4KF8udmFsdWVzKGRlcHRocykpLTE7dmFyIG5vZGVTZXA9MipoZWlnaHQrMTtnLmdyYXBoKCkubmVzdGluZ1Jvb3Q9cm9vdDtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2cuZWRnZShlKS5taW5sZW4qPW5vZGVTZXB9KTt2YXIgd2VpZ2h0PXN1bVdlaWdodHMoZykrMTtfLmZvckVhY2goZy5jaGlsZHJlbigpLGZ1bmN0aW9uKGNoaWxkKXtkZnMoZyxyb290LG5vZGVTZXAsCndlaWdodCxoZWlnaHQsZGVwdGhzLGNoaWxkKX0pO2cuZ3JhcGgoKS5ub2RlUmFua0ZhY3Rvcj1ub2RlU2VwfWZ1bmN0aW9uIGRmcyhnLHJvb3Qsbm9kZVNlcCx3ZWlnaHQsaGVpZ2h0LGRlcHRocyx2KXt2YXIgY2hpbGRyZW49Zy5jaGlsZHJlbih2KTtpZighY2hpbGRyZW4ubGVuZ3RoKXtpZih2IT09cm9vdClnLnNldEVkZ2Uocm9vdCx2LHt3ZWlnaHQ6MCxtaW5sZW46bm9kZVNlcH0pO3JldHVybn12YXIgdG9wPXV0aWwuYWRkQm9yZGVyTm9kZShnLCJfYnQiKSxib3R0b209dXRpbC5hZGRCb3JkZXJOb2RlKGcsIl9iYiIpLGxhYmVsPWcubm9kZSh2KTtnLnNldFBhcmVudCh0b3Asdik7bGFiZWwuYm9yZGVyVG9wPXRvcDtnLnNldFBhcmVudChib3R0b20sdik7bGFiZWwuYm9yZGVyQm90dG9tPWJvdHRvbTtfLmZvckVhY2goY2hpbGRyZW4sZnVuY3Rpb24oY2hpbGQpe2RmcyhnLHJvb3Qsbm9kZVNlcCx3ZWlnaHQsaGVpZ2h0LGRlcHRocyxjaGlsZCk7dmFyIGNoaWxkTm9kZT1nLm5vZGUoY2hpbGQpLApjaGlsZFRvcD1jaGlsZE5vZGUuYm9yZGVyVG9wP2NoaWxkTm9kZS5ib3JkZXJUb3A6Y2hpbGQsY2hpbGRCb3R0b209Y2hpbGROb2RlLmJvcmRlckJvdHRvbT9jaGlsZE5vZGUuYm9yZGVyQm90dG9tOmNoaWxkLHRoaXNXZWlnaHQ9Y2hpbGROb2RlLmJvcmRlclRvcD93ZWlnaHQ6Mip3ZWlnaHQsbWlubGVuPWNoaWxkVG9wIT09Y2hpbGRCb3R0b20/MTpoZWlnaHQtZGVwdGhzW3ZdKzE7Zy5zZXRFZGdlKHRvcCxjaGlsZFRvcCx7d2VpZ2h0OnRoaXNXZWlnaHQsbWlubGVuOm1pbmxlbixuZXN0aW5nRWRnZTp0cnVlfSk7Zy5zZXRFZGdlKGNoaWxkQm90dG9tLGJvdHRvbSx7d2VpZ2h0OnRoaXNXZWlnaHQsbWlubGVuOm1pbmxlbixuZXN0aW5nRWRnZTp0cnVlfSl9KTtpZighZy5wYXJlbnQodikpZy5zZXRFZGdlKHJvb3QsdG9wLHt3ZWlnaHQ6MCxtaW5sZW46aGVpZ2h0K2RlcHRoc1t2XX0pfWZ1bmN0aW9uIHRyZWVEZXB0aHMoZyl7dmFyIGRlcHRocz17fTtmdW5jdGlvbiBkZnModixkZXB0aCl7dmFyIGNoaWxkcmVuPQpnLmNoaWxkcmVuKHYpO2lmKGNoaWxkcmVuJiZjaGlsZHJlbi5sZW5ndGgpXy5mb3JFYWNoKGNoaWxkcmVuLGZ1bmN0aW9uKGNoaWxkKXtkZnMoY2hpbGQsZGVwdGgrMSl9KTtkZXB0aHNbdl09ZGVwdGh9Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSxmdW5jdGlvbih2KXtkZnModiwxKX0pO3JldHVybiBkZXB0aHN9ZnVuY3Rpb24gc3VtV2VpZ2h0cyhnKXtyZXR1cm4gXy5yZWR1Y2UoZy5lZGdlcygpLGZ1bmN0aW9uKGFjYyxlKXtyZXR1cm4gYWNjK2cuZWRnZShlKS53ZWlnaHR9LDApfWZ1bmN0aW9uIGNsZWFudXAoZyl7dmFyIGdyYXBoTGFiZWw9Zy5ncmFwaCgpO2cucmVtb3ZlTm9kZShncmFwaExhYmVsLm5lc3RpbmdSb290KTtkZWxldGUgZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdDtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihlZGdlLm5lc3RpbmdFZGdlKWcucmVtb3ZlRWRnZShlKX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSwKMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKTttb2R1bGUuZXhwb3J0cz17cnVuOnJ1bix1bmRvOnVuZG99O2Z1bmN0aW9uIHJ1bihnKXtnLmdyYXBoKCkuZHVtbXlDaGFpbnM9W107Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlZGdlKXtub3JtYWxpemVFZGdlKGcsZWRnZSl9KX1mdW5jdGlvbiBub3JtYWxpemVFZGdlKGcsZSl7dmFyIHY9ZS52LHZSYW5rPWcubm9kZSh2KS5yYW5rLHc9ZS53LHdSYW5rPWcubm9kZSh3KS5yYW5rLG5hbWU9ZS5uYW1lLGVkZ2VMYWJlbD1nLmVkZ2UoZSksbGFiZWxSYW5rPWVkZ2VMYWJlbC5sYWJlbFJhbms7aWYod1Jhbms9PT12UmFuaysxKXJldHVybjtnLnJlbW92ZUVkZ2UoZSk7dmFyIGR1bW15LGF0dHJzLGk7Zm9yKGk9MCwrK3ZSYW5rO3ZSYW5rPHdSYW5rOysraSwrK3ZSYW5rKXtlZGdlTGFiZWwucG9pbnRzPVtdO2F0dHJzPXt3aWR0aDowLApoZWlnaHQ6MCxlZGdlTGFiZWw6ZWRnZUxhYmVsLGVkZ2VPYmo6ZSxyYW5rOnZSYW5rfTtkdW1teT11dGlsLmFkZER1bW15Tm9kZShnLCJlZGdlIixhdHRycywiX2QiKTtpZih2UmFuaz09PWxhYmVsUmFuayl7YXR0cnMud2lkdGg9ZWRnZUxhYmVsLndpZHRoO2F0dHJzLmhlaWdodD1lZGdlTGFiZWwuaGVpZ2h0O2F0dHJzLmR1bW15PSJlZGdlLWxhYmVsIjthdHRycy5sYWJlbHBvcz1lZGdlTGFiZWwubGFiZWxwb3N9Zy5zZXRFZGdlKHYsZHVtbXkse3dlaWdodDplZGdlTGFiZWwud2VpZ2h0fSxuYW1lKTtpZihpPT09MClnLmdyYXBoKCkuZHVtbXlDaGFpbnMucHVzaChkdW1teSk7dj1kdW1teX1nLnNldEVkZ2Uodix3LHt3ZWlnaHQ6ZWRnZUxhYmVsLndlaWdodH0sbmFtZSl9ZnVuY3Rpb24gdW5kbyhnKXtfLmZvckVhY2goZy5ncmFwaCgpLmR1bW15Q2hhaW5zLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxvcmlnTGFiZWw9bm9kZS5lZGdlTGFiZWwsdztnLnNldEVkZ2Uobm9kZS5lZGdlT2JqLApvcmlnTGFiZWwpO3doaWxlKG5vZGUuZHVtbXkpe3c9Zy5zdWNjZXNzb3JzKHYpWzBdO2cucmVtb3ZlTm9kZSh2KTtvcmlnTGFiZWwucG9pbnRzLnB1c2goe3g6bm9kZS54LHk6bm9kZS55fSk7aWYobm9kZS5kdW1teT09PSJlZGdlLWxhYmVsIil7b3JpZ0xhYmVsLng9bm9kZS54O29yaWdMYWJlbC55PW5vZGUueTtvcmlnTGFiZWwud2lkdGg9bm9kZS53aWR0aDtvcmlnTGFiZWwuaGVpZ2h0PW5vZGUuaGVpZ2h0fXY9dztub2RlPWcubm9kZSh2KX19KX19LHsiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWFkZFN1YmdyYXBoQ29uc3RyYWludHM7ZnVuY3Rpb24gYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhnLGNnLHZzKXt2YXIgcHJldj17fSxyb290UHJldjtfLmZvckVhY2godnMsZnVuY3Rpb24odil7dmFyIGNoaWxkPWcucGFyZW50KHYpLHBhcmVudCwKcHJldkNoaWxkO3doaWxlKGNoaWxkKXtwYXJlbnQ9Zy5wYXJlbnQoY2hpbGQpO2lmKHBhcmVudCl7cHJldkNoaWxkPXByZXZbcGFyZW50XTtwcmV2W3BhcmVudF09Y2hpbGR9ZWxzZXtwcmV2Q2hpbGQ9cm9vdFByZXY7cm9vdFByZXY9Y2hpbGR9aWYocHJldkNoaWxkJiZwcmV2Q2hpbGQhPT1jaGlsZCl7Y2cuc2V0RWRnZShwcmV2Q2hpbGQsY2hpbGQpO3JldHVybn1jaGlsZD1wYXJlbnR9fSl9fSx7Ii4uL2xvZGFzaCI6MTB9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9YmFyeWNlbnRlcjtmdW5jdGlvbiBiYXJ5Y2VudGVyKGcsbW92YWJsZSl7cmV0dXJuIF8ubWFwKG1vdmFibGUsZnVuY3Rpb24odil7dmFyIGluVj1nLmluRWRnZXModik7aWYoIWluVi5sZW5ndGgpcmV0dXJue3Y6dn07ZWxzZXt2YXIgcmVzdWx0PV8ucmVkdWNlKGluVixmdW5jdGlvbihhY2MsZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpLApub2RlVT1nLm5vZGUoZS52KTtyZXR1cm57c3VtOmFjYy5zdW0rZWRnZS53ZWlnaHQqbm9kZVUub3JkZXIsd2VpZ2h0OmFjYy53ZWlnaHQrZWRnZS53ZWlnaHR9fSx7c3VtOjAsd2VpZ2h0OjB9KTtyZXR1cm57djp2LGJhcnljZW50ZXI6cmVzdWx0LnN1bS9yZXN1bHQud2VpZ2h0LHdlaWdodDpyZXN1bHQud2VpZ2h0fX19KX19LHsiLi4vbG9kYXNoIjoxMH1dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPWJ1aWxkTGF5ZXJHcmFwaDtmdW5jdGlvbiBidWlsZExheWVyR3JhcGgoZyxyYW5rLHJlbGF0aW9uc2hpcCl7dmFyIHJvb3Q9Y3JlYXRlUm9vdE5vZGUoZykscmVzdWx0PShuZXcgR3JhcGgoe2NvbXBvdW5kOnRydWV9KSkuc2V0R3JhcGgoe3Jvb3Q6cm9vdH0pLnNldERlZmF1bHROb2RlTGFiZWwoZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KX0pOwpfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxwYXJlbnQ9Zy5wYXJlbnQodik7aWYobm9kZS5yYW5rPT09cmFua3x8bm9kZS5taW5SYW5rPD1yYW5rJiZyYW5rPD1ub2RlLm1heFJhbmspe3Jlc3VsdC5zZXROb2RlKHYpO3Jlc3VsdC5zZXRQYXJlbnQodixwYXJlbnR8fHJvb3QpO18uZm9yRWFjaChnW3JlbGF0aW9uc2hpcF0odiksZnVuY3Rpb24oZSl7dmFyIHU9ZS52PT09dj9lLnc6ZS52LGVkZ2U9cmVzdWx0LmVkZ2UodSx2KSx3ZWlnaHQ9IV8uaXNVbmRlZmluZWQoZWRnZSk/ZWRnZS53ZWlnaHQ6MDtyZXN1bHQuc2V0RWRnZSh1LHYse3dlaWdodDpnLmVkZ2UoZSkud2VpZ2h0K3dlaWdodH0pfSk7aWYoXy5oYXMobm9kZSwibWluUmFuayIpKXJlc3VsdC5zZXROb2RlKHYse2JvcmRlckxlZnQ6bm9kZS5ib3JkZXJMZWZ0W3JhbmtdLGJvcmRlclJpZ2h0Om5vZGUuYm9yZGVyUmlnaHRbcmFua119KX19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNyZWF0ZVJvb3ROb2RlKGcpe3ZhciB2Owp3aGlsZShnLmhhc05vZGUodj1fLnVuaXF1ZUlkKCJfcm9vdCIpKSk7cmV0dXJuIHZ9fSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwfV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWNyb3NzQ291bnQ7ZnVuY3Rpb24gY3Jvc3NDb3VudChnLGxheWVyaW5nKXt2YXIgY2M9MDtmb3IodmFyIGk9MTtpPGxheWVyaW5nLmxlbmd0aDsrK2kpY2MrPXR3b0xheWVyQ3Jvc3NDb3VudChnLGxheWVyaW5nW2ktMV0sbGF5ZXJpbmdbaV0pO3JldHVybiBjY31mdW5jdGlvbiB0d29MYXllckNyb3NzQ291bnQoZyxub3J0aExheWVyLHNvdXRoTGF5ZXIpe3ZhciBzb3V0aFBvcz1fLnppcE9iamVjdChzb3V0aExheWVyLF8ubWFwKHNvdXRoTGF5ZXIsZnVuY3Rpb24odixpKXtyZXR1cm4gaX0pKTt2YXIgc291dGhFbnRyaWVzPV8uZmxhdHRlbihfLm1hcChub3J0aExheWVyLGZ1bmN0aW9uKHYpe3JldHVybiBfLmNoYWluKGcub3V0RWRnZXModikpLm1hcChmdW5jdGlvbihlKXtyZXR1cm57cG9zOnNvdXRoUG9zW2Uud10sCndlaWdodDpnLmVkZ2UoZSkud2VpZ2h0fX0pLnNvcnRCeSgicG9zIikudmFsdWUoKX0pLHRydWUpO3ZhciBmaXJzdEluZGV4PTE7d2hpbGUoZmlyc3RJbmRleDxzb3V0aExheWVyLmxlbmd0aClmaXJzdEluZGV4PDw9MTt2YXIgdHJlZVNpemU9MipmaXJzdEluZGV4LTE7Zmlyc3RJbmRleC09MTt2YXIgdHJlZT1fLm1hcChuZXcgQXJyYXkodHJlZVNpemUpLGZ1bmN0aW9uKCl7cmV0dXJuIDB9KTt2YXIgY2M9MDtfLmZvckVhY2goc291dGhFbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZW50cnkpe3ZhciBpbmRleD1lbnRyeS5wb3MrZmlyc3RJbmRleDt0cmVlW2luZGV4XSs9ZW50cnkud2VpZ2h0O3ZhciB3ZWlnaHRTdW09MDt3aGlsZShpbmRleD4wKXtpZihpbmRleCUyKXdlaWdodFN1bSs9dHJlZVtpbmRleCsxXTtpbmRleD1pbmRleC0xPj4xO3RyZWVbaW5kZXhdKz1lbnRyeS53ZWlnaHR9Y2MrPWVudHJ5LndlaWdodCp3ZWlnaHRTdW19KSk7cmV0dXJuIGNjfX0seyIuLi9sb2Rhc2giOjEwfV0sCjE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxpbml0T3JkZXI9cmVxdWlyZSgiLi9pbml0LW9yZGVyIiksY3Jvc3NDb3VudD1yZXF1aXJlKCIuL2Nyb3NzLWNvdW50Iiksc29ydFN1YmdyYXBoPXJlcXVpcmUoIi4vc29ydC1zdWJncmFwaCIpLGJ1aWxkTGF5ZXJHcmFwaD1yZXF1aXJlKCIuL2J1aWxkLWxheWVyLWdyYXBoIiksYWRkU3ViZ3JhcGhDb25zdHJhaW50cz1yZXF1aXJlKCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cyIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGgsdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9b3JkZXI7ZnVuY3Rpb24gb3JkZXIoZyl7dmFyIG1heFJhbms9dXRpbC5tYXhSYW5rKGcpLGRvd25MYXllckdyYXBocz1idWlsZExheWVyR3JhcGhzKGcsXy5yYW5nZSgxLG1heFJhbmsrMSksImluRWRnZXMiKSx1cExheWVyR3JhcGhzPWJ1aWxkTGF5ZXJHcmFwaHMoZywKXy5yYW5nZShtYXhSYW5rLTEsLTEsLTEpLCJvdXRFZGdlcyIpO3ZhciBsYXllcmluZz1pbml0T3JkZXIoZyk7YXNzaWduT3JkZXIoZyxsYXllcmluZyk7dmFyIGJlc3RDQz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksYmVzdDtmb3IodmFyIGk9MCxsYXN0QmVzdD0wO2xhc3RCZXN0PDQ7KytpLCsrbGFzdEJlc3Qpe3N3ZWVwTGF5ZXJHcmFwaHMoaSUyP2Rvd25MYXllckdyYXBoczp1cExheWVyR3JhcGhzLGklND49Mik7bGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpO3ZhciBjYz1jcm9zc0NvdW50KGcsbGF5ZXJpbmcpO2lmKGNjPGJlc3RDQyl7bGFzdEJlc3Q9MDtiZXN0PV8uY2xvbmVEZWVwKGxheWVyaW5nKTtiZXN0Q0M9Y2N9fWFzc2lnbk9yZGVyKGcsYmVzdCl9ZnVuY3Rpb24gYnVpbGRMYXllckdyYXBocyhnLHJhbmtzLHJlbGF0aW9uc2hpcCl7cmV0dXJuIF8ubWFwKHJhbmtzLGZ1bmN0aW9uKHJhbmspe3JldHVybiBidWlsZExheWVyR3JhcGgoZyxyYW5rLHJlbGF0aW9uc2hpcCl9KX0KZnVuY3Rpb24gc3dlZXBMYXllckdyYXBocyhsYXllckdyYXBocyxiaWFzUmlnaHQpe3ZhciBjZz1uZXcgR3JhcGg7Xy5mb3JFYWNoKGxheWVyR3JhcGhzLGZ1bmN0aW9uKGxnKXt2YXIgcm9vdD1sZy5ncmFwaCgpLnJvb3Q7dmFyIHNvcnRlZD1zb3J0U3ViZ3JhcGgobGcscm9vdCxjZyxiaWFzUmlnaHQpO18uZm9yRWFjaChzb3J0ZWQudnMsZnVuY3Rpb24odixpKXtsZy5ub2RlKHYpLm9yZGVyPWl9KTthZGRTdWJncmFwaENvbnN0cmFpbnRzKGxnLGNnLHNvcnRlZC52cyl9KX1mdW5jdGlvbiBhc3NpZ25PcmRlcihnLGxheWVyaW5nKXtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LGkpe2cubm9kZSh2KS5vcmRlcj1pfSl9KX19LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5LCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cyI6MTMsIi4vYnVpbGQtbGF5ZXItZ3JhcGgiOjE1LCIuL2Nyb3NzLWNvdW50IjoxNiwKIi4vaW5pdC1vcmRlciI6MTgsIi4vc29ydC1zdWJncmFwaCI6MjB9XSwxODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9aW5pdE9yZGVyO2Z1bmN0aW9uIGluaXRPcmRlcihnKXt2YXIgdmlzaXRlZD17fSxzaW1wbGVOb2Rlcz1fLmZpbHRlcihnLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIWcuY2hpbGRyZW4odikubGVuZ3RofSksbWF4UmFuaz1fLm1heChfLm1hcChzaW1wbGVOb2RlcyxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KSksbGF5ZXJzPV8ubWFwKF8ucmFuZ2UobWF4UmFuaysxKSxmdW5jdGlvbigpe3JldHVybltdfSk7ZnVuY3Rpb24gZGZzKHYpe2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuO3Zpc2l0ZWRbdl09dHJ1ZTt2YXIgbm9kZT1nLm5vZGUodik7bGF5ZXJzW25vZGUucmFua10ucHVzaCh2KTtfLmZvckVhY2goZy5zdWNjZXNzb3JzKHYpLGRmcyl9dmFyIG9yZGVyZWRWcz0KXy5zb3J0Qnkoc2ltcGxlTm9kZXMsZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSk7Xy5mb3JFYWNoKG9yZGVyZWRWcyxkZnMpO3JldHVybiBsYXllcnN9fSx7Ii4uL2xvZGFzaCI6MTB9XSwxOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9cmVzb2x2ZUNvbmZsaWN0cztmdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsY2cpe3ZhciBtYXBwZWRFbnRyaWVzPXt9O18uZm9yRWFjaChlbnRyaWVzLGZ1bmN0aW9uKGVudHJ5LGkpe3ZhciB0bXA9bWFwcGVkRW50cmllc1tlbnRyeS52XT17aW5kZWdyZWU6MCwiaW4iOltdLG91dDpbXSx2czpbZW50cnkudl0saTppfTtpZighXy5pc1VuZGVmaW5lZChlbnRyeS5iYXJ5Y2VudGVyKSl7dG1wLmJhcnljZW50ZXI9ZW50cnkuYmFyeWNlbnRlcjt0bXAud2VpZ2h0PWVudHJ5LndlaWdodH19KTtfLmZvckVhY2goY2cuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZW50cnlWPQptYXBwZWRFbnRyaWVzW2Uudl0sZW50cnlXPW1hcHBlZEVudHJpZXNbZS53XTtpZighXy5pc1VuZGVmaW5lZChlbnRyeVYpJiYhXy5pc1VuZGVmaW5lZChlbnRyeVcpKXtlbnRyeVcuaW5kZWdyZWUrKztlbnRyeVYub3V0LnB1c2gobWFwcGVkRW50cmllc1tlLnddKX19KTt2YXIgc291cmNlU2V0PV8uZmlsdGVyKG1hcHBlZEVudHJpZXMsZnVuY3Rpb24oZW50cnkpe3JldHVybiFlbnRyeS5pbmRlZ3JlZX0pO3JldHVybiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KX1mdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KXt2YXIgZW50cmllcz1bXTtmdW5jdGlvbiBoYW5kbGVJbih2RW50cnkpe3JldHVybiBmdW5jdGlvbih1RW50cnkpe2lmKHVFbnRyeS5tZXJnZWQpcmV0dXJuO2lmKF8uaXNVbmRlZmluZWQodUVudHJ5LmJhcnljZW50ZXIpfHxfLmlzVW5kZWZpbmVkKHZFbnRyeS5iYXJ5Y2VudGVyKXx8dUVudHJ5LmJhcnljZW50ZXI+PXZFbnRyeS5iYXJ5Y2VudGVyKW1lcmdlRW50cmllcyh2RW50cnksCnVFbnRyeSl9fWZ1bmN0aW9uIGhhbmRsZU91dCh2RW50cnkpe3JldHVybiBmdW5jdGlvbih3RW50cnkpe3dFbnRyeVsiaW4iXS5wdXNoKHZFbnRyeSk7aWYoLS13RW50cnkuaW5kZWdyZWU9PT0wKXNvdXJjZVNldC5wdXNoKHdFbnRyeSl9fXdoaWxlKHNvdXJjZVNldC5sZW5ndGgpe3ZhciBlbnRyeT1zb3VyY2VTZXQucG9wKCk7ZW50cmllcy5wdXNoKGVudHJ5KTtfLmZvckVhY2goZW50cnlbImluIl0ucmV2ZXJzZSgpLGhhbmRsZUluKGVudHJ5KSk7Xy5mb3JFYWNoKGVudHJ5Lm91dCxoYW5kbGVPdXQoZW50cnkpKX1yZXR1cm4gXy5jaGFpbihlbnRyaWVzKS5maWx0ZXIoZnVuY3Rpb24oZW50cnkpe3JldHVybiFlbnRyeS5tZXJnZWR9KS5tYXAoZnVuY3Rpb24oZW50cnkpe3JldHVybiBfLnBpY2soZW50cnksWyJ2cyIsImkiLCJiYXJ5Y2VudGVyIiwid2VpZ2h0Il0pfSkudmFsdWUoKX1mdW5jdGlvbiBtZXJnZUVudHJpZXModGFyZ2V0LHNvdXJjZSl7dmFyIHN1bT0wLHdlaWdodD0wOwppZih0YXJnZXQud2VpZ2h0KXtzdW0rPXRhcmdldC5iYXJ5Y2VudGVyKnRhcmdldC53ZWlnaHQ7d2VpZ2h0Kz10YXJnZXQud2VpZ2h0fWlmKHNvdXJjZS53ZWlnaHQpe3N1bSs9c291cmNlLmJhcnljZW50ZXIqc291cmNlLndlaWdodDt3ZWlnaHQrPXNvdXJjZS53ZWlnaHR9dGFyZ2V0LnZzPXNvdXJjZS52cy5jb25jYXQodGFyZ2V0LnZzKTt0YXJnZXQuYmFyeWNlbnRlcj1zdW0vd2VpZ2h0O3RhcmdldC53ZWlnaHQ9d2VpZ2h0O3RhcmdldC5pPU1hdGgubWluKHNvdXJjZS5pLHRhcmdldC5pKTtzb3VyY2UubWVyZ2VkPXRydWV9fSx7Ii4uL2xvZGFzaCI6MTB9XSwyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksYmFyeWNlbnRlcj1yZXF1aXJlKCIuL2JhcnljZW50ZXIiKSxyZXNvbHZlQ29uZmxpY3RzPXJlcXVpcmUoIi4vcmVzb2x2ZS1jb25mbGljdHMiKSxzb3J0PXJlcXVpcmUoIi4vc29ydCIpO21vZHVsZS5leHBvcnRzPQpzb3J0U3ViZ3JhcGg7ZnVuY3Rpb24gc29ydFN1YmdyYXBoKGcsdixjZyxiaWFzUmlnaHQpe3ZhciBtb3ZhYmxlPWcuY2hpbGRyZW4odiksbm9kZT1nLm5vZGUodiksYmw9bm9kZT9ub2RlLmJvcmRlckxlZnQ6dW5kZWZpbmVkLGJyPW5vZGU/bm9kZS5ib3JkZXJSaWdodDp1bmRlZmluZWQsc3ViZ3JhcGhzPXt9O2lmKGJsKW1vdmFibGU9Xy5maWx0ZXIobW92YWJsZSxmdW5jdGlvbih3KXtyZXR1cm4gdyE9PWJsJiZ3IT09YnJ9KTt2YXIgYmFyeWNlbnRlcnM9YmFyeWNlbnRlcihnLG1vdmFibGUpO18uZm9yRWFjaChiYXJ5Y2VudGVycyxmdW5jdGlvbihlbnRyeSl7aWYoZy5jaGlsZHJlbihlbnRyeS52KS5sZW5ndGgpe3ZhciBzdWJncmFwaFJlc3VsdD1zb3J0U3ViZ3JhcGgoZyxlbnRyeS52LGNnLGJpYXNSaWdodCk7c3ViZ3JhcGhzW2VudHJ5LnZdPXN1YmdyYXBoUmVzdWx0O2lmKF8uaGFzKHN1YmdyYXBoUmVzdWx0LCJiYXJ5Y2VudGVyIikpbWVyZ2VCYXJ5Y2VudGVycyhlbnRyeSwKc3ViZ3JhcGhSZXN1bHQpfX0pO3ZhciBlbnRyaWVzPXJlc29sdmVDb25mbGljdHMoYmFyeWNlbnRlcnMsY2cpO2V4cGFuZFN1YmdyYXBocyhlbnRyaWVzLHN1YmdyYXBocyk7dmFyIHJlc3VsdD1zb3J0KGVudHJpZXMsYmlhc1JpZ2h0KTtpZihibCl7cmVzdWx0LnZzPV8uZmxhdHRlbihbYmwscmVzdWx0LnZzLGJyXSx0cnVlKTtpZihnLnByZWRlY2Vzc29ycyhibCkubGVuZ3RoKXt2YXIgYmxQcmVkPWcubm9kZShnLnByZWRlY2Vzc29ycyhibClbMF0pLGJyUHJlZD1nLm5vZGUoZy5wcmVkZWNlc3NvcnMoYnIpWzBdKTtpZighXy5oYXMocmVzdWx0LCJiYXJ5Y2VudGVyIikpe3Jlc3VsdC5iYXJ5Y2VudGVyPTA7cmVzdWx0LndlaWdodD0wfXJlc3VsdC5iYXJ5Y2VudGVyPShyZXN1bHQuYmFyeWNlbnRlcipyZXN1bHQud2VpZ2h0K2JsUHJlZC5vcmRlciticlByZWQub3JkZXIpLyhyZXN1bHQud2VpZ2h0KzIpO3Jlc3VsdC53ZWlnaHQrPTJ9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsCnN1YmdyYXBocyl7Xy5mb3JFYWNoKGVudHJpZXMsZnVuY3Rpb24oZW50cnkpe2VudHJ5LnZzPV8uZmxhdHRlbihlbnRyeS52cy5tYXAoZnVuY3Rpb24odil7aWYoc3ViZ3JhcGhzW3ZdKXJldHVybiBzdWJncmFwaHNbdl0udnM7cmV0dXJuIHZ9KSx0cnVlKX0pfWZ1bmN0aW9uIG1lcmdlQmFyeWNlbnRlcnModGFyZ2V0LG90aGVyKXtpZighXy5pc1VuZGVmaW5lZCh0YXJnZXQuYmFyeWNlbnRlcikpe3RhcmdldC5iYXJ5Y2VudGVyPSh0YXJnZXQuYmFyeWNlbnRlcip0YXJnZXQud2VpZ2h0K290aGVyLmJhcnljZW50ZXIqb3RoZXIud2VpZ2h0KS8odGFyZ2V0LndlaWdodCtvdGhlci53ZWlnaHQpO3RhcmdldC53ZWlnaHQrPW90aGVyLndlaWdodH1lbHNle3RhcmdldC5iYXJ5Y2VudGVyPW90aGVyLmJhcnljZW50ZXI7dGFyZ2V0LndlaWdodD1vdGhlci53ZWlnaHR9fX0seyIuLi9sb2Rhc2giOjEwLCIuL2JhcnljZW50ZXIiOjE0LCIuL3Jlc29sdmUtY29uZmxpY3RzIjoxOSwiLi9zb3J0IjoyMX1dLAoyMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9c29ydDtmdW5jdGlvbiBzb3J0KGVudHJpZXMsYmlhc1JpZ2h0KXt2YXIgcGFydHM9dXRpbC5wYXJ0aXRpb24oZW50cmllcyxmdW5jdGlvbihlbnRyeSl7cmV0dXJuIF8uaGFzKGVudHJ5LCJiYXJ5Y2VudGVyIil9KTt2YXIgc29ydGFibGU9cGFydHMubGhzLHVuc29ydGFibGU9Xy5zb3J0QnkocGFydHMucmhzLGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4tZW50cnkuaX0pLHZzPVtdLHN1bT0wLHdlaWdodD0wLHZzSW5kZXg9MDtzb3J0YWJsZS5zb3J0KGNvbXBhcmVXaXRoQmlhcyghIWJpYXNSaWdodCkpO3ZzSW5kZXg9Y29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSx2c0luZGV4KTtfLmZvckVhY2goc29ydGFibGUsZnVuY3Rpb24oZW50cnkpe3ZzSW5kZXgrPWVudHJ5LnZzLmxlbmd0aDt2cy5wdXNoKGVudHJ5LnZzKTsKc3VtKz1lbnRyeS5iYXJ5Y2VudGVyKmVudHJ5LndlaWdodDt3ZWlnaHQrPWVudHJ5LndlaWdodDt2c0luZGV4PWNvbnN1bWVVbnNvcnRhYmxlKHZzLHVuc29ydGFibGUsdnNJbmRleCl9KTt2YXIgcmVzdWx0PXt2czpfLmZsYXR0ZW4odnMsdHJ1ZSl9O2lmKHdlaWdodCl7cmVzdWx0LmJhcnljZW50ZXI9c3VtL3dlaWdodDtyZXN1bHQud2VpZ2h0PXdlaWdodH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNvbnN1bWVVbnNvcnRhYmxlKHZzLHVuc29ydGFibGUsaW5kZXgpe3ZhciBsYXN0O3doaWxlKHVuc29ydGFibGUubGVuZ3RoJiYobGFzdD1fLmxhc3QodW5zb3J0YWJsZSkpLmk8PWluZGV4KXt1bnNvcnRhYmxlLnBvcCgpO3ZzLnB1c2gobGFzdC52cyk7aW5kZXgrK31yZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY29tcGFyZVdpdGhCaWFzKGJpYXMpe3JldHVybiBmdW5jdGlvbihlbnRyeVYsZW50cnlXKXtpZihlbnRyeVYuYmFyeWNlbnRlcjxlbnRyeVcuYmFyeWNlbnRlcilyZXR1cm4tMTtlbHNlIGlmKGVudHJ5Vi5iYXJ5Y2VudGVyPgplbnRyeVcuYmFyeWNlbnRlcilyZXR1cm4gMTtyZXR1cm4hYmlhcz9lbnRyeVYuaS1lbnRyeVcuaTplbnRyeVcuaS1lbnRyeVYuaX19fSx7Ii4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5fV0sMjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9cGFyZW50RHVtbXlDaGFpbnM7ZnVuY3Rpb24gcGFyZW50RHVtbXlDaGFpbnMoZyl7dmFyIHBvc3RvcmRlck51bXM9cG9zdG9yZGVyKGcpO18uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLGVkZ2VPYmo9bm9kZS5lZGdlT2JqLHBhdGhEYXRhPWZpbmRQYXRoKGcscG9zdG9yZGVyTnVtcyxlZGdlT2JqLnYsZWRnZU9iai53KSxwYXRoPXBhdGhEYXRhLnBhdGgsbGNhPXBhdGhEYXRhLmxjYSxwYXRoSWR4PTAscGF0aFY9cGF0aFtwYXRoSWR4XSxhc2NlbmRpbmc9dHJ1ZTt3aGlsZSh2IT09ZWRnZU9iai53KXtub2RlPQpnLm5vZGUodik7aWYoYXNjZW5kaW5nKXt3aGlsZSgocGF0aFY9cGF0aFtwYXRoSWR4XSkhPT1sY2EmJmcubm9kZShwYXRoVikubWF4UmFuazxub2RlLnJhbmspcGF0aElkeCsrO2lmKHBhdGhWPT09bGNhKWFzY2VuZGluZz1mYWxzZX1pZighYXNjZW5kaW5nKXt3aGlsZShwYXRoSWR4PHBhdGgubGVuZ3RoLTEmJmcubm9kZShwYXRoVj1wYXRoW3BhdGhJZHgrMV0pLm1pblJhbms8PW5vZGUucmFuaylwYXRoSWR4Kys7cGF0aFY9cGF0aFtwYXRoSWR4XX1nLnNldFBhcmVudCh2LHBhdGhWKTt2PWcuc3VjY2Vzc29ycyh2KVswXX19KX1mdW5jdGlvbiBmaW5kUGF0aChnLHBvc3RvcmRlck51bXMsdix3KXt2YXIgdlBhdGg9W10sd1BhdGg9W10sbG93PU1hdGgubWluKHBvc3RvcmRlck51bXNbdl0ubG93LHBvc3RvcmRlck51bXNbd10ubG93KSxsaW09TWF0aC5tYXgocG9zdG9yZGVyTnVtc1t2XS5saW0scG9zdG9yZGVyTnVtc1t3XS5saW0pLHBhcmVudCxsY2E7cGFyZW50PXY7ZG97cGFyZW50PQpnLnBhcmVudChwYXJlbnQpO3ZQYXRoLnB1c2gocGFyZW50KX13aGlsZShwYXJlbnQmJihwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93Pmxvd3x8bGltPnBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTtsY2E9cGFyZW50O3BhcmVudD13O3doaWxlKChwYXJlbnQ9Zy5wYXJlbnQocGFyZW50KSkhPT1sY2Epd1BhdGgucHVzaChwYXJlbnQpO3JldHVybntwYXRoOnZQYXRoLmNvbmNhdCh3UGF0aC5yZXZlcnNlKCkpLGxjYTpsY2F9fWZ1bmN0aW9uIHBvc3RvcmRlcihnKXt2YXIgcmVzdWx0PXt9LGxpbT0wO2Z1bmN0aW9uIGRmcyh2KXt2YXIgbG93PWxpbTtfLmZvckVhY2goZy5jaGlsZHJlbih2KSxkZnMpO3Jlc3VsdFt2XT17bG93OmxvdyxsaW06bGltKyt9fV8uZm9yRWFjaChnLmNoaWxkcmVuKCksZGZzKTtyZXR1cm4gcmVzdWx0fX0seyIuL2xvZGFzaCI6MTB9XSwyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9CnJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGgsdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9e3Bvc2l0aW9uWDpwb3NpdGlvblgsZmluZFR5cGUxQ29uZmxpY3RzOmZpbmRUeXBlMUNvbmZsaWN0cyxmaW5kVHlwZTJDb25mbGljdHM6ZmluZFR5cGUyQ29uZmxpY3RzLGFkZENvbmZsaWN0OmFkZENvbmZsaWN0LGhhc0NvbmZsaWN0Omhhc0NvbmZsaWN0LHZlcnRpY2FsQWxpZ25tZW50OnZlcnRpY2FsQWxpZ25tZW50LGhvcml6b250YWxDb21wYWN0aW9uOmhvcml6b250YWxDb21wYWN0aW9uLGFsaWduQ29vcmRpbmF0ZXM6YWxpZ25Db29yZGluYXRlcyxmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudDpmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudCxiYWxhbmNlOmJhbGFuY2V9O2Z1bmN0aW9uIGZpbmRUeXBlMUNvbmZsaWN0cyhnLGxheWVyaW5nKXt2YXIgY29uZmxpY3RzPXt9O2Z1bmN0aW9uIHZpc2l0TGF5ZXIocHJldkxheWVyLGxheWVyKXt2YXIgazA9MCxzY2FuUG9zPQowLHByZXZMYXllckxlbmd0aD1wcmV2TGF5ZXIubGVuZ3RoLGxhc3ROb2RlPV8ubGFzdChsYXllcik7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsaSl7dmFyIHc9ZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLHYpLGsxPXc/Zy5ub2RlKHcpLm9yZGVyOnByZXZMYXllckxlbmd0aDtpZih3fHx2PT09bGFzdE5vZGUpe18uZm9yRWFjaChsYXllci5zbGljZShzY2FuUG9zLGkrMSksZnVuY3Rpb24oc2Nhbk5vZGUpe18uZm9yRWFjaChnLnByZWRlY2Vzc29ycyhzY2FuTm9kZSksZnVuY3Rpb24odSl7dmFyIHVMYWJlbD1nLm5vZGUodSksdVBvcz11TGFiZWwub3JkZXI7aWYoKHVQb3M8azB8fGsxPHVQb3MpJiYhKHVMYWJlbC5kdW1teSYmZy5ub2RlKHNjYW5Ob2RlKS5kdW1teSkpYWRkQ29uZmxpY3QoY29uZmxpY3RzLHUsc2Nhbk5vZGUpfSl9KTtzY2FuUG9zPWkrMTtrMD1rMX19KTtyZXR1cm4gbGF5ZXJ9Xy5yZWR1Y2UobGF5ZXJpbmcsdmlzaXRMYXllcik7cmV0dXJuIGNvbmZsaWN0c30KZnVuY3Rpb24gZmluZFR5cGUyQ29uZmxpY3RzKGcsbGF5ZXJpbmcpe3ZhciBjb25mbGljdHM9e307ZnVuY3Rpb24gc2Nhbihzb3V0aCxzb3V0aFBvcyxzb3V0aEVuZCxwcmV2Tm9ydGhCb3JkZXIsbmV4dE5vcnRoQm9yZGVyKXt2YXIgdjtfLmZvckVhY2goXy5yYW5nZShzb3V0aFBvcyxzb3V0aEVuZCksZnVuY3Rpb24oaSl7dj1zb3V0aFtpXTtpZihnLm5vZGUodikuZHVtbXkpXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHYpLGZ1bmN0aW9uKHUpe3ZhciB1Tm9kZT1nLm5vZGUodSk7aWYodU5vZGUuZHVtbXkmJih1Tm9kZS5vcmRlcjxwcmV2Tm9ydGhCb3JkZXJ8fHVOb2RlLm9yZGVyPm5leHROb3J0aEJvcmRlcikpYWRkQ29uZmxpY3QoY29uZmxpY3RzLHUsdil9KX0pfWZ1bmN0aW9uIHZpc2l0TGF5ZXIobm9ydGgsc291dGgpe3ZhciBwcmV2Tm9ydGhQb3M9LTEsbmV4dE5vcnRoUG9zLHNvdXRoUG9zPTA7Xy5mb3JFYWNoKHNvdXRoLGZ1bmN0aW9uKHYsc291dGhMb29rYWhlYWQpe2lmKGcubm9kZSh2KS5kdW1teT09PQoiYm9yZGVyIil7dmFyIHByZWRlY2Vzc29ycz1nLnByZWRlY2Vzc29ycyh2KTtpZihwcmVkZWNlc3NvcnMubGVuZ3RoKXtuZXh0Tm9ydGhQb3M9Zy5ub2RlKHByZWRlY2Vzc29yc1swXSkub3JkZXI7c2Nhbihzb3V0aCxzb3V0aFBvcyxzb3V0aExvb2thaGVhZCxwcmV2Tm9ydGhQb3MsbmV4dE5vcnRoUG9zKTtzb3V0aFBvcz1zb3V0aExvb2thaGVhZDtwcmV2Tm9ydGhQb3M9bmV4dE5vcnRoUG9zfX1zY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoLmxlbmd0aCxuZXh0Tm9ydGhQb3Msbm9ydGgubGVuZ3RoKX0pO3JldHVybiBzb3V0aH1fLnJlZHVjZShsYXllcmluZyx2aXNpdExheWVyKTtyZXR1cm4gY29uZmxpY3RzfWZ1bmN0aW9uIGZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZyx2KXtpZihnLm5vZGUodikuZHVtbXkpcmV0dXJuIF8uZmluZChnLnByZWRlY2Vzc29ycyh2KSxmdW5jdGlvbih1KXtyZXR1cm4gZy5ub2RlKHUpLmR1bW15fSl9ZnVuY3Rpb24gYWRkQ29uZmxpY3QoY29uZmxpY3RzLAp2LHcpe2lmKHY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH12YXIgY29uZmxpY3RzVj1jb25mbGljdHNbdl07aWYoIWNvbmZsaWN0c1YpY29uZmxpY3RzW3ZdPWNvbmZsaWN0c1Y9e307Y29uZmxpY3RzVlt3XT10cnVlfWZ1bmN0aW9uIGhhc0NvbmZsaWN0KGNvbmZsaWN0cyx2LHcpe2lmKHY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH1yZXR1cm4gXy5oYXMoY29uZmxpY3RzW3ZdLHcpfWZ1bmN0aW9uIHZlcnRpY2FsQWxpZ25tZW50KGcsbGF5ZXJpbmcsY29uZmxpY3RzLG5laWdoYm9yRm4pe3ZhciByb290PXt9LGFsaWduPXt9LHBvcz17fTtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LG9yZGVyKXtyb290W3ZdPXY7YWxpZ25bdl09djtwb3Nbdl09b3JkZXJ9KX0pO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIHByZXZJZHg9LTE7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe3ZhciB3cz1uZWlnaGJvckZuKHYpOwppZih3cy5sZW5ndGgpe3dzPV8uc29ydEJ5KHdzLGZ1bmN0aW9uKHcpe3JldHVybiBwb3Nbd119KTt2YXIgbXA9KHdzLmxlbmd0aC0xKS8yO2Zvcih2YXIgaT1NYXRoLmZsb29yKG1wKSxpbD1NYXRoLmNlaWwobXApO2k8PWlsOysraSl7dmFyIHc9d3NbaV07aWYoYWxpZ25bdl09PT12JiZwcmV2SWR4PHBvc1t3XSYmIWhhc0NvbmZsaWN0KGNvbmZsaWN0cyx2LHcpKXthbGlnblt3XT12O2FsaWduW3ZdPXJvb3Rbdl09cm9vdFt3XTtwcmV2SWR4PXBvc1t3XX19fX0pfSk7cmV0dXJue3Jvb3Q6cm9vdCxhbGlnbjphbGlnbn19ZnVuY3Rpb24gaG9yaXpvbnRhbENvbXBhY3Rpb24oZyxsYXllcmluZyxyb290LGFsaWduLHJldmVyc2VTZXApe3ZhciB4cz17fSxibG9ja0c9YnVpbGRCbG9ja0dyYXBoKGcsbGF5ZXJpbmcscm9vdCxyZXZlcnNlU2VwKSxib3JkZXJUeXBlPXJldmVyc2VTZXA/ImJvcmRlckxlZnQiOiJib3JkZXJSaWdodCI7ZnVuY3Rpb24gaXRlcmF0ZShzZXRYc0Z1bmMsbmV4dE5vZGVzRnVuYyl7dmFyIHN0YWNrPQpibG9ja0cubm9kZXMoKTt2YXIgZWxlbT1zdGFjay5wb3AoKTt2YXIgdmlzaXRlZD17fTt3aGlsZShlbGVtKXtpZih2aXNpdGVkW2VsZW1dKXNldFhzRnVuYyhlbGVtKTtlbHNle3Zpc2l0ZWRbZWxlbV09dHJ1ZTtzdGFjay5wdXNoKGVsZW0pO3N0YWNrPXN0YWNrLmNvbmNhdChuZXh0Tm9kZXNGdW5jKGVsZW0pKX1lbGVtPXN0YWNrLnBvcCgpfX1mdW5jdGlvbiBwYXNzMShlbGVtKXt4c1tlbGVtXT1ibG9ja0cuaW5FZGdlcyhlbGVtKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLGUpe3JldHVybiBNYXRoLm1heChhY2MseHNbZS52XStibG9ja0cuZWRnZShlKSl9LDApfWZ1bmN0aW9uIHBhc3MyKGVsZW0pe3ZhciBtaW49YmxvY2tHLm91dEVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsZSl7cmV0dXJuIE1hdGgubWluKGFjYyx4c1tlLnddLWJsb2NrRy5lZGdlKGUpKX0sTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTt2YXIgbm9kZT1nLm5vZGUoZWxlbSk7aWYobWluIT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZJiYKbm9kZS5ib3JkZXJUeXBlIT09Ym9yZGVyVHlwZSl4c1tlbGVtXT1NYXRoLm1heCh4c1tlbGVtXSxtaW4pfWl0ZXJhdGUocGFzczEsXy5iaW5kKGJsb2NrRy5wcmVkZWNlc3NvcnMsYmxvY2tHKSk7aXRlcmF0ZShwYXNzMixfLmJpbmQoYmxvY2tHLnN1Y2Nlc3NvcnMsYmxvY2tHKSk7Xy5mb3JFYWNoKGFsaWduLGZ1bmN0aW9uKHYpe3hzW3ZdPXhzW3Jvb3Rbdl1dfSk7cmV0dXJuIHhzfWZ1bmN0aW9uIGJ1aWxkQmxvY2tHcmFwaChnLGxheWVyaW5nLHJvb3QscmV2ZXJzZVNlcCl7dmFyIGJsb2NrR3JhcGg9bmV3IEdyYXBoLGdyYXBoTGFiZWw9Zy5ncmFwaCgpLHNlcEZuPXNlcChncmFwaExhYmVsLm5vZGVzZXAsZ3JhcGhMYWJlbC5lZGdlc2VwLHJldmVyc2VTZXApO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIHU7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe3ZhciB2Um9vdD1yb290W3ZdO2Jsb2NrR3JhcGguc2V0Tm9kZSh2Um9vdCk7aWYodSl7dmFyIHVSb290PQpyb290W3VdLHByZXZNYXg9YmxvY2tHcmFwaC5lZGdlKHVSb290LHZSb290KTtibG9ja0dyYXBoLnNldEVkZ2UodVJvb3QsdlJvb3QsTWF0aC5tYXgoc2VwRm4oZyx2LHUpLHByZXZNYXh8fDApKX11PXZ9KX0pO3JldHVybiBibG9ja0dyYXBofWZ1bmN0aW9uIGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcseHNzKXtyZXR1cm4gXy5taW5CeShfLnZhbHVlcyh4c3MpLGZ1bmN0aW9uKHhzKXt2YXIgbWF4PU51bWJlci5ORUdBVElWRV9JTkZJTklUWTt2YXIgbWluPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtfLmZvckluKHhzLGZ1bmN0aW9uKHgsdil7dmFyIGhhbGZXaWR0aD13aWR0aChnLHYpLzI7bWF4PU1hdGgubWF4KHgraGFsZldpZHRoLG1heCk7bWluPU1hdGgubWluKHgtaGFsZldpZHRoLG1pbil9KTtyZXR1cm4gbWF4LW1pbn0pfWZ1bmN0aW9uIGFsaWduQ29vcmRpbmF0ZXMoeHNzLGFsaWduVG8pe3ZhciBhbGlnblRvVmFscz1fLnZhbHVlcyhhbGlnblRvKSxhbGlnblRvTWluPQpfLm1pbihhbGlnblRvVmFscyksYWxpZ25Ub01heD1fLm1heChhbGlnblRvVmFscyk7Xy5mb3JFYWNoKFsidSIsImQiXSxmdW5jdGlvbih2ZXJ0KXtfLmZvckVhY2goWyJsIiwiciJdLGZ1bmN0aW9uKGhvcml6KXt2YXIgYWxpZ25tZW50PXZlcnQraG9yaXoseHM9eHNzW2FsaWdubWVudF0sZGVsdGE7aWYoeHM9PT1hbGlnblRvKXJldHVybjt2YXIgeHNWYWxzPV8udmFsdWVzKHhzKTtkZWx0YT1ob3Jpej09PSJsIj9hbGlnblRvTWluLV8ubWluKHhzVmFscyk6YWxpZ25Ub01heC1fLm1heCh4c1ZhbHMpO2lmKGRlbHRhKXhzc1thbGlnbm1lbnRdPV8ubWFwVmFsdWVzKHhzLGZ1bmN0aW9uKHgpe3JldHVybiB4K2RlbHRhfSl9KX0pfWZ1bmN0aW9uIGJhbGFuY2UoeHNzLGFsaWduKXtyZXR1cm4gXy5tYXBWYWx1ZXMoeHNzLnVsLGZ1bmN0aW9uKGlnbm9yZSx2KXtpZihhbGlnbilyZXR1cm4geHNzW2FsaWduLnRvTG93ZXJDYXNlKCldW3ZdO2Vsc2V7dmFyIHhzPV8uc29ydEJ5KF8ubWFwKHhzcywKdikpO3JldHVybih4c1sxXSt4c1syXSkvMn19KX1mdW5jdGlvbiBwb3NpdGlvblgoZyl7dmFyIGxheWVyaW5nPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKSxjb25mbGljdHM9Xy5tZXJnZShmaW5kVHlwZTFDb25mbGljdHMoZyxsYXllcmluZyksZmluZFR5cGUyQ29uZmxpY3RzKGcsbGF5ZXJpbmcpKTt2YXIgeHNzPXt9LGFkanVzdGVkTGF5ZXJpbmc7Xy5mb3JFYWNoKFsidSIsImQiXSxmdW5jdGlvbih2ZXJ0KXthZGp1c3RlZExheWVyaW5nPXZlcnQ9PT0idSI/bGF5ZXJpbmc6Xy52YWx1ZXMobGF5ZXJpbmcpLnJldmVyc2UoKTtfLmZvckVhY2goWyJsIiwiciJdLGZ1bmN0aW9uKGhvcml6KXtpZihob3Jpej09PSJyIilhZGp1c3RlZExheWVyaW5nPV8ubWFwKGFkanVzdGVkTGF5ZXJpbmcsZnVuY3Rpb24oaW5uZXIpe3JldHVybiBfLnZhbHVlcyhpbm5lcikucmV2ZXJzZSgpfSk7dmFyIG5laWdoYm9yRm49Xy5iaW5kKHZlcnQ9PT0idSI/Zy5wcmVkZWNlc3NvcnM6Zy5zdWNjZXNzb3JzLApnKTt2YXIgYWxpZ249dmVydGljYWxBbGlnbm1lbnQoZyxhZGp1c3RlZExheWVyaW5nLGNvbmZsaWN0cyxuZWlnaGJvckZuKTt2YXIgeHM9aG9yaXpvbnRhbENvbXBhY3Rpb24oZyxhZGp1c3RlZExheWVyaW5nLGFsaWduLnJvb3QsYWxpZ24uYWxpZ24saG9yaXo9PT0iciIpO2lmKGhvcml6PT09InIiKXhzPV8ubWFwVmFsdWVzKHhzLGZ1bmN0aW9uKHgpe3JldHVybi14fSk7eHNzW3ZlcnQraG9yaXpdPXhzfSl9KTt2YXIgc21hbGxlc3RXaWR0aD1maW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLHhzcyk7YWxpZ25Db29yZGluYXRlcyh4c3Msc21hbGxlc3RXaWR0aCk7cmV0dXJuIGJhbGFuY2UoeHNzLGcuZ3JhcGgoKS5hbGlnbil9ZnVuY3Rpb24gc2VwKG5vZGVTZXAsZWRnZVNlcCxyZXZlcnNlU2VwKXtyZXR1cm4gZnVuY3Rpb24oZyx2LHcpe3ZhciB2TGFiZWw9Zy5ub2RlKHYpLHdMYWJlbD1nLm5vZGUodyksc3VtPTAsZGVsdGE7c3VtKz12TGFiZWwud2lkdGgvMjtpZihfLmhhcyh2TGFiZWwsCiJsYWJlbHBvcyIpKXN3aXRjaCh2TGFiZWwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSl7Y2FzZSAibCI6ZGVsdGE9LXZMYWJlbC53aWR0aC8yO2JyZWFrO2Nhc2UgInIiOmRlbHRhPXZMYWJlbC53aWR0aC8yO2JyZWFrfWlmKGRlbHRhKXN1bSs9cmV2ZXJzZVNlcD9kZWx0YTotZGVsdGE7ZGVsdGE9MDtzdW0rPSh2TGFiZWwuZHVtbXk/ZWRnZVNlcDpub2RlU2VwKS8yO3N1bSs9KHdMYWJlbC5kdW1teT9lZGdlU2VwOm5vZGVTZXApLzI7c3VtKz13TGFiZWwud2lkdGgvMjtpZihfLmhhcyh3TGFiZWwsImxhYmVscG9zIikpc3dpdGNoKHdMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKXtjYXNlICJsIjpkZWx0YT13TGFiZWwud2lkdGgvMjticmVhaztjYXNlICJyIjpkZWx0YT0td0xhYmVsLndpZHRoLzI7YnJlYWt9aWYoZGVsdGEpc3VtKz1yZXZlcnNlU2VwP2RlbHRhOi1kZWx0YTtkZWx0YT0wO3JldHVybiBzdW19fWZ1bmN0aW9uIHdpZHRoKGcsdil7cmV0dXJuIGcubm9kZSh2KS53aWR0aH0KfSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOX1dLDI0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKSxwb3NpdGlvblg9cmVxdWlyZSgiLi9iayIpLnBvc2l0aW9uWDttb2R1bGUuZXhwb3J0cz1wb3NpdGlvbjtmdW5jdGlvbiBwb3NpdGlvbihnKXtnPXV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpO3Bvc2l0aW9uWShnKTtfLmZvckVhY2gocG9zaXRpb25YKGcpLGZ1bmN0aW9uKHgsdil7Zy5ub2RlKHYpLng9eH0pfWZ1bmN0aW9uIHBvc2l0aW9uWShnKXt2YXIgbGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpLHJhbmtTZXA9Zy5ncmFwaCgpLnJhbmtzZXAscHJldlk9MDtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe3ZhciBtYXhIZWlnaHQ9Xy5tYXgoXy5tYXAobGF5ZXIsZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5oZWlnaHR9KSk7Cl8uZm9yRWFjaChsYXllcixmdW5jdGlvbih2KXtnLm5vZGUodikueT1wcmV2WSttYXhIZWlnaHQvMn0pO3ByZXZZKz1tYXhIZWlnaHQrcmFua1NlcH0pfX0seyIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOSwiLi9iayI6MjN9XSwyNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCxzbGFjaz1yZXF1aXJlKCIuL3V0aWwiKS5zbGFjazttb2R1bGUuZXhwb3J0cz1mZWFzaWJsZVRyZWU7ZnVuY3Rpb24gZmVhc2libGVUcmVlKGcpe3ZhciB0PW5ldyBHcmFwaCh7ZGlyZWN0ZWQ6ZmFsc2V9KTt2YXIgc3RhcnQ9Zy5ub2RlcygpWzBdLHNpemU9Zy5ub2RlQ291bnQoKTt0LnNldE5vZGUoc3RhcnQse30pO3ZhciBlZGdlLGRlbHRhO3doaWxlKHRpZ2h0VHJlZSh0LGcpPHNpemUpe2VkZ2U9ZmluZE1pblNsYWNrRWRnZSh0LGcpO2RlbHRhPXQuaGFzTm9kZShlZGdlLnYpPwpzbGFjayhnLGVkZ2UpOi1zbGFjayhnLGVkZ2UpO3NoaWZ0UmFua3ModCxnLGRlbHRhKX1yZXR1cm4gdH1mdW5jdGlvbiB0aWdodFRyZWUodCxnKXtmdW5jdGlvbiBkZnModil7Xy5mb3JFYWNoKGcubm9kZUVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlVj1lLnYsdz12PT09ZWRnZVY/ZS53OmVkZ2VWO2lmKCF0Lmhhc05vZGUodykmJiFzbGFjayhnLGUpKXt0LnNldE5vZGUodyx7fSk7dC5zZXRFZGdlKHYsdyx7fSk7ZGZzKHcpfX0pfV8uZm9yRWFjaCh0Lm5vZGVzKCksZGZzKTtyZXR1cm4gdC5ub2RlQ291bnQoKX1mdW5jdGlvbiBmaW5kTWluU2xhY2tFZGdlKHQsZyl7cmV0dXJuIF8ubWluQnkoZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2lmKHQuaGFzTm9kZShlLnYpIT09dC5oYXNOb2RlKGUudykpcmV0dXJuIHNsYWNrKGcsZSl9KX1mdW5jdGlvbiBzaGlmdFJhbmtzKHQsZyxkZWx0YSl7Xy5mb3JFYWNoKHQubm9kZXMoKSxmdW5jdGlvbih2KXtnLm5vZGUodikucmFuays9ZGVsdGF9KX0KfSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI4fV0sMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciByYW5rVXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxsb25nZXN0UGF0aD1yYW5rVXRpbC5sb25nZXN0UGF0aCxmZWFzaWJsZVRyZWU9cmVxdWlyZSgiLi9mZWFzaWJsZS10cmVlIiksbmV0d29ya1NpbXBsZXg9cmVxdWlyZSgiLi9uZXR3b3JrLXNpbXBsZXgiKTttb2R1bGUuZXhwb3J0cz1yYW5rO2Z1bmN0aW9uIHJhbmsoZyl7c3dpdGNoKGcuZ3JhcGgoKS5yYW5rZXIpe2Nhc2UgIm5ldHdvcmstc2ltcGxleCI6bmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7YnJlYWs7Y2FzZSAidGlnaHQtdHJlZSI6dGlnaHRUcmVlUmFua2VyKGcpO2JyZWFrO2Nhc2UgImxvbmdlc3QtcGF0aCI6bG9uZ2VzdFBhdGhSYW5rZXIoZyk7YnJlYWs7ZGVmYXVsdDpuZXR3b3JrU2ltcGxleFJhbmtlcihnKX19dmFyIGxvbmdlc3RQYXRoUmFua2VyPWxvbmdlc3RQYXRoOwpmdW5jdGlvbiB0aWdodFRyZWVSYW5rZXIoZyl7bG9uZ2VzdFBhdGgoZyk7ZmVhc2libGVUcmVlKGcpfWZ1bmN0aW9uIG5ldHdvcmtTaW1wbGV4UmFua2VyKGcpe25ldHdvcmtTaW1wbGV4KGcpfX0seyIuL2ZlYXNpYmxlLXRyZWUiOjI1LCIuL25ldHdvcmstc2ltcGxleCI6MjcsIi4vdXRpbCI6Mjh9XSwyNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksZmVhc2libGVUcmVlPXJlcXVpcmUoIi4vZmVhc2libGUtdHJlZSIpLHNsYWNrPXJlcXVpcmUoIi4vdXRpbCIpLnNsYWNrLGluaXRSYW5rPXJlcXVpcmUoIi4vdXRpbCIpLmxvbmdlc3RQYXRoLHByZW9yZGVyPXJlcXVpcmUoIi4uL2dyYXBobGliIikuYWxnLnByZW9yZGVyLHBvc3RvcmRlcj1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLmFsZy5wb3N0b3JkZXIsc2ltcGxpZnk9cmVxdWlyZSgiLi4vdXRpbCIpLnNpbXBsaWZ5O21vZHVsZS5leHBvcnRzPW5ldHdvcmtTaW1wbGV4OwpuZXR3b3JrU2ltcGxleC5pbml0TG93TGltVmFsdWVzPWluaXRMb3dMaW1WYWx1ZXM7bmV0d29ya1NpbXBsZXguaW5pdEN1dFZhbHVlcz1pbml0Q3V0VmFsdWVzO25ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZT1jYWxjQ3V0VmFsdWU7bmV0d29ya1NpbXBsZXgubGVhdmVFZGdlPWxlYXZlRWRnZTtuZXR3b3JrU2ltcGxleC5lbnRlckVkZ2U9ZW50ZXJFZGdlO25ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXM9ZXhjaGFuZ2VFZGdlcztmdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKXtnPXNpbXBsaWZ5KGcpO2luaXRSYW5rKGcpO3ZhciB0PWZlYXNpYmxlVHJlZShnKTtpbml0TG93TGltVmFsdWVzKHQpO2luaXRDdXRWYWx1ZXModCxnKTt2YXIgZSxmO3doaWxlKGU9bGVhdmVFZGdlKHQpKXtmPWVudGVyRWRnZSh0LGcsZSk7ZXhjaGFuZ2VFZGdlcyh0LGcsZSxmKX19ZnVuY3Rpb24gaW5pdEN1dFZhbHVlcyh0LGcpe3ZhciB2cz1wb3N0b3JkZXIodCx0Lm5vZGVzKCkpO3ZzPXZzLnNsaWNlKDAsCnZzLmxlbmd0aC0xKTtfLmZvckVhY2godnMsZnVuY3Rpb24odil7YXNzaWduQ3V0VmFsdWUodCxnLHYpfSl9ZnVuY3Rpb24gYXNzaWduQ3V0VmFsdWUodCxnLGNoaWxkKXt2YXIgY2hpbGRMYWI9dC5ub2RlKGNoaWxkKSxwYXJlbnQ9Y2hpbGRMYWIucGFyZW50O3QuZWRnZShjaGlsZCxwYXJlbnQpLmN1dHZhbHVlPWNhbGNDdXRWYWx1ZSh0LGcsY2hpbGQpfWZ1bmN0aW9uIGNhbGNDdXRWYWx1ZSh0LGcsY2hpbGQpe3ZhciBjaGlsZExhYj10Lm5vZGUoY2hpbGQpLHBhcmVudD1jaGlsZExhYi5wYXJlbnQsY2hpbGRJc1RhaWw9dHJ1ZSxncmFwaEVkZ2U9Zy5lZGdlKGNoaWxkLHBhcmVudCksY3V0VmFsdWU9MDtpZighZ3JhcGhFZGdlKXtjaGlsZElzVGFpbD1mYWxzZTtncmFwaEVkZ2U9Zy5lZGdlKHBhcmVudCxjaGlsZCl9Y3V0VmFsdWU9Z3JhcGhFZGdlLndlaWdodDtfLmZvckVhY2goZy5ub2RlRWRnZXMoY2hpbGQpLGZ1bmN0aW9uKGUpe3ZhciBpc091dEVkZ2U9ZS52PT09Y2hpbGQsb3RoZXI9CmlzT3V0RWRnZT9lLnc6ZS52O2lmKG90aGVyIT09cGFyZW50KXt2YXIgcG9pbnRzVG9IZWFkPWlzT3V0RWRnZT09PWNoaWxkSXNUYWlsLG90aGVyV2VpZ2h0PWcuZWRnZShlKS53ZWlnaHQ7Y3V0VmFsdWUrPXBvaW50c1RvSGVhZD9vdGhlcldlaWdodDotb3RoZXJXZWlnaHQ7aWYoaXNUcmVlRWRnZSh0LGNoaWxkLG90aGVyKSl7dmFyIG90aGVyQ3V0VmFsdWU9dC5lZGdlKGNoaWxkLG90aGVyKS5jdXR2YWx1ZTtjdXRWYWx1ZSs9cG9pbnRzVG9IZWFkPy1vdGhlckN1dFZhbHVlOm90aGVyQ3V0VmFsdWV9fX0pO3JldHVybiBjdXRWYWx1ZX1mdW5jdGlvbiBpbml0TG93TGltVmFsdWVzKHRyZWUscm9vdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJvb3Q9dHJlZS5ub2RlcygpWzBdO2Rmc0Fzc2lnbkxvd0xpbSh0cmVlLHt9LDEscm9vdCl9ZnVuY3Rpb24gZGZzQXNzaWduTG93TGltKHRyZWUsdmlzaXRlZCxuZXh0TGltLHYscGFyZW50KXt2YXIgbG93PW5leHRMaW0sbGFiZWw9dHJlZS5ub2RlKHYpOwp2aXNpdGVkW3ZdPXRydWU7Xy5mb3JFYWNoKHRyZWUubmVpZ2hib3JzKHYpLGZ1bmN0aW9uKHcpe2lmKCFfLmhhcyh2aXNpdGVkLHcpKW5leHRMaW09ZGZzQXNzaWduTG93TGltKHRyZWUsdmlzaXRlZCxuZXh0TGltLHcsdil9KTtsYWJlbC5sb3c9bG93O2xhYmVsLmxpbT1uZXh0TGltKys7aWYocGFyZW50KWxhYmVsLnBhcmVudD1wYXJlbnQ7ZWxzZSBkZWxldGUgbGFiZWwucGFyZW50O3JldHVybiBuZXh0TGltfWZ1bmN0aW9uIGxlYXZlRWRnZSh0cmVlKXtyZXR1cm4gXy5maW5kKHRyZWUuZWRnZXMoKSxmdW5jdGlvbihlKXtyZXR1cm4gdHJlZS5lZGdlKGUpLmN1dHZhbHVlPDB9KX1mdW5jdGlvbiBlbnRlckVkZ2UodCxnLGVkZ2Upe3ZhciB2PWVkZ2Uudix3PWVkZ2UudztpZighZy5oYXNFZGdlKHYsdykpe3Y9ZWRnZS53O3c9ZWRnZS52fXZhciB2TGFiZWw9dC5ub2RlKHYpLHdMYWJlbD10Lm5vZGUodyksdGFpbExhYmVsPXZMYWJlbCxmbGlwPWZhbHNlO2lmKHZMYWJlbC5saW0+d0xhYmVsLmxpbSl7dGFpbExhYmVsPQp3TGFiZWw7ZmxpcD10cnVlfXZhciBjYW5kaWRhdGVzPV8uZmlsdGVyKGcuZWRnZXMoKSxmdW5jdGlvbihlZGdlKXtyZXR1cm4gZmxpcD09PWlzRGVzY2VuZGFudCh0LHQubm9kZShlZGdlLnYpLHRhaWxMYWJlbCkmJmZsaXAhPT1pc0Rlc2NlbmRhbnQodCx0Lm5vZGUoZWRnZS53KSx0YWlsTGFiZWwpfSk7cmV0dXJuIF8ubWluQnkoY2FuZGlkYXRlcyxmdW5jdGlvbihlZGdlKXtyZXR1cm4gc2xhY2soZyxlZGdlKX0pfWZ1bmN0aW9uIGV4Y2hhbmdlRWRnZXModCxnLGUsZil7dmFyIHY9ZS52LHc9ZS53O3QucmVtb3ZlRWRnZSh2LHcpO3Quc2V0RWRnZShmLnYsZi53LHt9KTtpbml0TG93TGltVmFsdWVzKHQpO2luaXRDdXRWYWx1ZXModCxnKTt1cGRhdGVSYW5rcyh0LGcpfWZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsZyl7dmFyIHJvb3Q9Xy5maW5kKHQubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4hZy5ub2RlKHYpLnBhcmVudH0pLHZzPXByZW9yZGVyKHQscm9vdCk7dnM9dnMuc2xpY2UoMSk7Cl8uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXt2YXIgcGFyZW50PXQubm9kZSh2KS5wYXJlbnQsZWRnZT1nLmVkZ2UodixwYXJlbnQpLGZsaXBwZWQ9ZmFsc2U7aWYoIWVkZ2Upe2VkZ2U9Zy5lZGdlKHBhcmVudCx2KTtmbGlwcGVkPXRydWV9Zy5ub2RlKHYpLnJhbms9Zy5ub2RlKHBhcmVudCkucmFuaysoZmxpcHBlZD9lZGdlLm1pbmxlbjotZWRnZS5taW5sZW4pfSl9ZnVuY3Rpb24gaXNUcmVlRWRnZSh0cmVlLHUsdil7cmV0dXJuIHRyZWUuaGFzRWRnZSh1LHYpfWZ1bmN0aW9uIGlzRGVzY2VuZGFudCh0cmVlLHZMYWJlbCxyb290TGFiZWwpe3JldHVybiByb290TGFiZWwubG93PD12TGFiZWwubGltJiZ2TGFiZWwubGltPD1yb290TGFiZWwubGltfX0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6MjksIi4vZmVhc2libGUtdHJlZSI6MjUsIi4vdXRpbCI6Mjh9XSwyODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7Cm1vZHVsZS5leHBvcnRzPXtsb25nZXN0UGF0aDpsb25nZXN0UGF0aCxzbGFjazpzbGFja307ZnVuY3Rpb24gbG9uZ2VzdFBhdGgoZyl7dmFyIHZpc2l0ZWQ9e307ZnVuY3Rpb24gZGZzKHYpe3ZhciBsYWJlbD1nLm5vZGUodik7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm4gbGFiZWwucmFuazt2aXNpdGVkW3ZdPXRydWU7dmFyIHJhbms9Xy5taW5CeShfLm1hcChnLm91dEVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3JldHVybiBkZnMoZS53KS1nLmVkZ2UoZSkubWlubGVufSkpO2lmKHJhbms9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFl8fHJhbms9PT11bmRlZmluZWR8fHJhbms9PT1udWxsKXJhbms9MDtyZXR1cm4gbGFiZWwucmFuaz1yYW5rfV8uZm9yRWFjaChnLnNvdXJjZXMoKSxkZnMpfWZ1bmN0aW9uIHNsYWNrKGcsZSl7cmV0dXJuIGcubm9kZShlLncpLnJhbmstZy5ub2RlKGUudikucmFuay1nLmVkZ2UoZSkubWlubGVufX0seyIuLi9sb2Rhc2giOjEwfV0sMjk6W2Z1bmN0aW9uKHJlcXVpcmUsCm1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz17YWRkRHVtbXlOb2RlOmFkZER1bW15Tm9kZSxzaW1wbGlmeTpzaW1wbGlmeSxhc05vbkNvbXBvdW5kR3JhcGg6YXNOb25Db21wb3VuZEdyYXBoLHN1Y2Nlc3NvcldlaWdodHM6c3VjY2Vzc29yV2VpZ2h0cyxwcmVkZWNlc3NvcldlaWdodHM6cHJlZGVjZXNzb3JXZWlnaHRzLGludGVyc2VjdFJlY3Q6aW50ZXJzZWN0UmVjdCxidWlsZExheWVyTWF0cml4OmJ1aWxkTGF5ZXJNYXRyaXgsbm9ybWFsaXplUmFua3M6bm9ybWFsaXplUmFua3MscmVtb3ZlRW1wdHlSYW5rczpyZW1vdmVFbXB0eVJhbmtzLGFkZEJvcmRlck5vZGU6YWRkQm9yZGVyTm9kZSxtYXhSYW5rOm1heFJhbmsscGFydGl0aW9uOnBhcnRpdGlvbix0aW1lOnRpbWUsbm90aW1lOm5vdGltZX07ZnVuY3Rpb24gYWRkRHVtbXlOb2RlKGcsdHlwZSxhdHRycyxuYW1lKXt2YXIgdjsKZG8gdj1fLnVuaXF1ZUlkKG5hbWUpO3doaWxlKGcuaGFzTm9kZSh2KSk7YXR0cnMuZHVtbXk9dHlwZTtnLnNldE5vZGUodixhdHRycyk7cmV0dXJuIHZ9ZnVuY3Rpb24gc2ltcGxpZnkoZyl7dmFyIHNpbXBsaWZpZWQ9KG5ldyBHcmFwaCkuc2V0R3JhcGgoZy5ncmFwaCgpKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3NpbXBsaWZpZWQuc2V0Tm9kZSh2LGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBzaW1wbGVMYWJlbD1zaW1wbGlmaWVkLmVkZ2UoZS52LGUudyl8fHt3ZWlnaHQ6MCxtaW5sZW46MX0sbGFiZWw9Zy5lZGdlKGUpO3NpbXBsaWZpZWQuc2V0RWRnZShlLnYsZS53LHt3ZWlnaHQ6c2ltcGxlTGFiZWwud2VpZ2h0K2xhYmVsLndlaWdodCxtaW5sZW46TWF0aC5tYXgoc2ltcGxlTGFiZWwubWlubGVuLGxhYmVsLm1pbmxlbil9KX0pO3JldHVybiBzaW1wbGlmaWVkfWZ1bmN0aW9uIGFzTm9uQ29tcG91bmRHcmFwaChnKXt2YXIgc2ltcGxpZmllZD0KKG5ldyBHcmFwaCh7bXVsdGlncmFwaDpnLmlzTXVsdGlncmFwaCgpfSkpLnNldEdyYXBoKGcuZ3JhcGgoKSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZighZy5jaGlsZHJlbih2KS5sZW5ndGgpc2ltcGxpZmllZC5zZXROb2RlKHYsZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7c2ltcGxpZmllZC5zZXRFZGdlKGUsZy5lZGdlKGUpKX0pO3JldHVybiBzaW1wbGlmaWVkfWZ1bmN0aW9uIHN1Y2Nlc3NvcldlaWdodHMoZyl7dmFyIHdlaWdodE1hcD1fLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHN1Y3M9e307Xy5mb3JFYWNoKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7c3Vjc1tlLnddPShzdWNzW2Uud118fDApK2cuZWRnZShlKS53ZWlnaHR9KTtyZXR1cm4gc3Vjc30pO3JldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksd2VpZ2h0TWFwKX1mdW5jdGlvbiBwcmVkZWNlc3NvcldlaWdodHMoZyl7dmFyIHdlaWdodE1hcD1fLm1hcChnLm5vZGVzKCksCmZ1bmN0aW9uKHYpe3ZhciBwcmVkcz17fTtfLmZvckVhY2goZy5pbkVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3ByZWRzW2Uudl09KHByZWRzW2Uudl18fDApK2cuZWRnZShlKS53ZWlnaHR9KTtyZXR1cm4gcHJlZHN9KTtyZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLHdlaWdodE1hcCl9ZnVuY3Rpb24gaW50ZXJzZWN0UmVjdChyZWN0LHBvaW50KXt2YXIgeD1yZWN0Lng7dmFyIHk9cmVjdC55O3ZhciBkeD1wb2ludC54LXg7dmFyIGR5PXBvaW50LnkteTt2YXIgdz1yZWN0LndpZHRoLzI7dmFyIGg9cmVjdC5oZWlnaHQvMjtpZighZHgmJiFkeSl0aHJvdyBuZXcgRXJyb3IoIk5vdCBwb3NzaWJsZSB0byBmaW5kIGludGVyc2VjdGlvbiBpbnNpZGUgb2YgdGhlIHJlY3RhbmdsZSIpO3ZhciBzeCxzeTtpZihNYXRoLmFicyhkeSkqdz5NYXRoLmFicyhkeCkqaCl7aWYoZHk8MCloPS1oO3N4PWgqZHgvZHk7c3k9aH1lbHNle2lmKGR4PDApdz0tdztzeD13O3N5PXcqZHkvZHh9cmV0dXJue3g6eCsKc3gseTp5K3N5fX1mdW5jdGlvbiBidWlsZExheWVyTWF0cml4KGcpe3ZhciBsYXllcmluZz1fLm1hcChfLnJhbmdlKG1heFJhbmsoZykrMSksZnVuY3Rpb24oKXtyZXR1cm5bXX0pO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLHJhbms9bm9kZS5yYW5rO2lmKCFfLmlzVW5kZWZpbmVkKHJhbmspKWxheWVyaW5nW3JhbmtdW25vZGUub3JkZXJdPXZ9KTtyZXR1cm4gbGF5ZXJpbmd9ZnVuY3Rpb24gbm9ybWFsaXplUmFua3MoZyl7dmFyIG1pbj1fLm1pbkJ5KF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYoXy5oYXMobm9kZSwicmFuayIpKW5vZGUucmFuay09bWlufSl9ZnVuY3Rpb24gcmVtb3ZlRW1wdHlSYW5rcyhnKXt2YXIgb2Zmc2V0PV8ubWluQnkoXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKTsKdmFyIGxheWVycz1bXTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciByYW5rPWcubm9kZSh2KS5yYW5rLW9mZnNldDtpZighbGF5ZXJzW3JhbmtdKWxheWVyc1tyYW5rXT1bXTtsYXllcnNbcmFua10ucHVzaCh2KX0pO3ZhciBkZWx0YT0wLG5vZGVSYW5rRmFjdG9yPWcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvcjtfLmZvckVhY2gobGF5ZXJzLGZ1bmN0aW9uKHZzLGkpe2lmKF8uaXNVbmRlZmluZWQodnMpJiZpJW5vZGVSYW5rRmFjdG9yIT09MCktLWRlbHRhO2Vsc2UgaWYoZGVsdGEpXy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS5yYW5rKz1kZWx0YX0pfSl9ZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLHByZWZpeCxyYW5rLG9yZGVyKXt2YXIgbm9kZT17d2lkdGg6MCxoZWlnaHQ6MH07aWYoYXJndW1lbnRzLmxlbmd0aD49NCl7bm9kZS5yYW5rPXJhbms7bm9kZS5vcmRlcj1vcmRlcn1yZXR1cm4gYWRkRHVtbXlOb2RlKGcsImJvcmRlciIsbm9kZSxwcmVmaXgpfQpmdW5jdGlvbiBtYXhSYW5rKGcpe3JldHVybiBfLm1heChfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHJhbms9Zy5ub2RlKHYpLnJhbms7aWYoIV8uaXNVbmRlZmluZWQocmFuaykpcmV0dXJuIHJhbmt9KSl9ZnVuY3Rpb24gcGFydGl0aW9uKGNvbGxlY3Rpb24sZm4pe3ZhciByZXN1bHQ9e2xoczpbXSxyaHM6W119O18uZm9yRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlKXtpZihmbih2YWx1ZSkpcmVzdWx0Lmxocy5wdXNoKHZhbHVlKTtlbHNlIHJlc3VsdC5yaHMucHVzaCh2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRpbWUobmFtZSxmbil7dmFyIHN0YXJ0PV8ubm93KCk7dHJ5e3JldHVybiBmbigpfWZpbmFsbHl7Y29uc29sZS5sb2cobmFtZSsiIHRpbWU6ICIrKF8ubm93KCktc3RhcnQpKyJtcyIpfX1mdW5jdGlvbiBub3RpbWUobmFtZSxmbil7cmV0dXJuIGZuKCl9fSx7Ii4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMH1dLDMwOltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9IjAuOC4yIn0se31dfSx7fSxbMV0pKDEpfSk7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vYW5ub3RhdGlvbi5qcwp2YXIgdGY7CihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpeyhmdW5jdGlvbihoKXtmdW5jdGlvbiBrKHEpe3JldHVybihkLnJlbmRlci5Bbm5vdGF0aW9uVHlwZVtxXXx8IiIpLnRvTG93ZXJDYXNlKCl8fG51bGx9ZnVuY3Rpb24gdChxLHUpe3UuYW5ub3RhdGlvblR5cGU9PT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TVU1NQVJZP2Yuc2VsZWN0T3JDcmVhdGVDaGlsZChxLCJ1c2UiKS5hdHRyKCJjbGFzcyIsInN1bW1hcnkiKS5hdHRyKCJ4bGluazpocmVmIiwiI3N1bW1hcnktaWNvbiIpLmF0dHIoImN1cnNvciIsInBvaW50ZXIiKToocT1mLm5vZGUuYnVpbGRTaGFwZShxLHUsZi5DbGFzcy5Bbm5vdGF0aW9uLk5PREUpLGYuc2VsZWN0T3JDcmVhdGVDaGlsZChxLCJ0aXRsZSIpLnRleHQodS5ub2RlLm5hbWUpKX1mdW5jdGlvbiBsKHEsdSl7bGV0IHg9dS5ub2RlLm5hbWUuc3BsaXQoIi8iKTtyZXR1cm4gcChxLHhbeC5sZW5ndGgtMV0sdSxudWxsKX1mdW5jdGlvbiBwKHEsdSwKeCxBKXtsZXQgeT1mLkNsYXNzLkFubm90YXRpb24uTEFCRUw7QSYmKHkrPSIgIitBKTtxPXEuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLHkpLmF0dHIoImR5IiwiLjM1ZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIseC5pc0luPyJlbmQiOiJzdGFydCIpLnRleHQodSk7cmV0dXJuIGIuZ3JhcGguc2NlbmUubm9kZS5lbmZvcmNlTGFiZWxXaWR0aChxLC0xKX1mdW5jdGlvbiBtKHEsdSx4LEEpe3Eub24oIm1vdXNlb3ZlciIseT0+e0EuZmlyZSgiYW5ub3RhdGlvbi1oaWdobGlnaHQiLHtuYW1lOnkubm9kZS5uYW1lLGhvc3ROYW1lOnUubm9kZS5uYW1lfSl9KS5vbigibW91c2VvdXQiLHk9PntBLmZpcmUoImFubm90YXRpb24tdW5oaWdobGlnaHQiLHtuYW1lOnkubm9kZS5uYW1lLGhvc3ROYW1lOnUubm9kZS5uYW1lfSl9KS5vbigiY2xpY2siLHk9PntkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtBLmZpcmUoImFubm90YXRpb24tc2VsZWN0Iix7bmFtZTp5Lm5vZGUubmFtZSxob3N0TmFtZTp1Lm5vZGUubmFtZX0pfSk7CmlmKHguYW5ub3RhdGlvblR5cGUhPT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TVU1NQVJZJiZ4LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuQ09OU1RBTlQpcS5vbigiY29udGV4dG1lbnUiLGYuY29udGV4dG1lbnUuZ2V0TWVudShBLGYubm9kZS5nZXRDb250ZXh0TWVudSh4Lm5vZGUsQSkpKX1mdW5jdGlvbiBuKHEsdSx4LEEpe2xldCB5PWQubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUodSk7eC5yZW5kZXJOb2RlSW5mbyYmeC5hbm5vdGF0aW9uVHlwZSE9PWQucmVuZGVyLkFubm90YXRpb25UeXBlLkVMTElQU0lTJiZmLm5vZGUuc3R5bGl6ZShxLHgucmVuZGVyTm9kZUluZm8sQSxmLkNsYXNzLkFubm90YXRpb24uTk9ERSk7eC5hbm5vdGF0aW9uVHlwZT09PWQucmVuZGVyLkFubm90YXRpb25UeXBlLlNVTU1BUlkmJih4LndpZHRoKz0xMCk7cS5zZWxlY3QoInRleHQuIitmLkNsYXNzLkFubm90YXRpb24uTEFCRUwpLnRyYW5zaXRpb24oKS5hdHRyKCJ4IiwKeSt4LmR4Kyh4LmlzSW4/LTE6MSkqKHgud2lkdGgvMit4LmxhYmVsT2Zmc2V0KSkuYXR0cigieSIsdS55K3guZHkpO3Euc2VsZWN0KCJ1c2Uuc3VtbWFyeSIpLnRyYW5zaXRpb24oKS5hdHRyKCJ4Iix5K3guZHgtMykuYXR0cigieSIsdS55K3guZHktNik7Zi5wb3NpdGlvbkVsbGlwc2UocS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKyIgZWxsaXBzZSIpLHkreC5keCx1LnkreC5keSx4LndpZHRoLHguaGVpZ2h0KTtmLnBvc2l0aW9uUmVjdChxLnNlbGVjdCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLk5PREUrIiByZWN0IikseSt4LmR4LHUueSt4LmR5LHgud2lkdGgseC5oZWlnaHQpO2YucG9zaXRpb25SZWN0KHEuc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uTk9ERSsiIHVzZSIpLHkreC5keCx1LnkreC5keSx4LndpZHRoLHguaGVpZ2h0KTtxLnNlbGVjdCgicGF0aC4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5FREdFKS50cmFuc2l0aW9uKCkuYXR0cigiZCIsdz0+Cnt3PXcucG9pbnRzLm1hcChDPT4oe3g6Qy5keCt5LHk6Qy5keSt1Lnl9KSk7cmV0dXJuIGYuZWRnZS5pbnRlcnBvbGF0ZSh3KX0pfWguYnVpbGRHcm91cD1mdW5jdGlvbihxLHUseCxBKXtxPXEuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEodS5saXN0LHk9Pnkubm9kZS5uYW1lKTtxLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIix5PT55Lm5vZGUubmFtZSkuZWFjaChmdW5jdGlvbih5KXtsZXQgdz1kMy5zZWxlY3QodGhpcyk7QS5hZGRBbm5vdGF0aW9uR3JvdXAoeSx4LHcpO2xldCBDPWYuQ2xhc3MuQW5ub3RhdGlvbi5FREdFLEY9eS5yZW5kZXJNZXRhZWRnZUluZm8mJnkucmVuZGVyTWV0YWVkZ2VJbmZvLm1ldGFlZGdlO0YmJiFGLm51bVJlZ3VsYXJFZGdlcyYmKEMrPSIgIitmLkNsYXNzLkFubm90YXRpb24uQ09OVFJPTF9FREdFKTtGJiZGLm51bVJlZkVkZ2VzJiYoQys9IiAiK2YuQ2xhc3MuRWRnZS5SRUZfTElORSk7CmYuZWRnZS5hcHBlbmRFZGdlKHcseSxBLEMpO3kuYW5ub3RhdGlvblR5cGUhPT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5FTExJUFNJUz8obCh3LHkpLHQodyx5KSk6cCh3LHkubm9kZS5uYW1lLHksZi5DbGFzcy5Bbm5vdGF0aW9uLkVMTElQU0lTKX0pLm1lcmdlKHEpLmF0dHIoImNsYXNzIix5PT5mLkNsYXNzLkFubm90YXRpb24uR1JPVVArIiAiK2soeS5hbm5vdGF0aW9uVHlwZSkrIiAiK2Yubm9kZS5ub2RlQ2xhc3MoeSkpLmVhY2goZnVuY3Rpb24oeSl7bGV0IHc9ZDMuc2VsZWN0KHRoaXMpO24odyx4LHksQSk7eS5hbm5vdGF0aW9uVHlwZSE9PWQucmVuZGVyLkFubm90YXRpb25UeXBlLkVMTElQU0lTJiZtKHcseCx5LEEpfSk7cS5leGl0KCkuZWFjaChmdW5jdGlvbih5KXtsZXQgdz1kMy5zZWxlY3QodGhpcyk7QS5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoeSx4LHcpfSkucmVtb3ZlKCk7cmV0dXJuIHF9fSkoZi5hbm5vdGF0aW9ufHwoZi5hbm5vdGF0aW9uPXt9KSl9KShkLnNjZW5lfHwKKGQuc2NlbmU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2NvbG9ycy5qcwooZnVuY3Rpb24oYil7Yi5DT0xPUlM9W3tuYW1lOiJHb29nbGUgQmx1ZSIsY29sb3I6IiM0MTg0ZjMiLGFjdGl2ZToiIzNhNTNjNSIsZGlzYWJsZWQ6IiNjYWQ4ZmMifSx7bmFtZToiR29vZ2xlIFJlZCIsY29sb3I6IiNkYjQ0MzciLGFjdGl2ZToiIzhmMmEwYyIsZGlzYWJsZWQ6IiNlOGM2YzEifSx7bmFtZToiR29vZ2xlIFllbGxvdyIsY29sb3I6IiNmNGI0MDAiLGFjdGl2ZToiI2RiOTIwMCIsZGlzYWJsZWQ6IiNmN2U4YjAifSx7bmFtZToiR29vZ2xlIEdyZWVuIixjb2xvcjoiIzBmOWQ1OCIsYWN0aXZlOiIjNDg4MDQ2IixkaXNhYmxlZDoiI2MyZTFjYyJ9LHtuYW1lOiJQdXJwbGUiLGNvbG9yOiIjYWE0NmJiIixhY3RpdmU6IiM1YzEzOTgiLGRpc2FibGVkOiIjZDdiY2U2In0se25hbWU6IlRlYWwiLGNvbG9yOiIjMDBhYmMwIixhY3RpdmU6IiM0NzgyOGUiLGRpc2FibGVkOiIjYzJlYWYyIn0se25hbWU6IkRlZXAgT3JhbmdlIixjb2xvcjoiI2ZmNmY0MiIsYWN0aXZlOiIjY2E0YTA2IiwKZGlzYWJsZWQ6IiNmMmNiYmEifSx7bmFtZToiTGltZSIsY29sb3I6IiM5ZDljMjMiLGFjdGl2ZToiIzdmNzcxZCIsZGlzYWJsZWQ6IiNmMWY0YzIifSx7bmFtZToiSW5kaWdvIixjb2xvcjoiIzViNmFiZiIsYWN0aXZlOiIjM2U0N2E5IixkaXNhYmxlZDoiI2M1YzhlOCJ9LHtuYW1lOiJQaW5rIixjb2xvcjoiI2VmNjE5MSIsYWN0aXZlOiIjY2ExYzYwIixkaXNhYmxlZDoiI2U5YjljZSJ9LHtuYW1lOiJEZWVwIFRlYWwiLGNvbG9yOiIjMDA3ODZhIixhY3RpdmU6IiMyYjRmNDMiLGRpc2FibGVkOiIjYmVkZWRhIn0se25hbWU6IkRlZXAgUGluayIsY29sb3I6IiNjMTE3NWEiLGFjdGl2ZToiIzc1MDg0ZiIsZGlzYWJsZWQ6IiNkZThjYWUifSx7bmFtZToiR3JheSIsY29sb3I6IiM5RTlFOUUiLGFjdGl2ZToiIzQyNDI0MiIsZGlzYWJsZWQ6IkY1RjVGNSJ9XS5yZWR1Y2UoKGQsZik9PntkW2YubmFtZV09ZjtyZXR1cm4gZH0se30pO2IuT1BfR1JPVVBfQ09MT1JTPVt7Y29sb3I6Ikdvb2dsZSBSZWQiLApncm91cHM6Imdlbl9sZWdhY3lfb3BzIGxlZ2FjeV9vcHMgbGVnYWN5X2Zsb2dzX2lucHV0IGxlZ2FjeV9pbWFnZV9pbnB1dCBsZWdhY3lfaW5wdXRfZXhhbXBsZV9pbnB1dCBsZWdhY3lfc2VxdWVuY2VfaW5wdXQgbGVnYWN5X3NldGlfaW5wdXRfaW5wdXQiLnNwbGl0KCIgIil9LHtjb2xvcjoiRGVlcCBPcmFuZ2UiLGdyb3VwczpbImNvbnN0YW50X29wcyJdfSx7Y29sb3I6IkluZGlnbyIsZ3JvdXBzOlsic3RhdGVfb3BzIl19LHtjb2xvcjoiUHVycGxlIixncm91cHM6WyJubl9vcHMiLCJubiJdfSx7Y29sb3I6Ikdvb2dsZSBHcmVlbiIsZ3JvdXBzOlsibWF0aF9vcHMiXX0se2NvbG9yOiJMaW1lIixncm91cHM6WyJhcnJheV9vcHMiXX0se2NvbG9yOiJUZWFsIixncm91cHM6WyJjb250cm9sX2Zsb3dfb3BzIiwiZGF0YV9mbG93X29wcyJdfSx7Y29sb3I6IlBpbmsiLGdyb3VwczpbInN1bW1hcnlfb3BzIl19LHtjb2xvcjoiRGVlcCBQaW5rIixncm91cHM6WyJpb19vcHMiXX1dLnJlZHVjZSgoZCwKZik9PntmLmdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uKGgpe2RbaF09Zi5jb2xvcn0pO3JldHVybiBkfSx7fSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2NvbW1vbi5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmLk9QX0dSQVBIPSJvcF9ncmFwaCI7Zi5DT05DRVBUVUFMX0dSQVBIPSJjb25jZXB0dWFsX2dyYXBoIjtmLlBST0ZJTEU9InByb2ZpbGUifSkoZC5TZWxlY3Rpb25UeXBlfHwoZC5TZWxlY3Rpb25UeXBlPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9jb250ZXh0bWVudS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXsoZnVuY3Rpb24oaCl7ZnVuY3Rpb24gayh0KXtsZXQgbD0wLHA9MDtmb3IoO3QmJjA8PXQub2Zmc2V0TGVmdCYmMDw9dC5vZmZzZXRUb3A7KWwrPXQub2Zmc2V0TGVmdC10LnNjcm9sbExlZnQscCs9dC5vZmZzZXRUb3AtdC5zY3JvbGxUb3AsdD10Lm9mZnNldFBhcmVudDtyZXR1cm57bGVmdDpsLHRvcDpwfX1oLmdldE1lbnU9ZnVuY3Rpb24odCxsKXtjb25zdCBwPXQuZ2V0Q29udGV4dE1lbnUoKSxtPWQzLnNlbGVjdCh0LmdldENvbnRleHRNZW51KCkpO3JldHVybiBmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoeSl7eSYmeS5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhwKXx8KG0uc3R5bGUoImRpc3BsYXkiLCJub25lIiksZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHUse2NhcHR1cmU6ITB9KSl9bGV0IHg9ZDMuZXZlbnQ7Y29uc3QgQT1rKHQpO20uc3R5bGUoImRpc3BsYXkiLCJibG9jayIpLnN0eWxlKCJsZWZ0IiwKeC5jbGllbnRYLUEubGVmdCsxKyJweCIpLnN0eWxlKCJ0b3AiLHguY2xpZW50WS1BLnRvcCsxKyJweCIpO3gucHJldmVudERlZmF1bHQoKTt4LnN0b3BQcm9wYWdhdGlvbigpO2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix1LHtjYXB0dXJlOiEwfSk7bS5odG1sKCIiKTttLmFwcGVuZCgidWwiKS5zZWxlY3RBbGwoImxpIikuZGF0YShsKS5lbnRlcigpLmFwcGVuZCgibGkiKS5vbigiY2xpY2siLHk9Pnt5LmFjdGlvbih0aGlzLG4scSk7dSgpfSkuaHRtbChmdW5jdGlvbih5KXtyZXR1cm4geS50aXRsZShuKX0pfX19KShmLmNvbnRleHRtZW51fHwoZi5jb250ZXh0bWVudT17fSkpfSkoZC5zY2VuZXx8KGQuc2NlbmU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2VkZ2UuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7KGZ1bmN0aW9uKGgpe2Z1bmN0aW9uIGsoeSl7cmV0dXJuIHkuditkLkVER0VfS0VZX0RFTElNK3kud31mdW5jdGlvbiB0KHksdyl7dz13LmdldE5vZGVCeU5hbWUoeS52KTtpZihudWxsPT13Lm91dHB1dFNoYXBlc3x8Xy5pc0VtcHR5KHcub3V0cHV0U2hhcGVzKSlyZXR1cm4gbnVsbDt5PXcub3V0cHV0U2hhcGVzW3kub3V0cHV0VGVuc29yS2V5XTtyZXR1cm4gbnVsbD09eT9udWxsOjA9PT15Lmxlbmd0aD8ic2NhbGFyIjp5Lm1hcChDPT4tMT09PUM/Ij8iOkMpLmpvaW4oIlx1MDBkNyIpfWZ1bmN0aW9uIGwoeSx3KXtyZXR1cm4gdy5lZGdlTGFiZWxGdW5jdGlvbj93LmVkZ2VMYWJlbEZ1bmN0aW9uKHksdyk6MTx5LmJhc2VFZGdlTGlzdC5sZW5ndGg/eS5iYXNlRWRnZUxpc3QubGVuZ3RoKyIgdGVuc29ycyI6dCh5LmJhc2VFZGdlTGlzdFswXSx3KX1mdW5jdGlvbiBwKHksdyxDKXtjb25zdCBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhiLmdyYXBoLnNjZW5lLlNWR19OQU1FU1BBQ0UsCiJwYXRoIik7Zm9yKGxldCBEPTE7RDx5Lmxlbmd0aDtEKyspaWYoRi5zZXRBdHRyaWJ1dGUoImQiLEMoeS5zbGljZSgwLEQpKSksRi5nZXRUb3RhbExlbmd0aCgpPncpcmV0dXJuIEQtMTtyZXR1cm4geS5sZW5ndGgtMX1mdW5jdGlvbiBtKHksdyxDKXt2YXIgRj1kMy5saW5lKCkueChOPT5OLngpLnkoTj0+Ti55KSxEPWQzLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwicGF0aCIpKS5hdHRyKCJkIixGKHkpKSxCPSt3LmF0dHIoIm1hcmtlcldpZHRoIiksST13LmF0dHIoInZpZXdCb3giKS5zcGxpdCgiICIpLm1hcChOdW1iZXIpO0k9SVsyXS1JWzBdO3c9K3cuYXR0cigicmVmWCIpO0Q9RC5ub2RlKCk7aWYoQylyZXR1cm4gQio9MS13L0ksQz1ELmdldFBvaW50QXRMZW5ndGgoQiksRj1wKHksQixGKSx5W0YtMV09e3g6Qy54LHk6Qy55fSx5LnNsaWNlKEYtMSk7Qz0xLXcvSTtCPUQuZ2V0VG90YWxMZW5ndGgoKS1CKkM7Qz0KRC5nZXRQb2ludEF0TGVuZ3RoKEIpO0Y9cCh5LEIsRik7eVtGXT17eDpDLngseTpDLnl9O3JldHVybiB5LnNsaWNlKDAsRisxKX1mdW5jdGlvbiBuKHksdyxDLEYpe0Y9Rnx8Zi5DbGFzcy5FZGdlLkxJTkU7dy5sYWJlbCYmdy5sYWJlbC5zdHJ1Y3R1cmFsJiYoRis9IiAiK2YuQ2xhc3MuRWRnZS5TVFJVQ1RVUkFMKTt3LmxhYmVsJiZ3LmxhYmVsLm1ldGFlZGdlJiZ3LmxhYmVsLm1ldGFlZGdlLm51bVJlZkVkZ2VzJiYoRis9IiAiK2YuQ2xhc3MuRWRnZS5SRUZFUkVOQ0VfRURHRSk7Qy5oYW5kbGVFZGdlU2VsZWN0ZWQmJihGKz0iICIrZi5DbGFzcy5FZGdlLlNFTEVDVEFCTEUpO2xldCBEPSJwYXRoXyIrayh3KTtpZihDLnJlbmRlckhpZXJhcmNoeS5lZGdlV2lkdGhGdW5jdGlvbil2YXIgQj1DLnJlbmRlckhpZXJhcmNoeS5lZGdlV2lkdGhGdW5jdGlvbih3LEYpO2Vsc2UgQj0xLG51bGwhPXcubGFiZWwmJm51bGwhPXcubGFiZWwubWV0YWVkZ2UmJihCPXcubGFiZWwubWV0YWVkZ2UudG90YWxTaXplKSwKQj1DLnJlbmRlckhpZXJhcmNoeS5lZGdlV2lkdGhTaXplZEJhc2VkU2NhbGUoQik7Rj15LmFwcGVuZCgicGF0aCIpLmF0dHIoImlkIixEKS5hdHRyKCJjbGFzcyIsRikuc3R5bGUoInN0cm9rZS13aWR0aCIsQisicHgiKTt3LmxhYmVsJiZ3LmxhYmVsLm1ldGFlZGdlJiYody5sYWJlbC5tZXRhZWRnZS5udW1SZWZFZGdlcz8oQj1gcmVmZXJlbmNlLWFycm93aGVhZC0ke0EoQil9YCxGLnN0eWxlKCJtYXJrZXItc3RhcnQiLGB1cmwoIyR7Qn0pYCksdy5sYWJlbC5zdGFydE1hcmtlcklkPUIpOihCPWBkYXRhZmxvdy1hcnJvd2hlYWQtJHtBKEIpfWAsRi5zdHlsZSgibWFya2VyLWVuZCIsYHVybCgjJHtCfSlgKSx3LmxhYmVsLmVuZE1hcmtlcklkPUIpKTtudWxsIT13LmxhYmVsJiZudWxsIT13LmxhYmVsLm1ldGFlZGdlJiYodz1sKHcubGFiZWwubWV0YWVkZ2UsQy5yZW5kZXJIaWVyYXJjaHkpLG51bGwhPXcmJnkuYXBwZW5kKCJ0ZXh0IikuYXBwZW5kKCJ0ZXh0UGF0aCIpLmF0dHIoInhsaW5rOmhyZWYiLAoiIyIrRCkuYXR0cigic3RhcnRPZmZzZXQiLCI1MCUiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoImRvbWluYW50LWJhc2VsaW5lIiwiY2VudHJhbCIpLnRleHQodykpfWZ1bmN0aW9uIHEoeSx3LEMsRixEKXtGPUMubGFiZWw7bGV0IEI9Ri5hZGpvaW5pbmdNZXRhZWRnZSxJPUYucG9pbnRzO3k9eS5zaGFkb3dSb290O0MubGFiZWwuc3RhcnRNYXJrZXJJZCYmKEk9bShJLGQzLnNlbGVjdCh5LnF1ZXJ5U2VsZWN0b3IoIiMiK0MubGFiZWwuc3RhcnRNYXJrZXJJZCkpLCEwKSk7Qy5sYWJlbC5lbmRNYXJrZXJJZCYmKEk9bShJLGQzLnNlbGVjdCh5LnF1ZXJ5U2VsZWN0b3IoIiMiK0MubGFiZWwuZW5kTWFya2VySWQpKSwhMSkpO2lmKCFCKXJldHVybiBkMy5pbnRlcnBvbGF0ZShELGguaW50ZXJwb2xhdGUoSSkpO2xldCBOPUIuZWRnZUdyb3VwLm5vZGUoKS5maXJzdENoaWxkLE89Ri5tZXRhZWRnZS5pbmJvdW5kO3JldHVybiBmdW5jdGlvbigpe2xldCBIPU4uZ2V0UG9pbnRBdExlbmd0aChPPwpOLmdldFRvdGFsTGVuZ3RoKCk6MCkubWF0cml4VHJhbnNmb3JtKE4uZ2V0Q1RNKCkpLm1hdHJpeFRyYW5zZm9ybSh3LmdldENUTSgpLmludmVyc2UoKSksSz1PPzA6SS5sZW5ndGgtMTtJW0tdLng9SC54O0lbS10ueT1ILnk7cmV0dXJuIGguaW50ZXJwb2xhdGUoSSl9fWZ1bmN0aW9uIHUoeSx3KXtkMy5zZWxlY3Qodykuc2VsZWN0KCJwYXRoLiIrZi5DbGFzcy5FZGdlLkxJTkUpLnRyYW5zaXRpb24oKS5hdHRyVHdlZW4oImQiLGZ1bmN0aW9uKEMsRixEKXtyZXR1cm4gcSh5LHRoaXMsQyxGLEQpfSl9ZnVuY3Rpb24geCh5LHcpe3kuY2xhc3NlZCgiZmFkZWQiLHcubGFiZWwuaXNGYWRlZE91dCk7dz13LmxhYmVsLm1ldGFlZGdlO3kuc2VsZWN0KCJwYXRoLiIrZi5DbGFzcy5FZGdlLkxJTkUpLmNsYXNzZWQoImNvbnRyb2wtZGVwIix3JiYhdy5udW1SZWd1bGFyRWRnZXMpfWguTUlOX0VER0VfV0lEVEg9Ljc1O2guTUFYX0VER0VfV0lEVEg9MTI7aC5FREdFX1dJRFRIX1NJWkVfQkFTRURfU0NBTEU9CmQzLnNjYWxlUG93KCkuZXhwb25lbnQoLjMpLmRvbWFpbihbMSw1RTZdKS5yYW5nZShbaC5NSU5fRURHRV9XSURUSCxoLk1BWF9FREdFX1dJRFRIXSkuY2xhbXAoITApO2xldCBBPWQzLnNjYWxlUXVhbnRpemUoKS5kb21haW4oW2guTUlOX0VER0VfV0lEVEgsaC5NQVhfRURHRV9XSURUSF0pLnJhbmdlKFsic21hbGwiLCJtZWRpdW0iLCJsYXJnZSIsInhsYXJnZSJdKTtoLmdldEVkZ2VLZXk9aztoLmJ1aWxkR3JvdXA9ZnVuY3Rpb24oeSx3LEMpe2xldCBGPVtdO0Y9Xy5yZWR1Y2Uody5lZGdlcygpLChELEIpPT57bGV0IEk9dy5lZGdlKEIpO0QucHVzaCh7djpCLnYsdzpCLncsbGFiZWw6SX0pO3JldHVybiBEfSxGKTt5PWYuc2VsZWN0T3JDcmVhdGVDaGlsZCh5LCJnIixmLkNsYXNzLkVkZ2UuQ09OVEFJTkVSKS5zZWxlY3RBbGwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzfSkuZGF0YShGLGspO3kuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsZi5DbGFzcy5FZGdlLkdST1VQKS5hdHRyKCJkYXRhLWVkZ2UiLAprKS5lYWNoKGZ1bmN0aW9uKEQpe2xldCBCPWQzLnNlbGVjdCh0aGlzKTtELmxhYmVsLmVkZ2VHcm91cD1CO0MuX2VkZ2VHcm91cEluZGV4W2soRCldPUI7aWYoQy5oYW5kbGVFZGdlU2VsZWN0ZWQpQi5vbigiY2xpY2siLEk9PntkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtDLmZpcmUoImVkZ2Utc2VsZWN0Iix7ZWRnZURhdGE6SSxlZGdlR3JvdXA6Qn0pfSk7bihCLEQsQyl9KS5tZXJnZSh5KS5lYWNoKGZ1bmN0aW9uKCl7dShDLHRoaXMpfSkuZWFjaChmdW5jdGlvbihEKXt4KGQzLnNlbGVjdCh0aGlzKSxELEMpfSk7eS5leGl0KCkuZWFjaChEPT57ZGVsZXRlIEMuX2VkZ2VHcm91cEluZGV4W2soRCldfSkucmVtb3ZlKCk7cmV0dXJuIHl9O2guZ2V0TGFiZWxGb3JCYXNlRWRnZT10O2guZ2V0TGFiZWxGb3JFZGdlPWw7aC5hcHBlbmRFZGdlPW47aC5pbnRlcnBvbGF0ZT1kMy5saW5lKCkuY3VydmUoZDMuY3VydmVCYXNpcykueCh5PT55LngpLnkoeT0+eS55KX0pKGYuZWRnZXx8KGYuZWRnZT0Ke30pKX0pKGQuc2NlbmV8fChkLnNjZW5lPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9leHRlcm5zLmpzCgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2dyYXBoLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZihILEssTSxMLFEpe3JldHVybihNP00rIi8iOiIiKSsoSCsoInVuZGVmaW5lZCIhPT10eXBlb2YgTCYmInVuZGVmaW5lZCIhPT10eXBlb2YgUT8iWyIrTCsiLSIrUSsiXSI6IiMiKStLKX1mdW5jdGlvbiBoKEgpe2lmKCFIKXJldHVybiBudWxsO2ZvcihsZXQgSz0wO0s8SC5sZW5ndGg7SysrKXtsZXQge2tleTpNLHZhbHVlOkx9PUhbS107aWYoIl9vdXRwdXRfc2hhcGVzIj09PU0pe2lmKCFMLmxpc3Quc2hhcGUpYnJlYWs7bGV0IFE9TC5saXN0LnNoYXBlLm1hcChUPT5ULnVua25vd25fcmFuaz9udWxsOm51bGw9PVQuZGltfHwxPT09VC5kaW0ubGVuZ3RoJiZudWxsPT1ULmRpbVswXS5zaXplP1tdOlQuZGltLm1hcChYPT5YLnNpemUpKTtILnNwbGljZShLLDEpO3JldHVybiBRfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBrKEgpe2lmKCFIKXJldHVybiBudWxsO2ZvcihsZXQgSz0wO0s8SC5sZW5ndGg7SysrKWlmKCJfWGxhQ2x1c3RlciI9PT0KSFtLXS5rZXkpcmV0dXJuIEhbS10udmFsdWUuc3x8bnVsbDtyZXR1cm4gbnVsbH1mdW5jdGlvbiB0KEgpe2xldCBLPVtdO18uZWFjaChILE09PntsZXQgTD0iXiI9PT1NWzBdO0wmJihNPU0uc3Vic3RyaW5nKDEpKTtsZXQgUT1NLFQ9IjAiLFg9TS5tYXRjaCgvKC4qKTooXHcrOlxkKykkLyk7aWYoWClRPVhbMV0sVD1YWzJdO2Vsc2UgaWYoWD1NLm1hdGNoKC8oLiopOihcZCspJC8pKVE9WFsxXSxUPVhbMl07MCE9PUsubGVuZ3RoJiZRPT09S1tLLmxlbmd0aC0xXS5uYW1lfHxLLnB1c2goe25hbWU6USxvdXRwdXRUZW5zb3JLZXk6VCxpc0NvbnRyb2xEZXBlbmRlbmN5Okx9KX0pO3JldHVybiBLfWZ1bmN0aW9uIGwoSCxLLE0sTCxRLFQpe0shPT1NLm5hbWUmJkguZWRnZXMucHVzaCh7djpLLHc6TS5uYW1lLG91dHB1dFRlbnNvcktleTpMLm91dHB1dFRlbnNvcktleSxpc0NvbnRyb2xEZXBlbmRlbmN5OkwuaXNDb250cm9sRGVwZW5kZW5jeSxpc1JlZmVyZW5jZUVkZ2U6ITA9PT1RLnJlZkVkZ2VzW00ub3ArCiIgIitUXX0pfWZ1bmN0aW9uIHAoSCxLLE0pe009TXx8e307bGV0IEw9bmV3IGdyYXBobGliLkdyYXBoKE0pO0wuc2V0R3JhcGgoe25hbWU6SCxyYW5rZGlyOk0ucmFua2Rpcnx8IkJUIix0eXBlOkt9KTtyZXR1cm4gTH1mdW5jdGlvbiBtKEgpe3JldHVybiBmdW5jdGlvbihLKXtmb3IobGV0IE09MDtNPEgubGVuZ3RoO00rKyl7bGV0IEw9bmV3IFJlZ0V4cChIW01dKTtpZigic3RyaW5nIj09PXR5cGVvZiBLLm9wJiZLLm9wLm1hdGNoKEwpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiBuKEgpe2xldCBLPUguc3BsaXQoZC5OQU1FU1BBQ0VfREVMSU0pO3JldHVybiBIK2QuTkFNRVNQQUNFX0RFTElNKyIoIitLW0subGVuZ3RoLTFdKyIpIn1mdW5jdGlvbiBxKEgsSyl7bGV0IE09e30sTD17fTtILnNvcnQoKTtmb3IobGV0IFE9MDtRPEgubGVuZ3RoLTE7KytRKXtsZXQgVD1IW1FdO18uZWFjaCh4KFQpLnNsaWNlKDAsLTEpLFg9PntMW1hdPSEwfSk7Zm9yKGxldCBYPVErMTtYPEgubGVuZ3RoOysrWCl7bGV0IGFhPQpIW1hdO2lmKF8uc3RhcnRzV2l0aChhYSxUKSl7aWYoYWEubGVuZ3RoPlQubGVuZ3RoJiZhYS5jaGFyQXQoVC5sZW5ndGgpPT09ZC5OQU1FU1BBQ0VfREVMSU0pe01bVF09bihUKTticmVha319ZWxzZSBicmVha319Xy5lYWNoKEssUT0+e1EgaW4gTCYmKE1bUV09bihRKSl9KTtyZXR1cm4gTX1mdW5jdGlvbiB1KEgpe2xldCBLPUgubm9kZXMoKS5tYXAoZnVuY3Rpb24oTSl7cmV0dXJuIEgubmVpZ2hib3JzKE0pLmxlbmd0aH0pO0suc29ydCgpO3JldHVybiBLfWZ1bmN0aW9uIHgoSCxLKXtsZXQgTT1bXSxMPUguaW5kZXhPZihkLk5BTUVTUEFDRV9ERUxJTSk7Zm9yKDswPD1MOylNLnB1c2goSC5zdWJzdHJpbmcoMCxMKSksTD1ILmluZGV4T2YoZC5OQU1FU1BBQ0VfREVMSU0sTCsxKTtLJiYoSz1LW0hdKSYmTS5wdXNoKEspO00ucHVzaChIKTtyZXR1cm4gTX1kLk5BTUVTUEFDRV9ERUxJTT0iLyI7ZC5ST09UX05BTUU9Il9fcm9vdF9fIjtkLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVg9CiJfX2Z1bmN0aW9uX2xpYnJhcnlfXyI7ZC5MQVJHRV9BVFRSU19LRVk9Il90b29fbGFyZ2VfYXR0cnMiO2QuTElNSVRfQVRUUl9TSVpFPTEwMjQ7ZC5FREdFX0tFWV9ERUxJTT0iLS0iO2xldCBBOyhmdW5jdGlvbihIKXtIW0guRlVMTD0wXT0iRlVMTCI7SFtILkVNQkVEREVEPTFdPSJFTUJFRERFRCI7SFtILk1FVEE9Ml09Ik1FVEEiO0hbSC5TRVJJRVM9M109IlNFUklFUyI7SFtILkNPUkU9NF09IkNPUkUiO0hbSC5TSEFET1c9NV09IlNIQURPVyI7SFtILkJSSURHRT02XT0iQlJJREdFIjtIW0guRURHRT03XT0iRURHRSJ9KShBPWQuR3JhcGhUeXBlfHwoZC5HcmFwaFR5cGU9e30pKTtsZXQgeTsoZnVuY3Rpb24oSCl7SFtILk1FVEE9MF09Ik1FVEEiO0hbSC5PUD0xXT0iT1AiO0hbSC5TRVJJRVM9Ml09IlNFUklFUyI7SFtILkJSSURHRT0zXT0iQlJJREdFIjtIW0guRUxMSVBTSVM9NF09IkVMTElQU0lTIn0pKHk9ZC5Ob2RlVHlwZXx8KGQuTm9kZVR5cGU9e30pKTtsZXQgdzsoZnVuY3Rpb24oSCl7SFtILklOQ0xVREU9CjBdPSJJTkNMVURFIjtIW0guRVhDTFVERT0xXT0iRVhDTFVERSI7SFtILlVOU1BFQ0lGSUVEPTJdPSJVTlNQRUNJRklFRCJ9KSh3PWQuSW5jbHVzaW9uVHlwZXx8KGQuSW5jbHVzaW9uVHlwZT17fSkpOyhmdW5jdGlvbihIKXtIW0guR1JPVVA9MF09IkdST1VQIjtIW0guVU5HUk9VUD0xXT0iVU5HUk9VUCJ9KShkLlNlcmllc0dyb3VwaW5nVHlwZXx8KGQuU2VyaWVzR3JvdXBpbmdUeXBlPXt9KSk7Y2xhc3MgQ3tjb25zdHJ1Y3Rvcigpe3RoaXMubm9kZXM9e307dGhpcy5lZGdlcz1bXX19ZC5TbGltR3JhcGg9QztjbGFzcyBGe2NvbnN0cnVjdG9yKEgpe3RoaXMudHlwZT15LkVMTElQU0lTO3RoaXMuaXNHcm91cE5vZGU9ITE7dGhpcy5jYXJkaW5hbGl0eT0xO3RoaXMuc3RhdHM9dGhpcy5wYXJlbnROb2RlPW51bGw7dGhpcy5zZXROdW1Nb3JlTm9kZXMoSCk7dGhpcy5pbmNsdWRlPXcuVU5TUEVDSUZJRUR9c2V0TnVtTW9yZU5vZGVzKEgpe3RoaXMubnVtTW9yZU5vZGVzPUg7dGhpcy5uYW1lPQoiLi4uICIrSCsiIG1vcmUifX1kLkVsbGlwc2lzTm9kZUltcGw9RjtjbGFzcyBEe2NvbnN0cnVjdG9yKEgpe3RoaXMub3A9SC5vcDt0aGlzLm5hbWU9SC5uYW1lO3RoaXMuZGV2aWNlPUguZGV2aWNlO3RoaXMuYXR0cj1ILmF0dHI7dGhpcy5pbnB1dHM9dChILmlucHV0KTt0aGlzLm91dHB1dFNoYXBlcz1oKEguYXR0cik7dGhpcy54bGFDbHVzdGVyPWsoSC5hdHRyKTt0aGlzLmNvbXBhdGlibGU9ITE7dGhpcy50eXBlPXkuT1A7dGhpcy5pc0dyb3VwTm9kZT0hMTt0aGlzLmNhcmRpbmFsaXR5PTE7dGhpcy5pbkVtYmVkZGluZ3M9W107dGhpcy5vdXRFbWJlZGRpbmdzPVtdO3RoaXMucGFyZW50Tm9kZT1udWxsO3RoaXMuaW5jbHVkZT13LlVOU1BFQ0lGSUVEO3RoaXMub3duaW5nU2VyaWVzPW51bGx9fWQuT3BOb2RlSW1wbD1EO2QuY3JlYXRlTWV0YW5vZGU9ZnVuY3Rpb24oSCxLPXt9KXtyZXR1cm4gbmV3IEkoSCxLKX07ZC5qb2luU3RhdHNJbmZvV2l0aEdyYXBoPWZ1bmN0aW9uKEgsSywKTSl7Xy5lYWNoKEgubm9kZXMsTD0+e0wuc3RhdHM9bnVsbH0pO18uZWFjaChLLmRldl9zdGF0cyxMPT57TSYmIU1bTC5kZXZpY2VdfHxfLmVhY2goTC5ub2RlX3N0YXRzLFE9PntsZXQgVD1RLm5vZGVfbmFtZSBpbiBILm5vZGVzP1Eubm9kZV9uYW1lOm4oUS5ub2RlX25hbWUpO2lmKFQgaW4gSC5ub2Rlcyl7dmFyIFg9MDtRLm1lbW9yeSYmXy5lYWNoKFEubWVtb3J5LGxhPT57bGEudG90YWxfYnl0ZXMmJigwPGxhLnRvdGFsX2J5dGVzP1grPU51bWJlcihsYS50b3RhbF9ieXRlcyk6Y29uc29sZS5sb2coImlnbm9yaW5nIG5lZ2F0aXZlIG1lbW9yeSBhbGxvY2F0aW9uIGZvciAiK1QpKX0pO3ZhciBhYT1udWxsO1Eub3V0cHV0JiYoYWE9Xy5tYXAoUS5vdXRwdXQsbGE9Pl8ubWFwKGxhLnRlbnNvcl9kZXNjcmlwdGlvbi5zaGFwZS5kaW0sWj0+TnVtYmVyKFouc2l6ZSkpKSk7SC5ub2Rlc1tUXS5kZXZpY2U9TC5kZXZpY2U7bnVsbD09SC5ub2Rlc1tUXS5zdGF0cyYmKEgubm9kZXNbVF0uc3RhdHM9Cm5ldyBCKGFhKSk7SC5ub2Rlc1tUXS5zdGF0cy5hZGRCeXRlc0FsbG9jYXRpb24oWCk7US5hbGxfZW5kX3JlbF9taWNyb3MmJigwPFEuYWxsX2VuZF9yZWxfbWljcm9zP0gubm9kZXNbVF0uc3RhdHMuYWRkRXhlY3V0aW9uVGltZShRLmFsbF9zdGFydF9taWNyb3MsUS5hbGxfc3RhcnRfbWljcm9zK1EuYWxsX2VuZF9yZWxfbWljcm9zKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgcnVudGltZSBmb3IgIitUKSl9fSl9KX07Y2xhc3MgQntjb25zdHJ1Y3RvcihIKXt0aGlzLnRvdGFsQnl0ZXM9MDt0aGlzLm91dHB1dFNpemU9SH1hZGRFeGVjdXRpb25UaW1lKEgsSyl7dGhpcy5zdGFydFRpbWU9bnVsbCE9dGhpcy5zdGFydFRpbWU/TWF0aC5taW4odGhpcy5zdGFydFRpbWUsSCk6SDt0aGlzLmVuZFRpbWU9bnVsbCE9dGhpcy5lbmRUaW1lP01hdGgubWF4KHRoaXMuZW5kVGltZSxLKTpLfWFkZEJ5dGVzQWxsb2NhdGlvbihIKXt0aGlzLnRvdGFsQnl0ZXM9bnVsbCE9dGhpcy50b3RhbEJ5dGVzPwpNYXRoLm1heCh0aGlzLnRvdGFsQnl0ZXMsSCk6SH1jb21iaW5lKEgpe251bGwhPUgudG90YWxCeXRlcyYmKHRoaXMudG90YWxCeXRlcys9SC50b3RhbEJ5dGVzKTtudWxsIT1ILmdldFRvdGFsTWljcm9zKCkmJnRoaXMuYWRkRXhlY3V0aW9uVGltZShILnN0YXJ0VGltZSxILmVuZFRpbWUpfWdldFRvdGFsTWljcm9zKCl7cmV0dXJuIG51bGw9PXRoaXMuc3RhcnRUaW1lfHxudWxsPT10aGlzLmVuZFRpbWU/bnVsbDp0aGlzLmVuZFRpbWUtdGhpcy5zdGFydFRpbWV9fWQuTm9kZVN0YXRzPUI7Y2xhc3MgSXtjb25zdHJ1Y3RvcihILEs9e30pe3RoaXMubmFtZT1IO3RoaXMudHlwZT15Lk1FVEE7dGhpcy5kZXB0aD0xO3RoaXMuaXNHcm91cE5vZGU9ITA7dGhpcy5jYXJkaW5hbGl0eT0wO3RoaXMubWV0YWdyYXBoPXAoSCxBLk1FVEEsSyk7dGhpcy5icmlkZ2VncmFwaD1udWxsO3RoaXMub3BIaXN0b2dyYW09e307dGhpcy5kZXZpY2VIaXN0b2dyYW09e307dGhpcy54bGFDbHVzdGVySGlzdG9ncmFtPQp7fTt0aGlzLmNvbXBhdGliaWxpdHlIaXN0b2dyYW09e2NvbXBhdGlibGU6MCxpbmNvbXBhdGlibGU6MH07dGhpcy5wYXJlbnROb2RlPXRoaXMudGVtcGxhdGVJZD1udWxsO3RoaXMuaGFzTm9uQ29udHJvbEVkZ2VzPSExO3RoaXMuaW5jbHVkZT13LlVOU1BFQ0lGSUVEO3RoaXMuYXNzb2NpYXRlZEZ1bmN0aW9uPSIifWdldEZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5tZXRhZ3JhcGgubm9kZSh0aGlzLm1ldGFncmFwaC5ub2RlcygpWzBdKX1nZXRSb290T3AoKXtsZXQgSD10aGlzLm5hbWUuc3BsaXQoIi8iKTtyZXR1cm4gdGhpcy5tZXRhZ3JhcGgubm9kZSh0aGlzLm5hbWUrIi8oIitIW0gubGVuZ3RoLTFdKyIpIil9bGVhdmVzKCl7bGV0IEg9W10sSz1bdGhpc10sTTtmb3IoO0subGVuZ3RoOyl7bGV0IEw9Sy5zaGlmdCgpO0wuaXNHcm91cE5vZGU/KE09TC5tZXRhZ3JhcGgsXy5lYWNoKE0ubm9kZXMoKSxRPT5LLnB1c2goTS5ub2RlKFEpKSkpOkgucHVzaChMLm5hbWUpfXJldHVybiBIfX0KZC5NZXRhbm9kZUltcGw9STtkLmNyZWF0ZU1ldGFlZGdlPWZ1bmN0aW9uKEgsSyl7cmV0dXJuIG5ldyBOKEgsSyl9O2NsYXNzIE57Y29uc3RydWN0b3IoSCxLKXt0aGlzLnY9SDt0aGlzLnc9Szt0aGlzLmJhc2VFZGdlTGlzdD1bXTt0aGlzLmluYm91bmQ9bnVsbDt0aGlzLnRvdGFsU2l6ZT10aGlzLm51bVJlZkVkZ2VzPXRoaXMubnVtQ29udHJvbEVkZ2VzPXRoaXMubnVtUmVndWxhckVkZ2VzPTB9YWRkQmFzZUVkZ2UoSCxLKXt0aGlzLmJhc2VFZGdlTGlzdC5wdXNoKEgpO0guaXNDb250cm9sRGVwZW5kZW5jeT90aGlzLm51bUNvbnRyb2xFZGdlcys9MTp0aGlzLm51bVJlZ3VsYXJFZGdlcys9MTtILmlzUmVmZXJlbmNlRWRnZSYmKHRoaXMubnVtUmVmRWRnZXMrPTEpO3RoaXMudG90YWxTaXplKz1OLmNvbXB1dGVTaXplT2ZFZGdlKEgsSyk7Sy5tYXhNZXRhRWRnZVNpemU9TWF0aC5tYXgoSy5tYXhNZXRhRWRnZVNpemUsdGhpcy50b3RhbFNpemUpfXN0YXRpYyBjb21wdXRlU2l6ZU9mRWRnZShILApLKXtsZXQgTT1LLm5vZGUoSC52KTtpZighTS5vdXRwdXRTaGFwZXMpcmV0dXJuIDE7Sy5oYXNTaGFwZUluZm89ITA7SD1PYmplY3Qua2V5cyhNLm91dHB1dFNoYXBlcykubWFwKEw9Pk0ub3V0cHV0U2hhcGVzW0xdKS5tYXAoTD0+bnVsbD09TD8xOkwucmVkdWNlKChRLFQpPT57LTE9PT1UJiYoVD0xKTtyZXR1cm4gUSpUfSwxKSk7cmV0dXJuIF8uc3VtKEgpfX1kLk1ldGFlZGdlSW1wbD1OO2QuY3JlYXRlU2VyaWVzTm9kZT1mdW5jdGlvbihILEssTSxMLFEsVCl7cmV0dXJuIG5ldyBPKEgsSyxNLEwsUSxUKX07ZC5nZXRTZXJpZXNOb2RlTmFtZT1mO2NsYXNzIE97Y29uc3RydWN0b3IoSCxLLE0sTCxRLFQpe3RoaXMubmFtZT1RfHxmKEgsSyxNKTt0aGlzLnR5cGU9eS5TRVJJRVM7dGhpcy5oYXNMb29wPSExO3RoaXMucHJlZml4PUg7dGhpcy5zdWZmaXg9Szt0aGlzLmNsdXN0ZXJJZD1MO3RoaXMuaWRzPVtdO3RoaXMucGFyZW50PU07dGhpcy5pc0dyb3VwTm9kZT0hMDt0aGlzLmNhcmRpbmFsaXR5PQowO3RoaXMubWV0YWdyYXBoPXAoUSxBLlNFUklFUyxUKTt0aGlzLnBhcmVudE5vZGU9dGhpcy5icmlkZ2VncmFwaD1udWxsO3RoaXMuZGV2aWNlSGlzdG9ncmFtPXt9O3RoaXMueGxhQ2x1c3Rlckhpc3RvZ3JhbT17fTt0aGlzLmNvbXBhdGliaWxpdHlIaXN0b2dyYW09e2NvbXBhdGlibGU6MCxpbmNvbXBhdGlibGU6MH07dGhpcy5oYXNOb25Db250cm9sRWRnZXM9ITE7dGhpcy5pbmNsdWRlPXcuVU5TUEVDSUZJRUR9fWQuRGVmYXVsdEJ1aWxkUGFyYW1zPXtlbmFibGVFbWJlZGRpbmc6ITAsaW5FbWJlZGRpbmdUeXBlczpbIkNvbnN0Il0sb3V0RW1iZWRkaW5nVHlwZXM6WyJeW2EtekEtWl0rU3VtbWFyeSQiXSxyZWZFZGdlczp7IkFzc2lnbiAwIjohMCwiQXNzaWduQWRkIDAiOiEwLCJBc3NpZ25TdWIgMCI6ITAsImFzc2lnbiAwIjohMCwiYXNzaWduX2FkZCAwIjohMCwiYXNzaWduX3N1YiAwIjohMCwiY291bnRfdXBfdG8gMCI6ITAsIlNjYXR0ZXJBZGQgMCI6ITAsIlNjYXR0ZXJTdWIgMCI6ITAsCiJTY2F0dGVyVXBkYXRlIDAiOiEwLCJzY2F0dGVyX2FkZCAwIjohMCwic2NhdHRlcl9zdWIgMCI6ITAsInNjYXR0ZXJfdXBkYXRlIDAiOiEwfX07ZC5idWlsZD1mdW5jdGlvbihILEssTSl7bGV0IEw9e30sUT17fSxUPXt9LFg9bShLLmluRW1iZWRkaW5nVHlwZXMpLGFhPW0oSy5vdXRFbWJlZGRpbmdUeXBlcyksbGE9W10sWj1ILm5vZGUsYmE9QXJyYXkoWi5sZW5ndGgpO3JldHVybiBiLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJOb3JtYWxpemluZyBuYW1lcyIsMzAsKCk9PntsZXQgZWE9QXJyYXkoWi5sZW5ndGgpLGNhPTA7Y29uc3Qga2E9RWE9PntsZXQgdmE9bmV3IEQoRWEpO2lmKFgodmEpKXJldHVybiBsYS5wdXNoKHZhLm5hbWUpLExbdmEubmFtZV09dmE7aWYoYWEodmEpKXJldHVybiBsYS5wdXNoKHZhLm5hbWUpLFFbdmEubmFtZV09dmEsXy5lYWNoKHZhLmlucHV0cyx4YT0+e3hhPXhhLm5hbWU7VFt4YV09VFt4YV18fFtdO1RbeGFdLnB1c2godmEpfSksdmE7ZWFbY2FdPQp2YTtiYVtjYV09dmEubmFtZTtjYSsrO3JldHVybiB2YX07Xy5lYWNoKFosa2EpO2NvbnN0IFk9RWE9Pntjb25zdCB2YT1kLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgrRWEuc2lnbmF0dXJlLm5hbWU7a2Eoe25hbWU6dmEsaW5wdXQ6W10sZGV2aWNlOiIiLG9wOiIiLGF0dHI6W119KTtpZihFYS5zaWduYXR1cmUuaW5wdXRfYXJnKXtsZXQgeWE9MDt2YXIgeGE9U2E9PntrYSh7bmFtZTp2YStkLk5BTUVTUEFDRV9ERUxJTStTYS5uYW1lLGlucHV0OltdLGRldmljZToiIixvcDoiaW5wdXRfYXJnIixhdHRyOlt7a2V5OiJUIix2YWx1ZTp7dHlwZTpTYS50eXBlfX1dfSkuZnVuY3Rpb25JbnB1dEluZGV4PXlhO3lhKyt9O0VhLnNpZ25hdHVyZS5pbnB1dF9hcmcubmFtZT94YShFYS5zaWduYXR1cmUuaW5wdXRfYXJnKTpfLmVhY2goRWEuc2lnbmF0dXJlLmlucHV0X2FyZyx4YSl9bGV0IEFhPTA7Y29uc3QgRmE9e307RWEuc2lnbmF0dXJlLm91dHB1dF9hcmcmJih4YT15YT0+e0ZhW3ZhKwpkLk5BTUVTUEFDRV9ERUxJTSt5YS5uYW1lXT1BYTtBYSsrfSxFYS5zaWduYXR1cmUub3V0cHV0X2FyZy5uYW1lP3hhKEVhLnNpZ25hdHVyZS5vdXRwdXRfYXJnKTpfLmVhY2goRWEuc2lnbmF0dXJlLm91dHB1dF9hcmcseGEpKTtfLmVhY2goRWEubm9kZV9kZWYseWE9Pnt5YS5uYW1lPXZhKyIvIit5YS5uYW1lOyJzdHJpbmciPT09dHlwZW9mIHlhLmlucHV0JiYoeWEuaW5wdXQ9W3lhLmlucHV0XSk7Y29uc3QgU2E9a2EoeWEpO18uaXNOdW1iZXIoRmFbeWEubmFtZV0pJiYoU2EuZnVuY3Rpb25PdXRwdXRJbmRleD1GYVt5YS5uYW1lXSk7Xy5lYWNoKFNhLmlucHV0cyxYYT0+e1hhLm5hbWU9dmErZC5OQU1FU1BBQ0VfREVMSU0rWGEubmFtZX0pfSl9O0gubGlicmFyeSYmSC5saWJyYXJ5LmZ1bmN0aW9uJiZfLmVhY2goSC5saWJyYXJ5LmZ1bmN0aW9uLFkpO2VhLnNwbGljZShjYSk7YmEuc3BsaWNlKGNhKTtyZXR1cm4gZWF9LE0pLnRoZW4oZWE9PmIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkJ1aWxkaW5nIHRoZSBkYXRhIHN0cnVjdHVyZSIsCjcwLCgpPT57bGV0IGNhPXEoYmEsbGEpLGthPW5ldyBDO18uZWFjaChlYSxZPT57bGV0IEVhPWNhW1kubmFtZV18fFkubmFtZTtrYS5ub2Rlc1tFYV09WTtZLm5hbWUgaW4gVCYmKFkub3V0RW1iZWRkaW5ncz1UW1kubmFtZV0sXy5lYWNoKFkub3V0RW1iZWRkaW5ncyx2YT0+e3ZhLm5hbWU9Y2FbdmEubmFtZV18fHZhLm5hbWV9KSk7WS5uYW1lPUVhfSk7Xy5lYWNoKGVhLFk9PntfLmVhY2goWS5pbnB1dHMsKEVhLHZhKT0+e2xldCB4YT1FYS5uYW1lO2lmKHhhIGluIEwpe0VhPUxbeGFdO1kuaW5FbWJlZGRpbmdzLnB1c2goRWEpO2Zvcih2YXIgQWEgb2YgRWEuaW5wdXRzKWwoa2EsY2FbQWEubmFtZV18fEFhLm5hbWUsWSxBYSxLLHZhKX1lbHNlIGlmKHhhIGluIFEpe0FhPVFbeGFdO2ZvcihsZXQgRmEgb2YgQWEuaW5wdXRzKWwoa2EsY2FbRmEubmFtZV18fEZhLm5hbWUsWSxFYSxLLHZhKX1lbHNlIGwoa2EsY2FbeGFdfHx4YSxZLEVhLEssdmEpfSl9KTtfLmVhY2goTCxZPT57WS5uYW1lPQpjYVtZLm5hbWVdfHxZLm5hbWV9KTtyZXR1cm4ga2F9LE0pKX07ZC5jcmVhdGVHcmFwaD1wO2QuZ2V0U3RyaWN0TmFtZT1uO2QuaGFzU2ltaWxhckRlZ3JlZVNlcXVlbmNlPWZ1bmN0aW9uKEgsSyl7SD11KEgpO0s9dShLKTtmb3IobGV0IE09MDtNPEgubGVuZ3RoO00rKylpZihIW01dIT09S1tNXSlyZXR1cm4hMTtyZXR1cm4hMH07ZC5nZXRIaWVyYXJjaGljYWxQYXRoPXg7ZC5nZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZz1mdW5jdGlvbihIKXtyZXR1cm4gSD09PWIuZ3JhcGguSW5jbHVzaW9uVHlwZS5FWENMVURFPyJBZGQgdG8gbWFpbiBncmFwaCI6IlJlbW92ZSBmcm9tIG1haW4gZ3JhcGgifTtkLmdldEdyb3VwU2VyaWVzTm9kZUJ1dHRvblN0cmluZz1mdW5jdGlvbihIKXtyZXR1cm4gSD09PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQPyJVbmdyb3VwIHRoaXMgc2VyaWVzIG9mIG5vZGVzIjoiR3JvdXAgdGhpcyBzZXJpZXMgb2Ygbm9kZXMifTtkLnRvZ2dsZU5vZGVTZXJpZXNHcm91cD0KZnVuY3Rpb24oSCxLKXtIW0tdPUsgaW4gSCYmSFtLXSE9PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQP2IuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQOmIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVB9fSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vaGllcmFyY2h5LmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgoeCxBLHksdyl7QT15P3guaW5FZGdlcyhBLm5hbWUpOngub3V0RWRnZXMoQS5uYW1lKTtfLmVhY2goQSxDPT57Qz14LmVkZ2UoQyk7KEMubnVtUmVndWxhckVkZ2VzP3cucmVndWxhcjp3LmNvbnRyb2wpLnB1c2goQyl9KX1mdW5jdGlvbiBrKHgsQSl7Y29uc3QgeT17fTtfLmVhY2goQS5ub2Rlcyx3PT57bGV0IEM9ZC5nZXRIaWVyYXJjaGljYWxQYXRoKHcubmFtZSksRj14LnJvb3Q7Ri5kZXB0aD1NYXRoLm1heChDLmxlbmd0aCxGLmRlcHRoKTt5W3cub3BdfHwoeVt3Lm9wXT1bXSk7eVt3Lm9wXS5wdXNoKHcpO2ZvcihsZXQgQj0wO0I8Qy5sZW5ndGg7QisrKXtGLmRlcHRoPU1hdGgubWF4KEYuZGVwdGgsQy5sZW5ndGgtQik7Ri5jYXJkaW5hbGl0eSs9dy5jYXJkaW5hbGl0eTtGLm9wSGlzdG9ncmFtW3cub3BdPShGLm9wSGlzdG9ncmFtW3cub3BdfHwwKSsxO251bGwhPXcuZGV2aWNlJiYoRi5kZXZpY2VIaXN0b2dyYW1bdy5kZXZpY2VdPQooRi5kZXZpY2VIaXN0b2dyYW1bdy5kZXZpY2VdfHwwKSsxKTtudWxsIT13LnhsYUNsdXN0ZXImJihGLnhsYUNsdXN0ZXJIaXN0b2dyYW1bdy54bGFDbHVzdGVyXT0oRi54bGFDbHVzdGVySGlzdG9ncmFtW3cueGxhQ2x1c3Rlcl18fDApKzEpO3cuY29tcGF0aWJsZT9GLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oRi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Ri5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oRi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMTtfLmVhY2gody5pbkVtYmVkZGluZ3MsTj0+e04uY29tcGF0aWJsZT9GLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oRi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Ri5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oRi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8CjApKzF9KTtfLmVhY2gody5vdXRFbWJlZGRpbmdzLE49PntOLmNvbXBhdGlibGU/Ri5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KTtpZihCPT09Qy5sZW5ndGgtMSlicmVhazt2YXIgRD1DW0JdO2xldCBJPXgubm9kZShEKTtJfHwoST1kLmNyZWF0ZU1ldGFub2RlKEQseC5ncmFwaE9wdGlvbnMpLEkucGFyZW50Tm9kZT1GLHguc2V0Tm9kZShELEkpLEYubWV0YWdyYXBoLnNldE5vZGUoRCxJKSwwPT09RC5pbmRleE9mKGIuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCkmJkYubmFtZT09PWIuZ3JhcGguUk9PVF9OQU1FJiYoRD1ELnN1YnN0cmluZyhiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgubGVuZ3RoKSx5W0RdfHwKKHlbRF09W10pLHgubGlicmFyeUZ1bmN0aW9uc1tEXT17bm9kZTpJLHVzYWdlczp5W0RdfSxJLmFzc29jaWF0ZWRGdW5jdGlvbj1EKSk7Rj1JfXguc2V0Tm9kZSh3Lm5hbWUsdyk7dy5wYXJlbnROb2RlPUY7Ri5tZXRhZ3JhcGguc2V0Tm9kZSh3Lm5hbWUsdyk7Xy5lYWNoKHcuaW5FbWJlZGRpbmdzLGZ1bmN0aW9uKEIpe3guc2V0Tm9kZShCLm5hbWUsQik7Qi5wYXJlbnROb2RlPXd9KTtfLmVhY2gody5vdXRFbWJlZGRpbmdzLGZ1bmN0aW9uKEIpe3guc2V0Tm9kZShCLm5hbWUsQik7Qi5wYXJlbnROb2RlPXd9KX0pfWZ1bmN0aW9uIHQoeCxBKXtsZXQgeT14LmdldE5vZGVNYXAoKSx3PVtdLEM9W10sRj0oRCxCKT0+e2xldCBJPTA7Zm9yKDtEOylCW0krK109RC5uYW1lLEQ9RC5wYXJlbnROb2RlO3JldHVybiBJLTF9O18uZWFjaChBLmVkZ2VzLEQ9Pnt2YXIgQj1GKEEubm9kZXNbRC52XSx3KSxJPUYoQS5ub2Rlc1tELnddLEMpO2lmKC0xIT09QiYmLTEhPT1JKXtmb3IoO3dbQl09PT1DW0ldOylpZihCLS0sCkktLSwwPkJ8fDA+SSl0aHJvdyBFcnJvcigiTm8gZGlmZmVyZW5jZSBmb3VuZCBiZXR3ZWVuIGFuY2VzdG9yIHBhdGhzLiIpO3ZhciBOPXlbd1tCKzFdXTtCPXdbQl07ST1DW0ldO3ZhciBPPU4ubWV0YWdyYXBoLmVkZ2UoQixJKTtPfHwoTz1kLmNyZWF0ZU1ldGFlZGdlKEIsSSksTi5tZXRhZ3JhcGguc2V0RWRnZShCLEksTykpO04uaGFzTm9uQ29udHJvbEVkZ2VzfHxELmlzQ29udHJvbERlcGVuZGVuY3l8fChOLmhhc05vbkNvbnRyb2xFZGdlcz0hMCk7Ty5hZGRCYXNlRWRnZShELHgpfX0pfWZ1bmN0aW9uIGwoeCxBLHksdyxDLEYpe2xldCBEPXgubWV0YWdyYXBoO18uZWFjaChELm5vZGVzKCksQj0+e0I9RC5ub2RlKEIpO0IudHlwZT09PWIuZ3JhcGguTm9kZVR5cGUuTUVUQSYmbChCLEEseSx3LEMsRil9KTt4PXAoRCk7eD0oRj9uOm0pKHgsRCxBLmdyYXBoT3B0aW9ucyk7Xy5lYWNoKHgsZnVuY3Rpb24oQixJKXtsZXQgTj1CLm1ldGFncmFwaC5ub2RlcygpO18uZWFjaChOLE89Pgp7Tz1ELm5vZGUoTyk7Ty5vd25pbmdTZXJpZXN8fChPLm93bmluZ1Nlcmllcz1JKX0pO04ubGVuZ3RoPHcmJiEoQi5uYW1lIGluIEMpJiYoQ1tCLm5hbWVdPWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVApO0IubmFtZSBpbiBDJiZDW0IubmFtZV09PT1iLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQfHwoQS5zZXROb2RlKEksQiksRC5zZXROb2RlKEksQiksXy5lYWNoKE4sTz0+e2xldCBIPUQubm9kZShPKTtCLm1ldGFncmFwaC5zZXROb2RlKE8sSCk7Qi5wYXJlbnROb2RlPUgucGFyZW50Tm9kZTtCLmNhcmRpbmFsaXR5Kys7bnVsbCE9SC5kZXZpY2UmJihCLmRldmljZUhpc3RvZ3JhbVtILmRldmljZV09KEIuZGV2aWNlSGlzdG9ncmFtW0guZGV2aWNlXXx8MCkrMSk7bnVsbCE9SC54bGFDbHVzdGVyJiYoQi54bGFDbHVzdGVySGlzdG9ncmFtW0gueGxhQ2x1c3Rlcl09KEIueGxhQ2x1c3Rlckhpc3RvZ3JhbVtILnhsYUNsdXN0ZXJdfHwwKSsxKTtILmNvbXBhdGlibGU/CkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxO18uZWFjaChILmluRW1iZWRkaW5ncyxLPT57Sy5jb21wYXRpYmxlP0IuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSk7Xy5lYWNoKEgub3V0RW1iZWRkaW5ncyxLPT57Sy5jb21wYXRpYmxlP0IuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPQooQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pO0gucGFyZW50Tm9kZT1CO3lbT109STtELnJlbW92ZU5vZGUoTyl9KSl9KX1mdW5jdGlvbiBwKHgpe3JldHVybiBfLnJlZHVjZSh4Lm5vZGVzKCksKEEseSk9Pnt5PXgubm9kZSh5KTtpZih5LnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEpcmV0dXJuIEE7bGV0IHc9eS5vcDt3JiYoQVt3XT1BW3ddfHxbXSxBW3ddLnB1c2goeS5uYW1lKSk7cmV0dXJuIEF9LHt9KX1mdW5jdGlvbiBtKHgsQSx5KXtsZXQgdz17fTtfLmVhY2goeCxmdW5jdGlvbihDLEYpe2lmKCEoMT49Qy5sZW5ndGgpKXt2YXIgRD17fTtfLmVhY2goQyxmdW5jdGlvbihCKXt2YXIgST0iKiI9PT1CLmNoYXJBdChCLmxlbmd0aC0xKSxOPUIuc3BsaXQoIi8iKSxPPU5bTi5sZW5ndGgtMV07Tj1OLnNsaWNlKDAsTi5sZW5ndGgtMSkuam9pbigiLyIpO3ZhciBIPU8ubWF0Y2goL14oXEQqKV8oXGQrKSQvKTtsZXQgSz0iIjtIPyhPPUhbMV0sSD1IWzJdKToKKE89ST9PLnN1YnN0cigwLE8ubGVuZ3RoLTEpOk8sSD0wLEs9ST8iKiI6IiIpO0k9ZC5nZXRTZXJpZXNOb2RlTmFtZShPLEssTik7RFtJXT1EW0ldfHxbXTtCPWQuY3JlYXRlU2VyaWVzTm9kZShPLEssTiwrSCxCLHkpO0RbSV0ucHVzaChCKX0pO18uZWFjaChELGZ1bmN0aW9uKEIpe2lmKCEoMj5CLmxlbmd0aCkpe0Iuc29ydChmdW5jdGlvbihOLE8pe3JldHVybitOLmNsdXN0ZXJJZC0rTy5jbHVzdGVySWR9KTt2YXIgST1bQlswXV07Zm9yKGxldCBOPTE7TjxCLmxlbmd0aDtOKyspe2xldCBPPUJbTl07Ty5jbHVzdGVySWQ9PT1JW0kubGVuZ3RoLTFdLmNsdXN0ZXJJZCsxP0kucHVzaChPKToocShJLHcsK0YsQSx5KSxJPVtPXSl9cShJLHcsK0YsQSx5KX19KX19KTtyZXR1cm4gd31mdW5jdGlvbiBuKHgsQSx5KXtsZXQgdz17fTtfLmVhY2goeCxmdW5jdGlvbihDLEYpe2lmKCEoMT49Qy5sZW5ndGgpKXt2YXIgRD17fSxCPXt9O18uZWFjaChDLGZ1bmN0aW9uKE4pe2xldCBPPSIqIj09PQpOLmNoYXJBdChOLmxlbmd0aC0xKTt2YXIgSD1OLnNwbGl0KCIvIik7bGV0IEs9SFtILmxlbmd0aC0xXTtIPUguc2xpY2UoMCxILmxlbmd0aC0xKS5qb2luKCIvIik7Y29uc3QgTT0vKFxkKykvZzt2YXIgTDtsZXQgUSxULFgsYWE9MDtmb3IoO0w9TS5leGVjKEspOykrK2FhLFE9Sy5zbGljZSgwLEwuaW5kZXgpLFQ9TFswXSxMPUsuc2xpY2UoTC5pbmRleCtMWzBdLmxlbmd0aCksWD1kLmdldFNlcmllc05vZGVOYW1lKFEsTCxIKSxEW1hdPURbWF0sRFtYXXx8KERbWF09ZC5jcmVhdGVTZXJpZXNOb2RlKFEsTCxILCtULE4seSkpLERbWF0uaWRzLnB1c2goVCksQltOXT1CW05dfHxbXSxCW05dLnB1c2goW1gsVF0pOzE+YWEmJihRPU8/Sy5zdWJzdHIoMCxLLmxlbmd0aC0xKTpLLFQ9MCxMPU8/IioiOiIiLFg9ZC5nZXRTZXJpZXNOb2RlTmFtZShRLEwsSCksRFtYXT1EW1hdLERbWF18fChEW1hdPWQuY3JlYXRlU2VyaWVzTm9kZShRLEwsSCwrVCxOLHkpKSxEW1hdLmlkcy5wdXNoKFQpLEJbTl09CkJbTl18fFtdLEJbTl0ucHVzaChbWCxUXSkpfSk7dmFyIEk9e307Xy5lYWNoKEIsZnVuY3Rpb24oTixPKXtOLnNvcnQoZnVuY3Rpb24oTSxMKXtyZXR1cm4gRFtMWzBdXS5pZHMubGVuZ3RoLURbTVswXV0uaWRzLmxlbmd0aH0pO3ZhciBIPU5bMF1bMF07Tj1OWzBdWzFdO0lbSF09SVtIXXx8W107Y29uc3QgSz1PLnNwbGl0KCIvIik7Tz1kLmNyZWF0ZVNlcmllc05vZGUoRFtIXS5wcmVmaXgsRFtIXS5zdWZmaXgsSy5zbGljZSgwLEsubGVuZ3RoLTEpLmpvaW4oIi8iKSwrTixPLHkpO0lbSF0ucHVzaChPKX0pO18uZWFjaChJLGZ1bmN0aW9uKE4pe2lmKCEoMj5OLmxlbmd0aCkpe04uc29ydChmdW5jdGlvbihILEspe3JldHVybitILmNsdXN0ZXJJZC0rSy5jbHVzdGVySWR9KTt2YXIgTz1bTlswXV07Zm9yKGxldCBIPTE7SDxOLmxlbmd0aDtIKyspe2xldCBLPU5bSF07Sy5jbHVzdGVySWQ9PT1PW08ubGVuZ3RoLTFdLmNsdXN0ZXJJZCsxP08ucHVzaChLKToocShPLHcsK0YsQSx5KSxPPQpbS10pfXEoTyx3LCtGLEEseSl9fSl9fSk7cmV0dXJuIHd9ZnVuY3Rpb24gcSh4LEEseSx3LEMpe2lmKDE8eC5sZW5ndGgpe2xldCBGPWQuZ2V0U2VyaWVzTm9kZU5hbWUoeFswXS5wcmVmaXgseFswXS5zdWZmaXgseFswXS5wYXJlbnQseFswXS5jbHVzdGVySWQseFt4Lmxlbmd0aC0xXS5jbHVzdGVySWQpLEQ9ZC5jcmVhdGVTZXJpZXNOb2RlKHhbMF0ucHJlZml4LHhbMF0uc3VmZml4LHhbMF0ucGFyZW50LHksRixDKTtfLmVhY2goeCxmdW5jdGlvbihCKXtELmlkcy5wdXNoKEIuY2x1c3RlcklkKTtELm1ldGFncmFwaC5zZXROb2RlKEIubmFtZSx3Lm5vZGUoQi5uYW1lKSl9KTtBW0ZdPUR9fWNsYXNzIHV7Y29uc3RydWN0b3IoeCl7dGhpcy5oYXNTaGFwZUluZm89ITE7dGhpcy5tYXhNZXRhRWRnZVNpemU9MTt0aGlzLmdyYXBoT3B0aW9ucz14fHx7fTt0aGlzLmdyYXBoT3B0aW9ucy5jb21wb3VuZD0hMDt0aGlzLnJvb3Q9ZC5jcmVhdGVNZXRhbm9kZShkLlJPT1RfTkFNRSx0aGlzLmdyYXBoT3B0aW9ucyk7CnRoaXMubGlicmFyeUZ1bmN0aW9ucz17fTt0aGlzLnhsYUNsdXN0ZXJzPXRoaXMuZGV2aWNlcz10aGlzLnRlbXBsYXRlcz1udWxsO3RoaXMuaW5kZXg9e307dGhpcy5pbmRleFtkLlJPT1RfTkFNRV09dGhpcy5yb290O3RoaXMub3JkZXJpbmdzPXt9fWdldE5vZGVNYXAoKXtyZXR1cm4gdGhpcy5pbmRleH1ub2RlKHgpe3JldHVybiB0aGlzLmluZGV4W3hdfXNldE5vZGUoeCxBKXt0aGlzLmluZGV4W3hdPUF9Z2V0QnJpZGdlZ3JhcGgoeCl7dmFyIEE9dGhpcy5pbmRleFt4XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSBpbiBoaWVyYXJjaHk6ICIreCk7aWYoISgibWV0YWdyYXBoImluIEEpKXJldHVybiBudWxsO2lmKEEuYnJpZGdlZ3JhcGgpcmV0dXJuIEEuYnJpZGdlZ3JhcGg7bGV0IHk9QS5icmlkZ2VncmFwaD1kLmNyZWF0ZUdyYXBoKCJCUklER0VHUkFQSCIsZC5HcmFwaFR5cGUuQlJJREdFLHRoaXMuZ3JhcGhPcHRpb25zKTtpZighKEEucGFyZW50Tm9kZSYmCiJtZXRhZ3JhcGgiaW4gQS5wYXJlbnROb2RlKSlyZXR1cm4geTt2YXIgdz1BLnBhcmVudE5vZGU7QT13Lm1ldGFncmFwaDt3PXRoaXMuZ2V0QnJpZGdlZ3JhcGgody5uYW1lKTtfLmVhY2goW0Esd10sQz0+e0MuZWRnZXMoKS5maWx0ZXIoRj0+Ri52PT09eHx8Ri53PT09eCkuZm9yRWFjaChGPT57bGV0IEQ9Ri53PT09eCxCPUMuZWRnZShGKTtfLmVhY2goQi5iYXNlRWRnZUxpc3QsST0+e2xldCBbTixPXT1EP1tJLncsRi52XTpbSS52LEYud107dmFyIEg9dGhpcy5nZXRDaGlsZE5hbWUoeCxOKTtIPXt2OkQ/TzpILHc6RD9IOk99O2xldCBLPXkuZWRnZShIKTtLfHwoSz1kLmNyZWF0ZU1ldGFlZGdlKEgudixILncpLEsuaW5ib3VuZD1ELHkuc2V0RWRnZShILnYsSC53LEspKTtLLmFkZEJhc2VFZGdlKEksdGhpcyl9KX0pfSk7cmV0dXJuIHl9Z2V0Q2hpbGROYW1lKHgsQSl7bGV0IHk9dGhpcy5pbmRleFtBXTtmb3IoO3k7KXtpZih5LnBhcmVudE5vZGUmJnkucGFyZW50Tm9kZS5uYW1lPT09CngpcmV0dXJuIHkubmFtZTt5PXkucGFyZW50Tm9kZX10aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgaW1tZWRpYXRlIGNoaWxkIGZvciBkZXNjZW5kYW50OiAiK0EpO31nZXRQcmVkZWNlc3NvcnMoeCl7bGV0IEE9dGhpcy5pbmRleFt4XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIreCk7bGV0IHk9dGhpcy5nZXRPbmVXYXlFZGdlcyhBLCEwKTtBLmlzR3JvdXBOb2RlfHxfLmVhY2goQS5pbkVtYmVkZGluZ3Msdz0+e18uZWFjaChBLmlucHV0cyxDPT57aWYoQy5uYW1lPT09dy5uYW1lKXtsZXQgRj1uZXcgZC5NZXRhZWRnZUltcGwody5uYW1lLHgpO0YuYWRkQmFzZUVkZ2Uoe2lzQ29udHJvbERlcGVuZGVuY3k6Qy5pc0NvbnRyb2xEZXBlbmRlbmN5LG91dHB1dFRlbnNvcktleTpDLm91dHB1dFRlbnNvcktleSxpc1JlZmVyZW5jZUVkZ2U6ITEsdjp3Lm5hbWUsdzp4fSx0aGlzKTt5LnJlZ3VsYXIucHVzaChGKX19KX0pO3JldHVybiB5fWdldFN1Y2Nlc3NvcnMoeCl7bGV0IEE9CnRoaXMuaW5kZXhbeF07aWYoIUEpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG5vZGUgd2l0aCBuYW1lOiAiK3gpO2xldCB5PXRoaXMuZ2V0T25lV2F5RWRnZXMoQSwhMSk7QS5pc0dyb3VwTm9kZXx8Xy5lYWNoKEEub3V0RW1iZWRkaW5ncyx3PT57Xy5lYWNoKHcuaW5wdXRzLEM9PntpZihDLm5hbWU9PT14KXtsZXQgRj1uZXcgZC5NZXRhZWRnZUltcGwoeCx3Lm5hbWUpO0YuYWRkQmFzZUVkZ2Uoe2lzQ29udHJvbERlcGVuZGVuY3k6Qy5pc0NvbnRyb2xEZXBlbmRlbmN5LG91dHB1dFRlbnNvcktleTpDLm91dHB1dFRlbnNvcktleSxpc1JlZmVyZW5jZUVkZ2U6ITEsdjp4LHc6dy5uYW1lfSx0aGlzKTt5LnJlZ3VsYXIucHVzaChGKX19KX0pO3JldHVybiB5fWdldE9uZVdheUVkZ2VzKHgsQSl7bGV0IHk9e2NvbnRyb2w6W10scmVndWxhcjpbXX07aWYoIXgucGFyZW50Tm9kZXx8IXgucGFyZW50Tm9kZS5pc0dyb3VwTm9kZSlyZXR1cm4geTt2YXIgdz14LnBhcmVudE5vZGU7bGV0IEM9CncubWV0YWdyYXBoO3c9dGhpcy5nZXRCcmlkZ2VncmFwaCh3Lm5hbWUpO2goQyx4LEEseSk7aCh3LHgsQSx5KTtyZXR1cm4geX1nZXRUb3BvbG9naWNhbE9yZGVyaW5nKHgpe3ZhciBBPXRoaXMuaW5kZXhbeF07aWYoIUEpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG5vZGUgd2l0aCBuYW1lOiAiK3gpO2lmKCFBLmlzR3JvdXBOb2RlKXJldHVybiBudWxsO2lmKHggaW4gdGhpcy5vcmRlcmluZ3MpcmV0dXJuIHRoaXMub3JkZXJpbmdzW3hdO2xldCB5PXt9LHc9e30sQz1BLm1ldGFncmFwaDtfLmVhY2goQy5lZGdlcygpLEQ9PntDLmVkZ2UoRCkubnVtUmVndWxhckVkZ2VzJiYoRC52IGluIHl8fCh5W0Qudl09W10pLHlbRC52XS5wdXNoKEQudyksd1tELnddPSEwKX0pO2xldCBGPV8uZGlmZmVyZW5jZShfLmtleXMoeSksXy5rZXlzKHcpKTt4PXRoaXMub3JkZXJpbmdzW3hdPXt9O2ZvcihBPTA7Ri5sZW5ndGg7KXtsZXQgRD1GLnNoaWZ0KCk7eFtEXT1BKys7Xy5lYWNoKHlbRF0sQj0+CkYucHVzaChCKSk7ZGVsZXRlIHlbRF19cmV0dXJuIHh9Z2V0VGVtcGxhdGVJbmRleCgpe2xldCB4PWQzLmtleXModGhpcy50ZW1wbGF0ZXMpLEE9ZDMuc2NhbGVPcmRpbmFsKCkuZG9tYWluKHgpLnJhbmdlKGQzLnJhbmdlKDAseC5sZW5ndGgpKTtyZXR1cm4geT0+QSh5KX19Zi5EZWZhdWx0SGllcmFyY2h5UGFyYW1zPXt2ZXJpZnlUZW1wbGF0ZTohMCxzZXJpZXNOb2RlTWluU2l6ZTo1LHNlcmllc01hcDp7fSxyYW5rRGlyZWN0aW9uOiJCVCIsdXNlR2VuZXJhbGl6ZWRTZXJpZXNQYXR0ZXJuczohMX07Zi5idWlsZD1mdW5jdGlvbih4LEEseSl7bGV0IHc9bmV3IHUoe3JhbmtkaXI6QS5yYW5rRGlyZWN0aW9ufSksQz17fTtyZXR1cm4gYi5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiQWRkaW5nIG5vZGVzIiwyMCwoKT0+e2xldCBGPXt9LEQ9e307Xy5lYWNoKHgubm9kZXMsQj0+e0IuZGV2aWNlJiYoRltCLmRldmljZV09ITApO0IueGxhQ2x1c3RlciYmKERbQi54bGFDbHVzdGVyXT0hMCl9KTsKdy5kZXZpY2VzPV8ua2V5cyhGKTt3LnhsYUNsdXN0ZXJzPV8ua2V5cyhEKTtrKHcseCl9LHkpLnRoZW4oKCk9PmIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkRldGVjdCBzZXJpZXMiLDIwLCgpPT57MDxBLnNlcmllc05vZGVNaW5TaXplJiZsKHcucm9vdCx3LEMsQS5zZXJpZXNOb2RlTWluU2l6ZSxBLnNlcmllc01hcCxBLnVzZUdlbmVyYWxpemVkU2VyaWVzUGF0dGVybnMpfSx5KSkudGhlbigoKT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiQWRkaW5nIGVkZ2VzIiwzMCwoKT0+e3Qodyx4LEMpfSx5KSkudGhlbigoKT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiRmluZGluZyBzaW1pbGFyIHN1YmdyYXBocyIsMzAsKCk9Pnt3LnRlbXBsYXRlcz1kLnRlbXBsYXRlLmRldGVjdCh3LEEudmVyaWZ5VGVtcGxhdGUpfSx5KSkudGhlbigoKT0+dyl9O2Yuam9pbkFuZEFnZ3JlZ2F0ZVN0YXRzPWZ1bmN0aW9uKHgpe2xldCBBPXt9LHk9e307Xy5lYWNoKHgucm9vdC5sZWF2ZXMoKSwKdz0+e3c9eC5ub2RlKHcpO251bGwhPXcuZGV2aWNlJiYoQVt3LmRldmljZV09ITApO251bGwhPXcueGxhQ2x1c3RlciYmKHlbdy54bGFDbHVzdGVyXT0hMCl9KTt4LmRldmljZXM9Xy5rZXlzKEEpO3gueGxhQ2x1c3RlcnM9Xy5rZXlzKHkpO18uZWFjaCh4LmdldE5vZGVNYXAoKSx3PT57dy5pc0dyb3VwTm9kZSYmKHcuc3RhdHM9bmV3IGQuTm9kZVN0YXRzKG51bGwpLHcuZGV2aWNlSGlzdG9ncmFtPXt9KX0pO18uZWFjaCh4LnJvb3QubGVhdmVzKCksdz0+e2xldCBDPXc9eC5ub2RlKHcpO2Zvcig7bnVsbCE9Qy5wYXJlbnROb2RlOyl7aWYobnVsbCE9dy5kZXZpY2Upe3ZhciBGPUMucGFyZW50Tm9kZS5kZXZpY2VIaXN0b2dyYW07Rlt3LmRldmljZV09KEZbdy5kZXZpY2VdfHwwKSsxfW51bGwhPXcueGxhQ2x1c3RlciYmKEY9Qy5wYXJlbnROb2RlLnhsYUNsdXN0ZXJIaXN0b2dyYW0sRlt3LnhsYUNsdXN0ZXJdPShGW3cueGxhQ2x1c3Rlcl18fDApKzEpO251bGwhPXcuc3RhdHMmJkMucGFyZW50Tm9kZS5zdGF0cy5jb21iaW5lKHcuc3RhdHMpOwpDPUMucGFyZW50Tm9kZX19KX07Zi5nZXRJbmNvbXBhdGlibGVPcHM9ZnVuY3Rpb24oeCxBKXtsZXQgeT1bXSx3PXt9O18uZWFjaCh4LnJvb3QubGVhdmVzKCksQz0+e0M9eC5ub2RlKEMpO2lmKEMudHlwZT09ZC5Ob2RlVHlwZS5PUCl7aWYoIUMuY29tcGF0aWJsZSlpZihDLm93bmluZ1NlcmllcylpZihBJiZBLnNlcmllc01hcFtDLm93bmluZ1Nlcmllc109PT1iLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQKXkucHVzaChDKTtlbHNle2lmKCF3W0Mub3duaW5nU2VyaWVzXSl7bGV0IEY9eC5ub2RlKEMub3duaW5nU2VyaWVzKTtGJiYod1tDLm93bmluZ1Nlcmllc109Rix5LnB1c2goRikpfX1lbHNlIHkucHVzaChDKTtfLmVhY2goQy5pbkVtYmVkZGluZ3MsRj0+e0YuY29tcGF0aWJsZXx8eS5wdXNoKEYpfSk7Xy5lYWNoKEMub3V0RW1iZWRkaW5ncyxGPT57Ri5jb21wYXRpYmxlfHx5LnB1c2goRil9KX19KTtyZXR1cm4geX19KShkLmhpZXJhcmNoeXx8KGQuaGllcmFyY2h5PQp7fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbGF5b3V0LmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgodyl7dy5ub2RlLmlzR3JvdXBOb2RlJiZ0KHcpO3cubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBP3Aodyk6dy5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUyYmbSh3KX1mdW5jdGlvbiBrKHcpe3cuaW5ib3hXaWR0aD0wPHcuaW5Bbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD9mLlBBUkFNUy5hbm5vdGF0aW9ucy5pbmJveFdpZHRoOjA7dy5vdXRib3hXaWR0aD0wPHcub3V0QW5ub3RhdGlvbnMubGlzdC5sZW5ndGg/Zi5QQVJBTVMuYW5ub3RhdGlvbnMub3V0Ym94V2lkdGg6MDt3LmNvcmVCb3gud2lkdGg9dy53aWR0aDt3LmNvcmVCb3guaGVpZ2h0PXcuaGVpZ2h0O3cud2lkdGg9TWF0aC5tYXgody5jb3JlQm94LndpZHRoK3cuaW5ib3hXaWR0aCt3Lm91dGJveFdpZHRoLDMqdy5kaXNwbGF5TmFtZS5sZW5ndGgpfWZ1bmN0aW9uIHQodyl7bGV0IEM9dy5jb3JlR3JhcGgubm9kZXMoKS5tYXAoRj0+CncuY29yZUdyYXBoLm5vZGUoRikpLmNvbmNhdCh3Lmlzb2xhdGVkSW5FeHRyYWN0LHcuaXNvbGF0ZWRPdXRFeHRyYWN0LHcubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QpO18uZWFjaChDLEY9Pntzd2l0Y2goRi5ub2RlLnR5cGUpe2Nhc2UgZC5Ob2RlVHlwZS5PUDpfLmV4dGVuZChGLGYuUEFSQU1TLm5vZGVTaXplLm9wKTticmVhaztjYXNlIGQuTm9kZVR5cGUuQlJJREdFOl8uZXh0ZW5kKEYsZi5QQVJBTVMubm9kZVNpemUuYnJpZGdlKTticmVhaztjYXNlIGQuTm9kZVR5cGUuTUVUQTpGLmV4cGFuZGVkP2goRik6KF8uZXh0ZW5kKEYsZi5QQVJBTVMubm9kZVNpemUubWV0YSksRi5oZWlnaHQ9Zi5QQVJBTVMubm9kZVNpemUubWV0YS5oZWlnaHQoRi5ub2RlLmNhcmRpbmFsaXR5KSk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLlNFUklFUzpGLmV4cGFuZGVkPyhfLmV4dGVuZChGLGYuUEFSQU1TLm5vZGVTaXplLnNlcmllcy5leHBhbmRlZCksaChGKSk6Xy5leHRlbmQoRixGLm5vZGUuaGFzTm9uQ29udHJvbEVkZ2VzPwpmLlBBUkFNUy5ub2RlU2l6ZS5zZXJpZXMudmVydGljYWw6Zi5QQVJBTVMubm9kZVNpemUuc2VyaWVzLmhvcml6b250YWwpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrRi5ub2RlLnR5cGUpO31GLmV4cGFuZGVkfHxrKEYpO24oRil9KX1mdW5jdGlvbiBsKHcsQyl7Xy5leHRlbmQody5ncmFwaCgpLHtub2Rlc2VwOkMubm9kZVNlcCxyYW5rc2VwOkMucmFua1NlcCxlZGdlc2VwOkMuZWRnZVNlcH0pO2xldCBGPVtdLEQ9W107Xy5lYWNoKHcubm9kZXMoKSxIPT57dy5ub2RlKEgpLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuQlJJREdFP0YucHVzaChIKTpELnB1c2goSCl9KTtpZighRC5sZW5ndGgpcmV0dXJue3dpZHRoOjAsaGVpZ2h0OjB9O2RhZ3JlLmxheW91dCh3KTtsZXQgQj1JbmZpbml0eSxJPUluZmluaXR5LE49LUluZmluaXR5LE89LUluZmluaXR5O18uZWFjaChELEg9PntIPXcubm9kZShIKTt2YXIgSz0uNSpILndpZHRoLE09SC54LQpLO0s9SC54K0s7Qj1NPEI/TTpCO049Sz5OP0s6TjtLPS41KkguaGVpZ2h0O009SC55LUs7SD1ILnkrSztJPU08ST9NOkk7Tz1IPk8/SDpPfSk7Xy5lYWNoKHcuZWRnZXMoKSxIPT57SD13LmVkZ2UoSCk7aWYoIUguc3RydWN0dXJhbCl7dmFyIEs9dy5ub2RlKEgubWV0YWVkZ2UudiksTT13Lm5vZGUoSC5tZXRhZWRnZS53KTtpZigzPT09SC5wb2ludHMubGVuZ3RoJiZBKEgucG9pbnRzKSl7aWYobnVsbCE9Syl7dmFyIEw9Sy5leHBhbmRlZD9LLng6dShLKTtILnBvaW50c1swXS54PUx9bnVsbCE9TSYmKEw9TS5leHBhbmRlZD9NLng6dShNKSxILnBvaW50c1syXS54PUwpO0gucG9pbnRzPVtILnBvaW50c1swXSxILnBvaW50c1sxXV19TD1ILnBvaW50c1tILnBvaW50cy5sZW5ndGgtMl07bnVsbCE9TSYmKEgucG9pbnRzW0gucG9pbnRzLmxlbmd0aC0xXT15KEwsTSkpO009SC5wb2ludHNbMV07bnVsbCE9SyYmKEgucG9pbnRzWzBdPXkoTSxLKSk7Xy5lYWNoKEgucG9pbnRzLFE9PntCPVEueDwKQj9RLng6QjtOPVEueD5OP1EueDpOO0k9US55PEk/US55Okk7Tz1RLnk+Tz9RLnk6T30pfX0pO18uZWFjaCh3Lm5vZGVzKCksSD0+e0g9dy5ub2RlKEgpO0gueC09QjtILnktPUl9KTtfLmVhY2gody5lZGdlcygpLEg9PntfLmVhY2gody5lZGdlKEgpLnBvaW50cyxLPT57Sy54LT1CO0sueS09SX0pfSk7cmV0dXJue3dpZHRoOk4tQixoZWlnaHQ6Ty1JfX1mdW5jdGlvbiBwKHcpe2xldCBDPWYuUEFSQU1TLnN1YnNjZW5lLm1ldGE7Xy5leHRlbmQodyxDKTtfLmV4dGVuZCh3LmNvcmVCb3gsbCh3LmNvcmVHcmFwaCxmLlBBUkFNUy5ncmFwaC5tZXRhKSk7dmFyIEY9dy5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGg/Xy5tYXgody5pc29sYXRlZEluRXh0cmFjdCxCPT5CLndpZHRoKS53aWR0aDpudWxsO3cuaW5FeHRyYWN0Qm94LndpZHRoPW51bGwhPUY/RjowO3cuaW5FeHRyYWN0Qm94LmhlaWdodD1fLnJlZHVjZSh3Lmlzb2xhdGVkSW5FeHRyYWN0LChCLEksTik9PntOPTA8Tj9DLmV4dHJhY3RZT2Zmc2V0OgowO0kueD0wO0kueT1CK04rSS5oZWlnaHQvMjtyZXR1cm4gQitOK0kuaGVpZ2h0fSwwKTtGPXcuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aD9fLm1heCh3Lmlzb2xhdGVkT3V0RXh0cmFjdCxCPT5CLndpZHRoKS53aWR0aDpudWxsO3cub3V0RXh0cmFjdEJveC53aWR0aD1udWxsIT1GP0Y6MDt3Lm91dEV4dHJhY3RCb3guaGVpZ2h0PV8ucmVkdWNlKHcuaXNvbGF0ZWRPdXRFeHRyYWN0LChCLEksTik9PntOPTA8Tj9DLmV4dHJhY3RZT2Zmc2V0OjA7SS54PTA7SS55PUIrTitJLmhlaWdodC8yO3JldHVybiBCK04rSS5oZWlnaHR9LDApO0Y9dy5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGg/Xy5tYXgody5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCxCPT5CLndpZHRoKS53aWR0aDpudWxsO3cubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aD1udWxsIT1GP0Y6MDt3LmxpYnJhcnlGdW5jdGlvbnNCb3guaGVpZ2h0PV8ucmVkdWNlKHcubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QsKEIsSSwKTik9PntOPTA8Tj9DLmV4dHJhY3RZT2Zmc2V0OjA7SS54PTA7SS55PUIrTitJLmhlaWdodC8yO3JldHVybiBCK04rSS5oZWlnaHR9LDApO0Y9MDswPHcuaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoJiZGKys7MDx3Lmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGgmJkYrKzswPHcubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoJiZGKys7MDx3LmNvcmVHcmFwaC5ub2RlQ291bnQoKSYmRisrO2xldCBEPWYuUEFSQU1TLnN1YnNjZW5lLm1ldGEuZXh0cmFjdFhPZmZzZXQ7Rj0xPj1GPzA6RipEO3cuY29yZUJveC53aWR0aCs9TWF0aC5tYXgoZi5NSU5fQVVYX1dJRFRILHcuaW5FeHRyYWN0Qm94LndpZHRoK3cub3V0RXh0cmFjdEJveC53aWR0aCkrRit3LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgrRjt3LmNvcmVCb3guaGVpZ2h0PUMubGFiZWxIZWlnaHQrTWF0aC5tYXgody5pbkV4dHJhY3RCb3guaGVpZ2h0LHcuY29yZUJveC5oZWlnaHQsdy5saWJyYXJ5RnVuY3Rpb25zQm94LmhlaWdodCwKdy5vdXRFeHRyYWN0Qm94LmhlaWdodCk7dy53aWR0aD13LmNvcmVCb3gud2lkdGgrQy5wYWRkaW5nTGVmdCtDLnBhZGRpbmdSaWdodDt3LmhlaWdodD13LnBhZGRpbmdUb3Ardy5jb3JlQm94LmhlaWdodCt3LnBhZGRpbmdCb3R0b219ZnVuY3Rpb24gbSh3KXtsZXQgQz13LmNvcmVHcmFwaCxGPWYuUEFSQU1TLnN1YnNjZW5lLnNlcmllcztfLmV4dGVuZCh3LEYpO18uZXh0ZW5kKHcuY29yZUJveCxsKHcuY29yZUdyYXBoLGYuUEFSQU1TLmdyYXBoLnNlcmllcykpO18uZWFjaChDLm5vZGVzKCksRD0+e0Mubm9kZShEKS5leGNsdWRlZD0hMX0pO3cud2lkdGg9dy5jb3JlQm94LndpZHRoK0YucGFkZGluZ0xlZnQrRi5wYWRkaW5nUmlnaHQ7dy5oZWlnaHQ9dy5jb3JlQm94LmhlaWdodCtGLnBhZGRpbmdUb3ArRi5wYWRkaW5nQm90dG9tfWZ1bmN0aW9uIG4odyl7aWYoIXcuZXhwYW5kZWQpe3ZhciBDPXcuaW5Bbm5vdGF0aW9ucy5saXN0LEY9dy5vdXRBbm5vdGF0aW9ucy5saXN0O18uZWFjaChDLApLPT5xKEspKTtfLmVhY2goRixLPT5xKEspKTt2YXIgRD1mLlBBUkFNUy5hbm5vdGF0aW9ucyxCPV8ucmVkdWNlKEMsKEssTSxMKT0+e0w9MDxMP0QueU9mZnNldDowO00uZHg9LSh3LmNvcmVCb3gud2lkdGgrTS53aWR0aCkvMi1ELnhPZmZzZXQ7TS5keT1LK0wrTS5oZWlnaHQvMjtyZXR1cm4gSytMK00uaGVpZ2h0fSwwKTtfLmVhY2goQyxLPT57Sy5keS09Qi8yO0subGFiZWxPZmZzZXQ9RC5sYWJlbE9mZnNldH0pO3ZhciBJPV8ucmVkdWNlKEYsKEssTSxMKT0+e0w9MDxMP0QueU9mZnNldDowO00uZHg9KHcuY29yZUJveC53aWR0aCtNLndpZHRoKS8yK0QueE9mZnNldDtNLmR5PUsrTCtNLmhlaWdodC8yO3JldHVybiBLK0wrTS5oZWlnaHR9LDApO18uZWFjaChGLEs9PntLLmR5LT1JLzI7Sy5sYWJlbE9mZnNldD1ELmxhYmVsT2Zmc2V0fSk7dmFyIE49TWF0aC5taW4ody5oZWlnaHQvMi13LnJhZGl1cyxCLzIpO049MD5OPzA6Tjt2YXIgTz1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCwKQy5sZW5ndGgtMV0pLnJhbmdlKFstTixOXSk7Xy5lYWNoKEMsKEssTSk9PntLLnBvaW50cz1be2R4OksuZHgrSy53aWR0aC8yLGR5OksuZHl9LHtkeDotdy5jb3JlQm94LndpZHRoLzIsZHk6MTxDLmxlbmd0aD9PKE0pOjB9XX0pO049TWF0aC5taW4ody5oZWlnaHQvMi13LnJhZGl1cyxJLzIpO049MD5OPzA6Tjt2YXIgSD1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCxGLmxlbmd0aC0xXSkucmFuZ2UoWy1OLE5dKTtfLmVhY2goRiwoSyxNKT0+e0sucG9pbnRzPVt7ZHg6dy5jb3JlQm94LndpZHRoLzIsZHk6MTxGLmxlbmd0aD9IKE0pOjB9LHtkeDpLLmR4LUsud2lkdGgvMixkeTpLLmR5fV19KTt3LmhlaWdodD1NYXRoLm1heCh3LmhlaWdodCxCLEkpfX1mdW5jdGlvbiBxKHcpe3N3aXRjaCh3LmFubm90YXRpb25UeXBlKXtjYXNlIGQucmVuZGVyLkFubm90YXRpb25UeXBlLkNPTlNUQU5UOl8uZXh0ZW5kKHcsZi5QQVJBTVMuY29uc3RhbnQuc2l6ZSk7YnJlYWs7Y2FzZSBkLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TSE9SVENVVDppZih3Lm5vZGUudHlwZT09PQpkLk5vZGVUeXBlLk9QKV8uZXh0ZW5kKHcsZi5QQVJBTVMuc2hvcnRjdXRTaXplLm9wKTtlbHNlIGlmKHcubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBKV8uZXh0ZW5kKHcsZi5QQVJBTVMuc2hvcnRjdXRTaXplLm1ldGEpO2Vsc2UgaWYody5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUylfLmV4dGVuZCh3LGYuUEFSQU1TLnNob3J0Y3V0U2l6ZS5zZXJpZXMpO2Vsc2UgdGhyb3cgRXJyb3IoIkludmFsaWQgbm9kZSB0eXBlOiAiK3cubm9kZS50eXBlKTticmVhaztjYXNlIGQucmVuZGVyLkFubm90YXRpb25UeXBlLlNVTU1BUlk6Xy5leHRlbmQodyxmLlBBUkFNUy5jb25zdGFudC5zaXplKX19ZnVuY3Rpb24gdSh3KXtyZXR1cm4gdy5leHBhbmRlZD93Lng6dy54LXcud2lkdGgvMisody5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoP3cuaW5ib3hXaWR0aDowKSt3LmNvcmVCb3gud2lkdGgvMn1mdW5jdGlvbiB4KHcsQyl7cmV0dXJuIDE4MCpNYXRoLmF0YW4oKEMueS13LnkpLyhDLngtCncueCkpL01hdGguUEl9ZnVuY3Rpb24gQSh3KXtsZXQgQz14KHdbMF0sd1sxXSk7Zm9yKGxldCBGPTE7Rjx3Lmxlbmd0aC0xO0YrKyl7bGV0IEQ9eCh3W0ZdLHdbRisxXSk7aWYoMTxNYXRoLmFicyhELUMpKXJldHVybiExO0M9RH1yZXR1cm4hMH1mdW5jdGlvbiB5KHcsQyl7bGV0IEY9Qy5leHBhbmRlZD9DLng6dShDKSxEPUMueTt2YXIgQj13LngtRjt3PXcueS1EO2xldCBJPUMuZXhwYW5kZWQ/Qy53aWR0aDpDLmNvcmVCb3gud2lkdGgsTj1DLmV4cGFuZGVkP0MuaGVpZ2h0OkMuY29yZUJveC5oZWlnaHQ7TWF0aC5hYnModykqSS8yPk1hdGguYWJzKEIpKk4vMj8oMD53JiYoTj0tTiksQz0wPT09dz8wOk4vMipCL3csQj1OLzIpOigwPkImJihJPS1JKSxDPUkvMixCPTA9PT1CPzA6SS8yKncvQik7cmV0dXJue3g6RitDLHk6RCtCfX1mLlBBUkFNUz17YW5pbWF0aW9uOntkdXJhdGlvbjoyNTB9LGdyYXBoOnttZXRhOntub2RlU2VwOjUscmFua1NlcDoyNSxlZGdlU2VwOjV9LHNlcmllczp7bm9kZVNlcDo1LApyYW5rU2VwOjI1LGVkZ2VTZXA6NX0scGFkZGluZzp7cGFkZGluZ1RvcDo0MCxwYWRkaW5nTGVmdDoyMH19LHN1YnNjZW5lOnttZXRhOntwYWRkaW5nVG9wOjEwLHBhZGRpbmdCb3R0b206MTAscGFkZGluZ0xlZnQ6MTAscGFkZGluZ1JpZ2h0OjEwLGxhYmVsSGVpZ2h0OjIwLGV4dHJhY3RYT2Zmc2V0OjE1LGV4dHJhY3RZT2Zmc2V0OjIwfSxzZXJpZXM6e3BhZGRpbmdUb3A6MTAscGFkZGluZ0JvdHRvbToxMCxwYWRkaW5nTGVmdDoxMCxwYWRkaW5nUmlnaHQ6MTAsbGFiZWxIZWlnaHQ6MTB9fSxub2RlU2l6ZTp7bWV0YTp7cmFkaXVzOjUsd2lkdGg6NjAsbWF4TGFiZWxXaWR0aDo1MixoZWlnaHQ6ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzEsMjAwXSkucmFuZ2UoWzE1LDYwXSkuY2xhbXAoITApLGV4cGFuZEJ1dHRvblJhZGl1czozfSxvcDp7d2lkdGg6MTUsaGVpZ2h0OjYscmFkaXVzOjMsbGFiZWxPZmZzZXQ6LTgsbWF4TGFiZWxXaWR0aDozMH0sc2VyaWVzOntleHBhbmRlZDp7cmFkaXVzOjEwLApsYWJlbE9mZnNldDowfSx2ZXJ0aWNhbDp7d2lkdGg6MTYsaGVpZ2h0OjEzLGxhYmVsT2Zmc2V0Oi0xM30saG9yaXpvbnRhbDp7d2lkdGg6MjQsaGVpZ2h0OjgscmFkaXVzOjEwLGxhYmVsT2Zmc2V0Oi0xMH19LGJyaWRnZTp7d2lkdGg6MjAsaGVpZ2h0OjIwLHJhZGl1czoyLGxhYmVsT2Zmc2V0OjB9fSxzaG9ydGN1dFNpemU6e29wOnt3aWR0aDoxMCxoZWlnaHQ6NH0sbWV0YTp7d2lkdGg6MTIsaGVpZ2h0OjQscmFkaXVzOjF9LHNlcmllczp7d2lkdGg6MTQsaGVpZ2h0OjR9fSxhbm5vdGF0aW9uczp7aW5ib3hXaWR0aDo1MCxvdXRib3hXaWR0aDo1MCx4T2Zmc2V0OjEwLHlPZmZzZXQ6MyxsYWJlbE9mZnNldDoyLG1heExhYmVsV2lkdGg6MTIwfSxjb25zdGFudDp7c2l6ZTp7d2lkdGg6NCxoZWlnaHQ6NH19LHNlcmllczp7bWF4U3RhY2tDb3VudDozLHBhcmFsbGVsU3RhY2tPZmZzZXRSYXRpbzouMix0b3dlclN0YWNrT2Zmc2V0UmF0aW86LjV9LG1pbmltYXA6e3NpemU6MTUwfX07Zi5NSU5fQVVYX1dJRFRIPQoxNDA7Zi5sYXlvdXRTY2VuZT1oO2YuY29tcHV0ZUNYUG9zaXRpb25PZk5vZGVTaGFwZT11fSkoZC5sYXlvdXR8fChkLmxheW91dD17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbG9hZGVyLmpzCnZhciBVaT10aGlzJiZ0aGlzLl9fYXdhaXRlcnx8ZnVuY3Rpb24oYixkLGYsaCl7cmV0dXJuIG5ldyAoZnx8KGY9UHJvbWlzZSkpKGZ1bmN0aW9uKGssdCl7ZnVuY3Rpb24gbChuKXt0cnl7bShoLm5leHQobikpfWNhdGNoKHEpe3QocSl9fWZ1bmN0aW9uIHAobil7dHJ5e20oaFsidGhyb3ciXShuKSl9Y2F0Y2gocSl7dChxKX19ZnVuY3Rpb24gbShuKXtuLmRvbmU/ayhuLnZhbHVlKToobmV3IGYoZnVuY3Rpb24ocSl7cShuLnZhbHVlKX0pKS50aGVuKGwscCl9bSgoaD1oLmFwcGx5KGIsZHx8W10pKS5uZXh0KCkpfSl9OwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmLmZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGg9ZnVuY3Rpb24oaCxrLHQsbD1uZXcgZC5vcC5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXIscD1kLmhpZXJhcmNoeS5EZWZhdWx0SGllcmFyY2h5UGFyYW1zKXtjb25zdCBtPWQudXRpbC5nZXRTdWJ0YXNrVHJhY2tlcihoLDIwLCJHcmFwaCIpLG49ZC51dGlsLmdldFN1YnRhc2tUcmFja2VyKGgsNTAsIk5hbWVzcGFjZSBoaWVyYXJjaHkiKTtyZXR1cm4gZC5wYXJzZXIuZmV0Y2hBbmRQYXJzZUdyYXBoRGF0YShrLHQsZC51dGlsLmdldFN1YnRhc2tUcmFja2VyKGgsMzAsIkRhdGEiKSkudGhlbihmdW5jdGlvbihxKXtpZighcS5ub2RlKXRocm93IEVycm9yKCJUaGUgZ3JhcGggaXMgZW1wdHkuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIFRlbnNvckZsb3cgY291bGQgbm90IHRyYWNlIGFueSBncmFwaC4gUGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2lzc3Vlcy8xOTYxIGZvciBtb3JlIGluZm9ybWF0aW9uLiIpOwpyZXR1cm4gZC5idWlsZChxLGQuRGVmYXVsdEJ1aWxkUGFyYW1zLG0pfSwoKT0+e3Rocm93IEVycm9yKCJNYWxmb3JtZWQgR3JhcGhEZWYuIFRoaXMgY2FuIHNvbWV0aW1lcyBiZSBjYXVzZWQgYnkgYSBiYWQgbmV0d29yayBjb25uZWN0aW9uIG9yIGRpZmZpY3VsdHkgcmVjb25jaWxpbmcgbXVsdGlwbGUgR3JhcGhEZWZzOyBmb3IgdGhlIGxhdHRlciBjYXNlLCBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5MjkuIik7fSkudGhlbihxPT5VaSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7ZC5vcC5jaGVja09wc0ZvckNvbXBhdGliaWxpdHkocSxsKTtjb25zdCB1PXlpZWxkIGQuaGllcmFyY2h5LmJ1aWxkKHEscCxuKTtyZXR1cm57Z3JhcGg6cSxncmFwaEhpZXJhcmNoeTp1fX0pKS5jYXRjaChxPT57aC5yZXBvcnRFcnJvcihgR3JhcGggdmlzdWFsaXphdGlvbiBmYWlsZWQuXG5cbiR7cX1gLHEpO3Rocm93IHE7Cn0pfX0pKGQubG9hZGVyfHwoZC5sb2FkZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL25vZGUuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7KGZ1bmN0aW9uKGgpe2Z1bmN0aW9uIGsoWixiYSxlYSl7aWYoYmEubm9kZS5pc0dyb3VwTm9kZSl7aWYoYmEuZXhwYW5kZWQpcmV0dXJuIGYuYnVpbGRHcm91cChaLGJhLGVhLGYuQ2xhc3MuU3Vic2NlbmUuR1JPVVApO2Yuc2VsZWN0Q2hpbGQoWiwiZyIsZi5DbGFzcy5TdWJzY2VuZS5HUk9VUCkucmVtb3ZlKCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdChaLGJhKXtsZXQgZWE9YmEueC1iYS53aWR0aC8yK2JhLnBhZGRpbmdMZWZ0O2JhPWJhLnktYmEuaGVpZ2h0LzIrYmEucGFkZGluZ1RvcDtaPWYuc2VsZWN0Q2hpbGQoWiwiZyIsZi5DbGFzcy5TdWJzY2VuZS5HUk9VUCk7Zi50cmFuc2xhdGUoWixlYSxiYSl9ZnVuY3Rpb24gbChaLGJhLGVhKXtaPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJnIixmLkNsYXNzLk5vZGUuQlVUVE9OX0NPTlRBSU5FUik7Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImNpcmNsZSIsZi5DbGFzcy5Ob2RlLkJVVFRPTl9DSVJDTEUpOwpmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwicGF0aCIsZi5DbGFzcy5Ob2RlLkVYUEFORF9CVVRUT04pLmF0dHIoImQiLCJNMCwtMi4yIFYyLjIgTS0yLjIsMCBIMi4yIik7Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInBhdGgiLGYuQ2xhc3MuTm9kZS5DT0xMQVBTRV9CVVRUT04pLmF0dHIoImQiLCJNLTIuMiwwIEgyLjIiKTtaLm9uKCJjbGljayIsY2E9PntkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtlYS5maXJlKCJub2RlLXRvZ2dsZS1leHBhbmQiLHtuYW1lOmNhLm5vZGUubmFtZX0pfSk7Zi5wb3NpdGlvbkJ1dHRvbihaLGJhKX1mdW5jdGlvbiBwKFosYmEsZWEsY2Epe2lmKGNhKVouYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIik7ZWxzZXt2YXIga2E9Zi5jb250ZXh0bWVudS5nZXRNZW51KGVhLG0oYmEubm9kZSxlYSkpO1oub24oImRibGNsaWNrIixZPT57ZWEuZmlyZSgibm9kZS10b2dnbGUtZXhwYW5kIix7bmFtZTpZLm5vZGUubmFtZX0pfSkub24oIm1vdXNlb3ZlciIsClk9PntlYS5pc05vZGVFeHBhbmRlZChZKXx8ZWEuZmlyZSgibm9kZS1oaWdobGlnaHQiLHtuYW1lOlkubm9kZS5uYW1lfSl9KS5vbigibW91c2VvdXQiLFk9PntlYS5pc05vZGVFeHBhbmRlZChZKXx8ZWEuZmlyZSgibm9kZS11bmhpZ2hsaWdodCIse25hbWU6WS5ub2RlLm5hbWV9KX0pLm9uKCJjbGljayIsWT0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2VhLmZpcmUoIm5vZGUtc2VsZWN0Iix7bmFtZTpZLm5vZGUubmFtZX0pfSkub24oImNvbnRleHRtZW51IiwoWSxFYSk9PntlYS5maXJlKCJub2RlLXNlbGVjdCIse25hbWU6WS5ub2RlLm5hbWV9KTtrYS5jYWxsKFksRWEpfSl9fWZ1bmN0aW9uIG0oWixiYSl7bGV0IGVhPVt7dGl0bGU6KCk9PmQuZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmcoWi5pbmNsdWRlKSxhY3Rpb246KCk9PntiYS5maXJlKCJub2RlLXRvZ2dsZS1leHRyYWN0Iix7bmFtZTpaLm5hbWV9KX19XTtiYS5ub2RlQ29udGV4dE1lbnVJdGVtcyYmKGVhPWVhLmNvbmNhdChiYS5ub2RlQ29udGV4dE1lbnVJdGVtcykpOwpuKFopJiZlYS5wdXNoKHt0aXRsZTooKT0+eChaKSxhY3Rpb246KCk9PntiYS5maXJlKCJub2RlLXRvZ2dsZS1zZXJpZXNncm91cCIse25hbWU6cShaKX0pfX0pO3JldHVybiBlYX1mdW5jdGlvbiBuKFope3JldHVybiBudWxsIT09cShaKX1mdW5jdGlvbiBxKFope3JldHVybiBaP1oudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTP1oubmFtZTpaLnR5cGU9PT1kLk5vZGVUeXBlLk9QP1oub3duaW5nU2VyaWVzOm51bGw6bnVsbH1mdW5jdGlvbiB1KFope2xldCBiYT1udWxsO2lmKCFaKXJldHVybiBudWxsO1oudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTP2JhPVo6Wi5wYXJlbnROb2RlJiZaLnBhcmVudE5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTJiYoYmE9Wi5wYXJlbnROb2RlKTtyZXR1cm4gYmF9ZnVuY3Rpb24geChaKXtyZXR1cm4gYi5ncmFwaC5nZXRHcm91cFNlcmllc05vZGVCdXR0b25TdHJpbmcobnVsbCE9PXUoWik/Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA6CmIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVApfWZ1bmN0aW9uIEEoWixiYSxlYSl7dmFyIGNhPWJhLmRpc3BsYXlOYW1lO2xldCBrYT1iYS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJiFiYS5leHBhbmRlZDtaPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJ0ZXh0IixmLkNsYXNzLk5vZGUuTEFCRUwpO2xldCBZPVoubm9kZSgpO1kucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChZKTtaLmF0dHIoImR5IiwiLjM1ZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpO2thJiYoY2EubGVuZ3RoPmVhLm1heE1ldGFub2RlTGFiZWxMZW5ndGgmJihjYT1jYS5zdWJzdHIoMCxlYS5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoLTIpKyIuLi4iKSxlYT13KGVhKSxaLmF0dHIoImZvbnQtc2l6ZSIsZWEoY2EubGVuZ3RoKSsicHgiKSk7Y2E9Wi50ZXh0KGNhKTt5KGNhLGJhLm5vZGUudHlwZSxiYSk7cmV0dXJuIFp9ZnVuY3Rpb24geShaLGJhLGVhKXtsZXQgY2E9Wi5ub2RlKCk7dmFyIGthPQpjYS5nZXRDb21wdXRlZFRleHRMZW5ndGgoKTtsZXQgWT1jYS50ZXh0Q29udGVudCxFYT1udWxsO3N3aXRjaChiYSl7Y2FzZSBkLk5vZGVUeXBlLk1FVEE6ZWEmJiFlYS5leHBhbmRlZCYmKEVhPWQubGF5b3V0LlBBUkFNUy5ub2RlU2l6ZS5tZXRhLm1heExhYmVsV2lkdGgpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5PUDpFYT1kLmxheW91dC5QQVJBTVMubm9kZVNpemUub3AubWF4TGFiZWxXaWR0aDticmVhaztjYXNlIC0xOkVhPWQubGF5b3V0LlBBUkFNUy5hbm5vdGF0aW9ucy5tYXhMYWJlbFdpZHRofWlmKCEobnVsbD09PUVhfHxrYTw9RWEpKXtmb3Ioa2E9MTtjYS5nZXRTdWJTdHJpbmdMZW5ndGgoMCxrYSk8RWE7KWthKys7YmE9Y2EudGV4dENvbnRlbnQuc3Vic3RyKDAsa2EpO2RvIGJhPWJhLnN1YnN0cigwLGJhLmxlbmd0aC0xKSxjYS50ZXh0Q29udGVudD1iYSsiLi4uIixrYT1jYS5nZXRDb21wdXRlZFRleHRMZW5ndGgoKTt3aGlsZShrYT5FYSYmMDxiYS5sZW5ndGgpO3JldHVybiBaLmFwcGVuZCgidGl0bGUiKS50ZXh0KFkpfX0KZnVuY3Rpb24gdyhaKXthYXx8KGFhPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFtaLm1heE1ldGFub2RlTGFiZWxMZW5ndGhMYXJnZUZvbnQsWi5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoXSkucmFuZ2UoW1oubWF4TWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplLFoubWluTWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplXSkuY2xhbXAoITApKTtyZXR1cm4gYWF9ZnVuY3Rpb24gQyhaLGJhLGVhLGNhKXtmLnNlbGVjdENoaWxkKFosInRleHQiLGYuQ2xhc3MuTm9kZS5MQUJFTCkudHJhbnNpdGlvbigpLmF0dHIoIngiLGJhKS5hdHRyKCJ5IixlYStjYSl9ZnVuY3Rpb24gRihaLGJhLGVhKXtaPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJnIixlYSk7c3dpdGNoKGJhLm5vZGUudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk9QOmJhPWJhLm5vZGU7aWYoXy5pc051bWJlcihiYS5mdW5jdGlvbklucHV0SW5kZXgpfHxfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uT3V0cHV0SW5kZXgpKXtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwKInBvbHlnb24iLGYuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpO2JyZWFrfWYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJlbGxpcHNlIixmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKTticmVhaztjYXNlIGQuTm9kZVR5cGUuU0VSSUVTOmVhPSJhbm5vdGF0aW9uIjtiYS5jb3JlR3JhcGgmJihlYT1iYS5ub2RlLmhhc05vbkNvbnRyb2xFZGdlcz8idmVydGljYWwiOiJob3Jpem9udGFsIik7bGV0IGNhPVtmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUXTtiYS5pc0ZhZGVkT3V0JiZjYS5wdXNoKCJmYWRlZC1lbGxpcHNlIik7Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInVzZSIsY2EpLmF0dHIoInhsaW5rOmhyZWYiLCIjb3Atc2VyaWVzLSIrZWErIi1zdGFtcCIpO2Yuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJyZWN0IixmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKS5hdHRyKCJyeCIsYmEucmFkaXVzKS5hdHRyKCJyeSIsYmEucmFkaXVzKTticmVhaztjYXNlIGQuTm9kZVR5cGUuQlJJREdFOmYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLAoicmVjdCIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLGJhLnJhZGl1cykuYXR0cigicnkiLGJhLnJhZGl1cyk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLk1FVEE6Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInJlY3QiLGYuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpLmF0dHIoInJ4IixiYS5yYWRpdXMpLmF0dHIoInJ5IixiYS5yYWRpdXMpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrYmEubm9kZS50eXBlKTt9cmV0dXJuIFp9ZnVuY3Rpb24gRChaKXtzd2l0Y2goWi5ub2RlLnR5cGUpe2Nhc2UgZC5Ob2RlVHlwZS5PUDpyZXR1cm4gZi5DbGFzcy5PUE5PREU7Y2FzZSBkLk5vZGVUeXBlLk1FVEE6cmV0dXJuIGYuQ2xhc3MuTUVUQU5PREU7Y2FzZSBkLk5vZGVUeXBlLlNFUklFUzpyZXR1cm4gZi5DbGFzcy5TRVJJRVNOT0RFO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6cmV0dXJuIGYuQ2xhc3MuQlJJREdFTk9ERTtjYXNlIGQuTm9kZVR5cGUuRUxMSVBTSVM6cmV0dXJuIGYuQ2xhc3MuRUxMSVBTSVNOT0RFfXRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiKwpaLm5vZGUudHlwZSk7fWZ1bmN0aW9uIEIoWixiYSl7dmFyIGVhPWYuc2VsZWN0Q2hpbGQoWiwiZyIsZi5DbGFzcy5Ob2RlLlNIQVBFKTtsZXQgY2E9ZC5sYXlvdXQuY29tcHV0ZUNYUG9zaXRpb25PZk5vZGVTaGFwZShiYSk7c3dpdGNoKGJhLm5vZGUudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk9QOntjb25zdCBrYT1iYS5ub2RlO18uaXNOdW1iZXIoa2EuZnVuY3Rpb25JbnB1dEluZGV4KXx8Xy5pc051bWJlcihrYS5mdW5jdGlvbk91dHB1dEluZGV4KT8oZWE9Zi5zZWxlY3RDaGlsZChlYSwicG9seWdvbiIpLGYucG9zaXRpb25UcmlhbmdsZShlYSxiYS54LGJhLnksYmEuY29yZUJveC53aWR0aCxiYS5jb3JlQm94LmhlaWdodCkpOihlYT1mLnNlbGVjdENoaWxkKGVhLCJlbGxpcHNlIiksZi5wb3NpdGlvbkVsbGlwc2UoZWEsY2EsYmEueSxiYS5jb3JlQm94LndpZHRoLGJhLmNvcmVCb3guaGVpZ2h0KSk7QyhaLGNhLGJhLnksYmEubGFiZWxPZmZzZXQpO2JyZWFrfWNhc2UgZC5Ob2RlVHlwZS5NRVRBOmVhPQplYS5zZWxlY3RBbGwoInJlY3QiKTtiYS5leHBhbmRlZD8oZi5wb3NpdGlvblJlY3QoZWEsYmEueCxiYS55LGJhLndpZHRoLGJhLmhlaWdodCksdChaLGJhKSxDKFosY2EsYmEueSwtYmEuaGVpZ2h0LzIrYmEubGFiZWxIZWlnaHQvMikpOihmLnBvc2l0aW9uUmVjdChlYSxjYSxiYS55LGJhLmNvcmVCb3gud2lkdGgsYmEuY29yZUJveC5oZWlnaHQpLEMoWixjYSxiYS55LDApKTticmVhaztjYXNlIGQuTm9kZVR5cGUuU0VSSUVTOmVhPWYuc2VsZWN0Q2hpbGQoZWEsInVzZSIpO2JhLmV4cGFuZGVkPyhmLnBvc2l0aW9uUmVjdChlYSxiYS54LGJhLnksYmEud2lkdGgsYmEuaGVpZ2h0KSx0KFosYmEpLEMoWixjYSxiYS55LC1iYS5oZWlnaHQvMitiYS5sYWJlbEhlaWdodC8yKSk6KGYucG9zaXRpb25SZWN0KGVhLGNhLGJhLnksYmEuY29yZUJveC53aWR0aCxiYS5jb3JlQm94LmhlaWdodCksQyhaLGNhLGJhLnksYmEubGFiZWxPZmZzZXQpKTticmVhaztjYXNlIGQuTm9kZVR5cGUuQlJJREdFOlo9CmYuc2VsZWN0Q2hpbGQoZWEsInJlY3QiKTtmLnBvc2l0aW9uUmVjdChaLGJhLngsYmEueSxiYS53aWR0aCxiYS5oZWlnaHQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrYmEubm9kZS50eXBlKTt9fWZ1bmN0aW9uIEkoWixiYSxlYSl7bGV0IGNhPWIuZ3JhcGgudXRpbC5lc2NhcGVRdWVyeVNlbGVjdG9yKFopO2lmKCFlYSlyZXR1cm5gdXJsKCMke2NhfSlgO2VhPWQzLnNlbGVjdChlYSk7bGV0IGthPWVhLnNlbGVjdCgiZGVmcyNfZ3JhcGgtZ3JhZGllbnRzIik7a2EuZW1wdHkoKSYmKGthPWVhLmFwcGVuZCgiZGVmcyIpLmF0dHIoImlkIiwiX2dyYXBoLWdyYWRpZW50cyIpKTtsZXQgWT1rYS5zZWxlY3QoImxpbmVhckdyYWRpZW50IyIrY2EpO2lmKFkuZW1wdHkoKSl7WT1rYS5hcHBlbmQoImxpbmVhckdyYWRpZW50IikuYXR0cigiaWQiLFopO1kuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7bGV0IEVhPTA7Xy5lYWNoKGJhLHZhPT57bGV0IHhhPQp2YS5jb2xvcjtZLmFwcGVuZCgic3RvcCIpLmF0dHIoIm9mZnNldCIsRWEpLmF0dHIoInN0b3AtY29sb3IiLHhhKTtZLmFwcGVuZCgic3RvcCIpLmF0dHIoIm9mZnNldCIsRWErdmEucHJvcG9ydGlvbikuYXR0cigic3RvcC1jb2xvciIseGEpO0VhKz12YS5wcm9wb3J0aW9ufSl9cmV0dXJuYHVybCgjJHtjYX0pYH1mdW5jdGlvbiBOKFosYmEsZWEsY2Esa2Epe2xldCBZPWQucmVuZGVyLk1ldGFub2RlQ29sb3JzO3N3aXRjaChiYSl7Y2FzZSBsYS5TVFJVQ1RVUkU6cmV0dXJuIGVhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQT8oYmE9ZWEubm9kZS50ZW1wbGF0ZUlkLG51bGw9PT1iYT9ZLlVOS05PV046WS5TVFJVQ1RVUkVfUEFMRVRURShaKGJhKSxjYSkpOmVhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTP2NhP1kuRVhQQU5ERURfQ09MT1I6IndoaXRlIjplYS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLkJSSURHRT9lYS5zdHJ1Y3R1cmFsPyIjZjBlIjplYS5ub2RlLmluYm91bmQ/CiIjMGVmIjoiI2ZlMCI6Xy5pc051bWJlcihlYS5ub2RlLmZ1bmN0aW9uSW5wdXRJbmRleCk/IiM3OTU1NDgiOl8uaXNOdW1iZXIoZWEubm9kZS5mdW5jdGlvbk91dHB1dEluZGV4KT8iIzAwOTY4OCI6IndoaXRlIjtjYXNlIGxhLkRFVklDRTpyZXR1cm4gbnVsbD09ZWEuZGV2aWNlQ29sb3JzP1kuVU5LTk9XTjpjYT9ZLkVYUEFOREVEX0NPTE9SOkkoImRldmljZS0iK2VhLm5vZGUubmFtZSxlYS5kZXZpY2VDb2xvcnMsa2EpO2Nhc2UgbGEuWExBX0NMVVNURVI6cmV0dXJuIG51bGw9PWVhLnhsYUNsdXN0ZXJDb2xvcnM/WS5VTktOT1dOOmNhP1kuRVhQQU5ERURfQ09MT1I6SSgieGxhLSIrZWEubm9kZS5uYW1lLGVhLnhsYUNsdXN0ZXJDb2xvcnMsa2EpO2Nhc2UgbGEuQ09NUFVURV9USU1FOnJldHVybiBjYT9ZLkVYUEFOREVEX0NPTE9SOmVhLmNvbXB1dGVUaW1lQ29sb3J8fFkuVU5LTk9XTjtjYXNlIGxhLk1FTU9SWTpyZXR1cm4gY2E/WS5FWFBBTkRFRF9DT0xPUjplYS5tZW1vcnlDb2xvcnx8ClkuVU5LTk9XTjtjYXNlIGxhLk9QX0NPTVBBVElCSUxJVFk6cmV0dXJuIG51bGw9PWVhLmNvbXBhdGliaWxpdHlDb2xvcnM/WS5VTktOT1dOOmNhP1kuRVhQQU5ERURfQ09MT1I6SSgib3AtY29tcGF0LSIrZWEubm9kZS5uYW1lLGVhLmNvbXBhdGliaWxpdHlDb2xvcnMsa2EpO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVua25vd24gY2FzZSB0byBjb2xvciBub2RlcyBieSIpO319ZnVuY3Rpb24gTyhaLGJhLGVhLGNhKXtjYT1jYXx8Zi5DbGFzcy5Ob2RlLlNIQVBFO2xldCBrYT1lYS5pc05vZGVTZWxlY3RlZChiYS5ub2RlLm5hbWUpLFk9YmEuaXNJbkV4dHJhY3R8fGJhLmlzT3V0RXh0cmFjdHx8YmEuaXNMaWJyYXJ5RnVuY3Rpb24sRWE9YmEuZXhwYW5kZWQmJmNhIT09Zi5DbGFzcy5Bbm5vdGF0aW9uLk5PREUsdmE9YmEuaXNGYWRlZE91dDtaLmNsYXNzZWQoImhpZ2hsaWdodGVkIixlYS5pc05vZGVIaWdobGlnaHRlZChiYS5ub2RlLm5hbWUpKTtaLmNsYXNzZWQoInNlbGVjdGVkIixrYSk7ClouY2xhc3NlZCgiZXh0cmFjdCIsWSk7Wi5jbGFzc2VkKCJleHBhbmRlZCIsRWEpO1ouY2xhc3NlZCgiZmFkZWQiLHZhKTtaPVouc2VsZWN0KCIuIitjYSsiIC4iK2YuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpO2JhPU4oZWEudGVtcGxhdGVJbmRleCxsYVtlYS5jb2xvckJ5LnRvVXBwZXJDYXNlKCldLGJhLEVhLGVhLmdldEdyYXBoU3ZnUm9vdCgpKTtaLnN0eWxlKCJmaWxsIixiYSk7Wi5zdHlsZSgic3Ryb2tlIixrYT9udWxsOkgoYmEpKX1mdW5jdGlvbiBIKFope3JldHVybiJ1cmwiPT09Wi5zdWJzdHJpbmcoMCwzKT9kLnJlbmRlci5NZXRhbm9kZUNvbG9ycy5HUkFESUVOVF9PVVRMSU5FOmQzLnJnYihaKS5kYXJrZXIoKS50b1N0cmluZygpfWZ1bmN0aW9uIEsoWixiYSl7bGV0IGVhPVtdO1o9YmEuZ2V0Tm9kZUJ5TmFtZShaKTtpZihaIGluc3RhbmNlb2YgYi5ncmFwaC5PcE5vZGVJbXBsKXJldHVybltaXS5jb25jYXQoWi5pbkVtYmVkZGluZ3MpO1o9Wi5tZXRhZ3JhcGgubm9kZXMoKTsKXy5lYWNoKFosZnVuY3Rpb24oY2Epe2VhPWVhLmNvbmNhdChLKGNhLGJhKSl9KTtyZXR1cm4gZWF9ZnVuY3Rpb24gTShaLGJhLGVhLGNhKXtpZihjYVtlYS5uYW1lXSlyZXR1cm4gY2E7Y2FbZWEubmFtZV09ITA7dmFyIGthPWVhLmlucHV0cztsZXQgWT1YKGJhLGVhKTtkMy5zZWxlY3QoWikuc2VsZWN0KGAubm9kZVtkYXRhLW5hbWU9IiR7WS5uYW1lfSJdYCkuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0IiwhMCk7bGV0IEVhPXt9O18uZWFjaChrYSxmdW5jdGlvbihBYSl7QWE9YmEuZ2V0Tm9kZUJ5TmFtZShBYS5uYW1lKTtpZih2b2lkIDAhPT1BYSl7QWEgaW5zdGFuY2VvZiBkLk1ldGFub2RlSW1wbCYmKEFhPWIuZ3JhcGguZ2V0U3RyaWN0TmFtZShBYS5uYW1lKSxBYT1iYS5nZXROb2RlQnlOYW1lKEFhKSk7dmFyIEZhPVgoYmEsQWEpLHlhPUVhW0ZhLm5hbWVdO3lhP3lhLm9wTm9kZXMucHVzaChBYSk6RWFbRmEubmFtZV09e3Zpc2libGVQYXJlbnQ6RmEsb3BOb2RlczpbQWFdfX19KTsKbGV0IHZhPXt9LHhhPVtZXTt2YVtZLm5hbWVdPXt0cmFjZWQ6ITEsaW5kZXg6MCxjb25uZWN0aW9uRW5kcG9pbnRzOltdfTtlYT1ZO2ZvcihrYT0xO2VhLm5hbWUhPT1iLmdyYXBoLlJPT1RfTkFNRTtrYSsrKWVhPWVhLnBhcmVudE5vZGUsdmFbZWEubmFtZV09e3RyYWNlZDohMSxpbmRleDprYSxjb25uZWN0aW9uRW5kcG9pbnRzOltdfSx4YVtrYV09ZWE7Xy5mb3JPd24oRWEsZnVuY3Rpb24oQWEpe2xldCBGYT1BYS52aXNpYmxlUGFyZW50O18uZWFjaChBYS5vcE5vZGVzLGZ1bmN0aW9uKHlhKXtjYT1NKFosYmEseWEsY2EpfSk7RmEubmFtZSE9PVkubmFtZSYmTChaLEZhLHZhLHhhKX0pO3JldHVybiBjYX1mdW5jdGlvbiBMKFosYmEsZWEsY2Epe3ZhciBrYT1iYSxZPWJhO2ZvcihiYT1bXTshZWFba2EubmFtZV07KVkubmFtZSE9PWthLm5hbWUmJmJhLnB1c2goW1ksa2FdKSxZPWthLGthPWthLnBhcmVudE5vZGU7ZWE9ZWFba2EubmFtZV0uaW5kZXg7bGV0IEVhPWNhW01hdGgubWF4KGVhLQoxLDApXS5uYW1lO1k9a2E9WS5uYW1lO2NvbnN0IHZhPWQzLnNlbGVjdChaKTt2YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7WX0tLSR7RWF9Il1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApO18uZWFjaChiYSxmdW5jdGlvbih4YSl7dmEuc2VsZWN0QWxsKGBbZGF0YS1lZGdlPSIke3hhWzBdLm5hbWV9LS0ke0VhfWArYH5+JHt4YVsxXS5uYW1lfX5+T1VUIl1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfSk7Zm9yKFo9MTtaPGVhO1orKyl2YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7a2F9fn4ke2NhW1pdLm5hbWV9YCtgfn5JTi0tJHtjYVtaLTFdLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfWZ1bmN0aW9uIFEoWixiYSl7bGV0IGVhPXt9O18uZWFjaChiYSxmdW5jdGlvbihjYSl7Y2E9Wi5nZXROb2RlQnlOYW1lKGNhKTtjYT1YKFosY2EpO2VhW2NhLm5hbWVdPWNhfSk7cmV0dXJuIGVhfWZ1bmN0aW9uIFQoWiwKYmEpe18uZm9yT3duKGJhLGZ1bmN0aW9uKGVhKXtmb3IoO2VhLm5hbWUhPT1iLmdyYXBoLlJPT1RfTkFNRTspe2NvbnN0IGNhPWQzLnNlbGVjdChaKS5zZWxlY3QoYC5ub2RlW2RhdGEtbmFtZT0iJHtlYS5uYW1lfSJdYCk7IWNhLm5vZGVzKCkubGVuZ3RofHxjYS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiKXx8Y2EuY2xhc3NlZCgic2VsZWN0ZWQiKXx8Y2EuY2xhc3NlZCgib3AiKXx8Y2EuY2xhc3NlZCgiaW5wdXQtcGFyZW50IiwhMCk7ZWE9ZWEucGFyZW50Tm9kZX19KX1mdW5jdGlvbiBYKFosYmEpe2xldCBlYT0hMSxjYT1iYTtmb3IoOyFlYTspaWYoYmE9Y2EsY2E9YmEucGFyZW50Tm9kZSx2b2lkIDA9PT1jYSllYT0hMDtlbHNle2xldCBrYT1aLmdldFJlbmRlck5vZGVCeU5hbWUoY2EubmFtZSk7a2EmJihrYS5leHBhbmRlZHx8Y2EgaW5zdGFuY2VvZiBkLk9wTm9kZUltcGwpJiYoZWE9ITApfXJldHVybiBiYX1oLmJ1aWxkR3JvdXA9ZnVuY3Rpb24oWixiYSxlYSl7Wj1mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwKImciLGYuQ2xhc3MuTm9kZS5DT05UQUlORVIpLnNlbGVjdEFsbChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KS5kYXRhKGJhLGNhPT5jYS5ub2RlLm5hbWUrIjoiK2NhLm5vZGUudHlwZSk7Wi5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImRhdGEtbmFtZSIsY2E9PmNhLm5vZGUubmFtZSkuZWFjaChmdW5jdGlvbihjYSl7bGV0IGthPWQzLnNlbGVjdCh0aGlzKTtlYS5hZGROb2RlR3JvdXAoY2Eubm9kZS5uYW1lLGthKX0pLm1lcmdlKFopLmF0dHIoImNsYXNzIixjYT0+Zi5DbGFzcy5Ob2RlLkdST1VQKyIgIitEKGNhKSkuZWFjaChmdW5jdGlvbihjYSl7bGV0IGthPWQzLnNlbGVjdCh0aGlzKTt2YXIgWT1mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoa2EsImciLGYuQ2xhc3MuQW5ub3RhdGlvbi5JTkJPWCk7Zi5hbm5vdGF0aW9uLmJ1aWxkR3JvdXAoWSxjYS5pbkFubm90YXRpb25zLGNhLGVhKTtZPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChrYSwiZyIsZi5DbGFzcy5Bbm5vdGF0aW9uLk9VVEJPWCk7CmYuYW5ub3RhdGlvbi5idWlsZEdyb3VwKFksY2Eub3V0QW5ub3RhdGlvbnMsY2EsZWEpO1k9RihrYSxjYSxmLkNsYXNzLk5vZGUuU0hBUEUpO2NhLm5vZGUuaXNHcm91cE5vZGUmJmwoWSxjYSxlYSk7cChZLGNhLGVhKTtrKGthLGNhLGVhKTtZPUEoa2EsY2EsZWEpO3AoWSxjYSxlYSxjYS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEpO08oa2EsY2EsZWEpO0Ioa2EsY2EpfSk7Wi5leGl0KCkuZWFjaChmdW5jdGlvbihjYSl7ZWEucmVtb3ZlTm9kZUdyb3VwKGNhLm5vZGUubmFtZSk7bGV0IGthPWQzLnNlbGVjdCh0aGlzKTswPGNhLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGgmJmthLnNlbGVjdCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLklOQk9YKS5zZWxlY3RBbGwoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5HUk9VUCkuZWFjaChZPT57ZWEucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKFksY2EpfSk7MDxjYS5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aCYma2Euc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uT1VUQk9YKS5zZWxlY3RBbGwoIi4iKwpmLkNsYXNzLkFubm90YXRpb24uR1JPVVApLmVhY2goWT0+e2VhLnJlbW92ZUFubm90YXRpb25Hcm91cChZLGNhKX0pfSkucmVtb3ZlKCk7cmV0dXJuIFp9O2guZ2V0Q29udGV4dE1lbnU9bTtoLmNhbkJlSW5TZXJpZXM9bjtoLmdldFNlcmllc05hbWU9cTtoLmdldEdyb3VwU2V0dGluZ0xhYmVsPXg7aC5lbmZvcmNlTGFiZWxXaWR0aD15O2xldCBhYT1udWxsO2guYnVpbGRTaGFwZT1GO2gubm9kZUNsYXNzPUQ7bGV0IGxhOyhmdW5jdGlvbihaKXtaW1ouU1RSVUNUVVJFPTBdPSJTVFJVQ1RVUkUiO1pbWi5ERVZJQ0U9MV09IkRFVklDRSI7WltaLlhMQV9DTFVTVEVSPTJdPSJYTEFfQ0xVU1RFUiI7WltaLkNPTVBVVEVfVElNRT0zXT0iQ09NUFVURV9USU1FIjtaW1ouTUVNT1JZPTRdPSJNRU1PUlkiO1pbWi5PUF9DT01QQVRJQklMSVRZPTVdPSJPUF9DT01QQVRJQklMSVRZIn0pKGxhPWguQ29sb3JCeXx8KGguQ29sb3JCeT17fSkpO2gucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucz1mdW5jdGlvbihaKXtkMy5zZWxlY3QoWikuc2VsZWN0KCJkZWZzI19ncmFwaC1ncmFkaWVudHMiKS5yZW1vdmUoKX07CmguZ2V0RmlsbEZvck5vZGU9TjtoLnN0eWxpemU9TztoLmdldFN0cm9rZUZvckZpbGw9SDtoLnVwZGF0ZUlucHV0VHJhY2U9ZnVuY3Rpb24oWixiYSxlYSxjYSl7Y29uc3Qga2E9ZDMuc2VsZWN0KFopO2thLnNlbGVjdEFsbCgiLmlucHV0LWhpZ2hsaWdodCIpLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIsITEpO2thLnNlbGVjdEFsbCgiLm5vbi1pbnB1dCIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITEpO2thLnNlbGVjdEFsbCgiLmlucHV0LXBhcmVudCIpLmNsYXNzZWQoImlucHV0LXBhcmVudCIsITEpO2thLnNlbGVjdEFsbCgiLmlucHV0LWNoaWxkIikuY2xhc3NlZCgiaW5wdXQtY2hpbGQiLCExKTtrYS5zZWxlY3RBbGwoIi5pbnB1dC1lZGdlLWhpZ2hsaWdodCIpLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMSk7a2Euc2VsZWN0QWxsKCIubm9uLWlucHV0LWVkZ2UtaGlnaGxpZ2h0IikuY2xhc3NlZCgibm9uLWlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtaGlnaGxpZ2h0LXNlbGVjdGVkIikuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0LXNlbGVjdGVkIiwKITEpO2lmKGJhJiZjYSYmZWEpe2VhPUsoZWEsYmEpO3ZhciBZPXt9O18uZWFjaChlYSxmdW5jdGlvbihFYSl7WT1NKFosYmEsRWEsWSl9KTtlYT1PYmplY3Qua2V5cyhZKTtlYT1RKGJhLGVhKTtUKFosZWEpO2thLnNlbGVjdEFsbCgiZy5ub2RlOm5vdCguc2VsZWN0ZWQpOm5vdCguaW5wdXQtaGlnaGxpZ2h0KTpub3QoLmlucHV0LXBhcmVudCk6bm90KC5pbnB1dC1jaGlsZHJlbikiKS5jbGFzc2VkKCJub24taW5wdXQiLCEwKS5lYWNoKGZ1bmN0aW9uKEVhKXtrYS5zZWxlY3RBbGwoYFtkYXRhLW5hbWU9IiR7RWEubm9kZS5uYW1lfSJdYCkuY2xhc3NlZCgibm9uLWlucHV0IiwhMCl9KTtrYS5zZWxlY3RBbGwoImcuZWRnZTpub3QoLmlucHV0LWVkZ2UtaGlnaGxpZ2h0KSIpLmNsYXNzZWQoIm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfX07aC5nZXRWaXNpYmxlUGFyZW50PVh9KShmLm5vZGV8fChmLm5vZGU9e30pKX0pKGQuc2NlbmV8fChkLnNjZW5lPXt9KSl9KShiLmdyYXBofHwKKGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vb3AuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Y2xhc3MgaHtpc05vdFRwdU9wKGspe3JldHVybi0xIT1rLnRvTG93ZXJDYXNlKCkuc2VhcmNoKCJjcHU6Iil8fC0xIT1rLnRvTG93ZXJDYXNlKCkuc2VhcmNoKCJncHU6Iik/ITA6LTE9PWsudG9Mb3dlckNhc2UoKS5zZWFyY2goInRwdSIpfW9wVmFsaWQoayl7cmV0dXJuIDA9PWsubmFtZS5zZWFyY2goZC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKXx8IWsub3B8fGsuZGV2aWNlJiZ0aGlzLmlzTm90VHB1T3Aoay5kZXZpY2UpfHxrLmRldmljZSYmLTEhPWsuZGV2aWNlLnNlYXJjaCgiVFBVX1NZU1RFTSIpPyEwOl8uaW5jbHVkZXMoaC5XSElURUxJU1Qsay5vcCl9fWguV0hJVEVMSVNUPSJBYnMgQWNvcyBBY29zaCBBZGQgQWRkTiBBZGp1c3RDb250cmFzdHYyIEFkanVzdEh1ZSBBZGp1c3RTYXR1cmF0aW9uIEFsbCBBbmdsZSBBbnkgQXBwcm94aW1hdGVFcXVhbCBBcmdNYXggQXJnTWluIEFzaW4gQXNpbmggQXNzZXJ0IEFzc2lnbkFkZFZhcmlhYmxlT3AgQXNzaWduU3ViVmFyaWFibGVPcCBBc3NpZ25WYXJpYWJsZU9wIEF0YW4gQXRhbjIgQXRhbmggQXZnUG9vbCBBdmdQb29sM0QgQXZnUG9vbDNER3JhZCBBdmdQb29sR3JhZCBCYXRjaE1hdE11bCBCYXRjaFRvU3BhY2UgQmF0Y2hUb1NwYWNlTkQgQmlhc0FkZCBCaWFzQWRkR3JhZCBCaWFzQWRkVjEgQml0Y2FzdCBCaXR3aXNlQW5kIEJpdHdpc2VPciBCaXR3aXNlWG9yIEJyb2FkY2FzdEFyZ3MgQnJvYWRjYXN0R3JhZGllbnRBcmdzIEJ1Y2tldGl6ZSBDYXN0IENlaWwgQ2hlY2tOdW1lcmljcyBDaG9sZXNreSBDbGlwQnlWYWx1ZSBDb21wbGV4IENvbXBsZXhBYnMgQ29uY2F0IENvbmNhdE9mZnNldCBDb25jYXRWMiBDb25qIENvbmp1Z2F0ZVRyYW5zcG9zZSBDb25zdCBDb250cm9sVHJpZ2dlciBDb252MkQgQ29udjJEQmFja3Byb3BGaWx0ZXIgQ29udjJEQmFja3Byb3BJbnB1dCBDb252M0QgQ29udjNEQmFja3Byb3BGaWx0ZXJWMiBDb252M0RCYWNrcHJvcElucHV0VjIgQ29zIENvc2ggQ3Jvc3MgQ3Jvc3NSZXBsaWNhU3VtIEN1bXByb2QgQ3Vtc3VtIERlcHRoVG9TcGFjZSBEZXB0aHdpc2VDb252MmROYXRpdmUgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCBEaWFnIERpYWdQYXJ0IERpZ2FtbWEgRGl2IER5bmFtaWNTdGl0Y2ggRWx1IEVsdUdyYWQgRW1wdHkgRXF1YWwgRXJmIEVyZmMgRXhwIEV4cGFuZERpbXMgRXhwbTEgRXh0cmFjdEltYWdlUGF0Y2hlcyBGRlQgRkZUMkQgRkZUM0QgRmFrZVF1YW50V2l0aE1pbk1heEFyZ3MgRmFrZVF1YW50V2l0aE1pbk1heEFyZ3NHcmFkaWVudCBGYWtlUXVhbnRXaXRoTWluTWF4VmFycyBGYWtlUXVhbnRXaXRoTWluTWF4VmFyc0dyYWRpZW50IEZpbGwgRmxvb3IgRmxvb3JEaXYgRmxvb3JNb2QgRnVzZWRCYXRjaE5vcm0gRnVzZWRCYXRjaE5vcm1HcmFkIEZ1c2VkQmF0Y2hOb3JtR3JhZFYyIEZ1c2VkQmF0Y2hOb3JtVjIgR2F0aGVyIEdhdGhlck5kIEdhdGhlclYyIEdldEl0ZW0gR3JlYXRlciBHcmVhdGVyRXF1YWwgSFNWVG9SR0IgSUZGVCBJRkZUMkQgSUZGVDNEIElSRkZUIElSRkZUMkQgSVJGRlQzRCBJZGVudGl0eSBJZGVudGl0eU4gSWYgSW1hZyBJbmZlZWREZXF1ZXVlIEluZmVlZERlcXVldWVUdXBsZSBJbnBsYWNlQWRkIElucGxhY2VVcGRhdGUgSW52IEludmVydCBJbnZlcnRQZXJtdXRhdGlvbiBJc0Zpbml0ZSBJc0luZiBJc05hbiBMMkxvc3MgTFJOIExSTkdyYWQgTGVmdFNoaWZ0IExlc3MgTGVzc0VxdWFsIExnYW1tYSBMaW5TcGFjZSBMaXN0RGlmZiBMb2cgTG9nMXAgTG9nU29mdG1heCBMb2dpY2FsQW5kIExvZ2ljYWxOb3QgTG9naWNhbE9yIE1hdE11bCBNYXRyaXhCYW5kUGFydCBNYXRyaXhEaWFnIE1hdHJpeERpYWdQYXJ0IE1hdHJpeFNldERpYWcgTWF0cml4VHJpYW5ndWxhclNvbHZlIE1heCBNYXhQb29sIE1heFBvb2wzRCBNYXhQb29sM0RHcmFkIE1heFBvb2wzREdyYWRHcmFkIE1heFBvb2xHcmFkIE1heFBvb2xHcmFkR3JhZCBNYXhQb29sR3JhZEdyYWRWMiBNYXhQb29sR3JhZFYyIE1heFBvb2xWMiBNYXhpbXVtIE1lYW4gTWluIE1pbmltdW0gTWlycm9yUGFkIE1vZCBNdWwgTXVsdGlub21pYWwgTmVnIE5vT3AgTm9uTWF4U3VwcHJlc3Npb25WNCBOb3RFcXVhbCBPbmVIb3QgT25lc0xpa2UgT3V0ZmVlZEVucXVldWUgT3V0ZmVlZEVucXVldWVUdXBsZSBQYWNrIFBhZCBQYWRWMiBQYXJhbGxlbER5bmFtaWNTdGl0Y2ggUGxhY2Vob2xkZXJXaXRoRGVmYXVsdCBQb3cgUHJldmVudEdyYWRpZW50IFByb2QgUXIgUXVhbnRpemVBbmREZXF1YW50aXplVjIgUXVhbnRpemVBbmREZXF1YW50aXplVjMgUkZGVCBSRkZUMkQgUkZGVDNEIFJHQlRvSFNWIFJhbmRvbVNodWZmbGUgUmFuZG9tU3RhbmRhcmROb3JtYWwgUmFuZG9tVW5pZm9ybSBSYW5kb21Vbmlmb3JtSW50IFJhbmdlIFJhbmsgUmVhZFZhcmlhYmxlT3AgUmVhbCBSZWFsRGl2IFJlY2lwcm9jYWwgUmVjaXByb2NhbEdyYWQgUmVjdlRQVUVtYmVkZGluZ0FjdGl2YXRpb25zIFJlbHUgUmVsdTYgUmVsdTZHcmFkIFJlbHVHcmFkIFJlc2hhcGUgUmVzaXplQmlsaW5lYXIgUmVzaXplQmlsaW5lYXJHcmFkIFJlc291cmNlQXBwbHlBZGFNYXggUmVzb3VyY2VBcHBseUFkYWRlbHRhIFJlc291cmNlQXBwbHlBZGFncmFkIFJlc291cmNlQXBwbHlBZGFncmFkREEgUmVzb3VyY2VBcHBseUFkYW0gUmVzb3VyY2VBcHBseUFkZFNpZ24gUmVzb3VyY2VBcHBseUNlbnRlcmVkUk1TUHJvcCBSZXNvdXJjZUFwcGx5RnRybCBSZXNvdXJjZUFwcGx5RnRybFYyIFJlc291cmNlQXBwbHlHcmFkaWVudERlc2NlbnQgUmVzb3VyY2VBcHBseU1vbWVudHVtIFJlc291cmNlQXBwbHlQb3dlclNpZ24gUmVzb3VyY2VBcHBseVByb3hpbWFsQWRhZ3JhZCBSZXNvdXJjZUFwcGx5UHJveGltYWxHcmFkaWVudERlc2NlbnQgUmVzb3VyY2VBcHBseVJNU1Byb3AgUmVzb3VyY2VHYXRoZXIgUmVzb3VyY2VTY2F0dGVyQWRkIFJlc291cmNlU2NhdHRlckRpdiBSZXNvdXJjZVNjYXR0ZXJNYXggUmVzb3VyY2VTY2F0dGVyTWluIFJlc291cmNlU2NhdHRlck11bCBSZXNvdXJjZVNjYXR0ZXJOZEFkZCBSZXNvdXJjZVNjYXR0ZXJOZFVwZGF0ZSBSZXNvdXJjZVNjYXR0ZXJTdWIgUmVzb3VyY2VTY2F0dGVyVXBkYXRlIFJlc291cmNlU3RyaWRlZFNsaWNlQXNzaWduIFJldmVyc2UgUmV2ZXJzZVNlcXVlbmNlIFJldmVyc2VWMiBSaWdodFNoaWZ0IFJpbnQgUm91bmQgUnNxcnQgUnNxcnRHcmFkIFNjYXR0ZXJOZCBTZWxlY3QgU2VsdSBTZWx1R3JhZCBTZW5kVFBVRW1iZWRkaW5nR3JhZGllbnRzIFNoYXBlIFNoYXBlTiBTaWdtb2lkIFNpZ21vaWRHcmFkIFNpZ24gU2luIFNpbmggU2l6ZSBTbGljZSBTbmFwc2hvdCBTb2Z0bWF4IFNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzIFNvZnRwbHVzIFNvZnRwbHVzR3JhZCBTb2Z0c2lnbiBTb2Z0c2lnbkdyYWQgU3BhY2VUb0JhdGNoIFNwYWNlVG9CYXRjaE5EIFNwYWNlVG9EZXB0aCBTcGFyc2VNYXRNdWwgU3BhcnNlU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMgU3BhcnNlVG9EZW5zZSBTcGxpdCBTcGxpdFYgU3FydCBTcXJ0R3JhZCBTcXVhcmUgU3F1YXJlZERpZmZlcmVuY2UgU3F1ZWV6ZSBTdGFja0Nsb3NlVjIgU3RhY2tQb3BWMiBTdGFja1B1c2hWMiBTdGFja1YyIFN0YXRlbGVzc0lmIFN0YXRlbGVzc1JhbmRvbU5vcm1hbCBTdGF0ZWxlc3NSYW5kb21Vbmlmb3JtIFN0YXRlbGVzc1RydW5jYXRlZE5vcm1hbCBTdGF0ZWxlc3NXaGlsZSBTdG9wR3JhZGllbnQgU3RyaWRlZFNsaWNlIFN0cmlkZWRTbGljZUdyYWQgU3ViIFN1bSBTeW1ib2xpY0dyYWRpZW50IFRQVUVtYmVkZGluZ0FjdGl2YXRpb25zIFRhbiBUYW5oIFRhbmhHcmFkIFRlbnNvckFycmF5Q2xvc2VWMyBUZW5zb3JBcnJheUNvbmNhdFYzIFRlbnNvckFycmF5R2F0aGVyVjMgVGVuc29yQXJyYXlHcmFkVjMgVGVuc29yQXJyYXlSZWFkVjMgVGVuc29yQXJyYXlTY2F0dGVyVjMgVGVuc29yQXJyYXlTaXplVjMgVGVuc29yQXJyYXlTcGxpdFYzIFRlbnNvckFycmF5VjMgVGVuc29yQXJyYXlXcml0ZVYzIFRpbGUgVG9wS1YyIFRyYW5zcG9zZSBUcnVuY2F0ZURpdiBUcnVuY2F0ZU1vZCBUcnVuY2F0ZWROb3JtYWwgVW5wYWNrIFVuc29ydGVkU2VnbWVudE1heCBVbnNvcnRlZFNlZ21lbnRNaW4gVW5zb3J0ZWRTZWdtZW50UHJvZCBVbnNvcnRlZFNlZ21lbnRTdW0gVmFySXNJbml0aWFsaXplZE9wIFZhcmlhYmxlU2hhcGUgV2hpbGUgWGxhRHluYW1pY1VwZGF0ZVNsaWNlIFhsYUhvc3RDb21wdXRlIFhsYUlmIFhsYVJlY3YgWGxhUmVkdWNlV2luZG93IFhsYVNlbmQgWGxhU29ydCBYbGFXaGlsZSBaZXJvc0xpa2UgRW50ZXIgRXhpdCBMb29wQ29uZCBNZXJnZSBOZXh0SXRlcmF0aW9uIFN3aXRjaCBfQXJnIF9QYXJhbGxlbENvbmNhdFVwZGF0ZSBfUmV0dmFsIF9UUFVDb21waWxlIF9UUFVFeGVjdXRlIFRQVUNvbXBpbGF0aW9uUmVzdWx0IFRQVVJlcGxpY2F0ZWRJbnB1dCBUUFVSZXBsaWNhdGVkT3V0cHV0IFRQVVJlcGxpY2F0ZU1ldGFkYXRhIE1lcmdlVjJDaGVja3BvaW50cyBSZXN0b3JlVjIgU2F2ZVYyIEFib3J0IEFzc2VydCBBc3NpZ24gUGxhY2Vob2xkZXIgUGxhY2Vob2xkZXJWMiBTaGFyZGVkRmlsZW5hbWUgU3RyaW5nSm9pbiBWYXJpYWJsZSBWYXJpYWJsZVYyIFZhckhhbmRsZU9wIEF1ZGlvU3VtbWFyeSBBdWRpb1N1bW1hcnlWMiBEZWJ1Z051bWVyaWNTdW1tYXJ5IEhpc3RvZ3JhbVN1bW1hcnkgSW1hZ2VTdW1tYXJ5IE1lcmdlU3VtbWFyeSBTY2FsYXJTdW1tYXJ5IFN0YXRzQWdncmVnYXRvclN1bW1hcnkiLnNwbGl0KCIgIik7CmYuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyPWg7Zi5jaGVja09wc0ZvckNvbXBhdGliaWxpdHk9ZnVuY3Rpb24oayx0KXtpZihudWxsPT09dCl0aHJvdyBFcnJvcigiQ29tcGF0aWJpbGl0eSBwcm92aWRlciByZXF1aXJlZCwgYnV0IGdvdDogIit0KTtfLmVhY2goay5ub2RlcyxsPT57bC5jb21wYXRpYmxlPXQub3BWYWxpZChsKTtfLmVhY2gobC5pbkVtYmVkZGluZ3MscD0+e3AuY29tcGF0aWJsZT10Lm9wVmFsaWQocCl9KTtfLmVhY2gobC5vdXRFbWJlZGRpbmdzLHA9PntwLmNvbXBhdGlibGU9dC5vcFZhbGlkKHApfSl9KX19KShkLm9wfHwoZC5vcD17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vcGFyc2VyLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgodSl7aWYoInRydWUiPT09dSlyZXR1cm4hMDtpZigiZmFsc2UiPT09dSlyZXR1cm4hMTtpZignIic9PT11WzBdKXJldHVybiB1LnN1YnN0cmluZygxLHUubGVuZ3RoLTEpO2xldCB4PXBhcnNlRmxvYXQodSk7cmV0dXJuIGlzTmFOKHgpP3U6eH1mdW5jdGlvbiBrKHUpe3JldHVybiBuZXcgUHJvbWlzZSgoeCxBKT0+e2ZldGNoKHUpLnRoZW4oeT0+e3kub2s/eS5hcnJheUJ1ZmZlcigpLnRoZW4oeCxBKTp5LnRleHQoKS50aGVuKEEsQSl9KX0pfWZ1bmN0aW9uIHQodSx4LEE9MUU2LHk9IlxuIil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHcsQyl7ZnVuY3Rpb24gRihELEIsSSl7dmFyIE49ST49dS5ieXRlTGVuZ3RoO0I9Qi5zcGxpdCh5KTtCWzBdPUQrQlswXTtjb25zdCBPPU4/IiI6Qi5wb3AoKTtmb3IobGV0IEggb2YgQil0cnl7eChIKX1jYXRjaChLKXtDKEspO3JldHVybn1OP3coITApOgooRD1uZXcgQmxvYihbdS5zbGljZShJLEkrQSldKSxOPW5ldyBGaWxlUmVhZGVyLE4ub25sb2FkPWZ1bmN0aW9uKEgpe0YoTyxILnRhcmdldC5yZXN1bHQsSStBKX0sTi5yZWFkQXNUZXh0KEQpKX1GKCIiLCIiLDApfSl9ZnVuY3Rpb24gbCh1KXtyZXR1cm4gbSh1LG4pfWZ1bmN0aW9uIHAodSl7cmV0dXJuIG0odSxxKS50aGVuKHg9Pnguc3RlcF9zdGF0cyl9ZnVuY3Rpb24gbSh1LHgpe2Z1bmN0aW9uIEEoQil7bGV0IEk9Qi5pbmRleE9mKCI6IiksTj1CLnN1YnN0cmluZygwLEkpLnRyaW0oKTtCPWgoQi5zdWJzdHJpbmcoSSsyKS50cmltKCkpO3JldHVybntuYW1lOk4sdmFsdWU6Qn19ZnVuY3Rpb24geShCLEksTixPKXtsZXQgSD1CW0ldO251bGw9PUg/QltJXT1PLmpvaW4oIi4iKWluIHg/W05dOk46QXJyYXkuaXNBcnJheShIKT9ILnB1c2goTik6QltJXT1bSCxOXX1sZXQgdz17fSxDPVtdLEY9W10sRD13O3JldHVybiB0KHUsZnVuY3Rpb24oQil7aWYoQilzd2l0Y2goQj1CLnRyaW0oKSwKQltCLmxlbmd0aC0xXSl7Y2FzZSAieyI6Qj1CLnN1YnN0cmluZygwLEIubGVuZ3RoLTIpLnRyaW0oKTtsZXQgST17fTtDLnB1c2goRCk7Ri5wdXNoKEIpO3koRCxCLEksRik7RD1JO2JyZWFrO2Nhc2UgIn0iOkQ9Qy5wb3AoKTtGLnBvcCgpO2JyZWFrO2RlZmF1bHQ6Qj1BKEIpLHkoRCxCLm5hbWUsQi52YWx1ZSxGLmNvbmNhdChCLm5hbWUpKX19KS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHd9KX1mLmZldGNoUGJUeHQ9aztmLmZldGNoQW5kUGFyc2VNZXRhZGF0YT1mdW5jdGlvbih1LHgpe3JldHVybiBiLmdyYXBoLnV0aWwucnVuVGFzaygoKT0+bnVsbD09dT9Qcm9taXNlLnJlc29sdmUobnVsbCk6ayh1KSx4KS50aGVuKEE9PmIuZ3JhcGgudXRpbC5ydW5Bc3luY1Byb21pc2VUYXNrKCJQYXJzaW5nIG1ldGFkYXRhLnBidHh0Iiw2MCwoKT0+bnVsbCE9QT9wKEEpOlByb21pc2UucmVzb2x2ZShudWxsKSx4KSl9O2YuZmV0Y2hBbmRQYXJzZUdyYXBoRGF0YT1mdW5jdGlvbih1LHgsQSl7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5Bc3luY1Byb21pc2VUYXNrKCJSZWFkaW5nIGdyYXBoIHBidHh0IiwKNDAsKCk9Png/bmV3IFByb21pc2UoZnVuY3Rpb24oeSx3KXtsZXQgQz1uZXcgRmlsZVJlYWRlcjtDLm9ubG9hZD0oKT0+eShDLnJlc3VsdCk7Qy5vbmVycm9yPSgpPT53KEMuZXJyb3IpO0MucmVhZEFzQXJyYXlCdWZmZXIoeCl9KTprKHUpLEEpLnRoZW4oeT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlBhcnNpbmcgZ3JhcGgucGJ0eHQiLDYwLCgpPT5sKHkpLEEpKX07Zi5zdHJlYW1QYXJzZT10O2NvbnN0IG49eyJsaWJyYXJ5LmZ1bmN0aW9uIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZiI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuaW5wdXQiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5iIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuZiI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmZ1bmMiOiEwLAoibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuaSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnMiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5zaGFwZSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnRlbnNvciI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnR5cGUiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUuc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5zaWduYXR1cmUuaW5wdXRfYXJnIjohMCwKImxpYnJhcnkuZnVuY3Rpb24uc2lnbmF0dXJlLm91dHB1dF9hcmciOiEwLCJsaWJyYXJ5LnZlcnNpb25zIjohMCxub2RlOiEwLCJub2RlLmlucHV0IjohMCwibm9kZS5hdHRyIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuYiI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmYiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5mdW5jIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuaSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnMiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5zaGFwZSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnRlbnNvciI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnR5cGUiOiEwLCJub2RlLmF0dHIudmFsdWUuc2hhcGUuZGltIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltIjohMH0scT17InN0ZXBfc3RhdHMuZGV2X3N0YXRzIjohMCwKInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm91dHB1dCI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMubWVtb3J5IjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5vdXRwdXQudGVuc29yX2Rlc2NyaXB0aW9uLnNoYXBlLmRpbSI6ITB9O2YucGFyc2VHcmFwaFBiVHh0PWw7Zi5wYXJzZVN0YXRzUGJUeHQ9cH0pKGQucGFyc2VyfHwoZC5wYXJzZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3Byb3RvLmpzCgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3JlbmRlci5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKEwsUSxULFgsYWEpe1E9bmV3IEkoUSxULFgsYWEsITApO0wuaW5Bbm5vdGF0aW9ucy5wdXNoKFEpfWZ1bmN0aW9uIGsoTCxRLFQsWCxhYSl7UT1uZXcgSShRLFQsWCxhYSwhMSk7TC5vdXRBbm5vdGF0aW9ucy5wdXNoKFEpfWZ1bmN0aW9uIHQoTCxRKXtfLmVhY2goTC5ub2RlcygpLFQ9PntUPUwubm9kZShUKTtULmV4cGFuZGVkPTE8UTtpZigwPFEpc3dpdGNoKFQubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuTUVUQTpjYXNlIGQuTm9kZVR5cGUuU0VSSUVTOmwoVCxRLTEpfX0pfWZ1bmN0aW9uIGwoTCxRKXtMLmNvcmVHcmFwaCYmdChMLmNvcmVHcmFwaCxRKX1mdW5jdGlvbiBwKEwsUSxUKXtsZXQgWD1MLm5vZGUoUSksYWE9TC5ub2RlKFQpLGxhPUwuZWRnZShRLFQpO2lmKFgubm9kZS5pbmNsdWRlIT09ZC5JbmNsdXNpb25UeXBlLklOQ0xVREUmJmFhLm5vZGUuaW5jbHVkZSE9PWQuSW5jbHVzaW9uVHlwZS5JTkNMVURFfHwKWC5ub2RlLmluY2x1ZGU9PT1kLkluY2x1c2lvblR5cGUuRVhDTFVERXx8YWEubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUpayhYLGFhLm5vZGUsYWEsbGEsTi5TSE9SVENVVCksaChhYSxYLm5vZGUsWCxsYSxOLlNIT1JUQ1VUKSxMLnJlbW92ZUVkZ2UoUSxUKX1mdW5jdGlvbiBtKEwsUSxUKXtsZXQgWD1MLmNvcmVHcmFwaCxhYT1YLm5vZGUoUSk7YWEuaXNPdXRFeHRyYWN0PSEwO18uZWFjaChYLnByZWRlY2Vzc29ycyhRKSxsYT0+e3AoWCxsYSxRKX0pOyhGLmRldGFjaEFsbEVkZ2VzRm9ySGlnaERlZ3JlZXx8VCkmJl8uZWFjaChYLnN1Y2Nlc3NvcnMoUSksbGE9PntwKFgsUSxsYSl9KTswPT09WC5uZWlnaGJvcnMoUSkubGVuZ3RoJiYoYWEubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLEwuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2goYWEpLFgucmVtb3ZlTm9kZShRKSl9ZnVuY3Rpb24gbihMLFEsVCl7bGV0IFg9TC5jb3JlR3JhcGgsYWE9Clgubm9kZShRKTthYS5pc0luRXh0cmFjdD0hMDtfLmVhY2goWC5zdWNjZXNzb3JzKFEpLGxhPT57cChYLFEsbGEpfSk7KEYuZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlfHxUKSYmXy5lYWNoKFgucHJlZGVjZXNzb3JzKFEpLGxhPT57cChYLGxhLFEpfSk7MD09PVgubmVpZ2hib3JzKFEpLmxlbmd0aCYmKGFhLm5vZGUuaW5jbHVkZT1kLkluY2x1c2lvblR5cGUuRVhDTFVERSxMLmlzb2xhdGVkSW5FeHRyYWN0LnB1c2goYWEpLFgucmVtb3ZlTm9kZShRKSl9ZnVuY3Rpb24gcShMLFEpe2lmKEwudHlwZT09PWQuTm9kZVR5cGUuT1ApZm9yKHZhciBUPTA7VDxRLmxlbmd0aDtUKyspe2lmKEwub3A9PT1RW1RdKXJldHVybiEwfWVsc2UgaWYoTC50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBJiYoTD1MLmdldFJvb3RPcCgpKSlmb3IoVD0wO1Q8US5sZW5ndGg7VCsrKWlmKEwub3A9PT1RW1RdKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHUoTCl7bGV0IFE9TC5jb3JlR3JhcGg7Xy5lYWNoKFEubm9kZXMoKSwKVD0+e1Eubm9kZShUKS5ub2RlLmluY2x1ZGUhPT1kLkluY2x1c2lvblR5cGUuRVhDTFVERXx8VC5zdGFydHNXaXRoKGIuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCl8fChMLmNvcmVHcmFwaC5vdXRFZGdlcyhUKS5sZW5ndGg+TC5jb3JlR3JhcGguaW5FZGdlcyhUKS5sZW5ndGg/bShMLFQsITApOm4oTCxULCEwKSl9KX1mdW5jdGlvbiB4KEwpe2xldCBRPUwuY29yZUdyYXBoO18uZWFjaChRLm5vZGVzKCksVD0+e2xldCBYPVEubm9kZShUKTtYLm5vZGUuaW5jbHVkZT09PWQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCYmcShYLm5vZGUsRi5vdXRFeHRyYWN0VHlwZXMpJiZtKEwsVCl9KX1mdW5jdGlvbiBBKEwpe2xldCBRPUwuY29yZUdyYXBoO18uZWFjaChRLm5vZGVzKCksVD0+e2xldCBYPVEubm9kZShUKTtYLm5vZGUuaW5jbHVkZT09PWQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCYmcShYLm5vZGUsRi5pbkV4dHJhY3RUeXBlcykmJm4oTCxUKX0pfWZ1bmN0aW9uIHkoTCl7bGV0IFE9CkwuY29yZUdyYXBoLFQ9e30sWD17fSxhYT0wO18uZWFjaChRLm5vZGVzKCksa2E9PntpZihRLm5vZGUoa2EpLm5vZGUuaW5jbHVkZT09PWQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCl7dmFyIFk9Xy5yZWR1Y2UoUS5wcmVkZWNlc3NvcnMoa2EpLCh2YSx4YSk9Pnt4YT1RLmVkZ2UoeGEsa2EpLm1ldGFlZGdlO3JldHVybiB2YSsoeGEubnVtUmVndWxhckVkZ2VzPzE6MCl9LDApOzA9PT1ZJiYwPFEucHJlZGVjZXNzb3JzKGthKS5sZW5ndGgmJihZPVEucHJlZGVjZXNzb3JzKGthKS5sZW5ndGgpO3ZhciBFYT1fLnJlZHVjZShRLnN1Y2Nlc3NvcnMoa2EpLCh2YSx4YSk9Pnt4YT1RLmVkZ2Uoa2EseGEpLm1ldGFlZGdlO3JldHVybiB2YSsoeGEubnVtUmVndWxhckVkZ2VzPzE6MCl9LDApOzA9PT1FYSYmMDxRLnN1Y2Nlc3NvcnMoa2EpLmxlbmd0aCYmKEVhPVEuc3VjY2Vzc29ycyhrYSkubGVuZ3RoKTtUW2thXT1ZO1hba2FdPUVhO2FhKyt9fSk7aWYoIShhYTxGLm1pbk5vZGVDb3VudEZvckV4dHJhY3Rpb24pKXt2YXIgbGE9CkYubWluRGVncmVlRm9yRXh0cmFjdGlvbi0xLFo9TWF0aC5yb3VuZCguNzUqYWEpLGJhPU1hdGgucm91bmQoLjI1KmFhKSxlYT1PYmplY3Qua2V5cyhUKS5zb3J0KChrYSxZKT0+VFtrYV0tVFtZXSksY2E9VFtlYVtaXV07Y2E9Y2ErY2EtVFtlYVtiYV1dO2NhPU1hdGgubWF4KGNhLGxhKTtmb3IobGV0IGthPWFhLTE7VFtlYVtrYV1dPmNhO2thLS0pbihMLGVhW2thXSk7ZWE9T2JqZWN0LmtleXMoWCkuc29ydCgoa2EsWSk9Plhba2FdLVhbWV0pO1o9WFtlYVtaXV07YmE9Wis0KihaLVhbZWFbYmFdXSk7YmE9TWF0aC5tYXgoYmEsbGEpO2ZvcihsYT1hYS0xO1hbZWFbbGFdXT5iYTtsYS0tKShaPVEubm9kZShlYVtsYV0pKSYmIVouaXNJbkV4dHJhY3QmJm0oTCxlYVtsYV0pfX1mdW5jdGlvbiB3KEwpe2xldCBRPUwuY29yZUdyYXBoLFQ9e307Xy5lYWNoKFEuZWRnZXMoKSxYPT57US5lZGdlKFgpLm1ldGFlZGdlLm51bVJlZ3VsYXJFZGdlc3x8KChUW1gudl09VFtYLnZdfHxbXSkucHVzaChYKSwKKFRbWC53XT1UW1gud118fFtdKS5wdXNoKFgpKX0pO18uZWFjaChULFg9PntYLmxlbmd0aD5GLm1heENvbnRyb2xEZWdyZWUmJl8uZWFjaChYLGFhPT5wKFEsYWEudixhYS53KSl9KX1mdW5jdGlvbiBDKEwpe3UoTCk7Ri5vdXRFeHRyYWN0VHlwZXMmJngoTCk7Ri5pbkV4dHJhY3RUeXBlcyYmQShMKTt5KEwpO0YubWF4Q29udHJvbERlZ3JlZSYmdyhMKTtsZXQgUT1MLmNvcmVHcmFwaDtfLmVhY2goUS5ub2RlcygpLFQ9PntsZXQgWD1RLm5vZGUoVCk7dmFyIGFhPVEubmVpZ2hib3JzKFQpLmxlbmd0aDtpZihYLm5vZGUuaW5jbHVkZT09PWQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCYmMD09PWFhKXthYT0wPFgub3V0QW5ub3RhdGlvbnMubGlzdC5sZW5ndGg7bGV0IGxhPTA8WC5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoO1guaXNJbkV4dHJhY3Q/KEwuaXNvbGF0ZWRJbkV4dHJhY3QucHVzaChYKSxYLm5vZGUuaW5jbHVkZT1kLkluY2x1c2lvblR5cGUuRVhDTFVERSxRLnJlbW92ZU5vZGUoVCkpOgpYLmlzT3V0RXh0cmFjdD8oTC5pc29sYXRlZE91dEV4dHJhY3QucHVzaChYKSxYLm5vZGUuaW5jbHVkZT1kLkluY2x1c2lvblR5cGUuRVhDTFVERSxRLnJlbW92ZU5vZGUoVCkpOkYuZXh0cmFjdElzb2xhdGVkTm9kZXNXaXRoQW5ub3RhdGlvbnNPbk9uZVNpZGUmJihhYSYmIWxhPyhYLmlzSW5FeHRyYWN0PSEwLEwuaXNvbGF0ZWRJbkV4dHJhY3QucHVzaChYKSxYLm5vZGUuaW5jbHVkZT1kLkluY2x1c2lvblR5cGUuRVhDTFVERSxRLnJlbW92ZU5vZGUoVCkpOmxhJiYhYWEmJihYLmlzT3V0RXh0cmFjdD0hMCxMLmlzb2xhdGVkT3V0RXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSkpfX0pfWYuT3BOb2RlQ29sb3JzPXtERUZBVUxUX0ZJTEw6IiNmZmZmZmYiLERFRkFVTFRfU1RST0tFOiIjYjJiMmIyIixDT01QQVRJQkxFOiIjMGY5ZDU4IixJTkNPTVBBVElCTEU6IiNkYjQ0MzcifTtmLk1ldGFub2RlQ29sb3JzPQp7REVGQVVMVF9GSUxMOiIjZDlkOWQ5IixERUZBVUxUX1NUUk9LRToiI2E2YTZhNiIsU0FUVVJBVElPTjouNixMSUdIVE5FU1M6Ljg1LEVYUEFOREVEX0NPTE9SOiIjZjBmMGYwIixIVUVTOlsyMjAsMTAwLDE4MCw0MCwyMCwzNDAsMjYwLDMwMCwxNDAsNjBdLFNUUlVDVFVSRV9QQUxFVFRFKEwsUSl7dmFyIFQ9Zi5NZXRhbm9kZUNvbG9ycy5IVUVTO0w9VFtMJVQubGVuZ3RoXTtUPU1hdGguc2luKEwqTWF0aC5QSS8zNjApO3JldHVybiBkMy5oc2woTCwuMDEqKFE/MzA6OTAtNjAqVCksLjAxKihRPzk1OjgwKSkudG9TdHJpbmcoKX0sREVWSUNFX1BBTEVUVEUoTCl7cmV0dXJuIGYuTWV0YW5vZGVDb2xvcnMuU1RSVUNUVVJFX1BBTEVUVEUoTCl9LFhMQV9DTFVTVEVSX1BBTEVUVEUoTCl7cmV0dXJuIGYuTWV0YW5vZGVDb2xvcnMuU1RSVUNUVVJFX1BBTEVUVEUoTCl9LFVOS05PV046IiNlZWUiLEdSQURJRU5UX09VVExJTkU6IiM4ODgifTtmLlNlcmllc05vZGVDb2xvcnM9e0RFRkFVTFRfRklMTDoid2hpdGUiLApERUZBVUxUX1NUUk9LRToiI2IyYjJiMiJ9O2NvbnN0IEY9e2VuYWJsZUV4dHJhY3Rpb246ITAsbWluTm9kZUNvdW50Rm9yRXh0cmFjdGlvbjoxNSxtaW5EZWdyZWVGb3JFeHRyYWN0aW9uOjUsbWF4Q29udHJvbERlZ3JlZTo0LG1heEJyaWRnZVBhdGhEZWdyZWU6NCxvdXRFeHRyYWN0VHlwZXM6WyJOb09wIl0saW5FeHRyYWN0VHlwZXM6W10sZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlOiEwLGV4dHJhY3RJc29sYXRlZE5vZGVzV2l0aEFubm90YXRpb25zT25PbmVTaWRlOiEwLGVuYWJsZUJyaWRnZWdyYXBoOiEwLG1pbk1heENvbG9yczpbIiNmZmY1ZjAiLCIjZmI2YTRhIl0sbWF4QW5ub3RhdGlvbnM6NX0sRD1uZXcgUmVnRXhwKCJeKD86IitiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgrIik/KFxcdyspX1thLXowLTldezh9KD86X1xcZCspPyQiKTtjbGFzcyBCe2NvbnN0cnVjdG9yKEwsUSl7dGhpcy5oaWVyYXJjaHk9TDt0aGlzLmRpc3BsYXlpbmdTdGF0cz0KUTt0aGlzLmluZGV4PXt9O3RoaXMucmVuZGVyZWRPcE5hbWVzPVtdO3RoaXMuY29tcHV0ZVNjYWxlcygpO3RoaXMuaGFzU3ViaGllcmFyY2h5PXt9O3RoaXMucm9vdD1uZXcgTShMLnJvb3QsTC5ncmFwaE9wdGlvbnMpO3RoaXMuaW5kZXhbTC5yb290Lm5hbWVdPXRoaXMucm9vdDt0aGlzLnJlbmRlcmVkT3BOYW1lcy5wdXNoKEwucm9vdC5uYW1lKTt0aGlzLmJ1aWxkU3ViaGllcmFyY2h5KEwucm9vdC5uYW1lKTt0aGlzLnJvb3QuZXhwYW5kZWQ9ITA7dGhpcy50cmFjZUlucHV0cz0hMX1jb21wdXRlU2NhbGVzKCl7dGhpcy5kZXZpY2VDb2xvck1hcD1kMy5zY2FsZU9yZGluYWwoKS5kb21haW4odGhpcy5oaWVyYXJjaHkuZGV2aWNlcykucmFuZ2UoXy5tYXAoZDMucmFuZ2UodGhpcy5oaWVyYXJjaHkuZGV2aWNlcy5sZW5ndGgpLGYuTWV0YW5vZGVDb2xvcnMuREVWSUNFX1BBTEVUVEUpKTt0aGlzLnhsYUNsdXN0ZXJDb2xvck1hcD1kMy5zY2FsZU9yZGluYWwoKS5kb21haW4odGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMpLnJhbmdlKF8ubWFwKGQzLnJhbmdlKHRoaXMuaGllcmFyY2h5LnhsYUNsdXN0ZXJzLmxlbmd0aCksCmYuTWV0YW5vZGVDb2xvcnMuWExBX0NMVVNURVJfUEFMRVRURSkpO2xldCBMPXRoaXMuaGllcmFyY2h5LnJvb3QubWV0YWdyYXBoO3ZhciBRPWQzLm1heChMLm5vZGVzKCksVD0+e1Q9TC5ub2RlKFQpO2lmKG51bGwhPVQuc3RhdHMpcmV0dXJuIFQuc3RhdHMudG90YWxCeXRlc30pO3RoaXMubWVtb3J5VXNhZ2VTY2FsZT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCxRXSkucmFuZ2UoRi5taW5NYXhDb2xvcnMpO1E9ZDMubWF4KEwubm9kZXMoKSxUPT57VD1MLm5vZGUoVCk7aWYobnVsbCE9VC5zdGF0cylyZXR1cm4gVC5zdGF0cy5nZXRUb3RhbE1pY3JvcygpfSk7dGhpcy5jb21wdXRlVGltZVNjYWxlPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLFFdKS5yYW5nZShGLm1pbk1heENvbG9ycyk7dGhpcy5lZGdlV2lkdGhTaXplZEJhc2VkU2NhbGU9dGhpcy5oaWVyYXJjaHkuaGFzU2hhcGVJbmZvP2Quc2NlbmUuZWRnZS5FREdFX1dJRFRIX1NJWkVfQkFTRURfU0NBTEU6ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzEsCnRoaXMuaGllcmFyY2h5Lm1heE1ldGFFZGdlU2l6ZV0pLnJhbmdlKFtkLnNjZW5lLmVkZ2UuTUlOX0VER0VfV0lEVEgsZC5zY2VuZS5lZGdlLk1BWF9FREdFX1dJRFRIXSl9Z2V0UmVuZGVyTm9kZUJ5TmFtZShMKXtyZXR1cm4gdGhpcy5pbmRleFtMXX1nZXROb2RlQnlOYW1lKEwpe3JldHVybiB0aGlzLmhpZXJhcmNoeS5ub2RlKEwpfWNvbG9ySGlzdG9ncmFtKEwsUSl7aWYoMDxPYmplY3Qua2V5cyhMKS5sZW5ndGgpe2NvbnN0IFQ9Xy5zdW0oT2JqZWN0LmtleXMoTCkubWFwKFg9PkxbWF0pKTtyZXR1cm4gT2JqZWN0LmtleXMoTCkubWFwKFg9Pih7Y29sb3I6UShYKSxwcm9wb3J0aW9uOkxbWF0vVH0pKX1jb25zb2xlLmluZm8oIm5vIHBhaXJzIGZvdW5kISIpO3JldHVybiBudWxsfWdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZShMKXtpZighTClyZXR1cm4gbnVsbDtpZihMIGluIHRoaXMuaW5kZXgpcmV0dXJuIHRoaXMuaW5kZXhbTF07dmFyIFE9dGhpcy5oaWVyYXJjaHkubm9kZShMKTsKaWYoIVEpcmV0dXJuIG51bGw7bGV0IFQ9US5pc0dyb3VwTm9kZT9uZXcgTShRLHRoaXMuaGllcmFyY2h5LmdyYXBoT3B0aW9ucyk6bmV3IEgoUSk7dGhpcy5pbmRleFtMXT1UO3RoaXMucmVuZGVyZWRPcE5hbWVzLnB1c2goTCk7US5zdGF0cyYmKFQubWVtb3J5Q29sb3I9dGhpcy5tZW1vcnlVc2FnZVNjYWxlKFEuc3RhdHMudG90YWxCeXRlcyksVC5jb21wdXRlVGltZUNvbG9yPXRoaXMuY29tcHV0ZVRpbWVTY2FsZShRLnN0YXRzLmdldFRvdGFsTWljcm9zKCkpKTtULmlzRmFkZWRPdXQ9dGhpcy5kaXNwbGF5aW5nU3RhdHMmJiFiLmdyYXBoLnV0aWwuaGFzRGlzcGxheWFibGVOb2RlU3RhdHMoUS5zdGF0cyk7dmFyIFg9bnVsbCxhYT1udWxsLGxhPW51bGw7aWYoUS5pc0dyb3VwTm9kZSl7WD1RLmRldmljZUhpc3RvZ3JhbTthYT1RLnhsYUNsdXN0ZXJIaXN0b2dyYW07dmFyIFo9US5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU7UT1RLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlOwppZigwIT1afHwwIT1RKWxhPVovKForUSl9ZWxzZShaPVQubm9kZS5kZXZpY2UpJiYoWD17W1pdOjF9KSwoWj1ULm5vZGUueGxhQ2x1c3RlcikmJihhYT17W1pdOjF9KSxULm5vZGUudHlwZT09PWQuTm9kZVR5cGUuT1AmJihsYT1ULm5vZGUuY29tcGF0aWJsZT8xOjApO1gmJihULmRldmljZUNvbG9ycz10aGlzLmNvbG9ySGlzdG9ncmFtKFgsdGhpcy5kZXZpY2VDb2xvck1hcCkpO2FhJiYoVC54bGFDbHVzdGVyQ29sb3JzPXRoaXMuY29sb3JIaXN0b2dyYW0oYWEsdGhpcy54bGFDbHVzdGVyQ29sb3JNYXApKTtudWxsIT1sYSYmKFQuY29tcGF0aWJpbGl0eUNvbG9ycz1be2NvbG9yOmIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5DT01QQVRJQkxFLHByb3BvcnRpb246bGF9LHtjb2xvcjpiLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuSU5DT01QQVRJQkxFLHByb3BvcnRpb246MS1sYX1dKTtyZXR1cm4gdGhpcy5pbmRleFtMXX1nZXROZWFyZXN0VmlzaWJsZUFuY2VzdG9yKEwpe3ZhciBRPQpkLmdldEhpZXJhcmNoaWNhbFBhdGgoTCk7bGV0IFQ9MCxYPW51bGw7Zm9yKDtUPFEubGVuZ3RoJiYoTD1RW1RdLFg9dGhpcy5nZXRSZW5kZXJOb2RlQnlOYW1lKEwpLFguZXhwYW5kZWQpO1QrKyk7cmV0dXJuIFQ9PVEubGVuZ3RoLTImJihRPVFbVCsxXSxYLmluQW5ub3RhdGlvbnMubm9kZU5hbWVzW1FdfHxYLm91dEFubm90YXRpb25zLm5vZGVOYW1lc1tRXSk/UTpMfXNldERlcHRoKEwpe2wodGhpcy5yb290LCtMKX1pc05vZGVBdXhpbGlhcnkoTCl7bGV0IFE9dGhpcy5nZXRSZW5kZXJOb2RlQnlOYW1lKEwubm9kZS5wYXJlbnROb2RlLm5hbWUpLFQ9Xy5maW5kKFEuaXNvbGF0ZWRJbkV4dHJhY3QsWD0+WC5ub2RlLm5hbWU9PT1MLm5vZGUubmFtZSk7aWYoVClyZXR1cm4hMDtUPV8uZmluZChRLmlzb2xhdGVkT3V0RXh0cmFjdCxYPT5YLm5vZGUubmFtZT09PUwubm9kZS5uYW1lKTtyZXR1cm4hIVR9Z2V0TmFtZXNPZlJlbmRlcmVkT3BzKCl7cmV0dXJuIHRoaXMucmVuZGVyZWRPcE5hbWVzfWNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUoTCwKUSxULFgpe3ZhciBhYT1ULm5hbWUucmVwbGFjZShRLFgpO2xldCBsYT1MLm1ldGFncmFwaC5ub2RlKGFhKTtpZihsYSlyZXR1cm4gbGE7bGE9bmV3IGQuT3BOb2RlSW1wbCh7bmFtZTphYSxpbnB1dDpbXSxkZXZpY2U6VC5kZXZpY2Usb3A6VC5vcCxhdHRyOl8uY2xvbmVEZWVwKFQuYXR0cil9KTtsYS5jYXJkaW5hbGl0eT1ULmNhcmRpbmFsaXR5O2xhLmluY2x1ZGU9VC5pbmNsdWRlO2xhLm91dHB1dFNoYXBlcz1fLmNsb25lRGVlcChULm91dHB1dFNoYXBlcyk7bGEueGxhQ2x1c3Rlcj1ULnhsYUNsdXN0ZXI7bGEuZnVuY3Rpb25JbnB1dEluZGV4PVQuZnVuY3Rpb25JbnB1dEluZGV4O2xhLmZ1bmN0aW9uT3V0cHV0SW5kZXg9VC5mdW5jdGlvbk91dHB1dEluZGV4O2xhLmlucHV0cz1ULmlucHV0cy5tYXAoWj0+e2NvbnN0IGJhPV8uY2xvbmUoWik7YmEubmFtZT1aLm5hbWUucmVwbGFjZShRLFgpO3JldHVybiBiYX0pO2xhLnBhcmVudE5vZGU9TDtMLm1ldGFncmFwaC5zZXROb2RlKGxhLm5hbWUsCmxhKTt0aGlzLmhpZXJhcmNoeS5zZXROb2RlKGxhLm5hbWUsbGEpO2FhPVo9PnRoaXMuY2xvbmVBbmRBZGRGdW5jdGlvbk9wTm9kZShMLFEsWixYKTtsYS5pbkVtYmVkZGluZ3M9VC5pbkVtYmVkZGluZ3MubWFwKGFhKTtsYS5vdXRFbWJlZGRpbmdzPVQub3V0RW1iZWRkaW5ncy5tYXAoYWEpO3JldHVybiBsYX1jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlKEwsUSxULFgsYWEpe2NvbnN0IGxhPXt9O0w9dGhpcy5jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKEwsUSxULFgsYWEsbGEpO18uaXNFbXB0eShsYSl8fHRoaXMucGF0Y2hFZGdlc0Zyb21GdW5jdGlvbk91dHB1dHMoUSxsYSk7cmV0dXJuIEx9Y2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZUhlbHBlcihMLFEsVCxYLGFhLGxhKXtjb25zdCBaPWIuZ3JhcGguY3JlYXRlTWV0YW5vZGUoVC5uYW1lLnJlcGxhY2UoWCxhYSkpO1ouZGVwdGg9VC5kZXB0aDtaLmNhcmRpbmFsaXR5PVQuY2FyZGluYWxpdHk7Wi50ZW1wbGF0ZUlkPQpULnRlbXBsYXRlSWQ7Wi5vcEhpc3RvZ3JhbT1fLmNsb25lKFQub3BIaXN0b2dyYW0pO1ouZGV2aWNlSGlzdG9ncmFtPV8uY2xvbmUoVC5kZXZpY2VIaXN0b2dyYW0pO1oueGxhQ2x1c3Rlckhpc3RvZ3JhbT1fLmNsb25lKFQueGxhQ2x1c3Rlckhpc3RvZ3JhbSk7Wi5oYXNOb25Db250cm9sRWRnZXM9VC5oYXNOb25Db250cm9sRWRnZXM7Wi5pbmNsdWRlPVQuaW5jbHVkZTtaLm5vZGVBdHRyaWJ1dGVzPV8uY2xvbmUoVC5ub2RlQXR0cmlidXRlcyk7Wi5hc3NvY2lhdGVkRnVuY3Rpb249VC5hc3NvY2lhdGVkRnVuY3Rpb247Xy5lYWNoKFQubWV0YWdyYXBoLm5vZGVzKCksYmE9PntiYT1ULm1ldGFncmFwaC5ub2RlKGJhKTtzd2l0Y2goYmEudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk1FVEE6YmE9dGhpcy5jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKEwsUSxiYSxYLGFhLGxhKTtiYS5wYXJlbnROb2RlPVo7Wi5tZXRhZ3JhcGguc2V0Tm9kZShiYS5uYW1lLGJhKTt0aGlzLmhpZXJhcmNoeS5zZXROb2RlKGJhLm5hbWUsCmJhKTticmVhaztjYXNlIGQuTm9kZVR5cGUuT1A6YmE9dGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKFosWCxiYSxhYSk7Xy5pc051bWJlcihiYS5mdW5jdGlvbklucHV0SW5kZXgpJiZ0aGlzLnBhdGNoRWRnZXNJbnRvRnVuY3Rpb25JbnB1dHMoUSxiYSk7Xy5pc051bWJlcihiYS5mdW5jdGlvbk91dHB1dEluZGV4KSYmKGxhW2JhLmZ1bmN0aW9uT3V0cHV0SW5kZXhdPWJhKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybihiYS5uYW1lKyIgaXMgb2RkbHkgbmVpdGhlciBhIG1ldGFub2RlIG5vciBhbiBvcG5vZGUuIil9fSk7dGhpcy5jbG9uZUxpYnJhcnlNZXRhbm9kZUVkZ2VzKFQsWixYLGFhKTtyZXR1cm4gWn1jbG9uZUxpYnJhcnlNZXRhbm9kZUVkZ2VzKEwsUSxULFgpe18uZWFjaChMLm1ldGFncmFwaC5lZGdlcygpLGFhPT57YWE9TC5tZXRhZ3JhcGguZWRnZShhYSk7Y29uc3QgbGE9YWEudi5yZXBsYWNlKFQsWCksWj1hYS53LnJlcGxhY2UoVCxYKSxiYT1uZXcgZC5NZXRhZWRnZUltcGwobGEsClopO2JhLmluYm91bmQ9YWEuaW5ib3VuZDtiYS5udW1SZWd1bGFyRWRnZXM9YWEubnVtUmVndWxhckVkZ2VzO2JhLm51bUNvbnRyb2xFZGdlcz1hYS5udW1Db250cm9sRWRnZXM7YmEubnVtUmVmRWRnZXM9YWEubnVtUmVmRWRnZXM7YmEudG90YWxTaXplPWFhLnRvdGFsU2l6ZTthYS5iYXNlRWRnZUxpc3QmJihiYS5iYXNlRWRnZUxpc3Q9YWEuYmFzZUVkZ2VMaXN0Lm1hcChlYT0+e2NvbnN0IGNhPV8uY2xvbmUoZWEpO2NhLnY9ZWEudi5yZXBsYWNlKFQsWCk7Y2Eudz1lYS53LnJlcGxhY2UoVCxYKTtyZXR1cm4gY2F9KSk7US5tZXRhZ3JhcGgubm9kZShaKT9RLm1ldGFncmFwaC5zZXRFZGdlKGxhLFosYmEpOlEubWV0YWdyYXBoLnNldEVkZ2UoWixsYSxiYSl9KX1wYXRjaEVkZ2VzSW50b0Z1bmN0aW9uSW5wdXRzKEwsUSl7bGV0IFQ9TWF0aC5taW4oUS5mdW5jdGlvbklucHV0SW5kZXgsTC5pbnB1dHMubGVuZ3RoLTEpO2Zvcih2YXIgWD1fLmNsb25lKEwuaW5wdXRzW1RdKTtYLmlzQ29udHJvbERlcGVuZGVuY3k7KVQrKywKWD1MLmlucHV0c1tUXTtRLmlucHV0cy5wdXNoKFgpO1g9dGhpcy5oaWVyYXJjaHkuZ2V0UHJlZGVjZXNzb3JzKEwubmFtZSk7bGV0IGFhLGxhPTA7Xy5lYWNoKFgucmVndWxhcixaPT57bGErPVoubnVtUmVndWxhckVkZ2VzO2lmKGxhPlQpcmV0dXJuIGFhPVosITF9KTtfLmVhY2goYWEuYmFzZUVkZ2VMaXN0LFo9PntaLnc9PT1MLm5hbWUmJihaLnc9US5uYW1lKTtaLnY9PT1MLm5hbWUmJihaLnY9US5uYW1lKX0pfXBhdGNoRWRnZXNGcm9tRnVuY3Rpb25PdXRwdXRzKEwsUSl7Y29uc3QgVD10aGlzLmhpZXJhcmNoeS5nZXRTdWNjZXNzb3JzKEwubmFtZSk7Xy5lYWNoKFQucmVndWxhcixYPT57Xy5lYWNoKFguYmFzZUVkZ2VMaXN0LGFhPT57Y29uc3QgbGE9dGhpcy5oaWVyYXJjaHkubm9kZShhYS53KTtfLmVhY2gobGEuaW5wdXRzLFo9PntaLm5hbWU9PT1MLm5hbWUmJihaLm5hbWU9UVtaLm91dHB1dFRlbnNvcktleV0ubmFtZSxaLm91dHB1dFRlbnNvcktleT1hYS5vdXRwdXRUZW5zb3JLZXkpfSl9KTsKXy5lYWNoKFguYmFzZUVkZ2VMaXN0LGFhPT57YWEudj1RW2FhLm91dHB1dFRlbnNvcktleV0ubmFtZTthYS5vdXRwdXRUZW5zb3JLZXk9IjAifSl9KX1idWlsZFN1YmhpZXJhcmNoeShMKXtpZighKEwgaW4gdGhpcy5oYXNTdWJoaWVyYXJjaHkpKXt0aGlzLmhhc1N1YmhpZXJhcmNoeVtMXT0hMDt2YXIgUT10aGlzLmluZGV4W0xdO2lmKFEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBfHxRLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTKXt2YXIgVD1RLm5vZGUubWV0YWdyYXBoLFg9US5jb3JlR3JhcGgsYWE9W10sbGE9W107Xy5pc0VtcHR5KHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMpfHwoXy5lYWNoKFQubm9kZXMoKSx4YT0+e2NvbnN0IEFhPVQubm9kZSh4YSksRmE9dGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9uc1tBYS5vcF07RmEmJjAhPT14YS5pbmRleE9mKGIuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCkmJih4YT10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGUoVCwKQWEsRmEubm9kZSxGYS5ub2RlLm5hbWUsQWEubmFtZSksYWEucHVzaChBYSksbGEucHVzaCh4YSkpfSksXy5lYWNoKGxhLCh4YSxBYSk9PntBYT1hYVtBYV07eGEucGFyZW50Tm9kZT1BYS5wYXJlbnROb2RlO1Quc2V0Tm9kZShBYS5uYW1lLHhhKTt0aGlzLmhpZXJhcmNoeS5zZXROb2RlKEFhLm5hbWUseGEpfSkpO18uZWFjaChULm5vZGVzKCkseGE9PntsZXQgQWE9dGhpcy5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUoeGEpLEZhPUFhLm5vZGU7WC5zZXROb2RlKHhhLEFhKTtGYS5pc0dyb3VwTm9kZXx8KF8uZWFjaChGYS5pbkVtYmVkZGluZ3MseWE9PntsZXQgU2E9bmV3IEsobnVsbCksWGE9bmV3IEgoeWEpO2goQWEseWEsWGEsU2EsTi5DT05TVEFOVCk7dGhpcy5pbmRleFt5YS5uYW1lXT1YYX0pLF8uZWFjaChGYS5vdXRFbWJlZGRpbmdzLHlhPT57bGV0IFNhPW5ldyBLKG51bGwpLFhhPW5ldyBIKHlhKTtrKEFhLHlhLFhhLFNhLE4uU1VNTUFSWSk7dGhpcy5pbmRleFt5YS5uYW1lXT0KWGF9KSl9KTtfLmVhY2goVC5lZGdlcygpLHhhPT57dmFyIEFhPVQuZWRnZSh4YSk7QWE9bmV3IEsoQWEpO0FhLmlzRmFkZWRPdXQ9dGhpcy5pbmRleFt4YS52XS5pc0ZhZGVkT3V0fHx0aGlzLmluZGV4W3hhLnddLmlzRmFkZWRPdXQ7WC5zZXRFZGdlKHhhLnYseGEudyxBYSl9KTtGLmVuYWJsZUV4dHJhY3Rpb24mJlEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBJiZDKFEpO18uaXNFbXB0eSh0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zKXx8dGhpcy5idWlsZFN1YmhpZXJhcmNoaWVzRm9yTmVlZGVkRnVuY3Rpb25zKFQpO0w9PT1iLmdyYXBoLlJPT1RfTkFNRSYmXy5mb3JPd24odGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucyx4YT0+e3hhPXhhLm5vZGU7Y29uc3QgQWE9dGhpcy5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUoeGEubmFtZSk7US5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5wdXNoKEFhKTtBYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREU7ClgucmVtb3ZlTm9kZSh4YS5uYW1lKX0pO3ZhciBaPVEubm9kZS5wYXJlbnROb2RlO2lmKFope3ZhciBiYT10aGlzLmluZGV4W1oubmFtZV0sZWE9KHhhLC4uLkFhKT0+QWEuY29uY2F0KFt4YT8iSU4iOiJPVVQiXSkuam9pbigifn4iKSxjYT10aGlzLmhpZXJhcmNoeS5nZXRCcmlkZ2VncmFwaChMKSxrYT17fSxZPXt9LEVhPXt9O18uZWFjaChjYS5lZGdlcygpLHhhPT57bGV0IEFhPSEhVC5ub2RlKHhhLncpLEZhPUFhP3hhLnY6eGEudztjYS5lZGdlKHhhKS5udW1SZWd1bGFyRWRnZXM/QWE/WVtGYV09KFlbRmFdfHwwKSsxOmthW0ZhXT0oa2FbRmFdfHwwKSsxOkVhW0ZhXT0oRWFbRmFdfHwwKSsxfSk7dmFyIHZhPXRoaXMuaGllcmFyY2h5LmdldE5vZGVNYXAoKTtfLmVhY2goY2EuZWRnZXMoKSx4YT0+e3ZhciBBYT1jYS5lZGdlKHhhKTtsZXQgRmE9ISFULm5vZGUoeGEudyksW3lhLFNhXT1GYT9beGEudyx4YS52XTpbeGEudix4YS53XTt2YXIgWGE9dGhpcy5pbmRleFt5YV0sdWI9dGhpcy5pbmRleFtTYV0sCkJiPXViP3ViLm5vZGU6dmFbU2FdLHFiPSFBYS5udW1SZWd1bGFyRWRnZXMmJkVhW1NhXT5GLm1heENvbnRyb2xEZWdyZWUsWyx6Yl09RmE/W1EuaW5Bbm5vdGF0aW9ucyxYYS5pbkFubm90YXRpb25zXTpbUS5vdXRBbm5vdGF0aW9ucyxYYS5vdXRBbm5vdGF0aW9uc107bGV0IHZiPShGYT9ZOmthKVtTYV0+Ri5tYXhCcmlkZ2VQYXRoRGVncmVlO3hhPW51bGw7dmFyIEdiPSExO0YuZW5hYmxlQnJpZGdlZ3JhcGgmJiF2YiYmIXFiJiZYYS5pc0luQ29yZSgpJiYoR2I9TmI9PmJhLmNvcmVHcmFwaC5lZGdlKEZhP3t2Ok5iLHc6TH06e3Y6TCx3Ok5ifSksKHhhPUdiKFNhKSl8fCh4YT1HYihlYShGYSxTYSxaLm5hbWUpKSksR2I9ISF4YSk7WGE9ITE7aWYoeGEmJiFBYS5udW1SZWd1bGFyRWRnZXMpe1hhPXhhO2ZvcihxYj1iYS5ub2RlO1hhLmFkam9pbmluZ01ldGFlZGdlOylYYT1YYS5hZGpvaW5pbmdNZXRhZWRnZSxxYj1xYi5wYXJlbnROb2RlO3FiPXRoaXMuaGllcmFyY2h5LmdldFRvcG9sb2dpY2FsT3JkZXJpbmcocWIubmFtZSk7ClhhPVhhLm1ldGFlZGdlO1hhPXFiW1hhLnZdPnFiW1hhLnddfUdiJiYhWGE/KEJiPWVhKEZhLEwpLHViPWVhKEZhLFNhLEwpLHpiPVgubm9kZSh1YiksemJ8fChHYj1YLm5vZGUoQmIpLEdifHwoR2I9bmV3IEgoe25hbWU6QmIsdHlwZTpkLk5vZGVUeXBlLkJSSURHRSxpc0dyb3VwTm9kZTohMSxjYXJkaW5hbGl0eTowLHBhcmVudE5vZGU6bnVsbCxzdGF0czpudWxsLGluY2x1ZGU6ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVELGluYm91bmQ6RmEsbm9kZUF0dHJpYnV0ZXM6e319KSx0aGlzLmluZGV4W0JiXT1HYixYLnNldE5vZGUoQmIsR2IpKSx6Yj1uZXcgSCh7bmFtZTp1Yix0eXBlOmQuTm9kZVR5cGUuQlJJREdFLGlzR3JvdXBOb2RlOiExLGNhcmRpbmFsaXR5OjEscGFyZW50Tm9kZTpudWxsLHN0YXRzOm51bGwsaW5jbHVkZTpkLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQsaW5ib3VuZDpGYSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbdWJdPXpiLFguc2V0Tm9kZSh1YiwKemIpLFguc2V0UGFyZW50KHViLEJiKSxHYi5ub2RlLmNhcmRpbmFsaXR5KyspLEFhPW5ldyBLKEFhKSxBYS5hZGpvaW5pbmdNZXRhZWRnZT14YSxGYT9YLnNldEVkZ2UodWIseWEsQWEpOlguc2V0RWRnZSh5YSx1YixBYSkpOnpiLnB1c2gobmV3IEkoQmIsdWIsbmV3IEsoQWEpLE4uU0hPUlRDVVQsRmEpKX0pO18uZWFjaChbITAsITFdLHhhPT57bGV0IEFhPWVhKHhhLEwpLEZhPVgubm9kZShBYSk7RmEmJl8uZWFjaChYLm5vZGVzKCkseWE9PntpZihYLm5vZGUoeWEpLm5vZGUudHlwZSE9PWQuTm9kZVR5cGUuQlJJREdFJiYoeGE/IVgucHJlZGVjZXNzb3JzKHlhKS5sZW5ndGg6IVguc3VjY2Vzc29ycyh5YSkubGVuZ3RoKSl7dmFyIFNhPWVhKHhhLEwsIlNUUlVDVFVSQUxfVEFSR0VUIiksWGE9WC5ub2RlKFNhKTtYYXx8KFhhPW5ldyBIKHtuYW1lOlNhLHR5cGU6ZC5Ob2RlVHlwZS5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCwKaW5jbHVkZTpkLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQsaW5ib3VuZDp4YSxub2RlQXR0cmlidXRlczp7fX0pLFhhLnN0cnVjdHVyYWw9ITAsdGhpcy5pbmRleFtTYV09WGEsWC5zZXROb2RlKFNhLFhhKSxGYS5ub2RlLmNhcmRpbmFsaXR5KyssWC5zZXRQYXJlbnQoU2EsQWEpKTtYYT1uZXcgSyhudWxsKTtYYS5zdHJ1Y3R1cmFsPSEwO1hhLndlaWdodC0tO3hhP1guc2V0RWRnZShTYSx5YSxYYSk6WC5zZXRFZGdlKHlhLFNhLFhhKX19KX0pfX19fWJ1aWxkU3ViaGllcmFyY2hpZXNGb3JOZWVkZWRGdW5jdGlvbnMoTCl7Xy5lYWNoKEwuZWRnZXMoKSxRPT57UT1MLmVkZ2UoUSk7UT1uZXcgSyhRKTtfLmZvckVhY2goUS5tZXRhZWRnZS5iYXNlRWRnZUxpc3QsVD0+e3ZhciBYPVQudi5zcGxpdChiLmdyYXBoLk5BTUVTUEFDRV9ERUxJTSk7Zm9yKHZhciBhYT1YLmxlbmd0aDswPD1hYTthYS0tKXtUPVguc2xpY2UoMCxhYSk7Y29uc3QgbGE9dGhpcy5oaWVyYXJjaHkubm9kZShULmpvaW4oYi5ncmFwaC5OQU1FU1BBQ0VfREVMSU0pKTsKaWYobGEpe2lmKGxhLnR5cGU9PT1kLk5vZGVUeXBlLk9QJiZ0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zW2xhLm9wXSlmb3IoWD0xO1g8VC5sZW5ndGg7WCsrKShhYT1ULnNsaWNlKDAsWCkuam9pbihiLmdyYXBoLk5BTUVTUEFDRV9ERUxJTSkpJiZ0aGlzLmJ1aWxkU3ViaGllcmFyY2h5KGFhKTticmVha319fSl9KX19Zi5SZW5kZXJHcmFwaEluZm89QjtjbGFzcyBJe2NvbnN0cnVjdG9yKEwsUSxULFgsYWEpe3RoaXMubm9kZT1MO3RoaXMucmVuZGVyTm9kZUluZm89UTt0aGlzLnJlbmRlck1ldGFlZGdlSW5mbz1UO3RoaXMuYW5ub3RhdGlvblR5cGU9WDt0aGlzLmhlaWdodD10aGlzLndpZHRoPXRoaXMuZHk9dGhpcy5keD0wO1QmJlQubWV0YWVkZ2UmJih0aGlzLnY9VC5tZXRhZWRnZS52LHRoaXMudz1ULm1ldGFlZGdlLncpO3RoaXMuaXNJbj1hYTt0aGlzLnBvaW50cz1bXX19Zi5Bbm5vdGF0aW9uPUk7bGV0IE47KGZ1bmN0aW9uKEwpe0xbTC5TSE9SVENVVD0wXT0iU0hPUlRDVVQiOwpMW0wuQ09OU1RBTlQ9MV09IkNPTlNUQU5UIjtMW0wuU1VNTUFSWT0yXT0iU1VNTUFSWSI7TFtMLkVMTElQU0lTPTNdPSJFTExJUFNJUyJ9KShOPWYuQW5ub3RhdGlvblR5cGV8fChmLkFubm90YXRpb25UeXBlPXt9KSk7Y2xhc3MgT3tjb25zdHJ1Y3Rvcigpe3RoaXMubGlzdD1bXTt0aGlzLm5vZGVOYW1lcz17fX1wdXNoKEwpe2lmKCEoTC5ub2RlLm5hbWUgaW4gdGhpcy5ub2RlTmFtZXMpKWlmKHRoaXMubm9kZU5hbWVzW0wubm9kZS5uYW1lXT0hMCx0aGlzLmxpc3QubGVuZ3RoPEYubWF4QW5ub3RhdGlvbnMpdGhpcy5saXN0LnB1c2goTCk7ZWxzZXt2YXIgUT10aGlzLmxpc3RbdGhpcy5saXN0Lmxlbmd0aC0xXTtRLmFubm90YXRpb25UeXBlPT09Ti5FTExJUFNJUz8oTD1RLm5vZGUsTC5zZXROdW1Nb3JlTm9kZXMoKytMLm51bU1vcmVOb2RlcykpOihRPW5ldyBiLmdyYXBoLkVsbGlwc2lzTm9kZUltcGwoMSksdGhpcy5saXN0LnB1c2gobmV3IEkoUSxuZXcgSChRKSxudWxsLE4uRUxMSVBTSVMsCkwuaXNJbikpKX19fWYuQW5ub3RhdGlvbkxpc3Q9TztjbGFzcyBIe2NvbnN0cnVjdG9yKEwpe3RoaXMubm9kZT1MO3RoaXMuZXhwYW5kZWQ9ITE7dGhpcy5pbkFubm90YXRpb25zPW5ldyBPO3RoaXMub3V0QW5ub3RhdGlvbnM9bmV3IE87dGhpcy5vdXRib3hXaWR0aD10aGlzLmluYm94V2lkdGg9dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD10aGlzLnk9dGhpcy54PTA7dGhpcy5zdHJ1Y3R1cmFsPXRoaXMuZXhjbHVkZWQ9ITE7dGhpcy5wYWRkaW5nQm90dG9tPXRoaXMucGFkZGluZ1JpZ2h0PXRoaXMucGFkZGluZ0xlZnQ9dGhpcy5wYWRkaW5nVG9wPXRoaXMubGFiZWxIZWlnaHQ9dGhpcy5yYWRpdXM9dGhpcy5sYWJlbE9mZnNldD0wO3RoaXMuaXNPdXRFeHRyYWN0PXRoaXMuaXNJbkV4dHJhY3Q9ITE7dGhpcy5jb3JlQm94PXt3aWR0aDowLGhlaWdodDowfTt0aGlzLmlzRmFkZWRPdXQ9ITE7dGhpcy5kaXNwbGF5TmFtZT1MLm5hbWUuc3Vic3RyaW5nKEwubmFtZS5sYXN0SW5kZXhPZihiLmdyYXBoLk5BTUVTUEFDRV9ERUxJTSkrCjEpO0wudHlwZT09PWQuTm9kZVR5cGUuTUVUQSYmTC5hc3NvY2lhdGVkRnVuY3Rpb24mJigoTD10aGlzLmRpc3BsYXlOYW1lLm1hdGNoKEQpKT90aGlzLmRpc3BsYXlOYW1lPUxbMV06Xy5zdGFydHNXaXRoKHRoaXMuZGlzcGxheU5hbWUsYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmKHRoaXMuZGlzcGxheU5hbWU9dGhpcy5kaXNwbGF5TmFtZS5zdWJzdHJpbmcoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYLmxlbmd0aCkpKX1pc0luQ29yZSgpe3JldHVybiF0aGlzLmlzSW5FeHRyYWN0JiYhdGhpcy5pc091dEV4dHJhY3QmJiF0aGlzLmlzTGlicmFyeUZ1bmN0aW9ufX1mLlJlbmRlck5vZGVJbmZvPUg7Y2xhc3MgS3tjb25zdHJ1Y3RvcihMKXt0aGlzLm1ldGFlZGdlPUw7dGhpcy5hZGpvaW5pbmdNZXRhZWRnZT1udWxsO3RoaXMuc3RydWN0dXJhbD0hMTt0aGlzLndlaWdodD0xO3RoaXMuaXNGYWRlZE91dD0hMX19Zi5SZW5kZXJNZXRhZWRnZUluZm89Cks7Y2xhc3MgTSBleHRlbmRzIEh7Y29uc3RydWN0b3IoTCxRKXtzdXBlcihMKTtMPUwubWV0YWdyYXBoLmdyYXBoKCk7US5jb21wb3VuZD0hMDt0aGlzLmNvcmVHcmFwaD1kLmNyZWF0ZUdyYXBoKEwubmFtZSxkLkdyYXBoVHlwZS5DT1JFLFEpO3RoaXMuaW5FeHRyYWN0Qm94PXt3aWR0aDowLGhlaWdodDowfTt0aGlzLm91dEV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMubGlicmFyeUZ1bmN0aW9uc0JveD17d2lkdGg6MCxoZWlnaHQ6MH07dGhpcy5pc29sYXRlZEluRXh0cmFjdD1bXTt0aGlzLmlzb2xhdGVkT3V0RXh0cmFjdD1bXTt0aGlzLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0PVtdfX1mLlJlbmRlckdyb3VwTm9kZUluZm89TTtmLm1ha2VJbkV4dHJhY3Q9bjtmLm1hcEluZGV4VG9IdWU9ZnVuY3Rpb24oTCl7cmV0dXJuIDErNTc5LjI1NjE2Nzk3MjUqTCUzNTh9O2YuZXhwYW5kVW50aWxOb2RlSXNTaG93bj1mdW5jdGlvbihMLFEpe3ZhciBUPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY2VuZSIpOwpRPVEuc3BsaXQoIi8iKTt2YXIgWD1RW1EubGVuZ3RoLTFdLm1hdGNoKC8oLiopOlx3Ky8pOzI9PT1YLmxlbmd0aCYmKFFbUS5sZW5ndGgtMV09WFsxXSk7WD1RWzBdO2xldCBhYT1MLmdldFJlbmRlck5vZGVCeU5hbWUoWCk7Zm9yKGxldCBsYT0xO2xhPFEubGVuZ3RoJiZhYS5ub2RlLnR5cGUhPT1iLmdyYXBoLk5vZGVUeXBlLk9QO2xhKyspTC5idWlsZFN1YmhpZXJhcmNoeShYKSxhYS5leHBhbmRlZD0hMCxULnNldE5vZGVFeHBhbmRlZChhYSksWCs9Ii8iK1FbbGFdLGFhPUwuZ2V0UmVuZGVyTm9kZUJ5TmFtZShYKTtyZXR1cm4gYWEubm9kZS5uYW1lfX0pKGQucmVuZGVyfHwoZC5yZW5kZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3NjZW5lLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgocSx1LHgsQSl7dmFyIHk9ayhxLHUseCk7aWYoIXkuZW1wdHkoKSlyZXR1cm4geTt1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHUpO2lmKHggaW5zdGFuY2VvZiBBcnJheSlmb3IoeT0wO3k8eC5sZW5ndGg7eSsrKXUuY2xhc3NMaXN0LmFkZCh4W3ldKTtlbHNlIHUuY2xhc3NMaXN0LmFkZCh4KTtBP3Eubm9kZSgpLmluc2VydEJlZm9yZSh1LEEpOnEubm9kZSgpLmFwcGVuZENoaWxkKHUpO3JldHVybiBkMy5zZWxlY3QodSkuZGF0dW0ocS5kYXR1bSgpKX1mdW5jdGlvbiBrKHEsdSx4KXtxPXEubm9kZSgpLmNoaWxkTm9kZXM7Zm9yKGxldCBBPTA7QTxxLmxlbmd0aDtBKyspe2xldCB5PXFbQV07aWYoeS50YWdOYW1lPT09dSlpZih4IGluc3RhbmNlb2YgQXJyYXkpe2xldCB3PSEwO2ZvcihsZXQgQz0wO0M8eC5sZW5ndGg7QysrKXc9dyYmeS5jbGFzc0xpc3QuY29udGFpbnMoeFtDXSk7CmlmKHcpcmV0dXJuIGQzLnNlbGVjdCh5KX1lbHNlIGlmKCF4fHx5LmNsYXNzTGlzdC5jb250YWlucyh4KSlyZXR1cm4gZDMuc2VsZWN0KHkpfXJldHVybiBkMy5zZWxlY3QobnVsbCl9ZnVuY3Rpb24gdChxLHUpe2xldCB4PXUubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/MDpkLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5sYWJlbEhlaWdodDtsKGsocSwiZyIsZi5DbGFzcy5TY2VuZS5DT1JFKSwwLHgpO3ZhciBBPTA8dS5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGgseT0wPHUuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aDtsZXQgdz0wPHUubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoLEM9ZC5sYXlvdXQuUEFSQU1TLnN1YnNjZW5lLm1ldGEuZXh0cmFjdFhPZmZzZXQsRj0wO0EmJihGKz11Lm91dEV4dHJhY3RCb3gud2lkdGgpO3kmJihGKz11Lm91dEV4dHJhY3RCb3gud2lkdGgpO0EmJihBPXUuY29yZUJveC53aWR0aCxBPUY8ZC5sYXlvdXQuTUlOX0FVWF9XSURUSD8KQS1kLmxheW91dC5NSU5fQVVYX1dJRFRIK3UuaW5FeHRyYWN0Qm94LndpZHRoLzI6QS11LmluRXh0cmFjdEJveC53aWR0aC8yLXUub3V0RXh0cmFjdEJveC53aWR0aC0oeT9DOjApLEE9QS11LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKHc/QzowKSxsKGsocSwiZyIsZi5DbGFzcy5TY2VuZS5JTkVYVFJBQ1QpLEEseCkpO3kmJih5PXUuY29yZUJveC53aWR0aCx5PUY8ZC5sYXlvdXQuTUlOX0FVWF9XSURUSD95LWQubGF5b3V0Lk1JTl9BVVhfV0lEVEgrdS5vdXRFeHRyYWN0Qm94LndpZHRoLzI6eS11Lm91dEV4dHJhY3RCb3gud2lkdGgvMix5PXktdS5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoLSh3P0M6MCksbChrKHEsImciLGYuQ2xhc3MuU2NlbmUuT1VURVhUUkFDVCkseSx4KSk7dyYmKHU9dS5jb3JlQm94LndpZHRoLXUubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC8yLGwoayhxLCJnIixmLkNsYXNzLlNjZW5lLkZVTkNUSU9OX0xJQlJBUlkpLHUseCkpfWZ1bmN0aW9uIGwocSwKdSx4KXtudWxsIT1xLmF0dHIoInRyYW5zZm9ybSIpJiYocT1xLnRyYW5zaXRpb24oInBvc2l0aW9uIikpO3EuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrdSsiLCIreCsiKSIpfWZ1bmN0aW9uIHAocSx1KXtyZXR1cm4gdT9xLnRvRml4ZWQoMCk6MTw9TWF0aC5hYnMocSk/cS50b0ZpeGVkKDEpOnEudG9FeHBvbmVudGlhbCgxKX1mdW5jdGlvbiBtKHEsdSx4LEEpe2xldCB5PSJEZXZpY2U6ICIrcS5kZXZpY2VfbmFtZSsiXG4iO3krPSJkdHlwZTogIitxLmR0eXBlKyJcbiI7bGV0IHc9IihzY2FsYXIpIjswPHEuc2hhcGUubGVuZ3RoJiYodz0iKCIrcS5zaGFwZS5qb2luKCIsIikrIikiKTt5PXkrKCJcbnNoYXBlOiAiK3crIlxuXG4jKGVsZW1lbnRzKTogIikrKHUrIlxuIik7cT1bXTtmb3IodT0wO3U8eC5sZW5ndGg7dSsrKTA8eFt1XSYmcS5wdXNoKCIjKCIrZi5oZWFsdGhQaWxsRW50cmllc1t1XS5sYWJlbCsiKTogIit4W3VdKTt5Kz1xLmpvaW4oIiwgIikrIlxuXG4iO0EubWF4Pj0KQS5taW4mJih5Kz0ibWluOiAiK0EubWluKyIsIG1heDogIitBLm1heCsiXG4iLHkrPSJtZWFuOiAiK0EubWVhbisiLCBzdGRkZXY6ICIrQS5zdGRkZXYpO3JldHVybiB5fWZ1bmN0aW9uIG4ocSx1LHgsQSx5PTYwLHc9MTAsQz0wLEYpe2QzLnNlbGVjdChxLnBhcmVudE5vZGUpLnNlbGVjdEFsbCgiLmhlYWx0aC1waWxsIikucmVtb3ZlKCk7aWYodSl7dmFyIEQ9dS52YWx1ZSxCPUQuc2xpY2UoMiw4KSxJPUJbMF0sTj1CWzFdLE89Qls1XSxIPURbMV0sSz17bWluOkRbOF0sbWF4OkRbOV0sbWVhbjpEWzEwXSxzdGRkZXY6TWF0aC5zcXJ0KERbMTFdKX07bnVsbD09eSYmKHk9NjApO251bGw9PXcmJih3PTEwKTtudWxsPT1DJiYoQz0wKTtudWxsIT14JiZ4Lm5vZGUudHlwZT09PWIuZ3JhcGguTm9kZVR5cGUuT1AmJih5Lz0yLHcvPTIpO0Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwiZyIpO0QuY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwiKTt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLAoiZGVmcyIpO0QuYXBwZW5kQ2hpbGQoTSk7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwibGluZWFyR3JhZGllbnQiKTtBPSJoZWFsdGgtcGlsbC1ncmFkaWVudC0iK0E7TC5zZXRBdHRyaWJ1dGUoImlkIixBKTt2YXIgUT0wLFQ9IjAlIjtmb3IobGV0IGFhPTA7YWE8Qi5sZW5ndGg7YWErKylpZihCW2FhXSl7USs9QlthYV07dmFyIFg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwic3RvcCIpO1guc2V0QXR0cmlidXRlKCJvZmZzZXQiLFQpO1guc2V0QXR0cmlidXRlKCJzdG9wLWNvbG9yIixmLmhlYWx0aFBpbGxFbnRyaWVzW2FhXS5iYWNrZ3JvdW5kX2NvbG9yKTtMLmFwcGVuZENoaWxkKFgpO1Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwic3RvcCIpO1g9MTAwKlEvSCsiJSI7VC5zZXRBdHRyaWJ1dGUoIm9mZnNldCIsWCk7VC5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLGYuaGVhbHRoUGlsbEVudHJpZXNbYWFdLmJhY2tncm91bmRfY29sb3IpOwpMLmFwcGVuZENoaWxkKFQpO1Q9WH1NLmFwcGVuZENoaWxkKEwpO009ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwicmVjdCIpO00uc2V0QXR0cmlidXRlKCJmaWxsIiwidXJsKCMiK0ErIikiKTtNLnNldEF0dHJpYnV0ZSgid2lkdGgiLFN0cmluZyh5KSk7TS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsU3RyaW5nKHcpKTtNLnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKEMpKTtELmFwcGVuZENoaWxkKE0pO009ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwidGl0bGUiKTtNLnRleHRDb250ZW50PW0odSxILEIsSyk7RC5hcHBlbmRDaGlsZChNKTt1PSExO2lmKG51bGwhPXgmJihNPXgueC15LzIsdz14Lnktdy14LmhlaWdodC8yLTIsMD54LmxhYmVsT2Zmc2V0JiYodys9eC5sYWJlbE9mZnNldCksRC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK00rIiwgIit3KyIpIiksKEJbMl18fEJbM118fEJbNF0pJiYoeD14Lm5vZGUuYXR0cikmJgp4Lmxlbmd0aCkpZm9yKEI9MDtCPHgubGVuZ3RoO0IrKylpZigiVCI9PT14W0JdLmtleSl7dT0oeD14W0JdLnZhbHVlLnR5cGUpJiYvXkRUXyhCT09MfElOVHxVSU5UKS8udGVzdCh4KTticmVha314PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmLlNWR19OQU1FU1BBQ0UsInRleHQiKTtpZihOdW1iZXIuaXNGaW5pdGUoSy5taW4pJiZOdW1iZXIuaXNGaW5pdGUoSy5tYXgpKXtpZihCPXAoSy5taW4sdSksSz1wKEsubWF4LHUpLHgudGV4dENvbnRlbnQ9MTxIP0IrIiB+ICIrSzpCLDA8SXx8MDxOfHwwPE8peC50ZXh0Q29udGVudCs9IiAoIixIPVtdLDA8SSYmSC5wdXNoKGBOYU5cdTAwZDcke0l9YCksMDxOJiZILnB1c2goYC1cdTIyMWVcdTAwZDcke059YCksMDxPJiZILnB1c2goYCtcdTIyMWVcdTAwZDcke099YCkseC50ZXh0Q29udGVudCs9SC5qb2luKCI7ICIpKyIpIn1lbHNlIHgudGV4dENvbnRlbnQ9IihObyBmaW5pdGUgZWxlbWVudHMpIjt4LmNsYXNzTGlzdC5hZGQoImhlYWx0aC1waWxsLXN0YXRzIik7Cm51bGw9PUYmJihGPXkvMik7eC5zZXRBdHRyaWJ1dGUoIngiLFN0cmluZyhGKSk7eC5zZXRBdHRyaWJ1dGUoInkiLFN0cmluZyhDLTIpKTtELmFwcGVuZENoaWxkKHgpO1BvbHltZXIuZG9tKHEucGFyZW50Tm9kZSkuYXBwZW5kQ2hpbGQoRCl9fWYuU1ZHX05BTUVTUEFDRT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2YuQ2xhc3M9e05vZGU6e0NPTlRBSU5FUjoibm9kZXMiLEdST1VQOiJub2RlIixTSEFQRToibm9kZXNoYXBlIixDT0xPUl9UQVJHRVQ6Im5vZGVjb2xvcnRhcmdldCIsTEFCRUw6Im5vZGVsYWJlbCIsQlVUVE9OX0NPTlRBSU5FUjoiYnV0dG9uY29udGFpbmVyIixCVVRUT05fQ0lSQ0xFOiJidXR0b25jaXJjbGUiLEVYUEFORF9CVVRUT046ImV4cGFuZGJ1dHRvbiIsQ09MTEFQU0VfQlVUVE9OOiJjb2xsYXBzZWJ1dHRvbiJ9LEVkZ2U6e0NPTlRBSU5FUjoiZWRnZXMiLEdST1VQOiJlZGdlIixMSU5FOiJlZGdlbGluZSIsUkVGRVJFTkNFX0VER0U6InJlZmVyZW5jZWVkZ2UiLApSRUZfTElORToicmVmbGluZSIsU0VMRUNUQUJMRToic2VsZWN0YWJsZWVkZ2UiLFNFTEVDVEVEOiJzZWxlY3RlZGVkZ2UiLFNUUlVDVFVSQUw6InN0cnVjdHVyYWwifSxBbm5vdGF0aW9uOntPVVRCT1g6Im91dC1hbm5vdGF0aW9ucyIsSU5CT1g6ImluLWFubm90YXRpb25zIixHUk9VUDoiYW5ub3RhdGlvbiIsTk9ERToiYW5ub3RhdGlvbi1ub2RlIixFREdFOiJhbm5vdGF0aW9uLWVkZ2UiLENPTlRST0xfRURHRToiYW5ub3RhdGlvbi1jb250cm9sLWVkZ2UiLExBQkVMOiJhbm5vdGF0aW9uLWxhYmVsIixFTExJUFNJUzoiYW5ub3RhdGlvbi1lbGxpcHNpcyJ9LFNjZW5lOntHUk9VUDoic2NlbmUiLENPUkU6ImNvcmUiLEZVTkNUSU9OX0xJQlJBUlk6ImZ1bmN0aW9uLWxpYnJhcnkiLElORVhUUkFDVDoiaW4tZXh0cmFjdCIsT1VURVhUUkFDVDoib3V0LWV4dHJhY3QifSxTdWJzY2VuZTp7R1JPVVA6InN1YnNjZW5lIn0sT1BOT0RFOiJvcCIsTUVUQU5PREU6Im1ldGEiLFNFUklFU05PREU6InNlcmllcyIsCkJSSURHRU5PREU6ImJyaWRnZSIsRUxMSVBTSVNOT0RFOiJlbGxpcHNpcyJ9O2YuaGVhbHRoUGlsbEVudHJpZXM9W3tiYWNrZ3JvdW5kX2NvbG9yOiIjQ0MyRjJDIixsYWJlbDoiTmFOIn0se2JhY2tncm91bmRfY29sb3I6IiNGRjhEMDAiLGxhYmVsOiItXHUyMjFlIn0se2JhY2tncm91bmRfY29sb3I6IiNFQUVBRUEiLGxhYmVsOiItIn0se2JhY2tncm91bmRfY29sb3I6IiNBNUE1QTUiLGxhYmVsOiIwIn0se2JhY2tncm91bmRfY29sb3I6IiMyNjI2MjYiLGxhYmVsOiIrIn0se2JhY2tncm91bmRfY29sb3I6IiMwMDNFRDQiLGxhYmVsOiIrXHUyMjFlIn1dO2YuZml0PWZ1bmN0aW9uKHEsdSx4LEEpe3ZhciB5PXEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bGV0IHc9bnVsbDt0cnl7aWYodz11LmdldEJCb3goKSwwPT09dy53aWR0aClyZXR1cm59Y2F0Y2goQyl7cmV0dXJufXU9ZC5sYXlvdXQuUEFSQU1TLmdyYXBoO3k9ZDMuem9vbUlkZW50aXR5LnNjYWxlKC45Kk1hdGgubWluKHkud2lkdGgvCncud2lkdGgseS5oZWlnaHQvdy5oZWlnaHQsMikpLnRyYW5zbGF0ZSh1LnBhZGRpbmcucGFkZGluZ0xlZnQsdS5wYWRkaW5nLnBhZGRpbmdUb3ApO2QzLnNlbGVjdChxKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKS5jYWxsKHgudHJhbnNmb3JtLHkpLm9uKCJlbmQuZml0dGVkIiwoKT0+e3gub24oImVuZC5maXR0ZWQiLG51bGwpO0EoKX0pfTtmLnBhblRvTm9kZT1mdW5jdGlvbihxLHUseCxBKXt4PWQzLnNlbGVjdCh1KS5zZWxlY3QoYFtkYXRhLW5hbWU9IiR7cX0iXWApLm5vZGUoKTtpZigheClyZXR1cm4gY29uc29sZS53YXJuKGBwYW5Ub05vZGUoKSBmYWlsZWQgZm9yIG5vZGUgbmFtZSAiJHtxfSJgKSwhMTt2YXIgeT14LmdldEJCb3goKSx3PXguZ2V0U2NyZWVuQ1RNKCk7cT11LmNyZWF0ZVNWR1BvaW50KCk7eD11LmNyZWF0ZVNWR1BvaW50KCk7cS54PXkueDtxLnk9eS55O3gueD15LngreS53aWR0aDt4Lnk9eS55K3kuaGVpZ2h0O3E9cS5tYXRyaXhUcmFuc2Zvcm0odyk7eD0KeC5tYXRyaXhUcmFuc2Zvcm0odyk7dz0oRixELEIsSSk9PiEoRj5CJiZEPEkpO3k9dS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBDPXkudG9wK3kuaGVpZ2h0LTE1MDtyZXR1cm4gdyhxLngseC54LHkubGVmdCx5LmxlZnQreS53aWR0aC0zMjApfHx3KHEueSx4LnkseS50b3AsQyk/KHc9eS5sZWZ0K3kud2lkdGgvMi0ocS54K3gueCkvMixxPXkudG9wK3kuaGVpZ2h0LzItKHEueSt4LnkpLzIseD1kMy56b29tVHJhbnNmb3JtKHUpLGQzLnNlbGVjdCh1KS50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKS5jYWxsKEEudHJhbnNsYXRlQnksdy94LmsscS94LmspLCEwKTohMX07Zi5zZWxlY3RPckNyZWF0ZUNoaWxkPWg7Zi5zZWxlY3RDaGlsZD1rO2YuYnVpbGRHcm91cD1mdW5jdGlvbihxLHUseCxBKXtBPUF8fGYuQ2xhc3MuU2NlbmUuR1JPVVA7bGV0IHk9ayhxLCJnIixBKS5lbXB0eSgpO3E9aChxLCJnIixBKTtBPWgocSwiZyIsZi5DbGFzcy5TY2VuZS5DT1JFKTtsZXQgdz1fLnJlZHVjZSh1LmNvcmVHcmFwaC5ub2RlcygpLAooQyxGKT0+e0Y9dS5jb3JlR3JhcGgubm9kZShGKTtGLmV4Y2x1ZGVkfHxDLnB1c2goRik7cmV0dXJuIEN9LFtdKTt1Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTJiZ3LnJldmVyc2UoKTtmLmVkZ2UuYnVpbGRHcm91cChBLHUuY29yZUdyYXBoLHgpO2Yubm9kZS5idWlsZEdyb3VwKEEsdyx4KTswPHUuaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoPyhBPWgocSwiZyIsZi5DbGFzcy5TY2VuZS5JTkVYVFJBQ1QpLGYubm9kZS5idWlsZEdyb3VwKEEsdS5pc29sYXRlZEluRXh0cmFjdCx4KSk6ayhxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCkucmVtb3ZlKCk7MDx1Lmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGg/KEE9aChxLCJnIixmLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLGYubm9kZS5idWlsZEdyb3VwKEEsdS5pc29sYXRlZE91dEV4dHJhY3QseCkpOmsocSwiZyIsZi5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKS5yZW1vdmUoKTswPHUubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoPwooQT1oKHEsImciLGYuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksZi5ub2RlLmJ1aWxkR3JvdXAoQSx1LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LHgpKTprKHEsImciLGYuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSkucmVtb3ZlKCk7dChxLHUpO3kmJnEuYXR0cigib3BhY2l0eSIsMCkudHJhbnNpdGlvbigpLmF0dHIoIm9wYWNpdHkiLDEpO3JldHVybiBxfTtmLmFkZEdyYXBoQ2xpY2tMaXN0ZW5lcj1mdW5jdGlvbihxLHUpe2QzLnNlbGVjdChxKS5vbigiY2xpY2siLCgpPT57dS5maXJlKCJncmFwaC1zZWxlY3QiKX0pfTtmLnRyYW5zbGF0ZT1sO2YucG9zaXRpb25SZWN0PWZ1bmN0aW9uKHEsdSx4LEEseSl7cS50cmFuc2l0aW9uKCkuYXR0cigieCIsdS1BLzIpLmF0dHIoInkiLHgteS8yKS5hdHRyKCJ3aWR0aCIsQSkuYXR0cigiaGVpZ2h0Iix5KX07Zi5wb3NpdGlvblRyaWFuZ2xlPWZ1bmN0aW9uKHEsdSx4LEEseSl7eS89MjtBLz0yO3U9W1t1LHgteV0sW3UrQSwKeCt5XSxbdS1BLHgreV1dO3EudHJhbnNpdGlvbigpLmF0dHIoInBvaW50cyIsdS5tYXAodz0+dy5qb2luKCIsIikpLmpvaW4oIiAiKSl9O2YucG9zaXRpb25CdXR0b249ZnVuY3Rpb24ocSx1KXtsZXQgeD1kLmxheW91dC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKHUpKyh1LmV4cGFuZGVkP3Uud2lkdGg6dS5jb3JlQm94LndpZHRoKS8yLTYsQT11LnktKHUuZXhwYW5kZWQ/dS5oZWlnaHQ6dS5jb3JlQm94LmhlaWdodCkvMis2O3Uubm9kZS50eXBlIT09ZC5Ob2RlVHlwZS5TRVJJRVN8fHUuZXhwYW5kZWR8fCh4Kz0xMCxBLT0yKTt1PSJ0cmFuc2xhdGUoIit4KyIsIitBKyIpIjtxLnNlbGVjdEFsbCgicGF0aCIpLnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLHUpO3Euc2VsZWN0KCJjaXJjbGUiKS50cmFuc2l0aW9uKCkuYXR0cih7Y3g6eCxjeTpBLHI6ZC5sYXlvdXQuUEFSQU1TLm5vZGVTaXplLm1ldGEuZXhwYW5kQnV0dG9uUmFkaXVzfSl9O2YucG9zaXRpb25FbGxpcHNlPQpmdW5jdGlvbihxLHUseCxBLHkpe3EudHJhbnNpdGlvbigpLmF0dHIoImN4Iix1KS5hdHRyKCJjeSIseCkuYXR0cigicngiLEEvMikuYXR0cigicnkiLHkvMil9O2YuaHVtYW5pemVIZWFsdGhQaWxsU3RhdD1wO2YuYWRkSGVhbHRoUGlsbD1uO2YuYWRkSGVhbHRoUGlsbHM9ZnVuY3Rpb24ocSx1LHgpe2lmKHUpe3ZhciBBPTE7ZDMuc2VsZWN0KHEpLnNlbGVjdEFsbCgiZy5ub2Rlc2hhcGUiKS5lYWNoKGZ1bmN0aW9uKHkpe2NvbnN0IHc9dVt5Lm5vZGUubmFtZV07bih0aGlzLHc/d1t4XTpudWxsLHksQSsrKX0pfX19KShkLnNjZW5lfHwoZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vdGVtcGxhdGUuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChuKXtsZXQgcT1fLm1hcCh7ZGVwdGg6bi5kZXB0aCwifFZ8IjpuLm1ldGFncmFwaC5ub2RlcygpLmxlbmd0aCwifEV8IjpuLm1ldGFncmFwaC5lZGdlcygpLmxlbmd0aH0sZnVuY3Rpb24odSx4KXtyZXR1cm4geCsiXHgzZCIrdX0pLmpvaW4oIiAiKTtuPV8ubWFwKG4ub3BIaXN0b2dyYW0sZnVuY3Rpb24odSx4KXtyZXR1cm4geCsiXHgzZCIrdX0pLmpvaW4oIiwiKTtyZXR1cm4gcSsiIFtvcHNdICIrbn1mdW5jdGlvbiBrKG4pe2NvbnN0IHE9bi5nZXROb2RlTWFwKCk7bGV0IHU9T2JqZWN0LmtleXMocSkucmVkdWNlKCh4LEEpPT57Y29uc3QgeT1xW0FdO2lmKHkudHlwZSE9PWQuTm9kZVR5cGUuTUVUQSlyZXR1cm4geDtBPUEuc3BsaXQoIi8iKS5sZW5ndGgtMTtsZXQgdz1oKHkpLEM9eFt3XXx8e25vZGVzOltdLGxldmVsOkF9O3hbd109QztDLm5vZGVzLnB1c2goeSk7Qy5sZXZlbD5BJiYoQy5sZXZlbD0KQSk7cmV0dXJuIHh9LHt9KTtyZXR1cm4gT2JqZWN0LmtleXModSkubWFwKHg9Plt4LHVbeF1dKS5maWx0ZXIoKFsseF0pPT57eD14Lm5vZGVzO2lmKDE8eC5sZW5ndGgpcmV0dXJuITA7eD14WzBdO3JldHVybiB4LnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJnguYXNzb2NpYXRlZEZ1bmN0aW9ufSkuc29ydCgoWyx4XSk9Pngubm9kZXNbMF0uZGVwdGgpfWZ1bmN0aW9uIHQobixxKXtyZXR1cm4gXy5yZWR1Y2UobixmdW5jdGlvbih1LHgpe2xldCBBPXhbMF0seT1bXTt4WzFdLm5vZGVzLmZvckVhY2goZnVuY3Rpb24odyl7Zm9yKGxldCBDPTA7Qzx5Lmxlbmd0aDtDKyspaWYoIXF8fHAoeVtDXS5tZXRhbm9kZS5tZXRhZ3JhcGgsdy5tZXRhZ3JhcGgpKXt3LnRlbXBsYXRlSWQ9eVtDXS5tZXRhbm9kZS50ZW1wbGF0ZUlkO3lbQ10ubWVtYmVycy5wdXNoKHcubmFtZSk7cmV0dXJufXcudGVtcGxhdGVJZD1BKyJbIit5Lmxlbmd0aCsiXSI7eS5wdXNoKHttZXRhbm9kZTp3LG1lbWJlcnM6W3cubmFtZV19KX0pOwp5LmZvckVhY2goZnVuY3Rpb24odyl7dVt3Lm1ldGFub2RlLnRlbXBsYXRlSWRdPXtsZXZlbDp4WzFdLmxldmVsLG5vZGVzOncubWVtYmVyc319KTtyZXR1cm4gdX0se30pfWZ1bmN0aW9uIGwobixxLHUpe3JldHVybiBfLnNvcnRCeShuLFt4PT5xLm5vZGUoeCkub3AseD0+cS5ub2RlKHgpLnRlbXBsYXRlSWQseD0+cS5uZWlnaGJvcnMoeCkubGVuZ3RoLHg9PnEucHJlZGVjZXNzb3JzKHgpLmxlbmd0aCx4PT5xLnN1Y2Nlc3NvcnMoeCkubGVuZ3RoLHg9Pnguc3Vic3RyKHUubGVuZ3RoKV0pfWZ1bmN0aW9uIHAobixxKXtmdW5jdGlvbiB1KEksTil7bGV0IE89SS5zdWJzdHIoeC5sZW5ndGgpLEg9Ti5zdWJzdHIoQS5sZW5ndGgpO2lmKHlbT11ed1tIXSlyZXR1cm4gY29uc29sZS53YXJuKCJkaWZmZXJlbnQgdmlzaXQgcGF0dGVybiIsIlsiK3grIl0iLE8sIlsiK0ErIl0iLEgpLCEwO3lbT118fCh5W09dPXdbSF09ITAsQy5wdXNoKHtuMTpJLG4yOk59KSk7cmV0dXJuITF9aWYoIWIuZ3JhcGguaGFzU2ltaWxhckRlZ3JlZVNlcXVlbmNlKG4sCnEpKXJldHVybiExO2xldCB4PW4uZ3JhcGgoKS5uYW1lLEE9cS5ncmFwaCgpLm5hbWUseT17fSx3PXt9LEM9W107dmFyIEY9bi5zb3VyY2VzKCksRD1xLnNvdXJjZXMoKTtpZihGLmxlbmd0aCE9PUQubGVuZ3RoKXJldHVybiBjb25zb2xlLmxvZygiZGlmZmVyZW50IHNvdXJjZSBsZW5ndGgiKSwhMTtGPWwoRixuLHgpO0Q9bChELHEsQSk7Zm9yKHZhciBCPTA7QjxGLmxlbmd0aDtCKyspaWYodShGW0JdLERbQl0pKXJldHVybiExO2Zvcig7MDxDLmxlbmd0aDspe0Q9Qy5wb3AoKTtpZighbShuLm5vZGUoRC5uMSkscS5ub2RlKEQubjIpKSlyZXR1cm4hMTtGPW4uc3VjY2Vzc29ycyhELm4xKTtEPXEuc3VjY2Vzc29ycyhELm4yKTtpZihGLmxlbmd0aCE9PUQubGVuZ3RoKXJldHVybiBjb25zb2xlLmxvZygiIyBvZiBzdWNjZXNzb3JzIG1pc21hdGNoIixGLEQpLCExO0Y9bChGLG4seCk7RD1sKEQscSxBKTtmb3IoQj0wO0I8Ri5sZW5ndGg7QisrKWlmKHUoRltCXSxEW0JdKSlyZXR1cm4hMX1yZXR1cm4hMH0KZnVuY3Rpb24gbShuLHEpe2lmKG4udHlwZT09PWQuTm9kZVR5cGUuTUVUQSlyZXR1cm4gbi50ZW1wbGF0ZUlkJiZxLnRlbXBsYXRlSWQmJm4udGVtcGxhdGVJZD09PXEudGVtcGxhdGVJZDtpZihuLnR5cGU9PT1kLk5vZGVUeXBlLk9QJiZxLnR5cGU9PT1kLk5vZGVUeXBlLk9QKXJldHVybiBuLm9wPT09cS5vcDtpZihuLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUyYmcS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMpe2xldCB1PW4ubWV0YWdyYXBoLm5vZGVDb3VudCgpO3JldHVybiB1PT09cS5tZXRhZ3JhcGgubm9kZUNvdW50KCkmJigwPT09dXx8bi5tZXRhZ3JhcGgubm9kZShuLm1ldGFncmFwaC5ub2RlcygpWzBdKS5vcD09PXEubWV0YWdyYXBoLm5vZGUocS5tZXRhZ3JhcGgubm9kZXMoKVswXSkub3ApfXJldHVybiExfWYuZGV0ZWN0PWZ1bmN0aW9uKG4scSl7bj1rKG4pO2xldCB1PXQobixxKTtyZXR1cm4gT2JqZWN0LmtleXModSkuc29ydCh4PT51W3hdLmxldmVsKS5yZWR1Y2UoKHgsCkEpPT57eFtBXT11W0FdO3JldHVybiB4fSx7fSl9fSkoZC50ZW1wbGF0ZXx8KGQudGVtcGxhdGU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3V0aWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Zi50aW1lPWZ1bmN0aW9uKGgsayl7bGV0IHQ9RGF0ZS5ub3coKTtrPWsoKTtjb25zb2xlLmxvZyhoLCI6IixEYXRlLm5vdygpLXQsIm1zIik7cmV0dXJuIGt9O2YuZ2V0VHJhY2tlcj1mdW5jdGlvbihoKXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihrKXtoLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTpoLnByb2dyZXNzLnZhbHVlLG1zZzprfSl9LHVwZGF0ZVByb2dyZXNzOmZ1bmN0aW9uKGspe2guc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmgucHJvZ3Jlc3MudmFsdWUrayxtc2c6aC5wcm9ncmVzcy5tc2d9KX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oayx0KXtjb25zb2xlLmVycm9yKHQuc3RhY2spO2guc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmgucHJvZ3Jlc3MudmFsdWUsbXNnOmssZXJyb3I6ITB9KX19fTtmLmdldFN1YnRhc2tUcmFja2VyPWZ1bmN0aW9uKGgsayx0KXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihsKXtoLnNldE1lc3NhZ2UodCsKIjogIitsKX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24obCl7aC51cGRhdGVQcm9ncmVzcyhsKmsvMTAwKX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24obCxwKXtoLnJlcG9ydEVycm9yKHQrIjogIitsLHApfX19O2YucnVuVGFzaz1mdW5jdGlvbihoLGspe2suc2V0TWVzc2FnZSgiUmVhZGluZyBtZXRhZGF0YSBwYnR4dCIpO3RyeXtsZXQgdD1iLmdyYXBoLnV0aWwudGltZSgiUmVhZGluZyBtZXRhZGF0YSBwYnR4dCIsaCk7ay51cGRhdGVQcm9ncmVzcyg0MCk7cmV0dXJuIHR9Y2F0Y2godCl7ay5yZXBvcnRFcnJvcigiRmFpbGVkIFJlYWRpbmcgbWV0YWRhdGEgcGJ0eHQiLHQpfX07Zi5ydW5Bc3luY1Rhc2s9ZnVuY3Rpb24oaCxrLHQsbCl7cmV0dXJuIG5ldyBQcm9taXNlKHA9PntsLnNldE1lc3NhZ2UoaCk7c2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtsZXQgbT1iLmdyYXBoLnV0aWwudGltZShoLHQpO2wudXBkYXRlUHJvZ3Jlc3Moayk7cChtKX1jYXRjaChtKXtsLnJlcG9ydEVycm9yKCJGYWlsZWQgIisKaCxtKX19LDIwKX0pfTtmLnJ1bkFzeW5jUHJvbWlzZVRhc2s9ZnVuY3Rpb24oaCxrLHQsbCl7cmV0dXJuIG5ldyBQcm9taXNlKChwLG0pPT57ZnVuY3Rpb24gbihxKXtsLnJlcG9ydEVycm9yKCJGYWlsZWQgIitoLHEpO20ocSl9bC5zZXRNZXNzYWdlKGgpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7bGV0IHE9RGF0ZS5ub3coKTt0KCkudGhlbihmdW5jdGlvbih1KXtjb25zb2xlLmxvZyhoLCI6IixEYXRlLm5vdygpLXEsIm1zIik7bC51cGRhdGVQcm9ncmVzcyhrKTtwKHUpfSkuY2F0Y2gobil9Y2F0Y2gocSl7bihxKX19LDIwKX0pfTtmLmVzY2FwZVF1ZXJ5U2VsZWN0b3I9ZnVuY3Rpb24oaCl7cmV0dXJuIGgucmVwbGFjZSgvKFs6LlxbXF0sL1xcXChcKV0pL2csIlxcJDEiKX07Zi5NRU1PUllfVU5JVFM9W3tzeW1ib2w6IkIifSx7c3ltYm9sOiJLQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiTUIiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IkdCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJUQiIsCm51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IlBCIixudW1Vbml0czoxMDI0fV07Zi5USU1FX1VOSVRTPVt7c3ltYm9sOiJcdTAwYjVzIn0se3N5bWJvbDoibXMiLG51bVVuaXRzOjFFM30se3N5bWJvbDoicyIsbnVtVW5pdHM6MUUzfSx7c3ltYm9sOiJtaW4iLG51bVVuaXRzOjYwfSx7c3ltYm9sOiJociIsbnVtVW5pdHM6NjB9LHtzeW1ib2w6ImRheXMiLG51bVVuaXRzOjI0fV07Zi5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGU9ZnVuY3Rpb24oaCxrLHQ9MCl7cmV0dXJuIHQrMTxrLmxlbmd0aCYmaD49a1t0KzFdLm51bVVuaXRzP2IuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUoaC9rW3QrMV0ubnVtVW5pdHMsayx0KzEpOk51bWJlcihoLnRvUHJlY2lzaW9uKDMpKSsiICIra1t0XS5zeW1ib2x9O2YuaGFzRGlzcGxheWFibGVOb2RlU3RhdHM9ZnVuY3Rpb24oaCl7cmV0dXJuIGgmJigwPGgudG90YWxCeXRlc3x8MDxoLmdldFRvdGFsTWljcm9zKCl8fGgub3V0cHV0U2l6ZSk/CiEwOiExfTtmLnJlbW92ZUNvbW1vblByZWZpeD1mdW5jdGlvbihoKXtpZigyPmgubGVuZ3RoKXJldHVybiBoO2xldCBrPTAsdD0wLGw9Xy5taW4oXy5tYXAoaCxwPT5wLmxlbmd0aCkpO2Zvcig7Oyl7aysrO2xldCBwPV8ubWFwKGgsbT0+bS5zdWJzdHJpbmcoMCxrKSk7aWYocC5ldmVyeSgobSxuKT0+MD09PW4/ITA6bT09PXBbbi0xXSkpe2lmKGs+PWwpcmV0dXJuIGg7dD1rfWVsc2UgYnJlYWt9cmV0dXJuIF8ubWFwKGgscD0+cC5zdWJzdHJpbmcodCkpfTtmLmNvbXB1dGVIdW1hbkZyaWVuZGx5VGltZT1mdW5jdGlvbihoKXtoPStuZXcgRGF0ZS0rbmV3IERhdGUoaC8xRTMpO3JldHVybiAzRTQ+aD8ianVzdCBub3ciOjZFND5oP01hdGguZmxvb3IoaC8xRTMpKyIgc2Vjb25kcyBhZ28iOjEyRTQ+aD8iYSBtaW51dGUgYWdvIjozNkU1Pmg/TWF0aC5mbG9vcihoLzZFNCkrIiBtaW51dGVzIGFnbyI6MT09TWF0aC5mbG9vcihoLzM2RTUpPyJhbiBob3VyIGFnbyI6ODY0RTU+aD9NYXRoLmZsb29yKGgvCjM2RTUpKyIgaG91cnMgYWdvIjoxNzI4RTU+aD8ieWVzdGVyZGF5IjpNYXRoLmZsb29yKGgvODY0RTUpKyIgZGF5cyBhZ28ifX0pKGQudXRpbHx8KGQudXRpbD17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbWluaW1hcC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpe2NsYXNzIGZ7Y29uc3RydWN0b3IoaCxrLHQsbCxwLG0pe3RoaXMuc3ZnPWg7dGhpcy5sYWJlbFBhZGRpbmc9bTt0aGlzLnpvb21HPWs7dGhpcy5tYWluWm9vbT10O3RoaXMubWF4V2FuZEg9cDtoPWQzLnNlbGVjdChsLnNoYWRvd1Jvb3QpO2xldCBuPWguc2VsZWN0KCJzdmciKSxxPW4uc2VsZWN0KCJyZWN0Iik7dGhpcy52aWV3cG9pbnRDb29yZD17eDowLHk6MH07az1kMy5kcmFnKCkuc3ViamVjdChPYmplY3QpLm9uKCJkcmFnIiwoKT0+e3RoaXMudmlld3BvaW50Q29vcmQueD1kMy5ldmVudC54O3RoaXMudmlld3BvaW50Q29vcmQueT1kMy5ldmVudC55O3RoaXMudXBkYXRlVmlld3BvaW50KCl9KTtxLmRhdHVtKHRoaXMudmlld3BvaW50Q29vcmQpLmNhbGwoayk7bi5vbigiY2xpY2siLCgpPT57aWYoIWQzLmV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpe3ZhciB1PU51bWJlcihxLmF0dHIoIndpZHRoIikpLHg9TnVtYmVyKHEuYXR0cigiaGVpZ2h0IikpLApBPWQzLm1vdXNlKG4ubm9kZSgpKTt0aGlzLnZpZXdwb2ludENvb3JkLng9QVswXS11LzI7dGhpcy52aWV3cG9pbnRDb29yZC55PUFbMV0teC8yO3RoaXMudXBkYXRlVmlld3BvaW50KCl9fSk7dGhpcy52aWV3cG9pbnQ9cS5ub2RlKCk7dGhpcy5taW5pbWFwU3ZnPW4ubm9kZSgpO3RoaXMubWluaW1hcD1sO3RoaXMuY2FudmFzPWguc2VsZWN0KCJjYW52YXMuZmlyc3QiKS5ub2RlKCk7dGhpcy5jYW52YXNCdWZmZXI9aC5zZWxlY3QoImNhbnZhcy5zZWNvbmQiKS5ub2RlKCk7dGhpcy5kb3dubG9hZENhbnZhcz1oLnNlbGVjdCgiY2FudmFzLmRvd25sb2FkIikubm9kZSgpO2QzLnNlbGVjdCh0aGlzLmRvd25sb2FkQ2FudmFzKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKTt0aGlzLnVwZGF0ZSgpfXVwZGF0ZVZpZXdwb2ludCgpe2QzLnNlbGVjdCh0aGlzLnZpZXdwb2ludCkuYXR0cigieCIsdGhpcy52aWV3cG9pbnRDb29yZC54KS5hdHRyKCJ5Iix0aGlzLnZpZXdwb2ludENvb3JkLnkpO2xldCBoPQotdGhpcy52aWV3cG9pbnRDb29yZC54KnRoaXMuc2NhbGVNYWluL3RoaXMuc2NhbGVNaW5pbWFwLGs9LXRoaXMudmlld3BvaW50Q29vcmQueSp0aGlzLnNjYWxlTWFpbi90aGlzLnNjYWxlTWluaW1hcDtkMy5zZWxlY3QodGhpcy5zdmcpLmNhbGwodGhpcy5tYWluWm9vbS50cmFuc2Zvcm0sZDMuem9vbUlkZW50aXR5LnRyYW5zbGF0ZShoLGspLnNjYWxlKHRoaXMuc2NhbGVNYWluKSl9dXBkYXRlKCl7bGV0IGg9bnVsbDt0cnl7aWYoaD10aGlzLnpvb21HLmdldEJCb3goKSwwPT09aC53aWR0aClyZXR1cm59Y2F0Y2godSl7cmV0dXJufXZhciBrPWQzLnNlbGVjdCgiI2dyYXBoZG93bmxvYWQiKTt0aGlzLmRvd25sb2FkPWsubm9kZSgpO2sub24oImNsaWNrIiwoKT0+e1VSTC5yZXZva2VPYmplY3RVUkwodGhpcy5kb3dubG9hZC5ocmVmKTt2YXIgdT10aGlzLmRvd25sb2FkQ2FudmFzLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIik7Y29uc3QgeD11LnNsaWNlKDAsdS5pbmRleE9mKCIsIikpO2lmKHguZW5kc1dpdGgoIjtiYXNlNjQiKSl7dmFyIEE9CmF0b2IodS5zbGljZSh1LmluZGV4T2YoIiwiKSsxKSk7dT0obmV3IFVpbnQ4QXJyYXkoQS5sZW5ndGgpKS5tYXAoKHksdyk9PkEuY2hhckNvZGVBdCh3KSk7dGhpcy5kb3dubG9hZC5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3VdLHt0eXBlOiJpbWFnZS9wbmcifSkpfWVsc2UgY29uc29sZS53YXJuKGBub24tYmFzZTY0IGRhdGEgVVJMICgke3h9KTsgY2Fubm90IHVzZSBibG9iIGRvd25sb2FkYCksdGhpcy5kb3dubG9hZC5ocmVmPXV9KTtrPWQzLnNlbGVjdCh0aGlzLnN2Zyk7dmFyIHQ9IiIsbD10aGlzLnN2ZztsPShsLmdldFJvb3ROb2RlP2wuZ2V0Um9vdE5vZGUoKTp0aGlzLnN2Zy5wYXJlbnROb2RlKS5zdHlsZVNoZWV0cztmb3IodmFyIHA9MDtwPGwubGVuZ3RoO3ArKyl0cnl7dmFyIG09bFtwXS5jc3NSdWxlc3x8bFtwXS5ydWxlcztpZihudWxsIT1tKWZvcihsZXQgdT0wO3U8bS5sZW5ndGg7dSsrKXQrPW1bdV0uY3NzVGV4dC5yZXBsYWNlKC8gP3RmLVtcdy1dKyA/L2csCiIiKSsiXG4ifWNhdGNoKHUpe2lmKCJTZWN1cml0eUVycm9yIiE9PXUubmFtZSl0aHJvdyB1O31tPWsuYXBwZW5kKCJzdHlsZSIpO20udGV4dCh0KTt0PWQzLnNlbGVjdCh0aGlzLnpvb21HKTtsPXQuYXR0cigidHJhbnNmb3JtIik7dC5hdHRyKCJ0cmFuc2Zvcm0iLG51bGwpO2guaGVpZ2h0Kz1oLnk7aC53aWR0aCs9aC54O2guaGVpZ2h0Kz0yKnRoaXMubGFiZWxQYWRkaW5nO2gud2lkdGgrPTIqdGhpcy5sYWJlbFBhZGRpbmc7ay5hdHRyKCJ3aWR0aCIsaC53aWR0aCkuYXR0cigiaGVpZ2h0IixoLmhlaWdodCk7dGhpcy5zY2FsZU1pbmltYXA9dGhpcy5tYXhXYW5kSC9NYXRoLm1heChoLndpZHRoLGguaGVpZ2h0KTt0aGlzLm1pbmltYXBTaXplPXt3aWR0aDpoLndpZHRoKnRoaXMuc2NhbGVNaW5pbWFwLGhlaWdodDpoLmhlaWdodCp0aGlzLnNjYWxlTWluaW1hcH07ZDMuc2VsZWN0KHRoaXMubWluaW1hcFN2ZykuYXR0cih0aGlzLm1pbmltYXBTaXplKTtkMy5zZWxlY3QodGhpcy5jYW52YXNCdWZmZXIpLmF0dHIodGhpcy5taW5pbWFwU2l6ZSk7CnA9ZDMuc2VsZWN0KHRoaXMuZG93bmxvYWRDYW52YXMpO3Auc3R5bGUoIndpZHRoIixoLndpZHRoKTtwLnN0eWxlKCJoZWlnaHQiLGguaGVpZ2h0KTtwLmF0dHIoIndpZHRoIiwzKmgud2lkdGgpO3AuYXR0cigiaGVpZ2h0IiwzKmguaGVpZ2h0KTtudWxsIT10aGlzLnRyYW5zbGF0ZSYmbnVsbCE9dGhpcy56b29tJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMuem9vbSgpKTtsZXQgbj0obmV3IFhNTFNlcmlhbGl6ZXIpLnNlcmlhbGl6ZVRvU3RyaW5nKHRoaXMuc3ZnKTttLnJlbW92ZSgpO2suYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCk7dC5hdHRyKCJ0cmFuc2Zvcm0iLGwpO2xldCBxPW5ldyBJbWFnZTtxLm9ubG9hZD0oKT0+e3ZhciB1PXRoaXMuY2FudmFzQnVmZmVyLmdldENvbnRleHQoIjJkIik7dS5jbGVhclJlY3QoMCwwLHRoaXMuY2FudmFzQnVmZmVyLndpZHRoLHRoaXMuY2FudmFzQnVmZmVyLmhlaWdodCk7dS5kcmF3SW1hZ2UocSwwLDAsdGhpcy5taW5pbWFwU2l6ZS53aWR0aCwKdGhpcy5taW5pbWFwU2l6ZS5oZWlnaHQpO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2QzLnNlbGVjdCh0aGlzLmNhbnZhc0J1ZmZlcikuc3R5bGUoImRpc3BsYXkiLG51bGwpO2QzLnNlbGVjdCh0aGlzLmNhbnZhcykuc3R5bGUoImRpc3BsYXkiLCJub25lIik7W3RoaXMuY2FudmFzLHRoaXMuY2FudmFzQnVmZmVyXT1bdGhpcy5jYW52YXNCdWZmZXIsdGhpcy5jYW52YXNdfSk7dT10aGlzLmRvd25sb2FkQ2FudmFzLmdldENvbnRleHQoIjJkIik7dS5jbGVhclJlY3QoMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpO3UuZHJhd0ltYWdlKHEsMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpfTtxLm9uZXJyb3I9KCk9PntxLnNyYz1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtuXSx7dHlwZToiaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0XHgzZHV0Zi04In0pKX07cS5zcmM9CiJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldFx4M2R1dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChuKX16b29tKGgpe2lmKG51bGwhPXRoaXMuc2NhbGVNaW5pbWFwKXtoJiYodGhpcy50cmFuc2xhdGU9W2gueCxoLnldLHRoaXMuc2NhbGVNYWluPWguayk7dmFyIGs9dGhpcy5zdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdD1kMy5zZWxlY3QodGhpcy52aWV3cG9pbnQpO3RoaXMudmlld3BvaW50Q29vcmQueD0tdGhpcy50cmFuc2xhdGVbMF0qdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47dGhpcy52aWV3cG9pbnRDb29yZC55PS10aGlzLnRyYW5zbGF0ZVsxXSp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtoPWsud2lkdGgqdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47az1rLmhlaWdodCp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjt0LmF0dHIoIngiLHRoaXMudmlld3BvaW50Q29vcmQueCkuYXR0cigieSIsdGhpcy52aWV3cG9pbnRDb29yZC55KS5hdHRyKCJ3aWR0aCIsCmgpLmF0dHIoImhlaWdodCIsayk7dD10aGlzLm1pbmltYXBTaXplLndpZHRoO3ZhciBsPXRoaXMubWluaW1hcFNpemUuaGVpZ2h0LHA9dGhpcy52aWV3cG9pbnRDb29yZC54LG09dGhpcy52aWV3cG9pbnRDb29yZC55Oy44PihNYXRoLm1pbihNYXRoLm1heCgwLHAraCksdCktTWF0aC5taW4oTWF0aC5tYXgoMCxwKSx0KSkqKE1hdGgubWluKE1hdGgubWF4KDAsbStrKSxsKS1NYXRoLm1pbihNYXRoLm1heCgwLG0pLGwpKS8odCpsKT90aGlzLm1pbmltYXAuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik6dGhpcy5taW5pbWFwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfX19ZC5NaW5pbWFwPWZ9KShiLnNjZW5lfHwoYi5zY2VuZT17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoL3RmLWdyYXBoLW1pbmltYXAuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtbWluaW1hcCIsaW5pdDpmdW5jdGlvbihiLGQsZixoLGspe3JldHVybiBuZXcgdGYuc2NlbmUuTWluaW1hcChiLGQsZix0aGlzLGgsayl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGgtc2NlbmUuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtc2NlbmUiLHByb3BlcnRpZXM6e3JlbmRlckhpZXJhcmNoeTpPYmplY3QsbmFtZTpTdHJpbmcsY29sb3JCeTpTdHJpbmcsdHJhY2VJbnB1dHM6Qm9vbGVhbixfaGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2U6Qm9vbGVhbixfaXNBdHRhY2hlZDpCb29sZWFuLF96b29tOk9iamVjdCxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZCJ9LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9zZWxlY3RlZE5vZGVDaGFuZ2VkIn0saGFuZGxlRWRnZVNlbGVjdGVkOk9iamVjdCxfem9vbWVkOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9vblpvb21DaGFuZ2VkIix2YWx1ZTohMX0sX3pvb21TdGFydENvb3Jkczp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3pvb21UcmFuc2Zvcm06e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9tYXhab29tRGlzdGFuY2VGb3JDbGljazp7dHlwZTpOdW1iZXIsCnZhbHVlOjIwfSx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9uLG1pbmltYXA6T2JqZWN0LF9ub2RlR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9hbm5vdGF0aW9uR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9lZGdlR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LG1heE1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6OX0sbWluTWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo2fSxtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoTGFyZ2VGb250Ont0eXBlOk51bWJlcix2YWx1ZToxMX0sbWF4TWV0YW5vZGVMYWJlbExlbmd0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MTh9LHByb2dyZXNzOk9iamVjdCxub2RlQ29udGV4dE1lbnVJdGVtczpBcnJheSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCwKaGVhbHRoUGlsbFN0ZXBJbmRleDpOdW1iZXJ9LG9ic2VydmVyczpbIl9jb2xvckJ5Q2hhbmdlZChjb2xvckJ5KSIsIl9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkKHJlbmRlckhpZXJhcmNoeSkiLCJfYW5pbWF0ZUFuZEZpdChfaXNBdHRhY2hlZCwgcmVuZGVySGllcmFyY2h5KSIsIl91cGRhdGVIZWFsdGhQaWxscyhub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4KSIsIl91cGRhdGVJbnB1dFRyYWNlKHRyYWNlSW5wdXRzLCBzZWxlY3RlZE5vZGUpIl0sZ2V0Tm9kZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShiKX0saXNOb2RlRXhwYW5kZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZXhwYW5kZWR9LHNldE5vZGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2J1aWxkKHRoaXMucmVuZGVySGllcmFyY2h5KTt0aGlzLl91cGRhdGVMYWJlbHMoIXRoaXMuX3pvb21lZCl9LHBhblRvTm9kZShiKXt0Zi5ncmFwaC5zY2VuZS5wYW5Ub05vZGUoYiwKdGhpcy4kLnN2Zyx0aGlzLiQucm9vdCx0aGlzLl96b29tKSYmKHRoaXMuX3pvb21lZD0hMCl9LGdldEdyYXBoU3ZnUm9vdCgpe3JldHVybiB0aGlzLiQuc3ZnfSxnZXRDb250ZXh0TWVudSgpe3JldHVybiB0aGlzLiQuY29udGV4dE1lbnV9LF9yZXNldFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fbm9kZUdyb3VwSW5kZXg9e307dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXg9e307dGhpcy5fZWRnZUdyb3VwSW5kZXg9e307dGhpcy5fdXBkYXRlTGFiZWxzKCExKTtkMy5zZWxlY3QodGhpcy4kLnN2Zykuc2VsZWN0KCIjcm9vdCIpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3RmLmdyYXBoLnNjZW5lLm5vZGUucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucyh0aGlzLiQuc3ZnKX0sX2J1aWxkOmZ1bmN0aW9uKGIpe3RoaXMudGVtcGxhdGVJbmRleD1iLmhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCk7dGYuZ3JhcGgudXRpbC50aW1lKCJ0Zi1ncmFwaC1zY2VuZSAobGF5b3V0KToiLGZ1bmN0aW9uKCl7dGYuZ3JhcGgubGF5b3V0LmxheW91dFNjZW5lKGIucm9vdCwKdGhpcyl9LmJpbmQodGhpcykpO3RmLmdyYXBoLnV0aWwudGltZSgidGYtZ3JhcGgtc2NlbmUgKGJ1aWxkIHNjZW5lKToiLGZ1bmN0aW9uKCl7dGYuZ3JhcGguc2NlbmUuYnVpbGRHcm91cChkMy5zZWxlY3QodGhpcy4kLnJvb3QpLGIucm9vdCx0aGlzKTt0Zi5ncmFwaC5zY2VuZS5hZGRHcmFwaENsaWNrTGlzdGVuZXIodGhpcy4kLnN2Zyx0aGlzKTt0aGlzLl91cGRhdGVJbnB1dFRyYWNlKCl9LmJpbmQodGhpcykpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVIZWFsdGhQaWxscyh0aGlzLm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsdGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4KTt0aGlzLm1pbmltYXAudXBkYXRlKCl9LmJpbmQodGhpcyksdGYuZ3JhcGgubGF5b3V0LlBBUkFNUy5hbmltYXRpb24uZHVyYXRpb24pfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3pvb209ZDMuem9vbSgpLm9uKCJlbmQiLGZ1bmN0aW9uKCl7dGhpcy5fem9vbVN0YXJ0Q29vcmRzJiYoTWF0aC5zcXJ0KE1hdGgucG93KHRoaXMuX3pvb21TdGFydENvb3Jkcy54LQp0aGlzLl96b29tVHJhbnNmb3JtLngsMikrTWF0aC5wb3codGhpcy5fem9vbVN0YXJ0Q29vcmRzLnktdGhpcy5fem9vbVRyYW5zZm9ybS55LDIpKTx0aGlzLl9tYXhab29tRGlzdGFuY2VGb3JDbGljaz90aGlzLl9maXJlRW5hYmxlQ2xpY2soKTpzZXRUaW1lb3V0KHRoaXMuX2ZpcmVFbmFibGVDbGljay5iaW5kKHRoaXMpLDUwKSk7dGhpcy5fem9vbVN0YXJ0Q29vcmRzPW51bGx9LmJpbmQodGhpcykpLm9uKCJ6b29tIixmdW5jdGlvbigpe3RoaXMuX3pvb21UcmFuc2Zvcm09ZDMuZXZlbnQudHJhbnNmb3JtO3RoaXMuX3pvb21TdGFydENvb3Jkc3x8KHRoaXMuX3pvb21TdGFydENvb3Jkcz10aGlzLl96b29tVHJhbnNmb3JtLHRoaXMuZmlyZSgiZGlzYWJsZS1jbGljayIpKTt0aGlzLl96b29tZWQ9ITA7ZDMuc2VsZWN0KHRoaXMuJC5yb290KS5hdHRyKCJ0cmFuc2Zvcm0iLGQzLmV2ZW50LnRyYW5zZm9ybSk7dGhpcy5taW5pbWFwLnpvb20oZDMuZXZlbnQudHJhbnNmb3JtKX0uYmluZCh0aGlzKSk7CmQzLnNlbGVjdCh0aGlzLiQuc3ZnKS5jYWxsKHRoaXMuX3pvb20pLm9uKCJkYmxjbGljay56b29tIixudWxsKTtkMy5zZWxlY3Qod2luZG93KS5vbigicmVzaXplIixmdW5jdGlvbigpe3RoaXMubWluaW1hcC56b29tKCl9LmJpbmQodGhpcykpO3RoaXMubWluaW1hcD10aGlzLiQubWluaW1hcC5pbml0KHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLm1pbmltYXAuc2l6ZSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLnN1YnNjZW5lLm1ldGEubGFiZWxIZWlnaHQpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITEpfSxfcmVuZGVySGllcmFyY2h5Q2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZT0hMTt0aGlzLl9yZXNldFN0YXRlKCk7dGhpcy5fYnVpbGQoYil9LF9hbmltYXRlQW5kRml0OmZ1bmN0aW9uKGIpeyF0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZSYmCmImJnNldFRpbWVvdXQodGhpcy5maXQuYmluZCh0aGlzKSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9LF91cGRhdGVMYWJlbHM6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy4kJCgiLnRpdGxlIiksZj1kLnN0eWxlLGg9dGhpcy4kJCgiLmF1eFRpdGxlIiksaz1oLnN0eWxlLHQ9dGhpcy4kJCgiLmZ1bmN0aW9uTGlicmFyeVRpdGxlIikuc3R5bGU7Y29uc3QgbD1kMy5zZWxlY3QodGhpcy4kLnN2Zyk7dmFyIHA9bC5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuQ09SRSkubm9kZSgpO2lmKGImJnAmJnRoaXMucHJvZ3Jlc3MmJjEwMD09PXRoaXMucHJvZ3Jlc3MudmFsdWUpe2I9bC5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuSU5FWFRSQUNUKS5ub2RlKCl8fGwuc2VsZWN0KCIuIisKdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKS5ub2RlKCk7dmFyIG09cC5nZXRDVE0oKS5lO3A9Yj9iLmdldENUTSgpLmU6bnVsbDtmLmRpc3BsYXk9ImlubGluZSI7Zi5sZWZ0PW0rInB4IjtudWxsIT09cCYmcCE9PW0/KGsuZGlzcGxheT0iaW5saW5lIixwPU1hdGgubWF4KG0rZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxwKSxrLmxlZnQ9cCsicHgiKTprLmRpc3BsYXk9Im5vbmUiO2Q9KGQ9bC5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSkubm9kZSgpKT9kLmdldENUTSgpLmU6bnVsbDtudWxsIT09ZCYmZCE9PXA/KHQuZGlzcGxheT0iaW5saW5lIixkPU1hdGgubWF4KHAraC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxkKSx0LmxlZnQ9ZCsicHgiKToKdC5kaXNwbGF5PSJub25lIn1lbHNlIGYuZGlzcGxheT0ibm9uZSIsay5kaXNwbGF5PSJub25lIix0LmRpc3BsYXk9Im5vbmUifSxfY29sb3JCeUNoYW5nZWQ6ZnVuY3Rpb24oKXtudWxsIT10aGlzLnJlbmRlckhpZXJhcmNoeSYmKF8uZWFjaCh0aGlzLl9ub2RlR3JvdXBJbmRleCwoYixkKT0+e3RoaXMuX3VwZGF0ZU5vZGVTdGF0ZShkKX0pLHRoaXMubWluaW1hcC51cGRhdGUoKSl9LGZpdDpmdW5jdGlvbigpe3RoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlPSEwO3RmLmdyYXBoLnNjZW5lLmZpdCh0aGlzLiQuc3ZnLHRoaXMuJC5yb290LHRoaXMuX3pvb20sZnVuY3Rpb24oKXt0aGlzLl96b29tZWQ9ITF9LmJpbmQodGhpcykpfSxpc05vZGVTZWxlY3RlZDpmdW5jdGlvbihiKXtyZXR1cm4gYj09PXRoaXMuc2VsZWN0ZWROb2RlfSxpc05vZGVIaWdobGlnaHRlZDpmdW5jdGlvbihiKXtyZXR1cm4gYj09PXRoaXMuaGlnaGxpZ2h0ZWROb2RlfSxhZGRBbm5vdGF0aW9uR3JvdXA6ZnVuY3Rpb24oYiwKZCxmKXtiPWIubm9kZS5uYW1lO3RoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdPXRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdfHx7fTt0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFtiXVtkLm5vZGUubmFtZV09Zn0sZ2V0QW5ub3RhdGlvbkdyb3Vwc0luZGV4OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFtiXX0scmVtb3ZlQW5ub3RhdGlvbkdyb3VwOmZ1bmN0aW9uKGIsZCl7ZGVsZXRlIHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2Iubm9kZS5uYW1lXVtkLm5vZGUubmFtZV19LGFkZE5vZGVHcm91cDpmdW5jdGlvbihiLGQpe3RoaXMuX25vZGVHcm91cEluZGV4W2JdPWR9LGdldE5vZGVHcm91cDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fbm9kZUdyb3VwSW5kZXhbYl19LHJlbW92ZU5vZGVHcm91cDpmdW5jdGlvbihiKXtkZWxldGUgdGhpcy5fbm9kZUdyb3VwSW5kZXhbYl19LGFkZEVkZ2VHcm91cDpmdW5jdGlvbihiLGQpe3RoaXMuX2VkZ2VHcm91cEluZGV4W2JdPQpkfSxnZXRFZGdlR3JvdXA6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2VkZ2VHcm91cEluZGV4W2JdfSxfdXBkYXRlSGVhbHRoUGlsbHM6ZnVuY3Rpb24oYixkKXt0Zi5ncmFwaC5zY2VuZS5hZGRIZWFsdGhQaWxscyh0aGlzLiQuc3ZnLGIsZCl9LF91cGRhdGVOb2RlU3RhdGU6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5nZXROb2RlKGIpLGY9dGhpcy5nZXROb2RlR3JvdXAoYik7ZiYmdGYuZ3JhcGguc2NlbmUubm9kZS5zdHlsaXplKGYsZCx0aGlzKTtkLm5vZGUudHlwZT09PXRmLmdyYXBoLk5vZGVUeXBlLk1FVEEmJmQubm9kZS5hc3NvY2lhdGVkRnVuY3Rpb24mJiFkLmlzTGlicmFyeUZ1bmN0aW9uJiYoZj1kMy5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSsnIGdbZGF0YS1uYW1lXHgzZCInKyh0Zi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKwpkLm5vZGUuYXNzb2NpYXRlZEZ1bmN0aW9uKSsnIl0nKSx0Zi5ncmFwaC5zY2VuZS5ub2RlLnN0eWxpemUoZixkLHRoaXMpKTtfLmVhY2godGhpcy5nZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXgoYiksaD0+e3RmLmdyYXBoLnNjZW5lLm5vZGUuc3R5bGl6ZShoLGQsdGhpcyx0Zi5ncmFwaC5zY2VuZS5DbGFzcy5Bbm5vdGF0aW9uLk5PREUpfSl9LF9zZWxlY3RlZE5vZGVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7aWYoYiE9PWQmJihkJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoZCksYikpe3RoaXMubWluaW1hcC51cGRhdGUoKTtkPXRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5ub2RlKGIpO2Zvcih2YXIgZj1bXTtudWxsIT1kLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5uYW1lIT10Zi5ncmFwaC5ST09UX05BTUU7KWQ9ZC5wYXJlbnROb2RlLGYucHVzaChkLm5hbWUpO3ZhciBoO18uZm9yRWFjaFJpZ2h0KGYsaz0+e3RoaXMucmVuZGVySGllcmFyY2h5LmJ1aWxkU3ViaGllcmFyY2h5KGspOwprPXRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUoayk7ay5ub2RlLmlzR3JvdXBOb2RlJiYhay5leHBhbmRlZCYmKGsuZXhwYW5kZWQ9ITAsaHx8KGg9aykpfSk7aCYmKHRoaXMuc2V0Tm9kZUV4cGFuZGVkKGgpLHRoaXMuX3pvb21lZD0hMCk7YiYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKGIpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLnBhblRvTm9kZShiKX0sdGYuZ3JhcGgubGF5b3V0LlBBUkFNUy5hbmltYXRpb24uZHVyYXRpb24pfX0sX2hpZ2hsaWdodGVkTm9kZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtiIT09ZCYmKGImJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShiKSxkJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoZCkpfSxfb25ab29tQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUxhYmVscyghdGhpcy5fem9vbWVkKX0sX2ZpcmVFbmFibGVDbGljazpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZW5hYmxlLWNsaWNrIil9LF91cGRhdGVJbnB1dFRyYWNlOmZ1bmN0aW9uKCl7dGYuZ3JhcGguc2NlbmUubm9kZS51cGRhdGVJbnB1dFRyYWNlKHRoaXMuZ2V0R3JhcGhTdmdSb290KCksCnRoaXMucmVuZGVySGllcmFyY2h5LHRoaXMuc2VsZWN0ZWROb2RlLHRoaXMudHJhY2VJbnB1dHMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoL3RmLWdyYXBoLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfZ3JhcGhDaGFuZ2VkIn0sYmFzaWNHcmFwaDpPYmplY3Qsc3RhdHM6T2JqZWN0LGRldmljZXNGb3JTdGF0czpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxwcm9ncmVzczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSx0aXRsZTpTdHJpbmcsc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkRWRnZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxfbGFzdFNlbGVjdGVkRWRnZUdyb3VwOk9iamVjdCxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sY29sb3JCeTpTdHJpbmcsY29sb3JCeVBhcmFtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxyZW5kZXJIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sdHJhY2VJbnB1dHM6Qm9vbGVhbiwKbm9kZUNvbnRleHRNZW51SXRlbXM6QXJyYXksX3JlbmRlckRlcHRoOnt0eXBlOk51bWJlcix2YWx1ZToxfSxfYWxsb3dHcmFwaFNlbGVjdDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxoZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcixlZGdlV2lkdGhGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LGhhbmRsZU5vZGVTZWxlY3RlZDp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LGVkZ2VMYWJlbEZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0saGFuZGxlRWRnZVNlbGVjdGVkOnt0eXBlOk9iamVjdCx2YWx1ZToiIn19LG9ic2VydmVyczpbIl9zdGF0c0NoYW5nZWQoc3RhdHMsIGRldmljZXNGb3JTdGF0cykiLCJfYnVpbGROZXdSZW5kZXJIaWVyYXJjaHkoZ3JhcGhIaWVyYXJjaHksIGVkZ2VXaWR0aEZ1bmN0aW9uLCBoYW5kbGVOb2RlU2VsZWN0ZWQsIGVkZ2VMYWJlbEZ1bmN0aW9uLCBoYW5kbGVFZGdlU2VsZWN0ZWQpIiwiX3NlbGVjdGVkTm9kZUNoYW5nZWQoc2VsZWN0ZWROb2RlKSIsCiJfc2VsZWN0ZWRFZGdlQ2hhbmdlZChzZWxlY3RlZEVkZ2UpIl0scGFuVG9Ob2RlKGIpe3RoaXMuJCQoInRmLWdyYXBoLXNjZW5lIikucGFuVG9Ob2RlKGIpfSxfYnVpbGROZXdSZW5kZXJIaWVyYXJjaHkoYil7YiYmdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkoYil9LF9zdGF0c0NoYW5nZWQ6ZnVuY3Rpb24oYixkKXt0aGlzLmdyYXBoSGllcmFyY2h5JiYoYiYmZCYmKHRmLmdyYXBoLmpvaW5TdGF0c0luZm9XaXRoR3JhcGgodGhpcy5iYXNpY0dyYXBoLGIsZCksdGYuZ3JhcGguaGllcmFyY2h5LmpvaW5BbmRBZ2dyZWdhdGVTdGF0cyh0aGlzLmdyYXBoSGllcmFyY2h5KSksdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodGhpcy5ncmFwaEhpZXJhcmNoeSkpfSxfYnVpbGRSZW5kZXJIaWVyYXJjaHk6ZnVuY3Rpb24oYil7dGYuZ3JhcGgudXRpbC50aW1lKCJuZXcgdGYuZ3JhcGgucmVuZGVyLkhpZXJhcmNoeSIsZnVuY3Rpb24oKXtmdW5jdGlvbiBkKGgpe3JldHVybnttaW5WYWx1ZTpoLmRvbWFpbigpWzBdLAptYXhWYWx1ZTpoLmRvbWFpbigpWzFdLHN0YXJ0Q29sb3I6aC5yYW5nZSgpWzBdLGVuZENvbG9yOmgucmFuZ2UoKVsxXX19aWYoYi5yb290LnR5cGU9PT10Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBKXt2YXIgZj1uZXcgdGYuZ3JhcGgucmVuZGVyLlJlbmRlckdyYXBoSW5mbyhiLCEhdGhpcy5zdGF0cyk7Zi5lZGdlTGFiZWxGdW5jdGlvbj10aGlzLmVkZ2VMYWJlbEZ1bmN0aW9uO2YuZWRnZVdpZHRoRnVuY3Rpb249dGhpcy5lZGdlV2lkdGhGdW5jdGlvbjt0aGlzLl9zZXRDb2xvckJ5UGFyYW1zKHtjb21wdXRlX3RpbWU6ZChmLmNvbXB1dGVUaW1lU2NhbGUpLG1lbW9yeTpkKGYubWVtb3J5VXNhZ2VTY2FsZSksZGV2aWNlOl8ubWFwKGYuZGV2aWNlQ29sb3JNYXAuZG9tYWluKCksZnVuY3Rpb24oaCl7cmV0dXJue2RldmljZTpoLGNvbG9yOmYuZGV2aWNlQ29sb3JNYXAoaCl9fSkseGxhX2NsdXN0ZXI6Xy5tYXAoZi54bGFDbHVzdGVyQ29sb3JNYXAuZG9tYWluKCksZnVuY3Rpb24oaCl7cmV0dXJue3hsYV9jbHVzdGVyOmgsCmNvbG9yOmYueGxhQ2x1c3RlckNvbG9yTWFwKGgpfX0pfSk7dGhpcy5fc2V0UmVuZGVySGllcmFyY2h5KGYpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmZpcmUoInJlbmRlcmVkIil9KX19LmJpbmQodGhpcykpfSxfZ2V0VmlzaWJsZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnJlbmRlckhpZXJhcmNoeS5nZXROZWFyZXN0VmlzaWJsZUFuY2VzdG9yKGIpOmJ9LGxpc3RlbmVyczp7ImdyYXBoLXNlbGVjdCI6Il9ncmFwaFNlbGVjdGVkIiwiZGlzYWJsZS1jbGljayI6Il9kaXNhYmxlQ2xpY2siLCJlbmFibGUtY2xpY2siOiJfZW5hYmxlQ2xpY2siLCJub2RlLXRvZ2dsZS1leHBhbmQiOiJfbm9kZVRvZ2dsZUV4cGFuZCIsIm5vZGUtc2VsZWN0IjoiX25vZGVTZWxlY3RlZCIsIm5vZGUtaGlnaGxpZ2h0IjoiX25vZGVIaWdobGlnaHRlZCIsIm5vZGUtdW5oaWdobGlnaHQiOiJfbm9kZVVuaGlnaGxpZ2h0ZWQiLCJub2RlLXRvZ2dsZS1leHRyYWN0IjoiX25vZGVUb2dnbGVFeHRyYWN0IiwKIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIjoiX25vZGVUb2dnbGVTZXJpZXNHcm91cCIsImVkZ2Utc2VsZWN0IjoiX2VkZ2VTZWxlY3RlZCIsImFubm90YXRpb24tc2VsZWN0IjoiX25vZGVTZWxlY3RlZCIsImFubm90YXRpb24taGlnaGxpZ2h0IjoiX25vZGVIaWdobGlnaHRlZCIsImFubm90YXRpb24tdW5oaWdobGlnaHQiOiJfbm9kZVVuaGlnaGxpZ2h0ZWQifSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLiQuc2NlbmUuZml0KCl9LF9ncmFwaENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImdyYXBoLXNlbGVjdCIpfSxfZ3JhcGhTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJih0aGlzLnNldCgic2VsZWN0ZWROb2RlIixudWxsKSx0aGlzLnNldCgic2VsZWN0ZWRFZGdlIixudWxsKSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX2Rpc2FibGVDbGljazpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITF9LF9lbmFibGVDbGljazpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9CiEwfSxfc2VsZWN0ZWROb2RlQ2hhbmdlZChiKXt0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZCYmdGhpcy5oYW5kbGVOb2RlU2VsZWN0ZWQoYil9LF9zZWxlY3RlZEVkZ2VDaGFuZ2VkKGIpe3RoaXMuX2Rlc2VsZWN0UHJldmlvdXNFZGdlKCk7YiYmKHRoaXMuX2xhc3RTZWxlY3RlZEVkZ2VHcm91cC5jbGFzc2VkKHRmLmdyYXBoLnNjZW5lLkNsYXNzLkVkZ2UuU0VMRUNURUQsITApLHRoaXMuX3VwZGF0ZU1hcmtlck9mU2VsZWN0ZWRFZGdlKGIpKTt0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZCYmdGhpcy5oYW5kbGVFZGdlU2VsZWN0ZWQoYil9LF9ub2RlU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmdGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsYi5kZXRhaWwubmFtZSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX2VkZ2VTZWxlY3RlZChiKXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiYodGhpcy5zZXQoIl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAiLGIuZGV0YWlsLmVkZ2VHcm91cCksCnRoaXMuc2V0KCJzZWxlY3RlZEVkZ2UiLGIuZGV0YWlsLmVkZ2VEYXRhKSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX25vZGVIaWdobGlnaHRlZDpmdW5jdGlvbihiKXt0aGlzLnNldCgiaGlnaGxpZ2h0ZWROb2RlIixiLmRldGFpbC5uYW1lKX0sX25vZGVVbmhpZ2hsaWdodGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoImhpZ2hsaWdodGVkTm9kZSIsbnVsbCl9LF9ub2RlVG9nZ2xlRXhwYW5kOmZ1bmN0aW9uKGIpe3RoaXMuX25vZGVTZWxlY3RlZChiKTtiPWIuZGV0YWlsLm5hbWU7dmFyIGQ9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShiKTtkLm5vZGUudHlwZSE9PXRmLmdyYXBoLk5vZGVUeXBlLk9QJiYodGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkoYiksZC5leHBhbmRlZD0hZC5leHBhbmRlZCx0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy4kLnNjZW5lLnNldE5vZGVFeHBhbmRlZChkKX0sNzUpKX0sX25vZGVUb2dnbGVFeHRyYWN0OmZ1bmN0aW9uKGIpe3RoaXMubm9kZVRvZ2dsZUV4dHJhY3QoYi5kZXRhaWwubmFtZSl9LApub2RlVG9nZ2xlRXh0cmFjdDpmdW5jdGlvbihiKXtiPXRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUoYik7Yi5ub2RlLmluY2x1ZGU9Yi5ub2RlLmluY2x1ZGU9PXRmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERT90Zi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU6Yi5ub2RlLmluY2x1ZGU9PXRmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERT90Zi5ncmFwaC5JbmNsdXNpb25UeXBlLklOQ0xVREU6dGhpcy5yZW5kZXJIaWVyYXJjaHkuaXNOb2RlQXV4aWxpYXJ5KGIpP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERTp0Zi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU7dGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodGhpcy5ncmFwaEhpZXJhcmNoeSl9LF9ub2RlVG9nZ2xlU2VyaWVzR3JvdXA6ZnVuY3Rpb24oYil7dGhpcy5ub2RlVG9nZ2xlU2VyaWVzR3JvdXAoYi5kZXRhaWwubmFtZSl9LG5vZGVUb2dnbGVTZXJpZXNHcm91cDpmdW5jdGlvbihiKXt0Zi5ncmFwaC50b2dnbGVOb2RlU2VyaWVzR3JvdXAodGhpcy5oaWVyYXJjaHlQYXJhbXMuc2VyaWVzTWFwLApiKTt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pO3RmLmdyYXBoLmhpZXJhcmNoeS5idWlsZCh0aGlzLmJhc2ljR3JhcGgsdGhpcy5oaWVyYXJjaHlQYXJhbXMsdGYuZ3JhcGgudXRpbC5nZXRTdWJ0YXNrVHJhY2tlcih0Zi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcyksMTAwLCJOYW1lc3BhY2UgaGllcmFyY2h5IikpLnRoZW4oZnVuY3Rpb24oZCl7dGhpcy5zZXQoImdyYXBoSGllcmFyY2h5IixkKTt0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KX0uYmluZCh0aGlzKSl9LF9kZXNlbGVjdFByZXZpb3VzRWRnZSgpe2QzLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuRWRnZS5TRUxFQ1RFRCkuY2xhc3NlZCh0Zi5ncmFwaC5zY2VuZS5DbGFzcy5FZGdlLlNFTEVDVEVELCExKS5lYWNoKGI9PntpZihiLmxhYmVsKXtjb25zdCBkPWQzLnNlbGVjdCh0aGlzKS5zZWxlY3RBbGwoInBhdGguZWRnZWxpbmUiKTtiLmxhYmVsLnN0YXJ0TWFya2VySWQmJgpkLnN0eWxlKCJtYXJrZXItc3RhcnQiLGB1cmwoIyR7Yi5sYWJlbC5zdGFydE1hcmtlcklkfSlgKTtiLmxhYmVsLmVuZE1hcmtlcklkJiZkLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke2IubGFiZWwuZW5kTWFya2VySWR9KWApfX0pfSxfdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UoYil7aWYoYi5sYWJlbCl7dmFyIGQ9Yi5sYWJlbC5zdGFydE1hcmtlcklkfHxiLmxhYmVsLmVuZE1hcmtlcklkO2lmKGQpe2NvbnN0IGY9ZC5yZXBsYWNlKCJkYXRhZmxvdy0iLCJzZWxlY3RlZC0iKTtsZXQgaD10aGlzLiQkKCIjIitmKTtofHwoZD10aGlzLiQuc2NlbmUucXVlcnlTZWxlY3RvcigiIyIrZCksaD1kLmNsb25lTm9kZSghMCksaC5zZXRBdHRyaWJ1dGUoImlkIixmKSxoLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkLWFycm93aGVhZCIpLGQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChoKSk7Yj1iLmxhYmVsLnN0YXJ0TWFya2VySWQ/Im1hcmtlci1zdGFydCI6Im1hcmtlci1lbmQiO3RoaXMuX2xhc3RTZWxlY3RlZEVkZ2VHcm91cC5zZWxlY3RBbGwoInBhdGguZWRnZWxpbmUiKS5zdHlsZShiLApgdXJsKCMke2Z9KWApfX19LG5vdDpmdW5jdGlvbihiKXtyZXR1cm4hYn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1sb2FkZXIvdGYtZ3JhcGgtbG9hZGVyLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLWxvYWRlciIsX3RlbXBsYXRlOm51bGwscHJvcGVydGllczp7ZGF0YXNldHM6QXJyYXksc2VsZWN0ZWREYXRhOnt0eXBlOk51bWJlcix2YWx1ZTowfSxzZWxlY3RlZEZpbGU6T2JqZWN0LGNvbXBhdGliaWxpdHlQcm92aWRlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBiLmdyYXBoLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcn0sb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtczp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LHByb2dyZXNzOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG91dEdyYXBoSGllcmFyY2h5Ont0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LG91dEdyYXBoOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LG91dEhpZXJhcmNoeVBhcmFtczp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX2xvYWREYXRhKGRhdGFzZXRzLCBzZWxlY3RlZERhdGEsIG92ZXJyaWRpbmdIaWVyYXJjaHlQYXJhbXMsIGNvbXBhdGliaWxpdHlQcm92aWRlcikiLAoiX2xvYWRGaWxlKHNlbGVjdGVkRmlsZSwgb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtcywgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSJdLF9sb2FkRGF0YSgpe3RoaXMuZGVib3VuY2UoImxvYWQiLCgpPT57Y29uc3QgZj10aGlzLmRhdGFzZXRzW3RoaXMuc2VsZWN0ZWREYXRhXTtmJiZ0aGlzLl9wYXJzZUFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKGYucGF0aCl9KX0sX3BhcnNlQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZixoKXtjb25zdCBrPXRoaXMub3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtcyx0PXRoaXMuY29tcGF0aWJpbGl0eVByb3ZpZGVyO3RoaXMucHJvZ3Jlc3M9e3ZhbHVlOjAsbXNnOiIifTtjb25zdCBsPWIuZ3JhcGgudXRpbC5nZXRUcmFja2VyKHRoaXMpLHA9T2JqZWN0LmFzc2lnbih7fSxiLmdyYXBoLmhpZXJhcmNoeS5EZWZhdWx0SGllcmFyY2h5UGFyYW1zLGspO2IuZ3JhcGgubG9hZGVyLmZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgobCwKZixoLHQscCkudGhlbigoe2dyYXBoOm0sZ3JhcGhIaWVyYXJjaHk6bn0pPT57dGhpcy5fc2V0T3V0SGllcmFyY2h5UGFyYW1zKHApO3RoaXMuX3NldE91dEdyYXBoKG0pO3RoaXMuX3NldE91dEdyYXBoSGllcmFyY2h5KG4pfSl9LF9sb2FkRmlsZShmKXtpZihmKXtmPWYudGFyZ2V0O3ZhciBoPWYuZmlsZXNbMF07aCYmKGYudmFsdWU9IiIsdGhpcy5fcGFyc2VBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChudWxsLGgpKX19fSl9KShkLmxvYWRlcnx8KGQubG9hZGVyPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC9oZWFsdGgtcGlsbHMuanMKdmFyIFZpOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChrLHQpe2lmKG51bGw9PWspdGhyb3cgRXJyb3IoYE1pc3NpbmcgcmVmVmFsdWUgZm9yIGNvbmRpdGlvbiAoJHt0fSkuYCk7fWZ1bmN0aW9uIGYoayl7cmV0dXJuIG51bGw9PWt8fDA9PWsubGVuZ3RofHwxIT09a1swXX1jb25zdCBoPXtJTkZfT1JfTkFOOntkZXNjcmlwdGlvbjoiQ29udGFpbnMgKy8tXHUyMjFlIG9yIE5hTiIscHJlZGljYXRlOms9PjA8a1syXXx8MDxrWzNdfHwwPGtbN119LElORjp7ZGVzY3JpcHRpb246IkNvbnRhaW5zICsvLVx1MjIxZSIscHJlZGljYXRlOms9PjA8a1szXXx8MDxrWzddfSxOQU46e2Rlc2NyaXB0aW9uOiJDb250YWlucyBOYU4iLHByZWRpY2F0ZTprPT4wPGtbMl19LE1BWF9HVDp7ZGVzY3JpcHRpb246Ik1heCBceDNlIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1BWF9HVCIpO3JldHVybiBrWzldPnR9fSxNQVhfTFQ6e2Rlc2NyaXB0aW9uOiJNYXggXHgzYyIscHJlZGljYXRlOihrLHQpPT57ZCh0LCJNQVhfTFQiKTsKcmV0dXJuIGtbOV08dH19LE1JTl9HVDp7ZGVzY3JpcHRpb246Ik1pbiBceDNlIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1JTl9HVCIpO3JldHVybiBrWzhdPnR9fSxNSU5fTFQ6e2Rlc2NyaXB0aW9uOiJNaW4gXHgzYyIscHJlZGljYXRlOihrLHQpPT57ZCh0LCJNSU5fTFQiKTtyZXR1cm4ga1s4XTx0fX0sTUVBTl9HVDp7ZGVzY3JpcHRpb246Ik1lYW4gXHgzZSIscHJlZGljYXRlOihrLHQpPT57ZCh0LCJNRUFOX0dUIik7cmV0dXJuIGtbMTBdPnR9fSxNRUFOX0xUOntkZXNjcmlwdGlvbjoiTWVhbiBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1FQU5fTFQiKTtyZXR1cm4ga1sxMF08dH19LFJBTkdFX0dUOntkZXNjcmlwdGlvbjoiTWF4IC0gTWluIFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiUkFOR0VfR1QiKTtyZXR1cm4ga1s5XS1rWzhdPnR9fSxSQU5HRV9MVDp7ZGVzY3JpcHRpb246Ik1heCAtIE1pbiBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIlJBTkdFX0xUIik7CnJldHVybiBrWzldLWtbOF08dH19LFNURERFVl9HVDp7ZGVzY3JpcHRpb246IlN0YW5kYXJkIGRldmlhdGlvbiBceDNlIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIlNURERFVl9HVCIpO3JldHVybiBNYXRoLnNxcnQoa1sxMV0pPnR9fSxTVERERVZfTFQ6e2Rlc2NyaXB0aW9uOiJTdGFuZGFyZCBkZXZpYXRpb24gXHgzYyIscHJlZGljYXRlOihrLHQpPT57ZCh0LCJTVERERVZfTFQiKTtyZXR1cm4gTWF0aC5zcXJ0KGtbMTFdKTx0fX19O2IudGVuc29yQ29uZGl0aW9uRGVzY3JpcHRpb24yS2V5PWZ1bmN0aW9uKGspe2Zvcihjb25zdCB0IGluIGgpaWYoaC5oYXNPd25Qcm9wZXJ0eSh0KSYmaFt0XS5kZXNjcmlwdGlvbj09PWspcmV0dXJuIHQ7cmV0dXJuIG51bGx9O2IuY2hlY2tIZWFsdGhQaWxsQWdhaW5zdFRlbnNvckNvbmRpdGlvbktleT1mdW5jdGlvbihrLHQsbCl7aWYoZih0KSlyZXR1cm4hMTtrPWhba10ucHJlZGljYXRlO3JldHVybiBrKHQsbCl9fSkoVml8fChWaT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1jb250aW51ZS1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItY29udGludWUtZGlhbG9nIixwcm9wZXJ0aWVzOntjb250aW51ZU51bTp7dHlwZTpOdW1iZXIsdmFsdWU6NX0sc2Vzc2lvblJ1bkdvOkZ1bmN0aW9uLHRlbnNvckNvbmRpdGlvbkdvOkZ1bmN0aW9uLGZvcmNlQ29udGludWF0aW9uU3RvcDpGdW5jdGlvbixfY29udGludWVCdXR0b25UZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiQ29udGludWUuLi4ifSxfY29udGludWVCdXR0b25Db250aW51ZVRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiIscmVhZG9ubHk6ITB9LF9jb250aW51ZUJ1dHRvblN0b3BUZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiU3RvcCBDb250aW51YXRpb24iLHJlYWRvbmx5OiEwfSxfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb246U3RyaW5nLF90ZW5zb3JDb25kaXRpb25SZWZWYWx1ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LF9pc1JlZlZhbHVlSW5wdXRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCwKbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX29uU2VsZWN0ZWRUZW5zb3JDb25kaXRpb25DaGFuZ2VkKF9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbikiXSxub3RpZnlDb250aW51YXRpb25TdG9wKCl7dGhpcy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITEpfSxfb3BlbkRpYWxvZygpe3RoaXMuJC5jb250aW51ZURpYWxvZy5vcGVuKCl9LF9jbG9zZURpYWxvZygpe3RoaXMuJC5jb250aW51ZURpYWxvZy5jbG9zZSgpfSxfY29udGludWVCdXR0b25DYWxsYmFjaygpe3RoaXMuX2NvbnRpbnVlQnV0dG9uVGV4dD09PXRoaXMuX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ/dGhpcy5mb3JjZUNvbnRpbnVhdGlvblN0b3AoKTp0aGlzLl9vcGVuRGlhbG9nKCl9LHVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dChiKXt0aGlzLnNldCgiX2NvbnRpbnVlQnV0dG9uVGV4dCIsYj90aGlzLl9jb250aW51ZUJ1dHRvblN0b3BUZXh0OnRoaXMuX2NvbnRpbnVlQnV0dG9uQ29udGludWVUZXh0KX0sX3Nlc3Npb25SdW5Hb0J1dHRvbkNhbGxiYWNrKCl7MDwKdGhpcy5jb250aW51ZU51bT8odGhpcy5zZXNzaW9uUnVuR28odGhpcy5jb250aW51ZU51bSksdGhpcy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApLHRoaXMuX2Nsb3NlRGlhbG9nKCkpOnRoaXMuc2V0KCJjb250aW51ZU51bSIsMSl9LF90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2soKXtpZihudWxsIT10aGlzLl9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbil7dmFyIGI9VmkudGVuc29yQ29uZGl0aW9uRGVzY3JpcHRpb24yS2V5KHRoaXMuX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKTtudWxsPT1iJiZjb25zb2xlLmVycm9yKCJJbnZhbGlkIFRlbnNvciBDb25kaXRpb24gbmFtZToiK3RoaXMuX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKTt2YXIgZD1OdW1iZXIodGhpcy5fdGVuc29yQ29uZGl0aW9uUmVmVmFsdWUpO051bWJlci5pc0Zpbml0ZShkKT8odGhpcy50ZW5zb3JDb25kaXRpb25HbyhiLGQpLHRoaXMudXBkYXRlQ29udGludWVCdXR0b25UZXh0KCEwKSx0aGlzLl9jbG9zZURpYWxvZygpKToKdGhpcy5zZXQoIl90ZW5zb3JDb25kaXRpb25SZWZWYWx1ZSIsMCl9fSxfb25TZWxlY3RlZFRlbnNvckNvbmRpdGlvbkNoYW5nZWQoYil7Yj1WaS50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXkoYik7dGhpcy5zZXQoIl9pc1JlZlZhbHVlSW5wdXRIaWRkZW4iLC0xIT09WyJJTkZfT1JfTkFOIiwiSU5GIiwiTkFOIl0uaW5kZXhPZihiKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nIixwcm9wZXJ0aWVzOntfdGl0bGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9jdXN0b21NZXNzYWdlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfaGFzQ3VzdG9tTWVzc2FnZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0N1c3RvbU1lc3NhZ2UoX2N1c3RvbU1lc3NhZ2UpIn0sX2hvc3Q6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9wb3J0Ont0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfb3Blbjp7dHlwZTpCb29sZWFufSxfaGlkZGVuOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGlkZGVuKF9vcGVuKSIscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sb3BlbkRpYWxvZyhiLGQpe3RoaXMuc2V0KCJfdGl0bGUiLCJEZWJ1Z2dlciBpcyB3YWl0aW5nIGZvciBTZXNzaW9uLnJ1bigpIGNvbm5lY3Rpb25zLi4uIik7dGhpcy5zZXQoIl9jdXN0b21NZXNzYWdlIixudWxsKTt0aGlzLiQuZGlhbG9nLm9wZW4oKTsKbnVsbCE9YiYmbnVsbCE9ZCYmKHRoaXMuc2V0KCJfaG9zdCIsYiksdGhpcy5zZXQoIl9wb3J0IixkKSl9LGNsb3NlRGlhbG9nKCl7dGhpcy4kLmRpYWxvZy5jbG9zZSgpfSxvcGVuRGlzYWJsZWREaWFsb2coKXt0aGlzLnNldCgiX3RpdGxlIiwiRGVidWdnZXIgaXMgbm90IGVuYWJsZWQgaW4gdGhpcyBUZW5zb3JCb2FyZCBpbnN0YW5jZSIpO3RoaXMuc2V0KCJfY3VzdG9tTWVzc2FnZSIsIlRvIGVuYWJsZSB0aGUgZGVidWdnZXIgaW4gVGVuc29yQm9hcmQsIHVzZSB0aGUgZmxhZzogLS1kZWJ1Z2dlcl9wb3J0IFx4M2Nwb3J0X251bWJlclx4M2UiKTt0aGlzLiQuZGlhbG9nLm9wZW4oKX0sX2NvbXB1dGVIaWRkZW4oYil7cmV0dXJuIWJ9LF9jb21wdXRlSGFzQ3VzdG9tTWVzc2FnZShiKXtyZXR1cm4hXy5pc0VtcHR5KGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1yZXNpemVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLXJlc2l6ZXIiLHByb3BlcnRpZXM6e2N1cnJlbnRMZW5ndGg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sbWluTGVuZ3RoOk51bWJlcixtYXhMZW5ndGg6TnVtYmVyLGlzSG9yaXpvbnRhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3Jlc2l6ZXJJZGVudGlmaWVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfaXNWZXJ0aWNhbDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUlzVmVydGljYWwoaXNIb3Jpem9udGFsKSIscmVmbGVjdFRvQXR0cmlidXRlOiEwLHJlYWRPbmx5OiEwfSxfZHJhZ1N0YXJ0UG9zaXRpb246TnVtYmVyLF9kcmFnU3RhcnRMZW5ndGg6TnVtYmVyLF9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrOk9iamVjdCxfcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2s6T2JqZWN0fSxsaXN0ZW5lcnM6e21vdXNlZG93bjoiX2hhbmRsZU1vdXNlRG93biJ9LApfaGFuZGxlTW91c2VEb3duKGIpe2IucHJldmVudERlZmF1bHQoKTt0aGlzLl9lbmREcmFnKCk7dGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaz1kPT57ZC5wcmV2ZW50RGVmYXVsdCgpO2Q9dGhpcy5fZHJhZ1N0YXJ0TGVuZ3RoKyh0aGlzLl9nZXRQb3NpdGlvblJlbGF0aXZlVG9WaWV3cG9ydChkKS10aGlzLl9kcmFnU3RhcnRQb3NpdGlvbik7ZD1NYXRoLm1heChkLHRoaXMubWluTGVuZ3RoKTtkPU1hdGgubWluKGQsdGhpcy5tYXhMZW5ndGgpO3RoaXMuc2V0KCJjdXJyZW50TGVuZ3RoIixkKX07dGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2s9ZD0+e2QucHJldmVudERlZmF1bHQoKTt0aGlzLl9lbmREcmFnKCl9O3RoaXMuc2V0KCJfZHJhZ1N0YXJ0UG9zaXRpb24iLHRoaXMuX2dldFBvc2l0aW9uUmVsYXRpdmVUb1ZpZXdwb3J0KGIpKTt0aGlzLnNldCgiX2RyYWdTdGFydExlbmd0aCIsdGhpcy5jdXJyZW50TGVuZ3RoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsCnRoaXMuX3ByZXZpb3VzTW91c2VVcENhbGxiYWNrLCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLl9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrLCExKX0sX2dldFBvc2l0aW9uUmVsYXRpdmVUb1ZpZXdwb3J0KGIpe3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbD9iLmNsaWVudFk6Yi5jbGllbnRYfSxfZW5kRHJhZygpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2ssITEpO3RoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2s9bnVsbDt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2ssITEpO3RoaXMuX3ByZXZpb3VzTW91c2VVcENhbGxiYWNrPW51bGx9LF9jb21wdXRlSXNWZXJ0aWNhbChiKXtyZXR1cm4hYn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvc2VsZWN0aW9uLXRyZWUtbm9kZS5qcwooZnVuY3Rpb24oYil7Yi5OT0RFX05BTUVfU0VQQVJBVE9SPSIvIjtiLkRFVklDRV9OQU1FX1BBVFRFUk49L15cL2pvYjpbQS1aYS16MC05X10rXC9yZXBsaWNhOlswLTlfXStcL3Rhc2s6WzAtOV0rXC9kZXZpY2U6W0EtWmEtejAtOV9dKzpbMC05XSsvO2xldCBkOyhmdW5jdGlvbihrKXtrW2suRU1QVFk9MF09IkVNUFRZIjtrW2suQ0hFQ0tFRD0xXT0iQ0hFQ0tFRCI7a1trLlBBUlRJQUw9Ml09IlBBUlRJQUwifSkoZD1iLkNoZWNrYm94U3RhdGV8fChiLkNoZWNrYm94U3RhdGU9e30pKTtiLnNwbGl0Tm9kZU5hbWU9ZnVuY3Rpb24oayl7bGV0IHQ9W107Y29uc3QgbD1rLm1hdGNoKGIuREVWSUNFX05BTUVfUEFUVEVSTik7bnVsbCE9bCYmKHQucHVzaChsWzBdKSwiLyIhPT1rW2xbMF0ubGVuZ3RoXSYmY29uc29sZS5lcnJvcignTm8gc2xhc2ggKCIvIikgYWZ0ZXIgZGV2aWNlIG5hbWUgaW4gbm9kZSBuYW1lOicsayksaz1rLnNsaWNlKGxbMF0ubGVuZ3RoKzEpKTtyZXR1cm4gdC5jb25jYXQoay5zcGxpdChiLk5PREVfTkFNRV9TRVBBUkFUT1IpKX07CmIuZ2V0Q2xlYW5Ob2RlTmFtZT1mdW5jdGlvbihrKXtsZXQgdD1rO2NvbnN0IGw9ay5tYXRjaChiLkRFVklDRV9OQU1FX1BBVFRFUk4pO251bGwhPWw/KHQubGVuZ3RoPmxbMF0ubGVuZ3RoJiYiLyIhPXRbbFswXS5sZW5ndGhdJiZjb25zb2xlLmVycm9yKCdObyBzbGFzaCAoIi8iKSBhZnRlciBkZXZpY2UgbmFtZSBpbiBub2RlIG5hbWU6JyxrKSx0PXQuc2xpY2UobFswXS5sZW5ndGgrMSkpOiIvIj09PXRbMF0mJih0PXQuc2xpY2UoMSkpO3QuaW5kZXhPZigiKSIpPT09dC5sZW5ndGgtMSYmKHQ9dC5zbGljZSgwLHQuaW5kZXhPZigiLygiKSkpO3JldHVybiB0fTtiLnNvcnRBbmRCYXNlRXhwYW5kRGVidWdXYXRjaGVzPWZ1bmN0aW9uKGspe2suc29ydCgobCxwKT0+bC5ub2RlX25hbWU8cC5ub2RlX25hbWU/LTE6bC5ub2RlX25hbWU+cC5ub2RlX25hbWU/MTpsLm91dHB1dF9zbG90LXAub3V0cHV0X3Nsb3QpO2ZvcihsZXQgbD0wO2w8ay5sZW5ndGg7KytsKXt2YXIgdD1rW2xdLm5vZGVfbmFtZSsKIi8iO2xldCBwPSExO2ZvcihsZXQgbT1sKzE7bTxrLmxlbmd0aDsrK20paWYoMD09PWtbbV0ubm9kZV9uYW1lLmluZGV4T2YodCkpe3A9ITA7YnJlYWt9cCYmKHQ9a1tsXS5ub2RlX25hbWUuc3BsaXQoIi8iKSxrW2xdLm5vZGVfbmFtZSs9Ii8oIit0W3QubGVuZ3RoLTFdKyIpIil9fTtiLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbj1mdW5jdGlvbihrKXtyZXR1cm4gay5lbmRzV2l0aCgiKSIpP2suc2xpY2UoMCxrLmxhc3RJbmRleE9mKCIvKCIpKTprfTtiLmFzc2VtYmxlRGV2aWNlQW5kTm9kZU5hbWVzPWZ1bmN0aW9uKGspe2NvbnN0IHQ9W251bGwsbnVsbF07aWYoa1swXS5tYXRjaChiLkRFVklDRV9OQU1FX1BBVFRFUk4pKXtsZXQgbD1rWzBdOyIvIj09PWxbbC5sZW5ndGgtMV0mJihsPWwuc2xpY2UoMCxsLmxlbmd0aC0xKSk7dFswXT1sO3RbMV09ay5zbGljZSgxKS5qb2luKCIvIil9ZWxzZSB0WzFdPWsuam9pbigiLyIpO3JldHVybiB0fTtsZXQgZjsoZnVuY3Rpb24oayl7a1trLk5vZGVOYW1lPQowXT0iTm9kZU5hbWUiO2tbay5PcFR5cGU9MV09Ik9wVHlwZSJ9KShmPWIuRGVidWdXYXRjaEZpbHRlck1vZGV8fChiLkRlYnVnV2F0Y2hGaWx0ZXJNb2RlPXt9KSk7Yi5maWx0ZXJEZWJ1Z1dhdGNoZXM9ZnVuY3Rpb24oayx0LGwpe2lmKHQ9PT1mLk5vZGVOYW1lKXJldHVybiBrLmZpbHRlcihwPT5wLm5vZGVfbmFtZS5tYXRjaChsKSk7aWYodD09PWYuT3BUeXBlKXJldHVybiBrLmZpbHRlcihwPT5wLm9wX3R5cGUubWF0Y2gobCkpfTtjbGFzcyBoe2NvbnN0cnVjdG9yKGssdCxsLHApe3RoaXMuZGVidWdXYXRjaENoYW5nZT10O3RoaXMuZGVidWdXYXRjaD1wO3RoaXMubmFtZT1rO3RoaXMuZGVidWdXYXRjaD1wO3RoaXMuY2hlY2tib3hTdGF0ZT1kLkVNUFRZO3RoaXMucGFyZW50PWw7dGhpcy5jaGlsZHJlbj17fTt0aGlzLmNoZWNrYm94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWNoZWNrYm94Iik7dGhpcy5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCgpPT4Ke3RoaXMuX2hhbmRsZUNoYW5nZSgpfSwhMSl9X2hhbmRsZUNoYW5nZSgpe2lmKHRoaXMuYXZvaWRQcm9wYWdhdGlvbil0aGlzLmRlYnVnV2F0Y2gmJnRoaXMuZGVidWdXYXRjaENoYW5nZSh0aGlzLmRlYnVnV2F0Y2gsdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpKTtlbHNlIGlmKHRoaXMuZGVidWdXYXRjaCl0aGlzLnNldENoZWNrYm94U3RhdGUodGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpP2QuQ0hFQ0tFRDpkLkVNUFRZLCEwKSx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCk/dGhpcy5zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCk6dGhpcy5zZXROb2Rlc0Fib3ZlVG9FbXB0eSgpLHRoaXMuZGVidWdXYXRjaENoYW5nZSh0aGlzLmRlYnVnV2F0Y2gsdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpKTtlbHNlIGlmKHRoaXMuc2V0Q2hlY2tib3hTdGF0ZSh0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCk/ZC5DSEVDS0VEOmQuRU1QVFksITApLHRoaXMuaXNDaGVja2JveENoZWNrZWQoKSl7Y29uc3QgdD1fLnZhbHVlcyh0aGlzLmNoaWxkcmVuKTsKZm9yKDt0Lmxlbmd0aDspe3ZhciBrPXQucG9wKCk7Xy5mb3JFYWNoKGsuY2hpbGRyZW4sbD0+dC5wdXNoKGwpKTtrLnNldENoZWNrYm94U3RhdGUoZC5DSEVDS0VELCEwKX10aGlzLnNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKX1lbHNle2NvbnN0IHQ9Xy52YWx1ZXModGhpcy5jaGlsZHJlbik7Zm9yKDt0Lmxlbmd0aDspaz10LnBvcCgpLF8uZm9yRWFjaChrLmNoaWxkcmVuLGw9PnQucHVzaChsKSksay5zZXRDaGVja2JveFN0YXRlKGQuRU1QVFksITApO3RoaXMuc2V0Tm9kZXNBYm92ZVRvRW1wdHkoKX19aXNMZWFmKCl7cmV0dXJuISF0aGlzLmRlYnVnV2F0Y2h9c2V0VG9BbGxDaGVja2VkRXh0ZXJuYWxseSgpe3RoaXMuc2V0Q2hlY2tib3hTdGF0ZShkLkNIRUNLRUQpO3RoaXMuX2hhbmRsZUNoYW5nZSgpfXNldENoZWNrYm94U3RhdGUoayx0KXt0aGlzLmF2b2lkUHJvcGFnYXRpb249dDt0aGlzLmNoZWNrYm94U3RhdGU9azt0aGlzLmNoZWNrYm94LmNsYXNzTGlzdC50b2dnbGUoInBhcnRpYWwtY2hlY2tib3giLAprPT09ZC5QQVJUSUFMKTtrPT09ZC5DSEVDS0VEP3RoaXMuY2hlY2tib3guc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpOnRoaXMuY2hlY2tib3gucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7dGhpcy5hdm9pZFByb3BhZ2F0aW9uPSExfWlzQ2hlY2tib3hDaGVja2VkKCl7cmV0dXJuIHRoaXMuY2hlY2tib3guaGFzQXR0cmlidXRlKCJjaGVja2VkIil9c2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpe2xldCBrPXRoaXMucGFyZW50LHQ9ITE7Zm9yKDtrOyl0P2suc2V0Q2hlY2tib3hTdGF0ZShkLlBBUlRJQUwsITApOih0PS0xIT09Xy5maW5kSW5kZXgoXy52YWx1ZXMoay5jaGlsZHJlbiksbD0+bC5jaGVja2JveFN0YXRlIT09ZC5DSEVDS0VEKSxrLnNldENoZWNrYm94U3RhdGUodD9kLlBBUlRJQUw6ZC5DSEVDS0VELCEwKSksaz1rLnBhcmVudH1zZXROb2Rlc0Fib3ZlVG9FbXB0eSgpe2xldCBrPXRoaXMucGFyZW50LHQ9ITE7Zm9yKDtrOyl0P2suc2V0Q2hlY2tib3hTdGF0ZShkLlBBUlRJQUwsCiEwKToodD0tMSE9PV8uZmluZEluZGV4KF8udmFsdWVzKGsuY2hpbGRyZW4pLGw9PmwuY2hlY2tib3hTdGF0ZSE9PWQuRU1QVFkpLGsuc2V0Q2hlY2tib3hTdGF0ZSh0P2QuUEFSVElBTDpkLkVNUFRZLCEwKSksaz1rLnBhcmVudH1zZXRMZXZlbERvbShrKXt0aGlzLmxldmVsRG9tPWt9fWIuU2VsZWN0aW9uVHJlZU5vZGU9aH0pKFZpfHwoVmk9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtb3Atc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtb3Atc2VsZWN0b3IiLHByb3BlcnRpZXM6e2RlYnVnV2F0Y2hlczpBcnJheSxkZWJ1Z1dhdGNoQ2hhbmdlOk9iamVjdCxub2RlQ2xpY2tlZDpGdW5jdGlvbixmb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGZvcmNlRXhwYW5kTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX2xldmVsTmFtZTJDb250YWluZXI6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9sZXZlbE5hbWUyTm9kZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3dhdGNoSGllcmFyY2h5Ont0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVXYXRjaEhpZXJhcmNoeShkZWJ1Z1dhdGNoZXMsIGRlYnVnV2F0Y2hDaGFuZ2UsIF9maWx0ZXJNb2RlLCBfZmlsdGVySW5wdXQpIn0sX2ZpbHRlck1vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJOb2RlIE5hbWUiLApub3RpZnk6ITB9LF9maWx0ZXJJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxfaXNMb2FkaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9oaWdobGlnaHRlZExldmVsRG9tOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX3JlbmRlckhpZXJhcmNoeVdpdGhUaW1lb3V0KF93YXRjaEhpZXJhcmNoeSwgZGVidWdXYXRjaENoYW5nZSkiLCJfaGFuZGxlRm9yY2VOb2RlRXhwYW5kQW5kQ2hlY2soZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lKSIsIl9oYW5kbGVGb3JjZU5vZGVFeHBhbmQoZm9yY2VFeHBhbmROb2RlTmFtZSkiXSxfY29tcHV0ZVdhdGNoSGllcmFyY2h5KGIsZCxmLGgpe2g9aC50cmltKCk7bGV0IGs9YjtudWxsIT1mJiYwPGgubGVuZ3RoJiYoaz1WaS5maWx0ZXJEZWJ1Z1dhdGNoZXMoYixWaS5EZWJ1Z1dhdGNoRmlsdGVyTW9kZVtmLnJlcGxhY2UoL1xzL2csIiIpXSxuZXcgUmVnRXhwKGgpKSk7Y29uc3QgdD1uZXcgVmkuU2VsZWN0aW9uVHJlZU5vZGUoIiIsCmQpO3QuaXNSb290PSEwO18uZm9yRWFjaChrLGw9Pntjb25zdCBwPVZpLnNwbGl0Tm9kZU5hbWUobC5kZXZpY2VfbmFtZSsiLyIrbC5ub2RlX25hbWUpO2xldCBtPXQ7Xy5mb3JFYWNoKHAsKG4scSk9PntxPT09cC5sZW5ndGgtMT8ocT1uZXcgVmkuU2VsZWN0aW9uVHJlZU5vZGUobixkLG0sbCksbS5jaGlsZHJlbltuXT1xKToobS5jaGlsZHJlbltuXXx8KG0uY2hpbGRyZW5bbl09bmV3IFZpLlNlbGVjdGlvblRyZWVOb2RlKG4sZCxtKSksbT1tLmNoaWxkcmVuW25dKX0pfSk7cmV0dXJuIHR9LF9jbGVhclNlbGVjdG9ySGllcmFyY2h5KCl7Y29uc3QgYj10aGlzLiQkKCIjc2VsZWN0b3ItaGllcmFyY2h5Iik7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX0sX3JlbmRlckhpZXJhcmNoeVdpdGhUaW1lb3V0KGIsZCxmLGgpe3RoaXMuX2lzTG9hZGluZ3x8KHRoaXMuc2V0KCJfaXNMb2FkaW5nIiwhMCksdGhpcy5fY2xlYXJTZWxlY3RvckhpZXJhcmNoeSgpLApzZXRUaW1lb3V0KCgpPT57dGhpcy5fcmVuZGVySGllcmFyY2h5KGIsZCxmLGgpfSwxMCkpfSxfcmVuZGVySGllcmFyY2h5KGIsZCl7dGhpcy5zZXQoIl9sZXZlbE5hbWUyQ29udGFpbmVyIix7fSk7dGhpcy5zZXQoIl9sZXZlbE5hbWUyTm9kZSIse30pO2I9dGhpcy5fcmVuZGVyTGV2ZWwobnVsbCxudWxsLGIsZCk7UG9seW1lci5kb20odGhpcy4kJCgiI3NlbGVjdG9yLWhpZXJhcmNoeSIpKS5hcHBlbmRDaGlsZChiKTt0aGlzLnNldCgiX2lzTG9hZGluZyIsITEpfSxfcmVuZGVyTGV2ZWwoYixkLGYsaCl7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtudWxsIT1iJiZrLnNldEF0dHJpYnV0ZSgibGV2ZWwtbmFtZSIsYik7bGV0IHQ7dD1udWxsPT1kP2I6ZCsiLyIrYjtQb2x5bWVyLmRvbShrKS5jbGFzc0xpc3QuYWRkKCJsZXZlbC1jb250YWluZXIiKTtjb25zdCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24tY29sbGFwc2UiKTtpZihiKXt0aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyW3RdPQpsO2wucmVtb3ZlQXR0cmlidXRlKCJvcGVuZWQiKTtQb2x5bWVyLmRvbShrKS5jbGFzc0xpc3QuYWRkKCJpbmRlbnRlZC1sZXZlbC1jb250YWluZXIiKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1BvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5hZGQoImxldmVsLXRpdGxlIik7Y29uc3Qgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1pY29uLWJ1dHRvbiIpO1BvbHltZXIuZG9tKG4pLmNsYXNzTGlzdC5hZGQoIm5vZGUtZXhwYW5kLWJ1dHRvbiIpO2NvbnN0IHE9KCk9PntuLnNldEF0dHJpYnV0ZSgiaWNvbiIsbC5oYXNBdHRyaWJ1dGUoIm9wZW5lZCIpPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIil9O24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57bC5oYXNBdHRyaWJ1dGUoIm9wZW5lZCIpP2wucmVtb3ZlQXR0cmlidXRlKCJvcGVuZWQiKTpsLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCk7cSgpfSwhMSk7cSgpO1BvbHltZXIuZG9tKGQpLmFwcGVuZENoaWxkKG4pOwpQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZChmLmNoZWNrYm94KTtmLnNldExldmVsRG9tKGQpO2NvbnN0IHU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO1BvbHltZXIuZG9tKHUpLmNsYXNzTGlzdC5hZGQoImxldmVsLXRpdGxlLXRleHQiKTt1LnRleHRDb250ZW50PWI7UG9seW1lci5kb20oZCkuYXBwZW5kQ2hpbGQodSk7UG9seW1lci5kb20oaykuYXBwZW5kQ2hpbGQoZCk7KGIubWF0Y2goVmkuREVWSUNFX05BTUVfUEFUVEVSTil8fDE9PT1PYmplY3Qua2V5cyhmLmNoaWxkcmVuKS5sZW5ndGgpJiZsLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCl9ZWxzZSBsLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCk7Y29uc3QgcD1bXSxtPVtdO1BvbHltZXIuZG9tKGwpLmNsYXNzTGlzdC5hZGQoImNvbnRlbnQtY29udGFpbmVyIik7Xy5mb3JFYWNoKGYuY2hpbGRyZW4sKG4scSk9Pntjb25zdCB1PW4uZGVidWdXYXRjaDt2YXIgeD10O251bGw9PXQmJih4PSIiKTt4Kz0iLyIrcTsKdGhpcy5fbGV2ZWxOYW1lMk5vZGVbeF09bjtudWxsIT10aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW3hdJiYobi5zZXRDaGVja2JveFN0YXRlKFZpLkNoZWNrYm94U3RhdGUuQ0hFQ0tFRCksbi5zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCkpO2lmKHUpe3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7UG9seW1lci5kb20oeCkuY2xhc3NMaXN0LmFkZCgib3AtZGVzY3JpcHRpb24iKTtuLmNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIseT0+e3RoaXMuX2hhbmRsZUxlYWZOb2RlU2VsZWN0ZWQoaCx1LHkudGFyZ2V0LmNoZWNrZWQpfSwhMSk7UG9seW1lci5kb20oeCkuYXBwZW5kQ2hpbGQobi5jaGVja2JveCk7bi5zZXRMZXZlbERvbSh4KTt2YXIgQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7QS50ZXh0Q29udGVudD0iWyIrdS5vcF90eXBlKyJdIjtBLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJvcC10eXBlIik7UG9seW1lci5kb20oeCkuYXBwZW5kQ2hpbGQoQSk7CkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO0EudGV4dENvbnRlbnQ9cTtBLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJvcC10aXRsZS1sZWFmIik7QS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9Pntjb25zdCB5PXRoaXMuX2dldERldmljZUFuZE5vZGVOYW1lcyhxLGspO3RoaXMubm9kZUNsaWNrZWQoeVswXSx5WzFdKX0sITEpO1BvbHltZXIuZG9tKHgpLmFwcGVuZENoaWxkKEEpO20ucHVzaCh4KX1lbHNlIG4uY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix5PT57dGhpcy5faGFuZGxlTWV0YU5vZGVDaGFuZ2UobixoLHkudGFyZ2V0LmNoZWNrZWQpfSkscC5wdXNoKHRoaXMuX3JlbmRlckxldmVsKHEsdCxuLGgpKX0pO2I9bj0+e1BvbHltZXIuZG9tKGwpLmFwcGVuZENoaWxkKG4pfTtfLmZvckVhY2gobSxiKTtfLmZvckVhY2gocCxiKTtQb2x5bWVyLmRvbShrKS5hcHBlbmRDaGlsZChsKTtyZXR1cm4ga30sX2dldExlYWZEZWJ1Z1dhdGNoZXMoYixkKXtiLmRlYnVnV2F0Y2g/CmQucHVzaChiLmRlYnVnV2F0Y2gpOl8uZm9yRWFjaChiLmNoaWxkcmVuLGY9Pnt0aGlzLl9nZXRMZWFmRGVidWdXYXRjaGVzKGYsZCl9KX0sX2dldERldmljZUFuZE5vZGVOYW1lcyhiLGQpe2ZvcihiPVtiXTs7KXtjb25zdCBmPWQuZ2V0QXR0cmlidXRlKCJsZXZlbC1uYW1lIik7aWYobnVsbD09ZilicmVhaztlbHNlIGIucHVzaChmKTtkPVBvbHltZXIuZG9tKGQpLnBhcmVudE5vZGUucGFyZW50Tm9kZX1iLnJldmVyc2UoKTtyZXR1cm4gVmkuYXNzZW1ibGVEZXZpY2VBbmROb2RlTmFtZXMoYil9LF9oYW5kbGVNZXRhTm9kZUNoYW5nZShiLGQsZil7bGV0IGg9W107dGhpcy5fZ2V0TGVhZkRlYnVnV2F0Y2hlcyhiLGgpO18uZm9yRWFjaChoLGs9Pnt0aGlzLl9oYW5kbGVMZWFmTm9kZVNlbGVjdGVkKGQsayxmKX0pfSxfaGFuZGxlTGVhZk5vZGVTZWxlY3RlZChiLGQsZil7Y29uc3QgaD1kLmRldmljZV9uYW1lKyIvIitkLm5vZGVfbmFtZTtmP3RoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbaF09CmQ6ZGVsZXRlIHRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbaF07YihkLGYpfSxfaGFuZGxlRm9yY2VOb2RlKGIsZCl7dGhpcy5zZXQoIl9maWx0ZXJJbnB1dCIsIiIpO3NldFRpbWVvdXQoKCk9PntpZihudWxsIT1iJiZudWxsIT10aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyKXt2YXIgZj1WaS5zcGxpdE5vZGVOYW1lKGIpO2ZvcihsZXQgaz0xO2s8PWYubGVuZ3RoOysrayl7dmFyIGg9Zi5zbGljZSgwLGspLmpvaW4oIi8iKTtjb25zdCB0PXRoaXMuX2xldmVsTmFtZTJOb2RlW2hdO251bGwhPXQmJm51bGwhPXQubGV2ZWxEb20mJnQubGV2ZWxEb20uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJjZW50ZXIiLGJlaGF2aW91cjoic21vb3RoIn0pO2s8Zi5sZW5ndGg/bnVsbCE9dGhpcy5fbGV2ZWxOYW1lMkNvbnRhaW5lcltoXSYmdGhpcy5fbGV2ZWxOYW1lMkNvbnRhaW5lcltoXS5zZXRBdHRyaWJ1dGUoIm9wZW5lZCIsITApOih0LmRlYnVnV2F0Y2h8fHRoaXMuX2hhbmRsZU1ldGFOb2RlQ2hhbmdlKHQsCnQuZGVidWdXYXRjaENoYW5nZSwhMCksZCYmKHQuc2V0VG9BbGxDaGVja2VkRXh0ZXJuYWxseSgpLChoPXQuZGVidWdXYXRjaCkmJm51bGw9PXRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbaC5ub2RlX25hbWVdJiYodGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1tiXT1oKSksbnVsbCE9dGhpcy5faGlnaGxpZ2h0ZWRMZXZlbERvbSYmdGhpcy5faGlnaGxpZ2h0ZWRMZXZlbERvbS5jbGFzc0xpc3QucmVtb3ZlKCJoaWdobGlnaHRlZCIpLHQubGV2ZWxEb20uY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQiKSx0aGlzLnNldCgiX2hpZ2hsaWdodGVkTGV2ZWxEb20iLHQubGV2ZWxEb20pKX19fSwyMCl9LF9oYW5kbGVGb3JjZU5vZGVFeHBhbmRBbmRDaGVjayhiKXt0aGlzLl9oYW5kbGVGb3JjZU5vZGUoYiwhMCl9LF9oYW5kbGVGb3JjZU5vZGVFeHBhbmQoYil7dGhpcy5faGFuZGxlRm9yY2VOb2RlKGIsITEpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1zZXNzaW9uLXJ1bnMtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zZXNzaW9uLXJ1bnMtdmlldyIscHJvcGVydGllczp7bGF0ZXN0U2Vzc2lvblJ1bjpPYmplY3Qsc2Vzc2lvblJ1bktleVRvRGV2aWNlTmFtZXM6T2JqZWN0LHNvbGVBY3RpdmU6Qm9vbGVhbixub2RlT3JUZW5zb3JDbGlja2VkOkZ1bmN0aW9uLF9ydW5LZXkyQ291bnQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfcnVuS2V5Mk51bURldmljZXM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfYWN0aXZlUnVuS2V5OlN0cmluZ30sb2JzZXJ2ZXJzOlsicmVuZGVyTGF0ZXN0KGxhdGVzdFNlc3Npb25SdW4pIiwic2V0U29sZUFjdGl2ZVN0YXR1cyhzb2xlQWN0aXZlKSJdLHJlbmRlckxhdGVzdChiKXtiPUpTT04uc3RyaW5naWZ5KGIpO3RoaXMuX3J1bktleTJDb3VudFtiXT12b2lkIDA9PT10aGlzLl9ydW5LZXkyQ291bnRbYl0/MTp0aGlzLl9ydW5LZXkyQ291bnRbYl0rMTt2b2lkIDA9PT10aGlzLl9ydW5LZXkyTnVtRGV2aWNlc1tiXSYmKHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2JdPQowKTt0aGlzLl9hY3RpdmVSdW5LZXk9Yjt0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKX0sdXBkYXRlTnVtRGV2aWNlcyhiKXtudWxsIT10aGlzLl9hY3RpdmVSdW5LZXkmJih0aGlzLl9ydW5LZXkyTnVtRGV2aWNlc1t0aGlzLl9hY3RpdmVSdW5LZXldPWIsdGhpcy5fcmVuZGVyU2Vzc2lvblJ1blRhYmxlKCkpfSxzZXRTb2xlQWN0aXZlU3RhdHVzKCl7dGhpcy5fcmVuZGVyU2Vzc2lvblJ1blRhYmxlKCl9LF9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKXt0aGlzLl9jbGVhclRhYmxlKCk7dGhpcy5fcmVuZGVySGVhZGVyKCk7bGV0IGI7Zm9yKGNvbnN0IGYgaW4gdGhpcy5fcnVuS2V5MkNvdW50KWlmKHRoaXMuX3J1bktleTJDb3VudC5oYXNPd25Qcm9wZXJ0eShmKSl7dmFyIGQ9SlNPTi5wYXJzZShmKTsoZD10aGlzLl9yZW5kZXJSb3coZCx0aGlzLl9ydW5LZXkyTnVtRGV2aWNlc1tmXSx0aGlzLl9ydW5LZXkyQ291bnRbZl0sdGhpcy5fYWN0aXZlUnVuS2V5PT09Zix0aGlzLnNvbGVBY3RpdmUpKSYmCihiPWQpfWImJihQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLnBhcmVudE5vZGUucGFyZW50Tm9kZS5zY3JvbGxUb3A9Yi5vZmZzZXRUb3ApfSxfY2xlYXJUYWJsZSgpe2NvbnN0IGI9dGhpcy4kJCgiI3Nlc3Npb24tcnVucy10YWJsZSIpO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9LF9yZW5kZXJIZWFkZXIoKXtjb25zdCBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2QudGV4dENvbnRlbnQ9IkZlZWRzIjtjb25zdCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7Zi50ZXh0Q29udGVudD0iRmV0Y2hlcyI7Y29uc3QgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2gudGV4dENvbnRlbnQ9IlRhcmdldHMiO2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtrLnRleHRDb250ZW50PSIjKERldmljZXMpIjtjb25zdCB0PQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO3QudGV4dENvbnRlbnQ9IkNvdW50IjtiLmFwcGVuZENoaWxkKGQpO2IuYXBwZW5kQ2hpbGQoZik7Yi5hcHBlbmRDaGlsZChoKTtiLmFwcGVuZENoaWxkKGspO2IuYXBwZW5kQ2hpbGQodCk7UG9seW1lci5kb20odGhpcy4kJCgiI3Nlc3Npb24tcnVucy10YWJsZSIpKS5hcHBlbmRDaGlsZChiKX0sX3JlbmRlclJvdyhiLGQsZixoLGspe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxsPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYi5mZWVkcykscD10aGlzLl9yZW5kZXJHcmFwaEVsZW1lbnRzKGIuZmV0Y2hlcyk7Yj10aGlzLl9yZW5kZXJHcmFwaEVsZW1lbnRzKGIudGFyZ2V0cyk7Y29uc3QgbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO20udGV4dENvbnRlbnQ9ZDtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7ZC50ZXh0Q29udGVudD1mO3QuYXBwZW5kQ2hpbGQobCk7dC5hcHBlbmRDaGlsZChwKTsKdC5hcHBlbmRDaGlsZChiKTt0LmFwcGVuZENoaWxkKG0pO3QuYXBwZW5kQ2hpbGQoZCk7aCYmKGs/dC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwic29sZS1hY3RpdmUtc2Vzc2lvbi1ydW4iKTp0LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJhY3RpdmUtc2Vzc2lvbi1ydW4iKSk7UG9seW1lci5kb20odGhpcy4kJCgiI3Nlc3Npb24tcnVucy10YWJsZSIpKS5hcHBlbmRDaGlsZCh0KTtpZihoKXJldHVybiB0fSxfcmVuZGVyR3JhcGhFbGVtZW50cyhiKXtjb25zdCBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Xy5mb3JFYWNoKGIsZj0+e2NvbnN0IGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC50ZXh0Q29udGVudD1mO2guc2V0QXR0cmlidXRlKCJjbGFzcyIsIm5vZGUtb3ItdGVuc29yLWVsZW1lbnQiKTtoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3RoaXMubm9kZU9yVGVuc29yQ2xpY2tlZChmKX0pO2QuYXBwZW5kQ2hpbGQoaCl9KTtyZXR1cm4gZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtc291cmNlLWNvZGUtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zb3VyY2UtY29kZS12aWV3Iixwcm9wZXJ0aWVzOntyZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sZm9jdXNOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX29sZEZvY3VzTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGRlYnVnV2F0Y2hlczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sbm9kZUNsaWNrZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6bnVsbH0sY29udGludWVUb05vZGU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6bnVsbH0sX2hpZ2hsaWdodGVkRWxlbWVudHM6e3R5cGU6QXJyYXksdmFsdWU6W119LF9maWxlUGF0aFNlbGVjdGVkOk51bWJlcixfZnVsbEZpbGVQYXRoczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfc2hvcnRGaWxlUGF0aHM6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX2ZpbGVMaW5lczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfbm9kZU5hbWUyRGV2aWNlTmFtZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sCl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX25vZGVOYW1lMk5vZGVFbGVtZW50czp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX25vZGVOYW1lMlN0YWNrVG9wTm9kZUVsZW1lbnQ6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQ6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9mdWxsU3RhY2tTaG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZnVsbFN0YWNrTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9yZW5kZXJEZWxheU1pbGxpczp7dHlwZTpOdW1iZXIsdmFsdWU6NTAscmVhZG9ubHk6ITB9fSxvYnNlcnZlcnM6WyJfcmVuZGVyRmlsZShfZmlsZVBhdGhTZWxlY3RlZCkiLCJfZm9jdXNPbk5vZGUoZm9jdXNOb2RlTmFtZSkiXSxyZW5kZXIoYil7bnVsbCE9YiYmdGhpcy5zZXQoIl9kZWJ1Z1dhdGNoZXMiLGIpO3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJwYXRocyJ9KS50aGVuKGQ9Pgp7dGhpcy5zZXQoIl9mdWxsRmlsZVBhdGhzIixkLnBhdGhzKTtjb25zdCBmPWQucGF0aHMubWFwKGg9Pih7aWQ6aCxuYW1lOnRoaXMuX3Nob3J0ZW5QYXRoKGgsZC5wYXRocyl9KSk7dGhpcy5zZXQoIl9zaG9ydEZpbGVQYXRocyIsZik7MDxmLmxlbmd0aCYmdGhpcy5zZXQoIl9maWxlUGF0aFNlbGVjdGVkIiwwKX0pfSxfc2hvcnRlblBhdGgoYil7Yj1iLnJlcGxhY2UoL1xcL2csIi8iKTtiPWIuc3BsaXQoIi8iKTtyZXR1cm4gYltiLmxlbmd0aC0xXX0sX3JlbmRlckZpbGUoYil7aWYobnVsbCE9Yil7dmFyIGQ9dGhpcy5fc2hvcnRGaWxlUGF0aHNbYl0uaWQ7dGhpcy5fcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoe21vZGU6ImNvbnRlbnQiLGZpbGVfcGF0aDpkfSkudGhlbihmPT57Y29uc3QgaD1bXSxrPWYuY29udGVudFtkXSx0PWYubGluZW5vX3RvX29wX25hbWVfYW5kX3N0YWNrX3BvcztmPXt9O2Zvcih2YXIgbCBpbiB0KXQuaGFzT3duUHJvcGVydHkobCkmJihmW2xdPXRbbF0ubGVuZ3RoKTsKdGhpcy5fZmlsdGVyRmlsZVRyYWNlYmFja3NCeURlYnVnV2F0Y2hlcyh0KTtmb3IobD0wO2w8ay5sZW5ndGg7KytsKXtjb25zdCBtPWwrMTtoLnB1c2goe2xpbmVubzptLG51bU5vZGVzOm51bGwhPXRbbV0/U3RyaW5nKHRbbV0ubGVuZ3RoKSsiLyIrU3RyaW5nKGZbbV0pKyIgXHUyNWJjIjoiIix0ZXh0OnRoaXMuX2h0bWxFc2NhcGUoa1tsXSl9KX10aGlzLnNldCgiX2ZpbGVMaW5lcyIsaCk7Y29uc3QgcD10aGlzO3NldFRpbWVvdXQoKCk9Pntjb25zdCBtPXt9LG49e307Zm9yKGNvbnN0IHUgaW4gdCl7aWYoIXQuaGFzT3duUHJvcGVydHkodSkpY29udGludWU7Zm9yKHZhciBxPXAuJCQoIiNzb3VyY2UtbGluZS1ub2Rlcy0iK3UpO3EuZmlyc3RDaGlsZDspcS5yZW1vdmVDaGlsZChxLmZpcnN0Q2hpbGQpO2NvbnN0IHg9dFt1XTt4LnNvcnQoZnVuY3Rpb24oQSx5KXtyZXR1cm4gQVswXTx5WzBdPy0xOkFbMF0+eVswXT8xOjB9KTtmb3IobGV0IEE9MDtBPHgubGVuZ3RoOysrQSl7Y29uc3QgeT0KeFtBXVswXSx3PXhbQV1bMV0sQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtGLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJzb3VyY2UtbGluZS1ub2RlLWVudHRyeSIpO0Yuc2V0QXR0cmlidXRlKCJzb3VyY2VMaW5lbm8iLHUpO0YudGV4dENvbnRlbnQ9eTtGLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLm5vZGVDbGlja2VkKHRoaXMuX25vZGVOYW1lMkRldmljZU5hbWVbeV0sdGhpcy5fbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWVbeV0sITApfSk7Y29uc3QgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1pY29uLWJ1dHRvbiIpO0Quc2V0QXR0cmlidXRlKCJpY29uIiwiZmlsdGVyLWxpc3QiKTtELnNldEF0dHJpYnV0ZSgidGl0bGUiLCJTaG93IHN0YWNrIik7RC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57dGhpcy5faGlnaGxpZ2h0Tm9kZUVsZW1lbnRzKHkpO3RoaXMuc2V0KCJfZnVsbFN0YWNrTm9kZU5hbWUiLAp5KTt0aGlzLnNldCgiX2Z1bGxTdGFja1Nob3duIiwhMCk7dGhpcy5fcG9wdWxhdGVGdWxsU3RhY2soeSx0aGlzLl9mdWxsRmlsZVBhdGhzW3RoaXMuX2ZpbGVQYXRoU2VsZWN0ZWRdLE51bWJlcih1KSl9KTtjb25zdCBCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7Qi5zZXRBdHRyaWJ1dGUoImljb24iLCJmb3J3YXJkIik7Qi5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiQ29udGludWUgdG8iKTtCLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLm5vZGVDbGlja2VkKHRoaXMuX25vZGVOYW1lMkRldmljZU5hbWVbeV0sdGhpcy5fbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWVbeV0sITApO2NvbnN0IEk9dGhpcy5fbm9kZU5hbWUyRGV2aWNlTmFtZVt5XSxOPXRoaXMuX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lW3ldO3RoaXMuc2V0KCJfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50IixGKTt0aGlzLmNvbnRpbnVlVG9Ob2RlKEksCk4pfSk7Qy5hcHBlbmRDaGlsZChEKTtDLmFwcGVuZENoaWxkKEIpO0MuYXBwZW5kQ2hpbGQoRik7cS5hcHBlbmRDaGlsZChDKTttLmhhc093blByb3BlcnR5KHkpfHwobVt5XT1bXSk7bVt5XS5wdXNoKEYpO24uaGFzT3duUHJvcGVydHkoeSl8fChuW3ldPVtGLHddKTt3Pm5beV1bMV0mJihuW3ldPVtGLHddKX1xLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwhMCk7cT1wLiQkKCIjc291cmNlLWxpbmUtbm9kZS10b2dnbGUtIit1KTtudWxsPT1xLmdldEF0dHJpYnV0ZSgidGFwQ2FsbGJhY2tTZXQiKSYmKHEuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3AuX3RvZ2dsZUxpbmVOb2RlcyhOdW1iZXIodSkpfSkscS5zZXRBdHRyaWJ1dGUoInRhcENhbGxiYWNrU2V0IiwhMCkpfXAuc2V0KCJfbm9kZU5hbWUyTm9kZUVsZW1lbnRzIixtKTtmb3IoY29uc3QgdSBpbiBuKW4uaGFzT3duUHJvcGVydHkodSkmJihuW3VdPW5bdV1bMF0pO3Auc2V0KCJfbm9kZU5hbWUyU3RhY2tUb3BOb2RlRWxlbWVudCIsCm4pfSx0aGlzLl9yZW5kZXJEZWxheU1pbGxpcyl9KX19LF90b2dnbGVMaW5lTm9kZXMoYixkPSExKXtiPXRoaXMuJCQoIiNzb3VyY2UtbGluZS1ub2Rlcy0iK2IpO251bGw9PWIuZ2V0QXR0cmlidXRlKCJoaWRkZW4iKSYmITAhPT1kP2Iuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTpiLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIil9LF9maWx0ZXJGaWxlVHJhY2ViYWNrc0J5RGVidWdXYXRjaGVzKGIpe2NvbnN0IGQ9dGhpcy5kZWJ1Z1dhdGNoZXMubWFwKGs9PlZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihrLm5vZGVfbmFtZSkpLGY9e30saD17fTtmb3IoY29uc3QgayBvZiB0aGlzLmRlYnVnV2F0Y2hlcyl7Y29uc3QgdD1WaS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oay5ub2RlX25hbWUpO2ZbdF09ay5kZXZpY2VfbmFtZTtoW3RdPWsubm9kZV9uYW1lfXRoaXMuc2V0KCJfbm9kZU5hbWUyRGV2aWNlTmFtZSIsZik7dGhpcy5zZXQoIl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZSIsCmgpO2Zvcihjb25zdCBrIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShrKSYmKGJba109YltrXS5maWx0ZXIodD0+Xy5pbmNsdWRlcyhkLHRbMF0pKSl9LF9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludChiKXtjb25zdCBkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9zb3VyY2VfY29kZSIpO2I9dmMuYWRkUGFyYW1zKGQsYik7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKX0sX2h0bWxFc2NhcGUoYil7cmV0dXJuIGIucmVwbGFjZSgvIC9nLCJcdTAwYTAiKX0sX2ZvY3VzT25Ob2RlKGIpe2lmKG51bGwhPWIpe3ZhciBkPXRoaXMuX3Nob3J0RmlsZVBhdGhzW3RoaXMuX2ZpbGVQYXRoU2VsZWN0ZWRdLmlkLGY9dGhpczt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToib3BfdHJhY2ViYWNrIixvcF9uYW1lOmJ9KS50aGVuKGg9Pntjb25zdCBrPWgub3BfdHJhY2ViYWNrW2JdO2g9W107Zm9yKGxldCBsPTA7bDxrLmxlbmd0aDsrK2wpe2NvbnN0IHA9CmtbbF1bMV07a1tsXVswXT09PWQmJmgucHVzaChwKX1mb3IodmFyIHQgb2YgZi5faGlnaGxpZ2h0ZWRFbGVtZW50cyl0LmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIik7dD1bXTtmb3IoY29uc3QgbCBvZiBoKWg9dGhpcy4kJCgiI3NvdXJjZS1saW5lLSIrbCksdC5wdXNoKGgpLGguY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQtc291cmNlLWxpbmUiKSxmLl90b2dnbGVMaW5lTm9kZXMobCwhMCk7Zi5zZXQoIl9oaWdobGlnaHRlZEVsZW1lbnRzIix0KTt0aGlzLl9oaWdobGlnaHROb2RlRWxlbWVudHMoYil9KX19LF9oaWdobGlnaHROb2RlRWxlbWVudHMoYil7aWYobnVsbCE9dGhpcy5fb2xkRm9jdXNOb2RlTmFtZSlmb3IoY29uc3QgZCBvZiB0aGlzLl9ub2RlTmFtZTJOb2RlRWxlbWVudHNbdGhpcy5fb2xkRm9jdXNOb2RlTmFtZV0pZC5zdHlsZVsiZm9udC13ZWlnaHQiXT0ibm9ybWFsIjtmb3IoY29uc3QgZCBvZiB0aGlzLl9ub2RlTmFtZTJOb2RlRWxlbWVudHNbYl0pZC5zdHlsZVsiZm9udC13ZWlnaHQiXT0KImJvbGQiO251bGw9PXRoaXMuX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudD90aGlzLl9ub2RlTmFtZTJTdGFja1RvcE5vZGVFbGVtZW50W2JdLnNjcm9sbEludG9WaWV3KHtibG9jazoiY2VudGVyIixiZWhhdmlvdXI6InNtb290aCJ9KTp0aGlzLnNldCgiX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudCIsbnVsbCk7dGhpcy5zZXQoIl9vbGRGb2N1c05vZGVOYW1lIixiKX0sX3BvcHVsYXRlRnVsbFN0YWNrKGIsZCxmKXt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToib3BfdHJhY2ViYWNrIixvcF9uYW1lOmJ9KS50aGVuKGg9Pntjb25zdCBrPXRoaXMuJCQoIiNmdWxsLXN0YWNrLWNvbnRlbnQiKTtmb3IoO2suZmlyc3RDaGlsZDspay5yZW1vdmVDaGlsZChrLmZpcnN0Q2hpbGQpO2Zvcihjb25zdCB0IG9mIGgub3BfdHJhY2ViYWNrW2JdKXtjb25zdCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIikscD10WzBdLG09TnVtYmVyKHRbMV0pO2wudGV4dENvbnRlbnQ9CnArIjogIitTdHJpbmcobSk7Xy5pbmNsdWRlcyh0aGlzLl9mdWxsRmlsZVBhdGhzLHApPyhsLmNsYXNzTGlzdC5hZGQoInN0YWNrLWZyYW1lLWNsaWNrYWJsZSIpLGwuc3R5bGUuY29sb3I9ImJsdWUiLGwuc3R5bGVbInRleHQtZGVjb3JhdGlvbiJdPSJ1bmRlcmxpbmUiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIixwPT09ZCYmbT09PWYmJihsLnN0eWxlWyJmb250LXdlaWdodCJdPSJib2xkIiksbC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57dGhpcy5zZXQoIl9maWxlUGF0aFNlbGVjdGVkIix0aGlzLl9mdWxsRmlsZVBhdGhzLmluZGV4T2YocCkpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLl90b2dnbGVMaW5lTm9kZXMobSwhMCk7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fbm9kZU5hbWUyTm9kZUVsZW1lbnRzW2JdKU51bWJlcihuLmdldEF0dHJpYnV0ZSgic291cmNlTGluZW5vIikpPT09TnVtYmVyKG0pJiYobi5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImNlbnRlciIsYmVoYXZpb3VyOiJzbW9vdGgifSksCnRoaXMuc2V0KCJfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50IixsKSx0aGlzLl9oaWdobGlnaHROb2RlRWxlbWVudHMoYiksZD09PXAmJmY9PT1tfHx0aGlzLl9wb3B1bGF0ZUZ1bGxTdGFjayhiLHAsbSkpfSwyKnRoaXMuX3JlbmRlckRlbGF5TWlsbGlzKX0pKToobC5jbGFzc0xpc3QuYWRkKCJzdGFjay1mcmFtZS1ub25jbGlja2FibGUiKSxsLnN0eWxlLmNvbG9yPSIjNTU1Iik7ay5hcHBlbmRDaGlsZChsKX19KX0sX2Nsb3NlRnVsbFN0YWNrRGlhbG9nKCl7dGhpcy5zZXQoIl9mdWxsU3RhY2tTaG93biIsITEpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci1kYXRhLXN1bW1hcnkiLHByb3BlcnRpZXM6e2xhdGVzdFRlbnNvckRhdGE6T2JqZWN0LGV4cGFuZEhhbmRsZXI6T2JqZWN0LGNvbnRpbnVlVG9DYWxsYmFjazpGdW5jdGlvbixoaWdobGlnaHRlZE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx0ZW5zb3JOYW1lQ2xpY2tlZDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSxnZXRIZWFsdGhQaWxsOkZ1bmN0aW9uLF9oZWFsdGhQaWxsc0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxub3RpZnk6ITB9LF93YXRjaEtleXM6e3R5cGU6QXJyYXksdmFsdWU6W119LF93YXRjaEtleTJEYXRhOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MkNvdW50Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyVmFsdWVTaG9ydDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF93YXRjaEtleTJSb3c6e3R5cGU6T2JqZWN0LAp2YWx1ZTp7fX0sX2FjdGl2ZVdhdGNoS2V5OlN0cmluZyxfaGVhbHRoUGlsbFdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZToyMDAscmVhZG9ubHk6ITB9LF9oZWFsdGhQaWxsSGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTozMixyZWFkb25seTohMH19LG9ic2VydmVyczpbIl9yZW5kZXJMYXRlc3QobGF0ZXN0VGVuc29yRGF0YSwgZXhwYW5kSGFuZGxlcikiLCJfaGlnaGxpZ2h0KGhpZ2hsaWdodGVkTm9kZU5hbWUpIl0sbGlzdGVuZXJzOnsic2hvdy1oZWFsdGgtcGlsbHMuY2hhbmdlIjoiX3Nob3dIZWFsdGhQaWxsc0NoYW5nZWQifSxyZWFkeSgpe3RoaXMuX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKX0sZW5hYmxlSGVhbHRoUGlsbHMoKXt0aGlzLnNldCgiX2hlYWx0aFBpbGxzRW5hYmxlZCIsITApO3RoaXMuX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKX0sX3Nob3dIZWFsdGhQaWxsc0NoYW5nZWQoKXt0aGlzLl9oZWFsdGhQaWxsc0VuYWJsZWQ/dGhpcy5fcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpOgp0aGlzLl9jbGVhckhlYWx0aFBpbGxMZWdlbmQoKTt0aGlzLl9yZW5kZXJBbGwoKX0sX3JlbmRlckFsbCgpe3RoaXMuX2NsZWFyVGVuc29yRGF0YVRhYmxlKCk7Zm9yKGNvbnN0IGIgb2YgdGhpcy5fd2F0Y2hLZXlzKXRoaXMuX3JlbmRlckxhdGVzdCh0aGlzLl93YXRjaEtleTJEYXRhW2JdLHRoaXMuX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXJbYl0pfSxfdGVuc29yRGF0YTJXYXRjaEtleShiKXtyZXR1cm4gYi5kZXZpY2VOYW1lKyIvIitiLnRlbnNvck5hbWUrIjoiK2IuZGVidWdPcH0sX3JlbmRlckxhdGVzdChiLGQpe2lmKGIpe3ZhciBmPXRoaXMuX3RlbnNvckRhdGEyV2F0Y2hLZXkoYiksaD1udWxsOyJVbmluaXRpYWxpemVkIiE9PWIuZHR5cGUmJiJVbnN1cHBvcnRlZCIhPT1iLmR0eXBlJiYoaD0oKT0+ZChiKSk7dmFyIGs9bnVsbCE9Yi52YWx1ZT9KU09OLnN0cmluZ2lmeShiLnZhbHVlLCh0LGwpPT5sLnRvRml4ZWQ/TnVtYmVyKGwudG9GaXhlZCgzKSk6bCk6IihDbGljayB0byB2aWV3KSI7CnRoaXMuX3dhdGNoS2V5MkRhdGFbZl09YjstMT09PXRoaXMuX3dhdGNoS2V5cy5pbmRleE9mKGYpPyh0aGlzLl93YXRjaEtleXMucHVzaChmKSx0aGlzLl93YXRjaEtleTJDb3VudFtmXT0xKTp0aGlzLl93YXRjaEtleTJDb3VudFtmXSs9MTt0aGlzLl93YXRjaEtleTJFeHBhbmRIYW5kbGVyW2ZdPWg7dGhpcy5fd2F0Y2hLZXkyVmFsdWVTaG9ydFtmXT1rO3RoaXMuX2FjdGl2ZVdhdGNoS2V5PWY7dGhpcy5fcmVtb3ZlQWN0aXZlU3RhdHVzRnJvbUFsbFJvd3MoKTt0aGlzLl9yZW5kZXJSb3coZil9fSxfY2xlYXJUZW5zb3JEYXRhVGFibGUoKXtmb3IoY29uc3QgYiBpbiB0aGlzLl93YXRjaEtleTJSb3cpdGhpcy5fd2F0Y2hLZXkyUm93Lmhhc093blByb3BlcnR5KGIpJiYodGhpcy5fd2F0Y2hLZXkyUm93W2JdLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLl93YXRjaEtleTJSb3dbYl0pfSxfY2xlYXJUZW5zb3JEYXRhUm93KGIpe2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9LApfY2xlYXJIZWFsdGhQaWxsTGVnZW5kKCl7Y29uc3QgYj10aGlzLiQkKCIjaGVhbHRoLXBpbGwtbGVnZW5kIik7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX0sX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKXt0aGlzLl9jbGVhckhlYWx0aFBpbGxMZWdlbmQoKTtjb25zdCBiPXRoaXMuJCQoIiNoZWFsdGgtcGlsbC1sZWdlbmQiKTt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnRleHRDb250ZW50PSJMZWdlbmQ6IjtiLmFwcGVuZENoaWxkKGQpO2Quc3R5bGVbIm1hcmdpbi1yaWdodCJdPSIwLjVlbSI7ZC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siO2ZvcihkPTA7ZDx0Zi5ncmFwaC5zY2VuZS5oZWFsdGhQaWxsRW50cmllcy5sZW5ndGg7KytkKXtjb25zdCBmPXRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzW2RdLGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOwpoLnN0eWxlWyJtYXJnaW4tcmlnaHQiXT0iMC4yNWVtIjtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtrLnRleHRDb250ZW50PSJcdTI1YTAiO2suc3R5bGUuY29sb3I9Zi5iYWNrZ3JvdW5kX2NvbG9yO2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3QudGV4dENvbnRlbnQ9Zi5sYWJlbDt0LnN0eWxlLmNvbG9yPWYuYmFja2dyb3VuZF9jb2xvcjtoLmFwcGVuZENoaWxkKGspO2guYXBwZW5kQ2hpbGQodCk7Yi5hcHBlbmRDaGlsZChoKX19LF9yZW1vdmVBY3RpdmVTdGF0dXNGcm9tQWxsUm93cygpe2Zvcihjb25zdCBiIGluIHRoaXMuX3dhdGNoS2V5MlJvdyl7aWYoIXRoaXMuX3dhdGNoS2V5MlJvdy5oYXNPd25Qcm9wZXJ0eShiKSljb250aW51ZTtjb25zdCBkPXRoaXMuX3dhdGNoS2V5MlJvd1tiXTtQb2x5bWVyLmRvbShkKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUtdGVuc29yIik7UG9seW1lci5kb20oZCkuY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQiKX19LApfcmVuZGVyUm93KGIpe2xldCBkLGY9ITE7bnVsbCE9dGhpcy5fd2F0Y2hLZXkyUm93W2JdPyhkPXRoaXMuX3dhdGNoS2V5MlJvd1tiXSx0aGlzLl9jbGVhclRlbnNvckRhdGFSb3coZCksZj0hMSk6KGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxmPSEwKTtjb25zdCBoPXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0uZGV2aWNlTmFtZSxrPXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0ubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSx0PWgrIi8iK2s7dmFyIGw9dGhpcy5fd2F0Y2hLZXkyQ291bnRbYl0scD10aGlzLl93YXRjaEtleTJEYXRhW2JdLnRlbnNvck5hbWUsbT10aGlzLl93YXRjaEtleTJEYXRhW2JdLmRlYnVnT3Asbj10aGlzLl93YXRjaEtleTJWYWx1ZVNob3J0W2JdO2NvbnN0IHE9dGhpcy5fd2F0Y2hLZXkyRXhwYW5kSGFuZGxlcltiXSx1PWI9PT10aGlzLl9hY3RpdmVXYXRjaEtleSx4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7UG9seW1lci5kb20oeCkuY2xhc3NMaXN0LmFkZCgidGVuc29yLW5hbWUiKTsKeC5zdHlsZVsidGV4dC1kZWNvcmF0aW9uIl09InVuZGVybGluZSI7eC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3gudGV4dENvbnRlbnQ9cDt4LmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9PntudWxsIT10aGlzLnRlbnNvck5hbWVDbGlja2VkJiZ0aGlzLnRlbnNvck5hbWVDbGlja2VkKGgsayl9KTtjb25zdCBBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7QS50ZXh0Q29udGVudD1sO2NvbnN0IHk9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5kdHlwZTtsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Y29uc3Qgdz10aGlzLl93YXRjaEtleTJEYXRhW2JdLnNoYXBlO2wudGV4dENvbnRlbnQ9eTtjb25zdCBDPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Qy50ZXh0Q29udGVudD1KU09OLnN0cmluZ2lmeSh3KTtjb25zdCBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ri50ZXh0Q29udGVudD1uO1BvbHltZXIuZG9tKEYpLmNsYXNzTGlzdC5hZGQoInZhbHVlLWV4cGFuc2lvbi1saW5rIik7Cm51bGwhPXEmJihGLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIscSwhMSksRi5zdHlsZVsidGV4dC1kZWNvcmF0aW9uIl09InVuZGVybGluZSIsRi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtuPW51bGw7bj10aGlzLl9oZWFsdGhQaWxsc0VuYWJsZWQ/dGhpcy5fcmVuZGVySGVhbHRoUGlsbChwKyI6IittLHtkZXZpY2VfbmFtZTpoLG5vZGVfbmFtZTprLGR0eXBlOnksc2hhcGU6dyx2YWx1ZTpudWxsfSxxKTpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTttPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7bS5zZXRBdHRyaWJ1dGUoImljb24iLCJmb3J3YXJkIik7bS5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiQ29udGludWUgdG8iKTttLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3RoaXMuY29udGludWVUb0NhbGxiYWNrKGgsayl9KTtwLmFwcGVuZENoaWxkKG0pO2QuYXBwZW5kQ2hpbGQoeCk7CmQuYXBwZW5kQ2hpbGQoQSk7ZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKEMpO2QuYXBwZW5kQ2hpbGQoRik7ZC5hcHBlbmRDaGlsZChuKTtkLmFwcGVuZENoaWxkKHApO2Quc2V0QXR0cmlidXRlKCJub2RlTmFtZVdpdGhEZXZpY2UiLHQpO3UmJihQb2x5bWVyLmRvbShkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUtdGVuc29yIiksUG9seW1lci5kb20oZCkuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQiKSk7dGhpcy5fd2F0Y2hLZXkyUm93W2JdPWQ7ZiYmUG9seW1lci5kb20odGhpcy4kJCgiI3RlbnNvci1kYXRhLXRhYmxlIHRib2R5IikpLmFwcGVuZENoaWxkKGQpO2Quc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJlbmQiLGlubGluZToibmVhcmVzdCIsYmVoYXZpb3VyOiJzbW9vdGgifSl9LF9yZW5kZXJIZWFsdGhQaWxsKGIsZCxmKXtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7UG9seW1lci5kb20oaCkuY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwiKTsKbnVsbCE9ZiYmaC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLGYsITEpO2Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRmLmdyYXBoLnNjZW5lLlNWR19OQU1FU1BBQ0UsInN2ZyIpO2Yuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdGhpcy5faGVhbHRoUGlsbFdpZHRoKTtmLnNldEF0dHJpYnV0ZSgiaGVpZ2h0Iix0aGlzLl9oZWFsdGhQaWxsSGVpZ2h0KTtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0Zi5ncmFwaC5zY2VuZS5TVkdfTkFNRVNQQUNFLCJnIik7Zi5hcHBlbmRDaGlsZChrKTtoLmFwcGVuZENoaWxkKGYpO2NvbnN0IHQ9InRkcC8iK2I7dGhpcy5nZXRIZWFsdGhQaWxsKGIsZC5kZXZpY2VfbmFtZSxkLm5vZGVfbmFtZSxsPT57bnVsbD09bD8oaC50ZXh0Q29udGVudD0iTi9BIixoLnN0eWxlLmNvbG9yPSJncmF5Iik6KGQudmFsdWU9bCx0Zi5ncmFwaC5zY2VuZS5hZGRIZWFsdGhQaWxsKGssZCxudWxsLHQsdGhpcy5faGVhbHRoUGlsbFdpZHRoLHRoaXMuX2hlYWx0aFBpbGxIZWlnaHQvCjIsdGhpcy5faGVhbHRoUGlsbEhlaWdodC8yLDApKX0pO3JldHVybiBofSxfaGlnaGxpZ2h0KGIpe1BvbHltZXIuZG9tKHRoaXMuJCQoIiN0ZW5zb3ItZGF0YS10YWJsZSIpKTtjb25zdCBkPVtdO2Zvcihjb25zdCBmIGluIHRoaXMuX3dhdGNoS2V5MlJvdyl7aWYoIXRoaXMuX3dhdGNoS2V5MlJvdy5oYXNPd25Qcm9wZXJ0eShmKSljb250aW51ZTtjb25zdCBoPXRoaXMuX3dhdGNoS2V5MlJvd1tmXTtudWxsIT1oLmdldEF0dHJpYnV0ZSYmKGguZ2V0QXR0cmlidXRlKCJub2RlTmFtZVdpdGhEZXZpY2UiKT09PWI/ZC5wdXNoKGgpOlBvbHltZXIuZG9tKGgpLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkIikpfWlmKG51bGwhPWIpZm9yKGI9MDtiPGQubGVuZ3RoOysrYilQb2x5bWVyLmRvbShkW2JdKS5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZCIpLGRbYl0uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJlbmQiLGlubGluZToibmVhcmVzdCIsYmVoYXZpb3VyOiJzbW9vdGgifSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGVuc29yLXdpZGdldC90ZW5zb3Jfd2lkZ2V0X2JpbmFyeS5qcwp2YXIgV2k9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihkLGYpe2I9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGgsayl7aC5fX3Byb3RvX189a318fGZ1bmN0aW9uKGgsayl7Zm9yKHZhciB0IGluIGspay5oYXNPd25Qcm9wZXJ0eSh0KSYmKGhbdF09a1t0XSl9O3JldHVybiBiKGQsZil9cmV0dXJuIGZ1bmN0aW9uKGQsZil7ZnVuY3Rpb24gaCgpe3RoaXMuY29uc3RydWN0b3I9ZH1iKGQsZik7ZC5wcm90b3R5cGU9bnVsbD09PWY/T2JqZWN0LmNyZWF0ZShmKTooaC5wcm90b3R5cGU9Zi5wcm90b3R5cGUsbmV3IGgpfX0oKSxYaT10aGlzJiZ0aGlzLl9fZ2VuZXJhdG9yfHxmdW5jdGlvbihiLGQpe2Z1bmN0aW9uIGYobil7cmV0dXJuIGZ1bmN0aW9uKHEpe3JldHVybiBoKFtuLHFdKX19ZnVuY3Rpb24gaChuKXtpZih0KXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsKZm9yKDtrOyl0cnl7aWYodD0xLGwmJihwPW5bMF0mMj9sWyJyZXR1cm4iXTpuWzBdP2xbInRocm93Il18fCgocD1sWyJyZXR1cm4iXSkmJnAuY2FsbChsKSwwKTpsLm5leHQpJiYhKHA9cC5jYWxsKGwsblsxXSkpLmRvbmUpcmV0dXJuIHA7aWYobD0wLHApbj1bblswXSYyLHAudmFsdWVdO3N3aXRjaChuWzBdKXtjYXNlIDA6Y2FzZSAxOnA9bjticmVhaztjYXNlIDQ6cmV0dXJuIGsubGFiZWwrKyx7dmFsdWU6blsxXSxkb25lOiExfTtjYXNlIDU6ay5sYWJlbCsrO2w9blsxXTtuPVswXTtjb250aW51ZTtjYXNlIDc6bj1rLm9wcy5wb3AoKTtrLnRyeXMucG9wKCk7Y29udGludWU7ZGVmYXVsdDppZighKHA9ay50cnlzLHA9MDxwLmxlbmd0aCYmcFtwLmxlbmd0aC0xXSkmJig2PT09blswXXx8Mj09PW5bMF0pKXtrPTA7Y29udGludWV9aWYoMz09PW5bMF0mJighcHx8blsxXT5wWzBdJiZuWzFdPHBbM10pKWsubGFiZWw9blsxXTtlbHNlIGlmKDY9PT1uWzBdJiZrLmxhYmVsPHBbMV0pay5sYWJlbD0KcFsxXSxwPW47ZWxzZSBpZihwJiZrLmxhYmVsPHBbMl0pay5sYWJlbD1wWzJdLGsub3BzLnB1c2gobik7ZWxzZXtwWzJdJiZrLm9wcy5wb3AoKTtrLnRyeXMucG9wKCk7Y29udGludWV9fW49ZC5jYWxsKGIsayl9Y2F0Y2gocSl7bj1bNixxXSxsPTB9ZmluYWxseXt0PXA9MH1pZihuWzBdJjUpdGhyb3cgblsxXTtyZXR1cm57dmFsdWU6blswXT9uWzFdOnZvaWQgMCxkb25lOiEwfX12YXIgaz17bGFiZWw6MCxzZW50OmZ1bmN0aW9uKCl7aWYocFswXSYxKXRocm93IHBbMV07cmV0dXJuIHBbMV19LHRyeXM6W10sb3BzOltdfSx0LGwscCxtO3JldHVybiBtPXtuZXh0OmYoMCksInRocm93IjpmKDEpLCJyZXR1cm4iOmYoMil9LCJmdW5jdGlvbiI9PT10eXBlb2YgU3ltYm9sJiYobVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxtfSxZaT10aGlzJiZ0aGlzLl9fcmVhZHx8ZnVuY3Rpb24oYixkKXt2YXIgZj0iZnVuY3Rpb24iPT09dHlwZW9mIFN5bWJvbCYmYltTeW1ib2wuaXRlcmF0b3JdOwppZighZilyZXR1cm4gYjtiPWYuY2FsbChiKTt2YXIgaCxrPVtdO3RyeXtmb3IoOyh2b2lkIDA9PT1kfHwwPGQtLSkmJiEoaD1iLm5leHQoKSkuZG9uZTspay5wdXNoKGgudmFsdWUpfWNhdGNoKGwpe3ZhciB0PXtlcnJvcjpsfX1maW5hbGx5e3RyeXtoJiYhaC5kb25lJiYoZj1iWyJyZXR1cm4iXSkmJmYuY2FsbChiKX1maW5hbGx5e2lmKHQpdGhyb3cgdC5lcnJvcjt9fXJldHVybiBrfTsKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihILEssTSxMKXtyZXR1cm4gbmV3IChNfHwoTT1Qcm9taXNlKSkoZnVuY3Rpb24oUSxUKXtmdW5jdGlvbiBYKFope3RyeXtsYShMLm5leHQoWikpfWNhdGNoKGJhKXtUKGJhKX19ZnVuY3Rpb24gYWEoWil7dHJ5e2xhKExbInRocm93Il0oWikpfWNhdGNoKGJhKXtUKGJhKX19ZnVuY3Rpb24gbGEoWil7Wi5kb25lP1EoWi52YWx1ZSk6KG5ldyBNKGZ1bmN0aW9uKGJhKXtiYShaLnZhbHVlKX0pKS50aGVuKFgsYWEpfWxhKChMPUwuYXBwbHkoSCxLfHxbXSkpLm5leHQoKSl9KX1mdW5jdGlvbiBkKEgpe3JldHVybiBudWxsIT09SC5tYXRjaCgvXmludFswLTldKyQvKXx8bnVsbCE9PUgubWF0Y2goL151aW50WzAtOV0rJC8pfWZ1bmN0aW9uIGYoSCl7cmV0dXJuIG51bGwhPT1ILm1hdGNoKC9eZmxvYXRbMC05XSskLyl8fG51bGwhPT1ILm1hdGNoKC9eYmZsb2F0WzAtOV0rJC8pfWZ1bmN0aW9uIGgoSCl7cmV0dXJuImJvb2wiPT09SC50b0xvd2VyQ2FzZSgpfHwKImJvb2xlYW4iPT09SC50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIGsoSCl7cmV0dXJuInN0ciI9PT1ILnRvTG93ZXJDYXNlKCl8fCJzdHJpbmciPT09SC50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHQoSCl7dmFyIEs9MTtILmZvckVhY2goZnVuY3Rpb24oTSl7Syo9TX0pO3JldHVybiBLfWZ1bmN0aW9uIGwoSCl7cmV0dXJuIDA9PT1ILmxlbmd0aD8ic2NhbGFyIjoiWyIrSCsiXSJ9ZnVuY3Rpb24gcChIKXt2YXIgSz17c2xpY2luZ0RpbXNBbmRJbmRpY2VzOltdLHZpZXdpbmdEaW1zOltdLHZlcnRpY2FsUmFuZ2U6bnVsbCxob3Jpem9udGFsUmFuZ2U6bnVsbH0sTT1ILmxlbmd0aDtpZigxPT09TSlLLnZpZXdpbmdEaW1zPVswXTtlbHNlIGlmKDE8TSl7aWYoMjxNKWZvcih2YXIgTD0wO0w8TS0yOysrTClLLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5wdXNoKHtkaW06TCxpbmRleDowPT09SFtMXT9udWxsOjB9KTtmb3IoTD1ILmxlbmd0aC0yO0w8SC5sZW5ndGg7KytMKUsudmlld2luZ0RpbXMucHVzaChMKX1yZXR1cm4gS30KZnVuY3Rpb24gbShILEspe2lmKEgudmlld2luZ0RpbXNbMF0hPT1LLnZpZXdpbmdEaW1zWzBdfHxILnZpZXdpbmdEaW1zWzFdIT09Sy52aWV3aW5nRGltc1sxXSlyZXR1cm4hMTtLPUguc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gTS5kaW19KTtLLnNvcnQoKTtIPUguc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gTS5kaW19KTtILnNvcnQoKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoSyk9PT1KU09OLnN0cmluZ2lmeShIKX1mdW5jdGlvbiBuKEgpe3JldHVybiAyMD49SC5sZW5ndGg/SDpILnNsaWNlKDAsMTApKyIuLi4iK0guc2xpY2UoSC5sZW5ndGgtNyxILmxlbmd0aCl9ZnVuY3Rpb24gcShILEssTSxMKXt2b2lkIDA9PT1NJiYoTT0yKTtpZihpc05hTihIKSlyZXR1cm4iTmFOIjtpZigtSW5maW5pdHk9PT1IKXJldHVybiItXHUyMjFlIjtpZihJbmZpbml0eT09PUgpcmV0dXJuIitcdTIyMWUiO251bGw9PUwmJihMPQpNYXRoLmFicyhIKSxMPTFFMz5MJiYuMDE8PUx8fDA9PT1MPyJmaXhlZCI6ImV4cG9uZW50aWFsIik7cmV0dXJuIG51bGw9PUx8fCJmaXhlZCI9PT1MP0s/IiIrSDpILnRvRml4ZWQoTSk6SC50b0V4cG9uZW50aWFsKE0pfWZ1bmN0aW9uIHUoSCxLKXt2b2lkIDA9PT1LJiYoSz0hMCk7cmV0dXJuIEg/Sz8iVCI6IlRydWUiOks/IkYiOiJGYWxzZSJ9ZnVuY3Rpb24geChILEspe3ZvaWQgMD09PUsmJihLPTQpO3JldHVybiBudWxsPT09S3x8SC5sZW5ndGg8PUs/SDpILnNsaWNlKDAsSy0xKSsiXHUyMDI2In12YXIgQT1mdW5jdGlvbigpe2Z1bmN0aW9uIEgoSyl7dGhpcy5pc1Nob3duPSExO3RoaXMuYmx1ckhpZGVGdW5jdGlvbj1udWxsO3RoaXMuZHJvcGRvd249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5kcm9wZG93bi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biIpO3RoaXMuZHJvcGRvd24uc3R5bGUucG9zaXRpb249ImZpeGVkIjt0aGlzLmRyb3Bkb3duLnN0eWxlLmRpc3BsYXk9CiJub25lIjtLLmFwcGVuZENoaWxkKHRoaXMuZHJvcGRvd24pfUgucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oSyxNLEwpe3ZhciBRPXRoaXM7TC5mb3JFYWNoKGZ1bmN0aW9uKFgpe3ZhciBhYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0iKTthYS50ZXh0Q29udGVudD1YLmNhcHRpb247US5kcm9wZG93bi5hcHBlbmRDaGlsZChhYSk7WC5kaXNhYmxlZD9hYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tZGlzYWJsZWQiKTooYWEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGxhKXtsYS5zdG9wUHJvcGFnYXRpb24oKTtRLmRyb3Bkb3duLmNsaWNrKCk7aWYobnVsbCE9PVgub25DbGljaylYLm9uQ2xpY2sobGEpO1EuaGlkZSgpfSksYWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsZnVuY3Rpb24obGEpe2lmKG51bGwhPT0KWC5vbkhvdmVyKVgub25Ib3ZlcihsYSk7YWEuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpfSksYWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXthYS5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tYWN0aXZlIik7aWYobnVsbCE9PVgub25Ib3Zlcil7Zm9yKHZhciBsYT1bXSxaPTA7WjxhYS5jaGlsZHJlbi5sZW5ndGg7KytaKXt2YXIgYmE9YWEuY2hpbGRyZW5bWl07YmEuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biIpJiZsYS5wdXNoKGJhKX1sYS5mb3JFYWNoKGZ1bmN0aW9uKGVhKXtyZXR1cm4gYWEucmVtb3ZlQ2hpbGQoZWEpfSl9fSkpfSk7dGhpcy5kcm9wZG93bi5zdHlsZS5kaXNwbGF5PSJibG9jayI7dGhpcy5kcm9wZG93bi5zdHlsZS50b3A9SysicHgiO3RoaXMuZHJvcGRvd24uc3R5bGUubGVmdD0KTSsicHgiO0w9dGhpcy5kcm9wZG93bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgVD1MLmxlZnQtTTt0aGlzLmRyb3Bkb3duLnN0eWxlLnRvcD0oSy0oTC50b3AtSykpLnRvRml4ZWQoMSkrInB4Ijt0aGlzLmRyb3Bkb3duLnN0eWxlLmxlZnQ9KE0tVCkudG9GaXhlZCgxKSsicHgiO3RoaXMuaXNTaG93bj0hMDt0aGlzLmJsdXJIaWRlRnVuY3Rpb249ZnVuY3Rpb24oKXtRLmhpZGUoKX07c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLFEuYmx1ckhpZGVGdW5jdGlvbil9LDUwKX07SC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe2Zvcih0aGlzLmRyb3Bkb3duLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZHJvcGRvd24uZmlyc3RDaGlsZDspdGhpcy5kcm9wZG93bi5yZW1vdmVDaGlsZCh0aGlzLmRyb3Bkb3duLmZpcnN0Q2hpbGQpO3RoaXMuaXNTaG93bj0hMTtudWxsIT10aGlzLmJsdXJIaWRlRnVuY3Rpb24mJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuYmx1ckhpZGVGdW5jdGlvbil9O0gucHJvdG90eXBlLnNob3duPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNTaG93bn07cmV0dXJuIEh9KCkseT1mdW5jdGlvbigpe2Z1bmN0aW9uIEgoSyxNKXt2YXIgTD10aGlzO3RoaXMuY29uZmlnPUs7dGhpcy5wYXJlbnRFbGVtZW50PU07dGhpcy5iYXNlRmxhdE1lbnU9bmV3IEEodGhpcy5wYXJlbnRFbGVtZW50KTt0aGlzLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zPXt9O3RoaXMuY29uZmlnLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oUSxUKXtudWxsIT1RLm9wdGlvbnMmJihMLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zW1RdPVEuZGVmYXVsdFNlbGVjdGlvbil9KX1ILnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKEssTSl7dmFyIEw9dGhpcyxRPVtdO3RoaXMuY29uZmlnLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oVCxYKXt2YXIgYWE9e2NhcHRpb246VC5jYXB0aW9uLG9uQ2xpY2s6bnVsbCxvbkhvdmVyOm51bGx9O2lmKG51bGwhPVQub3B0aW9ucyl7dmFyIGxhPQpMLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zW1hdO2FhLm9uSG92ZXI9ZnVuY3Rpb24oWil7dmFyIGJhPVoudGFyZ2V0LGVhPVtdO1Qub3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGNhLGthKXtlYS5wdXNoKHtjYXB0aW9uOmthPT09bGE/Y2ErIiAoXHUyNzEzKSI6Y2Esb25DbGljazpmdW5jdGlvbigpe2xhIT09a2EmJihMLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zW1hdPWthLFQuY2FsbGJhY2soa2EpKX0sb25Ib3ZlcjpudWxsfSl9KTtaPW5ldyBBKGJhKTtiYT1iYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtaLnNob3coYmEudG9wLGJhLnJpZ2h0LGVhKX19ZWxzZSBhYS5vbkNsaWNrPVQuY2FsbGJhY2s7bnVsbD09VC5pc0VuYWJsZWR8fFQuaXNFbmFibGVkKCl8fChhYS5kaXNhYmxlZD0hMCk7US5wdXNoKGFhKX0pO3RoaXMuYmFzZUZsYXRNZW51LnNob3coSyxNLFEpfTtILnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7dGhpcy5iYXNlRmxhdE1lbnUuaGlkZSgpfTtILnByb3RvdHlwZS5zaG93bj0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYXNlRmxhdE1lbnUuc2hvd24oKX07cmV0dXJuIEh9KCksdzsoZnVuY3Rpb24oSCl7SFtILlVQPTFdPSJVUCI7SFtILkRPV049Ml09IkRPV04iO0hbSC5MRUZUPTNdPSJMRUZUIjtIW0guUklHSFQ9NF09IlJJR0hUIn0pKHd8fCh3PXt9KSk7dmFyIEM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBIKEssTSxMLFEsVCxYKXt0aGlzLnNoYXBlPUs7dGhpcy5zbGljZURpbXM9W107dGhpcy5zbGljZUluZGljZXM9W107aWYoMD09PXQodGhpcy5zaGFwZSkpdGhyb3cgRXJyb3IoIlRlbnNvckVsZW1lbnRTZWxlY3Rpb24gZG9lc24ndCBzdXBwb3J0IHRlbnNvciB3aXRoIHplcm8gZWxlbWVudHMuIik7Zm9yKEs9MDtLPE0uc2xpY2luZ0RpbXNBbmRJbmRpY2VzLmxlbmd0aDsrK0spe3RoaXMuc2xpY2VEaW1zLnB1c2goTS5zbGljaW5nRGltc0FuZEluZGljZXNbS10uZGltKTt2YXIgYWE9TS5zbGljaW5nRGltc0FuZEluZGljZXNbS10uaW5kZXg7aWYobnVsbD09PQphYSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBUZW5zb3JFbGVtZW50U2VsZWN0aW9uIGR1ZSB0byB1bmRldGVybWluZWQgc2xpY2luZyBpbmRleCBhdCBkaW1lbnNpb24gIitLKTt0aGlzLnNsaWNlSW5kaWNlcy5wdXNoKGFhKX10aGlzLnJhbms9dGhpcy5zaGFwZS5sZW5ndGg7aWYoMDx0aGlzLnJhbmsmJnRoaXMuc2xpY2VEaW1zLmxlbmd0aD49dGhpcy5yYW5rKXRocm93IEVycm9yKCJFeHBlY3RlZCBzbGljZURpbXMgdG8gaGF2ZSBhIGxlbmd0aCBsZXNzIHRoYW4gcmFuayAiK3RoaXMucmFuaysiLCBidXQgZ290IGxlbmd0aCAiK3RoaXMuc2xpY2VEaW1zLmxlbmd0aCk7dGhpcy52aWV3RGltcz1bXTtmb3IoSz0wO0s8dGhpcy5yYW5rOysrSyktMT09PXRoaXMuc2xpY2VEaW1zLmluZGV4T2YoSykmJnRoaXMudmlld0RpbXMucHVzaChLKTtpZigyPHRoaXMudmlld0RpbXMubGVuZ3RoKXRocm93IEVycm9yKCJPbmx5IHNlbGVjdGlvbnMgaW4gMUQgYW5kIDJEIGFyZSBzdXBwb3J0ZWQuIik7CnRoaXMucm93U3RhcnQ9bnVsbD09TD8wOkw7dGhpcy5jb2xTdGFydD1udWxsPT1RPzA6UTt0aGlzLnJvd0NvdW50PW51bGw9PVQ/MTpUO3RoaXMuY29sQ291bnQ9bnVsbD09WD8xOlh9SC5wcm90b3R5cGUuZ2V0RWxlbWVudFN0YXR1cz1mdW5jdGlvbihLKXtpZihLLmxlbmd0aCE9PXRoaXMucmFuayl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgaW5kaWNlcyB0byBoYXZlIGEgcmFuayBvZiAiK3RoaXMucmFuaysiLCBidXQgZ290ICIrKEsubGVuZ3RoKyIgKFsiK0srIl0pIikpO2Zvcih2YXIgTT0wO008Sy5sZW5ndGg7KytNKWlmKC0xIT09dGhpcy5zbGljZURpbXMuaW5kZXhPZihNKSYmS1tNXSE9PXRoaXMuc2xpY2VJbmRpY2VzW3RoaXMuc2xpY2VEaW1zLmluZGV4T2YoTSldKXJldHVybiBudWxsO009bnVsbDt2YXIgTD10aGlzLnJvd1N0YXJ0K3RoaXMucm93Q291bnQsUT10aGlzLmNvbFN0YXJ0K3RoaXMuY29sQ291bnQ7aWYoMD09PXRoaXMudmlld0RpbXMubGVuZ3RoKTA9PT1LLmxlbmd0aCYmCihNPXt0b3BFZGdlOiEwLGJvdHRvbUVkZ2U6ITAsbGVmdEVkZ2U6ITAscmlnaHRFZGdlOiEwfSk7ZWxzZSBpZigxPT09dGhpcy52aWV3RGltcy5sZW5ndGgpe3ZhciBUPXRoaXMudmlld0RpbXNbMF07S1tUXT49dGhpcy5yb3dTdGFydCYmS1tUXTxMJiYoTT17dG9wRWRnZTpLW1RdPT09dGhpcy5yb3dTdGFydCxib3R0b21FZGdlOktbVF09PT1MLTEsbGVmdEVkZ2U6ITAscmlnaHRFZGdlOiEwfSl9ZWxzZSBpZigyPT09dGhpcy52aWV3RGltcy5sZW5ndGgpe1Q9dGhpcy52aWV3RGltc1swXTt2YXIgWD10aGlzLnZpZXdEaW1zWzFdO0tbVF0+PXRoaXMucm93U3RhcnQmJktbVF08TCYmS1tYXT49dGhpcy5jb2xTdGFydCYmS1tYXTxRJiYoTT17dG9wRWRnZTpLW1RdPT09dGhpcy5yb3dTdGFydCxib3R0b21FZGdlOktbVF09PT1MLTEsbGVmdEVkZ2U6S1tYXT09PXRoaXMuY29sU3RhcnQscmlnaHRFZGdlOktbWF09PT1RLTF9KX1lbHNlIHRocm93IEVycm9yKCJVbmV4cGVjdGVkIGxlbmd0aCBvZiB2aWV3RGltczogIisKdGhpcy52aWV3RGltcyk7cmV0dXJuIE19O0gucHJvdG90eXBlLm1vdmU9ZnVuY3Rpb24oSyxNKXt2YXIgTD1udWxsO2lmKDA9PT10aGlzLnJhbmt8fDE9PT10aGlzLnJhbmsmJihLPT09dy5MRUZUfHxLPT09dy5SSUdIVCkpcmV0dXJuIG51bGw7aWYobnVsbD09PU0udmVydGljYWxSYW5nZXx8bnVsbD09PU0udmVydGljYWxSYW5nZVsxXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIG1vdmUgZHVlIHRvIHVuZGV0ZXJtaW5lZCB2ZXJ0aWNhbCByYW5nZS4iKTtLPT09dy5VUD8wPHRoaXMucm93U3RhcnQmJih0aGlzLnJvd1N0YXJ0LS0sbnVsbCE9TS52ZXJ0aWNhbFJhbmdlJiZ0aGlzLnJvd1N0YXJ0PE0udmVydGljYWxSYW5nZVswXSYmKEw9dy5VUCkpOks9PT13LkRPV04/bnVsbCE9TS52aWV3aW5nRGltcyYmbnVsbCE9TS52aWV3aW5nRGltc1swXSYmdGhpcy5yb3dTdGFydDx0aGlzLnNoYXBlW00udmlld2luZ0RpbXNbMF1dLTEmJih0aGlzLnJvd1N0YXJ0KyssbnVsbCE9TS52ZXJ0aWNhbFJhbmdlJiYKdGhpcy5yb3dTdGFydD49TS52ZXJ0aWNhbFJhbmdlWzFdJiYoTD13LkRPV04pKTpLPT09dy5MRUZUPzA8dGhpcy5jb2xTdGFydCYmKHRoaXMuY29sU3RhcnQtLSxudWxsIT1NLmhvcml6b250YWxSYW5nZSYmdGhpcy5jb2xTdGFydDxNLmhvcml6b250YWxSYW5nZVswXSYmKEw9dy5MRUZUKSk6Sz09PXcuUklHSFQmJm51bGwhPU0udmlld2luZ0RpbXMmJm51bGwhPU0udmlld2luZ0RpbXNbMV0mJnRoaXMuY29sU3RhcnQ8dGhpcy5zaGFwZVtNLnZpZXdpbmdEaW1zWzFdXS0xJiYodGhpcy5jb2xTdGFydCsrLG51bGwhPU0uaG9yaXpvbnRhbFJhbmdlJiZ0aGlzLmNvbFN0YXJ0Pj1NLmhvcml6b250YWxSYW5nZVsxXSYmKEw9dy5SSUdIVCkpO3RoaXMuY29sQ291bnQ9dGhpcy5yb3dDb3VudD0xO3JldHVybiBMfTtILnByb3RvdHlwZS5nZXRSb3dTdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvd1N0YXJ0fTtILnByb3RvdHlwZS5nZXRSb3dDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvd0NvdW50fTsKSC5wcm90b3R5cGUuZ2V0Q29sU3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2xTdGFydH07SC5wcm90b3R5cGUuZ2V0Q29sQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2xDb3VudH07cmV0dXJuIEh9KCksRj1mdW5jdGlvbigpe2Z1bmN0aW9uIEgoSyxNLEwpe3ZvaWQgMD09PUwmJihMPWZ1bmN0aW9uKCl7fSk7dGhpcy5yb290RGl2PUs7dGhpcy5zaGFwZT1NO3RoaXMub25TbGljaW5nU3BlY0NoYW5nZT1MO3RoaXMuZGltQ29udHJvbHM9W107dGhpcy5kaW1JbnB1dHM9W107dGhpcy5jb21tYXM9W107dGhpcy5kcm9wZG93bnM9W107dGhpcy5icmFja2V0RGl2cz1bbnVsbCxudWxsXTt0aGlzLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZD1bXTt0aGlzLnJhbms9dGhpcy5zaGFwZS5sZW5ndGg7aWYoMz50aGlzLnJhbmspdGhyb3cgRXJyb3IoIkRpbWVuc2lvbiBjb250cm9sIGlzIG5vdCBhcHBsaWNhYmxlIHRvIHRlbnNvciBzaGFwZXMgbGVzcyB0aGFuIDNEOiByZWNlaXZlZCAiKwoodGhpcy5yYW5rKyJEIHRlbnNvciBzaGFwZTogIikrKEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcGUpKyIuIikpO3RoaXMuY3JlYXRlQ29tcG9uZW50cygpO3RoaXMuc2xpY2luZ1NwZWM9cChNKX1ILnByb3RvdHlwZS5jcmVhdGVDb21wb25lbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciBLPXRoaXM7dGhpcy5yb290RGl2LmZpcnN0Q2hpbGQ7KXRoaXMucm9vdERpdi5yZW1vdmVDaGlsZCh0aGlzLnJvb3REaXYuZmlyc3RDaGlsZCk7dGhpcy5kaW1Db250cm9scz1bXTt0aGlzLmRpbUlucHV0cz1bXTt0aGlzLmNvbW1hcz1bXTt0aGlzLmRyb3Bkb3ducz1bXTt0aGlzLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZD1bXTt0aGlzLmJyYWNrZXREaXZzWzBdPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuYnJhY2tldERpdnNbMF0udGV4dENvbnRlbnQ9IlNsaWNpbmc6IFsiO3RoaXMuYnJhY2tldERpdnNbMF0uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tYnJhY2tldHMiKTsKdGhpcy5yb290RGl2LmFwcGVuZENoaWxkKHRoaXMuYnJhY2tldERpdnNbMF0pO2Zvcih2YXIgTT0wO008dGhpcy5yYW5rOysrTSl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7TC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO0wudGl0bGU9IkRpbWVuc2lvbiAiK00rIjogc2l6ZVx4M2QiK3RoaXMuc2hhcGVbTV07dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKEwpO3RoaXMuZGltQ29udHJvbHMucHVzaChMKTt0aGlzLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZC5wdXNoKCExKTtMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7TC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO0wuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKEwpO3RoaXMuZGltSW5wdXRzLnB1c2goTCk7TTx0aGlzLnJhbmstMSYmKEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksTC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1jb21tYSIpLApMLnRleHRDb250ZW50PSIsIix0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoTCksdGhpcy5jb21tYXMucHVzaChMKSk7TD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIik7TC5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoTCk7dGhpcy5kcm9wZG93bnMucHVzaChMKX10aGlzLmJyYWNrZXREaXZzWzFdPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuYnJhY2tldERpdnNbMV0udGV4dENvbnRlbnQ9Il0iO3RoaXMuYnJhY2tldERpdnNbMV0uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tYnJhY2tldHMiKTt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQodGhpcy5icmFja2V0RGl2c1sxXSk7dGhpcy5yb290RGl2LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7Sy5jbGVhckFsbERyb3Bkb3ducygpfSl9O0gucHJvdG90eXBlLnJlbmRlcj0KZnVuY3Rpb24oSyl7ZnVuY3Rpb24gTShhYSl7dmFyIGxhPVguZGltQ29udHJvbHNbYWFdLFo9WC5kaW1JbnB1dHNbYWFdLGJhPVguZHJvcGRvd25zW2FhXTtpZigibm9uZSIhPT1aLnN0eWxlLmRpc3BsYXkpcmV0dXJuImNvbnRpbnVlIjt2YXIgZWE9WC5zaGFwZVthYV07aWYoLTEhPT1RLmluZGV4T2YoYWEpKXt2YXIgY2E9VFtRLmluZGV4T2YoYWEpXTtsYS50ZXh0Q29udGVudD1TdHJpbmcoY2EpO1ouY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0iKTtaLnR5cGU9Im51bWJlciI7Wi5taW49IjAiO1oubWF4PVN0cmluZyhlYS0xKTtaLnZhbHVlPVN0cmluZyhjYSk7WC5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbYWFdfHwobGEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7TC5jbGVhckFsbERyb3Bkb3ducygpO2xhLnN0eWxlLmRpc3BsYXk9Im5vbmUiO1ouc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn0pLFouYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwKZnVuY3Rpb24oKXtpZihudWxsPT09TC5zbGljaW5nU3BlYyl0aHJvdyBFcnJvcigiU2xpY2luZyBjb250cm9sIGNoYW5nZSBjYWxsYmFjayBmYWlsZWQgZHVlIHRvIG1pc3Npbmcgc3BlYy4iKTt2YXIga2E9cGFyc2VJbnQoWi52YWx1ZSwxMCk7IWlzRmluaXRlKGthKXx8MD5rYXx8a2E+PWVhfHxNYXRoLmZsb29yKGVhKSE9ZWE/Wi52YWx1ZT1TdHJpbmcoTC5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXNbUS5pbmRleE9mKGFhKV0uaW5kZXgpOihMLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tRLmluZGV4T2YoYWEpXS5pbmRleD1rYSxsYS50ZXh0Q29udGVudD1TdHJpbmcoa2EpLEwub25TbGljaW5nU3BlY0NoYW5nZShMLnNsaWNpbmdTcGVjKSl9KSxaLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLGZ1bmN0aW9uKCl7Wi5zdHlsZS5kaXNwbGF5PSJub25lIjtsYS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2sifSksWC5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbYWFdPQohMCl9ZWxzZXtpZihYLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdPT09YWEpe2lmKG51bGw9PT1YLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGljYWwgcmFuZ2UuIik7bGEudGV4dENvbnRlbnQ9Ilx1MjE5NSAiK1guc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXSsiOiIrWC5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzFdfWVsc2V7aWYobnVsbD09PVguc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UuIik7bGEudGV4dENvbnRlbnQ9Ilx1MjE5NCAiK1guc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdKyI6IitYLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXX1sYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO1guZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkW2FhXXx8KGxhLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3ZhciBrYT0KbGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7TC5yZW5kZXJEcm9wZG93bk1lbnVJdGVtcyhiYSxrYS5ib3R0b20sa2EubGVmdCxhYSl9KSxYLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFthYV09ITApfX12YXIgTD10aGlzO251bGwhPUsmJih0aGlzLnNsaWNpbmdTcGVjPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoSykpKTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYyl0aHJvdyBFcnJvcigiU2xpY2luZyBjb250cm9sIHJlbmRlcmluZyBmYWlsZWQgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjLiIpO3ZhciBRPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihhYSl7cmV0dXJuIGFhLmRpbX0pLFQ9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKGFhKXtyZXR1cm4gYWEuaW5kZXh9KSxYPXRoaXM7Zm9yKEs9MDtLPHRoaXMucmFuazsrK0spTShLKX07SC5wcm90b3R5cGUucmVuZGVyRHJvcGRvd25NZW51SXRlbXM9CmZ1bmN0aW9uKEssTSxMLFEpe2Z1bmN0aW9uIFQoZWEpe2lmKC0xPT09YWEuaW5kZXhPZihlYSl8fFE9PT1sYS5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXSYmZWE8PWxhLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdfHxRPT1sYS5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXSYmZWE+PWxhLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdKXJldHVybiJjb250aW51ZSI7dmFyIGNhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2NhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSIpO2NhLnRleHRDb250ZW50PSJTd2FwIHdpdGggZGltZW5zaW9uICIrZWE7Sy5hcHBlbmRDaGlsZChjYSk7Y2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsZnVuY3Rpb24oKXtjYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tYWN0aXZlIik7WC5kaW1Db250cm9sc1tlYV0uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0taGlnaGxpZ2h0ZWQiKX0pOwpjYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe2NhLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtYLmRpbUNvbnRyb2xzW2VhXS5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCIpfSk7dmFyIGthPWxhLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdPT09UTtjYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtpZihudWxsPT09WC5zbGljaW5nU3BlYyl0aHJvdyBFcnJvcigiRGltZW5zaW9uIHN3YXBwaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzbGljaW5nIHNwZWMiKTt2YXIgWT1hYS5pbmRleE9mKGVhKTtYLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zW2thPzA6MV09ZWE7WC5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXNbWV09e2RpbTpRLGluZGV4OjB9O1guc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZT1udWxsO1guc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlPQpudWxsO2lmKFgub25TbGljaW5nU3BlY0NoYW5nZSlYLm9uU2xpY2luZ1NwZWNDaGFuZ2UoWC5zbGljaW5nU3BlYyl9KX12YXIgWD10aGlzO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgY2Fubm90IHJlbmRlciBkcm9wZG93biBtZW51IGl0ZW1zIGR1ZSB0byBtaXNzaW5nIHNsaWNpbmcgc3BlYy4iKTt0aGlzLmNsZWFyQWxsRHJvcGRvd25zKCk7Zm9yKHZhciBhYT10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oZWEpe3JldHVybiBlYS5kaW19KSxsYT10aGlzLFo9MDtaPHRoaXMucmFuazsrK1opVChaKTtLLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7Sy5zdHlsZS5kaXNwbGF5PSJub25lIn0pO2lmKEsuZmlyc3RDaGlsZCl7Sy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO0suc3R5bGUudG9wPU0rInB4IjtLLnN0eWxlLmxlZnQ9TCsicHgiO0suc3R5bGUuZGlzcGxheT0KImJsb2NrIjtaPUsuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dmFyIGJhPVoubGVmdC1MO0suc3R5bGUudG9wPShNLShaLnRvcC1NKSkudG9GaXhlZCgxKSsicHgiO0suc3R5bGUubGVmdD0oTC1iYSkudG9GaXhlZCgxKSsicHgifX07SC5wcm90b3R5cGUuc2V0U2xpY2luZ1NwZWM9ZnVuY3Rpb24oSyl7dGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEspKTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYyl0aHJvdyBFcnJvcigiQ2Fubm90IHNldCBzbGljaW5nIHNwZWMgdG8gbnVsbC4iKTt0aGlzLnJlbmRlcih0aGlzLnNsaWNpbmdTcGVjKX07SC5wcm90b3R5cGUuY2xlYXJBbGxEcm9wZG93bnM9ZnVuY3Rpb24oKXt0aGlzLmRyb3Bkb3ducy5mb3JFYWNoKGZ1bmN0aW9uKEspe2lmKG51bGwhPUspe2Zvcig7Sy5maXJzdENoaWxkOylLLnJlbW92ZUNoaWxkKEsuZmlyc3RDaGlsZCk7Sy5zdHlsZS5kaXNwbGF5PSJub25lIn19KX07cmV0dXJuIEh9KCksRD1mdW5jdGlvbigpe2Z1bmN0aW9uIEgoSyl7dGhpcy5jb25maWc9Cks7aWYoIWlzRmluaXRlKEsubWluKSl0aHJvdyBFcnJvcigibWluIHZhbHVlICgiK0subWluKyIpIGlzIG5vdCBmaW5pdGUiKTtpZighaXNGaW5pdGUoSy5tYXgpKXRocm93IEVycm9yKCJtYXggdmFsdWUgKCIrSy5tYXgrIikgaXMgbm90IGZpbml0ZSIpO2lmKEsubWF4PEsubWluKXRocm93IEVycm9yKCJtYXggKCIrSy5tYXgrIikgaXMgXHgzYyBtaW4gKCIrSy5taW4rIikiKTt9SC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKEssTSl7aWYodGhpcy5jb25maWcubWluIT09dGhpcy5jb25maWcubWF4KXt2YXIgTD1LLmdldENvbnRleHQoIjJkIik7aWYobnVsbCE9TCl7Zm9yKHZhciBRPUsud2lkdGgvMTAwLFQ9Sy5oZWlnaHQsWD0uNipULGFhPTA7MTAwPmFhOysrYWEpe3ZhciBsYT1RKmFhLFo9LjIqVCxiYT1ZaSh0aGlzLmdldFJHQihhYS8xMDAqKHRoaXMuY29uZmlnLm1heC10aGlzLmNvbmZpZy5taW4pK3RoaXMuY29uZmlnLm1pbiksMyksZWE9YmFbMF0sY2E9YmFbMV07YmE9YmFbMl07CkwuYmVnaW5QYXRoKCk7TC5maWxsU3R5bGU9InJnYmEoIitlYSsiLCAiK2NhKyIsICIrYmErIiwgMSkiO0wuZmlsbFJlY3QobGEsWixRLFgpO0wuc3Ryb2tlKCl9bnVsbCE9TSYmTT49dGhpcy5jb25maWcubWluJiZNPD10aGlzLmNvbmZpZy5tYXgmJihLPShNLXRoaXMuY29uZmlnLm1pbikvKHRoaXMuY29uZmlnLm1heC10aGlzLmNvbmZpZy5taW4pKksud2lkdGgsTC5iZWdpblBhdGgoKSxMLmZpbGxTdHlsZT0icmdiYSgwLCAwLCAwLCAxKSIsTC5tb3ZlVG8oSywuMipUKSxMLmxpbmVUbyhLLTQsMCksTC5saW5lVG8oSys0LDApLEwuZmlsbCgpLEwuYmVnaW5QYXRoKCksTC5tb3ZlVG8oSywuOCpUKSxMLmxpbmVUbyhLLTQsVCksTC5saW5lVG8oSys0LFQpLEwuZmlsbCgpKX19fTtyZXR1cm4gSH0oKSxCPWZ1bmN0aW9uKEgpe2Z1bmN0aW9uIEsoKXtyZXR1cm4gbnVsbCE9PUgmJkguYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfVdpKEssSCk7Sy5wcm90b3R5cGUuZ2V0UkdCPWZ1bmN0aW9uKE0pe2lmKGlzTmFOKE0pKXJldHVyblsyNTUsCjAsMF07aWYoIWlzRmluaXRlKE0pKXJldHVybiAwPE0/WzAsMCwyNTVdOlsyNTUsMTI3LjUsMF07TT10aGlzLmNvbmZpZy5taW49PT10aGlzLmNvbmZpZy5tYXg/LjU6KE0tdGhpcy5jb25maWcubWluKS8odGhpcy5jb25maWcubWF4LXRoaXMuY29uZmlnLm1pbik7TT1NYXRoLm1heChNYXRoLm1pbihNLDEpLDApO3JldHVyblsyNTUqTSwyNTUqTSwyNTUqTV19O3JldHVybiBLfShEKTtEPWZ1bmN0aW9uKEgpe2Z1bmN0aW9uIEsoKXtyZXR1cm4gbnVsbCE9PUgmJkguYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfVdpKEssSCk7Sy5wcm90b3R5cGUuZ2V0UkdCPWZ1bmN0aW9uKE0pe2lmKGlzTmFOKE0pKXJldHVybls2My43NSw2My43NSw2My43NV07aWYoIWlzRmluaXRlKE0pKXJldHVybiAwPk0/WzEyNy41LDEyNy41LDEyNy41XTpbMTkxLjI1LDE5MS4yNSwxOTEuMjVdO3ZhciBMPTAsUT0wLFQ9MDtNPXRoaXMuY29uZmlnLm1pbj09PXRoaXMuY29uZmlnLm1heD8uNTooTS10aGlzLmNvbmZpZy5taW4pLwoodGhpcy5jb25maWcubWF4LXRoaXMuY29uZmlnLm1pbik7TT1NYXRoLm1heChNYXRoLm1pbihNLDEpLDApOy4zNT49TT8oUT1NLy4zNSxUPTEpOi4zNTxNJiYuNjU+PU0/KEw9KE0tLjM1KS8oLjY1LS4zNSksUT0xLFQ9KC42NS1NKS8oLjY1LS4zNSkpOi42NTxNJiYoTD0xLFE9KDEtTSkvLjM1KTtyZXR1cm5bMjU1KkwsMjU1KlEsMjU1KlRdfTtyZXR1cm4gS30oRCk7dmFyIEk7KGZ1bmN0aW9uKEgpe0hbSC5URVhUPTFdPSJURVhUIjtIW0guSU1BR0U9Ml09IklNQUdFIn0pKEl8fChJPXt9KSk7dmFyIE49e0dyYXlzY2FsZTpCLEpldDpEfSxPPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLLE0sTCl7dGhpcy5yb290RWxlbWVudD1LO3RoaXMudGVuc29yVmlldz1NO3RoaXMuYmFzZVJ1bGVyVGljaz10aGlzLnRvcFJ1bGVyPXRoaXMudmFsdWVTZWN0aW9uPXRoaXMuc2xpY2luZ1NwZWNSb290PXRoaXMubWVudVRodW1iPXRoaXMuaW5mb1N1YnNlY3Rpb249dGhpcy5oZWFkZXJTZWN0aW9uPW51bGw7CnRoaXMudG9wUnVsZXJUaWNrcz1bXTt0aGlzLmxlZnRSdWxlclRpY2tzPVtdO3RoaXMudmFsdWVSb3dzPVtdO3RoaXMudmFsdWVEaXZzPVtdO3RoaXMuc2xpY2luZ0NvbnRyb2w9dGhpcy52YWx1ZVRvb2x0aXA9bnVsbDt0aGlzLmNvbHNDdXRvZmY9dGhpcy5yb3dzQ3V0b2ZmPSExO3RoaXMubWVudT10aGlzLm1lbnVDb25maWc9dGhpcy5zZWxlY3Rpb249bnVsbDt0aGlzLmNvbG9yTWFwTmFtZT0iR3JheXNjYWxlIjt0aGlzLmNvbG9yTWFwPW51bGw7dGhpcy5zaG93SW5kaWNlc09uVGlja3M9ITE7dGhpcy5pbWFnZUNlbGxTaXplPTE2O3RoaXMubWluSW1hZ2VDZWxsU2l6ZT00O3RoaXMubWF4SW1hZ2VDZWxsU2l6ZT00MDt0aGlzLnpvb21TdGVwUmF0aW89MS4yO3RoaXMubnVtZXJpY1N1bW1hcnk9bnVsbDt0aGlzLm9wdGlvbnM9THx8e307dGhpcy5zbGljaW5nU3BlYz1wKHRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlKTt0aGlzLnJhbms9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUubGVuZ3RoOwp0aGlzLnZhbHVlUmVuZGVyTW9kZT1JLlRFWFR9SC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oSyl7c3dpdGNoKEsubGFiZWwpe2Nhc2UgMDp0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQiKTt0aGlzLnJlbmRlckhlYWRlcigpO2lmKCEoZCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGYodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxoKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKXx8ayh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSkpKXRocm93IEVycm9yKCJSZW5kZXJpbmcgZHR5cGUgIit0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSsiIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiIpO3JldHVybls0LHRoaXMucmVuZGVyVmFsdWVzKCldO2Nhc2UgMTpyZXR1cm4gSy5zZW50KCksWzJdfX0pfSl9O0gucHJvdG90eXBlLnJlbmRlckhlYWRlcj0KZnVuY3Rpb24oKXtudWxsPT10aGlzLmhlYWRlclNlY3Rpb24mJih0aGlzLmhlYWRlclNlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5oZWFkZXJTZWN0aW9uLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtaGVhZGVyIiksdGhpcy5yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmhlYWRlclNlY3Rpb24pLHRoaXMuY3JlYXRlTWVudSgpKTt0aGlzLnJlbmRlckluZm8oKX07SC5wcm90b3R5cGUucmVuZGVySW5mbz1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLmhlYWRlclNlY3Rpb24pdGhyb3cgRXJyb3IoIlJlbmRlcmluZyB0ZW5zb3IgaW5mbyBmYWlsZWQgZHVlIHRvIG1pc2luZyBoZWFkZXIgc2VjdGlvbiIpO251bGw9PXRoaXMuaW5mb1N1YnNlY3Rpb24mJih0aGlzLmluZm9TdWJzZWN0aW9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuaW5mb1N1YnNlY3Rpb24uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1pbmZvIiksCnRoaXMuaGVhZGVyU2VjdGlvbi5hcHBlbmRDaGlsZCh0aGlzLmluZm9TdWJzZWN0aW9uKSk7Zm9yKDt0aGlzLmluZm9TdWJzZWN0aW9uLmZpcnN0Q2hpbGQ7KXRoaXMuaW5mb1N1YnNlY3Rpb24ucmVtb3ZlQ2hpbGQodGhpcy5pbmZvU3Vic2VjdGlvbi5maXJzdENoaWxkKTt0aGlzLnJlbmRlck5hbWUoKTt0aGlzLnJlbmRlckRUeXBlKCk7dGhpcy5yZW5kZXJTaGFwZSgpfTtILnByb3RvdHlwZS5yZW5kZXJOYW1lPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBuYW1lIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBpbmZvIHN1YnNlY3Rpb24uIik7aWYobnVsbCE9dGhpcy5vcHRpb25zLm5hbWUmJjAhPT10aGlzLm9wdGlvbnMubmFtZS5sZW5ndGgpe3ZhciBLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0suY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC10ZW5zb3ItbmFtZSIpO0sudGV4dENvbnRlbnQ9Cm4odGhpcy5vcHRpb25zLm5hbWUpO0sudGl0bGU9dGhpcy5vcHRpb25zLm5hbWU7dGhpcy5pbmZvU3Vic2VjdGlvbi5hcHBlbmRDaGlsZChLKX19O0gucHJvdG90eXBlLnJlbmRlckRUeXBlPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBkdHlwZSBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaW5mbyBzdWJzZWN0aW9uLiIpO3ZhciBLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0suY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kdHlwZSIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtNLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZHR5cGUtbGFiZWwiKTtNLnRleHRDb250ZW50PSJkdHlwZToiO0suYXBwZW5kQ2hpbGQoTSk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7TS50ZXh0Q29udGVudD10aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZTtLLmFwcGVuZENoaWxkKE0pOwp0aGlzLmluZm9TdWJzZWN0aW9uLmFwcGVuZENoaWxkKEspfTtILnByb3RvdHlwZS5yZW5kZXJTaGFwZT1mdW5jdGlvbigpe2lmKG51bGw9PXRoaXMuaW5mb1N1YnNlY3Rpb24pdGhyb3cgRXJyb3IoIlJlbmRlcmluZyB0ZW5zb3Igc2hhcGUgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGluZm8gc3Vic2VjdGlvbi4iKTt2YXIgSz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtLLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtc2hhcGUiKTt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtNLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtc2hhcGUtbGFiZWwiKTtNLnRleHRDb250ZW50PSJzaGFwZToiO0suYXBwZW5kQ2hpbGQoTSk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtNLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtc2hhcGUtdmFsdWUiKTtNLnRleHRDb250ZW50PWwodGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUpO0suYXBwZW5kQ2hpbGQoTSk7CnRoaXMuaW5mb1N1YnNlY3Rpb24uYXBwZW5kQ2hpbGQoSyl9O0gucHJvdG90eXBlLmNyZWF0ZU1lbnU9ZnVuY3Rpb24oKXt2YXIgSz10aGlzO3RoaXMubWVudUNvbmZpZz17aXRlbXM6W119O2lmKGYodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxkKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKXx8aCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSkpdGhpcy5tZW51Q29uZmlnLml0ZW1zLnB1c2goe2NhcHRpb246IlNlbGVjdCBkaXNwbGF5IG1vZGUuLi4iLG9wdGlvbnM6WyJUZXh0IiwiSW1hZ2UiXSxkZWZhdWx0U2VsZWN0aW9uOjAsY2FsbGJhY2s6ZnVuY3Rpb24oTSl7MD09PU0/KEsudmFsdWVSZW5kZXJNb2RlPUkuVEVYVCxLLnJlbmRlclZhbHVlcygpKTooSy52YWx1ZVJlbmRlck1vZGU9SS5JTUFHRSxLLnRlbnNvclZpZXcuZ2V0TnVtZXJpY1N1bW1hcnkoKS50aGVuKGZ1bmN0aW9uKEwpe0subnVtZXJpY1N1bW1hcnk9TDtLLnJlbmRlclZhbHVlcygpfSkpfX0pLHRoaXMubWVudUNvbmZpZy5pdGVtcy5wdXNoKHtjYXB0aW9uOiJTZWxlY3QgY29sb3IgbWFwLi4uIiwKb3B0aW9uczpPYmplY3Qua2V5cyhOKSxkZWZhdWx0U2VsZWN0aW9uOjAsY2FsbGJhY2s6ZnVuY3Rpb24oTSl7Sy5jb2xvck1hcE5hbWU9T2JqZWN0LmtleXMoTilbTV07Sy5yZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIEsudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRX19KSx0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiWm9vbSBpbiAoSW1hZ2UgbW9kZSkiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7Sy56b29tSW5PbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCl9LGlzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiBLLnZhbHVlUmVuZGVyTW9kZT09PUkuSU1BR0V9fSksdGhpcy5tZW51Q29uZmlnLml0ZW1zLnB1c2goe2NhcHRpb246Ilpvb20gb3V0IChJbWFnZSBtb2RlKSIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtLLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCl9LGlzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiBLLnZhbHVlUmVuZGVyTW9kZT09PQpJLklNQUdFfX0pO251bGwhPT10aGlzLm1lbnVDb25maWcmJjA8dGhpcy5tZW51Q29uZmlnLml0ZW1zLmxlbmd0aCYmKHRoaXMubWVudT1uZXcgeSh0aGlzLm1lbnVDb25maWcsdGhpcy5oZWFkZXJTZWN0aW9uKSx0aGlzLnJlbmRlck1lbnVUaHVtYigpKX07SC5wcm90b3R5cGUuem9vbUluT25lU3RlcEFuZFJlbmRlclZhbHVlcz1mdW5jdGlvbigpe3RoaXMuaW1hZ2VDZWxsU2l6ZSp0aGlzLnpvb21TdGVwUmF0aW88PXRoaXMubWF4SW1hZ2VDZWxsU2l6ZSYmKHRoaXMuaW1hZ2VDZWxsU2l6ZSo9dGhpcy56b29tU3RlcFJhdGlvLHRoaXMucmVuZGVyVmFsdWVzKCkpfTtILnByb3RvdHlwZS56b29tT3V0T25lU3RlcEFuZFJlbmRlclZhbHVlcz1mdW5jdGlvbigpe3RoaXMuaW1hZ2VDZWxsU2l6ZS90aGlzLnpvb21TdGVwUmF0aW8+PXRoaXMubWluSW1hZ2VDZWxsU2l6ZSYmKHRoaXMuaW1hZ2VDZWxsU2l6ZS89dGhpcy56b29tU3RlcFJhdGlvLHRoaXMucmVuZGVyVmFsdWVzKCkpfTtILnByb3RvdHlwZS5yZW5kZXJNZW51VGh1bWI9CmZ1bmN0aW9uKCl7dmFyIEs9dGhpcztpZihudWxsPT10aGlzLmhlYWRlclNlY3Rpb24pdGhyb3cgRXJyb3IoIlJlbmRlcmluZyBtZW51IHRodW1iIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBoZWFkZXIgc2VjdGlvbi4iKTt0aGlzLm1lbnVUaHVtYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLm1lbnVUaHVtYi50ZXh0Q29udGVudD0iXHUyMmVlIjt0aGlzLm1lbnVUaHVtYi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWIiKTt0aGlzLmhlYWRlclNlY3Rpb24uYXBwZW5kQ2hpbGQodGhpcy5tZW51VGh1bWIpO3RoaXMubWVudVRodW1iLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2lmKG51bGwhPT1LLm1lbnUpaWYoSy5tZW51LnNob3duKCkpSy5tZW51LmhpZGUoKTtlbHNle3ZhciBNPUsubWVudVRodW1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO0subWVudS5zaG93KE0uYm90dG9tLE0ubGVmdCl9fSl9O0gucHJvdG90eXBlLnJlbmRlclZhbHVlcz0KZnVuY3Rpb24oKXtyZXR1cm4gYih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgSz10aGlzO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKE0pe3N3aXRjaChNLmxhYmVsKXtjYXNlIDA6cmV0dXJuIDI8dGhpcy5yYW5rJiZudWxsPT09dGhpcy5zbGljaW5nU3BlY1Jvb3QmJih0aGlzLnNsaWNpbmdTcGVjUm9vdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnNsaWNpbmdTcGVjUm9vdC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXNsaWNpbmctZ3JvdXAiKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2xpY2luZ1NwZWNSb290KSksbnVsbD09dGhpcy52YWx1ZVNlY3Rpb24mJih0aGlzLnZhbHVlU2VjdGlvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnZhbHVlU2VjdGlvbi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXNlY3Rpb24iKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudmFsdWVTZWN0aW9uKSwKdGhpcy52YWx1ZVNlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGZ1bmN0aW9uKEwpe3JldHVybiBiKEssdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBRO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKFQpe3N3aXRjaChULmxhYmVsKXtjYXNlIDA6UT0hMTtudWxsPT10aGlzLm9wdGlvbnMud2hlZWxab29tS2V5fHwiY3RybCI9PT10aGlzLm9wdGlvbnMud2hlZWxab29tS2V5P1E9TC5jdHJsS2V5OiJhbHQiPT09dGhpcy5vcHRpb25zLndoZWVsWm9vbUtleT9RPUwuYWx0S2V5OiJzaGlmdCI9PT10aGlzLm9wdGlvbnMud2hlZWxab29tS2V5JiYoUT1MLnNoaWZ0S2V5KTtpZihRJiZ0aGlzLnZhbHVlUmVuZGVyTW9kZT09PUkuSU1BR0UpcmV0dXJuIEwuc3RvcFByb3BhZ2F0aW9uKCksTC5wcmV2ZW50RGVmYXVsdCgpLDA8TC5kZWx0YVk/dGhpcy56b29tT3V0T25lU3RlcEFuZFJlbmRlclZhbHVlcygpOnRoaXMuem9vbUluT25lU3RlcEFuZFJlbmRlclZhbHVlcygpLFsyXTtpZihudWxsPT0KdGhpcy5zZWxlY3Rpb24pcmV0dXJuWzJdO0wuc3RvcFByb3BhZ2F0aW9uKCk7TC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaGlkZVZhbHVlVG9vbHRpcCgpO3JldHVybls0LHRoaXMuc2Nyb2xsVXBPckRvd24oMDxMLmRlbHRhWT93LkRPV046dy5VUCldO2Nhc2UgMTpyZXR1cm4gVC5zZW50KCksWzJdfX0pfSl9KSx0aGlzLnZhbHVlU2VjdGlvbi50YWJJbmRleD0xMDI0LHRoaXMudmFsdWVTZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKEwpe3ZhciBRPVszOCw0MCwzNywzOV07aWYobnVsbCE9Sy5zZWxlY3Rpb24mJi0xIT09US5pbmRleE9mKEwua2V5Q29kZSkpe0wuc3RvcFByb3BhZ2F0aW9uKCk7TC5wcmV2ZW50RGVmYXVsdCgpO0suaGlkZVZhbHVlVG9vbHRpcCgpO3ZhciBUPVE9bnVsbDszOD09PUwua2V5Q29kZT9UPXcuVVA6NDA9PT1MLmtleUNvZGU/VD13LkRPV046Mzc9PT1MLmtleUNvZGU/VD13LkxFRlQ6Mzk9PT1MLmtleUNvZGUmJihUPXcuUklHSFQpOwpudWxsIT09VCYmKFE9Sy5zZWxlY3Rpb24ubW92ZShULEsuc2xpY2luZ1NwZWMpKTtudWxsPT09UT9LLnJlbmRlclNlbGVjdGlvbigpOlE9PT13LlVQfHxRPT09dy5ET1dOP0suc2Nyb2xsVXBPckRvd24oUSk6KFE9PT13LkxFRlR8fFE9PT13LlJJR0hUKSYmSy5zY3JvbGxMZWZ0T3JSaWdodChRKX19KSksdGhpcy5jbGVhclZhbHVlU2VjdGlvbigpLHRoaXMuY3JlYXRlVG9wUnVsZXIoKSx0aGlzLmNyZWF0ZUxlZnRSdWxlcigpLHRoaXMuY3JlYXRlVmFsdWVEaXZzKCksWzQsdGhpcy5yZW5kZXJSdWxlcnNBbmRWYWx1ZURpdnMoKV07Y2FzZSAxOnJldHVybiBNLnNlbnQoKSwyPHRoaXMucmFuayYmKHRoaXMuc2xpY2luZ0NvbnRyb2w9bmV3IEYodGhpcy5zbGljaW5nU3BlY1Jvb3QsdGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUsZnVuY3Rpb24oTCl7cmV0dXJuIGIoSyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oUSl7c3dpdGNoKFEubGFiZWwpe2Nhc2UgMDppZihtKHRoaXMuc2xpY2luZ1NwZWMsCkwpKXJldHVyblszLDJdO3RoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShMKSk7cmV0dXJuWzQsdGhpcy5yZW5kZXIoKV07Y2FzZSAxOnJldHVybiBRLnNlbnQoKSxbMyw0XTtjYXNlIDI6cmV0dXJuIHRoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShMKSksWzQsdGhpcy5yZW5kZXJSdWxlcnNBbmRWYWx1ZURpdnMoKV07Y2FzZSAzOlEuc2VudCgpLFEubGFiZWw9NDtjYXNlIDQ6cmV0dXJuWzJdfX0pfSl9KSx0aGlzLnNsaWNpbmdDb250cm9sLnJlbmRlcih0aGlzLnNsaWNpbmdTcGVjKSksWzJdfX0pfSl9O0gucHJvdG90eXBlLmNsZWFyVmFsdWVTZWN0aW9uPWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMudmFsdWVTZWN0aW9uKXtmb3IoO3RoaXMudmFsdWVTZWN0aW9uLmZpcnN0Q2hpbGQ7KXRoaXMudmFsdWVTZWN0aW9uLnJlbW92ZUNoaWxkKHRoaXMudmFsdWVTZWN0aW9uLmZpcnN0Q2hpbGQpO3RoaXMudG9wUnVsZXI9bnVsbDsKdGhpcy52YWx1ZVJvd3M9W119fTtILnByb3RvdHlwZS5jcmVhdGVUb3BSdWxlcj1mdW5jdGlvbigpe3ZhciBLPXRoaXM7aWYobnVsbD09PXRoaXMudmFsdWVTZWN0aW9uKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIHRvcCBydWxlciBkdWUgdG8gbWlzc2luZyB2YWx1ZSBzZWN0aW9uLiIpO251bGw9PXRoaXMudG9wUnVsZXImJih0aGlzLnRvcFJ1bGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudG9wUnVsZXIuY2xhc3NMaXN0LmFkZCgidGVuZXNvci13aWRnZXQtdG9wLXJ1bGVyIiksdGhpcy50b3BSdWxlci5zdHlsZS53aGl0ZVNwYWNlPSJub3dyYXAiLHRoaXMudmFsdWVTZWN0aW9uLmFwcGVuZENoaWxkKHRoaXMudG9wUnVsZXIpLHRoaXMudG9wUnVsZXJUaWNrcz1bXSx0aGlzLnRvcFJ1bGVyLmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixmdW5jdGlvbihYKXtyZXR1cm4gYihLLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gWGkodGhpcyxmdW5jdGlvbihhYSl7c3dpdGNoKGFhLmxhYmVsKXtjYXNlIDA6aWYobnVsbD09CnRoaXMuc2VsZWN0aW9uKXJldHVyblsyXTtYLnN0b3BQcm9wYWdhdGlvbigpO1gucHJldmVudERlZmF1bHQoKTt0aGlzLmhpZGVWYWx1ZVRvb2x0aXAoKTtyZXR1cm5bNCx0aGlzLnNjcm9sbExlZnRPclJpZ2h0KDA8WC5kZWx0YVk/dy5SSUdIVDp3LkxFRlQpXTtjYXNlIDE6cmV0dXJuIGFhLnNlbnQoKSxbMl19fSl9KX0pKTtmb3IoO3RoaXMudG9wUnVsZXIuZmlyc3RDaGlsZDspdGhpcy50b3BSdWxlci5yZW1vdmVDaGlsZCh0aGlzLnRvcFJ1bGVyLmZpcnN0Q2hpbGQpO3RoaXMuYmFzZVJ1bGVyVGljaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmJhc2VSdWxlclRpY2suY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayIpO3RoaXMudG9wUnVsZXIuYXBwZW5kQ2hpbGQodGhpcy5iYXNlUnVsZXJUaWNrKTsyPD10aGlzLnJhbmsmJih0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZT1bMCxudWxsXSk7dmFyIE09MT49dGhpcy5yYW5rPwoxOnRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dO3ZhciBMPXRoaXMucm9vdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7dGhpcy5jb2xzQ3V0b2ZmPSExO2Zvcih2YXIgUT0wO1E8TTsrK1Epe3ZhciBUPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1QuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayIpO3RoaXMudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSYmKFQuc3R5bGUud2lkdGg9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIpO3RoaXMudG9wUnVsZXIuYXBwZW5kQ2hpbGQoVCk7dGhpcy50b3BSdWxlclRpY2tzLnB1c2goVCk7aWYoVC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodD49TCl7aWYoMjw9dGhpcy5yYW5rKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZSBmb3IgIisKdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1RKzE7dGhpcy5jb2xzQ3V0b2ZmPSEwfWJyZWFrfX1pZighdGhpcy5jb2xzQ3V0b2ZmJiYyPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV09TX19O0gucHJvdG90eXBlLmNyZWF0ZUxlZnRSdWxlcj1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLnZhbHVlU2VjdGlvbil0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBsZWZ0IHJ1bGVyIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHNlY3Rpb24uIik7dGhpcy52YWx1ZVJvd3M9W107dGhpcy5sZWZ0UnVsZXJUaWNrcz1bXTsxPD10aGlzLnJhbmsmJih0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2U9ClswLG51bGxdKTt2YXIgSz0wPT09dGhpcy5yYW5rPzE6dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV07dGhpcy5yb3dzQ3V0b2ZmPSExO2Zvcih2YXIgTT10aGlzLnJvb3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSxMPTA7TDxLOysrTCl7dmFyIFE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7US5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXJvdyIpO3RoaXMudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSYmKFEuc3R5bGUuaGVpZ2h0PXRoaXMuaW1hZ2VDZWxsU2l6ZSsicHgiLFEuc3R5bGUubGluZUhlaWdodD10aGlzLmltYWdlQ2VsbFNpemUrInB4Iik7dGhpcy52YWx1ZVNlY3Rpb24uYXBwZW5kQ2hpbGQoUSk7dGhpcy52YWx1ZVJvd3MucHVzaChRKTt2YXIgVD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtULmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2siKTsKdGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoVC5zdHlsZS5oZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIsVC5zdHlsZS5saW5lSGVpZ2h0PXRoaXMuaW1hZ2VDZWxsU2l6ZSsicHgiKTtRLmFwcGVuZENoaWxkKFQpO3RoaXMubGVmdFJ1bGVyVGlja3MucHVzaChUKTtpZihULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbT49TSl7aWYoMTw9dGhpcy5yYW5rKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzFdPUwrMTt0aGlzLnJvd3NDdXRvZmY9ITB9YnJlYWt9fWlmKCF0aGlzLnJvd3NDdXRvZmYmJjE8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZSBmb3IgIisKdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09S319O0gucHJvdG90eXBlLmNyZWF0ZVZhbHVlRGl2cz1mdW5jdGlvbigpe2Z1bmN0aW9uIEsoYWEpe2Z1bmN0aW9uIGxhKGJhKXt2YXIgZWE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZWEuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYiKTtULnZhbHVlUmVuZGVyTW9kZT09PUkuSU1BR0UmJihlYS5zdHlsZS53aWR0aD1ULmltYWdlQ2VsbFNpemUrInB4IixlYS5zdHlsZS5oZWlnaHQ9VC5pbWFnZUNlbGxTaXplKyJweCIsZWEuc3R5bGUubGluZUhlaWdodD1ULmltYWdlQ2VsbFNpemUrInB4Iik7VC52YWx1ZVJvd3NbYWFdLmFwcGVuZENoaWxkKGVhKTtULnZhbHVlRGl2c1thYV0ucHVzaChlYSk7ZWEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7TS5zZWxlY3Rpb249bmV3IEMoTS50ZW5zb3JWaWV3LnNwZWMuc2hhcGUsTS5zbGljaW5nU3BlYywKbnVsbD09TS5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlfHxudWxsPT1NLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0/MDpNLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0rYWEsbnVsbD09TS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2V8fG51bGw9PU0uc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdPzA6TS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0rYmEsMSwxKTtNLnJlbmRlclNlbGVjdGlvbigpfSk7ZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsZnVuY3Rpb24oKXt2YXIgY2E9ZWEuZ2V0QXR0cmlidXRlKCJkZXRhaWxlZC12YWx1ZSIpO2lmKG51bGwhPT1jYSl7dmFyIGthPU0ucm9vdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksWT1lYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxFYT1ZLmJvdHRvbS1ZLnRvcCx2YT1ZLnJpZ2h0LVkubGVmdCx4YT1NLmNhbGN1bGF0ZUluZGljZXMoYWEsYmEpO00uZHJhd1ZhbHVlVG9vbHRpcCh4YSwKY2EsWS50b3Ata2EudG9wKy44KkVhLFkubGVmdC1rYS5sZWZ0Ky43NSp2YSl9fSk7ZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtNLmhpZGVWYWx1ZVRvb2x0aXAoKX0pfVQudmFsdWVEaXZzW2FhXT1bXTtmb3IodmFyIFo9MDtaPEw7KytaKWxhKFopfXZhciBNPXRoaXM7aWYobnVsbD09PXRoaXMudmFsdWVSb3dzKXRocm93IEVycm9yKCJWYWx1ZSByb3dzIGFyZSB1bmV4cGVjdGVkbHkgdW5pbml0aWFsaXplZC4iKTt0aGlzLnZhbHVlRGl2cz1bXTtmb3IodmFyIEw9dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aCxRPXRoaXMudmFsdWVSb3dzLmxlbmd0aCxUPXRoaXMsWD0wO1g8UTsrK1gpSyhYKX07SC5wcm90b3R5cGUucmVuZGVyVG9wUnVsZXI9ZnVuY3Rpb24oKXtpZigyPD10aGlzLnJhbmspZm9yKHZhciBLPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dLE09MDtNPHRoaXMudG9wUnVsZXJUaWNrcy5sZW5ndGg7KytNKXtpZihudWxsPT09CnRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt2YXIgTD10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStNO3RoaXMuc2hvd0luZGljZXNPblRpY2tzJiYodGhpcy50b3BSdWxlclRpY2tzW01dLnRleHRDb250ZW50PUw8Sz8iIitMOiIiKX19O0gucHJvdG90eXBlLnJlbmRlckxlZnRSdWxlcj1mdW5jdGlvbigpe2lmKDE8PXRoaXMucmFuaylmb3IodmFyIEs9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV0sTT0wO008dGhpcy5sZWZ0UnVsZXJUaWNrcy5sZW5ndGg7KytNKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRjaWFsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7dmFyIEw9dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdKwpNO3RoaXMuc2hvd0luZGljZXNPblRpY2tzJiYodGhpcy5sZWZ0UnVsZXJUaWNrc1tNXS50ZXh0Q29udGVudD1MPEs/IiIrTDoiIil9fTtILnByb3RvdHlwZS5yZW5kZXJWYWx1ZURpdnM9ZnVuY3Rpb24oKXtyZXR1cm4gYih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgSyxNLEwsUSxULFgsYWEsbGEsWixiYSxlYSxjYSxrYSxZLEVhLHZhLHhhO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKEFhKXtzd2l0Y2goQWEubGFiZWwpe2Nhc2UgMDpyZXR1cm4gSz10aGlzLnZhbHVlRGl2cy5sZW5ndGgsTT10aGlzLnZhbHVlRGl2c1swXS5sZW5ndGgsWzQsdGhpcy50ZW5zb3JWaWV3LnZpZXcodGhpcy5zbGljaW5nU3BlYyldO2Nhc2UgMTpMPUFhLnNlbnQoKTswPT09dGhpcy5yYW5rP0w9W1tMXV06MT09PXRoaXMucmFuayYmKEw9TC5tYXAoZnVuY3Rpb24oRmEpe3JldHVybltGYV19KSk7UT10aGlzLmdldFZhbHVlQ2xhc3MoKTtUPXRoaXMudmFsdWVSZW5kZXJNb2RlO2lmKFQ9PT0KSS5JTUFHRSl7aWYobnVsbD09dGhpcy5udW1lcmljU3VtbWFyeSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIHJlbmRlciBpbWFnZSByZXByZXNlbnRhdGlvbiBvZiB0ZW5zb3IgZHVlIHRvIG1pc3NpbmcgbnVtZXJpYyBzdW1tYXJ5Iik7WD10aGlzLm51bWVyaWNTdW1tYXJ5O2FhPVgubWluaW11bTtsYT1YLm1heGltdW07aWYobnVsbD09YWF8fG51bGw9PWxhKXRocm93IEVycm9yKCJGYWlsZWQgdG8gcmVuZGVyIGltYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRlbnNvciBkdWUgdG8gbWlzc2luZyBtaW5pbXVtIG9yIG1heGltdW0gdmFsdWVzIGluIG51bWVyaWMgc3VtbWFyeSIpO1o9e21pbjphYSxtYXg6bGF9O3RoaXMuY29sb3JNYXA9dGhpcy5jb2xvck1hcE5hbWUgaW4gTj9uZXcgTlt0aGlzLmNvbG9yTWFwTmFtZV0oWik6bmV3IEIoWil9Zm9yKGJhPTA7YmE8SzsrK2JhKWZvcihlYT0wO2VhPE07KytlYSljYT10aGlzLnZhbHVlRGl2c1tiYV1bZWFdLGJhPEwubGVuZ3RoJiZlYTxMW2JhXS5sZW5ndGg/CihrYT1MW2JhXVtlYV0sVD09PUkuSU1BR0U/KFk9WWkodGhpcy5jb2xvck1hcC5nZXRSR0Ioa2EpLDMpLEVhPVlbMF0sdmE9WVsxXSx4YT1ZWzJdLGNhLnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmdiKCIrRWErIiwgIit2YSsiLCAiK3hhKyIpIik6Im51bWVyaWMiPT09UT9jYS50ZXh0Q29udGVudD1xKGthLGQodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpKToiYm9vbGVhbiI9PT1RP2NhLnRleHRDb250ZW50PXUoa2EpOiJzdHJpbmciPT09USYmKGNhLnRleHRDb250ZW50PXgoa2EpKSxjYS5zZXRBdHRyaWJ1dGUoImRldGFpbGVkLXZhbHVlIix0aGlzLmdldERldGFpbGVkVmFsdWVUb29sdGlwU3RyaW5nKGthKSkpOihjYS50ZXh0Q29udGVudD0iIixjYS5zZXRBdHRyaWJ1dGUoImRldGFpbGVkLXZhbHVlIiwiIikpO3RoaXMucmVuZGVyU2VsZWN0aW9uKCk7cmV0dXJuWzJdfX0pfSl9O0gucHJvdG90eXBlLmdldERldGFpbGVkVmFsdWVUb29sdGlwU3RyaW5nPWZ1bmN0aW9uKEspe3JldHVybiJib29sZWFuIj09PQp0aGlzLmdldFZhbHVlQ2xhc3MoKT91KEssITEpOiJzdHJpbmciPT09dGhpcy5nZXRWYWx1ZUNsYXNzKCk/Ikxlbmd0aC0iK0subGVuZ3RoKycgc3RyaW5nOiAiJyt4KEssNTAwKSsnIic6U3RyaW5nKEspfTtILnByb3RvdHlwZS5yZW5kZXJTZWxlY3Rpb249ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLnNlbGVjdGlvbilmb3IodmFyIEs9dGhpcy52YWx1ZURpdnMubGVuZ3RoLE09dGhpcy52YWx1ZURpdnNbMF0ubGVuZ3RoLEw9MDtMPEs7KytMKWZvcih2YXIgUT0wO1E8TTsrK1Epe3ZhciBUPXRoaXMudmFsdWVEaXZzW0xdW1FdO1QuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uIik7VC5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIik7VC5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIik7VC5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tbGVmdCIpOwpULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCIpO3ZhciBYPXRoaXMuY2FsY3VsYXRlSW5kaWNlcyhMLFEpO1g9dGhpcy5zZWxlY3Rpb24uZ2V0RWxlbWVudFN0YXR1cyhYKTtudWxsIT09WCYmKFQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uIiksWC50b3BFZGdlJiZULmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi10b3AiKSxYLmJvdHRvbUVkZ2UmJlQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSIpLFgubGVmdEVkZ2UmJlQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWxlZnQiKSxYLnJpZ2h0RWRnZSYmVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tcmlnaHQiKSl9fTtILnByb3RvdHlwZS5jYWxjdWxhdGVJbmRpY2VzPQpmdW5jdGlvbihLLE0pe2Zvcih2YXIgTD1bXSxRPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihsYSl7cmV0dXJuIGxhLmRpbX0pLFQ9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKGxhKXtyZXR1cm4gbGEuaW5kZXh9KSxYPTA7WDx0aGlzLnJhbms7KytYKWlmKC0xIT09US5pbmRleE9mKFgpKXt2YXIgYWE9VFtRLmluZGV4T2YoWCldO2lmKG51bGw9PT1hYSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBpbmRpY2VzOiBVbmRldGVybWluZWQgaW5kZXggYXQgZGltZW5zaW9uICIrWCk7TC5wdXNoKGFhKX1lbHNlIGlmKFg9PT10aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlfHxudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY2FsY3VsYXRlIGluZGljZXMgZHVlIHRvIHVuZGVydGVybWluZWQgdmVydGljYWwgcmFuZ2UuIik7CkwucHVzaCh0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0rSyl9ZWxzZSBpZihYPT09dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXSl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlfHxudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjYWxjdWxhdGUgaW5kaWNlcyBkdWUgdG8gdW5kZXJ0ZXJtaW5lZCB2ZXJ0aWNhbCByYW5nZS4iKTtMLnB1c2godGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0rTSl9cmV0dXJuIEx9O0gucHJvdG90eXBlLmRyYXdWYWx1ZVRvb2x0aXA9ZnVuY3Rpb24oSyxNLEwsUSl7bnVsbD09PXRoaXMudmFsdWVUb29sdGlwJiYodGhpcy52YWx1ZVRvb2x0aXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy52YWx1ZVRvb2x0aXAuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIiksdGhpcy5yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnZhbHVlVG9vbHRpcCkpOwpmb3IoO3RoaXMudmFsdWVUb29sdGlwLmZpcnN0Q2hpbGQ7KXRoaXMudmFsdWVUb29sdGlwLnJlbW92ZUNoaWxkKHRoaXMudmFsdWVUb29sdGlwLmZpcnN0Q2hpbGQpO3ZhciBUPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1QuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWluZGljZXMiKTtULnRleHRDb250ZW50PSJJbmRpY2VzOiAiK0pTT04uc3RyaW5naWZ5KEspO3RoaXMudmFsdWVUb29sdGlwLmFwcGVuZENoaWxkKFQpO0s9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtdmFsdWUiKTtLLnRleHRDb250ZW50PU07dGhpcy52YWx1ZVRvb2x0aXAuYXBwZW5kQ2hpbGQoSyk7dGhpcy52YWx1ZVRvb2x0aXAuc3R5bGUudG9wPUwrInB4Ijt0aGlzLnZhbHVlVG9vbHRpcC5zdHlsZS5sZWZ0PVErInB4Ijt0aGlzLnZhbHVlVG9vbHRpcC5zdHlsZS5kaXNwbGF5PSJibG9jayI7CnRoaXMudmFsdWVSZW5kZXJNb2RlPT1JLklNQUdFJiZudWxsIT10aGlzLmNvbG9yTWFwJiYoTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1jb2xvcmJhciIpLHRoaXMudmFsdWVUb29sdGlwLmFwcGVuZENoaWxkKEwpLHRoaXMuY29sb3JNYXAucmVuZGVyKEwscGFyc2VGbG9hdChNKSkpfTtILnByb3RvdHlwZS5oaWRlVmFsdWVUb29sdGlwPWZ1bmN0aW9uKCl7bnVsbCE9dGhpcy52YWx1ZVRvb2x0aXAmJih0aGlzLnZhbHVlVG9vbHRpcC5zdHlsZS5kaXNwbGF5PSJub25lIil9O0gucHJvdG90eXBlLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cz1mdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKEspe3N3aXRjaChLLmxhYmVsKXtjYXNlIDA6cmV0dXJuIG51bGwhPXRoaXMuc2xpY2luZ0NvbnRyb2wmJnRoaXMuc2xpY2luZ0NvbnRyb2wuc2V0U2xpY2luZ1NwZWModGhpcy5zbGljaW5nU3BlYyksCnRoaXMuY2FsY3VsYXRlU2hvd0luZGljZXNPblJ1bGVyVGlja3MoKSx0aGlzLnJlbmRlclRvcFJ1bGVyKCksdGhpcy5yZW5kZXJMZWZ0UnVsZXIoKSxbNCx0aGlzLnJlbmRlclZhbHVlRGl2cygpXTtjYXNlIDE6cmV0dXJuIEsuc2VudCgpLFsyXX19KX0pfTtILnByb3RvdHlwZS5jYWxjdWxhdGVTaG93SW5kaWNlc09uUnVsZXJUaWNrcz1mdW5jdGlvbigpe2lmKDI8PXRoaXMucmFuayl7dmFyIEs9dGhpcy50b3BSdWxlclRpY2tzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuc2hvd0luZGljZXNPblRpY2tzPUsucmlnaHQtSy5sZWZ0PjkqTWF0aC5jZWlsKE1hdGgubG9nKHRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF1dKS9NYXRoLkxOMTApfWVsc2UgMT09PXRoaXMucmFuaz8oSz10aGlzLmxlZnRSdWxlclRpY2tzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHRoaXMuc2hvd0luZGljZXNPblRpY2tzPTE2PEsuYm90dG9tLQpLLnRvcCk6dGhpcy5zaG93SW5kaWNlc09uVGlja3M9ITF9O0gucHJvdG90eXBlLnNjcm9sbEhvcml6b250YWxseT1mdW5jdGlvbihLKXtyZXR1cm4gYih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgTSxMO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKFEpe3N3aXRjaChRLmxhYmVsKXtjYXNlIDA6aWYoMT49dGhpcy5yYW5rKXJldHVyblsyXTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZSBmb3IgIit0aGlzLnJhbmsrIkQgdGVuc29yLiIpO009dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07aWYoMD5LfHxLPj1NKXRocm93IEVycm9yKCJJbmRleCBvdXQgb2YgYm91bmQ6ICIrSysiIGlzIG91dHNpZGUgWzAsICIrTSsiXSkiKTt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXT1LO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPQpLK3RoaXMudG9wUnVsZXJUaWNrcy5sZW5ndGg7TD10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdXTt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT5MJiYodGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV09TCk7cmV0dXJuWzQsdGhpcy5yZW5kZXJSdWxlcnNBbmRWYWx1ZURpdnMoKV07Y2FzZSAxOnJldHVybiBRLnNlbnQoKSxbMl19fSl9KX07SC5wcm90b3R5cGUuc2Nyb2xsVmVydGljYWxseT1mdW5jdGlvbihLKXtyZXR1cm4gYih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgTSxMO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKFEpe3N3aXRjaChRLmxhYmVsKXtjYXNlIDA6aWYoMD09PXRoaXMucmFuaylyZXR1cm5bMl07aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZSBmb3IgIit0aGlzLnJhbmsrCiJEIHRlbnNvci4iKTtpZihudWxsPT09dGhpcy52YWx1ZVJvd3MpdGhyb3cgRXJyb3IoIlZlcnRpY2FsIHNjcm9sbGluZyBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgdmFsdWUgcm93cy4iKTtNPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF1dO2lmKDA+S3x8Sz49TSl0aHJvdyBFcnJvcigiSW5kZXggb3V0IG9mIGJvdW5kOiAiK0srIiBpcyBvdXRzaWRlIFswLCAiK00rIl0pIik7dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdPUs7dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzFdPUsrdGhpcy52YWx1ZVJvd3MubGVuZ3RoO0w9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV07dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzFdPkwmJih0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09TCk7cmV0dXJuWzQsdGhpcy5yZW5kZXJSdWxlcnNBbmRWYWx1ZURpdnMoKV07CmNhc2UgMTpyZXR1cm4gUS5zZW50KCksWzJdfX0pfSl9O0gucHJvdG90eXBlLnNjcm9sbFVwT3JEb3duPWZ1bmN0aW9uKEspe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBNLEwsUTtyZXR1cm4gWGkodGhpcyxmdW5jdGlvbihUKXtzd2l0Y2goVC5sYWJlbCl7Y2FzZSAwOmlmKDA9PT10aGlzLnJhbmt8fCF0aGlzLnJvd3NDdXRvZmYpcmV0dXJuWzJdO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTtpZihudWxsPT09dGhpcy52YWx1ZVJvd3MpdGhyb3cgRXJyb3IoIlZlcnRpY2FsIHNjcm9sbGluZyBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgdmFsdWUgcm93cy4iKTtNPXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXTtpZihLIT09dy5ET1dOKXJldHVyblszLDNdO0w9dGhpcy52YWx1ZVJvd3MubGVuZ3RoLQoxO1E9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV0tTDtyZXR1cm4gTTxRP1s0LHRoaXMuc2Nyb2xsVmVydGljYWxseShNKzEpXTpbMywyXTtjYXNlIDE6VC5zZW50KCksVC5sYWJlbD0yO2Nhc2UgMjpyZXR1cm5bMyw1XTtjYXNlIDM6cmV0dXJuIDA8PU0tMT9bNCx0aGlzLnNjcm9sbFZlcnRpY2FsbHkoTS0xKV06WzMsNV07Y2FzZSA0OlQuc2VudCgpLFQubGFiZWw9NTtjYXNlIDU6cmV0dXJuWzJdfX0pfSl9O0gucHJvdG90eXBlLnNjcm9sbExlZnRPclJpZ2h0PWZ1bmN0aW9uKEspe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBNLEwsUTtyZXR1cm4gWGkodGhpcyxmdW5jdGlvbihUKXtzd2l0Y2goVC5sYWJlbCl7Y2FzZSAwOmlmKDE+PXRoaXMucmFua3x8IXRoaXMuY29sc0N1dG9mZilyZXR1cm5bMl07aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJIb3Jpem9udGFsIHNjcm9sbGluZyBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZS4iKTsKTT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXTtpZihLIT09dy5SSUdIVClyZXR1cm5bMywzXTtMPXRoaXMudG9wUnVsZXJUaWNrcy5sZW5ndGgtMTtRPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dLUw7cmV0dXJuIE08UT9bNCx0aGlzLnNjcm9sbEhvcml6b250YWxseShNKzEpXTpbMywyXTtjYXNlIDE6VC5zZW50KCksVC5sYWJlbD0yO2Nhc2UgMjpyZXR1cm5bMyw1XTtjYXNlIDM6cmV0dXJuIDA8PU0tMT9bNCx0aGlzLnNjcm9sbEhvcml6b250YWxseShNLTEpXTpbMyw1XTtjYXNlIDQ6VC5zZW50KCksVC5sYWJlbD01O2Nhc2UgNTpyZXR1cm5bMl19fSl9KX07SC5wcm90b3R5cGUubmF2aWdhdGVUb0luZGljZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gWGkodGhpcyxmdW5jdGlvbigpe3Rocm93IEVycm9yKCJuYXZpZ2F0ZVRvSW5kaWNlcygpIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7Cn0pfSl9O0gucHJvdG90eXBlLmdldFZhbHVlQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgSz10aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZTtyZXR1cm4gZChLKXx8ZihLKT8ibnVtZXJpYyI6aChLKT8iYm9vbGVhbiI6InN0cmluZyJ9O3JldHVybiBIfSgpO0Q9T2JqZWN0LmZyZWV6ZSh7dGVuc29yV2lkZ2V0OmZ1bmN0aW9uKEgsSyxNKXtyZXR1cm4gbmV3IE8oSCxLLE0pfSxWRVJTSU9OOiIwLjAuMCJ9KTt3aW5kb3cudGVuc29yX3dpZGdldD1EfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItbGluZS1jaGFydC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1saW5lLWNoYXJ0Iixwcm9wZXJ0aWVzOntkYXRhOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfZGVmYXVsdFNlcmllc05hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJfX2RlYnVnZ2VyX2RhdGFfXyIscmVhZG9ubHk6ITB9LF9saW5lQ2hhcnRYQ29tcG9uZW50c0NyZWF0aW9uTWV0aG9kOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCx2YWx1ZTooKT0+KCk9Pntjb25zdCBiPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjtyZXR1cm57c2NhbGU6YixheGlzOm5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGIsImJvdHRvbSIpLGFjY2Vzc29yOmQ9PmQuc3RlcH19fSxfbGluZUNoYXJ0WVZhbHVlQWNjZXNzb3I6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOigpPT5iPT5iLnNjYWxhcn0sX2xpbmVDaGFydFRvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLHZhbHVlOigpPT5be3RpdGxlOiJOYW1lIixldmFsdWF0ZTpiPT4KInN0ZXBceDNkIitiLmRhdHVtLnN0ZXArIjsgc2NhbGFyXHgzZCAiK2IuZGF0dW0uc2NhbGFyfV19LF9saW5lQ2hhcnRTbW9vdGhpbmdFbmFibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9fSxvYnNlcnZlcnM6WyJyZW5kZXIoZGF0YSkiXSxyZW5kZXIoYil7aWYobnVsbCE9Yil7dmFyIGQ9dGhpcy4kJCgidnotbGluZS1jaGFydDIiKTtkLnNldFZpc2libGVTZXJpZXMoW3RoaXMuX2RlZmF1bHRTZXJpZXNOYW1lXSk7dmFyIGY9W10saD1iLng7Yj1iLnk7Zm9yKGxldCBrPTA7azxoLmxlbmd0aDsrK2spZi5wdXNoKHtzdGVwOmhba10sc2NhbGFyOmJba119KTtkLnNldFNlcmllc0RhdGEodGhpcy5fZGVmYXVsdFNlcmllc05hbWUsZil9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi10ZW5zb3ItdmFsdWUtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi10ZW5zb3ItdmFsdWUtdmlldyIscHJvcGVydGllczp7dmlld0lkOlN0cmluZyx0ZW5zb3JOYW1lOlN0cmluZyxkZWJ1Z09wOlN0cmluZyxkZXZpY2VOYW1lOlN0cmluZyxtYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lOlN0cmluZyxzbGljaW5nOlN0cmluZyx0aW1lSW5kaWNlczpTdHJpbmcsZHR5cGU6U3RyaW5nLHNoYXBlOkFycmF5LGNvbnRpbnVlVG9CdXR0b25DYWxsYmFjazpPYmplY3QsY2xvc2VCdXR0b25DYWxsYmFjazpPYmplY3QsdGVuc29yTmFtZUNhbGxiYWNrOk9iamVjdCx0ZW5zb3JXaWRnZXQ6T2JqZWN0LGdldEhlYWx0aFBpbGw6RnVuY3Rpb24sX2lzVGVuc29yVmFsdWVTY2FsYXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2lzVGVuc29yVmFsdWVMaW5lQ2hhcnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2lzVGVuc29yVmFsdWVJbWFnZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZGF0YVNjYWxhcjp7dHlwZTpOdW1iZXIsdmFsdWU6bnVsbH0sCl9saW5lQ2hhcnREYXRhOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9kYXRhSW1hZ2VTcmM6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcigxMCl9fSxvYnNlcnZlcnM6WyJfdXBkYXRlVGltZUluZGljZXNUb2dnbGUodGltZUluZGljZXMpIl0scmVuZGVyVGVuc29yVmFsdWUoKXtpZih0aGlzLnRlbnNvck5hbWUpaWYobnVsbD09dGhpcy5zbGljaW5nKXt0aGlzLnNldCgiX3VzZVRlbnNvcldpZGdldCIsITApO2NvbnN0IGQ9e3NwZWM6e2R0eXBlOnRoaXMuZHR5cGUsc2hhcGU6dGhpcy5zaGFwZX0sZ2V0OigpPT57dGhyb3cgRXJyb3IoInRlbnNvclZpZXcuZ2V0KCkgaXMgbm90IGltcGxlbWVudGVkIHlldC4iKTt9LHZpZXc6Zj0+e2NvbnN0IGg9dGhpcztyZXR1cm4gaGMoZnVuY3Rpb24qKCl7Y29uc3Qgaz1oLnNoYXBlLmxlbmd0aCx0PWYuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChtPT4KbS5kaW0pLGw9Zi5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKG09Pm0uaW5kZXgpO2xldCBwPSJbIjtmb3IobGV0IG09MDttPGs7KyttKS0xIT09dC5pbmRleE9mKG0pP3ArPWAke2xbdC5pbmRleE9mKG0pXX1gOmYudmlld2luZ0RpbXNbMF09PT1tP3ArPWAke2YudmVydGljYWxSYW5nZVswXX06JHtmLnZlcnRpY2FsUmFuZ2VbMV19YDpmLnZpZXdpbmdEaW1zWzFdPT09bSYmKHArPWAke2YuaG9yaXpvbnRhbFJhbmdlWzBdfToke2YuaG9yaXpvbnRhbFJhbmdlWzFdfWApLG08ay0xJiYocCs9IiwiKTtwKz0iXSI7cmV0dXJuIG5ldyBQcm9taXNlKChtLG4pPT57Y29uc3QgcT1oLl9nZXRUZW5zb3JEYXRhVVJMKHt3YXRjaF9rZXk6aC50ZW5zb3JOYW1lKyI6IitoLmRlYnVnT3Asc2xpY2luZzpwLHRpbWVfaW5kaWNlczpoLnRpbWVJbmRpY2VzLG1hcHBpbmc6Im5vbmUifSk7aC5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChxKS50aGVuKHU9PntudWxsPT11LmVycm9yP20odS50ZW5zb3JfZGF0YVt1LnRlbnNvcl9kYXRhLmxlbmd0aC0KMV0pOm4odS5lcnJvcil9KS5jYXRjaCh1PT5uKHUpKX0pfSl9LGdldE51bWVyaWNTdW1tYXJ5OigpPT57Y29uc3QgZj10aGlzO3JldHVybiBoYyhmdW5jdGlvbiooKXtyZXR1cm4gbmV3IFByb21pc2UoKGgsayk9Pntjb25zdCB0PWYudGVuc29yTmFtZSsiOiIrZi5kZWJ1Z09wO2YuZ2V0SGVhbHRoUGlsbCh0LGYuZGV2aWNlTmFtZSxmLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWUsbD0+e251bGw9PWw/ayhgRmFpbGVkIHRvIGdldCBoZWFsdGggcGlsbCBmb3Igd2F0Y2gga2V5ICR7dH1gKTpoKHtlbGVtZW50Q291bnQ6bFsxXSxtaW5pbXVtOmxbOF0sbWF4aW11bTpsWzldfSl9KX0pfSl9fTtzZXRUaW1lb3V0KCgpPT57bnVsbD09dGhpcy50ZW5zb3JXaWRnZXQmJih0aGlzLnRlbnNvcldpZGdldD10ZW5zb3Jfd2lkZ2V0LnRlbnNvcldpZGdldCh0aGlzLiQkKCIjdGVuc29yLXdpZGdldCIpLGQse3doZWVsWm9vbUtleToiYWx0In0pKTt0aGlzLnRlbnNvcldpZGdldC5yZW5kZXIoKX0sCjEwKX1lbHNle3RoaXMuc2V0KCJfdXNlVGVuc29yV2lkZ2V0IiwhMSk7dmFyIGI9dGhpcy5fcmFua0Zyb21TbGljaW5nKHRoaXMuc2xpY2luZy50cmltKCkpO2NvbnN0IGQ9dGhpcy5faXNUaW1lSW5kaWNlc1NpbmdsZVN0ZXAodGhpcy50aW1lSW5kaWNlcyk7bGV0IGY9YjtpZighZCl7aWYoMTxiKXt0aGlzLl9zaG93VG9hc3QoIkhpc3RvcnkgZm9yIHRlbnNvcnMgXHgzZSAxRCBpcyBub3QgeWV0IHN1cHBvcnRlZC4iKTtyZXR1cm59Zis9MX1iPXRoaXMuX2dldFRlbnNvckRhdGFVUkwoe3dhdGNoX2tleTp0aGlzLnRlbnNvck5hbWUrIjoiK3RoaXMuZGVidWdPcCxzbGljaW5nOnRoaXMuc2xpY2luZyx0aW1lX2luZGljZXM6dGhpcy50aW1lSW5kaWNlcyxtYXBwaW5nOjI8PWY/ImltYWdlL3BuZyI6Im5vbmUifSk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGg9Pnt0aGlzLiQkKCIjZGVidWctb3AiKS50ZXh0Q29udGVudD10aGlzLl9jYWxjdWxhdGVEZWJ1Z09wVG9EaXNwbGF5KCk7CmlmKG51bGwhPWguZXJyb3IpdGhpcy5fc2hvd1RvYXN0KGguZXJyb3IudHlwZSsiOiAiK2guZXJyb3IubWVzc2FnZSk7ZWxzZSBpZihoPWQ/aC50ZW5zb3JfZGF0YVswXTpoLnRlbnNvcl9kYXRhLDA9PT1mKXRoaXMuX3NldFZpc3VhbGl6YXRpb25UeXBlKCJzY2FsYXIiKSx0aGlzLnNldCgiX2RhdGFTY2FsYXIiLGgpO2Vsc2UgaWYoMT09PWYpe3RoaXMuX3NldFZpc3VhbGl6YXRpb25UeXBlKCJsaW5lQ2hhcnQiKTtsZXQgaz17eDpbXSx5Omh9O2ZvcihsZXQgdD0wO3Q8aC5sZW5ndGg7Kyt0KWsueC5wdXNoKHQrMSk7dGhpcy5zZXQoIl9saW5lQ2hhcnREYXRhIixrKX1lbHNlIDI8PWY/KHRoaXMuX3NldFZpc3VhbGl6YXRpb25UeXBlKCJpbWFnZSIpLHRoaXMuc2V0KCJfZGF0YUltYWdlU3JjIiwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LCIraCkpOnRoaXMuX3Nob3dUb2FzdCgiVmlzdWFsaXphdGlvbiBvZiByYW5rLSIrZisiIHRlbnNvcnMgaXMgbm90IHlldCBzdXBwb3J0ZWQuIil9KX19LApyZWZyZXNoKCl7dGhpcy50ZW5zb3JOYW1lLnRyaW0oKSYmdGhpcy5yZW5kZXJUZW5zb3JWYWx1ZSgpfSxfZ2V0VGVuc29yRGF0YVVSTChiKXtjb25zdCBkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi90ZW5zb3JfZGF0YSIpO3JldHVybiB2Yy5hZGRQYXJhbXMoZCxiKX0sX3JhbmtGcm9tU2xpY2luZyhiKXtiLnN0YXJ0c1dpdGgoIlsiKSYmKGI9Yi5zbGljZSgxLGIubGVuZ3RoLTEpKTtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIDA7e2I9Yi5zcGxpdCgiLCIpO2xldCBkPWIubGVuZ3RoO2Zvcihjb25zdCBmIG9mIGIpaXNOYU4oTnVtYmVyKGYpKXx8ZC0tO3JldHVybiBkfX0sX3NldFZpc3VhbGl6YXRpb25UeXBlKGIpeyJzY2FsYXIiPT09Yj8odGhpcy5zZXQoIl9pc1ZhbHVlU2NhbGFyIiwhMCksdGhpcy5zZXQoIl9pc1ZhbHVlTGluZUNoYXJ0IiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlSW1hZ2UiLCExKSk6ImxpbmVDaGFydCI9PT1iPyh0aGlzLnNldCgiX2lzVmFsdWVTY2FsYXIiLAohMSksdGhpcy5zZXQoIl9pc1ZhbHVlTGluZUNoYXJ0IiwhMCksdGhpcy5zZXQoIl9pc1ZhbHVlSW1hZ2UiLCExKSk6ImltYWdlIj09PWI/KHRoaXMuc2V0KCJfaXNWYWx1ZVNjYWxhciIsITEpLHRoaXMuc2V0KCJfaXNWYWx1ZUxpbmVDaGFydCIsITEpLHRoaXMuc2V0KCJfaXNWYWx1ZUltYWdlIiwhMCkpOmNvbnNvbGUuZXJyb3IoIkludmFsaWQgdmlzdWFsaXphdGlvblR5cGU6IixiKX0sX3RpbWVJbmRpY2VzVG9nZ2xlQnV0dG9uQ2FsbGJhY2soKXsiZnVsbCBoaXN0b3J5Ij09PVBvbHltZXIuZG9tKHRoaXMuJCQoIiN0aW1lLWluZGljZXMtdG9nZ2xlLWJ1dHRvbiIpKS50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpP3RoaXMuc2V0KCJ0aW1lSW5kaWNlcyIsIjoiKTp0aGlzLnNldCgidGltZUluZGljZXMiLCItMSIpO3RoaXMucmVuZGVyVGVuc29yVmFsdWUoKX0sX3VwZGF0ZVRpbWVJbmRpY2VzVG9nZ2xlKGIpe3RoaXMuX2lzVGltZUluZGljZXNTaW5nbGVTdGVwKGIpP1BvbHltZXIuZG9tKHRoaXMuJCQoIiN0aW1lLWluZGljZXMtdG9nZ2xlLWJ1dHRvbiIpKS50ZXh0Q29udGVudD0KIkZ1bGwgSGlzdG9yeSI6UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50PSJMYXRlc3QgVGltZSBQb2ludCJ9LF9pc1RpbWVJbmRpY2VzU2luZ2xlU3RlcChiKXtiLnN0YXJ0c1dpdGgoIlsiKSYmKGI9Yi5zbGljZSgxLGIubGVuZ3RoLTEpKTtyZXR1cm4haXNOYU4oTnVtYmVyKGIpKX0sX2NhbGN1bGF0ZURlYnVnT3BUb0Rpc3BsYXkoKXtyZXR1cm4iRGVidWdJZGVudGl0eSI9PT10aGlzLmRlYnVnT3A/IiI6dGhpcy5kZWJ1Z09wfSxfc2hvd1RvYXN0KGIpe3RoaXMuJC50ZW5zb3JWYWx1ZVRvYXN0LnNldEF0dHJpYnV0ZSgidGV4dCIsYik7dGhpcy4kLnRlbnNvclZhbHVlVG9hc3Qub3BlbigpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi10ZW5zb3ItdmFsdWUtbXVsdGktdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi10ZW5zb3ItdmFsdWUtbXVsdGktdmlldyIscHJvcGVydGllczp7Y29udGludWVUb0NhbGxiYWNrOkZ1bmN0aW9uLHRlbnNvck5hbWVDbGlja2VkOkZ1bmN0aW9uLF90ZW5zb3JWaWV3Q291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sZ2V0SGVhbHRoUGlsbDpGdW5jdGlvbn0sYWRkVmlldyhiKXtjb25zdCBkPXRoaXMuJCQoIiNtdWx0aS10ZW5zb3Itdmlldy1jb250YWluZXIiKSxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRmLXRlbnNvci12YWx1ZS12aWV3Iik7Zi5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiZGVidWdnZXItdGVuc29yLXZpZXciKTtmLnZpZXdJZD1iLnZpZXdJZDtmLnRlbnNvck5hbWU9Yi50ZW5zb3JOYW1lO2YuZGVidWdPcD1iLmRlYnVnT3A7Zi5kZXZpY2VOYW1lPWIuZGV2aWNlTmFtZTtmLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU9Yi5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lO2YuZHR5cGU9Yi5kdHlwZTtmLnNoYXBlPWIuc2hhcGU7CmYuc2xpY2luZz1iLnNsaWNpbmc7Zi50aW1lSW5kaWNlcz1iLnRpbWVJbmRpY2VzO2YuY2xvc2VCdXR0b25DYWxsYmFjaz10aGlzLl9jcmVhdGVDbG9zZUJ1dHRvbkNhbGxiYWNrKGIudmlld0lkKTtmLmNvbnRpbnVlVG9CdXR0b25DYWxsYmFjaz0oKT0+e3RoaXMuY29udGludWVUb0NhbGxiYWNrKGIuZGV2aWNlTmFtZSxiLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWUpfTtmLnRlbnNvck5hbWVDYWxsYmFjaz0oKT0+e3RoaXMudGVuc29yTmFtZUNsaWNrZWQoYi5kZXZpY2VOYW1lLGIubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSl9O2YuZ2V0SGVhbHRoUGlsbD10aGlzLmdldEhlYWx0aFBpbGw7ZC5hcHBlbmRDaGlsZChmKTtmLnJlZnJlc2goKX0sZ2V0Vmlld3MoKXtjb25zdCBiPVtdO18uZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRlYnVnZ2VyLXRlbnNvci12aWV3IiksZD0+e2IucHVzaCh7dmlld0lkOmQudmlld0lkLHRlbnNvck5hbWU6ZC50ZW5zb3JOYW1lLApkZWJ1Z09wOmQuZGVidWdPcCxzbGljaW5nOmQuc2xpY2luZyx0aW1lSW5kaWNlczpkLnRpbWVJbmRpY2VzfSl9KTtyZXR1cm4gYn0scmVuZGVyVGVuc29yVmFsdWVzKCl7Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKSxiPT57Yi5yZW5kZXJUZW5zb3JWYWx1ZSgpfSl9LF9yZWRyYXdWaWV3cyhiKXtjb25zdCBkPXRoaXMuJCQoIiNtdWx0aS10ZW5zb3Itdmlldy1jb250YWluZXIiKTtfLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpLGY9PntkLnJlbW92ZUNoaWxkKGYpfSk7Xy5mb3JFYWNoKGIsZj0+e3RoaXMuYWRkVmlldyhmKX0pfSxfY3JlYXRlQ2xvc2VCdXR0b25DYWxsYmFjayhiKXtyZXR1cm4oKT0+e2NvbnN0IGQ9W10sZj10aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRlYnVnZ2VyLXRlbnNvci12aWV3Iik7Zm9yKGxldCBoPTA7aDxmLmxlbmd0aDsrK2gpe2NvbnN0IGs9CmZbaF07ay52aWV3SWQhPT1iJiZkLnB1c2goe3ZpZXdJZDprLnZpZXdJZCx0ZW5zb3JOYW1lOmsudGVuc29yTmFtZSxkZWJ1Z09wOmsuZGVidWdPcCxkdHlwZTprLmR0eXBlLHNoYXBlOmsuc2hhcGUsc2xpY2luZzprLnNsaWNpbmcsdGltZUluZGljZXM6ay50aW1lSW5kaWNlc30pfXRoaXMuX3JlZHJhd1ZpZXdzKGQpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGVuc29yLXNoYXBlLWhlbHBlci5qcwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChmLGgpe3JldHVybiBmPD1oPyI6OiI6Ijo6IitNYXRoLmNlaWwoZi9oKX1iLmdldERlZmF1bHRTbGljaW5nPWZ1bmN0aW9uKGYpe3JldHVybiAwPT09Zi5sZW5ndGg/IiI6MT09PWYubGVuZ3RoPyJbIitkKGZbMF0sMUUzKSsiXSI6Mj09PWYubGVuZ3RoPyJbIitkKGZbMF0sMjUwKSsiLCAiK2QoZlsxXSwyNTApKyJdIjpudWxsfTtiLnJhbmtGcm9tU2xpY2luZz1mdW5jdGlvbihmKXtmLnN0YXJ0c1dpdGgoIlsiKSYmKGY9Zi5zbGljZSgxLGYubGVuZ3RoLTEpKTtpZigwPT09Zi5sZW5ndGgpcmV0dXJuIDA7e2Y9Zi5zcGxpdCgiLCIpO2xldCBoPWYubGVuZ3RoO2Zvcihjb25zdCBrIG9mIGYpaXNOYU4oTnVtYmVyKGspKXx8aC0tO3JldHVybiBofX19KShWaXx8KFZpPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC5odG1sLmpzCmNvbnN0IFppPSgpPT53aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHR8fGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LEhrPSgpPT53aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRofHxkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLElrPShaaSgpLTcwKS8yOwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfdG9wUmlnaHRUYWJzOnt0eXBlOkFycmF5LHZhbHVlOlt7aWQ6InRhYi1ydW50aW1lLWdyYXBocyIsbmFtZToiUnVudGltZSBHcmFwaHMifSx7aWQ6InRhYi10ZW5zb3ItdmFsdWVzIixuYW1lOiJUZW5zb3IgVmFsdWVzIn1dLHJlYWRvbmx5OiEwfSxfaXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2lzVG9wUmlnaHRUZW5zb3JWYWx1ZXNBY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3RvcFJpZ2h0U2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIwIixvYnNlcnZlcjoiX3RvcFJpZ2h0U2VsZWN0ZWRDaGFuZ2VkIn0sX2xvbmdQb2xsQ291bnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9zdGVwQnV0dG9uVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IlN0ZXAifSxfY29udGludWVCdXR0b25UZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiQ29udGludWUuLi4ifSwKX3RlbnNvclZpZXdJZENvdW50ZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGlzUmVsb2FkRGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMH0sYWxyZWFkeVN0YXJ0ZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2N1cnJlbnRTZXNzaW9uUnVuSW5mbzp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3Nlc3Npb25SdW5Ub3RhbENvdW50ZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9zZXNzaW9uUnVuQ291bnRlcnM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9hY3RpdmVTZXNzaW9uUnVuS2V5Ont0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXM6e3R5cGU6QXJyYXksdmFsdWU6W119LF9hY3RpdmVTZXNzaW9uUnVuTnVtRGV2aWNlczp7dHlwZTpOdW1iZXIsdmFsdWU6LTF9LF9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lOnt0eXBlOlN0cmluZywKdmFsdWU6bnVsbCxub3RpZnk6ITB9LF9oaWdobGlnaHROb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2NvbnRpbnVlVG9UeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NvbnRpbnVlVG9Db3VudGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxfY29udGludWVTdG9wOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9jb250aW51ZVRvVGFyZ2V0Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0Ont0eXBlOk51bWJlcix2YWx1ZTotMX0sX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZTpTdHJpbmcsX2ZvcmNlRXhwYW5kTm9kZU5hbWU6U3RyaW5nLF9zb3VyY2VGb2N1c05vZGVOYW1lOlN0cmluZyxfc291cmNlQ29kZVNob3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9zaG93U291cmNlQ29kZUNoYW5nZWQifSxfZ3JhcGhQcm9ncmVzczp7dHlwZTpPYmplY3R9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PgpuZXcgdmMuUmVxdWVzdE1hbmFnZXIoNTApfSxfYnVzeTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfbGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6cGQuZ2V0TnVtYmVySW5pdGlhbGl6ZXIoIl9sZWZ0UGFuZVdpZHRoIix7ZGVmYXVsdFZhbHVlOjQ1MH0pLG9ic2VydmVyOiJfbGVmdFBhbmVXaWR0aE9ic2VydmVyIn0sX21pbmxlZnRQYW5lV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjQ1MCxyZWFkT25seTohMH0sX21heGxlZnRQYW5lV2lkdGg6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heGxlZnRQYW5lV2lkdGgoX3dpbmRvd1dpZHRoLCBfbWF4TWFpbkNvbnRlbnRXaWR0aCwgX3Jlc2l6ZXJXaWR0aCkifSxfbWF4TWFpbkNvbnRlbnRXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MzUwLHJlYWRPbmx5OiEwfSxfdG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6cGQuZ2V0TnVtYmVySW5pdGlhbGl6ZXIoIl90b3BSaWdodFF1YWRyYW50SGVpZ2h0IiwKe2RlZmF1bHRWYWx1ZTpJa30pLG9ic2VydmVyOiJfdG9wUmlnaHRRdWFkcmFudEhlaWdodE9ic2VydmVyIn0sX21pblRvcFJpZ2h0UXVhZHJhbnRIZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOjIwMCxyZWFkT25seTohMH0sX21heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHQ6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHQoX3dpbmRvd0hlaWdodCwgX3Jlc2l6ZXJXaWR0aCkifSxfcmVzaXplcldpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTozMCxyZWFkT25seTohMH0sX3dpbmRvd1dpZHRoOk51bWJlcixfd2luZG93SGVpZ2h0Ok51bWJlcixfZGVidWdXYXRjaGVzOkFycmF5LF9sYXRlc3RTZXNzaW9uUnVuOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX29uQWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZUNoYW5nZShfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSkiLCJfc2l6ZURhc2hib2FyZFJlZ2lvbnMoX2xlZnRQYW5lV2lkdGgsIF90b3BSaWdodFF1YWRyYW50SGVpZ2h0LCBfd2luZG93V2lkdGgpIiwKIl9ncmFwaFByb2dyZXNzVXBkYXRlZChfZ3JhcGhQcm9ncmVzcykiXSxyZWFkeSgpe3RoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCgpPT57dGhpcy5faGFuZGxlV2luZG93UmVzaXplKCl9LCExKTt0aGlzLnJlbG9hZCgpfSxsb25nX3BvbGwoKXtjb25zdCBiPXtwb3M6Kyt0aGlzLl9sb25nUG9sbENvdW50fTtsZXQgZD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvY29tbSIpO2Q9dmMuYWRkUGFyYW1zKGQsYik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKS50aGVuKGY9Pntjb25zdCBoPWYudHlwZTtmPWYuZGF0YTtpZigibWV0YSI9PT1oKXt2YXIgaz1mLnJ1bl9rZXksdD1rWzBdLnNwbGl0KCIsIiksbD1rWzFdLnNwbGl0KCIsIik7Y29uc3QgbT1rWzJdLnNwbGl0KCIsIik7dmFyIHA9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleTt0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5LZXkiLAprKTt0aGlzLnNldCgiX2xhdGVzdFNlc3Npb25SdW4iLHtmZWVkczp0LGZldGNoZXM6bCx0YXJnZXRzOm19KTt0aGlzLnNldCgiX3Nlc3Npb25SdW5Tb2xlQWN0aXZlIiwhMCk7dm9pZCAwPT09dGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1trXT8odGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1trXT1bXSx0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzIixbXSkpOnRoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMiLHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNba10pO3RoaXMuX2N1cnJlbnRTZXNzaW9uUnVuSW5mbz10PSJGZWVkczogIit0KyI7IEZldGNoZXM6ICIrbCsiOyBUYXJnZXRzOiAiK207dGhpcy5fc2Vzc2lvblJ1bkNvdW50ZXJzLmhhc093blByb3BlcnR5KHQpP3RoaXMuX3Nlc3Npb25SdW5Db3VudGVyc1t0XSs9MTp0aGlzLl9zZXNzaW9uUnVuQ291bnRlcnNbdF09MTt0aGlzLl9zZXNzaW9uUnVuVG90YWxDb3VudGVyKys7CnRoaXMuJC5pbml0aWFsRGlhbG9nLmNsb3NlRGlhbG9nKCk7dGhpcy5fY29udGludWVUb1R5cGUmJl8uaXNFcXVhbChwLGspfHwodGhpcy5fcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKGssITEpLHRoaXMuX2Fubm91bmNlTmV3U2Vzc2lvblJ1bigpKX1lbHNlInRlbnNvciI9PT1oPyhrPWYuZGV2aWNlX25hbWUscD1mLm5vZGVfbmFtZSx0PWYubWF5YmVfYmFzZV9leHBhbmRlZF9ub2RlX25hbWUsdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSE9az90aGlzLnNldCgiX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUiLGspOiF0aGlzLl9jb250aW51ZVRvVHlwZSYmdGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJih0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGssdCksdGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixrKyIvIit0KSksdGhpcy5zZXQoIl9zZXNzaW9uUnVuU29sZUFjdGl2ZSIsITEpLGw9cCsiOiIrZi5vdXRwdXRfc2xvdCx0aGlzLnNldCgiX2xhdGVzdFRlbnNvckRhdGEiLAp7ZGV2aWNlTmFtZTprLHRlbnNvck5hbWU6bCxub2RlTmFtZTpwLG1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU6dCxkZWJ1Z09wOmYuZGVidWdfb3AsZHR5cGU6Zi5kdHlwZSxzaGFwZTpmLnNoYXBlLHZhbHVlOmYudmFsdWVzfSksdGhpcy5fbWF5YmVVcGRhdGVUZW5zb3JWYWx1ZVZpZXdzKGwsZi5kZWJ1Z19vcCksdGhpcy5zZXQoIl9idXN5IiwhMSkpOmNvbnNvbGUuZXJyb3IoIkludmFsaWQgbG9uZy1wb2xsaW5nIHJlc3BvbnNlIHR5cGU6ICIsaCk7bnVsbCE9dGhpcy5fY29udGludWVUb1R5cGUmJnRoaXMuX3Byb2Nlc3NDb250aW51ZVRvKGgsZik7dGhpcy5sb25nX3BvbGwoKX0pfSxfcHJvY2Vzc0NvbnRpbnVlVG8oYixkKXt0aGlzLl9jb250aW51ZVN0b3A/dGhpcy5fY2xlYXJDb250aW51ZVRvKCk6IlNlc3Npb25SdW4iPT09dGhpcy5fY29udGludWVUb1R5cGU/dGhpcy5fcHJvY2Vzc0NvbnRpbnVlVG9TZXNzaW9uUnVuKCJtZXRhIj09PWIpOiJUZW5zb3JDb25kaXRpb24iPT09CnRoaXMuX2NvbnRpbnVlVG9UeXBlP3RoaXMuX3N0ZXAoKToib3AiPT09dGhpcy5fY29udGludWVUb1R5cGU/dGhpcy5fcHJvY2Vzc0NvbnRpbnVlVG9PcCgibWV0YSI9PT1iLGQpOm51bGwhPXRoaXMuX2NvbnRpbnVlVG9UeXBlJiYiIiE9PXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZjb25zb2xlLmVycm9yKCJJbnZhbGlkIF9jb250aW51ZVRvVHlwZToiLHRoaXMuX2NvbnRpbnVlVG9UeXBlKX0sX3Byb2Nlc3NDb250aW51ZVRvU2Vzc2lvblJ1bihiKXtiJiZ0aGlzLnNldCgiX2NvbnRpbnVlVG9Db3VudGVyIix0aGlzLl9jb250aW51ZVRvQ291bnRlcisxKTt0aGlzLl9jb250aW51ZVRvQ291bnRlcjx0aGlzLl9jb250aW51ZVRvQ291bnRlclRhcmdldD90aGlzLl9zdGVwKCk6dGhpcy5fY2xlYXJDb250aW51ZVRvKCl9LF9wcm9jZXNzQ29udGludWVUb09wKGIsZCl7YiYmdGhpcy5fYW5ub3VuY2VOZXdTZXNzaW9uUnVuKCk7Yj1kLmRldmljZV9uYW1lO2Q9ZC5tYXliZV9iYXNlX2V4cGFuZGVkX25vZGVfbmFtZTsKY29uc3QgZj1udWxsPT1kP251bGw6VmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpO2IrIi8iK2Q9PT10aGlzLl9jb250aW51ZVRvVGFyZ2V0fHxiKyIvIitmPT09dGhpcy5fY29udGludWVUb1RhcmdldD8odGhpcy5fY2xlYXJDb250aW51ZVRvKCksdGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLGYpKTp0aGlzLl9zdGVwKCl9LF9tYXliZVVwZGF0ZVRlbnNvclZhbHVlVmlld3MoYixkKXtjb25zdCBmPXRoaXMuJCQoIiN0ZW5zb3JWYWx1ZU11bHRpVmlldyIpO2lmKG51bGwhPWYpe3ZhciBoPSExO18uZm9yRWFjaChmLmdldFZpZXdzKCksaz0+e2lmKGsudGVuc29yTmFtZT09PWImJmsuZGVidWdPcD09PWQpcmV0dXJuIGg9ITAsITF9KTtoJiZmLnJlbmRlclRlbnNvclZhbHVlcygpfX0scmVsb2FkKCl7aWYoIXRoaXMuYWxyZWFkeVN0YXJ0ZWQpe3RoaXMuc2V0KCJhbHJlYWR5U3RhcnRlZCIsITApO3ZhciBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsCiIvZGVidWdnZXJfZ3JwY19ob3N0X3BvcnQiKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+ezA8ZC5wb3J0Pyh0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuRGlhbG9nKGQuaG9zdCxkLnBvcnQpLHRoaXMubG9uZ19wb2xsKCkpOnRoaXMuJC5pbml0aWFsRGlhbG9nLm9wZW5EaXNhYmxlZERpYWxvZygpfSl9fSxfc2hvd1NvdXJjZUNvZGVDaGFuZ2VkKCl7dGhpcy5fc291cmNlQ29kZVNob3duPyh0aGlzLiQkKCIjbm9kZS1lbnRyaWVzIikuc3R5bGUuaGVpZ2h0PSI0MCUiLHRoaXMuJC5zb3VyY2VDb2RlVmlldy5yZW5kZXIoKSk6dGhpcy4kJCgiI25vZGUtZW50cmllcyIpLnN0eWxlLmhlaWdodD0iODAlIn0sX3Nob3dUb2FzdChiKXt0aGlzLiQudG9hc3Quc2V0QXR0cmlidXRlKCJ0ZXh0IixiKTt0aGlzLiQudG9hc3Qub3BlbigpfSxfYW5ub3VuY2VOZXdTZXNzaW9uUnVuKCl7dGhpcy5fc2hvd1RvYXN0KCJTZXNzaW9uLnJ1bigpICMiK3RoaXMuX3Nlc3Npb25SdW5Ub3RhbENvdW50ZXIrCiIgaXMgc3RhcnRpbmcuIil9LF9kaXNwbGF5R3JhcGgoYixkKXtiPXtydW5fa2V5OkpTT04uc3RyaW5naWZ5KGIpLGRldmljZV9uYW1lOmR9O2I9dmMuYWRkUGFyYW1zKCIvZGF0YS9wbHVnaW4vZGVidWdnZXIvZGVidWdnZXJfZ3JhcGgiLGIpO3RoaXMuJC5sb2FkZXIuZGF0YXNldHM9W3tuYW1lOiIvZGVidWdnZXJfZ3JhcGgiLHBhdGg6Yn1dO3RoaXMuJC5sb2FkZXIuc2V0KCJzZWxlY3RlZERhdGFzZXQiLDApfSxfcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKGIsZCl7ZD9jb25zb2xlLmxvZygiUG9sbGluZyBmb3IgZmlyc3QgR3JhcGhEZWYgZm9yIHJ1biBrZXk6IixiKTp0aGlzLnNldCgiX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUiLG51bGwpO3ZhciBmPXttb2RlOiJyZXRyaWV2ZV9hbGwiLHJ1bl9rZXk6SlNPTi5zdHJpbmdpZnkoYil9O2NvbnN0IGg9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2dhdGVkX2dycGMiKTtmPXZjLmFkZFBhcmFtcyhoLApmKTtsZXQgaz1bXTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGYpLnRoZW4odD0+e2lmKDA9PXQuZGV2aWNlX25hbWVzLmxlbmd0aClkfHx0aGlzLl9zdGVwKCksdGhpcy5fcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKGIsITApO2Vsc2V7dmFyIGw9bnVsbDtmb3IoY29uc3QgcCBpbiB0LmdhdGVkX2dycGNfdGVuc29ycylpZih0LmdhdGVkX2dycGNfdGVuc29ycy5oYXNPd25Qcm9wZXJ0eShwKSl7LTE9PT10aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2JdLmluZGV4T2YocCkmJih0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2JdLnB1c2gocCksdGhpcy4kLnNlc3Npb25SdW5zVmlldy51cGRhdGVOdW1EZXZpY2VzKHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYl0ubGVuZ3RoKSk7dGhpcy5zZXQoIl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcyIsdGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1tiXS5zbGljZSgpKTtsPXRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzW3RoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmxlbmd0aC0KMV07Y29uc3QgbT10LmdhdGVkX2dycGNfdGVuc29yc1twXTtmb3IobGV0IG49MDtuPG0ubGVuZ3RoOysrbilrLnB1c2goe2RldmljZV9uYW1lOnAsbm9kZV9uYW1lOm1bbl1bMF0sb3BfdHlwZTptW25dWzFdLG91dHB1dF9zbG90Om1bbl1bMl0sZGVidWdfb3A6bVtuXVszXX0pfW51bGwhPWwmJih0aGlzLnNldCgiX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUiLGwpLHQ9UG9seW1lci5kb20odGhpcy4kJCgiI2FjdGl2ZS1ydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIikpLG51bGwhPXQmJnQuc2V0QXR0cmlidXRlKCJzZWxlY3RlZCIsbCkpO1ZpLnNvcnRBbmRCYXNlRXhwYW5kRGVidWdXYXRjaGVzKGspO3RoaXMuc2V0KCJfZGVidWdXYXRjaGVzIixrKTt0aGlzLiQuc291cmNlQ29kZVZpZXcucmVuZGVyKGspfX0pfSxfY3JlYXRlRGVidWdXYXRjaENoYW5nZUhhbmRsZXIoKXtyZXR1cm4oYixkKT0+e2Q9ZD8iYnJlYWsiOiJkaXNhYmxlIjt0aGlzLl9yZXF1ZXN0QnJlYWtwb2ludFN0YXRlQ2hhbmdlKFZpLmdldENsZWFuTm9kZU5hbWUoYi5kZXZpY2VfbmFtZSsKIi8iK2Iubm9kZV9uYW1lKSxiLm91dHB1dF9zbG90LGIuZGVidWdfb3AsZCl9fSxfZm9jdXNPbkdyYXBoTm9kZShiLGQpe251bGwhPWImJnRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUhPT1iJiZ0aGlzLnNldCgiX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUiLGIpO3RoaXMuX3NldFRvcFJpZ2h0UnVudGltZUdyYXBoc1RvQWN0aXZlKCk7Y29uc3QgZj10aGlzLiQkKCIjZ3JhcGgiKTtpZihmLnNlbGVjdGVkTm9kZT09PWQpZi5wYW5Ub05vZGUoZCk7ZWxzZXtjb25zdCBoPWYuZ2V0KCJyZW5kZXJIaWVyYXJjaHkiKS5oaWVyYXJjaHkuZ2V0Tm9kZU1hcCgpO251bGw9PWhbZF0mJihkPVZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihkKSk7bnVsbCE9aFtkXSYmZi5zZXQoInNlbGVjdGVkTm9kZSIsZCl9dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsYisiLyIrZCl9LF9jcmVhdGVOb2RlQ2xpY2tlZEhhbmRsZXIoKXtyZXR1cm4oYixkLGYpPT57dGhpcy5fc291cmNlQ29kZVNob3duJiYKITAhPT1mJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLFZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihkKSk7dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShiLGQpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmROb2RlTmFtZSIsYisiLyIrZCl9fSxfY3JlYXRlRmVlZEZldGNoVGFyZ2V0Q2xpY2tlZEhhbmRsZXIoKXtyZXR1cm4gYj0+e2xldCBkPWI7LTEhPT1kLmluZGV4T2YoIjoiKSYmKGQ9ZC5zbGljZSgwLGQuaW5kZXhPZigiOiIpKSk7Yj1fLmZpbmQodGhpcy5fZGVidWdXYXRjaGVzLGY9PmYubm9kZV9uYW1lPT09ZHx8MD09PWYubm9kZV9uYW1lLmluZGV4T2YoZCkmJiIoIj09PWYubm9kZV9uYW1lW2QubGVuZ3RoXSk7bnVsbD09Yj90aGlzLl9zaG93VG9hc3QoIk5vZGUgJyIrZCsiJyBpcyBub3QgaW4gdGhlIHJ1bnRpbWUgZ3JhcGggb2YgdGhlIGN1cnJlbnQgU2Vzc2lvbi5ydW4gb3IgZG9lcyBub3QgaGF2ZSBhIGRlYnVnIG9wIGF0dGFjaGVkLiIpOnRoaXMuX2ZvY3VzT25HcmFwaE5vZGUoYi5kZXZpY2VfbmFtZSwKZCl9fSxfY3JlYXRlVGVuc29yRGF0YUV4cGFuZEhhbmRsZXIoKXtyZXR1cm4gYj0+e3RoaXMuX3NldFRvcFJpZ2h0VGVuc29yVmFsdWVzVG9BY3RpdmUoKTtzZXRUaW1lb3V0KCgpPT57dGhpcy4kJCgiI3RlbnNvclZhbHVlTXVsdGlWaWV3IikuYWRkVmlldyh7dmlld0lkOnRoaXMuX2NyZWF0ZVRlbnNvclZpZXdJZCgpLGRldmljZU5hbWU6Yi5kZXZpY2VOYW1lLHRlbnNvck5hbWU6Yi50ZW5zb3JOYW1lLG5vZGVOYW1lOmIubm9kZU5hbWUsbWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZTpiLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWUsZGVidWdPcDpiLmRlYnVnT3AsZHR5cGU6Yi5kdHlwZSxzaGFwZTpiLnNoYXBlLHNsaWNpbmc6VmkuZ2V0RGVmYXVsdFNsaWNpbmcoYi5zaGFwZSksdGltZUluZGljZXM6Ii0xIn0pfSwxMCl9fSxfY3JlYXRlVGVuc29yVmlld0lkKCl7Y29uc3QgYj0iZGVidWdnZXItdGVuc29yLXZpZXctIit0aGlzLl90ZW5zb3JWaWV3SWRDb3VudGVyO3RoaXMuX3RlbnNvclZpZXdJZENvdW50ZXIrKzsKcmV0dXJuIGJ9LF9jcmVhdGVOb2RlQ29udGV4dE1lbnVJdGVtcygpe3JldHVyblt7dGl0bGU6KCk9PiJFeHBhbmQgYW5kIGhpZ2hsaWdodCIsYWN0aW9uOmI9Pntjb25zdCBkPVZpLmdldENsZWFuTm9kZU5hbWUoYi5ub2RlLm5hbWUpO2I9dGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSsiLyIrYi5ub2RlLm5hbWU7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixiKTt0aGlzLnNldCgiX2hpZ2hsaWdodE5vZGVOYW1lIixiKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKX19LHt0aXRsZTooKT0+IkFkZCBicmVha3BvaW50IixhY3Rpb246Yj0+e2NvbnN0IGQ9VmkuZ2V0Q2xlYW5Ob2RlTmFtZShiLm5vZGUubmFtZSk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWUiLHRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUrCiIvIitiLm5vZGUubmFtZSk7dGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLFZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihkKSl9fSx7dGl0bGU6KCk9PiJDb250aW51ZSB0byIsYWN0aW9uOmI9PnstMSE9PVsiX0FyZyIsIl9SZXR2YWwiXS5pbmRleE9mKGIubm9kZS5vcCk/dGhpcy5fc2hvd1RvYXN0KCdDYW5ub3QgY29udGludWUgdG8gbm9kZSAiJytiLm5vZGUubmFtZSsnIiwgZHVlIHRvIG9wIHR5cGUgIicrYi5ub2RlLm9wKyciLicpOnRoaXMuX2NvbnRpbnVlVG9Ob2RlKHRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUsYi5ub2RlLm5hbWUpfX1dfSxfY3JlYXRlR2V0SGVhbHRoUGlsbCgpe3JldHVybihiLGQsZixoKT0+e3ZhciBrPXt3YXRjaF9rZXk6Yix0aW1lX2luZGljZXM6Ii0xIixtYXBwaW5nOiJoZWFsdGgtcGlsbCJ9O2NvbnN0IHQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwKIi90ZW5zb3JfZGF0YSIpO2s9dmMuYWRkUGFyYW1zKHQsayk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChrKS50aGVuKGw9PntsPWwudGVuc29yX2RhdGFbMF07aChsKTt0aGlzLl9jb25kaXRpb25hbEhlYWx0aFBpbGxTdG9wKGIsZCxmLGwpfSl9fSxfY29uZGl0aW9uYWxIZWFsdGhQaWxsU3RvcChiLGQsZixoKXtpZigiVGVuc29yQ29uZGl0aW9uIj09PXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZWaS5jaGVja0hlYWx0aFBpbGxBZ2FpbnN0VGVuc29yQ29uZGl0aW9uS2V5KHRoaXMuX2NvbnRpbnVlVG9UYXJnZXQsaCx0aGlzLl9jb250aW51ZVRvQ291bnRlclRhcmdldCkpe3RoaXMuc2V0KCJfY29udGludWVTdG9wIiwhMCk7aD1WaS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZik7dGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLGgpO3RoaXMuX2ZvY3VzT25HcmFwaE5vZGUoZCxmKTtjb25zdCBrPWQrIi8iK2Y7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIiwKayk7c2V0VGltZW91dCgoKT0+e3RoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLG51bGwpO3RoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLGspfSwxMDApO3RoaXMuX3Nob3dUb2FzdCgnVGVuc29yIGNvbmRpdGlvbiAiJyt0aGlzLl9jb250aW51ZVRvVGFyZ2V0KyciIGlzIG1ldCBieSB3YXRjaCBrZXk6ICInK2IrJyIuXG5TdG9wcGluZyBjb250aW51YXRpb24uJyl9fSxfY29udGludWVUb05vZGUoYixkKXtjb25zdCBmPVZpLmdldENsZWFuTm9kZU5hbWUoZCk7Yj1iKyIvIitkO3RoaXMuX3JlcXVlc3RCcmVha3BvaW50U3RhdGVDaGFuZ2UoZiwwLCJEZWJ1Z0lkZW50aXR5IiwiYnJlYWsiKTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZSIsYik7dGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLFZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihmKSk7dGhpcy5fc2V0Q29udGludWVUbygib3AiLGIpOwp0aGlzLiQuY29udGludWVEaWFsb2cudXBkYXRlQ29udGludWVCdXR0b25UZXh0KCEwKTt0aGlzLl9zdGVwKCl9LF9jcmVhdGVDb250aW51ZVRvTm9kZUhhbmRsZXIoKXtyZXR1cm4oYixkKT0+e3RoaXMuX2NvbnRpbnVlVG9Ob2RlKGIsZCl9fSxfb25BY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lQ2hhbmdlKGIpe2NvbnN0IGQ9UG9seW1lci5kb20odGhpcy4kJCgiI3J1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiKSk7aWYoMDx0aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5sZW5ndGgpe2xldCBmO2Y9YisoIiAoZGV2aWNlICIrKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmluZGV4T2YoYikrMSkrIiBvZiAiK3RoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmxlbmd0aCsiKSIpO3RoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiZudWxsIT1kJiYoZC50ZXh0Q29udGVudD1mKX1lbHNlIHRoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiYKbnVsbCE9ZCYmKGQudGV4dENvbnRlbnQ9IldhaXRpbmcgZm9yIGRldmljZS4uLiIpO251bGwhPWImJnRoaXMuX2Rpc3BsYXlHcmFwaCh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5LGIpfSxfc3RlcCgpe2lmKG51bGwhPXRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXkpe3RoaXMuc2V0KCJfYnVzeSIsITApO3ZhciBiPXttb2RlOiJyZXRyaWV2ZV9kZXZpY2VfbmFtZXMiLHJ1bl9rZXk6SlNPTi5zdHJpbmdpZnkodGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleSl9LGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2dhdGVkX2dycGMiKTtiPXZjLmFkZFBhcmFtcyhkLGIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihmPT57bGV0IGg9ITE7Zm9yKGxldCBrPTA7azxmLmRldmljZV9uYW1lcy5sZW5ndGg7KytrKWlmKC0xPT09dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMuaW5kZXhPZihmLmRldmljZV9uYW1lc1trXSkpe2g9ITA7YnJlYWt9Zj0KdmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2FjayIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZikudGhlbigoKT0+e2gmJnRoaXMuX3Byb2Nlc3NHYXRlZEdycGNEZWJ1Z09wcyh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5LCExKX0pfSl9fSxfY3JlYXRlU2Vzc2lvblJ1bkdvKCl7cmV0dXJuIGI9Pnt0aGlzLl9zZXRDb250aW51ZVRvKCJTZXNzaW9uUnVuIix0aGlzLl9jdXJyZW50U2Vzc2lvblJ1bkluZm8sYik7dGhpcy5fc3RlcCgpfX0sX2NyZWF0ZVRlbnNvckNvbmRpdGlvbkdvKCl7cmV0dXJuKGIsZCk9Pnt0aGlzLl9zZXRDb250aW51ZVRvKCJUZW5zb3JDb25kaXRpb24iLGIsZCk7dGhpcy4kLnRlbnNvckRhdGFTdW1tYXJ5LmVuYWJsZUhlYWx0aFBpbGxzKCk7dGhpcy5fc3RlcCgpfX0sX2NyZWF0ZUZvcmNlQ29udGludWF0aW9uU3RvcCgpe3JldHVybigpPT57dGhpcy5fc2hvd1RvYXN0KCdDb250aW51YXRpb24gb2YgdHlwZSAiJyt0aGlzLl9jb250aW51ZVRvVHlwZSsKJyIgd2FzIGludGVycnVwdGVkIGJ5IHVzZXIuJyk7dGhpcy5zZXQoIl9jb250aW51ZVN0b3AiLCEwKX19LF9zZXRDb250aW51ZVRvKGIsZCxmPS0xKXt0aGlzLl9jb250aW51ZVRvVHlwZT1iO3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQ9ZDt0aGlzLl9jb250aW51ZVRvQ291bnRlclRhcmdldD1mO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyPTA7dGhpcy5fY29udGludWVTdG9wPSExfSxfY2xlYXJDb250aW51ZVRvKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLm5vdGlmeUNvbnRpbnVhdGlvblN0b3AoKTt0aGlzLl9jb250aW51ZVRvVGFyZ2V0PXRoaXMuX2NvbnRpbnVlVG9UeXBlPSIiO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0PS0xO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyPTA7dGhpcy5fY29udGludWVTdG9wPSExO3RoaXMuc2V0KCJfYnVzeSIsITEpfSxfY3JlYXRlQ29udGludWVUb0NhbGxiYWNrKCl7cmV0dXJuKGIsZCk9Pnt0aGlzLl9zZXRDb250aW51ZVRvKCJvcCIsYisiLyIrCmQpO3RoaXMuX3N0ZXAoKTt0aGlzLl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSYmdGhpcy5fZm9jdXNPbkdyYXBoTm9kZShiLGQpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmROb2RlTmFtZSIsYisiLyIrZCl9fSxfdG9wUmlnaHRTZWxlY3RlZENoYW5nZWQoYil7Yj10aGlzLl90b3BSaWdodFRhYnNbYl0uaWQ7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsInRhYi1ydW50aW1lLWdyYXBocyI9PT1iKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRUZW5zb3JWYWx1ZXNBY3RpdmUiLCJ0YWItdGVuc29yLXZhbHVlcyI9PT1iKX0sX3NldFRvcFJpZ2h0UnVudGltZUdyYXBoc1RvQWN0aXZlKCl7dGhpcy5zZXQoIl90b3BSaWdodFNlbGVjdGVkIiwiMCIpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUiLCEwKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRUZW5zb3JWYWx1ZXNBY3RpdmUiLCExKX0sX3NldFRvcFJpZ2h0VGVuc29yVmFsdWVzVG9BY3RpdmUoKXt0aGlzLnNldCgiX3RvcFJpZ2h0U2VsZWN0ZWQiLAoiMSIpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUiLCExKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRUZW5zb3JWYWx1ZXNBY3RpdmUiLCEwKX0sX3JlcXVlc3RCcmVha3BvaW50U3RhdGVDaGFuZ2UoYixkLGYsaCl7Yj17bW9kZToic2V0X3N0YXRlIixub2RlX25hbWU6YixvdXRwdXRfc2xvdDpkLGRlYnVnX29wOmYsc3RhdGU6aH07ZD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2I9dmMuYWRkUGFyYW1zKGQsYik7dGhpcy5zZXQoIl9idXN5IiwhMCk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGs9Pnt0aGlzLnNldCgiX2J1c3kiLCExKTtjb25zb2xlLmxvZygiQnJlYWtwb2ludCBzZXRfc3RhdGUgcmVzcG9uc2U6ICIsayl9KX0sX2dyYXBoUHJvZ3Jlc3NVcGRhdGVkKGIpe2NvbnN0IGQ9dGhpcy4kJCgiI3RvcC1yaWdodC1wcm9ncmVzcy1iYXIiKTtudWxsPT10aGlzLl9sYXRlc3RTZXNzaW9uUnVuPwooZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwwKSx0aGlzLnNldCgiX2J1c3kiLCExKSk6KGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsYi52YWx1ZSksdGhpcy5zZXQoIl9idXN5IiwxMDA+Yi52YWx1ZSkpfSxfaGFuZGxlV2luZG93UmVzaXplKCl7dGhpcy5zZXQoIl93aW5kb3dXaWR0aCIsSGsoKSk7dGhpcy5zZXQoIl93aW5kb3dIZWlnaHQiLFppKCkpO3RoaXMuX3NpemVEYXNoYm9hcmRSZWdpb25zKHRoaXMuX2xlZnRQYW5lV2lkdGgsdGhpcy5fdG9wUmlnaHRRdWFkcmFudEhlaWdodCx0aGlzLl93aW5kb3dXaWR0aCl9LF9jb21wdXRlTWF4bGVmdFBhbmVXaWR0aChiLGQsZil7cmV0dXJuIGItZC1mfSxfY29tcHV0ZU1heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHQoYixkKXtyZXR1cm4gYi1kLTcwfSxfc2l6ZURhc2hib2FyZFJlZ2lvbnMoYixkLGYpe3RoaXMuJCQoIiNsZWZ0LXBhbmUiKS5zdHlsZS53aWR0aD1iKyJweCI7Yj1mLWItdGhpcy5fcmVzaXplcldpZHRoLTg7dGhpcy4kJCgiI2NlbnRlci1jb250ZW50Iikuc3R5bGUud2lkdGg9CmIrInB4IjtiPWQtdGhpcy5fcmVzaXplcldpZHRoO3RoaXMuJCQoIiN0b3AtcmlnaHQtcXVhZHJhbnQiKS5zdHlsZS5oZWlnaHQ9YisicHgiO3RoaXMuJCQoIiN0ZW5zb3ItZGF0YSIpLnN0eWxlLnRvcD1kKyJweCJ9LF9sZWZ0UGFuZVdpZHRoT2JzZXJ2ZXI6cGQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl9sZWZ0UGFuZVdpZHRoIix7ZGVmYXVsdFZhbHVlOjQ1MH0pLF90b3BSaWdodFF1YWRyYW50SGVpZ2h0T2JzZXJ2ZXI6cGQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl90b3BSaWdodFF1YWRyYW50SGVpZ2h0Iix7ZGVmYXVsdFZhbHVlOklrfSl9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tYXRlcmlhbC9wYXBlci1tYXRlcmlhbC5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1tYXRlcmlhbCIscHJvcGVydGllczp7ZWxldmF0aW9uOnt0eXBlOk51bWJlcixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6MX0sYW5pbWF0ZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZC90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkIixwcm9wZXJ0aWVzOntyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LGRlYnVnZ2VyTnVtZXJpY0FsZXJ0czp7dHlwZTpBcnJheSxub3RpZnk6ITB9LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGhlYWx0aFBpbGxTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWROb2RlSW5jbHVkZTp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxhcmVIZWFsdGhQaWxsc0xvYWRpbmc6Qm9vbGVhbixoZWFsdGhQaWxsRW50cmllczp7dHlwZTpBcnJheSx2YWx1ZTp0Zi5ncmFwaC5zY2VuZS5oZWFsdGhQaWxsRW50cmllcyxyZWFkT25seTohMH0saGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZTp7dHlwZTpBcnJheSwKY29tcHV0ZWQ6Il9jb21wdXRlSGVhbHRoUGlsbEZvck5vZGUobm9kZU5hbWVzVG9IZWFsdGhQaWxscywgaGVhbHRoUGlsbFN0ZXBJbmRleCwgc2VsZWN0ZWROb2RlLCBhbGxTdGVwc01vZGVFbmFibGVkLCBhcmVIZWFsdGhQaWxsc0xvYWRpbmcpIn0sYWxsU3RlcHNNb2RlRW5hYmxlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMH0sX2JpZ2dlc3RTdGVwRXZlclNlZW46e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUJpZ2dlc3RTdGVwRXZlclNlZW4obm9kZU5hbWVzVG9IZWFsdGhQaWxscykifSxfbWF4U3RlcEluZGV4Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhTdGVwSW5kZXgobm9kZU5hbWVzVG9IZWFsdGhQaWxscykifSxfY3VycmVudFN0ZXBEaXNwbGF5VmFsdWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRTdGVwRGlzcGxheVZhbHVlKG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsIGhlYWx0aFBpbGxTdGVwSW5kZXgsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIHNwZWNpZmljSGVhbHRoUGlsbFN0ZXAsIGFyZUhlYWx0aFBpbGxzTG9hZGluZykifX0sCm9ic2VydmVyczpbIl91cGRhdGVBbGVydHNMaXN0KGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cykiXSxyZWFkeTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluQ29udGFpbmVyIiksZD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0Zi1kYXNoYm9hcmQtbGF5b3V0IC5zY3JvbGxiYXIiKTtiJiZkJiYoYi5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixkLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iKX0sX2hlYWx0aFBpbGxzQXZhaWxhYmxlOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGImJmR9LF9jb21wdXRlVGVuc29yQ291bnRTdHJpbmc6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj9iW2RdLnRvRml4ZWQoMCk6IiJ9LF9jb21wdXRlSGVhbHRoUGlsbEZvck5vZGU6ZnVuY3Rpb24oYixkLGYsaCxrKXtpZihrfHwhZilyZXR1cm4gbnVsbDtiPWJbZl07cmV0dXJuIGI/KGQ9YltoPzA6ZF0pP2QudmFsdWUuc2xpY2UoMiw4KTpudWxsOm51bGx9LF9jb21wdXRlQ3VycmVudFN0ZXBEaXNwbGF5VmFsdWU6ZnVuY3Rpb24oYiwKZCxmLGgsayl7aWYoZilyZXR1cm4gaC50b0ZpeGVkKDApO2lmKGspcmV0dXJuIDA7Zm9yKGxldCB0IGluIGIpcmV0dXJuIGJbdF1bZF0uc3RlcC50b0ZpeGVkKDApO3JldHVybiAwfSxfY29tcHV0ZUJpZ2dlc3RTdGVwRXZlclNlZW46ZnVuY3Rpb24oYil7Zm9yKGxldCBkIGluIGIpcmV0dXJuIGI9YltkXSxNYXRoLm1heCh0aGlzLl9iaWdnZXN0U3RlcEV2ZXJTZWVuLGJbYi5sZW5ndGgtMV0uc3RlcCk7cmV0dXJuIHRoaXMuX2JpZ2dlc3RTdGVwRXZlclNlZW58fDB9LF9jb21wdXRlTWF4U3RlcEluZGV4OmZ1bmN0aW9uKGIpe2ZvcihsZXQgZCBpbiBiKXJldHVybiBiW2RdLmxlbmd0aC0xO3JldHVybiAwfSxfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmxlbmd0aH0sX3VwZGF0ZUFsZXJ0c0xpc3Q6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy4kJCgiI251bWVyaWMtYWxlcnRzLWJvZHkiKTtpZihkKXtkLmlubmVySFRNTD0iIjtmb3IodmFyIGY9CjA7ZjxiLmxlbmd0aDtmKyspe3ZhciBoPWJbZl0saz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTt0LmlubmVySFRNTD10Zi5ncmFwaC51dGlsLmNvbXB1dGVIdW1hbkZyaWVuZGx5VGltZShoLmZpcnN0X3RpbWVzdGFtcCk7dC5jbGFzc0xpc3QuYWRkKCJmaXJzdC1vZmZlbnNlLXRkIik7ay5hcHBlbmRDaGlsZCh0KTt0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7dC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3ItZGV2aWNlLXRkIik7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUiKTtsLmlubmVySFRNTD1oLnRlbnNvcl9uYW1lO3RoaXMuX2FkZE9wRXhwYW5zaW9uTGlzdGVuZXIobCxoLnRlbnNvcl9uYW1lKTt0LmFwcGVuZENoaWxkKGwpO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5jbGFzc0xpc3QuYWRkKCJkZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUiKTsKbC5pbm5lckhUTUw9IigiK2guZGV2aWNlX25hbWUrIikiO3QuYXBwZW5kQ2hpbGQobCk7ay5hcHBlbmRDaGlsZCh0KTt0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuY2xhc3NMaXN0LmFkZCgibWluaS1oZWFsdGgtcGlsbCIpO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtsLmNsYXNzTGlzdC5hZGQoIm1pbmktaGVhbHRoLXBpbGwtdGQiKTtsLmFwcGVuZENoaWxkKHQpO2suYXBwZW5kQ2hpbGQobCk7aC5uZWdfaW5mX2V2ZW50X2NvdW50JiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxsLmNsYXNzTGlzdC5hZGQoIm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24iKSxsLmlubmVySFRNTD1oLm5lZ19pbmZfZXZlbnRfY291bnQsbC5zZXRBdHRyaWJ1dGUoInRpdGxlIixoLm5lZ19pbmZfZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCAtXHUyMjFlIiksdC5hcHBlbmRDaGlsZChsKSk7aC5wb3NfaW5mX2V2ZW50X2NvdW50JiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKbC5jbGFzc0xpc3QuYWRkKCJwb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIiksbC5pbm5lckhUTUw9aC5wb3NfaW5mX2V2ZW50X2NvdW50LGwuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaC5wb3NfaW5mX2V2ZW50X2NvdW50KyIgZXZlbnRzIHdpdGggK1x1MjIxZSIpLHQuYXBwZW5kQ2hpbGQobCkpO2gubmFuX2V2ZW50X2NvdW50JiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxsLmNsYXNzTGlzdC5hZGQoIm5hbi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24iKSxsLmlubmVySFRNTD1oLm5hbl9ldmVudF9jb3VudCxsLnNldEF0dHJpYnV0ZSgidGl0bGUiLGgubmFuX2V2ZW50X2NvdW50KyIgZXZlbnRzIHdpdGggTmFOIiksdC5hcHBlbmRDaGlsZChsKSk7UG9seW1lci5kb20oZCkuYXBwZW5kQ2hpbGQoayl9fX0sX2FkZE9wRXhwYW5zaW9uTGlzdGVuZXI6ZnVuY3Rpb24oYixkKXtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3ZhciBmPXRmLmdyYXBoLnJlbmRlci5leHBhbmRVbnRpbE5vZGVJc1Nob3duKHRoaXMucmVuZGVySGllcmFyY2h5LApkKSxoLGs9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGYtZ3JhcGgtaW5mbyNncmFwaC1pbmZvIik7ayYmKGg9ay5zY3JvbGxIZWlnaHQtay5zY3JvbGxUb3ApO3ZhciB0PXRoaXMuc2VsZWN0ZWROb2RlO3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLGYpO2Y9KCk9PntrLnNjcm9sbFRvcD1rLnNjcm9sbEhlaWdodC1ofTtrJiYodD9mKCk6d2luZG93LnNldFRpbWVvdXQoZiwyMCkpfSl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2Nyb2xsLXRhcmdldC1iZWhhdmlvci9pcm9uLXNjcm9sbC10YXJnZXQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25TY3JvbGxUYXJnZXRCZWhhdmlvcj17cHJvcGVydGllczp7c2Nyb2xsVGFyZ2V0Ont0eXBlOkhUTUxFbGVtZW50LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlZmF1bHRTY3JvbGxUYXJnZXR9fX0sb2JzZXJ2ZXJzOlsiX3Njcm9sbFRhcmdldENoYW5nZWQoc2Nyb2xsVGFyZ2V0LCBpc0F0dGFjaGVkKSJdLF9zaG91bGRIYXZlTGlzdGVuZXI6ITAsX3Njcm9sbFRhcmdldENoYW5nZWQ6ZnVuY3Rpb24oYixkKXt0aGlzLl9vbGRTY3JvbGxUYXJnZXQmJih0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcighMSx0aGlzLl9vbGRTY3JvbGxUYXJnZXQpLHRoaXMuX29sZFNjcm9sbFRhcmdldD1udWxsKTtkJiYoImRvY3VtZW50Ij09PWI/dGhpcy5zY3JvbGxUYXJnZXQ9dGhpcy5fZG9jOiJzdHJpbmciPT09dHlwZW9mIGI/dGhpcy5zY3JvbGxUYXJnZXQ9KGQ9dGhpcy5kb21Ib3N0KSYmZC4kP2QuJFtiXTpQb2x5bWVyLmRvbSh0aGlzLm93bmVyRG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3IoIiMiKwpiKTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLl9vbGRTY3JvbGxUYXJnZXQ9Yix0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcih0aGlzLl9zaG91bGRIYXZlTGlzdGVuZXIsYikpKX0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt9LGdldCBfZGVmYXVsdFNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzLl9kb2N9LGdldCBfZG9jKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9LGdldCBfc2Nyb2xsVG9wKCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cucGFnZVlPZmZzZXQ6dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wOjB9LGdldCBfc2Nyb2xsTGVmdCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnBhZ2VYT2Zmc2V0OnRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ6CjB9LHNldCBfc2Nyb2xsVG9wKGIpe3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5zY3JvbGxUbyh3aW5kb3cucGFnZVhPZmZzZXQsYik6dGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpJiYodGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wPWIpfSxzZXQgX3Njcm9sbExlZnQoYil7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKGIsd2luZG93LnBhZ2VZT2Zmc2V0KTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxMZWZ0PWIpfSxzY3JvbGw6ZnVuY3Rpb24oYixkKXt0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuc2Nyb2xsVG8oYixkKTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxMZWZ0PWIsdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wPWQpfSxnZXQgX3Njcm9sbFRhcmdldFdpZHRoKCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT8KdGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LmlubmVyV2lkdGg6dGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0V2lkdGg6MH0sZ2V0IF9zY3JvbGxUYXJnZXRIZWlnaHQoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5pbm5lckhlaWdodDp0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQ6MH0sX2lzVmFsaWRTY3JvbGxUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JvbGxUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudH0sX3RvZ2dsZVNjcm9sbExpc3RlbmVyOmZ1bmN0aW9uKGIsZCl7ZD1kPT09dGhpcy5fZG9jP3dpbmRvdzpkO2I/dGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyfHwodGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyPXRoaXMuX3Njcm9sbEhhbmRsZXIuYmluZCh0aGlzKSxkLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyKSk6CnRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlciYmKGQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIpLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj1udWxsKX0sdG9nZ2xlU2Nyb2xsTGlzdGVuZXI6ZnVuY3Rpb24oYil7dGhpcy5fc2hvdWxkSGF2ZUxpc3RlbmVyPWI7dGhpcy5fdG9nZ2xlU2Nyb2xsTGlzdGVuZXIoYix0aGlzLnNjcm9sbFRhcmdldCl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWxpc3QvaXJvbi1saXN0Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpob25lfGFkOyg/OiBVOyk/IENQVSkgT1MgKFxkKykvKSxkPWImJjg8PWJbMV0sZj1udWxsIT1Qb2x5bWVyLmZsdXNoLGg9Zj9Qb2x5bWVyLkFzeW5jLmFuaW1hdGlvbkZyYW1lOjAsaz1mP1BvbHltZXIuQXN5bmMuaWRsZVBlcmlvZDoxLHQ9Zj9Qb2x5bWVyLkFzeW5jLm1pY3JvVGFzazoyO1BvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yfHwoUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3I9e30pO1BvbHltZXIoe2lzOiJpcm9uLWxpc3QiLHByb3BlcnRpZXM6e2l0ZW1zOnt0eXBlOkFycmF5fSxhczp7dHlwZTpTdHJpbmcsdmFsdWU6Iml0ZW0ifSxpbmRleEFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaW5kZXgifSxzZWxlY3RlZEFzOnt0eXBlOlN0cmluZyx2YWx1ZToic2VsZWN0ZWQifSxncmlkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLApvYnNlcnZlcjoiX2dyaWRDaGFuZ2VkIn0sc2VsZWN0aW9uRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzZWxlY3RlZEl0ZW06e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sc2VsZWN0ZWRJdGVtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxtdWx0aVNlbGVjdGlvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzY3JvbGxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fSxvYnNlcnZlcnM6WyJfaXRlbXNDaGFuZ2VkKGl0ZW1zLiopIiwiX3NlbGVjdGlvbkVuYWJsZWRDaGFuZ2VkKHNlbGVjdGlvbkVuYWJsZWQpIiwiX211bHRpU2VsZWN0aW9uQ2hhbmdlZChtdWx0aVNlbGVjdGlvbikiLCJfc2V0T3ZlcmZsb3coc2Nyb2xsVGFyZ2V0LCBzY3JvbGxPZmZzZXQpIl0sYmVoYXZpb3JzOltQb2x5bWVyLlRlbXBsYXRpemVyLFBvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yLFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yXSwKX3JhdGlvOi41LF9zY3JvbGxlclBhZGRpbmdUb3A6MCxfc2Nyb2xsUG9zaXRpb246MCxfcGh5c2ljYWxTaXplOjAsX3BoeXNpY2FsQXZlcmFnZTowLF9waHlzaWNhbEF2ZXJhZ2VDb3VudDowLF9waHlzaWNhbFRvcDowLF92aXJ0dWFsQ291bnQ6MCxfZXN0U2Nyb2xsSGVpZ2h0OjAsX3Njcm9sbEhlaWdodDowLF92aWV3cG9ydEhlaWdodDowLF92aWV3cG9ydFdpZHRoOjAsX3BoeXNpY2FsSXRlbXM6bnVsbCxfcGh5c2ljYWxTaXplczpudWxsLF9maXJzdFZpc2libGVJbmRleFZhbDpudWxsLF9jb2xsZWN0aW9uOm51bGwsX2xhc3RWaXNpYmxlSW5kZXhWYWw6bnVsbCxfbWF4UGFnZXM6MixfZm9jdXNlZEl0ZW06bnVsbCxfZm9jdXNlZFZpcnR1YWxJbmRleDotMSxfZm9jdXNlZFBoeXNpY2FsSW5kZXg6LTEsX29mZnNjcmVlbkZvY3VzZWRJdGVtOm51bGwsX2ZvY3VzQmFja2ZpbGxJdGVtOm51bGwsX2l0ZW1zUGVyUm93OjEsX2l0ZW1XaWR0aDowLF9yb3dIZWlnaHQ6MCxfdGVtcGxhdGVDb3N0OjAsCl9wYXJlbnRNb2RlbDohMCxnZXQgX3BoeXNpY2FsQm90dG9tKCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3BoeXNpY2FsU2l6ZX0sZ2V0IF9zY3JvbGxCb3R0b20oKXtyZXR1cm4gdGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fdmlld3BvcnRIZWlnaHR9LGdldCBfdmlydHVhbEVuZCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xfSxnZXQgX2hpZGRlbkNvbnRlbnRTaXplKCl7cmV0dXJuKHRoaXMuZ3JpZD90aGlzLl9waHlzaWNhbFJvd3MqdGhpcy5fcm93SGVpZ2h0OnRoaXMuX3BoeXNpY2FsU2l6ZSktdGhpcy5fdmlld3BvcnRIZWlnaHR9LGdldCBfaXRlbXNQYXJlbnQoKXtyZXR1cm4gUG9seW1lci5kb20oUG9seW1lci5kb20odGhpcy5fdXNlclRlbXBsYXRlKS5wYXJlbnROb2RlKX0sZ2V0IF9tYXhTY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3ZpZXdwb3J0SGVpZ2h0K3RoaXMuX3Njcm9sbE9mZnNldH0sCmdldCBfbWF4VmlydHVhbFN0YXJ0KCl7dmFyIGw9dGhpcy5fY29udmVydEluZGV4VG9Db21wbGV0ZVJvdyh0aGlzLl92aXJ0dWFsQ291bnQpO3JldHVybiBNYXRoLm1heCgwLGwtdGhpcy5fcGh5c2ljYWxDb3VudCl9LHNldCBfdmlydHVhbFN0YXJ0KGwpe2w9dGhpcy5fY2xhbXAobCwwLHRoaXMuX21heFZpcnR1YWxTdGFydCk7dGhpcy5ncmlkJiYobC09bCV0aGlzLl9pdGVtc1BlclJvdyk7dGhpcy5fdmlydHVhbFN0YXJ0VmFsPWx9LGdldCBfdmlydHVhbFN0YXJ0KCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydFZhbHx8MH0sc2V0IF9waHlzaWNhbFN0YXJ0KGwpe2wlPXRoaXMuX3BoeXNpY2FsQ291bnQ7MD5sJiYobD10aGlzLl9waHlzaWNhbENvdW50K2wpO3RoaXMuZ3JpZCYmKGwtPWwldGhpcy5faXRlbXNQZXJSb3cpO3RoaXMuX3BoeXNpY2FsU3RhcnRWYWw9bH0sZ2V0IF9waHlzaWNhbFN0YXJ0KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU3RhcnRWYWx8fDB9LGdldCBfcGh5c2ljYWxFbmQoKXtyZXR1cm4odGhpcy5fcGh5c2ljYWxTdGFydCsKdGhpcy5fcGh5c2ljYWxDb3VudC0xKSV0aGlzLl9waHlzaWNhbENvdW50fSxzZXQgX3BoeXNpY2FsQ291bnQobCl7dGhpcy5fcGh5c2ljYWxDb3VudFZhbD1sfSxnZXQgX3BoeXNpY2FsQ291bnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxDb3VudFZhbHx8MH0sZ2V0IF9vcHRQaHlzaWNhbFNpemUoKXtyZXR1cm4gMD09PXRoaXMuX3ZpZXdwb3J0SGVpZ2h0P0luZmluaXR5OnRoaXMuX3ZpZXdwb3J0SGVpZ2h0KnRoaXMuX21heFBhZ2VzfSxnZXQgX2lzVmlzaWJsZSgpe3JldHVybiEoIXRoaXMub2Zmc2V0V2lkdGgmJiF0aGlzLm9mZnNldEhlaWdodCl9LGdldCBmaXJzdFZpc2libGVJbmRleCgpe3ZhciBsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsO2lmKG51bGw9PWwpe3ZhciBwPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1sPXRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihtLG4pe3ArPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChtKTsKaWYocD50aGlzLl9zY3JvbGxQb3NpdGlvbilyZXR1cm4gdGhpcy5ncmlkP24tbiV0aGlzLl9pdGVtc1BlclJvdzpuO2lmKHRoaXMuZ3JpZCYmdGhpcy5fdmlydHVhbENvdW50LTE9PT1uKXJldHVybiBuLW4ldGhpcy5faXRlbXNQZXJSb3d9KXx8MH1yZXR1cm4gbH0sZ2V0IGxhc3RWaXNpYmxlSW5kZXgoKXt2YXIgbD10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsO2lmKG51bGw9PWwpe2lmKHRoaXMuZ3JpZClsPU1hdGgubWluKHRoaXMuX3ZpcnR1YWxDb3VudCx0aGlzLmZpcnN0VmlzaWJsZUluZGV4K3RoaXMuX2VzdFJvd3NJblZpZXcqdGhpcy5faXRlbXNQZXJSb3ctMSk7ZWxzZXt2YXIgcD10aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxPZmZzZXQ7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKG0sbil7cDx0aGlzLl9zY3JvbGxCb3R0b20mJihsPW4pO3ArPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChtKX0pfXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bH1yZXR1cm4gbH0sCmdldCBfZGVmYXVsdFNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzfSxnZXQgX3ZpcnR1YWxSb3dDb3VudCgpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlydHVhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9lc3RSb3dzSW5WaWV3KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC90aGlzLl9yb3dIZWlnaHQpfSxnZXQgX3BoeXNpY2FsUm93cygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fcGh5c2ljYWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGdldCBfc2Nyb2xsT2Zmc2V0KCl7cmV0dXJuIHRoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcCt0aGlzLnNjcm9sbE9mZnNldH0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9kaWRGb2N1cy5iaW5kKHRoaXMpLCEwKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpO3RoaXMubGlzdGVuKHRoaXMsImlyb24tcmVzaXplIiwKIl9yZXNpemVIYW5kbGVyIik7dGhpcy5saXN0ZW4odGhpcywia2V5ZG93biIsIl9rZXlkb3duSGFuZGxlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLCJfcmVzaXplSGFuZGxlciIpO3RoaXMudW5saXN0ZW4odGhpcywia2V5ZG93biIsIl9rZXlkb3duSGFuZGxlciIpfSxfc2V0T3ZlcmZsb3c6ZnVuY3Rpb24obCl7dGhpcy5zdHlsZS53ZWJraXRPdmVyZmxvd1Njcm9sbGluZz1sPT09dGhpcz8idG91Y2giOiIiO3RoaXMuc3R5bGUub3ZlcmZsb3dZPWw9PT10aGlzPyJhdXRvIjoiIjt0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPW51bGw7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLHRoaXMuX3JlbmRlcixoKX0sdXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzOmZ1bmN0aW9uKCl7dmFyIGw9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyk7dGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wPQp0aGlzLnNjcm9sbFRhcmdldD09PXRoaXM/MDpwYXJzZUludChsWyJwYWRkaW5nLXRvcCJdLDEwKTt0aGlzLl9pc1JUTD0icnRsIj09PWwuZGlyZWN0aW9uO3RoaXMuX3ZpZXdwb3J0V2lkdGg9dGhpcy4kLml0ZW1zLm9mZnNldFdpZHRoO3RoaXMuX3ZpZXdwb3J0SGVpZ2h0PXRoaXMuX3Njcm9sbFRhcmdldEhlaWdodDt0aGlzLmdyaWQmJnRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCl9LF9zY3JvbGxIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGw9TWF0aC5tYXgoMCxNYXRoLm1pbih0aGlzLl9tYXhTY3JvbGxUb3AsdGhpcy5fc2Nyb2xsVG9wKSkscD1sLXRoaXMuX3Njcm9sbFBvc2l0aW9uLG09MDw9cDt0aGlzLl9zY3JvbGxQb3NpdGlvbj1sO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDtNYXRoLmFicyhwKT50aGlzLl9waHlzaWNhbFNpemUmJjA8dGhpcy5fcGh5c2ljYWxTaXplPyhwLT10aGlzLl9zY3JvbGxPZmZzZXQsbT1NYXRoLnJvdW5kKHAvCnRoaXMuX3BoeXNpY2FsQXZlcmFnZSkqdGhpcy5faXRlbXNQZXJSb3csdGhpcy5fdmlydHVhbFN0YXJ0Kz1tLHRoaXMuX3BoeXNpY2FsU3RhcnQrPW0sdGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZSx0aGlzLl91cGRhdGUoKSk6MDx0aGlzLl9waHlzaWNhbENvdW50JiYobD10aGlzLl9nZXRSZXVzYWJsZXMobSksbT8odGhpcy5fcGh5c2ljYWxUb3A9bC5waHlzaWNhbFRvcCx0aGlzLl92aXJ0dWFsU3RhcnQrPWwuaW5kZXhlcy5sZW5ndGgsdGhpcy5fcGh5c2ljYWxTdGFydCs9bC5pbmRleGVzLmxlbmd0aCk6KHRoaXMuX3ZpcnR1YWxTdGFydC09bC5pbmRleGVzLmxlbmd0aCx0aGlzLl9waHlzaWNhbFN0YXJ0LT1sLmluZGV4ZXMubGVuZ3RoKSx0aGlzLl91cGRhdGUobC5pbmRleGVzLG0/bnVsbDpsLmluZGV4ZXMpLHRoaXMuX2RlYm91bmNlKCJfaW5jcmVhc2VQb29sSWZOZWVkZWQiLAp0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMsMCksdCkpfSxfZ2V0UmV1c2FibGVzOmZ1bmN0aW9uKGwpe3ZhciBwPVtdLG09dGhpcy5faGlkZGVuQ29udGVudFNpemUqdGhpcy5fcmF0aW8sbj10aGlzLl92aXJ0dWFsU3RhcnQscT10aGlzLl92aXJ0dWFsRW5kLHU9dGhpcy5fcGh5c2ljYWxDb3VudCx4PXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt2YXIgQT10aGlzLl9waHlzaWNhbEJvdHRvbSt0aGlzLl9zY3JvbGxPZmZzZXQ7dmFyIHk9dGhpcy5fc2Nyb2xsVG9wLHc9dGhpcy5fc2Nyb2xsQm90dG9tO2lmKGwpe3ZhciBDPXRoaXMuX3BoeXNpY2FsU3RhcnQ7QT15LXh9ZWxzZSBDPXRoaXMuX3BoeXNpY2FsRW5kLEEtPXc7Zm9yKDs7KXt2YXIgRj10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoQyk7QS09RjtpZihwLmxlbmd0aD49dXx8QTw9bSlicmVhaztpZihsKXtpZihxK3AubGVuZ3RoKzE+PXRoaXMuX3ZpcnR1YWxDb3VudClicmVhazsKaWYoeCtGPj15LXRoaXMuX3Njcm9sbE9mZnNldClicmVhaztwLnB1c2goQyk7eCs9RjtDPShDKzEpJXV9ZWxzZXtpZigwPj1uLXAubGVuZ3RoKWJyZWFrO2lmKHgrdGhpcy5fcGh5c2ljYWxTaXplLUY8PXcpYnJlYWs7cC5wdXNoKEMpO3gtPUY7Qz0wPT09Qz91LTE6Qy0xfX1yZXR1cm57aW5kZXhlczpwLHBoeXNpY2FsVG9wOngtdGhpcy5fc2Nyb2xsT2Zmc2V0fX0sX3VwZGF0ZTpmdW5jdGlvbihsLHApe2lmKCEobCYmMD09PWwubGVuZ3RofHwwPT09dGhpcy5fcGh5c2ljYWxDb3VudCkpe3RoaXMuX21hbmFnZUZvY3VzKCk7dGhpcy5fYXNzaWduTW9kZWxzKGwpO3RoaXMuX3VwZGF0ZU1ldHJpY3MobCk7aWYocClmb3IoO3AubGVuZ3RoOylsPXAucG9wKCksdGhpcy5fcGh5c2ljYWxUb3AtPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChsKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCl9fSxfY3JlYXRlUG9vbDpmdW5jdGlvbihsKXt0aGlzLl9lbnN1cmVUZW1wbGF0aXplZCgpOwp2YXIgcCxtPUFycmF5KGwpO2ZvcihwPTA7cDxsO3ArKyl7dmFyIG49dGhpcy5zdGFtcChudWxsKTttW3BdPW4ucm9vdC5xdWVyeVNlbGVjdG9yKCIqIik7dGhpcy5faXRlbXNQYXJlbnQuYXBwZW5kQ2hpbGQobi5yb290KX1yZXR1cm4gbX0sX2lzQ2xpZW50RnVsbDpmdW5jdGlvbigpe3JldHVybiAwIT10aGlzLl9zY3JvbGxCb3R0b20mJnRoaXMuX3BoeXNpY2FsQm90dG9tLTE+PXRoaXMuX3Njcm9sbEJvdHRvbSYmdGhpcy5fcGh5c2ljYWxUb3A8PXRoaXMuX3Njcm9sbFBvc2l0aW9ufSxfaW5jcmVhc2VQb29sSWZOZWVkZWQ6ZnVuY3Rpb24obCl7bD10aGlzLl9jbGFtcCh0aGlzLl9waHlzaWNhbENvdW50K2wsMyx0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fdmlydHVhbFN0YXJ0KTtsPXRoaXMuX2NvbnZlcnRJbmRleFRvQ29tcGxldGVSb3cobCk7aWYodGhpcy5ncmlkKXt2YXIgcD1sJXRoaXMuX2l0ZW1zUGVyUm93O3AmJmwtcDw9dGhpcy5fcGh5c2ljYWxDb3VudCYmKGwrPXRoaXMuX2l0ZW1zUGVyUm93KTsKbC09cH1sLT10aGlzLl9waHlzaWNhbENvdW50O3A9TWF0aC5yb3VuZCguNSp0aGlzLl9waHlzaWNhbENvdW50KTtpZighKDA+bCkpe2lmKDA8bCl7cD13aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7W10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbEl0ZW1zLHRoaXMuX2NyZWF0ZVBvb2wobCkpO2Zvcih2YXIgbT0wO208bDttKyspdGhpcy5fcGh5c2ljYWxTaXplcy5wdXNoKDApO3RoaXMuX3BoeXNpY2FsQ291bnQrPWw7dGhpcy5fcGh5c2ljYWxTdGFydD50aGlzLl9waHlzaWNhbEVuZCYmdGhpcy5faXNJbmRleFJlbmRlcmVkKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpJiZ0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpPHRoaXMuX3BoeXNpY2FsRW5kJiYodGhpcy5fcGh5c2ljYWxTdGFydCs9bCk7dGhpcy5fdXBkYXRlKCk7dGhpcy5fdGVtcGxhdGVDb3N0PSh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCktcCkvbDtwPU1hdGgucm91bmQoLjUqCnRoaXMuX3BoeXNpY2FsQ291bnQpfXRoaXMuX3ZpcnR1YWxFbmQ+PXRoaXMuX3ZpcnR1YWxDb3VudC0xfHwwPT09cHx8KHRoaXMuX2lzQ2xpZW50RnVsbCgpP3RoaXMuX3BoeXNpY2FsU2l6ZTx0aGlzLl9vcHRQaHlzaWNhbFNpemUmJnRoaXMuX2RlYm91bmNlKCJfaW5jcmVhc2VQb29sSWZOZWVkZWQiLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcyx0aGlzLl9jbGFtcChNYXRoLnJvdW5kKDUwL3RoaXMuX3RlbXBsYXRlQ29zdCksMSxwKSksayk6dGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLHApLHQpKX19LF9yZW5kZXI6ZnVuY3Rpb24oKXtpZih0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX2lzVmlzaWJsZSlpZigwIT09dGhpcy5fcGh5c2ljYWxDb3VudCl7dmFyIGw9dGhpcy5fZ2V0UmV1c2FibGVzKCEwKTt0aGlzLl9waHlzaWNhbFRvcD1sLnBoeXNpY2FsVG9wO3RoaXMuX3ZpcnR1YWxTdGFydCs9CmwuaW5kZXhlcy5sZW5ndGg7dGhpcy5fcGh5c2ljYWxTdGFydCs9bC5pbmRleGVzLmxlbmd0aDt0aGlzLl91cGRhdGUobC5pbmRleGVzKTt0aGlzLl91cGRhdGUoKTt0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKX1lbHNlIDA8dGhpcy5fdmlydHVhbENvdW50JiYodGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgzKSl9LF9lbnN1cmVUZW1wbGF0aXplZDpmdW5jdGlvbigpe2lmKCF0aGlzLmN0b3Ipeyh0aGlzLl91c2VyVGVtcGxhdGU9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCJ0ZW1wbGF0ZSIpKXx8Y29uc29sZS53YXJuKCJpcm9uLWxpc3QgcmVxdWlyZXMgYSB0ZW1wbGF0ZSB0byBiZSBwcm92aWRlZCBpbiBsaWdodC1kb20iKTt2YXIgbD17X19rZXlfXzohMH07bFt0aGlzLmFzXT0hMDtsW3RoaXMuaW5kZXhBc109ITA7bFt0aGlzLnNlbGVjdGVkQXNdPSEwO2wudGFiSW5kZXg9ITA7dGhpcy5faW5zdGFuY2VQcm9wcz0KbDt0aGlzLnRlbXBsYXRpemUodGhpcy5fdXNlclRlbXBsYXRlLHRoaXMubXV0YWJsZURhdGEpfX0sX2dyaWRDaGFuZ2VkOmZ1bmN0aW9uKGwscCl7InVuZGVmaW5lZCIhPT10eXBlb2YgcCYmKHRoaXMubm90aWZ5UmVzaXplKCksUG9seW1lci5mbHVzaD9Qb2x5bWVyLmZsdXNoKCk6UG9seW1lci5kb20uZmx1c2goKSxsJiZ0aGlzLl91cGRhdGVHcmlkTWV0cmljcygpKX0sX2l0ZW1zQ2hhbmdlZDpmdW5jdGlvbihsKXtpZigiaXRlbXMiPT09bC5wYXRoKXRoaXMuX3BoeXNpY2FsVG9wPXRoaXMuX3ZpcnR1YWxTdGFydD0wLHRoaXMuX3ZpcnR1YWxDb3VudD10aGlzLml0ZW1zP3RoaXMuaXRlbXMubGVuZ3RoOjAsdGhpcy5fY29sbGVjdGlvbj10aGlzLml0ZW1zJiZQb2x5bWVyLkNvbGxlY3Rpb24/UG9seW1lci5Db2xsZWN0aW9uLmdldCh0aGlzLml0ZW1zKTpudWxsLHRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXk9e30sdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD0KbnVsbCx0aGlzLl9waHlzaWNhbENvdW50PXRoaXMuX3BoeXNpY2FsQ291bnR8fDAsdGhpcy5fcGh5c2ljYWxJdGVtcz10aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSx0aGlzLl9waHlzaWNhbFNpemVzPXRoaXMuX3BoeXNpY2FsU2l6ZXN8fFtdLHRoaXMuX3BoeXNpY2FsU3RhcnQ9MCx0aGlzLl9zY3JvbGxUb3A+dGhpcy5fc2Nyb2xsT2Zmc2V0JiZ0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKDApLHRoaXMuX3JlbW92ZUZvY3VzZWRJdGVtKCksdGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLHRoaXMuX3JlbmRlcixoKTtlbHNlIGlmKCJpdGVtcy5zcGxpY2VzIj09PWwucGF0aCl7dGhpcy5fYWRqdXN0VmlydHVhbEluZGV4KGwudmFsdWUuaW5kZXhTcGxpY2VzKTt0aGlzLl92aXJ0dWFsQ291bnQ9dGhpcy5pdGVtcz90aGlzLml0ZW1zLmxlbmd0aDowO2lmKGwudmFsdWUuaW5kZXhTcGxpY2VzLnNvbWUoZnVuY3Rpb24obSl7cmV0dXJuIDA8bS5hZGRlZENvdW50fHwwPG0ucmVtb3ZlZC5sZW5ndGh9KSl7dmFyIHA9CnRoaXMuX2dldEFjdGl2ZUVsZW1lbnQoKTt0aGlzLmNvbnRhaW5zKHApJiZwLmJsdXIoKX1sPWwudmFsdWUuaW5kZXhTcGxpY2VzLnNvbWUoZnVuY3Rpb24obSl7cmV0dXJuIG0uaW5kZXgrbS5hZGRlZENvdW50Pj10aGlzLl92aXJ0dWFsU3RhcnQmJm0uaW5kZXg8PXRoaXMuX3ZpcnR1YWxFbmR9LHRoaXMpO3RoaXMuX2lzQ2xpZW50RnVsbCgpJiYhbHx8dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLHRoaXMuX3JlbmRlcixoKX1lbHNlIml0ZW1zLmxlbmd0aCIhPT1sLnBhdGgmJnRoaXMuX2ZvcndhcmRJdGVtUGF0aChsLnBhdGgsbC52YWx1ZSl9LF9mb3J3YXJkSXRlbVBhdGg6ZnVuY3Rpb24obCxwKXtsPWwuc2xpY2UoNik7dmFyIG09bC5pbmRleE9mKCIuIik7LTE9PT1tJiYobT1sLmxlbmd0aCk7dmFyIG4scT10aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSk7aWYoZil7dmFyIHU9cGFyc2VJbnQobC5zdWJzdHJpbmcoMCxtKSwxMCk7aWYobj10aGlzLl9pc0luZGV4UmVuZGVyZWQodSkpe3ZhciB4PQp0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHUpO3ZhciBBPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbeF0pfWVsc2UgcSYmKEE9cSk7aWYoIUF8fEFbdGhpcy5pbmRleEFzXSE9PXUpcmV0dXJufWVsc2UgaWYodT1sLnN1YnN0cmluZygwLG0pLHEmJnEuX19rZXlfXz09PXUpQT1xO2Vsc2UgaWYoeD10aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5W3VdLEE9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t4XSksIUF8fEEuX19rZXlfXyE9PXUpcmV0dXJuO2w9bC5zdWJzdHJpbmcobSsxKTtsPXRoaXMuYXMrKGw/Ii4iK2w6IiIpO2Y/QS5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKGwscCwhMSwhMCk6QS5ub3RpZnlQYXRoKGwscCwhMCk7QS5fZmx1c2hQcm9wZXJ0aWVzJiZBLl9mbHVzaFByb3BlcnRpZXMoITApO24mJih0aGlzLl91cGRhdGVNZXRyaWNzKFt4XSksdGhpcy5fcG9zaXRpb25JdGVtcygpLHRoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSgpKX0sCl9hZGp1c3RWaXJ0dWFsSW5kZXg6ZnVuY3Rpb24obCl7bC5mb3JFYWNoKGZ1bmN0aW9uKHApe3AucmVtb3ZlZC5mb3JFYWNoKHRoaXMuX3JlbW92ZUl0ZW0sdGhpcyk7cC5pbmRleDx0aGlzLl92aXJ0dWFsU3RhcnQmJihwPU1hdGgubWF4KHAuYWRkZWRDb3VudC1wLnJlbW92ZWQubGVuZ3RoLHAuaW5kZXgtdGhpcy5fdmlydHVhbFN0YXJ0KSx0aGlzLl92aXJ0dWFsU3RhcnQrPXAsMDw9dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCYmKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrPXApKX0sdGhpcyl9LF9yZW1vdmVJdGVtOmZ1bmN0aW9uKGwpe3RoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdChsKTt0aGlzLl9mb2N1c2VkSXRlbSYmdGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fZm9jdXNlZEl0ZW0pW3RoaXMuYXNdPT09bCYmdGhpcy5fcmVtb3ZlRm9jdXNlZEl0ZW0oKX0sX2l0ZXJhdGVJdGVtczpmdW5jdGlvbihsLHApe3ZhciBtLG47aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgmJnApZm9yKG49CjA7bjxwLmxlbmd0aDtuKyspe3ZhciBxPXBbbl07dmFyIHU9dGhpcy5fY29tcHV0ZVZpZHgocSk7aWYobnVsbCE9KG09bC5jYWxsKHRoaXMscSx1KSkpcmV0dXJuIG19ZWxzZXtxPXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHU9dGhpcy5fdmlydHVhbFN0YXJ0O3E8dGhpcy5fcGh5c2ljYWxDb3VudDtxKyssdSsrKWlmKG51bGwhPShtPWwuY2FsbCh0aGlzLHEsdSkpKXJldHVybiBtO2ZvcihxPTA7cTx0aGlzLl9waHlzaWNhbFN0YXJ0O3ErKyx1KyspaWYobnVsbCE9KG09bC5jYWxsKHRoaXMscSx1KSkpcmV0dXJuIG19fSxfY29tcHV0ZVZpZHg6ZnVuY3Rpb24obCl7cmV0dXJuIGw+PXRoaXMuX3BoeXNpY2FsU3RhcnQ/dGhpcy5fdmlydHVhbFN0YXJ0KyhsLXRoaXMuX3BoeXNpY2FsU3RhcnQpOnRoaXMuX3ZpcnR1YWxTdGFydCsodGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl9waHlzaWNhbFN0YXJ0KStsfSxfYXNzaWduTW9kZWxzOmZ1bmN0aW9uKGwpe3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihwLAptKXt2YXIgbj10aGlzLl9waHlzaWNhbEl0ZW1zW3BdLHE9dGhpcy5pdGVtcyYmdGhpcy5pdGVtc1ttXTtpZihudWxsIT1xKXt2YXIgdT10aGlzLm1vZGVsRm9yRWxlbWVudChuKTt1Ll9fa2V5X189dGhpcy5fY29sbGVjdGlvbj90aGlzLl9jb2xsZWN0aW9uLmdldEtleShxKTpudWxsO3RoaXMuX2ZvcndhcmRQcm9wZXJ0eSh1LHRoaXMuYXMscSk7dGhpcy5fZm9yd2FyZFByb3BlcnR5KHUsdGhpcy5zZWxlY3RlZEFzLHRoaXMuJC5zZWxlY3Rvci5pc1NlbGVjdGVkKHEpKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSx0aGlzLmluZGV4QXMsbSk7dGhpcy5fZm9yd2FyZFByb3BlcnR5KHUsInRhYkluZGV4Iix0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4PT09bT8wOi0xKTt0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5W3UuX19rZXlfX109cDt1Ll9mbHVzaFByb3BlcnRpZXMmJnUuX2ZsdXNoUHJvcGVydGllcyghMCk7bi5yZW1vdmVBdHRyaWJ1dGUoImhpZGRlbiIpfWVsc2Ugbi5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsCiIiKX0sbCl9LF91cGRhdGVNZXRyaWNzOmZ1bmN0aW9uKGwpe1BvbHltZXIuZmx1c2g/UG9seW1lci5mbHVzaCgpOlBvbHltZXIuZG9tLmZsdXNoKCk7dmFyIHA9MCxtPTAsbj10aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCxxPXRoaXMuX3BoeXNpY2FsQXZlcmFnZTt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24odSl7bSs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XTt0aGlzLl9waHlzaWNhbFNpemVzW3VdPXRoaXMuX3BoeXNpY2FsSXRlbXNbdV0ub2Zmc2V0SGVpZ2h0O3ArPXRoaXMuX3BoeXNpY2FsU2l6ZXNbdV07dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbdV0/MTowfSxsKTt0aGlzLmdyaWQ/KHRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCksdGhpcy5fcGh5c2ljYWxTaXplPU1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9yb3dIZWlnaHQpOihtPTE9PT10aGlzLl9pdGVtc1BlclJvdz9tOgpNYXRoLmNlaWwodGhpcy5fcGh5c2ljYWxDb3VudC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcm93SGVpZ2h0LHRoaXMuX3BoeXNpY2FsU2l6ZT10aGlzLl9waHlzaWNhbFNpemUrcC1tLHRoaXMuX2l0ZW1zUGVyUm93PTEpO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50IT09biYmKHRoaXMuX3BoeXNpY2FsQXZlcmFnZT1NYXRoLnJvdW5kKChxKm4rcCkvdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQpKX0sX3VwZGF0ZUdyaWRNZXRyaWNzOmZ1bmN0aW9uKCl7dGhpcy5faXRlbVdpZHRoPTA8dGhpcy5fcGh5c2ljYWxDb3VudD90aGlzLl9waHlzaWNhbEl0ZW1zWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoOjIwMDt0aGlzLl9yb3dIZWlnaHQ9MDx0aGlzLl9waHlzaWNhbENvdW50P3RoaXMuX3BoeXNpY2FsSXRlbXNbMF0ub2Zmc2V0SGVpZ2h0OjIwMDt0aGlzLl9pdGVtc1BlclJvdz10aGlzLl9pdGVtV2lkdGg/TWF0aC5mbG9vcih0aGlzLl92aWV3cG9ydFdpZHRoL3RoaXMuX2l0ZW1XaWR0aCk6CnRoaXMuX2l0ZW1zUGVyUm93fSxfcG9zaXRpb25JdGVtczpmdW5jdGlvbigpe3RoaXMuX2FkanVzdFNjcm9sbFBvc2l0aW9uKCk7dmFyIGw9dGhpcy5fcGh5c2ljYWxUb3A7aWYodGhpcy5ncmlkKXt2YXIgcD0odGhpcy5fdmlld3BvcnRXaWR0aC10aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9pdGVtV2lkdGgpLzI7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKG0sbil7dmFyIHE9TWF0aC5mbG9vcihuJXRoaXMuX2l0ZW1zUGVyUm93KnRoaXMuX2l0ZW1XaWR0aCtwKTt0aGlzLl9pc1JUTCYmKHEqPS0xKTt0aGlzLnRyYW5zbGF0ZTNkKHErInB4IixsKyJweCIsMCx0aGlzLl9waHlzaWNhbEl0ZW1zW21dKTt0aGlzLl9zaG91bGRSZW5kZXJOZXh0Um93KG4pJiYobCs9dGhpcy5fcm93SGVpZ2h0KX0pfWVsc2UgdGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKG0pe3RoaXMudHJhbnNsYXRlM2QoMCxsKyJweCIsMCx0aGlzLl9waHlzaWNhbEl0ZW1zW21dKTtsKz10aGlzLl9waHlzaWNhbFNpemVzW21dfSl9LApfZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50OmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLmdyaWQ/dGhpcy5fY29tcHV0ZVZpZHgobCkldGhpcy5faXRlbXNQZXJSb3chPT10aGlzLl9pdGVtc1BlclJvdy0xPzA6dGhpcy5fcm93SGVpZ2h0OnRoaXMuX3BoeXNpY2FsU2l6ZXNbbF19LF9zaG91bGRSZW5kZXJOZXh0Um93OmZ1bmN0aW9uKGwpe3JldHVybiBsJXRoaXMuX2l0ZW1zUGVyUm93PT09dGhpcy5faXRlbXNQZXJSb3ctMX0sX2FkanVzdFNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGw9MD09PXRoaXMuX3ZpcnR1YWxTdGFydD90aGlzLl9waHlzaWNhbFRvcDpNYXRoLm1pbih0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl9waHlzaWNhbFRvcCwwKTtpZigwIT09bCl7dGhpcy5fcGh5c2ljYWxUb3AtPWw7dmFyIHA9dGhpcy5fc2Nyb2xsVG9wOyFkJiYwPHAmJnRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24ocC1sKX19LF9yZXNldFNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKGwpe3RoaXMuc2Nyb2xsVGFyZ2V0JiYKMDw9bCYmKHRoaXMuX3Njcm9sbFBvc2l0aW9uPXRoaXMuX3Njcm9sbFRvcD1sKX0sX3VwZGF0ZVNjcm9sbGVyU2l6ZTpmdW5jdGlvbihsKXt0aGlzLl9lc3RTY3JvbGxIZWlnaHQ9dGhpcy5ncmlkP3RoaXMuX3ZpcnR1YWxSb3dDb3VudCp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxCb3R0b20rTWF0aC5tYXgodGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3BoeXNpY2FsQ291bnQtdGhpcy5fdmlydHVhbFN0YXJ0LDApKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtpZigobD0obD0obD1sfHwwPT09dGhpcy5fc2Nyb2xsSGVpZ2h0KXx8dGhpcy5fc2Nyb2xsUG9zaXRpb24+PXRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl9waHlzaWNhbFNpemUpfHx0aGlzLmdyaWQmJnRoaXMuJC5pdGVtcy5zdHlsZS5oZWlnaHQ8dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KXx8TWF0aC5hYnModGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3Njcm9sbEhlaWdodCk+PXRoaXMuX3ZpZXdwb3J0SGVpZ2h0KXRoaXMuJC5pdGVtcy5zdHlsZS5oZWlnaHQ9CnRoaXMuX2VzdFNjcm9sbEhlaWdodCsicHgiLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHR9LHNjcm9sbFRvSXRlbTpmdW5jdGlvbihsKXtyZXR1cm4gdGhpcy5zY3JvbGxUb0luZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHNjcm9sbFRvSW5kZXg6ZnVuY3Rpb24obCl7aWYoISgibnVtYmVyIiE9PXR5cGVvZiBsfHwwPmx8fGw+dGhpcy5pdGVtcy5sZW5ndGgtMSkmJihQb2x5bWVyLmZsdXNoP1BvbHltZXIuZmx1c2goKTpQb2x5bWVyLmRvbS5mbHVzaCgpLDAhPT10aGlzLl9waHlzaWNhbENvdW50KSl7bD10aGlzLl9jbGFtcChsLDAsdGhpcy5fdmlydHVhbENvdW50LTEpO2lmKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQobCl8fGw+PXRoaXMuX21heFZpcnR1YWxTdGFydCl0aGlzLl92aXJ0dWFsU3RhcnQ9dGhpcy5ncmlkP2wtMip0aGlzLl9pdGVtc1BlclJvdzpsLTE7dGhpcy5fbWFuYWdlRm9jdXMoKTt0aGlzLl9hc3NpZ25Nb2RlbHMoKTt0aGlzLl91cGRhdGVNZXRyaWNzKCk7CnRoaXMuX3BoeXNpY2FsVG9wPU1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7Zm9yKHZhciBwPXRoaXMuX3BoeXNpY2FsU3RhcnQsbT10aGlzLl92aXJ0dWFsU3RhcnQsbj0wLHE9dGhpcy5faGlkZGVuQ29udGVudFNpemU7bTxsJiZuPD1xOyluKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQocCkscD0ocCsxKSV0aGlzLl9waHlzaWNhbENvdW50LG0rKzt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoITApO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldCtuKTt0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKTt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGx9fSxfcmVzZXRBdmVyYWdlOmZ1bmN0aW9uKCl7dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQ9CnRoaXMuX3BoeXNpY2FsQXZlcmFnZT0wfSxfcmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIixmdW5jdGlvbigpe3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpO3RoaXMuX2lzVmlzaWJsZT8odGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMCksdGhpcy5fcmVzZXRBdmVyYWdlKCksdGhpcy5fcmVuZGVyKCkpOnRoaXMudG9nZ2xlU2Nyb2xsTGlzdGVuZXIoITEpfSxoKX0sc2VsZWN0SXRlbTpmdW5jdGlvbihsKXtyZXR1cm4gdGhpcy5zZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YobCkpfSxzZWxlY3RJbmRleDpmdW5jdGlvbihsKXtpZighKDA+bHx8bD49dGhpcy5fdmlydHVhbENvdW50KSl7IXRoaXMubXVsdGlTZWxlY3Rpb24mJnRoaXMuc2VsZWN0ZWRJdGVtJiZ0aGlzLmNsZWFyU2VsZWN0aW9uKCk7aWYodGhpcy5faXNJbmRleFJlbmRlcmVkKGwpKXt2YXIgcD0KdGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KGwpXSk7cCYmKHBbdGhpcy5zZWxlY3RlZEFzXT0hMCk7dGhpcy51cGRhdGVTaXplRm9ySW5kZXgobCl9dGhpcy4kLnNlbGVjdG9yLnNlbGVjdEluZGV4P3RoaXMuJC5zZWxlY3Rvci5zZWxlY3RJbmRleChsKTp0aGlzLiQuc2VsZWN0b3Iuc2VsZWN0KHRoaXMuaXRlbXNbbF0pfX0sZGVzZWxlY3RJdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLmRlc2VsZWN0SW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sZGVzZWxlY3RJbmRleDpmdW5jdGlvbihsKXswPmx8fGw+PXRoaXMuX3ZpcnR1YWxDb3VudHx8KHRoaXMuX2lzSW5kZXhSZW5kZXJlZChsKSYmKHRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChsKV0pW3RoaXMuc2VsZWN0ZWRBc109ITEsdGhpcy51cGRhdGVTaXplRm9ySW5kZXgobCkpLHRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdEluZGV4Pwp0aGlzLiQuc2VsZWN0b3IuZGVzZWxlY3RJbmRleChsKTp0aGlzLiQuc2VsZWN0b3IuZGVzZWxlY3QodGhpcy5pdGVtc1tsXSkpfSx0b2dnbGVTZWxlY3Rpb25Gb3JJdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnRvZ2dsZVNlbGVjdGlvbkZvckluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHRvZ2dsZVNlbGVjdGlvbkZvckluZGV4OmZ1bmN0aW9uKGwpeyh0aGlzLiQuc2VsZWN0b3IuaXNJbmRleFNlbGVjdGVkP3RoaXMuJC5zZWxlY3Rvci5pc0luZGV4U2VsZWN0ZWQobCk6dGhpcy4kLnNlbGVjdG9yLmlzU2VsZWN0ZWQodGhpcy5pdGVtc1tsXSkpP3RoaXMuZGVzZWxlY3RJbmRleChsKTp0aGlzLnNlbGVjdEluZGV4KGwpfSxjbGVhclNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihsKXt0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW2xdKVt0aGlzLnNlbGVjdGVkQXNdPSExfSk7dGhpcy4kLnNlbGVjdG9yLmNsZWFyU2VsZWN0aW9uKCl9LApfc2VsZWN0aW9uRW5hYmxlZENoYW5nZWQ6ZnVuY3Rpb24obCl7KGw/dGhpcy5saXN0ZW46dGhpcy51bmxpc3RlbikuY2FsbCh0aGlzLHRoaXMsInRhcCIsIl9zZWxlY3Rpb25IYW5kbGVyIil9LF9zZWxlY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKGwpe3ZhciBwPXRoaXMubW9kZWxGb3JFbGVtZW50KGwudGFyZ2V0KTtpZihwKXt2YXIgbT1Qb2x5bWVyLmRvbShsKS5wYXRoWzBdO2w9dGhpcy5fZ2V0QWN0aXZlRWxlbWVudCgpO3ZhciBuPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChwW3RoaXMuaW5kZXhBc10pXTtpZigiaW5wdXQiIT09bS5sb2NhbE5hbWUmJiJidXR0b24iIT09bS5sb2NhbE5hbWUmJiJzZWxlY3QiIT09bS5sb2NhbE5hbWUpe209cC50YWJJbmRleDtwLnRhYkluZGV4PS0xMDA7dmFyIHE9bD9sLnRhYkluZGV4Oi0xO3AudGFiSW5kZXg9bTtsJiZuIT09bCYmbi5jb250YWlucyhsKSYmLTEwMCE9PXF8fHRoaXMudG9nZ2xlU2VsZWN0aW9uRm9ySXRlbShwW3RoaXMuYXNdKX19fSwKX211bHRpU2VsZWN0aW9uQ2hhbmdlZDpmdW5jdGlvbihsKXt0aGlzLmNsZWFyU2VsZWN0aW9uKCk7dGhpcy4kLnNlbGVjdG9yLm11bHRpPWx9LHVwZGF0ZVNpemVGb3JJdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnVwZGF0ZVNpemVGb3JJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YobCkpfSx1cGRhdGVTaXplRm9ySW5kZXg6ZnVuY3Rpb24obCl7aWYoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZChsKSlyZXR1cm4gbnVsbDt0aGlzLl91cGRhdGVNZXRyaWNzKFt0aGlzLl9nZXRQaHlzaWNhbEluZGV4KGwpXSk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3JldHVybiBudWxsfSxfbWFuYWdlRm9jdXM6ZnVuY3Rpb24oKXt2YXIgbD10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4OzA8PWwmJmw8dGhpcy5fdmlydHVhbENvdW50P3RoaXMuX2lzSW5kZXhSZW5kZXJlZChsKT90aGlzLl9yZXN0b3JlRm9jdXNlZEl0ZW0oKTp0aGlzLl9jcmVhdGVGb2N1c0JhY2tmaWxsSXRlbSgpOjA8dGhpcy5fdmlydHVhbENvdW50JiYKMDx0aGlzLl9waHlzaWNhbENvdW50JiYodGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9dGhpcy5fcGh5c2ljYWxTdGFydCx0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4PXRoaXMuX3ZpcnR1YWxTdGFydCx0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX3BoeXNpY2FsU3RhcnRdKX0sX2NvbnZlcnRJbmRleFRvQ29tcGxldGVSb3c6ZnVuY3Rpb24obCl7dGhpcy5faXRlbXNQZXJSb3c9dGhpcy5faXRlbXNQZXJSb3d8fDE7cmV0dXJuIHRoaXMuZ3JpZD9NYXRoLmNlaWwobC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5faXRlbXNQZXJSb3c6bH0sX2lzSW5kZXhSZW5kZXJlZDpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5fdmlydHVhbFN0YXJ0JiZsPD10aGlzLl92aXJ0dWFsRW5kfSxfaXNJbmRleFZpc2libGU6ZnVuY3Rpb24obCl7cmV0dXJuIGw+PXRoaXMuZmlyc3RWaXNpYmxlSW5kZXgmJmw8PXRoaXMubGFzdFZpc2libGVJbmRleH0sX2dldFBoeXNpY2FsSW5kZXg6ZnVuY3Rpb24obCl7cmV0dXJuIGY/Cih0aGlzLl9waHlzaWNhbFN0YXJ0KyhsLXRoaXMuX3ZpcnR1YWxTdGFydCkpJXRoaXMuX3BoeXNpY2FsQ291bnQ6dGhpcy5fcGh5c2ljYWxJbmRleEZvcktleVt0aGlzLl9jb2xsZWN0aW9uLmdldEtleSh0aGlzLml0ZW1zW2xdKV19LGZvY3VzSXRlbTpmdW5jdGlvbihsKXt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbShsKX0sX2ZvY3VzUGh5c2ljYWxJdGVtOmZ1bmN0aW9uKGwpe2lmKCEoMD5sfHxsPj10aGlzLl92aXJ0dWFsQ291bnQpKXt0aGlzLl9yZXN0b3JlRm9jdXNlZEl0ZW0oKTt0aGlzLl9pc0luZGV4UmVuZGVyZWQobCl8fHRoaXMuc2Nyb2xsVG9JbmRleChsKTt2YXIgcD10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldLG09dGhpcy5tb2RlbEZvckVsZW1lbnQocCksbjttLnRhYkluZGV4PS0xMDA7LTEwMD09PXAudGFiSW5kZXgmJihuPXApO258fChuPVBvbHltZXIuZG9tKHApLnF1ZXJ5U2VsZWN0b3IoJ1t0YWJpbmRleFx4M2QiLTEwMCJdJykpOwptLnRhYkluZGV4PTA7dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD1sO24mJm4uZm9jdXMoKX19LF9yZW1vdmVGb2N1c2VkSXRlbTpmdW5jdGlvbigpe3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtJiZ0aGlzLl9pdGVtc1BhcmVudC5yZW1vdmVDaGlsZCh0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSk7dGhpcy5fZm9jdXNlZEl0ZW09dGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW09bnVsbDt0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4PS0xfSxfY3JlYXRlRm9jdXNCYWNrZmlsbEl0ZW06ZnVuY3Rpb24oKXt2YXIgbD10aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleDtpZighKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtfHwwPnRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpKXtpZighdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW0pe3ZhciBwPXRoaXMuc3RhbXAobnVsbCk7dGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09CnAucm9vdC5xdWVyeVNlbGVjdG9yKCIqIik7dGhpcy5faXRlbXNQYXJlbnQuYXBwZW5kQ2hpbGQocC5yb290KX10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbT10aGlzLl9waHlzaWNhbEl0ZW1zW2xdO3RoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKS50YWJJbmRleD0wO3RoaXMuX3BoeXNpY2FsSXRlbXNbbF09dGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW07dGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9bDt0aGlzLnRyYW5zbGF0ZTNkKDAsIi0xMDAwMHB4IiwwLHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKX19LF9yZXN0b3JlRm9jdXNlZEl0ZW06ZnVuY3Rpb24oKXtpZih0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSYmISgwPnRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpKXt0aGlzLl9hc3NpZ25Nb2RlbHMoKTt2YXIgbD10aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9nZXRQaHlzaWNhbEluZGV4KHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpLApwPXRoaXMuX3BoeXNpY2FsSXRlbXNbbF07aWYocCl7dmFyIG09dGhpcy5tb2RlbEZvckVsZW1lbnQocCksbj10aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSk7bVt0aGlzLmFzXT09PW5bdGhpcy5hc10/KHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPXAsbS50YWJJbmRleD0tMSx0aGlzLl9waHlzaWNhbEl0ZW1zW2xdPXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLHRoaXMudHJhbnNsYXRlM2QoMCwiLTEwMDAwcHgiLDAsdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW0pKToodGhpcy5fcmVtb3ZlRm9jdXNlZEl0ZW0oKSx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT1udWxsKTt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbT1udWxsfX19LF9kaWRGb2N1czpmdW5jdGlvbihsKXtsPXRoaXMubW9kZWxGb3JFbGVtZW50KGwudGFyZ2V0KTt2YXIgcD10aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9mb2N1c2VkSXRlbSksbT1udWxsIT09dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sCm49dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleDtsJiYocD09PWw/dGhpcy5faXNJbmRleFZpc2libGUobil8fHRoaXMuc2Nyb2xsVG9JbmRleChuKToodGhpcy5fcmVzdG9yZUZvY3VzZWRJdGVtKCkscCYmKHAudGFiSW5kZXg9LTEpLGwudGFiSW5kZXg9MCx0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4PW49bFt0aGlzLmluZGV4QXNdLHRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2dldFBoeXNpY2FsSW5kZXgobiksdGhpcy5fZm9jdXNlZEl0ZW09dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleF0sbSYmIXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtJiZ0aGlzLl91cGRhdGUoKSkpfSxfa2V5ZG93bkhhbmRsZXI6ZnVuY3Rpb24obCl7c3dpdGNoKGwua2V5Q29kZSl7Y2FzZSA0MDp0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4PHRoaXMuX3ZpcnR1YWxDb3VudC0xJiZsLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsKKHRoaXMuZ3JpZD90aGlzLl9pdGVtc1BlclJvdzoxKSk7YnJlYWs7Y2FzZSAzOTp0aGlzLmdyaWQmJnRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrKHRoaXMuX2lzUlRMPy0xOjEpKTticmVhaztjYXNlIDM4OjA8dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCYmbC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgtKHRoaXMuZ3JpZD90aGlzLl9pdGVtc1BlclJvdzoxKSk7YnJlYWs7Y2FzZSAzNzp0aGlzLmdyaWQmJnRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrKHRoaXMuX2lzUlRMPzE6LTEpKTticmVhaztjYXNlIDEzOnRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpLHRoaXMuc2VsZWN0aW9uRW5hYmxlZCYmdGhpcy5fc2VsZWN0aW9uSGFuZGxlcihsKX19LF9jbGFtcDpmdW5jdGlvbihsLApwLG0pe3JldHVybiBNYXRoLm1pbihtLE1hdGgubWF4KHAsbCkpfSxfZGVib3VuY2U6ZnVuY3Rpb24obCxwLG0pe2Y/KHRoaXMuX2RlYm91bmNlcnM9dGhpcy5fZGVib3VuY2Vyc3x8e30sdGhpcy5fZGVib3VuY2Vyc1tsXT1Qb2x5bWVyLkRlYm91bmNlci5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJzW2xdLG0scC5iaW5kKHRoaXMpKSxQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIodGhpcy5fZGVib3VuY2Vyc1tsXSkpOlBvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKGwscCkpfSxfZm9yd2FyZFByb3BlcnR5OmZ1bmN0aW9uKGwscCxtKXtmP2wuX3NldFBlbmRpbmdQcm9wZXJ0eShwLG0pOmxbcF09bX0sX2ZvcndhcmRIb3N0UHJvcFYyOmZ1bmN0aW9uKGwscCl7KHRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdKS5jb25jYXQoW3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtXSkuZm9yRWFjaChmdW5jdGlvbihtKXttJiZ0aGlzLm1vZGVsRm9yRWxlbWVudChtKS5mb3J3YXJkSG9zdFByb3AobCwKcCl9LHRoaXMpfSxfbm90aWZ5SW5zdGFuY2VQcm9wVjI6ZnVuY3Rpb24obCxwLG0pe1BvbHltZXIuUGF0aC5tYXRjaGVzKHRoaXMuYXMscCkmJihsPWxbdGhpcy5pbmRleEFzXSxwPT10aGlzLmFzJiYodGhpcy5pdGVtc1tsXT1tKSx0aGlzLm5vdGlmeVBhdGgoUG9seW1lci5QYXRoLnRyYW5zbGF0ZSh0aGlzLmFzLCJpdGVtcy4iK2wscCksbSkpfSxfZ2V0U3RhbXBlZENoaWxkcmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsSXRlbXN9LF9mb3J3YXJkSW5zdGFuY2VQYXRoOmZ1bmN0aW9uKGwscCxtKXswPT09cC5pbmRleE9mKHRoaXMuYXMrIi4iKSYmdGhpcy5ub3RpZnlQYXRoKCJpdGVtcy4iK2wuX19rZXlfXysiLiIrcC5zbGljZSh0aGlzLmFzLmxlbmd0aCsxKSxtKX0sX2ZvcndhcmRQYXJlbnRQYXRoOmZ1bmN0aW9uKGwscCl7KHRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdKS5jb25jYXQoW3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtXSkuZm9yRWFjaChmdW5jdGlvbihtKXttJiYKdGhpcy5tb2RlbEZvckVsZW1lbnQobSkubm90aWZ5UGF0aChsLHAsITApfSx0aGlzKX0sX2ZvcndhcmRQYXJlbnRQcm9wOmZ1bmN0aW9uKGwscCl7KHRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdKS5jb25jYXQoW3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtXSkuZm9yRWFjaChmdW5jdGlvbihtKXttJiYodGhpcy5tb2RlbEZvckVsZW1lbnQobSlbbF09cCl9LHRoaXMpfSxfZ2V0QWN0aXZlRWxlbWVudDpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2l0ZW1zUGFyZW50Lm5vZGUuZG9tSG9zdDtyZXR1cm4gUG9seW1lci5kb20obD9sLnJvb3Q6ZG9jdW1lbnQpLmFjdGl2ZUVsZW1lbnR9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS1ib2R5Lmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWl0ZW0tYm9keSJ9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vdGYtZ3JhcGgtaWNvbi5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtsZXQgaDsoZnVuY3Rpb24oayl7ay5DT05TVD0iQ09OU1QiO2suTUVUQT0iTUVUQSI7ay5PUD0iT1AiO2suU0VSSUVTPSJTRVJJRVMiO2suU1VNTUFSWT0iU1VNTUFSWSJ9KShoPWYuR3JhcGhJY29uVHlwZXx8KGYuR3JhcGhJY29uVHlwZT17fSkpO1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1pY29uIixwcm9wZXJ0aWVzOnt0eXBlOlN0cmluZyx2ZXJ0aWNhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxmaWxsT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHN0cm9rZU92ZXJyaWRlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOjIwfSxmYWRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZmlsbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlRmlsbCh0eXBlLCBmaWxsT3ZlcnJpZGUpIn0sX3N0cm9rZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlU3Ryb2tlKHR5cGUsIHN0cm9rZU92ZXJyaWRlKSJ9fSwKZ2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLiQuc3ZnRGVmc30sX2NvbXB1dGVGaWxsKGssdCl7aWYobnVsbCE9dClyZXR1cm4gdDtzd2l0Y2goayl7Y2FzZSBoLk1FVEE6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk1ldGFub2RlQ29sb3JzLkRFRkFVTFRfRklMTDtjYXNlIGguU0VSSUVTOnJldHVybiBiLmdyYXBoLnJlbmRlci5TZXJpZXNOb2RlQ29sb3JzLkRFRkFVTFRfRklMTDtkZWZhdWx0OnJldHVybiBiLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuREVGQVVMVF9GSUxMfX0sX2NvbXB1dGVTdHJva2Uoayx0KXtpZihudWxsIT10KXJldHVybiB0O3N3aXRjaChrKXtjYXNlIGguTUVUQTpyZXR1cm4gYi5ncmFwaC5yZW5kZXIuTWV0YW5vZGVDb2xvcnMuREVGQVVMVF9TVFJPS0U7Y2FzZSBoLlNFUklFUzpyZXR1cm4gYi5ncmFwaC5yZW5kZXIuU2VyaWVzTm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRTtkZWZhdWx0OnJldHVybiBiLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuREVGQVVMVF9TVFJPS0V9fSwKX2lzVHlwZShrLHQpe3JldHVybiBrPT09dH0sX2ZhZGVkQ2xhc3M6ZnVuY3Rpb24oayx0KXtyZXR1cm4gaz8iZmFkZWQtIit0OiIifX0pfSkoZC5pY29ufHwoZC5pY29uPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90Zi1ub2RlLWljb24uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbm9kZS1pY29uIixwcm9wZXJ0aWVzOntub2RlOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxyZW5kZXJJbmZvOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxjb2xvckJ5Ont0eXBlOk9iamVjdCx2YWx1ZToic3RydWN0dXJhbCJ9LHRlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sdmFsdWU6bnVsbH0sdHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sdmVydGljYWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY29uc3Q6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc3VtbWFyeTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxmaWxsOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOjIwfSxfZmlsbE92ZXJyaWRlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVGaWxsT3ZlcnJpZGUobm9kZSwgcmVuZGVySW5mbywgY29sb3JCeSwgdGVtcGxhdGVJbmRleCwgZmlsbCkiLG9ic2VydmVyOiJfb25GaWxsT3ZlcnJpZGVDaGFuZ2VkIn19LApfY29tcHV0ZUZpbGxPdmVycmlkZTpmdW5jdGlvbihiLGQsZixoLGspe3JldHVybiBiJiZkJiZmJiZoPyhiPXRmLmdyYXBoLnNjZW5lLm5vZGUsYi5nZXRGaWxsRm9yTm9kZShoLGIuQ29sb3JCeVtmLnRvVXBwZXJDYXNlKCldLGQsITEpKTprfSxfZ2V0U3Ryb2tlT3ZlcnJpZGU6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGYuZ3JhcGguc2NlbmUubm9kZS5nZXRTdHJva2VGb3JGaWxsKGIpOm51bGx9LF9nZXRUeXBlOmZ1bmN0aW9uKGIsZCxmLGgpe2NvbnN0IGs9dGYuZ3JhcGguaWNvbi5HcmFwaEljb25UeXBlO2lmKGIpc3dpdGNoKGIudHlwZSl7Y2FzZSB0Zi5ncmFwaC5Ob2RlVHlwZS5PUDpyZXR1cm4gYj1iLm9wLCJzdHJpbmciIT09dHlwZW9mIGI/ay5PUDoiQ29uc3QiPT09Ynx8Zj9rLkNPTlNUOmIuZW5kc1dpdGgoIlN1bW1hcnkiKXx8ZD9rLlNVTU1BUlk6ay5PUDtjYXNlIHRmLmdyYXBoLk5vZGVUeXBlLk1FVEE6cmV0dXJuIGsuTUVUQTtjYXNlIHRmLmdyYXBoLk5vZGVUeXBlLlNFUklFUzpyZXR1cm4gay5TRVJJRVN9cmV0dXJuIGh9LApfaXNWZXJ0aWNhbDpmdW5jdGlvbihiLGQpe3JldHVybiBiP2IuaGFzTm9uQ29udHJvbEVkZ2VzOiEhZH0sX2dldEZhZGVkOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmlzRmFkZWRPdXR9LF9vbkZpbGxPdmVycmlkZUNoYW5nZWQoYixkKXtjb25zdCBmPXRoaXMubm9kZSxoPXRoaXMucmVuZGVySW5mbyxrPXRoaXMuY29sb3JCeSx0PXRoaXMudGVtcGxhdGVJbmRleCxsPXRmLmdyYXBoLnNjZW5lLm5vZGU7YiE9PWQmJmwucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucyh0aGlzLiQuaWNvbi5nZXRTdmdEZWZpbmFibGVFbGVtZW50KCkpO2YmJmgmJmsmJnQmJmwuZ2V0RmlsbEZvck5vZGUodCxsLkNvbG9yQnlbay50b1VwcGVyQ2FzZSgpXSxoLCExLHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkL3RmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSIscHJvcGVydGllczp7Y2FyZE5vZGU6T2JqZWN0LGl0ZW1Ob2RlOk9iamVjdCxlZGdlTGFiZWw6U3RyaW5nLGl0ZW1SZW5kZXJJbmZvOk9iamVjdCxuYW1lOlN0cmluZyxpdGVtVHlwZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9pdGVtVHlwZUNoYW5nZWQifSxjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOk9iamVjdCx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9ufSxfaXRlbVR5cGVDaGFuZ2VkOmZ1bmN0aW9uKCl7InN1Ym5vZGUiIT09dGhpcy5pdGVtVHlwZT90aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5hZGQoImNsaWNrYWJsZSIpOnRoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LnJlbW92ZSgiY2xpY2thYmxlIil9LF9ub2RlTGlzdGVuZXI6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJub2RlLWxpc3QtaXRlbS0iK2IudHlwZSx7bm9kZU5hbWU6dGhpcy5uYW1lLHR5cGU6dGhpcy5pdGVtVHlwZX0pfSwKX2ZhZGVkQ2xhc3M6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuaXNGYWRlZE91dD8iZmFkZWQiOiIifX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1vcC1jb21wYXQtY2FyZC90Zi1ncmFwaC1vcC1jb21wYXQtY2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1vcC1jb21wYXQtY2FyZCIscHJvcGVydGllczp7Z3JhcGhIaWVyYXJjaHk6T2JqZWN0LGhpZXJhcmNoeVBhcmFtczpPYmplY3QscmVuZGVySGllcmFyY2h5Ok9iamVjdCxub2RlVGl0bGU6U3RyaW5nLF90ZW1wbGF0ZUluZGV4Ont0eXBlOkZ1bmN0aW9uLGNvbXB1dGVkOiJfZ2V0VGVtcGxhdGVJbmRleChncmFwaEhpZXJhcmNoeSkifSxfaW5jb21wYXRpYmxlT3BOb2Rlczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXRJbmNvbXBhdGlibGVPcE5vZGVzKGdyYXBoSGllcmFyY2h5LCBoaWVyYXJjaHlQYXJhbXMpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9vcENvbXBhdFNjb3JlOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVPcENvbXBhdFNjb3JlKGdyYXBoSGllcmFyY2h5KSJ9LF9vcENvbXBhdFNjb3JlTGFiZWw6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0T3BDb21wYXRTY29yZUxhYmVsKF9vcENvbXBhdFNjb3JlKSJ9LApfb3BDb21wYXRDb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6dGYuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5DT01QQVRJQkxFfSxfb3BJbmNvbXBhdENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTp0Zi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLklOQ09NUEFUSUJMRX0sX3RvdGFsSW5jb21wYXRPcHM6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfZ2V0VG90YWxJbmNvbXBhdGlibGVPcHMoZ3JhcGhIaWVyYXJjaHkpIn19LF9nZXRUZW1wbGF0ZUluZGV4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldFRlbXBsYXRlSW5kZXgoKX0sX2dldE5vZGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4gZC5ub2RlKGIpfSxfZ2V0UHJpbnRhYmxlSFRNTE5vZGVOYW1lOmZ1bmN0aW9uKGIpe3JldHVybihifHwiIikucmVwbGFjZSgvXC8vZywiXHgzY3diclx4M2UvIil9LF9nZXRSZW5kZXJJbmZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUoYil9LApfdG9nZ2xlRXhwYW5kZWQ6ZnVuY3Rpb24oKXt0aGlzLl9leHBhbmRlZD0hdGhpcy5fZXhwYW5kZWR9LF9nZXRUb2dnbGVJY29uOmZ1bmN0aW9uKGIpe3JldHVybiBiPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn0sX3Jlc2l6ZUxpc3Q6ZnVuY3Rpb24oYil7KGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihiKSkmJmIuZmlyZSgiaXJvbi1yZXNpemUiKX0sX2dldEluY29tcGF0aWJsZU9wTm9kZXM6ZnVuY3Rpb24oYixkKXtpZihiJiZiLnJvb3QpcmV0dXJuIHRoaXMuYXN5bmModGhpcy5fcmVzaXplTGlzdC5iaW5kKHRoaXMsIiNpbmNvbXBhdGlibGVPcHNMaXN0IikpLHRmLmdyYXBoLmhpZXJhcmNoeS5nZXRJbmNvbXBhdGlibGVPcHMoYixkKX0sX2NvbXB1dGVPcENvbXBhdFNjb3JlOmZ1bmN0aW9uKGIpe2lmKGImJmIucm9vdCl7dmFyIGQ9Yi5yb290O2I9ZC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU7ZD1kLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlOwpyZXR1cm4gMD09YiYmMD09ZD8wOk1hdGguZmxvb3IoMTAwKmIvKGIrZCkpLzEwMH1yZXR1cm4gMH0sX2dldE9wQ29tcGF0U2NvcmVMYWJlbDpmdW5jdGlvbihiKXtyZXR1cm4gZDMuZm9ybWF0KCIuMCUiKShiKX0sX2dldFRvdGFsSW5jb21wYXRpYmxlT3BzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLnJvb3Q/Yi5yb290LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlOjB9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWluZm8vdGYtbm9kZS1saXN0LWl0ZW0uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbm9kZS1saXN0LWl0ZW0iLHByb3BlcnRpZXM6e2NhcmROb2RlOk9iamVjdCxpdGVtTm9kZTpPYmplY3QsZWRnZUxhYmVsOlN0cmluZyxpdGVtUmVuZGVySW5mbzpPYmplY3QsbmFtZTpTdHJpbmcsaXRlbVR5cGU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfaXRlbVR5cGVDaGFuZ2VkIn0sY29sb3JCeTpTdHJpbmcsY29sb3JCeVBhcmFtczpPYmplY3QsdGVtcGxhdGVJbmRleDpGdW5jdGlvbn0sX2l0ZW1UeXBlQ2hhbmdlZDpmdW5jdGlvbigpeyJzdWJub2RlIiE9PXRoaXMuaXRlbVR5cGU/dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QuYWRkKCJjbGlja2FibGUiKTp0aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5yZW1vdmUoImNsaWNrYWJsZSIpfSxfbm9kZUxpc3RlbmVyOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgibm9kZS1saXN0LWl0ZW0tIitiLnR5cGUse2NhcmROb2RlOnRoaXMuY2FyZE5vZGUubmFtZSxub2RlTmFtZTp0aGlzLm5hbWUsCnR5cGU6dGhpcy5pdGVtVHlwZX0pfSxfZmFkZWRDbGFzczpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWluZm8vdGYtbm9kZS1pbmZvLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLW5vZGUtaW5mbyIscHJvcGVydGllczp7Z3JhcGhOb2RlTmFtZTpTdHJpbmcsZ3JhcGhIaWVyYXJjaHk6T2JqZWN0LHJlbmRlckhpZXJhcmNoeTpPYmplY3QsY29sb3JCeTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9ub2RlOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldE5vZGUoZ3JhcGhOb2RlTmFtZSwgZ3JhcGhIaWVyYXJjaHkpIixvYnNlcnZlcjoiX3Jlc2V0U3RhdGUifSxfbm9kZVN0YXRzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldE5vZGVTdGF0cyhncmFwaE5vZGVOYW1lLCBncmFwaEhpZXJhcmNoeSkiLG9ic2VydmVyOiJfcmVzZXRTdGF0ZSJ9LF9oYXNEaXNwbGF5YWJsZU5vZGVTdGF0czp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXRIYXNEaXNwbGF5YWJsZU5vZGVTdGF0cyhfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRCeXRlczp7dHlwZTpTdHJpbmcsCmNvbXB1dGVkOiJfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXMoX25vZGVTdGF0cykifSxfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWUoX25vZGVTdGF0cykifSxfbm9kZVN0YXRzRm9ybWF0dGVkT3V0cHV0U2l6ZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplcyhfbm9kZVN0YXRzKSJ9LG5vZGVJbmNsdWRlOnt0eXBlOk51bWJlcixvYnNlcnZlcjoiX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkIn0sX2F0dHJpYnV0ZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRBdHRyaWJ1dGVzKF9ub2RlKSJ9LF9kZXZpY2U6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0RGV2aWNlKF9ub2RlKSJ9LF9zdWNjZXNzb3JzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldFN1Y2Nlc3NvcnMoX25vZGUsIGdyYXBoSGllcmFyY2h5KSJ9LApfcHJlZGVjZXNzb3JzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldFByZWRlY2Vzc29ycyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sX2Z1bmN0aW9uVXNhZ2VzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0RnVuY3Rpb25Vc2FnZXMoX25vZGUsIGdyYXBoSGllcmFyY2h5KSJ9LF9zdWJub2Rlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldFN1Ym5vZGVzKF9ub2RlKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfdG90YWxQcmVkZWNlc3NvcnM6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfZ2V0VG90YWxQcmVkKF9wcmVkZWNlc3NvcnMpIn0sX3RvdGFsU3VjY2Vzc29yczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbFN1Y2MoX3N1Y2Nlc3NvcnMpIn0sX29wZW5lZENvbnRyb2xQcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9vcGVuZWRDb250cm9sU3VjYzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfYXV4QnV0dG9uVGV4dDpTdHJpbmcsX2dyb3VwQnV0dG9uVGV4dDpTdHJpbmd9LApleHBhbmROb2RlOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJfbm9kZS5leHBhbmQiLHRoaXMubm9kZSl9LF9nZXRUZW1wbGF0ZUluZGV4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldFRlbXBsYXRlSW5kZXgoKX0sX2dldE5vZGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4gZC5ub2RlKGIpfSxfZ2V0Tm9kZVN0YXRzOmZ1bmN0aW9uKGIsZCl7cmV0dXJuKGI9dGhpcy5fZ2V0Tm9kZShiLGQpKT9iLnN0YXRzOm51bGx9LF9nZXRUb3RhbE1pY3JvczpmdW5jdGlvbihiKXtyZXR1cm4gYj9iLmdldFRvdGFsTWljcm9zKCk6MH0sX2dldEhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzOmZ1bmN0aW9uKGIpe3JldHVybiB0Zi5ncmFwaC51dGlsLmhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKGIpfSxfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXM6ZnVuY3Rpb24oYil7aWYoYiYmYi50b3RhbEJ5dGVzKXJldHVybiB0Zi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShiLnRvdGFsQnl0ZXMsdGYuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpfSwKX2dldE5vZGVTdGF0c0Zvcm1hdHRlZENvbXB1dGVUaW1lOmZ1bmN0aW9uKGIpe2lmKGImJmIuZ2V0VG90YWxNaWNyb3MoKSlyZXR1cm4gdGYuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUoYi5nZXRUb3RhbE1pY3JvcygpLHRmLmdyYXBoLnV0aWwuVElNRV9VTklUUyl9LF9nZXROb2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplczpmdW5jdGlvbihiKXtpZihiJiZiLm91dHB1dFNpemUmJmIub3V0cHV0U2l6ZS5sZW5ndGgpcmV0dXJuIF8ubWFwKGIub3V0cHV0U2l6ZSxmdW5jdGlvbihkKXtyZXR1cm4gMD09PWQubGVuZ3RoPyJzY2FsYXIiOiJbIitkLmpvaW4oIiwgIikrIl0ifSl9LF9nZXRQcmludGFibGVIVE1MTm9kZU5hbWU6ZnVuY3Rpb24oYil7cmV0dXJuKGJ8fCIiKS5yZXBsYWNlKC9cLy9nLCJceDNjd2JyXHgzZS8iKX0sX2dldFJlbmRlckluZm86ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZShiKX0sCl9nZXRBdHRyaWJ1dGVzOmZ1bmN0aW9uKGIpe3RoaXMuYXN5bmModGhpcy5fcmVzaXplTGlzdC5iaW5kKHRoaXMsIiNhdHRyaWJ1dGVzTGlzdCIpKTtpZighYnx8IWIuYXR0cilyZXR1cm5bXTt2YXIgZD1bXTtfLmVhY2goYi5hdHRyLGZ1bmN0aW9uKGYpe2Yua2V5PT09dGYuZ3JhcGguTEFSR0VfQVRUUlNfS0VZP2Q9ZC5jb25jYXQoZi52YWx1ZS5saXN0LnMubWFwKGZ1bmN0aW9uKGgpe3JldHVybntrZXk6aCx2YWx1ZToiVG9vIGxhcmdlIHRvIHNob3cuLi4ifX0pKTpkLnB1c2goe2tleTpmLmtleSx2YWx1ZTpKU09OLnN0cmluZ2lmeShmLnZhbHVlKX0pfSk7cmV0dXJuIGR9LF9nZXREZXZpY2U6ZnVuY3Rpb24oYil7cmV0dXJuIGI/Yi5kZXZpY2U6bnVsbH0sX2dldFN1Y2Nlc3NvcnMoYixkKXt0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJpbnB1dHNMaXN0Iik7cmV0dXJuIGI/dGhpcy5fY29udmVydEVkZ2VMaXN0VG9FZGdlSW5mb0xpc3QoZC5nZXRTdWNjZXNzb3JzKGIubmFtZSksCiExLGIuaXNHcm91cE5vZGUpOntyZWd1bGFyOltdLGNvbnRyb2w6W119fSxfZ2V0UHJlZGVjZXNzb3JzKGIsZCl7dGhpcy5fcmVmcmVzaE5vZGVJdGVtTGlzdCgib3V0cHV0c0xpc3QiKTtyZXR1cm4gYj90aGlzLl9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdChkLmdldFByZWRlY2Vzc29ycyhiLm5hbWUpLCEwLGIuaXNHcm91cE5vZGUpOntyZWd1bGFyOltdLGNvbnRyb2w6W119fSxfZ2V0RnVuY3Rpb25Vc2FnZXMoYixkKXt0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJmdW5jdGlvblVzYWdlc0xpc3QiKTtyZXR1cm4gYiYmYi50eXBlPT09dGYuZ3JhcGguTm9kZVR5cGUuTUVUQT8oYj1kLmxpYnJhcnlGdW5jdGlvbnNbYi5hc3NvY2lhdGVkRnVuY3Rpb25dKT9iLnVzYWdlczpbXTpbXX0sX3JlZnJlc2hOb2RlSXRlbUxpc3QoYil7dGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcyxgIyR7Yn1gKSl9LF9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdDpmdW5jdGlvbihiLApkLGYpe3ZhciBoPXQ9Pl8ubWFwKHQuYmFzZUVkZ2VMaXN0LGw9Pnt2YXIgcD1kP2wudjpsLnc7cmV0dXJue25hbWU6cCxub2RlOnRoaXMuX2dldE5vZGUocCx0aGlzLmdyYXBoSGllcmFyY2h5KSxlZGdlTGFiZWw6dGYuZ3JhcGguc2NlbmUuZWRnZS5nZXRMYWJlbEZvckJhc2VFZGdlKGwsdGhpcy5yZW5kZXJIaWVyYXJjaHkpLHJlbmRlckluZm86dGhpcy5fZ2V0UmVuZGVySW5mbyhwLHRoaXMucmVuZGVySGllcmFyY2h5KX19KSxrPWZ1bmN0aW9uKHQpe3ZhciBsPVtdO18uZWFjaCh0LHA9Pnt2YXIgbT1kP3AudjpwLnc7ZiYmMSE9cC5iYXNlRWRnZUxpc3QubGVuZ3RoP2wucHVzaCh7bmFtZTptLG5vZGU6dGhpcy5fZ2V0Tm9kZShtLHRoaXMuZ3JhcGhIaWVyYXJjaHkpLGVkZ2VMYWJlbDp0Zi5ncmFwaC5zY2VuZS5lZGdlLmdldExhYmVsRm9yRWRnZShwLHRoaXMucmVuZGVySGllcmFyY2h5KSxyZW5kZXJJbmZvOnRoaXMuX2dldFJlbmRlckluZm8obSx0aGlzLnJlbmRlckhpZXJhcmNoeSl9KToKbD1sLmNvbmNhdChoKHApKX0pO3JldHVybiBsfS5iaW5kKHRoaXMpO3JldHVybntyZWd1bGFyOmsoYi5yZWd1bGFyKSxjb250cm9sOmsoYi5jb250cm9sKX19LF9nZXRTdWJub2RlczpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5tZXRhZ3JhcGg/Yi5tZXRhZ3JhcGgubm9kZXMoKTpudWxsfSxfZ2V0VG90YWxQcmVkOmZ1bmN0aW9uKGIpe3JldHVybiBiLnJlZ3VsYXIubGVuZ3RoK2IuY29udHJvbC5sZW5ndGh9LF9nZXRUb3RhbFN1Y2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIucmVndWxhci5sZW5ndGgrYi5jb250cm9sLmxlbmd0aH0sX3RvZ2dsZUNvbnRyb2xQcmVkOmZ1bmN0aW9uKCl7dGhpcy5fb3BlbmVkQ29udHJvbFByZWQ9IXRoaXMuX29wZW5lZENvbnRyb2xQcmVkfSxfdG9nZ2xlQ29udHJvbFN1Y2M6ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWRDb250cm9sU3VjYz0hdGhpcy5fb3BlbmVkQ29udHJvbFN1Y2N9LF90b2dnbGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2V4cGFuZGVkPQohdGhpcy5fZXhwYW5kZWR9LF9nZXRUb2dnbGVJY29uOmZ1bmN0aW9uKGIpe3JldHVybiBiPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn0sX3Jlc2V0U3RhdGU6ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWRDb250cm9sU3VjYz10aGlzLl9vcGVuZWRDb250cm9sUHJlZD0hMTt0aGlzLnNldCgiX2dyb3VwQnV0dG9uVGV4dCIsdGYuZ3JhcGguc2NlbmUubm9kZS5nZXRHcm91cFNldHRpbmdMYWJlbCh0aGlzLl9ub2RlKSk7dGhpcy5fbm9kZSYmKFBvbHltZXIuZG9tKHRoaXMuJC5ub2RldGl0bGUpLmlubmVySFRNTD10aGlzLl9nZXRQcmludGFibGVIVE1MTm9kZU5hbWUodGhpcy5fbm9kZS5uYW1lKSl9LF9yZXNpemVMaXN0OmZ1bmN0aW9uKGIpeyhiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYikpJiZiLmZpcmUoImlyb24tcmVzaXplIil9LF90b2dnbGVJbmNsdWRlOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJub2RlLXRvZ2dsZS1pbmNsdXNpb24iLHtuYW1lOnRoaXMuZ3JhcGhOb2RlTmFtZX0pfSwKX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuc2V0KCJfYXV4QnV0dG9uVGV4dCIsdGYuZ3JhcGguZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmcoYikpfSxfdG9nZ2xlR3JvdXA6ZnVuY3Rpb24oKXt2YXIgYj10Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFNlcmllc05hbWUodGhpcy5fbm9kZSk7dGhpcy5maXJlKCJub2RlLXRvZ2dsZS1zZXJpZXNncm91cCIse25hbWU6Yn0pfSxfaXNMaWJyYXJ5RnVuY3Rpb24oYil7cmV0dXJuIGImJmIubmFtZS5zdGFydHNXaXRoKHRmLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpfSxfaXNJblNlcmllczpmdW5jdGlvbihiKXtyZXR1cm4gdGYuZ3JhcGguc2NlbmUubm9kZS5jYW5CZUluU2VyaWVzKGIpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1pbmZvL3RmLWdyYXBoLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtaW5mbyIscHJvcGVydGllczp7dGl0bGU6U3RyaW5nLGdyYXBoSGllcmFyY2h5Ok9iamVjdCxncmFwaDpPYmplY3QscmVuZGVySGllcmFyY2h5Ok9iamVjdCxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxoZWFsdGhQaWxsU3RlcEluZGV4Ont0eXBlOk51bWJlcixub3RpZnk6ITB9LGNvbG9yQnk6U3RyaW5nLGNvbXBhdE5vZGVUaXRsZTpTdHJpbmcsc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxlY3RlZE5vZGVJbmNsdWRlOnt0eXBlOk51bWJlcixub3RpZnk6ITB9LGRlYnVnZ2VyRGF0YUVuYWJsZWQ6Qm9vbGVhbn0sbGlzdGVuZXJzOnsibm9kZS1saXN0LWl0ZW0tY2xpY2siOiJfbm9kZUxpc3RJdGVtQ2xpY2tlZCIsIm5vZGUtbGlzdC1pdGVtLW1vdXNlb3ZlciI6Il9ub2RlTGlzdEl0ZW1Nb3VzZW92ZXIiLCJub2RlLWxpc3QtaXRlbS1tb3VzZW91dCI6Il9ub2RlTGlzdEl0ZW1Nb3VzZW91dCJ9LApfbm9kZUxpc3RJdGVtQ2xpY2tlZDpmdW5jdGlvbihiKXt0aGlzLnNlbGVjdGVkTm9kZT1iLmRldGFpbC5ub2RlTmFtZX0sX25vZGVMaXN0SXRlbU1vdXNlb3ZlcjpmdW5jdGlvbihiKXt0aGlzLmhpZ2hsaWdodGVkTm9kZT1iLmRldGFpbC5ub2RlTmFtZX0sX25vZGVMaXN0SXRlbU1vdXNlb3V0OmZ1bmN0aW9uKCl7dGhpcy5oaWdobGlnaHRlZE5vZGU9bnVsbH0sX2hlYWx0aFBpbGxzQXZhaWxhYmxlOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGImJmQmJjA8T2JqZWN0LmtleXMoZCkubGVuZ3RofSxfZXF1YWxzOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI9PT1kfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1ib2FyZC90Zi1ncmFwaC1ib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1ib2FyZCIscHJvcGVydGllczp7Z3JhcGhIaWVyYXJjaHk6T2JqZWN0LGdyYXBoOk9iamVjdCxzdGF0czpPYmplY3QscHJvZ3Jlc3M6T2JqZWN0LHRyYWNlSW5wdXRzOkJvb2xlYW4sY29sb3JCeTpTdHJpbmcsY29sb3JCeVBhcmFtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxyZW5kZXJIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sZGVidWdnZXJEYXRhRW5hYmxlZDpCb29sZWFuLGFyZUhlYWx0aFBpbGxzTG9hZGluZzpCb29sZWFuLGRlYnVnZ2VyTnVtZXJpY0FsZXJ0czp7dHlwZTpBcnJheSxub3RpZnk6ITB9LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGFsbFN0ZXBzTW9kZUVuYWJsZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6ITF9LHNwZWNpZmljSGVhbHRoUGlsbFN0ZXA6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCx2YWx1ZTowfSxoZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcixzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLApub3RpZnk6ITB9LGNvbXBhdE5vZGVUaXRsZTp7dHlwZTpTdHJpbmcsdmFsdWU6IlRQVSBDb21wYXRpYmlsaXR5In0sZWRnZVdpZHRoRnVuY3Rpb246T2JqZWN0LF9zZWxlY3RlZE5vZGVJbmNsdWRlOk51bWJlcixfaGlnaGxpZ2h0ZWROb2RlOlN0cmluZyxoYW5kbGVOb2RlU2VsZWN0ZWQ6T2JqZWN0LGVkZ2VMYWJlbEZ1bmN0aW9uOk9iamVjdCxoYW5kbGVFZGdlU2VsZWN0ZWQ6T2JqZWN0fSxvYnNlcnZlcnM6WyJfdXBkYXRlTm9kZUluY2x1ZGUoc2VsZWN0ZWROb2RlLCByZW5kZXJIaWVyYXJjaHkpIl0sZml0OmZ1bmN0aW9uKCl7dGhpcy4kLmdyYXBoLmZpdCgpfSxfaXNOb3RDb21wbGV0ZTpmdW5jdGlvbihiKXtyZXR1cm4gMTAwPmIudmFsdWV9LF9nZXRDb250YWluZXJDbGFzczpmdW5jdGlvbihiKXt2YXIgZD0iY29udGFpbmVyIjtiLmVycm9yJiYoZCs9IiBlcnJvciIpO3RoaXMuX2lzTm90Q29tcGxldGUoYikmJihkKz0iIGxvYWRpbmciKTtyZXR1cm4gZH0sX29uTm9kZUluY2x1c2lvblRvZ2dsZWQoYil7dGhpcy4kLmdyYXBoLm5vZGVUb2dnbGVFeHRyYWN0KGIuZGV0YWlsLm5hbWUpfSwKX29uTm9kZVNlcmllc0dyb3VwVG9nZ2xlZChiKXt0aGlzLiQuZ3JhcGgubm9kZVRvZ2dsZVNlcmllc0dyb3VwKGIuZGV0YWlsLm5hbWUpfSxfdXBkYXRlTm9kZUluY2x1ZGUoKXtjb25zdCBiPXRoaXMucmVuZGVySGllcmFyY2h5P3RoaXMucmVuZGVySGllcmFyY2h5LmdldE5vZGVCeU5hbWUodGhpcy5zZWxlY3RlZE5vZGUpOm51bGw7dGhpcy5fc2VsZWN0ZWROb2RlSW5jbHVkZT1iP2IuaW5jbHVkZTp0Zi5ncmFwaC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnViYXItYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToibWVudWJhciJ9LGtleUJpbmRpbmdzOntsZWZ0OiJfb25MZWZ0S2V5IixyaWdodDoiX29uUmlnaHRLZXkifSxfb25VcEtleTpmdW5jdGlvbihiKXt0aGlzLmZvY3VzZWRJdGVtLmNsaWNrKCk7Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGIpe3RoaXMuZm9jdXNlZEl0ZW0uY2xpY2soKTtiLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LGdldCBfaXNSVEwoKXtyZXR1cm4icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbn0sX29uTGVmdEtleTpmdW5jdGlvbihiKXt0aGlzLl9pc1JUTD90aGlzLl9mb2N1c05leHQoKTp0aGlzLl9mb2N1c1ByZXZpb3VzKCk7Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25SaWdodEtleTpmdW5jdGlvbihiKXt0aGlzLl9pc1JUTD8KdGhpcy5fZm9jdXNQcmV2aW91cygpOnRoaXMuX2ZvY3VzTmV4dCgpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihiKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ1cCBkb3duIGxlZnQgcmlnaHQgZXNjIil8fHRoaXMuX2ZvY3VzV2l0aEtleWJvYXJkRXZlbnQoYil9fTtQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3I9W1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yYWRpby1idXR0b24vcGFwZXItcmFkaW8tYnV0dG9uLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXJhZGlvLWJ1dHRvbiIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InJhZGlvIiwiYXJpYS1jaGVja2VkIjohMSx0YWJpbmRleDowfSxwcm9wZXJ0aWVzOnthcmlhQWN0aXZlQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiYXJpYS1jaGVja2VkIn19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5yYWRpb0NvbnRhaW5lcn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcyxmdW5jdGlvbigpe2lmKCItMXB4Ij09PXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIikudHJpbSgpKXt2YXIgYj1wYXJzZUZsb2F0KHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUiKS50cmltKCkpLApkPU1hdGguZmxvb3IoMypiKTtkJTIhPT1iJTImJmQrKzt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIjpkKyJweCJ9KX19KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yYWRpby1ncm91cC9wYXBlci1yYWRpby1ncm91cC5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1yYWRpby1ncm91cCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJyYWRpb2dyb3VwIn0scHJvcGVydGllczp7YXR0ckZvclNlbGVjdGVkOnt0eXBlOlN0cmluZyx2YWx1ZToibmFtZSJ9LHNlbGVjdGVkQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiY2hlY2tlZCJ9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci1yYWRpby1idXR0b24ifSxhbGxvd0VtcHR5U2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxzZWxlY3Q6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fdmFsdWVUb0l0ZW0oYik7aWYoIWR8fCFkLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7aWYodGhpcy5zZWxlY3RlZCl7ZD10aGlzLl92YWx1ZVRvSXRlbSh0aGlzLnNlbGVjdGVkKTtpZih0aGlzLnNlbGVjdGVkPT1iKWlmKHRoaXMuYWxsb3dFbXB0eVNlbGVjdGlvbiliPSIiO2Vsc2V7ZCYmCihkLmNoZWNrZWQ9ITApO3JldHVybn1kJiYoZC5jaGVja2VkPSExKX1Qb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3Iuc2VsZWN0LmFwcGx5KHRoaXMsW2JdKTt0aGlzLmZpcmUoInBhcGVyLXJhZGlvLWdyb3VwLWNoYW5nZWQiKX19LF9hY3RpdmF0ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5faXRlbUFjdGl2YXRlKHRoaXMuX3ZhbHVlRm9ySXRlbSh0aGlzLmZvY3VzZWRJdGVtKSx0aGlzLmZvY3VzZWRJdGVtKX0sX29uVXBLZXk6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNQcmV2aW91cygpO2IucHJldmVudERlZmF1bHQoKTt0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNOZXh0KCk7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uTGVmdEtleTpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsLl9vbkxlZnRLZXkuYXBwbHkodGhpcyxhcmd1bWVudHMpOwp0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGwuX29uUmlnaHRLZXkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b29sdGlwL3BhcGVyLXRvb2x0aXAuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdG9vbHRpcCIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRvb2x0aXAiLHRhYmluZGV4Oi0xfSxwcm9wZXJ0aWVzOntmb3I6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfZmluZFRhcmdldCJ9LG1hbnVhbE1vZGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX21hbnVhbE1vZGVDaGFuZ2VkIn0scG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiJib3R0b20ifSxmaXRUb1Zpc2libGVCb3VuZHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sb2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZToxNH0sbWFyZ2luVG9wOnt0eXBlOk51bWJlcix2YWx1ZToxNH0sYW5pbWF0aW9uRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMCxvYnNlcnZlcjoiX2RlbGF5Q2hhbmdlIn0sYW5pbWF0aW9uRW50cnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbmltYXRpb25FeGl0Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sYW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdCwKdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZW50cnk6W3tuYW1lOiJmYWRlLWluLWFuaW1hdGlvbiIsbm9kZTp0aGlzLHRpbWluZzp7ZGVsYXk6MH19XSxleGl0Olt7bmFtZToiZmFkZS1vdXQtYW5pbWF0aW9uIixub2RlOnRoaXN9XX19fSxfc2hvd2luZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sbGlzdGVuZXJzOnt3ZWJraXRBbmltYXRpb25FbmQ6Il9vbkFuaW1hdGlvbkVuZCJ9LGdldCB0YXJnZXQoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlLGQ9UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCk7cmV0dXJuIHRoaXMuZm9yP1BvbHltZXIuZG9tKGQpLnF1ZXJ5U2VsZWN0b3IoIiMiK3RoaXMuZm9yKTpiLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/ZC5ob3N0OmJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZmluZFRhcmdldCgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCl9LApwbGF5QW5pbWF0aW9uOmZ1bmN0aW9uKGIpeyJlbnRyeSI9PT1iP3RoaXMuc2hvdygpOiJleGl0Ij09PWImJnRoaXMuaGlkZSgpfSxjYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJjYW5jZWwtYW5pbWF0aW9uIil9LHNob3c6ZnVuY3Rpb24oKXtpZighdGhpcy5fc2hvd2luZyl7aWYoIiI9PT1Qb2x5bWVyLmRvbSh0aGlzKS50ZXh0Q29udGVudC50cmltKCkpe2Zvcih2YXIgYj0hMCxkPVBvbHltZXIuZG9tKHRoaXMpLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKSxmPTA7ZjxkLmxlbmd0aDtmKyspaWYoIiIhPT1kW2ZdLnRleHRDb250ZW50LnRyaW0oKSl7Yj0hMTticmVha31pZihiKXJldHVybn10aGlzLl9zaG93aW5nPSEwO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKTt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSk7CnRoaXMudXBkYXRlUG9zaXRpb24oKTt0aGlzLl9hbmltYXRpb25QbGF5aW5nPSEwO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSl9fSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5fc2hvd2luZyYmKHRoaXMuX2FuaW1hdGlvblBsYXlpbmc/KHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fY2FuY2VsQW5pbWF0aW9uKCkpOih0aGlzLl9vbkFuaW1hdGlvbkZpbmlzaCgpLHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMCkpfSx1cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMuX3RhcmdldCYmdGhpcy5vZmZzZXRQYXJlbnQpe3ZhciBiPXRoaXMub2Zmc2V0OzE0IT10aGlzLm1hcmdpblRvcCYmMTQ9PXRoaXMub2Zmc2V0JiYoYj10aGlzLm1hcmdpblRvcCk7dmFyIGQ9dGhpcy5vZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZj10aGlzLl90YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCmg9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxrPShmLndpZHRoLWgud2lkdGgpLzIsdD0oZi5oZWlnaHQtaC5oZWlnaHQpLzIsbD1mLmxlZnQtZC5sZWZ0LHA9Zi50b3AtZC50b3A7c3dpdGNoKHRoaXMucG9zaXRpb24pe2Nhc2UgInRvcCI6dmFyIG09bCtrO3ZhciBuPXAtaC5oZWlnaHQtYjticmVhaztjYXNlICJib3R0b20iOm09bCtrO249cCtmLmhlaWdodCtiO2JyZWFrO2Nhc2UgImxlZnQiOm09bC1oLndpZHRoLWI7bj1wK3Q7YnJlYWs7Y2FzZSAicmlnaHQiOm09bCtmLndpZHRoK2Isbj1wK3R9dGhpcy5maXRUb1Zpc2libGVCb3VuZHM/KGQubGVmdCttK2gud2lkdGg+d2luZG93LmlubmVyV2lkdGg/KHRoaXMuc3R5bGUucmlnaHQ9IjBweCIsdGhpcy5zdHlsZS5sZWZ0PSJhdXRvIik6KHRoaXMuc3R5bGUubGVmdD1NYXRoLm1heCgwLG0pKyJweCIsdGhpcy5zdHlsZS5yaWdodD0iYXV0byIpLGQudG9wK24raC5oZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0Pyh0aGlzLnN0eWxlLmJvdHRvbT0KZC5oZWlnaHQrInB4Iix0aGlzLnN0eWxlLnRvcD0iYXV0byIpOih0aGlzLnN0eWxlLnRvcD1NYXRoLm1heCgtZC50b3AsbikrInB4Iix0aGlzLnN0eWxlLmJvdHRvbT0iYXV0byIpKToodGhpcy5zdHlsZS5sZWZ0PW0rInB4Iix0aGlzLnN0eWxlLnRvcD1uKyJweCIpfX0sX2FkZExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmKHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VlbnRlciIsInNob3ciKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VsZWF2ZSIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImJsdXIiLCJoaWRlIiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpO3RoaXMubGlzdGVuKHRoaXMuJC50b29sdGlwLCJhbmltYXRpb25lbmQiLCJfb25BbmltYXRpb25FbmQiKTt0aGlzLmxpc3Rlbih0aGlzLCJtb3VzZWVudGVyIiwiaGlkZSIpfSwKX2ZpbmRUYXJnZXQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO3RoaXMuX3RhcmdldD10aGlzLnRhcmdldDt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX2FkZExpc3RlbmVycygpfSxfZGVsYXlDaGFuZ2U6ZnVuY3Rpb24oYil7NTAwIT09YiYmdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4iOmIrIm1zIn0pfSxfbWFudWFsTW9kZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGU/dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk6dGhpcy5fYWRkTGlzdGVuZXJzKCl9LF9jYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImVudHJ5IikpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKTt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIik7CnRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfSxfb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9zaG93aW5nJiYodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIiksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpKX0sX29uQW5pbWF0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMTt0aGlzLl9zaG93aW5nfHwodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpKX0sX2dldEFuaW1hdGlvblR5cGU6ZnVuY3Rpb24oYil7aWYoImVudHJ5Ij09PWImJiIiIT09dGhpcy5hbmltYXRpb25FbnRyeSlyZXR1cm4gdGhpcy5hbmltYXRpb25FbnRyeTsKaWYoImV4aXQiPT09YiYmIiIhPT10aGlzLmFuaW1hdGlvbkV4aXQpcmV0dXJuIHRoaXMuYW5pbWF0aW9uRXhpdDtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXSYmInN0cmluZyI9PT10eXBlb2YgdGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0ubmFtZSl7aWYodGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0udGltaW5nJiZ0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS50aW1pbmcuZGVsYXkmJjAhPT10aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS50aW1pbmcuZGVsYXkpe3ZhciBkPXRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdWzBdLnRpbWluZy5kZWxheTsiZW50cnkiPT09Yj90aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiI6ZCsibXMifSk6ImV4aXQiPT09YiYmdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0IjpkKyJtcyJ9KX1yZXR1cm4gdGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0ubmFtZX19LF9yZW1vdmVMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLl90YXJnZXQmJgoodGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsIm1vdXNlZW50ZXIiLCJzaG93IiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWxlYXZlIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJibHVyIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpO3RoaXMudW5saXN0ZW4odGhpcy4kLnRvb2x0aXAsImFuaW1hdGlvbmVuZCIsIl9vbkFuaW1hdGlvbkVuZCIpO3RoaXMudW5saXN0ZW4odGhpcywibW91c2VlbnRlciIsImhpZGUiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1ub2RlLXNlYXJjaC90Zi1ncmFwaC1ub2RlLXNlYXJjaC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1ub2RlLXNlYXJjaCIscHJvcGVydGllczp7cmVuZGVySGllcmFyY2h5Ok9iamVjdCxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3Jhd1JlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfcmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUmVnZXhJbnB1dChyZW5kZXJIaWVyYXJjaHksIF9yYXdSZWdleElucHV0KSJ9LF9wcmV2aW91c1JlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfc2VhcmNoVGltZW91dERlbGF5Ont0eXBlOk51bWJlcix2YWx1ZToxNTAscmVhZE9ubHk6ITB9LF9zZWFyY2hQZW5kaW5nOkJvb2xlYW4sX21heFJlZ2V4UmVzdWx0czp7dHlwZTpOdW1iZXIsdmFsdWU6NDJ9LF9yZWdleE1hdGNoZXM6QXJyYXl9LG9ic2VydmVyczpbIl9yZWdleElucHV0Q2hhbmdlZChfcmVnZXhJbnB1dCkiXSxfY29tcHV0ZVJlZ2V4SW5wdXQoYixkKXtyZXR1cm4gZC50cmltKCl9LApfcmVnZXhJbnB1dENoYW5nZWQoKXt0aGlzLl9yZXF1ZXN0U2VhcmNoKCl9LF9jbGVhclNlYXJjaFJlc3VsdHMoKXt0aGlzLnNldCgiX3JlZ2V4TWF0Y2hlcyIsW10pfSxfcmVxdWVzdFNlYXJjaCgpe3RoaXMuX3NlYXJjaFBlbmRpbmd8fCh0aGlzLl9yZWdleElucHV0PT09dGhpcy5fcHJldmlvdXNSZWdleElucHV0P3RoaXMuX3NlYXJjaFBlbmRpbmc9ITE6KHRoaXMuX3NlYXJjaFBlbmRpbmc9ITAsdGhpcy5fZXhlY3V0ZVNlYXJjaCgpLHRoaXMuYXN5bmMoKCk9Pnt0aGlzLl9zZWFyY2hQZW5kaW5nPSExO3RoaXMuX3JlcXVlc3RTZWFyY2goKX0sdGhpcy5fc2VhcmNoVGltZW91dERlbGF5KSkpfSxfZXhlY3V0ZVNlYXJjaCgpe2lmKHRoaXMuX3ByZXZpb3VzUmVnZXhJbnB1dD10aGlzLl9yZWdleElucHV0KXt0cnl7dmFyIGI9bmV3IFJlZ0V4cCh0aGlzLl9yZWdleElucHV0KX1jYXRjaChmKXt0aGlzLl9jbGVhclNlYXJjaFJlc3VsdHMoKTtyZXR1cm59dmFyIGQ9W107Xy5lYWNoKHRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5nZXROb2RlTWFwKCksCihmLGgpPT57aWYoZC5sZW5ndGg+PXRoaXMuX21heFJlZ2V4UmVzdWx0cylyZXR1cm4hMTtiLnRlc3QoaCkmJmQucHVzaChoKX0pO3RoaXMuc2V0KCJfcmVnZXhNYXRjaGVzIixkKX1lbHNlIHRoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpfSxfbWF0Y2hDbGlja2VkKGIpe3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLGIubW9kZWwuaXRlbSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29udHJvbHMvdGYtZ3JhcGgtY29udHJvbHMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Y29uc3QgaD0vZGV2aWNlOihbXjpdKzpbMC05XSspJC8saz1be3JlZ2V4Omh9XSx0PVtdO2xldCBsOyhmdW5jdGlvbihtKXttLkNPTVBVVEVfVElNRT0iY29tcHV0ZV90aW1lIjttLk1FTU9SWT0ibWVtb3J5IjttLlNUUlVDVFVSRT0ic3RydWN0dXJlIjttLlhMQV9DTFVTVEVSPSJ4bGFfY2x1c3RlciI7bS5PUF9DT01QQVRJQklMSVRZPSJvcF9jb21wYXRpYmlsaXR5In0pKGw9Zi5Db2xvckJ5fHwoZi5Db2xvckJ5PXt9KSk7Y29uc3QgcD1uZXcgU2V0KFtsLkNPTVBVVEVfVElNRSxsLk1FTU9SWV0pO1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1jb250cm9scyIscHJvcGVydGllczp7c3RhdHM6e3ZhbHVlOm51bGwsdHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9zdGF0c0NoYW5nZWQifSxkZXZpY2VzRm9yU3RhdHM6e3ZhbHVlOm51bGwsdHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRvbmx5OiEwfSxjb2xvckJ5Ont0eXBlOlN0cmluZywKdmFsdWU6bC5TVFJVQ1RVUkUsbm90aWZ5OiEwfSxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZG9ubHk6ITB9LGRhdGFzZXRzOnt0eXBlOkFycmF5LG9ic2VydmVyOiJfZGF0YXNldHNDaGFuZ2VkIix2YWx1ZTooKT0+W119LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3R9LHNlbGVjdGlvbjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLGNvbXB1dGVkOiJfY29tcHV0ZVNlbGVjdGlvbihkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4LCBfc2VsZWN0ZWRHcmFwaFR5cGUpIn0sc2VsZWN0ZWRGaWxlOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LF9zZWxlY3RlZFJ1bkluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJfc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQifSx0cmFjZUlucHV0czp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sX3NlbGVjdGVkVGFnSW5kZXg6e3R5cGU6TnVtYmVyLAp2YWx1ZTowLG9ic2VydmVyOiJfc2VsZWN0ZWRUYWdJbmRleENoYW5nZWQifSxfc2VsZWN0ZWRHcmFwaFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOmIuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSH0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9jdXJyZW50RGV2aWNlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnREZXZpY2VzKGRldmljZXNGb3JTdGF0cykifSxfY3VycmVudERldmljZVBhcmFtczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnREZXZpY2VQYXJhbXMoY29sb3JCeVBhcmFtcykifSxfY3VycmVudFhsYUNsdXN0ZXJQYXJhbXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRDdXJyZW50WGxhQ2x1c3RlclBhcmFtcyhjb2xvckJ5UGFyYW1zKSJ9LF9jdXJyZW50R3JhZGllbnRQYXJhbXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Q3VycmVudEdyYWRpZW50UGFyYW1zKGNvbG9yQnlQYXJhbXMsIGNvbG9yQnkpIn0sCnNob3dTZXNzaW9uUnVuc0Ryb3Bkb3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LHNob3dVcGxvYWRCdXR0b246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0saGVhbHRoUGlsbHNGZWF0dXJlRW5hYmxlZDpCb29sZWFuLGhlYWx0aFBpbGxzVG9nZ2xlZE9uOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfbGVnZW5kT3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9fSxfeGxhQ2x1c3RlcnNQcm92aWRlZDpmdW5jdGlvbihtKXtyZXR1cm4gbSYmbS5oaWVyYXJjaHkmJjA8bS5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RofSxfc3RhdHNDaGFuZ2VkOmZ1bmN0aW9uKG0pe2lmKG51bGwhPW0pe3ZhciBuPXt9O18uZWFjaChtLmRldl9zdGF0cyxmdW5jdGlvbihxKXt2YXIgdT1fLnNvbWUoayxmdW5jdGlvbihBKXtyZXR1cm4gQS5yZWdleC50ZXN0KHEuZGV2aWNlKX0pLHg9Xy5zb21lKHQsZnVuY3Rpb24oQSl7cmV0dXJuIEEucmVnZXgudGVzdChxLmRldmljZSl9KTt1JiYheCYmKG5bcS5kZXZpY2VdPQohMCl9KTt0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixuKX19LF9nZXRDdXJyZW50RGV2aWNlczpmdW5jdGlvbihtKXt2YXIgbj10aGlzLnN0YXRzO249KG4/bi5kZXZfc3RhdHM6W10pLm1hcCh1PT51LmRldmljZSkuZmlsdGVyKHU9Pmsuc29tZSh4PT54LnJlZ2V4LnRlc3QodSkpKTtjb25zdCBxPWIuZ3JhcGgudXRpbC5yZW1vdmVDb21tb25QcmVmaXgobik7aWYoMT09cS5sZW5ndGgpe2NvbnN0IHU9cVswXS5tYXRjaChoKTt1JiYocVswXT11WzFdKX1yZXR1cm4gbi5tYXAoKHUseCk9PntsZXQgQT1udWxsO3QuZm9yRWFjaCh5PT57eS5yZWdleC50ZXN0KHUpJiYoQT15Lm1zZyl9KTtyZXR1cm57ZGV2aWNlOnUsc3VmZml4OnFbeF0sdXNlZDptW3VdLGlnbm9yZWRNc2c6QX19KX0sX2RldmljZUNoZWNrYm94Q2xpY2tlZDpmdW5jdGlvbihtKXttPW0udGFyZ2V0O2NvbnN0IG49T2JqZWN0LmFzc2lnbih7fSx0aGlzLmRldmljZXNGb3JTdGF0cykscT1tLnZhbHVlO20uY2hlY2tlZD8KbltxXT0hMDpkZWxldGUgbltxXTt0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixuKX0sX251bVRhZ3M6ZnVuY3Rpb24obSxuKXtyZXR1cm4gdGhpcy5fZ2V0VGFncyhtLG4pLmxlbmd0aH0sX2dldFRhZ3M6ZnVuY3Rpb24obSxuKXtyZXR1cm4gbSYmbVtuXT9tW25dLnRhZ3M6W119LF9maXQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImZpdC10YXAiKX0sX2lzR3JhZGllbnRDb2xvcmluZzpmdW5jdGlvbihtLG4pe3JldHVybiBwLmhhcyhuKSYmbnVsbCE9bX0sX2VxdWFsczpmdW5jdGlvbihtLG4pe3JldHVybiBtPT09bn0sX2dldEN1cnJlbnREZXZpY2VQYXJhbXM6ZnVuY3Rpb24obSl7bT1tLmRldmljZS5maWx0ZXIodT0+ay5zb21lKHg9PngucmVnZXgudGVzdCh1LmRldmljZSkpKTtjb25zdCBuPWIuZ3JhcGgudXRpbC5yZW1vdmVDb21tb25QcmVmaXgobS5tYXAodT0+dS5kZXZpY2UpKTtpZigxPT1uLmxlbmd0aCl7dmFyIHE9blswXS5tYXRjaChoKTtxJiYoblswXT1xWzFdKX1yZXR1cm4gbS5tYXAoKHUsCngpPT4oe2RldmljZTpuW3hdLGNvbG9yOnUuY29sb3J9KSl9LF9nZXRDdXJyZW50WGxhQ2x1c3RlclBhcmFtczpmdW5jdGlvbihtKXtyZXR1cm4gbS54bGFfY2x1c3Rlcn0sX2dldEN1cnJlbnRHcmFkaWVudFBhcmFtczpmdW5jdGlvbihtLG4pe2lmKHRoaXMuX2lzR3JhZGllbnRDb2xvcmluZyh0aGlzLnN0YXRzLG4pKXttPW1bbl07dmFyIHE9bS5taW5WYWx1ZSx1PW0ubWF4VmFsdWU7bj09PWwuTUVNT1JZPyhxPWIuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUocSxiLmdyYXBoLnV0aWwuTUVNT1JZX1VOSVRTKSx1PWIuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUodSxiLmdyYXBoLnV0aWwuTUVNT1JZX1VOSVRTKSk6bj09PWwuQ09NUFVURV9USU1FJiYocT1iLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKHEsYi5ncmFwaC51dGlsLlRJTUVfVU5JVFMpLHU9Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZSh1LApiLmdyYXBoLnV0aWwuVElNRV9VTklUUykpO3JldHVybnttaW5WYWx1ZTpxLG1heFZhbHVlOnUsc3RhcnRDb2xvcjptLnN0YXJ0Q29sb3IsZW5kQ29sb3I6bS5lbmRDb2xvcn19fSxkb3dubG9hZDpmdW5jdGlvbigpe3RoaXMuJC5ncmFwaGRvd25sb2FkLmNsaWNrKCl9LF91cGRhdGVGaWxlSW5wdXQ6ZnVuY3Rpb24obSl7dmFyIG49bS50YXJnZXQuZmlsZXNbMF07aWYobil7bj1uLm5hbWU7dmFyIHE9bi5sYXN0SW5kZXhPZigiLiIpOzA8PXEmJihuPW4uc3Vic3RyaW5nKDAscSkpO3E9bi5sYXN0SW5kZXhPZigiLyIpOzA8PXEmJihuPW4uc3Vic3RyaW5nKHErMSkpO3RoaXMuX3NldERvd25sb2FkRmlsZW5hbWUobik7dGhpcy5zZXQoInNlbGVjdGVkRmlsZSIsbSl9fSxfZGF0YXNldHNDaGFuZ2VkOmZ1bmN0aW9uKG0sbil7bnVsbCE9biYmKHRoaXMuX3NlbGVjdGVkUnVuSW5kZXg9MCl9LF9jb21wdXRlU2VsZWN0aW9uOmZ1bmN0aW9uKG0sbixxLHUpe3JldHVybiBtW25dJiZtW25dLnRhZ3NbcV0/CntydW46bVtuXS5uYW1lLHRhZzptW25dLnRhZ3NbcV0udGFnLHR5cGU6dX06bnVsbH0sX3NlbGVjdGVkUnVuSW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKG0pe3RoaXMuZGF0YXNldHMmJih0aGlzLmNvbG9yQnk9bC5TVFJVQ1RVUkUsdGhpcy5fc2VsZWN0ZWRUYWdJbmRleD0wLHRoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCksdGhpcy50cmFjZUlucHV0cz0hMSx0aGlzLl9zZXREb3dubG9hZEZpbGVuYW1lKHRoaXMuZGF0YXNldHNbbV0/dGhpcy5kYXRhc2V0c1ttXS5uYW1lOiIiKSl9LF9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCgpe3RoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl9LF9nZXREZWZhdWx0U2VsZWN0aW9uVHlwZSgpe2NvbnN0IG09dGhpcy5kYXRhc2V0cyxuPXRoaXMuX3NlbGVjdGVkUnVuSW5kZXgscT10aGlzLl9zZWxlY3RlZFRhZ0luZGV4O3JldHVybiBtJiZtW25dJiZtW25dLnRhZ3NbcV0mJgohbVtuXS50YWdzW3FdLm9wR3JhcGg/bVtuXS50YWdzW3FdLnByb2ZpbGU/Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLlBST0ZJTEU6bVtuXS50YWdzW3FdLmNvbmNlcHR1YWxHcmFwaD9iLmdyYXBoLlNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSDpiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEg6Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIfSxfZ2V0RmlsZTpmdW5jdGlvbigpe3RoaXMuJCQoIiNmaWxlIikuY2xpY2soKX0sX3NldERvd25sb2FkRmlsZW5hbWU6ZnVuY3Rpb24obSl7dGhpcy4kLmdyYXBoZG93bmxvYWQuc2V0QXR0cmlidXRlKCJkb3dubG9hZCIsbSsiLnBuZyIpfSxfc3RhdHNOb3ROdWxsOmZ1bmN0aW9uKG0pe3JldHVybiBudWxsIT09bX0sX3RvZ2dsZUxlZ2VuZE9wZW4oKXt0aGlzLnNldCgiX2xlZ2VuZE9wZW5lZCIsIXRoaXMuX2xlZ2VuZE9wZW5lZCl9LF9nZXRUb2dnbGVUZXh0KG0pe3JldHVybiBtPyJDbG9zZSBsZWdlbmQuIjoiRXhwYW5kIGxlZ2VuZC4ifSwKX2dldFRvZ2dsZUxlZ2VuZEljb24obSl7cmV0dXJuIG0/ImV4cGFuZC1tb3JlIjoiZXhwYW5kLWxlc3MifSxfZ2V0U2VsZWN0aW9uT3BHcmFwaERpc2FibGVkKG0sbixxKXtyZXR1cm4hbVtuXXx8IW1bbl0udGFnc1txXXx8IW1bbl0udGFnc1txXS5vcEdyYXBofSxfZ2V0U2VsZWN0aW9uUHJvZmlsZURpc2FibGVkKG0sbixxKXtyZXR1cm4hbVtuXXx8IW1bbl0udGFnc1txXXx8IW1bbl0udGFnc1txXS5wcm9maWxlfSxfZ2V0U2VsZWN0aW9uQ29uY2VwdHVhbEdyYXBoRGlzYWJsZWQobSxuLHEpe3JldHVybiFtW25dfHwhbVtuXS50YWdzW3FdfHwhbVtuXS50YWdzW3FdLmNvbmNlcHR1YWxHcmFwaH19KX0pKGQuY29udHJvbHN8fChkLmNvbnRyb2xzPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWxvYWRlci90Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyLmpzClVpPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbihiLGQsZixoKXtyZXR1cm4gbmV3IChmfHwoZj1Qcm9taXNlKSkoZnVuY3Rpb24oayx0KXtmdW5jdGlvbiBsKG4pe3RyeXttKGgubmV4dChuKSl9Y2F0Y2gocSl7dChxKX19ZnVuY3Rpb24gcChuKXt0cnl7bShoWyJ0aHJvdyJdKG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBtKG4pe24uZG9uZT9rKG4udmFsdWUpOihuZXcgZihmdW5jdGlvbihxKXtxKG4udmFsdWUpfSkpLnRoZW4obCxwKX1tKChoPWguYXBwbHkoYixkfHxbXSkpLm5leHQoKSl9KX07CihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIiLF90ZW1wbGF0ZTpudWxsLHByb3BlcnRpZXM6e2RhdGFzZXRzOkFycmF5LHByb2dyZXNzOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHNlbGVjdGlvbjpPYmplY3Qsc2VsZWN0ZWRGaWxlOk9iamVjdCxjb21wYXRpYmlsaXR5UHJvdmlkZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgYi5ncmFwaC5vcC5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXJ9LGhpZXJhcmNoeVBhcmFtczp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PmIuZ3JhcGguaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXN9LG91dEdyYXBoSGllcmFyY2h5Ont0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LG91dEdyYXBoOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LG91dFN0YXRzOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LApfZ3JhcGhSdW5UYWc6T2JqZWN0fSxvYnNlcnZlcnM6WyJfc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24sIGNvbXBhdGliaWxpdHlQcm92aWRlcikiLCJfc2VsZWN0ZWRGaWxlQ2hhbmdlZChzZWxlY3RlZEZpbGUsIGNvbXBhdGliaWxpdHlQcm92aWRlcikiXSxfc2VsZWN0aW9uQ2hhbmdlZCgpe3RoaXMuZGVib3VuY2UoInNlbGVjdGlvbmNoYW5nZSIsKCk9Pnt0aGlzLl9sb2FkKHRoaXMuc2VsZWN0aW9uKX0pfSxfbG9hZDpmdW5jdGlvbihmKXtjb25zdCBoPWYucnVuLGs9Zi50YWc7Zj1mLnR5cGU7c3dpdGNoKGYpe2Nhc2UgYi5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIOmNhc2UgYi5ncmFwaC5TZWxlY3Rpb25UeXBlLkNPTkNFUFRVQUxfR1JBUEg6dGhpcy5fc2V0T3V0U3RhdHMobnVsbCk7dmFyIHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LnNldCgicnVuIixoKTt0LnNldCgiY29uY2VwdHVhbCIsU3RyaW5nKGY9PT1iLmdyYXBoLlNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSCkpOwprJiZ0LnNldCgidGFnIixrKTtmPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvZ3JhcGgiLHQpO3JldHVybiB0aGlzLl9mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKGYpLnRoZW4oKCk9Pnt0aGlzLl9ncmFwaFJ1blRhZz17cnVuOmgsdGFnOmt9fSk7Y2FzZSBiLmdyYXBoLlNlbGVjdGlvblR5cGUuUFJPRklMRTp7KHt0YWdzOmZ9PXRoaXMuZGF0YXNldHMuZmluZCgoe25hbWU6bX0pPT5tPT09aCkpO2NvbnN0IGw9Zi5maW5kKG09Pm0udGFnPT09aykub3BHcmFwaD9rOm51bGw7Y29uc29sZS5hc3NlcnQoZi5maW5kKG09Pm0udGFnPT09bCksYFJlcXVpcmVkIHRhZyAoJHtsfSkgaXMgbWlzc2luZy5gKTtmPXRoaXMuX2dyYXBoUnVuVGFnJiZ0aGlzLl9ncmFwaFJ1blRhZy5ydW49PT1oJiZ0aGlzLl9ncmFwaFJ1blRhZy50YWc9PT1sP1Byb21pc2UucmVzb2x2ZSgpOnRoaXMuX2xvYWQoe3J1bjpoLHRhZzpsLHR5cGU6Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIfSk7CnQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LnNldCgidGFnIixrKTt0LnNldCgicnVuIixoKTtjb25zdCBwPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvcnVuX21ldGFkYXRhIix0KTtyZXR1cm4gZi50aGVuKCgpPT50aGlzLl9yZWFkQW5kUGFyc2VNZXRhZGF0YShwKSl9ZGVmYXVsdDpyZXR1cm4gUHJvbWlzZS5yZWplY3QoRXJyb3IoYFVua25vd24gc2VsZWN0aW9uIHR5cGU6ICR7Zn1gKSl9fSxfcmVhZEFuZFBhcnNlTWV0YWRhdGE6ZnVuY3Rpb24oZil7dGhpcy5zZXQoInByb2dyZXNzIix7dmFsdWU6MCxtc2c6IiJ9KTtiLmdyYXBoLnBhcnNlci5mZXRjaEFuZFBhcnNlTWV0YWRhdGEoZixiLmdyYXBoLnV0aWwuZ2V0VHJhY2tlcih0aGlzKSkudGhlbihoPT57dGhpcy5fc2V0T3V0U3RhdHMoaCl9KX0sX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGg6ZnVuY3Rpb24oZixoKXtyZXR1cm4gVWkodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3RoaXMuc2V0KCJwcm9ncmVzcyIsCnt2YWx1ZTowLG1zZzoiIn0pO3JldHVybiBiLmdyYXBoLmxvYWRlci5mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKGIuZ3JhcGgudXRpbC5nZXRUcmFja2VyKHRoaXMpLGYsaCx0aGlzLmNvbXBhdGliaWxpdHlQcm92aWRlcix0aGlzLmhpZXJhcmNoeVBhcmFtcykudGhlbigoe2dyYXBoOmssZ3JhcGhIaWVyYXJjaHk6dH0pPT57dGhpcy5fc2V0T3V0R3JhcGgoayk7dGhpcy5fc2V0T3V0R3JhcGhIaWVyYXJjaHkodCl9KX0pfSxfc2VsZWN0ZWRGaWxlQ2hhbmdlZDpmdW5jdGlvbihmKXtpZihmKXtmPWYudGFyZ2V0O3ZhciBoPWYuZmlsZXNbMF07aCYmKGYudmFsdWU9IiIsdGhpcy5fZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChudWxsLGgpKX19fSl9KShkLmxvYWRlcnx8KGQubG9hZGVyPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWRhc2hib2FyZC90Zi1ncmFwaC1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfZGF0YXNldHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfZGF0YXNldHNGZXRjaGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zZWxlY3RlZERhdGFzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9yZW5kZXJIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfcmVuZGVySGllcmFyY2h5Q2hhbmdlZCJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcn0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9kZWJ1Z2dlckRhdGFFbmFibGVkOkJvb2xlYW4sYWxsU3RlcHNNb2RlRW5hYmxlZDpCb29sZWFuLHNwZWNpZmljSGVhbHRoUGlsbFN0ZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGhlYWx0aFBpbGxzVG9nZ2xlZE9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9oZWFsdGhQaWxsc1RvZ2dsZWRPbkNoYW5nZWQifSwKc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9pc0F0dGFjaGVkOkJvb2xlYW4sX2luaXRpYWxpemVkOkJvb2xlYW4sX2FyZUhlYWx0aFBpbGxzTG9hZGluZzpCb29sZWFuLF9kZWJ1Z2dlck51bWVyaWNBbGVydHM6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwfSxfbm9kZU5hbWVzVG9IZWFsdGhQaWxsczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9oZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcixfaGVhbHRoUGlsbFJlcXVlc3RJZDp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ6TnVtYmVyLF9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lckRlbGF5Ont0eXBlOk51bWJlcix2YWx1ZTo1MDAscmVhZE9ubHk6ITB9LHJ1bnM6QXJyYXkscnVuOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsdmFsdWU6cGQuZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoInJ1biIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITF9KSxvYnNlcnZlcjoiX3J1bk9ic2VydmVyIn0sCl9zZWxlY3Rpb246e3R5cGU6T2JqZWN0fSxfY29tcGF0aWJpbGl0eVByb3ZpZGVyOk9iamVjdCxfdHJhY2VJbnB1dHM6Qm9vbGVhbn0sbGlzdGVuZXJzOnsibm9kZS10b2dnbGUtZXhwYW5kIjoiX2hhbmRsZU5vZGVUb2dnbGVFeHBhbmQifSxvYnNlcnZlcnM6WyJfbWF5YmVGZXRjaEhlYWx0aFBpbGxzKF9kZWJ1Z2dlckRhdGFFbmFibGVkLCBhbGxTdGVwc01vZGVFbmFibGVkLCBzcGVjaWZpY0hlYWx0aFBpbGxTdGVwLCBfc2VsZWN0ZWROb2RlKSIsIl9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQoX2lzQXR0YWNoZWQpIiwiX2RldGVybWluZVNlbGVjdGVkRGF0YXNldChfZGF0YXNldHNGZXRjaGVkLCBfZGF0YXNldHMsIHJ1bikiLCJfdXBkYXRlU2VsZWN0ZWREYXRhc2V0TmFtZShfZGF0YXNldHNGZXRjaGVkLCBfZGF0YXNldHMsIF9zZWxlY3RlZERhdGFzZXQpIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX2lzQXR0YWNoZWQiLCEwKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX2lzQXR0YWNoZWQiLAohMSl9LHJlbG9hZDpmdW5jdGlvbigpe3RoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWR8fHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodmMuZ2V0Um91dGVyKCkucGx1Z2luc0xpc3RpbmcoKSkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoYj0+e2IuY2FuY2VsbGVkfHxiLnZhbHVlWyJkZWJ1Z2dlciJdJiZ0aGlzLnNldCgiX2RlYnVnZ2VyRGF0YUVuYWJsZWQiLCEwKX0pKTt0aGlzLl9tYXliZUZldGNoSGVhbHRoUGlsbHMoKX0sX2ZpdDpmdW5jdGlvbigpe3RoaXMuJCQoIiNncmFwaGJvYXJkIikuZml0KCl9LF9ydW5PYnNlcnZlcjpwZC5nZXRTdHJpbmdPYnNlcnZlcigicnVuIix7ZGVmYXVsdFZhbHVlOiIiLHBvbHltZXJQcm9wZXJ0eToicnVuIix1c2VMb2NhbFN0b3JhZ2U6ITF9KSxfZmV0Y2hEYXRhc2V0KCl7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9pbmZvIikpfSxfZmV0Y2hIZWFsdGhQaWxscyhiLApkKXtiPXtub2RlX25hbWVzOkpTT04uc3RyaW5naWZ5KGIpLHJ1bjoiX19kZWJ1Z2dlcl9kYXRhX18ifTt2b2lkIDAhPT1kJiYoYi5zdGVwPWQpO2Q9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2hlYWx0aF9waWxscyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGQsYil9LF9mZXRjaERlYnVnZ2VyTnVtZXJpY3NBbGVydHMoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvbnVtZXJpY3NfYWxlcnRfcmVwb3J0IikpfSxfZ3JhcGhVcmwoYixkLGYpe3JldHVybiB2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2dyYXBoIixuZXcgVVJMU2VhcmNoUGFyYW1zKHtydW46YixsaW1pdF9hdHRyX3NpemU6ZCxsYXJnZV9hdHRyc19rZXk6Zn0pKX0sX3Nob3VsZFJlcXVlc3RIZWFsdGhQaWxsczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWJ1Z2dlckRhdGFFbmFibGVkJiYKdGhpcy5oZWFsdGhQaWxsc1RvZ2dsZWRPbiYmdGhpcy5fcmVuZGVySGllcmFyY2h5JiZ0aGlzLl9kYXRhc2V0c1N0YXRlKHRoaXMuX2RhdGFzZXRzRmV0Y2hlZCx0aGlzLl9kYXRhc2V0cywiUFJFU0VOVCIpfSxfbWF5YmVJbml0aWFsaXplRGFzaGJvYXJkOmZ1bmN0aW9uKGIpeyF0aGlzLl9pbml0aWFsaXplZCYmYiYmKHRoaXMuc2V0KCJfY29tcGF0aWJpbGl0eVByb3ZpZGVyIixuZXcgdGYuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyKSx0aGlzLl9pbml0aWFsaXplZD0hMCx0aGlzLl9mZXRjaERhdGFzZXQoKS50aGVuKGQ9Pnt0aGlzLl9kYXRhc2V0cz1PYmplY3Qua2V5cyhkKS5zb3J0KHJjLmNvbXBhcmVUYWdOYW1lcykubWFwKGY9Pntjb25zdCBoPWRbZl07dmFyIGs9T2JqZWN0LmtleXMoaC50YWdzKS5zb3J0KHJjLmNvbXBhcmVUYWdOYW1lcykubWFwKHQ9PmgudGFnc1t0XSkubWFwKCh7dGFnOnQsY29uY2VwdHVhbF9ncmFwaDpsLG9wX2dyYXBoOnAscHJvZmlsZTptfSk9Pgooe3RhZzp0LGRpc3BsYXlOYW1lOnQsY29uY2VwdHVhbEdyYXBoOmwsb3BHcmFwaDpwLHByb2ZpbGU6bX0pKTtrPWgucnVuX2dyYXBoP1t7dGFnOm51bGwsZGlzcGxheU5hbWU6IkRlZmF1bHQiLGNvbmNlcHR1YWxHcmFwaDohMSxvcEdyYXBoOiEwLHByb2ZpbGU6ITF9LC4uLmtdOms7cmV0dXJue25hbWU6Zix0YWdzOmt9fSk7dGhpcy5fZGF0YXNldHNGZXRjaGVkPSEwfSkpfSxfZGV0ZXJtaW5lU2VsZWN0ZWREYXRhc2V0KGIsZCxmKXtmPyhkPWQuZmluZEluZGV4KGg9PmgubmFtZT09PWYpLC0xPT09ZD9iJiYoYj10aGlzLiQkKCIjZXJyb3ItZGlhbG9nIiksYi50ZXh0Q29udGVudD1gTm8gZGF0YXNldCBuYW1lZCAiJHtmfSIgY291bGQgYmUgZm91bmQuYCxiLm9wZW4oKSk6dGhpcy5zZXQoIl9zZWxlY3RlZERhdGFzZXQiLGQpKTp0aGlzLnNldCgiX3NlbGVjdGVkRGF0YXNldCIsMCl9LF91cGRhdGVTZWxlY3RlZERhdGFzZXROYW1lKGIsZCxmKXtiJiYoZC5sZW5ndGg8PWZ8fHRoaXMuc2V0KCJydW4iLApkW2ZdLm5hbWUpKX0sX3JlcXVlc3RIZWFsdGhQaWxsczpmdW5jdGlvbigpe3RoaXMuc2V0KCJfYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiwhMCk7dmFyIGI9Kyt0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkO251bGwhPT10aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkKSx0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkPW51bGwpO3RoaXMuYWxsU3RlcHNNb2RlRW5hYmxlZD90aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkPW51bGw7dGhpcy5faW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzKGIpfS5iaW5kKHRoaXMpLHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVyRGVsYXkpOnRoaXMuX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxscyhiKX0sCl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHM6ZnVuY3Rpb24oYil7aWYodGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZD09PWIpe3ZhciBkPXRoaXMuX2ZldGNoSGVhbHRoUGlsbHModGhpcy5fcmVuZGVySGllcmFyY2h5LmdldE5hbWVzT2ZSZW5kZXJlZE9wcygpLHRoaXMuYWxsU3RlcHNNb2RlRW5hYmxlZD90aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXA6dm9pZCAwKSxmPXRoaXMuX2ZldGNoRGVidWdnZXJOdW1lcmljc0FsZXJ0cygpO1Byb21pc2UuYWxsKFtkLGZdKS50aGVuKGZ1bmN0aW9uKGgpe3ZhciBrPWhbMF07aD1oWzFdO2lmKHRoaXMuaGVhbHRoUGlsbHNUb2dnbGVkT24mJmI9PT10aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkKXtmb3IodmFyIHQgaW4gayl7dGhpcy5zZXQoIl9oZWFsdGhQaWxsU3RlcEluZGV4IixrW3RdLmxlbmd0aC0xKTticmVha310aGlzLnNldCgiX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyIsaCk7dGhpcy5zZXQoIl9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiwKayk7dGhpcy5zZXQoIl9hcmVIZWFsdGhQaWxsc0xvYWRpbmciLCExKTt0aGlzLnNldCgiX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQiLG51bGwpfX0uYmluZCh0aGlzKSl9fSxfZGF0YXNldHNTdGF0ZTpmdW5jdGlvbihiLGQsZil7cmV0dXJuIGI/ZCYmZC5sZW5ndGg/IlBSRVNFTlQiPT09ZjoiRU1QVFkiPT09ZjoiTk9UX0xPQURFRCI9PT1mfSxfcmVuZGVySGllcmFyY2h5Q2hhbmdlZDpmdW5jdGlvbigpe3RoaXMucmVsb2FkKCl9LF9oYW5kbGVOb2RlVG9nZ2xlRXhwYW5kOmZ1bmN0aW9uKCl7dGhpcy5fbWF5YmVGZXRjaEhlYWx0aFBpbGxzKCl9LF9oZWFsdGhQaWxsc1RvZ2dsZWRPbkNoYW5nZWQ6ZnVuY3Rpb24oYil7Yj90aGlzLnJlbG9hZCgpOnRoaXMuc2V0KCJfbm9kZU5hbWVzVG9IZWFsdGhQaWxscyIse30pfSxfbWF5YmVGZXRjaEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7dGhpcy5fc2hvdWxkUmVxdWVzdEhlYWx0aFBpbGxzKCkmJnRoaXMuX3JlcXVlc3RIZWFsdGhQaWxscygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWRpc3RyaWJ1dGlvbi1jaGFydC92ei1kaXN0cmlidXRpb24tY2hhcnQuanMKdmFyIEprOwooZnVuY3Rpb24oYil7Y2xhc3MgZHtjb25zdHJ1Y3RvcihmLGgpe3RoaXMucnVuMmRhdGFzZXRzPXt9O3RoaXMuY29sb3JTY2FsZT1oO3RoaXMuYnVpbGRDaGFydChmKX1nZXREYXRhc2V0KGYpe3ZvaWQgMD09PXRoaXMucnVuMmRhdGFzZXRzW2ZdJiYodGhpcy5ydW4yZGF0YXNldHNbZl09bmV3IFBsb3R0YWJsZS5EYXRhc2V0KFtdLHtydW46Zn0pKTtyZXR1cm4gdGhpcy5ydW4yZGF0YXNldHNbZl19YnVpbGRDaGFydChmKXt0aGlzLm91dGVyJiZ0aGlzLm91dGVyLmRlc3Ryb3koKTtmPXJnLmdldFhDb21wb25lbnRzKGYpO3RoaXMueEFjY2Vzc29yPWYuYWNjZXNzb3I7dGhpcy54U2NhbGU9Zi5zY2FsZTt0aGlzLnhBeGlzPWYuYXhpczt0aGlzLnhBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDMpO3RoaXMueVNjYWxlPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjt0aGlzLnlBeGlzPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKHRoaXMueVNjYWxlLCJsZWZ0Iik7Zj0KcmcubXVsdGlzY2FsZUZvcm1hdHRlcihyZy5ZX0FYSVNfRk9STUFUVEVSX1BSRUNJU0lPTik7dGhpcy55QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZyg1KS5mb3JtYXR0ZXIoZik7dGhpcy55QXhpcy51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbigpO2Y9dGhpcy5idWlsZFBsb3QodGhpcy54QWNjZXNzb3IsdGhpcy54U2NhbGUsdGhpcy55U2NhbGUpO3RoaXMuZ3JpZGxpbmVzPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HcmlkbGluZXModGhpcy54U2NhbGUsdGhpcy55U2NhbGUpO3RoaXMuY2VudGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChbdGhpcy5ncmlkbGluZXMsZl0pO3RoaXMub3V0ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLlRhYmxlKFtbdGhpcy55QXhpcyx0aGlzLmNlbnRlcl0sW251bGwsdGhpcy54QXhpc11dKX1idWlsZFBsb3QoZixoLGspe2xldCB0PVswLDIyOCwxNTg3LDMwODUsNUUzLDY5MTUsODQxMyw5NzcyLDFFNF0sbD1fLnJhbmdlKHQubGVuZ3RoLQoxKS5tYXAodT0+KHRbdSsxXS10W3VdKS8yNTAwKSxwPXQubWFwKCh1LHgpPT5BPT5BW3hdWzFdKSxtPXBbNF0sbj1fLnJhbmdlKHAubGVuZ3RoLTEpLm1hcCh1PT57bGV0IHg9bmV3IFBsb3R0YWJsZS5QbG90cy5BcmVhO3gueChmLGgpO2xldCBBPTQ8dT9wW3VdOnBbdSsxXTt4LnkoNDx1P3BbdSsxXTpwW3VdLGspO3gueTAoQSk7eC5hdHRyKCJmaWxsIiwoeSx3LEMpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoQy5tZXRhZGF0YSgpLnJ1bikpO3guYXR0cigic3Ryb2tlIiwoeSx3LEMpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoQy5tZXRhZGF0YSgpLnJ1bikpO3guYXR0cigic3Ryb2tlLXdlaWdodCIsKCk9PiIwLjVweCIpO3guYXR0cigic3Ryb2tlLW9wYWNpdHkiLCgpPT5sW3VdKTt4LmF0dHIoImZpbGwtb3BhY2l0eSIsKCk9PmxbdV0pO3JldHVybiB4fSkscT1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7cS54KGYsaCk7cS55KG0sayk7cS5hdHRyKCJzdHJva2UiLCh1LHgsQSk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShBLnJ1bikpOwp0aGlzLnBsb3RzPW47cmV0dXJuIG5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChuKX1zZXRWaXNpYmxlU2VyaWVzKGYpe3RoaXMucnVucz1mO2xldCBoPWYubWFwKGs9PnRoaXMuZ2V0RGF0YXNldChrKSk7dGhpcy5wbG90cy5mb3JFYWNoKGs9PmsuZGF0YXNldHMoaCkpfXNldFNlcmllc0RhdGEoZixoKXt0aGlzLmdldERhdGFzZXQoZikuZGF0YShoKX1yZW5kZXJUbyhmKXt0aGlzLnRhcmdldFNWRz1mO3RoaXMub3V0ZXIucmVuZGVyVG8oZil9cmVkcmF3KCl7dGhpcy5vdXRlci5yZWRyYXcoKX1kZXN0cm95KCl7dGhpcy5vdXRlci5kZXN0cm95KCl9fWIuRGlzdHJpYnV0aW9uQ2hhcnQ9ZDtQb2x5bWVyKHtpczoidnotZGlzdHJpYnV0aW9uLWNoYXJ0Iixwcm9wZXJ0aWVzOntjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybihuZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcikucmFuZ2UoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSx4VHlwZTp7dHlwZTpTdHJpbmcsCnZhbHVlOiJzdGVwIn0sX2F0dGFjaGVkOkJvb2xlYW4sX2NoYXJ0Ok9iamVjdCxfdmlzaWJsZVNlcmllc0NhY2hlOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfc2VyaWVzRGF0YUNhY2hlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZDp7dHlwZTpOdW1iZXIsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9tYWtlQ2hhcnQoeFR5cGUsIGNvbG9yU2NhbGUsIF9hdHRhY2hlZCkiLCJfcmVsb2FkRnJvbUNhY2hlKF9jaGFydCkiXSxzZXRWaXNpYmxlU2VyaWVzOmZ1bmN0aW9uKGYpe3RoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT1mO3RoaXMuX2NoYXJ0JiYodGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyhmKSx0aGlzLnJlZHJhdygpKX0sc2V0U2VyaWVzRGF0YTpmdW5jdGlvbihmLGgpe3RoaXMuX3Nlcmllc0RhdGFDYWNoZVtmXT1oO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKGYsCmgpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydC5yZWRyYXcoKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuY2hhcnRkaXYsITApfSxfbWFrZUNoYXJ0OmZ1bmN0aW9uKGYsaCxrKXtudWxsPT09dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkJiZ0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCk7dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbDtpZihrKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3ZhciB0PW5ldyBkKGYsaCksbD1kMy5zZWxlY3QodGhpcy4kLmNoYXJ0ZGl2KTt0LnJlbmRlclRvKGwpO3RoaXMuX2NoYXJ0PXR9fSwzNTApfSxfcmVsb2FkRnJvbUNhY2hlOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSksCnRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5mb3JFYWNoKGZ1bmN0aW9uKGYpe3RoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoZix0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbZl18fFtdKX0uYmluZCh0aGlzKSkpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2F0dGFjaGVkPSEwfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2F0dGFjaGVkPSExfX0pfSkoSmt8fChKaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQvdGYtZGlzdHJpYnV0aW9uLWxvYWRlci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kaXN0cmlidXRpb24tbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsdGFnTWV0YWRhdGE6T2JqZWN0LHhUeXBlOlN0cmluZyxkYXRhVG9Mb2FkOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZURhdGFUb0xvYWQocnVuLCB0YWcpIn0sZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3J1bjpifSk9PmJ9LGdldERhdGFMb2FkVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3RhZzpiLHJ1bjpkfSk9PnZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGlzdHJpYnV0aW9ucyIsIi9kaXN0cmlidXRpb25zIikse3RhZzpiLHJ1bjpkfSl9LGxvYWREYXRhQ2FsbGJhY2s6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57Yj1mLm1hcChoPT57Y29uc3QgW2ssdCxsXT1oO2wud2FsbF90aW1lPW5ldyBEYXRlKDFFMyprKTtsLnN0ZXA9dDtyZXR1cm4gbH0pOwpkPXRoaXMuZ2V0RGF0YUxvYWROYW1lKGQpO3RoaXMuJC5jaGFydC5zZXRTZXJpZXNEYXRhKGQsYik7dGhpcy4kLmNoYXJ0LnNldFZpc2libGVTZXJpZXMoW2RdKX19fSxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NhbGU6cGYucnVuc0NvbG9yU2NhbGV9KSxyZWFkT25seTohMH0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIl0sYmVoYXZpb3JzOltxZC5EYXRhTG9hZGVyQmVoYXZpb3JdLF9jb21wdXRlRGF0YVRvTG9hZChiLGQpe3JldHVyblt7cnVuOmIsdGFnOmR9XX0sX2NvbXB1dGVSdW5Db2xvcihiKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZS5zY2FsZShiKX0sCnJlZHJhdygpe3RoaXMuJC5jaGFydC5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQvdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfeFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWc6T2JqZWN0LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOlN0cmluZyxfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWcsIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkRGlzdHJpYnV0aW9ucygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkaXN0cmlidXRpb25zIiwKIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57aWYoIV8uaXNFcXVhbChkLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBmPV8ubWFwVmFsdWVzKGQsaz0+T2JqZWN0LmtleXMoaykpLGg9dmMuZ2V0VGFncyhmKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWgubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnIixmKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZERpc3RyaWJ1dGlvbnMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtZGlzdHJpYnV0aW9uLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9tYWtlQ2F0ZWdvcmllcyhiLGQsZil7cmV0dXJuICRjLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnMoYixkLGYpfSxfdGFnTWV0YWRhdGEoYiwKZCxmKXtyZXR1cm4gYltkXVtmXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1oaXN0b2dyYW0tdGltZXNlcmllcy92ei1oaXN0b2dyYW0tdGltZXNlcmllcy5odG1sLmpzClBvbHltZXIoe2lzOiJ2ei1oaXN0b2dyYW0tdGltZXNlcmllcyIscHJvcGVydGllczp7bW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZnNldCJ9LHRpbWVQcm9wZXJ0eTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxiaW5zOnt0eXBlOlN0cmluZyx2YWx1ZToiYmlucyJ9LHg6e3R5cGU6U3RyaW5nLHZhbHVlOiJ4In0sZHg6e3R5cGU6U3RyaW5nLHZhbHVlOiJkeCJ9LHk6e3R5cGU6U3RyaW5nLHZhbHVlOiJ5In0sY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZDMuc2NhbGVPcmRpbmFsKGQzLnNjaGVtZUNhdGVnb3J5MTApfX0sbW9kZVRyYW5zaXRpb25EdXJhdGlvbjp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwfSxfYXR0YWNoZWQ6Qm9vbGVhbixfbmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2RhdGE6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH19LG9ic2VydmVyczpbInJlZHJhdyh0aW1lUHJvcGVydHksIF9hdHRhY2hlZCkiLCJfbW9kZVJlZHJhdyhtb2RlKSJdLApyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5zdmcsITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2F0dGFjaGVkPSEwfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2F0dGFjaGVkPSExfSxzZXRTZXJpZXNEYXRhOmZ1bmN0aW9uKGIsZCl7dGhpcy5fbmFtZT1iO3RoaXMuX2RhdGE9ZDt0aGlzLnJlZHJhdygpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9kcmF3KDApfSxfbW9kZVJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2RyYXcodGhpcy5tb2RlVHJhbnNpdGlvbkR1cmF0aW9uKX0sX2RyYXc6ZnVuY3Rpb24oYil7aWYodGhpcy5fYXR0YWNoZWQmJnRoaXMuX2RhdGEpe2lmKHZvaWQgMD09PWIpdGhyb3cgRXJyb3IoInZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIF9kcmF3IG5lZWRzIGR1cmF0aW9uIik7aWYoMD49dGhpcy5fZGF0YS5sZW5ndGgpdGhyb3cgRXJyb3IoIk5vdCBlbm91Z2ggc3RlcHMgaW4gdGhlIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLmJpbnMpKXRocm93IEVycm9yKCJObyBiaW5zIHByb3BlcnR5IG9mICciKwp0aGlzLmJpbnMrIicgaW4gZGF0YSIpO2lmKDA+PXRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXS5sZW5ndGgpdGhyb3cgRXJyb3IoIk11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYmluIGluIGJpbnMgaW4gZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy54KSl0aHJvdyBFcnJvcigiTm8geCBwcm9wZXJ0eSAnIit0aGlzLngrIicgb24gYmlucyBkYXRhIik7aWYoIXRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLmR4KSl0aHJvdyBFcnJvcigiTm8gZHggcHJvcGVydHkgJyIrdGhpcy5keCsiJyBvbiBiaW5zIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMueSkpdGhyb3cgRXJyb3IoIk5vIHkgcHJvcGVydHkgJyIrdGhpcy55KyInIG9uIGJpbnMgZGF0YSIpO3ZhciBkPXRoaXMudGltZVByb3BlcnR5LGY9dGhpcy54LGg9dGhpcy5iaW5zLGs9dGhpcy5keCwKdD10aGlzLnksbD10aGlzLl9kYXRhLHA9dGhpcy5tb2RlLG09ZDMuaGNsKHRoaXMuY29sb3JTY2FsZSh0aGlzLl9uYW1lKSksbj1kMy5zZWxlY3QodGhpcy4kLnRvb2x0aXApLHE9ZnVuY3Rpb24oeWEpe3JldHVybiB5YVtmXX0sdT1mdW5jdGlvbih5YSl7cmV0dXJuIHlhW3RdfSx4PWZ1bmN0aW9uKHlhKXtyZXR1cm4geWFbZl0reWFba119LEE9ZnVuY3Rpb24oeWEpe3JldHVybiB5YVtkXX07InJlbGF0aXZlIj09PWQmJihBPWZ1bmN0aW9uKHlhKXtyZXR1cm4geWEud2FsbF90aW1lLWxbMF0ud2FsbF90aW1lfSk7dmFyIHk9dGhpcy4kLnN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx3PXkud2lkdGgsQz15LmhlaWdodCxGPTU7aWYoIm9mZnNldCI9PT1wKXt2YXIgRD1DLzIuNTtGPUQrNX1lbHNlIEQ9Qy1GLTIwO3ZhciBCPXctMjQtNjAsST1DLUYtMjA7ZDMubWluKGwscSk7ZDMubWF4KGwseCk7dmFyIE49ZDMuZm9ybWF0KCIuM24iKTt5PWQzLmZvcm1hdCgiLjBmIik7IndhbGxfdGltZSI9PT0KZD95PWQzLnRpbWVGb3JtYXQoIiVtLyVkICVYIik6InJlbGF0aXZlIj09PWQmJih5PWZ1bmN0aW9uKHlhKXtyZXR1cm4gZDMuZm9ybWF0KCIuMXIiKSh5YS8zNkU1KSsiaCJ9KTt2YXIgTz1sLm1hcChmdW5jdGlvbih5YSl7cmV0dXJuW2QzLm1pbih5YVtoXSxxKSxkMy5tYXgoeWFbaF0seCldfSksSD1sLm1hcChmdW5jdGlvbih5YSl7cmV0dXJuIGQzLmV4dGVudCh5YVtoXSx1KX0pLEs9ZDMuZXh0ZW50KGwsQSksTT0oIndhbGxfdGltZSI9PT1kP2QzLnNjYWxlVGltZSgpOmQzLnNjYWxlTGluZWFyKCkpLmRvbWFpbihLKS5yYW5nZShbMCwib2Zmc2V0Ij09PXA/STowXSksTD1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCxkMy5tYXgobCxmdW5jdGlvbih5YSxTYSl7cmV0dXJuIEhbU2FdWzFdfSldKS5yYW5nZShbRCwwXSksUT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihMLmRvbWFpbigpKS5yYW5nZShbNTAwLDBdKSxUPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFtkMy5taW4obCxmdW5jdGlvbih5YSwKU2Epe3JldHVybiBPW1NhXVswXX0pLGQzLm1heChsLGZ1bmN0aW9uKHlhLFNhKXtyZXR1cm4gT1tTYV1bMV19KV0pLm5pY2UoKS5yYW5nZShbMCxCXSksWD1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihULmRvbWFpbigpKS5yYW5nZShbMCw1MDBdKSxhYT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihkMy5leHRlbnQobCxBKSkucmFuZ2UoW20uZGFya2VyKCksbS5icmlnaHRlcigpXSkuaW50ZXJwb2xhdGUoZDMuaW50ZXJwb2xhdGVIY2wpO209ZDMuYXhpc0JvdHRvbShUKS50aWNrcygpO3ZhciBsYT1kMy5heGlzUmlnaHQoTSkudGlja3MoKS50aWNrRm9ybWF0KHkpLFo9ZDMuYXhpc1JpZ2h0KEwpLnRpY2tzKCkudGlja1NpemUoQis1KS50aWNrRm9ybWF0KE4pLGJhPWZ1bmN0aW9uKHlhKXtyZXR1cm4geWFbZl0reWFba10vMn0sZWE9ZDMubGluZSgpLngoZnVuY3Rpb24oeWEpe3JldHVybiBYKGJhKHlhKSl9KS55KGZ1bmN0aW9uKHlhKXtyZXR1cm4gUSh5YVt0XSl9KSxjYT1mdW5jdGlvbih5YSl7cmV0dXJuIk0iKwpYKGJhKHlhWzBdKSkrIiwiK1EoMCkrIkwiK2VhKHlhKS5zbGljZSgxKSsiTCIrWChiYSh5YVt5YS5sZW5ndGgtMV0pKSsiLCIrUSgwKX0sa2E9dGhpcy4kLnN2Zzt5PWQzLnNlbGVjdChrYSk7Yj15LnRyYW5zaXRpb24oKS5kdXJhdGlvbihiKTt5PXkuc2VsZWN0KCJnIikuY2xhc3NlZCgic21hbGwiLGZ1bmN0aW9uKCl7cmV0dXJuIDA8QiYmMTUwPj1CfSkuY2xhc3NlZCgibWVkaXVtIixmdW5jdGlvbigpe3JldHVybiAxNTA8QiYmMzAwPj1CfSkuY2xhc3NlZCgibGFyZ2UiLGZ1bmN0aW9uKCl7cmV0dXJuIDMwMDxCfSk7Yj1iLnNlbGVjdCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgyNCwiK0YrIikiKTt2YXIgWT1kMy5iaXNlY3Rvcih4KS5sZWZ0O0s9eS5zZWxlY3QoIi5zdGFnZSIpLm9uKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmEuc3R5bGUoIm9wYWNpdHkiLDEpO3hhLnN0eWxlKCJvcGFjaXR5IiwxKTtBYS5zdHlsZSgib3BhY2l0eSIsMSk7RmEuc3R5bGUoIm9wYWNpdHkiLAoxKTtuLnN0eWxlKCJvcGFjaXR5IiwxKX0pLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YS5zdHlsZSgib3BhY2l0eSIsMCk7eGEuc3R5bGUoIm9wYWNpdHkiLDApO0FhLnN0eWxlKCJvcGFjaXR5IiwwKTtGYS5zdHlsZSgib3BhY2l0eSIsMCk7dmEuY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsITEpO0VhLmNsYXNzZWQoIm91dGxpbmUtaG92ZXIiLCExKTtuLnN0eWxlKCJvcGFjaXR5IiwwKX0pLm9uKCJtb3VzZW1vdmUiLGZ1bmN0aW9uKCl7ZnVuY3Rpb24geWEoQWIpe3JldHVybiBNYXRoLm1pbihBYltoXS5sZW5ndGgtMSxZKEFiW2hdLFhhKSl9dmFyIFNhPWQzLm1vdXNlKHRoaXMpLFhhPVQuaW52ZXJ0KFNhWzBdKTtNLmludmVydChTYVsxXSk7dmFyIHViLEJiPUluZmluaXR5LHFiO3ZhLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oQWIpe3ZhciBIYj15YShBYik7cWI9QWI7dmFyIGljPVQoQWJbaF1bSGJdW2ZdK0FiW2hdW0hiXVtrXS8yKTtIYj1MKEFiW2hdW0hiXVt0XSk7dmFyIGJjPQoib2Zmc2V0Ij09PXA/TShBKEFiKSktKEQtSGIpOkhiO2JjPU1hdGguYWJzKFNhWzFdLWJjKTtiYzxCYiYmKEJiPWJjLHViPUFiKTtyZXR1cm4idHJhbnNsYXRlKCIraWMrIiwiK0hiKyIpIn0pO3ZhLnNlbGVjdCgidGV4dCIpLnRleHQoZnVuY3Rpb24oQWIpe3ZhciBIYj15YShBYik7cmV0dXJuIEFiW2hdW0hiXVt0XX0pO3ZhLmNsYXNzZWQoImhvdmVyLWNsb3Nlc3QiLGZ1bmN0aW9uKEFiKXtyZXR1cm4gQWI9PT11Yn0pO0VhLmNsYXNzZWQoIm91dGxpbmUtaG92ZXIiLGZ1bmN0aW9uKEFiKXtyZXR1cm4gQWI9PT11Yn0pO3ZhciB6Yj15YShxYik7eGEuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIitUKHFiW2hdW3piXVtmXStxYltoXVt6Yl1ba10vMikrIiwgIitJKyIpIn0pLnNlbGVjdCgidGV4dCIpLnRleHQoZnVuY3Rpb24oKXtyZXR1cm4gTihxYltoXVt6Yl1bZl0rcWJbaF1bemJdW2tdLzIpfSk7dmFyIHZiPWxhLnRpY2tGb3JtYXQoKTtBYS5hdHRyKCJ0cmFuc2Zvcm0iLApmdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIitCKyIsICIrKCJvZmZzZXQiPT09cD9NKEEodWIpKTowKSsiKSJ9KS5zdHlsZSgiZGlzcGxheSIsIm9mZnNldCI9PT1wPyIiOiJub25lIikuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiB2YihBKHViKSl9KTt2YXIgR2I9Wi50aWNrRm9ybWF0KCk7RmEuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIitCKyIsICIrKCJvZmZzZXQiPT09cD8wOkwodWJbaF1bemJdW3RdKSkrIikifSkuc3R5bGUoImRpc3BsYXkiLCJvZmZzZXQiPT09cD8ibm9uZSI6IiIpLnNlbGVjdCgidGV4dCIpLnRleHQoZnVuY3Rpb24oKXtyZXR1cm4gR2IodWJbaF1bemJdW3RdKX0pO3ZhciBOYj1kMy5tb3VzZShrYSk7bi5zdHlsZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrKE5iWzBdKzE1KSsicHgsIisoTmJbMV0tMTUpKyJweCkiKS5zZWxlY3QoInNwYW4iKS50ZXh0KCJvZmZzZXQiPT09cD9HYih1YltoXVt6Yl1bdF0pOgooInN0ZXAiPT09ZD8ic3RlcCAiOiIiKSt2YihBKHViKSkpfSk7Sy5zZWxlY3QoIi5iYWNrZ3JvdW5kIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKC0yNCwiKy1GKyIpIikuYXR0cigid2lkdGgiLHcpLmF0dHIoImhlaWdodCIsQyk7Qz1LLnNlbGVjdEFsbCgiLmhpc3RvZ3JhbSIpLmRhdGEobCk7Qy5leGl0KCkucmVtb3ZlKCk7dz1DLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJoaXN0b2dyYW0iKTtDPXcubWVyZ2UoQykuc29ydChmdW5jdGlvbih5YSxTYSl7cmV0dXJuIEEoeWEpLUEoU2EpfSk7Rj1iLnNlbGVjdEFsbCgiLmhpc3RvZ3JhbSIpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oeWEpe3JldHVybiJ0cmFuc2xhdGUoMCwgIisoIm9mZnNldCI9PT1wP00oQSh5YSkpLUQ6MCkrIikifSk7dy5hcHBlbmQoImxpbmUiKS5hdHRyKCJjbGFzcyIsImJhc2VsaW5lIik7Ri5zZWxlY3QoIi5iYXNlbGluZSIpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsZnVuY3Rpb24oKXtyZXR1cm4ib2Zmc2V0Ij09PQpwPy4xOjB9KS5hdHRyKCJ5MSIsRCkuYXR0cigieTIiLEQpLmF0dHIoIngyIixCKTt3LmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwib3V0bGluZSIpO3ZhciBFYT1DLnNlbGVjdCgiLm91dGxpbmUiKS5hdHRyKCJ2ZWN0b3ItZWZmZWN0Iiwibm9uLXNjYWxpbmctc3Ryb2tlIikuYXR0cigiZCIsZnVuY3Rpb24oeWEpe3JldHVybiBjYSh5YVtoXSl9KS5zdHlsZSgic3Ryb2tlLXdpZHRoIiwxKTtGLnNlbGVjdCgiLm91dGxpbmUiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJzY2FsZSgiK0IvNTAwKyIsICIrRC81MDArIikiKS5zdHlsZSgic3Ryb2tlIixmdW5jdGlvbih5YSl7cmV0dXJuIm9mZnNldCI9PT1wPyJ3aGl0ZSI6YWEoQSh5YSkpfSkuc3R5bGUoImZpbGwtb3BhY2l0eSIsZnVuY3Rpb24oKXtyZXR1cm4ib2Zmc2V0Ij09PXA/MTowfSkuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKHlhKXtyZXR1cm4gYWEoQSh5YSkpfSk7dz13LmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwiaG92ZXIiKS5zdHlsZSgiZmlsbCIsCmZ1bmN0aW9uKHlhKXtyZXR1cm4gYWEoQSh5YSkpfSk7dmFyIHZhPUMuc2VsZWN0KCIuaG92ZXIiKTt3LmFwcGVuZCgiY2lyY2xlIikuYXR0cigiciIsMik7dy5hcHBlbmQoInRleHQiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJkeCIsNCk7dz15LnNlbGVjdCgiLngtYXhpcy1ob3ZlciIpLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YShbIngiXSk7Qz13LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciB4YT13Lm1lcmdlKEMpO0MuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTIwKS5hdHRyKCJ5Iiw2KS5hdHRyKCJ3aWR0aCIsNDApLmF0dHIoImhlaWdodCIsMTQpO0MuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoIngyIiwwKS5hdHRyKCJ5MSIsMCkuYXR0cigieTIiLDYpO0MuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHkiLDE4KTt3PXkuc2VsZWN0KCIueS1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieSJdKTsKQz13LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciBBYT13Lm1lcmdlKEMpO0MuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7Qy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDYpLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsMCk7Qy5hcHBlbmQoInRleHQiKS5hdHRyKCJkeCIsOCkuYXR0cigiZHkiLDQpO3k9eS5zZWxlY3QoIi55LXNsaWNlLWF4aXMtaG92ZXIiKS5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEoWyJ5Il0pO3c9eS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibGFiZWwiKTt2YXIgRmE9eS5tZXJnZSh3KTt3LmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLDgpLmF0dHIoInkiLC02KS5hdHRyKCJ3aWR0aCIsNDApLmF0dHIoImhlaWdodCIsMTQpO3cuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoIngyIiw2KS5hdHRyKCJ5MSIsCjApLmF0dHIoInkyIiwwKTt3LmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCk7Yi5zZWxlY3QoIi55LmF4aXMuc2xpY2UiKS5zdHlsZSgib3BhY2l0eSIsIm9mZnNldCI9PT1wPzA6MSkuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsICIrKCJvZmZzZXQiPT09cD8tRDowKSsiKSIpLmNhbGwoWik7Yi5zZWxlY3QoIi54LmF4aXMiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwgIitJKyIpIikuY2FsbChtKTtiLnNlbGVjdCgiLnkuYXhpcyIpLnN0eWxlKCJvcGFjaXR5Iiwib2Zmc2V0Ij09PXA/MTowKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitCKyIsICIrKCJvZmZzZXQiPT09cD8wOkkpKyIpIikuY2FsbChsYSk7Yi5zZWxlY3RBbGwoIi50aWNrIHRleHQiKS5hdHRyKCJmaWxsIiwiI2FhYSIpO2Iuc2VsZWN0QWxsKCIuYXhpcyBwYXRoLmRvbWFpbiIpLmF0dHIoInN0cm9rZSIsIm5vbmUiKX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaGlzdG9ncmFtLWRhc2hib2FyZC9oaXN0b2dyYW1Db3JlLmpzCnZhciBLazsKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoaCl7Y29uc3QgW2ssdCxsXT1oO3JldHVybnt3YWxsX3RpbWU6ayxzdGVwOnQsbWluOmQzLm1pbihsLm1hcCgoW3BdKT0+cCkpLG1heDpkMy5tYXgobC5tYXAoKFsscF0pPT5wKSksYnVja2V0czpsLm1hcCgoW3AsbSxuXSk9Pih7bGVmdDpwLHJpZ2h0Om0sY291bnQ6bn0pKX19ZnVuY3Rpb24gZihoLGssdCxsPTMwKXt0PT09ayYmKHQ9MS4xKmsrMSxrPWsvMS4xLTEpO2NvbnN0IHA9KHQtaykvbDtsZXQgbT0wO3JldHVybiBkMy5yYW5nZShrLHQscCkubWFwKG49Pntjb25zdCBxPW4rcDtsZXQgdT0wO2Zvcig7bTxoLmJ1Y2tldHMubGVuZ3RoOyl7Y29uc3QgQT1NYXRoLm1pbih0LGguYnVja2V0c1ttXS5yaWdodCk7dmFyIHg9TWF0aC5tYXgoayxoLmJ1Y2tldHNbbV0ubGVmdCk7Y29uc3QgeT1NYXRoLm1pbihBLHEpLU1hdGgubWF4KHgsbik7eD15LyhBLXgpKmguYnVja2V0c1ttXS5jb3VudDt1Kz0wPHk/eDowO2lmKEE+cSlicmVhazttKyt9cmV0dXJue3g6biwKZHg6cCx5OnV9fSl9Yi5iYWNrZW5kVG9JbnRlcm1lZGlhdGU9ZDtiLmludGVybWVkaWF0ZVRvRDM9ZjtiLmJhY2tlbmRUb1Z6PWZ1bmN0aW9uKGgpe2g9aC5tYXAoZCk7Y29uc3Qgaz1kMy5taW4oaCxsPT5sLm1pbiksdD1kMy5tYXgoaCxsPT5sLm1heCk7cmV0dXJuIGgubWFwKGw9Pih7d2FsbF90aW1lOmwud2FsbF90aW1lLHN0ZXA6bC5zdGVwLGJpbnM6ZihsLGssdCl9KSl9fSkoS2t8fChLaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhpc3RvZ3JhbS1kYXNoYm9hcmQvdGYtaGlzdG9ncmFtLWxvYWRlci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1oaXN0b2dyYW0tbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsZGF0YVRvTG9hZDp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVEYXRhVG9Mb2FkKHJ1biwgdGFnKSJ9LGdldERhdGFMb2FkTmFtZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+KHtydW46Yn0pPT5ifSxnZXREYXRhTG9hZFVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+KHt0YWc6YixydW46ZH0pPT52Yy5hZGRQYXJhbXModmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImhpc3RvZ3JhbXMiLCIvaGlzdG9ncmFtcyIpLHt0YWc6YixydW46ZH0pfSxsb2FkRGF0YUNhbGxiYWNrOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGIsZCxmKT0+e2I9S2suYmFja2VuZFRvVnooZik7ZD10aGlzLmdldERhdGFMb2FkTmFtZShkKTt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShkLGIpfX19LHRhZ01ldGFkYXRhOk9iamVjdCx0aW1lUHJvcGVydHk6U3RyaW5nLApoaXN0b2dyYW1Nb2RlOlN0cmluZyxfY29sb3JTY2FsZUZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+cGYucnVuc0NvbG9yU2NhbGV9LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IocnVuKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZywgcmVxdWVzdE1hbmFnZXIpIl0sYmVoYXZpb3JzOltxZC5EYXRhTG9hZGVyQmVoYXZpb3JdLF9jb21wdXRlRGF0YVRvTG9hZChiLGQpe3JldHVyblt7cnVuOmIsdGFnOmR9XX0sX2NvbXB1dGVSdW5Db2xvcihiKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uKGIpfSxyZWRyYXcoKXt0aGlzLiQuY2hhcnQucmVkcmF3KCl9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL3RmLWhpc3RvZ3JhbS1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaGlzdG9ncmFtLWRhc2hib2FyZCIscHJvcGVydGllczp7X2hpc3RvZ3JhbU1vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmZzZXQifSxfdGltZVByb3BlcnR5Ont0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LF9zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnOk9iamVjdCxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX3Jlc3RhbXA6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcn19LGxpc3RlbmVyczp7ImNvbnRlbnQtdmlzaWJpbGl0eS1jaGFuZ2VkIjoiX3JlZHJhd0NhdGVnb3J5UGFuZSJ9LApfcmVkcmF3Q2F0ZWdvcnlQYW5lKGIsZCl7ZCYmYi50YXJnZXQucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goZj0+Zi5yZWRyYXcoKSl9LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZEhpc3RvZ3JhbXMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaGlzdG9ncmFtcyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57aWYoIV8uaXNFcXVhbChkLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBmPV8ubWFwVmFsdWVzKGQsaz0+T2JqZWN0LmtleXMoaykpLGg9dmMuZ2V0VGFncyhmKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWgubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnIixmKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCk7dGhpcy5hc3luYygoKT0+Cnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9yZWxvYWRIaXN0b2dyYW1zKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWhpc3RvZ3JhbS1sb2FkZXIiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGIsZCxmKX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtyZXR1cm4gYltkXVtmXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi10ZXh0LWRhc2hib2FyZC90Zi10ZXh0LWxvYWRlci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi10ZXh0LWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IocnVuKSJ9LF90ZXh0czp7dHlwZTpBcnJheSx2YWx1ZTpbXX0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuQ2FuY2VsbGVyfX0sX2NvbXB1dGVSdW5Db2xvcihiKXtyZXR1cm4gcGYucnVuc0NvbG9yU2NhbGUoYil9LGF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITA7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7aWYodGhpcy5fYXR0YWNoZWQpe3RoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTt2YXIgYj12Yy5hZGRQYXJhbXModmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInRleHQiLCIvdGV4dCIpLHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVufSksZD10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwKKGY9Zi52YWx1ZS5tYXAoaD0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmgud2FsbF90aW1lKSxzdGVwOmguc3RlcCx0ZXh0OmgudGV4dH0pKSx0aGlzLnNldCgiX3RleHRzIixmLnNsaWNlKCkucmV2ZXJzZSgpKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkKX19LF9mb3JtYXRTdGVwKGIpe3JldHVybiBkMy5mb3JtYXQoIiwiKShiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi10ZXh0LWRhc2hib2FyZC90Zi10ZXh0LWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi10ZXh0LWRhc2hib2FyZCIscHJvcGVydGllczp7X3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWc6T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOlN0cmluZyxfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWcsIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkVGV4dHMoKX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInRleHQiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+CntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWcpKXt2YXIgZj12Yy5nZXRUYWdzKGQpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWciLGQpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9yZWxvYWRUZXh0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi10ZXh0LWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtyZXR1cm4gJGMuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhiLGQsZil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHItY3VydmUtZGFzaGJvYXJkL3RmLXByLWN1cnZlLWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcHItY3VydmUtY2FyZCIscHJvcGVydGllczp7cnVuczpBcnJheSx0YWc6U3RyaW5nLHRhZ01ldGFkYXRhOk9iamVjdCxydW5Ub1N0ZXBDYXA6T2JqZWN0LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxhY3RpdmU6Qm9vbGVhbixfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9ydW5Ub1ByQ3VydmVFbnRyeTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3J1bnNXaXRoU3RlcEF2YWlsYWJsZTp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVSdW5zV2l0aFN0ZXBBdmFpbGFibGUocnVucywgX3J1blRvUHJDdXJ2ZUVudHJ5KSJ9LF9zZXRPZlJlbGV2YW50UnVuczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlU2V0T2ZSZWxldmFudFJ1bnMoX3J1bnNXaXRoU3RlcEF2YWlsYWJsZSkifSxfcnVuVG9EYXRhT3ZlclRpbWU6T2JqZWN0LApfY29sb3JTY2FsZUZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHtzY2FsZTpwZi5ydW5zQ29sb3JTY2FsZX0pfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX2F0dGFjaGVkOkJvb2xlYW4sX3hDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOigpPT4oKT0+e2NvbnN0IGI9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTpiLGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoYiwiYm90dG9tIiksYWNjZXNzb3I6ZD0+ZC5yZWNhbGx9fX0sX3lWYWx1ZUFjY2Vzc29yOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCx2YWx1ZTooKT0+Yj0+Yi5wcmVjaXNpb259LF90b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSxyZWFkT25seTohMCx2YWx1ZTooKT0+e2NvbnN0IGI9cmcubXVsdGlzY2FsZUZvcm1hdHRlcihyZy5ZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTiksCmQ9Zj0+aXNOYU4oZik/Ik5hTiI6YihmKTtyZXR1cm5be3RpdGxlOiJSdW4iLGV2YWx1YXRlOmY9PmYuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV9LHt0aXRsZToiVGhyZXNob2xkIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0udGhyZXNob2xkcyl9LHt0aXRsZToiUHJlY2lzaW9uIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0ucHJlY2lzaW9uKX0se3RpdGxlOiJSZWNhbGwiLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS5yZWNhbGwpfSx7dGl0bGU6IlRQIixldmFsdWF0ZTpmPT5mLmRhdHVtLnRydWVfcG9zaXRpdmVzfSx7dGl0bGU6IkZQIixldmFsdWF0ZTpmPT5mLmRhdHVtLmZhbHNlX3Bvc2l0aXZlc30se3RpdGxlOiJUTiIsZXZhbHVhdGU6Zj0+Zi5kYXR1bS50cnVlX25lZ2F0aXZlc30se3RpdGxlOiJGTiIsZXZhbHVhdGU6Zj0+Zi5kYXR1bS5mYWxzZV9uZWdhdGl2ZXN9XX19LF9zZXJpZXNEYXRhRmllbGRzOnt0eXBlOkFycmF5LHZhbHVlOiJ0aHJlc2hvbGRzIHByZWNpc2lvbiByZWNhbGwgdHJ1ZV9wb3NpdGl2ZXMgZmFsc2VfcG9zaXRpdmVzIHRydWVfbmVnYXRpdmVzIGZhbHNlX25lZ2F0aXZlcyIuc3BsaXQoIiAiKSwKcmVhZE9ubHk6ITB9LF9kZWZhdWx0WFJhbmdlOnt0eXBlOkFycmF5LHZhbHVlOlstLjA1LDEuMDVdLHJlYWRPbmx5OiEwfSxfZGVmYXVsdFlSYW5nZTp7dHlwZTpBcnJheSx2YWx1ZTpbLS4wNSwxLjA1XSxyZWFkT25seTohMH0sX2RhdGFVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYj0+e2NvbnN0IGQ9dGhpcy50YWc7cmV0dXJuIHZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJfY3VydmVzIiwiL3ByX2N1cnZlcyIpLHt0YWc6ZCxydW46Yn0pfX19LF9zbW9vdGhpbmdFbmFibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVucywgdGFnKSIsIl9zZXRDaGFydERhdGEoX3J1blRvUHJDdXJ2ZUVudHJ5LCBfcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeSwgX3NldE9mUmVsZXZhbnRSdW5zKSIsIl91cGRhdGVSdW5Ub1ByQ3VydmVFbnRyeShfcnVuVG9EYXRhT3ZlclRpbWUsIHJ1blRvU3RlcENhcCkiXSwKX2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57dGhpcy5zZXQoIl9ydW5Ub0RhdGFPdmVyVGltZSIsT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9ydW5Ub0RhdGFPdmVyVGltZSxmKSl9fSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24uc2NhbGUoYil9LGF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITA7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fYXR0YWNoZWQmJigwPT09dGhpcy5ydW5zLmxlbmd0aD90aGlzLnNldCgiX3J1blRvRGF0YU92ZXJUaW1lIix7fSk6dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnJlbG9hZCgpKX0sX3NldENoYXJ0RGF0YShiLGQsZil7Xy5mb3JPd24oYiwoaCxrKT0+e2NvbnN0IHQ9ZFtrXTt0JiZiW2tdLnN0ZXA9PT10LnN0ZXB8fChmW2tdP3RoaXMuX3VwZGF0ZVNlcmllc0RhdGFGb3JSdW4oayxoKTp0aGlzLl9jbGVhclNlcmllc0RhdGEoaykpfSl9LApfdXBkYXRlU2VyaWVzRGF0YUZvclJ1bihiLGQpe2NvbnN0IGY9Xy5yZWR1Y2UodGhpcy5fc2VyaWVzRGF0YUZpZWxkcywoayx0KT0+e2tbdF09ZFt0XS5zbGljZSgpLnJldmVyc2UoKTtyZXR1cm4ga30se30pLGg9QXJyYXkoZlt0aGlzLl9zZXJpZXNEYXRhRmllbGRzWzBdXS5sZW5ndGgpO2ZvcihsZXQgaz0wO2s8aC5sZW5ndGg7aysrKWhba109Xy5tYXBWYWx1ZXMoZix0PT50W2tdKTt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikuc2V0U2VyaWVzRGF0YShiLGgpfSxfY2xlYXJTZXJpZXNEYXRhKGIpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5zZXRTZXJpZXNEYXRhKGIsW10pfSxfdXBkYXRlUnVuVG9QckN1cnZlRW50cnkoYixkKXtjb25zdCBmPXt9O18uZm9yT3duKGIsKGgsayk9PntoJiZoLmxlbmd0aCYmKGZba109dGhpcy5fY29tcHV0ZUVudHJ5Q2xvc2VzdE9yRXF1YWxUb1N0ZXBDYXAoZFtrXSxoKSl9KTt0aGlzLnNldCgiX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnkiLAp0aGlzLl9ydW5Ub1ByQ3VydmVFbnRyeSk7dGhpcy5zZXQoIl9ydW5Ub1ByQ3VydmVFbnRyeSIsZil9LF9jb21wdXRlRW50cnlDbG9zZXN0T3JFcXVhbFRvU3RlcENhcChiLGQpe2I9TWF0aC5taW4oXy5zb3J0ZWRJbmRleChkLm1hcChmPT5mLnN0ZXApLGIpLGQubGVuZ3RoLTEpO3JldHVybiBkW2JdfSxfY29tcHV0ZVJ1bnNXaXRoU3RlcEF2YWlsYWJsZShiLGQpe3JldHVybiBfLmZpbHRlcihiLGY9PmRbZl0pLnNvcnQoKX0sX2NvbXB1dGVTZXRPZlJlbGV2YW50UnVucyhiKXtjb25zdCBkPXt9O18uZm9yRWFjaChiLGY9PntkW2ZdPSEwfSk7cmV0dXJuIGR9LF9jb21wdXRlQ3VycmVudFN0ZXBGb3JSdW4oYixkKXtyZXR1cm4oYj1iW2RdKT9iLnN0ZXA6bnVsbH0sX2NvbXB1dGVDdXJyZW50V2FsbFRpbWVGb3JSdW4oYixkKXtyZXR1cm4oYj1iW2RdKT8obmV3IERhdGUoMUUzKmIud2FsbF90aW1lKSkudG9TdHJpbmcoKTpudWxsfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwKIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfcmVzZXREb21haW4oKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVzZXREb21haW4oKX0scmVkcmF3KCl7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnJlZHJhdygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXByLWN1cnZlLWRhc2hib2FyZC90Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3Rvci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3RvciIscHJvcGVydGllczp7cnVuczpBcnJheSxydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzOk9iamVjdCxydW5Ub1N0ZXA6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxjb21wdXRlZDoiX2NvbXB1dGVSdW5Ub1N0ZXAocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcywgX3J1blRvU3RlcEluZGV4KSJ9LHRpbWVEaXNwbGF5VHlwZTpTdHJpbmcsX3J1blRvU3RlcEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3J1bnNXaXRoU2xpZGVyczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVSdW5zV2l0aFNsaWRlcnMocnVucywgcnVuVG9BdmFpbGFibGVUaW1lRW50cmllcykifX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVN0ZXBzRm9yTmV3UnVucyhydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzKSJdLF9jb21wdXRlQ29sb3JGb3JSdW4oYil7cmV0dXJuIHBmLnJ1bnNDb2xvclNjYWxlKGIpfSxfY29tcHV0ZVRpbWVUZXh0Rm9yUnVuKGIsCmQsZixoKXtkPWRbZl07aWYoIV8uaXNOdW1iZXIoZCkpcmV0dXJuIiI7Yj1iW2ZdO2lmKCFiKXJldHVybiIiO2I9YltkXVtoXTtpZigic3RlcCI9PT1oKXJldHVybmBzdGVwICR7Yn1gO2lmKCJyZWxhdGl2ZSI9PT1oKXJldHVybiAxPmI/YCR7KDFFMypiKS50b0ZpeGVkKDIpfSBtc2A6YCR7Yi50b0ZpeGVkKDIpfSBzYDtpZigid2FsbF90aW1lIj09PWgpcmV0dXJuKG5ldyBEYXRlKDFFMypiKSkudG9TdHJpbmcoKTt0aHJvdyBFcnJvcihgVGhlIGRpc3BsYXkgdHlwZSBvZiAke2h9IGlzIG5vdCByZWNvZ25pemVkLmApO30sX3NsaWRlclZhbHVlQ2hhbmdlZChiKXtjb25zdCBkPWIudGFyZ2V0LmRhdGFzZXQucnVuLGY9Yi50YXJnZXQuaW1tZWRpYXRlVmFsdWUsaD1PYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvU3RlcEluZGV4KTtpc05hTihmKT9kZWxldGUgaFtkXTpoW2RdPWIudGFyZ2V0LmltbWVkaWF0ZVZhbHVlO3RoaXMuX3J1blRvU3RlcEluZGV4PWh9LF9jb21wdXRlTWF4U3RlcEluZGV4Rm9yUnVuKGIsCmQpe3JldHVybihiPWJbZF0pJiZiLmxlbmd0aD9iLmxlbmd0aC0xOjB9LF91cGRhdGVTdGVwc0Zvck5ld1J1bnMoYil7Y29uc3QgZD1PYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvU3RlcEluZGV4KTtfLmZvck93bihiLChmLGgpPT57Xy5pc051bWJlcihkW2hdKXx8KGRbaF09Zi5sZW5ndGgtMSl9KTt0aGlzLl9ydW5Ub1N0ZXBJbmRleD1kfSxfZ2V0U3RlcChiLGQpe3JldHVybiB0aGlzLl9ydW5Ub1N0ZXBJbmRleD90aGlzLl9ydW5Ub1N0ZXBJbmRleFtkXTowfSxfY29tcHV0ZVJ1blRvU3RlcChiLGQpe2NvbnN0IGY9e307Xy5mb3JPd24oZCwoaCxrKT0+e2NvbnN0IHQ9YltrXTt0JiYoZltrXT10W2hdLnN0ZXApfSk7cmV0dXJuIGZ9LF9jb21wdXRlUnVuc1dpdGhTbGlkZXJzKGIsZCl7cmV0dXJuIGIuZmlsdGVyKGY9PmRbZl0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXByLWN1cnZlLWRhc2hib2FyZC90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcHItY3VydmUtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfdGltZURpc3BsYXlUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LF9zZWxlY3RlZFJ1bnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfcnVuVG9UYWdJbmZvOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfcmVsZXZhbnRTZWxlY3RlZFJ1bnM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlUmVsZXZhbnRTZWxlY3RlZFJ1bnMoX3NlbGVjdGVkUnVucywgX3J1blRvVGFnSW5mbykifSxfcnVuc1dpdGhQckN1cnZlRGF0YTpBcnJheSxfcnVuVG9TdGVwOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOlN0cmluZyxfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LApfZ2V0Q2F0ZWdvcnlJdGVtS2V5Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT5iPT5iLnRhZ30sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfSxfc3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe1Byb21pc2UuYWxsKFt0aGlzLl9mZXRjaFRhZ3MoKSx0aGlzLl9mZXRjaFRpbWVFbnRyaWVzUGVyUnVuKCldKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkQ2FyZHMoKX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByX2N1cnZlcyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57aWYoIV8uaXNFcXVhbChkLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBmPV8ubWFwVmFsdWVzKGQsaD0+Xy5rZXlzKGgpKTsKZj12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfZmV0Y2hUaW1lRW50cmllc1BlclJ1bigpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByX2N1cnZlcyIsIi9hdmFpbGFibGVfdGltZV9lbnRyaWVzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57Xy5mb3JPd24oZCxmPT57Xy5mb3JFYWNoKGYsaD0+e2gucmVsYXRpdmU9aC53YWxsX3RpbWUtZlswXS53YWxsX3RpbWV9KX0pO3RoaXMuc2V0KCJfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllcyIsZCk7ZD1fLmtleXMoZCkuc2xpY2UoKS5zb3J0KCk7Xy5pc0VxdWFsKGQsdGhpcy5fcnVuc1dpdGhQckN1cnZlRGF0YSl8fHRoaXMuc2V0KCJfcnVuc1dpdGhQckN1cnZlRGF0YSIsCmQpfSl9LF9yZWxvYWRDYXJkcygpe18uZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtcHItY3VydmUtY2FyZCIpLGI9PntiLnJlbG9hZCgpfSl9LF9tYWtlQ2F0ZWdvcmllcyhiLGQsZil7Yj1fLm1hcFZhbHVlcyhiLGg9Pk9iamVjdC5rZXlzKGgpKTtyZXR1cm4gJGMuY2F0ZWdvcml6ZVRhZ3MoYixkLGYpfSxfY29tcHV0ZUNvbG9yRm9yUnVuKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sX2NvbXB1dGVSZWxldmFudFNlbGVjdGVkUnVucyhiLGQpe3JldHVybiBiLmZpbHRlcihmPT5kW2ZdKX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtjb25zdCBoPXt9O2QuZm9yRWFjaChrPT57aFtrXT1iW2tdW2ZdfSk7ZD1mLnJlcGxhY2UoL1wvcHJfY3VydmVzJC8sIiIpO3JldHVybiByZi5hZ2dyZWdhdGVUYWdJbmZvKGgsZCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQvdGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19pbnN0YWxsQ29tbWFuZDp7dHlwZTpTdHJpbmcscmVhZE9ubHk6ITAsdmFsdWU6InBpcCBpbnN0YWxsIC1VIHRlbnNvcmJvYXJkX3BsdWdpbl9wcm9maWxlIn19LF9jb3B5SW5zdGFsbENvbW1hbmQoKXtjb25zdCBiPXRoaXM7cmV0dXJuIGhjKGZ1bmN0aW9uKigpe2NvbnN0IGQ9KCk9PmhjKGZ1bmN0aW9uKigpe2IuJC5jb21tYW5kVGV4dGFyZWEuc2VsZWN0KCk7dHJ5e3lpZWxkIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGIuX2luc3RhbGxDb21tYW5kKX1jYXRjaChmKXtpZighZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QoKX19KTt0cnl7eWllbGQgZCgpLGIuJC5jb3BpZWRNZXNzYWdlLmlubmVyVGV4dD0iQ29waWVkLiJ9Y2F0Y2goZil7Yi4kLmNvcGllZE1lc3NhZ2UuaW5uZXJUZXh0PSJGYWlsZWQgdG8gY29weSB0byBjbGlwYm9hcmQuIn19KX0sCl9yZW1vdmVDb3BpZWRNZXNzYWdlKCl7dGhpcy4kLmNvcGllZE1lc3NhZ2UuaW5uZXJUZXh0PSIifX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi10ZW5zb3Jib2FyZC9wbHVnaW4tZGlhbG9nLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXBsdWdpbi1kaWFsb2ciLHByb3BlcnRpZXM6e190aXRsZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2N1c3RvbU1lc3NhZ2U6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9vcGVuOnt0eXBlOkJvb2xlYW59LF9oaWRkZW46e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIaWRkZW4oX29wZW4pIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF91c2VOYXRpdmVCYWNrZHJvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfX0sb3Blbk5vVGVuc29yRmxvd0RpYWxvZygpe3RoaXMub3BlbkRpYWxvZygiVGhpcyBwbHVnaW4gaXMgZGlzYWJsZWQgd2l0aG91dCBUZW5zb3JGbG93IiwnVG8gZW5hYmxlIHRoaXMgcGx1Z2luIGluIFRlbnNvckJvYXJkLCBpbnN0YWxsIFRlbnNvckZsb3cgd2l0aCAicGlwIGluc3RhbGwgdGVuc29yZmxvdyIgb3IgZXF1aXZhbGVudC4nKX0sb3Blbk9sZFRlbnNvckZsb3dEaWFsb2coYil7dGhpcy5vcGVuRGlhbG9nKCJUaGlzIHBsdWdpbiBpcyBkaXNhYmxlZCB3aXRob3V0IFRlbnNvckZsb3cgIisKYiwiVG8gZW5hYmxlIHRoaXMgcGx1Z2luIGluIFRlbnNvckJvYXJkLCBpbnN0YWxsIFRlbnNvckZsb3cgIitiKycgb3IgZ3JlYXRlciB3aXRoICJwaXAgaW5zdGFsbCB0ZW5zb3JmbG93IiBvciBlcXVpdmFsZW50LicpfSxvcGVuRGlhbG9nKGIsZCl7dGhpcy5zZXQoIl90aXRsZSIsYik7dGhpcy5zZXQoIl9jdXN0b21NZXNzYWdlIixkKTt0aGlzLiQuZGlhbG9nLm9wZW4oKX0sY2xvc2VEaWFsb2coKXt0aGlzLiQuZGlhbG9nLmNsb3NlKCl9LF9jb21wdXRlSGlkZGVuKGIpe3JldHVybiFifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJlaG9sZGVyLWRhc2hib2FyZC90Zi1iZWhvbGRlci12aWRlby5odG1sLmpzCihmdW5jdGlvbigpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImJlaG9sZGVyIiwiL2JlaG9sZGVyLWZyYW1lIiksZD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvcGluZyIpO1BvbHltZXIoe2lzOiJ0Zi1iZWhvbGRlci12aWRlbyIscHJvcGVydGllczp7ZnBzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2Zwc0NoYW5nZWQifSxwaW5nU2xlZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjFFM30seGhyVGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MjUwMH0sX2ltYWdlVVJMOnt0eXBlOlN0cmluZyx2YWx1ZToiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzXHgzZCJ9LF94aHI6T2JqZWN0LF90aW1lcjpOdW1iZXIsX2lzRGVhZDpCb29sZWFufSxhdHRhY2hlZCgpe3RoaXMuc2V0KCJfaW1hZ2VVUkwiLGIpO3RoaXMuX3BpbmcoKX0sZGV0YWNoZWQoKXt0aGlzLl9jbGVhcigpOwp0aGlzLnNldCgiX2ltYWdlVVJMIiwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzXHgzZCIpfSxfcGluZygpe3RoaXMuX2NsZWFyKCk7dGhpcy5feGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt0aGlzLl94aHIub3BlbigiR0VUIixkLCEwKTt0aGlzLl94aHIudGltZW91dD10aGlzLnhoclRpbWVvdXQ7dGhpcy5feGhyLm9ubG9hZD10aGlzLl9vblBpbmdMb2FkLmJpbmQodGhpcyk7dGhpcy5feGhyLm9uZXJyb3I9dGhpcy5fb25QaW5nLmJpbmQodGhpcywhMSx0aGlzLnBpbmdTbGVlcCk7dGhpcy5feGhyLm9udGltZW91dD10aGlzLl9vblBpbmcuYmluZCh0aGlzLCExLDEpO3RoaXMuX3hoci5zZW5kKG51bGwpfSxfb25QaW5nTG9hZCgpe2lmKDIwMD09dGhpcy5feGhyLnN0YXR1cyl7Y29uc3QgZj1KU09OLnBhcnNlKHRoaXMuX3hoci5yZXNwb25zZVRleHQpO3RoaXMuX29uUGluZygiYWxpdmUiPT1mLnN0YXR1cyx0aGlzLnBpbmdTbGVlcCl9ZWxzZSB0aGlzLl9vblBpbmcoITEsCnRoaXMucGluZ1NsZWVwKX0sX29uUGluZyhmLGgpe2YmJnRoaXMuX2lzRGVhZCYmdGhpcy5zZXQoIl9pbWFnZVVSTCIsYisiP3RceDNkIisobmV3IERhdGUpLmdldFRpbWUoKSk7dGhpcy5faXNEZWFkPSFmO3RoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLl9waW5nKCksaCl9LF9jbGVhcigpe3RoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9bnVsbCk7dGhpcy5feGhyJiYodGhpcy5feGhyLnJlYWR5U3RhdGU8WE1MSHR0cFJlcXVlc3QuRE9ORSYmdGhpcy5feGhyLmFib3J0KCksdGhpcy5feGhyPW51bGwpfSxfZnBzQ2hhbmdlZChmLGgpezA9PWY/dGhpcy5fY2xlYXIoKTowPT1oJiZ0aGlzLl9waW5nKCl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJlaG9sZGVyLWRhc2hib2FyZC90Zi1iZWhvbGRlci1pbmZvLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvc2VjdGlvbi1pbmZvIik7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLWluZm8iLHByb3BlcnRpZXM6e2Zwczp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsb2JzZXJ2ZXI6Il9mcHNDaGFuZ2VkIn0seGhyVGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MUU0fSxfaXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7bmFtZToiTG9hZGluZy4uLiJ9XX0sX3hocjpPYmplY3QsX3RpbWVyOk51bWJlcn0sYXR0YWNoZWQoKXt0aGlzLl9sb2FkKCl9LGRldGFjaGVkKCl7dGhpcy5fY2xlYXIoKX0sX2xvYWQoKXt0aGlzLl9jbGVhcigpO3RoaXMuX3hocj1uZXcgWE1MSHR0cFJlcXVlc3Q7dGhpcy5feGhyLm9wZW4oIkdFVCIsYiwhMCk7dGhpcy5feGhyLnRpbWVvdXQ9dGhpcy54aHJUaW1lb3V0O3RoaXMuX3hoci5vbmxvYWQ9dGhpcy5fb25Mb2FkLmJpbmQodGhpcyk7dGhpcy5feGhyLm9uZXJyb3I9CnRoaXMuX3JldHJ5LmJpbmQodGhpcyx0aGlzLl9nZXRTbGVlcCgpKTt0aGlzLl94aHIub250aW1lb3V0PXRoaXMuX3JldHJ5LmJpbmQodGhpcywxKTt0aGlzLl94aHIuc2VuZChudWxsKX0sX29uTG9hZCgpe2lmKDIwMD09dGhpcy5feGhyLnN0YXR1cyl7Y29uc3QgZD1KU09OLnBhcnNlKHRoaXMuX3hoci5yZXNwb25zZVRleHQpO2NvbnNvbGUuYXNzZXJ0KEFycmF5LmlzQXJyYXkoZCksIkV4cGVjdGVkIHJlc3BvbnNlIHRvIGJlIGluIGFuIGFycmF5Iik7dGhpcy5faXRlbXM9ZH10aGlzLl9yZXRyeSh0aGlzLl9nZXRTbGVlcCgpKX0sX3JldHJ5KGQpe3RoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX2xvYWQuYmluZCh0aGlzKSxkKX0sX2dldFNsZWVwKCl7cmV0dXJuIDFFMy8oMD09PXRoaXMuZnBzPzE6dGhpcy5mcHMpfSxfY2xlYXIoKXt0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPW51bGwpO3RoaXMuX3hociYmCih0aGlzLl94aHIucmVhZHlTdGF0ZTxYTUxIdHRwUmVxdWVzdC5ET05FJiZ0aGlzLl94aHIuYWJvcnQoKSx0aGlzLl94aHI9bnVsbCl9LF9mcHNDaGFuZ2VkKGQsZil7MD09ZD90aGlzLl9jbGVhcigpOjA9PWYmJnRoaXMuX2xvYWQoKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcigxMCwwKX0sX2lzQXZhaWxhYmxlOkJvb2xlYW4sX3ZhbHVlczp7dHlwZTpTdHJpbmcsdmFsdWU6InRyYWluYWJsZV92YXJpYWJsZXMiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9tb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToidmFyaWFuY2UiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9zY2FsaW5nOnt0eXBlOlN0cmluZyx2YWx1ZToibGF5ZXIiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF93aW5kb3dTaXplOnt0eXBlOk51bWJlcix2YWx1ZToxNSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfcHJldmlvdXNGUFM6e3R5cGU6TnVtYmVyLHZhbHVlOjMwfSxfRlBTOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSwKX3JlY29yZFRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGFydCByZWNvcmRpbmcifSxfaXNSZWNvcmRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfc2hvd0FsbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9jb2xvcm1hcDp7dHlwZTpTdHJpbmcsdmFsdWU6Im1hZ21hIixvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfaXNfYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX2NvbnRyb2xzX2Rpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn19LF92YWx1ZXNOb3RGcmFtZShiKXtyZXR1cm4iZnJhbWVzIiE9PWJ9LF92YXJpYW5jZVNlbGVjdGVkKGIpe3JldHVybiJ2YXJpYW5jZSI9PT1ifSxfY29uZmlnQ2hhbmdlZCgpe2lmKHRoaXMuX2lzX2FjdGl2ZSYmIXRoaXMuX2NvbnRyb2xzX2Rpc2FibGVkKXt2YXIgYj0KW3RoaXMuX3ZhbHVlcyx0aGlzLl9tb2RlLHRoaXMuX3NjYWxpbmcsdGhpcy5fd2luZG93U2l6ZSx0aGlzLl9GUFMsdGhpcy5faXNSZWNvcmRpbmcsdGhpcy5fc2hvd0FsbCx0aGlzLl9jb2xvcm1hcF0sZDtmb3IoZCBvZiBiKWlmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGR8fCIiPT09ZClyZXR1cm47Yj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvY2hhbmdlLWNvbmZpZyIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYix7dmFsdWVzOnRoaXMuX3ZhbHVlcyxtb2RlOnRoaXMuX21vZGUsc2NhbGluZzp0aGlzLl9zY2FsaW5nLHdpbmRvd19zaXplOnRoaXMuX3dpbmRvd1NpemUsRlBTOnRoaXMuX0ZQUyxpc19yZWNvcmRpbmc6dGhpcy5faXNSZWNvcmRpbmcsc2hvd19hbGw6dGhpcy5fc2hvd0FsbCxjb2xvcm1hcDp0aGlzLl9jb2xvcm1hcH0pfX0sX3RvZ2dsZVJlY29yZCgpeyJzdGFydCByZWNvcmRpbmciPT10aGlzLl9yZWNvcmRUZXh0Pyh0aGlzLnNldCgiX3JlY29yZFRleHQiLAoic3RvcCByZWNvcmRpbmciKSx0aGlzLnNldCgiX2lzUmVjb3JkaW5nIiwhMCkpOih0aGlzLnNldCgiX3JlY29yZFRleHQiLCJzdGFydCByZWNvcmRpbmciKSx0aGlzLnNldCgiX2lzUmVjb3JkaW5nIiwhMSkpO3RoaXMuJC5yZWNvcmRfYnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoImlzLXJlY29yZGluZyIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodmMuZ2V0Um91dGVyKCkucGx1Z2luc0xpc3RpbmcoKSkudGhlbihiPT57ImJlaG9sZGVyImluIGI/KHRoaXMuJC5pbml0aWFsRGlhbG9nLmNsb3NlRGlhbG9nKCksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITApKToodGhpcy4kLmluaXRpYWxEaWFsb2cub3Blbk5vVGVuc29yRmxvd0RpYWxvZygpLHRoaXMuc2V0KCJfaXNBdmFpbGFibGUiLCExKSl9KX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9pc0F2YWlsYWJsZSl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLAoiL2lzLWFjdGl2ZSIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57dGhpcy5zZXQoIl9pc19hY3RpdmUiLGQuaXNfYWN0aXZlKTt0aGlzLnNldCgiX2NvbnRyb2xzX2Rpc2FibGVkIiwhZC5pc19jb25maWdfd3JpdGFibGUpfSl9fX0pO3FmLnJlZ2lzdGVyRGFzaGJvYXJkKCl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtdXRpbHMvdGYtaHBhcmFtcy11dGlscy5odG1sLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgoQil7cmV0dXJuIiIhPT1CLmRpc3BsYXlOYW1lJiZ2b2lkIDAhPT1CLmRpc3BsYXlOYW1lP0IuZGlzcGxheU5hbWU6Qi5uYW1lfWZ1bmN0aW9uIGsoQil7aWYoIiIhPT1CLmRpc3BsYXlOYW1lJiZ2b2lkIDAhPT1CLmRpc3BsYXlOYW1lKXJldHVybiBCLmRpc3BsYXlOYW1lO2xldCBJPUIubmFtZS5ncm91cDtCPUIubmFtZS50YWc7dm9pZCAwPT09SSYmKEk9IiIpO3ZvaWQgMD09PUImJihCPSIiKTtyZXR1cm4iIj09PUk/QjpJKyIuIitCfWZ1bmN0aW9uIHQoQil7cmV0dXJuIEIuaHBhcmFtQ29sdW1ucy5sZW5ndGh9ZnVuY3Rpb24gbChCKXtyZXR1cm4gQi5tZXRyaWNDb2x1bW5zLmxlbmd0aH1mdW5jdGlvbiBwKEIsSSl7cmV0dXJuIEJbSV19ZnVuY3Rpb24gbShCLEkpe3JldHVybiBCLmZpbmQoTj0+Xy5pc0VxdWFsKE4ubmFtZSxJKSl9ZnVuY3Rpb24gbihCLEksTil7cmV0dXJuIEkuaHBhcmFtc1tCLmhwYXJhbUNvbHVtbnNbTl0uaHBhcmFtSW5mby5uYW1lXX0KZnVuY3Rpb24gcShCLEksTil7Qj1tKEkubWV0cmljVmFsdWVzLEIubWV0cmljQ29sdW1uc1tOXS5tZXRyaWNJbmZvLm5hbWUpO3JldHVybiB2b2lkIDA9PT1CP3ZvaWQgMDpCLnZhbHVlfWZ1bmN0aW9uIHUoQixJLE4pe3JldHVybiBOPEIuaHBhcmFtQ29sdW1ucy5sZW5ndGg/bihCLEksTik6cShCLEksTi1CLmhwYXJhbUNvbHVtbnMubGVuZ3RoKX1mdW5jdGlvbiB4KEIpe3JldHVybiBCLmhwYXJhbUluZm9zLmxlbmd0aH1mdW5jdGlvbiBBKEIpe3JldHVybiBCLm1ldHJpY0luZm9zLmxlbmd0aH1mdW5jdGlvbiB5KEIsSSxOKXtyZXR1cm4gSS5ocGFyYW1zW0IuaHBhcmFtSW5mb3NbTl0ubmFtZV19ZnVuY3Rpb24gdyhCLEksTil7Qj1tKEkubWV0cmljVmFsdWVzLEIubWV0cmljSW5mb3NbTl0ubmFtZSk7cmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOkIudmFsdWV9ZnVuY3Rpb24gQyhCLEksTil7cmV0dXJuIE48Qi5ocGFyYW1JbmZvcy5sZW5ndGg/eShCLEksTik6dyhCLEksTi1CLmhwYXJhbUluZm9zLmxlbmd0aCl9CmZ1bmN0aW9uIEYoQil7cmV0dXJuIF8uaXNOdW1iZXIoQik/Qi50b1ByZWNpc2lvbig1KTp2b2lkIDA9PT1CPyIiOkIudG9TdHJpbmcoKX1mdW5jdGlvbiBEKEIsSSl7cmV0dXJuIEIqQitJKkl9Zi5ocGFyYW1OYW1lPWg7Zi5tZXRyaWNOYW1lPWs7Zi5zY2hlbWFDb2x1bW5OYW1lPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEk8Qi5ocGFyYW1Db2x1bW5zLmxlbmd0aD9oKEIuaHBhcmFtQ29sdW1uc1tJXS5ocGFyYW1JbmZvKTprKEIubWV0cmljQ29sdW1uc1tJLUIuaHBhcmFtQ29sdW1ucy5sZW5ndGhdLm1ldHJpY0luZm8pfTtmLm51bUhQYXJhbXM9dDtmLm51bU1ldHJpY3M9bDtmLm51bUNvbHVtbnM9ZnVuY3Rpb24oQil7cmV0dXJuIHQoQikrbChCKX07Zi5ocGFyYW1WYWx1ZUJ5TmFtZT1wO2YubWV0cmljVmFsdWVCeU5hbWU9bTtmLmhwYXJhbVZhbHVlQnlJbmRleD1uO2YubWV0cmljVmFsdWVCeUluZGV4PXE7Zi5jb2x1bW5WYWx1ZUJ5SW5kZXg9dTtmLm51bWVyaWNDb2x1bW5FeHRlbnQ9CmZ1bmN0aW9uKEIsSSxOKXtyZXR1cm4gZDMuZXh0ZW50KEksTz0+dShCLE8sTikpfTtmLmdldEFic29sdXRlQ29sdW1uSW5kZXg9ZnVuY3Rpb24oQixJLE4pe2lmKE48SS5ocGFyYW1JbmZvcy5sZW5ndGgpQj1CLmhwYXJhbUNvbHVtbnMuZmluZEluZGV4KE89Pk8uaHBhcmFtSW5mby5uYW1lPT09SS5ocGFyYW1JbmZvc1tOXS5uYW1lKTtlbHNle2NvbnN0IE89SS5tZXRyaWNJbmZvc1tOLUkuaHBhcmFtSW5mb3MubGVuZ3RoXS5uYW1lO0I9Qi5ocGFyYW1Db2x1bW5zLmxlbmd0aCtCLm1ldHJpY0NvbHVtbnMuZmluZEluZGV4KEg9PkgubWV0cmljSW5mby5uYW1lPT09Tyl9Y29uc29sZS5hc3NlcnQoLTEhPT1CKTtyZXR1cm4gQn07Zi5zY2hlbWFWaXNpYmxlQ29sdW1uTmFtZT1mdW5jdGlvbihCLEkpe3JldHVybiBJPEIuaHBhcmFtSW5mb3MubGVuZ3RoP2goQi5ocGFyYW1JbmZvc1tJXSk6ayhCLm1ldHJpY0luZm9zW0ktQi5ocGFyYW1JbmZvcy5sZW5ndGhdKX07Zi5udW1WaXNpYmxlSFBhcmFtcz0KeDtmLm51bVZpc2libGVNZXRyaWNzPUE7Zi5udW1WaXNpYmxlQ29sdW1ucz1mdW5jdGlvbihCKXtyZXR1cm4geChCKStBKEIpfTtmLnZpc2libGVOdW1lcmljQ29sdW1uRXh0ZW50PWZ1bmN0aW9uKEIsSSxOKXtyZXR1cm4gZDMuZXh0ZW50KEksTz0+QyhCLE8sTikpfTtmLnByZXR0eVByaW50SFBhcmFtVmFsdWVCeU5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gRihwKEIsSSkpfTtmLnByZXR0eVByaW50TWV0cmljVmFsdWVCeU5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gRihtKEIsSSkpfTtmLnNlc3Npb25Hcm91cFdpdGhOYW1lPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEIuZmluZChOPT5OLm5hbWU9PT1JKX07Zi5ocGFyYW1WYWx1ZUJ5VmlzaWJsZUluZGV4PXk7Zi5tZXRyaWNWYWx1ZUJ5VmlzaWJsZUluZGV4PXc7Zi5jb2x1bW5WYWx1ZUJ5VmlzaWJsZUluZGV4PUM7Zi5wcmV0dHlQcmludD1GO2YubDJOb3JtU3F1YXJlZD1EO2YuZXVjbGlkZWFuRGlzdD1mdW5jdGlvbihCLEksTixPKXtyZXR1cm4gTWF0aC5zcXJ0KEQoQi0KTixJLU8pKX07Zi5wb2ludFRvUmVjdGFuZ2xlRGlzdD1mdW5jdGlvbihCLEksTixPLEgsSyl7aWYoQjxOJiZJPE8pcmV0dXJuIGYuZXVjbGlkZWFuRGlzdChCLEksTixPKTtpZihOPD1CJiZCPEgmJkk8TylyZXR1cm4gTy1JO2lmKEg8PUImJkk8TylyZXR1cm4gZi5ldWNsaWRlYW5EaXN0KEIsSSxILE8pO2lmKEI8TiYmTzw9SSYmSTxLKXJldHVybiBOLUI7aWYoTjw9QiYmQjxIJiZPPD1JJiZJPEspcmV0dXJuIDA7aWYoSDw9QiYmTzw9SSYmSTxLKXJldHVybiBCLUg7aWYoQjxOJiZLPD1JKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixJLE4sSyk7aWYoTjw9QiYmQjxIJiZLPD1JKXJldHVybiBJLUs7aWYoSDw9QiYmSzw9SSlyZXR1cm4gZi5ldWNsaWRlYW5EaXN0KEIsSSxILEspO3Rocm93IlBvaW50ICh4LHkpIG11c3QgYmUgaW4gb25lIG9mIHRoZSByZWdpb25zIGRlZmluZWQgYWJvdmUuIjt9O2YudHJhbnNsYXRlU3RyPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIHZvaWQgMD09PUk/InRyYW5zbGF0ZSgiKwpCKyIpIjoidHJhbnNsYXRlKCIrQisiLCIrSSsiKSJ9O2Yucm90YXRlU3RyPWZ1bmN0aW9uKEIsSSl7bGV0IE49InJvdGF0ZSg5MCI7dm9pZCAwIT09QiYmdm9pZCAwIT09SSYmKE49TisiLCIrQisiLCIrSSk7cmV0dXJuIE4rIikifTtmLmlzTnVsbE9yVW5kZWZpbmVkPWZ1bmN0aW9uKEIpe3JldHVybiBudWxsPT09Qnx8dm9pZCAwPT09Qn07Zi5xdWFkVHJlZVZpc2l0UG9pbnRzSW5SZWN0PWZ1bmN0aW9uKEIsSSxOLE8sSCxLKXtCLnZpc2l0KChNLEwsUSxULFgpPT57aWYodm9pZCAwPT09TS5sZW5ndGgpe2RvIEw9Qi54KCkoTS5kYXRhKSxRPUIueSgpKE0uZGF0YSksSTw9TCYmTDxPJiZOPD1RJiZRPEgmJksoTS5kYXRhKTt3aGlsZShNPU0ubmV4dCk7cmV0dXJuITB9cmV0dXJuIEw+PU98fFQ8PUl8fFE+PUh8fFg8PU59KX07Zi5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrPWZ1bmN0aW9uKEIsSSxOLE8sSCl7Qi52aXNpdCgoSyxNLEwsUSxUKT0+e2lmKHZvaWQgMD09PUsubGVuZ3RoKXtkbyBNPQpCLngoKShLLmRhdGEpLEw9Qi55KCkoSy5kYXRhKSxNPWYuZXVjbGlkZWFuRGlzdChJLE4sTSxMKSxNPD1PJiZIKEsuZGF0YSxNKTt3aGlsZShLPUsubmV4dCk7cmV0dXJuITB9cmV0dXJuIGYucG9pbnRUb1JlY3RhbmdsZURpc3QoSSxOLE0sTCxRLFQpPk99KX07Zi5maWx0ZXJTZXQ9ZnVuY3Rpb24oQixJKXtjb25zdCBOPW5ldyBTZXQ7Qi5mb3JFYWNoKE89PntJKE8pJiZOLmFkZChPKX0pO3JldHVybiBOfTtmLnNldEFycmF5T2JzZXJ2YWJseT1mdW5jdGlvbihCLEkpe2NvbnN0IE49Qi5nZXQoInNlc3Npb25Hcm91cHMiLEIpO0FycmF5LmlzQXJyYXkoTik/Qi5zcGxpY2UuYXBwbHkoQixbInNlc3Npb25Hcm91cHMiLDAsTi5sZW5ndGhdLmNvbmNhdChJKSk6Qi5zZXQoInNlc3Npb25Hcm91cHMiLEkpfTtmLmhhc2hPZlN0cmluZz1mdW5jdGlvbihCKXtsZXQgST0wO2ZvcihsZXQgTj0wO048Qi5sZW5ndGg7KytOKUk9MzEqSStCLmNoYXJDb2RlQXQoTikmNDI5NDk2NzI5NTtyZXR1cm4gSSsKTWF0aC5wb3coMiwzMSl9fSkoZC51dGlsc3x8KGQudXRpbHM9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1zcGxpdC1sYXlvdXQvdmFhZGluLXNwbGl0LWxheW91dC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tc3BsaXQtbGF5b3V0IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOnt2ZXJ0aWNhbDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0sX3ByZXZpb3VzUHJpbWFyeVBvaW50ZXJFdmVudHM6U3RyaW5nLF9wcmV2aW91c1NlY29uZGFyeVBvaW50ZXJFdmVudHM6U3RyaW5nfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPVBvbHltZXIuZG9tKHRoaXMpLm9ic2VydmVOb2Rlcyh0aGlzLl9wcm9jZXNzQ2hpbGRyZW4pfSxkZXRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKX0sX3Byb2Nlc3NDaGlsZHJlbjpmdW5jdGlvbigpe3RoaXMuZ2V0RWZmZWN0aXZlQ2hpbGRyZW4oKS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGIuY2xhc3NMaXN0LmNvbnRhaW5zKCJzcGxpdHRlci1oYW5kbGUiKT8KKFBvbHltZXIuZG9tKGIpLnNldEF0dHJpYnV0ZSgic2xvdCIsImhhbmRsZSIpLCExKTohMH0pLmZvckVhY2goZnVuY3Rpb24oYixkKXswPT09ZD8odGhpcy5fcHJpbWFyeUNoaWxkPWIsUG9seW1lci5kb20oYikuc2V0QXR0cmlidXRlKCJzbG90IiwicHJpbWFyeSIpKToxPT1kPyh0aGlzLl9zZWNvbmRhcnlDaGlsZD1iLFBvbHltZXIuZG9tKGIpLnNldEF0dHJpYnV0ZSgic2xvdCIsInNlY29uZGFyeSIpKTpQb2x5bWVyLmRvbShiKS5yZW1vdmVBdHRyaWJ1dGUoInNsb3QiKX0uYmluZCh0aGlzKSl9LF9zZXRGbGV4QmFzaXM6ZnVuY3Rpb24oYixkLGYpe2Q9TWF0aC5tYXgoMCxNYXRoLm1pbihkLGYpKTswPT09ZCYmKGQ9MUUtNik7Yi5zdHlsZS5mbGV4PSIxIDEgIitkKyJweCJ9LF9vbkhhbmRsZVRyYWNrOmZ1bmN0aW9uKGIpe2lmKHRoaXMuX3ByaW1hcnlDaGlsZCYmdGhpcy5fc2Vjb25kYXJ5Q2hpbGQpe3ZhciBkPXRoaXMudmVydGljYWw/ImhlaWdodCI6IndpZHRoIjsic3RhcnQiPT09CmIuZGV0YWlsLnN0YXRlPyh0aGlzLl9zdGFydFNpemU9e2NvbnRhaW5lcjp0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdLXRoaXMuJC5zcGxpdHRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkXSxwcmltYXJ5OnRoaXMuX3ByaW1hcnlDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkXSxzZWNvbmRhcnk6dGhpcy5fc2Vjb25kYXJ5Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZF19LHRoaXMuX3ByZXZpb3VzUHJpbWFyeVBvaW50ZXJFdmVudHM9dGhpcy5fcHJpbWFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHMsdGhpcy5fcHJldmlvdXNTZWNvbmRhcnlQb2ludGVyRXZlbnRzPXRoaXMuX3NlY29uZGFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHMsdGhpcy5fcHJpbWFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiLHRoaXMuX3NlY29uZGFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiKTooZD10aGlzLnZlcnRpY2FsP2IuZGV0YWlsLmR5OgpiLmRldGFpbC5keCx0aGlzLl9zZXRGbGV4QmFzaXModGhpcy5fcHJpbWFyeUNoaWxkLHRoaXMuX3N0YXJ0U2l6ZS5wcmltYXJ5K2QsdGhpcy5fc3RhcnRTaXplLmNvbnRhaW5lciksdGhpcy5fc2V0RmxleEJhc2lzKHRoaXMuX3NlY29uZGFyeUNoaWxkLHRoaXMuX3N0YXJ0U2l6ZS5zZWNvbmRhcnktZCx0aGlzLl9zdGFydFNpemUuY29udGFpbmVyKSx0aGlzLm5vdGlmeVJlc2l6ZSgpLCJlbmQiPT09Yi5kZXRhaWwuc3RhdGUmJihkZWxldGUgdGhpcy5fc3RhcnRTaXplLHRoaXMuX3ByaW1hcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzPXRoaXMuX3ByZXZpb3VzUHJpbWFyeVBvaW50ZXJFdmVudHMsdGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz10aGlzLl9wcmV2aW91c1NlY29uZGFyeVBvaW50ZXJFdmVudHMpKX19LF9wcmV2ZW50RGVmYXVsdDpmdW5jdGlvbihiKXtiLnByZXZlbnREZWZhdWx0KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1xdWVyeS1wYW5lL3RmLWhwYXJhbXMtcXVlcnktcGFuZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUiLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyxjb25maWd1cmF0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHtzY2hlbWE6e2hwYXJhbUNvbHVtbnM6W10sbWV0cmljQ29sdW1uczpbXX0sY29sdW1uc1Zpc2liaWxpdHk6W10sdmlzaWJsZVNjaGVtYTp7aHBhcmFtSW5mb3M6W10sbWV0cmljSW5mb3M6W119fSkscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxzZXNzaW9uR3JvdXBzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxyZWFkT25seTohMCxub3RpZnk6ITB9LF9leHBlcmltZW50Ok9iamVjdCxfaHBhcmFtczpBcnJheSxfbWV0cmljczpBcnJheSxfc3RhdHVzZXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7dmFsdWU6IlNUQVRVU19VTktOT1dOIixkaXNwbGF5TmFtZToiVW5rbm93biIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfU1VDQ0VTUyIsZGlzcGxheU5hbWU6IlN1Y2Nlc3MiLAphbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19GQUlMVVJFIixkaXNwbGF5TmFtZToiRmFpbHVyZSIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfUlVOTklORyIsZGlzcGxheU5hbWU6IlJ1bm5pbmciLGFsbG93ZWQ6ITB9XX0sX2dldEV4cGVyaW1lbnRSZXNvbHZlZDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFByb21pc2UoYj0+e3RoaXMuX3Jlc29sdmVHZXRFeHBlcmltZW50PWJ9KX19LF9yZXNvbHZlR2V0RXhwZXJpbWVudDpGdW5jdGlvbixfbGlzdFNlc3Npb25Hcm91cHNDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuQ2FuY2VsbGVyfSxfc29ydEJ5SW5kZXg6TnVtYmVyLF9zb3J0RGlyZWN0aW9uOk51bWJlcixfcGFnZVNpemVJbnB1dDp7dHlwZTpPYmplY3QsdmFsdWU6e3ZhbHVlOiIxMDAiLGludmFsaWQ6ITF9fSxfcGFnZU51bWJlcklucHV0Ont0eXBlOk9iamVjdCx2YWx1ZTp7dmFsdWU6IjEiLGludmFsaWQ6ITF9fSwKX3BhZ2VDb3VudFN0cjp7dHlwZTpTdHJpbmcsdmFsdWU6Ij8ifSxfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHI6U3RyaW5nLF9zZXNzaW9uR3JvdXBzUmVxdWVzdDpPYmplY3R9LG9ic2VydmVyczpbIl9jb21wdXRlRXhwZXJpbWVudEFuZFJlbGF0ZWRQcm9wcyhiYWNrZW5kLCBleHBlcmltZW50TmFtZSkiLCJfdXBkYXRlQ29uZmlndXJhdGlvbihfaHBhcmFtcy4qLCBfbWV0cmljcy4qKSJdLHJlbG9hZCgpe3RoaXMuX3F1ZXJ5U2VydmVyKCl9LF9jc3ZVcmwoYixkKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCwiY3N2Iil9LF9qc29uVXJsKGIsZCl7cmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YVVybChiLGQsImpzb24iKX0sX2xhdGV4VXJsKGIsZCl7cmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YVVybChiLGQsImxhdGV4Iil9LF9kb3dubG9hZERhdGFVcmwoYixkLGYpe3JldHVybiB0aGlzLmJhY2tlbmQuZ2V0RG93bmxvYWRVcmwoZixiLGQuY29sdW1uc1Zpc2liaWxpdHkpfSwKX2NvbXB1dGVFeHBlcmltZW50QW5kUmVsYXRlZFByb3BzKCl7Y29uc3QgYj10Zi5ocGFyYW1zLnV0aWxzO2IuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5iYWNrZW5kKXx8Yi5pc051bGxPclVuZGVmaW5lZCh0aGlzLmV4cGVyaW1lbnROYW1lKXx8dGhpcy5iYWNrZW5kLmdldEV4cGVyaW1lbnQoe2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWV9KS50aGVuKGQ9PntfLmlzRXF1YWwoZCx0aGlzLl9leHBlcmltZW50KXx8KHRoaXMuc2V0KCJfZXhwZXJpbWVudCIsZCksdGhpcy5fY29tcHV0ZUhQYXJhbXMoKSx0aGlzLl9jb21wdXRlTWV0cmljcygpLHRoaXMuX3F1ZXJ5U2VydmVyKCksdGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQoKSl9KX0sX2NvbXB1dGVIUGFyYW1zKCl7Y29uc3QgYj1bXTt0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zLmZvckVhY2goKGQsZik9Pntjb25zdCBoPXtpbmZvOmQsZGlzcGxheWVkOjU+ZixmaWx0ZXI6e319O2guaW5mby5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluRGlzY3JldGUiKT8KKGguZmlsdGVyLmRvbWFpbkRpc2NyZXRlPVtdLGguaW5mby5kb21haW5EaXNjcmV0ZS5mb3JFYWNoKGs9PntoLmZpbHRlci5kb21haW5EaXNjcmV0ZS5wdXNoKHt2YWx1ZTprLGNoZWNrZWQ6ITB9KX0pKToiREFUQV9UWVBFX0JPT0wiPT09aC5pbmZvLnR5cGU/aC5maWx0ZXIuZG9tYWluRGlzY3JldGU9W3t2YWx1ZTohMSxjaGVja2VkOiEwfSx7dmFsdWU6ITAsY2hlY2tlZDohMH1dOiJEQVRBX1RZUEVfRkxPQVQ2NCI9PT1oLmluZm8udHlwZT9oLmZpbHRlci5pbnRlcnZhbD17bWluOnt2YWx1ZToiIixpbnZhbGlkOiExfSxtYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fToiREFUQV9UWVBFX1NUUklORyI9PT1oLmluZm8udHlwZT9oLmZpbHRlci5yZWdleHA9IiI6Y29uc29sZS53YXJuKCJ1bmtub3duIGhwYXJhbS5pbmZvLnR5cGU6ICVzIixoLmluZm8udHlwZSk7Yi5wdXNoKGgpfSk7dGhpcy5zZXQoIl9ocGFyYW1zIixiKX0sX2NvbXB1dGVNZXRyaWNzKCl7Y29uc3QgYj1bXTt0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zLmZvckVhY2goKGQsCmYpPT57Yi5wdXNoKHtpbmZvOmQsZmlsdGVyOntpbnRlcnZhbDp7bWluOnt2YWx1ZToiIixpbnZhbGlkOiExfSxtYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fX0sZGlzcGxheWVkOjU+Zn0pfSk7dGhpcy5zZXQoIl9tZXRyaWNzIixiKX0sX2NvbXB1dGVTY2hlbWEoKXtyZXR1cm4gdGhpcy5faHBhcmFtcyYmdGhpcy5fbWV0cmljcz97aHBhcmFtQ29sdW1uczp0aGlzLl9ocGFyYW1zLm1hcChiPT4oe2hwYXJhbUluZm86Yi5pbmZvfSkpLG1ldHJpY0NvbHVtbnM6dGhpcy5fbWV0cmljcy5tYXAoYj0+KHttZXRyaWNJbmZvOmIuaW5mb30pKX06e2hwYXJhbUNvbHVtbnM6W10sbWV0cmljQ29sdW1uczpbXX19LF91cGRhdGVDb25maWd1cmF0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX3VwZGF0ZUNvbmZpZ3VyYXRpb24iLCgpPT57dGhpcy5fc2V0Q29uZmlndXJhdGlvbih7c2NoZW1hOnRoaXMuX2NvbXB1dGVTY2hlbWEoKSxjb2x1bW5zVmlzaWJpbGl0eTp0aGlzLl9jb21wdXRlQ29sdW1uc1Zpc2liaWxpdHkoKSwKdmlzaWJsZVNjaGVtYTp0aGlzLl9jb21wdXRlVmlzaWJsZVNjaGVtYSgpfSl9KX0sX2NvbXB1dGVDb2x1bW5zVmlzaWJpbGl0eSgpe3JldHVybiB0aGlzLl9ocGFyYW1zJiZ0aGlzLl9tZXRyaWNzP3RoaXMuX2hwYXJhbXMubWFwKGI9PmIuZGlzcGxheWVkKS5jb25jYXQodGhpcy5fbWV0cmljcy5tYXAoYj0+Yi5kaXNwbGF5ZWQpKTpbXX0sX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl7aWYoIXRoaXMuX2hwYXJhbXN8fCF0aGlzLl9tZXRyaWNzKXJldHVybntocGFyYW1JbmZvczpbXSxtZXRyaWNJbmZvczpbXX07Y29uc3QgYj10aGlzLl9ocGFyYW1zLmZpbHRlcihmPT5mLmRpc3BsYXllZCkubWFwKGY9PmYuaW5mbyksZD10aGlzLl9tZXRyaWNzLmZpbHRlcihmPT5mLmRpc3BsYXllZCkubWFwKGY9PmYuaW5mbyk7cmV0dXJue2hwYXJhbUluZm9zOmIsbWV0cmljSW5mb3M6ZH19LF9xdWVyeVNlcnZlcigpe3RoaXMuZGVib3VuY2UoInF1ZXJ5U2VydmVyIiwoKT0+dGhpcy5fcXVlcnlTZXJ2ZXJOb0RlYm91bmNlKCksCjEwMCl9LF9xdWVyeVNlcnZlck5vRGVib3VuY2UoKXtyZXR1cm4gdGhpcy5fc2VuZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpLnRoZW4odGhpcy5fbGlzdFNlc3Npb25Hcm91cHNDYW5jZWxsZXIuY2FuY2VsbGFibGUoKHt2YWx1ZTpiLGNhbmNlbGxlZDpkfSk9PntkfHwoMDw9Yi50b3RhbFNpemU/KHRoaXMuc2V0KCJfcGFnZUNvdW50U3RyIixTdHJpbmcoTWF0aC5jZWlsKGIudG90YWxTaXplLyt0aGlzLl9wYWdlU2l6ZUlucHV0LnZhbHVlKSkpLHRoaXMuc2V0KCJfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHIiLGIudG90YWxTaXplKSk6KHRoaXMuc2V0KCJfcGFnZUNvdW50U3RyIiwiPyIpLHRoaXMuc2V0KCJfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHIiLCJVbmtub3duIikpLHRmLmhwYXJhbXMudXRpbHMuc2V0QXJyYXlPYnNlcnZhYmx5KHRoaXMsYi5zZXNzaW9uR3JvdXBzKSl9KSl9LF9zZW5kTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCl7Y29uc3QgYj10aGlzLl9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpOwppZihudWxsIT09YilyZXR1cm4gdGhpcy5zZXQoIl9zZXNzaW9uR3JvdXBzUmVxdWVzdCIsYiksdGhpcy5fbGlzdFNlc3Npb25Hcm91cHNDYW5jZWxsZXIuY2FuY2VsQWxsKCksdGhpcy5iYWNrZW5kLmxpc3RTZXNzaW9uR3JvdXBzKGIpfSxfYnVpbGRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKXtmdW5jdGlvbiBiKG0pe3ZhciBuPWYuZ2V0KG0rIi5taW4udmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1uKTtuPSIiPT09bj8iLUluZmluaXR5IjorbjtmLnNldChtKyIubWluLmludmFsaWQiLGlzTmFOKG4pKTtoPWgmJiFpc05hTihuKTt2YXIgcT1mLmdldChtKyIubWF4LnZhbHVlIik7Y29uc29sZS5hc3NlcnQodm9pZCAwIT09cSk7cT0iIj09PXE/IkluZmluaXR5IjorcTtmLnNldChtKyIubWF4LmludmFsaWQiLGlzTmFOKHEpKTtoPWgmJiFpc05hTihxKTtyZXR1cm4gaXNOYU4obil8fGlzTmFOKHEpP251bGw6e21pblZhbHVlOm4sbWF4VmFsdWU6cX19ZnVuY3Rpb24gZChtKXt2YXIgbj0KZi5nZXQobSsiLnZhbHVlIik7Y29uc29sZS5hc3NlcnQodm9pZCAwIT09bik7bj0rbjtjb25zdCBxPU51bWJlci5pc0ludGVnZXIobikmJjA8bjtmLnNldChtKyIuaW52YWxpZCIsIXEpO2g9aCYmcTtyZXR1cm4gcT9uOm51bGx9Y29uc3QgZj10aGlzO2xldCBoPSEwO2NvbnN0IGs9dGhpcy5fc3RhdHVzZXMuZmlsdGVyKG09Pm0uYWxsb3dlZCkubWFwKG09Pm0udmFsdWUpO2xldCB0PVtdO3RoaXMuX2hwYXJhbXMuZm9yRWFjaCgobSxuKT0+e2xldCBxPXtocGFyYW06bS5pbmZvLm5hbWV9O2lmKG0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlKXEuZmlsdGVyRGlzY3JldGU9W10sbS5maWx0ZXIuZG9tYWluRGlzY3JldGUuZm9yRWFjaCh1PT57dS5jaGVja2VkJiZxLmZpbHRlckRpc2NyZXRlLnB1c2godS52YWx1ZSl9KTtlbHNlIGlmKG0uZmlsdGVyLmludGVydmFsKXEuZmlsdGVySW50ZXJ2YWw9YigiX2hwYXJhbXMuIituKyIuZmlsdGVyLmludGVydmFsIik7ZWxzZSBpZihtLmZpbHRlci5yZWdleHApcS5maWx0ZXJSZWdleHA9Cm0uZmlsdGVyLnJlZ2V4cDtlbHNlIHJldHVybiBjb25zb2xlLmVycm9yKCJocGFyYW0uZmlsdGVyIHdpdGggbm8gZG9tYWluRGlzY3JldGUsIGludGVydmFsIG9yIHJlZ2V4cCBwcm9wZXJ0aWVzIHNldDogJXMiLG0pLG51bGw7dC5wdXNoKHEpfSk7dGhpcy5fbWV0cmljcy5mb3JFYWNoKChtLG4pPT57bT17bWV0cmljOm0uaW5mby5uYW1lLGZpbHRlckludGVydmFsOmIoIl9tZXRyaWNzLiIrbisiLmZpbHRlci5pbnRlcnZhbCIpfTt0LnB1c2gobSl9KTtpZih2b2lkIDAhPT10aGlzLl9zb3J0QnlJbmRleCYmdm9pZCAwIT09dGhpcy5fc29ydERpcmVjdGlvbil7aWYoISh0aGlzLl9zb3J0QnlJbmRleCBpbiB0KSlyZXR1cm4gY29uc29sZS5lcnJvcigiTm8gY29sdW1uIGluIGNvbFBhcmFtcyB3aXRoIGluZGV4IHNvcnRCeUluZGV4OiAlcyIsdGhpcy5fc29ydEJ5SW5kZXgpLG51bGw7dFt0aGlzLl9zb3J0QnlJbmRleF0ub3JkZXI9MD09PXRoaXMuX3NvcnREaXJlY3Rpb24/Ik9SREVSX0FTQyI6CiJPUkRFUl9ERVNDIn1jb25zdCBsPWQoIl9wYWdlTnVtYmVySW5wdXQiKSxwPWQoIl9wYWdlU2l6ZUlucHV0Iik7cmV0dXJuIGg/e2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWUsYWxsb3dlZFN0YXR1c2VzOmssY29sUGFyYW1zOnQsc3RhcnRJbmRleDpwKihsLTEpLHNsaWNlU2l6ZTpwfTpudWxsfSxfbWV0cmljU29ydEJ5SW5kZXgoYil7cmV0dXJuIGIrdGhpcy5faHBhcmFtcy5sZW5ndGh9LF9ocGFyYW1OYW1lOnRmLmhwYXJhbXMudXRpbHMuaHBhcmFtTmFtZSxfbWV0cmljTmFtZTp0Zi5ocGFyYW1zLnV0aWxzLm1ldHJpY05hbWUsX3ByZXR0eVByaW50OnRmLmhwYXJhbXMudXRpbHMucHJldHR5UHJpbnR9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXBhZ2VzL2lyb24tcGFnZXMuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1wYWdlcyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcixQb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e2FjdGl2YXRlRXZlbnQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfc2VsZWN0ZWRQYWdlQ2hhbmdlZChzZWxlY3RlZCkiXSxfc2VsZWN0ZWRQYWdlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuYXN5bmModGhpcy5ub3RpZnlSZXNpemUpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWhlYWRlci1wYW5lbC9wYXBlci1oZWFkZXItcGFuZWwuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj17c2Nyb2xsOiEwfSxkPXtzdGFuZGFyZDoyLHdhdGVyZmFsbDoxLCJ3YXRlcmZhbGwtdGFsbCI6MX0sZj17IndhdGVyZmFsbC10YWxsIjohMH07UG9seW1lcih7aXM6InBhcGVyLWhlYWRlci1wYW5lbCIscHJvcGVydGllczp7bW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YW5kYXJkIixvYnNlcnZlcjoiX21vZGVDaGFuZ2VkIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHNoYWRvdzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx0YWxsQ2xhc3M6e3R5cGU6U3RyaW5nLHZhbHVlOiJ0YWxsIn0sYXRUb3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxub3RpZnk6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sb2JzZXJ2ZXJzOlsiX2NvbXB1dGVEcm9wU2hhZG93SGlkZGVuKGF0VG9wLCBtb2RlLCBzaGFkb3cpIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hZGRMaXN0ZW5lcigpO3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZUxpc3RlbmVyKCl9LApyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsSGFuZGxlcj10aGlzLl9zY3JvbGwuYmluZCh0aGlzKTtjb25zb2xlLndhcm4odGhpcy5pcywiaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBhcHAtbGF5b3V0IGluc3RlYWQhIil9LGdldCBoZWFkZXIoKXtyZXR1cm4gUG9seW1lci5kb20odGhpcy4kLmhlYWRlclNsb3QpLmdldERpc3RyaWJ1dGVkTm9kZXMoKVswXX0sZ2V0IHNjcm9sbGVyKCl7cmV0dXJuIHRoaXMuX2dldFNjcm9sbGVyRm9yTW9kZSh0aGlzLm1vZGUpfSxnZXQgdmlzaWJsZVNoYWRvdygpe3JldHVybiB0aGlzLiQuZHJvcFNoYWRvdy5jbGFzc0xpc3QuY29udGFpbnMoImhhcy1zaGFkb3ciKX0sX2NvbXB1dGVEcm9wU2hhZG93SGlkZGVuOmZ1bmN0aW9uKGgsayl7az1kW2tdO3RoaXMuc2hhZG93P3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KToyPT09az90aGlzLnRvZ2dsZUNsYXNzKCJoYXMtc2hhZG93IiwhMCx0aGlzLiQuZHJvcFNoYWRvdyk6CjEhPT1rfHxoP3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCExLHRoaXMuJC5kcm9wU2hhZG93KTp0aGlzLnRvZ2dsZUNsYXNzKCJoYXMtc2hhZG93IiwhMCx0aGlzLiQuZHJvcFNoYWRvdyl9LF9jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzOmZ1bmN0aW9uKGgpe3ZhciBrPXt9O2suZmxleD0iY292ZXIiIT09aDtyZXR1cm4gT2JqZWN0LmtleXMoaykuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBrW3RdfSkuam9pbigiICIpfSxfYWRkTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX3JlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxlci5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuc2Nyb2xsSGFuZGxlcil9LF9tb2RlQ2hhbmdlZDpmdW5jdGlvbihoLGspe3ZhciB0PXRoaXMuaGVhZGVyO3QmJihmW2tdJiYhZltoXT8odC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMudGFsbENsYXNzKSwKdGhpcy5hc3luYyhmdW5jdGlvbigpe3QuY2xhc3NMaXN0LnJlbW92ZSgiYW5pbWF0ZSIpfSwyMDApKTp0aGlzLnRvZ2dsZUNsYXNzKCJhbmltYXRlIixmW2hdLHQpKTt0aGlzLl9rZWVwU2Nyb2xsaW5nU3RhdGUoKX0sX2tlZXBTY3JvbGxpbmdTdGF0ZTpmdW5jdGlvbigpe3ZhciBoPXRoaXMuc2Nyb2xsZXIsaz10aGlzLmhlYWRlcjt0aGlzLl9zZXRBdFRvcCgwPT09aC5zY3JvbGxUb3ApO2smJnRoaXMudGFsbENsYXNzJiZmW3RoaXMubW9kZV0mJnRoaXMudG9nZ2xlQ2xhc3ModGhpcy50YWxsQ2xhc3MsdGhpcy5hdFRvcHx8ay5jbGFzc0xpc3QuY29udGFpbnModGhpcy50YWxsQ2xhc3MpJiZoLnNjcm9sbEhlaWdodDx0aGlzLm9mZnNldEhlaWdodCxrKX0sX3Njcm9sbDpmdW5jdGlvbigpe3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpO3RoaXMuZmlyZSgiY29udGVudC1zY3JvbGwiLHt0YXJnZXQ6dGhpcy5zY3JvbGxlcn0se2J1YmJsZXM6ITF9KX0sX2dldFNjcm9sbGVyRm9yTW9kZTpmdW5jdGlvbihoKXtyZXR1cm4gYltoXT8KdGhpczp0aGlzLiQubWFpbkNvbnRhaW5lcn19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItdGFicy9wYXBlci10YWIuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGFiIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e2xpbms6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxob3N0QXR0cmlidXRlczp7cm9sZToidGFiIn0sbGlzdGVuZXJzOntkb3duOiJfdXBkYXRlTm9pbmsiLHRhcDoiX29uVGFwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVOb2luaygpfSxnZXQgX3BhcmVudE5vaW5rKCl7dmFyIGI9UG9seW1lci5kb20odGhpcykucGFyZW50Tm9kZTtyZXR1cm4hIWImJiEhYi5ub2lua30sX3VwZGF0ZU5vaW5rOmZ1bmN0aW9uKCl7dGhpcy5ub2luaz0hIXRoaXMubm9pbmt8fCEhdGhpcy5fcGFyZW50Tm9pbmt9LF9vblRhcDpmdW5jdGlvbihiKXtpZih0aGlzLmxpbmspe3ZhciBkPXRoaXMucXVlcnlFZmZlY3RpdmVDaGlsZHJlbigiYSIpOwpkJiZiLnRhcmdldCE9PWQmJmQuY2xpY2soKX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItdGFicy9wYXBlci10YWJzLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXRhYnMiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uTWVudWJhckJlaGF2aW9yXSxwcm9wZXJ0aWVzOntub2luazp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfbm9pbmtDaGFuZ2VkIn0sbm9CYXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9TbGlkZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzY3JvbGxhYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpdENvbnRhaW5lcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxkaXNhYmxlRHJhZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxoaWRlU2Nyb2xsQnV0dG9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbGlnbkJvdHRvbTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzZWxlY3RhYmxlOnt0eXBlOlN0cmluZyx2YWx1ZToicGFwZXItdGFiIn0sYXV0b3NlbGVjdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhdXRvc2VsZWN0RGVsYXk6e3R5cGU6TnVtYmVyLAp2YWx1ZTowfSxfc3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MTB9LF9ob2xkRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9sZWZ0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9yaWdodEhpZGRlbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfcHJldmlvdXNUYWI6e3R5cGU6T2JqZWN0fX0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRhYmxpc3QifSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLWl0ZW1zLWNoYW5nZWQiOiJfb25UYWJTaXppbmdDaGFuZ2VkIiwiaXJvbi1zZWxlY3QiOiJfb25Jcm9uU2VsZWN0IiwiaXJvbi1kZXNlbGVjdCI6Il9vbklyb25EZXNlbGVjdCJ9LGtleUJpbmRpbmdzOnsibGVmdDprZXl1cCByaWdodDprZXl1cCI6Il9vbkFycm93S2V5dXAifSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5faG9sZEpvYj1udWxsO3RoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dD10aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09CnZvaWQgMDt0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyPXRoaXMuX2RlbGF5ZWRBY3RpdmF0aW9uSGFuZGxlci5iaW5kKHRoaXMpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5fb25CbHVyQ2FwdHVyZS5iaW5kKHRoaXMpLCEwKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNldFNjcm9sbERpcmVjdGlvbigieSIsdGhpcy4kLnRhYnNDb250YWluZXIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2NhbmNlbFBlbmRpbmdBY3RpdmF0aW9uKCl9LF9ub2lua0NoYW5nZWQ6ZnVuY3Rpb24oYil7UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvckFsbCgicGFwZXItdGFiIikuZm9yRWFjaChiP3RoaXMuX3NldE5vaW5rQXR0cmlidXRlOnRoaXMuX3JlbW92ZU5vaW5rQXR0cmlidXRlKX0sX3NldE5vaW5rQXR0cmlidXRlOmZ1bmN0aW9uKGIpe2Iuc2V0QXR0cmlidXRlKCJub2luayIsIiIpfSxfcmVtb3ZlTm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24oYil7Yi5yZW1vdmVBdHRyaWJ1dGUoIm5vaW5rIil9LApfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzOmZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4hZHx8Zj8iaGlkZGVuIjpiPyJub3QtdmlzaWJsZSI6IiJ9LF9jb21wdXRlVGFic0NvbnRlbnRDbGFzczpmdW5jdGlvbihiLGQpe3JldHVybiBiPyJzY3JvbGxhYmxlIisoZD8iIGZpdC1jb250YWluZXIiOiIiKToiIGZpdC1jb250YWluZXIifSxfY29tcHV0ZVNlbGVjdGlvbkJhckNsYXNzOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/ImhpZGRlbiI6ZD8iYWxpZ24tYm90dG9tIjoiIn0sX29uVGFiU2l6aW5nQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoIl9vblRhYlNpemluZ0NoYW5nZWQiLGZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsKCk7dGhpcy5fdGFiQ2hhbmdlZCh0aGlzLnNlbGVjdGVkSXRlbSl9LDEwKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbihiKXt0aGlzLl90YWJDaGFuZ2VkKGIuZGV0YWlsLml0ZW0sdGhpcy5fcHJldmlvdXNUYWIpO3RoaXMuX3ByZXZpb3VzVGFiPWIuZGV0YWlsLml0ZW07CnRoaXMuY2FuY2VsRGVib3VuY2VyKCJ0YWItY2hhbmdlZCIpfSxfb25Jcm9uRGVzZWxlY3Q6ZnVuY3Rpb24oKXt0aGlzLmRlYm91bmNlKCJ0YWItY2hhbmdlZCIsZnVuY3Rpb24oKXt0aGlzLl90YWJDaGFuZ2VkKG51bGwsdGhpcy5fcHJldmlvdXNUYWIpO3RoaXMuX3ByZXZpb3VzVGFiPW51bGx9LDEpfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9hY3RpdmF0ZUhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfc2NoZWR1bGVBY3RpdmF0aW9uOmZ1bmN0aW9uKGIsZCl7dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPWI7dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuYXN5bmModGhpcy5fYmluZERlbGF5ZWRBY3RpdmF0aW9uSGFuZGxlcixkKX0sX2RlbGF5ZWRBY3RpdmF0aW9uSGFuZGxlcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbTsKdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDA7Yi5maXJlKHRoaXMuYWN0aXZhdGVFdmVudCxudWxsLHtidWJibGVzOiEwLGNhbmNlbGFibGU6ITB9KX0sX2NhbmNlbFBlbmRpbmdBY3RpdmF0aW9uOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0JiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQpLHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dD10aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09dm9pZCAwKX0sX29uQXJyb3dLZXl1cDpmdW5jdGlvbigpe3RoaXMuYXV0b3NlbGVjdCYmdGhpcy5fc2NoZWR1bGVBY3RpdmF0aW9uKHRoaXMuZm9jdXNlZEl0ZW0sdGhpcy5hdXRvc2VsZWN0RGVsYXkpfSxfb25CbHVyQ2FwdHVyZTpmdW5jdGlvbihiKXtiLnRhcmdldD09PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbSYmdGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sCmdldCBfdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZSgpe3JldHVybiBNYXRoLm1heCgwLHRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbFdpZHRoLXRoaXMuJC50YWJzQ29udGFpbmVyLm9mZnNldFdpZHRoKX0sX3Njcm9sbDpmdW5jdGlvbihiLGQpe3RoaXMuc2Nyb2xsYWJsZSYmdGhpcy5fYWZmZWN0U2Nyb2xsKGQmJi1kLmRkeHx8MCl9LF9kb3duOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX2RlZmF1bHRGb2N1c0FzeW5jJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYyksdGhpcy5fZGVmYXVsdEZvY3VzQXN5bmM9bnVsbCl9LDEpfSxfYWZmZWN0U2Nyb2xsOmZ1bmN0aW9uKGIpe3RoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQrPWI7Yj10aGlzLiQudGFic0NvbnRhaW5lci5zY3JvbGxMZWZ0O3RoaXMuX2xlZnRIaWRkZW49MD09PWI7dGhpcy5fcmlnaHRIaWRkZW49Yj09PXRoaXMuX3RhYkNvbnRhaW5lclNjcm9sbFNpemV9LApfb25MZWZ0U2Nyb2xsQnV0dG9uRG93bjpmdW5jdGlvbigpe3RoaXMuX3Njcm9sbFRvTGVmdCgpO3RoaXMuX2hvbGRKb2I9c2V0SW50ZXJ2YWwodGhpcy5fc2Nyb2xsVG9MZWZ0LmJpbmQodGhpcyksdGhpcy5faG9sZERlbGF5KX0sX29uUmlnaHRTY3JvbGxCdXR0b25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsVG9SaWdodCgpO3RoaXMuX2hvbGRKb2I9c2V0SW50ZXJ2YWwodGhpcy5fc2Nyb2xsVG9SaWdodC5iaW5kKHRoaXMpLHRoaXMuX2hvbGREZWxheSl9LF9vblNjcm9sbEJ1dHRvblVwOmZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLl9ob2xkSm9iKTt0aGlzLl9ob2xkSm9iPW51bGx9LF9zY3JvbGxUb0xlZnQ6ZnVuY3Rpb24oKXt0aGlzLl9hZmZlY3RTY3JvbGwoLXRoaXMuX3N0ZXApfSxfc2Nyb2xsVG9SaWdodDpmdW5jdGlvbigpe3RoaXMuX2FmZmVjdFNjcm9sbCh0aGlzLl9zdGVwKX0sX3RhYkNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtpZihiKXt2YXIgZj10aGlzLiQudGFic0NvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCmg9Zi53aWR0aCxrPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Zj1rLmxlZnQtZi5sZWZ0O3RoaXMuX3Bvcz17d2lkdGg6dGhpcy5fY2FsY1BlcmNlbnQoay53aWR0aCxoKSxsZWZ0OnRoaXMuX2NhbGNQZXJjZW50KGYsaCl9O2lmKHRoaXMubm9TbGlkZXx8bnVsbD09ZCl0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImV4cGFuZCIpLHRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiY29udHJhY3QiKSx0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9wb3Mud2lkdGgsdGhpcy5fcG9zLmxlZnQpO2Vsc2V7dmFyIHQ9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtkPXRoaXMuaXRlbXMuaW5kZXhPZihkKTtiPXRoaXMuaXRlbXMuaW5kZXhPZihiKTt0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5hZGQoImV4cGFuZCIpO2I9ZDxiO3RoaXMuX2lzUlRMJiYoYj0hYik7Yj90aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9jYWxjUGVyY2VudChrLmxlZnQray53aWR0aC0KdC5sZWZ0LGgpLTUsdGhpcy5fbGVmdCk6dGhpcy5fcG9zaXRpb25CYXIodGhpcy5fY2FsY1BlcmNlbnQodC5sZWZ0K3Qud2lkdGgtay5sZWZ0LGgpLTUsdGhpcy5fY2FsY1BlcmNlbnQoZixoKSs1KTt0aGlzLnNjcm9sbGFibGUmJnRoaXMuX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZChrLndpZHRoLGYpfX1lbHNlIHRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiZXhwYW5kIiksdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKDAsMCl9LF9zY3JvbGxUb1NlbGVjdGVkSWZOZWVkZWQ6ZnVuY3Rpb24oYixkKXtkLT10aGlzLiQudGFic0NvbnRhaW5lci5zY3JvbGxMZWZ0OzA+ZD90aGlzLiQudGFic0NvbnRhaW5lci5zY3JvbGxMZWZ0Kz1kOihkKz1iLXRoaXMuJC50YWJzQ29udGFpbmVyLm9mZnNldFdpZHRoLDA8ZCYmKHRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQrPWQpKX0sX2NhbGNQZXJjZW50OmZ1bmN0aW9uKGIsCmQpe3JldHVybiAxMDAqYi9kfSxfcG9zaXRpb25CYXI6ZnVuY3Rpb24oYixkKXtiPWJ8fDA7ZD1kfHwwO3RoaXMuX3dpZHRoPWI7dGhpcy5fbGVmdD1kO3RoaXMudHJhbnNmb3JtKCJ0cmFuc2xhdGVYKCIrZCsiJSkgc2NhbGVYKCIrYi8xMDArIikiLHRoaXMuJC5zZWxlY3Rpb25CYXIpfSxfb25CYXJUcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3Q7Yi5jb250YWlucygiZXhwYW5kIik/KGIucmVtb3ZlKCJleHBhbmQiKSxiLmFkZCgiY29udHJhY3QiKSx0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9wb3Mud2lkdGgsdGhpcy5fcG9zLmxlZnQpKTpiLmNvbnRhaW5zKCJjb250cmFjdCIpJiZiLnJlbW92ZSgiY29udHJhY3QiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b29sYmFyL3BhcGVyLXRvb2xiYXIuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdG9vbGJhciIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRvb2xiYXIifSxwcm9wZXJ0aWVzOntib3R0b21KdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sanVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LG1pZGRsZUp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0scmVhZHk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4odGhpcy5pcywiaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBhcHAtbGF5b3V0IGluc3RlYWQhIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXI9dGhpcy5fb2JzZXJ2ZSh0aGlzKTt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZ0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCl9LF9vYnNlcnZlOmZ1bmN0aW9uKGIpe3ZhciBkPW5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQXJpYUxhYmVsbGVkQnkoKX0uYmluZCh0aGlzKSk7CmQub2JzZXJ2ZShiLHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO3JldHVybiBkfSxfdXBkYXRlQXJpYUxhYmVsbGVkQnk6ZnVuY3Rpb24oKXtQb2x5bWVyLmRvbS5mbHVzaCgpO2Zvcih2YXIgYj1bXSxkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgic2xvdCIpKS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJjb250ZW50IikpKSxmLGg9MDtmPWRbaF07aCsrKXtmPVBvbHltZXIuZG9tKGYpLmdldERpc3RyaWJ1dGVkTm9kZXMoKTtmb3IodmFyIGssdD0wO2s9Zlt0XTt0KyspaWYoay5jbGFzc0xpc3QmJmsuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0aXRsZSIpKWlmKGsuaWQpYi5wdXNoKGsuaWQpO2Vsc2V7dmFyIGw9InBhcGVyLXRvb2xiYXItbGFiZWwtIitNYXRoLmZsb29yKDFFNCpNYXRoLnJhbmRvbSgpKTtrLmlkPWw7Yi5wdXNoKGwpfX0wPApiLmxlbmd0aCYmdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsYi5qb2luKCIgIikpfSxfY29tcHV0ZUJhckV4dHJhQ2xhc3NlczpmdW5jdGlvbihiKXtyZXR1cm4gYj9iKygianVzdGlmaWVkIj09PWI/IiI6Ii1qdXN0aWZpZWQiKToiIn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scy90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyIscHJvcGVydGllczp7Y29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxvcHRpb25zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9jb25maWd1cmF0aW9uQ2hhbmdlZChjb25maWd1cmF0aW9uLiopIiwiX3Vuc2VsZWN0RGlzYWJsZWRMb2dTY2FsZXMoc2Vzc2lvbkdyb3Vwcy4qKSJdLF9jb25maWd1cmF0aW9uQ2hhbmdlZCgpe2NvbnN0IGI9dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsZD10aGlzLmNvbmZpZ3VyYXRpb24uc2NoZW1hLGY9e2NvbHVtbnM6Yi5ocGFyYW1JbmZvcy5tYXAoKGgsayk9Pih7bmFtZTp0Zi5ocGFyYW1zLnV0aWxzLmhwYXJhbU5hbWUoaCksaW5kZXg6ayxhYnNvbHV0ZUluZGV4OnRmLmhwYXJhbXMudXRpbHMuZ2V0QWJzb2x1dGVDb2x1bW5JbmRleChkLGIsayksc2NhbGU6dGhpcy5faXNOdW1lcmljQ29sdW1uKGspPwoiTElORUFSIjoiTk9OX05VTUVSSUMifSkpLmNvbmNhdChiLm1ldHJpY0luZm9zLm1hcCgoaCxrKT0+e2srPWIuaHBhcmFtSW5mb3MubGVuZ3RoO3JldHVybntzY2FsZToiTElORUFSIixuYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZShoKSxpbmRleDprLGFic29sdXRlSW5kZXg6dGYuaHBhcmFtcy51dGlscy5nZXRBYnNvbHV0ZUNvbHVtbkluZGV4KGQsYixrKX19KSksbWluQ29sb3I6IiMwMDAwRkYiLG1heENvbG9yOiIjRkYwMDAwIixjb25maWd1cmF0aW9uOnRoaXMuY29uZmlndXJhdGlvbn07dGhpcy5zZXQoIm9wdGlvbnMiLGYpO1BvbHltZXIuZG9tLmZsdXNoKCk7dGhpcy5zZXQoIm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4Iix0aGlzLl9kZWZhdWx0Q29sb3JCeUNvbHVtbkluZGV4KCkpfSxfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcygpe251bGwhPT10aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYj0+e2NvbnN0IGQ9Im9wdGlvbnMuY29sdW1ucy4iKwpiLmluZGV4O3RoaXMuX2FsbG93TG9nU2NhbGUoYil8fCJMT0ciIT09Yi5zY2FsZXx8dGhpcy5zZXQoZCsiLnNjYWxlIiwiTElORUFSIil9KX0sX2FsbG93TG9nU2NhbGUoYil7aWYoIXRoaXMuX2lzTnVtZXJpY0NvbHVtbihiLmluZGV4KXx8IXRoaXMuc2Vzc2lvbkdyb3VwcylyZXR1cm4hMTtjb25zdCBbZCxmXT10Zi5ocGFyYW1zLnV0aWxzLnZpc2libGVOdW1lcmljQ29sdW1uRXh0ZW50KHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLHRoaXMuc2Vzc2lvbkdyb3VwcyxiLmluZGV4KTtyZXR1cm4gMDxkfHwwPmZ9LF9pc051bWVyaWNDb2x1bW4oYil7cmV0dXJuIGI+PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmxlbmd0aHx8IkRBVEFfVFlQRV9GTE9BVDY0Ij09PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zW2JdLnR5cGV9LF9kZWZhdWx0Q29sb3JCeUNvbHVtbkluZGV4KCl7aWYoMDx0aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGgpcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmxlbmd0aDsKY29uc3QgYj10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5maW5kSW5kZXgoZD0+IkRBVEFfVFlQRV9GTE9BVDY0Ij09PWQudHlwZSk7aWYoLTEhPT1iKXJldHVybiBifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWFjdGl2ZS1pdGVtLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkFjdGl2ZUl0ZW1CZWhhdmlvcj17cHJvcGVydGllczp7YWN0aXZlSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHZhbHVlOm51bGx9fSxsaXN0ZW5lcnM6eyJjZWxsLWFjdGl2YXRlIjoiX2FjdGl2YXRlSXRlbSJ9LG9ic2VydmVyczpbIl9hY3RpdmVJdGVtQ2hhbmdlZChhY3RpdmVJdGVtKSJdLF9hY3RpdmF0ZUl0ZW06ZnVuY3Rpb24oYil7dmFyIGQ9Yi5kZXRhaWwubW9kZWwuaXRlbTt0aGlzLmFjdGl2ZUl0ZW09dGhpcy5hY3RpdmVJdGVtIT09ZD9kOm51bGw7Yi5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0sX2FjdGl2ZUl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zJiZ0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLl91cGRhdGVJdGVtKGIsYi5pdGVtKX0uYmluZCh0aGlzKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1zY3JvbGwtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e192aWR4T2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowfSxpb3M6e3R5cGU6Qm9vbGVhbix2YWx1ZTpuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZml4ZWRTZWN0aW9uczp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxjb21wdXRlZDoiX2hhc0ZpeGVkU2VjdGlvbnMoc2Nyb2xsYmFyV2lkdGgpIn0sX2Zyb3plbkNlbGxzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxzY3JvbGxpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsVGFyZ2V0PXRoaXMuJC50YWJsZX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmxpc3Rlbih0aGlzLnNjcm9sbFRhcmdldCwid2hlZWwiLAoiX29uV2hlZWwiKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMuc2Nyb2xsVGFyZ2V0LCJ3aGVlbCIsIl9vbldoZWVsIil9LHNjcm9sbFRvU2NhbGVkSW5kZXg6ZnVuY3Rpb24oYil7dGhpcy5fcGVuZGluZ1Njcm9sbFRvU2NhbGVkSW5kZXg9bnVsbDt0aGlzLiQuaXRlbXMuc3R5bGUuYm9yZGVyVG9wV2lkdGh8fCh0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleD1iKTtiPU1hdGgubWluKE1hdGgubWF4KGIsMCksdGhpcy5zaXplLTEpO3RoaXMuJC50YWJsZS5zY3JvbGxUb3A9Yi90aGlzLnNpemUqdGhpcy4kLnRhYmxlLnNjcm9sbEhlaWdodDt0aGlzLl9zY3JvbGxIYW5kbGVyKCk7dGhpcy5zY3JvbGxUb0luZGV4KGItdGhpcy5fdmlkeE9mZnNldCk7dGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9zY3JvbGxQb3NpdGlvbik7dGhpcy5fc2Nyb2xsSGFuZGxlcigpO3RoaXMuX3ZpZHhPZmZzZXQrdGhpcy5sYXN0VmlzaWJsZUluZGV4PT09dGhpcy5zaXplLQoxJiYodGhpcy4kLnRhYmxlLnNjcm9sbFRvcD10aGlzLiQudGFibGUuc2Nyb2xsSGVpZ2h0LXRoaXMuJC50YWJsZS5vZmZzZXRIZWlnaHQsdGhpcy5fc2Nyb2xsSGFuZGxlcigpKX0sX2hhc0ZpeGVkU2VjdGlvbnM6ZnVuY3Rpb24oYil7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0VkZ2UvKSYmMD09PWJ9LF9vbldoZWVsOmZ1bmN0aW9uKGIpe2lmKCFiLmN0cmxLZXkmJiF0aGlzLl9oYXNTY3JvbGxlZEFuY2VzdG9yKGIudGFyZ2V0LGIuZGVsdGFYLGIuZGVsdGFZKSl7dmFyIGQ9dGhpcy4kLnRhYmxlLGY9Yi5kZWx0YVk7MT09PWIuZGVsdGFNb2RlJiYoZio9Z3JpZC4kLnNjcm9sbGVyLl9waHlzaWNhbEF2ZXJhZ2UpO3ZhciBoPU1hdGguYWJzKGIuZGVsdGFYKStNYXRoLmFicyhmKTt0aGlzLl9jYW5TY3JvbGwoZCxiLmRlbHRhWCxmKT8oYi5wcmV2ZW50RGVmYXVsdCgpLGQuc2Nyb2xsVG9wKz1mLGQuc2Nyb2xsTGVmdCs9Yi5kZWx0YVgsdGhpcy5fc2Nyb2xsSGFuZGxlcigpLAp0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtPSEwLHRoaXMuX2lnbm9yZU5ld1doZWVsPXRoaXMuZGVib3VuY2UoImlnbm9yZS1uZXctd2hlZWwiLGZ1bmN0aW9uKCl7dGhpcy5faWdub3JlTmV3V2hlZWw9bnVsbH0sNTAwKSk6dGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bSYmaDw9dGhpcy5fcHJldmlvdXNNb21lbnR1bXx8dGhpcy5faWdub3JlTmV3V2hlZWw/Yi5wcmV2ZW50RGVmYXVsdCgpOmg+dGhpcy5fcHJldmlvdXNNb21lbnR1bSYmKHRoaXMuX2hhc1Jlc2lkdWFsTW9tZW50dW09ITEpO3RoaXMuX3ByZXZpb3VzTW9tZW50dW09aH19LF9oYXNTY3JvbGxlZEFuY2VzdG9yOmZ1bmN0aW9uKGIsZCxmKXtpZih0aGlzLl9jYW5TY3JvbGwoYixkLGYpKXJldHVybiEwO2lmKCJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiIT09Yi5sb2NhbE5hbWUmJmIhPT10aGlzJiZiLnBhcmVudEVsZW1lbnQpcmV0dXJuIHRoaXMuX2hhc1Njcm9sbGVkQW5jZXN0b3IoYi5wYXJlbnRFbGVtZW50LGQsZil9LApfY2FuU2Nyb2xsOmZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4gMDxmJiZiLnNjcm9sbFRvcDxiLnNjcm9sbEhlaWdodC1iLm9mZnNldEhlaWdodHx8MD5mJiYwPGIuc2Nyb2xsVG9wfHwwPGQmJmIuc2Nyb2xsTGVmdDxiLnNjcm9sbFdpZHRoLWIub2Zmc2V0V2lkdGh8fDA+ZCYmMDxiLnNjcm9sbExlZnR9LF9zY3JvbGxIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGI9TWF0aC5tYXgoMCxNYXRoLm1pbih0aGlzLl9tYXhTY3JvbGxUb3AsdGhpcy5fc2Nyb2xsVG9wKSksZD1iLXRoaXMuX3Njcm9sbFBvc2l0aW9uLGY9dGhpcy5fcmF0aW8saD0wLGs9dGhpcy5faGlkZGVuQ29udGVudFNpemUsdD1mLGw9W107dGhpcy5fc2Nyb2xsUG9zaXRpb249Yjt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGw7dmFyIHA9dGhpcy5fc2Nyb2xsQm90dG9tO3ZhciBtPXRoaXMuX3BoeXNpY2FsQm90dG9tO2lmKE1hdGguYWJzKGQpPnRoaXMuX3BoeXNpY2FsU2l6ZSl0aGlzLl9waHlzaWNhbFRvcCs9CmQsaD1NYXRoLnJvdW5kKGQvdGhpcy5fcGh5c2ljYWxBdmVyYWdlKTtlbHNlIGlmKDA+ZCl7dmFyIG49Yi10aGlzLl9waHlzaWNhbFRvcDtsPXRoaXMuX3ZpcnR1YWxTdGFydDt2YXIgcT1bXTt2YXIgdT10aGlzLl9waHlzaWNhbEVuZDtmb3IodD1uL2s7dDxmJiZoPHRoaXMuX3BoeXNpY2FsQ291bnQmJjA8bC1oJiZtLXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh1KT5wOyluPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh1KSx0Kz1uL2ssbS09bixxLnB1c2godSksaCsrLHU9MD09PXU/dGhpcy5fcGh5c2ljYWxDb3VudC0xOnUtMTtsPXE7aD0taH1lbHNlIGlmKDA8ZCl7dmFyIHg9dGhpcy5fdmlydHVhbEVuZCxBPXRoaXMuX3ZpcnR1YWxDb3VudC0xO3E9W107dT10aGlzLl9waHlzaWNhbFN0YXJ0O2Zvcih0PShtLXApL2s7dDxmJiZoPHRoaXMuX3BoeXNpY2FsQ291bnQmJngraDxBJiZ0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodSk8CmI7KW49dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpLHQrPW4vayx0aGlzLl9waHlzaWNhbFRvcCs9bixxLnB1c2godSksaCsrLHU9KHUrMSkldGhpcy5fcGh5c2ljYWxDb3VudH10aGlzLl92aXJ0dWFsQ291bnQ8dGhpcy5zaXplJiZ0aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQoZCk7MD09PWg/KG08cHx8dGhpcy5fcGh5c2ljYWxUb3A+YikmJnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCk6KHRoaXMuX3ZpcnR1YWxTdGFydCs9aCx0aGlzLl9waHlzaWNhbFN0YXJ0Kz1oLHRoaXMuX3VwZGF0ZShxLGwpKTt0aGlzLl90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKTt0aGlzLmhhc0F0dHJpYnV0ZSgicmVvcmRlcmluZyIpfHwodGhpcy5zY3JvbGxpbmc9ITApO3RoaXMuZGVib3VuY2UoInZhYWRpbi1ncmlkLXNjcm9sbGluZyIsZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGluZz0hMTt0aGlzLl9yZW9yZGVyUm93cygpfSwxMDApfSxfYWRqdXN0VmlydHVhbEluZGV4T2Zmc2V0OmZ1bmN0aW9uKGIpe2lmKDFFNDwKTWF0aC5hYnMoYikpdGhpcy5fbm9TY2FsZT90aGlzLl9ub1NjYWxlPSExOihiPU1hdGgucm91bmQodGhpcy5fc2Nyb2xsUG9zaXRpb24vdGhpcy5fc2Nyb2xsSGVpZ2h0KjFFMykvMUUzLHRoaXMuX3ZpZHhPZmZzZXQ9TWF0aC5yb3VuZChiKnRoaXMuc2l6ZS1iKnRoaXMuX3ZpcnR1YWxDb3VudCksMD09PXRoaXMuX3Njcm9sbFRvcCYmdGhpcy5zY3JvbGxUb0luZGV4KDApKTtlbHNle2I9dGhpcy5fdmlkeE9mZnNldHx8MDswPT09dGhpcy5fc2Nyb2xsVG9wPyh0aGlzLl92aWR4T2Zmc2V0PTAsYiE9PXRoaXMuX3ZpZHhPZmZzZXQmJnRoaXMuc2Nyb2xsVG9JbmRleCgwKSk6MUUzPnRoaXMuZmlyc3RWaXNpYmxlSW5kZXgmJjA8dGhpcy5fdmlkeE9mZnNldCYmKHRoaXMuX3ZpZHhPZmZzZXQtPU1hdGgubWluKHRoaXMuX3ZpZHhPZmZzZXQsMTAwKSx0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5maXJzdFZpc2libGVJbmRleCsoYi10aGlzLl92aWR4T2Zmc2V0KSsxKSx0aGlzLl9ub1NjYWxlPQohMCk7dmFyIGQ9dGhpcy5zaXplLXRoaXMuX3ZpcnR1YWxDb3VudDt0aGlzLl9zY3JvbGxUb3A+PXRoaXMuX21heFNjcm9sbFRvcD8odGhpcy5fdmlkeE9mZnNldD1kLGIhPT10aGlzLl92aWR4T2Zmc2V0JiZ0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5fdmlydHVhbENvdW50KSk6dGhpcy5maXJzdFZpc2libGVJbmRleD50aGlzLl92aXJ0dWFsQ291bnQtMUUzJiZ0aGlzLl92aWR4T2Zmc2V0PGQmJih0aGlzLl92aWR4T2Zmc2V0Kz1NYXRoLm1pbihkLXRoaXMuX3ZpZHhPZmZzZXQsMTAwKSx0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5maXJzdFZpc2libGVJbmRleC0odGhpcy5fdmlkeE9mZnNldC1iKSksdGhpcy5fbm9TY2FsZT0hMCl9fSxfcmVvcmRlclJvd3M6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzLiQuaXRlbXMpLGQ9Yi5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93IiksZj1kLmxlbmd0aC0oZFswXS5pbmRleC0odGhpcy5fdmlydHVhbFN0YXJ0K3RoaXMuX3ZpZHhPZmZzZXQpKTsKaWYoZjxkLmxlbmd0aC8yKWZvcih2YXIgaD0wO2g8ZjtoKyspYi5hcHBlbmRDaGlsZChkW2hdKTtlbHNlIGZvcig7ZjxkLmxlbmd0aDtmKyspYi5pbnNlcnRCZWZvcmUoZFtmXSxkWzBdKX0sX2Zyb3plbkNlbGxzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoImNhY2hlLWVsZW1lbnRzIixmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLmZvckVhY2goZnVuY3Rpb24oYil7Yi5zdHlsZS50cmFuc2Zvcm09IiJ9KTt0aGlzLl9mcm96ZW5DZWxscz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLmRvbUhvc3Qucm9vdCkucXVlcnlTZWxlY3RvckFsbCgiW2Zyb3plbl0iKSk7dGhpcy5fdHJhbnNsYXRlU3RhdGlvbmFyeUVsZW1lbnRzKCl9KTt0aGlzLl91cGRhdGVMYXN0RnJvemVuKCl9LF91cGRhdGVMYXN0RnJvemVuOmZ1bmN0aW9uKCl7aWYodGhpcy5jb2x1bW5UcmVlKXt2YXIgYj0KdGhpcy5jb2x1bW5UcmVlW3RoaXMuY29sdW1uVHJlZS5sZW5ndGgtMV0uc2xpY2UoMCk7Yi5zb3J0KGZ1bmN0aW9uKGYsaCl7cmV0dXJuIGYuX29yZGVyLWguX29yZGVyfSk7dmFyIGQ9Yi5yZWR1Y2UoZnVuY3Rpb24oZixoLGspe2guX2xhc3RGcm96ZW49ITE7cmV0dXJuIGguZnJvemVuJiYhaC5oaWRkZW4/azpmfSx2b2lkIDApO3ZvaWQgMCE9PWQmJihiW2RdLl9sYXN0RnJvemVuPSEwKX19LF90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHM6ZnVuY3Rpb24oKXt0aGlzLmZpeGVkU2VjdGlvbnM/KHRoaXMuJC5pdGVtcy5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKC10aGlzLl9zY3JvbGxMZWZ0fHwwLC10aGlzLl9zY3JvbGxUb3B8fDApLHRoaXMuJC5mb290ZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuJC5oZWFkZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuX2dldFRyYW5zbGF0ZSgtdGhpcy5fc2Nyb2xsTGVmdHx8MCwwKSk6dGhpcy4kLmZvb3Rlci5zdHlsZS50cmFuc2Zvcm09CnRoaXMuJC5oZWFkZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuX2dldFRyYW5zbGF0ZSgwLHRoaXMuX3Njcm9sbFRvcCk7Zm9yKHZhciBiPXRoaXMuX2dldFRyYW5zbGF0ZSh0aGlzLl9zY3JvbGxMZWZ0LDApLGQ9MDtkPHRoaXMuX2Zyb3plbkNlbGxzLmxlbmd0aDtkKyspdGhpcy5fZnJvemVuQ2VsbHNbZF0uc3R5bGUudHJhbnNmb3JtPWJ9LF9nZXRUcmFuc2xhdGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4idHJhbnNsYXRlKCIrYisicHgsIitkKyJweCkifX07dmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvcj1bUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNlbGwtY2xpY2stYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3I9e2xpc3RlbmVyczp7Y2xpY2s6Il9vbkNsaWNrIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jZWxsQ29udGVudEZvY3VzSGFuZGxlcj1mdW5jdGlvbihiKXtiLnRhcmdldCE9PXRoaXMuX2NlbGxDb250ZW50JiZ0aGlzLmZpcmUoImNlbGwtY29udGVudC1mb2N1cyIse2NlbGw6dGhpc30pfS5iaW5kKHRoaXMpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyLCEwKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9jZWxsQ29udGVudEZvY3VzSGFuZGxlciwhMCl9LF9vbkNsaWNrOmZ1bmN0aW9uKGIpeyJ2YWFkaW4tZ3JpZC1zb3J0ZXIiIT09dGhpcy5sb2NhbE5hbWUmJnRoaXMuZmlyZSgiY2VsbC1mb2N1cyIse2NlbGw6dGhpc30pO2lmKHRoaXMuX2NlbGxDbGljayl7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7CmQuZ2V0RGlzdHJpYnV0ZWROb2RlcyYmKGQ9UG9seW1lci5kb20oZCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdKTt2YXIgZj1Qb2x5bWVyLmRvbShiKS5wYXRoO2Y9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZiwwLGYuaW5kZXhPZihkKSsxKTtkLmNvbnRhaW5zKHRoaXMudGFyZ2V0JiZ0aGlzLnRhcmdldC5yb290LmFjdGl2ZUVsZW1lbnR8fGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpfHxmLnNvbWUodGhpcy5faXNGb2N1c2FibGUpfHx0aGlzLl9jZWxsQ2xpY2soYil9fSxfaXNGb2N1c2FibGU6ZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20oYikucGFyZW50Tm9kZTtkPS0xIT09QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChQb2x5bWVyLmRvbShkKS5xdWVyeVNlbGVjdG9yQWxsKCJbdGFiaW5kZXhdLCBidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBvYmplY3QsIGlmcmFtZSwgbGFiZWwsIGFbaHJlZl0sIGFyZWFbaHJlZl0iKSxiKTtyZXR1cm4hYi5kaXNhYmxlZCYmCmR9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1jZWxsLmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9e3Byb3BlcnRpZXM6e2NvbHVtbjpPYmplY3QsZXhwYW5kZWQ6Qm9vbGVhbixmbGV4R3JvdzpOdW1iZXIsY29sU3BhbjpOdW1iZXIsZm9jdXNlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZnJvemVuOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxsYXN0RnJvemVuOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxoaWRkZW46e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGluc3RhbmNlOk9iamVjdCxpbmRleDpOdW1iZXIsaXRlbTpPYmplY3Qsc2VsZWN0ZWQ6Qm9vbGVhbix0ZW1wbGF0ZTpPYmplY3QsdGFyZ2V0Ok9iamVjdCx3aWR0aDpTdHJpbmcsb3JkZXI6TnVtYmVyLHJlb3JkZXJTdGF0dXM6e3R5cGU6U3RyaW5nLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2NoaWxkQ29sdW1uczpBcnJheSxfY2VsbENvbnRlbnQ6T2JqZWN0LF9pbnNlcnRpb25Qb2ludDpPYmplY3QsCl90ZW1wbGF0aXplcjpPYmplY3R9LG9ic2VydmVyczoiX2NvbHVtbkNoYW5nZWQoY29sdW1uKTtfY2VsbEF0dGFjaGVkKGNvbHVtbiwgaXNBdHRhY2hlZCk7X2V4cGFuZGVkQ2hhbmdlZChleHBhbmRlZCwgaW5zdGFuY2UpO19mbGV4R3Jvd0NoYW5nZWQoZmxleEdyb3cpO19pbmRleENoYW5nZWQoaW5kZXgsIGluc3RhbmNlKTtfaXRlbUNoYW5nZWQoaXRlbSwgaW5zdGFuY2UpO19pbnN0YW5jZUNoYW5nZWQoaW5zdGFuY2UsIHRhcmdldCk7X3NlbGVjdGVkQ2hhbmdlZChzZWxlY3RlZCwgaW5zdGFuY2UpO190b2dnbGVDb250ZW50KGlzQXR0YWNoZWQsIF9jZWxsQ29udGVudCwgX2luc2VydGlvblBvaW50KTtfdG9nZ2xlSW5zdGFuY2UoaXNBdHRhY2hlZCwgX3RlbXBsYXRpemVyLCBpbnN0YW5jZSk7X3dpZHRoQ2hhbmdlZCh3aWR0aCk7X29yZGVyQ2hhbmdlZChvcmRlcik7X3Zpc2libGVDaGlsZENvbHVtbnNDaGFuZ2VkKF92aXNpYmxlQ2hpbGRDb2x1bW5zKTtfY2hpbGRDb2x1bW5zQ2hhbmdlZChfY2hpbGRDb2x1bW5zKSIuc3BsaXQoIjsiKSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkLWNlbGwiKTshMT09PVBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93JiYodGhpcy5jbGFzc0xpc3QuYWRkKCJzdHlsZS1zY29wZSIpLHRoaXMuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQiKSl9LF9jb2x1bW5DaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMuZmxleEdyb3c9ZC5mbGV4R3Jvdzt0aGlzLmZyb3plbj1kLmZyb3plbjt0aGlzLmxhc3RGcm96ZW49ZC5fbGFzdEZyb3plbjt0aGlzLmhlYWRlclRlbXBsYXRlPWQuaGVhZGVyVGVtcGxhdGU7dGhpcy5mb290ZXJUZW1wbGF0ZT1kLmZvb3RlclRlbXBsYXRlO3RoaXMudGVtcGxhdGU9ZC50ZW1wbGF0ZTt0aGlzLndpZHRoPWQud2lkdGg7dGhpcy5oaWRkZW49ZC5oaWRkZW47dGhpcy5yZXNpemFibGU9ZC5yZXNpemFibGU7dGhpcy5fY2hpbGRDb2x1bW5zPWQuX2NoaWxkQ29sdW1uczt0aGlzLm9yZGVyPWQuX29yZGVyO2QuY29sU3BhbiYmKHRoaXMuY29sU3Bhbj0KZC5jb2xTcGFuKTt0aGlzLmxpc3RlbihkLCJwcm9wZXJ0eS1jaGFuZ2VkIiwiX2NvbHVtblByb3BDaGFuZ2VkIil9LF9jZWxsQXR0YWNoZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYoZj90aGlzLmxpc3RlbihkLCJwcm9wZXJ0eS1jaGFuZ2VkIiwiX2NvbHVtblByb3BDaGFuZ2VkIik6dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuaXNBdHRhY2hlZHx8dGhpcy51bmxpc3RlbihkLCJwcm9wZXJ0eS1jaGFuZ2VkIiwiX2NvbHVtblByb3BDaGFuZ2VkIil9KSl9LF9jb2x1bW5Qcm9wQ2hhbmdlZDpmdW5jdGlvbihkKXtkLnRhcmdldD09dGhpcy5jb2x1bW4mJih0aGlzW2QuZGV0YWlsLnBhdGhdPWQuZGV0YWlsLnZhbHVlKX0sX2V4cGFuZGVkQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihmLl9fZXhwYW5kZWRfXz1kLGYuZXhwYW5kZWQ9ZCl9LF9mbGV4R3Jvd0NoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5zdHlsZS5mbGV4R3Jvdz0KZH0sX2luZGV4Q2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihmLmluZGV4PWQpfSxfaXRlbUNoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYoZi5pdGVtPWQpfSxfc2VsZWN0ZWRDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGYuX19zZWxlY3RlZF9fPWQsZi5zZWxlY3RlZD1kKX0sX2NoaWxkQ29sdW1uc0NoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5jb2xTcGFuPWQubGVuZ3RofSxfdG9nZ2xlQ29udGVudDpmdW5jdGlvbihkLGYsaCl7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmdm9pZCAwIT09aCYmKGQ/KFBvbHltZXIuZG9tKGYpLnBhcmVudE5vZGUhPT10aGlzLnRhcmdldCYmUG9seW1lci5kb20odGhpcy50YXJnZXQpLmFwcGVuZENoaWxkKGYpLFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGgpKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkfHxQb2x5bWVyLmRvbShmKS5wYXJlbnROb2RlIT09CnRoaXMudGFyZ2V0fHxQb2x5bWVyLmRvbSh0aGlzLnRhcmdldCkucmVtb3ZlQ2hpbGQoZil9KSl9LF90b2dnbGVJbnN0YW5jZTpmdW5jdGlvbihkLGYsaCl7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmdm9pZCAwIT09aCYmKGQ/Zi5hZGRJbnN0YW5jZShoKTpmLnJlbW92ZUluc3RhbmNlKGgpKX0sX3dpZHRoQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLnN0eWxlLndpZHRoPWR9LF9vcmRlckNoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5zdHlsZS5vcmRlcj1kfSxfdGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMuaW5zdGFuY2U9ZC50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpO3RoaXMuX3RlbXBsYXRpemVyPWQudGVtcGxhdGl6ZXJ9LF9pbnN0YW5jZUNoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYodGhpcy5zdHlsZS5oZWlnaHQ9IiIsdGhpcy5fY2VsbENvbnRlbnQ9dGhpcy5fY2VsbENvbnRlbnR8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCIpLApkPSJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQtIisodmFhZGluLmVsZW1lbnRzLmdyaWQuX2NvbnRlbnRJbmRleD12YWFkaW4uZWxlbWVudHMuZ3JpZC5fY29udGVudEluZGV4KzF8fDApLHRoaXMuX2NlbGxDb250ZW50LmlubmVySFRNTD0iIixQb2x5bWVyLmRvbSh0aGlzLl9jZWxsQ29udGVudCkuYXBwZW5kQ2hpbGQodGhpcy5pbnN0YW5jZS5yb290KSx0aGlzLl9jZWxsQ29udGVudC5zZXRBdHRyaWJ1dGUoImlkIixkKSxQb2x5bWVyLkVsZW1lbnQ/KHRoaXMuX2NlbGxDb250ZW50LnNldEF0dHJpYnV0ZSgic2xvdCIsZCksdGhpcy5faW5zZXJ0aW9uUG9pbnQ9dGhpcy5faW5zZXJ0aW9uUG9pbnR8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNsb3QiKSx0aGlzLl9pbnNlcnRpb25Qb2ludC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGQpKToodGhpcy5faW5zZXJ0aW9uUG9pbnQ9dGhpcy5faW5zZXJ0aW9uUG9pbnR8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNvbnRlbnQiKSx0aGlzLl9pbnNlcnRpb25Qb2ludC5zZXRBdHRyaWJ1dGUoInNlbGVjdCIsCiIjIitkKSkpfX07UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWNlbGwiLGJlaGF2aW9yczpbYix2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX3RlbXBsYXRlQ2hhbmdlZCh0ZW1wbGF0ZSkiXSxfY2VsbENsaWNrOmZ1bmN0aW9uKGQpe2QuZGVmYXVsdFByZXZlbnRlZHx8dGhpcy5maXJlKCJjZWxsLWFjdGl2YXRlIix7bW9kZWw6dGhpcy5pbnN0YW5jZX0pfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItY2VsbCIscHJvcGVydGllczp7aGVhZGVyVGVtcGxhdGU6T2JqZWN0LHJlc2l6YWJsZTpCb29sZWFuLGNvbHVtblJlc2l6aW5nOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sYmVoYXZpb3JzOltiLHZhYWRpbi5lbGVtZW50cy5ncmlkLkNlbGxDbGlja0JlaGF2aW9yXSxvYnNlcnZlcnM6WyJfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkKGhlYWRlclRlbXBsYXRlKSIsIl9pc0VtcHR5Q2hhbmdlZChfaXNFbXB0eSwgaXNBdHRhY2hlZCkiLAoiX3Jlc2l6YWJsZUNoYW5nZWQocmVzaXphYmxlKSJdLGxpc3RlbmVyczp7bW91c2Vkb3duOiJfY2FuY2VsTW91c2VEb3duT25SZXNpemUiLG1vdXNlbW92ZToiX2VuYWJsZURyYWciLG1vdXNlb3V0OiJfZGlzYWJsZURyYWciLHRvdWNoc3RhcnQ6Il9vblRvdWNoU3RhcnQiLHRvdWNobW92ZToiX29uVG91Y2hNb3ZlIix0b3VjaGVuZDoiX29uVG91Y2hFbmQiLGNvbnRleHRtZW51OiJfb25Db250ZXh0TWVudSJ9LF9vbkNvbnRleHRNZW51OmZ1bmN0aW9uKGQpe3RoaXMuX3Jlb3JkZXJHaG9zdCYmZC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Ub3VjaFN0YXJ0OmZ1bmN0aW9uKGQpe2QudGFyZ2V0IT09dGhpcy5fcmVzaXplSGFuZGxlJiZ0aGlzLnRhcmdldC5jb2x1bW5SZW9yZGVyaW5nQWxsb3dlZCYmKHRoaXMuX3N0YXJ0UmVvcmRlclRpbWVvdXQ9c2V0VGltZW91dCh0aGlzLl9zdGFydFJlb3JkZXIuYmluZCh0aGlzLGQpLDEwMCkpfSxfc3RhcnRSZW9yZGVyOmZ1bmN0aW9uKGQpe3RoaXMuX3Jlb3JkZXJHaG9zdD0KdGhpcy5fZ2V0R2hvc3QoKTt0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSI7dmFyIGY9bmV3IEN1c3RvbUV2ZW50KCJkcmFnc3RhcnQiLHtidWJibGVzOiEwfSk7dGhpcy5fY2VsbENvbnRlbnQuZGlzcGF0Y2hFdmVudChmKTt0aGlzLl9yZW9yZGVyWFk9e3g6ZC50b3VjaGVzWzBdLmNsaWVudFgtdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LHk6ZC50b3VjaGVzWzBdLmNsaWVudFktdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3B9O3RoaXMuX3VwZGF0ZUdob3N0UG9zaXRpb24oZC50b3VjaGVzWzBdLmNsaWVudFgsZC50b3VjaGVzWzBdLmNsaWVudFkpfSxfb25Ub3VjaE1vdmU6ZnVuY3Rpb24oZCl7aWYodGhpcy5fcmVvcmRlckdob3N0KXtkLnByZXZlbnREZWZhdWx0KCk7dmFyIGY9bmV3IEN1c3RvbUV2ZW50KCJkcmFnb3ZlciIse2J1YmJsZXM6ITB9KTtmLmNsaWVudFg9ZC50b3VjaGVzWzBdLmNsaWVudFg7Zi5jbGllbnRZPQpkLnRvdWNoZXNbMF0uY2xpZW50WTt2YXIgaD10aGlzLl9jb250ZW50RnJvbVBvaW50KGYuY2xpZW50WCxmLmNsaWVudFkpO2gmJmguZGlzcGF0Y2hFdmVudChmKTt0aGlzLl91cGRhdGVHaG9zdFBvc2l0aW9uKGQudG91Y2hlc1swXS5jbGllbnRYLGQudG91Y2hlc1swXS5jbGllbnRZKX1lbHNlIGNsZWFyVGltZW91dCh0aGlzLl9zdGFydFJlb3JkZXJUaW1lb3V0KX0sX3VwZGF0ZUdob3N0UG9zaXRpb246ZnVuY3Rpb24oZCxmKXtkLT10aGlzLl9yZW9yZGVyWFkueDtmPWYtdGhpcy5fcmVvcmRlclhZLnktNTA7dmFyIGg9cGFyc2VJbnQodGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLmxlZnR8fDApLGs9cGFyc2VJbnQodGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnRvcHx8MCksdD10aGlzLl9yZW9yZGVyR2hvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLmxlZnQ9aC0odC5sZWZ0LWQpKyJweCI7dGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnRvcD0Kay0odC50b3AtZikrInB4In0sX29uVG91Y2hFbmQ6ZnVuY3Rpb24oZCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3N0YXJ0UmVvcmRlclRpbWVvdXQpO3RoaXMuX3Jlb3JkZXJHaG9zdCYmKGQucHJldmVudERlZmF1bHQoKSxkPW5ldyBDdXN0b21FdmVudCgiZHJhZ2VuZCIse2J1YmJsZXM6ITB9KSx0aGlzLmRpc3BhdGNoRXZlbnQoZCksdGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsdGhpcy5fcmVvcmRlckdob3N0PW51bGwpfSxfY29udGVudEZyb21Qb2ludDpmdW5jdGlvbihkLGYpe2lmKFBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93KXt2YXIgaD10aGlzLnRhcmdldC4kLnNjcm9sbGVyO2gudG9nZ2xlQXR0cmlidXRlKCJuby1jb250ZW50LXBvaW50ZXItZXZlbnRzIiwhMCk7ZD10aGlzLmRvbUhvc3Qucm9vdC5lbGVtZW50RnJvbVBvaW50KGQsZik7aC50b2dnbGVBdHRyaWJ1dGUoIm5vLWNvbnRlbnQtcG9pbnRlci1ldmVudHMiLCExKTtpZihkJiZkLmdldENvbnRlbnRDaGlsZHJlbilyZXR1cm4gZC5nZXRDb250ZW50Q2hpbGRyZW4oUG9seW1lci5FbGVtZW50Pwoic2xvdCI6ImNvbnRlbnQiKVswXX1lbHNlIHJldHVybiBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGQsZil9LF9nZXRHaG9zdDpmdW5jdGlvbigpe3ZhciBkPXRoaXMudGFyZ2V0LiQuc2Nyb2xsZXIuJC5yZW9yZGVyZ2hvc3Q7ZC5pbm5lclRleHQ9dGhpcy5fY2VsbENvbnRlbnQuaW5uZXJUZXh0O3ZhciBmPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX2NlbGxDb250ZW50KTsiYm94U2l6aW5nIGRpc3BsYXkgd2lkdGggaGVpZ2h0IGJhY2tncm91bmQgYWxpZ25JdGVtcyBwYWRkaW5nIGJvcmRlciBmbGV4LWRpcmVjdGlvbiBvdmVyZmxvdyIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGgpe2Quc3R5bGVbaF09ZltoXX0sdGhpcyk7cmV0dXJuIGR9LF9lbmFibGVEcmFnOmZ1bmN0aW9uKCl7dGhpcy5fY2VsbENvbnRlbnQuZHJhZ2dhYmxlPXRoaXMudGFyZ2V0LmNvbHVtblJlb3JkZXJpbmdBbGxvd2VkJiYhd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCl9LF9kaXNhYmxlRHJhZzpmdW5jdGlvbigpe3RoaXMuX2NlbGxDb250ZW50LmRyYWdnYWJsZT0KITF9LF9jYW5jZWxNb3VzZURvd25PblJlc2l6ZTpmdW5jdGlvbihkKXtkLnRhcmdldD09PXRoaXMuX3Jlc2l6ZUhhbmRsZSYmZC5wcmV2ZW50RGVmYXVsdCgpfSxfcmVzaXphYmxlQ2hhbmdlZDpmdW5jdGlvbihkKXtkPyh0aGlzLl9yZXNpemVIYW5kbGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fcmVzaXplSGFuZGxlLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIiksdGhpcy5saXN0ZW4odGhpcy5fcmVzaXplSGFuZGxlLCJ0cmFjayIsIl9vblRyYWNrIiksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQodGhpcy5fcmVzaXplSGFuZGxlKSk6dGhpcy5fcmVzaXplSGFuZGxlJiYodGhpcy51bmxpc3Rlbih0aGlzLl9yZXNpemVIYW5kbGUsInRyYWNrIiwiX29uVHJhY2siKSxQb2x5bWVyLmRvbSh0aGlzKS5yZW1vdmVDaGlsZCh0aGlzLl9yZXNpemVIYW5kbGUpKX0sX29uVHJhY2s6ZnVuY3Rpb24oZCl7dGhpcy5jb2x1bW5SZXNpemluZz0KITA7dmFyIGY9dGhpcy5jb2x1bW47InZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1mLmxvY2FsTmFtZSYmKGY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZi5fY2hpbGRDb2x1bW5zLDApLnNvcnQoZnVuY3Rpb24odCxsKXtyZXR1cm4gdC5fb3JkZXItbC5fb3JkZXJ9KS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIXQuaGlkZGVufSkucG9wKCkpO3ZhciBoPXRoaXMuX2dldEhlYWRlckNlbGxCeUNvbHVtbihmKTtpZihoLm9mZnNldFdpZHRoKXt2YXIgaz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShoLl9jZWxsQ29udGVudCk7Zi53aWR0aD1NYXRoLm1heCgxMCtwYXJzZUludChrLnBhZGRpbmdMZWZ0KStwYXJzZUludChrLnBhZGRpbmdSaWdodCksaC5vZmZzZXRXaWR0aCtkLmRldGFpbC54LWguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpKyJweCI7Zi5mbGV4R3Jvdz0wfUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwiKSkuc29ydChmdW5jdGlvbih0LApsKXtyZXR1cm4gdC5jb2x1bW4uX29yZGVyLWwuY29sdW1uLl9vcmRlcn0pLmZvckVhY2goZnVuY3Rpb24odCxsLHApe2w8cC5pbmRleE9mKGgpJiYodC5jb2x1bW4ud2lkdGg9dC5vZmZzZXRXaWR0aCsicHgiLHQuY29sdW1uLmZsZXhHcm93PTApfSk7dGhpcy5jb2x1bW5SZXNpemluZyYmImVuZCI9PT1kLmRldGFpbC5zdGF0ZSYmKHRoaXMuY29sdW1uUmVzaXppbmc9ITEpO3RoaXMuZmlyZSgiY29sdW1uLXJlc2l6aW5nIil9LF9nZXRIZWFkZXJDZWxsQnlDb2x1bW46ZnVuY3Rpb24oZCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLXJvdzpsYXN0LWNoaWxkIC52YWFkaW4tZ3JpZC1jZWxsIiksZnVuY3Rpb24oZil7cmV0dXJuIGYuY29sdW1uPT09ZH0pWzBdfSxfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGQpe3ZvaWQgMCE9PQpkJiYobnVsbD09PWR8fCF0aGlzLl9pc0NvbHVtblJvdyYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIhPT10aGlzLmNvbHVtbi5sb2NhbE5hbWU/KHRoaXMuaW5zdGFuY2U9e3Jvb3Q6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9LHRoaXMuX2lzRW1wdHk9ITApOih0aGlzLmluc3RhbmNlPWQudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKSx0aGlzLl90ZW1wbGF0aXplcj1kLnRlbXBsYXRpemVyLHRoaXMuX2lzRW1wdHk9ITEpKX0sX2lzRW1wdHlDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7ZiYmdGhpcy5maXJlKCJjZWxsLWVtcHR5LWNoYW5nZWQiKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLWNlbGwiLHByb3BlcnRpZXM6e2Zvb3RlclRlbXBsYXRlOk9iamVjdH0sYmVoYXZpb3JzOltiLHZhYWRpbi5lbGVtZW50cy5ncmlkLkNlbGxDbGlja0JlaGF2aW9yXSxvYnNlcnZlcnM6WyJfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkKGZvb3RlclRlbXBsYXRlKSIsCiJfaXNFbXB0eUNoYW5nZWQoX2lzRW1wdHksIGlzQXR0YWNoZWQpIl0sX2Zvb3RlclRlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihkKXt2b2lkIDAhPT1kJiYobnVsbD09PWR8fCF0aGlzLl9pc0NvbHVtblJvdyYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIhPT10aGlzLmNvbHVtbi5sb2NhbE5hbWU/KHRoaXMuaW5zdGFuY2U9e3Jvb3Q6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9LHRoaXMuX2lzRW1wdHk9ITApOih0aGlzLmluc3RhbmNlPWQudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKSx0aGlzLl90ZW1wbGF0aXplcj1kLnRlbXBsYXRpemVyLHRoaXMuX2lzRW1wdHk9ITEpKX0sX2lzRW1wdHlDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7ZiYmdGhpcy5maXJlKCJjZWxsLWVtcHR5LWNoYW5nZWQiKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtc2l6ZXItY2VsbCIsYmVoYXZpb3JzOltiXX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zaXplci5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC1zaXplciIscHJvcGVydGllczp7Y29sdW1uVHJlZTpBcnJheSx0b3A6TnVtYmVyLF9jb2x1bW5zOkFycmF5fSxvYnNlcnZlcnM6WyJfY29sdW1uVHJlZUNoYW5nZWQoY29sdW1uVHJlZSkiLCJfdG9wQ2hhbmdlZCh0b3ApIl0sX2NvbHVtblRyZWVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX2NvbHVtbnM9YltiLmxlbmd0aC0xXX0sX3RvcENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5zdHlsZS50b3A9YisicHgifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyIixwcm9wZXJ0aWVzOntzY3JvbGxUYXJnZXQ6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc2Nyb2xsVGFyZ2V0Q2hhbmdlZCJ9LHBhc3N0aHJvdWdoOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiEwfX0sbGlzdGVuZXJzOntzY3JvbGw6Il9zeW5jU2Nyb2xsVGFyZ2V0In0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmxpc3Rlbih0aGlzLmRvbUhvc3QsIm1vdXNlbW92ZSIsIl9vbk1vdXNlTW92ZSIpO3RoaXMuc3R5bGUud2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc9InRvdWNoIn0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMuZG9tSG9zdCwibW91c2Vtb3ZlIiwiX29uTW91c2VNb3ZlIil9LF9zY3JvbGxUYXJnZXRDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmdGhpcy51bmxpc3RlbihkLCJzY3JvbGwiLCJfc3luY091dGVyU2Nyb2xsZXIiKTt0aGlzLmxpc3RlbihiLAoic2Nyb2xsIiwiX3N5bmNPdXRlclNjcm9sbGVyIil9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbihiKXt0aGlzLnBhc3N0aHJvdWdoPWIub2Zmc2V0WTw9dGhpcy5jbGllbnRIZWlnaHQmJmIub2Zmc2V0WDw9dGhpcy5jbGllbnRXaWR0aH0sX3N5bmNPdXRlclNjcm9sbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc3luY2luZ1Njcm9sbFRhcmdldHx8KHRoaXMuX3N5bmNpbmdPdXRlclNjcm9sbGVyPSEwLHRoaXMuc2Nyb2xsVG9wPXRoaXMuZG9tSG9zdC5fc2Nyb2xsVG9wLHRoaXMuc2Nyb2xsTGVmdD10aGlzLmRvbUhvc3QuX3Njcm9sbExlZnQpO3RoaXMuX3N5bmNpbmdTY3JvbGxUYXJnZXQ9ITF9LF9zeW5jU2Nyb2xsVGFyZ2V0OmZ1bmN0aW9uKCl7dGhpcy5fc3luY2luZ091dGVyU2Nyb2xsZXJ8fCh0aGlzLl9zeW5jaW5nU2Nyb2xsVGFyZ2V0PSEwLHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcD10aGlzLnNjcm9sbFRvcCx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxMZWZ0PXRoaXMuc2Nyb2xsTGVmdCwKdGhpcy5kb21Ib3N0Ll9zY3JvbGxIYW5kbGVyKCkpO3RoaXMuX3N5bmNpbmdPdXRlclNjcm9sbGVyPSExfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWZvY3VzYWJsZS1jZWxsLWNvbnRhaW5lci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2ZvY3VzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9mb2N1c2VkUm93Ok9iamVjdCxfZm9jdXNlZFJvd0luZGV4Ok51bWJlcixfZm9jdXNlZENlbGw6T2JqZWN0LF9mb2N1c2VkQ2VsbEluZGV4Ok51bWJlcixfbGFzdEZvY3VzZWRDZWxsOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX2Fubm91bmNlRm9jdXNlZENlbGwoX2ZvY3VzZWRDZWxsLCBmb2N1c2VkKSIsIl9kaXNwYXRjaEV2ZW50cyhfZm9jdXNlZENlbGwsIGZvY3VzZWQpIiwiX2ZvY3VzZWRDZWxsQ2hhbmdlZChfZm9jdXNlZFJvd0luZGV4LCBfZm9jdXNlZENlbGxJbmRleCkiXSxfYW5ub3VuY2VGb2N1c2VkQ2VsbDpmdW5jdGlvbihiLGQpe3ZvaWQgMCE9PWImJnZvaWQgMCE9PWQmJnRoaXMuZG9tSG9zdC5uYXZpZ2F0aW5nJiZkJiYoZD1Qb2x5bWVyLkVsZW1lbnQ/Yi5fY2VsbENvbnRlbnQuZ2V0QXR0cmlidXRlKCJzbG90Iik6CmIuX2NlbGxDb250ZW50LmlkLCJ2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IiE9PXRoaXMuaXN8fGIuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpfHwoYj1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGIucGFyZW50RWxlbWVudCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLWNlbGwiKSxiKSxkPXRoaXMuZG9tSG9zdC4kLmhlYWRlci5sYXN0RWxlbWVudENoaWxkLmNoaWxkcmVuW2JdLl9jZWxsQ29udGVudC5pZCsiICIrZCksdGhpcy5kb21Ib3N0LiQuZm9vdGVyRm9jdXNUcmFwLmFjdGl2ZVRhcmdldD1kKX0sX2Rpc3BhdGNoRXZlbnRzOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmKHRoaXMuX2xhc3RGb2N1c2VkQ2VsbCYmKHRoaXMuX2xhc3RGb2N1c2VkQ2VsbC5fY2VsbENvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNlbGwtZm9jdXNvdXQiKSksdGhpcy5fbGFzdEZvY3VzZWRDZWxsPXZvaWQgMCksCmQmJihiLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1mb2N1c2luIikpLHRoaXMuX2xhc3RGb2N1c2VkQ2VsbD1iKSl9LF9mb2N1c2VkQ2VsbENoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMpLmNoaWxkcmVuLGZ1bmN0aW9uKGYsaCl7Zi5mb2N1c2VkPWg9PT1iO2YuZm9jdXNlZCYmKHRoaXMuX2ZvY3VzZWRSb3c9Zix0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PU1hdGgubWluKGQsZi5jaGlsZHJlbi5sZW5ndGgtMSksdGhpcy5fZm9jdXNlZENlbGw9Zi5jaGlsZHJlblt0aGlzLl9mb2N1c2VkQ2VsbEluZGV4XSk7Zi5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGssdCl7ay5mb2N1c2VkPXQ9PT10aGlzLl9mb2N1c2VkQ2VsbEluZGV4fS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9LGZvY3VzTGVmdDpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPQp0aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGIubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1iW01hdGgubWF4KDAsYi5pbmRleE9mKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpLTEpXSl9fSxmb2N1c0Rvd246ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5taW4odGhpcy5fZm9jdXNlZFJvd0luZGV4KzEsdGhpcy5jaGlsZHJlbi5sZW5ndGgtMSl9LF92aXNpYmxlQ2VsbEluZGV4ZXM6ZnVuY3Rpb24oKXt2YXIgYj1bXTtpZih0aGlzLl9mb2N1c2VkUm93JiZ0aGlzLl9mb2N1c2VkUm93LmNoaWxkcmVuKXtmb3IodmFyIGQ9dGhpcy5fZm9jdXNlZFJvdy5jaGlsZHJlbixmPTA7ZjxkLmxlbmd0aDtmKyspZFtmXS5oaWRkZW58fGRbZl09PT10aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbHx8Yi5wdXNoKGYpO2Iuc29ydChmdW5jdGlvbihoLGspe3JldHVybiBkW2hdLmNvbHVtbi5fb3JkZXI8ZFtrXS5jb2x1bW4uX29yZGVyPy0xOjF9KX1yZXR1cm4gYn0sCmZvY3VzUGFnZURvd246ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5taW4odGhpcy5fZm9jdXNlZFJvd0luZGV4KzEwLHRoaXMuY2hpbGRyZW4ubGVuZ3RoLTEpfSxmb2N1c1BhZ2VVcDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1heCgwLHRoaXMuX2ZvY3VzZWRSb3dJbmRleC0xMCl9LGZvY3VzUmlnaHQ6ZnVuY3Rpb24oKXtpZighdGhpcy5fZm9jdXNlZENlbGwuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpKXt2YXIgYj10aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGIubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1iW01hdGgubWluKGIuaW5kZXhPZih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4KSsxLGIubGVuZ3RoLTEpXSl9fSxmb2N1c1VwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEpfSxmb2N1c0hvbWU6ZnVuY3Rpb24oKXtpZighdGhpcy5fZm9jdXNlZENlbGwuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpKXt2YXIgYj0KdGhpcy5fdmlzaWJsZUNlbGxJbmRleGVzKCk7MDxiLmxlbmd0aCYmKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9YlswXSl9fSxmb2N1c0VuZDpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPXRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbYi5sZW5ndGgtMV0pfX0sZm9jdXNGaXJzdDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD0wO3RoaXMuZm9jdXNIb21lKCl9LGZvY3VzTGFzdDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD10aGlzLmNoaWxkcmVuLmxlbmd0aC0xO3RoaXMuZm9jdXNFbmQoKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1mb290ZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj17cHJvcGVydGllczp7Y29sdW1uVHJlZTpBcnJheSx0YXJnZXQ6T2JqZWN0LF9yb3dzOkFycmF5fSxvYnNlcnZlcnM6WyJfY29sdW1uVHJlZUNoYW5nZWQoY29sdW1uVHJlZSwgdGFyZ2V0KSIsIl9yb3dzQ2hhbmdlZChfcm93cykiXSxfY29sdW1uVHJlZUNoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtpZih2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mKXt0aGlzLl9yb3dzJiZ0aGlzLl9yb3dzLmZvckVhY2goZnVuY3Rpb24obCl7UG9seW1lci5kb20obCkuaW5uZXJIVE1MPSIifSk7Zm9yKHZhciBoPVtdLGs9MDtrPGQubGVuZ3RoO2srKyl7dmFyIHQ9dGhpcy5fY3JlYXRlUm93KCk7dC50YXJnZXQ9Zjt0Ll9pc0NvbHVtblJvdz1rPT1kLmxlbmd0aC0xO3QuY29sdW1ucz1kW2tdO2gucHVzaCh0KX10aGlzLl9yb3dzPSJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIiPT09dGhpcy5sb2NhbE5hbWU/aDpoLnJldmVyc2UoKX19LF9yb3dzQ2hhbmdlZDpmdW5jdGlvbihkKXtQb2x5bWVyLmRvbSh0aGlzKS5pbm5lckhUTUw9CiIiO2QuZm9yRWFjaChmdW5jdGlvbihmKXtQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChmKX0uYmluZCh0aGlzKSl9fTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIixiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRm9jdXNhYmxlQ2VsbENvbnRhaW5lckJlaGF2aW9yXSxfY3JlYXRlUm93OmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1yb3ciKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtYm9keSIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3JdLG9ic2VydmVyczpbIl9hbm5vdW5jZUZvY3VzZWRSb3coX2ZvY3VzZWRSb3cpIl0sX2Fubm91bmNlRm9jdXNlZFJvdzpmdW5jdGlvbihkKXt0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0OiJSb3cgIisoZC5pbmRleCsxKSsiIG9mICIrCnRoaXMuZG9tSG9zdC5zaXplfSl9LF9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZENlbGwuZm9jdXNlZD0hMTt0aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbC5mb2N1c2VkPSEwO3RoaXMuX2ZvY3VzZWRDZWxsPXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfSxfZm9jdXNlZFJvd0hhc0RldGFpbHNDZWxsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvY3VzZWRSb3cmJnRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsJiZ0aGlzLl9mb2N1c2VkQ2VsbCE9PXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfSxmb2N1c0Rvd246ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SGFzRGV0YWlsc0NlbGwoKT90aGlzLl9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsKCk6dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWluKHRoaXMuX2ZvY3VzZWRSb3dJbmRleCsxLHRoaXMuZG9tSG9zdC5zaXplLTEpfSxmb2N1c1VwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvdyYmCnRoaXMuX2ZvY3VzZWRDZWxsPT09dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGw/dGhpcy5fZm9jdXNlZENlbGxDaGFuZ2VkKHRoaXMuX2ZvY3VzZWRSb3dJbmRleCx0aGlzLl9mb2N1c2VkQ2VsbEluZGV4KToodGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEpLHRoaXMuX2ZvY3VzZWRSb3dIYXNEZXRhaWxzQ2VsbCgpJiZ0aGlzLl9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsKCkpfSxmb2N1c0xhc3Q6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9dGhpcy5kb21Ib3N0LnNpemUtMTt0aGlzLmZvY3VzRW5kKCl9LF9mb2N1c2VkQ2VsbENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMpLmNoaWxkcmVuLGZ1bmN0aW9uKGgpe2guZm9jdXNlZD1oLmluZGV4PT09ZDtoLmluZGV4PT09ZCYmKHRoaXMuX2ZvY3VzZWRSb3c9CmgsdGhpcy5fZm9jdXNlZENlbGw9aC5jaGlsZHJlbltmXSk7aC5pdGVyYXRlQ2VsbHMoZnVuY3Rpb24oayx0KXtrLmZvY3VzZWQ9dD09PWZ9KX0uYmluZCh0aGlzKSl9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciIsYmVoYXZpb3JzOltiLHZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcl0sX2NyZWF0ZVJvdzpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93Iil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLWZvY3VzLXRyYXAuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImdyaWRjZWxsIn0scHJvcGVydGllczp7YWN0aXZlVGFyZ2V0Ont0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2FjdGl2ZVRhcmdldENoYW5nZWQifX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9wcmltYXJ5PVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigiLnByaW1hcnkiKTt0aGlzLl9zZWNvbmRhcnk9UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yKCIuc2Vjb25kYXJ5Iik7aWYoUG9seW1lci5TZXR0aW5ncy51c2VOYXRpdmVTaGFkb3d8fFBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93KVBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuX3NlY29uZGFyeSksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQodGhpcy5fcHJpbWFyeSl9LGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZCE9PXRoaXMuX3ByaW1hcnk/dGhpcy5fcHJpbWFyeS5mb2N1cygpOgp0aGlzLl9zZWNvbmRhcnkuZm9jdXMoKX0sX29uQmFpdEZvY3VzOmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzZWQ9Yi50YXJnZXQ7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5fHwodGhpcy5maXJlKCJmb2N1cy1nYWluZWQiKSx0aGlzLl9wcmltYXJ5LnRhYkluZGV4PS0xKX0sX29uQmFpdEJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHl8fCh0aGlzLmZpcmUoImZvY3VzLWxvc3QiKSx0aGlzLl9wcmltYXJ5LnRhYkluZGV4PTApfSxfYWN0aXZlVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITA7dGhpcy5fZm9jdXNlZD09PXRoaXMuX3ByaW1hcnk/KHRoaXMuX3NlY29uZGFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsYiksdGhpcy5fc2Vjb25kYXJ5LmZvY3VzKCkpOih0aGlzLl9wcmltYXJ5LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixiKSx0aGlzLl9wcmltYXJ5LmZvY3VzKCkpOwp0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITF9LF9yZWFubm91bmNlOmZ1bmN0aW9uKCl7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5PSEwO3RoaXMuX2ZvY3VzZWQ9PT10aGlzLl9wcmltYXJ5Pyh0aGlzLl9zZWNvbmRhcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLHRoaXMuYWN0aXZlVGFyZ2V0KSx0aGlzLl9zZWNvbmRhcnkuZm9jdXMoKSk6KHRoaXMuX3ByaW1hcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLHRoaXMuYWN0aXZlVGFyZ2V0KSx0aGlzLl9wcmltYXJ5LmZvY3VzKCkpO3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1yb3cuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxjb2x1bW5zOkFycmF5LGluZGV4Ok51bWJlcixjZWxsczp7dmFsdWU6W119LHRhcmdldDpPYmplY3QsZXhwYW5kZWQ6e3ZhbHVlOiExfSxmb2N1c2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxpdGVtOk9iamVjdCxzZWxlY3RlZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfcm93RGV0YWlsc0NlbGw6T2JqZWN0LHJvd0RldGFpbHNUZW1wbGF0ZTpPYmplY3R9LG9ic2VydmVyczoiX2NvbHVtbnNDaGFuZ2VkKGNvbHVtbnMsIHRhcmdldCk7X2luZGV4Q2hhbmdlZChpbmRleCwgY2VsbHMpO19pdGVtQ2hhbmdlZChpdGVtLCBjZWxscyk7X2l0ZW1DaGFuZ2VkRm9yRGV0YWlscyhpdGVtLCBfcm93RGV0YWlsc0NlbGwpO19yb3dEZXRhaWxzQ2hhbmdlZChleHBhbmRlZCwgcm93RGV0YWlsc1RlbXBsYXRlLCB0YXJnZXQpO19yb3dEZXRhaWxzQ2VsbEluZGV4Q2hhbmdlZChfcm93RGV0YWlsc0NlbGwsIGluZGV4KTtfcm93RGV0YWlsc0NlbGxDaGFuZ2VkKF9yb3dEZXRhaWxzQ2VsbCwgdGFyZ2V0KTtfc2VsZWN0ZWRDaGFuZ2VkKHNlbGVjdGVkLCBjZWxscyk7X3NlbGVjdGVkQ2hhbmdlZEZvckRldGFpbHMoc2VsZWN0ZWQsIF9yb3dEZXRhaWxzQ2VsbCkiLnNwbGl0KCI7IiksCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZC1yb3ciKTshMT09PVBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93JiYodGhpcy5jbGFzc0xpc3QuYWRkKCJzdHlsZS1zY29wZSIpLHRoaXMuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQiKSl9LGl0ZXJhdGVDZWxsczpmdW5jdGlvbihkKXt0aGlzLmNlbGxzLmZvckVhY2goZCk7dGhpcy5fcm93RGV0YWlsc0NlbGwmJmQodGhpcy5fcm93RGV0YWlsc0NlbGwpfSxfcm93RGV0YWlsc0NoYW5nZWQ6ZnVuY3Rpb24oZCxmLGgpe2lmKHZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJnZvaWQgMCE9PWgpe2lmKGQpe3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWNlbGwiKTtrLnNldEF0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiLCEwKTtrLmZyb3plbj0hMDtrLnRhcmdldD1oO2sudGVtcGxhdGU9ZjtrLnRvZ2dsZUF0dHJpYnV0ZSgibGFzdGNvbHVtbiIsITApO1BvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoayk7ClBvbHltZXIuZG9tLmZsdXNoKCk7dGhpcy5fcm93RGV0YWlsc0NlbGw9a31lbHNlIHRoaXMuX3Jvd0RldGFpbHNDZWxsJiYoUG9seW1lci5kb20odGhpcy5yb290KS5yZW1vdmVDaGlsZCh0aGlzLl9yb3dEZXRhaWxzQ2VsbCksdGhpcy5fcm93RGV0YWlsc0NlbGw9bnVsbCk7dGhpcy5pdGVyYXRlQ2VsbHMoZnVuY3Rpb24odCl7dC5leHBhbmRlZD1kfSk7dGhpcy50YXJnZXQuJC5zY3JvbGxlci5fZnJvemVuQ2VsbHNDaGFuZ2VkKCl9fSxfdXBkYXRlUm93VmlzaWJpbGl0eTpmdW5jdGlvbigpe3RoaXMuaGlkZGVuPXRoaXMuY2VsbHMuZXZlcnkoZnVuY3Rpb24oZCl7cmV0dXJuIGQuX2lzRW1wdHl9KX0sX3Jvd0RldGFpbHNDZWxsQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYuJC5zY3JvbGxlci5fdXBkYXRlKCl9LF9yb3dEZXRhaWxzQ2VsbEluZGV4Q2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihkPyhkLmluZGV4PQpmLFBvbHltZXIuZG9tLmZsdXNoKCksdGhpcy51cGRhdGVSb3dEZXRhaWxzQ2VsbE1ldHJpY3MoKSk6dGhpcy5zdHlsZS5wYWRkaW5nQm90dG9tPSIiKX0sdXBkYXRlUm93RGV0YWlsc0NlbGxNZXRyaWNzOmZ1bmN0aW9uKCl7dGhpcy5fcm93RGV0YWlsc0NlbGwmJih0aGlzLnRhcmdldCYmdGhpcy50YXJnZXQuX29ic2VydmVyJiZ0aGlzLnRhcmdldC5fb2JzZXJ2ZXIuZmx1c2gmJnRoaXMudGFyZ2V0Ll9vYnNlcnZlci5mbHVzaCgpLHRoaXMuX3Jvd0RldGFpbHNDZWxsLnN0eWxlLmhlaWdodD0iIix0aGlzLnN0eWxlLnBhZGRpbmdCb3R0b209dGhpcy5fcm93RGV0YWlsc0NlbGwuc3R5bGUuaGVpZ2h0PXRoaXMuX3Jvd0RldGFpbHNDZWxsLmNsaWVudEhlaWdodCsicHgiKX0sX2NvbHVtbnNDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7aWYodm9pZCAwIT09ZCYmdm9pZCAwIT09Zil7UG9seW1lci5kb20odGhpcykuaW5uZXJIVE1MPSIiO3ZhciBoPVtdO2QuZm9yRWFjaChmdW5jdGlvbihrKXt2YXIgdD0KIl8iK3RoaXMuaXMucmVwbGFjZSgvLS9nLCJfIikrIl9jZWxscyI7dD1rW3RdPWtbdF18fFtdO3ZhciBsPXQuZmlsdGVyKGZ1bmN0aW9uKG0pe3JldHVybiFQb2x5bWVyLmRvbShtKS5wYXJlbnROb2RlfSlbMF07aWYoIWwpe2w9dGhpcy5fY3JlYXRlQ2VsbCgpO3ZhciBwPUFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwodGhpcy50YXJnZXQucXVlcnlTZWxlY3RvckFsbCgiZG9tLXJlcGVhdCIpLGZ1bmN0aW9uKG0pe3JldHVybiFtLnJlc3RhbXB9KTsocD1wfHwidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyI9PT10aGlzLmlzfHwidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLXJvdyI9PT10aGlzLmlzKXx8dC5wdXNoKGwpfWwuaW5kZXg9dGhpcy5pbmRleDtsLnRhcmdldD10aGlzLnRhcmdldDtsLl9pc0NvbHVtblJvdz10aGlzLl9pc0NvbHVtblJvdztsLmNvbHVtbj1rO2wuZXhwYW5kZWQ9dGhpcy5leHBhbmRlZDtQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChsKTtoLnB1c2gobCl9LmJpbmQodGhpcykpOwp0aGlzLmNlbGxzPWh9fSxfaW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZi5mb3JFYWNoKGZ1bmN0aW9uKGgpe2guaW5kZXg9ZH0pfSxfaXRlbUNoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmLmZvckVhY2goZnVuY3Rpb24oaCl7aC5pdGVtPWR9KX0sX2l0ZW1DaGFuZ2VkRm9yRGV0YWlsczpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYmJihmLml0ZW09ZCl9LF9zZWxlY3RlZENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmLmZvckVhY2goZnVuY3Rpb24oaCl7aC5zZWxlY3RlZD1kfSl9LF9zZWxlY3RlZENoYW5nZWRGb3JEZXRhaWxzOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZiYmKGYuc2VsZWN0ZWQ9ZCl9LHVwZGF0ZUxhc3RDb2x1bW46ZnVuY3Rpb24oKXt0aGlzLmNlbGxzLnNsaWNlKDApLnNvcnQoZnVuY3Rpb24oZCwKZil7cmV0dXJuIGQuY29sdW1uLl9vcmRlci1mLmNvbHVtbi5fb3JkZXJ9KS5mb3JFYWNoKGZ1bmN0aW9uKGQsZixoKXtkLnRvZ2dsZUF0dHJpYnV0ZSgibGFzdGNvbHVtbiIsZj09PWgubGVuZ3RoLTEpfSl9fTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtcm93IixiZWhhdmlvcnM6W2JdLF9jcmVhdGVDZWxsOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWNlbGwiKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyIsYmVoYXZpb3JzOltiXSxvYnNlcnZlcnM6WyJfdXBkYXRlUm93VmlzaWJpbGl0eShjb2x1bW5zKSJdLGxpc3RlbmVyczp7ImNlbGwtZW1wdHktY2hhbmdlZCI6Il91cGRhdGVSb3dWaXNpYmlsaXR5In0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLXJvdyIsCmJlaGF2aW9yczpbYl0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVJvd1Zpc2liaWxpdHkoY29sdW1ucykiXSxsaXN0ZW5lcnM6eyJjZWxsLWVtcHR5LWNoYW5nZWQiOiJfdXBkYXRlUm93VmlzaWJpbGl0eSJ9LF9jcmVhdGVDZWxsOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRlbXBsYXRpemVyLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuVGVtcGxhdGl6ZXI9ZnVuY3Rpb24oKXt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcj1Qb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIiLGJlaGF2aW9yczpbUG9seW1lci5UZW1wbGF0aXplcl0scHJvcGVydGllczp7ZGF0YUhvc3Q6T2JqZWN0LHRlbXBsYXRlOk9iamVjdCxfdGVtcGxhdGVJbnN0YW5jZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9wYXJlbnRQYXRoVmFsdWVzOnt2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX19LG9ic2VydmVyczpbIl90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQoX3RlbXBsYXRlSW5zdGFuY2VzLiosIF9wYXJlbnRQYXRoVmFsdWVzLiopIl0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3BhcmVudE1vZGVsPSEwO3RoaXMuX2luc3RhbmNlUHJvcHM9e2V4cGFuZGVkOiEwLGluZGV4OiEwLGl0ZW06ITAsc2VsZWN0ZWQ6ITB9fSxjcmVhdGVJbnN0YW5jZTpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCk7dmFyIGI9dGhpcy5zdGFtcCh7fSk7CnRoaXMuYWRkSW5zdGFuY2UoYik7cmV0dXJuIGJ9LGFkZEluc3RhbmNlOmZ1bmN0aW9uKGIpey0xPT09dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuaW5kZXhPZihiKSYmdGhpcy5wdXNoKCJfdGVtcGxhdGVJbnN0YW5jZXMiLGIpfSxyZW1vdmVJbnN0YW5jZTpmdW5jdGlvbihiKXt0aGlzLnNwbGljZSgiX3RlbXBsYXRlSW5zdGFuY2VzIix0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5pbmRleE9mKGIpLDEpfSxfZW5zdXJlVGVtcGxhdGl6ZWQ6ZnVuY3Rpb24oKXt0aGlzLnRlbXBsYXRlLl90ZW1wbGF0aXplZHx8KHRoaXMudGVtcGxhdGUuX3RlbXBsYXRpemVkPSEwLHRoaXMudGVtcGxhdGl6ZSh0aGlzLnRlbXBsYXRlKSx0aGlzLl9wYXJlbnRQcm9wcz10aGlzLl9wYXJlbnRQcm9wc3x8e30sUG9seW1lci5FbGVtZW50fHxPYmplY3Qua2V5cyh0aGlzLl9wYXJlbnRQcm9wcykuZm9yRWFjaChmdW5jdGlvbigpe30sdGhpcykpfSxfZm9yd2FyZEluc3RhbmNlUHJvcDpmdW5jdGlvbihiLGQsZil7dm9pZCAwIT09CmJbIl9fIitkKyJfXyJdJiZiWyJfXyIrZCsiX18iXSE9PWYmJnRoaXMuZmlyZSgidGVtcGxhdGUtaW5zdGFuY2UtY2hhbmdlZCIse3Byb3A6ZCx2YWx1ZTpmLGluc3Q6Yn0pfSxfZm9yd2FyZEluc3RhbmNlUGF0aDpmdW5jdGlvbihiLGQsZil7MCE9PWQuaW5kZXhPZigiaXRlbS4iKXx8dGhpcy5fc3VwcHJlc3NJdGVtQ2hhbmdlRXZlbnR8fHRoaXMuZmlyZSgiaXRlbS1jaGFuZ2VkIix7aXRlbTpiLml0ZW0scGF0aDpkLnN1YnN0cmluZyg1KSx2YWx1ZTpmfSl9LF9ub3RpZnlJbnN0YW5jZVByb3BWMjpmdW5jdGlvbihiLGQsZil7dGhpcy5fZm9yd2FyZEluc3RhbmNlUHJvcChiLGQsZik7dGhpcy5fZm9yd2FyZEluc3RhbmNlUGF0aChiLGQsZil9LF9mb3J3YXJkUGFyZW50UHJvcDpmdW5jdGlvbihiLGQpe3RoaXMuX3BhcmVudFBhdGhWYWx1ZXNbYl09ZDt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Yuc2V0KGIsZCl9LHRoaXMpfSxfZm9yd2FyZFBhcmVudFBhdGg6ZnVuY3Rpb24oYiwKZCl7dGhpcy5zZXQoWyJfcGFyZW50UGF0aFZhbHVlcyIsYl0sZCk7dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihmKXtmLm5vdGlmeVBhdGgoYixkKX0sdGhpcyl9LF9mb3J3YXJkSG9zdFByb3BWMjpmdW5jdGlvbihiLGQpe3RoaXMuX2ZvcndhcmRQYXJlbnRQcm9wKGIsZCk7dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMmJnRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oZil7Zi5ub3RpZnlQYXRoKGIsZCl9LHRoaXMpfSxfdGVtcGxhdGVJbnN0YW5jZXNDaGFuZ2VkOmZ1bmN0aW9uKGIpe2lmKCJfdGVtcGxhdGVJbnN0YW5jZXMiPT09Yi5wYXRoKXt2YXIgZD0wO3ZhciBmPXRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmxlbmd0aH1lbHNlIGlmKCJfdGVtcGxhdGVJbnN0YW5jZXMuc3BsaWNlcyI9PT1iLnBhdGgpZD1iLnZhbHVlLmluZGV4LGY9Yi52YWx1ZS5hZGRlZENvdW50O2Vsc2UgcmV0dXJuO09iamVjdC5rZXlzKHRoaXMuX3BhcmVudFBhdGhWYWx1ZXN8fAp7fSkuZm9yRWFjaChmdW5jdGlvbihoKXtmb3IodmFyIGs9ZDtrPGQrZjtrKyspdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXNba10uc2V0KGgsdGhpcy5fcGFyZW50UGF0aFZhbHVlc1toXSl9LHRoaXMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlJvd0RldGFpbHNCZWhhdmlvcj17cHJvcGVydGllczp7ZXhwYW5kZWRJdGVtczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LGxpc3RlbmVyczp7InRlbXBsYXRlLWluc3RhbmNlLWNoYW5nZWQiOiJfdGVtcGxhdGVJbnN0YW5jZUNoYW5nZWRFeHBhbmRlZCJ9LG9ic2VydmVyczpbIl9leHBhbmRlZEl0ZW1zQ2hhbmdlZChleHBhbmRlZEl0ZW1zLiosIGRhdGFQcm92aWRlcikiLCJfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZChfcm93RGV0YWlsc1RlbXBsYXRlKSJdLF9leHBhbmRlZEl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3ZvaWQgMCE9PWImJnZvaWQgMCE9PWQmJih0aGlzLl9mbHVzaEl0ZW1zRGVib3VuY2VyKCksdGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zJiZ0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihmKXtmLmV4cGFuZGVkPXRoaXMuX2lzRXhwYW5kZWQoZi5pdGVtKX0uYmluZCh0aGlzKSkpfSwKX3Jvd0RldGFpbHNUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9bmV3IHZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyO2QuZGF0YUhvc3Q9dGhpcy5kYXRhSG9zdDtkLl9pbnN0YW5jZVByb3BzPXtleHBhbmRlZDohMCxpbmRleDohMCxpdGVtOiEwLHNlbGVjdGVkOiEwfTtQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLmFwcGVuZENoaWxkKGQpO2QudGVtcGxhdGU9YjtiLnRlbXBsYXRpemVyPWR9LF9pc0V4cGFuZGVkOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmV4cGFuZGVkSXRlbXMmJi0xIT09dGhpcy5leHBhbmRlZEl0ZW1zLmluZGV4T2YoYil9LGV4cGFuZEl0ZW06ZnVuY3Rpb24oYil7dGhpcy5faXNFeHBhbmRlZChiKXx8dGhpcy5wdXNoKCJleHBhbmRlZEl0ZW1zIixiKX0sY29sbGFwc2VJdGVtOmZ1bmN0aW9uKGIpe3RoaXMuX2lzRXhwYW5kZWQoYikmJnRoaXMuc3BsaWNlKCJleHBhbmRlZEl0ZW1zIix0aGlzLmV4cGFuZGVkSXRlbXMuaW5kZXhPZihiKSwxKX0sCl90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZEV4cGFuZGVkOmZ1bmN0aW9uKGIpeyJleHBhbmRlZCI9PT1iLmRldGFpbC5wcm9wJiYoYi5kZXRhaWwudmFsdWU/dGhpcy5leHBhbmRJdGVtKGIuZGV0YWlsLmluc3QuaXRlbSk6dGhpcy5jb2xsYXBzZUl0ZW0oYi5kZXRhaWwuaW5zdC5pdGVtKSxiLnN0b3BQcm9wYWdhdGlvbigpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWRhdGEtcHJvdmlkZXItYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuRGF0YVByb3ZpZGVyQmVoYXZpb3I9e2xpc3RlbmVyczp7Iml0ZW0tY2hhbmdlZCI6Il90ZW1wbGF0ZUl0ZW1DaGFuZ2VkIn0scHJvcGVydGllczp7cGFnZVNpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjUwLG9ic2VydmVyOiJfcGFnZVNpemVDaGFuZ2VkIn0sZGF0YVByb3ZpZGVyOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kYXRhUHJvdmlkZXJDaGFuZ2VkIn0sX2xvYWRpbmc6Qm9vbGVhbixfY2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fSxfcGVuZGluZ1JlcXVlc3RzOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX19LF90ZW1wbGF0ZUl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGIpe3ZhciBkPWIuZGV0YWlsLml0ZW07QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChQb2x5bWVyLmRvbSh0aGlzLiQuaXRlbXMpLmNoaWxkcmVuLGZ1bmN0aW9uKGYpe2YuaXRlbT09PWQmJmYuaXRlcmF0ZUNlbGxzKGZ1bmN0aW9uKGgpe2guX3RlbXBsYXRpemVyLl9zdXBwcmVzc0l0ZW1DaGFuZ2VFdmVudD0KITA7aC5pbnN0YW5jZS5ub3RpZnlQYXRoKCJpdGVtLiIrYi5kZXRhaWwucGF0aCxiLmRldGFpbC52YWx1ZSk7aC5fdGVtcGxhdGl6ZXIuX3N1cHByZXNzSXRlbUNoYW5nZUV2ZW50PSExfSl9KX0sX2dldENhY2hlZEl0ZW06ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fZ2V0UGFnZUZvckluZGV4KGIpLGY9dGhpcy5fY2FjaGUmJnRoaXMuX2NhY2hlW2RdO3JldHVybiBmP2ZbYi1kKnRoaXMucGFnZVNpemVdOm51bGx9LF9nZXRJdGVtOmZ1bmN0aW9uKGIsZCl7dGhpcy5fdXBkYXRlSXRlbShkLHRoaXMuX2dldENhY2hlZEl0ZW0oYikpO3RoaXMuX2VhZ2VybHlMb2FkUGFnZXMoKTt2YXIgZj10aGlzLl91bmNhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtcygpOzA8Zi5sZW5ndGgmJih0aGlzLl9sb2FkaW5nPSEwLHRoaXMuZGVib3VuY2UoImxvYWQiLGZ1bmN0aW9uKCl7Zi5mb3JFYWNoKGZ1bmN0aW9uKGgpe3RoaXMuX2xvYWRQYWdlKGgpfS5iaW5kKHRoaXMpKX0sMTAwKSl9LF9jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCkuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiB2b2lkIDAhPT0KdGhpcy5fY2FjaGUmJnZvaWQgMCE9PXRoaXMuX2NhY2hlW2JdfS5iaW5kKHRoaXMpKX0sX3VuY2FjaGVkUGFnZXNGb3JQaHlzaWNhbEl0ZW1zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhZ2VzRm9yUGh5c2ljYWxJdGVtcygpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fY2FjaGUmJnZvaWQgMD09PXRoaXMuX2NhY2hlW2JdfS5iaW5kKHRoaXMpKX0sX2VhZ2VybHlMb2FkUGFnZXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXMoKS5zbGljZSgwKTtpZigwPGIubGVuZ3RoKXtiLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gZj5ofSk7dmFyIGQ9TWF0aC5taW4oYltiLmxlbmd0aC0xXSsxLE1hdGgubWF4KDAsTWF0aC5mbG9vcih0aGlzLnNpemUvdGhpcy5wYWdlU2l6ZSktMSkpO3RoaXMuX2xvYWRQYWdlKE1hdGgubWF4KDAsYlswXS0xKSk7dGhpcy5fbG9hZFBhZ2UoZCl9fSxfcGFnZXNGb3JQaHlzaWNhbEl0ZW1zOmZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuX2dldFBhZ2VGb3JJbmRleCh0aGlzLiQuc2Nyb2xsZXIuZmlyc3RWaXNpYmxlSW5kZXgrCnRoaXMuJC5zY3JvbGxlci5fdmlkeE9mZnNldCldLmNvbmNhdCh0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiBiLmluZGV4fSkubWFwKGZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9nZXRQYWdlRm9ySW5kZXgoYi5pbmRleCl9LmJpbmQodGhpcykpKS5yZWR1Y2UoZnVuY3Rpb24oYixkKXstMT09PWIuaW5kZXhPZihkKSYmYi5wdXNoKGQpO3JldHVybiBifSxbXSl9LF91cGRhdGVJdGVtczpmdW5jdGlvbihiLGQpe2Zvcih2YXIgZj0wO2Y8dGhpcy5wYWdlU2l6ZTtmKyspe3ZhciBoPXRoaXMuJC5zY3JvbGxlci5fdmlydHVhbEluZGV4VG9JdGVtW2IqdGhpcy5wYWdlU2l6ZStmXTtoJiYodGhpcy5fdXBkYXRlSXRlbShoLGRbZl0pLHRoaXMuZGVib3VuY2UoInVwZGF0ZS1oZWlnaHRzIixmdW5jdGlvbigpe3RoaXMuJC5zY3JvbGxlci5fdXBkYXRlTWV0cmljcygpO3RoaXMuJC5zY3JvbGxlci5fcG9zaXRpb25JdGVtcygpO3RoaXMuJC5zY3JvbGxlci5fdXBkYXRlU2Nyb2xsZXJTaXplKCl9LAoxKSl9fSxfbG9hZFBhZ2U6ZnVuY3Rpb24oYixkKXtkPWR8fHRoaXMuX3VwZGF0ZUl0ZW1zLmJpbmQodGhpcyk7aWYoIXRoaXMuX2NhY2hlW2JdJiYhdGhpcy5fcGVuZGluZ1JlcXVlc3RzW2JdJiZ0aGlzLmRhdGFQcm92aWRlcil7dGhpcy5fcGVuZGluZ1JlcXVlc3RzW2JdPSEwO3ZhciBmPXtwYWdlOmIscGFnZVNpemU6dGhpcy5wYWdlU2l6ZSxzb3J0T3JkZXJzOnRoaXMuX21hcFNvcnRlcnMoKSxmaWx0ZXJzOnRoaXMuX21hcEZpbHRlcnMoKX07dGhpcy5kYXRhUHJvdmlkZXIoZixmdW5jdGlvbihoKXt0aGlzLl9jYWNoZVtiXT1oO2RlbGV0ZSB0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYl07ZChiLGgpO3RoaXMuX2xvYWRpbmc9MDx0aGlzLl9wZW5kaW5nUmVxdWVzdHMubGVuZ3RoO3RoaXMuZGVib3VuY2UoImNoZWNrLXNpemUiLHRoaXMuX2NoZWNrU2l6ZSwyRTMpfS5iaW5kKHRoaXMpKX19LF9nZXRQYWdlRm9ySW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGguZmxvb3IoYi90aGlzLnBhZ2VTaXplKX0sCmNsZWFyQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9jYWNoZT17fTt0aGlzLl9wZW5kaW5nUmVxdWVzdHM9e307dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGEmJnRoaXMuJC5zY3JvbGxlci5fdXBkYXRlKCk7dGhpcy5fZmx1c2hJdGVtc0RlYm91bmNlcigpfSxfZmx1c2hJdGVtc0RlYm91bmNlcjpmdW5jdGlvbigpe3RoaXMuZmx1c2hEZWJvdW5jZXIoImxvYWQiKX0sX3BhZ2VTaXplQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3ZvaWQgMCE9PWQmJmIhPT1kJiZ0aGlzLmNsZWFyQ2FjaGUoKX0sX2NoZWNrU2l6ZTpmdW5jdGlvbigpe3ZvaWQgMD09PXRoaXMuc2l6ZSYmY29uc29sZS53YXJuKCdUaGUgXHgzY3ZhYWRpbi1ncmlkXHgzZSBuZWVkcyBhIHZhbHVlIGZvciAic2l6ZSIgcHJvcGVydHkgaW4gb3JkZXIgdG8gZGlzcGxheSByb3dzLicpfSxfZGF0YVByb3ZpZGVyQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3ZvaWQgMCE9PWQmJnRoaXMuY2xlYXJDYWNoZSgpO3RoaXMuJC5zY3JvbGxlci5oYXNEYXRhfHwKKHRoaXMuX2xvYWRpbmc9ITAsdGhpcy5fbG9hZFBhZ2UoMCxmdW5jdGlvbigpe3RoaXMuJC5zY3JvbGxlci5oYXNEYXRhPSEwfS5iaW5kKHRoaXMpKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zZWxlY3Rpb24tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuU2VsZWN0aW9uQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3NlbGVjdGVkSXRlbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl9zZWxlY3RlZEl0ZW1zQ2hhbmdlZChzZWxlY3RlZEl0ZW1zLiopIl0sbGlzdGVuZXJzOnsidGVtcGxhdGUtaW5zdGFuY2UtY2hhbmdlZCI6Il90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZFNlbGVjdGlvbiJ9LF90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZFNlbGVjdGlvbjpmdW5jdGlvbihiKXtpZigic2VsZWN0ZWQiPT09Yi5kZXRhaWwucHJvcCl7dmFyIGQ9Yi5kZXRhaWwuaW5zdC5pdGVtOyh0aGlzLl9pc1NlbGVjdGVkKGQpP3RoaXMuZGVzZWxlY3RJdGVtOnRoaXMuc2VsZWN0SXRlbSkuYmluZCh0aGlzKShkKTt0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0Oih0aGlzLl9pc1NlbGVjdGVkKGQpPyJTZWxlY3RlZCI6IkRlc2VsZWN0ZWQiKSsiIFJvdyAiKwooYi5kZXRhaWwuaW5zdC5pbmRleCsxKSsiIG9mICIrdGhpcy5zaXplfSk7Yi5zdG9wUHJvcGFnYXRpb24oKX19LF9pc1NlbGVjdGVkOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnNlbGVjdGVkSXRlbXMmJi0xPHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGIpfSxzZWxlY3RJdGVtOmZ1bmN0aW9uKGIpe2I9dGhpcy5fdGFrZUl0ZW0oYik7dGhpcy5faXNTZWxlY3RlZChiKXx8dGhpcy5wdXNoKCJzZWxlY3RlZEl0ZW1zIixiKX0sZGVzZWxlY3RJdGVtOmZ1bmN0aW9uKGIpe2I9dGhpcy5fdGFrZUl0ZW0oYik7Yj10aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihiKTstMTxiJiZ0aGlzLnNwbGljZSgic2VsZWN0ZWRJdGVtcyIsYiwxKX0sX3RvZ2dsZUl0ZW06ZnVuY3Rpb24oYil7Yj10aGlzLl90YWtlSXRlbShiKTstMT09PXRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGIpP3RoaXMuc2VsZWN0SXRlbShiKTp0aGlzLmRlc2VsZWN0SXRlbShiKX0sX3Rha2VJdGVtOmZ1bmN0aW9uKGIpe3JldHVybiJudW1iZXIiPT09CnR5cGVvZiBiJiYwPD1iJiZ0aGlzLml0ZW1zJiZ0aGlzLml0ZW1zLmxlbmd0aD5iP3RoaXMuaXRlbXNbYl06Yn0sX3NlbGVjdGVkSXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGIpeyF0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXN8fCJzZWxlY3RlZEl0ZW1zIiE9PWIucGF0aCYmInNlbGVjdGVkSXRlbXMuc3BsaWNlcyIhPT1iLnBhdGh8fHRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2Quc2VsZWN0ZWQ9dGhpcy5faXNTZWxlY3RlZChkLml0ZW0pfS5iaW5kKHRoaXMpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWtleWJvYXJkLW5hdmlnYXRpb24tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9ySW1wbD17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImFwcGxpY2F0aW9uIix0YWJpbmRleDowfSxrZXlCaW5kaW5nczp7ImN0cmwraG9tZSI6Il9vbkN0cmxIb21lIiwiY3RybCtlbmQiOiJfb25DdHJsRW5kIixkb3duOiJfb25BcnJvd0Rvd24iLGVuZDoiX29uRW5kIixlbnRlcjoiX29uRW50ZXIiLGVzYzoiX29uRXNjYXBlIixmMjoiX29uRjIiLGhvbWU6Il9vbkhvbWUiLGxlZnQ6Il9vbkFycm93TGVmdCIscGFnZWRvd246Il9vblBhZ2VEb3duIixwYWdldXA6Il9vblBhZ2VVcCIscmlnaHQ6Il9vbkFycm93UmlnaHQiLHNwYWNlOiJfb25TcGFjZSIsdGFiOiJfb25UYWIiLHVwOiJfb25BcnJvd1VwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKX0scHJvcGVydGllczp7X3ZpcnR1YWxGb2N1czp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il92aXJ0dWFsRm9jdXNDaGFuZ2VkIn0sCmludGVyYWN0aW5nOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxuYXZpZ2F0aW5nOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfX0sbGlzdGVuZXJzOntmb2N1czoiX29uRm9jdXMiLCJjZWxsLWZvY3VzIjoiX29uQ2VsbEZvY3VzIiwiY2VsbC1jb250ZW50LWZvY3VzIjoiX29uQ2VsbENvbnRlbnRGb2N1cyJ9LHJlYWR5OmZ1bmN0aW9uKCl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oYil7OT09PWIua2V5Q29kZSYmKHRoaXMuX3RhYmJlZD0hMCk7OT09PWIua2V5Q29kZSYmYi5zaGlmdEtleSYmKHRoaXMuX3NoaWZ0VGFiYmVkPSEwKX0uYmluZCh0aGlzKSwhMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLGZ1bmN0aW9uKGIpezk9PT1iLmtleUNvZGUmJih0aGlzLl90YWJiZWQ9ITEpOzk9PT1iLmtleUNvZGUmJmIuc2hpZnRLZXkmJih0aGlzLl9zaGlmdFRhYmJlZD0KITEpfS5iaW5kKHRoaXMpLCEwKX0sX2lzRm9vdGVyVmlzaWJsZTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJC5mb290ZXIuX3Jvd3MuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiFiLmhpZGRlbn0pLmxlbmd0aH0sX29uRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl90YWJiZWQmJiF0aGlzLl9zaGlmdFRhYmJlZCYmdGhpcy5fYWN0aXZhdGVOYXZpZ2F0aW9uKCl9LF9hY3RpdmF0ZU5hdmlnYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCl9LF9vbkZvY3Vzb3V0OmZ1bmN0aW9uKCl7dGhpcy5pbnRlcmFjdGluZz10aGlzLm5hdmlnYXRpbmc9ITF9LF9vbkZvb3RlckZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5uYXZpZ2F0aW5nPSEwO3RoaXMuaW50ZXJhY3Rpbmc9ITE7dGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuX3ZpcnR1YWxGb2N1c3x8KHRoaXMuX3NoaWZ0VGFiYmVkP3RoaXMuX2lzRm9vdGVyVmlzaWJsZSgpP3RoaXMuJC5mb290ZXI6dGhpcy4kLml0ZW1zOgp0aGlzLiQuaGVhZGVyKX0sX3ZpcnR1YWxGb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiYoZC5mb2N1c2VkPSExKTtiJiYoYi5fZm9jdXNlZENlbGxJbmRleD1iLl9mb2N1c2VkQ2VsbEluZGV4fHwwLGIuX2ZvY3VzZWRSb3dJbmRleD1iLl9mb2N1c2VkUm93SW5kZXh8fDAsYi5mb2N1c2VkPSEwLGI9PT10aGlzLiQuaXRlbXMmJnRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9vblRhYjpmdW5jdGlvbihiKXtpZighdGhpcy5pbnRlcmFjdGluZyYmdGhpcy5fdmlydHVhbEZvY3VzKWlmKHRoaXMubmF2aWdhdGluZylpZihiLmRldGFpbC5rZXlib2FyZEV2ZW50LnNoaWZ0S2V5KXN3aXRjaCh0aGlzLl92aXJ0dWFsRm9jdXMpe2Nhc2UgdGhpcy4kLmZvb3Rlcjp0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLml0ZW1zO2IucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIHRoaXMuJC5pdGVtczp0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLmhlYWRlcjtiLnByZXZlbnREZWZhdWx0KCk7CmJyZWFrO2Nhc2UgdGhpcy4kLmhlYWRlcjp0aGlzLmZvY3VzKCksdGhpcy5fdmlydHVhbEZvY3VzPW51bGx9ZWxzZSBzd2l0Y2godGhpcy5fdmlydHVhbEZvY3VzKXtjYXNlIHRoaXMuJC5oZWFkZXI6dGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuJC5pdGVtcztiLnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSB0aGlzLiQuaXRlbXM6dGhpcy5faXNGb290ZXJWaXNpYmxlKCk/KHRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuZm9vdGVyLGIucHJldmVudERlZmF1bHQoKSk6dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX3ZpcnR1YWxGb2N1cz1udWxsfSwxKTticmVhaztjYXNlIHRoaXMuJC5mb290ZXI6dGhpcy5fdmlydHVhbEZvY3VzPW51bGx9ZWxzZSB0aGlzLl9hY3RpdmF0ZU5hdmlnYXRpb24oKSxiLnByZXZlbnREZWZhdWx0KCl9LF9pc0Fib3ZlVmlld3BvcnQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuZmlyc3RWaXNpYmxlSW5kZXg+Yn0sX29uQXJyb3dEb3duOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fAooYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNEb3duKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX3Njcm9sbFBhZ2VEb3duOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wKz1kLnRvcC1iLmJvdHRvbTt0aGlzLiQuc2Nyb2xsZXIuX3Njcm9sbEhhbmRsZXIoKX0sX29uUGFnZURvd246ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zPyhiPXRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LHRoaXMuX3Njcm9sbFBhZ2VEb3duKCksdGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgrPQp0aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleC1ifHx0aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleC10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleCx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpOnRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1BhZ2VEb3duKCkpfSxfc2Nyb2xsUGFnZVVwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wLT1kLnRvcC1iLmJvdHRvbTt0aGlzLiQuc2Nyb2xsZXIuX3Njcm9sbEhhbmRsZXIoKX0sX29uUGFnZVVwOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cz09PXRoaXMuJC5pdGVtcz8oYj10aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleCwKdGhpcy5fc2Nyb2xsUGFnZVVwKCksdGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgtPWItdGhpcy4kLnNjcm9sbGVyLmxhc3RWaXNpYmxlSW5kZXh8fHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSk6dGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzUGFnZVVwKCkpfSxfb25BcnJvd1VwOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1VwKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uQXJyb3dSaWdodDpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNSaWdodCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LApfb25BcnJvd0xlZnQ6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzTGVmdCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9vbkhvbWU6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzSG9tZSgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9vbkVuZDpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNFbmQoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfbW92ZUZvY3VzVG9Gb2N1c1RhcmdldDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGwuX2NlbGxDb250ZW50OwooYj1iLnF1ZXJ5U2VsZWN0b3IoIltmb2N1cy10YXJnZXRdIil8fGIuZmlyc3RFbGVtZW50Q2hpbGQpJiZiLmZvY3VzKCl9LF9vbkVudGVyOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmc/ImlucHV0Ij09PWIuZGV0YWlsLmtleWJvYXJkRXZlbnQudGFyZ2V0LmxvY2FsTmFtZSYmInRleHQiPT09Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC50YXJnZXQudHlwZSYmdGhpcy4kLmZvb3RlckZvY3VzVHJhcC5mb2N1cygpOihiLnByZXZlbnREZWZhdWx0KCksdGhpcy5fbW92ZUZvY3VzVG9Gb2N1c1RhcmdldCgpKX0sX29uRXNjYXBlOmZ1bmN0aW9uKCl7dGhpcy5pbnRlcmFjdGluZz90aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6dGhpcy5uYXZpZ2F0aW5nJiYodGhpcy5uYXZpZ2F0aW5nPSExKX0sX29uRjI6ZnVuY3Rpb24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaW50ZXJhY3Rpbmc/dGhpcy4kLmZvb3RlckZvY3VzVHJhcC5mb2N1cygpOnRoaXMuX21vdmVGb2N1c1RvRm9jdXNUYXJnZXQoKX0sCl9vbkN0cmxIb21lOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0ZpcnN0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uQ3RybEVuZDpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNMYXN0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uU3BhY2U6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaW50ZXJhY3Rpbmcpe2IucHJldmVudERlZmF1bHQoKTtiPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGw7dmFyIGQ9Yi5nZXRDb250ZW50Q2hpbGRyZW4oUG9seW1lci5FbGVtZW50PyJzbG90IjoiY29udGVudCIpWzBdLmZpcnN0RWxlbWVudENoaWxkO2Q/ZC5jbGljaygpOnRoaXMubmF2aWdhdGluZyYmCnRoaXMuZmlyZSgiY2VsbC1hY3RpdmF0ZSIse21vZGVsOmIuaW5zdGFuY2V9KX19LF9vbkNlbGxDb250ZW50Rm9jdXM6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZz0hMDt0aGlzLl9vbkNlbGxGb2N1cyhiKX0sX29uQ2VsbEZvY3VzOmZ1bmN0aW9uKGIpe2I9Yi5kZXRhaWwuY2VsbDt2YXIgZD1iLnBhcmVudEVsZW1lbnQsZj1kLnBhcmVudEVsZW1lbnQsaD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGYpLmNoaWxkcmVuLGQpO2Y9PT10aGlzLiQuaXRlbXMmJihoPWQuaW5kZXgpO2YuX2ZvY3VzZWRSb3dJbmRleD1oO2YuX2ZvY3VzZWRDZWxsSW5kZXg9QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChQb2x5bWVyLmRvbShkKS5jaGlsZHJlbixiKTt0aGlzLl92aXJ0dWFsRm9jdXM9ZjtiLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSYmKGYuX2ZvY3VzZWRDZWxsSW5kZXg9MCxmLl9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsKCkpfSxfZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLiQuc2Nyb2xsZXIuX3ZpZHhPZmZzZXQrdGhpcy4kLnNjcm9sbGVyLl92aXJ0dWFsU3RhcnQsZD10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleDt0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXMmJihkPGJ8fGQ+Yit0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsQ291bnQpJiYodGhpcy4kLnNjcm9sbGVyLnNjcm9sbFRvU2NhbGVkSW5kZXgoZCksdGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbENoYW5nZWQoZCx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsSW5kZXgpKTt0aGlzLl9lbnN1cmVFbGVtZW50SW5WaWV3cG9ydCh0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsKX0sX2Vuc3VyZUVsZW1lbnRJblZpZXdwb3J0OmZ1bmN0aW9uKGIpe3ZhciBkPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYodGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zKXt2YXIgZj10aGlzLiQuZm9vdGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCwKaD10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtkLmJvdHRvbT5mP3RoaXMuJC5zY3JvbGxlci4kLnRhYmxlLnNjcm9sbFRvcCs9ZC5ib3R0b20tZjpkLnRvcDxoJiYodGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wKz1kLnRvcC1oKX1pZighYi5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe2I9dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7Zj10aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O2lmKGg9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93LnF1ZXJ5U2VsZWN0b3IoIltsYXN0LWZyb3plbl0iKSlmPWguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7ZC5yaWdodD5iP3RoaXMuJC5zY3JvbGxlci4kLnRhYmxlLnNjcm9sbExlZnQrPWQucmlnaHQtYjpkLmxlZnQ8ZiYmKHRoaXMuJC5zY3JvbGxlci4kLnRhYmxlLnNjcm9sbExlZnQrPQpkLmxlZnQtZil9fX07dmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9yPVt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3JJbXBsLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3JdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntjb2x1bW5SZW9yZGVyaW5nQWxsb3dlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX19Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUNvbHVtblJlb3JkZXJpbmdCZWhhdmlvcj17cHJvcGVydGllczp7X29yZGVyQmFzZVNjb3BlOnt0eXBlOk51bWJlcix2YWx1ZToxRTd9fSxsaXN0ZW5lcnM6e2RyYWdzdGFydDoiX29uRHJhZ1N0YXJ0IixkcmFnb3ZlcjoiX29uRHJhZ092ZXIiLGRyYWdlbmQ6Il9vbkRyYWdFbmQifSxvYnNlcnZlcnM6WyJfdXBkYXRlT3JkZXJzKGNvbHVtblRyZWUsIGNvbHVtblRyZWUuKikiXSxfdXBkYXRlT3JkZXJzOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmYlswXS5mb3JFYWNoKGZ1bmN0aW9uKGYsaCl7Zi5fb3JkZXI9KGgrMSkqdGhpcy5fb3JkZXJCYXNlU2NvcGV9LHRoaXMpfSxfb25EcmFnU3RhcnQ6ZnVuY3Rpb24oYil7aWYoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCI9PT1iLnRhcmdldC5sb2NhbE5hbWUpe3ZhciBkPXRoaXMuX2dldENlbGxCeUNlbGxDb250ZW50KGIudGFyZ2V0KTtkJiYodGhpcy50b2dnbGVBdHRyaWJ1dGUoInJlb3JkZXJpbmciLAohMCksdGhpcy5fZHJhZ2dlZENvbHVtbj1kLmNvbHVtbix0aGlzLl9zZXRTaWJsaW5nc1Jlb3JkZXJTdGF0dXModGhpcy5fZHJhZ2dlZENvbHVtbiwiYWxsb3dlZCIpLHRoaXMuX2RyYWdnZWRDb2x1bW4uX3Jlb3JkZXJTdGF0dXM9ImRyYWdnaW5nIixiLmRhdGFUcmFuc2ZlciYmKGIuZGF0YVRyYW5zZmVyLnNldERhdGEoInRleHQiLCIiKSxiLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkPSJtb3ZlIiksdGhpcy5fYXV0b1Njcm9sbGVyKCkpfX0sX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1czpmdW5jdGlvbihiLGQpe0FycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbShQb2x5bWVyLmRvbShiKS5wYXJlbnROb2RlKS5jaGlsZHJlbixmdW5jdGlvbihmKXtyZXR1cm4vY29sdW1uLy50ZXN0KGYubG9jYWxOYW1lKSYmdGhpcy5faXNTd2FwQWxsb3dlZChmLGIpfSx0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuX3Jlb3JkZXJTdGF0dXM9ZH0pfSxfb25EcmFnT3ZlcjpmdW5jdGlvbihiKXtpZih0aGlzLl9kcmFnZ2VkQ29sdW1uKXt2YXIgZD0KKFBvbHltZXIuRWxlbWVudD9iLmNvbXBvc2VkUGF0aCgpOlBvbHltZXIuZG9tKGIpLnBhdGgpLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4idmFhZGluLWdyaWQtY2VsbC1jb250ZW50Ij09PWYubG9jYWxOYW1lfSlbMF07ZCYmKGIucHJldmVudERlZmF1bHQoKSxkPXRoaXMuX2dldENlbGxCeUNlbGxDb250ZW50KGQpLChkPXRoaXMuX2dldFRhcmdldENvbHVtbihkLHRoaXMuX2RyYWdnZWRDb2x1bW4pKSYmdGhpcy5faXNTd2FwQWxsb3dlZCh0aGlzLl9kcmFnZ2VkQ29sdW1uLGQpJiZ0aGlzLl9pc1N3YXBwYWJsZUJ5UG9zaXRpb24oZCxiLmNsaWVudFgpJiZ0aGlzLl9zd2FwQ29sdW1uT3JkZXJzKHRoaXMuX2RyYWdnZWRDb2x1bW4sZCksdGhpcy5fbGFzdERyYWdDbGllbnRYPWIuY2xpZW50WCl9fSxfYXV0b1Njcm9sbGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5fbGFzdERyYWdDbGllbnRYKXt2YXIgYj10aGlzLl9sYXN0RHJhZ0NsaWVudFgtdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCsKNTAsZD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtdGhpcy5fbGFzdERyYWdDbGllbnRYKzUwOzA8Yj90aGlzLiQudGFibGUuc2Nyb2xsTGVmdCs9Yi8xMDowPGQmJih0aGlzLiQudGFibGUuc2Nyb2xsTGVmdC09ZC8xMCk7dGhpcy5fc2Nyb2xsSGFuZGxlcigpfXRoaXMuX2RyYWdnZWRDb2x1bW4mJnRoaXMuYXN5bmModGhpcy5fYXV0b1Njcm9sbGVyLDEwKX0sX29uRHJhZ0VuZDpmdW5jdGlvbigpe3RoaXMuX2RyYWdnZWRDb2x1bW4mJih0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsITEpLHRoaXMuX2RyYWdnZWRDb2x1bW4uX3Jlb3JkZXJTdGF0dXM9IiIsdGhpcy5fc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzKHRoaXMuX2RyYWdnZWRDb2x1bW4sIiIpLHRoaXMuX2xhc3REcmFnQ2xpZW50WD10aGlzLl9kcmFnZ2VkQ29sdW1uPW51bGwpfSxfaXNTd2FwQWxsb3dlZDpmdW5jdGlvbihiLGQpe2lmKGImJmQpe3ZhciBmPWIucGFyZW50RWxlbWVudD09PWQucGFyZW50RWxlbWVudCwKaD1iLmZyb3plbj09PWQuZnJvemVuO3JldHVybiBiIT09ZCYmZiYmaH19LF9pc1N3YXBwYWJsZUJ5UG9zaXRpb246ZnVuY3Rpb24oYixkKXt2YXIgZj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcy4kLmhlYWRlcikucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLWNlbGwiKSxmdW5jdGlvbihrKXtyZXR1cm4gay5jb2x1bW49PT1ifSlbMF0saD10aGlzLiQuaGVhZGVyLnF1ZXJ5U2VsZWN0b3IoIltyZW9yZGVyLXN0YXR1c1x4M2RkcmFnZ2luZ10iKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0PmgubGVmdD9kPmYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQtaC53aWR0aDpkPGYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCtoLndpZHRofSxfZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQ6ZnVuY3Rpb24oYil7aWYoUG9seW1lci5FbGVtZW50KXJldHVybiBiLmFzc2lnbmVkU2xvdC5wYXJlbnROb2RlOwpiPVBvbHltZXIuZG9tKGIpLmdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzKClbMF07cmV0dXJuIFBvbHltZXIuZG9tKGIpLnBhcmVudE5vZGV9LF9zd2FwQ29sdW1uT3JkZXJzOmZ1bmN0aW9uKGIsZCl7dmFyIGY9Yi5fb3JkZXI7Yi5fb3JkZXI9ZC5fb3JkZXI7ZC5fb3JkZXI9Zjt0aGlzLl91cGRhdGVMYXN0RnJvemVuKCk7dGhpcy5fdXBkYXRlTGFzdENvbHVtbigpfSxfZ2V0VGFyZ2V0Q29sdW1uOmZ1bmN0aW9uKGIsZCl7aWYoYiYmZCl7Zm9yKHZhciBmPWIuY29sdW1uO2YucGFyZW50RWxlbWVudCE9PWQucGFyZW50RWxlbWVudCYmZiE9PXRoaXMudGFyZ2V0OylmPWYucGFyZW50RWxlbWVudDtyZXR1cm4gZi5wYXJlbnRFbGVtZW50PT09ZC5wYXJlbnRFbGVtZW50P2Y6Yi5jb2x1bW59fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvaXJvbi1saXN0LWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3JJbXBsPWZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpob25lfGFkOyg/OiBVOyk/IENQVSkgT1MgKFxkKykvKSxkPWImJjg8PWJbMV07cmV0dXJue2lzOiJpcm9uLWxpc3QiLHByb3BlcnRpZXM6e21heFBoeXNpY2FsQ291bnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMH0sYXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0saW5kZXhBczp7dHlwZTpTdHJpbmcsdmFsdWU6ImluZGV4In19LF9yYXRpbzouNSxfc2Nyb2xsZXJQYWRkaW5nVG9wOjAsX3Njcm9sbFBvc2l0aW9uOjAsX3BoeXNpY2FsU2l6ZTowLF9waHlzaWNhbEF2ZXJhZ2U6MCxfcGh5c2ljYWxBdmVyYWdlQ291bnQ6MCxfcGh5c2ljYWxUb3A6MCxfdmlydHVhbENvdW50OjAsX3BoeXNpY2FsSW5kZXhGb3JLZXk6bnVsbCxfZXN0U2Nyb2xsSGVpZ2h0OjAsX3Njcm9sbEhlaWdodDowLF92aWV3cG9ydEhlaWdodDowLF92aWV3cG9ydFdpZHRoOjAsCl9waHlzaWNhbEl0ZW1zOm51bGwsX3BoeXNpY2FsU2l6ZXM6bnVsbCxfZmlyc3RWaXNpYmxlSW5kZXhWYWw6bnVsbCxfbGFzdFZpc2libGVJbmRleFZhbDpudWxsLF9jb2xsZWN0aW9uOm51bGwsX2l0ZW1zUmVuZGVyZWQ6ITEsX2xhc3RQYWdlOm51bGwsX21heFBhZ2VzOjMsX2l0ZW1zUGVyUm93OjEsX2l0ZW1XaWR0aDowLF9yb3dIZWlnaHQ6MCxnZXQgX3BoeXNpY2FsQm90dG9tKCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3BoeXNpY2FsU2l6ZX0sZ2V0IF9zY3JvbGxCb3R0b20oKXtyZXR1cm4gdGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fdmlld3BvcnRIZWlnaHR9LGdldCBfdmlydHVhbEVuZCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xfSxnZXQgX2hpZGRlbkNvbnRlbnRTaXplKCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU2l6ZS10aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF9tYXhTY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LQp0aGlzLl92aWV3cG9ydEhlaWdodCt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3B9LF9taW5WaXJ0dWFsU3RhcnQ6MCxnZXQgX21heFZpcnR1YWxTdGFydCgpe3JldHVybiBNYXRoLm1heCgwLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl9waHlzaWNhbENvdW50KX0sX3ZpcnR1YWxTdGFydFZhbDowLHNldCBfdmlydHVhbFN0YXJ0KGYpe3RoaXMuX3ZpcnR1YWxTdGFydFZhbD1NYXRoLm1pbih0aGlzLl9tYXhWaXJ0dWFsU3RhcnQsTWF0aC5tYXgodGhpcy5fbWluVmlydHVhbFN0YXJ0LGYpKX0sZ2V0IF92aXJ0dWFsU3RhcnQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0VmFsfHwwfSxfcGh5c2ljYWxTdGFydFZhbDowLHNldCBfcGh5c2ljYWxTdGFydChmKXt0aGlzLl9waHlzaWNhbFN0YXJ0VmFsPWYldGhpcy5fcGh5c2ljYWxDb3VudDswPnRoaXMuX3BoeXNpY2FsU3RhcnRWYWwmJih0aGlzLl9waHlzaWNhbFN0YXJ0VmFsPXRoaXMuX3BoeXNpY2FsQ291bnQrdGhpcy5fcGh5c2ljYWxTdGFydFZhbCk7CnRoaXMuX3BoeXNpY2FsRW5kPSh0aGlzLl9waHlzaWNhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMSkldGhpcy5fcGh5c2ljYWxDb3VudH0sZ2V0IF9waHlzaWNhbFN0YXJ0KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU3RhcnRWYWx8fDB9LF9waHlzaWNhbENvdW50VmFsOjAsc2V0IF9waHlzaWNhbENvdW50KGYpe3RoaXMuX3BoeXNpY2FsQ291bnRWYWw9Zjt0aGlzLl9waHlzaWNhbEVuZD0odGhpcy5fcGh5c2ljYWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LGdldCBfcGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsfSxfcGh5c2ljYWxFbmQ6MCxnZXQgX29wdFBoeXNpY2FsU2l6ZSgpe3JldHVybiB0aGlzLl92aWV3cG9ydEhlaWdodCp0aGlzLl9tYXhQYWdlc30sZ2V0IF9vcHRQaHlzaWNhbENvdW50KCl7cmV0dXJuIHRoaXMuX2VzdFJvd3NJblZpZXcqdGhpcy5faXRlbXNQZXJSb3cqdGhpcy5fbWF4UGFnZXN9LApnZXQgX2lzVmlzaWJsZSgpe3JldHVybiB0aGlzLnNjcm9sbFRhcmdldCYmISghdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0V2lkdGgmJiF0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQpfSxnZXQgZmlyc3RWaXNpYmxlSW5kZXgoKXtpZihudWxsPT09dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWwpe3ZhciBmPU1hdGguZmxvb3IodGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wKTt0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD10aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oaCxrKXtmKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoaCk7aWYoZj50aGlzLl9zY3JvbGxQb3NpdGlvbilyZXR1cm4ga30pfHwwfXJldHVybiB0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbH0sZ2V0IGxhc3RWaXNpYmxlSW5kZXgoKXtpZihudWxsPT09dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbCl7dmFyIGY9dGhpcy5fcGh5c2ljYWxUb3A7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGgsCmspe2lmKGY8dGhpcy5fc2Nyb2xsQm90dG9tKXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9aztlbHNlIHJldHVybiEwO2YrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKX0pfXJldHVybiB0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsfSxnZXQgX2RlZmF1bHRTY3JvbGxUYXJnZXQoKXtyZXR1cm4gdGhpc30sZ2V0IF92aXJ0dWFsUm93Q291bnQoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpcnR1YWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGdldCBfZXN0Um93c0luVmlldygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlld3BvcnRIZWlnaHQvdGhpcy5fcm93SGVpZ2h0KX0sZ2V0IF9waHlzaWNhbFJvd3MoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCk7dGhpcy5fcmVuZGVyKCk7dGhpcy5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLAoiX3Jlc2l6ZUhhbmRsZXIiKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pdGVtc1JlbmRlcmVkPSExO3RoaXMudW5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLCJfcmVzaXplSGFuZGxlciIpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzPzA6cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcylbInBhZGRpbmctdG9wIl18fDAsMTApO3RoaXMuX3ZpZXdwb3J0SGVpZ2h0PXRoaXMuX3Njcm9sbFRhcmdldEhlaWdodH0sX3VwZGF0ZTpmdW5jdGlvbihmLGgpe3RoaXMuX2Fzc2lnbk1vZGVscyhmKTt0aGlzLl91cGRhdGVNZXRyaWNzKGYpO2lmKGgpZm9yKDtoLmxlbmd0aDspZj1oLnBvcCgpLHRoaXMuX3BoeXNpY2FsVG9wLT10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoZik7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSgpOwp0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgpfSxfaW5jcmVhc2VQb29sSWZOZWVkZWQ6ZnVuY3Rpb24oKXtpZigwPT09dGhpcy5fdmlld3BvcnRIZWlnaHQpcmV0dXJuITE7dmFyIGY9dGhpcy5fcGh5c2ljYWxTaXplcy5yZWR1Y2UoZnVuY3Rpb24oayx0KXtyZXR1cm4gaysodHx8MTAwKX0sMCksaD1mPnRoaXMuX3ZpZXdwb3J0SGVpZ2h0O2lmKGY+PXRoaXMuX29wdFBoeXNpY2FsU2l6ZSYmaClyZXR1cm4hMTtmPU1hdGguZmxvb3IodGhpcy5fcGh5c2ljYWxTaXplL3RoaXMuX3ZpZXdwb3J0SGVpZ2h0KTswPT09Zj90aGlzLl9kZWJvdW5jZVRlbXBsYXRlKHRoaXMuX2luY3JlYXNlUG9vbC5iaW5kKHRoaXMsTWF0aC5yb3VuZCguNSp0aGlzLl9waHlzaWNhbENvdW50KSkpOnRoaXMuX2xhc3RQYWdlIT09ZiYmaD9Qb2x5bWVyLmRvbS5hZGREZWJvdW5jZXIodGhpcy5kZWJvdW5jZSgiX2RlYm91bmNlVGVtcGxhdGUiLHRoaXMuX2luY3JlYXNlUG9vbC5iaW5kKHRoaXMsdGhpcy5faXRlbXNQZXJSb3cpLAoxNikpOnRoaXMuX2RlYm91bmNlVGVtcGxhdGUodGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyxNYXRoLmNlaWwodGhpcy5fdmlld3BvcnRIZWlnaHQvKHRoaXMuX3BoeXNpY2FsU2l6ZS90aGlzLl9waHlzaWNhbENvdW50KSp0aGlzLl9tYXhQYWdlcy10aGlzLl9waHlzaWNhbENvdW50KXx8MSkpO3RoaXMuX2xhc3RQYWdlPWY7cmV0dXJuITB9LF9kZWJvdW5jZVRlbXBsYXRlOmZ1bmN0aW9uKGYpe1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsZikpfSxfaW5jcmVhc2VQb29sOmZ1bmN0aW9uKGYpe3ZhciBoPXRoaXMuX3BoeXNpY2FsQ291bnQ7Zj1NYXRoLm1pbih0aGlzLl9waHlzaWNhbENvdW50K2YsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCxNYXRoLm1heCh0aGlzLm1heFBoeXNpY2FsQ291bnQsMjUpKS1oOzA+PWZ8fChbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsSXRlbXMsdGhpcy5fY3JlYXRlUG9vbChmKSksCltdLnB1c2guYXBwbHkodGhpcy5fcGh5c2ljYWxTaXplcyxBcnJheShmKSksdGhpcy5fcGh5c2ljYWxDb3VudD1oK2YsdGhpcy5fdXBkYXRlKCkpfSxfcmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGY9MDx0aGlzLl92aXJ0dWFsQ291bnR8fDA8dGhpcy5fcGh5c2ljYWxDb3VudDt0aGlzLmlzQXR0YWNoZWQmJiF0aGlzLl9pdGVtc1JlbmRlcmVkJiZ0aGlzLl9pc1Zpc2libGUmJmYmJih0aGlzLl9sYXN0UGFnZT0wLHRoaXMuX3VwZGF0ZSgpLHRoaXMuX2l0ZW1zUmVuZGVyZWQ9ITApfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKGYsaCl7dmFyIGssdDtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmaClmb3IodD0wO3Q8aC5sZW5ndGg7dCsrKXt2YXIgbD1oW3RdO3ZhciBwPXRoaXMuX2NvbXB1dGVWaWR4KGwpO2lmKG51bGwhPShrPWYuY2FsbCh0aGlzLGwscCkpKXJldHVybiBrfWVsc2V7bD10aGlzLl9waHlzaWNhbFN0YXJ0O2ZvcihwPXRoaXMuX3ZpcnR1YWxTdGFydDtsPHRoaXMuX3BoeXNpY2FsQ291bnQ7bCsrLApwKyspaWYobnVsbCE9KGs9Zi5jYWxsKHRoaXMsbCxwKSkpcmV0dXJuIGs7Zm9yKGw9MDtsPHRoaXMuX3BoeXNpY2FsU3RhcnQ7bCsrLHArKylpZihudWxsIT0oaz1mLmNhbGwodGhpcyxsLHApKSlyZXR1cm4ga319LF9jb21wdXRlVmlkeDpmdW5jdGlvbihmKXtyZXR1cm4gZj49dGhpcy5fcGh5c2ljYWxTdGFydD90aGlzLl92aXJ0dWFsU3RhcnQrKGYtdGhpcy5fcGh5c2ljYWxTdGFydCk6dGhpcy5fdmlydHVhbFN0YXJ0Kyh0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3BoeXNpY2FsU3RhcnQpK2Z9LF91cGRhdGVNZXRyaWNzOmZ1bmN0aW9uKGYpe3RoaXMuc2Nyb2xsaW5nJiZQb2x5bWVyLmRvbS5mbHVzaCgpO3ZhciBoPTAsaz0wLHQ9dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQsbD10aGlzLl9waHlzaWNhbEF2ZXJhZ2U7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHApe2srPXRoaXMuX3BoeXNpY2FsU2l6ZXNbcF18fDA7dGhpcy5fcGh5c2ljYWxTaXplc1twXT10aGlzLl9waHlzaWNhbEl0ZW1zW3BdLm9mZnNldEhlaWdodDsKaCs9dGhpcy5fcGh5c2ljYWxTaXplc1twXTt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1twXT8xOjB9LGYpO3RoaXMuX3ZpZXdwb3J0SGVpZ2h0PXRoaXMuX3Njcm9sbFRhcmdldEhlaWdodDt0aGlzLl9waHlzaWNhbFNpemU9dGhpcy5fcGh5c2ljYWxTaXplK2gtazt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCE9PXQmJih0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9TWF0aC5yb3VuZCgobCp0K2gpL3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50KSl9LF9wb3NpdGlvbkl0ZW1zOmZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKTt2YXIgZj10aGlzLl9waHlzaWNhbFRvcDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oaCl7dGhpcy5fcGh5c2ljYWxJdGVtc1toXS5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKDAsZik7Zis9dGhpcy5fcGh5c2ljYWxTaXplc1toXX0pfSxfZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50OmZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLl9waHlzaWNhbFNpemVzW2ZdfSwKX3Nob3VsZFJlbmRlck5leHRSb3c6ZnVuY3Rpb24oZil7cmV0dXJuIGYldGhpcy5faXRlbXNQZXJSb3c9PT10aGlzLl9pdGVtc1BlclJvdy0xfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgZj0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2YmJih0aGlzLl9waHlzaWNhbFRvcC09ZixkfHwwPT09dGhpcy5fcGh5c2ljYWxUb3B8fHRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fc2Nyb2xsVG9wLWYpKX0sX3Jlc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oZil7dGhpcy5zY3JvbGxUYXJnZXQmJih0aGlzLl9zY3JvbGxQb3NpdGlvbj10aGlzLl9zY3JvbGxUb3A9Zil9LF91cGRhdGVTY3JvbGxlclNpemU6ZnVuY3Rpb24oZil7dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0PXRoaXMuX3BoeXNpY2FsQm90dG9tK01hdGgubWF4KHRoaXMuX3ZpcnR1YWxDb3VudC0KdGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsMCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2lmKChmPShmPWZ8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fE1hdGguYWJzKHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl9zY3JvbGxIZWlnaHQpPj10aGlzLl9vcHRQaHlzaWNhbFNpemUpdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHQrInB4Iix0aGlzLl9zY3JvbGxIZWlnaHQ9dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0fSxzY3JvbGxUb0luZGV4OmZ1bmN0aW9uKGYpe1BvbHltZXIuZG9tLmZsdXNoKCk7Zj1NYXRoLm1pbihNYXRoLm1heChmLDApLHRoaXMuX3ZpcnR1YWxDb3VudC0xKTtpZighdGhpcy5faXNJbmRleFJlbmRlcmVkKGYpfHxmPj10aGlzLl9tYXhWaXJ0dWFsU3RhcnQpdGhpcy5fdmlydHVhbFN0YXJ0PQpmLTE7dGhpcy5fYXNzaWduTW9kZWxzKCk7dGhpcy5fdXBkYXRlTWV0cmljcygpO3RoaXMuX3BoeXNpY2FsVG9wPU1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7Zm9yKHZhciBoPXRoaXMuX3BoeXNpY2FsU3RhcnQsaz10aGlzLl92aXJ0dWFsU3RhcnQsdD0wLGw9dGhpcy5faGlkZGVuQ29udGVudFNpemU7azxmJiZ0PD1sOyl0Kz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoaCksaD0oaCsxKSV0aGlzLl9waHlzaWNhbENvdW50LGsrKzt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoITApO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcCt0KTt0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgpO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9Cm51bGx9LF9yZXNldEF2ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudD10aGlzLl9waHlzaWNhbEF2ZXJhZ2U9MH0sX3Jlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXtQb2x5bWVyLmRvbS5hZGREZWJvdW5jZXIodGhpcy5kZWJvdW5jZSgiX2RlYm91bmNlVGVtcGxhdGUiLGZ1bmN0aW9uKCl7dGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTt0aGlzLl9yZW5kZXIoKTt0aGlzLl9pdGVtc1JlbmRlcmVkJiZ0aGlzLl9waHlzaWNhbEl0ZW1zJiZ0aGlzLl9pc1Zpc2libGUmJih0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5maXJzdFZpc2libGVJbmRleCkpfS5iaW5kKHRoaXMpLDEpKX0sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24oZil7Zj10aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5W2ZdO251bGwhPWYmJih0aGlzLl91cGRhdGVNZXRyaWNzKFtmXSksdGhpcy5fcG9zaXRpb25JdGVtcygpKX0sX2lzSW5kZXhSZW5kZXJlZDpmdW5jdGlvbihmKXtyZXR1cm4gZj49CnRoaXMuX3ZpcnR1YWxTdGFydCYmZjw9dGhpcy5fdmlydHVhbEVuZH0sX2lzSW5kZXhWaXNpYmxlOmZ1bmN0aW9uKGYpe3JldHVybiBmPj10aGlzLmZpcnN0VmlzaWJsZUluZGV4JiZmPD10aGlzLmxhc3RWaXNpYmxlSW5kZXh9fX0oKTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Jcm9uTGlzdEJlaGF2aW9yPVtQb2x5bWVyLlRlbXBsYXRpemVyLFBvbHltZXIuSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZSIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Jcm9uTGlzdEJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlU2Nyb2xsQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVDb2x1bW5SZW9yZGVyaW5nQmVoYXZpb3IsUG9seW1lci5UZW1wbGF0aXplcl0scHJvcGVydGllczp7c2l6ZTpOdW1iZXIsY29sdW1uVHJlZTpBcnJheSxiaW5kRGF0YTpGdW5jdGlvbixyb3dEZXRhaWxzVGVtcGxhdGU6T2JqZWN0LGNvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxzYWZhcmk6e3R5cGU6Qm9vbGVhbix2YWx1ZTovXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfSxzY3JvbGxiYXJXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYi5zdHlsZS53aWR0aD0iMTAwcHgiO2Iuc3R5bGUuaGVpZ2h0PSIxMDBweCI7Yi5zdHlsZS5vdmVyZmxvdz0ic2Nyb2xsIjtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9Ii05OTk5cHgiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9Yi5vZmZzZXRXaWR0aC1iLmNsaWVudFdpZHRoO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGR9fSx0YXJnZXQ6T2JqZWN0LGhhc0RhdGE6Qm9vbGVhbn0sb2JzZXJ2ZXJzOlsiX2NvbHVtblRyZWVDaGFuZ2VkKGNvbHVtblRyZWUsIF9waHlzaWNhbEl0ZW1zLCBfcGh5c2ljYWxDb3VudFZhbCkiLCJfc2l6ZUNoYW5nZWQoc2l6ZSwgYmluZERhdGEsIGhhc0RhdGEpIiwiX3Jvd0RldGFpbHNUZW1wbGF0ZUNoYW5nZWQocm93RGV0YWlsc1RlbXBsYXRlLCBfcGh5c2ljYWxJdGVtcywgX3BoeXNpY2FsQ291bnRWYWwpIl0sbGlzdGVuZXJzOnsicHJvcGVydHktY2hhbmdlZCI6Il9jb2x1bW5Qcm9wQ2hhbmdlZCIsCmFuaW1hdGlvbmVuZDoiX29uQW5pbWF0aW9uRW5kIiwiY29sdW1uLXJlc2l6aW5nIjoiX29uQ29sdW1uUmVzaXplIn0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLiQ9dGhpcy4kfHx7fTt0aGlzLiQuaGVhZGVyPXRoaXMuZG9tSG9zdC4kLmhlYWRlcjt0aGlzLiQuaXRlbXM9dGhpcy5kb21Ib3N0LiQuaXRlbXM7dGhpcy4kLmZvb3Rlcj10aGlzLmRvbUhvc3QuJC5mb290ZXJ9LF9vbkNvbHVtblJlc2l6ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlQXR0cmlidXRlKCJjb2x1bW4tcmVzaXppbmciLHRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvcigiW2NvbHVtbi1yZXNpemluZ10iKSk7dGhpcy5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX0sX29uQW5pbWF0aW9uRW5kOmZ1bmN0aW9uKGIpey9hcHBlYXIvLnRlc3QoYi5hbmltYXRpb25OYW1lKSYmKHRoaXMuX3JlbmRlcigpLHRoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3MoKSxiLnN0b3BQcm9wYWdhdGlvbigpKX0sX2NvbHVtblByb3BDaGFuZ2VkOmZ1bmN0aW9uKGIpeyJoZWFkZXJUZW1wbGF0ZSI9PT0KYi5kZXRhaWwucGF0aCYmdGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLCEwLHRoaXMuJC5oZWFkZXIpOyJmb290ZXJUZW1wbGF0ZSI9PT1iLmRldGFpbC5wYXRoJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsITAsdGhpcy4kLmZvb3Rlcik7L2Zyb3plbnxoaWRkZW4vLnRlc3QoYi5kZXRhaWwucGF0aCkmJnRoaXMuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpOyJoaWRkZW4iPT09Yi5kZXRhaWwucGF0aCYmdGhpcy5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX0sX2hpZGVPdXRlclNjcm9sbGVyOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIDA9PT1iJiYhZH0sX2hpZGVUYWJsZU92ZXJmbG93OmZ1bmN0aW9uKGIsZCl7cmV0dXJuIDA9PT1iJiZkfSxfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihiLGQsZil7dm9pZCAwIT09YiYmZCYmdm9pZCAwIT09ZiYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkLGZ1bmN0aW9uKGgpe2gucm93RGV0YWlsc1RlbXBsYXRlPQpifSl9LF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihiLGQsZil7dm9pZCAwIT09YiYmZCYmdm9pZCAwIT09ZiYmKFBvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLHRoaXMuX3VwZGF0ZSksdGhpcy5fZnJvemVuQ2VsbHNDaGFuZ2VkKCksdGhpcy5faGFzVGVtcGxhdGVzQ2hhbmdlZChiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsZnVuY3Rpb24oaCl7aC5jb2x1bW5zPWJbYi5sZW5ndGgtMV19KSx0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpLFBvbHltZXIuZG9tLmZsdXNoKHRoaXMpLHRoaXMuX3VwZGF0ZUxhc3RDb2x1bW4oKSl9LF91cGRhdGVMYXN0Q29sdW1uOmZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChQb2x5bWVyLmRvbSh0aGlzLmRvbUhvc3Qucm9vdCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLXJvdyIpLGZ1bmN0aW9uKGIpe2IudXBkYXRlTGFzdENvbHVtbigpfSl9LF91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzOmZ1bmN0aW9uKCl7dGhpcy5fcGh5c2ljYWxTaXplcyYmClBvbHltZXIuZG9tLmZsdXNoKCk7dGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmMoKTtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcy4kLmhlYWRlcixmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3NTeW5jKCk7dGhpcy5fcGVuZGluZ1Njcm9sbFRvU2NhbGVkSW5kZXgmJnRoaXMuc2Nyb2xsVG9TY2FsZWRJbmRleCh0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleCl9LmJpbmQodGhpcykpfSxfdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmNsaWVudEhlaWdodCsicHgiLGQ9dGhpcy4kLmZvb3Rlci5jbGllbnRIZWlnaHQrInB4IjtbdGhpcy4kLm91dGVyc2l6ZXIsdGhpcy4kLmZpeGVkc2l6ZXIsdGhpcy4kLml0ZW1zXS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Yuc3R5bGUuYm9yZGVyVG9wV2lkdGg9YjtmLnN0eWxlLmJvcmRlckJvdHRvbVdpZHRoPQpkfSl9LF9oYXNUZW1wbGF0ZXNDaGFuZ2VkOmZ1bmN0aW9uKGIpe3ZhciBkPSExLGY9ITE7Yi5mb3JFYWNoKGZ1bmN0aW9uKGgpe3JldHVybiBoLmZvckVhY2goZnVuY3Rpb24oayl7ZD1kfHxrLmhlYWRlclRlbXBsYXRlO2Y9Znx8ay5mb290ZXJUZW1wbGF0ZX0pfSk7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLGQsdGhpcy4kLmhlYWRlcik7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLGYsdGhpcy4kLmZvb3Rlcil9LF9jcmVhdGVQb29sOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZD1BcnJheShiKSxmPTA7ZjxiO2YrKyl7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtcm93Iik7aC50YXJnZXQ9dGhpcy5kb21Ib3N0O2RbZl09aDtoLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwiIik7UG9seW1lci5kb20odGhpcy4kLml0ZW1zKS5hcHBlbmRDaGlsZChoKX1yZXR1cm4gZH0sX3NpemVDaGFuZ2VkOmZ1bmN0aW9uKGIsCmQsZil7aWYodm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmdm9pZCAwIT09Zil7dmFyIGg9dGhpcy5fc2Nyb2xsVG9wLGs9dGhpcy5maXJzdFZpc2libGVJbmRleCt0aGlzLl92aWR4T2Zmc2V0O3RoaXMuX3ZpcnR1YWxDb3VudD1NYXRoLm1pbihiLDFFNSk7dGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fTt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGw7dGhpcy5fdmlkeE9mZnNldD0wO3RoaXMuX3BoeXNpY2FsSXRlbXN8fCh0aGlzLl9waHlzaWNhbENvdW50PU1hdGgubWF4KDEsTWF0aC5taW4oMjUsdGhpcy5fdmlydHVhbENvdW50KSksdGhpcy5fcGh5c2ljYWxJdGVtcz10aGlzLl9jcmVhdGVQb29sKHRoaXMuX3BoeXNpY2FsQ291bnQpLHRoaXMuX3BoeXNpY2FsU2l6ZXM9QXJyYXkodGhpcy5fcGh5c2ljYWxDb3VudCkpO3RoaXMuX2l0ZW1zUmVuZGVyZWQ9ITE7dGhpcy5fZGVib3VuY2VUZW1wbGF0ZShmdW5jdGlvbigpe3RoaXMuX3JlbmRlcigpOwp0aGlzLl92aWV3cG9ydEhlaWdodCYmKHRoaXMuc2Nyb2xsVG9TY2FsZWRJbmRleChNYXRoLm1pbihrLHRoaXMuc2l6ZSkpLHRoaXMuX3Njcm9sbFRvcD1oLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSx0aGlzLmZsdXNoRGVib3VuY2VyKCJ2YWFkaW4tZ3JpZC1zY3JvbGxpbmciKSl9KX19LF9hc3NpZ25Nb2RlbHM6ZnVuY3Rpb24oYil7dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtPXRoaXMuX3ZpcnR1YWxJbmRleFRvSXRlbXx8e307dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGQsZil7ZD10aGlzLl9waHlzaWNhbEl0ZW1zW2RdO2QuaW5kZXgmJmRlbGV0ZSB0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW1bZC5pbmRleF07ZC5pbmRleD1mK3RoaXMuX3ZpZHhPZmZzZXQ7dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtW2QuaW5kZXhdPWQ7ZC50b2dnbGVBdHRyaWJ1dGUoIm9kZCIsZC5pbmRleCUyKTtkLnRvZ2dsZUF0dHJpYnV0ZSgibGFzdHJvdyIsZC5pbmRleD09PXRoaXMuc2l6ZS0xKTtkLnRvZ2dsZUF0dHJpYnV0ZSgiaGlkZGVuIiwKZC5pbmRleD49dGhpcy5zaXplKTt0aGlzLmJpbmREYXRhKGQuaW5kZXgsZCl9LGIpfSxfZ3JpZFJlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzKCk7dGhpcy5fcGh5c2ljYWxTaXplcyYmKHRoaXMuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihiKXtiLnVwZGF0ZVJvd0RldGFpbHNDZWxsTWV0cmljcygpfSksdGhpcy5kZWJvdW5jZSgidmFhZGluLWdyaWQtcmVzaXppbmciLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlKCl9LmJpbmQodGhpcyksMSkpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CYXNlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3Jlc2l6YWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOmZ1bmN0aW9uKCl7aWYoInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIhPT10aGlzLmxvY2FsTmFtZSl7dmFyIGI9UG9seW1lci5kb20odGhpcykucGFyZW50Tm9kZTtyZXR1cm4gYiYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1iLmxvY2FsTmFtZT9iLnJlc2l6YWJsZXx8ITE6ITF9fX0saGVhZGVyVGVtcGxhdGU6e3R5cGU6T2JqZWN0fSxmb290ZXJUZW1wbGF0ZTp7dHlwZTpPYmplY3R9LGZyb3plbjp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0saGlkZGVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfbGFzdEZyb3plbjp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sX29yZGVyOk51bWJlcixfcmVvcmRlclN0YXR1czpCb29sZWFufSxvYnNlcnZlcnM6WyJfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkKGZvb3RlclRlbXBsYXRlKSIsCiJfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkKGhlYWRlclRlbXBsYXRlKSIsIl9sYXN0RnJvemVuQ2hhbmdlZChfbGFzdEZyb3plbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihkKXswPD1kLmFkZGVkTm9kZXMubGVuZ3RoJiYodGhpcy5oZWFkZXJUZW1wbGF0ZT10aGlzLl9wcmVwYXJlSGVhZGVyVGVtcGxhdGUoKSx0aGlzLmZvb3RlclRlbXBsYXRlPXRoaXMuX3ByZXBhcmVGb290ZXJUZW1wbGF0ZSgpLHRoaXMudGVtcGxhdGU9dGhpcy5fcHJlcGFyZUJvZHlUZW1wbGF0ZSgpKX10aGlzLl90ZW1wbGF0ZU9ic2VydmVyPVBvbHltZXIuRWxlbWVudD9uZXcgUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyKHRoaXMsYik6UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKGIpfSxfcHJlcGFyZUhlYWRlclRlbXBsYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoInRlbXBsYXRlLmhlYWRlciIpfHxudWxsLAp7fSl9LF9wcmVwYXJlRm9vdGVyVGVtcGxhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlcGFyZVRlbXBsYXRpemVyKHRoaXMuX2ZpbmRUZW1wbGF0ZSgidGVtcGxhdGUuZm9vdGVyIil8fG51bGwse30pfSxfcHJlcGFyZUJvZHlUZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCJ0ZW1wbGF0ZTpub3QoLmhlYWRlcik6bm90KC5mb290ZXIpIix7fSkpfSxfcHJlcGFyZVRlbXBsYXRpemVyOmZ1bmN0aW9uKGIsZCl7aWYoYiYmIWIudGVtcGxhdGl6ZXIpe3ZhciBmPW5ldyB2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcjtmLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3Q7Zi5faW5zdGFuY2VQcm9wcz1kfHxmLl9pbnN0YW5jZVByb3BzO2YudGVtcGxhdGU9YjtiLnRlbXBsYXRpemVyPWZ9cmV0dXJuIGJ9LF9zZWxlY3RGaXJzdFRlbXBsYXRlOmZ1bmN0aW9uKGIpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvckFsbChiKSwKZnVuY3Rpb24oZCl7cmV0dXJuIFBvbHltZXIuZG9tKGQpLnBhcmVudE5vZGU9PT10aGlzfS5iaW5kKHRoaXMpKVswXX0sX2ZpbmRUZW1wbGF0ZTpmdW5jdGlvbihiKXsoYj10aGlzLl9zZWxlY3RGaXJzdFRlbXBsYXRlKGIpKSYmdGhpcy5kYXRhSG9zdCYmKGIuX3Jvb3REYXRhSG9zdD10aGlzLmRhdGFIb3N0Ll9yb290RGF0YUhvc3R8fHRoaXMuZGF0YUhvc3QpO3JldHVybiBifSxfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImhlYWRlclRlbXBsYXRlIix2YWx1ZTpifSl9LF9mb290ZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiZm9vdGVyVGVtcGxhdGUiLHZhbHVlOmJ9KX0sX2ZsZXhHcm93Q2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJmbGV4R3JvdyIsdmFsdWU6Yn0pfSxfd2lkdGhDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJ3aWR0aCIsdmFsdWU6Yn0pfSxfbGFzdEZyb3plbkNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoibGFzdEZyb3plbiIsdmFsdWU6Yn0pfX07CnZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7d2lkdGg6e3R5cGU6U3RyaW5nLHZhbHVlOiIxMDBweCJ9LGZsZXhHcm93Ont0eXBlOk51bWJlcix2YWx1ZToxfSx0ZW1wbGF0ZTp7dHlwZTpPYmplY3R9fSxvYnNlcnZlcnM6Il9mbGV4R3Jvd0NoYW5nZWQoZmxleEdyb3cpO193aWR0aENoYW5nZWQod2lkdGgpO190ZW1wbGF0ZUNoYW5nZWQodGVtcGxhdGUpO19mcm96ZW5DaGFuZ2VkKGZyb3plbiwgaXNBdHRhY2hlZCk7X2hpZGRlbkNoYW5nZWQoaGlkZGVuKTtfb3JkZXJDaGFuZ2VkKF9vcmRlcik7X3Jlb3JkZXJTdGF0dXNDaGFuZ2VkKF9yZW9yZGVyU3RhdHVzKTtfcmVzaXphYmxlQ2hhbmdlZChyZXNpemFibGUpIi5zcGxpdCgiOyIpLF9mcm96ZW5DaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmKHZvaWQgMD09PXRoaXMuX29sZEZyb3plbiYmITE9PT1ifHx0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLAp7cGF0aDoiZnJvemVuIix2YWx1ZTpifSksdGhpcy5fb2xkRnJvemVuPWIpfSxfdGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe2ImJmIudGVtcGxhdGl6ZXImJlBvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoYi50ZW1wbGF0aXplcik7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoidGVtcGxhdGUiLHZhbHVlOmJ9LHtidWJibGVzOiExfSl9LF9oaWRkZW5DaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImhpZGRlbiIsdmFsdWU6Yn0pfSxfb3JkZXJDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6Im9yZGVyIix2YWx1ZTpifSl9LF9yZW9yZGVyU3RhdHVzQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJyZW9yZGVyU3RhdHVzIix2YWx1ZTpifSl9LF9yZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJyZXNpemFibGUiLHZhbHVlOmJ9KX19O3ZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9yPVt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CYXNlQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1jb2x1bW4uaHRtbC0yLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC1jb2x1bW4iLGJlaGF2aW9yczpbdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JdfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtYXJyYXktZGF0YS1wcm92aWRlci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5BcnJheURhdGFQcm92aWRlckJlaGF2aW9yPXtwcm9wZXJ0aWVzOntpdGVtczpBcnJheX0sb2JzZXJ2ZXJzOlsiX2l0ZW1zQ2hhbmdlZChpdGVtcywgaXRlbXMuKikiXSxfaXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmKHRoaXMuc2l6ZT0oYnx8W10pLmxlbmd0aCx0aGlzLmRhdGFQcm92aWRlcj10aGlzLmRhdGFQcm92aWRlcnx8dGhpcy5fYXJyYXlEYXRhUHJvdmlkZXIsdGhpcy5jbGVhckNhY2hlKCkpfSxfYXJyYXlEYXRhUHJvdmlkZXI6ZnVuY3Rpb24oYixkKXt2YXIgZj0odGhpcy5pdGVtc3x8W10pLnNsaWNlKDApO3RoaXMuX2NoZWNrUGF0aHModGhpcy5fZmlsdGVycywiZmlsdGVyaW5nIixmKSYmKGY9dGhpcy5fZmlsdGVyKGYpKTt0aGlzLnNpemU9Zi5sZW5ndGg7Yi5zb3J0T3JkZXJzLmxlbmd0aCYmdGhpcy5fY2hlY2tQYXRocyh0aGlzLl9zb3J0ZXJzLCJzb3J0aW5nIixmKSYmKGY9Zi5zb3J0KHRoaXMuX211bHRpU29ydC5iaW5kKHRoaXMpKSk7CnZhciBoPWIucGFnZSpiLnBhZ2VTaXplO2QoZi5zbGljZShoLGgrYi5wYWdlU2l6ZSksZi5sZW5ndGgpfSxfY2hlY2tQYXRoczpmdW5jdGlvbihiLGQsZil7aWYoIWYubGVuZ3RoKXJldHVybiExO3ZhciBoPSEwLGs7Zm9yKGsgaW4gYil7dmFyIHQ9YltrXS5wYXRoO2lmKHQmJi0xIT09dC5pbmRleE9mKCIuIikpe3ZhciBsPXQucmVwbGFjZSgvXC5bXlwuXSokLywiIik7dm9pZCAwPT09UG9seW1lci5CYXNlLmdldChsLGZbMF0pJiYoY29uc29sZS53YXJuKCdQYXRoICInK3QrJyIgdXNlZCBmb3IgJytkKyIgZG9lcyBub3QgZXhpc3QgaW4gYWxsIG9mIHRoZSBpdGVtcywgIitkKyIgaXMgZGlzYWJsZWQuIiksaD0hMSl9fXJldHVybiBofSxfbXVsdGlTb3J0OmZ1bmN0aW9uKGIsZCl7cmV0dXJuIHRoaXMuX3NvcnRlcnMubWFwKGZ1bmN0aW9uKGYpe3JldHVybiJhc2MiPT09Zi5kaXJlY3Rpb24/dGhpcy5fY29tcGFyZShQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxiKSxQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCwKZCkpOiJkZXNjIj09PWYuZGlyZWN0aW9uP3RoaXMuX2NvbXBhcmUoUG9seW1lci5CYXNlLmdldChmLnBhdGgsZCksUG9seW1lci5CYXNlLmdldChmLnBhdGgsYikpOjB9LHRoaXMpLnJlZHVjZShmdW5jdGlvbihmLGgpe3JldHVybiBmP2Y6aH0sMCl9LF9ub3JtYWxpemVFbXB0eVZhbHVlOmZ1bmN0aW9uKGIpe3JldHVybiAwPD1bdm9pZCAwLG51bGxdLmluZGV4T2YoYik/IiI6aXNOYU4oYik/Yi50b1N0cmluZygpOmJ9LF9jb21wYXJlOmZ1bmN0aW9uKGIsZCl7Yj10aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKGIpO2Q9dGhpcy5fbm9ybWFsaXplRW1wdHlWYWx1ZShkKTtyZXR1cm4gYjxkPy0xOmI+ZD8xOjB9LF9maWx0ZXI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZmlsdGVyKGZ1bmN0aW9uKGQpe3JldHVybiAwPT09dGhpcy5fZmlsdGVycy5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuLTE9PT10aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLGQpKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmLnZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSl9LmJpbmQodGhpcykpLmxlbmd0aH0sCnRoaXMpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZHluYW1pYy1jb2x1bW5zLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkR5bmFtaWNDb2x1bW5zQmVoYXZpb3I9e3JlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fYWRkTm9kZU9ic2VydmVyKCl9LF9oYXNDb2x1bW5Hcm91cHM6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspaWYoInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1iW2RdLmxvY2FsTmFtZSlyZXR1cm4hMDtyZXR1cm4hMX0sX2dldENoaWxkQ29sdW1uczpmdW5jdGlvbihiKXtyZXR1cm4gUG9seW1lci5kb20oYikucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKCJ2YWFkaW4tZ3JpZC1jb2x1bW4sIHZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCwgdmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiIpfSxfZmxhdHRlbkNvbHVtbkdyb3VwczpmdW5jdGlvbihiKXtyZXR1cm4gYi5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1kLmxvY2FsTmFtZT90aGlzLl9nZXRDaGlsZENvbHVtbnMoZCk6W2RdfSx0aGlzKS5yZWR1Y2UoZnVuY3Rpb24oZCwKZil7cmV0dXJuIGQuY29uY2F0KGYpfSxbXSl9LF9nZXRDb2x1bW5UcmVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPVtdLGQ9dGhpcy5xdWVyeUFsbEVmZmVjdGl2ZUNoaWxkcmVuKCJ2YWFkaW4tZ3JpZC1jb2x1bW4sIHZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCwgdmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiIpOzspe2IucHVzaChkKTtpZighdGhpcy5faGFzQ29sdW1uR3JvdXBzKGQpKWJyZWFrO2Q9dGhpcy5fZmxhdHRlbkNvbHVtbkdyb3VwcyhkKX1yZXR1cm4gYn0sX3VwZGF0ZUNvbHVtblRyZWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9nZXRDb2x1bW5UcmVlKCk7dGhpcy5fYXJyYXlFcXVhbHMoYix0aGlzLl9jb2x1bW5UcmVlKXx8KHRoaXMuX2NvbHVtblRyZWU9Yil9LF9hZGROb2RlT2JzZXJ2ZXI6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj1Qb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChmKXtyZXR1cm4gZi5ub2RlVHlwZT09PQpOb2RlLkVMRU1FTlRfTk9ERSYmL152YWFkaW4tZ3JpZC0oY29sdW1ufHNlbGVjdGlvbikvaS50ZXN0KGYubG9jYWxOYW1lKX0oMDxiLmFkZGVkTm9kZXMuZmlsdGVyKGQpLmxlbmd0aHx8MDxiLnJlbW92ZWROb2Rlcy5maWx0ZXIoZCkubGVuZ3RoKSYmdGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpOyhQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvd3x8UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpJiZQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLiQuZm9vdGVyRm9jdXNUcmFwKTt0aGlzLmRlYm91bmNlKCJjaGVjay1pbXBvcnRzIix0aGlzLl9jaGVja0ltcG9ydHMsMkUzKX0uYmluZCh0aGlzKSl9LF9hcnJheUVxdWFsczpmdW5jdGlvbihiLGQpe2lmKCFifHwhZHx8Yi5sZW5ndGghPWQubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZj0wLGg9Yi5sZW5ndGg7ZjxoO2YrKylpZihiW2ZdaW5zdGFuY2VvZiBBcnJheSYmZFtmXWluc3RhbmNlb2YgQXJyYXkpe2lmKCF0aGlzLl9hcnJheUVxdWFscyhiW2ZdLApkW2ZdKSlyZXR1cm4hMX1lbHNlIGlmKGJbZl0hPWRbZl0pcmV0dXJuITE7cmV0dXJuITB9LF9jaGVja0ltcG9ydHM6ZnVuY3Rpb24oKXtbInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIsInZhYWRpbi1ncmlkLXNvcnRlciIsInZhYWRpbi1ncmlkLWZpbHRlciIsInZhYWRpbi1ncmlkLXNlbGVjdGlvbi1jb2x1bW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBkPVBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3IoYik7IWR8fChQb2x5bWVyLmlzSW5zdGFuY2U/UG9seW1lci5pc0luc3RhbmNlKGQpOmQgaW5zdGFuY2VvZiBQb2x5bWVyLkVsZW1lbnQpfHxjb25zb2xlLndhcm4oIk1ha2Ugc3VyZSB5b3UgaGF2ZSBpbXBvcnRlZCB0aGUgcmVxdWlyZWQgbW9kdWxlIGZvciBceDNjIitiKyJceDNlIGVsZW1lbnQuIil9LHRoaXMpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtc29ydC1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Tb3J0QmVoYXZpb3I9e3Byb3BlcnRpZXM6e211bHRpU29ydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc29ydGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3ByZXZpb3VzU29ydGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LGxpc3RlbmVyczp7InNvcnRlci1jaGFuZ2VkIjoiX29uU29ydGVyQ2hhbmdlZCJ9LHJlYWR5OmZ1bmN0aW9uKCl7UG9seW1lci5FbGVtZW50JiYhUG9seW1lci5TZXR0aW5ncy51c2VOYXRpdmVTaGFkb3cmJnRoaXMuYXN5bmMoZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJ2YWFkaW4tZ3JpZC1zb3J0ZXIiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsZnVuY3Rpb24oZCl7ZC5maXJlJiZkLmZpcmUoInNvcnRlci1jaGFuZ2VkIil9KX0pfSxfb25Tb3J0ZXJDaGFuZ2VkOmZ1bmN0aW9uKGIpe3ZhciBkPQpiLnRhcmdldDt0aGlzLl9yZW1vdmVBcnJheUl0ZW0odGhpcy5fc29ydGVycyxkKTtkLl9vcmRlcj1udWxsO3RoaXMubXVsdGlTb3J0PyhkLmRpcmVjdGlvbiYmdGhpcy5fc29ydGVycy51bnNoaWZ0KGQpLHRoaXMuX3NvcnRlcnMuZm9yRWFjaChmdW5jdGlvbihmLGgpe2YuX29yZGVyPTE8dGhpcy5fc29ydGVycy5sZW5ndGg/aDpudWxsfSx0aGlzKSk6KHRoaXMuX3NvcnRlcnMuZm9yRWFjaChmdW5jdGlvbihmKXtmLl9vcmRlcj1udWxsO2YuZGlyZWN0aW9uPW51bGx9KSxkLmRpcmVjdGlvbiYmKHRoaXMuX3NvcnRlcnM9W2RdKSk7Yi5zdG9wUHJvcGFnYXRpb24oKTt0aGlzLmRhdGFQcm92aWRlciYmSlNPTi5zdHJpbmdpZnkodGhpcy5fcHJldmlvdXNTb3J0ZXJzKSE9PUpTT04uc3RyaW5naWZ5KHRoaXMuX21hcFNvcnRlcnMoKSkmJnRoaXMuY2xlYXJDYWNoZSgpO3RoaXMuX3ByZXZpb3VzU29ydGVycz10aGlzLl9tYXBTb3J0ZXJzKCl9LF9tYXBTb3J0ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvcnRlcnMubWFwKGZ1bmN0aW9uKGIpe3JldHVybntwYXRoOmIucGF0aCwKZGlyZWN0aW9uOmIuZGlyZWN0aW9ufX0pfSxfcmVtb3ZlQXJyYXlJdGVtOmZ1bmN0aW9uKGIsZCl7ZD1iLmluZGV4T2YoZCk7LTE8ZCYmYi5zcGxpY2UoZCwxKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWZpbHRlci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkLkZpbHRlckJlaGF2aW9yPXtwcm9wZXJ0aWVzOntfZmlsdGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LGxpc3RlbmVyczp7ImZpbHRlci1jaGFuZ2VkIjoiX2ZpbHRlckNoYW5nZWQifSxfZmlsdGVyQ2hhbmdlZDpmdW5jdGlvbihiKXstMT09PXRoaXMuX2ZpbHRlcnMuaW5kZXhPZihiLnRhcmdldCkmJnRoaXMuX2ZpbHRlcnMucHVzaChiLnRhcmdldCk7Yi5zdG9wUHJvcGFnYXRpb24oKTt0aGlzLmRhdGFQcm92aWRlciYmdGhpcy5jbGVhckNhY2hlKCl9LF9tYXBGaWx0ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpbHRlcnMubWFwKGZ1bmN0aW9uKGIpe3JldHVybntwYXRoOmIucGF0aCx2YWx1ZTpiLnZhbHVlfX0pfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQiLHByb3BlcnRpZXM6e19jb2x1bW5UcmVlOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sc2l6ZTpOdW1iZXIsX3Jvd0RldGFpbHNUZW1wbGF0ZTpPYmplY3QsX2JpbmREYXRhOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRJdGVtLmJpbmQodGhpcyl9fX0sYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkFjdGl2ZUl0ZW1CZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Sb3dEZXRhaWxzQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRGF0YVByb3ZpZGVyQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRHluYW1pY0NvbHVtbnNCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5BcnJheURhdGFQcm92aWRlckJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlNlbGVjdGlvbkJlaGF2aW9yLAp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Tb3J0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRmlsdGVyQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlS2V5Ym9hcmRCZWhhdmlvcl0sbGlzdGVuZXJzOnsicHJvcGVydHktY2hhbmdlZCI6Il9jb2x1bW5Qcm9wQ2hhbmdlZCIsImlyb24tcmVzaXplIjoiX2dyaWRSZXNpemVIYW5kbGVyIn0sX3VwZGF0ZUl0ZW06ZnVuY3Rpb24oYixkKXtiLnN0eWxlLm1pbkhlaWdodD1kPyIiOnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxBdmVyYWdlKyJweCI7Yi5pdGVtPWQ7Yi5zZWxlY3RlZD10aGlzLl9pc1NlbGVjdGVkKGQpO2IuZXhwYW5kZWQ9dGhpcy5faXNFeHBhbmRlZChkKTtiLmFjdGl2ZT1udWxsIT09ZCYmZD09dGhpcy5hY3RpdmVJdGVtO2IuZm9jdXNlZD1iLmluZGV4PT09dGhpcy4kLml0ZW1zLl9mb2N1c2VkUm93SW5kZXh9LF9nZXRDb250ZW50VGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LApyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUNvbHVtblRyZWUoKTt0aGlzLl9yb3dEZXRhaWxzVGVtcGxhdGU9UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvcigidGVtcGxhdGUucm93LWRldGFpbHMiKXx8dm9pZCAwO3RoaXMuJC5zY3JvbGxlci50YXJnZXQ9dGhpcztudWxsPT09ZG9jdW1lbnQuZG9jdHlwZSYmY29uc29sZS53YXJuKCdceDNjdmFhZGluLWdyaWRceDNlIHJlcXVpcmVzIHRoZSAic3RhbmRhcmRzIG1vZGUiIGRlY2xhcmF0aW9uLiBQbGVhc2UgYWRkIFx4M2MhRE9DVFlQRSBodG1sXHgzZSB0byB0aGUgSFRNTCBkb2N1bWVudC4nKX0sX2NvbHVtblByb3BDaGFuZ2VkOmZ1bmN0aW9uKGIpeyJfY2hpbGRDb2x1bW5zIj09PWIuZGV0YWlsLnBhdGgmJnRoaXMuX3VwZGF0ZUNvbHVtblRyZWUoKTtiLnN0b3BQcm9wYWdhdGlvbigpfSxfZ3JpZFJlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuX2dyaWRSZXNpemVIYW5kbGVyKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMiLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyx2aXNpYmxlU2NoZW1hOk9iamVjdCxzZXNzaW9uR3JvdXA6T2JqZWN0LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6cmcuWFR5cGUuU1RFUH0sX25vTXVsdGlFeHBlcmltZW50czp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5kZXhPZlNlc3Npb246T2JqZWN0LF9zZXNzaW9uR3JvdXBOYW1lSGFzaDpOdW1iZXIsX3JlcXVlc3REYXRhOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKHt0YWc6YixydW46ZH0pPT50aGlzLmJhY2tlbmQubGlzdE1ldHJpY0V2YWxzKHtleHBlcmltZW50TmFtZTp0aGlzLmV4cGVyaW1lbnROYW1lLHNlc3Npb25OYW1lOmQsbWV0cmljTmFtZTpifSl9fSxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57c2NhbGU6Yj0+e2I9SlNPTi5wYXJzZShiKVsxXTsKYj10aGlzLl9pbmRleE9mU2Vzc2lvbi5nZXQoYik7Y29uc3QgZD1wZi5zdGFuZGFyZDtyZXR1cm4gZFsodGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2grYiklZC5sZW5ndGhdfX19fX0sYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcl0sbGlzdGVuZXJzOnsiaXJvbi1yZXNpemUiOiJyZWRyYXcifSxvYnNlcnZlcnM6WyJfc2Vzc2lvbkdyb3VwQ2hhbmdlZChzZXNzaW9uR3JvdXAuKikiXSxyZWRyYXcoKXtQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXNjYWxhci1jYXJkIikuZm9yRWFjaChiPT5iLnJlZHJhdygpKX0sX3Nlc3Npb25Hcm91cENoYW5nZWQoKXt0aGlzLnNlc3Npb25Hcm91cD8odGhpcy5faW5kZXhPZlNlc3Npb249bmV3IE1hcCh0aGlzLnNlc3Npb25Hcm91cC5zZXNzaW9ucy5tYXAoKGIsZCk9PltiLm5hbWUsZF0pKSx0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaD10Zi5ocGFyYW1zLnV0aWxzLmhhc2hPZlN0cmluZyh0aGlzLnNlc3Npb25Hcm91cC5uYW1lKSk6Cih0aGlzLl9pbmRleE9mU2Vzc2lvbj1uZXcgTWFwLHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoPTApO1BvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKGI9Pntjb25zdCBkPWIuZ2V0KCJ0YWciKTtiLnNldCgidGFnIiwiIik7Yi5zZXQoInRhZyIsZCl9KX0sX2hhdmVNZXRyaWNzKCl7cmV0dXJuIHRoaXMudmlzaWJsZVNjaGVtYSYmQXJyYXkuaXNBcnJheSh0aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MpJiYwPHRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGh9LF9oYXZlTWV0cmljc0FuZFNlc3Npb25Hcm91cCgpe3JldHVybiB0aGlzLnNlc3Npb25Hcm91cCYmdGhpcy5faGF2ZU1ldHJpY3MoKX0sX2NvbXB1dGVTZXJpZXNGb3JTZXNzaW9uR3JvdXBNZXRyaWMoYixkKXtyZXR1cm4gbnVsbD09PWJ8fG51bGw9PT1kP1tdOmIuc2Vzc2lvbnMuZmlsdGVyKGY9PnZvaWQgMCE9PXRmLmhwYXJhbXMudXRpbHMubWV0cmljVmFsdWVCeU5hbWUoZi5tZXRyaWNWYWx1ZXMsCmQubmFtZSkpLm1hcChmPT4oe3RhZzpkLm5hbWUscnVuOmYubmFtZX0pKX0sX2NvbXB1dGVUYWdNZXRhZGF0YShiKXtyZXR1cm57ZGlzcGxheU5hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lKGIpLGRlc2NyaXB0aW9uOmIuZGVzY3JpcHRpb258fCIifX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXRhYmxlLXZpZXcvdGYtaHBhcmFtcy10YWJsZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtdGFibGUtdmlldyIscHJvcGVydGllczp7dmlzaWJsZVNjaGVtYTpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxlbmFibGVTaG93TWV0cmljczpCb29sZWFuLGJhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZ30sb2JzZXJ2ZXJzOlsiX3Zpc2libGVTY2hlbWFPclNlc3Npb25Hcm91cHNDaGFuZ2VkKHZpc2libGVTY2hlbWEuKiwgc2Vzc2lvbkdyb3Vwcy4qKSJdLF92aXNpYmxlU2NoZW1hT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCgpe2NvbnN0IGI9dGhpcy4kLnNlc3Npb25Hcm91cHNUYWJsZS5nZXQoImV4cGFuZGVkSXRlbXMiKTt0aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLnNldCgiZXhwYW5kZWRJdGVtcyIsW10pO1BvbHltZXIuZG9tLmZsdXNoKCk7Y29uc3QgZD1uZXcgTWFwO3RoaXMuc2Vzc2lvbkdyb3Vwcy5mb3JFYWNoKGY9PntkLnNldChmLm5hbWUsZil9KTt0aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLnNldCgiZXhwYW5kZWRJdGVtcyIsCmIubWFwKGY9PmQuZ2V0KGYubmFtZSkpLmZpbHRlcihCb29sZWFuKSl9LF9ocGFyYW1OYW1lOnRmLmhwYXJhbXMudXRpbHMuaHBhcmFtTmFtZSxfbWV0cmljTmFtZTp0Zi5ocGFyYW1zLnV0aWxzLm1ldHJpY05hbWUsX3Nlc3Npb25Hcm91cEhQYXJhbShiLGQpe3JldHVybiBudWxsIT1iJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYi5ocGFyYW1zLGQpP3RmLmhwYXJhbXMudXRpbHMucHJldHR5UHJpbnQoYi5ocGFyYW1zW2RdKToiIn0sX3Nlc3Npb25Hcm91cE1ldHJpYyhiLGQpe2lmKG51bGw9PWIpcmV0dXJuIG51bGw7Zm9yKGxldCBmPTA7ZjxiLm1ldHJpY1ZhbHVlcy5sZW5ndGg7KytmKXtsZXQgaD1iLm1ldHJpY1ZhbHVlc1tmXTtpZihoLm5hbWUuZ3JvdXA9PT1kLmdyb3VwJiZoLm5hbWUudGFnPT1kLnRhZylyZXR1cm4gdGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludChoLnZhbHVlKX1yZXR1cm4iIn0sX3Jvd051bWJlcihiKXtyZXR1cm4gYisxfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzIixwcm9wZXJ0aWVzOntzZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHZpc2libGVTY2hlbWE6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9fSxfcHJvcGVydGllc0FyZVBvcHVsYXRlZDpmdW5jdGlvbihiLGQpe3JldHVybiB2b2lkIDAhPT1iJiZudWxsIT09YiYmdm9pZCAwIT09ZCYmbnVsbCE9PWR9LF9zaW5nbGV0b25TZXNzaW9uR3JvdXBzOmZ1bmN0aW9uKGIpe3JldHVybiBudWxsPT09Ynx8dm9pZCAwPT09Yj9bXTpbYl19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC91dGlscy5odG1sLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgoayx0LGwpe2Z1bmN0aW9uIHAoKXtpZigwPT09ay5sZW5ndGgpcmV0dXJuWzEsMl07Y29uc3QgW20sbl09ZDMuZXh0ZW50KGspO3JldHVybiBtIT09bj9bbSxuXTowPG0/Wy41Km0sMS41Km1dOjA+bT9bMS41Km0sLjUqbV06Wy0xLDFdfWlmKCJMSU5FQVIiPT09bClyZXR1cm4gZDMuc2NhbGVMaW5lYXIoKS5kb21haW4ocCgpKS5yYW5nZShbdCwwXSk7aWYoIkxPRyI9PT1sKXJldHVybiBsPXAoKSwwPj1sWzBdJiYwPD1sWzFdP2goayx0LCJMSU5FQVIiKTpkMy5zY2FsZUxvZygpLmRvbWFpbihsKS5yYW5nZShbdCwwXSk7aWYoIlFVQU5USUxFIj09PWwpcmV0dXJuIGw9ZDMucmFuZ2UoMjApLm1hcChtPT50LW0qdC8xOSksMD09PWsubGVuZ3RoJiYoaz1bMV0pLGQzLnNjYWxlUXVhbnRpbGUoKS5kb21haW4oXy51bmlxKGspKS5yYW5nZShsKTtpZigiTk9OX05VTUVSSUMiPT09bClyZXR1cm4gZDMuc2NhbGVQb2ludCgpLmRvbWFpbihfLnVuaXEoay5zb3J0KCkpKS5yYW5nZShbdCwKMF0pLnBhZGRpbmcoLjEpO3Rocm93IFJhbmdlRXJyb3IoIlVua25vd24gc2NhbGU6ICIrbCk7fWYuZmluZENsb3Nlc3RQYXRoPWZ1bmN0aW9uKGssdCxsKXtmdW5jdGlvbiBwKHksdyxDLEYpe2NvbnN0IEQ9eS1DLEI9dy1GO0M9bS1DO0Y9bi1GO2NvbnN0IEk9KEQqQytCKkYpLyhEKkQrQipCKTtyZXR1cm4gMD49ST9iLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZChDLEYpOjE8PUk/Yi5ocGFyYW1zLnV0aWxzLmwyTm9ybVNxdWFyZWQoeS1tLHctbik6Yi5ocGFyYW1zLnV0aWxzLmwyTm9ybVNxdWFyZWQoQy1JKkQsRi1JKkIpfWlmKDI+dC5sZW5ndGgpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIkxlc3MgdGhhbiB0d28gYXhlcyBpbiBwYXJhbGxlbCBjb29yZGluYXRlcyBwbG90LiIpLG51bGw7Y29uc3QgbT1sWzBdLG49bFsxXTtpZihtPD10WzBdfHxtPj10W3QubGVuZ3RoLTFdKXJldHVybiBudWxsO2NvbnN0IHE9Xy5zb3J0ZWRJbmRleCh0LG0pO2NvbnNvbGUuYXNzZXJ0KDA8cSk7CmNvbnNvbGUuYXNzZXJ0KHE8dC5sZW5ndGgpO2NvbnN0IHU9cS0xO2xldCB4PW51bGwsQT1udWxsO2suZm9yRWFjaCh5PT57Y29uc3Qgdz1wKHkuY29udHJvbFBvaW50c1t1XVswXSx5LmNvbnRyb2xQb2ludHNbdV1bMV0seS5jb250cm9sUG9pbnRzW3FdWzBdLHkuY29udHJvbFBvaW50c1txXVsxXSk7MTAwPHd8fCEobnVsbD09PXh8fHc8eCl8fCh4PXcsQT15KX0pO3JldHVybiBBfTtmLnBvaW50U2NhbGVJbnZlcnNlSW1hZ2U9ZnVuY3Rpb24oayx0LGwpe3JldHVybiBrLmRvbWFpbigpLmZpbHRlcihwPT57cD1rKHApO3JldHVybiB0PD1wJiZwPD1sfSl9O2YucXVhbnRpbGVTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHQsbCl7Y29uc3QgcD1rLnJhbmdlKCksbT1wLmZpbHRlcihuPT50PD1uJiZuPD1sKS5tYXAobj0+e2NvbnN0IHE9ay5pbnZlcnRFeHRlbnQobik7cmV0dXJuIG49PT1wW3AubGVuZ3RoLTFdP1txWzBdLHFbMV0rMV06cX0pO3JldHVybiAwPT1tLmxlbmd0aD9bMCwKMF06ZDMuZXh0ZW50KGQzLm1lcmdlKG0pKX07Zi5jb250aW51b3VzU2NhbGVJbnZlcnNlSW1hZ2U9ZnVuY3Rpb24oayx0LGwpe3JldHVybltrLmludmVydCh0KSxrLmludmVydChsKV0uc29ydCgocCxtKT0+cC1tKX07Zi5jcmVhdGVBeGlzU2NhbGU9aH0pKGQucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChkLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2F4ZXMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChxKXtyZXR1cm4gbnVsbCE9PXEuc291cmNlRXZlbnR9bGV0IGs7KGZ1bmN0aW9uKHEpe3EuTElORUFSPSJMSU5FQVIiO3EuTE9HPSJMT0ciO3EuUVVBTlRJTEU9IlFVQU5USUxFIjtxLk5PTl9OVU1FUklDPSJOT05fTlVNRVJJQyJ9KShrPWYuU2NhbGVUeXBlfHwoZi5TY2FsZVR5cGU9e30pKTtjbGFzcyB0e2lzUGFzc2luZygpe3JldHVybiEwfX1jbGFzcyBse2NvbnN0cnVjdG9yKHEsdSx4LEEpe3RoaXMuX2xvd2VyPXE7dGhpcy5fdXBwZXI9dTt0aGlzLl9sb3dlck9wZW49eDt0aGlzLl91cHBlck9wZW49QX1pc1Bhc3NpbmcocSl7cmV0dXJuIHRoaXMuX2JlZm9yZSh0aGlzLl9sb3dlcixxLCF0aGlzLl9sb3dlck9wZW4pJiZ0aGlzLl9iZWZvcmUocSx0aGlzLl91cHBlciwhdGhpcy5fdXBwZXJPcGVuKX1fYmVmb3JlKHEsdSx4KXtyZXR1cm4geD9xPD11OnE8dX19Y2xhc3MgcHtjb25zdHJ1Y3RvcihxKXt0aGlzLl9kb21haW5TZXQ9CnF9aXNQYXNzaW5nKHEpe3JldHVybi0xIT09dGhpcy5fZG9tYWluU2V0LmZpbmRJbmRleCh1PT51PT09cSl9fWNsYXNzIG17Y29uc3RydWN0b3IocSx1LHgsQSl7dGhpcy5fc3ZnUHJvcHM9cTt0aGlzLl9zY2hlbWE9dTt0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXI9eDt0aGlzLl9jb2xJbmRleD1BO3RoaXMuX2lzRGlzcGxheWVkPSExO3RoaXMuX3NjYWxlVHlwZT10aGlzLl95U2NhbGU9bnVsbDt0aGlzLnNldEJydXNoU2VsZWN0aW9uKG51bGwpfWNvbEluZGV4KCl7cmV0dXJuIHRoaXMuX2NvbEluZGV4fXlTY2FsZSgpe3JldHVybiB0aGlzLl95U2NhbGV9c2NhbGVUeXBlKCl7cmV0dXJuIHRoaXMuX3NjYWxlVHlwZX1icnVzaFNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9icnVzaFNlbGVjdGlvbn1pc0Rpc3BsYXllZCgpe3JldHVybiB0aGlzLl9pc0Rpc3BsYXllZH1zZXRCcnVzaFNlbGVjdGlvbihxKXt0aGlzLl9icnVzaFNlbGVjdGlvbj1xO3RoaXMuX2JydXNoRmlsdGVyPXRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLAp0aGlzLnNjYWxlVHlwZSgpLHRoaXMueVNjYWxlKCkpfXNldERvbWFpbkFuZFNjYWxlKHEsdSl7dGhpcy5fc2NhbGVUeXBlPXU7dGhpcy5feVNjYWxlPWIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5jcmVhdGVBeGlzU2NhbGUocS5zbGljZSgpLHRoaXMuX3N2Z1Byb3BzLmhlaWdodCx0aGlzLnNjYWxlVHlwZSgpKTt0aGlzLl9icnVzaEZpbHRlcj10aGlzLl9idWlsZEJydXNoRmlsdGVyKHRoaXMuYnJ1c2hTZWxlY3Rpb24oKSx0aGlzLnNjYWxlVHlwZSgpLHRoaXMueVNjYWxlKCkpfWJydXNoRmlsdGVyKCl7cmV0dXJuIHRoaXMuX2JydXNoRmlsdGVyfXVwZGF0ZURPTShxKXt2YXIgdT1kMy5heGlzTGVmdCh0aGlzLnlTY2FsZSgpKTt0aGlzLnNjYWxlVHlwZSgpPT09ay5RVUFOVElMRSYmKHU9dS50aWNrVmFsdWVzKHRoaXMueVNjYWxlKCkucXVhbnRpbGVzKCkpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCItLjZnIikpKTt2YXIgeD1kMy5zZWxlY3QocSk7eC5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTsKeC5hcHBlbmQoImciKS5jbGFzc2VkKCJheGlzIiwhMCkuY2FsbCh1KS5hcHBlbmQoInRleHQiKS5jbGFzc2VkKCJheGlzLXRpdGxlIiwhMCkuc3R5bGUoImN1cnNvciIsIm1vdmUiKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ5IiwtOSkudGV4dChBPT5iLmhwYXJhbXMudXRpbHMuc2NoZW1hQ29sdW1uTmFtZSh0aGlzLl9zY2hlbWEsQSkpO3guY2FsbChkMy5kcmFnKCkub24oInN0YXJ0IiwoKT0+e3Euc2V0QXR0cmlidXRlKCJpcy1kcmFnZ2luZyIsIiIpO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWdTdGFydCh0aGlzLmNvbEluZGV4KCkpfSkub24oImRyYWciLCgpPT50aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnKGQzLmV2ZW50LngpKS5vbigiZW5kIiwoKT0+e3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWdFbmQoKTtxLnJlbW92ZUF0dHJpYnV0ZSgiaXMtZHJhZ2dpbmciKX0pKTt1PWQzLmJydXNoWSgpLmV4dGVudChbWy04LDBdLApbOCx0aGlzLl9zdmdQcm9wcy5oZWlnaHQrMV1dKS5vbigic3RhcnQiLCgpPT57aChkMy5ldmVudCkmJihxLnNldEF0dHJpYnV0ZSgiaXMtYnJ1c2hpbmciLCIiKSx0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKSl9KS5vbigiYnJ1c2giLCgpPT57aWYoaChkMy5ldmVudCkpdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSl9KS5vbigiZW5kIiwoKT0+e2goZDMuZXZlbnQpJiYodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSkscS5yZW1vdmVBdHRyaWJ1dGUoImlzLWJydXNoaW5nIikpfSk7eD1kMy5zZWxlY3QocSkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYnJ1c2giLCEwKTt4LmNhbGwodSk7dS5tb3ZlKHgsdGhpcy5icnVzaFNlbGVjdGlvbigpKX1zZXREaXNwbGF5ZWQocSl7dGhpcy5faXNEaXNwbGF5ZWQ9cX1fYnVpbGRCcnVzaEZpbHRlcihxLAp1LHgpe2lmKG51bGw9PT1xKXJldHVybiBuZXcgdDtpZihudWxsPT09dSlyZXR1cm4gY29uc29sZS5lcnJvcigiU2NhbGUgdHlwZSBpcyBudWxsLCBidXQgYnJ1c2hTZWxlY3Rpb24gaXNuJ3Q6ICIscSksbmV3IHQ7c3dpdGNoKHUpe2Nhc2Ugay5MSU5FQVI6Y2FzZSBrLkxPRzp7Y29uc3QgW0EseV09Yi5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LmNvbnRpbnVvdXNTY2FsZUludmVyc2VJbWFnZSh4LHFbMF0scVsxXSk7cmV0dXJuIG5ldyBsKEEseSwhMSwhMSl9Y2FzZSBrLlFVQU5USUxFOntjb25zdCBbQSx5XT1iLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QucXVhbnRpbGVTY2FsZUludmVyc2VJbWFnZSh4LHFbMF0scVsxXSk7cmV0dXJuIG5ldyBsKEEseSwhMSwhMCl9Y2FzZSBrLk5PTl9OVU1FUklDOnJldHVybiBuZXcgcChiLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QucG9pbnRTY2FsZUludmVyc2VJbWFnZSh4LHFbMF0scVsxXSkpfWNvbnNvbGUuZXJyb3IoIlVua25vd24gc2NhbGUgdHlwZTogIiwKdSk7cmV0dXJuIG5ldyB0fX1mLkF4aXM9bTtjbGFzcyBue2NvbnN0cnVjdG9yKHEsdSx4KXt0aGlzLl9zdmdQcm9wcz1xO3RoaXMuX3NjaGVtYT11O3RoaXMuX2F4ZXM9dGhpcy5fY3JlYXRlQXhlcyh4KTt0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucz1kMy5zY2FsZVBvaW50KCkucmFuZ2UoWzEsdGhpcy5fc3ZnUHJvcHMud2lkdGgtMV0pLnBhZGRpbmcoLjUpO3RoaXMuX2RyYWdnZWRBeGlzPW51bGw7dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuYXhpcy1wYXJlbnQiKS5yZW1vdmUoKTt0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3N2Z1Byb3BzLnN2Z0cuc2VsZWN0QWxsKCIuYXhpcy1wYXJlbnQiKX11cGRhdGVBeGVzKHEsdSl7Y29uc29sZS5hc3NlcnQoIXRoaXMuaXNBeGlzRHJhZ2dpbmcoKSk7Y29uc3QgeD1uZXcgU2V0O3EuY29sdW1ucy5mb3JFYWNoKHk9Pntjb25zdCB3PXkuYWJzb2x1dGVJbmRleDtsZXQgQz10aGlzLl9heGVzW3ddO0Muc2V0RGlzcGxheWVkKCEwKTsKY29uc3QgRj11Lm1hcChEPT5iLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxELHcpKTtDLnNldERvbWFpbkFuZFNjYWxlKEYseS5zY2FsZSk7eC5hZGQodyl9KTt0aGlzLl9heGVzLmZvckVhY2goeT0+e3guaGFzKHkuY29sSW5kZXgoKSl8fHkuc2V0RGlzcGxheWVkKCExKX0pO3RoaXMuX3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHgpO3RoaXMuX3BhcmVudHNTZWw9dGhpcy5fcGFyZW50c1NlbC5kYXRhKEFycmF5LmZyb20oeCkseT0+eSk7dGhpcy5fcGFyZW50c1NlbC5leGl0KCkucmVtb3ZlKCk7dGhpcy5fcGFyZW50c1NlbD10aGlzLl9wYXJlbnRzU2VsLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYXhpcy1wYXJlbnQiLCEwKS5tZXJnZSh0aGlzLl9wYXJlbnRzU2VsKTtjb25zdCBBPXRoaXM7dGhpcy5fcGFyZW50c1NlbC5jYWxsKHk9PnRoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh5KSkuZWFjaChmdW5jdGlvbih5KXtBLl9heGVzW3ldLnVwZGF0ZURPTSh0aGlzKX0pfW1hcFZpc2libGVBeGVzKHEpe3JldHVybiB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5tYXAodT0+CnEodGhpcy5nZXRBeGlzUG9zaXRpb24odSksdGhpcy5fYXhlc1t1XSkpfWFsbFZpc2libGVBeGVzU2F0aXNmeShxKXtyZXR1cm4gdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZXZlcnkodT0+cSh0aGlzLmdldEF4aXNQb3NpdGlvbih1KSx0aGlzLl9heGVzW3VdKSl9Z2V0QXhpc0ZvckNvbEluZGV4KHEpe3JldHVybiB0aGlzLl9heGVzW3FdfWRyYWdTdGFydChxKXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTtjb25zb2xlLmFzc2VydCh0aGlzLl9heGVzW3FdLmlzRGlzcGxheWVkKCkpO3RoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2F4ZXNbcV07dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj10aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyhxKX1kcmFnKHEpe3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb249cT1NYXRoLm1pbihNYXRoLm1heChxLDApLHRoaXMuX3N2Z1Byb3BzLndpZHRoKTtxPXRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpOwpxLnNvcnQoKHUseCk9PnRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHUpLXRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHgpKTt0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4ocSk7dGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHRoaXMuX3BhcmVudHNTZWwpfWRyYWdFbmQoKXtjb25zb2xlLmFzc2VydCh0aGlzLmlzQXhpc0RyYWdnaW5nKCkpO3RoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb249bnVsbDt0aGlzLl91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00odGhpcy5fcGFyZW50c1NlbC50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKSl9aXNBeGlzRHJhZ2dpbmcoKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2RyYWdnZWRBeGlzfWdldEF4aXNQb3NpdGlvbihxKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2RyYWdnZWRBeGlzJiZ0aGlzLl9kcmFnZ2VkQXhpcy5jb2xJbmRleCgpPT09cT90aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uOnRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zKHEpfV91cGRhdGVTdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyhxKXt2YXIgdT0KdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZmlsdGVyKHg9PnEuaGFzKHgpKTt1PUFycmF5LmZyb20obmV3IFNldChbLi4udSwuLi5BcnJheS5mcm9tKHEpXSkpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbih1KX1fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHEpe3EuYXR0cigidHJhbnNmb3JtIix1PT5iLmhwYXJhbXMudXRpbHMudHJhbnNsYXRlU3RyKHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHUpKSl9X2NyZWF0ZUF4ZXMocSl7cmV0dXJuIGQzLnJhbmdlKGIuaHBhcmFtcy51dGlscy5udW1Db2x1bW5zKHRoaXMuX3NjaGVtYSkpLm1hcCh1PT5uZXcgbSh0aGlzLl9zdmdQcm9wcyx0aGlzLl9zY2hlbWEscSx1KSl9fWYuQXhlc0NvbGxlY3Rpb249bn0pKGQucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChkLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2xpbmVzLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2xldCBoOyhmdW5jdGlvbihsKXtsW2wuRk9SRUdST1VORD0wXT0iRk9SRUdST1VORCI7bFtsLkJBQ0tHUk9VTkQ9MV09IkJBQ0tHUk9VTkQifSkoaD1mLkxpbmVUeXBlfHwoZi5MaW5lVHlwZT17fSkpO2NsYXNzIGt7Y29uc3RydWN0b3IobCl7dm9pZCAwPT09bCYmKGw9ZDMuc2VsZWN0QWxsKG51bGwpKTtjb25zb2xlLmFzc2VydCgxPj1sLnNpemUoKSk7dGhpcy5fc2Vzc2lvbkdyb3VwU2VsPWx9c2Vzc2lvbkdyb3VwKCl7cmV0dXJuIDE9PT10aGlzLl9zZXNzaW9uR3JvdXBTZWwuc2l6ZSgpP3RoaXMuX3Nlc3Npb25Hcm91cFNlbC5kYXR1bSgpOm51bGx9aXNOdWxsKCl7cmV0dXJuIG51bGw9PT10aGlzLnNlc3Npb25Hcm91cCgpfXNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9zZXNzaW9uR3JvdXBTZWx9ZXF1YWxzVG8obCl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/bC5pc051bGwoKTpsLmlzTnVsbCgpPyExOmwuc2Vzc2lvbkdyb3VwKCkubmFtZT09CnRoaXMuc2Vzc2lvbkdyb3VwKCkubmFtZX19Zi5TZXNzaW9uR3JvdXBIYW5kbGU9aztjbGFzcyB0e2NvbnN0cnVjdG9yKGwscCxtKXt0aGlzLl9zdmdQcm9wcz1sO3RoaXMuX3NjaGVtYT1wO3RoaXMuX2F4ZXNDb2xsZWN0aW9uPW07dGhpcy5fc2Vzc2lvbkdyb3Vwcz1bXTt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5iYWNrZ3JvdW5kIikucmVtb3ZlKCk7dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuZm9yZWdyb3VuZCIpLnJlbW92ZSgpO3RoaXMuX2JnUGF0aHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5hcHBlbmQoImciKS5jbGFzc2VkKCJiYWNrZ3JvdW5kIiwhMCkuc2VsZWN0QWxsKCJwYXRoIik7dGhpcy5fZmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZvcmVncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKTt0aGlzLl91cGRhdGVWaXNpYmxlRmdQYXRoc1NlbCgpO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZT0KbmV3IGs7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9bmV3IGs7dGhpcy5fZDNsaW5lPWQzLmxpbmUoKS5jdXJ2ZShkMy5jdXJ2ZUxpbmVhcil9Z2V0U2Vzc2lvbkdyb3VwSGFuZGxlKGwpe3JldHVybiBudWxsPT09bHx8dm9pZCAwPT09bD9uZXcgazpuZXcgayh0aGlzLl9mZ1BhdGhzU2VsLmZpbHRlcihwPT5wLm5hbWU9PT1sLm5hbWUpKX1oaWRlQmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9c2hvd0JhY2tncm91bmRMaW5lcygpe3RoaXMuX2JnUGF0aHNTZWwuYXR0cigidmlzaWJpbGl0eSIsbnVsbCl9cGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZX1zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpe3JldHVybiB0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZX1yZWNvbXB1dGVDb250cm9sUG9pbnRzKGwscD0wKXsobD09PWguRk9SRUdST1VORD8KdGhpcy5fZmdQYXRoc1NlbDp0aGlzLl9iZ1BhdGhzU2VsKS50cmFuc2l0aW9uKCkuZHVyYXRpb24ocCkuYXR0cigiZCIsbT0+dGhpcy5fcGF0aERBdHRyaWJ1dGUobSkpO2w9PT1oLkZPUkVHUk9VTkQmJndpbmRvdy5zZXRUaW1lb3V0KCgpPT57Y29uc3QgbT10aGlzO3RoaXMuX2ZnUGF0aHNTZWwuZWFjaChmdW5jdGlvbihuKXttLl9zZXRDb250cm9sUG9pbnRzUHJvcGVydHkodGhpcyxuKX0pfSl9cmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpe3RoaXMuX2ZnUGF0aHNTZWwuY2xhc3NlZCgiaW52aXNpYmxlLXBhdGgiLGw9PiF0aGlzLl9heGVzQ29sbGVjdGlvbi5hbGxWaXNpYmxlQXhlc1NhdGlzZnkoKHAsbSk9Pm0uYnJ1c2hGaWx0ZXIoKS5pc1Bhc3NpbmcoYi5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsbCxtLmNvbEluZGV4KCkpKSkpO3RoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl9c2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IobCwKcCxtKXtsPXRoaXMuX2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGwscCxtKTt0aGlzLl9mZ1BhdGhzU2VsLmF0dHIoInN0cm9rZSIsbCl9cmVkcmF3KGwscCxtLG4pe2NvbnN0IHE9dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlc3Npb25Hcm91cCgpLHU9dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCk7dGhpcy5fc2Vzc2lvbkdyb3Vwcz1sO3RoaXMuX2ZnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9mZ1BhdGhzU2VsKTt0aGlzLl9iZ1BhdGhzU2VsPXRoaXMuX3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24odGhpcy5fYmdQYXRoc1NlbCk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPXRoaXMuZ2V0U2Vzc2lvbkdyb3VwSGFuZGxlKHEpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPXRoaXMuZ2V0U2Vzc2lvbkdyb3VwSGFuZGxlKHUpO3RoaXMucmVjb21wdXRlQ29udHJvbFBvaW50cyhoLkZPUkVHUk9VTkQpOwp0aGlzLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoaC5CQUNLR1JPVU5EKTt0aGlzLnJlY29tcHV0ZUZvcmVncm91bmRMaW5lc1Zpc2liaWxpdHkoKTt0aGlzLnNldEZvcmVncm91bmRMaW5lc0NvbG9yKHAsbSxuKX11cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAobCl7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInBlYWtlZC1wYXRoIiwhMSk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPWw7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInBlYWtlZC1wYXRoIiwhMCl9Y2xlYXJQZWFrZWRTZXNzaW9uR3JvdXAoKXt0aGlzLnVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cChuZXcgayl9dXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAobCl7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgic2VsZWN0ZWQtcGF0aCIsITEpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPQpsO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInNlbGVjdGVkLXBhdGgiLCEwKX1maW5kQ2xvc2VzdFNlc3Npb25Hcm91cChsLHApe2NvbnN0IG09dGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMobj0+bik7bD1iLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuZmluZENsb3Nlc3RQYXRoKHRoaXMuX3Zpc2libGVGZ1BhdGhzU2VsLm5vZGVzKCksbSxbbCxwXSk7cmV0dXJuIG51bGw9PT1sP25ldyBrOm5ldyBrKGQzLnNlbGVjdChsKSl9X2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGwscCxtKXtpZihudWxsPT09bClyZXR1cm4oKT0+InJlZCI7Y29uc3Qgbj1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihiLmhwYXJhbXMudXRpbHMubnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLl9zY2hlbWEsdGhpcy5fc2Vzc2lvbkdyb3VwcyxsKSkucmFuZ2UoW3AsbV0pLmludGVycG9sYXRlKGQzLmludGVycG9sYXRlTGFiKTtyZXR1cm4gcT0+Cm4oYi5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEscSxsKSl9X3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24obCl7bD1sLmRhdGEodGhpcy5fc2Vzc2lvbkdyb3VwcyxwPT5wLm5hbWUpO2wuZXhpdCgpLnJlbW92ZSgpO3JldHVybiBsLmVudGVyKCkuYXBwZW5kKCJwYXRoIikubWVyZ2UobCl9X3NldENvbnRyb2xQb2ludHNQcm9wZXJ0eShsLHApe2wuY29udHJvbFBvaW50cz10aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhwKX1fY29tcHV0ZUNvbnRyb2xQb2ludHMobCl7cmV0dXJuIHRoaXMuX2F4ZXNDb2xsZWN0aW9uLm1hcFZpc2libGVBeGVzKChwLG0pPT5bcCxtLnlTY2FsZSgpKGIuaHBhcmFtcy51dGlscy5jb2x1bW5WYWx1ZUJ5SW5kZXgodGhpcy5fc2NoZW1hLGwsbS5jb2xJbmRleCgpKSldKX1fcGF0aERBdHRyaWJ1dGUobCl7cmV0dXJuIHRoaXMuX2QzbGluZSh0aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhsKSl9X3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl7dGhpcy5fdmlzaWJsZUZnUGF0aHNTZWw9CnRoaXMuX2ZnUGF0aHNTZWwuZmlsdGVyKCI6bm90KC5pbnZpc2libGUtcGF0aCkiKX19Zi5MaW5lc0NvbGxlY3Rpb249dH0pKGQucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChkLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2ludGVyYWN0aW9uX21hbmFnZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Y2xhc3MgaHtjb25zdHJ1Y3Rvcih0LGwpe3RoaXMuc3ZnPWQzLnNlbGVjdCh0KTt0PTEwMCpsKzIwO3RoaXMuc3ZnLmF0dHIoInZpZXdCb3giLGAwIDAgJHt0fSAkezI0MH1gKTt0aGlzLnN2Zy5hdHRyKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQiKTt0aGlzLnN2Zy5zdHlsZSgibWluLXdpZHRoIix0KyJweCIpO3RoaXMuc3ZnLnN0eWxlKCJtaW4taGVpZ2h0IiwiMjQwcHgiKTt0aGlzLndpZHRoPXQtMTAtMTA7dGhpcy5oZWlnaHQ9MjAwO3RoaXMuc3ZnRz10aGlzLnN2Zy5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLGIuaHBhcmFtcy51dGlscy50cmFuc2xhdGVTdHIoMTAsMzApKX19Zi5TVkdQcm9wZXJ0aWVzPWg7Y2xhc3Mga3tjb25zdHJ1Y3Rvcih0LGwscCxtKXt0aGlzLl9zdmdQcm9wcz10O3RoaXMuX3NjaGVtYT1sO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQj1wO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCPQptO3RoaXMuX2F4ZXNDb2xsZWN0aW9uPW5ldyBmLkF4ZXNDb2xsZWN0aW9uKHQsbCx0aGlzKTt0aGlzLl9saW5lc0NvbGxlY3Rpb249bmV3IGYuTGluZXNDb2xsZWN0aW9uKHQsbCx0aGlzLl9heGVzQ29sbGVjdGlvbik7dGhpcy5fc3ZnUHJvcHMuc3ZnLm9uKCJjbGljayIsKCk9PnRoaXMub25DbGljaygpKS5vbigibW91c2Vtb3ZlIG1vdXNlZW50ZXIiLCgpPT57Y29uc3QgW24scV09ZDMubW91c2UodGhpcy5fc3ZnUHJvcHMuc3ZnRy5ub2RlKCkpO3RoaXMub25Nb3VzZU1vdmVkKG4scSl9KS5vbigibW91c2VsZWF2ZSIsKCk9PnRoaXMub25Nb3VzZUxlYXZlKCkpfW9uRHJhZ1N0YXJ0KHQpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWdTdGFydCh0KTt0aGlzLl9saW5lc0NvbGxlY3Rpb24uaGlkZUJhY2tncm91bmRMaW5lcygpfW9uRHJhZyh0KXt0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnKHQpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGYuTGluZVR5cGUuRk9SRUdST1VORCl9b25EcmFnRW5kKCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ0VuZCgpOwp0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlQ29udHJvbFBvaW50cyhmLkxpbmVUeXBlLkZPUkVHUk9VTkQsNTAwKTt3aW5kb3cuc2V0VGltZW91dCgoKT0+e3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGYuTGluZVR5cGUuQkFDS0dST1VORCk7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnNob3dCYWNrZ3JvdW5kTGluZXMoKX0sNTAwKX1vbkJydXNoQ2hhbmdlZCh0KXt0aGlzLl9heGVzQ29sbGVjdGlvbi5nZXRBeGlzRm9yQ29sSW5kZXgodCkuc2V0QnJ1c2hTZWxlY3Rpb24oZDMuZXZlbnQuc2VsZWN0aW9uKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpfW9uTW91c2VNb3ZlZCh0LGwpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLmZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKHQsbCkpO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfW9uTW91c2VMZWF2ZSgpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5pc051bGwoKXx8Cih0aGlzLl9saW5lc0NvbGxlY3Rpb24uY2xlYXJQZWFrZWRTZXNzaW9uR3JvdXAoKSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IobnVsbCkpfW9uQ2xpY2soKXt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCk9PT10aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT90aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAobmV3IGYuU2Vzc2lvbkdyb3VwSGFuZGxlKTp0aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKTt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25PcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCh0LApsKXt0aGlzLl9heGVzQ29sbGVjdGlvbi51cGRhdGVBeGVzKHQsbCk7Y29uc3QgcD10aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCksbT10aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVkcmF3KGwsdm9pZCAwIT09dC5jb2xvckJ5Q29sdW1uSW5kZXg/dC5jb2x1bW5zW3QuY29sb3JCeUNvbHVtbkluZGV4XS5hYnNvbHV0ZUluZGV4Om51bGwsdC5taW5Db2xvcix0Lm1heENvbG9yKTtwLmVxdWFsc1RvKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpO20uZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkpfHwKdGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IodGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfXNjaGVtYSgpe3JldHVybiB0aGlzLl9zY2hlbWF9fWYuSW50ZXJhY3Rpb25NYW5hZ2VyPWt9KShkLnBhcmFsbGVsX2Nvb3Jkc19wbG90fHwoZC5wYXJhbGxlbF9jb29yZHNfcGxvdD17fSkpfSkoYi5ocGFyYW1zfHwoYi5ocGFyYW1zPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiLHByb3BlcnRpZXM6e3Nlc3Npb25Hcm91cHM6QXJyYXksb3B0aW9uczpPYmplY3Qsc2VsZWN0ZWRTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxjbG9zZXN0U2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0scmVkcmF3Q291bnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF92YWxpZFNlc3Npb25Hcm91cHM6QXJyYXksX2ludGVyYWN0aW9uTWFuYWdlcjpPYmplY3R9LG9ic2VydmVyczpbIl9vcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZChvcHRpb25zLiosIHNlc3Npb25Hcm91cHMuKikiXSxfb3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtpZihudWxsIT09dGhpcy5vcHRpb25zKXt2YXIgYj10aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbjtpZih2b2lkIDA9PT10aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXJ8fAohXy5pc0VxdWFsKHRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5zY2hlbWEoKSxiLnNjaGVtYSkpe2QzLnNlbGVjdCh0aGlzLiQuc3ZnKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtjb25zdCBkPW5ldyB0Zi5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LlNWR1Byb3BlcnRpZXModGhpcy4kLnN2Zyx0Zi5ocGFyYW1zLnV0aWxzLm51bUNvbHVtbnMoYi5zY2hlbWEpKTt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuc3ZnLCEwKTt0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXI9bmV3IHRmLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuSW50ZXJhY3Rpb25NYW5hZ2VyKGQsYi5zY2hlbWEsZj0+dGhpcy5jbG9zZXN0U2Vzc2lvbkdyb3VwQ2hhbmdlZChmKSxmPT50aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZChmKSl9dGhpcy5fY29tcHV0ZVZhbGlkU2Vzc2lvbkdyb3VwcygpO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbk9wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKHRoaXMub3B0aW9ucywKdGhpcy5fdmFsaWRTZXNzaW9uR3JvdXBzKTt0aGlzLnJlZHJhd0NvdW50Kyt9fSxjbG9zZXN0U2Vzc2lvbkdyb3VwQ2hhbmdlZChiKXt0aGlzLl9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKGIpfSxzZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWQoYil7dGhpcy5fc2V0U2VsZWN0ZWRTZXNzaW9uR3JvdXAoYil9LF9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCl7Y29uc3QgYj10Zi5ocGFyYW1zLnV0aWxzO2lmKHZvaWQgMD09PXRoaXMuc2Vzc2lvbkdyb3Vwcyl0aGlzLl92YWxpZFNlc3Npb25Hcm91cHM9dm9pZCAwO2Vsc2V7dmFyIGQ9dGhpcy5vcHRpb25zLmNvbmZpZ3VyYXRpb24uc2NoZW1hO3RoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz10aGlzLnNlc3Npb25Hcm91cHMuZmlsdGVyKGY9Pntmb3IobGV0IGg9MDtoPGIubnVtQ29sdW1ucyhkKTsrK2gpaWYodGhpcy5vcHRpb25zLmNvbmZpZ3VyYXRpb24uY29sdW1uc1Zpc2liaWxpdHlbaF0mJnZvaWQgMD09PWIuY29sdW1uVmFsdWVCeUluZGV4KGQsCmYsaCkpcmV0dXJuITE7cmV0dXJuITB9KX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldy90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyxjb25maWd1cmF0aW9uOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5fSxfY2xvc2VzdE9yU2VsZWN0ZWQ6ZnVuY3Rpb24oYixkKXtyZXR1cm4gbnVsbCE9PWI/YjpkfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Iixwcm9wZXJ0aWVzOnt2aXNpYmxlU2NoZW1hOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LG9wdGlvbnM6T2JqZWN0LHNlbGVjdGVkU2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sY2xvc2VzdFNlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbCxyZWFkT25seTohMCxub3RpZnk6ITB9LF9jb250YWluZXI6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9zdmc6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTowfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9icnVzaGVkQ2VsbEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfYnJ1c2hTZWxlY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoc2Vzc2lvbkdyb3Vwcy4qKSIsCiJfdmlzaWJsZVNjaGVtYUNoYW5nZWQodmlzaWJsZVNjaGVtYS4qKSIsIl9yZWRyYXcob3B0aW9ucy4qKSJdLHJlYWR5KCl7dGhpcy5fY29udGFpbmVyPXRoaXMuJC5jb250YWluZXI7dGhpcy5fc3ZnPWQzLnNlbGVjdCh0aGlzLiQuc3ZnKTt0aGlzLl9yZWRyYXcoKX0sX3Nlc3Npb25Hcm91cHNDaGFuZ2VkKCl7bnVsbCE9PXRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXAmJnRoaXMuX3NldFNlbGVjdGVkU2Vzc2lvbkdyb3VwKHRmLmhwYXJhbXMudXRpbHMuc2Vzc2lvbkdyb3VwV2l0aE5hbWUodGhpcy5zZXNzaW9uR3JvdXBzLHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXAubmFtZSl8fG51bGwpO3RoaXMuX3JlZHJhdygpfSxfdmlzaWJsZVNjaGVtYUNoYW5nZWQoKXt0aGlzLl9icnVzaFNlbGVjdGlvbj10aGlzLl9icnVzaGVkQ2VsbEluZGV4PW51bGw7dGhpcy5fcmVkcmF3KCl9LF9yZWRyYXcoKXt0aGlzLmRlYm91bmNlKCJfcmVkcmF3IiwoKT0+e2NvbnN0IGI9dGYuaHBhcmFtcy51dGlsczsKdGhpcy53aWR0aD1NYXRoLm1heCgxNTAqYi5udW1WaXNpYmxlQ29sdW1ucyh0aGlzLnZpc2libGVTY2hlbWEpLDEyMDApO3RoaXMuaGVpZ2h0PU1hdGgubWF4KDExMi41KmIubnVtVmlzaWJsZU1ldHJpY3ModGhpcy52aXNpYmxlU2NoZW1hKSw0ODApO3RoaXMuX2NvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLndpZHRoKyJweCI7dGhpcy5fY29udGFpbmVyLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodCsicHgiO3RoaXMuX3N2Zy5hdHRyKCJ3aWR0aCIsdGhpcy53aWR0aCkuYXR0cigiaGVpZ2h0Iix0aGlzLmhlaWdodCk7dGhpcy5fc3ZnLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3RoaXMuX2RyYXcoKX0sMTAwKX0sX2RyYXcoKXtmdW5jdGlvbiBiKGthKXtyZXR1cm4ieC1heGlzLWNsaXAtcGF0aC0iK2thfWZ1bmN0aW9uIGQoa2Epe3JldHVybiJ4LWxhYmVsLWNsaXAtcGF0aC0iK2thfWZ1bmN0aW9uIGYoa2Epe3JldHVybiJ5LWF4aXMtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gaChrYSl7cmV0dXJuInktbGFiZWwtY2xpcC1wYXRoLSIrCmthfWZ1bmN0aW9uIGsoa2EsWSxFYSx2YSx4YSl7RWE9TWF0aC5mbG9vcihFYS92YSk7dmE9WS5zY2FsZSgpO2lmKCJRVUFOVElMRSI9PT14YSl7bGV0IEFhPXZhLnF1YW50aWxlcygpO0FhPWQzLnJhbmdlKDAsQWEubGVuZ3RoLE1hdGguY2VpbChBYS5sZW5ndGgvRWEpKS5tYXAoRmE9PkFhW0ZhXSk7WS50aWNrVmFsdWVzKEFhKS50aWNrRm9ybWF0KGQzLmZvcm1hdCgiLS4yZyIpKX0iTElORUFSIiE9PXhhJiYiTE9HIiE9PXhhfHxZLnRpY2tzKEVhKTtrYS5jYWxsKFkpO2thLnNlbGVjdEFsbCgiLmRvbWFpbiIpLnJlbW92ZSgpO2thLnNlbGVjdEFsbCgiLnRpY2sgbGluZSIpLmF0dHIoInN0cm9rZSIsIiNkZGQiKX1mdW5jdGlvbiB0KGthLFkpe3JldHVybiBPW1ldKHcuX2NvbFZhbHVlKGthLFkpKX1mdW5jdGlvbiBsKGthLFkpe3JldHVybiBIW1ldKHcuX21ldHJpY1ZhbHVlKGthLFkpKX1mdW5jdGlvbiBwKGthLFkpe2NvbnN0IEVhPVtdO1Rba2FdW1ldLmVhY2goZnVuY3Rpb24oKXtFYS5wdXNoKHRoaXMpfSk7CnJldHVybiBkMy5xdWFkdHJlZSgpLngodmE9PmQzLnNlbGVjdCh2YSkuZGF0dW0oKS54KS55KHZhPT5kMy5zZWxlY3QodmEpLmRhdHVtKCkueSkuYWRkQWxsKEVhKX1mdW5jdGlvbiBtKCl7bGV0IGthPW5ldyBTZXQoUS5ub2RlcygpKTt4KCl8fChrYT1uKHcuX2JydXNoZWRDZWxsSW5kZXgsdy5fYnJ1c2hTZWxlY3Rpb24pKTtkMy5zZWxlY3RBbGwoQXJyYXkuZnJvbSh5LmZpbHRlclNldChrYSxZPT4hWi5oYXMoWSkpKSkuYXR0cigiZmlsbCIsTCk7ZDMuc2VsZWN0QWxsKEFycmF5LmZyb20oeS5maWx0ZXJTZXQoWixZPT4ha2EuaGFzKFkpKSkpLmF0dHIoImZpbGwiLCIjZGRkIik7Wj1rYX1mdW5jdGlvbiBuKGthLFkpe2NvbnNvbGUuYXNzZXJ0KG51bGwhPT1rYSk7Y29uc29sZS5hc3NlcnQobnVsbCE9PVkpO2NvbnN0IFtFYSx2YV09a2EseGE9bmV3IFNldDt5LnF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3QoYWFbRWFdW3ZhXSxZWzBdWzBdLFlbMF1bMV0sWVsxXVswXSxZWzFdWzFdLApBYT0+e2QzLnNlbGVjdChBYSkuZGF0dW0oKS5zZXNzaW9uR3JvdXBNYXJrZXJzLmZvckVhY2goRmE9Pnt4YS5hZGQoRmEpfSl9KTtyZXR1cm4geGF9ZnVuY3Rpb24gcShrYSl7Y29uc3QgWT1kMy5icnVzaFNlbGVjdGlvbihrYSk7IXUoKSYmbnVsbD09PVl8fHUoKSYma2E9PT1sYS5ub2RlKCkmJl8uaXNFcXVhbChZLHcuX2JydXNoU2VsZWN0aW9uKXx8KHcuX2JydXNoU2VsZWN0aW9uPVksbnVsbCE9PVk/KGxhPWQzLnNlbGVjdChrYSksdy5fYnJ1c2hlZENlbGxJbmRleD1sYS5kYXR1bSgpKToobGE9bnVsbCx3Ll9icnVzaGVkQ2VsbEluZGV4PW51bGwpLG0oKSl9ZnVuY3Rpb24gdSgpe3JldHVybiBudWxsIT09dy5fYnJ1c2hlZENlbGxJbmRleCYmbnVsbCE9PXcuX2JydXNoU2VsZWN0aW9ufWZ1bmN0aW9uIHgoKXtyZXR1cm4hdSgpfHx3Ll9icnVzaFNlbGVjdGlvblswXVswXT09PXcuX2JydXNoU2VsZWN0aW9uWzFdWzBdfHx3Ll9icnVzaFNlbGVjdGlvblswXVsxXT09PXcuX2JydXNoU2VsZWN0aW9uWzFdWzFdfQpmdW5jdGlvbiBBKGthLFksRWEsdmEseGEpe2xldCBBYT1JbmZpbml0eSxGYT1udWxsO3kucXVhZFRyZWVWaXNpdFBvaW50c0luRGlzayhhYVtrYV1bWV0sRWEsdmEseGEsKHlhLFNhKT0+e1ouaGFzKHlhKSYmU2E8QWEmJih5YT1kMy5zZWxlY3QoeWEpLmRhdHVtKCksQWE9U2EsRmE9eWEuc2Vzc2lvbkdyb3VwKX0pO3JldHVybiBudWxsPT09RmE/bnVsbDpkMy5zZWxlY3RBbGwoWC5nZXQoRmEpKX1jb25zdCB5PXRmLmhwYXJhbXMudXRpbHMsdz10aGlzO2lmKHRoaXMuc2Vzc2lvbkdyb3VwcyYmMCE9dGhpcy5zZXNzaW9uR3JvdXBzLmxlbmd0aCYmdGhpcy52aXNpYmxlU2NoZW1hJiYwIT10aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MubGVuZ3RoKXt2YXIgQz1kMy5yYW5nZSh5Lm51bVZpc2libGVDb2x1bW5zKHcudmlzaWJsZVNjaGVtYSkpLEY9ZDMucmFuZ2UoeS5udW1WaXNpYmxlTWV0cmljcyh3LnZpc2libGVTY2hlbWEpKSxEPWQzLnNjYWxlQmFuZCgpLmRvbWFpbihDKS5yYW5nZShbODUsCnRoaXMud2lkdGgtMS01XSkucGFkZGluZ0lubmVyKC4xKSxCPWQzLnNjYWxlQmFuZCgpLmRvbWFpbihGKS5yYW5nZShbdGhpcy5oZWlnaHQtMS01LTUwLDVdKS5wYWRkaW5nSW5uZXIoLjEpLEk9RC5iYW5kd2lkdGgoKSxOPUIuYmFuZHdpZHRoKCksTz1DLm1hcChrYT0+dy5fY2VsbFNjYWxlKGthLFswLEktMV0pKSxIPUYubWFwKGthPT53Ll9jZWxsU2NhbGUoa2EreS5udW1WaXNpYmxlSFBhcmFtcyh3LnZpc2libGVTY2hlbWEpLFtOLTEsMF0pKSxLPXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi54LWF4aXMiKS5kYXRhKEMpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzIiwhMCkuYXR0cigidHJhbnNmb3JtIixrYT0+eS50cmFuc2xhdGVTdHIoRChrYSksMCkpO0suYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixiKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtNSkuYXR0cigieSIsMCkuYXR0cigid2lkdGgiLEkrMTApLmF0dHIoImhlaWdodCIsdy5oZWlnaHQtMjUpOwpLLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsZCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsMCkuYXR0cigieSIsdy5oZWlnaHQtMjUpLmF0dHIoIndpZHRoIixJKS5hdHRyKCJoZWlnaHQiLDI1KTtLLmFwcGVuZCgiZyIpLmF0dHIoImNsaXAtcGF0aCIsa2E9PiJ1cmwoIyIrYihrYSkrIikiKS5lYWNoKGZ1bmN0aW9uKGthKXtkMy5zZWxlY3QodGhpcykuY2FsbChrLGQzLmF4aXNCb3R0b20oT1trYV0pLnRpY2tTaXplKHcuaGVpZ2h0LTUwKSxJLDQwLHcub3B0aW9ucy5jb2x1bW5zW2thXS5zY2FsZSl9KTtLLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtYXhpcy1sYWJlbCIsITApLmF0dHIoImNsaXAtcGF0aCIsa2E9PiJ1cmwoIyIrZChrYSkrIikiKS5hcHBlbmQoInRleHQiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoIngiLEkvMikuYXR0cigieSIsdy5oZWlnaHQtMS0xMi41KS50ZXh0KGthPT55LnNjaGVtYVZpc2libGVDb2x1bW5OYW1lKHcudmlzaWJsZVNjaGVtYSwKa2EpKS5hcHBlbmQoInRpdGxlIikudGV4dChrYT0+eS5zY2hlbWFWaXNpYmxlQ29sdW1uTmFtZSh3LnZpc2libGVTY2hlbWEsa2EpKTtLPXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi55LWF4aXMiKS5kYXRhKEYpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgieS1heGlzIiwhMCkuYXR0cigidHJhbnNmb3JtIixrYT0+eS50cmFuc2xhdGVTdHIody53aWR0aC0xLEIoa2EpKSk7Sy5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGYpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0ody53aWR0aC00MC0xKSkuYXR0cigieSIsLTUpLmF0dHIoIndpZHRoIix3LndpZHRoLTQwKS5hdHRyKCJoZWlnaHQiLE4rMTApO0suYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtKHcud2lkdGgtMSkpLmF0dHIoInkiLDApLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IixOKTtLLmFwcGVuZCgiZyIpLmF0dHIoImNsaXAtcGF0aCIsa2E9PiJ1cmwoIyIrCmYoa2EpKyIpIikuZWFjaChmdW5jdGlvbihrYSl7ZDMuc2VsZWN0KHRoaXMpLmNhbGwoayxkMy5heGlzTGVmdChIW2thXSkudGlja1NpemUody53aWR0aC04MCksTiwyMCx3Lm9wdGlvbnMuY29sdW1uc1trYSt5Lm51bVZpc2libGVIUGFyYW1zKHcudmlzaWJsZVNjaGVtYSldLnNjYWxlKX0pO0suYXBwZW5kKCJnIikuY2xhc3NlZCgieS1heGlzLWxhYmVsIiwhMCkuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIitoKGthKSsiKSIpLmFwcGVuZCgidGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieCIsLSh3LndpZHRoLTIwLTEpKS5hdHRyKCJ5IixOLzIpLmF0dHIoInRyYW5zZm9ybSIseS5yb3RhdGVTdHIoLSh3LndpZHRoLTIwLTEpLE4vMikpLnRleHQoa2E9PnkubWV0cmljTmFtZSh3LnZpc2libGVTY2hlbWEubWV0cmljSW5mb3Nba2FdKSkuYXBwZW5kKCJ0aXRsZSIpLnRleHQoa2E9PnkubWV0cmljTmFtZSh3LnZpc2libGVTY2hlbWEubWV0cmljSW5mb3Nba2FdKSk7Cks9dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLmNlbGwiKS5kYXRhKGQzLmNyb3NzKEMsRikpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiY2VsbCIsITApLmF0dHIoInRyYW5zZm9ybSIsKFtrYSxZXSk9PnkudHJhbnNsYXRlU3RyKEQoa2EpLEIoWSkpKTtLLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZyYW1lIiwhMCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTUpLmF0dHIoInkiLC01KS5hdHRyKCJ3aWR0aCIsSSsxMCkuYXR0cigiaGVpZ2h0IixOKzEwKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIE09bnVsbDt2b2lkIDAhPT13Lm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4JiYoTT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbih0aGlzLl9jb2xFeHRlbnQodGhpcy5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleCkpLnJhbmdlKFt0aGlzLm9wdGlvbnMubWluQ29sb3IsdGhpcy5vcHRpb25zLm1heENvbG9yXSkuaW50ZXJwb2xhdGUoZDMuaW50ZXJwb2xhdGVMYWIpKTsKdmFyIEw9dm9pZCAwPT09dy5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleD8oKT0+InJlZCI6KHtzZXNzaW9uR3JvdXA6a2F9KT0+TSh0aGlzLl9jb2xWYWx1ZShrYSx3Lm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4KSksW1EsVCxYXT1mdW5jdGlvbihrYSxZKXtjb25zdCBFYT1rYS5zZWxlY3RBbGwoIi5kYXRhLW1hcmtlciIpLmRhdGEoKFt4YSxBYV0pPT53LnNlc3Npb25Hcm91cHMuZmlsdGVyKEZhPT52b2lkIDAhPT13Ll9jb2xWYWx1ZShGYSx4YSkmJnZvaWQgMCE9PXcuX21ldHJpY1ZhbHVlKEZhLEFhKSkubWFwKEZhPT4oe2NvbDp4YSxtZXRyaWM6QWEsc2Vzc2lvbkdyb3VwOkZhLHg6dChGYSx4YSkseTpsKEZhLEFhKSxzZXNzaW9uR3JvdXBNYXJrZXJzOm51bGx9KSkpLmVudGVyKCkuYXBwZW5kKCJjaXJjbGUiKS5jbGFzc2VkKCJkYXRhLW1hcmtlciIsITApLmF0dHIoImN4Iiwoe3g6eGF9KT0+eGEpLmF0dHIoImN5Iiwoe3k6eGF9KT0+eGEpLmF0dHIoInIiLDIpLmF0dHIoImZpbGwiLApZKSx2YT1uZXcgTWFwO3cuc2Vzc2lvbkdyb3Vwcy5mb3JFYWNoKHhhPT57dmEuc2V0KHhhLFtdKX0pO0VhLmVhY2goZnVuY3Rpb24oeGEpe3ZhLmdldCh4YS5zZXNzaW9uR3JvdXApLnB1c2godGhpcyl9KTtFYS5lYWNoKHhhPT57Y29uc3QgQWE9dmEuZ2V0KHhhLnNlc3Npb25Hcm91cCk7eGEuc2Vzc2lvbkdyb3VwTWFya2Vycz1uZXcgU2V0KEFhKX0pO2thPUMubWFwKHhhPT5GLm1hcChBYT0+RWEuZmlsdGVyKEZhPT5GYS5jb2w9PXhhJiZGYS5tZXRyaWM9PUFhKSkpO3JldHVybltFYSxrYSx2YV19KEsuYXBwZW5kKCJnIiksTCksYWE9Qy5tYXAoa2E9PkYubWFwKFk9PnAoa2EsWSkpKSxsYT1udWxsO3UoKSYmKGxhPUsuZmlsdGVyKGthPT5fLmlzRXF1YWwoa2Esdy5fYnJ1c2hlZENlbGxJbmRleCkpLGNvbnNvbGUuYXNzZXJ0KDE9PWxhLnNpemUoKSxsYSkpO3ZhciBaPW5ldyBTZXQoUS5ub2RlcygpKTttKCk7dmFyIGJhPWQzLmJydXNoKCkuZXh0ZW50KFtbLTQsLTRdLFtJLTErNS0KMSxOLTErNS0xXV0pLm9uKCJzdGFydCIsZnVuY3Rpb24oKXt1KCkmJmxhLm5vZGUoKSE9dGhpcyYmYmEubW92ZShsYSxudWxsKTtxKHRoaXMpfSkub24oImJydXNoIixmdW5jdGlvbigpe3EodGhpcyl9KS5vbigiZW5kIixmdW5jdGlvbigpe3EodGhpcyl9KTtLLmNhbGwoYmEpO3UoKSYmYmEubW92ZShsYSx3Ll9icnVzaFNlbGVjdGlvbik7dmFyIGVhPW51bGwsY2E9bnVsbDtudWxsIT09dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCYmKGNhPWQzLnNlbGVjdEFsbChYLmdldCh0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwKSkuY2xhc3NlZCgic2VsZWN0ZWQtbWFya2VyIiwhMCkpO0sub24oImNsaWNrIixmdW5jdGlvbigpe3ZhciBrYT1lYT09PWNhP251bGw6ZWE7a2EhPT1jYSYmKG51bGwhPT1jYSYmY2EuY2xhc3NlZCgic2VsZWN0ZWQtbWFya2VyIiwhMSksY2E9a2EsbnVsbCE9PWNhJiZjYS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCEwKSxrYT1udWxsPT09Y2E/bnVsbDpjYS5kYXR1bSgpLnNlc3Npb25Hcm91cCwKdy5fc2V0U2VsZWN0ZWRTZXNzaW9uR3JvdXAoa2EpKX0pLm9uKCJtb3VzZW1vdmUgbW91c2VlbnRlciIsZnVuY3Rpb24oW2thLFldKXtjb25zdCBbRWEsdmFdPWQzLm1vdXNlKHRoaXMpO2thPUEoa2EsWSxFYSx2YSwyMCk7ZWEhPT1rYSYmKG51bGwhPT1lYSYmZWEuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCExKSxlYT1rYSxudWxsIT09ZWE/KGVhLmNsYXNzZWQoImNsb3Nlc3QtbWFya2VyIiwhMCksdy5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChlYS5kYXR1bSgpLnNlc3Npb25Hcm91cCkpOncuX3NldENsb3Nlc3RTZXNzaW9uR3JvdXAobnVsbCkpfSkub24oIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7bnVsbCE9PWVhJiYoZWEuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCExKSxlYT1udWxsLHcuX3NldENsb3Nlc3RTZXNzaW9uR3JvdXAobnVsbCkpfSk7dGhpcy5fc3ZnLnNlbGVjdEFsbCgiKiIpLmNsYXNzZWQoInRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IiwhMCl9fSwKX2NlbGxTY2FsZShiLGQpe3ZhciBmPXRoaXMuX2NvbEV4dGVudChiKTtjb25zdCBoPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGYpLnJhbmdlKGQpO2lmKCJMSU5FQVIiPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbYl0uc2NhbGUpcmV0dXJuIGg7aWYoIkxPRyI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1tiXS5zY2FsZSlyZXR1cm4gMD49ZlswXSYmMDw9ZlsxXT9oOmQzLnNjYWxlTG9nKCkuZG9tYWluKGYpLnJhbmdlKGQpO2lmKCJRVUFOVElMRSI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1tiXS5zY2FsZSl7Y29uc3Qgaz0oZFsxXS1kWzBdKS8xOTtmPWQzLnJhbmdlKDIwKS5tYXAodD0+ZFswXStrKnQpO3JldHVybiBkMy5zY2FsZVF1YW50aWxlKCkuZG9tYWluKF8udW5pcSh0aGlzLnNlc3Npb25Hcm91cHMubWFwKHQ9PnRoaXMuX2NvbFZhbHVlKHQsYikpKSkucmFuZ2UoZil9aWYoIk5PTl9OVU1FUklDIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXJldHVybiBkMy5zY2FsZVBvaW50KCkuZG9tYWluKF8udW5pcSh0aGlzLnNlc3Npb25Hcm91cHMubWFwKGs9Pgp0aGlzLl9jb2xWYWx1ZShrLGIpKS5zb3J0KCkpKS5yYW5nZShkKS5wYWRkaW5nKC4xKTt0aHJvdyJVbmtub3duIHNjYWxlIGZvciBjb2x1bW46ICIrYisiLiBvcHRpb25zOiAiK3RoaXMub3B0aW9uczt9LF9jb2xWYWx1ZShiLGQpe3JldHVybiB0Zi5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlWaXNpYmxlSW5kZXgodGhpcy52aXNpYmxlU2NoZW1hLGIsZCl9LF9tZXRyaWNWYWx1ZShiLGQpe3JldHVybiB0Zi5ocGFyYW1zLnV0aWxzLm1ldHJpY1ZhbHVlQnlWaXNpYmxlSW5kZXgodGhpcy52aXNpYmxlU2NoZW1hLGIsZCl9LF9jb2xFeHRlbnQoYil7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQodGhpcy52aXNpYmxlU2NoZW1hLHRoaXMuc2Vzc2lvbkdyb3VwcyxiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldy90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXl9LF9jbG9zZXN0T3JTZWxlY3RlZDpmdW5jdGlvbihiLGQpe3JldHVybiBudWxsIT09Yj9iOmR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lL3RmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUiLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGhlbHBVcmw6U3RyaW5nLGJ1Z1JlcG9ydFVybDpTdHJpbmcsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXksX3NlbGVjdGVkVGFiOnt0eXBlOk51bWJlcix2YWx1ZTowfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLWdvb2dsZS1hbmFseXRpY3MtdHJhY2tlci90Zi1ocGFyYW1zLWdvb2dsZS1hbmFseXRpY3MtdHJhY2tlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLWdvb2dsZS1hbmFseXRpY3MtdHJhY2tlciIsaGFuZGxlRXZlbnQ6ZnVuY3Rpb24oKXt9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtbWFpbi90Zi1ocGFyYW1zLW1haW4uaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1tYWluIixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsdHJhY2tpbmdJZDpTdHJpbmcsaGVscFVybDpTdHJpbmcsYnVnUmVwb3J0VXJsOlN0cmluZyxfY29uZmlndXJhdGlvbjpPYmplY3QsX3Nlc3Npb25Hcm91cHM6QXJyYXksX3Rocm90dGxlZFNlbmRFdmVudFRvR0E6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pl8udGhyb3R0bGUoZnVuY3Rpb24oKXt0aGlzLl9oYW5kbGVHQUV2ZW50KHtkZXRhaWw6e2hpdFR5cGU6ImV2ZW50IixldmVudENhdGVnb3J5OiJVc2VySW50ZXJhY3Rpb24iLGV2ZW50TGFiZWw6IkV4cGVyaW1lbnQ6ICIrdGhpcy5leHBlcmltZW50TmFtZX19KX0sNkU0LHtsZWFkaW5nOiEwfSl9fSxsaXN0ZW5lcnM6e21vdXNlbW92ZToiX3NlbmRFdmVudFRvR0EiLHRhcDoiX3NlbmRFdmVudFRvR0EiLCJnb29nbGUtYW5hbHl0aWNzLXRyYWNraW5nIjoiX2hhbmRsZUdBRXZlbnQifSxhdHRhY2hlZCgpe3RoaXMuX2hhbmRsZUdBRXZlbnQoe2RldGFpbDp7aGl0VHlwZToicGFnZXZpZXcifX0pfSwKcmVsb2FkKCl7dGhpcy4kWyJxdWVyeS1wYW5lIl0ucmVsb2FkKCl9LF9zZW5kRXZlbnRUb0dBKCl7dGhpcy5fdGhyb3R0bGVkU2VuZEV2ZW50VG9HQSh0aGlzKX0sX2hhbmRsZUdBRXZlbnQoYil7dGhpcy4kLnRyYWNrZXIuaGFuZGxlRXZlbnQoYil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1iYWNrZW5kL3RmLWhwYXJhbXMtYmFja2VuZC5odG1sLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7Y2xhc3MgZntjb25zdHJ1Y3RvcihoLGssdD0hMCl7dGhpcy5fYXBpVXJsPWg7dGhpcy5fcmVxdWVzdE1hbmFnZXI9azt0aGlzLl91c2VIdHRwR2V0PXR9Z2V0RXhwZXJpbWVudChoKXtyZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3QoImV4cGVyaW1lbnQiLGgpfWdldERvd25sb2FkVXJsKGgsayx0KXtyZXR1cm4gdGhpcy5fYXBpVXJsKyIvZG93bmxvYWRfZGF0YT8iK25ldyBVUkxTZWFyY2hQYXJhbXMoe2Zvcm1hdDpoLGNvbHVtbnNWaXNpYmlsaXR5OkpTT04uc3RyaW5naWZ5KHQpLHJlcXVlc3Q6SlNPTi5zdHJpbmdpZnkoayl9KX1saXN0U2Vzc2lvbkdyb3VwcyhoKXtyZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3QoInNlc3Npb25fZ3JvdXBzIixoKX1saXN0TWV0cmljRXZhbHMoaCl7cmV0dXJuIHRoaXMuX3NlbmRSZXF1ZXN0KCJtZXRyaWNfZXZhbHMiLGgpfV9zZW5kUmVxdWVzdChoLGspe2lmKHRoaXMuX3VzZUh0dHBHZXQpcmV0dXJuIGs9ZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGspKSwKdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0aGlzLl9hcGlVcmwrIi8iK2grIj9yZXF1ZXN0XHgzZCIrayk7Y29uc3QgdD1uZXcgdmMuUmVxdWVzdE9wdGlvbnM7dC53aXRoQ3JlZGVudGlhbHM9ITA7dC5tZXRob2RUeXBlPSJQT1NUIjt0LmNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIjt0LmJvZHk9SlNPTi5zdHJpbmdpZnkoayk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3RXaXRoT3B0aW9ucyh0aGlzLl9hcGlVcmwrIi8iK2gsdCl9fWQuQmFja2VuZD1mfSkoYi5ocGFyYW1zfHwoYi5ocGFyYW1zPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1kYXNoYm9hcmQvdGYtaHBhcmFtcy1kYXNoYm9hcmQuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19iYWNrZW5kOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHRmLmhwYXJhbXMuQmFja2VuZCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaHBhcmFtcyIsIiIpLG5ldyB2Yy5SZXF1ZXN0TWFuYWdlciwhISh3aW5kb3cuVEVOU09SQk9BUkRfRU5WfHx7fSkuSU5fQ09MQUIpfX0scmVsb2FkKCl7dGhpcy4kWyJocGFyYW1zLW1haW4iXS5yZWxvYWQoKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy90aHJlZS5qcwooZnVuY3Rpb24oYixkKXsib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBtb2R1bGU/ZChleHBvcnRzKToiZnVuY3Rpb24iPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sZCk6KGI9Ynx8c2VsZixkKGIuVEhSRUU9e30pKX0pKHRoaXMsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZCgpe31mdW5jdGlvbiBmKGEsYyl7dGhpcy54PWF8fDA7dGhpcy55PWN8fDB9ZnVuY3Rpb24gaChhLGMsZSxnKXt0aGlzLl94PWF8fDA7dGhpcy5feT1jfHwwO3RoaXMuX3o9ZXx8MDt0aGlzLl93PXZvaWQgMCE9PWc/ZzoxfWZ1bmN0aW9uIGsoYSxjLGUpe3RoaXMueD1hfHwwO3RoaXMueT1jfHwwO3RoaXMuej1lfHwwfWZ1bmN0aW9uIHQoKXt0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDEsMCwwLDAsMV07MDxhcmd1bWVudHMubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLiIpfQpmdW5jdGlvbiBsKGEsYyxlLGcscix2LHosRSxHLEope09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOk5rKyt9KTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMuaW1hZ2U9dm9pZCAwIT09YT9hOmwuREVGQVVMVF9JTUFHRTt0aGlzLm1pcG1hcHM9W107dGhpcy5tYXBwaW5nPXZvaWQgMCE9PWM/YzpsLkRFRkFVTFRfTUFQUElORzt0aGlzLndyYXBTPXZvaWQgMCE9PWU/ZToxMDAxO3RoaXMud3JhcFQ9dm9pZCAwIT09Zz9nOjEwMDE7dGhpcy5tYWdGaWx0ZXI9dm9pZCAwIT09cj9yOjEwMDY7dGhpcy5taW5GaWx0ZXI9dm9pZCAwIT09dj92OjEwMDg7dGhpcy5hbmlzb3Ryb3B5PXZvaWQgMCE9PUc/RzoxO3RoaXMuZm9ybWF0PXZvaWQgMCE9PXo/ejoxMDIzO3RoaXMudHlwZT12b2lkIDAhPT1FP0U6MTAwOTt0aGlzLm9mZnNldD1uZXcgZigwLDApO3RoaXMucmVwZWF0PW5ldyBmKDEsMSk7dGhpcy5jZW50ZXI9bmV3IGYoMCwwKTsKdGhpcy5yb3RhdGlvbj0wO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMDt0aGlzLm1hdHJpeD1uZXcgdDt0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMDt0aGlzLnByZW11bHRpcGx5QWxwaGE9ITE7dGhpcy5mbGlwWT0hMDt0aGlzLnVucGFja0FsaWdubWVudD00O3RoaXMuZW5jb2Rpbmc9dm9pZCAwIT09Sj9KOjNFMzt0aGlzLnZlcnNpb249MDt0aGlzLm9uVXBkYXRlPW51bGx9ZnVuY3Rpb24gcChhLGMsZSxnKXt0aGlzLng9YXx8MDt0aGlzLnk9Y3x8MDt0aGlzLno9ZXx8MDt0aGlzLnc9dm9pZCAwIT09Zz9nOjF9ZnVuY3Rpb24gbShhLGMsZSl7dGhpcy53aWR0aD1hO3RoaXMuaGVpZ2h0PWM7dGhpcy5zY2lzc29yPW5ldyBwKDAsMCxhLGMpO3RoaXMuc2Npc3NvclRlc3Q9ITE7dGhpcy52aWV3cG9ydD1uZXcgcCgwLDAsYSxjKTtlPWV8fHt9O3RoaXMudGV4dHVyZT1uZXcgbCh2b2lkIDAsdm9pZCAwLGUud3JhcFMsZS53cmFwVCxlLm1hZ0ZpbHRlcixlLm1pbkZpbHRlcixlLmZvcm1hdCxlLnR5cGUsCmUuYW5pc290cm9weSxlLmVuY29kaW5nKTt0aGlzLnRleHR1cmUuaW1hZ2U9e307dGhpcy50ZXh0dXJlLmltYWdlLndpZHRoPWE7dGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodD1jO3RoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9dm9pZCAwIT09ZS5nZW5lcmF0ZU1pcG1hcHM/ZS5nZW5lcmF0ZU1pcG1hcHM6ITE7dGhpcy50ZXh0dXJlLm1pbkZpbHRlcj12b2lkIDAhPT1lLm1pbkZpbHRlcj9lLm1pbkZpbHRlcjoxMDA2O3RoaXMuZGVwdGhCdWZmZXI9dm9pZCAwIT09ZS5kZXB0aEJ1ZmZlcj9lLmRlcHRoQnVmZmVyOiEwO3RoaXMuc3RlbmNpbEJ1ZmZlcj12b2lkIDAhPT1lLnN0ZW5jaWxCdWZmZXI/ZS5zdGVuY2lsQnVmZmVyOiEwO3RoaXMuZGVwdGhUZXh0dXJlPXZvaWQgMCE9PWUuZGVwdGhUZXh0dXJlP2UuZGVwdGhUZXh0dXJlOm51bGx9ZnVuY3Rpb24gbihhLGMsZSl7bS5jYWxsKHRoaXMsYSxjLGUpO3RoaXMuc2FtcGxlcz00fWZ1bmN0aW9uIHEoKXt0aGlzLmVsZW1lbnRzPQpbMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV07MDxhcmd1bWVudHMubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLiIpfWZ1bmN0aW9uIHUoYSxjLGUsZyl7dGhpcy5feD1hfHwwO3RoaXMuX3k9Y3x8MDt0aGlzLl96PWV8fDA7dGhpcy5fb3JkZXI9Z3x8dS5EZWZhdWx0T3JkZXJ9ZnVuY3Rpb24geCgpe3RoaXMubWFzaz0xfWZ1bmN0aW9uIEEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpPaysrfSk7dGhpcy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLnR5cGU9Ik9iamVjdDNEIjt0aGlzLnBhcmVudD1udWxsO3RoaXMuY2hpbGRyZW49W107dGhpcy51cD1BLkRlZmF1bHRVcC5jbG9uZSgpO3ZhciBhPW5ldyBrLGM9bmV3IHUsZT1uZXcgaCxnPW5ldyBrKDEsMSwxKTtjLl9vbkNoYW5nZShmdW5jdGlvbigpe2Uuc2V0RnJvbUV1bGVyKGMsCiExKX0pO2UuX29uQ2hhbmdlKGZ1bmN0aW9uKCl7Yy5zZXRGcm9tUXVhdGVybmlvbihlLHZvaWQgMCwhMSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb3NpdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6YX0scm90YXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmN9LHF1YXRlcm5pb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9LHNjYWxlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpnfSxtb2RlbFZpZXdNYXRyaXg6e3ZhbHVlOm5ldyBxfSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyB0fX0pO3RoaXMubWF0cml4PW5ldyBxO3RoaXMubWF0cml4V29ybGQ9bmV3IHE7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPUEuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExO3RoaXMubGF5ZXJzPW5ldyB4O3RoaXMudmlzaWJsZT0hMDsKdGhpcy5yZWNlaXZlU2hhZG93PXRoaXMuY2FzdFNoYWRvdz0hMTt0aGlzLmZydXN0dW1DdWxsZWQ9ITA7dGhpcy5yZW5kZXJPcmRlcj0wO3RoaXMudXNlckRhdGE9e319ZnVuY3Rpb24geSgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNjZW5lIjt0aGlzLm92ZXJyaWRlTWF0ZXJpYWw9dGhpcy5mb2c9dGhpcy5iYWNrZ3JvdW5kPW51bGw7dGhpcy5hdXRvVXBkYXRlPSEwOyJ1bmRlZmluZWQiIT09dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9ZnVuY3Rpb24gdyhhLGMpe3RoaXMubWluPXZvaWQgMCE9PWE/YTpuZXcgayhJbmZpbml0eSxJbmZpbml0eSxJbmZpbml0eSk7dGhpcy5tYXg9dm9pZCAwIT09Yz9jOm5ldyBrKC1JbmZpbml0eSwtSW5maW5pdHksLUluZmluaXR5KX1mdW5jdGlvbiBDKGEsYyxlLGcscil7dmFyIHY7dmFyIHo9MDtmb3Iodj1hLmxlbmd0aC0KMzt6PD12O3orPTMpe0tkLmZyb21BcnJheShhLHopO3ZhciBFPWMuZG90KEtkKSxHPWUuZG90KEtkKSxKPWcuZG90KEtkKTtpZihNYXRoLm1heCgtTWF0aC5tYXgoRSxHLEopLE1hdGgubWluKEUsRyxKKSk+ci54Kk1hdGguYWJzKEtkLngpK3IueSpNYXRoLmFicyhLZC55KStyLnoqTWF0aC5hYnMoS2QueikpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gRihhLGMpe3RoaXMuY2VudGVyPXZvaWQgMCE9PWE/YTpuZXcgazt0aGlzLnJhZGl1cz12b2lkIDAhPT1jP2M6MH1mdW5jdGlvbiBEKGEsYyl7dGhpcy5vcmlnaW49dm9pZCAwIT09YT9hOm5ldyBrO3RoaXMuZGlyZWN0aW9uPXZvaWQgMCE9PWM/YzpuZXcga31mdW5jdGlvbiBCKGEsYyxlKXt0aGlzLmE9dm9pZCAwIT09YT9hOm5ldyBrO3RoaXMuYj12b2lkIDAhPT1jP2M6bmV3IGs7dGhpcy5jPXZvaWQgMCE9PWU/ZTpuZXcga31mdW5jdGlvbiBJKGEsYyxlKXtyZXR1cm4gdm9pZCAwPT09YyYmdm9pZCAwPT09ZT90aGlzLnNldChhKToKdGhpcy5zZXRSR0IoYSxjLGUpfWZ1bmN0aW9uIE4oYSxjLGUpezA+ZSYmKGUrPTEpOzE8ZSYmLS1lO3JldHVybiBlPDEvNj9hKzYqKGMtYSkqZTouNT5lP2M6ZTwyLzM/YSs2KihjLWEpKigyLzMtZSk6YX1mdW5jdGlvbiBPKGEpe3JldHVybi4wNDA0NT5hPy4wNzczOTkzODA4KmE6TWF0aC5wb3coLjk0Nzg2NzI5ODYqYSsuMDUyMTMyNzAxNCwyLjQpfWZ1bmN0aW9uIEgoYSl7cmV0dXJuLjAwMzEzMDg+YT8xMi45MiphOjEuMDU1Kk1hdGgucG93KGEsLjQxNjY2KS0uMDU1fWZ1bmN0aW9uIEsoYSxjLGUsZyxyLHYpe3RoaXMuYT1hO3RoaXMuYj1jO3RoaXMuYz1lO3RoaXMubm9ybWFsPWcmJmcuaXNWZWN0b3IzP2c6bmV3IGs7dGhpcy52ZXJ0ZXhOb3JtYWxzPUFycmF5LmlzQXJyYXkoZyk/ZzpbXTt0aGlzLmNvbG9yPXImJnIuaXNDb2xvcj9yOm5ldyBJO3RoaXMudmVydGV4Q29sb3JzPUFycmF5LmlzQXJyYXkocik/cjpbXTt0aGlzLm1hdGVyaWFsSW5kZXg9dm9pZCAwIT09dj92OjB9CmZ1bmN0aW9uIE0oKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpQaysrfSk7dGhpcy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLnR5cGU9Ik1hdGVyaWFsIjt0aGlzLmxpZ2h0cz10aGlzLmZvZz0hMDt0aGlzLmJsZW5kaW5nPTE7dGhpcy5zaWRlPTA7dGhpcy52ZXJ0ZXhUYW5nZW50cz10aGlzLmZsYXRTaGFkaW5nPSExO3RoaXMudmVydGV4Q29sb3JzPTA7dGhpcy5vcGFjaXR5PTE7dGhpcy50cmFuc3BhcmVudD0hMTt0aGlzLmJsZW5kU3JjPTIwNDt0aGlzLmJsZW5kRHN0PTIwNTt0aGlzLmJsZW5kRXF1YXRpb249MTAwO3RoaXMuYmxlbmRFcXVhdGlvbkFscGhhPXRoaXMuYmxlbmREc3RBbHBoYT10aGlzLmJsZW5kU3JjQWxwaGE9bnVsbDt0aGlzLmRlcHRoRnVuYz0zO3RoaXMuZGVwdGhXcml0ZT10aGlzLmRlcHRoVGVzdD0hMDt0aGlzLnN0ZW5jaWxGdW5jPTUxOTt0aGlzLnN0ZW5jaWxSZWY9MDt0aGlzLnN0ZW5jaWxNYXNrPQoyNTU7dGhpcy5zdGVuY2lsWlBhc3M9dGhpcy5zdGVuY2lsWkZhaWw9dGhpcy5zdGVuY2lsRmFpbD03NjgwO3RoaXMuc3RlbmNpbFdyaXRlPSExO3RoaXMuY2xpcHBpbmdQbGFuZXM9bnVsbDt0aGlzLmNsaXBTaGFkb3dzPXRoaXMuY2xpcEludGVyc2VjdGlvbj0hMTt0aGlzLnNoYWRvd1NpZGU9bnVsbDt0aGlzLmNvbG9yV3JpdGU9ITA7dGhpcy5wcmVjaXNpb249bnVsbDt0aGlzLnBvbHlnb25PZmZzZXQ9ITE7dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yPTA7dGhpcy5kaXRoZXJpbmc9ITE7dGhpcy5hbHBoYVRlc3Q9MDt0aGlzLnByZW11bHRpcGxpZWRBbHBoYT0hMTt0aGlzLnRvbmVNYXBwZWQ9dGhpcy52aXNpYmxlPSEwO3RoaXMudXNlckRhdGE9e307dGhpcy5uZWVkc1VwZGF0ZT0hMH1mdW5jdGlvbiBMKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmxpZ2h0TWFwPQp0aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW52TWFwPXRoaXMuYWxwaGFNYXA9dGhpcy5zcGVjdWxhck1hcD1udWxsO3RoaXMuY29tYmluZT0wO3RoaXMucmVmbGVjdGl2aXR5PTE7dGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4O3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIjt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIFEoYSxjLGUpe2lmKEFycmF5LmlzQXJyYXkoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLm5hbWU9IiI7dGhpcy5hcnJheT1hO3RoaXMuaXRlbVNpemU9CmM7dGhpcy5jb3VudD12b2lkIDAhPT1hP2EubGVuZ3RoL2M6MDt0aGlzLm5vcm1hbGl6ZWQ9ITA9PT1lO3RoaXMuZHluYW1pYz0hMTt0aGlzLnVwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX07dGhpcy52ZXJzaW9uPTB9ZnVuY3Rpb24gVChhLGMsZSl7US5jYWxsKHRoaXMsbmV3IEludDhBcnJheShhKSxjLGUpfWZ1bmN0aW9uIFgoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBVaW50OEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gYWEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBVaW50OENsYW1wZWRBcnJheShhKSxjLGUpfWZ1bmN0aW9uIGxhKGEsYyxlKXtRLmNhbGwodGhpcyxuZXcgSW50MTZBcnJheShhKSxjLGUpfWZ1bmN0aW9uIFooYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBVaW50MTZBcnJheShhKSxjLGUpfWZ1bmN0aW9uIGJhKGEsYyxlKXtRLmNhbGwodGhpcyxuZXcgSW50MzJBcnJheShhKSxjLGUpfWZ1bmN0aW9uIGVhKGEsYyxlKXtRLmNhbGwodGhpcyxuZXcgVWludDMyQXJyYXkoYSksCmMsZSl9ZnVuY3Rpb24gY2EoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBGbG9hdDMyQXJyYXkoYSksYyxlKX1mdW5jdGlvbiBrYShhLGMsZSl7US5jYWxsKHRoaXMsbmV3IEZsb2F0NjRBcnJheShhKSxjLGUpfWZ1bmN0aW9uIFkoKXt0aGlzLnZlcnRpY2VzPVtdO3RoaXMubm9ybWFscz1bXTt0aGlzLmNvbG9ycz1bXTt0aGlzLnV2cz1bXTt0aGlzLnV2czI9W107dGhpcy5ncm91cHM9W107dGhpcy5tb3JwaFRhcmdldHM9e307dGhpcy5za2luV2VpZ2h0cz1bXTt0aGlzLnNraW5JbmRpY2VzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMuZ3JvdXBzTmVlZFVwZGF0ZT10aGlzLnV2c05lZWRVcGRhdGU9dGhpcy5jb2xvcnNOZWVkVXBkYXRlPXRoaXMubm9ybWFsc05lZWRVcGRhdGU9dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9ITF9ZnVuY3Rpb24gRWEoYSl7aWYoMD09PWEubGVuZ3RoKXJldHVybi1JbmZpbml0eTtmb3IodmFyIGM9YVswXSxlPTEsZz0KYS5sZW5ndGg7ZTxnOysrZSlhW2VdPmMmJihjPWFbZV0pO3JldHVybiBjfWZ1bmN0aW9uIHZhKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6UWsrPTJ9KTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMudHlwZT0iQnVmZmVyR2VvbWV0cnkiO3RoaXMuaW5kZXg9bnVsbDt0aGlzLmF0dHJpYnV0ZXM9e307dGhpcy5tb3JwaEF0dHJpYnV0ZXM9e307dGhpcy5ncm91cHM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6SW5maW5pdHl9O3RoaXMudXNlckRhdGE9e319ZnVuY3Rpb24geGEoYSxjKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoIjt0aGlzLmdlb21ldHJ5PXZvaWQgMCE9PWE/YTpuZXcgdmE7dGhpcy5tYXRlcmlhbD12b2lkIDAhPT1jP2M6bmV3IEwoe2NvbG9yOjE2Nzc3MjE1Kk1hdGgucmFuZG9tKCl9KTt0aGlzLmRyYXdNb2RlPQowO3RoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9ZnVuY3Rpb24gQWEoYSxjLGUsZyxyLHYseixFKXtpZihudWxsPT09KDE9PT1jLnNpZGU/Zy5pbnRlcnNlY3RUcmlhbmdsZSh6LHYsciwhMCxFKTpnLmludGVyc2VjdFRyaWFuZ2xlKHIsdix6LDIhPT1jLnNpZGUsRSkpKXJldHVybiBudWxsO3NnLmNvcHkoRSk7c2cuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpO2M9ZS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oc2cpO3JldHVybiBjPGUubmVhcnx8Yz5lLmZhcj9udWxsOntkaXN0YW5jZTpjLHBvaW50OnNnLmNsb25lKCksb2JqZWN0OmF9fWZ1bmN0aW9uIEZhKGEsYyxlLGcscix2LHosRSxHLEosUCl7TGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLEcpO01kLmZyb21CdWZmZXJBdHRyaWJ1dGUocixKKTtOZC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsUCk7cj1hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztpZihjLm1vcnBoVGFyZ2V0cyYmdiYmcil7SWguc2V0KDAsMCwwKTtKaC5zZXQoMCwwLDApOwpLaC5zZXQoMCwwLDApO2Zvcih2YXIgUj0wLFM9di5sZW5ndGg7UjxTO1IrKyl7dmFyIFY9cltSXSxXPXZbUl07MCE9PVYmJigkaS5mcm9tQnVmZmVyQXR0cmlidXRlKFcsRyksYWouZnJvbUJ1ZmZlckF0dHJpYnV0ZShXLEopLGJqLmZyb21CdWZmZXJBdHRyaWJ1dGUoVyxQKSxJaC5hZGRTY2FsZWRWZWN0b3IoJGkuc3ViKExkKSxWKSxKaC5hZGRTY2FsZWRWZWN0b3IoYWouc3ViKE1kKSxWKSxLaC5hZGRTY2FsZWRWZWN0b3IoYmouc3ViKE5kKSxWKSl9TGQuYWRkKEloKTtNZC5hZGQoSmgpO05kLmFkZChLaCl9aWYoYT1BYShhLGMsZSxnLExkLE1kLE5kLHNmKSl6JiYob2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh6LEcpLHBlLmZyb21CdWZmZXJBdHRyaWJ1dGUoeixKKSxxZS5mcm9tQnVmZmVyQXR0cmlidXRlKHosUCksYS51dj1CLmdldFVWKHNmLExkLE1kLE5kLG9lLHBlLHFlLG5ldyBmKSksRSYmKG9lLmZyb21CdWZmZXJBdHRyaWJ1dGUoRSxHKSxwZS5mcm9tQnVmZmVyQXR0cmlidXRlKEUsCkopLHFlLmZyb21CdWZmZXJBdHRyaWJ1dGUoRSxQKSxhLnV2Mj1CLmdldFVWKHNmLExkLE1kLE5kLG9lLHBlLHFlLG5ldyBmKSksej1uZXcgSyhHLEosUCksQi5nZXROb3JtYWwoTGQsTWQsTmQsei5ub3JtYWwpLGEuZmFjZT16O3JldHVybiBhfWZ1bmN0aW9uIHlhKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6UmsrPTJ9KTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMudHlwZT0iR2VvbWV0cnkiO3RoaXMudmVydGljZXM9W107dGhpcy5jb2xvcnM9W107dGhpcy5mYWNlcz1bXTt0aGlzLmZhY2VWZXJ0ZXhVdnM9W1tdXTt0aGlzLm1vcnBoVGFyZ2V0cz1bXTt0aGlzLm1vcnBoTm9ybWFscz1bXTt0aGlzLnNraW5XZWlnaHRzPVtdO3RoaXMuc2tpbkluZGljZXM9W107dGhpcy5saW5lRGlzdGFuY2VzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMuZ3JvdXBzTmVlZFVwZGF0ZT10aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlPQp0aGlzLmNvbG9yc05lZWRVcGRhdGU9dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT10aGlzLnV2c05lZWRVcGRhdGU9dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9dGhpcy5lbGVtZW50c05lZWRVcGRhdGU9ITF9ZnVuY3Rpb24gU2EoYSxjLGUsZyxyLHYpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJCb3hHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDphLGhlaWdodDpjLGRlcHRoOmUsd2lkdGhTZWdtZW50czpnLGhlaWdodFNlZ21lbnRzOnIsZGVwdGhTZWdtZW50czp2fTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgWGEoYSxjLGUsZyxyLHYpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBYYShhLGMsZSxnLHIsdil7ZnVuY3Rpb24geihXLGhhLGZhLHJhLHBhLHFhLHVhLG9hLHRhLEJhLFRhKXt2YXIgVWE9cWEvdGEsQ2E9dWEvQmEsSGE9cWEvMixEYT11YS8yLE1hPW9hLzI7dWE9dGErMTt2YXIgZGI9QmErMSx0Yj1xYT0wLEthLGJiLGpiPW5ldyBrO2ZvcihiYj0KMDtiYjxkYjtiYisrKXt2YXIgRWI9YmIqQ2EtRGE7Zm9yKEthPTA7S2E8dWE7S2ErKylqYltXXT0oS2EqVWEtSGEpKnJhLGpiW2hhXT1FYipwYSxqYltmYV09TWEsSi5wdXNoKGpiLngsamIueSxqYi56KSxqYltXXT0wLGpiW2hhXT0wLGpiW2ZhXT0wPG9hPzE6LTEsUC5wdXNoKGpiLngsamIueSxqYi56KSxSLnB1c2goS2EvdGEpLFIucHVzaCgxLWJiL0JhKSxxYSs9MX1mb3IoYmI9MDtiYjxCYTtiYisrKWZvcihLYT0wO0thPHRhO0thKyspVz1TK0thK3VhKihiYisxKSxoYT1TKyhLYSsxKSt1YSooYmIrMSksZmE9UysoS2ErMSkrdWEqYmIsRy5wdXNoKFMrS2ErdWEqYmIsVyxmYSksRy5wdXNoKFcsaGEsZmEpLHRiKz02O0UuYWRkR3JvdXAoVix0YixUYSk7Vis9dGI7Uys9cWF9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJveEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOmEsaGVpZ2h0OmMsZGVwdGg6ZSx3aWR0aFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6ciwKZGVwdGhTZWdtZW50czp2fTt2YXIgRT10aGlzO2E9YXx8MTtjPWN8fDE7ZT1lfHwxO2c9TWF0aC5mbG9vcihnKXx8MTtyPU1hdGguZmxvb3Iocil8fDE7dj1NYXRoLmZsb29yKHYpfHwxO3ZhciBHPVtdLEo9W10sUD1bXSxSPVtdLFM9MCxWPTA7eigieiIsInkiLCJ4IiwtMSwtMSxlLGMsYSx2LHIsMCk7eigieiIsInkiLCJ4IiwxLC0xLGUsYywtYSx2LHIsMSk7eigieCIsInoiLCJ5IiwxLDEsYSxlLGMsZyx2LDIpO3ooIngiLCJ6IiwieSIsMSwtMSxhLGUsLWMsZyx2LDMpO3ooIngiLCJ5IiwieiIsMSwtMSxhLGMsZSxnLHIsNCk7eigieCIsInkiLCJ6IiwtMSwtMSxhLGMsLWUsZyxyLDUpO3RoaXMuc2V0SW5kZXgoRyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoSiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKFAsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKFIsMikpfWZ1bmN0aW9uIHViKGEpe3ZhciBjPXt9LGU7Zm9yKGUgaW4gYSl7Y1tlXT0Ke307Zm9yKHZhciBnIGluIGFbZV0pe3ZhciByPWFbZV1bZ107Y1tlXVtnXT1yJiYoci5pc0NvbG9yfHxyLmlzTWF0cml4M3x8ci5pc01hdHJpeDR8fHIuaXNWZWN0b3IyfHxyLmlzVmVjdG9yM3x8ci5pc1ZlY3RvcjR8fHIuaXNUZXh0dXJlKT9yLmNsb25lKCk6QXJyYXkuaXNBcnJheShyKT9yLnNsaWNlKCk6cn19cmV0dXJuIGN9ZnVuY3Rpb24gQmIoYSl7Zm9yKHZhciBjPXt9LGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGc9dWIoYVtlXSkscjtmb3IociBpbiBnKWNbcl09Z1tyXX1yZXR1cm4gY31mdW5jdGlvbiBxYihhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTaGFkZXJNYXRlcmlhbCI7dGhpcy5kZWZpbmVzPXt9O3RoaXMudW5pZm9ybXM9e307dGhpcy52ZXJ0ZXhTaGFkZXI9InZvaWQgbWFpbigpIHtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSI7dGhpcy5mcmFnbWVudFNoYWRlcj0KInZvaWQgbWFpbigpIHtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XG59Ijt0aGlzLmxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz10aGlzLmNsaXBwaW5nPXRoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuZXh0ZW5zaW9ucz17ZGVyaXZhdGl2ZXM6ITEsZnJhZ0RlcHRoOiExLGRyYXdCdWZmZXJzOiExLHNoYWRlclRleHR1cmVMT0Q6ITF9O3RoaXMuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcz17Y29sb3I6WzEsMSwxXSx1djpbMCwwXSx1djI6WzAsMF19O3RoaXMuaW5kZXgwQXR0cmlidXRlTmFtZT12b2lkIDA7dGhpcy51bmlmb3Jtc05lZWRVcGRhdGU9ITE7dm9pZCAwIT09YSYmKHZvaWQgMCE9PWEuYXR0cmlidXRlcyYmY29uc29sZS5lcnJvcigiVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdyBiZSBkZWZpbmVkIGluIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIiksCnRoaXMuc2V0VmFsdWVzKGEpKX1mdW5jdGlvbiB6Yigpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNhbWVyYSI7dGhpcy5tYXRyaXhXb3JsZEludmVyc2U9bmV3IHE7dGhpcy5wcm9qZWN0aW9uTWF0cml4PW5ldyBxO3RoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2U9bmV3IHF9ZnVuY3Rpb24gdmIoYSxjLGUsZyl7emIuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBlcnNwZWN0aXZlQ2FtZXJhIjt0aGlzLmZvdj12b2lkIDAhPT1hP2E6NTA7dGhpcy56b29tPTE7dGhpcy5uZWFyPXZvaWQgMCE9PWU/ZTouMTt0aGlzLmZhcj12b2lkIDAhPT1nP2c6MkUzO3RoaXMuZm9jdXM9MTA7dGhpcy5hc3BlY3Q9dm9pZCAwIT09Yz9jOjE7dGhpcy52aWV3PW51bGw7dGhpcy5maWxtR2F1Z2U9MzU7dGhpcy5maWxtT2Zmc2V0PTA7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9ZnVuY3Rpb24gR2IoYSxjLGUsZyl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3ViZUNhbWVyYSI7dmFyIHI9bmV3IHZiKDkwLAoxLGEsYyk7ci51cC5zZXQoMCwtMSwwKTtyLmxvb2tBdChuZXcgaygxLDAsMCkpO3RoaXMuYWRkKHIpO3ZhciB2PW5ldyB2Yig5MCwxLGEsYyk7di51cC5zZXQoMCwtMSwwKTt2Lmxvb2tBdChuZXcgaygtMSwwLDApKTt0aGlzLmFkZCh2KTt2YXIgej1uZXcgdmIoOTAsMSxhLGMpO3oudXAuc2V0KDAsMCwxKTt6Lmxvb2tBdChuZXcgaygwLDEsMCkpO3RoaXMuYWRkKHopO3ZhciBFPW5ldyB2Yig5MCwxLGEsYyk7RS51cC5zZXQoMCwwLC0xKTtFLmxvb2tBdChuZXcgaygwLC0xLDApKTt0aGlzLmFkZChFKTt2YXIgRz1uZXcgdmIoOTAsMSxhLGMpO0cudXAuc2V0KDAsLTEsMCk7Ry5sb29rQXQobmV3IGsoMCwwLDEpKTt0aGlzLmFkZChHKTt2YXIgSj1uZXcgdmIoOTAsMSxhLGMpO0oudXAuc2V0KDAsLTEsMCk7Si5sb29rQXQobmV3IGsoMCwwLC0xKSk7dGhpcy5hZGQoSik7Zz1nfHx7Zm9ybWF0OjEwMjIsbWFnRmlsdGVyOjEwMDYsbWluRmlsdGVyOjEwMDZ9O3RoaXMucmVuZGVyVGFyZ2V0PQpuZXcgTmIoZSxlLGcpO3RoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZT0iQ3ViZUNhbWVyYSI7dGhpcy51cGRhdGU9ZnVuY3Rpb24oUCxSKXtudWxsPT09dGhpcy5wYXJlbnQmJnRoaXMudXBkYXRlTWF0cml4V29ybGQoKTt2YXIgUz1QLmdldFJlbmRlclRhcmdldCgpLFY9dGhpcy5yZW5kZXJUYXJnZXQsVz1WLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1YudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9ITE7UC5zZXRSZW5kZXJUYXJnZXQoViwwKTtQLnJlbmRlcihSLHIpO1Auc2V0UmVuZGVyVGFyZ2V0KFYsMSk7UC5yZW5kZXIoUix2KTtQLnNldFJlbmRlclRhcmdldChWLDIpO1AucmVuZGVyKFIseik7UC5zZXRSZW5kZXJUYXJnZXQoViwzKTtQLnJlbmRlcihSLEUpO1Auc2V0UmVuZGVyVGFyZ2V0KFYsNCk7UC5yZW5kZXIoUixHKTtWLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPVc7UC5zZXRSZW5kZXJUYXJnZXQoViw1KTtQLnJlbmRlcihSLEopO1Auc2V0UmVuZGVyVGFyZ2V0KFMpfTsKdGhpcy5jbGVhcj1mdW5jdGlvbihQLFIsUyxWKXtmb3IodmFyIFc9UC5nZXRSZW5kZXJUYXJnZXQoKSxoYT10aGlzLnJlbmRlclRhcmdldCxmYT0wOzY+ZmE7ZmErKylQLnNldFJlbmRlclRhcmdldChoYSxmYSksUC5jbGVhcihSLFMsVik7UC5zZXRSZW5kZXJUYXJnZXQoVyl9fWZ1bmN0aW9uIE5iKGEsYyxlKXttLmNhbGwodGhpcyxhLGMsZSl9ZnVuY3Rpb24gQWIoYSxjLGUsZyxyLHYseixFLEcsSixQLFIpe2wuY2FsbCh0aGlzLG51bGwsdix6LEUsRyxKLGcscixQLFIpO3RoaXMuaW1hZ2U9e2RhdGE6YSx3aWR0aDpjLGhlaWdodDplfTt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT1HP0c6MTAwMzt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT1KP0o6MTAwMzt0aGlzLmZsaXBZPXRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExO3RoaXMudW5wYWNrQWxpZ25tZW50PTF9ZnVuY3Rpb24gSGIoYSxjKXt0aGlzLm5vcm1hbD12b2lkIDAhPT1hP2E6bmV3IGsoMSwwLDApO3RoaXMuY29uc3RhbnQ9dm9pZCAwIT09CmM/YzowfWZ1bmN0aW9uIGljKGEsYyxlLGcscix2KXt0aGlzLnBsYW5lcz1bdm9pZCAwIT09YT9hOm5ldyBIYix2b2lkIDAhPT1jP2M6bmV3IEhiLHZvaWQgMCE9PWU/ZTpuZXcgSGIsdm9pZCAwIT09Zz9nOm5ldyBIYix2b2lkIDAhPT1yP3I6bmV3IEhiLHZvaWQgMCE9PXY/djpuZXcgSGJdfWZ1bmN0aW9uIGJjKCl7ZnVuY3Rpb24gYShyLHYpeyExIT09ZSYmKGcocix2KSxjLnJlcXVlc3RBbmltYXRpb25GcmFtZShhKSl9dmFyIGM9bnVsbCxlPSExLGc9bnVsbDtyZXR1cm57c3RhcnQ6ZnVuY3Rpb24oKXshMCE9PWUmJm51bGwhPT1nJiYoYy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYSksZT0hMCl9LHN0b3A6ZnVuY3Rpb24oKXtlPSExfSxzZXRBbmltYXRpb25Mb29wOmZ1bmN0aW9uKHIpe2c9cn0sc2V0Q29udGV4dDpmdW5jdGlvbihyKXtjPXJ9fX1mdW5jdGlvbiBPZChhKXtmdW5jdGlvbiBjKHIsdil7dmFyIHo9ci5hcnJheSxFPXIuZHluYW1pYz8zNTA0ODozNTA0NCxHPWEuY3JlYXRlQnVmZmVyKCk7CmEuYmluZEJ1ZmZlcih2LEcpO2EuYnVmZmVyRGF0YSh2LHosRSk7ci5vblVwbG9hZENhbGxiYWNrKCk7dj01MTI2O3ogaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXk/dj01MTI2OnogaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXk/Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFVuc3VwcG9ydGVkIGRhdGEgYnVmZmVyIGZvcm1hdDogRmxvYXQ2NEFycmF5LiIpOnogaW5zdGFuY2VvZiBVaW50MTZBcnJheT92PTUxMjM6eiBpbnN0YW5jZW9mIEludDE2QXJyYXk/dj01MTIyOnogaW5zdGFuY2VvZiBVaW50MzJBcnJheT92PTUxMjU6eiBpbnN0YW5jZW9mIEludDMyQXJyYXk/dj01MTI0OnogaW5zdGFuY2VvZiBJbnQ4QXJyYXk/dj01MTIwOnogaW5zdGFuY2VvZiBVaW50OEFycmF5JiYodj01MTIxKTtyZXR1cm57YnVmZmVyOkcsdHlwZTp2LGJ5dGVzUGVyRWxlbWVudDp6LkJZVEVTX1BFUl9FTEVNRU5ULHZlcnNpb246ci52ZXJzaW9ufX1mdW5jdGlvbiBlKHIsdix6KXt2YXIgRT0Kdi5hcnJheSxHPXYudXBkYXRlUmFuZ2U7YS5iaW5kQnVmZmVyKHoscik7ITE9PT12LmR5bmFtaWM/YS5idWZmZXJEYXRhKHosRSwzNTA0NCk6LTE9PT1HLmNvdW50P2EuYnVmZmVyU3ViRGF0YSh6LDAsRSk6MD09PUcuY291bnQ/Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xPYmplY3RzLnVwZGF0ZUJ1ZmZlcjogZHluYW1pYyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUgbWFya2VkIGFzIG5lZWRzVXBkYXRlIGJ1dCB1cGRhdGVSYW5nZS5jb3VudCBpcyAwLCBlbnN1cmUgeW91IGFyZSB1c2luZyBzZXQgbWV0aG9kcyBvciB1cGRhdGluZyBtYW51YWxseS4iKTooYS5idWZmZXJTdWJEYXRhKHosRy5vZmZzZXQqRS5CWVRFU19QRVJfRUxFTUVOVCxFLnN1YmFycmF5KEcub2Zmc2V0LEcub2Zmc2V0K0cuY291bnQpKSxHLmNvdW50PS0xKX12YXIgZz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKHIpe3IuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKHI9ci5kYXRhKTtyZXR1cm4gZy5nZXQocil9LApyZW1vdmU6ZnVuY3Rpb24ocil7ci5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYocj1yLmRhdGEpO3ZhciB2PWcuZ2V0KHIpO3YmJihhLmRlbGV0ZUJ1ZmZlcih2LmJ1ZmZlciksZy5kZWxldGUocikpfSx1cGRhdGU6ZnVuY3Rpb24ocix2KXtyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihyPXIuZGF0YSk7dmFyIHo9Zy5nZXQocik7dm9pZCAwPT09ej9nLnNldChyLGMocix2KSk6ei52ZXJzaW9uPHIudmVyc2lvbiYmKGUoei5idWZmZXIscix2KSx6LnZlcnNpb249ci52ZXJzaW9uKX19fWZ1bmN0aW9uIHJkKGEsYyxlLGcpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQbGFuZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOmEsaGVpZ2h0OmMsd2lkdGhTZWdtZW50czplLGhlaWdodFNlZ21lbnRzOmd9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBMYyhhLGMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gTGMoYSxjLGUsZyl7dmEuY2FsbCh0aGlzKTsKdGhpcy50eXBlPSJQbGFuZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOmEsaGVpZ2h0OmMsd2lkdGhTZWdtZW50czplLGhlaWdodFNlZ21lbnRzOmd9O2E9YXx8MTtjPWN8fDE7dmFyIHI9YS8yLHY9Yy8yO2U9TWF0aC5mbG9vcihlKXx8MTtnPU1hdGguZmxvb3IoZyl8fDE7dmFyIHo9ZSsxLEU9ZysxLEc9YS9lLEo9Yy9nLFA9W10sUj1bXSxTPVtdLFY9W107Zm9yKGE9MDthPEU7YSsrKXt2YXIgVz1hKkotdjtmb3IoYz0wO2M8ejtjKyspUi5wdXNoKGMqRy1yLC1XLDApLFMucHVzaCgwLDAsMSksVi5wdXNoKGMvZSksVi5wdXNoKDEtYS9nKX1mb3IoYT0wO2E8ZzthKyspZm9yKGM9MDtjPGU7YysrKXI9Yyt6KihhKzEpLHY9YysxK3oqKGErMSksRT1jKzEreiphLFAucHVzaChjK3oqYSxyLEUpLFAucHVzaChyLHYsRSk7dGhpcy5zZXRJbmRleChQKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShSLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIiwKbmV3IGNhKFMsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKFYsMikpfWZ1bmN0aW9uIHNkKGEsYyxlLGcpe2Z1bmN0aW9uIHIoUixTKXtjLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoUi5yLFIuZyxSLmIsUyxnKX12YXIgdj1uZXcgSSgwKSx6PTAsRSxHLEo9bnVsbCxQPTA7cmV0dXJue2dldENsZWFyQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4gdn0sc2V0Q2xlYXJDb2xvcjpmdW5jdGlvbihSLFMpe3Yuc2V0KFIpO3o9dm9pZCAwIT09Uz9TOjE7cih2LHopfSxnZXRDbGVhckFscGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHp9LHNldENsZWFyQWxwaGE6ZnVuY3Rpb24oUil7ej1SO3Iodix6KX0scmVuZGVyOmZ1bmN0aW9uKFIsUyxWLFcpe1M9Uy5iYWNrZ3JvdW5kO1Y9YS52cjsoVj1WLmdldFNlc3Npb24mJlYuZ2V0U2Vzc2lvbigpKSYmImFkZGl0aXZlIj09PVYuZW52aXJvbm1lbnRCbGVuZE1vZGUmJihTPW51bGwpO251bGw9PT1TPyhyKHYseiksSj1udWxsLFA9MCk6UyYmUy5pc0NvbG9yJiYKKHIoUywxKSxXPSEwLEo9bnVsbCxQPTApOyhhLmF1dG9DbGVhcnx8VykmJmEuY2xlYXIoYS5hdXRvQ2xlYXJDb2xvcixhLmF1dG9DbGVhckRlcHRoLGEuYXV0b0NsZWFyU3RlbmNpbCk7aWYoUyYmKFMuaXNDdWJlVGV4dHVyZXx8Uy5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSkpe3ZvaWQgMD09PUcmJihHPW5ldyB4YShuZXcgWGEoMSwxLDEpLG5ldyBxYih7dHlwZToiQmFja2dyb3VuZEN1YmVNYXRlcmlhbCIsdW5pZm9ybXM6dWIoTWMuY3ViZS51bmlmb3JtcyksdmVydGV4U2hhZGVyOk1jLmN1YmUudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOk1jLmN1YmUuZnJhZ21lbnRTaGFkZXIsc2lkZToxLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExLGZvZzohMX0pKSxHLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSgibm9ybWFsIiksRy5nZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoInV2IiksRy5vbkJlZm9yZVJlbmRlcj1mdW5jdGlvbihoYSxmYSxyYSl7dGhpcy5tYXRyaXhXb3JsZC5jb3B5UG9zaXRpb24ocmEubWF0cml4V29ybGQpfSwKT2JqZWN0LmRlZmluZVByb3BlcnR5KEcubWF0ZXJpYWwsIm1hcCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuaWZvcm1zLnRDdWJlLnZhbHVlfX0pLGUudXBkYXRlKEcpKTtXPVMuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/Uy50ZXh0dXJlOlM7Ry5tYXRlcmlhbC51bmlmb3Jtcy50Q3ViZS52YWx1ZT1XO0cubWF0ZXJpYWwudW5pZm9ybXMudEZsaXAudmFsdWU9Uy5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT8xOi0xO2lmKEohPT1TfHxQIT09Vy52ZXJzaW9uKUcubWF0ZXJpYWwubmVlZHNVcGRhdGU9ITAsSj1TLFA9Vy52ZXJzaW9uO1IudW5zaGlmdChHLEcuZ2VvbWV0cnksRy5tYXRlcmlhbCwwLDAsbnVsbCl9ZWxzZSBpZihTJiZTLmlzVGV4dHVyZSl7dm9pZCAwPT09RSYmKEU9bmV3IHhhKG5ldyBMYygyLDIpLG5ldyBxYih7dHlwZToiQmFja2dyb3VuZE1hdGVyaWFsIix1bmlmb3Jtczp1YihNYy5iYWNrZ3JvdW5kLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6TWMuYmFja2dyb3VuZC52ZXJ0ZXhTaGFkZXIsCmZyYWdtZW50U2hhZGVyOk1jLmJhY2tncm91bmQuZnJhZ21lbnRTaGFkZXIsc2lkZTowLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExLGZvZzohMX0pKSxFLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSgibm9ybWFsIiksT2JqZWN0LmRlZmluZVByb3BlcnR5KEUubWF0ZXJpYWwsIm1hcCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuaWZvcm1zLnQyRC52YWx1ZX19KSxlLnVwZGF0ZShFKSk7RS5tYXRlcmlhbC51bmlmb3Jtcy50MkQudmFsdWU9UzshMD09PVMubWF0cml4QXV0b1VwZGF0ZSYmUy51cGRhdGVNYXRyaXgoKTtFLm1hdGVyaWFsLnVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoUy5tYXRyaXgpO2lmKEohPT1TfHxQIT09Uy52ZXJzaW9uKUUubWF0ZXJpYWwubmVlZHNVcGRhdGU9ITAsSj1TLFA9Uy52ZXJzaW9uO1IudW5zaGlmdChFLEUuZ2VvbWV0cnksRS5tYXRlcmlhbCwwLDAsbnVsbCl9fX19ZnVuY3Rpb24gc2EoYSxjLGUsZyl7dmFyIHI7dGhpcy5zZXRNb2RlPQpmdW5jdGlvbih2KXtyPXZ9O3RoaXMucmVuZGVyPWZ1bmN0aW9uKHYseil7YS5kcmF3QXJyYXlzKHIsdix6KTtlLnVwZGF0ZSh6LHIpfTt0aGlzLnJlbmRlckluc3RhbmNlcz1mdW5jdGlvbih2LHosRSl7aWYoZy5pc1dlYkdMMil7dmFyIEc9YTt2YXIgSj0iZHJhd0FycmF5c0luc3RhbmNlZCJ9ZWxzZSBpZihHPWMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiksSj0iZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFIixudWxsPT09Ryl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7cmV0dXJufUdbSl0ocix6LEUsdi5tYXhJbnN0YW5jZWRDb3VudCk7ZS51cGRhdGUoRSxyLHYubWF4SW5zdGFuY2VkQ291bnQpfX1mdW5jdGlvbiBNYihhLGMsZSl7ZnVuY3Rpb24gZyhxYSl7aWYoImhpZ2hwIj09PQpxYSl7aWYoMDxhLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMywzNjMzOCkucHJlY2lzaW9uJiYwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMyLDM2MzM4KS5wcmVjaXNpb24pcmV0dXJuImhpZ2hwIjtxYT0ibWVkaXVtcCJ9cmV0dXJuIm1lZGl1bXAiPT09cWEmJjA8YS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzMsMzYzMzcpLnByZWNpc2lvbiYmMDxhLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMiwzNjMzNykucHJlY2lzaW9uPyJtZWRpdW1wIjoibG93cCJ9dmFyIHIsdj0idW5kZWZpbmVkIiE9PXR5cGVvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0JiZhIGluc3RhbmNlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCx6PXZvaWQgMCE9PWUucHJlY2lzaW9uP2UucHJlY2lzaW9uOiJoaWdocCIsRT1nKHopO0UhPT16JiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiIseiwibm90IHN1cHBvcnRlZCwgdXNpbmciLEUsImluc3RlYWQuIiksCno9RSk7ZT0hMD09PWUubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjtFPWEuZ2V0UGFyYW1ldGVyKDM0OTMwKTt2YXIgRz1hLmdldFBhcmFtZXRlcigzNTY2MCksSj1hLmdldFBhcmFtZXRlcigzMzc5KSxQPWEuZ2V0UGFyYW1ldGVyKDM0MDc2KSxSPWEuZ2V0UGFyYW1ldGVyKDM0OTIxKSxTPWEuZ2V0UGFyYW1ldGVyKDM2MzQ3KSxWPWEuZ2V0UGFyYW1ldGVyKDM2MzQ4KSxXPWEuZ2V0UGFyYW1ldGVyKDM2MzQ5KSxoYT0wPEcsZmE9dnx8ISFjLmdldCgiT0VTX3RleHR1cmVfZmxvYXQiKSxyYT1oYSYmZmEscGE9dj9hLmdldFBhcmFtZXRlcigzNjE4Myk6MDtyZXR1cm57aXNXZWJHTDI6dixnZXRNYXhBbmlzb3Ryb3B5OmZ1bmN0aW9uKCl7aWYodm9pZCAwIT09cilyZXR1cm4gcjt2YXIgcWE9Yy5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO3JldHVybiByPW51bGwhPT1xYT9hLmdldFBhcmFtZXRlcihxYS5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpOjB9LApnZXRNYXhQcmVjaXNpb246ZyxwcmVjaXNpb246eixsb2dhcml0aG1pY0RlcHRoQnVmZmVyOmUsbWF4VGV4dHVyZXM6RSxtYXhWZXJ0ZXhUZXh0dXJlczpHLG1heFRleHR1cmVTaXplOkosbWF4Q3ViZW1hcFNpemU6UCxtYXhBdHRyaWJ1dGVzOlIsbWF4VmVydGV4VW5pZm9ybXM6UyxtYXhWYXJ5aW5nczpWLG1heEZyYWdtZW50VW5pZm9ybXM6Vyx2ZXJ0ZXhUZXh0dXJlczpoYSxmbG9hdEZyYWdtZW50VGV4dHVyZXM6ZmEsZmxvYXRWZXJ0ZXhUZXh0dXJlczpyYSxtYXhTYW1wbGVzOnBhfX1mdW5jdGlvbiB3Yygpe2Z1bmN0aW9uIGEoKXtKLnZhbHVlIT09ZyYmKEoudmFsdWU9ZyxKLm5lZWRzVXBkYXRlPTA8cik7ZS5udW1QbGFuZXM9cjtlLm51bUludGVyc2VjdGlvbj0wfWZ1bmN0aW9uIGMoUCxSLFMsVil7dmFyIFc9bnVsbCE9PVA/UC5sZW5ndGg6MCxoYT1udWxsO2lmKDAhPT1XKXtoYT1KLnZhbHVlO2lmKCEwIT09Vnx8bnVsbD09PWhhKXtWPVMrNCpXO1I9Ui5tYXRyaXhXb3JsZEludmVyc2U7CkcuZ2V0Tm9ybWFsTWF0cml4KFIpO2lmKG51bGw9PT1oYXx8aGEubGVuZ3RoPFYpaGE9bmV3IEZsb2F0MzJBcnJheShWKTtmb3IoVj0wO1YhPT1XOysrVixTKz00KUUuY29weShQW1ZdKS5hcHBseU1hdHJpeDQoUixHKSxFLm5vcm1hbC50b0FycmF5KGhhLFMpLGhhW1MrM109RS5jb25zdGFudH1KLnZhbHVlPWhhO0oubmVlZHNVcGRhdGU9ITB9ZS5udW1QbGFuZXM9VztyZXR1cm4gaGF9dmFyIGU9dGhpcyxnPW51bGwscj0wLHY9ITEsej0hMSxFPW5ldyBIYixHPW5ldyB0LEo9e3ZhbHVlOm51bGwsbmVlZHNVcGRhdGU6ITF9O3RoaXMudW5pZm9ybT1KO3RoaXMubnVtSW50ZXJzZWN0aW9uPXRoaXMubnVtUGxhbmVzPTA7dGhpcy5pbml0PWZ1bmN0aW9uKFAsUixTKXt2YXIgVj0wIT09UC5sZW5ndGh8fFJ8fDAhPT1yfHx2O3Y9UjtnPWMoUCxTLDApO3I9UC5sZW5ndGg7cmV0dXJuIFZ9O3RoaXMuYmVnaW5TaGFkb3dzPWZ1bmN0aW9uKCl7ej0hMDtjKG51bGwpfTt0aGlzLmVuZFNoYWRvd3M9CmZ1bmN0aW9uKCl7ej0hMTthKCl9O3RoaXMuc2V0U3RhdGU9ZnVuY3Rpb24oUCxSLFMsVixXLGhhKXtpZighdnx8bnVsbD09PVB8fDA9PT1QLmxlbmd0aHx8eiYmIVMpej9jKG51bGwpOmEoKTtlbHNle1M9ej8wOnI7dmFyIGZhPTQqUyxyYT1XLmNsaXBwaW5nU3RhdGV8fG51bGw7Si52YWx1ZT1yYTtyYT1jKFAsVixmYSxoYSk7Zm9yKFA9MDtQIT09ZmE7KytQKXJhW1BdPWdbUF07Vy5jbGlwcGluZ1N0YXRlPXJhO3RoaXMubnVtSW50ZXJzZWN0aW9uPVI/dGhpcy5udW1QbGFuZXM6MDt0aGlzLm51bVBsYW5lcys9U319fWZ1bmN0aW9uIGJkKGEpe3ZhciBjPXt9O3JldHVybntnZXQ6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09Y1tlXSlyZXR1cm4gY1tlXTtzd2l0Y2goZSl7Y2FzZSAiV0VCR0xfZGVwdGhfdGV4dHVyZSI6dmFyIGc9YS5nZXRFeHRlbnNpb24oIldFQkdMX2RlcHRoX3RleHR1cmUiKXx8YS5nZXRFeHRlbnNpb24oIk1PWl9XRUJHTF9kZXB0aF90ZXh0dXJlIil8fGEuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfZGVwdGhfdGV4dHVyZSIpOwpicmVhaztjYXNlICJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiOmc9YS5nZXRFeHRlbnNpb24oIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpfHxhLmdldEV4dGVuc2lvbigiTU9aX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpfHxhLmdldEV4dGVuc2lvbigiV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2JyZWFrO2Nhc2UgIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIjpnPWEuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfHxhLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGEuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKTticmVhaztjYXNlICJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiOmc9YS5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpfHwKYS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKTticmVhaztkZWZhdWx0Omc9YS5nZXRFeHRlbnNpb24oZSl9bnVsbD09PWcmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogIitlKyIgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuIik7cmV0dXJuIGNbZV09Z319fWZ1bmN0aW9uIHRkKGEsYyxlKXtmdW5jdGlvbiBnKEUpe3ZhciBHPUUudGFyZ2V0O0U9di5nZXQoRyk7bnVsbCE9PUUuaW5kZXgmJmMucmVtb3ZlKEUuaW5kZXgpO2Zvcih2YXIgSiBpbiBFLmF0dHJpYnV0ZXMpYy5yZW1vdmUoRS5hdHRyaWJ1dGVzW0pdKTtHLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGcpO3YuZGVsZXRlKEcpO2lmKEo9ei5nZXQoRSkpYy5yZW1vdmUoSiksei5kZWxldGUoRSk7ZS5tZW1vcnkuZ2VvbWV0cmllcy0tfWZ1bmN0aW9uIHIoRSl7dmFyIEc9W10sSj1FLmluZGV4LFA9RS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKG51bGwhPT0KSil7dmFyIFI9Si5hcnJheTtKPUoudmVyc2lvbjtQPTA7Zm9yKHZhciBTPVIubGVuZ3RoO1A8UztQKz0zKXt2YXIgVj1SW1ArMF0sVz1SW1ArMV0saGE9UltQKzJdO0cucHVzaChWLFcsVyxoYSxoYSxWKX19ZWxzZSBmb3IoUj1QLmFycmF5LEo9UC52ZXJzaW9uLFA9MCxTPVIubGVuZ3RoLzMtMTtQPFM7UCs9MylWPVArMCxXPVArMSxoYT1QKzIsRy5wdXNoKFYsVyxXLGhhLGhhLFYpO0c9bmV3ICg2NTUzNTxFYShHKT9lYTpaKShHLDEpO0cudmVyc2lvbj1KO2MudXBkYXRlKEcsMzQ5NjMpOyhSPXouZ2V0KEUpKSYmYy5yZW1vdmUoUik7ei5zZXQoRSxHKX12YXIgdj1uZXcgV2Vha01hcCx6PW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24oRSxHKXt2YXIgSj12LmdldChHKTtpZihKKXJldHVybiBKO0cuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZyk7Ry5pc0J1ZmZlckdlb21ldHJ5P0o9RzpHLmlzR2VvbWV0cnkmJih2b2lkIDA9PT1HLl9idWZmZXJHZW9tZXRyeSYmKEcuX2J1ZmZlckdlb21ldHJ5PQoobmV3IHZhKS5zZXRGcm9tT2JqZWN0KEUpKSxKPUcuX2J1ZmZlckdlb21ldHJ5KTt2LnNldChHLEopO2UubWVtb3J5Lmdlb21ldHJpZXMrKztyZXR1cm4gSn0sdXBkYXRlOmZ1bmN0aW9uKEUpe3ZhciBHPUUuaW5kZXgsSj1FLmF0dHJpYnV0ZXM7bnVsbCE9PUcmJmMudXBkYXRlKEcsMzQ5NjMpO2Zvcih2YXIgUCBpbiBKKWMudXBkYXRlKEpbUF0sMzQ5NjIpO0U9RS5tb3JwaEF0dHJpYnV0ZXM7Zm9yKFAgaW4gRSl7Rz1FW1BdO0o9MDtmb3IodmFyIFI9Ry5sZW5ndGg7SjxSO0orKyljLnVwZGF0ZShHW0pdLDM0OTYyKX19LGdldFdpcmVmcmFtZUF0dHJpYnV0ZTpmdW5jdGlvbihFKXt2YXIgRz16LmdldChFKTtpZihHKXt2YXIgSj1FLmluZGV4O251bGwhPT1KJiZHLnZlcnNpb248Si52ZXJzaW9uJiZyKEUpfWVsc2UgcihFKTtyZXR1cm4gei5nZXQoRSl9fX1mdW5jdGlvbiB0ZyhhLGMsZSxnKXt2YXIgcix2LHo7dGhpcy5zZXRNb2RlPWZ1bmN0aW9uKEUpe3I9RX07dGhpcy5zZXRJbmRleD0KZnVuY3Rpb24oRSl7dj1FLnR5cGU7ej1FLmJ5dGVzUGVyRWxlbWVudH07dGhpcy5yZW5kZXI9ZnVuY3Rpb24oRSxHKXthLmRyYXdFbGVtZW50cyhyLEcsdixFKnopO2UudXBkYXRlKEcscil9O3RoaXMucmVuZGVySW5zdGFuY2VzPWZ1bmN0aW9uKEUsRyxKKXtpZihnLmlzV2ViR0wyKXt2YXIgUD1hO3ZhciBSPSJkcmF3RWxlbWVudHNJbnN0YW5jZWQifWVsc2UgaWYoUD1jLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpLFI9ImRyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFIixudWxsPT09UCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLiIpO3JldHVybn1QW1JdKHIsSix2LEcqeixFLm1heEluc3RhbmNlZENvdW50KTtlLnVwZGF0ZShKLHIsRS5tYXhJbnN0YW5jZWRDb3VudCl9fQpmdW5jdGlvbiBTaygpe3ZhciBhPXtmcmFtZTowLGNhbGxzOjAsdHJpYW5nbGVzOjAscG9pbnRzOjAsbGluZXM6MH07cmV0dXJue21lbW9yeTp7Z2VvbWV0cmllczowLHRleHR1cmVzOjB9LHJlbmRlcjphLHByb2dyYW1zOm51bGwsYXV0b1Jlc2V0OiEwLHJlc2V0OmZ1bmN0aW9uKCl7YS5mcmFtZSsrO2EuY2FsbHM9MDthLnRyaWFuZ2xlcz0wO2EucG9pbnRzPTA7YS5saW5lcz0wfSx1cGRhdGU6ZnVuY3Rpb24oYyxlLGcpe2c9Z3x8MTthLmNhbGxzKys7c3dpdGNoKGUpe2Nhc2UgNDphLnRyaWFuZ2xlcys9Yy8zKmc7YnJlYWs7Y2FzZSA1OmNhc2UgNjphLnRyaWFuZ2xlcys9ZyooYy0yKTticmVhaztjYXNlIDE6YS5saW5lcys9Yy8yKmc7YnJlYWs7Y2FzZSAzOmEubGluZXMrPWcqKGMtMSk7YnJlYWs7Y2FzZSAyOmEubGluZXMrPWcqYzticmVhaztjYXNlIDA6YS5wb2ludHMrPWcqYzticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMSW5mbzogVW5rbm93biBkcmF3IG1vZGU6IiwKZSl9fX19ZnVuY3Rpb24gVGsoYSxjKXtyZXR1cm4gTWF0aC5hYnMoY1sxXSktTWF0aC5hYnMoYVsxXSl9ZnVuY3Rpb24gVWsoYSl7dmFyIGM9e30sZT1uZXcgRmxvYXQzMkFycmF5KDgpO3JldHVybnt1cGRhdGU6ZnVuY3Rpb24oZyxyLHYseil7dmFyIEU9Zy5tb3JwaFRhcmdldEluZmx1ZW5jZXMsRz1FLmxlbmd0aDtnPWNbci5pZF07aWYodm9pZCAwPT09Zyl7Zz1bXTtmb3IodmFyIEo9MDtKPEc7SisrKWdbSl09W0osMF07Y1tyLmlkXT1nfXZhciBQPXYubW9ycGhUYXJnZXRzJiZyLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjt2PXYubW9ycGhOb3JtYWxzJiZyLm1vcnBoQXR0cmlidXRlcy5ub3JtYWw7Zm9yKEo9MDtKPEc7SisrKXt2YXIgUj1nW0pdOzAhPT1SWzFdJiYoUCYmci5yZW1vdmVBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0IitKKSx2JiZyLnJlbW92ZUF0dHJpYnV0ZSgibW9ycGhOb3JtYWwiK0opKX1mb3IoSj0wO0o8RztKKyspUj1nW0pdLFJbMF09SixSWzFdPUVbSl07Zy5zb3J0KFRrKTsKZm9yKEo9MDs4Pko7SisrKXtpZihSPWdbSl0paWYoRT1SWzBdLEc9UlsxXSl7UCYmci5hZGRBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0IitKLFBbRV0pO3YmJnIuYWRkQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrSix2W0VdKTtlW0pdPUc7Y29udGludWV9ZVtKXT0wfXouZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShhLCJtb3JwaFRhcmdldEluZmx1ZW5jZXMiLGUpfX19ZnVuY3Rpb24gVmsoYSxjKXt2YXIgZT17fTtyZXR1cm57dXBkYXRlOmZ1bmN0aW9uKGcpe3ZhciByPWMucmVuZGVyLmZyYW1lLHY9Zy5nZW9tZXRyeSx6PWEuZ2V0KGcsdik7ZVt6LmlkXSE9PXImJih2LmlzR2VvbWV0cnkmJnoudXBkYXRlRnJvbU9iamVjdChnKSxhLnVwZGF0ZSh6KSxlW3ouaWRdPXIpO3JldHVybiB6fSxkaXNwb3NlOmZ1bmN0aW9uKCl7ZT17fX19fWZ1bmN0aW9uIGNkKGEsYyxlLGcscix2LHosRSxHLEope2E9dm9pZCAwIT09YT9hOltdO2wuY2FsbCh0aGlzLGEsdm9pZCAwIT09Yz9jOjMwMSxlLGcscix2LAp2b2lkIDAhPT16P3o6MTAyMixFLEcsSik7dGhpcy5mbGlwWT0hMX1mdW5jdGlvbiByZShhLGMsZSxnKXtsLmNhbGwodGhpcyxudWxsKTt0aGlzLmltYWdlPXtkYXRhOmEsd2lkdGg6YyxoZWlnaHQ6ZSxkZXB0aDpnfTt0aGlzLm1pbkZpbHRlcj10aGlzLm1hZ0ZpbHRlcj0xMDAzO3RoaXMud3JhcFI9MTAwMTt0aGlzLmZsaXBZPXRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExfWZ1bmN0aW9uIHNlKGEsYyxlLGcpe2wuY2FsbCh0aGlzLG51bGwpO3RoaXMuaW1hZ2U9e2RhdGE6YSx3aWR0aDpjLGhlaWdodDplLGRlcHRoOmd9O3RoaXMubWluRmlsdGVyPXRoaXMubWFnRmlsdGVyPTEwMDM7dGhpcy53cmFwUj0xMDAxO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gdGUoYSxjLGUpe3ZhciBnPWFbMF07aWYoMD49Z3x8MDxnKXJldHVybiBhO3ZhciByPWMqZSx2PWNqW3JdO3ZvaWQgMD09PXYmJih2PW5ldyBGbG9hdDMyQXJyYXkociksY2pbcl09dik7aWYoMCE9PWMpZm9yKGcudG9BcnJheSh2LAowKSxnPTEscj0wO2chPT1jOysrZylyKz1lLGFbZ10udG9BcnJheSh2LHIpO3JldHVybiB2fWZ1bmN0aW9uIHNjKGEsYyl7aWYoYS5sZW5ndGghPT1jLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGU9MCxnPWEubGVuZ3RoO2U8ZztlKyspaWYoYVtlXSE9PWNbZV0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gbWMoYSxjKXtmb3IodmFyIGU9MCxnPWMubGVuZ3RoO2U8ZztlKyspYVtlXT1jW2VdfWZ1bmN0aW9uIGRqKGEsYyl7dmFyIGU9ZWpbY107dm9pZCAwPT09ZSYmKGU9bmV3IEludDMyQXJyYXkoYyksZWpbY109ZSk7Zm9yKHZhciBnPTA7ZyE9PWM7KytnKWVbZ109YS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7cmV0dXJuIGV9ZnVuY3Rpb24gV2soYSxjKXt2YXIgZT10aGlzLmNhY2hlO2VbMF0hPT1jJiYoYS51bmlmb3JtMWYodGhpcy5hZGRyLGMpLGVbMF09Yyl9ZnVuY3Rpb24gWGsoYSxjKXt2YXIgZT10aGlzLmNhY2hlO2lmKHZvaWQgMCE9PWMueCl7aWYoZVswXSE9PWMueHx8ZVsxXSE9PQpjLnkpYS51bmlmb3JtMmYodGhpcy5hZGRyLGMueCxjLnkpLGVbMF09Yy54LGVbMV09Yy55fWVsc2Ugc2MoZSxjKXx8KGEudW5pZm9ybTJmdih0aGlzLmFkZHIsYyksbWMoZSxjKSl9ZnVuY3Rpb24gWWsoYSxjKXt2YXIgZT10aGlzLmNhY2hlO2lmKHZvaWQgMCE9PWMueCl7aWYoZVswXSE9PWMueHx8ZVsxXSE9PWMueXx8ZVsyXSE9PWMueilhLnVuaWZvcm0zZih0aGlzLmFkZHIsYy54LGMueSxjLnopLGVbMF09Yy54LGVbMV09Yy55LGVbMl09Yy56fWVsc2UgaWYodm9pZCAwIT09Yy5yKXtpZihlWzBdIT09Yy5yfHxlWzFdIT09Yy5nfHxlWzJdIT09Yy5iKWEudW5pZm9ybTNmKHRoaXMuYWRkcixjLnIsYy5nLGMuYiksZVswXT1jLnIsZVsxXT1jLmcsZVsyXT1jLmJ9ZWxzZSBzYyhlLGMpfHwoYS51bmlmb3JtM2Z2KHRoaXMuYWRkcixjKSxtYyhlLGMpKX1mdW5jdGlvbiBaayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09Yy55fHwKZVsyXSE9PWMuenx8ZVszXSE9PWMudylhLnVuaWZvcm00Zih0aGlzLmFkZHIsYy54LGMueSxjLnosYy53KSxlWzBdPWMueCxlWzFdPWMueSxlWzJdPWMueixlWzNdPWMud31lbHNlIHNjKGUsYyl8fChhLnVuaWZvcm00ZnYodGhpcy5hZGRyLGMpLG1jKGUsYykpfWZ1bmN0aW9uICRrKGEsYyl7dmFyIGU9dGhpcy5jYWNoZSxnPWMuZWxlbWVudHM7dm9pZCAwPT09Zz9zYyhlLGMpfHwoYS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxjKSxtYyhlLGMpKTpzYyhlLGcpfHwoZmouc2V0KGcpLGEudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsZmopLG1jKGUsZykpfWZ1bmN0aW9uIGFsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZSxnPWMuZWxlbWVudHM7dm9pZCAwPT09Zz9zYyhlLGMpfHwoYS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxjKSxtYyhlLGMpKTpzYyhlLGcpfHwoZ2ouc2V0KGcpLGEudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsZ2opLG1jKGUsZykpfQpmdW5jdGlvbiBibChhLGMpe3ZhciBlPXRoaXMuY2FjaGUsZz1jLmVsZW1lbnRzO3ZvaWQgMD09PWc/c2MoZSxjKXx8KGEudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsYyksbWMoZSxjKSk6c2MoZSxnKXx8KGhqLnNldChnKSxhLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLGhqKSxtYyhlLGcpKX1mdW5jdGlvbiBjbChhLGMsZSl7dmFyIGc9dGhpcy5jYWNoZSxyPWUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO2dbMF0hPT1yJiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLHIpLGdbMF09cik7ZS5zYWZlU2V0VGV4dHVyZTJEKGN8fGlqLHIpfWZ1bmN0aW9uIGRsKGEsYyxlKXt2YXIgZz10aGlzLmNhY2hlLHI9ZS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7Z1swXSE9PXImJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsciksZ1swXT1yKTtlLnNldFRleHR1cmUyREFycmF5KGN8fGVsLHIpfWZ1bmN0aW9uIGZsKGEsYyxlKXt2YXIgZz10aGlzLmNhY2hlLHI9ZS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7CmdbMF0hPT1yJiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLHIpLGdbMF09cik7ZS5zZXRUZXh0dXJlM0QoY3x8Z2wscil9ZnVuY3Rpb24gaGwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUscj1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtnWzBdIT09ciYmKGEudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxnWzBdPXIpO2Uuc2FmZVNldFRleHR1cmVDdWJlKGN8fGpqLHIpfWZ1bmN0aW9uIGlsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTtlWzBdIT09YyYmKGEudW5pZm9ybTFpKHRoaXMuYWRkcixjKSxlWzBdPWMpfWZ1bmN0aW9uIGpsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTtzYyhlLGMpfHwoYS51bmlmb3JtMml2KHRoaXMuYWRkcixjKSxtYyhlLGMpKX1mdW5jdGlvbiBrbChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7c2MoZSxjKXx8KGEudW5pZm9ybTNpdih0aGlzLmFkZHIsYyksbWMoZSxjKSl9ZnVuY3Rpb24gbGwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO3NjKGUsYyl8fChhLnVuaWZvcm00aXYodGhpcy5hZGRyLApjKSxtYyhlLGMpKX1mdW5jdGlvbiBtbChhKXtzd2l0Y2goYSl7Y2FzZSA1MTI2OnJldHVybiBXaztjYXNlIDM1NjY0OnJldHVybiBYaztjYXNlIDM1NjY1OnJldHVybiBZaztjYXNlIDM1NjY2OnJldHVybiBaaztjYXNlIDM1Njc0OnJldHVybiAkaztjYXNlIDM1Njc1OnJldHVybiBhbDtjYXNlIDM1Njc2OnJldHVybiBibDtjYXNlIDM1Njc4OmNhc2UgMzYxOTg6cmV0dXJuIGNsO2Nhc2UgMzU2Nzk6cmV0dXJuIGZsO2Nhc2UgMzU2ODA6cmV0dXJuIGhsO2Nhc2UgMzYyODk6cmV0dXJuIGRsO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBpbDtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIGpsO2Nhc2UgMzU2Njg6Y2FzZSAzNTY3MjpyZXR1cm4ga2w7Y2FzZSAzNTY2OTpjYXNlIDM1NjczOnJldHVybiBsbH19ZnVuY3Rpb24gbmwoYSxjKXthLnVuaWZvcm0xZnYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIG9sKGEsYyl7YS51bmlmb3JtMWl2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBwbChhLApjKXthLnVuaWZvcm0yaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIHFsKGEsYyl7YS51bmlmb3JtM2l2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBybChhLGMpe2EudW5pZm9ybTRpdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gc2woYSxjKXtjPXRlKGMsdGhpcy5zaXplLDIpO2EudW5pZm9ybTJmdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gdGwoYSxjKXtjPXRlKGMsdGhpcy5zaXplLDMpO2EudW5pZm9ybTNmdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gdWwoYSxjKXtjPXRlKGMsdGhpcy5zaXplLDQpO2EudW5pZm9ybTRmdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gdmwoYSxjKXtjPXRlKGMsdGhpcy5zaXplLDQpO2EudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsYyl9ZnVuY3Rpb24gd2woYSxjKXtjPXRlKGMsdGhpcy5zaXplLDkpO2EudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsYyl9ZnVuY3Rpb24geGwoYSxjKXtjPXRlKGMsdGhpcy5zaXplLDE2KTthLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLAohMSxjKX1mdW5jdGlvbiB5bChhLGMsZSl7dmFyIGc9Yy5sZW5ndGgscj1kaihlLGcpO2EudW5pZm9ybTFpdih0aGlzLmFkZHIscik7Zm9yKGE9MDthIT09ZzsrK2EpZS5zYWZlU2V0VGV4dHVyZTJEKGNbYV18fGlqLHJbYV0pfWZ1bmN0aW9uIHpsKGEsYyxlKXt2YXIgZz1jLmxlbmd0aCxyPWRqKGUsZyk7YS51bmlmb3JtMWl2KHRoaXMuYWRkcixyKTtmb3IoYT0wO2EhPT1nOysrYSllLnNhZmVTZXRUZXh0dXJlQ3ViZShjW2FdfHxqaixyW2FdKX1mdW5jdGlvbiBBbChhKXtzd2l0Y2goYSl7Y2FzZSA1MTI2OnJldHVybiBubDtjYXNlIDM1NjY0OnJldHVybiBzbDtjYXNlIDM1NjY1OnJldHVybiB0bDtjYXNlIDM1NjY2OnJldHVybiB1bDtjYXNlIDM1Njc0OnJldHVybiB2bDtjYXNlIDM1Njc1OnJldHVybiB3bDtjYXNlIDM1Njc2OnJldHVybiB4bDtjYXNlIDM1Njc4OnJldHVybiB5bDtjYXNlIDM1NjgwOnJldHVybiB6bDtjYXNlIDUxMjQ6Y2FzZSAzNTY3MDpyZXR1cm4gb2w7Y2FzZSAzNTY2NzpjYXNlIDM1NjcxOnJldHVybiBwbDsKY2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBxbDtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIHJsfX1mdW5jdGlvbiBCbChhLGMsZSl7dGhpcy5pZD1hO3RoaXMuYWRkcj1lO3RoaXMuY2FjaGU9W107dGhpcy5zZXRWYWx1ZT1tbChjLnR5cGUpfWZ1bmN0aW9uIGtqKGEsYyxlKXt0aGlzLmlkPWE7dGhpcy5hZGRyPWU7dGhpcy5jYWNoZT1bXTt0aGlzLnNpemU9Yy5zaXplO3RoaXMuc2V0VmFsdWU9QWwoYy50eXBlKX1mdW5jdGlvbiBsaihhKXt0aGlzLmlkPWE7dGhpcy5zZXE9W107dGhpcy5tYXA9e319ZnVuY3Rpb24gbWooYSxjKXthLnNlcS5wdXNoKGMpO2EubWFwW2MuaWRdPWN9ZnVuY3Rpb24gQ2woYSxjLGUpe3ZhciBnPWEubmFtZSxyPWcubGVuZ3RoO2ZvcihMaC5sYXN0SW5kZXg9MDs7KXt2YXIgdj1MaC5leGVjKGcpLHo9TGgubGFzdEluZGV4LEU9dlsxXSxHPXZbM107Il0iPT09dlsyXSYmKEV8PTApO2lmKHZvaWQgMD09PUd8fCJbIj09PUcmJnorMj09PXIpe21qKGUsCnZvaWQgMD09PUc/bmV3IEJsKEUsYSxjKTpuZXcga2ooRSxhLGMpKTticmVha31lbHNlIHY9ZS5tYXBbRV0sdm9pZCAwPT09diYmKHY9bmV3IGxqKEUpLG1qKGUsdikpLGU9dn19ZnVuY3Rpb24gdWQoYSxjKXt0aGlzLnNlcT1bXTt0aGlzLm1hcD17fTtmb3IodmFyIGU9YS5nZXRQcm9ncmFtUGFyYW1ldGVyKGMsMzU3MTgpLGc9MDtnPGU7KytnKXt2YXIgcj1hLmdldEFjdGl2ZVVuaWZvcm0oYyxnKTtDbChyLGEuZ2V0VW5pZm9ybUxvY2F0aW9uKGMsci5uYW1lKSx0aGlzKX19ZnVuY3Rpb24gbmooYSxjLGUpe2M9YS5jcmVhdGVTaGFkZXIoYyk7YS5zaGFkZXJTb3VyY2UoYyxlKTthLmNvbXBpbGVTaGFkZXIoYyk7cmV0dXJuIGN9ZnVuY3Rpb24gRGwoYSl7YT1hLnNwbGl0KCJcbiIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY109YysxKyI6ICIrYVtjXTtyZXR1cm4gYS5qb2luKCJcbiIpfWZ1bmN0aW9uIG9qKGEpe3N3aXRjaChhKXtjYXNlIDNFMzpyZXR1cm5bIkxpbmVhciIsCiIoIHZhbHVlICkiXTtjYXNlIDMwMDE6cmV0dXJuWyJzUkdCIiwiKCB2YWx1ZSApIl07Y2FzZSAzMDAyOnJldHVyblsiUkdCRSIsIiggdmFsdWUgKSJdO2Nhc2UgMzAwNDpyZXR1cm5bIlJHQk0iLCIoIHZhbHVlLCA3LjAgKSJdO2Nhc2UgMzAwNTpyZXR1cm5bIlJHQk0iLCIoIHZhbHVlLCAxNi4wICkiXTtjYXNlIDMwMDY6cmV0dXJuWyJSR0JEIiwiKCB2YWx1ZSwgMjU2LjAgKSJdO2Nhc2UgMzAwNzpyZXR1cm5bIkdhbW1hIiwiKCB2YWx1ZSwgZmxvYXQoIEdBTU1BX0ZBQ1RPUiApICkiXTtjYXNlIDMwMDM6cmV0dXJuWyJMb2dMdXYiLCIoIHZhbHVlICkiXTtkZWZhdWx0OnRocm93IEVycm9yKCJ1bnN1cHBvcnRlZCBlbmNvZGluZzogIithKTt9fWZ1bmN0aW9uIHBqKGEsYyxlKXt2YXIgZz1hLmdldFNoYWRlclBhcmFtZXRlcihjLDM1NzEzKSxyPWEuZ2V0U2hhZGVySW5mb0xvZyhjKS50cmltKCk7cmV0dXJuIGcmJiIiPT09cj8iIjoiVEhSRUUuV2ViR0xTaGFkZXI6IGdsLmdldFNoYWRlckluZm9Mb2coKSAiKwplKyJcbiIrcitEbChhLmdldFNoYWRlclNvdXJjZShjKSl9ZnVuY3Rpb24gdWcoYSxjKXtjPW9qKGMpO3JldHVybiJ2ZWM0ICIrYSsiKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gIitjWzBdKyJUb0xpbmVhciIrY1sxXSsiOyB9In1mdW5jdGlvbiBFbChhLGMpe2M9b2ooYyk7cmV0dXJuInZlYzQgIithKyIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiBMaW5lYXJUbyIrY1swXStjWzFdKyI7IH0ifWZ1bmN0aW9uIEZsKGEsYyl7c3dpdGNoKGMpe2Nhc2UgMTpjPSJMaW5lYXIiO2JyZWFrO2Nhc2UgMjpjPSJSZWluaGFyZCI7YnJlYWs7Y2FzZSAzOmM9IlVuY2hhcnRlZDIiO2JyZWFrO2Nhc2UgNDpjPSJPcHRpbWl6ZWRDaW5lb24iO2JyZWFrO2Nhc2UgNTpjPSJBQ0VTRmlsbWljIjticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJ1bnN1cHBvcnRlZCB0b25lTWFwcGluZzogIitjKTt9cmV0dXJuInZlYzMgIithKyIoIHZlYzMgY29sb3IgKSB7IHJldHVybiAiK2MrIlRvbmVNYXBwaW5nKCBjb2xvciApOyB9In0KZnVuY3Rpb24gR2woYSxjLGUpe2E9YXx8e307cmV0dXJuW2EuZGVyaXZhdGl2ZXN8fGMuZW52TWFwQ3ViZVVWfHxjLmJ1bXBNYXB8fGMudGFuZ2VudFNwYWNlTm9ybWFsTWFwfHxjLmNsZWFyY29hdE5vcm1hbE1hcHx8Yy5mbGF0U2hhZGluZz8iI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFibGUiOiIiLChhLmZyYWdEZXB0aHx8Yy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyKSYmZS5nZXQoIkVYVF9mcmFnX2RlcHRoIik/IiNleHRlbnNpb24gR0xfRVhUX2ZyYWdfZGVwdGggOiBlbmFibGUiOiIiLGEuZHJhd0J1ZmZlcnMmJmUuZ2V0KCJXRUJHTF9kcmF3X2J1ZmZlcnMiKT8iI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZSI6IiIsKGEuc2hhZGVyVGV4dHVyZUxPRHx8Yy5lbnZNYXApJiZlLmdldCgiRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCIpPyIjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiBlbmFibGUiOiIiXS5maWx0ZXIodWYpLmpvaW4oIlxuIil9CmZ1bmN0aW9uIEhsKGEpe3ZhciBjPVtdLGU7Zm9yKGUgaW4gYSl7dmFyIGc9YVtlXTshMSE9PWcmJmMucHVzaCgiI2RlZmluZSAiK2UrIiAiK2cpfXJldHVybiBjLmpvaW4oIlxuIil9ZnVuY3Rpb24gSWwoYSxjKXtmb3IodmFyIGU9e30sZz1hLmdldFByb2dyYW1QYXJhbWV0ZXIoYywzNTcyMSkscj0wO3I8ZztyKyspe3ZhciB2PWEuZ2V0QWN0aXZlQXR0cmliKGMscikubmFtZTtlW3ZdPWEuZ2V0QXR0cmliTG9jYXRpb24oYyx2KX1yZXR1cm4gZX1mdW5jdGlvbiB1ZihhKXtyZXR1cm4iIiE9PWF9ZnVuY3Rpb24gcWooYSxjKXtyZXR1cm4gYS5yZXBsYWNlKC9OVU1fRElSX0xJR0hUUy9nLGMubnVtRGlyTGlnaHRzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVFMvZyxjLm51bVNwb3RMaWdodHMpLnJlcGxhY2UoL05VTV9SRUNUX0FSRUFfTElHSFRTL2csYy5udW1SZWN0QXJlYUxpZ2h0cykucmVwbGFjZSgvTlVNX1BPSU5UX0xJR0hUUy9nLGMubnVtUG9pbnRMaWdodHMpLnJlcGxhY2UoL05VTV9IRU1JX0xJR0hUUy9nLApjLm51bUhlbWlMaWdodHMpLnJlcGxhY2UoL05VTV9ESVJfTElHSFRfU0hBRE9XUy9nLGMubnVtRGlyTGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTL2csYy5udW1TcG90TGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRfU0hBRE9XUy9nLGMubnVtUG9pbnRMaWdodFNoYWRvd3MpfWZ1bmN0aW9uIHJqKGEsYyl7cmV0dXJuIGEucmVwbGFjZSgvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLGMubnVtQ2xpcHBpbmdQbGFuZXMpLnJlcGxhY2UoL1VOSU9OX0NMSVBQSU5HX1BMQU5FUy9nLGMubnVtQ2xpcHBpbmdQbGFuZXMtYy5udW1DbGlwSW50ZXJzZWN0aW9uKX1mdW5jdGlvbiBNaChhKXtyZXR1cm4gYS5yZXBsYWNlKC9eWyBcdF0qI2luY2x1ZGUgKzwoW1x3XGQuL10rKT4vZ20sZnVuY3Rpb24oYyxlKXtjPXJiW2VdO2lmKHZvaWQgMD09PWMpdGhyb3cgRXJyb3IoIkNhbiBub3QgcmVzb2x2ZSAjaW5jbHVkZSBceDNjIitlKyJceDNlIik7cmV0dXJuIE1oKGMpfSl9CmZ1bmN0aW9uIHNqKGEpe3JldHVybiBhLnJlcGxhY2UoLyNwcmFnbWEgdW5yb2xsX2xvb3BbXHNdKz9mb3IgXCggaW50IGkgPSAoXGQrKTsgaSA8IChcZCspOyBpIFwrXCsgXCkgXHsoW1xzXFNdKz8pKD89XH0pXH0vZyxmdW5jdGlvbihjLGUsZyxyKXtjPSIiO2ZvcihlPXBhcnNlSW50KGUpO2U8cGFyc2VJbnQoZyk7ZSsrKWMrPXIucmVwbGFjZSgvXFsgaSBcXS9nLCJbICIrZSsiIF0iKS5yZXBsYWNlKC9VTlJPTExFRF9MT09QX0lOREVYL2csZSk7cmV0dXJuIGN9KX1mdW5jdGlvbiBKbChhLGMsZSxnLHIsdix6KXt2YXIgRT1hLmdldENvbnRleHQoKSxHPWcuZGVmaW5lcyxKPXIudmVydGV4U2hhZGVyLFA9ci5mcmFnbWVudFNoYWRlcixSPSJTSEFET1dNQVBfVFlQRV9CQVNJQyI7MT09PXYuc2hhZG93TWFwVHlwZT9SPSJTSEFET1dNQVBfVFlQRV9QQ0YiOjI9PT12LnNoYWRvd01hcFR5cGU/Uj0iU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQiOjM9PT12LnNoYWRvd01hcFR5cGUmJihSPQoiU0hBRE9XTUFQX1RZUEVfVlNNIik7dmFyIFM9IkVOVk1BUF9UWVBFX0NVQkUiLFY9IkVOVk1BUF9NT0RFX1JFRkxFQ1RJT04iLFc9IkVOVk1BUF9CTEVORElOR19NVUxUSVBMWSI7aWYodi5lbnZNYXApe3N3aXRjaChnLmVudk1hcC5tYXBwaW5nKXtjYXNlIDMwMTpjYXNlIDMwMjpTPSJFTlZNQVBfVFlQRV9DVUJFIjticmVhaztjYXNlIDMwNjpjYXNlIDMwNzpTPSJFTlZNQVBfVFlQRV9DVUJFX1VWIjticmVhaztjYXNlIDMwMzpjYXNlIDMwNDpTPSJFTlZNQVBfVFlQRV9FUVVJUkVDIjticmVhaztjYXNlIDMwNTpTPSJFTlZNQVBfVFlQRV9TUEhFUkUifXN3aXRjaChnLmVudk1hcC5tYXBwaW5nKXtjYXNlIDMwMjpjYXNlIDMwNDpWPSJFTlZNQVBfTU9ERV9SRUZSQUNUSU9OIn1zd2l0Y2goZy5jb21iaW5lKXtjYXNlIDA6Vz0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjticmVhaztjYXNlIDE6Vz0iRU5WTUFQX0JMRU5ESU5HX01JWCI7YnJlYWs7Y2FzZSAyOlc9IkVOVk1BUF9CTEVORElOR19BREQifX12YXIgaGE9CjA8YS5nYW1tYUZhY3Rvcj9hLmdhbW1hRmFjdG9yOjEsZmE9ei5pc1dlYkdMMj8iIjpHbChnLmV4dGVuc2lvbnMsdixjKSxyYT1IbChHKSxwYT1FLmNyZWF0ZVByb2dyYW0oKTtnLmlzUmF3U2hhZGVyTWF0ZXJpYWw/KEc9W3JhXS5maWx0ZXIodWYpLmpvaW4oIlxuIiksMDxHLmxlbmd0aCYmKEcrPSJcbiIpLGM9W2ZhLHJhXS5maWx0ZXIodWYpLmpvaW4oIlxuIiksMDxjLmxlbmd0aCYmKGMrPSJcbiIpKTooRz1bInByZWNpc2lvbiAiK3YucHJlY2lzaW9uKyIgZmxvYXQ7IiwicHJlY2lzaW9uICIrdi5wcmVjaXNpb24rIiBpbnQ7IiwiaGlnaHAiPT09di5wcmVjaXNpb24/IiNkZWZpbmUgSElHSF9QUkVDSVNJT04iOiIiLCIjZGVmaW5lIFNIQURFUl9OQU1FICIrci5uYW1lLHJhLHYuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBWRVJURVhfVEVYVFVSRVMiOiIiLCIjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAiK2hhLCIjZGVmaW5lIE1BWF9CT05FUyAiK3YubWF4Qm9uZXMsdi51c2VGb2cmJgp2LmZvZz8iI2RlZmluZSBVU0VfRk9HIjoiIix2LnVzZUZvZyYmdi5mb2dFeHAyPyIjZGVmaW5lIEZPR19FWFAyIjoiIix2Lm1hcD8iI2RlZmluZSBVU0VfTUFQIjoiIix2LmVudk1hcD8iI2RlZmluZSBVU0VfRU5WTUFQIjoiIix2LmVudk1hcD8iI2RlZmluZSAiK1Y6IiIsdi5saWdodE1hcD8iI2RlZmluZSBVU0VfTElHSFRNQVAiOiIiLHYuYW9NYXA/IiNkZWZpbmUgVVNFX0FPTUFQIjoiIix2LmVtaXNzaXZlTWFwPyIjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCI6IiIsdi5idW1wTWFwPyIjZGVmaW5lIFVTRV9CVU1QTUFQIjoiIix2Lm5vcm1hbE1hcD8iI2RlZmluZSBVU0VfTk9STUFMTUFQIjoiIix2Lm5vcm1hbE1hcCYmdi5vYmplY3RTcGFjZU5vcm1hbE1hcD8iI2RlZmluZSBPQkpFQ1RTUEFDRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2LnRhbmdlbnRTcGFjZU5vcm1hbE1hcD8iI2RlZmluZSBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIjoiIix2LmNsZWFyY29hdE5vcm1hbE1hcD8KIiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAiOiIiLHYuZGlzcGxhY2VtZW50TWFwJiZ2LnN1cHBvcnRzVmVydGV4VGV4dHVyZXM/IiNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCI6IiIsdi5zcGVjdWxhck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAiOiIiLHYucm91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAiOiIiLHYubWV0YWxuZXNzTWFwPyIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiOiIiLHYuYWxwaGFNYXA/IiNkZWZpbmUgVVNFX0FMUEhBTUFQIjoiIix2LnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoiIix2LnZlcnRleENvbG9ycz8iI2RlZmluZSBVU0VfQ09MT1IiOiIiLHYudmVydGV4VXZzPyIjZGVmaW5lIFVTRV9VViI6IiIsdi5mbGF0U2hhZGluZz8iI2RlZmluZSBGTEFUX1NIQURFRCI6IiIsdi5za2lubmluZz8iI2RlZmluZSBVU0VfU0tJTk5JTkciOiIiLHYudXNlVmVydGV4VGV4dHVyZT8iI2RlZmluZSBCT05FX1RFWFRVUkUiOgoiIix2Lm1vcnBoVGFyZ2V0cz8iI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTIjoiIix2Lm1vcnBoTm9ybWFscyYmITE9PT12LmZsYXRTaGFkaW5nPyIjZGVmaW5lIFVTRV9NT1JQSE5PUk1BTFMiOiIiLHYuZG91YmxlU2lkZWQ/IiNkZWZpbmUgRE9VQkxFX1NJREVEIjoiIix2LmZsaXBTaWRlZD8iI2RlZmluZSBGTElQX1NJREVEIjoiIix2LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgVVNFX1NIQURPV01BUCI6IiIsdi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lICIrUjoiIix2LnNpemVBdHRlbnVhdGlvbj8iI2RlZmluZSBVU0VfU0laRUFUVEVOVUFUSU9OIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJih6LmlzV2ViR0wyfHxjLmdldCgiRVhUX2ZyYWdfZGVwdGgiKSk/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCI6IiIsInVuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4OyIsCiJ1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OyIsInVuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsiLCJhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsiLCJhdHRyaWJ1dGUgdmVjMyBub3JtYWw7IiwiYXR0cmlidXRlIHZlYzIgdXY7IiwiI2lmZGVmIFVTRV9UQU5HRU5UIiwiXHRhdHRyaWJ1dGUgdmVjNCB0YW5nZW50OyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfQ09MT1IiLCJcdGF0dHJpYnV0ZSB2ZWMzIGNvbG9yOyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTIiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDA7IiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDE7IiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7IiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDM7IiwiXHQjaWZkZWYgVVNFX01PUlBITk9STUFMUyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDA7IiwKIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDE7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMjsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwzOyIsIlx0I2Vsc2UiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ0OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDU7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NjsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ3OyIsIlx0I2VuZGlmIiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9TS0lOTklORyIsIlx0YXR0cmlidXRlIHZlYzQgc2tpbkluZGV4OyIsIlx0YXR0cmlidXRlIHZlYzQgc2tpbldlaWdodDsiLCIjZW5kaWYiLCJcbiJdLmZpbHRlcih1Zikuam9pbigiXG4iKSxjPVtmYSwicHJlY2lzaW9uICIrdi5wcmVjaXNpb24rIiBmbG9hdDsiLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGludDsiLCJoaWdocCI9PT12LnByZWNpc2lvbj8iI2RlZmluZSBISUdIX1BSRUNJU0lPTiI6CiIiLCIjZGVmaW5lIFNIQURFUl9OQU1FICIrci5uYW1lLHJhLHYuYWxwaGFUZXN0PyIjZGVmaW5lIEFMUEhBVEVTVCAiK3YuYWxwaGFUZXN0Kyh2LmFscGhhVGVzdCUxPyIiOiIuMCIpOiIiLCIjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAiK2hhLHYudXNlRm9nJiZ2LmZvZz8iI2RlZmluZSBVU0VfRk9HIjoiIix2LnVzZUZvZyYmdi5mb2dFeHAyPyIjZGVmaW5lIEZPR19FWFAyIjoiIix2Lm1hcD8iI2RlZmluZSBVU0VfTUFQIjoiIix2Lm1hdGNhcD8iI2RlZmluZSBVU0VfTUFUQ0FQIjoiIix2LmVudk1hcD8iI2RlZmluZSBVU0VfRU5WTUFQIjoiIix2LmVudk1hcD8iI2RlZmluZSAiK1M6IiIsdi5lbnZNYXA/IiNkZWZpbmUgIitWOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrVzoiIix2LmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsdi5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLHYuZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIix2LmJ1bXBNYXA/CiIjZGVmaW5lIFVTRV9CVU1QTUFQIjoiIix2Lm5vcm1hbE1hcD8iI2RlZmluZSBVU0VfTk9STUFMTUFQIjoiIix2Lm5vcm1hbE1hcCYmdi5vYmplY3RTcGFjZU5vcm1hbE1hcD8iI2RlZmluZSBPQkpFQ1RTUEFDRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2LnRhbmdlbnRTcGFjZU5vcm1hbE1hcD8iI2RlZmluZSBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIjoiIix2LmNsZWFyY29hdE5vcm1hbE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsdi5zcGVjdWxhck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAiOiIiLHYucm91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAiOiIiLHYubWV0YWxuZXNzTWFwPyIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiOiIiLHYuYWxwaGFNYXA/IiNkZWZpbmUgVVNFX0FMUEhBTUFQIjoiIix2LnNoZWVuPyIjZGVmaW5lIFVTRV9TSEVFTiI6IiIsdi52ZXJ0ZXhUYW5nZW50cz8iI2RlZmluZSBVU0VfVEFOR0VOVCI6CiIiLHYudmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsdi52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIix2LmdyYWRpZW50TWFwPyIjZGVmaW5lIFVTRV9HUkFESUVOVE1BUCI6IiIsdi5mbGF0U2hhZGluZz8iI2RlZmluZSBGTEFUX1NIQURFRCI6IiIsdi5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLHYuZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIix2LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitSOiIiLHYucHJlbXVsdGlwbGllZEFscGhhPyIjZGVmaW5lIFBSRU1VTFRJUExJRURfQUxQSEEiOiIiLHYucGh5c2ljYWxseUNvcnJlY3RMaWdodHM/IiNkZWZpbmUgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyI6IiIsdi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRiI6IiIsdi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiYKKHouaXNXZWJHTDJ8fGMuZ2V0KCJFWFRfZnJhZ19kZXB0aCIpKT8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUIjoiIiwoZy5leHRlbnNpb25zJiZnLmV4dGVuc2lvbnMuc2hhZGVyVGV4dHVyZUxPRHx8di5lbnZNYXApJiYoei5pc1dlYkdMMnx8Yy5nZXQoIkVYVF9zaGFkZXJfdGV4dHVyZV9sb2QiKSk/IiNkZWZpbmUgVEVYVFVSRV9MT0RfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsMCE9PXYudG9uZU1hcHBpbmc/IiNkZWZpbmUgVE9ORV9NQVBQSU5HIjoiIiwwIT09di50b25lTWFwcGluZz9yYi50b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OiIiLDAhPT12LnRvbmVNYXBwaW5nP0ZsKCJ0b25lTWFwcGluZyIsdi50b25lTWFwcGluZyk6IiIsdi5kaXRoZXJpbmc/IiNkZWZpbmUgRElUSEVSSU5HIjoiIix2Lm91dHB1dEVuY29kaW5nfHx2Lm1hcEVuY29kaW5nfHx2Lm1hdGNhcEVuY29kaW5nfHx2LmVudk1hcEVuY29kaW5nfHwKdi5lbWlzc2l2ZU1hcEVuY29kaW5nP3JiLmVuY29kaW5nc19wYXJzX2ZyYWdtZW50OiIiLHYubWFwRW5jb2Rpbmc/dWcoIm1hcFRleGVsVG9MaW5lYXIiLHYubWFwRW5jb2RpbmcpOiIiLHYubWF0Y2FwRW5jb2Rpbmc/dWcoIm1hdGNhcFRleGVsVG9MaW5lYXIiLHYubWF0Y2FwRW5jb2RpbmcpOiIiLHYuZW52TWFwRW5jb2Rpbmc/dWcoImVudk1hcFRleGVsVG9MaW5lYXIiLHYuZW52TWFwRW5jb2RpbmcpOiIiLHYuZW1pc3NpdmVNYXBFbmNvZGluZz91ZygiZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyIix2LmVtaXNzaXZlTWFwRW5jb2RpbmcpOiIiLHYub3V0cHV0RW5jb2Rpbmc/RWwoImxpbmVhclRvT3V0cHV0VGV4ZWwiLHYub3V0cHV0RW5jb2RpbmcpOiIiLHYuZGVwdGhQYWNraW5nPyIjZGVmaW5lIERFUFRIX1BBQ0tJTkcgIitnLmRlcHRoUGFja2luZzoiIiwiXG4iXS5maWx0ZXIodWYpLmpvaW4oIlxuIikpO0o9TWgoSik7Sj1xaihKLHYpO0o9cmooSix2KTtQPU1oKFApO1A9cWooUCwKdik7UD1yaihQLHYpO0o9c2ooSik7UD1zaihQKTt6LmlzV2ViR0wyJiYhZy5pc1Jhd1NoYWRlck1hdGVyaWFsJiYoej0hMSxSPS9eXHMqI3ZlcnNpb25ccyszMDBccytlc1xzKlxuLyxnLmlzU2hhZGVyTWF0ZXJpYWwmJm51bGwhPT1KLm1hdGNoKFIpJiZudWxsIT09UC5tYXRjaChSKSYmKHo9ITAsSj1KLnJlcGxhY2UoUiwiIiksUD1QLnJlcGxhY2UoUiwiIikpLEc9IiN2ZXJzaW9uIDMwMCBlc1xuXG4jZGVmaW5lIGF0dHJpYnV0ZSBpblxuI2RlZmluZSB2YXJ5aW5nIG91dFxuI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZVxuIitHLGM9WyIjdmVyc2lvbiAzMDAgZXNcblxuI2RlZmluZSB2YXJ5aW5nIGluIix6PyIiOiJvdXQgaGlnaHAgdmVjNCBwY19mcmFnQ29sb3I7Iix6PyIiOiIjZGVmaW5lIGdsX0ZyYWdDb2xvciBwY19mcmFnQ29sb3IiLCIjZGVmaW5lIGdsX0ZyYWdEZXB0aEVYVCBnbF9GcmFnRGVwdGhcbiNkZWZpbmUgdGV4dHVyZTJEIHRleHR1cmVcbiNkZWZpbmUgdGV4dHVyZUN1YmUgdGV4dHVyZVxuI2RlZmluZSB0ZXh0dXJlMkRQcm9qIHRleHR1cmVQcm9qXG4jZGVmaW5lIHRleHR1cmUyRExvZEVYVCB0ZXh0dXJlTG9kXG4jZGVmaW5lIHRleHR1cmUyRFByb2pMb2RFWFQgdGV4dHVyZVByb2pMb2RcbiNkZWZpbmUgdGV4dHVyZUN1YmVMb2RFWFQgdGV4dHVyZUxvZFxuI2RlZmluZSB0ZXh0dXJlMkRHcmFkRVhUIHRleHR1cmVHcmFkXG4jZGVmaW5lIHRleHR1cmUyRFByb2pHcmFkRVhUIHRleHR1cmVQcm9qR3JhZFxuI2RlZmluZSB0ZXh0dXJlQ3ViZUdyYWRFWFQgdGV4dHVyZUdyYWQiXS5qb2luKCJcbiIpKwoiXG4iK2MpO1A9YytQO0o9bmooRSwzNTYzMyxHK0opO1A9bmooRSwzNTYzMixQKTtFLmF0dGFjaFNoYWRlcihwYSxKKTtFLmF0dGFjaFNoYWRlcihwYSxQKTt2b2lkIDAhPT1nLmluZGV4MEF0dHJpYnV0ZU5hbWU/RS5iaW5kQXR0cmliTG9jYXRpb24ocGEsMCxnLmluZGV4MEF0dHJpYnV0ZU5hbWUpOiEwPT09di5tb3JwaFRhcmdldHMmJkUuYmluZEF0dHJpYkxvY2F0aW9uKHBhLDAsInBvc2l0aW9uIik7RS5saW5rUHJvZ3JhbShwYSk7aWYoYS5kZWJ1Zy5jaGVja1NoYWRlckVycm9ycyl7YT1FLmdldFByb2dyYW1JbmZvTG9nKHBhKS50cmltKCk7dj1FLmdldFNoYWRlckluZm9Mb2coSikudHJpbSgpO3o9RS5nZXRTaGFkZXJJbmZvTG9nKFApLnRyaW0oKTtTPVI9ITA7aWYoITE9PT1FLmdldFByb2dyYW1QYXJhbWV0ZXIocGEsMzU3MTQpKVI9ITEsVj1waihFLEosInZlcnRleCIpLFc9cGooRSxQLCJmcmFnbWVudCIpLGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUHJvZ3JhbTogc2hhZGVyIGVycm9yOiAiLApFLmdldEVycm9yKCksIjM1NzE1IixFLmdldFByb2dyYW1QYXJhbWV0ZXIocGEsMzU3MTUpLCJnbC5nZXRQcm9ncmFtSW5mb0xvZyIsYSxWLFcpO2Vsc2UgaWYoIiIhPT1hKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpIixhKTtlbHNlIGlmKCIiPT09dnx8IiI9PT16KVM9ITE7UyYmKHRoaXMuZGlhZ25vc3RpY3M9e3J1bm5hYmxlOlIsbWF0ZXJpYWw6Zyxwcm9ncmFtTG9nOmEsdmVydGV4U2hhZGVyOntsb2c6dixwcmVmaXg6R30sZnJhZ21lbnRTaGFkZXI6e2xvZzp6LHByZWZpeDpjfX0pfUUuZGVsZXRlU2hhZGVyKEopO0UuZGVsZXRlU2hhZGVyKFApO3ZhciBxYTt0aGlzLmdldFVuaWZvcm1zPWZ1bmN0aW9uKCl7dm9pZCAwPT09cWEmJihxYT1uZXcgdWQoRSxwYSkpO3JldHVybiBxYX07dmFyIHVhO3RoaXMuZ2V0QXR0cmlidXRlcz1mdW5jdGlvbigpe3ZvaWQgMD09PXVhJiYodWE9SWwoRSxwYSkpO3JldHVybiB1YX07dGhpcy5kZXN0cm95PQpmdW5jdGlvbigpe0UuZGVsZXRlUHJvZ3JhbShwYSk7dGhpcy5wcm9ncmFtPXZvaWQgMH07dGhpcy5uYW1lPXIubmFtZTt0aGlzLmlkPUtsKys7dGhpcy5jb2RlPWU7dGhpcy51c2VkVGltZXM9MTt0aGlzLnByb2dyYW09cGE7dGhpcy52ZXJ0ZXhTaGFkZXI9Sjt0aGlzLmZyYWdtZW50U2hhZGVyPVA7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gTGwoYSxjLGUpe2Z1bmN0aW9uIGcoRyl7Rz1HLnNrZWxldG9uLmJvbmVzO2lmKGUuZmxvYXRWZXJ0ZXhUZXh0dXJlcylyZXR1cm4gMTAyNDt2YXIgSj1NYXRoLm1pbihNYXRoLmZsb29yKChlLm1heFZlcnRleFVuaWZvcm1zLTIwKS80KSxHLmxlbmd0aCk7cmV0dXJuIEo8Ry5sZW5ndGg/KGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICIrRy5sZW5ndGgrIiBib25lcy4gVGhpcyBHUFUgc3VwcG9ydHMgIitKKyIuIiksMCk6Sn1mdW5jdGlvbiByKEcsSil7aWYoRylHLmlzVGV4dHVyZT9QPUcuZW5jb2Rpbmc6Ry5pc1dlYkdMUmVuZGVyVGFyZ2V0JiYKKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtcy5nZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLiIpLFA9Ry50ZXh0dXJlLmVuY29kaW5nKTtlbHNlIHZhciBQPTNFMzszRTM9PT1QJiZKJiYoUD0zMDA3KTtyZXR1cm4gUH12YXIgdj1bXSx6PXtNZXNoRGVwdGhNYXRlcmlhbDoiZGVwdGgiLE1lc2hEaXN0YW5jZU1hdGVyaWFsOiJkaXN0YW5jZVJHQkEiLE1lc2hOb3JtYWxNYXRlcmlhbDoibm9ybWFsIixNZXNoQmFzaWNNYXRlcmlhbDoiYmFzaWMiLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ImxhbWJlcnQiLE1lc2hQaG9uZ01hdGVyaWFsOiJwaG9uZyIsTWVzaFRvb25NYXRlcmlhbDoicGhvbmciLE1lc2hTdGFuZGFyZE1hdGVyaWFsOiJwaHlzaWNhbCIsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoTWF0Y2FwTWF0ZXJpYWw6Im1hdGNhcCIsCkxpbmVCYXNpY01hdGVyaWFsOiJiYXNpYyIsTGluZURhc2hlZE1hdGVyaWFsOiJkYXNoZWQiLFBvaW50c01hdGVyaWFsOiJwb2ludHMiLFNoYWRvd01hdGVyaWFsOiJzaGFkb3ciLFNwcml0ZU1hdGVyaWFsOiJzcHJpdGUifSxFPSJwcmVjaXNpb24gc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyBtYXAgbWFwRW5jb2RpbmcgbWF0Y2FwIG1hdGNhcEVuY29kaW5nIGVudk1hcCBlbnZNYXBNb2RlIGVudk1hcEVuY29kaW5nIGxpZ2h0TWFwIGFvTWFwIGVtaXNzaXZlTWFwIGVtaXNzaXZlTWFwRW5jb2RpbmcgYnVtcE1hcCBub3JtYWxNYXAgb2JqZWN0U3BhY2VOb3JtYWxNYXAgdGFuZ2VudFNwYWNlTm9ybWFsTWFwIGNsZWFyY29hdE5vcm1hbE1hcCBkaXNwbGFjZW1lbnRNYXAgc3BlY3VsYXJNYXAgcm91Z2huZXNzTWFwIG1ldGFsbmVzc01hcCBncmFkaWVudE1hcCBhbHBoYU1hcCBjb21iaW5lIHZlcnRleENvbG9ycyB2ZXJ0ZXhUYW5nZW50cyBmb2cgdXNlRm9nIGZvZ0V4cDIgZmxhdFNoYWRpbmcgc2l6ZUF0dGVudWF0aW9uIGxvZ2FyaXRobWljRGVwdGhCdWZmZXIgc2tpbm5pbmcgbWF4Qm9uZXMgdXNlVmVydGV4VGV4dHVyZSBtb3JwaFRhcmdldHMgbW9ycGhOb3JtYWxzIG1heE1vcnBoVGFyZ2V0cyBtYXhNb3JwaE5vcm1hbHMgcHJlbXVsdGlwbGllZEFscGhhIG51bURpckxpZ2h0cyBudW1Qb2ludExpZ2h0cyBudW1TcG90TGlnaHRzIG51bUhlbWlMaWdodHMgbnVtUmVjdEFyZWFMaWdodHMgc2hhZG93TWFwRW5hYmxlZCBzaGFkb3dNYXBUeXBlIHRvbmVNYXBwaW5nIHBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzIGFscGhhVGVzdCBkb3VibGVTaWRlZCBmbGlwU2lkZWQgbnVtQ2xpcHBpbmdQbGFuZXMgbnVtQ2xpcEludGVyc2VjdGlvbiBkZXB0aFBhY2tpbmcgZGl0aGVyaW5nIHNoZWVuIi5zcGxpdCgiICIpOwp0aGlzLmdldFBhcmFtZXRlcnM9ZnVuY3Rpb24oRyxKLFAsUixTLFYsVyl7dmFyIGhhPXpbRy50eXBlXSxmYT1XLmlzU2tpbm5lZE1lc2g/ZyhXKTowLHJhPWUucHJlY2lzaW9uO251bGwhPT1HLnByZWNpc2lvbiYmKHJhPWUuZ2V0TWF4UHJlY2lzaW9uKEcucHJlY2lzaW9uKSxyYSE9PUcucHJlY2lzaW9uJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbS5nZXRQYXJhbWV0ZXJzOiIsRy5wcmVjaXNpb24sIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIixyYSwiaW5zdGVhZC4iKSk7dmFyIHBhPWEuZ2V0UmVuZGVyVGFyZ2V0KCk7cmV0dXJue3NoYWRlcklEOmhhLHByZWNpc2lvbjpyYSxzdXBwb3J0c1ZlcnRleFRleHR1cmVzOmUudmVydGV4VGV4dHVyZXMsb3V0cHV0RW5jb2Rpbmc6cihwYT9wYS50ZXh0dXJlOm51bGwsYS5nYW1tYU91dHB1dCksbWFwOiEhRy5tYXAsbWFwRW5jb2Rpbmc6cihHLm1hcCxhLmdhbW1hSW5wdXQpLG1hdGNhcDohIUcubWF0Y2FwLG1hdGNhcEVuY29kaW5nOnIoRy5tYXRjYXAsCmEuZ2FtbWFJbnB1dCksZW52TWFwOiEhRy5lbnZNYXAsZW52TWFwTW9kZTpHLmVudk1hcCYmRy5lbnZNYXAubWFwcGluZyxlbnZNYXBFbmNvZGluZzpyKEcuZW52TWFwLGEuZ2FtbWFJbnB1dCksZW52TWFwQ3ViZVVWOiEhRy5lbnZNYXAmJigzMDY9PT1HLmVudk1hcC5tYXBwaW5nfHwzMDc9PT1HLmVudk1hcC5tYXBwaW5nKSxsaWdodE1hcDohIUcubGlnaHRNYXAsYW9NYXA6ISFHLmFvTWFwLGVtaXNzaXZlTWFwOiEhRy5lbWlzc2l2ZU1hcCxlbWlzc2l2ZU1hcEVuY29kaW5nOnIoRy5lbWlzc2l2ZU1hcCxhLmdhbW1hSW5wdXQpLGJ1bXBNYXA6ISFHLmJ1bXBNYXAsbm9ybWFsTWFwOiEhRy5ub3JtYWxNYXAsb2JqZWN0U3BhY2VOb3JtYWxNYXA6MT09PUcubm9ybWFsTWFwVHlwZSx0YW5nZW50U3BhY2VOb3JtYWxNYXA6MD09PUcubm9ybWFsTWFwVHlwZSxjbGVhcmNvYXROb3JtYWxNYXA6ISFHLmNsZWFyY29hdE5vcm1hbE1hcCxkaXNwbGFjZW1lbnRNYXA6ISFHLmRpc3BsYWNlbWVudE1hcCwKcm91Z2huZXNzTWFwOiEhRy5yb3VnaG5lc3NNYXAsbWV0YWxuZXNzTWFwOiEhRy5tZXRhbG5lc3NNYXAsc3BlY3VsYXJNYXA6ISFHLnNwZWN1bGFyTWFwLGFscGhhTWFwOiEhRy5hbHBoYU1hcCxncmFkaWVudE1hcDohIUcuZ3JhZGllbnRNYXAsc2hlZW46ISFHLnNoZWVuLGNvbWJpbmU6Ry5jb21iaW5lLHZlcnRleFRhbmdlbnRzOkcubm9ybWFsTWFwJiZHLnZlcnRleFRhbmdlbnRzLHZlcnRleENvbG9yczpHLnZlcnRleENvbG9ycyx2ZXJ0ZXhVdnM6ISFHLm1hcHx8ISFHLmJ1bXBNYXB8fCEhRy5ub3JtYWxNYXB8fCEhRy5zcGVjdWxhck1hcHx8ISFHLmFscGhhTWFwfHwhIUcuZW1pc3NpdmVNYXB8fCEhRy5yb3VnaG5lc3NNYXB8fCEhRy5tZXRhbG5lc3NNYXB8fCEhRy5jbGVhcmNvYXROb3JtYWxNYXAsZm9nOiEhUix1c2VGb2c6Ry5mb2csZm9nRXhwMjpSJiZSLmlzRm9nRXhwMixmbGF0U2hhZGluZzpHLmZsYXRTaGFkaW5nLHNpemVBdHRlbnVhdGlvbjpHLnNpemVBdHRlbnVhdGlvbiwKbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjplLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIsc2tpbm5pbmc6Ry5za2lubmluZyYmMDxmYSxtYXhCb25lczpmYSx1c2VWZXJ0ZXhUZXh0dXJlOmUuZmxvYXRWZXJ0ZXhUZXh0dXJlcyxtb3JwaFRhcmdldHM6Ry5tb3JwaFRhcmdldHMsbW9ycGhOb3JtYWxzOkcubW9ycGhOb3JtYWxzLG1heE1vcnBoVGFyZ2V0czphLm1heE1vcnBoVGFyZ2V0cyxtYXhNb3JwaE5vcm1hbHM6YS5tYXhNb3JwaE5vcm1hbHMsbnVtRGlyTGlnaHRzOkouZGlyZWN0aW9uYWwubGVuZ3RoLG51bVBvaW50TGlnaHRzOkoucG9pbnQubGVuZ3RoLG51bVNwb3RMaWdodHM6Si5zcG90Lmxlbmd0aCxudW1SZWN0QXJlYUxpZ2h0czpKLnJlY3RBcmVhLmxlbmd0aCxudW1IZW1pTGlnaHRzOkouaGVtaS5sZW5ndGgsbnVtRGlyTGlnaHRTaGFkb3dzOkouZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoLG51bVBvaW50TGlnaHRTaGFkb3dzOkoucG9pbnRTaGFkb3dNYXAubGVuZ3RoLG51bVNwb3RMaWdodFNoYWRvd3M6Si5zcG90U2hhZG93TWFwLmxlbmd0aCwKbnVtQ2xpcHBpbmdQbGFuZXM6UyxudW1DbGlwSW50ZXJzZWN0aW9uOlYsZGl0aGVyaW5nOkcuZGl0aGVyaW5nLHNoYWRvd01hcEVuYWJsZWQ6YS5zaGFkb3dNYXAuZW5hYmxlZCYmVy5yZWNlaXZlU2hhZG93JiYwPFAubGVuZ3RoLHNoYWRvd01hcFR5cGU6YS5zaGFkb3dNYXAudHlwZSx0b25lTWFwcGluZzpHLnRvbmVNYXBwZWQ/YS50b25lTWFwcGluZzowLHBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzOmEucGh5c2ljYWxseUNvcnJlY3RMaWdodHMscHJlbXVsdGlwbGllZEFscGhhOkcucHJlbXVsdGlwbGllZEFscGhhLGFscGhhVGVzdDpHLmFscGhhVGVzdCxkb3VibGVTaWRlZDoyPT09Ry5zaWRlLGZsaXBTaWRlZDoxPT09Ry5zaWRlLGRlcHRoUGFja2luZzp2b2lkIDAhPT1HLmRlcHRoUGFja2luZz9HLmRlcHRoUGFja2luZzohMX19O3RoaXMuZ2V0UHJvZ3JhbUNvZGU9ZnVuY3Rpb24oRyxKKXt2YXIgUD1bXTtKLnNoYWRlcklEP1AucHVzaChKLnNoYWRlcklEKTooUC5wdXNoKEcuZnJhZ21lbnRTaGFkZXIpLApQLnB1c2goRy52ZXJ0ZXhTaGFkZXIpKTtpZih2b2lkIDAhPT1HLmRlZmluZXMpZm9yKHZhciBSIGluIEcuZGVmaW5lcylQLnB1c2goUiksUC5wdXNoKEcuZGVmaW5lc1tSXSk7Zm9yKFI9MDtSPEUubGVuZ3RoO1IrKylQLnB1c2goSltFW1JdXSk7UC5wdXNoKEcub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCkpO1AucHVzaChhLmdhbW1hT3V0cHV0KTtQLnB1c2goYS5nYW1tYUZhY3Rvcik7cmV0dXJuIFAuam9pbigpfTt0aGlzLmFjcXVpcmVQcm9ncmFtPWZ1bmN0aW9uKEcsSixQLFIpe2Zvcih2YXIgUyxWPTAsVz12Lmxlbmd0aDtWPFc7VisrKXt2YXIgaGE9dltWXTtpZihoYS5jb2RlPT09Uil7Uz1oYTsrK1MudXNlZFRpbWVzO2JyZWFrfX12b2lkIDA9PT1TJiYoUz1uZXcgSmwoYSxjLFIsRyxKLFAsZSksdi5wdXNoKFMpKTtyZXR1cm4gU307dGhpcy5yZWxlYXNlUHJvZ3JhbT1mdW5jdGlvbihHKXswPT09LS1HLnVzZWRUaW1lcyYmKHZbdi5pbmRleE9mKEcpXT12W3YubGVuZ3RoLTFdLAp2LnBvcCgpLEcuZGVzdHJveSgpKX07dGhpcy5wcm9ncmFtcz12fWZ1bmN0aW9uIE1sKCl7dmFyIGE9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihjKXt2YXIgZT1hLmdldChjKTt2b2lkIDA9PT1lJiYoZT17fSxhLnNldChjLGUpKTtyZXR1cm4gZX0scmVtb3ZlOmZ1bmN0aW9uKGMpe2EuZGVsZXRlKGMpfSx1cGRhdGU6ZnVuY3Rpb24oYyxlLGcpe2EuZ2V0KGMpW2VdPWd9LGRpc3Bvc2U6ZnVuY3Rpb24oKXthPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gTmwoYSxjKXtyZXR1cm4gYS5ncm91cE9yZGVyIT09Yy5ncm91cE9yZGVyP2EuZ3JvdXBPcmRlci1jLmdyb3VwT3JkZXI6YS5yZW5kZXJPcmRlciE9PWMucmVuZGVyT3JkZXI/YS5yZW5kZXJPcmRlci1jLnJlbmRlck9yZGVyOmEucHJvZ3JhbSE9PWMucHJvZ3JhbT9hLnByb2dyYW0uaWQtYy5wcm9ncmFtLmlkOmEubWF0ZXJpYWwuaWQhPT1jLm1hdGVyaWFsLmlkP2EubWF0ZXJpYWwuaWQtYy5tYXRlcmlhbC5pZDphLnohPT0KYy56P2Euei1jLno6YS5pZC1jLmlkfWZ1bmN0aW9uIE9sKGEsYyl7cmV0dXJuIGEuZ3JvdXBPcmRlciE9PWMuZ3JvdXBPcmRlcj9hLmdyb3VwT3JkZXItYy5ncm91cE9yZGVyOmEucmVuZGVyT3JkZXIhPT1jLnJlbmRlck9yZGVyP2EucmVuZGVyT3JkZXItYy5yZW5kZXJPcmRlcjphLnohPT1jLno/Yy56LWEuejphLmlkLWMuaWR9ZnVuY3Rpb24gdGooKXtmdW5jdGlvbiBhKHosRSxHLEosUCxSKXt2YXIgUz1jW2VdO3ZvaWQgMD09PVM/KFM9e2lkOnouaWQsb2JqZWN0OnosZ2VvbWV0cnk6RSxtYXRlcmlhbDpHLHByb2dyYW06Ry5wcm9ncmFtfHx2LGdyb3VwT3JkZXI6SixyZW5kZXJPcmRlcjp6LnJlbmRlck9yZGVyLHo6UCxncm91cDpSfSxjW2VdPVMpOihTLmlkPXouaWQsUy5vYmplY3Q9eixTLmdlb21ldHJ5PUUsUy5tYXRlcmlhbD1HLFMucHJvZ3JhbT1HLnByb2dyYW18fHYsUy5ncm91cE9yZGVyPUosUy5yZW5kZXJPcmRlcj16LnJlbmRlck9yZGVyLFMuej1QLFMuZ3JvdXA9Uik7CmUrKztyZXR1cm4gU312YXIgYz1bXSxlPTAsZz1bXSxyPVtdLHY9e2lkOi0xfTtyZXR1cm57b3BhcXVlOmcsdHJhbnNwYXJlbnQ6cixpbml0OmZ1bmN0aW9uKCl7ZT0wO2cubGVuZ3RoPTA7ci5sZW5ndGg9MH0scHVzaDpmdW5jdGlvbih6LEUsRyxKLFAsUil7ej1hKHosRSxHLEosUCxSKTsoITA9PT1HLnRyYW5zcGFyZW50P3I6ZykucHVzaCh6KX0sdW5zaGlmdDpmdW5jdGlvbih6LEUsRyxKLFAsUil7ej1hKHosRSxHLEosUCxSKTsoITA9PT1HLnRyYW5zcGFyZW50P3I6ZykudW5zaGlmdCh6KX0sc29ydDpmdW5jdGlvbigpezE8Zy5sZW5ndGgmJmcuc29ydChObCk7MTxyLmxlbmd0aCYmci5zb3J0KE9sKX19fWZ1bmN0aW9uIFBsKCl7ZnVuY3Rpb24gYShlKXtlPWUudGFyZ2V0O2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSk7Yy5kZWxldGUoZSl9dmFyIGM9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihlLGcpe3ZhciByPWMuZ2V0KGUpO2lmKHZvaWQgMD09PQpyKXt2YXIgdj1uZXcgdGo7Yy5zZXQoZSxuZXcgV2Vha01hcCk7Yy5nZXQoZSkuc2V0KGcsdik7ZS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKX1lbHNlIHY9ci5nZXQoZyksdm9pZCAwPT09diYmKHY9bmV3IHRqLHIuc2V0KGcsdikpO3JldHVybiB2fSxkaXNwb3NlOmZ1bmN0aW9uKCl7Yz1uZXcgV2Vha01hcH19fWZ1bmN0aW9uIFFsKCl7dmFyIGE9e307cmV0dXJue2dldDpmdW5jdGlvbihjKXtpZih2b2lkIDAhPT1hW2MuaWRdKXJldHVybiBhW2MuaWRdO3N3aXRjaChjLnR5cGUpe2Nhc2UgIkRpcmVjdGlvbmFsTGlnaHQiOnZhciBlPXtkaXJlY3Rpb246bmV3IGssY29sb3I6bmV3IEksc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmfTticmVhaztjYXNlICJTcG90TGlnaHQiOmU9e3Bvc2l0aW9uOm5ldyBrLGRpcmVjdGlvbjpuZXcgayxjb2xvcjpuZXcgSSxkaXN0YW5jZTowLGNvbmVDb3M6MCxwZW51bWJyYUNvczowLGRlY2F5OjAsCnNoYWRvdzohMSxzaGFkb3dCaWFzOjAsc2hhZG93UmFkaXVzOjEsc2hhZG93TWFwU2l6ZTpuZXcgZn07YnJlYWs7Y2FzZSAiUG9pbnRMaWdodCI6ZT17cG9zaXRpb246bmV3IGssY29sb3I6bmV3IEksZGlzdGFuY2U6MCxkZWNheTowLHNoYWRvdzohMSxzaGFkb3dCaWFzOjAsc2hhZG93UmFkaXVzOjEsc2hhZG93TWFwU2l6ZTpuZXcgZixzaGFkb3dDYW1lcmFOZWFyOjEsc2hhZG93Q2FtZXJhRmFyOjFFM307YnJlYWs7Y2FzZSAiSGVtaXNwaGVyZUxpZ2h0IjplPXtkaXJlY3Rpb246bmV3IGssc2t5Q29sb3I6bmV3IEksZ3JvdW5kQ29sb3I6bmV3IEl9O2JyZWFrO2Nhc2UgIlJlY3RBcmVhTGlnaHQiOmU9e2NvbG9yOm5ldyBJLHBvc2l0aW9uOm5ldyBrLGhhbGZXaWR0aDpuZXcgayxoYWxmSGVpZ2h0Om5ldyBrfX1yZXR1cm4gYVtjLmlkXT1lfX19ZnVuY3Rpb24gUmwoYSxjKXtyZXR1cm4oYy5jYXN0U2hhZG93PzE6MCktKGEuY2FzdFNoYWRvdz8xOjApfWZ1bmN0aW9uIFNsKCl7Zm9yKHZhciBhPQpuZXcgUWwsYz17dmVyc2lvbjowLGhhc2g6e2RpcmVjdGlvbmFsTGVuZ3RoOi0xLHBvaW50TGVuZ3RoOi0xLHNwb3RMZW5ndGg6LTEscmVjdEFyZWFMZW5ndGg6LTEsaGVtaUxlbmd0aDotMSxudW1EaXJlY3Rpb25hbFNoYWRvd3M6LTEsbnVtUG9pbnRTaGFkb3dzOi0xLG51bVNwb3RTaGFkb3dzOi0xfSxhbWJpZW50OlswLDAsMF0scHJvYmU6W10sZGlyZWN0aW9uYWw6W10sZGlyZWN0aW9uYWxTaGFkb3dNYXA6W10sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6W10sc3BvdDpbXSxzcG90U2hhZG93TWFwOltdLHNwb3RTaGFkb3dNYXRyaXg6W10scmVjdEFyZWE6W10scG9pbnQ6W10scG9pbnRTaGFkb3dNYXA6W10scG9pbnRTaGFkb3dNYXRyaXg6W10saGVtaTpbXSxudW1EaXJlY3Rpb25hbFNoYWRvd3M6LTEsbnVtUG9pbnRTaGFkb3dzOi0xLG51bVNwb3RTaGFkb3dzOi0xfSxlPTA7OT5lO2UrKyljLnByb2JlLnB1c2gobmV3IGspO3ZhciBnPW5ldyBrLHI9bmV3IHEsdj1uZXcgcTtyZXR1cm57c2V0dXA6ZnVuY3Rpb24oeiwKRSxHKXtmb3IodmFyIEo9MCxQPTAsUj0wLFM9MDs5PlM7UysrKWMucHJvYmVbU10uc2V0KDAsMCwwKTt2YXIgVj1FPTAsVz0wLGhhPTAsZmE9MCxyYT0wLHBhPTAscWE9MDtHPUcubWF0cml4V29ybGRJbnZlcnNlO3ouc29ydChSbCk7Uz0wO2Zvcih2YXIgdWE9ei5sZW5ndGg7Uzx1YTtTKyspe3ZhciBvYT16W1NdLHRhPW9hLmNvbG9yLEJhPW9hLmludGVuc2l0eSxUYT1vYS5kaXN0YW5jZSxVYT1vYS5zaGFkb3cmJm9hLnNoYWRvdy5tYXA/b2Euc2hhZG93Lm1hcC50ZXh0dXJlOm51bGw7aWYob2EuaXNBbWJpZW50TGlnaHQpSis9dGEucipCYSxQKz10YS5nKkJhLFIrPXRhLmIqQmE7ZWxzZSBpZihvYS5pc0xpZ2h0UHJvYmUpZm9yKFVhPTA7OT5VYTtVYSsrKWMucHJvYmVbVWFdLmFkZFNjYWxlZFZlY3RvcihvYS5zaC5jb2VmZmljaWVudHNbVWFdLEJhKTtlbHNlIGlmKG9hLmlzRGlyZWN0aW9uYWxMaWdodCl7dmFyIENhPWEuZ2V0KG9hKTtDYS5jb2xvci5jb3B5KG9hLmNvbG9yKS5tdWx0aXBseVNjYWxhcihvYS5pbnRlbnNpdHkpOwpDYS5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLm1hdHJpeFdvcmxkKTtnLnNldEZyb21NYXRyaXhQb3NpdGlvbihvYS50YXJnZXQubWF0cml4V29ybGQpO0NhLmRpcmVjdGlvbi5zdWIoZyk7Q2EuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihHKTtpZihDYS5zaGFkb3c9b2EuY2FzdFNoYWRvdylCYT1vYS5zaGFkb3csQ2Euc2hhZG93Qmlhcz1CYS5iaWFzLENhLnNoYWRvd1JhZGl1cz1CYS5yYWRpdXMsQ2Euc2hhZG93TWFwU2l6ZT1CYS5tYXBTaXplLGMuZGlyZWN0aW9uYWxTaGFkb3dNYXBbRV09VWEsYy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeFtFXT1vYS5zaGFkb3cubWF0cml4LHJhKys7Yy5kaXJlY3Rpb25hbFtFXT1DYTtFKyt9ZWxzZSBpZihvYS5pc1Nwb3RMaWdodCl7Q2E9YS5nZXQob2EpO0NhLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihvYS5tYXRyaXhXb3JsZCk7Q2EucG9zaXRpb24uYXBwbHlNYXRyaXg0KEcpO0NhLmNvbG9yLmNvcHkodGEpLm11bHRpcGx5U2NhbGFyKEJhKTsKQ2EuZGlzdGFuY2U9VGE7Q2EuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihvYS5tYXRyaXhXb3JsZCk7Zy5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EudGFyZ2V0Lm1hdHJpeFdvcmxkKTtDYS5kaXJlY3Rpb24uc3ViKGcpO0NhLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oRyk7Q2EuY29uZUNvcz1NYXRoLmNvcyhvYS5hbmdsZSk7Q2EucGVudW1icmFDb3M9TWF0aC5jb3Mob2EuYW5nbGUqKDEtb2EucGVudW1icmEpKTtDYS5kZWNheT1vYS5kZWNheTtpZihDYS5zaGFkb3c9b2EuY2FzdFNoYWRvdylCYT1vYS5zaGFkb3csQ2Euc2hhZG93Qmlhcz1CYS5iaWFzLENhLnNoYWRvd1JhZGl1cz1CYS5yYWRpdXMsQ2Euc2hhZG93TWFwU2l6ZT1CYS5tYXBTaXplLGMuc3BvdFNoYWRvd01hcFtXXT1VYSxjLnNwb3RTaGFkb3dNYXRyaXhbV109b2Euc2hhZG93Lm1hdHJpeCxxYSsrO2Muc3BvdFtXXT1DYTtXKyt9ZWxzZSBpZihvYS5pc1JlY3RBcmVhTGlnaHQpQ2E9YS5nZXQob2EpLApDYS5jb2xvci5jb3B5KHRhKS5tdWx0aXBseVNjYWxhcihCYSksQ2EucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLm1hdHJpeFdvcmxkKSxDYS5wb3NpdGlvbi5hcHBseU1hdHJpeDQoRyksdi5pZGVudGl0eSgpLHIuY29weShvYS5tYXRyaXhXb3JsZCksci5wcmVtdWx0aXBseShHKSx2LmV4dHJhY3RSb3RhdGlvbihyKSxDYS5oYWxmV2lkdGguc2V0KC41Km9hLndpZHRoLDAsMCksQ2EuaGFsZkhlaWdodC5zZXQoMCwuNSpvYS5oZWlnaHQsMCksQ2EuaGFsZldpZHRoLmFwcGx5TWF0cml4NCh2KSxDYS5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NCh2KSxjLnJlY3RBcmVhW2hhXT1DYSxoYSsrO2Vsc2UgaWYob2EuaXNQb2ludExpZ2h0KXtDYT1hLmdldChvYSk7Q2EucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLm1hdHJpeFdvcmxkKTtDYS5wb3NpdGlvbi5hcHBseU1hdHJpeDQoRyk7Q2EuY29sb3IuY29weShvYS5jb2xvcikubXVsdGlwbHlTY2FsYXIob2EuaW50ZW5zaXR5KTsKQ2EuZGlzdGFuY2U9b2EuZGlzdGFuY2U7Q2EuZGVjYXk9b2EuZGVjYXk7aWYoQ2Euc2hhZG93PW9hLmNhc3RTaGFkb3cpQmE9b2Euc2hhZG93LENhLnNoYWRvd0JpYXM9QmEuYmlhcyxDYS5zaGFkb3dSYWRpdXM9QmEucmFkaXVzLENhLnNoYWRvd01hcFNpemU9QmEubWFwU2l6ZSxDYS5zaGFkb3dDYW1lcmFOZWFyPUJhLmNhbWVyYS5uZWFyLENhLnNoYWRvd0NhbWVyYUZhcj1CYS5jYW1lcmEuZmFyLGMucG9pbnRTaGFkb3dNYXBbVl09VWEsYy5wb2ludFNoYWRvd01hdHJpeFtWXT1vYS5zaGFkb3cubWF0cml4LHBhKys7Yy5wb2ludFtWXT1DYTtWKyt9ZWxzZSBvYS5pc0hlbWlzcGhlcmVMaWdodCYmKENhPWEuZ2V0KG9hKSxDYS5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLm1hdHJpeFdvcmxkKSxDYS5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKEcpLENhLmRpcmVjdGlvbi5ub3JtYWxpemUoKSxDYS5za3lDb2xvci5jb3B5KG9hLmNvbG9yKS5tdWx0aXBseVNjYWxhcihCYSksCkNhLmdyb3VuZENvbG9yLmNvcHkob2EuZ3JvdW5kQ29sb3IpLm11bHRpcGx5U2NhbGFyKEJhKSxjLmhlbWlbZmFdPUNhLGZhKyspfWMuYW1iaWVudFswXT1KO2MuYW1iaWVudFsxXT1QO2MuYW1iaWVudFsyXT1SO3o9Yy5oYXNoO2lmKHouZGlyZWN0aW9uYWxMZW5ndGghPT1FfHx6LnBvaW50TGVuZ3RoIT09Vnx8ei5zcG90TGVuZ3RoIT09V3x8ei5yZWN0QXJlYUxlbmd0aCE9PWhhfHx6LmhlbWlMZW5ndGghPT1mYXx8ei5udW1EaXJlY3Rpb25hbFNoYWRvd3MhPT1yYXx8ei5udW1Qb2ludFNoYWRvd3MhPT1wYXx8ei5udW1TcG90U2hhZG93cyE9PXFhKWMuZGlyZWN0aW9uYWwubGVuZ3RoPUUsYy5zcG90Lmxlbmd0aD1XLGMucmVjdEFyZWEubGVuZ3RoPWhhLGMucG9pbnQubGVuZ3RoPVYsYy5oZW1pLmxlbmd0aD1mYSxjLmRpcmVjdGlvbmFsU2hhZG93TWFwLmxlbmd0aD1yYSxjLnBvaW50U2hhZG93TWFwLmxlbmd0aD1wYSxjLnNwb3RTaGFkb3dNYXAubGVuZ3RoPXFhLGMuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgubGVuZ3RoPQpyYSxjLnBvaW50U2hhZG93TWF0cml4Lmxlbmd0aD1wYSxjLnNwb3RTaGFkb3dNYXRyaXgubGVuZ3RoPXFhLHouZGlyZWN0aW9uYWxMZW5ndGg9RSx6LnBvaW50TGVuZ3RoPVYsei5zcG90TGVuZ3RoPVcsei5yZWN0QXJlYUxlbmd0aD1oYSx6LmhlbWlMZW5ndGg9ZmEsei5udW1EaXJlY3Rpb25hbFNoYWRvd3M9cmEsei5udW1Qb2ludFNoYWRvd3M9cGEsei5udW1TcG90U2hhZG93cz1xYSxjLnZlcnNpb249VGwrK30sc3RhdGU6Y319ZnVuY3Rpb24gdWooKXt2YXIgYT1uZXcgU2wsYz1bXSxlPVtdO3JldHVybntpbml0OmZ1bmN0aW9uKCl7Yy5sZW5ndGg9MDtlLmxlbmd0aD0wfSxzdGF0ZTp7bGlnaHRzQXJyYXk6YyxzaGFkb3dzQXJyYXk6ZSxsaWdodHM6YX0sc2V0dXBMaWdodHM6ZnVuY3Rpb24oZyl7YS5zZXR1cChjLGUsZyl9LHB1c2hMaWdodDpmdW5jdGlvbihnKXtjLnB1c2goZyl9LHB1c2hTaGFkb3c6ZnVuY3Rpb24oZyl7ZS5wdXNoKGcpfX19ZnVuY3Rpb24gVWwoKXtmdW5jdGlvbiBhKGUpe2U9CmUudGFyZ2V0O2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSk7Yy5kZWxldGUoZSl9dmFyIGM9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihlLGcpe2lmKCExPT09Yy5oYXMoZSkpe3ZhciByPW5ldyB1ajtjLnNldChlLG5ldyBXZWFrTWFwKTtjLmdldChlKS5zZXQoZyxyKTtlLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpfWVsc2UhMT09PWMuZ2V0KGUpLmhhcyhnKT8ocj1uZXcgdWosYy5nZXQoZSkuc2V0KGcscikpOnI9Yy5nZXQoZSkuZ2V0KGcpO3JldHVybiByfSxkaXNwb3NlOmZ1bmN0aW9uKCl7Yz1uZXcgV2Vha01hcH19fWZ1bmN0aW9uIHZkKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hEZXB0aE1hdGVyaWFsIjt0aGlzLmRlcHRoUGFja2luZz0zMjAwO3RoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5kaXNwbGFjZW1lbnRNYXA9dGhpcy5hbHBoYU1hcD10aGlzLm1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9CjE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLmxpZ2h0cz10aGlzLmZvZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiB3ZChhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoRGlzdGFuY2VNYXRlcmlhbCI7dGhpcy5yZWZlcmVuY2VQb3NpdGlvbj1uZXcgazt0aGlzLm5lYXJEaXN0YW5jZT0xO3RoaXMuZmFyRGlzdGFuY2U9MUUzO3RoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5kaXNwbGFjZW1lbnRNYXA9dGhpcy5hbHBoYU1hcD10aGlzLm1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmxpZ2h0cz10aGlzLmZvZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiB2aihhLGMsZSl7ZnVuY3Rpb24gZyh0YSxCYSl7dmFyIFRhPWMudXBkYXRlKHJhKTtXLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPQp0YS5tYXAudGV4dHVyZTtXLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWU9dGEubWFwU2l6ZTtXLnVuaWZvcm1zLnJhZGl1cy52YWx1ZT10YS5yYWRpdXM7YS5zZXRSZW5kZXJUYXJnZXQodGEubWFwUGFzcyk7YS5jbGVhcigpO2EucmVuZGVyQnVmZmVyRGlyZWN0KEJhLG51bGwsVGEsVyxyYSxudWxsKTtoYS51bmlmb3Jtcy5zaGFkb3dfcGFzcy52YWx1ZT10YS5tYXBQYXNzLnRleHR1cmU7aGEudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT10YS5tYXBTaXplO2hhLnVuaWZvcm1zLnJhZGl1cy52YWx1ZT10YS5yYWRpdXM7YS5zZXRSZW5kZXJUYXJnZXQodGEubWFwKTthLmNsZWFyKCk7YS5yZW5kZXJCdWZmZXJEaXJlY3QoQmEsbnVsbCxUYSxoYSxyYSxudWxsKX1mdW5jdGlvbiByKHRhLEJhLFRhLFVhLENhLEhhKXt2YXIgRGE9dGEuZ2VvbWV0cnk7dmFyIE1hPVA7dmFyIGRiPXRhLmN1c3RvbURlcHRoTWF0ZXJpYWw7VGEuaXNQb2ludExpZ2h0JiYoTWE9UixkYj10YS5jdXN0b21EaXN0YW5jZU1hdGVyaWFsKTsKZGI/TWE9ZGI6KGRiPSExLEJhLm1vcnBoVGFyZ2V0cyYmKERhJiZEYS5pc0J1ZmZlckdlb21ldHJ5P2RiPURhLm1vcnBoQXR0cmlidXRlcyYmRGEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uJiYwPERhLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGg6RGEmJkRhLmlzR2VvbWV0cnkmJihkYj1EYS5tb3JwaFRhcmdldHMmJjA8RGEubW9ycGhUYXJnZXRzLmxlbmd0aCkpLHRhLmlzU2tpbm5lZE1lc2gmJiExPT09QmEuc2tpbm5pbmcmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6IFRIUkVFLlNraW5uZWRNZXNoIHdpdGggbWF0ZXJpYWwuc2tpbm5pbmcgc2V0IHRvIGZhbHNlOiIsdGEpLHRhPXRhLmlzU2tpbm5lZE1lc2gmJkJhLnNraW5uaW5nLERhPTAsZGImJihEYXw9MSksdGEmJihEYXw9MiksTWE9TWFbRGFdKTthLmxvY2FsQ2xpcHBpbmdFbmFibGVkJiYhMD09PUJhLmNsaXBTaGFkb3dzJiYwIT09QmEuY2xpcHBpbmdQbGFuZXMubGVuZ3RoJiYoRGE9TWEudXVpZCwKZGI9QmEudXVpZCx0YT1TW0RhXSx2b2lkIDA9PT10YSYmKHRhPXt9LFNbRGFdPXRhKSxEYT10YVtkYl0sdm9pZCAwPT09RGEmJihEYT1NYS5jbG9uZSgpLHRhW2RiXT1EYSksTWE9RGEpO01hLnZpc2libGU9QmEudmlzaWJsZTtNYS53aXJlZnJhbWU9QmEud2lyZWZyYW1lO01hLnNpZGU9Mz09PUhhP251bGwhPUJhLnNoYWRvd1NpZGU/QmEuc2hhZG93U2lkZTpCYS5zaWRlOm51bGwhPUJhLnNoYWRvd1NpZGU/QmEuc2hhZG93U2lkZTpWW0JhLnNpZGVdO01hLmNsaXBTaGFkb3dzPUJhLmNsaXBTaGFkb3dzO01hLmNsaXBwaW5nUGxhbmVzPUJhLmNsaXBwaW5nUGxhbmVzO01hLmNsaXBJbnRlcnNlY3Rpb249QmEuY2xpcEludGVyc2VjdGlvbjtNYS53aXJlZnJhbWVMaW5ld2lkdGg9QmEud2lyZWZyYW1lTGluZXdpZHRoO01hLmxpbmV3aWR0aD1CYS5saW5ld2lkdGg7VGEuaXNQb2ludExpZ2h0JiZNYS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsJiYoTWEucmVmZXJlbmNlUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFRhLm1hdHJpeFdvcmxkKSwKTWEubmVhckRpc3RhbmNlPVVhLE1hLmZhckRpc3RhbmNlPUNhKTtyZXR1cm4gTWF9ZnVuY3Rpb24gdih0YSxCYSxUYSxVYSxDYSl7aWYoITEhPT10YS52aXNpYmxlKXtpZih0YS5sYXllcnMudGVzdChCYS5sYXllcnMpJiYodGEuaXNNZXNofHx0YS5pc0xpbmV8fHRhLmlzUG9pbnRzKSYmKHRhLmNhc3RTaGFkb3d8fHRhLnJlY2VpdmVTaGFkb3cmJjM9PT1DYSkmJighdGEuZnJ1c3R1bUN1bGxlZHx8ei5pbnRlcnNlY3RzT2JqZWN0KHRhKSkpe3RhLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKFRhLm1hdHJpeFdvcmxkSW52ZXJzZSx0YS5tYXRyaXhXb3JsZCk7dmFyIEhhPWMudXBkYXRlKHRhKSxEYT10YS5tYXRlcmlhbDtpZihBcnJheS5pc0FycmF5KERhKSlmb3IodmFyIE1hPUhhLmdyb3VwcyxkYj0wLHRiPU1hLmxlbmd0aDtkYjx0YjtkYisrKXt2YXIgS2E9TWFbZGJdLGJiPURhW0thLm1hdGVyaWFsSW5kZXhdO2JiJiZiYi52aXNpYmxlJiYoYmI9cih0YSxiYixVYSxUYS5uZWFyLApUYS5mYXIsQ2EpLGEucmVuZGVyQnVmZmVyRGlyZWN0KFRhLG51bGwsSGEsYmIsdGEsS2EpKX1lbHNlIERhLnZpc2libGUmJihiYj1yKHRhLERhLFVhLFRhLm5lYXIsVGEuZmFyLENhKSxhLnJlbmRlckJ1ZmZlckRpcmVjdChUYSxudWxsLEhhLGJiLHRhLG51bGwpKX10YT10YS5jaGlsZHJlbjtIYT0wO2ZvcihEYT10YS5sZW5ndGg7SGE8RGE7SGErKyl2KHRhW0hhXSxCYSxUYSxVYSxDYSl9fXZhciB6PW5ldyBpYyxFPW5ldyBmLEc9bmV3IGYsSj1uZXcgcCxQPUFycmF5KDQpLFI9QXJyYXkoNCksUz17fSxWPXswOjEsMTowLDI6Mn0sVz1uZXcgcWIoe2RlZmluZXM6e1NBTVBMRV9SQVRFOi4yNSxIQUxGX1NBTVBMRV9SQVRFOi4xMjV9LHVuaWZvcm1zOntzaGFkb3dfcGFzczp7dmFsdWU6bnVsbH0scmVzb2x1dGlvbjp7dmFsdWU6bmV3IGZ9LHJhZGl1czp7dmFsdWU6NH19LHZlcnRleFNoYWRlcjoidm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiBceDNkIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0iLApmcmFnbWVudFNoYWRlcjoidW5pZm9ybSBzYW1wbGVyMkQgc2hhZG93X3Bhc3M7XG51bmlmb3JtIHZlYzIgcmVzb2x1dGlvbjtcbnVuaWZvcm0gZmxvYXQgcmFkaXVzO1xuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG52b2lkIG1haW4oKSB7XG4gIGZsb2F0IG1lYW4gXHgzZCAwLjA7XG4gIGZsb2F0IHNxdWFyZWRfbWVhbiBceDNkIDAuMDtcbiAgXG5cdGZsb2F0IGRlcHRoIFx4M2QgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICApIC8gcmVzb2x1dGlvbiApICk7XG4gIGZvciAoIGZsb2F0IGkgXHgzZCAtMS4wOyBpIFx4M2MgMS4wIDsgaSArXHgzZCBTQU1QTEVfUkFURSkge1xuICAgICNpZmRlZiBIT1JJWk9OQUxfUEFTU1xuICAgICAgdmVjMiBkaXN0cmlidXRpb24gXHgzZCBkZWNvZGVIYWxmUkdCQSAoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggaSwgMC4wICkgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuICAgICAgbWVhbiArXHgzZCBkaXN0cmlidXRpb24ueDtcbiAgICAgIHNxdWFyZWRfbWVhbiArXHgzZCBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICsgZGlzdHJpYnV0aW9uLnggKiBkaXN0cmlidXRpb24ueDtcbiAgICAjZWxzZVxuICAgICAgZmxvYXQgZGVwdGggXHgzZCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCAwLjAsICBpICkgICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTtcbiAgICAgIG1lYW4gK1x4M2QgZGVwdGg7XG4gICAgICBzcXVhcmVkX21lYW4gK1x4M2QgZGVwdGggKiBkZXB0aDtcbiAgICAjZW5kaWZcbiAgfVxuICBtZWFuIFx4M2QgbWVhbiAqIEhBTEZfU0FNUExFX1JBVEU7XG4gIHNxdWFyZWRfbWVhbiBceDNkIHNxdWFyZWRfbWVhbiAqIEhBTEZfU0FNUExFX1JBVEU7XG4gIGZsb2F0IHN0ZF9kZXYgXHgzZCBwb3coIHNxdWFyZWRfbWVhbiAtIG1lYW4gKiBtZWFuLCAwLjUgKTtcbiAgZ2xfRnJhZ0NvbG9yIFx4M2QgZW5jb2RlSGFsZlJHQkEoIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKSApO1xufSJ9KSwKaGE9Vy5jbG9uZSgpO2hhLmRlZmluZXMuSE9SSVpPTkFMX1BBU1M9MTt2YXIgZmE9bmV3IHZhO2ZhLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBRKG5ldyBGbG9hdDMyQXJyYXkoWy0xLC0xLC41LDMsLTEsLjUsLTEsMywuNV0pLDMpKTt2YXIgcmE9bmV3IHhhKGZhLFcpO2ZvcihmYT0wOzQhPT1mYTsrK2ZhKXt2YXIgcGE9MCE9PShmYSYxKSxxYT0wIT09KGZhJjIpLHVhPW5ldyB2ZCh7ZGVwdGhQYWNraW5nOjMyMDEsbW9ycGhUYXJnZXRzOnBhLHNraW5uaW5nOnFhfSk7UFtmYV09dWE7cGE9bmV3IHdkKHttb3JwaFRhcmdldHM6cGEsc2tpbm5pbmc6cWF9KTtSW2ZhXT1wYX12YXIgb2E9dGhpczt0aGlzLmVuYWJsZWQ9ITE7dGhpcy5hdXRvVXBkYXRlPSEwO3RoaXMubmVlZHNVcGRhdGU9ITE7dGhpcy50eXBlPTE7dGhpcy5yZW5kZXI9ZnVuY3Rpb24odGEsQmEsVGEpe2lmKCExIT09b2EuZW5hYmxlZCYmKCExIT09b2EuYXV0b1VwZGF0ZXx8ITEhPT1vYS5uZWVkc1VwZGF0ZSkmJgowIT09dGEubGVuZ3RoKXt2YXIgVWE9YS5nZXRSZW5kZXJUYXJnZXQoKSxDYT1hLmdldEFjdGl2ZUN1YmVGYWNlKCksSGE9YS5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpLERhPWEuc3RhdGU7RGEuc2V0QmxlbmRpbmcoMCk7RGEuYnVmZmVycy5jb2xvci5zZXRDbGVhcigxLDEsMSwxKTtEYS5idWZmZXJzLmRlcHRoLnNldFRlc3QoITApO0RhLnNldFNjaXNzb3JUZXN0KCExKTtmb3IodmFyIE1hPTAsZGI9dGEubGVuZ3RoO01hPGRiO01hKyspe3ZhciB0Yj10YVtNYV0sS2E9dGIuc2hhZG93O2lmKHZvaWQgMD09PUthKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6Iix0YiwiaGFzIG5vIHNoYWRvdy4iKTtlbHNle0UuY29weShLYS5tYXBTaXplKTt2YXIgYmI9S2EuZ2V0RnJhbWVFeHRlbnRzKCk7RS5tdWx0aXBseShiYik7Ry5jb3B5KEthLm1hcFNpemUpO2lmKEUueD5lfHxFLnk+ZSljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMU2hhZG93TWFwOiIsdGIsImhhcyBzaGFkb3cgZXhjZWVkaW5nIG1heCB0ZXh0dXJlIHNpemUsIHJlZHVjaW5nIiksCkUueD5lJiYoRy54PU1hdGguZmxvb3IoZS9iYi54KSxFLng9Ry54KmJiLngsS2EubWFwU2l6ZS54PUcueCksRS55PmUmJihHLnk9TWF0aC5mbG9vcihlL2JiLnkpLEUueT1HLnkqYmIueSxLYS5tYXBTaXplLnk9Ry55KTtudWxsIT09S2EubWFwfHxLYS5pc1BvaW50TGlnaHRTaGFkb3d8fDMhPT10aGlzLnR5cGV8fChiYj17bWluRmlsdGVyOjEwMDYsbWFnRmlsdGVyOjEwMDYsZm9ybWF0OjEwMjN9LEthLm1hcD1uZXcgbShFLngsRS55LGJiKSxLYS5tYXAudGV4dHVyZS5uYW1lPXRiLm5hbWUrIi5zaGFkb3dNYXAiLEthLm1hcFBhc3M9bmV3IG0oRS54LEUueSxiYiksS2EuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSk7bnVsbD09PUthLm1hcCYmKGJiPXttaW5GaWx0ZXI6MTAwMyxtYWdGaWx0ZXI6MTAwMyxmb3JtYXQ6MTAyM30sS2EubWFwPW5ldyBtKEUueCxFLnksYmIpLEthLm1hcC50ZXh0dXJlLm5hbWU9dGIubmFtZSsiLnNoYWRvd01hcCIsS2EuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSk7CmEuc2V0UmVuZGVyVGFyZ2V0KEthLm1hcCk7YS5jbGVhcigpO2JiPUthLmdldFZpZXdwb3J0Q291bnQoKTtmb3IodmFyIGpiPTA7amI8YmI7amIrKyl7dmFyIEViPUthLmdldFZpZXdwb3J0KGpiKTtKLnNldChHLngqRWIueCxHLnkqRWIueSxHLngqRWIueixHLnkqRWIudyk7RGEudmlld3BvcnQoSik7S2EudXBkYXRlTWF0cmljZXModGIsVGEsamIpO3o9S2EuZ2V0RnJ1c3R1bSgpO3YoQmEsVGEsS2EuY2FtZXJhLHRiLHRoaXMudHlwZSl9S2EuaXNQb2ludExpZ2h0U2hhZG93fHwzIT09dGhpcy50eXBlfHxnKEthLFRhKX19b2EubmVlZHNVcGRhdGU9ITE7YS5zZXRSZW5kZXJUYXJnZXQoVWEsQ2EsSGEpfX19ZnVuY3Rpb24gVmwoYSxjLGUsZyl7ZnVuY3Rpb24gcihqYSxHYSxMYSl7dmFyIG5iPW5ldyBVaW50OEFycmF5KDQpLFZhPWEuY3JlYXRlVGV4dHVyZSgpO2EuYmluZFRleHR1cmUoamEsVmEpO2EudGV4UGFyYW1ldGVyaShqYSwxMDI0MSw5NzI4KTthLnRleFBhcmFtZXRlcmkoamEsCjEwMjQwLDk3MjgpO2ZvcihqYT0wO2phPExhO2phKyspYS50ZXhJbWFnZTJEKEdhK2phLDAsNjQwOCwxLDEsMCw2NDA4LDUxMjEsbmIpO3JldHVybiBWYX1mdW5jdGlvbiB2KGphLEdhKXtyYVtqYV09MTswPT09cGFbamFdJiYoYS5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShqYSkscGFbamFdPTEpO3FhW2phXSE9PUdhJiYoKGcuaXNXZWJHTDI/YTpjLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpKVtnLmlzV2ViR0wyPyJ2ZXJ0ZXhBdHRyaWJEaXZpc29yIjoidmVydGV4QXR0cmliRGl2aXNvckFOR0xFIl0oamEsR2EpLHFhW2phXT1HYSl9ZnVuY3Rpb24geihqYSl7ITAhPT11YVtqYV0mJihhLmVuYWJsZShqYSksdWFbamFdPSEwKX1mdW5jdGlvbiBFKGphKXshMSE9PXVhW2phXSYmKGEuZGlzYWJsZShqYSksdWFbamFdPSExKX1mdW5jdGlvbiBHKGphLEdhLExhLG5iLFZhLGliLGtiLFFhKXtpZigwPT09amEpQmEmJihFKDMwNDIpLEJhPSExKTtlbHNlIGlmKEJhfHwoeigzMDQyKSwKQmE9ITApLDUhPT1qYSl7aWYoamEhPT1UYXx8UWEhPT10Yil7aWYoMTAwIT09VWF8fDEwMCE9PURhKWEuYmxlbmRFcXVhdGlvbigzMjc3NCksRGE9VWE9MTAwO2lmKFFhKXN3aXRjaChqYSl7Y2FzZSAxOmEuYmxlbmRGdW5jU2VwYXJhdGUoMSw3NzEsMSw3NzEpO2JyZWFrO2Nhc2UgMjphLmJsZW5kRnVuYygxLDEpO2JyZWFrO2Nhc2UgMzphLmJsZW5kRnVuY1NlcGFyYXRlKDAsMCw3NjksNzcxKTticmVhaztjYXNlIDQ6YS5ibGVuZEZ1bmNTZXBhcmF0ZSgwLDc2OCwwLDc3MCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGphKX1lbHNlIHN3aXRjaChqYSl7Y2FzZSAxOmEuYmxlbmRGdW5jU2VwYXJhdGUoNzcwLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOmEuYmxlbmRGdW5jKDc3MCwxKTticmVhaztjYXNlIDM6YS5ibGVuZEZ1bmMoMCw3NjkpO2JyZWFrO2Nhc2UgNDphLmJsZW5kRnVuYygwLDc2OCk7YnJlYWs7CmRlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogIixqYSl9ZGI9TWE9SGE9Q2E9bnVsbDtUYT1qYTt0Yj1RYX19ZWxzZXtWYT1WYXx8R2E7aWI9aWJ8fExhO2tiPWtifHxuYjtpZihHYSE9PVVhfHxWYSE9PURhKWEuYmxlbmRFcXVhdGlvblNlcGFyYXRlKGUuY29udmVydChHYSksZS5jb252ZXJ0KFZhKSksVWE9R2EsRGE9VmE7aWYoTGEhPT1DYXx8bmIhPT1IYXx8aWIhPT1NYXx8a2IhPT1kYilhLmJsZW5kRnVuY1NlcGFyYXRlKGUuY29udmVydChMYSksZS5jb252ZXJ0KG5iKSxlLmNvbnZlcnQoaWIpLGUuY29udmVydChrYikpLENhPUxhLEhhPW5iLE1hPWliLGRiPWtiO1RhPWphO3RiPW51bGx9fWZ1bmN0aW9uIEooamEpe0thIT09amEmJihqYT9hLmZyb250RmFjZSgyMzA0KTphLmZyb250RmFjZSgyMzA1KSxLYT1qYSl9ZnVuY3Rpb24gUChqYSl7MCE9PWphPyh6KDI4ODQpLGphIT09YmImJigxPT09amE/YS5jdWxsRmFjZSgxMDI5KToKMj09PWphP2EuY3VsbEZhY2UoMTAyOCk6YS5jdWxsRmFjZSgxMDMyKSkpOkUoMjg4NCk7YmI9amF9ZnVuY3Rpb24gUihqYSxHYSxMYSl7aWYoamEpe2lmKHooMzI4MjMpLEViIT09R2F8fHhiIT09TGEpYS5wb2x5Z29uT2Zmc2V0KEdhLExhKSxFYj1HYSx4Yj1MYX1lbHNlIEUoMzI4MjMpfWZ1bmN0aW9uIFMoamEpe3ZvaWQgMD09PWphJiYoamE9MzM5ODQraWEtMSk7emEhPT1qYSYmKGEuYWN0aXZlVGV4dHVyZShqYSksemE9amEpfXZhciBWPW5ldyBmdW5jdGlvbigpe3ZhciBqYT0hMSxHYT1uZXcgcCxMYT1udWxsLG5iPW5ldyBwKDAsMCwwLDApO3JldHVybntzZXRNYXNrOmZ1bmN0aW9uKFZhKXtMYT09PVZhfHxqYXx8KGEuY29sb3JNYXNrKFZhLFZhLFZhLFZhKSxMYT1WYSl9LHNldExvY2tlZDpmdW5jdGlvbihWYSl7amE9VmF9LHNldENsZWFyOmZ1bmN0aW9uKFZhLGliLGtiLFFhLGViKXshMD09PWViJiYoVmEqPVFhLGliKj1RYSxrYio9UWEpO0dhLnNldChWYSxpYixrYixRYSk7CiExPT09bmIuZXF1YWxzKEdhKSYmKGEuY2xlYXJDb2xvcihWYSxpYixrYixRYSksbmIuY29weShHYSkpfSxyZXNldDpmdW5jdGlvbigpe2phPSExO0xhPW51bGw7bmIuc2V0KC0xLDAsMCwwKX19fSxXPW5ldyBmdW5jdGlvbigpe3ZhciBqYT0hMSxHYT1udWxsLExhPW51bGwsbmI9bnVsbDtyZXR1cm57c2V0VGVzdDpmdW5jdGlvbihWYSl7VmE/eigyOTI5KTpFKDI5MjkpfSxzZXRNYXNrOmZ1bmN0aW9uKFZhKXtHYT09PVZhfHxqYXx8KGEuZGVwdGhNYXNrKFZhKSxHYT1WYSl9LHNldEZ1bmM6ZnVuY3Rpb24oVmEpe2lmKExhIT09VmEpe2lmKFZhKXN3aXRjaChWYSl7Y2FzZSAwOmEuZGVwdGhGdW5jKDUxMik7YnJlYWs7Y2FzZSAxOmEuZGVwdGhGdW5jKDUxOSk7YnJlYWs7Y2FzZSAyOmEuZGVwdGhGdW5jKDUxMyk7YnJlYWs7Y2FzZSAzOmEuZGVwdGhGdW5jKDUxNSk7YnJlYWs7Y2FzZSA0OmEuZGVwdGhGdW5jKDUxNCk7YnJlYWs7Y2FzZSA1OmEuZGVwdGhGdW5jKDUxOCk7YnJlYWs7Y2FzZSA2OmEuZGVwdGhGdW5jKDUxNik7CmJyZWFrO2Nhc2UgNzphLmRlcHRoRnVuYyg1MTcpO2JyZWFrO2RlZmF1bHQ6YS5kZXB0aEZ1bmMoNTE1KX1lbHNlIGEuZGVwdGhGdW5jKDUxNSk7TGE9VmF9fSxzZXRMb2NrZWQ6ZnVuY3Rpb24oVmEpe2phPVZhfSxzZXRDbGVhcjpmdW5jdGlvbihWYSl7bmIhPT1WYSYmKGEuY2xlYXJEZXB0aChWYSksbmI9VmEpfSxyZXNldDpmdW5jdGlvbigpe2phPSExO25iPUxhPUdhPW51bGx9fX0saGE9bmV3IGZ1bmN0aW9uKCl7dmFyIGphPSExLEdhPW51bGwsTGE9bnVsbCxuYj1udWxsLFZhPW51bGwsaWI9bnVsbCxrYj1udWxsLFFhPW51bGwsZWI9bnVsbDtyZXR1cm57c2V0VGVzdDpmdW5jdGlvbihtYil7amF8fChtYj96KDI5NjApOkUoMjk2MCkpfSxzZXRNYXNrOmZ1bmN0aW9uKG1iKXtHYT09PW1ifHxqYXx8KGEuc3RlbmNpbE1hc2sobWIpLEdhPW1iKX0sc2V0RnVuYzpmdW5jdGlvbihtYixwYixzYil7aWYoTGEhPT1tYnx8bmIhPT1wYnx8VmEhPT1zYilhLnN0ZW5jaWxGdW5jKG1iLHBiLApzYiksTGE9bWIsbmI9cGIsVmE9c2J9LHNldE9wOmZ1bmN0aW9uKG1iLHBiLHNiKXtpZihpYiE9PW1ifHxrYiE9PXBifHxRYSE9PXNiKWEuc3RlbmNpbE9wKG1iLHBiLHNiKSxpYj1tYixrYj1wYixRYT1zYn0sc2V0TG9ja2VkOmZ1bmN0aW9uKG1iKXtqYT1tYn0sc2V0Q2xlYXI6ZnVuY3Rpb24obWIpe2ViIT09bWImJihhLmNsZWFyU3RlbmNpbChtYiksZWI9bWIpfSxyZXNldDpmdW5jdGlvbigpe2phPSExO2ViPVFhPWtiPWliPVZhPW5iPUxhPUdhPW51bGx9fX0sZmE9YS5nZXRQYXJhbWV0ZXIoMzQ5MjEpLHJhPW5ldyBVaW50OEFycmF5KGZhKSxwYT1uZXcgVWludDhBcnJheShmYSkscWE9bmV3IFVpbnQ4QXJyYXkoZmEpLHVhPXt9LG9hPW51bGwsdGE9bnVsbCxCYT1udWxsLFRhPW51bGwsVWE9bnVsbCxDYT1udWxsLEhhPW51bGwsRGE9bnVsbCxNYT1udWxsLGRiPW51bGwsdGI9ITEsS2E9bnVsbCxiYj1udWxsLGpiPW51bGwsRWI9bnVsbCx4Yj1udWxsLGlhPWEuZ2V0UGFyYW1ldGVyKDM1NjYxKSwKbmE9ITE7ZmE9MDtmYT1hLmdldFBhcmFtZXRlcig3OTM4KTstMSE9PWZhLmluZGV4T2YoIldlYkdMIik/KGZhPXBhcnNlRmxvYXQoL15XZWJHTCAoWzAtOV0pLy5leGVjKGZhKVsxXSksbmE9MTw9ZmEpOi0xIT09ZmEuaW5kZXhPZigiT3BlbkdMIEVTIikmJihmYT1wYXJzZUZsb2F0KC9eT3BlbkdMIEVTIChbMC05XSkvLmV4ZWMoZmEpWzFdKSxuYT0yPD1mYSk7dmFyIHphPW51bGwsSmE9e30sWWE9bmV3IHAsTmE9bmV3IHAsY2I9e307Y2JbMzU1M109cigzNTUzLDM1NTMsMSk7Y2JbMzQwNjddPXIoMzQwNjcsMzQwNjksNik7Vi5zZXRDbGVhcigwLDAsMCwxKTtXLnNldENsZWFyKDEpO2hhLnNldENsZWFyKDApO3ooMjkyOSk7Vy5zZXRGdW5jKDMpO0ooITEpO1AoMSk7eigyODg0KTtHKDApO3JldHVybntidWZmZXJzOntjb2xvcjpWLGRlcHRoOlcsc3RlbmNpbDpoYX0saW5pdEF0dHJpYnV0ZXM6ZnVuY3Rpb24oKXtmb3IodmFyIGphPTAsR2E9cmEubGVuZ3RoO2phPEdhO2phKyspcmFbamFdPQowfSxlbmFibGVBdHRyaWJ1dGU6ZnVuY3Rpb24oamEpe3YoamEsMCl9LGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3I6dixkaXNhYmxlVW51c2VkQXR0cmlidXRlczpmdW5jdGlvbigpe2Zvcih2YXIgamE9MCxHYT1wYS5sZW5ndGg7amEhPT1HYTsrK2phKXBhW2phXSE9PXJhW2phXSYmKGEuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGphKSxwYVtqYV09MCl9LGVuYWJsZTp6LGRpc2FibGU6RSxnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHM6ZnVuY3Rpb24oKXtpZihudWxsPT09b2EmJihvYT1bXSxjLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfHxjLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEiKXx8Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjIikpKWZvcih2YXIgamE9YS5nZXRQYXJhbWV0ZXIoMzQ0NjcpLEdhPTA7R2E8amEubGVuZ3RoO0dhKyspb2EucHVzaChqYVtHYV0pOwpyZXR1cm4gb2F9LHVzZVByb2dyYW06ZnVuY3Rpb24oamEpe3JldHVybiB0YSE9PWphPyhhLnVzZVByb2dyYW0oamEpLHRhPWphLCEwKTohMX0sc2V0QmxlbmRpbmc6RyxzZXRNYXRlcmlhbDpmdW5jdGlvbihqYSxHYSl7Mj09PWphLnNpZGU/RSgyODg0KTp6KDI4ODQpO3ZhciBMYT0xPT09amEuc2lkZTtHYSYmKExhPSFMYSk7SihMYSk7MT09PWphLmJsZW5kaW5nJiYhMT09PWphLnRyYW5zcGFyZW50P0coMCk6RyhqYS5ibGVuZGluZyxqYS5ibGVuZEVxdWF0aW9uLGphLmJsZW5kU3JjLGphLmJsZW5kRHN0LGphLmJsZW5kRXF1YXRpb25BbHBoYSxqYS5ibGVuZFNyY0FscGhhLGphLmJsZW5kRHN0QWxwaGEsamEucHJlbXVsdGlwbGllZEFscGhhKTtXLnNldEZ1bmMoamEuZGVwdGhGdW5jKTtXLnNldFRlc3QoamEuZGVwdGhUZXN0KTtXLnNldE1hc2soamEuZGVwdGhXcml0ZSk7Vi5zZXRNYXNrKGphLmNvbG9yV3JpdGUpO0dhPWphLnN0ZW5jaWxXcml0ZTtoYS5zZXRUZXN0KEdhKTtHYSYmCihoYS5zZXRGdW5jKGphLnN0ZW5jaWxGdW5jLGphLnN0ZW5jaWxSZWYsamEuc3RlbmNpbE1hc2spLGhhLnNldE9wKGphLnN0ZW5jaWxGYWlsLGphLnN0ZW5jaWxaRmFpbCxqYS5zdGVuY2lsWlBhc3MpKTtSKGphLnBvbHlnb25PZmZzZXQsamEucG9seWdvbk9mZnNldEZhY3RvcixqYS5wb2x5Z29uT2Zmc2V0VW5pdHMpfSxzZXRGbGlwU2lkZWQ6SixzZXRDdWxsRmFjZTpQLHNldExpbmVXaWR0aDpmdW5jdGlvbihqYSl7amEhPT1qYiYmKG5hJiZhLmxpbmVXaWR0aChqYSksamI9amEpfSxzZXRQb2x5Z29uT2Zmc2V0OlIsc2V0U2Npc3NvclRlc3Q6ZnVuY3Rpb24oamEpe2phP3ooMzA4OSk6RSgzMDg5KX0sYWN0aXZlVGV4dHVyZTpTLGJpbmRUZXh0dXJlOmZ1bmN0aW9uKGphLEdhKXtudWxsPT09emEmJlMoKTt2YXIgTGE9SmFbemFdO3ZvaWQgMD09PUxhJiYoTGE9e3R5cGU6dm9pZCAwLHRleHR1cmU6dm9pZCAwfSxKYVt6YV09TGEpO2lmKExhLnR5cGUhPT1qYXx8TGEudGV4dHVyZSE9PQpHYSlhLmJpbmRUZXh0dXJlKGphLEdhfHxjYltqYV0pLExhLnR5cGU9amEsTGEudGV4dHVyZT1HYX0sY29tcHJlc3NlZFRleEltYWdlMkQ6ZnVuY3Rpb24oKXt0cnl7YS5jb21wcmVzc2VkVGV4SW1hZ2UyRC5hcHBseShhLGFyZ3VtZW50cyl9Y2F0Y2goamEpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixqYSl9fSx0ZXhJbWFnZTJEOmZ1bmN0aW9uKCl7dHJ5e2EudGV4SW1hZ2UyRC5hcHBseShhLGFyZ3VtZW50cyl9Y2F0Y2goamEpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixqYSl9fSx0ZXhJbWFnZTNEOmZ1bmN0aW9uKCl7dHJ5e2EudGV4SW1hZ2UzRC5hcHBseShhLGFyZ3VtZW50cyl9Y2F0Y2goamEpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixqYSl9fSxzY2lzc29yOmZ1bmN0aW9uKGphKXshMT09PVlhLmVxdWFscyhqYSkmJihhLnNjaXNzb3IoamEueCxqYS55LGphLnosamEudyksWWEuY29weShqYSkpfSx2aWV3cG9ydDpmdW5jdGlvbihqYSl7ITE9PT0KTmEuZXF1YWxzKGphKSYmKGEudmlld3BvcnQoamEueCxqYS55LGphLnosamEudyksTmEuY29weShqYSkpfSxyZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgamE9MDtqYTxwYS5sZW5ndGg7amErKykxPT09cGFbamFdJiYoYS5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoamEpLHBhW2phXT0wKTt1YT17fTt6YT1vYT1udWxsO0phPXt9O2JiPUthPVRhPXRhPW51bGw7Vi5yZXNldCgpO1cucmVzZXQoKTtoYS5yZXNldCgpfX19ZnVuY3Rpb24gV2woYSxjLGUsZyxyLHYseil7ZnVuY3Rpb24gRShpYSxuYSl7cmV0dXJuIGJiP25ldyBPZmZzY3JlZW5DYW52YXMoaWEsbmEpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImNhbnZhcyIpfWZ1bmN0aW9uIEcoaWEsbmEsemEsSmEpe3ZhciBZYT0xO2lmKGlhLndpZHRoPkphfHxpYS5oZWlnaHQ+SmEpWWE9SmEvTWF0aC5tYXgoaWEud2lkdGgsaWEuaGVpZ2h0KTtpZigxPllhfHwhMD09PW5hKXtpZigidW5kZWZpbmVkIiE9PQp0eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmaWEgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCYmaWEgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPT10eXBlb2YgSW1hZ2VCaXRtYXAmJmlhIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApcmV0dXJuIEphPW5hP2hiLmZsb29yUG93ZXJPZlR3bzpNYXRoLmZsb29yLG5hPUphKFlhKmlhLndpZHRoKSxZYT1KYShZYSppYS5oZWlnaHQpLHZvaWQgMD09PUthJiYoS2E9RShuYSxZYSkpLHphPXphP0UobmEsWWEpOkthLHphLndpZHRoPW5hLHphLmhlaWdodD1ZYSx6YS5nZXRDb250ZXh0KCIyZCIpLmRyYXdJbWFnZShpYSwwLDAsbmEsWWEpLGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBoYXMgYmVlbiByZXNpemVkIGZyb20gKCIraWEud2lkdGgrIngiK2lhLmhlaWdodCsiKSB0byAoIituYSsieCIrWWErIikuIiksCnphOyJkYXRhImluIGlhJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEltYWdlIGluIERhdGFUZXh0dXJlIGlzIHRvbyBiaWcgKCIraWEud2lkdGgrIngiK2lhLmhlaWdodCsiKS4iKX1yZXR1cm4gaWF9ZnVuY3Rpb24gSihpYSl7cmV0dXJuIGhiLmlzUG93ZXJPZlR3byhpYS53aWR0aCkmJmhiLmlzUG93ZXJPZlR3byhpYS5oZWlnaHQpfWZ1bmN0aW9uIFAoaWEpe3JldHVybiByLmlzV2ViR0wyPyExOjEwMDEhPT1pYS53cmFwU3x8MTAwMSE9PWlhLndyYXBUfHwxMDAzIT09aWEubWluRmlsdGVyJiYxMDA2IT09aWEubWluRmlsdGVyfWZ1bmN0aW9uIFIoaWEsbmEpe3JldHVybiBpYS5nZW5lcmF0ZU1pcG1hcHMmJm5hJiYxMDAzIT09aWEubWluRmlsdGVyJiYxMDA2IT09aWEubWluRmlsdGVyfWZ1bmN0aW9uIFMoaWEsbmEsemEsSmEpe2EuZ2VuZXJhdGVNaXBtYXAoaWEpO2cuZ2V0KG5hKS5fX21heE1pcExldmVsPU1hdGgubG9nKE1hdGgubWF4KHphLEphKSkqTWF0aC5MT0cyRX0KZnVuY3Rpb24gVihpYSxuYSl7aWYoIXIuaXNXZWJHTDIpcmV0dXJuIGlhO3ZhciB6YT1pYTs2NDAzPT09aWEmJig1MTI2PT09bmEmJih6YT0zMzMyNiksNTEzMT09PW5hJiYoemE9MzMzMjUpLDUxMjE9PT1uYSYmKHphPTMzMzIxKSk7NjQwNz09PWlhJiYoNTEyNj09PW5hJiYoemE9MzQ4MzcpLDUxMzE9PT1uYSYmKHphPTM0ODQzKSw1MTIxPT09bmEmJih6YT0zMjg0OSkpOzY0MDg9PT1pYSYmKDUxMjY9PT1uYSYmKHphPTM0ODM2KSw1MTMxPT09bmEmJih6YT0zNDg0MiksNTEyMT09PW5hJiYoemE9MzI4NTYpKTszMzMyNT09PXphfHwzMzMyNj09PXphfHwzNDg0Mj09PXphfHwzNDgzNj09PXphP2MuZ2V0KCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0Iik6KDM0ODQzPT09emF8fDM0ODM3PT09emEpJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEZsb2F0aW5nIHBvaW50IHRleHR1cmVzIHdpdGggUkdCIGZvcm1hdCBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIFJHQkEgaW5zdGVhZC4iKTsKcmV0dXJuIHphfWZ1bmN0aW9uIFcoaWEpe3JldHVybiAxMDAzPT09aWF8fDEwMDQ9PT1pYXx8MTAwNT09PWlhPzk3Mjg6OTcyOX1mdW5jdGlvbiBoYShpYSl7aWE9aWEudGFyZ2V0O2lhLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGhhKTtyYShpYSk7aWEuaXNWaWRlb1RleHR1cmUmJnRiLmRlbGV0ZShpYSk7ei5tZW1vcnkudGV4dHVyZXMtLX1mdW5jdGlvbiBmYShpYSl7aWE9aWEudGFyZ2V0O2lhLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGZhKTtwYShpYSk7ei5tZW1vcnkudGV4dHVyZXMtLX1mdW5jdGlvbiByYShpYSl7dmFyIG5hPWcuZ2V0KGlhKTt2b2lkIDAhPT1uYS5fX3dlYmdsSW5pdCYmKGEuZGVsZXRlVGV4dHVyZShuYS5fX3dlYmdsVGV4dHVyZSksZy5yZW1vdmUoaWEpKX1mdW5jdGlvbiBwYShpYSl7dmFyIG5hPWcuZ2V0KGlhKSx6YT1nLmdldChpYS50ZXh0dXJlKTtpZihpYSl7dm9pZCAwIT09emEuX193ZWJnbFRleHR1cmUmJmEuZGVsZXRlVGV4dHVyZSh6YS5fX3dlYmdsVGV4dHVyZSk7CmlhLmRlcHRoVGV4dHVyZSYmaWEuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKTtpZihpYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSlmb3IoemE9MDs2PnphO3phKyspYS5kZWxldGVGcmFtZWJ1ZmZlcihuYS5fX3dlYmdsRnJhbWVidWZmZXJbemFdKSxuYS5fX3dlYmdsRGVwdGhidWZmZXImJmEuZGVsZXRlUmVuZGVyYnVmZmVyKG5hLl9fd2ViZ2xEZXB0aGJ1ZmZlclt6YV0pO2Vsc2UgYS5kZWxldGVGcmFtZWJ1ZmZlcihuYS5fX3dlYmdsRnJhbWVidWZmZXIpLG5hLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmYS5kZWxldGVSZW5kZXJidWZmZXIobmEuX193ZWJnbERlcHRoYnVmZmVyKTtnLnJlbW92ZShpYS50ZXh0dXJlKTtnLnJlbW92ZShpYSl9fWZ1bmN0aW9uIHFhKGlhLG5hKXt2YXIgemE9Zy5nZXQoaWEpO2lhLmlzVmlkZW9UZXh0dXJlJiZkYihpYSk7aWYoMDxpYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1pYS52ZXJzaW9uKXt2YXIgSmE9aWEuaW1hZ2U7aWYodm9pZCAwPT09SmEpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyB1bmRlZmluZWQiKTsKZWxzZSBpZighMT09PUphLmNvbXBsZXRlKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZSIpO2Vsc2V7VGEoemEsaWEsbmEpO3JldHVybn19ZS5hY3RpdmVUZXh0dXJlKDMzOTg0K25hKTtlLmJpbmRUZXh0dXJlKDM1NTMsemEuX193ZWJnbFRleHR1cmUpfWZ1bmN0aW9uIHVhKGlhLG5hKXtpZig2PT09aWEuaW1hZ2UubGVuZ3RoKXt2YXIgemE9Zy5nZXQoaWEpO2lmKDA8aWEudmVyc2lvbiYmemEuX192ZXJzaW9uIT09aWEudmVyc2lvbil7QmEoemEsaWEpO2UuYWN0aXZlVGV4dHVyZSgzMzk4NCtuYSk7ZS5iaW5kVGV4dHVyZSgzNDA2Nyx6YS5fX3dlYmdsVGV4dHVyZSk7YS5waXhlbFN0b3JlaSgzNzQ0MCxpYS5mbGlwWSk7dmFyIEphPWlhJiZpYS5pc0NvbXByZXNzZWRUZXh0dXJlO25hPWlhLmltYWdlWzBdJiZpYS5pbWFnZVswXS5pc0RhdGFUZXh0dXJlO2Zvcih2YXIgWWE9W10sCk5hPTA7Nj5OYTtOYSsrKVlhW05hXT1KYXx8bmE/bmE/aWEuaW1hZ2VbTmFdLmltYWdlOmlhLmltYWdlW05hXTpHKGlhLmltYWdlW05hXSwhMSwhMCxyLm1heEN1YmVtYXBTaXplKTt2YXIgY2I9WWFbMF0samE9SihjYil8fHIuaXNXZWJHTDIsR2E9di5jb252ZXJ0KGlhLmZvcm1hdCksTGE9di5jb252ZXJ0KGlhLnR5cGUpLG5iPVYoR2EsTGEpO3RhKDM0MDY3LGlhLGphKTtpZihKYSl7Zm9yKE5hPTA7Nj5OYTtOYSsrKXt2YXIgVmE9WWFbTmFdLm1pcG1hcHM7Zm9yKEphPTA7SmE8VmEubGVuZ3RoO0phKyspe3ZhciBpYj1WYVtKYV07MTAyMyE9PWlhLmZvcm1hdCYmMTAyMiE9PWlhLmZvcm1hdD8tMTxlLmdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpLmluZGV4T2YoR2EpP2UuY29tcHJlc3NlZFRleEltYWdlMkQoMzQwNjkrTmEsSmEsbmIsaWIud2lkdGgsaWIuaGVpZ2h0LDAsaWIuZGF0YSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKSIpOgplLnRleEltYWdlMkQoMzQwNjkrTmEsSmEsbmIsaWIud2lkdGgsaWIuaGVpZ2h0LDAsR2EsTGEsaWIuZGF0YSl9fXphLl9fbWF4TWlwTGV2ZWw9VmEubGVuZ3RoLTF9ZWxzZXtWYT1pYS5taXBtYXBzO2ZvcihOYT0wOzY+TmE7TmErKylpZihuYSlmb3IoZS50ZXhJbWFnZTJEKDM0MDY5K05hLDAsbmIsWWFbTmFdLndpZHRoLFlhW05hXS5oZWlnaHQsMCxHYSxMYSxZYVtOYV0uZGF0YSksSmE9MDtKYTxWYS5sZW5ndGg7SmErKylpYj1WYVtKYV0saWI9aWIuaW1hZ2VbTmFdLmltYWdlLGUudGV4SW1hZ2UyRCgzNDA2OStOYSxKYSsxLG5iLGliLndpZHRoLGliLmhlaWdodCwwLEdhLExhLGliLmRhdGEpO2Vsc2UgZm9yKGUudGV4SW1hZ2UyRCgzNDA2OStOYSwwLG5iLEdhLExhLFlhW05hXSksSmE9MDtKYTxWYS5sZW5ndGg7SmErKylpYj1WYVtKYV0sZS50ZXhJbWFnZTJEKDM0MDY5K05hLEphKzEsbmIsR2EsTGEsaWIuaW1hZ2VbTmFdKTt6YS5fX21heE1pcExldmVsPVZhLmxlbmd0aH1SKGlhLApqYSkmJlMoMzQwNjcsaWEsY2Iud2lkdGgsY2IuaGVpZ2h0KTt6YS5fX3ZlcnNpb249aWEudmVyc2lvbjtpZihpYS5vblVwZGF0ZSlpYS5vblVwZGF0ZShpYSl9ZWxzZSBlLmFjdGl2ZVRleHR1cmUoMzM5ODQrbmEpLGUuYmluZFRleHR1cmUoMzQwNjcsemEuX193ZWJnbFRleHR1cmUpfX1mdW5jdGlvbiBvYShpYSxuYSl7ZS5hY3RpdmVUZXh0dXJlKDMzOTg0K25hKTtlLmJpbmRUZXh0dXJlKDM0MDY3LGcuZ2V0KGlhKS5fX3dlYmdsVGV4dHVyZSl9ZnVuY3Rpb24gdGEoaWEsbmEsemEpe3phPyhhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDIsdi5jb252ZXJ0KG5hLndyYXBTKSksYS50ZXhQYXJhbWV0ZXJpKGlhLDEwMjQzLHYuY29udmVydChuYS53cmFwVCkpLDMyODc5IT09aWEmJjM1ODY2IT09aWF8fGEudGV4UGFyYW1ldGVyaShpYSwzMjg4Mix2LmNvbnZlcnQobmEud3JhcFIpKSxhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDAsdi5jb252ZXJ0KG5hLm1hZ0ZpbHRlcikpLGEudGV4UGFyYW1ldGVyaShpYSwKMTAyNDEsdi5jb252ZXJ0KG5hLm1pbkZpbHRlcikpKTooYS50ZXhQYXJhbWV0ZXJpKGlhLDEwMjQyLDMzMDcxKSxhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDMsMzMwNzEpLDMyODc5IT09aWEmJjM1ODY2IT09aWF8fGEudGV4UGFyYW1ldGVyaShpYSwzMjg4MiwzMzA3MSksMTAwMT09PW5hLndyYXBTJiYxMDAxPT09bmEud3JhcFR8fGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLndyYXBTIGFuZCBUZXh0dXJlLndyYXBUIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuQ2xhbXBUb0VkZ2VXcmFwcGluZy4iKSxhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDAsVyhuYS5tYWdGaWx0ZXIpKSxhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDEsVyhuYS5taW5GaWx0ZXIpKSwxMDAzIT09bmEubWluRmlsdGVyJiYxMDA2IT09bmEubWluRmlsdGVyJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS5taW5GaWx0ZXIgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5OZWFyZXN0RmlsdGVyIG9yIFRIUkVFLkxpbmVhckZpbHRlci4iKSk7CiEoemE9Yy5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpKXx8MTAxNT09PW5hLnR5cGUmJm51bGw9PT1jLmdldCgiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIil8fDEwMTY9PT1uYS50eXBlJiZudWxsPT09KHIuaXNXZWJHTDJ8fGMuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpKXx8ISgxPG5hLmFuaXNvdHJvcHl8fGcuZ2V0KG5hKS5fX2N1cnJlbnRBbmlzb3Ryb3B5KXx8KGEudGV4UGFyYW1ldGVyZihpYSx6YS5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCxNYXRoLm1pbihuYS5hbmlzb3Ryb3B5LHIuZ2V0TWF4QW5pc290cm9weSgpKSksZy5nZXQobmEpLl9fY3VycmVudEFuaXNvdHJvcHk9bmEuYW5pc290cm9weSl9ZnVuY3Rpb24gQmEoaWEsbmEpe3ZvaWQgMD09PWlhLl9fd2ViZ2xJbml0JiYoaWEuX193ZWJnbEluaXQ9ITAsbmEuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaGEpLGlhLl9fd2ViZ2xUZXh0dXJlPWEuY3JlYXRlVGV4dHVyZSgpLAp6Lm1lbW9yeS50ZXh0dXJlcysrKX1mdW5jdGlvbiBUYShpYSxuYSx6YSl7dmFyIEphPTM1NTM7bmEuaXNEYXRhVGV4dHVyZTJEQXJyYXkmJihKYT0zNTg2Nik7bmEuaXNEYXRhVGV4dHVyZTNEJiYoSmE9MzI4NzkpO0JhKGlhLG5hKTtlLmFjdGl2ZVRleHR1cmUoMzM5ODQremEpO2UuYmluZFRleHR1cmUoSmEsaWEuX193ZWJnbFRleHR1cmUpO2EucGl4ZWxTdG9yZWkoMzc0NDAsbmEuZmxpcFkpO2EucGl4ZWxTdG9yZWkoMzc0NDEsbmEucHJlbXVsdGlwbHlBbHBoYSk7YS5waXhlbFN0b3JlaSgzMzE3LG5hLnVucGFja0FsaWdubWVudCk7emE9UChuYSkmJiExPT09SihuYS5pbWFnZSk7emE9RyhuYS5pbWFnZSx6YSwhMSxyLm1heFRleHR1cmVTaXplKTt2YXIgWWE9Sih6YSl8fHIuaXNXZWJHTDIsTmE9di5jb252ZXJ0KG5hLmZvcm1hdCksY2I9di5jb252ZXJ0KG5hLnR5cGUpLGphPVYoTmEsY2IpO3RhKEphLG5hLFlhKTt2YXIgR2E9bmEubWlwbWFwcztpZihuYS5pc0RlcHRoVGV4dHVyZSl7amE9CjY0MDI7aWYoMTAxNT09PW5hLnR5cGUpe2lmKCFyLmlzV2ViR0wyKXRocm93IEVycm9yKCJGbG9hdCBEZXB0aCBUZXh0dXJlIG9ubHkgc3VwcG9ydGVkIGluIFdlYkdMMi4wIik7amE9MzYwMTJ9ZWxzZSByLmlzV2ViR0wyJiYoamE9MzMxODkpOzEwMjY9PT1uYS5mb3JtYXQmJjY0MDI9PT1qYSYmMTAxMiE9PW5hLnR5cGUmJjEwMTQhPT1uYS50eXBlJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRTaG9ydFR5cGUgb3IgVW5zaWduZWRJbnRUeXBlIGZvciBEZXB0aEZvcm1hdCBEZXB0aFRleHR1cmUuIiksbmEudHlwZT0xMDEyLGNiPXYuY29udmVydChuYS50eXBlKSk7MTAyNz09PW5hLmZvcm1hdCYmKGphPTM0MDQxLDEwMjAhPT1uYS50eXBlJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRJbnQyNDhUeXBlIGZvciBEZXB0aFN0ZW5jaWxGb3JtYXQgRGVwdGhUZXh0dXJlLiIpLG5hLnR5cGU9MTAyMCxjYj0Kdi5jb252ZXJ0KG5hLnR5cGUpKSk7ZS50ZXhJbWFnZTJEKDM1NTMsMCxqYSx6YS53aWR0aCx6YS5oZWlnaHQsMCxOYSxjYixudWxsKX1lbHNlIGlmKG5hLmlzRGF0YVRleHR1cmUpaWYoMDxHYS5sZW5ndGgmJllhKXtmb3IodmFyIExhPTAsbmI9R2EubGVuZ3RoO0xhPG5iO0xhKyspSmE9R2FbTGFdLGUudGV4SW1hZ2UyRCgzNTUzLExhLGphLEphLndpZHRoLEphLmhlaWdodCwwLE5hLGNiLEphLmRhdGEpO25hLmdlbmVyYXRlTWlwbWFwcz0hMTtpYS5fX21heE1pcExldmVsPUdhLmxlbmd0aC0xfWVsc2UgZS50ZXhJbWFnZTJEKDM1NTMsMCxqYSx6YS53aWR0aCx6YS5oZWlnaHQsMCxOYSxjYix6YS5kYXRhKSxpYS5fX21heE1pcExldmVsPTA7ZWxzZSBpZihuYS5pc0NvbXByZXNzZWRUZXh0dXJlKXtMYT0wO2ZvcihuYj1HYS5sZW5ndGg7TGE8bmI7TGErKylKYT1HYVtMYV0sMTAyMyE9PW5hLmZvcm1hdCYmMTAyMiE9PW5hLmZvcm1hdD8tMTxlLmdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpLmluZGV4T2YoTmEpPwplLmNvbXByZXNzZWRUZXhJbWFnZTJEKDM1NTMsTGEsamEsSmEud2lkdGgsSmEuaGVpZ2h0LDAsSmEuZGF0YSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpIik6ZS50ZXhJbWFnZTJEKDM1NTMsTGEsamEsSmEud2lkdGgsSmEuaGVpZ2h0LDAsTmEsY2IsSmEuZGF0YSk7aWEuX19tYXhNaXBMZXZlbD1HYS5sZW5ndGgtMX1lbHNlIGlmKG5hLmlzRGF0YVRleHR1cmUyREFycmF5KWUudGV4SW1hZ2UzRCgzNTg2NiwwLGphLHphLndpZHRoLHphLmhlaWdodCx6YS5kZXB0aCwwLE5hLGNiLHphLmRhdGEpLGlhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKG5hLmlzRGF0YVRleHR1cmUzRCllLnRleEltYWdlM0QoMzI4NzksMCxqYSx6YS53aWR0aCx6YS5oZWlnaHQsemEuZGVwdGgsMCxOYSxjYix6YS5kYXRhKSxpYS5fX21heE1pcExldmVsPTA7ZWxzZSBpZigwPApHYS5sZW5ndGgmJllhKXtMYT0wO2ZvcihuYj1HYS5sZW5ndGg7TGE8bmI7TGErKylKYT1HYVtMYV0sZS50ZXhJbWFnZTJEKDM1NTMsTGEsamEsTmEsY2IsSmEpO25hLmdlbmVyYXRlTWlwbWFwcz0hMTtpYS5fX21heE1pcExldmVsPUdhLmxlbmd0aC0xfWVsc2UgZS50ZXhJbWFnZTJEKDM1NTMsMCxqYSxOYSxjYix6YSksaWEuX19tYXhNaXBMZXZlbD0wO1IobmEsWWEpJiZTKDM1NTMsbmEsemEud2lkdGgsemEuaGVpZ2h0KTtpYS5fX3ZlcnNpb249bmEudmVyc2lvbjtpZihuYS5vblVwZGF0ZSluYS5vblVwZGF0ZShuYSl9ZnVuY3Rpb24gVWEoaWEsbmEsemEsSmEpe3ZhciBZYT12LmNvbnZlcnQobmEudGV4dHVyZS5mb3JtYXQpLE5hPXYuY29udmVydChuYS50ZXh0dXJlLnR5cGUpLGNiPVYoWWEsTmEpO2UudGV4SW1hZ2UyRChKYSwwLGNiLG5hLndpZHRoLG5hLmhlaWdodCwwLFlhLE5hLG51bGwpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLGlhKTthLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLAp6YSxKYSxnLmdldChuYS50ZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSwwKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKX1mdW5jdGlvbiBDYShpYSxuYSx6YSl7YS5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLGlhKTtpZihuYS5kZXB0aEJ1ZmZlciYmIW5hLnN0ZW5jaWxCdWZmZXIpemE/KHphPU1hKG5hKSxhLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSx6YSwzMzE4OSxuYS53aWR0aCxuYS5oZWlnaHQpKTphLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoMzYxNjEsMzMxODksbmEud2lkdGgsbmEuaGVpZ2h0KSxhLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKDM2MTYwLDM2MDk2LDM2MTYxLGlhKTtlbHNlIGlmKG5hLmRlcHRoQnVmZmVyJiZuYS5zdGVuY2lsQnVmZmVyKXphPyh6YT1NYShuYSksYS5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoMzYxNjEsemEsMzUwNTYsbmEud2lkdGgsbmEuaGVpZ2h0KSk6YS5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLDM0MDQxLApuYS53aWR0aCxuYS5oZWlnaHQpLGEuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzMzMDYsMzYxNjEsaWEpO2Vsc2V7aWE9di5jb252ZXJ0KG5hLnRleHR1cmUuZm9ybWF0KTt2YXIgSmE9di5jb252ZXJ0KG5hLnRleHR1cmUudHlwZSk7aWE9VihpYSxKYSk7emE/KHphPU1hKG5hKSxhLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSx6YSxpYSxuYS53aWR0aCxuYS5oZWlnaHQpKTphLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoMzYxNjEsaWEsbmEud2lkdGgsbmEuaGVpZ2h0KX1hLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsbnVsbCl9ZnVuY3Rpb24gSGEoaWEsbmEpe2lmKG5hJiZuYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSl0aHJvdyBFcnJvcigiRGVwdGggVGV4dHVyZSB3aXRoIGN1YmUgcmVuZGVyIHRhcmdldHMgaXMgbm90IHN1cHBvcnRlZCIpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLGlhKTtpZighbmEuZGVwdGhUZXh0dXJlfHwhbmEuZGVwdGhUZXh0dXJlLmlzRGVwdGhUZXh0dXJlKXRocm93IEVycm9yKCJyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRGVwdGhUZXh0dXJlIik7CmcuZ2V0KG5hLmRlcHRoVGV4dHVyZSkuX193ZWJnbFRleHR1cmUmJm5hLmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aD09PW5hLndpZHRoJiZuYS5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0PT09bmEuaGVpZ2h0fHwobmEuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPW5hLndpZHRoLG5hLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQ9bmEuaGVpZ2h0LG5hLmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZT0hMCk7cWEobmEuZGVwdGhUZXh0dXJlLDApO2lhPWcuZ2V0KG5hLmRlcHRoVGV4dHVyZSkuX193ZWJnbFRleHR1cmU7aWYoMTAyNj09PW5hLmRlcHRoVGV4dHVyZS5mb3JtYXQpYS5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjA5NiwzNTUzLGlhLDApO2Vsc2UgaWYoMTAyNz09PW5hLmRlcHRoVGV4dHVyZS5mb3JtYXQpYS5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzMzMwNiwzNTUzLGlhLDApO2Vsc2UgdGhyb3cgRXJyb3IoIlVua25vd24gZGVwdGhUZXh0dXJlIGZvcm1hdCIpOwp9ZnVuY3Rpb24gRGEoaWEpe3ZhciBuYT1nLmdldChpYSksemE9ITA9PT1pYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZTtpZihpYS5kZXB0aFRleHR1cmUpe2lmKHphKXRocm93IEVycm9yKCJ0YXJnZXQuZGVwdGhUZXh0dXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ3ViZSByZW5kZXIgdGFyZ2V0cyIpO0hhKG5hLl9fd2ViZ2xGcmFtZWJ1ZmZlcixpYSl9ZWxzZSBpZih6YSlmb3IobmEuX193ZWJnbERlcHRoYnVmZmVyPVtdLHphPTA7Nj56YTt6YSsrKWEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG5hLl9fd2ViZ2xGcmFtZWJ1ZmZlclt6YV0pLG5hLl9fd2ViZ2xEZXB0aGJ1ZmZlclt6YV09YS5jcmVhdGVSZW5kZXJidWZmZXIoKSxDYShuYS5fX3dlYmdsRGVwdGhidWZmZXJbemFdLGlhKTtlbHNlIGEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG5hLl9fd2ViZ2xGcmFtZWJ1ZmZlciksbmEuX193ZWJnbERlcHRoYnVmZmVyPWEuY3JlYXRlUmVuZGVyYnVmZmVyKCksQ2EobmEuX193ZWJnbERlcHRoYnVmZmVyLAppYSk7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbnVsbCl9ZnVuY3Rpb24gTWEoaWEpe3JldHVybiByLmlzV2ViR0wyJiZpYS5pc1dlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ/TWF0aC5taW4oci5tYXhTYW1wbGVzLGlhLnNhbXBsZXMpOjB9ZnVuY3Rpb24gZGIoaWEpe3ZhciBuYT16LnJlbmRlci5mcmFtZTt0Yi5nZXQoaWEpIT09bmEmJih0Yi5zZXQoaWEsbmEpLGlhLnVwZGF0ZSgpKX12YXIgdGI9bmV3IFdlYWtNYXAsS2EsYmI9InVuZGVmaW5lZCIhPT10eXBlb2YgT2Zmc2NyZWVuQ2FudmFzLGpiPTAsRWI9ITEseGI9ITE7dGhpcy5hbGxvY2F0ZVRleHR1cmVVbml0PWZ1bmN0aW9uKCl7dmFyIGlhPWpiO2lhPj1yLm1heFRleHR1cmVzJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXM6IFRyeWluZyB0byB1c2UgIitpYSsiIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAiK3IubWF4VGV4dHVyZXMpO2piKz0xO3JldHVybiBpYX07dGhpcy5yZXNldFRleHR1cmVVbml0cz0KZnVuY3Rpb24oKXtqYj0wfTt0aGlzLnNldFRleHR1cmUyRD1xYTt0aGlzLnNldFRleHR1cmUyREFycmF5PWZ1bmN0aW9uKGlhLG5hKXt2YXIgemE9Zy5nZXQoaWEpOzA8aWEudmVyc2lvbiYmemEuX192ZXJzaW9uIT09aWEudmVyc2lvbj9UYSh6YSxpYSxuYSk6KGUuYWN0aXZlVGV4dHVyZSgzMzk4NCtuYSksZS5iaW5kVGV4dHVyZSgzNTg2Nix6YS5fX3dlYmdsVGV4dHVyZSkpfTt0aGlzLnNldFRleHR1cmUzRD1mdW5jdGlvbihpYSxuYSl7dmFyIHphPWcuZ2V0KGlhKTswPGlhLnZlcnNpb24mJnphLl9fdmVyc2lvbiE9PWlhLnZlcnNpb24/VGEoemEsaWEsbmEpOihlLmFjdGl2ZVRleHR1cmUoMzM5ODQrbmEpLGUuYmluZFRleHR1cmUoMzI4NzksemEuX193ZWJnbFRleHR1cmUpKX07dGhpcy5zZXRUZXh0dXJlQ3ViZT11YTt0aGlzLnNldFRleHR1cmVDdWJlRHluYW1pYz1vYTt0aGlzLnNldHVwUmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKGlhKXt2YXIgbmE9Zy5nZXQoaWEpLHphPWcuZ2V0KGlhLnRleHR1cmUpOwppYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixmYSk7emEuX193ZWJnbFRleHR1cmU9YS5jcmVhdGVUZXh0dXJlKCk7ei5tZW1vcnkudGV4dHVyZXMrKzt2YXIgSmE9ITA9PT1pYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSxZYT0hMD09PWlhLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCxOYT1KKGlhKXx8ci5pc1dlYkdMMjtpZihKYSlmb3IobmEuX193ZWJnbEZyYW1lYnVmZmVyPVtdLFlhPTA7Nj5ZYTtZYSsrKW5hLl9fd2ViZ2xGcmFtZWJ1ZmZlcltZYV09YS5jcmVhdGVGcmFtZWJ1ZmZlcigpO2Vsc2UgaWYobmEuX193ZWJnbEZyYW1lYnVmZmVyPWEuY3JlYXRlRnJhbWVidWZmZXIoKSxZYSlpZihyLmlzV2ViR0wyKXtuYS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI9YS5jcmVhdGVGcmFtZWJ1ZmZlcigpO25hLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcj1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO2EuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxuYS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpOwpZYT12LmNvbnZlcnQoaWEudGV4dHVyZS5mb3JtYXQpO3ZhciBjYj12LmNvbnZlcnQoaWEudGV4dHVyZS50eXBlKTtZYT1WKFlhLGNiKTtjYj1NYShpYSk7YS5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoMzYxNjEsY2IsWWEsaWEud2lkdGgsaWEuaGVpZ2h0KTthLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxuYS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpO2EuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwNjQsMzYxNjEsbmEuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyKTthLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsbnVsbCk7aWEuZGVwdGhCdWZmZXImJihuYS5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXI9YS5jcmVhdGVSZW5kZXJidWZmZXIoKSxDYShuYS5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsaWEsITApKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCBjYW4gb25seSBiZSB1c2VkIHdpdGggV2ViR0wyLiIpOwppZihKYSl7ZS5iaW5kVGV4dHVyZSgzNDA2Nyx6YS5fX3dlYmdsVGV4dHVyZSk7dGEoMzQwNjcsaWEudGV4dHVyZSxOYSk7Zm9yKFlhPTA7Nj5ZYTtZYSsrKVVhKG5hLl9fd2ViZ2xGcmFtZWJ1ZmZlcltZYV0saWEsMzYwNjQsMzQwNjkrWWEpO1IoaWEudGV4dHVyZSxOYSkmJlMoMzQwNjcsaWEudGV4dHVyZSxpYS53aWR0aCxpYS5oZWlnaHQpO2UuYmluZFRleHR1cmUoMzQwNjcsbnVsbCl9ZWxzZSBlLmJpbmRUZXh0dXJlKDM1NTMsemEuX193ZWJnbFRleHR1cmUpLHRhKDM1NTMsaWEudGV4dHVyZSxOYSksVWEobmEuX193ZWJnbEZyYW1lYnVmZmVyLGlhLDM2MDY0LDM1NTMpLFIoaWEudGV4dHVyZSxOYSkmJlMoMzU1MyxpYS50ZXh0dXJlLGlhLndpZHRoLGlhLmhlaWdodCksZS5iaW5kVGV4dHVyZSgzNTUzLG51bGwpO2lhLmRlcHRoQnVmZmVyJiZEYShpYSl9O3RoaXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwPWZ1bmN0aW9uKGlhKXt2YXIgbmE9aWEudGV4dHVyZSx6YT1KKGlhKXx8CnIuaXNXZWJHTDI7aWYoUihuYSx6YSkpe3phPWlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPzM0MDY3OjM1NTM7dmFyIEphPWcuZ2V0KG5hKS5fX3dlYmdsVGV4dHVyZTtlLmJpbmRUZXh0dXJlKHphLEphKTtTKHphLG5hLGlhLndpZHRoLGlhLmhlaWdodCk7ZS5iaW5kVGV4dHVyZSh6YSxudWxsKX19O3RoaXMudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oaWEpe2lmKGlhLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldClpZihyLmlzV2ViR0wyKXt2YXIgbmE9Zy5nZXQoaWEpO2EuYmluZEZyYW1lYnVmZmVyKDM2MDA4LG5hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7YS5iaW5kRnJhbWVidWZmZXIoMzYwMDksbmEuX193ZWJnbEZyYW1lYnVmZmVyKTtuYT1pYS53aWR0aDt2YXIgemE9aWEuaGVpZ2h0LEphPTE2Mzg0O2lhLmRlcHRoQnVmZmVyJiYoSmF8PTI1Nik7aWEuc3RlbmNpbEJ1ZmZlciYmKEphfD0xMDI0KTthLmJsaXRGcmFtZWJ1ZmZlcigwLAowLG5hLHphLDAsMCxuYSx6YSxKYSw5NzI4KX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCBjYW4gb25seSBiZSB1c2VkIHdpdGggV2ViR0wyLiIpfTt0aGlzLnNhZmVTZXRUZXh0dXJlMkQ9ZnVuY3Rpb24oaWEsbmEpe2lhJiZpYS5pc1dlYkdMUmVuZGVyVGFyZ2V0JiYoITE9PT1FYiYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlcy5zYWZlU2V0VGV4dHVyZTJEOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLiIpLEViPSEwKSxpYT1pYS50ZXh0dXJlKTtxYShpYSxuYSl9O3RoaXMuc2FmZVNldFRleHR1cmVDdWJlPWZ1bmN0aW9uKGlhLG5hKXtpYSYmaWEuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUmJighMT09PXhiJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlQ3ViZTogZG9uJ3QgdXNlIGN1YmUgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLiIpLAp4Yj0hMCksaWE9aWEudGV4dHVyZSk7aWEmJmlhLmlzQ3ViZVRleHR1cmV8fEFycmF5LmlzQXJyYXkoaWEuaW1hZ2UpJiY2PT09aWEuaW1hZ2UubGVuZ3RoP3VhKGlhLG5hKTpvYShpYSxuYSl9fWZ1bmN0aW9uIHdqKGEsYyxlKXtyZXR1cm57Y29udmVydDpmdW5jdGlvbihnKXtpZigxRTM9PT1nKXJldHVybiAxMDQ5NztpZigxMDAxPT09ZylyZXR1cm4gMzMwNzE7aWYoMTAwMj09PWcpcmV0dXJuIDMzNjQ4O2lmKDEwMDM9PT1nKXJldHVybiA5NzI4O2lmKDEwMDQ9PT1nKXJldHVybiA5OTg0O2lmKDEwMDU9PT1nKXJldHVybiA5OTg2O2lmKDEwMDY9PT1nKXJldHVybiA5NzI5O2lmKDEwMDc9PT1nKXJldHVybiA5OTg1O2lmKDEwMDg9PT1nKXJldHVybiA5OTg3O2lmKDEwMDk9PT1nKXJldHVybiA1MTIxO2lmKDEwMTc9PT1nKXJldHVybiAzMjgxOTtpZigxMDE4PT09ZylyZXR1cm4gMzI4MjA7aWYoMTAxOT09PWcpcmV0dXJuIDMzNjM1O2lmKDEwMTA9PT1nKXJldHVybiA1MTIwO2lmKDEwMTE9PT0KZylyZXR1cm4gNTEyMjtpZigxMDEyPT09ZylyZXR1cm4gNTEyMztpZigxMDEzPT09ZylyZXR1cm4gNTEyNDtpZigxMDE0PT09ZylyZXR1cm4gNTEyNTtpZigxMDE1PT09ZylyZXR1cm4gNTEyNjtpZigxMDE2PT09Zyl7aWYoZS5pc1dlYkdMMilyZXR1cm4gNTEzMTt2YXIgcj1jLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpO2lmKG51bGwhPT1yKXJldHVybiByLkhBTEZfRkxPQVRfT0VTfWlmKDEwMjE9PT1nKXJldHVybiA2NDA2O2lmKDEwMjI9PT1nKXJldHVybiA2NDA3O2lmKDEwMjM9PT1nKXJldHVybiA2NDA4O2lmKDEwMjQ9PT1nKXJldHVybiA2NDA5O2lmKDEwMjU9PT1nKXJldHVybiA2NDEwO2lmKDEwMjY9PT1nKXJldHVybiA2NDAyO2lmKDEwMjc9PT1nKXJldHVybiAzNDA0MTtpZigxMDI4PT09ZylyZXR1cm4gNjQwMztpZigxMDA9PT1nKXJldHVybiAzMjc3NDtpZigxMDE9PT1nKXJldHVybiAzMjc3ODtpZigxMDI9PT1nKXJldHVybiAzMjc3OTtpZigyMDA9PT1nKXJldHVybiAwOwppZigyMDE9PT1nKXJldHVybiAxO2lmKDIwMj09PWcpcmV0dXJuIDc2ODtpZigyMDM9PT1nKXJldHVybiA3Njk7aWYoMjA0PT09ZylyZXR1cm4gNzcwO2lmKDIwNT09PWcpcmV0dXJuIDc3MTtpZigyMDY9PT1nKXJldHVybiA3NzI7aWYoMjA3PT09ZylyZXR1cm4gNzczO2lmKDIwOD09PWcpcmV0dXJuIDc3NDtpZigyMDk9PT1nKXJldHVybiA3NzU7aWYoMjEwPT09ZylyZXR1cm4gNzc2O2lmKDMzNzc2PT09Z3x8MzM3Nzc9PT1nfHwzMzc3OD09PWd8fDMzNzc5PT09ZylpZihyPWMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpLG51bGwhPT1yKXtpZigzMzc3Nj09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDtpZigzMzc3Nz09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7aWYoMzM3Nzg9PT1nKXJldHVybiByLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUO2lmKDMzNzc5PT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVH1pZigzNTg0MD09PQpnfHwzNTg0MT09PWd8fDM1ODQyPT09Z3x8MzU4NDM9PT1nKWlmKHI9Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpLG51bGwhPT1yKXtpZigzNTg0MD09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztpZigzNTg0MT09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRztpZigzNTg0Mj09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUc7aWYoMzU4NDM9PT1nKXJldHVybiByLkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HfWlmKDM2MTk2PT09ZyYmKHI9Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxIiksbnVsbCE9PXIpKXJldHVybiByLkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0w7aWYoMzc4MDg9PT1nfHwzNzgwOT09PWd8fDM3ODEwPT09Z3x8Mzc4MTE9PT1nfHwzNzgxMj09PWd8fDM3ODEzPT09Z3x8Mzc4MTQ9PT1nfHwzNzgxNT09PWd8fDM3ODE2PT09Cmd8fDM3ODE3PT09Z3x8Mzc4MTg9PT1nfHwzNzgxOT09PWd8fDM3ODIwPT09Z3x8Mzc4MjE9PT1nKWlmKHI9Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjIiksbnVsbCE9PXIpcmV0dXJuIGc7aWYoMTAzPT09Z3x8MTA0PT09Zyl7aWYoZS5pc1dlYkdMMil7aWYoMTAzPT09ZylyZXR1cm4gMzI3NzU7aWYoMTA0PT09ZylyZXR1cm4gMzI3NzZ9cj1jLmdldCgiRVhUX2JsZW5kX21pbm1heCIpO2lmKG51bGwhPT1yKXtpZigxMDM9PT1nKXJldHVybiByLk1JTl9FWFQ7aWYoMTA0PT09ZylyZXR1cm4gci5NQVhfRVhUfX1pZigxMDIwPT09Zyl7aWYoZS5pc1dlYkdMMilyZXR1cm4gMzQwNDI7cj1jLmdldCgiV0VCR0xfZGVwdGhfdGV4dHVyZSIpO2lmKG51bGwhPT1yKXJldHVybiByLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMfXJldHVybiAwfX19ZnVuY3Rpb24gdWUoKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJHcm91cCJ9ZnVuY3Rpb24gdmYoYSl7dmIuY2FsbCh0aGlzKTsKdGhpcy5jYW1lcmFzPWF8fFtdfWZ1bmN0aW9uIHhqKGEsYyxlKXt5ai5zZXRGcm9tTWF0cml4UG9zaXRpb24oYy5tYXRyaXhXb3JsZCk7emouc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUubWF0cml4V29ybGQpO3ZhciBnPXlqLmRpc3RhbmNlVG8oemopLHI9Yy5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLHY9ZS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLHo9clsxNF0vKHJbMTBdLTEpO2U9clsxNF0vKHJbMTBdKzEpO3ZhciBFPShyWzldKzEpL3JbNV0sRz0ocls5XS0xKS9yWzVdLEo9KHJbOF0tMSkvclswXSxQPSh2WzhdKzEpL3ZbMF07cj16Kko7dj16KlA7UD1nLygtSitQKTtKPVAqLUo7Yy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoYS5wb3NpdGlvbixhLnF1YXRlcm5pb24sYS5zY2FsZSk7YS50cmFuc2xhdGVYKEopO2EudHJhbnNsYXRlWihQKTthLm1hdHJpeFdvcmxkLmNvbXBvc2UoYS5wb3NpdGlvbixhLnF1YXRlcm5pb24sYS5zY2FsZSk7YS5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZShhLm1hdHJpeFdvcmxkKTsKYz16K1A7ej1lK1A7YS5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZShyLUosdisoZy1KKSxFKmUveipjLEcqZS96KmMsYyx6KX1mdW5jdGlvbiBOaChhKXtmdW5jdGlvbiBjKCl7cmV0dXJuIG51bGwhPT1KJiYhMD09PUouaXNQcmVzZW50aW5nfWZ1bmN0aW9uIGUoKXtpZihjKCkpe3ZhciBIYT1KLmdldEV5ZVBhcmFtZXRlcnMoImxlZnQiKTt6PTIqSGEucmVuZGVyV2lkdGgqaGE7RT1IYS5yZW5kZXJIZWlnaHQqaGE7VGE9YS5nZXRQaXhlbFJhdGlvKCk7YS5nZXRTaXplKEJhKTthLnNldERyYXdpbmdCdWZmZXJTaXplKHosRSwxKTt1YS52aWV3cG9ydC5zZXQoMCwwLHovMixFKTtvYS52aWV3cG9ydC5zZXQoei8yLDAsei8yLEUpO0NhLnN0YXJ0KCk7Ry5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9ZWxzZSBHLmVuYWJsZWQmJmEuc2V0RHJhd2luZ0J1ZmZlclNpemUoQmEud2lkdGgsQmEuaGVpZ2h0LFRhKSxDYS5zdG9wKCksRy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uZW5kIn0pfQpmdW5jdGlvbiBnKEhhKXtmb3IodmFyIERhPW5hdmlnYXRvci5nZXRHYW1lcGFkcyYmbmF2aWdhdG9yLmdldEdhbWVwYWRzKCksTWE9MCxkYj0wLHRiPURhLmxlbmd0aDtNYTx0YjtNYSsrKXt2YXIgS2E9RGFbTWFdO2lmKEthJiYoIkRheWRyZWFtIENvbnRyb2xsZXIiPT09S2EuaWR8fCJHZWFyIFZSIENvbnRyb2xsZXIiPT09S2EuaWR8fCJPY3VsdXMgR28gQ29udHJvbGxlciI9PT1LYS5pZHx8Ik9wZW5WUiBHYW1lcGFkIj09PUthLmlkfHxLYS5pZC5zdGFydHNXaXRoKCJPY3VsdXMgVG91Y2giKXx8S2EuaWQuc3RhcnRzV2l0aCgiSFRDIFZpdmUgRm9jdXMiKXx8S2EuaWQuc3RhcnRzV2l0aCgiU3BhdGlhbCBDb250cm9sbGVyIikpKXtpZihkYj09PUhhKXJldHVybiBLYTtkYisrfX19ZnVuY3Rpb24gcigpe2Zvcih2YXIgSGE9MDtIYTxTLmxlbmd0aDtIYSsrKXt2YXIgRGE9U1tIYV0sTWE9ZyhIYSk7aWYodm9pZCAwIT09TWEmJnZvaWQgMCE9PU1hLnBvc2Upe2lmKG51bGw9PT1NYS5wb3NlKWJyZWFrOwp2YXIgZGI9TWEucG9zZTshMT09PWRiLmhhc1Bvc2l0aW9uJiZEYS5wb3NpdGlvbi5zZXQoLjIsLS42LC0uMDUpO251bGwhPT1kYi5wb3NpdGlvbiYmRGEucG9zaXRpb24uZnJvbUFycmF5KGRiLnBvc2l0aW9uKTtudWxsIT09ZGIub3JpZW50YXRpb24mJkRhLnF1YXRlcm5pb24uZnJvbUFycmF5KGRiLm9yaWVudGF0aW9uKTtEYS5tYXRyaXguY29tcG9zZShEYS5wb3NpdGlvbixEYS5xdWF0ZXJuaW9uLERhLnNjYWxlKTtEYS5tYXRyaXgucHJlbXVsdGlwbHkoVik7RGEubWF0cml4LmRlY29tcG9zZShEYS5wb3NpdGlvbixEYS5xdWF0ZXJuaW9uLERhLnNjYWxlKTtEYS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwO0RhLnZpc2libGU9ITA7ZGI9IkRheWRyZWFtIENvbnRyb2xsZXIiPT09TWEuaWQ/MDoxO3ZvaWQgMD09PVVhW0hhXSYmKFVhW0hhXT0hMSk7VWFbSGFdIT09TWEuYnV0dG9uc1tkYl0ucHJlc3NlZCYmKFVhW0hhXT1NYS5idXR0b25zW2RiXS5wcmVzc2VkLCEwPT09VWFbSGFdPwpEYS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZWxlY3RzdGFydCJ9KTooRGEuZGlzcGF0Y2hFdmVudCh7dHlwZToic2VsZWN0ZW5kIn0pLERhLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlbGVjdCJ9KSkpfWVsc2UgRGEudmlzaWJsZT0hMX19ZnVuY3Rpb24gdihIYSxEYSl7bnVsbCE9PURhJiY0PT09RGEubGVuZ3RoJiZIYS5zZXQoRGFbMF0qeixEYVsxXSpFLERhWzJdKnosRGFbM10qRSl9dmFyIHosRSxHPXRoaXMsSj1udWxsLFA9bnVsbCxSPW51bGwsUz1bXSxWPW5ldyBxLFc9bmV3IHEsaGE9MSxmYT0ibG9jYWwtZmxvb3IiOyJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdyYmIlZSRnJhbWVEYXRhImluIHdpbmRvdyYmKFA9bmV3IHdpbmRvdy5WUkZyYW1lRGF0YSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidnJkaXNwbGF5cHJlc2VudGNoYW5nZSIsZSwhMSkpO3ZhciByYT1uZXcgcSxwYT1uZXcgaCxxYT1uZXcgayx1YT1uZXcgdmI7dWEudmlld3BvcnQ9bmV3IHA7dWEubGF5ZXJzLmVuYWJsZSgxKTsKdmFyIG9hPW5ldyB2YjtvYS52aWV3cG9ydD1uZXcgcDtvYS5sYXllcnMuZW5hYmxlKDIpO3ZhciB0YT1uZXcgdmYoW3VhLG9hXSk7dGEubGF5ZXJzLmVuYWJsZSgxKTt0YS5sYXllcnMuZW5hYmxlKDIpO3ZhciBCYT1uZXcgZixUYSxVYT1bXTt0aGlzLmVuYWJsZWQ9ITE7dGhpcy5nZXRDb250cm9sbGVyPWZ1bmN0aW9uKEhhKXt2YXIgRGE9U1tIYV07dm9pZCAwPT09RGEmJihEYT1uZXcgdWUsRGEubWF0cml4QXV0b1VwZGF0ZT0hMSxEYS52aXNpYmxlPSExLFNbSGFdPURhKTtyZXR1cm4gRGF9O3RoaXMuZ2V0RGV2aWNlPWZ1bmN0aW9uKCl7cmV0dXJuIEp9O3RoaXMuc2V0RGV2aWNlPWZ1bmN0aW9uKEhhKXt2b2lkIDAhPT1IYSYmKEo9SGEpO0NhLnNldENvbnRleHQoSGEpfTt0aGlzLnNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3I9ZnVuY3Rpb24oSGEpe2hhPUhhfTt0aGlzLnNldFJlZmVyZW5jZVNwYWNlVHlwZT1mdW5jdGlvbihIYSl7ZmE9SGF9O3RoaXMuc2V0UG9zZVRhcmdldD1mdW5jdGlvbihIYSl7dm9pZCAwIT09CkhhJiYoUj1IYSl9O3RoaXMuZ2V0Q2FtZXJhPWZ1bmN0aW9uKEhhKXt2YXIgRGE9ImxvY2FsLWZsb29yIj09PWZhPzEuNjowO2lmKCExPT09YygpKXJldHVybiBIYS5wb3NpdGlvbi5zZXQoMCxEYSwwKSxIYS5yb3RhdGlvbi5zZXQoMCwwLDApLEhhO0ouZGVwdGhOZWFyPUhhLm5lYXI7Si5kZXB0aEZhcj1IYS5mYXI7Si5nZXRGcmFtZURhdGEoUCk7aWYoImxvY2FsLWZsb29yIj09PWZhKXt2YXIgTWE9Si5zdGFnZVBhcmFtZXRlcnM7TWE/Vi5mcm9tQXJyYXkoTWEuc2l0dGluZ1RvU3RhbmRpbmdUcmFuc2Zvcm0pOlYubWFrZVRyYW5zbGF0aW9uKDAsRGEsMCl9RGE9UC5wb3NlO01hPW51bGwhPT1SP1I6SGE7TWEubWF0cml4LmNvcHkoVik7TWEubWF0cml4LmRlY29tcG9zZShNYS5wb3NpdGlvbixNYS5xdWF0ZXJuaW9uLE1hLnNjYWxlKTtudWxsIT09RGEub3JpZW50YXRpb24mJihwYS5mcm9tQXJyYXkoRGEub3JpZW50YXRpb24pLE1hLnF1YXRlcm5pb24ubXVsdGlwbHkocGEpKTtudWxsIT09CkRhLnBvc2l0aW9uJiYocGEuc2V0RnJvbVJvdGF0aW9uTWF0cml4KFYpLHFhLmZyb21BcnJheShEYS5wb3NpdGlvbikscWEuYXBwbHlRdWF0ZXJuaW9uKHBhKSxNYS5wb3NpdGlvbi5hZGQocWEpKTtNYS51cGRhdGVNYXRyaXhXb3JsZCgpO3VhLm5lYXI9SGEubmVhcjtvYS5uZWFyPUhhLm5lYXI7dWEuZmFyPUhhLmZhcjtvYS5mYXI9SGEuZmFyO3VhLm1hdHJpeFdvcmxkSW52ZXJzZS5mcm9tQXJyYXkoUC5sZWZ0Vmlld01hdHJpeCk7b2EubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheShQLnJpZ2h0Vmlld01hdHJpeCk7Vy5nZXRJbnZlcnNlKFYpOyJsb2NhbC1mbG9vciI9PT1mYSYmKHVhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShXKSxvYS5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoVykpO0hhPU1hLnBhcmVudDtudWxsIT09SGEmJihyYS5nZXRJbnZlcnNlKEhhLm1hdHJpeFdvcmxkKSx1YS5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkocmEpLG9hLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShyYSkpOwp1YS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKHVhLm1hdHJpeFdvcmxkSW52ZXJzZSk7b2EubWF0cml4V29ybGQuZ2V0SW52ZXJzZShvYS5tYXRyaXhXb3JsZEludmVyc2UpO3VhLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KFAubGVmdFByb2plY3Rpb25NYXRyaXgpO29hLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KFAucmlnaHRQcm9qZWN0aW9uTWF0cml4KTt4aih0YSx1YSxvYSk7SGE9Si5nZXRMYXllcnMoKTtIYS5sZW5ndGgmJihIYT1IYVswXSx2KHVhLnZpZXdwb3J0LEhhLmxlZnRCb3VuZHMpLHYob2Eudmlld3BvcnQsSGEucmlnaHRCb3VuZHMpKTtyKCk7cmV0dXJuIHRhfTt0aGlzLmdldFN0YW5kaW5nTWF0cml4PWZ1bmN0aW9uKCl7cmV0dXJuIFZ9O3RoaXMuaXNQcmVzZW50aW5nPWM7dmFyIENhPW5ldyBiYzt0aGlzLnNldEFuaW1hdGlvbkxvb3A9ZnVuY3Rpb24oSGEpe0NhLnNldEFuaW1hdGlvbkxvb3AoSGEpO2MoKSYmQ2Euc3RhcnQoKX07dGhpcy5zdWJtaXRGcmFtZT0KZnVuY3Rpb24oKXtjKCkmJkouc3VibWl0RnJhbWUoKX07dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidnJkaXNwbGF5cHJlc2VudGNoYW5nZSIsZSl9O3RoaXMuc2V0RnJhbWVPZlJlZmVyZW5jZVR5cGU9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYlZSTWFuYWdlcjogc2V0RnJhbWVPZlJlZmVyZW5jZVR5cGUoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiIpfX1mdW5jdGlvbiBBaihhLGMpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PUcmJm51bGwhPT1KfWZ1bmN0aW9uIGcocWEpe2Zvcih2YXIgdWE9MDt1YTxTLmxlbmd0aDt1YSsrKVZbdWFdPT09cWEuaW5wdXRTb3VyY2UmJlNbdWFdLmRpc3BhdGNoRXZlbnQoe3R5cGU6cWEudHlwZX0pfWZ1bmN0aW9uIHIoKXthLnNldEZyYW1lYnVmZmVyKG51bGwpO2Euc2V0UmVuZGVyVGFyZ2V0KGEuZ2V0UmVuZGVyVGFyZ2V0KCkpOwpwYS5zdG9wKCk7RS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uZW5kIn0pfWZ1bmN0aW9uIHYocWEpe0o9cWE7cGEuc2V0Q29udGV4dChHKTtwYS5zdGFydCgpO0UuZGlzcGF0Y2hFdmVudCh7dHlwZToic2Vzc2lvbnN0YXJ0In0pfWZ1bmN0aW9uIHoocWEsdWEpe251bGw9PT11YT9xYS5tYXRyaXhXb3JsZC5jb3B5KHFhLm1hdHJpeCk6cWEubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh1YS5tYXRyaXhXb3JsZCxxYS5tYXRyaXgpO3FhLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKHFhLm1hdHJpeFdvcmxkKX12YXIgRT10aGlzLEc9bnVsbCxKPW51bGwsUD0ibG9jYWwtZmxvb3IiLFI9bnVsbCxTPVtdLFY9W10sVz1uZXcgdmI7Vy5sYXllcnMuZW5hYmxlKDEpO1cudmlld3BvcnQ9bmV3IHA7dmFyIGhhPW5ldyB2YjtoYS5sYXllcnMuZW5hYmxlKDIpO2hhLnZpZXdwb3J0PW5ldyBwO3ZhciBmYT1uZXcgdmYoW1csaGFdKTtmYS5sYXllcnMuZW5hYmxlKDEpO2ZhLmxheWVycy5lbmFibGUoMik7CnRoaXMuZW5hYmxlZD0hMTt0aGlzLmdldENvbnRyb2xsZXI9ZnVuY3Rpb24ocWEpe3ZhciB1YT1TW3FhXTt2b2lkIDA9PT11YSYmKHVhPW5ldyB1ZSx1YS5tYXRyaXhBdXRvVXBkYXRlPSExLHVhLnZpc2libGU9ITEsU1txYV09dWEpO3JldHVybiB1YX07dGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yPWZ1bmN0aW9uKCl7fTt0aGlzLnNldFJlZmVyZW5jZVNwYWNlVHlwZT1mdW5jdGlvbihxYSl7UD1xYX07dGhpcy5nZXRTZXNzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIEd9O3RoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihxYSl7Rz1xYTtudWxsIT09RyYmKEcuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0IixnKSxHLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdHN0YXJ0IixnKSxHLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVuZCIsZyksRy5hZGRFdmVudExpc3RlbmVyKCJlbmQiLHIpLEcudXBkYXRlUmVuZGVyU3RhdGUoe2Jhc2VMYXllcjpuZXcgWFJXZWJHTExheWVyKEcsYyl9KSxHLnJlcXVlc3RSZWZlcmVuY2VTcGFjZShQKS50aGVuKHYpLApWPUcuaW5wdXRTb3VyY2VzLEcuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXRzb3VyY2VzY2hhbmdlIixmdW5jdGlvbigpe1Y9Ry5pbnB1dFNvdXJjZXM7Y29uc29sZS5sb2coVik7Zm9yKHZhciB1YT0wO3VhPFMubGVuZ3RoO3VhKyspU1t1YV0udXNlckRhdGEuaW5wdXRTb3VyY2U9Vlt1YV19KSl9O3RoaXMuZ2V0Q2FtZXJhPWZ1bmN0aW9uKHFhKXtpZihlKCkpe3ZhciB1YT1xYS5wYXJlbnQsb2E9ZmEuY2FtZXJhczt6KGZhLHVhKTtmb3IodmFyIHRhPTA7dGE8b2EubGVuZ3RoO3RhKyspeihvYVt0YV0sdWEpO3FhLm1hdHJpeFdvcmxkLmNvcHkoZmEubWF0cml4V29ybGQpO3FhPXFhLmNoaWxkcmVuO3RhPTA7Zm9yKHVhPXFhLmxlbmd0aDt0YTx1YTt0YSsrKXFhW3RhXS51cGRhdGVNYXRyaXhXb3JsZCghMCk7eGooZmEsVyxoYSk7cmV0dXJuIGZhfXJldHVybiBxYX07dGhpcy5pc1ByZXNlbnRpbmc9ZTt2YXIgcmE9bnVsbCxwYT1uZXcgYmM7cGEuc2V0QW5pbWF0aW9uTG9vcChmdW5jdGlvbihxYSwKdWEpe1I9dWEuZ2V0Vmlld2VyUG9zZShKKTtpZihudWxsIT09Uil7dmFyIG9hPVIudmlld3MsdGE9Ry5yZW5kZXJTdGF0ZS5iYXNlTGF5ZXI7YS5zZXRGcmFtZWJ1ZmZlcih0YS5mcmFtZWJ1ZmZlcik7Zm9yKHZhciBCYT0wO0JhPG9hLmxlbmd0aDtCYSsrKXt2YXIgVGE9b2FbQmFdLFVhPXRhLmdldFZpZXdwb3J0KFRhKSxDYT1mYS5jYW1lcmFzW0JhXTtDYS5tYXRyaXguZnJvbUFycmF5KFRhLnRyYW5zZm9ybS5pbnZlcnNlLm1hdHJpeCkuZ2V0SW52ZXJzZShDYS5tYXRyaXgpO0NhLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KFRhLnByb2plY3Rpb25NYXRyaXgpO0NhLnZpZXdwb3J0LnNldChVYS54LFVhLnksVWEud2lkdGgsVWEuaGVpZ2h0KTswPT09QmEmJmZhLm1hdHJpeC5jb3B5KENhLm1hdHJpeCl9fWZvcihCYT0wO0JhPFMubGVuZ3RoO0JhKyspe29hPVNbQmFdO2lmKHRhPVZbQmFdKWlmKHRhPXVhLmdldFBvc2UodGEudGFyZ2V0UmF5U3BhY2UsSiksbnVsbCE9PXRhKXtvYS5tYXRyaXguZnJvbUFycmF5KHRhLnRyYW5zZm9ybS5tYXRyaXgpOwpvYS5tYXRyaXguZGVjb21wb3NlKG9hLnBvc2l0aW9uLG9hLnJvdGF0aW9uLG9hLnNjYWxlKTtvYS52aXNpYmxlPSEwO2NvbnRpbnVlfW9hLnZpc2libGU9ITF9cmEmJnJhKHFhKX0pO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihxYSl7cmE9cWF9O3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe307dGhpcy5nZXRTdGFuZGluZ01hdHJpeD1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViWFJNYW5hZ2VyOiBnZXRTdGFuZGluZ01hdHJpeCgpIGlzIG5vIGxvbmdlciBuZWVkZWQuIik7cmV0dXJuIG5ldyBxfTt0aGlzLmdldERldmljZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViWFJNYW5hZ2VyOiBnZXREZXZpY2UoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiIpfTt0aGlzLnNldERldmljZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViWFJNYW5hZ2VyOiBzZXREZXZpY2UoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiIpfTt0aGlzLnNldEZyYW1lT2ZSZWZlcmVuY2VUeXBlPQpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViWFJNYW5hZ2VyOiBzZXRGcmFtZU9mUmVmZXJlbmNlVHlwZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc3VibWl0RnJhbWU9ZnVuY3Rpb24oKXt9fWZ1bmN0aW9uIE9oKGEpe3ZhciBjO2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbD09PWliP2NjOjF9ZnVuY3Rpb24gZygpe0xiPW5ldyBiZChSYSk7ZGM9bmV3IE1iKFJhLExiLGEpO2RjLmlzV2ViR0wyfHwoTGIuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIiksTGIuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdCIpLExiLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpLExiLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIiKSxMYi5nZXQoIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpLExiLmdldCgiT0VTX2VsZW1lbnRfaW5kZXhfdWludCIpLExiLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpKTtMYi5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIpOwpOYz1uZXcgd2ooUmEsTGIsZGMpO3liPW5ldyBWbChSYSxMYixOYyxkYyk7eWIuc2Npc3NvcihTYi5jb3B5KHZlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSk7eWIudmlld3BvcnQoS2IuY29weSh3ZSkubXVsdGlwbHlTY2FsYXIoY2MpLmZsb29yKCkpO3hkPW5ldyBTayhSYSk7ZWM9bmV3IE1sO09jPW5ldyBXbChSYSxMYix5YixlYyxkYyxOYyx4ZCk7dmc9bmV3IE9kKFJhKTtQaD1uZXcgdGQoUmEsdmcseGQpO3hlPW5ldyBWayhQaCx4ZCk7Qmo9bmV3IFVrKFJhKTtQZD1uZXcgTGwoamEsTGIsZGMpO3dnPW5ldyBQbDt5ZT1uZXcgVWw7eWQ9bmV3IHNkKGphLHliLHhlLG5hKTtDaj1uZXcgc2EoUmEsTGIseGQsZGMpO0RqPW5ldyB0ZyhSYSxMYix4ZCxkYyk7eGQucHJvZ3JhbXM9UGQucHJvZ3JhbXM7amEuY2FwYWJpbGl0aWVzPWRjO2phLmV4dGVuc2lvbnM9TGI7amEucHJvcGVydGllcz1lYztqYS5yZW5kZXJMaXN0cz13ZztqYS5zdGF0ZT15YjtqYS5pbmZvPXhkfWZ1bmN0aW9uIHIoVSl7VS5wcmV2ZW50RGVmYXVsdCgpOwpjb25zb2xlLmxvZygiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LiIpO0dhPSEwfWZ1bmN0aW9uIHYoKXtjb25zb2xlLmxvZygiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBSZXN0b3JlZC4iKTtHYT0hMTtnKCl9ZnVuY3Rpb24geihVKXtVPVUudGFyZ2V0O1UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIseik7RShVKX1mdW5jdGlvbiBFKFUpe0coVSk7ZWMucmVtb3ZlKFUpfWZ1bmN0aW9uIEcoVSl7dmFyIGRhPWVjLmdldChVKS5wcm9ncmFtO1UucHJvZ3JhbT12b2lkIDA7dm9pZCAwIT09ZGEmJlBkLnJlbGVhc2VQcm9ncmFtKGRhKX1mdW5jdGlvbiBKKFUsZGEpe1UucmVuZGVyKGZ1bmN0aW9uKG1hKXtqYS5yZW5kZXJCdWZmZXJJbW1lZGlhdGUobWEsZGEpfSl9ZnVuY3Rpb24gUChVLGRhLG1hKXtpZihtYSYmbWEuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSYmIWRjLmlzV2ViR0wyJiZudWxsPT09TGIuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5zZXR1cFZlcnRleEF0dHJpYnV0ZXM6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLiIpOwplbHNle3liLmluaXRBdHRyaWJ1dGVzKCk7dmFyIElhPW1hLmF0dHJpYnV0ZXM7ZGE9ZGEuZ2V0QXR0cmlidXRlcygpO1U9VS5kZWZhdWx0QXR0cmlidXRlVmFsdWVzO2Zvcih2YXIgT2EgaW4gZGEpe3ZhciBhYj1kYVtPYV07aWYoMDw9YWIpe3ZhciBQYT1JYVtPYV07aWYodm9pZCAwIT09UGEpe3ZhciBmYj1QYS5ub3JtYWxpemVkLENiPVBhLml0ZW1TaXplLG9iPXZnLmdldChQYSk7aWYodm9pZCAwIT09b2Ipe3ZhciAkYT1vYi5idWZmZXIsUGM9b2IudHlwZTtvYj1vYi5ieXRlc1BlckVsZW1lbnQ7aWYoUGEuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl7dmFyIHhjPVBhLmRhdGEsemU9eGMuc3RyaWRlO1BhPVBhLm9mZnNldDt4YyYmeGMuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj8oeWIuZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcihhYix4Yy5tZXNoUGVyQXR0cmlidXRlKSx2b2lkIDA9PT1tYS5tYXhJbnN0YW5jZWRDb3VudCYmKG1hLm1heEluc3RhbmNlZENvdW50PQp4Yy5tZXNoUGVyQXR0cmlidXRlKnhjLmNvdW50KSk6eWIuZW5hYmxlQXR0cmlidXRlKGFiKTtSYS5iaW5kQnVmZmVyKDM0OTYyLCRhKTtSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGFiLENiLFBjLGZiLHplKm9iLFBhKm9iKX1lbHNlIFBhLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPyh5Yi5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKGFiLFBhLm1lc2hQZXJBdHRyaWJ1dGUpLHZvaWQgMD09PW1hLm1heEluc3RhbmNlZENvdW50JiYobWEubWF4SW5zdGFuY2VkQ291bnQ9UGEubWVzaFBlckF0dHJpYnV0ZSpQYS5jb3VudCkpOnliLmVuYWJsZUF0dHJpYnV0ZShhYiksUmEuYmluZEJ1ZmZlcigzNDk2MiwkYSksUmEudmVydGV4QXR0cmliUG9pbnRlcihhYixDYixQYyxmYiwwLDApfX1lbHNlIGlmKHZvaWQgMCE9PVUmJihmYj1VW09hXSx2b2lkIDAhPT1mYikpc3dpdGNoKGZiLmxlbmd0aCl7Y2FzZSAyOlJhLnZlcnRleEF0dHJpYjJmdihhYixmYik7YnJlYWs7Y2FzZSAzOlJhLnZlcnRleEF0dHJpYjNmdihhYiwKZmIpO2JyZWFrO2Nhc2UgNDpSYS52ZXJ0ZXhBdHRyaWI0ZnYoYWIsZmIpO2JyZWFrO2RlZmF1bHQ6UmEudmVydGV4QXR0cmliMWZ2KGFiLGZiKX19fXliLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCl9fWZ1bmN0aW9uIFIoVSxkYSxtYSxJYSl7aWYoITEhPT1VLnZpc2libGUpe2lmKFUubGF5ZXJzLnRlc3QoZGEubGF5ZXJzKSlpZihVLmlzR3JvdXApbWE9VS5yZW5kZXJPcmRlcjtlbHNlIGlmKFUuaXNMT0QpITA9PT1VLmF1dG9VcGRhdGUmJlUudXBkYXRlKGRhKTtlbHNlIGlmKFUuaXNMaWdodCljYi5wdXNoTGlnaHQoVSksVS5jYXN0U2hhZG93JiZjYi5wdXNoU2hhZG93KFUpO2Vsc2UgaWYoVS5pc1Nwcml0ZSl7aWYoIVUuZnJ1c3R1bUN1bGxlZHx8UWguaW50ZXJzZWN0c1Nwcml0ZShVKSl7SWEmJnpkLnNldEZyb21NYXRyaXhQb3NpdGlvbihVLm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQod2YpO3ZhciBPYT14ZS51cGRhdGUoVSksYWI9VS5tYXRlcmlhbDthYi52aXNpYmxlJiZOYS5wdXNoKFUsCk9hLGFiLG1hLHpkLnosbnVsbCl9fWVsc2UgaWYoVS5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdClJYSYmemQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFUubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NCh3ZiksTmEucHVzaChVLG51bGwsVS5tYXRlcmlhbCxtYSx6ZC56LG51bGwpO2Vsc2UgaWYoVS5pc01lc2h8fFUuaXNMaW5lfHxVLmlzUG9pbnRzKWlmKFUuaXNTa2lubmVkTWVzaCYmVS5za2VsZXRvbi51cGRhdGUoKSwhVS5mcnVzdHVtQ3VsbGVkfHxRaC5pbnRlcnNlY3RzT2JqZWN0KFUpKWlmKElhJiZ6ZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oVS5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KHdmKSxPYT14ZS51cGRhdGUoVSksYWI9VS5tYXRlcmlhbCxBcnJheS5pc0FycmF5KGFiKSlmb3IodmFyIFBhPU9hLmdyb3VwcyxmYj0wLENiPVBhLmxlbmd0aDtmYjxDYjtmYisrKXt2YXIgb2I9UGFbZmJdLCRhPWFiW29iLm1hdGVyaWFsSW5kZXhdOyRhJiYkYS52aXNpYmxlJiZOYS5wdXNoKFUsCk9hLCRhLG1hLHpkLnosb2IpfWVsc2UgYWIudmlzaWJsZSYmTmEucHVzaChVLE9hLGFiLG1hLHpkLnosbnVsbCk7VT1VLmNoaWxkcmVuO2ZiPTA7Zm9yKENiPVUubGVuZ3RoO2ZiPENiO2ZiKyspUihVW2ZiXSxkYSxtYSxJYSl9fWZ1bmN0aW9uIFMoVSxkYSxtYSxJYSl7Zm9yKHZhciBPYT0wLGFiPVUubGVuZ3RoO09hPGFiO09hKyspe3ZhciBQYT1VW09hXSxmYj1QYS5vYmplY3QsQ2I9UGEuZ2VvbWV0cnksb2I9dm9pZCAwPT09SWE/UGEubWF0ZXJpYWw6SWE7UGE9UGEuZ3JvdXA7aWYobWEuaXNBcnJheUNhbWVyYSl7c2I9bWE7Zm9yKHZhciAkYT1tYS5jYW1lcmFzLFBjPTAseGM9JGEubGVuZ3RoO1BjPHhjO1BjKyspe3ZhciB6ZT0kYVtQY107ZmIubGF5ZXJzLnRlc3QoemUubGF5ZXJzKSYmKHliLnZpZXdwb3J0KEtiLmNvcHkoemUudmlld3BvcnQpKSxjYi5zZXR1cExpZ2h0cyh6ZSksVihmYixkYSx6ZSxDYixvYixQYSkpfX1lbHNlIHNiPW51bGwsVihmYixkYSxtYSxDYixvYixQYSl9fQpmdW5jdGlvbiBWKFUsZGEsbWEsSWEsT2EsYWIpe1Uub25CZWZvcmVSZW5kZXIoamEsZGEsbWEsSWEsT2EsYWIpO2NiPXllLmdldChkYSxzYnx8bWEpO1UubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMobWEubWF0cml4V29ybGRJbnZlcnNlLFUubWF0cml4V29ybGQpO1Uubm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeChVLm1vZGVsVmlld01hdHJpeCk7VS5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdD8oeWIuc2V0TWF0ZXJpYWwoT2EpLElhPWhhKG1hLGRhLmZvZyxPYSxVKSxlYj1jPW51bGwsbWI9ITEsSihVLElhKSk6amEucmVuZGVyQnVmZmVyRGlyZWN0KG1hLGRhLmZvZyxJYSxPYSxVLGFiKTtjYj15ZS5nZXQoZGEsc2J8fG1hKX1mdW5jdGlvbiBXKFUsZGEsbWEpe3ZhciBJYT1lYy5nZXQoVSksT2E9Y2Iuc3RhdGUubGlnaHRzLGFiPU9hLnN0YXRlLnZlcnNpb247bWE9UGQuZ2V0UGFyYW1ldGVycyhVLE9hLnN0YXRlLGNiLnN0YXRlLnNoYWRvd3NBcnJheSxkYSx5Yy5udW1QbGFuZXMsCnljLm51bUludGVyc2VjdGlvbixtYSk7dmFyIFBhPVBkLmdldFByb2dyYW1Db2RlKFUsbWEpLGZiPUlhLnByb2dyYW0sQ2I9ITA7aWYodm9pZCAwPT09ZmIpVS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIix6KTtlbHNlIGlmKGZiLmNvZGUhPT1QYSlHKFUpO2Vsc2V7aWYoSWEubGlnaHRzU3RhdGVWZXJzaW9uIT09YWIpSWEubGlnaHRzU3RhdGVWZXJzaW9uPWFiO2Vsc2UgaWYodm9pZCAwIT09bWEuc2hhZGVySUQpcmV0dXJuO0NiPSExfUNiJiYobWEuc2hhZGVySUQ/KFBhPU1jW21hLnNoYWRlcklEXSxJYS5zaGFkZXI9e25hbWU6VS50eXBlLHVuaWZvcm1zOnViKFBhLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6UGEudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOlBhLmZyYWdtZW50U2hhZGVyfSk6SWEuc2hhZGVyPXtuYW1lOlUudHlwZSx1bmlmb3JtczpVLnVuaWZvcm1zLHZlcnRleFNoYWRlcjpVLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpVLmZyYWdtZW50U2hhZGVyfSwKUGE9UGQuZ2V0UHJvZ3JhbUNvZGUoVSxtYSksZmI9UGQuYWNxdWlyZVByb2dyYW0oVSxJYS5zaGFkZXIsbWEsUGEpLElhLnByb2dyYW09ZmIsVS5wcm9ncmFtPWZiKTttYT1mYi5nZXRBdHRyaWJ1dGVzKCk7aWYoVS5tb3JwaFRhcmdldHMpZm9yKFBhPVUubnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzPTA7UGE8amEubWF4TW9ycGhUYXJnZXRzO1BhKyspMDw9bWFbIm1vcnBoVGFyZ2V0IitQYV0mJlUubnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzKys7aWYoVS5tb3JwaE5vcm1hbHMpZm9yKFBhPVUubnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzPTA7UGE8amEubWF4TW9ycGhOb3JtYWxzO1BhKyspMDw9bWFbIm1vcnBoTm9ybWFsIitQYV0mJlUubnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzKys7bWE9SWEuc2hhZGVyLnVuaWZvcm1zO2lmKCFVLmlzU2hhZGVyTWF0ZXJpYWwmJiFVLmlzUmF3U2hhZGVyTWF0ZXJpYWx8fCEwPT09VS5jbGlwcGluZylJYS5udW1DbGlwcGluZ1BsYW5lcz15Yy5udW1QbGFuZXMsCklhLm51bUludGVyc2VjdGlvbj15Yy5udW1JbnRlcnNlY3Rpb24sbWEuY2xpcHBpbmdQbGFuZXM9eWMudW5pZm9ybTtJYS5mb2c9ZGE7SWEubGlnaHRzU3RhdGVWZXJzaW9uPWFiO1UubGlnaHRzJiYobWEuYW1iaWVudExpZ2h0Q29sb3IudmFsdWU9T2Euc3RhdGUuYW1iaWVudCxtYS5saWdodFByb2JlLnZhbHVlPU9hLnN0YXRlLnByb2JlLG1hLmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlPU9hLnN0YXRlLmRpcmVjdGlvbmFsLG1hLnNwb3RMaWdodHMudmFsdWU9T2Euc3RhdGUuc3BvdCxtYS5yZWN0QXJlYUxpZ2h0cy52YWx1ZT1PYS5zdGF0ZS5yZWN0QXJlYSxtYS5wb2ludExpZ2h0cy52YWx1ZT1PYS5zdGF0ZS5wb2ludCxtYS5oZW1pc3BoZXJlTGlnaHRzLnZhbHVlPU9hLnN0YXRlLmhlbWksbWEuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWU9T2Euc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAsbWEuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWU9T2Euc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgsCm1hLnNwb3RTaGFkb3dNYXAudmFsdWU9T2Euc3RhdGUuc3BvdFNoYWRvd01hcCxtYS5zcG90U2hhZG93TWF0cml4LnZhbHVlPU9hLnN0YXRlLnNwb3RTaGFkb3dNYXRyaXgsbWEucG9pbnRTaGFkb3dNYXAudmFsdWU9T2Euc3RhdGUucG9pbnRTaGFkb3dNYXAsbWEucG9pbnRTaGFkb3dNYXRyaXgudmFsdWU9T2Euc3RhdGUucG9pbnRTaGFkb3dNYXRyaXgpO1U9SWEucHJvZ3JhbS5nZXRVbmlmb3JtcygpO1U9dWQuc2VxV2l0aFZhbHVlKFUuc2VxLG1hKTtJYS51bmlmb3Jtc0xpc3Q9VX1mdW5jdGlvbiBoYShVLGRhLG1hLElhKXtPYy5yZXNldFRleHR1cmVVbml0cygpO3ZhciBPYT1lYy5nZXQobWEpLGFiPWNiLnN0YXRlLmxpZ2h0czt4ZyYmKFJofHxVIT09cGIpJiZ5Yy5zZXRTdGF0ZShtYS5jbGlwcGluZ1BsYW5lcyxtYS5jbGlwSW50ZXJzZWN0aW9uLG1hLmNsaXBTaGFkb3dzLFUsT2EsVT09PXBiJiZtYS5pZD09PVFhKTshMT09PW1hLm5lZWRzVXBkYXRlJiYodm9pZCAwPT09T2EucHJvZ3JhbT8KbWEubmVlZHNVcGRhdGU9ITA6bWEuZm9nJiZPYS5mb2chPT1kYT9tYS5uZWVkc1VwZGF0ZT0hMDptYS5saWdodHMmJk9hLmxpZ2h0c1N0YXRlVmVyc2lvbiE9PWFiLnN0YXRlLnZlcnNpb24/bWEubmVlZHNVcGRhdGU9ITA6dm9pZCAwPT09T2EubnVtQ2xpcHBpbmdQbGFuZXN8fE9hLm51bUNsaXBwaW5nUGxhbmVzPT09eWMubnVtUGxhbmVzJiZPYS5udW1JbnRlcnNlY3Rpb249PT15Yy5udW1JbnRlcnNlY3Rpb258fChtYS5uZWVkc1VwZGF0ZT0hMCkpO21hLm5lZWRzVXBkYXRlJiYoVyhtYSxkYSxJYSksbWEubmVlZHNVcGRhdGU9ITEpO3ZhciBQYT0hMSxmYj1hYj0hMSxDYj1PYS5wcm9ncmFtLG9iPUNiLmdldFVuaWZvcm1zKCksJGE9T2Euc2hhZGVyLnVuaWZvcm1zO3liLnVzZVByb2dyYW0oQ2IucHJvZ3JhbSkmJihmYj1hYj1QYT0hMCk7bWEuaWQhPT1RYSYmKFFhPW1hLmlkLGFiPSEwKTtpZihQYXx8cGIhPT1VKXtvYi5zZXRWYWx1ZShSYSwicHJvamVjdGlvbk1hdHJpeCIsVS5wcm9qZWN0aW9uTWF0cml4KTsKZGMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmb2Iuc2V0VmFsdWUoUmEsImxvZ0RlcHRoQnVmRkMiLDIvKE1hdGgubG9nKFUuZmFyKzEpL01hdGguTE4yKSk7cGIhPT1VJiYocGI9VSxmYj1hYj0hMCk7aWYobWEuaXNTaGFkZXJNYXRlcmlhbHx8bWEuaXNNZXNoUGhvbmdNYXRlcmlhbHx8bWEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8bWEuZW52TWFwKVBhPW9iLm1hcC5jYW1lcmFQb3NpdGlvbix2b2lkIDAhPT1QYSYmUGEuc2V0VmFsdWUoUmEsemQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFUubWF0cml4V29ybGQpKTsobWEuaXNNZXNoUGhvbmdNYXRlcmlhbHx8bWEuaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxtYS5pc01lc2hCYXNpY01hdGVyaWFsfHxtYS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxtYS5pc1NoYWRlck1hdGVyaWFsfHxtYS5za2lubmluZykmJm9iLnNldFZhbHVlKFJhLCJ2aWV3TWF0cml4IixVLm1hdHJpeFdvcmxkSW52ZXJzZSl9aWYobWEuc2tpbm5pbmcmJihvYi5zZXRPcHRpb25hbChSYSwKSWEsImJpbmRNYXRyaXgiKSxvYi5zZXRPcHRpb25hbChSYSxJYSwiYmluZE1hdHJpeEludmVyc2UiKSxVPUlhLnNrZWxldG9uKSlpZihQYT1VLmJvbmVzLGRjLmZsb2F0VmVydGV4VGV4dHVyZXMpe2lmKHZvaWQgMD09PVUuYm9uZVRleHR1cmUpe1BhPU1hdGguc3FydCg0KlBhLmxlbmd0aCk7UGE9aGIuY2VpbFBvd2VyT2ZUd28oUGEpO1BhPU1hdGgubWF4KFBhLDQpO3ZhciBQYz1uZXcgRmxvYXQzMkFycmF5KFBhKlBhKjQpO1BjLnNldChVLmJvbmVNYXRyaWNlcyk7dmFyIHhjPW5ldyBBYihQYyxQYSxQYSwxMDIzLDEwMTUpO3hjLm5lZWRzVXBkYXRlPSEwO1UuYm9uZU1hdHJpY2VzPVBjO1UuYm9uZVRleHR1cmU9eGM7VS5ib25lVGV4dHVyZVNpemU9UGF9b2Iuc2V0VmFsdWUoUmEsImJvbmVUZXh0dXJlIixVLmJvbmVUZXh0dXJlLE9jKTtvYi5zZXRWYWx1ZShSYSwiYm9uZVRleHR1cmVTaXplIixVLmJvbmVUZXh0dXJlU2l6ZSl9ZWxzZSBvYi5zZXRPcHRpb25hbChSYSxVLCJib25lTWF0cmljZXMiKTsKYWImJihvYi5zZXRWYWx1ZShSYSwidG9uZU1hcHBpbmdFeHBvc3VyZSIsamEudG9uZU1hcHBpbmdFeHBvc3VyZSksb2Iuc2V0VmFsdWUoUmEsInRvbmVNYXBwaW5nV2hpdGVQb2ludCIsamEudG9uZU1hcHBpbmdXaGl0ZVBvaW50KSxtYS5saWdodHMmJnRiKCRhLGZiKSxkYSYmbWEuZm9nJiZvYSgkYSxkYSksbWEuaXNNZXNoQmFzaWNNYXRlcmlhbD9mYSgkYSxtYSk6bWEuaXNNZXNoTGFtYmVydE1hdGVyaWFsPyhmYSgkYSxtYSksdGEoJGEsbWEpKTptYS5pc01lc2hQaG9uZ01hdGVyaWFsPyhmYSgkYSxtYSksbWEuaXNNZXNoVG9vbk1hdGVyaWFsP1RhKCRhLG1hKTpCYSgkYSxtYSkpOm1hLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/KGZhKCRhLG1hKSxtYS5pc01lc2hQaHlzaWNhbE1hdGVyaWFsP0NhKCRhLG1hKTpVYSgkYSxtYSkpOm1hLmlzTWVzaE1hdGNhcE1hdGVyaWFsPyhmYSgkYSxtYSksSGEoJGEsbWEpKTptYS5pc01lc2hEZXB0aE1hdGVyaWFsPyhmYSgkYSxtYSksRGEoJGEsCm1hKSk6bWEuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbD8oZmEoJGEsbWEpLE1hKCRhLG1hKSk6bWEuaXNNZXNoTm9ybWFsTWF0ZXJpYWw/KGZhKCRhLG1hKSxkYigkYSxtYSkpOm1hLmlzTGluZUJhc2ljTWF0ZXJpYWw/KHJhKCRhLG1hKSxtYS5pc0xpbmVEYXNoZWRNYXRlcmlhbCYmcGEoJGEsbWEpKTptYS5pc1BvaW50c01hdGVyaWFsP3FhKCRhLG1hKTptYS5pc1Nwcml0ZU1hdGVyaWFsP3VhKCRhLG1hKTptYS5pc1NoYWRvd01hdGVyaWFsJiYoJGEuY29sb3IudmFsdWUuY29weShtYS5jb2xvciksJGEub3BhY2l0eS52YWx1ZT1tYS5vcGFjaXR5KSx2b2lkIDAhPT0kYS5sdGNfMSYmKCRhLmx0Y18xLnZhbHVlPVdhLkxUQ18xKSx2b2lkIDAhPT0kYS5sdGNfMiYmKCRhLmx0Y18yLnZhbHVlPVdhLkxUQ18yKSx1ZC51cGxvYWQoUmEsT2EudW5pZm9ybXNMaXN0LCRhLE9jKSk7bWEuaXNTaGFkZXJNYXRlcmlhbCYmITA9PT1tYS51bmlmb3Jtc05lZWRVcGRhdGUmJih1ZC51cGxvYWQoUmEsT2EudW5pZm9ybXNMaXN0LAokYSxPYyksbWEudW5pZm9ybXNOZWVkVXBkYXRlPSExKTttYS5pc1Nwcml0ZU1hdGVyaWFsJiZvYi5zZXRWYWx1ZShSYSwiY2VudGVyIixJYS5jZW50ZXIpO29iLnNldFZhbHVlKFJhLCJtb2RlbFZpZXdNYXRyaXgiLElhLm1vZGVsVmlld01hdHJpeCk7b2Iuc2V0VmFsdWUoUmEsIm5vcm1hbE1hdHJpeCIsSWEubm9ybWFsTWF0cml4KTtvYi5zZXRWYWx1ZShSYSwibW9kZWxNYXRyaXgiLElhLm1hdHJpeFdvcmxkKTtyZXR1cm4gQ2J9ZnVuY3Rpb24gZmEoVSxkYSl7VS5vcGFjaXR5LnZhbHVlPWRhLm9wYWNpdHk7ZGEuY29sb3ImJlUuZGlmZnVzZS52YWx1ZS5jb3B5KGRhLmNvbG9yKTtkYS5lbWlzc2l2ZSYmVS5lbWlzc2l2ZS52YWx1ZS5jb3B5KGRhLmVtaXNzaXZlKS5tdWx0aXBseVNjYWxhcihkYS5lbWlzc2l2ZUludGVuc2l0eSk7ZGEubWFwJiYoVS5tYXAudmFsdWU9ZGEubWFwKTtkYS5hbHBoYU1hcCYmKFUuYWxwaGFNYXAudmFsdWU9ZGEuYWxwaGFNYXApO2RhLnNwZWN1bGFyTWFwJiYKKFUuc3BlY3VsYXJNYXAudmFsdWU9ZGEuc3BlY3VsYXJNYXApO2RhLmVudk1hcCYmKFUuZW52TWFwLnZhbHVlPWRhLmVudk1hcCxVLmZsaXBFbnZNYXAudmFsdWU9ZGEuZW52TWFwLmlzQ3ViZVRleHR1cmU/LTE6MSxVLnJlZmxlY3Rpdml0eS52YWx1ZT1kYS5yZWZsZWN0aXZpdHksVS5yZWZyYWN0aW9uUmF0aW8udmFsdWU9ZGEucmVmcmFjdGlvblJhdGlvLFUubWF4TWlwTGV2ZWwudmFsdWU9ZWMuZ2V0KGRhLmVudk1hcCkuX19tYXhNaXBMZXZlbCk7ZGEubGlnaHRNYXAmJihVLmxpZ2h0TWFwLnZhbHVlPWRhLmxpZ2h0TWFwLFUubGlnaHRNYXBJbnRlbnNpdHkudmFsdWU9ZGEubGlnaHRNYXBJbnRlbnNpdHkpO2RhLmFvTWFwJiYoVS5hb01hcC52YWx1ZT1kYS5hb01hcCxVLmFvTWFwSW50ZW5zaXR5LnZhbHVlPWRhLmFvTWFwSW50ZW5zaXR5KTtpZihkYS5tYXApdmFyIG1hPWRhLm1hcDtlbHNlIGRhLnNwZWN1bGFyTWFwP21hPWRhLnNwZWN1bGFyTWFwOmRhLmRpc3BsYWNlbWVudE1hcD8KbWE9ZGEuZGlzcGxhY2VtZW50TWFwOmRhLm5vcm1hbE1hcD9tYT1kYS5ub3JtYWxNYXA6ZGEuYnVtcE1hcD9tYT1kYS5idW1wTWFwOmRhLnJvdWdobmVzc01hcD9tYT1kYS5yb3VnaG5lc3NNYXA6ZGEubWV0YWxuZXNzTWFwP21hPWRhLm1ldGFsbmVzc01hcDpkYS5hbHBoYU1hcD9tYT1kYS5hbHBoYU1hcDpkYS5lbWlzc2l2ZU1hcCYmKG1hPWRhLmVtaXNzaXZlTWFwKTt2b2lkIDAhPT1tYSYmKG1hLmlzV2ViR0xSZW5kZXJUYXJnZXQmJihtYT1tYS50ZXh0dXJlKSwhMD09PW1hLm1hdHJpeEF1dG9VcGRhdGUmJm1hLnVwZGF0ZU1hdHJpeCgpLFUudXZUcmFuc2Zvcm0udmFsdWUuY29weShtYS5tYXRyaXgpKX1mdW5jdGlvbiByYShVLGRhKXtVLmRpZmZ1c2UudmFsdWUuY29weShkYS5jb2xvcik7VS5vcGFjaXR5LnZhbHVlPWRhLm9wYWNpdHl9ZnVuY3Rpb24gcGEoVSxkYSl7VS5kYXNoU2l6ZS52YWx1ZT1kYS5kYXNoU2l6ZTtVLnRvdGFsU2l6ZS52YWx1ZT1kYS5kYXNoU2l6ZStkYS5nYXBTaXplOwpVLnNjYWxlLnZhbHVlPWRhLnNjYWxlfWZ1bmN0aW9uIHFhKFUsZGEpe1UuZGlmZnVzZS52YWx1ZS5jb3B5KGRhLmNvbG9yKTtVLm9wYWNpdHkudmFsdWU9ZGEub3BhY2l0eTtVLnNpemUudmFsdWU9ZGEuc2l6ZSpjYztVLnNjYWxlLnZhbHVlPS41KnpjO1UubWFwLnZhbHVlPWRhLm1hcDtudWxsIT09ZGEubWFwJiYoITA9PT1kYS5tYXAubWF0cml4QXV0b1VwZGF0ZSYmZGEubWFwLnVwZGF0ZU1hdHJpeCgpLFUudXZUcmFuc2Zvcm0udmFsdWUuY29weShkYS5tYXAubWF0cml4KSl9ZnVuY3Rpb24gdWEoVSxkYSl7VS5kaWZmdXNlLnZhbHVlLmNvcHkoZGEuY29sb3IpO1Uub3BhY2l0eS52YWx1ZT1kYS5vcGFjaXR5O1Uucm90YXRpb24udmFsdWU9ZGEucm90YXRpb247VS5tYXAudmFsdWU9ZGEubWFwO251bGwhPT1kYS5tYXAmJighMD09PWRhLm1hcC5tYXRyaXhBdXRvVXBkYXRlJiZkYS5tYXAudXBkYXRlTWF0cml4KCksVS51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGRhLm1hcC5tYXRyaXgpKX0KZnVuY3Rpb24gb2EoVSxkYSl7VS5mb2dDb2xvci52YWx1ZS5jb3B5KGRhLmNvbG9yKTtkYS5pc0ZvZz8oVS5mb2dOZWFyLnZhbHVlPWRhLm5lYXIsVS5mb2dGYXIudmFsdWU9ZGEuZmFyKTpkYS5pc0ZvZ0V4cDImJihVLmZvZ0RlbnNpdHkudmFsdWU9ZGEuZGVuc2l0eSl9ZnVuY3Rpb24gdGEoVSxkYSl7ZGEuZW1pc3NpdmVNYXAmJihVLmVtaXNzaXZlTWFwLnZhbHVlPWRhLmVtaXNzaXZlTWFwKX1mdW5jdGlvbiBCYShVLGRhKXtVLnNwZWN1bGFyLnZhbHVlLmNvcHkoZGEuc3BlY3VsYXIpO1Uuc2hpbmluZXNzLnZhbHVlPU1hdGgubWF4KGRhLnNoaW5pbmVzcywxRS00KTtkYS5lbWlzc2l2ZU1hcCYmKFUuZW1pc3NpdmVNYXAudmFsdWU9ZGEuZW1pc3NpdmVNYXApO2RhLmJ1bXBNYXAmJihVLmJ1bXBNYXAudmFsdWU9ZGEuYnVtcE1hcCxVLmJ1bXBTY2FsZS52YWx1ZT1kYS5idW1wU2NhbGUsMT09PWRhLnNpZGUmJihVLmJ1bXBTY2FsZS52YWx1ZSo9LTEpKTtkYS5ub3JtYWxNYXAmJihVLm5vcm1hbE1hcC52YWx1ZT0KZGEubm9ybWFsTWFwLFUubm9ybWFsU2NhbGUudmFsdWUuY29weShkYS5ub3JtYWxTY2FsZSksMT09PWRhLnNpZGUmJlUubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiBUYShVLGRhKXtCYShVLGRhKTtkYS5ncmFkaWVudE1hcCYmKFUuZ3JhZGllbnRNYXAudmFsdWU9ZGEuZ3JhZGllbnRNYXApfWZ1bmN0aW9uIFVhKFUsZGEpe1Uucm91Z2huZXNzLnZhbHVlPWRhLnJvdWdobmVzcztVLm1ldGFsbmVzcy52YWx1ZT1kYS5tZXRhbG5lc3M7ZGEucm91Z2huZXNzTWFwJiYoVS5yb3VnaG5lc3NNYXAudmFsdWU9ZGEucm91Z2huZXNzTWFwKTtkYS5tZXRhbG5lc3NNYXAmJihVLm1ldGFsbmVzc01hcC52YWx1ZT0KZGEubWV0YWxuZXNzTWFwKTtkYS5lbWlzc2l2ZU1hcCYmKFUuZW1pc3NpdmVNYXAudmFsdWU9ZGEuZW1pc3NpdmVNYXApO2RhLmJ1bXBNYXAmJihVLmJ1bXBNYXAudmFsdWU9ZGEuYnVtcE1hcCxVLmJ1bXBTY2FsZS52YWx1ZT1kYS5idW1wU2NhbGUsMT09PWRhLnNpZGUmJihVLmJ1bXBTY2FsZS52YWx1ZSo9LTEpKTtkYS5ub3JtYWxNYXAmJihVLm5vcm1hbE1hcC52YWx1ZT1kYS5ub3JtYWxNYXAsVS5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLm5vcm1hbFNjYWxlKSwxPT09ZGEuc2lkZSYmVS5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSk7ZGEuZGlzcGxhY2VtZW50TWFwJiYoVS5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZGEuZGlzcGxhY2VtZW50TWFwLFUuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZGEuZGlzcGxhY2VtZW50U2NhbGUsVS5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWRhLmRpc3BsYWNlbWVudEJpYXMpO2RhLmVudk1hcCYmKFUuZW52TWFwSW50ZW5zaXR5LnZhbHVlPQpkYS5lbnZNYXBJbnRlbnNpdHkpfWZ1bmN0aW9uIENhKFUsZGEpe1VhKFUsZGEpO1UucmVmbGVjdGl2aXR5LnZhbHVlPWRhLnJlZmxlY3Rpdml0eTtVLmNsZWFyY29hdC52YWx1ZT1kYS5jbGVhcmNvYXQ7VS5jbGVhcmNvYXRSb3VnaG5lc3MudmFsdWU9ZGEuY2xlYXJjb2F0Um91Z2huZXNzO2RhLnNoZWVuJiZVLnNoZWVuLnZhbHVlLmNvcHkoZGEuc2hlZW4pO2RhLmNsZWFyY29hdE5vcm1hbE1hcCYmKFUuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUuY29weShkYS5jbGVhcmNvYXROb3JtYWxTY2FsZSksVS5jbGVhcmNvYXROb3JtYWxNYXAudmFsdWU9ZGEuY2xlYXJjb2F0Tm9ybWFsTWFwLDE9PT1kYS5zaWRlJiZVLmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtVLnRyYW5zcGFyZW5jeS52YWx1ZT1kYS50cmFuc3BhcmVuY3l9ZnVuY3Rpb24gSGEoVSxkYSl7ZGEubWF0Y2FwJiYoVS5tYXRjYXAudmFsdWU9ZGEubWF0Y2FwKTtkYS5idW1wTWFwJiYoVS5idW1wTWFwLnZhbHVlPQpkYS5idW1wTWFwLFUuYnVtcFNjYWxlLnZhbHVlPWRhLmJ1bXBTY2FsZSwxPT09ZGEuc2lkZSYmKFUuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2RhLm5vcm1hbE1hcCYmKFUubm9ybWFsTWFwLnZhbHVlPWRhLm5vcm1hbE1hcCxVLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZGEubm9ybWFsU2NhbGUpLDE9PT1kYS5zaWRlJiZVLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtkYS5kaXNwbGFjZW1lbnRNYXAmJihVLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxVLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZGEuZGlzcGxhY2VtZW50Qmlhcyl9ZnVuY3Rpb24gRGEoVSxkYSl7ZGEuZGlzcGxhY2VtZW50TWFwJiYoVS5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZGEuZGlzcGxhY2VtZW50TWFwLFUuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZGEuZGlzcGxhY2VtZW50U2NhbGUsVS5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPQpkYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiBNYShVLGRhKXtkYS5kaXNwbGFjZW1lbnRNYXAmJihVLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxVLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZGEuZGlzcGxhY2VtZW50Qmlhcyk7VS5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5jb3B5KGRhLnJlZmVyZW5jZVBvc2l0aW9uKTtVLm5lYXJEaXN0YW5jZS52YWx1ZT1kYS5uZWFyRGlzdGFuY2U7VS5mYXJEaXN0YW5jZS52YWx1ZT1kYS5mYXJEaXN0YW5jZX1mdW5jdGlvbiBkYihVLGRhKXtkYS5idW1wTWFwJiYoVS5idW1wTWFwLnZhbHVlPWRhLmJ1bXBNYXAsVS5idW1wU2NhbGUudmFsdWU9ZGEuYnVtcFNjYWxlLDE9PT1kYS5zaWRlJiYoVS5idW1wU2NhbGUudmFsdWUqPS0xKSk7ZGEubm9ybWFsTWFwJiYoVS5ub3JtYWxNYXAudmFsdWU9ZGEubm9ybWFsTWFwLFUubm9ybWFsU2NhbGUudmFsdWUuY29weShkYS5ub3JtYWxTY2FsZSksCjE9PT1kYS5zaWRlJiZVLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtkYS5kaXNwbGFjZW1lbnRNYXAmJihVLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxVLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZGEuZGlzcGxhY2VtZW50Qmlhcyl9ZnVuY3Rpb24gdGIoVSxkYSl7VS5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZT1kYTtVLmxpZ2h0UHJvYmUubmVlZHNVcGRhdGU9ZGE7VS5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZT1kYTtVLnBvaW50TGlnaHRzLm5lZWRzVXBkYXRlPWRhO1Uuc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZT1kYTtVLnJlY3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlPWRhO1UuaGVtaXNwaGVyZUxpZ2h0cy5uZWVkc1VwZGF0ZT1kYX1hPWF8fHt9O3ZhciBLYT12b2lkIDAhPT1hLmNhbnZhcz9hLmNhbnZhczpkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLAoiY2FudmFzIiksYmI9dm9pZCAwIT09YS5jb250ZXh0P2EuY29udGV4dDpudWxsLGpiPXZvaWQgMCE9PWEuYWxwaGE/YS5hbHBoYTohMSxFYj12b2lkIDAhPT1hLmRlcHRoP2EuZGVwdGg6ITAseGI9dm9pZCAwIT09YS5zdGVuY2lsP2Euc3RlbmNpbDohMCxpYT12b2lkIDAhPT1hLmFudGlhbGlhcz9hLmFudGlhbGlhczohMSxuYT12b2lkIDAhPT1hLnByZW11bHRpcGxpZWRBbHBoYT9hLnByZW11bHRpcGxpZWRBbHBoYTohMCx6YT12b2lkIDAhPT1hLnByZXNlcnZlRHJhd2luZ0J1ZmZlcj9hLnByZXNlcnZlRHJhd2luZ0J1ZmZlcjohMSxKYT12b2lkIDAhPT1hLnBvd2VyUHJlZmVyZW5jZT9hLnBvd2VyUHJlZmVyZW5jZToiZGVmYXVsdCIsWWE9dm9pZCAwIT09YS5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0P2EuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDohMSxOYT1udWxsLGNiPW51bGw7dGhpcy5kb21FbGVtZW50PUthO3RoaXMuZGVidWc9e2NoZWNrU2hhZGVyRXJyb3JzOiEwfTsKdGhpcy5zb3J0T2JqZWN0cz10aGlzLmF1dG9DbGVhclN0ZW5jaWw9dGhpcy5hdXRvQ2xlYXJEZXB0aD10aGlzLmF1dG9DbGVhckNvbG9yPXRoaXMuYXV0b0NsZWFyPSEwO3RoaXMuY2xpcHBpbmdQbGFuZXM9W107dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZD0hMTt0aGlzLmdhbW1hRmFjdG9yPTI7dGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz10aGlzLmdhbW1hT3V0cHV0PXRoaXMuZ2FtbWFJbnB1dD0hMTt0aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludD10aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmU9dGhpcy50b25lTWFwcGluZz0xO3RoaXMubWF4TW9ycGhUYXJnZXRzPTg7dGhpcy5tYXhNb3JwaE5vcm1hbHM9NDt2YXIgamE9dGhpcyxHYT0hMSxMYT1udWxsLG5iPTAsVmE9MCxpYj1udWxsLGtiPW51bGwsUWE9LTE7dmFyIGViPWM9bnVsbDt2YXIgbWI9ITE7dmFyIHBiPW51bGwsc2I9bnVsbCxLYj1uZXcgcCxTYj1uZXcgcCxuYz1udWxsLFFjPUthLndpZHRoLHpjPUthLmhlaWdodCwKY2M9MSx3ZT1uZXcgcCgwLDAsUWMsemMpLHZlPW5ldyBwKDAsMCxRYyx6YyksU2g9ITEsUWg9bmV3IGljLHljPW5ldyB3Yyx4Zz0hMSxSaD0hMSx3Zj1uZXcgcSx6ZD1uZXcgazt0cnl7amI9e2FscGhhOmpiLGRlcHRoOkViLHN0ZW5jaWw6eGIsYW50aWFsaWFzOmlhLHByZW11bHRpcGxpZWRBbHBoYTpuYSxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6emEscG93ZXJQcmVmZXJlbmNlOkphLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6WWEseHJDb21wYXRpYmxlOiEwfTtLYS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixyLCExKTtLYS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsdiwhMSk7dmFyIFJhPWJifHxLYS5nZXRDb250ZXh0KCJ3ZWJnbCIsamIpfHxLYS5nZXRDb250ZXh0KCJleHBlcmltZW50YWwtd2ViZ2wiLGpiKTtpZihudWxsPT09UmEpe2lmKG51bGwhPT1LYS5nZXRDb250ZXh0KCJ3ZWJnbCIpKXRocm93IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBhdHRyaWJ1dGVzLiIpOwp0aHJvdyBFcnJvcigiRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dC4iKTt9dm9pZCAwPT09UmEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0JiYoUmEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJue3JhbmdlTWluOjEscmFuZ2VNYXg6MSxwcmVjaXNpb246MX19KX1jYXRjaChVKXt0aHJvdyBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK1UubWVzc2FnZSksVTt9dmFyIExiLGRjLHliLHhkLGVjLE9jLHZnLFBoLHhlLFBkLHdnLHllLHlkLEJqLENqLERqLE5jO2coKTt2YXIgZGQ9InVuZGVmaW5lZCIhPT10eXBlb2YgbmF2aWdhdG9yJiYieHIiaW4gbmF2aWdhdG9yJiYic3VwcG9ydHNTZXNzaW9uImluIG5hdmlnYXRvci54cj9uZXcgQWooamEsUmEpOm5ldyBOaChqYSk7dGhpcy52cj1kZDt2YXIgRWo9bmV3IHZqKGphLHhlLGRjLm1heFRleHR1cmVTaXplKTt0aGlzLnNoYWRvd01hcD1Fajt0aGlzLmdldENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gUmF9Owp0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIFJhLmdldENvbnRleHRBdHRyaWJ1dGVzKCl9O3RoaXMuZm9yY2VDb250ZXh0TG9zcz1mdW5jdGlvbigpe3ZhciBVPUxiLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7VSYmVS5sb3NlQ29udGV4dCgpfTt0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmU9ZnVuY3Rpb24oKXt2YXIgVT1MYi5nZXQoIldFQkdMX2xvc2VfY29udGV4dCIpO1UmJlUucmVzdG9yZUNvbnRleHQoKX07dGhpcy5nZXRQaXhlbFJhdGlvPWZ1bmN0aW9uKCl7cmV0dXJuIGNjfTt0aGlzLnNldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXt2YXIgVT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzt2b2lkIDAhPT1VJiYoY2M9VSx0aGlzLnNldFNpemUoUWMsemMsITEpKX07dGhpcy5nZXRTaXplPWZ1bmN0aW9uKFUpe3ZvaWQgMD09PVUmJihjb25zb2xlLndhcm4oIldlYkdMUmVuZGVyZXI6IC5nZXRzaXplKCkgbm93IHJlcXVpcmVzIGEgVmVjdG9yMiBhcyBhbiBhcmd1bWVudCIpLApVPW5ldyBmKTtyZXR1cm4gVS5zZXQoUWMsemMpfTt0aGlzLnNldFNpemU9ZnVuY3Rpb24oVSxkYSxtYSl7ZGQuaXNQcmVzZW50aW5nKCk/Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDYW4ndCBjaGFuZ2Ugc2l6ZSB3aGlsZSBWUiBkZXZpY2UgaXMgcHJlc2VudGluZy4iKTooUWM9VSx6Yz1kYSxLYS53aWR0aD1NYXRoLmZsb29yKFUqY2MpLEthLmhlaWdodD1NYXRoLmZsb29yKGRhKmNjKSwhMSE9PW1hJiYoS2Euc3R5bGUud2lkdGg9VSsicHgiLEthLnN0eWxlLmhlaWdodD1kYSsicHgiKSx0aGlzLnNldFZpZXdwb3J0KFUsZGEpKX07dGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZT1mdW5jdGlvbihVKXt2b2lkIDA9PT1VJiYoY29uc29sZS53YXJuKCJXZWJHTFJlbmRlcmVyOiAuZ2V0ZHJhd2luZ0J1ZmZlclNpemUoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3IyIGFzIGFuIGFyZ3VtZW50IiksVT1uZXcgZik7cmV0dXJuIFUuc2V0KFFjKmNjLHpjKmNjKS5mbG9vcigpfTsKdGhpcy5zZXREcmF3aW5nQnVmZmVyU2l6ZT1mdW5jdGlvbihVLGRhLG1hKXtRYz1VO3pjPWRhO2NjPW1hO0thLndpZHRoPU1hdGguZmxvb3IoVSptYSk7S2EuaGVpZ2h0PU1hdGguZmxvb3IoZGEqbWEpO3RoaXMuc2V0Vmlld3BvcnQoVSxkYSl9O3RoaXMuZ2V0Q3VycmVudFZpZXdwb3J0PWZ1bmN0aW9uKFUpe3ZvaWQgMD09PVUmJihjb25zb2xlLndhcm4oIldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50Vmlld3BvcnQoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3I0IGFzIGFuIGFyZ3VtZW50IiksVT1uZXcgcCk7cmV0dXJuIFUuY29weShLYil9O3RoaXMuZ2V0Vmlld3BvcnQ9ZnVuY3Rpb24oVSl7cmV0dXJuIFUuY29weSh3ZSl9O3RoaXMuc2V0Vmlld3BvcnQ9ZnVuY3Rpb24oVSxkYSl7KDApLmlzVmVjdG9yND93ZS5zZXQoKDApLngsKDApLnksKDApLnosKDApLncpOndlLnNldCgwLDAsVSxkYSk7eWIudmlld3BvcnQoS2IuY29weSh3ZSkubXVsdGlwbHlTY2FsYXIoY2MpLmZsb29yKCkpfTsKdGhpcy5nZXRTY2lzc29yPWZ1bmN0aW9uKFUpe3JldHVybiBVLmNvcHkodmUpfTt0aGlzLnNldFNjaXNzb3I9ZnVuY3Rpb24oVSxkYSxtYSxJYSl7VS5pc1ZlY3RvcjQ/dmUuc2V0KFUueCxVLnksVS56LFUudyk6dmUuc2V0KFUsZGEsbWEsSWEpO3liLnNjaXNzb3IoU2IuY29weSh2ZSkubXVsdGlwbHlTY2FsYXIoY2MpLmZsb29yKCkpfTt0aGlzLmdldFNjaXNzb3JUZXN0PWZ1bmN0aW9uKCl7cmV0dXJuIFNofTt0aGlzLnNldFNjaXNzb3JUZXN0PWZ1bmN0aW9uKFUpe3liLnNldFNjaXNzb3JUZXN0KFNoPVUpfTt0aGlzLmdldENsZWFyQ29sb3I9ZnVuY3Rpb24oKXtyZXR1cm4geWQuZ2V0Q2xlYXJDb2xvcigpfTt0aGlzLnNldENsZWFyQ29sb3I9ZnVuY3Rpb24oKXt5ZC5zZXRDbGVhckNvbG9yLmFwcGx5KHlkLGFyZ3VtZW50cyl9O3RoaXMuZ2V0Q2xlYXJBbHBoYT1mdW5jdGlvbigpe3JldHVybiB5ZC5nZXRDbGVhckFscGhhKCl9O3RoaXMuc2V0Q2xlYXJBbHBoYT1mdW5jdGlvbigpe3lkLnNldENsZWFyQWxwaGEuYXBwbHkoeWQsCmFyZ3VtZW50cyl9O3RoaXMuY2xlYXI9ZnVuY3Rpb24oVSxkYSxtYSl7dmFyIElhPTA7aWYodm9pZCAwPT09VXx8VSlJYXw9MTYzODQ7aWYodm9pZCAwPT09ZGF8fGRhKUlhfD0yNTY7aWYodm9pZCAwPT09bWF8fG1hKUlhfD0xMDI0O1JhLmNsZWFyKElhKX07dGhpcy5jbGVhckNvbG9yPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMCwhMSwhMSl9O3RoaXMuY2xlYXJEZXB0aD1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITEsITAsITEpfTt0aGlzLmNsZWFyU3RlbmNpbD1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITEsITEsITApfTt0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXtLYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixyLCExKTtLYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsdiwhMSk7d2cuZGlzcG9zZSgpO3llLmRpc3Bvc2UoKTtlYy5kaXNwb3NlKCk7eGUuZGlzcG9zZSgpO2RkLmRpc3Bvc2UoKTt5Zy5zdG9wKCl9O3RoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlPQpmdW5jdGlvbihVLGRhKXt5Yi5pbml0QXR0cmlidXRlcygpO3ZhciBtYT1lYy5nZXQoVSk7VS5oYXNQb3NpdGlvbnMmJiFtYS5wb3NpdGlvbiYmKG1hLnBvc2l0aW9uPVJhLmNyZWF0ZUJ1ZmZlcigpKTtVLmhhc05vcm1hbHMmJiFtYS5ub3JtYWwmJihtYS5ub3JtYWw9UmEuY3JlYXRlQnVmZmVyKCkpO1UuaGFzVXZzJiYhbWEudXYmJihtYS51dj1SYS5jcmVhdGVCdWZmZXIoKSk7VS5oYXNDb2xvcnMmJiFtYS5jb2xvciYmKG1hLmNvbG9yPVJhLmNyZWF0ZUJ1ZmZlcigpKTtkYT1kYS5nZXRBdHRyaWJ1dGVzKCk7VS5oYXNQb3NpdGlvbnMmJihSYS5iaW5kQnVmZmVyKDM0OTYyLG1hLnBvc2l0aW9uKSxSYS5idWZmZXJEYXRhKDM0OTYyLFUucG9zaXRpb25BcnJheSwzNTA0OCkseWIuZW5hYmxlQXR0cmlidXRlKGRhLnBvc2l0aW9uKSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRhLnBvc2l0aW9uLDMsNTEyNiwhMSwwLDApKTtVLmhhc05vcm1hbHMmJihSYS5iaW5kQnVmZmVyKDM0OTYyLG1hLm5vcm1hbCksClJhLmJ1ZmZlckRhdGEoMzQ5NjIsVS5ub3JtYWxBcnJheSwzNTA0OCkseWIuZW5hYmxlQXR0cmlidXRlKGRhLm5vcm1hbCksUmEudmVydGV4QXR0cmliUG9pbnRlcihkYS5ub3JtYWwsMyw1MTI2LCExLDAsMCkpO1UuaGFzVXZzJiYoUmEuYmluZEJ1ZmZlcigzNDk2MixtYS51diksUmEuYnVmZmVyRGF0YSgzNDk2MixVLnV2QXJyYXksMzUwNDgpLHliLmVuYWJsZUF0dHJpYnV0ZShkYS51diksUmEudmVydGV4QXR0cmliUG9pbnRlcihkYS51diwyLDUxMjYsITEsMCwwKSk7VS5oYXNDb2xvcnMmJihSYS5iaW5kQnVmZmVyKDM0OTYyLG1hLmNvbG9yKSxSYS5idWZmZXJEYXRhKDM0OTYyLFUuY29sb3JBcnJheSwzNTA0OCkseWIuZW5hYmxlQXR0cmlidXRlKGRhLmNvbG9yKSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRhLmNvbG9yLDMsNTEyNiwhMSwwLDApKTt5Yi5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1JhLmRyYXdBcnJheXMoNCwwLFUuY291bnQpO1UuY291bnQ9MH07dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3Q9CmZ1bmN0aW9uKFUsZGEsbWEsSWEsT2EsYWIpe3liLnNldE1hdGVyaWFsKElhLE9hLmlzTWVzaCYmMD5PYS5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpKTt2YXIgUGE9aGEoVSxkYSxJYSxPYSksZmI9ITE7aWYoYyE9PW1hLmlkfHxlYiE9PVBhLmlkfHxtYiE9PSghMD09PUlhLndpcmVmcmFtZSkpYz1tYS5pZCxlYj1QYS5pZCxtYj0hMD09PUlhLndpcmVmcmFtZSxmYj0hMDtPYS5tb3JwaFRhcmdldEluZmx1ZW5jZXMmJihCai51cGRhdGUoT2EsbWEsSWEsUGEpLGZiPSEwKTt2YXIgQ2I9bWEuaW5kZXgsb2I9bWEuYXR0cmlidXRlcy5wb3NpdGlvbjtkYT0xOyEwPT09SWEud2lyZWZyYW1lJiYoQ2I9UGguZ2V0V2lyZWZyYW1lQXR0cmlidXRlKG1hKSxkYT0yKTtVPUNqO2lmKG51bGwhPT1DYil7dmFyICRhPXZnLmdldChDYik7VT1EajtVLnNldEluZGV4KCRhKX1mYiYmKFAoSWEsUGEsbWEpLG51bGwhPT1DYiYmUmEuYmluZEJ1ZmZlcigzNDk2MywkYS5idWZmZXIpKTskYT1JbmZpbml0eTsKbnVsbCE9PUNiPyRhPUNiLmNvdW50OnZvaWQgMCE9PW9iJiYoJGE9b2IuY291bnQpO29iPW1hLmRyYXdSYW5nZS5zdGFydCpkYTtQYT1udWxsIT09YWI/YWIuc3RhcnQqZGE6MDtDYj1NYXRoLm1heChvYixQYSk7YWI9TWF0aC5tYXgoMCxNYXRoLm1pbigkYSxvYittYS5kcmF3UmFuZ2UuY291bnQqZGEsUGErKG51bGwhPT1hYj9hYi5jb3VudCpkYTpJbmZpbml0eSkpLTEtQ2IrMSk7aWYoMCE9PWFiKXtpZihPYS5pc01lc2gpaWYoITA9PT1JYS53aXJlZnJhbWUpeWIuc2V0TGluZVdpZHRoKElhLndpcmVmcmFtZUxpbmV3aWR0aCplKCkpLFUuc2V0TW9kZSgxKTtlbHNlIHN3aXRjaChPYS5kcmF3TW9kZSl7Y2FzZSAwOlUuc2V0TW9kZSg0KTticmVhaztjYXNlIDE6VS5zZXRNb2RlKDUpO2JyZWFrO2Nhc2UgMjpVLnNldE1vZGUoNil9ZWxzZSBPYS5pc0xpbmU/KElhPUlhLmxpbmV3aWR0aCx2b2lkIDA9PT1JYSYmKElhPTEpLHliLnNldExpbmVXaWR0aChJYSplKCkpLE9hLmlzTGluZVNlZ21lbnRzPwpVLnNldE1vZGUoMSk6T2EuaXNMaW5lTG9vcD9VLnNldE1vZGUoMik6VS5zZXRNb2RlKDMpKTpPYS5pc1BvaW50cz9VLnNldE1vZGUoMCk6T2EuaXNTcHJpdGUmJlUuc2V0TW9kZSg0KTttYSYmbWEuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT8wPG1hLm1heEluc3RhbmNlZENvdW50JiZVLnJlbmRlckluc3RhbmNlcyhtYSxDYixhYik6VS5yZW5kZXIoQ2IsYWIpfX07dGhpcy5jb21waWxlPWZ1bmN0aW9uKFUsZGEpe2NiPXllLmdldChVLGRhKTtjYi5pbml0KCk7VS50cmF2ZXJzZShmdW5jdGlvbihtYSl7bWEuaXNMaWdodCYmKGNiLnB1c2hMaWdodChtYSksbWEuY2FzdFNoYWRvdyYmY2IucHVzaFNoYWRvdyhtYSkpfSk7Y2Iuc2V0dXBMaWdodHMoZGEpO1UudHJhdmVyc2UoZnVuY3Rpb24obWEpe2lmKG1hLm1hdGVyaWFsKWlmKEFycmF5LmlzQXJyYXkobWEubWF0ZXJpYWwpKWZvcih2YXIgSWE9MDtJYTxtYS5tYXRlcmlhbC5sZW5ndGg7SWErKylXKG1hLm1hdGVyaWFsW0lhXSxVLmZvZywKbWEpO2Vsc2UgVyhtYS5tYXRlcmlhbCxVLmZvZyxtYSl9KX07dmFyIFRoPW51bGwseWc9bmV3IGJjO3lnLnNldEFuaW1hdGlvbkxvb3AoZnVuY3Rpb24oVSl7ZGQuaXNQcmVzZW50aW5nKCl8fFRoJiZUaChVKX0pOyJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdyYmeWcuc2V0Q29udGV4dCh3aW5kb3cpO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihVKXtUaD1VO2RkLnNldEFuaW1hdGlvbkxvb3AoVSk7eWcuc3RhcnQoKX07dGhpcy5yZW5kZXI9ZnVuY3Rpb24oVSxkYSxtYSxJYSl7aWYodm9pZCAwIT09bWEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXIoKTogdGhlIHJlbmRlclRhcmdldCBhcmd1bWVudCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGluc3RlYWQuIik7dmFyIE9hPW1hfWlmKHZvaWQgMCE9PUlhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyKCk6IHRoZSBmb3JjZUNsZWFyIGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuY2xlYXIoKSBpbnN0ZWFkLiIpOwp2YXIgYWI9SWF9ZGEmJmRhLmlzQ2FtZXJhP0dhfHwoZWI9Yz1udWxsLG1iPSExLFFhPS0xLHBiPW51bGwsITA9PT1VLmF1dG9VcGRhdGUmJlUudXBkYXRlTWF0cml4V29ybGQoKSxudWxsPT09ZGEucGFyZW50JiZkYS51cGRhdGVNYXRyaXhXb3JsZCgpLGRkLmVuYWJsZWQmJihkYT1kZC5nZXRDYW1lcmEoZGEpKSxjYj15ZS5nZXQoVSxkYSksY2IuaW5pdCgpLFUub25CZWZvcmVSZW5kZXIoamEsVSxkYSxPYXx8aWIpLHdmLm11bHRpcGx5TWF0cmljZXMoZGEucHJvamVjdGlvbk1hdHJpeCxkYS5tYXRyaXhXb3JsZEludmVyc2UpLFFoLnNldEZyb21NYXRyaXgod2YpLFJoPXRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQseGc9eWMuaW5pdCh0aGlzLmNsaXBwaW5nUGxhbmVzLFJoLGRhKSxOYT13Zy5nZXQoVSxkYSksTmEuaW5pdCgpLFIoVSxkYSwwLGphLnNvcnRPYmplY3RzKSwhMD09PWphLnNvcnRPYmplY3RzJiZOYS5zb3J0KCkseGcmJnljLmJlZ2luU2hhZG93cygpLEVqLnJlbmRlcihjYi5zdGF0ZS5zaGFkb3dzQXJyYXksClUsZGEpLGNiLnNldHVwTGlnaHRzKGRhKSx4ZyYmeWMuZW5kU2hhZG93cygpLHRoaXMuaW5mby5hdXRvUmVzZXQmJnRoaXMuaW5mby5yZXNldCgpLHZvaWQgMCE9PU9hJiZ0aGlzLnNldFJlbmRlclRhcmdldChPYSkseWQucmVuZGVyKE5hLFUsZGEsYWIpLG1hPU5hLm9wYXF1ZSxJYT1OYS50cmFuc3BhcmVudCxVLm92ZXJyaWRlTWF0ZXJpYWw/KE9hPVUub3ZlcnJpZGVNYXRlcmlhbCxtYS5sZW5ndGgmJlMobWEsVSxkYSxPYSksSWEubGVuZ3RoJiZTKElhLFUsZGEsT2EpKToobWEubGVuZ3RoJiZTKG1hLFUsZGEpLElhLmxlbmd0aCYmUyhJYSxVLGRhKSksbnVsbCE9PWliJiYoT2MudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKGliKSxPYy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldChpYikpLHliLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCkseWIuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCEwKSx5Yi5idWZmZXJzLmNvbG9yLnNldE1hc2soITApLHliLnNldFBvbHlnb25PZmZzZXQoITEpLApkZC5lbmFibGVkJiZkZC5zdWJtaXRGcmFtZSgpLGNiPU5hPW51bGwpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyOiBjYW1lcmEgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkNhbWVyYS4iKX07dGhpcy5zZXRGcmFtZWJ1ZmZlcj1mdW5jdGlvbihVKXtMYSE9PVUmJlJhLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxVKTtMYT1VfTt0aGlzLmdldEFjdGl2ZUN1YmVGYWNlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ifTt0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIFZhfTt0aGlzLmdldFJlbmRlclRhcmdldD1mdW5jdGlvbigpe3JldHVybiBpYn07dGhpcy5zZXRSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oVSxkYSxtYSl7aWI9VTtuYj1kYTtWYT1tYTtVJiZ2b2lkIDA9PT1lYy5nZXQoVSkuX193ZWJnbEZyYW1lYnVmZmVyJiZPYy5zZXR1cFJlbmRlclRhcmdldChVKTt2YXIgSWE9TGEsT2E9ITE7VT8oSWE9ZWMuZ2V0KFUpLl9fd2ViZ2xGcmFtZWJ1ZmZlciwKVS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT8oSWE9SWFbZGF8fDBdLE9hPSEwKTpJYT1VLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9lYy5nZXQoVSkuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyOklhLEtiLmNvcHkoVS52aWV3cG9ydCksU2IuY29weShVLnNjaXNzb3IpLG5jPVUuc2Npc3NvclRlc3QpOihLYi5jb3B5KHdlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSxTYi5jb3B5KHZlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSxuYz1TaCk7a2IhPT1JYSYmKFJhLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxJYSksa2I9SWEpO3liLnZpZXdwb3J0KEtiKTt5Yi5zY2lzc29yKFNiKTt5Yi5zZXRTY2lzc29yVGVzdChuYyk7T2EmJihVPWVjLmdldChVLnRleHR1cmUpLFJhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDY0LDM0MDY5KyhkYXx8MCksVS5fX3dlYmdsVGV4dHVyZSxtYXx8MCkpfTt0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM9ZnVuY3Rpb24oVSwKZGEsbWEsSWEsT2EsYWIsUGEpe2lmKFUmJlUuaXNXZWJHTFJlbmRlclRhcmdldCl7dmFyIGZiPWVjLmdldChVKS5fX3dlYmdsRnJhbWVidWZmZXI7VS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSYmdm9pZCAwIT09UGEmJihmYj1mYltQYV0pO2lmKGZiKXtQYT0hMTtmYiE9PWtiJiYoUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLGZiKSxQYT0hMCk7dHJ5e3ZhciBDYj1VLnRleHR1cmUsb2I9Q2IuZm9ybWF0LCRhPUNiLnR5cGU7MTAyMyE9PW9iJiZOYy5jb252ZXJ0KG9iKSE9PVJhLmdldFBhcmFtZXRlcigzNTczOSk/Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFJHQkEgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBmb3JtYXQuIik6MTAwOT09PSRhfHxOYy5jb252ZXJ0KCRhKT09PVJhLmdldFBhcmFtZXRlcigzNTczOCl8fDEwMTU9PT0kYSYmKGRjLmlzV2ViR0wyfHxMYi5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0Iil8fApMYi5nZXQoIldFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCIpKXx8MTAxNj09PSRhJiYoZGMuaXNXZWJHTDI/TGIuZ2V0KCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0Iik6TGIuZ2V0KCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQiKSk/MzYwNTM9PT1SYS5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKDM2MTYwKT8wPD1kYSYmZGE8PVUud2lkdGgtSWEmJjA8PW1hJiZtYTw9VS5oZWlnaHQtT2EmJlJhLnJlYWRQaXhlbHMoZGEsbWEsSWEsT2EsTmMuY29udmVydChvYiksTmMuY29udmVydCgkYSksYWIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVhZFBpeGVscyBmcm9tIHJlbmRlclRhcmdldCBmYWlsZWQuIEZyYW1lYnVmZmVyIG5vdCBjb21wbGV0ZS4iKTpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gVW5zaWduZWRCeXRlVHlwZSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGUuIil9ZmluYWxseXtQYSYmClJhLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxrYil9fX1lbHNlIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4iKX07dGhpcy5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmU9ZnVuY3Rpb24oVSxkYSxtYSl7dmFyIElhPWRhLmltYWdlLndpZHRoLE9hPWRhLmltYWdlLmhlaWdodCxhYj1OYy5jb252ZXJ0KGRhLmZvcm1hdCk7T2Muc2V0VGV4dHVyZTJEKGRhLDApO1JhLmNvcHlUZXhJbWFnZTJEKDM1NTMsbWF8fDAsYWIsVS54LFUueSxJYSxPYSwwKX07dGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZT1mdW5jdGlvbihVLGRhLG1hLElhKXt2YXIgT2E9ZGEuaW1hZ2Uud2lkdGgsYWI9ZGEuaW1hZ2UuaGVpZ2h0LFBhPU5jLmNvbnZlcnQobWEuZm9ybWF0KSxmYj1OYy5jb252ZXJ0KG1hLnR5cGUpO09jLnNldFRleHR1cmUyRChtYSwwKTtkYS5pc0RhdGFUZXh0dXJlPwpSYS50ZXhTdWJJbWFnZTJEKDM1NTMsSWF8fDAsVS54LFUueSxPYSxhYixQYSxmYixkYS5pbWFnZS5kYXRhKTpSYS50ZXhTdWJJbWFnZTJEKDM1NTMsSWF8fDAsVS54LFUueSxQYSxmYixkYS5pbWFnZSl9OyJ1bmRlZmluZWQiIT09dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9ZnVuY3Rpb24gemcoYSxjKXt0aGlzLm5hbWU9IiI7dGhpcy5jb2xvcj1uZXcgSShhKTt0aGlzLmRlbnNpdHk9dm9pZCAwIT09Yz9jOjIuNUUtNH1mdW5jdGlvbiBBZyhhLGMsZSl7dGhpcy5uYW1lPSIiO3RoaXMuY29sb3I9bmV3IEkoYSk7dGhpcy5uZWFyPXZvaWQgMCE9PWM/YzoxO3RoaXMuZmFyPXZvaWQgMCE9PWU/ZToxRTN9ZnVuY3Rpb24gUWQoYSxjKXt0aGlzLmFycmF5PWE7dGhpcy5zdHJpZGU9Yzt0aGlzLmNvdW50PXZvaWQgMCE9PWE/YS5sZW5ndGgvYzowO3RoaXMuZHluYW1pYz0KITE7dGhpcy51cGRhdGVSYW5nZT17b2Zmc2V0OjAsY291bnQ6LTF9O3RoaXMudmVyc2lvbj0wfWZ1bmN0aW9uIHhmKGEsYyxlLGcpe3RoaXMuZGF0YT1hO3RoaXMuaXRlbVNpemU9Yzt0aGlzLm9mZnNldD1lO3RoaXMubm9ybWFsaXplZD0hMD09PWd9ZnVuY3Rpb24gQWQoYSl7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3ByaXRlTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEkoMTY3NzcyMTUpO3RoaXMubWFwPW51bGw7dGhpcy5yb3RhdGlvbj0wO3RoaXMuc2l6ZUF0dGVudWF0aW9uPSEwO3RoaXMubGlnaHRzPSExO3RoaXMudHJhbnNwYXJlbnQ9ITA7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24geWYoYSl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3ByaXRlIjtpZih2b2lkIDA9PT1BZSl7QWU9bmV3IHZhO3ZhciBjPW5ldyBRZChuZXcgRmxvYXQzMkFycmF5KFstLjUsLS41LDAsMCwwLC41LC0uNSwwLDEsMCwuNSwuNSwwLDEsMSwtLjUsLjUsMCwwLDFdKSw1KTtBZS5zZXRJbmRleChbMCwKMSwyLDAsMiwzXSk7QWUuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHhmKGMsMywwLCExKSk7QWUuYWRkQXR0cmlidXRlKCJ1diIsbmV3IHhmKGMsMiwzLCExKSl9dGhpcy5nZW9tZXRyeT1BZTt0aGlzLm1hdGVyaWFsPXZvaWQgMCE9PWE/YTpuZXcgQWQ7dGhpcy5jZW50ZXI9bmV3IGYoLjUsLjUpfWZ1bmN0aW9uIEJnKGEsYyxlLGcscix2KXtCZS5zdWJWZWN0b3JzKGEsZSkuYWRkU2NhbGFyKC41KS5tdWx0aXBseShnKTt2b2lkIDAhPT1yPyh6Zi54PXYqQmUueC1yKkJlLnksemYueT1yKkJlLngrdipCZS55KTp6Zi5jb3B5KEJlKTthLmNvcHkoYyk7YS54Kz16Zi54O2EueSs9emYueTthLmFwcGx5TWF0cml4NChGail9ZnVuY3Rpb24gQWYoKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMT0QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse2xldmVsczp7ZW51bWVyYWJsZTohMCx2YWx1ZTpbXX19KTt0aGlzLmF1dG9VcGRhdGU9ITB9ZnVuY3Rpb24gQmYoYSxjKXthJiZhLmlzR2VvbWV0cnkmJgpjb25zb2xlLmVycm9yKCJUSFJFRS5Ta2lubmVkTWVzaCBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpO3hhLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iU2tpbm5lZE1lc2giO3RoaXMuYmluZE1vZGU9ImF0dGFjaGVkIjt0aGlzLmJpbmRNYXRyaXg9bmV3IHE7dGhpcy5iaW5kTWF0cml4SW52ZXJzZT1uZXcgcX1mdW5jdGlvbiBDZyhhLGMpe2E9YXx8W107dGhpcy5ib25lcz1hLnNsaWNlKDApO3RoaXMuYm9uZU1hdHJpY2VzPW5ldyBGbG9hdDMyQXJyYXkoMTYqdGhpcy5ib25lcy5sZW5ndGgpO2lmKHZvaWQgMD09PWMpdGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpO2Vsc2UgaWYodGhpcy5ib25lcy5sZW5ndGg9PT1jLmxlbmd0aCl0aGlzLmJvbmVJbnZlcnNlcz1jLnNsaWNlKDApO2Vsc2UgZm9yKGNvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b24gYm9uZUludmVyc2VzIGlzIHRoZSB3cm9uZyBsZW5ndGguIiksCnRoaXMuYm9uZUludmVyc2VzPVtdLGE9MCxjPXRoaXMuYm9uZXMubGVuZ3RoO2E8YzthKyspdGhpcy5ib25lSW52ZXJzZXMucHVzaChuZXcgcSl9ZnVuY3Rpb24gVWgoKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJCb25lIn1mdW5jdGlvbiBGYihhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaW5lQmFzaWNNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5saW5ld2lkdGg9MTt0aGlzLmxpbmVqb2luPXRoaXMubGluZWNhcD0icm91bmQiO3RoaXMubGlnaHRzPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIFZiKGEsYyxlKXsxPT09ZSYmY29uc29sZS5lcnJvcigiVEhSRUUuTGluZTogcGFyYW1ldGVyIFRIUkVFLkxpbmVQaWVjZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIFRIUkVFLkxpbmVTZWdtZW50cyBpbnN0ZWFkLiIpO0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmUiO3RoaXMuZ2VvbWV0cnk9dm9pZCAwIT09YT9hOm5ldyB2YTt0aGlzLm1hdGVyaWFsPQp2b2lkIDAhPT1jP2M6bmV3IEZiKHtjb2xvcjoxNjc3NzIxNSpNYXRoLnJhbmRvbSgpfSl9ZnVuY3Rpb24gSWIoYSxjKXtWYi5jYWxsKHRoaXMsYSxjKTt0aGlzLnR5cGU9IkxpbmVTZWdtZW50cyJ9ZnVuY3Rpb24gRGcoYSxjKXtWYi5jYWxsKHRoaXMsYSxjKTt0aGlzLnR5cGU9IkxpbmVMb29wIn1mdW5jdGlvbiBBYyhhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQb2ludHNNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5tYXA9bnVsbDt0aGlzLnNpemU9MTt0aGlzLnNpemVBdHRlbnVhdGlvbj0hMDt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoVGFyZ2V0cz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBDZShhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvaW50cyI7dGhpcy5nZW9tZXRyeT12b2lkIDAhPT1hP2E6bmV3IHZhO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09Yz9jOm5ldyBBYyh7Y29sb3I6MTY3NzcyMTUqTWF0aC5yYW5kb20oKX0pO3RoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9CmZ1bmN0aW9uIFZoKGEsYyxlLGcscix2LHope3ZhciBFPVdoLmRpc3RhbmNlU3FUb1BvaW50KGEpO0U8ZSYmKGU9bmV3IGssV2guY2xvc2VzdFBvaW50VG9Qb2ludChhLGUpLGUuYXBwbHlNYXRyaXg0KGcpLGE9ci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oZSksYTxyLm5lYXJ8fGE+ci5mYXJ8fHYucHVzaCh7ZGlzdGFuY2U6YSxkaXN0YW5jZVRvUmF5Ok1hdGguc3FydChFKSxwb2ludDplLGluZGV4OmMsZmFjZTpudWxsLG9iamVjdDp6fSkpfWZ1bmN0aW9uIFhoKGEsYyxlLGcscix2LHosRSxHKXtsLmNhbGwodGhpcyxhLGMsZSxnLHIsdix6LEUsRyk7dGhpcy5mb3JtYXQ9dm9pZCAwIT09ej96OjEwMjI7dGhpcy5taW5GaWx0ZXI9dm9pZCAwIT09dj92OjEwMDY7dGhpcy5tYWdGaWx0ZXI9dm9pZCAwIT09cj9yOjEwMDY7dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gRGUoYSxjLGUsZyxyLHYseixFLEcsSixQLFIpe2wuY2FsbCh0aGlzLG51bGwsdix6LEUsRyxKLGcscixQLApSKTt0aGlzLmltYWdlPXt3aWR0aDpjLGhlaWdodDplfTt0aGlzLm1pcG1hcHM9YTt0aGlzLmdlbmVyYXRlTWlwbWFwcz10aGlzLmZsaXBZPSExfWZ1bmN0aW9uIENmKGEsYyxlLGcscix2LHosRSxHKXtsLmNhbGwodGhpcyxhLGMsZSxnLHIsdix6LEUsRyk7dGhpcy5uZWVkc1VwZGF0ZT0hMH1mdW5jdGlvbiBEZihhLGMsZSxnLHIsdix6LEUsRyxKKXtKPXZvaWQgMCE9PUo/SjoxMDI2O2lmKDEwMjYhPT1KJiYxMDI3IT09Sil0aHJvdyBFcnJvcigiRGVwdGhUZXh0dXJlIGZvcm1hdCBtdXN0IGJlIGVpdGhlciBUSFJFRS5EZXB0aEZvcm1hdCBvciBUSFJFRS5EZXB0aFN0ZW5jaWxGb3JtYXQiKTt2b2lkIDA9PT1lJiYxMDI2PT09SiYmKGU9MTAxMik7dm9pZCAwPT09ZSYmMTAyNz09PUomJihlPTEwMjApO2wuY2FsbCh0aGlzLG51bGwsZyxyLHYseixFLEosZSxHKTt0aGlzLmltYWdlPXt3aWR0aDphLGhlaWdodDpjfTt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT16P3o6MTAwMzt0aGlzLm1pbkZpbHRlcj0Kdm9pZCAwIT09RT9FOjEwMDM7dGhpcy5nZW5lcmF0ZU1pcG1hcHM9dGhpcy5mbGlwWT0hMX1mdW5jdGlvbiBFZShhKXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iV2lyZWZyYW1lR2VvbWV0cnkiO3ZhciBjPVtdLGUsZyxyLHY9WzAsMF0sej17fSxFPVsiYSIsImIiLCJjIl07aWYoYSYmYS5pc0dlb21ldHJ5KXt2YXIgRz1hLmZhY2VzO3ZhciBKPTA7Zm9yKGc9Ry5sZW5ndGg7SjxnO0orKyl7dmFyIFA9R1tKXTtmb3IoZT0wOzM+ZTtlKyspe3ZhciBSPVBbRVtlXV07dmFyIFM9UFtFWyhlKzEpJTNdXTt2WzBdPU1hdGgubWluKFIsUyk7dlsxXT1NYXRoLm1heChSLFMpO1I9dlswXSsiLCIrdlsxXTt2b2lkIDA9PT16W1JdJiYoeltSXT17aW5kZXgxOnZbMF0saW5kZXgyOnZbMV19KX19Zm9yKFIgaW4geilKPXpbUl0sRT1hLnZlcnRpY2VzW0ouaW5kZXgxXSxjLnB1c2goRS54LEUueSxFLnopLEU9YS52ZXJ0aWNlc1tKLmluZGV4Ml0sYy5wdXNoKEUueCxFLnksRS56KX1lbHNlIGlmKGEmJgphLmlzQnVmZmVyR2VvbWV0cnkpaWYoRT1uZXcgayxudWxsIT09YS5pbmRleCl7Rz1hLmF0dHJpYnV0ZXMucG9zaXRpb247UD1hLmluZGV4O3ZhciBWPWEuZ3JvdXBzOzA9PT1WLmxlbmd0aCYmKFY9W3tzdGFydDowLGNvdW50OlAuY291bnQsbWF0ZXJpYWxJbmRleDowfV0pO2E9MDtmb3Iocj1WLmxlbmd0aDthPHI7KythKWZvcihKPVZbYV0sZT1KLnN0YXJ0LGc9Si5jb3VudCxKPWUsZz1lK2c7SjxnO0orPTMpZm9yKGU9MDszPmU7ZSsrKVI9UC5nZXRYKEorZSksUz1QLmdldFgoSisoZSsxKSUzKSx2WzBdPU1hdGgubWluKFIsUyksdlsxXT1NYXRoLm1heChSLFMpLFI9dlswXSsiLCIrdlsxXSx2b2lkIDA9PT16W1JdJiYoeltSXT17aW5kZXgxOnZbMF0saW5kZXgyOnZbMV19KTtmb3IoUiBpbiB6KUo9eltSXSxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRyxKLmluZGV4MSksYy5wdXNoKEUueCxFLnksRS56KSxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRyxKLmluZGV4MiksYy5wdXNoKEUueCwKRS55LEUueil9ZWxzZSBmb3IoRz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sSj0wLGc9Ry5jb3VudC8zO0o8ZztKKyspZm9yKGU9MDszPmU7ZSsrKXo9MypKK2UsRS5mcm9tQnVmZmVyQXR0cmlidXRlKEcseiksYy5wdXNoKEUueCxFLnksRS56KSx6PTMqSisoZSsxKSUzLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShHLHopLGMucHVzaChFLngsRS55LEUueik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoYywzKSl9ZnVuY3Rpb24gRWYoYSxjLGUpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQYXJhbWV0cmljR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17ZnVuYzphLHNsaWNlczpjLHN0YWNrczplfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgRmUoYSxjLGUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBGZShhLGMsZSl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtmdW5jOmEsCnNsaWNlczpjLHN0YWNrczplfTt2YXIgZz1bXSxyPVtdLHY9W10sej1bXSxFPW5ldyBrLEc9bmV3IGssSj1uZXcgayxQPW5ldyBrLFI9bmV3IGssUyxWOzM+YS5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlBhcmFtZXRyaWNHZW9tZXRyeTogRnVuY3Rpb24gbXVzdCBub3cgbW9kaWZ5IGEgVmVjdG9yMyBhcyB0aGlyZCBwYXJhbWV0ZXIuIik7dmFyIFc9YysxO2ZvcihTPTA7Uzw9ZTtTKyspe3ZhciBoYT1TL2U7Zm9yKFY9MDtWPD1jO1YrKyl7dmFyIGZhPVYvYzthKGZhLGhhLEcpO3IucHVzaChHLngsRy55LEcueik7MDw9ZmEtMUUtNT8oYShmYS0xRS01LGhhLEopLFAuc3ViVmVjdG9ycyhHLEopKTooYShmYSsxRS01LGhhLEopLFAuc3ViVmVjdG9ycyhKLEcpKTswPD1oYS0xRS01PyhhKGZhLGhhLTFFLTUsSiksUi5zdWJWZWN0b3JzKEcsSikpOihhKGZhLGhhKzFFLTUsSiksUi5zdWJWZWN0b3JzKEosRykpO0UuY3Jvc3NWZWN0b3JzKFAsUikubm9ybWFsaXplKCk7di5wdXNoKEUueCwKRS55LEUueik7ei5wdXNoKGZhLGhhKX19Zm9yKFM9MDtTPGU7UysrKWZvcihWPTA7VjxjO1YrKylhPVMqVytWKzEsRT0oUysxKSpXK1YrMSxHPShTKzEpKlcrVixnLnB1c2goUypXK1YsYSxHKSxnLnB1c2goYSxFLEcpO3RoaXMuc2V0SW5kZXgoZyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EociwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKHYsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHosMikpfWZ1bmN0aW9uIEZmKGEsYyxlLGcpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQb2x5aGVkcm9uR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17dmVydGljZXM6YSxpbmRpY2VzOmMscmFkaXVzOmUsZGV0YWlsOmd9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBqYyhhLGMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gamMoYSxjLGUsZyl7ZnVuY3Rpb24gcihXLGhhLGZhLHJhKXtyYT1NYXRoLnBvdygyLApyYSk7dmFyIHBhPVtdLHFhLHVhO2ZvcihxYT0wO3FhPD1yYTtxYSsrKXtwYVtxYV09W107dmFyIG9hPVcuY2xvbmUoKS5sZXJwKGZhLHFhL3JhKSx0YT1oYS5jbG9uZSgpLmxlcnAoZmEscWEvcmEpLEJhPXJhLXFhO2Zvcih1YT0wO3VhPD1CYTt1YSsrKXBhW3FhXVt1YV09MD09PXVhJiZxYT09PXJhP29hOm9hLmNsb25lKCkubGVycCh0YSx1YS9CYSl9Zm9yKHFhPTA7cWE8cmE7cWErKylmb3IodWE9MDt1YTwyKihyYS1xYSktMTt1YSsrKVc9TWF0aC5mbG9vcih1YS8yKSwwPT09dWElMj8oeihwYVtxYV1bVysxXSkseihwYVtxYSsxXVtXXSkseihwYVtxYV1bV10pKTooeihwYVtxYV1bVysxXSkseihwYVtxYSsxXVtXKzFdKSx6KHBhW3FhKzFdW1ddKSl9ZnVuY3Rpb24gdigpe2Zvcih2YXIgVz0wO1c8Vi5sZW5ndGg7Vys9Nil7dmFyIGhhPVZbVyswXSxmYT1WW1crMl0scmE9VltXKzRdLHBhPU1hdGgubWluKGhhLGZhLHJhKTsuOTxNYXRoLm1heChoYSxmYSxyYSkmJi4xPnBhJiYoLjI+CmhhJiYoVltXKzBdKz0xKSwuMj5mYSYmKFZbVysyXSs9MSksLjI+cmEmJihWW1crNF0rPTEpKX19ZnVuY3Rpb24geihXKXtTLnB1c2goVy54LFcueSxXLnopfWZ1bmN0aW9uIEUoVyxoYSl7Vyo9MztoYS54PWFbVyswXTtoYS55PWFbVysxXTtoYS56PWFbVysyXX1mdW5jdGlvbiBHKCl7Zm9yKHZhciBXPW5ldyBrLGhhPW5ldyBrLGZhPW5ldyBrLHJhPW5ldyBrLHBhPW5ldyBmLHFhPW5ldyBmLHVhPW5ldyBmLG9hPTAsdGE9MDtvYTxTLmxlbmd0aDtvYSs9OSx0YSs9Nil7Vy5zZXQoU1tvYSswXSxTW29hKzFdLFNbb2ErMl0pO2hhLnNldChTW29hKzNdLFNbb2ErNF0sU1tvYSs1XSk7ZmEuc2V0KFNbb2ErNl0sU1tvYSs3XSxTW29hKzhdKTtwYS5zZXQoVlt0YSswXSxWW3RhKzFdKTtxYS5zZXQoVlt0YSsyXSxWW3RhKzNdKTt1YS5zZXQoVlt0YSs0XSxWW3RhKzVdKTtyYS5jb3B5KFcpLmFkZChoYSkuYWRkKGZhKS5kaXZpZGVTY2FsYXIoMyk7dmFyIEJhPVAocmEpO0oocGEsdGErMCxXLApCYSk7SihxYSx0YSsyLGhhLEJhKTtKKHVhLHRhKzQsZmEsQmEpfX1mdW5jdGlvbiBKKFcsaGEsZmEscmEpezA+cmEmJjE9PT1XLngmJihWW2hhXT1XLngtMSk7MD09PWZhLngmJjA9PT1mYS56JiYoVltoYV09cmEvMi9NYXRoLlBJKy41KX1mdW5jdGlvbiBQKFcpe3JldHVybiBNYXRoLmF0YW4yKFcueiwtVy54KX1mdW5jdGlvbiBSKFcpe3JldHVybiBNYXRoLmF0YW4yKC1XLnksTWF0aC5zcXJ0KFcueCpXLngrVy56KlcueikpfXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17dmVydGljZXM6YSxpbmRpY2VzOmMscmFkaXVzOmUsZGV0YWlsOmd9O2U9ZXx8MTtnPWd8fDA7dmFyIFM9W10sVj1bXTsoZnVuY3Rpb24oVyl7Zm9yKHZhciBoYT1uZXcgayxmYT1uZXcgayxyYT1uZXcgayxwYT0wO3BhPGMubGVuZ3RoO3BhKz0zKUUoY1twYSswXSxoYSksRShjW3BhKzFdLGZhKSxFKGNbcGErMl0scmEpLHIoaGEsZmEscmEsClcpfSkoZyk7KGZ1bmN0aW9uKFcpe2Zvcih2YXIgaGE9bmV3IGssZmE9MDtmYTxTLmxlbmd0aDtmYSs9MyloYS54PVNbZmErMF0saGEueT1TW2ZhKzFdLGhhLno9U1tmYSsyXSxoYS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihXKSxTW2ZhKzBdPWhhLngsU1tmYSsxXT1oYS55LFNbZmErMl09aGEuen0pKGUpOyhmdW5jdGlvbigpe2Zvcih2YXIgVz1uZXcgayxoYT0wO2hhPFMubGVuZ3RoO2hhKz0zKXtXLng9U1toYSswXTtXLnk9U1toYSsxXTtXLno9U1toYSsyXTt2YXIgZmE9UChXKS8yL01hdGguUEkrLjUscmE9UihXKS9NYXRoLlBJKy41O1YucHVzaChmYSwxLXJhKX1HKCk7digpfSkoKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShTLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoUy5zbGljZSgpLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYShWLDIpKTswPT09Zz90aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk6dGhpcy5ub3JtYWxpemVOb3JtYWxzKCl9CmZ1bmN0aW9uIEdmKGEsYyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRldHJhaGVkcm9uR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsZGV0YWlsOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBHZShhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBHZShhLGMpe2pjLmNhbGwodGhpcyxbMSwxLDEsLTEsLTEsMSwtMSwxLC0xLDEsLTEsLTFdLFsyLDEsMCwwLDMsMiwxLDMsMCwyLDMsMV0sYSxjKTt0aGlzLnR5cGU9IlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsZGV0YWlsOmN9fWZ1bmN0aW9uIEhmKGEsYyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik9jdGFoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFJkKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFJkKGEsYyl7amMuY2FsbCh0aGlzLApbMSwwLDAsLTEsMCwwLDAsMSwwLDAsLTEsMCwwLDAsMSwwLDAsLTFdLFswLDIsNCwwLDQsMywwLDMsNSwwLDUsMiwxLDIsNSwxLDUsMywxLDMsNCwxLDQsMl0sYSxjKTt0aGlzLnR5cGU9Ik9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y319ZnVuY3Rpb24gSWYoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iSWNvc2FoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEhlKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEhlKGEsYyl7dmFyIGU9KDErTWF0aC5zcXJ0KDUpKS8yO2pjLmNhbGwodGhpcyxbLTEsZSwwLDEsZSwwLC0xLC1lLDAsMSwtZSwwLDAsLTEsZSwwLDEsZSwwLC0xLC1lLDAsMSwtZSxlLDAsLTEsZSwwLDEsLWUsMCwtMSwtZSwwLDFdLFswLDExLDUsMCw1LDEsMCwxLDcsMCw3LDEwLDAsMTAsMTEsCjEsNSw5LDUsMTEsNCwxMSwxMCwyLDEwLDcsNiw3LDEsOCwzLDksNCwzLDQsMiwzLDIsNiwzLDYsOCwzLDgsOSw0LDksNSwyLDQsMTEsNiwyLDEwLDgsNiw3LDksOCwxXSxhLGMpO3RoaXMudHlwZT0iSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y319ZnVuY3Rpb24gSmYoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRG9kZWNhaGVkcm9uR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsZGV0YWlsOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBJZShhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBJZShhLGMpe3ZhciBlPSgxK01hdGguc3FydCg1KSkvMixnPTEvZTtqYy5jYWxsKHRoaXMsWy0xLC0xLC0xLC0xLC0xLDEsLTEsMSwtMSwtMSwxLDEsMSwtMSwtMSwxLC0xLDEsMSwxLC0xLDEsMSwxLDAsLWcsLWUsMCwtZyxlLDAsZywtZSwwLGcsZSwtZywtZSwwLC1nLGUsMCxnLAotZSwwLGcsZSwwLC1lLDAsLWcsZSwwLC1nLC1lLDAsZyxlLDAsZ10sWzMsMTEsNywzLDcsMTUsMywxNSwxMyw3LDE5LDE3LDcsMTcsNiw3LDYsMTUsMTcsNCw4LDE3LDgsMTAsMTcsMTAsNiw4LDAsMTYsOCwxNiwyLDgsMiwxMCwwLDEyLDEsMCwxLDE4LDAsMTgsMTYsNiwxMCwyLDYsMiwxMyw2LDEzLDE1LDIsMTYsMTgsMiwxOCwzLDIsMywxMywxOCwxLDksMTgsOSwxMSwxOCwxMSwzLDQsMTQsMTIsNCwxMiwwLDQsMCw4LDExLDksNSwxMSw1LDE5LDExLDE5LDcsMTksNSwxNCwxOSwxNCw0LDE5LDQsMTcsMSwxMiwxNCwxLDE0LDUsMSw1LDldLGEsYyk7dGhpcy50eXBlPSJEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y319ZnVuY3Rpb24gS2YoYSxjLGUsZyxyLHYpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUdWJlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cGF0aDphLHR1YnVsYXJTZWdtZW50czpjLHJhZGl1czplLApyYWRpYWxTZWdtZW50czpnLGNsb3NlZDpyfTt2b2lkIDAhPT12JiZjb25zb2xlLndhcm4oIlRIUkVFLlR1YmVHZW9tZXRyeTogdGFwZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKTthPW5ldyBTZChhLGMsZSxnLHIpO3RoaXMudGFuZ2VudHM9YS50YW5nZW50czt0aGlzLm5vcm1hbHM9YS5ub3JtYWxzO3RoaXMuYmlub3JtYWxzPWEuYmlub3JtYWxzO3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KGEpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFNkKGEsYyxlLGcscil7ZnVuY3Rpb24gdihxYSl7Uz1hLmdldFBvaW50QXQocWEvYyxTKTt2YXIgdWE9Ry5ub3JtYWxzW3FhXTtxYT1HLmJpbm9ybWFsc1txYV07Zm9yKFc9MDtXPD1nO1crKyl7dmFyIG9hPVcvZypNYXRoLlBJKjIsdGE9TWF0aC5zaW4ob2EpO29hPS1NYXRoLmNvcyhvYSk7UC54PW9hKnVhLngrdGEqcWEueDtQLnk9b2EqdWEueSt0YSpxYS55O1Auej1vYSp1YS56K3RhKnFhLno7UC5ub3JtYWxpemUoKTtmYS5wdXNoKFAueCwKUC55LFAueik7Si54PVMueCtlKlAueDtKLnk9Uy55K2UqUC55O0ouej1TLnorZSpQLno7aGEucHVzaChKLngsSi55LEoueil9fWZ1bmN0aW9uIHooKXtmb3IoVz0xO1c8PWM7VysrKWZvcihWPTE7Vjw9ZztWKyspe3ZhciBxYT0oZysxKSpXKyhWLTEpLHVhPShnKzEpKlcrVixvYT0oZysxKSooVy0xKStWO3BhLnB1c2goKGcrMSkqKFctMSkrKFYtMSkscWEsb2EpO3BhLnB1c2gocWEsdWEsb2EpfX1mdW5jdGlvbiBFKCl7Zm9yKFY9MDtWPD1jO1YrKylmb3IoVz0wO1c8PWc7VysrKVIueD1WL2MsUi55PVcvZyxyYS5wdXNoKFIueCxSLnkpfXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUdWJlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cGF0aDphLHR1YnVsYXJTZWdtZW50czpjLHJhZGl1czplLHJhZGlhbFNlZ21lbnRzOmcsY2xvc2VkOnJ9O2M9Y3x8NjQ7ZT1lfHwxO2c9Z3x8ODtyPXJ8fCExO3ZhciBHPWEuY29tcHV0ZUZyZW5ldEZyYW1lcyhjLHIpO3RoaXMudGFuZ2VudHM9CkcudGFuZ2VudHM7dGhpcy5ub3JtYWxzPUcubm9ybWFsczt0aGlzLmJpbm9ybWFscz1HLmJpbm9ybWFsczt2YXIgSj1uZXcgayxQPW5ldyBrLFI9bmV3IGYsUz1uZXcgayxWLFcsaGE9W10sZmE9W10scmE9W10scGE9W107KGZ1bmN0aW9uKCl7Zm9yKFY9MDtWPGM7VisrKXYoVik7dighMT09PXI/YzowKTtFKCk7eigpfSkoKTt0aGlzLnNldEluZGV4KHBhKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShoYSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKGZhLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYShyYSwyKSl9ZnVuY3Rpb24gTGYoYSxjLGUsZyxyLHYseil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzS25vdEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHR1YmU6Yyx0dWJ1bGFyU2VnbWVudHM6ZSxyYWRpYWxTZWdtZW50czpnLHA6cixxOnZ9O3ZvaWQgMCE9PXomJmNvbnNvbGUud2FybigiVEhSRUUuVG9ydXNLbm90R2VvbWV0cnk6IGhlaWdodFNjYWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2NhbGUoIHgsIHksIHogKSBpbnN0ZWFkLiIpOwp0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgSmUoYSxjLGUsZyxyLHYpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBKZShhLGMsZSxnLHIsdil7ZnVuY3Rpb24geih0YSxCYSxUYSxVYSxDYSl7dmFyIEhhPU1hdGguc2luKHRhKTtCYT1UYS9CYSp0YTtUYT1NYXRoLmNvcyhCYSk7Q2EueD1VYSooMitUYSkqLjUqTWF0aC5jb3ModGEpO0NhLnk9VWEqKDIrVGEpKkhhKi41O0NhLno9VWEqTWF0aC5zaW4oQmEpKi41fXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSx0dWJlOmMsdHVidWxhclNlZ21lbnRzOmUscmFkaWFsU2VnbWVudHM6ZyxwOnIscTp2fTthPWF8fDE7Yz1jfHwuNDtlPU1hdGguZmxvb3IoZSl8fDY0O2c9TWF0aC5mbG9vcihnKXx8ODtyPXJ8fDI7dj12fHwzO3ZhciBFPVtdLEc9W10sSj1bXSxQPVtdLFIsUz1uZXcgayxWPW5ldyBrLFc9bmV3IGssaGE9bmV3IGssZmE9bmV3IGssCnJhPW5ldyBrLHBhPW5ldyBrO2ZvcihSPTA7Ujw9ZTsrK1Ipe3ZhciBxYT1SL2UqcipNYXRoLlBJKjI7eihxYSxyLHYsYSxXKTt6KHFhKy4wMSxyLHYsYSxoYSk7cmEuc3ViVmVjdG9ycyhoYSxXKTtwYS5hZGRWZWN0b3JzKGhhLFcpO2ZhLmNyb3NzVmVjdG9ycyhyYSxwYSk7cGEuY3Jvc3NWZWN0b3JzKGZhLHJhKTtmYS5ub3JtYWxpemUoKTtwYS5ub3JtYWxpemUoKTtmb3IocWE9MDtxYTw9ZzsrK3FhKXt2YXIgdWE9cWEvZypNYXRoLlBJKjIsb2E9LWMqTWF0aC5jb3ModWEpO3VhPWMqTWF0aC5zaW4odWEpO1MueD1XLngrKG9hKnBhLngrdWEqZmEueCk7Uy55PVcueSsob2EqcGEueSt1YSpmYS55KTtTLno9Vy56KyhvYSpwYS56K3VhKmZhLnopO0cucHVzaChTLngsUy55LFMueik7Vi5zdWJWZWN0b3JzKFMsVykubm9ybWFsaXplKCk7Si5wdXNoKFYueCxWLnksVi56KTtQLnB1c2goUi9lKTtQLnB1c2gocWEvZyl9fWZvcihxYT0xO3FhPD1lO3FhKyspZm9yKFI9MTtSPD1nO1IrKylhPQooZysxKSpxYSsoUi0xKSxjPShnKzEpKnFhK1Iscj0oZysxKSoocWEtMSkrUixFLnB1c2goKGcrMSkqKHFhLTEpKyhSLTEpLGEsciksRS5wdXNoKGEsYyxyKTt0aGlzLnNldEluZGV4KEUpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKEcsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShKLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYShQLDIpKX1mdW5jdGlvbiBNZihhLGMsZSxnLHIpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHR1YmU6YyxyYWRpYWxTZWdtZW50czplLHR1YnVsYXJTZWdtZW50czpnLGFyYzpyfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgS2UoYSxjLGUsZyxyKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gS2UoYSxjLGUsZyxyKXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVG9ydXNCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPQp7cmFkaXVzOmEsdHViZTpjLHJhZGlhbFNlZ21lbnRzOmUsdHVidWxhclNlZ21lbnRzOmcsYXJjOnJ9O2E9YXx8MTtjPWN8fC40O2U9TWF0aC5mbG9vcihlKXx8ODtnPU1hdGguZmxvb3IoZyl8fDY7cj1yfHwyKk1hdGguUEk7dmFyIHY9W10sej1bXSxFPVtdLEc9W10sSj1uZXcgayxQPW5ldyBrLFI9bmV3IGssUyxWO2ZvcihTPTA7Uzw9ZTtTKyspZm9yKFY9MDtWPD1nO1YrKyl7dmFyIFc9Vi9nKnIsaGE9Uy9lKk1hdGguUEkqMjtQLng9KGErYypNYXRoLmNvcyhoYSkpKk1hdGguY29zKFcpO1AueT0oYStjKk1hdGguY29zKGhhKSkqTWF0aC5zaW4oVyk7UC56PWMqTWF0aC5zaW4oaGEpO3oucHVzaChQLngsUC55LFAueik7Si54PWEqTWF0aC5jb3MoVyk7Si55PWEqTWF0aC5zaW4oVyk7Ui5zdWJWZWN0b3JzKFAsSikubm9ybWFsaXplKCk7RS5wdXNoKFIueCxSLnksUi56KTtHLnB1c2goVi9nKTtHLnB1c2goUy9lKX1mb3IoUz0xO1M8PWU7UysrKWZvcihWPTE7Vjw9ZztWKyspYT0oZysKMSkqKFMtMSkrVi0xLGM9KGcrMSkqKFMtMSkrVixyPShnKzEpKlMrVix2LnB1c2goKGcrMSkqUytWLTEsYSxyKSx2LnB1c2goYSxjLHIpO3RoaXMuc2V0SW5kZXgodik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoeiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKEUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKEcsMikpfWZ1bmN0aW9uIEdqKGEsYyxlLGcscil7aWYocj09PTA8WGwoYSxjLGUsZykpZm9yKHI9YztyPGU7cis9Zyl2YXIgdj1IaihyLGFbcl0sYVtyKzFdLHYpO2Vsc2UgZm9yKHI9ZS1nO3I+PWM7ci09Zyl2PUhqKHIsYVtyXSxhW3IrMV0sdik7diYmVGQodix2Lm5leHQpJiYoTmYodiksdj12Lm5leHQpO3JldHVybiB2fWZ1bmN0aW9uIE9mKGEsYyl7aWYoIWEpcmV0dXJuIGE7Y3x8KGM9YSk7ZG97dmFyIGU9ITE7aWYoYS5zdGVpbmVyfHwhVGQoYSxhLm5leHQpJiYwIT09V2IoYS5wcmV2LGEsYS5uZXh0KSlhPWEubmV4dDsKZWxzZXtOZihhKTthPWM9YS5wcmV2O2lmKGE9PT1hLm5leHQpYnJlYWs7ZT0hMH19d2hpbGUoZXx8YSE9PWMpO3JldHVybiBjfWZ1bmN0aW9uIFBmKGEsYyxlLGcscix2LHope2lmKGEpeyF6JiZ2JiZZbChhLGcscix2KTtmb3IodmFyIEU9YSxHLEo7YS5wcmV2IT09YS5uZXh0OylpZihHPWEucHJldixKPWEubmV4dCx2P1psKGEsZyxyLHYpOiRsKGEpKWMucHVzaChHLmkvZSksYy5wdXNoKGEuaS9lKSxjLnB1c2goSi5pL2UpLE5mKGEpLEU9YT1KLm5leHQ7ZWxzZSBpZihhPUosYT09PUUpe3o/MT09PXo/KGE9YW0oYSxjLGUpLFBmKGEsYyxlLGcscix2LDIpKToyPT09eiYmYm0oYSxjLGUsZyxyLHYpOlBmKE9mKGEpLGMsZSxnLHIsdiwxKTticmVha319fWZ1bmN0aW9uICRsKGEpe3ZhciBjPWEucHJldixlPWEubmV4dDtpZigwPD1XYihjLGEsZSkpcmV0dXJuITE7Zm9yKHZhciBnPWEubmV4dC5uZXh0O2chPT1hLnByZXY7KXtpZihMZShjLngsYy55LGEueCxhLnksZS54LGUueSxnLngsCmcueSkmJjA8PVdiKGcucHJldixnLGcubmV4dCkpcmV0dXJuITE7Zz1nLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gWmwoYSxjLGUsZyl7dmFyIHI9YS5wcmV2LHY9YS5uZXh0O2lmKDA8PVdiKHIsYSx2KSlyZXR1cm4hMTt2YXIgej1yLng+YS54P3IueD52Lng/ci54OnYueDphLng+di54P2EueDp2LngsRT1yLnk+YS55P3IueT52Lnk/ci55OnYueTphLnk+di55P2EueTp2LnksRz1ZaChyLng8YS54P3IueDx2Lng/ci54OnYueDphLng8di54P2EueDp2Lngsci55PGEueT9yLnk8di55P3IueTp2Lnk6YS55PHYueT9hLnk6di55LGMsZSxnKTtjPVloKHosRSxjLGUsZyk7ZT1hLnByZXZaO2ZvcihnPWEubmV4dFo7ZSYmZS56Pj1HJiZnJiZnLno8PWM7KXtpZihlIT09YS5wcmV2JiZlIT09YS5uZXh0JiZMZShyLngsci55LGEueCxhLnksdi54LHYueSxlLngsZS55KSYmMDw9V2IoZS5wcmV2LGUsZS5uZXh0KSlyZXR1cm4hMTtlPWUucHJldlo7aWYoZyE9PWEucHJldiYmZyE9PWEubmV4dCYmTGUoci54LApyLnksYS54LGEueSx2Lngsdi55LGcueCxnLnkpJiYwPD1XYihnLnByZXYsZyxnLm5leHQpKXJldHVybiExO2c9Zy5uZXh0Wn1mb3IoO2UmJmUuej49Rzspe2lmKGUhPT1hLnByZXYmJmUhPT1hLm5leHQmJkxlKHIueCxyLnksYS54LGEueSx2Lngsdi55LGUueCxlLnkpJiYwPD1XYihlLnByZXYsZSxlLm5leHQpKXJldHVybiExO2U9ZS5wcmV2Wn1mb3IoO2cmJmcuejw9Yzspe2lmKGchPT1hLnByZXYmJmchPT1hLm5leHQmJkxlKHIueCxyLnksYS54LGEueSx2Lngsdi55LGcueCxnLnkpJiYwPD1XYihnLnByZXYsZyxnLm5leHQpKXJldHVybiExO2c9Zy5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBhbShhLGMsZSl7dmFyIGc9YTtkb3t2YXIgcj1nLnByZXYsdj1nLm5leHQubmV4dDshVGQocix2KSYmSWoocixnLGcubmV4dCx2KSYmUWYocix2KSYmUWYodixyKSYmKGMucHVzaChyLmkvZSksYy5wdXNoKGcuaS9lKSxjLnB1c2godi5pL2UpLE5mKGcpLE5mKGcubmV4dCksZz1hPXYpO2c9Zy5uZXh0fXdoaWxlKGchPT0KYSk7cmV0dXJuIGd9ZnVuY3Rpb24gYm0oYSxjLGUsZyxyLHYpe3ZhciB6PWE7ZG97Zm9yKHZhciBFPXoubmV4dC5uZXh0O0UhPT16LnByZXY7KXtpZih6LmkhPT1FLmkmJmNtKHosRSkpe2E9SmooeixFKTt6PU9mKHosei5uZXh0KTthPU9mKGEsYS5uZXh0KTtQZih6LGMsZSxnLHIsdik7UGYoYSxjLGUsZyxyLHYpO3JldHVybn1FPUUubmV4dH16PXoubmV4dH13aGlsZSh6IT09YSl9ZnVuY3Rpb24gZG0oYSxjLGUsZyl7dmFyIHI9W10sdjt2YXIgej0wO2Zvcih2PWMubGVuZ3RoO3o8djt6Kyspe3ZhciBFPWNbel0qZzt2YXIgRz16PHYtMT9jW3orMV0qZzphLmxlbmd0aDtFPUdqKGEsRSxHLGcsITEpO0U9PT1FLm5leHQmJihFLnN0ZWluZXI9ITApO3IucHVzaChlbShFKSl9ci5zb3J0KGZtKTtmb3Ioej0wO3o8ci5sZW5ndGg7eisrKWdtKHJbel0sZSksZT1PZihlLGUubmV4dCk7cmV0dXJuIGV9ZnVuY3Rpb24gZm0oYSxjKXtyZXR1cm4gYS54LWMueH1mdW5jdGlvbiBnbShhLGMpe2lmKGM9CmhtKGEsYykpYT1KaihjLGEpLE9mKGEsYS5uZXh0KX1mdW5jdGlvbiBobShhLGMpe3ZhciBlPWMsZz1hLngscj1hLnksdj0tSW5maW5pdHk7ZG97aWYocjw9ZS55JiZyPj1lLm5leHQueSYmZS5uZXh0LnkhPT1lLnkpe3ZhciB6PWUueCsoci1lLnkpKihlLm5leHQueC1lLngpLyhlLm5leHQueS1lLnkpO2lmKHo8PWcmJno+dil7dj16O2lmKHo9PT1nKXtpZihyPT09ZS55KXJldHVybiBlO2lmKHI9PT1lLm5leHQueSlyZXR1cm4gZS5uZXh0fXZhciBFPWUueDxlLm5leHQueD9lOmUubmV4dH19ZT1lLm5leHR9d2hpbGUoZSE9PWMpO2lmKCFFKXJldHVybiBudWxsO2lmKGc9PT12KXJldHVybiBFLnByZXY7Yz1FO3o9RS54O3ZhciBHPUUueSxKPUluZmluaXR5O2ZvcihlPUUubmV4dDtlIT09Yzspe2lmKGc+PWUueCYmZS54Pj16JiZnIT09ZS54JiZMZShyPEc/Zzp2LHIseixHLHI8Rz92OmcscixlLngsZS55KSl7dmFyIFA9TWF0aC5hYnMoci1lLnkpLyhnLWUueCk7KFA8Snx8UD09PUomJgplLng+RS54KSYmUWYoZSxhKSYmKEU9ZSxKPVApfWU9ZS5uZXh0fXJldHVybiBFfWZ1bmN0aW9uIFlsKGEsYyxlLGcpe3ZhciByPWE7ZG8gbnVsbD09PXIueiYmKHIuej1ZaChyLngsci55LGMsZSxnKSksci5wcmV2Wj1yLnByZXYscj1yLm5leHRaPXIubmV4dDt3aGlsZShyIT09YSk7ci5wcmV2Wi5uZXh0Wj1udWxsO3IucHJldlo9bnVsbDtpbShyKX1mdW5jdGlvbiBpbShhKXt2YXIgYyxlLGcscix2PTE7ZG97dmFyIHo9YTt2YXIgRT1hPW51bGw7Zm9yKGU9MDt6Oyl7ZSsrO3ZhciBHPXo7Zm9yKGM9Zz0wO2M8diYmKGcrKyxHPUcubmV4dFosRyk7YysrKTtmb3Iocj12OzA8Z3x8MDxyJiZHOykwIT09ZyYmKDA9PT1yfHwhR3x8ei56PD1HLnopPyhjPXosej16Lm5leHRaLGctLSk6KGM9RyxHPUcubmV4dFosci0tKSxFP0UubmV4dFo9YzphPWMsYy5wcmV2Wj1FLEU9Yzt6PUd9RS5uZXh0Wj1udWxsO3YqPTJ9d2hpbGUoMTxlKTtyZXR1cm4gYX1mdW5jdGlvbiBZaChhLGMsZSxnLHIpe2E9CjMyNzY3KihhLWUpKnI7Yz0zMjc2NyooYy1nKSpyO2E9KGF8YTw8OCkmMTY3MTE5MzU7YT0oYXxhPDw0KSYyNTI2NDUxMzU7YT0oYXxhPDwyKSY4NTg5OTM0NTk7Yz0oY3xjPDw4KSYxNjcxMTkzNTtjPShjfGM8PDQpJjI1MjY0NTEzNTtjPShjfGM8PDIpJjg1ODk5MzQ1OTtyZXR1cm4oYXxhPDwxKSYxNDMxNjU1NzY1fCgoY3xjPDwxKSYxNDMxNjU1NzY1KTw8MX1mdW5jdGlvbiBlbShhKXt2YXIgYz1hLGU9YTtkb3tpZihjLng8ZS54fHxjLng9PT1lLngmJmMueTxlLnkpZT1jO2M9Yy5uZXh0fXdoaWxlKGMhPT1hKTtyZXR1cm4gZX1mdW5jdGlvbiBMZShhLGMsZSxnLHIsdix6LEUpe3JldHVybiAwPD0oci16KSooYy1FKS0oYS16KSoodi1FKSYmMDw9KGEteikqKGctRSktKGUteikqKGMtRSkmJjA8PShlLXopKih2LUUpLShyLXopKihnLUUpfWZ1bmN0aW9uIGNtKGEsYyl7cmV0dXJuIGEubmV4dC5pIT09Yy5pJiZhLnByZXYuaSE9PWMuaSYmIWptKGEsYykmJlFmKGEsYykmJlFmKGMsYSkmJgprbShhLGMpfWZ1bmN0aW9uIFdiKGEsYyxlKXtyZXR1cm4oYy55LWEueSkqKGUueC1jLngpLShjLngtYS54KSooZS55LWMueSl9ZnVuY3Rpb24gVGQoYSxjKXtyZXR1cm4gYS54PT09Yy54JiZhLnk9PT1jLnl9ZnVuY3Rpb24gSWooYSxjLGUsZyl7cmV0dXJuIFRkKGEsZSkmJlRkKGMsZyl8fFRkKGEsZykmJlRkKGUsYyk/ITA6MDxXYihhLGMsZSkhPT0wPFdiKGEsYyxnKSYmMDxXYihlLGcsYSkhPT0wPFdiKGUsZyxjKX1mdW5jdGlvbiBqbShhLGMpe3ZhciBlPWE7ZG97aWYoZS5pIT09YS5pJiZlLm5leHQuaSE9PWEuaSYmZS5pIT09Yy5pJiZlLm5leHQuaSE9PWMuaSYmSWooZSxlLm5leHQsYSxjKSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09YSk7cmV0dXJuITF9ZnVuY3Rpb24gUWYoYSxjKXtyZXR1cm4gMD5XYihhLnByZXYsYSxhLm5leHQpPzA8PVdiKGEsYyxhLm5leHQpJiYwPD1XYihhLGEucHJldixjKTowPldiKGEsYyxhLnByZXYpfHwwPldiKGEsYS5uZXh0LGMpfWZ1bmN0aW9uIGttKGEsCmMpe3ZhciBlPWEsZz0hMSxyPShhLngrYy54KS8yO2M9KGEueStjLnkpLzI7ZG8gZS55PmMhPT1lLm5leHQueT5jJiZlLm5leHQueSE9PWUueSYmcjwoZS5uZXh0LngtZS54KSooYy1lLnkpLyhlLm5leHQueS1lLnkpK2UueCYmKGc9IWcpLGU9ZS5uZXh0O3doaWxlKGUhPT1hKTtyZXR1cm4gZ31mdW5jdGlvbiBKaihhLGMpe3ZhciBlPW5ldyBaaChhLmksYS54LGEueSksZz1uZXcgWmgoYy5pLGMueCxjLnkpLHI9YS5uZXh0LHY9Yy5wcmV2O2EubmV4dD1jO2MucHJldj1hO2UubmV4dD1yO3IucHJldj1lO2cubmV4dD1lO2UucHJldj1nO3YubmV4dD1nO2cucHJldj12O3JldHVybiBnfWZ1bmN0aW9uIEhqKGEsYyxlLGcpe2E9bmV3IFpoKGEsYyxlKTtnPyhhLm5leHQ9Zy5uZXh0LGEucHJldj1nLGcubmV4dC5wcmV2PWEsZy5uZXh0PWEpOihhLnByZXY9YSxhLm5leHQ9YSk7cmV0dXJuIGF9ZnVuY3Rpb24gTmYoYSl7YS5uZXh0LnByZXY9YS5wcmV2O2EucHJldi5uZXh0PWEubmV4dDthLnByZXZaJiYKKGEucHJldloubmV4dFo9YS5uZXh0Wik7YS5uZXh0WiYmKGEubmV4dFoucHJldlo9YS5wcmV2Wil9ZnVuY3Rpb24gWmgoYSxjLGUpe3RoaXMuaT1hO3RoaXMueD1jO3RoaXMueT1lO3RoaXMubmV4dFo9dGhpcy5wcmV2Wj10aGlzLno9dGhpcy5uZXh0PXRoaXMucHJldj1udWxsO3RoaXMuc3RlaW5lcj0hMX1mdW5jdGlvbiBYbChhLGMsZSxnKXtmb3IodmFyIHI9MCx2PWUtZztjPGU7Yys9ZylyKz0oYVt2XS1hW2NdKSooYVtjKzFdK2FbdisxXSksdj1jO3JldHVybiByfWZ1bmN0aW9uIEtqKGEpe3ZhciBjPWEubGVuZ3RoOzI8YyYmYVtjLTFdLmVxdWFscyhhWzBdKSYmYS5wb3AoKX1mdW5jdGlvbiBMaihhLGMpe2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKWEucHVzaChjW2VdLngpLGEucHVzaChjW2VdLnkpfWZ1bmN0aW9uIFVkKGEsYyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YSxvcHRpb25zOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBSYyhhLApjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUmMoYSxjKXtmdW5jdGlvbiBlKEcpe2Z1bmN0aW9uIEooUWEsZWIsbWIpe2VifHxjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IHZlYyBkb2VzIG5vdCBleGlzdCIpO3JldHVybiBlYi5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKG1iKS5hZGQoUWEpfWZ1bmN0aW9uIFAoUWEsZWIsbWIpe3ZhciBwYj1RYS54LWViLng7dmFyIHNiPVFhLnktZWIueTt2YXIgS2I9bWIueC1RYS54O3ZhciBTYj1tYi55LVFhLnksbmM9cGIqcGIrc2Iqc2I7aWYoTWF0aC5hYnMocGIqU2Itc2IqS2IpPk51bWJlci5FUFNJTE9OKXt2YXIgUWM9TWF0aC5zcXJ0KG5jKSx6Yz1NYXRoLnNxcnQoS2IqS2IrU2IqU2IpO25jPWViLngtc2IvUWM7ZWI9ZWIueStwYi9RYztTYj0oKG1iLngtU2IvemMtbmMpKlNiLShtYi55K0tiL3pjLWViKSpLYikvKHBiKlNiLXNiKktiKTtLYj1uYytwYipTYi1RYS54O3BiPWViK3NiKlNiLVFhLnk7c2I9S2IqCktiK3BiKnBiO2lmKDI+PXNiKXJldHVybiBuZXcgZihLYixwYik7c2I9TWF0aC5zcXJ0KHNiLzIpfWVsc2UgUWE9ITEscGI+TnVtYmVyLkVQU0lMT04/S2I+TnVtYmVyLkVQU0lMT04mJihRYT0hMCk6cGI8LU51bWJlci5FUFNJTE9OP0tiPC1OdW1iZXIuRVBTSUxPTiYmKFFhPSEwKTpNYXRoLnNpZ24oc2IpPT09TWF0aC5zaWduKFNiKSYmKFFhPSEwKSxRYT8oS2I9LXNiLHNiPU1hdGguc3FydChuYykpOihLYj1wYixwYj1zYixzYj1NYXRoLnNxcnQobmMvMikpO3JldHVybiBuZXcgZihLYi9zYixwYi9zYil9ZnVuY3Rpb24gUihRYSxlYil7Zm9yKGphPVFhLmxlbmd0aDswPD0tLWphOyl7dmFyIG1iPWphO3ZhciBwYj1qYS0xOzA+cGImJihwYj1RYS5sZW5ndGgtMSk7dmFyIHNiLEtiPXFhKzIqVWE7Zm9yKHNiPTA7c2I8S2I7c2IrKyl7dmFyIFNiPVlhKnNiLG5jPVlhKihzYisxKTtXKGViK21iK1NiLGViK3BiK1NiLGViK3BiK25jLGViK21iK25jKX19fWZ1bmN0aW9uIFMoUWEsZWIsbWIpe3JhLnB1c2goUWEpOwpyYS5wdXNoKGViKTtyYS5wdXNoKG1iKX1mdW5jdGlvbiBWKFFhLGViLG1iKXtoYShRYSk7aGEoZWIpO2hhKG1iKTtRYT1yLmxlbmd0aC8zO1FhPUhhLmdlbmVyYXRlVG9wVVYoZyxyLFFhLTMsUWEtMixRYS0xKTtmYShRYVswXSk7ZmEoUWFbMV0pO2ZhKFFhWzJdKX1mdW5jdGlvbiBXKFFhLGViLG1iLHBiKXtoYShRYSk7aGEoZWIpO2hhKHBiKTtoYShlYik7aGEobWIpO2hhKHBiKTtRYT1yLmxlbmd0aC8zO1FhPUhhLmdlbmVyYXRlU2lkZVdhbGxVVihnLHIsUWEtNixRYS0zLFFhLTIsUWEtMSk7ZmEoUWFbMF0pO2ZhKFFhWzFdKTtmYShRYVszXSk7ZmEoUWFbMV0pO2ZhKFFhWzJdKTtmYShRYVszXSl9ZnVuY3Rpb24gaGEoUWEpe3IucHVzaChyYVszKlFhXSk7ci5wdXNoKHJhWzMqUWErMV0pO3IucHVzaChyYVszKlFhKzJdKX1mdW5jdGlvbiBmYShRYSl7di5wdXNoKFFhLngpO3YucHVzaChRYS55KX12YXIgcmE9W10scGE9dm9pZCAwIT09Yy5jdXJ2ZVNlZ21lbnRzP2MuY3VydmVTZWdtZW50czoKMTIscWE9dm9pZCAwIT09Yy5zdGVwcz9jLnN0ZXBzOjEsdWE9dm9pZCAwIT09Yy5kZXB0aD9jLmRlcHRoOjEwMCxvYT12b2lkIDAhPT1jLmJldmVsRW5hYmxlZD9jLmJldmVsRW5hYmxlZDohMCx0YT12b2lkIDAhPT1jLmJldmVsVGhpY2tuZXNzP2MuYmV2ZWxUaGlja25lc3M6NixCYT12b2lkIDAhPT1jLmJldmVsU2l6ZT9jLmJldmVsU2l6ZTp0YS0yLFRhPXZvaWQgMCE9PWMuYmV2ZWxPZmZzZXQ/Yy5iZXZlbE9mZnNldDowLFVhPXZvaWQgMCE9PWMuYmV2ZWxTZWdtZW50cz9jLmJldmVsU2VnbWVudHM6MyxDYT1jLmV4dHJ1ZGVQYXRoLEhhPXZvaWQgMCE9PWMuVVZHZW5lcmF0b3I/Yy5VVkdlbmVyYXRvcjpsbTt2b2lkIDAhPT1jLmFtb3VudCYmKGNvbnNvbGUud2FybigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiBhbW91bnQgaGFzIGJlZW4gcmVuYW1lZCB0byBkZXB0aC4iKSx1YT1jLmFtb3VudCk7dmFyIERhPSExO2lmKENhKXt2YXIgTWE9Q2EuZ2V0U3BhY2VkUG9pbnRzKHFhKTsKRGE9ITA7b2E9ITE7dmFyIGRiPUNhLmNvbXB1dGVGcmVuZXRGcmFtZXMocWEsITEpO3ZhciB0Yj1uZXcgazt2YXIgS2E9bmV3IGs7dmFyIGJiPW5ldyBrfW9hfHwoVGE9QmE9dGE9VWE9MCk7dmFyIGpiO3BhPUcuZXh0cmFjdFBvaW50cyhwYSk7Rz1wYS5zaGFwZTt2YXIgRWI9cGEuaG9sZXM7aWYoIWVkLmlzQ2xvY2tXaXNlKEcpKXtHPUcucmV2ZXJzZSgpO3ZhciB4Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKyl7dmFyIGlhPUViW3hiXTtlZC5pc0Nsb2NrV2lzZShpYSkmJihFYlt4Yl09aWEucmV2ZXJzZSgpKX19dmFyIG5hPWVkLnRyaWFuZ3VsYXRlU2hhcGUoRyxFYiksemE9Rzt4Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKylpYT1FYlt4Yl0sRz1HLmNvbmNhdChpYSk7dmFyIEphLFlhPUcubGVuZ3RoLE5hLGNiPW5hLmxlbmd0aDtwYT1bXTt2YXIgamE9MDt2YXIgR2E9emEubGVuZ3RoO3ZhciBMYT1HYS0xO2ZvcihKYT1qYSsxO2phPEdhO2phKyssTGErKyxKYSsrKUxhPT09CkdhJiYoTGE9MCksSmE9PT1HYSYmKEphPTApLHBhW2phXT1QKHphW2phXSx6YVtMYV0semFbSmFdKTtDYT1bXTt2YXIgbmI9cGEuY29uY2F0KCk7eGI9MDtmb3IoamI9RWIubGVuZ3RoO3hiPGpiO3hiKyspe2lhPUViW3hiXTt2YXIgVmE9W107amE9MDtHYT1pYS5sZW5ndGg7TGE9R2EtMTtmb3IoSmE9amErMTtqYTxHYTtqYSsrLExhKyssSmErKylMYT09PUdhJiYoTGE9MCksSmE9PT1HYSYmKEphPTApLFZhW2phXT1QKGlhW2phXSxpYVtMYV0saWFbSmFdKTtDYS5wdXNoKFZhKTtuYj1uYi5jb25jYXQoVmEpfWZvcihMYT0wO0xhPFVhO0xhKyspe0dhPUxhL1VhO3ZhciBpYj10YSpNYXRoLmNvcyhHYSpNYXRoLlBJLzIpO0phPUJhKk1hdGguc2luKEdhKk1hdGguUEkvMikrVGE7amE9MDtmb3IoR2E9emEubGVuZ3RoO2phPEdhO2phKyspe3ZhciBrYj1KKHphW2phXSxwYVtqYV0sSmEpO1Moa2IueCxrYi55LC1pYil9eGI9MDtmb3IoamI9RWIubGVuZ3RoO3hiPGpiO3hiKyspZm9yKGlhPQpFYlt4Yl0sVmE9Q2FbeGJdLGphPTAsR2E9aWEubGVuZ3RoO2phPEdhO2phKyspa2I9SihpYVtqYV0sVmFbamFdLEphKSxTKGtiLngsa2IueSwtaWIpfUphPUJhK1RhO2ZvcihqYT0wO2phPFlhO2phKyspa2I9b2E/SihHW2phXSxuYltqYV0sSmEpOkdbamFdLERhPyhLYS5jb3B5KGRiLm5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGtiLngpLHRiLmNvcHkoZGIuYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihrYi55KSxiYi5jb3B5KE1hWzBdKS5hZGQoS2EpLmFkZCh0YiksUyhiYi54LGJiLnksYmIueikpOlMoa2IueCxrYi55LDApO2ZvcihHYT0xO0dhPD1xYTtHYSsrKWZvcihqYT0wO2phPFlhO2phKyspa2I9b2E/SihHW2phXSxuYltqYV0sSmEpOkdbamFdLERhPyhLYS5jb3B5KGRiLm5vcm1hbHNbR2FdKS5tdWx0aXBseVNjYWxhcihrYi54KSx0Yi5jb3B5KGRiLmJpbm9ybWFsc1tHYV0pLm11bHRpcGx5U2NhbGFyKGtiLnkpLGJiLmNvcHkoTWFbR2FdKS5hZGQoS2EpLmFkZCh0YiksClMoYmIueCxiYi55LGJiLnopKTpTKGtiLngsa2IueSx1YS9xYSpHYSk7Zm9yKExhPVVhLTE7MDw9TGE7TGEtLSl7R2E9TGEvVWE7aWI9dGEqTWF0aC5jb3MoR2EqTWF0aC5QSS8yKTtKYT1CYSpNYXRoLnNpbihHYSpNYXRoLlBJLzIpK1RhO2phPTA7Zm9yKEdhPXphLmxlbmd0aDtqYTxHYTtqYSsrKWtiPUooemFbamFdLHBhW2phXSxKYSksUyhrYi54LGtiLnksdWEraWIpO3hiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKWZvcihpYT1FYlt4Yl0sVmE9Q2FbeGJdLGphPTAsR2E9aWEubGVuZ3RoO2phPEdhO2phKyspa2I9SihpYVtqYV0sVmFbamFdLEphKSxEYT9TKGtiLngsa2IueStNYVtxYS0xXS55LE1hW3FhLTFdLngraWIpOlMoa2IueCxrYi55LHVhK2liKX0oZnVuY3Rpb24oKXt2YXIgUWE9ci5sZW5ndGgvMztpZihvYSl7dmFyIGViPTAqWWE7Zm9yKGphPTA7amE8Y2I7amErKylOYT1uYVtqYV0sVihOYVsyXStlYixOYVsxXStlYixOYVswXStlYik7ZWI9WWEqKHFhKzIqVWEpOwpmb3IoamE9MDtqYTxjYjtqYSsrKU5hPW5hW2phXSxWKE5hWzBdK2ViLE5hWzFdK2ViLE5hWzJdK2ViKX1lbHNle2ZvcihqYT0wO2phPGNiO2phKyspTmE9bmFbamFdLFYoTmFbMl0sTmFbMV0sTmFbMF0pO2ZvcihqYT0wO2phPGNiO2phKyspTmE9bmFbamFdLFYoTmFbMF0rWWEqcWEsTmFbMV0rWWEqcWEsTmFbMl0rWWEqcWEpfWcuYWRkR3JvdXAoUWEsci5sZW5ndGgvMy1RYSwwKX0pKCk7KGZ1bmN0aW9uKCl7dmFyIFFhPXIubGVuZ3RoLzMsZWI9MDtSKHphLGViKTtlYis9emEubGVuZ3RoO3hiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKWlhPUViW3hiXSxSKGlhLGViKSxlYis9aWEubGVuZ3RoO2cuYWRkR3JvdXAoUWEsci5sZW5ndGgvMy1RYSwxKX0pKCl9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YSxvcHRpb25zOmN9O2E9QXJyYXkuaXNBcnJheShhKT9hOlthXTtmb3IodmFyIGc9dGhpcywKcj1bXSx2PVtdLHo9MCxFPWEubGVuZ3RoO3o8RTt6KyspZShhW3pdKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShyLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYSh2LDIpKTt0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl9ZnVuY3Rpb24gTWooYSxjLGUpe2Uuc2hhcGVzPVtdO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKHZhciBnPTAscj1hLmxlbmd0aDtnPHI7ZysrKWUuc2hhcGVzLnB1c2goYVtnXS51dWlkKTtlbHNlIGUuc2hhcGVzLnB1c2goYS51dWlkKTt2b2lkIDAhPT1jLmV4dHJ1ZGVQYXRoJiYoZS5vcHRpb25zLmV4dHJ1ZGVQYXRoPWMuZXh0cnVkZVBhdGgudG9KU09OKCkpO3JldHVybiBlfWZ1bmN0aW9uIFJmKGEsYyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRleHRHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt0ZXh0OmEscGFyYW1ldGVyczpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgTWUoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9CmZ1bmN0aW9uIE1lKGEsYyl7Yz1jfHx7fTt2YXIgZT1jLmZvbnQ7aWYoIWV8fCFlLmlzRm9udClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuVGV4dEdlb21ldHJ5OiBmb250IHBhcmFtZXRlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRm9udC4iKSxuZXcgeWE7YT1lLmdlbmVyYXRlU2hhcGVzKGEsYy5zaXplKTtjLmRlcHRoPXZvaWQgMCE9PWMuaGVpZ2h0P2MuaGVpZ2h0OjUwO3ZvaWQgMD09PWMuYmV2ZWxUaGlja25lc3MmJihjLmJldmVsVGhpY2tuZXNzPTEwKTt2b2lkIDA9PT1jLmJldmVsU2l6ZSYmKGMuYmV2ZWxTaXplPTgpO3ZvaWQgMD09PWMuYmV2ZWxFbmFibGVkJiYoYy5iZXZlbEVuYWJsZWQ9ITEpO1JjLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iVGV4dEJ1ZmZlckdlb21ldHJ5In1mdW5jdGlvbiBTZihhLGMsZSxnLHIsdix6KXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3BoZXJlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsd2lkdGhTZWdtZW50czpjLApoZWlnaHRTZWdtZW50czplLHBoaVN0YXJ0OmcscGhpTGVuZ3RoOnIsdGhldGFTdGFydDp2LHRoZXRhTGVuZ3RoOnp9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBCZChhLGMsZSxnLHIsdix6KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gQmQoYSxjLGUsZyxyLHYseil7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNwaGVyZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHdpZHRoU2VnbWVudHM6YyxoZWlnaHRTZWdtZW50czplLHBoaVN0YXJ0OmcscGhpTGVuZ3RoOnIsdGhldGFTdGFydDp2LHRoZXRhTGVuZ3RoOnp9O2E9YXx8MTtjPU1hdGgubWF4KDMsTWF0aC5mbG9vcihjKXx8OCk7ZT1NYXRoLm1heCgyLE1hdGguZmxvb3IoZSl8fDYpO2c9dm9pZCAwIT09Zz9nOjA7cj12b2lkIDAhPT1yP3I6MipNYXRoLlBJO3Y9dm9pZCAwIT09dj92OjA7ej12b2lkIDAhPT16P3o6TWF0aC5QSTt2YXIgRT1NYXRoLm1pbih2K3osTWF0aC5QSSksRywKSixQPTAsUj1bXSxTPW5ldyBrLFY9bmV3IGssVz1bXSxoYT1bXSxmYT1bXSxyYT1bXTtmb3IoSj0wO0o8PWU7SisrKXt2YXIgcGE9W10scWE9Si9lLHVhPTA7MD09SiYmMD09dj91YT0uNS9jOko9PWUmJkU9PU1hdGguUEkmJih1YT0tLjUvYyk7Zm9yKEc9MDtHPD1jO0crKyl7dmFyIG9hPUcvYztTLng9LWEqTWF0aC5jb3MoZytvYSpyKSpNYXRoLnNpbih2K3FhKnopO1MueT1hKk1hdGguY29zKHYrcWEqeik7Uy56PWEqTWF0aC5zaW4oZytvYSpyKSpNYXRoLnNpbih2K3FhKnopO2hhLnB1c2goUy54LFMueSxTLnopO1YuY29weShTKS5ub3JtYWxpemUoKTtmYS5wdXNoKFYueCxWLnksVi56KTtyYS5wdXNoKG9hK3VhLDEtcWEpO3BhLnB1c2goUCsrKX1SLnB1c2gocGEpfWZvcihKPTA7SjxlO0orKylmb3IoRz0wO0c8YztHKyspYT1SW0pdW0crMV0sZz1SW0pdW0ddLHI9UltKKzFdW0ddLHo9UltKKzFdW0crMV0sKDAhPT1KfHwwPHYpJiZXLnB1c2goYSxnLHopLChKIT09ZS0xfHxFPE1hdGguUEkpJiYKVy5wdXNoKGcscix6KTt0aGlzLnNldEluZGV4KFcpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGhhLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoZmEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHJhLDIpKX1mdW5jdGlvbiBUZihhLGMsZSxnLHIsdil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlJpbmdHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtpbm5lclJhZGl1czphLG91dGVyUmFkaXVzOmMsdGhldGFTZWdtZW50czplLHBoaVNlZ21lbnRzOmcsdGhldGFTdGFydDpyLHRoZXRhTGVuZ3RoOnZ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBOZShhLGMsZSxnLHIsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIE5lKGEsYyxlLGcscix2KXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUmluZ0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2lubmVyUmFkaXVzOmEsb3V0ZXJSYWRpdXM6Yyx0aGV0YVNlZ21lbnRzOmUsCnBoaVNlZ21lbnRzOmcsdGhldGFTdGFydDpyLHRoZXRhTGVuZ3RoOnZ9O2E9YXx8LjU7Yz1jfHwxO3I9dm9pZCAwIT09cj9yOjA7dj12b2lkIDAhPT12P3Y6MipNYXRoLlBJO2U9dm9pZCAwIT09ZT9NYXRoLm1heCgzLGUpOjg7Zz12b2lkIDAhPT1nP01hdGgubWF4KDEsZyk6MTt2YXIgej1bXSxFPVtdLEc9W10sSj1bXSxQPWEsUj0oYy1hKS9nLFM9bmV3IGssVj1uZXcgZixXLGhhO2ZvcihXPTA7Vzw9ZztXKyspe2ZvcihoYT0wO2hhPD1lO2hhKyspYT1yK2hhL2UqdixTLng9UCpNYXRoLmNvcyhhKSxTLnk9UCpNYXRoLnNpbihhKSxFLnB1c2goUy54LFMueSxTLnopLEcucHVzaCgwLDAsMSksVi54PShTLngvYysxKS8yLFYueT0oUy55L2MrMSkvMixKLnB1c2goVi54LFYueSk7UCs9Un1mb3IoVz0wO1c8ZztXKyspZm9yKGM9VyooZSsxKSxoYT0wO2hhPGU7aGErKylhPWhhK2Mscj1hK2UrMSx2PWErZSsyLFA9YSsxLHoucHVzaChhLHIsUCksei5wdXNoKHIsdixQKTt0aGlzLnNldEluZGV4KHopOwp0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShFLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoRywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoSiwyKSl9ZnVuY3Rpb24gVWYoYSxjLGUsZyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxhdGhlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cG9pbnRzOmEsc2VnbWVudHM6YyxwaGlTdGFydDplLHBoaUxlbmd0aDpnfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgT2UoYSxjLGUsZykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIE9lKGEsYyxlLGcpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMYXRoZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3BvaW50czphLHNlZ21lbnRzOmMscGhpU3RhcnQ6ZSxwaGlMZW5ndGg6Z307Yz1NYXRoLmZsb29yKGMpfHwxMjtlPWV8fDA7Zz1nfHwyKk1hdGguUEk7Zz1oYi5jbGFtcChnLDAsMipNYXRoLlBJKTt2YXIgcj0KW10sdj1bXSx6PVtdLEU9MS9jLEc9bmV3IGssSj1uZXcgZixQO2ZvcihQPTA7UDw9YztQKyspe3ZhciBSPWUrUCpFKmc7dmFyIFM9TWF0aC5zaW4oUiksVj1NYXRoLmNvcyhSKTtmb3IoUj0wO1I8PWEubGVuZ3RoLTE7UisrKUcueD1hW1JdLngqUyxHLnk9YVtSXS55LEcuej1hW1JdLngqVix2LnB1c2goRy54LEcueSxHLnopLEoueD1QL2MsSi55PVIvKGEubGVuZ3RoLTEpLHoucHVzaChKLngsSi55KX1mb3IoUD0wO1A8YztQKyspZm9yKFI9MDtSPGEubGVuZ3RoLTE7UisrKWU9UitQKmEubGVuZ3RoLEU9ZSthLmxlbmd0aCxHPWUrYS5sZW5ndGgrMSxKPWUrMSxyLnB1c2goZSxFLEopLHIucHVzaChFLEcsSik7dGhpcy5zZXRJbmRleChyKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYSh2LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYSh6LDIpKTt0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7aWYoZz09PTIqTWF0aC5QSSlmb3IoZz10aGlzLmF0dHJpYnV0ZXMubm9ybWFsLmFycmF5LApyPW5ldyBrLHY9bmV3IGssej1uZXcgayxlPWMqYS5sZW5ndGgqMyxSPVA9MDtQPGEubGVuZ3RoO1ArKyxSKz0zKXIueD1nW1IrMF0sci55PWdbUisxXSxyLno9Z1tSKzJdLHYueD1nW2UrUiswXSx2Lnk9Z1tlK1IrMV0sdi56PWdbZStSKzJdLHouYWRkVmVjdG9ycyhyLHYpLm5vcm1hbGl6ZSgpLGdbUiswXT1nW2UrUiswXT16LngsZ1tSKzFdPWdbZStSKzFdPXoueSxnW1IrMl09Z1tlK1IrMl09ei56fWZ1bmN0aW9uIFZkKGEsYyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYXBlR2VvbWV0cnkiOyJvYmplY3QiPT09dHlwZW9mIGMmJihjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlR2VvbWV0cnk6IE9wdGlvbnMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQuIiksYz1jLmN1cnZlU2VnbWVudHMpO3RoaXMucGFyYW1ldGVycz17c2hhcGVzOmEsY3VydmVTZWdtZW50czpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgV2QoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gV2QoYSwKYyl7ZnVuY3Rpb24gZShQKXt2YXIgUixTPXIubGVuZ3RoLzM7UD1QLmV4dHJhY3RQb2ludHMoYyk7dmFyIFY9UC5zaGFwZSxXPVAuaG9sZXM7ITE9PT1lZC5pc0Nsb2NrV2lzZShWKSYmKFY9Vi5yZXZlcnNlKCkpO1A9MDtmb3IoUj1XLmxlbmd0aDtQPFI7UCsrKXt2YXIgaGE9V1tQXTshMD09PWVkLmlzQ2xvY2tXaXNlKGhhKSYmKFdbUF09aGEucmV2ZXJzZSgpKX12YXIgZmE9ZWQudHJpYW5ndWxhdGVTaGFwZShWLFcpO1A9MDtmb3IoUj1XLmxlbmd0aDtQPFI7UCsrKWhhPVdbUF0sVj1WLmNvbmNhdChoYSk7UD0wO2ZvcihSPVYubGVuZ3RoO1A8UjtQKyspaGE9VltQXSxyLnB1c2goaGEueCxoYS55LDApLHYucHVzaCgwLDAsMSksei5wdXNoKGhhLngsaGEueSk7UD0wO2ZvcihSPWZhLmxlbmd0aDtQPFI7UCsrKVY9ZmFbUF0sZy5wdXNoKFZbMF0rUyxWWzFdK1MsVlsyXStTKSxHKz0zfXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTaGFwZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9CntzaGFwZXM6YSxjdXJ2ZVNlZ21lbnRzOmN9O2M9Y3x8MTI7dmFyIGc9W10scj1bXSx2PVtdLHo9W10sRT0wLEc9MDtpZighMT09PUFycmF5LmlzQXJyYXkoYSkpZShhKTtlbHNlIGZvcih2YXIgSj0wO0o8YS5sZW5ndGg7SisrKWUoYVtKXSksdGhpcy5hZGRHcm91cChFLEcsSiksRSs9RyxHPTA7dGhpcy5zZXRJbmRleChnKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShyLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoeiwyKSl9ZnVuY3Rpb24gTmooYSxjKXtjLnNoYXBlcz1bXTtpZihBcnJheS5pc0FycmF5KGEpKWZvcih2YXIgZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyljLnNoYXBlcy5wdXNoKGFbZV0udXVpZCk7ZWxzZSBjLnNoYXBlcy5wdXNoKGEudXVpZCk7cmV0dXJuIGN9ZnVuY3Rpb24gUGUoYSxjKXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRWRnZXNHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPQp7dGhyZXNob2xkQW5nbGU6Y307dmFyIGU9W107Yz1NYXRoLmNvcyhoYi5ERUcyUkFEKih2b2lkIDAhPT1jP2M6MSkpO3ZhciBnPVswLDBdLHI9e30sdj1bImEiLCJiIiwiYyJdO2lmKGEuaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHo9bmV3IHlhO3ouZnJvbUJ1ZmZlckdlb21ldHJ5KGEpfWVsc2Ugej1hLmNsb25lKCk7ei5tZXJnZVZlcnRpY2VzKCk7ei5jb21wdXRlRmFjZU5vcm1hbHMoKTthPXoudmVydGljZXM7ej16LmZhY2VzO2Zvcih2YXIgRT0wLEc9ei5sZW5ndGg7RTxHO0UrKylmb3IodmFyIEo9eltFXSxQPTA7Mz5QO1ArKyl7dmFyIFI9Slt2W1BdXTt2YXIgUz1KW3ZbKFArMSklM11dO2dbMF09TWF0aC5taW4oUixTKTtnWzFdPU1hdGgubWF4KFIsUyk7Uj1nWzBdKyIsIitnWzFdO3ZvaWQgMD09PXJbUl0/cltSXT17aW5kZXgxOmdbMF0saW5kZXgyOmdbMV0sZmFjZTE6RSxmYWNlMjp2b2lkIDB9OnJbUl0uZmFjZTI9RX1mb3IoUiBpbiByKWlmKGc9cltSXSx2b2lkIDA9PT1nLmZhY2UyfHwKeltnLmZhY2UxXS5ub3JtYWwuZG90KHpbZy5mYWNlMl0ubm9ybWFsKTw9Yyl2PWFbZy5pbmRleDFdLGUucHVzaCh2Lngsdi55LHYueiksdj1hW2cuaW5kZXgyXSxlLnB1c2godi54LHYueSx2LnopO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGUsMykpfWZ1bmN0aW9uIFhkKGEsYyxlLGcscix2LHosRSl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN5bGluZGVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOmEscmFkaXVzQm90dG9tOmMsaGVpZ2h0OmUscmFkaWFsU2VnbWVudHM6ZyxoZWlnaHRTZWdtZW50czpyLG9wZW5FbmRlZDp2LHRoZXRhU3RhcnQ6eix0aGV0YUxlbmd0aDpFfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgZmQoYSxjLGUsZyxyLHYseixFKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gZmQoYSxjLGUsZyxyLHYseixFKXtmdW5jdGlvbiBHKHBhKXt2YXIgcWEsdWE9bmV3IGYsb2E9bmV3IGssdGE9MCxCYT0hMD09PQpwYT9hOmMsVGE9ITA9PT1wYT8xOi0xO3ZhciBVYT1XO2ZvcihxYT0xO3FhPD1nO3FhKyspUi5wdXNoKDAsZmEqVGEsMCksUy5wdXNoKDAsVGEsMCksVi5wdXNoKC41LC41KSxXKys7dmFyIENhPVc7Zm9yKHFhPTA7cWE8PWc7cWErKyl7dmFyIEhhPXFhL2cqRSt6LERhPU1hdGguY29zKEhhKTtIYT1NYXRoLnNpbihIYSk7b2EueD1CYSpIYTtvYS55PWZhKlRhO29hLno9QmEqRGE7Ui5wdXNoKG9hLngsb2EueSxvYS56KTtTLnB1c2goMCxUYSwwKTt1YS54PS41KkRhKy41O3VhLnk9LjUqSGEqVGErLjU7Vi5wdXNoKHVhLngsdWEueSk7VysrfWZvcihxYT0wO3FhPGc7cWErKyl1YT1VYStxYSxvYT1DYStxYSwhMD09PXBhP1AucHVzaChvYSxvYSsxLHVhKTpQLnB1c2gob2ErMSxvYSx1YSksdGErPTM7Si5hZGRHcm91cChyYSx0YSwhMD09PXBhPzE6Mik7cmErPXRhfXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1c1RvcDphLApyYWRpdXNCb3R0b206YyxoZWlnaHQ6ZSxyYWRpYWxTZWdtZW50czpnLGhlaWdodFNlZ21lbnRzOnIsb3BlbkVuZGVkOnYsdGhldGFTdGFydDp6LHRoZXRhTGVuZ3RoOkV9O3ZhciBKPXRoaXM7YT12b2lkIDAhPT1hP2E6MTtjPXZvaWQgMCE9PWM/YzoxO2U9ZXx8MTtnPU1hdGguZmxvb3IoZyl8fDg7cj1NYXRoLmZsb29yKHIpfHwxO3Y9dm9pZCAwIT09dj92OiExO3o9dm9pZCAwIT09ej96OjA7RT12b2lkIDAhPT1FP0U6MipNYXRoLlBJO3ZhciBQPVtdLFI9W10sUz1bXSxWPVtdLFc9MCxoYT1bXSxmYT1lLzIscmE9MDsoZnVuY3Rpb24oKXt2YXIgcGEscWEsdWE9bmV3IGssb2E9bmV3IGssdGE9MCxCYT0oYy1hKS9lO2ZvcihxYT0wO3FhPD1yO3FhKyspe3ZhciBUYT1bXSxVYT1xYS9yLENhPVVhKihjLWEpK2E7Zm9yKHBhPTA7cGE8PWc7cGErKyl7dmFyIEhhPXBhL2csRGE9SGEqRSt6LE1hPU1hdGguc2luKERhKTtEYT1NYXRoLmNvcyhEYSk7b2EueD1DYSpNYTtvYS55PS1VYSplK2ZhOwpvYS56PUNhKkRhO1IucHVzaChvYS54LG9hLnksb2Eueik7dWEuc2V0KE1hLEJhLERhKS5ub3JtYWxpemUoKTtTLnB1c2godWEueCx1YS55LHVhLnopO1YucHVzaChIYSwxLVVhKTtUYS5wdXNoKFcrKyl9aGEucHVzaChUYSl9Zm9yKHBhPTA7cGE8ZztwYSsrKWZvcihxYT0wO3FhPHI7cWErKyl1YT1oYVtxYSsxXVtwYV0sb2E9aGFbcWErMV1bcGErMV0sQmE9aGFbcWFdW3BhKzFdLFAucHVzaChoYVtxYV1bcGFdLHVhLEJhKSxQLnB1c2godWEsb2EsQmEpLHRhKz02O0ouYWRkR3JvdXAocmEsdGEsMCk7cmErPXRhfSkoKTshMT09PXYmJigwPGEmJkcoITApLDA8YyYmRyghMSkpO3RoaXMuc2V0SW5kZXgoUCk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoUiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKFMsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKFYsMikpfWZ1bmN0aW9uIFZmKGEsYyxlLGcscix2LHope1hkLmNhbGwodGhpcywKMCxhLGMsZSxnLHIsdix6KTt0aGlzLnR5cGU9IkNvbmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxoZWlnaHQ6YyxyYWRpYWxTZWdtZW50czplLGhlaWdodFNlZ21lbnRzOmcsb3BlbkVuZGVkOnIsdGhldGFTdGFydDp2LHRoZXRhTGVuZ3RoOnp9fWZ1bmN0aW9uIFdmKGEsYyxlLGcscix2LHope2ZkLmNhbGwodGhpcywwLGEsYyxlLGcscix2LHopO3RoaXMudHlwZT0iQ29uZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGhlaWdodDpjLHJhZGlhbFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6ZyxvcGVuRW5kZWQ6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en19ZnVuY3Rpb24gWGYoYSxjLGUsZyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNpcmNsZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHNlZ21lbnRzOmMsdGhldGFTdGFydDplLHRoZXRhTGVuZ3RoOmd9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBRZShhLApjLGUsZykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFFlKGEsYyxlLGcpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDaXJjbGVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxzZWdtZW50czpjLHRoZXRhU3RhcnQ6ZSx0aGV0YUxlbmd0aDpnfTthPWF8fDE7Yz12b2lkIDAhPT1jP01hdGgubWF4KDMsYyk6ODtlPXZvaWQgMCE9PWU/ZTowO2c9dm9pZCAwIT09Zz9nOjIqTWF0aC5QSTt2YXIgcj1bXSx2PVtdLHo9W10sRT1bXSxHLEo9bmV3IGssUD1uZXcgZjt2LnB1c2goMCwwLDApO3oucHVzaCgwLDAsMSk7RS5wdXNoKC41LC41KTt2YXIgUj0wO2ZvcihHPTM7Ujw9YztSKyssRys9Myl7dmFyIFM9ZStSL2MqZztKLng9YSpNYXRoLmNvcyhTKTtKLnk9YSpNYXRoLnNpbihTKTt2LnB1c2goSi54LEoueSxKLnopO3oucHVzaCgwLDAsMSk7UC54PSh2W0ddL2ErMSkvMjtQLnk9KHZbRysxXS9hKzEpLzI7RS5wdXNoKFAueCxQLnkpfWZvcihHPTE7Rzw9CmM7RysrKXIucHVzaChHLEcrMSwwKTt0aGlzLnNldEluZGV4KHIpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHYsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYSh6LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYShFLDIpKX1mdW5jdGlvbiBZZChhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTaGFkb3dNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgwKTt0aGlzLnRyYW5zcGFyZW50PSEwO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIFJlKGEpe3FiLmNhbGwodGhpcyxhKTt0aGlzLnR5cGU9IlJhd1NoYWRlck1hdGVyaWFsIn1mdW5jdGlvbiBTYyhhKXtNLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn07dGhpcy50eXBlPSJNZXNoU3RhbmRhcmRNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5tZXRhbG5lc3M9dGhpcy5yb3VnaG5lc3M9LjU7dGhpcy5saWdodE1hcD10aGlzLm1hcD0KbnVsbDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTE7dGhpcy5hb01hcD1udWxsO3RoaXMuYW9NYXBJbnRlbnNpdHk9MTt0aGlzLmVtaXNzaXZlPW5ldyBJKDApO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MTt0aGlzLmJ1bXBNYXA9dGhpcy5lbWlzc2l2ZU1hcD1udWxsO3RoaXMuYnVtcFNjYWxlPTE7dGhpcy5ub3JtYWxNYXA9bnVsbDt0aGlzLm5vcm1hbE1hcFR5cGU9MDt0aGlzLm5vcm1hbFNjYWxlPW5ldyBmKDEsMSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLm1ldGFsbmVzc01hcD10aGlzLnJvdWdobmVzc01hcD1udWxsO3RoaXMuZW52TWFwSW50ZW5zaXR5PTE7dGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4O3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVjYXA9CiJyb3VuZCI7dGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBaZChhKXtTYy5jYWxsKHRoaXMpO3RoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiIsUEhZU0lDQUw6IiJ9O3RoaXMudHlwZT0iTWVzaFBoeXNpY2FsTWF0ZXJpYWwiO3RoaXMucmVmbGVjdGl2aXR5PS41O3RoaXMuY2xlYXJjb2F0Um91Z2huZXNzPXRoaXMuY2xlYXJjb2F0PTA7dGhpcy5zaGVlbj1udWxsO3RoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1udWxsO3RoaXMudHJhbnNwYXJlbmN5PTA7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gQmMoYSl7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaFBob25nTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEkoMTY3NzcyMTUpO3RoaXMuc3BlY3VsYXI9bmV3IEkoMTExODQ4MSk7dGhpcy5zaGluaW5lc3M9MzA7dGhpcy5saWdodE1hcD0KdGhpcy5tYXA9bnVsbDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTE7dGhpcy5hb01hcD1udWxsO3RoaXMuYW9NYXBJbnRlbnNpdHk9MTt0aGlzLmVtaXNzaXZlPW5ldyBJKDApO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MTt0aGlzLmJ1bXBNYXA9dGhpcy5lbWlzc2l2ZU1hcD1udWxsO3RoaXMuYnVtcFNjYWxlPTE7dGhpcy5ub3JtYWxNYXA9bnVsbDt0aGlzLm5vcm1hbE1hcFR5cGU9MDt0aGlzLm5vcm1hbFNjYWxlPW5ldyBmKDEsMSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLnNwZWN1bGFyTWFwPW51bGw7dGhpcy5jb21iaW5lPTA7dGhpcy5yZWZsZWN0aXZpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0KInJvdW5kIjt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uICRkKGEpe0JjLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtUT09OOiIifTt0aGlzLnR5cGU9Ik1lc2hUb29uTWF0ZXJpYWwiO3RoaXMuZ3JhZGllbnRNYXA9bnVsbDt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBhZShhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoTm9ybWFsTWF0ZXJpYWwiO3RoaXMuYnVtcE1hcD1udWxsO3RoaXMuYnVtcFNjYWxlPTE7dGhpcy5ub3JtYWxNYXA9bnVsbDt0aGlzLm5vcm1hbE1hcFR5cGU9MDt0aGlzLm5vcm1hbFNjYWxlPW5ldyBmKDEsMSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz0KdGhpcy5za2lubmluZz10aGlzLmxpZ2h0cz10aGlzLmZvZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBiZShhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoTGFtYmVydE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmxpZ2h0TWFwPXRoaXMubWFwPW51bGw7dGhpcy5saWdodE1hcEludGVuc2l0eT0xO3RoaXMuYW9NYXA9bnVsbDt0aGlzLmFvTWFwSW50ZW5zaXR5PTE7dGhpcy5lbWlzc2l2ZT1uZXcgSSgwKTt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTE7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLnNwZWN1bGFyTWFwPXRoaXMuZW1pc3NpdmVNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCI7CnRoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gY2UoYSl7TS5jYWxsKHRoaXMpO3RoaXMuZGVmaW5lcz17TUFUQ0FQOiIifTt0aGlzLnR5cGU9Ik1lc2hNYXRjYXBNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5idW1wTWFwPXRoaXMubWFwPXRoaXMubWF0Y2FwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmFscGhhTWFwPW51bGw7dGhpcy5saWdodHM9dGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBkZShhKXtGYi5jYWxsKHRoaXMpOwp0aGlzLnR5cGU9IkxpbmVEYXNoZWRNYXRlcmlhbCI7dGhpcy5zY2FsZT0xO3RoaXMuZGFzaFNpemU9Mzt0aGlzLmdhcFNpemU9MTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBvYyhhLGMsZSxnKXt0aGlzLnBhcmFtZXRlclBvc2l0aW9ucz1hO3RoaXMuX2NhY2hlZEluZGV4PTA7dGhpcy5yZXN1bHRCdWZmZXI9dm9pZCAwIT09Zz9nOm5ldyBjLmNvbnN0cnVjdG9yKGUpO3RoaXMuc2FtcGxlVmFsdWVzPWM7dGhpcy52YWx1ZVNpemU9ZX1mdW5jdGlvbiBFZyhhLGMsZSxnKXtvYy5jYWxsKHRoaXMsYSxjLGUsZyk7dGhpcy5fb2Zmc2V0TmV4dD10aGlzLl93ZWlnaHROZXh0PXRoaXMuX29mZnNldFByZXY9dGhpcy5fd2VpZ2h0UHJldj0tMH1mdW5jdGlvbiBZZihhLGMsZSxnKXtvYy5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gRmcoYSxjLGUsZyl7b2MuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIFhiKGEsYyxlLGcpe2lmKHZvaWQgMD09PWEpdGhyb3cgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkIik7CmlmKHZvaWQgMD09PWN8fDA9PT1jLmxlbmd0aCl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICIrYSk7dGhpcy5uYW1lPWE7dGhpcy50aW1lcz1UYi5jb252ZXJ0QXJyYXkoYyx0aGlzLlRpbWVCdWZmZXJUeXBlKTt0aGlzLnZhbHVlcz1UYi5jb252ZXJ0QXJyYXkoZSx0aGlzLlZhbHVlQnVmZmVyVHlwZSk7dGhpcy5zZXRJbnRlcnBvbGF0aW9uKGd8fHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pfWZ1bmN0aW9uIEdnKGEsYyxlKXtYYi5jYWxsKHRoaXMsYSxjLGUpfWZ1bmN0aW9uIEhnKGEsYyxlLGcpe1hiLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBTZShhLGMsZSxnKXtYYi5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gSWcoYSxjLGUsZyl7b2MuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIFpmKGEsYyxlLGcpe1hiLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBKZyhhLGMsZSxnKXtYYi5jYWxsKHRoaXMsCmEsYyxlLGcpfWZ1bmN0aW9uIFRlKGEsYyxlLGcpe1hiLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiB0YyhhLGMsZSl7dGhpcy5uYW1lPWE7dGhpcy50cmFja3M9ZTt0aGlzLmR1cmF0aW9uPXZvaWQgMCE9PWM/YzotMTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7MD50aGlzLmR1cmF0aW9uJiZ0aGlzLnJlc2V0RHVyYXRpb24oKX1mdW5jdGlvbiBtbShhKXtzd2l0Y2goYS50b0xvd2VyQ2FzZSgpKXtjYXNlICJzY2FsYXIiOmNhc2UgImRvdWJsZSI6Y2FzZSAiZmxvYXQiOmNhc2UgIm51bWJlciI6Y2FzZSAiaW50ZWdlciI6cmV0dXJuIFNlO2Nhc2UgInZlY3RvciI6Y2FzZSAidmVjdG9yMiI6Y2FzZSAidmVjdG9yMyI6Y2FzZSAidmVjdG9yNCI6cmV0dXJuIFRlO2Nhc2UgImNvbG9yIjpyZXR1cm4gSGc7Y2FzZSAicXVhdGVybmlvbiI6cmV0dXJuIFpmO2Nhc2UgImJvb2wiOmNhc2UgImJvb2xlYW4iOnJldHVybiBHZztjYXNlICJzdHJpbmciOnJldHVybiBKZ310aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVW5zdXBwb3J0ZWQgdHlwZU5hbWU6ICIrCmEpO31mdW5jdGlvbiBubShhKXtpZih2b2lkIDA9PT1hLnR5cGUpdGhyb3cgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIHR5cGUgdW5kZWZpbmVkLCBjYW4gbm90IHBhcnNlIik7dmFyIGM9bW0oYS50eXBlKTtpZih2b2lkIDA9PT1hLnRpbWVzKXt2YXIgZT1bXSxnPVtdO1RiLmZsYXR0ZW5KU09OKGEua2V5cyxlLGcsInZhbHVlIik7YS50aW1lcz1lO2EudmFsdWVzPWd9cmV0dXJuIHZvaWQgMCE9PWMucGFyc2U/Yy5wYXJzZShhKTpuZXcgYyhhLm5hbWUsYS50aW1lcyxhLnZhbHVlcyxhLmludGVycG9sYXRpb24pfWZ1bmN0aW9uICRoKGEsYyxlKXt2YXIgZz10aGlzLHI9ITEsdj0wLHo9MCxFPXZvaWQgMDt0aGlzLm9uU3RhcnQ9dm9pZCAwO3RoaXMub25Mb2FkPWE7dGhpcy5vblByb2dyZXNzPWM7dGhpcy5vbkVycm9yPWU7dGhpcy5pdGVtU3RhcnQ9ZnVuY3Rpb24oRyl7eisrO2lmKCExPT09ciYmdm9pZCAwIT09Zy5vblN0YXJ0KWcub25TdGFydChHLHYseik7cj0hMH07CnRoaXMuaXRlbUVuZD1mdW5jdGlvbihHKXt2Kys7aWYodm9pZCAwIT09Zy5vblByb2dyZXNzKWcub25Qcm9ncmVzcyhHLHYseik7aWYodj09PXomJihyPSExLHZvaWQgMCE9PWcub25Mb2FkKSlnLm9uTG9hZCgpfTt0aGlzLml0ZW1FcnJvcj1mdW5jdGlvbihHKXtpZih2b2lkIDAhPT1nLm9uRXJyb3IpZy5vbkVycm9yKEcpfTt0aGlzLnJlc29sdmVVUkw9ZnVuY3Rpb24oRyl7cmV0dXJuIEU/RShHKTpHfTt0aGlzLnNldFVSTE1vZGlmaWVyPWZ1bmN0aW9uKEcpe0U9RztyZXR1cm4gdGhpc319ZnVuY3Rpb24gRGIoYSl7dGhpcy5tYW5hZ2VyPXZvaWQgMCE9PWE/YTpPajt0aGlzLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiO3RoaXMucmVzb3VyY2VQYXRoPXRoaXMucGF0aD0iIn1mdW5jdGlvbiB1YyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gYWkoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIGJpKGEpe0RiLmNhbGwodGhpcyxhKTt0aGlzLl9wYXJzZXI9bnVsbH1mdW5jdGlvbiBLZyhhKXtEYi5jYWxsKHRoaXMsCmEpO3RoaXMuX3BhcnNlcj1udWxsfWZ1bmN0aW9uIFVlKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBMZyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gTWcoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIFphKCl7dGhpcy50eXBlPSJDdXJ2ZSI7dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9MjAwfWZ1bmN0aW9uIHBjKGEsYyxlLGcscix2LHosRSl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkVsbGlwc2VDdXJ2ZSI7dGhpcy5hWD1hfHwwO3RoaXMuYVk9Y3x8MDt0aGlzLnhSYWRpdXM9ZXx8MTt0aGlzLnlSYWRpdXM9Z3x8MTt0aGlzLmFTdGFydEFuZ2xlPXJ8fDA7dGhpcy5hRW5kQW5nbGU9dnx8MipNYXRoLlBJO3RoaXMuYUNsb2Nrd2lzZT16fHwhMTt0aGlzLmFSb3RhdGlvbj1FfHwwfWZ1bmN0aW9uIFZlKGEsYyxlLGcscix2KXtwYy5jYWxsKHRoaXMsYSxjLGUsZSxnLHIsdik7dGhpcy50eXBlPSJBcmNDdXJ2ZSJ9ZnVuY3Rpb24gY2koKXtmdW5jdGlvbiBhKHYseixFLApHKXtjPXY7ZT1FO2c9LTMqdiszKnotMipFLUc7cj0yKnYtMip6K0UrR312YXIgYz0wLGU9MCxnPTAscj0wO3JldHVybntpbml0Q2F0bXVsbFJvbTpmdW5jdGlvbih2LHosRSxHLEope2EoeixFLEoqKEUtdiksSiooRy16KSl9LGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTpmdW5jdGlvbih2LHosRSxHLEosUCxSKXthKHosRSwoKHotdikvSi0oRS12KS8oSitQKSsoRS16KS9QKSpQLCgoRS16KS9QLShHLXopLyhQK1IpKyhHLUUpL1IpKlApfSxjYWxjOmZ1bmN0aW9uKHYpe3ZhciB6PXYqdjtyZXR1cm4gYytlKnYrZyp6K3Iqeip2fX19ZnVuY3Rpb24gWmIoYSxjLGUsZyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNhdG11bGxSb21DdXJ2ZTMiO3RoaXMucG9pbnRzPWF8fFtdO3RoaXMuY2xvc2VkPWN8fCExO3RoaXMuY3VydmVUeXBlPWV8fCJjZW50cmlwZXRhbCI7dGhpcy50ZW5zaW9uPWd8fC41fWZ1bmN0aW9uIFBqKGEsYyxlLGcscil7Yz0uNSooZy1jKTtyPS41KihyLWUpO3ZhciB2PQphKmE7cmV0dXJuKDIqZS0yKmcrYytyKSphKnYrKC0zKmUrMypnLTIqYy1yKSp2K2MqYStlfWZ1bmN0aW9uIG9tKGEsYyl7YT0xLWE7cmV0dXJuIGEqYSpjfWZ1bmN0aW9uIHBtKGEsYyl7cmV0dXJuIDIqKDEtYSkqYSpjfWZ1bmN0aW9uIHFtKGEsYyl7cmV0dXJuIGEqYSpjfWZ1bmN0aW9uICRmKGEsYyxlLGcpe3JldHVybiBvbShhLGMpK3BtKGEsZSkrcW0oYSxnKX1mdW5jdGlvbiBybShhLGMpe2E9MS1hO3JldHVybiBhKmEqYSpjfWZ1bmN0aW9uIHNtKGEsYyl7dmFyIGU9MS1hO3JldHVybiAzKmUqZSphKmN9ZnVuY3Rpb24gdG0oYSxjKXtyZXR1cm4gMyooMS1hKSphKmEqY31mdW5jdGlvbiB1bShhLGMpe3JldHVybiBhKmEqYSpjfWZ1bmN0aW9uIGFnKGEsYyxlLGcscil7cmV0dXJuIHJtKGEsYykrc20oYSxlKSt0bShhLGcpK3VtKGEscil9ZnVuY3Rpb24gQ2MoYSxjLGUsZyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUiO3RoaXMudjA9YXx8bmV3IGY7CnRoaXMudjE9Y3x8bmV3IGY7dGhpcy52Mj1lfHxuZXcgZjt0aGlzLnYzPWd8fG5ldyBmfWZ1bmN0aW9uIFRjKGEsYyxlLGcpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlMyI7dGhpcy52MD1hfHxuZXcgazt0aGlzLnYxPWN8fG5ldyBrO3RoaXMudjI9ZXx8bmV3IGs7dGhpcy52Mz1nfHxuZXcga31mdW5jdGlvbiBrYyhhLGMpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaW5lQ3VydmUiO3RoaXMudjE9YXx8bmV3IGY7dGhpcy52Mj1jfHxuZXcgZn1mdW5jdGlvbiBEYyhhLGMpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaW5lQ3VydmUzIjt0aGlzLnYxPWF8fG5ldyBrO3RoaXMudjI9Y3x8bmV3IGt9ZnVuY3Rpb24gRWMoYSxjLGUpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZSI7dGhpcy52MD1hfHxuZXcgZjt0aGlzLnYxPWN8fG5ldyBmO3RoaXMudjI9ZXx8bmV3IGZ9ZnVuY3Rpb24gVWMoYSxjLGUpe1phLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUzIjt0aGlzLnYwPWF8fG5ldyBrO3RoaXMudjE9Y3x8bmV3IGs7dGhpcy52Mj1lfHxuZXcga31mdW5jdGlvbiBGYyhhKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3BsaW5lQ3VydmUiO3RoaXMucG9pbnRzPWF8fFtdfWZ1bmN0aW9uIGdkKCl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1cnZlUGF0aCI7dGhpcy5jdXJ2ZXM9W107dGhpcy5hdXRvQ2xvc2U9ITF9ZnVuY3Rpb24gR2MoYSl7Z2QuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBhdGgiO3RoaXMuY3VycmVudFBvaW50PW5ldyBmO2EmJnRoaXMuc2V0RnJvbVBvaW50cyhhKX1mdW5jdGlvbiBDZChhKXtHYy5jYWxsKHRoaXMsYSk7dGhpcy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpO3RoaXMudHlwZT0iU2hhcGUiO3RoaXMuaG9sZXM9W119ZnVuY3Rpb24gSmIoYSxjKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaWdodCI7dGhpcy5jb2xvcj1uZXcgSShhKTt0aGlzLmludGVuc2l0eT0Kdm9pZCAwIT09Yz9jOjE7dGhpcy5yZWNlaXZlU2hhZG93PXZvaWQgMH1mdW5jdGlvbiBOZyhhLGMsZSl7SmIuY2FsbCh0aGlzLGEsZSk7dGhpcy50eXBlPSJIZW1pc3BoZXJlTGlnaHQiO3RoaXMuY2FzdFNoYWRvdz12b2lkIDA7dGhpcy5wb3NpdGlvbi5jb3B5KEEuRGVmYXVsdFVwKTt0aGlzLnVwZGF0ZU1hdHJpeCgpO3RoaXMuZ3JvdW5kQ29sb3I9bmV3IEkoYyl9ZnVuY3Rpb24gVmMoYSl7dGhpcy5jYW1lcmE9YTt0aGlzLmJpYXM9MDt0aGlzLnJhZGl1cz0xO3RoaXMubWFwU2l6ZT1uZXcgZig1MTIsNTEyKTt0aGlzLm1hcFBhc3M9dGhpcy5tYXA9bnVsbDt0aGlzLm1hdHJpeD1uZXcgcTt0aGlzLl9mcnVzdHVtPW5ldyBpYzt0aGlzLl9mcmFtZUV4dGVudHM9bmV3IGYoMSwxKTt0aGlzLl92aWV3cG9ydENvdW50PTE7dGhpcy5fdmlld3BvcnRzPVtuZXcgcCgwLDAsMSwxKV19ZnVuY3Rpb24gT2coKXtWYy5jYWxsKHRoaXMsbmV3IHZiKDUwLDEsLjUsNTAwKSl9ZnVuY3Rpb24gUGcoYSwKYyxlLGcscix2KXtKYi5jYWxsKHRoaXMsYSxjKTt0aGlzLnR5cGU9IlNwb3RMaWdodCI7dGhpcy5wb3NpdGlvbi5jb3B5KEEuRGVmYXVsdFVwKTt0aGlzLnVwZGF0ZU1hdHJpeCgpO3RoaXMudGFyZ2V0PW5ldyBBO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb3dlciIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmludGVuc2l0eSpNYXRoLlBJfSxzZXQ6ZnVuY3Rpb24oeil7dGhpcy5pbnRlbnNpdHk9ei9NYXRoLlBJfX0pO3RoaXMuZGlzdGFuY2U9dm9pZCAwIT09ZT9lOjA7dGhpcy5hbmdsZT12b2lkIDAhPT1nP2c6TWF0aC5QSS8zO3RoaXMucGVudW1icmE9dm9pZCAwIT09cj9yOjA7dGhpcy5kZWNheT12b2lkIDAhPT12P3Y6MTt0aGlzLnNoYWRvdz1uZXcgT2d9ZnVuY3Rpb24gZGkoKXtWYy5jYWxsKHRoaXMsbmV3IHZiKDkwLDEsLjUsNTAwKSk7dGhpcy5fZnJhbWVFeHRlbnRzPW5ldyBmKDQsMik7dGhpcy5fdmlld3BvcnRDb3VudD02O3RoaXMuX3ZpZXdwb3J0cz1bbmV3IHAoMiwKMSwxLDEpLG5ldyBwKDAsMSwxLDEpLG5ldyBwKDMsMSwxLDEpLG5ldyBwKDEsMSwxLDEpLG5ldyBwKDMsMCwxLDEpLG5ldyBwKDEsMCwxLDEpXTt0aGlzLl9jdWJlRGlyZWN0aW9ucz1bbmV3IGsoMSwwLDApLG5ldyBrKC0xLDAsMCksbmV3IGsoMCwwLDEpLG5ldyBrKDAsMCwtMSksbmV3IGsoMCwxLDApLG5ldyBrKDAsLTEsMCldO3RoaXMuX2N1YmVVcHM9W25ldyBrKDAsMSwwKSxuZXcgaygwLDEsMCksbmV3IGsoMCwxLDApLG5ldyBrKDAsMSwwKSxuZXcgaygwLDAsMSksbmV3IGsoMCwwLC0xKV19ZnVuY3Rpb24gUWcoYSxjLGUsZyl7SmIuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJQb2ludExpZ2h0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicG93ZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gNCp0aGlzLmludGVuc2l0eSpNYXRoLlBJfSxzZXQ6ZnVuY3Rpb24ocil7dGhpcy5pbnRlbnNpdHk9ci8oNCpNYXRoLlBJKX19KTt0aGlzLmRpc3RhbmNlPXZvaWQgMCE9PWU/CmU6MDt0aGlzLmRlY2F5PXZvaWQgMCE9PWc/ZzoxO3RoaXMuc2hhZG93PW5ldyBkaX1mdW5jdGlvbiBiZyhhLGMsZSxnLHIsdil7emIuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik9ydGhvZ3JhcGhpY0NhbWVyYSI7dGhpcy56b29tPTE7dGhpcy52aWV3PW51bGw7dGhpcy5sZWZ0PXZvaWQgMCE9PWE/YTotMTt0aGlzLnJpZ2h0PXZvaWQgMCE9PWM/YzoxO3RoaXMudG9wPXZvaWQgMCE9PWU/ZToxO3RoaXMuYm90dG9tPXZvaWQgMCE9PWc/ZzotMTt0aGlzLm5lYXI9dm9pZCAwIT09cj9yOi4xO3RoaXMuZmFyPXZvaWQgMCE9PXY/djoyRTM7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9ZnVuY3Rpb24gUmcoKXtWYy5jYWxsKHRoaXMsbmV3IGJnKC01LDUsNSwtNSwuNSw1MDApKX1mdW5jdGlvbiBTZyhhLGMpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iRGlyZWN0aW9uYWxMaWdodCI7dGhpcy5wb3NpdGlvbi5jb3B5KEEuRGVmYXVsdFVwKTt0aGlzLnVwZGF0ZU1hdHJpeCgpOwp0aGlzLnRhcmdldD1uZXcgQTt0aGlzLnNoYWRvdz1uZXcgUmd9ZnVuY3Rpb24gVGcoYSxjKXtKYi5jYWxsKHRoaXMsYSxjKTt0aGlzLnR5cGU9IkFtYmllbnRMaWdodCI7dGhpcy5jYXN0U2hhZG93PXZvaWQgMH1mdW5jdGlvbiBVZyhhLGMsZSxnKXtKYi5jYWxsKHRoaXMsYSxjKTt0aGlzLnR5cGU9IlJlY3RBcmVhTGlnaHQiO3RoaXMud2lkdGg9dm9pZCAwIT09ZT9lOjEwO3RoaXMuaGVpZ2h0PXZvaWQgMCE9PWc/ZzoxMH1mdW5jdGlvbiBWZyhhKXtEYi5jYWxsKHRoaXMsYSk7dGhpcy50ZXh0dXJlcz17fX1mdW5jdGlvbiBXZygpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSI7dGhpcy5tYXhJbnN0YW5jZWRDb3VudD12b2lkIDB9ZnVuY3Rpb24gWGcoYSxjLGUsZyl7Im51bWJlciI9PT10eXBlb2YgZSYmKGc9ZSxlPSExLGNvbnNvbGUuZXJyb3IoIlRIUkVFLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTogVGhlIGNvbnN0cnVjdG9yIG5vdyBleHBlY3RzIG5vcm1hbGl6ZWQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50LiIpKTsKUS5jYWxsKHRoaXMsYSxjLGUpO3RoaXMubWVzaFBlckF0dHJpYnV0ZT1nfHwxfWZ1bmN0aW9uIFlnKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBaZyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gZWkoYSl7InVuZGVmaW5lZCI9PT10eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAmJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4iKTsidW5kZWZpbmVkIj09PXR5cGVvZiBmZXRjaCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogZmV0Y2goKSBub3Qgc3VwcG9ydGVkLiIpO0RiLmNhbGwodGhpcyxhKTt0aGlzLm9wdGlvbnM9dm9pZCAwfWZ1bmN0aW9uIGZpKCl7dGhpcy50eXBlPSJTaGFwZVBhdGgiO3RoaXMuY29sb3I9bmV3IEk7dGhpcy5zdWJQYXRocz1bXTt0aGlzLmN1cnJlbnRQYXRoPW51bGx9ZnVuY3Rpb24gZ2koYSl7dGhpcy50eXBlPSJGb250Ijt0aGlzLmRhdGE9CmF9ZnVuY3Rpb24gdm0oYSxjLGUpe2E9QXJyYXkuZnJvbT9BcnJheS5mcm9tKGEpOlN0cmluZyhhKS5zcGxpdCgiIik7Yy89ZS5yZXNvbHV0aW9uO2Zvcih2YXIgZz0oZS5ib3VuZGluZ0JveC55TWF4LWUuYm91bmRpbmdCb3gueU1pbitlLnVuZGVybGluZVRoaWNrbmVzcykqYyxyPVtdLHY9MCx6PTAsRT0wO0U8YS5sZW5ndGg7RSsrKXt2YXIgRz1hW0VdOyJcbiI9PT1HPyh2PTAsei09Zyk6KEc9d20oRyxjLHYseixlKSx2Kz1HLm9mZnNldFgsci5wdXNoKEcucGF0aCkpfXJldHVybiByfWZ1bmN0aW9uIHdtKGEsYyxlLGcscil7dmFyIHY9ci5nbHlwaHNbYV18fHIuZ2x5cGhzWyI/Il07aWYodil7YT1uZXcgZmk7aWYodi5vKXtyPXYuX2NhY2hlZE91dGxpbmV8fCh2Ll9jYWNoZWRPdXRsaW5lPXYuby5zcGxpdCgiICIpKTtmb3IodmFyIHo9MCxFPXIubGVuZ3RoO3o8RTspc3dpdGNoKHJbeisrXSl7Y2FzZSAibSI6dmFyIEc9clt6KytdKmMrZTt2YXIgSj1yW3orK10qYytnO2EubW92ZVRvKEcsCkopO2JyZWFrO2Nhc2UgImwiOkc9clt6KytdKmMrZTtKPXJbeisrXSpjK2c7YS5saW5lVG8oRyxKKTticmVhaztjYXNlICJxIjpHPXJbeisrXSpjK2U7Sj1yW3orK10qYytnO3ZhciBQPXJbeisrXSpjK2U7dmFyIFI9clt6KytdKmMrZzthLnF1YWRyYXRpY0N1cnZlVG8oUCxSLEcsSik7YnJlYWs7Y2FzZSAiYiI6Rz1yW3orK10qYytlO0o9clt6KytdKmMrZztQPXJbeisrXSpjK2U7Uj1yW3orK10qYytnO3ZhciBTPXJbeisrXSpjK2U7dmFyIFY9clt6KytdKmMrZzthLmJlemllckN1cnZlVG8oUCxSLFMsVixHLEopfX1yZXR1cm57b2Zmc2V0WDp2LmhhKmMscGF0aDphfX1jb25zb2xlLmVycm9yKCdUSFJFRS5Gb250OiBjaGFyYWN0ZXIgIicrYSsnIiBkb2VzIG5vdCBleGlzdHMgaW4gZm9udCBmYW1pbHkgJytyLmZhbWlseU5hbWUrIi4iKX1mdW5jdGlvbiBoaShhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gJGcoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIGFoKCl7dGhpcy5jb2VmZmljaWVudHM9CltdO2Zvcih2YXIgYT0wOzk+YTthKyspdGhpcy5jb2VmZmljaWVudHMucHVzaChuZXcgayl9ZnVuY3Rpb24gSGMoYSxjKXtKYi5jYWxsKHRoaXMsdm9pZCAwLGMpO3RoaXMuc2g9dm9pZCAwIT09YT9hOm5ldyBhaH1mdW5jdGlvbiBpaShhLGMsZSl7SGMuY2FsbCh0aGlzLHZvaWQgMCxlKTthPShuZXcgSSkuc2V0KGEpO2U9KG5ldyBJKS5zZXQoYyk7Yz1uZXcgayhhLnIsYS5nLGEuYik7YT1uZXcgayhlLnIsZS5nLGUuYik7ZT1NYXRoLnNxcnQoTWF0aC5QSSk7dmFyIGc9ZSpNYXRoLnNxcnQoLjc1KTt0aGlzLnNoLmNvZWZmaWNpZW50c1swXS5jb3B5KGMpLmFkZChhKS5tdWx0aXBseVNjYWxhcihlKTt0aGlzLnNoLmNvZWZmaWNpZW50c1sxXS5jb3B5KGMpLnN1YihhKS5tdWx0aXBseVNjYWxhcihnKX1mdW5jdGlvbiBqaShhLGMpe0hjLmNhbGwodGhpcyx2b2lkIDAsYyk7YT0obmV3IEkpLnNldChhKTt0aGlzLnNoLmNvZWZmaWNpZW50c1swXS5zZXQoYS5yLGEuZyxhLmIpLm11bHRpcGx5U2NhbGFyKDIqCk1hdGguc3FydChNYXRoLlBJKSl9ZnVuY3Rpb24gUWooKXt0aGlzLnR5cGU9IlN0ZXJlb0NhbWVyYSI7dGhpcy5hc3BlY3Q9MTt0aGlzLmV5ZVNlcD0uMDY0O3RoaXMuY2FtZXJhTD1uZXcgdmI7dGhpcy5jYW1lcmFMLmxheWVycy5lbmFibGUoMSk7dGhpcy5jYW1lcmFMLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jYW1lcmFSPW5ldyB2Yjt0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSgyKTt0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLl9jYWNoZT17Zm9jdXM6bnVsbCxmb3Y6bnVsbCxhc3BlY3Q6bnVsbCxuZWFyOm51bGwsZmFyOm51bGwsem9vbTpudWxsLGV5ZVNlcDpudWxsfX1mdW5jdGlvbiBraShhKXt0aGlzLmF1dG9TdGFydD12b2lkIDAhPT1hP2E6ITA7dGhpcy5lbGFwc2VkVGltZT10aGlzLm9sZFRpbWU9dGhpcy5zdGFydFRpbWU9MDt0aGlzLnJ1bm5pbmc9ITF9ZnVuY3Rpb24gbGkoKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJBdWRpb0xpc3RlbmVyIjsKdGhpcy5jb250ZXh0PW1pLmdldENvbnRleHQoKTt0aGlzLmdhaW49dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTt0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO3RoaXMuZmlsdGVyPW51bGw7dGhpcy50aW1lRGVsdGE9MDt0aGlzLl9jbG9jaz1uZXcga2l9ZnVuY3Rpb24gV2UoYSl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQXVkaW8iO3RoaXMubGlzdGVuZXI9YTt0aGlzLmNvbnRleHQ9YS5jb250ZXh0O3RoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO3RoaXMuZ2Fpbi5jb25uZWN0KGEuZ2V0SW5wdXQoKSk7dGhpcy5hdXRvcGxheT0hMTt0aGlzLmJ1ZmZlcj1udWxsO3RoaXMuZGV0dW5lPTA7dGhpcy5sb29wPSExO3RoaXMub2Zmc2V0PXRoaXMuc3RhcnRUaW1lPTA7dGhpcy5kdXJhdGlvbj12b2lkIDA7dGhpcy5wbGF5YmFja1JhdGU9MTt0aGlzLmlzUGxheWluZz0hMTt0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMDt0aGlzLnNvdXJjZVR5cGU9CiJlbXB0eSI7dGhpcy5maWx0ZXJzPVtdfWZ1bmN0aW9uIG5pKGEpe1dlLmNhbGwodGhpcyxhKTt0aGlzLnBhbm5lcj10aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCk7dGhpcy5wYW5uZXIucGFubmluZ01vZGVsPSJIUlRGIjt0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbil9ZnVuY3Rpb24gb2koYSxjKXt0aGlzLmFuYWx5c2VyPWEuY29udGV4dC5jcmVhdGVBbmFseXNlcigpO3RoaXMuYW5hbHlzZXIuZmZ0U2l6ZT12b2lkIDAhPT1jP2M6MjA0ODt0aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkodGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCk7YS5nZXRPdXRwdXQoKS5jb25uZWN0KHRoaXMuYW5hbHlzZXIpfWZ1bmN0aW9uIHBpKGEsYyxlKXt0aGlzLmJpbmRpbmc9YTt0aGlzLnZhbHVlU2l6ZT1lO2E9RmxvYXQ2NEFycmF5O3N3aXRjaChjKXtjYXNlICJxdWF0ZXJuaW9uIjpjPXRoaXMuX3NsZXJwO2JyZWFrO2Nhc2UgInN0cmluZyI6Y2FzZSAiYm9vbCI6YT1BcnJheTtjPQp0aGlzLl9zZWxlY3Q7YnJlYWs7ZGVmYXVsdDpjPXRoaXMuX2xlcnB9dGhpcy5idWZmZXI9bmV3IGEoNCplKTt0aGlzLl9taXhCdWZmZXJSZWdpb249Yzt0aGlzLnJlZmVyZW5jZUNvdW50PXRoaXMudXNlQ291bnQ9dGhpcy5jdW11bGF0aXZlV2VpZ2h0PTB9ZnVuY3Rpb24gUmooYSxjLGUpe2U9ZXx8JGIucGFyc2VUcmFja05hbWUoYyk7dGhpcy5fdGFyZ2V0R3JvdXA9YTt0aGlzLl9iaW5kaW5ncz1hLnN1YnNjcmliZV8oYyxlKX1mdW5jdGlvbiAkYihhLGMsZSl7dGhpcy5wYXRoPWM7dGhpcy5wYXJzZWRQYXRoPWV8fCRiLnBhcnNlVHJhY2tOYW1lKGMpO3RoaXMubm9kZT0kYi5maW5kTm9kZShhLHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSl8fGE7dGhpcy5yb290Tm9kZT1hfWZ1bmN0aW9uIFNqKCl7dGhpcy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpO3RoaXMuX29iamVjdHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5DYWNoZWRPYmplY3RzXz0wO3ZhciBhPQp7fTt0aGlzLl9pbmRpY2VzQnlVVUlEPWE7Zm9yKHZhciBjPTAsZT1hcmd1bWVudHMubGVuZ3RoO2MhPT1lOysrYylhW2FyZ3VtZW50c1tjXS51dWlkXT1jO3RoaXMuX3BhdGhzPVtdO3RoaXMuX3BhcnNlZFBhdGhzPVtdO3RoaXMuX2JpbmRpbmdzPVtdO3RoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aD17fTt2YXIgZz10aGlzO3RoaXMuc3RhdHM9e29iamVjdHM6e2dldCB0b3RhbCgpe3JldHVybiBnLl9vYmplY3RzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHRoaXMudG90YWwtZy5uQ2FjaGVkT2JqZWN0c199fSxnZXQgYmluZGluZ3NQZXJPYmplY3QoKXtyZXR1cm4gZy5fYmluZGluZ3MubGVuZ3RofX19ZnVuY3Rpb24gVGooYSxjLGUpe3RoaXMuX21peGVyPWE7dGhpcy5fY2xpcD1jO3RoaXMuX2xvY2FsUm9vdD1lfHxudWxsO2E9Yy50cmFja3M7Yz1hLmxlbmd0aDtlPUFycmF5KGMpO2Zvcih2YXIgZz17ZW5kaW5nU3RhcnQ6MjQwMCxlbmRpbmdFbmQ6MjQwMH0scj0wO3IhPT0KYzsrK3Ipe3ZhciB2PWFbcl0uY3JlYXRlSW50ZXJwb2xhbnQobnVsbCk7ZVtyXT12O3Yuc2V0dGluZ3M9Z310aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzPWc7dGhpcy5faW50ZXJwb2xhbnRzPWU7dGhpcy5fcHJvcGVydHlCaW5kaW5ncz1BcnJheShjKTt0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD10aGlzLl9ieUNsaXBDYWNoZUluZGV4PXRoaXMuX2NhY2hlSW5kZXg9bnVsbDt0aGlzLmxvb3A9MjIwMTt0aGlzLl9sb29wQ291bnQ9LTE7dGhpcy5fc3RhcnRUaW1lPW51bGw7dGhpcy50aW1lPTA7dGhpcy5fZWZmZWN0aXZlV2VpZ2h0PXRoaXMud2VpZ2h0PXRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnRpbWVTY2FsZT0xO3RoaXMucmVwZXRpdGlvbnM9SW5maW5pdHk7dGhpcy5wYXVzZWQ9ITE7dGhpcy5lbmFibGVkPSEwO3RoaXMuY2xhbXBXaGVuRmluaXNoZWQ9ITE7dGhpcy56ZXJvU2xvcGVBdEVuZD10aGlzLnplcm9TbG9wZUF0U3RhcnQ9CiEwfWZ1bmN0aW9uIHFpKGEpe3RoaXMuX3Jvb3Q9YTt0aGlzLl9pbml0TWVtb3J5TWFuYWdlcigpO3RoaXMudGltZT10aGlzLl9hY2N1SW5kZXg9MDt0aGlzLnRpbWVTY2FsZT0xfWZ1bmN0aW9uIGJoKGEsYyl7InN0cmluZyI9PT10eXBlb2YgYSYmKGNvbnNvbGUud2FybigiVEhSRUUuVW5pZm9ybTogVHlwZSBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKSxhPWMpO3RoaXMudmFsdWU9YX1mdW5jdGlvbiByaShhLGMsZSl7UWQuY2FsbCh0aGlzLGEsYyk7dGhpcy5tZXNoUGVyQXR0cmlidXRlPWV8fDF9ZnVuY3Rpb24gVWooYSxjLGUsZyl7dGhpcy5yYXk9bmV3IEQoYSxjKTt0aGlzLm5lYXI9ZXx8MDt0aGlzLmZhcj1nfHxJbmZpbml0eTt0aGlzLmNhbWVyYT1udWxsO3RoaXMucGFyYW1zPXtNZXNoOnt9LExpbmU6e30sTE9EOnt9LFBvaW50czp7dGhyZXNob2xkOjF9LFNwcml0ZTp7fX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcy5wYXJhbXMse1BvaW50Q2xvdWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5Y2FzdGVyOiBwYXJhbXMuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIHBhcmFtcy5Qb2ludHMuIik7CnJldHVybiB0aGlzLlBvaW50c319fSl9ZnVuY3Rpb24gVmooYSxjKXtyZXR1cm4gYS5kaXN0YW5jZS1jLmRpc3RhbmNlfWZ1bmN0aW9uIHNpKGEsYyxlLGcpe2lmKCExIT09YS52aXNpYmxlJiYoYS5yYXljYXN0KGMsZSksITA9PT1nKSl7YT1hLmNoaWxkcmVuO2c9MDtmb3IodmFyIHI9YS5sZW5ndGg7ZzxyO2crKylzaShhW2ddLGMsZSwhMCl9fWZ1bmN0aW9uIFdqKGEsYyxlKXt0aGlzLnJhZGl1cz12b2lkIDAhPT1hP2E6MTt0aGlzLnBoaT12b2lkIDAhPT1jP2M6MDt0aGlzLnRoZXRhPXZvaWQgMCE9PWU/ZTowO3JldHVybiB0aGlzfWZ1bmN0aW9uIFhqKGEsYyxlKXt0aGlzLnJhZGl1cz12b2lkIDAhPT1hP2E6MTt0aGlzLnRoZXRhPXZvaWQgMCE9PWM/YzowO3RoaXMueT12b2lkIDAhPT1lP2U6MDtyZXR1cm4gdGhpc31mdW5jdGlvbiB0aShhLGMpe3RoaXMubWluPXZvaWQgMCE9PWE/YTpuZXcgZihJbmZpbml0eSxJbmZpbml0eSk7dGhpcy5tYXg9dm9pZCAwIT09Yz9jOm5ldyBmKC1JbmZpbml0eSwKLUluZmluaXR5KX1mdW5jdGlvbiB1aShhLGMpe3RoaXMuc3RhcnQ9dm9pZCAwIT09YT9hOm5ldyBrO3RoaXMuZW5kPXZvaWQgMCE9PWM/YzpuZXcga31mdW5jdGlvbiBjZyhhKXtBLmNhbGwodGhpcyk7dGhpcy5tYXRlcmlhbD1hO3RoaXMucmVuZGVyPWZ1bmN0aW9uKCl7fX1mdW5jdGlvbiBkZyhhLGMsZSxnKXt0aGlzLm9iamVjdD1hO3RoaXMuc2l6ZT12b2lkIDAhPT1jP2M6MTthPXZvaWQgMCE9PWU/ZToxNjcxMTY4MDtnPXZvaWQgMCE9PWc/ZzoxO2M9MDsoZT10aGlzLm9iamVjdC5nZW9tZXRyeSkmJmUuaXNHZW9tZXRyeT9jPTMqZS5mYWNlcy5sZW5ndGg6ZSYmZS5pc0J1ZmZlckdlb21ldHJ5JiYoYz1lLmF0dHJpYnV0ZXMubm9ybWFsLmNvdW50KTtlPW5ldyB2YTtjPW5ldyBjYSg2KmMsMyk7ZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixjKTtJYi5jYWxsKHRoaXMsZSxuZXcgRmIoe2NvbG9yOmEsbGluZXdpZHRoOmd9KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9CmZ1bmN0aW9uIFhlKGEsYyl7QS5jYWxsKHRoaXMpO3RoaXMubGlnaHQ9YTt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jb2xvcj1jO2E9bmV3IHZhO2M9WzAsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLC0xLDAsMSwwLDAsMCwwLDEsMSwwLDAsMCwwLC0xLDFdO2Zvcih2YXIgZT0wLGc9MTszMj5lO2UrKyxnKyspe3ZhciByPWUvMzIqTWF0aC5QSSoyLHY9Zy8zMipNYXRoLlBJKjI7Yy5wdXNoKE1hdGguY29zKHIpLE1hdGguc2luKHIpLDEsTWF0aC5jb3ModiksTWF0aC5zaW4odiksMSl9YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoYywzKSk7Yz1uZXcgRmIoe2ZvZzohMX0pO3RoaXMuY29uZT1uZXcgSWIoYSxjKTt0aGlzLmFkZCh0aGlzLmNvbmUpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gWWooYSl7dmFyIGM9W107YSYmYS5pc0JvbmUmJmMucHVzaChhKTsKZm9yKHZhciBlPTA7ZTxhLmNoaWxkcmVuLmxlbmd0aDtlKyspYy5wdXNoLmFwcGx5KGMsWWooYS5jaGlsZHJlbltlXSkpO3JldHVybiBjfWZ1bmN0aW9uIFllKGEpe2Zvcih2YXIgYz1ZaihhKSxlPW5ldyB2YSxnPVtdLHI9W10sdj1uZXcgSSgwLDAsMSksej1uZXcgSSgwLDEsMCksRT0wO0U8Yy5sZW5ndGg7RSsrKXt2YXIgRz1jW0VdO0cucGFyZW50JiZHLnBhcmVudC5pc0JvbmUmJihnLnB1c2goMCwwLDApLGcucHVzaCgwLDAsMCksci5wdXNoKHYucix2Lmcsdi5iKSxyLnB1c2goei5yLHouZyx6LmIpKX1lLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShnLDMpKTtlLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBjYShyLDMpKTtnPW5ldyBGYih7dmVydGV4Q29sb3JzOjIsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsdHJhbnNwYXJlbnQ6ITB9KTtJYi5jYWxsKHRoaXMsZSxnKTt0aGlzLnJvb3Q9YTt0aGlzLmJvbmVzPWM7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9CiExfWZ1bmN0aW9uIFplKGEsYyxlKXt0aGlzLmxpZ2h0PWE7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMuY29sb3I9ZTthPW5ldyBCZChjLDQsMik7Yz1uZXcgTCh7d2lyZWZyYW1lOiEwLGZvZzohMX0pO3hhLmNhbGwodGhpcyxhLGMpO3RoaXMubWF0cml4PXRoaXMubGlnaHQubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gJGUoYSxjKXt0aGlzLnR5cGU9IlJlY3RBcmVhTGlnaHRIZWxwZXIiO3RoaXMubGlnaHQ9YTt0aGlzLmNvbG9yPWM7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzEsMSwwLC0xLDEsMCwtMSwtMSwwLDEsLTEsMCwxLDEsMF0sMykpO2EuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7Yz1uZXcgRmIoe2ZvZzohMX0pO1ZiLmNhbGwodGhpcyxhLGMpO2E9bmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKFsxLDEsMCwtMSwxLDAsLTEsLTEsMCwKMSwxLDAsLTEsLTEsMCwxLC0xLDBdLDMpKTthLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3RoaXMuYWRkKG5ldyB4YShhLG5ldyBMKHtzaWRlOjEsZm9nOiExfSkpKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGFmKGEsYyxlKXtBLmNhbGwodGhpcyk7dGhpcy5saWdodD1hO3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNvbG9yPWU7YT1uZXcgUmQoYyk7YS5yb3RhdGVZKC41Kk1hdGguUEkpO3RoaXMubWF0ZXJpYWw9bmV3IEwoe3dpcmVmcmFtZTohMCxmb2c6ITF9KTt2b2lkIDA9PT10aGlzLmNvbG9yJiYodGhpcy5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9Mik7Yz1hLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTthLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBRKG5ldyBGbG9hdDMyQXJyYXkoMypjLmNvdW50KSwzKSk7dGhpcy5hZGQobmV3IHhhKGEsdGhpcy5tYXRlcmlhbCkpOwp0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGJmKGEsYyl7dGhpcy5saWdodFByb2JlPWE7dGhpcy5zaXplPWM7YT1uZXcgcWIoe2RlZmluZXM6e0dBTU1BX09VVFBVVDoiIn0sdW5pZm9ybXM6e3NoOnt2YWx1ZTp0aGlzLmxpZ2h0UHJvYmUuc2guY29lZmZpY2llbnRzfSxpbnRlbnNpdHk6e3ZhbHVlOnRoaXMubGlnaHRQcm9iZS5pbnRlbnNpdHl9fSx2ZXJ0ZXhTaGFkZXI6InZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xudm9pZCBtYWluKCkge1xuXHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCBub3JtYWxNYXRyaXggKiBub3JtYWwgKTtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsZnJhZ21lbnRTaGFkZXI6IiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NlxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIG5vcm1hbCwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdC8vIG1hdHJpeCBpcyBhc3N1bWVkIHRvIGJlIG9ydGhvZ29uYWxcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBub3JtYWwsIDAuMCApICogbWF0cml4ICkueHl6ICk7XG59XG52ZWMzIGxpbmVhclRvT3V0cHV0KCBpbiB2ZWMzIGEgKSB7XG5cdCNpZmRlZiBHQU1NQV9PVVRQVVRcblx0XHRyZXR1cm4gcG93KCBhLCB2ZWMzKCAxLjAgLyBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSApO1xuXHQjZWxzZVxuXHRcdHJldHVybiBhO1xuXHQjZW5kaWZcbn1cbi8vIHNvdXJjZTogaHR0cHM6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvcGFwZXJzL2Vudm1hcC9lbnZtYXAucGRmXG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xuXHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cdGZsb2F0IHggXHgzZCBub3JtYWwueCwgeSBceDNkIG5vcm1hbC55LCB6IFx4M2Qgbm9ybWFsLno7XG5cdC8vIGJhbmQgMFxuXHR2ZWMzIHJlc3VsdCBceDNkIHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcblx0Ly8gYmFuZCAxXG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7XG5cdC8vIGJhbmQgMlxuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNSBdICogMi4wICogMC40MjkwNDMgKiB5ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA2IF0gKiAoIDAuNzQzMTI1ICogeiAqIHogLSAwLjI0NzcwOCApO1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgOCBdICogMC40MjkwNDMgKiAoIHggKiB4IC0geSAqIHkgKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbnVuaWZvcm0gdmVjMyBzaFsgOSBdOyAvLyBzaCBjb2VmZmljaWVudHNcbnVuaWZvcm0gZmxvYXQgaW50ZW5zaXR5OyAvLyBsaWdodCBwcm9iZSBpbnRlbnNpdHlcbnZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xudm9pZCBtYWluKCkge1xuXHR2ZWMzIG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdk5vcm1hbCApO1xuXHR2ZWMzIHdvcmxkTm9ybWFsIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgc2ggKTtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgUkVDSVBST0NBTF9QSSAqIGlycmFkaWFuY2UgKiBpbnRlbnNpdHk7XG5cdG91dGdvaW5nTGlnaHQgXHgzZCBsaW5lYXJUb091dHB1dCggb3V0Z29pbmdMaWdodCApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCAxLjAgKTtcbn0ifSk7CmM9bmV3IEJkKDEsMzIsMTYpO3hhLmNhbGwodGhpcyxjLGEpO3RoaXMub25CZWZvcmVSZW5kZXIoKX1mdW5jdGlvbiBjaChhLGMsZSxnKXthPWF8fDEwO2M9Y3x8MTA7ZT1uZXcgSSh2b2lkIDAhPT1lP2U6NDQ3MzkyNCk7Zz1uZXcgSSh2b2lkIDAhPT1nP2c6ODk0Nzg0OCk7dmFyIHI9Yy8yLHY9YS9jLHo9YS8yO2E9W107Zm9yKHZhciBFPVtdLEc9MCxKPTAsUD0tejtHPD1jO0crKyxQKz12KXthLnB1c2goLXosMCxQLHosMCxQKTthLnB1c2goUCwwLC16LFAsMCx6KTt2YXIgUj1HPT09cj9lOmc7Ui50b0FycmF5KEUsSik7Sis9MztSLnRvQXJyYXkoRSxKKTtKKz0zO1IudG9BcnJheShFLEopO0orPTM7Ui50b0FycmF5KEUsSik7Sis9M31jPW5ldyB2YTtjLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShhLDMpKTtjLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBjYShFLDMpKTtlPW5ldyBGYih7dmVydGV4Q29sb3JzOjJ9KTtJYi5jYWxsKHRoaXMsYyxlKX1mdW5jdGlvbiBkaChhLApjLGUsZyxyLHYpe2E9YXx8MTA7Yz1jfHwxNjtlPWV8fDg7Zz1nfHw2NDtyPW5ldyBJKHZvaWQgMCE9PXI/cjo0NDczOTI0KTt2PW5ldyBJKHZvaWQgMCE9PXY/djo4OTQ3ODQ4KTt2YXIgej1bXSxFPVtdLEc7Zm9yKEc9MDtHPD1jO0crKyl7dmFyIEo9Ry9jKjIqTWF0aC5QSTt2YXIgUD1NYXRoLnNpbihKKSphO0o9TWF0aC5jb3MoSikqYTt6LnB1c2goMCwwLDApO3oucHVzaChQLDAsSik7dmFyIFI9RyYxP3I6djtFLnB1c2goUi5yLFIuZyxSLmIpO0UucHVzaChSLnIsUi5nLFIuYil9Zm9yKEc9MDtHPD1lO0crKyl7Uj1HJjE/cjp2O3ZhciBTPWEtYS9lKkc7Zm9yKGM9MDtjPGc7YysrKUo9Yy9nKjIqTWF0aC5QSSxQPU1hdGguc2luKEopKlMsSj1NYXRoLmNvcyhKKSpTLHoucHVzaChQLDAsSiksRS5wdXNoKFIucixSLmcsUi5iKSxKPShjKzEpL2cqMipNYXRoLlBJLFA9TWF0aC5zaW4oSikqUyxKPU1hdGguY29zKEopKlMsei5wdXNoKFAsMCxKKSxFLnB1c2goUi5yLFIuZyxSLmIpfWE9Cm5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYSh6LDMpKTthLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBjYShFLDMpKTt6PW5ldyBGYih7dmVydGV4Q29sb3JzOjJ9KTtJYi5jYWxsKHRoaXMsYSx6KX1mdW5jdGlvbiBjZihhLGMsZSxnKXt0aGlzLmF1ZGlvPWE7dGhpcy5yYW5nZT1jfHwxO3RoaXMuZGl2aXNpb25zSW5uZXJBbmdsZT1lfHwxNjt0aGlzLmRpdmlzaW9uc091dGVyQW5nbGU9Z3x8MjthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBRKG5ldyBGbG9hdDMyQXJyYXkoMyooMyoodGhpcy5kaXZpc2lvbnNJbm5lckFuZ2xlKzIqdGhpcy5kaXZpc2lvbnNPdXRlckFuZ2xlKSszKSksMykpO2M9bmV3IEZiKHtjb2xvcjo2NTI4MH0pO2U9bmV3IEZiKHtjb2xvcjoxNjc3Njk2MH0pO1ZiLmNhbGwodGhpcyxhLFtlLGNdKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGVnKGEsYyxlLGcpe3RoaXMub2JqZWN0PWE7dGhpcy5zaXplPXZvaWQgMCE9PQpjP2M6MTthPXZvaWQgMCE9PWU/ZToxNjc3Njk2MDtnPXZvaWQgMCE9PWc/ZzoxO2M9MDsoZT10aGlzLm9iamVjdC5nZW9tZXRyeSkmJmUuaXNHZW9tZXRyeT9jPWUuZmFjZXMubGVuZ3RoOmNvbnNvbGUud2FybigiVEhSRUUuRmFjZU5vcm1hbHNIZWxwZXI6IG9ubHkgVEhSRUUuR2VvbWV0cnkgaXMgc3VwcG9ydGVkLiBVc2UgVEhSRUUuVmVydGV4Tm9ybWFsc0hlbHBlciwgaW5zdGVhZC4iKTtlPW5ldyB2YTtjPW5ldyBjYSg2KmMsMyk7ZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixjKTtJYi5jYWxsKHRoaXMsZSxuZXcgRmIoe2NvbG9yOmEsbGluZXdpZHRoOmd9KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZGYoYSxjLGUpe0EuY2FsbCh0aGlzKTt0aGlzLmxpZ2h0PWE7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMubWF0cml4PWEubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuY29sb3I9ZTsKdm9pZCAwPT09YyYmKGM9MSk7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWy1jLGMsMCxjLGMsMCxjLC1jLDAsLWMsLWMsMCwtYyxjLDBdLDMpKTtjPW5ldyBGYih7Zm9nOiExfSk7dGhpcy5saWdodFBsYW5lPW5ldyBWYihhLGMpO3RoaXMuYWRkKHRoaXMubGlnaHRQbGFuZSk7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzAsMCwwLDAsMCwxXSwzKSk7dGhpcy50YXJnZXRMaW5lPW5ldyBWYihhLGMpO3RoaXMuYWRkKHRoaXMudGFyZ2V0TGluZSk7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBmZyhhKXtmdW5jdGlvbiBjKFYsVyxoYSl7ZShWLGhhKTtlKFcsaGEpfWZ1bmN0aW9uIGUoVixXKXt2LnB1c2goMCwwLDApO3oucHVzaChXLnIsVy5nLFcuYik7dm9pZCAwPT09RVtWXSYmKEVbVl09W10pO0VbVl0ucHVzaCh2Lmxlbmd0aC8zLTEpfXZhciBnPW5ldyB2YSxyPW5ldyBGYih7Y29sb3I6MTY3NzcyMTUsdmVydGV4Q29sb3JzOjF9KSwKdj1bXSx6PVtdLEU9e30sRz1uZXcgSSgxNjc1NTIwMCksSj1uZXcgSSgxNjcxMTY4MCksUD1uZXcgSSg0Mzc3NSksUj1uZXcgSSgxNjc3NzIxNSksUz1uZXcgSSgzMzU1NDQzKTtjKCJuMSIsIm4yIixHKTtjKCJuMiIsIm40IixHKTtjKCJuNCIsIm4zIixHKTtjKCJuMyIsIm4xIixHKTtjKCJmMSIsImYyIixHKTtjKCJmMiIsImY0IixHKTtjKCJmNCIsImYzIixHKTtjKCJmMyIsImYxIixHKTtjKCJuMSIsImYxIixHKTtjKCJuMiIsImYyIixHKTtjKCJuMyIsImYzIixHKTtjKCJuNCIsImY0IixHKTtjKCJwIiwibjEiLEopO2MoInAiLCJuMiIsSik7YygicCIsIm4zIixKKTtjKCJwIiwibjQiLEopO2MoInUxIiwidTIiLFApO2MoInUyIiwidTMiLFApO2MoInUzIiwidTEiLFApO2MoImMiLCJ0IixSKTtjKCJwIiwiYyIsUyk7YygiY24xIiwiY24yIixTKTtjKCJjbjMiLCJjbjQiLFMpO2MoImNmMSIsImNmMiIsUyk7YygiY2YzIiwiY2Y0IixTKTtnLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLApuZXcgY2EodiwzKSk7Zy5hZGRBdHRyaWJ1dGUoImNvbG9yIixuZXcgY2EoeiwzKSk7SWIuY2FsbCh0aGlzLGcscik7dGhpcy5jYW1lcmE9YTt0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4JiZ0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5wb2ludE1hcD1FO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gUGIoYSxjLGUsZyxyLHYseil7ZWguc2V0KHIsdix6KS51bnByb2plY3QoZyk7YT1jW2FdO2lmKHZvaWQgMCE9PWEpZm9yKGU9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksYz0wLGc9YS5sZW5ndGg7YzxnO2MrKyllLnNldFhZWihhW2NdLGVoLngsZWgueSxlaC56KX1mdW5jdGlvbiBoZChhLGMpe3RoaXMub2JqZWN0PWE7dm9pZCAwPT09YyYmKGM9MTY3NzY5NjApO2E9bmV3IFVpbnQxNkFycmF5KFswLDEsMSwyLDIsMywzLDAsNCw1LDUsNiw2LDcsNywKNCwwLDQsMSw1LDIsNiwzLDddKTt2YXIgZT1uZXcgRmxvYXQzMkFycmF5KDI0KSxnPW5ldyB2YTtnLnNldEluZGV4KG5ldyBRKGEsMSkpO2cuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFEoZSwzKSk7SWIuY2FsbCh0aGlzLGcsbmV3IEZiKHtjb2xvcjpjfSkpO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGdnKGEsYyl7dGhpcy50eXBlPSJCb3gzSGVscGVyIjt0aGlzLmJveD1hO2M9Y3x8MTY3NzY5NjA7YT1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LDQsMCw0LDEsNSwyLDYsMyw3XSk7dmFyIGU9bmV3IHZhO2Uuc2V0SW5kZXgobmV3IFEoYSwxKSk7ZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzEsMSwxLC0xLDEsMSwtMSwtMSwxLDEsLTEsMSwxLDEsLTEsLTEsMSwtMSwtMSwtMSwtMSwxLC0xLC0xXSwzKSk7SWIuY2FsbCh0aGlzLGUsbmV3IEZiKHtjb2xvcjpjfSkpO3RoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl9CmZ1bmN0aW9uIGhnKGEsYyxlKXt0aGlzLnR5cGU9IlBsYW5lSGVscGVyIjt0aGlzLnBsYW5lPWE7dGhpcy5zaXplPXZvaWQgMD09PWM/MTpjO2E9dm9pZCAwIT09ZT9lOjE2Nzc2OTYwO2M9bmV3IHZhO2MuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKFsxLC0xLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwxLDAsMCwxLDAsMCwwXSwzKSk7Yy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtWYi5jYWxsKHRoaXMsYyxuZXcgRmIoe2NvbG9yOmF9KSk7Yz1uZXcgdmE7Yy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzEsMSwxLC0xLDEsMSwtMSwtMSwxLDEsMSwxLC0xLC0xLDEsMSwtMSwxXSwzKSk7Yy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt0aGlzLmFkZChuZXcgeGEoYyxuZXcgTCh7Y29sb3I6YSxvcGFjaXR5Oi4yLHRyYW5zcGFyZW50OiEwLGRlcHRoV3JpdGU6ITF9KSkpfWZ1bmN0aW9uIGlkKGEsYyxlLGcscix2KXtBLmNhbGwodGhpcyk7CnZvaWQgMD09PWEmJihhPW5ldyBrKDAsMCwxKSk7dm9pZCAwPT09YyYmKGM9bmV3IGsoMCwwLDApKTt2b2lkIDA9PT1lJiYoZT0xKTt2b2lkIDA9PT1nJiYoZz0xNjc3Njk2MCk7dm9pZCAwPT09ciYmKHI9LjIqZSk7dm9pZCAwPT09diYmKHY9LjIqcik7dm9pZCAwPT09ZmgmJihmaD1uZXcgdmEsZmguYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKFswLDAsMCwwLDEsMF0sMykpLHZpPW5ldyBmZCgwLC41LDEsNSwxKSx2aS50cmFuc2xhdGUoMCwtLjUsMCkpO3RoaXMucG9zaXRpb24uY29weShjKTt0aGlzLmxpbmU9bmV3IFZiKGZoLG5ldyBGYih7Y29sb3I6Z30pKTt0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmFkZCh0aGlzLmxpbmUpO3RoaXMuY29uZT1uZXcgeGEodmksbmV3IEwoe2NvbG9yOmd9KSk7dGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5hZGQodGhpcy5jb25lKTt0aGlzLnNldERpcmVjdGlvbihhKTt0aGlzLnNldExlbmd0aChlLApyLHYpfWZ1bmN0aW9uIGlnKGEpe2E9YXx8MTt2YXIgYz1bMCwwLDAsYSwwLDAsMCwwLDAsMCxhLDAsMCwwLDAsMCwwLGFdO2E9bmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGMsMykpO2EuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKFsxLDAsMCwxLC42LDAsMCwxLDAsLjYsMSwwLDAsMCwxLDAsLjYsMV0sMykpO2M9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6Mn0pO0liLmNhbGwodGhpcyxhLGMpfWZ1bmN0aW9uIFpqKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQ2xvc2VkU3BsaW5lQ3VydmUzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuIik7WmIuY2FsbCh0aGlzLGEpO3RoaXMudHlwZT0iY2F0bXVsbHJvbSI7dGhpcy5jbG9zZWQ9ITB9ZnVuY3Rpb24gYWsoYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTsKWmIuY2FsbCh0aGlzLGEpO3RoaXMudHlwZT0iY2F0bXVsbHJvbSJ9ZnVuY3Rpb24gd2koYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TcGxpbmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTtaYi5jYWxsKHRoaXMsYSk7dGhpcy50eXBlPSJjYXRtdWxscm9tIn12b2lkIDA9PT1OdW1iZXIuRVBTSUxPTiYmKE51bWJlci5FUFNJTE9OPU1hdGgucG93KDIsLTUyKSk7dm9pZCAwPT09TnVtYmVyLmlzSW50ZWdlciYmKE51bWJlci5pc0ludGVnZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmaXNGaW5pdGUoYSkmJk1hdGguZmxvb3IoYSk9PT1hfSk7dm9pZCAwPT09TWF0aC5zaWduJiYoTWF0aC5zaWduPWZ1bmN0aW9uKGEpe3JldHVybiAwPmE/LTE6MDxhPzE6K2F9KTshMT09PSJuYW1lImluIEZ1bmN0aW9uLnByb3RvdHlwZSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwibmFtZSIsCntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb25ccyooW15cKFxzXSopLylbMV19fSk7dm9pZCAwPT09T2JqZWN0LmFzc2lnbiYmKE9iamVjdC5hc3NpZ249ZnVuY3Rpb24oYSl7aWYodm9pZCAwPT09YXx8bnVsbD09PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7Zm9yKHZhciBjPU9iamVjdChhKSxlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIGc9YXJndW1lbnRzW2VdO2lmKHZvaWQgMCE9PWcmJm51bGwhPT1nKWZvcih2YXIgciBpbiBnKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChnLHIpJiYoY1tyXT1nW3JdKX1yZXR1cm4gY30pO09iamVjdC5hc3NpZ24oZC5wcm90b3R5cGUse2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMmJih0aGlzLl9saXN0ZW5lcnM9e30pO3ZhciBlPQp0aGlzLl9saXN0ZW5lcnM7dm9pZCAwPT09ZVthXSYmKGVbYV09W10pOy0xPT09ZVthXS5pbmRleE9mKGMpJiZlW2FdLnB1c2goYyl9LGhhc0V2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuITE7dmFyIGU9dGhpcy5fbGlzdGVuZXJzO3JldHVybiB2b2lkIDAhPT1lW2FdJiYtMSE9PWVbYV0uaW5kZXhPZihjKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PXRoaXMuX2xpc3RlbmVycyYmKGE9dGhpcy5fbGlzdGVuZXJzW2FdLHZvaWQgMCE9PWEmJihjPWEuaW5kZXhPZihjKSwtMSE9PWMmJmEuc3BsaWNlKGMsMSkpKX0sZGlzcGF0Y2hFdmVudDpmdW5jdGlvbihhKXtpZih2b2lkIDAhPT10aGlzLl9saXN0ZW5lcnMpe3ZhciBjPXRoaXMuX2xpc3RlbmVyc1thLnR5cGVdO2lmKHZvaWQgMCE9PWMpe2EudGFyZ2V0PXRoaXM7Yz1jLnNsaWNlKDApO2Zvcih2YXIgZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyljW2VdLmNhbGwodGhpcywKYSl9fX19KTtmb3IodmFyIFliPVtdLGpnPTA7MjU2PmpnO2pnKyspWWJbamddPSgxNj5qZz8iMCI6IiIpK2pnLnRvU3RyaW5nKDE2KTt2YXIgaGI9e0RFRzJSQUQ6TWF0aC5QSS8xODAsUkFEMkRFRzoxODAvTWF0aC5QSSxnZW5lcmF0ZVVVSUQ6ZnVuY3Rpb24oKXt2YXIgYT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxjPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGU9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZz00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MDtyZXR1cm4oWWJbYSYyNTVdK1liW2E+PjgmMjU1XStZYlthPj4xNiYyNTVdK1liW2E+PjI0JjI1NV0rIi0iK1liW2MmMjU1XStZYltjPj44JjI1NV0rIi0iK1liW2M+PjE2JjE1fDY0XStZYltjPj4yNCYyNTVdKyItIitZYltlJjYzfDEyOF0rWWJbZT4+OCYyNTVdKyItIitZYltlPj4xNiYyNTVdK1liW2U+PjI0JjI1NV0rWWJbZyYyNTVdK1liW2c+PjgmMjU1XStZYltnPj4xNiYyNTVdK1liW2c+PjI0JjI1NV0pLnRvVXBwZXJDYXNlKCl9LApjbGFtcDpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIE1hdGgubWF4KGMsTWF0aC5taW4oZSxhKSl9LGV1Y2xpZGVhbk1vZHVsbzpmdW5jdGlvbihhLGMpe3JldHVybihhJWMrYyklY30sbWFwTGluZWFyOmZ1bmN0aW9uKGEsYyxlLGcscil7cmV0dXJuIGcrKGEtYykqKHItZykvKGUtYyl9LGxlcnA6ZnVuY3Rpb24oYSxjLGUpe3JldHVybigxLWUpKmErZSpjfSxzbW9vdGhzdGVwOmZ1bmN0aW9uKGEsYyxlKXtpZihhPD1jKXJldHVybiAwO2lmKGE+PWUpcmV0dXJuIDE7YT0oYS1jKS8oZS1jKTtyZXR1cm4gYSphKigzLTIqYSl9LHNtb290aGVyc3RlcDpmdW5jdGlvbihhLGMsZSl7aWYoYTw9YylyZXR1cm4gMDtpZihhPj1lKXJldHVybiAxO2E9KGEtYykvKGUtYyk7cmV0dXJuIGEqYSphKihhKig2KmEtMTUpKzEwKX0scmFuZEludDpmdW5jdGlvbihhLGMpe3JldHVybiBhK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSooYy1hKzEpKX0scmFuZEZsb2F0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGErCk1hdGgucmFuZG9tKCkqKGMtYSl9LHJhbmRGbG9hdFNwcmVhZDpmdW5jdGlvbihhKXtyZXR1cm4gYSooLjUtTWF0aC5yYW5kb20oKSl9LGRlZ1RvUmFkOmZ1bmN0aW9uKGEpe3JldHVybiBhKmhiLkRFRzJSQUR9LHJhZFRvRGVnOmZ1bmN0aW9uKGEpe3JldHVybiBhKmhiLlJBRDJERUd9LGlzUG93ZXJPZlR3bzpmdW5jdGlvbihhKXtyZXR1cm4gMD09PShhJmEtMSkmJjAhPT1hfSxjZWlsUG93ZXJPZlR3bzpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5wb3coMixNYXRoLmNlaWwoTWF0aC5sb2coYSkvTWF0aC5MTjIpKX0sZmxvb3JQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnBvdygyLE1hdGguZmxvb3IoTWF0aC5sb2coYSkvTWF0aC5MTjIpKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGYucHJvdG90eXBlLHt3aWR0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMueD1hfX0saGVpZ2h0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy55fSwKc2V0OmZ1bmN0aW9uKGEpe3RoaXMueT1hfX19KTtPYmplY3QuYXNzaWduKGYucHJvdG90eXBlLHtpc1ZlY3RvcjI6ITAsc2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy54PWE7dGhpcy55PWM7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLnk9dGhpcy54PWE7cmV0dXJuIHRoaXN9LHNldFg6ZnVuY3Rpb24oYSl7dGhpcy54PWE7cmV0dXJuIHRoaXN9LHNldFk6ZnVuY3Rpb24oYSl7dGhpcy55PWE7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudDpmdW5jdGlvbihhLGMpe3N3aXRjaChhKXtjYXNlIDA6dGhpcy54PWM7YnJlYWs7Y2FzZSAxOnRoaXMueT1jO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9cmV0dXJuIHRoaXN9LGdldENvbXBvbmVudDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiKwphKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55KX0sY29weTpmdW5jdGlvbihhKXt0aGlzLng9YS54O3RoaXMueT1hLnk7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyhhLGMpO3RoaXMueCs9YS54O3RoaXMueSs9YS55O3JldHVybiB0aGlzfSxhZGRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kz1hO3RoaXMueSs9YTtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngrYy54O3RoaXMueT1hLnkrYy55O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPWEueCpjO3RoaXMueSs9YS55KmM7cmV0dXJuIHRoaXN9LApzdWI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnMoYSxjKTt0aGlzLngtPWEueDt0aGlzLnktPWEueTtyZXR1cm4gdGhpc30sc3ViU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueC09YTt0aGlzLnktPWE7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54LWMueDt0aGlzLnk9YS55LWMueTtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hLng7dGhpcy55Kj1hLnk7cmV0dXJuIHRoaXN9LG11bHRpcGx5U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCo9YTt0aGlzLnkqPWE7cmV0dXJuIHRoaXN9LGRpdmlkZTpmdW5jdGlvbihhKXt0aGlzLngvPWEueDt0aGlzLnkvPWEueTtyZXR1cm4gdGhpc30sZGl2aWRlU2NhbGFyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvCmEpfSxhcHBseU1hdHJpeDM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbM10qZSthWzZdO3RoaXMueT1hWzFdKmMrYVs0XSplK2FbN107cmV0dXJuIHRoaXN9LG1pbjpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5taW4odGhpcy54LGEueCk7dGhpcy55PU1hdGgubWluKHRoaXMueSxhLnkpO3JldHVybiB0aGlzfSxtYXg6ZnVuY3Rpb24oYSl7dGhpcy54PU1hdGgubWF4KHRoaXMueCxhLngpO3RoaXMueT1NYXRoLm1heCh0aGlzLnksYS55KTtyZXR1cm4gdGhpc30sY2xhbXA6ZnVuY3Rpb24oYSxjKXt0aGlzLng9TWF0aC5tYXgoYS54LE1hdGgubWluKGMueCx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYS55LE1hdGgubWluKGMueSx0aGlzLnkpKTtyZXR1cm4gdGhpc30sY2xhbXBTY2FsYXI6ZnVuY3Rpb24oYSxjKXt0aGlzLng9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLE1hdGgubWluKGMsCnRoaXMueSkpO3JldHVybiB0aGlzfSxjbGFtcExlbmd0aDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKGV8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KGEsTWF0aC5taW4oYyxlKSkpfSxmbG9vcjpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmZsb29yKHRoaXMueCk7dGhpcy55PU1hdGguZmxvb3IodGhpcy55KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7cmV0dXJuIHRoaXN9LHJvdW5kOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGgucm91bmQodGhpcy54KTt0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpO3JldHVybiB0aGlzfSxyb3VuZFRvWmVybzpmdW5jdGlvbigpe3RoaXMueD0wPnRoaXMueD9NYXRoLmNlaWwodGhpcy54KTpNYXRoLmZsb29yKHRoaXMueCk7dGhpcy55PTA+dGhpcy55P01hdGguY2VpbCh0aGlzLnkpOk1hdGguZmxvb3IodGhpcy55KTsKcmV0dXJuIHRoaXN9LG5lZ2F0ZTpmdW5jdGlvbigpe3RoaXMueD0tdGhpcy54O3RoaXMueT0tdGhpcy55O3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueCphLngrdGhpcy55KmEueX0sY3Jvc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueCphLnktdGhpcy55KmEueH0sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9LG1hbmhhdHRhbkxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSl9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX0sYW5nbGU6ZnVuY3Rpb24oKXt2YXIgYT1NYXRoLmF0YW4yKHRoaXMueSx0aGlzLngpOzA+YSYmKGErPTIqTWF0aC5QSSk7cmV0dXJuIGF9LApkaXN0YW5jZVRvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZChhKSl9LGRpc3RhbmNlVG9TcXVhcmVkOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueC1hLng7YT10aGlzLnktYS55O3JldHVybiBjKmMrYSphfSxtYW5oYXR0YW5EaXN0YW5jZVRvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicyh0aGlzLngtYS54KStNYXRoLmFicyh0aGlzLnktYS55KX0sc2V0TGVuZ3RoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGEpfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz0oYS54LXRoaXMueCkqYzt0aGlzLnkrPShhLnktdGhpcy55KSpjO3JldHVybiB0aGlzfSxsZXJwVmVjdG9yczpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyhjLGEpLm11bHRpcGx5U2NhbGFyKGUpLmFkZChhKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLng9PT10aGlzLngmJmEueT09PXRoaXMueX0sCmZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMueD1hW2NdO3RoaXMueT1hW2MrMV07cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLng7YVtjKzFdPXRoaXMueTtyZXR1cm4gYX0sZnJvbUJ1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7dm9pZCAwIT09ZSYmY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIik7dGhpcy54PWEuZ2V0WChjKTt0aGlzLnk9YS5nZXRZKGMpO3JldHVybiB0aGlzfSxyb3RhdGVBcm91bmQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1NYXRoLmNvcyhjKTtjPU1hdGguc2luKGMpO3ZhciBnPXRoaXMueC1hLngscj10aGlzLnktYS55O3RoaXMueD1nKmUtcipjK2EueDt0aGlzLnk9ZypjK3IqZSthLnk7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihoLAp7c2xlcnA6ZnVuY3Rpb24oYSxjLGUsZyl7cmV0dXJuIGUuY29weShhKS5zbGVycChjLGcpfSxzbGVycEZsYXQ6ZnVuY3Rpb24oYSxjLGUsZyxyLHYseil7dmFyIEU9ZVtnKzBdLEc9ZVtnKzFdLEo9ZVtnKzJdO2U9ZVtnKzNdO2c9clt2KzBdO3ZhciBQPXJbdisxXSxSPXJbdisyXTtyPXJbdiszXTtpZihlIT09cnx8RSE9PWd8fEchPT1QfHxKIT09Uil7dj0xLXo7dmFyIFM9RSpnK0cqUCtKKlIrZSpyLFY9MDw9Uz8xOi0xLFc9MS1TKlM7Vz5OdW1iZXIuRVBTSUxPTiYmKFc9TWF0aC5zcXJ0KFcpLFM9TWF0aC5hdGFuMihXLFMqViksdj1NYXRoLnNpbih2KlMpL1csej1NYXRoLnNpbih6KlMpL1cpO1YqPXo7RT1FKnYrZypWO0c9Ryp2K1AqVjtKPUoqditSKlY7ZT1lKnYrcipWO3Y9PT0xLXomJih6PTEvTWF0aC5zcXJ0KEUqRStHKkcrSipKK2UqZSksRSo9eixHKj16LEoqPXosZSo9eil9YVtjXT1FO2FbYysxXT1HO2FbYysyXT1KO2FbYyszXT1lfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGgucHJvdG90eXBlLAp7eDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3h9LHNldDpmdW5jdGlvbihhKXt0aGlzLl94PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0seTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3l9LHNldDpmdW5jdGlvbihhKXt0aGlzLl95PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0sejp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3p9LHNldDpmdW5jdGlvbihhKXt0aGlzLl96PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0sdzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3d9LHNldDpmdW5jdGlvbihhKXt0aGlzLl93PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX19KTtPYmplY3QuYXNzaWduKGgucHJvdG90eXBlLHtpc1F1YXRlcm5pb246ITAsc2V0OmZ1bmN0aW9uKGEsYyxlLGcpe3RoaXMuX3g9YTt0aGlzLl95PWM7dGhpcy5fej1lO3RoaXMuX3c9Zzt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsCnRoaXMuX3ksdGhpcy5feix0aGlzLl93KX0sY29weTpmdW5jdGlvbihhKXt0aGlzLl94PWEueDt0aGlzLl95PWEueTt0aGlzLl96PWEuejt0aGlzLl93PWEudzt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21FdWxlcjpmdW5jdGlvbihhLGMpe2lmKCFhfHwhYS5pc0V1bGVyKXRocm93IEVycm9yKCJUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4iKTt2YXIgZT1hLl94LGc9YS5feSxyPWEuX3o7YT1hLm9yZGVyO3ZhciB2PU1hdGguY29zLHo9TWF0aC5zaW4sRT12KGUvMiksRz12KGcvMik7dj12KHIvMik7ZT16KGUvMik7Zz16KGcvMik7cj16KHIvMik7IlhZWiI9PT1hPyh0aGlzLl94PWUqRyp2K0UqZypyLHRoaXMuX3k9RSpnKnYtZSpHKnIsdGhpcy5fej1FKkcqcitlKmcqdix0aGlzLl93PUUqRyp2LWUqZypyKToiWVhaIj09PQphPyh0aGlzLl94PWUqRyp2K0UqZypyLHRoaXMuX3k9RSpnKnYtZSpHKnIsdGhpcy5fej1FKkcqci1lKmcqdix0aGlzLl93PUUqRyp2K2UqZypyKToiWlhZIj09PWE/KHRoaXMuX3g9ZSpHKnYtRSpnKnIsdGhpcy5feT1FKmcqditlKkcqcix0aGlzLl96PUUqRypyK2UqZyp2LHRoaXMuX3c9RSpHKnYtZSpnKnIpOiJaWVgiPT09YT8odGhpcy5feD1lKkcqdi1FKmcqcix0aGlzLl95PUUqZyp2K2UqRypyLHRoaXMuX3o9RSpHKnItZSpnKnYsdGhpcy5fdz1FKkcqditlKmcqcik6IllaWCI9PT1hPyh0aGlzLl94PWUqRyp2K0UqZypyLHRoaXMuX3k9RSpnKnYrZSpHKnIsdGhpcy5fej1FKkcqci1lKmcqdix0aGlzLl93PUUqRyp2LWUqZypyKToiWFpZIj09PWEmJih0aGlzLl94PWUqRyp2LUUqZypyLHRoaXMuX3k9RSpnKnYtZSpHKnIsdGhpcy5fej1FKkcqcitlKmcqdix0aGlzLl93PUUqRyp2K2UqZypyKTshMSE9PWMmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbUF4aXNBbmdsZTpmdW5jdGlvbihhLApjKXtjLz0yO3ZhciBlPU1hdGguc2luKGMpO3RoaXMuX3g9YS54KmU7dGhpcy5feT1hLnkqZTt0aGlzLl96PWEueiplO3RoaXMuX3c9TWF0aC5jb3MoYyk7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tUm90YXRpb25NYXRyaXg6ZnVuY3Rpb24oYSl7dmFyIGM9YS5lbGVtZW50cyxlPWNbMF07YT1jWzRdO3ZhciBnPWNbOF0scj1jWzFdLHY9Y1s1XSx6PWNbOV0sRT1jWzJdLEc9Y1s2XTtjPWNbMTBdO3ZhciBKPWUrditjOzA8Sj8oZT0uNS9NYXRoLnNxcnQoSisxKSx0aGlzLl93PS4yNS9lLHRoaXMuX3g9KEcteikqZSx0aGlzLl95PShnLUUpKmUsdGhpcy5fej0oci1hKSplKTplPnYmJmU+Yz8oZT0yKk1hdGguc3FydCgxK2Utdi1jKSx0aGlzLl93PShHLXopL2UsdGhpcy5feD0uMjUqZSx0aGlzLl95PShhK3IpL2UsdGhpcy5fej0oZytFKS9lKTp2PmM/KGU9MipNYXRoLnNxcnQoMSt2LWUtYyksdGhpcy5fdz0oZy1FKS9lLHRoaXMuX3g9KGErcikvZSwKdGhpcy5feT0uMjUqZSx0aGlzLl96PSh6K0cpL2UpOihlPTIqTWF0aC5zcXJ0KDErYy1lLXYpLHRoaXMuX3c9KHItYSkvZSx0aGlzLl94PShnK0UpL2UsdGhpcy5feT0oeitHKS9lLHRoaXMuX3o9LjI1KmUpO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbVVuaXRWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5kb3QoYykrMTsxRS02PmU/KGU9MCxNYXRoLmFicyhhLngpPk1hdGguYWJzKGEueik/KHRoaXMuX3g9LWEueSx0aGlzLl95PWEueCx0aGlzLl96PTApOih0aGlzLl94PTAsdGhpcy5feT0tYS56LHRoaXMuX3o9YS55KSk6KHRoaXMuX3g9YS55KmMuei1hLnoqYy55LHRoaXMuX3k9YS56KmMueC1hLngqYy56LHRoaXMuX3o9YS54KmMueS1hLnkqYy54KTt0aGlzLl93PWU7cmV0dXJuIHRoaXMubm9ybWFsaXplKCl9LGFuZ2xlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIDIqTWF0aC5hY29zKE1hdGguYWJzKGhiLmNsYW1wKHRoaXMuZG90KGEpLC0xLAoxKSkpfSxyb3RhdGVUb3dhcmRzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5hbmdsZVRvKGEpO2lmKDA9PT1lKXJldHVybiB0aGlzO3RoaXMuc2xlcnAoYSxNYXRoLm1pbigxLGMvZSkpO3JldHVybiB0aGlzfSxpbnZlcnNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9LGNvbmp1Z2F0ZTpmdW5jdGlvbigpe3RoaXMuX3gqPS0xO3RoaXMuX3kqPS0xO3RoaXMuX3oqPS0xO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sZG90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl94KmEuX3grdGhpcy5feSphLl95K3RoaXMuX3oqYS5feit0aGlzLl93KmEuX3d9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd30sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqCnRoaXMuX3ordGhpcy5fdyp0aGlzLl93KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZW5ndGgoKTswPT09YT8odGhpcy5fej10aGlzLl95PXRoaXMuX3g9MCx0aGlzLl93PTEpOihhPTEvYSx0aGlzLl94Kj1hLHRoaXMuX3kqPWEsdGhpcy5feio9YSx0aGlzLl93Kj1hKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LG11bHRpcGx5OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHZvaWQgMCE9PWM/KGNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlRdWF0ZXJuaW9ucyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKGEsYykpOnRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0aGlzLGEpfSxwcmVtdWx0aXBseTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKGEsdGhpcyl9LG11bHRpcGx5UXVhdGVybmlvbnM6ZnVuY3Rpb24oYSwKYyl7dmFyIGU9YS5feCxnPWEuX3kscj1hLl96O2E9YS5fdzt2YXIgdj1jLl94LHo9Yy5feSxFPWMuX3o7Yz1jLl93O3RoaXMuX3g9ZSpjK2EqditnKkUtcip6O3RoaXMuX3k9ZypjK2EqeityKnYtZSpFO3RoaXMuX3o9cipjK2EqRStlKnotZyp2O3RoaXMuX3c9YSpjLWUqdi1nKnotcipFO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2xlcnA6ZnVuY3Rpb24oYSxjKXtpZigwPT09YylyZXR1cm4gdGhpcztpZigxPT09YylyZXR1cm4gdGhpcy5jb3B5KGEpO3ZhciBlPXRoaXMuX3gsZz10aGlzLl95LHI9dGhpcy5feix2PXRoaXMuX3csej12KmEuX3crZSphLl94K2cqYS5feStyKmEuX3o7MD56Pyh0aGlzLl93PS1hLl93LHRoaXMuX3g9LWEuX3gsdGhpcy5feT0tYS5feSx0aGlzLl96PS1hLl96LHo9LXopOnRoaXMuY29weShhKTtpZigxPD16KXJldHVybiB0aGlzLl93PXYsdGhpcy5feD1lLHRoaXMuX3k9Zyx0aGlzLl96PXIsdGhpczthPTEteip6O2lmKGE8PU51bWJlci5FUFNJTE9OKXJldHVybiB6PQoxLWMsdGhpcy5fdz16KnYrYyp0aGlzLl93LHRoaXMuX3g9eiplK2MqdGhpcy5feCx0aGlzLl95PXoqZytjKnRoaXMuX3ksdGhpcy5fej16KnIrYyp0aGlzLl96LHRoaXMubm9ybWFsaXplKCksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXM7YT1NYXRoLnNxcnQoYSk7dmFyIEU9TWF0aC5hdGFuMihhLHopO3o9TWF0aC5zaW4oKDEtYykqRSkvYTtjPU1hdGguc2luKGMqRSkvYTt0aGlzLl93PXYqeit0aGlzLl93KmM7dGhpcy5feD1lKnordGhpcy5feCpjO3RoaXMuX3k9Zyp6K3RoaXMuX3kqYzt0aGlzLl96PXIqeit0aGlzLl96KmM7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuX3g9PT10aGlzLl94JiZhLl95PT09dGhpcy5feSYmYS5fej09PXRoaXMuX3omJmEuX3c9PT10aGlzLl93fSxmcm9tQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0wKTt0aGlzLl94PWFbY107dGhpcy5feT1hW2MrMV07CnRoaXMuX3o9YVtjKzJdO3RoaXMuX3c9YVtjKzNdO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTthW2NdPXRoaXMuX3g7YVtjKzFdPXRoaXMuX3k7YVtjKzJdPXRoaXMuX3o7YVtjKzNdPXRoaXMuX3c7cmV0dXJuIGF9LF9vbkNoYW5nZTpmdW5jdGlvbihhKXt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPWE7cmV0dXJuIHRoaXN9LF9vbkNoYW5nZUNhbGxiYWNrOmZ1bmN0aW9uKCl7fX0pO3ZhciB4aT1uZXcgayxiaz1uZXcgaDtPYmplY3QuYXNzaWduKGsucHJvdG90eXBlLHtpc1ZlY3RvcjM6ITAsc2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLng9YTt0aGlzLnk9Yzt0aGlzLno9ZTtyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMuej10aGlzLnk9dGhpcy54PWE7cmV0dXJuIHRoaXN9LHNldFg6ZnVuY3Rpb24oYSl7dGhpcy54PWE7cmV0dXJuIHRoaXN9LApzZXRZOmZ1bmN0aW9uKGEpe3RoaXMueT1hO3JldHVybiB0aGlzfSxzZXRaOmZ1bmN0aW9uKGEpe3RoaXMuej1hO3JldHVybiB0aGlzfSxzZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSxjKXtzd2l0Y2goYSl7Y2FzZSAwOnRoaXMueD1jO2JyZWFrO2Nhc2UgMTp0aGlzLnk9YzticmVhaztjYXNlIDI6dGhpcy56PWM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2EpO31yZXR1cm4gdGhpc30sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMueD1hLng7dGhpcy55PWEueTsKdGhpcy56PWEuejtyZXR1cm4gdGhpc30sYWRkOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKGEsYyk7dGhpcy54Kz1hLng7dGhpcy55Kz1hLnk7dGhpcy56Kz1hLno7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngrPWE7dGhpcy55Kz1hO3RoaXMueis9YTtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngrYy54O3RoaXMueT1hLnkrYy55O3RoaXMuej1hLnorYy56O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPWEueCpjO3RoaXMueSs9YS55KmM7dGhpcy56Kz1hLnoqYztyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksCnRoaXMuc3ViVmVjdG9ycyhhLGMpO3RoaXMueC09YS54O3RoaXMueS09YS55O3RoaXMuei09YS56O3JldHVybiB0aGlzfSxzdWJTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54LT1hO3RoaXMueS09YTt0aGlzLnotPWE7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54LWMueDt0aGlzLnk9YS55LWMueTt0aGlzLno9YS56LWMuejtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5VmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5tdWx0aXBseVZlY3RvcnMoYSxjKTt0aGlzLngqPWEueDt0aGlzLnkqPWEueTt0aGlzLnoqPWEuejtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hO3RoaXMueSo9YTt0aGlzLnoqPQphO3JldHVybiB0aGlzfSxtdWx0aXBseVZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54KmMueDt0aGlzLnk9YS55KmMueTt0aGlzLno9YS56KmMuejtyZXR1cm4gdGhpc30sYXBwbHlFdWxlcjpmdW5jdGlvbihhKXthJiZhLmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4iKTtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oYmsuc2V0RnJvbUV1bGVyKGEpKX0sYXBwbHlBeGlzQW5nbGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oYmsuc2V0RnJvbUF4aXNBbmdsZShhLGMpKX0sYXBwbHlNYXRyaXgzOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueCxlPXRoaXMueSxnPXRoaXMuejthPWEuZWxlbWVudHM7dGhpcy54PWFbMF0qYythWzNdKmUrYVs2XSpnO3RoaXMueT1hWzFdKmMrYVs0XSplK2FbN10qCmc7dGhpcy56PWFbMl0qYythWzVdKmUrYVs4XSpnO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56O2E9YS5lbGVtZW50czt2YXIgcj0xLyhhWzNdKmMrYVs3XSplK2FbMTFdKmcrYVsxNV0pO3RoaXMueD0oYVswXSpjK2FbNF0qZSthWzhdKmcrYVsxMl0pKnI7dGhpcy55PShhWzFdKmMrYVs1XSplK2FbOV0qZythWzEzXSkqcjt0aGlzLno9KGFbMl0qYythWzZdKmUrYVsxMF0qZythWzE0XSkqcjtyZXR1cm4gdGhpc30sYXBwbHlRdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueCxlPXRoaXMueSxnPXRoaXMueixyPWEueCx2PWEueSx6PWEuejthPWEudzt2YXIgRT1hKmMrdipnLXoqZSxHPWEqZSt6KmMtcipnLEo9YSpnK3IqZS12KmM7Yz0tcipjLXYqZS16Kmc7dGhpcy54PUUqYStjKi1yK0cqLXotSiotdjt0aGlzLnk9RyphK2MqLXYrSiotci1FKi16O3RoaXMuej1KKmErYyoteitFKi12LUcqLXI7cmV0dXJuIHRoaXN9LApwcm9qZWN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChhLm1hdHJpeFdvcmxkSW52ZXJzZSkuYXBwbHlNYXRyaXg0KGEucHJvamVjdGlvbk1hdHJpeCl9LHVucHJvamVjdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpfSx0cmFuc2Zvcm1EaXJlY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbNF0qZSthWzhdKmc7dGhpcy55PWFbMV0qYythWzVdKmUrYVs5XSpnO3RoaXMuej1hWzJdKmMrYVs2XSplK2FbMTBdKmc7cmV0dXJuIHRoaXMubm9ybWFsaXplKCl9LGRpdmlkZTpmdW5jdGlvbihhKXt0aGlzLngvPWEueDt0aGlzLnkvPWEueTt0aGlzLnovPWEuejtyZXR1cm4gdGhpc30sZGl2aWRlU2NhbGFyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvCmEpfSxtaW46ZnVuY3Rpb24oYSl7dGhpcy54PU1hdGgubWluKHRoaXMueCxhLngpO3RoaXMueT1NYXRoLm1pbih0aGlzLnksYS55KTt0aGlzLno9TWF0aC5taW4odGhpcy56LGEueik7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGEueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxhLnkpO3RoaXMuej1NYXRoLm1heCh0aGlzLnosYS56KTtyZXR1cm4gdGhpc30sY2xhbXA6ZnVuY3Rpb24oYSxjKXt0aGlzLng9TWF0aC5tYXgoYS54LE1hdGgubWluKGMueCx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYS55LE1hdGgubWluKGMueSx0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYS56LE1hdGgubWluKGMueix0aGlzLnopKTtyZXR1cm4gdGhpc30sY2xhbXBTY2FsYXI6ZnVuY3Rpb24oYSxjKXt0aGlzLng9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGEsCk1hdGgubWluKGMsdGhpcy56KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoZXx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYSxNYXRoLm1pbihjLGUpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej1NYXRoLmZsb29yKHRoaXMueik7cmV0dXJuIHRoaXN9LGNlaWw6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5jZWlsKHRoaXMueCk7dGhpcy55PU1hdGguY2VpbCh0aGlzLnkpO3RoaXMuej1NYXRoLmNlaWwodGhpcy56KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpO3RoaXMueT1NYXRoLnJvdW5kKHRoaXMueSk7dGhpcy56PU1hdGgucm91bmQodGhpcy56KTtyZXR1cm4gdGhpc30scm91bmRUb1plcm86ZnVuY3Rpb24oKXt0aGlzLng9CjA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej0wPnRoaXMuej9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueik7cmV0dXJuIHRoaXN9LG5lZ2F0ZTpmdW5jdGlvbigpe3RoaXMueD0tdGhpcy54O3RoaXMueT0tdGhpcy55O3RoaXMuej0tdGhpcy56O3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueCphLngrdGhpcy55KmEueSt0aGlzLnoqYS56fSxsZW5ndGhTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMuen0sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueil9LG1hbmhhdHRhbkxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrCk1hdGguYWJzKHRoaXMueil9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX0sc2V0TGVuZ3RoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGEpfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz0oYS54LXRoaXMueCkqYzt0aGlzLnkrPShhLnktdGhpcy55KSpjO3RoaXMueis9KGEuei10aGlzLnopKmM7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGMsYSkubXVsdGlwbHlTY2FsYXIoZSkuYWRkKGEpfSxjcm9zczpmdW5jdGlvbihhLGMpe3JldHVybiB2b2lkIDAhPT1jPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5jcm9zc1ZlY3RvcnMoYSxjKSk6dGhpcy5jcm9zc1ZlY3RvcnModGhpcywKYSl9LGNyb3NzVmVjdG9yczpmdW5jdGlvbihhLGMpe3ZhciBlPWEueCxnPWEueTthPWEuejt2YXIgcj1jLngsdj1jLnk7Yz1jLno7dGhpcy54PWcqYy1hKnY7dGhpcy55PWEqci1lKmM7dGhpcy56PWUqdi1nKnI7cmV0dXJuIHRoaXN9LHByb2plY3RPblZlY3RvcjpmdW5jdGlvbihhKXt2YXIgYz1hLmRvdCh0aGlzKS9hLmxlbmd0aFNxKCk7cmV0dXJuIHRoaXMuY29weShhKS5tdWx0aXBseVNjYWxhcihjKX0scHJvamVjdE9uUGxhbmU6ZnVuY3Rpb24oYSl7eGkuY29weSh0aGlzKS5wcm9qZWN0T25WZWN0b3IoYSk7cmV0dXJuIHRoaXMuc3ViKHhpKX0scmVmbGVjdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zdWIoeGkuY29weShhKS5tdWx0aXBseVNjYWxhcigyKnRoaXMuZG90KGEpKSl9LGFuZ2xlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWNvcyhoYi5jbGFtcCh0aGlzLmRvdChhKS9NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKmEubGVuZ3RoU3EoKSksLTEsMSkpfSxkaXN0YW5jZVRvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZChhKSl9LApkaXN0YW5jZVRvU3F1YXJlZDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngtYS54LGU9dGhpcy55LWEueTthPXRoaXMuei1hLno7cmV0dXJuIGMqYytlKmUrYSphfSxtYW5oYXR0YW5EaXN0YW5jZVRvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicyh0aGlzLngtYS54KStNYXRoLmFicyh0aGlzLnktYS55KStNYXRoLmFicyh0aGlzLnotYS56KX0sc2V0RnJvbVNwaGVyaWNhbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKGEucmFkaXVzLGEucGhpLGEudGhldGEpfSxzZXRGcm9tU3BoZXJpY2FsQ29vcmRzOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz1NYXRoLnNpbihjKSphO3RoaXMueD1nKk1hdGguc2luKGUpO3RoaXMueT1NYXRoLmNvcyhjKSphO3RoaXMuej1nKk1hdGguY29zKGUpO3JldHVybiB0aGlzfSxzZXRGcm9tQ3lsaW5kcmljYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKGEucmFkaXVzLGEudGhldGEsCmEueSl9LHNldEZyb21DeWxpbmRyaWNhbENvb3JkczpmdW5jdGlvbihhLGMsZSl7dGhpcy54PWEqTWF0aC5zaW4oYyk7dGhpcy55PWU7dGhpcy56PWEqTWF0aC5jb3MoYyk7cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXhQb3NpdGlvbjpmdW5jdGlvbihhKXthPWEuZWxlbWVudHM7dGhpcy54PWFbMTJdO3RoaXMueT1hWzEzXTt0aGlzLno9YVsxNF07cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXhTY2FsZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oYSwwKS5sZW5ndGgoKSxlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihhLDEpLmxlbmd0aCgpO2E9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsMikubGVuZ3RoKCk7dGhpcy54PWM7dGhpcy55PWU7dGhpcy56PWE7cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXhDb2x1bW46ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkoYS5lbGVtZW50cyw0KmMpfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueD09PQp0aGlzLngmJmEueT09PXRoaXMueSYmYS56PT09dGhpcy56fSxmcm9tQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0wKTt0aGlzLng9YVtjXTt0aGlzLnk9YVtjKzFdO3RoaXMuej1hW2MrMl07cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLng7YVtjKzFdPXRoaXMueTthW2MrMl09dGhpcy56O3JldHVybiBhfSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTt0aGlzLng9YS5nZXRYKGMpO3RoaXMueT1hLmdldFkoYyk7dGhpcy56PWEuZ2V0WihjKTtyZXR1cm4gdGhpc319KTt2YXIgZWU9bmV3IGs7T2JqZWN0LmFzc2lnbih0LnByb3RvdHlwZSx7aXNNYXRyaXgzOiEwLHNldDpmdW5jdGlvbihhLApjLGUsZyxyLHYseixFLEcpe3ZhciBKPXRoaXMuZWxlbWVudHM7SlswXT1hO0pbMV09ZztKWzJdPXo7SlszXT1jO0pbNF09cjtKWzVdPUU7Sls2XT1lO0pbN109djtKWzhdPUc7cmV0dXJuIHRoaXN9LGlkZW50aXR5OmZ1bmN0aW9uKCl7dGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfSxjb3B5OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2NbMF09YVswXTtjWzFdPWFbMV07Y1syXT1hWzJdO2NbM109YVszXTtjWzRdPWFbNF07Y1s1XT1hWzVdO2NbNl09YVs2XTtjWzddPWFbN107Y1s4XT1hWzhdO3JldHVybiB0aGlzfSxzZXRGcm9tTWF0cml4NDpmdW5jdGlvbihhKXthPWEuZWxlbWVudHM7dGhpcy5zZXQoYVswXSxhWzRdLGFbOF0sYVsxXSxhWzVdLGFbOV0sYVsyXSxhWzZdLGFbMTBdKTtyZXR1cm4gdGhpc30sCmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTAsZT1hLmNvdW50O2M8ZTtjKyspZWUueD1hLmdldFgoYyksZWUueT1hLmdldFkoYyksZWUuej1hLmdldFooYyksZWUuYXBwbHlNYXRyaXgzKHRoaXMpLGEuc2V0WFlaKGMsZWUueCxlZS55LGVlLnopO3JldHVybiBhfSxtdWx0aXBseTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsYSl9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoYSx0aGlzKX0sbXVsdGlwbHlNYXRyaWNlczpmdW5jdGlvbihhLGMpe3ZhciBlPWEuZWxlbWVudHMsZz1jLmVsZW1lbnRzO2M9dGhpcy5lbGVtZW50czthPWVbMF07dmFyIHI9ZVszXSx2PWVbNl0sej1lWzFdLEU9ZVs0XSxHPWVbN10sSj1lWzJdLFA9ZVs1XTtlPWVbOF07dmFyIFI9Z1swXSxTPWdbM10sVj1nWzZdLFc9Z1sxXSxoYT1nWzRdLGZhPWdbN10scmE9Z1syXSxwYT1nWzVdO2c9Z1s4XTsKY1swXT1hKlIrcipXK3YqcmE7Y1szXT1hKlMrcipoYSt2KnBhO2NbNl09YSpWK3IqZmErdipnO2NbMV09eipSK0UqVytHKnJhO2NbNF09eipTK0UqaGErRypwYTtjWzddPXoqVitFKmZhK0cqZztjWzJdPUoqUitQKlcrZSpyYTtjWzVdPUoqUytQKmhhK2UqcGE7Y1s4XT1KKlYrUCpmYStlKmc7cmV0dXJuIHRoaXN9LG11bHRpcGx5U2NhbGFyOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7Y1swXSo9YTtjWzNdKj1hO2NbNl0qPWE7Y1sxXSo9YTtjWzRdKj1hO2NbN10qPWE7Y1syXSo9YTtjWzVdKj1hO2NbOF0qPWE7cmV0dXJuIHRoaXN9LGRldGVybWluYW50OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50cyxjPWFbMF0sZT1hWzFdLGc9YVsyXSxyPWFbM10sdj1hWzRdLHo9YVs1XSxFPWFbNl0sRz1hWzddO2E9YVs4XTtyZXR1cm4gYyp2KmEtYyp6KkctZSpyKmErZSp6KkUrZypyKkctZyp2KkV9LGdldEludmVyc2U6ZnVuY3Rpb24oYSxjKXthJiZhLmlzTWF0cml4NCYmCmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5nZXRJbnZlcnNlKCkgbm8gbG9uZ2VyIHRha2VzIGEgTWF0cml4NCBhcmd1bWVudC4iKTt2YXIgZT1hLmVsZW1lbnRzO2E9dGhpcy5lbGVtZW50czt2YXIgZz1lWzBdLHI9ZVsxXSx2PWVbMl0sej1lWzNdLEU9ZVs0XSxHPWVbNV0sSj1lWzZdLFA9ZVs3XTtlPWVbOF07dmFyIFI9ZSpFLUcqUCxTPUcqSi1lKnosVj1QKnotRSpKLFc9ZypSK3IqUyt2KlY7aWYoMD09PVcpe2lmKCEwPT09Yyl0aHJvdyBFcnJvcigiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIik7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtyZXR1cm4gdGhpcy5pZGVudGl0eSgpfWM9MS9XO2FbMF09UipjO2FbMV09KHYqUC1lKnIpKmM7YVsyXT0oRypyLXYqRSkqYzthWzNdPVMqYzthWzRdPQooZSpnLXYqSikqYzthWzVdPSh2KnotRypnKSpjO2FbNl09VipjO2FbN109KHIqSi1QKmcpKmM7YVs4XT0oRSpnLXIqeikqYztyZXR1cm4gdGhpc30sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50czt2YXIgYz1hWzFdO2FbMV09YVszXTthWzNdPWM7Yz1hWzJdO2FbMl09YVs2XTthWzZdPWM7Yz1hWzVdO2FbNV09YVs3XTthWzddPWM7cmV0dXJuIHRoaXN9LGdldE5vcm1hbE1hdHJpeDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NChhKS5nZXRJbnZlcnNlKHRoaXMpLnRyYW5zcG9zZSgpfSx0cmFuc3Bvc2VJbnRvQXJyYXk6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthWzBdPWNbMF07YVsxXT1jWzNdO2FbMl09Y1s2XTthWzNdPWNbMV07YVs0XT1jWzRdO2FbNV09Y1s3XTthWzZdPWNbMl07YVs3XT1jWzVdO2FbOF09Y1s4XTtyZXR1cm4gdGhpc30sc2V0VXZUcmFuc2Zvcm06ZnVuY3Rpb24oYSxjLGUsZyxyLHYseil7dmFyIEU9Ck1hdGguY29zKHIpO3I9TWF0aC5zaW4ocik7dGhpcy5zZXQoZSpFLGUqciwtZSooRSp2K3IqeikrdithLC1nKnIsZypFLC1nKigtcip2K0UqeikreitjLDAsMCwxKX0sc2NhbGU6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmVsZW1lbnRzO2VbMF0qPWE7ZVszXSo9YTtlWzZdKj1hO2VbMV0qPWM7ZVs0XSo9YztlWzddKj1jO3JldHVybiB0aGlzfSxyb3RhdGU6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5jb3MoYSk7YT1NYXRoLnNpbihhKTt2YXIgZT10aGlzLmVsZW1lbnRzLGc9ZVswXSxyPWVbM10sdj1lWzZdLHo9ZVsxXSxFPWVbNF0sRz1lWzddO2VbMF09YypnK2EqejtlWzNdPWMqcithKkU7ZVs2XT1jKnYrYSpHO2VbMV09LWEqZytjKno7ZVs0XT0tYSpyK2MqRTtlWzddPS1hKnYrYypHO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmVsZW1lbnRzO2VbMF0rPWEqZVsyXTtlWzNdKz1hKmVbNV07ZVs2XSs9YSplWzhdO2VbMV0rPWMqZVsyXTtlWzRdKz0KYyplWzVdO2VbN10rPWMqZVs4XTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2Zvcih2YXIgZT0wOzk+ZTtlKyspaWYoY1tlXSE9PWFbZV0pcmV0dXJuITE7cmV0dXJuITB9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO2Zvcih2YXIgZT0wOzk+ZTtlKyspdGhpcy5lbGVtZW50c1tlXT1hW2UrY107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7dmFyIGU9dGhpcy5lbGVtZW50czthW2NdPWVbMF07YVtjKzFdPWVbMV07YVtjKzJdPWVbMl07YVtjKzNdPWVbM107YVtjKzRdPWVbNF07YVtjKzVdPWVbNV07YVtjKzZdPWVbNl07YVtjKzddPWVbN107YVtjKzhdPWVbOF07cmV0dXJuIGF9fSk7dmFyIGVmLERkPXtnZXREYXRhVVJMOmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQpcmV0dXJuIGEuc3JjOwppZighKGEgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkpe3ZvaWQgMD09PWVmJiYoZWY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIikpO2VmLndpZHRoPWEud2lkdGg7ZWYuaGVpZ2h0PWEuaGVpZ2h0O3ZhciBjPWVmLmdldENvbnRleHQoIjJkIik7YSBpbnN0YW5jZW9mIEltYWdlRGF0YT9jLnB1dEltYWdlRGF0YShhLDAsMCk6Yy5kcmF3SW1hZ2UoYSwwLDAsYS53aWR0aCxhLmhlaWdodCk7YT1lZn1yZXR1cm4gMjA0ODxhLndpZHRofHwyMDQ4PGEuaGVpZ2h0P2EudG9EYXRhVVJMKCJpbWFnZS9qcGVnIiwuNik6YS50b0RhdGFVUkwoImltYWdlL3BuZyIpfX0sTms9MDtsLkRFRkFVTFRfSU1BR0U9dm9pZCAwO2wuREVGQVVMVF9NQVBQSU5HPTMwMDtsLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpsLGlzVGV4dHVyZTohMCx1cGRhdGVNYXRyaXg6ZnVuY3Rpb24oKXt0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSh0aGlzLm9mZnNldC54LAp0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubmFtZT1hLm5hbWU7dGhpcy5pbWFnZT1hLmltYWdlO3RoaXMubWlwbWFwcz1hLm1pcG1hcHMuc2xpY2UoMCk7dGhpcy5tYXBwaW5nPWEubWFwcGluZzt0aGlzLndyYXBTPWEud3JhcFM7dGhpcy53cmFwVD1hLndyYXBUO3RoaXMubWFnRmlsdGVyPWEubWFnRmlsdGVyO3RoaXMubWluRmlsdGVyPWEubWluRmlsdGVyO3RoaXMuYW5pc290cm9weT1hLmFuaXNvdHJvcHk7dGhpcy5mb3JtYXQ9YS5mb3JtYXQ7dGhpcy50eXBlPWEudHlwZTt0aGlzLm9mZnNldC5jb3B5KGEub2Zmc2V0KTt0aGlzLnJlcGVhdC5jb3B5KGEucmVwZWF0KTt0aGlzLmNlbnRlci5jb3B5KGEuY2VudGVyKTt0aGlzLnJvdGF0aW9uPQphLnJvdGF0aW9uO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXguY29weShhLm1hdHJpeCk7dGhpcy5nZW5lcmF0ZU1pcG1hcHM9YS5nZW5lcmF0ZU1pcG1hcHM7dGhpcy5wcmVtdWx0aXBseUFscGhhPWEucHJlbXVsdGlwbHlBbHBoYTt0aGlzLmZsaXBZPWEuZmxpcFk7dGhpcy51bnBhY2tBbGlnbm1lbnQ9YS51bnBhY2tBbGlnbm1lbnQ7dGhpcy5lbmNvZGluZz1hLmVuY29kaW5nO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7dmFyIGM9dm9pZCAwPT09YXx8InN0cmluZyI9PT10eXBlb2YgYTtpZighYyYmdm9pZCAwIT09YS50ZXh0dXJlc1t0aGlzLnV1aWRdKXJldHVybiBhLnRleHR1cmVzW3RoaXMudXVpZF07dmFyIGU9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsbWFwcGluZzp0aGlzLm1hcHBpbmcsCnJlcGVhdDpbdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55XSxvZmZzZXQ6W3RoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueV0sY2VudGVyOlt0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnldLHJvdGF0aW9uOnRoaXMucm90YXRpb24sd3JhcDpbdGhpcy53cmFwUyx0aGlzLndyYXBUXSxmb3JtYXQ6dGhpcy5mb3JtYXQsdHlwZTp0aGlzLnR5cGUsZW5jb2Rpbmc6dGhpcy5lbmNvZGluZyxtaW5GaWx0ZXI6dGhpcy5taW5GaWx0ZXIsbWFnRmlsdGVyOnRoaXMubWFnRmlsdGVyLGFuaXNvdHJvcHk6dGhpcy5hbmlzb3Ryb3B5LGZsaXBZOnRoaXMuZmxpcFkscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtpZih2b2lkIDAhPT10aGlzLmltYWdlKXt2YXIgZz10aGlzLmltYWdlO3ZvaWQgMD09PWcudXVpZCYmKGcudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKSk7aWYoIWMmJnZvaWQgMD09PWEuaW1hZ2VzW2cudXVpZF0pe2lmKEFycmF5LmlzQXJyYXkoZykpe3ZhciByPQpbXTtmb3IodmFyIHY9MCx6PWcubGVuZ3RoO3Y8ejt2Kyspci5wdXNoKERkLmdldERhdGFVUkwoZ1t2XSkpfWVsc2Ugcj1EZC5nZXREYXRhVVJMKGcpO2EuaW1hZ2VzW2cudXVpZF09e3V1aWQ6Zy51dWlkLHVybDpyfX1lLmltYWdlPWcudXVpZH1jfHwoYS50ZXh0dXJlc1t0aGlzLnV1aWRdPWUpO3JldHVybiBlfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfSx0cmFuc2Zvcm1VdjpmdW5jdGlvbihhKXtpZigzMDAhPT10aGlzLm1hcHBpbmcpcmV0dXJuIGE7YS5hcHBseU1hdHJpeDModGhpcy5tYXRyaXgpO2lmKDA+YS54fHwxPGEueClzd2l0Y2godGhpcy53cmFwUyl7Y2FzZSAxRTM6YS54LT1NYXRoLmZsb29yKGEueCk7YnJlYWs7Y2FzZSAxMDAxOmEueD0wPmEueD8wOjE7YnJlYWs7Y2FzZSAxMDAyOmEueD0xPT09TWF0aC5hYnMoTWF0aC5mbG9vcihhLngpJTIpP01hdGguY2VpbChhLngpLWEueDphLngtTWF0aC5mbG9vcihhLngpfWlmKDA+CmEueXx8MTxhLnkpc3dpdGNoKHRoaXMud3JhcFQpe2Nhc2UgMUUzOmEueS09TWF0aC5mbG9vcihhLnkpO2JyZWFrO2Nhc2UgMTAwMTphLnk9MD5hLnk/MDoxO2JyZWFrO2Nhc2UgMTAwMjphLnk9MT09PU1hdGguYWJzKE1hdGguZmxvb3IoYS55KSUyKT9NYXRoLmNlaWwoYS55KS1hLnk6YS55LU1hdGguZmxvb3IoYS55KX10aGlzLmZsaXBZJiYoYS55PTEtYS55KTtyZXR1cm4gYX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobC5wcm90b3R5cGUsIm5lZWRzVXBkYXRlIix7c2V0OmZ1bmN0aW9uKGEpeyEwPT09YSYmdGhpcy52ZXJzaW9uKyt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocC5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy56PWF9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnd9LHNldDpmdW5jdGlvbihhKXt0aGlzLnc9YX19fSk7T2JqZWN0LmFzc2lnbihwLnByb3RvdHlwZSwKe2lzVmVjdG9yNDohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy54PWE7dGhpcy55PWM7dGhpcy56PWU7dGhpcy53PWc7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLnc9dGhpcy56PXRoaXMueT10aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihhKXt0aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihhKXt0aGlzLnk9YTtyZXR1cm4gdGhpc30sc2V0WjpmdW5jdGlvbihhKXt0aGlzLno9YTtyZXR1cm4gdGhpc30sc2V0VzpmdW5jdGlvbihhKXt0aGlzLnc9YTtyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEsYyl7c3dpdGNoKGEpe2Nhc2UgMDp0aGlzLng9YzticmVhaztjYXNlIDE6dGhpcy55PWM7YnJlYWs7Y2FzZSAyOnRoaXMuej1jO2JyZWFrO2Nhc2UgMzp0aGlzLnc9YzticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fXJldHVybiB0aGlzfSxnZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gdGhpcy54OwpjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtjYXNlIDM6cmV0dXJuIHRoaXMudztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnosdGhpcy53KX0sY29weTpmdW5jdGlvbihhKXt0aGlzLng9YS54O3RoaXMueT1hLnk7dGhpcy56PWEuejt0aGlzLnc9dm9pZCAwIT09YS53P2EudzoxO3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnMoYSxjKTt0aGlzLngrPWEueDt0aGlzLnkrPWEueTt0aGlzLnorPWEuejt0aGlzLncrPWEudztyZXR1cm4gdGhpc30sCmFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngrPWE7dGhpcy55Kz1hO3RoaXMueis9YTt0aGlzLncrPWE7cmV0dXJuIHRoaXN9LGFkZFZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54K2MueDt0aGlzLnk9YS55K2MueTt0aGlzLno9YS56K2Muejt0aGlzLnc9YS53K2MudztyZXR1cm4gdGhpc30sYWRkU2NhbGVkVmVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz1hLngqYzt0aGlzLnkrPWEueSpjO3RoaXMueis9YS56KmM7dGhpcy53Kz1hLncqYztyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5zdWJWZWN0b3JzKGEsYyk7dGhpcy54LT1hLng7dGhpcy55LT1hLnk7dGhpcy56LT1hLno7dGhpcy53LT1hLnc7cmV0dXJuIHRoaXN9LHN1YlNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngtPQphO3RoaXMueS09YTt0aGlzLnotPWE7dGhpcy53LT1hO3JldHVybiB0aGlzfSxzdWJWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy54PWEueC1jLng7dGhpcy55PWEueS1jLnk7dGhpcy56PWEuei1jLno7dGhpcy53PWEudy1jLnc7cmV0dXJuIHRoaXN9LG11bHRpcGx5U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCo9YTt0aGlzLnkqPWE7dGhpcy56Kj1hO3RoaXMudyo9YTtyZXR1cm4gdGhpc30sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueCxlPXRoaXMueSxnPXRoaXMueixyPXRoaXMudzthPWEuZWxlbWVudHM7dGhpcy54PWFbMF0qYythWzRdKmUrYVs4XSpnK2FbMTJdKnI7dGhpcy55PWFbMV0qYythWzVdKmUrYVs5XSpnK2FbMTNdKnI7dGhpcy56PWFbMl0qYythWzZdKmUrYVsxMF0qZythWzE0XSpyO3RoaXMudz1hWzNdKmMrYVs3XSplK2FbMTFdKmcrYVsxNV0qcjtyZXR1cm4gdGhpc30sZGl2aWRlU2NhbGFyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvCmEpfSxzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbjpmdW5jdGlvbihhKXt0aGlzLnc9MipNYXRoLmFjb3MoYS53KTt2YXIgYz1NYXRoLnNxcnQoMS1hLncqYS53KTsxRS00PmM/KHRoaXMueD0xLHRoaXMuej10aGlzLnk9MCk6KHRoaXMueD1hLngvYyx0aGlzLnk9YS55L2MsdGhpcy56PWEuei9jKTtyZXR1cm4gdGhpc30sc2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKGEpe2E9YS5lbGVtZW50czt2YXIgYz1hWzBdO3ZhciBlPWFbNF07dmFyIGc9YVs4XSxyPWFbMV0sdj1hWzVdLHo9YVs5XTt2YXIgRT1hWzJdO3ZhciBHPWFbNl07dmFyIEo9YVsxMF07aWYoLjAxPk1hdGguYWJzKGUtcikmJi4wMT5NYXRoLmFicyhnLUUpJiYuMDE+TWF0aC5hYnMoei1HKSl7aWYoLjE+TWF0aC5hYnMoZStyKSYmLjE+TWF0aC5hYnMoZytFKSYmLjE+TWF0aC5hYnMoeitHKSYmLjE+TWF0aC5hYnMoYyt2K0otMykpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7YT1NYXRoLlBJOwpjPShjKzEpLzI7dj0odisxKS8yO0o9KEorMSkvMjtlPShlK3IpLzQ7Zz0oZytFKS80O3o9KHorRykvNDtjPnYmJmM+Sj8uMDE+Yz8oRz0wLGU9RT0uNzA3MTA2NzgxKTooRz1NYXRoLnNxcnQoYyksRT1lL0csZT1nL0cpOnY+Sj8uMDE+dj8oRz0uNzA3MTA2NzgxLEU9MCxlPS43MDcxMDY3ODEpOihFPU1hdGguc3FydCh2KSxHPWUvRSxlPXovRSk6LjAxPko/KEU9Rz0uNzA3MTA2NzgxLGU9MCk6KGU9TWF0aC5zcXJ0KEopLEc9Zy9lLEU9ei9lKTt0aGlzLnNldChHLEUsZSxhKTtyZXR1cm4gdGhpc31hPU1hdGguc3FydCgoRy16KSooRy16KSsoZy1FKSooZy1FKSsoci1lKSooci1lKSk7LjAwMT5NYXRoLmFicyhhKSYmKGE9MSk7dGhpcy54PShHLXopL2E7dGhpcy55PShnLUUpL2E7dGhpcy56PShyLWUpL2E7dGhpcy53PU1hdGguYWNvcygoYyt2K0otMSkvMik7cmV0dXJuIHRoaXN9LG1pbjpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5taW4odGhpcy54LGEueCk7dGhpcy55PU1hdGgubWluKHRoaXMueSwKYS55KTt0aGlzLno9TWF0aC5taW4odGhpcy56LGEueik7dGhpcy53PU1hdGgubWluKHRoaXMudyxhLncpO3JldHVybiB0aGlzfSxtYXg6ZnVuY3Rpb24oYSl7dGhpcy54PU1hdGgubWF4KHRoaXMueCxhLngpO3RoaXMueT1NYXRoLm1heCh0aGlzLnksYS55KTt0aGlzLno9TWF0aC5tYXgodGhpcy56LGEueik7dGhpcy53PU1hdGgubWF4KHRoaXMudyxhLncpO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLngsTWF0aC5taW4oYy54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLnksTWF0aC5taW4oYy55LHRoaXMueSkpO3RoaXMuej1NYXRoLm1heChhLnosTWF0aC5taW4oYy56LHRoaXMueikpO3RoaXMudz1NYXRoLm1heChhLncsTWF0aC5taW4oYy53LHRoaXMudykpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEsTWF0aC5taW4oYywKdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGEsTWF0aC5taW4oYyx0aGlzLnopKTt0aGlzLnc9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMudykpO3JldHVybiB0aGlzfSxjbGFtcExlbmd0aDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKGV8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KGEsTWF0aC5taW4oYyxlKSkpfSxmbG9vcjpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmZsb29yKHRoaXMueCk7dGhpcy55PU1hdGguZmxvb3IodGhpcy55KTt0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopO3RoaXMudz1NYXRoLmZsb29yKHRoaXMudyk7cmV0dXJuIHRoaXN9LGNlaWw6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5jZWlsKHRoaXMueCk7dGhpcy55PU1hdGguY2VpbCh0aGlzLnkpO3RoaXMuej1NYXRoLmNlaWwodGhpcy56KTt0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyk7cmV0dXJuIHRoaXN9LHJvdW5kOmZ1bmN0aW9uKCl7dGhpcy54PQpNYXRoLnJvdW5kKHRoaXMueCk7dGhpcy55PU1hdGgucm91bmQodGhpcy55KTt0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopO3RoaXMudz1NYXRoLnJvdW5kKHRoaXMudyk7cmV0dXJuIHRoaXN9LHJvdW5kVG9aZXJvOmZ1bmN0aW9uKCl7dGhpcy54PTA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej0wPnRoaXMuej9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueik7dGhpcy53PTA+dGhpcy53P01hdGguY2VpbCh0aGlzLncpOk1hdGguZmxvb3IodGhpcy53KTtyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7dGhpcy56PS10aGlzLno7dGhpcy53PS10aGlzLnc7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueCt0aGlzLnkqYS55K3RoaXMueioKYS56K3RoaXMudyphLnd9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLnd9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9LG1hbmhhdHRhbkxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfSxub3JtYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9LHNldExlbmd0aDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihhKX0sbGVycDpmdW5jdGlvbihhLGMpe3RoaXMueCs9KGEueC10aGlzLngpKmM7dGhpcy55Kz0oYS55LXRoaXMueSkqYzt0aGlzLnorPShhLnotCnRoaXMueikqYzt0aGlzLncrPShhLnctdGhpcy53KSpjO3JldHVybiB0aGlzfSxsZXJwVmVjdG9yczpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyhjLGEpLm11bHRpcGx5U2NhbGFyKGUpLmFkZChhKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLng9PT10aGlzLngmJmEueT09PXRoaXMueSYmYS56PT09dGhpcy56JiZhLnc9PT10aGlzLnd9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMueD1hW2NdO3RoaXMueT1hW2MrMV07dGhpcy56PWFbYysyXTt0aGlzLnc9YVtjKzNdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO2FbY109dGhpcy54O2FbYysxXT10aGlzLnk7YVtjKzJdPXRoaXMuejthW2MrM109dGhpcy53O3JldHVybiBhfSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTsKdGhpcy54PWEuZ2V0WChjKTt0aGlzLnk9YS5nZXRZKGMpO3RoaXMuej1hLmdldFooYyk7dGhpcy53PWEuZ2V0VyhjKTtyZXR1cm4gdGhpc319KTttLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjptLGlzV2ViR0xSZW5kZXJUYXJnZXQ6ITAsc2V0U2l6ZTpmdW5jdGlvbihhLGMpe2lmKHRoaXMud2lkdGghPT1hfHx0aGlzLmhlaWdodCE9PWMpdGhpcy53aWR0aD1hLHRoaXMuaGVpZ2h0PWMsdGhpcy50ZXh0dXJlLmltYWdlLndpZHRoPWEsdGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodD1jLHRoaXMuZGlzcG9zZSgpO3RoaXMudmlld3BvcnQuc2V0KDAsMCxhLGMpO3RoaXMuc2Npc3Nvci5zZXQoMCwwLGEsYyl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMud2lkdGg9YS53aWR0aDt0aGlzLmhlaWdodD1hLmhlaWdodDt0aGlzLnZpZXdwb3J0LmNvcHkoYS52aWV3cG9ydCk7CnRoaXMudGV4dHVyZT1hLnRleHR1cmUuY2xvbmUoKTt0aGlzLmRlcHRoQnVmZmVyPWEuZGVwdGhCdWZmZXI7dGhpcy5zdGVuY2lsQnVmZmVyPWEuc3RlbmNpbEJ1ZmZlcjt0aGlzLmRlcHRoVGV4dHVyZT1hLmRlcHRoVGV4dHVyZTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTtuLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpuLGlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldDohMCxjb3B5OmZ1bmN0aW9uKGEpe20ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuc2FtcGxlcz1hLnNhbXBsZXM7cmV0dXJuIHRoaXN9fSk7dmFyIHFjPW5ldyBrLFFiPW5ldyBxLHhtPW5ldyBrKDAsMCwwKSx5bT1uZXcgaygxLDEsMSksRWQ9bmV3IGssZ2g9bmV3IGssZmM9bmV3IGs7T2JqZWN0LmFzc2lnbihxLnByb3RvdHlwZSx7aXNNYXRyaXg0OiEwLApzZXQ6ZnVuY3Rpb24oYSxjLGUsZyxyLHYseixFLEcsSixQLFIsUyxWLFcsaGEpe3ZhciBmYT10aGlzLmVsZW1lbnRzO2ZhWzBdPWE7ZmFbNF09YztmYVs4XT1lO2ZhWzEyXT1nO2ZhWzFdPXI7ZmFbNV09djtmYVs5XT16O2ZhWzEzXT1FO2ZhWzJdPUc7ZmFbNl09SjtmYVsxMF09UDtmYVsxNF09UjtmYVszXT1TO2ZhWzddPVY7ZmFbMTFdPVc7ZmFbMTVdPWhhO3JldHVybiB0aGlzfSxpZGVudGl0eTpmdW5jdGlvbigpe3RoaXMuc2V0KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgcSkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfSxjb3B5OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2NbMF09YVswXTtjWzFdPWFbMV07Y1syXT1hWzJdO2NbM109YVszXTtjWzRdPWFbNF07Y1s1XT1hWzVdO2NbNl09YVs2XTtjWzddPWFbN107Y1s4XT1hWzhdO2NbOV09YVs5XTtjWzEwXT0KYVsxMF07Y1sxMV09YVsxMV07Y1sxMl09YVsxMl07Y1sxM109YVsxM107Y1sxNF09YVsxNF07Y1sxNV09YVsxNV07cmV0dXJuIHRoaXN9LGNvcHlQb3NpdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2E9YS5lbGVtZW50cztjWzEyXT1hWzEyXTtjWzEzXT1hWzEzXTtjWzE0XT1hWzE0XTtyZXR1cm4gdGhpc30sZXh0cmFjdEJhc2lzOmZ1bmN0aW9uKGEsYyxlKXthLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywwKTtjLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywxKTtlLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywyKTtyZXR1cm4gdGhpc30sbWFrZUJhc2lzOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldChhLngsYy54LGUueCwwLGEueSxjLnksZS55LDAsYS56LGMueixlLnosMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sZXh0cmFjdFJvdGF0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHMsZT1hLmVsZW1lbnRzLGc9MS9xYy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsCjApLmxlbmd0aCgpLHI9MS9xYy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsMSkubGVuZ3RoKCk7YT0xL3FjLnNldEZyb21NYXRyaXhDb2x1bW4oYSwyKS5sZW5ndGgoKTtjWzBdPWVbMF0qZztjWzFdPWVbMV0qZztjWzJdPWVbMl0qZztjWzNdPTA7Y1s0XT1lWzRdKnI7Y1s1XT1lWzVdKnI7Y1s2XT1lWzZdKnI7Y1s3XT0wO2NbOF09ZVs4XSphO2NbOV09ZVs5XSphO2NbMTBdPWVbMTBdKmE7Y1sxMV09MDtjWzEyXT0wO2NbMTNdPTA7Y1sxNF09MDtjWzE1XT0xO3JldHVybiB0aGlzfSxtYWtlUm90YXRpb25Gcm9tRXVsZXI6ZnVuY3Rpb24oYSl7YSYmYS5pc0V1bGVyfHxjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYSBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3ZhciBjPXRoaXMuZWxlbWVudHMsZT1hLngsZz1hLnkscj1hLnosdj1NYXRoLmNvcyhlKTtlPU1hdGguc2luKGUpOwp2YXIgej1NYXRoLmNvcyhnKTtnPU1hdGguc2luKGcpO3ZhciBFPU1hdGguY29zKHIpO3I9TWF0aC5zaW4ocik7aWYoIlhZWiI9PT1hLm9yZGVyKXthPXYqRTt2YXIgRz12KnIsSj1lKkUsUD1lKnI7Y1swXT16KkU7Y1s0XT0teipyO2NbOF09ZztjWzFdPUcrSipnO2NbNV09YS1QKmc7Y1s5XT0tZSp6O2NbMl09UC1hKmc7Y1s2XT1KK0cqZztjWzEwXT12Knp9ZWxzZSJZWFoiPT09YS5vcmRlcj8oYT16KkUsRz16KnIsSj1nKkUsUD1nKnIsY1swXT1hK1AqZSxjWzRdPUoqZS1HLGNbOF09dipnLGNbMV09dipyLGNbNV09dipFLGNbOV09LWUsY1syXT1HKmUtSixjWzZdPVArYSplLGNbMTBdPXYqeik6IlpYWSI9PT1hLm9yZGVyPyhhPXoqRSxHPXoqcixKPWcqRSxQPWcqcixjWzBdPWEtUCplLGNbNF09LXYqcixjWzhdPUorRyplLGNbMV09RytKKmUsY1s1XT12KkUsY1s5XT1QLWEqZSxjWzJdPS12KmcsY1s2XT1lLGNbMTBdPXYqeik6IlpZWCI9PT1hLm9yZGVyPyhhPXYqRSxHPXYqcixKPWUqCkUsUD1lKnIsY1swXT16KkUsY1s0XT1KKmctRyxjWzhdPWEqZytQLGNbMV09eipyLGNbNV09UCpnK2EsY1s5XT1HKmctSixjWzJdPS1nLGNbNl09ZSp6LGNbMTBdPXYqeik6IllaWCI9PT1hLm9yZGVyPyhhPXYqeixHPXYqZyxKPWUqeixQPWUqZyxjWzBdPXoqRSxjWzRdPVAtYSpyLGNbOF09SipyK0csY1sxXT1yLGNbNV09dipFLGNbOV09LWUqRSxjWzJdPS1nKkUsY1s2XT1HKnIrSixjWzEwXT1hLVAqcik6IlhaWSI9PT1hLm9yZGVyJiYoYT12KnosRz12KmcsSj1lKnosUD1lKmcsY1swXT16KkUsY1s0XT0tcixjWzhdPWcqRSxjWzFdPWEqcitQLGNbNV09dipFLGNbOV09RypyLUosY1syXT1KKnItRyxjWzZdPWUqRSxjWzEwXT1QKnIrYSk7Y1szXT0wO2NbN109MDtjWzExXT0wO2NbMTJdPTA7Y1sxM109MDtjWzE0XT0wO2NbMTVdPTE7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvbXBvc2UoeG0sYSx5bSl9LGxvb2tBdDpmdW5jdGlvbihhLApjLGUpe3ZhciBnPXRoaXMuZWxlbWVudHM7ZmMuc3ViVmVjdG9ycyhhLGMpOzA9PT1mYy5sZW5ndGhTcSgpJiYoZmMuej0xKTtmYy5ub3JtYWxpemUoKTtFZC5jcm9zc1ZlY3RvcnMoZSxmYyk7MD09PUVkLmxlbmd0aFNxKCkmJigxPT09TWF0aC5hYnMoZS56KT9mYy54Kz0xRS00OmZjLnorPTFFLTQsZmMubm9ybWFsaXplKCksRWQuY3Jvc3NWZWN0b3JzKGUsZmMpKTtFZC5ub3JtYWxpemUoKTtnaC5jcm9zc1ZlY3RvcnMoZmMsRWQpO2dbMF09RWQueDtnWzRdPWdoLng7Z1s4XT1mYy54O2dbMV09RWQueTtnWzVdPWdoLnk7Z1s5XT1mYy55O2dbMl09RWQuejtnWzZdPWdoLno7Z1sxMF09ZmMuejtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdm9pZCAwIT09Yz8oY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4iKSwKdGhpcy5tdWx0aXBseU1hdHJpY2VzKGEsYykpOnRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLGEpfSxwcmVtdWx0aXBseTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKGEsdGhpcyl9LG11bHRpcGx5TWF0cmljZXM6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLmVsZW1lbnRzLGc9Yy5lbGVtZW50cztjPXRoaXMuZWxlbWVudHM7YT1lWzBdO3ZhciByPWVbNF0sdj1lWzhdLHo9ZVsxMl0sRT1lWzFdLEc9ZVs1XSxKPWVbOV0sUD1lWzEzXSxSPWVbMl0sUz1lWzZdLFY9ZVsxMF0sVz1lWzE0XSxoYT1lWzNdLGZhPWVbN10scmE9ZVsxMV07ZT1lWzE1XTt2YXIgcGE9Z1swXSxxYT1nWzRdLHVhPWdbOF0sb2E9Z1sxMl0sdGE9Z1sxXSxCYT1nWzVdLFRhPWdbOV0sVWE9Z1sxM10sQ2E9Z1syXSxIYT1nWzZdLERhPWdbMTBdLE1hPWdbMTRdLGRiPWdbM10sdGI9Z1s3XSxLYT1nWzExXTtnPWdbMTVdO2NbMF09YSpwYStyKnRhK3YqQ2EreipkYjtjWzRdPWEqcWErcipCYSt2KgpIYSt6KnRiO2NbOF09YSp1YStyKlRhK3YqRGEreipLYTtjWzEyXT1hKm9hK3IqVWErdipNYSt6Kmc7Y1sxXT1FKnBhK0cqdGErSipDYStQKmRiO2NbNV09RSpxYStHKkJhK0oqSGErUCp0YjtjWzldPUUqdWErRypUYStKKkRhK1AqS2E7Y1sxM109RSpvYStHKlVhK0oqTWErUCpnO2NbMl09UipwYStTKnRhK1YqQ2ErVypkYjtjWzZdPVIqcWErUypCYStWKkhhK1cqdGI7Y1sxMF09Uip1YStTKlRhK1YqRGErVypLYTtjWzE0XT1SKm9hK1MqVWErVipNYStXKmc7Y1szXT1oYSpwYStmYSp0YStyYSpDYStlKmRiO2NbN109aGEqcWErZmEqQmErcmEqSGErZSp0YjtjWzExXT1oYSp1YStmYSpUYStyYSpEYStlKkthO2NbMTVdPWhhKm9hK2ZhKlVhK3JhKk1hK2UqZztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50cztjWzBdKj1hO2NbNF0qPWE7Y1s4XSo9YTtjWzEyXSo9YTtjWzFdKj1hO2NbNV0qPWE7Y1s5XSo9YTtjWzEzXSo9YTtjWzJdKj0KYTtjWzZdKj1hO2NbMTBdKj1hO2NbMTRdKj1hO2NbM10qPWE7Y1s3XSo9YTtjWzExXSo9YTtjWzE1XSo9YTtyZXR1cm4gdGhpc30sYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MCxlPWEuY291bnQ7YzxlO2MrKylxYy54PWEuZ2V0WChjKSxxYy55PWEuZ2V0WShjKSxxYy56PWEuZ2V0WihjKSxxYy5hcHBseU1hdHJpeDQodGhpcyksYS5zZXRYWVooYyxxYy54LHFjLnkscWMueik7cmV0dXJuIGF9LGRldGVybWluYW50OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50cyxjPWFbMF0sZT1hWzRdLGc9YVs4XSxyPWFbMTJdLHY9YVsxXSx6PWFbNV0sRT1hWzldLEc9YVsxM10sSj1hWzJdLFA9YVs2XSxSPWFbMTBdLFM9YVsxNF07cmV0dXJuIGFbM10qKCtyKkUqUC1nKkcqUC1yKnoqUitlKkcqUitnKnoqUy1lKkUqUykrYVs3XSooK2MqRSpTLWMqRypSK3IqdipSLWcqdipTK2cqRypKLXIqRSpKKSthWzExXSooK2MqRypQLWMqeipTLXIqdipQK2UqdipTKwpyKnoqSi1lKkcqSikrYVsxNV0qKC1nKnoqSi1jKkUqUCtjKnoqUitnKnYqUC1lKnYqUitlKkUqSil9LHRyYW5zcG9zZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWxlbWVudHM7dmFyIGM9YVsxXTthWzFdPWFbNF07YVs0XT1jO2M9YVsyXTthWzJdPWFbOF07YVs4XT1jO2M9YVs2XTthWzZdPWFbOV07YVs5XT1jO2M9YVszXTthWzNdPWFbMTJdO2FbMTJdPWM7Yz1hWzddO2FbN109YVsxM107YVsxM109YztjPWFbMTFdO2FbMTFdPWFbMTRdO2FbMTRdPWM7cmV0dXJuIHRoaXN9LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLmVsZW1lbnRzO2EuaXNWZWN0b3IzPyhnWzEyXT1hLngsZ1sxM109YS55LGdbMTRdPWEueik6KGdbMTJdPWEsZ1sxM109YyxnWzE0XT1lKTtyZXR1cm4gdGhpc30sZ2V0SW52ZXJzZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZWxlbWVudHMsZz1hLmVsZW1lbnRzO2E9Z1swXTt2YXIgcj1nWzFdLHY9Z1syXSx6PWdbM10sRT1nWzRdLEc9Z1s1XSwKSj1nWzZdLFA9Z1s3XSxSPWdbOF0sUz1nWzldLFY9Z1sxMF0sVz1nWzExXSxoYT1nWzEyXSxmYT1nWzEzXSxyYT1nWzE0XTtnPWdbMTVdO3ZhciBwYT1TKnJhKlAtZmEqVipQK2ZhKkoqVy1HKnJhKlctUypKKmcrRypWKmcscWE9aGEqVipQLVIqcmEqUC1oYSpKKlcrRSpyYSpXK1IqSipnLUUqVipnLHVhPVIqZmEqUC1oYSpTKlAraGEqRypXLUUqZmEqVy1SKkcqZytFKlMqZyxvYT1oYSpTKkotUipmYSpKLWhhKkcqVitFKmZhKlYrUipHKnJhLUUqUypyYSx0YT1hKnBhK3IqcWErdip1YSt6Km9hO2lmKDA9PT10YSl7aWYoITA9PT1jKXRocm93IEVycm9yKCJUSFJFRS5NYXRyaXg0OiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO3JldHVybiB0aGlzLmlkZW50aXR5KCl9Yz0xL3RhO2VbMF09CnBhKmM7ZVsxXT0oZmEqVip6LVMqcmEqei1mYSp2KlcrcipyYSpXK1MqdipnLXIqVipnKSpjO2VbMl09KEcqcmEqei1mYSpKKnorZmEqdipQLXIqcmEqUC1HKnYqZytyKkoqZykqYztlWzNdPShTKkoqei1HKlYqei1TKnYqUCtyKlYqUCtHKnYqVy1yKkoqVykqYztlWzRdPXFhKmM7ZVs1XT0oUipyYSp6LWhhKlYqeitoYSp2KlctYSpyYSpXLVIqdipnK2EqVipnKSpjO2VbNl09KGhhKkoqei1FKnJhKnotaGEqdipQK2EqcmEqUCtFKnYqZy1hKkoqZykqYztlWzddPShFKlYqei1SKkoqeitSKnYqUC1hKlYqUC1FKnYqVythKkoqVykqYztlWzhdPXVhKmM7ZVs5XT0oaGEqUyp6LVIqZmEqei1oYSpyKlcrYSpmYSpXK1IqcipnLWEqUypnKSpjO2VbMTBdPShFKmZhKnotaGEqRyp6K2hhKnIqUC1hKmZhKlAtRSpyKmcrYSpHKmcpKmM7ZVsxMV09KFIqRyp6LUUqUyp6LVIqcipQK2EqUypQK0UqcipXLWEqRypXKSpjO2VbMTJdPW9hKmM7ZVsxM109KFIqZmEqdi1oYSpTKnYraGEqcipWLWEqZmEqVi0KUipyKnJhK2EqUypyYSkqYztlWzE0XT0oaGEqRyp2LUUqZmEqdi1oYSpyKkorYSpmYSpKK0UqcipyYS1hKkcqcmEpKmM7ZVsxNV09KEUqUyp2LVIqRyp2K1IqcipKLWEqUypKLUUqcipWK2EqRypWKSpjO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzLGU9YS54LGc9YS55O2E9YS56O2NbMF0qPWU7Y1s0XSo9ZztjWzhdKj1hO2NbMV0qPWU7Y1s1XSo9ZztjWzldKj1hO2NbMl0qPWU7Y1s2XSo9ZztjWzEwXSo9YTtjWzNdKj1lO2NbN10qPWc7Y1sxMV0qPWE7cmV0dXJuIHRoaXN9LGdldE1heFNjYWxlT25BeGlzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50cztyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGFbMF0qYVswXSthWzFdKmFbMV0rYVsyXSphWzJdLGFbNF0qYVs0XSthWzVdKmFbNV0rYVs2XSphWzZdLGFbOF0qYVs4XSthWzldKmFbOV0rYVsxMF0qYVsxMF0pKX0sbWFrZVRyYW5zbGF0aW9uOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldCgxLAowLDAsYSwwLDEsMCxjLDAsMCwxLGUsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvblg6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5jb3MoYSk7YT1NYXRoLnNpbihhKTt0aGlzLnNldCgxLDAsMCwwLDAsYywtYSwwLDAsYSxjLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvblk6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5jb3MoYSk7YT1NYXRoLnNpbihhKTt0aGlzLnNldChjLDAsYSwwLDAsMSwwLDAsLWEsMCxjLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvblo6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5jb3MoYSk7YT1NYXRoLnNpbihhKTt0aGlzLnNldChjLC1hLDAsMCxhLGMsMCwwLDAsMCwxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvbkF4aXM6ZnVuY3Rpb24oYSxjKXt2YXIgZT1NYXRoLmNvcyhjKTtjPU1hdGguc2luKGMpO3ZhciBnPTEtZSxyPWEueCx2PWEueTthPWEuejt2YXIgej1nKnIsRT1nKnY7dGhpcy5zZXQoeioKcitlLHoqdi1jKmEseiphK2MqdiwwLHoqditjKmEsRSp2K2UsRSphLWMqciwwLHoqYS1jKnYsRSphK2MqcixnKmEqYStlLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VTY2FsZTpmdW5jdGlvbihhLGMsZSl7dGhpcy5zZXQoYSwwLDAsMCwwLGMsMCwwLDAsMCxlLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VTaGVhcjpmdW5jdGlvbihhLGMsZSl7dGhpcy5zZXQoMSxjLGUsMCxhLDEsZSwwLGEsYywxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNvbXBvc2U6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuZWxlbWVudHMscj1jLl94LHY9Yy5feSx6PWMuX3osRT1jLl93LEc9cityLEo9dit2LFA9eit6O2M9cipHO3ZhciBSPXIqSjtyKj1QO3ZhciBTPXYqSjt2Kj1QO3oqPVA7Ryo9RTtKKj1FO0UqPVA7UD1lLng7dmFyIFY9ZS55O2U9ZS56O2dbMF09KDEtKFMreikpKlA7Z1sxXT0oUitFKSpQO2dbMl09KHItSikqUDtnWzNdPTA7Z1s0XT0oUi1FKSpWO2dbNV09KDEtKGMreikpKgpWO2dbNl09KHYrRykqVjtnWzddPTA7Z1s4XT0ocitKKSplO2dbOV09KHYtRykqZTtnWzEwXT0oMS0oYytTKSkqZTtnWzExXT0wO2dbMTJdPWEueDtnWzEzXT1hLnk7Z1sxNF09YS56O2dbMTVdPTE7cmV0dXJuIHRoaXN9LGRlY29tcG9zZTpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5lbGVtZW50cyxyPXFjLnNldChnWzBdLGdbMV0sZ1syXSkubGVuZ3RoKCksdj1xYy5zZXQoZ1s0XSxnWzVdLGdbNl0pLmxlbmd0aCgpLHo9cWMuc2V0KGdbOF0sZ1s5XSxnWzEwXSkubGVuZ3RoKCk7MD50aGlzLmRldGVybWluYW50KCkmJihyPS1yKTthLng9Z1sxMl07YS55PWdbMTNdO2Euej1nWzE0XTtRYi5jb3B5KHRoaXMpO2E9MS9yO2c9MS92O3ZhciBFPTEvejtRYi5lbGVtZW50c1swXSo9YTtRYi5lbGVtZW50c1sxXSo9YTtRYi5lbGVtZW50c1syXSo9YTtRYi5lbGVtZW50c1s0XSo9ZztRYi5lbGVtZW50c1s1XSo9ZztRYi5lbGVtZW50c1s2XSo9ZztRYi5lbGVtZW50c1s4XSo9RTtRYi5lbGVtZW50c1s5XSo9CkU7UWIuZWxlbWVudHNbMTBdKj1FO2Muc2V0RnJvbVJvdGF0aW9uTWF0cml4KFFiKTtlLng9cjtlLnk9djtlLno9ejtyZXR1cm4gdGhpc30sbWFrZVBlcnNwZWN0aXZlOmZ1bmN0aW9uKGEsYyxlLGcscix2KXt2b2lkIDA9PT12JiZjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4iKTt2YXIgej10aGlzLmVsZW1lbnRzO3pbMF09MipyLyhjLWEpO3pbNF09MDt6WzhdPShjK2EpLyhjLWEpO3pbMTJdPTA7elsxXT0wO3pbNV09MipyLyhlLWcpO3pbOV09KGUrZykvKGUtZyk7elsxM109MDt6WzJdPTA7els2XT0wO3pbMTBdPS0odityKS8odi1yKTt6WzE0XT0tMip2KnIvKHYtcik7elszXT0wO3pbN109MDt6WzExXT0tMTt6WzE1XT0wO3JldHVybiB0aGlzfSxtYWtlT3J0aG9ncmFwaGljOmZ1bmN0aW9uKGEsYyxlLGcscix2KXt2YXIgej0KdGhpcy5lbGVtZW50cyxFPTEvKGMtYSksRz0xLyhlLWcpLEo9MS8odi1yKTt6WzBdPTIqRTt6WzRdPTA7els4XT0wO3pbMTJdPS0oKGMrYSkqRSk7elsxXT0wO3pbNV09MipHO3pbOV09MDt6WzEzXT0tKChlK2cpKkcpO3pbMl09MDt6WzZdPTA7elsxMF09LTIqSjt6WzE0XT0tKCh2K3IpKkopO3pbM109MDt6WzddPTA7elsxMV09MDt6WzE1XT0xO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Zm9yKHZhciBlPTA7MTY+ZTtlKyspaWYoY1tlXSE9PWFbZV0pcmV0dXJuITE7cmV0dXJuITB9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO2Zvcih2YXIgZT0wOzE2PmU7ZSsrKXRoaXMuZWxlbWVudHNbZV09YVtlK2NdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO3ZhciBlPXRoaXMuZWxlbWVudHM7YVtjXT1lWzBdOwphW2MrMV09ZVsxXTthW2MrMl09ZVsyXTthW2MrM109ZVszXTthW2MrNF09ZVs0XTthW2MrNV09ZVs1XTthW2MrNl09ZVs2XTthW2MrN109ZVs3XTthW2MrOF09ZVs4XTthW2MrOV09ZVs5XTthW2MrMTBdPWVbMTBdO2FbYysxMV09ZVsxMV07YVtjKzEyXT1lWzEyXTthW2MrMTNdPWVbMTNdO2FbYysxNF09ZVsxNF07YVtjKzE1XT1lWzE1XTtyZXR1cm4gYX19KTt2YXIgY2s9bmV3IHEsZGs9bmV3IGg7dS5Sb3RhdGlvbk9yZGVycz0iWFlaIFlaWCBaWFkgWFpZIFlYWiBaWVgiLnNwbGl0KCIgIik7dS5EZWZhdWx0T3JkZXI9IlhZWiI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModS5wcm90b3R5cGUse3g6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl94fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5feD1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19LHk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl95fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5feT1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19LAp6OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fen0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3o9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSxvcmRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yZGVyfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5fb3JkZXI9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fX0pO09iamVjdC5hc3NpZ24odS5wcm90b3R5cGUse2lzRXVsZXI6ITAsc2V0OmZ1bmN0aW9uKGEsYyxlLGcpe3RoaXMuX3g9YTt0aGlzLl95PWM7dGhpcy5fej1lO3RoaXMuX29yZGVyPWd8fHRoaXMuX29yZGVyO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YS5feDt0aGlzLl95PWEuX3k7dGhpcy5fej1hLl96O3RoaXMuX29yZGVyPWEuX29yZGVyOwp0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbihhLGMsZSl7dmFyIGc9aGIuY2xhbXAscj1hLmVsZW1lbnRzO2E9clswXTt2YXIgdj1yWzRdLHo9cls4XSxFPXJbMV0sRz1yWzVdLEo9cls5XSxQPXJbMl0sUj1yWzZdO3I9clsxMF07Yz1jfHx0aGlzLl9vcmRlcjsiWFlaIj09PWM/KHRoaXMuX3k9TWF0aC5hc2luKGcoeiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoeik/KHRoaXMuX3g9TWF0aC5hdGFuMigtSixyKSx0aGlzLl96PU1hdGguYXRhbjIoLXYsYSkpOih0aGlzLl94PU1hdGguYXRhbjIoUixHKSx0aGlzLl96PTApKToiWVhaIj09PWM/KHRoaXMuX3g9TWF0aC5hc2luKC1nKEosLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKEopPyh0aGlzLl95PU1hdGguYXRhbjIoeixyKSx0aGlzLl96PU1hdGguYXRhbjIoRSxHKSk6KHRoaXMuX3k9TWF0aC5hdGFuMigtUCxhKSx0aGlzLl96PTApKToiWlhZIj09PWM/KHRoaXMuX3g9Ck1hdGguYXNpbihnKFIsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKFIpPyh0aGlzLl95PU1hdGguYXRhbjIoLVAsciksdGhpcy5fej1NYXRoLmF0YW4yKC12LEcpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihFLGEpKSk6IlpZWCI9PT1jPyh0aGlzLl95PU1hdGguYXNpbigtZyhQLC0xLDEpKSwuOTk5OTk5OT5NYXRoLmFicyhQKT8odGhpcy5feD1NYXRoLmF0YW4yKFIsciksdGhpcy5fej1NYXRoLmF0YW4yKEUsYSkpOih0aGlzLl94PTAsdGhpcy5fej1NYXRoLmF0YW4yKC12LEcpKSk6IllaWCI9PT1jPyh0aGlzLl96PU1hdGguYXNpbihnKEUsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKEUpPyh0aGlzLl94PU1hdGguYXRhbjIoLUosRyksdGhpcy5feT1NYXRoLmF0YW4yKC1QLGEpKToodGhpcy5feD0wLHRoaXMuX3k9TWF0aC5hdGFuMih6LHIpKSk6IlhaWSI9PT1jPyh0aGlzLl96PU1hdGguYXNpbigtZyh2LC0xLDEpKSwuOTk5OTk5OT5NYXRoLmFicyh2KT8odGhpcy5feD0KTWF0aC5hdGFuMihSLEcpLHRoaXMuX3k9TWF0aC5hdGFuMih6LGEpKToodGhpcy5feD1NYXRoLmF0YW4yKC1KLHIpLHRoaXMuX3k9MCkpOmNvbnNvbGUud2FybigiVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBnaXZlbiB1bnN1cHBvcnRlZCBvcmRlcjogIitjKTt0aGlzLl9vcmRlcj1jOyExIT09ZSYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tUXVhdGVybmlvbjpmdW5jdGlvbihhLGMsZSl7Y2subWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oYSk7cmV0dXJuIHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGNrLGMsZSl9LHNldEZyb21WZWN0b3IzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuc2V0KGEueCxhLnksYS56LGN8fHRoaXMuX29yZGVyKX0scmVvcmRlcjpmdW5jdGlvbihhKXtkay5zZXRGcm9tRXVsZXIodGhpcyk7cmV0dXJuIHRoaXMuc2V0RnJvbVF1YXRlcm5pb24oZGssYSl9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5feD09PQp0aGlzLl94JiZhLl95PT09dGhpcy5feSYmYS5fej09PXRoaXMuX3omJmEuX29yZGVyPT09dGhpcy5fb3JkZXJ9LGZyb21BcnJheTpmdW5jdGlvbihhKXt0aGlzLl94PWFbMF07dGhpcy5feT1hWzFdO3RoaXMuX3o9YVsyXTt2b2lkIDAhPT1hWzNdJiYodGhpcy5fb3JkZXI9YVszXSk7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO2FbY109dGhpcy5feDthW2MrMV09dGhpcy5feTthW2MrMl09dGhpcy5fejthW2MrM109dGhpcy5fb3JkZXI7cmV0dXJuIGF9LHRvVmVjdG9yMzpmdW5jdGlvbihhKXtyZXR1cm4gYT9hLnNldCh0aGlzLl94LHRoaXMuX3ksdGhpcy5feik6bmV3IGsodGhpcy5feCx0aGlzLl95LHRoaXMuX3opfSxfb25DaGFuZ2U6ZnVuY3Rpb24oYSl7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaz1hO3JldHVybiB0aGlzfSxfb25DaGFuZ2VDYWxsYmFjazpmdW5jdGlvbigpe319KTsKT2JqZWN0LmFzc2lnbih4LnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEpe3RoaXMubWFzaz0xPDxhfDB9LGVuYWJsZTpmdW5jdGlvbihhKXt0aGlzLm1hc2s9dGhpcy5tYXNrfDE8PGF8MH0sZW5hYmxlQWxsOmZ1bmN0aW9uKCl7dGhpcy5tYXNrPS0xfSx0b2dnbGU6ZnVuY3Rpb24oYSl7dGhpcy5tYXNrXj0xPDxhfDB9LGRpc2FibGU6ZnVuY3Rpb24oYSl7dGhpcy5tYXNrJj1+KDE8PGF8MCl9LGRpc2FibGVBbGw6ZnVuY3Rpb24oKXt0aGlzLm1hc2s9MH0sdGVzdDpmdW5jdGlvbihhKXtyZXR1cm4gMCE9PSh0aGlzLm1hc2smYS5tYXNrKX19KTt2YXIgT2s9MCxlaz1uZXcgayxmZj1uZXcgaCxqZD1uZXcgcSxoaD1uZXcgayxrZz1uZXcgayx6bT1uZXcgayxBbT1uZXcgaCxmaz1uZXcgaygxLDAsMCksZ2s9bmV3IGsoMCwxLDApLGhrPW5ldyBrKDAsMCwxKSxCbT17dHlwZToiYWRkZWQifSxDbT17dHlwZToicmVtb3ZlZCJ9O0EuRGVmYXVsdFVwPW5ldyBrKDAsMSwwKTtBLkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlPQohMDtBLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpBLGlzT2JqZWN0M0Q6ITAsb25CZWZvcmVSZW5kZXI6ZnVuY3Rpb24oKXt9LG9uQWZ0ZXJSZW5kZXI6ZnVuY3Rpb24oKXt9LGFwcGx5TWF0cml4OmZ1bmN0aW9uKGEpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKTt0aGlzLm1hdHJpeC5wcmVtdWx0aXBseShhKTt0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9LGFwcGx5UXVhdGVybmlvbjpmdW5jdGlvbihhKXt0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoYSk7cmV0dXJuIHRoaXN9LHNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZTpmdW5jdGlvbihhLGMpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKGEsYyl9LHNldFJvdGF0aW9uRnJvbUV1bGVyOmZ1bmN0aW9uKGEpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoYSwKITApfSxzZXRSb3RhdGlvbkZyb21NYXRyaXg6ZnVuY3Rpb24oYSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChhKX0sc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjpmdW5jdGlvbihhKXt0aGlzLnF1YXRlcm5pb24uY29weShhKX0scm90YXRlT25BeGlzOmZ1bmN0aW9uKGEsYyl7ZmYuc2V0RnJvbUF4aXNBbmdsZShhLGMpO3RoaXMucXVhdGVybmlvbi5tdWx0aXBseShmZik7cmV0dXJuIHRoaXN9LHJvdGF0ZU9uV29ybGRBeGlzOmZ1bmN0aW9uKGEsYyl7ZmYuc2V0RnJvbUF4aXNBbmdsZShhLGMpO3RoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShmZik7cmV0dXJuIHRoaXN9LHJvdGF0ZVg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGZrLGEpfSxyb3RhdGVZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhnayxhKX0scm90YXRlWjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoaGssYSl9LHRyYW5zbGF0ZU9uQXhpczpmdW5jdGlvbihhLApjKXtlay5jb3B5KGEpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pO3RoaXMucG9zaXRpb24uYWRkKGVrLm11bHRpcGx5U2NhbGFyKGMpKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlWDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoZmssYSl9LHRyYW5zbGF0ZVk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGdrLGEpfSx0cmFuc2xhdGVaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhoayxhKX0sbG9jYWxUb1dvcmxkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKX0sd29ybGRUb0xvY2FsOmZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGx5TWF0cml4NChqZC5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpKX0sbG9va0F0OmZ1bmN0aW9uKGEsYyxlKXthLmlzVmVjdG9yMz9oaC5jb3B5KGEpOmhoLnNldChhLGMsZSk7YT10aGlzLnBhcmVudDt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLAohMSk7a2cuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO3RoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD9qZC5sb29rQXQoa2csaGgsdGhpcy51cCk6amQubG9va0F0KGhoLGtnLHRoaXMudXApO3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoamQpO2EmJihqZC5leHRyYWN0Um90YXRpb24oYS5tYXRyaXhXb3JsZCksZmYuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGpkKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoZmYuaW52ZXJzZSgpKSl9LGFkZDpmdW5jdGlvbihhKXtpZigxPGFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspdGhpcy5hZGQoYXJndW1lbnRzW2NdKTtyZXR1cm4gdGhpc31pZihhPT09dGhpcylyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIixhKSx0aGlzO2EmJmEuaXNPYmplY3QzRD8KKG51bGwhPT1hLnBhcmVudCYmYS5wYXJlbnQucmVtb3ZlKGEpLGEucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKGEpLGEuZGlzcGF0Y2hFdmVudChCbSkpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLGEpO3JldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oYSl7aWYoMTxhcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tjXSk7cmV0dXJuIHRoaXN9Yz10aGlzLmNoaWxkcmVuLmluZGV4T2YoYSk7LTEhPT1jJiYoYS5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuLnNwbGljZShjLDEpLGEuZGlzcGF0Y2hFdmVudChDbSkpO3JldHVybiB0aGlzfSxhdHRhY2g6ZnVuY3Rpb24oYSl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7amQuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKTtudWxsIT09CmEucGFyZW50JiYoYS5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGpkLm11bHRpcGx5KGEucGFyZW50Lm1hdHJpeFdvcmxkKSk7YS5hcHBseU1hdHJpeChqZCk7YS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7dGhpcy5hZGQoYSk7cmV0dXJuIHRoaXN9LGdldE9iamVjdEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgiaWQiLGEpfSxnZXRPYmplY3RCeU5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsYSl9LGdldE9iamVjdEJ5UHJvcGVydHk6ZnVuY3Rpb24oYSxjKXtpZih0aGlzW2FdPT09YylyZXR1cm4gdGhpcztmb3IodmFyIGU9MCxnPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO2U8ZztlKyspe3ZhciByPXRoaXMuY2hpbGRyZW5bZV0uZ2V0T2JqZWN0QnlQcm9wZXJ0eShhLGMpO2lmKHZvaWQgMCE9PXIpcmV0dXJuIHJ9fSxnZXRXb3JsZFBvc2l0aW9uOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUG9zaXRpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7cmV0dXJuIGEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfSxnZXRXb3JsZFF1YXRlcm5pb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFF1YXRlcm5pb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgaCk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2Uoa2csYSx6bSk7cmV0dXJuIGF9LGdldFdvcmxkU2NhbGU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFNjYWxlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApOwp0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShrZyxBbSxhKTtyZXR1cm4gYX0sZ2V0V29ybGREaXJlY3Rpb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZERpcmVjdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt2YXIgYz10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiBhLnNldChjWzhdLGNbOV0sY1sxMF0pLm5vcm1hbGl6ZSgpfSxyYXljYXN0OmZ1bmN0aW9uKCl7fSx0cmF2ZXJzZTpmdW5jdGlvbihhKXthKHRoaXMpO2Zvcih2YXIgYz10aGlzLmNoaWxkcmVuLGU9MCxnPWMubGVuZ3RoO2U8ZztlKyspY1tlXS50cmF2ZXJzZShhKX0sdHJhdmVyc2VWaXNpYmxlOmZ1bmN0aW9uKGEpe2lmKCExIT09dGhpcy52aXNpYmxlKXthKHRoaXMpO2Zvcih2YXIgYz10aGlzLmNoaWxkcmVuLGU9MCxnPWMubGVuZ3RoO2U8ZztlKyspY1tlXS50cmF2ZXJzZVZpc2libGUoYSl9fSwKdHJhdmVyc2VBbmNlc3RvcnM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5wYXJlbnQ7bnVsbCE9PWMmJihhKGMpLGMudHJhdmVyc2VBbmNlc3RvcnMoYSkpfSx1cGRhdGVNYXRyaXg6ZnVuY3Rpb24oKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpO3RoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH0sdXBkYXRlTWF0cml4V29ybGQ6ZnVuY3Rpb24oYSl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpO2lmKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8YSludWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSxhPSEwO2Zvcih2YXIgYz10aGlzLmNoaWxkcmVuLGU9CjAsZz1jLmxlbmd0aDtlPGc7ZSsrKWNbZV0udXBkYXRlTWF0cml4V29ybGQoYSl9LHVwZGF0ZVdvcmxkTWF0cml4OmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5wYXJlbnQ7ITA9PT1hJiZudWxsIT09ZSYmZS51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpO251bGw9PT10aGlzLnBhcmVudD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCk7aWYoITA9PT1jKWZvcihhPXRoaXMuY2hpbGRyZW4sYz0wLGU9YS5sZW5ndGg7YzxlO2MrKylhW2NdLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX0sdG9KU09OOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoUCxSKXt2b2lkIDA9PT1QW1IudXVpZF0mJihQW1IudXVpZF09Ui50b0pTT04oYSkpO3JldHVybiBSLnV1aWR9ZnVuY3Rpb24gZShQKXt2YXIgUj0KW10sUztmb3IoUyBpbiBQKXt2YXIgVj1QW1NdO2RlbGV0ZSBWLm1ldGFkYXRhO1IucHVzaChWKX1yZXR1cm4gUn12YXIgZz12b2lkIDA9PT1hfHwic3RyaW5nIj09PXR5cGVvZiBhLHI9e307ZyYmKGE9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e319LHIubWV0YWRhdGE9e3ZlcnNpb246NC41LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7dmFyIHY9e307di51dWlkPXRoaXMudXVpZDt2LnR5cGU9dGhpcy50eXBlOyIiIT09dGhpcy5uYW1lJiYodi5uYW1lPXRoaXMubmFtZSk7ITA9PT10aGlzLmNhc3RTaGFkb3cmJih2LmNhc3RTaGFkb3c9ITApOyEwPT09dGhpcy5yZWNlaXZlU2hhZG93JiYodi5yZWNlaXZlU2hhZG93PSEwKTshMT09PXRoaXMudmlzaWJsZSYmKHYudmlzaWJsZT0hMSk7ITE9PT10aGlzLmZydXN0dW1DdWxsZWQmJih2LmZydXN0dW1DdWxsZWQ9ITEpOzAhPT10aGlzLnJlbmRlck9yZGVyJiYKKHYucmVuZGVyT3JkZXI9dGhpcy5yZW5kZXJPcmRlcik7Int9IiE9PUpTT04uc3RyaW5naWZ5KHRoaXMudXNlckRhdGEpJiYodi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTt2LmxheWVycz10aGlzLmxheWVycy5tYXNrO3YubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKTshMT09PXRoaXMubWF0cml4QXV0b1VwZGF0ZSYmKHYubWF0cml4QXV0b1VwZGF0ZT0hMSk7dGhpcy5pc01lc2gmJjAhPT10aGlzLmRyYXdNb2RlJiYodi5kcmF3TW9kZT10aGlzLmRyYXdNb2RlKTtpZih0aGlzLmlzTWVzaHx8dGhpcy5pc0xpbmV8fHRoaXMuaXNQb2ludHMpe3YuZ2VvbWV0cnk9YyhhLmdlb21ldHJpZXMsdGhpcy5nZW9tZXRyeSk7dmFyIHo9dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKHZvaWQgMCE9PXomJnZvaWQgMCE9PXouc2hhcGVzKWlmKHo9ei5zaGFwZXMsQXJyYXkuaXNBcnJheSh6KSlmb3IodmFyIEU9MCxHPXoubGVuZ3RoO0U8RztFKyspYyhhLnNoYXBlcyx6W0VdKTtlbHNlIGMoYS5zaGFwZXMsCnopfWlmKHZvaWQgMCE9PXRoaXMubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7ej1bXTtFPTA7Zm9yKEc9dGhpcy5tYXRlcmlhbC5sZW5ndGg7RTxHO0UrKyl6LnB1c2goYyhhLm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsW0VdKSk7di5tYXRlcmlhbD16fWVsc2Ugdi5tYXRlcmlhbD1jKGEubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWwpO2lmKDA8dGhpcy5jaGlsZHJlbi5sZW5ndGgpZm9yKHYuY2hpbGRyZW49W10sRT0wO0U8dGhpcy5jaGlsZHJlbi5sZW5ndGg7RSsrKXYuY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW0VdLnRvSlNPTihhKS5vYmplY3QpO2lmKGcpe2c9ZShhLmdlb21ldHJpZXMpO0U9ZShhLm1hdGVyaWFscyk7Rz1lKGEudGV4dHVyZXMpO3ZhciBKPWUoYS5pbWFnZXMpO3o9ZShhLnNoYXBlcyk7MDxnLmxlbmd0aCYmKHIuZ2VvbWV0cmllcz1nKTswPEUubGVuZ3RoJiYoci5tYXRlcmlhbHM9RSk7MDxHLmxlbmd0aCYmKHIudGV4dHVyZXM9Ryk7CjA8Si5sZW5ndGgmJihyLmltYWdlcz1KKTswPHoubGVuZ3RoJiYoci5zaGFwZXM9eil9ci5vYmplY3Q9djtyZXR1cm4gcn0sY2xvbmU6ZnVuY3Rpb24oYSl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMsYSl9LGNvcHk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0hMCk7dGhpcy5uYW1lPWEubmFtZTt0aGlzLnVwLmNvcHkoYS51cCk7dGhpcy5wb3NpdGlvbi5jb3B5KGEucG9zaXRpb24pO3RoaXMucXVhdGVybmlvbi5jb3B5KGEucXVhdGVybmlvbik7dGhpcy5zY2FsZS5jb3B5KGEuc2NhbGUpO3RoaXMubWF0cml4LmNvcHkoYS5tYXRyaXgpO3RoaXMubWF0cml4V29ybGQuY29weShhLm1hdHJpeFdvcmxkKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9YS5tYXRyaXhBdXRvVXBkYXRlO3RoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT1hLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU7dGhpcy5sYXllcnMubWFzaz1hLmxheWVycy5tYXNrO3RoaXMudmlzaWJsZT1hLnZpc2libGU7CnRoaXMuY2FzdFNoYWRvdz1hLmNhc3RTaGFkb3c7dGhpcy5yZWNlaXZlU2hhZG93PWEucmVjZWl2ZVNoYWRvdzt0aGlzLmZydXN0dW1DdWxsZWQ9YS5mcnVzdHVtQ3VsbGVkO3RoaXMucmVuZGVyT3JkZXI9YS5yZW5kZXJPcmRlcjt0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYS51c2VyRGF0YSkpO2lmKCEwPT09Yylmb3IoYz0wO2M8YS5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuYWRkKGEuY2hpbGRyZW5bY10uY2xvbmUoKSk7cmV0dXJuIHRoaXN9fSk7eS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6eSxpc1NjZW5lOiEwLGNvcHk6ZnVuY3Rpb24oYSxjKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhLGMpO251bGwhPT1hLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQ9YS5iYWNrZ3JvdW5kLmNsb25lKCkpO251bGwhPT1hLmZvZyYmKHRoaXMuZm9nPWEuZm9nLmNsb25lKCkpOwpudWxsIT09YS5vdmVycmlkZU1hdGVyaWFsJiYodGhpcy5vdmVycmlkZU1hdGVyaWFsPWEub3ZlcnJpZGVNYXRlcmlhbC5jbG9uZSgpKTt0aGlzLmF1dG9VcGRhdGU9YS5hdXRvVXBkYXRlO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGU7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXt2YXIgYz1BLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO251bGwhPT10aGlzLmJhY2tncm91bmQmJihjLm9iamVjdC5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oYSkpO251bGwhPT10aGlzLmZvZyYmKGMub2JqZWN0LmZvZz10aGlzLmZvZy50b0pTT04oKSk7cmV0dXJuIGN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7dmFyIGtkPVtuZXcgayxuZXcgayxuZXcgayxuZXcgayxuZXcgayxuZXcgayxuZXcgayxuZXcga10sV2M9bmV3IGssZ2Y9bmV3IGssaGY9bmV3IGssamY9bmV3IGssCkZkPW5ldyBrLEdkPW5ldyBrLGZlPW5ldyBrLGxnPW5ldyBrLGloPW5ldyBrLGpoPW5ldyBrLEtkPW5ldyBrO09iamVjdC5hc3NpZ24ody5wcm90b3R5cGUse2lzQm94MzohMCxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLm1pbi5jb3B5KGEpO3RoaXMubWF4LmNvcHkoYyk7cmV0dXJuIHRoaXN9LHNldEZyb21BcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9SW5maW5pdHksZT1JbmZpbml0eSxnPUluZmluaXR5LHI9LUluZmluaXR5LHY9LUluZmluaXR5LHo9LUluZmluaXR5LEU9MCxHPWEubGVuZ3RoO0U8RztFKz0zKXt2YXIgSj1hW0VdLFA9YVtFKzFdLFI9YVtFKzJdO0o8YyYmKGM9Sik7UDxlJiYoZT1QKTtSPGcmJihnPVIpO0o+ciYmKHI9Sik7UD52JiYodj1QKTtSPnomJih6PVIpfXRoaXMubWluLnNldChjLGUsZyk7dGhpcy5tYXguc2V0KHIsdix6KTtyZXR1cm4gdGhpc30sc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9SW5maW5pdHksZT1JbmZpbml0eSwKZz1JbmZpbml0eSxyPS1JbmZpbml0eSx2PS1JbmZpbml0eSx6PS1JbmZpbml0eSxFPTAsRz1hLmNvdW50O0U8RztFKyspe3ZhciBKPWEuZ2V0WChFKSxQPWEuZ2V0WShFKSxSPWEuZ2V0WihFKTtKPGMmJihjPUopO1A8ZSYmKGU9UCk7UjxnJiYoZz1SKTtKPnImJihyPUopO1A+diYmKHY9UCk7Uj56JiYoej1SKX10aGlzLm1pbi5zZXQoYyxlLGcpO3RoaXMubWF4LnNldChyLHYseik7cmV0dXJuIHRoaXN9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSl7dGhpcy5tYWtlRW1wdHkoKTtmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2M8ZTtjKyspdGhpcy5leHBhbmRCeVBvaW50KGFbY10pO3JldHVybiB0aGlzfSxzZXRGcm9tQ2VudGVyQW5kU2l6ZTpmdW5jdGlvbihhLGMpe2M9V2MuY29weShjKS5tdWx0aXBseVNjYWxhciguNSk7dGhpcy5taW4uY29weShhKS5zdWIoYyk7dGhpcy5tYXguY29weShhKS5hZGQoYyk7cmV0dXJuIHRoaXN9LHNldEZyb21PYmplY3Q6ZnVuY3Rpb24oYSl7dGhpcy5tYWtlRW1wdHkoKTsKcmV0dXJuIHRoaXMuZXhwYW5kQnlPYmplY3QoYSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubWluLmNvcHkoYS5taW4pO3RoaXMubWF4LmNvcHkoYS5tYXgpO3JldHVybiB0aGlzfSxtYWtlRW1wdHk6ZnVuY3Rpb24oKXt0aGlzLm1pbi54PXRoaXMubWluLnk9dGhpcy5taW4uej1JbmZpbml0eTt0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tSW5maW5pdHk7cmV0dXJuIHRoaXN9LGlzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl8fHRoaXMubWF4Lno8dGhpcy5taW4uen0sZ2V0Q2VudGVyOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPwphLnNldCgwLDAsMCk6YS5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9LGdldFNpemU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmdldFNpemUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Euc2V0KDAsMCwwKTphLnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfSxleHBhbmRCeVBvaW50OmZ1bmN0aW9uKGEpe3RoaXMubWluLm1pbihhKTt0aGlzLm1heC5tYXgoYSk7cmV0dXJuIHRoaXN9LGV4cGFuZEJ5VmVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMubWluLnN1YihhKTt0aGlzLm1heC5hZGQoYSk7cmV0dXJuIHRoaXN9LGV4cGFuZEJ5U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMubWluLmFkZFNjYWxhcigtYSk7dGhpcy5tYXguYWRkU2NhbGFyKGEpO3JldHVybiB0aGlzfSxleHBhbmRCeU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYzthLnVwZGF0ZVdvcmxkTWF0cml4KCExLAohMSk7dmFyIGU9YS5nZW9tZXRyeTtpZih2b2lkIDAhPT1lKWlmKGUuaXNHZW9tZXRyeSl7dmFyIGc9ZS52ZXJ0aWNlcztlPTA7Zm9yKGM9Zy5sZW5ndGg7ZTxjO2UrKylXYy5jb3B5KGdbZV0pLFdjLmFwcGx5TWF0cml4NChhLm1hdHJpeFdvcmxkKSx0aGlzLmV4cGFuZEJ5UG9pbnQoV2MpfWVsc2UgaWYoZS5pc0J1ZmZlckdlb21ldHJ5JiYoZz1lLmF0dHJpYnV0ZXMucG9zaXRpb24sdm9pZCAwIT09ZykpZm9yKGU9MCxjPWcuY291bnQ7ZTxjO2UrKylXYy5mcm9tQnVmZmVyQXR0cmlidXRlKGcsZSkuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChXYyk7YT1hLmNoaWxkcmVuO2U9MDtmb3IoYz1hLmxlbmd0aDtlPGM7ZSsrKXRoaXMuZXhwYW5kQnlPYmplY3QoYVtlXSk7cmV0dXJuIHRoaXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueDx0aGlzLm1pbi54fHxhLng+dGhpcy5tYXgueHx8YS55PHRoaXMubWluLnl8fGEueT50aGlzLm1heC55fHwKYS56PHRoaXMubWluLnp8fGEuej50aGlzLm1heC56PyExOiEwfSxjb250YWluc0JveDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5taW4ueDw9YS5taW4ueCYmYS5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9YS5taW4ueSYmYS5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9YS5taW4ueiYmYS5tYXguejw9dGhpcy5tYXguen0sZ2V0UGFyYW1ldGVyOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtyZXR1cm4gYy5zZXQoKGEueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwoYS55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLChhLnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLm1heC54PHRoaXMubWluLnh8fAphLm1pbi54PnRoaXMubWF4Lnh8fGEubWF4Lnk8dGhpcy5taW4ueXx8YS5taW4ueT50aGlzLm1heC55fHxhLm1heC56PHRoaXMubWluLnp8fGEubWluLno+dGhpcy5tYXguej8hMTohMH0saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXt0aGlzLmNsYW1wUG9pbnQoYS5jZW50ZXIsV2MpO3JldHVybiBXYy5kaXN0YW5jZVRvU3F1YXJlZChhLmNlbnRlcik8PWEucmFkaXVzKmEucmFkaXVzfSxpbnRlcnNlY3RzUGxhbmU6ZnVuY3Rpb24oYSl7aWYoMDxhLm5vcm1hbC54KXt2YXIgYz1hLm5vcm1hbC54KnRoaXMubWluLng7dmFyIGU9YS5ub3JtYWwueCp0aGlzLm1heC54fWVsc2UgYz1hLm5vcm1hbC54KnRoaXMubWF4LngsZT1hLm5vcm1hbC54KnRoaXMubWluLng7MDxhLm5vcm1hbC55PyhjKz1hLm5vcm1hbC55KnRoaXMubWluLnksZSs9YS5ub3JtYWwueSp0aGlzLm1heC55KTooYys9YS5ub3JtYWwueSp0aGlzLm1heC55LGUrPWEubm9ybWFsLnkqdGhpcy5taW4ueSk7MDxhLm5vcm1hbC56PwooYys9YS5ub3JtYWwueip0aGlzLm1pbi56LGUrPWEubm9ybWFsLnoqdGhpcy5tYXgueik6KGMrPWEubm9ybWFsLnoqdGhpcy5tYXgueixlKz1hLm5vcm1hbC56KnRoaXMubWluLnopO3JldHVybiBjPD0tYS5jb25zdGFudCYmZT49LWEuY29uc3RhbnR9LGludGVyc2VjdHNUcmlhbmdsZTpmdW5jdGlvbihhKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4hMTt0aGlzLmdldENlbnRlcihsZyk7aWguc3ViVmVjdG9ycyh0aGlzLm1heCxsZyk7Z2Yuc3ViVmVjdG9ycyhhLmEsbGcpO2hmLnN1YlZlY3RvcnMoYS5iLGxnKTtqZi5zdWJWZWN0b3JzKGEuYyxsZyk7RmQuc3ViVmVjdG9ycyhoZixnZik7R2Quc3ViVmVjdG9ycyhqZixoZik7ZmUuc3ViVmVjdG9ycyhnZixqZik7YT1bMCwtRmQueixGZC55LDAsLUdkLnosR2QueSwwLC1mZS56LGZlLnksRmQueiwwLC1GZC54LEdkLnosMCwtR2QueCxmZS56LDAsLWZlLngsLUZkLnksRmQueCwwLC1HZC55LEdkLngsMCwtZmUueSxmZS54LDBdO2lmKCFDKGEsCmdmLGhmLGpmLGloKSlyZXR1cm4hMTthPVsxLDAsMCwwLDEsMCwwLDAsMV07aWYoIUMoYSxnZixoZixqZixpaCkpcmV0dXJuITE7amguY3Jvc3NWZWN0b3JzKEZkLEdkKTthPVtqaC54LGpoLnksamguel07cmV0dXJuIEMoYSxnZixoZixqZixpaCl9LGNsYW1wUG9pbnQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtyZXR1cm4gYy5jb3B5KGEpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KX0sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBXYy5jb3B5KGEpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KS5zdWIoYSkubGVuZ3RoKCl9LGdldEJvdW5kaW5nU3BoZXJlOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkJveDM6IC5nZXRCb3VuZGluZ1NwaGVyZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKTt0aGlzLmdldENlbnRlcihhLmNlbnRlcik7CmEucmFkaXVzPS41KnRoaXMuZ2V0U2l6ZShXYykubGVuZ3RoKCk7cmV0dXJuIGF9LGludGVyc2VjdDpmdW5jdGlvbihhKXt0aGlzLm1pbi5tYXgoYS5taW4pO3RoaXMubWF4Lm1pbihhLm1heCk7dGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCk7cmV0dXJuIHRoaXN9LHVuaW9uOmZ1bmN0aW9uKGEpe3RoaXMubWluLm1pbihhLm1pbik7dGhpcy5tYXgubWF4KGEubWF4KTtyZXR1cm4gdGhpc30sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzO2tkWzBdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO2tkWzFdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpO2tkWzJdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO2tkWzNdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpOwprZFs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChhKTtrZFs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChhKTtrZFs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChhKTtrZFs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChhKTt0aGlzLnNldEZyb21Qb2ludHMoa2QpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLm1pbi5lcXVhbHModGhpcy5taW4pJiZhLm1heC5lcXVhbHModGhpcy5tYXgpfX0pO3ZhciBEbT1uZXcgdztPYmplY3QuYXNzaWduKEYucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLmNlbnRlci5jb3B5KGEpO3RoaXMucmFkaXVzPQpjO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5jZW50ZXI7dm9pZCAwIT09Yz9lLmNvcHkoYyk6RG0uc2V0RnJvbVBvaW50cyhhKS5nZXRDZW50ZXIoZSk7Zm9yKHZhciBnPWM9MCxyPWEubGVuZ3RoO2c8cjtnKyspYz1NYXRoLm1heChjLGUuZGlzdGFuY2VUb1NxdWFyZWQoYVtnXSkpO3RoaXMucmFkaXVzPU1hdGguc3FydChjKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5jZW50ZXIuY29weShhLmNlbnRlcik7dGhpcy5yYWRpdXM9YS5yYWRpdXM7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIDA+PXRoaXMucmFkaXVzfSxjb250YWluc1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXN9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS0KdGhpcy5yYWRpdXN9LGludGVyc2VjdHNTcGhlcmU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5yYWRpdXMrYS5yYWRpdXM7cmV0dXJuIGEuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9YypjfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLmludGVyc2VjdHNTcGhlcmUodGhpcyl9LGludGVyc2VjdHNQbGFuZTpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5hYnMoYS5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKTw9dGhpcy5yYWRpdXN9LGNsYW1wUG9pbnQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZChhKTt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5TcGhlcmU6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO2MuY29weShhKTtlPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzJiYoYy5zdWIodGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLGMubXVsdGlwbHlTY2FsYXIodGhpcy5yYWRpdXMpLmFkZCh0aGlzLmNlbnRlcikpOwpyZXR1cm4gY30sZ2V0Qm91bmRpbmdCb3g6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuU3BoZXJlOiAuZ2V0Qm91bmRpbmdCb3goKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgdyk7YS5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpO2EuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpO3JldHVybiBhfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7dGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KGEpO3RoaXMucmFkaXVzKj1hLmdldE1heFNjYWxlT25BeGlzKCk7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihhKXt0aGlzLmNlbnRlci5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmYS5yYWRpdXM9PT10aGlzLnJhZGl1c319KTt2YXIgbGQ9bmV3IGsseWk9bmV3IGssa2g9bmV3IGssSGQ9bmV3IGssemk9bmV3IGssbGg9bmV3IGssQWk9bmV3IGs7Ck9iamVjdC5hc3NpZ24oRC5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMub3JpZ2luLmNvcHkoYSk7dGhpcy5kaXJlY3Rpb24uY29weShjKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5vcmlnaW4uY29weShhLm9yaWdpbik7dGhpcy5kaXJlY3Rpb24uY29weShhLmRpcmVjdGlvbik7cmV0dXJuIHRoaXN9LGF0OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7cmV0dXJuIGMuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMub3JpZ2luKX0sbG9va0F0OmZ1bmN0aW9uKGEpe3RoaXMuZGlyZWN0aW9uLmNvcHkoYSkuc3ViKHRoaXMub3JpZ2luKS5ub3JtYWxpemUoKTtyZXR1cm4gdGhpc30scmVjYXN0OmZ1bmN0aW9uKGEpe3RoaXMub3JpZ2luLmNvcHkodGhpcy5hdChhLApsZCkpO3JldHVybiB0aGlzfSxjbG9zZXN0UG9pbnRUb1BvaW50OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtjLnN1YlZlY3RvcnMoYSx0aGlzLm9yaWdpbik7YT1jLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIDA+YT9jLmNvcHkodGhpcy5vcmlnaW4pOmMuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMub3JpZ2luKX0sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludChhKSl9LGRpc3RhbmNlU3FUb1BvaW50OmZ1bmN0aW9uKGEpe3ZhciBjPWxkLnN1YlZlY3RvcnMoYSx0aGlzLm9yaWdpbikuZG90KHRoaXMuZGlyZWN0aW9uKTtpZigwPmMpcmV0dXJuIHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKGEpO2xkLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKGMpLmFkZCh0aGlzLm9yaWdpbik7CnJldHVybiBsZC5kaXN0YW5jZVRvU3F1YXJlZChhKX0sZGlzdGFuY2VTcVRvU2VnbWVudDpmdW5jdGlvbihhLGMsZSxnKXt5aS5jb3B5KGEpLmFkZChjKS5tdWx0aXBseVNjYWxhciguNSk7a2guY29weShjKS5zdWIoYSkubm9ybWFsaXplKCk7SGQuY29weSh0aGlzLm9yaWdpbikuc3ViKHlpKTt2YXIgcj0uNSphLmRpc3RhbmNlVG8oYyksdj0tdGhpcy5kaXJlY3Rpb24uZG90KGtoKSx6PUhkLmRvdCh0aGlzLmRpcmVjdGlvbiksRT0tSGQuZG90KGtoKSxHPUhkLmxlbmd0aFNxKCksSj1NYXRoLmFicygxLXYqdik7aWYoMDxKKXthPXYqRS16O2M9dip6LUU7dmFyIFA9cipKOzA8PWE/Yz49LVA/Yzw9UD8ocj0xL0osYSo9cixjKj1yLHY9YSooYSt2KmMrMip6KStjKih2KmErYysyKkUpK0cpOihjPXIsYT1NYXRoLm1heCgwLC0odipjK3opKSx2PS1hKmErYyooYysyKkUpK0cpOihjPS1yLGE9TWF0aC5tYXgoMCwtKHYqYyt6KSksdj0tYSphK2MqKGMrMipFKStHKTpjPD0tUD8oYT1NYXRoLm1heCgwLAotKC12KnIreikpLGM9MDxhPy1yOk1hdGgubWluKE1hdGgubWF4KC1yLC1FKSxyKSx2PS1hKmErYyooYysyKkUpK0cpOmM8PVA/KGE9MCxjPU1hdGgubWluKE1hdGgubWF4KC1yLC1FKSxyKSx2PWMqKGMrMipFKStHKTooYT1NYXRoLm1heCgwLC0odipyK3opKSxjPTA8YT9yOk1hdGgubWluKE1hdGgubWF4KC1yLC1FKSxyKSx2PS1hKmErYyooYysyKkUpK0cpfWVsc2UgYz0wPHY/LXI6cixhPU1hdGgubWF4KDAsLSh2KmMreikpLHY9LWEqYStjKihjKzIqRSkrRztlJiZlLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLm9yaWdpbik7ZyYmZy5jb3B5KGtoKS5tdWx0aXBseVNjYWxhcihjKS5hZGQoeWkpO3JldHVybiB2fSxpbnRlcnNlY3RTcGhlcmU6ZnVuY3Rpb24oYSxjKXtsZC5zdWJWZWN0b3JzKGEuY2VudGVyLHRoaXMub3JpZ2luKTt2YXIgZT1sZC5kb3QodGhpcy5kaXJlY3Rpb24pLGc9bGQuZG90KGxkKS1lKmU7YT1hLnJhZGl1cyphLnJhZGl1czsKaWYoZz5hKXJldHVybiBudWxsO2E9TWF0aC5zcXJ0KGEtZyk7Zz1lLWE7ZSs9YTtyZXR1cm4gMD5nJiYwPmU/bnVsbDowPmc/dGhpcy5hdChlLGMpOnRoaXMuYXQoZyxjKX0saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kaXN0YW5jZVNxVG9Qb2ludChhLmNlbnRlcik8PWEucmFkaXVzKmEucmFkaXVzfSxkaXN0YW5jZVRvUGxhbmU6ZnVuY3Rpb24oYSl7dmFyIGM9YS5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKTtpZigwPT09YylyZXR1cm4gMD09PWEuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKT8wOm51bGw7YT0tKHRoaXMub3JpZ2luLmRvdChhLm5vcm1hbCkrYS5jb25zdGFudCkvYztyZXR1cm4gMDw9YT9hOm51bGx9LGludGVyc2VjdFBsYW5lOmZ1bmN0aW9uKGEsYyl7YT10aGlzLmRpc3RhbmNlVG9QbGFuZShhKTtyZXR1cm4gbnVsbD09PWE/bnVsbDp0aGlzLmF0KGEsYyl9LGludGVyc2VjdHNQbGFuZTpmdW5jdGlvbihhKXt2YXIgYz1hLmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik7CnJldHVybiAwPT09Y3x8MD5hLm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pKmM/ITA6ITF9LGludGVyc2VjdEJveDpmdW5jdGlvbihhLGMpe3ZhciBlPTEvdGhpcy5kaXJlY3Rpb24ueDt2YXIgZz0xL3RoaXMuZGlyZWN0aW9uLnk7dmFyIHI9MS90aGlzLmRpcmVjdGlvbi56LHY9dGhpcy5vcmlnaW47aWYoMDw9ZSl7dmFyIHo9KGEubWluLngtdi54KSplO2UqPWEubWF4Lngtdi54fWVsc2Ugej0oYS5tYXgueC12LngpKmUsZSo9YS5taW4ueC12Lng7aWYoMDw9Zyl7dmFyIEU9KGEubWluLnktdi55KSpnO2cqPWEubWF4Lnktdi55fWVsc2UgRT0oYS5tYXgueS12LnkpKmcsZyo9YS5taW4ueS12Lnk7aWYoej5nfHxFPmUpcmV0dXJuIG51bGw7aWYoRT56fHx6IT09eil6PUU7aWYoZzxlfHxlIT09ZSllPWc7MDw9cj8oRT0oYS5taW4uei12LnopKnIsYT0oYS5tYXguei12LnopKnIpOihFPShhLm1heC56LXYueikqcixhPShhLm1pbi56LXYueikqcik7aWYoej5hfHxFPmUpcmV0dXJuIG51bGw7CmlmKEU+enx8eiE9PXopej1FO2lmKGE8ZXx8ZSE9PWUpZT1hO3JldHVybiAwPmU/bnVsbDp0aGlzLmF0KDA8PXo/ejplLGMpfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09dGhpcy5pbnRlcnNlY3RCb3goYSxsZCl9LGludGVyc2VjdFRyaWFuZ2xlOmZ1bmN0aW9uKGEsYyxlLGcscil7emkuc3ViVmVjdG9ycyhjLGEpO2xoLnN1YlZlY3RvcnMoZSxhKTtBaS5jcm9zc1ZlY3RvcnMoemksbGgpO2M9dGhpcy5kaXJlY3Rpb24uZG90KEFpKTtpZigwPGMpe2lmKGcpcmV0dXJuIG51bGw7Zz0xfWVsc2UgaWYoMD5jKWc9LTEsYz0tYztlbHNlIHJldHVybiBudWxsO0hkLnN1YlZlY3RvcnModGhpcy5vcmlnaW4sYSk7YT1nKnRoaXMuZGlyZWN0aW9uLmRvdChsaC5jcm9zc1ZlY3RvcnMoSGQsbGgpKTtpZigwPmEpcmV0dXJuIG51bGw7ZT1nKnRoaXMuZGlyZWN0aW9uLmRvdCh6aS5jcm9zcyhIZCkpO2lmKDA+ZXx8YStlPmMpcmV0dXJuIG51bGw7YT0tZypIZC5kb3QoQWkpOwpyZXR1cm4gMD5hP251bGw6dGhpcy5hdChhL2Mscil9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoYSk7dGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKGEpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JpZ2luLmVxdWFscyh0aGlzLm9yaWdpbikmJmEuZGlyZWN0aW9uLmVxdWFscyh0aGlzLmRpcmVjdGlvbil9fSk7dmFyIEljPW5ldyBrLG1kPW5ldyBrLEJpPW5ldyBrLG5kPW5ldyBrLGtmPW5ldyBrLGxmPW5ldyBrLGlrPW5ldyBrLENpPW5ldyBrLERpPW5ldyBrLEVpPW5ldyBrO09iamVjdC5hc3NpZ24oQix7Z2V0Tm9ybWFsOmZ1bmN0aW9uKGEsYyxlLGcpe3ZvaWQgMD09PWcmJihjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuZ2V0Tm9ybWFsKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGc9bmV3IGspO2cuc3ViVmVjdG9ycyhlLGMpO0ljLnN1YlZlY3RvcnMoYSxjKTtnLmNyb3NzKEljKTsKYT1nLmxlbmd0aFNxKCk7cmV0dXJuIDA8YT9nLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KGEpKTpnLnNldCgwLDAsMCl9LGdldEJhcnljb29yZDpmdW5jdGlvbihhLGMsZSxnLHIpe0ljLnN1YlZlY3RvcnMoZyxjKTttZC5zdWJWZWN0b3JzKGUsYyk7Qmkuc3ViVmVjdG9ycyhhLGMpO2E9SWMuZG90KEljKTtjPUljLmRvdChtZCk7ZT1JYy5kb3QoQmkpO3ZhciB2PW1kLmRvdChtZCk7Zz1tZC5kb3QoQmkpO3ZhciB6PWEqdi1jKmM7dm9pZCAwPT09ciYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRCYXJ5Y29vcmQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIikscj1uZXcgayk7aWYoMD09PXopcmV0dXJuIHIuc2V0KC0yLC0xLC0xKTt6PTEvejt2PSh2KmUtYypnKSp6O2E9KGEqZy1jKmUpKno7cmV0dXJuIHIuc2V0KDEtdi1hLGEsdil9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSxjLGUsZyl7Qi5nZXRCYXJ5Y29vcmQoYSxjLGUsZyxuZCk7cmV0dXJuIDA8PW5kLngmJgowPD1uZC55JiYxPj1uZC54K25kLnl9LGdldFVWOmZ1bmN0aW9uKGEsYyxlLGcscix2LHosRSl7dGhpcy5nZXRCYXJ5Y29vcmQoYSxjLGUsZyxuZCk7RS5zZXQoMCwwKTtFLmFkZFNjYWxlZFZlY3RvcihyLG5kLngpO0UuYWRkU2NhbGVkVmVjdG9yKHYsbmQueSk7RS5hZGRTY2FsZWRWZWN0b3IoeixuZC56KTtyZXR1cm4gRX0saXNGcm9udEZhY2luZzpmdW5jdGlvbihhLGMsZSxnKXtJYy5zdWJWZWN0b3JzKGUsYyk7bWQuc3ViVmVjdG9ycyhhLGMpO3JldHVybiAwPkljLmNyb3NzKG1kKS5kb3QoZyk/ITA6ITF9fSk7T2JqZWN0LmFzc2lnbihCLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLmEuY29weShhKTt0aGlzLmIuY29weShjKTt0aGlzLmMuY29weShlKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50c0FuZEluZGljZXM6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5hLmNvcHkoYVtjXSk7dGhpcy5iLmNvcHkoYVtlXSk7dGhpcy5jLmNvcHkoYVtnXSk7cmV0dXJuIHRoaXN9LApjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLmEuY29weShhLmEpO3RoaXMuYi5jb3B5KGEuYik7dGhpcy5jLmNvcHkoYS5jKTtyZXR1cm4gdGhpc30sZ2V0QXJlYTpmdW5jdGlvbigpe0ljLnN1YlZlY3RvcnModGhpcy5jLHRoaXMuYik7bWQuc3ViVmVjdG9ycyh0aGlzLmEsdGhpcy5iKTtyZXR1cm4uNSpJYy5jcm9zcyhtZCkubGVuZ3RoKCl9LGdldE1pZHBvaW50OmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuZ2V0TWlkcG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuYWRkVmVjdG9ycyh0aGlzLmEsdGhpcy5iKS5hZGQodGhpcy5jKS5tdWx0aXBseVNjYWxhcigxLzMpfSxnZXROb3JtYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIEIuZ2V0Tm9ybWFsKHRoaXMuYSx0aGlzLmIsdGhpcy5jLGEpfSxnZXRQbGFuZTpmdW5jdGlvbihhKXt2b2lkIDA9PT0KYSYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRQbGFuZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfSxnZXRCYXJ5Y29vcmQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gQi5nZXRCYXJ5Y29vcmQoYSx0aGlzLmEsdGhpcy5iLHRoaXMuYyxjKX0sZ2V0VVY6ZnVuY3Rpb24oYSxjLGUsZyxyKXtyZXR1cm4gQi5nZXRVVihhLHRoaXMuYSx0aGlzLmIsdGhpcy5jLGMsZSxnLHIpfSxjb250YWluc1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBCLmNvbnRhaW5zUG9pbnQoYSx0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LGlzRnJvbnRGYWNpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuIEIuaXNGcm9udEZhY2luZyh0aGlzLmEsdGhpcy5iLHRoaXMuYyxhKX0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYSwKYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3ZhciBlPXRoaXMuYSxnPXRoaXMuYixyPXRoaXMuYztrZi5zdWJWZWN0b3JzKGcsZSk7bGYuc3ViVmVjdG9ycyhyLGUpO0NpLnN1YlZlY3RvcnMoYSxlKTt2YXIgdj1rZi5kb3QoQ2kpLHo9bGYuZG90KENpKTtpZigwPj12JiYwPj16KXJldHVybiBjLmNvcHkoZSk7RGkuc3ViVmVjdG9ycyhhLGcpO3ZhciBFPWtmLmRvdChEaSksRz1sZi5kb3QoRGkpO2lmKDA8PUUmJkc8PUUpcmV0dXJuIGMuY29weShnKTt2YXIgSj12KkctRSp6O2lmKDA+PUomJjA8PXYmJjA+PUUpcmV0dXJuIGc9di8odi1FKSxjLmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKGtmLGcpO0VpLnN1YlZlY3RvcnMoYSxyKTthPWtmLmRvdChFaSk7dmFyIFA9bGYuZG90KEVpKTtpZigwPD1QJiZhPD1QKXJldHVybiBjLmNvcHkocik7dj1hKnotCnYqUDtpZigwPj12JiYwPD16JiYwPj1QKXJldHVybiBKPXovKHotUCksYy5jb3B5KGUpLmFkZFNjYWxlZFZlY3RvcihsZixKKTt6PUUqUC1hKkc7aWYoMD49eiYmMDw9Ry1FJiYwPD1hLVApcmV0dXJuIGlrLnN1YlZlY3RvcnMocixnKSxKPShHLUUpLyhHLUUrKGEtUCkpLGMuY29weShnKS5hZGRTY2FsZWRWZWN0b3IoaWssSik7cj0xLyh6K3YrSik7Zz12KnI7Sio9cjtyZXR1cm4gYy5jb3B5KGUpLmFkZFNjYWxlZFZlY3RvcihrZixnKS5hZGRTY2FsZWRWZWN0b3IobGYsSil9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5hLmVxdWFscyh0aGlzLmEpJiZhLmIuZXF1YWxzKHRoaXMuYikmJmEuYy5lcXVhbHModGhpcy5jKX19KTt2YXIgRW09e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsCmJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSwKZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LApsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsCm1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNiwKcmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSxsYz17aDowLApzOjAsbDowfSxtaD17aDowLHM6MCxsOjB9O09iamVjdC5hc3NpZ24oSS5wcm90b3R5cGUse2lzQ29sb3I6ITAscjoxLGc6MSxiOjEsc2V0OmZ1bmN0aW9uKGEpe2EmJmEuaXNDb2xvcj90aGlzLmNvcHkoYSk6Im51bWJlciI9PT10eXBlb2YgYT90aGlzLnNldEhleChhKToic3RyaW5nIj09PXR5cGVvZiBhJiZ0aGlzLnNldFN0eWxlKGEpO3JldHVybiB0aGlzfSxzZXRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5iPXRoaXMuZz10aGlzLnI9YTtyZXR1cm4gdGhpc30sc2V0SGV4OmZ1bmN0aW9uKGEpe2E9TWF0aC5mbG9vcihhKTt0aGlzLnI9KGE+PjE2JjI1NSkvMjU1O3RoaXMuZz0oYT4+OCYyNTUpLzI1NTt0aGlzLmI9KGEmMjU1KS8yNTU7cmV0dXJuIHRoaXN9LHNldFJHQjpmdW5jdGlvbihhLGMsZSl7dGhpcy5yPWE7dGhpcy5nPWM7dGhpcy5iPWU7cmV0dXJuIHRoaXN9LHNldEhTTDpmdW5jdGlvbihhLGMsZSl7YT1oYi5ldWNsaWRlYW5Nb2R1bG8oYSwxKTtjPWhiLmNsYW1wKGMsMCwKMSk7ZT1oYi5jbGFtcChlLDAsMSk7MD09PWM/dGhpcy5yPXRoaXMuZz10aGlzLmI9ZTooYz0uNT49ZT9lKigxK2MpOmUrYy1lKmMsZT0yKmUtYyx0aGlzLnI9TihlLGMsYSsxLzMpLHRoaXMuZz1OKGUsYyxhKSx0aGlzLmI9TihlLGMsYS0xLzMpKTtyZXR1cm4gdGhpc30sc2V0U3R5bGU6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyh6KXt2b2lkIDAhPT16JiYxPnBhcnNlRmxvYXQoeikmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK2ErIiB3aWxsIGJlIGlnbm9yZWQuIil9dmFyIGU7aWYoZT0vXigoPzpyZ2J8aHNsKWE/KVwoXHMqKFteXCldKilcKS8uZXhlYyhhKSl7dmFyIGc9ZVsyXTtzd2l0Y2goZVsxXSl7Y2FzZSAicmdiIjpjYXNlICJyZ2JhIjppZihlPS9eKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooLFxzKihbMC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKGcpKXJldHVybiB0aGlzLnI9TWF0aC5taW4oMjU1LHBhcnNlSW50KGVbMV0sCjEwKSkvMjU1LHRoaXMuZz1NYXRoLm1pbigyNTUscGFyc2VJbnQoZVsyXSwxMCkpLzI1NSx0aGlzLmI9TWF0aC5taW4oMjU1LHBhcnNlSW50KGVbM10sMTApKS8yNTUsYyhlWzVdKSx0aGlzO2lmKGU9L14oXGQrKSVccyosXHMqKFxkKyklXHMqLFxzKihcZCspJVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMoZykpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigxMDAscGFyc2VJbnQoZVsxXSwxMCkpLzEwMCx0aGlzLmc9TWF0aC5taW4oMTAwLHBhcnNlSW50KGVbMl0sMTApKS8xMDAsdGhpcy5iPU1hdGgubWluKDEwMCxwYXJzZUludChlWzNdLDEwKSkvMTAwLGMoZVs1XSksdGhpczticmVhaztjYXNlICJoc2wiOmNhc2UgImhzbGEiOmlmKGU9L14oWzAtOV0qXC4/WzAtOV0rKVxzKixccyooXGQrKSVccyosXHMqKFxkKyklXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyhnKSl7Zz1wYXJzZUZsb2F0KGVbMV0pLzM2MDt2YXIgcj1wYXJzZUludChlWzJdLAoxMCkvMTAwLHY9cGFyc2VJbnQoZVszXSwxMCkvMTAwO2MoZVs1XSk7cmV0dXJuIHRoaXMuc2V0SFNMKGcscix2KX19fWVsc2UgaWYoZT0vXiMoW0EtRmEtZjAtOV0rKSQvLmV4ZWMoYSkpe2U9ZVsxXTtnPWUubGVuZ3RoO2lmKDM9PT1nKXJldHVybiB0aGlzLnI9cGFyc2VJbnQoZS5jaGFyQXQoMCkrZS5jaGFyQXQoMCksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQoZS5jaGFyQXQoMSkrZS5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQoZS5jaGFyQXQoMikrZS5jaGFyQXQoMiksMTYpLzI1NSx0aGlzO2lmKDY9PT1nKXJldHVybiB0aGlzLnI9cGFyc2VJbnQoZS5jaGFyQXQoMCkrZS5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQoZS5jaGFyQXQoMikrZS5jaGFyQXQoMyksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQoZS5jaGFyQXQoNCkrZS5jaGFyQXQoNSksMTYpLzI1NSx0aGlzfWEmJjA8YS5sZW5ndGgmJihlPUVtW2FdLHZvaWQgMCE9PWU/dGhpcy5zZXRIZXgoZSk6CmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgIithKSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucix0aGlzLmcsdGhpcy5iKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLnI9YS5yO3RoaXMuZz1hLmc7dGhpcy5iPWEuYjtyZXR1cm4gdGhpc30sY29weUdhbW1hVG9MaW5lYXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0yKTt0aGlzLnI9TWF0aC5wb3coYS5yLGMpO3RoaXMuZz1NYXRoLnBvdyhhLmcsYyk7dGhpcy5iPU1hdGgucG93KGEuYixjKTtyZXR1cm4gdGhpc30sY29weUxpbmVhclRvR2FtbWE6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0yKTtjPTA8Yz8xL2M6MTt0aGlzLnI9TWF0aC5wb3coYS5yLGMpO3RoaXMuZz1NYXRoLnBvdyhhLmcsYyk7dGhpcy5iPU1hdGgucG93KGEuYixjKTtyZXR1cm4gdGhpc30sY29udmVydEdhbW1hVG9MaW5lYXI6ZnVuY3Rpb24oYSl7dGhpcy5jb3B5R2FtbWFUb0xpbmVhcih0aGlzLAphKTtyZXR1cm4gdGhpc30sY29udmVydExpbmVhclRvR2FtbWE6ZnVuY3Rpb24oYSl7dGhpcy5jb3B5TGluZWFyVG9HYW1tYSh0aGlzLGEpO3JldHVybiB0aGlzfSxjb3B5U1JHQlRvTGluZWFyOmZ1bmN0aW9uKGEpe3RoaXMucj1PKGEucik7dGhpcy5nPU8oYS5nKTt0aGlzLmI9TyhhLmIpO3JldHVybiB0aGlzfSxjb3B5TGluZWFyVG9TUkdCOmZ1bmN0aW9uKGEpe3RoaXMucj1IKGEucik7dGhpcy5nPUgoYS5nKTt0aGlzLmI9SChhLmIpO3JldHVybiB0aGlzfSxjb252ZXJ0U1JHQlRvTGluZWFyOmZ1bmN0aW9uKCl7dGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpO3JldHVybiB0aGlzfSxjb252ZXJ0TGluZWFyVG9TUkdCOmZ1bmN0aW9uKCl7dGhpcy5jb3B5TGluZWFyVG9TUkdCKHRoaXMpO3JldHVybiB0aGlzfSxnZXRIZXg6ZnVuY3Rpb24oKXtyZXR1cm4gMjU1KnRoaXMucjw8MTZeMjU1KnRoaXMuZzw8OF4yNTUqdGhpcy5iPDwwfSxnZXRIZXhTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4oIjAwMDAwMCIrCnRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9LGdldEhTTDpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogLmdldEhTTCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPXtoOjAsczowLGw6MH0pO3ZhciBjPXRoaXMucixlPXRoaXMuZyxnPXRoaXMuYixyPU1hdGgubWF4KGMsZSxnKSx2PU1hdGgubWluKGMsZSxnKSx6LEU9KHYrcikvMjtpZih2PT09cil2PXo9MDtlbHNle3ZhciBHPXItdjt2PS41Pj1FP0cvKHIrdik6Ry8oMi1yLXYpO3N3aXRjaChyKXtjYXNlIGM6ej0oZS1nKS9HKyhlPGc/NjowKTticmVhaztjYXNlIGU6ej0oZy1jKS9HKzI7YnJlYWs7Y2FzZSBnOno9KGMtZSkvRys0fXovPTZ9YS5oPXo7YS5zPXY7YS5sPUU7cmV0dXJuIGF9LGdldFN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJuInJnYigiKygyNTUqdGhpcy5yfDApKyIsIisoMjU1KnRoaXMuZ3wwKSsiLCIrKDI1NSp0aGlzLmJ8MCkrIikifSxvZmZzZXRIU0w6ZnVuY3Rpb24oYSwKYyxlKXt0aGlzLmdldEhTTChsYyk7bGMuaCs9YTtsYy5zKz1jO2xjLmwrPWU7dGhpcy5zZXRIU0wobGMuaCxsYy5zLGxjLmwpO3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSl7dGhpcy5yKz1hLnI7dGhpcy5nKz1hLmc7dGhpcy5iKz1hLmI7cmV0dXJuIHRoaXN9LGFkZENvbG9yczpmdW5jdGlvbihhLGMpe3RoaXMucj1hLnIrYy5yO3RoaXMuZz1hLmcrYy5nO3RoaXMuYj1hLmIrYy5iO3JldHVybiB0aGlzfSxhZGRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5yKz1hO3RoaXMuZys9YTt0aGlzLmIrPWE7cmV0dXJuIHRoaXN9LHN1YjpmdW5jdGlvbihhKXt0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItYS5yKTt0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctYS5nKTt0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItYS5iKTtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSl7dGhpcy5yKj1hLnI7dGhpcy5nKj1hLmc7dGhpcy5iKj1hLmI7cmV0dXJuIHRoaXN9LG11bHRpcGx5U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMucio9CmE7dGhpcy5nKj1hO3RoaXMuYio9YTtyZXR1cm4gdGhpc30sbGVycDpmdW5jdGlvbihhLGMpe3RoaXMucis9KGEuci10aGlzLnIpKmM7dGhpcy5nKz0oYS5nLXRoaXMuZykqYzt0aGlzLmIrPShhLmItdGhpcy5iKSpjO3JldHVybiB0aGlzfSxsZXJwSFNMOmZ1bmN0aW9uKGEsYyl7dGhpcy5nZXRIU0wobGMpO2EuZ2V0SFNMKG1oKTthPWhiLmxlcnAobGMuaCxtaC5oLGMpO3ZhciBlPWhiLmxlcnAobGMucyxtaC5zLGMpO2M9aGIubGVycChsYy5sLG1oLmwsYyk7dGhpcy5zZXRIU0woYSxlLGMpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucj09PXRoaXMuciYmYS5nPT09dGhpcy5nJiZhLmI9PT10aGlzLmJ9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMucj1hW2NdO3RoaXMuZz1hW2MrMV07dGhpcy5iPWFbYysyXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT0KYyYmKGM9MCk7YVtjXT10aGlzLnI7YVtjKzFdPXRoaXMuZzthW2MrMl09dGhpcy5iO3JldHVybiBhfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX19KTtPYmplY3QuYXNzaWduKEsucHJvdG90eXBlLHtjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLmE9YS5hO3RoaXMuYj1hLmI7dGhpcy5jPWEuYzt0aGlzLm5vcm1hbC5jb3B5KGEubm9ybWFsKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXRlcmlhbEluZGV4PWEubWF0ZXJpYWxJbmRleDtmb3IodmFyIGM9MCxlPWEudmVydGV4Tm9ybWFscy5sZW5ndGg7YzxlO2MrKyl0aGlzLnZlcnRleE5vcm1hbHNbY109YS52ZXJ0ZXhOb3JtYWxzW2NdLmNsb25lKCk7Yz0wO2ZvcihlPWEudmVydGV4Q29sb3JzLmxlbmd0aDtjPGU7YysrKXRoaXMudmVydGV4Q29sb3JzW2NdPWEudmVydGV4Q29sb3JzW2NdLmNsb25lKCk7CnJldHVybiB0aGlzfX0pO3ZhciBQaz0wO00ucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOk0saXNNYXRlcmlhbDohMCxvbkJlZm9yZUNvbXBpbGU6ZnVuY3Rpb24oKXt9LHNldFZhbHVlczpmdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKWZvcih2YXIgYyBpbiBhKXt2YXIgZT1hW2NdO2lmKHZvaWQgMD09PWUpY29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogJyIrYysiJyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLiIpO2Vsc2UgaWYoInNoYWRpbmciPT09Yyljb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKSx0aGlzLmZsYXRTaGFkaW5nPTE9PT1lPyEwOiExO2Vsc2V7dmFyIGc9dGhpc1tjXTt2b2lkIDA9PT1nP2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogJyIrYysiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGlzIG1hdGVyaWFsLiIpOgpnJiZnLmlzQ29sb3I/Zy5zZXQoZSk6ZyYmZy5pc1ZlY3RvcjMmJmUmJmUuaXNWZWN0b3IzP2cuY29weShlKTp0aGlzW2NdPWV9fX0sdG9KU09OOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMocil7dmFyIHY9W10sejtmb3IoeiBpbiByKXt2YXIgRT1yW3pdO2RlbGV0ZSBFLm1ldGFkYXRhO3YucHVzaChFKX1yZXR1cm4gdn12YXIgZT12b2lkIDA9PT1hfHwic3RyaW5nIj09PXR5cGVvZiBhO2UmJihhPXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTt2YXIgZz17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6Ik1hdGVyaWFsIixnZW5lcmF0b3I6Ik1hdGVyaWFsLnRvSlNPTiJ9fTtnLnV1aWQ9dGhpcy51dWlkO2cudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJihnLm5hbWU9dGhpcy5uYW1lKTt0aGlzLmNvbG9yJiZ0aGlzLmNvbG9yLmlzQ29sb3ImJihnLmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCkpO3ZvaWQgMCE9PXRoaXMucm91Z2huZXNzJiYoZy5yb3VnaG5lc3M9dGhpcy5yb3VnaG5lc3MpOwp2b2lkIDAhPT10aGlzLm1ldGFsbmVzcyYmKGcubWV0YWxuZXNzPXRoaXMubWV0YWxuZXNzKTt0aGlzLmVtaXNzaXZlJiZ0aGlzLmVtaXNzaXZlLmlzQ29sb3ImJihnLmVtaXNzaXZlPXRoaXMuZW1pc3NpdmUuZ2V0SGV4KCkpO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJjEhPT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5JiYoZy5lbWlzc2l2ZUludGVuc2l0eT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5KTt0aGlzLnNwZWN1bGFyJiZ0aGlzLnNwZWN1bGFyLmlzQ29sb3ImJihnLnNwZWN1bGFyPXRoaXMuc3BlY3VsYXIuZ2V0SGV4KCkpO3ZvaWQgMCE9PXRoaXMuc2hpbmluZXNzJiYoZy5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpO3ZvaWQgMCE9PXRoaXMuY2xlYXJjb2F0JiYoZy5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpO3ZvaWQgMCE9PXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzJiYoZy5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwJiYKdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYoZy5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKGEpLnV1aWQsZy5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSk7dGhpcy5tYXAmJnRoaXMubWFwLmlzVGV4dHVyZSYmKGcubWFwPXRoaXMubWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLm1hdGNhcCYmdGhpcy5tYXRjYXAuaXNUZXh0dXJlJiYoZy5tYXRjYXA9dGhpcy5tYXRjYXAudG9KU09OKGEpLnV1aWQpO3RoaXMuYWxwaGFNYXAmJnRoaXMuYWxwaGFNYXAuaXNUZXh0dXJlJiYoZy5hbHBoYU1hcD10aGlzLmFscGhhTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLmxpZ2h0TWFwJiZ0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSYmKGcubGlnaHRNYXA9dGhpcy5saWdodE1hcC50b0pTT04oYSkudXVpZCk7dGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihnLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKGEpLnV1aWQsCmcuYW9NYXBJbnRlbnNpdHk9dGhpcy5hb01hcEludGVuc2l0eSk7dGhpcy5idW1wTWFwJiZ0aGlzLmJ1bXBNYXAuaXNUZXh0dXJlJiYoZy5idW1wTWFwPXRoaXMuYnVtcE1hcC50b0pTT04oYSkudXVpZCxnLmJ1bXBTY2FsZT10aGlzLmJ1bXBTY2FsZSk7dGhpcy5ub3JtYWxNYXAmJnRoaXMubm9ybWFsTWFwLmlzVGV4dHVyZSYmKGcubm9ybWFsTWFwPXRoaXMubm9ybWFsTWFwLnRvSlNPTihhKS51dWlkLGcubm9ybWFsTWFwVHlwZT10aGlzLm5vcm1hbE1hcFR5cGUsZy5ub3JtYWxTY2FsZT10aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKSk7dGhpcy5kaXNwbGFjZW1lbnRNYXAmJnRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSYmKGcuZGlzcGxhY2VtZW50TWFwPXRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTihhKS51dWlkLGcuZGlzcGxhY2VtZW50U2NhbGU9dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSxnLmRpc3BsYWNlbWVudEJpYXM9dGhpcy5kaXNwbGFjZW1lbnRCaWFzKTt0aGlzLnJvdWdobmVzc01hcCYmCnRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKGcucm91Z2huZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLm1ldGFsbmVzc01hcCYmdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlJiYoZy5tZXRhbG5lc3NNYXA9dGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMuZW1pc3NpdmVNYXAmJnRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlJiYoZy5lbWlzc2l2ZU1hcD10aGlzLmVtaXNzaXZlTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLnNwZWN1bGFyTWFwJiZ0aGlzLnNwZWN1bGFyTWFwLmlzVGV4dHVyZSYmKGcuc3BlY3VsYXJNYXA9dGhpcy5zcGVjdWxhck1hcC50b0pTT04oYSkudXVpZCk7dGhpcy5lbnZNYXAmJnRoaXMuZW52TWFwLmlzVGV4dHVyZSYmKGcuZW52TWFwPXRoaXMuZW52TWFwLnRvSlNPTihhKS51dWlkLGcucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5LGcucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvLAp2b2lkIDAhPT10aGlzLmNvbWJpbmUmJihnLmNvbWJpbmU9dGhpcy5jb21iaW5lKSx2b2lkIDAhPT10aGlzLmVudk1hcEludGVuc2l0eSYmKGcuZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSk7dGhpcy5ncmFkaWVudE1hcCYmdGhpcy5ncmFkaWVudE1hcC5pc1RleHR1cmUmJihnLmdyYWRpZW50TWFwPXRoaXMuZ3JhZGllbnRNYXAudG9KU09OKGEpLnV1aWQpO3ZvaWQgMCE9PXRoaXMuc2l6ZSYmKGcuc2l6ZT10aGlzLnNpemUpO3ZvaWQgMCE9PXRoaXMuc2l6ZUF0dGVudWF0aW9uJiYoZy5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pOzEhPT10aGlzLmJsZW5kaW5nJiYoZy5ibGVuZGluZz10aGlzLmJsZW5kaW5nKTshMD09PXRoaXMuZmxhdFNoYWRpbmcmJihnLmZsYXRTaGFkaW5nPXRoaXMuZmxhdFNoYWRpbmcpOzAhPT10aGlzLnNpZGUmJihnLnNpZGU9dGhpcy5zaWRlKTswIT09dGhpcy52ZXJ0ZXhDb2xvcnMmJihnLnZlcnRleENvbG9ycz0KdGhpcy52ZXJ0ZXhDb2xvcnMpOzE+dGhpcy5vcGFjaXR5JiYoZy5vcGFjaXR5PXRoaXMub3BhY2l0eSk7ITA9PT10aGlzLnRyYW5zcGFyZW50JiYoZy50cmFuc3BhcmVudD10aGlzLnRyYW5zcGFyZW50KTtnLmRlcHRoRnVuYz10aGlzLmRlcHRoRnVuYztnLmRlcHRoVGVzdD10aGlzLmRlcHRoVGVzdDtnLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFdyaXRlO2cuc3RlbmNpbFdyaXRlPXRoaXMuc3RlbmNpbFdyaXRlO2cuc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYztnLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmO2cuc3RlbmNpbE1hc2s9dGhpcy5zdGVuY2lsTWFzaztnLnN0ZW5jaWxGYWlsPXRoaXMuc3RlbmNpbEZhaWw7Zy5zdGVuY2lsWkZhaWw9dGhpcy5zdGVuY2lsWkZhaWw7Zy5zdGVuY2lsWlBhc3M9dGhpcy5zdGVuY2lsWlBhc3M7dGhpcy5yb3RhdGlvbiYmMCE9PXRoaXMucm90YXRpb24mJihnLnJvdGF0aW9uPXRoaXMucm90YXRpb24pOyEwPT09dGhpcy5wb2x5Z29uT2Zmc2V0JiYKKGcucG9seWdvbk9mZnNldD0hMCk7MCE9PXRoaXMucG9seWdvbk9mZnNldEZhY3RvciYmKGcucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpOzAhPT10aGlzLnBvbHlnb25PZmZzZXRVbml0cyYmKGcucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKTt0aGlzLmxpbmV3aWR0aCYmMSE9PXRoaXMubGluZXdpZHRoJiYoZy5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpO3ZvaWQgMCE9PXRoaXMuZGFzaFNpemUmJihnLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpO3ZvaWQgMCE9PXRoaXMuZ2FwU2l6ZSYmKGcuZ2FwU2l6ZT10aGlzLmdhcFNpemUpO3ZvaWQgMCE9PXRoaXMuc2NhbGUmJihnLnNjYWxlPXRoaXMuc2NhbGUpOyEwPT09dGhpcy5kaXRoZXJpbmcmJihnLmRpdGhlcmluZz0hMCk7MDx0aGlzLmFscGhhVGVzdCYmKGcuYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KTshMD09PXRoaXMucHJlbXVsdGlwbGllZEFscGhhJiYoZy5wcmVtdWx0aXBsaWVkQWxwaGE9CnRoaXMucHJlbXVsdGlwbGllZEFscGhhKTshMD09PXRoaXMud2lyZWZyYW1lJiYoZy53aXJlZnJhbWU9dGhpcy53aXJlZnJhbWUpOzE8dGhpcy53aXJlZnJhbWVMaW5ld2lkdGgmJihnLndpcmVmcmFtZUxpbmV3aWR0aD10aGlzLndpcmVmcmFtZUxpbmV3aWR0aCk7InJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWNhcCYmKGcud2lyZWZyYW1lTGluZWNhcD10aGlzLndpcmVmcmFtZUxpbmVjYXApOyJyb3VuZCIhPT10aGlzLndpcmVmcmFtZUxpbmVqb2luJiYoZy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVqb2luKTshMD09PXRoaXMubW9ycGhUYXJnZXRzJiYoZy5tb3JwaFRhcmdldHM9ITApOyEwPT09dGhpcy5tb3JwaE5vcm1hbHMmJihnLm1vcnBoTm9ybWFscz0hMCk7ITA9PT10aGlzLnNraW5uaW5nJiYoZy5za2lubmluZz0hMCk7ITE9PT10aGlzLnZpc2libGUmJihnLnZpc2libGU9ITEpOyExPT09dGhpcy50b25lTWFwcGVkJiYoZy50b25lTWFwcGVkPSExKTsKInt9IiE9PUpTT04uc3RyaW5naWZ5KHRoaXMudXNlckRhdGEpJiYoZy51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtlJiYoZT1jKGEudGV4dHVyZXMpLGE9YyhhLmltYWdlcyksMDxlLmxlbmd0aCYmKGcudGV4dHVyZXM9ZSksMDxhLmxlbmd0aCYmKGcuaW1hZ2VzPWEpKTtyZXR1cm4gZ30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWEubmFtZTt0aGlzLmZvZz1hLmZvZzt0aGlzLmxpZ2h0cz1hLmxpZ2h0czt0aGlzLmJsZW5kaW5nPWEuYmxlbmRpbmc7dGhpcy5zaWRlPWEuc2lkZTt0aGlzLmZsYXRTaGFkaW5nPWEuZmxhdFNoYWRpbmc7dGhpcy52ZXJ0ZXhDb2xvcnM9YS52ZXJ0ZXhDb2xvcnM7dGhpcy5vcGFjaXR5PWEub3BhY2l0eTt0aGlzLnRyYW5zcGFyZW50PWEudHJhbnNwYXJlbnQ7dGhpcy5ibGVuZFNyYz1hLmJsZW5kU3JjO3RoaXMuYmxlbmREc3Q9YS5ibGVuZERzdDt0aGlzLmJsZW5kRXF1YXRpb249CmEuYmxlbmRFcXVhdGlvbjt0aGlzLmJsZW5kU3JjQWxwaGE9YS5ibGVuZFNyY0FscGhhO3RoaXMuYmxlbmREc3RBbHBoYT1hLmJsZW5kRHN0QWxwaGE7dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE9YS5ibGVuZEVxdWF0aW9uQWxwaGE7dGhpcy5kZXB0aEZ1bmM9YS5kZXB0aEZ1bmM7dGhpcy5kZXB0aFRlc3Q9YS5kZXB0aFRlc3Q7dGhpcy5kZXB0aFdyaXRlPWEuZGVwdGhXcml0ZTt0aGlzLnN0ZW5jaWxXcml0ZT1hLnN0ZW5jaWxXcml0ZTt0aGlzLnN0ZW5jaWxGdW5jPWEuc3RlbmNpbEZ1bmM7dGhpcy5zdGVuY2lsUmVmPWEuc3RlbmNpbFJlZjt0aGlzLnN0ZW5jaWxNYXNrPWEuc3RlbmNpbE1hc2s7dGhpcy5zdGVuY2lsRmFpbD1hLnN0ZW5jaWxGYWlsO3RoaXMuc3RlbmNpbFpGYWlsPWEuc3RlbmNpbFpGYWlsO3RoaXMuc3RlbmNpbFpQYXNzPWEuc3RlbmNpbFpQYXNzO3RoaXMuY29sb3JXcml0ZT1hLmNvbG9yV3JpdGU7dGhpcy5wcmVjaXNpb249YS5wcmVjaXNpb247dGhpcy5wb2x5Z29uT2Zmc2V0PQphLnBvbHlnb25PZmZzZXQ7dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yPWEucG9seWdvbk9mZnNldEZhY3Rvcjt0aGlzLnBvbHlnb25PZmZzZXRVbml0cz1hLnBvbHlnb25PZmZzZXRVbml0czt0aGlzLmRpdGhlcmluZz1hLmRpdGhlcmluZzt0aGlzLmFscGhhVGVzdD1hLmFscGhhVGVzdDt0aGlzLnByZW11bHRpcGxpZWRBbHBoYT1hLnByZW11bHRpcGxpZWRBbHBoYTt0aGlzLnZpc2libGU9YS52aXNpYmxlO3RoaXMudG9uZU1hcHBlZD1hLnRvbmVNYXBwZWQ7dGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGEudXNlckRhdGEpKTt0aGlzLmNsaXBTaGFkb3dzPWEuY2xpcFNoYWRvd3M7dGhpcy5jbGlwSW50ZXJzZWN0aW9uPWEuY2xpcEludGVyc2VjdGlvbjt2YXIgYz1hLmNsaXBwaW5nUGxhbmVzLGU9bnVsbDtpZihudWxsIT09Yyl7dmFyIGc9Yy5sZW5ndGg7ZT1BcnJheShnKTtmb3IodmFyIHI9MDtyIT09ZzsrK3IpZVtyXT1jW3JdLmNsb25lKCl9dGhpcy5jbGlwcGluZ1BsYW5lcz0KZTt0aGlzLnNoYWRvd1NpZGU9YS5zaGFkb3dTaWRlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO0wucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO0wucHJvdG90eXBlLmNvbnN0cnVjdG9yPUw7TC5wcm90b3R5cGUuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMDtMLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hcD1hLm1hcDt0aGlzLmxpZ2h0TWFwPWEubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9YS5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHk7dGhpcy5zcGVjdWxhck1hcD1hLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD1hLmVudk1hcDsKdGhpcy5jb21iaW5lPWEuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1hLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7cmV0dXJuIHRoaXN9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShRLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYSl7ITA9PT1hJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuYXNzaWduKFEucHJvdG90eXBlLHtpc0J1ZmZlckF0dHJpYnV0ZTohMCxvblVwbG9hZENhbGxiYWNrOmZ1bmN0aW9uKCl7fSxzZXRBcnJheTpmdW5jdGlvbihhKXtpZihBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7CnRoaXMuY291bnQ9dm9pZCAwIT09YT9hLmxlbmd0aC90aGlzLml0ZW1TaXplOjA7dGhpcy5hcnJheT1hO3JldHVybiB0aGlzfSxzZXREeW5hbWljOmZ1bmN0aW9uKGEpe3RoaXMuZHluYW1pYz1hO3JldHVybiB0aGlzfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubmFtZT1hLm5hbWU7dGhpcy5hcnJheT1uZXcgYS5hcnJheS5jb25zdHJ1Y3RvcihhLmFycmF5KTt0aGlzLml0ZW1TaXplPWEuaXRlbVNpemU7dGhpcy5jb3VudD1hLmNvdW50O3RoaXMubm9ybWFsaXplZD1hLm5vcm1hbGl6ZWQ7dGhpcy5keW5hbWljPWEuZHluYW1pYztyZXR1cm4gdGhpc30sY29weUF0OmZ1bmN0aW9uKGEsYyxlKXthKj10aGlzLml0ZW1TaXplO2UqPWMuaXRlbVNpemU7Zm9yKHZhciBnPTAscj10aGlzLml0ZW1TaXplO2c8cjtnKyspdGhpcy5hcnJheVthK2ddPWMuYXJyYXlbZStnXTtyZXR1cm4gdGhpc30sY29weUFycmF5OmZ1bmN0aW9uKGEpe3RoaXMuYXJyYXkuc2V0KGEpO3JldHVybiB0aGlzfSxjb3B5Q29sb3JzQXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPQp0aGlzLmFycmF5LGU9MCxnPTAscj1hLmxlbmd0aDtnPHI7ZysrKXt2YXIgdj1hW2ddO3ZvaWQgMD09PXYmJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoKTogY29sb3IgaXMgdW5kZWZpbmVkIixnKSx2PW5ldyBJKTtjW2UrK109di5yO2NbZSsrXT12Lmc7Y1tlKytdPXYuYn1yZXR1cm4gdGhpc30sY29weVZlY3RvcjJzQXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuYXJyYXksZT0wLGc9MCxyPWEubGVuZ3RoO2c8cjtnKyspe3ZhciB2PWFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Iyc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IGYpO2NbZSsrXT12Lng7Y1tlKytdPXYueX1yZXR1cm4gdGhpc30sY29weVZlY3RvcjNzQXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuYXJyYXksZT0wLGc9MCxyPWEubGVuZ3RoO2c8cjtnKyspe3ZhciB2PQphW2ddO3ZvaWQgMD09PXYmJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkIixnKSx2PW5ldyBrKTtjW2UrK109di54O2NbZSsrXT12Lnk7Y1tlKytdPXYuen1yZXR1cm4gdGhpc30sY29weVZlY3RvcjRzQXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuYXJyYXksZT0wLGc9MCxyPWEubGVuZ3RoO2c8cjtnKyspe3ZhciB2PWFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IHApO2NbZSsrXT12Lng7Y1tlKytdPXYueTtjW2UrK109di56O2NbZSsrXT12Lnd9cmV0dXJuIHRoaXN9LHNldDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMuYXJyYXkuc2V0KGEsYyk7cmV0dXJuIHRoaXN9LGdldFg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJyYXlbYSoKdGhpcy5pdGVtU2l6ZV19LHNldFg6ZnVuY3Rpb24oYSxjKXt0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZV09YztyZXR1cm4gdGhpc30sZ2V0WTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrMV19LHNldFk6ZnVuY3Rpb24oYSxjKXt0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSsxXT1jO3JldHVybiB0aGlzfSxnZXRaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSsyXX0sc2V0WjpmdW5jdGlvbihhLGMpe3RoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzJdPWM7cmV0dXJuIHRoaXN9LGdldFc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzNdfSxzZXRXOmZ1bmN0aW9uKGEsYyl7dGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrM109YztyZXR1cm4gdGhpc30sc2V0WFk6ZnVuY3Rpb24oYSxjLGUpe2EqPXRoaXMuaXRlbVNpemU7dGhpcy5hcnJheVthKzBdPWM7dGhpcy5hcnJheVthKwoxXT1lO3JldHVybiB0aGlzfSxzZXRYWVo6ZnVuY3Rpb24oYSxjLGUsZyl7YSo9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2ErMF09Yzt0aGlzLmFycmF5W2ErMV09ZTt0aGlzLmFycmF5W2ErMl09ZztyZXR1cm4gdGhpc30sc2V0WFlaVzpmdW5jdGlvbihhLGMsZSxnLHIpe2EqPXRoaXMuaXRlbVNpemU7dGhpcy5hcnJheVthKzBdPWM7dGhpcy5hcnJheVthKzFdPWU7dGhpcy5hcnJheVthKzJdPWc7dGhpcy5hcnJheVthKzNdPXI7cmV0dXJuIHRoaXN9LG9uVXBsb2FkOmZ1bmN0aW9uKGEpe3RoaXMub25VcGxvYWRDYWxsYmFjaz1hO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LHRoaXMuaXRlbVNpemUpKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmFycmF5KSwKbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9fX0pO1QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO1QucHJvdG90eXBlLmNvbnN0cnVjdG9yPVQ7WC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShRLnByb3RvdHlwZSk7WC5wcm90b3R5cGUuY29uc3RydWN0b3I9WDthYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShRLnByb3RvdHlwZSk7YWEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWFhO2xhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtsYS5wcm90b3R5cGUuY29uc3RydWN0b3I9bGE7Wi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShRLnByb3RvdHlwZSk7Wi5wcm90b3R5cGUuY29uc3RydWN0b3I9WjtiYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShRLnByb3RvdHlwZSk7YmEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWJhO2VhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtlYS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZWE7Y2EucHJvdG90eXBlPQpPYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtjYS5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2E7a2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2thLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1rYTtPYmplY3QuYXNzaWduKFkucHJvdG90eXBlLHtjb21wdXRlR3JvdXBzOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGU9dm9pZCAwO2E9YS5mYWNlcztmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl7dmFyIHI9YVtnXTtpZihyLm1hdGVyaWFsSW5kZXghPT1lKXtlPXIubWF0ZXJpYWxJbmRleDt2b2lkIDAhPT12JiYodi5jb3VudD0zKmctdi5zdGFydCxjLnB1c2godikpO3ZhciB2PXtzdGFydDozKmcsbWF0ZXJpYWxJbmRleDplfX19dm9pZCAwIT09diYmKHYuY291bnQ9MypnLXYuc3RhcnQsYy5wdXNoKHYpKTt0aGlzLmdyb3Vwcz1jfSxmcm9tR2VvbWV0cnk6ZnVuY3Rpb24oYSl7dmFyIGM9YS5mYWNlcyxlPWEudmVydGljZXMsZz1hLmZhY2VWZXJ0ZXhVdnMscj1nWzBdJiYKMDxnWzBdLmxlbmd0aCx2PWdbMV0mJjA8Z1sxXS5sZW5ndGgsej1hLm1vcnBoVGFyZ2V0cyxFPXoubGVuZ3RoO2lmKDA8RSl7dmFyIEc9W107Zm9yKHZhciBKPTA7SjxFO0orKylHW0pdPXtuYW1lOnpbSl0ubmFtZSxkYXRhOltdfTt0aGlzLm1vcnBoVGFyZ2V0cy5wb3NpdGlvbj1HfXZhciBQPWEubW9ycGhOb3JtYWxzLFI9UC5sZW5ndGg7aWYoMDxSKXt2YXIgUz1bXTtmb3IoSj0wO0o8UjtKKyspU1tKXT17bmFtZTpQW0pdLm5hbWUsZGF0YTpbXX07dGhpcy5tb3JwaFRhcmdldHMubm9ybWFsPVN9dmFyIFY9YS5za2luSW5kaWNlcyxXPWEuc2tpbldlaWdodHMsaGE9Vi5sZW5ndGg9PT1lLmxlbmd0aCxmYT1XLmxlbmd0aD09PWUubGVuZ3RoOzA8ZS5sZW5ndGgmJjA9PT1jLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuRGlyZWN0R2VvbWV0cnk6IEZhY2VsZXNzIGdlb21ldHJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7Zm9yKEo9MDtKPGMubGVuZ3RoO0orKyl7dmFyIHJhPWNbSl07CnRoaXMudmVydGljZXMucHVzaChlW3JhLmFdLGVbcmEuYl0sZVtyYS5jXSk7dmFyIHBhPXJhLnZlcnRleE5vcm1hbHM7Mz09PXBhLmxlbmd0aD90aGlzLm5vcm1hbHMucHVzaChwYVswXSxwYVsxXSxwYVsyXSk6KHBhPXJhLm5vcm1hbCx0aGlzLm5vcm1hbHMucHVzaChwYSxwYSxwYSkpO3BhPXJhLnZlcnRleENvbG9yczszPT09cGEubGVuZ3RoP3RoaXMuY29sb3JzLnB1c2gocGFbMF0scGFbMV0scGFbMl0pOihwYT1yYS5jb2xvcix0aGlzLmNvbG9ycy5wdXNoKHBhLHBhLHBhKSk7ITA9PT1yJiYocGE9Z1swXVtKXSx2b2lkIDAhPT1wYT90aGlzLnV2cy5wdXNoKHBhWzBdLHBhWzFdLHBhWzJdKTooY29uc29sZS53YXJuKCJUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICIsSiksdGhpcy51dnMucHVzaChuZXcgZixuZXcgZixuZXcgZikpKTshMD09PXYmJihwYT1nWzFdW0pdLHZvaWQgMCE9PXBhP3RoaXMudXZzMi5wdXNoKHBhWzBdLApwYVsxXSxwYVsyXSk6KGNvbnNvbGUud2FybigiVEhSRUUuRGlyZWN0R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdjIgIixKKSx0aGlzLnV2czIucHVzaChuZXcgZixuZXcgZixuZXcgZikpKTtmb3IocGE9MDtwYTxFO3BhKyspe3ZhciBxYT16W3BhXS52ZXJ0aWNlcztHW3BhXS5kYXRhLnB1c2gocWFbcmEuYV0scWFbcmEuYl0scWFbcmEuY10pfWZvcihwYT0wO3BhPFI7cGErKylxYT1QW3BhXS52ZXJ0ZXhOb3JtYWxzW0pdLFNbcGFdLmRhdGEucHVzaChxYS5hLHFhLmIscWEuYyk7aGEmJnRoaXMuc2tpbkluZGljZXMucHVzaChWW3JhLmFdLFZbcmEuYl0sVltyYS5jXSk7ZmEmJnRoaXMuc2tpbldlaWdodHMucHVzaChXW3JhLmFdLFdbcmEuYl0sV1tyYS5jXSl9dGhpcy5jb21wdXRlR3JvdXBzKGEpO3RoaXMudmVydGljZXNOZWVkVXBkYXRlPWEudmVydGljZXNOZWVkVXBkYXRlO3RoaXMubm9ybWFsc05lZWRVcGRhdGU9YS5ub3JtYWxzTmVlZFVwZGF0ZTsKdGhpcy5jb2xvcnNOZWVkVXBkYXRlPWEuY29sb3JzTmVlZFVwZGF0ZTt0aGlzLnV2c05lZWRVcGRhdGU9YS51dnNOZWVkVXBkYXRlO3RoaXMuZ3JvdXBzTmVlZFVwZGF0ZT1hLmdyb3Vwc05lZWRVcGRhdGU7bnVsbCE9PWEuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWEuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWEuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWEuYm91bmRpbmdCb3guY2xvbmUoKSk7cmV0dXJuIHRoaXN9fSk7dmFyIFFrPTEsWGM9bmV3IHEsRmk9bmV3IEEsbmg9bmV3IGssZ2U9bmV3IHcsR2k9bmV3IHcsSmM9bmV3IGs7dmEucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZhLGlzQnVmZmVyR2VvbWV0cnk6ITAsZ2V0SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbmRleH0sc2V0SW5kZXg6ZnVuY3Rpb24oYSl7dGhpcy5pbmRleD1BcnJheS5pc0FycmF5KGEpPwpuZXcgKDY1NTM1PEVhKGEpP2VhOlopKGEsMSk6YX0sYWRkQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXtpZighKGMmJmMuaXNCdWZmZXJBdHRyaWJ1dGV8fGMmJmMuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSkpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLiIpLHRoaXMuYWRkQXR0cmlidXRlKGEsbmV3IFEoYyxlKSk7aWYoImluZGV4Ij09PWEpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4iKSx0aGlzLnNldEluZGV4KGMpLHRoaXM7dGhpcy5hdHRyaWJ1dGVzW2FdPWM7cmV0dXJuIHRoaXN9LGdldEF0dHJpYnV0ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2FdfSxyZW1vdmVBdHRyaWJ1dGU6ZnVuY3Rpb24oYSl7ZGVsZXRlIHRoaXMuYXR0cmlidXRlc1thXTsKcmV0dXJuIHRoaXN9LGFkZEdyb3VwOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDphLGNvdW50OmMsbWF0ZXJpYWxJbmRleDp2b2lkIDAhPT1lP2U6MH0pfSxjbGVhckdyb3VwczpmdW5jdGlvbigpe3RoaXMuZ3JvdXBzPVtdfSxzZXREcmF3UmFuZ2U6ZnVuY3Rpb24oYSxjKXt0aGlzLmRyYXdSYW5nZS5zdGFydD1hO3RoaXMuZHJhd1JhbmdlLmNvdW50PWN9LGFwcGx5TWF0cml4OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjt2b2lkIDAhPT1jJiYoYS5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGMpLGMubmVlZHNVcGRhdGU9ITApO3ZhciBlPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7dm9pZCAwIT09ZSYmKGM9KG5ldyB0KS5nZXROb3JtYWxNYXRyaXgoYSksYy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGUpLGUubmVlZHNVcGRhdGU9ITApO2U9dGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7dm9pZCAwIT09ZSYmKGM9KG5ldyB0KS5nZXROb3JtYWxNYXRyaXgoYSksCmMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShlKSxlLm5lZWRzVXBkYXRlPSEwKTtudWxsIT09dGhpcy5ib3VuZGluZ0JveCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtyZXR1cm4gdGhpc30scm90YXRlWDpmdW5jdGlvbihhKXtYYy5tYWtlUm90YXRpb25YKGEpO3RoaXMuYXBwbHlNYXRyaXgoWGMpO3JldHVybiB0aGlzfSxyb3RhdGVZOmZ1bmN0aW9uKGEpe1hjLm1ha2VSb3RhdGlvblkoYSk7dGhpcy5hcHBseU1hdHJpeChYYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVo6ZnVuY3Rpb24oYSl7WGMubWFrZVJvdGF0aW9uWihhKTt0aGlzLmFwcGx5TWF0cml4KFhjKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsYyxlKXtYYy5tYWtlVHJhbnNsYXRpb24oYSxjLGUpO3RoaXMuYXBwbHlNYXRyaXgoWGMpO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhLGMsZSl7WGMubWFrZVNjYWxlKGEsCmMsZSk7dGhpcy5hcHBseU1hdHJpeChYYyk7cmV0dXJuIHRoaXN9LGxvb2tBdDpmdW5jdGlvbihhKXtGaS5sb29rQXQoYSk7RmkudXBkYXRlTWF0cml4KCk7dGhpcy5hcHBseU1hdHJpeChGaS5tYXRyaXgpO3JldHVybiB0aGlzfSxjZW50ZXI6ZnVuY3Rpb24oKXt0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO3RoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKG5oKS5uZWdhdGUoKTt0aGlzLnRyYW5zbGF0ZShuaC54LG5oLnksbmgueik7cmV0dXJuIHRoaXN9LHNldEZyb21PYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGM9YS5nZW9tZXRyeTtpZihhLmlzUG9pbnRzfHxhLmlzTGluZSl7YT1uZXcgY2EoMypjLnZlcnRpY2VzLmxlbmd0aCwzKTt2YXIgZT1uZXcgY2EoMypjLmNvbG9ycy5sZW5ndGgsMyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixhLmNvcHlWZWN0b3Izc0FycmF5KGMudmVydGljZXMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgiY29sb3IiLGUuY29weUNvbG9yc0FycmF5KGMuY29sb3JzKSk7CmMubGluZURpc3RhbmNlcyYmYy5saW5lRGlzdGFuY2VzLmxlbmd0aD09PWMudmVydGljZXMubGVuZ3RoJiYoYT1uZXcgY2EoYy5saW5lRGlzdGFuY2VzLmxlbmd0aCwxKSx0aGlzLmFkZEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIixhLmNvcHlBcnJheShjLmxpbmVEaXN0YW5jZXMpKSk7bnVsbCE9PWMuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWMuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWMuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWMuYm91bmRpbmdCb3guY2xvbmUoKSl9ZWxzZSBhLmlzTWVzaCYmYyYmYy5pc0dlb21ldHJ5JiZ0aGlzLmZyb21HZW9tZXRyeShjKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9YVtlXTtjLnB1c2goci54LHIueSxyLnp8fDApfXRoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGMsMykpOwpyZXR1cm4gdGhpc30sdXBkYXRlRnJvbU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYz1hLmdlb21ldHJ5O2lmKGEuaXNNZXNoKXt2YXIgZT1jLl9fZGlyZWN0R2VvbWV0cnk7ITA9PT1jLmVsZW1lbnRzTmVlZFVwZGF0ZSYmKGU9dm9pZCAwLGMuZWxlbWVudHNOZWVkVXBkYXRlPSExKTtpZih2b2lkIDA9PT1lKXJldHVybiB0aGlzLmZyb21HZW9tZXRyeShjKTtlLnZlcnRpY2VzTmVlZFVwZGF0ZT1jLnZlcnRpY2VzTmVlZFVwZGF0ZTtlLm5vcm1hbHNOZWVkVXBkYXRlPWMubm9ybWFsc05lZWRVcGRhdGU7ZS5jb2xvcnNOZWVkVXBkYXRlPWMuY29sb3JzTmVlZFVwZGF0ZTtlLnV2c05lZWRVcGRhdGU9Yy51dnNOZWVkVXBkYXRlO2UuZ3JvdXBzTmVlZFVwZGF0ZT1jLmdyb3Vwc05lZWRVcGRhdGU7Yy52ZXJ0aWNlc05lZWRVcGRhdGU9ITE7Yy5ub3JtYWxzTmVlZFVwZGF0ZT0hMTtjLmNvbG9yc05lZWRVcGRhdGU9ITE7Yy51dnNOZWVkVXBkYXRlPSExO2MuZ3JvdXBzTmVlZFVwZGF0ZT0hMTsKYz1lfSEwPT09Yy52ZXJ0aWNlc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbix2b2lkIDAhPT1lJiYoZS5jb3B5VmVjdG9yM3NBcnJheShjLnZlcnRpY2VzKSxlLm5lZWRzVXBkYXRlPSEwKSxjLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMSk7ITA9PT1jLm5vcm1hbHNOZWVkVXBkYXRlJiYoZT10aGlzLmF0dHJpYnV0ZXMubm9ybWFsLHZvaWQgMCE9PWUmJihlLmNvcHlWZWN0b3Izc0FycmF5KGMubm9ybWFscyksZS5uZWVkc1VwZGF0ZT0hMCksYy5ub3JtYWxzTmVlZFVwZGF0ZT0hMSk7ITA9PT1jLmNvbG9yc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5jb2xvcix2b2lkIDAhPT1lJiYoZS5jb3B5Q29sb3JzQXJyYXkoYy5jb2xvcnMpLGUubmVlZHNVcGRhdGU9ITApLGMuY29sb3JzTmVlZFVwZGF0ZT0hMSk7Yy51dnNOZWVkVXBkYXRlJiYoZT10aGlzLmF0dHJpYnV0ZXMudXYsdm9pZCAwIT09ZSYmKGUuY29weVZlY3RvcjJzQXJyYXkoYy51dnMpLGUubmVlZHNVcGRhdGU9CiEwKSxjLnV2c05lZWRVcGRhdGU9ITEpO2MubGluZURpc3RhbmNlc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2Usdm9pZCAwIT09ZSYmKGUuY29weUFycmF5KGMubGluZURpc3RhbmNlcyksZS5uZWVkc1VwZGF0ZT0hMCksYy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZT0hMSk7Yy5ncm91cHNOZWVkVXBkYXRlJiYoYy5jb21wdXRlR3JvdXBzKGEuZ2VvbWV0cnkpLHRoaXMuZ3JvdXBzPWMuZ3JvdXBzLGMuZ3JvdXBzTmVlZFVwZGF0ZT0hMSk7cmV0dXJuIHRoaXN9LGZyb21HZW9tZXRyeTpmdW5jdGlvbihhKXthLl9fZGlyZWN0R2VvbWV0cnk9KG5ldyBZKS5mcm9tR2VvbWV0cnkoYSk7cmV0dXJuIHRoaXMuZnJvbURpcmVjdEdlb21ldHJ5KGEuX19kaXJlY3RHZW9tZXRyeSl9LGZyb21EaXJlY3RHZW9tZXRyeTpmdW5jdGlvbihhKXt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLChuZXcgUShuZXcgRmxvYXQzMkFycmF5KDMqYS52ZXJ0aWNlcy5sZW5ndGgpLAozKSkuY29weVZlY3RvcjNzQXJyYXkoYS52ZXJ0aWNlcykpOzA8YS5ub3JtYWxzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsKG5ldyBRKG5ldyBGbG9hdDMyQXJyYXkoMyphLm5vcm1hbHMubGVuZ3RoKSwzKSkuY29weVZlY3RvcjNzQXJyYXkoYS5ub3JtYWxzKSk7MDxhLmNvbG9ycy5sZW5ndGgmJnRoaXMuYWRkQXR0cmlidXRlKCJjb2xvciIsKG5ldyBRKG5ldyBGbG9hdDMyQXJyYXkoMyphLmNvbG9ycy5sZW5ndGgpLDMpKS5jb3B5Q29sb3JzQXJyYXkoYS5jb2xvcnMpKTswPGEudXZzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoInV2IiwobmV3IFEobmV3IEZsb2F0MzJBcnJheSgyKmEudXZzLmxlbmd0aCksMikpLmNvcHlWZWN0b3Iyc0FycmF5KGEudXZzKSk7MDxhLnV2czIubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgidXYyIiwobmV3IFEobmV3IEZsb2F0MzJBcnJheSgyKmEudXZzMi5sZW5ndGgpLDIpKS5jb3B5VmVjdG9yMnNBcnJheShhLnV2czIpKTsKdGhpcy5ncm91cHM9YS5ncm91cHM7Zm9yKHZhciBjIGluIGEubW9ycGhUYXJnZXRzKXtmb3IodmFyIGU9W10sZz1hLm1vcnBoVGFyZ2V0c1tjXSxyPTAsdj1nLmxlbmd0aDtyPHY7cisrKXt2YXIgej1nW3JdLEU9bmV3IGNhKDMqei5kYXRhLmxlbmd0aCwzKTtFLm5hbWU9ei5uYW1lO2UucHVzaChFLmNvcHlWZWN0b3Izc0FycmF5KHouZGF0YSkpfXRoaXMubW9ycGhBdHRyaWJ1dGVzW2NdPWV9MDxhLnNraW5JbmRpY2VzLmxlbmd0aCYmKGM9bmV3IGNhKDQqYS5za2luSW5kaWNlcy5sZW5ndGgsNCksdGhpcy5hZGRBdHRyaWJ1dGUoInNraW5JbmRleCIsYy5jb3B5VmVjdG9yNHNBcnJheShhLnNraW5JbmRpY2VzKSkpOzA8YS5za2luV2VpZ2h0cy5sZW5ndGgmJihjPW5ldyBjYSg0KmEuc2tpbldlaWdodHMubGVuZ3RoLDQpLHRoaXMuYWRkQXR0cmlidXRlKCJza2luV2VpZ2h0IixjLmNvcHlWZWN0b3I0c0FycmF5KGEuc2tpbldlaWdodHMpKSk7bnVsbCE9PWEuYm91bmRpbmdTcGhlcmUmJgoodGhpcy5ib3VuZGluZ1NwaGVyZT1hLmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpO251bGwhPT1hLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1hLmJvdW5kaW5nQm94LmNsb25lKCkpO3JldHVybiB0aGlzfSxjb21wdXRlQm91bmRpbmdCb3g6ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IHcpO3ZhciBhPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixjPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHZvaWQgMCE9PWEpe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKSxjKXthPTA7Zm9yKHZhciBlPWMubGVuZ3RoO2E8ZTthKyspZ2Uuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShjW2FdKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoZ2UubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoZ2UubWF4KX19ZWxzZSB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOwooaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveDogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9LGNvbXB1dGVCb3VuZGluZ1NwaGVyZTpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nU3BoZXJlJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgRik7dmFyIGE9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGM9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYoYSl7dmFyIGU9dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7Z2Uuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKTtpZihjKWZvcih2YXIgZz0wLHI9Yy5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9CmNbZ107R2kuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh2KTtnZS5leHBhbmRCeVBvaW50KEdpLm1pbik7Z2UuZXhwYW5kQnlQb2ludChHaS5tYXgpfWdlLmdldENlbnRlcihlKTt2YXIgej0wO2c9MDtmb3Iocj1hLmNvdW50O2c8cjtnKyspSmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGcpLHo9TWF0aC5tYXgoeixlLmRpc3RhbmNlVG9TcXVhcmVkKEpjKSk7aWYoYylmb3IoZz0wLHI9Yy5sZW5ndGg7ZzxyO2crKyl7dj1jW2ddO2E9MDtmb3IodmFyIEU9di5jb3VudDthPEU7YSsrKUpjLmZyb21CdWZmZXJBdHRyaWJ1dGUodixhKSx6PU1hdGgubWF4KHosZS5kaXN0YW5jZVRvU3F1YXJlZChKYykpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydCh6KTtpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLAp0aGlzKX19LGNvbXB1dGVGYWNlTm9ybWFsczpmdW5jdGlvbigpe30sY29tcHV0ZVZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmluZGV4LGM9dGhpcy5hdHRyaWJ1dGVzO2lmKGMucG9zaXRpb24pe3ZhciBlPWMucG9zaXRpb24uYXJyYXk7aWYodm9pZCAwPT09Yy5ub3JtYWwpdGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFEobmV3IEZsb2F0MzJBcnJheShlLmxlbmd0aCksMykpO2Vsc2UgZm9yKHZhciBnPWMubm9ybWFsLmFycmF5LHI9MCx2PWcubGVuZ3RoO3I8djtyKyspZ1tyXT0wO2c9Yy5ub3JtYWwuYXJyYXk7dmFyIHo9bmV3IGssRT1uZXcgayxHPW5ldyBrLEo9bmV3IGssUD1uZXcgaztpZihhKXt2YXIgUj1hLmFycmF5O3I9MDtmb3Iodj1hLmNvdW50O3I8djtyKz0zKXthPTMqUltyKzBdO3ZhciBTPTMqUltyKzFdO3ZhciBWPTMqUltyKzJdO3ouZnJvbUFycmF5KGUsYSk7RS5mcm9tQXJyYXkoZSxTKTtHLmZyb21BcnJheShlLFYpO0ouc3ViVmVjdG9ycyhHLApFKTtQLnN1YlZlY3RvcnMoeixFKTtKLmNyb3NzKFApO2dbYV0rPUoueDtnW2ErMV0rPUoueTtnW2ErMl0rPUouejtnW1NdKz1KLng7Z1tTKzFdKz1KLnk7Z1tTKzJdKz1KLno7Z1tWXSs9Si54O2dbVisxXSs9Si55O2dbVisyXSs9Si56fX1lbHNlIGZvcihyPTAsdj1lLmxlbmd0aDtyPHY7cis9OSl6LmZyb21BcnJheShlLHIpLEUuZnJvbUFycmF5KGUsciszKSxHLmZyb21BcnJheShlLHIrNiksSi5zdWJWZWN0b3JzKEcsRSksUC5zdWJWZWN0b3JzKHosRSksSi5jcm9zcyhQKSxnW3JdPUoueCxnW3IrMV09Si55LGdbcisyXT1KLnosZ1tyKzNdPUoueCxnW3IrNF09Si55LGdbcis1XT1KLnosZ1tyKzZdPUoueCxnW3IrN109Si55LGdbcis4XT1KLno7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7Yy5ub3JtYWwubmVlZHNVcGRhdGU9ITB9fSxtZXJnZTpmdW5jdGlvbihhLGMpe2lmKGEmJmEuaXNCdWZmZXJHZW9tZXRyeSl7dm9pZCAwPT09YyYmKGM9MCxjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXRceDNkMC4gVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLiIpKTsKdmFyIGU9dGhpcy5hdHRyaWJ1dGVzLGc7Zm9yKGcgaW4gZSlpZih2b2lkIDAhPT1hLmF0dHJpYnV0ZXNbZ10pe3ZhciByPWVbZ10uYXJyYXksdj1hLmF0dHJpYnV0ZXNbZ10sej12LmFycmF5LEU9di5pdGVtU2l6ZSpjO3Y9TWF0aC5taW4oei5sZW5ndGgsci5sZW5ndGgtRSk7Zm9yKHZhciBHPTA7Rzx2O0crKyxFKyspcltFXT16W0ddfXJldHVybiB0aGlzfWNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeS4iLGEpfSxub3JtYWxpemVOb3JtYWxzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwsYz0wLGU9YS5jb3VudDtjPGU7YysrKUpjLng9YS5nZXRYKGMpLEpjLnk9YS5nZXRZKGMpLEpjLno9YS5nZXRaKGMpLEpjLm5vcm1hbGl6ZSgpLGEuc2V0WFlaKGMsSmMueCxKYy55LEpjLnopfSx0b05vbkluZGV4ZWQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKFAsClIpe3ZhciBTPVAuYXJyYXk7UD1QLml0ZW1TaXplO2Zvcih2YXIgVj1uZXcgUy5jb25zdHJ1Y3RvcihSLmxlbmd0aCpQKSxXLGhhPTAsZmE9MCxyYT1SLmxlbmd0aDtmYTxyYTtmYSsrKXtXPVJbZmFdKlA7Zm9yKHZhciBwYT0wO3BhPFA7cGErKylWW2hhKytdPVNbVysrXX1yZXR1cm4gbmV3IFEoVixQKX1pZihudWxsPT09dGhpcy5pbmRleClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO3ZhciBjPW5ldyB2YSxlPXRoaXMuaW5kZXguYXJyYXksZz10aGlzLmF0dHJpYnV0ZXMscjtmb3IociBpbiBnKXt2YXIgdj1nW3JdO3Y9YSh2LGUpO2MuYWRkQXR0cmlidXRlKHIsdil9dmFyIHo9dGhpcy5tb3JwaEF0dHJpYnV0ZXM7Zm9yKHIgaW4geil7dmFyIEU9W10sRz16W3JdO2c9MDtmb3IodmFyIEo9Ry5sZW5ndGg7ZzxKO2crKyl2PUdbZ10sdj1hKHYsZSksRS5wdXNoKHYpOwpjLm1vcnBoQXR0cmlidXRlc1tyXT1FfWU9dGhpcy5ncm91cHM7Zz0wO2ZvcihyPWUubGVuZ3RoO2c8cjtnKyspdj1lW2ddLGMuYWRkR3JvdXAodi5zdGFydCx2LmNvdW50LHYubWF0ZXJpYWxJbmRleCk7cmV0dXJuIGN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQnVmZmVyR2VvbWV0cnkiLGdlbmVyYXRvcjoiQnVmZmVyR2VvbWV0cnkudG9KU09OIn19O2EudXVpZD10aGlzLnV1aWQ7YS50eXBlPXRoaXMudHlwZTsiIiE9PXRoaXMubmFtZSYmKGEubmFtZT10aGlzLm5hbWUpOzA8T2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoJiYoYS51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtpZih2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe3ZhciBjPXRoaXMucGFyYW1ldGVycztmb3IoSiBpbiBjKXZvaWQgMCE9PWNbSl0mJihhW0pdPWNbSl0pO3JldHVybiBhfWEuZGF0YT17YXR0cmlidXRlczp7fX07Yz10aGlzLmluZGV4O251bGwhPT0KYyYmKGEuZGF0YS5pbmRleD17dHlwZTpjLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYy5hcnJheSl9KTt2YXIgZT10aGlzLmF0dHJpYnV0ZXM7Zm9yKEogaW4gZSl7Yz1lW0pdO3ZhciBnPWMudG9KU09OKCk7IiIhPT1jLm5hbWUmJihnLm5hbWU9Yy5uYW1lKTthLmRhdGEuYXR0cmlidXRlc1tKXT1nfWU9e307dmFyIHI9ITE7Zm9yKEogaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2Zvcih2YXIgdj10aGlzLm1vcnBoQXR0cmlidXRlc1tKXSx6PVtdLEU9MCxHPXYubGVuZ3RoO0U8RztFKyspYz12W0VdLGc9Yy50b0pTT04oKSwiIiE9PWMubmFtZSYmKGcubmFtZT1jLm5hbWUpLHoucHVzaChnKTswPHoubGVuZ3RoJiYoZVtKXT16LHI9ITApfXImJihhLmRhdGEubW9ycGhBdHRyaWJ1dGVzPWUpO3ZhciBKPXRoaXMuZ3JvdXBzOzA8Si5sZW5ndGgmJihhLmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoSikpKTtKPQp0aGlzLmJvdW5kaW5nU3BoZXJlO251bGwhPT1KJiYoYS5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6Si5jZW50ZXIudG9BcnJheSgpLHJhZGl1czpKLnJhZGl1c30pO3JldHVybiBhfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdmEpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGM7dGhpcy5pbmRleD1udWxsO3RoaXMuYXR0cmlidXRlcz17fTt0aGlzLm1vcnBoQXR0cmlidXRlcz17fTt0aGlzLmdyb3Vwcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLm5hbWU9YS5uYW1lO3ZhciBlPWEuaW5kZXg7bnVsbCE9PWUmJnRoaXMuc2V0SW5kZXgoZS5jbG9uZSgpKTtlPWEuYXR0cmlidXRlcztmb3IoeiBpbiBlKXRoaXMuYWRkQXR0cmlidXRlKHosZVt6XS5jbG9uZSgpKTt2YXIgZz1hLm1vcnBoQXR0cmlidXRlcztmb3IoeiBpbiBnKXt2YXIgcj1bXSx2PWdbel07ZT0wO2ZvcihjPXYubGVuZ3RoO2U8YztlKyspci5wdXNoKHZbZV0uY2xvbmUoKSk7CnRoaXMubW9ycGhBdHRyaWJ1dGVzW3pdPXJ9dmFyIHo9YS5ncm91cHM7ZT0wO2ZvcihjPXoubGVuZ3RoO2U8YztlKyspZz16W2VdLHRoaXMuYWRkR3JvdXAoZy5zdGFydCxnLmNvdW50LGcubWF0ZXJpYWxJbmRleCk7ej1hLmJvdW5kaW5nQm94O251bGwhPT16JiYodGhpcy5ib3VuZGluZ0JveD16LmNsb25lKCkpO3o9YS5ib3VuZGluZ1NwaGVyZTtudWxsIT09eiYmKHRoaXMuYm91bmRpbmdTcGhlcmU9ei5jbG9uZSgpKTt0aGlzLmRyYXdSYW5nZS5zdGFydD1hLmRyYXdSYW5nZS5zdGFydDt0aGlzLmRyYXdSYW5nZS5jb3VudD1hLmRyYXdSYW5nZS5jb3VudDt0aGlzLnVzZXJEYXRhPWEudXNlckRhdGE7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7dmFyIGprPW5ldyBxLGhlPW5ldyBELEhpPW5ldyBGLExkPW5ldyBrLE1kPW5ldyBrLE5kPW5ldyBrLCRpPW5ldyBrLGFqPW5ldyBrLGJqPW5ldyBrLEloPQpuZXcgayxKaD1uZXcgayxLaD1uZXcgayxvZT1uZXcgZixwZT1uZXcgZixxZT1uZXcgZixzZj1uZXcgayxzZz1uZXcgazt4YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6eGEsaXNNZXNoOiEwLHNldERyYXdNb2RlOmZ1bmN0aW9uKGEpe3RoaXMuZHJhd01vZGU9YX0sY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmRyYXdNb2RlPWEuZHJhd01vZGU7dm9pZCAwIT09YS5tb3JwaFRhcmdldEluZmx1ZW5jZXMmJih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpKTt2b2lkIDAhPT1hLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSYmKHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PU9iamVjdC5hc3NpZ24oe30sYS5tb3JwaFRhcmdldERpY3Rpb25hcnkpKTtyZXR1cm4gdGhpc30sdXBkYXRlTW9ycGhUYXJnZXRzOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2VvbWV0cnk7aWYoYS5pc0J1ZmZlckdlb21ldHJ5KXthPWEubW9ycGhBdHRyaWJ1dGVzO3ZhciBjPU9iamVjdC5rZXlzKGEpO2lmKDA8Yy5sZW5ndGgpe3ZhciBlPWFbY1swXV07aWYodm9pZCAwIT09ZSlmb3IodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e30sYT0wLGM9ZS5sZW5ndGg7YTxjO2ErKyl7dmFyIGc9ZVthXS5uYW1lfHxTdHJpbmcoYSk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKTt0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtnXT1hfX19ZWxzZSBhPWEubW9ycGhUYXJnZXRzLHZvaWQgMCE9PWEmJjA8YS5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1lc2gudXBkYXRlTW9ycGhUYXJnZXRzKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX0scmF5Y2FzdDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZ2VvbWV0cnksCmc9dGhpcy5tYXRlcmlhbCxyPXRoaXMubWF0cml4V29ybGQ7aWYodm9pZCAwIT09ZyYmKG51bGw9PT1lLmJvdW5kaW5nU3BoZXJlJiZlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLEhpLmNvcHkoZS5ib3VuZGluZ1NwaGVyZSksSGkuYXBwbHlNYXRyaXg0KHIpLCExIT09YS5yYXkuaW50ZXJzZWN0c1NwaGVyZShIaSkmJihqay5nZXRJbnZlcnNlKHIpLGhlLmNvcHkoYS5yYXkpLmFwcGx5TWF0cml4NChqayksbnVsbD09PWUuYm91bmRpbmdCb3h8fCExIT09aGUuaW50ZXJzZWN0c0JveChlLmJvdW5kaW5nQm94KSkpKWlmKGUuaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHY9ZS5pbmRleDtyPWUuYXR0cmlidXRlcy5wb3NpdGlvbjt2YXIgej1lLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixFPWUuYXR0cmlidXRlcy51dixHPWUuYXR0cmlidXRlcy51djIsSj1lLmdyb3VwcyxQPWUuZHJhd1JhbmdlLFIsUztpZihudWxsIT09dilpZihBcnJheS5pc0FycmF5KGcpKXt2YXIgVj0wO2ZvcihSPUoubGVuZ3RoO1Y8ClI7VisrKXt2YXIgVz1KW1ZdO3ZhciBoYT1nW1cubWF0ZXJpYWxJbmRleF07dmFyIGZhPU1hdGgubWF4KFcuc3RhcnQsUC5zdGFydCk7Zm9yKFM9ZT1NYXRoLm1pbihXLnN0YXJ0K1cuY291bnQsUC5zdGFydCtQLmNvdW50KTtmYTxTO2ZhKz0zKXtlPXYuZ2V0WChmYSk7dmFyIHJhPXYuZ2V0WChmYSsxKTt2YXIgcGE9di5nZXRYKGZhKzIpO2lmKGU9RmEodGhpcyxoYSxhLGhlLHIseixFLEcsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihmYS8zKSxlLmZhY2UubWF0ZXJpYWxJbmRleD1XLm1hdGVyaWFsSW5kZXgsYy5wdXNoKGUpfX19ZWxzZSBmb3IoZmE9TWF0aC5tYXgoMCxQLnN0YXJ0KSxlPU1hdGgubWluKHYuY291bnQsUC5zdGFydCtQLmNvdW50KSxWPWZhLFI9ZTtWPFI7Vis9Myl7aWYoZT12LmdldFgoVikscmE9di5nZXRYKFYrMSkscGE9di5nZXRYKFYrMiksZT1GYSh0aGlzLGcsYSxoZSxyLHosRSxHLGUscmEscGEpKWUuZmFjZUluZGV4PU1hdGguZmxvb3IoVi8zKSwKYy5wdXNoKGUpfWVsc2UgaWYodm9pZCAwIT09cilpZihBcnJheS5pc0FycmF5KGcpKWZvcihWPTAsUj1KLmxlbmd0aDtWPFI7VisrKWZvcihXPUpbVl0saGE9Z1tXLm1hdGVyaWFsSW5kZXhdLGZhPU1hdGgubWF4KFcuc3RhcnQsUC5zdGFydCksUz1lPU1hdGgubWluKFcuc3RhcnQrVy5jb3VudCxQLnN0YXJ0K1AuY291bnQpO2ZhPFM7ZmErPTMpe2lmKGU9ZmEscmE9ZmErMSxwYT1mYSsyLGU9RmEodGhpcyxoYSxhLGhlLHIseixFLEcsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihmYS8zKSxlLmZhY2UubWF0ZXJpYWxJbmRleD1XLm1hdGVyaWFsSW5kZXgsYy5wdXNoKGUpfWVsc2UgZm9yKGZhPU1hdGgubWF4KDAsUC5zdGFydCksZT1NYXRoLm1pbihyLmNvdW50LFAuc3RhcnQrUC5jb3VudCksVj1mYSxSPWU7VjxSO1YrPTMpaWYoZT1WLHJhPVYrMSxwYT1WKzIsZT1GYSh0aGlzLGcsYSxoZSxyLHosRSxHLGUscmEscGEpKWUuZmFjZUluZGV4PU1hdGguZmxvb3IoVi8zKSxjLnB1c2goZSl9ZWxzZSBpZihlLmlzR2VvbWV0cnkpZm9yKHI9CkFycmF5LmlzQXJyYXkoZyksej1lLnZlcnRpY2VzLEU9ZS5mYWNlcyxlPWUuZmFjZVZlcnRleFV2c1swXSwwPGUubGVuZ3RoJiYodj1lKSxWPTAsUj1FLmxlbmd0aDtWPFI7VisrKWlmKFc9RVtWXSxlPXI/Z1tXLm1hdGVyaWFsSW5kZXhdOmcsdm9pZCAwIT09ZSYmKEc9eltXLmFdLEo9eltXLmJdLFA9eltXLmNdLGU9QWEodGhpcyxlLGEsaGUsRyxKLFAsc2YpKSl2JiZ2W1ZdJiYoaGE9dltWXSxvZS5jb3B5KGhhWzBdKSxwZS5jb3B5KGhhWzFdKSxxZS5jb3B5KGhhWzJdKSxlLnV2PUIuZ2V0VVYoc2YsRyxKLFAsb2UscGUscWUsbmV3IGYpKSxlLmZhY2U9VyxlLmZhY2VJbmRleD1WLGMucHVzaChlKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTt2YXIgUms9MCxZYz1uZXcgcSxJaT1uZXcgQSxvaD1uZXcgazt5YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOnlhLGlzR2VvbWV0cnk6ITAsYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPShuZXcgdCkuZ2V0Tm9ybWFsTWF0cml4KGEpLGU9MCxnPXRoaXMudmVydGljZXMubGVuZ3RoO2U8ZztlKyspdGhpcy52ZXJ0aWNlc1tlXS5hcHBseU1hdHJpeDQoYSk7ZT0wO2ZvcihnPXRoaXMuZmFjZXMubGVuZ3RoO2U8ZztlKyspe2E9dGhpcy5mYWNlc1tlXTthLm5vcm1hbC5hcHBseU1hdHJpeDMoYykubm9ybWFsaXplKCk7Zm9yKHZhciByPTAsdj1hLnZlcnRleE5vcm1hbHMubGVuZ3RoO3I8djtyKyspYS52ZXJ0ZXhOb3JtYWxzW3JdLmFwcGx5TWF0cml4MyhjKS5ub3JtYWxpemUoKX1udWxsIT09dGhpcy5ib3VuZGluZ0JveCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudmVydGljZXNOZWVkVXBkYXRlPSEwO3JldHVybiB0aGlzfSwKcm90YXRlWDpmdW5jdGlvbihhKXtZYy5tYWtlUm90YXRpb25YKGEpO3RoaXMuYXBwbHlNYXRyaXgoWWMpO3JldHVybiB0aGlzfSxyb3RhdGVZOmZ1bmN0aW9uKGEpe1ljLm1ha2VSb3RhdGlvblkoYSk7dGhpcy5hcHBseU1hdHJpeChZYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVo6ZnVuY3Rpb24oYSl7WWMubWFrZVJvdGF0aW9uWihhKTt0aGlzLmFwcGx5TWF0cml4KFljKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsYyxlKXtZYy5tYWtlVHJhbnNsYXRpb24oYSxjLGUpO3RoaXMuYXBwbHlNYXRyaXgoWWMpO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhLGMsZSl7WWMubWFrZVNjYWxlKGEsYyxlKTt0aGlzLmFwcGx5TWF0cml4KFljKTtyZXR1cm4gdGhpc30sbG9va0F0OmZ1bmN0aW9uKGEpe0lpLmxvb2tBdChhKTtJaS51cGRhdGVNYXRyaXgoKTt0aGlzLmFwcGx5TWF0cml4KElpLm1hdHJpeCk7cmV0dXJuIHRoaXN9LGZyb21CdWZmZXJHZW9tZXRyeTpmdW5jdGlvbihhKXtmdW5jdGlvbiBjKFYsClcsaGEsZmEpe3ZhciByYT12b2lkIDA9PT1FP1tdOltlLmNvbG9yc1tWXS5jbG9uZSgpLGUuY29sb3JzW1ddLmNsb25lKCksZS5jb2xvcnNbaGFdLmNsb25lKCldLHBhPXZvaWQgMD09PXo/W106WyhuZXcgaykuZnJvbUFycmF5KHosMypWKSwobmV3IGspLmZyb21BcnJheSh6LDMqVyksKG5ldyBrKS5mcm9tQXJyYXkoeiwzKmhhKV07ZmE9bmV3IEsoVixXLGhhLHBhLHJhLGZhKTtlLmZhY2VzLnB1c2goZmEpO3ZvaWQgMCE9PUcmJmUuZmFjZVZlcnRleFV2c1swXS5wdXNoKFsobmV3IGYpLmZyb21BcnJheShHLDIqViksKG5ldyBmKS5mcm9tQXJyYXkoRywyKlcpLChuZXcgZikuZnJvbUFycmF5KEcsMipoYSldKTt2b2lkIDAhPT1KJiZlLmZhY2VWZXJ0ZXhVdnNbMV0ucHVzaChbKG5ldyBmKS5mcm9tQXJyYXkoSiwyKlYpLChuZXcgZikuZnJvbUFycmF5KEosMipXKSwobmV3IGYpLmZyb21BcnJheShKLDIqaGEpXSl9dmFyIGU9dGhpcyxnPW51bGwhPT1hLmluZGV4P2EuaW5kZXguYXJyYXk6CnZvaWQgMCxyPWEuYXR0cmlidXRlcyx2PXIucG9zaXRpb24uYXJyYXksej12b2lkIDAhPT1yLm5vcm1hbD9yLm5vcm1hbC5hcnJheTp2b2lkIDAsRT12b2lkIDAhPT1yLmNvbG9yP3IuY29sb3IuYXJyYXk6dm9pZCAwLEc9dm9pZCAwIT09ci51dj9yLnV2LmFycmF5OnZvaWQgMCxKPXZvaWQgMCE9PXIudXYyP3IudXYyLmFycmF5OnZvaWQgMDt2b2lkIDAhPT1KJiYodGhpcy5mYWNlVmVydGV4VXZzWzFdPVtdKTtmb3Iocj0wO3I8di5sZW5ndGg7cis9MyllLnZlcnRpY2VzLnB1c2goKG5ldyBrKS5mcm9tQXJyYXkodixyKSksdm9pZCAwIT09RSYmZS5jb2xvcnMucHVzaCgobmV3IEkpLmZyb21BcnJheShFLHIpKTt2YXIgUD1hLmdyb3VwcztpZigwPFAubGVuZ3RoKWZvcihyPTA7cjxQLmxlbmd0aDtyKyspe3Y9UFtyXTt2YXIgUj12LnN0YXJ0LFM9Ujtmb3IoUis9di5jb3VudDtTPFI7Uys9Myl2b2lkIDAhPT1nP2MoZ1tTXSxnW1MrMV0sZ1tTKzJdLHYubWF0ZXJpYWxJbmRleCk6YyhTLApTKzEsUysyLHYubWF0ZXJpYWxJbmRleCl9ZWxzZSBpZih2b2lkIDAhPT1nKWZvcihyPTA7cjxnLmxlbmd0aDtyKz0zKWMoZ1tyXSxnW3IrMV0sZ1tyKzJdKTtlbHNlIGZvcihyPTA7cjx2Lmxlbmd0aC8zO3IrPTMpYyhyLHIrMSxyKzIpO3RoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7bnVsbCE9PWEuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWEuYm91bmRpbmdCb3guY2xvbmUoKSk7bnVsbCE9PWEuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWEuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7cmV0dXJuIHRoaXN9LGNlbnRlcjpmdW5jdGlvbigpe3RoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIob2gpLm5lZ2F0ZSgpO3RoaXMudHJhbnNsYXRlKG9oLngsb2gueSxvaC56KTtyZXR1cm4gdGhpc30sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt2YXIgYT10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlciwKYz10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cztjPTA9PT1jPzE6MS9jO3ZhciBlPW5ldyBxO2Uuc2V0KGMsMCwwLC1jKmEueCwwLGMsMCwtYyphLnksMCwwLGMsLWMqYS56LDAsMCwwLDEpO3RoaXMuYXBwbHlNYXRyaXgoZSk7cmV0dXJuIHRoaXN9LGNvbXB1dGVGYWNlTm9ybWFsczpmdW5jdGlvbigpe2Zvcih2YXIgYT1uZXcgayxjPW5ldyBrLGU9MCxnPXRoaXMuZmFjZXMubGVuZ3RoO2U8ZztlKyspe3ZhciByPXRoaXMuZmFjZXNbZV0sdj10aGlzLnZlcnRpY2VzW3IuYV0sej10aGlzLnZlcnRpY2VzW3IuYl07YS5zdWJWZWN0b3JzKHRoaXMudmVydGljZXNbci5jXSx6KTtjLnN1YlZlY3RvcnModix6KTthLmNyb3NzKGMpO2Eubm9ybWFsaXplKCk7ci5ub3JtYWwuY29weShhKX19LGNvbXB1dGVWZXJ0ZXhOb3JtYWxzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPSEwKTt2YXIgYzt2YXIgZT1BcnJheSh0aGlzLnZlcnRpY2VzLmxlbmd0aCk7dmFyIGc9MDtmb3IoYz10aGlzLnZlcnRpY2VzLmxlbmd0aDtnPApjO2crKyllW2ddPW5ldyBrO2lmKGEpe3ZhciByPW5ldyBrLHY9bmV3IGs7YT0wO2ZvcihnPXRoaXMuZmFjZXMubGVuZ3RoO2E8ZzthKyspe2M9dGhpcy5mYWNlc1thXTt2YXIgej10aGlzLnZlcnRpY2VzW2MuYV07dmFyIEU9dGhpcy52ZXJ0aWNlc1tjLmJdO3ZhciBHPXRoaXMudmVydGljZXNbYy5jXTtyLnN1YlZlY3RvcnMoRyxFKTt2LnN1YlZlY3RvcnMoeixFKTtyLmNyb3NzKHYpO2VbYy5hXS5hZGQocik7ZVtjLmJdLmFkZChyKTtlW2MuY10uYWRkKHIpfX1lbHNlIGZvcih0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpLGE9MCxnPXRoaXMuZmFjZXMubGVuZ3RoO2E8ZzthKyspYz10aGlzLmZhY2VzW2FdLGVbYy5hXS5hZGQoYy5ub3JtYWwpLGVbYy5iXS5hZGQoYy5ub3JtYWwpLGVbYy5jXS5hZGQoYy5ub3JtYWwpO2c9MDtmb3IoYz10aGlzLnZlcnRpY2VzLmxlbmd0aDtnPGM7ZysrKWVbZ10ubm9ybWFsaXplKCk7YT0wO2ZvcihnPXRoaXMuZmFjZXMubGVuZ3RoO2E8ZzthKyspYz0KdGhpcy5mYWNlc1thXSx6PWMudmVydGV4Tm9ybWFscywzPT09ei5sZW5ndGg/KHpbMF0uY29weShlW2MuYV0pLHpbMV0uY29weShlW2MuYl0pLHpbMl0uY29weShlW2MuY10pKTooelswXT1lW2MuYV0uY2xvbmUoKSx6WzFdPWVbYy5iXS5jbG9uZSgpLHpbMl09ZVtjLmNdLmNsb25lKCkpOzA8dGhpcy5mYWNlcy5sZW5ndGgmJih0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPSEwKX0sY29tcHV0ZUZsYXRWZXJ0ZXhOb3JtYWxzOmZ1bmN0aW9uKCl7dmFyIGE7dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTt2YXIgYz0wO2ZvcihhPXRoaXMuZmFjZXMubGVuZ3RoO2M8YTtjKyspe3ZhciBlPXRoaXMuZmFjZXNbY107dmFyIGc9ZS52ZXJ0ZXhOb3JtYWxzOzM9PT1nLmxlbmd0aD8oZ1swXS5jb3B5KGUubm9ybWFsKSxnWzFdLmNvcHkoZS5ub3JtYWwpLGdbMl0uY29weShlLm5vcm1hbCkpOihnWzBdPWUubm9ybWFsLmNsb25lKCksZ1sxXT1lLm5vcm1hbC5jbG9uZSgpLGdbMl09ZS5ub3JtYWwuY2xvbmUoKSl9MDwKdGhpcy5mYWNlcy5sZW5ndGgmJih0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPSEwKX0sY29tcHV0ZU1vcnBoTm9ybWFsczpmdW5jdGlvbigpe3ZhciBhLGM7dmFyIGU9MDtmb3IoYz10aGlzLmZhY2VzLmxlbmd0aDtlPGM7ZSsrKXt2YXIgZz10aGlzLmZhY2VzW2VdO2cuX19vcmlnaW5hbEZhY2VOb3JtYWw/Zy5fX29yaWdpbmFsRmFjZU5vcm1hbC5jb3B5KGcubm9ybWFsKTpnLl9fb3JpZ2luYWxGYWNlTm9ybWFsPWcubm9ybWFsLmNsb25lKCk7Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc3x8KGcuX19vcmlnaW5hbFZlcnRleE5vcm1hbHM9W10pO3ZhciByPTA7Zm9yKGE9Zy52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDtyPGE7cisrKWcuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbcl0/Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1tyXS5jb3B5KGcudmVydGV4Tm9ybWFsc1tyXSk6Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1tyXT1nLnZlcnRleE5vcm1hbHNbcl0uY2xvbmUoKX12YXIgdj1uZXcgeWE7CnYuZmFjZXM9dGhpcy5mYWNlcztyPTA7Zm9yKGE9dGhpcy5tb3JwaFRhcmdldHMubGVuZ3RoO3I8YTtyKyspe2lmKCF0aGlzLm1vcnBoTm9ybWFsc1tyXSl7dGhpcy5tb3JwaE5vcm1hbHNbcl09e307dGhpcy5tb3JwaE5vcm1hbHNbcl0uZmFjZU5vcm1hbHM9W107dGhpcy5tb3JwaE5vcm1hbHNbcl0udmVydGV4Tm9ybWFscz1bXTtnPXRoaXMubW9ycGhOb3JtYWxzW3JdLmZhY2VOb3JtYWxzO3ZhciB6PXRoaXMubW9ycGhOb3JtYWxzW3JdLnZlcnRleE5vcm1hbHM7ZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8YztlKyspe3ZhciBFPW5ldyBrO3ZhciBHPXthOm5ldyBrLGI6bmV3IGssYzpuZXcga307Zy5wdXNoKEUpO3oucHVzaChHKX19ej10aGlzLm1vcnBoTm9ybWFsc1tyXTt2LnZlcnRpY2VzPXRoaXMubW9ycGhUYXJnZXRzW3JdLnZlcnRpY2VzO3YuY29tcHV0ZUZhY2VOb3JtYWxzKCk7di5jb21wdXRlVmVydGV4Tm9ybWFscygpO2U9MDtmb3IoYz10aGlzLmZhY2VzLmxlbmd0aDtlPApjO2UrKylnPXRoaXMuZmFjZXNbZV0sRT16LmZhY2VOb3JtYWxzW2VdLEc9ei52ZXJ0ZXhOb3JtYWxzW2VdLEUuY29weShnLm5vcm1hbCksRy5hLmNvcHkoZy52ZXJ0ZXhOb3JtYWxzWzBdKSxHLmIuY29weShnLnZlcnRleE5vcm1hbHNbMV0pLEcuYy5jb3B5KGcudmVydGV4Tm9ybWFsc1syXSl9ZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8YztlKyspZz10aGlzLmZhY2VzW2VdLGcubm9ybWFsPWcuX19vcmlnaW5hbEZhY2VOb3JtYWwsZy52ZXJ0ZXhOb3JtYWxzPWcuX19vcmlnaW5hbFZlcnRleE5vcm1hbHN9LGNvbXB1dGVCb3VuZGluZ0JveDpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgdyk7dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tUG9pbnRzKHRoaXMudmVydGljZXMpfSxjb21wdXRlQm91bmRpbmdTcGhlcmU6ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Cm5ldyBGKTt0aGlzLmJvdW5kaW5nU3BoZXJlLnNldEZyb21Qb2ludHModGhpcy52ZXJ0aWNlcyl9LG1lcmdlOmZ1bmN0aW9uKGEsYyxlKXtpZihhJiZhLmlzR2VvbWV0cnkpe3ZhciBnLHI9dGhpcy52ZXJ0aWNlcy5sZW5ndGgsdj10aGlzLnZlcnRpY2VzLHo9YS52ZXJ0aWNlcyxFPXRoaXMuZmFjZXMsRz1hLmZhY2VzLEo9dGhpcy5jb2xvcnMsUD1hLmNvbG9yczt2b2lkIDA9PT1lJiYoZT0wKTt2b2lkIDAhPT1jJiYoZz0obmV3IHQpLmdldE5vcm1hbE1hdHJpeChjKSk7Zm9yKHZhciBSPTAsUz16Lmxlbmd0aDtSPFM7UisrKXt2YXIgVj16W1JdLmNsb25lKCk7dm9pZCAwIT09YyYmVi5hcHBseU1hdHJpeDQoYyk7di5wdXNoKFYpfVI9MDtmb3IoUz1QLmxlbmd0aDtSPFM7UisrKUoucHVzaChQW1JdLmNsb25lKCkpO1I9MDtmb3IoUz1HLmxlbmd0aDtSPFM7UisrKXt6PUdbUl07dmFyIFc9ei52ZXJ0ZXhOb3JtYWxzO1A9ei52ZXJ0ZXhDb2xvcnM7Sj1uZXcgSyh6LmErcix6LmIrcix6LmMrCnIpO0oubm9ybWFsLmNvcHkoei5ub3JtYWwpO3ZvaWQgMCE9PWcmJkoubm9ybWFsLmFwcGx5TWF0cml4MyhnKS5ub3JtYWxpemUoKTtjPTA7Zm9yKHY9Vy5sZW5ndGg7Yzx2O2MrKylWPVdbY10uY2xvbmUoKSx2b2lkIDAhPT1nJiZWLmFwcGx5TWF0cml4MyhnKS5ub3JtYWxpemUoKSxKLnZlcnRleE5vcm1hbHMucHVzaChWKTtKLmNvbG9yLmNvcHkoei5jb2xvcik7Yz0wO2Zvcih2PVAubGVuZ3RoO2M8djtjKyspVj1QW2NdLEoudmVydGV4Q29sb3JzLnB1c2goVi5jbG9uZSgpKTtKLm1hdGVyaWFsSW5kZXg9ei5tYXRlcmlhbEluZGV4K2U7RS5wdXNoKEopfVI9MDtmb3IoUz1hLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO1I8UztSKyspZm9yKGU9YS5mYWNlVmVydGV4VXZzW1JdLHZvaWQgMD09PXRoaXMuZmFjZVZlcnRleFV2c1tSXSYmKHRoaXMuZmFjZVZlcnRleFV2c1tSXT1bXSksYz0wLHY9ZS5sZW5ndGg7Yzx2O2MrKyl7Zz1lW2NdO3I9W107RT0wO2ZvcihHPWcubGVuZ3RoO0U8RztFKyspci5wdXNoKGdbRV0uY2xvbmUoKSk7CnRoaXMuZmFjZVZlcnRleFV2c1tSXS5wdXNoKHIpfX1lbHNlIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5HZW9tZXRyeS4iLGEpfSxtZXJnZU1lc2g6ZnVuY3Rpb24oYSl7YSYmYS5pc01lc2g/KGEubWF0cml4QXV0b1VwZGF0ZSYmYS51cGRhdGVNYXRyaXgoKSx0aGlzLm1lcmdlKGEuZ2VvbWV0cnksYS5tYXRyaXgpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuTWVzaC4iLGEpfSxtZXJnZVZlcnRpY2VzOmZ1bmN0aW9uKCl7dmFyIGE9e30sYz1bXSxlPVtdLGc9TWF0aC5wb3coMTAsNCkscjt2YXIgdj0wO2ZvcihyPXRoaXMudmVydGljZXMubGVuZ3RoO3Y8cjt2Kyspe3ZhciB6PXRoaXMudmVydGljZXNbdl07ej1NYXRoLnJvdW5kKHoueCpnKSsiXyIrTWF0aC5yb3VuZCh6LnkqZykrIl8iK01hdGgucm91bmQoei56KgpnKTt2b2lkIDA9PT1hW3pdPyhhW3pdPXYsYy5wdXNoKHRoaXMudmVydGljZXNbdl0pLGVbdl09Yy5sZW5ndGgtMSk6ZVt2XT1lW2Fbel1dfWE9W107dj0wO2ZvcihyPXRoaXMuZmFjZXMubGVuZ3RoO3Y8cjt2KyspZm9yKGc9dGhpcy5mYWNlc1t2XSxnLmE9ZVtnLmFdLGcuYj1lW2cuYl0sZy5jPWVbZy5jXSxnPVtnLmEsZy5iLGcuY10sej0wOzM+ejt6KyspaWYoZ1t6XT09PWdbKHorMSklM10pe2EucHVzaCh2KTticmVha31mb3Iodj1hLmxlbmd0aC0xOzA8PXY7di0tKWZvcihnPWFbdl0sdGhpcy5mYWNlcy5zcGxpY2UoZywxKSxlPTAscj10aGlzLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO2U8cjtlKyspdGhpcy5mYWNlVmVydGV4VXZzW2VdLnNwbGljZShnLDEpO3Y9dGhpcy52ZXJ0aWNlcy5sZW5ndGgtYy5sZW5ndGg7dGhpcy52ZXJ0aWNlcz1jO3JldHVybiB2fSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe3RoaXMudmVydGljZXM9W107Zm9yKHZhciBjPTAsZT1hLmxlbmd0aDtjPGU7YysrKXt2YXIgZz0KYVtjXTt0aGlzLnZlcnRpY2VzLnB1c2gobmV3IGsoZy54LGcueSxnLnp8fDApKX1yZXR1cm4gdGhpc30sc29ydEZhY2VzQnlNYXRlcmlhbEluZGV4OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZmFjZXMsYz1hLmxlbmd0aCxlPTA7ZTxjO2UrKylhW2VdLl9pZD1lO2Euc29ydChmdW5jdGlvbihHLEope3JldHVybiBHLm1hdGVyaWFsSW5kZXgtSi5tYXRlcmlhbEluZGV4fSk7dmFyIGc9dGhpcy5mYWNlVmVydGV4VXZzWzBdLHI9dGhpcy5mYWNlVmVydGV4VXZzWzFdLHYsejtnJiZnLmxlbmd0aD09PWMmJih2PVtdKTtyJiZyLmxlbmd0aD09PWMmJih6PVtdKTtmb3IoZT0wO2U8YztlKyspe3ZhciBFPWFbZV0uX2lkO3YmJnYucHVzaChnW0VdKTt6JiZ6LnB1c2gocltFXSl9diYmKHRoaXMuZmFjZVZlcnRleFV2c1swXT12KTt6JiYodGhpcy5mYWNlVmVydGV4VXZzWzFdPXopfSx0b0pTT046ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKG9hLHRhLEJhKXtyZXR1cm4gQmE/b2F8MTw8dGE6b2EmCn4oMTw8dGEpfWZ1bmN0aW9uIGMob2Epe3ZhciB0YT1vYS54LnRvU3RyaW5nKCkrb2EueS50b1N0cmluZygpK29hLnoudG9TdHJpbmcoKTtpZih2b2lkIDAhPT1KW3RhXSlyZXR1cm4gSlt0YV07Slt0YV09Ry5sZW5ndGgvMztHLnB1c2gob2EueCxvYS55LG9hLnopO3JldHVybiBKW3RhXX1mdW5jdGlvbiBlKG9hKXt2YXIgdGE9b2Euci50b1N0cmluZygpK29hLmcudG9TdHJpbmcoKStvYS5iLnRvU3RyaW5nKCk7aWYodm9pZCAwIT09Ult0YV0pcmV0dXJuIFJbdGFdO1JbdGFdPVAubGVuZ3RoO1AucHVzaChvYS5nZXRIZXgoKSk7cmV0dXJuIFJbdGFdfWZ1bmN0aW9uIGcob2Epe3ZhciB0YT1vYS54LnRvU3RyaW5nKCkrb2EueS50b1N0cmluZygpO2lmKHZvaWQgMCE9PVZbdGFdKXJldHVybiBWW3RhXTtWW3RhXT1TLmxlbmd0aC8yO1MucHVzaChvYS54LG9hLnkpO3JldHVybiBWW3RhXX12YXIgcj17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6Ikdlb21ldHJ5IixnZW5lcmF0b3I6Ikdlb21ldHJ5LnRvSlNPTiJ9fTsKci51dWlkPXRoaXMudXVpZDtyLnR5cGU9dGhpcy50eXBlOyIiIT09dGhpcy5uYW1lJiYoci5uYW1lPXRoaXMubmFtZSk7aWYodm9pZCAwIT09dGhpcy5wYXJhbWV0ZXJzKXt2YXIgdj10aGlzLnBhcmFtZXRlcnMsejtmb3IoeiBpbiB2KXZvaWQgMCE9PXZbel0mJihyW3pdPXZbel0pO3JldHVybiByfXY9W107Zm9yKHo9MDt6PHRoaXMudmVydGljZXMubGVuZ3RoO3orKyl7dmFyIEU9dGhpcy52ZXJ0aWNlc1t6XTt2LnB1c2goRS54LEUueSxFLnopfUU9W107dmFyIEc9W10sSj17fSxQPVtdLFI9e30sUz1bXSxWPXt9O2Zvcih6PTA7ejx0aGlzLmZhY2VzLmxlbmd0aDt6Kyspe3ZhciBXPXRoaXMuZmFjZXNbel0saGE9dm9pZCAwIT09dGhpcy5mYWNlVmVydGV4VXZzWzBdW3pdLGZhPTA8Vy5ub3JtYWwubGVuZ3RoKCkscmE9MDxXLnZlcnRleE5vcm1hbHMubGVuZ3RoLHBhPTEhPT1XLmNvbG9yLnJ8fDEhPT1XLmNvbG9yLmd8fDEhPT1XLmNvbG9yLmIscWE9MDxXLnZlcnRleENvbG9ycy5sZW5ndGgsCnVhPTA7dWE9YSh1YSwwLDApO3VhPWEodWEsMSwhMCk7dWE9YSh1YSwyLCExKTt1YT1hKHVhLDMsaGEpO3VhPWEodWEsNCxmYSk7dWE9YSh1YSw1LHJhKTt1YT1hKHVhLDYscGEpO3VhPWEodWEsNyxxYSk7RS5wdXNoKHVhKTtFLnB1c2goVy5hLFcuYixXLmMpO0UucHVzaChXLm1hdGVyaWFsSW5kZXgpO2hhJiYoaGE9dGhpcy5mYWNlVmVydGV4VXZzWzBdW3pdLEUucHVzaChnKGhhWzBdKSxnKGhhWzFdKSxnKGhhWzJdKSkpO2ZhJiZFLnB1c2goYyhXLm5vcm1hbCkpO3JhJiYoZmE9Vy52ZXJ0ZXhOb3JtYWxzLEUucHVzaChjKGZhWzBdKSxjKGZhWzFdKSxjKGZhWzJdKSkpO3BhJiZFLnB1c2goZShXLmNvbG9yKSk7cWEmJihXPVcudmVydGV4Q29sb3JzLEUucHVzaChlKFdbMF0pLGUoV1sxXSksZShXWzJdKSkpfXIuZGF0YT17fTtyLmRhdGEudmVydGljZXM9djtyLmRhdGEubm9ybWFscz1HOzA8UC5sZW5ndGgmJihyLmRhdGEuY29sb3JzPVApOzA8Uy5sZW5ndGgmJihyLmRhdGEudXZzPQpbU10pO3IuZGF0YS5mYWNlcz1FO3JldHVybiByfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgeWEpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGMsZSxnO3RoaXMudmVydGljZXM9W107dGhpcy5jb2xvcnM9W107dGhpcy5mYWNlcz1bXTt0aGlzLmZhY2VWZXJ0ZXhVdnM9W1tdXTt0aGlzLm1vcnBoVGFyZ2V0cz1bXTt0aGlzLm1vcnBoTm9ybWFscz1bXTt0aGlzLnNraW5XZWlnaHRzPVtdO3RoaXMuc2tpbkluZGljZXM9W107dGhpcy5saW5lRGlzdGFuY2VzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMubmFtZT1hLm5hbWU7dmFyIHI9YS52ZXJ0aWNlczt2YXIgdj0wO2ZvcihjPXIubGVuZ3RoO3Y8Yzt2KyspdGhpcy52ZXJ0aWNlcy5wdXNoKHJbdl0uY2xvbmUoKSk7cj1hLmNvbG9yczt2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLmNvbG9ycy5wdXNoKHJbdl0uY2xvbmUoKSk7cj1hLmZhY2VzO3Y9MDtmb3IoYz0Kci5sZW5ndGg7djxjO3YrKyl0aGlzLmZhY2VzLnB1c2goclt2XS5jbG9uZSgpKTt2PTA7Zm9yKGM9YS5mYWNlVmVydGV4VXZzLmxlbmd0aDt2PGM7disrKXt2YXIgej1hLmZhY2VWZXJ0ZXhVdnNbdl07dm9pZCAwPT09dGhpcy5mYWNlVmVydGV4VXZzW3ZdJiYodGhpcy5mYWNlVmVydGV4VXZzW3ZdPVtdKTtyPTA7Zm9yKGU9ei5sZW5ndGg7cjxlO3IrKyl7dmFyIEU9eltyXSxHPVtdO3ZhciBKPTA7Zm9yKGc9RS5sZW5ndGg7SjxnO0orKylHLnB1c2goRVtKXS5jbG9uZSgpKTt0aGlzLmZhY2VWZXJ0ZXhVdnNbdl0ucHVzaChHKX19Sj1hLm1vcnBoVGFyZ2V0czt2PTA7Zm9yKGM9Si5sZW5ndGg7djxjO3YrKyl7Zz17fTtnLm5hbWU9Slt2XS5uYW1lO2lmKHZvaWQgMCE9PUpbdl0udmVydGljZXMpZm9yKGcudmVydGljZXM9W10scj0wLGU9Slt2XS52ZXJ0aWNlcy5sZW5ndGg7cjxlO3IrKylnLnZlcnRpY2VzLnB1c2goSlt2XS52ZXJ0aWNlc1tyXS5jbG9uZSgpKTtpZih2b2lkIDAhPT1KW3ZdLm5vcm1hbHMpZm9yKGcubm9ybWFscz0KW10scj0wLGU9Slt2XS5ub3JtYWxzLmxlbmd0aDtyPGU7cisrKWcubm9ybWFscy5wdXNoKEpbdl0ubm9ybWFsc1tyXS5jbG9uZSgpKTt0aGlzLm1vcnBoVGFyZ2V0cy5wdXNoKGcpfUo9YS5tb3JwaE5vcm1hbHM7dj0wO2ZvcihjPUoubGVuZ3RoO3Y8Yzt2Kyspe2c9e307aWYodm9pZCAwIT09Slt2XS52ZXJ0ZXhOb3JtYWxzKWZvcihnLnZlcnRleE5vcm1hbHM9W10scj0wLGU9Slt2XS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDtyPGU7cisrKXo9Slt2XS52ZXJ0ZXhOb3JtYWxzW3JdLEU9e30sRS5hPXouYS5jbG9uZSgpLEUuYj16LmIuY2xvbmUoKSxFLmM9ei5jLmNsb25lKCksZy52ZXJ0ZXhOb3JtYWxzLnB1c2goRSk7aWYodm9pZCAwIT09Slt2XS5mYWNlTm9ybWFscylmb3IoZy5mYWNlTm9ybWFscz1bXSxyPTAsZT1KW3ZdLmZhY2VOb3JtYWxzLmxlbmd0aDtyPGU7cisrKWcuZmFjZU5vcm1hbHMucHVzaChKW3ZdLmZhY2VOb3JtYWxzW3JdLmNsb25lKCkpO3RoaXMubW9ycGhOb3JtYWxzLnB1c2goZyl9cj0KYS5za2luV2VpZ2h0czt2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLnNraW5XZWlnaHRzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEuc2tpbkluZGljZXM7dj0wO2ZvcihjPXIubGVuZ3RoO3Y8Yzt2KyspdGhpcy5za2luSW5kaWNlcy5wdXNoKHJbdl0uY2xvbmUoKSk7cj1hLmxpbmVEaXN0YW5jZXM7dj0wO2ZvcihjPXIubGVuZ3RoO3Y8Yzt2KyspdGhpcy5saW5lRGlzdGFuY2VzLnB1c2goclt2XSk7dj1hLmJvdW5kaW5nQm94O251bGwhPT12JiYodGhpcy5ib3VuZGluZ0JveD12LmNsb25lKCkpO3Y9YS5ib3VuZGluZ1NwaGVyZTtudWxsIT09diYmKHRoaXMuYm91bmRpbmdTcGhlcmU9di5jbG9uZSgpKTt0aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZT1hLmVsZW1lbnRzTmVlZFVwZGF0ZTt0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT1hLnZlcnRpY2VzTmVlZFVwZGF0ZTt0aGlzLnV2c05lZWRVcGRhdGU9YS51dnNOZWVkVXBkYXRlO3RoaXMubm9ybWFsc05lZWRVcGRhdGU9YS5ub3JtYWxzTmVlZFVwZGF0ZTsKdGhpcy5jb2xvcnNOZWVkVXBkYXRlPWEuY29sb3JzTmVlZFVwZGF0ZTt0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlPWEubGluZURpc3RhbmNlc05lZWRVcGRhdGU7dGhpcy5ncm91cHNOZWVkVXBkYXRlPWEuZ3JvdXBzTmVlZFVwZGF0ZTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTtTYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1NhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TYTtYYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1hhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YYTt2YXIgRm09e2Nsb25lOnViLG1lcmdlOkJifTtxYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7cWIucHJvdG90eXBlLmNvbnN0cnVjdG9yPXFiO3FiLnByb3RvdHlwZS5pc1NoYWRlck1hdGVyaWFsPSEwO3FiLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphKTt0aGlzLmZyYWdtZW50U2hhZGVyPWEuZnJhZ21lbnRTaGFkZXI7dGhpcy52ZXJ0ZXhTaGFkZXI9YS52ZXJ0ZXhTaGFkZXI7dGhpcy51bmlmb3Jtcz11YihhLnVuaWZvcm1zKTt0aGlzLmRlZmluZXM9T2JqZWN0LmFzc2lnbih7fSxhLmRlZmluZXMpO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMubGlnaHRzPWEubGlnaHRzO3RoaXMuY2xpcHBpbmc9YS5jbGlwcGluZzt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7dGhpcy5leHRlbnNpb25zPWEuZXh0ZW5zaW9ucztyZXR1cm4gdGhpc307cWIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbihhKXt2YXIgYz1NLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2MudW5pZm9ybXM9e307Zm9yKHZhciBlIGluIHRoaXMudW5pZm9ybXMpe3ZhciBnPQp0aGlzLnVuaWZvcm1zW2VdLnZhbHVlO2MudW5pZm9ybXNbZV09ZyYmZy5pc1RleHR1cmU/e3R5cGU6InQiLHZhbHVlOmcudG9KU09OKGEpLnV1aWR9OmcmJmcuaXNDb2xvcj97dHlwZToiYyIsdmFsdWU6Zy5nZXRIZXgoKX06ZyYmZy5pc1ZlY3RvcjI/e3R5cGU6InYyIix2YWx1ZTpnLnRvQXJyYXkoKX06ZyYmZy5pc1ZlY3RvcjM/e3R5cGU6InYzIix2YWx1ZTpnLnRvQXJyYXkoKX06ZyYmZy5pc1ZlY3RvcjQ/e3R5cGU6InY0Iix2YWx1ZTpnLnRvQXJyYXkoKX06ZyYmZy5pc01hdHJpeDM/e3R5cGU6Im0zIix2YWx1ZTpnLnRvQXJyYXkoKX06ZyYmZy5pc01hdHJpeDQ/e3R5cGU6Im00Iix2YWx1ZTpnLnRvQXJyYXkoKX06e3ZhbHVlOmd9fTA8T2JqZWN0LmtleXModGhpcy5kZWZpbmVzKS5sZW5ndGgmJihjLmRlZmluZXM9dGhpcy5kZWZpbmVzKTtjLnZlcnRleFNoYWRlcj10aGlzLnZlcnRleFNoYWRlcjtjLmZyYWdtZW50U2hhZGVyPXRoaXMuZnJhZ21lbnRTaGFkZXI7YT17fTtmb3IodmFyIHIgaW4gdGhpcy5leHRlbnNpb25zKSEwPT09CnRoaXMuZXh0ZW5zaW9uc1tyXSYmKGFbcl09ITApOzA8T2JqZWN0LmtleXMoYSkubGVuZ3RoJiYoYy5leHRlbnNpb25zPWEpO3JldHVybiBjfTt6Yi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6emIsaXNDYW1lcmE6ITAsY29weTpmdW5jdGlvbihhLGMpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEsYyk7dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weShhLm1hdHJpeFdvcmxkSW52ZXJzZSk7dGhpcy5wcm9qZWN0aW9uTWF0cml4LmNvcHkoYS5wcm9qZWN0aW9uTWF0cml4KTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSk7cmV0dXJuIHRoaXN9LGdldFdvcmxkRGlyZWN0aW9uOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkNhbWVyYTogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLAphPW5ldyBrKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt2YXIgYz10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiBhLnNldCgtY1s4XSwtY1s5XSwtY1sxMF0pLm5vcm1hbGl6ZSgpfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSk7dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSk7dmIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh6Yi5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp2Yixpc1BlcnNwZWN0aXZlQ2FtZXJhOiEwLGNvcHk6ZnVuY3Rpb24oYSxjKXt6Yi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSxjKTt0aGlzLmZvdj1hLmZvdjt0aGlzLnpvb209YS56b29tO3RoaXMubmVhcj1hLm5lYXI7dGhpcy5mYXI9CmEuZmFyO3RoaXMuZm9jdXM9YS5mb2N1czt0aGlzLmFzcGVjdD1hLmFzcGVjdDt0aGlzLnZpZXc9bnVsbD09PWEudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sYS52aWV3KTt0aGlzLmZpbG1HYXVnZT1hLmZpbG1HYXVnZTt0aGlzLmZpbG1PZmZzZXQ9YS5maWxtT2Zmc2V0O3JldHVybiB0aGlzfSxzZXRGb2NhbExlbmd0aDpmdW5jdGlvbihhKXt0aGlzLmZvdj0yKmhiLlJBRDJERUcqTWF0aC5hdGFuKC41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL2EpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxnZXRGb2NhbExlbmd0aDpmdW5jdGlvbigpe3JldHVybi41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL01hdGgudGFuKC41KmhiLkRFRzJSQUQqdGhpcy5mb3YpfSxnZXRFZmZlY3RpdmVGT1Y6ZnVuY3Rpb24oKXtyZXR1cm4gMipoYi5SQUQyREVHKk1hdGguYXRhbihNYXRoLnRhbiguNSpoYi5ERUcyUkFEKnRoaXMuZm92KS90aGlzLnpvb20pfSxnZXRGaWxtV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UqCk1hdGgubWluKHRoaXMuYXNwZWN0LDEpfSxnZXRGaWxtSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlL01hdGgubWF4KHRoaXMuYXNwZWN0LDEpfSxzZXRWaWV3T2Zmc2V0OmZ1bmN0aW9uKGEsYyxlLGcscix2KXt0aGlzLmFzcGVjdD1hL2M7bnVsbD09PXRoaXMudmlldyYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLG9mZnNldFk6MCx3aWR0aDoxLGhlaWdodDoxfSk7dGhpcy52aWV3LmVuYWJsZWQ9ITA7dGhpcy52aWV3LmZ1bGxXaWR0aD1hO3RoaXMudmlldy5mdWxsSGVpZ2h0PWM7dGhpcy52aWV3Lm9mZnNldFg9ZTt0aGlzLnZpZXcub2Zmc2V0WT1nO3RoaXMudmlldy53aWR0aD1yO3RoaXMudmlldy5oZWlnaHQ9djt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX0sY2xlYXJWaWV3T2Zmc2V0OmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMudmlldyYmKHRoaXMudmlldy5lbmFibGVkPSExKTt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX0sCnVwZGF0ZVByb2plY3Rpb25NYXRyaXg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5lYXIsYz1hKk1hdGgudGFuKC41KmhiLkRFRzJSQUQqdGhpcy5mb3YpL3RoaXMuem9vbSxlPTIqYyxnPXRoaXMuYXNwZWN0KmUscj0tLjUqZyx2PXRoaXMudmlldztpZihudWxsIT09dGhpcy52aWV3JiZ0aGlzLnZpZXcuZW5hYmxlZCl7dmFyIHo9di5mdWxsV2lkdGgsRT12LmZ1bGxIZWlnaHQ7cis9di5vZmZzZXRYKmcvejtjLT12Lm9mZnNldFkqZS9FO2cqPXYud2lkdGgvejtlKj12LmhlaWdodC9FfXY9dGhpcy5maWxtT2Zmc2V0OzAhPT12JiYocis9YSp2L3RoaXMuZ2V0RmlsbVdpZHRoKCkpO3RoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUocixyK2csYyxjLWUsYSx0aGlzLmZhcik7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMucHJvamVjdGlvbk1hdHJpeCl9LHRvSlNPTjpmdW5jdGlvbihhKXthPUEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsCmEpO2Eub2JqZWN0LmZvdj10aGlzLmZvdjthLm9iamVjdC56b29tPXRoaXMuem9vbTthLm9iamVjdC5uZWFyPXRoaXMubmVhcjthLm9iamVjdC5mYXI9dGhpcy5mYXI7YS5vYmplY3QuZm9jdXM9dGhpcy5mb2N1czthLm9iamVjdC5hc3BlY3Q9dGhpcy5hc3BlY3Q7bnVsbCE9PXRoaXMudmlldyYmKGEub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKTthLm9iamVjdC5maWxtR2F1Z2U9dGhpcy5maWxtR2F1Z2U7YS5vYmplY3QuZmlsbU9mZnNldD10aGlzLmZpbG1PZmZzZXQ7cmV0dXJuIGF9fSk7R2IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO0diLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1HYjtOYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtLnByb3RvdHlwZSk7TmIucHJvdG90eXBlLmNvbnN0cnVjdG9yPU5iO05iLnByb3RvdHlwZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT0hMDtOYi5wcm90b3R5cGUuZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmU9CmZ1bmN0aW9uKGEsYyl7dGhpcy50ZXh0dXJlLnR5cGU9Yy50eXBlO3RoaXMudGV4dHVyZS5mb3JtYXQ9Yy5mb3JtYXQ7dGhpcy50ZXh0dXJlLmVuY29kaW5nPWMuZW5jb2Rpbmc7dmFyIGU9bmV3IHksZz1uZXcgcWIoe3R5cGU6IkN1YmVtYXBGcm9tRXF1aXJlY3QiLHVuaWZvcm1zOnViKHt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSksdmVydGV4U2hhZGVyOiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xudmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XG59XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcbn0iLApmcmFnbWVudFNoYWRlcjoidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcbnZvaWQgbWFpbigpIHtcblx0dmVjMyBkaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWO1xuXHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIGRpcmVjdGlvbi55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHNhbXBsZVVWLnggXHgzZCBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcbn0iLHNpZGU6MSxibGVuZGluZzowfSk7Zy51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWU9YzsKYz1uZXcgeGEobmV3IFhhKDUsNSw1KSxnKTtlLmFkZChjKTtnPW5ldyBHYigxLDEwLDEpO2cucmVuZGVyVGFyZ2V0PXRoaXM7Zy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lPSJDdWJlQ2FtZXJhVGV4dHVyZSI7Zy51cGRhdGUoYSxlKTtjLmdlb21ldHJ5LmRpc3Bvc2UoKTtjLm1hdGVyaWFsLmRpc3Bvc2UoKTtyZXR1cm4gdGhpc307QWIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0FiLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BYjtBYi5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZT0hMDt2YXIgSmk9bmV3IGssR209bmV3IGssSG09bmV3IHQ7T2JqZWN0LmFzc2lnbihIYi5wcm90b3R5cGUse2lzUGxhbmU6ITAsc2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5ub3JtYWwuY29weShhKTt0aGlzLmNvbnN0YW50PWM7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudHM6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5ub3JtYWwuc2V0KGEsYyxlKTt0aGlzLmNvbnN0YW50PWc7cmV0dXJuIHRoaXN9LApzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludDpmdW5jdGlvbihhLGMpe3RoaXMubm9ybWFsLmNvcHkoYSk7dGhpcy5jb25zdGFudD0tYy5kb3QodGhpcy5ub3JtYWwpO3JldHVybiB0aGlzfSxzZXRGcm9tQ29wbGFuYXJQb2ludHM6ZnVuY3Rpb24oYSxjLGUpe2M9Smkuc3ViVmVjdG9ycyhlLGMpLmNyb3NzKEdtLnN1YlZlY3RvcnMoYSxjKSkubm9ybWFsaXplKCk7dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChjLGEpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm5vcm1hbC5jb3B5KGEubm9ybWFsKTt0aGlzLmNvbnN0YW50PWEuY29uc3RhbnQ7cmV0dXJuIHRoaXN9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7dGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoYSk7dGhpcy5jb25zdGFudCo9YTtyZXR1cm4gdGhpc30sCm5lZ2F0ZTpmdW5jdGlvbigpe3RoaXMuY29uc3RhbnQqPS0xO3RoaXMubm9ybWFsLm5lZ2F0ZSgpO3JldHVybiB0aGlzfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9ybWFsLmRvdChhKSt0aGlzLmNvbnN0YW50fSxkaXN0YW5jZVRvU3BoZXJlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludChhLmNlbnRlciktYS5yYWRpdXN9LHByb2plY3RQb2ludDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLlBsYW5lOiAucHJvamVjdFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3JldHVybiBjLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmRpc3RhbmNlVG9Qb2ludChhKSkuYWRkKGEpfSxpbnRlcnNlY3RMaW5lOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5pbnRlcnNlY3RMaW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLApjPW5ldyBrKTt2YXIgZT1hLmRlbHRhKEppKSxnPXRoaXMubm9ybWFsLmRvdChlKTtpZigwPT09Zyl7aWYoMD09PXRoaXMuZGlzdGFuY2VUb1BvaW50KGEuc3RhcnQpKXJldHVybiBjLmNvcHkoYS5zdGFydCl9ZWxzZSBpZihnPS0oYS5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL2csISgwPmd8fDE8ZykpcmV0dXJuIGMuY29weShlKS5tdWx0aXBseVNjYWxhcihnKS5hZGQoYS5zdGFydCl9LGludGVyc2VjdHNMaW5lOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZGlzdGFuY2VUb1BvaW50KGEuc3RhcnQpO2E9dGhpcy5kaXN0YW5jZVRvUG9pbnQoYS5lbmQpO3JldHVybiAwPmMmJjA8YXx8MD5hJiYwPGN9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW50ZXJzZWN0c1BsYW5lKHRoaXMpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmludGVyc2VjdHNQbGFuZSh0aGlzKX0sY29wbGFuYXJQb2ludDpmdW5jdGlvbihhKXt2b2lkIDA9PT0KYSYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3JldHVybiBhLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEsYyl7Yz1jfHxIbS5nZXROb3JtYWxNYXRyaXgoYSk7YT10aGlzLmNvcGxhbmFyUG9pbnQoSmkpLmFwcGx5TWF0cml4NChhKTtjPXRoaXMubm9ybWFsLmFwcGx5TWF0cml4MyhjKS5ub3JtYWxpemUoKTt0aGlzLmNvbnN0YW50PS1hLmRvdChjKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEpe3RoaXMuY29uc3RhbnQtPWEuZG90KHRoaXMubm9ybWFsKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZhLmNvbnN0YW50PT09dGhpcy5jb25zdGFudH19KTt2YXIgbWY9bmV3IEYscGg9bmV3IGs7T2JqZWN0LmFzc2lnbihpYy5wcm90b3R5cGUsCntzZXQ6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3ZhciB6PXRoaXMucGxhbmVzO3pbMF0uY29weShhKTt6WzFdLmNvcHkoYyk7elsyXS5jb3B5KGUpO3pbM10uY29weShnKTt6WzRdLmNvcHkocik7els1XS5jb3B5KHYpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5wbGFuZXMsZT0wOzY+ZTtlKyspY1tlXS5jb3B5KGEucGxhbmVzW2VdKTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBsYW5lcyxlPWEuZWxlbWVudHM7YT1lWzBdO3ZhciBnPWVbMV0scj1lWzJdLHY9ZVszXSx6PWVbNF0sRT1lWzVdLEc9ZVs2XSxKPWVbN10sUD1lWzhdLFI9ZVs5XSxTPWVbMTBdLFY9ZVsxMV0sVz1lWzEyXSxoYT1lWzEzXSxmYT1lWzE0XTtlPWVbMTVdO2NbMF0uc2V0Q29tcG9uZW50cyh2LWEsSi16LFYtUCxlLVcpLm5vcm1hbGl6ZSgpOwpjWzFdLnNldENvbXBvbmVudHModithLEoreixWK1AsZStXKS5ub3JtYWxpemUoKTtjWzJdLnNldENvbXBvbmVudHModitnLEorRSxWK1IsZStoYSkubm9ybWFsaXplKCk7Y1szXS5zZXRDb21wb25lbnRzKHYtZyxKLUUsVi1SLGUtaGEpLm5vcm1hbGl6ZSgpO2NbNF0uc2V0Q29tcG9uZW50cyh2LXIsSi1HLFYtUyxlLWZhKS5ub3JtYWxpemUoKTtjWzVdLnNldENvbXBvbmVudHModityLEorRyxWK1MsZStmYSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXN9LGludGVyc2VjdHNPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGM9YS5nZW9tZXRyeTtudWxsPT09Yy5ib3VuZGluZ1NwaGVyZSYmYy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTttZi5jb3B5KGMuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NChhLm1hdHJpeFdvcmxkKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKG1mKX0saW50ZXJzZWN0c1Nwcml0ZTpmdW5jdGlvbihhKXttZi5jZW50ZXIuc2V0KDAsMCwwKTttZi5yYWRpdXM9Ci43MDcxMDY3ODExODY1NDc2O21mLmFwcGx5TWF0cml4NChhLm1hdHJpeFdvcmxkKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKG1mKX0saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBsYW5lcyxlPWEuY2VudGVyO2E9LWEucmFkaXVzO2Zvcih2YXIgZz0wOzY+ZztnKyspaWYoY1tnXS5kaXN0YW5jZVRvUG9pbnQoZSk8YSlyZXR1cm4hMTtyZXR1cm4hMH0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5wbGFuZXMsZT0wOzY+ZTtlKyspe3ZhciBnPWNbZV07cGgueD0wPGcubm9ybWFsLng/YS5tYXgueDphLm1pbi54O3BoLnk9MDxnLm5vcm1hbC55P2EubWF4Lnk6YS5taW4ueTtwaC56PTA8Zy5ub3JtYWwuej9hLm1heC56OmEubWluLno7aWYoMD5nLmRpc3RhbmNlVG9Qb2ludChwaCkpcmV0dXJuITF9cmV0dXJuITB9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMucGxhbmVzLGU9MDs2PmU7ZSsrKWlmKDA+CmNbZV0uZGlzdGFuY2VUb1BvaW50KGEpKXJldHVybiExO3JldHVybiEwfX0pO3ZhciByYj17YWxwaGFtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0ZGlmZnVzZUNvbG9yLmEgKlx4M2QgdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcbiNlbmRpZiIsYWxwaGFtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcbiNlbmRpZiIsYWxwaGF0ZXN0X2ZyYWdtZW50OiIjaWZkZWYgQUxQSEFURVNUXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgXHgzYyBBTFBIQVRFU1QgKSBkaXNjYXJkO1xuI2VuZGlmIixhb21hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uIFx4M2QgKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqXHgzZCBhbWJpZW50T2NjbHVzaW9uO1xuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIFx4MjZceDI2IGRlZmluZWQoIFNUQU5EQVJEIClcblx0XHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqXHgzZCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmFvbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQU9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYW9NYXA7XG5cdHVuaWZvcm0gZmxvYXQgYW9NYXBJbnRlbnNpdHk7XG4jZW5kaWYiLGJlZ2luX3ZlcnRleDoidmVjMyB0cmFuc2Zvcm1lZCBceDNkIHZlYzMoIHBvc2l0aW9uICk7IixiZWdpbm5vcm1hbF92ZXJ0ZXg6InZlYzMgb2JqZWN0Tm9ybWFsIFx4M2QgdmVjMyggbm9ybWFsICk7XG4jaWZkZWYgVVNFX1RBTkdFTlRcblx0dmVjMyBvYmplY3RUYW5nZW50IFx4M2QgdmVjMyggdGFuZ2VudC54eXogKTtcbiNlbmRpZiIsYnNkZnM6InZlYzIgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRjb25zdCB2ZWM0IGMwIFx4M2QgdmVjNCggLSAxLCAtIDAuMDI3NSwgLSAwLjU3MiwgMC4wMjIgKTtcblx0Y29uc3QgdmVjNCBjMSBceDNkIHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7XG5cdHZlYzQgciBceDNkIHJvdWdobmVzcyAqIGMwICsgYzE7XG5cdGZsb2F0IGEwMDQgXHgzZCBtaW4oIHIueCAqIHIueCwgZXhwMiggLSA5LjI4ICogZG90TlYgKSApICogci54ICsgci55O1xuXHRyZXR1cm4gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xufVxuZmxvYXQgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgY3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XG4jaWYgZGVmaW5lZCAoIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMgKVxuXHRmbG9hdCBkaXN0YW5jZUZhbGxvZmYgXHgzZCAxLjAgLyBtYXgoIHBvdyggbGlnaHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7XG5cdGlmKCBjdXRvZmZEaXN0YW5jZSBceDNlIDAuMCApIHtcblx0XHRkaXN0YW5jZUZhbGxvZmYgKlx4M2QgcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcblx0fVxuXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmO1xuI2Vsc2Vcblx0aWYoIGN1dG9mZkRpc3RhbmNlIFx4M2UgMC4wIFx4MjZceDI2IGRlY2F5RXhwb25lbnQgXHgzZSAwLjAgKSB7XG5cdFx0cmV0dXJuIHBvdyggc2F0dXJhdGUoIC1saWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApO1xuXHR9XG5cdHJldHVybiAxLjA7XG4jZW5kaWZcbn1cbnZlYzMgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjtcbn1cbnZlYzMgRl9TY2hsaWNrKCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IGRvdExIICkge1xuXHRmbG9hdCBmcmVzbmVsIFx4M2QgZXhwMiggKCAtNS41NTQ3MyAqIGRvdExIIC0gNi45ODMxNiApICogZG90TEggKTtcblx0cmV0dXJuICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogZnJlc25lbCArIHNwZWN1bGFyQ29sb3I7XG59XG52ZWMzIEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIGNvbnN0IGluIHZlYzMgRjAsIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGZyZXNuZWwgXHgzZCBleHAyKCAoIC01LjU1NDczICogZG90TlYgLSA2Ljk4MzE2ICkgKiBkb3ROViApO1xuXHR2ZWMzIEZyIFx4M2QgbWF4KCB2ZWMzKCAxLjAgLSByb3VnaG5lc3MgKSwgRjAgKSAtIEYwO1xuXHRyZXR1cm4gRnIgKiBmcmVzbmVsICsgRjA7XG59XG5mbG9hdCBHX0dHWF9TbWl0aCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcblx0ZmxvYXQgYTIgXHgzZCBwb3cyKCBhbHBoYSApO1xuXHRmbG9hdCBnbCBceDNkIGRvdE5MICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdGZsb2F0IGd2IFx4M2QgZG90TlYgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xufVxuZmxvYXQgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGd2IFx4M2QgZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0ZmxvYXQgZ2wgXHgzZCBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApO1xuXHRyZXR1cm4gMC41IC8gbWF4KCBndiArIGdsLCBFUFNJTE9OICk7XG59XG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGRlbm9tIFx4M2QgcG93MiggZG90TkggKSAqICggYTIgLSAxLjAgKSArIDEuMDtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBhbHBoYSBceDNkIHBvdzIoIHJvdWdobmVzcyApO1xuXHR2ZWMzIGhhbGZEaXIgXHgzZCBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgdmlld0RpciApO1xuXHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdGZsb2F0IGRvdE5IIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggXHgzZCBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcblx0ZmxvYXQgRyBceDNkIEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xuXHRmbG9hdCBEIFx4M2QgRF9HR1goIGFscGhhLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRjb25zdCBmbG9hdCBMVVRfU0laRSAgXHgzZCA2NC4wO1xuXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgXHgzZCAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcblx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgIFx4M2QgMC41IC8gTFVUX1NJWkU7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggTiwgViApICk7XG5cdHZlYzIgdXYgXHgzZCB2ZWMyKCByb3VnaG5lc3MsIHNxcnQoIDEuMCAtIGRvdE5WICkgKTtcblx0dXYgXHgzZCB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xuXHRyZXR1cm4gdXY7XG59XG5mbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiApIHtcblx0ZmxvYXQgbCBceDNkIGxlbmd0aCggZiApO1xuXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XG59XG52ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHtcblx0ZmxvYXQgeCBceDNkIGRvdCggdjEsIHYyICk7XG5cdGZsb2F0IHkgXHgzZCBhYnMoIHggKTtcblx0ZmxvYXQgYSBceDNkIDAuODU0Mzk4NSArICggMC40OTY1MTU1ICsgMC4wMTQ1MjA2ICogeSApICogeTtcblx0ZmxvYXQgYiBceDNkIDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcblx0ZmxvYXQgdiBceDNkIGEgLyBiO1xuXHRmbG9hdCB0aGV0YV9zaW50aGV0YSBceDNkICggeCBceDNlIDAuMCApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCBtYXgoIDEuMCAtIHggKiB4LCAxZS03ICkgKSAtIHY7XG5cdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcbn1cbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xuXHR2ZWMzIHYxIFx4M2QgcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIHYyIFx4M2QgcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIGxpZ2h0Tm9ybWFsIFx4M2QgY3Jvc3MoIHYxLCB2MiApO1xuXHRpZiggZG90KCBsaWdodE5vcm1hbCwgUCAtIHJlY3RDb29yZHNbIDAgXSApIFx4M2MgMC4wICkgcmV0dXJuIHZlYzMoIDAuMCApO1xuXHR2ZWMzIFQxLCBUMjtcblx0VDEgXHgzZCBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcblx0VDIgXHgzZCAtIGNyb3NzKCBOLCBUMSApO1xuXHRtYXQzIG1hdCBceDNkIG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xuXHR2ZWMzIGNvb3Jkc1sgNCBdO1xuXHRjb29yZHNbIDAgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMCBdIC0gUCApO1xuXHRjb29yZHNbIDEgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xuXHRjb29yZHNbIDIgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xuXHRjb29yZHNbIDMgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMyBdIC0gUCApO1xuXHRjb29yZHNbIDAgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcblx0Y29vcmRzWyAxIF0gXHgzZCBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XG5cdGNvb3Jkc1sgMiBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDIgXSApO1xuXHRjb29yZHNbIDMgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcblx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDAgXSwgY29vcmRzWyAxIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICtceDNkIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDMgXSwgY29vcmRzWyAwIF0gKTtcblx0ZmxvYXQgcmVzdWx0IFx4M2QgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XG5cdHJldHVybiB2ZWMzKCByZXN1bHQgKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdHZlYzIgYnJkZiBceDNkIGludGVncmF0ZVNwZWN1bGFyQlJERiggZG90TlYsIHJvdWdobmVzcyApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIGJyZGYueCArIGJyZGYueTtcbn1cbnZvaWQgQlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkge1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIHNwZWN1bGFyQ29sb3IsIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMiBicmRmIFx4M2QgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHZlYzMgRnNzRXNzIFx4M2QgRiAqIGJyZGYueCArIGJyZGYueTtcblx0ZmxvYXQgRXNzIFx4M2QgYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFbXMgXHgzZCAxLjAgLSBFc3M7XG5cdHZlYzMgRmF2ZyBceDNkIHNwZWN1bGFyQ29sb3IgKyAoIDEuMCAtIHNwZWN1bGFyQ29sb3IgKSAqIDAuMDQ3NjE5O1x0dmVjMyBGbXMgXHgzZCBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7XG5cdHNpbmdsZVNjYXR0ZXIgK1x4M2QgRnNzRXNzO1xuXHRtdWx0aVNjYXR0ZXIgK1x4M2QgRm1zICogRW1zO1xufVxuZmxvYXQgR19CbGlublBob25nX0ltcGxpY2l0KCApIHtcblx0cmV0dXJuIDAuMjU7XG59XG5mbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNoaW5pbmVzcyApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XG5cdHZlYzMgaGFsZkRpciBceDNkIG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5IIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggXHgzZCBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcblx0ZmxvYXQgRyBceDNkIEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTtcblx0ZmxvYXQgRCBceDNkIERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbmZsb2F0IEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggY29uc3QgaW4gZmxvYXQgZ2d4Um91Z2huZXNzICkge1xuXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xufVxuZmxvYXQgQmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCBibGlubkV4cG9uZW50ICkge1xuXHRyZXR1cm4gc3FydCggMi4wIC8gKCBibGlubkV4cG9uZW50ICsgMi4wICkgKTtcbn1cbiNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKVxuZmxvYXQgRF9DaGFybGllKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgTm9IKSB7XG5cdGZsb2F0IGludkFscGhhICBceDNkIDEuMCAvIHJvdWdobmVzcztcblx0ZmxvYXQgY29zMmggXHgzZCBOb0ggKiBOb0g7XG5cdGZsb2F0IHNpbjJoIFx4M2QgbWF4KDEuMCAtIGNvczJoLCAwLjAwNzgxMjUpO1x0cmV0dXJuICgyLjAgKyBpbnZBbHBoYSkgKiBwb3coc2luMmgsIGludkFscGhhICogMC41KSAvICgyLjAgKiBQSSk7XG59XG5mbG9hdCBWX05ldWJlbHQoZmxvYXQgTm9WLCBmbG9hdCBOb0wpIHtcblx0cmV0dXJuIHNhdHVyYXRlKDEuMCAvICg0LjAgKiAoTm9MICsgTm9WIC0gTm9MICogTm9WKSkpO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX1NoZWVuKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIHZlYzMgTCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgdmVjMyBzcGVjdWxhckNvbG9yICkge1xuXHR2ZWMzIE4gXHgzZCBnZW9tZXRyeS5ub3JtYWw7XG5cdHZlYzMgViBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG5cdHZlYzMgSCBceDNkIG5vcm1hbGl6ZSggViArIEwgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBOLCBIICkgKTtcblx0cmV0dXJuIHNwZWN1bGFyQ29sb3IgKiBEX0NoYXJsaWUoIHJvdWdobmVzcywgZG90TkggKSAqIFZfTmV1YmVsdCggZG90KE4sIFYpLCBkb3QoTiwgTCkgKTtcbn1cbiNlbmRpZiIsCmJ1bXBtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9CVU1QTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7XG5cdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xuXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcblx0XHR2ZWMyIGRTVGR4IFx4M2QgZEZkeCggdlV2ICk7XG5cdFx0dmVjMiBkU1RkeSBceDNkIGRGZHkoIHZVdiApO1xuXHRcdGZsb2F0IEhsbCBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICkueDtcblx0XHRmbG9hdCBkQnggXHgzZCBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcblx0XHRmbG9hdCBkQnkgXHgzZCBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcblx0XHRyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcblx0fVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5ICkge1xuXHRcdHZlYzMgdlNpZ21hWCBceDNkIHZlYzMoIGRGZHgoIHN1cmZfcG9zLnggKSwgZEZkeCggc3VyZl9wb3MueSApLCBkRmR4KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZTaWdtYVkgXHgzZCB2ZWMzKCBkRmR5KCBzdXJmX3Bvcy54ICksIGRGZHkoIHN1cmZfcG9zLnkgKSwgZEZkeSggc3VyZl9wb3MueiApICk7XG5cdFx0dmVjMyB2TiBceDNkIHN1cmZfbm9ybTtcblx0XHR2ZWMzIFIxIFx4M2QgY3Jvc3MoIHZTaWdtYVksIHZOICk7XG5cdFx0dmVjMyBSMiBceDNkIGNyb3NzKCB2TiwgdlNpZ21hWCApO1xuXHRcdGZsb2F0IGZEZXQgXHgzZCBkb3QoIHZTaWdtYVgsIFIxICk7XG5cdFx0ZkRldCAqXHgzZCAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdFx0dmVjMyB2R3JhZCBceDNkIHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xuXHR9XG4jZW5kaWYiLApjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMFxuXHR2ZWM0IHBsYW5lO1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRwbGFuZSBceDNkIGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0aWYgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApIFx4M2UgcGxhbmUudyApIGRpc2NhcmQ7XG5cdH1cblx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyBceDNjIE5VTV9DTElQUElOR19QTEFORVNcblx0XHRib29sIGNsaXBwZWQgXHgzZCB0cnVlO1xuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0XHRmb3IgKCBpbnQgaSBceDNkIFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSBceDNjIE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XG5cdFx0XHRwbGFuZSBceDNkIGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0XHRjbGlwcGVkIFx4M2QgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApIFx4M2UgcGxhbmUudyApIFx4MjZceDI2IGNsaXBwZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XG5cdCNlbmRpZlxuI2VuZGlmIiwKY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMFxuXHQjaWYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG5cdCNlbmRpZlxuXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyBceDNlIDAgXHgyNlx4MjYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyBceDNlIDAgXHgyNlx4MjYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdHZWaWV3UG9zaXRpb24gXHgzZCAtIG12UG9zaXRpb24ueHl6O1xuI2VuZGlmIiwKY29sb3JfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ09MT1Jcblx0ZGlmZnVzZUNvbG9yLnJnYiAqXHgzZCB2Q29sb3I7XG4jZW5kaWYiLGNvbG9yX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfdmVydGV4OiIjaWZkZWYgVVNFX0NPTE9SXG5cdHZDb2xvci54eXogXHgzZCBjb2xvci54eXo7XG4jZW5kaWYiLGNvbW1vbjoiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU5XG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE4XG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0XG4jZGVmaW5lIExPRzIgMS40NDI2OTVcbiNkZWZpbmUgRVBTSUxPTiAxZS02XG4jZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZGVmaW5lIHdoaXRlQ29tcGxlbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfVxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9XG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiBceDNkIHgqeDsgcmV0dXJuIHgyKngyOyB9XG5mbG9hdCBhdmVyYWdlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkgeyByZXR1cm4gZG90KCBjb2xvciwgdmVjMyggMC4zMzMzICkgKTsgfVxuaGlnaHAgZmxvYXQgcmFuZCggY29uc3QgaW4gdmVjMiB1diApIHtcblx0Y29uc3QgaGlnaHAgZmxvYXQgYSBceDNkIDEyLjk4OTgsIGIgXHgzZCA3OC4yMzMsIGMgXHgzZCA0Mzc1OC41NDUzO1xuXHRoaWdocCBmbG9hdCBkdCBceDNkIGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuIFx4M2QgbW9kKCBkdCwgUEkgKTtcblx0cmV0dXJuIGZyYWN0KHNpbihzbikgKiBjKTtcbn1cbiNpZmRlZiBISUdIX1BSRUNJU0lPTlxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7IHJldHVybiBsZW5ndGgoIHYgKTsgfVxuI2Vsc2Vcblx0ZmxvYXQgbWF4MyggdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9XG5cdGZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHtcblx0XHRmbG9hdCBtYXhDb21wb25lbnQgXHgzZCBtYXgzKCBhYnMoIHYgKSApO1xuXHRcdHJldHVybiBsZW5ndGgoIHYgLyBtYXhDb21wb25lbnQgKSAqIG1heENvbXBvbmVudDtcblx0fVxuI2VuZGlmXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XG5cdHZlYzMgY29sb3I7XG5cdHZlYzMgZGlyZWN0aW9uO1xuXHRib29sIHZpc2libGU7XG59O1xuc3RydWN0IFJlZmxlY3RlZExpZ2h0IHtcblx0dmVjMyBkaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xuXHR2ZWMzIGluZGlyZWN0RGlmZnVzZTtcblx0dmVjMyBpbmRpcmVjdFNwZWN1bGFyO1xufTtcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcblx0dmVjMyBwb3NpdGlvbjtcblx0dmVjMyBub3JtYWw7XG5cdHZlYzMgdmlld0RpcjtcbiNpZmRlZiBDTEVBUkNPQVRcblx0dmVjMyBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbn07XG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgcHJvamVjdE9uUGxhbmUoaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdGZsb2F0IGRpc3RhbmNlIFx4M2QgZG90KCBwbGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcblx0cmV0dXJuIC0gZGlzdGFuY2UgKiBwbGFuZU5vcm1hbCArIHBvaW50O1xufVxuZmxvYXQgc2lkZU9mUGxhbmUoIGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRyZXR1cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xufVxudmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGluZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBsaW5lRGlyZWN0aW9uICogKCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludE9uUGxhbmUgLSBwb2ludE9uTGluZSApIC8gZG90KCBwbGFuZU5vcm1hbCwgbGluZURpcmVjdGlvbiApICkgKyBwb2ludE9uTGluZTtcbn1cbm1hdDMgdHJhbnNwb3NlTWF0MyggY29uc3QgaW4gbWF0MyBtICkge1xuXHRtYXQzIHRtcDtcblx0dG1wWyAwIF0gXHgzZCB2ZWMzKCBtWyAwIF0ueCwgbVsgMSBdLngsIG1bIDIgXS54ICk7XG5cdHRtcFsgMSBdIFx4M2QgdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xuXHR0bXBbIDIgXSBceDNkIHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcblx0cmV0dXJuIHRtcDtcbn1cbmZsb2F0IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7XG5cdHZlYzMgd2VpZ2h0cyBceDNkIHZlYzMoIDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgKTtcblx0cmV0dXJuIGRvdCggd2VpZ2h0cywgY29sb3IucmdiICk7XG59IiwKY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50OiIjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuI2RlZmluZSBjdWJlVVZfdGV4dHVyZVNpemUgKDEwMjQuMClcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xuXHR2ZWMzIGFic0RpcmVjdGlvbiBceDNkIGFicyhkaXJlY3Rpb24pO1xuXHRpbnQgZmFjZSBceDNkIC0xO1xuXHRpZiggYWJzRGlyZWN0aW9uLnggXHgzZSBhYnNEaXJlY3Rpb24ueiApIHtcblx0XHRpZihhYnNEaXJlY3Rpb24ueCBceDNlIGFic0RpcmVjdGlvbi55IClcblx0XHRcdGZhY2UgXHgzZCBkaXJlY3Rpb24ueCBceDNlIDAuMCA/IDAgOiAzO1xuXHRcdGVsc2Vcblx0XHRcdGZhY2UgXHgzZCBkaXJlY3Rpb24ueSBceDNlIDAuMCA/IDEgOiA0O1xuXHR9XG5cdGVsc2Uge1xuXHRcdGlmKGFic0RpcmVjdGlvbi56IFx4M2UgYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi56IFx4M2UgMC4wID8gMiA6IDU7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi55IFx4M2UgMC4wID8gMSA6IDQ7XG5cdH1cblx0cmV0dXJuIGZhY2U7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMSAgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMS4wKVxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAqIDIuMCkpXG52ZWMyIE1pcExldmVsSW5mbyggdmVjMyB2ZWMsIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHNjYWxlIFx4M2QgZXhwMihjdWJlVVZfbWF4TG9kczEgLSByb3VnaG5lc3NMZXZlbCk7XG5cdGZsb2F0IGR4Um91Z2huZXNzIFx4M2QgZEZkeChyb3VnaG5lc3MpO1xuXHRmbG9hdCBkeVJvdWdobmVzcyBceDNkIGRGZHkocm91Z2huZXNzKTtcblx0dmVjMyBkeCBceDNkIGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcblx0dmVjMyBkeSBceDNkIGRGZHkoIHZlYyAqIHNjYWxlICogZHlSb3VnaG5lc3MgKTtcblx0ZmxvYXQgZCBceDNkIG1heCggZG90KCBkeCwgZHggKSwgZG90KCBkeSwgZHkgKSApO1xuXHRkIFx4M2QgY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFtcCk7XG5cdGZsb2F0IG1pcExldmVsIFx4M2QgMC41ICogbG9nMihkKTtcblx0cmV0dXJuIHZlYzIoZmxvb3IobWlwTGV2ZWwpLCBmcmFjdChtaXBMZXZlbCkpO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxuI2RlZmluZSBjdWJlVVZfcmNwVGV4dHVyZVNpemUgKDEuMCAvIGN1YmVVVl90ZXh0dXJlU2l6ZSlcbnZlYzIgZ2V0Q3ViZVVWKHZlYzMgZGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgbWlwTGV2ZWwpIHtcblx0bWlwTGV2ZWwgXHgzZCByb3VnaG5lc3NMZXZlbCBceDNlIGN1YmVVVl9tYXhMb2RzMiAtIDMuMCA/IDAuMCA6IG1pcExldmVsO1xuXHRmbG9hdCBhIFx4M2QgMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBleHAyX3BhY2tlZCBceDNkIGV4cDIoIHZlYzIoIHJvdWdobmVzc0xldmVsLCBtaXBMZXZlbCApICk7XG5cdHZlYzIgcmNwX2V4cDJfcGFja2VkIFx4M2QgdmVjMiggMS4wICkgLyBleHAyX3BhY2tlZDtcblx0ZmxvYXQgcG93U2NhbGUgXHgzZCBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcblx0ZmxvYXQgc2NhbGUgXHgzZCByY3BfZXhwMl9wYWNrZWQueCAqIHJjcF9leHAyX3BhY2tlZC55ICogMC4yNTtcblx0ZmxvYXQgbWlwT2Zmc2V0IFx4M2QgMC43NSooMS4wIC0gcmNwX2V4cDJfcGFja2VkLnkpICogcmNwX2V4cDJfcGFja2VkLng7XG5cdGJvb2wgYlJlcyBceDNkIG1pcExldmVsIFx4M2RceDNkIDAuMDtcblx0c2NhbGUgXHgzZCAgYlJlcyBceDI2XHgyNiAoc2NhbGUgXHgzYyBhKSA/IGEgOiBzY2FsZTtcblx0dmVjMyByO1xuXHR2ZWMyIG9mZnNldDtcblx0aW50IGZhY2UgXHgzZCBnZXRGYWNlRnJvbURpcmVjdGlvbihkaXJlY3Rpb24pO1xuXHRmbG9hdCByY3BQb3dTY2FsZSBceDNkIDEuMCAvIHBvd1NjYWxlO1xuXHRpZiggZmFjZSBceDNkXHgzZCAwKSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSBpZiggZmFjZSBceDNkXHgzZCAxKSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDIpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDMpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKDAuMCttaXBPZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDQpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLnosIC1kaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRyIFx4M2Qgbm9ybWFsaXplKHIpO1xuXHRmbG9hdCB0ZXhlbE9mZnNldCBceDNkIDAuNSAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBzIFx4M2QgKCByLnl6IC8gYWJzKCByLnggKSArIHZlYzIoIDEuMCApICkgKiAwLjU7XG5cdHZlYzIgYmFzZSBceDNkIG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XG5cdHJldHVybiBiYXNlICsgcyAqICggc2NhbGUgLSAyLjAgKiB0ZXhlbE9mZnNldCApO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczMgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMy4wKVxudmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHJlZmxlY3RlZERpcmVjdGlvbiwgZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCByb3VnaG5lc3NWYWwgXHgzZCByb3VnaG5lc3MqIGN1YmVVVl9tYXhMb2RzMztcblx0ZmxvYXQgcjEgXHgzZCBmbG9vcihyb3VnaG5lc3NWYWwpO1xuXHRmbG9hdCByMiBceDNkIHIxICsgMS4wO1xuXHRmbG9hdCB0IFx4M2QgZnJhY3Qocm91Z2huZXNzVmFsKTtcblx0dmVjMiBtaXBJbmZvIFx4M2QgTWlwTGV2ZWxJbmZvKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIHJvdWdobmVzcyk7XG5cdGZsb2F0IHMgXHgzZCBtaXBJbmZvLnk7XG5cdGZsb2F0IGxldmVsMCBceDNkIG1pcEluZm8ueDtcblx0ZmxvYXQgbGV2ZWwxIFx4M2QgbGV2ZWwwICsgMS4wO1xuXHRsZXZlbDEgXHgzZCBsZXZlbDEgXHgzZSA1LjAgPyA1LjAgOiBsZXZlbDE7XG5cdGxldmVsMCArXHgzZCBtaW4oIGZsb29yKCBzICsgMC41ICksIDUuMCApO1xuXHR2ZWMyIHV2XzEwIFx4M2QgZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IxMCBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMTApKTtcblx0dmVjMiB1dl8yMCBceDNkIGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIyLCBsZXZlbDApO1xuXHR2ZWM0IGNvbG9yMjAgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzIwKSk7XG5cdHZlYzQgcmVzdWx0IFx4M2QgbWl4KGNvbG9yMTAsIGNvbG9yMjAsIHQpO1xuXHRyZXR1cm4gdmVjNChyZXN1bHQucmdiLCAxLjApO1xufVxuI2VuZGlmIiwKZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6InZlYzMgdHJhbnNmb3JtZWROb3JtYWwgXHgzZCBub3JtYWxNYXRyaXggKiBvYmplY3ROb3JtYWw7XG4jaWZkZWYgRkxJUF9TSURFRFxuXHR0cmFuc2Zvcm1lZE5vcm1hbCBceDNkIC0gdHJhbnNmb3JtZWROb3JtYWw7XG4jZW5kaWZcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIHRyYW5zZm9ybWVkVGFuZ2VudCBceDNkIG5vcm1hbE1hdHJpeCAqIG9iamVjdFRhbmdlbnQ7XG5cdCNpZmRlZiBGTElQX1NJREVEXG5cdFx0dHJhbnNmb3JtZWRUYW5nZW50IFx4M2QgLSB0cmFuc2Zvcm1lZFRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzO1xuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHR0cmFuc2Zvcm1lZCArXHgzZCBub3JtYWxpemUoIG9iamVjdE5vcm1hbCApICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XG4jZW5kaWYiLAplbWlzc2l2ZW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR2ZWM0IGVtaXNzaXZlQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcblx0ZW1pc3NpdmVDb2xvci5yZ2IgXHgzZCBlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIoIGVtaXNzaXZlQ29sb3IgKS5yZ2I7XG5cdHRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqXHgzZCBlbWlzc2l2ZUNvbG9yLnJnYjtcbiNlbmRpZiIsZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcbiNlbmRpZiIsZW5jb2RpbmdzX2ZyYWdtZW50OiJnbF9GcmFnQ29sb3IgXHgzZCBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTsiLGVuY29kaW5nc19wYXJzX2ZyYWdtZW50OiJcbnZlYzQgTGluZWFyVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2YWx1ZTtcbn1cbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IExpbmVhclRvR2FtbWEoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xuXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBzUkdCVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IFJHQkVUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkUoIGluIHZlYzQgdmFsdWUgKSB7XG5cdGZsb2F0IG1heENvbXBvbmVudCBceDNkIG1heCggbWF4KCB2YWx1ZS5yLCB2YWx1ZS5nICksIHZhbHVlLmIgKTtcblx0ZmxvYXQgZkV4cCBceDNkIGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyBleHAyKCBmRXhwICksICggZkV4cCArIDEyOC4wICkgLyAyNTUuMCApO1xufVxudmVjNCBSR0JNVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogdmFsdWUuYSAqIG1heFJhbmdlLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JNKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0ZmxvYXQgbWF4UkdCIFx4M2QgbWF4KCB2YWx1ZS5yLCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xuXHRmbG9hdCBNIFx4M2QgY2xhbXAoIG1heFJHQiAvIG1heFJhbmdlLCAwLjAsIDEuMCApO1xuXHRNIFx4M2QgY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvICggTSAqIG1heFJhbmdlICksIE0gKTtcbn1cbnZlYzQgUkdCRFRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkQoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgXHgzZCBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IEQgXHgzZCBtYXgoIG1heFJhbmdlIC8gbWF4UkdCLCAxLjAgKTtcblx0RCBceDNkIG1pbiggZmxvb3IoIEQgKSAvIDI1NS4wLCAxLjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggRCAqICggMjU1LjAgLyBtYXhSYW5nZSApICksIEQgKTtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dk0gXHgzZCBtYXQzKCAwLjIyMDksIDAuMzM5MCwgMC40MTg0LCAwLjExMzgsIDAuNjc4MCwgMC43MzE5LCAwLjAxMDIsIDAuMTEzMCwgMC4yOTY5ICk7XG52ZWM0IExpbmVhclRvTG9nTHV2KCBpbiB2ZWM0IHZhbHVlICkgIHtcblx0dmVjMyBYcF9ZX1hZWnAgXHgzZCBjTG9nTHV2TSAqIHZhbHVlLnJnYjtcblx0WHBfWV9YWVpwIFx4M2QgbWF4KCBYcF9ZX1hZWnAsIHZlYzMoIDFlLTYsIDFlLTYsIDFlLTYgKSApO1xuXHR2ZWM0IHZSZXN1bHQ7XG5cdHZSZXN1bHQueHkgXHgzZCBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtcblx0ZmxvYXQgTGUgXHgzZCAyLjAgKiBsb2cyKFhwX1lfWFlacC55KSArIDEyNy4wO1xuXHR2UmVzdWx0LncgXHgzZCBmcmFjdCggTGUgKTtcblx0dlJlc3VsdC56IFx4M2QgKCBMZSAtICggZmxvb3IoIHZSZXN1bHQudyAqIDI1NS4wICkgKSAvIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZSZXN1bHQ7XG59XG5jb25zdCBtYXQzIGNMb2dMdXZJbnZlcnNlTSBceDNkIG1hdDMoIDYuMDAxNCwgLTIuNzAwOCwgLTEuNzk5NiwgLTEuMzMyMCwgMy4xMDI5LCAtNS43NzIxLCAwLjMwMDgsIC0xLjA4ODIsIDUuNjI2OCApO1xudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgTGUgXHgzZCB2YWx1ZS56ICogMjU1LjAgKyB2YWx1ZS53O1xuXHR2ZWMzIFhwX1lfWFlacDtcblx0WHBfWV9YWVpwLnkgXHgzZCBleHAyKCAoIExlIC0gMTI3LjAgKSAvIDIuMCApO1xuXHRYcF9ZX1hZWnAueiBceDNkIFhwX1lfWFlacC55IC8gdmFsdWUueTtcblx0WHBfWV9YWVpwLnggXHgzZCB2YWx1ZS54ICogWHBfWV9YWVpwLno7XG5cdHZlYzMgdlJHQiBceDNkIGNMb2dMdXZJbnZlcnNlTSAqIFhwX1lfWFlacC5yZ2I7XG5cdHJldHVybiB2ZWM0KCBtYXgoIHZSR0IsIDAuMCApLCAxLjAgKTtcbn0iLAplbnZtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2ZWMzIGNhbWVyYVRvVmVydGV4IFx4M2Qgbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2Vsc2Vcblx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCB2UmVmbGVjdDtcblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHR2ZWMyIHNhbXBsZVVWO1xuXHRcdHJlZmxlY3RWZWMgXHgzZCBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRcdHNhbXBsZVVWLnggXHgzZCBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdHJlZmxlY3RWZWMgXHgzZCBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHR2ZWMzIHJlZmxlY3RWaWV3IFx4M2Qgbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwgMC4wLCAxLjAgKSApO1xuXHRcdHZlYzQgZW52Q29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdmVjNCggMC4wICk7XG5cdCNlbmRpZlxuXHRlbnZDb2xvciBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudkNvbG9yICk7XG5cdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcblx0XHRvdXRnb2luZ0xpZ2h0IFx4M2QgbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxuXHRcdG91dGdvaW5nTGlnaHQgXHgzZCBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREIClcblx0XHRvdXRnb2luZ0xpZ2h0ICtceDNkIGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcblx0dW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwO1xuXHR1bmlmb3JtIGludCBtYXhNaXBMZXZlbDtcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblx0I2Vsc2Vcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdCNlbmRpZlxuXHRcbiNlbmRpZiIsZW52bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxuXHRcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0I2VuZGlmXG4jZW5kaWYiLAplbnZtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fGRlZmluZWQoIFBIT05HIClcblx0XHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdFxuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKVxuXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGUkFDVElPTlxuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZW5kaWZcblx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVVViggZW52TWFwLCBxdWVyeVZlYywgMS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB2ZWM0KCAwLjAgKTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XG5cdH1cblx0ZmxvYXQgZ2V0U3BlY3VsYXJNSVBMZXZlbCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgXHgzZCBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcblx0XHRmbG9hdCBzaWdtYSBceDNkIFBJICogcm91Z2huZXNzICogcm91Z2huZXNzIC8gKCAxLjAgKyByb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgXHgzZCBtYXhNSVBMZXZlbFNjYWxhciArIGxvZzIoIHNpZ21hICk7XG5cdFx0cmV0dXJuIGNsYW1wKCBkZXNpcmVkTUlQTGV2ZWwsIDAuMCwgbWF4TUlQTGV2ZWxTY2FsYXIgKTtcblx0fVxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdCAgdmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmbGVjdCggLXZpZXdEaXIsIG5vcm1hbCApO1xuXHRcdCAgcmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggbWl4KCByZWZsZWN0VmVjLCBub3JtYWwsIHJvdWdobmVzcyAqIHJvdWdobmVzcykgKTtcblx0XHQjZWxzZVxuXHRcdCAgdmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmcmFjdCggLXZpZXdEaXIsIG5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdFx0cmVmbGVjdFZlYyBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcblx0XHRmbG9hdCBzcGVjdWxhck1JUExldmVsIFx4M2QgZ2V0U3BlY3VsYXJNSVBMZXZlbCggcm91Z2huZXNzLCBtYXhNSVBMZXZlbCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyBceDNkIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlVVYoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCByb3VnaG5lc3MgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHRcdHZlYzIgc2FtcGxlVVY7XG5cdFx0XHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRcdFx0c2FtcGxlVVYueCBceDNkIGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRExvZEVYVCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdFx0dmVjMyByZWZsZWN0VmlldyBceDNkIG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4ICogdmVjNCggcmVmbGVjdFZlYywgMC4wICkgKS54eXogKyB2ZWMzKCAwLjAsMC4wLDEuMCApICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuI2VuZGlmIiwKZW52bWFwX3ZlcnRleDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZXb3JsZFBvc2l0aW9uIFx4M2Qgd29ybGRQb3NpdGlvbi54eXo7XG5cdCNlbHNlXG5cdFx0dmVjMyBjYW1lcmFUb1ZlcnRleCBceDNkIG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2UmVmbGVjdCBceDNkIHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2UmVmbGVjdCBceDNkIHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdCNlbmRpZlxuI2VuZGlmIixmb2dfdmVydGV4OiIjaWZkZWYgVVNFX0ZPR1xuXHRmb2dEZXB0aCBceDNkIC1tdlBvc2l0aW9uLno7XG4jZW5kaWYiLApmb2dfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XG4jZW5kaWYiLGZvZ19mcmFnbWVudDoiI2lmZGVmIFVTRV9GT0dcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0ZmxvYXQgZm9nRmFjdG9yIFx4M2QgMS4wIC0gZXhwKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZm9nRGVwdGggKiBmb2dEZXB0aCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGZvZ0ZhY3RvciBceDNkIHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcblx0I2VuZGlmXG5cdGdsX0ZyYWdDb2xvci5yZ2IgXHgzZCBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTtcbiNlbmRpZiIsZm9nX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRk9HXG5cdHVuaWZvcm0gdmVjMyBmb2dDb2xvcjtcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nTmVhcjtcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0Zhcjtcblx0I2VuZGlmXG4jZW5kaWYiLApncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVE9PTlxuXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcblx0dmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xuXHRcdGZsb2F0IGRvdE5MIFx4M2QgZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XG5cdFx0dmVjMiBjb29yZCBceDNkIHZlYzIoIGRvdE5MICogMC41ICsgMC41LCAwLjAgKTtcblx0XHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yZ2I7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiAoIGNvb3JkLnggXHgzYyAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsbGlnaHRtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTElHSFRNQVBcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIFBJICogdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIiwKbGlnaHRtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDtcblx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcbiNlbmRpZiIsbGlnaHRzX2xhbWJlcnRfdmVydGV4OiJ2ZWMzIGRpZmZ1c2UgXHgzZCB2ZWMzKCAxLjAgKTtcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XG5nZW9tZXRyeS5wb3NpdGlvbiBceDNkIG12UG9zaXRpb24ueHl6O1xuZ2VvbWV0cnkubm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuZ2VvbWV0cnkudmlld0RpciBceDNkIG5vcm1hbGl6ZSggLW12UG9zaXRpb24ueHl6ICk7XG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcbmJhY2tHZW9tZXRyeS5wb3NpdGlvbiBceDNkIGdlb21ldHJ5LnBvc2l0aW9uO1xuYmFja0dlb21ldHJ5Lm5vcm1hbCBceDNkIC1nZW9tZXRyeS5ub3JtYWw7XG5iYWNrR2VvbWV0cnkudmlld0RpciBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG52TGlnaHRGcm9udCBceDNkIHZlYzMoIDAuMCApO1xudkluZGlyZWN0RnJvbnQgXHgzZCB2ZWMzKCAwLjAgKTtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dkxpZ2h0QmFjayBceDNkIHZlYzMoIDAuMCApO1xuXHR2SW5kaXJlY3RCYWNrIFx4M2QgdmVjMyggMC4wICk7XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG5mbG9hdCBkb3ROTDtcbnZlYzMgZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuI2lmIE5VTV9QT0lOVF9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgXHgzZCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlIFx4M2QgUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArXHgzZCBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICtceDNkIHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSBceDNkIFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgK1x4M2Qgc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArXHgzZCBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgXHgzZCBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICtceDNkIHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgK1x4M2Qgc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdHZJbmRpcmVjdEZyb250ICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2SW5kaXJlY3RCYWNrICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgYmFja0dlb21ldHJ5ICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsCmxpZ2h0c19wYXJzX2JlZ2luOiJ1bmlmb3JtIHZlYzMgYW1iaWVudExpZ2h0Q29sb3I7XG51bmlmb3JtIHZlYzMgbGlnaHRQcm9iZVsgOSBdO1xudmVjMyBzaEdldElycmFkaWFuY2VBdCggaW4gdmVjMyBub3JtYWwsIGluIHZlYzMgc2hDb2VmZmljaWVudHNbIDkgXSApIHtcblx0ZmxvYXQgeCBceDNkIG5vcm1hbC54LCB5IFx4M2Qgbm9ybWFsLnksIHogXHgzZCBub3JtYWwuejtcblx0dmVjMyByZXN1bHQgXHgzZCBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudmVjMyBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBsaWdodFByb2JlWyA5IF0sIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XG5cdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2Qgc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBsaWdodFByb2JlICk7XG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxudmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkge1xuXHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBhbWJpZW50TGlnaHRDb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxuI2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHRzWyBOVU1fRElSX0xJR0hUUyBdO1xuXHR2b2lkIGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgZGlyZWN0aW9uYWxMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gXHgzZCBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjtcblx0XHRkaXJlY3RMaWdodC52aXNpYmxlIFx4M2QgdHJ1ZTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFBvaW50TGlnaHQge1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRmbG9hdCBkaXN0YW5jZTtcblx0XHRmbG9hdCBkZWNheTtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHRmbG9hdCBzaGFkb3dDYW1lcmFOZWFyO1xuXHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcblx0fTtcblx0dW5pZm9ybSBQb2ludExpZ2h0IHBvaW50TGlnaHRzWyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdHZvaWQgZ2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0dmVjMyBsVmVjdG9yIFx4M2QgcG9pbnRMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgXHgzZCBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHBvaW50TGlnaHQuY29sb3I7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCAoIGRpcmVjdExpZ2h0LmNvbG9yICFceDNkIHZlYzMoIDAuMCApICk7XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9TUE9UX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFNwb3RMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGZsb2F0IGNvbmVDb3M7XG5cdFx0ZmxvYXQgcGVudW1icmFDb3M7XG5cdFx0aW50IHNoYWRvdztcblx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdH07XG5cdHVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9TUE9UX0xJR0hUUyBdO1xuXHR2b2lkIGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICApIHtcblx0XHR2ZWMzIGxWZWN0b3IgXHgzZCBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBsaWdodERpc3RhbmNlIFx4M2QgbGVuZ3RoKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgYW5nbGVDb3MgXHgzZCBkb3QoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGlmICggYW5nbGVDb3MgXHgzZSBzcG90TGlnaHQuY29uZUNvcyApIHtcblx0XHRcdGZsb2F0IHNwb3RFZmZlY3QgXHgzZCBzbW9vdGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgXHgzZCBzcG90TGlnaHQuY29sb3I7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBzcG90RWZmZWN0ICogcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTtcblx0XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHZlYzMoIDAuMCApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkIGZhbHNlO1xuXHRcdH1cblx0fVxuI2VuZGlmXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBSZWN0QXJlYUxpZ2h0IHtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0O1xuXHR9O1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTtcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xuXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgc2t5Q29sb3I7XG5cdFx0dmVjMyBncm91bmRDb2xvcjtcblx0fTtcblx0dW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07XG5cdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0XHRmbG9hdCBkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgXHgzZCAwLjUgKiBkb3ROTCArIDAuNTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gaXJyYWRpYW5jZTtcblx0fVxuI2VuZGlmIiwKbGlnaHRzX3Bob25nX2ZyYWdtZW50OiJCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIHNwZWN1bGFyO1xubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgXHgzZCBzaGluaW5lc3M7XG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoIFx4M2Qgc3BlY3VsYXJTdHJlbmd0aDsiLGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5cdHZlYzNcdHNwZWN1bGFyQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclNoaW5pbmVzcztcblx0ZmxvYXRcdHNwZWN1bGFyU3RyZW5ndGg7XG59O1xudm9pZCBSRV9EaXJlY3RfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0I2lmZGVmIFRPT05cblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2Vsc2Vcblx0XHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjZW5kaWZcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcdCgwKSIsCmxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDoiUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciBceDNkIGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgXHgzZCBjbGFtcCggcm91Z2huZXNzRmFjdG9yLCAwLjA0LCAxLjAgKTtcbiNpZmRlZiBSRUZMRUNUSVZJVFlcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIG1peCggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2Vsc2Vcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIG1peCggdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHRtYXRlcmlhbC5jbGVhcmNvYXQgXHgzZCBzYXR1cmF0ZSggY2xlYXJjb2F0ICk7XHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgXHgzZCBjbGFtcCggY2xlYXJjb2F0Um91Z2huZXNzLCAwLjA0LCAxLjAgKTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHRtYXRlcmlhbC5zaGVlbkNvbG9yIFx4M2Qgc2hlZW47XG4jZW5kaWYiLApsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoic3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclJvdWdobmVzcztcblx0dmVjM1x0c3BlY3VsYXJDb2xvcjtcbiNpZmRlZiBDTEVBUkNPQVRcblx0ZmxvYXQgY2xlYXJjb2F0O1xuXHRmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dmVjMyBzaGVlbkNvbG9yO1xuI2VuZGlmXG59O1xuI2RlZmluZSBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMTZcbiNkZWZpbmUgREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjA0XG5mbG9hdCBjbGVhcmNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XG5cdHJldHVybiBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICsgKCAxLjAgLSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICkgKiAoIHBvdyggMS4wIC0gZG90TkwsIDUuMCApICogcG93KCAxLjAgLSByb3VnaG5lc3MsIDIuMCApICk7XG59XG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwXG5cdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRcdHZlYzMgbm9ybWFsIFx4M2QgZ2VvbWV0cnkubm9ybWFsO1xuXHRcdHZlYzMgdmlld0RpciBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG5cdFx0dmVjMyBwb3NpdGlvbiBceDNkIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdHZlYzMgbGlnaHRQb3MgXHgzZCByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xuXHRcdHZlYzMgaGFsZldpZHRoIFx4M2QgcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0IFx4M2QgcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xuXHRcdHZlYzMgbGlnaHRDb2xvciBceDNkIHJlY3RBcmVhTGlnaHQuY29sb3I7XG5cdFx0ZmxvYXQgcm91Z2huZXNzIFx4M2QgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XG5cdFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XG5cdFx0cmVjdENvb3Jkc1sgMCBdIFx4M2QgbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1x0XHRyZWN0Q29vcmRzWyAxIF0gXHgzZCBsaWdodFBvcyAtIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMiBdIFx4M2QgbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDMgXSBceDNkIGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHR2ZWMyIHV2IFx4M2QgTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xuXHRcdHZlYzQgdDEgXHgzZCB0ZXh0dXJlMkQoIGx0Y18xLCB1diApO1xuXHRcdHZlYzQgdDIgXHgzZCB0ZXh0dXJlMkQoIGx0Y18yLCB1diApO1xuXHRcdG1hdDMgbUludiBceDNkIG1hdDMoXG5cdFx0XHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXG5cdFx0XHR2ZWMzKCAgICAwLCAxLCAgICAwICksXG5cdFx0XHR2ZWMzKCB0MS56LCAwLCB0MS53IClcblx0XHQpO1xuXHRcdHZlYzMgZnJlc25lbCBceDNkICggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIHQyLnggKyAoIHZlYzMoIDEuMCApIC0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApICogdDIueSApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkIGxpZ2h0Q29sb3IgKiBmcmVzbmVsICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52LCByZWN0Q29vcmRzICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCBsaWdodENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxLjAgKSwgcmVjdENvb3JkcyApO1xuXHR9XG4jZW5kaWZcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0ZmxvYXQgZG90TkwgXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKlx4M2QgUEk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2NEb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGNjSXJyYWRpYW5jZSBceDNkIGNjRG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGNjSXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkIGNjSXJyYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyY29hdCAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIDAuMDtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfU0hFRU5cblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfU2hlZW4oXG5cdFx0XHRtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyxcblx0XHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbixcblx0XHRcdGdlb21ldHJ5LFxuXHRcdFx0bWF0ZXJpYWwuc2hlZW5Db2xvclxuXHRcdCk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgKCAxLjAgLSBjbGVhcmNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MpO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyY29hdFJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCkge1xuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2NEb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArXHgzZCBjbGVhcmNvYXRSYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyY29hdCAqIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG5cdFx0ZmxvYXQgY2NEb3ROTCBceDNkIGNjRG90TlY7XG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSIFx4M2QgbWF0ZXJpYWwuY2xlYXJjb2F0ICogY2xlYXJjb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIGNjRG90TkwgKTtcblx0I2Vsc2Vcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCAwLjA7XG5cdCNlbmRpZlxuXHRmbG9hdCBjbGVhcmNvYXRJbnYgXHgzZCAxLjAgLSBjbGVhcmNvYXRESFI7XG5cdHZlYzMgc2luZ2xlU2NhdHRlcmluZyBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIG11bHRpU2NhdHRlcmluZyBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZSBceDNkIGlycmFkaWFuY2UgKiBSRUNJUFJPQ0FMX1BJO1xuXHRCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTtcblx0dmVjMyBkaWZmdXNlIFx4M2QgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogKCAxLjAgLSAoIHNpbmdsZVNjYXR0ZXJpbmcgKyBtdWx0aVNjYXR0ZXJpbmcgKSApO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICtceDNkIGNsZWFyY29hdEludiAqIHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZztcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIG11bHRpU2NhdHRlcmluZyAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X1BoeXNpY2FsXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVx0XHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyXHRcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcbmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcbn0iLApsaWdodHNfZnJhZ21lbnRfYmVnaW46IlxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uIFx4M2QgLSB2Vmlld1Bvc2l0aW9uO1xuZ2VvbWV0cnkubm9ybWFsIFx4M2Qgbm9ybWFsO1xuZ2VvbWV0cnkudmlld0RpciBceDNkIG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xuI2lmZGVmIENMRUFSQ09BVFxuXHRnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwgXHgzZCBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG4jaWYgKCBOVU1fUE9JTlRfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgXHgzZCBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIClcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBhbGwoIGJ2ZWMyKCBwb2ludExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9TUE9UX0xJR0hUUyBceDNlIDAgKSBceDI2XHgyNiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRzcG90TGlnaHQgXHgzZCBzcG90TGlnaHRzWyBpIF07XG5cdFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIHNwb3RMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9ESVJfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0IFx4M2QgZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSBceDI2XHgyNiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9SRUNUX0FSRUFfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdF9SZWN0QXJlYSApXG5cdFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUkVDVF9BUkVBX0xJR0hUUzsgaSArKyApIHtcblx0XHRyZWN0QXJlYUxpZ2h0IFx4M2QgcmVjdEFyZWFMaWdodHNbIGkgXTtcblx0XHRSRV9EaXJlY3RfUmVjdEFyZWEoIHJlY3RBcmVhTGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcblx0dmVjMyBpYmxJcnJhZGlhbmNlIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XG5cdGlycmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGxpZ2h0UHJvYmUsIGdlb21ldHJ5ICk7XG5cdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyBceDNlIDAgKVxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0XHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0XHRpcnJhZGlhbmNlICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHZlYzMgcmFkaWFuY2UgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjMyBjbGVhcmNvYXRSYWRpYW5jZSBceDNkIHZlYzMoIDAuMCApO1xuI2VuZGlmIiwKbGlnaHRzX2ZyYWdtZW50X21hcHM6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgXHgzZCB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRsaWdodE1hcElycmFkaWFuY2UgKlx4M2QgUEk7XG5cdFx0I2VuZGlmXG5cdFx0aXJyYWRpYW5jZSArXHgzZCBsaWdodE1hcElycmFkaWFuY2U7XG5cdCNlbmRpZlxuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIFx4MjZceDI2IGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0aWJsSXJyYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBnZW9tZXRyeSwgbWF4TWlwTGV2ZWwgKTtcblx0I2VuZGlmXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHJhZGlhbmNlICtceDNkIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0Y2xlYXJjb2F0UmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmxpZ2h0c19mcmFnbWVudF9lbmQ6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgaWJsSXJyYWRpYW5jZSwgY2xlYXJjb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSBceDI2XHgyNiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcblx0Z2xfRnJhZ0RlcHRoRVhUIFx4M2QgbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApIFx4MjZceDI2IGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG5cdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcbiNlbmRpZiIsCmxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0I2VuZGlmXG4jZW5kaWYiLGxvZ2RlcHRoYnVmX3ZlcnRleDoiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZGcmFnRGVwdGggXHgzZCAxLjAgKyBnbF9Qb3NpdGlvbi53O1xuXHQjZWxzZVxuXHRcdGdsX1Bvc2l0aW9uLnogXHgzZCBsb2cyKCBtYXgoIEVQU0lMT04sIGdsX1Bvc2l0aW9uLncgKyAxLjAgKSApICogbG9nRGVwdGhCdWZGQyAtIDEuMDtcblx0XHRnbF9Qb3NpdGlvbi56ICpceDNkIGdsX1Bvc2l0aW9uLnc7XG5cdCNlbmRpZlxuI2VuZGlmIixtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzQgdGV4ZWxDb2xvciBceDNkIHRleHR1cmUyRCggbWFwLCB2VXYgKTtcblx0dGV4ZWxDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcblx0ZGlmZnVzZUNvbG9yICpceDNkIHRleGVsQ29sb3I7XG4jZW5kaWYiLAptYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmIixtYXBfcGFydGljbGVfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzIgdXYgXHgzZCAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5O1xuXHR2ZWM0IG1hcFRleGVsIFx4M2QgdGV4dHVyZTJEKCBtYXAsIHV2ICk7XG5cdGRpZmZ1c2VDb2xvciAqXHgzZCBtYXBUZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xuI2VuZGlmIixtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiLG1ldGFsbmVzc21hcF9mcmFnbWVudDoiZmxvYXQgbWV0YWxuZXNzRmFjdG9yIFx4M2QgbWV0YWxuZXNzO1xuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dmVjNCB0ZXhlbE1ldGFsbmVzcyBceDNkIHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2VXYgKTtcblx0bWV0YWxuZXNzRmFjdG9yICpceDNkIHRleGVsTWV0YWxuZXNzLmI7XG4jZW5kaWYiLAptZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xuI2VuZGlmIixtb3JwaG5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMCAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMSAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMiAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMyAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG4jZW5kaWYiLG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcblx0I2Vsc2Vcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0I2VuZGlmXG4jZW5kaWYiLAptb3JwaHRhcmdldF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQwIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDIgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQzIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDQgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQ1IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDcgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA3IF07XG5cdCNlbmRpZlxuI2VuZGlmIiwKbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgRkxBVF9TSEFERURcblx0dmVjMyBmZHggXHgzZCB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgZmR5IFx4M2QgdmVjMyggZEZkeSggdlZpZXdQb3NpdGlvbi54ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xuXHR2ZWMzIG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcbiNlbHNlXG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRub3JtYWwgXHgzZCBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2ZWMzIHRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHZUYW5nZW50ICk7XG5cdFx0dmVjMyBiaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHZCaXRhbmdlbnQgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR0YW5nZW50IFx4M2QgdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHRcdGJpdGFuZ2VudCBceDNkIGJpdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWZcbnZlYzMgZ2VvbWV0cnlOb3JtYWwgXHgzZCBub3JtYWw7IiwKbm9ybWFsX2ZyYWdtZW50X21hcHM6IiNpZmRlZiBPQkpFQ1RTUEFDRV9OT1JNQUxNQVBcblx0bm9ybWFsIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHRub3JtYWwgXHgzZCAtIG5vcm1hbDtcblx0I2VuZGlmXG5cdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRub3JtYWwgXHgzZCBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdCNlbmRpZlxuXHRub3JtYWwgXHgzZCBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuI2VsaWYgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG1hdDMgdlRCTiBceDNkIG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgbm9ybWFsICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5IFx4M2Qgbm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRcdG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRub3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgbm9ybWFsU2NhbGUsIG5vcm1hbE1hcCApO1xuXHQjZW5kaWZcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcblx0bm9ybWFsIFx4M2QgcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCkgKTtcbiNlbmRpZiIsCm5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcbiNlbmRpZlxuI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHR1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4O1xuI2VuZGlmXG4jaWYgISBkZWZpbmVkICggVVNFX1RBTkdFTlQgKSBceDI2XHgyNiAoIGRlZmluZWQgKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQICkgKVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWwyQXJiKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIG5vcm1hbFNjYWxlLCBpbiBzYW1wbGVyMkQgbm9ybWFsTWFwICkge1xuXHRcdHZlYzMgcTAgXHgzZCB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XG5cdFx0dmVjMyBxMSBceDNkIHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMyIHN0MCBceDNkIGRGZHgoIHZVdi5zdCApO1xuXHRcdHZlYzIgc3QxIFx4M2QgZEZkeSggdlV2LnN0ICk7XG5cdFx0ZmxvYXQgc2NhbGUgXHgzZCBzaWduKCBzdDEudCAqIHN0MC5zIC0gc3QwLnQgKiBzdDEucyApO1xuXHRcdHZlYzMgUyBceDNkIG5vcm1hbGl6ZSggKCBxMCAqIHN0MS50IC0gcTEgKiBzdDAudCApICogc2NhbGUgKTtcblx0XHR2ZWMzIFQgXHgzZCBub3JtYWxpemUoICggLSBxMCAqIHN0MS5zICsgcTEgKiBzdDAucyApICogc2NhbGUgKTtcblx0XHR2ZWMzIE4gXHgzZCBub3JtYWxpemUoIHN1cmZfbm9ybSApO1xuXHRcdHZlYzMgbWFwTiBceDNkIHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdFx0bWFwTi54eSAqXHgzZCBub3JtYWxTY2FsZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2ZWMzIE5mcm9tU1QgXHgzZCBjcm9zcyggUywgVCApO1xuXHRcdFx0aWYoIGRvdCggTmZyb21TVCwgTiApIFx4M2UgMC4wICkge1xuXHRcdFx0XHRTICpceDNkIC0xLjA7XG5cdFx0XHRcdFQgKlx4M2QgLTEuMDtcblx0XHRcdH1cblx0XHQjZWxzZVxuXHRcdFx0bWFwTi54eSAqXHgzZCAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdFx0I2VuZGlmXG5cdFx0bWF0MyB0c24gXHgzZCBtYXQzKCBTLCBULCBOICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggdHNuICogbWFwTiApO1xuXHR9XG4jZW5kaWYiLApjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgQ0xFQVJDT0FUXG5cdHZlYzMgY2xlYXJjb2F0Tm9ybWFsIFx4M2QgZ2VvbWV0cnlOb3JtYWw7XG4jZW5kaWYiLGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG1hdDMgdlRCTiBceDNkIG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgY2xlYXJjb2F0Tm9ybWFsICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5IFx4M2QgY2xlYXJjb2F0Tm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRcdGNsZWFyY29hdE5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRjbGVhcmNvYXROb3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsMkFyYiggLSB2Vmlld1Bvc2l0aW9uLCBjbGVhcmNvYXROb3JtYWwsIGNsZWFyY29hdE5vcm1hbFNjYWxlLCBjbGVhcmNvYXROb3JtYWxNYXAgKTtcblx0I2VuZGlmXG4jZW5kaWYiLApjbGVhcmNvYXRfbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXROb3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBjbGVhcmNvYXROb3JtYWxTY2FsZTtcbiNlbmRpZiIscGFja2luZzoidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCBub3JtYWwgKSAqIDAuNSArIDAuNTtcbn1cbnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkge1xuXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcbn1cbmNvbnN0IGZsb2F0IFBhY2tVcHNjYWxlIFx4M2QgMjU2LiAvIDI1NS47Y29uc3QgZmxvYXQgVW5wYWNrRG93bnNjYWxlIFx4M2QgMjU1LiAvIDI1Ni47XG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzIFx4M2QgdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgIDI1Ni4gKTtcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9ycyBceDNkIFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xuY29uc3QgZmxvYXQgU2hpZnRSaWdodDggXHgzZCAxLiAvIDI1Ni47XG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcblx0dmVjNCByIFx4M2QgdmVjNCggZnJhY3QoIHYgKiBQYWNrRmFjdG9ycyApLCB2ICk7XG5cdHIueXp3IC1ceDNkIHIueHl6ICogU2hpZnRSaWdodDg7XHRyZXR1cm4gciAqIFBhY2tVcHNjYWxlO1xufVxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHtcblx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xufVxudmVjNCBlbmNvZGVIYWxmUkdCQSAoIHZlYzIgdiApIHtcblx0dmVjNCBlbmNvZGVkIFx4M2QgdmVjNCggMC4wICk7XG5cdGNvbnN0IHZlYzIgb2Zmc2V0IFx4M2QgdmVjMiggMS4wIC8gMjU1LjAsIDAuMCApO1xuXHRlbmNvZGVkLnh5IFx4M2QgdmVjMiggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSApO1xuXHRlbmNvZGVkLnh5IFx4M2QgZW5jb2RlZC54eSAtICggZW5jb2RlZC55eSAqIG9mZnNldCApO1xuXHRlbmNvZGVkLnp3IFx4M2QgdmVjMiggdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSApO1xuXHRlbmNvZGVkLnp3IFx4M2QgZW5jb2RlZC56dyAtICggZW5jb2RlZC53dyAqIG9mZnNldCApO1xuXHRyZXR1cm4gZW5jb2RlZDtcbn1cbnZlYzIgZGVjb2RlSGFsZlJHQkEoIHZlYzQgdiApIHtcblx0cmV0dXJuIHZlYzIoIHYueCArICggdi55IC8gMjU1LjAgKSwgdi56ICsgKCB2LncgLyAyNTUuMCApICk7XG59XG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7XG59XG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcbn1cbmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XG59XG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGludkNsaXBaIC0gZmFyICk7XG59IiwKcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDoiI2lmZGVmIFBSRU1VTFRJUExJRURfQUxQSEFcblx0Z2xfRnJhZ0NvbG9yLnJnYiAqXHgzZCBnbF9GcmFnQ29sb3IuYTtcbiNlbmRpZiIscHJvamVjdF92ZXJ0ZXg6InZlYzQgbXZQb3NpdGlvbiBceDNkIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbmdsX1Bvc2l0aW9uIFx4M2QgcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247IixkaXRoZXJpbmdfZnJhZ21lbnQ6IiNpZmRlZiBESVRIRVJJTkdcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xuI2VuZGlmIixkaXRoZXJpbmdfcGFyc19mcmFnbWVudDoiI2lmZGVmIERJVEhFUklOR1xuXHR2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHtcblx0XHRmbG9hdCBncmlkX3Bvc2l0aW9uIFx4M2QgcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XG5cdFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCIFx4M2QgdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcblx0XHRkaXRoZXJfc2hpZnRfUkdCIFx4M2QgbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xuXHRcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XG5cdH1cbiNlbmRpZiIsCnJvdWdobmVzc21hcF9mcmFnbWVudDoiZmxvYXQgcm91Z2huZXNzRmFjdG9yIFx4M2Qgcm91Z2huZXNzO1xuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcblx0dmVjNCB0ZXhlbFJvdWdobmVzcyBceDNkIHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtcblx0cm91Z2huZXNzRmFjdG9yICpceDNkIHRleGVsUm91Z2huZXNzLmc7XG4jZW5kaWYiLHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XG4jZW5kaWYiLHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0ZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcblx0XHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcblx0fVxuXHR2ZWMyIHRleHR1cmUyRERpc3RyaWJ1dGlvbiggc2FtcGxlcjJEIHNoYWRvdywgdmVjMiB1diApIHtcblx0XHRyZXR1cm4gZGVjb2RlSGFsZlJHQkEoIHRleHR1cmUyRCggc2hhZG93LCB1diApICk7XG5cdH1cblx0ZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7XG5cdFx0ZmxvYXQgb2NjbHVzaW9uIFx4M2QgMS4wO1xuXHRcdHZlYzIgZGlzdHJpYnV0aW9uIFx4M2QgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7XG5cdFx0ZmxvYXQgaGFyZF9zaGFkb3cgXHgzZCBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTtcblx0XHRpZiAoaGFyZF9zaGFkb3cgIVx4M2QgMS4wICkge1xuXHRcdFx0ZmxvYXQgZGlzdGFuY2UgXHgzZCBjb21wYXJlIC0gZGlzdHJpYnV0aW9uLnggO1xuXHRcdFx0ZmxvYXQgdmFyaWFuY2UgXHgzZCBtYXgoIDAuMDAwMDAsIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKTtcblx0XHRcdGZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5IFx4M2QgdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7XHRcdFx0c29mdG5lc3NfcHJvYmFiaWxpdHkgXHgzZCBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7XHRcdFx0b2NjbHVzaW9uIFx4M2QgY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7XG5cdFx0fVxuXHRcdHJldHVybiBvY2NsdXNpb247XG5cdH1cblx0ZmxvYXQgdGV4dHVyZTJEU2hhZG93TGVycCggc2FtcGxlcjJEIGRlcHRocywgdmVjMiBzaXplLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdGNvbnN0IHZlYzIgb2Zmc2V0IFx4M2QgdmVjMiggMC4wLCAxLjAgKTtcblx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2l6ZTtcblx0XHR2ZWMyIGNlbnRyb2lkVVYgXHgzZCAoIGZsb29yKCB1diAqIHNpemUgLSAwLjUgKSArIDAuNSApICogdGV4ZWxTaXplO1xuXHRcdGZsb2F0IGxiIFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh4LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgbHQgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHksIGNvbXBhcmUgKTtcblx0XHRmbG9hdCByYiBceDNkIHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eCwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJ0IFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl5LCBjb21wYXJlICk7XG5cdFx0dmVjMiBmIFx4M2QgZnJhY3QoIHV2ICogc2l6ZSArIDAuNSApO1xuXHRcdGZsb2F0IGEgXHgzZCBtaXgoIGxiLCBsdCwgZi55ICk7XG5cdFx0ZmxvYXQgYiBceDNkIG1peCggcmIsIHJ0LCBmLnkgKTtcblx0XHRmbG9hdCBjIFx4M2QgbWl4KCBhLCBiLCBmLnggKTtcblx0XHRyZXR1cm4gYztcblx0fVxuXHRmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xuXHRcdGZsb2F0IHNoYWRvdyBceDNkIDEuMDtcblx0XHRzaGFkb3dDb29yZC54eXogL1x4M2Qgc2hhZG93Q29vcmQudztcblx0XHRzaGFkb3dDb29yZC56ICtceDNkIHNoYWRvd0JpYXM7XG5cdFx0YnZlYzQgaW5GcnVzdHVtVmVjIFx4M2QgYnZlYzQgKCBzaGFkb3dDb29yZC54IFx4M2VceDNkIDAuMCwgc2hhZG93Q29vcmQueCBceDNjXHgzZCAxLjAsIHNoYWRvd0Nvb3JkLnkgXHgzZVx4M2QgMC4wLCBzaGFkb3dDb29yZC55IFx4M2NceDNkIDEuMCApO1xuXHRcdGJvb2wgaW5GcnVzdHVtIFx4M2QgYWxsKCBpbkZydXN0dW1WZWMgKTtcblx0XHRidmVjMiBmcnVzdHVtVGVzdFZlYyBceDNkIGJ2ZWMyKCBpbkZydXN0dW0sIHNoYWRvd0Nvb3JkLnogXHgzY1x4M2QgMS4wICk7XG5cdFx0Ym9vbCBmcnVzdHVtVGVzdCBceDNkIGFsbCggZnJ1c3R1bVRlc3RWZWMgKTtcblx0XHRpZiAoIGZydXN0dW1UZXN0ICkge1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgXHgzZCB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgXHgzZCAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwIFx4M2QgLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSBceDNkICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgXHgzZCArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgyIFx4M2QgZHgwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkyIFx4M2QgZHkwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHgzIFx4M2QgZHgxIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkzIFx4M2QgZHkxIC8gMi4wO1xuXHRcdFx0c2hhZG93IFx4M2QgKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyAxNy4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgXHgzZCB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgXHgzZCAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwIFx4M2QgLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSBceDNkICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgXHgzZCArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0c2hhZG93IFx4M2QgKFxuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNIClcblx0XHRcdHNoYWRvdyBceDNkIFZTTVNoYWRvdyggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xuXHRcdCNlbHNlXG5cdFx0XHRzaGFkb3cgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2VuZGlmXG5cdFx0fVxuXHRcdHJldHVybiBzaGFkb3c7XG5cdH1cblx0dmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkge1xuXHRcdHZlYzMgYWJzViBceDNkIGFicyggdiApO1xuXHRcdGZsb2F0IHNjYWxlVG9DdWJlIFx4M2QgMS4wIC8gbWF4KCBhYnNWLngsIG1heCggYWJzVi55LCBhYnNWLnogKSApO1xuXHRcdGFic1YgKlx4M2Qgc2NhbGVUb0N1YmU7XG5cdFx0diAqXHgzZCBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApO1xuXHRcdHZlYzIgcGxhbmFyIFx4M2Qgdi54eTtcblx0XHRmbG9hdCBhbG1vc3RBVGV4ZWwgXHgzZCAxLjUgKiB0ZXhlbFNpemVZO1xuXHRcdGZsb2F0IGFsbW9zdE9uZSBceDNkIDEuMCAtIGFsbW9zdEFUZXhlbDtcblx0XHRpZiAoIGFic1YueiBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRpZiAoIHYueiBceDNlIDAuMCApXG5cdFx0XHRcdHBsYW5hci54IFx4M2QgNC4wIC0gdi54O1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueCBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWCBceDNkIHNpZ24oIHYueCApO1xuXHRcdFx0cGxhbmFyLnggXHgzZCB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueSBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWSBceDNkIHNpZ24oIHYueSApO1xuXHRcdFx0cGxhbmFyLnggXHgzZCB2LnggKyAyLjAgKiBzaWduWSArIDIuMDtcblx0XHRcdHBsYW5hci55IFx4M2Qgdi56ICogc2lnblkgLSAyLjA7XG5cdFx0fVxuXHRcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcblx0fVxuXHRmbG9hdCBnZXRQb2ludFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQsIGZsb2F0IHNoYWRvd0NhbWVyYU5lYXIsIGZsb2F0IHNoYWRvd0NhbWVyYUZhciApIHtcblx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApO1xuXHRcdHZlYzMgbGlnaHRUb1Bvc2l0aW9uIFx4M2Qgc2hhZG93Q29vcmQueHl6O1xuXHRcdGZsb2F0IGRwIFx4M2QgKCBsZW5ndGgoIGxpZ2h0VG9Qb3NpdGlvbiApIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7XHRcdGRwICtceDNkIHNoYWRvd0JpYXM7XG5cdFx0dmVjMyBiZDNEIFx4M2Qgbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcblx0XHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0dmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAqIHRleGVsU2l6ZS55O1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwIClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIiwKc2hhZG93bWFwX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBzcG90U2hhZG93TWF0cml4WyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcbiNlbmRpZiIsCnNoYWRvd21hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gXHgzZCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcblx0fVxuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gXHgzZCBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSBceDNkIHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xuXHRmbG9hdCBzaGFkb3cgXHgzZCAxLjA7XG5cdCNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0ZGlyZWN0aW9uYWxMaWdodCBceDNkIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XG5cdFx0c2hhZG93ICpceDNkIGJvb2woIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCBceDNkIHNwb3RMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKlx4M2QgYm9vbCggc3BvdExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgXHgzZCBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRvdyAqXHgzZCBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjZW5kaWZcblx0cmV0dXJuIHNoYWRvdztcbn0iLApza2luYmFzZV92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0bWF0NCBib25lTWF0WCBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC54ICk7XG5cdG1hdDQgYm9uZU1hdFkgXHgzZCBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApO1xuXHRtYXQ0IGJvbmVNYXRaIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTtcblx0bWF0NCBib25lTWF0VyBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC53ICk7XG4jZW5kaWYiLHNraW5uaW5nX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4O1xuXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeEludmVyc2U7XG5cdCNpZmRlZiBCT05FX1RFWFRVUkVcblx0XHR1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcblx0XHR1bmlmb3JtIGludCBib25lVGV4dHVyZVNpemU7XG5cdFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xuXHRcdFx0ZmxvYXQgaiBceDNkIGkgKiA0LjA7XG5cdFx0XHRmbG9hdCB4IFx4M2QgbW9kKCBqLCBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcblx0XHRcdGZsb2F0IHkgXHgzZCBmbG9vciggaiAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgZHggXHgzZCAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XG5cdFx0XHRmbG9hdCBkeSBceDNkIDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcblx0XHRcdHkgXHgzZCBkeSAqICggeSArIDAuNSApO1xuXHRcdFx0dmVjNCB2MSBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMC41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2MiBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMS41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2MyBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMi41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2NCBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMy41ICksIHkgKSApO1xuXHRcdFx0bWF0NCBib25lIFx4M2QgbWF0NCggdjEsIHYyLCB2MywgdjQgKTtcblx0XHRcdHJldHVybiBib25lO1xuXHRcdH1cblx0I2Vsc2Vcblx0XHR1bmlmb3JtIG1hdDQgYm9uZU1hdHJpY2VzWyBNQVhfQk9ORVMgXTtcblx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRtYXQ0IGJvbmUgXHgzZCBib25lTWF0cmljZXNbIGludChpKSBdO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZW5kaWZcbiNlbmRpZiIsCnNraW5uaW5nX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR2ZWM0IHNraW5WZXJ0ZXggXHgzZCBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuXHR2ZWM0IHNraW5uZWQgXHgzZCB2ZWM0KCAwLjAgKTtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XG5cdHNraW5uZWQgK1x4M2QgYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55O1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XG5cdHRyYW5zZm9ybWVkIFx4M2QgKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7XG4jZW5kaWYiLHNraW5ub3JtYWxfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgc2tpbk1hdHJpeCBceDNkIG1hdDQoIDAuMCApO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueiAqIGJvbmVNYXRaO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xuXHRza2luTWF0cml4ICBceDNkIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7XG5cdG9iamVjdE5vcm1hbCBceDNkIHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3ROb3JtYWwsIDAuMCApICkueHl6O1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHRvYmplY3RUYW5nZW50IFx4M2QgdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6O1xuXHQjZW5kaWZcbiNlbmRpZiIsCnNwZWN1bGFybWFwX2ZyYWdtZW50OiJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR2ZWM0IHRleGVsU3BlY3VsYXIgXHgzZCB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcblx0c3BlY3VsYXJTdHJlbmd0aCBceDNkIHRleGVsU3BlY3VsYXIucjtcbiNlbHNlXG5cdHNwZWN1bGFyU3RyZW5ndGggXHgzZCAxLjA7XG4jZW5kaWYiLHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7XG4jZW5kaWYiLHRvbmVtYXBwaW5nX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiLHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiNpZm5kZWYgc2F0dXJhdGVcblx0I2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2VuZGlmXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nV2hpdGVQb2ludDtcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdHJldHVybiB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3I7XG59XG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xufVxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVyKCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAuMDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAyIC8gMC4zMCwgdmVjMyggMC4wICkgKVxudmVjMyBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggVW5jaGFydGVkMkhlbHBlciggY29sb3IgKSAvIFVuY2hhcnRlZDJIZWxwZXIoIHZlYzMoIHRvbmVNYXBwaW5nV2hpdGVQb2ludCApICkgKTtcbn1cbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdGNvbG9yIFx4M2QgbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xuXHRyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xufVxudmVjMyBBQ0VTRmlsbWljVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggKCBjb2xvciAqICggMi41MSAqIGNvbG9yICsgMC4wMyApICkgLyAoIGNvbG9yICogKCAyLjQzICogY29sb3IgKyAwLjU5ICkgKyAwLjE0ICkgKTtcbn0iLAp1dl9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1VWXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG4jZW5kaWYiLHV2X3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG5cdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbiNlbmRpZiIsdXZfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZVdiBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG4jZW5kaWYiLHV2Ml9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml9wYXJzX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdGF0dHJpYnV0ZSB2ZWMyIHV2Mjtcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml92ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2VXYyIFx4M2QgdXYyO1xuI2VuZGlmIiwKd29ybGRwb3NfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKVxuXHR2ZWM0IHdvcmxkUG9zaXRpb24gXHgzZCBtb2RlbE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbiNlbmRpZiIsYmFja2dyb3VuZF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0MkQ7XG52YXJ5aW5nIHZlYzIgdlV2O1xudm9pZCBtYWluKCkge1xuXHR2ZWM0IHRleENvbG9yIFx4M2QgdGV4dHVyZTJEKCB0MkQsIHZVdiApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG59IixiYWNrZ3JvdW5kX3ZlcnQ6InZhcnlpbmcgdmVjMiB2VXY7XG51bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG52b2lkIG1haW4oKSB7XG5cdHZVdiBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7XG59IiwKY3ViZV9mcmFnOiJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xudW5pZm9ybSBmbG9hdCB0RmxpcDtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG52b2lkIG1haW4oKSB7XG5cdHZlYzQgdGV4Q29sb3IgXHgzZCB0ZXh0dXJlQ3ViZSggdEN1YmUsIHZlYzMoIHRGbGlwICogdldvcmxkRGlyZWN0aW9uLngsIHZXb3JsZERpcmVjdGlvbi55eiApICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdGdsX0ZyYWdDb2xvci5hICpceDNkIG9wYWNpdHk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLGN1YmVfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0Z2xfUG9zaXRpb24ueiBceDNkIGdsX1Bvc2l0aW9uLnc7XG59IiwKZGVwdGhfZnJhZzoiI2lmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMFxuXHR1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCAxLjAgKTtcblx0I2lmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMFxuXHRcdGRpZmZ1c2VDb2xvci5hIFx4M2Qgb3BhY2l0eTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdFx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggdmVjMyggMS4wIC0gZ2xfRnJhZ0Nvb3JkLnogKSwgb3BhY2l0eSApO1xuXHQjZWxpZiBERVBUSF9QQUNLSU5HIFx4M2RceDNkIDMyMDFcblx0XHRnbF9GcmFnQ29sb3IgXHgzZCBwYWNrRGVwdGhUb1JHQkEoIGdsX0ZyYWdDb29yZC56ICk7XG5cdCNlbmRpZlxufSIsCmRlcHRoX3ZlcnQ6IiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHRcdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG59IiwKZGlzdGFuY2VSR0JBX2ZyYWc6IiNkZWZpbmUgRElTVEFOQ0VcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xudW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4gKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdGZsb2F0IGRpc3QgXHgzZCBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcblx0ZGlzdCBceDNkICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xuXHRkaXN0IFx4M2Qgc2F0dXJhdGUoIGRpc3QgKTtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XG59IiwKZGlzdGFuY2VSR0JBX3ZlcnQ6IiNkZWZpbmUgRElTVEFOQ0VcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHRcdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdHZXb3JsZFBvc2l0aW9uIFx4M2Qgd29ybGRQb3NpdGlvbi54eXo7XG59IiwKZXF1aXJlY3RfZnJhZzoidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZlYzMgZGlyZWN0aW9uIFx4M2Qgbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTtcblx0dmVjMiBzYW1wbGVVVjtcblx0c2FtcGxlVVYueSBceDNkIGFzaW4oIGNsYW1wKCBkaXJlY3Rpb24ueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRzYW1wbGVVVi54IFx4M2QgYXRhbiggZGlyZWN0aW9uLnosIGRpcmVjdGlvbi54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0dmVjNCB0ZXhDb2xvciBceDNkIHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG59IiwKZXF1aXJlY3RfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcbn0iLGxpbmVkYXNoZWRfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIGZsb2F0IGRhc2hTaXplO1xudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0aWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApIFx4M2UgZGFzaFNpemUgKSB7XG5cdFx0ZGlzY2FyZDtcblx0fVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLApsaW5lZGFzaGVkX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2NhbGU7XG5hdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlO1xudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHR2TGluZURpc3RhbmNlIFx4M2Qgc2NhbGUgKiBsaW5lRGlzdGFuY2U7XG5cdHZlYzQgbXZQb3NpdGlvbiBceDNkIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hiYXNpY19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9jb21tb25fcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfZnJhZ21lbnRceDNlXG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCB2ZWMzKCAxLjAgKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICpceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNoYmFzaWNfdmVydDoiI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2Vcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLAptZXNobGFtYmVydF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcbnZhcnlpbmcgdmVjMyB2SW5kaXJlY3RGcm9udDtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XG5cdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hc2tfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCBceDNkIFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSBceDNkIGVtaXNzaXZlO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlIFx4M2QgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCAoIGdsX0Zyb250RmFjaW5nICkgPyB2SW5kaXJlY3RGcm9udCA6IHZJbmRpcmVjdEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIHZJbmRpcmVjdEZyb250O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2xpZ2h0bWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKlx4M2QgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgXHgzZCAoIGdsX0Zyb250RmFjaW5nICkgPyB2TGlnaHRGcm9udCA6IHZMaWdodEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSBceDNkIHZMaWdodEZyb250O1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSAqXHgzZCBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApICogZ2V0U2hhZG93TWFzaygpO1xuXHQjaW5jbHVkZSBceDNjYW9tYXBfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfZnJhZ21lbnRceDNlXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfZnJhZ21lbnRceDNlXG59IiwKbWVzaGxhbWJlcnRfdmVydDoiI2RlZmluZSBMQU1CRVJUXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG52YXJ5aW5nIHZlYzMgdkluZGlyZWN0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xuXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2xhbWJlcnRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaG1hdGNhcF9mcmFnOiIjZGVmaW5lIE1BVENBUFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIHNhbXBsZXIyRCBtYXRjYXA7XG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NhbHBoYW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0dmVjMyB2aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG5cdHZlYzMgeCBceDNkIG5vcm1hbGl6ZSggdmVjMyggdmlld0Rpci56LCAwLjAsIC0gdmlld0Rpci54ICkgKTtcblx0dmVjMyB5IFx4M2QgY3Jvc3MoIHZpZXdEaXIsIHggKTtcblx0dmVjMiB1diBceDNkIHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41O1xuXHQjaWZkZWYgVVNFX01BVENBUFxuXHRcdHZlYzQgbWF0Y2FwQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTtcblx0XHRtYXRjYXBDb2xvciBceDNkIG1hdGNhcFRleGVsVG9MaW5lYXIoIG1hdGNhcENvbG9yICk7XG5cdCNlbHNlXG5cdFx0dmVjNCBtYXRjYXBDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjZW5kaWZcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYiAqIG1hdGNhcENvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNobWF0Y2FwX3ZlcnQ6IiNkZWZpbmUgTUFUQ0FQXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuXHQjaWZuZGVmIEZMQVRfU0hBREVEXG5cdFx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG59IiwKbWVzaHBob25nX2ZyYWc6IiNkZWZpbmUgUEhPTkdcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2dyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfcGhvbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9lbmRceDNlXG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNocGhvbmdfdmVydDoiI2RlZmluZSBQSE9OR1xudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdHZWaWV3UG9zaXRpb24gXHgzZCAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZW52bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NoYWRvd21hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hwaHlzaWNhbF9mcmFnOiIjZGVmaW5lIFNUQU5EQVJEXG4jaWZkZWYgUEhZU0lDQUxcblx0I2RlZmluZSBSRUZMRUNUSVZJVFlcblx0I2RlZmluZSBDTEVBUkNPQVRcblx0I2RlZmluZSBUUkFOU1BBUkVOQ1lcbiNlbmRpZlxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IHJvdWdobmVzcztcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmZGVmIFRSQU5TUEFSRU5DWVxuXHR1bmlmb3JtIGZsb2F0IHRyYW5zcGFyZW5jeTtcbiNlbmRpZlxuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdDtcblx0dW5pZm9ybSBmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dW5pZm9ybSB2ZWMzIHNoZWVuO1xuI2VuZGlmXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGVhcmNvYXRfbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nyb3VnaG5lc3NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtZXRhbG5lc3NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19waHlzaWNhbF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2VuZFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaWZkZWYgVFJBTlNQQVJFTkNZXG5cdFx0ZGlmZnVzZUNvbG9yLmEgKlx4M2Qgc2F0dXJhdGUoIDEuIC0gdHJhbnNwYXJlbmN5ICsgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICkgKTtcblx0I2VuZGlmXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfZnJhZ21lbnRceDNlXG59IiwKbWVzaHBoeXNpY2FsX3ZlcnQ6IiNkZWZpbmUgU1RBTkRBUkRcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZUYW5nZW50IFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZFRhbmdlbnQgKTtcblx0XHR2Qml0YW5nZW50IFx4M2Qgbm9ybWFsaXplKCBjcm9zcyggdk5vcm1hbCwgdlRhbmdlbnQgKSAqIHRhbmdlbnQudyApO1xuXHQjZW5kaWZcbiNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLApub3JtYWxfZnJhZzoiI2RlZmluZSBOT1JNQUxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xufSIsCm5vcm1hbF92ZXJ0OiIjZGVmaW5lIE5PUk1BTFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWZcbn0iLApwb2ludHNfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfcGFydGljbGVfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0b3V0Z29pbmdMaWdodCBceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2NwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG59IiwKcG9pbnRzX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2l6ZTtcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0Z2xfUG9pbnRTaXplIFx4M2Qgc2l6ZTtcblx0I2lmZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgXHgzZCAoIHByb2plY3Rpb25NYXRyaXhbIDIgXVsgMyBdIFx4M2RceDNkIC0gMS4wICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgZ2xfUG9pbnRTaXplICpceDNkICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCnNoYWRvd19mcmFnOiJ1bmlmb3JtIHZlYzMgY29sb3I7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFza19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBjb2xvciwgb3BhY2l0eSAqICggMS4wIC0gZ2V0U2hhZG93TWFzaygpICkgKTtcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLHNoYWRvd192ZXJ0OiIjaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKc3ByaXRlX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCnNwcml0ZV92ZXJ0OiJ1bmlmb3JtIGZsb2F0IHJvdGF0aW9uO1xudW5pZm9ybSB2ZWMyIGNlbnRlcjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0dmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cdHZlYzIgc2NhbGU7XG5cdHNjYWxlLnggXHgzZCBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueCwgbW9kZWxNYXRyaXhbIDAgXS55LCBtb2RlbE1hdHJpeFsgMCBdLnogKSApO1xuXHRzY2FsZS55IFx4M2QgbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLngsIG1vZGVsTWF0cml4WyAxIF0ueSwgbW9kZWxNYXRyaXhbIDEgXS56ICkgKTtcblx0I2lmbmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXG5cdFx0Ym9vbCBpc1BlcnNwZWN0aXZlIFx4M2QgKCBwcm9qZWN0aW9uTWF0cml4WyAyIF1bIDMgXSBceDNkXHgzZCAtIDEuMCApO1xuXHRcdGlmICggaXNQZXJzcGVjdGl2ZSApIHNjYWxlICpceDNkIC0gbXZQb3NpdGlvbi56O1xuXHQjZW5kaWZcblx0dmVjMiBhbGlnbmVkUG9zaXRpb24gXHgzZCAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZTtcblx0dmVjMiByb3RhdGVkUG9zaXRpb247XG5cdHJvdGF0ZWRQb3NpdGlvbi54IFx4M2QgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcblx0cm90YXRlZFBvc2l0aW9uLnkgXHgzZCBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRtdlBvc2l0aW9uLnh5ICtceDNkIHJvdGF0ZWRQb3NpdGlvbjtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSJ9LApXYT17Y29tbW9uOntkaWZmdXNlOnt2YWx1ZTpuZXcgSSgxNTY1ODczNCl9LG9wYWNpdHk6e3ZhbHVlOjF9LG1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyB0fSxhbHBoYU1hcDp7dmFsdWU6bnVsbH19LHNwZWN1bGFybWFwOntzcGVjdWxhck1hcDp7dmFsdWU6bnVsbH19LGVudm1hcDp7ZW52TWFwOnt2YWx1ZTpudWxsfSxmbGlwRW52TWFwOnt2YWx1ZTotMX0scmVmbGVjdGl2aXR5Ont2YWx1ZToxfSxyZWZyYWN0aW9uUmF0aW86e3ZhbHVlOi45OH0sbWF4TWlwTGV2ZWw6e3ZhbHVlOjB9fSxhb21hcDp7YW9NYXA6e3ZhbHVlOm51bGx9LGFvTWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sbGlnaHRtYXA6e2xpZ2h0TWFwOnt2YWx1ZTpudWxsfSxsaWdodE1hcEludGVuc2l0eTp7dmFsdWU6MX19LGVtaXNzaXZlbWFwOntlbWlzc2l2ZU1hcDp7dmFsdWU6bnVsbH19LGJ1bXBtYXA6e2J1bXBNYXA6e3ZhbHVlOm51bGx9LGJ1bXBTY2FsZTp7dmFsdWU6MX19LG5vcm1hbG1hcDp7bm9ybWFsTWFwOnt2YWx1ZTpudWxsfSwKbm9ybWFsU2NhbGU6e3ZhbHVlOm5ldyBmKDEsMSl9fSxkaXNwbGFjZW1lbnRtYXA6e2Rpc3BsYWNlbWVudE1hcDp7dmFsdWU6bnVsbH0sZGlzcGxhY2VtZW50U2NhbGU6e3ZhbHVlOjF9LGRpc3BsYWNlbWVudEJpYXM6e3ZhbHVlOjB9fSxyb3VnaG5lc3NtYXA6e3JvdWdobmVzc01hcDp7dmFsdWU6bnVsbH19LG1ldGFsbmVzc21hcDp7bWV0YWxuZXNzTWFwOnt2YWx1ZTpudWxsfX0sZ3JhZGllbnRtYXA6e2dyYWRpZW50TWFwOnt2YWx1ZTpudWxsfX0sZm9nOntmb2dEZW5zaXR5Ont2YWx1ZToyLjVFLTR9LGZvZ05lYXI6e3ZhbHVlOjF9LGZvZ0Zhcjp7dmFsdWU6MkUzfSxmb2dDb2xvcjp7dmFsdWU6bmV3IEkoMTY3NzcyMTUpfX0sbGlnaHRzOnthbWJpZW50TGlnaHRDb2xvcjp7dmFsdWU6W119LGxpZ2h0UHJvYmU6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LGNvbG9yOnt9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LApzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LGRpcmVjdGlvbmFsU2hhZG93TWFwOnt2YWx1ZTpbXX0sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxzcG90TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkaXJlY3Rpb246e30sZGlzdGFuY2U6e30sY29uZUNvczp7fSxwZW51bWJyYUNvczp7fSxkZWNheTp7fSxzaGFkb3c6e30sc2hhZG93Qmlhczp7fSxzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LHNwb3RTaGFkb3dNYXA6e3ZhbHVlOltdfSxzcG90U2hhZG93TWF0cml4Ont2YWx1ZTpbXX0scG9pbnRMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRlY2F5Ont9LGRpc3RhbmNlOnt9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9LHNoYWRvd0NhbWVyYU5lYXI6e30sc2hhZG93Q2FtZXJhRmFyOnt9fX0sCnBvaW50U2hhZG93TWFwOnt2YWx1ZTpbXX0scG9pbnRTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxoZW1pc3BoZXJlTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sc2t5Q29sb3I6e30sZ3JvdW5kQ29sb3I6e319fSxyZWN0QXJlYUxpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sd2lkdGg6e30saGVpZ2h0Ont9fX19LHBvaW50czp7ZGlmZnVzZTp7dmFsdWU6bmV3IEkoMTU2NTg3MzQpfSxvcGFjaXR5Ont2YWx1ZToxfSxzaXplOnt2YWx1ZToxfSxzY2FsZTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IHR9fSxzcHJpdGU6e2RpZmZ1c2U6e3ZhbHVlOm5ldyBJKDE1NjU4NzM0KX0sb3BhY2l0eTp7dmFsdWU6MX0sY2VudGVyOnt2YWx1ZTpuZXcgZiguNSwuNSl9LHJvdGF0aW9uOnt2YWx1ZTowfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgdH19fSxNYz0Ke2Jhc2ljOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLnNwZWN1bGFybWFwLFdhLmVudm1hcCxXYS5hb21hcCxXYS5saWdodG1hcCxXYS5mb2ddKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaGJhc2ljX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaGJhc2ljX2ZyYWd9LGxhbWJlcnQ6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2Euc3BlY3VsYXJtYXAsV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmVtaXNzaXZlbWFwLFdhLmZvZyxXYS5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgSSgwKX19XSksdmVydGV4U2hhZGVyOnJiLm1lc2hsYW1iZXJ0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaGxhbWJlcnRfZnJhZ30scGhvbmc6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2Euc3BlY3VsYXJtYXAsV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmVtaXNzaXZlbWFwLFdhLmJ1bXBtYXAsV2Eubm9ybWFsbWFwLFdhLmRpc3BsYWNlbWVudG1hcCxXYS5ncmFkaWVudG1hcCwKV2EuZm9nLFdhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBJKDApfSxzcGVjdWxhcjp7dmFsdWU6bmV3IEkoMTExODQ4MSl9LHNoaW5pbmVzczp7dmFsdWU6MzB9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNocGhvbmdfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNocGhvbmdfZnJhZ30sc3RhbmRhcmQ6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmVtaXNzaXZlbWFwLFdhLmJ1bXBtYXAsV2Eubm9ybWFsbWFwLFdhLmRpc3BsYWNlbWVudG1hcCxXYS5yb3VnaG5lc3NtYXAsV2EubWV0YWxuZXNzbWFwLFdhLmZvZyxXYS5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgSSgwKX0scm91Z2huZXNzOnt2YWx1ZTouNX0sbWV0YWxuZXNzOnt2YWx1ZTouNX0sZW52TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaHBoeXNpY2FsX2ZyYWd9LAptYXRjYXA6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLFdhLmZvZyx7bWF0Y2FwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaG1hdGNhcF92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLm1lc2htYXRjYXBfZnJhZ30scG9pbnRzOnt1bmlmb3JtczpCYihbV2EucG9pbnRzLFdhLmZvZ10pLHZlcnRleFNoYWRlcjpyYi5wb2ludHNfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5wb2ludHNfZnJhZ30sZGFzaGVkOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmZvZyx7c2NhbGU6e3ZhbHVlOjF9LGRhc2hTaXplOnt2YWx1ZToxfSx0b3RhbFNpemU6e3ZhbHVlOjJ9fV0pLHZlcnRleFNoYWRlcjpyYi5saW5lZGFzaGVkX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubGluZWRhc2hlZF9mcmFnfSxkZXB0aDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5kaXNwbGFjZW1lbnRtYXBdKSx2ZXJ0ZXhTaGFkZXI6cmIuZGVwdGhfdmVydCwKZnJhZ21lbnRTaGFkZXI6cmIuZGVwdGhfZnJhZ30sbm9ybWFsOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmJ1bXBtYXAsV2Eubm9ybWFsbWFwLFdhLmRpc3BsYWNlbWVudG1hcCx7b3BhY2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOnJiLm5vcm1hbF92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLm5vcm1hbF9mcmFnfSxzcHJpdGU6e3VuaWZvcm1zOkJiKFtXYS5zcHJpdGUsV2EuZm9nXSksdmVydGV4U2hhZGVyOnJiLnNwcml0ZV92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLnNwcml0ZV9mcmFnfSxiYWNrZ3JvdW5kOnt1bmlmb3Jtczp7dXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyB0fSx0MkQ6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6cmIuYmFja2dyb3VuZF92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLmJhY2tncm91bmRfZnJhZ30sY3ViZTp7dW5pZm9ybXM6e3RDdWJlOnt2YWx1ZTpudWxsfSx0RmxpcDp7dmFsdWU6LTF9LG9wYWNpdHk6e3ZhbHVlOjF9fSx2ZXJ0ZXhTaGFkZXI6cmIuY3ViZV92ZXJ0LApmcmFnbWVudFNoYWRlcjpyYi5jdWJlX2ZyYWd9LGVxdWlyZWN0Ont1bmlmb3Jtczp7dEVxdWlyZWN0Ont2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOnJiLmVxdWlyZWN0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuZXF1aXJlY3RfZnJhZ30sZGlzdGFuY2VSR0JBOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmRpc3BsYWNlbWVudG1hcCx7cmVmZXJlbmNlUG9zaXRpb246e3ZhbHVlOm5ldyBrfSxuZWFyRGlzdGFuY2U6e3ZhbHVlOjF9LGZhckRpc3RhbmNlOnt2YWx1ZToxRTN9fV0pLHZlcnRleFNoYWRlcjpyYi5kaXN0YW5jZVJHQkFfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5kaXN0YW5jZVJHQkFfZnJhZ30sc2hhZG93Ont1bmlmb3JtczpCYihbV2EubGlnaHRzLFdhLmZvZyx7Y29sb3I6e3ZhbHVlOm5ldyBJKDApfSxvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIuc2hhZG93X3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuc2hhZG93X2ZyYWd9fTtNYy5waHlzaWNhbD0Ke3VuaWZvcm1zOkJiKFtNYy5zdGFuZGFyZC51bmlmb3Jtcyx7dHJhbnNwYXJlbmN5Ont2YWx1ZTowfSxjbGVhcmNvYXQ6e3ZhbHVlOjB9LGNsZWFyY29hdFJvdWdobmVzczp7dmFsdWU6MH0sc2hlZW46e3ZhbHVlOm5ldyBJKDApfSxjbGVhcmNvYXROb3JtYWxTY2FsZTp7dmFsdWU6bmV3IGYoMSwxKX0sY2xlYXJjb2F0Tm9ybWFsTWFwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaHBoeXNpY2FsX2ZyYWd9O3JkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7cmQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXJkO0xjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7TGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxjO2NkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTtjZC5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2Q7Y2QucHJvdG90eXBlLmlzQ3ViZVRleHR1cmU9CiEwO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjZC5wcm90b3R5cGUsImltYWdlcyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmltYWdlfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5pbWFnZT1hfX0pO3JlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTtyZS5wcm90b3R5cGUuY29uc3RydWN0b3I9cmU7cmUucHJvdG90eXBlLmlzRGF0YVRleHR1cmUyREFycmF5PSEwO3NlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTtzZS5wcm90b3R5cGUuY29uc3RydWN0b3I9c2U7c2UucHJvdG90eXBlLmlzRGF0YVRleHR1cmUzRD0hMDt2YXIgaWo9bmV3IGwsZWw9bmV3IHJlLGdsPW5ldyBzZSxqaj1uZXcgY2QsY2o9W10sZWo9W10saGo9bmV3IEZsb2F0MzJBcnJheSgxNiksZ2o9bmV3IEZsb2F0MzJBcnJheSg5KSxmaj1uZXcgRmxvYXQzMkFycmF5KDQpO2tqLnByb3RvdHlwZS51cGRhdGVDYWNoZT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmNhY2hlO2EgaW5zdGFuY2VvZgpGbG9hdDMyQXJyYXkmJmMubGVuZ3RoIT09YS5sZW5ndGgmJih0aGlzLmNhY2hlPW5ldyBGbG9hdDMyQXJyYXkoYS5sZW5ndGgpKTttYyhjLGEpfTtsai5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oYSxjLGUpe2Zvcih2YXIgZz10aGlzLnNlcSxyPTAsdj1nLmxlbmd0aDtyIT09djsrK3Ipe3ZhciB6PWdbcl07ei5zZXRWYWx1ZShhLGNbei5pZF0sZSl9fTt2YXIgTGg9LyhbXHdcZF9dKykoXF0pPyhcW3xcLik/L2c7dWQucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKGEsYyxlLGcpe2M9dGhpcy5tYXBbY107dm9pZCAwIT09YyYmYy5zZXRWYWx1ZShhLGUsZyl9O3VkLnByb3RvdHlwZS5zZXRPcHRpb25hbD1mdW5jdGlvbihhLGMsZSl7Yz1jW2VdO3ZvaWQgMCE9PWMmJnRoaXMuc2V0VmFsdWUoYSxlLGMpfTt1ZC51cGxvYWQ9ZnVuY3Rpb24oYSxjLGUsZyl7Zm9yKHZhciByPTAsdj1jLmxlbmd0aDtyIT09djsrK3Ipe3ZhciB6PWNbcl0sRT1lW3ouaWRdOyExIT09RS5uZWVkc1VwZGF0ZSYmCnouc2V0VmFsdWUoYSxFLnZhbHVlLGcpfX07dWQuc2VxV2l0aFZhbHVlPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPVtdLGc9MCxyPWEubGVuZ3RoO2chPT1yOysrZyl7dmFyIHY9YVtnXTt2LmlkIGluIGMmJmUucHVzaCh2KX1yZXR1cm4gZX07dmFyIEtsPTAsVGw9MDt2ZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7dmQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXZkO3ZkLnByb3RvdHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsPSEwO3ZkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZGVwdGhQYWNraW5nPWEuZGVwdGhQYWNraW5nO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1hcD1hLm1hcDt0aGlzLmFscGhhTWFwPWEuYWxwaGFNYXA7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KYS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3JldHVybiB0aGlzfTt3ZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7d2QucHJvdG90eXBlLmNvbnN0cnVjdG9yPXdkO3dkLnByb3RvdHlwZS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPSEwO3dkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weShhLnJlZmVyZW5jZVBvc2l0aW9uKTt0aGlzLm5lYXJEaXN0YW5jZT1hLm5lYXJEaXN0YW5jZTt0aGlzLmZhckRpc3RhbmNlPWEuZmFyRGlzdGFuY2U7dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubWFwPWEubWFwO3RoaXMuYWxwaGFNYXA9CmEuYWxwaGFNYXA7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7cmV0dXJuIHRoaXN9O3VlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp1ZSxpc0dyb3VwOiEwfSk7dmYucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh2Yi5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp2Zixpc0FycmF5Q2FtZXJhOiEwfSk7dmFyIHlqPW5ldyBrLHpqPW5ldyBrO09iamVjdC5hc3NpZ24oTmgucHJvdG90eXBlLGQucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKEFqLnByb3RvdHlwZSxkLnByb3RvdHlwZSk7T2JqZWN0LmFzc2lnbih6Zy5wcm90b3R5cGUse2lzRm9nRXhwMjohMCxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgemcodGhpcy5jb2xvciwKdGhpcy5kZW5zaXR5KX0sdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkZvZ0V4cDIiLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksZGVuc2l0eTp0aGlzLmRlbnNpdHl9fX0pO09iamVjdC5hc3NpZ24oQWcucHJvdG90eXBlLHtpc0ZvZzohMCxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgQWcodGhpcy5jb2xvcix0aGlzLm5lYXIsdGhpcy5mYXIpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiRm9nIixjb2xvcjp0aGlzLmNvbG9yLmdldEhleCgpLG5lYXI6dGhpcy5uZWFyLGZhcjp0aGlzLmZhcn19fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFFkLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYSl7ITA9PT1hJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuYXNzaWduKFFkLnByb3RvdHlwZSx7aXNJbnRlcmxlYXZlZEJ1ZmZlcjohMCxvblVwbG9hZENhbGxiYWNrOmZ1bmN0aW9uKCl7fSxzZXRBcnJheTpmdW5jdGlvbihhKXtpZihBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7CnRoaXMuY291bnQ9dm9pZCAwIT09YT9hLmxlbmd0aC90aGlzLnN0cmlkZTowO3RoaXMuYXJyYXk9YTtyZXR1cm4gdGhpc30sc2V0RHluYW1pYzpmdW5jdGlvbihhKXt0aGlzLmR5bmFtaWM9YTtyZXR1cm4gdGhpc30sY29weTpmdW5jdGlvbihhKXt0aGlzLmFycmF5PW5ldyBhLmFycmF5LmNvbnN0cnVjdG9yKGEuYXJyYXkpO3RoaXMuY291bnQ9YS5jb3VudDt0aGlzLnN0cmlkZT1hLnN0cmlkZTt0aGlzLmR5bmFtaWM9YS5keW5hbWljO3JldHVybiB0aGlzfSxjb3B5QXQ6ZnVuY3Rpb24oYSxjLGUpe2EqPXRoaXMuc3RyaWRlO2UqPWMuc3RyaWRlO2Zvcih2YXIgZz0wLHI9dGhpcy5zdHJpZGU7ZzxyO2crKyl0aGlzLmFycmF5W2ErZ109Yy5hcnJheVtlK2ddO3JldHVybiB0aGlzfSxzZXQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0wKTt0aGlzLmFycmF5LnNldChhLGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sCm9uVXBsb2FkOmZ1bmN0aW9uKGEpe3RoaXMub25VcGxvYWRDYWxsYmFjaz1hO3JldHVybiB0aGlzfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHhmLnByb3RvdHlwZSx7Y291bnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGEuY291bnR9fSxhcnJheTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheX19fSk7T2JqZWN0LmFzc2lnbih4Zi5wcm90b3R5cGUse2lzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6ITAsc2V0WDpmdW5jdGlvbihhLGMpe3RoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdPWM7cmV0dXJuIHRoaXN9LHNldFk6ZnVuY3Rpb24oYSxjKXt0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdPWM7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYSxjKXt0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdPWM7cmV0dXJuIHRoaXN9LApzZXRXOmZ1bmN0aW9uKGEsYyl7dGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXT1jO3JldHVybiB0aGlzfSxnZXRYOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XX0sZ2V0WTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsxXX0sZ2V0WjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsyXX0sZ2V0VzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXX0sc2V0WFk6ZnVuY3Rpb24oYSxjLGUpe2E9YSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVthKzBdPWM7dGhpcy5kYXRhLmFycmF5W2ErMV09ZTtyZXR1cm4gdGhpc30sc2V0WFlaOmZ1bmN0aW9uKGEsCmMsZSxnKXthPWEqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDt0aGlzLmRhdGEuYXJyYXlbYSswXT1jO3RoaXMuZGF0YS5hcnJheVthKzFdPWU7dGhpcy5kYXRhLmFycmF5W2ErMl09ZztyZXR1cm4gdGhpc30sc2V0WFlaVzpmdW5jdGlvbihhLGMsZSxnLHIpe2E9YSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVthKzBdPWM7dGhpcy5kYXRhLmFycmF5W2ErMV09ZTt0aGlzLmRhdGEuYXJyYXlbYSsyXT1nO3RoaXMuZGF0YS5hcnJheVthKzNdPXI7cmV0dXJuIHRoaXN9fSk7QWQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO0FkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BZDtBZC5wcm90b3R5cGUuaXNTcHJpdGVNYXRlcmlhbD0hMDtBZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXA9YS5tYXA7dGhpcy5yb3RhdGlvbj0KYS5yb3RhdGlvbjt0aGlzLnNpemVBdHRlbnVhdGlvbj1hLnNpemVBdHRlbnVhdGlvbjtyZXR1cm4gdGhpc307dmFyIEFlLG1nPW5ldyBrLG5mPW5ldyBrLG9mPW5ldyBrLEJlPW5ldyBmLHpmPW5ldyBmLEZqPW5ldyBxLHFoPW5ldyBrLG5nPW5ldyBrLHJoPW5ldyBrLGtrPW5ldyBmLEtpPW5ldyBmLGxrPW5ldyBmO3lmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp5Zixpc1Nwcml0ZTohMCxyYXljYXN0OmZ1bmN0aW9uKGEsYyl7bnVsbD09PWEuY2FtZXJhJiZjb25zb2xlLmVycm9yKCdUSFJFRS5TcHJpdGU6ICJSYXljYXN0ZXIuY2FtZXJhIiBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gcmF5Y2FzdCBhZ2FpbnN0IHNwcml0ZXMuJyk7bmYuc2V0RnJvbU1hdHJpeFNjYWxlKHRoaXMubWF0cml4V29ybGQpO0ZqLmNvcHkoYS5jYW1lcmEubWF0cml4V29ybGQpO3RoaXMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoYS5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLAp0aGlzLm1hdHJpeFdvcmxkKTtvZi5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpO2EuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJiExPT09dGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24mJm5mLm11bHRpcGx5U2NhbGFyKC1vZi56KTt2YXIgZT10aGlzLm1hdGVyaWFsLnJvdGF0aW9uO2lmKDAhPT1lKXt2YXIgZz1NYXRoLmNvcyhlKTt2YXIgcj1NYXRoLnNpbihlKX1lPXRoaXMuY2VudGVyO0JnKHFoLnNldCgtLjUsLS41LDApLG9mLGUsbmYscixnKTtCZyhuZy5zZXQoLjUsLS41LDApLG9mLGUsbmYscixnKTtCZyhyaC5zZXQoLjUsLjUsMCksb2YsZSxuZixyLGcpO2trLnNldCgwLDApO0tpLnNldCgxLDApO2xrLnNldCgxLDEpO3ZhciB2PWEucmF5LmludGVyc2VjdFRyaWFuZ2xlKHFoLG5nLHJoLCExLG1nKTtpZihudWxsPT09diYmKEJnKG5nLnNldCgtLjUsLjUsMCksb2YsZSxuZixyLGcpLEtpLnNldCgwLDEpLHY9YS5yYXkuaW50ZXJzZWN0VHJpYW5nbGUocWgsCnJoLG5nLCExLG1nKSxudWxsPT09dikpcmV0dXJuO3I9YS5yYXkub3JpZ2luLmRpc3RhbmNlVG8obWcpO3I8YS5uZWFyfHxyPmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOnIscG9pbnQ6bWcuY2xvbmUoKSx1djpCLmdldFVWKG1nLHFoLG5nLHJoLGtrLEtpLGxrLG5ldyBmKSxmYWNlOm51bGwsb2JqZWN0OnRoaXN9KX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dm9pZCAwIT09YS5jZW50ZXImJnRoaXMuY2VudGVyLmNvcHkoYS5jZW50ZXIpO3JldHVybiB0aGlzfX0pO3ZhciBzaD1uZXcgayxtaz1uZXcgaztBZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6QWYsaXNMT0Q6ITAsY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSwhMSk7YT1hLmxldmVscztmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2M8ZTtjKyspe3ZhciBnPWFbY107dGhpcy5hZGRMZXZlbChnLm9iamVjdC5jbG9uZSgpLGcuZGlzdGFuY2UpfXJldHVybiB0aGlzfSxhZGRMZXZlbDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO2M9TWF0aC5hYnMoYyk7Zm9yKHZhciBlPXRoaXMubGV2ZWxzLGc9MDtnPGUubGVuZ3RoJiYhKGM8ZVtnXS5kaXN0YW5jZSk7ZysrKTtlLnNwbGljZShnLDAse2Rpc3RhbmNlOmMsb2JqZWN0OmF9KTt0aGlzLmFkZChhKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0Rm9yRGlzdGFuY2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMubGV2ZWxzLGU9MSxnPWMubGVuZ3RoO2U8ZyYmIShhPGNbZV0uZGlzdGFuY2UpO2UrKyk7cmV0dXJuIGNbZS0xXS5vYmplY3R9LHJheWNhc3Q6ZnVuY3Rpb24oYSxjKXtzaC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZShhLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhzaCkpLnJheWNhc3QoYSwKYyl9LHVwZGF0ZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmxldmVscztpZigxPGMubGVuZ3RoKXtzaC5zZXRGcm9tTWF0cml4UG9zaXRpb24oYS5tYXRyaXhXb3JsZCk7bWsuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO2E9c2guZGlzdGFuY2VUbyhtayk7Y1swXS5vYmplY3QudmlzaWJsZT0hMDtmb3IodmFyIGU9MSxnPWMubGVuZ3RoO2U8ZztlKyspaWYoYT49Y1tlXS5kaXN0YW5jZSljW2UtMV0ub2JqZWN0LnZpc2libGU9ITEsY1tlXS5vYmplY3QudmlzaWJsZT0hMDtlbHNlIGJyZWFrO2Zvcig7ZTxnO2UrKyljW2VdLm9iamVjdC52aXNpYmxlPSExfX0sdG9KU09OOmZ1bmN0aW9uKGEpe2E9QS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKTthLm9iamVjdC5sZXZlbHM9W107Zm9yKHZhciBjPXRoaXMubGV2ZWxzLGU9MCxnPWMubGVuZ3RoO2U8ZztlKyspe3ZhciByPWNbZV07YS5vYmplY3QubGV2ZWxzLnB1c2goe29iamVjdDpyLm9iamVjdC51dWlkLApkaXN0YW5jZTpyLmRpc3RhbmNlfSl9cmV0dXJuIGF9fSk7QmYucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpCZixpc1NraW5uZWRNZXNoOiEwLGJpbmQ6ZnVuY3Rpb24oYSxjKXt0aGlzLnNrZWxldG9uPWE7dm9pZCAwPT09YyYmKHRoaXMudXBkYXRlTWF0cml4V29ybGQoITApLHRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJzZXMoKSxjPXRoaXMubWF0cml4V29ybGQpO3RoaXMuYmluZE1hdHJpeC5jb3B5KGMpO3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZShjKX0scG9zZTpmdW5jdGlvbigpe3RoaXMuc2tlbGV0b24ucG9zZSgpfSxub3JtYWxpemVTa2luV2VpZ2h0czpmdW5jdGlvbigpe2Zvcih2YXIgYT1uZXcgcCxjPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0LGU9MCxnPWMuY291bnQ7ZTxnO2UrKyl7YS54PWMuZ2V0WChlKTthLnk9Yy5nZXRZKGUpO2Euej1jLmdldFooZSk7CmEudz1jLmdldFcoZSk7dmFyIHI9MS9hLm1hbmhhdHRhbkxlbmd0aCgpO0luZmluaXR5IT09cj9hLm11bHRpcGx5U2NhbGFyKHIpOmEuc2V0KDEsMCwwLDApO2Muc2V0WFlaVyhlLGEueCxhLnksYS56LGEudyl9fSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXt4YS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGEpOyJhdHRhY2hlZCI9PT10aGlzLmJpbmRNb2RlP3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKToiZGV0YWNoZWQiPT09dGhpcy5iaW5kTW9kZT90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5iaW5kTWF0cml4KTpjb25zb2xlLndhcm4oIlRIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICIrdGhpcy5iaW5kTW9kZSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7CnZhciBuaz1uZXcgcSxJbT1uZXcgcTtPYmplY3QuYXNzaWduKENnLnByb3RvdHlwZSx7Y2FsY3VsYXRlSW52ZXJzZXM6ZnVuY3Rpb24oKXt0aGlzLmJvbmVJbnZlcnNlcz1bXTtmb3IodmFyIGE9MCxjPXRoaXMuYm9uZXMubGVuZ3RoO2E8YzthKyspe3ZhciBlPW5ldyBxO3RoaXMuYm9uZXNbYV0mJmUuZ2V0SW52ZXJzZSh0aGlzLmJvbmVzW2FdLm1hdHJpeFdvcmxkKTt0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKGUpfX0scG9zZTpmdW5jdGlvbigpe3ZhciBhLGM7dmFyIGU9MDtmb3IoYz10aGlzLmJvbmVzLmxlbmd0aDtlPGM7ZSsrKShhPXRoaXMuYm9uZXNbZV0pJiZhLm1hdHJpeFdvcmxkLmdldEludmVyc2UodGhpcy5ib25lSW52ZXJzZXNbZV0pO2U9MDtmb3IoYz10aGlzLmJvbmVzLmxlbmd0aDtlPGM7ZSsrKWlmKGE9dGhpcy5ib25lc1tlXSlhLnBhcmVudCYmYS5wYXJlbnQuaXNCb25lPyhhLm1hdHJpeC5nZXRJbnZlcnNlKGEucGFyZW50Lm1hdHJpeFdvcmxkKSxhLm1hdHJpeC5tdWx0aXBseShhLm1hdHJpeFdvcmxkKSk6CmEubWF0cml4LmNvcHkoYS5tYXRyaXhXb3JsZCksYS5tYXRyaXguZGVjb21wb3NlKGEucG9zaXRpb24sYS5xdWF0ZXJuaW9uLGEuc2NhbGUpfSx1cGRhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ib25lcyxjPXRoaXMuYm9uZUludmVyc2VzLGU9dGhpcy5ib25lTWF0cmljZXMsZz10aGlzLmJvbmVUZXh0dXJlLHI9MCx2PWEubGVuZ3RoO3I8djtyKyspbmsubXVsdGlwbHlNYXRyaWNlcyhhW3JdP2Fbcl0ubWF0cml4V29ybGQ6SW0sY1tyXSksbmsudG9BcnJheShlLDE2KnIpO3ZvaWQgMCE9PWcmJihnLm5lZWRzVXBkYXRlPSEwKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IENnKHRoaXMuYm9uZXMsdGhpcy5ib25lSW52ZXJzZXMpfSxnZXRCb25lQnlOYW1lOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wLGU9dGhpcy5ib25lcy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9dGhpcy5ib25lc1tjXTtpZihnLm5hbWU9PT1hKXJldHVybiBnfX19KTtVaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOlVoLGlzQm9uZTohMH0pO0ZiLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtGYi5wcm90b3R5cGUuY29uc3RydWN0b3I9RmI7RmIucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWw9ITA7RmIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubGluZXdpZHRoPWEubGluZXdpZHRoO3RoaXMubGluZWNhcD1hLmxpbmVjYXA7dGhpcy5saW5lam9pbj1hLmxpbmVqb2luO3JldHVybiB0aGlzfTt2YXIgb2s9bmV3IGsscGs9bmV3IGsscWs9bmV3IHEsdGg9bmV3IEQsb2c9bmV3IEY7VmIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlZiLGlzTGluZTohMCxjb21wdXRlTGluZURpc3RhbmNlczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2VvbWV0cnk7aWYoYS5pc0J1ZmZlckdlb21ldHJ5KWlmKG51bGw9PT0KYS5pbmRleCl7Zm9yKHZhciBjPWEuYXR0cmlidXRlcy5wb3NpdGlvbixlPVswXSxnPTEscj1jLmNvdW50O2c8cjtnKyspb2suZnJvbUJ1ZmZlckF0dHJpYnV0ZShjLGctMSkscGsuZnJvbUJ1ZmZlckF0dHJpYnV0ZShjLGcpLGVbZ109ZVtnLTFdLGVbZ10rPW9rLmRpc3RhbmNlVG8ocGspO2EuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBjYShlLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7ZWxzZSBpZihhLmlzR2VvbWV0cnkpZm9yKGM9YS52ZXJ0aWNlcyxlPWEubGluZURpc3RhbmNlcyxlWzBdPTAsZz0xLHI9Yy5sZW5ndGg7ZzxyO2crKyllW2ddPWVbZy0xXSxlW2ddKz1jW2ctMV0uZGlzdGFuY2VUbyhjW2ddKTtyZXR1cm4gdGhpc30scmF5Y2FzdDpmdW5jdGlvbihhLGMpe3ZhciBlPWEubGluZVByZWNpc2lvbiwKZz10aGlzLmdlb21ldHJ5LHI9dGhpcy5tYXRyaXhXb3JsZDtudWxsPT09Zy5ib3VuZGluZ1NwaGVyZSYmZy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtvZy5jb3B5KGcuYm91bmRpbmdTcGhlcmUpO29nLmFwcGx5TWF0cml4NChyKTtvZy5yYWRpdXMrPWU7aWYoITEhPT1hLnJheS5pbnRlcnNlY3RzU3BoZXJlKG9nKSl7cWsuZ2V0SW52ZXJzZShyKTt0aC5jb3B5KGEucmF5KS5hcHBseU1hdHJpeDQocWspO2UvPSh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMztlKj1lO3ZhciB2PW5ldyBrLHo9bmV3IGs7cj1uZXcgazt2YXIgRT1uZXcgayxHPXRoaXMmJnRoaXMuaXNMaW5lU2VnbWVudHM/MjoxO2lmKGcuaXNCdWZmZXJHZW9tZXRyeSl7dmFyIEo9Zy5pbmRleCxQPWcuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtpZihudWxsIT09Sil7Sj1KLmFycmF5O2c9MDtmb3IodmFyIFI9Si5sZW5ndGgtMTtnPFI7Zys9Ryl7dmFyIFM9SltnKzFdO3YuZnJvbUFycmF5KFAsCjMqSltnXSk7ei5mcm9tQXJyYXkoUCwzKlMpO1M9dGguZGlzdGFuY2VTcVRvU2VnbWVudCh2LHosRSxyKTtTPmV8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxTPWEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFM8YS5uZWFyfHxTPmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOlMscG9pbnQ6ci5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxpbmRleDpnLGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6dGhpc30pKX19ZWxzZSBmb3IoZz0wLFI9UC5sZW5ndGgvMy0xO2c8UjtnKz1HKXYuZnJvbUFycmF5KFAsMypnKSx6LmZyb21BcnJheShQLDMqZyszKSxTPXRoLmRpc3RhbmNlU3FUb1NlZ21lbnQodix6LEUsciksUz5lfHwoRS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksUz1hLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhFKSxTPGEubmVhcnx8Uz5hLmZhcnx8Yy5wdXNoKHtkaXN0YW5jZTpTLHBvaW50OnIuY2xvbmUoKS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksCmluZGV4OmcsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfWVsc2UgaWYoZy5pc0dlb21ldHJ5KWZvcih2PWcudmVydGljZXMsej12Lmxlbmd0aCxnPTA7Zzx6LTE7Zys9RylTPXRoLmRpc3RhbmNlU3FUb1NlZ21lbnQodltnXSx2W2crMV0sRSxyKSxTPmV8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxTPWEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFM8YS5uZWFyfHxTPmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOlMscG9pbnQ6ci5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxpbmRleDpnLGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6dGhpc30pKX19LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7dmFyIHVoPW5ldyBrLHZoPW5ldyBrO0liLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVmIucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOkliLGlzTGluZVNlZ21lbnRzOiEwLGNvbXB1dGVMaW5lRGlzdGFuY2VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PWEuaW5kZXgpe2Zvcih2YXIgYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sZT1bXSxnPTAscj1jLmNvdW50O2c8cjtnKz0yKXVoLmZyb21CdWZmZXJBdHRyaWJ1dGUoYyxnKSx2aC5mcm9tQnVmZmVyQXR0cmlidXRlKGMsZysxKSxlW2ddPTA9PT1nPzA6ZVtnLTFdLGVbZysxXT1lW2ddK3VoLmRpc3RhbmNlVG8odmgpO2EuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBjYShlLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIGlmKGEuaXNHZW9tZXRyeSlmb3IoYz1hLnZlcnRpY2VzLGU9CmEubGluZURpc3RhbmNlcyxnPTAscj1jLmxlbmd0aDtnPHI7Zys9Mil1aC5jb3B5KGNbZ10pLHZoLmNvcHkoY1tnKzFdKSxlW2ddPTA9PT1nPzA6ZVtnLTFdLGVbZysxXT1lW2ddK3VoLmRpc3RhbmNlVG8odmgpO3JldHVybiB0aGlzfX0pO0RnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVmIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6RGcsaXNMaW5lTG9vcDohMH0pO0FjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtBYy5wcm90b3R5cGUuY29uc3RydWN0b3I9QWM7QWMucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWw9ITA7QWMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubWFwPWEubWFwO3RoaXMuc2l6ZT1hLnNpemU7dGhpcy5zaXplQXR0ZW51YXRpb249YS5zaXplQXR0ZW51YXRpb247dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7CnJldHVybiB0aGlzfTt2YXIgcms9bmV3IHEsV2g9bmV3IEQscGc9bmV3IEYsd2g9bmV3IGs7Q2UucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkNlLGlzUG9pbnRzOiEwLHJheWNhc3Q6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmdlb21ldHJ5LGc9dGhpcy5tYXRyaXhXb3JsZCxyPWEucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7bnVsbD09PWUuYm91bmRpbmdTcGhlcmUmJmUuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7cGcuY29weShlLmJvdW5kaW5nU3BoZXJlKTtwZy5hcHBseU1hdHJpeDQoZyk7cGcucmFkaXVzKz1yO2lmKCExIT09YS5yYXkuaW50ZXJzZWN0c1NwaGVyZShwZykpaWYocmsuZ2V0SW52ZXJzZShnKSxXaC5jb3B5KGEucmF5KS5hcHBseU1hdHJpeDQocmspLHIvPSh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMyxyKj1yLGUuaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHY9ZS5pbmRleDsKZT1lLmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7aWYobnVsbCE9PXYpe3ZhciB6PXYuYXJyYXk7dj0wO2Zvcih2YXIgRT16Lmxlbmd0aDt2PEU7disrKXt2YXIgRz16W3ZdO3doLmZyb21BcnJheShlLDMqRyk7Vmgod2gsRyxyLGcsYSxjLHRoaXMpfX1lbHNlIGZvcih2PTAsej1lLmxlbmd0aC8zO3Y8ejt2Kyspd2guZnJvbUFycmF5KGUsMyp2KSxWaCh3aCx2LHIsZyxhLGMsdGhpcyl9ZWxzZSBmb3IoZT1lLnZlcnRpY2VzLHY9MCx6PWUubGVuZ3RoO3Y8ejt2KyspVmgoZVt2XSx2LHIsZyxhLGMsdGhpcyl9LHVwZGF0ZU1vcnBoVGFyZ2V0czpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2VvbWV0cnk7aWYoYS5pc0J1ZmZlckdlb21ldHJ5KXthPWEubW9ycGhBdHRyaWJ1dGVzO3ZhciBjPU9iamVjdC5rZXlzKGEpO2lmKDA8Yy5sZW5ndGgpe3ZhciBlPWFbY1swXV07aWYodm9pZCAwIT09ZSlmb3IodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9Cnt9LGE9MCxjPWUubGVuZ3RoO2E8YzthKyspe3ZhciBnPWVbYV0ubmFtZXx8U3RyaW5nKGEpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCk7dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbZ109YX19fWVsc2UgYT1hLm1vcnBoVGFyZ2V0cyx2b2lkIDAhPT1hJiYwPGEubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5Qb2ludHMudXBkYXRlTW9ycGhUYXJnZXRzKCkgZG9lcyBub3Qgc3VwcG9ydCBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIil9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7WGgucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShsLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlhoLGlzVmlkZW9UZXh0dXJlOiEwLHVwZGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaW1hZ2U7YS5yZWFkeVN0YXRlPj0KYS5IQVZFX0NVUlJFTlRfREFUQSYmKHRoaXMubmVlZHNVcGRhdGU9ITApfX0pO0RlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTtEZS5wcm90b3R5cGUuY29uc3RydWN0b3I9RGU7RGUucHJvdG90eXBlLmlzQ29tcHJlc3NlZFRleHR1cmU9ITA7Q2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0NmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1DZjtDZi5wcm90b3R5cGUuaXNDYW52YXNUZXh0dXJlPSEwO0RmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTtEZi5wcm90b3R5cGUuY29uc3RydWN0b3I9RGY7RGYucHJvdG90eXBlLmlzRGVwdGhUZXh0dXJlPSEwO0VlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7RWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPUVlO0VmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7RWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUVmO0ZlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7CkZlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GZTtGZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO0ZmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GZjtqYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO2pjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1qYztHZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO0dmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1HZjtHZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShqYy5wcm90b3R5cGUpO0dlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1HZTtIZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO0hmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1IZjtSZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShqYy5wcm90b3R5cGUpO1JkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SZDtJZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO0lmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0KSWY7SGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoamMucHJvdG90eXBlKTtIZS5wcm90b3R5cGUuY29uc3RydWN0b3I9SGU7SmYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtKZi5wcm90b3R5cGUuY29uc3RydWN0b3I9SmY7SWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoamMucHJvdG90eXBlKTtJZS5wcm90b3R5cGUuY29uc3RydWN0b3I9SWU7S2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtLZi5wcm90b3R5cGUuY29uc3RydWN0b3I9S2Y7U2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtTZC5wcm90b3R5cGUuY29uc3RydWN0b3I9U2Q7U2QucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPXZhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnBhdGg9dGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCk7cmV0dXJuIGF9O0xmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7CkxmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1MZjtKZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO0plLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1KZTtNZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO01mLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1NZjtLZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO0tlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1LZTt2YXIgSm09e3RyaWFuZ3VsYXRlOmZ1bmN0aW9uKGEsYyxlKXtlPWV8fDI7dmFyIGc9YyYmYy5sZW5ndGgscj1nP2NbMF0qZTphLmxlbmd0aCx2PUdqKGEsMCxyLGUsITApLHo9W107aWYoIXZ8fHYubmV4dD09PXYucHJldilyZXR1cm4gejtnJiYodj1kbShhLGMsdixlKSk7aWYoYS5sZW5ndGg+ODAqZSl7dmFyIEU9Yz1hWzBdO3ZhciBHPWc9YVsxXTtmb3IodmFyIEo9ZTtKPHI7Sis9ZSl7dmFyIFA9YVtKXTt2YXIgUj1hW0orMV07UDxFJiYoRT1QKTtSPEcmJihHPVIpOwpQPmMmJihjPVApO1I+ZyYmKGc9Uil9UD1NYXRoLm1heChjLUUsZy1HKTtQPTAhPT1QPzEvUDowfVBmKHYseixlLEUsRyxQKTtyZXR1cm4gen19LGVkPXthcmVhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1hLmxlbmd0aCxlPTAsZz1jLTEscj0wO3I8YztnPXIrKyllKz1hW2ddLngqYVtyXS55LWFbcl0ueCphW2ddLnk7cmV0dXJuLjUqZX0saXNDbG9ja1dpc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIDA+ZWQuYXJlYShhKX0sdHJpYW5ndWxhdGVTaGFwZTpmdW5jdGlvbihhLGMpe3ZhciBlPVtdLGc9W10scj1bXTtLaihhKTtMaihlLGEpO3ZhciB2PWEubGVuZ3RoO2MuZm9yRWFjaChLaik7Zm9yKGE9MDthPGMubGVuZ3RoO2ErKylnLnB1c2godiksdis9Y1thXS5sZW5ndGgsTGooZSxjW2FdKTtjPUptLnRyaWFuZ3VsYXRlKGUsZyk7Zm9yKGE9MDthPGMubGVuZ3RoO2ErPTMpci5wdXNoKGMuc2xpY2UoYSxhKzMpKTtyZXR1cm4gcn19O1VkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7ClVkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VZDtVZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9eWEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBNaih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLGEpfTtSYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1JjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SYztSYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9dmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBNaih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLGEpfTt2YXIgbG09e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24oYSxjLGUsZyxyKXthPWNbMypnXTtnPWNbMypnKzFdO3ZhciB2PWNbMypyXTtyPWNbMypyKzFdO3JldHVybltuZXcgZihjWzMqZV0sY1szKmUrMV0pLG5ldyBmKGEsZyksbmV3IGYodixyKV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihhLApjLGUsZyxyLHYpe2E9Y1szKmVdO3ZhciB6PWNbMyplKzFdO2U9Y1szKmUrMl07dmFyIEU9Y1szKmddLEc9Y1szKmcrMV07Zz1jWzMqZysyXTt2YXIgSj1jWzMqcl0sUD1jWzMqcisxXTtyPWNbMypyKzJdO3ZhciBSPWNbMyp2XSxTPWNbMyp2KzFdO2M9Y1szKnYrMl07cmV0dXJuLjAxPk1hdGguYWJzKHotRyk/W25ldyBmKGEsMS1lKSxuZXcgZihFLDEtZyksbmV3IGYoSiwxLXIpLG5ldyBmKFIsMS1jKV06W25ldyBmKHosMS1lKSxuZXcgZihHLDEtZyksbmV3IGYoUCwxLXIpLG5ldyBmKFMsMS1jKV19fTtSZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1JmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SZjtNZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSYy5wcm90b3R5cGUpO01lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1NZTtTZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1NmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TZjtCZC5wcm90b3R5cGU9Ck9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtCZC5wcm90b3R5cGUuY29uc3RydWN0b3I9QmQ7VGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtUZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VGY7TmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtOZS5wcm90b3R5cGUuY29uc3RydWN0b3I9TmU7VWYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtVZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VWY7T2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtPZS5wcm90b3R5cGUuY29uc3RydWN0b3I9T2U7VmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtWZC5wcm90b3R5cGUuY29uc3RydWN0b3I9VmQ7VmQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPXlhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtyZXR1cm4gTmoodGhpcy5wYXJhbWV0ZXJzLnNoYXBlcywKYSl9O1dkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7V2QucHJvdG90eXBlLmNvbnN0cnVjdG9yPVdkO1dkLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT12YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIE5qKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsYSl9O1BlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7UGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVBlO1hkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7WGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhkO2ZkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7ZmQucHJvdG90eXBlLmNvbnN0cnVjdG9yPWZkO1ZmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFhkLnByb3RvdHlwZSk7VmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVZmO1dmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGZkLnByb3RvdHlwZSk7V2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpXZjtYZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1hmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YZjtRZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1FlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1RZTt2YXIgZ2M9T2JqZWN0LmZyZWV6ZSh7V2lyZWZyYW1lR2VvbWV0cnk6RWUsUGFyYW1ldHJpY0dlb21ldHJ5OkVmLFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTpGZSxUZXRyYWhlZHJvbkdlb21ldHJ5OkdmLFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk6R2UsT2N0YWhlZHJvbkdlb21ldHJ5OkhmLE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTpSZCxJY29zYWhlZHJvbkdlb21ldHJ5OklmLEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk6SGUsRG9kZWNhaGVkcm9uR2VvbWV0cnk6SmYsRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6SWUsUG9seWhlZHJvbkdlb21ldHJ5OkZmLFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTpqYyxUdWJlR2VvbWV0cnk6S2YsClR1YmVCdWZmZXJHZW9tZXRyeTpTZCxUb3J1c0tub3RHZW9tZXRyeTpMZixUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTpKZSxUb3J1c0dlb21ldHJ5Ok1mLFRvcnVzQnVmZmVyR2VvbWV0cnk6S2UsVGV4dEdlb21ldHJ5OlJmLFRleHRCdWZmZXJHZW9tZXRyeTpNZSxTcGhlcmVHZW9tZXRyeTpTZixTcGhlcmVCdWZmZXJHZW9tZXRyeTpCZCxSaW5nR2VvbWV0cnk6VGYsUmluZ0J1ZmZlckdlb21ldHJ5Ok5lLFBsYW5lR2VvbWV0cnk6cmQsUGxhbmVCdWZmZXJHZW9tZXRyeTpMYyxMYXRoZUdlb21ldHJ5OlVmLExhdGhlQnVmZmVyR2VvbWV0cnk6T2UsU2hhcGVHZW9tZXRyeTpWZCxTaGFwZUJ1ZmZlckdlb21ldHJ5OldkLEV4dHJ1ZGVHZW9tZXRyeTpVZCxFeHRydWRlQnVmZmVyR2VvbWV0cnk6UmMsRWRnZXNHZW9tZXRyeTpQZSxDb25lR2VvbWV0cnk6VmYsQ29uZUJ1ZmZlckdlb21ldHJ5OldmLEN5bGluZGVyR2VvbWV0cnk6WGQsQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTpmZCxDaXJjbGVHZW9tZXRyeTpYZiwKQ2lyY2xlQnVmZmVyR2VvbWV0cnk6UWUsQm94R2VvbWV0cnk6U2EsQm94QnVmZmVyR2VvbWV0cnk6WGF9KTtZZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7WWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVlkO1lkLnByb3RvdHlwZS5pc1NoYWRvd01hdGVyaWFsPSEwO1lkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTtyZXR1cm4gdGhpc307UmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocWIucHJvdG90eXBlKTtSZS5wcm90b3R5cGUuY29uc3RydWN0b3I9UmU7UmUucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWw9ITA7U2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO1NjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TYztTYy5wcm90b3R5cGUuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD0hMDtTYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn07dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMucm91Z2huZXNzPWEucm91Z2huZXNzO3RoaXMubWV0YWxuZXNzPWEubWV0YWxuZXNzO3RoaXMubWFwPWEubWFwO3RoaXMubGlnaHRNYXA9YS5saWdodE1hcDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWEubGlnaHRNYXBJbnRlbnNpdHk7dGhpcy5hb01hcD1hLmFvTWFwO3RoaXMuYW9NYXBJbnRlbnNpdHk9YS5hb01hcEludGVuc2l0eTt0aGlzLmVtaXNzaXZlLmNvcHkoYS5lbWlzc2l2ZSk7dGhpcy5lbWlzc2l2ZU1hcD1hLmVtaXNzaXZlTWFwO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9YS5lbWlzc2l2ZUludGVuc2l0eTt0aGlzLmJ1bXBNYXA9YS5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWEuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWEubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGEubm9ybWFsU2NhbGUpOwp0aGlzLmRpc3BsYWNlbWVudE1hcD1hLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWEuZGlzcGxhY2VtZW50U2NhbGU7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPWEuZGlzcGxhY2VtZW50Qmlhczt0aGlzLnJvdWdobmVzc01hcD1hLnJvdWdobmVzc01hcDt0aGlzLm1ldGFsbmVzc01hcD1hLm1ldGFsbmVzc01hcDt0aGlzLmFscGhhTWFwPWEuYWxwaGFNYXA7dGhpcy5lbnZNYXA9YS5lbnZNYXA7dGhpcy5lbnZNYXBJbnRlbnNpdHk9YS5lbnZNYXBJbnRlbnNpdHk7dGhpcy5yZWZyYWN0aW9uUmF0aW89YS5yZWZyYWN0aW9uUmF0aW87dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWEud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWEud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPQphLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307WmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoU2MucHJvdG90eXBlKTtaZC5wcm90b3R5cGUuY29uc3RydWN0b3I9WmQ7WmQucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw9ITA7WmQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7U2MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiIsUEhZU0lDQUw6IiJ9O3RoaXMucmVmbGVjdGl2aXR5PWEucmVmbGVjdGl2aXR5O3RoaXMuY2xlYXJjb2F0PWEuY2xlYXJjb2F0O3RoaXMuY2xlYXJjb2F0Um91Z2huZXNzPWEuY2xlYXJjb2F0Um91Z2huZXNzO3RoaXMuc2hlZW49YS5zaGVlbj8odGhpcy5zaGVlbnx8bmV3IEkpLmNvcHkoYS5zaGVlbik6bnVsbDt0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1hLmNsZWFyY29hdE5vcm1hbE1hcDt0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLmNvcHkoYS5jbGVhcmNvYXROb3JtYWxTY2FsZSk7CnRoaXMudHJhbnNwYXJlbmN5PWEudHJhbnNwYXJlbmN5O3JldHVybiB0aGlzfTtCYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7QmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPUJjO0JjLnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsPSEwO0JjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLnNwZWN1bGFyLmNvcHkoYS5zcGVjdWxhcik7dGhpcy5zaGluaW5lc3M9YS5zaGluaW5lc3M7dGhpcy5tYXA9YS5tYXA7dGhpcy5saWdodE1hcD1hLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9YS5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWEuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShhLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWEuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0KYS5lbWlzc2l2ZUludGVuc2l0eTt0aGlzLmJ1bXBNYXA9YS5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWEuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWEubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGEubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMuc3BlY3VsYXJNYXA9YS5zcGVjdWxhck1hcDt0aGlzLmFscGhhTWFwPWEuYWxwaGFNYXA7dGhpcy5lbnZNYXA9YS5lbnZNYXA7dGhpcy5jb21iaW5lPWEuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0KYS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWEud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWEud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTskZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShCYy5wcm90b3R5cGUpOyRkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0kZDskZC5wcm90b3R5cGUuaXNNZXNoVG9vbk1hdGVyaWFsPSEwOyRkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe0JjLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmdyYWRpZW50TWFwPWEuZ3JhZGllbnRNYXA7cmV0dXJuIHRoaXN9O2FlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTthZS5wcm90b3R5cGUuY29uc3RydWN0b3I9YWU7YWUucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsPQohMDthZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmJ1bXBNYXA9YS5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWEuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWEubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGEubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307CmJlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtiZS5wcm90b3R5cGUuY29uc3RydWN0b3I9YmU7YmUucHJvdG90eXBlLmlzTWVzaExhbWJlcnRNYXRlcmlhbD0hMDtiZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXA9YS5tYXA7dGhpcy5saWdodE1hcD1hLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9YS5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWEuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShhLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWEuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT1hLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuc3BlY3VsYXJNYXA9YS5zcGVjdWxhck1hcDt0aGlzLmFscGhhTWFwPWEuYWxwaGFNYXA7dGhpcy5lbnZNYXA9CmEuZW52TWFwO3RoaXMuY29tYmluZT1hLmNvbWJpbmU7dGhpcy5yZWZsZWN0aXZpdHk9YS5yZWZsZWN0aXZpdHk7dGhpcy5yZWZyYWN0aW9uUmF0aW89YS5yZWZyYWN0aW9uUmF0aW87dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWEud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWEud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTtjZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7Y2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPWNlO2NlLnByb3RvdHlwZS5pc01lc2hNYXRjYXBNYXRlcmlhbD0hMDtjZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9O3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hdGNhcD1hLm1hdGNhcDt0aGlzLm1hcD1hLm1hcDt0aGlzLmJ1bXBNYXA9YS5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWEuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWEubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGEubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9O2RlLnByb3RvdHlwZT0KT2JqZWN0LmNyZWF0ZShGYi5wcm90b3R5cGUpO2RlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1kZTtkZS5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWw9ITA7ZGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7RmIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuc2NhbGU9YS5zY2FsZTt0aGlzLmRhc2hTaXplPWEuZGFzaFNpemU7dGhpcy5nYXBTaXplPWEuZ2FwU2l6ZTtyZXR1cm4gdGhpc307dmFyIEttPU9iamVjdC5mcmVlemUoe1NoYWRvd01hdGVyaWFsOllkLFNwcml0ZU1hdGVyaWFsOkFkLFJhd1NoYWRlck1hdGVyaWFsOlJlLFNoYWRlck1hdGVyaWFsOnFiLFBvaW50c01hdGVyaWFsOkFjLE1lc2hQaHlzaWNhbE1hdGVyaWFsOlpkLE1lc2hTdGFuZGFyZE1hdGVyaWFsOlNjLE1lc2hQaG9uZ01hdGVyaWFsOkJjLE1lc2hUb29uTWF0ZXJpYWw6JGQsTWVzaE5vcm1hbE1hdGVyaWFsOmFlLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6YmUsTWVzaERlcHRoTWF0ZXJpYWw6dmQsCk1lc2hEaXN0YW5jZU1hdGVyaWFsOndkLE1lc2hCYXNpY01hdGVyaWFsOkwsTWVzaE1hdGNhcE1hdGVyaWFsOmNlLExpbmVEYXNoZWRNYXRlcmlhbDpkZSxMaW5lQmFzaWNNYXRlcmlhbDpGYixNYXRlcmlhbDpNfSksVGI9e2FycmF5U2xpY2U6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiBUYi5pc1R5cGVkQXJyYXkoYSk/bmV3IGEuY29uc3RydWN0b3IoYS5zdWJhcnJheShjLHZvaWQgMCE9PWU/ZTphLmxlbmd0aCkpOmEuc2xpY2UoYyxlKX0sY29udmVydEFycmF5OmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4hYXx8IWUmJmEuY29uc3RydWN0b3I9PT1jP2E6Im51bWJlciI9PT10eXBlb2YgYy5CWVRFU19QRVJfRUxFTUVOVD9uZXcgYyhhKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKX0saXNUeXBlZEFycmF5OmZ1bmN0aW9uKGEpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoYSkmJiEoYSBpbnN0YW5jZW9mIERhdGFWaWV3KX0sZ2V0S2V5ZnJhbWVPcmRlcjpmdW5jdGlvbihhKXtmb3IodmFyIGM9CmEubGVuZ3RoLGU9QXJyYXkoYyksZz0wO2chPT1jOysrZyllW2ddPWc7ZS5zb3J0KGZ1bmN0aW9uKHIsdil7cmV0dXJuIGFbcl0tYVt2XX0pO3JldHVybiBlfSxzb3J0ZWRBcnJheTpmdW5jdGlvbihhLGMsZSl7Zm9yKHZhciBnPWEubGVuZ3RoLHI9bmV3IGEuY29uc3RydWN0b3IoZyksdj0wLHo9MDt6IT09ZzsrK3YpZm9yKHZhciBFPWVbdl0qYyxHPTA7RyE9PWM7KytHKXJbeisrXT1hW0UrR107cmV0dXJuIHJ9LGZsYXR0ZW5KU09OOmZ1bmN0aW9uKGEsYyxlLGcpe2Zvcih2YXIgcj0xLHY9YVswXTt2b2lkIDAhPT12JiZ2b2lkIDA9PT12W2ddOyl2PWFbcisrXTtpZih2b2lkIDAhPT12KXt2YXIgej12W2ddO2lmKHZvaWQgMCE9PXopaWYoQXJyYXkuaXNBcnJheSh6KSl7ZG8gej12W2ddLHZvaWQgMCE9PXomJihjLnB1c2godi50aW1lKSxlLnB1c2guYXBwbHkoZSx6KSksdj1hW3IrK107d2hpbGUodm9pZCAwIT09dil9ZWxzZSBpZih2b2lkIDAhPT16LnRvQXJyYXkpe2RvIHo9dltnXSwKdm9pZCAwIT09eiYmKGMucHVzaCh2LnRpbWUpLHoudG9BcnJheShlLGUubGVuZ3RoKSksdj1hW3IrK107d2hpbGUodm9pZCAwIT09dil9ZWxzZXtkbyB6PXZbZ10sdm9pZCAwIT09eiYmKGMucHVzaCh2LnRpbWUpLGUucHVzaCh6KSksdj1hW3IrK107d2hpbGUodm9pZCAwIT09dil9fX19O09iamVjdC5hc3NpZ24ob2MucHJvdG90eXBlLHtldmFsdWF0ZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxlPXRoaXMuX2NhY2hlZEluZGV4LGc9Y1tlXSxyPWNbZS0xXTthOntiOntjOntkOmlmKCEoYTxnKSl7Zm9yKHZhciB2PWUrMjs7KXtpZih2b2lkIDA9PT1nKXtpZihhPHIpYnJlYWsgZDt0aGlzLl9jYWNoZWRJbmRleD1lPWMubGVuZ3RoO3JldHVybiB0aGlzLmFmdGVyRW5kXyhlLTEsYSxyKX1pZihlPT09dilicmVhaztyPWc7Zz1jWysrZV07aWYoYTxnKWJyZWFrIGJ9Zz1jLmxlbmd0aDticmVhayBjfWlmKGE+PXIpYnJlYWsgYTtlbHNle3Y9Y1sxXTthPHYmJgooZT0yLHI9dik7Zm9yKHY9ZS0yOzspe2lmKHZvaWQgMD09PXIpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5iZWZvcmVTdGFydF8oMCxhLGcpO2lmKGU9PT12KWJyZWFrO2c9cjtyPWNbLS1lLTFdO2lmKGE+PXIpYnJlYWsgYn1nPWU7ZT0wfX1mb3IoO2U8Zzspcj1lK2c+Pj4xLGE8Y1tyXT9nPXI6ZT1yKzE7Zz1jW2VdO3I9Y1tlLTFdO2lmKHZvaWQgMD09PXIpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5iZWZvcmVTdGFydF8oMCxhLGcpO2lmKHZvaWQgMD09PWcpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PWU9Yy5sZW5ndGgsdGhpcy5hZnRlckVuZF8oZS0xLHIsYSl9dGhpcy5fY2FjaGVkSW5kZXg9ZTt0aGlzLmludGVydmFsQ2hhbmdlZF8oZSxyLGcpfXJldHVybiB0aGlzLmludGVycG9sYXRlXyhlLHIsYSxnKX0sc2V0dGluZ3M6bnVsbCxEZWZhdWx0U2V0dGluZ3NfOnt9LGdldFNldHRpbmdzXzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldHRpbmdzfHwKdGhpcy5EZWZhdWx0U2V0dGluZ3NffSxjb3B5U2FtcGxlVmFsdWVfOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucmVzdWx0QnVmZmVyLGU9dGhpcy5zYW1wbGVWYWx1ZXMsZz10aGlzLnZhbHVlU2l6ZTthKj1nO2Zvcih2YXIgcj0wO3IhPT1nOysrciljW3JdPWVbYStyXTtyZXR1cm4gY30saW50ZXJwb2xhdGVfOmZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoImNhbGwgdG8gYWJzdHJhY3QgbWV0aG9kIik7fSxpbnRlcnZhbENoYW5nZWRfOmZ1bmN0aW9uKCl7fX0pO09iamVjdC5hc3NpZ24ob2MucHJvdG90eXBlLHtiZWZvcmVTdGFydF86b2MucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV8sYWZ0ZXJFbmRfOm9jLnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVffSk7RWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShvYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpFZyxEZWZhdWx0U2V0dGluZ3NfOntlbmRpbmdTdGFydDoyNDAwLGVuZGluZ0VuZDoyNDAwfSxpbnRlcnZhbENoYW5nZWRfOmZ1bmN0aW9uKGEsCmMsZSl7dmFyIGc9dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMscj1hLTIsdj1hKzEsej1nW3JdLEU9Z1t2XTtpZih2b2lkIDA9PT16KXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0KXtjYXNlIDI0MDE6cj1hO3o9MipjLWU7YnJlYWs7Y2FzZSAyNDAyOnI9Zy5sZW5ndGgtMjt6PWMrZ1tyXS1nW3IrMV07YnJlYWs7ZGVmYXVsdDpyPWEsej1lfWlmKHZvaWQgMD09PUUpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kKXtjYXNlIDI0MDE6dj1hO0U9MiplLWM7YnJlYWs7Y2FzZSAyNDAyOnY9MTtFPWUrZ1sxXS1nWzBdO2JyZWFrO2RlZmF1bHQ6dj1hLTEsRT1jfWE9LjUqKGUtYyk7Zz10aGlzLnZhbHVlU2l6ZTt0aGlzLl93ZWlnaHRQcmV2PWEvKGMteik7dGhpcy5fd2VpZ2h0TmV4dD1hLyhFLWUpO3RoaXMuX29mZnNldFByZXY9cipnO3RoaXMuX29mZnNldE5leHQ9dipnfSxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcy5yZXN1bHRCdWZmZXIsCnY9dGhpcy5zYW1wbGVWYWx1ZXMsej10aGlzLnZhbHVlU2l6ZTthKj16O3ZhciBFPWEteixHPXRoaXMuX29mZnNldFByZXYsSj10aGlzLl9vZmZzZXROZXh0LFA9dGhpcy5fd2VpZ2h0UHJldixSPXRoaXMuX3dlaWdodE5leHQsUz0oZS1jKS8oZy1jKTtlPVMqUztnPWUqUztjPS1QKmcrMipQKmUtUCpTO1A9KDErUCkqZysoLTEuNS0yKlApKmUrKC0uNStQKSpTKzE7Uz0oLTEtUikqZysoMS41K1IpKmUrLjUqUztSPVIqZy1SKmU7Zm9yKGU9MDtlIT09ejsrK2UpcltlXT1jKnZbRytlXStQKnZbRStlXStTKnZbYStlXStSKnZbSitlXTtyZXR1cm4gcn19KTtZZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOllmLGludGVycG9sYXRlXzpmdW5jdGlvbihhLGMsZSxnKXt2YXIgcj10aGlzLnJlc3VsdEJ1ZmZlcix2PXRoaXMuc2FtcGxlVmFsdWVzLHo9dGhpcy52YWx1ZVNpemU7YSo9ejt2YXIgRT1hLXo7Yz0oZS1jKS8oZy0KYyk7ZT0xLWM7Zm9yKGc9MDtnIT09ejsrK2cpcltnXT12W0UrZ10qZSt2W2ErZ10qYztyZXR1cm4gcn19KTtGZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkZnLGludGVycG9sYXRlXzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKGEtMSl9fSk7T2JqZWN0LmFzc2lnbihYYix7dG9KU09OOmZ1bmN0aW9uKGEpe3ZhciBjPWEuY29uc3RydWN0b3I7aWYodm9pZCAwIT09Yy50b0pTT04pYz1jLnRvSlNPTihhKTtlbHNle2M9e25hbWU6YS5uYW1lLHRpbWVzOlRiLmNvbnZlcnRBcnJheShhLnRpbWVzLEFycmF5KSx2YWx1ZXM6VGIuY29udmVydEFycmF5KGEudmFsdWVzLEFycmF5KX07dmFyIGU9YS5nZXRJbnRlcnBvbGF0aW9uKCk7ZSE9PWEuRGVmYXVsdEludGVycG9sYXRpb24mJihjLmludGVycG9sYXRpb249ZSl9Yy50eXBlPWEuVmFsdWVUeXBlTmFtZTtyZXR1cm4gY319KTtPYmplY3QuYXNzaWduKFhiLnByb3RvdHlwZSwKe2NvbnN0cnVjdG9yOlhiLFRpbWVCdWZmZXJUeXBlOkZsb2F0MzJBcnJheSxWYWx1ZUJ1ZmZlclR5cGU6RmxvYXQzMkFycmF5LERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDEsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBGZyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYSl9LEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFlmKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxhKX0sSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgRWcodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGEpfSxzZXRJbnRlcnBvbGF0aW9uOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDIzMDA6dmFyIGM9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTsKYnJlYWs7Y2FzZSAyMzAxOmM9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7YnJlYWs7Y2FzZSAyMzAyOmM9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGh9aWYodm9pZCAwPT09Yyl7Yz0idW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgIit0aGlzLlZhbHVlVHlwZU5hbWUrIiBrZXlmcmFtZSB0cmFjayBuYW1lZCAiK3RoaXMubmFtZTtpZih2b2lkIDA9PT10aGlzLmNyZWF0ZUludGVycG9sYW50KWlmKGEhPT10aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKXRoaXMuc2V0SW50ZXJwb2xhdGlvbih0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKTtlbHNlIHRocm93IEVycm9yKGMpO2NvbnNvbGUud2FybigiVEhSRUUuS2V5ZnJhbWVUcmFjazoiLGMpO3JldHVybiB0aGlzfXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ9YztyZXR1cm4gdGhpc30sZ2V0SW50ZXJwb2xhdGlvbjpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLmNyZWF0ZUludGVycG9sYW50KXtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6cmV0dXJuIDIzMDA7CmNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6cmV0dXJuIDIzMDE7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpyZXR1cm4gMjMwMn19LGdldFZhbHVlU2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvdGhpcy50aW1lcy5sZW5ndGh9LHNoaWZ0OmZ1bmN0aW9uKGEpe2lmKDAhPT1hKWZvcih2YXIgYz10aGlzLnRpbWVzLGU9MCxnPWMubGVuZ3RoO2UhPT1nOysrZSljW2VdKz1hO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhKXtpZigxIT09YSlmb3IodmFyIGM9dGhpcy50aW1lcyxlPTAsZz1jLmxlbmd0aDtlIT09ZzsrK2UpY1tlXSo9YTtyZXR1cm4gdGhpc30sdHJpbTpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnRpbWVzLGc9ZS5sZW5ndGgscj0wLHY9Zy0xO3IhPT1nJiZlW3JdPGE7KSsrcjtmb3IoOy0xIT09diYmZVt2XT5jOyktLXY7Kyt2O2lmKDAhPT1yfHx2IT09ZylyPj12JiYodj1NYXRoLm1heCh2LAoxKSxyPXYtMSksYT10aGlzLmdldFZhbHVlU2l6ZSgpLHRoaXMudGltZXM9VGIuYXJyYXlTbGljZShlLHIsdiksdGhpcy52YWx1ZXM9VGIuYXJyYXlTbGljZSh0aGlzLnZhbHVlcyxyKmEsdiphKTtyZXR1cm4gdGhpc30sdmFsaWRhdGU6ZnVuY3Rpb24oKXt2YXIgYT0hMCxjPXRoaXMuZ2V0VmFsdWVTaXplKCk7MCE9PWMtTWF0aC5mbG9vcihjKSYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4iLHRoaXMpLGE9ITEpO3ZhciBlPXRoaXMudGltZXM7Yz10aGlzLnZhbHVlczt2YXIgZz1lLmxlbmd0aDswPT09ZyYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFRyYWNrIGlzIGVtcHR5LiIsdGhpcyksYT0hMSk7Zm9yKHZhciByPW51bGwsdj0wO3YhPT1nO3YrKyl7dmFyIHo9ZVt2XTtpZigibnVtYmVyIj09PXR5cGVvZiB6JiZpc05hTih6KSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIiwKdGhpcyx2LHopO2E9ITE7YnJlYWt9aWYobnVsbCE9PXImJnI+eil7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuIix0aGlzLHYseixyKTthPSExO2JyZWFrfXI9en1pZih2b2lkIDAhPT1jJiZUYi5pc1R5cGVkQXJyYXkoYykpZm9yKHY9MCxlPWMubGVuZ3RoO3YhPT1lOysrdilpZihnPWNbdl0saXNOYU4oZykpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLHRoaXMsdixnKTthPSExO2JyZWFrfXJldHVybiBhfSxvcHRpbWl6ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnRpbWVzLGM9dGhpcy52YWx1ZXMsZT10aGlzLmdldFZhbHVlU2l6ZSgpLGc9MjMwMj09PXRoaXMuZ2V0SW50ZXJwb2xhdGlvbigpLHI9MSx2PWEubGVuZ3RoLTEsej0xO3o8djsrK3ope3ZhciBFPSExLEc9YVt6XTtpZihHIT09YVt6KzFdJiYoMSE9PXp8fEchPT1HWzBdKSlpZihnKUU9ITA7CmVsc2V7dmFyIEo9eiplLFA9Si1lLFI9SitlO2ZvcihHPTA7RyE9PWU7KytHKXt2YXIgUz1jW0orR107aWYoUyE9PWNbUCtHXXx8UyE9PWNbUitHXSl7RT0hMDticmVha319fWlmKEUpe2lmKHohPT1yKWZvcihhW3JdPWFbel0sRT16KmUsSj1yKmUsRz0wO0chPT1lOysrRyljW0orR109Y1tFK0ddOysrcn19aWYoMDx2KXthW3JdPWFbdl07RT12KmU7Sj1yKmU7Zm9yKEc9MDtHIT09ZTsrK0cpY1tKK0ddPWNbRStHXTsrK3J9ciE9PWEubGVuZ3RoJiYodGhpcy50aW1lcz1UYi5hcnJheVNsaWNlKGEsMCxyKSx0aGlzLnZhbHVlcz1UYi5hcnJheVNsaWNlKGMsMCxyKmUpKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYT1UYi5hcnJheVNsaWNlKHRoaXMudGltZXMsMCksYz1UYi5hcnJheVNsaWNlKHRoaXMudmFsdWVzLDApO2E9bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5uYW1lLGEsYyk7YS5jcmVhdGVJbnRlcnBvbGFudD10aGlzLmNyZWF0ZUludGVycG9sYW50O3JldHVybiBhfX0pOwpHZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkdnLFZhbHVlVHlwZU5hbWU6ImJvb2wiLFZhbHVlQnVmZmVyVHlwZTpBcnJheSxEZWZhdWx0SW50ZXJwb2xhdGlvbjoyMzAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjp2b2lkIDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnZvaWQgMH0pO0hnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6SGcsVmFsdWVUeXBlTmFtZToiY29sb3IifSk7U2UucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShYYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpTZSxWYWx1ZVR5cGVOYW1lOiJudW1iZXIifSk7SWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShvYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpJZyxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oYSwKYyxlLGcpe3ZhciByPXRoaXMucmVzdWx0QnVmZmVyLHY9dGhpcy5zYW1wbGVWYWx1ZXMsej10aGlzLnZhbHVlU2l6ZTthKj16O2M9KGUtYykvKGctYyk7Zm9yKGU9YSt6O2EhPT1lO2ErPTQpaC5zbGVycEZsYXQociwwLHYsYS16LHYsYSxjKTtyZXR1cm4gcn19KTtaZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlpmLFZhbHVlVHlwZU5hbWU6InF1YXRlcm5pb24iLERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDEsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSWcodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGEpfSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6dm9pZCAwfSk7SmcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShYYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpKZyxWYWx1ZVR5cGVOYW1lOiJzdHJpbmciLApWYWx1ZUJ1ZmZlclR5cGU6QXJyYXksRGVmYXVsdEludGVycG9sYXRpb246MjMwMCxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6dm9pZCAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDp2b2lkIDB9KTtUZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlRlLFZhbHVlVHlwZU5hbWU6InZlY3RvciJ9KTtPYmplY3QuYXNzaWduKHRjLHtwYXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT1hLnRyYWNrcyxnPTEvKGEuZnBzfHwxKSxyPTAsdj1lLmxlbmd0aDtyIT09djsrK3IpYy5wdXNoKG5tKGVbcl0pLnNjYWxlKGcpKTtyZXR1cm4gbmV3IHRjKGEubmFtZSxhLmR1cmF0aW9uLGMpfSx0b0pTT046ZnVuY3Rpb24oYSl7dmFyIGM9W10sZT1hLnRyYWNrczthPXtuYW1lOmEubmFtZSxkdXJhdGlvbjphLmR1cmF0aW9uLHRyYWNrczpjLHV1aWQ6YS51dWlkfTtmb3IodmFyIGc9MCxyPWUubGVuZ3RoO2chPT0KcjsrK2cpYy5wdXNoKFhiLnRvSlNPTihlW2ddKSk7cmV0dXJuIGF9LENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlOmZ1bmN0aW9uKGEsYyxlLGcpe2Zvcih2YXIgcj1jLmxlbmd0aCx2PVtdLHo9MDt6PHI7eisrKXt2YXIgRT1bXSxHPVtdO0UucHVzaCgoeityLTEpJXIseiwoeisxKSVyKTtHLnB1c2goMCwxLDApO3ZhciBKPVRiLmdldEtleWZyYW1lT3JkZXIoRSk7RT1UYi5zb3J0ZWRBcnJheShFLDEsSik7Rz1UYi5zb3J0ZWRBcnJheShHLDEsSik7Z3x8MCE9PUVbMF18fChFLnB1c2gociksRy5wdXNoKEdbMF0pKTt2LnB1c2goKG5ldyBTZSgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1siK2Nbel0ubmFtZSsiXSIsRSxHKSkuc2NhbGUoMS9lKSl9cmV0dXJuIG5ldyB0YyhhLC0xLHYpfSxmaW5kQnlOYW1lOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YTtBcnJheS5pc0FycmF5KGEpfHwoZT1hLmdlb21ldHJ5JiZhLmdlb21ldHJ5LmFuaW1hdGlvbnN8fGEuYW5pbWF0aW9ucyk7Zm9yKGE9CjA7YTxlLmxlbmd0aDthKyspaWYoZVthXS5uYW1lPT09YylyZXR1cm4gZVthXTtyZXR1cm4gbnVsbH0sQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXM6ZnVuY3Rpb24oYSxjLGUpe2Zvcih2YXIgZz17fSxyPS9eKFtcdy1dKj8pKFtcZF0rKSQvLHY9MCx6PWEubGVuZ3RoO3Y8ejt2Kyspe3ZhciBFPWFbdl0sRz1FLm5hbWUubWF0Y2gocik7aWYoRyYmMTxHLmxlbmd0aCl7dmFyIEo9R1sxXTsoRz1nW0pdKXx8KGdbSl09Rz1bXSk7Ry5wdXNoKEUpfX1hPVtdO2ZvcihKIGluIGcpYS5wdXNoKHRjLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKEosZ1tKXSxjLGUpKTtyZXR1cm4gYX0scGFyc2VBbmltYXRpb246ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBlKGhhLGZhLHJhLHBhLHFhKXtpZigwIT09cmEubGVuZ3RoKXt2YXIgdWE9W10sb2E9W107VGIuZmxhdHRlbkpTT04ocmEsdWEsb2EscGEpOzAhPT11YS5sZW5ndGgmJnFhLnB1c2gobmV3IGhhKGZhLHVhLG9hKSl9fQppZighYSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uQ2xpcDogTm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YS4iKSxudWxsO3ZhciBnPVtdLHI9YS5uYW1lfHwiZGVmYXVsdCIsdj1hLmxlbmd0aHx8LTEsej1hLmZwc3x8MzA7YT1hLmhpZXJhcmNoeXx8W107Zm9yKHZhciBFPTA7RTxhLmxlbmd0aDtFKyspe3ZhciBHPWFbRV0ua2V5cztpZihHJiYwIT09Ry5sZW5ndGgpaWYoR1swXS5tb3JwaFRhcmdldHMpe3Y9e307Zm9yKHZhciBKPTA7SjxHLmxlbmd0aDtKKyspaWYoR1tKXS5tb3JwaFRhcmdldHMpZm9yKHZhciBQPTA7UDxHW0pdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7UCsrKXZbR1tKXS5tb3JwaFRhcmdldHNbUF1dPS0xO2Zvcih2YXIgUiBpbiB2KXt2YXIgUz1bXSxWPVtdO2ZvcihQPTA7UCE9PUdbSl0ubW9ycGhUYXJnZXRzLmxlbmd0aDsrK1Ape3ZhciBXPUdbSl07Uy5wdXNoKFcudGltZSk7Vi5wdXNoKFcubW9ycGhUYXJnZXQ9PT1SPzE6MCl9Zy5wdXNoKG5ldyBTZSgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWyIrClIrIl0iLFMsVikpfXY9di5sZW5ndGgqKHp8fDEpfWVsc2UgSj0iLmJvbmVzWyIrY1tFXS5uYW1lKyJdIixlKFRlLEorIi5wb3NpdGlvbiIsRywicG9zIixnKSxlKFpmLEorIi5xdWF0ZXJuaW9uIixHLCJyb3QiLGcpLGUoVGUsSisiLnNjYWxlIixHLCJzY2wiLGcpfXJldHVybiAwPT09Zy5sZW5ndGg/bnVsbDpuZXcgdGMocix2LGcpfX0pO09iamVjdC5hc3NpZ24odGMucHJvdG90eXBlLHtyZXNldER1cmF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYz0wLGU9dGhpcy50cmFja3MubGVuZ3RoO2MhPT1lOysrYyl7dmFyIGc9dGhpcy50cmFja3NbY107YT1NYXRoLm1heChhLGcudGltZXNbZy50aW1lcy5sZW5ndGgtMV0pfXRoaXMuZHVyYXRpb249YTtyZXR1cm4gdGhpc30sdHJpbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy50cmFja3MubGVuZ3RoO2ErKyl0aGlzLnRyYWNrc1thXS50cmltKDAsdGhpcy5kdXJhdGlvbik7cmV0dXJuIHRoaXN9LHZhbGlkYXRlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMCxjPTA7Yzx0aGlzLnRyYWNrcy5sZW5ndGg7YysrKWE9YSYmdGhpcy50cmFja3NbY10udmFsaWRhdGUoKTtyZXR1cm4gYX0sb3B0aW1pemU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMudHJhY2tzLmxlbmd0aDthKyspdGhpcy50cmFja3NbYV0ub3B0aW1pemUoKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYz0wO2M8dGhpcy50cmFja3MubGVuZ3RoO2MrKylhLnB1c2godGhpcy50cmFja3NbY10uY2xvbmUoKSk7cmV0dXJuIG5ldyB0Yyh0aGlzLm5hbWUsdGhpcy5kdXJhdGlvbixhKX19KTt2YXIgaWU9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKGEsYyl7ITEhPT10aGlzLmVuYWJsZWQmJih0aGlzLmZpbGVzW2FdPWMpfSxnZXQ6ZnVuY3Rpb24oYSl7aWYoITEhPT10aGlzLmVuYWJsZWQpcmV0dXJuIHRoaXMuZmlsZXNbYV19LHJlbW92ZTpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5maWxlc1thXX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPQp7fX19LE9qPW5ldyAkaDtPYmplY3QuYXNzaWduKERiLnByb3RvdHlwZSx7bG9hZDpmdW5jdGlvbigpe30scGFyc2U6ZnVuY3Rpb24oKXt9LHNldENyb3NzT3JpZ2luOmZ1bmN0aW9uKGEpe3RoaXMuY3Jvc3NPcmlnaW49YTtyZXR1cm4gdGhpc30sc2V0UGF0aDpmdW5jdGlvbihhKXt0aGlzLnBhdGg9YTtyZXR1cm4gdGhpc30sc2V0UmVzb3VyY2VQYXRoOmZ1bmN0aW9uKGEpe3RoaXMucmVzb3VyY2VQYXRoPWE7cmV0dXJuIHRoaXN9fSk7RGIuSGFuZGxlcnM9e2hhbmRsZXJzOltdLGFkZDpmdW5jdGlvbihhLGMpe3RoaXMuaGFuZGxlcnMucHVzaChhLGMpfSxnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuaGFuZGxlcnMsZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrPTIpe3ZhciByPWNbZSsxXTtpZihjW2VdLnRlc3QoYSkpcmV0dXJuIHJ9cmV0dXJuIG51bGx9fTt2YXIgS2M9e307dWMucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp1YywKbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2b2lkIDA9PT1hJiYoYT0iIik7dm9pZCAwIT09dGhpcy5wYXRoJiYoYT10aGlzLnBhdGgrYSk7YT10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChhKTt2YXIgcj10aGlzLHY9aWUuZ2V0KGEpO2lmKHZvaWQgMCE9PXYpcmV0dXJuIHIubWFuYWdlci5pdGVtU3RhcnQoYSksc2V0VGltZW91dChmdW5jdGlvbigpe2MmJmModik7ci5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApLHY7aWYodm9pZCAwIT09S2NbYV0pS2NbYV0ucHVzaCh7b25Mb2FkOmMsb25Qcm9ncmVzczplLG9uRXJyb3I6Z30pO2Vsc2V7dmFyIHo9YS5tYXRjaCgvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLyk7aWYoeil7ZT16WzFdO3ZhciBFPSEhelsyXTt6PXpbM107ej1kZWNvZGVVUklDb21wb25lbnQoeik7RSYmKHo9YXRvYih6KSk7dHJ5e3ZhciBHPSh0aGlzLnJlc3BvbnNlVHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk7c3dpdGNoKEcpe2Nhc2UgImFycmF5YnVmZmVyIjpjYXNlICJibG9iIjp2YXIgSj0KbmV3IFVpbnQ4QXJyYXkoei5sZW5ndGgpO2ZvcihFPTA7RTx6Lmxlbmd0aDtFKyspSltFXT16LmNoYXJDb2RlQXQoRSk7dmFyIFA9ImJsb2IiPT09Rz9uZXcgQmxvYihbSi5idWZmZXJdLHt0eXBlOmV9KTpKLmJ1ZmZlcjticmVhaztjYXNlICJkb2N1bWVudCI6UD0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHosZSk7YnJlYWs7Y2FzZSAianNvbiI6UD1KU09OLnBhcnNlKHopO2JyZWFrO2RlZmF1bHQ6UD16fXNldFRpbWVvdXQoZnVuY3Rpb24oKXtjJiZjKFApO3IubWFuYWdlci5pdGVtRW5kKGEpfSwwKX1jYXRjaChTKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZyYmZyhTKTtyLm1hbmFnZXIuaXRlbUVycm9yKGEpO3IubWFuYWdlci5pdGVtRW5kKGEpfSwwKX19ZWxzZXtLY1thXT1bXTtLY1thXS5wdXNoKHtvbkxvYWQ6YyxvblByb2dyZXNzOmUsb25FcnJvcjpnfSk7dmFyIFI9bmV3IFhNTEh0dHBSZXF1ZXN0O1Iub3BlbigiR0VUIixhLCEwKTtSLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLApmdW5jdGlvbihTKXt2YXIgVj10aGlzLnJlc3BvbnNlO2llLmFkZChhLFYpO3ZhciBXPUtjW2FdO2RlbGV0ZSBLY1thXTtpZigyMDA9PT10aGlzLnN0YXR1c3x8MD09PXRoaXMuc3RhdHVzKXswPT09dGhpcy5zdGF0dXMmJmNvbnNvbGUud2FybigiVEhSRUUuRmlsZUxvYWRlcjogSFRUUCBTdGF0dXMgMCByZWNlaXZlZC4iKTtmb3IodmFyIGhhPTAsZmE9Vy5sZW5ndGg7aGE8ZmE7aGErKyl7dmFyIHJhPVdbaGFdO2lmKHJhLm9uTG9hZClyYS5vbkxvYWQoVil9fWVsc2V7aGE9MDtmb3IoZmE9Vy5sZW5ndGg7aGE8ZmE7aGErKylpZihyYT1XW2hhXSxyYS5vbkVycm9yKXJhLm9uRXJyb3IoUyk7ci5tYW5hZ2VyLml0ZW1FcnJvcihhKX1yLm1hbmFnZXIuaXRlbUVuZChhKX0sITEpO1IuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGZ1bmN0aW9uKFMpe2Zvcih2YXIgVj1LY1thXSxXPTAsaGE9Vi5sZW5ndGg7VzxoYTtXKyspe3ZhciBmYT1WW1ddO2lmKGZhLm9uUHJvZ3Jlc3MpZmEub25Qcm9ncmVzcyhTKX19LAohMSk7Ui5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oUyl7dmFyIFY9S2NbYV07ZGVsZXRlIEtjW2FdO2Zvcih2YXIgVz0wLGhhPVYubGVuZ3RoO1c8aGE7VysrKXt2YXIgZmE9VltXXTtpZihmYS5vbkVycm9yKWZhLm9uRXJyb3IoUyl9ci5tYW5hZ2VyLml0ZW1FcnJvcihhKTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sITEpO1IuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGZ1bmN0aW9uKFMpe3ZhciBWPUtjW2FdO2RlbGV0ZSBLY1thXTtmb3IodmFyIFc9MCxoYT1WLmxlbmd0aDtXPGhhO1crKyl7dmFyIGZhPVZbV107aWYoZmEub25FcnJvcilmYS5vbkVycm9yKFMpfXIubWFuYWdlci5pdGVtRXJyb3IoYSk7ci5tYW5hZ2VyLml0ZW1FbmQoYSl9LCExKTt2b2lkIDAhPT10aGlzLnJlc3BvbnNlVHlwZSYmKFIucmVzcG9uc2VUeXBlPXRoaXMucmVzcG9uc2VUeXBlKTt2b2lkIDAhPT10aGlzLndpdGhDcmVkZW50aWFscyYmKFIud2l0aENyZWRlbnRpYWxzPXRoaXMud2l0aENyZWRlbnRpYWxzKTsKUi5vdmVycmlkZU1pbWVUeXBlJiZSLm92ZXJyaWRlTWltZVR5cGUodm9pZCAwIT09dGhpcy5taW1lVHlwZT90aGlzLm1pbWVUeXBlOiJ0ZXh0L3BsYWluIik7Zm9yKEUgaW4gdGhpcy5yZXF1ZXN0SGVhZGVyKVIuc2V0UmVxdWVzdEhlYWRlcihFLHRoaXMucmVxdWVzdEhlYWRlcltFXSk7Ui5zZW5kKG51bGwpfXIubWFuYWdlci5pdGVtU3RhcnQoYSk7cmV0dXJuIFJ9fSxzZXRSZXNwb25zZVR5cGU6ZnVuY3Rpb24oYSl7dGhpcy5yZXNwb25zZVR5cGU9YTtyZXR1cm4gdGhpc30sc2V0V2l0aENyZWRlbnRpYWxzOmZ1bmN0aW9uKGEpe3RoaXMud2l0aENyZWRlbnRpYWxzPWE7cmV0dXJuIHRoaXN9LHNldE1pbWVUeXBlOmZ1bmN0aW9uKGEpe3RoaXMubWltZVR5cGU9YTtyZXR1cm4gdGhpc30sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhKXt0aGlzLnJlcXVlc3RIZWFkZXI9YTtyZXR1cm4gdGhpc319KTthaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjphaSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj1uZXcgdWMoci5tYW5hZ2VyKTt2LnNldFBhdGgoci5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtjKHIucGFyc2UoSlNPTi5wYXJzZSh6KSkpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz10Yy5wYXJzZShhW2VdKTtjLnB1c2goZyl9cmV0dXJuIGN9fSk7YmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpiaSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe2Z1bmN0aW9uIHIoUyl7Ry5sb2FkKGFbU10sZnVuY3Rpb24oVil7Vj12Ll9wYXJzZXIoViwhMCk7eltTXT17d2lkdGg6Vi53aWR0aCxoZWlnaHQ6Vi5oZWlnaHQsZm9ybWF0OlYuZm9ybWF0LG1pcG1hcHM6Vi5taXBtYXBzfTtKKz0xOzY9PT1KJiYoMT09PVYubWlwbWFwQ291bnQmJihFLm1pbkZpbHRlcj0KMTAwNiksRS5mb3JtYXQ9Vi5mb3JtYXQsRS5uZWVkc1VwZGF0ZT0hMCxjJiZjKEUpKX0sZSxnKX12YXIgdj10aGlzLHo9W10sRT1uZXcgRGU7RS5pbWFnZT16O3ZhciBHPW5ldyB1Yyh0aGlzLm1hbmFnZXIpO0cuc2V0UGF0aCh0aGlzLnBhdGgpO0cuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKHZhciBKPTAsUD0wLFI9YS5sZW5ndGg7UDxSOysrUClyKFApO2Vsc2UgRy5sb2FkKGEsZnVuY3Rpb24oUyl7Uz12Ll9wYXJzZXIoUywhMCk7aWYoUy5pc0N1YmVtYXApZm9yKHZhciBWPVMubWlwbWFwcy5sZW5ndGgvUy5taXBtYXBDb3VudCxXPTA7VzxWO1crKyl7eltXXT17bWlwbWFwczpbXX07Zm9yKHZhciBoYT0wO2hhPFMubWlwbWFwQ291bnQ7aGErKyl6W1ddLm1pcG1hcHMucHVzaChTLm1pcG1hcHNbVypTLm1pcG1hcENvdW50K2hhXSkseltXXS5mb3JtYXQ9Uy5mb3JtYXQseltXXS53aWR0aD1TLndpZHRoLHpbV10uaGVpZ2h0PVMuaGVpZ2h0fWVsc2UgRS5pbWFnZS53aWR0aD0KUy53aWR0aCxFLmltYWdlLmhlaWdodD1TLmhlaWdodCxFLm1pcG1hcHM9Uy5taXBtYXBzOzE9PT1TLm1pcG1hcENvdW50JiYoRS5taW5GaWx0ZXI9MTAwNik7RS5mb3JtYXQ9Uy5mb3JtYXQ7RS5uZWVkc1VwZGF0ZT0hMDtjJiZjKEUpfSxlLGcpO3JldHVybiBFfX0pO0tnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6S2csbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2YXIgcj10aGlzLHY9bmV3IEFiLHo9bmV3IHVjKHRoaXMubWFuYWdlcik7ei5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7ei5zZXRQYXRoKHRoaXMucGF0aCk7ei5sb2FkKGEsZnVuY3Rpb24oRSl7aWYoRT1yLl9wYXJzZXIoRSkpdm9pZCAwIT09RS5pbWFnZT92LmltYWdlPUUuaW1hZ2U6dm9pZCAwIT09RS5kYXRhJiYodi5pbWFnZS53aWR0aD1FLndpZHRoLHYuaW1hZ2UuaGVpZ2h0PUUuaGVpZ2h0LHYuaW1hZ2UuZGF0YT1FLmRhdGEpLHYud3JhcFM9CnZvaWQgMCE9PUUud3JhcFM/RS53cmFwUzoxMDAxLHYud3JhcFQ9dm9pZCAwIT09RS53cmFwVD9FLndyYXBUOjEwMDEsdi5tYWdGaWx0ZXI9dm9pZCAwIT09RS5tYWdGaWx0ZXI/RS5tYWdGaWx0ZXI6MTAwNix2Lm1pbkZpbHRlcj12b2lkIDAhPT1FLm1pbkZpbHRlcj9FLm1pbkZpbHRlcjoxMDA4LHYuYW5pc290cm9weT12b2lkIDAhPT1FLmFuaXNvdHJvcHk/RS5hbmlzb3Ryb3B5OjEsdm9pZCAwIT09RS5mb3JtYXQmJih2LmZvcm1hdD1FLmZvcm1hdCksdm9pZCAwIT09RS50eXBlJiYodi50eXBlPUUudHlwZSksdm9pZCAwIT09RS5taXBtYXBzJiYodi5taXBtYXBzPUUubWlwbWFwcyksMT09PUUubWlwbWFwQ291bnQmJih2Lm1pbkZpbHRlcj0xMDA2KSx2Lm5lZWRzVXBkYXRlPSEwLGMmJmModixFKX0sZSxnKTtyZXR1cm4gdn19KTtVZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlVlLGxvYWQ6ZnVuY3Rpb24oYSwKYyxlLGcpe2Z1bmN0aW9uIHIoKXtHLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHIsITEpO0cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHYsITEpO2llLmFkZChhLHRoaXMpO2MmJmModGhpcyk7ei5tYW5hZ2VyLml0ZW1FbmQoYSl9ZnVuY3Rpb24gdihKKXtHLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHIsITEpO0cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHYsITEpO2cmJmcoSik7ei5tYW5hZ2VyLml0ZW1FcnJvcihhKTt6Lm1hbmFnZXIuaXRlbUVuZChhKX12b2lkIDAhPT10aGlzLnBhdGgmJihhPXRoaXMucGF0aCthKTthPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGEpO3ZhciB6PXRoaXMsRT1pZS5nZXQoYSk7aWYodm9pZCAwIT09RSlyZXR1cm4gei5tYW5hZ2VyLml0ZW1TdGFydChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyYmYyhFKTt6Lm1hbmFnZXIuaXRlbUVuZChhKX0sMCksRTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLAoiaW1nIik7Ry5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixyLCExKTtHLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix2LCExKTsiZGF0YToiIT09YS5zdWJzdHIoMCw1KSYmdm9pZCAwIT09dGhpcy5jcm9zc09yaWdpbiYmKEcuY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbik7ei5tYW5hZ2VyLml0ZW1TdGFydChhKTtHLnNyYz1hO3JldHVybiBHfX0pO0xnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TGcsbG9hZDpmdW5jdGlvbihhLGMsZSxnKXtmdW5jdGlvbiByKEcpe3oubG9hZChhW0ddLGZ1bmN0aW9uKEope3YuaW1hZ2VzW0ddPUo7RSsrOzY9PT1FJiYodi5uZWVkc1VwZGF0ZT0hMCxjJiZjKHYpKX0sdm9pZCAwLGcpfXZhciB2PW5ldyBjZCx6PW5ldyBVZSh0aGlzLm1hbmFnZXIpO3ouc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7ei5zZXRQYXRoKHRoaXMucGF0aCk7dmFyIEU9MDtmb3IoZT0KMDtlPGEubGVuZ3RoOysrZSlyKGUpO3JldHVybiB2fX0pO01nLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TWcsbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2YXIgcj1uZXcgbCx2PW5ldyBVZSh0aGlzLm1hbmFnZXIpO3Yuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7di5zZXRQYXRoKHRoaXMucGF0aCk7di5sb2FkKGEsZnVuY3Rpb24oeil7ci5pbWFnZT16O3o9MDxhLnNlYXJjaCgvXC5qcGU/ZygkfFw/KS9pKXx8MD09PWEuc2VhcmNoKC9eZGF0YTppbWFnZVwvanBlZy8pO3IuZm9ybWF0PXo/MTAyMjoxMDIzO3IubmVlZHNVcGRhdGU9ITA7dm9pZCAwIT09YyYmYyhyKX0sZSxnKTtyZXR1cm4gcn19KTtPYmplY3QuYXNzaWduKFphLnByb3RvdHlwZSx7Z2V0UG9pbnQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuIik7cmV0dXJuIG51bGx9LApnZXRQb2ludEF0OmZ1bmN0aW9uKGEsYyl7YT10aGlzLmdldFV0b1RtYXBwaW5nKGEpO3JldHVybiB0aGlzLmdldFBvaW50KGEsYyl9LGdldFBvaW50czpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT01KTtmb3IodmFyIGM9W10sZT0wO2U8PWE7ZSsrKWMucHVzaCh0aGlzLmdldFBvaW50KGUvYSkpO3JldHVybiBjfSxnZXRTcGFjZWRQb2ludHM6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9NSk7Zm9yKHZhciBjPVtdLGU9MDtlPD1hO2UrKyljLnB1c2godGhpcy5nZXRQb2ludEF0KGUvYSkpO3JldHVybiBjfSxnZXRMZW5ndGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldExlbmd0aHMoKTtyZXR1cm4gYVthLmxlbmd0aC0xXX0sZ2V0TGVuZ3RoczpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyk7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PWErMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzOwp0aGlzLm5lZWRzVXBkYXRlPSExO3ZhciBjPVtdLGU9dGhpcy5nZXRQb2ludCgwKSxnLHI9MDtjLnB1c2goMCk7Zm9yKGc9MTtnPD1hO2crKyl7dmFyIHY9dGhpcy5nZXRQb2ludChnL2EpO3IrPXYuZGlzdGFuY2VUbyhlKTtjLnB1c2gocik7ZT12fXJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz1jfSx1cGRhdGVBcmNMZW5ndGhzOmZ1bmN0aW9uKCl7dGhpcy5uZWVkc1VwZGF0ZT0hMDt0aGlzLmdldExlbmd0aHMoKX0sZ2V0VXRvVG1hcHBpbmc6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmdldExlbmd0aHMoKSxnPWUubGVuZ3RoO2M9Yz9jOmEqZVtnLTFdO2Zvcih2YXIgcj0wLHY9Zy0xLHo7cjw9djspaWYoYT1NYXRoLmZsb29yKHIrKHYtcikvMiksej1lW2FdLWMsMD56KXI9YSsxO2Vsc2UgaWYoMDx6KXY9YS0xO2Vsc2V7dj1hO2JyZWFrfWE9djtpZihlW2FdPT09YylyZXR1cm4gYS8oZy0xKTtyPWVbYV07cmV0dXJuKGErKGMtcikvKGVbYSsxXS1yKSkvKGctMSl9LGdldFRhbmdlbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9CmEtMUUtNDthKz0xRS00OzA+YyYmKGM9MCk7MTxhJiYoYT0xKTtjPXRoaXMuZ2V0UG9pbnQoYyk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYSkuY2xvbmUoKS5zdWIoYykubm9ybWFsaXplKCl9LGdldFRhbmdlbnRBdDpmdW5jdGlvbihhKXthPXRoaXMuZ2V0VXRvVG1hcHBpbmcoYSk7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChhKX0sY29tcHV0ZUZyZW5ldEZyYW1lczpmdW5jdGlvbihhLGMpe3ZhciBlPW5ldyBrLGc9W10scj1bXSx2PVtdLHo9bmV3IGssRT1uZXcgcSxHO2ZvcihHPTA7Rzw9YTtHKyspe3ZhciBKPUcvYTtnW0ddPXRoaXMuZ2V0VGFuZ2VudEF0KEopO2dbR10ubm9ybWFsaXplKCl9clswXT1uZXcgazt2WzBdPW5ldyBrO0c9TnVtYmVyLk1BWF9WQUxVRTtKPU1hdGguYWJzKGdbMF0ueCk7dmFyIFA9TWF0aC5hYnMoZ1swXS55KSxSPU1hdGguYWJzKGdbMF0ueik7Sjw9RyYmKEc9SixlLnNldCgxLDAsMCkpO1A8PUcmJihHPVAsZS5zZXQoMCwxLDApKTtSPD1HJiZlLnNldCgwLAowLDEpO3ouY3Jvc3NWZWN0b3JzKGdbMF0sZSkubm9ybWFsaXplKCk7clswXS5jcm9zc1ZlY3RvcnMoZ1swXSx6KTt2WzBdLmNyb3NzVmVjdG9ycyhnWzBdLHJbMF0pO2ZvcihHPTE7Rzw9YTtHKyspcltHXT1yW0ctMV0uY2xvbmUoKSx2W0ddPXZbRy0xXS5jbG9uZSgpLHouY3Jvc3NWZWN0b3JzKGdbRy0xXSxnW0ddKSx6Lmxlbmd0aCgpPk51bWJlci5FUFNJTE9OJiYoei5ub3JtYWxpemUoKSxlPU1hdGguYWNvcyhoYi5jbGFtcChnW0ctMV0uZG90KGdbR10pLC0xLDEpKSxyW0ddLmFwcGx5TWF0cml4NChFLm1ha2VSb3RhdGlvbkF4aXMoeixlKSkpLHZbR10uY3Jvc3NWZWN0b3JzKGdbR10scltHXSk7aWYoITA9PT1jKWZvcihlPU1hdGguYWNvcyhoYi5jbGFtcChyWzBdLmRvdChyW2FdKSwtMSwxKSksZS89YSwwPGdbMF0uZG90KHouY3Jvc3NWZWN0b3JzKHJbMF0sclthXSkpJiYoZT0tZSksRz0xO0c8PWE7RysrKXJbR10uYXBwbHlNYXRyaXg0KEUubWFrZVJvdGF0aW9uQXhpcyhnW0ddLAplKkcpKSx2W0ddLmNyb3NzVmVjdG9ycyhnW0ddLHJbR10pO3JldHVybnt0YW5nZW50czpnLG5vcm1hbHM6cixiaW5vcm1hbHM6dn19LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWEuYXJjTGVuZ3RoRGl2aXNpb25zO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IkN1cnZlIixnZW5lcmF0b3I6IkN1cnZlLnRvSlNPTiJ9fTthLmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9uczthLnR5cGU9dGhpcy50eXBlO3JldHVybiBhfSxmcm9tSlNPTjpmdW5jdGlvbihhKXt0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz1hLmFyY0xlbmd0aERpdmlzaW9ucztyZXR1cm4gdGhpc319KTtwYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO3BjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0KcGM7cGMucHJvdG90eXBlLmlzRWxsaXBzZUN1cnZlPSEwO3BjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7Zm9yKHZhciBlPTIqTWF0aC5QSSxnPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGUscj1NYXRoLmFicyhnKTxOdW1iZXIuRVBTSUxPTjswPmc7KWcrPWU7Zm9yKDtnPmU7KWctPWU7ZzxOdW1iZXIuRVBTSUxPTiYmKGc9cj8wOmUpOyEwIT09dGhpcy5hQ2xvY2t3aXNlfHxyfHwoZz1nPT09ZT8tZTpnLWUpO2U9dGhpcy5hU3RhcnRBbmdsZSthKmc7YT10aGlzLmFYK3RoaXMueFJhZGl1cypNYXRoLmNvcyhlKTt2YXIgdj10aGlzLmFZK3RoaXMueVJhZGl1cypNYXRoLnNpbihlKTswIT09dGhpcy5hUm90YXRpb24mJihlPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSxnPU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxyPWEtdGhpcy5hWCx2LT10aGlzLmFZLGE9ciplLXYqZyt0aGlzLmFYLHY9cipnK3YqZSt0aGlzLmFZKTtyZXR1cm4gYy5zZXQoYSwKdil9O3BjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmFYPWEuYVg7dGhpcy5hWT1hLmFZO3RoaXMueFJhZGl1cz1hLnhSYWRpdXM7dGhpcy55UmFkaXVzPWEueVJhZGl1czt0aGlzLmFTdGFydEFuZ2xlPWEuYVN0YXJ0QW5nbGU7dGhpcy5hRW5kQW5nbGU9YS5hRW5kQW5nbGU7dGhpcy5hQ2xvY2t3aXNlPWEuYUNsb2Nrd2lzZTt0aGlzLmFSb3RhdGlvbj1hLmFSb3RhdGlvbjtyZXR1cm4gdGhpc307cGMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLmFYPXRoaXMuYVg7YS5hWT10aGlzLmFZO2EueFJhZGl1cz10aGlzLnhSYWRpdXM7YS55UmFkaXVzPXRoaXMueVJhZGl1czthLmFTdGFydEFuZ2xlPXRoaXMuYVN0YXJ0QW5nbGU7YS5hRW5kQW5nbGU9dGhpcy5hRW5kQW5nbGU7YS5hQ2xvY2t3aXNlPXRoaXMuYUNsb2Nrd2lzZTthLmFSb3RhdGlvbj0KdGhpcy5hUm90YXRpb247cmV0dXJuIGF9O3BjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMuYVg9YS5hWDt0aGlzLmFZPWEuYVk7dGhpcy54UmFkaXVzPWEueFJhZGl1czt0aGlzLnlSYWRpdXM9YS55UmFkaXVzO3RoaXMuYVN0YXJ0QW5nbGU9YS5hU3RhcnRBbmdsZTt0aGlzLmFFbmRBbmdsZT1hLmFFbmRBbmdsZTt0aGlzLmFDbG9ja3dpc2U9YS5hQ2xvY2t3aXNlO3RoaXMuYVJvdGF0aW9uPWEuYVJvdGF0aW9uO3JldHVybiB0aGlzfTtWZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShwYy5wcm90b3R5cGUpO1ZlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1WZTtWZS5wcm90b3R5cGUuaXNBcmNDdXJ2ZT0hMDt2YXIgeGg9bmV3IGssTGk9bmV3IGNpLE1pPW5ldyBjaSxOaT1uZXcgY2k7WmIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtaYi5wcm90b3R5cGUuY29uc3RydWN0b3I9WmI7ClpiLnByb3RvdHlwZS5pc0NhdG11bGxSb21DdXJ2ZTM9ITA7WmIucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgazt2YXIgZT10aGlzLnBvaW50cyxnPWUubGVuZ3RoO2EqPWctKHRoaXMuY2xvc2VkPzA6MSk7dmFyIHI9TWF0aC5mbG9vcihhKTthLT1yO3RoaXMuY2xvc2VkP3IrPTA8cj8wOihNYXRoLmZsb29yKE1hdGguYWJzKHIpL2cpKzEpKmc6MD09PWEmJnI9PT1nLTEmJihyPWctMixhPTEpO2lmKHRoaXMuY2xvc2VkfHwwPHIpdmFyIHY9ZVsoci0xKSVnXTtlbHNlIHhoLnN1YlZlY3RvcnMoZVswXSxlWzFdKS5hZGQoZVswXSksdj14aDt2YXIgej1lW3IlZ107dmFyIEU9ZVsocisxKSVnXTt0aGlzLmNsb3NlZHx8cisyPGc/ZT1lWyhyKzIpJWddOih4aC5zdWJWZWN0b3JzKGVbZy0xXSxlW2ctMl0pLmFkZChlW2ctMV0pLGU9eGgpO2lmKCJjZW50cmlwZXRhbCI9PT10aGlzLmN1cnZlVHlwZXx8ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGUpe3ZhciBHPQoiY2hvcmRhbCI9PT10aGlzLmN1cnZlVHlwZT8uNTouMjU7Zz1NYXRoLnBvdyh2LmRpc3RhbmNlVG9TcXVhcmVkKHopLEcpO3I9TWF0aC5wb3coei5kaXN0YW5jZVRvU3F1YXJlZChFKSxHKTtHPU1hdGgucG93KEUuZGlzdGFuY2VUb1NxdWFyZWQoZSksRyk7MUUtND5yJiYocj0xKTsxRS00PmcmJihnPXIpOzFFLTQ+RyYmKEc9cik7TGkuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHYueCx6LngsRS54LGUueCxnLHIsRyk7TWkuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHYueSx6LnksRS55LGUueSxnLHIsRyk7TmkuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHYueix6LnosRS56LGUueixnLHIsRyl9ZWxzZSJjYXRtdWxscm9tIj09PXRoaXMuY3VydmVUeXBlJiYoTGkuaW5pdENhdG11bGxSb20odi54LHoueCxFLngsZS54LHRoaXMudGVuc2lvbiksTWkuaW5pdENhdG11bGxSb20odi55LHoueSxFLnksZS55LHRoaXMudGVuc2lvbiksTmkuaW5pdENhdG11bGxSb20odi56LHoueixFLnosCmUueix0aGlzLnRlbnNpb24pKTtjLnNldChMaS5jYWxjKGEpLE1pLmNhbGMoYSksTmkuY2FsYyhhKSk7cmV0dXJuIGN9O1piLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPGU7YysrKXRoaXMucG9pbnRzLnB1c2goYS5wb2ludHNbY10uY2xvbmUoKSk7dGhpcy5jbG9zZWQ9YS5jbG9zZWQ7dGhpcy5jdXJ2ZVR5cGU9YS5jdXJ2ZVR5cGU7dGhpcy50ZW5zaW9uPWEudGVuc2lvbjtyZXR1cm4gdGhpc307WmIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPXRoaXMucG9pbnRzLmxlbmd0aDtjPGU7YysrKWEucG9pbnRzLnB1c2godGhpcy5wb2ludHNbY10udG9BcnJheSgpKTthLmNsb3NlZD10aGlzLmNsb3NlZDthLmN1cnZlVHlwZT10aGlzLmN1cnZlVHlwZTsKYS50ZW5zaW9uPXRoaXMudGVuc2lvbjtyZXR1cm4gYX07WmIucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5wb2ludHM9W107Zm9yKHZhciBjPTAsZT1hLnBvaW50cy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YS5wb2ludHNbY107dGhpcy5wb2ludHMucHVzaCgobmV3IGspLmZyb21BcnJheShnKSl9dGhpcy5jbG9zZWQ9YS5jbG9zZWQ7dGhpcy5jdXJ2ZVR5cGU9YS5jdXJ2ZVR5cGU7dGhpcy50ZW5zaW9uPWEudGVuc2lvbjtyZXR1cm4gdGhpc307Q2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtDYy5wcm90b3R5cGUuY29uc3RydWN0b3I9Q2M7Q2MucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZT0hMDtDYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHI9dGhpcy52Mix2PXRoaXMudjM7Yy5zZXQoYWcoYSwKZS54LGcueCxyLngsdi54KSxhZyhhLGUueSxnLnksci55LHYueSkpO3JldHVybiBjfTtDYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MC5jb3B5KGEudjApO3RoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7dGhpcy52My5jb3B5KGEudjMpO3JldHVybiB0aGlzfTtDYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjA9dGhpcy52MC50b0FycmF5KCk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO2EudjM9dGhpcy52My50b0FycmF5KCk7cmV0dXJuIGF9O0NjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMudjAuZnJvbUFycmF5KGEudjApO3RoaXMudjEuZnJvbUFycmF5KGEudjEpO3RoaXMudjIuZnJvbUFycmF5KGEudjIpOwp0aGlzLnYzLmZyb21BcnJheShhLnYzKTtyZXR1cm4gdGhpc307VGMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtUYy5wcm90b3R5cGUuY29uc3RydWN0b3I9VGM7VGMucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZTM9ITA7VGMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgazt2YXIgZT10aGlzLnYwLGc9dGhpcy52MSxyPXRoaXMudjIsdj10aGlzLnYzO2Muc2V0KGFnKGEsZS54LGcueCxyLngsdi54KSxhZyhhLGUueSxnLnksci55LHYueSksYWcoYSxlLnosZy56LHIueix2LnopKTtyZXR1cm4gY307VGMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudjAuY29weShhLnYwKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3RoaXMudjMuY29weShhLnYzKTtyZXR1cm4gdGhpc307VGMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPQpaYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MD10aGlzLnYwLnRvQXJyYXkoKTthLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7YS52Mz10aGlzLnYzLnRvQXJyYXkoKTtyZXR1cm4gYX07VGMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MC5mcm9tQXJyYXkoYS52MCk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7dGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7dGhpcy52My5mcm9tQXJyYXkoYS52Myk7cmV0dXJuIHRoaXN9O2tjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7a2MucHJvdG90eXBlLmNvbnN0cnVjdG9yPWtjO2tjLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZT0hMDtrYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmOzE9PT1hP2MuY29weSh0aGlzLnYyKTooYy5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSwKYy5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy52MSkpO3JldHVybiBjfTtrYy5wcm90b3R5cGUuZ2V0UG9pbnRBdD1mdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmdldFBvaW50KGEsYyl9O2tjLnByb3RvdHlwZS5nZXRUYW5nZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudjIuY2xvbmUoKS5zdWIodGhpcy52MSkubm9ybWFsaXplKCl9O2tjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtrYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjE9dGhpcy52MS50b0FycmF5KCk7YS52Mj10aGlzLnYyLnRvQXJyYXkoKTtyZXR1cm4gYX07a2MucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7CnRoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtEYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0RjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EYztEYy5wcm90b3R5cGUuaXNMaW5lQ3VydmUzPSEwO0RjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGs7MT09PWE/Yy5jb3B5KHRoaXMudjIpOihjLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLGMubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMudjEpKTtyZXR1cm4gY307RGMucHJvdG90eXBlLmdldFBvaW50QXQ9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRQb2ludChhLGMpfTtEYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MS5jb3B5KGEudjEpO3RoaXMudjIuY29weShhLnYyKTtyZXR1cm4gdGhpc307RGMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTsKYS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtEYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTt0aGlzLnYyLmZyb21BcnJheShhLnYyKTtyZXR1cm4gdGhpc307RWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtFYy5wcm90b3R5cGUuY29uc3RydWN0b3I9RWM7RWMucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITA7RWMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgZjt2YXIgZT10aGlzLnYwLGc9dGhpcy52MSxyPXRoaXMudjI7Yy5zZXQoJGYoYSxlLngsZy54LHIueCksJGYoYSxlLnksZy55LHIueSkpO3JldHVybiBjfTtFYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MC5jb3B5KGEudjApOwp0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtFYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjA9dGhpcy52MC50b0FycmF5KCk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtFYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYwLmZyb21BcnJheShhLnYwKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTt0aGlzLnYyLmZyb21BcnJheShhLnYyKTtyZXR1cm4gdGhpc307VWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtVYy5wcm90b3R5cGUuY29uc3RydWN0b3I9VWM7VWMucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwO1VjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8Cm5ldyBrO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHI9dGhpcy52MjtjLnNldCgkZihhLGUueCxnLngsci54KSwkZihhLGUueSxnLnksci55KSwkZihhLGUueixnLnosci56KSk7cmV0dXJuIGN9O1VjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYwLmNvcHkoYS52MCk7dGhpcy52MS5jb3B5KGEudjEpO3RoaXMudjIuY29weShhLnYyKTtyZXR1cm4gdGhpc307VWMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnYwPXRoaXMudjAudG9BcnJheSgpO2EudjE9dGhpcy52MS50b0FycmF5KCk7YS52Mj10aGlzLnYyLnRvQXJyYXkoKTtyZXR1cm4gYX07VWMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MC5mcm9tQXJyYXkoYS52MCk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7CnRoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtGYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0ZjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GYztGYy5wcm90b3R5cGUuaXNTcGxpbmVDdXJ2ZT0hMDtGYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmO3ZhciBlPXRoaXMucG9pbnRzLGc9KGUubGVuZ3RoLTEpKmE7YT1NYXRoLmZsb29yKGcpO2ctPWE7dmFyIHI9ZVswPT09YT9hOmEtMV0sdj1lW2FdLHo9ZVthPmUubGVuZ3RoLTI/ZS5sZW5ndGgtMTphKzFdO2U9ZVthPmUubGVuZ3RoLTM/ZS5sZW5ndGgtMTphKzJdO2Muc2V0KFBqKGcsci54LHYueCx6LngsZS54KSxQaihnLHIueSx2Lnksei55LGUueSkpO3JldHVybiBjfTtGYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5wb2ludHM9W107Zm9yKHZhciBjPTAsZT1hLnBvaW50cy5sZW5ndGg7YzwKZTtjKyspdGhpcy5wb2ludHMucHVzaChhLnBvaW50c1tjXS5jbG9uZSgpKTtyZXR1cm4gdGhpc307RmMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPXRoaXMucG9pbnRzLmxlbmd0aDtjPGU7YysrKWEucG9pbnRzLnB1c2godGhpcy5wb2ludHNbY10udG9BcnJheSgpKTtyZXR1cm4gYX07RmMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5wb2ludHM9W107Zm9yKHZhciBjPTAsZT1hLnBvaW50cy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YS5wb2ludHNbY107dGhpcy5wb2ludHMucHVzaCgobmV3IGYpLmZyb21BcnJheShnKSl9cmV0dXJuIHRoaXN9O3ZhciBPaT1PYmplY3QuZnJlZXplKHtBcmNDdXJ2ZTpWZSxDYXRtdWxsUm9tQ3VydmUzOlpiLEN1YmljQmV6aWVyQ3VydmU6Q2MsQ3ViaWNCZXppZXJDdXJ2ZTM6VGMsCkVsbGlwc2VDdXJ2ZTpwYyxMaW5lQ3VydmU6a2MsTGluZUN1cnZlMzpEYyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpFYyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6VWMsU3BsaW5lQ3VydmU6RmN9KTtnZC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmdkLGFkZDpmdW5jdGlvbihhKXt0aGlzLmN1cnZlcy5wdXNoKGEpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxjPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTthLmVxdWFscyhjKXx8dGhpcy5jdXJ2ZXMucHVzaChuZXcga2MoYyxhKSl9LGdldFBvaW50OmZ1bmN0aW9uKGEpe3ZhciBjPWEqdGhpcy5nZXRMZW5ndGgoKSxlPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7Zm9yKGE9MDthPGUubGVuZ3RoOyl7aWYoZVthXT49YylyZXR1cm4gYz1lW2FdLWMsYT10aGlzLmN1cnZlc1thXSxlPQphLmdldExlbmd0aCgpLGEuZ2V0UG9pbnRBdCgwPT09ZT8wOjEtYy9lKTthKyt9cmV0dXJuIG51bGx9LGdldExlbmd0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIGFbYS5sZW5ndGgtMV19LHVwZGF0ZUFyY0xlbmd0aHM6ZnVuY3Rpb24oKXt0aGlzLm5lZWRzVXBkYXRlPSEwO3RoaXMuY2FjaGVMZW5ndGhzPW51bGw7dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKX0sZ2V0Q3VydmVMZW5ndGhzOmZ1bmN0aW9uKCl7aWYodGhpcy5jYWNoZUxlbmd0aHMmJnRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aD09PXRoaXMuY3VydmVzLmxlbmd0aClyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7Zm9yKHZhciBhPVtdLGM9MCxlPTAsZz10aGlzLmN1cnZlcy5sZW5ndGg7ZTxnO2UrKyljKz10aGlzLmN1cnZlc1tlXS5nZXRMZW5ndGgoKSxhLnB1c2goYyk7cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzPWF9LGdldFNwYWNlZFBvaW50czpmdW5jdGlvbihhKXt2b2lkIDA9PT0KYSYmKGE9NDApO2Zvcih2YXIgYz1bXSxlPTA7ZTw9YTtlKyspYy5wdXNoKHRoaXMuZ2V0UG9pbnQoZS9hKSk7dGhpcy5hdXRvQ2xvc2UmJmMucHVzaChjWzBdKTtyZXR1cm4gY30sZ2V0UG9pbnRzOmZ1bmN0aW9uKGEpe2E9YXx8MTI7Zm9yKHZhciBjPVtdLGUsZz0wLHI9dGhpcy5jdXJ2ZXM7ZzxyLmxlbmd0aDtnKyspe3ZhciB2PXJbZ107dj12LmdldFBvaW50cyh2JiZ2LmlzRWxsaXBzZUN1cnZlPzIqYTp2JiYodi5pc0xpbmVDdXJ2ZXx8di5pc0xpbmVDdXJ2ZTMpPzE6diYmdi5pc1NwbGluZUN1cnZlP2Eqdi5wb2ludHMubGVuZ3RoOmEpO2Zvcih2YXIgej0wO3o8di5sZW5ndGg7eisrKXt2YXIgRT12W3pdO2UmJmUuZXF1YWxzKEUpfHwoYy5wdXNoKEUpLGU9RSl9fXRoaXMuYXV0b0Nsb3NlJiYxPGMubGVuZ3RoJiYhY1tjLmxlbmd0aC0xXS5lcXVhbHMoY1swXSkmJmMucHVzaChjWzBdKTtyZXR1cm4gY30sY29weTpmdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmEpO3RoaXMuY3VydmVzPVtdO2Zvcih2YXIgYz0wLGU9YS5jdXJ2ZXMubGVuZ3RoO2M8ZTtjKyspdGhpcy5jdXJ2ZXMucHVzaChhLmN1cnZlc1tjXS5jbG9uZSgpKTt0aGlzLmF1dG9DbG9zZT1hLmF1dG9DbG9zZTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlO2EuY3VydmVzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5jdXJ2ZXMubGVuZ3RoO2M8ZTtjKyspYS5jdXJ2ZXMucHVzaCh0aGlzLmN1cnZlc1tjXS50b0pTT04oKSk7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5hdXRvQ2xvc2U9YS5hdXRvQ2xvc2U7dGhpcy5jdXJ2ZXM9W107Zm9yKHZhciBjPTAsZT1hLmN1cnZlcy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YS5jdXJ2ZXNbY107dGhpcy5jdXJ2ZXMucHVzaCgobmV3IE9pW2cudHlwZV0pLmZyb21KU09OKGcpKX1yZXR1cm4gdGhpc319KTsKR2MucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShnZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpHYyxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe3RoaXMubW92ZVRvKGFbMF0ueCxhWzBdLnkpO2Zvcih2YXIgYz0xLGU9YS5sZW5ndGg7YzxlO2MrKyl0aGlzLmxpbmVUbyhhW2NdLngsYVtjXS55KX0sbW92ZVRvOmZ1bmN0aW9uKGEsYyl7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGEsYyl9LGxpbmVUbzpmdW5jdGlvbihhLGMpe3ZhciBlPW5ldyBrYyh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBmKGEsYykpO3RoaXMuY3VydmVzLnB1c2goZSk7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGEsYyl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24oYSxjLGUsZyl7YT1uZXcgRWModGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgZihhLGMpLG5ldyBmKGUsZykpO3RoaXMuY3VydmVzLnB1c2goYSk7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGUsZyl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24oYSwKYyxlLGcscix2KXthPW5ldyBDYyh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBmKGEsYyksbmV3IGYoZSxnKSxuZXcgZihyLHYpKTt0aGlzLmN1cnZlcy5wdXNoKGEpO3RoaXMuY3VycmVudFBvaW50LnNldChyLHYpfSxzcGxpbmVUaHJ1OmZ1bmN0aW9uKGEpe3ZhciBjPVt0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpXS5jb25jYXQoYSk7Yz1uZXcgRmMoYyk7dGhpcy5jdXJ2ZXMucHVzaChjKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGFbYS5sZW5ndGgtMV0pfSxhcmM6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3RoaXMuYWJzYXJjKGErdGhpcy5jdXJyZW50UG9pbnQueCxjK3RoaXMuY3VycmVudFBvaW50LnksZSxnLHIsdil9LGFic2FyYzpmdW5jdGlvbihhLGMsZSxnLHIsdil7dGhpcy5hYnNlbGxpcHNlKGEsYyxlLGUsZyxyLHYpfSxlbGxpcHNlOmZ1bmN0aW9uKGEsYyxlLGcscix2LHosRSl7dGhpcy5hYnNlbGxpcHNlKGErdGhpcy5jdXJyZW50UG9pbnQueCxjK3RoaXMuY3VycmVudFBvaW50LnksCmUsZyxyLHYseixFKX0sYWJzZWxsaXBzZTpmdW5jdGlvbihhLGMsZSxnLHIsdix6LEUpe2E9bmV3IHBjKGEsYyxlLGcscix2LHosRSk7MDx0aGlzLmN1cnZlcy5sZW5ndGgmJihjPWEuZ2V0UG9pbnQoMCksYy5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyhjLngsYy55KSk7dGhpcy5jdXJ2ZXMucHVzaChhKTthPWEuZ2V0UG9pbnQoMSk7dGhpcy5jdXJyZW50UG9pbnQuY29weShhKX0sY29weTpmdW5jdGlvbihhKXtnZC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jdXJyZW50UG9pbnQuY29weShhLmN1cnJlbnRQb2ludCk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPWdkLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCk7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe2dkLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KGEuY3VycmVudFBvaW50KTsKcmV0dXJuIHRoaXN9fSk7Q2QucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShHYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpDZCxnZXRQb2ludHNIb2xlczpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wLGc9dGhpcy5ob2xlcy5sZW5ndGg7ZTxnO2UrKyljW2VdPXRoaXMuaG9sZXNbZV0uZ2V0UG9pbnRzKGEpO3JldHVybiBjfSxleHRyYWN0UG9pbnRzOmZ1bmN0aW9uKGEpe3JldHVybntzaGFwZTp0aGlzLmdldFBvaW50cyhhKSxob2xlczp0aGlzLmdldFBvaW50c0hvbGVzKGEpfX0sY29weTpmdW5jdGlvbihhKXtHYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5ob2xlcz1bXTtmb3IodmFyIGM9MCxlPWEuaG9sZXMubGVuZ3RoO2M8ZTtjKyspdGhpcy5ob2xlcy5wdXNoKGEuaG9sZXNbY10uY2xvbmUoKSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPUdjLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnV1aWQ9dGhpcy51dWlkOwphLmhvbGVzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5ob2xlcy5sZW5ndGg7YzxlO2MrKylhLmhvbGVzLnB1c2godGhpcy5ob2xlc1tjXS50b0pTT04oKSk7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe0djLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy51dWlkPWEudXVpZDt0aGlzLmhvbGVzPVtdO2Zvcih2YXIgYz0wLGU9YS5ob2xlcy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YS5ob2xlc1tjXTt0aGlzLmhvbGVzLnB1c2goKG5ldyBHYykuZnJvbUpTT04oZykpfXJldHVybiB0aGlzfX0pO0piLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpKYixpc0xpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMuaW50ZW5zaXR5PWEuaW50ZW5zaXR5O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7YT0KQS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKTthLm9iamVjdC5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpO2Eub2JqZWN0LmludGVuc2l0eT10aGlzLmludGVuc2l0eTt2b2lkIDAhPT10aGlzLmdyb3VuZENvbG9yJiYoYS5vYmplY3QuZ3JvdW5kQ29sb3I9dGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5kaXN0YW5jZSYmKGEub2JqZWN0LmRpc3RhbmNlPXRoaXMuZGlzdGFuY2UpO3ZvaWQgMCE9PXRoaXMuYW5nbGUmJihhLm9iamVjdC5hbmdsZT10aGlzLmFuZ2xlKTt2b2lkIDAhPT10aGlzLmRlY2F5JiYoYS5vYmplY3QuZGVjYXk9dGhpcy5kZWNheSk7dm9pZCAwIT09dGhpcy5wZW51bWJyYSYmKGEub2JqZWN0LnBlbnVtYnJhPXRoaXMucGVudW1icmEpO3ZvaWQgMCE9PXRoaXMuc2hhZG93JiYoYS5vYmplY3Quc2hhZG93PXRoaXMuc2hhZG93LnRvSlNPTigpKTtyZXR1cm4gYX19KTtOZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpOZyxpc0hlbWlzcGhlcmVMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmdyb3VuZENvbG9yLmNvcHkoYS5ncm91bmRDb2xvcik7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihWYy5wcm90b3R5cGUse19wcm9qU2NyZWVuTWF0cml4Om5ldyBxLF9saWdodFBvc2l0aW9uV29ybGQ6bmV3IGssX2xvb2tUYXJnZXQ6bmV3IGssZ2V0Vmlld3BvcnRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92aWV3cG9ydENvdW50fSxnZXRGcnVzdHVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZydXN0dW19LHVwZGF0ZU1hdHJpY2VzOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY2FtZXJhLGU9dGhpcy5tYXRyaXgsZz10aGlzLl9wcm9qU2NyZWVuTWF0cml4LHI9dGhpcy5fbG9va1RhcmdldCx2PXRoaXMuX2xpZ2h0UG9zaXRpb25Xb3JsZDt2LnNldEZyb21NYXRyaXhQb3NpdGlvbihhLm1hdHJpeFdvcmxkKTsKYy5wb3NpdGlvbi5jb3B5KHYpO3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEudGFyZ2V0Lm1hdHJpeFdvcmxkKTtjLmxvb2tBdChyKTtjLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Zy5tdWx0aXBseU1hdHJpY2VzKGMucHJvamVjdGlvbk1hdHJpeCxjLm1hdHJpeFdvcmxkSW52ZXJzZSk7dGhpcy5fZnJ1c3R1bS5zZXRGcm9tTWF0cml4KGcpO2Uuc2V0KC41LDAsMCwuNSwwLC41LDAsLjUsMCwwLC41LC41LDAsMCwwLDEpO2UubXVsdGlwbHkoYy5wcm9qZWN0aW9uTWF0cml4KTtlLm11bHRpcGx5KGMubWF0cml4V29ybGRJbnZlcnNlKX0sZ2V0Vmlld3BvcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1thXX0sZ2V0RnJhbWVFeHRlbnRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZyYW1lRXh0ZW50c30sY29weTpmdW5jdGlvbihhKXt0aGlzLmNhbWVyYT1hLmNhbWVyYS5jbG9uZSgpO3RoaXMuYmlhcz1hLmJpYXM7dGhpcy5yYWRpdXM9YS5yYWRpdXM7dGhpcy5tYXBTaXplLmNvcHkoYS5tYXBTaXplKTsKcmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT17fTswIT09dGhpcy5iaWFzJiYoYS5iaWFzPXRoaXMuYmlhcyk7MSE9PXRoaXMucmFkaXVzJiYoYS5yYWRpdXM9dGhpcy5yYWRpdXMpO2lmKDUxMiE9PXRoaXMubWFwU2l6ZS54fHw1MTIhPT10aGlzLm1hcFNpemUueSlhLm1hcFNpemU9dGhpcy5tYXBTaXplLnRvQXJyYXkoKTthLmNhbWVyYT10aGlzLmNhbWVyYS50b0pTT04oITEpLm9iamVjdDtkZWxldGUgYS5jYW1lcmEubWF0cml4O3JldHVybiBhfX0pO09nLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVmMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6T2csaXNTcG90TGlnaHRTaGFkb3c6ITAsdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuY2FtZXJhLHI9MipoYi5SQUQyREVHKmEuYW5nbGUsdj10aGlzLm1hcFNpemUud2lkdGgvCnRoaXMubWFwU2l6ZS5oZWlnaHQsej1hLmRpc3RhbmNlfHxnLmZhcjtpZihyIT09Zy5mb3Z8fHYhPT1nLmFzcGVjdHx8eiE9PWcuZmFyKWcuZm92PXIsZy5hc3BlY3Q9dixnLmZhcj16LGcudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1ZjLnByb3RvdHlwZS51cGRhdGVNYXRyaWNlcy5jYWxsKHRoaXMsYSxjLGUpfX0pO1BnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSmIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6UGcsaXNTcG90TGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtKYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kaXN0YW5jZT1hLmRpc3RhbmNlO3RoaXMuYW5nbGU9YS5hbmdsZTt0aGlzLnBlbnVtYnJhPWEucGVudW1icmE7dGhpcy5kZWNheT1hLmRlY2F5O3RoaXMudGFyZ2V0PWEudGFyZ2V0LmNsb25lKCk7dGhpcy5zaGFkb3c9YS5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtkaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFZjLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpkaSxpc1BvaW50TGlnaHRTaGFkb3c6ITAsdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYSxjLGUpe2M9dGhpcy5jYW1lcmE7dmFyIGc9dGhpcy5tYXRyaXgscj10aGlzLl9saWdodFBvc2l0aW9uV29ybGQsdj10aGlzLl9sb29rVGFyZ2V0LHo9dGhpcy5fcHJvalNjcmVlbk1hdHJpeDtyLnNldEZyb21NYXRyaXhQb3NpdGlvbihhLm1hdHJpeFdvcmxkKTtjLnBvc2l0aW9uLmNvcHkocik7di5jb3B5KGMucG9zaXRpb24pO3YuYWRkKHRoaXMuX2N1YmVEaXJlY3Rpb25zW2VdKTtjLnVwLmNvcHkodGhpcy5fY3ViZVVwc1tlXSk7Yy5sb29rQXQodik7Yy51cGRhdGVNYXRyaXhXb3JsZCgpO2cubWFrZVRyYW5zbGF0aW9uKC1yLngsLXIueSwtci56KTt6Lm11bHRpcGx5TWF0cmljZXMoYy5wcm9qZWN0aW9uTWF0cml4LGMubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLl9mcnVzdHVtLnNldEZyb21NYXRyaXgoeil9fSk7UWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShKYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6UWcsaXNQb2ludExpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7SmIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZGlzdGFuY2U9YS5kaXN0YW5jZTt0aGlzLmRlY2F5PWEuZGVjYXk7dGhpcy5zaGFkb3c9YS5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtiZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmJnLGlzT3J0aG9ncmFwaGljQ2FtZXJhOiEwLGNvcHk6ZnVuY3Rpb24oYSxjKXt6Yi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSxjKTt0aGlzLmxlZnQ9YS5sZWZ0O3RoaXMucmlnaHQ9YS5yaWdodDt0aGlzLnRvcD1hLnRvcDt0aGlzLmJvdHRvbT1hLmJvdHRvbTt0aGlzLm5lYXI9YS5uZWFyO3RoaXMuZmFyPWEuZmFyO3RoaXMuem9vbT1hLnpvb207dGhpcy52aWV3PW51bGw9PT1hLnZpZXc/bnVsbDpPYmplY3QuYXNzaWduKHt9LGEudmlldyk7cmV0dXJuIHRoaXN9LApzZXRWaWV3T2Zmc2V0OmZ1bmN0aW9uKGEsYyxlLGcscix2KXtudWxsPT09dGhpcy52aWV3JiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KTt0aGlzLnZpZXcuZW5hYmxlZD0hMDt0aGlzLnZpZXcuZnVsbFdpZHRoPWE7dGhpcy52aWV3LmZ1bGxIZWlnaHQ9Yzt0aGlzLnZpZXcub2Zmc2V0WD1lO3RoaXMudmlldy5vZmZzZXRZPWc7dGhpcy52aWV3LndpZHRoPXI7dGhpcy52aWV3LmhlaWdodD12O3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxjbGVhclZpZXdPZmZzZXQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSx1cGRhdGVQcm9qZWN0aW9uTWF0cml4OmZ1bmN0aW9uKCl7dmFyIGE9KHRoaXMucmlnaHQtdGhpcy5sZWZ0KS8oMip0aGlzLnpvb20pLGM9KHRoaXMudG9wLQp0aGlzLmJvdHRvbSkvKDIqdGhpcy56b29tKSxlPSh0aGlzLnJpZ2h0K3RoaXMubGVmdCkvMixnPSh0aGlzLnRvcCt0aGlzLmJvdHRvbSkvMixyPWUtYTtlKz1hO2E9ZytjO2M9Zy1jO2lmKG51bGwhPT10aGlzLnZpZXcmJnRoaXMudmlldy5lbmFibGVkKXtlPXRoaXMuem9vbS8odGhpcy52aWV3LndpZHRoL3RoaXMudmlldy5mdWxsV2lkdGgpO2M9dGhpcy56b29tLyh0aGlzLnZpZXcuaGVpZ2h0L3RoaXMudmlldy5mdWxsSGVpZ2h0KTt2YXIgdj0odGhpcy5yaWdodC10aGlzLmxlZnQpL3RoaXMudmlldy53aWR0aDtnPSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvdGhpcy52aWV3LmhlaWdodDtyKz10aGlzLnZpZXcub2Zmc2V0WC9lKnY7ZT1yK3RoaXMudmlldy53aWR0aC9lKnY7YS09dGhpcy52aWV3Lm9mZnNldFkvYypnO2M9YS10aGlzLnZpZXcuaGVpZ2h0L2MqZ310aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyhyLGUsYSxjLHRoaXMubmVhcix0aGlzLmZhcik7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMucHJvamVjdGlvbk1hdHJpeCl9LAp0b0pTT046ZnVuY3Rpb24oYSl7YT1BLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0Lnpvb209dGhpcy56b29tO2Eub2JqZWN0LmxlZnQ9dGhpcy5sZWZ0O2Eub2JqZWN0LnJpZ2h0PXRoaXMucmlnaHQ7YS5vYmplY3QudG9wPXRoaXMudG9wO2Eub2JqZWN0LmJvdHRvbT10aGlzLmJvdHRvbTthLm9iamVjdC5uZWFyPXRoaXMubmVhcjthLm9iamVjdC5mYXI9dGhpcy5mYXI7bnVsbCE9PXRoaXMudmlldyYmKGEub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKTtyZXR1cm4gYX19KTtSZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFZjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlJnLGlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihhLGMsZSl7VmMucHJvdG90eXBlLnVwZGF0ZU1hdHJpY2VzLmNhbGwodGhpcyxhLGMsZSl9fSk7U2cucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShKYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6U2csaXNEaXJlY3Rpb25hbExpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7SmIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudGFyZ2V0PWEudGFyZ2V0LmNsb25lKCk7dGhpcy5zaGFkb3c9YS5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtUZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlRnLGlzQW1iaWVudExpZ2h0OiEwfSk7VWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShKYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpVZyxpc1JlY3RBcmVhTGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtKYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy53aWR0aD1hLndpZHRoO3RoaXMuaGVpZ2h0PWEuaGVpZ2h0O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7YT1KYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKTthLm9iamVjdC53aWR0aD0KdGhpcy53aWR0aDthLm9iamVjdC5oZWlnaHQ9dGhpcy5oZWlnaHQ7cmV0dXJuIGF9fSk7VmcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpWZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj1uZXcgdWMoci5tYW5hZ2VyKTt2LnNldFBhdGgoci5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtjKHIucGFyc2UoSlNPTi5wYXJzZSh6KSkpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXtmdW5jdGlvbiBjKEUpe3ZvaWQgMD09PWVbRV0mJmNvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIixFKTtyZXR1cm4gZVtFXX12YXIgZT10aGlzLnRleHR1cmVzLGc9bmV3IEttW2EudHlwZV07dm9pZCAwIT09YS51dWlkJiYoZy51dWlkPWEudXVpZCk7dm9pZCAwIT09YS5uYW1lJiYoZy5uYW1lPWEubmFtZSk7dm9pZCAwIT09YS5jb2xvciYmZy5jb2xvci5zZXRIZXgoYS5jb2xvcik7CnZvaWQgMCE9PWEucm91Z2huZXNzJiYoZy5yb3VnaG5lc3M9YS5yb3VnaG5lc3MpO3ZvaWQgMCE9PWEubWV0YWxuZXNzJiYoZy5tZXRhbG5lc3M9YS5tZXRhbG5lc3MpO3ZvaWQgMCE9PWEuZW1pc3NpdmUmJmcuZW1pc3NpdmUuc2V0SGV4KGEuZW1pc3NpdmUpO3ZvaWQgMCE9PWEuc3BlY3VsYXImJmcuc3BlY3VsYXIuc2V0SGV4KGEuc3BlY3VsYXIpO3ZvaWQgMCE9PWEuc2hpbmluZXNzJiYoZy5zaGluaW5lc3M9YS5zaGluaW5lc3MpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0JiYoZy5jbGVhcmNvYXQ9YS5jbGVhcmNvYXQpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0Um91Z2huZXNzJiYoZy5jbGVhcmNvYXRSb3VnaG5lc3M9YS5jbGVhcmNvYXRSb3VnaG5lc3MpO3ZvaWQgMCE9PWEudmVydGV4Q29sb3JzJiYoZy52ZXJ0ZXhDb2xvcnM9YS52ZXJ0ZXhDb2xvcnMpO3ZvaWQgMCE9PWEuZm9nJiYoZy5mb2c9YS5mb2cpO3ZvaWQgMCE9PWEuZmxhdFNoYWRpbmcmJihnLmZsYXRTaGFkaW5nPWEuZmxhdFNoYWRpbmcpOwp2b2lkIDAhPT1hLmJsZW5kaW5nJiYoZy5ibGVuZGluZz1hLmJsZW5kaW5nKTt2b2lkIDAhPT1hLmNvbWJpbmUmJihnLmNvbWJpbmU9YS5jb21iaW5lKTt2b2lkIDAhPT1hLnNpZGUmJihnLnNpZGU9YS5zaWRlKTt2b2lkIDAhPT1hLm9wYWNpdHkmJihnLm9wYWNpdHk9YS5vcGFjaXR5KTt2b2lkIDAhPT1hLnRyYW5zcGFyZW50JiYoZy50cmFuc3BhcmVudD1hLnRyYW5zcGFyZW50KTt2b2lkIDAhPT1hLmFscGhhVGVzdCYmKGcuYWxwaGFUZXN0PWEuYWxwaGFUZXN0KTt2b2lkIDAhPT1hLmRlcHRoVGVzdCYmKGcuZGVwdGhUZXN0PWEuZGVwdGhUZXN0KTt2b2lkIDAhPT1hLmRlcHRoV3JpdGUmJihnLmRlcHRoV3JpdGU9YS5kZXB0aFdyaXRlKTt2b2lkIDAhPT1hLmNvbG9yV3JpdGUmJihnLmNvbG9yV3JpdGU9YS5jb2xvcldyaXRlKTt2b2lkIDAhPT1hLndpcmVmcmFtZSYmKGcud2lyZWZyYW1lPWEud2lyZWZyYW1lKTt2b2lkIDAhPT1hLndpcmVmcmFtZUxpbmV3aWR0aCYmKGcud2lyZWZyYW1lTGluZXdpZHRoPQphLndpcmVmcmFtZUxpbmV3aWR0aCk7dm9pZCAwIT09YS53aXJlZnJhbWVMaW5lY2FwJiYoZy53aXJlZnJhbWVMaW5lY2FwPWEud2lyZWZyYW1lTGluZWNhcCk7dm9pZCAwIT09YS53aXJlZnJhbWVMaW5lam9pbiYmKGcud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbik7dm9pZCAwIT09YS5yb3RhdGlvbiYmKGcucm90YXRpb249YS5yb3RhdGlvbik7MSE9PWEubGluZXdpZHRoJiYoZy5saW5ld2lkdGg9YS5saW5ld2lkdGgpO3ZvaWQgMCE9PWEuZGFzaFNpemUmJihnLmRhc2hTaXplPWEuZGFzaFNpemUpO3ZvaWQgMCE9PWEuZ2FwU2l6ZSYmKGcuZ2FwU2l6ZT1hLmdhcFNpemUpO3ZvaWQgMCE9PWEuc2NhbGUmJihnLnNjYWxlPWEuc2NhbGUpO3ZvaWQgMCE9PWEucG9seWdvbk9mZnNldCYmKGcucG9seWdvbk9mZnNldD1hLnBvbHlnb25PZmZzZXQpO3ZvaWQgMCE9PWEucG9seWdvbk9mZnNldEZhY3RvciYmKGcucG9seWdvbk9mZnNldEZhY3Rvcj1hLnBvbHlnb25PZmZzZXRGYWN0b3IpOwp2b2lkIDAhPT1hLnBvbHlnb25PZmZzZXRVbml0cyYmKGcucG9seWdvbk9mZnNldFVuaXRzPWEucG9seWdvbk9mZnNldFVuaXRzKTt2b2lkIDAhPT1hLnNraW5uaW5nJiYoZy5za2lubmluZz1hLnNraW5uaW5nKTt2b2lkIDAhPT1hLm1vcnBoVGFyZ2V0cyYmKGcubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzKTt2b2lkIDAhPT1hLm1vcnBoTm9ybWFscyYmKGcubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzKTt2b2lkIDAhPT1hLmRpdGhlcmluZyYmKGcuZGl0aGVyaW5nPWEuZGl0aGVyaW5nKTt2b2lkIDAhPT1hLnZpc2libGUmJihnLnZpc2libGU9YS52aXNpYmxlKTt2b2lkIDAhPT1hLnRvbmVNYXBwZWQmJihnLnRvbmVNYXBwZWQ9YS50b25lTWFwcGVkKTt2b2lkIDAhPT1hLnVzZXJEYXRhJiYoZy51c2VyRGF0YT1hLnVzZXJEYXRhKTtpZih2b2lkIDAhPT1hLnVuaWZvcm1zKWZvcih2YXIgciBpbiBhLnVuaWZvcm1zKXt2YXIgdj1hLnVuaWZvcm1zW3JdO2cudW5pZm9ybXNbcl09Cnt9O3N3aXRjaCh2LnR5cGUpe2Nhc2UgInQiOmcudW5pZm9ybXNbcl0udmFsdWU9Yyh2LnZhbHVlKTticmVhaztjYXNlICJjIjpnLnVuaWZvcm1zW3JdLnZhbHVlPShuZXcgSSkuc2V0SGV4KHYudmFsdWUpO2JyZWFrO2Nhc2UgInYyIjpnLnVuaWZvcm1zW3JdLnZhbHVlPShuZXcgZikuZnJvbUFycmF5KHYudmFsdWUpO2JyZWFrO2Nhc2UgInYzIjpnLnVuaWZvcm1zW3JdLnZhbHVlPShuZXcgaykuZnJvbUFycmF5KHYudmFsdWUpO2JyZWFrO2Nhc2UgInY0IjpnLnVuaWZvcm1zW3JdLnZhbHVlPShuZXcgcCkuZnJvbUFycmF5KHYudmFsdWUpO2JyZWFrO2Nhc2UgIm0zIjpnLnVuaWZvcm1zW3JdLnZhbHVlPShuZXcgdCkuZnJvbUFycmF5KHYudmFsdWUpO2Nhc2UgIm00IjpnLnVuaWZvcm1zW3JdLnZhbHVlPShuZXcgcSkuZnJvbUFycmF5KHYudmFsdWUpO2JyZWFrO2RlZmF1bHQ6Zy51bmlmb3Jtc1tyXS52YWx1ZT12LnZhbHVlfX12b2lkIDAhPT1hLmRlZmluZXMmJihnLmRlZmluZXM9YS5kZWZpbmVzKTsKdm9pZCAwIT09YS52ZXJ0ZXhTaGFkZXImJihnLnZlcnRleFNoYWRlcj1hLnZlcnRleFNoYWRlcik7dm9pZCAwIT09YS5mcmFnbWVudFNoYWRlciYmKGcuZnJhZ21lbnRTaGFkZXI9YS5mcmFnbWVudFNoYWRlcik7aWYodm9pZCAwIT09YS5leHRlbnNpb25zKWZvcih2YXIgeiBpbiBhLmV4dGVuc2lvbnMpZy5leHRlbnNpb25zW3pdPWEuZXh0ZW5zaW9uc1t6XTt2b2lkIDAhPT1hLnNoYWRpbmcmJihnLmZsYXRTaGFkaW5nPTE9PT1hLnNoYWRpbmcpO3ZvaWQgMCE9PWEuc2l6ZSYmKGcuc2l6ZT1hLnNpemUpO3ZvaWQgMCE9PWEuc2l6ZUF0dGVudWF0aW9uJiYoZy5zaXplQXR0ZW51YXRpb249YS5zaXplQXR0ZW51YXRpb24pO3ZvaWQgMCE9PWEubWFwJiYoZy5tYXA9YyhhLm1hcCkpO3ZvaWQgMCE9PWEubWF0Y2FwJiYoZy5tYXRjYXA9YyhhLm1hdGNhcCkpO3ZvaWQgMCE9PWEuYWxwaGFNYXAmJihnLmFscGhhTWFwPWMoYS5hbHBoYU1hcCksZy50cmFuc3BhcmVudD0hMCk7dm9pZCAwIT09CmEuYnVtcE1hcCYmKGcuYnVtcE1hcD1jKGEuYnVtcE1hcCkpO3ZvaWQgMCE9PWEuYnVtcFNjYWxlJiYoZy5idW1wU2NhbGU9YS5idW1wU2NhbGUpO3ZvaWQgMCE9PWEubm9ybWFsTWFwJiYoZy5ub3JtYWxNYXA9YyhhLm5vcm1hbE1hcCkpO3ZvaWQgMCE9PWEubm9ybWFsTWFwVHlwZSYmKGcubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGUpO3ZvaWQgMCE9PWEubm9ybWFsU2NhbGUmJihyPWEubm9ybWFsU2NhbGUsITE9PT1BcnJheS5pc0FycmF5KHIpJiYocj1bcixyXSksZy5ub3JtYWxTY2FsZT0obmV3IGYpLmZyb21BcnJheShyKSk7dm9pZCAwIT09YS5kaXNwbGFjZW1lbnRNYXAmJihnLmRpc3BsYWNlbWVudE1hcD1jKGEuZGlzcGxhY2VtZW50TWFwKSk7dm9pZCAwIT09YS5kaXNwbGFjZW1lbnRTY2FsZSYmKGcuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZSk7dm9pZCAwIT09YS5kaXNwbGFjZW1lbnRCaWFzJiYoZy5kaXNwbGFjZW1lbnRCaWFzPWEuZGlzcGxhY2VtZW50Qmlhcyk7CnZvaWQgMCE9PWEucm91Z2huZXNzTWFwJiYoZy5yb3VnaG5lc3NNYXA9YyhhLnJvdWdobmVzc01hcCkpO3ZvaWQgMCE9PWEubWV0YWxuZXNzTWFwJiYoZy5tZXRhbG5lc3NNYXA9YyhhLm1ldGFsbmVzc01hcCkpO3ZvaWQgMCE9PWEuZW1pc3NpdmVNYXAmJihnLmVtaXNzaXZlTWFwPWMoYS5lbWlzc2l2ZU1hcCkpO3ZvaWQgMCE9PWEuZW1pc3NpdmVJbnRlbnNpdHkmJihnLmVtaXNzaXZlSW50ZW5zaXR5PWEuZW1pc3NpdmVJbnRlbnNpdHkpO3ZvaWQgMCE9PWEuc3BlY3VsYXJNYXAmJihnLnNwZWN1bGFyTWFwPWMoYS5zcGVjdWxhck1hcCkpO3ZvaWQgMCE9PWEuZW52TWFwJiYoZy5lbnZNYXA9YyhhLmVudk1hcCkpO3ZvaWQgMCE9PWEuZW52TWFwSW50ZW5zaXR5JiYoZy5lbnZNYXBJbnRlbnNpdHk9YS5lbnZNYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWEucmVmbGVjdGl2aXR5JiYoZy5yZWZsZWN0aXZpdHk9YS5yZWZsZWN0aXZpdHkpO3ZvaWQgMCE9PWEucmVmcmFjdGlvblJhdGlvJiYoZy5yZWZyYWN0aW9uUmF0aW89CmEucmVmcmFjdGlvblJhdGlvKTt2b2lkIDAhPT1hLmxpZ2h0TWFwJiYoZy5saWdodE1hcD1jKGEubGlnaHRNYXApKTt2b2lkIDAhPT1hLmxpZ2h0TWFwSW50ZW5zaXR5JiYoZy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1hLmFvTWFwJiYoZy5hb01hcD1jKGEuYW9NYXApKTt2b2lkIDAhPT1hLmFvTWFwSW50ZW5zaXR5JiYoZy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1hLmdyYWRpZW50TWFwJiYoZy5ncmFkaWVudE1hcD1jKGEuZ3JhZGllbnRNYXApKTt2b2lkIDAhPT1hLmNsZWFyY29hdE5vcm1hbE1hcCYmKGcuY2xlYXJjb2F0Tm9ybWFsTWFwPWMoYS5jbGVhcmNvYXROb3JtYWxNYXApKTt2b2lkIDAhPT1hLmNsZWFyY29hdE5vcm1hbFNjYWxlJiYoZy5jbGVhcmNvYXROb3JtYWxTY2FsZT0obmV3IGYpLmZyb21BcnJheShhLmNsZWFyY29hdE5vcm1hbFNjYWxlKSk7cmV0dXJuIGd9LHNldFRleHR1cmVzOmZ1bmN0aW9uKGEpe3RoaXMudGV4dHVyZXM9CmE7cmV0dXJuIHRoaXN9fSk7dmFyIFBpPXtkZWNvZGVUZXh0OmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIFRleHREZWNvZGVyKXJldHVybihuZXcgVGV4dERlY29kZXIpLmRlY29kZShhKTtmb3IodmFyIGM9IiIsZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyljKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGFbZV0pO3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShjKSl9Y2F0Y2gocil7cmV0dXJuIGN9fSxleHRyYWN0VXJsQmFzZTpmdW5jdGlvbihhKXt2YXIgYz1hLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuLTE9PT1jPyIuLyI6YS5zdWJzdHIoMCxjKzEpfX07V2cucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpXZyxpc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiEwLGNvcHk6ZnVuY3Rpb24oYSl7dmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMubWF4SW5zdGFuY2VkQ291bnQ9CmEubWF4SW5zdGFuY2VkQ291bnQ7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT12YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS5tYXhJbnN0YW5jZWRDb3VudD10aGlzLm1heEluc3RhbmNlZENvdW50O2EuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMDtyZXR1cm4gYX19KTtYZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WGcsaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6ITAsY29weTpmdW5jdGlvbihhKXtRLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9YS5tZXNoUGVyQXR0cmlidXRlO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT1RLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLm1lc2hQZXJBdHRyaWJ1dGU9CnRoaXMubWVzaFBlckF0dHJpYnV0ZTthLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPSEwO3JldHVybiBhfX0pO1lnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WWcsbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2YXIgcj10aGlzLHY9bmV3IHVjKHIubWFuYWdlcik7di5zZXRQYXRoKHIucGF0aCk7di5sb2FkKGEsZnVuY3Rpb24oeil7YyhyLnBhcnNlKEpTT04ucGFyc2UoeikpKX0sZSxnKX0scGFyc2U6ZnVuY3Rpb24oYSl7dmFyIGM9YS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5P25ldyBXZzpuZXcgdmEsZT1hLmRhdGEuaW5kZXg7aWYodm9pZCAwIT09ZSl7dmFyIGc9bmV3IFFpW2UudHlwZV0oZS5hcnJheSk7Yy5zZXRJbmRleChuZXcgUShnLDEpKX1lPWEuZGF0YS5hdHRyaWJ1dGVzO2Zvcih2YXIgciBpbiBlKXt2YXIgdj1lW3JdO2c9bmV3IFFpW3YudHlwZV0odi5hcnJheSk7Zz1uZXcgKHYuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/ClhnOlEpKGcsdi5pdGVtU2l6ZSx2Lm5vcm1hbGl6ZWQpO3ZvaWQgMCE9PXYubmFtZSYmKGcubmFtZT12Lm5hbWUpO2MuYWRkQXR0cmlidXRlKHIsZyl9dmFyIHo9YS5kYXRhLm1vcnBoQXR0cmlidXRlcztpZih6KWZvcihyIGluIHope3ZhciBFPXpbcl0sRz1bXTtlPTA7Zm9yKHZhciBKPUUubGVuZ3RoO2U8SjtlKyspdj1FW2VdLGc9bmV3IFFpW3YudHlwZV0odi5hcnJheSksZz1uZXcgUShnLHYuaXRlbVNpemUsdi5ub3JtYWxpemVkKSx2b2lkIDAhPT12Lm5hbWUmJihnLm5hbWU9di5uYW1lKSxHLnB1c2goZyk7Yy5tb3JwaEF0dHJpYnV0ZXNbcl09R31yPWEuZGF0YS5ncm91cHN8fGEuZGF0YS5kcmF3Y2FsbHN8fGEuZGF0YS5vZmZzZXRzO2lmKHZvaWQgMCE9PXIpZm9yKGU9MCx2PXIubGVuZ3RoO2UhPT12OysrZSlnPXJbZV0sYy5hZGRHcm91cChnLnN0YXJ0LGcuY291bnQsZy5tYXRlcmlhbEluZGV4KTtlPWEuZGF0YS5ib3VuZGluZ1NwaGVyZTt2b2lkIDAhPT1lJiYocj1uZXcgaywKdm9pZCAwIT09ZS5jZW50ZXImJnIuZnJvbUFycmF5KGUuY2VudGVyKSxjLmJvdW5kaW5nU3BoZXJlPW5ldyBGKHIsZS5yYWRpdXMpKTthLm5hbWUmJihjLm5hbWU9YS5uYW1lKTthLnVzZXJEYXRhJiYoYy51c2VyRGF0YT1hLnVzZXJEYXRhKTtyZXR1cm4gY319KTt2YXIgUWk9e0ludDhBcnJheSxVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5OiJ1bmRlZmluZWQiIT09dHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5P1VpbnQ4Q2xhbXBlZEFycmF5OlVpbnQ4QXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXl9O1pnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WmcsbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2YXIgcj10aGlzLHY9IiI9PT10aGlzLnBhdGg/UGkuZXh0cmFjdFVybEJhc2UoYSk6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPQp0aGlzLnJlc291cmNlUGF0aHx8djt2PW5ldyB1YyhyLm1hbmFnZXIpO3Yuc2V0UGF0aCh0aGlzLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope3ZhciBFPW51bGw7dHJ5e0U9SlNPTi5wYXJzZSh6KX1jYXRjaChHKXt2b2lkIDAhPT1nJiZnKEcpO2NvbnNvbGUuZXJyb3IoIlRIUkVFOk9iamVjdExvYWRlcjogQ2FuJ3QgcGFyc2UgIithKyIuIixHLm1lc3NhZ2UpO3JldHVybn16PUUubWV0YWRhdGE7dm9pZCAwPT09enx8dm9pZCAwPT09ei50eXBlfHwiZ2VvbWV0cnkiPT09ei50eXBlLnRvTG93ZXJDYXNlKCk/Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW4ndCBsb2FkICIrYSk6ci5wYXJzZShFLGMpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMucGFyc2VTaGFwZShhLnNoYXBlcyk7ZT10aGlzLnBhcnNlR2VvbWV0cmllcyhhLmdlb21ldHJpZXMsZSk7dmFyIGc9dGhpcy5wYXJzZUltYWdlcyhhLmltYWdlcyxmdW5jdGlvbigpe3ZvaWQgMCE9PQpjJiZjKHIpfSk7Zz10aGlzLnBhcnNlVGV4dHVyZXMoYS50ZXh0dXJlcyxnKTtnPXRoaXMucGFyc2VNYXRlcmlhbHMoYS5tYXRlcmlhbHMsZyk7dmFyIHI9dGhpcy5wYXJzZU9iamVjdChhLm9iamVjdCxlLGcpO2EuYW5pbWF0aW9ucyYmKHIuYW5pbWF0aW9ucz10aGlzLnBhcnNlQW5pbWF0aW9ucyhhLmFuaW1hdGlvbnMpKTt2b2lkIDAhPT1hLmltYWdlcyYmMCE9PWEuaW1hZ2VzLmxlbmd0aHx8dm9pZCAwPT09Y3x8YyhyKTtyZXR1cm4gcn0scGFyc2VTaGFwZTpmdW5jdGlvbihhKXt2YXIgYz17fTtpZih2b2lkIDAhPT1hKWZvcih2YXIgZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9KG5ldyBDZCkuZnJvbUpTT04oYVtlXSk7Y1tyLnV1aWRdPXJ9cmV0dXJuIGN9LHBhcnNlR2VvbWV0cmllczpmdW5jdGlvbihhLGMpe3ZhciBlPXt9O2lmKHZvaWQgMCE9PWEpZm9yKHZhciBnPW5ldyBZZyxyPTAsdj1hLmxlbmd0aDtyPHY7cisrKXt2YXIgej1hW3JdO3N3aXRjaCh6LnR5cGUpe2Nhc2UgIlBsYW5lR2VvbWV0cnkiOmNhc2UgIlBsYW5lQnVmZmVyR2VvbWV0cnkiOnZhciBFPQpuZXcgZ2Nbei50eXBlXSh6LndpZHRoLHouaGVpZ2h0LHoud2lkdGhTZWdtZW50cyx6LmhlaWdodFNlZ21lbnRzKTticmVhaztjYXNlICJCb3hHZW9tZXRyeSI6Y2FzZSAiQm94QnVmZmVyR2VvbWV0cnkiOmNhc2UgIkN1YmVHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LndpZHRoLHouaGVpZ2h0LHouZGVwdGgsei53aWR0aFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMsei5kZXB0aFNlZ21lbnRzKTticmVhaztjYXNlICJDaXJjbGVHZW9tZXRyeSI6Y2FzZSAiQ2lyY2xlQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGdjW3oudHlwZV0oei5yYWRpdXMsei5zZWdtZW50cyx6LnRoZXRhU3RhcnQsei50aGV0YUxlbmd0aCk7YnJlYWs7Y2FzZSAiQ3lsaW5kZXJHZW9tZXRyeSI6Y2FzZSAiQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnJhZGl1c1RvcCx6LnJhZGl1c0JvdHRvbSx6LmhlaWdodCx6LnJhZGlhbFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMsei5vcGVuRW5kZWQsCnoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJDb25lR2VvbWV0cnkiOmNhc2UgIkNvbmVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnJhZGl1cyx6LmhlaWdodCx6LnJhZGlhbFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMsei5vcGVuRW5kZWQsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIlNwaGVyZUdlb21ldHJ5IjpjYXNlICJTcGhlcmVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnJhZGl1cyx6LndpZHRoU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6LnBoaVN0YXJ0LHoucGhpTGVuZ3RoLHoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJEb2RlY2FoZWRyb25HZW9tZXRyeSI6Y2FzZSAiRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIkljb3NhaGVkcm9uR2VvbWV0cnkiOmNhc2UgIkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIk9jdGFoZWRyb25HZW9tZXRyeSI6Y2FzZSAiT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpjYXNlICJUZXRyYWhlZHJvbkdlb21ldHJ5IjpjYXNlICJUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpFPQpuZXcgZ2Nbei50eXBlXSh6LnJhZGl1cyx6LmRldGFpbCk7YnJlYWs7Y2FzZSAiUmluZ0dlb21ldHJ5IjpjYXNlICJSaW5nQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGdjW3oudHlwZV0oei5pbm5lclJhZGl1cyx6Lm91dGVyUmFkaXVzLHoudGhldGFTZWdtZW50cyx6LnBoaVNlZ21lbnRzLHoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJUb3J1c0dlb21ldHJ5IjpjYXNlICJUb3J1c0J1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHoudHViZSx6LnJhZGlhbFNlZ21lbnRzLHoudHVidWxhclNlZ21lbnRzLHouYXJjKTticmVhaztjYXNlICJUb3J1c0tub3RHZW9tZXRyeSI6Y2FzZSAiVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkiOkU9bmV3IGdjW3oudHlwZV0oei5yYWRpdXMsei50dWJlLHoudHVidWxhclNlZ21lbnRzLHoucmFkaWFsU2VnbWVudHMsei5wLHoucSk7YnJlYWs7Y2FzZSAiVHViZUdlb21ldHJ5IjpjYXNlICJUdWJlQnVmZmVyR2VvbWV0cnkiOkU9Cm5ldyBnY1t6LnR5cGVdKChuZXcgT2lbei5wYXRoLnR5cGVdKS5mcm9tSlNPTih6LnBhdGgpLHoudHVidWxhclNlZ21lbnRzLHoucmFkaXVzLHoucmFkaWFsU2VnbWVudHMsei5jbG9zZWQpO2JyZWFrO2Nhc2UgIkxhdGhlR2VvbWV0cnkiOmNhc2UgIkxhdGhlQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGdjW3oudHlwZV0oei5wb2ludHMsei5zZWdtZW50cyx6LnBoaVN0YXJ0LHoucGhpTGVuZ3RoKTticmVhaztjYXNlICJQb2x5aGVkcm9uR2VvbWV0cnkiOmNhc2UgIlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnZlcnRpY2VzLHouaW5kaWNlcyx6LnJhZGl1cyx6LmRldGFpbHMpO2JyZWFrO2Nhc2UgIlNoYXBlR2VvbWV0cnkiOmNhc2UgIlNoYXBlQnVmZmVyR2VvbWV0cnkiOkU9W107Zm9yKHZhciBHPTAsSj16LnNoYXBlcy5sZW5ndGg7RzxKO0crKyl7dmFyIFA9Y1t6LnNoYXBlc1tHXV07RS5wdXNoKFApfUU9bmV3IGdjW3oudHlwZV0oRSx6LmN1cnZlU2VnbWVudHMpOwpicmVhaztjYXNlICJFeHRydWRlR2VvbWV0cnkiOmNhc2UgIkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSI6RT1bXTtHPTA7Zm9yKEo9ei5zaGFwZXMubGVuZ3RoO0c8SjtHKyspUD1jW3ouc2hhcGVzW0ddXSxFLnB1c2goUCk7Rz16Lm9wdGlvbnMuZXh0cnVkZVBhdGg7dm9pZCAwIT09RyYmKHoub3B0aW9ucy5leHRydWRlUGF0aD0obmV3IE9pW0cudHlwZV0pLmZyb21KU09OKEcpKTtFPW5ldyBnY1t6LnR5cGVdKEUsei5vcHRpb25zKTticmVhaztjYXNlICJCdWZmZXJHZW9tZXRyeSI6Y2FzZSAiSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiOkU9Zy5wYXJzZSh6KTticmVhaztjYXNlICJHZW9tZXRyeSI6IlRIUkVFImluIHdpbmRvdyYmIkxlZ2FjeUpTT05Mb2FkZXIiaW4gVEhSRUU/RT0obmV3IFRIUkVFLkxlZ2FjeUpTT05Mb2FkZXIpLnBhcnNlKHosdGhpcy5yZXNvdXJjZVBhdGgpLmdlb21ldHJ5OmNvbnNvbGUuZXJyb3IoJ1RIUkVFLk9iamVjdExvYWRlcjogWW91IGhhdmUgdG8gaW1wb3J0IExlZ2FjeUpTT05Mb2FkZXIgaW4gb3JkZXIgbG9hZCBnZW9tZXRyeSBkYXRhIG9mIHR5cGUgIkdlb21ldHJ5Ii4nKTsKYnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oJ1RIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSAiJyt6LnR5cGUrJyInKTtjb250aW51ZX1FLnV1aWQ9ei51dWlkO3ZvaWQgMCE9PXoubmFtZSYmKEUubmFtZT16Lm5hbWUpOyEwPT09RS5pc0J1ZmZlckdlb21ldHJ5JiZ2b2lkIDAhPT16LnVzZXJEYXRhJiYoRS51c2VyRGF0YT16LnVzZXJEYXRhKTtlW3oudXVpZF09RX1yZXR1cm4gZX0scGFyc2VNYXRlcmlhbHM6ZnVuY3Rpb24oYSxjKXt2YXIgZT17fSxnPXt9O2lmKHZvaWQgMCE9PWEpe3ZhciByPW5ldyBWZztyLnNldFRleHR1cmVzKGMpO2M9MDtmb3IodmFyIHY9YS5sZW5ndGg7Yzx2O2MrKyl7dmFyIHo9YVtjXTtpZigiTXVsdGlNYXRlcmlhbCI9PT16LnR5cGUpe2Zvcih2YXIgRT1bXSxHPTA7Rzx6Lm1hdGVyaWFscy5sZW5ndGg7RysrKXt2YXIgSj16Lm1hdGVyaWFsc1tHXTt2b2lkIDA9PT1lW0oudXVpZF0mJihlW0oudXVpZF09ci5wYXJzZShKKSk7CkUucHVzaChlW0oudXVpZF0pfWdbei51dWlkXT1FfWVsc2Ugdm9pZCAwPT09ZVt6LnV1aWRdJiYoZVt6LnV1aWRdPXIucGFyc2UoeikpLGdbei51dWlkXT1lW3oudXVpZF19fXJldHVybiBnfSxwYXJzZUFuaW1hdGlvbnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGc9YVtlXSxyPXRjLnBhcnNlKGcpO3ZvaWQgMCE9PWcudXVpZCYmKHIudXVpZD1nLnV1aWQpO2MucHVzaChyKX1yZXR1cm4gY30scGFyc2VJbWFnZXM6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBlKFMpe2cubWFuYWdlci5pdGVtU3RhcnQoUyk7cmV0dXJuIHYubG9hZChTLGZ1bmN0aW9uKCl7Zy5tYW5hZ2VyLml0ZW1FbmQoUyl9LHZvaWQgMCxmdW5jdGlvbigpe2cubWFuYWdlci5pdGVtRXJyb3IoUyk7Zy5tYW5hZ2VyLml0ZW1FbmQoUyl9KX12YXIgZz10aGlzLHI9e307aWYodm9pZCAwIT09YSYmMDxhLmxlbmd0aCl7Yz1uZXcgJGgoYyk7dmFyIHY9bmV3IFVlKGMpO3Yuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7CmM9MDtmb3IodmFyIHo9YS5sZW5ndGg7Yzx6O2MrKyl7dmFyIEU9YVtjXSxHPUUudXJsO2lmKEFycmF5LmlzQXJyYXkoRykpe3JbRS51dWlkXT1bXTtmb3IodmFyIEo9MCxQPUcubGVuZ3RoO0o8UDtKKyspe3ZhciBSPUdbSl07Uj0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChSKT9SOmcucmVzb3VyY2VQYXRoK1I7cltFLnV1aWRdLnB1c2goZShSKSl9fWVsc2UgUj0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChFLnVybCk/RS51cmw6Zy5yZXNvdXJjZVBhdGgrRS51cmwscltFLnV1aWRdPWUoUil9fXJldHVybiByfSxwYXJzZVRleHR1cmVzOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZShHLEope2lmKCJudW1iZXIiPT09dHlwZW9mIEcpcmV0dXJuIEc7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLiIsRyk7cmV0dXJuIEpbR119dmFyIGc9e307aWYodm9pZCAwIT09CmEpZm9yKHZhciByPTAsdj1hLmxlbmd0aDtyPHY7cisrKXt2YXIgej1hW3JdO3ZvaWQgMD09PXouaW1hZ2UmJmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBObyAiaW1hZ2UiIHNwZWNpZmllZCBmb3InLHoudXVpZCk7dm9pZCAwPT09Y1t6LmltYWdlXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZSIsei5pbWFnZSk7dmFyIEU9QXJyYXkuaXNBcnJheShjW3ouaW1hZ2VdKT9uZXcgY2QoY1t6LmltYWdlXSk6bmV3IGwoY1t6LmltYWdlXSk7RS5uZWVkc1VwZGF0ZT0hMDtFLnV1aWQ9ei51dWlkO3ZvaWQgMCE9PXoubmFtZSYmKEUubmFtZT16Lm5hbWUpO3ZvaWQgMCE9PXoubWFwcGluZyYmKEUubWFwcGluZz1lKHoubWFwcGluZyxMbSkpO3ZvaWQgMCE9PXoub2Zmc2V0JiZFLm9mZnNldC5mcm9tQXJyYXkoei5vZmZzZXQpO3ZvaWQgMCE9PXoucmVwZWF0JiZFLnJlcGVhdC5mcm9tQXJyYXkoei5yZXBlYXQpO3ZvaWQgMCE9PXouY2VudGVyJiYKRS5jZW50ZXIuZnJvbUFycmF5KHouY2VudGVyKTt2b2lkIDAhPT16LnJvdGF0aW9uJiYoRS5yb3RhdGlvbj16LnJvdGF0aW9uKTt2b2lkIDAhPT16LndyYXAmJihFLndyYXBTPWUoei53cmFwWzBdLHNrKSxFLndyYXBUPWUoei53cmFwWzFdLHNrKSk7dm9pZCAwIT09ei5mb3JtYXQmJihFLmZvcm1hdD16LmZvcm1hdCk7dm9pZCAwIT09ei50eXBlJiYoRS50eXBlPXoudHlwZSk7dm9pZCAwIT09ei5lbmNvZGluZyYmKEUuZW5jb2Rpbmc9ei5lbmNvZGluZyk7dm9pZCAwIT09ei5taW5GaWx0ZXImJihFLm1pbkZpbHRlcj1lKHoubWluRmlsdGVyLHRrKSk7dm9pZCAwIT09ei5tYWdGaWx0ZXImJihFLm1hZ0ZpbHRlcj1lKHoubWFnRmlsdGVyLHRrKSk7dm9pZCAwIT09ei5hbmlzb3Ryb3B5JiYoRS5hbmlzb3Ryb3B5PXouYW5pc290cm9weSk7dm9pZCAwIT09ei5mbGlwWSYmKEUuZmxpcFk9ei5mbGlwWSk7dm9pZCAwIT09ei5wcmVtdWx0aXBseUFscGhhJiYoRS5wcmVtdWx0aXBseUFscGhhPQp6LnByZW11bHRpcGx5QWxwaGEpO3ZvaWQgMCE9PXoudW5wYWNrQWxpZ25tZW50JiYoRS51bnBhY2tBbGlnbm1lbnQ9ei51bnBhY2tBbGlnbm1lbnQpO2dbei51dWlkXT1FfXJldHVybiBnfSxwYXJzZU9iamVjdDpmdW5jdGlvbihhLGMsZSl7ZnVuY3Rpb24gZyhKKXt2b2lkIDA9PT1jW0pdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5IixKKTtyZXR1cm4gY1tKXX1mdW5jdGlvbiByKEope2lmKHZvaWQgMCE9PUope2lmKEFycmF5LmlzQXJyYXkoSikpe2Zvcih2YXIgUD1bXSxSPTAsUz1KLmxlbmd0aDtSPFM7UisrKXt2YXIgVj1KW1JdO3ZvaWQgMD09PWVbVl0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLFYpO1AucHVzaChlW1ZdKX1yZXR1cm4gUH12b2lkIDA9PT1lW0pdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsIixKKTtyZXR1cm4gZVtKXX19CnN3aXRjaChhLnR5cGUpe2Nhc2UgIlNjZW5lIjp2YXIgdj1uZXcgeTt2b2lkIDAhPT1hLmJhY2tncm91bmQmJk51bWJlci5pc0ludGVnZXIoYS5iYWNrZ3JvdW5kKSYmKHYuYmFja2dyb3VuZD1uZXcgSShhLmJhY2tncm91bmQpKTt2b2lkIDAhPT1hLmZvZyYmKCJGb2ciPT09YS5mb2cudHlwZT92LmZvZz1uZXcgQWcoYS5mb2cuY29sb3IsYS5mb2cubmVhcixhLmZvZy5mYXIpOiJGb2dFeHAyIj09PWEuZm9nLnR5cGUmJih2LmZvZz1uZXcgemcoYS5mb2cuY29sb3IsYS5mb2cuZGVuc2l0eSkpKTticmVhaztjYXNlICJQZXJzcGVjdGl2ZUNhbWVyYSI6dj1uZXcgdmIoYS5mb3YsYS5hc3BlY3QsYS5uZWFyLGEuZmFyKTt2b2lkIDAhPT1hLmZvY3VzJiYodi5mb2N1cz1hLmZvY3VzKTt2b2lkIDAhPT1hLnpvb20mJih2Lnpvb209YS56b29tKTt2b2lkIDAhPT1hLmZpbG1HYXVnZSYmKHYuZmlsbUdhdWdlPWEuZmlsbUdhdWdlKTt2b2lkIDAhPT1hLmZpbG1PZmZzZXQmJih2LmZpbG1PZmZzZXQ9CmEuZmlsbU9mZnNldCk7dm9pZCAwIT09YS52aWV3JiYodi52aWV3PU9iamVjdC5hc3NpZ24oe30sYS52aWV3KSk7YnJlYWs7Y2FzZSAiT3J0aG9ncmFwaGljQ2FtZXJhIjp2PW5ldyBiZyhhLmxlZnQsYS5yaWdodCxhLnRvcCxhLmJvdHRvbSxhLm5lYXIsYS5mYXIpO3ZvaWQgMCE9PWEuem9vbSYmKHYuem9vbT1hLnpvb20pO3ZvaWQgMCE9PWEudmlldyYmKHYudmlldz1PYmplY3QuYXNzaWduKHt9LGEudmlldykpO2JyZWFrO2Nhc2UgIkFtYmllbnRMaWdodCI6dj1uZXcgVGcoYS5jb2xvcixhLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dj1uZXcgU2coYS5jb2xvcixhLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiUG9pbnRMaWdodCI6dj1uZXcgUWcoYS5jb2xvcixhLmludGVuc2l0eSxhLmRpc3RhbmNlLGEuZGVjYXkpO2JyZWFrO2Nhc2UgIlJlY3RBcmVhTGlnaHQiOnY9bmV3IFVnKGEuY29sb3IsYS5pbnRlbnNpdHksYS53aWR0aCxhLmhlaWdodCk7YnJlYWs7CmNhc2UgIlNwb3RMaWdodCI6dj1uZXcgUGcoYS5jb2xvcixhLmludGVuc2l0eSxhLmRpc3RhbmNlLGEuYW5nbGUsYS5wZW51bWJyYSxhLmRlY2F5KTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOnY9bmV3IE5nKGEuY29sb3IsYS5ncm91bmRDb2xvcixhLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiU2tpbm5lZE1lc2giOmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlT2JqZWN0KCkgZG9lcyBub3Qgc3VwcG9ydCBTa2lubmVkTWVzaCB5ZXQuIik7Y2FzZSAiTWVzaCI6dj1nKGEuZ2VvbWV0cnkpO3ZhciB6PXIoYS5tYXRlcmlhbCk7dj12LmJvbmVzJiYwPHYuYm9uZXMubGVuZ3RoP25ldyBCZih2LHopOm5ldyB4YSh2LHopO3ZvaWQgMCE9PWEuZHJhd01vZGUmJnYuc2V0RHJhd01vZGUoYS5kcmF3TW9kZSk7YnJlYWs7Y2FzZSAiTE9EIjp2PW5ldyBBZjticmVhaztjYXNlICJMaW5lIjp2PW5ldyBWYihnKGEuZ2VvbWV0cnkpLHIoYS5tYXRlcmlhbCksYS5tb2RlKTsKYnJlYWs7Y2FzZSAiTGluZUxvb3AiOnY9bmV3IERnKGcoYS5nZW9tZXRyeSkscihhLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiTGluZVNlZ21lbnRzIjp2PW5ldyBJYihnKGEuZ2VvbWV0cnkpLHIoYS5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIlBvaW50Q2xvdWQiOmNhc2UgIlBvaW50cyI6dj1uZXcgQ2UoZyhhLmdlb21ldHJ5KSxyKGEubWF0ZXJpYWwpKTticmVhaztjYXNlICJTcHJpdGUiOnY9bmV3IHlmKHIoYS5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIkdyb3VwIjp2PW5ldyB1ZTticmVhaztkZWZhdWx0OnY9bmV3IEF9di51dWlkPWEudXVpZDt2b2lkIDAhPT1hLm5hbWUmJih2Lm5hbWU9YS5uYW1lKTt2b2lkIDAhPT1hLm1hdHJpeD8odi5tYXRyaXguZnJvbUFycmF5KGEubWF0cml4KSx2b2lkIDAhPT1hLm1hdHJpeEF1dG9VcGRhdGUmJih2Lm1hdHJpeEF1dG9VcGRhdGU9YS5tYXRyaXhBdXRvVXBkYXRlKSx2Lm1hdHJpeEF1dG9VcGRhdGUmJnYubWF0cml4LmRlY29tcG9zZSh2LnBvc2l0aW9uLAp2LnF1YXRlcm5pb24sdi5zY2FsZSkpOih2b2lkIDAhPT1hLnBvc2l0aW9uJiZ2LnBvc2l0aW9uLmZyb21BcnJheShhLnBvc2l0aW9uKSx2b2lkIDAhPT1hLnJvdGF0aW9uJiZ2LnJvdGF0aW9uLmZyb21BcnJheShhLnJvdGF0aW9uKSx2b2lkIDAhPT1hLnF1YXRlcm5pb24mJnYucXVhdGVybmlvbi5mcm9tQXJyYXkoYS5xdWF0ZXJuaW9uKSx2b2lkIDAhPT1hLnNjYWxlJiZ2LnNjYWxlLmZyb21BcnJheShhLnNjYWxlKSk7dm9pZCAwIT09YS5jYXN0U2hhZG93JiYodi5jYXN0U2hhZG93PWEuY2FzdFNoYWRvdyk7dm9pZCAwIT09YS5yZWNlaXZlU2hhZG93JiYodi5yZWNlaXZlU2hhZG93PWEucmVjZWl2ZVNoYWRvdyk7YS5zaGFkb3cmJih2b2lkIDAhPT1hLnNoYWRvdy5iaWFzJiYodi5zaGFkb3cuYmlhcz1hLnNoYWRvdy5iaWFzKSx2b2lkIDAhPT1hLnNoYWRvdy5yYWRpdXMmJih2LnNoYWRvdy5yYWRpdXM9YS5zaGFkb3cucmFkaXVzKSx2b2lkIDAhPT1hLnNoYWRvdy5tYXBTaXplJiYKdi5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkoYS5zaGFkb3cubWFwU2l6ZSksdm9pZCAwIT09YS5zaGFkb3cuY2FtZXJhJiYodi5zaGFkb3cuY2FtZXJhPXRoaXMucGFyc2VPYmplY3QoYS5zaGFkb3cuY2FtZXJhKSkpO3ZvaWQgMCE9PWEudmlzaWJsZSYmKHYudmlzaWJsZT1hLnZpc2libGUpO3ZvaWQgMCE9PWEuZnJ1c3R1bUN1bGxlZCYmKHYuZnJ1c3R1bUN1bGxlZD1hLmZydXN0dW1DdWxsZWQpO3ZvaWQgMCE9PWEucmVuZGVyT3JkZXImJih2LnJlbmRlck9yZGVyPWEucmVuZGVyT3JkZXIpO3ZvaWQgMCE9PWEudXNlckRhdGEmJih2LnVzZXJEYXRhPWEudXNlckRhdGEpO3ZvaWQgMCE9PWEubGF5ZXJzJiYodi5sYXllcnMubWFzaz1hLmxheWVycyk7aWYodm9pZCAwIT09YS5jaGlsZHJlbil7ej1hLmNoaWxkcmVuO2Zvcih2YXIgRT0wO0U8ei5sZW5ndGg7RSsrKXYuYWRkKHRoaXMucGFyc2VPYmplY3QoeltFXSxjLGUpKX1pZigiTE9EIj09PWEudHlwZSlmb3IoYT1hLmxldmVscyx6PQowO3o8YS5sZW5ndGg7eisrKXtFPWFbel07dmFyIEc9di5nZXRPYmplY3RCeVByb3BlcnR5KCJ1dWlkIixFLm9iamVjdCk7dm9pZCAwIT09RyYmdi5hZGRMZXZlbChHLEUuZGlzdGFuY2UpfXJldHVybiB2fX0pO3ZhciBMbT17VVZNYXBwaW5nOjMwMCxDdWJlUmVmbGVjdGlvbk1hcHBpbmc6MzAxLEN1YmVSZWZyYWN0aW9uTWFwcGluZzozMDIsRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6MzAzLEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOjMwNCxTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzozMDUsQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6MzA2LEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOjMwN30sc2s9e1JlcGVhdFdyYXBwaW5nOjFFMyxDbGFtcFRvRWRnZVdyYXBwaW5nOjEwMDEsTWlycm9yZWRSZXBlYXRXcmFwcGluZzoxMDAyfSx0az17TmVhcmVzdEZpbHRlcjoxMDAzLE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOjEwMDQsTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjoxMDA1LApMaW5lYXJGaWx0ZXI6MTAwNixMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyOjEwMDcsTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOjEwMDh9O2VpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6ZWksc2V0T3B0aW9uczpmdW5jdGlvbihhKXt0aGlzLm9wdGlvbnM9YTtyZXR1cm4gdGhpc30sbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2b2lkIDA9PT1hJiYoYT0iIik7dm9pZCAwIT09dGhpcy5wYXRoJiYoYT10aGlzLnBhdGgrYSk7YT10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChhKTt2YXIgcj10aGlzLHY9aWUuZ2V0KGEpO2lmKHZvaWQgMCE9PXYpcmV0dXJuIHIubWFuYWdlci5pdGVtU3RhcnQoYSksc2V0VGltZW91dChmdW5jdGlvbigpe2MmJmModik7ci5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApLHY7ZmV0Y2goYSkudGhlbihmdW5jdGlvbih6KXtyZXR1cm4gei5ibG9iKCl9KS50aGVuKGZ1bmN0aW9uKHope3JldHVybiB2b2lkIDA9PT0Kci5vcHRpb25zP2NyZWF0ZUltYWdlQml0bWFwKHopOmNyZWF0ZUltYWdlQml0bWFwKHosci5vcHRpb25zKX0pLnRoZW4oZnVuY3Rpb24oeil7aWUuYWRkKGEseik7YyYmYyh6KTtyLm1hbmFnZXIuaXRlbUVuZChhKX0pLmNhdGNoKGZ1bmN0aW9uKHope2cmJmcoeik7ci5tYW5hZ2VyLml0ZW1FcnJvcihhKTtyLm1hbmFnZXIuaXRlbUVuZChhKX0pO3IubWFuYWdlci5pdGVtU3RhcnQoYSl9fSk7T2JqZWN0LmFzc2lnbihmaS5wcm90b3R5cGUse21vdmVUbzpmdW5jdGlvbihhLGMpe3RoaXMuY3VycmVudFBhdGg9bmV3IEdjO3RoaXMuc3ViUGF0aHMucHVzaCh0aGlzLmN1cnJlbnRQYXRoKTt0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyhhLGMpfSxsaW5lVG86ZnVuY3Rpb24oYSxjKXt0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyhhLGMpfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKGEsYyxlLGcpe3RoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyhhLGMsZSxnKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbihhLApjLGUsZyxyLHYpe3RoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyhhLGMsZSxnLHIsdil9LHNwbGluZVRocnU6ZnVuY3Rpb24oYSl7dGhpcy5jdXJyZW50UGF0aC5zcGxpbmVUaHJ1KGEpfSx0b1NoYXBlczpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoZmEpe2Zvcih2YXIgcmE9W10scGE9MCxxYT1mYS5sZW5ndGg7cGE8cWE7cGErKyl7dmFyIHVhPWZhW3BhXSxvYT1uZXcgQ2Q7b2EuY3VydmVzPXVhLmN1cnZlcztyYS5wdXNoKG9hKX1yZXR1cm4gcmF9ZnVuY3Rpb24gZyhmYSxyYSl7Zm9yKHZhciBwYT1yYS5sZW5ndGgscWE9ITEsdWE9cGEtMSxvYT0wO29hPHBhO3VhPW9hKyspe3ZhciB0YT1yYVt1YV0sQmE9cmFbb2FdLFRhPUJhLngtdGEueCxVYT1CYS55LXRhLnk7aWYoTWF0aC5hYnMoVWEpPk51bWJlci5FUFNJTE9OKXtpZigwPlVhJiYodGE9cmFbb2FdLFRhPS1UYSxCYT1yYVt1YV0sVWE9LVVhKSwhKGZhLnk8dGEueXx8ZmEueT5CYS55KSlpZihmYS55PT09dGEueSl7aWYoZmEueD09PQp0YS54KXJldHVybiEwfWVsc2V7dWE9VWEqKGZhLngtdGEueCktVGEqKGZhLnktdGEueSk7aWYoMD09PXVhKXJldHVybiEwOzA+dWF8fChxYT0hcWEpfX1lbHNlIGlmKGZhLnk9PT10YS55JiYoQmEueDw9ZmEueCYmZmEueDw9dGEueHx8dGEueDw9ZmEueCYmZmEueDw9QmEueCkpcmV0dXJuITB9cmV0dXJuIHFhfXZhciByPWVkLmlzQ2xvY2tXaXNlLHY9dGhpcy5zdWJQYXRocztpZigwPT09di5sZW5ndGgpcmV0dXJuW107aWYoITA9PT1jKXJldHVybiBlKHYpO2M9W107aWYoMT09PXYubGVuZ3RoKXt2YXIgej12WzBdO3ZhciBFPW5ldyBDZDtFLmN1cnZlcz16LmN1cnZlcztjLnB1c2goRSk7cmV0dXJuIGN9dmFyIEc9IXIodlswXS5nZXRQb2ludHMoKSk7Rz1hPyFHOkc7RT1bXTt2YXIgSj1bXSxQPVtdLFI9MDtKW1JdPXZvaWQgMDtQW1JdPVtdO2Zvcih2YXIgUz0wLFY9di5sZW5ndGg7UzxWO1MrKyl7ej12W1NdO3ZhciBXPXouZ2V0UG9pbnRzKCk7dmFyIGhhPXIoVyk7KGhhPWE/IWhhOgpoYSk/KCFHJiZKW1JdJiZSKyssSltSXT17czpuZXcgQ2QscDpXfSxKW1JdLnMuY3VydmVzPXouY3VydmVzLEcmJlIrKyxQW1JdPVtdKTpQW1JdLnB1c2goe2g6eixwOldbMF19KX1pZighSlswXSlyZXR1cm4gZSh2KTtpZigxPEoubGVuZ3RoKXtTPSExO2E9W107cj0wO2Zvcih2PUoubGVuZ3RoO3I8djtyKyspRVtyXT1bXTtyPTA7Zm9yKHY9Si5sZW5ndGg7cjx2O3IrKylmb3Ioej1QW3JdLGhhPTA7aGE8ei5sZW5ndGg7aGErKyl7Rz16W2hhXTtSPSEwO2ZvcihXPTA7VzxKLmxlbmd0aDtXKyspZyhHLnAsSltXXS5wKSYmKHIhPT1XJiZhLnB1c2goe2Zyb21zOnIsdG9zOlcsaG9sZTpoYX0pLFI/KFI9ITEsRVtXXS5wdXNoKEcpKTpTPSEwKTtSJiZFW3JdLnB1c2goRyl9MDxhLmxlbmd0aCYmKFN8fChQPUUpKX1TPTA7Zm9yKHI9Si5sZW5ndGg7UzxyO1MrKylmb3IoRT1KW1NdLnMsYy5wdXNoKEUpLGE9UFtTXSx2PTAsej1hLmxlbmd0aDt2PHo7disrKUUuaG9sZXMucHVzaChhW3ZdLmgpOwpyZXR1cm4gY319KTtPYmplY3QuYXNzaWduKGdpLnByb3RvdHlwZSx7aXNGb250OiEwLGdlbmVyYXRlU2hhcGVzOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MTAwKTt2YXIgZT1bXTthPXZtKGEsYyx0aGlzLmRhdGEpO2M9MDtmb3IodmFyIGc9YS5sZW5ndGg7YzxnO2MrKylBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShlLGFbY10udG9TaGFwZXMoKSk7cmV0dXJuIGV9fSk7aGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpoaSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj1uZXcgdWModGhpcy5tYW5hZ2VyKTt2LnNldFBhdGgodGhpcy5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXt0cnl7dmFyIEU9SlNPTi5wYXJzZSh6KX1jYXRjaChHKXtjb25zb2xlLndhcm4oIlRIUkVFLkZvbnRMb2FkZXI6IHR5cGVmYWNlLmpzIHN1cHBvcnQgaXMgYmVpbmcgZGVwcmVjYXRlZC4gVXNlIHR5cGVmYWNlLmpzb24gaW5zdGVhZC4iKSwKRT1KU09OLnBhcnNlKHouc3Vic3RyaW5nKDY1LHoubGVuZ3RoLTIpKX16PXIucGFyc2UoRSk7YyYmYyh6KX0sZSxnKX0scGFyc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBnaShhKX19KTt2YXIgeWgsbWk9e2dldENvbnRleHQ6ZnVuY3Rpb24oKXt2b2lkIDA9PT15aCYmKHloPW5ldyAod2luZG93LkF1ZGlvQ29udGV4dHx8d2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCkpO3JldHVybiB5aH0sc2V0Q29udGV4dDpmdW5jdGlvbihhKXt5aD1hfX07JGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjokZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPW5ldyB1Yyh0aGlzLm1hbmFnZXIpO3Iuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpO3Iuc2V0UGF0aCh0aGlzLnBhdGgpO3IubG9hZChhLGZ1bmN0aW9uKHYpe3Y9di5zbGljZSgwKTttaS5nZXRDb250ZXh0KCkuZGVjb2RlQXVkaW9EYXRhKHYsZnVuY3Rpb24oeil7Yyh6KX0pfSwKZSxnKX19KTtPYmplY3QuYXNzaWduKGFoLnByb3RvdHlwZSx7aXNTcGhlcmljYWxIYXJtb25pY3MzOiEwLHNldDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuY29lZmZpY2llbnRzW2NdLmNvcHkoYVtjXSk7cmV0dXJuIHRoaXN9LHplcm86ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDs5PmE7YSsrKXRoaXMuY29lZmZpY2llbnRzW2FdLnNldCgwLDAsMCk7cmV0dXJuIHRoaXN9LGdldEF0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS54LGc9YS55O2E9YS56O3ZhciByPXRoaXMuY29lZmZpY2llbnRzO2MuY29weShyWzBdKS5tdWx0aXBseVNjYWxhciguMjgyMDk1KTtjLmFkZFNjYWxlKHJbMV0sLjQ4ODYwMypnKTtjLmFkZFNjYWxlKHJbMl0sLjQ4ODYwMyphKTtjLmFkZFNjYWxlKHJbM10sLjQ4ODYwMyplKTtjLmFkZFNjYWxlKHJbNF0sMS4wOTI1NDgqZSpnKTtjLmFkZFNjYWxlKHJbNV0sMS4wOTI1NDgqZyphKTtjLmFkZFNjYWxlKHJbNl0sLjMxNTM5MiooMyphKmEtMSkpOwpjLmFkZFNjYWxlKHJbN10sMS4wOTI1NDgqZSphKTtjLmFkZFNjYWxlKHJbOF0sLjU0NjI3NCooZSplLWcqZykpO3JldHVybiBjfSxnZXRJcnJhZGlhbmNlQXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLngsZz1hLnk7YT1hLno7dmFyIHI9dGhpcy5jb2VmZmljaWVudHM7Yy5jb3B5KHJbMF0pLm11bHRpcGx5U2NhbGFyKC44ODYyMjcpO2MuYWRkU2NhbGUoclsxXSwxLjAyMzMyOCpnKTtjLmFkZFNjYWxlKHJbMl0sMS4wMjMzMjgqYSk7Yy5hZGRTY2FsZShyWzNdLDEuMDIzMzI4KmUpO2MuYWRkU2NhbGUocls0XSwuODU4MDg2KmUqZyk7Yy5hZGRTY2FsZShyWzVdLC44NTgwODYqZyphKTtjLmFkZFNjYWxlKHJbNl0sLjc0MzEyNSphKmEtLjI0NzcwOCk7Yy5hZGRTY2FsZShyWzddLC44NTgwODYqZSphKTtjLmFkZFNjYWxlKHJbOF0sLjQyOTA0MyooZSplLWcqZykpO3JldHVybiBjfSxhZGQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7OT5jO2MrKyl0aGlzLmNvZWZmaWNpZW50c1tjXS5hZGQoYS5jb2VmZmljaWVudHNbY10pOwpyZXR1cm4gdGhpc30sc2NhbGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7OT5jO2MrKyl0aGlzLmNvZWZmaWNpZW50c1tjXS5tdWx0aXBseVNjYWxhcihhKTtyZXR1cm4gdGhpc30sbGVycDpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT0wOzk+ZTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0ubGVycChhLmNvZWZmaWNpZW50c1tlXSxjKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzk+YztjKyspaWYoIXRoaXMuY29lZmZpY2llbnRzW2NdLmVxdWFscyhhLmNvZWZmaWNpZW50c1tjXSkpcmV0dXJuITE7cmV0dXJuITB9LGNvcHk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0KGEuY29lZmZpY2llbnRzKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO2Zvcih2YXIgZT10aGlzLmNvZWZmaWNpZW50cyxnPTA7OT5nO2crKyllW2ddLmZyb21BcnJheShhLApjKzMqZyk7cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPXRoaXMuY29lZmZpY2llbnRzLGc9MDs5Pmc7ZysrKWVbZ10udG9BcnJheShhLGMrMypnKTtyZXR1cm4gYX19KTtPYmplY3QuYXNzaWduKGFoLHtnZXRCYXNpc0F0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS54LGc9YS55O2E9YS56O2NbMF09LjI4MjA5NTtjWzFdPS40ODg2MDMqZztjWzJdPS40ODg2MDMqYTtjWzNdPS40ODg2MDMqZTtjWzRdPTEuMDkyNTQ4KmUqZztjWzVdPTEuMDkyNTQ4KmcqYTtjWzZdPS4zMTUzOTIqKDMqYSphLTEpO2NbN109MS4wOTI1NDgqZSphO2NbOF09LjU0NjI3NCooZSplLWcqZyl9fSk7SGMucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShKYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpIYyxpc0xpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihhKXtKYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmEpO3RoaXMuc2guY29weShhLnNoKTt0aGlzLmludGVuc2l0eT1hLmludGVuc2l0eTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGEpe3JldHVybiBKYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKX19KTtpaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEhjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmlpLGlzSGVtaXNwaGVyZUxpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihhKXtIYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXtyZXR1cm4gSGMucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSl9fSk7amkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShIYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpqaSxpc0FtYmllbnRMaWdodFByb2JlOiEwLGNvcHk6ZnVuY3Rpb24oYSl7SGMucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7cmV0dXJuIEhjLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLAphKX19KTt2YXIgdWs9bmV3IHEsdms9bmV3IHE7T2JqZWN0LmFzc2lnbihRai5wcm90b3R5cGUse3VwZGF0ZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9jYWNoZTtpZihjLmZvY3VzIT09YS5mb2N1c3x8Yy5mb3YhPT1hLmZvdnx8Yy5hc3BlY3QhPT1hLmFzcGVjdCp0aGlzLmFzcGVjdHx8Yy5uZWFyIT09YS5uZWFyfHxjLmZhciE9PWEuZmFyfHxjLnpvb20hPT1hLnpvb218fGMuZXllU2VwIT09dGhpcy5leWVTZXApe2MuZm9jdXM9YS5mb2N1cztjLmZvdj1hLmZvdjtjLmFzcGVjdD1hLmFzcGVjdCp0aGlzLmFzcGVjdDtjLm5lYXI9YS5uZWFyO2MuZmFyPWEuZmFyO2Muem9vbT1hLnpvb207Yy5leWVTZXA9dGhpcy5leWVTZXA7dmFyIGU9YS5wcm9qZWN0aW9uTWF0cml4LmNsb25lKCksZz1jLmV5ZVNlcC8yLHI9ZypjLm5lYXIvYy5mb2N1cyx2PWMubmVhcipNYXRoLnRhbihoYi5ERUcyUkFEKmMuZm92Ki41KS9jLnpvb207dmsuZWxlbWVudHNbMTJdPS1nO3VrLmVsZW1lbnRzWzEyXT0KZztnPS12KmMuYXNwZWN0K3I7dmFyIHo9dipjLmFzcGVjdCtyO2UuZWxlbWVudHNbMF09MipjLm5lYXIvKHotZyk7ZS5lbGVtZW50c1s4XT0oeitnKS8oei1nKTt0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KGUpO2c9LXYqYy5hc3BlY3Qtcjt6PXYqYy5hc3BlY3QtcjtlLmVsZW1lbnRzWzBdPTIqYy5uZWFyLyh6LWcpO2UuZWxlbWVudHNbOF09KHorZykvKHotZyk7dGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weShlKX10aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weShhLm1hdHJpeFdvcmxkKS5tdWx0aXBseSh2ayk7dGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkoYS5tYXRyaXhXb3JsZCkubXVsdGlwbHkodWspfX0pO09iamVjdC5hc3NpZ24oa2kucHJvdG90eXBlLHtzdGFydDpmdW5jdGlvbigpe3RoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZT0oInVuZGVmaW5lZCI9PT10eXBlb2YgcGVyZm9ybWFuY2U/RGF0ZTpwZXJmb3JtYW5jZSkubm93KCk7CnRoaXMuZWxhcHNlZFRpbWU9MDt0aGlzLnJ1bm5pbmc9ITB9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmdldEVsYXBzZWRUaW1lKCk7dGhpcy5hdXRvU3RhcnQ9dGhpcy5ydW5uaW5nPSExfSxnZXRFbGFwc2VkVGltZTpmdW5jdGlvbigpe3RoaXMuZ2V0RGVsdGEoKTtyZXR1cm4gdGhpcy5lbGFwc2VkVGltZX0sZ2V0RGVsdGE6ZnVuY3Rpb24oKXt2YXIgYT0wO2lmKHRoaXMuYXV0b1N0YXJ0JiYhdGhpcy5ydW5uaW5nKXJldHVybiB0aGlzLnN0YXJ0KCksMDtpZih0aGlzLnJ1bm5pbmcpe3ZhciBjPSgidW5kZWZpbmVkIj09PXR5cGVvZiBwZXJmb3JtYW5jZT9EYXRlOnBlcmZvcm1hbmNlKS5ub3coKTthPShjLXRoaXMub2xkVGltZSkvMUUzO3RoaXMub2xkVGltZT1jO3RoaXMuZWxhcHNlZFRpbWUrPWF9cmV0dXJuIGF9fSk7dmFyIGplPW5ldyBrLHdrPW5ldyBoLE1tPW5ldyBrLGtlPW5ldyBrO2xpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6bGksZ2V0SW5wdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWlufSxyZW1vdmVGaWx0ZXI6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5maWx0ZXImJih0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5maWx0ZXI9bnVsbCk7cmV0dXJuIHRoaXN9LGdldEZpbHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcn0sc2V0RmlsdGVyOmZ1bmN0aW9uKGEpe251bGwhPT10aGlzLmZpbHRlcj8odGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSk6dGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTt0aGlzLmZpbHRlcj1hO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuZmlsdGVyKTsKdGhpcy5maWx0ZXIuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO3JldHVybiB0aGlzfSxnZXRNYXN0ZXJWb2x1bWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWV9LHNldE1hc3RlclZvbHVtZTpmdW5jdGlvbihhKXt0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoYSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKTtyZXR1cm4gdGhpc30sdXBkYXRlTWF0cml4V29ybGQ6ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGEpO2E9dGhpcy5jb250ZXh0Lmxpc3RlbmVyO3ZhciBjPXRoaXMudXA7dGhpcy50aW1lRGVsdGE9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKTt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShqZSx3ayxNbSk7a2Uuc2V0KDAsMCwtMSkuYXBwbHlRdWF0ZXJuaW9uKHdrKTtpZihhLnBvc2l0aW9uWCl7dmFyIGU9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMudGltZURlbHRhOwphLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShqZS54LGUpO2EucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGplLnksZSk7YS5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoamUueixlKTthLmZvcndhcmRYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGtlLngsZSk7YS5mb3J3YXJkWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShrZS55LGUpO2EuZm9yd2FyZFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoa2UueixlKTthLnVwWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShjLngsZSk7YS51cFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoYy55LGUpO2EudXBaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGMueixlKX1lbHNlIGEuc2V0UG9zaXRpb24oamUueCxqZS55LGplLnopLGEuc2V0T3JpZW50YXRpb24oa2UueCxrZS55LGtlLnosYy54LGMueSxjLnopfX0pO1dlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6V2UsZ2V0T3V0cHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2Fpbn0sc2V0Tm9kZVNvdXJjZTpmdW5jdGlvbihhKXt0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMTt0aGlzLnNvdXJjZVR5cGU9ImF1ZGlvTm9kZSI7dGhpcy5zb3VyY2U9YTt0aGlzLmNvbm5lY3QoKTtyZXR1cm4gdGhpc30sc2V0TWVkaWFFbGVtZW50U291cmNlOmZ1bmN0aW9uKGEpe3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSExO3RoaXMuc291cmNlVHlwZT0ibWVkaWFOb2RlIjt0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKGEpO3RoaXMuY29ubmVjdCgpO3JldHVybiB0aGlzfSxzZXRCdWZmZXI6ZnVuY3Rpb24oYSl7dGhpcy5idWZmZXI9YTt0aGlzLnNvdXJjZVR5cGU9ImJ1ZmZlciI7dGhpcy5hdXRvcGxheSYmdGhpcy5wbGF5KCk7cmV0dXJuIHRoaXN9LHBsYXk6ZnVuY3Rpb24oKXtpZighMD09PXRoaXMuaXNQbGF5aW5nKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4iKTsKZWxzZSBpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7ZWxzZXt2YXIgYT10aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7YS5idWZmZXI9dGhpcy5idWZmZXI7YS5sb29wPXRoaXMubG9vcDthLm9uZW5kZWQ9dGhpcy5vbkVuZGVkLmJpbmQodGhpcyk7dGhpcy5zdGFydFRpbWU9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO2Euc3RhcnQodGhpcy5zdGFydFRpbWUsdGhpcy5vZmZzZXQsdGhpcy5kdXJhdGlvbik7dGhpcy5pc1BsYXlpbmc9ITA7dGhpcy5zb3VyY2U9YTt0aGlzLnNldERldHVuZSh0aGlzLmRldHVuZSk7dGhpcy5zZXRQbGF5YmFja1JhdGUodGhpcy5wbGF5YmFja1JhdGUpO3JldHVybiB0aGlzLmNvbm5lY3QoKX19LHBhdXNlOmZ1bmN0aW9uKCl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwplbHNlIHJldHVybiEwPT09dGhpcy5pc1BsYXlpbmcmJih0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMub2Zmc2V0Kz0odGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLXRoaXMuc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSx0aGlzLmlzUGxheWluZz0hMSksdGhpc30sc3RvcDpmdW5jdGlvbigpe2lmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtlbHNlIHJldHVybiB0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMub2Zmc2V0PTAsdGhpcy5pc1BsYXlpbmc9ITEsdGhpc30sY29ubmVjdDpmdW5jdGlvbigpe2lmKDA8dGhpcy5maWx0ZXJzLmxlbmd0aCl7dGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2Zvcih2YXIgYT0xLGM9dGhpcy5maWx0ZXJzLmxlbmd0aDthPGM7YSsrKXRoaXMuZmlsdGVyc1thLQoxXS5jb25uZWN0KHRoaXMuZmlsdGVyc1thXSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmNvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXN9LGRpc2Nvbm5lY3Q6ZnVuY3Rpb24oKXtpZigwPHRoaXMuZmlsdGVycy5sZW5ndGgpe3RoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzWzBdKTtmb3IodmFyIGE9MSxjPXRoaXMuZmlsdGVycy5sZW5ndGg7YTxjO2ErKyl0aGlzLmZpbHRlcnNbYS0xXS5kaXNjb25uZWN0KHRoaXMuZmlsdGVyc1thXSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXN9LGdldEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXJzfSxzZXRGaWx0ZXJzOmZ1bmN0aW9uKGEpe2F8fAooYT1bXSk7ITA9PT10aGlzLmlzUGxheWluZz8odGhpcy5kaXNjb25uZWN0KCksdGhpcy5maWx0ZXJzPWEsdGhpcy5jb25uZWN0KCkpOnRoaXMuZmlsdGVycz1hO3JldHVybiB0aGlzfSxzZXREZXR1bmU6ZnVuY3Rpb24oYSl7dGhpcy5kZXR1bmU9YTtpZih2b2lkIDAhPT10aGlzLnNvdXJjZS5kZXR1bmUpcmV0dXJuITA9PT10aGlzLmlzUGxheWluZyYmdGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSh0aGlzLmRldHVuZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfSxnZXREZXR1bmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXR1bmV9LGdldEZpbHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZpbHRlcnMoKVswXX0sc2V0RmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZpbHRlcnMoYT9bYV06W10pfSxzZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oYSl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwplbHNlIHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZT1hLCEwPT09dGhpcy5pc1BsYXlpbmcmJnRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRUYXJnZXRBdFRpbWUodGhpcy5wbGF5YmFja1JhdGUsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSksdGhpc30sZ2V0UGxheWJhY2tSYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlfSxvbkVuZGVkOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITF9LGdldExvb3A6ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sPyhjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpLCExKTp0aGlzLmxvb3B9LHNldExvb3A6ZnVuY3Rpb24oYSl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2UgcmV0dXJuIHRoaXMubG9vcD0KYSwhMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5zb3VyY2UubG9vcD10aGlzLmxvb3ApLHRoaXN9LGdldFZvbHVtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX0sc2V0Vm9sdW1lOmZ1bmN0aW9uKGEpe3RoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZShhLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpO3JldHVybiB0aGlzfX0pO3ZhciBsZT1uZXcgayx4az1uZXcgaCxObT1uZXcgayxtZT1uZXcgaztuaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFdlLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm5pLGdldE91dHB1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lcn0sZ2V0UmVmRGlzdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2V9LHNldFJlZkRpc3RhbmNlOmZ1bmN0aW9uKGEpe3RoaXMucGFubmVyLnJlZkRpc3RhbmNlPWE7cmV0dXJuIHRoaXN9LGdldFJvbGxvZmZGYWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3Rvcn0sCnNldFJvbGxvZmZGYWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIucm9sbG9mZkZhY3Rvcj1hO3JldHVybiB0aGlzfSxnZXREaXN0YW5jZU1vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWx9LHNldERpc3RhbmNlTW9kZWw6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbD1hO3JldHVybiB0aGlzfSxnZXRNYXhEaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZX0sc2V0TWF4RGlzdGFuY2U6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIubWF4RGlzdGFuY2U9YTtyZXR1cm4gdGhpc30sc2V0RGlyZWN0aW9uYWxDb25lOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnBhbm5lci5jb25lSW5uZXJBbmdsZT1hO3RoaXMucGFubmVyLmNvbmVPdXRlckFuZ2xlPWM7dGhpcy5wYW5uZXIuY29uZU91dGVyR2Fpbj1lO3JldHVybiB0aGlzfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsCmEpO2lmKCEwIT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2x8fCExIT09dGhpcy5pc1BsYXlpbmcpaWYodGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UobGUseGssTm0pLG1lLnNldCgwLDAsMSkuYXBwbHlRdWF0ZXJuaW9uKHhrKSxhPXRoaXMucGFubmVyLGEucG9zaXRpb25YKXt2YXIgYz10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7YS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobGUueCxjKTthLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShsZS55LGMpO2EucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGxlLnosYyk7YS5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobWUueCxjKTthLm9yaWVudGF0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShtZS55LGMpO2Eub3JpZW50YXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG1lLnosYyl9ZWxzZSBhLnNldFBvc2l0aW9uKGxlLngsCmxlLnksbGUueiksYS5zZXRPcmllbnRhdGlvbihtZS54LG1lLnksbWUueil9fSk7T2JqZWN0LmFzc2lnbihvaS5wcm90b3R5cGUse2dldEZyZXF1ZW5jeURhdGE6ZnVuY3Rpb24oKXt0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKHRoaXMuZGF0YSk7cmV0dXJuIHRoaXMuZGF0YX0sZ2V0QXZlcmFnZUZyZXF1ZW5jeTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9dGhpcy5nZXRGcmVxdWVuY3lEYXRhKCksZT0wO2U8Yy5sZW5ndGg7ZSsrKWErPWNbZV07cmV0dXJuIGEvYy5sZW5ndGh9fSk7T2JqZWN0LmFzc2lnbihwaS5wcm90b3R5cGUse2FjY3VtdWxhdGU6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmJ1ZmZlcixnPXRoaXMudmFsdWVTaXplO2E9YSpnK2c7dmFyIHI9dGhpcy5jdW11bGF0aXZlV2VpZ2h0O2lmKDA9PT1yKXtmb3Iocj0wO3IhPT1nOysrcillW2Ercl09ZVtyXTtyPWN9ZWxzZSByKz1jLHRoaXMuX21peEJ1ZmZlclJlZ2lvbihlLGEsMCxjL3IsZyk7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PQpyfSxhcHBseTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZhbHVlU2l6ZSxlPXRoaXMuYnVmZmVyO2E9YSpjK2M7dmFyIGc9dGhpcy5jdW11bGF0aXZlV2VpZ2h0LHI9dGhpcy5iaW5kaW5nO3RoaXMuY3VtdWxhdGl2ZVdlaWdodD0wOzE+ZyYmdGhpcy5fbWl4QnVmZmVyUmVnaW9uKGUsYSwzKmMsMS1nLGMpO2c9Yztmb3IodmFyIHY9YytjO2chPT12OysrZylpZihlW2ddIT09ZVtnK2NdKXtyLnNldFZhbHVlKGUsYSk7YnJlYWt9fSxzYXZlT3JpZ2luYWxTdGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYnVmZmVyLGM9dGhpcy52YWx1ZVNpemUsZT0zKmM7dGhpcy5iaW5kaW5nLmdldFZhbHVlKGEsZSk7Zm9yKHZhciBnPWM7ZyE9PWU7KytnKWFbZ109YVtlK2clY107dGhpcy5jdW11bGF0aXZlV2VpZ2h0PTB9LHJlc3RvcmVPcmlnaW5hbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLDMqdGhpcy52YWx1ZVNpemUpfSxfc2VsZWN0OmZ1bmN0aW9uKGEsCmMsZSxnLHIpe2lmKC41PD1nKWZvcihnPTA7ZyE9PXI7KytnKWFbYytnXT1hW2UrZ119LF9zbGVycDpmdW5jdGlvbihhLGMsZSxnKXtoLnNsZXJwRmxhdChhLGMsYSxjLGEsZSxnKX0sX2xlcnA6ZnVuY3Rpb24oYSxjLGUsZyxyKXtmb3IodmFyIHY9MS1nLHo9MDt6IT09cjsrK3ope3ZhciBFPWMrejthW0VdPWFbRV0qdithW2Urel0qZ319fSk7dmFyIE9tPS9bXFtcXVwuOlwvXS9nLFBtPSJbXiIrIlxcW1xcXVxcLjpcXC8iLnJlcGxhY2UoIlxcLiIsIiIpKyJdIixRbT0vKCg/OldDK1tcLzpdKSopLy5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksUm09LyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSgiV0NPRCIsUG0pLFNtPS8oPzpcLihXQyspKD86XFsoLispXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksVG09L1wuKFdDKykoPzpcWyguKylcXSk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksVW09Cm5ldyBSZWdFeHAoIl4iK1FtK1JtK1NtK1RtKyIkIiksVm09WyJtYXRlcmlhbCIsIm1hdGVyaWFscyIsImJvbmVzIl07T2JqZWN0LmFzc2lnbihSai5wcm90b3R5cGUse2dldFZhbHVlOmZ1bmN0aW9uKGEsYyl7dGhpcy5iaW5kKCk7dmFyIGU9dGhpcy5fYmluZGluZ3NbdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfXTt2b2lkIDAhPT1lJiZlLmdldFZhbHVlKGEsYyl9LHNldFZhbHVlOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPXRoaXMuX2JpbmRpbmdzLGc9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLHI9ZS5sZW5ndGg7ZyE9PXI7KytnKWVbZ10uc2V0VmFsdWUoYSxjKX0sYmluZDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9iaW5kaW5ncyxjPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxlPWEubGVuZ3RoO2MhPT1lOysrYylhW2NdLmJpbmQoKX0sdW5iaW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX2JpbmRpbmdzLGM9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLAplPWEubGVuZ3RoO2MhPT1lOysrYylhW2NdLnVuYmluZCgpfX0pO09iamVjdC5hc3NpZ24oJGIse0NvbXBvc2l0ZTpSaixjcmVhdGU6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiBhJiZhLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA/bmV3ICRiLkNvbXBvc2l0ZShhLGMsZSk6bmV3ICRiKGEsYyxlKX0sc2FuaXRpemVOb2RlTmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZShPbSwiIil9LHBhcnNlVHJhY2tOYW1lOmZ1bmN0aW9uKGEpe3ZhciBjPVVtLmV4ZWMoYSk7aWYoIWMpdGhyb3cgRXJyb3IoIlByb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogIithKTtjPXtub2RlTmFtZTpjWzJdLG9iamVjdE5hbWU6Y1szXSxvYmplY3RJbmRleDpjWzRdLHByb3BlcnR5TmFtZTpjWzVdLHByb3BlcnR5SW5kZXg6Y1s2XX07dmFyIGU9Yy5ub2RlTmFtZSYmYy5ub2RlTmFtZS5sYXN0SW5kZXhPZigiLiIpO2lmKHZvaWQgMCE9PWUmJi0xIT09CmUpe3ZhciBnPWMubm9kZU5hbWUuc3Vic3RyaW5nKGUrMSk7LTEhPT1WbS5pbmRleE9mKGcpJiYoYy5ub2RlTmFtZT1jLm5vZGVOYW1lLnN1YnN0cmluZygwLGUpLGMub2JqZWN0TmFtZT1nKX1pZihudWxsPT09Yy5wcm9wZXJ0eU5hbWV8fDA9PT1jLnByb3BlcnR5TmFtZS5sZW5ndGgpdGhyb3cgRXJyb3IoIlByb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICIrYSk7cmV0dXJuIGN9LGZpbmROb2RlOmZ1bmN0aW9uKGEsYyl7aWYoIWN8fCIiPT09Y3x8InJvb3QiPT09Y3x8Ii4iPT09Y3x8LTE9PT1jfHxjPT09YS5uYW1lfHxjPT09YS51dWlkKXJldHVybiBhO2lmKGEuc2tlbGV0b24pe3ZhciBlPWEuc2tlbGV0b24uZ2V0Qm9uZUJ5TmFtZShjKTtpZih2b2lkIDAhPT1lKXJldHVybiBlfWlmKGEuY2hpbGRyZW4pe3ZhciBnPWZ1bmN0aW9uKHIpe2Zvcih2YXIgdj0wO3Y8ci5sZW5ndGg7disrKXt2YXIgej1yW3ZdO2lmKHoubmFtZT09PQpjfHx6LnV1aWQ9PT1jKXJldHVybiB6O2lmKHo9Zyh6LmNoaWxkcmVuKSlyZXR1cm4gen1yZXR1cm4gbnVsbH07aWYoYT1nKGEuY2hpbGRyZW4pKXJldHVybiBhfXJldHVybiBudWxsfX0pO09iamVjdC5hc3NpZ24oJGIucHJvdG90eXBlLHtfZ2V0VmFsdWVfdW5hdmFpbGFibGU6ZnVuY3Rpb24oKXt9LF9zZXRWYWx1ZV91bmF2YWlsYWJsZTpmdW5jdGlvbigpe30sQmluZGluZ1R5cGU6e0RpcmVjdDowLEVudGlyZUFycmF5OjEsQXJyYXlFbGVtZW50OjIsSGFzRnJvbVRvQXJyYXk6M30sVmVyc2lvbmluZzp7Tm9uZTowLE5lZWRzVXBkYXRlOjEsTWF0cml4V29ybGROZWVkc1VwZGF0ZToyfSxHZXR0ZXJCeUJpbmRpbmdUeXBlOltmdW5jdGlvbihhLGMpe2FbY109dGhpcy5ub2RlW3RoaXMucHJvcGVydHlOYW1lXX0sZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LGc9MCxyPWUubGVuZ3RoO2chPT1yOysrZylhW2MrK109ZVtnXX0sZnVuY3Rpb24oYSxjKXthW2NdPQp0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XX0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheShhLGMpfV0sU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6W1tmdW5jdGlvbihhLGMpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1hW2NdfSxmdW5jdGlvbihhLGMpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihhLGMpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9XSxbZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LGc9MCxyPWUubGVuZ3RoO2chPT1yOysrZyllW2ddPWFbYysrXX0sZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LApnPTAscj1lLmxlbmd0aDtnIT09cjsrK2cpZVtnXT1hW2MrK107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9LGZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eSxnPTAscj1lLmxlbmd0aDtnIT09cjsrK2cpZVtnXT1hW2MrK107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPWFbY119LGZ1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09YVtjXTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9XSxbZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGEsCmMpfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYSxjKTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGEsYyk7dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dXSxnZXRWYWx1ZTpmdW5jdGlvbihhLGMpe3RoaXMuYmluZCgpO3RoaXMuZ2V0VmFsdWUoYSxjKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYSxjKXt0aGlzLmJpbmQoKTt0aGlzLnNldFZhbHVlKGEsYyl9LGJpbmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5vZGUsYz10aGlzLnBhcnNlZFBhdGgsZT1jLm9iamVjdE5hbWUsZz1jLnByb3BlcnR5TmFtZSxyPWMucHJvcGVydHlJbmRleDthfHwodGhpcy5ub2RlPWE9JGIuZmluZE5vZGUodGhpcy5yb290Tm9kZSxjLm5vZGVOYW1lKXx8dGhpcy5yb290Tm9kZSk7dGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZTsKdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtpZihhKXtpZihlKXt2YXIgdj1jLm9iamVjdEluZGV4O3N3aXRjaChlKXtjYXNlICJtYXRlcmlhbHMiOmlmKCFhLm1hdGVyaWFsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO3JldHVybn1pZighYS5tYXRlcmlhbC5tYXRlcmlhbHMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXkuIix0aGlzKTtyZXR1cm59YT1hLm1hdGVyaWFsLm1hdGVyaWFsczticmVhaztjYXNlICJib25lcyI6aWYoIWEuc2tlbGV0b24pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLiIsCnRoaXMpO3JldHVybn1hPWEuc2tlbGV0b24uYm9uZXM7Zm9yKGU9MDtlPGEubGVuZ3RoO2UrKylpZihhW2VdLm5hbWU9PT12KXt2PWU7YnJlYWt9YnJlYWs7ZGVmYXVsdDppZih2b2lkIDA9PT1hW2VdKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLiIsdGhpcyk7cmV0dXJufWE9YVtlXX1pZih2b2lkIDAhPT12KXtpZih2b2lkIDA9PT1hW3ZdKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuIix0aGlzLGEpO3JldHVybn1hPWFbdl19fXY9YVtnXTtpZih2b2lkIDA9PT12KWNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6ICIrYy5ub2RlTmFtZSsiLiIrZysiIGJ1dCBpdCB3YXNuJ3QgZm91bmQuIiwKYSk7ZWxzZXtjPXRoaXMuVmVyc2lvbmluZy5Ob25lO3RoaXMudGFyZ2V0T2JqZWN0PWE7dm9pZCAwIT09YS5uZWVkc1VwZGF0ZT9jPXRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTp2b2lkIDAhPT1hLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUmJihjPXRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlKTtlPXRoaXMuQmluZGluZ1R5cGUuRGlyZWN0O2lmKHZvaWQgMCE9PXIpe2lmKCJtb3JwaFRhcmdldEluZmx1ZW5jZXMiPT09Zyl7aWYoIWEuZ2VvbWV0cnkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5LiIsdGhpcyk7cmV0dXJufWlmKGEuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSl7aWYoIWEuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuIiwKdGhpcyk7cmV0dXJufWZvcihlPTA7ZTx0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDtlKyspaWYoYS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb25bZV0ubmFtZT09PXIpe3I9ZTticmVha319ZWxzZXtpZighYS5nZW9tZXRyeS5tb3JwaFRhcmdldHMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy4iLHRoaXMpO3JldHVybn1mb3IoZT0wO2U8dGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7ZSsrKWlmKGEuZ2VvbWV0cnkubW9ycGhUYXJnZXRzW2VdLm5hbWU9PT1yKXtyPWU7YnJlYWt9fX1lPXRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50O3RoaXMucmVzb2x2ZWRQcm9wZXJ0eT12O3RoaXMucHJvcGVydHlJbmRleD1yfWVsc2Ugdm9pZCAwIT09CnYuZnJvbUFycmF5JiZ2b2lkIDAhPT12LnRvQXJyYXk/KGU9dGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9dik6QXJyYXkuaXNBcnJheSh2KT8oZT10aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT12KTp0aGlzLnByb3BlcnR5TmFtZT1nO3RoaXMuZ2V0VmFsdWU9dGhpcy5HZXR0ZXJCeUJpbmRpbmdUeXBlW2VdO3RoaXMuc2V0VmFsdWU9dGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1tlXVtjXX19ZWxzZSBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgbm9kZSBmb3IgdHJhY2s6ICIrdGhpcy5wYXRoKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iKX0sdW5iaW5kOmZ1bmN0aW9uKCl7dGhpcy5ub2RlPW51bGw7dGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmJvdW5kO3RoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5ib3VuZH19KTsKT2JqZWN0LmFzc2lnbigkYi5wcm90b3R5cGUse19nZXRWYWx1ZV91bmJvdW5kOiRiLnByb3RvdHlwZS5nZXRWYWx1ZSxfc2V0VmFsdWVfdW5ib3VuZDokYi5wcm90b3R5cGUuc2V0VmFsdWV9KTtPYmplY3QuYXNzaWduKFNqLnByb3RvdHlwZSx7aXNBbmltYXRpb25PYmplY3RHcm91cDohMCxhZGQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fb2JqZWN0cyxjPWEubGVuZ3RoLGU9dGhpcy5uQ2FjaGVkT2JqZWN0c18sZz10aGlzLl9pbmRpY2VzQnlVVUlELHI9dGhpcy5fcGF0aHMsdj10aGlzLl9wYXJzZWRQYXRocyx6PXRoaXMuX2JpbmRpbmdzLEU9ei5sZW5ndGgsRz12b2lkIDAsSj0wLFA9YXJndW1lbnRzLmxlbmd0aDtKIT09UDsrK0ope3ZhciBSPWFyZ3VtZW50c1tKXSxTPVIudXVpZCxWPWdbU107aWYodm9pZCAwPT09Vil7Vj1jKys7Z1tTXT1WO2EucHVzaChSKTtTPTA7Zm9yKHZhciBXPUU7UyE9PVc7KytTKXpbU10ucHVzaChuZXcgJGIoUixyW1NdLHZbU10pKX1lbHNlIGlmKFY8CmUpe0c9YVtWXTt2YXIgaGE9LS1lO1c9YVtoYV07Z1tXLnV1aWRdPVY7YVtWXT1XO2dbU109aGE7YVtoYV09UjtTPTA7Zm9yKFc9RTtTIT09VzsrK1Mpe3ZhciBmYT16W1NdLHJhPWZhW1ZdO2ZhW1ZdPWZhW2hhXTt2b2lkIDA9PT1yYSYmKHJhPW5ldyAkYihSLHJbU10sdltTXSkpO2ZhW2hhXT1yYX19ZWxzZSBhW1ZdIT09RyYmY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCBkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIGluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4iKX10aGlzLm5DYWNoZWRPYmplY3RzXz1lfSxyZW1vdmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fb2JqZWN0cyxjPXRoaXMubkNhY2hlZE9iamVjdHNfLGU9dGhpcy5faW5kaWNlc0J5VVVJRCxnPXRoaXMuX2JpbmRpbmdzLHI9Zy5sZW5ndGgsdj0wLHo9YXJndW1lbnRzLmxlbmd0aDt2IT09Cno7Kyt2KXt2YXIgRT1hcmd1bWVudHNbdl0sRz1FLnV1aWQsSj1lW0ddO2lmKHZvaWQgMCE9PUomJko+PWMpe3ZhciBQPWMrKyxSPWFbUF07ZVtSLnV1aWRdPUo7YVtKXT1SO2VbR109UDthW1BdPUU7RT0wO2ZvcihHPXI7RSE9PUc7KytFKXtSPWdbRV07dmFyIFM9UltKXTtSW0pdPVJbUF07UltQXT1TfX19dGhpcy5uQ2FjaGVkT2JqZWN0c189Y30sdW5jYWNoZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9vYmplY3RzLGM9YS5sZW5ndGgsZT10aGlzLm5DYWNoZWRPYmplY3RzXyxnPXRoaXMuX2luZGljZXNCeVVVSUQscj10aGlzLl9iaW5kaW5ncyx2PXIubGVuZ3RoLHo9MCxFPWFyZ3VtZW50cy5sZW5ndGg7eiE9PUU7Kyt6KXt2YXIgRz1hcmd1bWVudHNbel0udXVpZCxKPWdbR107aWYodm9pZCAwIT09SilpZihkZWxldGUgZ1tHXSxKPGUpe0c9LS1lO3ZhciBQPWFbR10sUj0tLWMsUz1hW1JdO2dbUC51dWlkXT1KO2FbSl09UDtnW1MudXVpZF09RzthW0ddPVM7YS5wb3AoKTtQPQowO2ZvcihTPXY7UCE9PVM7KytQKXt2YXIgVj1yW1BdLFc9VltSXTtWW0pdPVZbR107VltHXT1XO1YucG9wKCl9fWVsc2UgZm9yKFI9LS1jLFM9YVtSXSxnW1MudXVpZF09SixhW0pdPVMsYS5wb3AoKSxQPTAsUz12O1AhPT1TOysrUClWPXJbUF0sVltKXT1WW1JdLFYucG9wKCl9dGhpcy5uQ2FjaGVkT2JqZWN0c189ZX0sc3Vic2NyaWJlXzpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxnPWVbYV0scj10aGlzLl9iaW5kaW5ncztpZih2b2lkIDAhPT1nKXJldHVybiByW2ddO3ZhciB2PXRoaXMuX3BhdGhzLHo9dGhpcy5fcGFyc2VkUGF0aHMsRT10aGlzLl9vYmplY3RzLEc9dGhpcy5uQ2FjaGVkT2JqZWN0c18sSj1BcnJheShFLmxlbmd0aCk7Zz1yLmxlbmd0aDtlW2FdPWc7di5wdXNoKGEpO3oucHVzaChjKTtyLnB1c2goSik7ZT1HO2ZvcihnPUUubGVuZ3RoO2UhPT1nOysrZSlKW2VdPW5ldyAkYihFW2VdLGEsYyk7cmV0dXJuIEp9LHVuc3Vic2NyaWJlXzpmdW5jdGlvbihhKXt2YXIgYz0KdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLGU9Y1thXTtpZih2b2lkIDAhPT1lKXt2YXIgZz10aGlzLl9wYXRocyxyPXRoaXMuX3BhcnNlZFBhdGhzLHY9dGhpcy5fYmluZGluZ3Msej12Lmxlbmd0aC0xLEU9dlt6XTtjW2Fbel1dPWU7dltlXT1FO3YucG9wKCk7cltlXT1yW3pdO3IucG9wKCk7Z1tlXT1nW3pdO2cucG9wKCl9fX0pO09iamVjdC5hc3NpZ24oVGoucHJvdG90eXBlLHtwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKHRoaXMpO3JldHVybiB0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24odGhpcyk7cmV0dXJuIHRoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlZD0hMTt0aGlzLmVuYWJsZWQ9ITA7dGhpcy50aW1lPTA7dGhpcy5fbG9vcENvdW50PS0xO3RoaXMuX3N0YXJ0VGltZT1udWxsO3JldHVybiB0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpfSxpc1J1bm5pbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmFibGVkJiYKIXRoaXMucGF1c2VkJiYwIT09dGhpcy50aW1lU2NhbGUmJm51bGw9PT10aGlzLl9zdGFydFRpbWUmJnRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX0saXNTY2hlZHVsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfSxzdGFydEF0OmZ1bmN0aW9uKGEpe3RoaXMuX3N0YXJ0VGltZT1hO3JldHVybiB0aGlzfSxzZXRMb29wOmZ1bmN0aW9uKGEsYyl7dGhpcy5sb29wPWE7dGhpcy5yZXBldGl0aW9ucz1jO3JldHVybiB0aGlzfSxzZXRFZmZlY3RpdmVXZWlnaHQ6ZnVuY3Rpb24oYSl7dGhpcy53ZWlnaHQ9YTt0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy5lbmFibGVkP2E6MDtyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCl9LGdldEVmZmVjdGl2ZVdlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHR9LGZhZGVJbjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoYSwwLDEpfSxmYWRlT3V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyhhLAoxLDApfSxjcm9zc0ZhZGVGcm9tOmZ1bmN0aW9uKGEsYyxlKXthLmZhZGVPdXQoYyk7dGhpcy5mYWRlSW4oYyk7aWYoZSl7ZT10aGlzLl9jbGlwLmR1cmF0aW9uO3ZhciBnPWEuX2NsaXAuZHVyYXRpb24scj1lL2c7YS53YXJwKDEsZy9lLGMpO3RoaXMud2FycChyLDEsYyl9cmV0dXJuIHRoaXN9LGNyb3NzRmFkZVRvOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gYS5jcm9zc0ZhZGVGcm9tKHRoaXMsYyxlKX0sc3RvcEZhZGluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX3dlaWdodEludGVycG9sYW50O251bGwhPT1hJiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoYSkpO3JldHVybiB0aGlzfSxzZXRFZmZlY3RpdmVUaW1lU2NhbGU6ZnVuY3Rpb24oYSl7dGhpcy50aW1lU2NhbGU9YTt0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9dGhpcy5wYXVzZWQ/MDphO3JldHVybiB0aGlzLnN0b3BXYXJwaW5nKCl9LGdldEVmZmVjdGl2ZVRpbWVTY2FsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGV9LApzZXREdXJhdGlvbjpmdW5jdGlvbihhKXt0aGlzLnRpbWVTY2FsZT10aGlzLl9jbGlwLmR1cmF0aW9uL2E7cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKX0sc3luY1dpdGg6ZnVuY3Rpb24oYSl7dGhpcy50aW1lPWEudGltZTt0aGlzLnRpbWVTY2FsZT1hLnRpbWVTY2FsZTtyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpfSxoYWx0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLndhcnAodGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLDAsYSl9LHdhcnA6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuX21peGVyLHI9Zy50aW1lLHY9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsej10aGlzLnRpbWVTY2FsZTtudWxsPT09diYmKHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PXY9Zy5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpKTtnPXYucGFyYW1ldGVyUG9zaXRpb25zO3Y9di5zYW1wbGVWYWx1ZXM7Z1swXT1yO2dbMV09citlO3ZbMF09YS96O3ZbMV09Yy96O3JldHVybiB0aGlzfSxzdG9wV2FycGluZzpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtudWxsIT09YSYmKHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PW51bGwsdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KGEpKTtyZXR1cm4gdGhpc30sZ2V0TWl4ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWl4ZXJ9LGdldENsaXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2xpcH0sZ2V0Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2NhbFJvb3R8fHRoaXMuX21peGVyLl9yb290fSxfdXBkYXRlOmZ1bmN0aW9uKGEsYyxlLGcpe2lmKHRoaXMuZW5hYmxlZCl7dmFyIHI9dGhpcy5fc3RhcnRUaW1lO2lmKG51bGwhPT1yKXtjPShhLXIpKmU7aWYoMD5jfHwwPT09ZSlyZXR1cm47dGhpcy5fc3RhcnRUaW1lPW51bGw7Yyo9ZX1jKj10aGlzLl91cGRhdGVUaW1lU2NhbGUoYSk7ZT10aGlzLl91cGRhdGVUaW1lKGMpO2E9dGhpcy5fdXBkYXRlV2VpZ2h0KGEpO2lmKDA8YSl7Yz10aGlzLl9pbnRlcnBvbGFudHM7CnI9dGhpcy5fcHJvcGVydHlCaW5kaW5ncztmb3IodmFyIHY9MCx6PWMubGVuZ3RoO3YhPT16OysrdiljW3ZdLmV2YWx1YXRlKGUpLHJbdl0uYWNjdW11bGF0ZShnLGEpfX1lbHNlIHRoaXMuX3VwZGF0ZVdlaWdodChhKX0sX3VwZGF0ZVdlaWdodDpmdW5jdGlvbihhKXt2YXIgYz0wO2lmKHRoaXMuZW5hYmxlZCl7Yz10aGlzLndlaWdodDt2YXIgZT10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtpZihudWxsIT09ZSl7dmFyIGc9ZS5ldmFsdWF0ZShhKVswXTtjKj1nO2E+ZS5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BGYWRpbmcoKSwwPT09ZyYmKHRoaXMuZW5hYmxlZD0hMSkpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PWN9LF91cGRhdGVUaW1lU2NhbGU6ZnVuY3Rpb24oYSl7dmFyIGM9MDtpZighdGhpcy5wYXVzZWQpe2M9dGhpcy50aW1lU2NhbGU7dmFyIGU9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7aWYobnVsbCE9PWUpe3ZhciBnPWUuZXZhbHVhdGUoYSlbMF07CmMqPWc7YT5lLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcFdhcnBpbmcoKSwwPT09Yz90aGlzLnBhdXNlZD0hMDp0aGlzLnRpbWVTY2FsZT1jKX19cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT1jfSxfdXBkYXRlVGltZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnRpbWUrYSxlPXRoaXMuX2NsaXAuZHVyYXRpb24sZz10aGlzLmxvb3Ascj10aGlzLl9sb29wQ291bnQsdj0yMjAyPT09ZztpZigwPT09YSlyZXR1cm4tMT09PXI/Yzp2JiYxPT09KHImMSk/ZS1jOmM7aWYoMjIwMD09PWcpYTp7aWYoLTE9PT1yJiYodGhpcy5fbG9vcENvdW50PTAsdGhpcy5fc2V0RW5kaW5ncyghMCwhMCwhMSkpLGM+PWUpYz1lO2Vsc2UgaWYoMD5jKWM9MDtlbHNle3RoaXMudGltZT1jO2JyZWFrIGF9dGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITE7dGhpcy50aW1lPWM7dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToiZmluaXNoZWQiLAphY3Rpb246dGhpcyxkaXJlY3Rpb246MD5hPy0xOjF9KX1lbHNley0xPT09ciYmKDA8PWE/KHI9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLDA9PT10aGlzLnJlcGV0aXRpb25zLHYpKTp0aGlzLl9zZXRFbmRpbmdzKDA9PT10aGlzLnJlcGV0aXRpb25zLCEwLHYpKTtpZihjPj1lfHwwPmMpe2c9TWF0aC5mbG9vcihjL2UpO2MtPWUqZztyKz1NYXRoLmFicyhnKTt2YXIgej10aGlzLnJlcGV0aXRpb25zLXI7MD49ej8odGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITEsdGhpcy50aW1lPWM9MDxhP2U6MCx0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsYWN0aW9uOnRoaXMsZGlyZWN0aW9uOjA8YT8xOi0xfSkpOigxPT09ej8oYT0wPmEsdGhpcy5fc2V0RW5kaW5ncyhhLCFhLHYpKTp0aGlzLl9zZXRFbmRpbmdzKCExLCExLHYpLHRoaXMuX2xvb3BDb3VudD1yLHRoaXMudGltZT1jLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6Imxvb3AiLAphY3Rpb246dGhpcyxsb29wRGVsdGE6Z30pKX1lbHNlIHRoaXMudGltZT1jO2lmKHYmJjE9PT0ociYxKSlyZXR1cm4gZS1jfXJldHVybiBjfSxfc2V0RW5kaW5nczpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncztlPyhnLmVuZGluZ1N0YXJ0PTI0MDEsZy5lbmRpbmdFbmQ9MjQwMSk6KGcuZW5kaW5nU3RhcnQ9YT90aGlzLnplcm9TbG9wZUF0U3RhcnQ/MjQwMToyNDAwOjI0MDIsZy5lbmRpbmdFbmQ9Yz90aGlzLnplcm9TbG9wZUF0RW5kPzI0MDE6MjQwMDoyNDAyKX0sX3NjaGVkdWxlRmFkaW5nOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9taXhlcixyPWcudGltZSx2PXRoaXMuX3dlaWdodEludGVycG9sYW50O251bGw9PT12JiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9dj1nLl9sZW5kQ29udHJvbEludGVycG9sYW50KCkpO2c9di5wYXJhbWV0ZXJQb3NpdGlvbnM7dj12LnNhbXBsZVZhbHVlcztnWzBdPXI7dlswXT1jO2dbMV09cithO3ZbMV09CmU7cmV0dXJuIHRoaXN9fSk7cWkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnFpLF9iaW5kQWN0aW9uOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5fbG9jYWxSb290fHx0aGlzLl9yb290LGc9YS5fY2xpcC50cmFja3Mscj1nLmxlbmd0aCx2PWEuX3Byb3BlcnR5QmluZGluZ3M7YT1hLl9pbnRlcnBvbGFudHM7dmFyIHo9ZS51dWlkLEU9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLEc9RVt6XTt2b2lkIDA9PT1HJiYoRz17fSxFW3pdPUcpO2ZvcihFPTA7RSE9PXI7KytFKXt2YXIgSj1nW0VdLFA9Si5uYW1lLFI9R1tQXTtpZih2b2lkIDA9PT1SKXtSPXZbRV07aWYodm9pZCAwIT09Uil7bnVsbD09PVIuX2NhY2hlSW5kZXgmJigrK1IucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKFIseixQKSk7Y29udGludWV9Uj1uZXcgcGkoJGIuY3JlYXRlKGUsUCxjJiZjLl9wcm9wZXJ0eUJpbmRpbmdzW0VdLmJpbmRpbmcucGFyc2VkUGF0aCksCkouVmFsdWVUeXBlTmFtZSxKLmdldFZhbHVlU2l6ZSgpKTsrK1IucmVmZXJlbmNlQ291bnQ7dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKFIseixQKX12W0VdPVI7YVtFXS5yZXN1bHRCdWZmZXI9Ui5idWZmZXJ9fSxfYWN0aXZhdGVBY3Rpb246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuX2lzQWN0aXZlQWN0aW9uKGEpKXtpZihudWxsPT09YS5fY2FjaGVJbmRleCl7dmFyIGM9KGEuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCkudXVpZCxlPWEuX2NsaXAudXVpZCxnPXRoaXMuX2FjdGlvbnNCeUNsaXBbZV07dGhpcy5fYmluZEFjdGlvbihhLGcmJmcua25vd25BY3Rpb25zWzBdKTt0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihhLGUsYyl9Yz1hLl9wcm9wZXJ0eUJpbmRpbmdzO2U9MDtmb3IoZz1jLmxlbmd0aDtlIT09ZzsrK2Upe3ZhciByPWNbZV07MD09PXIudXNlQ291bnQrKyYmKHRoaXMuX2xlbmRCaW5kaW5nKHIpLHIuc2F2ZU9yaWdpbmFsU3RhdGUoKSl9dGhpcy5fbGVuZEFjdGlvbihhKX19LApfZGVhY3RpdmF0ZUFjdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0FjdGl2ZUFjdGlvbihhKSl7Zm9yKHZhciBjPWEuX3Byb3BlcnR5QmluZGluZ3MsZT0wLGc9Yy5sZW5ndGg7ZSE9PWc7KytlKXt2YXIgcj1jW2VdOzA9PT0tLXIudXNlQ291bnQmJihyLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fdGFrZUJhY2tCaW5kaW5nKHIpKX10aGlzLl90YWtlQmFja0FjdGlvbihhKX19LF9pbml0TWVtb3J5TWFuYWdlcjpmdW5jdGlvbigpe3RoaXMuX2FjdGlvbnM9W107dGhpcy5fbkFjdGl2ZUFjdGlvbnM9MDt0aGlzLl9hY3Rpb25zQnlDbGlwPXt9O3RoaXMuX2JpbmRpbmdzPVtdO3RoaXMuX25BY3RpdmVCaW5kaW5ncz0wO3RoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZT17fTt0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzPVtdO3RoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzPTA7dmFyIGE9dGhpczt0aGlzLnN0YXRzPXthY3Rpb25zOntnZXQgdG90YWwoKXtyZXR1cm4gYS5fYWN0aW9ucy5sZW5ndGh9LApnZXQgaW5Vc2UoKXtyZXR1cm4gYS5fbkFjdGl2ZUFjdGlvbnN9fSxiaW5kaW5nczp7Z2V0IHRvdGFsKCl7cmV0dXJuIGEuX2JpbmRpbmdzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGEuX25BY3RpdmVCaW5kaW5nc319LGNvbnRyb2xJbnRlcnBvbGFudHM6e2dldCB0b3RhbCgpe3JldHVybiBhLl9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGEuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzfX19fSxfaXNBY3RpdmVBY3Rpb246ZnVuY3Rpb24oYSl7YT1hLl9jYWNoZUluZGV4O3JldHVybiBudWxsIT09YSYmYTx0aGlzLl9uQWN0aXZlQWN0aW9uc30sX2FkZEluYWN0aXZlQWN0aW9uOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9hY3Rpb25zLHI9dGhpcy5fYWN0aW9uc0J5Q2xpcCx2PXJbY107dm9pZCAwPT09dj8odj17a25vd25BY3Rpb25zOlthXSxhY3Rpb25CeVJvb3Q6e319LGEuX2J5Q2xpcENhY2hlSW5kZXg9MCxyW2NdPXYpOihjPQp2Lmtub3duQWN0aW9ucyxhLl9ieUNsaXBDYWNoZUluZGV4PWMubGVuZ3RoLGMucHVzaChhKSk7YS5fY2FjaGVJbmRleD1nLmxlbmd0aDtnLnB1c2goYSk7di5hY3Rpb25CeVJvb3RbZV09YX0sX3JlbW92ZUluYWN0aXZlQWN0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2FjdGlvbnMsZT1jW2MubGVuZ3RoLTFdLGc9YS5fY2FjaGVJbmRleDtlLl9jYWNoZUluZGV4PWc7Y1tnXT1lO2MucG9wKCk7YS5fY2FjaGVJbmRleD1udWxsO2M9YS5fY2xpcC51dWlkO2U9dGhpcy5fYWN0aW9uc0J5Q2xpcDtnPWVbY107dmFyIHI9Zy5rbm93bkFjdGlvbnMsdj1yW3IubGVuZ3RoLTFdLHo9YS5fYnlDbGlwQ2FjaGVJbmRleDt2Ll9ieUNsaXBDYWNoZUluZGV4PXo7clt6XT12O3IucG9wKCk7YS5fYnlDbGlwQ2FjaGVJbmRleD1udWxsO2RlbGV0ZSBnLmFjdGlvbkJ5Um9vdFsoYS5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkXTswPT09ci5sZW5ndGgmJmRlbGV0ZSBlW2NdO3RoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oYSl9LApfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbjpmdW5jdGlvbihhKXthPWEuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKHZhciBjPTAsZT1hLmxlbmd0aDtjIT09ZTsrK2Mpe3ZhciBnPWFbY107MD09PS0tZy5yZWZlcmVuY2VDb3VudCYmdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKGcpfX0sX2xlbmRBY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYWN0aW9ucyxlPWEuX2NhY2hlSW5kZXgsZz10aGlzLl9uQWN0aXZlQWN0aW9ucysrLHI9Y1tnXTthLl9jYWNoZUluZGV4PWc7Y1tnXT1hO3IuX2NhY2hlSW5kZXg9ZTtjW2VdPXJ9LF90YWtlQmFja0FjdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9hY3Rpb25zLGU9YS5fY2FjaGVJbmRleCxnPS0tdGhpcy5fbkFjdGl2ZUFjdGlvbnMscj1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7ci5fY2FjaGVJbmRleD1lO2NbZV09cn0sX2FkZEluYWN0aXZlQmluZGluZzpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLApyPWdbY10sdj10aGlzLl9iaW5kaW5nczt2b2lkIDA9PT1yJiYocj17fSxnW2NdPXIpO3JbZV09YTthLl9jYWNoZUluZGV4PXYubGVuZ3RoO3YucHVzaChhKX0sX3JlbW92ZUluYWN0aXZlQmluZGluZzpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9iaW5kaW5ncyxlPWEuYmluZGluZyxnPWUucm9vdE5vZGUudXVpZDtlPWUucGF0aDt2YXIgcj10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsdj1yW2ddLHo9Y1tjLmxlbmd0aC0xXTthPWEuX2NhY2hlSW5kZXg7ei5fY2FjaGVJbmRleD1hO2NbYV09ejtjLnBvcCgpO2RlbGV0ZSB2W2VdOzA9PT1PYmplY3Qua2V5cyh2KS5sZW5ndGgmJmRlbGV0ZSByW2ddfSxfbGVuZEJpbmRpbmc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYmluZGluZ3MsZT1hLl9jYWNoZUluZGV4LGc9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzKysscj1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7ci5fY2FjaGVJbmRleD1lO2NbZV09cn0sX3Rha2VCYWNrQmluZGluZzpmdW5jdGlvbihhKXt2YXIgYz0KdGhpcy5fYmluZGluZ3MsZT1hLl9jYWNoZUluZGV4LGc9LS10aGlzLl9uQWN0aXZlQmluZGluZ3Mscj1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7ci5fY2FjaGVJbmRleD1lO2NbZV09cn0sX2xlbmRDb250cm9sSW50ZXJwb2xhbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLGM9dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMrKyxlPWFbY107dm9pZCAwPT09ZSYmKGU9bmV3IFlmKG5ldyBGbG9hdDMyQXJyYXkoMiksbmV3IEZsb2F0MzJBcnJheSgyKSwxLHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIpLGUuX19jYWNoZUluZGV4PWMsYVtjXT1lKTtyZXR1cm4gZX0sX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsZT1hLl9fY2FjaGVJbmRleCxnPS0tdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMscj1jW2ddO2EuX19jYWNoZUluZGV4PQpnO2NbZ109YTtyLl9fY2FjaGVJbmRleD1lO2NbZV09cn0sX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXI6bmV3IEZsb2F0MzJBcnJheSgxKSxjbGlwQWN0aW9uOmZ1bmN0aW9uKGEsYyl7dmFyIGU9Y3x8dGhpcy5fcm9vdCxnPWUudXVpZDtlPSJzdHJpbmciPT09dHlwZW9mIGE/dGMuZmluZEJ5TmFtZShlLGEpOmE7YT1udWxsIT09ZT9lLnV1aWQ6YTt2YXIgcj10aGlzLl9hY3Rpb25zQnlDbGlwW2FdLHY9bnVsbDtpZih2b2lkIDAhPT1yKXt2PXIuYWN0aW9uQnlSb290W2ddO2lmKHZvaWQgMCE9PXYpcmV0dXJuIHY7dj1yLmtub3duQWN0aW9uc1swXTtudWxsPT09ZSYmKGU9di5fY2xpcCl9aWYobnVsbD09PWUpcmV0dXJuIG51bGw7Yz1uZXcgVGoodGhpcyxlLGMpO3RoaXMuX2JpbmRBY3Rpb24oYyx2KTt0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihjLGEsZyk7cmV0dXJuIGN9LGV4aXN0aW5nQWN0aW9uOmZ1bmN0aW9uKGEsYyl7dmFyIGU9Y3x8dGhpcy5fcm9vdDtjPWUudXVpZDsKZT0ic3RyaW5nIj09PXR5cGVvZiBhP3RjLmZpbmRCeU5hbWUoZSxhKTphO2E9dGhpcy5fYWN0aW9uc0J5Q2xpcFtlP2UudXVpZDphXTtyZXR1cm4gdm9pZCAwIT09YT9hLmFjdGlvbkJ5Um9vdFtjXXx8bnVsbDpudWxsfSxzdG9wQWxsQWN0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX2FjdGlvbnMsYz10aGlzLl9uQWN0aXZlQWN0aW9ucyxlPXRoaXMuX2JpbmRpbmdzLGc9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzLHI9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzPXRoaXMuX25BY3RpdmVBY3Rpb25zPTA7ciE9PWM7KytyKWFbcl0ucmVzZXQoKTtmb3Iocj0wO3IhPT1nOysrcillW3JdLnVzZUNvdW50PTA7cmV0dXJuIHRoaXN9LHVwZGF0ZTpmdW5jdGlvbihhKXthKj10aGlzLnRpbWVTY2FsZTtmb3IodmFyIGM9dGhpcy5fYWN0aW9ucyxlPXRoaXMuX25BY3RpdmVBY3Rpb25zLGc9dGhpcy50aW1lKz1hLHI9TWF0aC5zaWduKGEpLHY9dGhpcy5fYWNjdUluZGV4Xj0xLHo9MDt6IT09ZTsrK3opY1t6XS5fdXBkYXRlKGcsCmEscix2KTthPXRoaXMuX2JpbmRpbmdzO2M9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzO2Zvcih6PTA7eiE9PWM7Kyt6KWFbel0uYXBwbHkodik7cmV0dXJuIHRoaXN9LGdldFJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH0sdW5jYWNoZUNsaXA6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYWN0aW9uczthPWEudXVpZDt2YXIgZT10aGlzLl9hY3Rpb25zQnlDbGlwLGc9ZVthXTtpZih2b2lkIDAhPT1nKXtnPWcua25vd25BY3Rpb25zO2Zvcih2YXIgcj0wLHY9Zy5sZW5ndGg7ciE9PXY7KytyKXt2YXIgej1nW3JdO3RoaXMuX2RlYWN0aXZhdGVBY3Rpb24oeik7dmFyIEU9ei5fY2FjaGVJbmRleCxHPWNbYy5sZW5ndGgtMV07ei5fY2FjaGVJbmRleD1udWxsO3ouX2J5Q2xpcENhY2hlSW5kZXg9bnVsbDtHLl9jYWNoZUluZGV4PUU7Y1tFXT1HO2MucG9wKCk7dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbih6KX1kZWxldGUgZVthXX19LHVuY2FjaGVSb290OmZ1bmN0aW9uKGEpe2E9CmEudXVpZDt2YXIgYz10aGlzLl9hY3Rpb25zQnlDbGlwO2ZvcihnIGluIGMpe3ZhciBlPWNbZ10uYWN0aW9uQnlSb290W2FdO3ZvaWQgMCE9PWUmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGUpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGUpKX12YXIgZz10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWVbYV07aWYodm9pZCAwIT09Zylmb3IodmFyIHIgaW4gZylhPWdbcl0sYS5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhhKX0sdW5jYWNoZUFjdGlvbjpmdW5jdGlvbihhLGMpe2E9dGhpcy5leGlzdGluZ0FjdGlvbihhLGMpO251bGwhPT1hJiYodGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihhKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbihhKSl9fSk7YmgucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBiaCh2b2lkIDA9PT10aGlzLnZhbHVlLmNsb25lP3RoaXMudmFsdWU6dGhpcy52YWx1ZS5jbG9uZSgpKX07cmkucHJvdG90eXBlPQpPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoUWQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6cmksaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjohMCxjb3B5OmZ1bmN0aW9uKGEpe1FkLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9YS5tZXNoUGVyQXR0cmlidXRlO3JldHVybiB0aGlzfX0pO09iamVjdC5hc3NpZ24oVWoucHJvdG90eXBlLHtsaW5lUHJlY2lzaW9uOjEsc2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5yYXkuc2V0KGEsYyl9LHNldEZyb21DYW1lcmE6ZnVuY3Rpb24oYSxjKXtjJiZjLmlzUGVyc3BlY3RpdmVDYW1lcmE/KHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oYy5tYXRyaXhXb3JsZCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldChhLngsYS55LC41KS51bnByb2plY3QoYykuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksdGhpcy5jYW1lcmE9Yyk6YyYmYy5pc09ydGhvZ3JhcGhpY0NhbWVyYT8KKHRoaXMucmF5Lm9yaWdpbi5zZXQoYS54LGEueSwoYy5uZWFyK2MuZmFyKS8oYy5uZWFyLWMuZmFyKSkudW5wcm9qZWN0KGMpLHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoMCwwLC0xKS50cmFuc2Zvcm1EaXJlY3Rpb24oYy5tYXRyaXhXb3JsZCksdGhpcy5jYW1lcmE9Yyk6Y29uc29sZS5lcnJvcigiVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZS4iKX0saW50ZXJzZWN0T2JqZWN0OmZ1bmN0aW9uKGEsYyxlKXtlPWV8fFtdO3NpKGEsdGhpcyxlLGMpO2Uuc29ydChWaik7cmV0dXJuIGV9LGludGVyc2VjdE9iamVjdHM6ZnVuY3Rpb24oYSxjLGUpe2U9ZXx8W107aWYoITE9PT1BcnJheS5pc0FycmF5KGEpKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzOiBvYmplY3RzIGlzIG5vdCBhbiBBcnJheS4iKSxlO2Zvcih2YXIgZz0wLHI9YS5sZW5ndGg7ZzxyO2crKylzaShhW2ddLHRoaXMsZSxjKTtlLnNvcnQoVmopO3JldHVybiBlfX0pOwpPYmplY3QuYXNzaWduKFdqLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnJhZGl1cz1hO3RoaXMucGhpPWM7dGhpcy50aGV0YT1lO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLnJhZGl1cz1hLnJhZGl1czt0aGlzLnBoaT1hLnBoaTt0aGlzLnRoZXRhPWEudGhldGE7cmV0dXJuIHRoaXN9LG1ha2VTYWZlOmZ1bmN0aW9uKCl7dGhpcy5waGk9TWF0aC5tYXgoMUUtNixNYXRoLm1pbihNYXRoLlBJLTFFLTYsdGhpcy5waGkpKTtyZXR1cm4gdGhpc30sc2V0RnJvbVZlY3RvcjM6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhhLngsYS55LGEueil9LHNldEZyb21DYXJ0ZXNpYW5Db29yZHM6ZnVuY3Rpb24oYSxjLGUpe3RoaXMucmFkaXVzPU1hdGguc3FydChhKmErYypjK2UqZSk7MD09PXRoaXMucmFkaXVzP3RoaXMucGhpPQp0aGlzLnRoZXRhPTA6KHRoaXMudGhldGE9TWF0aC5hdGFuMihhLGUpLHRoaXMucGhpPU1hdGguYWNvcyhoYi5jbGFtcChjL3RoaXMucmFkaXVzLC0xLDEpKSk7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihYai5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMsZSl7dGhpcy5yYWRpdXM9YTt0aGlzLnRoZXRhPWM7dGhpcy55PWU7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMucmFkaXVzPWEucmFkaXVzO3RoaXMudGhldGE9YS50aGV0YTt0aGlzLnk9YS55O3JldHVybiB0aGlzfSxzZXRGcm9tVmVjdG9yMzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKGEueCxhLnksYS56KX0sc2V0RnJvbUNhcnRlc2lhbkNvb3JkczpmdW5jdGlvbihhLGMsZSl7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGEqYStlKmUpO3RoaXMudGhldGE9TWF0aC5hdGFuMihhLAplKTt0aGlzLnk9YztyZXR1cm4gdGhpc319KTt2YXIgeWs9bmV3IGY7T2JqZWN0LmFzc2lnbih0aS5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMubWluLmNvcHkoYSk7dGhpcy5tYXguY29weShjKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihhKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgYz0wLGU9YS5sZW5ndGg7YzxlO2MrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYVtjXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKGEsYyl7Yz15ay5jb3B5KGMpLm11bHRpcGx5U2NhbGFyKC41KTt0aGlzLm1pbi5jb3B5KGEpLnN1YihjKTt0aGlzLm1heC5jb3B5KGEpLmFkZChjKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5taW4uY29weShhLm1pbik7dGhpcy5tYXguY29weShhLm1heCk7cmV0dXJuIHRoaXN9LAptYWtlRW1wdHk6ZnVuY3Rpb24oKXt0aGlzLm1pbi54PXRoaXMubWluLnk9SW5maW5pdHk7dGhpcy5tYXgueD10aGlzLm1heC55PS1JbmZpbml0eTtyZXR1cm4gdGhpc30saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgZik7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Euc2V0KDAsMCk6YS5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9LGdldFNpemU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldFNpemUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgZik7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Euc2V0KDAsMCk6YS5zdWJWZWN0b3JzKHRoaXMubWF4LAp0aGlzLm1pbil9LGV4cGFuZEJ5UG9pbnQ6ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEpO3RoaXMubWF4Lm1heChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlWZWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5taW4uc3ViKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkU2NhbGFyKC1hKTt0aGlzLm1heC5hZGRTY2FsYXIoYSk7cmV0dXJuIHRoaXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueDx0aGlzLm1pbi54fHxhLng+dGhpcy5tYXgueHx8YS55PHRoaXMubWluLnl8fGEueT50aGlzLm1heC55PyExOiEwfSxjb250YWluc0JveDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5taW4ueDw9YS5taW4ueCYmYS5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9YS5taW4ueSYmYS5tYXgueTw9dGhpcy5tYXgueX0sZ2V0UGFyYW1ldGVyOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSwKYz1uZXcgZik7cmV0dXJuIGMuc2V0KChhLngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKGEueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWF4Lng8dGhpcy5taW4ueHx8YS5taW4ueD50aGlzLm1heC54fHxhLm1heC55PHRoaXMubWluLnl8fGEubWluLnk+dGhpcy5tYXgueT8hMTohMH0sY2xhbXBQb2ludDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGYpO3JldHVybiBjLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHlrLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1YihhKS5sZW5ndGgoKX0saW50ZXJzZWN0OmZ1bmN0aW9uKGEpe3RoaXMubWluLm1heChhLm1pbik7CnRoaXMubWF4Lm1pbihhLm1heCk7cmV0dXJuIHRoaXN9LHVuaW9uOmZ1bmN0aW9uKGEpe3RoaXMubWluLm1pbihhLm1pbik7dGhpcy5tYXgubWF4KGEubWF4KTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEpe3RoaXMubWluLmFkZChhKTt0aGlzLm1heC5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5taW4uZXF1YWxzKHRoaXMubWluKSYmYS5tYXguZXF1YWxzKHRoaXMubWF4KX19KTt2YXIgems9bmV3IGssemg9bmV3IGs7T2JqZWN0LmFzc2lnbih1aS5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMuc3RhcnQuY29weShhKTt0aGlzLmVuZC5jb3B5KGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLnN0YXJ0LmNvcHkoYS5zdGFydCk7dGhpcy5lbmQuY29weShhLmVuZCk7cmV0dXJuIHRoaXN9LGdldENlbnRlcjpmdW5jdGlvbihhKXt2b2lkIDA9PT0KYSYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSl9LGRlbHRhOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KX0sZGlzdGFuY2VTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX0sZGlzdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX0sYXQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9Cm5ldyBrKTtyZXR1cm4gdGhpcy5kZWx0YShjKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5zdGFydCl9LGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXI6ZnVuY3Rpb24oYSxjKXt6ay5zdWJWZWN0b3JzKGEsdGhpcy5zdGFydCk7emguc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KTthPXpoLmRvdCh6aykvemguZG90KHpoKTtjJiYoYT1oYi5jbGFtcChhLDAsMSkpO3JldHVybiBhfSxjbG9zZXN0UG9pbnRUb1BvaW50OmZ1bmN0aW9uKGEsYyxlKXthPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcihhLGMpO3ZvaWQgMD09PWUmJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxlPW5ldyBrKTtyZXR1cm4gdGhpcy5kZWx0YShlKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5zdGFydCl9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NChhKTsKdGhpcy5lbmQuYXBwbHlNYXRyaXg0KGEpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3RhcnQuZXF1YWxzKHRoaXMuc3RhcnQpJiZhLmVuZC5lcXVhbHModGhpcy5lbmQpfX0pO2NnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtjZy5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2c7Y2cucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0PSEwO3ZhciBaYz1uZXcgayxvZD1uZXcgayxSaT1uZXcgdCxXbT1bImEiLCJiIiwiYyJdO2RnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7ZGcucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRnO2RnLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCghMCk7UmkuZ2V0Tm9ybWFsTWF0cml4KHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkKTt2YXIgYT10aGlzLm9iamVjdC5tYXRyaXhXb3JsZCxjPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbiwKZT10aGlzLm9iamVjdC5nZW9tZXRyeTtpZihlJiZlLmlzR2VvbWV0cnkpZm9yKHZhciBnPWUudmVydGljZXMscj1lLmZhY2VzLHY9ZT0wLHo9ci5sZW5ndGg7djx6O3YrKylmb3IodmFyIEU9clt2XSxHPTAsSj1FLnZlcnRleE5vcm1hbHMubGVuZ3RoO0c8SjtHKyspe3ZhciBQPUUudmVydGV4Tm9ybWFsc1tHXTtaYy5jb3B5KGdbRVtXbVtHXV1dKS5hcHBseU1hdHJpeDQoYSk7b2QuY29weShQKS5hcHBseU1hdHJpeDMoUmkpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKFpjKTtjLnNldFhZWihlLFpjLngsWmMueSxaYy56KTtlKz0xO2Muc2V0WFlaKGUsb2QueCxvZC55LG9kLnopO2UrPTF9ZWxzZSBpZihlJiZlLmlzQnVmZmVyR2VvbWV0cnkpZm9yKGc9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHI9ZS5hdHRyaWJ1dGVzLm5vcm1hbCxHPWU9MCxKPWcuY291bnQ7RzxKO0crKylaYy5zZXQoZy5nZXRYKEcpLGcuZ2V0WShHKSxnLmdldFooRykpLmFwcGx5TWF0cml4NChhKSwKb2Quc2V0KHIuZ2V0WChHKSxyLmdldFkoRyksci5nZXRaKEcpKSxvZC5hcHBseU1hdHJpeDMoUmkpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKFpjKSxjLnNldFhZWihlLFpjLngsWmMueSxaYy56KSxlKz0xLGMuc2V0WFlaKGUsb2QueCxvZC55LG9kLnopLGUrPTE7Yy5uZWVkc1VwZGF0ZT0hMH07dmFyIEFrPW5ldyBrO1hlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtYZS5wcm90b3R5cGUuY29uc3RydWN0b3I9WGU7WGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCl9O1hlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dmFyIGE9dGhpcy5saWdodC5kaXN0YW5jZT90aGlzLmxpZ2h0LmRpc3RhbmNlOjFFMyxjPWEqTWF0aC50YW4odGhpcy5saWdodC5hbmdsZSk7CnRoaXMuY29uZS5zY2FsZS5zZXQoYyxjLGEpO0FrLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCk7dGhpcy5jb25lLmxvb2tBdChBayk7dm9pZCAwIT09dGhpcy5jb2xvcj90aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOnRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfTt2YXIgSWQ9bmV3IGssQWg9bmV3IHEsU2k9bmV3IHE7WWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtZZS5wcm90b3R5cGUuY29uc3RydWN0b3I9WWU7WWUucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuYm9uZXMsZT10aGlzLmdlb21ldHJ5LGc9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7U2kuZ2V0SW52ZXJzZSh0aGlzLnJvb3QubWF0cml4V29ybGQpO2Zvcih2YXIgcj0wLHY9MDtyPGMubGVuZ3RoO3IrKyl7dmFyIHo9Y1tyXTt6LnBhcmVudCYmCnoucGFyZW50LmlzQm9uZSYmKEFoLm11bHRpcGx5TWF0cmljZXMoU2ksei5tYXRyaXhXb3JsZCksSWQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKEFoKSxnLnNldFhZWih2LElkLngsSWQueSxJZC56KSxBaC5tdWx0aXBseU1hdHJpY2VzKFNpLHoucGFyZW50Lm1hdHJpeFdvcmxkKSxJZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oQWgpLGcuc2V0WFlaKHYrMSxJZC54LElkLnksSWQueiksdis9Mil9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITA7QS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGEpfTtaZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1plLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aZTtaZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfTtaZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5jb2xvcj8KdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfTskZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpOyRlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0kZTskZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5zY2FsZS5zZXQoLjUqdGhpcy5saWdodC53aWR0aCwuNSp0aGlzLmxpZ2h0LmhlaWdodCwxKTtpZih2b2lkIDAhPT10aGlzLmNvbG9yKXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpO2Vsc2V7dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLm11bHRpcGx5U2NhbGFyKHRoaXMubGlnaHQuaW50ZW5zaXR5KTt2YXIgYT10aGlzLm1hdGVyaWFsLmNvbG9yLGM9TWF0aC5tYXgoYS5yLGEuZyxhLmIpOzE8YyYmYS5tdWx0aXBseVNjYWxhcigxLwpjKTt0aGlzLmNoaWxkcmVuWzBdLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5tYXRlcmlhbC5jb2xvcil9fTskZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfTt2YXIgWG09bmV3IGssQms9bmV3IEksQ2s9bmV3IEk7YWYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO2FmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hZjthZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfTthZi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGlsZHJlblswXTtpZih2b2lkIDAhPT10aGlzLmNvbG9yKXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOwplbHNle3ZhciBjPWEuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO0JrLmNvcHkodGhpcy5saWdodC5jb2xvcik7Q2suY29weSh0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yKTtmb3IodmFyIGU9MCxnPWMuY291bnQ7ZTxnO2UrKyl7dmFyIHI9ZTxnLzI/Qms6Q2s7Yy5zZXRYWVooZSxyLnIsci5nLHIuYil9Yy5uZWVkc1VwZGF0ZT0hMH1hLmxvb2tBdChYbS5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCkubmVnYXRlKCkpfTtiZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO2JmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iZjtiZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfTtiZi5wcm90b3R5cGUub25CZWZvcmVSZW5kZXI9ZnVuY3Rpb24oKXt0aGlzLnBvc2l0aW9uLmNvcHkodGhpcy5saWdodFByb2JlLnBvc2l0aW9uKTt0aGlzLnNjYWxlLnNldCgxLAoxLDEpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSk7dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5pbnRlbnNpdHkudmFsdWU9dGhpcy5saWdodFByb2JlLmludGVuc2l0eX07Y2gucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpjaCxjb3B5OmZ1bmN0aW9uKGEpe0liLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmdlb21ldHJ5LmNvcHkoYS5nZW9tZXRyeSk7dGhpcy5tYXRlcmlhbC5jb3B5KGEubWF0ZXJpYWwpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19KTtkaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2RoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1kaDtjZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpO2NmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jZjtjZi5wcm90b3R5cGUudXBkYXRlPQpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoVyxoYSxmYSxyYSl7ZmE9KGhhLVcpL2ZhO1Yuc2V0WFlaKEcsMCwwLDApO0orKztmb3IoUD1XO1A8aGE7UCs9ZmEpUj1HK0osVi5zZXRYWVooUixNYXRoLnNpbihQKSplLDAsTWF0aC5jb3MoUCkqZSksVi5zZXRYWVooUisxLE1hdGguc2luKE1hdGgubWluKFArZmEsaGEpKSplLDAsTWF0aC5jb3MoTWF0aC5taW4oUCtmYSxoYSkpKmUpLFYuc2V0WFlaKFIrMiwwLDAsMCksSis9MztTLmFkZEdyb3VwKEcsSixyYSk7Rys9SjtKPTB9dmFyIGM9dGhpcy5hdWRpbyxlPXRoaXMucmFuZ2UsZz10aGlzLmRpdmlzaW9uc0lubmVyQW5nbGUscj10aGlzLmRpdmlzaW9uc091dGVyQW5nbGUsdj1oYi5kZWdUb1JhZChjLnBhbm5lci5jb25lSW5uZXJBbmdsZSk7Yz1oYi5kZWdUb1JhZChjLnBhbm5lci5jb25lT3V0ZXJBbmdsZSk7dmFyIHo9di8yLEU9Yy8yLEc9MCxKPTAsUCxSLFM9dGhpcy5nZW9tZXRyeSxWPVMuYXR0cmlidXRlcy5wb3NpdGlvbjtTLmNsZWFyR3JvdXBzKCk7CmEoLUUsLXosciwwKTthKC16LHosZywxKTthKHosRSxyLDApO1YubmVlZHNVcGRhdGU9ITA7dj09PWMmJih0aGlzLm1hdGVyaWFsWzBdLnZpc2libGU9ITEpfTtjZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWxbMF0uZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWxbMV0uZGlzcG9zZSgpfTt2YXIgcWc9bmV3IGssQmg9bmV3IGssRGs9bmV3IHQ7ZWcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtlZy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZWc7ZWcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtEay5nZXROb3JtYWxNYXRyaXgodGhpcy5vYmplY3QubWF0cml4V29ybGQpO3ZhciBhPXRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkLGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5vYmplY3QuZ2VvbWV0cnksZz0KZS52ZXJ0aWNlcztlPWUuZmFjZXM7Zm9yKHZhciByPTAsdj0wLHo9ZS5sZW5ndGg7djx6O3YrKyl7dmFyIEU9ZVt2XSxHPUUubm9ybWFsO3FnLmNvcHkoZ1tFLmFdKS5hZGQoZ1tFLmJdKS5hZGQoZ1tFLmNdKS5kaXZpZGVTY2FsYXIoMykuYXBwbHlNYXRyaXg0KGEpO0JoLmNvcHkoRykuYXBwbHlNYXRyaXgzKERrKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0aGlzLnNpemUpLmFkZChxZyk7Yy5zZXRYWVoocixxZy54LHFnLnkscWcueik7cis9MTtjLnNldFhZWihyLEJoLngsQmgueSxCaC56KTtyKz0xfWMubmVlZHNVcGRhdGU9ITB9O3ZhciBFaz1uZXcgayxDaD1uZXcgayxGaz1uZXcgaztkZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7ZGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRmO2RmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5saWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTt0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpOwp0aGlzLnRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5kaXNwb3NlKCl9O2RmLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtFay5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCk7Q2guc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKTtGay5zdWJWZWN0b3JzKENoLEVrKTt0aGlzLmxpZ2h0UGxhbmUubG9va0F0KENoKTt2b2lkIDAhPT10aGlzLmNvbG9yPyh0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcikpOih0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSk7dGhpcy50YXJnZXRMaW5lLmxvb2tBdChDaCk7CnRoaXMudGFyZ2V0TGluZS5zY2FsZS56PUZrLmxlbmd0aCgpfTt2YXIgZWg9bmV3IGssT2I9bmV3IHpiO2ZnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7ZmcucHJvdG90eXBlLmNvbnN0cnVjdG9yPWZnO2ZnLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdlb21ldHJ5LGM9dGhpcy5wb2ludE1hcDtPYi5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTtQYigiYyIsYyxhLE9iLDAsMCwtMSk7UGIoInQiLGMsYSxPYiwwLDAsMSk7UGIoIm4xIixjLGEsT2IsLTEsLTEsLTEpO1BiKCJuMiIsYyxhLE9iLDEsLTEsLTEpO1BiKCJuMyIsYyxhLE9iLC0xLDEsLTEpO1BiKCJuNCIsYyxhLE9iLDEsMSwtMSk7UGIoImYxIixjLGEsT2IsLTEsLTEsMSk7UGIoImYyIixjLGEsT2IsMSwtMSwxKTtQYigiZjMiLGMsYSxPYiwtMSwxLDEpO1BiKCJmNCIsYyxhLE9iLDEsMSwxKTtQYigidTEiLApjLGEsT2IsLjcsMS4xLC0xKTtQYigidTIiLGMsYSxPYiwtLjcsMS4xLC0xKTtQYigidTMiLGMsYSxPYiwwLDIsLTEpO1BiKCJjZjEiLGMsYSxPYiwtMSwwLDEpO1BiKCJjZjIiLGMsYSxPYiwxLDAsMSk7UGIoImNmMyIsYyxhLE9iLDAsLTEsMSk7UGIoImNmNCIsYyxhLE9iLDAsMSwxKTtQYigiY24xIixjLGEsT2IsLTEsMCwtMSk7UGIoImNuMiIsYyxhLE9iLDEsMCwtMSk7UGIoImNuMyIsYyxhLE9iLDAsLTEsLTEpO1BiKCJjbjQiLGMsYSxPYiwwLDEsLTEpO2EuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlPSEwfTt2YXIgRGg9bmV3IHc7aGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtoZC5wcm90b3R5cGUuY29uc3RydWN0b3I9aGQ7aGQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXt2b2lkIDAhPT1hJiZjb25zb2xlLndhcm4oIlRIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLiIpO3ZvaWQgMCE9PQp0aGlzLm9iamVjdCYmRGguc2V0RnJvbU9iamVjdCh0aGlzLm9iamVjdCk7aWYoIURoLmlzRW1wdHkoKSl7YT1EaC5taW47dmFyIGM9RGgubWF4LGU9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGc9ZS5hcnJheTtnWzBdPWMueDtnWzFdPWMueTtnWzJdPWMuejtnWzNdPWEueDtnWzRdPWMueTtnWzVdPWMuejtnWzZdPWEueDtnWzddPWEueTtnWzhdPWMuejtnWzldPWMueDtnWzEwXT1hLnk7Z1sxMV09Yy56O2dbMTJdPWMueDtnWzEzXT1jLnk7Z1sxNF09YS56O2dbMTVdPWEueDtnWzE2XT1jLnk7Z1sxN109YS56O2dbMThdPWEueDtnWzE5XT1hLnk7Z1syMF09YS56O2dbMjFdPWMueDtnWzIyXT1hLnk7Z1syM109YS56O2UubmVlZHNVcGRhdGU9ITA7dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX19O2hkLnByb3RvdHlwZS5zZXRGcm9tT2JqZWN0PWZ1bmN0aW9uKGEpe3RoaXMub2JqZWN0PWE7dGhpcy51cGRhdGUoKTtyZXR1cm4gdGhpc307aGQucHJvdG90eXBlLmNvcHk9CmZ1bmN0aW9uKGEpe0liLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLm9iamVjdD1hLm9iamVjdDtyZXR1cm4gdGhpc307aGQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfTtnZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2dnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1nZztnZy5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5ib3g7Yy5pc0VtcHR5KCl8fChjLmdldENlbnRlcih0aGlzLnBvc2l0aW9uKSxjLmdldFNpemUodGhpcy5zY2FsZSksdGhpcy5zY2FsZS5tdWx0aXBseVNjYWxhciguNSksQS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGEpKX07aGcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVmIucHJvdG90eXBlKTtoZy5wcm90b3R5cGUuY29uc3RydWN0b3I9aGc7aGcucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkPQpmdW5jdGlvbihhKXt2YXIgYz0tdGhpcy5wbGFuZS5jb25zdGFudDsxRS04Pk1hdGguYWJzKGMpJiYoYz0xRS04KTt0aGlzLnNjYWxlLnNldCguNSp0aGlzLnNpemUsLjUqdGhpcy5zaXplLGMpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuc2lkZT0wPmM/MTowO3RoaXMubG9va0F0KHRoaXMucGxhbmUubm9ybWFsKTtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSl9O3ZhciBHaz1uZXcgayxmaCx2aTtpZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7aWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPWlkO2lkLnByb3RvdHlwZS5zZXREaXJlY3Rpb249ZnVuY3Rpb24oYSl7Ljk5OTk5PGEueT90aGlzLnF1YXRlcm5pb24uc2V0KDAsMCwwLDEpOi0uOTk5OTk+YS55P3RoaXMucXVhdGVybmlvbi5zZXQoMSwwLDAsMCk6KEdrLnNldChhLnosMCwtYS54KS5ub3JtYWxpemUoKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShHayxNYXRoLmFjb3MoYS55KSkpfTsKaWQucHJvdG90eXBlLnNldExlbmd0aD1mdW5jdGlvbihhLGMsZSl7dm9pZCAwPT09YyYmKGM9LjIqYSk7dm9pZCAwPT09ZSYmKGU9LjIqYyk7dGhpcy5saW5lLnNjYWxlLnNldCgxLE1hdGgubWF4KDAsYS1jKSwxKTt0aGlzLmxpbmUudXBkYXRlTWF0cml4KCk7dGhpcy5jb25lLnNjYWxlLnNldChlLGMsZSk7dGhpcy5jb25lLnBvc2l0aW9uLnk9YTt0aGlzLmNvbmUudXBkYXRlTWF0cml4KCl9O2lkLnByb3RvdHlwZS5zZXRDb2xvcj1mdW5jdGlvbihhKXt0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KGEpO3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQoYSl9O2lkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEsITEpO3RoaXMubGluZS5jb3B5KGEubGluZSk7dGhpcy5jb25lLmNvcHkoYS5jb25lKTtyZXR1cm4gdGhpc307aWQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfTsKaWcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtpZy5wcm90b3R5cGUuY29uc3RydWN0b3I9aWc7WmEuY3JlYXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS5sb2coIlRIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQiKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YTthLnByb3RvdHlwZS5nZXRQb2ludD1jO3JldHVybiBhfTtPYmplY3QuYXNzaWduKGdkLnByb3RvdHlwZSx7Y3JlYXRlUG9pbnRzR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpO2E9dGhpcy5nZXRQb2ludHMoYSk7cmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoYSl9LGNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4iKTsKYT10aGlzLmdldFNwYWNlZFBvaW50cyhhKTtyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeShhKX0sY3JlYXRlR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpO2Zvcih2YXIgYz1uZXcgeWEsZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9YVtlXTtjLnZlcnRpY2VzLnB1c2gobmV3IGsoci54LHIueSxyLnp8fDApKX1yZXR1cm4gY319KTtPYmplY3QuYXNzaWduKEdjLnByb3RvdHlwZSx7ZnJvbVBvaW50czpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhdGg6IC5mcm9tUG9pbnRzKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbVBvaW50cygpLiIpO3RoaXMuc2V0RnJvbVBvaW50cyhhKX19KTtaai5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYi5wcm90b3R5cGUpOwphay5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYi5wcm90b3R5cGUpO3dpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSk7T2JqZWN0LmFzc2lnbih3aS5wcm90b3R5cGUse2luaXRGcm9tQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5pbml0RnJvbUFycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sZ2V0Q29udHJvbFBvaW50c0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU3BsaW5lOiAuZ2V0Q29udHJvbFBvaW50c0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU3BsaW5lOiAucmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtjaC5wcm90b3R5cGUuc2V0Q29sb3JzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuR3JpZEhlbHBlcjogc2V0Q29sb3JzKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGFzcyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLiIpfTsKWWUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLiIpfTtPYmplY3QuYXNzaWduKERiLnByb3RvdHlwZSx7ZXh0cmFjdFVybEJhc2U6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Mb2FkZXI6IC5leHRyYWN0VXJsQmFzZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSgpIGluc3RlYWQuIik7cmV0dXJuIFBpLmV4dHJhY3RVcmxCYXNlKGEpfX0pO09iamVjdC5hc3NpZ24oWmcucHJvdG90eXBlLHtzZXRUZXh0dXJlUGF0aDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogLnNldFRleHR1cmVQYXRoKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0UmVzb3VyY2VQYXRoKCkuIik7cmV0dXJuIHRoaXMuc2V0UmVzb3VyY2VQYXRoKGEpfX0pO09iamVjdC5hc3NpZ24odGkucHJvdG90eXBlLAp7Y2VudGVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpO3JldHVybiB0aGlzLmdldENlbnRlcihhKX0sZW1wdHk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4iKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCl9LGlzSW50ZXJzZWN0aW9uQm94OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNCb3goYSl9LHNpemU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4iKTtyZXR1cm4gdGhpcy5nZXRTaXplKGEpfX0pO09iamVjdC5hc3NpZ24ody5wcm90b3R5cGUsCntjZW50ZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGEpfSxlbXB0eTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpO3JldHVybiB0aGlzLmlzRW1wdHkoKX0saXNJbnRlcnNlY3Rpb25Cb3g6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveChhKX0saXNJbnRlcnNlY3Rpb25TcGhlcmU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZShhKX0sCnNpemU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4iKTtyZXR1cm4gdGhpcy5nZXRTaXplKGEpfX0pO3VpLnByb3RvdHlwZS5jZW50ZXI9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpO3JldHVybiB0aGlzLmdldENlbnRlcihhKX07T2JqZWN0LmFzc2lnbihoYix7cmFuZG9tMTY6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGg6IC5yYW5kb20xNigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBNYXRoLnJhbmRvbSgpIGluc3RlYWQuIik7cmV0dXJuIE1hdGgucmFuZG9tKCl9LG5lYXJlc3RQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLm5lYXJlc3RQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZmxvb3JQb3dlck9mVHdvKCkuIik7CnJldHVybiBoYi5mbG9vclBvd2VyT2ZUd28oYSl9LG5leHRQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLm5leHRQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY2VpbFBvd2VyT2ZUd28oKS4iKTtyZXR1cm4gaGIuY2VpbFBvd2VyT2ZUd28oYSl9fSk7T2JqZWN0LmFzc2lnbih0LnByb3RvdHlwZSx7ZmxhdHRlblRvQXJyYXlPZmZzZXQ6ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudG9BcnJheShhLGMpfSxtdWx0aXBseVZlY3RvcjM6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXgzKHRoaXMpfSwKbXVsdGlwbHlWZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhcHBseVRvQnVmZmVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShhKX0sYXBwbHlUb1ZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuYXNzaWduKHEucHJvdG90eXBlLHtleHRyYWN0UG9zaXRpb246ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZXh0cmFjdFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29weVBvc2l0aW9uKCkuIik7CnJldHVybiB0aGlzLmNvcHlQb3NpdGlvbihhKX0sZmxhdHRlblRvQXJyYXlPZmZzZXQ6ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudG9BcnJheShhLGMpfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybihuZXcgaykuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDMpfSxzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLiIpOwpyZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihhKX0sbXVsdGlwbHlUb0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sbXVsdGlwbHlWZWN0b3IzOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBhLmFwcGx5TWF0cml4NCh0aGlzKX0sbXVsdGlwbHlWZWN0b3I0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBhLmFwcGx5TWF0cml4NCh0aGlzKX0sbXVsdGlwbHlWZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwKcm90YXRlQXhpczpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpO2EudHJhbnNmb3JtRGlyZWN0aW9uKHRoaXMpfSxjcm9zc1ZlY3RvcjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBhLmFwcGx5TWF0cml4NCh0aGlzKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZVg6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZVk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LApyb3RhdGVaOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyb3RhdGVCeUF4aXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYXBwbHlUb0J1ZmZlcjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoYSl9LGFwcGx5VG9WZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LG1ha2VGcnVzdHVtOmZ1bmN0aW9uKGEsYyxlLGcscix2KXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tYWtlRnJ1c3R1bSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIGluc3RlYWQuIik7CnJldHVybiB0aGlzLm1ha2VQZXJzcGVjdGl2ZShhLGMsZyxlLHIsdil9fSk7SGIucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uTGluZT1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0xpbmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzTGluZShhKX07aC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlRdWF0ZXJuaW9uKHRoaXMpfTtPYmplY3QuYXNzaWduKEQucHJvdG90eXBlLHtpc0ludGVyc2VjdGlvbkJveDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpOwpyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KGEpfSxpc0ludGVyc2VjdGlvblBsYW5lOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNQbGFuZShhKX0saXNJbnRlcnNlY3Rpb25TcGhlcmU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGEpfX0pO09iamVjdC5hc3NpZ24oQi5wcm90b3R5cGUse2FyZWE6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYXJlYSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEFyZWEoKS4iKTtyZXR1cm4gdGhpcy5nZXRBcmVhKCl9LGJhcnljb29yZEZyb21Qb2ludDpmdW5jdGlvbihhLApjKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuIik7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKGEsYyl9LG1pZHBvaW50OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuIik7cmV0dXJuIHRoaXMuZ2V0TWlkcG9pbnQoYSl9LG5vcm1hbDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuIik7cmV0dXJuIHRoaXMuZ2V0Tm9ybWFsKGEpfSxwbGFuZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAucGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRQbGFuZSgpLiIpO3JldHVybiB0aGlzLmdldFBsYW5lKGEpfX0pO09iamVjdC5hc3NpZ24oQiwKe2Jhcnljb29yZEZyb21Qb2ludDpmdW5jdGlvbihhLGMsZSxnLHIpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4iKTtyZXR1cm4gQi5nZXRCYXJ5Y29vcmQoYSxjLGUsZyxyKX0sbm9ybWFsOmZ1bmN0aW9uKGEsYyxlLGcpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4iKTtyZXR1cm4gQi5nZXROb3JtYWwoYSxjLGUsZyl9fSk7T2JqZWN0LmFzc2lnbihDZC5wcm90b3R5cGUse2V4dHJhY3RBbGxQb2ludHM6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmV4dHJhY3RQb2ludHMoYSl9LGV4dHJ1ZGU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLmV4dHJ1ZGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXh0cnVkZUdlb21ldHJ5KCkgaW5zdGVhZC4iKTsKcmV0dXJuIG5ldyBVZCh0aGlzLGEpfSxtYWtlR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLm1ha2VHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBTaGFwZUdlb21ldHJ5KCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IFZkKHRoaXMsYSl9fSk7T2JqZWN0LmFzc2lnbihmLnByb3RvdHlwZSx7ZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsYyxlKX0sZGlzdGFuY2VUb01hbmhhdHRhbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oYSl9LApsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKGsucHJvdG90eXBlLHtzZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLiIpfSxzZXRFdWxlckZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLiIpfSxnZXRQb3NpdGlvbkZyb21NYXRyaXg6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuIik7CnJldHVybiB0aGlzLnNldEZyb21NYXRyaXhQb3NpdGlvbihhKX0sZ2V0U2NhbGVGcm9tTWF0cml4OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldFNjYWxlRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhTY2FsZSgpLiIpO3JldHVybiB0aGlzLnNldEZyb21NYXRyaXhTY2FsZShhKX0sZ2V0Q29sdW1uRnJvbU1hdHJpeDpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldENvbHVtbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4Q29sdW1uKCkuIik7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihjLGEpfSxhcHBseVByb2plY3Rpb246ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuYXBwbHlQcm9qZWN0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5hcHBseU1hdHJpeDQoIG0gKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChhKX0sCmZyb21BdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIik7cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGMsZSl9LGRpc3RhbmNlVG9NYW5oYXR0YW46ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKGEpfSxsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKHAucHJvdG90eXBlLAp7ZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsYyxlKX0sbGVuZ3RoTWFuaGF0dGFuOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuIik7cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCl9fSk7T2JqZWN0LmFzc2lnbih5YS5wcm90b3R5cGUse2NvbXB1dGVUYW5nZW50czpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sY29tcHV0ZUxpbmVEaXN0YW5jZXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBpbnN0ZWFkLiIpfX0pOwpPYmplY3QuYXNzaWduKEEucHJvdG90eXBlLHtnZXRDaGlsZEJ5TmFtZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4iKTtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeU5hbWUoYSl9LHJlbmRlckRlcHRoOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGluc3RlYWQuIil9LHRyYW5zbGF0ZTpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhjLGEpfSxnZXRXb3JsZFJvdGF0aW9uOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFJvdGF0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk9iamVjdDNELmdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkgaW5zdGVhZC4iKX19KTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQS5wcm90b3R5cGUse2V1bGVyT3JkZXI6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIik7cmV0dXJuIHRoaXMucm90YXRpb24ub3JkZXJ9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLiIpO3RoaXMucm90YXRpb24ub3JkZXI9YX19LHVzZVF1YXRlcm5pb246e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuIil9fX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhBZi5wcm90b3R5cGUse29iamVjdHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTE9EOiAub2JqZWN0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5sZXZlbHMuIik7cmV0dXJuIHRoaXMubGV2ZWxzfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2cucHJvdG90eXBlLCJ1c2VWZXJ0ZXhUZXh0dXJlIix7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7QmYucHJvdG90eXBlLmluaXRCb25lcz1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoOiBpbml0Qm9uZXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWmEucHJvdG90eXBlLAoiX19hcmNMZW5ndGhEaXZpc2lvbnMiLHtnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuIik7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLiIpO3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWF9fSk7dmIucHJvdG90eXBlLnNldExlbnM9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuIik7dm9pZCAwIT09YyYmKHRoaXMuZmlsbUdhdWdlPWMpO3RoaXMuc2V0Rm9jYWxMZW5ndGgoYSl9O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEpiLnByb3RvdHlwZSwKe29ubHlTaGFkb3c6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5vbmx5U2hhZG93IGhhcyBiZWVuIHJlbW92ZWQuIil9fSxzaGFkb3dDYW1lcmFGb3Y6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRm92IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mb3YuIik7dGhpcy5zaGFkb3cuY2FtZXJhLmZvdj1hfX0sc2hhZG93Q2FtZXJhTGVmdDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LiIpO3RoaXMuc2hhZG93LmNhbWVyYS5sZWZ0PWF9fSxzaGFkb3dDYW1lcmFSaWdodDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFSaWdodCBpcyBub3cgLnNoYWRvdy5jYW1lcmEucmlnaHQuIik7dGhpcy5zaGFkb3cuY2FtZXJhLnJpZ2h0PWF9fSxzaGFkb3dDYW1lcmFUb3A6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVG9wIGlzIG5vdyAuc2hhZG93LmNhbWVyYS50b3AuIik7CnRoaXMuc2hhZG93LmNhbWVyYS50b3A9YX19LHNoYWRvd0NhbWVyYUJvdHRvbTp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tPWF9fSxzaGFkb3dDYW1lcmFOZWFyOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuIik7dGhpcy5zaGFkb3cuY2FtZXJhLm5lYXI9YX19LHNoYWRvd0NhbWVyYUZhcjp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuZmFyPWF9fSxzaGFkb3dDYW1lcmFWaXNpYmxlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuIil9fSwKc2hhZG93Qmlhczp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuIik7dGhpcy5zaGFkb3cuYmlhcz1hfX0sc2hhZG93RGFya25lc3M6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sc2hhZG93TWFwV2lkdGg6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4iKTt0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoPWF9fSxzaGFkb3dNYXBIZWlnaHQ6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwSGVpZ2h0IGlzIG5vdyAuc2hhZG93Lm1hcFNpemUuaGVpZ2h0LiIpO3RoaXMuc2hhZG93Lm1hcFNpemUuaGVpZ2h0PWF9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFEucHJvdG90eXBlLAp7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmxlbmd0aCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmNvdW50IGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RofX0sY29weUluZGljZXNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5hc3NpZ24odmEucHJvdG90eXBlLHthZGRJbmRleDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkSW5kZXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRJbmRleCgpLiIpO3RoaXMuc2V0SW5kZXgoYSl9LGFkZERyYXdDYWxsOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuIik7CmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIGlzIG5vdyAuYWRkR3JvdXAoKS4iKTt0aGlzLmFkZEdyb3VwKGEsYyl9LGNsZWFyRHJhd0NhbGxzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLiIpO3RoaXMuY2xlYXJHcm91cHMoKX0sY29tcHV0ZVRhbmdlbnRzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGNvbXB1dGVPZmZzZXRzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVPZmZzZXRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh2YS5wcm90b3R5cGUse2RyYXdjYWxsczp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLiIpOwpyZXR1cm4gdGhpcy5ncm91cHN9fSxvZmZzZXRzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuIik7cmV0dXJuIHRoaXMuZ3JvdXBzfX19KTtPYmplY3QuYXNzaWduKFJjLnByb3RvdHlwZSx7Z2V0QXJyYXlzOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuZ2V0QXJyYXlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkU2hhcGVMaXN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuYWRkU2hhcGVMaXN0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkU2hhcGU6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYmgucHJvdG90eXBlLAp7ZHluYW1pYzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiAuZHluYW1pYyBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4iKX19LG9uVXBkYXRlOnt2YWx1ZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVW5pZm9ybTogLm9uVXBkYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuIik7cmV0dXJuIHRoaXN9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE0ucHJvdG90eXBlLHt3cmFwQXJvdW5kOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfX0sb3ZlcmRyYXc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC5vdmVyZHJhdyBoYXMgYmVlbiByZW1vdmVkLiIpfSwKc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogLm92ZXJkcmF3IGhhcyBiZWVuIHJlbW92ZWQuIil9fSx3cmFwUkdCOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLiIpO3JldHVybiBuZXcgSX19LHNoYWRpbmc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpO3RoaXMuZmxhdFNoYWRpbmc9MT09PWF9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEJjLnByb3RvdHlwZSx7bWV0YWw6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZC4iKTsKcmV0dXJuITF9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZCIpfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhxYi5wcm90b3R5cGUse2Rlcml2YXRpdmVzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlc30sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIik7dGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzPWF9fX0pO09iamVjdC5hc3NpZ24oT2gucHJvdG90eXBlLAp7Y2xlYXJUYXJnZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuY2xlYXJUYXJnZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGFuZCAuY2xlYXIoKSBpbnN0ZWFkLiIpO3RoaXMuc2V0UmVuZGVyVGFyZ2V0KGEpO3RoaXMuY2xlYXIoYyxlLGcpfSxhbmltYXRlOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFuaW1hdGUoKSBpcyBub3cgLnNldEFuaW1hdGlvbkxvb3AoKS4iKTt0aGlzLnNldEFuaW1hdGlvbkxvb3AoYSl9LGdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4iKTtyZXR1cm4gdGhpcy5nZXRSZW5kZXJUYXJnZXQoKX0sZ2V0TWF4QW5pc290cm9weTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldE1heEFuaXNvdHJvcHkoKSBpcyBub3cgLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkuIik7CnJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCl9LGdldFByZWNpc2lvbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldFByZWNpc2lvbigpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnByZWNpc2lvbi4iKTtyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMucHJlY2lzaW9ufSxyZXNldEdMU3RhdGU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5yZXNldEdMU3RhdGUoKSBpcyBub3cgLnN0YXRlLnJlc2V0KCkuIik7cmV0dXJuIHRoaXMuc3RhdGUucmVzZXQoKX0sc3VwcG9ydHNGbG9hdFRleHR1cmVzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdCIpfSwKc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpfSxzdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMiKX0sc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKS4iKTsKcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil9LHN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQzpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpfSxzdXBwb3J0c0JsZW5kTWluTWF4OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNCbGVuZE1pbk1heCgpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iil9LHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1ZlcnRleFRleHR1cmVzKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMuIik7CnJldHVybiB0aGlzLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlc30sc3VwcG9ydHNJbnN0YW5jZWRBcnJheXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0luc3RhbmNlZEFycmF5cygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIil9LGVuYWJsZVNjaXNzb3JUZXN0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLiIpO3RoaXMuc2V0U2Npc3NvclRlc3QoYSl9LGluaXRNYXRlcmlhbDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmluaXRNYXRlcmlhbCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFkZFByZVBsdWdpbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFByZVBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LAphZGRQb3N0UGx1Z2luOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUG9zdFBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHVwZGF0ZVNoYWRvd01hcDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnVwZGF0ZVNoYWRvd01hcCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldEZhY2VDdWxsaW5nOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0RmFjZUN1bGxpbmcoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhbGxvY1RleHR1cmVVbml0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWxsb2NUZXh0dXJlVW5pdCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldFRleHR1cmU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0VGV4dHVyZTJEOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZTJEKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCnNldFRleHR1cmVDdWJlOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZUN1YmUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxnZXRBY3RpdmVNaXBNYXBMZXZlbDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEFjdGl2ZU1pcE1hcExldmVsKCkgaXMgbm93IC5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpLiIpO3JldHVybiB0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsKCl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoT2gucHJvdG90eXBlLHtzaGFkb3dNYXBFbmFibGVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaGFkb3dNYXAuZW5hYmxlZH0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJsZWQgaXMgbm93IC5zaGFkb3dNYXAuZW5hYmxlZC4iKTt0aGlzLnNoYWRvd01hcC5lbmFibGVkPWF9fSxzaGFkb3dNYXBUeXBlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZX0sCnNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBUeXBlIGlzIG5vdyAuc2hhZG93TWFwLnR5cGUuIik7dGhpcy5zaGFkb3dNYXAudHlwZT1hfX0sc2hhZG93TWFwQ3VsbEZhY2U6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxjb250ZXh0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5jb250ZXh0IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZ2V0Q29udGV4dCgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuZ2V0Q29udGV4dCgpfX19KTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXModmoucHJvdG90eXBlLHtjdWxsRmFjZTp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0scmVuZGVyUmV2ZXJzZVNpZGVkOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19LApyZW5kZXJTaW5nbGVTaWRlZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhOYi5wcm90b3R5cGUse2FjdGl2ZUN1YmVGYWNlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZTogLmFjdGl2ZUN1YmVGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGlzIG5vdyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiBXZWJHTFJlbmRlcmVyLnNldFJlbmRlclRhcmdldCgpLiIpfX0sCmFjdGl2ZU1pcE1hcExldmVsOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZTogLmFjdGl2ZU1pcE1hcExldmVsIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGlzIG5vdyB0aGUgdGhpcmQgcGFyYW1ldGVyIG9mIFdlYkdMUmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCkuIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG0ucHJvdG90eXBlLHt3cmFwUzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4iKTt0aGlzLnRleHR1cmUud3JhcFM9YX19LHdyYXBUOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULiIpOwpyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4iKTt0aGlzLnRleHR1cmUud3JhcFQ9YX19LG1hZ0ZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpO3JldHVybiB0aGlzLnRleHR1cmUubWFnRmlsdGVyfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpO3RoaXMudGV4dHVyZS5tYWdGaWx0ZXI9YX19LG1pbkZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpO3JldHVybiB0aGlzLnRleHR1cmUubWluRmlsdGVyfSwKc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4iKTt0aGlzLnRleHR1cmUubWluRmlsdGVyPWF9fSxhbmlzb3Ryb3B5OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLmFuaXNvdHJvcHl9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKTt0aGlzLnRleHR1cmUuYW5pc290cm9weT1hfX0sb2Zmc2V0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXR9LApzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9mZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LiIpO3RoaXMudGV4dHVyZS5vZmZzZXQ9YX19LHJlcGVhdDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LiIpO3JldHVybiB0aGlzLnRleHR1cmUucmVwZWF0fSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LiIpO3RoaXMudGV4dHVyZS5yZXBlYXQ9YX19LGZvcm1hdDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LiIpO3JldHVybiB0aGlzLnRleHR1cmUuZm9ybWF0fSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LiIpOwp0aGlzLnRleHR1cmUuZm9ybWF0PWF9fSx0eXBlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLnR5cGV9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKTt0aGlzLnRleHR1cmUudHlwZT1hfX0sZ2VuZXJhdGVNaXBtYXBzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHN9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIik7CnRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9YX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTmgucHJvdG90eXBlLHtzdGFuZGluZzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJWUk1hbmFnZXI6IC5zdGFuZGluZyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sdXNlckhlaWdodDp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJWUk1hbmFnZXI6IC51c2VySGVpZ2h0IGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pO1dlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IC5sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5BdWRpb0xvYWRlciBpbnN0ZWFkLiIpO3ZhciBjPXRoaXM7KG5ldyAkZykubG9hZChhLGZ1bmN0aW9uKGUpe2Muc2V0QnVmZmVyKGUpfSk7cmV0dXJuIHRoaXN9O29pLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpb0FuYWx5c2VyOiAuZ2V0RGF0YSgpIGlzIG5vdyAuZ2V0RnJlcXVlbmN5RGF0YSgpLiIpOwpyZXR1cm4gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCl9O0diLnByb3RvdHlwZS51cGRhdGVDdWJlTWFwPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5DdWJlQ2FtZXJhOiAudXBkYXRlQ3ViZU1hcCgpIGlzIG5vdyAudXBkYXRlKCkuIik7cmV0dXJuIHRoaXMudXBkYXRlKGEsYyl9O0RkLmNyb3NzT3JpZ2luPXZvaWQgMDtEZC5sb2FkVGV4dHVyZT1mdW5jdGlvbihhLGMsZSxnKXtjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLlRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLiIpO3ZhciByPW5ldyBNZztyLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2E9ci5sb2FkKGEsZSx2b2lkIDAsZyk7YyYmKGEubWFwcGluZz1jKTtyZXR1cm4gYX07RGQubG9hZFRleHR1cmVDdWJlPWZ1bmN0aW9uKGEsYyxlLGcpe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkN1YmVUZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4iKTsKdmFyIHI9bmV3IExnO3Iuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7YT1yLmxvYWQoYSxlLHZvaWQgMCxnKTtjJiYoYS5tYXBwaW5nPWMpO3JldHVybiBhfTtEZC5sb2FkQ29tcHJlc3NlZFRleHR1cmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuIil9O0RkLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkREU0xvYWRlciBpbnN0ZWFkLiIpfTtiLkFDRVNGaWxtaWNUb25lTWFwcGluZz01O2IuQWRkRXF1YXRpb249MTAwO2IuQWRkT3BlcmF0aW9uPTI7Yi5BZGRpdGl2ZUJsZW5kaW5nPTI7Yi5BbHBoYUZvcm1hdD0xMDIxO2IuQWx3YXlzRGVwdGg9CjE7Yi5BbHdheXNTdGVuY2lsRnVuYz01MTk7Yi5BbWJpZW50TGlnaHQ9VGc7Yi5BbWJpZW50TGlnaHRQcm9iZT1qaTtiLkFuaW1hdGlvbkNsaXA9dGM7Yi5BbmltYXRpb25Mb2FkZXI9YWk7Yi5BbmltYXRpb25NaXhlcj1xaTtiLkFuaW1hdGlvbk9iamVjdEdyb3VwPVNqO2IuQW5pbWF0aW9uVXRpbHM9VGI7Yi5BcmNDdXJ2ZT1WZTtiLkFycmF5Q2FtZXJhPXZmO2IuQXJyb3dIZWxwZXI9aWQ7Yi5BdWRpbz1XZTtiLkF1ZGlvQW5hbHlzZXI9b2k7Yi5BdWRpb0NvbnRleHQ9bWk7Yi5BdWRpb0xpc3RlbmVyPWxpO2IuQXVkaW9Mb2FkZXI9JGc7Yi5BeGVzSGVscGVyPWlnO2IuQXhpc0hlbHBlcj1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkF4aXNIZWxwZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5BeGVzSGVscGVyLiIpO3JldHVybiBuZXcgaWcoYSl9O2IuQmFja1NpZGU9MTtiLkJhc2ljRGVwdGhQYWNraW5nPTMyMDA7Yi5CYXNpY1NoYWRvd01hcD0wO2IuQmluYXJ5VGV4dHVyZUxvYWRlcj0KZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5CaW5hcnlUZXh0dXJlTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRGF0YVRleHR1cmVMb2FkZXIuIik7cmV0dXJuIG5ldyBLZyhhKX07Yi5Cb25lPVVoO2IuQm9vbGVhbktleWZyYW1lVHJhY2s9R2c7Yi5Cb3VuZGluZ0JveEhlbHBlcj1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuQm91bmRpbmdCb3hIZWxwZXIgaGFzIGJlZW4gZGVwcmVjYXRlZC4gQ3JlYXRpbmcgYSBUSFJFRS5Cb3hIZWxwZXIgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGhkKGEsYyl9O2IuQm94Mj10aTtiLkJveDM9dztiLkJveDNIZWxwZXI9Z2c7Yi5Cb3hCdWZmZXJHZW9tZXRyeT1YYTtiLkJveEdlb21ldHJ5PVNhO2IuQm94SGVscGVyPWhkO2IuQnVmZmVyQXR0cmlidXRlPVE7Yi5CdWZmZXJHZW9tZXRyeT12YTtiLkJ1ZmZlckdlb21ldHJ5TG9hZGVyPVlnO2IuQnl0ZVR5cGU9MTAxMDtiLkNhY2hlPWllO2IuQ2FtZXJhPXpiO2IuQ2FtZXJhSGVscGVyPQpmZztiLkNhbnZhc1JlbmRlcmVyPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQ2FudmFzUmVuZGVyZXIgaGFzIGJlZW4gcmVtb3ZlZCIpfTtiLkNhbnZhc1RleHR1cmU9Q2Y7Yi5DYXRtdWxsUm9tQ3VydmUzPVpiO2IuQ2luZW9uVG9uZU1hcHBpbmc9NDtiLkNpcmNsZUJ1ZmZlckdlb21ldHJ5PVFlO2IuQ2lyY2xlR2VvbWV0cnk9WGY7Yi5DbGFtcFRvRWRnZVdyYXBwaW5nPTEwMDE7Yi5DbG9jaz1raTtiLkNsb3NlZFNwbGluZUN1cnZlMz1aajtiLkNvbG9yPUk7Yi5Db2xvcktleWZyYW1lVHJhY2s9SGc7Yi5Db21wcmVzc2VkVGV4dHVyZT1EZTtiLkNvbXByZXNzZWRUZXh0dXJlTG9hZGVyPWJpO2IuQ29uZUJ1ZmZlckdlb21ldHJ5PVdmO2IuQ29uZUdlb21ldHJ5PVZmO2IuQ3ViZUNhbWVyYT1HYjtiLkN1YmVHZW9tZXRyeT1TYTtiLkN1YmVSZWZsZWN0aW9uTWFwcGluZz0zMDE7Yi5DdWJlUmVmcmFjdGlvbk1hcHBpbmc9MzAyO2IuQ3ViZVRleHR1cmU9Y2Q7Yi5DdWJlVGV4dHVyZUxvYWRlcj0KTGc7Yi5DdWJlVVZSZWZsZWN0aW9uTWFwcGluZz0zMDY7Yi5DdWJlVVZSZWZyYWN0aW9uTWFwcGluZz0zMDc7Yi5DdWJpY0JlemllckN1cnZlPUNjO2IuQ3ViaWNCZXppZXJDdXJ2ZTM9VGM7Yi5DdWJpY0ludGVycG9sYW50PUVnO2IuQ3VsbEZhY2VCYWNrPTE7Yi5DdWxsRmFjZUZyb250PTI7Yi5DdWxsRmFjZUZyb250QmFjaz0zO2IuQ3VsbEZhY2VOb25lPTA7Yi5DdXJ2ZT1aYTtiLkN1cnZlUGF0aD1nZDtiLkN1c3RvbUJsZW5kaW5nPTU7Yi5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5PWZkO2IuQ3lsaW5kZXJHZW9tZXRyeT1YZDtiLkN5bGluZHJpY2FsPVhqO2IuRGF0YVRleHR1cmU9QWI7Yi5EYXRhVGV4dHVyZTJEQXJyYXk9cmU7Yi5EYXRhVGV4dHVyZTNEPXNlO2IuRGF0YVRleHR1cmVMb2FkZXI9S2c7Yi5EZWNyZW1lbnRTdGVuY2lsT3A9NzY4MztiLkRlY3JlbWVudFdyYXBTdGVuY2lsT3A9MzQwNTY7Yi5EZWZhdWx0TG9hZGluZ01hbmFnZXI9T2o7Yi5EZXB0aEZvcm1hdD0xMDI2OwpiLkRlcHRoU3RlbmNpbEZvcm1hdD0xMDI3O2IuRGVwdGhUZXh0dXJlPURmO2IuRGlyZWN0aW9uYWxMaWdodD1TZztiLkRpcmVjdGlvbmFsTGlnaHRIZWxwZXI9ZGY7Yi5EaXJlY3Rpb25hbExpZ2h0U2hhZG93PVJnO2IuRGlzY3JldGVJbnRlcnBvbGFudD1GZztiLkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5PUllO2IuRG9kZWNhaGVkcm9uR2VvbWV0cnk9SmY7Yi5Eb3VibGVTaWRlPTI7Yi5Ec3RBbHBoYUZhY3Rvcj0yMDY7Yi5Ec3RDb2xvckZhY3Rvcj0yMDg7Yi5EeW5hbWljQnVmZmVyQXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5EeW5hbWljQnVmZmVyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKCkuc2V0RHluYW1pYyggdHJ1ZSApIGluc3RlYWQuIik7cmV0dXJuKG5ldyBRKGEsYykpLnNldER5bmFtaWMoITApfTtiLkVkZ2VzR2VvbWV0cnk9UGU7Yi5FZGdlc0hlbHBlcj1mdW5jdGlvbihhLApjKXtjb25zb2xlLndhcm4oIlRIUkVFLkVkZ2VzSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5FZGdlc0dlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBJYihuZXcgUGUoYS5nZW9tZXRyeSksbmV3IEZiKHtjb2xvcjp2b2lkIDAhPT1jP2M6MTY3NzcyMTV9KSl9O2IuRWxsaXBzZUN1cnZlPXBjO2IuRXF1YWxEZXB0aD00O2IuRXF1YWxTdGVuY2lsRnVuYz01MTQ7Yi5FcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZz0zMDM7Yi5FcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZz0zMDQ7Yi5FdWxlcj11O2IuRXZlbnREaXNwYXRjaGVyPWQ7Yi5FeHRydWRlQnVmZmVyR2VvbWV0cnk9UmM7Yi5FeHRydWRlR2VvbWV0cnk9VWQ7Yi5GYWNlMz1LO2IuRmFjZTQ9ZnVuY3Rpb24oYSxjLGUsZyxyLHYseil7Y29uc29sZS53YXJuKCJUSFJFRS5GYWNlNCBoYXMgYmVlbiByZW1vdmVkLiBBIFRIUkVFLkZhY2UzIHdpbGwgYmUgY3JlYXRlZCBpbnN0ZWFkLiIpO3JldHVybiBuZXcgSyhhLApjLGUscix2LHopfTtiLkZhY2VDb2xvcnM9MTtiLkZhY2VOb3JtYWxzSGVscGVyPWVnO2IuRmlsZUxvYWRlcj11YztiLkZsYXRTaGFkaW5nPTE7Yi5GbG9hdDMyQXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBjYShhLGMpfTtiLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU9Y2E7Yi5GbG9hdDY0QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBrYShhLGMpfTtiLkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU9a2E7Yi5GbG9hdFR5cGU9MTAxNTtiLkZvZz1BZztiLkZvZ0V4cDI9emc7Yi5Gb250PWdpOwpiLkZvbnRMb2FkZXI9aGk7Yi5Gcm9udEZhY2VEaXJlY3Rpb25DQ1c9MTtiLkZyb250RmFjZURpcmVjdGlvbkNXPTA7Yi5Gcm9udFNpZGU9MDtiLkZydXN0dW09aWM7Yi5HYW1tYUVuY29kaW5nPTMwMDc7Yi5HZW9tZXRyeT15YTtiLkdlb21ldHJ5VXRpbHM9e21lcmdlOmZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgaW5zdGVhZC4iKTtpZihjLmlzTWVzaCl7Yy5tYXRyaXhBdXRvVXBkYXRlJiZjLnVwZGF0ZU1hdHJpeCgpO3ZhciBnPWMubWF0cml4O2M9Yy5nZW9tZXRyeX1hLm1lcmdlKGMsZyxlKX0sY2VudGVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuR2VvbWV0cnlVdGlsczogLmNlbnRlcigpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkuY2VudGVyKCkgaW5zdGVhZC4iKTsKcmV0dXJuIGEuY2VudGVyKCl9fTtiLkdyZWF0ZXJEZXB0aD02O2IuR3JlYXRlckVxdWFsRGVwdGg9NTtiLkdyZWF0ZXJFcXVhbFN0ZW5jaWxGdW5jPTUxODtiLkdyZWF0ZXJTdGVuY2lsRnVuYz01MTY7Yi5HcmlkSGVscGVyPWNoO2IuR3JvdXA9dWU7Yi5IYWxmRmxvYXRUeXBlPTEwMTY7Yi5IZW1pc3BoZXJlTGlnaHQ9Tmc7Yi5IZW1pc3BoZXJlTGlnaHRIZWxwZXI9YWY7Yi5IZW1pc3BoZXJlTGlnaHRQcm9iZT1paTtiLkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk9SGU7Yi5JY29zYWhlZHJvbkdlb21ldHJ5PUlmO2IuSW1hZ2VCaXRtYXBMb2FkZXI9ZWk7Yi5JbWFnZUxvYWRlcj1VZTtiLkltYWdlVXRpbHM9RGQ7Yi5JbW1lZGlhdGVSZW5kZXJPYmplY3Q9Y2c7Yi5JbmNyZW1lbnRTdGVuY2lsT3A9NzY4MjtiLkluY3JlbWVudFdyYXBTdGVuY2lsT3A9MzQwNTU7Yi5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9WGc7Yi5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT1XZztiLkluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPQpyaTtiLkludDE2QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQxNkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGxhKGEsYyl9O2IuSW50MTZCdWZmZXJBdHRyaWJ1dGU9bGE7Yi5JbnQzMkF0dHJpYnV0ZT1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBiYShhLGMpfTtiLkludDMyQnVmZmVyQXR0cmlidXRlPWJhO2IuSW50OEF0dHJpYnV0ZT1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuSW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgVChhLApjKX07Yi5JbnQ4QnVmZmVyQXR0cmlidXRlPVQ7Yi5JbnRUeXBlPTEwMTM7Yi5JbnRlcmxlYXZlZEJ1ZmZlcj1RZDtiLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlPXhmO2IuSW50ZXJwb2xhbnQ9b2M7Yi5JbnRlcnBvbGF0ZURpc2NyZXRlPTIzMDA7Yi5JbnRlcnBvbGF0ZUxpbmVhcj0yMzAxO2IuSW50ZXJwb2xhdGVTbW9vdGg9MjMwMjtiLkludmVydFN0ZW5jaWxPcD01Mzg2O2IuSlNPTkxvYWRlcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkpTT05Mb2FkZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKX07Yi5LZWVwU3RlbmNpbE9wPTc2ODA7Yi5LZXlmcmFtZVRyYWNrPVhiO2IuTE9EPUFmO2IuTGF0aGVCdWZmZXJHZW9tZXRyeT1PZTtiLkxhdGhlR2VvbWV0cnk9VWY7Yi5MYXllcnM9eDtiLkxlbnNGbGFyZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkxlbnNGbGFyZSBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvb2JqZWN0cy9MZW5zZmxhcmUuanMiKX07CmIuTGVzc0RlcHRoPTI7Yi5MZXNzRXF1YWxEZXB0aD0zO2IuTGVzc0VxdWFsU3RlbmNpbEZ1bmM9NTE1O2IuTGVzc1N0ZW5jaWxGdW5jPTUxMztiLkxpZ2h0PUpiO2IuTGlnaHRQcm9iZT1IYztiLkxpZ2h0UHJvYmVIZWxwZXI9YmY7Yi5MaWdodFNoYWRvdz1WYztiLkxpbmU9VmI7Yi5MaW5lMz11aTtiLkxpbmVCYXNpY01hdGVyaWFsPUZiO2IuTGluZUN1cnZlPWtjO2IuTGluZUN1cnZlMz1EYztiLkxpbmVEYXNoZWRNYXRlcmlhbD1kZTtiLkxpbmVMb29wPURnO2IuTGluZVBpZWNlcz0xO2IuTGluZVNlZ21lbnRzPUliO2IuTGluZVN0cmlwPTA7Yi5MaW5lYXJFbmNvZGluZz0zRTM7Yi5MaW5lYXJGaWx0ZXI9MTAwNjtiLkxpbmVhckludGVycG9sYW50PVlmO2IuTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyPTEwMDg7Yi5MaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyPTEwMDc7Yi5MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI9MTAwODtiLkxpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI9MTAwNzsKYi5MaW5lYXJUb25lTWFwcGluZz0xO2IuTG9hZGVyPURiO2IuTG9hZGVyVXRpbHM9UGk7Yi5Mb2FkaW5nTWFuYWdlcj0kaDtiLkxvZ0x1dkVuY29kaW5nPTMwMDM7Yi5Mb29wT25jZT0yMjAwO2IuTG9vcFBpbmdQb25nPTIyMDI7Yi5Mb29wUmVwZWF0PTIyMDE7Yi5MdW1pbmFuY2VBbHBoYUZvcm1hdD0xMDI1O2IuTHVtaW5hbmNlRm9ybWF0PTEwMjQ7Yi5NT1VTRT17TEVGVDowLE1JRERMRToxLFJJR0hUOjIsUk9UQVRFOjAsRE9MTFk6MSxQQU46Mn07Yi5NYXRlcmlhbD1NO2IuTWF0ZXJpYWxMb2FkZXI9Vmc7Yi5NYXRoPWhiO2IuTWF0cml4Mz10O2IuTWF0cml4ND1xO2IuTWF4RXF1YXRpb249MTA0O2IuTWVzaD14YTtiLk1lc2hCYXNpY01hdGVyaWFsPUw7Yi5NZXNoRGVwdGhNYXRlcmlhbD12ZDtiLk1lc2hEaXN0YW5jZU1hdGVyaWFsPXdkO2IuTWVzaEZhY2VNYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1lc2hGYWNlTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuIik7CnJldHVybiBhfTtiLk1lc2hMYW1iZXJ0TWF0ZXJpYWw9YmU7Yi5NZXNoTWF0Y2FwTWF0ZXJpYWw9Y2U7Yi5NZXNoTm9ybWFsTWF0ZXJpYWw9YWU7Yi5NZXNoUGhvbmdNYXRlcmlhbD1CYztiLk1lc2hQaHlzaWNhbE1hdGVyaWFsPVpkO2IuTWVzaFN0YW5kYXJkTWF0ZXJpYWw9U2M7Yi5NZXNoVG9vbk1hdGVyaWFsPSRkO2IuTWluRXF1YXRpb249MTAzO2IuTWlycm9yZWRSZXBlYXRXcmFwcGluZz0xMDAyO2IuTWl4T3BlcmF0aW9uPTE7Yi5NdWx0aU1hdGVyaWFsPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPVtdKTtjb25zb2xlLndhcm4oIlRIUkVFLk11bHRpTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuIik7YS5pc011bHRpTWF0ZXJpYWw9ITA7YS5tYXRlcmlhbHM9YTthLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGEuc2xpY2UoKX07cmV0dXJuIGF9O2IuTXVsdGlwbHlCbGVuZGluZz00O2IuTXVsdGlwbHlPcGVyYXRpb249MDtiLk5lYXJlc3RGaWx0ZXI9CjEwMDM7Yi5OZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyPTEwMDU7Yi5OZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcj0xMDA0O2IuTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcj0xMDA1O2IuTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI9MTAwNDtiLk5ldmVyRGVwdGg9MDtiLk5ldmVyU3RlbmNpbEZ1bmM9NTEyO2IuTm9CbGVuZGluZz0wO2IuTm9Db2xvcnM9MDtiLk5vVG9uZU1hcHBpbmc9MDtiLk5vcm1hbEJsZW5kaW5nPTE7Yi5Ob3RFcXVhbERlcHRoPTc7Yi5Ob3RFcXVhbFN0ZW5jaWxGdW5jPTUxNztiLk51bWJlcktleWZyYW1lVHJhY2s9U2U7Yi5PYmplY3QzRD1BO2IuT2JqZWN0TG9hZGVyPVpnO2IuT2JqZWN0U3BhY2VOb3JtYWxNYXA9MTtiLk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeT1SZDtiLk9jdGFoZWRyb25HZW9tZXRyeT1IZjtiLk9uZUZhY3Rvcj0yMDE7Yi5PbmVNaW51c0RzdEFscGhhRmFjdG9yPTIwNztiLk9uZU1pbnVzRHN0Q29sb3JGYWN0b3I9MjA5O2IuT25lTWludXNTcmNBbHBoYUZhY3Rvcj0KMjA1O2IuT25lTWludXNTcmNDb2xvckZhY3Rvcj0yMDM7Yi5PcnRob2dyYXBoaWNDYW1lcmE9Ymc7Yi5QQ0ZTaGFkb3dNYXA9MTtiLlBDRlNvZnRTaGFkb3dNYXA9MjtiLlBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeT1GZTtiLlBhcmFtZXRyaWNHZW9tZXRyeT1FZjtiLlBhcnRpY2xlPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUGFydGljbGUgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5TcHJpdGUuIik7cmV0dXJuIG5ldyB5ZihhKX07Yi5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IEFjKGEpfTtiLlBhcnRpY2xlU3lzdGVtPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4iKTtyZXR1cm4gbmV3IENlKGEsCmMpfTtiLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbU1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuIik7cmV0dXJuIG5ldyBBYyhhKX07Yi5QYXRoPUdjO2IuUGVyc3BlY3RpdmVDYW1lcmE9dmI7Yi5QbGFuZT1IYjtiLlBsYW5lQnVmZmVyR2VvbWV0cnk9TGM7Yi5QbGFuZUdlb21ldHJ5PXJkO2IuUGxhbmVIZWxwZXI9aGc7Yi5Qb2ludENsb3VkPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLiIpO3JldHVybiBuZXcgQ2UoYSxjKX07Yi5Qb2ludENsb3VkTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Qb2ludENsb3VkTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IEFjKGEpfTtiLlBvaW50TGlnaHQ9ClFnO2IuUG9pbnRMaWdodEhlbHBlcj1aZTtiLlBvaW50cz1DZTtiLlBvaW50c01hdGVyaWFsPUFjO2IuUG9sYXJHcmlkSGVscGVyPWRoO2IuUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5PWpjO2IuUG9seWhlZHJvbkdlb21ldHJ5PUZmO2IuUG9zaXRpb25hbEF1ZGlvPW5pO2IuUG9zaXRpb25hbEF1ZGlvSGVscGVyPWNmO2IuUHJvcGVydHlCaW5kaW5nPSRiO2IuUHJvcGVydHlNaXhlcj1waTtiLlF1YWRyYXRpY0JlemllckN1cnZlPUVjO2IuUXVhZHJhdGljQmV6aWVyQ3VydmUzPVVjO2IuUXVhdGVybmlvbj1oO2IuUXVhdGVybmlvbktleWZyYW1lVHJhY2s9WmY7Yi5RdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQ9SWc7Yi5SRVZJU0lPTj0iMTA4IjtiLlJHQkFEZXB0aFBhY2tpbmc9MzIwMTtiLlJHQkFGb3JtYXQ9MTAyMztiLlJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ9Mzc4MTk7Yi5SR0JBX0FTVENfMTB4NV9Gb3JtYXQ9Mzc4MTY7Yi5SR0JBX0FTVENfMTB4Nl9Gb3JtYXQ9Mzc4MTc7Yi5SR0JBX0FTVENfMTB4OF9Gb3JtYXQ9CjM3ODE4O2IuUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdD0zNzgyMDtiLlJHQkFfQVNUQ18xMngxMl9Gb3JtYXQ9Mzc4MjE7Yi5SR0JBX0FTVENfNHg0X0Zvcm1hdD0zNzgwODtiLlJHQkFfQVNUQ181eDRfRm9ybWF0PTM3ODA5O2IuUkdCQV9BU1RDXzV4NV9Gb3JtYXQ9Mzc4MTA7Yi5SR0JBX0FTVENfNng1X0Zvcm1hdD0zNzgxMTtiLlJHQkFfQVNUQ182eDZfRm9ybWF0PTM3ODEyO2IuUkdCQV9BU1RDXzh4NV9Gb3JtYXQ9Mzc4MTM7Yi5SR0JBX0FTVENfOHg2X0Zvcm1hdD0zNzgxNDtiLlJHQkFfQVNUQ184eDhfRm9ybWF0PTM3ODE1O2IuUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0PTM1ODQzO2IuUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0PTM1ODQyO2IuUkdCQV9TM1RDX0RYVDFfRm9ybWF0PTMzNzc3O2IuUkdCQV9TM1RDX0RYVDNfRm9ybWF0PTMzNzc4O2IuUkdCQV9TM1RDX0RYVDVfRm9ybWF0PTMzNzc5O2IuUkdCREVuY29kaW5nPTMwMDY7Yi5SR0JFRW5jb2Rpbmc9MzAwMjtiLlJHQkVGb3JtYXQ9CjEwMjM7Yi5SR0JGb3JtYXQ9MTAyMjtiLlJHQk0xNkVuY29kaW5nPTMwMDU7Yi5SR0JNN0VuY29kaW5nPTMwMDQ7Yi5SR0JfRVRDMV9Gb3JtYXQ9MzYxOTY7Yi5SR0JfUFZSVENfMkJQUFYxX0Zvcm1hdD0zNTg0MTtiLlJHQl9QVlJUQ180QlBQVjFfRm9ybWF0PTM1ODQwO2IuUkdCX1MzVENfRFhUMV9Gb3JtYXQ9MzM3NzY7Yi5SYXdTaGFkZXJNYXRlcmlhbD1SZTtiLlJheT1EO2IuUmF5Y2FzdGVyPVVqO2IuUmVjdEFyZWFMaWdodD1VZztiLlJlY3RBcmVhTGlnaHRIZWxwZXI9JGU7Yi5SZWRGb3JtYXQ9MTAyODtiLlJlaW5oYXJkVG9uZU1hcHBpbmc9MjtiLlJlcGVhdFdyYXBwaW5nPTFFMztiLlJlcGxhY2VTdGVuY2lsT3A9NzY4MTtiLlJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uPTEwMjtiLlJpbmdCdWZmZXJHZW9tZXRyeT1OZTtiLlJpbmdHZW9tZXRyeT1UZjtiLlNjZW5lPXk7Yi5TY2VuZVV0aWxzPXtjcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcyIpfSwKZGV0YWNoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcyIpfSxhdHRhY2g6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9fTtiLlNoYWRlckNodW5rPXJiO2IuU2hhZGVyTGliPU1jO2IuU2hhZGVyTWF0ZXJpYWw9cWI7Yi5TaGFkb3dNYXRlcmlhbD1ZZDtiLlNoYXBlPUNkO2IuU2hhcGVCdWZmZXJHZW9tZXRyeT1XZDtiLlNoYXBlR2VvbWV0cnk9VmQ7Yi5TaGFwZVBhdGg9Zmk7Yi5TaGFwZVV0aWxzPWVkO2IuU2hvcnRUeXBlPTEwMTE7Yi5Ta2VsZXRvbj1DZztiLlNrZWxldG9uSGVscGVyPVllO2IuU2tpbm5lZE1lc2g9QmY7Yi5TbW9vdGhTaGFkaW5nPTI7Yi5TcGhlcmU9RjtiLlNwaGVyZUJ1ZmZlckdlb21ldHJ5PUJkO2IuU3BoZXJlR2VvbWV0cnk9ClNmO2IuU3BoZXJpY2FsPVdqO2IuU3BoZXJpY2FsSGFybW9uaWNzMz1haDtiLlNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nPTMwNTtiLlNwbGluZT13aTtiLlNwbGluZUN1cnZlPUZjO2IuU3BsaW5lQ3VydmUzPWFrO2IuU3BvdExpZ2h0PVBnO2IuU3BvdExpZ2h0SGVscGVyPVhlO2IuU3BvdExpZ2h0U2hhZG93PU9nO2IuU3ByaXRlPXlmO2IuU3ByaXRlTWF0ZXJpYWw9QWQ7Yi5TcmNBbHBoYUZhY3Rvcj0yMDQ7Yi5TcmNBbHBoYVNhdHVyYXRlRmFjdG9yPTIxMDtiLlNyY0NvbG9yRmFjdG9yPTIwMjtiLlN0ZXJlb0NhbWVyYT1RajtiLlN0cmluZ0tleWZyYW1lVHJhY2s9Smc7Yi5TdWJ0cmFjdEVxdWF0aW9uPTEwMTtiLlN1YnRyYWN0aXZlQmxlbmRpbmc9MztiLlRPVUNIPXtST1RBVEU6MCxQQU46MSxET0xMWV9QQU46MixET0xMWV9ST1RBVEU6M307Yi5UYW5nZW50U3BhY2VOb3JtYWxNYXA9MDtiLlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk9R2U7Yi5UZXRyYWhlZHJvbkdlb21ldHJ5PQpHZjtiLlRleHRCdWZmZXJHZW9tZXRyeT1NZTtiLlRleHRHZW9tZXRyeT1SZjtiLlRleHR1cmU9bDtiLlRleHR1cmVMb2FkZXI9TWc7Yi5Ub3J1c0J1ZmZlckdlb21ldHJ5PUtlO2IuVG9ydXNHZW9tZXRyeT1NZjtiLlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5PUplO2IuVG9ydXNLbm90R2VvbWV0cnk9TGY7Yi5UcmlhbmdsZT1CO2IuVHJpYW5nbGVGYW5EcmF3TW9kZT0yO2IuVHJpYW5nbGVTdHJpcERyYXdNb2RlPTE7Yi5UcmlhbmdsZXNEcmF3TW9kZT0wO2IuVHViZUJ1ZmZlckdlb21ldHJ5PVNkO2IuVHViZUdlb21ldHJ5PUtmO2IuVVZNYXBwaW5nPTMwMDtiLlVpbnQxNkF0dHJpYnV0ZT1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuVWludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IFooYSxjKX07Yi5VaW50MTZCdWZmZXJBdHRyaWJ1dGU9WjtiLlVpbnQzMkF0dHJpYnV0ZT0KZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBlYShhLGMpfTtiLlVpbnQzMkJ1ZmZlckF0dHJpYnV0ZT1lYTtiLlVpbnQ4QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5VaW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IFgoYSxjKX07Yi5VaW50OEJ1ZmZlckF0dHJpYnV0ZT1YO2IuVWludDhDbGFtcGVkQXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5VaW50OENsYW1wZWRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgYWEoYSwKYyl9O2IuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlPWFhO2IuVW5jaGFydGVkMlRvbmVNYXBwaW5nPTM7Yi5Vbmlmb3JtPWJoO2IuVW5pZm9ybXNMaWI9V2E7Yi5Vbmlmb3Jtc1V0aWxzPUZtO2IuVW5zaWduZWRCeXRlVHlwZT0xMDA5O2IuVW5zaWduZWRJbnQyNDhUeXBlPTEwMjA7Yi5VbnNpZ25lZEludFR5cGU9MTAxNDtiLlVuc2lnbmVkU2hvcnQ0NDQ0VHlwZT0xMDE3O2IuVW5zaWduZWRTaG9ydDU1NTFUeXBlPTEwMTg7Yi5VbnNpZ25lZFNob3J0NTY1VHlwZT0xMDE5O2IuVW5zaWduZWRTaG9ydFR5cGU9MTAxMjtiLlZTTVNoYWRvd01hcD0zO2IuVmVjdG9yMj1mO2IuVmVjdG9yMz1rO2IuVmVjdG9yND1wO2IuVmVjdG9yS2V5ZnJhbWVUcmFjaz1UZTtiLlZlcnRleD1mdW5jdGlvbihhLGMsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZXJ0ZXggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLlZlY3RvcjMgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGsoYSxjLGUpfTtiLlZlcnRleENvbG9ycz0KMjtiLlZlcnRleE5vcm1hbHNIZWxwZXI9ZGc7Yi5WaWRlb1RleHR1cmU9WGg7Yi5XZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0PW47Yi5XZWJHTFJlbmRlclRhcmdldD1tO2IuV2ViR0xSZW5kZXJUYXJnZXRDdWJlPU5iO2IuV2ViR0xSZW5kZXJlcj1PaDtiLldlYkdMVXRpbHM9d2o7Yi5XaXJlZnJhbWVHZW9tZXRyeT1FZTtiLldpcmVmcmFtZUhlbHBlcj1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuV2lyZWZyYW1lSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5XaXJlZnJhbWVHZW9tZXRyeSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgSWIobmV3IEVlKGEuZ2VvbWV0cnkpLG5ldyBGYih7Y29sb3I6dm9pZCAwIT09Yz9jOjE2Nzc3MjE1fSkpfTtiLldyYXBBcm91bmRFbmRpbmc9MjQwMjtiLlhIUkxvYWRlcj1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlhIUkxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkZpbGVMb2FkZXIuIik7CnJldHVybiBuZXcgdWMoYSl9O2IuWmVyb0N1cnZhdHVyZUVuZGluZz0yNDAwO2IuWmVyb0ZhY3Rvcj0yMDA7Yi5aZXJvU2xvcGVFbmRpbmc9MjQwMTtiLlplcm9TdGVuY2lsT3A9MDtiLnNSR0JFbmNvZGluZz0zMDAxO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvT3JiaXRDb250cm9scy5qcwpUSFJFRS5PcmJpdENvbnRyb2xzPWZ1bmN0aW9uKGIsZCl7ZnVuY3Rpb24gZigpe3JldHVybiAyKk1hdGguUEkvNjAvNjAqWS5hdXRvUm90YXRlU3BlZWR9ZnVuY3Rpb24gaCgpe3JldHVybiBNYXRoLnBvdyguOTUsWS56b29tU3BlZWQpfWZ1bmN0aW9uIGsoc2Epe1hhLnRoZXRhLT1zYX1mdW5jdGlvbiB0KHNhKXtYYS5waGktPXNhfWZ1bmN0aW9uIGwoc2Epe1kub2JqZWN0LmlzUGVyc3BlY3RpdmVDYW1lcmE/dWIvPXNhOlkub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPyhZLm9iamVjdC56b29tPU1hdGgubWF4KFkubWluWm9vbSxNYXRoLm1pbihZLm1heFpvb20sWS5vYmplY3Quem9vbSpzYSkpLFkub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSxxYj0hMCk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4iKSxZLmVuYWJsZVpvb209ITEpfWZ1bmN0aW9uIHAoc2Epe1kub2JqZWN0LmlzUGVyc3BlY3RpdmVDYW1lcmE/CnViKj1zYTpZLm9iamVjdC5pc09ydGhvZ3JhcGhpY0NhbWVyYT8oWS5vYmplY3Quem9vbT1NYXRoLm1heChZLm1pblpvb20sTWF0aC5taW4oWS5tYXhab29tLFkub2JqZWN0Lnpvb20vc2EpKSxZLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkscWI9ITApOihjb25zb2xlLndhcm4oIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIGRvbGx5L3pvb20gZGlzYWJsZWQuIiksWS5lbmFibGVab29tPSExKX1mdW5jdGlvbiBtKHNhKXt6Yi5zZXQoc2EuY2xpZW50WCxzYS5jbGllbnRZKX1mdW5jdGlvbiBuKHNhKXtpYy5zZXQoc2EuY2xpZW50WCxzYS5jbGllbnRZKX1mdW5jdGlvbiBxKHNhKXtOYi5zZXQoc2EuY2xpZW50WCxzYS5jbGllbnRZKX1mdW5jdGlvbiB1KHNhKXt2Yi5zZXQoc2EuY2xpZW50WCxzYS5jbGllbnRZKTtHYi5zdWJWZWN0b3JzKHZiLHpiKS5tdWx0aXBseVNjYWxhcihZLnJvdGF0ZVNwZWVkKTtzYT0KWS5kb21FbGVtZW50PT09ZG9jdW1lbnQ/WS5kb21FbGVtZW50LmJvZHk6WS5kb21FbGVtZW50O2soMipNYXRoLlBJKkdiLngvc2EuY2xpZW50SGVpZ2h0KTt0KDIqTWF0aC5QSSpHYi55L3NhLmNsaWVudEhlaWdodCk7emIuY29weSh2Yik7WS51cGRhdGUoKX1mdW5jdGlvbiB4KHNhKXtiYy5zZXQoc2EuY2xpZW50WCxzYS5jbGllbnRZKTtPZC5zdWJWZWN0b3JzKGJjLGljKTswPE9kLnk/bChoKCkpOjA+T2QueSYmcChoKCkpO2ljLmNvcHkoYmMpO1kudXBkYXRlKCl9ZnVuY3Rpb24gQShzYSl7QWIuc2V0KHNhLmNsaWVudFgsc2EuY2xpZW50WSk7SGIuc3ViVmVjdG9ycyhBYixOYikubXVsdGlwbHlTY2FsYXIoWS5wYW5TcGVlZCk7c2QoSGIueCxIYi55KTtOYi5jb3B5KEFiKTtZLnVwZGF0ZSgpfWZ1bmN0aW9uIHkoKXt9ZnVuY3Rpb24gdyhzYSl7MD5zYS5kZWx0YVk/cChoKCkpOjA8c2EuZGVsdGFZJiZsKGgoKSk7WS51cGRhdGUoKX1mdW5jdGlvbiBDKHNhKXt2YXIgTWI9ITE7c3dpdGNoKHNhLmtleUNvZGUpe2Nhc2UgWS5rZXlzLlVQOnNkKDAsClkua2V5UGFuU3BlZWQpO01iPSEwO2JyZWFrO2Nhc2UgWS5rZXlzLkJPVFRPTTpzZCgwLC1ZLmtleVBhblNwZWVkKTtNYj0hMDticmVhaztjYXNlIFkua2V5cy5MRUZUOnNkKFkua2V5UGFuU3BlZWQsMCk7TWI9ITA7YnJlYWs7Y2FzZSBZLmtleXMuUklHSFQ6c2QoLVkua2V5UGFuU3BlZWQsMCksTWI9ITB9TWImJihzYS5wcmV2ZW50RGVmYXVsdCgpLFkudXBkYXRlKCkpfWZ1bmN0aW9uIEYoc2EpezE9PXNhLnRvdWNoZXMubGVuZ3RoP3piLnNldChzYS50b3VjaGVzWzBdLnBhZ2VYLHNhLnRvdWNoZXNbMF0ucGFnZVkpOnpiLnNldCguNSooc2EudG91Y2hlc1swXS5wYWdlWCtzYS50b3VjaGVzWzFdLnBhZ2VYKSwuNSooc2EudG91Y2hlc1swXS5wYWdlWStzYS50b3VjaGVzWzFdLnBhZ2VZKSl9ZnVuY3Rpb24gRChzYSl7MT09c2EudG91Y2hlcy5sZW5ndGg/TmIuc2V0KHNhLnRvdWNoZXNbMF0ucGFnZVgsc2EudG91Y2hlc1swXS5wYWdlWSk6TmIuc2V0KC41KihzYS50b3VjaGVzWzBdLnBhZ2VYKwpzYS50b3VjaGVzWzFdLnBhZ2VYKSwuNSooc2EudG91Y2hlc1swXS5wYWdlWStzYS50b3VjaGVzWzFdLnBhZ2VZKSl9ZnVuY3Rpb24gQihzYSl7dmFyIE1iPXNhLnRvdWNoZXNbMF0ucGFnZVgtc2EudG91Y2hlc1sxXS5wYWdlWDtzYT1zYS50b3VjaGVzWzBdLnBhZ2VZLXNhLnRvdWNoZXNbMV0ucGFnZVk7aWMuc2V0KDAsTWF0aC5zcXJ0KE1iKk1iK3NhKnNhKSl9ZnVuY3Rpb24gSShzYSl7WS5lbmFibGVab29tJiZCKHNhKTtZLmVuYWJsZVBhbiYmRChzYSl9ZnVuY3Rpb24gTihzYSl7WS5lbmFibGVab29tJiZCKHNhKTtZLmVuYWJsZVJvdGF0ZSYmRihzYSl9ZnVuY3Rpb24gTyhzYSl7MT09c2EudG91Y2hlcy5sZW5ndGg/dmIuc2V0KHNhLnRvdWNoZXNbMF0ucGFnZVgsc2EudG91Y2hlc1swXS5wYWdlWSk6dmIuc2V0KC41KihzYS50b3VjaGVzWzBdLnBhZ2VYK3NhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKTtHYi5zdWJWZWN0b3JzKHZiLAp6YikubXVsdGlwbHlTY2FsYXIoWS5yb3RhdGVTcGVlZCk7c2E9WS5kb21FbGVtZW50PT09ZG9jdW1lbnQ/WS5kb21FbGVtZW50LmJvZHk6WS5kb21FbGVtZW50O2soMipNYXRoLlBJKkdiLngvc2EuY2xpZW50SGVpZ2h0KTt0KDIqTWF0aC5QSSpHYi55L3NhLmNsaWVudEhlaWdodCk7emIuY29weSh2Yil9ZnVuY3Rpb24gSChzYSl7MT09c2EudG91Y2hlcy5sZW5ndGg/QWIuc2V0KHNhLnRvdWNoZXNbMF0ucGFnZVgsc2EudG91Y2hlc1swXS5wYWdlWSk6QWIuc2V0KC41KihzYS50b3VjaGVzWzBdLnBhZ2VYK3NhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKTtIYi5zdWJWZWN0b3JzKEFiLE5iKS5tdWx0aXBseVNjYWxhcihZLnBhblNwZWVkKTtzZChIYi54LEhiLnkpO05iLmNvcHkoQWIpfWZ1bmN0aW9uIEsoc2Epe3ZhciBNYj1zYS50b3VjaGVzWzBdLnBhZ2VYLXNhLnRvdWNoZXNbMV0ucGFnZVg7c2E9c2EudG91Y2hlc1swXS5wYWdlWS0Kc2EudG91Y2hlc1sxXS5wYWdlWTtiYy5zZXQoMCxNYXRoLnNxcnQoTWIqTWIrc2Eqc2EpKTtPZC5zZXQoMCxNYXRoLnBvdyhiYy55L2ljLnksWS56b29tU3BlZWQpKTtsKE9kLnkpO2ljLmNvcHkoYmMpfWZ1bmN0aW9uIE0oc2Epe1kuZW5hYmxlWm9vbSYmSyhzYSk7WS5lbmFibGVQYW4mJkgoc2EpfWZ1bmN0aW9uIEwoc2Epe1kuZW5hYmxlWm9vbSYmSyhzYSk7WS5lbmFibGVSb3RhdGUmJk8oc2EpfWZ1bmN0aW9uIFEoKXt9ZnVuY3Rpb24gVChzYSl7aWYoITEhPT1ZLmVuYWJsZWQpe3NhLnByZXZlbnREZWZhdWx0KCk7WS5kb21FbGVtZW50LmZvY3VzP1kuZG9tRWxlbWVudC5mb2N1cygpOndpbmRvdy5mb2N1cygpO3N3aXRjaChzYS5idXR0b24pe2Nhc2UgMDpzd2l0Y2goWS5tb3VzZUJ1dHRvbnMuTEVGVCl7Y2FzZSBUSFJFRS5NT1VTRS5ST1RBVEU6aWYoc2EuY3RybEtleXx8c2EubWV0YUtleXx8c2Euc2hpZnRLZXkpe2lmKCExPT09WS5lbmFibGVQYW4pcmV0dXJuO3Eoc2EpO0ZhPQpBYS5QQU59ZWxzZXtpZighMT09PVkuZW5hYmxlUm90YXRlKXJldHVybjttKHNhKTtGYT1BYS5ST1RBVEV9YnJlYWs7Y2FzZSBUSFJFRS5NT1VTRS5QQU46aWYoc2EuY3RybEtleXx8c2EubWV0YUtleXx8c2Euc2hpZnRLZXkpe2lmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURX1lbHNle2lmKCExPT09WS5lbmFibGVQYW4pcmV0dXJuO3Eoc2EpO0ZhPUFhLlBBTn1icmVhaztkZWZhdWx0OkZhPUFhLk5PTkV9YnJlYWs7Y2FzZSAxOnN3aXRjaChZLm1vdXNlQnV0dG9ucy5NSURETEUpe2Nhc2UgVEhSRUUuTU9VU0UuRE9MTFk6aWYoITE9PT1ZLmVuYWJsZVpvb20pcmV0dXJuO24oc2EpO0ZhPUFhLkRPTExZO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDI6c3dpdGNoKFkubW91c2VCdXR0b25zLlJJR0hUKXtjYXNlIFRIUkVFLk1PVVNFLlJPVEFURTppZighMT09PVkuZW5hYmxlUm90YXRlKXJldHVybjttKHNhKTtGYT1BYS5ST1RBVEU7CmJyZWFrO2Nhc2UgVEhSRUUuTU9VU0UuUEFOOmlmKCExPT09WS5lbmFibGVQYW4pcmV0dXJuO3Eoc2EpO0ZhPUFhLlBBTjticmVhaztkZWZhdWx0OkZhPUFhLk5PTkV9fUZhIT09QWEuTk9ORSYmKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsWCwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsYWEsITEpLFkuZGlzcGF0Y2hFdmVudCh2YSkpfX1mdW5jdGlvbiBYKHNhKXtpZighMSE9PVkuZW5hYmxlZClzd2l0Y2goc2EucHJldmVudERlZmF1bHQoKSxGYSl7Y2FzZSBBYS5ST1RBVEU6aWYoITE9PT1ZLmVuYWJsZVJvdGF0ZSlicmVhazt1KHNhKTticmVhaztjYXNlIEFhLkRPTExZOmlmKCExPT09WS5lbmFibGVab29tKWJyZWFrO3goc2EpO2JyZWFrO2Nhc2UgQWEuUEFOOiExIT09WS5lbmFibGVQYW4mJkEoc2EpfX1mdW5jdGlvbiBhYShzYSl7ITEhPT1ZLmVuYWJsZWQmJih5KHNhKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLApYLCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIixhYSwhMSksWS5kaXNwYXRjaEV2ZW50KHhhKSxGYT1BYS5OT05FKX1mdW5jdGlvbiBsYShzYSl7ITE9PT1ZLmVuYWJsZWR8fCExPT09WS5lbmFibGVab29tfHxGYSE9PUFhLk5PTkUmJkZhIT09QWEuUk9UQVRFfHwoc2EucHJldmVudERlZmF1bHQoKSxzYS5zdG9wUHJvcGFnYXRpb24oKSxZLmRpc3BhdGNoRXZlbnQodmEpLHcoc2EpLFkuZGlzcGF0Y2hFdmVudCh4YSkpfWZ1bmN0aW9uIFooc2EpeyExIT09WS5lbmFibGVkJiYhMSE9PVkuZW5hYmxlS2V5cyYmITEhPT1ZLmVuYWJsZVBhbiYmQyhzYSl9ZnVuY3Rpb24gYmEoc2Epe2lmKCExIT09WS5lbmFibGVkKXtzYS5wcmV2ZW50RGVmYXVsdCgpO3N3aXRjaChzYS50b3VjaGVzLmxlbmd0aCl7Y2FzZSAxOnN3aXRjaChZLnRvdWNoZXMuT05FKXtjYXNlIFRIUkVFLlRPVUNILlJPVEFURTppZighMT09PVkuZW5hYmxlUm90YXRlKXJldHVybjtGKHNhKTtGYT0KQWEuVE9VQ0hfUk9UQVRFO2JyZWFrO2Nhc2UgVEhSRUUuVE9VQ0guUEFOOmlmKCExPT09WS5lbmFibGVQYW4pcmV0dXJuO0Qoc2EpO0ZhPUFhLlRPVUNIX1BBTjticmVhaztkZWZhdWx0OkZhPUFhLk5PTkV9YnJlYWs7Y2FzZSAyOnN3aXRjaChZLnRvdWNoZXMuVFdPKXtjYXNlIFRIUkVFLlRPVUNILkRPTExZX1BBTjppZighMT09PVkuZW5hYmxlWm9vbSYmITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47SShzYSk7RmE9QWEuVE9VQ0hfRE9MTFlfUEFOO2JyZWFrO2Nhc2UgVEhSRUUuVE9VQ0guRE9MTFlfUk9UQVRFOmlmKCExPT09WS5lbmFibGVab29tJiYhMT09PVkuZW5hYmxlUm90YXRlKXJldHVybjtOKHNhKTtGYT1BYS5UT1VDSF9ET0xMWV9ST1RBVEU7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfWJyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1GYSE9PUFhLk5PTkUmJlkuZGlzcGF0Y2hFdmVudCh2YSl9fWZ1bmN0aW9uIGVhKHNhKXtpZighMSE9PVkuZW5hYmxlZClzd2l0Y2goc2EucHJldmVudERlZmF1bHQoKSwKc2Euc3RvcFByb3BhZ2F0aW9uKCksRmEpe2Nhc2UgQWEuVE9VQ0hfUk9UQVRFOmlmKCExPT09WS5lbmFibGVSb3RhdGUpYnJlYWs7TyhzYSk7WS51cGRhdGUoKTticmVhaztjYXNlIEFhLlRPVUNIX1BBTjppZighMT09PVkuZW5hYmxlUGFuKWJyZWFrO0goc2EpO1kudXBkYXRlKCk7YnJlYWs7Y2FzZSBBYS5UT1VDSF9ET0xMWV9QQU46aWYoITE9PT1ZLmVuYWJsZVpvb20mJiExPT09WS5lbmFibGVQYW4pYnJlYWs7TShzYSk7WS51cGRhdGUoKTticmVhaztjYXNlIEFhLlRPVUNIX0RPTExZX1JPVEFURTppZighMT09PVkuZW5hYmxlWm9vbSYmITE9PT1ZLmVuYWJsZVJvdGF0ZSlicmVhaztMKHNhKTtZLnVwZGF0ZSgpO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX19ZnVuY3Rpb24gY2Eoc2EpeyExIT09WS5lbmFibGVkJiYoUShzYSksWS5kaXNwYXRjaEV2ZW50KHhhKSxGYT1BYS5OT05FKX1mdW5jdGlvbiBrYShzYSl7ITEhPT1ZLmVuYWJsZWQmJnNhLnByZXZlbnREZWZhdWx0KCl9dGhpcy5vYmplY3Q9CmI7dGhpcy5kb21FbGVtZW50PXZvaWQgMCE9PWQ/ZDpkb2N1bWVudDt0aGlzLmVuYWJsZWQ9ITA7dGhpcy50YXJnZXQ9bmV3IFRIUkVFLlZlY3RvcjM7dGhpcy5taW5EaXN0YW5jZT0wO3RoaXMubWF4RGlzdGFuY2U9SW5maW5pdHk7dGhpcy5taW5ab29tPTA7dGhpcy5tYXhab29tPUluZmluaXR5O3RoaXMubWluUG9sYXJBbmdsZT0wO3RoaXMubWF4UG9sYXJBbmdsZT1NYXRoLlBJO3RoaXMubWluQXppbXV0aEFuZ2xlPS1JbmZpbml0eTt0aGlzLm1heEF6aW11dGhBbmdsZT1JbmZpbml0eTt0aGlzLmVuYWJsZURhbXBpbmc9ITE7dGhpcy5kYW1waW5nRmFjdG9yPS4wNTt0aGlzLmVuYWJsZVpvb209ITA7dGhpcy56b29tU3BlZWQ9MTt0aGlzLmVuYWJsZVJvdGF0ZT0hMDt0aGlzLnJvdGF0ZVNwZWVkPTE7dGhpcy5lbmFibGVQYW49ITA7dGhpcy5wYW5TcGVlZD0xO3RoaXMuc2NyZWVuU3BhY2VQYW5uaW5nPSExO3RoaXMua2V5UGFuU3BlZWQ9Nzt0aGlzLmF1dG9Sb3RhdGU9ITE7dGhpcy5hdXRvUm90YXRlU3BlZWQ9CjI7dGhpcy5lbmFibGVLZXlzPSEwO3RoaXMua2V5cz17TEVGVDozNyxVUDozOCxSSUdIVDozOSxCT1RUT006NDB9O3RoaXMubW91c2VCdXR0b25zPXtMRUZUOlRIUkVFLk1PVVNFLlJPVEFURSxNSURETEU6VEhSRUUuTU9VU0UuRE9MTFksUklHSFQ6VEhSRUUuTU9VU0UuUEFOfTt0aGlzLnRvdWNoZXM9e09ORTpUSFJFRS5UT1VDSC5ST1RBVEUsVFdPOlRIUkVFLlRPVUNILkRPTExZX1BBTn07dGhpcy50YXJnZXQwPXRoaXMudGFyZ2V0LmNsb25lKCk7dGhpcy5wb3NpdGlvbjA9dGhpcy5vYmplY3QucG9zaXRpb24uY2xvbmUoKTt0aGlzLnpvb20wPXRoaXMub2JqZWN0Lnpvb207dGhpcy5nZXRQb2xhckFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIFNhLnBoaX07dGhpcy5nZXRBemltdXRoYWxBbmdsZT1mdW5jdGlvbigpe3JldHVybiBTYS50aGV0YX07dGhpcy5zYXZlU3RhdGU9ZnVuY3Rpb24oKXtZLnRhcmdldDAuY29weShZLnRhcmdldCk7WS5wb3NpdGlvbjAuY29weShZLm9iamVjdC5wb3NpdGlvbik7Clkuem9vbTA9WS5vYmplY3Quem9vbX07dGhpcy5yZXNldD1mdW5jdGlvbigpe1kudGFyZ2V0LmNvcHkoWS50YXJnZXQwKTtZLm9iamVjdC5wb3NpdGlvbi5jb3B5KFkucG9zaXRpb24wKTtZLm9iamVjdC56b29tPVkuem9vbTA7WS5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1kuZGlzcGF0Y2hFdmVudChFYSk7WS51cGRhdGUoKTtGYT1BYS5OT05FfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBzYT1uZXcgVEhSRUUuVmVjdG9yMyxNYj0obmV3IFRIUkVFLlF1YXRlcm5pb24pLnNldEZyb21Vbml0VmVjdG9ycyhiLnVwLG5ldyBUSFJFRS5WZWN0b3IzKDAsMSwwKSksd2M9TWIuY2xvbmUoKS5pbnZlcnNlKCksYmQ9bmV3IFRIUkVFLlZlY3RvcjMsdGQ9bmV3IFRIUkVFLlF1YXRlcm5pb247cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHRnPVkub2JqZWN0LnBvc2l0aW9uO3NhLmNvcHkodGcpLnN1YihZLnRhcmdldCk7c2EuYXBwbHlRdWF0ZXJuaW9uKE1iKTtTYS5zZXRGcm9tVmVjdG9yMyhzYSk7ClkuYXV0b1JvdGF0ZSYmRmE9PT1BYS5OT05FJiZrKGYoKSk7WS5lbmFibGVEYW1waW5nPyhTYS50aGV0YSs9WGEudGhldGEqWS5kYW1waW5nRmFjdG9yLFNhLnBoaSs9WGEucGhpKlkuZGFtcGluZ0ZhY3Rvcik6KFNhLnRoZXRhKz1YYS50aGV0YSxTYS5waGkrPVhhLnBoaSk7U2EudGhldGE9TWF0aC5tYXgoWS5taW5BemltdXRoQW5nbGUsTWF0aC5taW4oWS5tYXhBemltdXRoQW5nbGUsU2EudGhldGEpKTtTYS5waGk9TWF0aC5tYXgoWS5taW5Qb2xhckFuZ2xlLE1hdGgubWluKFkubWF4UG9sYXJBbmdsZSxTYS5waGkpKTtTYS5tYWtlU2FmZSgpO1NhLnJhZGl1cyo9dWI7U2EucmFkaXVzPU1hdGgubWF4KFkubWluRGlzdGFuY2UsTWF0aC5taW4oWS5tYXhEaXN0YW5jZSxTYS5yYWRpdXMpKTshMD09PVkuZW5hYmxlRGFtcGluZz9ZLnRhcmdldC5hZGRTY2FsZWRWZWN0b3IoQmIsWS5kYW1waW5nRmFjdG9yKTpZLnRhcmdldC5hZGQoQmIpO3NhLnNldEZyb21TcGhlcmljYWwoU2EpO3NhLmFwcGx5UXVhdGVybmlvbih3Yyk7CnRnLmNvcHkoWS50YXJnZXQpLmFkZChzYSk7WS5vYmplY3QubG9va0F0KFkudGFyZ2V0KTshMD09PVkuZW5hYmxlRGFtcGluZz8oWGEudGhldGEqPTEtWS5kYW1waW5nRmFjdG9yLFhhLnBoaSo9MS1ZLmRhbXBpbmdGYWN0b3IsQmIubXVsdGlwbHlTY2FsYXIoMS1ZLmRhbXBpbmdGYWN0b3IpKTooWGEuc2V0KDAsMCwwKSxCYi5zZXQoMCwwLDApKTt1Yj0xO3JldHVybiBxYnx8YmQuZGlzdGFuY2VUb1NxdWFyZWQoWS5vYmplY3QucG9zaXRpb24pPnlhfHw4KigxLXRkLmRvdChZLm9iamVjdC5xdWF0ZXJuaW9uKSk+eWE/KFkuZGlzcGF0Y2hFdmVudChFYSksYmQuY29weShZLm9iamVjdC5wb3NpdGlvbiksdGQuY29weShZLm9iamVjdC5xdWF0ZXJuaW9uKSxxYj0hMSwhMCk6ITF9fSgpO3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe1kuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsa2EsITEpO1kuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLApULCExKTtZLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLGxhLCExKTtZLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsYmEsITEpO1kuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsY2EsITEpO1kuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGVhLCExKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLFgsITEpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGFhLCExKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsWiwhMSl9O3ZhciBZPXRoaXMsRWE9e3R5cGU6ImNoYW5nZSJ9LHZhPXt0eXBlOiJzdGFydCJ9LHhhPXt0eXBlOiJlbmQifSxBYT17Tk9ORTotMSxST1RBVEU6MCxET0xMWToxLFBBTjoyLFRPVUNIX1JPVEFURTozLFRPVUNIX1BBTjo0LFRPVUNIX0RPTExZX1BBTjo1LFRPVUNIX0RPTExZX1JPVEFURTo2fSwKRmE9QWEuTk9ORSx5YT0xRS02LFNhPW5ldyBUSFJFRS5TcGhlcmljYWwsWGE9bmV3IFRIUkVFLlNwaGVyaWNhbCx1Yj0xLEJiPW5ldyBUSFJFRS5WZWN0b3IzLHFiPSExLHpiPW5ldyBUSFJFRS5WZWN0b3IyLHZiPW5ldyBUSFJFRS5WZWN0b3IyLEdiPW5ldyBUSFJFRS5WZWN0b3IyLE5iPW5ldyBUSFJFRS5WZWN0b3IyLEFiPW5ldyBUSFJFRS5WZWN0b3IyLEhiPW5ldyBUSFJFRS5WZWN0b3IyLGljPW5ldyBUSFJFRS5WZWN0b3IyLGJjPW5ldyBUSFJFRS5WZWN0b3IyLE9kPW5ldyBUSFJFRS5WZWN0b3IyLHJkPWZ1bmN0aW9uKCl7dmFyIHNhPW5ldyBUSFJFRS5WZWN0b3IzO3JldHVybiBmdW5jdGlvbihNYix3Yyl7c2Euc2V0RnJvbU1hdHJpeENvbHVtbih3YywwKTtzYS5tdWx0aXBseVNjYWxhcigtTWIpO0JiLmFkZChzYSl9fSgpLExjPWZ1bmN0aW9uKCl7dmFyIHNhPW5ldyBUSFJFRS5WZWN0b3IzO3JldHVybiBmdW5jdGlvbihNYix3Yyl7ITA9PT1ZLnNjcmVlblNwYWNlUGFubmluZz8Kc2Euc2V0RnJvbU1hdHJpeENvbHVtbih3YywxKTooc2Euc2V0RnJvbU1hdHJpeENvbHVtbih3YywwKSxzYS5jcm9zc1ZlY3RvcnMoWS5vYmplY3QudXAsc2EpKTtzYS5tdWx0aXBseVNjYWxhcihNYik7QmIuYWRkKHNhKX19KCksc2Q9ZnVuY3Rpb24oKXt2YXIgc2E9bmV3IFRIUkVFLlZlY3RvcjM7cmV0dXJuIGZ1bmN0aW9uKE1iLHdjKXt2YXIgYmQ9WS5kb21FbGVtZW50PT09ZG9jdW1lbnQ/WS5kb21FbGVtZW50LmJvZHk6WS5kb21FbGVtZW50O2lmKFkub2JqZWN0LmlzUGVyc3BlY3RpdmVDYW1lcmEpe3NhLmNvcHkoWS5vYmplY3QucG9zaXRpb24pLnN1YihZLnRhcmdldCk7dmFyIHRkPXNhLmxlbmd0aCgpO3RkKj1NYXRoLnRhbihZLm9iamVjdC5mb3YvMipNYXRoLlBJLzE4MCk7cmQoMipNYip0ZC9iZC5jbGllbnRIZWlnaHQsWS5vYmplY3QubWF0cml4KTtMYygyKndjKnRkL2JkLmNsaWVudEhlaWdodCxZLm9iamVjdC5tYXRyaXgpfWVsc2UgWS5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/CihyZChNYiooWS5vYmplY3QucmlnaHQtWS5vYmplY3QubGVmdCkvWS5vYmplY3Quem9vbS9iZC5jbGllbnRXaWR0aCxZLm9iamVjdC5tYXRyaXgpLExjKHdjKihZLm9iamVjdC50b3AtWS5vYmplY3QuYm90dG9tKS9ZLm9iamVjdC56b29tL2JkLmNsaWVudEhlaWdodCxZLm9iamVjdC5tYXRyaXgpKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBwYW4gZGlzYWJsZWQuIiksWS5lbmFibGVQYW49ITEpfX0oKTtZLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGthLCExKTtZLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixULCExKTtZLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGxhLCExKTtZLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsYmEsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCmNhLCExKTtZLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixlYSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFosITEpO3RoaXMudXBkYXRlKCl9O1RIUkVFLk9yYml0Q29udHJvbHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVEhSRUUuRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSk7VEhSRUUuT3JiaXRDb250cm9scy5wcm90b3R5cGUuY29uc3RydWN0b3I9VEhSRUUuT3JiaXRDb250cm9scztUSFJFRS5NYXBDb250cm9scz1mdW5jdGlvbihiLGQpe1RIUkVFLk9yYml0Q29udHJvbHMuY2FsbCh0aGlzLGIsZCk7dGhpcy5tb3VzZUJ1dHRvbnMuTEVGVD1USFJFRS5NT1VTRS5QQU47dGhpcy5tb3VzZUJ1dHRvbnMuUklHSFQ9VEhSRUUuTU9VU0UuUk9UQVRFO3RoaXMudG91Y2hlcy5PTkU9VEhSRUUuVE9VQ0guUEFOO3RoaXMudG91Y2hlcy5UV089VEhSRUUuVE9VQ0guRE9MTFlfUk9UQVRFfTsKVEhSRUUuTWFwQ29udHJvbHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVEhSRUUuRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSk7VEhSRUUuTWFwQ29udHJvbHMucHJvdG90eXBlLmNvbnN0cnVjdG9yPVRIUkVFLk1hcENvbnRyb2xzOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvYXJyYXktYnVmZmVyLWRhdGEtcHJvdmlkZXIuanMKdmFyIExrOwooZnVuY3Rpb24oYil7Yi5FcnJvckNvZGVzPXtDQU5DRUxMRUQ6MX07Y29uc3QgZD17VkVSVEVYOjEsRkFDRToyLENPTE9SOjN9LGY9e1ZFUlRFWDoiZmxvYXQzMiIsRkFDRToiaW50MzIiLENPTE9SOiJ1aW50OCJ9O2NsYXNzIGh7Y29uc3RydWN0b3Ioayl7dGhpcy5fcmVxdWVzdE1hbmFnZXI9azt0aGlzLl9jYW5jZWxsZXI9bmV3IHZjLkNhbmNlbGxlcn1yZWxvYWQoayx0LGwpe3RoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTtyZXR1cm4gdGhpcy5fZmV0Y2hNZXRhZGF0YShrLHQsbCl9X2ZldGNoRGF0YUJ5U3RlcChrLHQsbCxwLG0sbil7ZnVuY3Rpb24gcSh1KXtsZXQgeD1bXTtmb3IobGV0IEE9MDtBPHUubGVuZ3RoLzM7QSsrKXtsZXQgeT1bXTtmb3IobGV0IHc9MDszPnc7dysrKXkucHVzaCh1WzMqQSt3XSk7eC5wdXNoKHkpfXJldHVybiB4fWs9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvZGF0YSIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOnQscnVuOmssCmNvbnRlbnRfdHlwZTpsLHNhbXBsZTpwLHN0ZXA6bX0pKTt0PXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSh1PT57aWYodS5jYW5jZWxsZWQpcmV0dXJuIFByb21pc2UucmVqZWN0KHtjb2RlOmIuRXJyb3JDb2Rlcy5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTt1PXUudmFsdWU7c3dpdGNoKGwpe2Nhc2UgIlZFUlRFWCI6bi52ZXJ0aWNlcz1xKG5ldyBGbG9hdDMyQXJyYXkodSkpO2JyZWFrO2Nhc2UgIkZBQ0UiOm4uZmFjZXM9cShuZXcgSW50MzJBcnJheSh1KSk7YnJlYWs7Y2FzZSAiQ09MT1IiOm4uY29sb3JzPXEobmV3IFVpbnQ4QXJyYXkodSkpfXJldHVybiBufSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGssbnVsbCwiYXJyYXlidWZmZXIiLGZbbF0pLnRoZW4odT0+dS5hcnJheUJ1ZmZlcigpKS50aGVuKHQpfWZldGNoRGF0YShrLHQsbCxwKXtsZXQgbT1bXSxuPW5ldyBNYXA7T2JqZWN0LmtleXMoZCkuZm9yRWFjaChxPT4Ke2suY29tcG9uZW50cyYxPDxkW3FdJiZtLnB1c2godGhpcy5fZmV0Y2hEYXRhQnlTdGVwKHQsbCxxLHAsay5zdGVwLG4pKX0pO3JldHVybiBQcm9taXNlLmFsbChtKX1fZmV0Y2hNZXRhZGF0YShrLHQsbCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO2s9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvbWVzaGVzIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6dCxydW46ayxzYW1wbGU6bH0pKTt0PXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShwPT5wLmNhbmNlbGxlZD9Qcm9taXNlLnJlamVjdCh7Y29kZTpiLkVycm9yQ29kZXMuQ0FOQ0VMTEVELG1lc3NhZ2U6IlJlc3BvbnNlIHdhcyBpbnZhbGlkYXRlZC4ifSk6cC52YWx1ZSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGspLnRoZW4ocD0+cC5qc29uKCkpLnRoZW4odCkudGhlbih0aGlzLl9wcm9jZXNzTWV0YWRhdGEuYmluZCh0aGlzKSl9X3Byb2Nlc3NNZXRhZGF0YShrKXtpZihrKXt2YXIgdD0KbmV3IE1hcDtmb3IobGV0IHA9MDtwPGsubGVuZ3RoO3ArKyl7bGV0IG09a1twXTt0LmhhcyhtLnN0ZXApfHx0LnNldChtLnN0ZXAsW10pO3QuZ2V0KG0uc3RlcCkucHVzaChtKX12YXIgbD1bXTt0LmZvckVhY2gocD0+e3A9dGhpcy5fY3JlYXRlU3RlcERhdHVtKHBbMF0pO2wucHVzaChwKX0pO3JldHVybiBsfX1fY3JlYXRlU3RlcERhdHVtKGspe3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmsud2FsbF90aW1lKSxzdGVwOmsuc3RlcCxjb25maWc6ay5jb25maWcsY29udGVudF90eXBlOmsuY29udGVudF90eXBlLGNvbXBvbmVudHM6ay5jb21wb25lbnRzfX19Yi5BcnJheUJ1ZmZlckRhdGFQcm92aWRlcj1ofSkoTGt8fChMaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvbWVzaC12aWV3ZXIuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBUSFJFRS5FdmVudERpc3BhdGNoZXJ7Y29uc3RydWN0b3IoZil7c3VwZXIoKTt0aGlzLl9sYXN0TWVzaD1udWxsO3RoaXMuX2Nsb2NrPW5ldyBUSFJFRS5DbG9jazt0aGlzLl9jYW52YXNTaXplPW51bGw7dGhpcy5fcnVuQ29sb3I9Zn1faXNPYmplY3QoZil7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBmJiZudWxsIT1mJiYhQXJyYXkuaXNBcnJheShmKX1fYXBwbHlEZWZhdWx0cyhmLGgpe2xldCBrPXt9O2Y9W2YsaF07Zm9yKGg9MDtoPGYubGVuZ3RoO2grKyl7Y29uc3QgdD1mW2hdO2ZvcihsZXQgbCBpbiB0KXtjb25zdCBwPWwgaW4gazt0aGlzLl9pc09iamVjdCh0W2xdKT9rW2xdPXRoaXMuX2FwcGx5RGVmYXVsdHMoa1tsXXx8e30sdFtsXSk6cHx8KGtbbF09dFtsXSl9fXJldHVybiBrfV9jcmVhdGVXb3JsZChmLGgpe3RoaXMuaXNSZWFkeSgpfHwodGhpcy5fc2NlbmU9bmV3IFRIUkVFLlNjZW5lLHRoaXMuX2NhbWVyYT1mPW5ldyBUSFJFRVtmLmNhbWVyYS5jbHNdKGYuY2FtZXJhLmZvdiwKdGhpcy5fY2FudmFzU2l6ZS53aWR0aC90aGlzLl9jYW52YXNTaXplLmhlaWdodCxmLmNhbWVyYS5uZWFyLGYuY2FtZXJhLmZhciksaD1uZXcgVEhSRUUuT3JiaXRDb250cm9scyhmLGgpLGgubG9va1NwZWVkPS40LGgubW92ZW1lbnRTcGVlZD0yMCxoLm5vRmx5PSEwLGgubG9va1ZlcnRpY2FsPSEwLGguY29uc3RyYWluVmVydGljYWw9ITAsaC52ZXJ0aWNhbE1pbj0xLGgudmVydGljYWxNYXg9MixoLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy5fb25DYW1lcmFQb3NpdGlvbkNoYW5nZS5iaW5kKHRoaXMpKSx0aGlzLl9jYW1lcmFDb250cm9scz1oLHRoaXMuX3JlbmRlcmVyPW5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHthbnRpYWxpYXM6ITB9KSx0aGlzLl9yZW5kZXJlci5zZXRQaXhlbFJhdGlvKCksdGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KSx0aGlzLl9yZW5kZXJlci5zZXRDbGVhckNvbG9yKDE2Nzc3MjE1LAoxKSl9X2NsZWFyU2NlbmUoKXtmb3IoOzA8dGhpcy5fc2NlbmUuY2hpbGRyZW4ubGVuZ3RoOyl0aGlzLl9zY2VuZS5yZW1vdmUodGhpcy5fc2NlbmUuY2hpbGRyZW5bMF0pfWdldFJlbmRlcmVyKCl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyfWdldENhbWVyYUNvbnRyb2xzKCl7cmV0dXJuIHRoaXMuX2NhbWVyYUNvbnRyb2xzfWlzUmVhZHkoKXtyZXR1cm4hIXRoaXMuX2NhbWVyYSYmISF0aGlzLl9jYW1lcmFDb250cm9sc31nZXRDYW1lcmFQb3NpdGlvbigpe3JldHVybntmYXI6dGhpcy5fY2FtZXJhLmZhcixwb3NpdGlvbjp0aGlzLl9jYW1lcmEucG9zaXRpb24uY2xvbmUoKSx0YXJnZXQ6dGhpcy5fY2FtZXJhQ29udHJvbHMudGFyZ2V0LmNsb25lKCl9fXNldENhbnZhc1NpemUoZil7dGhpcy5fY2FudmFzU2l6ZT1mfWRyYXcoKXt0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4JiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4KTt0aGlzLl9jYW1lcmEuYXNwZWN0PQp0aGlzLl9jYW52YXNTaXplLndpZHRoL3RoaXMuX2NhbnZhc1NpemUuaGVpZ2h0O3RoaXMuX2NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7dGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KTtjb25zdCBmPWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKTt0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoaCk7dGhpcy5fYW5pbWF0aW9uRnJhbWVJbmRleD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZik7dGhpcy5fcmVuZGVyZXIucmVuZGVyKHRoaXMuX3NjZW5lLHRoaXMuX2NhbWVyYSl9LmJpbmQodGhpcyk7ZigpfXVwZGF0ZVNjZW5lKGYsaCl7bGV0IGs9e307ImNvbmZpZyJpbiBmJiZmLmNvbmZpZyYmKGs9SlNPTi5wYXJzZShmLmNvbmZpZykpO3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiYmVmb3JlVXBkYXRlU2NlbmUifSk7az10aGlzLl9hcHBseURlZmF1bHRzKGsse2NhbWVyYTp7Y2xzOiJQZXJzcGVjdGl2ZUNhbWVyYSIsCmZvdjo3NSxuZWFyOi4xLGZhcjoxRTN9LGxpZ2h0czpbe2NsczoiQW1iaWVudExpZ2h0Iixjb2xvcjoiI2ZmZmZmZiIsaW50ZW5zaXR5Oi43NX0se2NsczoiRGlyZWN0aW9uYWxMaWdodCIsY29sb3I6IiNmZmZmZmYiLGludGVuc2l0eTouNzUscG9zaXRpb246WzAsLTEsMl19XX0pO3RoaXMuX2NyZWF0ZVdvcmxkKGssaCk7dGhpcy5fY2xlYXJTY2VuZSgpO3RoaXMuX2NyZWF0ZUxpZ2h0cyh0aGlzLl9zY2VuZSxrKTt0aGlzLl9jcmVhdGVHZW9tZXRyeShmLGspO3RoaXMuZHJhdygpfXJlc2V0Vmlldygpe2lmKHRoaXMuaXNSZWFkeSgpKXt0aGlzLl9jYW1lcmFDb250cm9scy5yZXNldCgpO2lmKCFmJiZ0aGlzLl9sYXN0TWVzaCl2YXIgZj10aGlzLl9sYXN0TWVzaDtmJiYodGhpcy5fZml0T2JqZWN0VG9WaWV3cG9ydChmKSx0aGlzLl9sYXN0TWVzaD1mKTt0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoKX19X2NyZWF0ZUdlb21ldHJ5KGYsaCl7Zj1mLm1lc2g7Zi52ZXJ0aWNlcyYmZi5mYWNlcyYmCmYuZmFjZXMubGVuZ3RoP3RoaXMuX2NyZWF0ZU1lc2goZixoKTp0aGlzLl9jcmVhdGVQb2ludENsb3VkKGYsaCl9X2NyZWF0ZVBvaW50Q2xvdWQoZixoKXt2YXIgaz1mLnZlcnRpY2VzO2Y9Zi5jb2xvcnM7bGV0IHQ9e21hdGVyaWFsOntjbHM6IlBvaW50c01hdGVyaWFsIixzaXplOi4wMDV9fTtmJiZmLmxlbmd0aD09ay5sZW5ndGg/dC5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9VEhSRUUuVmVydGV4Q29sb3JzOnQubWF0ZXJpYWwuY29sb3I9dGhpcy5fcnVuQ29sb3I7aD10aGlzLl9hcHBseURlZmF1bHRzKGgsdCk7dmFyIGw9bmV3IFRIUkVFLkdlb21ldHJ5O2suZm9yRWFjaChmdW5jdGlvbihwKXt2YXIgbT1uZXcgVEhSRUUuVmVjdG9yMyhwWzBdLHBbMV0scFsyXSk7bS54PTEqcFswXTttLnk9MSpwWzFdO20uej0xKnBbMl07bC52ZXJ0aWNlcy5wdXNoKG0pfSk7ZiYmZi5sZW5ndGg9PWsubGVuZ3RoJiZmLmZvckVhY2goZnVuY3Rpb24ocCl7cD1uZXcgVEhSRUUuQ29sb3IocFswXS8yNTUsCnBbMV0vMjU1LHBbMl0vMjU1KTtsLmNvbG9ycy5wdXNoKHApfSk7az1uZXcgVEhSRUVbaC5tYXRlcmlhbC5jbHNdKGgubWF0ZXJpYWwpO2s9bmV3IFRIUkVFLlBvaW50cyhsLGspO3RoaXMuX3NjZW5lLmFkZChrKTt0aGlzLl9sYXN0TWVzaD1rfXNldENhbWVyYVZpZXdwb2ludChmLGgsayl7dGhpcy5fc2lsZW50PSEwO3RoaXMuX2NhbWVyYS5mYXI9aDt0aGlzLl9jYW1lcmEucG9zaXRpb24uc2V0KGYueCxmLnksZi56KTt0aGlzLl9jYW1lcmEubG9va0F0KGsuY2xvbmUoKSk7dGhpcy5fY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQ9ay5jbG9uZSgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZSgpO3RoaXMuX3NpbGVudD0hMX1fb25DYW1lcmFQb3NpdGlvbkNoYW5nZShmKXt0aGlzLl9zaWxlbnR8fHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLGV2ZW50OmZ9KX1fZml0T2JqZWN0VG9WaWV3cG9ydChmKXt2YXIgaD0KbmV3IFRIUkVFLkJveDM7aC5zZXRGcm9tT2JqZWN0KGYpO2Y9aC5jZW50ZXIoKTt2YXIgaz1oLnNpemUoKTtrPTEuMjUqTWF0aC5hYnMoTWF0aC5tYXgoay54LGsueSxrLnopLygyKk1hdGgudGFuKE1hdGguUEkvMTgwKnRoaXMuX2NhbWVyYS5mb3YvMikpKTtoPWgubWluLno7dGhpcy5zZXRDYW1lcmFWaWV3cG9pbnQoe3g6Zi54LHk6Zi55LHo6a30sMyooMD5oPy1oK2s6ay1oKSxmKX1fY3JlYXRlTWVzaChmLGgpe3ZhciBrPWYudmVydGljZXM7Y29uc3QgdD1mLmZhY2VzLGw9Zi5jb2xvcnM7Zj10aGlzLl9hcHBseURlZmF1bHRzKGgse21hdGVyaWFsOntjbHM6Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIixjb2xvcjoiI2EwYTBhMCIscm91Z2huZXNzOjEsbWV0YWxuZXNzOjB9fSk7bGV0IHA9bmV3IFRIUkVFLkdlb21ldHJ5O2suZm9yRWFjaChmdW5jdGlvbihtKXtsZXQgbj1uZXcgVEhSRUUuVmVjdG9yMyhtWzBdLG1bMV0sbVsyXSk7bi54PTEqbVswXTtuLnk9MSptWzFdO24uej0xKm1bMl07CnAudmVydGljZXMucHVzaChuKX0pO3QuZm9yRWFjaChmdW5jdGlvbihtKXtsZXQgbj1uZXcgVEhSRUUuRmFjZTMobVswXSxtWzFdLG1bMl0pO2lmKGwmJmwubGVuZ3RoKXttPVtsW21bMF1dLGxbbVsxXV0sbFttWzJdXV07Zm9yKGxldCB1PTA7dTxtLmxlbmd0aDt1Kyspe3ZhciBxPW1bdV07cT1uZXcgVEhSRUUuQ29sb3IocVswXS8yNTUscVsxXS8yNTUscVsyXS8yNTUpO24udmVydGV4Q29sb3JzLnB1c2gocSl9fXAuZmFjZXMucHVzaChuKX0pO2wmJmwubGVuZ3RoJiYoZi5tYXRlcmlhbD1mLm1hdGVyaWFsfHx7fSxmLm1hdGVyaWFsLnZlcnRleENvbG9ycz1USFJFRS5WZXJ0ZXhDb2xvcnMpO3AuY2VudGVyKCk7cC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtwLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7az1uZXcgVEhSRUVbZi5tYXRlcmlhbC5jbHNdKGYubWF0ZXJpYWwpO2s9bmV3IFRIUkVFLk1lc2gocCxrKTtrLmNhc3RTaGFkb3c9ITA7ay5yZWNlaXZlU2hhZG93PSEwO3RoaXMuX3NjZW5lLmFkZChrKTsKdGhpcy5fbGFzdE1lc2g9a31fY3JlYXRlTGlnaHRzKGYsaCl7Zm9yKGxldCBrPTA7azxoLmxpZ2h0cy5sZW5ndGg7aysrKXtjb25zdCB0PWgubGlnaHRzW2tdO2xldCBsPW5ldyBUSFJFRVt0LmNsc10odC5jb2xvcix0LmludGVuc2l0eSk7dC5wb3NpdGlvbiYmbC5wb3NpdGlvbi5zZXQodC5wb3NpdGlvblswXSx0LnBvc2l0aW9uWzFdLHQucG9zaXRpb25bMl0pO2YuYWRkKGwpfX19Yi5NZXNoVmlld2VyPWR9KShMa3x8KExrPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtbWVzaC1kYXNoYm9hcmQvbWVzaC1sb2FkZXIuanMKKGZ1bmN0aW9uKGIpe1BvbHltZXIoe2lzOiJ0Zi1tZXNoLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHNhbXBsZTpOdW1iZXIsb2ZTYW1wbGVzOk51bWJlcixzZWxlY3RlZFZpZXc6e3R5cGU6U3RyaW5nLHZhbHVlOiJhbGwifSxhY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXNoVmlld2VyOnt0eXBlOk9iamVjdH0sX2RhdGFQcm92aWRlcjp7dHlwZTpPYmplY3R9LF9jb2xvclNjYWxlRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5wZi5ydW5zQ29sb3JTY2FsZX0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX3N0ZXBzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxub3RpZnk6ITB9LF9zdGVwSW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sX2N1cnJlbnRTdGVwOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVDdXJyZW50U3RlcChfc3RlcHMsIF9zdGVwSW5kZXgpIn0sCl9tZXNoVmlld2VyQXR0YWNoZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3N0ZXBWYWx1ZTp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlU3RlcFZhbHVlKF9jdXJyZW50U3RlcCkifSxfY3VycmVudFdhbGxUaW1lOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVDdXJyZW50V2FsbFRpbWUoX2N1cnJlbnRTdGVwKSJ9LF9pc01lc2hMb2FkaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcsIGFjdGl2ZSwgX2RhdGFQcm92aWRlciwgX21lc2hWaWV3ZXIpIiwiX3VwZGF0ZVNjZW5lKF9jdXJyZW50U3RlcC4qLCBfbWVzaFZpZXdlcikiLCJfZGVib3VuY2VkRmV0Y2hNZXNoKF9jdXJyZW50U3RlcCkiLCJfdXBkYXRlVmlldyhzZWxlY3RlZFZpZXcpIl0sX2NvbXB1dGVSdW5Db2xvcjpmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uKGQpfSwKYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9kYXRhUHJvdmlkZXI9bmV3IGIuQXJyYXlCdWZmZXJEYXRhUHJvdmlkZXIodGhpcy5yZXF1ZXN0TWFuYWdlcik7Y29uc3QgZD1uZXcgYi5NZXNoVmlld2VyKHRoaXMuX3J1bkNvbG9yKTtkLmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZVVwZGF0ZVNjZW5lIix0aGlzLl91cGRhdGVDYW52YXNTaXplLmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLHRoaXMuX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2UuYmluZCh0aGlzKSk7dGhpcy5fbWVzaFZpZXdlcj1kfSxyZWxvYWQ6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZSYmdGhpcy5fZGF0YVByb3ZpZGVyJiYodGhpcy5zZXQoIl9pc01lc2hMb2FkaW5nIiwhMCksdGhpcy5fZGF0YVByb3ZpZGVyLnJlbG9hZCh0aGlzLnJ1bix0aGlzLnRhZyx0aGlzLnNhbXBsZSkudGhlbihkPT57ZCYmKHRoaXMuc2V0KCJfc3RlcHMiLGQpLHRoaXMuc2V0KCJfc3RlcEluZGV4IiwKZC5sZW5ndGgtMSkpfSkuY2F0Y2goZD0+e2lmKCFkfHwhZC5jb2RlfHxkLmNvZGUhPWIuRXJyb3JDb2Rlcy5DQU5DRUxMRUQpdGhyb3cgRXJyb3IoZHx8IlJlc3BvbnNlIHByb2Nlc3NpbmcgZmFpbGVkLiIpO30pKX0sX3VwZGF0ZVNjZW5lOmZ1bmN0aW9uKCl7Y29uc3QgZD10aGlzLl9jdXJyZW50U3RlcDtkJiZkLm1lc2gmJih0aGlzLl9tZXNoVmlld2VyLnVwZGF0ZVNjZW5lKGQsdGhpcyksdGhpcy5fY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZHx8KHRoaXMuX21lc2hWaWV3ZXIucmVzZXRWaWV3KCksdGhpcy5fY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZD0hMCksdGhpcy5fbWVzaFZpZXdlckF0dGFjaGVkfHwodGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuX21lc2hWaWV3ZXIuZ2V0UmVuZGVyZXIoKS5kb21FbGVtZW50KSx0aGlzLl9tZXNoVmlld2VyQXR0YWNoZWQ9ITApKX0sX2RlYm91bmNlZEZldGNoTWVzaCgpe3RoaXMuZGVib3VuY2UoImZldGNoTWVzaCIsKCk9PnRoaXMuX21heWJlRmV0Y2hNZXNoKCksCjEwMCl9LF9tYXliZUZldGNoTWVzaCgpe2NvbnN0IGQ9dGhpcztyZXR1cm4gaGMoZnVuY3Rpb24qKCl7Y29uc3QgZj1kLl9jdXJyZW50U3RlcDtpZihmJiYhZi5tZXNoJiYhZi5tZXNoRmV0Y2hpbmcpe2YubWVzaEZldGNoaW5nPSEwO2QuX2lzTWVzaExvYWRpbmc9ITA7dHJ5e2NvbnN0IGg9eWllbGQgZC5fZGF0YVByb3ZpZGVyLmZldGNoRGF0YShmLGQucnVuLGQudGFnLGQuc2FtcGxlKTtmLm1lc2g9aFswXTtkLm5vdGlmeVBhdGgoIl9jdXJyZW50U3RlcC5tZXNoIil9Y2F0Y2goaCl7aWYoIWh8fCFoLmNvZGV8fGguY29kZSE9Yi5FcnJvckNvZGVzLkNBTkNFTExFRCl0aHJvdyBoPWh8fCJSZXNwb25zZSBwcm9jZXNzaW5nIGZhaWxlZC4iLEVycm9yKGgpO31maW5hbGx5e2QuX2lzTWVzaExvYWRpbmc9ITEsZi5tZXNoRmV0Y2hpbmc9ITF9fX0pfSxfb25DYW1lcmFQb3NpdGlvbkNoYW5nZTpmdW5jdGlvbigpe2lmKHRoaXMuX21lc2hWaWV3ZXIuaXNSZWFkeSgpKXt2YXIgZD1uZXcgQ3VzdG9tRXZlbnQoImNhbWVyYS1wb3NpdGlvbi1jaGFuZ2UiLAp7ZGV0YWlsOnRoaXMuX21lc2hWaWV3ZXIuZ2V0Q2FtZXJhUG9zaXRpb24oKX0pO3RoaXMuZGlzcGF0Y2hFdmVudChkKX19LHNldENhbWVyYVZpZXdwb2ludDpmdW5jdGlvbihkLGYsaCl7dGhpcy5fbWVzaFZpZXdlci5zZXRDYW1lcmFWaWV3cG9pbnQoZCxmLGgpfSxfdXBkYXRlQ2FudmFzU2l6ZTpmdW5jdGlvbigpe2NvbnN0IGQ9dGhpcy5vZmZzZXRXaWR0aCxmPXRoaXMuJCQoIi50Zi1tZXNoLWxvYWRlci1oZWFkZXIiKS5vZmZzZXRIZWlnaHQ7dGhpcy5fbWVzaFZpZXdlci5zZXRDYW52YXNTaXplKHt3aWR0aDpkLGhlaWdodDpkLWZ9KX0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ2FudmFzU2l6ZSgpO3RoaXMuaXNDb25uZWN0ZWQmJnRoaXMuX21lc2hWaWV3ZXIuZHJhdygpfSxfaGFzQXRMZWFzdE9uZVN0ZXA6ZnVuY3Rpb24oZCl7cmV0dXJuISFkJiYwPGQubGVuZ3RofSxfaGFzTXVsdGlwbGVTdGVwczpmdW5jdGlvbihkKXtyZXR1cm4hIWQmJjE8ZC5sZW5ndGh9LF9jb21wdXRlQ3VycmVudFN0ZXA6ZnVuY3Rpb24oZCwKZil7cmV0dXJuIGRbZl18fG51bGx9LF9jb21wdXRlU3RlcFZhbHVlOmZ1bmN0aW9uKGQpe3JldHVybiBkP2Quc3RlcDowfSxfY29tcHV0ZUN1cnJlbnRXYWxsVGltZTpmdW5jdGlvbihkKXtyZXR1cm4gZD9IaC5mb3JtYXREYXRlKGQud2FsbF90aW1lKToiIn0sX2dldE1heFN0ZXBJbmRleDpmdW5jdGlvbihkKXtyZXR1cm4gZC5sZW5ndGgtMX0sX2dldFNhbXBsZVRleHQ6ZnVuY3Rpb24oZCl7cmV0dXJuIFN0cmluZyhkKzEpfSxfaGFzTXVsdGlwbGVTYW1wbGVzOmZ1bmN0aW9uKGQpe3JldHVybiAxPGR9LF91cGRhdGVWaWV3OmZ1bmN0aW9uKGQpe3RoaXMuX21lc2hWaWV3ZXImJiJhbGwiPT1kJiZ0aGlzLl9tZXNoVmlld2VyLnJlc2V0VmlldygpfSx0b0xvY2FsZVN0cmluZ186ZnVuY3Rpb24oZCl7cmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoKX19KX0pKExrfHwoTGs9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1tZXNoLWRhc2hib2FyZC90Zi1tZXNoLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJtZXNoLWRhc2hib2FyZCIscHJvcGVydGllczp7X3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6Ii4qIn0sX3NlbGVjdGVkVmlldzp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiJhbGwifSxfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfX0scmVhZHkoKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwoKT0+e3RoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZSgpfSwhMSk7dGhpcy5yZWxvYWQoKX0sX2dldEFsbENoaWxkcmVuKCl7cmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1tZXNoLWxvYWRlciIpfSwKX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2VkKGIpeyJzaGFyZSI9PXRoaXMuX3NlbGVjdGVkVmlldyYmdGhpcy5fZ2V0QWxsQ2hpbGRyZW4oKS5mb3JFYWNoKGQ9PntiLnRhcmdldCE9ZCYmZC5zZXRDYW1lcmFWaWV3cG9pbnQoYi5kZXRhaWwucG9zaXRpb24sYi5kZXRhaWwuZmFyLGIuZGV0YWlsLnRhcmdldCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4odGhpcy5fcmVsb2FkTWVzaGVzLmJpbmQodGhpcykpfSxfaGFuZGxlV2luZG93UmVzaXplKCl7dGhpcy5fZ2V0QWxsQ2hpbGRyZW4oKS5mb3JFYWNoKGI9PntiLnJlZHJhdygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJtZXNoIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCwKaD0+T2JqZWN0LmtleXMoaCkpO2Y9dmMuZ2V0VGFncyhmKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCl9fSl9LF9yZWxvYWRNZXNoZXMoKXt0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtmdW5jdGlvbiBoKHQpe2NvbnN0IGw9Ylt0LnJ1bl1bdC50YWddLnNhbXBsZXM7cmV0dXJuIF8ucmFuZ2UobCkubWFwKHA9Pk9iamVjdC5hc3NpZ24oe30sdCx7c2FtcGxlOnAsb2ZTYW1wbGVzOmx9KSl9Y29uc3Qgaz1fLm1hcFZhbHVlcyhiLHQ9Pk9iamVjdC5rZXlzKHQpKTtyZXR1cm4gJGMuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhrLGQsZikubWFwKHQ9Pk9iamVjdC5hc3NpZ24oe30sdCx7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLHQuaXRlbXMubWFwKGgpKX0pKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGx1Z2luLXV0aWwvbWVzc2FnZS5qcwpVaT10aGlzJiZ0aGlzLl9fYXdhaXRlcnx8ZnVuY3Rpb24oYixkLGYsaCl7cmV0dXJuIG5ldyAoZnx8KGY9UHJvbWlzZSkpKGZ1bmN0aW9uKGssdCl7ZnVuY3Rpb24gbChuKXt0cnl7bShoLm5leHQobikpfWNhdGNoKHEpe3QocSl9fWZ1bmN0aW9uIHAobil7dHJ5e20oaFsidGhyb3ciXShuKSl9Y2F0Y2gocSl7dChxKX19ZnVuY3Rpb24gbShuKXtuLmRvbmU/ayhuLnZhbHVlKToobmV3IGYoZnVuY3Rpb24ocSl7cShuLnZhbHVlKX0pKS50aGVuKGwscCl9bSgoaD1oLmFwcGx5KGIsZHx8W10pKS5uZXh0KCkpfSl9O3ZhciBNazsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Y2xhc3MgaHtjb25zdHJ1Y3RvcihrKXt0aGlzLnBvcnQ9azt0aGlzLmlkPTA7dGhpcy5yZXNwb25zZVdhaXRzPW5ldyBNYXA7dGhpcy5saXN0ZW5lcnM9bmV3IE1hcDt0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdD0+dGhpcy5vbk1lc3NhZ2UodCkpfWxpc3RlbihrLHQpe3RoaXMubGlzdGVuZXJzLnNldChrLHQpfXVubGlzdGVuKGspe3RoaXMubGlzdGVuZXJzLmRlbGV0ZShrKX1vbk1lc3NhZ2Uoayl7cmV0dXJuIFVpKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt2YXIgdD1KU09OLnBhcnNlKGsuZGF0YSk7Y29uc3QgbD10LnR5cGUscD10LmlkLG09dC5wYXlsb2FkO3ZhciBuPXQuZXJyb3I7aWYodC5pc1JlcGx5KXtpZih0aGlzLnJlc3BvbnNlV2FpdHMuaGFzKHApKXt2YXIge3Jlc29sdmU6cSxyZWplY3Q6dX09dGhpcy5yZXNwb25zZVdhaXRzLmdldChwKTt0aGlzLnJlc3BvbnNlV2FpdHMuZGVsZXRlKHApOwpuP3UoRXJyb3IobikpOnEobSl9fWVsc2V7bj10PW51bGw7aWYodGhpcy5saXN0ZW5lcnMuaGFzKGwpKXtjb25zdCB4PXRoaXMubGlzdGVuZXJzLmdldChsKTt0cnl7dD15aWVsZCB4KG0pfWNhdGNoKEEpe249QX19dGhpcy5wb3N0TWVzc2FnZSh7WyJ0eXBlIl06bCxbImlkIl06cCxbInBheWxvYWQiXTp0LFsiZXJyb3IiXTpuLFsiaXNSZXBseSJdOiEwfSl9fSl9cG9zdE1lc3NhZ2Uoayl7dGhpcy5wb3J0LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGspKX1zZW5kTWVzc2FnZShrKXtjb25zdCB0PXRoaXMuaWQrKzt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJleHBlcmltZW50YWwuUnVuc0NoYW5nZWQiLGlkOnQscGF5bG9hZDprLGVycm9yOm51bGwsaXNSZXBseTohMX0pO3JldHVybiBuZXcgUHJvbWlzZSgobCxwKT0+e3RoaXMucmVzcG9uc2VXYWl0cy5zZXQodCx7cmVzb2x2ZTpsLHJlamVjdDpwfSl9KX19Zi5JUEM9aH0pKGQuRE9fTk9UX1VTRV9JTlRFUk5BTHx8KGQuRE9fTk9UX1VTRV9JTlRFUk5BTD0Ke30pKX0pKGIubGlifHwoYi5saWI9e30pKX0pKE1rfHwoTWs9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9wbHVnaW4taG9zdC1pcGMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKG0sbil7Y29uc3QgcT1uZXcgYi5saWIuRE9fTk9UX1VTRV9JTlRFUk5BTC5JUEMobSk7dC5hZGQocSk7cC5zZXQocSxuKTttLnN0YXJ0KCk7Zm9yKGNvbnN0IFt1LHhdb2YgbCltPWgoeCxxKSxxLmxpc3Rlbih1LG0pfWZ1bmN0aW9uIGgobSxuKXtyZXR1cm4gcT0+e3ZhciB1PXAuZ2V0KG4pO3U9ay5nZXQodSl8fG51bGw7cmV0dXJuIG0odSxxKX19ZC5yZWdpc3RlclBsdWdpbklmcmFtZT1mdW5jdGlvbihtLG4pe2suc2V0KG0se3BsdWdpbk5hbWU6bn0pfTtjb25zdCBrPW5ldyBXZWFrTWFwLHQ9bmV3IFNldCxsPW5ldyBNYXAscD1uZXcgTWFwO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixtPT57aWYoImV4cGVyaW1lbnRhbC5ib290c3RyYXAiPT09bS5kYXRhKXt2YXIgbj1tLnBvcnRzWzBdO24mJihtPW0uc291cmNlP20uc291cmNlLmZyYW1lRWxlbWVudDpudWxsKSYmZihuLG0pfX0pO2QuYnJvYWRjYXN0PQpmdW5jdGlvbigpe3ZhciBtPXZjLnJ1bnNTdG9yZS5nZXRSdW5zKCk7Zm9yKHZhciBuIG9mIHQpcC5nZXQobikuaXNDb25uZWN0ZWR8fCh0LmRlbGV0ZShuKSxwLmRlbGV0ZShuKSk7bj1bLi4udF0ubWFwKHE9PnEuc2VuZE1lc3NhZ2UobSkpO3JldHVybiBQcm9taXNlLmFsbChuKX07ZC5saXN0ZW49ZnVuY3Rpb24obSxuKXtsLnNldChtLG4pO2Zvcihjb25zdCBxIG9mIHQpe2NvbnN0IHU9aChuLHEpO3EubGlzdGVuKG0sdSl9fTtkLnVubGlzdGVuPWZ1bmN0aW9uKG0pe2wuZGVsZXRlKG0pO2Zvcihjb25zdCBuIG9mIHQpbi51bmxpc3RlbihtKX19KShiLmhvc3R8fChiLmhvc3Q9e30pKX0pKE1rfHwoTWs9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9jb3JlLWhvc3QtaW1wbC5qcwpNay5ob3N0Lmxpc3RlbigiZXhwZXJpbWVudGFsLkdldFVSTFBsdWdpbkRhdGEiLGI9PntpZihiKXtiPWBwLiR7Yi5wbHVnaW5OYW1lfS5gO3ZhciBkPXt9O2ZvcihsZXQgZiBpbiBwZC51cmxEaWN0KWYuc3RhcnRzV2l0aChiKSYmKGRbZi5zdWJzdHJpbmcoYi5sZW5ndGgpXT1wZC51cmxEaWN0W2ZdKTtyZXR1cm4gZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9ydW5zLWhvc3QtaW1wbC5qcwpNay5ob3N0Lmxpc3RlbigiZXhwZXJpbWVudGFsLkdldFJ1bnMiLCgpPT52Yy5ydW5zU3RvcmUuZ2V0UnVucygpKTt2Yy5ydW5zU3RvcmUuYWRkTGlzdGVuZXIoKCk9Pk1rLmhvc3QuYnJvYWRjYXN0KCkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL2F1dG9SZWxvYWRCZWhhdmlvci5qcwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZCgpe3JldHVybihuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpKS5oYXMoIl9EaXNhYmxlQXV0b1JlbG9hZCIpfWIuQVVUT1JFTE9BRF9MT0NBTFNUT1JBR0VfS0VZPSJURi5UZW5zb3JCb2FyZC5hdXRvUmVsb2FkRW5hYmxlZCI7Yi5BdXRvUmVsb2FkQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2F1dG9SZWxvYWRFbmFibGVkOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9hdXRvUmVsb2FkT2JzZXJ2ZXIiLHZhbHVlOigpPT57dmFyIGY9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGIuQVVUT1JFTE9BRF9MT0NBTFNUT1JBR0VfS0VZKTtyZXR1cm4idHJ1ZSI9PT1mfHxudWxsPT1mfX0sX2F1dG9SZWxvYWRJZDp7dHlwZTpOdW1iZXJ9LGF1dG9SZWxvYWRJbnRlcnZhbFNlY3M6e3R5cGU6TnVtYmVyLHZhbHVlOjMwfX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2F1dG9SZWxvYWRJZCl9LApfYXV0b1JlbG9hZE9ic2VydmVyOmZ1bmN0aW9uKGYpe3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShiLkFVVE9SRUxPQURfTE9DQUxTVE9SQUdFX0tFWSxmKTtmJiYhZCgpP3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyk6d2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9hdXRvUmVsb2FkSWQpfSxfZG9BdXRvUmVsb2FkOmZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5yZWxvYWQpdGhyb3cgRXJyb3IoIkF1dG9SZWxvYWRCZWhhdmlvciByZXF1aXJlcyBhIHJlbG9hZCBtZXRob2QiKTt0aGlzLnJlbG9hZCgpO3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyl9fX0pKHFmfHwocWY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi10ZW5zb3Jib2FyZC90Zi10ZW5zb3Jib2FyZC5odG1sLmpzCmNvbnN0IFltPXtnZXRMb2NhdGlvbigpe3JldHVybiB3aW5kb3cubG9jYXRpb259fTsKUG9seW1lcih7aXM6InRmLXRlbnNvcmJvYXJkIixiZWhhdmlvcnM6W3FmLkF1dG9SZWxvYWRCZWhhdmlvcl0scHJvcGVydGllczp7YnJhbmQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJUZW5zb3JCb2FyZC1YIn0saG9tZVBhdGg6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfaG9tZVBhdGg6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfc2FuaXRpemVIb21lUGF0aChob21lUGF0aCkifSx0aXRsZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il91cGRhdGVUaXRsZSJ9LHJvdXRlcjp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il91cGRhdGVSb3V0ZXIifSxkZW1vRGlyOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx1c2VIYXNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVkRGFzaGJvYXJkczp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9kYXNoYm9hcmREYXRhOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZURhc2hib2FyZERhdGEoX2Rhc2hib2FyZFJlZ2lzdHJ5KSJ9LF9kYXNoYm9hcmRSZWdpc3RyeTp7dHlwZTpPYmplY3QsCmNvbXB1dGVkOiJfY29tcHV0ZURhc2hib2FyZFJlZ2lzdHJ5KF9wbHVnaW5zTGlzdGluZykifSxfcGx1Z2luc0xpc3Rpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfYWN0aXZlRGFzaGJvYXJkczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmQoX2Rhc2hib2FyZERhdGEsIF9wbHVnaW5zTGlzdGluZykifSxfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6cWYuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5OT1RfTE9BREVEfSxfYWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWQoX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUpIn0sX2FjdGl2ZURhc2hib2FyZHNMb2FkZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmRzTG9hZGVkKF9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlKSJ9LApfYWN0aXZlRGFzaGJvYXJkc0ZhaWxlZFRvTG9hZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNGYWlsZWRUb0xvYWQoX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUpIn0sX3Nob3dOb0Rhc2hib2FyZHNNZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlU2hvd05vRGFzaGJvYXJkc01lc3NhZ2UoX2FjdGl2ZURhc2hib2FyZHNMb2FkZWQsIF9hY3RpdmVEYXNoYm9hcmRzLCBfc2VsZWN0ZWREYXNoYm9hcmQpIn0sX3Nob3dOb1N1Y2hEYXNoYm9hcmRNZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlU2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2UoX2FjdGl2ZURhc2hib2FyZHNMb2FkZWQsIF9kYXNoYm9hcmRSZWdpc3RyeSwgX3NlbGVjdGVkRGFzaGJvYXJkKSJ9LF9zZWxlY3RlZERhc2hib2FyZDp7dHlwZTpTdHJpbmcsdmFsdWU6cGQuZ2V0U3RyaW5nKHBkLlRBQil8fG51bGwsb2JzZXJ2ZXI6Il9zZWxlY3RlZERhc2hib2FyZENoYW5nZWQifSwKX2Rhc2hib2FyZFRvTWF5YmVSZW1vdmU6U3RyaW5nLF9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZDp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9pc1JlbG9hZERpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9sYXN0UmVsb2FkVGltZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im5vdCB5ZXQgbG9hZGVkIn0sX2xhc3RSZWxvYWRUaW1lU2hvcnQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJOb3QgeWV0IGxvYWRlZCJ9LF9kYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcn0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9yZWZyZXNoaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tQWN0aXZlKF9zZWxlY3RlZERhc2hib2FyZCwgX2FjdGl2ZURhc2hib2FyZHMpIiwKIl9lbnN1cmVTZWxlY3RlZERhc2hib2FyZFN0YW1wZWQoX2Rhc2hib2FyZFJlZ2lzdHJ5LCBfZGFzaGJvYXJkQ29udGFpbmVyc1N0YW1wZWQsIF9hY3RpdmVEYXNoYm9hcmRzLCBfc2VsZWN0ZWREYXNoYm9hcmQpIl0sX3Nhbml0aXplSG9tZVBhdGgoYil7aWYoIWIpcmV0dXJuIiI7Y29uc3QgZD1ZbS5nZXRMb2NhdGlvbigpLGY9bmV3IFVSTChiLGQuaHJlZiksaD0iaHR0cDoiPT09Zi5wcm90b2NvbHx8Imh0dHBzOiI9PT1mLnByb3RvY29sLGs9Zi5vcmlnaW49PT1kLm9yaWdpbjtpZighaCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRXhwZWN0ICdob21lUGF0aCcgdG8gYmUgb2YgaHR0cDogb3IgaHR0cHM6LiAke2J9YCk7aWYoIWspdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEV4cGVjdCAnaG9tZVBhdGgnIGJlIGEgcGF0aCBvciBoYXZlIHRoZSBzYW1lIG9yaWdpbi4gJHtifSB2cy4gJHtkLm9yaWdpbn1gKTtyZXR1cm4gaCYmaz9mLnRvU3RyaW5nKCk6IiJ9LF9hY3RpdmVEYXNoYm9hcmRzVXBkYXRlZCgpe30sCl9pc0Rhc2hib2FyZEFjdGl2ZShiLGQsZil7cmV0dXJuIDA8PShifHwiIikuc3BsaXQoIiwiKS5pbmRleE9mKGYucGx1Z2luKXx8IShkfHxbXSkuaW5jbHVkZXMoZi5wbHVnaW4pPyExOiEwfSxfaXNEYXNoYm9hcmRJbmFjdGl2ZShiLGQsZil7cmV0dXJuIDA8PShifHwiIikuc3BsaXQoIiwiKS5pbmRleE9mKGYucGx1Z2luKT8hMTooZHx8W10pLmluY2x1ZGVzKGYucGx1Z2luKT8hMTohMH0sX2luYWN0aXZlRGFzaGJvYXJkc0V4aXN0KGIsZCxmKXtpZighZilyZXR1cm4hMTtjb25zdCBoPW5ldyBTZXQ7Yi5mb3JFYWNoKGs9PntoLmFkZChrLnBsdWdpbil9KTsoZHx8IiIpLnNwbGl0KCIsIikuZm9yRWFjaChrPT57aC5kZWxldGUoay5wbHVnaW4pfSk7Zi5mb3JFYWNoKGs9PntoLmRlbGV0ZShrKX0pO3JldHVybiAwPGguc2l6ZX0sX2dldERhc2hib2FyZEZyb21JbmRleChiLGQpe3JldHVybiBiW2RdfSxfc2VsZWN0ZWRTdGF0dXMoYixkKXtyZXR1cm4gYj09PWR9LF9zZWxlY3RlZERhc2hib2FyZENoYW5nZWQoYil7Yj0KYnx8IiI7cGQuc2V0U3RyaW5nKHBkLlRBQixiKTtsZXQgZD13aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7ZCs9ZC5lbmRzV2l0aCgiLyIpP2I6Ii8iK2I7Z2EoInNldCIsInBhZ2UiLGQpO2dhKCJzZW5kIiwicGFnZXZpZXciKX0sX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUFjdGl2ZShiLGQpe2QmJm51bGw9PWImJihiPWRbMF18fG51bGwsbnVsbCE9YiYmKHBkLnNldFN0cmluZyhwZC5UQUIsYix7dXNlTG9jYXRpb25SZXBsYWNlOiEwfSksdGhpcy5fc2VsZWN0ZWREYXNoYm9hcmQ9YikpfSxfdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tSGFzaCgpe2NvbnN0IGI9cGQuZ2V0U3RyaW5nKHBkLlRBQik7dGhpcy5zZXQoIl9zZWxlY3RlZERhc2hib2FyZCIsYnx8bnVsbCl9LF9lbnN1cmVTZWxlY3RlZERhc2hib2FyZFN0YW1wZWQoYixkLGYsaCl7aWYoZiYmaCYmZFtoXSYmKGQ9dGhpcy5fZGFzaGJvYXJkVG9NYXliZVJlbW92ZSx0aGlzLl9kYXNoYm9hcmRUb01heWJlUmVtb3ZlPQpoLGQmJmQhPWgmJmJbZF0ucmVtb3ZlRG9tJiYoZD10aGlzLiQkKGAuZGFzaGJvYXJkLWNvbnRhaW5lcltkYXRhLWRhc2hib2FyZD0ke2R9XWApLGQuZmlyc3RDaGlsZCYmZC5maXJzdENoaWxkLnJlbW92ZSgpKSxkPXRoaXMuJCQoYC5kYXNoYm9hcmQtY29udGFpbmVyW2RhdGEtZGFzaGJvYXJkPSR7aH1dYCkpKXtiPWJbaF07aWYoMD09PWQuY2hpbGRyZW4ubGVuZ3RoKXN3aXRjaChmPWIubG9hZGluZ01lY2hhbmlzbSxmLnR5cGUpe2Nhc2UgIkNVU1RPTV9FTEVNRU5UIjpoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZi5lbGVtZW50TmFtZSk7aC5pZD0iZGFzaGJvYXJkIjtkLmFwcGVuZENoaWxkKGgpO2JyZWFrO2Nhc2UgIklGUkFNRSI6dGhpcy5fcmVuZGVyUGx1Z2luSWZyYW1lKGQsaCxmKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiSW52YXJpYW50IHZpb2xhdGlvbjoiLGYpfXRoaXMuc2V0KCJfaXNSZWxvYWREaXNhYmxlZCIsYi5kaXNhYmxlUmVsb2FkKX19LF9yZW5kZXJQbHVnaW5JZnJhbWUoYiwKZCl7Y29uc3QgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLmlkPSJkYXNoYm9hcmQiO01rLmhvc3QucmVnaXN0ZXJQbHVnaW5JZnJhbWUoZixkKTtjb25zdCBoPW5ldyBVUkwoImRhdGEvcGx1Z2luX2VudHJ5Lmh0bWwiLHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtoLnNlYXJjaFBhcmFtcy5zZXQoIm5hbWUiLGQpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGgudG9TdHJpbmcoKSk7Yi5hcHBlbmRDaGlsZChmKX0sX3NlbGVjdGVkRGFzaGJvYXJkQ29tcG9uZW50KCl7cmV0dXJuIHRoaXMuJCQoYC5kYXNoYm9hcmQtY29udGFpbmVyW2RhdGEtZGFzaGJvYXJkPSR7dGhpcy5fc2VsZWN0ZWREYXNoYm9hcmR9XSAjZGFzaGJvYXJkYCl9LHJlYWR5KCl7YWQuc2V0VXNlSGFzaCh0aGlzLnVzZUhhc2gpO3RoaXMuX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUhhc2goKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGFzaGNoYW5nZSIsKCk9Pnt0aGlzLl91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21IYXNoKCl9LAohMSk7dmMuZW52aXJvbm1lbnRTdG9yZS5hZGRMaXN0ZW5lcigoKT0+e3RoaXMuX2RhdGFMb2NhdGlvbj12Yy5lbnZpcm9ubWVudFN0b3JlLmdldERhdGFMb2NhdGlvbigpO2NvbnN0IGI9dmMuZW52aXJvbm1lbnRTdG9yZS5nZXRXaW5kb3dUaXRsZSgpO2ImJih3aW5kb3cuZG9jdW1lbnQudGl0bGU9Yil9KTtwZC5taWdyYXRlTGVnYWN5VVJMU2NoZW1lKCk7dGhpcy5fcmVsb2FkRGF0YSgpO3RoaXMuX2xhc3RSZWxvYWRUaW1lPShuZXcgRGF0ZSkudG9TdHJpbmcoKX0sX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmQoKXtyZXR1cm4gdGhpcy5fZGFzaGJvYXJkRGF0YT90aGlzLl9kYXNoYm9hcmREYXRhLm1hcChiPT5iLnBsdWdpbikuZmlsdGVyKGI9PntiPXRoaXMuX3BsdWdpbnNMaXN0aW5nW2JdO3JldHVybiJib29sZWFuIj09PXR5cGVvZiBiP2I6YiYmYi5lbmFibGVkfSk6W119LF9vblRlbXBsYXRlQ2hhbmdlZCgpe2NvbnN0IGI9e307Zm9yKGNvbnN0IGQgb2YgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kYXNoYm9hcmQtY29udGFpbmVyIikpYltkLmRhdGFzZXQuZGFzaGJvYXJkXT0KITA7dGhpcy5fZGFzaGJvYXJkQ29udGFpbmVyc1N0YW1wZWQ9Yn0sX2NvbXB1dGVEYXNoYm9hcmRSZWdpc3RyeShiKXtjb25zdCBkPXt9O2Zvcihjb25zdCBbaCxrXW9mIE9iamVjdC5lbnRyaWVzKHFmLmRhc2hib2FyZFJlZ2lzdHJ5KSlkW2hdPXtwbHVnaW46ay5wbHVnaW4sbG9hZGluZ01lY2hhbmlzbTp7dHlwZToiQ1VTVE9NX0VMRU1FTlQiLGVsZW1lbnROYW1lOmsuZWxlbWVudE5hbWV9LHRhYk5hbWU6ay50YWJOYW1lLnRvVXBwZXJDYXNlKCksZGlzYWJsZVJlbG9hZDprLmlzUmVsb2FkRGlzYWJsZWR8fCExLHJlbW92ZURvbTprLnJlbW92ZURvbXx8ITF9O2lmKG51bGwhPWIpZm9yKGNvbnN0IFtoLGtdb2YgT2JqZWN0LmVudHJpZXMoYikpaWYoImJvb2xlYW4iIT09dHlwZW9mIGspe3N3aXRjaChrLmxvYWRpbmdfbWVjaGFuaXNtLnR5cGUpe2Nhc2UgIk5PTkUiOm51bGw9PWRbaF0mJmNvbnNvbGUud2FybigiUGx1Z2luIGhhcyBubyBsb2FkaW5nIG1lY2hhbmlzbSBhbmQgbm8gYmFrZWQtaW4gcmVnaXN0cnkgZW50cnk6ICVzIiwKaCk7Y29udGludWU7Y2FzZSAiQ1VTVE9NX0VMRU1FTlQiOnZhciBmPXt0eXBlOiJDVVNUT01fRUxFTUVOVCIsZWxlbWVudE5hbWU6ay5sb2FkaW5nX21lY2hhbmlzbS5lbGVtZW50X25hbWV9O2JyZWFrO2Nhc2UgIklGUkFNRSI6Zj17dHlwZToiSUZSQU1FIixtb2R1bGVQYXRoOmsubG9hZGluZ19tZWNoYW5pc20ubW9kdWxlX3BhdGh9O2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJVbmtub3duIGxvYWRpbmcgbWVjaGFuaXNtIGZvciBwbHVnaW4gJXM6ICVzIixoLGsubG9hZGluZ19tZWNoYW5pc20pO2NvbnRpbnVlfW51bGw9PWYmJmNvbnNvbGUuZXJyb3IoIkludmFyaWFudCB2aW9sYXRpb246IGxvYWRpbmdNZWNoYW5pc20gaXMgJXMgZm9yICVzIixmLGgpO2RbaF09e3BsdWdpbjpoLGxvYWRpbmdNZWNoYW5pc206Zix0YWJOYW1lOmsudGFiX25hbWUudG9VcHBlckNhc2UoKSxkaXNhYmxlUmVsb2FkOmsuZGlzYWJsZV9yZWxvYWQscmVtb3ZlRG9tOmsucmVtb3ZlX2RvbX19Zj17fTsKZm9yKGNvbnN0IGggb2YgT2JqZWN0LmtleXMoYikpZFtoXSYmKGZbaF09ZFtoXSk7T2JqZWN0LmFzc2lnbihmLGQpO3JldHVybiBmfSxfY29tcHV0ZURhc2hib2FyZERhdGEoYil7cmV0dXJuIE9iamVjdC52YWx1ZXMoYil9LF9mZXRjaFBsdWdpbnNMaXN0aW5nKCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO2NvbnN0IGI9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGQ9PntkLmNhbmNlbGxlZHx8KHRoaXMuX3BsdWdpbnNMaXN0aW5nPWQudmFsdWUsdGhpcy5fYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLkxPQURFRCl9KTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKGIsKCk9Pnt0aGlzLl9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPT09cWYuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5OT1RfTE9BREVEP3RoaXMuX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGU9CnFmLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuRkFJTEVEOmNvbnNvbGUud2FybigiRmFpbGVkIHRvIHJlbG9hZCB0aGUgc2V0IG9mIGFjdGl2ZSBwbHVnaW5zOyB1c2luZyBvbGQgdmFsdWUuIil9KX0sX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmRzTm90TG9hZGVkKGIpe3JldHVybiBiPT09cWYuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5OT1RfTE9BREVEfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNMb2FkZWQoYil7cmV0dXJuIGI9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLkxPQURFRH0sX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkKGIpe3JldHVybiBiPT09cWYuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5GQUlMRUR9LF9jb21wdXRlU2hvd05vRGFzaGJvYXJkc01lc3NhZ2UoYixkLGYpe3JldHVybiBiJiYwPT09ZC5sZW5ndGgmJm51bGw9PWZ9LF9jb21wdXRlU2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2UoYixkLGYpe3JldHVybiBiJiYhIWYmJgpudWxsPT1kW2ZdfSxfdXBkYXRlUm91dGVyKGIpe3ZjLnNldFJvdXRlcihiKX0sX3VwZGF0ZVRpdGxlKGIpe2ImJnRoaXMuc2V0KCJicmFuZCIsYil9LHJlbG9hZCgpe3RoaXMuX2lzUmVsb2FkRGlzYWJsZWR8fCh0aGlzLl9yZWxvYWREYXRhKCkudGhlbigoKT0+e2NvbnN0IGI9dGhpcy5fc2VsZWN0ZWREYXNoYm9hcmRDb21wb25lbnQoKTtiJiZiLnJlbG9hZCYmYi5yZWxvYWQoKX0pLHRoaXMuX2xhc3RSZWxvYWRUaW1lPShuZXcgRGF0ZSkudG9TdHJpbmcoKSl9LF9yZWxvYWREYXRhKCl7dGhpcy5fcmVmcmVzaGluZz0hMDtyZXR1cm4gUHJvbWlzZS5hbGwoW3RoaXMuX2ZldGNoUGx1Z2luc0xpc3RpbmcoKSx2Yy5lbnZpcm9ubWVudFN0b3JlLnJlZnJlc2goKSx2Yy5ydW5zU3RvcmUucmVmcmVzaCgpLHZjLmV4cGVyaW1lbnRzU3RvcmUucmVmcmVzaCgpXSkudGhlbigoKT0+e3RoaXMuX2xhc3RSZWxvYWRUaW1lU2hvcnQ9KG5ldyBEYXRlKS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLAp7bW9udGg6ImxvbmciLGRheToibnVtZXJpYyIsaG91cjoibnVtZXJpYyIsbWludXRlOiJudW1lcmljIixzZWNvbmQ6Im51bWVyaWMifSl9KS5maW5hbGx5KCgpPT57dGhpcy5fcmVmcmVzaGluZz0hMX0pfSxfZ2V0RGF0YVJlZnJlc2hpbmdDbGFzcygpe3JldHVybiB0aGlzLl9yZWZyZXNoaW5nPyJyZWZyZXNoaW5nIjoiIn0sb3BlblNldHRpbmdzKCl7dGhpcy4kLnNldHRpbmdzLm9wZW4oKTt0aGlzLiQucGFnaW5hdGlvbkxpbWl0SW5wdXQudmFsdWU9bmUuZ2V0TGltaXQoKX0sX3BhZ2luYXRpb25MaW1pdFZhbGlkYXRlKGIpe2IudGFyZ2V0LnZhbGlkYXRlKCl9LF9wYWdpbmF0aW9uTGltaXRDaGFuZ2VkKGIpe2I9TnVtYmVyLnBhcnNlSW50KGIudGFyZ2V0LnZhbHVlLDEwKTtiPT09K2ImJjA8YiYmbmUuc2V0TGltaXQoYil9fSk7Cg==", + "ok": true, + "headers": [ + [ + "content-type", + "application/javascript; charset=utf-8" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/runs": { + "data": "WyJ2ZXJzaW9uXzAiXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/environment": { + "data": "eyJkYXRhX2xvY2F0aW9uIjogImxpZ2h0bmluZ19sb2dzLyIsICJ3aW5kb3dfdGl0bGUiOiAiIn0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugins_listing": { + "data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJDdXN0b20gU2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJkZWJ1Z2dlci12MiI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiRGVidWdnZXIgVjIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiTkdfQ09NUE9ORU5UIn19LCAiaW1hZ2VzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiaW1hZ2VzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1pbWFnZS1kYXNoYm9hcmQifX0sICJhdWRpbyI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImF1ZGlvIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1hdWRpby1kYXNoYm9hcmQifX0sICJkZWJ1Z2dlciI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImRlYnVnZ2VyIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1kZWJ1Z2dlci1kYXNoYm9hcmQifX0sICJncmFwaHMiOiB7ImRpc2FibGVfcmVsb2FkIjogdHJ1ZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImdyYXBocyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtZ3JhcGgtZGFzaGJvYXJkIn19LCAiZGlzdHJpYnV0aW9ucyI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImRpc3RyaWJ1dGlvbnMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQifX0sICJoaXN0b2dyYW1zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiaGlzdG9ncmFtcyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtaGlzdG9ncmFtLWRhc2hib2FyZCJ9fSwgInRleHQiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJ0ZXh0IiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi10ZXh0LWRhc2hib2FyZCJ9fSwgInByX2N1cnZlcyI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogIlBSIEN1cnZlcyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtcHItY3VydmUtZGFzaGJvYXJkIn19LCAicHJvZmlsZV9yZWRpcmVjdCI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogIlByb2ZpbGUiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXByb2ZpbGUtcmVkaXJlY3QtZGFzaGJvYXJkIn19LCAiYmVob2xkZXIiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogdHJ1ZSwgInRhYl9uYW1lIjogImJlaG9sZGVyIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQifX0sICJocGFyYW1zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJocGFyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1ocGFyYW1zLWRhc2hib2FyZCJ9fSwgIm1lc2giOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJtZXNoIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJtZXNoLWRhc2hib2FyZCJ9fSwgInByb2plY3RvciI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAicHJvamVjdG9yIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vcHJvamVjdG9yL2luZGV4LmpzIn19LCAid2hhdGlmIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiV2hhdC1JZiBUb29sIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vd2hhdGlmL2luZGV4LmpzIn19fQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/experiments": { + "data": "W10=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/vPcynSL0qHq_6dX7lKVByXYhjbSpvc47ee6xR_80Hnw.woff2": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/tags": { + "data": "eyJ2ZXJzaW9uXzAiOiB7ImxyIjogeyJkaXNwbGF5TmFtZSI6ICJsciIsICJkZXNjcmlwdGlvbiI6ICIifSwgInRyYWluX2xvc3MiOiB7ImRpc3BsYXlOYW1lIjogInRyYWluX2xvc3MiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJ0cmFpbl9hY2MiOiB7ImRpc3BsYXlOYW1lIjogInRyYWluX2FjYyIsICJkZXNjcmlwdGlvbiI6ICIifSwgImVwb2NoIjogeyJkaXNwbGF5TmFtZSI6ICJlcG9jaCIsICJkZXNjcmlwdGlvbiI6ICIifSwgInZhbF9sb3NzIjogeyJkaXNwbGF5TmFtZSI6ICJ2YWxfbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgInZhbF9hY2MiOiB7ImRpc3BsYXlOYW1lIjogInZhbF9hY2MiLCAiZGVzY3JpcHRpb24iOiAiIn19fQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=epoch&run=version_0": { + "data": "W1sxNTk5MTI2NTcyLjAyNDk5NDQsIDQ5LCAwLjBdLCBbMTU5OTEyNjU5OC4zMTg3MzQ2LCA5OSwgMC4wXSwgWzE1OTkxMjY2MjQuNzgyMTI1NywgMTQ5LCAwLjBdLCBbMTU5OTEyNjY1MS40MDc3NjY4LCAxOTksIDAuMF0sIFsxNTk5MTI2Njc4LjE0MzUzMDEsIDI0OSwgMC4wXSwgWzE1OTkxMjY3MDQuNzI0OTA4NiwgMjk5LCAwLjBdLCBbMTU5OTEyNjczMS4zMDkxNzU3LCAzNDksIDAuMF0sIFsxNTk5MTI2NzU3Ljg2OTg4NjIsIDM5OSwgMC4wXSwgWzE1OTkxMjY3ODQuNDgxNzMwMiwgNDQ5LCAwLjBdLCBbMTU5OTEyNjg1OC44NTEyMTU2LCA0OTIsIDAuMF0sIFsxNTk5MTI2ODg3LjgwNzA1ODYsIDU0MiwgMS4wXSwgWzE1OTkxMjY5MTQuNDQzNjE1NywgNTkyLCAxLjBdLCBbMTU5OTEyNjk0MS4wNzM1NDA3LCA2NDIsIDEuMF0sIFsxNTk5MTI2OTY3LjY5NTU1MzUsIDY5MiwgMS4wXSwgWzE1OTkxMjY5OTQuMzI1MTUzLCA3NDIsIDEuMF0sIFsxNTk5MTI3MDIwLjk0MDE1OTgsIDc5MiwgMS4wXSwgWzE1OTkxMjcwNDcuNTU4NzYxOCwgODQyLCAxLjBdLCBbMTU5OTEyNzA3NC4yMTQ0NTcsIDg5MiwgMS4wXSwgWzE1OTkxMjcxMDAuNzkyOTQ4NywgOTQyLCAxLjBdLCBbMTU5OTEyNzE3NS40MTI0NjU2LCA5ODUsIDEuMF0sIFsxNTk5MTI3MjA0LjEzNDgzNDMsIDEwMzUsIDIuMF0sIFsxNTk5MTI3MjMwLjc4ODA4MTIsIDEwODUsIDIuMF0sIFsxNTk5MTI3MjU3LjQzOTgyNDgsIDExMzUsIDIuMF0sIFsxNTk5MTI3Mjg0LjA2NTc2NDIsIDExODUsIDIuMF0sIFsxNTk5MTI3MzEwLjY3Njg2MDYsIDEyMzUsIDIuMF0sIFsxNTk5MTI3MzM3LjM0MzE3NDcsIDEyODUsIDIuMF0sIFsxNTk5MTI3MzY0LjA1MjYyMSwgMTMzNSwgMi4wXSwgWzE1OTkxMjczOTAuNzQwNDEzLCAxMzg1LCAyLjBdLCBbMTU5OTEyNzQxNy40NDU0NDM2LCAxNDM1LCAyLjBdLCBbMTU5OTEyNzQ5Mi40NzM1MzcyLCAxNDc4LCAyLjBdLCBbMTU5OTEyNzUyMS40NDM2MjIsIDE1MjgsIDMuMF0sIFsxNTk5MTI3NTQ4LjIzMDUxNjcsIDE1NzgsIDMuMF0sIFsxNTk5MTI3NTc1LjA0MDg4MTQsIDE2MjgsIDMuMF0sIFsxNTk5MTI3NjAxLjg0NDk5NDMsIDE2NzgsIDMuMF0sIFsxNTk5MTI3NjI4LjY3MDg1MSwgMTcyOCwgMy4wXSwgWzE1OTkxMjc2NTUuNDM4NjA5MSwgMTc3OCwgMy4wXSwgWzE1OTkxMjc2ODIuMjUwMTQ5NSwgMTgyOCwgMy4wXSwgWzE1OTkxMjc3MDkuMDI1NDgyMiwgMTg3OCwgMy4wXSwgWzE1OTkxMjc3MzUuODU0MTUyNCwgMTkyOCwgMy4wXSwgWzE1OTkxMjc4MTAuODQzNjQ0NCwgMTk3MSwgMy4wXSwgWzE1OTkxMjc4MzkuODQ3ODU3NSwgMjAyMSwgNC4wXSwgWzE1OTkxMjc4NjYuNjAwNzYzNiwgMjA3MSwgNC4wXSwgWzE1OTkxMjc4OTMuMzc0MTY3LCAyMTIxLCA0LjBdLCBbMTU5OTEyNzkyMC4yMzI4NTYsIDIxNzEsIDQuMF0sIFsxNTk5MTI3OTQ3LjA0MTMzNjgsIDIyMjEsIDQuMF0sIFsxNTk5MTI3OTczLjgzNzk1OCwgMjI3MSwgNC4wXSwgWzE1OTkxMjgwMDAuNjEyNDIyMiwgMjMyMSwgNC4wXSwgWzE1OTkxMjgwMjcuMzg2MTU5MiwgMjM3MSwgNC4wXSwgWzE1OTkxMjgwNTQuMTUwNDM5LCAyNDIxLCA0LjBdLCBbMTU5OTEyODEyOS4yODE1NTExLCAyNDY0LCA0LjBdLCBbMTU5OTEyODE1OC4yMDk5NDM1LCAyNTE0LCA1LjBdLCBbMTU5OTEyODE4NC45OTE5MDg2LCAyNTY0LCA1LjBdLCBbMTU5OTEyODIxMS44MjQzMjU2LCAyNjE0LCA1LjBdLCBbMTU5OTEyODIzOC41ODUzODkxLCAyNjY0LCA1LjBdLCBbMTU5OTEyODI2NS4zMTU5MjM3LCAyNzE0LCA1LjBdLCBbMTU5OTEyODI5Mi4xMTExMywgMjc2NCwgNS4wXSwgWzE1OTkxMjgzMTkuMDk5MDg0NiwgMjgxNCwgNS4wXSwgWzE1OTkxMjgzNDUuODU2ODQ4NywgMjg2NCwgNS4wXSwgWzE1OTkxMjgzNzIuNjA4NDU2MSwgMjkxNCwgNS4wXSwgWzE1OTkxMjg0NDcuNTA4ODY1LCAyOTU3LCA1LjBdLCBbMTU5OTEyODQ3NS42MjQwNTk3LCAzMDA3LCA2LjBdLCBbMTU5OTEyODUwMi4zODk4NCwgMzA1NywgNi4wXSwgWzE1OTkxMjg1MjkuMTUxNzc1MSwgMzEwNywgNi4wXSwgWzE1OTkxMjg1NTUuOTAxODE3LCAzMTU3LCA2LjBdLCBbMTU5OTEyODU4Mi43MDk3OTQzLCAzMjA3LCA2LjBdLCBbMTU5OTEyODYwOS41NzA5NDI0LCAzMjU3LCA2LjBdLCBbMTU5OTEyODYzNi4zNTM0MTk4LCAzMzA3LCA2LjBdLCBbMTU5OTEyODY2My4xODU1NDksIDMzNTcsIDYuMF0sIFsxNTk5MTI4Njg5Ljk2Nzk1NTQsIDM0MDcsIDYuMF0sIFsxNTk5MTI4NzY0LjgxMzQzNTYsIDM0NTAsIDYuMF0sIFsxNTk5MTI4NzkzLjYzMjQyNzIsIDM1MDAsIDcuMF0sIFsxNTk5MTI4ODIwLjM0Nzg2OTQsIDM1NTAsIDcuMF0sIFsxNTk5MTI4ODQ3LjEyMTg3LCAzNjAwLCA3LjBdLCBbMTU5OTEyODg3My45MTMzMTkzLCAzNjUwLCA3LjBdLCBbMTU5OTEyODkwMC42OTQxMTk1LCAzNzAwLCA3LjBdLCBbMTU5OTEyODkyNy40Nzc1NywgMzc1MCwgNy4wXSwgWzE1OTkxMjg5NTQuMjE5MTE0LCAzODAwLCA3LjBdLCBbMTU5OTEyODk4MS4wMjI0OTU3LCAzODUwLCA3LjBdLCBbMTU5OTEyOTAwNy44MjM5Njg2LCAzOTAwLCA3LjBdLCBbMTU5OTEyOTA4Mi42Njc4MzI5LCAzOTQzLCA3LjBdLCBbMTU5OTEyOTExMS41ODg2OTI0LCAzOTkzLCA4LjBdLCBbMTU5OTEyOTEzOC4zMzQ1NDQ3LCA0MDQzLCA4LjBdLCBbMTU5OTEyOTE2NS4wODQxOTA0LCA0MDkzLCA4LjBdLCBbMTU5OTEyOTE5MS44MTg3MTg0LCA0MTQzLCA4LjBdLCBbMTU5OTEyOTIxOC42MDU5MzcyLCA0MTkzLCA4LjBdLCBbMTU5OTEyOTI0NS4zMzcwNzM2LCA0MjQzLCA4LjBdLCBbMTU5OTEyOTI3Mi4xMDQwNjk3LCA0MjkzLCA4LjBdLCBbMTU5OTEyOTI5OC44ODIzODYyLCA0MzQzLCA4LjBdLCBbMTU5OTEyOTMyNS42MDIzODEsIDQzOTMsIDguMF0sIFsxNTk5MTI5NDAwLjUyOTc3NTEsIDQ0MzYsIDguMF0sIFsxNTk5MTI5NDI4LjU4MjMyLCA0NDg2LCA5LjBdLCBbMTU5OTEyOTQ1NS4zNDM5NDY3LCA0NTM2LCA5LjBdLCBbMTU5OTEyOTQ4Mi4wNjg4MDY0LCA0NTg2LCA5LjBdLCBbMTU5OTEyOTUwOC44NDI2ODcsIDQ2MzYsIDkuMF0sIFsxNTk5MTI5NTM1LjYxODQ4NiwgNDY4NiwgOS4wXSwgWzE1OTkxMjk1NjIuNDQ3Njk1LCA0NzM2LCA5LjBdLCBbMTU5OTEyOTU4OS4yNTM2NjY5LCA0Nzg2LCA5LjBdLCBbMTU5OTEyOTYxNi4wMTg4OTQ3LCA0ODM2LCA5LjBdLCBbMTU5OTEyOTY0Mi44MjU4MzAyLCA0ODg2LCA5LjBdLCBbMTU5OTEyOTcxNy42NDgzNzg4LCA0OTI5LCA5LjBdLCBbMTU5OTEyOTc0NS42NDkzMTQ0LCA0OTc5LCAxMC4wXSwgWzE1OTkxMjk3NzIuNDU0NDE2OCwgNTAyOSwgMTAuMF0sIFsxNTk5MTI5Nzk5LjIyNTI5NTgsIDUwNzksIDEwLjBdLCBbMTU5OTEyOTgyNS45Njk0OTk4LCA1MTI5LCAxMC4wXSwgWzE1OTkxMjk4NTIuNzg4MzAwOCwgNTE3OSwgMTAuMF0sIFsxNTk5MTI5ODc5LjQ3MjY5MzQsIDUyMjksIDEwLjBdLCBbMTU5OTEyOTkwNi4yMDQ3NjUsIDUyNzksIDEwLjBdLCBbMTU5OTEyOTkzMi45NTI4ODA0LCA1MzI5LCAxMC4wXSwgWzE1OTkxMjk5NTkuNzE2MTE0NSwgNTM3OSwgMTAuMF0sIFsxNTk5MTMwMDM0LjU4Nzk4NTUsIDU0MjIsIDEwLjBdLCBbMTU5OTEzMDA2My43MDIzOTczLCA1NDcyLCAxMS4wXSwgWzE1OTkxMzAwOTAuNDEyMTU0MiwgNTUyMiwgMTEuMF0sIFsxNTk5MTMwMTE3LjIwMDg1ODQsIDU1NzIsIDExLjBdLCBbMTU5OTEzMDE0My45Nzg4MDE1LCA1NjIyLCAxMS4wXSwgWzE1OTkxMzAxNzAuNzU4Njk3NSwgNTY3MiwgMTEuMF0sIFsxNTk5MTMwMTk3LjYxMDIyNzMsIDU3MjIsIDExLjBdLCBbMTU5OTEzMDIyNC4zODcwODExLCA1NzcyLCAxMS4wXSwgWzE1OTkxMzAyNTEuMTczNTExMywgNTgyMiwgMTEuMF0sIFsxNTk5MTMwMjc3LjkwMzkzMTYsIDU4NzIsIDExLjBdLCBbMTU5OTEzMDM1Mi45MjEwMTg4LCA1OTE1LCAxMS4wXSwgWzE1OTkxMzAzODAuOTU1OTYsIDU5NjUsIDEyLjBdLCBbMTU5OTEzMDQwNy43MDk0MzQsIDYwMTUsIDEyLjBdLCBbMTU5OTEzMDQzNC41MTczOTEsIDYwNjUsIDEyLjBdLCBbMTU5OTEzMDQ2MS4yOTkwOTQsIDYxMTUsIDEyLjBdLCBbMTU5OTEzMDQ4OC4xMDgyMzIzLCA2MTY1LCAxMi4wXSwgWzE1OTkxMzA1MTQuODk2NjQ2MywgNjIxNSwgMTIuMF0sIFsxNTk5MTMwNTQxLjU0MzQ0NjMsIDYyNjUsIDEyLjBdLCBbMTU5OTEzMDU2OC4xODgyNDQzLCA2MzE1LCAxMi4wXSwgWzE1OTkxMzA1OTQuODQ2NTQ0NywgNjM2NSwgMTIuMF0sIFsxNTk5MTMwNjcwLjI3NTYzMTIsIDY0MDgsIDEyLjBdLCBbMTU5OTEzMDY5OC45NzI3Mjk3LCA2NDU4LCAxMy4wXSwgWzE1OTkxMzA3MjUuNTg3ODA2LCA2NTA4LCAxMy4wXSwgWzE1OTkxMzA3NTIuMjI2MjY3NiwgNjU1OCwgMTMuMF0sIFsxNTk5MTMwNzc4Ljg4ODU4MywgNjYwOCwgMTMuMF0sIFsxNTk5MTMwODA1LjQ4MDU2NjMsIDY2NTgsIDEzLjBdLCBbMTU5OTEzMDgzMi4wOTQ4NDM0LCA2NzA4LCAxMy4wXSwgWzE1OTkxMzA4NTguNzM2NjA4NSwgNjc1OCwgMTMuMF0sIFsxNTk5MTMwODg1LjQwODkyNzIsIDY4MDgsIDEzLjBdLCBbMTU5OTEzMDkxMS45ODM5NTUsIDY4NTgsIDEzLjBdLCBbMTU5OTEzMDk4Ni42MjIyMjQ2LCA2OTAxLCAxMy4wXSwgWzE1OTkxMzEwMTQuNTI3MzE0NywgNjk1MSwgMTQuMF0sIFsxNTk5MTMxMDQxLjE3NDQ3OTIsIDcwMDEsIDE0LjBdLCBbMTU5OTEzMTA2Ny43ODcxOTUsIDcwNTEsIDE0LjBdLCBbMTU5OTEzMTA5NC40MjI1ODQsIDcxMDEsIDE0LjBdLCBbMTU5OTEzMTEyMS4wODE0MTY4LCA3MTUxLCAxNC4wXSwgWzE1OTkxMzExNDcuNzIwMzk4NywgNzIwMSwgMTQuMF0sIFsxNTk5MTMxMTc0LjM1ODgxNTQsIDcyNTEsIDE0LjBdLCBbMTU5OTEzMTIwMC45ODgwOTA1LCA3MzAxLCAxNC4wXSwgWzE1OTkxMzEyMjcuNTgyNTUzNiwgNzM1MSwgMTQuMF0sIFsxNTk5MTMxMzAyLjAxMDMzNTIsIDczOTQsIDE0LjBdLCBbMTU5OTEzMTMzMC42NzUxNzk1LCA3NDQ0LCAxNS4wXSwgWzE1OTkxMzEzNTcuMjgyMTYwOCwgNzQ5NCwgMTUuMF0sIFsxNTk5MTMxMzgzLjkyMDExMSwgNzU0NCwgMTUuMF0sIFsxNTk5MTMxNDEwLjU2NjA4NiwgNzU5NCwgMTUuMF0sIFsxNTk5MTMxNDM3LjIwMjU1NDIsIDc2NDQsIDE1LjBdLCBbMTU5OTEzMTQ2My44MTI2OTA3LCA3Njk0LCAxNS4wXSwgWzE1OTkxMzE0OTAuNDI1MjMxNywgNzc0NCwgMTUuMF0sIFsxNTk5MTMxNTE2Ljk4Mjg2NzcsIDc3OTQsIDE1LjBdLCBbMTU5OTEzMTU0My41ODY1OTY1LCA3ODQ0LCAxNS4wXSwgWzE1OTkxMzE2MTguMTIyMjM3LCA3ODg3LCAxNS4wXSwgWzE1OTkxMzE2NDUuODgzMjcxLCA3OTM3LCAxNi4wXSwgWzE1OTkxMzE2NzIuNDY1ODIxLCA3OTg3LCAxNi4wXSwgWzE1OTkxMzE2OTkuMDMxODg2MywgODAzNywgMTYuMF0sIFsxNTk5MTMxNzI1LjY3MTQyMywgODA4NywgMTYuMF0sIFsxNTk5MTMxNzUyLjIzNzk4NTYsIDgxMzcsIDE2LjBdLCBbMTU5OTEzMTc3OC44NzkzNDExLCA4MTg3LCAxNi4wXSwgWzE1OTkxMzE4MDUuNDc5MjMwNiwgODIzNywgMTYuMF0sIFsxNTk5MTMxODMyLjA4NTU0MzIsIDgyODcsIDE2LjBdLCBbMTU5OTEzMTg1OC42OTU3NjUsIDgzMzcsIDE2LjBdLCBbMTU5OTEzMTkzMy4wNDc2NzM3LCA4MzgwLCAxNi4wXSwgWzE1OTkxMzE5NjAuODEwOSwgODQzMCwgMTcuMF0sIFsxNTk5MTMxOTg3LjQ2MjYyODYsIDg0ODAsIDE3LjBdLCBbMTU5OTEzMjAxNC4wODg3MjIyLCA4NTMwLCAxNy4wXSwgWzE1OTkxMzIwNDAuNzQ1NzIzNSwgODU4MCwgMTcuMF0sIFsxNTk5MTMyMDY3LjM4Njg1NDIsIDg2MzAsIDE3LjBdLCBbMTU5OTEzMjA5My45Njg4NDY2LCA4NjgwLCAxNy4wXSwgWzE1OTkxMzIxMjAuNjI1MzQ1NywgODczMCwgMTcuMF0sIFsxNTk5MTMyMTQ3LjI1OTkzMzcsIDg3ODAsIDE3LjBdLCBbMTU5OTEzMjE3My44OTY5NzUsIDg4MzAsIDE3LjBdLCBbMTU5OTEzMjI0OC40MTg0Njg3LCA4ODczLCAxNy4wXSwgWzE1OTkxMzIyNzYuMjkxNDk0LCA4OTIzLCAxOC4wXSwgWzE1OTkxMzIzMDIuOTE1NjE5OSwgODk3MywgMTguMF0sIFsxNTk5MTMyMzI5LjU1ODc4MSwgOTAyMywgMTguMF0sIFsxNTk5MTMyMzU2LjIzNjYzNzQsIDkwNzMsIDE4LjBdLCBbMTU5OTEzMjM4Mi44NTYxODk1LCA5MTIzLCAxOC4wXSwgWzE1OTkxMzI0MDkuNTIzOTU5LCA5MTczLCAxOC4wXSwgWzE1OTkxMzI0MzYuMTc0NzM1LCA5MjIzLCAxOC4wXSwgWzE1OTkxMzI0NjIuNzU2ODY4MSwgOTI3MywgMTguMF0sIFsxNTk5MTMyNDg5LjM3MTcyMywgOTMyMywgMTguMF0sIFsxNTk5MTMyNTYzLjk5MjM4ODcsIDkzNjYsIDE4LjBdLCBbMTU5OTEzMjU5MS45NTc3Njk2LCA5NDE2LCAxOS4wXSwgWzE1OTkxMzI2MTguNTYyOTY3OCwgOTQ2NiwgMTkuMF0sIFsxNTk5MTMyNjQ1LjI0NzQwNzcsIDk1MTYsIDE5LjBdLCBbMTU5OTEzMjY3MS44ODM2NjI3LCA5NTY2LCAxOS4wXSwgWzE1OTkxMzI2OTguNzAzNzQ0LCA5NjE2LCAxOS4wXSwgWzE1OTkxMzI3MjUuNDgyOTc5LCA5NjY2LCAxOS4wXSwgWzE1OTkxMzI3NTIuMjg2MzU4NCwgOTcxNiwgMTkuMF0sIFsxNTk5MTMyNzc5LjA3ODQ0NywgOTc2NiwgMTkuMF0sIFsxNTk5MTMyODA1Ljg5MzcxMzcsIDk4MTYsIDE5LjBdLCBbMTU5OTEzMjg4MC45MzY3OTU3LCA5ODU5LCAxOS4wXSwgWzE1OTkxMzI5MDkuODg2OTU3NiwgOTkwOSwgMjAuMF0sIFsxNTk5MTMyOTM2LjcwMTIwMTIsIDk5NTksIDIwLjBdLCBbMTU5OTEzMjk2My42MzU2MjM1LCAxMDAwOSwgMjAuMF0sIFsxNTk5MTMyOTkwLjQwNjI1NjQsIDEwMDU5LCAyMC4wXSwgWzE1OTkxMzMwMTcuMTc3OTc4LCAxMDEwOSwgMjAuMF0sIFsxNTk5MTMzMDQzLjk1NzU5NTgsIDEwMTU5LCAyMC4wXSwgWzE1OTkxMzMwNzAuNzUyODYxLCAxMDIwOSwgMjAuMF0sIFsxNTk5MTMzMDk3LjQ4NjQ0NzMsIDEwMjU5LCAyMC4wXSwgWzE1OTkxMzMxMjQuMjg5MDUyNywgMTAzMDksIDIwLjBdLCBbMTU5OTEzMzE5OS4zNzQ2OTIyLCAxMDM1MiwgMjAuMF0sIFsxNTk5MTMzMjI4LjMxMDgyNDIsIDEwNDAyLCAyMS4wXSwgWzE1OTkxMzMyNTUuMTk5NzU4LCAxMDQ1MiwgMjEuMF0sIFsxNTk5MTMzMjgxLjk0NjY3MzQsIDEwNTAyLCAyMS4wXSwgWzE1OTkxMzMzMDguODE0NTMyLCAxMDU1MiwgMjEuMF0sIFsxNTk5MTMzMzM1LjU5NDMyMzQsIDEwNjAyLCAyMS4wXSwgWzE1OTkxMzMzNjIuMzg4ODc5MywgMTA2NTIsIDIxLjBdLCBbMTU5OTEzMzM4OS4xNjU3MDEyLCAxMDcwMiwgMjEuMF0sIFsxNTk5MTMzNDE1Ljk3NTE3MzIsIDEwNzUyLCAyMS4wXSwgWzE1OTkxMzM0NDIuNzU5MTExNCwgMTA4MDIsIDIxLjBdLCBbMTU5OTEzMzUxNy42NjAzOTksIDEwODQ1LCAyMS4wXSwgWzE1OTkxMzM1NDUuNjA5Nzk1LCAxMDg5NSwgMjIuMF0sIFsxNTk5MTMzNTcyLjM4NzY2NjIsIDEwOTQ1LCAyMi4wXSwgWzE1OTkxMzM1OTkuMTQ1ODgzOCwgMTA5OTUsIDIyLjBdLCBbMTU5OTEzMzYyNS45OTAxNzE3LCAxMTA0NSwgMjIuMF0sIFsxNTk5MTMzNjUyLjgxMzEwNjUsIDExMDk1LCAyMi4wXSwgWzE1OTkxMzM2NzkuNTgwODg0NSwgMTExNDUsIDIyLjBdLCBbMTU5OTEzMzcwNi4zNzUzODY1LCAxMTE5NSwgMjIuMF0sIFsxNTk5MTMzNzMzLjA5MzQ2MywgMTEyNDUsIDIyLjBdLCBbMTU5OTEzMzc1OS44ODY0OTM3LCAxMTI5NSwgMjIuMF0sIFsxNTk5MTMzODM0LjY4ODMyMzMsIDExMzM4LCAyMi4wXSwgWzE1OTkxMzM4NjIuNzkyNTAyNiwgMTEzODgsIDIzLjBdLCBbMTU5OTEzMzg4OS41Mjc3MjcxLCAxMTQzOCwgMjMuMF0sIFsxNTk5MTMzOTE2LjMyMTIzLCAxMTQ4OCwgMjMuMF0sIFsxNTk5MTMzOTQzLjA5NDMyNzQsIDExNTM4LCAyMy4wXSwgWzE1OTkxMzM5NjkuOTI0Mzc4OSwgMTE1ODgsIDIzLjBdLCBbMTU5OTEzMzk5Ni42ODYyNzEyLCAxMTYzOCwgMjMuMF0sIFsxNTk5MTM0MDIzLjUyNjIxNDgsIDExNjg4LCAyMy4wXSwgWzE1OTkxMzQwNTAuMzU0MjAzNywgMTE3MzgsIDIzLjBdLCBbMTU5OTEzNDA3Ny4xNjIwNjAzLCAxMTc4OCwgMjMuMF0sIFsxNTk5MTM0MTUyLjA3MDM3MiwgMTE4MzEsIDIzLjBdLCBbMTU5OTEzNDE4MS4wNzM5MzksIDExODgxLCAyNC4wXSwgWzE1OTkxMzQyMDcuODU5ODcwNywgMTE5MzEsIDI0LjBdLCBbMTU5OTEzNDIzNC42NTEwNjk2LCAxMTk4MSwgMjQuMF0sIFsxNTk5MTM0MjYxLjQzMzkyODMsIDEyMDMxLCAyNC4wXSwgWzE1OTkxMzQyODguMTk4NjQzNCwgMTIwODEsIDI0LjBdLCBbMTU5OTEzNDMxNC45OTQ2MDA4LCAxMjEzMSwgMjQuMF0sIFsxNTk5MTM0MzQxLjczNDc3NTgsIDEyMTgxLCAyNC4wXSwgWzE1OTkxMzQzNjguNDY2NjY4LCAxMjIzMSwgMjQuMF0sIFsxNTk5MTM0Mzk1LjI2MTAwMzcsIDEyMjgxLCAyNC4wXSwgWzE1OTkxMzQ0NzAuMTk2Nzg2NCwgMTIzMjQsIDI0LjBdLCBbMTU5OTEzNDQ5OS4wNzMxNDk0LCAxMjM3NCwgMjUuMF0sIFsxNTk5MTM0NTI1Ljc3Mjg0NDMsIDEyNDI0LCAyNS4wXSwgWzE1OTkxMzQ1NTIuNTI1OTkxNywgMTI0NzQsIDI1LjBdLCBbMTU5OTEzNDU3OS4yNzIyMTA4LCAxMjUyNCwgMjUuMF0sIFsxNTk5MTM0NjA2LjExMDcxMDksIDEyNTc0LCAyNS4wXSwgWzE1OTkxMzQ2MzIuODM2ODYsIDEyNjI0LCAyNS4wXSwgWzE1OTkxMzQ2NTkuNTc1NzE4NiwgMTI2NzQsIDI1LjBdLCBbMTU5OTEzNDY4Ni4zNjM1MTgyLCAxMjcyNCwgMjUuMF0sIFsxNTk5MTM0NzEzLjA3OTY2OSwgMTI3NzQsIDI1LjBdLCBbMTU5OTEzNDc4OC4wNDY5MzEzLCAxMjgxNywgMjUuMF0sIFsxNTk5MTM0ODE2LjEwNDM2NzcsIDEyODY3LCAyNi4wXSwgWzE1OTkxMzQ4NDIuODM1NTc5OSwgMTI5MTcsIDI2LjBdLCBbMTU5OTEzNDg2OS41NDc2MzA1LCAxMjk2NywgMjYuMF0sIFsxNTk5MTM0ODk2LjI4MDc0MjYsIDEzMDE3LCAyNi4wXSwgWzE1OTkxMzQ5MjMuMDExOTg4OSwgMTMwNjcsIDI2LjBdLCBbMTU5OTEzNDk0OS43ODY0NTMyLCAxMzExNywgMjYuMF0sIFsxNTk5MTM0OTc2LjU2MTE0NDgsIDEzMTY3LCAyNi4wXSwgWzE1OTkxMzUwMDMuMzE3NDg0NiwgMTMyMTcsIDI2LjBdLCBbMTU5OTEzNTAzMC4wNTg4MTI2LCAxMzI2NywgMjYuMF0sIFsxNTk5MTM1MTA1LjA3MTMyLCAxMzMxMCwgMjYuMF0sIFsxNTk5MTM1MTMzLjk2MTc1NjIsIDEzMzYwLCAyNy4wXSwgWzE1OTkxMzUxNjAuNjk1MzI3OCwgMTM0MTAsIDI3LjBdLCBbMTU5OTEzNTE4Ny40MjEzMjg1LCAxMzQ2MCwgMjcuMF0sIFsxNTk5MTM1MjE0LjExNDExNjQsIDEzNTEwLCAyNy4wXSwgWzE1OTkxMzUyNDEuMDQ2NTAzLCAxMzU2MCwgMjcuMF0sIFsxNTk5MTM1MjY3Ljc2NjUxLCAxMzYxMCwgMjcuMF0sIFsxNTk5MTM1Mjk0LjUxMjE3MywgMTM2NjAsIDI3LjBdLCBbMTU5OTEzNTMyMS4yNTY1MDY0LCAxMzcxMCwgMjcuMF0sIFsxNTk5MTM1MzQ3Ljk2OTc1MSwgMTM3NjAsIDI3LjBdLCBbMTU5OTEzNTQyMi45MjA2Mzc0LCAxMzgwMywgMjcuMF0sIFsxNTk5MTM1NDUxLjAwMTQxMjIsIDEzODUzLCAyOC4wXSwgWzE1OTkxMzU0NzcuNzU4ODE5LCAxMzkwMywgMjguMF0sIFsxNTk5MTM1NTA0LjQ2OTYzMjEsIDEzOTUzLCAyOC4wXSwgWzE1OTkxMzU1MzEuMjE4Njc5LCAxNDAwMywgMjguMF0sIFsxNTk5MTM1NTU3Ljg0NTE5NjIsIDE0MDUzLCAyOC4wXSwgWzE1OTkxMzU1ODQuNDkxOTk3NywgMTQxMDMsIDI4LjBdLCBbMTU5OTEzNTYxMS4xMzc4MzkzLCAxNDE1MywgMjguMF0sIFsxNTk5MTM1NjM3LjgyOTU3ODYsIDE0MjAzLCAyOC4wXSwgWzE1OTkxMzU2NjQuNDE4OTI5LCAxNDI1MywgMjguMF0sIFsxNTk5MTM1NzM5LjEwNDE5NjUsIDE0Mjk2LCAyOC4wXSwgWzE1OTkxMzU3NjcuOTI4MzU0MywgMTQzNDYsIDI5LjBdLCBbMTU5OTEzNTc5NC41OTc0NTYyLCAxNDM5NiwgMjkuMF0sIFsxNTk5MTM1ODIxLjIxMTQ2MjUsIDE0NDQ2LCAyOS4wXSwgWzE1OTkxMzU4NDcuODQzNzgxNSwgMTQ0OTYsIDI5LjBdLCBbMTU5OTEzNTg3NC40ODI0MTYyLCAxNDU0NiwgMjkuMF0sIFsxNTk5MTM1OTAxLjI0MDQ2ODcsIDE0NTk2LCAyOS4wXSwgWzE1OTkxMzU5MjcuOTA3NTI0OCwgMTQ2NDYsIDI5LjBdLCBbMTU5OTEzNTk1NC41NjEzMDcyLCAxNDY5NiwgMjkuMF0sIFsxNTk5MTM1OTgxLjIwMTg3OTcsIDE0NzQ2LCAyOS4wXSwgWzE1OTkxMzYwNTYuMzI0NjUzNiwgMTQ3ODksIDI5LjBdLCBbMTU5OTEzNjA4NC4zMjcyMDA3LCAxNDgzOSwgMzAuMF0sIFsxNTk5MTM2MTExLjAzOTY0NCwgMTQ4ODksIDMwLjBdLCBbMTU5OTEzNjEzNy43NDU1MTQ0LCAxNDkzOSwgMzAuMF0sIFsxNTk5MTM2MTY0LjQwMDkzNzYsIDE0OTg5LCAzMC4wXSwgWzE1OTkxMzYxOTEuMDQ4MzY3NSwgMTUwMzksIDMwLjBdLCBbMTU5OTEzNjIxNy43NjAxNTExLCAxNTA4OSwgMzAuMF0sIFsxNTk5MTM2MjQ0LjQ4NzU2NiwgMTUxMzksIDMwLjBdLCBbMTU5OTEzNjI3MS4xNzg5ODQyLCAxNTE4OSwgMzAuMF0sIFsxNTk5MTM2Mjk3Ljg2OTUsIDE1MjM5LCAzMC4wXSwgWzE1OTkxMzYzNzIuNjU4NDI2OCwgMTUyODIsIDMwLjBdLCBbMTU5OTEzNjQwMC41NzE4NDIyLCAxNTMzMiwgMzEuMF0sIFsxNTk5MTM2NDI3LjM1Mjk3NjgsIDE1MzgyLCAzMS4wXSwgWzE1OTkxMzY0NTQuMDIxNjIsIDE1NDMyLCAzMS4wXSwgWzE1OTkxMzY0ODAuNjcxMjk0MiwgMTU0ODIsIDMxLjBdLCBbMTU5OTEzNjUwNy4zMTU0NzcsIDE1NTMyLCAzMS4wXSwgWzE1OTkxMzY1MzQuMDQ0MDE4NywgMTU1ODIsIDMxLjBdLCBbMTU5OTEzNjU2MC42NjgzNDk1LCAxNTYzMiwgMzEuMF0sIFsxNTk5MTM2NTg3LjM3Njk5NTgsIDE1NjgyLCAzMS4wXSwgWzE1OTkxMzY2MTQuMTI5NjM2LCAxNTczMiwgMzEuMF0sIFsxNTk5MTM2Njg5LjAxOTEzMjYsIDE1Nzc1LCAzMS4wXSwgWzE1OTkxMzY3MTYuOTM0NDk5NSwgMTU4MjUsIDMyLjBdLCBbMTU5OTEzNjc0My41Njk1MTc0LCAxNTg3NSwgMzIuMF0sIFsxNTk5MTM2NzcwLjIyNzE1OCwgMTU5MjUsIDMyLjBdLCBbMTU5OTEzNjc5Ni45MTQ5NjQyLCAxNTk3NSwgMzIuMF0sIFsxNTk5MTM2ODIzLjYyMjM0MDQsIDE2MDI1LCAzMi4wXSwgWzE1OTkxMzY4NTAuMjg4MTQwNSwgMTYwNzUsIDMyLjBdLCBbMTU5OTEzNjg3Ni45Mzg1NTQsIDE2MTI1LCAzMi4wXSwgWzE1OTkxMzY5MDMuNjE4NjY4MywgMTYxNzUsIDMyLjBdXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=lr&run=version_0": { + "data": "W1sxNTk5MTI2NTU1LjgxODk4MSwgMCwgMS42NjY2NjY2ODUxOTYxMDU0ZS0wNV0sIFsxNTk5MTI2NTY4LjM0NDcwNzMsIDAsIDEuNjY2NjY2Njg1MTk2MTA1NGUtMDVdLCBbMTU5OTEyNjU2OS45MTkxNzgsIDAsIDEuNjY2NjY2Njg1MTk2MTA1NGUtMDVdLCBbMTU5OTEyNjU3NS42ODAyMTQsIDAsIDEuNjY2NjY2Njg1MTk2MTA1NGUtMDVdLCBbMTU5OTEyNjU4My41NjI0MjQyLCAwLCAxLjY2NjY2NjY4NTE5NjEwNTRlLTA1XSwgWzE1OTkxMjY1OTUuNjUwMTQzLCAwLCAxLjY2NjY2NjY4NTE5NjEwNTRlLTA1XSwgWzE1OTkxMjY2MjcuOTc3MzA5LCAwLCAxLjY2NjY2NjY4NTE5NjEwNTRlLTA1XSwgWzE1OTkxMjY2MjkuNTg5ODYzOCwgMCwgMS42NjY2NjY2ODUxOTYxMDU0ZS0wNV0sIFsxNTk5MTI2NjM0LjM1NTc4NjYsIDAsIDEuNjY2NjY2Njg1MTk2MTA1NGUtMDVdLCBbMTU5OTEyNjY2Ny40MzQxMTIzLCAwLCAxLjY2NjY2NjY4NTE5NjEwNTRlLTA1XSwgWzE1OTkxMjY2NzAuMDg3NjcxMywgMCwgMS42NjY2NjY2ODUxOTYxMDU0ZS0wNV0sIFsxNTk5MTI2NjgxLjMyMzcwMTksIDAsIDEuNjY2NjY2Njg1MTk2MTA1NGUtMDVdLCBbMTU5OTEyNjY4My45Nzg4MjI3LCAwLCAxLjY2NjY2NjY4NTE5NjEwNTRlLTA1XSwgWzE1OTkxMjY2ODcuNjg0MjE5NiwgMCwgMS42NjY2NjY2ODUxOTYxMDU0ZS0wNV0sIFsxNTk5MTI2NjkwLjg3MjY0MTMsIDAsIDEuNjY2NjY2Njg1MTk2MTA1NGUtMDVdLCBbMTU5OTEyNjcwOS40NjQzMzksIDAsIDEuNjY2NjY2Njg1MTk2MTA1NGUtMDVdLCBbMTU5OTEyNjcxMC41MzYxMzgzLCAwLCAxLjY2NjY2NjY4NTE5NjEwNTRlLTA1XSwgWzE1OTkxMjY3MTQuNzk2MjQ3NSwgMCwgMS42NjY2NjY2ODUxOTYxMDU0ZS0wNV0sIFsxNTk5MTI2NzMwLjIyNDU5NDQsIDAsIDEuNjY2NjY2Njg1MTk2MTA1NGUtMDVdLCBbMTU5OTEyNjc0MC44ODQyMzY4LCAwLCAxLjY2NjY2NjY4NTE5NjEwNTRlLTA1XSwgWzE1OTkxMjY3NjkuNTYwOTkyNywgMCwgMS42NjY2NjY2ODUxOTYxMDU0ZS0wNV0sIFsxNTk5MTI2NzcwLjA4OTcwOSwgMCwgMS42NjY2NjY2ODUxOTYxMDU0ZS0wNV0sIFsxNTk5MTI2NzgwLjcyMTY0MzQsIDAsIDEuNjY2NjY2Njg1MTk2MTA1NGUtMDVdLCBbMTU5OTEyNjc5MC4yOTQ1OTc2LCAwLCAxLjY2NjY2NjY4NTE5NjEwNTRlLTA1XSwgWzE1OTkxMjY3OTcuNzI4NTc0LCAwLCAxLjY2NjY2NjY4NTE5NjEwNTRlLTA1XSwgWzE1OTkxMjY4ODQuNTg4NjQ4OCwgMSwgMy4zMzMzMzMzNzAzOTIyMTFlLTA1XSwgWzE1OTkxMjY4OTguOTk1MTYyLCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNjkwNy41MjIyMTY4LCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNjkxMS4yMzk2NjY1LCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNjkxMS43NjczMzEsIDEsIDMuMzMzMzMzMzcwMzkyMjExZS0wNV0sIFsxNTk5MTI2OTI5LjMzNzg2ODIsIDEsIDMuMzMzMzMzMzcwMzkyMjExZS0wNV0sIFsxNTk5MTI2OTM2LjgwMzcxNjcsIDEsIDMuMzMzMzMzMzcwMzkyMjExZS0wNV0sIFsxNTk5MTI2OTQxLjA1NzI0NSwgMSwgMy4zMzMzMzMzNzAzOTIyMTFlLTA1XSwgWzE1OTkxMjY5NDMuNzE1ODM4NCwgMSwgMy4zMzMzMzMzNzAzOTIyMTFlLTA1XSwgWzE1OTkxMjY5NDQuNzc0NDIzOCwgMSwgMy4zMzMzMzMzNzAzOTIyMTFlLTA1XSwgWzE1OTkxMjY5NTEuMTcxNTY1LCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNjk1Ni40NzExMDU4LCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNjk3OS4zOTg2NjUyLCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNjk4My42NTY3NDY5LCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNjk4Ny45MjAwNTcsIDEsIDMuMzMzMzMzMzcwMzkyMjExZS0wNV0sIFsxNTk5MTI3MDAxLjc3MDQzMjIsIDEsIDMuMzMzMzMzMzcwMzkyMjExZS0wNV0sIFsxNTk5MTI3MDA2LjU2MzMzOSwgMSwgMy4zMzMzMzMzNzAzOTIyMTFlLTA1XSwgWzE1OTkxMjcwMDguNzAzMzc0MSwgMSwgMy4zMzMzMzMzNzAzOTIyMTFlLTA1XSwgWzE1OTkxMjcwMDkuNzcxNjU3NSwgMSwgMy4zMzMzMzMzNzAzOTIyMTFlLTA1XSwgWzE1OTkxMjcwMTcuMjI5MjE0LCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNzAxOC4yODc5MDY0LCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNzAyMS45OTIzNTQyLCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNzAyNi4yNTQzOTYsIDEsIDMuMzMzMzMzMzcwMzkyMjExZS0wNV0sIFsxNTk5MTI3MDI5LjQ0ODc0NzksIDEsIDMuMzMzMzMzMzcwMzkyMjExZS0wNV0sIFsxNTk5MTI3MDQ0LjM2MDI1MjksIDEsIDMuMzMzMzMzMzcwMzkyMjExZS0wNV0sIFsxNTk5MTI3MDgzLjI1NjEyNDUsIDEsIDMuMzMzMzMzMzcwMzkyMjExZS0wNV0sIFsxNTk5MTI3MTAyLjM3MjI4MywgMSwgMy4zMzMzMzMzNzAzOTIyMTFlLTA1XSwgWzE1OTkxMjcxMTEuNDA2NjU1NiwgMSwgMy4zMzMzMzMzNzAzOTIyMTFlLTA1XSwgWzE1OTkxMjcxMTYuMjAwMzc2NywgMSwgMy4zMzMzMzMzNzAzOTIyMTFlLTA1XSwgWzE1OTkxMjcxMTYuNzM3MTA0LCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNzExOS45MDkwNTY3LCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNzEyMy4wNjE2NTE1LCAxLCAzLjMzMzMzMzM3MDM5MjIxMWUtMDVdLCBbMTU5OTEyNzE4Ni41ODI4MjQ1LCAyLCA0Ljk5OTk5OTg3MzY4OTM3NmUtMDVdLCBbMTU5OTEyNzE4OC4xNzkxNDY1LCAyLCA0Ljk5OTk5OTg3MzY4OTM3NmUtMDVdLCBbMTU5OTEyNzE5Mi45NDg4OTc4LCAyLCA0Ljk5OTk5OTg3MzY4OTM3NmUtMDVdLCBbMTU5OTEyNzIxOS4wMTQ3NTk4LCAyLCA0Ljk5OTk5OTg3MzY4OTM3NmUtMDVdLCBbMTU5OTEyNzIyMC42MDY1NTksIDIsIDQuOTk5OTk5ODczNjg5Mzc2ZS0wNV0sIFsxNTk5MTI3MjIzLjc5OTgwNywgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjcyMjcuMDQzNTQ3OSwgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjcyMzUuMDQxNTA4NywgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjcyMzguMjUwNjUwMiwgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjcyNDAuOTAyNTg5LCAyLCA0Ljk5OTk5OTg3MzY4OTM3NmUtMDVdLCBbMTU5OTEyNzI2OC42MTAyNTQ4LCAyLCA0Ljk5OTk5OTg3MzY4OTM3NmUtMDVdLCBbMTU5OTEyNzI3MS4yNzc2MzQsIDIsIDQuOTk5OTk5ODczNjg5Mzc2ZS0wNV0sIFsxNTk5MTI3MjcxLjgwODIwNjgsIDIsIDQuOTk5OTk5ODczNjg5Mzc2ZS0wNV0sIFsxNTk5MTI3MjgxLjM3Mzc1NzQsIDIsIDQuOTk5OTk5ODczNjg5Mzc2ZS0wNV0sIFsxNTk5MTI3Mjg4LjMwNTA3MiwgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjczMTUuNDQ5NjQ4LCAyLCA0Ljk5OTk5OTg3MzY4OTM3NmUtMDVdLCBbMTU5OTEyNzMyNC41MTc4MTQ5LCAyLCA0Ljk5OTk5OTg3MzY4OTM3NmUtMDVdLCBbMTU5OTEyNzMzNS4xOTUwNDIsIDIsIDQuOTk5OTk5ODczNjg5Mzc2ZS0wNV0sIFsxNTk5MTI3MzUzLjg1NzYwMSwgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjczNTUuNDc1ODQ5MiwgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjczNjIuOTc4MDA5NSwgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjczNjUuMTE1ODQzNSwgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjczOTAuNzIzNjE4NSwgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjczOTQuNDMzMTY5MSwgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjc0MDYuMjAwMTk5OCwgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjc0MTIuNjA1MTM2MiwgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjc0MTcuOTYzNTA5MywgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjc0MzQuMDE0Njc2NiwgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjc0MzkuODc3MTY1MywgMiwgNC45OTk5OTk4NzM2ODkzNzZlLTA1XSwgWzE1OTkxMjc0OTguMzg3Mjc4NiwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc1MDEuNjA3Mzg5MiwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc1MTguNzM0NDQ4MiwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc1MzQuMjcyMjc1NywgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc1NDIuODU0ODQwOCwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc1NTEuNDExNTM2MiwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc1NTMuNTQ2NzUyMiwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc1NjIuNjY1OTAzMywgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc1ODEuNDcyMTgwOCwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc2MDMuOTcyNzA3NywgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc2MDguNzczMDE3NiwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc2MTEuOTkzNTg2NSwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc2MTQuNjc5NjM1OCwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc2MTguNDIxNjgxMiwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc2MjMuMjYwNjA5NiwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc2MzAuODEwMzQ4NSwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc2MzEuODc0MzUwNSwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc2MzMuNDg2ODQ0OCwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc2MzguMjgzMzE5NywgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc2NTcuMDE2NTY2OCwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc2NjkuOTAzOTQ5LCAzLCA2LjY2NjY2Njc0MDc4NDQyMmUtMDVdLCBbMTU5OTEyNzY4MS4xNjE1OTE4LCAzLCA2LjY2NjY2Njc0MDc4NDQyMmUtMDVdLCBbMTU5OTEyNzY5MC44MTM0NzUsIDMsIDYuNjY2NjY2NzQwNzg0NDIyZS0wNV0sIFsxNTk5MTI3Njk1LjYyNTYyNywgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc3MDIuNjA3NzY1NCwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc3MDQuMTk5ODcxLCAzLCA2LjY2NjY2Njc0MDc4NDQyMmUtMDVdLCBbMTU5OTEyNzcwOC40NzQ5ODA2LCAzLCA2LjY2NjY2Njc0MDc4NDQyMmUtMDVdLCBbMTU5OTEyNzcyOS45Mzc4MjU3LCAzLCA2LjY2NjY2Njc0MDc4NDQyMmUtMDVdLCBbMTU5OTEyNzczOS4wMzkwODU2LCAzLCA2LjY2NjY2Njc0MDc4NDQyMmUtMDVdLCBbMTU5OTEyNzc0NC40MDE4ODU3LCAzLCA2LjY2NjY2Njc0MDc4NDQyMmUtMDVdLCBbMTU5OTEyNzc0Ni4wMTI3MiwgMywgNi42NjY2NjY3NDA3ODQ0MjJlLTA1XSwgWzE1OTkxMjc3NTYuNzE4NDk0LCAzLCA2LjY2NjY2Njc0MDc4NDQyMmUtMDVdLCBbMTU5OTEyNzgxOS41MTM5ODg1LCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzgyOS4xNjE1MzY1LCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzgzNS41NTE1MTcyLCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzg0NC42MjQ3NTIzLCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzg0Ny44MjI0NjYxLCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzg2Ny42NjE3MjcyLCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzg2OS4yNjY4MTM4LCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzg2OS44MDE2MTk1LCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzg3NC4wODgxNzUzLCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzg3Ni4yMjQ2MDcyLCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzg3OS45NzEzMDc1LCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzkwOC4zODYzODM1LCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzkxMi4xNDI0ODk0LCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzkxNi45OTQxMzg3LCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyNzkyOC43ODYxNzgsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTMwLjkxODQ5MTgsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTM1LjIzOTkxNzMsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTM5LjU0MzY4MzUsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTQxLjY3MTM0NzYsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTUyLjM3MDYyNTUsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTU1LjA0MTYyMzYsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTU1LjU4MjU0NTgsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTU4LjI1MzEwNDIsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTY0LjcwNDM4ODYsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTY2LjMxNjcxNDUsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTY4Ljk4ODY4ODcsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTc5LjE2Njg1MjcsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTg3Ljc2MTI2NDgsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTkzLjExNzc3NDIsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI3OTk5LjUyOTM1MywgNCwgOC4zMzMzMzMyNDQwODE1ODdlLTA1XSwgWzE1OTkxMjgwMTMuNDI4ODQxNiwgNCwgOC4zMzMzMzMyNDQwODE1ODdlLTA1XSwgWzE1OTkxMjgwMTguMjQ1NjU1NSwgNCwgOC4zMzMzMzMyNDQwODE1ODdlLTA1XSwgWzE1OTkxMjgwMzYuOTc1ODQ1LCA0LCA4LjMzMzMzMzI0NDA4MTU4N2UtMDVdLCBbMTU5OTEyODAzNy41MDMyMjIsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI4MDM4LjU3NzQ0MDUsIDQsIDguMzMzMzMzMjQ0MDgxNTg3ZS0wNV0sIFsxNTk5MTI4MDYyLjE5MDM0OSwgNCwgOC4zMzMzMzMyNDQwODE1ODdlLTA1XSwgWzE1OTkxMjgwNjYuNDgwMzExMiwgNCwgOC4zMzMzMzMyNDQwODE1ODdlLTA1XSwgWzE1OTkxMjgwNzEuMjkyMTk5NiwgNCwgOC4zMzMzMzMyNDQwODE1ODdlLTA1XSwgWzE1OTkxMjgwNzIuMzYyNTA2NCwgNCwgOC4zMzMzMzMyNDQwODE1ODdlLTA1XSwgWzE1OTkxMjgwNzUuMDMxMDk1NywgNCwgOC4zMzMzMzMyNDQwODE1ODdlLTA1XSwgWzE1OTkxMjgxNDIuNjYwNTIzMiwgNSwgOS45OTk5OTk3NDczNzg3NTJlLTA1XSwgWzE1OTkxMjgxNDMuMTk3ODkzNCwgNSwgOS45OTk5OTk3NDczNzg3NTJlLTA1XSwgWzE1OTkxMjgxNDguNTQyOTQ3NSwgNSwgOS45OTk5OTk3NDczNzg3NTJlLTA1XSwgWzE1OTkxMjgxNDkuNjE4MDYxLCA1LCA5Ljk5OTk5OTc0NzM3ODc1MmUtMDVdLCBbMTU5OTEyODE1Mi4yOTcxNDE2LCA1LCA5Ljk5OTk5OTc0NzM3ODc1MmUtMDVdLCBbMTU5OTEyODE1OS43OTM0ODMzLCA1LCA5Ljk5OTk5OTc0NzM3ODc1MmUtMDVdLCBbMTU5OTEyODE2My4wMDU4MjksIDUsIDkuOTk5OTk5NzQ3Mzc4NzUyZS0wNV0sIFsxNTk5MTI4MTY3LjgzMzQxMTIsIDUsIDkuOTk5OTk5NzQ3Mzc4NzUyZS0wNV0sIFsxNTk5MTI4MTc1Ljg3MTQ5MywgNSwgOS45OTk5OTk3NDczNzg3NTJlLTA1XSwgWzE1OTkxMjgxNzkuMDg4ODUwNywgNSwgOS45OTk5OTk3NDczNzg3NTJlLTA1XSwgWzE1OTkxMjgyMDcuNTMxOTMwNCwgNSwgOS45OTk5OTk3NDczNzg3NTJlLTA1XSwgWzE1OTkxMjgyMTYuNjAzMTAzMiwgNSwgOS45OTk5OTk3NDczNzg3NTJlLTA1XSwgWzE1OTkxMjgyNDkuODA0OTI2LCA1LCA5Ljk5OTk5OTc0NzM3ODc1MmUtMDVdLCBbMTU5OTEyODI1Mi40NzY5NjczLCA1LCA5Ljk5OTk5OTc0NzM3ODc1MmUtMDVdLCBbMTU5OTEyODI1OS40MjMzOTA2LCA1LCA5Ljk5OTk5OTc0NzM3ODc1MmUtMDVdLCBbMTU5OTEyODI3OS4yNTczODQzLCA1LCA5Ljk5OTk5OTc0NzM3ODc1MmUtMDVdLCBbMTU5OTEyODI4Ni43NTEyMTg4LCA1LCA5Ljk5OTk5OTc0NzM3ODc1MmUtMDVdLCBbMTU5OTEyODMwNS43MDAwNDQsIDUsIDkuOTk5OTk5NzQ3Mzc4NzUyZS0wNV0sIFsxNTk5MTI4MzUwLjExMTEyMjYsIDUsIDkuOTk5OTk5NzQ3Mzc4NzUyZS0wNV0sIFsxNTk5MTI4MzU5Ljc2Mjk3OTUsIDUsIDkuOTk5OTk5NzQ3Mzc4NzUyZS0wNV0sIFsxNTk5MTI4MzYyLjk3MDYzMywgNSwgOS45OTk5OTk3NDczNzg3NTJlLTA1XSwgWzE1OTkxMjgzNzUuODEyMDE0MywgNSwgOS45OTk5OTk3NDczNzg3NTJlLTA1XSwgWzE1OTkxMjg0NTQuMjA3OTg2OCwgNiwgOS44MjkxMzE4ODYzNjMwM2UtMDVdLCBbMTU5OTEyODQ1OC41MTc5OTYsIDYsIDkuODI5MTMxODg2MzYzMDNlLTA1XSwgWzE1OTkxMjg0NzcuNzQzNzIyNCwgNiwgOS44MjkxMzE4ODYzNjMwM2UtMDVdLCBbMTU5OTEyODQ4Ni4yOTcyMjk4LCA2LCA5LjgyOTEzMTg4NjM2MzAzZS0wNV0sIFsxNTk5MTI4NDg3LjkxNzI3MjYsIDYsIDkuODI5MTMxODg2MzYzMDNlLTA1XSwgWzE1OTkxMjg0OTIuMjAxMzgwMywgNiwgOS44MjkxMzE4ODYzNjMwM2UtMDVdLCBbMTU5OTEyODQ5My44MDkxNDEyLCA2LCA5LjgyOTEzMTg4NjM2MzAzZS0wNV0sIFsxNTk5MTI4NTA4LjgwMjA3NTksIDYsIDkuODI5MTMxODg2MzYzMDNlLTA1XSwgWzE1OTkxMjg1MjQuODY2ODU1OSwgNiwgOS44MjkxMzE4ODYzNjMwM2UtMDVdLCBbMTU5OTEyODU1NC44MDY3NTM5LCA2LCA5LjgyOTEzMTg4NjM2MzAzZS0wNV0sIFsxNTk5MTI4NTU4LjA0MzU0NzksIDYsIDkuODI5MTMxODg2MzYzMDNlLTA1XSwgWzE1OTkxMjg1NjYuNjE3NTEyNSwgNiwgOS44MjkxMzE4ODYzNjMwM2UtMDVdLCBbMTU5OTEyODU3Ni4yNjI4NDQzLCA2LCA5LjgyOTEzMTg4NjM2MzAzZS0wNV0sIFsxNTk5MTI4NTc2Ljc5OTUzOTYsIDYsIDkuODI5MTMxODg2MzYzMDNlLTA1XSwgWzE1OTkxMjg1OTUuMDYxNTEwNiwgNiwgOS44MjkxMzE4ODYzNjMwM2UtMDVdLCBbMTU5OTEyODYwMC40MzA5MzA2LCA2LCA5LjgyOTEzMTg4NjM2MzAzZS0wNV0sIFsxNTk5MTI4NjAyLjAyNjcxMjcsIDYsIDkuODI5MTMxODg2MzYzMDNlLTA1XSwgWzE1OTkxMjg2MDIuNTYzNTUzLCA2LCA5LjgyOTEzMTg4NjM2MzAzZS0wNV0sIFsxNTk5MTI4NjAzLjY0NDM0NDgsIDYsIDkuODI5MTMxODg2MzYzMDNlLTA1XSwgWzE1OTkxMjg2MDQuMTc2NDE2OSwgNiwgOS44MjkxMzE4ODYzNjMwM2UtMDVdLCBbMTU5OTEyODYxNy41NjcwNTgsIDYsIDkuODI5MTMxODg2MzYzMDNlLTA1XSwgWzE1OTkxMjg2MzUuMjU4NDM5LCA2LCA5LjgyOTEzMTg4NjM2MzAzZS0wNV0sIFsxNTk5MTI4NjU2Ljc0MDkwODYsIDYsIDkuODI5MTMxODg2MzYzMDNlLTA1XSwgWzE1OTkxMjg2NzMuMzE5NTE5OCwgNiwgOS44MjkxMzE4ODYzNjMwM2UtMDVdLCBbMTU5OTEyODY4Ny44MTk2NTYsIDYsIDkuODI5MTMxODg2MzYzMDNlLTA1XSwgWzE1OTkxMjg2OTAuNDg1MDc0NSwgNiwgOS44MjkxMzE4ODYzNjMwM2UtMDVdLCBbMTU5OTEyODcwMi4yNjA2MDI1LCA2LCA5LjgyOTEzMTg4NjM2MzAzZS0wNV0sIFsxNTk5MTI4NzEyLjQzMTUzNTIsIDYsIDkuODI5MTMxODg2MzYzMDNlLTA1XSwgWzE1OTkxMjg3NzQuMzM2ODgxLCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODc4Mi45MTE3MiwgNywgOS42Mjk3MDk1Mjk2OTA0NDRlLTA1XSwgWzE1OTkxMjg3OTguNDE5MDA5NCwgNywgOS42Mjk3MDk1Mjk2OTA0NDRlLTA1XSwgWzE1OTkxMjg4MDAuMDMyNTczMiwgNywgOS42Mjk3MDk1Mjk2OTA0NDRlLTA1XSwgWzE1OTkxMjg4MTMuMzcyNTYyNCwgNywgOS42Mjk3MDk1Mjk2OTA0NDRlLTA1XSwgWzE1OTkxMjg4MzYuMzkzMTk1MiwgNywgOS42Mjk3MDk1Mjk2OTA0NDRlLTA1XSwgWzE1OTkxMjg4NDcuMTAzNDU0LCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODg1Ni43NjUzOTI4LCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODg1Ny44NTM0Mzc0LCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODg1OC45MzM5NTM1LCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODg2Mi4xMjY1MzkyLCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODg3Ny4xMjM4NDIsIDcsIDkuNjI5NzA5NTI5NjkwNDQ0ZS0wNV0sIFsxNTk5MTI4ODg0LjU4MzcxNDcsIDcsIDkuNjI5NzA5NTI5NjkwNDQ0ZS0wNV0sIFsxNTk5MTI4OTE0LjYwNjk5MSwgNywgOS42Mjk3MDk1Mjk2OTA0NDRlLTA1XSwgWzE1OTkxMjg5MTYuNzQ5Nzg1LCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODkyMi42MjQ0OTYyLCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODkzOS4yNDExMTU4LCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODk0My41MTgwNjYyLCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODk1MC40NzI5MDY4LCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODk1My4xNDE0MzYzLCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODk2MS42OTA3NTUxLCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODk2NC4zNjk2NjkyLCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODk2NS40NDE3MzY3LCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODk3MC44MzQ2ODY4LCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODk4OC41MTYwMTIyLCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyODk5NC45NDEwMDc5LCA3LCA5LjYyOTcwOTUyOTY5MDQ0NGUtMDVdLCBbMTU5OTEyOTAyMi43ODY3OTMsIDcsIDkuNjI5NzA5NTI5NjkwNDQ0ZS0wNV0sIFsxNTk5MTI5MDI4LjY4MjcyODUsIDcsIDkuNjI5NzA5NTI5NjkwNDQ0ZS0wNV0sIFsxNTk5MTI5MDkxLjgwNjIyNSwgOCwgOS40MDI5NjM3NjkzODkzMTZlLTA1XSwgWzE1OTkxMjkxMDYuNzcyNDY0LCA4LCA5LjQwMjk2Mzc2OTM4OTMxNmUtMDVdLCBbMTU5OTEyOTEyMC42NjQ1OTQyLCA4LCA5LjQwMjk2Mzc2OTM4OTMxNmUtMDVdLCBbMTU5OTEyOTEyNy4wNzE2NTQsIDgsIDkuNDAyOTYzNzY5Mzg5MzE2ZS0wNV0sIFsxNTk5MTI5MTMyLjk0NzY1OTUsIDgsIDkuNDAyOTYzNzY5Mzg5MzE2ZS0wNV0sIFsxNTk5MTI5MTM0LjU0OTY1NDUsIDgsIDkuNDAyOTYzNzY5Mzg5MzE2ZS0wNV0sIFsxNTk5MTI5MTY1LjA2ODU0NSwgOCwgOS40MDI5NjM3NjkzODkzMTZlLTA1XSwgWzE1OTkxMjkxNjcuNzQxNDU0MSwgOCwgOS40MDI5NjM3NjkzODkzMTZlLTA1XSwgWzE1OTkxMjkxNzMuNjI4NzI2LCA4LCA5LjQwMjk2Mzc2OTM4OTMxNmUtMDVdLCBbMTU5OTEyOTIxMi43MTM1NzksIDgsIDkuNDAyOTYzNzY5Mzg5MzE2ZS0wNV0sIFsxNTk5MTI5MjE4LjU4OTQ0OTQsIDgsIDkuNDAyOTYzNzY5Mzg5MzE2ZS0wNV0sIFsxNTk5MTI5MjE5LjEyMjA1NzQsIDgsIDkuNDAyOTYzNzY5Mzg5MzE2ZS0wNV0sIFsxNTk5MTI5MjIwLjE5MTgzMDksIDgsIDkuNDAyOTYzNzY5Mzg5MzE2ZS0wNV0sIFsxNTk5MTI5MjIyLjg1MzQ1MDgsIDgsIDkuNDAyOTYzNzY5Mzg5MzE2ZS0wNV0sIFsxNTk5MTI5MjIzLjM5NDg4MywgOCwgOS40MDI5NjM3NjkzODkzMTZlLTA1XSwgWzE1OTkxMjkyMzYuNzY4NjU1OCwgOCwgOS40MDI5NjM3NjkzODkzMTZlLTA1XSwgWzE1OTkxMjkyMzkuNDQ2MTYyNywgOCwgOS40MDI5NjM3NjkzODkzMTZlLTA1XSwgWzE1OTkxMjkyNDEuMDU0OTg1NSwgOCwgOS40MDI5NjM3NjkzODkzMTZlLTA1XSwgWzE1OTkxMjkyNDUuMzE5NzU2MywgOCwgOS40MDI5NjM3NjkzODkzMTZlLTA1XSwgWzE1OTkxMjkyNTYuMDI4NTcxMSwgOCwgOS40MDI5NjM3NjkzODkzMTZlLTA1XSwgWzE1OTkxMjkyNTcuNjI1Njk2LCA4LCA5LjQwMjk2Mzc2OTM4OTMxNmUtMDVdLCBbMTU5OTEyOTI1OC4xNjY0MjI4LCA4LCA5LjQwMjk2Mzc2OTM4OTMxNmUtMDVdLCBbMTU5OTEyOTI2Ni4xOTc5Njg3LCA4LCA5LjQwMjk2Mzc2OTM4OTMxNmUtMDVdLCBbMTU5OTEyOTI3Ny45NzY0NTQzLCA4LCA5LjQwMjk2Mzc2OTM4OTMxNmUtMDVdLCBbMTU5OTEyOTI4NC45NDEzMDEzLCA4LCA5LjQwMjk2Mzc2OTM4OTMxNmUtMDVdLCBbMTU5OTEyOTI4Ni4wMDMzOTA4LCA4LCA5LjQwMjk2Mzc2OTM4OTMxNmUtMDVdLCBbMTU5OTEyOTMxMi43NjkzMDI0LCA4LCA5LjQwMjk2Mzc2OTM4OTMxNmUtMDVdLCBbMTU5OTEyOTMyNS41ODU3OTUsIDgsIDkuNDAyOTYzNzY5Mzg5MzE2ZS0wNV0sIFsxNTk5MTI5MzI5LjM1MzM3MzMsIDgsIDkuNDAyOTYzNzY5Mzg5MzE2ZS0wNV0sIFsxNTk5MTI5MzMyLjU3ODE2NTMsIDgsIDkuNDAyOTYzNzY5Mzg5MzE2ZS0wNV0sIFsxNTk5MTI5MzQ1LjQwMDU2MzIsIDgsIDkuNDAyOTYzNzY5Mzg5MzE2ZS0wNV0sIFsxNTk5MTI5MzQ2Ljk4OTQ5MiwgOCwgOS40MDI5NjM3NjkzODkzMTZlLTA1XSwgWzE1OTkxMjk0MzEuNzU5ODQ1NywgOSwgOS4xNTAyOTIzMTY5MTczM2UtMDVdLCBbMTU5OTEyOTQ0MC44NTE2ODEyLCA5LCA5LjE1MDI5MjMxNjkxNzMzZS0wNV0sIFsxNTk5MTI5NDUyLjA5ODA5MTQsIDksIDkuMTUwMjkyMzE2OTE3MzNlLTA1XSwgWzE1OTkxMjk0NTMuNzI1NDgxNSwgOSwgOS4xNTAyOTIzMTY5MTczM2UtMDVdLCBbMTU5OTEyOTQ3Ny43ODUzOTM1LCA5LCA5LjE1MDI5MjMxNjkxNzMzZS0wNV0sIFsxNTk5MTI5NDc5LjM4MTkzODIsIDksIDkuMTUwMjkyMzE2OTE3MzNlLTA1XSwgWzE1OTkxMjk0ODcuOTM2NTYzNywgOSwgOS4xNTAyOTIzMTY5MTczM2UtMDVdLCBbMTU5OTEyOTUwNC41MzEyNzA3LCA5LCA5LjE1MDI5MjMxNjkxNzMzZS0wNV0sIFsxNTk5MTI5NTE5LjUxNTg4MjMsIDksIDkuMTUwMjkyMzE2OTE3MzNlLTA1XSwgWzE1OTkxMjk1MjMuODA3ODUwOCwgOSwgOS4xNTAyOTIzMTY5MTczM2UtMDVdLCBbMTU5OTEyOTUyNS45NDk4MDQ4LCA5LCA5LjE1MDI5MjMxNjkxNzMzZS0wNV0sIFsxNTk5MTI5NTMwLjIyOTQzMiwgOSwgOS4xNTAyOTIzMTY5MTczM2UtMDVdLCBbMTU5OTEyOTUzNi4xMzQ0OTI2LCA5LCA5LjE1MDI5MjMxNjkxNzMzZS0wNV0sIFsxNTk5MTI5NTUwLjA5Mjk3MTMsIDksIDkuMTUwMjkyMzE2OTE3MzNlLTA1XSwgWzE1OTkxMjk1NTIuNzgyOTU3MywgOSwgOS4xNTAyOTIzMTY5MTczM2UtMDVdLCBbMTU5OTEyOTU2MS4zNjA2NjEzLCA5LCA5LjE1MDI5MjMxNjkxNzMzZS0wNV0sIFsxNTk5MTI5NTY5LjkzNTk0NTMsIDksIDkuMTUwMjkyMzE2OTE3MzNlLTA1XSwgWzE1OTkxMjk1NzQuMjM1MzE0LCA5LCA5LjE1MDI5MjMxNjkxNzMzZS0wNV0sIFsxNTk5MTI5NTc5LjA1MjA0OTQsIDksIDkuMTUwMjkyMzE2OTE3MzNlLTA1XSwgWzE1OTkxMjk1ODMuODkwMzMwNiwgOSwgOS4xNTAyOTIzMTY5MTczM2UtMDVdLCBbMTU5OTEyOTU4OS43NjczNDc2LCA5LCA5LjE1MDI5MjMxNjkxNzMzZS0wNV0sIFsxNTk5MTI5NTkwLjMxMjI2NywgOSwgOS4xNTAyOTIzMTY5MTczM2UtMDVdLCBbMTU5OTEyOTU5Ni43NDMyNDkyLCA5LCA5LjE1MDI5MjMxNjkxNzMzZS0wNV0sIFsxNTk5MTI5NTk3LjgwMjEyNzYsIDksIDkuMTUwMjkyMzE2OTE3MzNlLTA1XSwgWzE1OTkxMjk2MTguMTIzMTQzNywgOSwgOS4xNTAyOTIzMTY5MTczM2UtMDVdLCBbMTU5OTEyOTYyNC41NjIwOTI4LCA5LCA5LjE1MDI5MjMxNjkxNzMzZS0wNV0sIFsxNTk5MTI5NjM0Ljc2NTUzMjcsIDksIDkuMTUwMjkyMzE2OTE3MzNlLTA1XSwgWzE1OTkxMjk2NDcuMDk5NzgzLCA5LCA5LjE1MDI5MjMxNjkxNzMzZS0wNV0sIFsxNTk5MTI5NjU3Ljc1OTUwNzQsIDksIDkuMTUwMjkyMzE2OTE3MzNlLTA1XSwgWzE1OTkxMjk3MzYuNTU3NTQzOCwgMTAsIDguODczMjUyMjI3MjAzOTJlLTA1XSwgWzE1OTkxMjk3NDEuMzU2MDA2LCAxMCwgOC44NzMyNTIyMjcyMDM5MmUtMDVdLCBbMTU5OTEyOTc0Mi45NDgyMDQ4LCAxMCwgOC44NzMyNTIyMjcyMDM5MmUtMDVdLCBbMTU5OTEyOTc3Mi45NzQ5MTE1LCAxMCwgOC44NzMyNTIyMjcyMDM5MmUtMDVdLCBbMTU5OTEyOTc4My42NzIwMTE0LCAxMCwgOC44NzMyNTIyMjcyMDM5MmUtMDVdLCBbMTU5OTEyOTc4NC43NDU4MTMxLCAxMCwgOC44NzMyNTIyMjcyMDM5MmUtMDVdLCBbMTU5OTEyOTc4NS4yNzk0MDg1LCAxMCwgOC44NzMyNTIyMjcyMDM5MmUtMDVdLCBbMTU5OTEyOTgxMy42NTc3MjYsIDEwLCA4Ljg3MzI1MjIyNzIwMzkyZS0wNV0sIFsxNTk5MTI5ODI0LjM0MTk0OTcsIDEwLCA4Ljg3MzI1MjIyNzIwMzkyZS0wNV0sIFsxNTk5MTI5ODI4LjYzNjc5NDMsIDEwLCA4Ljg3MzI1MjIyNzIwMzkyZS0wNV0sIFsxNTk5MTI5ODQ1LjI2OTM4ODQsIDEwLCA4Ljg3MzI1MjIyNzIwMzkyZS0wNV0sIFsxNTk5MTI5ODU0LjM2OTcxNjYsIDEwLCA4Ljg3MzI1MjIyNzIwMzkyZS0wNV0sIFsxNTk5MTI5ODYzLjk2MjY5MiwgMTAsIDguODczMjUyMjI3MjAzOTJlLTA1XSwgWzE1OTkxMjk4NjguMjIzNTcyMywgMTAsIDguODczMjUyMjI3MjAzOTJlLTA1XSwgWzE1OTkxMjk4ODQuODI0MTcwNCwgMTAsIDguODczMjUyMjI3MjAzOTJlLTA1XSwgWzE1OTkxMjk5MTEuNTYyNjMyOCwgMTAsIDguODczMjUyMjI3MjAzOTJlLTA1XSwgWzE1OTkxMjk5MjcuMDUwMDA4MywgMTAsIDguODczMjUyMjI3MjAzOTJlLTA1XSwgWzE1OTkxMjk5MzIuOTM1ODkyOCwgMTAsIDguODczMjUyMjI3MjAzOTJlLTA1XSwgWzE1OTkxMjk5NDEuNTA5NDI4NSwgMTAsIDguODczMjUyMjI3MjAzOTJlLTA1XSwgWzE1OTkxMjk5NDkuMDAzMzIyNCwgMTAsIDguODczMjUyMjI3MjAzOTJlLTA1XSwgWzE1OTkxMjk5NjAuMjMxNjQxOCwgMTAsIDguODczMjUyMjI3MjAzOTJlLTA1XSwgWzE1OTkxMjk5ODEuNTkzNDAxMiwgMTAsIDguODczMjUyMjI3MjAzOTJlLTA1XSwgWzE1OTkxMzAwNDcuNTgwMTM5OSwgMTEsIDguNTczNTUxODk1MDk2ODk4ZS0wNV0sIFsxNTk5MTMwMDUwLjI3MDE3MjQsIDExLCA4LjU3MzU1MTg5NTA5Njg5OGUtMDVdLCBbMTU5OTEzMDA3MC4xMDkwMTc0LCAxMSwgOC41NzM1NTE4OTUwOTY4OThlLTA1XSwgWzE1OTkxMzAwNzUuOTc2NjkxLCAxMSwgOC41NzM1NTE4OTUwOTY4OThlLTA1XSwgWzE1OTkxMzAwODYuNjQ4ODk5NiwgMTEsIDguNTczNTUxODk1MDk2ODk4ZS0wNV0sIFsxNTk5MTMwMDg3LjcwODc5NzIsIDExLCA4LjU3MzU1MTg5NTA5Njg5OGUtMDVdLCBbMTU5OTEzMDEwNC44NjQ1NzM3LCAxMSwgOC41NzM1NTE4OTUwOTY4OThlLTA1XSwgWzE1OTkxMzAxMTcuNzEyMTIzOSwgMTEsIDguNTczNTUxODk1MDk2ODk4ZS0wNV0sIFsxNTk5MTMwMTI0LjEzMDkzNzgsIDExLCA4LjU3MzU1MTg5NTA5Njg5OGUtMDVdLCBbMTU5OTEzMDEyNS4yMTA5MTUsIDExLCA4LjU3MzU1MTg5NTA5Njg5OGUtMDVdLCBbMTU5OTEzMDEyOC40MjI3NzEyLCAxMSwgOC41NzM1NTE4OTUwOTY4OThlLTA1XSwgWzE1OTkxMzAxNDguMjU5ODU4NiwgMTEsIDguNTczNTUxODk1MDk2ODk4ZS0wNV0sIFsxNTk5MTMwMTYzLjI1OTc2MTMsIDExLCA4LjU3MzU1MTg5NTA5Njg5OGUtMDVdLCBbMTU5OTEzMDE2NC4zMTc3MDYzLCAxMSwgOC41NzM1NTE4OTUwOTY4OThlLTA1XSwgWzE1OTkxMzAxNjYuNDUyMTk1NCwgMTEsIDguNTczNTUxODk1MDk2ODk4ZS0wNV0sIFsxNTk5MTMwMTc0LjQ5MDEwMDEsIDExLCA4LjU3MzU1MTg5NTA5Njg5OGUtMDVdLCBbMTU5OTEzMDE5Ni41MjQxOTUsIDExLCA4LjU3MzU1MTg5NTA5Njg5OGUtMDVdLCBbMTU5OTEzMDE5OC4xMjk2MDQ2LCAxMSwgOC41NzM1NTE4OTUwOTY4OThlLTA1XSwgWzE1OTkxMzAyMjYuNTIzMTQzOCwgMTEsIDguNTczNTUxODk1MDk2ODk4ZS0wNV0sIFsxNTk5MTMwMjI4LjE0Njg0LCAxMSwgOC41NzM1NTE4OTUwOTY4OThlLTA1XSwgWzE1OTkxMzAyMzMuNDkxMzU5NywgMTEsIDguNTczNTUxODk1MDk2ODk4ZS0wNV0sIFsxNTk5MTMwMjQzLjEwNDIyNDcsIDExLCA4LjU3MzU1MTg5NTA5Njg5OGUtMDVdLCBbMTU5OTEzMDI0My42NDIxMDM0LCAxMSwgOC41NzM1NTE4OTUwOTY4OThlLTA1XSwgWzE1OTkxMzAyNTIuNzU0MzgyNCwgMTEsIDguNTczNTUxODk1MDk2ODk4ZS0wNV0sIFsxNTk5MTMwMjU0LjM2NzcyNDIsIDExLCA4LjU3MzU1MTg5NTA5Njg5OGUtMDVdLCBbMTU5OTEzMDI3Mi41Mzk1MjUsIDExLCA4LjU3MzU1MTg5NTA5Njg5OGUtMDVdLCBbMTU5OTEzMDI3My42MDgzNzQ0LCAxMSwgOC41NzM1NTE4OTUwOTY4OThlLTA1XSwgWzE1OTkxMzAyNzcuMzUyNjQ0NCwgMTEsIDguNTczNTUxODk1MDk2ODk4ZS0wNV0sIFsxNTk5MTMwMjk2LjU4OTE3MSwgMTEsIDguNTczNTUxODk1MDk2ODk4ZS0wNV0sIFsxNTk5MTMwMzYxLjE0NzEyMDUsIDEyLCA4LjI1MzAzODY4NjIzNDUwNGUtMDVdLCBbMTU5OTEzMDM3My45NzE2ODAyLCAxMiwgOC4yNTMwMzg2ODYyMzQ1MDRlLTA1XSwgWzE1OTkxMzAzNzYuNjQ5MTcyNSwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwMzc5Ljg2OTAyMiwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwMzk0LjM0OTQzMjUsIDEyLCA4LjI1MzAzODY4NjIzNDUwNGUtMDVdLCBbMTU5OTEzMDQwNS4wMjc4NDE2LCAxMiwgOC4yNTMwMzg2ODYyMzQ1MDRlLTA1XSwgWzE1OTkxMzA0MDcuNjkxNDI2NSwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNDE1LjcyOTQ5NTgsIDEyLCA4LjI1MzAzODY4NjIzNDUwNGUtMDVdLCBbMTU5OTEzMDQxOC40MDI4ODIzLCAxMiwgOC4yNTMwMzg2ODYyMzQ1MDRlLTA1XSwgWzE1OTkxMzA0NDEuNDQwNzI5NiwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNDU0LjgyODIzNjMsIDEyLCA4LjI1MzAzODY4NjIzNDUwNGUtMDVdLCBbMTU5OTEzMDQ1NS44OTk5OTM0LCAxMiwgOC4yNTMwMzg2ODYyMzQ1MDRlLTA1XSwgWzE1OTkxMzA0NjQuNDkxMDIxOSwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNDY1LjU2ODQ2MiwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNDY4Ljc5NDc5ODQsIDEyLCA4LjI1MzAzODY4NjIzNDUwNGUtMDVdLCBbMTU5OTEzMDQ2OS44NzE0NDI4LCAxMiwgOC4yNTMwMzg2ODYyMzQ1MDRlLTA1XSwgWzE1OTkxMzA0NzkuNDk5NjgxNywgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNDkxLjg0Mzc3NDYsIDEyLCA4LjI1MzAzODY4NjIzNDUwNGUtMDVdLCBbMTU5OTEzMDQ5Ni42NjY0MTI0LCAxMiwgOC4yNTMwMzg2ODYyMzQ1MDRlLTA1XSwgWzE1OTkxMzA1MDYuODM3MjUyLCAxMiwgOC4yNTMwMzg2ODYyMzQ1MDRlLTA1XSwgWzE1OTkxMzA1MTIuNzQwNTg3NSwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNTEzLjgwMjIwOTksIDEyLCA4LjI1MzAzODY4NjIzNDUwNGUtMDVdLCBbMTU5OTEzMDUxNy4wMzA3NTc0LCAxMiwgOC4yNTMwMzg2ODYyMzQ1MDRlLTA1XSwgWzE1OTkxMzA1MjMuOTUwOTA0MSwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNTMzLjUzMzQ5NiwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNTU0LjMxMTEyLCAxMiwgOC4yNTMwMzg2ODYyMzQ1MDRlLTA1XSwgWzE1OTkxMzA1NjYuNTcyOTc2OCwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNTY5LjIzNDU1MiwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNTgyLjAyMzQwMzQsIDEyLCA4LjI1MzAzODY4NjIzNDUwNGUtMDVdLCBbMTU5OTEzMDU4Ny45MDY0MjgzLCAxMiwgOC4yNTMwMzg2ODYyMzQ1MDRlLTA1XSwgWzE1OTkxMzA1OTMuNzY2MTg4OSwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNTk3LjUwMzk5NywgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNjAwLjY4MTU1NCwgMTIsIDguMjUzMDM4Njg2MjM0NTA0ZS0wNV0sIFsxNTk5MTMwNjEzLjQ1NjI0MTYsIDEyLCA4LjI1MzAzODY4NjIzNDUwNGUtMDVdLCBbMTU5OTEzMDY5OS40ODgwMTE2LCAxMywgNy45MTM2ODk0NzgzMDA1MTJlLTA1XSwgWzE1OTkxMzA3MTguNjQ0ODk3NywgMTMsIDcuOTEzNjg5NDc4MzAwNTEyZS0wNV0sIFsxNTk5MTMwNzE5LjE3ODA2NSwgMTMsIDcuOTEzNjg5NDc4MzAwNTEyZS0wNV0sIFsxNTk5MTMwNzIxLjMwOTYzMDQsIDEzLCA3LjkxMzY4OTQ3ODMwMDUxMmUtMDVdLCBbMTU5OTEzMDczMS45NjQ1NTk2LCAxMywgNy45MTM2ODk0NzgzMDA1MTJlLTA1XSwgWzE1OTkxMzA3MzIuNDk1MTA5OCwgMTMsIDcuOTEzNjg5NDc4MzAwNTEyZS0wNV0sIFsxNTk5MTMwNzMzLjAyNTM0MTMsIDEzLCA3LjkxMzY4OTQ3ODMwMDUxMmUtMDVdLCBbMTU5OTEzMDczNy4yODk2NDMzLCAxMywgNy45MTM2ODk0NzgzMDA1MTJlLTA1XSwgWzE1OTkxMzA3NjAuNzQ1MTcsIDEzLCA3LjkxMzY4OTQ3ODMwMDUxMmUtMDVdLCBbMTU5OTEzMDc2NC40OTkwNTE4LCAxMywgNy45MTM2ODk0NzgzMDA1MTJlLTA1XSwgWzE1OTkxMzA3NjYuMTExNzY4MiwgMTMsIDcuOTEzNjg5NDc4MzAwNTEyZS0wNV0sIFsxNTk5MTMwNzc2LjIwNjAwOTYsIDEzLCA3LjkxMzY4OTQ3ODMwMDUxMmUtMDVdLCBbMTU5OTEzMDgwNC45MzIxNTMyLCAxMywgNy45MTM2ODk0NzgzMDA1MTJlLTA1XSwgWzE1OTkxMzA4MDkuNzE5NDMwNywgMTMsIDcuOTEzNjg5NDc4MzAwNTEyZS0wNV0sIFsxNTk5MTMwODEwLjc3OTQ5MzYsIDEzLCA3LjkxMzY4OTQ3ODMwMDUxMmUtMDVdLCBbMTU5OTEzMDgxMi45MDg2ODUsIDEzLCA3LjkxMzY4OTQ3ODMwMDUxMmUtMDVdLCBbMTU5OTEzMDgxNi4wOTE1MzgsIDEzLCA3LjkxMzY4OTQ3ODMwMDUxMmUtMDVdLCBbMTU5OTEzMDgxNy42Nzg5MTM2LCAxMywgNy45MTM2ODk0NzgzMDA1MTJlLTA1XSwgWzE1OTkxMzA4MjEuNDE3MjA3NywgMTMsIDcuOTEzNjg5NDc4MzAwNTEyZS0wNV0sIFsxNTk5MTMwODI1LjY4Njc0OTUsIDEzLCA3LjkxMzY4OTQ3ODMwMDUxMmUtMDVdLCBbMTU5OTEzMDgyNy4yNzc0NDk4LCAxMywgNy45MTM2ODk0NzgzMDA1MTJlLTA1XSwgWzE1OTkxMzA4MzMuNjkxNzE2LCAxMywgNy45MTM2ODk0NzgzMDA1MTJlLTA1XSwgWzE1OTkxMzA4NDguMDY2NzQxNywgMTMsIDcuOTEzNjg5NDc4MzAwNTEyZS0wNV0sIFsxNTk5MTMwODUwLjIwMzM0NTMsIDEzLCA3LjkxMzY4OTQ3ODMwMDUxMmUtMDVdLCBbMTU5OTEzMDg1Ni4wNjk4NzU3LCAxMywgNy45MTM2ODk0NzgzMDA1MTJlLTA1XSwgWzE1OTkxMzA4NjEuOTE2NjkwMywgMTMsIDcuOTEzNjg5NDc4MzAwNTEyZS0wNV0sIFsxNTk5MTMwODk4LjE2NjQzLCAxMywgNy45MTM2ODk0NzgzMDA1MTJlLTA1XSwgWzE1OTkxMzA5MDUuNTkxMTIxNywgMTMsIDcuOTEzNjg5NDc4MzAwNTEyZS0wNV0sIFsxNTk5MTMwOTA5Ljg0ODI4NzYsIDEzLCA3LjkxMzY4OTQ3ODMwMDUxMmUtMDVdLCBbMTU5OTEzMDkxNy4zMTc4NjYsIDEzLCA3LjkxMzY4OTQ3ODMwMDUxMmUtMDVdLCBbMTU5OTEzMDkxNy44NDk2Mjk0LCAxMywgNy45MTM2ODk0NzgzMDA1MTJlLTA1XSwgWzE1OTkxMzA5MzEuNjkxNDE5NiwgMTMsIDcuOTEzNjg5NDc4MzAwNTEyZS0wNV0sIFsxNTk5MTMwOTkyLjIwNDIzNywgMTQsIDcuNTU3NTk2MTA5MTA5ZS0wNV0sIFsxNTk5MTMxMDA1LjQ2ODE2NjYsIDE0LCA3LjU1NzU5NjEwOTEwOWUtMDVdLCBbMTU5OTEzMTAyMC45MDE1OTQsIDE0LCA3LjU1NzU5NjEwOTEwOWUtMDVdLCBbMTU5OTEzMTAyMi40OTQxODg4LCAxNCwgNy41NTc1OTYxMDkxMDllLTA1XSwgWzE1OTkxMzEwMzYuMzUwODMxMywgMTQsIDcuNTU3NTk2MTA5MTA5ZS0wNV0sIFsxNTk5MTMxMDQ1Ljk1NzE5NiwgMTQsIDcuNTU3NTk2MTA5MTA5ZS0wNV0sIFsxNTk5MTMxMDQ4LjA4NDQwNzgsIDE0LCA3LjU1NzU5NjEwOTEwOWUtMDVdLCBbMTU5OTEzMTA2MS40MTIwNDksIDE0LCA3LjU1NzU5NjEwOTEwOWUtMDVdLCBbMTU5OTEzMTA4OS4wNjkxNDM4LCAxNCwgNy41NTc1OTYxMDkxMDllLTA1XSwgWzE1OTkxMzEwOTcuMDY5NzY3NSwgMTQsIDcuNTU3NTk2MTA5MTA5ZS0wNV0sIFsxNTk5MTMxMTAxLjM1MTg0NTcsIDE0LCA3LjU1NzU5NjEwOTEwOWUtMDVdLCBbMTU5OTEzMTEwMS44OTIxMjY4LCAxNCwgNy41NTc1OTYxMDkxMDllLTA1XSwgWzE1OTkxMzExMTMuNjI4Mzg4LCAxNCwgNy41NTc1OTYxMDkxMDllLTA1XSwgWzE1OTkxMzExMjMuMTk3MDAwNSwgMTQsIDcuNTU3NTk2MTA5MTA5ZS0wNV0sIFsxNTk5MTMxMTQ0LjUwNDkwNywgMTQsIDcuNTU3NTk2MTA5MTA5ZS0wNV0sIFsxNTk5MTMxMTU1LjY5NjIwNzUsIDE0LCA3LjU1NzU5NjEwOTEwOWUtMDVdLCBbMTU5OTEzMTE3Mi4yMTQ0NjY2LCAxNCwgNy41NTc1OTYxMDkxMDllLTA1XSwgWzE1OTkxMzEyMDAuNDI1MTA0NCwgMTQsIDcuNTU3NTk2MTA5MTA5ZS0wNV0sIFsxNTk5MTMxMjA2LjI3OTUxOTMsIDE0LCA3LjU1NzU5NjEwOTEwOWUtMDVdLCBbMTU5OTEzMTIxNS44NDk3MDQzLCAxNCwgNy41NTc1OTYxMDkxMDllLTA1XSwgWzE1OTkxMzEyMjEuMTYwMTI0LCAxNCwgNy41NTc1OTYxMDkxMDllLTA1XSwgWzE1OTkxMzEyMjEuNjg5OTcxNywgMTQsIDcuNTU3NTk2MTA5MTA5ZS0wNV0sIFsxNTk5MTMxMjMxLjgwNjczODEsIDE0LCA3LjU1NzU5NjEwOTEwOWUtMDVdLCBbMTU5OTEzMTI0NC4wNjQwODI2LCAxNCwgNy41NTc1OTYxMDkxMDllLTA1XSwgWzE1OTkxMzEzMDcuNzY0ODI1LCAxNSwgNy4xODY5NTQ0NjI2Njc5MjdlLTA1XSwgWzE1OTkxMzEzMjMuNzAxMTU3NiwgMTUsIDcuMTg2OTU0NDYyNjY3OTI3ZS0wNV0sIFsxNTk5MTMxMzI4LjUyMDYsIDE1LCA3LjE4Njk1NDQ2MjY2NzkyN2UtMDVdLCBbMTU5OTEzMTMzMC4xMjA4NjUsIDE1LCA3LjE4Njk1NDQ2MjY2NzkyN2UtMDVdLCBbMTU5OTEzMTMzMy44NDQ3MTY1LCAxNSwgNy4xODY5NTQ0NjI2Njc5MjdlLTA1XSwgWzE1OTkxMzEzMzkuMTc3NTkwNCwgMTUsIDcuMTg2OTU0NDYyNjY3OTI3ZS0wNV0sIFsxNTk5MTMxMzQwLjc3NTU5NzMsIDE1LCA3LjE4Njk1NDQ2MjY2NzkyN2UtMDVdLCBbMTU5OTEzMTM0My40MjUyNDM2LCAxNSwgNy4xODY5NTQ0NjI2Njc5MjdlLTA1XSwgWzE1OTkxMzEzNDguNzQ0NDE0LCAxNSwgNy4xODY5NTQ0NjI2Njc5MjdlLTA1XSwgWzE1OTkxMzEzNjEuNTI3ODA1LCAxNSwgNy4xODY5NTQ0NjI2Njc5MjdlLTA1XSwgWzE1OTkxMzEzNjYuMzMxNjg5NCwgMTUsIDcuMTg2OTU0NDYyNjY3OTI3ZS0wNV0sIFsxNTk5MTMxMzc2LjQ1Nzg5NCwgMTUsIDcuMTg2OTU0NDYyNjY3OTI3ZS0wNV0sIFsxNTk5MTMxMzg1LjUyMzc5MzcsIDE1LCA3LjE4Njk1NDQ2MjY2NzkyN2UtMDVdLCBbMTU5OTEzMTQxOC41NDkzNzQ4LCAxNSwgNy4xODY5NTQ0NjI2Njc5MjdlLTA1XSwgWzE1OTkxMzE0MzcuMTg1ODgxLCAxNSwgNy4xODY5NTQ0NjI2Njc5MjdlLTA1XSwgWzE1OTkxMzE0NDYuMjEzNjk3MiwgMTUsIDcuMTg2OTU0NDYyNjY3OTI3ZS0wNV0sIFsxNTk5MTMxNDUxLjU2MTYwNjQsIDE1LCA3LjE4Njk1NDQ2MjY2NzkyN2UtMDVdLCBbMTU5OTEzMTQ1NC4yMTg4OTU3LCAxNSwgNy4xODY5NTQ0NjI2Njc5MjdlLTA1XSwgWzE1OTkxMzE0NjAuMDY2NDQsIDE1LCA3LjE4Njk1NDQ2MjY2NzkyN2UtMDVdLCBbMTU5OTEzMTQ2My4yNjQwNDgsIDE1LCA3LjE4Njk1NDQ2MjY2NzkyN2UtMDVdLCBbMTU5OTEzMTQ2Ni45Nzc2MDIsIDE1LCA3LjE4Njk1NDQ2MjY2NzkyN2UtMDVdLCBbMTU5OTEzMTQ3Ni41NjI2NDc4LCAxNSwgNy4xODY5NTQ0NjI2Njc5MjdlLTA1XSwgWzE1OTkxMzE0NzkuMjE0ODk0LCAxNSwgNy4xODY5NTQ0NjI2Njc5MjdlLTA1XSwgWzE1OTkxMzE0ODEuOTAzNTgyOCwgMTUsIDcuMTg2OTU0NDYyNjY3OTI3ZS0wNV0sIFsxNTk5MTMxNDkxLjQ3ODQwMywgMTUsIDcuMTg2OTU0NDYyNjY3OTI3ZS0wNV0sIFsxNTk5MTMxNDk3LjMxNjcyMjYsIDE1LCA3LjE4Njk1NDQ2MjY2NzkyN2UtMDVdLCBbMTU5OTEzMTQ5OC44OTI3ODM5LCAxNSwgNy4xODY5NTQ0NjI2Njc5MjdlLTA1XSwgWzE1OTkxMzE1MDkuNTI0MzAzMiwgMTUsIDcuMTg2OTU0NDYyNjY3OTI3ZS0wNV0sIFsxNTk5MTMxNTEzLjc2NDI2OSwgMTUsIDcuMTg2OTU0NDYyNjY3OTI3ZS0wNV0sIFsxNTk5MTMxNTE5LjEwMzYxMywgMTUsIDcuMTg2OTU0NDYyNjY3OTI3ZS0wNV0sIFsxNTk5MTMxNTM3LjcyMDk3MTMsIDE1LCA3LjE4Njk1NDQ2MjY2NzkyN2UtMDVdLCBbMTU5OTEzMTU0MC4zODc1NDY1LCAxNSwgNy4xODY5NTQ0NjI2Njc5MjdlLTA1XSwgWzE1OTkxMzE2MjUuNjM0NzM2MywgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxNjI2LjE2MjU3NTIsIDE2LCA2LjgwNDA0ODQ2MjA3MjM4N2UtMDVdLCBbMTU5OTEzMTY0My4yMTEyNTQ4LCAxNiwgNi44MDQwNDg0NjIwNzIzODdlLTA1XSwgWzE1OTkxMzE2NjYuMDUxNjcwMywgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxNjcwLjMwMjY4MDMsIDE2LCA2LjgwNDA0ODQ2MjA3MjM4N2UtMDVdLCBbMTU5OTEzMTY3NC41ODg0MDUxLCAxNiwgNi44MDQwNDg0NjIwNzIzODdlLTA1XSwgWzE1OTkxMzE2NzUuMTE5NzA3MywgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxNjkzLjE1OTU3NTUsIDE2LCA2LjgwNDA0ODQ2MjA3MjM4N2UtMDVdLCBbMTU5OTEzMTY5OS4wMTUzNDgyLCAxNiwgNi44MDQwNDg0NjIwNzIzODdlLTA1XSwgWzE1OTkxMzE3MDUuNDIwNTQ1OCwgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxNzE0LjQ2Mjg3NTQsIDE2LCA2LjgwNDA0ODQ2MjA3MjM4N2UtMDVdLCBbMTU5OTEzMTc0Ni4zNzMwNzI2LCAxNiwgNi44MDQwNDg0NjIwNzIzODdlLTA1XSwgWzE1OTkxMzE3NTkuMTQ2NTA0NiwgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxNzc1LjExMDM5ODMsIDE2LCA2LjgwNDA0ODQ2MjA3MjM4N2UtMDVdLCBbMTU5OTEzMTc3Ny4yNDk2MDg1LCAxNiwgNi44MDQwNDg0NjIwNzIzODdlLTA1XSwgWzE1OTkxMzE3ODQuNzIxMDIwNSwgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxNzkzLjc0NDM2NCwgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxNzk2Ljk0NTU2NywgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxODE5LjI5Nzk1NSwgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxODI3Ljc5MzE1NSwgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxODMzLjY2ODUzODgsIDE2LCA2LjgwNDA0ODQ2MjA3MjM4N2UtMDVdLCBbMTU5OTEzMTgzOC40NTk4OTI3LCAxNiwgNi44MDQwNDg0NjIwNzIzODdlLTA1XSwgWzE1OTkxMzE4NDIuNzE1NzQ2OSwgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxODUzLjM2Mjg5MTIsIDE2LCA2LjgwNDA0ODQ2MjA3MjM4N2UtMDVdLCBbMTU5OTEzMTg1NC40MjU3MDI2LCAxNiwgNi44MDQwNDg0NjIwNzIzODdlLTA1XSwgWzE1OTkxMzE4NTYuMDI4Nzg1MiwgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxODU3LjA4Mjk5NCwgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxODYwLjI4MjAxOTQsIDE2LCA2LjgwNDA0ODQ2MjA3MjM4N2UtMDVdLCBbMTU5OTEzMTg3MC45MTA3ODczLCAxNiwgNi44MDQwNDg0NjIwNzIzODdlLTA1XSwgWzE1OTkxMzE4NzIuNTA1MzQ2OCwgMTYsIDYuODA0MDQ4NDYyMDcyMzg3ZS0wNV0sIFsxNTk5MTMxODc1LjE2NDMxNjIsIDE2LCA2LjgwNDA0ODQ2MjA3MjM4N2UtMDVdLCBbMTU5OTEzMTg3OS45MzIyMzU3LCAxNiwgNi44MDQwNDg0NjIwNzIzODdlLTA1XSwgWzE1OTkxMzE5NjkuODQ5MTA4LCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzE5ODAuNTExMjYwNywgMTcsIDYuNDExMjM5ODgzMTYzOTQ0ZS0wNV0sIFsxNTk5MTMxOTgxLjA0NTkzNjMsIDE3LCA2LjQxMTIzOTg4MzE2Mzk0NGUtMDVdLCBbMTU5OTEzMTk4Mi4xMTI2OTc0LCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzE5ODkuNTk4NDA5LCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzE5OTEuNzI5OTU3NiwgMTcsIDYuNDExMjM5ODgzMTYzOTQ0ZS0wNV0sIFsxNTk5MTMxOTk2LjUxODU5NjIsIDE3LCA2LjQxMTIzOTg4MzE2Mzk0NGUtMDVdLCBbMTU5OTEzMTk5Ny4wNTMyMzYyLCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzE5OTkuNzA1OTM3LCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzIwMDIuMzc5MTk0NywgMTcsIDYuNDExMjM5ODgzMTYzOTQ0ZS0wNV0sIFsxNTk5MTMyMDEwLjM1MjA5MTgsIDE3LCA2LjQxMTIzOTg4MzE2Mzk0NGUtMDVdLCBbMTU5OTEzMjAyNi44MjI2OCwgMTcsIDYuNDExMjM5ODgzMTYzOTQ0ZS0wNV0sIFsxNTk5MTMyMDMzLjIzOTU0ODQsIDE3LCA2LjQxMTIzOTg4MzE2Mzk0NGUtMDVdLCBbMTU5OTEzMjAzNi45OTc2NDgyLCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzIwMzkuNjYwNTMwOCwgMTcsIDYuNDExMjM5ODgzMTYzOTQ0ZS0wNV0sIFsxNTk5MTMyMDQ3LjEwNjA5MDUsIDE3LCA2LjQxMTIzOTg4MzE2Mzk0NGUtMDVdLCBbMTU5OTEzMjA1MS45MTgyNTgyLCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzIwNjUuNzcwMzIxMSwgMTcsIDYuNDExMjM5ODgzMTYzOTQ0ZS0wNV0sIFsxNTk5MTMyMDY5LjQ5NjM2OTYsIDE3LCA2LjQxMTIzOTg4MzE2Mzk0NGUtMDVdLCBbMTU5OTEzMjA3MC4wMzE1MDgyLCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzIwNzQuODA0NzQ1LCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzIwOTUuMDE5MzE3LCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzIwOTkuMjkyOTk2NiwgMTcsIDYuNDExMjM5ODgzMTYzOTQ0ZS0wNV0sIFsxNTk5MTMyMDk5LjgxNzY3ODUsIDE3LCA2LjQxMTIzOTg4MzE2Mzk0NGUtMDVdLCBbMTU5OTEzMjEwMS45Mzc1NzE4LCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzIxMTkuMDA0OTU1MywgMTcsIDYuNDExMjM5ODgzMTYzOTQ0ZS0wNV0sIFsxNTk5MTMyMTQ0LjA3NjU1ODYsIDE3LCA2LjQxMTIzOTg4MzE2Mzk0NGUtMDVdLCBbMTU5OTEzMjE0Ni4xODkzODM1LCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzIxNTguNDMyNzk4NCwgMTcsIDYuNDExMjM5ODgzMTYzOTQ0ZS0wNV0sIFsxNTk5MTMyMTY4LjAxMzQ3NDUsIDE3LCA2LjQxMTIzOTg4MzE2Mzk0NGUtMDVdLCBbMTU5OTEzMjE2OS42MDkyNTA1LCAxNywgNi40MTEyMzk4ODMxNjM5NDRlLTA1XSwgWzE1OTkxMzIxODAuODAwMDkxNSwgMTcsIDYuNDExMjM5ODgzMTYzOTQ0ZS0wNV0sIFsxNTk5MTMyMTg2LjY3MjcxNDIsIDE3LCA2LjQxMTIzOTg4MzE2Mzk0NGUtMDVdLCBbMTU5OTEzMjI1Mi4yNzY3MDgxLCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzIyNTUuOTk5MTQxMiwgMTgsIDYuMDEwOTUwNTI4NDM0NDc4ZS0wNV0sIFsxNTk5MTMyMjY1LjA2NDMwMzQsIDE4LCA2LjAxMDk1MDUyODQzNDQ3OGUtMDVdLCBbMTU5OTEzMjI2Ni4xMTQ2ODAzLCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzIyNjcuNzExNjE5NiwgMTgsIDYuMDEwOTUwNTI4NDM0NDc4ZS0wNV0sIFsxNTk5MTMyMjc4Ljk1Mzk4NiwgMTgsIDYuMDEwOTUwNTI4NDM0NDc4ZS0wNV0sIFsxNTk5MTMyMjgwLjAyODMxNiwgMTgsIDYuMDEwOTUwNTI4NDM0NDc4ZS0wNV0sIFsxNTk5MTMyMjgyLjY4NDY1MzUsIDE4LCA2LjAxMDk1MDUyODQzNDQ3OGUtMDVdLCBbMTU5OTEzMjI4OC41Mjg3MzMzLCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzIyOTQuOTM2MjIsIDE4LCA2LjAxMDk1MDUyODQzNDQ3OGUtMDVdLCBbMTU5OTEzMjMwMy45NzU4NDIyLCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzIzMTMuNTY5MjYxOCwgMTgsIDYuMDEwOTUwNTI4NDM0NDc4ZS0wNV0sIFsxNTk5MTMyMzE2Ljc1NzQ4MTYsIDE4LCA2LjAxMDk1MDUyODQzNDQ3OGUtMDVdLCBbMTU5OTEzMjMyMi4wNzg3NDMyLCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzIzMzEuNjk1ODM4NSwgMTgsIDYuMDEwOTUwNTI4NDM0NDc4ZS0wNV0sIFsxNTk5MTMyMzMyLjIyMzI2MzMsIDE4LCA2LjAxMDk1MDUyODQzNDQ3OGUtMDVdLCBbMTU5OTEzMjM0Ni42NDE1NTM0LCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzIzNTAuOTEwMDU4LCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzIzNTYuMjIwOTIxNSwgMTgsIDYuMDEwOTUwNTI4NDM0NDc4ZS0wNV0sIFsxNTk5MTMyMzYyLjEwMzY0NDYsIDE4LCA2LjAxMDk1MDUyODQzNDQ3OGUtMDVdLCBbMTU5OTEzMjM3My4yNTk3ODMzLCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzIzODIuODQwMDg0LCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzIzOTkuODc5NTc5NSwgMTgsIDYuMDEwOTUwNTI4NDM0NDc4ZS0wNV0sIFsxNTk5MTMyNDAzLjY0NjAxOSwgMTgsIDYuMDEwOTUwNTI4NDM0NDc4ZS0wNV0sIFsxNTk5MTMyNDMxLjMyNzk5NjUsIDE4LCA2LjAxMDk1MDUyODQzNDQ3OGUtMDVdLCBbMTU5OTEzMjQzMi40MDM1NTUsIDE4LCA2LjAxMDk1MDUyODQzNDQ3OGUtMDVdLCBbMTU5OTEzMjQzNy43NDU2NTMyLCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzI0NDEuNDYzMjI4NywgMTgsIDYuMDEwOTUwNTI4NDM0NDc4ZS0wNV0sIFsxNTk5MTMyNDU1LjgzMDI4OTgsIDE4LCA2LjAxMDk1MDUyODQzNDQ3OGUtMDVdLCBbMTU5OTEzMjQ2Ny4wMDUyMTM1LCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzI0NzIuMzMxODc5NCwgMTgsIDYuMDEwOTUwNTI4NDM0NDc4ZS0wNV0sIFsxNTk5MTMyNDgwLjg0NDExOTMsIDE4LCA2LjAxMDk1MDUyODQzNDQ3OGUtMDVdLCBbMTU5OTEzMjQ4MS45MjA0MzM1LCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzI0ODUuNjM4MTE3OCwgMTgsIDYuMDEwOTUwNTI4NDM0NDc4ZS0wNV0sIFsxNTk5MTMyNTAyLjcyNzk5NTQsIDE4LCA2LjAxMDk1MDUyODQzNDQ3OGUtMDVdLCBbMTU5OTEzMjUxMS4yMjc2MjQyLCAxOCwgNi4wMTA5NTA1Mjg0MzQ0NzhlLTA1XSwgWzE1OTkxMzI1NjYuOTI4NzA3MSwgMTksIDUuNjA1NjQ3Njc1MTEwOTU4NWUtMDVdLCBbMTU5OTEzMjU4OS44MDc3Mjk1LCAxOSwgNS42MDU2NDc2NzUxMTA5NTg1ZS0wNV0sIFsxNTk5MTMyNTkxLjQwMzY2NTMsIDE5LCA1LjYwNTY0NzY3NTExMDk1ODVlLTA1XSwgWzE1OTkxMzI2MDIuMDQ2MjcwMSwgMTksIDUuNjA1NjQ3Njc1MTEwOTU4NWUtMDVdLCBbMTU5OTEzMjYwNS4yMzY2NTQ1LCAxOSwgNS42MDU2NDc2NzUxMTA5NTg1ZS0wNV0sIFsxNTk5MTMyNjA1Ljc2NTc2MzMsIDE5LCA1LjYwNTY0NzY3NTExMDk1ODVlLTA1XSwgWzE1OTkxMzI2MTkuNjE2MDQ1LCAxOSwgNS42MDU2NDc2NzUxMTA5NTg1ZS0wNV0sIFsxNTk5MTMyNjIzLjM1MTIyOSwgMTksIDUuNjA1NjQ3Njc1MTEwOTU4NWUtMDVdLCBbMTU5OTEzMjY1Ni45NTYyODg4LCAxOSwgNS42MDU2NDc2NzUxMTA5NTg1ZS0wNV0sIFsxNTk5MTMyNjYxLjc0Mzg1NzEsIDE5LCA1LjYwNTY0NzY3NTExMDk1ODVlLTA1XSwgWzE1OTkxMzI2NjUuNDU1NDA2MiwgMTksIDUuNjA1NjQ3Njc1MTEwOTU4NWUtMDVdLCBbMTU5OTEzMjY3MC43OTc1MDA2LCAxOSwgNS42MDU2NDc2NzUxMTA5NTg1ZS0wNV0sIFsxNTk5MTMyNjcyLjQwODIyOCwgMTksIDUuNjA1NjQ3Njc1MTEwOTU4NWUtMDVdLCBbMTU5OTEzMjY4NC4yMjE0MzI3LCAxOSwgNS42MDU2NDc2NzUxMTA5NTg1ZS0wNV0sIFsxNTk5MTMyNjkwLjEyOTU4NiwgMTksIDUuNjA1NjQ3Njc1MTEwOTU4NWUtMDVdLCBbMTU5OTEzMjY5Ni4wMTgzNDc3LCAxOSwgNS42MDU2NDc2NzUxMTA5NTg1ZS0wNV0sIFsxNTk5MTMyNzAyLjQ1MTgwNDksIDE5LCA1LjYwNTY0NzY3NTExMDk1ODVlLTA1XSwgWzE1OTkxMzI3MDIuOTg0ODUyOCwgMTksIDUuNjA1NjQ3Njc1MTEwOTU4NWUtMDVdLCBbMTU5OTEzMjcwNC42MDI2MzM1LCAxOSwgNS42MDU2NDc2NzUxMTA5NTg1ZS0wNV0sIFsxNTk5MTMyNzE3LjQ1MTc5NiwgMTksIDUuNjA1NjQ3Njc1MTEwOTU4NWUtMDVdLCBbMTU5OTEzMjcyMC42NjQxNjcyLCAxOSwgNS42MDU2NDc2NzUxMTA5NTg1ZS0wNV0sIFsxNTk5MTMyNzMyLjk1ODE1NCwgMTksIDUuNjA1NjQ3Njc1MTEwOTU4NWUtMDVdLCBbMTU5OTEzMjczOC4zMTY1NDUsIDE5LCA1LjYwNTY0NzY3NTExMDk1ODVlLTA1XSwgWzE1OTkxMzI3NDIuNjA2ODMxNiwgMTksIDUuNjA1NjQ3Njc1MTEwOTU4NWUtMDVdLCBbMTU5OTEzMjc3NS4yOTE5NTcxLCAxOSwgNS42MDU2NDc2NzUxMTA5NTg1ZS0wNV0sIFsxNTk5MTMyNzgwLjEzNzc1MTgsIDE5LCA1LjYwNTY0NzY3NTExMDk1ODVlLTA1XSwgWzE1OTkxMzI3ODQuOTU2NjE1NCwgMTksIDUuNjA1NjQ3Njc1MTEwOTU4NWUtMDVdLCBbMTU5OTEzMjgwMy43MDgyNDk2LCAxOSwgNS42MDU2NDc2NzUxMTA5NTg1ZS0wNV0sIFsxNTk5MTMyODE4Ljc2MDg3NTIsIDE5LCA1LjYwNTY0NzY3NTExMDk1ODVlLTA1XSwgWzE1OTkxMzI4MjAuMzU3MjM1MiwgMTksIDUuNjA1NjQ3Njc1MTEwOTU4NWUtMDVdLCBbMTU5OTEzMjg5Ni4wMTQ5MjIxLCAyMCwgNS4xOTc4MzA2MTQ2MzM4NThlLTA1XSwgWzE1OTkxMzI5MDguNzk4MDIxMywgMjAsIDUuMTk3ODMwNjE0NjMzODU4ZS0wNV0sIFsxNTk5MTMyOTQzLjY2NzI2MzMsIDIwLCA1LjE5NzgzMDYxNDYzMzg1OGUtMDVdLCBbMTU5OTEzMjk2Ni4yOTY3MzksIDIwLCA1LjE5NzgzMDYxNDYzMzg1OGUtMDVdLCBbMTU5OTEzMjk4NS41NjkwNTY3LCAyMCwgNS4xOTc4MzA2MTQ2MzM4NThlLTA1XSwgWzE1OTkxMzI5ODguMjQ5MDU4MiwgMjAsIDUuMTk3ODMwNjE0NjMzODU4ZS0wNV0sIFsxNTk5MTMyOTg4Ljc3OTcwNzQsIDIwLCA1LjE5NzgzMDYxNDYzMzg1OGUtMDVdLCBbMTU5OTEzMjk4OS44NDkyNzM3LCAyMCwgNS4xOTc4MzA2MTQ2MzM4NThlLTA1XSwgWzE1OTkxMzI5OTcuMzM0NzUyMywgMjAsIDUuMTk3ODMwNjE0NjMzODU4ZS0wNV0sIFsxNTk5MTMzMDAzLjc5NTQ4MjYsIDIwLCA1LjE5NzgzMDYxNDYzMzg1OGUtMDVdLCBbMTU5OTEzMzAxNi4wOTAwMDk1LCAyMCwgNS4xOTc4MzA2MTQ2MzM4NThlLTA1XSwgWzE1OTkxMzMwMTkuMjk3Mzk0MywgMjAsIDUuMTk3ODMwNjE0NjMzODU4ZS0wNV0sIFsxNTk5MTMzMDI3LjMzODcyOTQsIDIwLCA1LjE5NzgzMDYxNDYzMzg1OGUtMDVdLCBbMTU5OTEzMzAzMC41NTU5MDcyLCAyMCwgNS4xOTc4MzA2MTQ2MzM4NThlLTA1XSwgWzE1OTkxMzMwMzUuOTA4MjA1NywgMjAsIDUuMTk3ODMwNjE0NjMzODU4ZS0wNV0sIFsxNTk5MTMzMDQ4Ljc2MTY0ODcsIDIwLCA1LjE5NzgzMDYxNDYzMzg1OGUtMDVdLCBbMTU5OTEzMzA1Ny44ODU1NTI2LCAyMCwgNS4xOTc4MzA2MTQ2MzM4NThlLTA1XSwgWzE1OTkxMzMwNjkuNjQ4MDIxMiwgMjAsIDUuMTk3ODMwNjE0NjMzODU4ZS0wNV0sIFsxNTk5MTMzMDg2LjIxOTc3NDUsIDIwLCA1LjE5NzgzMDYxNDYzMzg1OGUtMDVdLCBbMTU5OTEzMzA4OS45ODQyNTg3LCAyMCwgNS4xOTc4MzA2MTQ2MzM4NThlLTA1XSwgWzE1OTkxMzMwOTUuODYwNDMyOSwgMjAsIDUuMTk3ODMwNjE0NjMzODU4ZS0wNV0sIFsxNTk5MTMzMTA2LjYwMzk2NjcsIDIwLCA1LjE5NzgzMDYxNDYzMzg1OGUtMDVdLCBbMTU5OTEzMzExMC4zNTk0MTQsIDIwLCA1LjE5NzgzMDYxNDYzMzg1OGUtMDVdLCBbMTU5OTEzMzExMy4wMzE1MTY4LCAyMCwgNS4xOTc4MzA2MTQ2MzM4NThlLTA1XSwgWzE1OTkxMzMxMzUuNTIzMDA2LCAyMCwgNS4xOTc4MzA2MTQ2MzM4NThlLTA1XSwgWzE1OTkxMzMyMDkuMDI2MDc1NiwgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzMjIzLjk5NjMxNywgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzMjI1LjA2Njg2OSwgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzMjI1LjYwMjMwODgsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzIyNi42OTIwODM2LCAyMSwgNC43OTAwMTM1NTQxNTY3NThlLTA1XSwgWzE1OTkxMzMyMzQuNzYzNTU5LCAyMSwgNC43OTAwMTM1NTQxNTY3NThlLTA1XSwgWzE1OTkxMzMyMzcuOTkxMjY4MiwgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzMjQwLjY2NzMyNSwgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzMjU2LjI0ODYwNTMsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzI2My43NDk1NjA0LCAyMSwgNC43OTAwMTM1NTQxNTY3NThlLTA1XSwgWzE1OTkxMzMyNjkuNjI3NDQxNiwgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzMjc0Ljk5NDg1MjgsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzI3Ny4xMzA3NjkzLCAyMSwgNC43OTAwMTM1NTQxNTY3NThlLTA1XSwgWzE1OTkxMzMyNzcuNjcxNjQ1MiwgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzMjkyLjY5NDQ5NzgsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzI5Ny40OTg5MjI4LCAyMSwgNC43OTAwMTM1NTQxNTY3NThlLTA1XSwgWzE1OTkxMzMzMDkuODc2MzYzLCAyMSwgNC43OTAwMTM1NTQxNTY3NThlLTA1XSwgWzE1OTkxMzMzMTAuNDE1MDg1NiwgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzMzE2LjgzNDE1MjUsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzMzMy40MzU4NjE4LCAyMSwgNC43OTAwMTM1NTQxNTY3NThlLTA1XSwgWzE1OTkxMzMzMzguMjYzNjMxOCwgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzMzQ3LjM2MzcwOSwgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzMzUwLjAzMDgyMDEsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzM1NC44NjkxMjU0LCAyMSwgNC43OTAwMTM1NTQxNTY3NThlLTA1XSwgWzE1OTkxMzMzNTkuMTUwNDg5MywgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzMzYzLjQ0MzEzOTYsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzM3Mi41MjgzNjY4LCAyMSwgNC43OTAwMTM1NTQxNTY3NThlLTA1XSwgWzE1OTkxMzMzODguNjA1NzkzLCAyMSwgNC43OTAwMTM1NTQxNTY3NThlLTA1XSwgWzE1OTkxMzMzOTMuOTU2MTgxNSwgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzNDEzLjgzNTgzNzYsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzQxOC42MjkxODM1LCAyMSwgNC43OTAwMTM1NTQxNTY3NThlLTA1XSwgWzE1OTkxMzM0MTkuMTgxNTY4MSwgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzNDIyLjM5NzMyNDYsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzQzMC45NjA5NjcsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzQzNC42OTM2MzQ1LCAyMSwgNC43OTAwMTM1NTQxNTY3NThlLTA1XSwgWzE1OTkxMzM0NDkuNzMyNjYwMywgMjEsIDQuNzkwMDEzNTU0MTU2NzU4ZS0wNV0sIFsxNTk5MTMzNDUwLjI2NzkzMzQsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzQ1NS4wODI1MDIsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzQ1Ny43NjY0NDYsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzQ2My42MjY0MjgsIDIxLCA0Ljc5MDAxMzU1NDE1Njc1OGUtMDVdLCBbMTU5OTEzMzUyMS41MDg0MDE2LCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM1MjguOTk3MDc5OCwgMjIsIDQuMzg0NzEwNzAwODMzMjM5ZS0wNV0sIFsxNTk5MTMzNTQ5LjMyNTA4NzUsIDIyLCA0LjM4NDcxMDcwMDgzMzIzOWUtMDVdLCBbMTU5OTEzMzU1MC45MzcwMDg2LCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM1NTUuNzczNzU5OCwgMjIsIDQuMzg0NzEwNzAwODMzMjM5ZS0wNV0sIFsxNTk5MTMzNTY5LjE3MDU4NjYsIDIyLCA0LjM4NDcxMDcwMDgzMzIzOWUtMDVdLCBbMTU5OTEzMzU3MS4zMDUzODYzLCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM1NzYuMTA4MDA5LCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM1ODMuNTkyMjQ4LCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM1ODYuODEwNzU5OCwgMjIsIDQuMzg0NzEwNzAwODMzMjM5ZS0wNV0sIFsxNTk5MTMzNTg3Ljg4MzQwNjIsIDIyLCA0LjM4NDcxMDcwMDgzMzIzOWUtMDVdLCBbMTU5OTEzMzYwNi4xMzE0NTA3LCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM2MDkuMzY2NDY0LCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM2MTIuNTc5MTExLCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM2MTMuNjQxODA4NywgMjIsIDQuMzg0NzEwNzAwODMzMjM5ZS0wNV0sIFsxNTk5MTMzNjE0LjE4NzAxMzksIDIyLCA0LjM4NDcxMDcwMDgzMzIzOWUtMDVdLCBbMTU5OTEzMzYxOS41NjE3NDE0LCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM2MjIuMjI2NjY2NywgMjIsIDQuMzg0NzEwNzAwODMzMjM5ZS0wNV0sIFsxNTk5MTMzNjI5LjcyMzc4NjQsIDIyLCA0LjM4NDcxMDcwMDgzMzIzOWUtMDVdLCBbMTU5OTEzMzYzNC41NTU4NTQ2LCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM2NDMuMTI2Mzg4LCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM2NTYuNTU5NjkxLCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM2NjYuNzM5MDA3LCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM2NzEuNTM3MzU4LCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM2ODEuMTgxMzA5NywgMjIsIDQuMzg0NzEwNzAwODMzMjM5ZS0wNV0sIFsxNTk5MTMzNjk1LjY0NzYzMywgMjIsIDQuMzg0NzEwNzAwODMzMjM5ZS0wNV0sIFsxNTk5MTMzNzA3Ljk3NjU1MzcsIDIyLCA0LjM4NDcxMDcwMDgzMzIzOWUtMDVdLCBbMTU5OTEzMzcwOS4wMzQwODg0LCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM3MDkuNTcxODYyLCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM3MzYuODIwNjE0NiwgMjIsIDQuMzg0NzEwNzAwODMzMjM5ZS0wNV0sIFsxNTk5MTMzNzQxLjEwMjEyOTIsIDIyLCA0LjM4NDcxMDcwMDgzMzIzOWUtMDVdLCBbMTU5OTEzMzc0Mi43MTYzNzczLCAyMiwgNC4zODQ3MTA3MDA4MzMyMzllLTA1XSwgWzE1OTkxMzM3NDcuNTUzMTM5MiwgMjIsIDQuMzg0NzEwNzAwODMzMjM5ZS0wNV0sIFsxNTk5MTMzNzY3Ljg2OTA3NjUsIDIyLCA0LjM4NDcxMDcwMDgzMzIzOWUtMDVdLCBbMTU5OTEzMzgzNy41MzEwNjY0LCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTMzODQ4LjI2MjMwNTMsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzM4NTguNDYyNDg1NiwgMjMsIDMuOTg0NDIxMzQ2MTAzNzcyNWUtMDVdLCBbMTU5OTEzMzg3NS4wNTU0NzU3LCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTMzODc5LjM0NzYxMTcsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzM4ODAuNDE3NDE1LCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTMzODk4LjYyMTI4NzYsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzM5MDcuNzMwNTAyMSwgMjMsIDMuOTg0NDIxMzQ2MTAzNzcyNWUtMDVdLCBbMTU5OTEzMzkxNS4yMzMyMjE4LCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTMzOTE4LjQ1MjQ3ODYsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzM5MzMuNDUzOTUzLCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTMzOTM1LjA2MTEwNzQsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzM5MzUuNTkwOTMxNCwgMjMsIDMuOTg0NDIxMzQ2MTAzNzcyNWUtMDVdLCBbMTU5OTEzMzkzOC43ODYzNTQsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzM5MzkuODU5MTQ3LCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTMzOTQ4Ljk2ODkyMTQsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzM5NTMuMjY1NjU3NCwgMjMsIDMuOTg0NDIxMzQ2MTAzNzcyNWUtMDVdLCBbMTU5OTEzMzk1OC4wOTIyNTIsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzM5NjYuMTQ4NDg2LCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTMzOTc0LjcxMzY2NzYsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzM5OTUuNjAyNTQxMiwgMjMsIDMuOTg0NDIxMzQ2MTAzNzcyNWUtMDVdLCBbMTU5OTEzNDAwMi4wNDA1MDMzLCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTM0MDAzLjEwMjk3NTgsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzQwMDguNDU4Njc1NCwgMjMsIDMuOTg0NDIxMzQ2MTAzNzcyNWUtMDVdLCBbMTU5OTEzNDAxNC4zODg3MzM0LCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTM0MDE4LjE1NDIzOTQsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzQwMjEuOTA5MTc2MywgMjMsIDMuOTg0NDIxMzQ2MTAzNzcyNWUtMDVdLCBbMTU5OTEzNDAyMi45NzY3Njg3LCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTM0MDMyLjEwNjUxLCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTM0MDQyLjMxMTQyMDIsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzQwNjEuNTg0NjcyNSwgMjMsIDMuOTg0NDIxMzQ2MTAzNzcyNWUtMDVdLCBbMTU5OTEzNDA3Ni4wNzgxMjYyLCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTM0MDc5LjI3NDY1MDgsIDIzLCAzLjk4NDQyMTM0NjEwMzc3MjVlLTA1XSwgWzE1OTkxMzQwODQuMDg3Mjk1NSwgMjMsIDMuOTg0NDIxMzQ2MTAzNzcyNWUtMDVdLCBbMTU5OTEzNDA5OS44MTIxMTk3LCAyMywgMy45ODQ0MjEzNDYxMDM3NzI1ZS0wNV0sIFsxNTk5MTM0MTY2LjU5MzI1NywgMjQsIDMuNTkxNjEyNzY3MTk1MzI5ZS0wNV0sIFsxNTk5MTM0MTY3LjEzMzE1OTksIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDE3Ni43OTAxMzcsIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDE5MS43NzQzNjQsIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDE5NC40NTIxOTE2LCAyNCwgMy41OTE2MTI3NjcxOTUzMjllLTA1XSwgWzE1OTkxMzQyMDguOTE2NDE2LCAyNCwgMy41OTE2MTI3NjcxOTUzMjllLTA1XSwgWzE1OTkxMzQyMTMuMTk2NjA5MywgMjQsIDMuNTkxNjEyNzY3MTk1MzI5ZS0wNV0sIFsxNTk5MTM0MjE1Ljg4MzU3MTQsIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDIxNi45NTM0Mjk1LCAyNCwgMy41OTE2MTI3NjcxOTUzMjllLTA1XSwgWzE1OTkxMzQyMTcuNDk0NDkxLCAyNCwgMy41OTE2MTI3NjcxOTUzMjllLTA1XSwgWzE1OTkxMzQyMjguMjMzMTc4NCwgMjQsIDMuNTkxNjEyNzY3MTk1MzI5ZS0wNV0sIFsxNTk5MTM0MjMwLjg4OTcxOTcsIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDIzOC4zODY4MSwgMjQsIDMuNTkxNjEyNzY3MTk1MzI5ZS0wNV0sIFsxNTk5MTM0MjQzLjc0NTI1OTgsIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDI0Ni40Mjc3MzYsIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDI1MC4xNTM0NTg4LCAyNCwgMy41OTE2MTI3NjcxOTUzMjllLTA1XSwgWzE1OTkxMzQyNjAuMzQzNjg1NiwgMjQsIDMuNTkxNjEyNzY3MTk1MzI5ZS0wNV0sIFsxNTk5MTM0MjY2Ljc3Mjk2MDQsIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDI4NS41MjI3OTgzLCAyNCwgMy41OTE2MTI3NjcxOTUzMjllLTA1XSwgWzE1OTkxMzQyOTAuMzI3MDg5LCAyNCwgMy41OTE2MTI3NjcxOTUzMjllLTA1XSwgWzE1OTkxMzQzMTYuMDUxNTg2MiwgMjQsIDMuNTkxNjEyNzY3MTk1MzI5ZS0wNV0sIFsxNTk5MTM0MzE4LjcxOTk2NDMsIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDMyNi43Nzk5MTk0LCAyNCwgMy41OTE2MTI3NjcxOTUzMjllLTA1XSwgWzE1OTkxMzQzMzIuNjIwMzQ1LCAyNCwgMy41OTE2MTI3NjcxOTUzMjllLTA1XSwgWzE1OTkxMzQzMzQuNzcwNjg2NCwgMjQsIDMuNTkxNjEyNzY3MTk1MzI5ZS0wNV0sIFsxNTk5MTM0MzQzLjMxMjc4NzUsIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDM1MC4yNTI2NjksIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDM2MC45NzMwNjU0LCAyNCwgMy41OTE2MTI3NjcxOTUzMjllLTA1XSwgWzE1OTkxMzQzNjUuNzg4OTU3OCwgMjQsIDMuNTkxNjEyNzY3MTk1MzI5ZS0wNV0sIFsxNTk5MTM0MzcwLjA0OTI5MywgMjQsIDMuNTkxNjEyNzY3MTk1MzI5ZS0wNV0sIFsxNTk5MTM0Mzg5LjM0NDM2NTQsIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDQwMC4wNTU3NDMyLCAyNCwgMy41OTE2MTI3NjcxOTUzMjllLTA1XSwgWzE1OTkxMzQ0MDEuNjYzOTI1MiwgMjQsIDMuNTkxNjEyNzY3MTk1MzI5ZS0wNV0sIFsxNTk5MTM0NDEwLjIxMjg4NDcsIDI0LCAzLjU5MTYxMjc2NzE5NTMyOWUtMDVdLCBbMTU5OTEzNDQ3Mi42NDI4NTI1LCAyNSwgMy4yMDg3MDcxMzAzOTc2N2UtMDVdLCBbMTU5OTEzNDUxMC43OTQzMDI1LCAyNSwgMy4yMDg3MDcxMzAzOTc2N2UtMDVdLCBbMTU5OTEzNDUxNS41NzY2MjUzLCAyNSwgMy4yMDg3MDcxMzAzOTc2N2UtMDVdLCBbMTU5OTEzNDUxNi4xMTcyNDE2LCAyNSwgMy4yMDg3MDcxMzAzOTc2N2UtMDVdLCBbMTU5OTEzNDUzMi4xODYxMjg5LCAyNSwgMy4yMDg3MDcxMzAzOTc2N2UtMDVdLCBbMTU5OTEzNDU0Mi4zMzg0OTM2LCAyNSwgMy4yMDg3MDcxMzAzOTc2N2UtMDVdLCBbMTU5OTEzNDU0My45NTMxOTkxLCAyNSwgMy4yMDg3MDcxMzAzOTc2N2UtMDVdLCBbMTU5OTEzNDU1NS43MTY4MDM4LCAyNSwgMy4yMDg3MDcxMzAzOTc2N2UtMDVdLCBbMTU5OTEzNDU5MC41MTg5MzIzLCAyNSwgMy4yMDg3MDcxMzAzOTc2N2UtMDVdLCBbMTU5OTEzNDU5My43Mjc2NzI2LCAyNSwgMy4yMDg3MDcxMzAzOTc2N2UtMDVdLCBbMTU5OTEzNDU5NC44MTIxNDIxLCAyNSwgMy4yMDg3MDcxMzAzOTc2N2UtMDVdLCBbMTU5OTEzNDYwNi4wOTQzMTIsIDI1LCAzLjIwODcwNzEzMDM5NzY3ZS0wNV0sIFsxNTk5MTM0NjE3Ljg3ODgyMSwgMjUsIDMuMjA4NzA3MTMwMzk3NjdlLTA1XSwgWzE1OTkxMzQ2MzMuMzU1NTUsIDI1LCAzLjIwODcwNzEzMDM5NzY3ZS0wNV0sIFsxNTk5MTM0NjU3Ljk1ODI3MjcsIDI1LCAzLjIwODcwNzEzMDM5NzY3ZS0wNV0sIFsxNTk5MTM0NjcyLjk1NjM1OTEsIDI1LCAzLjIwODcwNzEzMDM5NzY3ZS0wNV0sIFsxNTk5MTM0NzA0LjUwMDUwMjMsIDI1LCAzLjIwODcwNzEzMDM5NzY3ZS0wNV0sIFsxNTk5MTM0NzEzLjA2MjgyMjMsIDI1LCAzLjIwODcwNzEzMDM5NzY3ZS0wNV0sIFsxNTk5MTM0NzI5LjY1OTMzNTYsIDI1LCAzLjIwODcwNzEzMDM5NzY3ZS0wNV0sIFsxNTk5MTM0NzMzLjg5OTY2MDYsIDI1LCAzLjIwODcwNzEzMDM5NzY3ZS0wNV0sIFsxNTk5MTM0Nzk4LjQzMjc1MjEsIDI2LCAyLjgzODA2NDkzODI1OTc3NjdlLTA1XSwgWzE1OTkxMzQ4MTEuODA2OTI4NiwgMjYsIDIuODM4MDY0OTM4MjU5Nzc2N2UtMDVdLCBbMTU5OTEzNDgxNC40ODkyMTUxLCAyNiwgMi44MzgwNjQ5MzgyNTk3NzY3ZS0wNV0sIFsxNTk5MTM0ODIxLjQyOTI0NjIsIDI2LCAyLjgzODA2NDkzODI1OTc3NjdlLTA1XSwgWzE1OTkxMzQ4MjguMzczNTYwNywgMjYsIDIuODM4MDY0OTM4MjU5Nzc2N2UtMDVdLCBbMTU5OTEzNDgzMS41OTI1Mzk4LCAyNiwgMi44MzgwNjQ5MzgyNTk3NzY3ZS0wNV0sIFsxNTk5MTM0ODU0LjA0MzE1ODgsIDI2LCAyLjgzODA2NDkzODI1OTc3NjdlLTA1XSwgWzE1OTkxMzQ4NTQuNTgxNzcwMiwgMjYsIDIuODM4MDY0OTM4MjU5Nzc2N2UtMDVdLCBbMTU5OTEzNDg1Ny4yMzk3MjYzLCAyNiwgMi44MzgwNjQ5MzgyNTk3NzY3ZS0wNV0sIFsxNTk5MTM0ODY1LjI2MDI3MzUsIDI2LCAyLjgzODA2NDkzODI1OTc3NjdlLTA1XSwgWzE1OTkxMzQ4OTYuMjYzNzUzNCwgMjYsIDIuODM4MDY0OTM4MjU5Nzc2N2UtMDVdLCBbMTU5OTEzNDkwNS4zMzE5NzI0LCAyNiwgMi44MzgwNjQ5MzgyNTk3NzY3ZS0wNV0sIFsxNTk5MTM0OTE5Ljc3MDQ5NCwgMjYsIDIuODM4MDY0OTM4MjU5Nzc2N2UtMDVdLCBbMTU5OTEzNDkyMC4zMDgxNTYzLCAyNiwgMi44MzgwNjQ5MzgyNTk3NzY3ZS0wNV0sIFsxNTk5MTM0OTI0LjU5MzcxMzUsIDI2LCAyLjgzODA2NDkzODI1OTc3NjdlLTA1XSwgWzE1OTkxMzQ5MzEuMDAwNjczMywgMjYsIDIuODM4MDY0OTM4MjU5Nzc2N2UtMDVdLCBbMTU5OTEzNDkzMi42MjI1MjQ1LCAyNiwgMi44MzgwNjQ5MzgyNTk3NzY3ZS0wNV0sIFsxNTk5MTM0OTM3LjQzNDU1MjcsIDI2LCAyLjgzODA2NDkzODI1OTc3NjdlLTA1XSwgWzE1OTkxMzQ5NDUuNDcyMTM1LCAyNiwgMi44MzgwNjQ5MzgyNTk3NzY3ZS0wNV0sIFsxNTk5MTM0OTQ3LjYyNDg1NywgMjYsIDIuODM4MDY0OTM4MjU5Nzc2N2UtMDVdLCBbMTU5OTEzNDk1Ni43MjI4NzQ2LCAyNiwgMi44MzgwNjQ5MzgyNTk3NzY3ZS0wNV0sIFsxNTk5MTM0OTY2LjM3ODQ5NzEsIDI2LCAyLjgzODA2NDkzODI1OTc3NjdlLTA1XSwgWzE1OTkxMzQ5NzYuMDEwODQ4MywgMjYsIDIuODM4MDY0OTM4MjU5Nzc2N2UtMDVdLCBbMTU5OTEzNDk4NC4wNzA0ODU0LCAyNiwgMi44MzgwNjQ5MzgyNTk3NzY3ZS0wNV0sIFsxNTk5MTM0OTg5LjQyMTY5MTcsIDI2LCAyLjgzODA2NDkzODI1OTc3NjdlLTA1XSwgWzE1OTkxMzQ5OTEuMDA3Nzk0NCwgMjYsIDIuODM4MDY0OTM4MjU5Nzc2N2UtMDVdLCBbMTU5OTEzNDk5Ny40MTAwNTQ0LCAyNiwgMi44MzgwNjQ5MzgyNTk3NzY3ZS0wNV0sIFsxNTk5MTM0OTk3Ljk0Mzk4MjQsIDI2LCAyLjgzODA2NDkzODI1OTc3NjdlLTA1XSwgWzE1OTkxMzUwMDAuMDg0NTkzMywgMjYsIDIuODM4MDY0OTM4MjU5Nzc2N2UtMDVdLCBbMTU5OTEzNTAxNS4wNzY4MTA4LCAyNiwgMi44MzgwNjQ5MzgyNTk3NzY3ZS0wNV0sIFsxNTk5MTM1MDI4Ljk3NjMwMzYsIDI2LCAyLjgzODA2NDkzODI1OTc3NjdlLTA1XSwgWzE1OTkxMzUwNDYuNTg0MDE2NiwgMjYsIDIuODM4MDY0OTM4MjU5Nzc2N2UtMDVdLCBbMTU5OTEzNTEwOC44MjEwOTkzLCAyNywgMi40ODE5NzE1NjkwNjgyNjQyZS0wNV0sIFsxNTk5MTM1MTI4LjA1NzEzNSwgMjcsIDIuNDgxOTcxNTY5MDY4MjY0MmUtMDVdLCBbMTU5OTEzNTEzMC43MzEwODg2LCAyNywgMi40ODE5NzE1NjkwNjgyNjQyZS0wNV0sIFsxNTk5MTM1MTU2LjQwNTk1NzUsIDI3LCAyLjQ4MTk3MTU2OTA2ODI2NDJlLTA1XSwgWzE1OTkxMzUxNTguNTM4NTc3NiwgMjcsIDIuNDgxOTcxNTY5MDY4MjY0MmUtMDVdLCBbMTU5OTEzNTE2OS4yMzU5NjYyLCAyNywgMi40ODE5NzE1NjkwNjgyNjQyZS0wNV0sIFsxNTk5MTM1MTk1LjQyMzQwOTUsIDI3LCAyLjQ4MTk3MTU2OTA2ODI2NDJlLTA1XSwgWzE1OTkxMzUyMDkuMzA3NCwgMjcsIDIuNDgxOTcxNTY5MDY4MjY0MmUtMDVdLCBbMTU5OTEzNTIxMC45MDQwNzc1LCAyNywgMi40ODE5NzE1NjkwNjgyNjQyZS0wNV0sIFsxNTk5MTM1MjMzLjMyNDEzMDMsIDI3LCAyLjQ4MTk3MTU2OTA2ODI2NDJlLTA1XSwgWzE1OTkxMzUyNDIuMTA2NjQ4LCAyNywgMi40ODE5NzE1NjkwNjgyNjQyZS0wNV0sIFsxNTk5MTM1MjYwLjgwNzk5MTUsIDI3LCAyLjQ4MTk3MTU2OTA2ODI2NDJlLTA1XSwgWzE1OTkxMzUyNjguODI0MjI0LCAyNywgMi40ODE5NzE1NjkwNjgyNjQyZS0wNV0sIFsxNTk5MTM1MjczLjA5ODkwNjUsIDI3LCAyLjQ4MTk3MTU2OTA2ODI2NDJlLTA1XSwgWzE1OTkxMzUyNzYuMzEwOTQ1MywgMjcsIDIuNDgxOTcxNTY5MDY4MjY0MmUtMDVdLCBbMTU5OTEzNTI5My45NjMwMjA4LCAyNywgMi40ODE5NzE1NjkwNjgyNjQyZS0wNV0sIFsxNTk5MTM1MzAzLjA1OTQ0MTgsIDI3LCAyLjQ4MTk3MTU2OTA2ODI2NDJlLTA1XSwgWzE1OTkxMzUzMDQuNjU0MDYyMywgMjcsIDIuNDgxOTcxNTY5MDY4MjY0MmUtMDVdLCBbMTU5OTEzNTMwNi4yNjU3MjA4LCAyNywgMi40ODE5NzE1NjkwNjgyNjQyZS0wNV0sIFsxNTk5MTM1MzEzLjIwNDg4ODYsIDI3LCAyLjQ4MTk3MTU2OTA2ODI2NDJlLTA1XSwgWzE1OTkxMzUzMjcuNjM4NDQ2NiwgMjcsIDIuNDgxOTcxNTY5MDY4MjY0MmUtMDVdLCBbMTU5OTEzNTMzNy4yNTI1MDg0LCAyNywgMi40ODE5NzE1NjkwNjgyNjQyZS0wNV0sIFsxNTk5MTM1MzQwLjk4ODA2NSwgMjcsIDIuNDgxOTcxNTY5MDY4MjY0MmUtMDVdLCBbMTU5OTEzNTM0NC43MzQyOTksIDI3LCAyLjQ4MTk3MTU2OTA2ODI2NDJlLTA1XSwgWzE1OTkxMzUzNTYuNDkwNzA3LCAyNywgMi40ODE5NzE1NjkwNjgyNjQyZS0wNV0sIFsxNTk5MTM1MzY3LjcyNjI1MDIsIDI3LCAyLjQ4MTk3MTU2OTA2ODI2NDJlLTA1XSwgWzE1OTkxMzU0MjguMDUwMDAxMSwgMjgsIDIuMTQyNjIyMzYxMTM0MjcyZS0wNV0sIFsxNTk5MTM1NDQ2LjcwMjM3OTIsIDI4LCAyLjE0MjYyMjM2MTEzNDI3MmUtMDVdLCBbMTU5OTEzNTQ1OS4wMjk0MTc4LCAyOCwgMi4xNDI2MjIzNjExMzQyNzJlLTA1XSwgWzE1OTkxMzU0NjAuNjM0MzMwMywgMjgsIDIuMTQyNjIyMzYxMTM0MjcyZS0wNV0sIFsxNTk5MTM1NDY3LjYxMTY1MzYsIDI4LCAyLjE0MjYyMjM2MTEzNDI3MmUtMDVdLCBbMTU5OTEzNTQ2OS43NjEzNDU2LCAyOCwgMi4xNDI2MjIzNjExMzQyNzJlLTA1XSwgWzE1OTkxMzU0NzIuOTQxNzk5NCwgMjgsIDIuMTQyNjIyMzYxMTM0MjcyZS0wNV0sIFsxNTk5MTM1NDk1Ljg4MTA4MDksIDI4LCAyLjE0MjYyMjM2MTEzNDI3MmUtMDVdLCBbMTU5OTEzNTQ5Ni40MTg2NDQ3LCAyOCwgMi4xNDI2MjIzNjExMzQyNzJlLTA1XSwgWzE1OTkxMzU1MDYuNTg4MDY2MywgMjgsIDIuMTQyNjIyMzYxMTM0MjcyZS0wNV0sIFsxNTk5MTM1NTA4LjE5MjA1MjEsIDI4LCAyLjE0MjYyMjM2MTEzNDI3MmUtMDVdLCBbMTU5OTEzNTUxMi41MDIyMDQ0LCAyOCwgMi4xNDI2MjIzNjExMzQyNzJlLTA1XSwgWzE1OTkxMzU1MTMuMDQzNzM1LCAyOCwgMi4xNDI2MjIzNjExMzQyNzJlLTA1XSwgWzE1OTkxMzU1MTMuNTc3NDc5NCwgMjgsIDIuMTQyNjIyMzYxMTM0MjcyZS0wNV0sIFsxNTk5MTM1NTE2Ljc3MTk1ODgsIDI4LCAyLjE0MjYyMjM2MTEzNDI3MmUtMDVdLCBbMTU5OTEzNTUyNy40NjE0MTc3LCAyOCwgMi4xNDI2MjIzNjExMzQyNzJlLTA1XSwgWzE1OTkxMzU1MjguNTMxNjY3NywgMjgsIDIuMTQyNjIyMzYxMTM0MjcyZS0wNV0sIFsxNTk5MTM1NTM4LjExMjk5NSwgMjgsIDIuMTQyNjIyMzYxMTM0MjcyZS0wNV0sIFsxNTk5MTM1NTY0Ljc1NjM3MTMsIDI4LCAyLjE0MjYyMjM2MTEzNDI3MmUtMDVdLCBbMTU5OTEzNTU3Mi4yMjMyNDc4LCAyOCwgMi4xNDI2MjIzNjExMzQyNzJlLTA1XSwgWzE1OTkxMzU1NzUuNDE4MTUzMywgMjgsIDIuMTQyNjIyMzYxMTM0MjcyZS0wNV0sIFsxNTk5MTM1NTkzLjUyMTMwOTYsIDI4LCAyLjE0MjYyMjM2MTEzNDI3MmUtMDVdLCBbMTU5OTEzNTYxNS4zODg1MTcxLCAyOCwgMi4xNDI2MjIzNjExMzQyNzJlLTA1XSwgWzE1OTkxMzU2MzAuMjg4MTk3LCAyOCwgMi4xNDI2MjIzNjExMzQyNzJlLTA1XSwgWzE1OTkxMzU2NDQuNzA4NDg4NywgMjgsIDIuMTQyNjIyMzYxMTM0MjcyZS0wNV0sIFsxNTk5MTM1NjQ3LjM4MTg0NzEsIDI4LCAyLjE0MjYyMjM2MTEzNDI3MmUtMDVdLCBbMTU5OTEzNTY1MC41OTEzOTA2LCAyOCwgMi4xNDI2MjIzNjExMzQyNzJlLTA1XSwgWzE1OTkxMzU2NjIuODA4MTU4MiwgMjgsIDIuMTQyNjIyMzYxMTM0MjcyZS0wNV0sIFsxNTk5MTM1Njc2LjEwODI3NzMsIDI4LCAyLjE0MjYyMjM2MTEzNDI3MmUtMDVdLCBbMTU5OTEzNTY4Mi40NzIzNDE4LCAyOCwgMi4xNDI2MjIzNjExMzQyNzJlLTA1XSwgWzE1OTkxMzU2ODMuMDA1NjE3LCAyOCwgMi4xNDI2MjIzNjExMzQyNzJlLTA1XSwgWzE1OTkxMzU2ODYuMTY4OTM4NiwgMjgsIDIuMTQyNjIyMzYxMTM0MjcyZS0wNV0sIFsxNTk5MTM1NzQ1LjAxNTIzMywgMjksIDEuODIyMTA5Njk3OTY4Njk5ZS0wNV0sIFsxNTk5MTM1NzU0LjA3ODk3NTcsIDI5LCAxLjgyMjEwOTY5Nzk2ODY5OWUtMDVdLCBbMTU5OTEzNTc2MC40NjYyNDI2LCAyOSwgMS44MjIxMDk2OTc5Njg2OTllLTA1XSwgWzE1OTkxMzU3NjMuNjQzNzE0MiwgMjksIDEuODIyMTA5Njk3OTY4Njk5ZS0wNV0sIFsxNTk5MTM1Nzc0LjMwODQ2OSwgMjksIDEuODIyMTA5Njk3OTY4Njk5ZS0wNV0sIFsxNTk5MTM1Nzc2LjQzMzAxODQsIDI5LCAxLjgyMjEwOTY5Nzk2ODY5OWUtMDVdLCBbMTU5OTEzNTc4OS4yNjE0MTkzLCAyOSwgMS44MjIxMDk2OTc5Njg2OTllLTA1XSwgWzE1OTkxMzU3OTAuMzI3MzkyMywgMjksIDEuODIyMTA5Njk3OTY4Njk5ZS0wNV0sIFsxNTk5MTM1Nzk1LjEwNTc1OTEsIDI5LCAxLjgyMjEwOTY5Nzk2ODY5OWUtMDVdLCBbMTU5OTEzNTgyMS43MjQ0Mzg3LCAyOSwgMS44MjIxMDk2OTc5Njg2OTllLTA1XSwgWzE1OTkxMzU4MzQuNTM3NzExLCAyOSwgMS44MjIxMDk2OTc5Njg2OTllLTA1XSwgWzE1OTkxMzU4NDYuNzY0OTQ3NCwgMjksIDEuODIyMTA5Njk3OTY4Njk5ZS0wNV0sIFsxNTk5MTM1ODY1LjQyODUxMzgsIDI5LCAxLjgyMjEwOTY5Nzk2ODY5OWUtMDVdLCBbMTU5OTEzNTg2NS45Njc5NTcsIDI5LCAxLjgyMjEwOTY5Nzk2ODY5OWUtMDVdLCBbMTU5OTEzNTg3OC43Njk5MjU2LCAyOSwgMS44MjIxMDk2OTc5Njg2OTllLTA1XSwgWzE1OTkxMzU4NzkuODQwMzUsIDI5LCAxLjgyMjEwOTY5Nzk2ODY5OWUtMDVdLCBbMTU5OTEzNTg4MC4zNzE4Njg4LCAyOSwgMS44MjIxMDk2OTc5Njg2OTllLTA1XSwgWzE1OTkxMzU4OTYuNDA3Nzk3LCAyOSwgMS44MjIxMDk2OTc5Njg2OTllLTA1XSwgWzE1OTkxMzU5MDkuNzc1MTExMiwgMjksIDEuODIyMTA5Njk3OTY4Njk5ZS0wNV0sIFsxNTk5MTM1OTEyLjQyMjk5NTgsIDI5LCAxLjgyMjEwOTY5Nzk2ODY5OWUtMDVdLCBbMTU5OTEzNTkyMC40MTYxOTIzLCAyOSwgMS44MjIxMDk2OTc5Njg2OTllLTA1XSwgWzE1OTkxMzU5MjMuNjEwOTg3NCwgMjksIDEuODIyMTA5Njk3OTY4Njk5ZS0wNV0sIFsxNTk5MTM1OTM5LjYxOTI3NzUsIDI5LCAxLjgyMjEwOTY5Nzk2ODY5OWUtMDVdLCBbMTU5OTEzNTk0MC4xNDU4MDU0LCAyOSwgMS44MjIxMDk2OTc5Njg2OTllLTA1XSwgWzE1OTkxMzU5NDQuNDEwMTE5OCwgMjksIDEuODIyMTA5Njk3OTY4Njk5ZS0wNV0sIFsxNTk5MTM1OTQ2LjUzNDAxNCwgMjksIDEuODIyMTA5Njk3OTY4Njk5ZS0wNV0sIFsxNTk5MTM1OTQ5LjczMTIzMDMsIDI5LCAxLjgyMjEwOTY5Nzk2ODY5OWUtMDVdLCBbMTU5OTEzNTk1OC4yNzMyMDYsIDI5LCAxLjgyMjEwOTY5Nzk2ODY5OWUtMDVdLCBbMTU5OTEzNTk4MS4xODQ2MTI4LCAyOSwgMS44MjIxMDk2OTc5Njg2OTllLTA1XSwgWzE1OTkxMzU5ODcuNTk4NDQxNCwgMjksIDEuODIyMTA5Njk3OTY4Njk5ZS0wNV0sIFsxNTk5MTM1OTkzLjQ5MDQwMjcsIDI5LCAxLjgyMjEwOTY5Nzk2ODY5OWUtMDVdLCBbMTU5OTEzNTk5OC44MDQzNDg1LCAyOSwgMS44MjIxMDk2OTc5Njg2OTllLTA1XSwgWzE1OTkxMzU5OTkuMzM4Mzg5LCAyOSwgMS44MjIxMDk2OTc5Njg2OTllLTA1XSwgWzE1OTkxMzYwMDEuNDQ4NDY5OSwgMjksIDEuODIyMTA5Njk3OTY4Njk5ZS0wNV0sIFsxNTk5MTM2MDAzLjU2NjEyNTksIDI5LCAxLjgyMjEwOTY5Nzk2ODY5OWUtMDVdLCBbMTU5OTEzNjA1OS4xODE0NzM1LCAzMCwgMS41MjI0MDkzNjU4NjE2NzY2ZS0wNV0sIFsxNTk5MTM2MDY4LjMzMTc3OCwgMzAsIDEuNTIyNDA5MzY1ODYxNjc2NmUtMDVdLCBbMTU5OTEzNjA3MS41MDE2OTk3LCAzMCwgMS41MjI0MDkzNjU4NjE2NzY2ZS0wNV0sIFsxNTk5MTM2MDczLjYzMzg3NDIsIDMwLCAxLjUyMjQwOTM2NTg2MTY3NjZlLTA1XSwgWzE1OTkxMzYwNzQuNjk5NzgxNCwgMzAsIDEuNTIyNDA5MzY1ODYxNjc2NmUtMDVdLCBbMTU5OTEzNjA4OC4wNDk0OTcxLCAzMCwgMS41MjI0MDkzNjU4NjE2NzY2ZS0wNV0sIFsxNTk5MTM2MDk4LjIwMDcyNCwgMzAsIDEuNTIyNDA5MzY1ODYxNjc2NmUtMDVdLCBbMTU5OTEzNjEwMS45NjAxNTM2LCAzMCwgMS41MjI0MDkzNjU4NjE2NzY2ZS0wNV0sIFsxNTk5MTM2MTAyLjQ4NzQzMywgMzAsIDEuNTIyNDA5MzY1ODYxNjc2NmUtMDVdLCBbMTU5OTEzNjExMS4wMjE0NDgsIDMwLCAxLjUyMjQwOTM2NTg2MTY3NjZlLTA1XSwgWzE1OTkxMzYxMTIuNjE5ODA1LCAzMCwgMS41MjI0MDkzNjU4NjE2NzY2ZS0wNV0sIFsxNTk5MTM2MTI5LjY5OTk0ODMsIDMwLCAxLjUyMjQwOTM2NTg2MTY3NjZlLTA1XSwgWzE1OTkxMzYxMzAuMjI4NDM2LCAzMCwgMS41MjI0MDkzNjU4NjE2NzY2ZS0wNV0sIFsxNTk5MTM2MTMwLjc2MDY5MDUsIDMwLCAxLjUyMjQwOTM2NTg2MTY3NjZlLTA1XSwgWzE1OTkxMzYxNDMuNTg3MjAyNSwgMzAsIDEuNTIyNDA5MzY1ODYxNjc2NmUtMDVdLCBbMTU5OTEzNjE1MS4wMjk2NzkzLCAzMCwgMS41MjI0MDkzNjU4NjE2NzY2ZS0wNV0sIFsxNTk5MTM2MTc4LjI2ODI1NDgsIDMwLCAxLjUyMjQwOTM2NTg2MTY3NjZlLTA1XSwgWzE1OTkxMzYxODQuNjUzODU2OCwgMzAsIDEuNTIyNDA5MzY1ODYxNjc2NmUtMDVdLCBbMTU5OTEzNjIxOC4yNzYyNTAxLCAzMCwgMS41MjI0MDkzNjU4NjE2NzY2ZS0wNV0sIFsxNTk5MTM2MjIzLjYyMDUyMiwgMzAsIDEuNTIyNDA5MzY1ODYxNjc2NmUtMDVdLCBbMTU5OTEzNjI0MC43NDAyNzQyLCAzMCwgMS41MjI0MDkzNjU4NjE2NzY2ZS0wNV0sIFsxNTk5MTM2MjQyLjg3MDkxMDYsIDMwLCAxLjUyMjQwOTM2NTg2MTY3NjZlLTA1XSwgWzE1OTkxMzYyNTMuNTI3MDk5LCAzMCwgMS41MjI0MDkzNjU4NjE2NzY2ZS0wNV0sIFsxNTk5MTM2MjY2LjM0ODQyMzIsIDMwLCAxLjUyMjQwOTM2NTg2MTY3NjZlLTA1XSwgWzE1OTkxMzYyNjcuNDE0NTAzMywgMzAsIDEuNTIyNDA5MzY1ODYxNjc2NmUtMDVdLCBbMTU5OTEzNjI3Ni40OTE2NzI1LCAzMCwgMS41MjI0MDkzNjU4NjE2NzY2ZS0wNV0sIFsxNTk5MTM2Mjk2LjIzNzg5MjksIDMwLCAxLjUyMjQwOTM2NTg2MTY3NjZlLTA1XSwgWzE1OTkxMzYzMDIuNjQzNTg4NSwgMzAsIDEuNTIyNDA5MzY1ODYxNjc2NmUtMDVdLCBbMTU5OTEzNjMxMi4yNTgxNjY2LCAzMCwgMS41MjI0MDkzNjU4NjE2NzY2ZS0wNV0sIFsxNTk5MTM2MzE0LjkyNTA2MjQsIDMwLCAxLjUyMjQwOTM2NTg2MTY3NjZlLTA1XSwgWzE1OTkxMzYzMTUuOTg5NTY2NiwgMzAsIDEuNTIyNDA5MzY1ODYxNjc2NmUtMDVdLCBbMTU5OTEzNjM3NC4yMjU2MzEsIDMxLCAxLjI0NTM2OTE4NTE5ODc5NjllLTA1XSwgWzE1OTkxMzYzODQuMDQ0NTkzLCAzMSwgMS4yNDUzNjkxODUxOTg3OTY5ZS0wNV0sIFsxNTk5MTM2MzkyLjU0ODM4MywgMzEsIDEuMjQ1MzY5MTg1MTk4Nzk2OWUtMDVdLCBbMTU5OTEzNjM5Ni4yOTEyMjU3LCAzMSwgMS4yNDUzNjkxODUxOTg3OTY5ZS0wNV0sIFsxNTk5MTM2NDA1LjM3MzgxMywgMzEsIDEuMjQ1MzY5MTg1MTk4Nzk2OWUtMDVdLCBbMTU5OTEzNjQwOC41ODQ2MDk1LCAzMSwgMS4yNDUzNjkxODUxOTg3OTY5ZS0wNV0sIFsxNTk5MTM2NDEyLjM2NDM2NDYsIDMxLCAxLjI0NTM2OTE4NTE5ODc5NjllLTA1XSwgWzE1OTkxMzY0MzcuNDgxOTk4NywgMzEsIDEuMjQ1MzY5MTg1MTk4Nzk2OWUtMDVdLCBbMTU5OTEzNjQ0MC4xNDQxNjc0LCAzMSwgMS4yNDUzNjkxODUxOTg3OTY5ZS0wNV0sIFsxNTk5MTM2NDQ4LjY4MzM2MDMsIDMxLCAxLjI0NTM2OTE4NTE5ODc5NjllLTA1XSwgWzE1OTkxMzY0NTEuODg2NTMzNywgMzEsIDEuMjQ1MzY5MTg1MTk4Nzk2OWUtMDVdLCBbMTU5OTEzNjQ1Ny4yMDc5OTY4LCAzMSwgMS4yNDUzNjkxODUxOTg3OTY5ZS0wNV0sIFsxNTk5MTM2NDYxLjQ4NzE4NTIsIDMxLCAxLjI0NTM2OTE4NTE5ODc5NjllLTA1XSwgWzE1OTkxMzY0NjYuNzkzMDEzNiwgMzEsIDEuMjQ1MzY5MTg1MTk4Nzk2OWUtMDVdLCBbMTU5OTEzNjQ3MC41MjQ3NjIyLCAzMSwgMS4yNDUzNjkxODUxOTg3OTY5ZS0wNV0sIFsxNTk5MTM2NDc1Ljg1ODA4NywgMzEsIDEuMjQ1MzY5MTg1MTk4Nzk2OWUtMDVdLCBbMTU5OTEzNjQ3Ni4zODk5MjgsIDMxLCAxLjI0NTM2OTE4NTE5ODc5NjllLTA1XSwgWzE1OTkxMzY0NzYuOTI4NTgsIDMxLCAxLjI0NTM2OTE4NTE5ODc5NjllLTA1XSwgWzE1OTkxMzY0ODMuODM3NTE1OCwgMzEsIDEuMjQ1MzY5MTg1MTk4Nzk2OWUtMDVdLCBbMTU5OTEzNjQ5My45NjQ5OTU0LCAzMSwgMS4yNDUzNjkxODUxOTg3OTY5ZS0wNV0sIFsxNTk5MTM2NTA0LjYzMTgyOTMsIDMxLCAxLjI0NTM2OTE4NTE5ODc5NjllLTA1XSwgWzE1OTkxMzY1MTAuNTExMjQxNCwgMzEsIDEuMjQ1MzY5MTg1MTk4Nzk2OWUtMDVdLCBbMTU5OTEzNjUzNS42MzUzMDcsIDMxLCAxLjI0NTM2OTE4NTE5ODc5NjllLTA1XSwgWzE1OTkxMzY1NDIuMDIwODQ2MSwgMzEsIDEuMjQ1MzY5MTg1MTk4Nzk2OWUtMDVdLCBbMTU5OTEzNjU0Ny44ODYwMjEsIDMxLCAxLjI0NTM2OTE4NTE5ODc5NjllLTA1XSwgWzE1OTkxMzY1NjQuOTQyNzU2MiwgMzEsIDEuMjQ1MzY5MTg1MTk4Nzk2OWUtMDVdLCBbMTU5OTEzNjU4Mi4wMzAxNTIsIDMxLCAxLjI0NTM2OTE4NTE5ODc5NjllLTA1XSwgWzE1OTkxMzY1OTguNjA3OTQ3LCAzMSwgMS4yNDUzNjkxODUxOTg3OTY5ZS0wNV0sIFsxNTk5MTM2NjE4LjM4NzkwOCwgMzEsIDEuMjQ1MzY5MTg1MTk4Nzk2OWUtMDVdLCBbMTU5OTEzNjYzMS4xNjkxNjg3LCAzMSwgMS4yNDUzNjkxODUxOTg3OTY5ZS0wNV0sIFsxNTk5MTM2NjM1LjkzOTY3LCAzMSwgMS4yNDUzNjkxODUxOTg3OTY5ZS0wNV0sIFsxNTk5MTM2NjkyLjQ0NTAxMzUsIDMyLCA5LjkyNjk3Mjc3OTc5NDU5NmUtMDZdLCBbMTU5OTEzNjcwMC40MjQyNDA4LCAzMiwgOS45MjY5NzI3Nzk3OTQ1OTZlLTA2XSwgWzE1OTkxMzY3MDkuNDcwNTYzNCwgMzIsIDkuOTI2OTcyNzc5Nzk0NTk2ZS0wNl0sIFsxNTk5MTM2NzE2LjkxNTkzNDMsIDMyLCA5LjkyNjk3Mjc3OTc5NDU5NmUtMDZdLCBbMTU5OTEzNjcxOC41MTMzODEsIDMyLCA5LjkyNjk3Mjc3OTc5NDU5NmUtMDZdLCBbMTU5OTEzNjcyOC42MzQ1NTcsIDMyLCA5LjkyNjk3Mjc3OTc5NDU5NmUtMDZdLCBbMTU5OTEzNjczOC43NzMwNTQxLCAzMiwgOS45MjY5NzI3Nzk3OTQ1OTZlLTA2XSwgWzE1OTkxMzY3NDMuMDIwODU3MywgMzIsIDkuOTI2OTcyNzc5Nzk0NTk2ZS0wNl0sIFsxNTk5MTM2NzgxLjQ1MTI5NDQsIDMyLCA5LjkyNjk3Mjc3OTc5NDU5NmUtMDZdLCBbMTU5OTEzNjc5OS4wMjMxMDY2LCAzMiwgOS45MjY5NzI3Nzk3OTQ1OTZlLTA2XSwgWzE1OTkxMzY4MDMuMzE0MDAyMywgMzIsIDkuOTI2OTcyNzc5Nzk0NTk2ZS0wNl0sIFsxNTk5MTM2ODA2LjU1NDY4OTYsIDMyLCA5LjkyNjk3Mjc3OTc5NDU5NmUtMDZdLCBbMTU5OTEzNjgxOS4zMTQyNzc0LCAzMiwgOS45MjY5NzI3Nzk3OTQ1OTZlLTA2XSwgWzE1OTkxMzY4MTkuODUwODMwOCwgMzIsIDkuOTI2OTcyNzc5Nzk0NTk2ZS0wNl0sIFsxNTk5MTM2ODIzLjYwNDg5MzIsIDMyLCA5LjkyNjk3Mjc3OTc5NDU5NmUtMDZdLCBbMTU5OTEzNjg0MC4xNzI3MDUsIDMyLCA5LjkyNjk3Mjc3OTc5NDU5NmUtMDZdLCBbMTU5OTEzNjg0My4zNjczMTksIDMyLCA5LjkyNjk3Mjc3OTc5NDU5NmUtMDZdLCBbMTU5OTEzNjg1NC41MjU0MDI1LCAzMiwgOS45MjY5NzI3Nzk3OTQ1OTZlLTA2XSwgWzE1OTkxMzY4NjAuOTUwNzE5LCAzMiwgOS45MjY5NzI3Nzk3OTQ1OTZlLTA2XSwgWzE1OTkxMzY4NjkuOTk4MjgyMiwgMzIsIDkuOTI2OTcyNzc5Nzk0NTk2ZS0wNl0sIFsxNTk5MTM2ODcyLjEzNDI2MjMsIDMyLCA5LjkyNjk3Mjc3OTc5NDU5NmUtMDZdLCBbMTU5OTEzNjkwMy42MDA2NjEzLCAzMiwgOS45MjY5NzI3Nzk3OTQ1OTZlLTA2XSwgWzE1OTkxMzY5MTAuNTMwNzgxNywgMzIsIDkuOTI2OTcyNzc5Nzk0NTk2ZS0wNl0sIFsxNTk5MTM2OTEyLjY2OTMxNTgsIDMyLCA5LjkyNjk3Mjc3OTc5NDU5NmUtMDZdXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 821 + }, + "outputId": "1ebb1c4f-dff0-4e04-fded-8e46e442486b" + }, + "source": [ + "%load_ext tensorboard\n", + "%tensorboard --logdir lightning_logs/" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "display_data", + "data": { + "application/javascript": [ + "\n", + " (async () => {\n", + " const url = await google.colab.kernel.proxyPort(6006, {\"cache\": true});\n", + " const iframe = document.createElement('iframe');\n", + " iframe.src = url;\n", + " iframe.setAttribute('width', '100%');\n", + " iframe.setAttribute('height', '800');\n", + " iframe.setAttribute('frameborder', 0);\n", + " document.body.appendChild(iframe);\n", + " })();\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HISLbBn0zqv7", + "colab_type": "text" + }, + "source": [ + "Run the code below to start the training:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "gixi7qMgxKsc", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 756, + "referenced_widgets": [ + "7309694760e44d389f1c954a5ac87655", + "5fa5c11c14824b4694eec57a16fb44b9", + "574a1c46522a4b4093d2e88c3831cc2f", + "ab5f79cb97ca48118b6d2f9eb296a324", + "fdde2f8d291f468a9701121f01bd00b3", + "2b07d65f8c6142ae9a9e285de81bb414", + "ab8d6bbb5fa44623ac031ac17e00b2a5", + "c1881c84292643d284491b84c4bfbdd3", + "d56c5304a76e49d5a428ee6b4c92849b", + "cba17c4ffe14460eaacf37b11982ca27", + "df674170016b4408b920725b4b5d852b", + "a455c7187d3842b690925d698702737c", + "37767d5433454a138ae6318a5e74f879", + "4d8eadb9c1214384a21bb9b2d7e8772f", + "9c8b169e688143468d146ae5631b9c18", + "a223049b09b240aa80377469ed85cae0", + "a00c42dc6ce54ec4804acf66b8d46ced", + "efff7e15a4af4cb38b16a941e108a824", + "4bcac84304c544458bd6c1ce5bcd0db4", + "1ceef8cc74bc4d38ab8408234ffa1d2d", + "89f08cbecf484b02808c9630d11f2617", + "887e947bf23543efbeac7a9e41f1118b", + "e548e5bcd7b14b419b60460dbacb00e7", + "b919379437414936a01a2f5b980615ef", + "e8d1e8f21d1f45029a0817eb42e39845", + "45e0f3c593664853b4b0121b0b54c767", + "9dae5f235813481986c9f7ffd72cd72a", + "3064b3ae5d3d4a80a652dc81246200ae", + "8711057d7832466987b974baa7a7f5bd", + "1596ef80eaf54211afe901c02da10a46", + "22e1943359d140e69061486cfe03a976", + "402b129faf594a3486aec2804953eaa0", + "4b82b861aa224799857d9f0c900efbe6", + "066d9455ecf042a08c3a4a569b8639b2", + "6f2d81b4cc294c87ae98a0727296364a", + "f3ffb4aeaf734bfd842b937eef703016", + "1662f6fbd176477f878a2a9c66b4b268", + "00b3c078646f4d7bbba62d2e3efddfe8", + "91ea6014e06c4371a9bc1d8cb01edc6d", + "fd9603f0f7c64cfd9c6358c12ad9b816", + "37e17e5a827448ee9dfa809cedd7c79a", + "b2a4a683242e43fb99580d1fde7054ce", + "8e35b7e4143d4804a1d37b5ee1c20947", + "80abe1c282ef4a939ad7bf7c118cce7d", + "5579c43e432b49778307ec5d7131985d", + "10b0e108d9394832870b397b1c2b9b16", + "330fd6caead747c1a1569644a249c239", + "e55d0a78374543c8b8003e7effc3a7a1", + "72b4f725a0224df98bb6bd991f334447", + "126737b514444921a5a866de491b6499", + "e3c85df1065a44b38b3fb933f5a85ca3", + "22d086f35b9c47879399b25767381a3b", + "17a613d8ca5841b3b0fe4786585c7f9a", + "280899ce11e5476eadda45047bb144ce", + "9ba421500a334a448c9b144fe5ebf763", + "b286321e54e64d6ba92c96d4e7e58512", + "87c8cc3e76054d94a68053e029fed4f7", + "34611d63210c48978902922d8bc93c73", + "247f2417040042898f2fe209c3d1d8d6", + "4344bc0c051645c0a8be7805ace9bcf1", + "eded55cea34b4687b401af997adbf29b", + "a0ff13de336e42a8ae17d2926883e837", + "5cc9ba755cf54797953f790d0493fe57", + "d073ae885e474ece9ded2d059cd2077d", + "69b76e58fead441f97592d187c999c14", + "f477fed0947f473fb131d7a143f4547c", + "80d910d1426a46aa8a1b435d0ad688b8", + "b8ac8d3917064a18a6e9604d461a7808", + "a7b9350ff08a4e7eb08e76f9166ffaea", + "9431dcad770a4e6b8b1dd56d8a0d7f81", + "d4edb8f296204759aa27310387ebef9f", + "4fa8be417491436a91948b9dac976edb", + "a14e487e449340d3aa52ac1e9b21f9f7", + "80b89ea7d3d14741a12ce85d02b2c5d7", + "1cde68eb6c0348cfae7def1bda5ded3b", + "95b2d5c74e104963847c192bc4c8c9f5", + "ff38b7357e5d4af4ac536a61e9a264b8", + "f531e64ae0c74d2fa971336bd35db767", + "a0b5e21cb0ab4660abfcdeeb2ba67e63", + "29fa621ad1e7401b9fb4193c20ed05b0", + "9d54c42108614290b074eec07ed303b3", + "ba3deef65b3d40f9bc16c653fd81ccba", + "7e724292b77945c8a7296e36f2591dcc", + "6cb686afe4014d42897877c6e420a656", + "d8fd9c3b703e49948f076a3222a49561", + "760f6319b1794384846fe7280723b03e", + "d4f79426700a456a8ffb1512f65dc903", + "121f4d9f367a4d20a9fb5678d235740a", + "4699e9378f8e42ef86889404108b028b", + "74536b3bb9424a2bb8d0158b5f68d8ec", + "f32fd684c9c244d1b9620c32589ff23f", + "65f99126ccae4562ac5ece1cebdf3d1d", + "a2b568efadbb46258f746d10d735b322", + "67438e6e9ff54e58a7e10d4b4e50fd6c", + "779df4a6e9144b298e67af31aa8e8b79", + "f8f52e69d04b43d4bd6ae1334ff2a098", + "bf7df41baa014e84a91bb1f6247a33a9", + "e893c307ec5449d1b294fe75bb2f33dd", + "a12d94dd2b73406a838a1d8e28f88e7b", + "71369ad6685248d8af82cb2f4a2e9775", + "ad421bd6544d4219aaf3fbe4834897f7", + "bea668dc900942e2aca20a1ca79ae78b", + "c98815794329489dbb71a38cc1f68efe", + "f65566ae7182461b944bddf31ae29deb", + "f52ca000017e42e6a2373d25a3ebf1fb", + "e3d7dc32e86d4ff79c99e4d217e1b168", + "e9769a637e1a4537a9fbec0a0a3448d7", + "b1ff952e3af84e7787497d0c1623ccb8", + "10f5ef3e9369428897d81af6a835e23d", + "8ecdd48377834aeb98bf35f1d817810c", + "10a8c613bfdd457fb343cf57b5551cb6", + "a057f933d57e42fe9558b07ae93cd250", + "5107bc0b61c54b0e9a8dc0008c9693da", + "5b9f76d0ce68428bbc7bf5381818d4e6", + "76d86ce32ef648b49d13e304345401a7", + "3e8f80ed649445cab0b3719c8d6b3ada", + "6c6e3b3aaf894dec9f795594d5871f1b", + "e0d9feaee28e461a8ecf5cc62e58836d", + "82a2c3090c914e8b979e6214dba22607", + "93de15083ab94a20958f1a7146420d2f", + "38d72545f29b4cdcafce2a181cc3832f", + "9034be24725843acac9faa27bb6f444b", + "03b33f02ccfd4d73a9ac342165bd704a", + "1eb3e9125d50401ea2bf575f760a0387", + "c992add9eefd41ca9401d99cf7c46da4", + "e2b65978de654b31b8c9dcacca7faf58", + "c1dcf2d1d3704012921a37342e8b7df0", + "acc8b4609dfc46489f4f67939e013065", + "eeac5e28e731499faaa353d6fa3ad894", + "ed714984ed6844f8a5805476a3bd3a7c", + "0695e07278744e78a816227976e84b4b", + "e4160a3297c14d489e714dfc0b714185", + "42f5f038d00b4f44992cd93f28567960", + "4cda9c4c313446498684b2dd99b7707e", + "15523047c2dd4ac5a008226eb4b23bb0", + "46c4d0ce0a0e47068308c7e37f85bc0c", + "e6d52fced02e469e998e01d5245544b6", + "5fbb77510fb245429ac6735ae51e7bfa", + "600e76abd8d5411088f3e9c4173d351b", + "88ea03ac8483435692855d48ed4f6b52", + "802e2caf48c64e1b9ea127214a57e0a3", + "793eb4c5ed4343f4b1ce7d29df15572e", + "276bc6c9841644bc914e733245b34ec3", + "9ef30da0690b412d9c3ac29a9edd8965", + "1e21595335554508bd30c734fc33b7f6", + "472276c706b74efeabe01f3ee192da0a", + "97b0a7cfd6ff4f07a6aaf5b211099a5a", + "cda74ae81fc14bd196754a8d5a39bf98", + "b0bb816f9d4f48429060d97955389d8f", + "5b4c61f4892040f0b8e317eefc18ea78", + "f010b2acf00149518f6ea5e4a62e7061", + "7002bbc80fbd46f5838975b6f23e8b70", + "400fef02ba84494c8d6c49dd98645649", + "d3ec24f9193e4226b83fe4279cde82bd", + "62dc2beca1f14783aaeca7583fce4d46", + "3c6c617bd6014f1aa5e7eeee138fb925", + "60e6ec9c5411453aa67de9c793c5aac0", + "375843f975f4444e89fcd567eeadcc5c", + "d96946d0cd3e407bb5ec98139a87f780", + "c7cb2a50ed3b4d0cbc6b7fcc4f7ff58a", + "7ce455ccdab94cba8860372d03f0a92c", + "8ea1e817cf0e424ca0c922f0f0de64f5", + "295d87c50de3439b9036c1cc3f1527cd", + "7c212c73669c4493bd9f0d9b581d8617", + "d0721e5d7f284f778013d41961e9a361", + "c54823ec43844bbfbe6eddda52cdca6b", + "928a129b59864827a32244f4ad1ddb6f", + "c29fc55722504119a210fe6766ccb822", + "8c0291db4e314219bef1272f59586487", + "6d19beefef404a278dafddaaef8eb885", + "1ebf8b4328774d718c0d79b2d417a8b6", + "311f3859f7c9410eabcaf15db0f25f0b", + "f732d3c35291427382abe38a2f90cfc6", + "e6e18ceca0834115b6647063bd60c765", + "3eea0cb3cdaf4255af46ea4a114135e6", + "a0beea6197254054a179e4a5d163645a", + "34a1891498e546ee8593cc26ee8500e6", + "4336336b6ebf4937ae12c24e6a755825", + "cfbbbb3f330b4d739e55965e5d7934aa", + "7b607a78fd96498ca890e46afe30d0f7", + "c10f450cd788464e9609920360b1dac9", + "9b6f156b8f864ad082b946ec079dfc67", + "f43ef9b8ad934936bb0c715894d9291d", + "42381e207ea64806b0b8453c59362db6", + "3c50f8ca386d483eac3c5804bb6e4a24", + "2b20a2ed4c434359b05bda829363e387", + "358f3301c91d45218ea5f2de82095f1f", + "90236d4e68134c0c9f2eb0dcbe473769", + "e6d01e97b3fc4a2397b29052756541dd", + "a09cc860ec164e35802bf532531908ef", + "783bc8133edb4af9849e391e50952f6d", + "a62b5d399da14a63bb39fa8ecc3b2679", + "91c43686b5ff4eeebb3c9eaff2ea5a0d", + "3a1a9213ebdb48b48153882cfadeee52", + "a80637916179482e8464990cb027a2b2", + "304076b88a6742299d236b9f13857bac", + "a190996a318644ac833d99f3ca4777b5", + "2745b38d6ec245308ed7bbfeeedcaf53", + "7b1cd36a28e249a8b236b4fc329a26f1", + "7a46f0eab8cf401f9c5e0059e0ad3876", + "9ad1d638c2ae4c8399b0f6b56936668c", + "1b6b16e926a74796add83caec51dad82", + "89a860a124084fd2bdbd05a82a170519", + "aa7d0b5deb004a7697f45466bdc20dbf", + "2803b878fcbe4ef5bedadb5dc6ecabe8", + "56038641a5404d679dc935a7ef38720e", + "de92895dfa064c5699de3210cf56ba71", + "0074031873dc48c9ba71b2eefb47ab13", + "f00fc81692684f739ac13939ab8fd598", + "8441763d00614ae2b2943a53f9b4e9c1", + "79466a60b4cd4fc299b4faf9ba20a420", + "089b6207f67a4971b0c87bb956460290", + "fc323a3a3a7948629c89fb7ebf5f822e", + "4be275d6d6044a24b894f6f31b0cd559", + "28e97c0e0191430b97c228d3de943c4a", + "0b7b54653a384681918c4ba33d17ee92", + "26f15abbd984451a977c04aee589f929", + "d4e5db8120584033974018b63ff0aed2", + "d263e53ef70541e9ac2a26c350c9e67f", + "198a2cee0d3c43b5ba1d2e209166bfee", + "941e033e2da6484e80b2406283db680a", + "ecf94a2ab1584067939d1bfa37d87d70", + "fb069bf77dd3435daa51b759337152af", + "f1c551e96b9b4cb989557a207fe1c68e", + "3751907cc0ce410fa644ac9386dbfe56", + "bc2615d7b792446c830a180d5ea04de9", + "bfd8b031899b4153986d108fbd502083", + "ff8e1631ad12406f9b33d3633b25d8ec", + "180a70b8888b416da705ff6b8eff447c", + "d65567a09eec4bb4a2ce4887164e4a99", + "b9e809eb192a4f1981fb011b8a50f8eb", + "11a5fbe3907841fd91310afb048977f9", + "4efde29749d84c778e48b9c4d8b49ac0", + "b78a22b8a51f4511a549b2c1f4c1ffde", + "b6e01e8b7432431e8a142a88d37c5055", + "2c3337a6d9e24596a8088a2c3e7f6d8a", + "2fb2937480e34c4ea00abc0abe10f9cf", + "3333b071f0d44e49963ab90a08976759", + "5e6b64f6f7ce496dbf45bac8d16f116e", + "77aa5222a45d42709c115af77bfe3832", + "14fb7b380abe4efc8d6b6233ec932a28", + "f5e42d2beaf146bc915ab0c0a0740668", + "0de5c7e23dca4241b12993db1c14891c", + "21ce0e9d00d0405ca1ac16dc44054da0", + "501b0c5f2c7c48a1bf50962d02561056", + "49a637fd6f8644f98f18c8724d7d403e", + "4850e6b355364c68a3f72f8f9011c458", + "7710d025a5764798a383eb6084ad1634", + "22b0c39593834b7f8fa33322fbc38237", + "03b1a599e2834f7e88a83b9deb4e5cfa", + "3b16479fc7a5433fa287ab9d01668e0b", + "181d194cc489465cb137d72908cd1133", + "62ef0b077bc04e6382155ca0095859d2", + "1b0b3dc73e434262b1f6d7f60f5bafd1", + "cf1af66b024d4e9db3cc3e968698979f", + "89fc0ae065b045b8942dec045f2e58b4", + "1bffbb9459414f24aa6f0c46cd99d987", + "55751bbae38949e39d9b441f06d1cff5", + "9d063fbce6c94842954ed94d75983bf5", + "3a899a80c4ce46bdbc83bdfe03c63505", + "bab389e096904462a8ae70485b290636", + "a1320f59c5a64a5fadc464c6883c2eba", + "9820a93f6f024c518256abb7b6707c07", + "7c0dcc29e90d49759169baf2628a4568", + "8ab63c57832e4490aa796da338ff696e", + "49ced01dff814e26bd879e6db458e5e9", + "ab431859c91f4b588694206419a23735", + "a815feffe1474fc08cb661dcafdac13a", + "64a5a67e2a8941c48034495b72a4153b", + "383721cbd75c4934b4a1e19b016fad4f", + "971ea09ced1846b7a42e9e065349a276", + "cfe721e3396e48d78da89178e73d2c7b", + "df66145c19c34c569f38818a36a62780", + "c578d2caf5504e95b9e1435fd4103060", + "342e0a3c2f2844a7b2d26ddad0ce3438", + "02350f0dde6a4b4b9c962e4e77a9a97b", + "5c535cb28d424e40b791cfe7c8b6327a", + "8a5d1ed71b8d42cc8160b84aa57b86c4", + "55a2c7621d494c15aa145f2479f29545", + "818f4e2b00be4e32a33786a7b02144e1" + ] + }, + "outputId": "0ed1519a-4705-4e19-84a7-68b4c943c38a" + }, + "source": [ + "from pytorch_lightning import (\n", + " Trainer,\n", + " seed_everything,\n", + ")\n", + "from pytorch_lightning.callbacks import ModelCheckpoint\n", + "from torchvision.models import resnet18, resnet50\n", + "\n", + "seed_everything(42)\n", + "\n", + "config = Config()\n", + "\n", + "checkpoint_callback = ModelCheckpoint(monitor=\"avg_val_acc\", mode=\"max\")\n", + "trainer = Trainer(\n", + " gpus=1,\n", + " amp_level=config.amp_level,\n", + " amp_backend='apex',\n", + " precision=16 if config.amp_level != 'O0' else 32,\n", + " deterministic=True,\n", + " benchmark=False,\n", + " checkpoint_callback=checkpoint_callback,\n", + " max_epochs=config.max_epochs\n", + ")\n", + "\n", + "# create model\n", + "model = resnet18(pretrained=True)\n", + "if config.use_knowledge_distillation:\n", + " teacher_model = resnet50(pretrained=False)\n", + " model = LitFood101KD(model, teacher_model, config)\n", + "else:\n", + " model = LitFood101(model, config)\n", + "\n", + "trainer.fit(model)\n", + "\n" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "GPU available: True, used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "CUDA_VISIBLE_DEVICES: [0]\n", + "Using APEX 16bit precision.\n", + "Downloading: \"https://download.pytorch.org/models/resnet18-5c106cde.pth\" to /root/.cache/torch/hub/checkpoints/resnet18-5c106cde.pth\n" + ], + "name": "stderr" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7309694760e44d389f1c954a5ac87655", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=46827520.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/pytorch_lightning/utilities/distributed.py:37: UserWarning: Could not log computational graph since the `model.example_input_array` attribute is not set or `input_array` was not given\n", + " warnings.warn(*args, **kwargs)\n", + "\n", + " | Name | Type | Params\n", + "----------------------------------------------------\n", + "0 | model | ResNet | 11 M \n", + "1 | metric | Accuracy | 0 \n", + "2 | teacher | ResNet | 23 M \n", + "3 | criterion | MixUpAugmentationLoss | 0 \n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "Selected optimization level O1: Insert automatic casts around Pytorch functions and Tensor methods.\n", + "\n", + "Defaults for this optimization level are:\n", + "enabled : True\n", + "opt_level : O1\n", + "cast_model_type : None\n", + "patch_torch_functions : True\n", + "keep_batchnorm_fp32 : None\n", + "master_weights : None\n", + "loss_scale : dynamic\n", + "Processing user overrides (additional kwargs that are not None)...\n", + "After processing overrides, optimization options are:\n", + "enabled : True\n", + "opt_level : O1\n", + "cast_model_type : None\n", + "patch_torch_functions : True\n", + "keep_batchnorm_fp32 : None\n", + "master_weights : None\n", + "loss_scale : dynamic\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d56c5304a76e49d5a428ee6b4c92849b", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validation sanity check', layout=Layout…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "\r" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a00c42dc6ce54ec4804acf66b8d46ced", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Training', layout=Layout(flex='2'), max…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e8d1e8f21d1f45029a0817eb42e39845", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4b82b861aa224799857d9f0c900efbe6", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "37e17e5a827448ee9dfa809cedd7c79a", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "72b4f725a0224df98bb6bd991f334447", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Gradient overflow. Skipping step, loss scaler 0 reducing loss scale to 65536.0\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "87c8cc3e76054d94a68053e029fed4f7", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "69b76e58fead441f97592d187c999c14", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a14e487e449340d3aa52ac1e9b21f9f7", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9d54c42108614290b074eec07ed303b3", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4699e9378f8e42ef86889404108b028b", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bf7df41baa014e84a91bb1f6247a33a9", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Gradient overflow. Skipping step, loss scaler 0 reducing loss scale to 65536.0\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f52ca000017e42e6a2373d25a3ebf1fb", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5107bc0b61c54b0e9a8dc0008c9693da", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "38d72545f29b4cdcafce2a181cc3832f", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "eeac5e28e731499faaa353d6fa3ad894", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e6d52fced02e469e998e01d5245544b6", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1e21595335554508bd30c734fc33b7f6", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "400fef02ba84494c8d6c49dd98645649", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7ce455ccdab94cba8860372d03f0a92c", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8c0291db4e314219bef1272f59586487", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "34a1891498e546ee8593cc26ee8500e6", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3c50f8ca386d483eac3c5804bb6e4a24", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Gradient overflow. Skipping step, loss scaler 0 reducing loss scale to 131072.0\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "91c43686b5ff4eeebb3c9eaff2ea5a0d", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9ad1d638c2ae4c8399b0f6b56936668c", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f00fc81692684f739ac13939ab8fd598", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "26f15abbd984451a977c04aee589f929", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3751907cc0ce410fa644ac9386dbfe56", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Gradient overflow. Skipping step, loss scaler 0 reducing loss scale to 131072.0\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4efde29749d84c778e48b9c4d8b49ac0", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "14fb7b380abe4efc8d6b6233ec932a28", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "22b0c39593834b7f8fa33322fbc38237", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1bffbb9459414f24aa6f0c46cd99d987", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8ab63c57832e4490aa796da338ff696e", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "df66145c19c34c569f38818a36a62780", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qqyNqivS8lLY", + "colab_type": "text" + }, + "source": [ + "## Testing\n", + "Run the cell below to test a model that has been trained." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "i2hSNCR7AeDS", + "colab_type": "code", + "colab": {} + }, + "source": [ + "trainer.test()" + ], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Bag-Of-Tricks-For-Image-Classification/main.py b/Bag-Of-Tricks-For-Image-Classification/main.py new file mode 100644 index 000000000..a88c8c58a --- /dev/null +++ b/Bag-Of-Tricks-For-Image-Classification/main.py @@ -0,0 +1,56 @@ +import torch +from pytorch_lightning import ( + Trainer, + seed_everything, +) +from pytorch_lightning.callbacks import ModelCheckpoint +from torchvision.models import ( + resnet18, + resnet50, +) + +from model.model import ( + LitFood101, + LitFood101KD, +) +from utils.args import get_program_level_args + + +def main(): + parser = get_program_level_args() + parser = LitFood101.add_model_specific_args(parser) + parser = Trainer.add_argparse_args(parser) + + args = parser.parse_args() + seed_everything(args.seed) + + checkpoint_callback = ModelCheckpoint(monitor="avg_val_acc", mode="max") + trainer = Trainer.from_argparse_args( + args, + deterministic=True, + benchmark=False, + checkpoint_callback=checkpoint_callback, + precision=16 if args.amp_level != "O0" else 32, + ) + + # create model + model = resnet18(pretrained=True) + if args.use_knowledge_distillation: + teacher_model = resnet50(pretrained=False) + model = LitFood101KD(model, teacher_model, args) + else: + model = LitFood101(model, args) + + if args.evaluate: + checkpoint = torch.load(args.checkpoint) + model.load_state_dict(checkpoint["state_dict"]) + trainer.test(model, test_dataloaders=model.test_dataloader()) + return 0 + + trainer.fit(model) + + trainer.test() + + +if __name__ == "__main__": + main() diff --git a/Bag-Of-Tricks-For-Image-Classification/model/augmentations.py b/Bag-Of-Tricks-For-Image-Classification/model/augmentations.py new file mode 100644 index 000000000..2b36d5922 --- /dev/null +++ b/Bag-Of-Tricks-For-Image-Classification/model/augmentations.py @@ -0,0 +1,33 @@ +import albumentations as A +import numpy as np +from albumentations.pytorch import ToTensorV2 + + +def get_training_augmentation(): + augmentations_train = A.Compose( + [ + A.RandomResizedCrop(224, 224, scale=(0.8, 1.0)), + A.HorizontalFlip(), + A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), + ToTensorV2(), + ], + ) + return lambda img: augmentations_train(image=np.array(img)) + + +def get_test_augmentation(): + augmentations_val = A.Compose( + [ + A.SmallestMaxSize(256), + A.CenterCrop(224, 224), + A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), + ToTensorV2(), + ], + ) + return lambda img: augmentations_val(image=np.array(img)) + + +def unnormalize(tensor): + for channel, mean, std in zip(tensor, (0.485, 0.456, 0.406), (0.229, 0.224, 0.225)): + channel.mul_(std).add_(mean) + return tensor diff --git a/Bag-Of-Tricks-For-Image-Classification/model/losses.py b/Bag-Of-Tricks-For-Image-Classification/model/losses.py new file mode 100644 index 000000000..1289e300d --- /dev/null +++ b/Bag-Of-Tricks-For-Image-Classification/model/losses.py @@ -0,0 +1,62 @@ +# MIT License +# Copyright (c) 2018 Haitong Li + + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +# Based on https://github.com/peterliht/knowledge-distillation-pytorch/blob/master/model/net.py +class KnowledgeDistillationLoss(nn.Module): + def __init__(self, alpha, T, criterion): + super().__init__() + self.criterion = criterion + self.KLDivLoss = nn.KLDivLoss(reduction="batchmean") + self.alpha = alpha + self.T = T + + def forward(self, input, target, teacher_target): + loss = self.KLDivLoss( + F.log_softmax(input / self.T, dim=1), + F.softmax(teacher_target / self.T, dim=1), + ) * (self.alpha * self.T * self.T) + self.criterion(input, target) * ( + 1.0 - self.alpha + ) + return loss + + +class MixUpAugmentationLoss(nn.Module): + def __init__(self, criterion): + super().__init__() + self.criterion = criterion + + def forward(self, input, target, *args): + # Validation step + if isinstance(target, torch.Tensor): + return self.criterion(input, target, *args) + target_a, target_b, lmbd = target + return lmbd * self.criterion(input, target_a, *args) + ( + 1 - lmbd + ) * self.criterion(input, target_b, *args) + + +# Based on https://github.com/pytorch/pytorch/issues/7455 +class LabelSmoothingLoss(nn.Module): + def __init__(self, n_classes, smoothing=0.0, dim=-1): + super(LabelSmoothingLoss, self).__init__() + self.confidence = 1.0 - smoothing + self.smoothing = smoothing + self.cls = n_classes + self.dim = dim + + def forward(self, output, target, *args): + output = output.log_softmax(dim=self.dim) + with torch.no_grad(): + # Create matrix with shapes batch_size x n_classes + true_dist = torch.zeros_like(output) + # Initialize all elements with epsilon / N - 1 + true_dist.fill_(self.smoothing / (self.cls - 1)) + # Fill correct class for each sample in the batch with 1 - epsilon + true_dist.scatter_(1, target.data.unsqueeze(1), self.confidence) + return torch.mean(torch.sum(-true_dist * output, dim=self.dim)) diff --git a/Bag-Of-Tricks-For-Image-Classification/model/model.py b/Bag-Of-Tricks-For-Image-Classification/model/model.py new file mode 100644 index 000000000..3358fafd8 --- /dev/null +++ b/Bag-Of-Tricks-For-Image-Classification/model/model.py @@ -0,0 +1,274 @@ +import os +import warnings +from argparse import ( + ArgumentParser, + Namespace, +) + +import numpy as np +import pytorch_lightning as pl +import torch +from torch import nn +from torch.utils.data import DataLoader +from torchvision.datasets import ImageFolder + +from .augmentations import ( + get_test_augmentation, + get_training_augmentation, +) +from .losses import ( + KnowledgeDistillationLoss, + LabelSmoothingLoss, + MixUpAugmentationLoss, +) + + +class LitFood101(pl.LightningModule): + def __init__(self, model, args: Namespace): + super().__init__() + self.model = model + self.args = args + # We need to specify a number of classes there to avoid the RuntimeError + # See https://github.com/PyTorchLightning/pytorch-lightning/issues/3006 + # However, we will get another warning and it should be handled in forward steps + self.metric = pl.metrics.Accuracy(num_classes=self.args.num_classes) + dim_feats = self.model.fc.in_features # =2048 + nb_classes = self.args.num_classes + self.model.fc = nn.Linear(dim_feats, nb_classes) + + def forward(self, x): + return self.model(x) + + def setup(self, stage): + if self.args.use_smoothing: + self.criterion = LabelSmoothingLoss( + self.args.num_classes, self.args.smoothing, + ) + else: + self.criterion = nn.CrossEntropyLoss() + + if self.args.use_mixup: + self.criterion = MixUpAugmentationLoss(self.criterion) + + def on_epoch_start(self): + self.previous_batch = [None, None] + + def training_step(self, batch, *args): + x, y = batch[0]["image"], batch[1] + if self.args.use_mixup: + mixup_x, *mixup_y = self.mixup_batch(x, y, *self.previous_batch) + logits = self(mixup_x) + loss = self.criterion(logits, mixup_y) + else: + logits = self(x) + loss = self.criterion(logits, y) + # We ignore a warning about a mismatch between a number of predicted classes + # and a number of initialized for Accuracy class + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + accuracy = self.metric(logits.argmax(dim=-1), y) + tensorboard_logs = {"train_loss": loss, "train_acc": accuracy} + self.previous_batch = [x, y] + + return {"loss": loss, "progress_bar": tensorboard_logs, "log": tensorboard_logs} + + def validation_step(self, batch, *args): + x, y = batch[0]["image"], batch[1] + logits = self(x) + val_loss = self.criterion(logits, y) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + val_accuracy = self.metric(logits.argmax(dim=-1), y) + return {"val_loss": val_loss, "val_acc": val_accuracy} + + def test_step(self, batch, *args): + x, y = batch[0]["image"], batch[1] + logits = self(x) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + test_accuracy = self.metric(logits.argmax(dim=-1), y) + return {"test_acc": test_accuracy} + + def validation_epoch_end(self, outputs): + avg_loss = torch.stack([x["val_loss"] for x in outputs]).mean() + avg_accuracy = torch.stack([x["val_acc"] for x in outputs]).mean() + tensorboard_logs = {"val_loss": avg_loss, "val_acc": avg_accuracy} + return { + "avg_val_loss": avg_loss, + "avg_val_acc": avg_accuracy, + "log": tensorboard_logs, + } + + def test_epoch_end(self, outputs): + avg_accuracy = torch.stack([x["test_acc"] for x in outputs]).mean() + return {"avg_test_acc": avg_accuracy.item()} + + def configure_optimizers(self): + optimizer = torch.optim.Adam(self.model.parameters(), lr=self.args.lr) + if self.args.use_cosine_scheduler: + scheduler = torch.optim.lr_scheduler.CosineAnnealingLR( + optimizer, T_max=self.args.max_epochs, eta_min=0.0, + ) + else: + scheduler = torch.optim.lr_scheduler.MultiStepLR( + optimizer, milestones=self.args.milestones, + ) + return [optimizer], [scheduler] + + def train_dataloader(self): + train_dataset = ImageFolder( + os.path.join(self.args.data_root, "train"), + transform=get_training_augmentation(), + ) + + return DataLoader( + train_dataset, + batch_size=self.args.batch_size, + shuffle=True, + num_workers=self.args.workers, + pin_memory=True, + ) + + def val_dataloader(self): + val_dataset = ImageFolder( + os.path.join(self.args.data_root, "test"), + transform=get_test_augmentation(), + ) + return DataLoader( + val_dataset, + batch_size=32, + shuffle=False, + num_workers=self.args.workers, + pin_memory=True, + ) + + def test_dataloader(self): + return self.val_dataloader() + + def optimizer_step(self, epoch, batch_idx, optimizer, *args, **kwargs): + # Learning Rate warm-up + if self.args.warmup != -1 and epoch < self.args.warmup: + lr = self.args.lr * (epoch + 1) / self.args.warmup + for pg in optimizer.param_groups: + pg["lr"] = lr + + self.logger.log_metrics({"lr": optimizer.param_groups[0]["lr"]}, step=epoch) + optimizer.step() + optimizer.zero_grad() + + def mixup_batch(self, x, y, x_previous, y_previous): + lmbd = ( + np.random.beta(self.args.mixup_alpha, self.args.mixup_alpha) + if self.args.mixup_alpha > 0 + else 1 + ) + if x_previous is None: + x_previous = torch.empty_like(x).copy_(x) + y_previous = torch.empty_like(y).copy_(y) + batch_size = x.size(0) + index = torch.randperm(batch_size) + # If current batch size != previous batch size, we take only a part of the previous batch + x_previous = x_previous[:batch_size, ...] + y_previous = y_previous[:batch_size, ...] + x_mixed = lmbd * x + (1 - lmbd) * x_previous[index, ...] + y_a, y_b = y, y_previous[index] + return x_mixed, y_a, y_b, lmbd + + @staticmethod + def add_model_specific_args(parent_parser): + parser = ArgumentParser(parents=[parent_parser], add_help=False) + parser.add_argument( + "--data-root", + default="./data", + type=str, + help="Path to root folder of the dataset (should include train and test folders)", + ) + parser.add_argument( + "-n", "--num-classes", type=int, help="Number of classes", default=21, + ) + parser.add_argument( + "-b", + "--batch-size", + default=32, + type=int, + metavar="N", + help="Mini-batch size", + ) + parser.add_argument( + "--lr", + "--learning-rate", + default=1e-4, + type=float, + metavar="LR", + help="Initial learning rate", + ) + parser.add_argument( + "--milestones", + type=int, + nargs="+", + default=[15, 30], + help="Milestones for dropping the learning rate", + ) + + parser.add_argument( + "--warmup", + type=int, + default=6, + help="Number of epochs to warm up the learning rate. -1 to turn off", + ) + return parser + + +class LitFood101KD(LitFood101): + def __init__(self, model, teacher, args): + super().__init__(model, args) + self.teacher = teacher + dim_feats = self.teacher.fc.in_features # =2048 + nb_classes = self.args.num_classes + self.teacher.fc = nn.Linear(dim_feats, nb_classes) + teacher_checkpoint = torch.load("./teacher.ckpt") + self.teacher.load_state_dict(teacher_checkpoint["state_dict"]) + + def setup(self, stage): + criterion = ( + LabelSmoothingLoss(self.args.num_classes, self.args.smoothing) + if self.args.use_smoothing + else nn.CrossEntropyLoss() + ) + self.criterion = KnowledgeDistillationLoss( + self.args.distill_alpha, self.args.distill_temperature, criterion=criterion, + ) + if self.args.use_mixup: + self.criterion = MixUpAugmentationLoss(self.criterion) + self.teacher.eval() + + def training_step(self, batch, *args): + x, y = batch[0]["image"], batch[1] + with torch.no_grad(): + teacher_output = self.teacher(x) + + if self.args.use_mixup: + mixup_x, *mixup_y = self.mixup_batch(x, y, *self.previous_batch) + logits = self(mixup_x) + loss = self.criterion(logits, mixup_y, teacher_output) + else: + logits = self(x) + loss = self.criterion(logits, y, teacher_output) + + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + accuracy = self.metric(logits.argmax(dim=-1), y) + tensorboard_logs = {"train_loss": loss, "train_acc": accuracy} + + return {"loss": loss, "progress_bar": tensorboard_logs, "log": tensorboard_logs} + + def validation_step(self, batch, *args): + x, y = batch[0]["image"], batch[1] + logits = self(x) + with torch.no_grad(): + teacher_output = self.teacher(x) + val_loss = self.criterion(logits, y, teacher_output) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + val_accuracy = self.metric(logits.argmax(dim=-1), y) + return {"val_loss": val_loss, "val_acc": val_accuracy} diff --git a/Bag-Of-Tricks-For-Image-Classification/requirements.txt b/Bag-Of-Tricks-For-Image-Classification/requirements.txt new file mode 100644 index 000000000..19b864d13 --- /dev/null +++ b/Bag-Of-Tricks-For-Image-Classification/requirements.txt @@ -0,0 +1,8 @@ +albumentations==0.4.6 +numpy==1.19.1 +opencv-python==4.3.0.36 +Pillow==6.2.0 +pytorch-lightning==0.9.0 +tensorboard==2.2.0 +torchvision==0.6.1 +tqdm==4.48.1 diff --git a/Bag-Of-Tricks-For-Image-Classification/split_food-101.py b/Bag-Of-Tricks-For-Image-Classification/split_food-101.py new file mode 100644 index 000000000..29f6a3de8 --- /dev/null +++ b/Bag-Of-Tricks-For-Image-Classification/split_food-101.py @@ -0,0 +1,70 @@ +import argparse +import os +import os.path as osp +from shutil import copyfile + +from tqdm import tqdm + + +def main(): + parser = argparse.ArgumentParser( + description="Separate Food-101 into train/test folders", + ) + parser.add_argument( + "--data-root", + default="./data", + type=str, + help="Path to root folder of the dataset", + ) + args = parser.parse_args() + classes = [ + "apple_pie", + "bruschetta", + "caesar_salad", + "steak", + "spring_rolls", + "spaghetti_carbonara", + "frozen_yogurt", + "falafel", + "mussels", + "ramen", + "onion_rings", + "oysters", + "risotto", + "waffles", + "cup_cakes", + "grilled_cheese_sandwich", + "fried_calamari", + "huevos_rancheros", + "croque_madame", + "bread_pudding", + "dumplings", + ] + assert osp.isdir(args.data_root) + assert "images" in os.listdir(args.data_root) + assert "meta" in os.listdir(args.data_root) + os.makedirs(osp.join(args.data_root, "train"), exist_ok=True) + os.makedirs(osp.join(args.data_root, "test"), exist_ok=True) + for cls_name in classes: + os.makedirs(osp.join(args.data_root, "train", cls_name), exist_ok=True) + os.makedirs(osp.join(args.data_root, "test", cls_name), exist_ok=True) + with open(osp.join(args.data_root, "meta", "train.txt"), "r") as file: + for image in tqdm(file): + image = image.rstrip() + if image.split("/")[0] in classes: + copyfile( + osp.join(args.data_root, "images", image + ".jpg"), + osp.join(args.data_root, "train", image + ".jpg"), + ) + with open(osp.join(args.data_root, "meta", "test.txt"), "r") as file: + for image in tqdm(file): + image = image.rstrip() + if image.split("/")[0] in classes: + copyfile( + osp.join(args.data_root, "images", image + ".jpg"), + osp.join(args.data_root, "test", image + ".jpg"), + ) + + +if __name__ == "__main__": + main() diff --git a/Bag-Of-Tricks-For-Image-Classification/utils/args.py b/Bag-Of-Tricks-For-Image-Classification/utils/args.py new file mode 100644 index 000000000..cdaebcc3e --- /dev/null +++ b/Bag-Of-Tricks-For-Image-Classification/utils/args.py @@ -0,0 +1,88 @@ +import argparse + + +def get_program_level_args(): + parser = argparse.ArgumentParser(description="Classification Training") + + parser.add_argument( + "-j", + "--workers", + default=4, + type=int, + metavar="N", + help="Number of data loading workers", + ) + + parser.add_argument( + "--use-smoothing", + action="store_true", + default=False, + help="Use label smoothing trick", + ) + + parser.add_argument( + "--smoothing", + type=float, + default=0.1, + help="Coefficient for label smoothing (from 0.0 to 1.0 where 0.0 means no smoothing)", + ) + + parser.add_argument( + "--use-mixup", + action="store_true", + default=False, + help="Use mixup augmentation during training", + ) + + parser.add_argument( + "--mixup-alpha", + type=float, + default=0.2, + help="Alpha value for mixup augmentation", + ) + + parser.add_argument( + "--use-cosine-scheduler", + action="store_true", + default=False, + help="Use Cosine LR Scheduler instead of MultiStep", + ) + + parser.add_argument( + "--use-knowledge-distillation", + action="store_true", + default=False, + help="Use Knowledge Distillation technique", + ) + + parser.add_argument( + "--distill-alpha", type=float, default=0.5, help="Distillation strength", + ) + + parser.add_argument( + "--distill-temperature", + type=int, + default=20, + help="Temperature hyper-parameter to make the outputs smoother for KD", + ) + + parser.add_argument( + "-e", + "--evaluate", + dest="evaluate", + action="store_true", + help="Evaluate model on validation set", + ) + + parser.add_argument( + "--checkpoint", + type=str, + default=None, + help="Path to the trained model for evaluation", + ) + + parser.add_argument( + "--seed", type=int, default=0, help="Seed to initialize all random generators", + ) + + return parser diff --git a/CI/Dockerfile b/CI/Dockerfile new file mode 100644 index 000000000..1dcd49d5c --- /dev/null +++ b/CI/Dockerfile @@ -0,0 +1,60 @@ +FROM ubuntu:18.04 + +USER root + +# Custom packages for some blog posts: + +# Sample | Packages +# ----------------------+------------------------------------- +# OCR | libtesseract-dev, tesseract-ocr-eng +# barcode-QRcodeScanner | libzbar-dev +# qt-test | qt5-default + +RUN export DEBIAN_FRONTEND noninteractive && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + build-essential \ + cmake \ + make \ + gcc \ + git \ + wget \ + libglib2.0-0 \ + libgtk2.0-dev \ + libsm6 \ + libxext6 \ + libfontconfig1 \ + libxrender1 \ + libeigen3-dev \ + python3 \ + python3-dev \ + python3-pip \ + python3-setuptools \ + pkg-config \ + libavformat-dev \ + libswscale-dev \ + libavcodec-dev \ + libavformat-dev \ + libjpeg-dev \ + libpng-dev \ + libtiff-dev \ + libtesseract-dev \ + tesseract-ocr-eng \ + libzbar-dev \ + qt5-default \ + && \ + apt-get clean + +RUN wget -q -O /tmp/opencv.tar.gz https://codeload.github.com/opencv/opencv/tar.gz/4.4.0 && \ + cd /tmp/ && tar -xf /tmp/opencv.tar.gz && \ + wget -q -O /tmp/opencv_contrib.tar.gz https://codeload.github.com/opencv/opencv_contrib/tar.gz/4.4.0 && \ + cd /tmp/ && tar -xf /tmp/opencv_contrib.tar.gz && \ + mkdir /tmp/build && cd /tmp/build && \ + cmake -DBUILD_TESTS=OFF -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.4.0/modules ../opencv-4.4.0/ && \ + make -j4 && make install && \ + rm -rf /tmp/build && rm -rf /tmp/opencv* + +RUN useradd ci -m -s /bin/bash -G users +USER ci + +CMD bash diff --git a/CameraCalibration/CMakeLists.txt b/CameraCalibration/CMakeLists.txt index 22ee7ac48..db1f2d577 100644 --- a/CameraCalibration/CMakeLists.txt +++ b/CameraCalibration/CMakeLists.txt @@ -14,3 +14,4 @@ MACRO(add_example name) ENDMACRO() add_example(cameraCalibration) +add_example(cameraCalibrationWithUndistortion) diff --git a/CameraCalibration/README.md b/CameraCalibration/README.md index 91bb306a9..6e9519a42 100644 --- a/CameraCalibration/README.md +++ b/CameraCalibration/README.md @@ -4,22 +4,32 @@ Calibrate your camera using OpenCV. ## Using the C++ code ### Compilation -To compile the `cameraCalibration.cpp` code, use the following: +To compile the `cameraCalibration.cpp` and `cameraCalibrationWithUndistortion.cpp` code files, use the following: ```shell mkdir build cd build cmake .. cmake --build . --config Release ``` -### Usage -Refer to the following to use the compiled file: -`./build/cameraCalibration` +## Usage -## Using the python code -### Usage -Refer to the following to use the `cameraCalibration.py` file: -`python3 cameraCalibration.py` +### Using the C++ code +Refer to the following to use the compiled files: + +```shell +./build/cameraCalibration +./build/cameraCalibrationWithUndistortion +``` + +### Using the python code + +Refer to the following to use the `cameraCalibration.py` and `cameraCalibrationWithUndistortion.py` files respectively: + +```shell +python3 cameraCalibration.py +python3 cameraCalibrationWithUndistortion.py +``` # AI Courses by OpenCV diff --git a/CameraCalibration/cameraCalibration.cpp b/CameraCalibration/cameraCalibration.cpp index 542418a5c..a7993f249 100644 --- a/CameraCalibration/cameraCalibration.cpp +++ b/CameraCalibration/cameraCalibration.cpp @@ -45,23 +45,23 @@ int main() // Finding checker board corners // If desired number of corners are found in the image then success = true - success = cv::findChessboardCorners(gray,cv::Size(CHECKERBOARD[0],CHECKERBOARD[1]), corner_pts,CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FAST_CHECK | CV_CALIB_CB_NORMALIZE_IMAGE); - - /* + success = cv::findChessboardCorners(gray,cv::Size(CHECKERBOARD[0],CHECKERBOARD[1]), corner_pts, cv::CALIB_CB_ADAPTIVE_THRESH | cv::CALIB_CB_FAST_CHECK | cv::CALIB_CB_NORMALIZE_IMAGE); + + /* * If desired number of corner are detected, * we refine the pixel coordinates and display * them on the images of checker board */ if(success) { - cv::TermCriteria criteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.001); - + cv::TermCriteria criteria(cv::TermCriteria::EPS | cv::TermCriteria::MAX_ITER, 30, 0.001); + // refining pixel coordinates for given 2d points. cv::cornerSubPix(gray,corner_pts,cv::Size(11,11), cv::Size(-1,-1),criteria); - + // Displaying the detected corner points on the checker board cv::drawChessboardCorners(frame, cv::Size(CHECKERBOARD[0],CHECKERBOARD[1]), corner_pts,success); - + objpoints.push_back(objp); imgpoints.push_back(corner_pts); } diff --git a/CameraCalibration/cameraCalibrationWithUndistortion.cpp b/CameraCalibration/cameraCalibrationWithUndistortion.cpp new file mode 100644 index 000000000..a32b3f87c --- /dev/null +++ b/CameraCalibration/cameraCalibrationWithUndistortion.cpp @@ -0,0 +1,114 @@ +#include +#include +#include +#include +#include +#include + +// Defining the dimensions of checkerboard +int CHECKERBOARD[2]{6,9}; + +int main() +{ + // Creating vector to store vectors of 3D points for each checkerboard image + std::vector > objpoints; + + // Creating vector to store vectors of 2D points for each checkerboard image + std::vector > imgpoints; + + // Defining the world coordinates for 3D points + std::vector objp; + for(int i{0}; i images; + // Path of the folder containing checkerboard images + std::string path = "./images/*.jpg"; + + cv::glob(path, images); + + cv::Mat frame, gray; + // vector to store the pixel coordinates of detected checker board corners + std::vector corner_pts; + bool success; + + // Looping over all the images in the directory + for(int i{0}; i points; @@ -104,7 +103,7 @@ int main( int argc, char** argv) { points.push_back(Point2f(x,y)); } - + // Insert points into subdiv for( vector::iterator it = points.begin(); it != points.end(); it++) { @@ -118,9 +117,8 @@ int main( int argc, char** argv) imshow(win_delaunay, img_copy); waitKey(100); } - } - + // Draw delaunay triangles draw_delaunay( img, subdiv, delaunay_color ); @@ -129,10 +127,10 @@ int main( int argc, char** argv) { draw_point(img, *it, points_color); } - + // Allocate space for voronoi Diagram Mat img_voronoi = Mat::zeros(img.rows, img.cols, CV_8UC3); - + // Draw voronoi diagram draw_voronoi( img_voronoi, subdiv ); diff --git a/EigenFace/EigenFace.cpp b/EigenFace/EigenFace.cpp index bfc96f94a..34aa31d6d 100644 --- a/EigenFace/EigenFace.cpp +++ b/EigenFace/EigenFace.cpp @@ -26,21 +26,21 @@ vector eigenFaces; // Read jpg files from the directory void readImages(string dirName, vector &images) { - + cout << "Reading images from " << dirName; // Add slash to directory name if missing if (!dirName.empty() && dirName.back() != '/') dirName += '/'; - + DIR *dir; struct dirent *ent; int count = 0; - + //image extensions string imgExt = "jpg"; vector files; - + if ((dir = opendir (dirName.c_str())) != NULL) { /* print all the files and directories within directory */ @@ -51,7 +51,7 @@ void readImages(string dirName, vector &images) continue; } string fname = ent->d_name; - + if (fname.find(imgExt, (fname.length() - imgExt.length())) != std::string::npos) { string path = dirName + fname; @@ -65,7 +65,7 @@ void readImages(string dirName, vector &images) // Convert images to floating point type img.convertTo(img, CV_32FC3, 1/255.0); images.push_back(img); - + // A vertically flipped image is also a valid face image. // So lets use them as well. Mat imgFlip; @@ -99,21 +99,19 @@ static Mat createDataMatrix(const vector &images) // w = width of an image in the dataset. // h = height of an image in the dataset. // 3 is for the 3 color channels. - - + Mat data(static_cast(images.size()), images[0].rows * images[0].cols * 3, CV_32F); - + // Turn an image into one row vector in the data matrix for(unsigned int i = 0; i < images.size(); i++) { // Extract image as one long vector of size w x h x 3 Mat image = images[i].reshape(1,1); - + // Copy the long vector into one row of the destm image.copyTo(data.row(i)); - } - + cout << " DONE" << endl; return data; } @@ -124,7 +122,7 @@ void createNewFace(int ,void *) { // Start with the mean image Mat output = averageFace.clone(); - + // Add the eigen faces with the weights for(int i = 0; i < NUM_EIGEN_FACES; i++) { @@ -135,9 +133,9 @@ void createNewFace(int ,void *) } resize(output, output, Size(), 2, 2); - + imshow("Result", output); - + } // Reset slider values @@ -161,53 +159,53 @@ int main(int argc, char **argv) { // Directory containing images string dirName = "images/"; - + // Read images in the directory vector images; readImages(dirName, images); - + // Size of images. All images should be the same size. Size sz = images[0].size(); - + // Create data matrix for PCA. Mat data = createDataMatrix(images); - + // Calculate PCA of the data matrix cout << "Calculating PCA ..."; PCA pca(data, Mat(), PCA::DATA_AS_ROW, NUM_EIGEN_FACES); cout << " DONE"<< endl; - + // Extract mean vector and reshape it to obtain average face averageFace = pca.mean.reshape(3,sz.height); - + // Find eigen vectors. Mat eigenVectors = pca.eigenvectors; - + // Reshape Eigenvectors to obtain EigenFaces for(int i = 0; i < NUM_EIGEN_FACES; i++) { Mat eigenFace = eigenVectors.row(i).reshape(3,sz.height); eigenFaces.push_back(eigenFace); } - + // Show mean face image at 2x the original size Mat output; resize(averageFace, output, Size(), 2, 2); - - namedWindow("Result", CV_WINDOW_AUTOSIZE); + + namedWindow("Result", cv::WINDOW_AUTOSIZE); imshow("Result", output); - + // Create trackbars - namedWindow("Trackbars", CV_WINDOW_AUTOSIZE); + namedWindow("Trackbars", cv::WINDOW_AUTOSIZE); for(int i = 0; i < NUM_EIGEN_FACES; i++) { sliderValues[i] = MAX_SLIDER_VALUE/2; createTrackbar( "Weight" + to_string(i), "Trackbars", &sliderValues[i], MAX_SLIDER_VALUE, createNewFace); } - + // You can reset the sliders by clicking on the mean image. setMouseCallback("Result", resetSliderValues); - + cout << "Usage:" << endl << "\tChange the weights using the sliders" << endl << "\tClick on the result window to reset sliders" << endl diff --git a/FBAMatting/LICENSE b/FBAMatting/LICENSE new file mode 100644 index 000000000..f812a2aed --- /dev/null +++ b/FBAMatting/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Marco Forte + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/FBAMatting/README.md b/FBAMatting/README.md new file mode 100644 index 000000000..439db7bb8 --- /dev/null +++ b/FBAMatting/README.md @@ -0,0 +1,42 @@ +# F, B, A Matting demonstration +This repository contains the code for [Image Matting with state-of-the-art Method “F, B, Alpha Matting”](https://www.learnopencv.com/image-matting-with-state-of-the-art-method-f-b-alpha-matting/) blog. + +## Usage for test images + +Please, follow the instruction to launch the demonstration script: + +- Download model weights from [there](https://drive.google.com/uc?id=1T_oiKDE_biWf2kqexMEN7ObWqtXAzbB1); +- Install the requirements with `pip3 install -r requirements.txt`; +- Launch `python3 demo.py` to use default arguments. Use `python3 demo.py -h` for details. + +The results will be saved into `./examples/predictions` by default. + +## Usage for real life images + +If you want to run the matting network on your own images you will need to generate the corresponding trimaps first. +This process is supposed to be manual but that's too burdensome. +Instead, please follow the instruction below to launch the trimap generation process using a semantic segmentation algorithm: + +- You need to generate trimap. In this repo we use PyTorch implementation of the DeepLabV3 for that purpose. Select the class of your foreground object using --target_class key: + +``` +python generate_trimaps.py -i /path/to/your/images (should be a directory) --target_class cat (consult --help for other options) +``` + +- Your trimaps will be stored into `path/to/your/images/trimaps` +- Then launch +``` +python demo.py --image_dir path/to/your/images --trimap_dir path/to/your/images/trimaps --output_dir path/to/save +``` + to get predictions +- Note that results may be imprecise due to rough trimap generation. You can try to play with the --conf_threshold to fix that. + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
diff --git a/FBAMatting/dataloader.py b/FBAMatting/dataloader.py new file mode 100644 index 000000000..9586e9c4f --- /dev/null +++ b/FBAMatting/dataloader.py @@ -0,0 +1,45 @@ +import os + +import cv2 +import numpy as np +from torch.utils.data import Dataset + + +class PredDataset(Dataset): + """ Reads image and trimap pairs from folder. + + """ + + def __init__(self, img_dir, trimap_dir): + self.img_dir, self.trimap_dir = img_dir, trimap_dir + self.img_names = [ + x + for x in os.listdir(self.img_dir) + if os.path.isfile(os.path.join(self.img_dir, x)) + ] + + def __len__(self): + return len(self.img_names) + + def __getitem__(self, idx): + img_name = self.img_names[idx] + trimap_name = img_name[:-3] + "png" + + image = read_image(os.path.join(self.img_dir, img_name)) + trimap = read_trimap(os.path.join(self.trimap_dir, trimap_name)) + pred_dict = {"image": image, "trimap": trimap, "name": img_name} + + return pred_dict + + +def read_image(name): + return (cv2.imread(name) / 255.0)[:, :, ::-1] + + +def read_trimap(name): + trimap_im = cv2.imread(name, 0) / 255.0 + h, w = trimap_im.shape + trimap = np.zeros((h, w, 2)) + trimap[trimap_im == 1, 1] = 1 + trimap[trimap_im == 0, 0] = 1 + return trimap diff --git a/FBAMatting/demo.py b/FBAMatting/demo.py new file mode 100644 index 000000000..66962433f --- /dev/null +++ b/FBAMatting/demo.py @@ -0,0 +1,136 @@ +import argparse +import os + +import cv2 +import numpy as np +import torch +from dataloader import PredDataset +from networks.models import build_model +from networks.transforms import ( + groupnorm_normalise_image, + trimap_transform, +) +from tqdm import tqdm + + +def np_to_torch(x): + return torch.from_numpy(x).permute(2, 0, 1)[None, :, :, :].float() + + +def scale_input(x: np.ndarray, scale: float, scale_type) -> np.ndarray: + """ Scales inputs to multiple of 8. """ + h, w = x.shape[:2] + h1 = int(np.ceil(scale * h / 8) * 8) + w1 = int(np.ceil(scale * w / 8) * 8) + x_scale = cv2.resize(x, (w1, h1), interpolation=scale_type) + return x_scale + + +def swap_bg(image, alpha): + green_bg = np.zeros_like(image).astype(np.float32) + green_bg[:, :, 1] = 255 + + alpha = alpha[:, :, np.newaxis] + result = alpha * image.astype(np.float32) + (1 - alpha) * green_bg + result = np.clip(result, 0, 255).astype(np.uint8) + + return result + + +def predict_fba_folder(model, args): + save_dir = args.output_dir + os.makedirs(save_dir, exist_ok=True) + + dataset_test = PredDataset(args.image_dir, args.trimap_dir) + + gen = iter(dataset_test) + for item_dict in tqdm(gen): + image_np = item_dict["image"] + trimap_np = item_dict["trimap"] + + fg, bg, alpha = pred(image_np, trimap_np, model, args) + + cv2.imwrite( + os.path.join(save_dir, item_dict["name"][:-4] + "_fg.png"), + fg[:, :, ::-1] * 255, + ) + cv2.imwrite( + os.path.join(save_dir, item_dict["name"][:-4] + "_bg.png"), + bg[:, :, ::-1] * 255, + ) + cv2.imwrite( + os.path.join(save_dir, item_dict["name"][:-4] + "_alpha.png"), alpha * 255, + ) + + example_swap_bg = swap_bg(fg[:, :, ::-1] * 255, alpha) + cv2.imwrite( + os.path.join(save_dir, item_dict["name"][:-4] + "_swapped_bg.png"), example_swap_bg, + ) + + +def pred(image_np: np.ndarray, trimap_np: np.ndarray, model, args) -> np.ndarray: + """ Predict alpha, foreground and background. + Parameters: + image_np -- the image in rgb format between 0 and 1. Dimensions: (h, w, 3) + trimap_np -- two channel trimap, first background then foreground. Dimensions: (h, w, 2) + Returns: + fg: foreground image in rgb format between 0 and 1. Dimensions: (h, w, 3) + bg: background image in rgb format between 0 and 1. Dimensions: (h, w, 3) + alpha: alpha matte image between 0 and 1. Dimensions: (h, w) + """ + h, w = trimap_np.shape[:2] + + image_scale_np = scale_input(image_np, 1.0, cv2.INTER_LANCZOS4) + trimap_scale_np = scale_input(trimap_np, 1.0, cv2.INTER_LANCZOS4) + + with torch.no_grad(): + + image_torch = np_to_torch(image_scale_np).to(args.device) + trimap_torch = np_to_torch(trimap_scale_np).to(args.device) + + trimap_transformed_torch = np_to_torch(trimap_transform(trimap_scale_np)).to( + args.device, + ) + image_transformed_torch = groupnorm_normalise_image( + image_torch.clone(), format="nchw", + ) + + output = model( + image_torch, + trimap_torch, + image_transformed_torch, + trimap_transformed_torch, + ) + + output = cv2.resize( + output[0].cpu().numpy().transpose((1, 2, 0)), (w, h), cv2.INTER_LANCZOS4, + ) + alpha = output[:, :, 0] + fg = output[:, :, 1:4] + bg = output[:, :, 4:7] + + alpha[trimap_np[:, :, 0] == 1] = 0 + alpha[trimap_np[:, :, 1] == 1] = 1 + fg[alpha == 1] = image_np[alpha == 1] + bg[alpha == 0] = image_np[alpha == 0] + return fg, bg, alpha + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + # Model related arguments + parser.add_argument("--encoder", default="resnet50_GN_WS", help="Encoder model") + parser.add_argument("--decoder", default="fba_decoder", help="Decoder model") + parser.add_argument("--weights", default="FBA.pth") + parser.add_argument("--image_dir", default="./examples/images", help="") + parser.add_argument( + "--trimap_dir", default="./examples/trimaps", help="", + ) + parser.add_argument("--output_dir", default="./examples/predictions", help="") + parser.add_argument("--device", default="cpu", help="Device for inference on") + + args = parser.parse_args() + model = build_model(args).to(args.device) + model.eval() + predict_fba_folder(model, args) diff --git a/FBAMatting/examples/alpha/boy-1518482_1920_12.png b/FBAMatting/examples/alpha/boy-1518482_1920_12.png new file mode 100644 index 000000000..bf0d9c756 Binary files /dev/null and b/FBAMatting/examples/alpha/boy-1518482_1920_12.png differ diff --git a/FBAMatting/examples/alpha/dandelion-1335575_1920_1.png b/FBAMatting/examples/alpha/dandelion-1335575_1920_1.png new file mode 100644 index 000000000..f679fa57e Binary files /dev/null and b/FBAMatting/examples/alpha/dandelion-1335575_1920_1.png differ diff --git a/FBAMatting/examples/alpha/light-bulb-376930_1920_11.png b/FBAMatting/examples/alpha/light-bulb-376930_1920_11.png new file mode 100644 index 000000000..3dff66cdc Binary files /dev/null and b/FBAMatting/examples/alpha/light-bulb-376930_1920_11.png differ diff --git a/FBAMatting/examples/alpha/sieve-641426_1920_1.png b/FBAMatting/examples/alpha/sieve-641426_1920_1.png new file mode 100644 index 000000000..ba0c01240 Binary files /dev/null and b/FBAMatting/examples/alpha/sieve-641426_1920_1.png differ diff --git a/FBAMatting/examples/alpha/spring-289527_1920_15.png b/FBAMatting/examples/alpha/spring-289527_1920_15.png new file mode 100644 index 000000000..e39f12503 Binary files /dev/null and b/FBAMatting/examples/alpha/spring-289527_1920_15.png differ diff --git a/FBAMatting/examples/cat_images/cat-yawning-1765832.jpg b/FBAMatting/examples/cat_images/cat-yawning-1765832.jpg new file mode 100644 index 000000000..8b312870b Binary files /dev/null and b/FBAMatting/examples/cat_images/cat-yawning-1765832.jpg differ diff --git a/FBAMatting/examples/cat_images/low-angle-portrait-of-cat-on-tree.jpg b/FBAMatting/examples/cat_images/low-angle-portrait-of-cat-on-tree.jpg new file mode 100644 index 000000000..a8bdcc747 Binary files /dev/null and b/FBAMatting/examples/cat_images/low-angle-portrait-of-cat-on-tree.jpg differ diff --git a/FBAMatting/examples/cat_images/results/cat-yawning-1765832_alpha.png b/FBAMatting/examples/cat_images/results/cat-yawning-1765832_alpha.png new file mode 100644 index 000000000..2468fae97 Binary files /dev/null and b/FBAMatting/examples/cat_images/results/cat-yawning-1765832_alpha.png differ diff --git a/FBAMatting/examples/cat_images/results/cat-yawning-1765832_bg.png b/FBAMatting/examples/cat_images/results/cat-yawning-1765832_bg.png new file mode 100644 index 000000000..d15950d39 Binary files /dev/null and b/FBAMatting/examples/cat_images/results/cat-yawning-1765832_bg.png differ diff --git a/FBAMatting/examples/cat_images/results/cat-yawning-1765832_fg.png b/FBAMatting/examples/cat_images/results/cat-yawning-1765832_fg.png new file mode 100644 index 000000000..400247b56 Binary files /dev/null and b/FBAMatting/examples/cat_images/results/cat-yawning-1765832_fg.png differ diff --git a/FBAMatting/examples/cat_images/results/cat-yawning-1765832_swapped_bg.png b/FBAMatting/examples/cat_images/results/cat-yawning-1765832_swapped_bg.png new file mode 100644 index 000000000..8068c28c3 Binary files /dev/null and b/FBAMatting/examples/cat_images/results/cat-yawning-1765832_swapped_bg.png differ diff --git a/FBAMatting/examples/cat_images/results/low-angle-portrait-of-cat-on-tree_alpha.png b/FBAMatting/examples/cat_images/results/low-angle-portrait-of-cat-on-tree_alpha.png new file mode 100644 index 000000000..77f617e57 Binary files /dev/null and b/FBAMatting/examples/cat_images/results/low-angle-portrait-of-cat-on-tree_alpha.png differ diff --git a/FBAMatting/examples/cat_images/results/low-angle-portrait-of-cat-on-tree_bg.png b/FBAMatting/examples/cat_images/results/low-angle-portrait-of-cat-on-tree_bg.png new file mode 100644 index 000000000..b7ac4b348 Binary files /dev/null and b/FBAMatting/examples/cat_images/results/low-angle-portrait-of-cat-on-tree_bg.png differ diff --git a/FBAMatting/examples/cat_images/results/low-angle-portrait-of-cat-on-tree_fg.png b/FBAMatting/examples/cat_images/results/low-angle-portrait-of-cat-on-tree_fg.png new file mode 100644 index 000000000..f773f7e07 Binary files /dev/null and b/FBAMatting/examples/cat_images/results/low-angle-portrait-of-cat-on-tree_fg.png differ diff --git a/FBAMatting/examples/cat_images/results/low-angle-portrait-of-cat-on-tree_swapped_bg.png b/FBAMatting/examples/cat_images/results/low-angle-portrait-of-cat-on-tree_swapped_bg.png new file mode 100644 index 000000000..1dbe0b884 Binary files /dev/null and b/FBAMatting/examples/cat_images/results/low-angle-portrait-of-cat-on-tree_swapped_bg.png differ diff --git a/FBAMatting/examples/example_results.png b/FBAMatting/examples/example_results.png new file mode 100644 index 000000000..4e1245bb9 Binary files /dev/null and b/FBAMatting/examples/example_results.png differ diff --git a/FBAMatting/examples/images/boy.png b/FBAMatting/examples/images/boy.png new file mode 100644 index 000000000..53f09dac8 Binary files /dev/null and b/FBAMatting/examples/images/boy.png differ diff --git a/FBAMatting/examples/images/elephant.png b/FBAMatting/examples/images/elephant.png new file mode 100644 index 000000000..32a09c145 Binary files /dev/null and b/FBAMatting/examples/images/elephant.png differ diff --git a/FBAMatting/examples/images/light-bulb.png b/FBAMatting/examples/images/light-bulb.png new file mode 100644 index 000000000..fec5830b7 Binary files /dev/null and b/FBAMatting/examples/images/light-bulb.png differ diff --git a/FBAMatting/examples/images/sieve.png b/FBAMatting/examples/images/sieve.png new file mode 100644 index 000000000..7bcc268f6 Binary files /dev/null and b/FBAMatting/examples/images/sieve.png differ diff --git a/FBAMatting/examples/images/spring.png b/FBAMatting/examples/images/spring.png new file mode 100644 index 000000000..65449ef19 Binary files /dev/null and b/FBAMatting/examples/images/spring.png differ diff --git a/FBAMatting/examples/images/troll.png b/FBAMatting/examples/images/troll.png new file mode 100644 index 000000000..9bdc64e66 Binary files /dev/null and b/FBAMatting/examples/images/troll.png differ diff --git a/FBAMatting/examples/predictions/boy_alpha.png b/FBAMatting/examples/predictions/boy_alpha.png new file mode 100644 index 000000000..4c58c2812 Binary files /dev/null and b/FBAMatting/examples/predictions/boy_alpha.png differ diff --git a/FBAMatting/examples/predictions/boy_bg.png b/FBAMatting/examples/predictions/boy_bg.png new file mode 100644 index 000000000..3f1794e9f Binary files /dev/null and b/FBAMatting/examples/predictions/boy_bg.png differ diff --git a/FBAMatting/examples/predictions/boy_fg.png b/FBAMatting/examples/predictions/boy_fg.png new file mode 100644 index 000000000..8ec1a347c Binary files /dev/null and b/FBAMatting/examples/predictions/boy_fg.png differ diff --git a/FBAMatting/examples/predictions/boy_swapped_bg.png b/FBAMatting/examples/predictions/boy_swapped_bg.png new file mode 100644 index 000000000..6066096b7 Binary files /dev/null and b/FBAMatting/examples/predictions/boy_swapped_bg.png differ diff --git a/FBAMatting/examples/predictions/elephant_alpha.png b/FBAMatting/examples/predictions/elephant_alpha.png new file mode 100644 index 000000000..5b47429be Binary files /dev/null and b/FBAMatting/examples/predictions/elephant_alpha.png differ diff --git a/FBAMatting/examples/predictions/elephant_bg.png b/FBAMatting/examples/predictions/elephant_bg.png new file mode 100644 index 000000000..dddb9016f Binary files /dev/null and b/FBAMatting/examples/predictions/elephant_bg.png differ diff --git a/FBAMatting/examples/predictions/elephant_fg.png b/FBAMatting/examples/predictions/elephant_fg.png new file mode 100644 index 000000000..0427163b8 Binary files /dev/null and b/FBAMatting/examples/predictions/elephant_fg.png differ diff --git a/FBAMatting/examples/predictions/elephant_swapped_bg.png b/FBAMatting/examples/predictions/elephant_swapped_bg.png new file mode 100644 index 000000000..cf69fd00e Binary files /dev/null and b/FBAMatting/examples/predictions/elephant_swapped_bg.png differ diff --git a/FBAMatting/examples/predictions/light-bulb_alpha.png b/FBAMatting/examples/predictions/light-bulb_alpha.png new file mode 100644 index 000000000..95debb076 Binary files /dev/null and b/FBAMatting/examples/predictions/light-bulb_alpha.png differ diff --git a/FBAMatting/examples/predictions/light-bulb_bg.png b/FBAMatting/examples/predictions/light-bulb_bg.png new file mode 100644 index 000000000..c3d2983e5 Binary files /dev/null and b/FBAMatting/examples/predictions/light-bulb_bg.png differ diff --git a/FBAMatting/examples/predictions/light-bulb_fg.png b/FBAMatting/examples/predictions/light-bulb_fg.png new file mode 100644 index 000000000..0e84d8f5d Binary files /dev/null and b/FBAMatting/examples/predictions/light-bulb_fg.png differ diff --git a/FBAMatting/examples/predictions/light-bulb_swapped_bg.png b/FBAMatting/examples/predictions/light-bulb_swapped_bg.png new file mode 100644 index 000000000..06c8b8ce0 Binary files /dev/null and b/FBAMatting/examples/predictions/light-bulb_swapped_bg.png differ diff --git a/FBAMatting/examples/predictions/sieve_alpha.png b/FBAMatting/examples/predictions/sieve_alpha.png new file mode 100644 index 000000000..329c570b4 Binary files /dev/null and b/FBAMatting/examples/predictions/sieve_alpha.png differ diff --git a/FBAMatting/examples/predictions/sieve_bg.png b/FBAMatting/examples/predictions/sieve_bg.png new file mode 100644 index 000000000..06b2c62b3 Binary files /dev/null and b/FBAMatting/examples/predictions/sieve_bg.png differ diff --git a/FBAMatting/examples/predictions/sieve_fg.png b/FBAMatting/examples/predictions/sieve_fg.png new file mode 100644 index 000000000..60ed64517 Binary files /dev/null and b/FBAMatting/examples/predictions/sieve_fg.png differ diff --git a/FBAMatting/examples/predictions/sieve_swapped_bg.png b/FBAMatting/examples/predictions/sieve_swapped_bg.png new file mode 100644 index 000000000..2483f77e9 Binary files /dev/null and b/FBAMatting/examples/predictions/sieve_swapped_bg.png differ diff --git a/FBAMatting/examples/predictions/spring_alpha.png b/FBAMatting/examples/predictions/spring_alpha.png new file mode 100644 index 000000000..bbe4fe8a6 Binary files /dev/null and b/FBAMatting/examples/predictions/spring_alpha.png differ diff --git a/FBAMatting/examples/predictions/spring_bg.png b/FBAMatting/examples/predictions/spring_bg.png new file mode 100644 index 000000000..f76efa5fb Binary files /dev/null and b/FBAMatting/examples/predictions/spring_bg.png differ diff --git a/FBAMatting/examples/predictions/spring_fg.png b/FBAMatting/examples/predictions/spring_fg.png new file mode 100644 index 000000000..4f6747a82 Binary files /dev/null and b/FBAMatting/examples/predictions/spring_fg.png differ diff --git a/FBAMatting/examples/predictions/spring_swapped_bg.png b/FBAMatting/examples/predictions/spring_swapped_bg.png new file mode 100644 index 000000000..c54c1e78d Binary files /dev/null and b/FBAMatting/examples/predictions/spring_swapped_bg.png differ diff --git a/FBAMatting/examples/predictions/troll_alpha.png b/FBAMatting/examples/predictions/troll_alpha.png new file mode 100644 index 000000000..7bc64c9ba Binary files /dev/null and b/FBAMatting/examples/predictions/troll_alpha.png differ diff --git a/FBAMatting/examples/predictions/troll_bg.png b/FBAMatting/examples/predictions/troll_bg.png new file mode 100644 index 000000000..89efda87e Binary files /dev/null and b/FBAMatting/examples/predictions/troll_bg.png differ diff --git a/FBAMatting/examples/predictions/troll_fg.png b/FBAMatting/examples/predictions/troll_fg.png new file mode 100644 index 000000000..860536829 Binary files /dev/null and b/FBAMatting/examples/predictions/troll_fg.png differ diff --git a/FBAMatting/examples/predictions/troll_swapped_bg.png b/FBAMatting/examples/predictions/troll_swapped_bg.png new file mode 100644 index 000000000..392388bc6 Binary files /dev/null and b/FBAMatting/examples/predictions/troll_swapped_bg.png differ diff --git a/FBAMatting/examples/trimaps/boy.png b/FBAMatting/examples/trimaps/boy.png new file mode 100644 index 000000000..fea8961ff Binary files /dev/null and b/FBAMatting/examples/trimaps/boy.png differ diff --git a/FBAMatting/examples/trimaps/elephant.png b/FBAMatting/examples/trimaps/elephant.png new file mode 100644 index 000000000..6e48e8ba0 Binary files /dev/null and b/FBAMatting/examples/trimaps/elephant.png differ diff --git a/FBAMatting/examples/trimaps/light-bulb.png b/FBAMatting/examples/trimaps/light-bulb.png new file mode 100644 index 000000000..e846a38d1 Binary files /dev/null and b/FBAMatting/examples/trimaps/light-bulb.png differ diff --git a/FBAMatting/examples/trimaps/sieve.png b/FBAMatting/examples/trimaps/sieve.png new file mode 100644 index 000000000..d2adc8fe8 Binary files /dev/null and b/FBAMatting/examples/trimaps/sieve.png differ diff --git a/FBAMatting/examples/trimaps/spring.png b/FBAMatting/examples/trimaps/spring.png new file mode 100644 index 000000000..35cb9a44b Binary files /dev/null and b/FBAMatting/examples/trimaps/spring.png differ diff --git a/FBAMatting/examples/trimaps/troll.png b/FBAMatting/examples/trimaps/troll.png new file mode 100644 index 000000000..bb2db3e15 Binary files /dev/null and b/FBAMatting/examples/trimaps/troll.png differ diff --git a/FBAMatting/generate_trimaps.py b/FBAMatting/generate_trimaps.py new file mode 100644 index 000000000..2a2b15b5e --- /dev/null +++ b/FBAMatting/generate_trimaps.py @@ -0,0 +1,112 @@ +import os +import argparse +import torch +import numpy as np +from torchvision import transforms +import cv2 + +IMG_EXT = ('.png', '.jpg', '.jpeg', '.JPG', '.JPEG') + +CLASS_MAP = {"background": 0, "aeroplane": 1, "bicycle": 2, "bird": 3, "boat": 4, "bottle": 5, "bus": 6, "car": 7, + "cat": 8, "chair": 9, "cow": 10, "diningtable": 11, "dog": 12, "horse": 13, "motorbike": 14, "person": 15, + "potted plant": 16, "sheep": 17, "sofa": 18, "train": 19, "tv/monitor": 20} + + +def trimap(probs, size, conf_threshold): + """ + This function creates a trimap based on simple dilation algorithm + Inputs [3]: an image with probabilities of each pixel being the foreground, size of dilation kernel, + foreground confidence threshold + Output : a trimap + """ + mask = (probs > 0.05).astype(np.uint8) * 255 + + pixels = 2 * size + 1 + kernel = np.ones((pixels, pixels), np.uint8) + + dilation = cv2.dilate(mask, kernel, iterations=1) + + remake = np.zeros_like(mask) + remake[dilation == 255] = 127 # Set every pixel within dilated region as probably foreground. + remake[probs > conf_threshold] = 255 # Set every pixel with large enough probability as definitely foreground. + + return remake + + +def parse_args(): + parser = argparse.ArgumentParser(description="Deeplab Segmentation") + parser.add_argument( + "-i", + "--input_dir", + type=str, + required=True, + help="Directory to save the output results. (required)", + ) + parser.add_argument( + "--target_class", + type=str, + default='person', + choices=CLASS_MAP.keys(), + help="Type of the foreground object.", + ) + parser.add_argument( + "--show", + action='store_true', + help="Use to show results.", + ) + parser.add_argument( + "--conf_threshold", + type=float, + default='0.95', + help="Confidence threshold for the foreground object. " + "You can play with it to get better looking trimaps.", + ) + + args = parser.parse_args() + return args + + +def main(input_dir, target_class, show, conf_threshold): + model = torch.hub.load('pytorch/vision:v0.6.0', 'deeplabv3_resnet101', pretrained=True) + model.eval() + + trimaps_path = os.path.join(input_dir, "trimaps") + os.makedirs(trimaps_path, exist_ok=True) + + images_list = os.listdir(input_dir) + for filename in images_list: + if not filename.endswith(IMG_EXT): + continue + input_image = cv2.imread(os.path.join(input_dir, filename)) + original_image = input_image.copy() + + input_image = cv2.cvtColor(input_image, cv2.COLOR_BGR2RGB) + + preprocess = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), + ]) + + input_tensor = preprocess(input_image) + input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model + + with torch.no_grad(): + output = model(input_batch)['out'][0] + output = torch.softmax(output, 0) + + output_cat = output[CLASS_MAP[target_class], ...].numpy() + + trimap_image = trimap(output_cat, 7, conf_threshold) + trimap_filename = os.path.basename(filename).split('.')[0] + '.png' + cv2.imwrite(os.path.join(trimaps_path, trimap_filename), trimap_image) + + if show: + cv2.imshow('mask', output_cat) + cv2.imshow('image', original_image) + cv2.imshow('trimap', trimap_image) + cv2.waitKey(0) + + +if __name__ == "__main__": + args = parse_args() + main(args.input_dir, args.target_class, args.show, args.conf_threshold) diff --git a/FBAMatting/networks/__init__.py b/FBAMatting/networks/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/FBAMatting/networks/layers_WS.py b/FBAMatting/networks/layers_WS.py new file mode 100644 index 000000000..259ba37c8 --- /dev/null +++ b/FBAMatting/networks/layers_WS.py @@ -0,0 +1,52 @@ +import torch +import torch.nn as nn +from torch.nn import functional as F + + +class Conv2d(nn.Conv2d): + def __init__( + self, + in_channels, + out_channels, + kernel_size, + stride=1, + padding=0, + dilation=1, + groups=1, + bias=True, + ): + super(Conv2d, self).__init__( + in_channels, + out_channels, + kernel_size, + stride, + padding, + dilation, + groups, + bias, + ) + + def forward(self, x): + # return super(Conv2d, self).forward(x) + weight = self.weight + weight_mean = ( + weight.mean(dim=1, keepdim=True) + .mean(dim=2, keepdim=True) + .mean(dim=3, keepdim=True) + ) + weight = weight - weight_mean + # std = (weight).view(weight.size(0), -1).std(dim=1).view(-1, 1, 1, 1) + 1e-5 + std = ( + torch.sqrt(torch.var(weight.view(weight.size(0), -1), dim=1) + 1e-12).view( + -1, 1, 1, 1, + ) + + 1e-5 + ) + weight = weight / std.expand_as(weight) + return F.conv2d( + x, weight, self.bias, self.stride, self.padding, self.dilation, self.groups, + ) + + +def BatchNorm2d(num_features): + return nn.GroupNorm(num_channels=num_features, num_groups=32) diff --git a/FBAMatting/networks/models.py b/FBAMatting/networks/models.py new file mode 100644 index 000000000..ae4d35a4c --- /dev/null +++ b/FBAMatting/networks/models.py @@ -0,0 +1,364 @@ +import networks.layers_WS as L +import networks.resnet_bn as resnet_bn +import networks.resnet_GN_WS as resnet_GN_WS +import torch +import torch.nn as nn + + +def build_model(args): + builder = ModelBuilder() + net_encoder = builder.build_encoder(arch=args.encoder) + + if "BN" in args.encoder: + batch_norm = True + else: + batch_norm = False + net_decoder = builder.build_decoder(arch=args.decoder, batch_norm=batch_norm) + + model = MattingModule(net_encoder, net_decoder) + + if args.weights != "default": + sd = torch.load(args.weights) + model.load_state_dict(sd, strict=True) + + return model + + +class MattingModule(nn.Module): + def __init__(self, net_enc, net_dec): + super(MattingModule, self).__init__() + self.encoder = net_enc + self.decoder = net_dec + + def forward(self, image, two_chan_trimap, image_n, trimap_transformed): + resnet_input = torch.cat((image_n, trimap_transformed, two_chan_trimap), 1) + conv_out, indices = self.encoder(resnet_input, return_feature_maps=True) + return self.decoder(conv_out, image, indices, two_chan_trimap) + + +class ModelBuilder: + def build_encoder(self, arch="resnet50_GN"): + if arch == "resnet50_GN_WS": + orig_resnet = resnet_GN_WS.__dict__["l_resnet50"]() + net_encoder = ResnetDilated(orig_resnet, dilate_scale=8) + elif arch == "resnet50_BN": + orig_resnet = resnet_bn.__dict__["l_resnet50"]() + net_encoder = ResnetDilatedBN(orig_resnet, dilate_scale=8) + + else: + raise Exception("Architecture undefined!") + + num_channels = 3 + 6 + 2 + + if num_channels > 3: + print(f"modifying input layer to accept {num_channels} channels") + net_encoder_sd = net_encoder.state_dict() + conv1_weights = net_encoder_sd["conv1.weight"] + + c_out, c_in, h, w = conv1_weights.size() + conv1_mod = torch.zeros(c_out, num_channels, h, w) + conv1_mod[:, :3, :, :] = conv1_weights + + conv1 = net_encoder.conv1 + conv1.in_channels = num_channels + conv1.weight = torch.nn.Parameter(conv1_mod) + + net_encoder.conv1 = conv1 + + net_encoder_sd["conv1.weight"] = conv1_mod + + net_encoder.load_state_dict(net_encoder_sd) + return net_encoder + + def build_decoder(self, arch="fba_decoder", batch_norm=False): + if arch == "fba_decoder": + net_decoder = fba_decoder(batch_norm=batch_norm) + + return net_decoder + + +class ResnetDilatedBN(nn.Module): + def __init__(self, orig_resnet, dilate_scale=8): + super(ResnetDilatedBN, self).__init__() + from functools import partial + + if dilate_scale == 8: + orig_resnet.layer3.apply(partial(self._nostride_dilate, dilate=2)) + orig_resnet.layer4.apply(partial(self._nostride_dilate, dilate=4)) + elif dilate_scale == 16: + orig_resnet.layer4.apply(partial(self._nostride_dilate, dilate=2)) + + # take pretrained resnet, except AvgPool and FC + self.conv1 = orig_resnet.conv1 + self.bn1 = orig_resnet.bn1 + self.relu1 = orig_resnet.relu1 + self.conv2 = orig_resnet.conv2 + self.bn2 = orig_resnet.bn2 + self.relu2 = orig_resnet.relu2 + self.conv3 = orig_resnet.conv3 + self.bn3 = orig_resnet.bn3 + self.relu3 = orig_resnet.relu3 + self.maxpool = orig_resnet.maxpool + self.layer1 = orig_resnet.layer1 + self.layer2 = orig_resnet.layer2 + self.layer3 = orig_resnet.layer3 + self.layer4 = orig_resnet.layer4 + + def _nostride_dilate(self, m, dilate): + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + # the convolution with stride + if m.stride == (2, 2): + m.stride = (1, 1) + if m.kernel_size == (3, 3): + m.dilation = (dilate // 2, dilate // 2) + m.padding = (dilate // 2, dilate // 2) + # other convolutions + else: + if m.kernel_size == (3, 3): + m.dilation = (dilate, dilate) + m.padding = (dilate, dilate) + + def forward(self, x, return_feature_maps=False): + conv_out = [x] + x = self.relu1(self.bn1(self.conv1(x))) + x = self.relu2(self.bn2(self.conv2(x))) + x = self.relu3(self.bn3(self.conv3(x))) + conv_out.append(x) + x, indices = self.maxpool(x) + x = self.layer1(x) + conv_out.append(x) + x = self.layer2(x) + conv_out.append(x) + x = self.layer3(x) + conv_out.append(x) + x = self.layer4(x) + conv_out.append(x) + + if return_feature_maps: + return conv_out, indices + return [x] + + +class Resnet(nn.Module): + def __init__(self, orig_resnet): + super(Resnet, self).__init__() + + # take pretrained resnet, except AvgPool and FC + self.conv1 = orig_resnet.conv1 + self.bn1 = orig_resnet.bn1 + self.relu1 = orig_resnet.relu1 + self.conv2 = orig_resnet.conv2 + self.bn2 = orig_resnet.bn2 + self.relu2 = orig_resnet.relu2 + self.conv3 = orig_resnet.conv3 + self.bn3 = orig_resnet.bn3 + self.relu3 = orig_resnet.relu3 + self.maxpool = orig_resnet.maxpool + self.layer1 = orig_resnet.layer1 + self.layer2 = orig_resnet.layer2 + self.layer3 = orig_resnet.layer3 + self.layer4 = orig_resnet.layer4 + + def forward(self, x, return_feature_maps=False): + conv_out = [] + + x = self.relu1(self.bn1(self.conv1(x))) + x = self.relu2(self.bn2(self.conv2(x))) + x = self.relu3(self.bn3(self.conv3(x))) + conv_out.append(x) + x, indices = self.maxpool(x) + + x = self.layer1(x) + conv_out.append(x) + x = self.layer2(x) + conv_out.append(x) + x = self.layer3(x) + conv_out.append(x) + x = self.layer4(x) + conv_out.append(x) + + if return_feature_maps: + return conv_out + return [x] + + +class ResnetDilated(nn.Module): + def __init__(self, orig_resnet, dilate_scale=8): + super(ResnetDilated, self).__init__() + from functools import partial + + if dilate_scale == 8: + orig_resnet.layer3.apply(partial(self._nostride_dilate, dilate=2)) + orig_resnet.layer4.apply(partial(self._nostride_dilate, dilate=4)) + elif dilate_scale == 16: + orig_resnet.layer4.apply(partial(self._nostride_dilate, dilate=2)) + + # take pretrained resnet, except AvgPool and FC + self.conv1 = orig_resnet.conv1 + self.bn1 = orig_resnet.bn1 + self.relu = orig_resnet.relu + self.maxpool = orig_resnet.maxpool + self.layer1 = orig_resnet.layer1 + self.layer2 = orig_resnet.layer2 + self.layer3 = orig_resnet.layer3 + self.layer4 = orig_resnet.layer4 + + def _nostride_dilate(self, m, dilate): + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + # the convolution with stride + if m.stride == (2, 2): + m.stride = (1, 1) + if m.kernel_size == (3, 3): + m.dilation = (dilate // 2, dilate // 2) + m.padding = (dilate // 2, dilate // 2) + # other convolutions + else: + if m.kernel_size == (3, 3): + m.dilation = (dilate, dilate) + m.padding = (dilate, dilate) + + def forward(self, x, return_feature_maps=False): + conv_out = [x] + x = self.relu(self.bn1(self.conv1(x))) + conv_out.append(x) + x, indices = self.maxpool(x) + x = self.layer1(x) + conv_out.append(x) + x = self.layer2(x) + conv_out.append(x) + x = self.layer3(x) + conv_out.append(x) + x = self.layer4(x) + conv_out.append(x) + + if return_feature_maps: + return conv_out, indices + return [x] + + +def norm(dim, bn=False): + if bn is False: + return nn.GroupNorm(32, dim) + else: + return nn.BatchNorm2d(dim) + + +def fba_fusion(alpha, img, F, B): + F = alpha * img + (1 - alpha ** 2) * F - alpha * (1 - alpha) * B + B = (1 - alpha) * img + (2 * alpha - alpha ** 2) * B - alpha * (1 - alpha) * F + + F = torch.clamp(F, 0, 1) + B = torch.clamp(B, 0, 1) + la = 0.1 + alpha = (alpha * la + torch.sum((img - B) * (F - B), 1, keepdim=True)) / ( + torch.sum((F - B) * (F - B), 1, keepdim=True) + la + ) + alpha = torch.clamp(alpha, 0, 1) + return alpha, F, B + + +class fba_decoder(nn.Module): + def __init__(self, batch_norm=False): + super(fba_decoder, self).__init__() + pool_scales = (1, 2, 3, 6) + self.batch_norm = batch_norm + + self.ppm = [] + + for scale in pool_scales: + self.ppm.append( + nn.Sequential( + nn.AdaptiveAvgPool2d(scale), + L.Conv2d(2048, 256, kernel_size=1, bias=True), + norm(256, self.batch_norm), + nn.LeakyReLU(), + ), + ) + self.ppm = nn.ModuleList(self.ppm) + + self.conv_up1 = nn.Sequential( + L.Conv2d( + 2048 + len(pool_scales) * 256, 256, kernel_size=3, padding=1, bias=True, + ), + norm(256, self.batch_norm), + nn.LeakyReLU(), + L.Conv2d(256, 256, kernel_size=3, padding=1), + norm(256, self.batch_norm), + nn.LeakyReLU(), + ) + + self.conv_up2 = nn.Sequential( + L.Conv2d(256 + 256, 256, kernel_size=3, padding=1, bias=True), + norm(256, self.batch_norm), + nn.LeakyReLU(), + ) + if self.batch_norm: + d_up3 = 128 + else: + d_up3 = 64 + self.conv_up3 = nn.Sequential( + L.Conv2d(256 + d_up3, 64, kernel_size=3, padding=1, bias=True), + norm(64, self.batch_norm), + nn.LeakyReLU(), + ) + + self.unpool = nn.MaxUnpool2d(2, stride=2) + + self.conv_up4 = nn.Sequential( + nn.Conv2d(64 + 3 + 3 + 2, 32, kernel_size=3, padding=1, bias=True), + nn.LeakyReLU(), + nn.Conv2d(32, 16, kernel_size=3, padding=1, bias=True), + nn.LeakyReLU(), + nn.Conv2d(16, 7, kernel_size=1, padding=0, bias=True), + ) + + def forward(self, conv_out, img, indices, two_chan_trimap): + conv5 = conv_out[-1] + + input_size = conv5.size() + ppm_out = [conv5] + for pool_scale in self.ppm: + ppm_out.append( + nn.functional.interpolate( + pool_scale(conv5), + (input_size[2], input_size[3]), + mode="bilinear", + align_corners=False, + ), + ) + ppm_out = torch.cat(ppm_out, 1) + x = self.conv_up1(ppm_out) + + x = torch.nn.functional.interpolate( + x, scale_factor=2, mode="bilinear", align_corners=False, + ) + + x = torch.cat((x, conv_out[-4]), 1) + + x = self.conv_up2(x) + x = torch.nn.functional.interpolate( + x, scale_factor=2, mode="bilinear", align_corners=False, + ) + + x = torch.cat((x, conv_out[-5]), 1) + x = self.conv_up3(x) + + x = torch.nn.functional.interpolate( + x, scale_factor=2, mode="bilinear", align_corners=False, + ) + x = torch.cat((x, conv_out[-6][:, :3], img, two_chan_trimap), 1) + + output = self.conv_up4(x) + + alpha = torch.clamp(output[:, 0][:, None], 0, 1) + F = torch.sigmoid(output[:, 1:4]) + B = torch.sigmoid(output[:, 4:7]) + + # FBA Fusion + alpha, F, B = fba_fusion(alpha, img, F, B) + + output = torch.cat((alpha, F, B), 1) + + return output diff --git a/FBAMatting/networks/resnet_GN_WS.py b/FBAMatting/networks/resnet_GN_WS.py new file mode 100644 index 000000000..a88457ce0 --- /dev/null +++ b/FBAMatting/networks/resnet_GN_WS.py @@ -0,0 +1,146 @@ +import networks.layers_WS as L +import torch.nn as nn + +__all__ = ["ResNet", "l_resnet50"] + + +def conv3x3(in_planes, out_planes, stride=1): + """3x3 convolution with padding""" + return L.Conv2d( + in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False, + ) + + +def conv1x1(in_planes, out_planes, stride=1): + """1x1 convolution""" + return L.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False) + + +class BasicBlock(nn.Module): + expansion = 1 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(BasicBlock, self).__init__() + self.conv1 = conv3x3(inplanes, planes, stride) + self.bn1 = L.BatchNorm2d(planes) + self.relu = nn.ReLU(inplace=True) + self.conv2 = conv3x3(planes, planes) + self.bn2 = L.BatchNorm2d(planes) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + identity = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + out = self.relu(out) + + return out + + +class Bottleneck(nn.Module): + expansion = 4 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(Bottleneck, self).__init__() + self.conv1 = conv1x1(inplanes, planes) + self.bn1 = L.BatchNorm2d(planes) + self.conv2 = conv3x3(planes, planes, stride) + self.bn2 = L.BatchNorm2d(planes) + self.conv3 = conv1x1(planes, planes * self.expansion) + self.bn3 = L.BatchNorm2d(planes * self.expansion) + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + identity = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + out = self.relu(out) + + return out + + +class ResNet(nn.Module): + def __init__(self, block, layers, num_classes=1000): + super(ResNet, self).__init__() + self.inplanes = 64 + self.conv1 = L.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False) + self.bn1 = L.BatchNorm2d(64) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d( + kernel_size=3, stride=2, padding=1, return_indices=True, + ) + self.layer1 = self._make_layer(block, 64, layers[0]) + self.layer2 = self._make_layer(block, 128, layers[1], stride=2) + self.layer3 = self._make_layer(block, 256, layers[2], stride=2) + self.layer4 = self._make_layer(block, 512, layers[3], stride=2) + self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) + self.fc = nn.Linear(512 * block.expansion, num_classes) + + def _make_layer(self, block, planes, blocks, stride=1): + downsample = None + if stride != 1 or self.inplanes != planes * block.expansion: + downsample = nn.Sequential( + conv1x1(self.inplanes, planes * block.expansion, stride), + L.BatchNorm2d(planes * block.expansion), + ) + + layers = [] + layers.append(block(self.inplanes, planes, stride, downsample)) + self.inplanes = planes * block.expansion + for _ in range(1, blocks): + layers.append(block(self.inplanes, planes)) + + return nn.Sequential(*layers) + + def forward(self, x): + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + x = self.maxpool(x) + + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + x = self.layer4(x) + + x = self.avgpool(x) + x = x.view(x.size(0), -1) + x = self.fc(x) + + return x + + +def l_resnet50(pretrained=False, **kwargs): + """Constructs a ResNet-50 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) + return model diff --git a/FBAMatting/networks/resnet_bn.py b/FBAMatting/networks/resnet_bn.py new file mode 100644 index 000000000..a05dbb61c --- /dev/null +++ b/FBAMatting/networks/resnet_bn.py @@ -0,0 +1,165 @@ +import math + +import torch.nn as nn +from torch.nn import BatchNorm2d + +__all__ = ["ResNet"] + + +def conv3x3(in_planes, out_planes, stride=1): + "3x3 convolution with padding" + return nn.Conv2d( + in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False, + ) + + +class BasicBlock(nn.Module): + expansion = 1 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(BasicBlock, self).__init__() + self.conv1 = conv3x3(inplanes, planes, stride) + self.bn1 = BatchNorm2d(planes) + self.relu = nn.ReLU(inplace=True) + self.conv2 = conv3x3(planes, planes) + self.bn2 = BatchNorm2d(planes) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class Bottleneck(nn.Module): + expansion = 4 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(Bottleneck, self).__init__() + self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) + self.bn1 = BatchNorm2d(planes) + self.conv2 = nn.Conv2d( + planes, planes, kernel_size=3, stride=stride, padding=1, bias=False, + ) + self.bn2 = BatchNorm2d(planes, momentum=0.01) + self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False) + self.bn3 = BatchNorm2d(planes * 4) + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class ResNet(nn.Module): + def __init__(self, block, layers, num_classes=1000): + self.inplanes = 128 + super(ResNet, self).__init__() + self.conv1 = conv3x3(3, 64, stride=2) + self.bn1 = BatchNorm2d(64) + self.relu1 = nn.ReLU(inplace=True) + self.conv2 = conv3x3(64, 64) + self.bn2 = BatchNorm2d(64) + self.relu2 = nn.ReLU(inplace=True) + self.conv3 = conv3x3(64, 128) + self.bn3 = BatchNorm2d(128) + self.relu3 = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d( + kernel_size=3, stride=2, padding=1, return_indices=True, + ) + + self.layer1 = self._make_layer(block, 64, layers[0]) + self.layer2 = self._make_layer(block, 128, layers[1], stride=2) + self.layer3 = self._make_layer(block, 256, layers[2], stride=2) + self.layer4 = self._make_layer(block, 512, layers[3], stride=2) + self.avgpool = nn.AvgPool2d(7, stride=1) + self.fc = nn.Linear(512 * block.expansion, num_classes) + + for m in self.modules(): + if isinstance(m, nn.Conv2d): + n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels + m.weight.data.normal_(0, math.sqrt(2.0 / n)) + elif isinstance(m, BatchNorm2d): + m.weight.data.fill_(1) + m.bias.data.zero_() + + def _make_layer(self, block, planes, blocks, stride=1): + downsample = None + if stride != 1 or self.inplanes != planes * block.expansion: + downsample = nn.Sequential( + nn.Conv2d( + self.inplanes, + planes * block.expansion, + kernel_size=1, + stride=stride, + bias=False, + ), + BatchNorm2d(planes * block.expansion), + ) + + layers = [] + layers.append(block(self.inplanes, planes, stride, downsample)) + self.inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append(block(self.inplanes, planes)) + + return nn.Sequential(*layers) + + def forward(self, x): + x = self.relu1(self.bn1(self.conv1(x))) + x = self.relu2(self.bn2(self.conv2(x))) + x = self.relu3(self.bn3(self.conv3(x))) + x, indices = self.maxpool(x) + + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + x = self.layer4(x) + + x = self.avgpool(x) + x = x.view(x.size(0), -1) + x = self.fc(x) + return x + + +def l_resnet50(): + """Constructs a ResNet-50 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(Bottleneck, [3, 4, 6, 3]) + return model diff --git a/FBAMatting/networks/transforms.py b/FBAMatting/networks/transforms.py new file mode 100644 index 000000000..a058b76ec --- /dev/null +++ b/FBAMatting/networks/transforms.py @@ -0,0 +1,58 @@ +import cv2 +import numpy as np +import torch + + +def dt(a): + return cv2.distanceTransform((a * 255).astype(np.uint8), cv2.DIST_L2, 0) + + +def trimap_transform(trimap): + h, w = trimap.shape[0], trimap.shape[1] + + clicks = np.zeros((h, w, 6)) + for k in range(2): + if np.count_nonzero(trimap[:, :, k]) > 0: + dt_mask = -dt(1 - trimap[:, :, k]) ** 2 + L = 320 + clicks[:, :, 3 * k] = np.exp(dt_mask / (2 * ((0.02 * L) ** 2))) + clicks[:, :, 3 * k + 1] = np.exp(dt_mask / (2 * ((0.08 * L) ** 2))) + clicks[:, :, 3 * k + 2] = np.exp(dt_mask / (2 * ((0.16 * L) ** 2))) + + return clicks + + +# For RGB ! +group_norm_std = [0.229, 0.224, 0.225] +group_norm_mean = [0.485, 0.456, 0.406] + + +def groupnorm_normalise_image(img, format="nhwc"): + """ + Accept rgb in range 0,1 + """ + if format == "nhwc": + for i in range(3): + img[..., i] = (img[..., i] - group_norm_mean[i]) / group_norm_std[i] + else: + for i in range(3): + img[..., i, :, :] = ( + img[..., i, :, :] - group_norm_mean[i] + ) / group_norm_std[i] + + return img + + +def groupnorm_denormalise_image(img, format="nhwc"): + """ + Accept rgb, normalised, return in range 0,1 + """ + if format == "nhwc": + for i in range(3): + img[:, :, :, i] = img[:, :, :, i] * group_norm_std[i] + group_norm_mean[i] + else: + img1 = torch.zeros_like(img).cuda() + for i in range(3): + img1[:, i, :, :] = img[:, i, :, :] * group_norm_std[i] + group_norm_mean[i] + return img1 + return img diff --git a/FBAMatting/requirements.txt b/FBAMatting/requirements.txt new file mode 100644 index 000000000..daae3822a --- /dev/null +++ b/FBAMatting/requirements.txt @@ -0,0 +1,6 @@ +numpy==1.18.4 +opencv-python==4.2.0.34 +six==1.15.0 +torch==1.5.1 +torchvision==0.6.0 +tqdm==4.46.0 diff --git a/FPS/frame_rate.cpp b/FPS/frame_rate.cpp index 2552f58a8..bfefe8a5e 100644 --- a/FPS/frame_rate.cpp +++ b/FPS/frame_rate.cpp @@ -9,23 +9,22 @@ int main(int argc, char** argv) // Start default camera VideoCapture video(0); - + // With webcam get(CV_CAP_PROP_FPS) does not work. // Let's see for ourselves. - - double fps = video.get(CV_CAP_PROP_FPS); + + double fps = video.get(cv::CAP_PROP_FPS); // If you do not care about backward compatibility // You can use the following instead for OpenCV 3 // double fps = video.get(CAP_PROP_FPS); cout << "Frames per second using video.get(CV_CAP_PROP_FPS) : " << fps << endl; - // Number of frames to capture int num_frames = 120; - + // Start and end times time_t start, end; - + // Variable for storing video frames Mat frame; @@ -33,24 +32,24 @@ int main(int argc, char** argv) // Start time time(&start); - + // Grab a few frames for(int i = 0; i < num_frames; i++) { video >> frame; } - + // End Time time(&end); - + // Time elapsed double seconds = difftime (end, start); cout << "Time taken : " << seconds << " seconds" << endl; - + // Calculate frames per second fps = num_frames / seconds; cout << "Estimated frames per second : " << fps << endl; - + // Release video video.release(); return 0; diff --git a/FaceDetectionComparison/CMakeLists.txt b/FaceDetectionComparison/CMakeLists.txt index ce1db29a9..d568217ba 100644 --- a/FaceDetectionComparison/CMakeLists.txt +++ b/FaceDetectionComparison/CMakeLists.txt @@ -1,20 +1,44 @@ cmake_minimum_required(VERSION 2.8.12) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) PROJECT(face_detection) find_package( OpenCV REQUIRED ) +message(STATUS "OpenCV library status:") +message(STATUS " config: ${OpenCV_DIR}") +message(STATUS " version: ${OpenCV_VERSION}") +message(STATUS " libraries: ${OpenCV_LIBS}") +message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}") + include_directories( ${OpenCV_INCLUDE_DIRS}) -include(./dlib/dlib/cmake) +find_package(dlib QUIET) +if(dlib_FOUND) + message(STATUS "Found system linstance of DLib") +else() + message(STATUS "Use own instance of DLib") + set(dlib_FOUND 1) + include(./dlib/dlib/cmake) +endif() MACRO(add_example name) ADD_EXECUTABLE(${name} ${name}.cpp) - TARGET_LINK_LIBRARIES(${name} ${OpenCV_LIBS} dlib::dlib) + TARGET_LINK_LIBRARIES(${name} ${OpenCV_LIBS}) + IF(dlib_FOUND) + TARGET_LINK_LIBRARIES(${name} dlib::dlib) + ENDIF() ENDMACRO() add_example(face_detection_opencv_haar) -add_example(face_detection_opencv_dnn) -add_example(face_detection_dlib_hog) -add_example(face_detection_dlib_mmod) +if(${OpenCV_VERSION} VERSION_GREATER 3.4) + add_example(face_detection_opencv_dnn) +endif() + +if(dlib_FOUND AND ${OpenCV_VERSION} VERSION_LESS 3.0) + add_example(face_detection_dlib_hog) + add_example(face_detection_dlib_mmod) +endif() + add_example(run-all) diff --git a/FaceDetectionComparison/README.md b/FaceDetectionComparison/README.md index f112ec313..dda364ecc 100644 --- a/FaceDetectionComparison/README.md +++ b/FaceDetectionComparison/README.md @@ -1,42 +1,130 @@ -There are 10 code files in this repo - 5 for C++ and 5 for Python +There are 10 code files in this repo - 5 for C++ and 5 for Python: + 1. face_detection_opencv_haar.cpp and face_detection_opencv_haar.py - For Haar based face detection 2. face_detection_opencv_dnn.cpp and face_detection_opencv_dnn.py - For OpenCV DNN based face detection 3. face_detection_dlib_hog.cpp and face_detection_dlib_hog.py - for dlib hog based face detection 4. face_detection_dlib_mmod.cpp and face_detection_dlib_mmod.py - for dlib mmod based face detection 5. run-all.cpp and run-all.py - for running all the 4 together - First of all Unzip the dlib.zip file ## For C++ + **Compile** -cmake . + +Add path to the properly build OpenCV with DNN GPU Support and your CUDA: + +``` +cmake -D OpenCV_DIR=~/opencv -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda/ . make +``` + +## For Python + +_Note_: Our code is tested using Python 3.7.5, but it should also work with any other python3.x. + +Install virtualenv: + +``` +pip install virtualenv +``` + +Create new virtual environment `env` and activate it: + +``` +python -m venv env +source env/bin/activate +``` + +Install numpy: + +``` +pip install numpy +``` + +Install dlib: + +``` +pip install dlib +``` + +Create symlink to the properly build OpenCV with DNN GPU Support: + +``` +cd env/lib/python3.x/site-packages/ +ln -s ~/opencv/build/cv2.so cv2.so +``` ## Run -**If you dont give any filename, it will use the webcam** + +**If you don't pass any filename, it will use the web cam** ### For individual face detectors + **C++** + +``` ./face_detection_XXXX +``` + +_Note:_ for `face_detection_opencv_dnn.cpp` you can pass up to 3 arguments: + +- video filename, if you'd like to run inference on a video instead of a camera: + +``` +./face_detection_opencv_dnn.out +``` + +- device, if you want to use CPU instead of CPU: + +``` +./face_detection_opencv_dnn.out "" cpu +``` + +- framework to specify Caffe (caffe) or TensorFlow (tf) network to use. Caffe network is set by default: + +``` +./face_detection_opencv_dnn.out "" gpu tf +``` **Python** -python face_detection_XXXX.py + +``` +python face_detection_XXXX.py -video +``` + +_Note:_ for `face_detection_opencv_dnn.py` you can pass up to 3 arguments: + +- filename, if you'd like to run inference on a video instead of a camera: + +``` +python face_detection_opencv_dnn.out --video +``` + +- device, if you want to use CPU instead of GPU: + +``` +python face_detection_opencv_dnn.out --video --device cpu +``` + +- framework to specify Caffe (caffe) or TensorFlow (tf) network to use. Caffe network is set by default: + +``` +python face_detection_opencv_dnn.out --video --device cpu --framework tf +``` ### For running all together -**C++** -./run-all -**Python** -run-all.py +**C++** ./run-all +**Python** python run-all.py --video # AI Courses by OpenCV -Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. -

+

diff --git a/FaceDetectionComparison/dlib.zip b/FaceDetectionComparison/dlib.zip index 6cf8d434b..a0ff7aab1 100644 Binary files a/FaceDetectionComparison/dlib.zip and b/FaceDetectionComparison/dlib.zip differ diff --git a/FaceDetectionComparison/face_detection_dlib_hog.cpp b/FaceDetectionComparison/face_detection_dlib_hog.cpp index e6e8a4ae6..69a1903ba 100644 --- a/FaceDetectionComparison/face_detection_dlib_hog.cpp +++ b/FaceDetectionComparison/face_detection_dlib_hog.cpp @@ -36,44 +36,49 @@ void detectFaceDlibHog(frontal_face_detector hogFaceDetector, Mat &frameDlibHog, for ( size_t i = 0; i < faceRects.size(); i++ ) { - int x1 = (int)(faceRects[i].left() * scaleWidth); - int y1 = (int)(faceRects[i].top() * scaleHeight); - int x2 = (int)(faceRects[i].right() * scaleWidth); - int y2 = (int)(faceRects[i].bottom() * scaleHeight); - cv::rectangle(frameDlibHog, Point(x1, y1), Point(x2, y2), Scalar(0,255,0), (int)(frameHeight/150.0), 4); + int x1 = (int)(faceRects[i].left() * scaleWidth); + int y1 = (int)(faceRects[i].top() * scaleHeight); + int x2 = (int)(faceRects[i].right() * scaleWidth); + int y2 = (int)(faceRects[i].bottom() * scaleHeight); + cv::rectangle(frameDlibHog, Point(x1, y1), Point(x2, y2), Scalar(0,255,0), (int)(frameHeight/150.0), 4); } } + int main( int argc, const char** argv ) { - frontal_face_detector hogFaceDetector = get_frontal_face_detector(); - - VideoCapture source; - if (argc == 1) - source.open(0); - else - source.open(argv[1]); - Mat frame; - - double tt_dlibHog = 0; - double fpsDlibHog = 0; - while(1) - { - source >> frame; - if(frame.empty()) - break; - - double t = cv::getTickCount(); - detectFaceDlibHog ( hogFaceDetector, frame ); - tt_dlibHog = ((double)cv::getTickCount() - t)/cv::getTickFrequency(); - fpsDlibHog = 1/tt_dlibHog; - putText(frame, format("DLIB HoG ; FPS = %.2f",fpsDlibHog), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.4, Scalar(0, 0, 255), 4); - imshow( "DLIB - HoG Face Detection", frame ); - int k = waitKey(5); - if(k == 27) - { - destroyAllWindows(); - break; + frontal_face_detector hogFaceDetector = get_frontal_face_detector(); + + VideoCapture source; + if (argc == 1) + source.open(0, CAP_V4L); + else + source.open(argv[1]); + + Mat frame; + + double tt_dlibHog = 0; + double fpsDlibHog = 0; + + while (true) + { + source >> frame; + if (frame.empty()) + break; + + double t = cv::getTickCount(); + detectFaceDlibHog(hogFaceDetector, frame); + tt_dlibHog = ((double)cv::getTickCount() - t)/cv::getTickFrequency(); + fpsDlibHog = 1/tt_dlibHog; + + putText(frame, format("DLIB HoG; FPS = %.2f",fpsDlibHog), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.3, Scalar(0, 0, 255), 4); + imshow("DLIB - HoG Face Detection", frame); + + int k = waitKey(5); + if(k == 27) + { + destroyAllWindows(); + break; + } } - } } diff --git a/FaceDetectionComparison/face_detection_dlib_hog.py b/FaceDetectionComparison/face_detection_dlib_hog.py index 71639ecb0..a1aecd6b2 100644 --- a/FaceDetectionComparison/face_detection_dlib_hog.py +++ b/FaceDetectionComparison/face_detection_dlib_hog.py @@ -1,8 +1,10 @@ -from __future__ import division +import argparse +import os +import time + import cv2 import dlib -import time -import sys + def detectFaceDlibHog(detector, frame, inHeight=300, inWidth=0): @@ -10,7 +12,7 @@ def detectFaceDlibHog(detector, frame, inHeight=300, inWidth=0): frameHeight = frameDlibHog.shape[0] frameWidth = frameDlibHog.shape[1] if not inWidth: - inWidth = int((frameWidth / frameHeight)*inHeight) + inWidth = int((frameWidth / frameHeight) * inHeight) scaleHeight = frameHeight / inHeight scaleWidth = frameWidth / inWidth @@ -23,48 +25,89 @@ def detectFaceDlibHog(detector, frame, inHeight=300, inWidth=0): bboxes = [] for faceRect in faceRects: - cvRect = [int(faceRect.left()*scaleWidth), int(faceRect.top()*scaleHeight), - int(faceRect.right()*scaleWidth), int(faceRect.bottom()*scaleHeight) ] + cvRect = [ + int(faceRect.left() * scaleWidth), + int(faceRect.top() * scaleHeight), + int(faceRect.right() * scaleWidth), + int(faceRect.bottom() * scaleHeight), + ] bboxes.append(cvRect) - cv2.rectangle(frameDlibHog, (cvRect[0], cvRect[1]), (cvRect[2], cvRect[3]), (0, 255, 0), int(round(frameHeight/150)), 4) + cv2.rectangle( + frameDlibHog, + (cvRect[0], cvRect[1]), + (cvRect[2], cvRect[3]), + (0, 255, 0), + int(round(frameHeight / 150)), + 4, + ) return frameDlibHog, bboxes -if __name__ == "__main__" : + +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description="Face detection") + parser.add_argument("--video", type=str, default="", help="Path to video file") + args = parser.parse_args() + + source = args.video hogFaceDetector = dlib.get_frontal_face_detector() - source = 0 - if len(sys.argv) > 1: - source = sys.argv[1] + outputFolder = "output-hog-videos" + if not os.path.exists(outputFolder): + os.makedirs(outputFolder) - cap = cv2.VideoCapture(source) + if source: + cap = cv2.VideoCapture(source) + outputFile = os.path.basename(source)[:-4] + ".avi" + else: + cap = cv2.VideoCapture(0, cv2.CAP_V4L) + outputFile = "grabbed_from_camera.avi" hasFrame, frame = cap.read() - vid_writer = cv2.VideoWriter('output-hog-{}.avi'.format(str(source).split(".")[0]),cv2.VideoWriter_fourcc('M','J','P','G'), 15, (frame.shape[1],frame.shape[0])) + vid_writer = cv2.VideoWriter( + os.path.join(outputFolder, outputFile), + cv2.VideoWriter_fourcc("M", "J", "P", "G"), + 15, + (frame.shape[1], frame.shape[0]), + ) frame_count = 0 tt_dlibHog = 0 - while(1): + + while True: hasFrame, frame = cap.read() if not hasFrame: break - frame_count += 1 + frame_count += 1 t = time.time() - outDlibHog, bboxes = detectFaceDlibHog(hogFaceDetector,frame) + + outDlibHog, bboxes = detectFaceDlibHog(hogFaceDetector, frame) tt_dlibHog += time.time() - t fpsDlibHog = frame_count / tt_dlibHog - label = "DLIB HoG ; ; FPS : {:.2f}".format(fpsDlibHog) - cv2.putText(outDlibHog, label, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, cv2.LINE_AA) + label = "DLIB HoG; FPS : {:.2f}".format(fpsDlibHog) + cv2.putText( + outDlibHog, + label, + (10, 50), + cv2.FONT_HERSHEY_SIMPLEX, + 1.3, + (0, 0, 255), + 3, + cv2.LINE_AA, + ) cv2.imshow("Face Detection Comparison", outDlibHog) vid_writer.write(outDlibHog) + if frame_count == 1: tt_dlibHog = 0 - k = cv2.waitKey(10) + k = cv2.waitKey(5) if k == 27: break + cv2.destroyAllWindows() vid_writer.release() diff --git a/FaceDetectionComparison/face_detection_dlib_mmod.cpp b/FaceDetectionComparison/face_detection_dlib_mmod.cpp index a73d1e788..c4e55c9f6 100644 --- a/FaceDetectionComparison/face_detection_dlib_mmod.cpp +++ b/FaceDetectionComparison/face_detection_dlib_mmod.cpp @@ -50,46 +50,49 @@ void detectFaceDlibMMOD(net_type mmodFaceDetector, Mat &frameDlibMmod, int inHei for ( size_t i = 0; i < faceRects.size(); i++ ) { - int x1 = (int)(faceRects[i].rect.left() * scaleWidth); - int y1 = (int)(faceRects[i].rect.top() * scaleHeight); - int x2 = (int)(faceRects[i].rect.right() * scaleWidth); - int y2 = (int)(faceRects[i].rect.bottom() * scaleHeight); - cv::rectangle(frameDlibMmod, Point(x1, y1), Point(x2, y2), Scalar(0,255,0), (int)(frameHeight/150.0), 4); + int x1 = (int)(faceRects[i].rect.left() * scaleWidth); + int y1 = (int)(faceRects[i].rect.top() * scaleHeight); + int x2 = (int)(faceRects[i].rect.right() * scaleWidth); + int y2 = (int)(faceRects[i].rect.bottom() * scaleHeight); + cv::rectangle(frameDlibMmod, Point(x1, y1), Point(x2, y2), Scalar(0,255,0), (int)(frameHeight/150.0), 4); } } int main( int argc, const char** argv ) { - String mmodModelPath = "./mmod_human_face_detector.dat"; - net_type mmodFaceDetector; - deserialize(mmodModelPath) >> mmodFaceDetector; - - VideoCapture source; - if (argc == 1) - source.open(0); - else - source.open(argv[1]); - Mat frame; - - double tt_dlibMmod = 0; - double fpsDlibMmod = 0; - while(1) - { - source >> frame; - if(frame.empty()) - break; - - double t = cv::getTickCount(); - detectFaceDlibMMOD ( mmodFaceDetector, frame ); - tt_dlibMmod = ((double)cv::getTickCount() - t)/cv::getTickFrequency(); - fpsDlibMmod = 1/tt_dlibMmod; - putText(frame, format("DLIB MMOD ; FPS = %.2f",fpsDlibMmod), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.4, Scalar(0, 0, 255), 4); - imshow( "DLIB - MMOD Face Detection", frame ); - int k = waitKey(5); - if(k == 27) - { - destroyAllWindows(); - break; - } + String mmodModelPath = "models/mmod_human_face_detector.dat"; + net_type mmodFaceDetector; + deserialize(mmodModelPath) >> mmodFaceDetector; + + VideoCapture source; + if (argc == 1) + source.open(0, CAP_V4L); + else + source.open(argv[1]); + + Mat frame; + + double tt_dlibMmod = 0; + double fpsDlibMmod = 0; + while (true) + { + source >> frame; + if (frame.empty()) + break; + + double t = cv::getTickCount(); + detectFaceDlibMMOD ( mmodFaceDetector, frame ); + tt_dlibMmod = ((double)cv::getTickCount() - t)/cv::getTickFrequency(); + fpsDlibMmod = 1/tt_dlibMmod; + + putText(frame, format("DLIB MMOD; FPS = %.2f",fpsDlibMmod), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.3, Scalar(0, 0, 255), 4); + imshow("DLIB - MMOD Face Detection", frame); + + int k = waitKey(5); + if(k == 27) + { + destroyAllWindows(); + break; + } } } diff --git a/FaceDetectionComparison/face_detection_dlib_mmod.py b/FaceDetectionComparison/face_detection_dlib_mmod.py index f652cb074..001f9c5dd 100644 --- a/FaceDetectionComparison/face_detection_dlib_mmod.py +++ b/FaceDetectionComparison/face_detection_dlib_mmod.py @@ -1,8 +1,10 @@ -from __future__ import division +import argparse +import os +import time + import cv2 import dlib -import time -import sys + def detectFaceDlibMMOD(detector, frame, inHeight=300, inWidth=0): @@ -10,7 +12,7 @@ def detectFaceDlibMMOD(detector, frame, inHeight=300, inWidth=0): frameHeight = frameDlibMMOD.shape[0] frameWidth = frameDlibMMOD.shape[1] if not inWidth: - inWidth = int((frameWidth / frameHeight)*inHeight) + inWidth = int((frameWidth / frameHeight) * inHeight) scaleHeight = frameHeight / inHeight scaleWidth = frameWidth / inWidth @@ -23,49 +25,93 @@ def detectFaceDlibMMOD(detector, frame, inHeight=300, inWidth=0): print(frameWidth, frameHeight, inWidth, inHeight) bboxes = [] for faceRect in faceRects: - cvRect = [int(faceRect.rect.left()*scaleWidth), int(faceRect.rect.top()*scaleHeight), - int(faceRect.rect.right()*scaleWidth), int(faceRect.rect.bottom()*scaleHeight) ] + cvRect = [ + int(faceRect.rect.left() * scaleWidth), + int(faceRect.rect.top() * scaleHeight), + int(faceRect.rect.right() * scaleWidth), + int(faceRect.rect.bottom() * scaleHeight), + ] bboxes.append(cvRect) - cv2.rectangle(frameDlibMMOD, (cvRect[0], cvRect[1]), (cvRect[2], cvRect[3]), (0, 255, 0), int(round(frameHeight/150)), 4) + cv2.rectangle( + frameDlibMMOD, + (cvRect[0], cvRect[1]), + (cvRect[2], cvRect[3]), + (0, 255, 0), + int(round(frameHeight / 150)), + 4, + ) return frameDlibMMOD, bboxes -if __name__ == "__main__" : - source = 0 - if len(sys.argv) > 1: - source = sys.argv[1] +if __name__ == "__main__": - cap = cv2.VideoCapture(source) - hasFrame, frame = cap.read() + parser = argparse.ArgumentParser(description="Face detection") + parser.add_argument("--video", type=str, default="", help="Path to video file") + args = parser.parse_args() + + source = args.video + + mmodFaceDetector = dlib.cnn_face_detection_model_v1( + "models/mmod_human_face_detector.dat", + ) + + outputFolder = "output-mmod-videos" + if not os.path.exists(outputFolder): + os.makedirs(outputFolder) - dnnFaceDetector = dlib.cnn_face_detection_model_v1("./mmod_human_face_detector.dat") + if source: + cap = cv2.VideoCapture(source) + outputFile = os.path.basename(source)[:-4] + ".avi" + else: + cap = cv2.VideoCapture(0, cv2.CAP_V4L) + outputFile = "grabbed_from_camera.avi" - vid_writer = cv2.VideoWriter('output-mmod-{}.avi'.format(str(source).split(".")[0]),cv2.VideoWriter_fourcc('M','J','P','G'), 15, (frame.shape[1],frame.shape[0])) + hasFrame, frame = cap.read() + + vid_writer = cv2.VideoWriter( + os.path.join(outputFolder, outputFile), + cv2.VideoWriter_fourcc("M", "J", "P", "G"), + 15, + (frame.shape[1], frame.shape[0]), + ) frame_count = 0 tt_dlibMmod = 0 - while(1): + + while True: hasFrame, frame = cap.read() if not hasFrame: break - frame_count += 1 + frame_count += 1 t = time.time() - outDlibMMOD, bboxes = detectFaceDlibMMOD(dnnFaceDetector,frame) + + outDlibMMOD, bboxes = detectFaceDlibMMOD(mmodFaceDetector, frame) tt_dlibMmod += time.time() - t fpsDlibMmod = frame_count / tt_dlibMmod - label = "DLIB MMOD ; FPS : {:.2f}".format(fpsDlibMmod) - cv2.putText(outDlibMMOD, label, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, cv2.LINE_AA) + label = "DLIB MMOD; FPS : {:.2f}".format(fpsDlibMmod) + cv2.putText( + outDlibMMOD, + label, + (10, 50), + cv2.FONT_HERSHEY_SIMPLEX, + 1.3, + (0, 0, 255), + 3, + cv2.LINE_AA, + ) cv2.imshow("Face Detection Comparison", outDlibMMOD) vid_writer.write(outDlibMMOD) + if frame_count == 1: tt_dlibMmod = 0 - k = cv2.waitKey(10) + k = cv2.waitKey(5) if k == 27: break + cv2.destroyAllWindows() vid_writer.release() diff --git a/FaceDetectionComparison/face_detection_opencv_dnn.cpp b/FaceDetectionComparison/face_detection_opencv_dnn.cpp index 5b8e08f59..4cea900b4 100644 --- a/FaceDetectionComparison/face_detection_opencv_dnn.cpp +++ b/FaceDetectionComparison/face_detection_opencv_dnn.cpp @@ -6,10 +6,11 @@ #include #include #include +#include using namespace cv; -using namespace std; using namespace cv::dnn; +using namespace std; const size_t inWidth = 300; const size_t inHeight = 300; @@ -17,23 +18,22 @@ const double inScaleFactor = 1.0; const float confidenceThreshold = 0.7; const cv::Scalar meanVal(104.0, 177.0, 123.0); -#define CAFFE +const std::string caffeConfigFile = "models/deploy.prototxt"; +const std::string caffeWeightFile = "models/res10_300x300_ssd_iter_140000_fp16.caffemodel"; -const std::string caffeConfigFile = "./models/deploy.prototxt"; -const std::string caffeWeightFile = "./models/res10_300x300_ssd_iter_140000_fp16.caffemodel"; +const std::string tensorflowConfigFile = "models/opencv_face_detector.pbtxt"; +const std::string tensorflowWeightFile = "models/opencv_face_detector_uint8.pb"; -const std::string tensorflowConfigFile = "./models/opencv_face_detector.pbtxt"; -const std::string tensorflowWeightFile = "./models/opencv_face_detector_uint8.pb"; - -void detectFaceOpenCVDNN(Net net, Mat &frameOpenCVDNN) +void detectFaceOpenCVDNN(Net net, Mat &frameOpenCVDNN, string framework) { int frameHeight = frameOpenCVDNN.rows; int frameWidth = frameOpenCVDNN.cols; -#ifdef CAFFE - cv::Mat inputBlob = cv::dnn::blobFromImage(frameOpenCVDNN, inScaleFactor, cv::Size(inWidth, inHeight), meanVal, false, false); -#else - cv::Mat inputBlob = cv::dnn::blobFromImage(frameOpenCVDNN, inScaleFactor, cv::Size(inWidth, inHeight), meanVal, true, false); -#endif + + cv::Mat inputBlob; + if (framework == "caffe") + inputBlob = cv::dnn::blobFromImage(frameOpenCVDNN, inScaleFactor, cv::Size(inWidth, inHeight), meanVal, false, false); + else + inputBlob = cv::dnn::blobFromImage(frameOpenCVDNN, inScaleFactor, cv::Size(inWidth, inHeight), meanVal, true, false); net.setInput(inputBlob, "data"); cv::Mat detection = net.forward("detection_out"); @@ -60,37 +60,102 @@ void detectFaceOpenCVDNN(Net net, Mat &frameOpenCVDNN) int main( int argc, const char** argv ) { -#ifdef CAFFE - Net net = cv::dnn::readNetFromCaffe(caffeConfigFile, caffeWeightFile); + string videoFileName; + string device; + string framework; + + // Take arguments from command line + if (argc == 4) + { + videoFileName = argv[1]; + device = argv[2]; + framework = argv[3]; + } + else if (argc == 3) + { + videoFileName = argv[1]; + device = argv[2]; + framework = "caffe"; + } + else if (argc == 2) + { + videoFileName = argv[1]; + device = "cpu"; + framework = "caffe"; + } + else + { + videoFileName = ""; + device = "cpu"; + framework = "caffe"; + } + + boost::to_upper(device); + cout << "Configuration:" << endl; + cout << "Device - "<< device << endl; + if (framework == "caffe") + cout << "Network type - Caffe" << endl; + else + cout << "Network type - TensorFlow" << endl; + if (videoFileName == "") + cout << "No video found, using camera stream" << endl; + else + cout << "Video file - " << videoFileName << endl; + + Net net; + + if (framework == "caffe") + net = cv::dnn::readNetFromCaffe(caffeConfigFile, caffeWeightFile); + else + net = cv::dnn::readNetFromTensorflow(tensorflowWeightFile, tensorflowConfigFile); + +#if (CV_MAJOR_VERSION >= 4) + if (device == "CPU") + { + net.setPreferableBackend(DNN_TARGET_CPU); + } + else + { + net.setPreferableBackend(DNN_BACKEND_CUDA); + net.setPreferableTarget(DNN_TARGET_CUDA); + } #else - Net net = cv::dnn::readNetFromTensorflow(tensorflowWeightFile, tensorflowConfigFile); + // force CPU backend for OpenCV 3.x as CUDA backend is not supported there + net.setPreferableBackend(DNN_BACKEND_DEFAULT); + device = "cpu"; #endif - VideoCapture source; - if (argc == 1) - source.open(0); - else - source.open(argv[1]); - Mat frame; - - double tt_opencvDNN = 0; - double fpsOpencvDNN = 0; - while(1) - { - source >> frame; - if(frame.empty()) - break; - double t = cv::getTickCount(); - detectFaceOpenCVDNN ( net, frame ); - tt_opencvDNN = ((double)cv::getTickCount() - t)/cv::getTickFrequency(); - fpsOpencvDNN = 1/tt_opencvDNN; - putText(frame, format("OpenCV DNN ; FPS = %.2f",fpsOpencvDNN), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.4, Scalar(0, 0, 255), 4); - imshow( "OpenCV - DNN Face Detection", frame ); - int k = waitKey(5); - if(k == 27) - { - destroyAllWindows(); - break; - } + cv::VideoCapture source; + if (videoFileName != "") + source.open(videoFileName); + else + source.open(0, CAP_V4L); + + Mat frame; + + double tt_opencvDNN = 0; + double fpsOpencvDNN = 0; + + while (true) + { + source >> frame; + if (frame.empty()) + break; + + double t = cv::getTickCount(); + detectFaceOpenCVDNN(net, frame, framework); + tt_opencvDNN = ((double)cv::getTickCount() - t)/cv::getTickFrequency(); + fpsOpencvDNN = 1/tt_opencvDNN; + + putText(frame, format("OpenCV DNN %s FPS = %.2f", device.c_str(), fpsOpencvDNN), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.3, Scalar(0, 0, 255), 4); + + imshow("OpenCV - DNN Face Detection", frame); + + int k = waitKey(5); + if(k == 27) + { + destroyAllWindows(); + break; + } } } diff --git a/FaceDetectionComparison/face_detection_opencv_dnn.py b/FaceDetectionComparison/face_detection_opencv_dnn.py index 319084da9..23229fb41 100644 --- a/FaceDetectionComparison/face_detection_opencv_dnn.py +++ b/FaceDetectionComparison/face_detection_opencv_dnn.py @@ -1,13 +1,22 @@ -from __future__ import division -import cv2 +import argparse +import os import time -import sys -def detectFaceOpenCVDnn(net, frame): +import cv2 + + +def detectFaceOpenCVDnn(net, frame, framework="caffe", conf_threshold=0.7): frameOpencvDnn = frame.copy() frameHeight = frameOpencvDnn.shape[0] frameWidth = frameOpencvDnn.shape[1] - blob = cv2.dnn.blobFromImage(frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], False, False) + if framework == "caffe": + blob = cv2.dnn.blobFromImage( + frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], False, False, + ) + else: + blob = cv2.dnn.blobFromImage( + frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], True, False, + ) net.setInput(blob) detections = net.forward() @@ -20,16 +29,46 @@ def detectFaceOpenCVDnn(net, frame): x2 = int(detections[0, 0, i, 5] * frameWidth) y2 = int(detections[0, 0, i, 6] * frameHeight) bboxes.append([x1, y1, x2, y2]) - cv2.rectangle(frameOpencvDnn, (x1, y1), (x2, y2), (0, 255, 0), int(round(frameHeight/150)), 8) + cv2.rectangle( + frameOpencvDnn, + (x1, y1), + (x2, y2), + (0, 255, 0), + int(round(frameHeight / 150)), + 8, + ) return frameOpencvDnn, bboxes -if __name__ == "__main__" : + +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description="Face detection") + parser.add_argument("--video", type=str, default="", help="Path to video file") + parser.add_argument( + "--device", + type=str, + default="cpu", + choices=["cpu", "gpu"], + help="Device to use", + ) + parser.add_argument( + "--framework", + type=str, + default="caffe", + choices=["caffe", "tf"], + help="Type of network to run", + ) + args = parser.parse_args() + + framework = args.framework + source = args.video + device = args.device # OpenCV DNN supports 2 networks. - # 1. FP16 version of the original caffe implementation ( 5.4 MB ) - # 2. 8 bit Quantized version using Tensorflow ( 2.7 MB ) - DNN = "TF" - if DNN == "CAFFE": + # 1. FP16 version of the original Caffe implementation ( 5.4 MB ) + # 2. 8 bit Quantized version using TensorFlow ( 2.7 MB ) + + if framework == "caffe": modelFile = "models/res10_300x300_ssd_iter_140000_fp16.caffemodel" configFile = "models/deploy.prototxt" net = cv2.dnn.readNetFromCaffe(configFile, modelFile) @@ -38,40 +77,69 @@ def detectFaceOpenCVDnn(net, frame): configFile = "models/opencv_face_detector.pbtxt" net = cv2.dnn.readNetFromTensorflow(modelFile, configFile) - conf_threshold = 0.7 + if device == "cpu": + net.setPreferableBackend(cv2.dnn.DNN_TARGET_CPU) + else: + net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) + net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) - source = 0 - if len(sys.argv) > 1: - source = sys.argv[1] + outputFolder = "output-dnn-videos" + if not os.path.exists(outputFolder): + os.makedirs(outputFolder) + + if source: + cap = cv2.VideoCapture(source) + outputFile = os.path.basename(source)[:-4] + ".avi" + else: + cap = cv2.VideoCapture(0, cv2.CAP_V4L) + outputFile = "grabbed_from_camera.avi" - cap = cv2.VideoCapture(source) hasFrame, frame = cap.read() - vid_writer = cv2.VideoWriter('output-dnn-{}.avi'.format(str(source).split(".")[0]),cv2.VideoWriter_fourcc('M','J','P','G'), 15, (frame.shape[1],frame.shape[0])) + vid_writer = cv2.VideoWriter( + os.path.join(outputFolder, outputFile), + cv2.VideoWriter_fourcc("M", "J", "P", "G"), + 15, + (frame.shape[1], frame.shape[0]), + ) frame_count = 0 tt_opencvDnn = 0 - while(1): + + while True: hasFrame, frame = cap.read() if not hasFrame: break - frame_count += 1 + frame_count += 1 t = time.time() - outOpencvDnn, bboxes = detectFaceOpenCVDnn(net,frame) + + outOpencvDnn, bboxes = detectFaceOpenCVDnn(net, frame) tt_opencvDnn += time.time() - t fpsOpencvDnn = frame_count / tt_opencvDnn - label = "OpenCV DNN ; FPS : {:.2f}".format(fpsOpencvDnn) - cv2.putText(outOpencvDnn, label, (10,50), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, cv2.LINE_AA) + + label = "OpenCV DNN {} FPS : {:.2f}".format(device.upper(), fpsOpencvDnn) + cv2.putText( + outOpencvDnn, + label, + (10, 50), + cv2.FONT_HERSHEY_SIMPLEX, + 1.3, + (0, 0, 255), + 3, + cv2.LINE_AA, + ) cv2.imshow("Face Detection Comparison", outOpencvDnn) vid_writer.write(outOpencvDnn) + if frame_count == 1: tt_opencvDnn = 0 - k = cv2.waitKey(10) + k = cv2.waitKey(5) if k == 27: break + cv2.destroyAllWindows() vid_writer.release() diff --git a/FaceDetectionComparison/face_detection_opencv_haar.cpp b/FaceDetectionComparison/face_detection_opencv_haar.cpp index 67fc49ee9..dc71cefd1 100644 --- a/FaceDetectionComparison/face_detection_opencv_haar.cpp +++ b/FaceDetectionComparison/face_detection_opencv_haar.cpp @@ -43,35 +43,42 @@ void detectFaceOpenCVHaar(CascadeClassifier faceCascade, Mat &frameOpenCVHaar, i int main( int argc, const char** argv ) { - faceCascadePath = "./haarcascade_frontalface_default.xml"; - - if( !faceCascade.load( faceCascadePath ) ){ printf("--(!)Error loading face cascade\n"); return -1; }; - - VideoCapture source; - if (argc == 1) - source.open(0); - else - source.open(argv[1]); - Mat frame; - - double tt_opencvHaar = 0; - double fpsOpencvHaar = 0; - while(1) - { - source >> frame; - if(frame.empty()) - break; - double t = cv::getTickCount(); - detectFaceOpenCVHaar ( faceCascade, frame ); - tt_opencvHaar = ((double)cv::getTickCount() - t)/cv::getTickFrequency(); - fpsOpencvHaar = 1/tt_opencvHaar; - putText(frame, format("OpenCV HAAR ; FPS = %.2f",fpsOpencvHaar), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.4, Scalar(0, 0, 255), 4); - imshow( "OpenCV - HAAR Face Detection", frame ); - int k = waitKey(5); - if(k == 27) - { - destroyAllWindows(); - break; - } + faceCascadePath = "models/haarcascade_frontalface_default.xml"; + if(!faceCascade.load(faceCascadePath)) + { + printf("--(!)Error loading face cascade\n"); + return -1; + } + + VideoCapture source; + if (argc == 1) + source.open(0, CAP_V4L); + else + source.open(argv[1]); Mat frame; + + double tt_opencvHaar = 0; + double fpsOpencvHaar = 0; + + while (true) + { + source >> frame; + if (frame.empty()) + break; + + double t = cv::getTickCount(); + detectFaceOpenCVHaar(faceCascade, frame); + tt_opencvHaar = ((double)cv::getTickCount() - t)/cv::getTickFrequency(); + fpsOpencvHaar = 1/tt_opencvHaar; + + putText(frame, format("OpenCV HAAR ; FPS = %.2f",fpsOpencvHaar), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.3, Scalar(0, 0, 255), 4); + + imshow("OpenCV - HAAR Face Detection", frame); + + int k = waitKey(5); + if(k == 27) + { + destroyAllWindows(); + break; + } } } diff --git a/FaceDetectionComparison/face_detection_opencv_haar.py b/FaceDetectionComparison/face_detection_opencv_haar.py index 461822e7c..52ecc461d 100644 --- a/FaceDetectionComparison/face_detection_opencv_haar.py +++ b/FaceDetectionComparison/face_detection_opencv_haar.py @@ -1,7 +1,9 @@ -from __future__ import division -import cv2 +import argparse +import os import time -import sys + +import cv2 + def detectFaceOpenCVHaar(faceCascade, frame, inHeight=300, inWidth=0): frameOpenCVHaar = frame.copy() @@ -23,52 +25,89 @@ def detectFaceOpenCVHaar(faceCascade, frame, inHeight=300, inWidth=0): y1 = y x2 = x + w y2 = y + h - cvRect = [int(x1 * scaleWidth), int(y1 * scaleHeight), - int(x2 * scaleWidth), int(y2 * scaleHeight)] + cvRect = [ + int(x1 * scaleWidth), + int(y1 * scaleHeight), + int(x2 * scaleWidth), + int(y2 * scaleHeight), + ] bboxes.append(cvRect) - cv2.rectangle(frameOpenCVHaar, (cvRect[0], cvRect[1]), (cvRect[2], cvRect[3]), (0, 255, 0), - int(round(frameHeight / 150)), 4) + cv2.rectangle( + frameOpenCVHaar, + (cvRect[0], cvRect[1]), + (cvRect[2], cvRect[3]), + (0, 255, 0), + int(round(frameHeight / 150)), + 4, + ) return frameOpenCVHaar, bboxes -if __name__ == "__main__" : - source = 0 - if len(sys.argv) > 1: - source = sys.argv[1] - # haarcascade_frontalface_default.xml is in models directory. - faceCascade = cv2.CascadeClassifier('models/haarcascade_frontalface_default.xml') - #faceCascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') - - cap = cv2.VideoCapture(source) + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Face detection") + parser.add_argument("--video", type=str, default="", help="Path to video file") + args = parser.parse_args() + + source = args.video + + faceCascade = cv2.CascadeClassifier("models/haarcascade_frontalface_default.xml") + + outputFolder = "output-haar-videos" + if not os.path.exists(outputFolder): + os.makedirs(outputFolder) + + if source: + cap = cv2.VideoCapture(source) + outputFile = os.path.basename(source)[:-4] + ".avi" + else: + cap = cv2.VideoCapture(0, cv2.CAP_V4L) + outputFile = "grabbed_from_camera.avi" + hasFrame, frame = cap.read() - vid_writer = cv2.VideoWriter('output-haar-{}.avi'.format(str(source).split(".")[0]),cv2.VideoWriter_fourcc('M','J','P','G'), 15, (frame.shape[1],frame.shape[0])) + vid_writer = cv2.VideoWriter( + os.path.join(outputFolder, outputFile), + cv2.VideoWriter_fourcc("M", "J", "P", "G"), + 25, + (frame.shape[1], frame.shape[0]), + ) frame_count = 0 tt_opencvHaar = 0 - while(1): + + while True: hasFrame, frame = cap.read() if not hasFrame: break - frame_count += 1 + frame_count += 1 t = time.time() + outOpencvHaar, bboxes = detectFaceOpenCVHaar(faceCascade, frame) tt_opencvHaar += time.time() - t fpsOpencvHaar = frame_count / tt_opencvHaar - label = "OpenCV Haar ; FPS : {:.2f}".format(fpsOpencvHaar) - cv2.putText(outOpencvHaar, label, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, cv2.LINE_AA) + label = "OpenCV Haar; FPS : {:.2f}".format(fpsOpencvHaar) + cv2.putText( + outOpencvHaar, + label, + (10, 50), + cv2.FONT_HERSHEY_SIMPLEX, + 1.3, + (0, 0, 255), + 3, + cv2.LINE_AA, + ) cv2.imshow("Face Detection Comparison", outOpencvHaar) vid_writer.write(outOpencvHaar) if frame_count == 1: tt_opencvHaar = 0 - - key = cv2.waitKey(1) & 0xFF - # click keyboard 'q' to exit - if key == ord("q"): + + key = cv2.waitKey(5) + if key == 27: break - + cv2.destroyAllWindows() vid_writer.release() diff --git a/FaceDetectionComparison/run-all.cpp b/FaceDetectionComparison/run-all.cpp index 42c496967..5a517d761 100644 --- a/FaceDetectionComparison/run-all.cpp +++ b/FaceDetectionComparison/run-all.cpp @@ -2,24 +2,34 @@ #include #include #include + #include +#include #include #include #include #include -#include +#if(CV_MAJOR_VERSION >= 3) +# include + +using namespace cv::dnn; +#endif + +#if(CV_MAJOR_VERSION < 3) +# include +# include +# include +# include +# include + +using namespace dlib; +#endif -#include -#include -#include -#include -#include +#include using namespace cv; -using namespace cv::dnn; using namespace std; -using namespace dlib; /** Global variables */ String faceCascadePath; @@ -44,37 +54,37 @@ void detectFaceOpenCVHaar(CascadeClassifier faceCascade, Mat &frameOpenCVHaar, i for ( size_t i = 0; i < faces.size(); i++ ) { - int x1 = (int)(faces[i].x * scaleWidth); - int y1 = (int)(faces[i].y * scaleHeight); - int x2 = (int)((faces[i].x + faces[i].width) * scaleWidth); - int y2 = (int)((faces[i].y + faces[i].height) * scaleHeight); - cv::rectangle(frameOpenCVHaar, Point(x1, y1), Point(x2, y2), Scalar(0,255,0), (int)(frameHeight/150.0), 4); + int x1 = (int)(faces[i].x * scaleWidth); + int y1 = (int)(faces[i].y * scaleHeight); + int x2 = (int)((faces[i].x + faces[i].width) * scaleWidth); + int y2 = (int)((faces[i].y + faces[i].height) * scaleHeight); + cv::rectangle(frameOpenCVHaar, Point(x1, y1), Point(x2, y2), Scalar(0,255,0), (int)(frameHeight/150.0), 4); } } +#if(CV_MAJOR_VERSION >= 3) const size_t inWidth = 300; const size_t inHeight = 300; const double inScaleFactor = 1.0; const float confidenceThreshold = 0.7; const cv::Scalar meanVal(104.0, 177.0, 123.0); -#define CAFFE -const std::string caffeConfigFile = "./deploy.prototxt"; -const std::string caffeWeightFile = "./res10_300x300_ssd_iter_140000_fp16.caffemodel"; +const std::string caffeConfigFile = "models/deploy.prototxt"; +const std::string caffeWeightFile = "models/res10_300x300_ssd_iter_140000_fp16.caffemodel"; -const std::string tensorflowConfigFile = "./opencv_face_detector.pbtxt"; -const std::string tensorflowWeightFile = "./opencv_face_detector_uint8.pb"; +const std::string tensorflowConfigFile = "models/opencv_face_detector.pbtxt"; +const std::string tensorflowWeightFile = "models/opencv_face_detector_uint8.pb"; -void detectFaceOpenCVDNN(Net net, Mat &frameOpenCVDNN) +void detectFaceOpenCVDNN(Net net, Mat &frameOpenCVDNN, string framework="caffe") { int frameHeight = frameOpenCVDNN.rows; int frameWidth = frameOpenCVDNN.cols; -#ifdef CAFFE - cv::Mat inputBlob = cv::dnn::blobFromImage(frameOpenCVDNN, inScaleFactor, cv::Size(inWidth, inHeight), meanVal, false, false); -#else - cv::Mat inputBlob = cv::dnn::blobFromImage(frameOpenCVDNN, inScaleFactor, cv::Size(inWidth, inHeight), meanVal, true, false); -#endif + cv::Mat inputBlob; + if (framework == "caffe") + inputBlob = cv::dnn::blobFromImage(frameOpenCVDNN, inScaleFactor, cv::Size(inWidth, inHeight), meanVal, false, false); + else + inputBlob = cv::dnn::blobFromImage(frameOpenCVDNN, inScaleFactor, cv::Size(inWidth, inHeight), meanVal, true, false); net.setInput(inputBlob, "data"); cv::Mat detection = net.forward("detection_out"); @@ -95,11 +105,10 @@ void detectFaceOpenCVDNN(Net net, Mat &frameOpenCVDNN) cv::rectangle(frameOpenCVDNN, cv::Point(x1, y1), cv::Point(x2, y2), cv::Scalar(0, 255, 0),(int)(frameHeight/150.0), 4); } } - } +#endif - - +#if(CV_MAJOR_VERSION < 3) void detectFaceDlibHog(frontal_face_detector hogFaceDetector, Mat &frameDlibHog, int inHeight=300, int inWidth=0) { @@ -122,11 +131,11 @@ void detectFaceDlibHog(frontal_face_detector hogFaceDetector, Mat &frameDlibHog, for ( size_t i = 0; i < faceRects.size(); i++ ) { - int x1 = (int)(faceRects[i].left() * scaleWidth); - int y1 = (int)(faceRects[i].top() * scaleHeight); - int x2 = (int)(faceRects[i].right() * scaleWidth); - int y2 = (int)(faceRects[i].bottom() * scaleHeight); - cv::rectangle(frameDlibHog, Point(x1, y1), Point(x2, y2), Scalar(0,255,0), (int)(frameHeight/150.0), 4); + int x1 = (int)(faceRects[i].left() * scaleWidth); + int y1 = (int)(faceRects[i].top() * scaleHeight); + int x2 = (int)(faceRects[i].right() * scaleWidth); + int y2 = (int)(faceRects[i].bottom() * scaleHeight); + cv::rectangle(frameDlibHog, Point(x1, y1), Point(x2, y2), Scalar(0,255,0), (int)(frameHeight/150.0), 4); } } @@ -165,100 +174,182 @@ void detectFaceDlibMMOD(net_type mmodFaceDetector, Mat &frameDlibMmod, int inHei for ( size_t i = 0; i < faceRects.size(); i++ ) { - int x1 = (int)(faceRects[i].rect.left() * scaleWidth); - int y1 = (int)(faceRects[i].rect.top() * scaleHeight); - int x2 = (int)(faceRects[i].rect.right() * scaleWidth); - int y2 = (int)(faceRects[i].rect.bottom() * scaleHeight); - cv::rectangle(frameDlibMmod, Point(x1, y1), Point(x2, y2), Scalar(0,255,0), (int)(frameHeight/150.0), 4); + int x1 = (int)(faceRects[i].rect.left() * scaleWidth); + int y1 = (int)(faceRects[i].rect.top() * scaleHeight); + int x2 = (int)(faceRects[i].rect.right() * scaleWidth); + int y2 = (int)(faceRects[i].rect.bottom() * scaleHeight); + cv::rectangle(frameDlibMmod, Point(x1, y1), Point(x2, y2), Scalar(0,255,0), (int)(frameHeight/150.0), 4); } } +#endif int main( int argc, const char** argv ) { - faceCascadePath = "./haarcascade_frontalface_default.xml"; - - if( !faceCascade.load( faceCascadePath ) ){ printf("--(!)Error loading face cascade\n"); return -1; }; - - #ifdef CAFFE - Net net = cv::dnn::readNetFromCaffe(caffeConfigFile, caffeWeightFile); - #else - Net net = cv::dnn::readNetFromTensorflow(tensorflowWeightFile, tensorflowConfigFile); - #endif - - frontal_face_detector hogFaceDetector = get_frontal_face_detector(); - - String mmodModelPath = "./mmod_human_face_detector.dat"; - net_type mmodFaceDetector; - deserialize(mmodModelPath) >> mmodFaceDetector; - - VideoCapture source; - if (argc == 1) - source.open(0); - else - source.open(argv[1]); - Mat frame; - - int frame_count = 0; - double tt_opencvHaar = 0; - double tt_opencvDNN = 0; - double tt_dlibHog = 0; - double tt_dlibMmod = 0; - - namedWindow("Face Detection Comparison", WINDOW_NORMAL); - double t = 0; - while(1) - { - source >> frame; - if(frame.empty()) + faceCascadePath = "models/haarcascade_frontalface_default.xml"; + + if(!faceCascade.load(faceCascadePath)) + { + printf("--(!)Error loading face cascade\n"); + return -1; + } + +#if(CV_MAJOR_VERSION < 3) + frontal_face_detector hogFaceDetector = get_frontal_face_detector(); + String mmodModelPath = "models/mmod_human_face_detector.dat"; + net_type mmodFaceDetector; + deserialize(mmodModelPath) >> mmodFaceDetector; +#endif + + string videoFileName; + string device; + string framework; + // Take arguments from command line + if (argc == 4) + { + videoFileName = argv[1]; + device = argv[2]; + framework = argv[3]; + } + else if (argc == 3) + { + videoFileName = argv[1]; + device = argv[2]; + framework = "caffe"; + } + else if (argc == 2) + { + videoFileName = argv[1]; + device = "cpu"; + framework = "caffe"; + } + else + { + videoFileName = ""; + device = "gpu"; + framework = "caffe"; + } + + boost::to_upper(device); + cout << "OpenCV DNN Configuration:" << endl; + cout << "Device - "<< device << endl; + if (framework == "caffe") + cout << "Framework - Caffe" << endl; + else + cout << "Framework - TensorFlow" << endl; + if (videoFileName == "") + cout << "No video found, using camera stream" << endl; + else + cout << "Video file - " << videoFileName << endl; + + Net net; + + if (framework == "caffe") + net = cv::dnn::readNetFromCaffe(caffeConfigFile, caffeWeightFile); + else + net = cv::dnn::readNetFromTensorflow(tensorflowWeightFile, tensorflowConfigFile); + +#if (CV_MAJOR_VERSION >= 4) + if (device == "CPU") + { + net.setPreferableBackend(DNN_TARGET_CPU); + cout << "Device - "<< device << endl; + } + else + { + net.setPreferableBackend(DNN_BACKEND_CUDA); + net.setPreferableTarget(DNN_TARGET_CUDA); + cout << "Device - "<< device << endl; + } +#elif(CV_MAJOR_VERSION == 3) + // OpenCV 3.4.x does not support GPU backend + net.setPreferableBackend(DNN_BACKEND_DEFAULT); + device = "cpu"; + cout << "Device - "<< device << endl; +#endif + + cv::VideoCapture source; + if (videoFileName != "") + source.open(videoFileName); + else + source.open(0, CAP_V4L); + + Mat frame; + + int frame_count = 0; + double tt_opencvHaar = 0; + double tt_opencvDNN = 0; + double tt_dlibHog = 0; + double tt_dlibMmod = 0; + + namedWindow("Face Detection Comparison", WINDOW_NORMAL); + double t = 0; + while (true) + { + source >> frame; + if(frame.empty()) + break; + + frame_count++; + + t = cv::getTickCount(); + Mat frameOpenCVHaar = frame.clone(); + detectFaceOpenCVHaar ( faceCascade, frameOpenCVHaar ); + tt_opencvHaar += ((double)cv::getTickCount() - t)/cv::getTickFrequency(); + double fpsOpencvHaar = frame_count/tt_opencvHaar; + putText(frameOpenCVHaar, format("OpenCV HAAR; FPS = %.2f",fpsOpencvHaar), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.3, Scalar(0, 0, 255), 4); + + Mat frameOpenCVDNN = frame.clone(); +#if(CV_MAJOR_VERSION >= 3) + t = cv::getTickCount(); + detectFaceOpenCVDNN (net, frameOpenCVDNN, framework); + tt_opencvDNN += ((double)cv::getTickCount() - t)/cv::getTickFrequency(); + double fpsOpencvDNN = frame_count/tt_opencvDNN; + putText(frameOpenCVDNN, format("OpenCV DNN %s FPS = %.2f", device.c_str(), fpsOpencvDNN), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.3, Scalar(0, 0, 255), 4); +#else + putText(frameOpenCVDNN, "OpenCV DNN NOT SUPPORTED", Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.3, Scalar(0, 0, 255), 4); +#endif + +#if(CV_MAJOR_VERSION < 3) + t = cv::getTickCount(); + Mat frameDlibHog = frame.clone(); + detectFaceDlibHog ( hogFaceDetector, frameDlibHog ); + tt_dlibHog += ((double)cv::getTickCount() - t)/cv::getTickFrequency(); + double fpsDlibHog = frame_count/tt_dlibHog; + putText(frameDlibHog, format("DLIB HoG; FPS = %.2f",fpsDlibHog), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.3, Scalar(0, 0, 255), 4); + + t = cv::getTickCount(); + Mat frameDlibMmod = frame.clone(); + detectFaceDlibMMOD ( mmodFaceDetector, frameDlibMmod ); + tt_dlibMmod += ((double)cv::getTickCount() - t)/cv::getTickFrequency(); + double fpsDlibMmod = frame_count/tt_dlibMmod; + putText(frameDlibMmod, format("DLIB MMOD; FPS = %.2f",fpsDlibMmod), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.3, Scalar(0, 0, 255), 4); +#endif + + Mat top, bottom, combined; + hconcat(frameOpenCVHaar, frameOpenCVDNN, top); +#if(CV_MAJOR_VERSION < 3) + hconcat(frameDlibHog, frameDlibMmod, bottom); + vconcat(top, bottom, combined); +#else + combined = top; +#endif + + cv::resize(combined, combined, Size(), .5, .5); + imshow("Face Detection Comparison", combined); + + int k = waitKey(5); + if(k == 27) + { + destroyAllWindows(); break; - frame_count++; - - t = cv::getTickCount(); - Mat frameOpenCVHaar = frame.clone(); - detectFaceOpenCVHaar ( faceCascade, frameOpenCVHaar ); - tt_opencvHaar += ((double)cv::getTickCount() - t)/cv::getTickFrequency(); - double fpsOpencvHaar = frame_count/tt_opencvHaar; - putText(frameOpenCVHaar, format("OpenCV HAAR ; FPS = %.2f",fpsOpencvHaar), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.4, Scalar(0, 0, 255), 4); - - Mat frameOpenCVDNN = frame.clone(); - t = cv::getTickCount(); - detectFaceOpenCVDNN ( net, frameOpenCVDNN ); - tt_opencvDNN += ((double)cv::getTickCount() - t)/cv::getTickFrequency(); - double fpsOpencvDNN = frame_count/tt_opencvDNN; - putText(frameOpenCVDNN, format("OpenCV DNN ; FPS = %.2f",fpsOpencvDNN), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.4, Scalar(0, 0, 255), 4); - - t = cv::getTickCount(); - Mat frameDlibHog = frame.clone(); - detectFaceDlibHog ( hogFaceDetector, frameDlibHog ); - tt_dlibHog += ((double)cv::getTickCount() - t)/cv::getTickFrequency(); - double fpsDlibHog = frame_count/tt_dlibHog; - putText(frameDlibHog, format("DLIB HoG ; FPS = %.2f",fpsDlibHog), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.4, Scalar(0, 0, 255), 4); - - t = cv::getTickCount(); - Mat frameDlibMmod = frame.clone(); - detectFaceDlibMMOD ( mmodFaceDetector, frameDlibMmod ); - tt_dlibMmod += ((double)cv::getTickCount() - t)/cv::getTickFrequency(); - double fpsDlibMmod = frame_count/tt_dlibMmod; - putText(frameDlibMmod, format("DLIB MMOD ; FPS = %.2f",fpsDlibMmod), Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.4, Scalar(0, 0, 255), 4); - - Mat top, bottom, combined; - hconcat(frameOpenCVHaar, frameOpenCVDNN, top); - hconcat(frameDlibHog, frameDlibMmod, bottom); - vconcat(top, bottom, combined); - cv::resize(combined, combined, Size(), .5, .5); - imshow("Face Detection Comparison", combined ); - int k = waitKey(5); - if(k == 27) - { - destroyAllWindows(); - break; - } - if(frame_count == 1) - { - tt_opencvHaar = 0; - tt_opencvDNN = 0; - tt_dlibHog = 0; - tt_dlibMmod = 0; - } + } + + if(frame_count == 1) + { + tt_opencvHaar = 0; + tt_opencvDNN = 0; + tt_dlibHog = 0; + tt_dlibMmod = 0; + } } } diff --git a/FaceDetectionComparison/run-all.py b/FaceDetectionComparison/run-all.py index 08fd61d66..475b9e0bf 100644 --- a/FaceDetectionComparison/run-all.py +++ b/FaceDetectionComparison/run-all.py @@ -1,34 +1,22 @@ -from __future__ import division +import argparse +import os +import time + import cv2 import dlib -import time -import sys import numpy as np # Model files # OpenCV HAAR -faceCascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') - -#OpenCV DNN supports 2 networks. -# 1. FP16 version of the original caffe implementation ( 5.4 MB ) -# 2. 8 bit Quantized version using Tensorflow ( 2.7 MB ) -DNN = "TF" -if DNN=="CAFFE": - modelFile = "res10_300x300_ssd_iter_140000_fp16.caffemodel" - configFile = "deploy.prototxt" - net = cv2.dnn.readNetFromCaffe(configFile, modelFile) -else: - modelFile = "opencv_face_detector_uint8.pb" - configFile = "opencv_face_detector.pbtxt" - net = cv2.dnn.readNetFromTensorflow(modelFile, configFile) - -conf_threshold = 0.7 - -# DLIB HoG +faceCascade = cv2.CascadeClassifier("models/haarcascade_frontalface_default.xml") + +# DLIB HOG hogFaceDetector = dlib.get_frontal_face_detector() # DLIB MMOD -dnnFaceDetector = dlib.cnn_face_detection_model_v1("./mmod_human_face_detector.dat") +dnnFaceDetector = dlib.cnn_face_detection_model_v1( + "models/mmod_human_face_detector.dat", +) def detectFaceOpenCVHaar(faceCascade, frame, inHeight=300, inWidth=0): @@ -51,20 +39,31 @@ def detectFaceOpenCVHaar(faceCascade, frame, inHeight=300, inWidth=0): y1 = y x2 = x + w y2 = y + h - cvRect = [int(x1 * scaleWidth), int(y1 * scaleHeight), - int(x2 * scaleWidth), int(y2 * scaleHeight)] + cvRect = [ + int(x1 * scaleWidth), + int(y1 * scaleHeight), + int(x2 * scaleWidth), + int(y2 * scaleHeight), + ] bboxes.append(cvRect) - cv2.rectangle(frameOpenCVHaar, (cvRect[0], cvRect[1]), (cvRect[2], cvRect[3]), (0, 255, 0), - int(round(frameHeight / 150)), 4) + cv2.rectangle( + frameOpenCVHaar, + (cvRect[0], cvRect[1]), + (cvRect[2], cvRect[3]), + (0, 255, 0), + int(round(frameHeight / 150)), + 4, + ) return frameOpenCVHaar, bboxes - -def detectFaceOpenCVDnn(net, frame): +def detectFaceOpenCVDnn(net, frame, conf_threshold=0.7): frameOpencvDnn = frame.copy() frameHeight = frameOpencvDnn.shape[0] frameWidth = frameOpencvDnn.shape[1] - blob = cv2.dnn.blobFromImage(frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], False, False) + blob = cv2.dnn.blobFromImage( + frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], False, False, + ) net.setInput(blob) detections = net.forward() @@ -77,17 +76,23 @@ def detectFaceOpenCVDnn(net, frame): x2 = int(detections[0, 0, i, 5] * frameWidth) y2 = int(detections[0, 0, i, 6] * frameHeight) bboxes.append([x1, y1, x2, y2]) - cv2.rectangle(frameOpencvDnn, (x1, y1), (x2, y2), (0, 255, 0), int(round(frameHeight/150)), 8) + cv2.rectangle( + frameOpencvDnn, + (x1, y1), + (x2, y2), + (0, 255, 0), + int(round(frameHeight / 150)), + 8, + ) return frameOpencvDnn, bboxes def detectFaceDlibHog(detector, frame, inHeight=300, inWidth=0): - frameDlibHog = frame.copy() frameHeight = frameDlibHog.shape[0] frameWidth = frameDlibHog.shape[1] if not inWidth: - inWidth = int((frameWidth / frameHeight)*inHeight) + inWidth = int((frameWidth / frameHeight) * inHeight) scaleHeight = frameHeight / inHeight scaleWidth = frameWidth / inWidth @@ -96,24 +101,33 @@ def detectFaceDlibHog(detector, frame, inHeight=300, inWidth=0): frameDlibHogSmall = cv2.cvtColor(frameDlibHogSmall, cv2.COLOR_BGR2RGB) faceRects = detector(frameDlibHogSmall, 0) - print(frameWidth, frameHeight, inWidth, inHeight) bboxes = [] for faceRect in faceRects: - cvRect = [int(faceRect.left()*scaleWidth), int(faceRect.top()*scaleHeight), - int(faceRect.right()*scaleWidth), int(faceRect.bottom()*scaleHeight) ] + cvRect = [ + int(faceRect.left() * scaleWidth), + int(faceRect.top() * scaleHeight), + int(faceRect.right() * scaleWidth), + int(faceRect.bottom() * scaleHeight), + ] bboxes.append(cvRect) - cv2.rectangle(frameDlibHog, (cvRect[0], cvRect[1]), (cvRect[2], cvRect[3]), (0, 255, 0), int(round(frameHeight/150)), 4) + cv2.rectangle( + frameDlibHog, + (cvRect[0], cvRect[1]), + (cvRect[2], cvRect[3]), + (0, 255, 0), + int(round(frameHeight / 150)), + 4, + ) return frameDlibHog, bboxes def detectFaceDlibMMOD(detector, frame, inHeight=300, inWidth=0): - frameDlibMMOD = frame.copy() frameHeight = frameDlibMMOD.shape[0] frameWidth = frameDlibMMOD.shape[1] if not inWidth: - inWidth = int((frameWidth / frameHeight)*inHeight) + inWidth = int((frameWidth / frameHeight) * inHeight) scaleHeight = frameHeight / inHeight scaleWidth = frameWidth / inWidth @@ -123,82 +137,189 @@ def detectFaceDlibMMOD(detector, frame, inHeight=300, inWidth=0): frameDlibMMODSmall = cv2.cvtColor(frameDlibMMODSmall, cv2.COLOR_BGR2RGB) faceRects = detector(frameDlibMMODSmall, 0) - print(frameWidth, frameHeight, inWidth, inHeight) bboxes = [] for faceRect in faceRects: - cvRect = [int(faceRect.rect.left()*scaleWidth), int(faceRect.rect.top()*scaleHeight), - int(faceRect.rect.right()*scaleWidth), int(faceRect.rect.bottom()*scaleHeight) ] + cvRect = [ + int(faceRect.rect.left() * scaleWidth), + int(faceRect.rect.top() * scaleHeight), + int(faceRect.rect.right() * scaleWidth), + int(faceRect.rect.bottom() * scaleHeight), + ] bboxes.append(cvRect) - cv2.rectangle(frameDlibMMOD, (cvRect[0], cvRect[1]), (cvRect[2], cvRect[3]), (0, 255, 0), int(round(frameHeight/150)), 4) + cv2.rectangle( + frameDlibMMOD, + (cvRect[0], cvRect[1]), + (cvRect[2], cvRect[3]), + (0, 255, 0), + int(round(frameHeight / 150)), + 4, + ) return frameDlibMMOD, bboxes -source = 0 -if len(sys.argv) > 1: - source = sys.argv[1] +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description="Face detection") + parser.add_argument("--video", type=str, help="Path to video file") + parser.add_argument( + "--device", + type=str, + default="gpu", + choices=["cpu", "gpu"], + help="Device to use", + ) + parser.add_argument( + "--net_type", + type=str, + default="caffe", + choices=["caffe", "tf"], + help="Type of network to run", + ) + args = parser.parse_args() + + net_type = args.net_type + source = args.video + device = args.device + + # OpenCV DNN supports 2 networks. + # 1. FP16 version of the original Caffe implementation ( 5.4 MB ) + # 2. 8 bit Quantized version using TensorFlow ( 2.7 MB ) + + if net_type == "caffe": + modelFile = "models/res10_300x300_ssd_iter_140000_fp16.caffemodel" + configFile = "models/deploy.prototxt" + net = cv2.dnn.readNetFromCaffe(configFile, modelFile) + else: + modelFile = "models/opencv_face_detector_uint8.pb" + configFile = "models/opencv_face_detector.pbtxt" + net = cv2.dnn.readNetFromTensorflow(modelFile, configFile) + + if device == "cpu": + net.setPreferableBackend(cv2.dnn.DNN_TARGET_CPU) + else: + net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) + net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) + + if source: + cap = cv2.VideoCapture(source) + else: + cap = cv2.VideoCapture(0, cv2.CAP_V4L) -cap = cv2.VideoCapture(source) -hasFrame, frame = cap.read() -cv2.namedWindow("Face Detection Comparison", cv2.WINDOW_NORMAL) - -vid_writer = cv2.VideoWriter('output-{}.avi'.format(str(source).split(".")[0]),cv2.VideoWriter_fourcc('M','J','P','G'), 15, (frame.shape[1]*2,frame.shape[0]*2)) - -frame_count = 0 -tt_opencvHaar = 0 -tt_opencvDnn = 0 -tt_dlibHog = 0 -tt_dlibMmod = 0 -while(1): hasFrame, frame = cap.read() - if not hasFrame: - break - frame_count += 1 - - t = time.time() - outOpencvHaar, bboxes = detectFaceOpenCVHaar(faceCascade, frame) - tt_opencvHaar += time.time() - t - fpsOpencvHaar = frame_count / tt_opencvHaar - - label = "OpenCV Haar ; FPS : {:.2f}".format(fpsOpencvHaar) - cv2.putText(outOpencvHaar, label, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, cv2.LINE_AA) - - t = time.time() - outOpencvDnn, bboxes = detectFaceOpenCVDnn(net,frame) - tt_opencvDnn += time.time() - t - fpsOpencvDnn = frame_count / tt_opencvDnn - label = "OpenCV DNN ; FPS : {:.2f}".format(fpsOpencvDnn) - cv2.putText(outOpencvDnn, label, (10,50), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, cv2.LINE_AA) - - t = time.time() - outDlibHog, bboxes = detectFaceDlibHog(hogFaceDetector,frame) - tt_dlibHog += time.time() - t - fpsDlibHog = frame_count / tt_dlibHog - - label = "DLIB HoG ; ; FPS : {:.2f}".format(fpsDlibHog) - cv2.putText(outDlibHog, label, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, cv2.LINE_AA) - - t = time.time() - outDlibMMOD, bboxes = detectFaceDlibMMOD(dnnFaceDetector,frame) - tt_dlibMmod += time.time() - t - fpsDlibMmod = frame_count / tt_dlibMmod - - label = "DLIB MMOD ; FPS : {:.2f}".format(fpsDlibMmod) - cv2.putText(outDlibMMOD, label, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, cv2.LINE_AA) - - top = np.hstack([outOpencvHaar, outOpencvDnn]) - bottom = np.hstack([outDlibHog, outDlibMMOD]) - combined = np.vstack([top, bottom]) - cv2.imshow("Face Detection Comparison", combined) - - if frame_count == 1: - tt_opencvHaar = 0 - tt_opencvDnn = 0 - tt_dlibHog = 0 - tt_dlibMmod = 0 - vid_writer.write(combined) - - k = cv2.waitKey(10) - if k == 27: - break -cv2.destroyAllWindows() -vid_writer.release() + + outputFolder = "output-dnn-videos" + if source: + outputFile = os.path.basename(source)[:-4] + ".avi" + else: + outputFile = "grabbed_from_camera.avi" + + if not os.path.exists(outputFolder): + os.makedirs(outputFolder) + + vid_writer = cv2.VideoWriter( + os.path.join(outputFolder, outputFile), + cv2.VideoWriter_fourcc("M", "J", "P", "G"), + 25, + (frame.shape[1], frame.shape[0]), + ) + + frame_count = 0 + tt_opencvHaar = 0 + tt_opencvDnn = 0 + tt_dlibHog = 0 + tt_dlibMmod = 0 + + while True: + hasFrame, frame = cap.read() + if not hasFrame: + break + + frame_count += 1 + + t = time.time() + outOpencvHaar, bboxes = detectFaceOpenCVHaar(faceCascade, frame) + tt_opencvHaar += time.time() - t + fpsOpencvHaar = frame_count / tt_opencvHaar + + label = "OpenCV Haar; FPS : {:.2f}".format(fpsOpencvHaar) + cv2.putText( + outOpencvHaar, + label, + (10, 50), + cv2.FONT_HERSHEY_SIMPLEX, + 1.3, + (0, 0, 255), + 3, + cv2.LINE_AA, + ) + + t = time.time() + outOpencvDnn, bboxes = detectFaceOpenCVDnn(net, frame) + tt_opencvDnn += time.time() - t + fpsOpencvDnn = frame_count / tt_opencvDnn + + label = "OpenCV DNN {} FPS : {:.2f}".format(device.upper(), fpsOpencvDnn) + cv2.putText( + outOpencvDnn, + label, + (10, 50), + cv2.FONT_HERSHEY_SIMPLEX, + 1.3, + (0, 0, 255), + 3, + cv2.LINE_AA, + ) + + t = time.time() + outDlibHog, bboxes = detectFaceDlibHog(hogFaceDetector, frame) + tt_dlibHog += time.time() - t + fpsDlibHog = frame_count / tt_dlibHog + + label = "DLIB HoG; FPS : {:.2f}".format(fpsDlibHog) + cv2.putText( + outDlibHog, + label, + (10, 50), + cv2.FONT_HERSHEY_SIMPLEX, + 1.3, + (0, 0, 255), + 3, + cv2.LINE_AA, + ) + + t = time.time() + outDlibMMOD, bboxes = detectFaceDlibMMOD(dnnFaceDetector, frame) + tt_dlibMmod += time.time() - t + fpsDlibMmod = frame_count / tt_dlibMmod + + label = "DLIB MMOD; FPS : {:.2f}".format(fpsDlibMmod) + cv2.putText( + outDlibMMOD, + label, + (10, 50), + cv2.FONT_HERSHEY_SIMPLEX, + 1.3, + (0, 0, 255), + 3, + cv2.LINE_AA, + ) + + top = np.hstack([outOpencvHaar, outOpencvDnn]) + bottom = np.hstack([outDlibHog, outDlibMMOD]) + combined = np.vstack([top, bottom]) + cv2.imshow("Face Detection Comparison", combined) + + if frame_count == 1: + tt_opencvHaar = 0 + tt_opencvDnn = 0 + tt_dlibHog = 0 + tt_dlibMmod = 0 + + vid_writer.write(combined) + + k = cv2.waitKey(5) + if k == 27: + break + + cv2.destroyAllWindows() + vid_writer.release() diff --git a/FaceMaskOverlay/HR18-300W.pth b/FaceMaskOverlay/HR18-300W.pth new file mode 100644 index 000000000..f633a0147 Binary files /dev/null and b/FaceMaskOverlay/HR18-300W.pth differ diff --git a/FaceMaskOverlay/LICENCE b/FaceMaskOverlay/LICENCE new file mode 100644 index 000000000..d71568502 --- /dev/null +++ b/FaceMaskOverlay/LICENCE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) [2019] [Microsoft] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/FaceMaskOverlay/README.md b/FaceMaskOverlay/README.md new file mode 100644 index 000000000..856b604d0 --- /dev/null +++ b/FaceMaskOverlay/README.md @@ -0,0 +1,60 @@ +# Using Facial Landmarks for Overlaying Faces with Medical Masks + +This repository contains the code for [Using Facial Landmarks for Overlaying Faces with +Masks](https://www.learnopencv.com/using-facial-landmarks-for-overlaying-faces-with-masks/) blog post. + +Most of the code is based on the +[HRNet-Facial-Landmark-Detection](https://github.com/HRNet/HRNet-Facial-Landmark-Detection) repository, huge thanks to +them. + +## Quick start + +### Environment + +This code is developed using Python 3.6 and PyTorch 1.0.0 on Ubuntu 16.04 with NVIDIA GPU. Other platforms or GPUs are +not fully tested. + +### Installation + +1. Create virtual environment: + +You'll need to install [virtualenv](https://pypi.org/project/virtualenv/) package if you don't have it: + +```bash +pip install virtualenv +virtualenv -p python3.6 venv +source venv/bin/activate +``` + +2. Install dependencies: + +```bash +pip install -r requirements.txt +``` + +3. You will also need the pre-trained weights, which you can take from here + [HR18-300W.pth](https://1drv.ms/u/s!AiWjZ1LamlxzeYLmza1XU-4WhnQ): + +```bash +wget -O HR18-300W.pth https://pscm7q.by.files.1drv.com/y4m1ndEsUHxWtszPoyHY2BQ2Zdvh0-dgYW_5dtTcxX_YFP8p5YYADNSndm3tAj2f-U4aMPMuS6-VyMvWaCYaO2otLab4XWblhouZkbuIgzr3ZGem6A2b1Lm6Kb3WrYQL_m3D2hj8Y3ulD06kXpvsvsoN-YlmXd9NK12snBfQxrgQf7OVXYsP1xWJEZfN_1CKdLPl1xYNaNvCeQik5LiCnmB9g +``` + +### Run Demo + +To run the demo, you need to execute the following command in your terminal: + +```bash +python3 overlay_with_mask.py --cfg experiments/300w/face_alignment_300w_hrnet_w18.yaml --landmark_model HR18-300W.pth --mask_image masks/anti_covid.png +``` + +Try out different masks from the `masks` folder or use yours, but don't forget to annotate them first. + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
\ No newline at end of file diff --git a/FaceMaskOverlay/detection/face_detector.caffemodel b/FaceMaskOverlay/detection/face_detector.caffemodel new file mode 100644 index 000000000..0e9cd4ab6 Binary files /dev/null and b/FaceMaskOverlay/detection/face_detector.caffemodel differ diff --git a/FaceMaskOverlay/detection/face_detector.prototxt b/FaceMaskOverlay/detection/face_detector.prototxt new file mode 100644 index 000000000..77a4bdb1f --- /dev/null +++ b/FaceMaskOverlay/detection/face_detector.prototxt @@ -0,0 +1,1789 @@ +input: "data" +input_shape { + dim: 1 + dim: 3 + dim: 300 + dim: 300 +} + +layer { + name: "data_bn" + type: "BatchNorm" + bottom: "data" + top: "data_bn" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "data_scale" + type: "Scale" + bottom: "data_bn" + top: "data_bn" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "conv1_h" + type: "Convolution" + bottom: "data_bn" + top: "conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 32 + pad: 3 + kernel_size: 7 + stride: 2 + weight_filler { + type: "msra" + variance_norm: FAN_OUT + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "conv1_bn_h" + type: "BatchNorm" + bottom: "conv1_h" + top: "conv1_h" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "conv1_scale_h" + type: "Scale" + bottom: "conv1_h" + top: "conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "conv1_relu" + type: "ReLU" + bottom: "conv1_h" + top: "conv1_h" +} +layer { + name: "conv1_pool" + type: "Pooling" + bottom: "conv1_h" + top: "conv1_pool" + pooling_param { + kernel_size: 3 + stride: 2 + } +} +layer { + name: "layer_64_1_conv1_h" + type: "Convolution" + bottom: "conv1_pool" + top: "layer_64_1_conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 32 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_64_1_bn2_h" + type: "BatchNorm" + bottom: "layer_64_1_conv1_h" + top: "layer_64_1_conv1_h" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_64_1_scale2_h" + type: "Scale" + bottom: "layer_64_1_conv1_h" + top: "layer_64_1_conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_64_1_relu2" + type: "ReLU" + bottom: "layer_64_1_conv1_h" + top: "layer_64_1_conv1_h" +} +layer { + name: "layer_64_1_conv2_h" + type: "Convolution" + bottom: "layer_64_1_conv1_h" + top: "layer_64_1_conv2_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 32 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_64_1_sum" + type: "Eltwise" + bottom: "layer_64_1_conv2_h" + bottom: "conv1_pool" + top: "layer_64_1_sum" +} +layer { + name: "layer_128_1_bn1_h" + type: "BatchNorm" + bottom: "layer_64_1_sum" + top: "layer_128_1_bn1_h" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_128_1_scale1_h" + type: "Scale" + bottom: "layer_128_1_bn1_h" + top: "layer_128_1_bn1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_128_1_relu1" + type: "ReLU" + bottom: "layer_128_1_bn1_h" + top: "layer_128_1_bn1_h" +} +layer { + name: "layer_128_1_conv1_h" + type: "Convolution" + bottom: "layer_128_1_bn1_h" + top: "layer_128_1_conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 128 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_128_1_bn2" + type: "BatchNorm" + bottom: "layer_128_1_conv1_h" + top: "layer_128_1_conv1_h" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_128_1_scale2" + type: "Scale" + bottom: "layer_128_1_conv1_h" + top: "layer_128_1_conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_128_1_relu2" + type: "ReLU" + bottom: "layer_128_1_conv1_h" + top: "layer_128_1_conv1_h" +} +layer { + name: "layer_128_1_conv2" + type: "Convolution" + bottom: "layer_128_1_conv1_h" + top: "layer_128_1_conv2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 128 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_128_1_conv_expand_h" + type: "Convolution" + bottom: "layer_128_1_bn1_h" + top: "layer_128_1_conv_expand_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 128 + bias_term: false + pad: 0 + kernel_size: 1 + stride: 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_128_1_sum" + type: "Eltwise" + bottom: "layer_128_1_conv2" + bottom: "layer_128_1_conv_expand_h" + top: "layer_128_1_sum" +} +layer { + name: "layer_256_1_bn1" + type: "BatchNorm" + bottom: "layer_128_1_sum" + top: "layer_256_1_bn1" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_256_1_scale1" + type: "Scale" + bottom: "layer_256_1_bn1" + top: "layer_256_1_bn1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_256_1_relu1" + type: "ReLU" + bottom: "layer_256_1_bn1" + top: "layer_256_1_bn1" +} +layer { + name: "layer_256_1_conv1" + type: "Convolution" + bottom: "layer_256_1_bn1" + top: "layer_256_1_conv1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 256 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_256_1_bn2" + type: "BatchNorm" + bottom: "layer_256_1_conv1" + top: "layer_256_1_conv1" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_256_1_scale2" + type: "Scale" + bottom: "layer_256_1_conv1" + top: "layer_256_1_conv1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_256_1_relu2" + type: "ReLU" + bottom: "layer_256_1_conv1" + top: "layer_256_1_conv1" +} +layer { + name: "layer_256_1_conv2" + type: "Convolution" + bottom: "layer_256_1_conv1" + top: "layer_256_1_conv2" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 256 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_256_1_conv_expand" + type: "Convolution" + bottom: "layer_256_1_bn1" + top: "layer_256_1_conv_expand" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 256 + bias_term: false + pad: 0 + kernel_size: 1 + stride: 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_256_1_sum" + type: "Eltwise" + bottom: "layer_256_1_conv2" + bottom: "layer_256_1_conv_expand" + top: "layer_256_1_sum" +} +layer { + name: "layer_512_1_bn1" + type: "BatchNorm" + bottom: "layer_256_1_sum" + top: "layer_512_1_bn1" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_512_1_scale1" + type: "Scale" + bottom: "layer_512_1_bn1" + top: "layer_512_1_bn1" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_512_1_relu1" + type: "ReLU" + bottom: "layer_512_1_bn1" + top: "layer_512_1_bn1" +} +layer { + name: "layer_512_1_conv1_h" + type: "Convolution" + bottom: "layer_512_1_bn1" + top: "layer_512_1_conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 128 + bias_term: false + pad: 1 + kernel_size: 3 + stride: 1 # 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_512_1_bn2_h" + type: "BatchNorm" + bottom: "layer_512_1_conv1_h" + top: "layer_512_1_conv1_h" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "layer_512_1_scale2_h" + type: "Scale" + bottom: "layer_512_1_conv1_h" + top: "layer_512_1_conv1_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "layer_512_1_relu2" + type: "ReLU" + bottom: "layer_512_1_conv1_h" + top: "layer_512_1_conv1_h" +} +layer { + name: "layer_512_1_conv2_h" + type: "Convolution" + bottom: "layer_512_1_conv1_h" + top: "layer_512_1_conv2_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 256 + bias_term: false + pad: 2 # 1 + kernel_size: 3 + stride: 1 + dilation: 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_512_1_conv_expand_h" + type: "Convolution" + bottom: "layer_512_1_bn1" + top: "layer_512_1_conv_expand_h" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + convolution_param { + num_output: 256 + bias_term: false + pad: 0 + kernel_size: 1 + stride: 1 # 2 + weight_filler { + type: "msra" + } + bias_filler { + type: "constant" + value: 0.0 + } + } +} +layer { + name: "layer_512_1_sum" + type: "Eltwise" + bottom: "layer_512_1_conv2_h" + bottom: "layer_512_1_conv_expand_h" + top: "layer_512_1_sum" +} +layer { + name: "last_bn_h" + type: "BatchNorm" + bottom: "layer_512_1_sum" + top: "layer_512_1_sum" + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } + param { + lr_mult: 0.0 + } +} +layer { + name: "last_scale_h" + type: "Scale" + bottom: "layer_512_1_sum" + top: "layer_512_1_sum" + param { + lr_mult: 1.0 + decay_mult: 1.0 + } + param { + lr_mult: 2.0 + decay_mult: 1.0 + } + scale_param { + bias_term: true + } +} +layer { + name: "last_relu" + type: "ReLU" + bottom: "layer_512_1_sum" + top: "fc7" +} + +layer { + name: "conv6_1_h" + type: "Convolution" + bottom: "fc7" + top: "conv6_1_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_1_relu" + type: "ReLU" + bottom: "conv6_1_h" + top: "conv6_1_h" +} +layer { + name: "conv6_2_h" + type: "Convolution" + bottom: "conv6_1_h" + top: "conv6_2_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_2_relu" + type: "ReLU" + bottom: "conv6_2_h" + top: "conv6_2_h" +} +layer { + name: "conv7_1_h" + type: "Convolution" + bottom: "conv6_2_h" + top: "conv7_1_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_1_relu" + type: "ReLU" + bottom: "conv7_1_h" + top: "conv7_1_h" +} +layer { + name: "conv7_2_h" + type: "Convolution" + bottom: "conv7_1_h" + top: "conv7_2_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + stride: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_2_relu" + type: "ReLU" + bottom: "conv7_2_h" + top: "conv7_2_h" +} +layer { + name: "conv8_1_h" + type: "Convolution" + bottom: "conv7_2_h" + top: "conv8_1_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv8_1_relu" + type: "ReLU" + bottom: "conv8_1_h" + top: "conv8_1_h" +} +layer { + name: "conv8_2_h" + type: "Convolution" + bottom: "conv8_1_h" + top: "conv8_2_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv8_2_relu" + type: "ReLU" + bottom: "conv8_2_h" + top: "conv8_2_h" +} +layer { + name: "conv9_1_h" + type: "Convolution" + bottom: "conv8_2_h" + top: "conv9_1_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 0 + kernel_size: 1 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv9_1_relu" + type: "ReLU" + bottom: "conv9_1_h" + top: "conv9_1_h" +} +layer { + name: "conv9_2_h" + type: "Convolution" + bottom: "conv9_1_h" + top: "conv9_2_h" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv9_2_relu" + type: "ReLU" + bottom: "conv9_2_h" + top: "conv9_2_h" +} +layer { + name: "conv4_3_norm" + type: "Normalize" + bottom: "layer_256_1_bn1" + top: "conv4_3_norm" + norm_param { + across_spatial: false + scale_filler { + type: "constant" + value: 20 + } + channel_shared: false + } +} +layer { + name: "conv4_3_norm_mbox_loc" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv4_3_norm_mbox_loc_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_loc" + top: "conv4_3_norm_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_loc_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_loc_perm" + top: "conv4_3_norm_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf" + type: "Convolution" + bottom: "conv4_3_norm" + top: "conv4_3_norm_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 8 # 84 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv4_3_norm_mbox_conf_perm" + type: "Permute" + bottom: "conv4_3_norm_mbox_conf" + top: "conv4_3_norm_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv4_3_norm_mbox_conf_flat" + type: "Flatten" + bottom: "conv4_3_norm_mbox_conf_perm" + top: "conv4_3_norm_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv4_3_norm_mbox_priorbox" + type: "PriorBox" + bottom: "conv4_3_norm" + bottom: "data" + top: "conv4_3_norm_mbox_priorbox" + prior_box_param { + min_size: 30.0 + max_size: 60.0 + aspect_ratio: 2 + flip: true + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 8 + offset: 0.5 + } +} +layer { + name: "fc7_mbox_loc" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "fc7_mbox_loc_perm" + type: "Permute" + bottom: "fc7_mbox_loc" + top: "fc7_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_loc_flat" + type: "Flatten" + bottom: "fc7_mbox_loc_perm" + top: "fc7_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_conf" + type: "Convolution" + bottom: "fc7" + top: "fc7_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 12 # 126 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "fc7_mbox_conf_perm" + type: "Permute" + bottom: "fc7_mbox_conf" + top: "fc7_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "fc7_mbox_conf_flat" + type: "Flatten" + bottom: "fc7_mbox_conf_perm" + top: "fc7_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "fc7_mbox_priorbox" + type: "PriorBox" + bottom: "fc7" + bottom: "data" + top: "fc7_mbox_priorbox" + prior_box_param { + min_size: 60.0 + max_size: 111.0 + aspect_ratio: 2 + aspect_ratio: 3 + flip: true + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 16 + offset: 0.5 + } +} +layer { + name: "conv6_2_mbox_loc" + type: "Convolution" + bottom: "conv6_2_h" + top: "conv6_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_2_mbox_loc_perm" + type: "Permute" + bottom: "conv6_2_mbox_loc" + top: "conv6_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv6_2_mbox_loc_perm" + top: "conv6_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_conf" + type: "Convolution" + bottom: "conv6_2_h" + top: "conv6_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 12 # 126 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv6_2_mbox_conf_perm" + type: "Permute" + bottom: "conv6_2_mbox_conf" + top: "conv6_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv6_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv6_2_mbox_conf_perm" + top: "conv6_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv6_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv6_2_h" + bottom: "data" + top: "conv6_2_mbox_priorbox" + prior_box_param { + min_size: 111.0 + max_size: 162.0 + aspect_ratio: 2 + aspect_ratio: 3 + flip: true + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 32 + offset: 0.5 + } +} +layer { + name: "conv7_2_mbox_loc" + type: "Convolution" + bottom: "conv7_2_h" + top: "conv7_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 24 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_2_mbox_loc_perm" + type: "Permute" + bottom: "conv7_2_mbox_loc" + top: "conv7_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv7_2_mbox_loc_perm" + top: "conv7_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_conf" + type: "Convolution" + bottom: "conv7_2_h" + top: "conv7_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 12 # 126 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv7_2_mbox_conf_perm" + type: "Permute" + bottom: "conv7_2_mbox_conf" + top: "conv7_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv7_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv7_2_mbox_conf_perm" + top: "conv7_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv7_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv7_2_h" + bottom: "data" + top: "conv7_2_mbox_priorbox" + prior_box_param { + min_size: 162.0 + max_size: 213.0 + aspect_ratio: 2 + aspect_ratio: 3 + flip: true + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 64 + offset: 0.5 + } +} +layer { + name: "conv8_2_mbox_loc" + type: "Convolution" + bottom: "conv8_2_h" + top: "conv8_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv8_2_mbox_loc_perm" + type: "Permute" + bottom: "conv8_2_mbox_loc" + top: "conv8_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv8_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv8_2_mbox_loc_perm" + top: "conv8_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv8_2_mbox_conf" + type: "Convolution" + bottom: "conv8_2_h" + top: "conv8_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 8 # 84 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv8_2_mbox_conf_perm" + type: "Permute" + bottom: "conv8_2_mbox_conf" + top: "conv8_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv8_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv8_2_mbox_conf_perm" + top: "conv8_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv8_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv8_2_h" + bottom: "data" + top: "conv8_2_mbox_priorbox" + prior_box_param { + min_size: 213.0 + max_size: 264.0 + aspect_ratio: 2 + flip: true + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 100 + offset: 0.5 + } +} +layer { + name: "conv9_2_mbox_loc" + type: "Convolution" + bottom: "conv9_2_h" + top: "conv9_2_mbox_loc" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv9_2_mbox_loc_perm" + type: "Permute" + bottom: "conv9_2_mbox_loc" + top: "conv9_2_mbox_loc_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv9_2_mbox_loc_flat" + type: "Flatten" + bottom: "conv9_2_mbox_loc_perm" + top: "conv9_2_mbox_loc_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv9_2_mbox_conf" + type: "Convolution" + bottom: "conv9_2_h" + top: "conv9_2_mbox_conf" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } + convolution_param { + num_output: 8 # 84 + pad: 1 + kernel_size: 3 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layer { + name: "conv9_2_mbox_conf_perm" + type: "Permute" + bottom: "conv9_2_mbox_conf" + top: "conv9_2_mbox_conf_perm" + permute_param { + order: 0 + order: 2 + order: 3 + order: 1 + } +} +layer { + name: "conv9_2_mbox_conf_flat" + type: "Flatten" + bottom: "conv9_2_mbox_conf_perm" + top: "conv9_2_mbox_conf_flat" + flatten_param { + axis: 1 + } +} +layer { + name: "conv9_2_mbox_priorbox" + type: "PriorBox" + bottom: "conv9_2_h" + bottom: "data" + top: "conv9_2_mbox_priorbox" + prior_box_param { + min_size: 264.0 + max_size: 315.0 + aspect_ratio: 2 + flip: true + clip: false + variance: 0.1 + variance: 0.1 + variance: 0.2 + variance: 0.2 + step: 300 + offset: 0.5 + } +} +layer { + name: "mbox_loc" + type: "Concat" + bottom: "conv4_3_norm_mbox_loc_flat" + bottom: "fc7_mbox_loc_flat" + bottom: "conv6_2_mbox_loc_flat" + bottom: "conv7_2_mbox_loc_flat" + bottom: "conv8_2_mbox_loc_flat" + bottom: "conv9_2_mbox_loc_flat" + top: "mbox_loc" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_conf" + type: "Concat" + bottom: "conv4_3_norm_mbox_conf_flat" + bottom: "fc7_mbox_conf_flat" + bottom: "conv6_2_mbox_conf_flat" + bottom: "conv7_2_mbox_conf_flat" + bottom: "conv8_2_mbox_conf_flat" + bottom: "conv9_2_mbox_conf_flat" + top: "mbox_conf" + concat_param { + axis: 1 + } +} +layer { + name: "mbox_priorbox" + type: "Concat" + bottom: "conv4_3_norm_mbox_priorbox" + bottom: "fc7_mbox_priorbox" + bottom: "conv6_2_mbox_priorbox" + bottom: "conv7_2_mbox_priorbox" + bottom: "conv8_2_mbox_priorbox" + bottom: "conv9_2_mbox_priorbox" + top: "mbox_priorbox" + concat_param { + axis: 2 + } +} + +layer { + name: "mbox_conf_reshape" + type: "Reshape" + bottom: "mbox_conf" + top: "mbox_conf_reshape" + reshape_param { + shape { + dim: 0 + dim: -1 + dim: 2 + } + } +} +layer { + name: "mbox_conf_softmax" + type: "Softmax" + bottom: "mbox_conf_reshape" + top: "mbox_conf_softmax" + softmax_param { + axis: 2 + } +} +layer { + name: "mbox_conf_flatten" + type: "Flatten" + bottom: "mbox_conf_softmax" + top: "mbox_conf_flatten" + flatten_param { + axis: 1 + } +} + +layer { + name: "detection_out" + type: "DetectionOutput" + bottom: "mbox_loc" + bottom: "mbox_conf_flatten" + bottom: "mbox_priorbox" + top: "detection_out" + include { + phase: TEST + } + detection_output_param { + num_classes: 2 + share_location: true + background_label_id: 0 + nms_param { + nms_threshold: 0.45 + top_k: 400 + } + code_type: CENTER_SIZE + keep_top_k: 200 + confidence_threshold: 0.01 + } +} \ No newline at end of file diff --git a/FaceMaskOverlay/experiments/300w/face_alignment_300w_hrnet_w18.yaml b/FaceMaskOverlay/experiments/300w/face_alignment_300w_hrnet_w18.yaml new file mode 100644 index 000000000..984b01a4e --- /dev/null +++ b/FaceMaskOverlay/experiments/300w/face_alignment_300w_hrnet_w18.yaml @@ -0,0 +1,87 @@ +GPUS: (0, ) +WORKERS: 4 +PRINT_FREQ: 50 + +DATASET: + DATASET: 300W + ROOT: './data/300w/images' + TRAINSET: './data/300w/face_landmarks_300w_train.csv' + TESTSET: './data/300w/face_landmarks_300w_valid.csv' + FLIP: true + SCALE_FACTOR: 0.25 + ROT_FACTOR: 30 +MODEL: + NAME: 'hrnet' + NUM_JOINTS: 68 + INIT_WEIGHTS: true + PRETRAINED: 'hrnetv2_pretrained/hrnetv2_w18_imagenet_pretrained.pth' + SIGMA: 1.0 + IMAGE_SIZE: + - 256 + - 256 + HEATMAP_SIZE: + - 64 + - 64 + MEAN: + - 0.485 + - 0.456 + - 0.406 + STD: + - 0.229 + - 0.224 + - 0.225 + EXTRA: + FINAL_CONV_KERNEL: 1 + STAGE2: + NUM_MODULES: 1 + NUM_BRANCHES: 2 + BLOCK: BASIC + NUM_BLOCKS: + - 4 + - 4 + NUM_CHANNELS: + - 18 + - 36 + FUSE_METHOD: SUM + STAGE3: + NUM_MODULES: 4 + NUM_BRANCHES: 3 + BLOCK: BASIC + NUM_BLOCKS: + - 4 + - 4 + - 4 + NUM_CHANNELS: + - 18 + - 36 + - 72 + FUSE_METHOD: SUM + STAGE4: + NUM_MODULES: 3 + NUM_BRANCHES: 4 + BLOCK: BASIC + NUM_BLOCKS: + - 4 + - 4 + - 4 + - 4 + NUM_CHANNELS: + - 18 + - 36 + - 72 + - 144 + FUSE_METHOD: SUM +TRAIN: + BATCH_SIZE_PER_GPU: 16 + SHUFFLE: true + BEGIN_EPOCH: 0 + END_EPOCH: 60 + RESUME: true + OPTIMIZER: 'adam' + LR: 0.0001 + WD: 0.0 + LR_STEP: [30, 50] + MOMENTUM: 0.0 + NESTEROV: false +TEST: + BATCH_SIZE_PER_GPU: 8 diff --git a/FaceMaskOverlay/lib/__init__.py b/FaceMaskOverlay/lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/FaceMaskOverlay/lib/config/__init__.py b/FaceMaskOverlay/lib/config/__init__.py new file mode 100644 index 000000000..1c8962812 --- /dev/null +++ b/FaceMaskOverlay/lib/config/__init__.py @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Written by Tianheng Cheng(tianhengcheng@gmail.com) +# ------------------------------------------------------------------------------ + + +from .defaults import _C as config +from .defaults import update_config + + diff --git a/FaceMaskOverlay/lib/config/defaults.py b/FaceMaskOverlay/lib/config/defaults.py new file mode 100644 index 000000000..86f6d29f1 --- /dev/null +++ b/FaceMaskOverlay/lib/config/defaults.py @@ -0,0 +1,124 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Written by Bin Xiao (Bin.Xiao@microsoft.com) +# Modified by Ke Sun (sunk@mail.ustc.edu.cn), Tianheng Cheng(tianhengcheng@gmail.com) +# ------------------------------------------------------------------------------ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from yacs.config import CfgNode as CN + + +_C = CN() + +_C.OUTPUT_DIR = 'output' +_C.LOG_DIR = 'log' +_C.GPUS = (0, 1, 2, 4) +_C.WORKERS = 16 +_C.PRINT_FREQ = 20 +_C.AUTO_RESUME = False +_C.PIN_MEMORY = True + +# Cudnn related params +_C.CUDNN = CN() +_C.CUDNN.BENCHMARK = True +_C.CUDNN.DETERMINISTIC = False +_C.CUDNN.ENABLED = True + +# common params for NETWORK +_C.MODEL = CN() +_C.MODEL.NAME = 'hrnet' +_C.MODEL.INIT_WEIGHTS = True +_C.MODEL.PRETRAINED = '' +_C.MODEL.NUM_JOINTS = 17 +_C.MODEL.TARGET_TYPE = 'Gaussian' +_C.MODEL.IMAGE_SIZE = [256, 256] # width * height +_C.MODEL.HEATMAP_SIZE = [64, 64] # width * height +_C.MODEL.MEAN = [0.485, 0.456, 0.406] +_C.MODEL.STD = [0.229, 0.224, 0.225] +_C.MODEL.SIGMA = 1.5 +_C.MODEL.EXTRA = CN() + +# High-Resoluion Net +_C.MODEL.EXTRA.PRETRAINED_LAYERS = ['*'] +_C.MODEL.EXTRA.STEM_INPLANES = 64 +_C.MODEL.EXTRA.FINAL_CONV_KERNEL = 1 +_C.MODEL.EXTRA.WITH_HEAD = True + +_C.MODEL.EXTRA.STAGE2 = CN() +_C.MODEL.EXTRA.STAGE2.NUM_MODULES = 1 +_C.MODEL.EXTRA.STAGE2.NUM_BRANCHES = 2 +_C.MODEL.EXTRA.STAGE2.NUM_BLOCKS = [4, 4] +_C.MODEL.EXTRA.STAGE2.NUM_CHANNELS = [18, 36] +_C.MODEL.EXTRA.STAGE2.BLOCK = 'BASIC' +_C.MODEL.EXTRA.STAGE2.FUSE_METHOD = 'SUM' + +_C.MODEL.EXTRA.STAGE3 = CN() +_C.MODEL.EXTRA.STAGE3.NUM_MODULES = 1 +_C.MODEL.EXTRA.STAGE3.NUM_BRANCHES = 3 +_C.MODEL.EXTRA.STAGE3.NUM_BLOCKS = [4, 4, 4] +_C.MODEL.EXTRA.STAGE3.NUM_CHANNELS = [18, 36, 72] +_C.MODEL.EXTRA.STAGE3.BLOCK = 'BASIC' +_C.MODEL.EXTRA.STAGE3.FUSE_METHOD = 'SUM' + +_C.MODEL.EXTRA.STAGE4 = CN() +_C.MODEL.EXTRA.STAGE4.NUM_MODULES = 1 +_C.MODEL.EXTRA.STAGE4.NUM_BRANCHES = 4 +_C.MODEL.EXTRA.STAGE4.NUM_BLOCKS = [4, 4, 4, 4] +_C.MODEL.EXTRA.STAGE4.NUM_CHANNELS = [18, 32, 72, 144] +_C.MODEL.EXTRA.STAGE4.BLOCK = 'BASIC' +_C.MODEL.EXTRA.STAGE4.FUSE_METHOD = 'SUM' + +# DATASET related params +_C.DATASET = CN() +_C.DATASET.ROOT = '' +_C.DATASET.DATASET = 'AFLW' +_C.DATASET.TRAINSET = '' +_C.DATASET.TESTSET = '' + +# training data augmentation +_C.DATASET.FLIP = True +_C.DATASET.SCALE_FACTOR = 0.25 +_C.DATASET.ROT_FACTOR = 30 + +# train +_C.TRAIN = CN() + +_C.TRAIN.LR_FACTOR = 0.1 +_C.TRAIN.LR_STEP = [30, 50] +_C.TRAIN.LR = 0.0001 + +_C.TRAIN.OPTIMIZER = 'adam' +_C.TRAIN.MOMENTUM = 0.0 +_C.TRAIN.WD = 0.0 +_C.TRAIN.NESTEROV = False + +_C.TRAIN.BEGIN_EPOCH = 0 +_C.TRAIN.END_EPOCH = 60 + +_C.TRAIN.RESUME = True +_C.TRAIN.CHECKPOINT = '' + +_C.TRAIN.BATCH_SIZE_PER_GPU = 16 +_C.TRAIN.SHUFFLE = True + +# testing +_C.TEST = CN() + +# size of images for each device +_C.TEST.BATCH_SIZE_PER_GPU = 32 + + +def update_config(cfg, args): + cfg.defrost() + cfg.merge_from_file(args.cfg) + cfg.freeze() + + +if __name__ == '__main__': + import sys + with open(sys.argv[1], 'w') as f: + print(_C, file=f) diff --git a/FaceMaskOverlay/lib/core/__init__.py b/FaceMaskOverlay/lib/core/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/FaceMaskOverlay/lib/core/evaluation.py b/FaceMaskOverlay/lib/core/evaluation.py new file mode 100644 index 000000000..e92ef2632 --- /dev/null +++ b/FaceMaskOverlay/lib/core/evaluation.py @@ -0,0 +1,87 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Created by Tianheng Cheng(tianhengcheng@gmail.com), Yang Zhao +# ------------------------------------------------------------------------------ + +import math + +import torch +import numpy as np + +from ..utils.transforms import transform_preds + + +def get_preds(scores): + """ + get predictions from score maps in torch Tensor + return type: torch.LongTensor + """ + assert scores.dim() == 4, 'Score maps should be 4-dim' + maxval, idx = torch.max(scores.view(scores.size(0), scores.size(1), -1), 2) + + maxval = maxval.view(scores.size(0), scores.size(1), 1) + idx = idx.view(scores.size(0), scores.size(1), 1) + 1 + + preds = idx.repeat(1, 1, 2).float() + + preds[:, :, 0] = (preds[:, :, 0] - 1) % scores.size(3) + 1 + preds[:, :, 1] = torch.floor((preds[:, :, 1] - 1) / scores.size(3)) + 1 + + pred_mask = maxval.gt(0).repeat(1, 1, 2).float() + preds *= pred_mask + return preds + + +def compute_nme(preds, meta): + + targets = meta['pts'] + preds = preds.numpy() + target = targets.cpu().numpy() + + N = preds.shape[0] + L = preds.shape[1] + rmse = np.zeros(N) + + for i in range(N): + pts_pred, pts_gt = preds[i, ], target[i, ] + if L == 19: # aflw + interocular = meta['box_size'][i] + elif L == 29: # cofw + interocular = np.linalg.norm(pts_gt[8, ] - pts_gt[9, ]) + elif L == 68: # 300w + # interocular + interocular = np.linalg.norm(pts_gt[36, ] - pts_gt[45, ]) + elif L == 98: + interocular = np.linalg.norm(pts_gt[60, ] - pts_gt[72, ]) + else: + raise ValueError('Number of landmarks is wrong') + rmse[i] = np.sum(np.linalg.norm(pts_pred - pts_gt, axis=1)) / (interocular * L) + + return rmse + + +def decode_preds(output, center, scale, res): + coords = get_preds(output) # float type + + coords = coords.cpu() + # pose-processing + for n in range(coords.size(0)): + for p in range(coords.size(1)): + hm = output[n][p] + px = int(math.floor(coords[n][p][0])) + py = int(math.floor(coords[n][p][1])) + if (px > 1) and (px < res[0]) and (py > 1) and (py < res[1]): + diff = torch.Tensor([hm[py - 1][px] - hm[py - 1][px - 2], hm[py][px - 1]-hm[py - 2][px - 1]]) + coords[n][p] += diff.sign() * .25 + coords += 0.5 + preds = coords.clone() + + # Transform back + for i in range(coords.size(0)): + preds[i] = transform_preds(coords[i], center[i], scale[i], res) + + if preds.dim() < 3: + preds = preds.view(1, preds.size()) + + return preds diff --git a/FaceMaskOverlay/lib/core/function.py b/FaceMaskOverlay/lib/core/function.py new file mode 100644 index 000000000..2453b795f --- /dev/null +++ b/FaceMaskOverlay/lib/core/function.py @@ -0,0 +1,225 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Created by Tianheng Cheng(tianhengcheng@gmail.com) +# ------------------------------------------------------------------------------ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import time +import logging + +import torch +import numpy as np + +from .evaluation import decode_preds, compute_nme + +logger = logging.getLogger(__name__) + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + + +def train(config, train_loader, model, critertion, optimizer, + epoch, writer_dict): + + batch_time = AverageMeter() + data_time = AverageMeter() + losses = AverageMeter() + + model.train() + nme_count = 0 + nme_batch_sum = 0 + + end = time.time() + + for i, (inp, target, meta) in enumerate(train_loader): + # measure data time + data_time.update(time.time()-end) + + # compute the output + output = model(inp) + target = target.cuda(non_blocking=True) + + loss = critertion(output, target) + + # NME + score_map = output.data.cpu() + preds = decode_preds(score_map, meta['center'], meta['scale'], [64, 64]) + + nme_batch = compute_nme(preds, meta) + nme_batch_sum = nme_batch_sum + np.sum(nme_batch) + nme_count = nme_count + preds.size(0) + + # optimize + optimizer.zero_grad() + loss.backward() + optimizer.step() + + losses.update(loss.item(), inp.size(0)) + + batch_time.update(time.time()-end) + if i % config.PRINT_FREQ == 0: + msg = 'Epoch: [{0}][{1}/{2}]\t' \ + 'Time {batch_time.val:.3f}s ({batch_time.avg:.3f}s)\t' \ + 'Speed {speed:.1f} samples/s\t' \ + 'Data {data_time.val:.3f}s ({data_time.avg:.3f}s)\t' \ + 'Loss {loss.val:.5f} ({loss.avg:.5f})\t'.format( + epoch, i, len(train_loader), batch_time=batch_time, + speed=inp.size(0)/batch_time.val, + data_time=data_time, loss=losses) + logger.info(msg) + + if writer_dict: + writer = writer_dict['writer'] + global_steps = writer_dict['train_global_steps'] + writer.add_scalar('train_loss', losses.val, global_steps) + writer_dict['train_global_steps'] = global_steps + 1 + + end = time.time() + nme = nme_batch_sum / nme_count + msg = 'Train Epoch {} time:{:.4f} loss:{:.4f} nme:{:.4f}'\ + .format(epoch, batch_time.avg, losses.avg, nme) + logger.info(msg) + + +def validate(config, val_loader, model, criterion, epoch, writer_dict): + batch_time = AverageMeter() + data_time = AverageMeter() + + losses = AverageMeter() + + num_classes = config.MODEL.NUM_JOINTS + predictions = torch.zeros((len(val_loader.dataset), num_classes, 2)) + + model.eval() + + nme_count = 0 + nme_batch_sum = 0 + count_failure_008 = 0 + count_failure_010 = 0 + end = time.time() + + with torch.no_grad(): + for i, (inp, target, meta) in enumerate(val_loader): + data_time.update(time.time() - end) + output = model(inp) + target = target.cuda(non_blocking=True) + + score_map = output.data.cpu() + # loss + loss = criterion(output, target) + + preds = decode_preds(score_map, meta['center'], meta['scale'], [64, 64]) + # NME + nme_temp = compute_nme(preds, meta) + # Failure Rate under different threshold + failure_008 = (nme_temp > 0.08).sum() + failure_010 = (nme_temp > 0.10).sum() + count_failure_008 += failure_008 + count_failure_010 += failure_010 + + nme_batch_sum += np.sum(nme_temp) + nme_count = nme_count + preds.size(0) + for n in range(score_map.size(0)): + predictions[meta['index'][n], :, :] = preds[n, :, :] + + losses.update(loss.item(), inp.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + nme = nme_batch_sum / nme_count + failure_008_rate = count_failure_008 / nme_count + failure_010_rate = count_failure_010 / nme_count + + msg = 'Test Epoch {} time:{:.4f} loss:{:.4f} nme:{:.4f} [008]:{:.4f} ' \ + '[010]:{:.4f}'.format(epoch, batch_time.avg, losses.avg, nme, + failure_008_rate, failure_010_rate) + logger.info(msg) + + if writer_dict: + writer = writer_dict['writer'] + global_steps = writer_dict['valid_global_steps'] + writer.add_scalar('valid_loss', losses.avg, global_steps) + writer.add_scalar('valid_nme', nme, global_steps) + writer_dict['valid_global_steps'] = global_steps + 1 + + return nme, predictions + + +def inference(config, data_loader, model): + batch_time = AverageMeter() + data_time = AverageMeter() + losses = AverageMeter() + + num_classes = config.MODEL.NUM_JOINTS + predictions = torch.zeros((len(data_loader.dataset), num_classes, 2)) + + model.eval() + + nme_count = 0 + nme_batch_sum = 0 + count_failure_008 = 0 + count_failure_010 = 0 + end = time.time() + + with torch.no_grad(): + for i, (inp, target, meta) in enumerate(data_loader): + data_time.update(time.time() - end) + output = model(inp) + score_map = output.data.cpu() + preds = decode_preds(score_map, meta['center'], meta['scale'], [64, 64]) + + # NME + nme_temp = compute_nme(preds, meta) + + failure_008 = (nme_temp > 0.08).sum() + failure_010 = (nme_temp > 0.10).sum() + count_failure_008 += failure_008 + count_failure_010 += failure_010 + + nme_batch_sum += np.sum(nme_temp) + nme_count = nme_count + preds.size(0) + for n in range(score_map.size(0)): + predictions[meta['index'][n], :, :] = preds[n, :, :] + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + nme = nme_batch_sum / nme_count + failure_008_rate = count_failure_008 / nme_count + failure_010_rate = count_failure_010 / nme_count + + msg = 'Test Results time:{:.4f} loss:{:.4f} nme:{:.4f} [008]:{:.4f} ' \ + '[010]:{:.4f}'.format(batch_time.avg, losses.avg, nme, + failure_008_rate, failure_010_rate) + logger.info(msg) + + return nme, predictions + + + diff --git a/FaceMaskOverlay/lib/datasets/__init__.py b/FaceMaskOverlay/lib/datasets/__init__.py new file mode 100644 index 000000000..c3594b878 --- /dev/null +++ b/FaceMaskOverlay/lib/datasets/__init__.py @@ -0,0 +1,27 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Written by Tianheng Cheng(tianhengcheng@gmail.com) +# ------------------------------------------------------------------------------ + +from .aflw import AFLW +from .cofw import COFW +from .face300w import Face300W +from .wflw import WFLW + +__all__ = ['AFLW', 'COFW', 'Face300W', 'WFLW', 'get_dataset'] + + +def get_dataset(config): + + if config.DATASET.DATASET == 'AFLW': + return AFLW + elif config.DATASET.DATASET == 'COFW': + return COFW + elif config.DATASET.DATASET == '300W': + return Face300W + elif config.DATASET.DATASET == 'WFLW': + return WFLW + else: + raise NotImplemented() + diff --git a/FaceMaskOverlay/lib/datasets/aflw.py b/FaceMaskOverlay/lib/datasets/aflw.py new file mode 100644 index 000000000..d75ac6b8d --- /dev/null +++ b/FaceMaskOverlay/lib/datasets/aflw.py @@ -0,0 +1,104 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Created by Tianheng Cheng(tianhengcheng@gmail.com), Yang Zhao +# ------------------------------------------------------------------------------ + +import os +import random + +import torch +import torch.utils.data as data +import pandas as pd +from PIL import Image, ImageFile +import numpy as np + +from ..utils.transforms import fliplr_joints, crop, generate_target, transform_pixel + +ImageFile.LOAD_TRUNCATED_IMAGES = True + + +class AFLW(data.Dataset): + """AFLW + """ + def __init__(self, cfg, is_train=True, transform=None): + # specify annotation file for dataset + if is_train: + self.csv_file = cfg.DATASET.TRAINSET + else: + self.csv_file = cfg.DATASET.TESTSET + + self.is_train = is_train + self.transform = transform + self.data_root = cfg.DATASET.ROOT + self.input_size = cfg.MODEL.IMAGE_SIZE + self.output_size = cfg.MODEL.HEATMAP_SIZE + self.sigma = cfg.MODEL.SIGMA + self.scale_factor = cfg.DATASET.SCALE_FACTOR + self.rot_factor = cfg.DATASET.ROT_FACTOR + self.label_type = cfg.MODEL.TARGET_TYPE + self.flip = cfg.DATASET.FLIP + self.mean = np.array([0.485, 0.456, 0.406], dtype=np.float32) + self.std = np.array([0.229, 0.224, 0.225], dtype=np.float32) + # load annotations + self.landmarks_frame = pd.read_csv(self.csv_file) + + def __len__(self): + return len(self.landmarks_frame) + + def __getitem__(self, idx): + + image_path = os.path.join(self.data_root, + self.landmarks_frame.iloc[idx, 0]) + scale = self.landmarks_frame.iloc[idx, 1] + box_size = self.landmarks_frame.iloc[idx, 2] + + center_w = self.landmarks_frame.iloc[idx, 3] + center_h = self.landmarks_frame.iloc[idx, 4] + center = torch.Tensor([center_w, center_h]) + + pts = self.landmarks_frame.iloc[idx, 5:].values + pts = pts.astype('float').reshape(-1, 2) + + scale *= 1.25 + nparts = pts.shape[0] + img = np.array(Image.open(image_path).convert('RGB'), dtype=np.float32) + + r = 0 + if self.is_train: + scale = scale * (random.uniform(1 - self.scale_factor, + 1 + self.scale_factor)) + r = random.uniform(-self.rot_factor, self.rot_factor) \ + if random.random() <= 0.6 else 0 + if random.random() <= 0.5 and self.flip: + img = np.fliplr(img) + pts = fliplr_joints(pts, width=img.shape[1], dataset='AFLW') + center[0] = img.shape[1] - center[0] + + img = crop(img, center, scale, self.input_size, rot=r) + + target = np.zeros((nparts, self.output_size[0], self.output_size[1])) + tpts = pts.copy() + + for i in range(nparts): + if tpts[i, 1] > 0: + tpts[i, 0:2] = transform_pixel(tpts[i, 0:2]+1, center, + scale, self.output_size, rot=r) + target[i] = generate_target(target[i], tpts[i]-1, self.sigma, + label_type=self.label_type) + img = img.astype(np.float32) + img = (img/255.0 - self.mean) / self.std + img = img.transpose([2, 0, 1]) + target = torch.Tensor(target) + tpts = torch.Tensor(tpts) + center = torch.Tensor(center) + + meta = {'index': idx, 'center': center, 'scale': scale, + 'pts': torch.Tensor(pts), 'tpts': tpts, 'box_size': box_size} + + return img, target, meta + + +if __name__ == '__main__': + + pass diff --git a/FaceMaskOverlay/lib/datasets/cofw.py b/FaceMaskOverlay/lib/datasets/cofw.py new file mode 100644 index 000000000..f399084fe --- /dev/null +++ b/FaceMaskOverlay/lib/datasets/cofw.py @@ -0,0 +1,115 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Created by Tianheng Cheng(tianhengcheng@gmail.com), Yang Zhao +# ------------------------------------------------------------------------------ + +import math +import random + +import torch +import torch.utils.data as data +import numpy as np + +from hdf5storage import loadmat +from ..utils.transforms import fliplr_joints, crop, generate_target, transform_pixel + + +class COFW(data.Dataset): + + def __init__(self, cfg, is_train=True, transform=None): + # specify annotation file for dataset + if is_train: + self.mat_file = cfg.DATASET.TRAINSET + else: + self.mat_file = cfg.DATASET.TESTSET + + self.is_train = is_train + self.transform = transform + self.data_root = cfg.DATASET.ROOT + self.input_size = cfg.MODEL.IMAGE_SIZE + self.output_size = cfg.MODEL.HEATMAP_SIZE + self.sigma = cfg.MODEL.SIGMA + self.scale_factor = cfg.DATASET.SCALE_FACTOR + self.rot_factor = cfg.DATASET.ROT_FACTOR + self.label_type = cfg.MODEL.TARGET_TYPE + self.flip = cfg.DATASET.FLIP + + # load annotations + self.mat = loadmat(self.mat_file) + if is_train: + self.images = self.mat['IsTr'] + self.pts = self.mat['phisTr'] + else: + self.images = self.mat['IsT'] + self.pts = self.mat['phisT'] + + self.mean = np.array([0.485, 0.456, 0.406], dtype=np.float32) + self.std = np.array([0.229, 0.224, 0.225], dtype=np.float32) + + def __len__(self): + return len(self.images) + + def __getitem__(self, idx): + + img = self.images[idx][0] + + if len(img.shape) == 2: + img = img.reshape(img.shape[0], img.shape[1], 1) + img = np.repeat(img, 3, axis=2) + + pts = self.pts[idx][0:58].reshape(2, -1).transpose() + + xmin = np.min(pts[:, 0]) + xmax = np.max(pts[:, 0]) + ymin = np.min(pts[:, 1]) + ymax = np.max(pts[:, 1]) + + center_w = (math.floor(xmin) + math.ceil(xmax)) / 2.0 + center_h = (math.floor(ymin) + math.ceil(ymax)) / 2.0 + + scale = max(math.ceil(xmax) - math.floor(xmin), math.ceil(ymax) - math.floor(ymin)) / 200.0 + center = torch.Tensor([center_w, center_h]) + + scale *= 1.25 + nparts = pts.shape[0] + + r = 0 + if self.is_train: + scale = scale * (random.uniform(1 - self.scale_factor, + 1 + self.scale_factor)) + r = random.uniform(-self.rot_factor, self.rot_factor) \ + if random.random() <= 0.6 else 0 + + if random.random() <= 0.5 and self.flip: + img = np.fliplr(img) + pts = fliplr_joints(pts, width=img.shape[1], dataset='COFW') + center[0] = img.shape[1] - center[0] + + img = crop(img, center, scale, self.input_size, rot=r) + + target = np.zeros((nparts, self.output_size[0], self.output_size[1])) + tpts = pts.copy() + + for i in range(nparts): + if tpts[i, 1] > 0: + tpts[i, 0:2] = transform_pixel(tpts[i, 0:2]+1, center, + scale, self.output_size, rot=r) + target[i] = generate_target(target[i], tpts[i]-1, self.sigma, + label_type=self.label_type) + img = img.astype(np.float32) + img = (img/255 - self.mean) / self.std + img = img.transpose([2, 0, 1]) + target = torch.Tensor(target) + tpts = torch.Tensor(tpts) + center = torch.Tensor(center) + + meta = {'index': idx, 'center': center, 'scale': scale, + 'pts': torch.Tensor(pts), 'tpts': tpts} + + return img, target, meta + + +if __name__ == '__main__': + + pass diff --git a/FaceMaskOverlay/lib/datasets/face300w.py b/FaceMaskOverlay/lib/datasets/face300w.py new file mode 100644 index 000000000..deb8877f0 --- /dev/null +++ b/FaceMaskOverlay/lib/datasets/face300w.py @@ -0,0 +1,102 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Created by Tianheng Cheng(tianhengcheng@gmail.com), Yang Zhao +# ------------------------------------------------------------------------------ + +import os +import random + +import torch +import torch.utils.data as data +import pandas as pd +from PIL import Image +import numpy as np + +from ..utils.transforms import fliplr_joints, crop, generate_target, transform_pixel + + +class Face300W(data.Dataset): + + def __init__(self, cfg, is_train=True, transform=None): + # specify annotation file for dataset + if is_train: + self.csv_file = cfg.DATASET.TRAINSET + else: + self.csv_file = cfg.DATASET.TESTSET + + self.is_train = is_train + self.transform = transform + self.data_root = cfg.DATASET.ROOT + self.input_size = cfg.MODEL.IMAGE_SIZE + self.output_size = cfg.MODEL.HEATMAP_SIZE + self.sigma = cfg.MODEL.SIGMA + self.scale_factor = cfg.DATASET.SCALE_FACTOR + self.rot_factor = cfg.DATASET.ROT_FACTOR + self.label_type = cfg.MODEL.TARGET_TYPE + self.flip = cfg.DATASET.FLIP + + # load annotations + self.landmarks_frame = pd.read_csv(self.csv_file) + + self.mean = np.array([0.485, 0.456, 0.406], dtype=np.float32) + self.std = np.array([0.229, 0.224, 0.225], dtype=np.float32) + + def __len__(self): + return len(self.landmarks_frame) + + def __getitem__(self, idx): + + image_path = os.path.join(self.data_root, + self.landmarks_frame.iloc[idx, 0]) + scale = self.landmarks_frame.iloc[idx, 1] + + center_w = self.landmarks_frame.iloc[idx, 2] + center_h = self.landmarks_frame.iloc[idx, 3] + center = torch.Tensor([center_w, center_h]) + + pts = self.landmarks_frame.iloc[idx, 4:].values + pts = pts.astype('float').reshape(-1, 2) + + scale *= 1.25 + nparts = pts.shape[0] + img = np.array(Image.open(image_path).convert('RGB'), dtype=np.float32) + + r = 0 + if self.is_train: + scale = scale * (random.uniform(1 - self.scale_factor, + 1 + self.scale_factor)) + r = random.uniform(-self.rot_factor, self.rot_factor) \ + if random.random() <= 0.6 else 0 + if random.random() <= 0.5 and self.flip: + img = np.fliplr(img) + pts = fliplr_joints(pts, width=img.shape[1], dataset='300W') + center[0] = img.shape[1] - center[0] + + img = crop(img, center, scale, self.input_size, rot=r) + + target = np.zeros((nparts, self.output_size[0], self.output_size[1])) + tpts = pts.copy() + + for i in range(nparts): + if tpts[i, 1] > 0: + tpts[i, 0:2] = transform_pixel(tpts[i, 0:2]+1, center, + scale, self.output_size, rot=r) + target[i] = generate_target(target[i], tpts[i]-1, self.sigma, + label_type=self.label_type) + img = img.astype(np.float32) + img = (img/255.0 - self.mean) / self.std + img = img.transpose([2, 0, 1]) + target = torch.Tensor(target) + tpts = torch.Tensor(tpts) + center = torch.Tensor(center) + + meta = {'index': idx, 'center': center, 'scale': scale, + 'pts': torch.Tensor(pts), 'tpts': tpts} + + return img, target, meta + + +if __name__ == '__main__': + + pass diff --git a/FaceMaskOverlay/lib/datasets/wflw.py b/FaceMaskOverlay/lib/datasets/wflw.py new file mode 100644 index 000000000..13a0158ec --- /dev/null +++ b/FaceMaskOverlay/lib/datasets/wflw.py @@ -0,0 +1,100 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Created by Tianheng Cheng(tianhengcheng@gmail.com), Yang Zhao +# ------------------------------------------------------------------------------ + +import os +import random + +import torch +import torch.utils.data as data +import pandas as pd +from PIL import Image +import numpy as np + +from ..utils.transforms import fliplr_joints, crop, generate_target, transform_pixel + + +class WFLW(data.Dataset): + def __init__(self, cfg, is_train=True, transform=None): + # specify annotation file for dataset + if is_train: + self.csv_file = cfg.DATASET.TRAINSET + else: + self.csv_file = cfg.DATASET.TESTSET + + self.is_train = is_train + self.transform = transform + self.data_root = cfg.DATASET.ROOT + self.input_size = cfg.MODEL.IMAGE_SIZE + self.output_size = cfg.MODEL.HEATMAP_SIZE + self.sigma = cfg.MODEL.SIGMA + self.scale_factor = cfg.DATASET.SCALE_FACTOR + self.rot_factor = cfg.DATASET.ROT_FACTOR + self.label_type = cfg.MODEL.TARGET_TYPE + self.flip = cfg.DATASET.FLIP + + # load annotations + self.landmarks_frame = pd.read_csv(self.csv_file) + + self.mean = np.array([0.485, 0.456, 0.406], dtype=np.float32) + self.std = np.array([0.229, 0.224, 0.225], dtype=np.float32) + + def __len__(self): + return len(self.landmarks_frame) + + def __getitem__(self, idx): + + image_path = os.path.join(self.data_root, + self.landmarks_frame.iloc[idx, 0]) + scale = self.landmarks_frame.iloc[idx, 1] + + center_w = self.landmarks_frame.iloc[idx, 2] + center_h = self.landmarks_frame.iloc[idx, 3] + center = torch.Tensor([center_w, center_h]) + + pts = self.landmarks_frame.iloc[idx, 4:].values + pts = pts.astype('float').reshape(-1, 2) + + scale *= 1.25 + nparts = pts.shape[0] + img = np.array(Image.open(image_path).convert('RGB'), dtype=np.float32) + + r = 0 + if self.is_train: + scale = scale * (random.uniform(1 - self.scale_factor, + 1 + self.scale_factor)) + r = random.uniform(-self.rot_factor, self.rot_factor) \ + if random.random() <= 0.6 else 0 + if random.random() <= 0.5 and self.flip: + img = np.fliplr(img) + pts = fliplr_joints(pts, width=img.shape[1], dataset='WFLW') + center[0] = img.shape[1] - center[0] + + img = crop(img, center, scale, self.input_size, rot=r) + + target = np.zeros((nparts, self.output_size[0], self.output_size[1])) + tpts = pts.copy() + + for i in range(nparts): + if tpts[i, 1] > 0: + tpts[i, 0:2] = transform_pixel(tpts[i, 0:2]+1, center, + scale, self.output_size, rot=r) + target[i] = generate_target(target[i], tpts[i]-1, self.sigma, + label_type=self.label_type) + img = img.astype(np.float32) + img = (img/255.0 - self.mean) / self.std + img = img.transpose([2, 0, 1]) + target = torch.Tensor(target) + tpts = torch.Tensor(tpts) + center = torch.Tensor(center) + + meta = {'index': idx, 'center': center, 'scale': scale, + 'pts': torch.Tensor(pts), 'tpts': tpts} + + return img, target, meta + + +if __name__ == '__main__': + pass diff --git a/FaceMaskOverlay/lib/models/__init__.py b/FaceMaskOverlay/lib/models/__init__.py new file mode 100644 index 000000000..e12202fea --- /dev/null +++ b/FaceMaskOverlay/lib/models/__init__.py @@ -0,0 +1,14 @@ + +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Written by Tianheng Cheng (tianhengcheng@gmail.com) +# ------------------------------------------------------------------------------ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from .hrnet import get_face_alignment_net, HighResolutionNet + +__all__ = ['HighResolutionNet', 'get_face_alignment_net'] diff --git a/FaceMaskOverlay/lib/models/hrnet.py b/FaceMaskOverlay/lib/models/hrnet.py new file mode 100644 index 000000000..309cd9477 --- /dev/null +++ b/FaceMaskOverlay/lib/models/hrnet.py @@ -0,0 +1,478 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Create by Bin Xiao (Bin.Xiao@microsoft.com) +# Modified by Tianheng Cheng(tianhengcheng@gmail.com), Yang Zhao +# ------------------------------------------------------------------------------ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import logging + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +BatchNorm2d = nn.BatchNorm2d +BN_MOMENTUM = 0.01 +logger = logging.getLogger(__name__) + + +def conv3x3(in_planes, out_planes, stride=1): + """3x3 convolution with padding""" + return nn.Conv2d(in_planes, out_planes, kernel_size=3, + stride=stride, padding=1, bias=False) + + +class BasicBlock(nn.Module): + expansion = 1 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(BasicBlock, self).__init__() + self.conv1 = conv3x3(inplanes, planes, stride) + self.bn1 = BatchNorm2d(planes, momentum=BN_MOMENTUM) + self.relu = nn.ReLU(inplace=True) + self.conv2 = conv3x3(planes, planes) + self.bn2 = BatchNorm2d(planes, momentum=BN_MOMENTUM) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class Bottleneck(nn.Module): + expansion = 4 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(Bottleneck, self).__init__() + self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) + self.bn1 = BatchNorm2d(planes, momentum=BN_MOMENTUM) + self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, + padding=1, bias=False) + self.bn2 = BatchNorm2d(planes, momentum=BN_MOMENTUM) + self.conv3 = nn.Conv2d(planes, planes * self.expansion, kernel_size=1, + bias=False) + self.bn3 = BatchNorm2d(planes * self.expansion, + momentum=BN_MOMENTUM) + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class HighResolutionModule(nn.Module): + def __init__(self, num_branches, blocks, num_blocks, num_inchannels, + num_channels, fuse_method, multi_scale_output=True): + super(HighResolutionModule, self).__init__() + self._check_branches( + num_branches, blocks, num_blocks, num_inchannels, num_channels) + + self.num_inchannels = num_inchannels + self.fuse_method = fuse_method + self.num_branches = num_branches + + self.multi_scale_output = multi_scale_output + + self.branches = self._make_branches( + num_branches, blocks, num_blocks, num_channels) + self.fuse_layers = self._make_fuse_layers() + self.relu = nn.ReLU(inplace=True) + + def _check_branches(self, num_branches, blocks, num_blocks, + num_inchannels, num_channels): + if num_branches != len(num_blocks): + error_msg = 'NUM_BRANCHES({}) <> NUM_BLOCKS({})'.format( + num_branches, len(num_blocks)) + logger.error(error_msg) + raise ValueError(error_msg) + + if num_branches != len(num_channels): + error_msg = 'NUM_BRANCHES({}) <> NUM_CHANNELS({})'.format( + num_branches, len(num_channels)) + logger.error(error_msg) + raise ValueError(error_msg) + + if num_branches != len(num_inchannels): + error_msg = 'NUM_BRANCHES({}) <> NUM_INCHANNELS({})'.format( + num_branches, len(num_inchannels)) + logger.error(error_msg) + raise ValueError(error_msg) + + def _make_one_branch(self, branch_index, block, num_blocks, num_channels, + stride=1): + downsample = None + if stride != 1 or \ + self.num_inchannels[branch_index] != num_channels[branch_index] * block.expansion: + downsample = nn.Sequential( + nn.Conv2d(self.num_inchannels[branch_index], + num_channels[branch_index] * block.expansion, + kernel_size=1, stride=stride, bias=False), + BatchNorm2d(num_channels[branch_index] * block.expansion, + momentum=BN_MOMENTUM), + ) + + layers = [] + layers.append(block(self.num_inchannels[branch_index], + num_channels[branch_index], stride, downsample)) + self.num_inchannels[branch_index] = \ + num_channels[branch_index] * block.expansion + for i in range(1, num_blocks[branch_index]): + layers.append(block(self.num_inchannels[branch_index], + num_channels[branch_index])) + + return nn.Sequential(*layers) + + def _make_branches(self, num_branches, block, num_blocks, num_channels): + branches = [] + + for i in range(num_branches): + branches.append( + self._make_one_branch(i, block, num_blocks, num_channels)) + + return nn.ModuleList(branches) + + def _make_fuse_layers(self): + if self.num_branches == 1: + return None + + num_branches = self.num_branches + num_inchannels = self.num_inchannels + fuse_layers = [] + for i in range(num_branches if self.multi_scale_output else 1): + fuse_layer = [] + for j in range(num_branches): + if j > i: + fuse_layer.append(nn.Sequential( + nn.Conv2d(num_inchannels[j], + num_inchannels[i], + 1, + 1, + 0, + bias=False), + BatchNorm2d(num_inchannels[i], momentum=BN_MOMENTUM))) + # nn.Upsample(scale_factor=2**(j-i), mode='nearest'))) + elif j == i: + fuse_layer.append(None) + else: + conv3x3s = [] + for k in range(i - j): + if k == i - j - 1: + num_outchannels_conv3x3 = num_inchannels[i] + conv3x3s.append(nn.Sequential( + nn.Conv2d(num_inchannels[j], + num_outchannels_conv3x3, + 3, 2, 1, bias=False), + BatchNorm2d(num_outchannels_conv3x3, momentum=BN_MOMENTUM))) + else: + num_outchannels_conv3x3 = num_inchannels[j] + conv3x3s.append(nn.Sequential( + nn.Conv2d(num_inchannels[j], + num_outchannels_conv3x3, + 3, 2, 1, bias=False), + BatchNorm2d(num_outchannels_conv3x3, + momentum=BN_MOMENTUM), + nn.ReLU(inplace=True))) + fuse_layer.append(nn.Sequential(*conv3x3s)) + fuse_layers.append(nn.ModuleList(fuse_layer)) + + return nn.ModuleList(fuse_layers) + + def get_num_inchannels(self): + return self.num_inchannels + + def forward(self, x): + if self.num_branches == 1: + return [self.branches[0](x[0])] + + for i in range(self.num_branches): + x[i] = self.branches[i](x[i]) + + x_fuse = [] + for i in range(len(self.fuse_layers)): + y = x[0] if i == 0 else self.fuse_layers[i][0](x[0]) + for j in range(1, self.num_branches): + if i == j: + y = y + x[j] + elif j > i: + y = y + F.interpolate( + self.fuse_layers[i][j](x[j]), + size=[x[i].shape[2], x[i].shape[3]], + mode='bilinear') + else: + y = y + self.fuse_layers[i][j](x[j]) + x_fuse.append(self.relu(y)) + + return x_fuse + + +blocks_dict = { + 'BASIC': BasicBlock, + 'BOTTLENECK': Bottleneck +} + + +class HighResolutionNet(nn.Module): + + def __init__(self, config, **kwargs): + self.inplanes = 64 + extra = config.MODEL.EXTRA + super(HighResolutionNet, self).__init__() + + # stem net + self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1, + bias=False) + self.bn1 = BatchNorm2d(64, momentum=BN_MOMENTUM) + self.conv2 = nn.Conv2d(64, 64, kernel_size=3, stride=2, padding=1, + bias=False) + self.bn2 = BatchNorm2d(64, momentum=BN_MOMENTUM) + self.relu = nn.ReLU(inplace=True) + self.sf = nn.Softmax(dim=1) + self.layer1 = self._make_layer(Bottleneck, 64, 64, 4) + + self.stage2_cfg = extra['STAGE2'] + num_channels = self.stage2_cfg['NUM_CHANNELS'] + block = blocks_dict[self.stage2_cfg['BLOCK']] + num_channels = [ + num_channels[i] * block.expansion for i in range(len(num_channels))] + self.transition1 = self._make_transition_layer( + [256], num_channels) + self.stage2, pre_stage_channels = self._make_stage( + self.stage2_cfg, num_channels) + + self.stage3_cfg = extra['STAGE3'] + num_channels = self.stage3_cfg['NUM_CHANNELS'] + block = blocks_dict[self.stage3_cfg['BLOCK']] + num_channels = [ + num_channels[i] * block.expansion for i in range(len(num_channels))] + self.transition2 = self._make_transition_layer( + pre_stage_channels, num_channels) + self.stage3, pre_stage_channels = self._make_stage( + self.stage3_cfg, num_channels) + + self.stage4_cfg = extra['STAGE4'] + num_channels = self.stage4_cfg['NUM_CHANNELS'] + block = blocks_dict[self.stage4_cfg['BLOCK']] + num_channels = [ + num_channels[i] * block.expansion for i in range(len(num_channels))] + self.transition3 = self._make_transition_layer( + pre_stage_channels, num_channels) + self.stage4, pre_stage_channels = self._make_stage( + self.stage4_cfg, num_channels, multi_scale_output=True) + + final_inp_channels = sum(pre_stage_channels) + + self.head = nn.Sequential( + nn.Conv2d( + in_channels=final_inp_channels, + out_channels=final_inp_channels, + kernel_size=1, + stride=1, + padding=1 if extra.FINAL_CONV_KERNEL == 3 else 0), + BatchNorm2d(final_inp_channels, momentum=BN_MOMENTUM), + nn.ReLU(inplace=True), + nn.Conv2d( + in_channels=final_inp_channels, + out_channels=config.MODEL.NUM_JOINTS, + kernel_size=extra.FINAL_CONV_KERNEL, + stride=1, + padding=1 if extra.FINAL_CONV_KERNEL == 3 else 0) + ) + + def _make_transition_layer( + self, num_channels_pre_layer, num_channels_cur_layer): + num_branches_cur = len(num_channels_cur_layer) + num_branches_pre = len(num_channels_pre_layer) + + transition_layers = [] + for i in range(num_branches_cur): + if i < num_branches_pre: + if num_channels_cur_layer[i] != num_channels_pre_layer[i]: + transition_layers.append(nn.Sequential( + nn.Conv2d(num_channels_pre_layer[i], + num_channels_cur_layer[i], + 3, + 1, + 1, + bias=False), + BatchNorm2d( + num_channels_cur_layer[i], momentum=BN_MOMENTUM), + nn.ReLU(inplace=True))) + else: + transition_layers.append(None) + else: + conv3x3s = [] + for j in range(i + 1 - num_branches_pre): + inchannels = num_channels_pre_layer[-1] + outchannels = num_channels_cur_layer[i] \ + if j == i - num_branches_pre else inchannels + conv3x3s.append(nn.Sequential( + nn.Conv2d( + inchannels, outchannels, 3, 2, 1, bias=False), + BatchNorm2d(outchannels, momentum=BN_MOMENTUM), + nn.ReLU(inplace=True))) + transition_layers.append(nn.Sequential(*conv3x3s)) + + return nn.ModuleList(transition_layers) + + def _make_layer(self, block, inplanes, planes, blocks, stride=1): + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = nn.Sequential( + nn.Conv2d(inplanes, planes * block.expansion, + kernel_size=1, stride=stride, bias=False), + BatchNorm2d(planes * block.expansion, momentum=BN_MOMENTUM), + ) + + layers = [] + layers.append(block(inplanes, planes, stride, downsample)) + inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append(block(inplanes, planes)) + + return nn.Sequential(*layers) + + def _make_stage(self, layer_config, num_inchannels, + multi_scale_output=True): + num_modules = layer_config['NUM_MODULES'] + num_branches = layer_config['NUM_BRANCHES'] + num_blocks = layer_config['NUM_BLOCKS'] + num_channels = layer_config['NUM_CHANNELS'] + block = blocks_dict[layer_config['BLOCK']] + fuse_method = layer_config['FUSE_METHOD'] + + modules = [] + for i in range(num_modules): + # multi_scale_output is only used last module + if not multi_scale_output and i == num_modules - 1: + reset_multi_scale_output = False + else: + reset_multi_scale_output = True + modules.append( + HighResolutionModule(num_branches, + block, + num_blocks, + num_inchannels, + num_channels, + fuse_method, + reset_multi_scale_output) + ) + num_inchannels = modules[-1].get_num_inchannels() + + return nn.Sequential(*modules), num_inchannels + + def forward(self, x): + # h, w = x.size(2), x.size(3) + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + x = self.conv2(x) + x = self.bn2(x) + x = self.relu(x) + x = self.layer1(x) + + x_list = [] + for i in range(self.stage2_cfg['NUM_BRANCHES']): + if self.transition1[i] is not None: + x_list.append(self.transition1[i](x)) + else: + x_list.append(x) + y_list = self.stage2(x_list) + + x_list = [] + for i in range(self.stage3_cfg['NUM_BRANCHES']): + if self.transition2[i] is not None: + x_list.append(self.transition2[i](y_list[-1])) + else: + x_list.append(y_list[i]) + y_list = self.stage3(x_list) + + x_list = [] + for i in range(self.stage4_cfg['NUM_BRANCHES']): + if self.transition3[i] is not None: + x_list.append(self.transition3[i](y_list[-1])) + else: + x_list.append(y_list[i]) + x = self.stage4(x_list) + + # Head Part + height, width = x[0].size(2), x[0].size(3) + x1 = F.interpolate(x[1], size=(height, width), mode='bilinear', align_corners=False) + x2 = F.interpolate(x[2], size=(height, width), mode='bilinear', align_corners=False) + x3 = F.interpolate(x[3], size=(height, width), mode='bilinear', align_corners=False) + x = torch.cat([x[0], x1, x2, x3], 1) + x = self.head(x) + + return x + + def init_weights(self, pretrained=''): + logger.info('=> init weights from normal distribution') + for m in self.modules(): + if isinstance(m, nn.Conv2d): + # nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') + nn.init.normal_(m.weight, std=0.001) + # nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + if os.path.isfile(pretrained): + pretrained_dict = torch.load(pretrained) + logger.info('=> loading pretrained model {}'.format(pretrained)) + model_dict = self.state_dict() + pretrained_dict = {k: v for k, v in pretrained_dict.items() + if k in model_dict.keys()} + for k, _ in pretrained_dict.items(): + logger.info( + '=> loading {} pretrained model {}'.format(k, pretrained)) + model_dict.update(pretrained_dict) + self.load_state_dict(model_dict) + + +def get_face_alignment_net(config, **kwargs): + + model = HighResolutionNet(config, **kwargs) + pretrained = config.MODEL.PRETRAINED if config.MODEL.INIT_WEIGHTS else '' + model.init_weights(pretrained=pretrained) + + return model + diff --git a/FaceMaskOverlay/lib/utils/transforms.py b/FaceMaskOverlay/lib/utils/transforms.py new file mode 100644 index 000000000..a7822d2fc --- /dev/null +++ b/FaceMaskOverlay/lib/utils/transforms.py @@ -0,0 +1,247 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Created by Tianheng Cheng(tianhengcheng@gmail.com), Yang Zhao +# ------------------------------------------------------------------------------ + +import cv2 +import torch +import scipy +import scipy.misc +import numpy as np + + +MATCHED_PARTS = { + "300W": ([1, 17], [2, 16], [3, 15], [4, 14], [5, 13], [6, 12], [7, 11], [8, 10], + [18, 27], [19, 26], [20, 25], [21, 24], [22, 23], + [32, 36], [33, 35], + [37, 46], [38, 45], [39, 44], [40, 43], [41, 48], [42, 47], + [49, 55], [50, 54], [51, 53], [62, 64], [61, 65], [68, 66], [59, 57], [60, 56]), + "AFLW": ([1, 6], [2, 5], [3, 4], + [7, 12], [8, 11], [9, 10], + [13, 15], + [16, 18]), + "COFW": ([1, 2], [5, 7], [3, 4], [6, 8], [9, 10], [11, 12], [13, 15], [17, 18], [14, 16], [19, 20], [23, 24]), + "WFLW": ([0, 32], [1, 31], [2, 30], [3, 29], [4, 28], [5, 27], [6, 26], [7, 25], [8, 24], [9, 23], [10, 22], + [11, 21], [12, 20], [13, 19], [14, 18], [15, 17], # check + [33, 46], [34, 45], [35, 44], [36, 43], [37, 42], [38, 50], [39, 49], [40, 48], [41, 47], # elbrow + [60, 72], [61, 71], [62, 70], [63, 69], [64, 68], [65, 75], [66, 74], [67, 73], + [55, 59], [56, 58], + [76, 82], [77, 81], [78, 80], [87, 83], [86, 84], + [88, 92], [89, 91], [95, 93], [96, 97])} + + +def fliplr_joints(x, width, dataset='aflw'): + """ + flip coords + """ + matched_parts = MATCHED_PARTS[dataset] + # Flip horizontal + x[:, 0] = width - x[:, 0] + + if dataset == 'WFLW': + for pair in matched_parts: + tmp = x[pair[0], :].copy() + x[pair[0], :] = x[pair[1], :] + x[pair[1], :] = tmp + else: + for pair in matched_parts: + tmp = x[pair[0] - 1, :].copy() + x[pair[0] - 1, :] = x[pair[1] - 1, :] + x[pair[1] - 1, :] = tmp + return x + + +def get_3rd_point(a, b): + direct = a - b + return b + np.array([-direct[1], direct[0]], dtype=np.float32) + + +def get_dir(src_point, rot_rad): + sn, cs = np.sin(rot_rad), np.cos(rot_rad) + + src_result = [0, 0] + src_result[0] = src_point[0] * cs - src_point[1] * sn + src_result[1] = src_point[0] * sn + src_point[1] * cs + + return src_result + + +def get_affine_transform( + center, scale, rot, output_size, + shift=np.array([0, 0], dtype=np.float32), inv=0): + if not isinstance(scale, np.ndarray) and not isinstance(scale, list): + print(scale) + scale = np.array([scale, scale]) + + scale_tmp = scale * 200.0 + src_w = scale_tmp[0] + dst_w = output_size[0] + dst_h = output_size[1] + + rot_rad = np.pi * rot / 180 + src_dir = get_dir([0, src_w * -0.5], rot_rad) + dst_dir = np.array([0, dst_w * -0.5], np.float32) + + src = np.zeros((3, 2), dtype=np.float32) + dst = np.zeros((3, 2), dtype=np.float32) + src[0, :] = center + scale_tmp * shift + src[1, :] = center + src_dir + scale_tmp * shift + dst[0, :] = [dst_w * 0.5, dst_h * 0.5] + dst[1, :] = np.array([dst_w * 0.5, dst_h * 0.5]) + dst_dir + + src[2:, :] = get_3rd_point(src[0, :], src[1, :]) + dst[2:, :] = get_3rd_point(dst[0, :], dst[1, :]) + + if inv: + trans = cv2.getAffineTransform(np.float32(dst), np.float32(src)) + else: + trans = cv2.getAffineTransform(np.float32(src), np.float32(dst)) + + return trans + + +def crop_v2(img, center, scale, output_size, rot=0): + trans = get_affine_transform(center, scale, rot, output_size) + + dst_img = cv2.warpAffine( + img, trans, (int(output_size[0]), int(output_size[1])), + flags=cv2.INTER_LINEAR + ) + + return dst_img + + +def get_transform(center, scale, output_size, rot=0): + """ + General image processing functions + """ + # Generate transformation matrix + h = 200 * scale + t = np.zeros((3, 3)) + t[0, 0] = float(output_size[1]) / h + t[1, 1] = float(output_size[0]) / h + t[0, 2] = output_size[1] * (-float(center[0]) / h + .5) + t[1, 2] = output_size[0] * (-float(center[1]) / h + .5) + t[2, 2] = 1 + if not rot == 0: + rot = -rot # To match direction of rotation from cropping + rot_mat = np.zeros((3, 3)) + rot_rad = rot * np.pi / 180 + sn, cs = np.sin(rot_rad), np.cos(rot_rad) + rot_mat[0, :2] = [cs, -sn] + rot_mat[1, :2] = [sn, cs] + rot_mat[2, 2] = 1 + # Need to rotate around center + t_mat = np.eye(3) + t_mat[0, 2] = -output_size[1]/2 + t_mat[1, 2] = -output_size[0]/2 + t_inv = t_mat.copy() + t_inv[:2, 2] *= -1 + t = np.dot(t_inv, np.dot(rot_mat, np.dot(t_mat, t))) + return t + + +def transform_pixel(pt, center, scale, output_size, invert=0, rot=0): + # Transform pixel location to different reference + t = get_transform(center, scale, output_size, rot=rot) + if invert: + t = np.linalg.inv(t) + new_pt = np.array([pt[0] - 1, pt[1] - 1, 1.]).T + new_pt = np.dot(t, new_pt) + return new_pt[:2].astype(int) + 1 + + +def transform_preds(coords, center, scale, output_size): + + for p in range(coords.size(0)): + coords[p, 0:2] = torch.tensor(transform_pixel(coords[p, 0:2], center, scale, output_size, 1, 0)) + return coords + + +def crop(img, center, scale, output_size, rot=0): + center_new = center.clone() + + # Preprocessing for efficient cropping + ht, wd = img.shape[0], img.shape[1] + sf = scale * 200.0 / output_size[0] + if sf < 2: + sf = 1 + else: + new_size = int(np.math.floor(max(ht, wd) / sf)) + new_ht = int(np.math.floor(ht / sf)) + new_wd = int(np.math.floor(wd / sf)) + if new_size < 2: + return torch.zeros(output_size[0], output_size[1], img.shape[2]) \ + if len(img.shape) > 2 else torch.zeros(output_size[0], output_size[1]) + else: + img = cv2.resize(img, (new_wd, new_ht), interpolation=cv2.INTER_LINEAR) + center_new[0] = center_new[0] * 1.0 / sf + center_new[1] = center_new[1] * 1.0 / sf + scale = scale / sf + + # Upper left point + ul = np.array(transform_pixel([0, 0], center_new, scale, output_size, invert=1)) + # Bottom right point + br = np.array(transform_pixel(output_size, center_new, scale, output_size, invert=1)) + + # Padding so that when rotated proper amount of context is included + pad = int(np.linalg.norm(br - ul) / 2 - float(br[1] - ul[1]) / 2) + if not rot == 0: + ul -= pad + br += pad + + new_shape = [br[1] - ul[1], br[0] - ul[0]] + if len(img.shape) > 2: + new_shape += [img.shape[2]] + + new_img = np.zeros(new_shape, dtype=np.float32) + + # Range to fill new array + new_x = max(0, -ul[0]), min(br[0], len(img[0])) - ul[0] + new_y = max(0, -ul[1]), min(br[1], len(img)) - ul[1] + # Range to sample from original image + old_x = max(0, ul[0]), min(len(img[0]), br[0]) + old_y = max(0, ul[1]), min(len(img), br[1]) + new_img[new_y[0]:new_y[1], new_x[0]:new_x[1]] = img[old_y[0]:old_y[1], old_x[0]:old_x[1]] + + if not rot == 0: + # Remove padding + new_img = scipy.misc.imrotate(new_img, rot) + new_img = new_img[pad:-pad, pad:-pad] + new_img = cv2.resize( + new_img, (output_size[0], output_size[1]), interpolation=cv2.INTER_LINEAR + ) + return new_img + + +def generate_target(img, pt, sigma, label_type='Gaussian'): + # Check that any part of the gaussian is in-bounds + tmp_size = sigma * 3 + ul = [int(pt[0] - tmp_size), int(pt[1] - tmp_size)] + br = [int(pt[0] + tmp_size + 1), int(pt[1] + tmp_size + 1)] + if (ul[0] >= img.shape[1] or ul[1] >= img.shape[0] or + br[0] < 0 or br[1] < 0): + # If not, just return the image as is + return img + + # Generate gaussian + size = 2 * tmp_size + 1 + x = np.arange(0, size, 1, np.float32) + y = x[:, np.newaxis] + x0 = y0 = size // 2 + # The gaussian is not normalized, we want the center value to equal 1 + if label_type == 'Gaussian': + g = np.exp(- ((x - x0) ** 2 + (y - y0) ** 2) / (2 * sigma ** 2)) + else: + g = sigma / (((x - x0) ** 2 + (y - y0) ** 2 + sigma ** 2) ** 1.5) + + # Usable gaussian range + g_x = max(0, -ul[0]), min(br[0], img.shape[1]) - ul[0] + g_y = max(0, -ul[1]), min(br[1], img.shape[0]) - ul[1] + # Image range + img_x = max(0, ul[0]), min(br[0], img.shape[1]) + img_y = max(0, ul[1]), min(br[1], img.shape[0]) + + img[img_y[0]:img_y[1], img_x[0]:img_x[1]] = g[g_y[0]:g_y[1], g_x[0]:g_x[1]] + return img diff --git a/FaceMaskOverlay/lib/utils/utils.py b/FaceMaskOverlay/lib/utils/utils.py new file mode 100644 index 000000000..c9c75c6f6 --- /dev/null +++ b/FaceMaskOverlay/lib/utils/utils.py @@ -0,0 +1,97 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Written by Bin Xiao (Bin.Xiao@microsoft.com) +# Modified by Ke Sun (sunk@mail.ustc.edu.cn), Tianheng Cheng(tianhengcheng@gmail.com) +# ------------------------------------------------------------------------------ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import logging +import time +from pathlib import Path + +import torch +import torch.optim as optim + + +def create_logger(cfg, cfg_name, phase='train'): + root_output_dir = Path(cfg.OUTPUT_DIR) + # set up logger + if not root_output_dir.exists(): + print('=> creating {}'.format(root_output_dir)) + root_output_dir.mkdir() + + dataset = cfg.DATASET.DATASET + model = cfg.MODEL.NAME + cfg_name = os.path.basename(cfg_name).split('.')[0] + + final_output_dir = root_output_dir / dataset / cfg_name + + print('=> creating {}'.format(final_output_dir)) + final_output_dir.mkdir(parents=True, exist_ok=True) + + time_str = time.strftime('%Y-%m-%d-%H-%M') + log_file = '{}_{}_{}.log'.format(cfg_name, time_str, phase) + final_log_file = final_output_dir / log_file + head = '%(asctime)-15s %(message)s' + logging.basicConfig(filename=str(final_log_file), + format=head) + logger = logging.getLogger() + logger.setLevel(logging.INFO) + console = logging.StreamHandler() + logging.getLogger('').addHandler(console) + + tensorboard_log_dir = Path(cfg.LOG_DIR) / dataset / model / \ + (cfg_name + '_' + time_str) + print('=> creating {}'.format(tensorboard_log_dir)) + tensorboard_log_dir.mkdir(parents=True, exist_ok=True) + + return logger, str(final_output_dir), str(tensorboard_log_dir) + + +def get_optimizer(cfg, model): + optimizer = None + if cfg.TRAIN.OPTIMIZER == 'sgd': + optimizer = optim.SGD( + filter(lambda p: p.requires_grad, model.parameters()), + lr=cfg.TRAIN.LR, + momentum=cfg.TRAIN.MOMENTUM, + weight_decay=cfg.TRAIN.WD, + nesterov=cfg.TRAIN.NESTEROV + ) + elif cfg.TRAIN.OPTIMIZER == 'adam': + optimizer = optim.Adam( + filter(lambda p: p.requires_grad, model.parameters()), + lr=cfg.TRAIN.LR + ) + elif cfg.TRAIN.OPTIMIZER == 'rmsprop': + optimizer = optim.RMSprop( + filter(lambda p: p.requires_grad, model.parameters()), + lr=cfg.TRAIN.LR, + momentum=cfg.TRAIN.MOMENTUM, + weight_decay=cfg.TRAIN.WD, + alpha=cfg.TRAIN.RMSPROP_ALPHA, + centered=cfg.TRAIN.RMSPROP_CENTERED + ) + + return optimizer + + +def save_checkpoint(states, predictions, is_best, + output_dir, filename='checkpoint.pth'): + preds = predictions.cpu().data.numpy() + torch.save(states, os.path.join(output_dir, filename)) + torch.save(preds, os.path.join(output_dir, 'current_pred.pth')) + + latest_path = os.path.join(output_dir, 'latest.pth') + if os.path.islink(latest_path): + os.remove(latest_path) + os.symlink(os.path.join(output_dir, filename), latest_path) + + if is_best and 'state_dict' in states.keys(): + torch.save(states['state_dict'].module, os.path.join(output_dir, 'model_best.pth')) + diff --git a/FaceMaskOverlay/masks/3m.csv b/FaceMaskOverlay/masks/3m.csv new file mode 100644 index 000000000..6f63eeaf9 --- /dev/null +++ b/FaceMaskOverlay/masks/3m.csv @@ -0,0 +1,17 @@ +landmark,x,y +2,239,521 +3,231,710 +4,263,893 +5,316,1134 +6,439,1358 +7,582,1516 +8,763,1596 +9,1024,1626 +10,1300,1593 +11,1488,1491 +12,1614,1360 +13,1689,1132 +14,1711,891 +15,1744,715 +16,1769,507 +30,1025,307 diff --git a/FaceMaskOverlay/masks/3m.png b/FaceMaskOverlay/masks/3m.png new file mode 100644 index 000000000..35fb65181 Binary files /dev/null and b/FaceMaskOverlay/masks/3m.png differ diff --git a/FaceMaskOverlay/masks/anti_covid.csv b/FaceMaskOverlay/masks/anti_covid.csv new file mode 100644 index 000000000..49d94329b --- /dev/null +++ b/FaceMaskOverlay/masks/anti_covid.csv @@ -0,0 +1,17 @@ +landmark,x,y +2,87,112 +3,96,186 +4,109,265 +5,136,321 +6,168,366 +7,206,407 +8,256,440 +9,322,457 +10,390,441 +11,439,407 +12,473,369 +13,507,322 +14,530,279 +15,550,187 +16,558,114 +30,323,109 diff --git a/FaceMaskOverlay/masks/anti_covid.png b/FaceMaskOverlay/masks/anti_covid.png new file mode 100644 index 000000000..3aea84e63 Binary files /dev/null and b/FaceMaskOverlay/masks/anti_covid.png differ diff --git a/FaceMaskOverlay/masks/subzero.csv b/FaceMaskOverlay/masks/subzero.csv new file mode 100644 index 000000000..1d911b0e0 --- /dev/null +++ b/FaceMaskOverlay/masks/subzero.csv @@ -0,0 +1,17 @@ +landmark,x,y +2,163,120 +3,152,340 +4,179,532 +5,207,698 +6,251,890 +7,419,1115 +8,565,1268 +9,1027,1385 +10,1473,1270 +11,1621,1116 +12,1797,881 +13,1834,696 +14,1854,528 +15,1885,336 +16,1880,124 +30,1023,100 diff --git a/FaceMaskOverlay/masks/subzero.png b/FaceMaskOverlay/masks/subzero.png new file mode 100644 index 000000000..52d6f397b Binary files /dev/null and b/FaceMaskOverlay/masks/subzero.png differ diff --git a/FaceMaskOverlay/masks/white_mask.csv b/FaceMaskOverlay/masks/white_mask.csv new file mode 100644 index 000000000..b7bb2061f --- /dev/null +++ b/FaceMaskOverlay/masks/white_mask.csv @@ -0,0 +1,17 @@ +landmark,x,y +2,256,212 +3,250,322 +4,266,479 +5,293,605 +6,373,757 +7,481,846 +8,631,928 +9,797,981 +10,988,923 +11,1113,849 +12,1239,734 +13,1305,650 +14,1316,484 +15,1325,321 +16,1320,222 +30,806,250 diff --git a/FaceMaskOverlay/masks/white_mask.png b/FaceMaskOverlay/masks/white_mask.png new file mode 100644 index 000000000..3d722b0ad Binary files /dev/null and b/FaceMaskOverlay/masks/white_mask.png differ diff --git a/FaceMaskOverlay/overlay_with_mask.py b/FaceMaskOverlay/overlay_with_mask.py new file mode 100644 index 000000000..37290ac0b --- /dev/null +++ b/FaceMaskOverlay/overlay_with_mask.py @@ -0,0 +1,284 @@ +import argparse +import csv +import os +import pprint +from collections import OrderedDict + +import cv2 +import numpy as np +import torch + +import lib.models as models +from lib.config import ( + config, + update_config, +) +from lib.core.evaluation import decode_preds +from lib.utils import utils +from lib.utils.transforms import crop + + +def parse_args(): + + parser = argparse.ArgumentParser(description="Face Mask Overlay") + + parser.add_argument( + "--cfg", help="experiment configuration filename", required=True, type=str, + ) + parser.add_argument( + "--landmark_model", + help="path to model for landmarks exctraction", + required=True, + type=str, + ) + parser.add_argument( + "--detector_model", + help="path to detector model", + type=str, + default="detection/face_detector.prototxt", + ) + parser.add_argument( + "--detector_weights", + help="path to detector weights", + type=str, + default="detection/face_detector.caffemodel", + ) + parser.add_argument( + "--mask_image", help="path to a .png file with a mask", required=True, type=str, + ) + parser.add_argument("--device", default="cpu", help="Device to inference on") + + args = parser.parse_args() + update_config(config, args) + return args + + +def main(): + + # parsing script arguments + args = parse_args() + device = torch.device(args.device) + + # initialize logger + logger, final_output_dir, tb_log_dir = utils.create_logger(config, args.cfg, "demo") + + # log arguments and config values + logger.info(pprint.pformat(args)) + logger.info(pprint.pformat(config)) + + # init landmark model + model = models.get_face_alignment_net(config) + + # get input size from the config + input_size = config.MODEL.IMAGE_SIZE + + # load model + state_dict = torch.load(args.landmark_model, map_location=device) + + # remove `module.` prefix from the pre-trained weights + new_state_dict = OrderedDict() + for key, value in state_dict.items(): + name = key[7:] + new_state_dict[name] = value + + # load weights without the prefix + model.load_state_dict(new_state_dict) + # run model on device + model = model.to(device) + + # init mean and std values for the landmark model's input + mean = config.MODEL.MEAN + mean = np.array(mean, dtype=np.float32) + std = config.MODEL.STD + std = np.array(std, dtype=np.float32) + + # defining prototxt and caffemodel paths + detector_model = args.detector_model + detector_weights = args.detector_weights + + # load model + detector = cv2.dnn.readNetFromCaffe(detector_model, detector_weights) + capture = cv2.VideoCapture(0) + + frame_num = 0 + while True: + # capture frame-by-frame + success, frame = capture.read() + + # break if no frame + if not success: + break + + frame_num += 1 + print("frame_num: ", frame_num) + landmarks_img = frame.copy() + result = frame.copy() + result = result.astype(np.float32) / 255.0 + + # get frame's height and width + height, width = frame.shape[:2] # 640x480 + + # resize and subtract BGR mean values, since Caffe uses BGR images for input + blob = cv2.dnn.blobFromImage( + frame, scalefactor=1.0, size=(300, 300), mean=(104.0, 177.0, 123.0), + ) + # passing blob through the network to detect faces + detector.setInput(blob) + # detector output format: + # [image_id, class, confidence, left, bottom, right, top] + face_detections = detector.forward() + + # loop over the detections + for i in range(0, face_detections.shape[2]): + # extract confidence + confidence = face_detections[0, 0, i, 2] + + # filter detections by confidence greater than the minimum threshold + if confidence > 0.5: + # get coordinates of the bounding box + box = face_detections[0, 0, i, 3:7] * np.array( + [width, height, width, height], + ) + (x1, y1, x2, y2) = box.astype("int") + + # show original image + cv2.imshow("original image", frame) + + # crop to detection and resize + resized = crop( + frame, + torch.Tensor([x1 + (x2 - x1) / 2, y1 + (y2 - y1) / 2]), + 1.5, + tuple(input_size), + ) + + # convert from BGR to RGB since HRNet expects RGB format + resized = cv2.cvtColor(resized, cv2.COLOR_BGR2RGB) + img = resized.astype(np.float32) / 255.0 + # normalize landmark net input + normalized_img = (img - mean) / std + + # predict face landmarks + model = model.eval() + with torch.no_grad(): + input = torch.Tensor(normalized_img.transpose([2, 0, 1])) + input = input.to(device) + output = model(input.unsqueeze(0)) + score_map = output.data.cpu() + preds = decode_preds( + score_map, + [torch.Tensor([x1 + (x2 - x1) / 2, y1 + (y2 - y1) / 2])], + [1.5], + score_map.shape[2:4], + ) + + preds = preds.squeeze(0) + landmarks = preds.data.cpu().detach().numpy() + # draw landmarks + for k, landmark in enumerate(landmarks, 1): + landmarks_img = cv2.circle( + landmarks_img, + center=(landmark[0], landmark[1]), + radius=3, + color=(0, 0, 255), + thickness=-1, + ) + # draw landmarks' labels + landmarks_img = cv2.putText( + img=landmarks_img, + text=str(k), + org=(int(landmark[0]) + 5, int(landmark[1]) + 5), + fontFace=cv2.FONT_HERSHEY_SIMPLEX, + fontScale=0.5, + color=(0, 0, 255), + ) + + # show results by drawing predicted landmarks and their labels + cv2.imshow("image with landmarks", landmarks_img) + + # get chosen landmarks 2-16, 30 as destination points + # note that landmarks numbering starts from 0 + dst_pts = np.array( + [ + landmarks[1], + landmarks[2], + landmarks[3], + landmarks[4], + landmarks[5], + landmarks[6], + landmarks[7], + landmarks[8], + landmarks[9], + landmarks[10], + landmarks[11], + landmarks[12], + landmarks[13], + landmarks[14], + landmarks[15], + landmarks[29], + ], + dtype="float32", + ) + + # load mask annotations from csv file to source points + mask_annotation = os.path.splitext(os.path.basename(args.mask_image))[0] + mask_annotation = os.path.join( + os.path.dirname(args.mask_image), mask_annotation + ".csv", + ) + + with open(mask_annotation) as csv_file: + csv_reader = csv.reader(csv_file, delimiter=",") + src_pts = [] + for i, row in enumerate(csv_reader): + # skip head or empty line if it's there + try: + src_pts.append(np.array([float(row[1]), float(row[2])])) + except ValueError: + continue + src_pts = np.array(src_pts, dtype="float32") + + # overlay with a mask only if all landmarks have positive coordinates: + if (landmarks > 0).all(): + # load mask image + mask_img = cv2.imread(args.mask_image, cv2.IMREAD_UNCHANGED) + mask_img = mask_img.astype(np.float32) + mask_img = mask_img / 255.0 + + # get the perspective transformation matrix + M, _ = cv2.findHomography(src_pts, dst_pts) + + # transformed masked image + transformed_mask = cv2.warpPerspective( + mask_img, + M, + (result.shape[1], result.shape[0]), + None, + cv2.INTER_LINEAR, + cv2.BORDER_CONSTANT, + ) + + # mask overlay + alpha_mask = transformed_mask[:, :, 3] + alpha_image = 1.0 - alpha_mask + + for c in range(0, 3): + result[:, :, c] = ( + alpha_mask * transformed_mask[:, :, c] + + alpha_image * result[:, :, c] + ) + + # display the resulting frame + cv2.imshow("image with mask overlay", result) + + # waiting for the escape button to exit + k = cv2.waitKey(1) + if k == 27: + break + + # when everything done, release the capture + capture.release() + cv2.destroyAllWindows() + + +if __name__ == "__main__": + main() diff --git a/FaceMaskOverlay/requirements.txt b/FaceMaskOverlay/requirements.txt new file mode 100644 index 000000000..a630d5dee --- /dev/null +++ b/FaceMaskOverlay/requirements.txt @@ -0,0 +1,5 @@ +numpy>=1.14.0 +opencv-python +torch>=1.0.0 +torchvision>=0.2.1 +yacs diff --git a/FaceMaskOverlay/tools/test.py b/FaceMaskOverlay/tools/test.py new file mode 100644 index 000000000..fcfae3b61 --- /dev/null +++ b/FaceMaskOverlay/tools/test.py @@ -0,0 +1,85 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Created by Tianheng Cheng(tianhengcheng@gmail.com) +# ------------------------------------------------------------------------------ + +import os +import pprint +import argparse + +import torch +import torch.nn as nn +import torch.backends.cudnn as cudnn +from torch.utils.data import DataLoader +import sys +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) +import lib.models as models +from lib.config import config, update_config +from lib.utils import utils +from lib.datasets import get_dataset +from lib.core import function + + +def parse_args(): + + parser = argparse.ArgumentParser(description='Train Face Alignment') + + parser.add_argument('--cfg', help='experiment configuration filename', + required=True, type=str) + parser.add_argument('--model-file', help='model parameters', required=True, type=str) + + args = parser.parse_args() + update_config(config, args) + return args + + +def main(): + + args = parse_args() + + logger, final_output_dir, tb_log_dir = \ + utils.create_logger(config, args.cfg, 'test') + + logger.info(pprint.pformat(args)) + logger.info(pprint.pformat(config)) + + cudnn.benchmark = config.CUDNN.BENCHMARK + cudnn.determinstic = config.CUDNN.DETERMINISTIC + cudnn.enabled = config.CUDNN.ENABLED + + config.defrost() + config.MODEL.INIT_WEIGHTS = False + config.freeze() + model = models.get_face_alignment_net(config) + + gpus = list(config.GPUS) + model = nn.DataParallel(model, device_ids=gpus).cuda() + + # load model + state_dict = torch.load(args.model_file) + if 'state_dict' in state_dict.keys(): + state_dict = state_dict['state_dict'] + model.load_state_dict(state_dict) + else: + model.module.load_state_dict(state_dict) + + dataset_type = get_dataset(config) + + test_loader = DataLoader( + dataset=dataset_type(config, + is_train=False), + batch_size=config.TEST.BATCH_SIZE_PER_GPU*len(gpus), + shuffle=False, + num_workers=config.WORKERS, + pin_memory=config.PIN_MEMORY + ) + + nme, predictions = function.inference(config, test_loader, model) + + torch.save(predictions, os.path.join(final_output_dir, 'predictions.pth')) + + +if __name__ == '__main__': + main() + diff --git a/FaceMaskOverlay/tools/train.py b/FaceMaskOverlay/tools/train.py new file mode 100644 index 000000000..64ad77b62 --- /dev/null +++ b/FaceMaskOverlay/tools/train.py @@ -0,0 +1,154 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Created by Tianheng Cheng(tianhengcheng@gmail.com) +# ------------------------------------------------------------------------------ + +import os +import pprint +import argparse + +import torch +import torch.nn as nn +import torch.optim as optim +import torch.backends.cudnn as cudnn +from tensorboardX import SummaryWriter +from torch.utils.data import DataLoader +import sys +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) +import lib.models as models +from lib.config import config, update_config +from lib.datasets import get_dataset +from lib.core import function +from lib.utils import utils + + +def parse_args(): + + parser = argparse.ArgumentParser(description='Train Face Alignment') + + parser.add_argument('--cfg', help='experiment configuration filename', + required=True, type=str) + + args = parser.parse_args() + update_config(config, args) + return args + + +def main(): + + args = parse_args() + + logger, final_output_dir, tb_log_dir = \ + utils.create_logger(config, args.cfg, 'train') + + logger.info(pprint.pformat(args)) + logger.info(pprint.pformat(config)) + + cudnn.benchmark = config.CUDNN.BENCHMARK + cudnn.determinstic = config.CUDNN.DETERMINISTIC + cudnn.enabled = config.CUDNN.ENABLED + + model = models.get_face_alignment_net(config) + + # copy model files + writer_dict = { + 'writer': SummaryWriter(log_dir=tb_log_dir), + 'train_global_steps': 0, + 'valid_global_steps': 0, + } + + gpus = list(config.GPUS) + model = nn.DataParallel(model, device_ids=gpus).cuda() + + # loss + criterion = torch.nn.MSELoss(size_average=True).cuda() + + optimizer = utils.get_optimizer(config, model) + best_nme = 100 + last_epoch = config.TRAIN.BEGIN_EPOCH + if config.TRAIN.RESUME: + model_state_file = os.path.join(final_output_dir, + 'latest.pth') + if os.path.islink(model_state_file): + checkpoint = torch.load(model_state_file) + last_epoch = checkpoint['epoch'] + best_nme = checkpoint['best_nme'] + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + print("=> loaded checkpoint (epoch {})" + .format(checkpoint['epoch'])) + else: + print("=> no checkpoint found") + + if isinstance(config.TRAIN.LR_STEP, list): + lr_scheduler = torch.optim.lr_scheduler.MultiStepLR( + optimizer, config.TRAIN.LR_STEP, + config.TRAIN.LR_FACTOR, last_epoch-1 + ) + else: + lr_scheduler = torch.optim.lr_scheduler.StepLR( + optimizer, config.TRAIN.LR_STEP, + config.TRAIN.LR_FACTOR, last_epoch-1 + ) + dataset_type = get_dataset(config) + + train_loader = DataLoader( + dataset=dataset_type(config, + is_train=True), + batch_size=config.TRAIN.BATCH_SIZE_PER_GPU*len(gpus), + shuffle=config.TRAIN.SHUFFLE, + num_workers=config.WORKERS, + pin_memory=config.PIN_MEMORY) + + val_loader = DataLoader( + dataset=dataset_type(config, + is_train=False), + batch_size=config.TEST.BATCH_SIZE_PER_GPU*len(gpus), + shuffle=False, + num_workers=config.WORKERS, + pin_memory=config.PIN_MEMORY + ) + + for epoch in range(last_epoch, config.TRAIN.END_EPOCH): + lr_scheduler.step() + + function.train(config, train_loader, model, criterion, + optimizer, epoch, writer_dict) + + # evaluate + nme, predictions = function.validate(config, val_loader, model, + criterion, epoch, writer_dict) + + is_best = nme < best_nme + best_nme = min(nme, best_nme) + + logger.info('=> saving checkpoint to {}'.format(final_output_dir)) + print("best:", is_best) + utils.save_checkpoint( + {"state_dict": model, + "epoch": epoch + 1, + "best_nme": best_nme, + "optimizer": optimizer.state_dict(), + }, predictions, is_best, final_output_dir, 'checkpoint_{}.pth'.format(epoch)) + + final_model_state_file = os.path.join(final_output_dir, + 'final_state.pth') + logger.info('saving final model state to {}'.format( + final_model_state_file)) + torch.save(model.module.state_dict(), final_model_state_file) + writer_dict['writer'].close() + + +if __name__ == '__main__': + main() + + + + + + + + + + diff --git a/Getting-Started-OpenCV-CUDA-Module/README.md b/Getting-Started-OpenCV-CUDA-Module/README.md new file mode 100644 index 000000000..9b354d85a --- /dev/null +++ b/Getting-Started-OpenCV-CUDA-Module/README.md @@ -0,0 +1,189 @@ +# OpenCV GPU Support + +This repository contains the code for [Getting Started with OpenCV CUDA Module](https://www.learnopencv.com/getting-started-opencv-cuda-module/) + +## Getting Started + +Our code is tested using Python 3.7.5, but it should also work with any other python3.x. If you'd like to check your +version run: + +```bash +python3 -V +``` + +### Virtual Environment + +Let's create a new virtual environment. You'll need to install [virtualenv](https://pypi.org/project/virtualenv/) +package if you don't have it: + +```bash +pip install virtualenv +``` + +Now we can create a new virtualenv variable and call it `env`: + +```bash +python3 -m venv env +``` + +The last thing we have to do is to activate it: + +```bash +source env/bin/activate +``` + +### Numpy + +Install numpy package by running: + +```bash +pip install numpy +``` + +### Installing CUDA + +The code was tested using CUDA Toolkit 10.2. Please follow the official instruction to download +[CUDA Toolkit 10.2](https://developer.nvidia.com/cuda-10.2-download-archive) or higher. + +### OpenCV with CUDA Support + +In this blog post, we're using OpenCV with CUDA support to accelerate OpenCV algorithms. That is why we will need to +customize the OpenCV library build and make it from scratch. To do so: + +1. Install dependencies: + +```bash +sudo apt-get update +sudo apt-get install build-essential cmake unzip pkg-config +sudo apt-get install libjpeg-dev libpng-dev libtiff-dev +sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev +sudo apt-get install libxvidcore-dev libx264-dev +sudo apt-get install libgtk-3-dev +sudo apt-get install libatlas-base-dev gfortran +sudo apt-get install python3-dev + +``` + +2. Download the latest OpenCV version from the official repository: + +```bash +wget -O opencv.zip https://github.com/opencv/opencv/archive/4.4.0.zip +wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.4.0.zip +``` + +3. Unzip the downloaded archives: + +```bash +unzip opencv.zip +unzip opencv_contrib.zip +``` + +4. Rename the directories to match CMake paths: + +```bash +mv opencv-4.4.0 opencv +mv opencv_contrib-4.4.0 opencv_contrib +``` + +5. Compile OpenCV: + +Create and enter a build directory: + +```bash +cd opencv +mkdir build +cd build +``` + +Run CMake to configure the OpenCV build. Don't forget to set the right pass to the `PYTHON_EXECUTABLE`. If you are using +the CUDA version different from `10.2`, please change the last 3 arguments accordingly. + +```bash +cmake -D CMAKE_BUILD_TYPE=RELEASE \ + -D CMAKE_INSTALL_PREFIX=/usr/local \ + -D INSTALL_PYTHON_EXAMPLES=OFF \ + -D INSTALL_C_EXAMPLES=OFF \ + -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ + -D PYTHON_EXECUTABLE=env/bin/python3 \ + -D BUILD_EXAMPLES=ON \ + -D WITH_CUDA=ON \ + -D CUDA_FAST_MATH=ON \ + -D WITH_CUBLAS=ON \ + -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.2 \ + -D OpenCL_LIBRARY=/usr/local/cuda-10.2/lib64/libOpenCL.so \ + -DOpenCL_INCLUDE_DIR=/usr/local/cuda-10.2/include/ \ + .. +``` + +Check the output and make sure that everything is set correctly. After that we're ready to build it with: + +```bash +make -j4 +``` + +Make sure, you didn't get any errors. Then run the following command: + +```bash +sudo ldconfig +``` + +which creates the necessary links and cache to our freshly built shared library. + +Rename the created Python3 bindings for OpenCV to `cv2.so`: + +```bash +mv lib/python3/cv2.cpython-37m-x86_64-linux-gnu.so cv2.so +``` + +The last step is to create a symlink of our OpenCV `cv2.so` into the virtual environment installed packages: + +```bash +cd env/lib/python3.7/site-packages/ +ln -s ~/opencv/build/cv2.so cv2.so +``` + +## Running the Demo + +**C++** + +You first need to compile .cpp file with the following command: + +```bash +g++ `pkg-config --cflags --libs opencv4` demo.cpp -o demo.out -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_videoio -lopencv_video -lopencv_cudaarithm -lopencv_cudaoptflow -lopencv_cudaimgproc -lopencv_cudawarping -std=c++11 + +``` + +After that to run the demo, you will need to pass: + +- path to the video file, +- device, to choose between CPU and GPU inference. By default, the device is set to "cpu". + +For example: + +```bash +./demo.out video/boat.mp4 gpu +``` + +**Python** + +To run the demo, you will need to pass: + +- `--video` argument to set the path to the video file, +- `--device` to choose between CPU and GPU inference. By default, the device is set to "cpu". + +For example: + +```bash +python3 demo.py --video video/boat.mp4 --device "cpu" +``` + + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
diff --git a/Getting-Started-OpenCV-CUDA-Module/demo.cpp b/Getting-Started-OpenCV-CUDA-Module/demo.cpp new file mode 100644 index 000000000..d5eb8df8f --- /dev/null +++ b/Getting-Started-OpenCV-CUDA-Module/demo.cpp @@ -0,0 +1,363 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace cv; +using namespace cv::cuda; +using namespace std; +using namespace std::chrono; + + +void calculate_optical_flow(string videoFileName, string device) +{ + // init map to track time for every stage at each iteration + unordered_map> timers; + + // init video capture with video + VideoCapture capture(videoFileName); + if (!capture.isOpened()) + { + // error in opening the video file + cout << "Unable to open file!" << endl; + return; + } + + // get default video FPS + double fps = capture.get(CAP_PROP_FPS); + + // get total number of video frames + int num_frames = int(capture.get(CAP_PROP_FRAME_COUNT)); + + // read the first frame + cv::Mat frame, previous_frame; + capture >> frame; + + if (device == "cpu") + { + // resize frame + cv::resize(frame, frame, Size(960, 540), 0, 0, INTER_LINEAR); + + // convert to gray + cv::cvtColor(frame, previous_frame, COLOR_BGR2GRAY); + + // declare outputs for optical flow + cv::Mat magnitude, normalized_magnitude, angle; + cv::Mat hsv[3], merged_hsv, hsv_8u, bgr; + + // set saturation to 1 + hsv[1] = cv::Mat::ones(frame.size(), CV_32F); + + while (true) + { + // start full pipeline timer + auto start_full_time = high_resolution_clock::now(); + + // start reading timer + auto start_read_time = high_resolution_clock::now(); + + // capture frame-by-frame + capture >> frame; + + if (frame.empty()) + break; + + // end reading timer + auto end_read_time = high_resolution_clock::now(); + + // add elapsed iteration time + timers["reading"].push_back(duration_cast(end_read_time - start_read_time).count() / 1000.0); + + // start pre-process timer + auto start_pre_time = high_resolution_clock::now(); + + // resize frame + cv::resize(frame, frame, Size(960, 540), 0, 0, INTER_LINEAR); + + // convert to gray + cv::Mat current_frame; + cv::cvtColor(frame, current_frame, COLOR_BGR2GRAY); + + // end pre-process timer + auto end_pre_time = high_resolution_clock::now(); + + // add elapsed iteration time + timers["pre-process"].push_back(duration_cast(end_pre_time - start_pre_time).count() / 1000.0); + + // start optical flow timer + auto start_of_time = high_resolution_clock::now(); + + // calculate optical flow + cv::Mat flow; + calcOpticalFlowFarneback(previous_frame, current_frame, flow, 0.5, 5, 15, 3, 5, 1.2, 0); + + // end optical flow timer + auto end_of_time = high_resolution_clock::now(); + + // add elapsed iteration time + timers["optical flow"].push_back(duration_cast(end_of_time - start_of_time).count() / 1000.0); + + // start post-process timer + auto start_post_time = high_resolution_clock::now(); + + // split the output flow into 2 vectors + cv::Mat flow_xy[2], flow_x, flow_y; + split(flow, flow_xy); + + // get the result + flow_x = flow_xy[0]; + flow_y = flow_xy[1]; + + // convert from cartesian to polar coordinates + cv::cartToPolar(flow_x, flow_y, magnitude, angle, true); + + // normalize magnitude from 0 to 1 + cv::normalize(magnitude, normalized_magnitude, 0.0, 1.0, NORM_MINMAX); + + // get angle of optical flow + angle *= ((1 / 360.0) * (180 / 255.0)); + + // build hsv image + hsv[0] = angle; + hsv[2] = normalized_magnitude; + merge(hsv, 3, merged_hsv); + + // multiply each pixel value to 255 + merged_hsv.convertTo(hsv_8u, CV_8U, 255); + + // convert hsv to bgr + cv::cvtColor(hsv_8u, bgr, COLOR_HSV2BGR); + + // update previous_frame value + previous_frame = current_frame; + + // end post pipeline timer + auto end_post_time = high_resolution_clock::now(); + + // add elapsed iteration time + timers["post-process"].push_back(duration_cast(end_post_time - start_post_time).count() / 1000.0); + + // end full pipeline timer + auto end_full_time = high_resolution_clock::now(); + + // add elapsed iteration time + timers["full pipeline"].push_back(duration_cast(end_full_time - start_full_time).count() / 1000.0); + + // visualization + imshow("original", frame); + imshow("result", bgr); + int keyboard = waitKey(1); + if (keyboard == 27) + break; + } + } + else + { + // resize frame + cv::resize(frame, frame, Size(960, 540), 0, 0, INTER_LINEAR); + + // convert to gray + cv::cvtColor(frame, previous_frame, COLOR_BGR2GRAY); + + // upload pre-processed frame to GPU + cv::cuda::GpuMat gpu_previous; + gpu_previous.upload(previous_frame); + + // declare cpu outputs for optical flow + cv::Mat hsv[3], angle, bgr; + + // declare gpu outputs for optical flow + cv::cuda::GpuMat gpu_magnitude, gpu_normalized_magnitude, gpu_angle; + cv::cuda::GpuMat gpu_hsv[3], gpu_merged_hsv, gpu_hsv_8u, gpu_bgr; + + // set saturation to 1 + hsv[1] = cv::Mat::ones(frame.size(), CV_32F); + gpu_hsv[1].upload(hsv[1]); + + while (true) + { + // start full pipeline timer + auto start_full_time = high_resolution_clock::now(); + + // start reading timer + auto start_read_time = high_resolution_clock::now(); + + // capture frame-by-frame + capture >> frame; + + if (frame.empty()) + break; + + // upload frame to GPU + cv::cuda::GpuMat gpu_frame; + gpu_frame.upload(frame); + + // end reading timer + auto end_read_time = high_resolution_clock::now(); + + // add elapsed iteration time + timers["reading"].push_back(duration_cast(end_read_time - start_read_time).count() / 1000.0); + + // start pre-process timer + auto start_pre_time = high_resolution_clock::now(); + + // resize frame + cv::cuda::resize(gpu_frame, gpu_frame, Size(960, 540), 0, 0, INTER_LINEAR); + + // convert to gray + cv::cuda::GpuMat gpu_current; + cv::cuda::cvtColor(gpu_frame, gpu_current, COLOR_BGR2GRAY); + + // end pre-process timer + auto end_pre_time = high_resolution_clock::now(); + + // add elapsed iteration time + timers["pre-process"].push_back(duration_cast(end_pre_time - start_pre_time).count() / 1000.0); + + // start optical flow timer + auto start_of_time = high_resolution_clock::now(); + + // create optical flow instance + Ptr ptr_calc = cuda::FarnebackOpticalFlow::create(5, 0.5, false, 15, 3, 5, 1.2, 0); + // calculate optical flow + cv::cuda::GpuMat gpu_flow; + ptr_calc->calc(gpu_previous, gpu_current, gpu_flow); + + // end optical flow timer + auto end_of_time = high_resolution_clock::now(); + + // add elapsed iteration time + timers["optical flow"].push_back(duration_cast(end_of_time - start_of_time).count() / 1000.0); + + // start post-process timer + auto start_post_time = high_resolution_clock::now(); + + // split the output flow into 2 vectors + cv::cuda::GpuMat gpu_flow_xy[2]; + cv::cuda::split(gpu_flow, gpu_flow_xy); + + // convert from cartesian to polar coordinates + cv::cuda::cartToPolar(gpu_flow_xy[0], gpu_flow_xy[1], gpu_magnitude, gpu_angle, true); + + // normalize magnitude from 0 to 1 + cv::cuda::normalize(gpu_magnitude, gpu_normalized_magnitude, 0.0, 1.0, NORM_MINMAX, -1); + + // get angle of optical flow + gpu_angle.download(angle); + angle *= ((1 / 360.0) * (180 / 255.0)); + + // build hsv image + gpu_hsv[0].upload(angle); + gpu_hsv[2] = gpu_normalized_magnitude; + cv::cuda::merge(gpu_hsv, 3, gpu_merged_hsv); + + // multiply each pixel value to 255 + gpu_merged_hsv.cv::cuda::GpuMat::convertTo(gpu_hsv_8u, CV_8U, 255.0); + + // convert hsv to bgr + cv::cuda::cvtColor(gpu_hsv_8u, gpu_bgr, COLOR_HSV2BGR); + + // send original frame from GPU back to CPU + gpu_frame.download(frame); + + // send result from GPU back to CPU + gpu_bgr.download(bgr); + + // update previous_frame value + gpu_previous = gpu_current; + + // end post pipeline timer + auto end_post_time = high_resolution_clock::now(); + + // add elapsed iteration time + timers["post-process"].push_back(duration_cast(end_post_time - start_post_time).count() / 1000.0); + + // end full pipeline timer + auto end_full_time = high_resolution_clock::now(); + + // add elapsed iteration time + timers["full pipeline"].push_back(duration_cast(end_full_time - start_full_time).count() / 1000.0); + + // visualization + imshow("original", frame); + imshow("result", bgr); + int keyboard = waitKey(1); + if (keyboard == 27) + break; + } + + } + + // release the capture + capture.release(); + + // destroy all windows + destroyAllWindows(); + + // print results + cout << "Number of frames: " << num_frames << std::endl; + + // elapsed time at each stage + cout << "Elapsed time" << std::endl; + for (auto const& timer : timers) + { + cout << "- " << timer.first << " : " << accumulate(timer.second.begin(), timer.second.end(), 0.0) << " seconds"<< endl; + } + + // calculate frames per second + cout << "Default video FPS : " << fps << endl; + float optical_flow_fps = (num_frames - 1) / accumulate(timers["optical flow"].begin(), timers["optical flow"].end(), 0.0); + cout << "Optical flow FPS : " << optical_flow_fps << endl; + + float full_pipeline_fps = (num_frames - 1) / accumulate(timers["full pipeline"].begin(), timers["full pipeline"].end(), 0.0); + cout << "Full pipeline FPS : " << full_pipeline_fps << endl; +} + + +int main( int argc, const char** argv ) +{ + string videoFileName; + string device; + + // parse arguments from command line + if (argc == 3) + { + videoFileName = argv[1]; + device = argv[2]; + } + else if (argc == 2) + { + videoFileName = argv[1]; + device = "cpu"; + } + else + { + cout << "Please input video filename." << endl; + cout << "Usage example: ./demo.out video/boat.mp4" << endl; + cout << "If you want to use GPU device instead of CPU, add one more argument." << endl; + cout << "Usage example: ./demo.out video/boat.mp4 gpu" << endl; + return 1; + } + + // output passed arguments + cout << "Configuration" << endl; + cout << "- device : "<< device << endl; + cout << "- video file : " << videoFileName << endl; + + calculate_optical_flow(videoFileName, device); + + return 0; +} + diff --git a/Getting-Started-OpenCV-CUDA-Module/demo.py b/Getting-Started-OpenCV-CUDA-Module/demo.py new file mode 100644 index 000000000..62eeaa7bf --- /dev/null +++ b/Getting-Started-OpenCV-CUDA-Module/demo.py @@ -0,0 +1,333 @@ +import argparse +import time + +import cv2 +import numpy as np + + +def main(video, device): + + # init dict to track time for every stage at each iteration + timers = { + "full pipeline": [], + "reading": [], + "pre-process": [], + "optical flow": [], + "post-process": [], + } + + # init video capture with video + cap = cv2.VideoCapture(video) + + # get default video FPS + fps = cap.get(cv2.CAP_PROP_FPS) + + # get total number of video frames + num_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT) + + # read the first frame + ret, previous_frame = cap.read() + + if device == "cpu": + + # proceed if frame reading was successful + if ret: + # resize frame + frame = cv2.resize(previous_frame, (960, 540)) + + # convert to gray + previous_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + + # create hsv output for optical flow + hsv = np.zeros_like(frame, np.float32) + + # set saturation to 1 + hsv[..., 1] = 1.0 + + while True: + # start full pipeline timer + start_full_time = time.time() + + # start reading timer + start_read_time = time.time() + + # capture frame-by-frame + ret, frame = cap.read() + + # end reading timer + end_read_time = time.time() + + # add elapsed iteration time + timers["reading"].append(end_read_time - start_read_time) + + # if frame reading was not successful, break + if not ret: + break + + # start pre-process timer + start_pre_time = time.time() + # resize frame + frame = cv2.resize(frame, (960, 540)) + + # convert to gray + current_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + + # end pre-process timer + end_pre_time = time.time() + + # add elapsed iteration time + timers["pre-process"].append(end_pre_time - start_pre_time) + + # start optical flow timer + start_of = time.time() + + # calculate optical flow + flow = cv2.calcOpticalFlowFarneback( + previous_frame, current_frame, None, 0.5, 5, 15, 3, 5, 1.2, 0, + ) + # end of timer + end_of = time.time() + + # add elapsed iteration time + timers["optical flow"].append(end_of - start_of) + + # start post-process timer + start_post_time = time.time() + + # convert from cartesian to polar coordinates to get magnitude and angle + magnitude, angle = cv2.cartToPolar( + flow[..., 0], flow[..., 1], angleInDegrees=True, + ) + + # set hue according to the angle of optical flow + hsv[..., 0] = angle * ((1 / 360.0) * (180 / 255.0)) + + # set value according to the normalized magnitude of optical flow + hsv[..., 2] = cv2.normalize( + magnitude, None, 0.0, 1.0, cv2.NORM_MINMAX, -1, + ) + + # multiply each pixel value to 255 + hsv_8u = np.uint8(hsv * 255.0) + + # convert hsv to bgr + bgr = cv2.cvtColor(hsv_8u, cv2.COLOR_HSV2BGR) + + # update previous_frame value + previous_frame = current_frame + + # end post-process timer + end_post_time = time.time() + + # add elapsed iteration time + timers["post-process"].append(end_post_time - start_post_time) + + # end full pipeline timer + end_full_time = time.time() + + # add elapsed iteration time + timers["full pipeline"].append(end_full_time - start_full_time) + + # visualization + cv2.imshow("original", frame) + cv2.imshow("result", bgr) + k = cv2.waitKey(1) + if k == 27: + break + + else: + + # proceed if frame reading was successful + if ret: + # resize frame + frame = cv2.resize(previous_frame, (960, 540)) + + # upload resized frame to GPU + gpu_frame = cv2.cuda_GpuMat() + gpu_frame.upload(frame) + + # convert to gray + previous_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + + # upload pre-processed frame to GPU + gpu_previous = cv2.cuda_GpuMat() + gpu_previous.upload(previous_frame) + + # create gpu_hsv output for optical flow + gpu_hsv = cv2.cuda_GpuMat(gpu_frame.size(), cv2.CV_32FC3) + gpu_hsv_8u = cv2.cuda_GpuMat(gpu_frame.size(), cv2.CV_8UC3) + + gpu_h = cv2.cuda_GpuMat(gpu_frame.size(), cv2.CV_32FC1) + gpu_s = cv2.cuda_GpuMat(gpu_frame.size(), cv2.CV_32FC1) + gpu_v = cv2.cuda_GpuMat(gpu_frame.size(), cv2.CV_32FC1) + + # set saturation to 1 + gpu_s.upload(np.ones_like(previous_frame, np.float32)) + + while True: + # start full pipeline timer + start_full_time = time.time() + + # start reading timer + start_read_time = time.time() + + # capture frame-by-frame + ret, frame = cap.read() + + # upload frame to GPU + gpu_frame.upload(frame) + + # end reading timer + end_read_time = time.time() + + # add elapsed iteration time + timers["reading"].append(end_read_time - start_read_time) + + # if frame reading was not successful, break + if not ret: + break + + # start pre-process timer + start_pre_time = time.time() + + # resize frame + gpu_frame = cv2.cuda.resize(gpu_frame, (960, 540)) + + # convert to gray + gpu_current = cv2.cuda.cvtColor(gpu_frame, cv2.COLOR_BGR2GRAY) + + # end pre-process timer + end_pre_time = time.time() + + # add elapsed iteration time + timers["pre-process"].append(end_pre_time - start_pre_time) + + # start optical flow timer + start_of = time.time() + + # create optical flow instance + gpu_flow = cv2.cuda_FarnebackOpticalFlow.create( + 5, 0.5, False, 15, 3, 5, 1.2, 0, + ) + # calculate optical flow + gpu_flow = cv2.cuda_FarnebackOpticalFlow.calc( + gpu_flow, gpu_previous, gpu_current, None, + ) + + # end of timer + end_of = time.time() + + # add elapsed iteration time + timers["optical flow"].append(end_of - start_of) + + # start post-process timer + start_post_time = time.time() + + gpu_flow_x = cv2.cuda_GpuMat(gpu_flow.size(), cv2.CV_32FC1) + gpu_flow_y = cv2.cuda_GpuMat(gpu_flow.size(), cv2.CV_32FC1) + cv2.cuda.split(gpu_flow, [gpu_flow_x, gpu_flow_y]) + + # convert from cartesian to polar coordinates to get magnitude and angle + gpu_magnitude, gpu_angle = cv2.cuda.cartToPolar( + gpu_flow_x, gpu_flow_y, angleInDegrees=True, + ) + + # set value to normalized magnitude from 0 to 1 + gpu_v = cv2.cuda.normalize(gpu_magnitude, 0.0, 1.0, cv2.NORM_MINMAX, -1) + + # get angle of optical flow + angle = gpu_angle.download() + angle *= (1 / 360.0) * (180 / 255.0) + + # set hue according to the angle of optical flow + gpu_h.upload(angle) + + # merge h,s,v channels + cv2.cuda.merge([gpu_h, gpu_s, gpu_v], gpu_hsv) + + # multiply each pixel value to 255 + gpu_hsv.convertTo(cv2.CV_8U, 255.0, gpu_hsv_8u, 0.0) + + # convert hsv to bgr + gpu_bgr = cv2.cuda.cvtColor(gpu_hsv_8u, cv2.COLOR_HSV2BGR) + + # send original frame from GPU back to CPU + frame = gpu_frame.download() + + # send result from GPU back to CPU + bgr = gpu_bgr.download() + + # update previous_frame value + gpu_previous = gpu_current + + # end post-process timer + end_post_time = time.time() + + # add elapsed iteration time + timers["post-process"].append(end_post_time - start_post_time) + + # end full pipeline timer + end_full_time = time.time() + + # add elapsed iteration time + timers["full pipeline"].append(end_full_time - start_full_time) + + # visualization + cv2.imshow("original", frame) + cv2.imshow("result", bgr) + k = cv2.waitKey(1) + if k == 27: + break + + # release the capture + cap.release() + + # destroy all windows + cv2.destroyAllWindows() + + # print results + print("Number of frames : ", num_frames) + + # elapsed time at each stage + print("Elapsed time") + for stage, seconds in timers.items(): + print("-", stage, ": {:0.3f} seconds".format(sum(seconds))) + + # calculate frames per second + print("Default video FPS : {:0.3f}".format(fps)) + + of_fps = (num_frames - 1) / sum(timers["optical flow"]) + print("Optical flow FPS : {:0.3f}".format(of_fps)) + + full_fps = (num_frames - 1) / sum(timers["full pipeline"]) + print("Full pipeline FPS : {:0.3f}".format(full_fps)) + + +if __name__ == "__main__": + + # init argument parser + parser = argparse.ArgumentParser(description="OpenCV CPU/GPU Comparison") + + parser.add_argument( + "--video", help="path to .mp4 video file", required=True, type=str, + ) + + parser.add_argument( + "--device", + default="cpu", + choices=["cpu", "gpu"], + help="device to inference on", + ) + + # parsing script arguments + args = parser.parse_args() + video = args.video + device = args.device + + # output passed arguments + print("Configuration") + print("- device : ", device) + print("- video file : ", video) + + # run pipeline + main(video, device) diff --git a/Getting-Started-OpenCV-CUDA-Module/video/boat.mp4 b/Getting-Started-OpenCV-CUDA-Module/video/boat.mp4 new file mode 100644 index 000000000..00c87967d Binary files /dev/null and b/Getting-Started-OpenCV-CUDA-Module/video/boat.mp4 differ diff --git a/Homography/homography.cpp b/Homography/homography.cpp index 59f72a5f1..febee9ee5 100644 --- a/Homography/homography.cpp +++ b/Homography/homography.cpp @@ -14,14 +14,13 @@ void mouseHandler(int event, int x, int y, int flags, void* data_ptr) if ( event == EVENT_LBUTTONDOWN ) { userdata *data = ((userdata *) data_ptr); - circle(data->im, Point(x,y),3,Scalar(0,255,255), 5, CV_AA); + circle(data->im, Point(x,y),3,Scalar(0,255,255), 5, cv::LINE_AA); imshow("Image", data->im); if (data->points.size() < 4) { data->points.push_back(Point2f(x,y)); } } - } @@ -36,39 +35,32 @@ int main( int argc, char** argv) Size size(300,400); Mat im_dst = Mat::zeros(size,CV_8UC3); - // Create a vector of points. vector pts_dst; - - - + pts_dst.push_back(Point2f(0,0)); pts_dst.push_back(Point2f(size.width - 1, 0)); pts_dst.push_back(Point2f(size.width - 1, size.height -1)); pts_dst.push_back(Point2f(0, size.height - 1 )); - - - + //Create a window namedWindow("Image", 1); - + Mat im_temp = im_src.clone(); - + userdata data; data.im = im_temp; - - //set the callback function for any mouse event setMouseCallback("Image", mouseHandler, &data); - + //show the image imshow("Image", im_temp); waitKey(0); - + Mat tform = findHomography(data.points, pts_dst); warpPerspective(im_src, im_dst, tform, size); - + imshow("Image", im_dst); waitKey(0); diff --git a/Homography/homography2.cpp b/Homography/homography2.cpp index 62e10bec7..67cdf04af 100644 --- a/Homography/homography2.cpp +++ b/Homography/homography2.cpp @@ -14,71 +14,60 @@ void mouseHandler(int event, int x, int y, int flags, void* data_ptr) if ( event == EVENT_LBUTTONDOWN ) { userdata *data = ((userdata *) data_ptr); - circle(data->im, Point(x,y),3,Scalar(0,255,255), 5, CV_AA); + circle(data->im, Point(x,y),3,Scalar(0,255,255), 5, cv::LINE_AA); imshow("Image", data->im); if (data->points.size() < 4) { data->points.push_back(Point2f(x,y)); } } - } - int main( int argc, char** argv) { - // Read in the image. Mat im_src = imread(argv[1]); Size size = im_src.size(); - + // Create a vector of points. vector pts_src; pts_src.push_back(Point2f(0,0)); pts_src.push_back(Point2f(size.width - 1, 0)); pts_src.push_back(Point2f(size.width - 1, size.height -1)); pts_src.push_back(Point2f(0, size.height - 1 )); - - // Destination image Mat im_dst = imread(argv[2]); - - - //Create a window namedWindow("Image", 1); - + Mat im_temp = im_dst.clone(); - + userdata data; data.im = im_temp; - - //set the callback function for any mouse event setMouseCallback("Image", mouseHandler, &data); - + //show the image imshow("Image", im_temp); waitKey(0); - + Mat tform = findHomography(pts_src, data.points); warpPerspective(im_src, im_temp, tform, im_temp.size()); - + Point pts_dst[4]; for( int i = 0; i < 4; i++) { pts_dst[i] = data.points[i]; } - - - fillConvexPoly(im_dst, pts_dst, 4, Scalar(0), CV_AA); - + + fillConvexPoly(im_dst, pts_dst, 4, Scalar(0), cv::LINE_AA); + im_dst = im_dst + im_temp; - + imshow("Image", im_dst); waitKey(0); diff --git a/Homography/perspective-correction.cpp b/Homography/perspective-correction.cpp index 962582ee3..e1f451d80 100644 --- a/Homography/perspective-correction.cpp +++ b/Homography/perspective-correction.cpp @@ -14,18 +14,15 @@ void mouseHandler(int event, int x, int y, int flags, void* data_ptr) if ( event == EVENT_LBUTTONDOWN ) { userdata *data = ((userdata *) data_ptr); - circle(data->im, Point(x,y),3,Scalar(0,0,255), 5, CV_AA); + circle(data->im, Point(x,y),3,Scalar(0,0,255), 5, cv::LINE_AA); imshow("Image", data->im); if (data->points.size() < 4) { data->points.push_back(Point2f(x,y)); } } - } - - int main( int argc, char** argv) { @@ -36,15 +33,14 @@ int main( int argc, char** argv) Size size(300,400); Mat im_dst = Mat::zeros(size,CV_8UC3); - // Create a vector of destination points. vector pts_dst; - + pts_dst.push_back(Point2f(0,0)); pts_dst.push_back(Point2f(size.width - 1, 0)); pts_dst.push_back(Point2f(size.width - 1, size.height -1)); pts_dst.push_back(Point2f(0, size.height - 1 )); - + // Set data for mouse event Mat im_temp = im_src.clone(); userdata data; @@ -52,19 +48,19 @@ int main( int argc, char** argv) cout << "Click on the four corners of the book -- top left first and" << endl << "bottom left last -- and then hit ENTER" << endl; - - // Show image and wait for 4 clicks. + + // Show image and wait for 4 clicks. imshow("Image", im_temp); // Set the callback function for any mouse event setMouseCallback("Image", mouseHandler, &data); waitKey(0); - + // Calculate the homography Mat h = findHomography(data.points, pts_dst); - + // Warp source image to destination warpPerspective(im_src, im_dst, h, size); - + // Show image imshow("Image", im_dst); waitKey(0); diff --git a/Homography/virtual-billboard.cpp b/Homography/virtual-billboard.cpp index 7c8b3670c..ae4d730a7 100644 --- a/Homography/virtual-billboard.cpp +++ b/Homography/virtual-billboard.cpp @@ -14,71 +14,65 @@ void mouseHandler(int event, int x, int y, int flags, void* data_ptr) if ( event == EVENT_LBUTTONDOWN ) { userdata *data = ((userdata *) data_ptr); - circle(data->im, Point(x,y),3,Scalar(0,255,255), 5, CV_AA); + circle(data->im, Point(x,y),3,Scalar(0,255,255), 5, cv::LINE_AA); imshow("Image", data->im); if (data->points.size() < 4) { data->points.push_back(Point2f(x,y)); } } - } - int main( int argc, char** argv) { // Read in the image. Mat im_src = imread("first-image.jpg"); Size size = im_src.size(); - + // Create a vector of points. vector pts_src; pts_src.push_back(Point2f(0,0)); pts_src.push_back(Point2f(size.width - 1, 0)); pts_src.push_back(Point2f(size.width - 1, size.height -1)); pts_src.push_back(Point2f(0, size.height - 1 )); - - // Destination image Mat im_dst = imread("times-square.jpg"); - // Set data for mouse handler Mat im_temp = im_dst.clone(); userdata data; data.im = im_temp; - //show the image imshow("Image", im_temp); - + cout << "Click on four corners of a billboard and then press ENTER" << endl; //set the callback function for any mouse event setMouseCallback("Image", mouseHandler, &data); waitKey(0); - + // Calculate Homography between source and destination points Mat h = findHomography(pts_src, data.points); - + // Warp source image warpPerspective(im_src, im_temp, h, im_temp.size()); - + // Extract four points from mouse data Point pts_dst[4]; for( int i = 0; i < 4; i++) { pts_dst[i] = data.points[i]; } - + // Black out polygonal area in destination image. - fillConvexPoly(im_dst, pts_dst, 4, Scalar(0), CV_AA); - + fillConvexPoly(im_dst, pts_dst, 4, Scalar(0), cv::LINE_AA); + // Add warped source image to destination image. im_dst = im_dst + im_temp; - + // Display image. imshow("Image", im_dst); waitKey(0); diff --git a/Hough-Transform/hough_lines.cpp b/Hough-Transform/hough_lines.cpp index a0807352b..9a8db6771 100644 --- a/Hough-Transform/hough_lines.cpp +++ b/Hough-Transform/hough_lines.cpp @@ -19,7 +19,6 @@ vector lines; void onTrackbarChange( int , void* ) { - cimg = img.clone(); dst = img.clone(); th1 = initThresh; diff --git a/ImageAlignment-FeatureBased/align.cpp b/ImageAlignment-FeatureBased/align.cpp index a1a82a36e..0b799af54 100644 --- a/ImageAlignment-FeatureBased/align.cpp +++ b/ImageAlignment-FeatureBased/align.cpp @@ -11,57 +11,52 @@ const float GOOD_MATCH_PERCENT = 0.15f; void alignImages(Mat &im1, Mat &im2, Mat &im1Reg, Mat &h) - { - // Convert images to grayscale Mat im1Gray, im2Gray; - cvtColor(im1, im1Gray, CV_BGR2GRAY); - cvtColor(im2, im2Gray, CV_BGR2GRAY); - + cvtColor(im1, im1Gray, cv::COLOR_BGR2GRAY); + cvtColor(im2, im2Gray, cv::COLOR_BGR2GRAY); + // Variables to store keypoints and descriptors std::vector keypoints1, keypoints2; Mat descriptors1, descriptors2; - + // Detect ORB features and compute descriptors. Ptr orb = ORB::create(MAX_FEATURES); orb->detectAndCompute(im1Gray, Mat(), keypoints1, descriptors1); orb->detectAndCompute(im2Gray, Mat(), keypoints2, descriptors2); - + // Match features. std::vector matches; Ptr matcher = DescriptorMatcher::create("BruteForce-Hamming"); matcher->match(descriptors1, descriptors2, matches, Mat()); - + // Sort matches by score std::sort(matches.begin(), matches.end()); - + // Remove not so good matches const int numGoodMatches = matches.size() * GOOD_MATCH_PERCENT; matches.erase(matches.begin()+numGoodMatches, matches.end()); - - + // Draw top matches Mat imMatches; drawMatches(im1, keypoints1, im2, keypoints2, matches, imMatches); imwrite("matches.jpg", imMatches); - - + // Extract location of good matches std::vector points1, points2; - + for( size_t i = 0; i < matches.size(); i++ ) { points1.push_back( keypoints1[ matches[i].queryIdx ].pt ); points2.push_back( keypoints2[ matches[i].trainIdx ].pt ); } - + // Find homography h = findHomography( points1, points2, RANSAC ); - + // Use homography to warp image warpPerspective(im1, im1Reg, h, im2.size()); - } @@ -72,17 +67,15 @@ int main(int argc, char **argv) cout << "Reading reference image : " << refFilename << endl; Mat imReference = imread(refFilename); - // Read image to be aligned string imFilename("scanned-form.jpg"); cout << "Reading image to align : " << imFilename << endl; Mat im = imread(imFilename); - // Registered image will be resotred in imReg. // The estimated homography will be stored in h. Mat imReg, h; - + // Align images cout << "Aligning images ..." << endl; alignImages(im, imReference, imReg, h); @@ -94,5 +87,4 @@ int main(int argc, char **argv) // Print estimated homography cout << "Estimated homography : \n" << h << endl; - } diff --git a/ImageAlignment/image_alignment_simple_example.cpp b/ImageAlignment/image_alignment_simple_example.cpp index c7bf706f9..27d9730ad 100644 --- a/ImageAlignment/image_alignment_simple_example.cpp +++ b/ImageAlignment/image_alignment_simple_example.cpp @@ -18,8 +18,8 @@ int main(void) // Convert images to gray scale; Mat im1_gray, im2_gray; - cvtColor(im1, im1_gray, CV_BGR2GRAY); - cvtColor(im2, im2_gray, CV_BGR2GRAY); + cvtColor(im1, im1_gray, cv::COLOR_BGR2GRAY); + cvtColor(im2, im2_gray, cv::COLOR_BGR2GRAY); // Define the motion model const int warp_mode = MOTION_EUCLIDEAN; diff --git a/MRNet-Single-Model/.gitignore b/MRNet-Single-Model/.gitignore new file mode 100644 index 000000000..c434eb21f --- /dev/null +++ b/MRNet-Single-Model/.gitignore @@ -0,0 +1,14 @@ +*.npy +*.DS_Store + +*.pth +*.csv + +*.pyc + +.vscode + +runs/ +train/ +val/ +*__pycache__* \ No newline at end of file diff --git a/MRNet-Single-Model/LICENSE b/MRNet-Single-Model/LICENSE new file mode 100644 index 000000000..dcb49ceb5 --- /dev/null +++ b/MRNet-Single-Model/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Big Vision LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MRNet-Single-Model/README.md b/MRNet-Single-Model/README.md new file mode 100644 index 000000000..66d2d0ceb --- /dev/null +++ b/MRNet-Single-Model/README.md @@ -0,0 +1,141 @@ +
+ + +# Classifying Knee MRI images using Deep Learning + +**This repo contains code for the post [Stanford MRNet Challenge: Classifying Knee MRIs](https://www.learnopencv.com/stanford-mrnet-challenge-classifying-knee-mris/)** + + +For details about the dataset and the competition, refer to https://stanfordmlgroup.github.io/competitions/mrnet/ + +
+ + + +# Installation and Getting Started +1. Clone the repository. + +2. Set up the python(3.7) environment. I prefer conda. Given below is how to create a conda environment by the name `mrnet` +```Shell +$ conda create -n mrnet python=3.7 +$ conda activate mrnet +``` +Make sure you are always inside the `mrnet` environment while working with this project + +3. Install dependencies. (You might want to select your virtual environment first) +```Shell +$ pip install -r requirements.txt +``` + +4. Download the dataset (~5.7 GB), and put `train` and `valid` folders along with all the the `.csv` files inside `images` folder at root directory. +```Shell + images/ + train/ + axial/ + sagittal/ + coronal/ + val/ + axial/ + sagittal/ + coronal/ + train-abnormal.csv + train-acl.csv + train-meniscus.csv + valid-abnormal.csv + valid-acl.csv + valid-meniscus.csv +``` + +5. Make a new folder called `weights` at root directory, and inside the `weights` folder create three more folders namely `acl`, `abnormal` and `meniscus`. +```Shell +$ mkdir weights +$ cd weights +$ mkdir abnormal meniscus acl +$ cd .. +``` + +6. All the hyperparameters are defined in `config.py` file. Feel free to play around those. Especially change the `task` to train on different diseases + +7. Now finally run the training using `python train.py`. All the logs for tensorboard will be stored in the `runs` directory at the root of the project. + +* **Tensorboard** Use tensorboard to view the evaluation results. Run the following command. + +```Shell +$ tensorboard --logdir runs/ +``` + +or if you are using a remote connection + +```Shell +$ tensorboard --logdir runs/ --host= +``` + +# Understanding the Dataset + +
+ + + +
+ +The dataset contains MRIs of different people. Each MRI consists of multiple images. +Each MRI has data in 3 perpendicular planes. And each plane as variable number of slices. + +Each slice is an `256x256` image + +For example: + +For `MRI 1` we will have 3 planes: + +Plane 1- with 35 slices + +Plane 2- with 34 slices + +Place 3 with 35 slices + +Each MRI has to be classisifed against 3 diseases + +Major challenge with while selecting the model structure was the inconsistency in the data. Although the image size remains constant , the number of slices per plane are variable within a single MRI and varies across all MRIs. + +So we are proposing a model for each plane. For each model the `batch size` will be variable and equal to `number of slices in the plane of the MRI`. So training each model, we will get features for each plane. + +We also plan to have 3 separate models for each disease. + +# Model Specifications + +
+ + + +
+ +We will be using Alexnet pretrained as a feature extractor. When we would have trained the 3 models on the 3 planes, we will use its feature extractor layer as an input to a `global` model for the final classification + +# Contributors +

+ -- Neelabh Madan + +
+ +-- Jatin Prakash + +*** +This contains the code for **Stanford MRNet Challenge**. For more information - visit [**Stanford MRNet Challenge**](https://www.learnopencv.com/stanford-mrnet-challenge/) + + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+ + diff --git a/MRNet-Single-Model/config.py b/MRNet-Single-Model/config.py new file mode 100644 index 000000000..d73d95fcf --- /dev/null +++ b/MRNet-Single-Model/config.py @@ -0,0 +1,13 @@ +config = { + 'max_epoch' : 50, + 'log_train' : 100, + 'lr' : 1e-5, + 'starting_epoch' : 0, + 'batch_size' : 1, + 'log_val' : 10, + 'task' : 'abnormal', # "meniscus" and "acl" are the other options + 'weight_decay' : 0.01, + 'patience' : 5, + 'save_model' : 1, + 'exp_name' : 'test' +} \ No newline at end of file diff --git a/MRNet-Single-Model/content/logo.jpg b/MRNet-Single-Model/content/logo.jpg new file mode 100644 index 000000000..9ce47a47b Binary files /dev/null and b/MRNet-Single-Model/content/logo.jpg differ diff --git a/MRNet-Single-Model/content/model.png b/MRNet-Single-Model/content/model.png new file mode 100644 index 000000000..41b834d69 Binary files /dev/null and b/MRNet-Single-Model/content/model.png differ diff --git a/MRNet-Single-Model/content/mri_scan.png b/MRNet-Single-Model/content/mri_scan.png new file mode 100644 index 000000000..5556953e1 Binary files /dev/null and b/MRNet-Single-Model/content/mri_scan.png differ diff --git a/MRNet-Single-Model/dataset/__init__.py b/MRNet-Single-Model/dataset/__init__.py new file mode 100644 index 000000000..5d9ad0625 --- /dev/null +++ b/MRNet-Single-Model/dataset/__init__.py @@ -0,0 +1 @@ +from .dataset import MRData, load_data \ No newline at end of file diff --git a/MRNet-Single-Model/dataset/dataset.py b/MRNet-Single-Model/dataset/dataset.py new file mode 100644 index 000000000..fe05b3a23 --- /dev/null +++ b/MRNet-Single-Model/dataset/dataset.py @@ -0,0 +1,173 @@ +import os +import pandas as pd +import numpy as np + +import torch +import torch.utils.data as data + +from torchsample.transforms import RandomRotate, RandomTranslate, RandomFlip, ToTensor, Compose, RandomAffine +from torchvision import transforms + +INPUT_DIM = 224 +MAX_PIXEL_VAL = 255 +MEAN = 58.09 +STDDEV = 49.73 + +class MRData(): + """This class used to load MRnet dataset from `./images` dir + """ + + def __init__(self,task = 'acl', train = True, transform = None, weights = None): + """Initialize the dataset + Args: + plane : along which plane to load the data + task : for which task to load the labels + train : whether to load the train or val data + transform : which transforms to apply + weights (Tensor) : Give wieghted loss to postive class eg. `weights=torch.tensor([2.223])` + """ + # Define the three planes to use + self.planes=['axial', 'coronal', 'sagittal'] + # Initialize the records as None + self.records = None + # an empty dictionary + self.image_path={} + + # If we are in training loop + if train: + # Read data about patient records + self.records = pd.read_csv('./images/train-{}.csv'.format(task),header=None, names=['id', 'label']) + + for plane in self.planes: + # For each plane, specify the image path + self.image_path[plane] = './images/train/{}/'.format(plane) + else: + # If we are in testing loop + # don't use any transformation + transform = None + # Read testing/validation data (patients records) + self.records = pd.read_csv('./images/valid-{}.csv'.format(task),header=None, names=['id', 'label']) + + for plane in self.planes: + # Read path of images for each plane + self.image_path[plane] = './images/valid/{}/'.format(plane) + + # Initialize the transformation to apply on images + self.transform = transform + + # Append 0s to the patient record id + self.records['id'] = self.records['id'].map( + lambda i: '0' * (4 - len(str(i))) + str(i)) + # empty dictionary + self.paths={} + for plane in self.planes: + # Get paths of numpy data files for each plane + self.paths[plane] = [self.image_path[plane] + filename + + '.npy' for filename in self.records['id'].tolist()] + + # Convert labels from Pandas Series to a list + self.labels = self.records['label'].tolist() + + # Total positive cases + pos = sum(self.labels) + # Total negative cases + neg = len(self.labels) - pos + + # Find the wieghts of pos and neg classes + if weights: + self.weights = torch.FloatTensor(weights) + else: + self.weights = torch.FloatTensor([neg / pos]) + + print('Number of -ve samples : ', neg) + print('Number of +ve samples : ', pos) + print('Weights for loss is : ', self.weights) + + def __len__(self): + """Return the total number of images in the dataset.""" + return len(self.records) + + def __getitem__(self, index): + """ + Returns `(images,labels)` pair + where image is a list [imgsPlane1,imgsPlane2,imgsPlane3] + and labels is a list [gt,gt,gt] + """ + img_raw = {} + + for plane in self.planes: + # Load raw image data for each plane + img_raw[plane] = np.load(self.paths[plane][index]) + # Resize the image loaded in the previous step + img_raw[plane] = self._resize_image(img_raw[plane]) + + label = self.labels[index] + # Convert label to 0 and 1 + if label == 1: + label = torch.FloatTensor([1]) + elif label == 0: + label = torch.FloatTensor([0]) + + # Return a list of three images for three planes and the label of the record + return [img_raw[plane] for plane in self.planes], label + + def _resize_image(self, image): + """Resize the image to `(3,224,224)` and apply + transforms if possible. + """ + # Resize the image + # Calculate extra padding present in the image + # which needs to be removed + pad = int((image.shape[2] - INPUT_DIM)/2) + # This is equivalent to center cropping the image + image = image[:,pad:-pad,pad:-pad] + # Normalize the image by subtracting it by mean and dividing by standard + # deviation + image = (image-np.min(image))/(np.max(image)-np.min(image))*MAX_PIXEL_VAL + image = (image - MEAN) / STDDEV + + # If the transformation is not None + if self.transform: + # Transform the image based on the specified transformation + image = self.transform(image) + else: + # Else, just stack the image with itself in order to match the required + # dimensions + image = np.stack((image,)*3, axis=1) + # Convert the image to a FloatTensor and return it + image = torch.FloatTensor(image) + return image + +def load_data(task : str): + + # Define the Augmentation here only + augments = Compose([ + # Convert the image to Tensor + transforms.Lambda(lambda x: torch.Tensor(x)), + # Randomly rotate the image with an angle + # between -25 degrees to 25 degrees + RandomRotate(25), + # Randomly translate the image by 11% of + # image height and width + RandomTranslate([0.11, 0.11]), + # Randomly flip the image + RandomFlip(), + # Change the order of image channels + transforms.Lambda(lambda x: x.repeat(3, 1, 1, 1).permute(1, 0, 2, 3)), + ]) + + print('Loading Train Dataset of {} task...'.format(task)) + # Load training dataset + train_data = MRData(task, train=True, transform=augments) + train_loader = data.DataLoader( + train_data, batch_size=1, num_workers=11, shuffle=True + ) + + print('Loading Validation Dataset of {} task...'.format(task)) + # Load validation dataset + val_data = MRData(task, train=False) + val_loader = data.DataLoader( + val_data, batch_size=1, num_workers=11, shuffle=False + ) + + return train_loader, val_loader, train_data.weights, val_data.weights diff --git a/MRNet-Single-Model/images/readme.md b/MRNet-Single-Model/images/readme.md new file mode 100644 index 000000000..4aee530db --- /dev/null +++ b/MRNet-Single-Model/images/readme.md @@ -0,0 +1,20 @@ +# Download and put data here + +Download the dataset (~5.7 GB), and put `train` and `valid` folders along with all the the `.csv` files inside `images` folder at root directory. +```Shell + images/ + train/ + axial/ + sagittal/ + coronal/ + val/ + axial/ + sagittal/ + coronal/ + train-abnormal.csv + train-acl.csv + train-meniscus.csv + valid-abnormal.csv + valid-acl.csv + valid-meniscus.csv +``` \ No newline at end of file diff --git a/MRNet-Single-Model/models/MRnet.py b/MRNet-Single-Model/models/MRnet.py new file mode 100644 index 000000000..86db314e1 --- /dev/null +++ b/MRNet-Single-Model/models/MRnet.py @@ -0,0 +1,81 @@ +import torch +import torch.nn as nn +from torchvision import models +import os + +class MRnet(nn.Module): + """MRnet uses pretrained resnet50 as a backbone to extract features + """ + + def __init__(self): + """This function will be used to initialize the + MRnet instance.""" + # Initialize nn.Module instance + super(MRnet,self).__init__() + + # Initialize three backbones for three axis + # All the three axes will use pretrained AlexNet model + # The models will be used for extracting features from + # the input images + self.axial = models.alexnet(pretrained=True).features + self.coronal = models.alexnet(pretrained=True).features + self.saggital = models.alexnet(pretrained=True).features + + # Initialize 2D Adaptive Average Pooling layers + # The pooling layers will reduce the size of + # feature maps extracted from the previous axes + self.pool_axial = nn.AdaptiveAvgPool2d(1) + self.pool_coronal = nn.AdaptiveAvgPool2d(1) + self.pool_saggital = nn.AdaptiveAvgPool2d(1) + + # Initialize a sequential neural network with + # a single fully connected linear layer + # The network will output the probability of + # having a particular disease + self.fc = nn.Sequential( + nn.Linear(in_features=3*256,out_features=1) + ) + + def forward(self,x): + """ Input is given in the form of `[image1, image2, image3]` where + `image1 = [1, slices, 3, 224, 224]`. Note that `1` is due to the + dataloader assigning it a single batch. + """ + + # squeeze the first dimension as there + # is only one patient in each batch + images = [torch.squeeze(img, dim=0) for img in x] + + # Extract features across each of the three plane + # using the three pre-trained AlexNet models defined earlier + image1 = self.axial(images[0]) + image2 = self.coronal(images[1]) + image3 = self.saggital(images[2]) + + # Convert the image dimesnsions from [slices, 256, 1, 1] to + # [slices,256] + image1 = self.pool_axial(image1).view(image1.size(0), -1) + image2 = self.pool_coronal(image2).view(image2.size(0), -1) + image3 = self.pool_saggital(image3).view(image3.size(0), -1) + + # Find maximum value in each slice + # This will reduce the dimensions of image to [1,256] + # This is done in order to keep only the most prevalent + # features for each slice + image1 = torch.max(image1,dim=0,keepdim=True)[0] + image2 = torch.max(image2,dim=0,keepdim=True)[0] + image3 = torch.max(image3,dim=0,keepdim=True)[0] + + # Stack the 3 images together to create the output + # of size [1, 256*3] + output = torch.cat([image1,image2,image3], dim=1) + + # Feed the output to the sequential network created earlier + # The network will return a probability of having a specific + # disease + output = self.fc(output) + return output + + def _load_wieghts(self): + """load pretrained weights""" + pass diff --git a/MRNet-Single-Model/models/__init__.py b/MRNet-Single-Model/models/__init__.py new file mode 100644 index 000000000..7e95766c3 --- /dev/null +++ b/MRNet-Single-Model/models/__init__.py @@ -0,0 +1 @@ +from .MRnet import MRnet \ No newline at end of file diff --git a/MRNet-Single-Model/requirements.txt b/MRNet-Single-Model/requirements.txt new file mode 100644 index 000000000..39cb69b34 --- /dev/null +++ b/MRNet-Single-Model/requirements.txt @@ -0,0 +1,41 @@ +absl-py==0.10.0 +cachetools==4.1.1 +certifi==2020.6.20 +chardet==3.0.4 +google-auth==1.21.3 +google-auth-oauthlib==0.4.1 +grpcio==1.32.0 +idna==2.10 +importlib-metadata==2.0.0 +joblib==0.16.0 +Markdown==3.2.2 +nibabel==3.1.1 +numpy==1.19.2 +oauthlib==3.1.0 +olefile==0.46 +packaging==20.4 +pandas==1.1.2 +Pillow +protobuf==3.13.0 +pyasn1==0.4.8 +pyasn1-modules==0.2.8 +pyparsing==2.4.7 +python-dateutil==2.8.1 +pytz==2020.1 +requests==2.24.0 +requests-oauthlib==1.3.0 +rsa==4.6 +scikit-learn==0.23.2 +scipy==1.5.2 +six==1.15.0 +sklearn==0.0 +tensorboard==2.3.0 +tensorboard-plugin-wit==1.7.0 +threadpoolctl==2.1.0 +torch==1.6.0 +torchsample @ git+https://github.com/ncullen93/torchsample@ea4d1b3975f68be0521941e733887ed667a1b46e +torchvision==0.7.0 +tqdm==4.49.0 +urllib3==1.25.10 +Werkzeug==1.0.1 +zipp==3.2.0 \ No newline at end of file diff --git a/MRNet-Single-Model/train.py b/MRNet-Single-Model/train.py new file mode 100644 index 000000000..b35a9e288 --- /dev/null +++ b/MRNet-Single-Model/train.py @@ -0,0 +1,110 @@ +from dataset import load_data +from models import MRnet +from config import config +import torch +from torch.utils.tensorboard import SummaryWriter +from utils import _train_model, _evaluate_model, _get_lr +import time +import torch.utils.data as data +import os + +"""Performs training of a specified model. + +Input params: + config_file: Takes in configurations to train with +""" + +def train(config : dict): + """ + Function where actual training takes place + + Args: + config (dict) : Configuration to train with + """ + + print('Starting to Train Model...') + + train_loader, val_loader, train_wts, val_wts = load_data(config['task']) + + print('Initializing Model...') + model = MRnet() + if torch.cuda.is_available(): + model = model.cuda() + train_wts = train_wts.cuda() + val_wts = val_wts.cuda() + + print('Initializing Loss Method...') + criterion = torch.nn.BCEWithLogitsLoss(pos_weight=train_wts) + val_criterion = torch.nn.BCEWithLogitsLoss(pos_weight=val_wts) + + if torch.cuda.is_available(): + criterion = criterion.cuda() + val_criterion = val_criterion.cuda() + + print('Setup the Optimizer') + optimizer = torch.optim.Adam(model.parameters(), lr=config['lr'], weight_decay=config['weight_decay']) + scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( + optimizer, patience=3, factor=.3, threshold=1e-4, verbose=True) + + starting_epoch = config['starting_epoch'] + num_epochs = config['max_epoch'] + patience = config['patience'] + log_train = config['log_train'] + log_val = config['log_val'] + + best_val_loss = float('inf') + best_val_auc = float(0) + + print('Starting Training') + + writer = SummaryWriter(comment='lr={} task={}'.format(config['lr'], config['task'])) + t_start_training = time.time() + + for epoch in range(starting_epoch, num_epochs): + + current_lr = _get_lr(optimizer) + epoch_start_time = time.time() # timer for entire epoch + + train_loss, train_auc = _train_model( + model, train_loader, epoch, num_epochs, optimizer, criterion, writer, current_lr, log_train) + + val_loss, val_auc = _evaluate_model( + model, val_loader, val_criterion, epoch, num_epochs, writer, current_lr, log_val) + + writer.add_scalar('Train/Avg Loss', train_loss, epoch) + writer.add_scalar('Val/Avg Loss', val_loss, epoch) + + scheduler.step(val_loss) + + t_end = time.time() + delta = t_end - epoch_start_time + + print("train loss : {0} | train auc {1} | val loss {2} | val auc {3} | elapsed time {4} s".format( + train_loss, train_auc, val_loss, val_auc, delta)) + + print('-' * 30) + + writer.flush() + + if val_auc > best_val_auc: + best_val_auc = val_auc + + if bool(config['save_model']): + file_name = 'model_{}_{}_val_auc_{:0.4f}_train_auc_{:0.4f}_epoch_{}.pth'.format(config['exp_name'], config['task'], val_auc, train_auc, epoch+1) + torch.save({ + 'model_state_dict': model.state_dict() + }, './weights/{}/{}'.format(config['task'],file_name)) + + t_end_training = time.time() + print(f'training took {t_end_training - t_start_training} s') + writer.flush() + writer.close() + +if __name__ == '__main__': + + print('Training Configuration') + print(config) + + train(config=config) + + print('Training Ended...') diff --git a/MRNet-Single-Model/utils/__init__.py b/MRNet-Single-Model/utils/__init__.py new file mode 100644 index 000000000..111b181ce --- /dev/null +++ b/MRNet-Single-Model/utils/__init__.py @@ -0,0 +1 @@ +from .utils import _train_model, _evaluate_model, _get_lr \ No newline at end of file diff --git a/MRNet-Single-Model/utils/utils.py b/MRNet-Single-Model/utils/utils.py new file mode 100644 index 000000000..7ba545f3d --- /dev/null +++ b/MRNet-Single-Model/utils/utils.py @@ -0,0 +1,163 @@ +import torch +from sklearn import metrics +import numpy as np + +def _get_trainable_params(model): + """Get Parameters with `requires.grad` set to `True`""" + trainable_params = [] + for x in model.parameters(): + if x.requires_grad: + trainable_params.append(x) + return trainable_params + +def _evaluate_model(model, val_loader, criterion, epoch, num_epochs, writer, current_lr, log_every=20): + """Runs model over val dataset and returns auc and avg val loss""" + + # Set to eval mode + model.eval() + # List of probabilities obtained from the model + y_probs = [] + # List of groundtruth labels + y_gt = [] + # List of losses obtained + losses = [] + + # Iterate over the validation dataset + for i, (images, label) in enumerate(val_loader): + # If GPU is available, load the images and label + # on GPU + if torch.cuda.is_available(): + images = [image.cuda() for image in images] + label = label.cuda() + + # Obtain the model output by passing the images as input + output = model(images) + # Evaluate the loss by comparing the output and groundtruth label + loss = criterion(output, label) + # Add loss to the list of losses + loss_value = loss.item() + losses.append(loss_value) + # Find probability for each class by applying + # sigmoid function on model output + probas = torch.sigmoid(output) + # Add the groundtruth to the list of groundtruths + y_gt.append(int(label.item())) + # Add predicted probability to the list + y_probs.append(probas.item()) + + try: + # Evaluate area under ROC curve based on the groundtruth label + # and predicted probability + auc = metrics.roc_auc_score(y_gt, y_probs) + except: + # Default area under ROC curve + auc = 0.5 + # Add information to the writer about validation loss and Area under ROC curve + writer.add_scalar('Val/Loss', loss_value, epoch * len(val_loader) + i) + writer.add_scalar('Val/AUC', auc, epoch * len(val_loader) + i) + + if (i % log_every == 0) & (i > 0): + # Display the information about average validation loss and area under ROC curve + print('''[Epoch: {0} / {1} | Batch : {2} / {3} ]| Avg Val Loss {4} | Val AUC : {5} | lr : {6}'''. + format( + epoch + 1, + num_epochs, + i, + len(val_loader), + np.round(np.mean(losses), 4), + np.round(auc, 4), + current_lr + ) + ) + # Add information to the writer about total epochs and Area under ROC curve + writer.add_scalar('Val/AUC_epoch', auc, epoch + i) + # Find mean area under ROC curve and validation loss + val_loss_epoch = np.round(np.mean(losses), 4) + val_auc_epoch = np.round(auc, 4) + + return val_loss_epoch, val_auc_epoch + +def _train_model(model, train_loader, epoch, num_epochs, optimizer, criterion, writer, current_lr, log_every=100): + + # Set to train mode + model.train() + + # Initialize the predicted probabilities + y_probs = [] + # Initialize the groundtruth labels + y_gt = [] + # Initialize the loss between the groundtruth label + # and the predicted probability + losses = [] + + # Iterate over the training dataset + for i, (images, label) in enumerate(train_loader): + # Reset the gradient by zeroing it + optimizer.zero_grad() + + # If GPU is available, transfer the images and label + # to the GPU + if torch.cuda.is_available(): + images = [image.cuda() for image in images] + label = label.cuda() + + # Obtain the prediction using the model + output = model(images) + + # Evaluate the loss by comparing the prediction + # and groundtruth label + loss = criterion(output, label) + # Perform a backward propagation + loss.backward() + # Modify the weights based on the error gradient + optimizer.step() + + # Add current loss to the list of losses + loss_value = loss.item() + losses.append(loss_value) + + # Find probabilities from output using sigmoid function + probas = torch.sigmoid(output) + + # Add current groundtruth label to the list of groundtruths + y_gt.append(int(label.item())) + # Add current probabilities to the list of probabilities + y_probs.append(probas.item()) + + try: + # Try finding the area under ROC curve + auc = metrics.roc_auc_score(y_gt, y_probs) + except: + # Use default value of area under ROC curve as 0.5 + auc = 0.5 + + # Add information to the writer about training loss and Area under ROC curve + writer.add_scalar('Train/Loss', loss_value, + epoch * len(train_loader) + i) + writer.add_scalar('Train/AUC', auc, epoch * len(train_loader) + i) + + if (i % log_every == 0) & (i > 0): + # Display the information about average training loss and area under ROC curve + print('''[Epoch: {0} / {1} | Batch : {2} / {3} ]| Avg Train Loss {4} | Train AUC : {5} | lr : {6}'''. + format( + epoch + 1, + num_epochs, + i, + len(train_loader), + np.round(np.mean(losses), 4), + np.round(auc, 4), + current_lr + ) + ) + # Add information to the writer about total epochs and Area under ROC curve + writer.add_scalar('Train/AUC_epoch', auc, epoch + i) + + # Find mean area under ROC curve and training loss + train_loss_epoch = np.round(np.mean(losses), 4) + train_auc_epoch = np.round(auc, 4) + + return train_loss_epoch, train_auc_epoch + +def _get_lr(optimizer): + for param_group in optimizer.param_groups: + return param_group['lr'] diff --git a/OCR/CMakeLists.txt b/OCR/CMakeLists.txt new file mode 100644 index 000000000..2243541cc --- /dev/null +++ b/OCR/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.5.1) + +project(ocr_simple) + +find_package(Threads REQUIRED) +find_package(OpenCV REQUIRED) + +find_package( PkgConfig REQUIRED) +pkg_search_module(TESSERACT REQUIRED tesseract) + +add_executable(ocr_simple ocr_simple.cpp) +target_include_directories(ocr_simple PRIVATE ${OpenCV_INCLUDE_DIRS} ${TESSERACT_INCLUDE_DIRS}) +target_link_directories(ocr_simple PRIVATE ${TESSERACT_LIBRARY_DIRS}) +target_link_libraries(ocr_simple PRIVATE ${OpenCV_LIBS} ${TESSERACT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) diff --git a/ObjectDetection-YOLO/object_detection_yolo.cpp b/ObjectDetection-YOLO/object_detection_yolo.cpp index b9cc9ebac..7ea00301f 100644 --- a/ObjectDetection-YOLO/object_detection_yolo.cpp +++ b/ObjectDetection-YOLO/object_detection_yolo.cpp @@ -120,7 +120,7 @@ int main(int argc, char** argv) break; } // Create a 4D blob from a frame. - blobFromImage(frame, blob, 1/255.0, cvSize(inpWidth, inpHeight), Scalar(0,0,0), true, false); + blobFromImage(frame, blob, 1/255.0, cv::Size(inpWidth, inpHeight), Scalar(0,0,0), true, false); //Sets the input to the network net.setInput(blob); diff --git a/OpenPose-Multi-Person/getModels.sh b/OpenPose-Multi-Person/getModels.sh index 44ce5b73f..78d31a06d 100755 --- a/OpenPose-Multi-Person/getModels.sh +++ b/OpenPose-Multi-Person/getModels.sh @@ -1,16 +1,6 @@ -# ------------------------- BODY, FACE AND HAND MODELS ------------------------- -# Downloading body pose (COCO and MPI), face and hand models -OPENPOSE_URL="http://posefs1.perception.cs.cmu.edu/OpenPose/models/" -POSE_FOLDER="pose/" -FACE_FOLDER="face/" -HAND_FOLDER="hand/" +# ------------------------- BODY KEYPOINT-DETECTION MODELS ------------------------- +# Downloading body pose (COCO) +OPENPOSE_URL="https://www.dropbox.com/s/2h2bv29a130sgrk/pose_iter_440000.caffemodel" -# ------------------------- POSE MODELS ------------------------- -# Body (COCO) -COCO_FOLDER=${POSE_FOLDER}"coco/" -COCO_MODEL=${COCO_FOLDER}"pose_iter_440000.caffemodel" -wget -c ${OPENPOSE_URL}${COCO_MODEL} -P ${COCO_FOLDER} -# Alternative: it will not check whether file was fully downloaded -# if [ ! -f $COCO_MODEL ]; then -# wget ${OPENPOSE_URL}$COCO_MODEL -P $COCO_FOLDER -# fi +OPENPOSE_FOLDER="pose/coco/" +wget -c ${OPENPOSE_URL} -P ${OPENPOSE_FOLDER} diff --git a/OpenPose-Multi-Person/multi-person-openpose.cpp b/OpenPose-Multi-Person/multi-person-openpose.cpp index aa712a8a8..0dfc8ea7e 100644 --- a/OpenPose-Multi-Person/multi-person-openpose.cpp +++ b/OpenPose-Multi-Person/multi-person-openpose.cpp @@ -315,16 +315,35 @@ void getPersonwiseKeypoints(const std::vector>& validPair int main(int argc,char** argv) { std::string inputFile = "./group.jpg"; - - if(argc > 1){ - inputFile = std::string(argv[1]); - } + std::string device = "cpu"; + std::cout << "USAGE : ./multi-person-openpose " << std::endl; + if (argc == 2){ + if((std::string)argv[1] == "gpu") + device = "gpu"; + else + inputFile = argv[1]; + } + else if (argc == 3){ + inputFile = argv[1]; + if((std::string)argv[2] == "gpu") + device = "gpu"; + } cv::Mat input = cv::imread(inputFile, cv::IMREAD_COLOR); std::chrono::time_point startTP = std::chrono::system_clock::now(); cv::dnn::Net inputNet = cv::dnn::readNetFromCaffe("./pose/coco/pose_deploy_linevec.prototxt","./pose/coco/pose_iter_440000.caffemodel"); + + if (device == "cpu"){ + std::cout << "Using CPU device" << std::endl; + inputNet.setPreferableBackend(cv::dnn::DNN_TARGET_CPU); + } + else if (device == "gpu"){ + std::cout << "Using GPU device" << std::endl; + inputNet.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA); + inputNet.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA); + } cv::Mat inputBlob = cv::dnn::blobFromImage(input,1.0/255.0,cv::Size((int)((368*input.cols)/input.rows),368),cv::Scalar(0,0,0),false,false); diff --git a/OpenPose-Multi-Person/multi-person-openpose.ipynb b/OpenPose-Multi-Person/multi-person-openpose.ipynb index c63fb28b7..4a965935c 100644 --- a/OpenPose-Multi-Person/multi-person-openpose.ipynb +++ b/OpenPose-Multi-Person/multi-person-openpose.ipynb @@ -16,6 +16,15 @@ "from random import randint" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "device = \"gpu\" # please change it to \"gpu\" if the model needs to be run on cuda." + ] + }, { "cell_type": "code", "execution_count": null, @@ -62,7 +71,7 @@ " keypoints = []\n", " \n", " #find the blobs\n", - " _, contours, _ = cv2.findContours(mapMask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)\n", + " contours, _ = cv2.findContours(mapMask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)\n", " \n", " #for each blob find the maxima\n", " for cnt in contours:\n", @@ -246,6 +255,14 @@ "t = time.time()\n", "net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)\n", "\n", + "if device == \"cpu\":\n", + " net.setPreferableBackend(cv2.dnn.DNN_TARGET_CPU)\n", + " print(\"Using CPU device\")\n", + "elif device == \"gpu\":\n", + " net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)\n", + " net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)\n", + " print(\"Using GPU device\")\n", + "\n", "# Fix the input Height and get the width according to the Aspect Ratio\n", "inHeight = 368\n", "inWidth = int((inHeight/frameHeight)*frameWidth)\n", @@ -383,7 +400,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/OpenPose-Multi-Person/multi-person-openpose.py b/OpenPose-Multi-Person/multi-person-openpose.py index 0ab87a430..2ab535d20 100644 --- a/OpenPose-Multi-Person/multi-person-openpose.py +++ b/OpenPose-Multi-Person/multi-person-openpose.py @@ -2,8 +2,17 @@ import time import numpy as np from random import randint +import argparse -image1 = cv2.imread("group.jpg") +parser = argparse.ArgumentParser(description='Run keypoint detection') +parser.add_argument("--device", default="cpu", help="Device to inference on") +parser.add_argument("--image_file", default="group.jpg", help="Input image") + +args = parser.parse_args() + + + +image1 = cv2.imread(args.image_file) protoFile = "pose/coco/pose_deploy_linevec.prototxt" weightsFile = "pose/coco/pose_iter_440000.caffemodel" @@ -36,7 +45,7 @@ def getKeypoints(probMap, threshold=0.1): keypoints = [] #find the blobs - _, contours, _ = cv2.findContours(mapMask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) + contours, _ = cv2.findContours(mapMask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #for each blob find the maxima for cnt in contours: @@ -164,6 +173,13 @@ def getPersonwiseKeypoints(valid_pairs, invalid_pairs): t = time.time() net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile) +if args.device == "cpu": + net.setPreferableBackend(cv2.dnn.DNN_TARGET_CPU) + print("Using CPU device") +elif args.device == "gpu": + net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) + net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) + print("Using GPU device") # Fix the input Height and get the width according to the Aspect Ratio inHeight = 368 diff --git a/OpenPose/OpenPoseImage.cpp b/OpenPose/OpenPoseImage.cpp index 101f6dad9..9d25ac38d 100644 --- a/OpenPose/OpenPoseImage.cpp +++ b/OpenPose/OpenPoseImage.cpp @@ -44,14 +44,28 @@ int nPoints = 18; int main(int argc, char **argv) { - cout << "USAGE : ./openpose " << endl; + cout << "USAGE : ./OpenPose " << endl; + cout << "USAGE : ./OpenPose " << endl; + string device = "cpu"; + string imageFile = "single.jpeg"; // Take arguments from commmand line if (argc == 2) { + if((string)argv[1] == "gpu") + device = "gpu"; + else imageFile = argv[1]; } + else if (argc == 3) + { + imageFile = argv[1]; + if((string)argv[2] == "gpu") + device = "gpu"; + } + + int inWidth = 368; int inHeight = 368; @@ -65,6 +79,18 @@ int main(int argc, char **argv) double t = (double) cv::getTickCount(); Net net = readNetFromCaffe(protoFile, weightsFile); + if (device == "cpu") + { + cout << "Using CPU device" << endl; + net.setPreferableBackend(DNN_TARGET_CPU); + } + else if (device == "gpu") + { + cout << "Using GPU device" << endl; + net.setPreferableBackend(DNN_BACKEND_CUDA); + net.setPreferableTarget(DNN_TARGET_CUDA); + } + Mat inpBlob = blobFromImage(frame, 1.0 / 255, Size(inWidth, inHeight), Scalar(0, 0, 0), false, false); net.setInput(inpBlob); diff --git a/OpenPose/OpenPoseImage.py b/OpenPose/OpenPoseImage.py index ca3ba32a4..b4642a4a5 100644 --- a/OpenPose/OpenPoseImage.py +++ b/OpenPose/OpenPoseImage.py @@ -1,6 +1,14 @@ import cv2 import time import numpy as np +import argparse + +parser = argparse.ArgumentParser(description='Run keypoint detection') +parser.add_argument("--device", default="cpu", help="Device to inference on") +parser.add_argument("--image_file", default="single.jpeg", help="Input image") + +args = parser.parse_args() + MODE = "COCO" @@ -17,7 +25,7 @@ POSE_PAIRS = [[0,1], [1,2], [2,3], [3,4], [1,5], [5,6], [6,7], [1,14], [14,8], [8,9], [9,10], [14,11], [11,12], [12,13] ] -frame = cv2.imread("single.jpeg") +frame = cv2.imread(args.image_file) frameCopy = np.copy(frame) frameWidth = frame.shape[1] frameHeight = frame.shape[0] @@ -25,6 +33,14 @@ net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile) +if args.device == "cpu": + net.setPreferableBackend(cv2.dnn.DNN_TARGET_CPU) + print("Using CPU device") +elif args.device == "gpu": + net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) + net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) + print("Using GPU device") + t = time.time() # input image dimensions for the network inWidth = 368 diff --git a/OpenPose/OpenPoseVideo.cpp b/OpenPose/OpenPoseVideo.cpp index a741903d2..7414f0dbe 100644 --- a/OpenPose/OpenPoseVideo.cpp +++ b/OpenPose/OpenPoseVideo.cpp @@ -44,14 +44,26 @@ int nPoints = 18; int main(int argc, char **argv) { - cout << "USAGE : ./openpose " << endl; + cout << "USAGE : ./OpenPose " << endl; + cout << "USAGE : ./OpenPose " << endl; + string device = "cpu"; string videoFile = "sample_video.mp4"; + // Take arguments from commmand line if (argc == 2) { + if((string)argv[1] == "gpu") + device = "gpu"; + else videoFile = argv[1]; } + else if (argc == 3) + { + videoFile = argv[1]; + if((string)argv[2] == "gpu") + device = "gpu"; + } int inWidth = 368; int inHeight = 368; @@ -72,6 +84,19 @@ int main(int argc, char **argv) VideoWriter video("Output-Skeleton.avi",VideoWriter::fourcc('M','J','P','G'), 10, Size(frameWidth,frameHeight)); Net net = readNetFromCaffe(protoFile, weightsFile); + + if (device == "cpu") + { + cout << "Using CPU device" << endl; + net.setPreferableBackend(DNN_TARGET_CPU); + } + else if (device == "gpu") + { + cout << "Using GPU device" << endl; + net.setPreferableBackend(DNN_BACKEND_CUDA); + net.setPreferableTarget(DNN_TARGET_CUDA); + } + double t=0; while( waitKey(1) < 0) { diff --git a/OpenPose/OpenPoseVideo.py b/OpenPose/OpenPoseVideo.py index 846c051bb..76f61af8c 100644 --- a/OpenPose/OpenPoseVideo.py +++ b/OpenPose/OpenPoseVideo.py @@ -1,6 +1,13 @@ import cv2 import time import numpy as np +import argparse + +parser = argparse.ArgumentParser(description='Run keypoint detection') +parser.add_argument("--device", default="cpu", help="Device to inference on") +parser.add_argument("--video_file", default="sample_video.mp4", help="Input Video") + +args = parser.parse_args() MODE = "MPI" @@ -22,13 +29,20 @@ threshold = 0.1 -input_source = "sample_video.mp4" +input_source = args.video_file cap = cv2.VideoCapture(input_source) hasFrame, frame = cap.read() vid_writer = cv2.VideoWriter('output.avi',cv2.VideoWriter_fourcc('M','J','P','G'), 10, (frame.shape[1],frame.shape[0])) net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile) +if args.device == "cpu": + net.setPreferableBackend(cv2.dnn.DNN_TARGET_CPU) + print("Using CPU device") +elif args.device == "gpu": + net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) + net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) + print("Using GPU device") while cv2.waitKey(1) < 0: t = time.time() diff --git a/OpenPose/getModels.sh b/OpenPose/getModels.sh index 5a6c94c40..ce71c9e3a 100755 --- a/OpenPose/getModels.sh +++ b/OpenPose/getModels.sh @@ -1,31 +1,13 @@ -# ------------------------- BODY, FACE AND HAND MODELS ------------------------- -# Downloading body pose (COCO and MPI), face and hand models -OPENPOSE_URL="http://posefs1.perception.cs.cmu.edu/OpenPose/models/" -POSE_FOLDER="pose/" -FACE_FOLDER="face/" -HAND_FOLDER="hand/" - # ------------------------- POSE MODELS ------------------------- -# Body (COCO) -COCO_FOLDER=${POSE_FOLDER}"coco/" -COCO_MODEL=${COCO_FOLDER}"pose_iter_440000.caffemodel" -wget -c ${OPENPOSE_URL}${COCO_MODEL} -P ${COCO_FOLDER} -# Alternative: it will not check whether file was fully downloaded -# if [ ! -f $COCO_MODEL ]; then -# wget ${OPENPOSE_URL}$COCO_MODEL -P $COCO_FOLDER -# fi -# Body (MPI) -MPI_FOLDER=${POSE_FOLDER}"mpi/" -MPI_MODEL=${MPI_FOLDER}"pose_iter_160000.caffemodel" -wget -c ${OPENPOSE_URL}${MPI_MODEL} -P ${MPI_FOLDER} -# "------------------------- FACE MODELS -------------------------" -# Face -FACE_MODEL=${FACE_FOLDER}"pose_iter_116000.caffemodel" -wget -c ${OPENPOSE_URL}${FACE_MODEL} -P ${FACE_FOLDER} +# Downloading the pose-model trained on COCO +COCO_POSE_URL="https://www.dropbox.com/s/2h2bv29a130sgrk/pose_iter_440000.caffemodel" +COCO_FOLDER="pose/coco/" +wget -c ${COCO_POSE_URL} -P ${COCO_FOLDER} + +# Downloading the pose-model trained on MPI +MPI_POSE_URL="https://www.dropbox.com/s/drumc6dzllfed16/pose_iter_160000.caffemodel" +MPI_FOLDER="pose/mpi/" +wget -c ${MPI_POSE_URL} -P ${MPI_FOLDER} -# "------------------------- HAND MODELS -------------------------" -# Hand -HAND_MODEL=$HAND_FOLDER"pose_iter_102000.caffemodel" -wget -c ${OPENPOSE_URL}${HAND_MODEL} -P ${HAND_FOLDER} diff --git a/OpenVINO-OpenCV/image-classification.cpp b/OpenVINO-OpenCV/image-classification.cpp index a8a216ee0..9470771e4 100644 --- a/OpenVINO-OpenCV/image-classification.cpp +++ b/OpenVINO-OpenCV/image-classification.cpp @@ -1,10 +1,14 @@ #include #include +#include +#include +#include + #include #include #include -#include - +#include + using namespace std; using namespace cv; using namespace cv::dnn; @@ -15,10 +19,12 @@ int main() { string labels_file = "/home/ubuntu/caffe/data/ilsvrc12/synset_words.txt"; string prototxt = "/home/ubuntu/caffe/models/bvlc_reference_caffenet/deploy.prototxt"; string model = "/home/ubuntu/caffe/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel"; + vector classes; // load the labels file std::ifstream ifs(labels_file.c_str()); if (!ifs.is_open()) + { CV_Error(Error::StsError, "File " + labels_file + " not found"); string line; while (std::getline(ifs, line)) @@ -26,17 +32,18 @@ int main() { classes.push_back(line); } } - blobFromImage(image, blob, 1, Size(224, 224), Scalar(104,117,123)); + + Mat blob = dnn::blobFromImage(image, 1, Size(224, 224), Scalar(104,117,123)); cout << "[INFO] loading model..." << endl; - Net net = readNetFromCaffe(prototxt, model); + dnn::Net net = readNetFromCaffe(prototxt, model); net.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE); net.setPreferableTarget(DNN_TARGET_CPU); - + // set the blob as input to the network and perform a forward-pass to // obtain our output classification - net.setInput(blob) - preds = net.forward() - + net.setInput(blob); + Mat preds = net.forward(); + double freq = getTickFrequency() / 1000; std::vector layersTimes; double t = net.getPerfProfile(layersTimes) / freq; diff --git a/Playing-rock-paper-scissors-with-AI/README.md b/Playing-rock-paper-scissors-with-AI/README.md new file mode 100644 index 000000000..51e9f20b2 --- /dev/null +++ b/Playing-rock-paper-scissors-with-AI/README.md @@ -0,0 +1,21 @@ +# Playing Rock, Paper, Scissors with AI + +This repository contains the notebook for "Playing Rock, Paper, Scissors with AI" Tutorial + +You can access the Tutorial for this [here](https://www.learnopencv.com/playing-rock-paper-scissors-with-ai/). + +[Playing Rock, Paper, Scissors with AI](Rock_paper_scissor.ipynb) + +You can download the rps3.h5 model from [this link](https://drive.google.com/file/d/1ZAEhMXlAxDkVbVo-1DE2aO_YphDscJLD/view?usp=sharing), although I would strongly suggest to train your own model on your own hands. + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
+ + diff --git a/Playing-rock-paper-scissors-with-AI/Rock_paper_scissor.ipynb b/Playing-rock-paper-scissors-with-AI/Rock_paper_scissor.ipynb new file mode 100644 index 000000000..a18a187b4 --- /dev/null +++ b/Playing-rock-paper-scissors-with-AI/Rock_paper_scissor.ipynb @@ -0,0 +1,985 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#
Playing Rock, Paper, Scissors with AI
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Import Libraries " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import cv2\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time\n", + "\n", + "import tensorflow as tf\n", + "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", + "from tensorflow.keras.models import Model, load_model\n", + "from tensorflow.keras.layers import Dense,MaxPool2D,Dropout,Flatten,Conv2D,GlobalAveragePooling2D,Activation\n", + "from tensorflow.keras.optimizers import Adam\n", + "from tensorflow.keras.utils import to_categorical\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import LabelEncoder\n", + "\n", + "from random import choice,shuffle\n", + "from scipy import stats as st\n", + "\n", + "from collections import deque" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Gather Data, for rock, paper scissor classes." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def gather_data(num_samples):\n", + " \n", + " global rock, paper, scissor, nothing\n", + " \n", + " # Initialize the camera\n", + " cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)\n", + "\n", + " # trigger tells us when to start recording\n", + " trigger = False\n", + " \n", + " # Counter keeps count of the number of samples collected\n", + " counter = 0\n", + " \n", + " # This the ROI size, the size of images saved will be box_size -10\n", + " box_size = 234\n", + " \n", + " # Getting the width of the frame from the camera properties\n", + " width = int(cap.get(3))\n", + "\n", + "\n", + " while True:\n", + " \n", + " # Read frame by frame\n", + " ret, frame = cap.read()\n", + " \n", + " # Flip the frame laterally\n", + " frame = cv2.flip(frame, 1)\n", + " \n", + " # Break the loop if there is trouble reading the frame.\n", + " if not ret:\n", + " break\n", + " \n", + " # If counter is equal to the number samples then reset triger and the counter\n", + " if counter == num_samples:\n", + " trigger = not trigger\n", + " counter = 0\n", + " \n", + " # Define ROI for capturing samples\n", + " cv2.rectangle(frame, (width - box_size, 0), (width, box_size), (0, 250, 150), 2)\n", + " \n", + " # Make a resizable window.\n", + " cv2.namedWindow(\"Collecting images\", cv2.WINDOW_NORMAL)\n", + " \n", + " \n", + " # If trigger is True than start capturing the samples\n", + " if trigger:\n", + " \n", + " # Grab only slected roi\n", + " roi = frame[5: box_size-5 , width-box_size + 5: width -5]\n", + " \n", + " # Append the roi and class name to the list with the selected class_name\n", + " eval(class_name).append([roi, class_name])\n", + " \n", + " # Increment the counter \n", + " counter += 1 \n", + " \n", + " # Text for the counter\n", + " text = \"Collected Samples of {}: {}\".format(class_name, counter)\n", + " \n", + " else:\n", + " text = \"Press 'r' to collect rock samples, 'p' for paper, 's' for scissor and 'n' for nothing\"\n", + " \n", + " # Show the counter on the imaege\n", + " cv2.putText(frame, text, (3, 350), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 1, cv2.LINE_AA)\n", + " \n", + " # Display the window\n", + " cv2.imshow(\"Collecting images\", frame)\n", + " \n", + " # Wait 1 ms\n", + " k = cv2.waitKey(1)\n", + " \n", + " # If user press 'r' than set the path for rock directoryq\n", + " if k == ord('r'):\n", + " \n", + " # Trigger the variable inorder to capture the samples\n", + " trigger = not trigger\n", + " class_name = 'rock'\n", + " rock = []\n", + " \n", + " \n", + " # If user press 'p' then class_name is set to paper and trigger set to True \n", + " if k == ord('p'):\n", + " trigger = not trigger\n", + " class_name = 'paper'\n", + " paper = []\n", + " \n", + " # If user press 's' then class_name is set to scissor and trigger set to True \n", + " if k == ord('s'):\n", + " trigger = not trigger\n", + " class_name = 'scissor'\n", + " scissor = []\n", + " \n", + " # If user press 's' then class_name is set to nothing and trigger set to True\n", + " if k == ord('n'):\n", + " trigger = not trigger\n", + " class_name = 'nothing'\n", + " nothing = []\n", + " \n", + " # Exit if user presses 'q'\n", + " if k == ord('q'):\n", + " break\n", + " \n", + " # Release the camera and destroy the window\n", + " cap.release()\n", + " cv2.destroyAllWindows()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now run the function" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "no_of_samples = 100\n", + "gather_data(no_of_samples)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: (Optional) Visualize the Data:\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABpgAAAQTCAYAAABwTypqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOy9X481SW7m9yMZeU51z+jC39I3wgIrw1jsQt/CgKVdwN4Lw/bHM3Y1/VadjCB9QTLyvC1pZN1oykBSGHV31ak8mZER/PPwISkRwS233HLLLbfccsstt9xyyy233HLLLbfccsstt9xyyy23/H8V/UvfwC233HLLLbfccsstt9xyyy233HLLLbfccsstt9xyyy3//5I7wXTLLbfccsstt9xyyy233HLLLbfccsstt9xyyy233HLLv0ruBNMtt9xyyy233HLLLbfccsstt9xyyy233HLLLbfccsst/yq5E0y33HLLLbfccsstt9xyyy233HLLLbfccsstt9xyyy23/KvkTjDdcsstt9xyyy233HLLLbfccsstt9xyyy233HLLLbfc8q+SO8F0yy233HLLLbfccsstt9xyyy233HLLLbfccsstt9xyy79Kxp/75f/0d/8hPF4gM38QAxFBVbH1yJ/Ji4iov/D8mIBL/WQsYi7MbP/eZ7BUcXfChV9UERGi/mjqgsjcl8pCV+RnR96urYEy93euI6/V+bIlCuK4O7qCQw5EZP9+SjD53M+pns8i9RgRAfLK34XvnyN5/4bsZ14E4VLX789NFN+fESyvq/l3+fO8l2N+7OsSisRZ18q/FxFOzXv6ZKFar6yeKXwCjojwMR2JVbea1xcxpud9qCrTVl7XX/1KEYy1FsHi4cd+132fp+S/u09EI99/zLxOLIT8m6cOXpHXd8l7OsM5PN+vLiHc9vUBhjlezzp1Qb1XqWcawd4XPxz00OsdAVZL5+4szXfv7kzL9ZHpLHvxX//j//n2gv6y8jd//9fxMR0jb2mR79kt+KojuffM215ReexrRAShr9wDrPrcrPfkSChWa6Ce59YFvr5+ICLYCExyr5hTnwvWzD3qanyQf++a7+THglBHNe/He9+25OVQVdzzb8wMXfmcp59E6wWd+4w7fcB06w2N6776/KkP5pC97/b3Sz63xUHUFzzm2HsMmSB5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cQXq0YbSxmU9k/CS59V4JkTJa6jXY77uW+B7lBOO1qVjd9Y5ruL1eOqIi3scGxnPiDjgeNfy+oRTRxbFfF43jBa3HWNGGeSo+m+j/RkQM5DcM5SSs2/zOLBRfABEB5D5/fr8puOzW8ZnZz536zsUS15Lm8a8mdHaFRIdYUYrxN1WLEvDtr/gw/VrfPuL7/Cb//y3eC/vAI8dCkuLZ8R+jR3DFQW3/FlWaxg7Nc67+EdtjEmJczVjR9VHAjViC6oG8SXaqTpmWzFxg7U9C/c+5zPqFbbusfMy13pLKTnaRPAeK35ABTZD6REo3+s+C7KKL/Pcmzs1DfDSZ6LAM4C+jlnuEtUbkUxs8/pW/JKfbztaoZ3iJDoKHHJ3CxCtLl/vnHWoF4xnFPfogINu6KVGQRnstAXmbaiZcBhxgLHpwrTNa03sE8j2/IjCoeiYEmuN4tGlwRGznuMZJeZfujuaAHUUxObOQZMNo3OXis3WrJ4F2W55p8oCCpVrxl9zErH3OZPN/AaVo1AXiMTZ3CELxPMHMHeVOeosdIdjFu2N+Pl47opjK5/jRNBPO0WtxNd0q7MQzTIeKoi8QEGBiaMXQ31e8P67d/j03z5BXfE00gO9YMtky2KAa3S8iu48HbvkseSAiEU75KhOiIK6XtBKR1HF6or2RTv4LiXu+56jJkayzkbxXsT/VKKTw5xxXUe81eEwtB4JXn3Oa6fHs9kVF9zwAvSWif3xro+Yss7nYMXxHDk2Z+yyHW3TPeIXIedt+jXnegNPLmiZF4DXWQT892YYnYj7W7qTERERERERERERERER0Vv3tsr6iIiIiIiIiIiIiIiI6M1jgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKihzDBRERERERERERERERERA9hgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKihzDBRERERERERERERERERA9hgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKihzDBRERERERERERERERERA9hgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKihzDBRERERERERERERERERA9hgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKihzDBRERERERERERERERERA9hgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKihzDBRERERERERERERERERA9hgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKihzDBRERERERERERERERERA9hgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKihzDBRERERERERERERERERA9hgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKihzDBRERERERERERERERERA9hgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKihzDBRERERERERERERERERA9hgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKihzDBRERERERERERERERERA9hgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKihzDBRERERERERERERERERA9hgomIiIiIiIiIiIiIiIgewgQTERERERERERERERERPYQJJiIiIiIiIiIiIiIiInoIE0xERERERERERERERET0ECaYiIiIiIiIiIiIiIiI6CFMMBEREREREREREREREdFDmGAiIiIiIiIiIiIiIiKih9Tf9od/8mf/2uEVS+ahigPuDnfBVuLvGBTV438UW/zXd+wKqCoMfX49xx7/vgMqFarxdU3i77h3iAhM4vsMmr80A0opUMjpVRrEHO4OEcl/p9hhMDOYGGr+dfHx4zYsll9b9dXbYGZw74A0uDv2UmAGiAhGPu4ZK6zk9+wtX7vDzPLvAbcavy5uQPwVlONHQpf4WiJl/n4xg+drdc/3zVcI7PgeyJ9Tj/egWPx5dZ3vQ7f48w07OuJ9LQZIwXyfzAwdgi6Wr0+B3iAi0JKfgXWYF7g7VCtclnhf0KCqEPH52lYXuMfX7sjfLwpra76XQMnPerWW33ND9fGpVMBrfN+Sr1kqpMfX3GSBy6dXn1Upgi6K3nt8X7U8Bj5BVaEOaHvCv/3T/3A+aH6n/s3/+W9crUI8Pwvd4nPLz1lEAFcY4hhrWGBmqHUHED+fugGl5mfZ53kJj99buqKfzj0A0AKox3nR9ThWW/7Xu0Hd4nN1oFl8Bqoa50WtKJbnSDcUFJRyHL97X4GaX1+Oc6pUR+8dxQC0OO4vYscxjjhuTQzIYzGuH/G9avf5vhTEsbgrUFscF346sVoeN+4FTeJ9Kd7mzwqP7+/oUNzieoMr3Mp8k9w9/l/yXGgC85av9Dl+zxzQW37deC/NLK8f+XryGtLFoGUc7xVmhg0FkDKvgVvPcxhXAMBTWyB5PUXZ0fNYGOc3oGjo83o3rmdLr/ljdrQ8N3fFPG+7rPn3juOi68s8Liav6Kfyg3EPWPLzN29wKfizP/13b+a8+pM/+9e+dkPNa+s4lsw25OUQXTDvLz7vC4C65mdh2Evel3wBEO9dm9dYQPoW15bxmejxvrkKfHz9Hp9fKWVen6ALVOo8HkUE0jfsFh+IOuaflXEOuQJi6L2ju6FovC5t+V/f4XiJ16yCmvfHVsa50uPaAEA8zlsA8/rgUiF5fBdTqNs8xuK6tEDzDTR19HG/loZe8nj342ApHsd9xQ7BU3yv/P7mF6wt7v293OB7XPtM4zpTrKLn59Ic6LlOUM/rvTeY5j3XBIpx78p/gx3F477e4FDc5/sSx79CcJnnzThXJX/mawPU6ryueP7c99JP597xPff87Ft+fuI6j7+lV7S8ud2w53sW19n47AuKxbFS8jNbmmNTxf/1p//+TZxXf/Jv/w8XqwA0fnbNYx77vH7HvSmuW9XimGymcHmBiGC18uq6Pu7Tx9pQ/3/23m5HliXH0vtIM/fIfaoa0LMOBnPVAvQO0kgCdCtADzh1zs4IN5K6IGkeebq75qbQlRfbC4XalZkR/mfGn8XFxW17ThFEhLXWfjdT/oKW3TJeFbcEo/an+pMfbd8r2DKFn/X9PoRLOp4q/6MDaV8gsK7ai5H3GVyI5zuTgHNMzAyRPOcVaUdEhGOdeKQv6L1rcm2/dahgtaiv2vsiwdKr7vHNfoQg8Zc8b8fTLLbf98DqvGfFWu+xstT95zlyn3sIXrbEmNsWne0/5IVr+TpeXKJffIGPAyXPNa9j2xITrfOkfXF3zghsnuW32048MPL9uTgf7fdrzziy7fNreMbM9Zt8JoZVDOIOR/2293nvbXfnJcd+VscqX6cO8uL//Nf/91vsKfgVA8KvGPBXDPiPP/71v//XWGTMkvl3/nwRWD1/5yQqLhj1rNA/dl5sqjvP3ocb+hbj4PmOGos4Q1j6+17DqvolX0d82yhiovx1+xl3p5ZA/tsvTnkA8Cx74GIsud7Onzd2Fg4gdt+rieK+NpYC8HiLdRaBj9rvtZ5sOLVUUNftG4nyuwpIARnyYsdANjnsfMNeQOKJjJ8VF37g3L5HRNCwve9jKGK1Z4aW3TpZo/AUXxw6vrxjW0EUpiGuhGSMfY3cayt873tZiojVu5z7ntue6Pt9hRaGM3a8ERjuaZuf5HsdDCyOem+618mN3cSOJyWM4foFc2H82PsqeHJd+V7Pde4YQgP++//2/3yLffVf/vf/GsiLMW3fw77vstVY5j0ismN+bGQcJcJZ61xEeEm92zFRZN/zqhjDLNfkMfI5mhl+/A7+GwDDO6cKTN+xt/gSgyVuWDhb5Xdf3gO51iHjrhG33VZVwg98WJ1z8tJ8T7Piws9x7yniZIZ8sRkhv3P4Hes3jmi93iB9CJnn9F4NgXPpzlcATn/c3xuBSeZ7O8fV2Pv/JbHzkfZLxwpEba/fHbvXQvzUICTPqQhn3LhevV6+wsV/jtFi+5/h+dTzWVfcKA+Cc++jl3yNIdWEgz/qBifoZ319vQ+frPK/Uc9EVfNvSWzYIz/jAqK95+s9V1z8f/zr98EB/9v//V8i8d28tqPub3HHOiJvWOqb33+P+d0fX/AEZIGsvca9+0jE996lMIz+TNqsiutkIr0v1AFnjLFjmddKG9kxZrjs6wIYrL3GR+Q+zHOlfbU5Wf6W81XOKJUPLYKofSdub7h5+RGBq3CHEKBi1MPe6xRSew1eey3c8XQ/rxnCMK0c3Bn+o3x4PReeBPde6v3Yz/F8w7o/ZWFy1X2VL4uTR/19YIjnufucoHvfPzXtmer9M1lrn18YHH7ndjvus3sP9nGxMDP0OBmWvoxxoYWlX5VDiOS9jjEIH3jFQ41hRPxt5+lXvUNgX980QyT4v/7X/+/f3Vd/t8AU40nEi2Ef9WInARksF0ilCmodvJfxHgYEHiTgv4E8JchCRQJ9wlyGH76dlUewJBiWL8hUwboCo70Bk88AACAASURBVIQKar5Bwg70MyHL12ASOE5oIGJABwCvfW+vckxT4TDfSRo4yJULSYTQgUfej0j+3af/5KOSkacC/YJnO7MEuQQhxBmjg823RdBJTlzQgN/8ZMTIBfr2umIbCIj6j/DuRAvk0rX/1irp1sjVoKIwnFWBpUFuDDGOetarrhURXJwAQrUiJwGdeCV30g5K2MGaS4G1qkitwFiCi+V7R7ANABV4cueTTJRLco2EPnOjhXFJICoQUsFzFg5RMDcYss99B7l/yUJmONc369PTSAMEEAGrgtGdwIoiorVewOUzl0jcjmcYO8juwMCIHcwCWRCMwOWqvZQpNSOB9E5Yt4OToxZUEAp65lp8usOo60KRIYQ9yXUnGxBmrjJQyuBFHOxgWTRwCw6JdFZ2gxuuVRzEtmF3daTuZVV+MRAkcm9MHNcGWtZ2YOKKqrAIpIqYhrP32KiAwxwf5dgcvEB74qMc1xNRwSNQCSiHi67cH8NzwZGB3cULC8v32vZOBh5lq+r8LjOfpQtxDpZZ2bIGzZ+ICNeQHcgKBRRIgeoqjBCEQUSCNNaBtL4DjFKBn8IIPByznxk8H8cOKNpphShUYLsGeIHnqjBWFex91jUdOyH9LodLAikjrlpDHZAGF2OvxSGLIG7wBQcmKhVw1Lse5WRfsraRWuEoaY+MO6nu3wswzStgyTVlZkQBdAsDmdBBJEBkEJdAo+Mb6KrnH87lF2gWgPr6qCDD5PYRD8qG70sSVihWydFwkPr+0eAi606OpxKe9jo86gIvbOibj+xDIQpiKQBF8H19Z9wJfccLlYXm87GPHWTOYpG85uftwwLCLd3rGHm6l23Qcbz5yKP8wqGTJ86K3JdrF/MKcNFXFexgSWwixiy/9SnOY+d/yjXHBmProVMmBNfIkDViv39VGF3LGBfTBDPjGF3gOtN31euNWoteifbn9J2UfofDMNBAeJDLpeyQCqtIPChoxUa9OgRDI2My07VjtQYEQiDeQClm3rN1En6CXAmIvsQ5Chw0r+fnAdPynZtyid0+QIRLgpBVJKfFqpdyWBWNR2x/Syiued7ZiTWOHQXiXWfZW3rbcskC0YyHxyv9W3wFlq9I8Hi8FZFm+eJXgX8Zsr4VmHwgFad65P9OdU7ztFlVQO53IfIlVMRFwStFrWcu6C6WqaS/7GMMZdmddLnAyJLP9inDQerfqwhX+Q4DVeG08oOSMW8mHULUlTlH+apcO14/74Qyn3stAwOp2H6V/V15B7gHw40hBRbZAneOeXDJAWFfHsaQBBwOfezE8Lscv2LAXzHgrxjwH3+Yvhhe+XGA6R1nSRW5M4YpYHIWgNwEHKmCeVZ+2WDeNLz/xgNtwkIBMqargDDhpYKNLtY1GcVz+SjgSqhj7sTSLApL+gjPujJXAzwFAl4hePk24UKLrOtexV91vOKtOSeziZqrCjlTWOWfnCxYvReFwG9i1GADjB030QVt6lLfQMuOjboMFC6EnbkfhQwZRJg7HhC89rXEyPg3PIHQxMw4TIhQwiZa398xKrIa0WFp8JJAxbFQVAce9+9Dn0heAL59u7wVuwZeRbrphiC8RkAVRsSFIzIOGeLgSSry2eSQkfcAzPJxEYmvdDz8XsgPDUI/b8KHDnw1EaYKTTHe3dg//5gL0bTNCMRIezpEM8YDbMYmAvfa8gKnVRVzNollkOH8SxZOE/vYxAhI/6ARUL4i7EFoFW4HLAyPXBM6lLgCtHILOm+7n+Jw47ghQmQkCcqrKKUqvGy71ypWLShCkelFFElsg+cyMk/q2GnchdCOdZR+9y9Q3fjm/Yf5GRnxhVi/JJ/19CQbudzEN2QV2HsXTibGS7NwFjrxLjiEECTBDtG077ERRa6RhQgbksUaAUMqJ85QIIvu4G8/a7t2Whd4HG9/w8KL8DI8z+fTiiyROKC0XY6R2KQ4+Kz18cLK1nSdWyIRxIjAXDmOgyCLMhFB2ELKlos4fhQ+vXIfo9zx/jc5lgSuV9pF2LnFWLUmRbgYGWdw493ZUBD7O4LGOcp/BaiPig0s45U6ctk4quULNRLfFhAdMAZuBt1ggGdO5GAJaiMaqDuC7IIlsIsepsrRzRySca5D7u8hOJK1BI0itPV+6mI1b2QfTSJLBHReVHC0CEyEICBiE+4giyEReY233/F6Xvf6V1EGExEY9sD1tTEJES2f1/s18mxFIIhlWO15d0cPRXncpK7I+7jkyr1cBTBBiPNHFs7duer9WqyM9wmiCcfqqHVsJlgV9uoCGZdytQ0VCM+cZ42sXaxRYQxw+HE3YIhnLO9J2MoXpGjHjl2miHPHk9eIjf/sgqbDlP94X/39ApMkePRTfi/wq4oLMsA/dmB/lmH0kSml7RSyqnFlRK0CZCEYfuWDHvq2AJJ7PayCHTKYs66AxiTQAtQuEMHWxQKGDppt4zGQ+QfhToTy2Q+4NsKcJ6wH7sbLf+dTXmy2k/Zj0R1wj0rSetGYLv62jZXy0K+Mz5DB6b1BRxZ1sj6yk8Du/BHXXQEVBiqrIrVKNNeANzbVZ3Ugid0LrVluIYqPYoRXoWrEJ1JsK9GJ9H2Yc+jAvSJA4NQBVDdQgZNzHjsQdV+Iv1CRG9zz2naRi28ntmXspp2b+bVYGRREJrkZzDtLCzBwR+IzAQY+wWFxIlLPPzJFmzoweSuUxUpnLnBWsWxU4hiX7A32bQ478h6ryLYD/WYYeiWJMYG7I0F5oNWltjQIacfzrN9nkBCR4OXSWZnVI4uF4dhKloiOYs0JRO3PSw3Vsdd6WCZYs1gmSZ3OxEgek0ucJYJ4BwsvPord+BqLXEs3Tz1GgD4yeDnWLghOix04JsPAa59VwlPMo0xKRjHbglXPb6CsCGL+3Ndi/Ia0eduOgqwfizD94NWgU7ABgVGgnlXXREQw8SpUJ3upgdK2ck9ZmJVdlGQDHA7mF6MZCZadGK9RwdiAWBkhi/3I1ySywW0TeI6/ICKcvlD7uQGD9KfCIxLcCZ2bFfYpbSt2NoZIg9bOEcFgoC77/hLgVkRgzQTE5zj4WP38FlyWZmlmkmD2YslXZuE//YgkLvzk93oHDYSQ3Q47rk+/dta6D2YW7UMQeW4A1jt4t4E0S0hecASwNjHBh+ArWXsSd8Hdxh/1mR8JBCocceKWQUCuC4M3uzmZTKMAuGKXxYUUYWCQTLvs6tEEr1QJT0asjBer2DFdxIdkmmagLV9Y7RnQ34GZBnThqoFeDWfN9BPuv91M11gM76Avn2mEblaamxc4XQlCBOgL0ef+jJ534AxwuOOeYOGDAysm8CrG1THgsuRkjYBRjkg9we4Q5YPch2ZW9RBBPcF+fR18zrovDQYZ5OlY5Vd/lH9OWzp8MrgZ/i7PzU59uDDnB9d1JYDkDofsgDGZWcIYivJjX5MW+KS80AY1cdwci2PHMd/hCJmk0XxV0SL31BUwY+Z7EOVYcz8zSPLKVUlkRJJA+t8iijDujniubmYpQE2yY05+S5skWXhKFtjv5d8/IE5Uks3m2jFQXbgYqidBElfm10YO7BW4SHZfIKgvIPixYbLBczQIJNjryD1JXgfnH+R+cFwuBu1rG6g80Zmx1NNgctbzSZutXAnSDGX5xAsId7+Y2glOXslrKVaAnwYszcRpF2eQ3eWPr7sApDDHIFYy4twdf2MuAng46ETEitj04hwfGMFvkknQ8oQFVBUfwtDswNAADNT+upnIwbMAwIwdzQy3Jzo/tw1roCZB92Tp3rZ6MeIspnf754HwyUA4WXvPM2cVIA0xQyP44Xc80p2CKldSXL/T8SsG/BUD/ooB/+HHCECE5ZkfG/3MAusOoIgNZjcb3uVx7yUuVpNRJXPLMwyNv9Cs4a3EUYATAWsWzqEUQKRIK6mgOw8OAbPPXO+1NoRBePoz5IOrmeYNOpqguhg6kJiIp504/UFvro73Yq23AtVftl1XAIHHCmK3puU9v6qIK/kAkK1gsgp0191RPxabtBmSXeeQoHwWYsDmC6e6KYrUcXAW4eIGE026m9kT4Kx7LaiIMe9eie5mGPrY5DEwzmXEWqxDiiwhWwngr37uNT7q+T9Vti8yLlhWayX2lsmCaz6woWfZ29z3w4yxct+B707qLhascEYRYj4DpuTfHp7G9rjgqvO4wN+2kk+/i7vD6zscQy7E4fA3zEmET4Fl3RUjO/ZyPzB3dI4iLkgW2SjwVDrm16wtNmmCek+a3TomWSAB0CnNe6BXhMuVn6m9MkYpE1Qn2oxzg9I6hGt3RjdRwFlq+/yDE1HNrsYgu3P34ntwaan3jOwemgIPl8L+1ibuNbb3qfCa6XPTU4y8y61OlIXmfKaJAnoRT7Rin0v/qLxp7G7LEXB2PtX+TQVdfyARfLIQjlJ7qnsd2dVoFjwLdBcRHpJPc5ptHn+u6fs9qyrrWkn4kCT9dwFrZ5g6t607JQiy+HbNs675YGrZ4uVZzBXh5JHvWGx3cWrY3TFf3TGujZ9mhwzhvF4vfOSalOnMirfHKDDejC4Qaty29Nsc9kDQLIKLsCRx2mvG7mw/XXanca9Tk9uzH1X8g+xUylx3clZejhqXVxFRdCuAzVL9SmxcqyOnOoGYUMpcapN41L7sl33M3DtrccmLowq/3fRwOcSoYrB1zidsKa+Y+2fBA/HqjKz9FYVhQxHmirAzaq1Pt8qjQNRyrUWUT8q4bNVa0TgZTRDgySHPKkjdGEUTJK7zCX5VYbRiMeNN6WLsnMzGB2bGJVf+XpXwxWlV9GqbMmw/39DBa/61HqJmE4z/wbHK18/E+uEmho11F6WysDYyVK18QZj4MEQSA+k823cu6hzV2YdoFakB+WvGkBRhC5DxEyzXilS8fTJY9V4+WPwsMkZ4dbLKRLi7K/98/N0CEzGTLbUl7GSDA2iW+yWCZxUTpOXRBtswNzsumTdzOxa0GwF9L8zNFoJdsFkCU08csvhSHS5ejGlm5o4hwahKmkfg1tX+2Ezt0QUynzCeDI1MrKyqis2Uqcptv8SQO/BIAxl3Qp9vvzZL3bNoSed04t/trvnS5e2705CWE425K/v9XZdSwRLE1Gyt80hArxbQ3Wabr9TjlmlwmRz1Mq54oTaYcxLHSCYTjlcwNEVT2mYEYi2jlBvGPO/HCUYxBXcSWgyh6Oss9oYIHHrd7PV6ts2IEMlzegBajN5tTDtYb+kHSSZzZskbfBC55QXCL6y7yIqZrjI3O/a7HKLZP9bSho3ChqYsRwZJdu+LuPdHs56zO67Zrl2Ac0YlUT6UP29vjxctBzBj4P+Ox70ZbXm++iT9QkM8/1sAUO7vui8Z2b044CEnFkagmw1DzBu8bYNIdkTKSEmWBB0BHZvhnsF2FgovCRgZxFncayDrj8fu+vA3wCABibX/nefkLXjMojFAaK/fUUByEldn2bYlzRpP1m5EwWUNeonXd7wFiQZyDCxy33Z76RgZEKHVOotwHR2l5/8XJGUyhnyRCju4QBOwWOGYRD2vfE9fZUY9GUyanYwGzMhOk4jsfDRJ6SQXYMAVT2xmQqUB822tdJLg+n2SIGCvba3kuqU/QYm6Vi8ZTxHZwfcRSshVvsvpx9bvSSO2vI2EQzONd0aVIHuCorYDvlXBbYSVvJZUAb0lJgIdKZ+129U9QbaUwYq6vrGZrF7s7RBQ+URHdWBVQGfoTpTf5W3Q2IFVNKGh9uHuiCL3RBeLuigkkjJgIsJLbX/e5ZYxk/2dyljvsiH1DhJJ5CWOFkniKDAAhKvYxTMM3BjF1BGSeTriBIMhhpf03zJjWTIchxbIEUqz+hmBdPJZALj15YgQ3YEDqHwUEDXSxpD7vIuNs6SIfD/X4HMKvwmESrKbdSQ4s9efErtwWOvnFKbnZwLFpRNMyY5vcQ67C4P/7CPX4C390Wy5kwPZ0roHUd3tvU53AlGAXD8T/CwHJhkXkuvo9jUJqLvbBpH26pSUQVEVhtsGdGwkucTdGW3/u7mAO1jPWI4qUAVqpByQCC289owEh5twFBHI8vRr2hGrJ4gl+a6/+sxmowUrBBlpUCOy22k0Y5UHIgXeNRgpwtSxJSrFE9hqlh1AyAW8MnnS7mCsQnkVKGxrSigrhChAPkM4J/4c9jdTV/L3q9jnSyehk/VcmARDG6gjAZj2v5pkL9EEMbxiP8NhJqN1ace4hva6SUeOoZuRe8aRHW+atiq/3zBTVCeaCHLet9m2m1Zx0WEHZxWwWuosL+P7FG3hVwz4Kwas1/4rBvyHHt1JJ3r9m9/d71oypye6ZpG+a6/1c0sGt5yxynGD6+7l57MTNUj5qUafEi7If5tlh9IYY9uzeFMo0ZFxYFh9B9mpgH7dt2Mu3G/pNR3gHlzVpTsQtKQXc8965dk/s9OU2x82DlHfnPfl1/59s+DTyAya2NSYyO5WBDRG7t0dH9TZC5QSYXcnuwdo5H14bHs1yXUpW2Js7c4FC3aH0UuSoDOOgYRsnzbnINz5KOzjwlPemOCnDk6r2MCOelYQ03EzLiyJrSK7Wy/PJXU3vvEf1yx8u9x/9y5d5iVzenHhRQKL+do2ahOJQ3dsYwJiV8WjJUWUS/TbHNmzei+Z7vQMz8JH4ki6865TDlySeBNUt+eb9GnjQ/jc5PKOnSM6Hqy/ewPaNqu+Cp0qkuRiQEjwVGo/Dh3VtdpSfrHxv3cy+NiZy01017jzl17rqqDqRVqrXExT1vEurFEFmcIb42S5JS6mut+vbKlJuEGzpJAIzvInY6RUV5DF0NEkrwiWwIlUMarOHTAL9D5wYpQS0u50YpP19K1j/apuWnktDunrn3v93dLyiTuqCuoXUoWfV9ssLJUvIrb6U3lIIoKXJl1TBBhyS4L7RRew460AP/xEO9YgsUsJR6U6UgjGyLiilaKsiJkuIHagPrDq3M7i4t+Hu//TD/nMnTUqCmugX9iYqaXZ3cXEzImh5epE7rsyRpks22SDQeZMYwjqd8fhIuP1UV3snfM0odRHydkpHO3Xdo4dUG/wkuyIFZWdG6pnd6EihGp25oS/4QlRTrL22Jb8oOzsLZ2cOdvdiZ3Xkeu5Y3uRip3pDkplI+iyiMJMcGNESzHX9gMWr5K0/bdm9znAr5VdlCp0PGwsDEt1svrbceX7eifwGaTdUyB0dxwOmyULG4xIdbQZihZJo7f23o/AUvuCuWS+cO09bm9cn1aMGO7bf2b8XCN2qgAZ4aA3wTfUCTyVxgIOfmRcUs+sC7/ZzZ3yiNffaWP/uztOXxMNOPV/Sce52+XnZiHsoF11ayC+wkA/c7H6q5LpciQISxLE2oGLF/vbqwNKntvJwNoSdGNmlVQimziFYq9KdbK0tvQaeAV56sdmi1z5tlG9UpqNrLaiUmu7NrjnAhdVXCey9Uxzg88YjD1rqAy0JBAJ4PJKSTdIuaPozqxeGF4AYQW6Xe2M+xo2yFlFsABYyowMaMLvl+rtROKJLUujZZmcHBFvOsGpBW5+fWHjNivuXeJldrBtAlzd+8XUB/qm0Z8Sf5QxWng58WkBAf6m55kfyPeWXI5cpLmBpMLiBgeeJENLiAIfT6NAJuEsz2+qW7N0jSBa9/8tSND/eP3/c47dPpqV5W6Rdc/14JH67LpnsBRzBdkzO5AbGhBIwMf5MudrVvX7VfPArksY1S3m8kKrSOiVUItPRtwspasc/qg1ElwsT1DQhqPWkhPU9c0t79SEkQg2kL/UEa/6oI1kIuSVMmIi7ltzHLmqz6QUZKNA7GYeBIkqknqjOhS1USBD6qnezyc78+BeC+/6zOBv7J1kceKxmW8ayT5wv2el4MFRRnwN4VmawfoyDONDfrwZbUuWtQrHUjLuU9aljBiZqMdIELbWxBkV1gesOEpCBjxStkXsE48PWu6rPFiygSKdbruVwDbQzSpAPjQ5FOF5Tp0QhscjgzR3LFYGlRJ7LQ6f1RnZ7JLvc3RXp0sCAFFSDV+087kBpvsHK+1MwMsSkIW3hDw+7nXzjlyT601DsXilw49kfyR5oG2kMEcmxBJpF1Wgq+mKQxVCQp21kgzRa03de6nnd7vh4azSFR9OSYeCyll5S2B+S69GBS4qi3ELwJdfagZqJrkRWWw7fOaa9Plmg9Yu1kXc+sBsoF6RSsRZwigiRGh2Ww1eJVWSUraUbd92g4lwVbLpNd9RKlkEiVlEkgTewgdhQcwOQgWRA7dkxWrbjwpoJwdW98dgM/OFVxazpsCadf+xwX5nbXCxWYceysvtC0g7Yu6CXXaD9YyqWj8Ir8y9iJj3HvLPBFztnsPyHQ7h2MxhEeF4kyFA7q69Llo08Udl3R0DoruAGNKxztjdCYoiFae4VDAlj10MJBwZmQodVmxEgc1ODcuuN9hs7g85NnhocQflWknYMCXPrIQd0D4QrSajumfgkP5szWhwz0JRdb4jA6/kyWp2xktiU6+Pa3BuX94xIkjpfk0vFmLc3RMEHCtnDpj69tGIcJSPlugCk2cxSxTX2Lr6Kc+SgLRUwiecWeSrI5OhBZVkIZNnrAL3y4ePySibeKwHoumbxxuALdXLoeV588cFhjJQ7wJ7d67njBwgZ3R1TKSftC87dgfSB2pXAj8D8KtsV55zxGReNROl435VTJyIlMtszP7bHL9iwF8x4K8Y8B9+NOnnVh0qwoLkesgf6vZppYLKNd4AbB8c5a96BtfANh4cUbJ2b3BUSk/VR8J3Z7JqFRDNN/CkooQc2DKGpg+NZRugVx/YLspUMVi9pIHXJnIkBmO4GzFqVY4kTHkRQp+V04uP/f4FQ3tmpCbwLn7PZVDXnH0pN5FUxTl2l2Lw4gakOg5uh3epQnUtoZ69DBEZF5Js60ETlTSlHkVgYwpv8blKykrn08j7X3Aw06aEbzmmJHBnfGwlbRwWXPaojvFUwLnUCf8JAiLG8Oy4bda6SRZc+7i2ZJUDgaujNTbCmchqXKxINbtjTPkcL9yTsBGSOMkz5xYUiUV3t9ZWDvBIgsU3OY7Gb6qzfljieUvuN6PIntOqkWv88iowRoA0QeBtz9DF0PQvXk5s52tx7ELt15C47fhI/I2MpWQ0nFlFcbKo1XKZn3HlHuwZu54FdgGOpcwi0bVUY67ZmuUVkjEI4KPmGmWbH01IHzHyXFb+1Sez5KGN1+7WbXWfxs4K3AOyk10OhaviqbIrI+4ZexLk/Ft7kxgegtaeUOBpq/ul6jOTo2KBGT9ZQ1L2tPKbGNUlKQorySkiWZTIolWS4Yp6CJEAdFQBT/ZcWSlsNM87ahbaCseHZH6MsouNVYiGLODlOU+QA4/AWuKXi6j9da7EpRVl1J6ymQpYXsU6ZyQRrGNRuZVFvssx5CIic4e0O3eeNddduLbGh2vvJMFrVlxyFwH7mdrb3KZUempymhQu/kDkqPL5lZ8TyRgnoqLqWmw9Uxro+bsiVsXjlGMMOVnEznslsktVyU4y7KSJhneDx7Xx3/jTa0nTd3fRUx2y0Y0ZsurdAuiN76pXcW7Ry1Te2r2ONTeJqG3CZYPQhXhKEiYxowstudcGBraY8WC1vHJJ52kVWtIeJIL9ztlKNZa2S3rL6/snGpHdfoUNRVgVgyoPjeCQk9nSoQ4en3fOJYLqTbICpefU9e+dP/Ai29ydcBT+kMUtpJpDoteQb7tyaarAQXYu98xt5byLdjUz9N87/m6BaUpKxa2A7Fw6agEaTlVopLWvndXjd1XAPwh3bBqzEiGvSplZYLuFbxDjZiw0m1drqHkWXRY9NDNTDNsD37BkJ74PygyN3UJqrFueh66Q61vIcu0FEeUArTI1lwzMtFk+qdPypX2U4bvA0QaCtw4fkZRXyL+vS45oPmD+Xc/HWIs5u2W35Zv0BpzEd2vqXC2tw70B58JrgPNHOZNkTtWij5+oVIteScnN/vaAGMqodr1ZbT9++TZgY8N8t27us4x2stle6RwisFV3d0y6dT4qAs77q9bpGMwKsLKV/67w5jNtRnSALsbqBZ4gwmEPXrM61wReFVzku06WdBfgvsuRMlfwavC1fp6zKtKgD8abDmYPiJc9zwLYgwzFqztBHKSN/KOA3tiMK1ErJlGC7IsErAnBzZDwlJqETOJ7v0tq54oGs4fz2W3YzwJ35pyIpPxKAs+R/y1JEPxO+DPQ7+cxuMIxuUWQjUBLnmW3C8fgZ7EddrIM6bBCyr9mkTrE2TQ4fBe/u7gQvBXM27jCm0Yp+UxESr94FfCT+/oROW9EVFDiHhZ8bxa6U4YQYuWslYPFVMFscVSQ8BpKjHw3GxySLGQkUJKzYiKCIQn6vzQ1pS0MfHIGQLfr59HPVzigggfdbAZnxYuUhptcVbS44llAx9jvdyxH5i2TmT+cfLNtVR08wYwCvuv9WoVbWejIwoWIsLqYHsJra/UHC3+zIQlOyZvTZXcM+C5oNXCe/06tkdbEDy0wUHJd7iLYtqYNIpKzbeazWDy1F5e8dRklOtfBWX7u3N1Kl1CuQ7Y2vNdnIAHIDjTm7ixdXNWe3YBsB2UiMCJKQiwLQe0FljTIEYgmCSIDqAy+rlHFg3qWIYrKmTYMsBC8hpGql1zZykTLvL6rApqj9vI1135uNpW40oZZSSC6O3asSoYSLEpm28ySlFhCRSJMfzCpLgG/Z5gc1f0bPGvf9DsE9YVJSt9l4tThYM9Yupma6jdhIwpQDA5ekgOic/RCnvej6Efvsk/f4Rg9K8aOAlkucpdcuyuFOO9kuebqOL4LTC5aw7aFu3vm2msKPGUtwpkxCxw1uqtIgRGSRY5pN3Nz3EOn26p1wdDcNvt0ldxDDqqtxLaBBGkwsjr72nx7ggJZdEkWWIikr6GSmIDwlo8sPf4936ySDXIPXV2Mio5/5I1kFTvuya6KNtwFQrni85MI5+LFQ1uqwYgCZpYWmC2K1CyH9v2jZJ7GSOBc1ixpvyKLYeVrDEJS8sipDhg49Y4Fxpjgb+QkwiT00gAAIABJREFUIOQnMlJkK2OX9kHJeo0t2ZX2rYsN4h0j33v6jlVjxzLET4bm+da4fWSMM+P4pchsSWmHkaUFpzpFCuD4TsevGPBXDPgrBvzHH3tWovxWOWPN3ol7vYy4c/UjPjMP9ixGR+S8zoiz4kXZcRn1fOsHBdScyd72oDsMYNYsvZTgkzGJ6uETyYH250oijJYNfM7EKgAsfP87CqCV4UzT3SR3lSx8jJ6BYrsD6g1c2HbXsI1zZKm18mrPySpLB22De56xwAYdE60uko3ODZQtHP9TMSSELcuvBnF6nefu3Dh2NwtbUnlLPblt4Dvxonouh6byCbZnPR+SUkPN7E/MKOcBZYcFvMaFTOFpFXNLzptOuylMucFMEeWwuQknQNokqHECwmIw+gHYhY60EUMyz5gIMYyIxbyU15xc1gWWRIPGunOTR4GSr4rqJQL377OxjHPLIAJbAhp4w3Zur2/VvZ7r8e6W6a6MRXeltvSoJGbUdrcIBOHs+R9Y7MLQ8CbzRDYHqDLmWYSSxIkaDxSJCidKxjXeFW/umSIDT9lleJv5UvHZGCCLVxdrq71vxTNjIYFpGRPn6px0V3rOMo8iWSsq8oY53ntuF83m/NLB2HmFrgMvaT4l96gLvCJnqSyqo35WWWmTs/J7D/e6dwV5JOrn7O6GGKNKMiT2uQl/Jzomsg5mLKZOCmXL75V8x86oGDYB69EF7Io1NAZX2bpJbAnPV82nuYkemROdW8629uAgcwjVJPxH+vg9V0kPJH50JQTiAL87K9EnJk++1eEZr2kVNLuwmvPObpv6Hj8DWDyz6CuwpV7jlsozSLUvMoZqwuxYtb5ViMrTrrEqxyv/KGxUQAqv6NmPHR8tnuC5L6Y4cfU7qE4bsVRCqQ4o5NzXioAXsVSQ9Jndsdj7F03ZOYEf66DJVf0MXjPjsZ5xmGovN/FKkL2cUkCvYl9+MOy8c5Hay1IYgNW8qKr2bxswS03FVe5mE7XMz5bWaBk23tLfLyIsnXj93kI4y5eIXRBBiKaUd1SeZNkJuooQe+FJXgbUowi3bLnKl1ybLJKNLPksX1pzvmMiX+RW3+YE99ryxsaSkmu1hzdhuGz/ob6755vJ6eWP/6Pj7xaYfOTAvqiWs1UBRg7R/Fte1OFYASY6u+p5whAilJDBcw+GuqvtQ49bnsaf94uJDKrEVrLFganJZJBin4YMRrFnk11wMPSuJDqvHKwFCeyV9u3WdsW4SpT/MIFqLR/uhAcyD1R/5M9QDs/7Pi2Yc+LjYpGVxEsORKtqaK0B+wfIRevLr2LSN0vxsXIKRlZR592GeviWHNhDznCimCOCvw1QLCetkqzqCIhbask3OOF7AQz+mgxpSUmfXKCD32fpKa6Lv3IiIcxaVAvnWYy6V28OHK+lc80H7IF+v3EWuKpT9ucthaXrXSc7c2uiDudnG4OpzPWjEqpyuGaZNEgFu+Q8kmw5zjbsHpjp7kw+IMBkIQIuLz7/3iL/JxzXSMCpWVKbkRqpnUsBTg3kzrLsYY8t+6UE2WmQCXMQiBw836RgRmRA0kP+krPQrbexDU1UsK4kKz/zp9Tk9Uit+2SmJNCuJVu4tbdnDRP3a8szMjqJkV3MvHhm555qdh7uIeu1rlx3EXYgrNEyFXmdL198lIm5FMRyPx+V2DcTFzLx6sTg3ku38V8YFy0r9nasWUyGjaNhY2FXMhkfRIKXeiaAGvBA+eh5PrIXM6ZglmmVHgXqtbORC+UnXSf40TNMet3XnAsBTB4cb3P0MpnhLQjJMeoRwVnPcqHgDW5MbuecnYF/i0/mzPfzsYRHjOpgNFjOeXxs/WMdjtUg2rZlJou4vpk8ilZwVc9lbLt5J9jR9GlgM+w9sjMnooKVCig60ZHX3QWLv3VEVeAStgv6l2awHhFccfu42bIKx2eCfNj+nsNuIOciAVz3W99axuLcgEjk4HF3XF4pqzaUU/5lP4fwZG9etX5P+xeCtAWhL+IjE/FPrVkcde7cw+eWuu1ZScmorLlPPu/2bZ18vGn5J3hyDxiPeAN83sD7Zn9m10aBMke2nb/F0RnrCSCyWV494D2ihpOOnJ/12cnfkATcqjAmIQV65k2qwl+8kyNwa43uBuRvybMMugrgKcBi8MDkyqRVXhmTSHYIALg9IWb54cFRMYFqSV6YclS312XGw5NoEXUdqSn9H2sa/2cfY30wWJup3tIu7sFj9Syde46kR3IcL2IXUwcO8/f6i5J5sI87Y+GBxJOMLGq4dgRDWwaiUgQhfYVkLNk6PgmI2QapmvizAaIwzAV1eGgPbSaLmyJoHOwhUNWF8IqrVMtGyT8kE9Lls+Rfek6DgF+onAWapJ/w8ZdNolKxDcRo/JY3Iro73q/5eUtJxoTqgtJODLn23Bd3hZL9sO5uMWfGswC5QZN4zjcoPxDsujCb/Cg5zSUQZiz/A2RlbFsxpLsjxbrPodYr464wrNsDWjLj+BeQP1hrEXLt2N7rpYl9sErAPQsezwRtmhFpi+5kzDl6Cdr+LPszbCHLGXNwrAOX3EtS7FqPFz5+5vU/FtRzH8s5VFkmXG8xwHc4fsWAv2LAXzHgP/5YM6Xo1CveqLhhFXM+i7k3APRZbJthM2PAytm3QoukrJrzNyZSNnYS1j5as4AlstVFbCxWZZ3acY+lXaTA+D+0wd7f672sTZJY03DXjFuYrLUScCtChbi+FXhusOgcxRRX59UdBYzs7HsrOvqw7XovzXtaOMFvO0ZrQlV3cKlOlo/sxoJbBlrjjhdrfX1cJ8ItKcgiVWFGPpPQwMteJa0pJVZX+QOLnIEx58xp2IVpZAdGSuxGSXNSOE/kFxORxJLTk4RxMGqmkWOtQLOCU36rdd3vKrsUMUqS7Nqg6FFz8V50XLy2DV7T0CbT9oycIYz4a0q4hvNDDiImPRtI/WPPxTCeOZcOOEbNNpQkenyXI8bFGhdtl3pWjHskaF8A75aF5Ky4/SgFgJTv6gJjdgsoiN7xtjriP4oYQBWFfBvgoWlnIwI8yxsfXuM6LHgpoHkNq+orl69dpFQVDrl9BNQsbzPGGNgQvBhJjhYeGLUOLEdXWN5LaOFsFtCYmMyUYYtAtkRtkStI0HwU+aE7GpKAkfenfnJa5Qg6ai3feyoJHlUI0ET09DwY41HXfHH1fM2YG5/7rWboib04PPMcV8G6qFqFgDjgKmLSFT+ZK/dvqlgEMgbEg3wlv6FHS+N2ccKKeAesxy5wvBeaxEoS+lDOks67mmATEH7UvZ78fOPPQxbIumCILGx0HN+jPAyo2b42QYw5FLHas3GWvPT3OWJ+LSL3KBl1mDwLU1Wu0TPJnvW/i6t8mYZWA0fsAqsP4ZLM8Wd0T9tbuqUX2ioesdDoLrLav+VrpKTye3aheM5pTUlYYbkx5cHZBaAiwJzrQXQHHFfKMgNUo4ivMwsokIotG49JXBfY3ZCmL473Oc8inKZcMTN/koXVzKbuLhIOPl7VDcpBkwr3c38rsOhYsAlbSSaMCI6Vnc9ntLqZ8NKLnl+9PLvR1eL2wPO1i137+9djx16nD7TIV1KY+8UTGSn1PYG4gjluO/VTPzMqiZRC79lpOau6RgxU3KkDzP5WefBbwbYVebRmBwp3Fz6CtJ0KEDn2jN3wSBWFTSAxZC3OceNVPpSf/MeF279bYJJINsazhw5X1TjmE+2BdoyscHkWHTIJ6UoiRCjNzqSZRNzFoBC2NIG0owoh2XM9KyM9TjO7jLd/y8Esib38jgShmq3k0zj2w8z7+LleO/D2UA5jFzQg/+2vs4jgK6UEVLG4St4HFo+bmWEdZP9BkgfKgJPcZrW+j/qs6k5MvgJag2QDx+7cUb8ld96P1mFXEQ6ppI634WgVUPow9O3zXk6gJTEudWZUradAoQaCIBdlt/lfskC7jbiDx2N3dD049jO+VdmvnZyC5wwUWjwKxAdr6nZ2OxGs9/sq5mBe861jPTuJkxdBDWpH0VHFMiumnnxseZfvcsRIIzOLxXMzP7wq2FIJd93LnjPw2kMvEZg1XDS6rfNPchX21hkIFCu2JY4mXsHRBn4DmjUdMfFKOJu8J/4HFBARcvBZQKmMDLxOKoB4a0HP5KwYGvKBxytbaIejhYAro6S+blvxKQNph9kdg1uKIUH5HRDW9QdgdIH1TqKON/3dDTpqNRpSrLbutNC7A66ftVgmKirKsMUhgsiLu8Pl2KB3s4ezgzaH9qbSxBMRZe2ATPcMixDnmmnku43+Q0BLB/dS37bj2BJKTm8SKQAeAaPXRODa8jfGjJZbqllDy7me6fAPPdFiav1WSVB4kGx7cJmb9eod5IfwWYyq73L4+GTYxx7y/e7eGkJy1yxkcHOmltjWJDa6OyiB4Q7YdhHG527O7n0TAq8yMTl/JLshAkdKeqUBB3wxK4Fpdlx2NjWrL4s8PWshg4Xfm/uJM/iYyT5bPe/GHCmbcqzfME95hBelt/uFpFAgn95+J0GCAhCx3WJ+NGtRtBIpx0gZn4hIRrjcVyZ7LmB1n2rsLpJbtsn3uideeUU6OPudjUw0Ukokg6b8217vUtcSqJLDhFXRGKyV819GgfxHlNyUr21DL1Z14UDwg2b0LEnmkoszan7j0pRdC2huHwNlvgXEPaNJl+3vpyQ0Ln7jJSld1t1Mw0sOK3Iugmq/4/TdgUPcbe7f4bhk7s0ilUyccbGqkOpjbb8tLaPiWoC3IHrtYdBS8oYtb5cfWpv1+s5kpDrhWhohizlvgXEERHAo91yu+vz0wEWKdDKZx921A2CWgJKOgcgfhPb6LylLLBMzW1gosySFl6eNXlM24eY0RdUTqKgO8iv+x20fpjCtfGl0oejAZ9mEdy39IiTVQ8zvp7scBaTWCLcueQkwZwgRM4tkkt/bBboZ+WRDctaAOMRIcDtnf+kmHd0Jkt8A90EBtTnsXFU5opPI33O+Rt4s1ahySySOZ0pMSQYSnzML+B+WxUKTyaxZJxYHVwON5ctWOB9z4CKEGHgCgiFnAg4m6Hgk2dUF9wRaVBQ3z6Lt7tr4HsevGPBXDPgrBvzHH68B53pzE0A/o865l2YhQkSYBWqmxP4ob/Pe7ZP4g0TmthFA5Czid6BqiO6uKOOT3UJQpFqNu+DiErQcHGXLzW/wc3j2eqjnvJ/Z3X9F1Byw5WU7Hx5jsJrwIGuD8S4JRI1xJFOaXDbdse8lKwS3xFl2fWWxLZ9eIGG07LzY2AUmiXU/y14XOEt/vmFBWZBoqfwQ4RppJxL76U57AQE94LwscR/xzbDv/SkSrCK1Xt77WJGYeEKaOeeyujFPeWBurIpxszh71eyyBO5FCsuqdxTeRcgmH2VMkdc/71lfNuiu7NUKPZGdJ66C4BxLGGPmwHkB3FCtDi9RlngRfJ8opHzZN6rbmkwUfwu9/tjYUbuiM5LYsp9fpO2w+llwZZEUtoxtFpYqwpZRM35KFLU6/EN/v/EmeVShL8H3Y8qW+05dguqQiZx5eZV9z27bUgyQd8Og6JjlMxYUoYU48141c4nsZHrzMRFVaL0VGkRiSyz6VrOoW5P6RznZaU3iSUysf98zvNKnVNeH9Dq8WNXhFSq7G/faHWCDUaMwRAd0LFcStjkW6Z57/2ecMHu46v28FeJCcobWilcV6hTl4Fo9emNsX9ASiiKwaMWDVXF3wLgVM4i5cyAhu/mbhHRcd97ehLYkbeWzeGnQ8372mvTBNTqneOEOEcLUlKz0uLYE6Xc5OjaHN3WuMulWsbvxFru+YRDZ1SPYJEmjtW5EksxqcuR3C9tHtM2eeI2pzLl9bWp6BqHX64RguKBdwAjZmHgXy7szPcmnHVedu3MavfhRBawrVu3DnBuU++7OffYcahv7Wi51rMem1JU+RPe8oRwP1H64Yl0/+bkBh2vjKIMXascXG3U4fBZJFVmEZ75+z5vMvQ0BnplXkgyKRKzKQCvfcNbM9S4imBl/4eCseMKVVC/zN3/GIMbYNY1QxWgiFzxCeZJqboKh5Utb3WZyYaP24hDEV723braJOy7x93nB9Qwk9r4IJAnSATS5aazdRfkwR8exvzfrFLHX5b93/E+nnklcmx22dWkDTFujMzVop4zdihXcXTkhCtUuPv5NK5Xgxp3U9ntkbInyac60Tnzrtfi8pRXiTYOxwQ8eMHPTTcvhesn8yT87/UCIDeIN2tCW9JvB1Zs5wEZqe9pODE7Ck9WqbrQMQiczQwQ8g1ENRb3lS/KaBlLVRntzKAkOviogbX17pQEEUH/A9HKyWsFPZLVSBfUH2kWmRuZ87AXwklk6qFEBXlQAl3MP1D+QDpb6/WkOzUM0K9RlBHvGlFhwNGO7NiiA00UlReRegZtR0iAksYMEj7UHbTZDa4ZCBecvglXsEWvw09/AS127M8ol53CpHZ1FfpvDRdFYWWaTAgfI9TlasinOqtjfQ+Q02I5VkF3k3cwiBjLufi3r4mUF6KotPwTisguDW4qnDEm4p5wVZfQ7McmIJ4MK8WQ5VJABDbIXc6CWtXEDTcMVq2vA5nYth2nuE04WGbxqSLJwonW7M8nbUi8iez+/CtDF76HQWq2umWRBy5rZDjIE7US9pVQioIZlK/fwztOOmoV2s49KLWF/vOC7PYMkCwvXfq5Sg7u781BqzwIcCi8r1nW1lF9ys3aO+NwSbJ3YTNN7Lgf3fmx5L8Nuh08611xDLct0cogzx6z9l8m3AEMHryG7+0RjoDH258yNayz4Rp0WkGBAFoduMA0g3hgWCRhozbB7s9s9mJXBHjCpHVjpTh6yDF9M5dakH0+k1lryuxP4kZ4Rg94z7dBkaTubJQujdJalGH9H5SOZEKh/ddNPbY32bi1PRo2q8hzX3iPTZw1iT5AkkxplWBQT6SNBY/lJkeuAhZRsz/KjEhZjVodGsuo/au0Hrc+bJZjI+R6bQi53x0u9i9RzL3tQbfApVZRFoRDQNUpOz1kNTL8dLgceXsWl9D3hL8YsgDYS6DfJ/ZyXUuc0ZfXcp96/kuvG61m1znBLt0Qk6BQRCXZIz5bpOQKZAJoZP+TgKpm3CMWsZyZEdQJMriMDZvXJKCZZE0byqX4n0C47FZpxppVErq68RSAGe35lrXlxTUdTNkUi4wcZuqVJlFs+yqO70xuI1r2/smhYe1sybjIFLZsa2trw7CGuwuQoduYQBc+Oer967R24rgS2YxHFDgw7iVpXD+ZOBnbX4ngQ7gy/gJpTIoGMk0WBhxWXQcnylb3JZCL9eQ9rjQiGjOwagdSU72IzLXU3cW1C1nUPS8agngPFnh8lS7Hj6XwZqGYxZqrQTM8NWB9ZvHGKeMSFq3NUV42MA+IgPPZcq10UESFcqsCUPmlapB2t6x/uUIUOZ24m783SvSXcnjtUi/0MlZPgM2Mhl931EjVMXWQiRfha8SoZF7Dxuf3xlP9pqvOfevyKAfkVA/6KAf/hh65BhDPlTSbUHZVBVDfO9I9tY7tzVUviKcjutBwFKNm5IPnuerFGY+IiDH/DLsr3BYNVpJZZHTcOm9QzAnTUnMrKV0+O3R3U83rA73lheq/50NjAWotrqs8C/grI1lEcgyxgubBnZylKVzDkTc6xiVmhOcsSqlgFKI7Gx16/d7w7iF2Q0yxCutMSgkt8F2j6VFJSrBmrFxHWHSmCcmhgU8tu6Aa4msQEN/A8VLHVRbJ8djPgKZLvjckRms0mvX/GZ8Z7OOJ3J3A+62KIFzklgcEky3ThYHhsJvkV+X15X/U97inJKhnPROQ8q25YGGT3cGJCib2IKuxui3V3J3+XIxJHAzYGdLyJ4XpGUqRN/fNnE2QbPT+8up7UKeBfwGdJmt/fKFwYXdyp+bDcMsQhehMo/ObkR2Q88qFHFRpSfjJaru6dxNRzaxzUanZTyxtvcF4xYdvS2BLGC+qeY+h+GlFjQyxs25nMO98ltLIA2cQzVyd4pv3RyaMHkJaaxhWWvlAg4llS4RWPR+Qz3MXRUgCKJJgDTBs7V3G5cbaGZHN/1frmsTt/0erQrPukuzxmdoh19569z6BTuwmZkTC6mN5qtfVM81ruV9F+Sfm5uwbDS8pN2fjxK4wYiS8e66zzG92lfcXCqDlhLCgf+Y5DfodD/aTVUiCLpJ0TGJT9ettPVSxkrMxHgRiGmn75XokHwxfuJd9P28ravwHvc6g7zl5vnT5hiY/jHyht3/o89X2ihCsxs0jVsp7G554ZTcCq/dgjaNJDFqZtujFpCmMxveXVjY+vnEPgSc7BTV+RMXQXtEUEwzLGJP3bnhmtwtlKIYVDX6RMasbbuq/5Phwv8pvK5KzY7hZuiSQ3SqqFqUWKbHjkCALRvcZXpCIAb/LpI+ZdJJf6qYxto16WJLQRg4jJ0J4Nmb7uD5d0XKqYB17qBUNy1qF67r16ANt/7sKe6Mb6ociNkrPXMq43xKLiiKxGREBgeARX3PHnv3f8fS8mC3zeTMvaAK5awTJYDEYNDBubwfPawIxEBqdCzlXqogYd4I0MJOSt0urx2ovCiA0yfVR9a0lWXgFCji/Xm8CQ3MZYXimlIyDF7MqkP4f/+VhEMSmTaec5JLmZ2X6mYQtY82aeU9XhQIgCpFofccgAS+kKcFRS53m8MVUtH0GxlPJnl/qei5H3DOrKHpLJ4irGYm/Qlv8TyAA3svA0Wotxsoc+t7xeRHDtFvBGimBoGnSRO+hKKZmW+Tmx8arWy7yX40zGvXnNDCmJmS76yBsbDPFsQRe5E07uIAG955zsocM6uAdAD0I9jW8XO6/YSfKPeIAlsNeBxWpW4jc6jCdCMuaAlIyKZianFI9ADXUUPlv2UFcmJRQLlWbm9164NhCaQ7qzj2L7hXz46ZhtbGkD6KHYlm22BMjnBr26PichJUVZgeCsIL2DkbzK/Lz6G9BczkKVs9biS+dumTfJBEDHi1et9aWd/CR7SUUJTfZcGnhBH+yuBREI9QSvIpl5XQS28Tbs+N0Y7iIqtK5K7qN0grODU117Pe+A6E9B0k7OKqFlJnMfskjaAOVVSXpE7ODPRXfQ7FVZHbK2xBmrQKaIzVxCFg/vwvjN8F/FToUnWq25P2JyddGhNI9zmP2BRGrP7rkWdf0+wYpRtjzn8XkEPzVBzRyh+qc+9n/yYRhDfiJd8K8XvBKxBm6bC1E68yUrtZeF7kA8/z47gLw0g0Mm0h2VTVxAkd35mXMUkvXd7KvjyzweUUvJn1AIZ7F2F+9Ih5nf3zrY6lsHF6Bl2W6t8GSYmierbowaatw2UiCmYnh293LeMU5+nBk9zDbZSUJ2LwuZ/Nmo5E6M1VIDet72ptbXj5fs5MTQ3WXVR8C2AS6C6VXr7QaypKRgcsBSvo1OyIdXWUcyqQ1NdtzU6pi2KgCp10yM8rk1N2Ihb2nxqCHV5FwJzfOcxWqezRqWTGDCfXeqBcF8Yx0TWixmkrABDJc9h8usOqLHa+9F1Zy0kLIpGYP4tC9yTv/sI1SK0ZZr8qpYMDxBUyS1m8M73isy0VhsYk8YaAas3izMqqipZPF2z+fsOSGiaNHUVD1tuCTwdYUhHMUeBWLtZ97OTiILxanRn7KWLXkM2YE0RHZxI6j1VXMajordksEyN7tTzBjAkjN/J1kcDb+SRf7Id5tycQdLnGFKFDFoVGyM57PSsv0yWsoF3P+AiD1rysbk3IADSHU6bHksVU5Ln3I4HHvoeN7ztFnyzEJOSstr+Tnznl/qWIGfSy0ltsJ2DDZk4OKYG66KWhaSW0ptmXN2kKGLli1qnxfzj+w2g5KzSKBpSc7KOuWR7EY61rxR+4hg6IvpkUllASFZIC/IYwaw8N5Dcj+rTlPvDsrvcfyKAX/FgL9iwH/8oSNZ0rYZ9JGhX8SWNZvjJ8PTr4/ouRT/YxcMVQwfRbqkBtPLrMJLQEh2NgBKyt5pKDY7XntBvZfnUbJVK7GFqs+mJCaBx6sKSjeBNsFF/3JfhBKj5/hNYOR8MBq3WDfoZbCZAEVSirjIge0Zdz7oImRhC8OrcCRVzG3MIf29yweUFFFLWSHkfOueoeEFXqpQyzpnZfRsqt3tzj1bThxckFCs5kp4DZYHUDdmPRg3xakCW3SBRhgz7ZFb2cLBBtVEFu7ZA6w8EeT2pUDIDYJtjN4TtByScxqvmn83GvxNA1E2eiSBggTuAWKsLI6754wKP/Hw3bn4MW6wXYkixaaKQLiDzC+KOv/0Q/yOf2p9QPypS7CB1Lixmbcj5GDpPbZCRFjBXufJQ6/8aHkWBd5sqlU28g6OO7LPFfJJVF4UftSIiLVJTMO8pH65u2uNPdtVWDlfkgA+d+zxVAWMseYGmmNjU00mrDSh1sEhReLQ7CYQSbwvtOfi5HNsnwXg47nJ2QRco6Xlmij+Qupn6tddhpOaFfduL0Kz0xs4X9Fvh3Yll0hGgm820d2ZO1cbPFruNbpTMwvi7sKQydDMJVvWUkQ4/OzXyzHs7tSQLGKsuMmC1vjhys++hmItr60Xo2TRunnkEcarxpqYrZQ0HWMT0RUwXSmZrIGPMz8YXVwafKu2QCB0/P/svcuWJElypveJqJpHVHZhBkO+/9NxNYvhEAS6MtzNVISLX0TNEw3UqonORRoOTld1R3i4mamq3P6LzobaF1aCodtLDCRNW2fd8JZ8FLBAIJy3YeH2Kqo94f2eb/UAUK7yKnWWJDBvmfhWRUCA2NC+uJmLpWgwgLJNsfVtn39QrCa/WOuWd7TqqyuvV+1uxXzKYhNrsCj1mGF3D2bx3BJtPSCMWFsuVvV++3hRfR/fylvyaK7fy2vnW49mptstg9/3qIFmM+vLOqcGQyKTCHil2kT9pL7XY01msf7787yGoEfmnls02uDkRfstHvnQwGot1riHwZm3dOC9guVpnUyBbRcacm2liEedlbnlcT/CWJXDfL1PfnbNbFvtpdP2AdjS2sD9LW5nmVC1AAAgAElEQVTX/57w/U/aFX/uwZSjADZVKJoLMbg+bkOyKsSFLtODmnYbQ3XbTcGh0E72tSdlmVZNDBmJm6Yjb3jvhKEiaZkQ15Kg64L1rzTivA/jlePWGEx5Xej3tChe4YyGk+TBcUiS5+pmE9A+Cj6+eK5Ct16daHzwm1OIo+C1ERUVONYkTQOuGYNjG49Kak4IGW2w9XiRlxb4mi+uQoR1YZbjW2mKIh+KeFVwu9EW3cS6YhBWMgj21/38r1nFTMBnHjsYqPlzbkNNz5uu25I9X7mELkaatY8LhBh9EhE8PMGfXHGRmAoplwxEZvLytdcPDD4L6PCqIsgiyeyGXsqCwDRYFDr4xrTk5Yy8GGNsc9RhyRh3ETuuj9KsVnv5N5+c49/+bJn/l1+eD1YMjl2ciqJpyT5sgG1Euq/45P63i9dUEJ551sH+YMbv9bN3jZGcd8Cqw0ZJsvwlZF6sxLFRXJ6Tj0Jx9e/GsAqCYHUWvF9pzkkSqf//LLNIC62JkSUhBVg4H31oVpZwDiShmGpO20ZnSvIycvG0lKa43wEz63cGLpSiG4+XcTbqOyfXRm/qCbrXc8+ktfL1LMvMPKyGtAZ50Gjsll8ZaCCcKYPLRFrOj/gmdiJ95iUXT2YlTNO6iBtcleSxHI+jECP6uZOAQkINd2wpyMUewjYS0RiZOwi3D97VeuVIEqWlmTrYTVusShKUmI+bohzJWBcyK01ecWpQYGy6tqfx7fzJmgtLjNKP8mE7d9KRbx4nAFFIy7qXkIntXud1j70XL8/SSVdh26aKs5Bo2QbrdY2oddbUcp9k+aZkpor8OmcB4nrxKKCEpXGNblTV543bv498CDWUiQ1J2RFf4JUYxMmqOLrqXGX8prZyBBYw7avO/tIbzsmyHscdm5Dez2HmYJaHRsTFqCTsWt9ZpbXcifxfH+yEcznbWPQd1fgat6ay58SN3SDfjUu0n18uOYxYFEv2Ew/t0W8ZnFeU2ajixbRJS4OdM26W8HzojIzc8rln5kZl9X2MiK05HXnhFactS8gloTWVF5/7nra6TNyNxMyBj5bGq0ZNfG0teHJyjQ/w5FXPz9MZW1/gH3+t+YfaCW0U2jI5nju3A8k+YrBKZiTDERKLjXJKjPapdPvknI3YP3fzyZdV4wootJblB6znHgJNO2pefBe3zXaCpySfrso7h/HMyUrHxxvYJC8apT3iUVrzMmg2S4jk5IGNyk9Dseyao4ohI8dXxUdjjRdh8q40MyafxLPe6VCemJmsociQNDpeTbqR5RG3Ukjet6Gtu/xD1PBTUq9C6qihGcSsInU5v31XDvjP3/X8/kd+A+Tp8Xg4j2+Sb/jf4w++vr74X48n/8v/kP+KLTUaxyQL8b4siKUiTiAv6cQ/s+PfgR99fp34VcyvjZL/thseI4TaU3NTvM7XRsYlHk+SZn3oXHUkI6r1NZQj2I1EDiQLaA6sc0t2JL8JXAZg9179Ga5fOeCvHPBXDvj3vzQ8cK37TED7JTM5dov1tdmb6cVgG76r1JPuAdRwNpOHXcwCcx7rQbOVXq7a8kJDOjWsDMpjYbwcPJHlXOc4tyfkKD+5zIvL3yXGKke49N2nD6yUZLQHDR+T6pCw1rkHpN/OA+xVElb6vD/WFzUVxEoCLIEx66zOseUULeER3XS77QdC2o2SGG7/0AyofOxsL2RP1izAiRJD4C0HTOV+AI9r7hjeG/C68s43THdoZsQMIovBkn/R76fUXgC8BxT5wKae20d+ceW/1DMVcGXt5r2RMTitmtVZ+aJZ/U2ABdWzyb3v4z53uGWgb9DsS/nggIxBjjdWNxAPI+u8Pjwa+0SMByL12z5rfoorHY8HW3pxg33Gztss7wFGMyKwwdU1Dye8DRgyE/dB+qz174wCFLXFBgRRZ3HHKDBWgSosbwZuRPlEmnHNE8vkWmJ/jDEYjJLOS6gzOVf7+hhzze2j2o365VprGsQcTJNwltVglwys/Fu++2vn+t+pgQCTWYNmR3+rQTwJWFZLvdZW1yUjg2PXew0SfLH9aimfSjPJNlas3QNmE3PVzLaUWIbvuLWwPcCaZcnxiMlYd67Rw8DMVD/tI/r1cyJgmLrrLgm6GMWOh+HKGbUgFP/XEBijLUay7mulhiqXre1TPAo4pny5SAN+lQ8VeIhFnAGX15pak+P6xgE8Ap7rlhXu6+caL6lfLIZwHyZlMUPLdjaTVADYqCGrFzjBUL20Su6z7zbXj1KVMc6ClRVLPSnpX6kPtOJBM//G/NwyvWHnHgiDhitXTLY/5BX4KF/dTIaLVT5M52fYEJsTsUzdHa8aSjVzyUGb+uuZuQdu0Dlmv7kGLzqjfKYt15uFjNMAgJYBpwCyrVAWU3Hte/lJRXlQqrYUoIiCzmQmIw/lQCAGpJmUU76Sx3GU9HLnoXcPaQ9Wgn1GSm2i30v5yE4N3iOCK5KjwQz17qjhVXdnMvoMnbDgY31sjyb94VJc6cExFHBC52YiEN63YgteGYy8x0DTxNRutq7HY8twE2ygadh35RBhfK7f/9M1/qcDpmUnwRudrXyR4MLisxAkF2l/KMnx++e6YMg3A8gewFgW4js1tVwVzK0W5cBoc79MJ+zYU27d3N18k+Z7PYxOsAmyDjZQkSXaqx7uKCaNGlZCQEtyqH7HXIvCVUA1Hds3KsaEih/OCVtCP93Kx+NLaJRM6SPWZPeo5tMczsuW5OHikgFdZknQ3ZtF978ke2GmRCZELz56apprs73gW5ll3xNGaKRj/adX0d4guGVCcdTz7FlYmHNdl5T2bNUGOBkuipyh5/fKp6asM/H1TUoTqzTbEzbaPoJF8Kx36Fl6135to1Hp3hSDK1+kuczU6oAZ6RpeZvt4GMuHjN/RoZsli2J1yMq0+s9W+X/9pUTUN6Jla6n70DCxr5J06OaU+drJT24kWzUkShJh+1W9vX9CMiPDFjfiMmi2WQezIDcSIDKZnSdaaQ6PW56kji59l40GEGI2SC5LnksBYhxvFNpwFeGLjShqRNCq59JBsAPGqIafHl59zxB2KIwtfbFYUAf0mh9qIGSQee5CP3oIXNRkoRNjH+jWlH3TXujA21Jg70tpU2tt7eRlWX/OB8teu1naTS+r4qR7RlaHdLjOG6/miztcSXmrSX/fvJN1+YuNS+faMURpjwhWBY6I3/aA4KggKRpwDU8qaa4bQelHKpEdsBhsnWPBwiqJqSKQxavhQz/JJfTjpJWYtyRHvQQ1ghrBzZs3H7zmLbWQzah8G3RsoESqGZ6ZN8pwJ831M3X27cI5rk0Zlymp7Z/NTEjp92vdS3ZBBdidGPXKM18Exw8DLaEL1Wwgg6PMa203Ki8shIqMcW1UWCOeSQ1GlLwNxZQUEzgzuYaRm02iAi2ymEMlddIeGWPdz30EeL2N0eg2Xzteeq4tQ0glzMmNpD7L20dNbi+5Xf0eIFmKPnuujz0AOo9TsaXiEnBLlrjvfGbknTCNRp8zNjPkiAO7yoi69p77xRp9Rt/vsP2qFrdhfIwbVbxlieLOIcQ8OyW5VjF6XhMb74f3P/oqhOluct/frVHO78dAN1ku6ymRcoCxTGwJU0xYfq9zFeCjEukqbNz338a/9l9NS3xYdccdrZh3+Qu953N6i0jImDgkn7t12C3QIFKstYyLOefOg06Hky/GGBqmXQ/JWJb0wKSTdohcxYZEMiipW09fJS3Qew01oiNLBK0GRnbt5tsitwl2sxpXNeYTWBbypexn7UKkPqrL9e0cfHuqePntX9Wc+e3zf/D78cHIwUiIlF73X46TZzyJ6/8iBrzOF/+PQdobYMqd6zx3cZgUO9ycnLCKMXitHiA5k1Ccax+LHPv9uOnZ1sMA1CQ0utF0KqfrOsNso2zN1HyxfGecUnlUbMCX59R+a7AUDnnLxv0M168c8FcO+CsH/PtfVnL8G5RokputiA9wy51yDzreffA629pNOvQ+u6Z+jpNmaXau0O+yJehsqVmT/46ZS/2W7wI97qNwaYBiNhij1pC7+ht27b3+ThbsGKx/KUCUBWPekm5a874ZEo9w0j50wkYzQEJgmxSIigQ3Y9WwP8jKocT47yeotdYI+PsZpK/dd+vQHO+eqAWSygwpv+T9++7G822XCW+T2guRt/8y8hkd/Q76FRoaaJgkV1dLWjdgY+kNDxeX3WKRK3gV89LzPgNZxQKIkoqtv3V6N77vd9G5DGPunEj3XIzFliey4r0MyYWOHuD3IIXOhn+OKzCy64a3S3Kqlc8Seyi4CZaWGOptqWyoGNHg6b/py7znjtyDKVPd0DHQR8XE9FvqsmVHrdiBfb5a9dCMvUAcq95TSS6apF2j+nRp0all3YdykTCBJDLL89uV8XXPspfND4CQimVW7A1Itu9hTtIbbMauIwM4976uXI86q/dz6Z5dx11/q0MrPzar5j7bM0bP6JYx7zpyZAP7rMAoLSeb5BBh4Dqi/JTuAStZn2HOV0l/fyTlBXOn6d5TWIwIv0GcNZQLg5x1Sr8mllfVlbqvK+4e5ZG/MdbcPWH9/qX+qjss1RbKU3vY4n9DCv3HX6FY+/bFoobyVu/CM3dFmUg6X+NN23WSiBX2Js277tdT/QX2v6PPbTk7rxWUIIZaMOxJ6WZx5ddbrq34r7pekpjhYCk1sA0gMONlzWaSmgsu4kkCZyzF0rffBWC0m2yor179Ey/GrFVAcdfAlurzd761NETQR23rHaS8xeIsSxxSSiy4FFH2ek4rKbosKX/qGV33s0rVksfUjEAyzkWmsKzhqG0lMg/n4iU2s6dqTKCZ+9dWslEdc9UAbNgphmR+Vn3U51sPyXvocOE8aH/hsGLBNTM+mnlvP/YfCsBwcdzMzvo+DZJR7+lZ602D3Y/2vgr1Yoik2Wz/0fXnAyavOrySDE1YgaKgATIY659vlGLqIG26Wm+Q0/T7xkmWoaZz7QFCjNKRt1OTy4jS4NXG2mizhK31jwoasxvlrYl5NQfzIsenBixbcmhi61Vmg8lGPI+7KHNeMj8mN0WbernuNxogiK0t61x0XW2h1xJ+F8MlMsQZVxUT8FjfbmTTGqxGp9EmXkZW88p4kh2wOtr7uJNV+yqTrqR9oUY0et82RRvu+3yQWyZIz+7WI36MSaKD/goVjCvbtLcaLCs1gnRj5nkPFAPI5NOcc6hwUdFVjdRqBEUcWOlinj4ZJQh5TSWoMumKQiV3gXZLBJIKYtd1kW78ZiDFq2c9dv8BEfozXOlWdOp+b2ouSPpPz+JYYHzU2nkLwt3EZm45ol6X0t2t9/d2zx1UVo79J50vGh2zRrXP29wSeGRWIz02e+A9PkclaQBjM/hKQjFVDgclS/KGJjn4lO71EKIu67BXwTy3nKMx8eqw2Xje99FI9/wgXMHZiuK6h7DAcS2tNQBmJcdlThcVtL2ZjoOMpQSxkkQd1oWoMckZ6R7fE5p6FqbvNjB89RkBs/VN/KbFd92kJk1rol8wVbyMZork2oWHp8uHTS9Jzz2qwWQ6F09O0pSImRmvx+1hMZaafBl3kZNryisOMH/yvVUom2VKDzaEDIxLRdlyCvGYnPxsGZvXAKaDq9CXORA1ueKSVzHXZ+Sy2wsCZxdKnTAlg9FePi4JOd97GGY4r3HLbCmeqPGKGUd0Q0kF2ao4mPV9HkPrISKqYSvprKBAEMsJe1aifCAN5ARrdJ9rmJRFaa6kc3WH+rq2hr97wNlMiGJVxWCZgAOLwWHS180qSjwcshBzKJFz980QA/ioczuH8erBA/BRsc2Rqb3Fxy5KT5vMBqp2PqE3V/88MQc34bWUbN7G6H6BFUJ7Nw0zsWvi1aB8vVGntJeiDLthrEcxaO8mTc7vO4lbbozOM7TVuGxsBknCloux8mIQTuL1lqQ20GYRazHcmLvAdC5PnWFLDZ/0xWyt7Z/gaoNnGjn1VqxcegE1POs9U2xkRp/+gDPR8CZgF9OjmjSJMwu85Hmbf7+apZ1veVkP6qoQMHjTBq+mRlaTYxVTxh5Cj3Lv7WSxKv6NampHSFbRTQx5t38TeGWhRN6S0TLLKR3wYcY6grNkDPJVz4FgpJDQgUyMtcZUAHhomKxhVVVbCOH2VXOuPXQpoeiqKzf6vtP3sZx5CYT1EQef5yfXdfG4vmkdfv2O8+BjfBLL+FZsqZd9MY+Db/ZP/Kuf2JiM50k87j0F8DCv+1UNkBhxaUA3GHDpnjQUcKIYEo8qYl5eklOo+fHRjZwqdsZw3EYxZT7xpf2zjj5zF2edlYc5joqv1lyHJ+vqjByG17l4PfDQwNr/tNL5r79+5YC/csBfOeDf//pYB6ez2QIxWn6nBntALtsxfrT0sB+sYpmH5WbxgWK/UNTFhqshdje2ewCsM1BNHiuWAi5fJ7/65/pzb7AsUN9PwJ0EgV5RnHFXLrrnJxXfFBtLhsvZClCDwJbhbpzt/eg6I9ST+a0AHLC1cAhslZdL2M5xRjXfnuPc4NM0dtNJIASdV/tc8sXcOVUwltijvS93/pTq/2zpsLy9zeYexg2+291/Eu5EcmwRksM8rFHeOveJ5GyfNJbCE3BUvJyXy0ctgHXuga/eteE27qbvSCy0L9vsvj64csTYQ75Vfi8L332aj/VBM427NxP22nswlvPwQzKfNQD+YNIMuZ/iSoEDtooClbd5bA/A8MFcLfcZ+33tFDAn7aXVlggjD5Z9r6GJ7d5Qe84+84VVUzvLrzDj7gGlDZ2btRY2w6z6ecn4YQDYTNyOYs4B1vutmp11Juv+VPvpZ4tVm4F8zR0fB94y2XZt3/aj9nnkpYF37ffLXjoL6v4ucgOhE0mv63sHSRUc7fnCt83gSVJrFPaw7uXnzonHOtTgTrbaxssfG6Bh/qRzx1nsvMvWVkVKFnHmZhxPH1wYUl52euyluK1gmZy7D/llLx71DDfzImP/zQwBwHR+UnVn8hG+zxAvNmVLig031mo/SYOhsfIRAjk9DwQuYTH8aMtPTjvANDSzt1rwp7gs6qxrZZOq62npv477Wq8vbwa2ehdkARQ50DCqGDwuVo/e5auGm5XX9DlZvXQBdL7Tw1kfql1a9i382P7OljonDxs3iCaUQ4Ft5qGZQHudL2YKuNoym51X6LvErT7RZ6I5uVa1a8YeJnb+6PEHwy6d20bJszcbrK9+FlMevFPS3n0PTXYZ5lLOyvqe1Svv/rpqTX3iCNW502pugFTPMpNrXZglw/6iPkzFissOsibej1xb2S0rZnJdxBAIaUTsAZlZW+FcQPtGDXwXMgLUOZf84arHdXLoPXIVw+viwYDOgeoZLe97uzjruWpg2XkFDIMrT67Ktw+Di/9Wf38I9OQv/gZ58Hb9admVforME0p+2qfhGrDme9O+KG+dwNkSyjjh4CFDaEoKBZTo5K0BvKrRN6ONXB/EqgC+D30Y+aVgco9UNU30QrKWHqjimhL8FXN7H3WxMOPSE17w8Fk62Qbx2pPApl76sp0MeE8Hw/EaYHmwUYCNEpjXyTn7OxurN1poXLwMFeqZPMdTJl+NxMiHwtGmEjn41z54VRDanQBhQrRncg75IZHJR6PU/HWjFD029bEqTpYZd2muZO19aTxSBmbuJYHoAEHMltx4kVX3PHPwuUzJbHNzQ3IywyYRF9NbR3ZyHAfnMjy/7eK5qblbu92m0J4B53jhRQ1ezWoKJWNmRqwnNkoKpZ6//C3+BirzD708S5u5XmkU9VrT7j4AnB++tRnnG4rT3YoFBvDY+2JU8me2dnKVVnKElcwocKhQ0h5r0+hb3snSsDCmTVb5QwRt5q3CdrWWdR1K2pdFb+bcvhkrDyi93DZEffcja2qucUtrHjFpBkZWk2GQNaEHuLBlDIbkWCIwP/eBlj5oTKkcNCqgNasRpynnaUoghURSMSH+RyVkEW9NvaL65ty1mUfw8GMXHbqnBPtOszxH+URY65e7dGbNrN6T3sVXSVvgoklnBB5zNzc2VZlQgu2ugUrOSrqLfr/uYPXyKq8jmKsGz9z60ZmGVfW3dbA3UqKe/BGccXXnk3TbBcXPci1XU+vI9+9OPb/uz+od9AABCqVVP3+NLw5+RDqPi10EW6rZrmRHScwPKN7QH1KCLOmuc7jkEDK5zDTqjx+TIU+IFSRrn1d7eBIBs6V+LsiWpG1G8cAvoVhyOORTCVNNb3LFNjYfBkexiqygqstzJ4yZF4cPYg8OSjIFxfMInT1mzqXorWcw78TkLsQvSlHrlo3jxCteTTOyzbh3M7TXpAotNUtN1G3UnNgxygCetdekrdqwDCVLaoCvtbYf1bLBNqxPsUgyk2x9c5+ogA5ivpi1VrKl4UiBRqBkEPWOOga+/Dudfh558dEGnpW0j/G8J5eA2SdukjsSKvLxH0nY/8OuLlCz0GfYLXNySwHmrU8fdwLc0sQZd6Hf5/vIc3s3WMbNyK4TPDJvVplpuKOf1QddxJ51xfUU08jsZsTl3HrTXPLQUPOifs4uSQakIDQ+H5wRjPKsOFKDChLCX4W+S2aKyTENon1CV+AmyYIGNrFmFSuNcjedx2tUu+HQPkzAYiOeLxxvtLtFNbpdpuV1zbdCvIfWRxVh8/k7869C0H28fsfdmX6Qrw/SPxgfA4shmeHjDzjgn89/5f/1P4jX4mGTs+WPKp6JKajzaVnyFa7n2eF/Xhvdn89Ba8Azamhk7IKXnJttYs0CsJdikSNPGPVqNzvg6iZGJiuffPOj1uIlbfLrZqnnMDhLQuoS+9RtbhDbz3L9ygF/5YC/csC///XyiaVvGcgov5jTYw8DGc6oIfjp7RWRmB2KOwxeGfIHbP+HGJLIAdXwV4FhixlHOH2I51r3EK8mSKtZFwiEkVWHtyqK11oYLgZ1hpDd7VWCtRSeAJcWVt4WiisWL7w+x0JnXqwgKj8ZF1hLybsV4yLJUjzZqiAJxrHzrmbrk65hLsA47/vKqX6K7nYP28LU+J9r7GHJ5j1Z8JrdH2APIR6o0RlLA4tmJI5mBddg90zwfDHdyc6FDTbwChhlNbBcwwD9c+XA/qn7iUBj3x58i+G84pYA1JpSu2TGsQfYXnmv1zpJ1DTUWRJc9d9HXDyG4y5mQmTwsnMzI92m/GR8youxHobHLU34j75OezLT1SgFiBrax+3DZJEld8YGgIHJZ5Kx/c2A3TBezh62AFuBoIfCtoLlUr5RPgmYE8WA1UqrfeZLFhuYGu5GseT0ncW+0/poSwk7YoMZBKKSZO+VyrvWAt9DGeOqGLoB1QiAJdWj2Oz9MyXbvS67Gcr6kpKTM8Whg0GmcsxzvnYNdqTiS9deZMJYjJILFHNLz5BRce8LzAWOajUA1WV1JsXZolBMl0SjYk2xUvJijfKDi4M1Ndh+nJ96j+Z8lgpF+ItmceVRZ1Ke2ydm2sFh8obpkBlvdV3UECPJYsvn9jfbdR8NWtLf+QxJI7dceQ91w8Bm9zobkJV8pHLPY2hNWF5bZeNnucIaKK/3TejfeggEYBZ7X3XCfbL2P1s6s3obLXua8eJC5w8mcBAIxHArOGhdnvbcfnbRKgSUMkgmD0ygg9TgSx+UJQDR0vHqJ3vFNMW++1kPpT17QLSWMbzO5/lFy7usVdLYKzZYwmArp+34XcpinbeGP2oYdZ8lPcSWCZN6AMudRPGuj7LkycxZ7fC8nyt3Ptw+kxZzqyJE5dCZTwZRNgYuqXOgAbGWL6TEAJm+66C2E7q4FEPcYSrXM4ODzl+Ul5ICdMUlr99VwJI1n9hqNbl1Kw7wJbCRUT6mPf+oGErVVPXuOh9sNlXXGGFsZbjL5n6rkS+BKSy2p+p/dP3pgMkRfXnUQCKLojmWJn5mRsw7wRx1Ixcfm+Hi3IfsNn0234t6rg/cSn8+yoJ4OKNRKbkkS8TbIcXd5NCkr4Y99XDPkKxeROAj/sbb7STwIW3Wp4mQmNk6rw55KQGLhDxu5NlR9Ddp1ak54U/RqM2w0v6eBoPzHla1dnJ5CjgDEMX2HF+8Ru7hkm8kdN2f67nqFawtX9KXVZIDlIeVprpbpsf0FwGhHVonuj7/9Iuw5y4kvl7l0ZQdLISylvakk43YeJa5YH6ouVaJ+bMHY48XjbDqaWl48PRvNTkdQrrPhBS6fdmxE6xZer2PNVmmQ0HyUs96lu/TcB1e7n/hrPvq+4l6Hj/TNQuJ0ajeTnzMNeWG2itQCW3JS61Za0c6uEc9oyjzv8hTIJytTd+Nilpf1XAFoSbWPiS1P19r8qjNcjJZsxup6vh0Aa7vlygw1rDTjMHJZ3olgeCVcLcR9ACueRde19Z6mNgcJIaPWl/x4irvs4FteZ5+lbmifHFgxIGT5Dr2viFaOklFiodYjH1YrvwOhZ4ydPgDnOOoYDt3PJWH2X3GaF1WgZ/J13Qeq1BTh5on8429gK9bn/xNXqYL+sEfWg8RzMP28xmaHegsXbd8WaO14hicS3rLvR/609MNK9+JEQhBnGWcbQZDg2ENJZaM6DNvmGElzL0+ntd3hhnDVfhEJJ/28xRBQCU4RpbP3F4s9tpa+5ElvWNCser3vhMlSzasmgWZtOZ3zudOniwcs0ehh6nF47uASr920dNo85lKUzAV8pFv+wY18gjjGI891NkfQDWHqtBIf9WkzARMAA1RjpNBaVrXl7GNCJVvHVTTdjbqsBp9AWaniir7lJ4/YEvn8WBwVsI2SV41ZEg3osAl7V/omYWQA1awvIyp2/chP3i16fObgWjH7rHv3/hYgw33ptatvUjuZk161H6YKnAKxNEJr9ivuSUK/YotQ8L8LpPQTGZnZgQnX0UFgy//az2jv+jsy0kWMyYt8fZiGHVWo2JbDXHjY1PlJdtwrf+2BxtfLsSdm8E4JYsTr23y/jNcZkIZ93u6qknp6dio/e/x5gvyqrXxlnS9Scbc2rxBpp6DA1cVwlb5hQOPzXRzej5wtZ48F8gAACAASURBVH9CSzdFEGMyfFQztYoYO1UEZ/DhXvI/703TAxtOFAqszU3PZkpwvgGSxpYZeLrK3xex/3eP3/e5ftSemzOweKkZ76uaJHeRlXzx7N/BifbqSscKhXYfYLnRoWl/BVfRlyE/q2P9M78//zsRwV/+91/4/atkaa6DMQY5JW90xuJx/kacroZp7cmPxz8Rz//JuozjmLup2dLQmbrvNA0VYsjn6p6TvjbKj8cDu7p4vfDp2JW7OWt5Ykhm8Pm4807bTcg2Zy51A7OtER5RPip1frg9oAZTl3cRZZu585jdkLmkJf8TXb9ywF854K8c8O9/xfjCE84KOM828LZgDdX5v10H5/FH/YaGA6/rIgrE83EqXzDkW9zAmb2uCHz7SF5E6nxtYJAaNXpuV+27K4NpAhad9h3PTw35rdk/5waomgWxtN7HaElE/V1zNbcmARn3YD/VrF2pFOiowe/kcXuflQ/kaX/VUDKDPeGuuO3ukItXB9xYmBtuyaOavS8vhgXadz2E2iCQuJuRA8mrqRlYwJ+xWPVeYoD3kLLkDPcKNmPkX5iXnv3ZLOAhc3iAMWLHUStQ6zpfGE/mnJgHUUPkjmt2XHpOERDGZaVKk81WX0TlrZL01PB+mfboctd5MvVc1aszHvadJHmG4h7A9TgZZ+XTOMPgL2kbpBS2OFsSuXLsK07e895/9DW8WNS1B3o4eXoDwAS26rx6gwICWuLVmFgPpqjG8Zl3P4rHDYQuhMkxFrMHme73uW3GIiT3ZA1YLtb/2/GVdhFdl9hFxEt+3aHm9sykmb9WzdgI+V0CHD7xlsXjyVFnfVP5LMRE67ntLeWruDiOF+Ns+cMHxkfFLylUnLG22oHHhVPPN7jlHOWwAnYRLjZzRJR7ZfdiDfcPlokNvsx4RuXh0eD4lHSxGZ5Vk9kNnl82cPsGCZ4PpvromxnMe0/SjCw/F3smE0pe2kvOfPK9fmcPIDPxvOSdCFB+T1G1ZsZgXq26dOBo2HVNWbRckZgfil+8yX8WS/4jnKefe+j4/bNzxM/KkaW+8TNdMxeeznEee6ik8+W1wa2XH3hTMLOHHjp3zYzJotGNDd6//KgcWTHi9uPR0G+wNpvpL1nvKJM8SuIzLp7e39GIVm+pz0k7SD9ZK8QOymYYFdjUEitZOMsHY3TtIj+vZWsDS1m+gYZHgQRn2m13k4uYz4qbxVw3J+xbDTYVE3NLPNZQpAgcMwd2XUxQ/Kr9k9Hr2W8WpF+7tvijJiOBsyezWfEO9XkSAQFWWe9kXvIGy+Taz+qkJZuHjZKONeh6OUMykKC6r86Wc1UN8/jA1+A8TwExbZLXKo824/J/hlYCeZO6a++46U8xNYFzOEGretx1uOKmae5RPoRbxcDHBtkopVI+flE5aNq+1/9wjf+n/wv3dPXf/5imWrH/aBeJyz5qAqn/1NQNPMpUvIKUhgf90oyvRtltCqVtU2A3x7oIab3uxUaypkd5Or1NTK0aVZUg3NS5nuZHNQET41kNNmN5SQfFYKWqjpf5RtC0fqE2rBBHkU7OQgHVhHjUJklznnbtRmJrymvYUgWhTSzkMWD54rhkOOl+aOqatje2NkNLDpVhG9B60NkwapBvRiaZawfhRxprm5p3AItqXhiWcC1lTFaDw9cyWrKDYURLVriS3g+OrQm9LOjeaKNUzqEDZYUmyJu6WT84oGj+9f23/IXQD25aRGbGsC65S6KmgmQXaZaL3EVcyaTk9YNm8891ve8hWOPcjRpP37I6tp+V7abWB1kG0DcK6MjY+r5psZGojQ4BdnNAWvW9nlWEHlNo6GYEuHUjtff46y3huNRoB6KKE3Juamhr0uj71ZrLYOTttTFrSn61PMvbZX4y1y17kgHmN6NjzWtT4a9CFEU117UvgvmGjopivnVTncv3/TvBDPlWXBW4yQNrDwhf2+eLan6bDaIa+U5wVkFx94blQ9Gf1c3CzQqxlpTMTVcedjdYc933eixjTtF2MwfDh/5zifa7bG00cKOfBwe3j103OwCTpu5pDnHqFMzY76IvX04j0RPHRzMx9EzcjOsnm9xKFdi59tl6s2I2pu4tVrQmfBAb5THygbk8fLL0gUdeHNEol9hI4rM/NH3LLlxmO6HbmvK5tjxE+LmTR/YAyLeky7KL1r+2oQasZ+578XAxj5L9N8NG+Rga8CK8fG0K2PAYxwZRCB9fRWEVZTmcaLmwCOzqZ9SoM7Z/xOmx4/HEeLYETd5xaTQbKSX5Ydg2Bj99kXEj8W52dRXXeZQfYskfeMtp6HsMy2oJ6X6vJYRk2qS7LRv1VwyoWAvKN2kS97BpzX3fURJOERfDPuUvuE4R0szKWLbia9xnklvL457KERI6CDu2z41GpAGl629U628/q/7PZT/Xvlo5iEZyLw00w+aOVeFCl0bklkfRvKhyNNtCWVByNyNf3DIg7EK3myyZp5oOCEW6G2mVP6xuZo3BsYTafA8ijga3iRN+MUq6r/pBeEY1rSX3sMZFWJYHGiSxdbyd4LWBPUJ2RvjOK2L4znv6e3pULA2BczbbajcEjRlt6rvEnDOkCPzuqwHM+OQYr/IY+tw3sSXmeCgHiJIjepUoS6oAY0yGLeLri/XtgHXgc4iJ787XC/z84JHJH/x1o+s6f4gI3Iq1aMa4xHIZWxL7IGvQMd4kuECDeOKWUXD7Q94XEXxUsbbepSTHH5KHymRaDdpyQD5YsYDrZkgW0tjyRk2P9LtcuXp9vn7cfz/V9SsHhF854K8c8O91lVdKPQuVscaatxxvjvXmCaLLPfA2uR/GXDebhL0f90/vHG8VFml5sOwqKSHFHTVzy9PBS7pxUOhP1crZnsSXsapRJFaMcoSetUTezIrjrZ6dxfxd8zYYT+CkZW2Edr9yEBVPl794WpB+Oz4/YnCYBiXLF7a6madPTKya5Inn9x3vwoMjxMyZVadbqZX0s9Qey12zv7KHEPr72UM474xIjSsz43HpeQropGd9GrunsvzaMpqtxLLswScDDzHZor1MWz2lGoo+YKXhLCxtrw+BZxSjIjRo7IWQu2c0btZXf5fUWvvNPokCEUXa/t8bEDZNMqCZScwkG4BcufTDDl75MwEi7gZiJuVnpJizmRbsucse6oSdUDHc4gas9NBpmHJ8Mjnt2mzRsbp+OvYAgcwNWupYn9iWZrWYxBhvw1hwPzWgqfP6SrHMvftpObYUZjAZvrCqGcwMW5BurLe1ixWLxkzxsVSXFn4rG4QA83McHH5V3jY4LfYZGmg47CnZPAvVNv3ls3pkS9NLzCQXK9C9VS9VMtyZOlJG1R/L7rXWnuaWU+s+YXLcvjLVO7zKT7ffd8fV+jYcYRukSU7snHiOuz5jEUvH2+lw+R0LVevJAVAFVXBUjdYAxVNNXd2+jWq6i6GpPuZFw+aPNWqokBtEmX6RLnWBtIurGJART5LkNQ8ifrIc0IJgbo+5R8Xf5a6hPeppNnM6do43tqT8qJ6EfqAH1frcpAAr2eCc8uEh35h5i7YbeRVT6Mm1CQarWDf6hqoXVhySkbXJmifrWpLAi2LhpljmXv5mNwgpNWxaA6vv1L10ff7CrNyfql4IoH2qsoCtgwdR8fWIAa125s3cPzTEouvG6u1A/a7+rwFYnQ8ujzfAU4MHH9iWrL/rlO1QE7kBW+HGE7AC3ymWD/INhNVzDQ2A4OEHYWK+yxOuQBKVtp61Bq4RHMvlA5hJbO/Ekqu1AqE1aDh7340to3lYsErxJaoIUN0g8OURD7AXh/kGGQ/LN4swyegCFeMD8vxT8N6fD5hCza+10cltIvauue8b5dPTvZU6IPVQZTBOJllMlDR41Jc+PTba5uV/1N+dO7kzYqOazR516KoIapmhMaMGV9U4HLfh2bLYXhS39ipMv81zl88fiyByf/8PHm8Pu5qE9VMAR8SNmPCnaJx24ClzQndN+4R8qANuSYPf3fk8n7tZkjE5zGsqrOmzZ/I1WjJl8qhCdJYvVTcjFAz8/i4lZzgY22g60xXEgKsNmO2Tka9qrt3Btxf6CCfiUY2Wqxoghj8KcXuxUcnDBld5caxtnPaJrRcjJyMm4bdXxX3psHiE7QZSU9A70dS7GozaIFYJeKyP/SkaxNWUP0pPWhns36ztf+TVRsq3xJAUrfMd8SjBA/3jD43yNkc9CinXybp+Lt3LKDYkLQNqnlv9nWgUC1s+Zda0W+vz2o10j7kbCZWj3Xt5XAxbez9kqqm2D2ZupGdTvz0eCpruDBbPSyxCKyS7kPHaF+YPMPkFbI1uL2mxgQ7rJVmV8HrX6hxWYPGt9X1hNDrvLCmqnPJgk7fXN60z1KARCmqRuRQkw/eJ34F5Td8GvvmWgN/DbN/Jn15CSUM1oihDBZHJ0PNl3yVnFN/0TnKIiRnBI29TxmYKtClzslgm9W6h+95Qss0QsOstoFQDeL1T99mD6/iPQoK9MHQGPL19CJL3wuNnuPpdKJUytla42Zvprgp1b1OW/t2SDoraJ6BmnmGkiaGSiYrK/YtdsK8dZC+7m0etKS7j89bEFUyAZBtSG1Ya/0C9hx/QYnnu5ob+e/1L68yPUPKm4mpBoeHWTsgOJRmZVejVs2i2Rfw7b43RCPdK8lKmnEKArhvh1zIFEVxVKMx84KFGgYYOBTRoydIEqzU84s1UMvpZDrLQo8J4dKLXWuLOZ+3FVUh5Pa976KfiCNb2ymAPkj5cBrNKvm622TLlLcuGgCaGvBovr2ZcNZwsOTa/XgPDzNxMgqfZTsjSgnhr0AJqFFu/1zsu7UFbstl0P8dVu+mNBq/4MRlxI+rS5EUQ+9/v+BVWOVXmHjC1y2ujyKLW/Gbw1dAUalC0c4BqQgS0sTNLQ0MV+sVw+mG/fOx8kEJL+7YHyN24IquRRg1fq/lA3gOwDY4ZbORZmtaIzs9i7/jA8yDS6574YV97JvioZqDt4s2i46/xqHw6HGI96kvevjX9fOdSAU9Kaq/li0pQmwgV3O7gcW503/U05hxcXPxxnpxVMPzgIk83DamntXCCXIs4OiaeO6/zDF5+y1kCuD/41gNhu0jkpXF6I4ZV+oEYcu3Hk+gdPHAyBqT83YrgcSNSU81FDYLv797NX6po/ZmuXzngrxzwVw749790Tt9Nqz635rrPXw8n+bGRpN/VCGFmFCHvRu1DN8vgsnU3Y0uuNBJIZ9hgkFwp2f2WZl45GdyMyiMfWEg9RbmOqXmTyPux/upRflxPt81aCPzNTxow5arLKDlg3/nG5VJS4fjYeS1vnom7iTwmZ91zXusGF3j3Dno6Bn7+9tYTcj1zN67de5BUc6PRs9j7o+MghteUYmm6Wf/fz3piFDgjs/Kx+wyBS9L/6HxZFScbvPphvynnAzXcVmV5tdfhBfmpM8BHfSc9WTODh7PCdiOy2QIDoc+NwdUM7TdZpkdJmC1OwibuRlxjq6rstZiLNe+e2trN4o99VnSM+xmurj3ad+uHWLoBwWyJwPYNStOAXczjWheZQuknRCie77rtTTJVdZHvQUvYawMHNutp2c4Rfa4Nfia7hyS5Va0hL294WEHtEfmI6FKscyDc93002MYiNSyFHXMz1wZ7nLWu9f6D4YPJxZUfyKtkagC3btAcCGiemYz1YG4px2v7Ba5RfpWrJbqNjxrsmLEHmUtBUnXkNRhZvmfZdfGLVT66y87tTbsZvtciVzLnpNzEKl/QATZtcd1JIDkEKBtDA7eFb6zcYUiete8yUx7GG6Dhd9Od8iO2YBVw79wAq9gMtm7i9yDBl2JkFvP9tCD9q1qRLnAV8Nq/t1g/0Z4CIB8Vc3SGfB9VH1iftwhM2nJv3dt8T2WTv7kvPbsP1fsk+EmQivvcbQ/VS7P6yMaWPax45jXo2i/WJGsIx/aNMrdiKIXAJgZUfQiQU/G432d7G93KUm/5brpY7em3IgKq48NgVI78xYmXX+AYH1gBHPpjLgZXA0dt7WHVVX8t+8yphDbKmzDmuQkYo4dKOd/UVWIrufjbXo03VbGISySTyhd0nlTeBaydgwBY9fKrdxEfxPGsPo6Y4a+aPTAnB3PLIFLnQvi1GbzpYmyp799go2R0PmqXgI8kR7E45Sfe9WQi9QwrJQngii2NW5yb+rs9LB9SgflPrj8dMK0R1SzpRkFpRudtlBfmpNuuxfWLbCSrXuh3zA1LDYgsr00nlaRQoatbBmQs2ixajYbeWKMKHKn5CsUljd4fkAuZrGoIXu57AtyBRaiWbl44ttRQepU0AkuSMIYxPDfyq7XgR7g0XYHDDrIQfSOFor1GYo2OL9N2MwrtBjkMi4PAGHbwW3RgWmQaayWjJHeebpsmG/bStNPsB3PVptZnDN7GjXVdbOVEM67Zwb+nxuB8sJLywOpn2JXnVDRJ6c3ezbVqqHhu3cllzlkokg5OIzVU0tkTelYAO2krRGMdTsIxVnA3BOl1q3XnjNTGMyRhaOFvAfu+2l/EM5k/mf7+lkXpUaW1vJAx2zRz7DC/m6ATNpNBz1YSOY0iWr42G2x5cO18q4ehwBIyIubYOr62shJvFZdmVIJeSfx1KDD5bTZuHIU8U1NBCDEVtH2lfUgbfydLFz6CMCOuic9XBaMy5DMFyysXB3OzJM+hwkn7PvYzCVxNOpcUZb6t/cOdq3wD5nXwsqf2iV9ELq518ZgHYcbpsZ/7KnSVx6V1GQqKja56tmSM3+8hbO1Co5H61klwJbXH1ilvVO9itGRoCA3i6btp+kxnhpD50puu/ZhLB5tdQmY7POKS3GQNGMyMWA+aaXLgHM1QmWJGWhW/mUmOF2a/AcnoxCEhe32YsVLNvg68V5y7+PxZruAkfO7kctWzd25p0bSFTp3FGgI0+PlZpslw8P0uxBvl4kqgQIVKS+VEASY0QKokZrzIXfDeyVQEAmIc8k3opg9WWM56Vxa+fSv02ZKZtV0QGFfFySNaOvb2rUiPNx8YY4ypMrnO5ICNxN4gN4td3Lyjc6NZH6YBiZqSJ46GBGqGP3AbHFlnQTUuleQYs2LT2uzfNlw1Im8wSftYhV2SxTVTs7KSwchiNaSxfdOjnoixG3wjnaerefFYwdXoqEKEXtOY22vxk07aG8RyjTYT1j3HaH3ipaZtPDhLTs9XMrI9oALM+Lhg7/ERrLwTdv2dwUyhRNKvnbw2uhi78PXzyA4JY2y015R5e2adbzIVvn86TXIBK5TimhnB4iz54JFq4i1Xkp1Vzs5KtsOGcp2S1hVSPktbOm80nSeUdPA1KbNt29NTsf66IXfW+4Go4fLLhUrFtGZ7+XsDZtFeSlAjol5UhiZT/97XtBP/Vzdh7KrkHTEr1wKMa5YcD85pN0qsL3PHzmJaHJULLGeNbvBPPJ5giudCzJ/40tDHrrXP6Fe8cDeGHxwIJfd8wuMDfBjBi9f54rTFcOdKFSQtJeTWsSoIr0YHL5bV/m0/rpBxtbtjJq8TsS703x15cpTsmbtt01jLA2xwjtz57Dkg46F8r86c60qBsIYBD6xQzasbnhzM1J5db9KM3bxhXZjfReDPcP3KAX/lgL9ywP8/rqB2CXCDSrVHYANXWzKy1vew3PliWGLtiVQDoLD1Jr9umwXd12Fs36ArYZWE3lhq9IZHNVazgAQFnKSHmZ/KVQxGXnjVz69SflU/qtfVuRuQYsPDZcolbFL7sxrf0b7Jq2TC1JQ6qvG+vSTM6cFy5tr5ppffzcXtYZJjYjWgC9jDnvZdtkgoX4vLU/fIPXhV36D+2cS2SCBDz2bErP5LgStKPrT3tnneco45OZoZ1NLYvHaDbWUwCsgwcQhw+yYYWlwbFd/PegznI/Sd2+NMFi+5DdZzJbNl/8br9io0gYptQdqJmWMj8KvXlYYEJ77z1aRyYJO8aESwHB78bU/jH3W1+kCzaO/x+bWHFvoJ3T8pAILzPuh8lmxx3gxX0zM1U37eYOLfdhc1eLnySXmqFTBv+2naPuuML5bP/c2sGBtWPrjV3gXkQQRJ5Ll7hjkS6/O/ZLchODYj3/cApD3l373Lt9pkgiHWQNrHm6/NHbe3RyXJKGDH8uDZEp5x13gbFJEguW/jlWsD2vCLjKjhmdjtHoMsmfLOaxM28OLli1cDQ/IUgGJI9jE8mSSzhqXz7W33Og97UrBIDc1NzJfu6Xo4j5YurzXz4B6kLianNxmh7jMctwuvQfqq4fJZHlEbVGVGxrWb3r7rt/t9hAVr3Z9r+oddA/40V4OL2v83Chib3LYsqSHoDShB+6EYdafHG7u8653HHvTAxdoePPr9j7h9B7FgFUP0siQdfA0YNYghiXxWvf/AgJGvqkckQ99OoTPuvkmf77YGZ2EzXnMU6+VJjskiOOKWu182JTc7jbPAt3OdAg4ELD/Uv19nsX2Mi3XLCHvLzcbOh9PEaMu32J7U/MIUf87RbONDDHjYCmlHBu0h6Amf8SYPCoopdYgsC7Eoze6Zxbp2rrDs4rou5pgcNQC2HBDdL1j77GySsvu6B/wzuMoCQLm2yCuj3+eCMWbV399r4CR1Ce2hAzNJ485sWdjEunYbL4hLZ3exfgXXLvAvi/NISSNqNlfKNv+uGH67/pzBtESf2rIewjiBJS+TnEBEcGRJ4tWLyLnuxA5nm9LWBHLZvAdMGPBXFZMlGkM4o43IuSUbljcie+7NZuZcLdlQlwqKGqQMJ7MWcSVal+UPho1Wn9toIXjA1ZJCMuzLbDqqaKuzE0w7MJtkBmeKnvYo0qGosZOxtYNHNQTYU+kjAjusDDmNKPTZ90BJor2EtjIlVlbo092ADKVCZg6zA6M2iHtRCAvxlnkyGzlUb95icXYhP0sn127E/7Innt9rsRy0j5aXCegrvnj1bpgQV2x0iAFxnvuzxjhk4OZiaa1tECtk07Em8aF7eHZj0I2jpWBy7GQsS0vy5cn1RtE7mp4d92F8zZ9rwGTrkxxfQi5ncmQbpN/eWKACFZC+sRkzpGJ/owG+ePtxhOyqf8zZgBslWVlN4qMaZfkoXxc14xSEXzshGfmAon+76/3XSFXfKdh6pqyLwyfzGvcwk+CKg+u6sI+a2l/toZWs2t9qRDcSXtrU6glZFbwwroFnMubiam+wkPyjir9eK99lEm5lDjs+1PQ7ThYp81ZkrHr4pwK6qXl/HYX0a+ZeTkkzZUpeo9iT21yydOvVaLkR6mNTFY7tC+FhOK8ffn+RFZhT5oAh+n5LZuQobxbEiqFQAqsaU6/4Iu2v1YANZiF6vJoAzm+bzpp24VNaxCsX+OBEyHdzI/knzh7w1vv/XIM1Wz/+4KjPNztopPrprWP/k1z5WQmnztujm/bcyaW0h6vQaMSbf980cW2J9v+rxCyH1iUqjLfheO3Lsa69bz5D71TxptgrMYVIHJBx3gjnRo6E3eabY+Dx2kmLvr32sL4Ttzn6GwNmubRzbSWPIXRKjEflkLllJWb6NsB0N9ZafFkokYJCxt6Fmprhr30WWQ0RItVwyxC4xFP30M0EM6GyO/ltSj9L8dzchcgp/eQjCsE+ml1Uf1/jNWKo4Hnlk0fcbKXL24+xtc595wbnvPDn4HDfXgeRDjlwEyPZz2+VuyhHeHByrrMYbsGL71XUrhqMfDHid92LOavWTEsEmg+WdSHVGuR3PJ2+NioyXKhCXa9+PFUQ/xxXWD/PGmZWnjUs35BzLikB4KOHnnMpXwrJeB3xlzqrrv282zSZGmLpPbpywaxYkmocrc47oIodLykJxYLQNGs3i85YuHVcdebU+T1NspcUU0RxSfEU4OUtIzE0AEFN6/a98WKGp6kRpIJJWtV3PgN+PSoHti1nAJBxEGl4LhmgAxwJ0Qyvm11/pHKhqwbc5kYEvCouHKmc4ViTzwuezwvW9y2PlPkbLLi+G68VzDk5/ODf/uXk+78F5+9/MOfk+nbynC++rqdyqYpbWU2IJ8FR8ifH5VxHGcUWm2SNT74tnTW/f//Gt0vP7f+45DPyz/PBdBVX3z/+jf8Z/zeZyb/md8yM7xasamh8pimPjOQs6em1DrwGzcea+58DrZ/zIc36iOC4vt1SVuWhh9suCH+W61cO+CsH/JUD/v2vHk54sRh6r6QFdlVeZ4P3NjlQQ7pWGvnaoMQodqrM1ONeaw1YajCS67yPJX9n559qXeuKN6Au+GZJNwue9M2KGmHgAntmwIpgPBaLexjSDeiWgDyQJ2CEGo6NWQj3ai5dGEMMhZeTs83G9XMWAmGI1bMYqWbeKKb/4JNmhqwzOXvA4uzBa5aXtIY71b/xW7rR8m6s9xnhobPH3TlDLIdF53+wRm65r+Z15TU5a/CWaYR1A+yFWUvsCQR1BBxo3zZp7RpDjUZTTHOT/OOISyCF8n3LtBoMUMzHGtoxuUySnM4XZ1k/dD1wuSSpV6ipe5YnW99/2uTRU4r83My5yy4YVA/m54lXKzVg8UL6Z+e6GQxeyqfs3ZMRwFhj0RKdr3CwG7CmHtAiC1Jc5RGkgN6g59+9rh/BA8oRfTjzGsV0O7a9p2fCWqQfXEb5dd1N52ZgjfjG5c9q5IeASIDFFGjdYw8trnnLsW3Cwgqy9pwBR3vfFgBhDTWEtV8v5lFfsJn/BmYfJFnfcTCG82XRrhdb2eKR8JAUAFomxRCc/w0Mnq8nNjWMenJx9jCn1Y888FJbIAx3AePmkoyxYuCnmEwZ8oE19RcVM4zlt5xeLhiPwcwTUnE4U03pufSsB463r9hhnJUjezi2QVUFsmqvzlxcdmyGoOfATEzhcXXunUT7/XjVl+ZQzN/PpTMpIhiumHdFcPx7VMBPcFkNUkGlq2gSty2Mp0A0AgG0NPSq55eboY7dpADL82au5aI9GzXMNV5v+dKIJOe8a1hSAAJvhuuxfeaOkmg9+eCo8+u45GloZvx2UfEFmF88Hg/WuPg6dX//cqk388c0rmbg2iESAew+evzTogAAIABJREFU+VqLYygX/I1BpM5aKbk4lAdkpu5/hTxhf6uCNFCGudYiHgPlqynWU/dcegD2cGwdRVaodYTyCP3nidf8IMZFTNUxWdL4soLRO7hqLCEAcueAg1Fr/JlBfJQcqH1nrcXwf+LIf6ue9uDodGKzgh57/vIasFI111HgyyNvFicWnOUlPPyjmIUXl9WAkA8+rRUJKnf2BQXvE+tWH7VQLHqW5DBADMeWANFPPwWeNK2R/+z60wFTMG/WMm9N+0zO4rBZLFahE/e0+81wS4tHDYT0t2TvXWe+mizbUJRgS2b4uVFWPZXN8UMko9uC+99SOrHZi6oi15b148kqvd9kMAup2Sh2FVUqHER978FXNYEIUeCgVEiqQVEb/MqT5CJMRX3mN2LJu6PPg15IUf4dbhMbvDUpOor51lfXc1VB0s3J8CpYkP9BT6k/e6EilpcBL+NdprPu2W5kHLH179M6idh5GR4vHqnir+nMhvNHJWBCMCmgfLuqiDLbAT2uF+mP3TYkNeG2Kq7jIWqwpRJmfUENLtVUir0GInUoWiTHHjaKpq/msv7m6WxJi5/qSmd2g8TqtkRYVuKQt5SGfp4ftMX1Tntj3w2sW0bgbirraiTlveW9iq9otphL+1qHcCV0ZhtlMt/kAJad2q8kebRki3aGrgEpvf7WDM9xbSkkihHSk/g2P7eWijleMlilzh0DCD7qVZ6WxYaA5JQG7KXvnKhJtxF3aRuR0MfEeNPjNcQmMOw+l+wiS+//CCdd3/ej0NlfU00DM2N5iMqPzPMaEXztplbu82LktREULTUT0/bZNJq9kULZK+B+4YXOuOhh8EXuz/zA67t+bN3+F9QZp6a+ErJuPs7zqkai7nnZ2uvDzPg6JOdW25Q+z2ecu3nzyp9tX/UZ7Ep6ay/J+Luehf9xF0hby963740k7O7iTmfsBaaCX/4fXTAXjsu4mSg1rP/hMr1zARreC0etKfxuWIRd2LgH5ioIHjtWRjcCf/hbkmZJuDXJzW6U6btmP8kNv1WctkJ56vPZskE2ksxL8a6Mkn0YrB6cGXdLvRKecJ4VXCySq8y02xj4kQcjHlga56RimmTsMO3Tjd2wksgAKM3+Y3kVS45fapwZxlmI4zYPVTP6gmMS5PaXyDdJ23FNVWtm2xPR8tLrqMU/65w4beDD+e26NhvpwImSMFptsC76Fo0O3n4gFcOnvTbbzfPgWd/lkXcjkp9oX1kPZuvfu+BXUltgjky848o2Z6Ua/MlgYuVP4erCAlFntXDi7PWrgrgeY/2tU34i1VBS/8npJlZYlmyJBowG5WNRwx8bW+JvDVMOGYPPdcsk7+Yw9fXsBFrCUv5GKvJ0DlzWwy5ID2b9vY3YDZm3ujv4g6giatYg9vTYso3HSBZPyGTmJ58mpN/pej6WkwuxyH0E41S8fXFgGN9yEpd83qwb/oAVci9zcp7dxPuu/Mo/wP8gcD1f+2LYVx0A1dRGz2riOy66LT5WSeFwYjY4r9vjbsQnv79+Z87Jt+fBGIP/c/53Vn6RnvzzevLt8zf++OMPbPyLYlKejGoqdcvJLXd2kyZwmWJ9sXVS4+fM5FjJOTQ4XP665aPejuHjbcj301y/ckB+5YC/csC/5xU4YwngkN2+rrixzGqNvUnc7fV83ZKaPN5kY+7aOKXDSk9+MsXcVM/i3HFr5cU0Q3mN1kJ7M/ZgUU9dn9t/f1BMm2AzHM0uxhCgYlTpnyFPS7Gw+6yXZEuj/Xd/y2L3DbIGITbAyl+088qVwfYm8o8tx3huJoJp6GQ1dKIbmNeWodyZ2pvvtDLEGoJVI9vjQ8yUuk4vVteW93lnptwKNdQA54VBWSSMNetZQ7iY7ssWswfHlYeYsffK4uRZPUDHOELxq1nsLyZe3mikYWUfsI4CoaynGrLmeD5oCcCZV/U05mZGwWAdBZSoBqoGcPe53OdS9yn+P/beZUlyJMfS/gBV0tw9MrMvs5r3f7n559bdVRnhZqQq8C8AKJndPTmbGilfBEVKMirC3S6kKhQ4ODjHbC45t69wuRgnwu47IIjHBEvsjiTsYNyPKiALlIiZQXTIRbmmif0Pk+CrnslcSSSb9Q4mG1Iyx/IEEZRtNeOxtmqMwrjwzBnyXjavHL/wvmt6omJjXEWq6JBN5+lGa3P9fuz1zGdzvc7lgFETAzcpLo3Z9prqidffKUi10WC+wQSVsc4NLRsQ39nyiNfZ+Jbkqf1ZuVpjjGyA6e9XI7D9WDkk/hnnKo9V1xRxcWZO3ppkeh6Y28ymsVtIl8f977gemChHNg37PGlzpHLAzp5SW0utw44cHAhPGk0yfyOlvrYX3tIT2E9Kj0rnRInmu3p8NpUWcs6E9KgQBMvKlU6J8xqJ++fuGLZi2le5fMm7Z21a8t5yfZcoW9JnMtd1xy51luotiCyVhbg1V00TUnKXDHU1a2Nd3vGOyrBDBr8ITRXLRyuJ4MGeNcDjFH45YsDkbcDuOw9ruL+z+47ZJ/8ziWRHniXP6bfwZ2tCsqf38zvCdsT6frOLZIPs+HBMYbSsO82ZEvVANaB9TFo/Qorf9oXLI5pKElx+acPWWQ7RuK06J35OmEVWUQVXXLeVg08d9MQcokHXgribpIbdU4aQmHaaqbSg80wU/CB8TEPCcE133vKOmU3UfQojc5iQM3feHOhFTh2o7IDRLAZbzDtDPqJO8vTyFqd8bM/lnxzEkqpzRUqJzHhwYRzNnF2VgcZQjEDT/3Mb6U8bTGsxFns1Gwnitoz4XHwlxMsE9caiS5XhOFs8ihjTqyXUjHVTZ0qShLRFaZUMCv2KqRknOwvxz8RoZ7z+penvebjcTdBWU0ceSOkuykQSqIjPGymRVGHgV5PtLL1CG5BSK+rG9DCA1VbJ2MnRwkTTOFH5C9JBxnuyBxQrM+txXr04e0OyyKhkLQyi68RsKZbnS5JFibHGYPeOJec387A+XChI0uQC+mqEMbrelQxane1r0dFZOuqmihXjLT/SpEfBN+Oz7hOYFlNhKuxzrsCIB8uH6ZzaoG8c/qJzZDCr0cwsWv3SjxQhZQ1KRC/M+5BgU8WmuN7ozPW3+yVP9FWu0pOvUdaNI5OonKNwcL+NmSYbSzyavkCMiHqxb+4HZ+yR6W01bC0LApdzNSuFDdSDLZ8ggkmw/4Y7G7YA+KvgThmSDMY1PaAAVTjdxsyxiWyRfIoI5q9syArCFsWfKk5MgEy30FIl93qygyofFYOl+ZzLNpK/zhygc0PSv0WlY8kYbbZfcmB56HbZ6bPGXQc1mlp+Zfjl1VJFXOXHsR81Rn8l/N5aAjQFmYra+qw0lh5ZHeGtkm6RKCxuTdI4jGdKP4SBdHn8TDxkN7sy0mivibDXGk8WYlPDJcD918OWjO9K7VUueY1mmF8gQh0wZRTYzJac3LwxP9v4YpOBnqBiFjVJzULaYNQh7/vlSVdM/yIWEOdFeRz0TMe3qSuGCXPJDRnBYvEEMDwPcMk9orlvzePwLvZr6YrfSRNS7GbOC2izM16rx+s5JRNXZqaaer8NodFUaDJWQlLrz7lY/+HtF/FyiEd8L/mJvHwbTC4yQkjGpqehHUvOyGRHu6R0VkgNPdsZsgQiIJN+PkImK/equzOyUCsWmmdjAJKlV0CAGl4a6Em1P1V4VNHWWGBzgMpXwysAnAfbQpnjv4fKki50PZbWtCXT73OGx5aKYnR6D63+albMBtX/Cwm1IDqUj6QBhxqeoE7LZqfld9YBSjHszzU5Vguw2XUvvtS1GqMzP2tICqlqkjmy2aOlUX0VLSoD6AGg3vx90rY7U8OUF5ITUQUjDVdrjxT7N4skNF/TQQfLg6Y0tAVE1oNitvJtjM/kWDaVfb2HuVPyX/FTlk2uyZS+APj4AJKxNjzPhEbLxhNEked7DwmiySr+Hu6ogp8z3rYaCfLA3BCLZomJrabky/2a2rk1mN9SSk8mwR6aMQFTOV7IIsX0nDMZxysKzY+OvFWTwgPwtoFg0Hz9/p2RHNOckmxriJQ+9sQ3e+eX128A/PL5G789/4Ft29hnR0xo5288+I1t29DH73Tgn97Cm+H5fPJdnCNz3LNozMDSoonEMaa5xqT1vvJ8Mv/dSxZVoyE+58QtPAWAL6e//zMH/JkD/swB/99cU1kgsiXr/mQiLfKazTcm93oR8B7TTgQY2SShttx/YVYfSiEmi+bJ6HWikOxlMl8AkOV3ZfTIy3DweWPox9tvOU0oeABUhQNIkXLDEyh+SWlT4ozLvTKY4aGsGubrSwEmPcu8r7wyvBRG4i99fV6TklmGmuhuBVYm5GsuoIrmGlO31SToJXuHLfxBLaZrY79/RIzzsUhTXULoNKTMdOWD0TCLKcWS9iqJwoGjs9FoIUW79mbKJbsy0mJAbF5yhAWUjon1wpQKL3JGNoq0heF95aWSRBPzvKciy+8t/j7+/awaAtjkOqNkfos9JM94nx5TV5X/byt2Z1wTvSwKvsAVckiCpULRmjYVW7Es7hV/3FPZQIo2m9/8gHKdaEOT+DHnxHvkWELEHNG51pZX81cE9Ufk4noiOQEoNukWsoysmJwFoUdMmHmwys1Soeoa8XM1g9VjujAk/jIv17bOyMD+JGRN8/MtcTCLvVJn1qYtJORsRE7oss6hZpqyaAFs22rm7nR5Rgyv+DCdb+Mbc07eB/yjvdNa49HyXrVvfLYftNb477zxb/LJmBP8LY+sM2OYg18E+bK/gBkEi1qzWW+1zPuMwZMHCJyM9GhRSi59akqxCXR7YHeSJFGvLhyXmuI1RC0lL/uSFe2zr2kpayFn30QjB3VHDXpKNq/1JkfK11fdXmdU5EIbncvZ7mtcQyLursZIkfZ1XmQYbjlwXTIW/mqVy8mFycZvJcZARO+LSBevs6Rifa41Fn7IYJmDCYIklhC/n/FpvrHNiF+/vBq/fX/QWuM3dnQo+74j40Xzxnjs0FPyu++8Xi++zx8clddu+8KXGSetNz6ONz4OXU2rb1s2eFKJ6hDjr/7iHMaPHs3dij8AJhM3QWgMJoiHCtmIlRs1V9VxY/l8TTX6TdaxsJujEnITRPbMz3OoRpwi5GzlReZX027zy51zSpBf4vVjCmv3ydnSYsf6yjcKT5gaJbMQE0y7RWNvpH/m7Jc0s0zoee6WJ7dRPZDYx02i8WrUtLJwZPkw1XnUWerpr2XwEkO7Rq5cMqOUrK5yLhWW/3j9uUSeRIfQCtDJAhhpqYnPMj2PQyETGNe1HZop5Wd0Gdra2kCSh0a8XzA94ssnm6s90jg2QIh41DVeHoVzdaY1GZ3k+0cCpGiNzuUvqReQBe59BanFbO6TmeOWZZhbzIhpk0138GCsqRvGC20aBZHCkcG8irOVRJbAv+3hGTsnm/f1vn1ei6WS/MOvzjE55utu6ChG7qBl57cYOgVa4Gl+59Up7zSCHdBSI+9sg20VVB2/Rak4GH0FmGrKxb2ML9VtY2SDcNNPrtHXAPxc25LnELMFEPXp6zBGDxyYLaa1vDYzQpe+9JbjkWXxSjSwIBlUkAyRWmt5+Iiy8/WKoKFGq3WZCVFsmgQqhSXP4WQVmN8HApwrI0Ut/xJ6mu+FzMLZSr6qAO8ICMEcmaEp7L7WnLZgmwXL7m6MHQmVjgmtAcJwJ+QdpOwtcD8ZLRKOCPCxBsqPzVowaYRI/LfZMjkR8OBELXacTfaZzzCD8t1rSxzEIutsKeOyucNMRo5dskYB7Mafa1KgtY62ZAyyMfwVTJjyn2mNbRkYXHtitEiiRCbdk0ktnTKXL4aEioNVEtRWU6KnyZ6WyR4BH5w1wZASTjqDiRdFXluMg91D1mzKoGnJhxqM+NnBEUWSKKbhNTNn45RiCca93NBk+Qt+KkOTh7YK406fMUY/RWkJ9F9sl7HMCb/KtYgAJSnqQW6QjNMAg/0Wo7ZkdjxDd5gE7dLAL9Izie9ZjRBYE0FTCqQwZL5F8tuey0twaryCtxx8T98ZSfZlnUfGicsRcdkv1nr5KpmC2LbeXxlJdJCQSBUHOSM0uCerjgDcNDwSG23FF/MjMfURiRcXk1sD84/3n/E+s4OGEkLI7WUh/mzhi2dcZ12znZ2UTeCaKJ0AGeLKjHmQRSmXVMt9ONkK+xdZZ7jLufIMvKNFfsml2F0Wo/auilXT0+ALNATQnoCZPBnj5JQdp6eM7Q3AXrpT+yX7YEbbosiUoyRznG1eTMoroY//TdUA8swznlcTsBJKvQxGv8DV2EMSI8EFpGEebPwmgEehdOEhV2GkqX/ePT0U/D5RYUiO6w+ZAZo7tGzkufjyUkOMM8+FMmvPkywABVr+lyWNtGOrxjxa5mCFPgBig1E5AhprShRbC9AyhwvgC9EEOC6JBfFgfDZ2Wk5si+b0RzPKv8rbpC98Oj5rx+n5szpDW+EcJ7iGHBa6GMHTO2qhT+7tZLcA/ssTwmaPSfBSoUx6Urq3xfvegB/3yRgHr7eD1hqHeACHkizglKDxO8i5gsJ1Bu/JON/nNx5nyEa+P7/hIxixmyvbtjHPLQC59kBl4+NbgP6/+Qv8L/Txv4DyMTVW49DOkPAbgzZzYqBtSSK41QMWAGx8xwn6A7fB4MGYk7e+0fxPS52/y/UzB/yZA67v8jMH/JtdzR+YHKtJ7u5YvxjcbfTw6ym6geeUeuUNvIEfua4K/Gsrb7yzxiVBOyHWg+OoNPaSuPE416bIAhDRDc0p1XFGM7T18pL04ACtHCcBXn+ghNRaSCu+xXqv9Sm+ADhP0BdAZ5A1pDd0pocMsszAS7ov8sSU2LORAHTktq21yI/NYk25IdNCspIbyFtWCOXJ7fl3rd0acBFrumzZbKu8qXIlyVxyrIZYdRda3usmzrZypA75rJfqSdyQuO9IeBwKS0qvbXMRpJvHFEVN4XjmCI/0qDrVaAQZxHKtaHqkqir7S3NiuD67hD9k3j+xnCwWpWT9Gaw8yL1dsbduI3rJaH+BK3z+JuUdVPKDsQ+SwMG5iAUVEsIms4Bi46VRj81b88wzB5Qm1LT/IpVZ4E8Q8nMzgfKaqtH5Tk3hDQ957apDslJbU/IxUZ81npXUZBERhCmXN2pIuCVQXeT1NVXiOXkSMXuR1914ePg+edY0nJ1XS18q7cyU7L3wSMWTOWFOTBco6JhJjGuxf4G3sfPtR8Nd+YfXO/8oH+z7Tu8Emeej8S/yV+acjL3znEGCb0Wq121N7IpFvn3lvnnOZF22+Vh/LrUom1fLZvM3kCPl2zaatrg3+axal/VcSrrd9ViTvWp7CCuq8JYSrlFX1tk+FubY0wsGGfE83NnsI+W8lD0bAkOVUkxwv2QWSxGh2ztu1xn+Fa7RUu5+qRvkP0xZZ6y5MjLvU8i8ZrIk/SWmairexX0bOSkWJNe5vIkiRpnYwocfsy1cvqxE4v/HNLdJKFyZOS2l0PbReYx4Lh/PB+/PTu+dh++01vjgjde2BwFgGu8tyQI+mG5sdHb7EcTO85JU7rbjL+fb88E/PIOE+et03ubGtm1g4UX5b3wi+3eGD5Dv/IVLyhui7VkF6Uwf1mEjJI+JvTsK83eNopILb3H36+wBdguf09c+Q0oWeKSkNyXR79mEHv9ujXmnyFnNc/ADbmudJPHAkHNhF2c2wnDl1MDKp8d0ZGtxz+acnB5Eq8LSNadokTdAwmstY2J3WVyMqTOm+nRn6FyqFwdZk3rl2+HBNLOcXoTd3Gv8X86q/4tEnoJaJMROAvrAHbCXaHvEPa4E6gOdpbd6XA2EMttyXSxxzQ42gJSRNFfiEjJE2/VmZMGbwWwE7yQTwzLx6xSkM50AjArMM0ObYpbsTzfWNFSyGZy+PpNPX4zjxp6d3bkOqynKbr/GLclEp+uvERDNUA429mx2kItd8UwqzjiS4s993gqZXOB2jRE7MY4dzZ74rtuMINpaw9sDS6PIV8oIYQeo5t14cHgmdlpGy52zVp0a0+peXvq3WwJzuDFWPZGLlsGebCe/JRQskbqOpW6k9gCjAE47kSZIV3yEjMPoGiOQZjxWB7Ezs+s6dPDZnwu0C+ZJSLZEQaZMCrSNQHIIvOQq5L7GZdEKXWAVWXxcvhbhaS3ZSM21IjtLigFhS1PZ5Wfmk1GN2W70bAxLguWBjyUL0nscUiI3oObtOtjkRHJ0tBUQLA0ro1hCciTy5ZQESTmGiBWOdWfOgS7QbgBHgswfSDImHjP216FnSOG4421wZnG9JXjRLVgzwRYz5jYYIwClCMaNctr0+cAldMSdYHEAoTMPHP6qSJ/vl6B8xTYLvVhVpfuDM5kcJbmis13MC0LKE8BqXC6TB8WZMijZmGfPQmTG68ezNs45AkzzYPY0HYsFN3pjJlPLBFx7AGaleSzQyogwZTanQ7N3lAhN2nUxDkGQLmxsqR+9seituVImr2UE+BBjeEzWnLlAJ728Cb/MVbrBa/qzWTL+2zK4Vq5zzKuJ5P2SDs1C0SF85EQ4PacdigWUsT+mLDMet09uEG7Eee6xXDEX9mymNFG2PAPcZI1sNx/LZHuRDaYuBnWjMVMyZPb0LfKB1vpwvRQoKBcYlk6vu63X7bLDhCaTreKGN6aHVvbsO2LCPpU5kxzR3hnpy9CAcV6xJ1hUyiiTeqkpFBYrPbD5koixJUtSV/Bqkx00I0HM8BOvo8ZlIAjFNBGvomQP6QxznuVl4TFKXsylKnSGQk2+KB3ZGvv0bAw6bp+8eyRqembyrVdR2BqMEWe+bxErjmlskZDQafStNNgvqZkFFtOxJNVULFB/u7S2v8Dl+gTu0o4RjM2cLde3otfz5U6GuSeeF7u/rtIR31A8PV4WG8vfEYkk/uRFs1szV0D8iOQemAZa9yxZ4gfXmo+/z99PxmxrgmSRoA4XC67YtYKlh1qEi8xx6r5YoyR7dLK04E0HJo484jO6h4xSfb5t1nTkYwHe3oI9uMuDZz+Zq/jIHHD0NbHeDawkJRLI3hmMfC2dASAEUFKvn5NMKmg/8G1jtsHZBoeffPcXTxmhu48lQHZJrbnPq0HjH6vJtI/wYX08f+Ht+xuqyrfXB9/OFqCHK3IK7ZcdPTvuHWtvPH6NuPrPW0ePf+W///4vdCJWHy7MNEs/EF7noKuxjzgLe9cgEADe43McPnnMyDvUofNglweTts7/kkD9OtfPHPBnDvgzB/xbX9Ykj6hqkkft+z6MkuJf9bSHhFT85TXZJZ4EJWE19ZwziCmEOkZJ22rmHQ+fbAkeYTuvmmwqH0874XauiwRYploNikuG9NT8HlRMAPTJqIa/w9SQHbLHhWvcLyUaWNYa0oMwU/g/bjlFIeEzM2fiLAGYqypnNitPoLXG9JFNmBmNgCS9+njQE6S+lG4m5Sk4gacVK9sXDlIM8IuQQmII0dQJOUrLSeXFAV+/82qfef8BS0+f9ItZ4Ks7syk/ZhKq0o9KXXj0zKH1k0xh2WbP5+6EVBC8yeUXc+ozm+iOWU3ux76CkACMBsRzkZjUW/pTCno+Vg5jep3xnjJjQx4L7H+mb9NXuMK/MAgJACR4f3I1m9WFodXALBkcZc9z59AejWz3axheLKc3IjoXabnKJsMXcYIpy0OmPLlconZyd0Z747lHM7xUeN7W1G08m1OzGWoBzvaUfIpm/JW7nrlP5jyXv9ibSuBQ8S/5nttScxCcOc+1D7dtozt45rDmA5VoCtNZChTLNiSbUq01xnT6iAmHX17x+//8/Rv/9D1I7//w+uCX919oo9EfOw8e9OfGxy9/QTflW/9fvF7C7/N3ZjsSDxSOsr3o13RRm5q9iYZkA/uU8Ax24MxHYtu+/BxBGbYzzME3mPDgwVvlrcN4bgNtymt6Ssc+COIKSNsZMz3cck28qdKS1H/un0wJFYgn3+Md7Z1u7/FZW8UEz2kz4THX6sSFVc9HqSi8xneWX94XufaZOGVOjg6tGratZryIsCWe4Em+kyXVEmTaTW5V1XpuI32LrqGDmnzHZ+IWyrmdSMqBStbVTYlhCQdc0aqTUg7247XxX/4asmu/fX7wj+ev6FRai6lSfe18G7Dve0zO938F4DEOZDYe+on1iHVug/2M5/6Pz18B+K9//ca3V9QTH/LOu36DAa6hSPB4+1fe+AuDgWz/m9f5P3ERjhZ7adykyjUHXFazJKcEIRtuLXCWIA7AdMdu5EaVjb3q3JENNxFe/YmIsA9deVmbnaEVcyq+X59Fsj4pwlDk5fuSeO3u8bMOM0ka4bvUkS7sbrSyJtKTJs6QI/KwmFWiL2JK4kVyVeEm8JkeTdJ2aHB4izpXHLOxfj68yjUwrtzXo7Gm+5danZy0P2kj/Wl6GAd+XxMqLmVWaMs0d7MAz9y5zGk9JNhEhG1ueI5TTzUQYfiJeIFQuhKCMoNUMSzBoYHTShN1lG6oLoNlRbEmOWUUb9+4JpxCFi4KDrHq1moGoNKGLZArYC/JRAFgN4/RYI9kUdzBtrWA7LaYg01D6PdqJI/h/MX6bJFg+GKfuttqTMW7zjywIhnptIvl2IQjtZdrRkzWWHi0R50zPB70wEVy1D9N0YBLBiI7pPKEGxDUMtgZzjSjK1walpb6wdxAwbfFTlTfmMnoq+/aqxvv4OPE9tRcb8H2jdH9WjbhEQBwZGHVTdHs2jrRjHSz0Bcn9EjrMHHZogmXSXoAPn+Eub7CNTRA3ibhK2HJJjv0uUByMFo2ade4vM3FkDFl7ZEtE67TTsrrIrxYJP9X69vw5fHll853fTAZFztv7pR05JaSWnhM8AW/oS9wt3sEHlMN+QWR8EbJEfJpUeTbTbIFgpkhIsnUduAyCg0yUbC9z0w8pTWqIHEd6FQ6HXjDzWnaIrlIxmhLg17EVqEX048V8ZPdoM7MaZYC6vcJKsHEQQZixXgsAPTSzm2utJwwORJQ3+eMGCFxfwq0qNTu7M6ez3ebyq4PfHqAgwgQ9wyZ5kIKAAAgAElEQVSHia5pkmbx+Q4Ndm7TFk+jRZPWinnZL030zRuna9yPfKaq8boGTOnXhE+CJN1fzEawGiX26QRGjaFPZ/avA4TXZaJsHnt/pL/B5TkUUie9RwPl0Eiuw2PIEqgD9ZQ5IJjWKqDL74U1WSAWjNWW49j17yOL6ElOwUqAAaqKn/PS2V1Mvr6kIvCdJp9ZdPj1c9nsanbJn2pJupjivRgvY611XZnNY73WFKHZjR0K8WylTNaDwe1SZ3v8rUqQJA7mYtWTkSBiv66EtIoqGOwJwHSu802yaDzZQSaqQvdHFmJPLvaRUfu9prqCRX0D4Fdjoz7nZLIFaKrB0BUVzkwY+7zYQ0FSyRgk4eGEvBZwH9zWvAeV2BETY5HwHwvMPCUY4yvkAomyRkNkjEzK9ovsIoLwnglpAgoSGc9XuSYBotbkwCW/qMvHMeCsbTUjgPQjKpbwuL7nTV6JNI29P8erUjoSTHc2v5oePfe2tRnCPe6c7ZqKa1YNx4OW0+ku1Wi+prwjKUvunAstUYljvjLvPYERZ4Bs4Um5Pl8Sn5ZvmqWss4McIMJJ+I3hIeezZ771dkZ+8mbtAuGacyYgOVOOD64cSxmLHeoyl++LVHPWsqlJkI1E3qKArAa2psfYFqNctkn6gMXkgw+ntQDeDh2LBGS5nn0+lsQa3tnKTyzzcT3h7ZVN19dApDHPgdsbokEaenWFtmHnCT/yu/6ysW+/cR7OeJ/5mYJcFqBnrI/mURhqa5ixGhzHjYxVBvNqnVZSSwDT8PTd+krXzxzwZw74Mwf8219DJk1eC1OQO6hYZyx9nU3VbFS5vB9LFnDFEAJzqLNliK4JpWgKBcli7VEHS7Z3SbWjN99mOpLTBI2DJtBmSPlck6YZw6Qwg8tvCYE+qvEczZWarhERmgdAKUaQHZDIy/LbNNtBrwZGa1sQiAaZ8Sh7ThQH2C7otLUupG2Ub3P5YwTRIr/fBM9pDW73P+QkQ72kugxq12SYtxkA1s2nVGGdh6V6E4TTzPum03OixOtsFo1z2J3mLa0VoFmoqYTM5xEPah7MZMaLRoNCdKe1nOKUCyTb8jtPm0t2XyRUVmrKIj8BW5JLpmzQ3tJ3bgvfEG9LvQCMsxXWdn2Hy4vjC1wSDUk5A1SemavodLya6os87it/tSZY5WO5VpGlFLrwvviXuQDwbeW/0dSMvCpVaQgZ18h7fJGP4UCm4ObsM5qiG0FGqaZlzoAwmoTLTJUwBHFveb23Ur0IWU0gm7s5zZf44DknUlw3V/qMpmjUZgH4lpcorvg8I4eps9gnm8YZepwxkeMjQGgdUS/2+Ya78/564+0sOcCQgVMH5i+MV6PvCuevSGv0LcgWYwz0seNMmIEJRiiRP9TE8ZodJKaRNx9rLW+5zk/pa8+7NXrlhiOwOUzWPlVCMtota2kHk0fcD1VsakyZWihiqQjWnTYKW2zRJCBoOBCSXFUt4H2d25JrpPk19YN1zp4TVBknPm3SbyXvV7iUUNg6c92PXPfdBMspZMFSVSCxYoLMU5hnEM6KnEjWsjD9JPZbp1tMaJY0vwBWo23uSzZN88wT3+L5FSbtlc8AOI+z83FGrvPLeMP8LafDHrHfZ6M9hHN0+ul45gvyS4sczHuwHdzZ585Hqh98HFEb7/OdbjtdO83fQwFBFe1RW7z7Oy8ZdJ08/He6Phhj4GIRm1UX8WPKhPSOa76F1DSBk8eNADwwZ/MNZp7SJbFLNGaLeKArxlUdfFw+jO5IjTiUb5OMBf6ra8AIN2zHJWq6WhGLcESRjw38CFlwwLNOHUymTWQ3/AyyGY1Qukjltpg8nhReYmq4bimZG++zq3AuHKpFre2O5iTW1iYj11U6D+bnvtXxf4Kw/2mDKRIcX9SeZ+uZSPgqPCx1Uu4sZGSE9jCSfksnaEjuuTtN6snGgyxPhGUs5QFQxI1uCf5wJR4eepxNlKGe7MfrS8bmM9AYC/M0fLTScZBLZ38ALSdoagN2lysBk4OSpKgG2p2FCwTjEq6uKQKyAc5sr+Xz0IwA06wx8yDaUT6r2UYWLUDvOaJ6nAvQdGKBajbMAEzHAhw9v7xTI9gCHEsCz3QmI8Oh9LzbucbhwsAsv8MMln1Db3JzL458RvWZVH/Q7QGkF9IqhKPg8/ZC7YyJMEk/JrFMJjQOjmII2V0H90oqXUcm10a3YHxXwdmsUc4bMt8ycYuN7XhIb3yxFpOLMduAUY2/CHYq+yqCdHIVFFQxEywcd2cfoNUMXJr0yYZIRmsRgt7OPMDEsATFQm81D6xe95KV+LrIGl0Vj4nB0DzOJm/5Y8AlOeUd0WRHmOQEpLJFZES8YZlkk7rVsRoDvOguSwrJMxkFGF4a2gmQ5O+joRu/LWD3wGc0FQRWM3SiwarLK8C5O4AXOr9/wKBC4DxMY61RprOljXqmNCgEEF4+cCW7caK8ZXJ8tmM1IFrKJIQnTY7XiiFe8y5XElU68TqDSRDPM+Kuq11a+BaJVHwvz//JFU+J9WZmtDbyAAljwQBrZa21agSYDGYrxqdAGn9rM9yMwR1g/hqXSSSslqBd89Q5n2AaTFVRY7gGO251/cfyFpEVo8i/iKmgdVS6IfMyEC6pu/LsG2vVETJdgM2GaDy/SP7q/PArbhcDnMG08OUYSxIkYj8OU3wxnkh5m64Drya+3AC0KiKyyRbgmeEtgKJL3zySSgiDVLe29l+wfSwYbVHT4dqDHTUfuPwOIldRaeE7Q8Z5tYoi6ZNnLw5N9pIkGxaBjIHbbHhqcZ8iFKuwfJvCszEBDZdFVJn5XQMAyyaB9AWKoAXUtiWpG96R7QZAxuyLpL9i9weymkkZS9QpesfpBrsyp2VCmIVOSojQfmd6SUWEt4PrzPMy1ldNEBSTT5m35O3vfzXfsqmasUIigxB1jjxL9qHJlrsAsoiHpelukEzEkiG4pIDJf69GYYJYIpGsS5KEMimvvSliec8IP8fAIBax6UEPTfsC3SwAs8Vmw1ejs6ErB6mJCvUWptwACU64O2cBtgo1wWRNlkG8WcfN2ZpgZ3zY3R68HwEUfIyPaDQdvppabIN/zc/t1nll7jkLeNOLqVneXrFW49xrx1Xg0DrdjOEDq8KCdzZ/Z5ygXWCm1roBhIGyNMVmGlrnjvXKS9tYksrRgLg8fNzD6Lck9+U46S2+o2X8sqmxMWfUCzMbQMc4GTZ5DY1CUOJZiG2IKeZlnhtnj4RWKMNbTtpnc1tSZjCWBpOQWZ6tpvRDevIrXT9zwJ854M8c8G9/TTXULiWQapqJtGuKW48F0LHOrIuoiLJyu1prIQV4NXO9PCRyja4zJRun6wzPf9OMh0W6dLliU1wxJQKZw1XsyzU75PJy6B5ydpXnRePSwTfcQ/5GNACnNU2IItmY9Da5Xi32wm5tyRMfwm2tRl6p2m7EGsOJOty3DU8wStaIwzW9PNQW8CuWk4S6sawJ5PJr6h6eonCs+zJFrz8vPyyrsJOfuaSd8vFJy3w0CKblJ11m7MjBmXthTkfaRBrZDMlGmcTkjSlJaDXQMrlPojHRDFGHrg0fuVbkiXvJ5Vn+rK8aw6VRajvupOxzNtIkMB2+UA44utOHZz4HbQZxbqoFuwTi7M4GQc9JQbeLcDTbWA2ktTdSPcjdGTMappG3Z0yeNRUL6IgzI14g/qslSef4Zuw5iiY9FH5cGs1L3jfrDCc9ZwXRtiTU2s3PZ3pKIjYN1SKzaKiQZ1qS0Ua//OHfBkh7rPPUkpomOUEpAlNDxNF8IFrTFXnPdCzp9Td7431uiAkfZ5wVj6m0mRNc0tHjW0w7+Qwf3PFBN2jS2KyztZ0mnZc88eZYu95rOwfkve0e+ccUY8u6pOksTHw1fycHNa7aPCb2Y4LScT8TWy3sLmIgQJf3uFdNg2Dn0LK+iymumJFoEjVFSIE1NG0/oklpuLUVX00HOoPkErEMOhs2E5uUuO+4r/Ppm9wj3te4TNJ/KsnyEGfF2QVGxn8yHxcg8y6TY32X1rZcz/HTQJ4zNRl3YhrT4ZoeWS7zygvk8i3uGTNdr6kVw5fSQpHYPkZHR+ado/M2Mo/LXKY/OucZXoCnPTnKL2jOPK8uuVixnS1Hax8j1t8+Opu8h7oKO9hJ2za27YGiHG70+UStRYYlW8aaE/c85XtgI3bWRHuesNUYrbOCwZb2CFh4NLs7tlTHxlJeUzcepS5TzwvHWkhtRjM2z8J8z+M2ANJSPSW/+KrZ/uh1m/uqptHLxC6bkWidwS3Pjok/YnIypPUNzb5H5SbMmNwd6kyfqEaDKghjBpkXqIcstuOLUIy9FhlZea3ex8yNJc5SP/jPrj+fYMpJHEugrh7EJeuSXVOvg/L2u1qHqrEyN41ypbmvv/PM5i7mTjzIi8V8sffqa9ht1HyfRPSmxeLy4umU71D9O4vVdMkFeSRnGfBaegYMzc9IJns346v4hFXsBHPbZyajomkYfhkxNzqY0aRF02dm4eQ9kwpDk72oDHrbVpKKw2wN7FyMh8LuinmI9VhICYZeD2bH3NlNVwIXzalg3R+arykz5HvcUm7jLe9bGC42u6aa8Ac7wfJ55u+f8w3RShCFUWwhUhNyzrUWpjYEjTNZy9CTJfnSMHb9lkCk52hvLjAmajC0vLHiIx1MtlJvwhao9ciJgHNeDKivcp0tTdwS9KbYbDa4ZBzG4lorBdQ5j/T3aLpRoENJYM5VJEXQamsP3YzrSie3tcUAv3xPlMrcWzG2Sakcgnk3sLX2pcYl8+CbudeDdSQ5SShUN9LE0XlF01UQrOTusQ7Liawirjr+fvN7i5/fUL08zCKcxborU8f6fqXJ3nOvNGBYSRM4LcGoditIjaDcDfFklMli8u/zMnU1zsXKio8brMLTAojfUEq3unSqzWxNiARxW1ehD3Ewuce93LW8E657F6BZvp8qnx4Gn9tIrzKFbjNjRTKJbCaoKDHZZwXqPZka8ieLuelva5PFuakx0k+LeChzFQJf5ZL84nWWiF9EgmKfTlVkhiBANXoi2coDl0ZLiZlikjt97RGTvvSLIXo4k5BAiBfL/4ik90wkAXHWyx963a2kfDKpSDSbs7xVwlBu3ed4LoOWhUDtw7tsXngCpAdHybN4XwMiRSwwM3TGyLn5dklIuS6viO10esrBleyFN11NLOOZ65aUyXdcj/CZyu9TANlM9qqzR+oqAt4y2Q2p13j7KNoKFCuAZ3oAyUFp7UleEbYEq9d57UcSWEIewdYajlh0Npa0G/5xFa0Eo1X5hS09MEpeRxBGLoBPXki7pjkCjVLaSECBhmumYUmKQIL1LV2R0S6vRzLBA/rSdBYYX2dfmVgm5gV9BnHG/JpwaxJMwmDE5zqxLLIlp5OW50BJMe5/eI//YJaML/A0Bs0aopcnpPkl4/uY8ofcExI8T8DonhgVozSaMfmebSwjcE25BOHSRHdTRhFaeCQgIdmsiqbI1MirvOQWpPHmsU9/ff3Kx+8hhfQPM5ovHwZ7j3Pvx/GJbj+Ig8n5XTRNkcn3lAVUCttqAE2piYgA9ERAORgC1gxL+SxGTFCKbjC3JQvz9Mjjn904gxMXIFDJK5SigDu9mHX+QHIaq+UkTDBRE+hxycaUcHoY1g8fyIQ5Y6rmPKMgOt+d15jQeoKOMREybTJlrvil2vEeTfFgxGazWi7A486s85beXLnGytz7K10/c8B8t585YD5rfuaAf4Nry4mYou1U6W66+O+Zu8TVtIgN2zWBBKgPBF/NVlNZfkzt5jFdcWdgGOFRVK8SOWBiEklmEYgatX691k+TlGolvP0yJ6z0pElbXtQxOfvHvazSYnrQHZlt+USWf3YfvkAr8DWl2owE08vLq2TsqgGWz7/3YMu7pXxV3YEBCVbOVB3Z5mMBiFtODEVuGL8zxJOz64CufMwyhwyiRZqxS3jvREP2Bt7n/VH36yGvFNapOGYSvm80WVYASsjhuTsHCqaRr7SLONFnxsXZ+T1oyLfpaF2Ny1MtyVu2CGsyvxFpTxi3H2kSXcSp5meQmAHRMHq/8t24LV9pW20zctje3lLm+Y+EcveQS7aaYElCclBh8tni6wxbTf3ybyWI17VzJOuHaG7W++jKHW3t3mD8i8A+GupJLKsJ76DTxY9KEJbis9ekSFDFLKfmlhxm7TmP9+qqKPXdiekPgQeCjFRG8Mj9A4wtMpqypVe6KWwauY/g6z7UVKoJqxHbFfaUzt2HLvBYJKeaTDnHJ8gG8wMkal85YwLqtVtYTwg8BGb6t1ASeSLpj3qdZW/HN7qdtNbYX8rQv6KqvORk2zbUX0vyfepcAwBaOJ90rAc1YT+VI2MRWSvOOdlz/xtgFtNURdAQ2XHtOMY24NCY4pWZ+K94xD8PEiDtkqCMZ66E3Lkz8OUJWZMkb9ov6cYvcjUkiFRV52QO/xi+9pA4q5ld0+rCtghn4S12O9nc4l4lCdJEYgLKPHKBbPBkNzd+K5vh1L69EZPgj/tVROJoSOlGfynPW3MWQLcd8RfzPEFPZMt8f55YqsMcmS9u7LSZjaWUypO5Ydmsfoqx728cQ5AjPF1lnswjaht/RL0hbMj4nebh5xawRYDiW/mcISthWmeNKbO1P8S0OLfPwC8kztj6djUxWcRXywl5IdTCCocohbdY8olh0Nm9iJhBijzEV9OpYUh+Vk2CSdMRObwbU/dQpciSVltnyVTbDPJytVpaxUogJ9DdLQZMhBiWEWHObZ1l8eUjIThXLqyrgbR5z31JkP0AH9eE1H92/Sny/uwAk0c1lJbh7Fg9oxMNovQNO9PbEdBdV7JHBv4+NRMa5zKkvB6wCXi+p/sbkjf7LFaNjIuZdGO/ViPNpwYI5OB2AYXFXnUxyK5qU6FM5X5kp7fPGUl0BshLzzBlOJpGkeS5+DzuQUjXkTIECWSMWIRhhl6jkCducRgukFMFl8bLk4170zi0oofCYiHpSINl6WsC6WhneF4kbhWA2hasRHNGGuXFPqtJI1BRWo499zwwm2VBq4bP6mDOpev/ngyk75rjxhLSDVWouhU092Cu+2/o/J7G1iGZc8wDa6E921XoqZcc8iEwjTXuepT57wqMzn4KkmaNrZ2LGbbUnfyxCoMvc9kHpx5orv2e66+JXIFalGF1yCTLHmePSi/Yzbf9AsGIiX6rBED371hQ7hYeJuSyTsZlHcIuvkYw5+0wdon1iRXzIID4AvXKh6ZZTCxAdrj915ChKn18u5LodmPPkkzxp/2I9ajxeWYa4JanTNpSZ/LYEJlLP14kRsKtRmM12agSRZTYnslJNh6lYUsL5lgm7CtYeg+GhCq77AGSIXjq9b/kSX2wJIasIiEYC7IaBZuFFnnUUwmEq16TGAZHr2c5F2BXO2jKthgHtb8i+U7Gef/BnCfTgC1BtVfnJTOYC3YSpp7bik0mg15AuTz5mLoOdfcwzZzlD0ExJ8IUHEgQ72uxwqfGBEgjmdwrSbrOI3G7xYYqZgVPeYDhRvMzJExrwoCxAGbJJn+cI9Fs9ybM9MUQ2ZaBdElYCXpNE8lYBVCtP7drL4lc73vFgrm88USVsyTeXKIwm8lazqYICW6t1+S1YoXcwBVvNUIuK2EwsWDjidDm+/oMTY9c96/LSqCDjWI6kYlXbIZ4f1uNt+AahnxJSXwpMJMB+ZkTu2KymkLoj7h/KuzDk4L0Bi1kSmR6kE0k2FUioZO+wCM3PvJelQSgS+fQZFj6sb4rK672ZEYGgf2l5XNTXiYhQauqTHljugUXJBtob2Mi3hK8/ZXv8nu+f34mCWP7apqNnjHfntkEc+hX8+XvfU0dKf9xq/WjjRlAnggj8x6oGAjCI4y4Jwmo1f2vYmoso1X1iIfAJfsG63yoFqc7twk9v0mo3WUjE6SVvvI1OJfHWeScHs8r14yLIvKeX+07VQYvECWLuNjLZ5hCt+u7nurYzP2fzak2H3w7vuHuPL6/8eu/BUnr1/NbaIv3d/YtXvPb2ydvR6yTc//OX8e/McZYWLL7TMQpWIIFSu/JIvQfJ4wAIIa+GOkFYGfKkMzO83jx7ds3NhrjiKL89fid1ho/+M7hIYupDo+apky/KOTWwJWTLT3OStby8XrAK6YafEye2dDS9BmZr0GbL47XJ+1j5/v8b/G++i/xrLZjFXif/kLE8eYL7D59XE0RRkxsui/we4jS08vkkLkacqNFDTFdsPl19hTwMwfkZw74Mwf821+bPlAG84wpQN8uQLx8j0YBcVyEhm3OBTo1S2KMKpISN87n5T/s0biMq86txtQZZCNO6AmgjQBylEtNxaVTE0CQZxAns2SSqakHRalzq6T2nTNtBe4AqxghVyaEp9+SDk7p5573w50xo2mvqozOymuWKomzPLIlQfM4fhSa8rAH4rFGJzNyY8kmt8e0xD7flteFJfmiZOvrO+fNXKB3JZEhRRnrngmixcyPn91to8sMZRrzhRWdKW324rxN+StCz/PQ6L3TfEfzvjzMV5NWUuLyheOt1s2L98xzxGKaxdVWvjxVYQT0/sx7qW1LH87Mo1uSMNpgzom5cxbYLjEZCdBmyZUGK/6rXHGSdAZ/jeW+iB1+IxgovRo46VWGXDghkN5JsQ/rmVfmqMQEQhAXooF6P39gBhblfqvfFM/pgj6JWCyy4rBzgsVnCqnRwAQXcaYlKV1gNngd6W3YA/DWGZNNmDF54h6+MC1zrSkvCol3xkUEzI8tDZ5y5rme8oxNESIv67rjdmAjctQiOfXT2LNk69/js44TxjM8+p5+IHTO8+TxbccMPo9PenkrbnHGP/zB7+czQGIZlCT1pNFzCu2fP4Pw9F/mr/z2Cimy9wb7+0Bc+P7L78w5+W/jf/D7/kxp+c5fS6qrrD4UCkf9q/raH5JrX70zUhlC3RZ5qpQDDl7hg6UeEmeU/LOE7C1nyDxLgIIvF0Ql81IHUZpG7fswYeZnOU3pPdQl1O7r6e9/heqGY4lf9lLy0sqTojE+l19PYbM7M6eQxQWK8JO1qs4gFInktG3GVW/lMG0rxxNpKHucS6nnuuvAWw4gqLMn5tvO9Ij7hNcRMv76+8Eb2eSbD3rvfNoJ72d6MAnPM/N1g3EMeBiPlGKTceDP9E76jDPzOMFeie+2T9wCH0YEbcoxlHl8xvnyMBpPkMmmgXNPFXwUVgzDo4mrxuIi7BpENsdSnSGk8GqKcE/y3jad5Qus0eSO3DJeZ3ML+WLAOfmUnBarhpUMGgchHPq4zpoiPgEtpwhdds7MnffFjAk5SAC1c5E0KgccozE95iVV+4UNZV738nP1Ch5949HCf+4gmuVlQxDncZDTzCwmo9xRGvusBlnkhPH5synWlPeaAPtPrj9tMK03nxEYZnWIBfT2q3c+wZ2hEN/00tQOZhFYjwTPk8EiWUT56oQZZYiKTjLnZctuv9u8qG9+AWklfXPmYgIJc+PVhc1/L5Px7OJJjgbKGkePMBw/pPj0AIz0BIRmfhVWdBBdbHPzaDDVkgsp45Ym8XkfeGAWioaOc6QGr0rHRjJn6kHqRhmYwzXNdd3fPYHF8EdSu7GQPN8bC4BEoD54dahb9F5zxDDG6laHldIRz0RRGsaTYoLHk+qpARmSRxtlnpkG9M1gdWgHo201PB93r1jpHoaer9UrziRAY0zS0gA57p+sZqfoJy3fM4ZJIzmoKbUaVf5SlwRLtee6r9FTbS0Y45ayAR3MZkgWyB/XcKNGvy8WIxpTeGTDsRgKtp6f/GFtkAeDtWKjHGthqOsKgpBFiBL+Cw7ulw5sy7OQ/LsIsA0nNX8pCaNLJsLcsCyYZ49n2W1f61IsgCIVXTJYQ0/k1Cj8ekNM1rPHoavxXI3qE7/FqJagTLGDtTXMPxOc0AvMkwSifKIWxbgLuDamWY5/C2hb318sAM978RTTD8Vu3FKu5IL33Y0zzV2lpSYscPrE3Nh1Y7fHum8x9citSCtWpORkZu6B22Soyo5NS6+AicplKAnX89tsjxhHW6CdzIamjvqUA5J5MZbsmqIlRP5FLqUnazuKVTVd59aaWhVbzXt1yYQboKREWLGvLZBZV+xGYKTEqhHNj1NHMo6gzUFnBycBnZrCzc9oPQqxlNaLuGXrPeMzxjPo65Bp0AOEHeKc6XEUoH+AkuW3VHtLym8i90IVXWNLZrtGAynIDLd76Gnm6I62V4Kftabi3+cooEvX+65CskwkJQDgKpPNt1h/eMhgIXj7cWPlpswsj8Xkw0HrzC/2nc6V8Jlogq3gGmd5My4A1QWxkvW9PIQWgCjGoWOBmQB6Oua5brSnrjpLXul9PHiKxfpqilk9q4ghqob5gYlx2kT0PeOhLe3jyOMFRg/mnSrC5DwPtr2F2fQXuWY+y5badAWyhUZzjOmL2+2MqUYsy8i6W0wVxD9cgHdNlKsFuQZu+Y1f59bUi92JPPPcsz8ADS3PmJbMZK2Gkhno1aDI1cZwwTXl/vwdkt09M5czC0lDVQ1wIP26injj3lYOdKqgM8BrtUnvHZ1Cq8T+bDySnbcfH6m1v3FaTJFsk1Vwvc2D1rZoxy6j2EXRohNTikDI/uWldYbNHgX4ZxB15pz07Rts8LLBGME2FoTDPaUHO+VH5cxUEHCm9pUvFLFI/ZKH6lZ63SfuMdkm5tg4s1lhTE5sdtpbSkLrk/PxYkzhc/5gzklTzX3t9DZCT52coCBYuCz2cUzXr3xYIz+Ywso9lg9YSnc07+ifFEF/l+tnDvgzB/yZA/7Nrzhnr7NlSbZ7kFFsArqvyaIiJlh52yFrOqbWs7sz2kglDqBkeAA9v+Xvt5VjWWM961pU3cPjRQBxx1JelDJuNwGuKWYnpnSDlBOKHmdaqmnW87EJ85xL38wA4I8l968W54AmIdRsItborSerPRpZL5lYNrjM9Zr+TcCpWXgQiQj7kloSnt6u6X2KyZ5IXsoA1RSlZ7YIDEYAACAASURBVEwqI/P4s/xhQhrIdZ45IpO2ZB5T2lXgmrScC7fZc38Yd2P1HeSgNQJIdSdiUSjIuM5FPC7ybRuWuAUgtqRaPbYYbaZMpDuNsSRLY24usJCY2Be2GSbwBUyKKFPGks5UnZg/EzOJxkUX55SvA4Y3fY/ctYi6JdOU0W0RfnOaqPaPzA3aFROXf3fJYvulJmASBMH8gfiP8AcJzpqSJfPjswUK6QTJZ6ufi05xrL+K+Sa4xuertbHUixrZ1FNArkkNH2hhe4BxoNKY6Q2q1un5nOa8SM2LZE1NuqW0d9aTxh7AcsqdW8pY9lnTOFEDWEozujs+B5OI5bu3kIlTxSw9d8fJa7zovSPm7LrTrdM1XufddHkDbnPn15TM/fV8o7XGP32+8+18Z9s2NnV6E7Zt483/kiN/yv9n/4K58S/2YveSqc17mXXCnEbTCUc2k7IpO4cjj2KJNBiVW9+m4UZI83UVyKZwqFXGxlMLX6EpAyFyw1MK8L7IJAJgOyoSzY8ZMema0v4a12hRZ/JKsP8WAyuXMCTkN92ZGUc3FZqVp+2AlAn08s/RyW77uq8u93wvzsTCGGbuMXcCCxeh04LYRPx9z7i5IJBjoGcR6gbnSK9IBlhjnzt2dkwM74PzGTJr5zP8j6bnRB3gdkASCpyT8zyZT8XPz5wATynICaIP5pbSp0kcseMFb4IbqznjBAHAzNiaMU0XnN88ai5caNo5z9catmiuN1Jx3R+/NcklB1KER+YFhw6gJKkBH/nnahDFlOVal5WPSJxf6lfdIsiScT2zxmlWPxskWVlnbX2kESppEJLvktKTpb6uDW9F9BihCiCgRaxtdjkPSU+WiMAc2Jxs+4Gnf/KENaVatWcIFvyfz6o/RzLE6BYfaLrleHzt0ipILvAsHkFOtNwAhQKH6tCVYurkAV4yA3fT6DKTDrZzJdgzii9vrCF11RgTE8FyrEuHsRaIxqGBXE0H8TAbC3DklljkyXP6kQl56rurEPrh+SDQ9DJazz4+R7E5xJbM0OlwzGcydKpg3sOTQ4QxfyzJhum69C5L91DkJMvtAPdKOzF15l1OdEbX9DHeOYrFUDWAjCVJYZrs3TwY4nX0YjupIzkO7ckijI5uGY46zh7BsDazDKa8MISpV1BbRbBtsZqBUPn0TNgrgfMV7IwLlKqprEeOEpobp5KHO3SyoScSeY8Ik0vSwZC15uyLMRfCiBo0ARSTkEkxn8QgmWGukbBlkr0Oi2I+uVEhX5bH2PUernLTro7/Dps0n5lYt3yv2+9UBk1KqgiALFkiEaCYEzdAfK7R9mwmSxwWRyvm18VSs9IeRRgjiqtOR0XCa8Iq2Sekc+CSHrCO92gINL98Y1yPZNMZJeHENKwkzkQWaN6zWS4E08VMeLbG0pjJq3uMfgbjVzltgsKhKXOALiBbTRGZiCo9UcezBVPWs2shLe7fvciqKUwDzrK4mI/QIhZlzrcs0AYk41GJ5sahzvIC9x08WrOWiReSky4ajJYtpzZmsxWnKkTr9AXsiuZ0xrgY/EqszYgWGQt0YP7FWOEpylBa7SIhGTRFcSsD7x8LdPNWOujXWm7icJuCjFh5rQ0XSMl5LJvZ2B4+cxKeg3WeldSPuq645Gqhfw0RgwGkJhTAra1J1yXqIqlfnhlfMbFKqs9VV7wX2/EC14OLCTLTvyTP6oqRUmPQfZ23LkZJj9W0iUu/QFt0+R2ajithqjadBgpi05DmYBeY5S4gjvVzFaiV9YulBASCF6txvtEYgVes4hJGC+1q3K7gFuLF69nXvRQ3RBSRj3yWN8aqGxs72FX8npJySmaInKiUZFqcsa66jG+PG3lmDQS7cmZROkzi3iNs3hGP1x6ZK1g/UwYKmjf64402/XZP//5XMyNEeCMebOe+imCIHGLqQeUIs5UEnq5GrujkTh6KvCOKERGJBHjJOe75U75IRjPPRyl0QMKv4bpsTQX+4e8SlDJvFPgqUlJ4F4sdPiElCuNlnS6hVBj5rS05Olkbd1zSzaY0D3Z0AeHbeAvmqDvb6TzOiKvN47xuEg2QTsfZafLC3NDZ6GgwPvOWDXWQa8rnIhlVHB9QRaB7THFYyiGoZnwRlMkUGGl0e8ikqzDaWDmYiC0c6TKfbZH7ezyTxyi/KMHMOd34JXQvcTt4nnWfc5LPP5EzGxnPk/lLnIVzziiGuq5pJWsbY0S+vhX7dILmuVXvG09aKbRSbS4pkeWxlvSpOIO/TtMWfuaAP3PAnzng/4vLzFIOL2XnKwcTlm9AS685gcX6jridOUC7iA5FmHDpNC4lkZnypzOleFqC7Q70yY0ckJ/r1mgJcnXd23wAvRqDkt5a6WdRuan8O3JpkqOWR5sYQZK4nle8ek4TFlDbOjHnH1NFdWZ2b9EwNsN7aNDEuk05UlfgiANQy4og8plXq4m//CgiHBlG1H1NjNx/qPpXkRMW2Jb5AprywSGh9cr1WlJ50raYTMHZfaL2lvhK4CwPk9XAO/VqNkVef3kM5m1d01rbTHJui88V+YZe8tO1Z1pmuyI8a5pThD10yGj5XIRg3Ns8UDPmjRhhJfM6G+Ht5JTfVdyPr3Re2fpfxKKMWT5jWsmNhiz2v1MKAI/wbHVH5QdWk8fru104XVy15/J3uHzhmutFKMorZr+isdCNnHTLxpKAMy58zq/XqjPS1ShCNQBiSWAPIrn3AKq1dcwiBkS7nRX/XCrvnJcc5/KPZ0lwqsZnHHOwpVeRmwOaPiYdT2yrzSC3TZ9r+kDOxLlwnjLZfGNvneFgY7KfA9kdOwfTTkSc1oQ+olFzdE/50PAj7TPOiI/zQbPGL8c73Ta6dN62b7Sj062zbx+01qJR23c+Pz85+AufTIrUXo/OxegK/YzcTzImGuBN+XEnl6XFxyObG6cSpPzCXD0kR2fiv+ExnDLKehGePD1z5hTOrCWD7FkN6cQp/SJmfZWr+QEj8h64BjUitmYosB4EF3c05XyDkJg+YHpzfU55syF+TfljV26ftbhy7YGJX1twlfJ225WWOWHU5dOCrjvtkzEGIu88rAVRDIFpfKoiYrTW8JdGnBBD9y3IY2rMLdVjxLARDfbziNrlxxB2eaDiqP6OzD1qK4TDnHH+4Dwz8ZmxrydzyUAbQlOY7kHgyvszMWbvURIVyfgWz3C9GkNe7eqJkzVpe7LNM3PHuIGb9TWFKSLM5kGcWufyfsNA1tjMTeGrRV4lGhNtY0vC0JH3/MoROm1BUUsSWnwphCmd04GcPI+/dFyzdrLshSD0PAvbuJ60N0PsyGamL9GdM2aHo4aoxpJmLmrzVkf/x+vPPZjKVCxNSWNET0A2NEeoxOYa464iB3skDiDAZ4AsIjFuRjFxSiPYFnsP/8h7YpfeJ2cWQU7zRwJqK5dhiAWT28JANhpNJAOnmkb1gFjvubQKLfSxgcX8ahpGxMGc8yX5UBt16CukfMxo7Gypuz8XWCaLQU6bnAVoSmic9pma5x4jaOU10LDVbS5zT5tWlrrr+0bHrUYkN8r8rnGwFVO33tM0pGqAV5u03Jg9n8khvjqE7mGqJyLIGYH7pYkBSrB7WxYXlWt1afRk4Q1OrOdoa7LMJ8ca/RxNsWUIViZ2YdIL8O7CyCS3FUs9700MiDlSDbQMADOZWHHwTPpKqG9swnEVBl/h2vwMJqHGGloJlbRcqqVfG+DJ/8/e2+1IkuRYmh8pomrmnpnV0zuLxb7/uy36YhbonsoIdzNVEXIvSIqaZ3fnAIvqybgIBeon/M/MVEUo5OHhORezQde9jGIjA6qULe/IpD2mG0rLvUDQ0QIMi/V1Li8Xz3sq3CCL5+mdlqCxZjCMPRNJnMl1INZi6GqMvOdDLBq/hNQUWaT0THKClf71EpM6IxE8JCX88gd4bm0VB/GeqrgPn7OZxtmRTFyHwJRGn+GDE8MtweybWQTt7pzL9NDWXprNCEOeBhnv6v7F615eMT0dXHt5dQxZkwqGvHT8z2x8XkbAc8kxXLJA2YeI5MomkiyWKhibK7QHxWJZ+td1M70nKBGxsljnczUn5Hr/ruClzxvA1ZBz3WsR2KxGb4lQNJ1t/Fjgwt729TxKLgmqP3Tm2aqreV/yLroKKGjtBmwx1m+X5EM1YICXhO36t+b6WexXrkYUZEMc8rlWQlK+SWFiHl+sBF1iKofY65NaI7LO2/I9mji714RBnG21B3DH6XjuaxNbjO8610YLE1WzmALtJU+0WFQjxvYJpl5dYpG8qCo2t7yXE/G0inSnwEqpCZOq5Qg2Ol6AfxzqKvti0rpckE7J6jVXxI4AusyXIXyLUeGYQCmSgimnByDWU0rP/IRiCspYz2olFOlbo6oM4L6ajyOlnhomsc58WB3LyzZp2sS04SjWJu4xHSx6+ZaELJVjGtMmMZIe78/F2X4gg+c9jd2N92iAZHNCPJi/TRunTJ553q6JBnhht44XcCZB6lMyMgqYrmYnGlI+F1wH4sqpKSWW8TeOlNyz4epLnEsZNFE0gfQpPQFqwdliHdq5pqbEozh2d8aYGR+UTavIMFoy4irptjy/8yOFmbNrsLuJ+NpGNGDasUdxl7moO+gxsa0zHbaR68VjAkgRfILfoFhsR88G8ReyTOajbnjumaEzzKcFzhwffJDyX97o3jCNWP9sg1OM4caR9zc+y9c1MMWYEt/fxrb2MgQD8D4HlrnCQMAfuEdMm6Zoc7regpEokynBvv3Gkbl4xGrHsRmsVxFBtSHSGN2xGU3MU5VmI42383xy52gVBwRN+emSsRKfuP9IgN3PHPBnDvgzB/yvuGQLSZ+R8d6kQKe2pq1MZSE0vsiT11raZr8aTwUOyVjnhYmiuYZfV3BL0A95ssD42mveLsKOe/7elSCqKTMbNQNjiy4kntMUWkxoAlStmdb6X3OYMyewBMi5c7FHvmcWAN6lU0RhXz53IV3cBHyeTA0ikdhlFSD2iLXJlp8zctk2Cx+J897y/8fXhDOJFp6k0Goe1F2LSX+5Xqt90tc512CmVOCSuk8TBolmHLVv+CXihhaoGPdwlsVDhLDwUkurAVJqzz38MJBQTAnZvcAxyg9jakrk5XuAYLhL7hvNBqYD+ImTJBXvMQkjqdzjM4S8PfZUL5xNPvOZdPpr8fAXXzojhz6K2FBrv1k0wwHTB9vIumF1GqEtudIgzcS6uRBtyQZU7JX8chKxXY/lYwstJfa4YqaH10x8LUFwv+R8JZvARZarBlj525wvHp0hN07mHT3JLCAaz0y407x8EuPDmSYVznPys+KL9IzhQZMCMG9JJisJW4iJRQGFacK2ZKSVzVIhQjVA+WlMe2Zu2hje8BH5oKrT9nf8POm9hTzYTRFpzDay2emktivbeeP9iKbs+3xHTFC502ej0bBD2W831Bo2GkLnt9vksw/ufvD7fLB9BmHwufxoZdV8ot+T71fx0YC2cuPhg1tNXeSkjDqLHBgCeSGnXmCvyQ2XZ/S3XVdjqaaSJ3qB7+iL6kblNZcK1I9yDTZE58I6q+HvcQADoOxRa+C0RQiNqTUBdnNqOL+aFuoaz1wjuTG/pDeDBCtoFvJNbZHxF5lCNcg7+fxiGjsadG6DswufImFJ4IS8qhkmnU2VuztPf2DD0NlXs+V4RF6+eUgYhj/v5NGjQfXO4PP8hGeHXWHCbjeefXDY5H7AnCf667gIMijjBLfG1JCiI/ESVJi+oxmDvBkq4QVV/QHtlyVBVJBZU+X6adbRF5LSmeSQVrKwLgu/dxV2i9c6MhcbzxPfOzVBNrNH0aRIvLfISyeIKaNUP/LTRZoSZ1X3qw4YWhZCcxFPHGfzfZ3BAGqDIT0sfHRwTPkS425y4R3GQDx9SnNRjXNbuQLo5UNYPSGBU7+SaV6vP6263saGSRUnsjRGN7/0PDP7zRucm2R7rEM/3k0yE7QKI1YDonkEbMkFW7/Tlh6xLFPh+YVhVuBCFQRk15pkjl4d7ngQvgA/97aAgkZbn6uYOYLQe7xGBL4l9IO7s9mB2B1PQKFuuVjPpsy8/AWs877MIQEz1ENvP3Qlo/MImey26CzWazUz5iUOvoxetcbZJUDBlT1lQt3tMoGz1KKX844VeNgfKcPxvH7HG29ZcKJko4cl4SfeFsL4VubBKxDFZmw1OsuxApSVvNGM4isS5pZBIhLnBb7NEezi7EYrYyUeExjJblwmpJaHSW7gCia/ZiI7h/P8gQA7gKYT9YnKPYGFbJYNLzw2OGaVOCcgukfpFwGqP5lnCmMk8+YcfTHDRoNWAHtOH7wbeLLBfF7sy9LLRW0x9ht+TewtZkisvRIjLEmGSAZkMSNiLcXItAAtizlrQAY0Mdj8PRvS8TomT47VeA8Gr4isBmQzo7WStniV6gi2D1hIYhGMxUtuydJDIE3ngXHOtYbCMFIWiA6O8EZ3gwGTQZlR1v6xBI4BXMY6kGoqZmrjPvSl6TCpCQhzC8PZ9JhxWFr8ggQQLi1YDA5nvwK4Mdc938toz69mxZkSZWwHRjVrJ3MEmP6WgE0UWFVkhtSOOyGhkc2N2reg9BE6sbf5IoPxUiD/CJfnGhgehexYAPBYYHcwI18L/YjDljF6zkxIRdInMJIXGTFyLxyLybpk2xYIU4lavh8hC5XJKDBbKuGGmtsu7756f9aPSHZyrZ5+rD0Q+6p0+a/zSoo92GYSQRyTaKoNU7a8FxvG6R/LQwii+aPSEXWaNXoWeO9HJH5v2tnyM49mnDkhdfjEeUUZ4WMaludaNw0CiobBedwbXZPMTW9IsaRz/YeURMq5qHOuzZ+mpR5m0hCM79X0yxjnvS8tezgCyLDJrAYcOyWRZAJHTobUb+wvHkiKLeAvEU+OxjLGDVSncoKrOEVC/ult7vSWU8MY4xx482hAubGdczUbvWRY1Hj0H+e8Egc/7wjGpho5GuHtYt0YRRTJKel73YcEk8L/w67PSZzTVZdCNg8XOFMx5yKZqNvyHcofIiiT8c9DT7bFuC7phrfEgNKrpgqKRL6mKmSRWgk2BCwXf2fSl9fRBVQ8tsgFXc51PqrD3TpyTsR/AUKGZPMbz+PJGCP2ijl+RBzWTcFgGtzsnf49TdyHMt8rd6o19cbbmc0uGRQ7X1YjvEOeNWM6T4xjnosxbSd8Pv+O66+8b8K38Y37/Y7v0T4YzdkT0BTxlQ9XT+NQpaSYxOGXBKXfPgb6HNzPO83gPE8+fUAr4+z4/Tec5xmvObbG9x7TOh/9wXEcfOvfOUgDYBNcYgLl0UHVkeexpl5K+0FEOFvcJzNbIOWAJY+4r+kQx+TyPPkRrp854M8c8GcO+I+/BjMmL5P4kj3FUAypeI2iLZsF5qiEd12tQddBSdNV/8h9o+QOu0HJFX5JfqgqvCSFZMnqDZkU3CK0VdPW65iEvLt7TLdWDjncwGGXfp0JGJZ1dEE/MdzQ1vcXGV37BRDq9Zq6ktRcy2O7ZDYFlIFqS/JGNH6nv0f5L9dZvKHXHsozeTBf1F6iyR0xOl9TrsnKZpOWMoEBpDlujWd+f3eh81xgVt2DLc+gRoP0vagpa/OGpErArsI972t9QLGXs99zalmum25i9Flk4k/OxEL6mDSRFz1S6Nq4sWHTKP/n2Oc5EW0tAGJ3ZARBV31jm/FZNm2MJLJJKcAI7PPH2VdDrvoEQKWmMpVWXh3ui9hVP2d8T9A2iMqr8eSxHmjh94qEVJ5nA71IRmqdmXKl0Sj/OoE0qcYwNDeayYqlhRfW/XQxdM713vCSfMxmVhHRc08rzpzPAKhVMXO2XDOFKfbSesz/lp7v38hJQDhbArjSUk4vapw5J9rm2jqbws7fALhrEUcmp6UFiB3oCKnpKYOP/e8h3TzfuN1u+PF3fH6w7zvHL5Pvj09Om5hsDB+cGNuI3PT+/I39I15Ls9EEyknDpaOH8fjWuN/v7LLRe8cmvP1ywvHJzf6JPuIZPRNbPOXAOcMXacSZH4SJzC9kBm4MdGtpt0IkwAA+2DLvaT6T/BhA/JwR01VK0WCuxpLnWdZd6Nk49BfAe/aoT8xPxqryfozrZrJIQqq6Pt8TY3k7+qBlM6lIomeuaShcNpu0L39b7YL2a3J2avoJyuBVMbomR4tMJA1sxll/NQpBdCI6mZ4qI2IcdvApQeRQPRF78G002lM598m2bRwtpsuHhISj/rrRLJrDHefenec8eZwGLSYDPz4iL/o7D7ZvB713brdY6/du+B7nX2ewNeE0o1fPQS+fN8xoEuov24Qng11fZKjnE2+FYV/rxlc+qsunWUyW5+GZo//TL2WBZr6IXG/Jj7BNoQhJL+dGyRSLh41CxK2TXvlWxdCXMz6mqzLGFkm4zIQhwlf7zGcaHolNGy3PyiDvWdaUShPltE80SbWbKdZ+C2+q7MVsIuzVDDPj1M9cl5EvBq7yn7eR/rTBZD2k8crUE64FXSlMf1mAvTqVLnljYuPPPJDq9rq21H731Rdx0pDMI9jPdkmwVUJfTRd90f4u9kglUXFzWYHtrATopdiYtMUYd9HQ7r0ePe4zOpSQrIc/JJF2DxYMwYYqltJMUEV8ro3pLutvtVwcm8dIqOAwZXlAnLMaLhcvynFascRkLJbTlfi2NYF3+JafKyQVRKAHiT3v9SPvtzDljM6y2GrmqQuzHes+opHgSlBpkXxm7mFwG4aHRpM0fxMWsBTPJ1pfQwOobRZmt6pZzCWLJ/adB8OsRWJYCZ65YFksSDJjI5I+E5C8Ycn4Qw90hs5us2uDtj/OVv/FlxFs5PjguhSRtmTNxIEaBWfEyyg6W98Wu3+e1wnhoqFp6juzPa4XWrJWeYmFNnccV4sJ9FoMjKURysu6YP2cvbi9B2ncA7SrrSwp6SIsw/NLT7YCqcezl5BcaEuS5QKQEMMmCU7HXtrdl6eLDGPoSe8pO+AxOdDTdDKSumQREBIFwiVT8dQraRaZlGQmRHH+3Htq9+aNSeAxCsOQNyn5nTCpz2dbh0UW5cG4MZCcruRJ2I7ZxdSyGbJhRHGYHzA1oxO4mXlgJPNRpC3tU+VtNXZDmjMncrxHsToaNwJYKSbwbC+yakPQBLjUtwRNDkqPddhcDPE9D6iQT/2xpCch4plmQUiuO5c9WSZ5PhRTTIs5qAvUsxnxX2AxkvGchHVCm/1VMs8duAoXE1nPcOrVhNqKJSP6H8SjAmw8SRi1Byv5tksXPJlxr9cCECS8fmZ+rX6/tW1JtqpFwyk8AmI3qe50qbjZeE+tnrfnjTkn/2wb+36jtcbp3/j2Fu/vd3vwWZMf5aEkuiRwlYEmJ+hMZn1v4Bbj7kygfAYyVmwTeoKAMo3pIbN15N//zsVEvPZjymGJwAzZvgBqZsiLEUAGkPDsdcZKTk5UQje/aEx1SFZymXKHzN2RTYxI+kRYRqw3NZr1sFaQI0gnZnjqwZ843Sop7Wvk/si4McW+6M7/1ZeLQfsAlFENCHdMJ69+S23lUMlGnimhNeNr5ARM3V2TOO8gAdua0JMZIO+8JIucy1NsMYf1Ara6dTzBzphgAmwuwEI8Zy7cKa+lIZJSXKSk5HpnuZ90Me/OdiyAvqYWbRuQ7PAmd0wD5NrPfB3vtEOQh+PT8JHrL8GwKWFIvxok5WdkTku/sqYfAcR7T5Dja9wxH4w5aOdMLX7nPA0ego4WUhZzRl4thj+ePDb49AciypkFpafEIZT0T9zXo9SZJHyb4vVj2jHOvY76JJjICibYnGje77meWWdrwUJvbcf4ezwDHEvQRsaRIbiz5OCs/btYGw3YZP9nHLi7s9dZ5J1nxor63xsbf8zh/+rrZw74Mwf8mQP+4y+zPMpFoymppa4CV9GsMe2lUYsHEHOuaScRYUtVjrOx5NlKGrClJFhdBTov/GH6ahTORSzyq4kLyJpWgGi4bDG9B7H+MwZvea5OmUvO0k1SkvGSJRN/IQYsIa8A0d2cqdvlQfIi2YzEK7gbLlfcqJ/Vl1hAK18YXnwrFdWxPOMibjtbeaa1yzeuJu6BF5/JF1AvVQbEdeW7UyymfSSwoGL5r2ZHSRu6Z04QmMVeoJ/LYqt7yuap9+UnXjUDFE88v1wfW4IM63NytshF3R1PfKJLeLwGlpLyuLZd95cOOf1cPnqbgbe47w85oM9suAtIgJj659Dc/95LIj9YfmZEsy/I4ZWAa0hr6aUgMErGjJimvT5RnO/DlWWlQRAOXkHysfRoyAZ8Ttaun7A6hlKmGCJGRz1mrfKTwNu2xJvkJacoQR11u6TFl5eNoTOIQD3zxQVWAmLbUtRRMaaeAbpqEQx2fA6aKt1jArKaLhFnlK28vIbCVsSJN8xgjPRVI6fUK98Vpc0ZTT35js2TU3cGg3E637//zvGWkspnELZta+tei+tqbEkqQ5h2mnfGGVN5v9wGIhMbkVe0tgVBnIZ5X1MxFS/FT0SOnAZsKy7VNLBMWdOgwtVslD0+85F+nSLCNu689YwTp2JzYqpo5nO0a6aiJjAbGrW3XM8HWBKj04X9Zdr0R7jUlCmRL0fDNd5fc8VeJu4PiXhb03wm19TKibFJeXHm7xuLkPU2Nj7KOqZwCVjEojY7kme4sSeOrVcTGUP8HTzir3ZPeQrnPA/89PA6dWdJY95CznHOCc2Z6dd7uHOcJ+epPHrMqb1JqIwc5nSdSzlGK+8bJ99HkIBdQ0J5t53xnNn41MCKrXFrSdwZivdQj+gzpEdV40y5uYFZ1iZBSniUqgTHwoRkNaeVZ8/JL3pM3Mm1llWv+9fFV7xZxFducYa749rD/8qvyeTpzsgzMPwgLc+47C/gkPsi1sYVL2PvNfD06FLAi0hX0pAnu0WzcKpzptLHzJ6A+oUdmVo0feyyKejWmS0zbjG6lLJCJvvDGK2UPv799aen2LAZYE11zVJvNtKtZBETTSZVvbSdPUyRo4udQYxXPVVbOulRGPDloYg4JX+CcPpqdQAAIABJREFUxDjdlx6QXAWPzj0MF+3q4E4CpPAEg6wedjKno2t+PcC6ma0+n19TN8GuuYLpek+5QffR80DTFx8HW00lBKrLXvW2qRSeRVZQucBZSWhrG3NO9tE528jFCOpHJl7JbPQErxK00FFM4TCxbImQmlsYlqWZLivh1i/LoGQEjlaFIKFvL5KsoQTnfASIpidoALLNtyXfUFqWg9hMZh4JhMcmoxjt7TJHPQUYM4NJgksjOqeRo3Z2f2Zyu+VaA5GSBbmKs6UJj7O117Tlr7/cT4YLPY0aNw8g14GdQVcJ9gn5rHokaacd62/MF7N7KRmT9sKqZlwJxaLmgfo9x7qVldyvpXoVn/6yLta+5fLz8hbax2aG58FodgWa7hG8BQkpEAcsAESEGMHN1/Z+gRhrD6vgm6U0GCvA35Kea5LzCVOYEk3JjQt8V9GQaDGje8glCVA6+82FmXKQWGOT4/JQM0foLxJnVfCQ601ockYT1R1vE81GsZecpo8EnyXjWezB4WXu2pbP2NntutcUIF6NbckDrKTdqslOSGwR7Nrdkk2aGfPkQjz2nALUuscivPbNTWSN3pY1Wpv7KghDaztiUE1mNtpVhf4g11ADV+QMM+tejDaxtVcCFM8JlcVoDN15APUz4wjxO54dJrlk10a7QDnBQjN6aYOdKwb2SSQ5WfgCIe3xhzxXvDMzeW5ua9+WrJMsH6BqIOUezGRBRV6KM6VlcugLMDKKsjT1Rk/QobUt139Hs+Dfh7I/Y2Ljv32Gb9E/jY33Ab135m3jbyNYLP9jg3+ZH7i/yv5NRsrBzamMFnrg+5SVWLVMeM/MGwDuZ2mCv3GTFgk1T2ZrMOB7SniZwGfGLdX+78gvw2UZYQ58SSXoAl/OpeU/PfaLpiZ6SVX1ciDlRORidkM0oDzh2ZhOy3hT3xcY6QXQ3Hi2cU26daFZCw1tifcie+QCHeU8z5UX/SiXSbG0Up4BiTDjXD5MSALhQSgSA1vAlYNayIs4y+9A/dKJbmaQ+Vtgtx6gj1dh9Aqks35neTeqYcnoqqkjU1YOGsWuJNCbZ4mPNekRZ0N1Uyy/H/Imseaug2nmOgqfmVizaiE57O6XdMGZ2vUi6AiT71gvStOWzPQnvXUeKec5bUZTp2kwc31HJZuzOjJBHPTTFxgaQI1xFDjXBgcnUyZjZI6ugArP8UCfn8QfGhzyXIWF6cXEW4zr/HfH2XIqtJnQpkfxaE7XlmzJaOz7GVI45Ku01oi5zM7W3zjtwZk38zmMOZ1TBbSv+7rNkqJK2T1xyixcTNGSm8yzdAor30eMEosryeuh82Wq8ce4fuaAP3PAnzngP/5yawwZlARbX54BtT6NE+eWbUq3mqsxyqNniIBF7AqrxwmirClp0XUQVRPdGatR4d3Wfe9WudxL14LLZD2+F89kNQibpZfldTU78ZxiDJZ+VPbFPo9avc7ocKcRkcVUlzkWKRfpSHo9lFdUTCi+5rUpobSATsWJcbAp9mKBkHutvClFOEVi6jVuBlryVHYB0jXlp+aUv1rzkmNqmXunRFA2LC4C+AjMQQRGEhySXOXudLmsBuZqhJF+XI61B/XUplyYS2EG2+zrWXZRTjeaKtIqh/Ylgyk2I5zYNTkTzz5zm6nrPbxZnWtgGg2AQ1MyObEpEeE2dJ1dP8LlzJrpAWJNRF6nkF4r0AL/I3K9iE+vzee4L/EsIqduZkvOLry+EiiVavWNl/g7KBOmarS8queEx1j9bDWVL4UAffFKKZDWeS4/WZG2PNg9m/Pit4WtidkiJpbUqTOKSU2T3F/OakKaGzs9QosIkiQj8wPFEW/hUQ7ItoW0HRVa0kfIAv/qckmNuQuHHXTtKCXX/eTsxjEOvj0++exRgzjPOGvR5VcYU7n5LHOqFYmphdh/HTsDa2559s55ckyPqVpp0HNaMCUETaDZjmUjdtVdU7Ke1stCBVtk+yNZKe7xt+Pos6UIgRqjeTbrY10MO9f+bNl8OUUXiSVy+iSvzSITbqtG+1GuUyb9ZViij3jPm8CZzX7zOMncUo4zG2i1FpSKFS/xorBkhKde3nYXGWGlQPHjSyo85cPzGeCOcizlMbgR1KiDOeM8VIRpxpwzvGVbQ0ZPH63IJU6PesHPrLvHDnNLtQLj6Wd4F6lyTkP4zs02nsfA54bYpOkNPx+xtU+B20gOjSB+R5lsmr5dmr5AbhFTUpYyNmJP8nE1gfvyaZw6QxEt/hWeoGYMKe+yysyg8uZwVVpgPi3zsSK54tFuqHplrAS3zrRzxfqOv0guZ9MKjX1B5AhlCYCQTX5L2b749zxjj0jTyL1HnIWqymZtkdOeqQKg05EWtdthLfI9UbY14HHJIA898VnWNhkrRS6Pw//g+tMG0yVJFx/wPvKGaQ8TR2IBBV+mmF3KwJcMQXO7Dvh8OqZQRrHuwZxSDYbs6vxl0KkPUEzUSCSu92gaLaIv1AcMcUMlJqkWYFeTRl3QkQ0oLhOwdaY3BU8jYglwqpotsWiuz3eK0j02y2wh/RHSAilz4h00uqnLHN1t+RbtLhdJU6HMiMVCK1nV2D3n/LV4TwHkgeMp44TE75RUSOllbwKWxbnrmaDl1exDXiV/WKDkjLlxHOHmZdgnF+iiZfTrK5kVOTmKCfuis8voESGzGeYCh8IYM58/axoq3tDFTHEUl5mLeKAtGpDkyLRosFPj+Zwst/VZHWYWS/NHuaZX0jLDfFaeyBajwM9EiqUJNqIQlxXMrhJFaFfCkV9TYenzR8ZaNJUEJXxPjkGWrVYylcWme2H2yOurxbVNXQFO+EDtfU21RTLT1x4NT40WzV2NJAdra8S0UQZ2LGnt11frBksb1iKJPVS4j0jCBVkHX7BY9MtfMBsERyI+rWtMf1TK67IhqQPr8qB5mkta7O3TTpDyhItCUkS4V4DeoKQ58TRdtAsMndIWO9Rd1vhuQbI6WU0Fk5PzD1MpprrAo8jNr+LPHSap+U9Oyiwq1sj9/1yftcavC5QQBAb0SuywlZ2LBrhvh7KdeYjoxuAzfo8yej0w+ZOT5S+4poG4hd8O5D2H4Z1RmlwWAGStofxNmJdG85AkACz5h37JO+ALQA2Z2Kgq1tnhfZ1FzdL82S4m6BcvJy1ZUF97NOGk/DxpYA5pQi1YUiJqQisArRaEDwfRSZlyUvsyNZzrj5WEkLAR00Md9XsU52OnZYNp+x1ElLf2xi+ysevONn/jm/wdd+dTf2e3Zxh/VtHWr/sz1YHLxybqhbZY7IgnQcO5nSGV9Ou88evstNa4yft6Br+3kgX7tg7qkwv0OVPSNm5dSW2MxV6V9IhCNRikDrTJvgC2SOxOtwVQik7sxRsr1n2Wn2b00aCH1E5NSumcl74yJ2VgHbNLAO/rvMRhzmhIPDpYs2zG8UNdNSEHvJw5l8wNxWoiGNsisiZuzD2KAP1DfJOXppyCrFgXORR+/wLC/Yfvq4zYPc5UEM6UodLUry8WXuWw5xoPi0nDr8AfCQ5FbHANCR3RbZ3BkiCfyRNLDy8HPhJcu8/Yk8iIguqM4spmJ4zD4/0cPjC5obph8mCmhNfkxLOor6V34Mwe62SbIeMXU0Vx5px+MLIw2awx7MG0ue5P5NnxXg+cwY0zAdWYiJwZl/JmVvKV92Ufhubzu7uio6E0tqnY86TbyfQWz6s5VsaxvoMpzXfYnVMGn/qA9lzNIGfSTJnjlnnBQRNdEnuqSjfDLEqa2TR6j040JhJkdytmoKMa8asliSnMuH8gRjg/c8CfOeDPHPC/4jK9ZeMlIaWqbec7o33g4jQT5qxmQJ7bHms9GvYOogxzgkivdLsAdnFj1rRDEUK8Q8rtmkxIMHBY7RVY3bx4xfX/Iq+ZLPMxLgWO+jn3QtAjpxW/5+f7WKBqye2FrxRrlxc56XpNw/sn5NkVzz8nfVXR2di8PKYCkDvbwdRoWnYvvlLE8P1IhZFc2ZuEt3PkQAetpKqtJhdtTfFXWhAgd+ZqOle+fWpIPcsLkDWs8B4HlfTwrmZXfmotSdUTcrp9Fg6ymhpxfwv4Li9wIbCKeIVghptZEHyzwVsT1ZvBmcFrlH/15EXW31e+feXgzqWqYwmOCzICyzGB0X8cNFzTr6qmNVf94hNLYpY0XfngkJL+jiYQkJNmsS6jNSq4W9YrmQukLNqaapLjqhWSUPB6iTTGskjtV44ml6eM20hw1yH9SaaWJ5esNQss0g71DvIcc+BuhlS+V+tQfb1XpWW9A9eMVTWvrhpx2UJI2D3sGaea9ZUPtxkSi6oa98otcse04Dglz0YB7dEMO4HpQWh82JPHOdi2bZ0/3TZ6TjrgHc+64zhyz2/O9niPfKuHP+JJEKLwiZ0nzBMbg7k98BF1aE1YRw3qaNMgl61ucMYvq3wgnmXVw7f0I3zKQPL5qHQspfMm0fgCpbctp0mvKbnDYxihJaGPBN0p+fiMk5k18yNdLsbwzlJEl2qDzAqFzD6XmpNaBPXXT2EyGNVEza/NbLbHvbyw1OuFFZfPXNv39ZvyIquHfgDOyOY5BGFzekjRqYJvxrMbMhVXZ6bksvjJjZDXtyac43PFjZKlk2yoT4TWOmbOaSeP88E+33jO3xMvf6e58jyMzbaQb/tlwhRa78Tse6AZbgKumJ2RNjXYM87k3eIkCZ85uRcN6JQx5r4sVq4io2RuHW/Rr4j31de+1sqhXFHbvtTLItHkgoiLC9t56W9s/p51yiMhjK/r9HXycF8+dNd3t3y+h8ga7Ngs5Vg1ZKZBQcGzwbYgIjJfqPMx8ZbD48x9n/tS92nSeI6KsXlH1ZcH1X90/WnVtZkDc4EFMxNPd7u6xQSzOQ7gKALEJ1YMoR4P/QvjsAp4Immu5EuCxoFbJOMimsVQHFhD4oi2l+RM1fF1IGVX2xxqdJW+GksWd5S3EyyNhJuN1YDRNNGraaNIepK3IBIahi08MGIU1DGFkbr8SoIL0xBuKetWQIpyWCSgt75xEsCD7NtLhxmMb3GI5Efs+1zj5NJ16SUGOAi979hZMg0TTz+BPT/z6TDtCD8QMVoZ6VVRyKXxCB2rxtfqYI7YGFnQSXR4UL/lprq66rDnYfByeaeJoirMzZmmPMfIw3HDTBOwi8C5RtBTU97lyZzKMWfoiEsxKiNBM77nsweRjTOD5J6gVyQ7/7kJ2V9xqUaiMPrJ4Fyg8+zXVu2m68TYrJhrxtlY+9ErASoj5OkvUkWKpdeI5+grwgtg+pL81CTHS4ErKhhf79vRbe35KffQnBdZAVTmDHkoiYBW5q9Sa0kuqS9bHJdgxUZCWEABoJ4sUmHTAM/NjA+PiZHWG81q5NzBjKZX02DqDNmYObNwinvgy/srznOfsFgNRHscS9Z+Fjb4zpaJajF1m/kLAPoCymSRh/TrEPAO/hmMA2rEFDSj9G3qigHr74gu1Mil5yER71AAnZdRrszJaCV3lGP29PU8m+/cqtD1iL5DnMmMw1L6GpWHkueRxdYPUD32uPotgD3b+IF8aIE4gBVegFWht4ayc2vPWAuca5pleQMi1Ik7Uuc2UgrNGGPrWUY8LzSszrGY2ol4ehUs6/+9aOeaxvlViT7uqHTa/HX93qi9WV5HjJV8js3ZToeW+vf5CZCaHs7MAUBnxmpheTS5X5MVHtVBd+f9GTHp129v/Pd/fWOMwW8f7/Te+XX7lbf9xnZubHs0owDO/W/86zh4jidnxrRjPjl7mawbe0u2Y5f0gqjkDN7nzq/fA8D77x/RYPo/z7/x6/iN2+3G3o3f3qNZ8W/9/+E8T/7F4V/a75gZ3wZ8JmjWRnlElXE5mP0aLHh3ZurLND8QCa3wfQpCET0iLmzoIlycCjJfY2A0SnYP4T/bQkIPWCxc0blko8S2LHwDEBIRpnRmTcNJ+OWICEHgFyZ9FQw/wjWIYtN6STDKMkAmY2+fLHmHUYQiJ2R/VILxVvIWADiGfgEMdDHyyhfsOo9eGVL1O/oS3za3JVUy/QQRmmywZmU6w3PtywvUVzLI2JLCatk0djwKp8zxqkExehB7wqC5r4btXozz9ha+OdZSJiKAO8+C+RTH56B3OPmfnI/v/CIb514TenMRu0onXGWwnT3zVWWf0Qy++Z3n58Hftn/iN9uZc9LsxCxgPL+FdNG380QMWu9oV3qf3NrISUzjSH9qkWjK6SgPo1rTnoQjMLuxy53zPJnfBzKDJao+Oc+DYf2SJFLoTbntO3P7jqth2ydP/g1zQ/lg76TX3SPOeIFTRgALhLzXpC1JqNbCZ6rM1lUbai9yfm4J0ERhWI10+uv6++uvnzngzxzwZw74j792oqmpKolJZG0vH9kskpRTynuVElVFPBBJ8ml59uXUmHGsybIpoeICgT+IRM5hcss9E5KqgoDWROyFlzTsaqLHu8DZQrpK4vtz/Wz+hEWuUeROk+/xuRIovsAyOL3RknzUPJo6aACxK0eVax97NdcEDMf6ZKCMMRA9ApvSAPSjSXnd721e/oUPLplksqWy+bbsBJodgHCKpR8NkPffzBipNOLWomEhAjqDDAHgeQZKy0lWpSYcckHGz82RU0MQDbbCL/Junr6mXCPAWr7fC7wr/KWmKlRBpsGEnudLay3ymvQ2mektaDTu/pbr441HTla1zPusTfb0MXvTTnMJPCn38ql8kWD8q68Vr1cPUBODakjm1Y5BrulSFYg0osDWyDXqrALoU3D2ADqzqQtXjjdNiAa+JrEiG3k1icGLzLKwGnVKNm3tRMtfZTrIt2wqxfcPaZwa+KbayR6ap3FWNICYkhcRHi2m+EXkaur7ZbUxfWMbq0OZ7zMI2CIwGDiC9pBfjqtzenrksS/7i0Mat2Y8zidvFpPtU5Quv+AezdmHxOnZHD6PE7PB4/HA3fnXx7/yKZ/RPBjx+cY28ogXBg/mmX7xz8Dc7GyciU+2Nnh3sDH5PFPa+reTD38wmTxtMPRI2cdYFNt5h1bqRX3ZoqzzofXVYFVa1EZAL89Sey6lpFhP0XiaLSa09iSi47BJxxbTvuTu83/dOd3XxCpy+1+u77/qshZxuhrXMyW95/TMiZ0+Y98AzOVT29FsBDgnJJmuZLalOeUpbdLYfE98OL42NBqYEFhDkYo2ckDC55pi3lw5c3JzawLaGHdl68Y4T7bdkWm4GWYzelG+cfRnTADz5LRPxhh8f/5bvEf9helKb53hDcTxDXzfUIHH/zy4jcSmxdDu9C4cPNhvnZPyT5psc6fNjnqje6ipaLum2B88Qa4z6mmBG0triEQDJGISmCVBSoU3CbJXNKXivk5R0IzVef82vy9igssnvsdEV61LM2OvhrYZ3nMaye4pixoKZQCjtUViKenRfXY81cQ2P1ezb50Ofk3bijm31fgic+w4/6ezPDUNVg/cfQvZ69wz2xYyhpKZ5bmdzFQsmGr4VgSOXF9jfukg/PH60wbTLgkCzGjpmMQRPE2gBctbxNbYlSSbwaPHHDfSD3xt8jK2yiREgtnwxxGrXbm0Cgkjx2B+XcyTGvMvDcu4WxdLnAIqnKVNXAHOMdBHtK6kUQbbNWkY+NA1flt/3zVYRoov01lQrMATje5zNadMQPwqAt7kjuOYSzajInm56qlgkr2SwkR6AACpJz6JUdnF3kWX5qubcUv97JAwFGDEGLZnoZ0svMROsflcY/DNN3rqFFdQMxlRMBITAXh0hC0PDPFJmZjNxlVQvrKPk7nQzILx1kKP2STMe7VHwJCuNMt1ZRZyKaZsrkz31A5NFlk+FPNrZFlcF4vvSFmbPkNP9Ee6lGDXTP268IOoUWPYO2Wc/JoK90mOaryaFiY4Ro0451isXM1SIHXEq7NeiZYt6YFtsgws/3hFsuDrvk8aUiyJ7Po3pzZm/ExhbjVG7i38ssgJt/KA8WKeVbIfTBzlRQJHJA5dVU4LRo9m4A0DWQv6Ltfe9WJazHhtPD6vCtjs1+trh5T3PJK51/sOY+RemgtAKQnJkWyBCuLXyGgVqgZejCNL+RIo9wPjMgSc3pYvwNEv5l3zy6Ojvl+M5XEcbK7hP8DgUYUssS8tk88qMkcld1UMerw/CDZFa4Z53keJWKepHT5asEQqLrg7own9BzKiheQvB2sh1oAWSHDkWg3GBp5SNslMfD0fm7Xle1CfFRGOTO50LjrDitPTlZIigJcJp7z8BUxXD/3fCKWSoHFD5OVNyFdJ1tm4zqKSaBNZmNZi0ig4mbBlAytJOHxlzyaYmf9/N2cf8azfT0UfJ5t7SNWFw2yw+9RhKHNsQQQ4voc8H7ClB8zkYtKZPrFZwO57mm4rmlIH29jZR7B37o9fEBHu429s7Y7OTtM78zyYwJ3/gzcVfrfv/CKD006++7UfpWT1bHLkPSlgBzL2qcJM3XcnPXoS+PeUKfHVd6B8UkQkfRqDPfyw8r0o0OYaOdpnFKXuEePELna/iqCM5fvwUMcloA5NEOZt6qsX6F9+WRNisSZolEUeCJcVi61YthUBxIiCnAAJvvJOJCbTX+7b9f1ihF9r3vEEN4SjzEf9WGP86sa+ZNUizrcyRwYW/yXfv4ig09b5G+/laurEmes0tsxxWRn95SSqCxgxgZEs6d2imLO5E0AM2KwJK2izjMgNSVD3mAKDABK6w5nrZR+owvC6L4I0hWPPgi7u8813thZEnq5g8hvneSIyOY6Dv739CroHkHA3Pt+jmDHd8v2PdV5OZpjiXh+ZkLwukzrHnjM2+UwmqgnDYSJwngy2jGsnTOOpJ9pObrcbsxtPQrbhTJDxaE8spd+mGJKSQWYdTwkIqeeSS9FFEAtGpYm8aKMngOrRqAhA9vnv2M9/9fUzB/yZA/7MAf/xV00cac7AyPJTuQ7VkXHnFYiZLbwbRYSOotS0QrSSbK3PaO8VUSGkeACBZ0nfizBneA1vo86o67VcRwA/QgQzITw3XpqVIpVP1RQ6S64rezfxk1rG9mAlRedBBIlcuGSegWq96sdShcHvSFPOOTiKGCTC++wxdZz+f/FZr7hR/z7X2cRSdZlzXiSuNldCdZbsvXvU50CTAzOFBmrliRoxyGFhOnVf3KP5EhO1V5wQkUutUUP1BGAk8Br5YHz7jqzJjm016a+1EhJLV9NuNZ4zlk2D3Qlfxc2YYQSwcIjNFMzX+qncuD5/98yr4q8tSeYjm36KsEY6f4DrwsGu59cAkSsmrsFXf82RxprkiuZMi0ZcNRKn09fzjckVdw8MzT1xrmj+6ZWNhMQbMGRli5AqN17YnJC1SciBRyy+1lI0imoyCNw7j1xAvcBXHJMPRITN7iuvKAVtp9NGrNk3V+5JRpOXM/i5xfv+0PQZml+lTmeoC/Lwg33sWbee6Iz/xDIIJYzAFkNlgWkxpd5TvkpOznliZnzyxOcT8RbT26q43dYE7bt1dL4QIswYx5MzCRT3zXl8N9QNS9nX2y/CtM+oqfvBzAmmFRObskiU7kFUj2CTTYWDUopyhG6eTcoAxG/e1/58yIgmnMDtzL/flTHirN6c1bialPxkxEfzmISbK2HPZyqKXS5rP8TV8xlcsrfk+uCSIfaLFFckqxMuVRJXukdzYctzHx8XJu2v6hOlvOJLLm/ohVVsLyHHaqrS9ZrGFGXMAW7YiGyim3DqiJwhX2vkZHNz2KRxzJGEshpMMWbLqScGHWHOwaRz2kmH5WkogyWrPh2Oc3JaTP6oCMc8ApsgPpNTzbn6JLrW3XzJd6retn7Vh5PAjFvTVF7tIDHhPi1lnWdMBs0lLf2xfNy6KKPidhK7cHhW87Mf0ZQXYbcNkqjppVTTznXWWE0tqbFbqNdMl0vqvyanVagpYzErN59FlBw4o3xYveNNIs+QxL4wqCa/HuAx6R+E2ZCtXPLpPuI96KtcMKj8//RgijeltPLViQ5K6LHPK0nr2nLCKU3oTr26arpdUioJTKgbMwNwaFBGYN1qrNonr+a+IxfMWeICIn8wws4Ep0b8nPX6ahcAVEWmE53bYDsYlsytPSg8S7/3YlV43YwInvjyWBK5AEW1TCDlTK+PAKSKk1isFJnGvj6AMpL5MxF6BoHSxTT3KN7MMR00uUexXQyrTJ7nnAyMo5fBYk6QveT/7hKfDdLENe5ZgZvd61C4kordGsIzusntDc9RowLwhkc9Wal3y3HqVwXpsx9QoGgGmWokaQuWQ/JR1+u2ZO+tcWsEnRu9jKktgq9Ku3Si/R6yGKocFZQEqtn4o1yqIdwxS5+7ZwNx6JIq2VzpLd93HQYJ5tW6vBL/CFQm0OblRYYnQ3T5hERxGMnVC/OTSqZfgAeb6xnOLIhpz3WwO09U3yCLZCcAfV0SO5dJ+gI35EU6QMfSn7cFUgRPKe9S/luw1BufnmgdcaCGvoLDHPlbyQCQaBSIyzqwRQt0yCRwE3Rm8VHxyRyWtnnq+VNj4BljcqVvbi9Fgq4DgWTLBZB+xYg60IsRPPLvBsizEbHCgWARdYTuse+E25LXJGPcnY7vBjIz/f5MeZdI0nXGcwtWS+dsr3JRCa6sdaI89URE2eaRdzIOHxUP0LsK2lhQ+GxfAOIf4Yqx+xr/FU48JPNUUS8z0pAdFYLJHJK+F/tJ/A31M4plicToJAy2IeW88mNL/o4SB37Frmpn17qPp3sVN7omo3ztz2JXSvoewgWEbHYZtE7NpMQNT+aSml5AUbNcq9de1izW4t9tjUH7UfrbDbVIJn0afSYJwUPfWSw8c9QVa0LjDjNYOGodtU7zJyB0gWmGujOtrykrzdjubDBDVq6fb9zPnMYYMeHTuCO240Px1tCc7LJkIf3W/2/6PDA/aPa8pNc0J2EFWu4h977OBhFD3OOMo8zWfbFja300B0t5EvW4Jyq68hHxyZ7sMrXUN26+Jp1mI+UJyGbGns/LMYOtdU55RLPOL619LY8s2Va68SNcRsc4opEGqD9QAWWLJedpXp5rsUB+c1TxAAAgAElEQVS68KQAMq5XwbD0op2cwY685I8NUJF2ARoazwp3ZB5RILWBp7mo2LbOsUUGSsnI+lo1jooFOeVl1tD7AqTKp8U5YgIgf6cAqQK84/3G+Xp2wmfJnKeEIfmbKOeMSa2acnB3jgSxOoKOyIU2mzExUOexGCSoHOz5vhps3fYgF5kzvzXa8ca23Whygxms+dvNQ1Vga7z3zjkFTybr437w1CciKTmNpFdOHNsmuhoMNq/CoXLiZjs6hfM5CTllYRqMY0bDy8FG5GCjG05D/ZOxnWxvO8e9cQbOdPkjeINk9oXYZ0qJZS4xdAsfJuLI1/R03TPffmYjRfK9PyvfHsk+l/5DeVrAzxwQfuaAP3PA/4JLDJl7NDbwJA7kGZvNgiEauZcIltNofZRvVkoIypodWn/aJP6G2AWsSsnDutJmNNbDd/JrvKnaf02qeE3aVe36An7KIGph1ntykXUuxFU53i22mg20pIHFUN+RajKtv1Hrayddvll+ZLrR51j3SjQm/WXu4LF/i9Qa+yhOSdXLkL4+41yqNHnmpSTwfTUbwPrl51OTeb18saUt1rhDNjMuoBQP1nTkG+nh5LCV/5uO9LkWvJ0xvCIhvwrw2PYVgzIq4i/PWVw5M8fD7JomKlBND6ZpMPSlI2fYMbT0x4b7NUFhtd/CtynWSlsxVM3X9PVumsSsybjKhb/+ap1PzogzImuv7KJrgqdnnFG9PBjFrliDXKBvS4nTSVugtMsGXmby+XMea0oIvK+8rNzr/LqeWbQ3rgYt5H7Nn3E07TBk1VfiQcQWkgxu1dhK7IwnPjPaSxCCAMpGoo+dtyP2/NupvNse6kEz85+3wYefjDHwfWfIM+KFxHuURLYDSwusykk1hT55+gPzuleCysBs8tkaLjGd3tf5efCUTx6PB78//wf3/+tXpLcgTgCYU9Lp4c3Ylo+m43weHzSimfwA9v03sMl95qTJ+YGd0TSvRnYQ7ypvn3ih276taSwRRzXkkdcWk0FDaBq1t0iqVmXM3Tym4KLZa+v9r2k1lLts1NCBTcuUIcRpBywJy3pW9ho/fpCriD91CqdG1JczWpHVvA2SooJ2ZjUIPLdLYuu4I7ItQlgQEzJvqQP8RXpXw+Quzq2crN5EQ8LUAdvXGo1fVU53etrIuA52nGGTw7OB6sacoWZmo4fUL8qwWF/OxOWJS0u/tlBfOM/JnCcuN9z3q2kyssnWOsOUR1A8MBMOAZPJmCOlTAOfN09iTUngAbiFb2Te19YabnNN9jXAfeJjckp+33uoT7gsEqO7s2cM2SboVjWvUZPwRXY4va8GT7M9yHwqnC0Iu24ejR2gsPEiGXjm0FLnOsrwI2Js7QtXSCx+0wwgDiE56uCjOFec6Pr8lferNMqGABT3hogiLXIlnUeeWaEot4UpJTP/RrO2+kP/0fWnDabhlnrNqY1ZX6fT0oQsErgwibJsLvQOc0YAEDvxXMDWKrHlxUwrY4OEhJ2TidAyPW8lPXwJKph+kUG6kq78tugC5GLqKsG79A1y6aDRgZUhadMlabQahUUBIc3mKu4tC5dKGOLvt6vzGzojOTYfD+BsBlkIH8WYGpeG75QqXpzZOpKMt6XjPZ9hXq8J+EnHuTqVbhYsPoU2X6SQctGGpFOyGLWHB5JfBs6mtthV6iyTbIgA8ZTJrM6/fCA9D9eUpgjGf93rgS52Y01FFfALbucyw7b2+vyV4YPdgtkM8MzR+QLu3KPBtoho2WFFSnYJyCkvQdiGA8GSPvV/2Uf933o5Oz4tNTIV88k0clQy95C2VfTWATFXoRGBZMvOdQWLGIPMZHp2JAseSzaeMcOUERjy/HLg1iFvK3Bd8k81rjm5L0CgYVmA1u/Hwd5r/UmAjcWQdvcv8lPhNzEJjeuUhjCo0dJml1xjvUqjtJ0tvF4skap2BfXVxMXoNulCyCYuffMCCY5kyV3yZ9FATuaHNTaN128Oz1yHVpJcLouVa3qZTsazgGIVRMINzzV592LOni/bTSIeFVgLWHvm0EA0cQu82DK5RzuWMXjqkTGlCLwSB0dKybgEe65AbkjgRPdkMYSfmftlIrgT9zeWmmfDvI5hmDKDefgDXaYHavvFbmqlfTtWo6PpxFc8qLWwMxIQ7+oM6RHh01j1qY8Vw17XaOLnCC3Yl1mIo8VEDIDavF8xyqEwqeaRxJkeV2LZDKMKmRfGXa6f7g3zkOSoaRuTF0JHhUUEz+R9ui+ZEndHeiYMe8aVEb4Zc0z6mWxBh2lPeu/Q3nDZOKdwP3Y0Y/d901XUf/hzFWct11D3tuSEZGU+wAhwtc87mnkCdo/zmEgkgy24YzR67yGp4jD1V27tN8b5HeMDbTM9Auo8nSl3JjQGlmaWW96TqdsC6MBXvFMPOcFjq0ac0D2SMsPpFSNkQUVAmBQXuyfWki4gsGg5AJ5TWw+UqUGoOeVBeQWeCX7eXyeyf4DLm3JagN4BnoX077CQukICiLw8xvI++FXIz9aZxP2t+HYd454gkK+vx5oFK1NsoOf9HXsWETJXXvV6Vq3rJSWcctI8NOJnNQcdPCd4giWYZ2gB6ewxne3Z9Mu85Yr5BglYdQsAw3E85SPHGHBqyKn4yYxAATmVM5E1KXmMYpNlozHvRUknuDTwYCcOh81DNxuJ3E9OgjHtyertv9F73tsR3qimIf+sLerL1iQAaVXUR5wuHrloTYk/qzKxd95mTFKoOtiI/6S85MMewfA1YeJMPXONdDDjtsOzgfjg08eSVRlErjtFYtpPBExx62tiP66xgKJmSpfY89aCTfd+GqPdA/w9dz7kW963lDJiWznuj3L9zAF/5oA/c8D/muvsjzVFNhamFuQjFM421z24WZFD75Br1HQsCaLyWpg9ZLSijrYg9QBks9uaIVYgqi58ozyqrF3P3HQsgE9Sbs3aq8qGXedXnrHiExi4Z/NLTkRgrsmoLRnigsxb4ADONe3mz4U5tPMilcqs6R4HvSWAHx4XAqvZLcgi4UzfV2MxZFbTP7TA3KloK8nm8DR79ZUQdTzltA6z1WAa+ZxaA3JiTP2BSMv8OKbUp9vKffvsDMnzJpnWm2Vj2p27sdbolKuJV5jFKdDPAlNyGqQ7mv59iNHzWe0pgaZt47EXaKmrGTn9HTwaBK3idTZmVIVTw2tEpYGVbNWIGAa4jnX/z/bjSHuZHHTrYPGepKTc5liE6DkKh8vJBxG6K56EXxFhzIibltPYjT2aOSI0l9VMKCnL0IqInw0QOOKTFaL+4uupbgvMXERyv3yb1KMx8RL+4UVauZty5JppraahN6yNJD5k/CDOFXfnfnZ+e8ar/vPjjd9GTkDWG5mT//dv3+M8bU+e88Adji9wVE6uSAvMU6Btwk3v2H5fBIZDJmjjnA7T+HZ8AnDLvTfGweF/5+PjO9/0d8Zz5/6bcJaigA58lgSfY3YybfJul9LTOD+iweQf/PNtj+kQ21P+2njMk003bHZa4NocpYMhoZkUe2bQcmpQrSYJ7WUowJZE8H1NFQdhT0T4bDGRXvgeQGODtC9pGPi5oNhYGn1NEzd8SbtKSu3FiOd/PmnxV1yjBXZpll7KWOCZAOn16jrSczFrFyXq/8z9Y42Xd1NcQfbR9TVdCl3VWAUtfLaIEvWmRFDv2BrmYOHTTaJ2UO3su3EcR05bOj4NpTHm5HDBz8HhJ89t8vYWedDn+Ma+76Ch7lD/6W3DmiMNxvPEvDOSLNZnC5LveeLm9A2cO2ZPxOZST4vPddIE5AhJfPOoTWvifnOYM/bzrg1sEEMXcVaZ6Lof2l43qdKa0k7lLffLLWu2t7Yhj2fUcd3QFvnYg6onY+oJAvdp3hGX61yWQaUS1f6tfkYQooXHyocjA5xubJJysbMteXdXwfTI5m9hLVBT+g1DfMfmRGyjhVhzDqjEWd22W+SsHoSpbTbaavwPTGM/jSRKhpzEfw5Y/Cny3qUjsuHWv/wN5cAtWDpNAiyKjZ93at7pEOOKciBpflkMgVcJIRNFCoSppgdG91rgH2zsOM6RCYxL+BS4O/dxsdN9AXvXweNiL8VrtKiavUwdiVPayjHNkx4DJANGAE92xmItXclSFV5xs0vOoicbIRo5s9ifyXbSBFDq992vBaX14KqYwJjZuLPWmBITXlHsB5jlI4KtimA5DVUmmsGUJZgTNqElS8Zig9i2rwbUxOg9ZVM0upRP74zs/t/njWBkSw6FRzOQfC77GGvjtCydpr40gMRplYT6paOJKp09ZAV8BjPoDCDLBJ5yBLiisiaYWnaT1ZXqtikHLfUuNZOhp+Th9ANdKo5vsu55yTM5G7ccuW6qjKWvXWvhmm549MZM0GemHKByoHNmEnYiWzFNImy6z1W8nq2vhLzYCjvtMl11W1KPJBCnNgLIEgW2l+m4KzFcgc3DWNss2Ga1Zsq7VCrhk5x280iwfSXbCuWTxkjpzRh5j6kNIaTEYt+pgJsuL48+z8UK123EFKGAJzjuY67Xx4jxYVHa/Fvc/9YCFCUK1iqCSqrHpq+CX5w1vlzZq1uLg80tAZsEJWbGFl7Y9hq6zKGVnjHE33niWbAaMsKr5pBLurM4ltvcl1+PccVR3XKtCHEYZwId3zwQf9AETu3BNkmmq7tzaGPXiBGPDj2/Th7QzaHZa1H8A1yyA4ZVHZnAm2ErLnURSt/0vsbExwLwzlxrkB5HPrlb58i9IGKMTNrvw9azEN7i+ap98e3xZFn7kum85PLKS9BF0SWJYesMqO3V8uwqZksxRlTI9TFeCqlrfBlGNps2oJi2G9Oy0VRTrPMWAMs4GI+JHyFnx5kSEy7s+h7s34cx/AjygU58E8wIIBOwNleme7aBewBsk2DE3LPZZxZCPu2MRPV4fLLvO9/kybtvbP8fe+/SJcmt5Pn9zAD3iCw+enq00Pf/cNroqNU9l2RlhANmpoUZ4MlWz9Xmjm4t6OfwkKzKjIc7AHv9HyK4vTnmB4QTZ37+K5Rx/sznMEaHt6Sk4WqgwuM2fse3/IjvZrkwWQn5iRR7epR/xYe/k8XhkYiuitm+GGxm9J55ghB7O61Bmuu115pF33t0yaNYFVrhwZOO89oNWG3Kp5zIQrf8CJd9cqK09gVhHaDuyZZojQPZaylRYIu5U74vqrhnLFvnfw44ArMlabF8EvL1LWwnp1dj694/52rydoizUFrKncp+bXgXS97bLsIWUyzUUfuzL096ZixEue7mtkgjbA3Arn3+3SgwWIfOksFqATEDcUlmvdVQxPN5MydmA/zgbDBmFSk2k3lJogtba7l2FghoOkcka6irIsdBswetH2gEbR6MkXFv+cKZGdYd3PNI8E+0n4WWM7pEehhVc+BRTQF0Db6UgxMiUItsVHqAXCmH5JPf4pX5YDuLMRXQDx6PBxcTay+GGN/b991I2pryftBKeuFw3czSVSw95y1ZRaT4VUMRDsIyv34AeDZ5v23E5nPLYq7i+ke5/soB/8oB/8oB//HXO0h/HkmPg6O/Eh3NhfZs/og/oOp7qc/fhD3MVTmZvvRfM0Ycqvu2yZeh2pKw9ABZ40KbLMb2kvKP0u3Kcz2BB/mMIt9HL+7Od+6BfMYLYNmIxTrgzdEW6Hc1eipORYDa7gOManT1ptt2YIpxsNggWp+rWo5BNmtZUrE1AFvoaGDt9cwh+1YNWc3gJw0sX3vA7l6+OjUgmptRanru121IyZ1OWn2vwzufLVtvaI6zhWRwWDizDXokLKSTIA6jY9UTOOxRZ9K9L99cWxI0SH/o/J+8Pw8L1s6SuHMWLwm36WyG0csCP4pNUXl1uG6PJ40UNyMgs2DAjVHn7uXBWb0K4l3PtOM/kKy/W8mS1f8v2UClcfneNEzJM7jNpQ6kdE1xaZ957ggFFK+lv4BzWgoDAIv/lrJ4uT9M2Yz2Xbf8J1CRtPJd3xLjspmKqSpktaZXj+iXLa2LTI4slpBiF6Y3ST0bTbWBiOCnd+7N//4fJ//9bz8jIvzr/JmP8yPPxUorZb7oz48atP6Nz5a5X5+VNzYnVXcWQLryTRqfQ3lb56wztzOx9+/onNiYnFVjvipWvt5/48UnwwZvgfNxEs8H38t78jDdeUPHEJ9oONf4nutwTBQpJvHB9cebj48PWk+fn5R/7IwRcOazCA96gThVTiIO3A2NxmypIGArToXQan+dcffx7nUejKZAAe5b9gbHpjvnMxBJ1vHdH60BuEUpfwloEL6GKlfGfGmM/uPsKQAkZeFcC/TlWkA7ZbHljlhbJVAPCprJKOna4E3EihULGHTu/muCbO58AEoucIFl2t0PWWCKsHafj+3FLX3YK5eErmdKpw2YL+d6T16fL16vF6Z/EO3BcRxIh/cfCWQyVS4L5N2Yr4uPjxM5hDiCOSfP84MnH8x/v/BRBBbNfvqIN9MP3u8BV6NditSQ0qfRRLdn7LcmJRGXg8217kONvvyY6tzx0Zj9gpbnSpTU/mJ7iYFWbffxfvLrK3PD//1KxZVfzpPjHPTe+Zv+B/9H/43Pz09Ccpi8vQtVMb8BH1rxTxQ+KphcNciNWgOQKjab/a/KAp9tgbcmN1s2nkmeETit4nMLHvV4R7yQMLpqymzmO+TQiwRP6rtAUQEUo2nPR+io5XkY1b9PkYj3/2yF//0Bk2krpGehUhfaR+HiSLSJjD1suAcJVwYh8USU18G62EYZsGsCRxqE5cE/auqdB36+2bGNZNcGMp17sLMV7KpxqJJIiDU5lz9h7NZ1H1CXxD3NjYVCDxYqZyUEf7riRj63ODeiefbY6IpmSzO+9LspCaKshf4kE3FL9zVMMoVaC6Q3thxeers7qlJSSelrtGmkAeFZqEsv7eDwPJhVCF/Tb/YEvHnpmAJE59JbCsrM2H5aUsi99SikfJ3sHoaJHGv4ihVTyhD8S9NmFZ/hVsh/2eebJnE2/92DjCqxG67N4eSogFwT/jiInQz7YrETvUx7PU3tfqRLq/FzVfG2h4HrPqhCy6ICbsZDFocrqVKWj9j+ky/+MIjy0I6Z4Vsi8l73EUqrgBG1VqbfJPMWPYsnJA+5xJnuBpzQ9+feOvbZvcrXZwWjKhpqeLqaSs1ubdTRvjy/hR8fgbQ8uMJrUMu8UXocWz5xNSREShW4kGfb2K8Hr5LtKSUeJJS+gnR7oqOQWPWV7uZ9Fiez32soqbMZwBbKYBZr8b7u4UMrrwJgy/9kUpu/n6jvIHwd5fV6C+0fHR4LObAMpP1Gojps3TYyGUFsG2kqJQUmcCy6ba/Geemwhh4gWt4e+bOj5cBYuZGSVv4AZsHxJ330f/5lkWV1hSuGllSO3Jrr1u41voYPcDejP2VyVDya0dCmNKvBfYBpp62hRclwNdIwO+tbxduiNOdZrt5v/WOctQdXI8yAUcWP3h9oJ4WZbNbaiNiycIumLBzb+270uUXCZXlJefEyBGBiy/dnoWhaIgRNM15KIUTpjWip/33F77V+nriAF1ikt0SS07IB2Frjait2JNoXTbChKpgrx2JeRGdeaVzpJIN5zsk13khAU8HfA+3p+yGAHxej/UHIG5eOtWvfi9xuvpsXzZWhZRy7ZL8q7kDJNS2m9SpqpeEsVDiJzoqoeCuIZ56SDSqFDZapAZOdzNpj0b+MO+qMxDomZZw9lwyOMOSoeOr8SNuqlSdjG5VX1HcbOEeCqvkKYm+k9K23RAGrKiGPHAZExicRQeaFV/KNXiypoXtN30jUbuw17yV3m/KEKStlCEc1Pf4UkxYT4Itfg60mrGeRrCWhsBjxWmgt//L+QacXSKpURhJBvYfLoAvYwyPvVyjz841WXuuSg5GUb3CGJTIRyfXy2qyhkbIZR6dpRuDWJs9Rzel2VPMtpRwUOKVz7IJTmYWEJapJ6oFclQMckzknrd1y0/l9E6zUvLEDWRUeSuRAJFIKo8+SBvIOBm9/Q5lZh41sxBE8Ojlwf8D1cKaOfC7bd6cKV9KwOtmXnQVY0qIfaHvh1r7E4xswtM7tFQtF4LBiHUQjiYmyi6Qf5forB/wrB/wrB/zHXyrPXD1ylWdOxthHC0YxVESCc5REu6Rsj9jrljLVXIPusYcmZZUCZFjxdS/0YjH/loxnNs1zWCi1BofpF2ayMP8kd7det/aQa52Tgq2zME5EJr0d5P7NIV+PM0GmYSU7V72J/VxSOtMWK59UHVl70EszViM2i1hUOGcOnBcDS3Gsmu2mipTnqET1Mtx5ys26MfoGLPgdTrKtbJ2o+67Ra7gGHkZuiWUBkB5nmy22PcbYvhwwmXEiX/oMUYPxOwcvT1ZZLM4lmyy1J9cey2cTsIeNvTwA8xd85yhM9rmZv79UWRJwtSVZ1yA+oryABG/JPss+UqxWE6rLt+PaQ5Qf4VJV8IvVaJaZwKnsiy5ggaVslDvp9R0gylXPrjHWnBFrBTqzZOFI9ZK2B5pbgRHYfUAF5pJdW2f9kvHJP0Tq9wnK96diEHnWh3p6ssayTAjCQFW2fGr+aUqRXcRmX6krrZqrz+sjv/PodPtW+eyDuBraGnrk9+vPJ99QpAl/ezh9/C3P1QJBDyadzJ2IDpp1h498fTPDrSOSMcr8nUxn5gatSw2qXZzXTB+mT3nx8zTm+6J/5Frv6x7EyuPSW+o6GnNO5AjCnnX/clhoqvQhSGvMuJ9/P5y5AHe7+Z2DjGRy2Pb3jGgFynts6V7X1/ZICu68ZPJFptyzNmgVv94l0S0C0oS22MK1vk6WV1Ew8ivksmDJTgdn/FhA8ynpn9Q942sIiCareQ2IKLZLEAWUV9xIPz5gHAfuM2NZFPDR2f7Ox+xbveSYeX8PeWAF+DNejLb6GQBByJ0DmnIDUmVkTDucC+Hlb2YIDwE9OnENTCwZcvJmxqTPTryydpyX0x4Hh3ecztF+poUh2mn9xNSZYnSdWE/wmrWGWeYoJ/+S+/I16EdwtPS4RaWsa6rGW/1piqFVh7lLgmIzJsNiu/UvKgBoepudKyZI5yi5vtOe/PRZCl7jV0SEn/iZ0BeHHPzk8ItcPA/FaIwx8AaxrHX6wSill+0xJcl8yg8eX8BF6/Hf8WlWLyu+9IDCcigWFWu3XF0xi8JhVOLharR6z0extozOjAQRtyjAKwlCWQCZFUsdTwUBQCR7+RLzT/X/f77+7oBpaNDDtwTcoo9NQHt+qU8Vvs1i5mwT0kkLRcKZ+qa77huQ7Bg467BRKW3pADsLoaO+Cw+ibYbUFrZxkGXC2UAtA/OSZ1OLTYEmKPQlt8lpOO+6KY58MYO+pY8ad/AKXUjWCkBhdF+smURCZ1kz6rdXUpNsqdmXRXii5dznTlpUz1t6wO8hW8oUCCHZsMyvch82R+lAR2RTY86Z8neatOAmDuIMOo/W0xQN4yJRMtSinqQ8TEqSaBrvwm20Ga2+U6IKQm4z6EQGRDaaSM34he4ntIqvcf++OrHFhYu6ewTpqLbux71aE1le99KdHidGfgatBDRbI6VdSmehC7PhKIlM/4HQQADNs+D+sIUgqyLTLSfpkrCFaLfmcETg0bdvQfP0EVuH1EIwrLU8I3jY0q+uBPvLMLKFY0WzFEtmhKIbJaRBNsf8NsgdFchEhGZ8KZiqMKvp4yp+t3Ih3EPgWBJFspvu3VdiFxQWGWlZHHyd5qeXhlYzOM3+VG/EqqhiPqoNonuKexgMCZqCzvJfiWSSuDj4teU713uNaj6u+9qqKBcRsEIT1HmWzclCAq7AgCeSUhUJeBRrQzUpqOldWV5AKlmIiJc5Y+D0rZ3qq1EhK1aWtEK9lwmc+16XxxrOmrZq9G3A601RkZTkuspM05VTVqOhTGZDEH3SFC67oBqqWTyQr/2D7SuA6InxSX3qaqC0pORn0+QeQMw6a6N1WoEI1C++hkUvpsaSKmilxwtkUSNC2P0bQ53mq0W21u2xn5V47KGILPNEstlHZEIsdUbHQjaq7+aU6cZBFto/tXyX5rWG8q5EPX9sqY+Xfnropswv3xkxwaeVnGolFAIypdhHhowcHikHUskpLjQ9GHF/j9FmDbMcE09DXvPN1soi9AsbZmqix+3NHMYxHwz55DgFs8b7FfgBUo3/JhNs8uiNQ4PP1SBtsRutC+giKrhngRZF7V7yHHkD7rizchxreXakU8It34JmoRqPP9CZxdOQMyN/xB40qc5qCpa8q+Qak5aDh8uNtijt2DavhyWfc95a2T/AldLHkflQpMcUJENlVsOnxZdBWl3LXB6cVxvF0ItkiQM0pa/msnZmSWVtU2ihFIcX0r92VDUfQhpKoRM5wQcSt8/JnmoCSKMvia8lf4Ugkv4VU5yjYoivIlyCtqQn5JXNN6Fy3BVrM59r7luSSYohkJ4ri4noCYQJAzMoea/UEXeuodhzYmZcDFxSnlpqOHrMvptf5+z0qzFfk/h90FpqYGfeE/W9CthUDCBDGPX53u485SdOTl6RBrYuKfWl1bC7Nb/XrTyJkZ+12Yld6REy7cqhVGsQ2ah4RfptIiDaMyaLI3PSjyML46VfXoA1l9eW4uqe9zgbMSuYnowagPgc9L5y1LugfNf58giwFTh13Yf37bHzg1x/5YB/5YB/5YD/Cy595b7Zs5usi106RzWepwSthtRdgHAs2mZTOL2sAQSsGsws8GgND7afltf7vYlSSvGQ9BdTRadiFjmnWr7K/5UMrgdSSPSpMxun1T/IXO6FV2NcI/sTGktWqWLk/QHvxi1rQHWz4qcKR63jpe5hEmih/jWEJft2sxH7joe4EgtYI56SdHqDRyfBWOjyuM+IRXbz4qDmYP1Civ099+D7lom9RLbkJW703hgxMtdTxT1lPCPSb0xE6rtU/yTkHhBVF0YkWQMVUtkA2ZUjW+z1M74wX2fMLd2qWv6MKB6petO0WJaaUruQzA38rF4XFY8vQhKW3eweLHxVsnn4l+HJP/nqobieUHKfUePXu+UAACAASURBVAOPbmxZP7j9AL3O9wdngdHyHFogLROYniOGBebzGgUl02/1E2+58NF/Z/eMFvsOvUux0A2Ez2G7ljxcxc1+8DH+nNeEdKi6IWgsmWuR9IZq4chcbNnOaal20Kvf+O3zg+e7gFcGc9aQxAU9euY0NZQ6x8kpBzNmSkR6etaPNfwcwWN9v6o5jRxwBzmMUO3FTr8l5ObKgcyYMWuN5vc4y/cpwdknrfJl8TOlxsIRf9PKr0VmDuci/oXQYEZJhZpzxlH+vgWOWOCgkvsOEeZx7VhtZJ9SUbQFDze6LFZR7P296qYpRqfOPNoGSdpZeV8kuzgov6+ql6KALSLHDSKMybGGyKvWH87rB2MwKYA4yoOUb89+ahtjg1zcpZiRYJoM5NXQTzacEmuwCrSmIIZGrjFQzjq2H+MXAH4WJcrDaurB3yylsj8r71kSxvkZhVE1X5tW6l4Djgd2TcRAXLGr1llLUoqpYTg+F7AUxmXM8YmMbyl//DbsQ3h0obsy+8W0wWxvnpLSoj7Blj/xMbgUOq9ivk5C3lDQiXXPrM2dd7Z4bOAIvJHVBygixtU6WvFrBiSZRFLRAfjmjW45yDrfnaOCybkGCO1En50mJ08N/uUMPu2T/+H/ltg+/+R7tdAlLNdpjrDJzVa99ojM03cOMGqf3XY9CmkjE3xBdab/WuYdk0f5Z5s8M7ZFvlbmjkFbICo5oEEbgfviigatg5lvBrMJ5RN6b9n/fPnfGSP93QGTi8Om34H32AEU8k2ba+qDyo2+W1RtJ4dOrlaj57w5HcU0N0Nq7a8suQ6XmBtpKl+LrwraEkorXV718lOKuGVw8N1o0LgliVqZ2s4v2Z2sB/sFTfSV9h/SoX5vs5YkYAdTxSPNbaUYUMKFloSgyLGZX7ZQEtrYrCi5br1ebcyRRoG90BPmE7lHa1nCiEBpBDey+OxCUkxt5L1GU0Jldqytg7tn0wH2UItIE0wkWUfbLylKUi9iU5HzvcafCj6LwGoC/h3jsRf++vctMyGhuP7ZbC+04b0MrWNCFbyvMLTpfp1MJq/NOrDy1nDvef8kE4Iuj0r2wNw4Iu4J8Q9yDRn0oCQ56g93ITl3gZQ6tb6RZU7KX4lkMGp2NwIguDQLKRHhsBtx2JxCDI0a+BVbYa3zLyatC8mf3iV2fz7YiSSkSV1f5snLgDu8GqbgkQr9IsK5uzsTdrC8ZSKW7xaidxIumtqlte+CXCujPj/RKTFZVkI6GNvoLmgcS4ZBlIckncBYslbZMGjacq3vdZmTfW3ZQMy9wr1mq6GgkghHgRw0VKNgm2l7S9RxIeTeKCFC80wU25ip2VpnVsqaxS2zIlJDa0Bv2Zp1bmhwywuEbcCi1jB/mUbnekt06leGjBQLMKL0Vi3v40LiiwesQkKUSwr9uxZD3Fr9P8plbdJMsX5WVvOuGAW+0ydddX4yZNxpMbGi5COJsF5NpLx6SkNVkN66+nvdQtNVnEiaN0ZALImwtnWUvfmOj8ZCsd46wWLgfQ0gZgErsojO5zf2vh5KAQdu3XPxkYm2ZAMOwJhsBon4zhT68vqQjDXv9xvjyGLNssE2x8U5v/GOlLY43L/A1ibXdIZFWgnV+WBqWBgibWthb4aV9C1YqlbrNIwYwRiDD3lgLrx8wnnx6AfDnLBX6jevuGPGKwbWq5ktawDBPezBCBnZWKuM89Jr/333x2as2PLHiGVsL8xiW+U9XP/ut0eFz0wIEUxq6Bads0Ullw2TtZ86KmlMvI5DV9ngF1PLgi+M/4+07P/Xq0cZPNa1mOG9gtRuWlbzYUfankmqmcGQbQQ+qyEhPbjW33vGc1G55YTrOQaUlFZe6VWRMluzcsTEJ8WfctDcL4uqMLOByy0dTLS70S5yS3Ws8937l8LN8R0Xq0kVmsNTwHUi21+gGuy98Xg6r9eL4Bt4auBfpBTaDE/NcSVRf+OqHNeS0dMayqyYYixpBA2n8cTHK0FcBqHGYnTjk6NMb32SJrIC8ypJZX1hDbQL0U5CFfV33YvVHMjBmZVv1QPNhp2nv4TNVCQwTxbD5E2EcJXHQG8nc84carcjPeY+FNccdi8j24U4bHzNgxznDW2xEgWXQCIlql1TNxxyTbg7JrK9RC4xWg0KRqH0ck//WM2Fv3LAv3LAv3LAf/zVC6hwLYbOAg74BXJCg4exn9GWQivgUWuNIR2LCQjS2Ofq8pK2GkqICGcNSkKeyZKMjFFtJttZfAFplahhvHrfPo3rGnLtHNALnAl5tgfQ40DKBxEB18CxBNNIDhOXX1IzGBUbT3JNzxoO7QFpLNuD/PME5Xzd6H/2A0Mmc2VuMtHaK2pOtI5LeXdCeakUYyX2Ld7rLkw5V69Gzt3Y76RcWPiLYPn4xD6bRJSw8u7xkpNz+TI8z3NH0c3sSJCT/Kk/FHqxM5Xom90qJYejorRiYyBXMm/JZrVq3jFbeYwc1Qz37S16tsAKdJWfIz9r0+XLMQlb/Z9Jax81VMj7ML40kX+Ey+QgdNLkVmZQzUH28mtV0RvQUSDo0a7s+YjnWVlSUS2yNyNqWzq648zKO/bQOpTNyozzbrofJdP1RUo6ZO48db2mlBSjAN2vkmBjs12PaFuaPGRuYMriAKuUJ7pDs5PHyGHKc5ZPiWV/U1xSSqtyjOE9B4/0kpbL91p1xVuLya4dteLyHM5aEtFneZGl55KIcERj0VUjAh8Vb636gJEgAvEE82lZiPSZeeXxxSbi7cYR5wZGeAhqfYMAGxPMEQ8ub4gcSL+ZhG+bII8aNgkgSIwNTJr63t+bld/MB4tB2O3uAa5hxjO0lKMgTKBkJy1yKNaQrXTV4kHD6vwq25SWfkAZ9wKiPENjyQ46bYPLfoxLaInzr9xCLfOOq0Ev9n4O0pdHXCZOqw++WJmtBnMhgkTQteOeIwMXpRcj7pcrn9+vcSLFUPldzyRQGIzzVdKXmRumL9TYgCMTyuen482QE44jsE/JfruVL5LCdK1h18BmKzuXBLTNCTEH/Tzo1rOOV0fPZApd9n9xkmC0bhPlWQPlVCSYIjyOyBpTO5PseW+G3tR9fjb0lr414Wp9D248BDHblswWSSZVVc65JJ2F5+hoBB/XyXGlDKYbPB4PRigf88HRn7hPzvgOqnT5j00MWcgKE3jEqpPLH3xeOy5mHljxmPKeKoJFPvA8Sz2cxpJJXjMBEO7v7Qu04CmjK+RQetZAthcbWZb3G9lPsmKun74UI+Y+jyNmxcj1kRxXpfE/31d/f8Dk33jJxZRF9Z859Zp14JG0LZeFOCxtZk+EY2upgRhFQZNKFAYnPQSbieaxdUjwPb+0Kgt5ZSEbbbRkHrKnlJtqEDfKeG2EnrIqkAXcQm8uc/LmSY9fP6tWuDlbDYWkoUeUMWo1L8IXSlCZdSh4vDki/TeWdvpznnxbaCCFIZm4fqKJUu2TsYcewlwG8tb45pWU6AcxA2sgnHtg1yRpvsKssaLQZRKaiFDzOuSPRJrIAdNvozuPXyphrkUl33msRqQkajgi6vZnUrCLR+NeYLXo/mifLNkaIrBF81+1WPTt8dTCePpqBFQR62mI3aCMP/N7PaJBJXkaZf6Hs9Cey0vhcZyMKKRuixxAScplScuD4Jw/TsMOYPBBIFtnW/WNueNx0atgMzpRzYPVKFtFurvTffDZl99W3qeHPmAsWcabeUYoNnMI2r2oyzI5de1HvgyEuRvR9Sxlyf6geK0VRTfH75Yfe2QyqdkUOGwl8QtJ7jms3OPw3E9zrymHouEeU3F51M9mc3ZKsNrTTUcNK53nuKqAeGD+KGzrH3gF5vTvKJbFrqHSXDP3c1FBA65YKL5HJrVmIBdCJnxHfVlrjpcmM3rxiBwMj8VsbBmks9FWFNTWOJb/wRGEJuoIHEry4WMeq/uSjTORTHzrvcI/ssiPi6tkm2hv8G+1VgoNKMajmIGqHbHA3bBqEjR70xC0Ke8y7ZVqfiTiydD4XkNuT3SRs6UbhAceX5goP8IVCVxY+tS0o3xPJuonrTVkwrskGoYoKJhdtOml4e6MYil4y3t+uNCXRpH5bnDJMr2tQU/Gg2RUUusKES4M0ZbrLbKtlQyZvA7JpuEe3PtrJw8iiRBZxrDNnshujswKAYPZjmxgsDwNbxmeMz9gfeZ8i1gxBDB94e0n5ITxFOYfNaCxRD1/mtNb4DbR+e/bl2OMwGYj/Nj3wnWkHJA4xrUHLFZn1Tl114wHAtcbjeAYPwHwnvl9zIImnU/7neM4QN9ETN7zj5QTIjj6L7wqJ5BqDhm2sB+0GanL7tm8c3fOdrE8+x5mKUtUTYyIwPSgkfvqCOFdqLch+UyEB8/ddBH+KKSySbKvf/KDZqsplRT0HPylVNVHB6vPHG5Iy4T2GWuEdXsy/ghXIgsp+Ymb2f3JrIZo4+rgI5PYvj/7SkQb9MD9s86VPP+/hyXwp2WB/vBV3FsORXBWsn21MzXkudkpbYJU/EzmUtsFASz5y4qXcucLy/xWJIsPqIb+airsZxs54CVRfPvrLLBQNEY1zzW+ZVOcYJRPwzUG394p1+b2ifnFsMGsz+FxMQh679D+he/fSlP/mikfqQaeSO3WjjRpjmDKB9/Hd/64/uBf48HRD3wYc+0DJj4Nn8a4Ul9/RE9N+3DebTDbE++dVzwRF4Y2tM6cFnCVL9lqWDLORHUH8PlCrgsimFfGiu9/pB9GRCD2janOeT45HsbjI7DHm/nIXOK3x2+3B1M1FxZrP9cVVG3NT7Oa3znXz+aEdJbHnBVbPz07tIadnmy4KGHqln5V/mVI+iNcf+WAf+WAf+WA/yuubLKcpZSx5GMUMFkm93CUifcs9DIGJr3OCiNq3VvLZzZH5mM5jFtSbJG9BU2/zmVy368jzyVkg1uJBJTkSM83I37VyQdtv+ZSH1nfZ7E5WiTgwJfUFxB1/12UJR36J/BDQjRo6Q5PRAKF11BG17OUO+dQW6Am9lmaWnglByhOduUC/SJTptUh/5SxPablqH1Unwbg0Pu8AGiL0S4XXQXDecZiCJ0bdDJJQNgs8KmqMttMvz/JXk9rDbee/jZ1P1+yGPvrXMth2Bpgrcb1uYbl9dkjIOLB8kNJNnp6ZVwFksAnR+Fg7V0SgkPQNhEV6LPOuWLkuCc/c7HlxHB75xrytRbgU+/7+s++hgoi5wZytyWhCYielYOx16S2BI2/u6M2k5Xh0FVIZnd6PxIKpQ70ktiemF6DoG56S8aiKf31BYyQ9U3ex682CGstf8wb4KasNcv2FJ/qCZgjgUfel5l9ebnHJxo/52eSjAUCPOY35pzo+4Fc2RR/yaDXAJ8wxvWij1853r/n66vRvilzDJopDeW734Drw2+21nQlau46PkbG+pfD1TDLAZgV0Hv6xZyTN4MXL65xMZ8wxuA4Dlx+2nVlm1X36AMiJcj6+Njsp83KjBzTDzd+0WcyaF5v4tvywTzR+KXAmZUPc3F43r/Tbs9fW4pC+lngv/QsVRbYofI+GSmTLBmPRJwI3+wb6xmPCPBIho+2BPcvy4x1ploISJ5bH1s7WXcu8KNc6e0zOaqOCE3lBJm++6uHdBYidimPbBUHckjirWp9GhaOivPxfhIR/Pr55H/7nmv4v33mmfqLPKCGfWMK/+Ond67nUkH5vyP47JPAsDgwckDVqsY5zj9oXe78pg1+m79zxcTVmVLs2hk0jOezcRyN3s5SIfjETJhDiI+gHSfSPMEU+uJ4nEXqFKxn3nr0zvSBhNA+3/hvgXw78OPNz7/+lNL655vFXL94V13/wte+1CPjhFuydUXQ7hzVH7beN1B4qyAYnKPkcl+Bfga9N9Qb9nL8czC/C3/od+S/OS+DiAN5PGjROHAetUc8fkfdiOloKZtogVJEhJeMzcLVUJBA49z5amcg4QlaailTOYCn/rSlP9s6But3GleC02owufzpltSdiyWDMYImbQ8v3wWyPiIYyw+y9d2b0BrAPcy/+Dn9v6+/23lXSQp+rwAsPQ/1GQZN9kHewhFx3JKVtKRDzAzqQBRg1vSwz9hoK0HQr4gFssmwJkCZki10+KJ3wY1pndhmJBUKr/SOcxMuS+/7N3JSXj/75d4sBEkWcznJa3+iKqf5t3fQpYvp8FMl5N9eOWj5MOGn64Gq8jiFcRhiwn883lxuDInbPJy2ExqJ8llSJWQgmtPHoe8KeFmk5AQ2DwuXmWiBCC4f1ciMXSyYZ7ORQt0ekYhuKzZa92M/iy4QMxEVq4nZcdzWBLtRAjdbbrB53xmZS2yEs+6C/toFFbC1n2VLDGp6fVQzdFaSrNWEeM5ZgSN4xMmnTL4mwyaZeHvpLs+1sQoxf7ruZO5HuVzS++uI1NkOSYkdkX4bCaM3m2yZU2q2Vp1sFm2mXZxZKJPUfTPLafZChEiiwwXd97173MwyyfMo/EhNaMm9ErXfJFJvG+l3Ay46pv/5+JiJgI0skLYa4hf5Ie0LZdd3kFvyRxJz9QQRufeFlyRH81uTX2i07Q/ZUJFsojQrKbS8f4k4dMJWkM5fySFAvV849IM5RvpKADRF54tsWaX8UMyBtTpsg11wQHqnhaQZcH5oTYo5GUQSXeLM8ndRcTSS0ekoUmfILMZo9xysi0ih4TLImb0428mo8wMobfRb0z+LgE6UJnoafA4CTe86d7oK3gwwmnn5xtSdkWJp2pE2HnpsVOuGI8r84RK2M04SXVcDe/dqiPW7AXYoYpHatZWwnQqx7n9v9Br+iEmih754z9DgLP11ohK782RYUqtNx81sWprVuZmA4OpseYE+y4fQZSNagoGWsfkqdKbMLftmPeMbJHU5f6kn6ovlA1AFWknPhjbUFkhEShovtqxX6IGPRK3plH0PQw6c9DJx/4PjOHiNlEfovTN84PPK9b3weX4VY3n/yV6nAE2SQeae+YLM9OlZ6D+NhpujEkx/gxyIKqMbJrlOPRqiJ6qDZ/RCf9Z56S3P0whMJq28eUxGMq/lTPACGYsshTn2vT5L/mY3WFHGGCyB4KNJ+gvkHUaxlSoglk3zpjlARK18ZSIbCRjDudGpkk0HCeeI27vkixPXP/2SmWOeXr4fc7F+OJlH5lbn6FvTm0K+3RIPTps5zIlInwJV4RiNuZiE1fwCdnN9xsUsSQ7l2rGmzzUUykYdkY0lL8DReo5eOaKIJLuohqLbvFVaMu/3F10NuY0n20m6keAfkdu/oXFLK7tMIlrmi1uKqPH2F47zCE0pqjEzb4xchyIwLqf5i/ju9N6JRxQCe6fD2RiNZw6lp/PQkx7KsIsQ59C+zwT3NzZevD4/MemAVNGVcnrOSY8HzU+6XahK5nKazdMp0JYcZTUvuwk6E0SlZkR03AxaaeoTzHeehf0og28F5MSj8zyU7+1zDzW+SrQBRHSuJRPdbqTsUkZY0jF5FgqfC8FZhbZL5jIqsc1ps+pIFF6Qnlg/0vVXDvhXDvhXDviPv3w/rbwkUg5QJR0EIoJujpRcF5qnY7TU6UgEd2wGUI9APfPGPtOnzmEPcDbbrwbhkM2pVrkXLDmvVBsh0uzcY8lF5TM8FmiVpRhyezjfA9G8NNj7KgqpnGV11s6zX7sR1KopLwESlde6sCwIllJM4HtfhLKfdLeVCwk9cliSg5rsE4SSuQv3WdEV9tzJ79xu9VymBnP1fS2dCdN4fSGls5fRWuMRklK6AajWewsDwTwHXFaN6fCGo8kOWfEk71i97he2VvQagt8s0Fn9n643Gt7F9+1fcnmKc1Tu707GOXe00OETBb+lY31JTnkCtNUD4thniFXvQ77ULr3OiB/hatbrrMz7NJIOW6xOgJS3W4Pn2QAl18uf5J7LZ7QyXJV7zZxQ/ihys8w1NgN3oewhtrRuNmcXOJsvQ9nq/RXgeJ2R3m4p77z1wlXDLHHliLXfFvCl3epHcu09MyW4wphuXLbiV2xJY+ykSUeGESNruc5BD2F6xrXc81vsrfLZ+oY6ueydzd8rB2s+Jk0NCcM8eLWS0FLn8sErLv4YrwQPqjOvgU/DNNlzQ+CsPpv7pA2lheRQ2J1rDppFsVYu5rvx6AfX+M6zPZl9ciH7TJuSPVzvd3fV1rOMgPpeWkyaUMN1MeCKQBDZ040IuiQwSIAPL8B5xD7nGoEdtc/LS3Gd81FKJEslgejorGdZfeDW7e83u/8J1xRAlBkl+RuOiKKaBI0llbhizepptsoR3R1rkzeGqN759Gj0fHE+pvKvn3kTf309aK3R4wOpoX1vk+vMs+43TwZT14ujFBlEhVhAM/HaN52XwNUO1H5LaxcN4nDccoByFsjo8Xjwy68fPJ9P/l1zqPlHODobRzSiB/aZQ1S5DL8GbeY5P93A8ny3mXK8vdc9CM9/tIE4rQtdE+Q51Jmqe4+toYppMGatPz3yXphUv1s4XXbup5K1z2Ed8QcagV4ZR8N8M5DVLNm0raGfwXwm4Ed7yb03T2lK4Ggn7q8iiGRsavIoVYySiS6G01wg5PAtI6pi9yA9NPNT6Vk6ixBceCQQbMXkofql9rklOG15LMlAW2Bm+e8/AU4CXDnjVjWIAqetuYk2pxUx6L+6/u6eO6fzQJGeiMZhtiIKVxi9UEBLhkDJJEbJJKCXBupcGyQZfogazXUbDU+fGxmzD4VKlsYXpPcaEa3CPhHH9w1pK8Bpp9m8k++VjNUvnq4ZEEQgvphQVhNCiEr8bymF/f4CmGz062EH364cLP38zvv0y+fBz/HkPE8OyQZhHoh/4+LiNf+NV7sDnxb6MP0indRQzuRH3eg1LAoHL6mU0LHGRqRXRPovpW5rflazkcnXcqZuC93tyASNoBV1P5OtW/5AK0FKCZu6QZrDxa9FDNufSiCkvKH4IvPgRF+IF727aytwu3OWHqhRpvERWzs1viB7hpLeV1+eSSIcTswtm5eSm2XJ22jX+v4/0LVQH7XeWrxqqLkzNhRu7elqUg43JAYqgkU2j6DWrEjKOoQnECWE2M0DB5FkBta9tArsa7/l5Xvdq/Llz+vQrQbe/kzcv3f/3C3FsPrKC+WisOnpS3YjPx/1nhcsI95gN8CVV8lQsA/LcGdJR6Z2fuy1L1rv3ZKZOG1yFopuIwrluvXrgYiBqmPbQHlmwHRP2Zf12t5SHsLyjFqJjgY5iF2sWF5fhqzAsbSW2Z9jJQF5P+pjSa5viSerRAo1vJom2rORcXiibxNV3FEldZRr/2UALikA99sQtYohZGxEGOJ7kL6ZhzS8EuFw4VpSBpWYKI4sdPIPcmVQbHs9yZZ0mF804ufdGN7U45TFWF6ArknpLhIlDw+0GC5uKcUgVNkqAu57qDRFtpyOriF/m/m+ketxuQkq1dSTTLgXg0Z4A/n7kOyRLfnrvpOMPjqLUfsuJk7zi6mflTwso8+2m63gtN00yNfsJogG2uApLQupCKK9QITpFzacy5THIejRGDZ5XZ+8fs7YszygTN732SCzBiz3M2ozGV557BjtBPe76czxRrWjR/pKRT/SHLpA71fXREkxcVOa5FnhJYcVR8Y9BE5zxFLyzmsQNTX41MU8yfjhHpslKxpbP9wEmD1RZOX5eHrbz1cKXZRn3W+0KJTXOvhEGSW9GKl3hUVLXX7I5yuymwoiGb/bD9S0U817n7iRYMnJ2BG0udaxcuizvreDk7KTksehw36+55IU0diMdutQhiTJPJbU5F6a+s0ENqJ55XVK23kJtx9PFRZiTo+emv4b8coe5IJvNhLitxzmai747UNhCp8+6L1zLKnM6PRY5+dkOXU3qYFlFetm2YiwCExkd97GWl9NGGMwHiMb2Gb09m0X8gAtAuWV8UfA3wFjpMwe6enwXuvu5Xx/fTJtoq3Y7ACjYQPoMK/B4zg5e6HZ5JU5Zz2/lXccsbwWDroJZk6bT47zyZwTRvpGfZyNXlItU4Kjf3D0B+gn2ryeyZIMuuWHFhuduOPgNN3FSy/0fGHv6rBk5whTyheGMwd7LiUjVo3ACmYRxo+WAv6VA/6VA/6VA/7jr9mKrTXW98rEwWogQpCm4rIk1ArY2D299Lj9LjMeNyzg9IMSS8R07me1+ghfz5c0Ft+L7Munq8F5c9RWnpCSfoMGUsCUWGAgNlvKK5auITKbsZpXROB6+wsuH5ZdB1v2AUSEww9s7auKe/MLoiE09mDqVX53GvNuVIXvcOlN8FJN2RqOofs/01ag1nfFbnfQJdG1BrXr9bxkKSWwCJrcLQMjyoPky+uLolpeoZKMBhwWTV6JL56WZapegNUIo3nbLAo8QRSjG8eaDzL3GbZ+TFzvnlcxAuEe+olHroF6BvcO6etTEFhJN3eI9KlO71PNaOdPfpTL+0CNDQTf0sPcNQRfYuzqAUUoVlKLEcIsVHyblSeqEl7MUwIp0PpSjmhu92EUN0upF3tMS9ITYErfsVKrjlNuNu7UV9Yd3F7xr+Z7bVhT1Fd9VjEpimEAdXYWcM0/CSbuLf1PEMTyDFHRzDsaXGoc5aEUIRx2YuYcnlLCl975v8XtIXNER1zxkTnk6/XimI2G52A32LlxMiwfNL84kGQlIfTjg6Bv9obEQGQS4fhMcFCeGT0VFSy9/8wTCNGkMSaMOLEQDjdmqUSsOjaHeJXXuf/JN2hj/mstnJLjuYgEDmk9y6OsRBrQyHw9oiStRW4nEdENqDxIqdtV+06biBx7MCnz4NQjGU7FqlINrh8sVqmkQVFcR87P+yvjuVTPuik6fcv8LYZzYkgTwJP3dHnPZT53eOejetI/vb/x8SofsHfmVad00Fxb3ozjmTKjT2kMdx5yYl6fRectc7/ycm10DQYgzxP//SIk1aSObwcamqAaVX55fsCjcRwHv3bjuoxXQITDHNj3iyM+siaUe/8PDS4JTqT8ECFkoiIcPejqPA7heHyUQkb2macv/6pMXkXuen1K1qoJWuxg2YdoIfu8qHDH9IkwfgAAIABJREFUWV5FbT45roMxBjJOuNIvLrzYyeq0JPPyvr5j76tY7OmXNTwwWczIhmrORJYneIijVef0aJknGyQ/LaUHl3Ski90161Ly8mDBQTS0WHGZl65BkNYaWUpwGoHpdyD7/xKB1CznHuSvn12fW7NPs3LIBQZR0L8zRvq7A6aeGevdMKkPGl2BdfDMjUBZSVGq5FcyGr7pyoSWxl8iSp2gh6C9qPsrgRfZOUeP1GZN9GMuwKFaNEg2aiQXZn6+w2Ij1lWCtj7/Kur02klNi3YXTItQHm3r0M923Q/1CxJmSG7ghzfOkRv445WL5vk6+WgfnHpyakeOMsnuytve/Nv1Gz0uQJgxieWiZWy9zaiTNXjQqqkREUQF4ZUUpU5jJqCZnNTfe8lIOMhqmojgcVVBlBvw8MZQTaTX0of0LyyA1rgpVo4t07zaAgZFz19sq3wWB1XMolyJ/ytZh5WY5UYwASnj79mzESsCSyceic1KihAov6ZdxVUjZiEwPRSRhFAJSTXsf0LR/PMvl6swaicQzFpLp723V0CLGz2z/MQSbdpzmqz6pVB2WksN9SiTt68G9uv3DwdvS0YhjYRzr60mhBR9PaowXTe+0NG7cS/19Ne+WX/vaS4YgWsWB/AVFe6FlA5aSSHk91q/c+7kT/iaDKQ+fuf2yghkI8OW3m8LLc1SgRiI59nVCwUKoEtuk7l9U7QcX5VAWzYUGgdRe9G+FFQSnszC6NmURvB24rwxc66ivna5tV+zSVeyPkfurwjj0mW023Cq2VN7Kep7qipHdIZPFP3i7dbSU46FOhp1Hi7T74YUEn20Qq0ClmLRNWw/StqUrf++Em4Vx8p/IEfYeY/fhTz6Jp3jB2JaAKRcguZ6E2G0ZH7e8kjFHN1Nq9JEV0FHxStP+J1yJ7RU4pvrqicCRdKDYp2TS9P98Hs/LeSPwD6/acpR8E0v9LZHJRQCwXs3DeYuSOdmKJjqLeVRa9pl8qg4fbXgiPT1aYU4c51/SkycHIxIxVUR4ewt2bW8WGaqeK6vEUboJFSBB6O9OY6D4cK8xr4HOVQDj9d+3bYTob51xfVthFtJbRTSpgZUEiciLaVxPcADn0b0Vk2blCVyF5w3o8c9qVvPQe61vu6RSEkz+B0roFgSjW2OKeE5DBEgGq1kTVord5LI9UAEl6TkByIc5atw+eRYibIKpp5IP7PdqGtl/BvSQb4TCEPymWgYYj8O1m7gHPXsAJxCPi3jRioJLQ+faEuy695nQx298lw7uu7ca52pzdlxJ3P9ygO/DiYzsyHlIrKRbCseIXto22YBcBi4XARBE9vAnO0ZxXmz3Nvn3TBcbyiOFfpcIgdHpceWjfo6WzMSyZbNWvKYCdwZuE/c0yRaaMy6Pw8euGfz5WwPGpPuwW9iSC8z5ZJPcYGjbtYpyrwMCeXRFCVZTWuA+jn/YODQlVHo3Ww05O97vECFdsDbLHX+1TN+UIMKy7gjkYXFKakz/n6/eXqjtZPv7+/ZJGsdOS9i1t5u32it5E8eyvn8xvjpTWtHNj/KV0Hk9m9xh17yXsFrF5rT8153v+PhWGwDVZo/6vwenBXX99APeNRD/a78udH/A1x/5YB/5YB/5YD/+Cs0Y0Noxtg1+BYFCa25jxeE5G7qynTQjHNhF+ctolLXIG3onHTRqRhfElCab17Dvpvpy25qdno1qGUGV19KH/W3U5EvvZY1JKSYTHgrs3VgM4LYTX3rCV5Ye3mt2/UxpHyYsx3lHHbWz1a8jhugy+y7yR+1fgLfII58wTv2WynWrGZnMtJrGOp6S6JKIuJZA4Y1oBCSkxnKiuat6GCXxgYPScXL0LuBnTmuVlNTS8lk7PNO3LZ0obeUnE5PkfVd0lMEllpNIKbMyh0g6NVrOGwNs21LYpskO1ZEkJbDkiFfc5ubfas14AsSYK1oehnJOnsz3uowbA9x/vnXEQNtjhQDdA0fR7tP9SmxmRa647dhWuDiOOkjaL3RakCqNZRfz5R6XZMlgatsPyY6y1ViqfNM9b3nQLFKcpZ/l+vrHnTQ8/wSyue0zrkCQvfyLoo/DYfz3Ac45EvN1UpulkmUz66qYrMhvWMIvcA7W/LKhGN2wk965S0tavdF/uT+rDJpHDQm9p50WjWinbMnu+GX/i/MORmRYEIfBx+PyXVVbTreyVR6nIwxOFffTRXtgjCIcN5kTvE+X8lWjaCPFy8emDjPyOZ91q8Ds8k8gmTA5P4iUo74mAtUnsPbPHdrWB8tvcwEiGPL2X0W06W5J5ubYGpsBkkrVpST6y33kdNijf6qrnDw2jOHTLqnssQ6s8JgtJWz/xiX6mrq53OZumTancPvYe7s5bNlWSNOrfMM0qcoJMuSyAFecyU8PaiO+URqWB2Wec97MSk1kPPgnC8gOEZKmMsx0rNPMt9bBIjFKms9kJ6sNKXxPB8cLQe8qspxPBByqPSUlnYokcCLQzuPeDH8E0KQGgz33qE/uWQBc+DQk3YcPO3BnJMuJ9/Ob5w//cS3nzvPx4N+Kr/7lfnpEGRqerBq9aflTX1yWqTKzEaaEIR01qpwD7DseTfyfO8WdD9zv0+wVVONPIM+ujDC6F2wt/GGlGyfBaDQ9+3Z7V5kiQIkKSCTF7NizZkqYhF7LaefXZ2HNKIAlL4HtOy5RvNz/ze8EAqg4jl6n8fc+buLVJ9fdu27eulfr6FwCMUV1C1rvnIQD99kkP/q+rudjAyGZb5HJVeSE+Rl/piSIAuFtiZtuqetk0731dDL6edswjUvwjMZOeTMwmRrO8f+ohGrdZBJFkAfx23I1wabDh75c3dQWTTE9X+rcHlsaYiQRMtS3zBvne4EhQjmlwFU3rROv/KzfLyf/Mv33AC/fP8VVeXn+RMf8TMtGjKCnz++gcE1lJ+a8K/8hvGdOSe/twPxLH6asc3FzlFoI4FXJZnvNhjkcOy1JCdkFStCmHBqHlaPorK5ClcNjSQGk55mlfnA+FTjLJ+lHsXLii+oofll8UjKqOwkmDzMNslestGTKIX8e9OkrEcZZ24QVDUUXW6KOpKmjPlcMrCtxooWnPJRz9jJ9WluSayVNF8Nz//uemYjOITRfyxzv5/c0FBMSz+9ps0vvXjUDTKxrXO8vCwPOTgim2QijVHr2Va+rL5p4Eowe+lMz0SdDEh9b9ZKXkl4NQw8917SdQV06XvXoRQ12AuyUcRqSFQC7XdCqK7bN2GZekcEQ3NDushGt1QKgvl9HKnERg9ppLzL0njO9w081utm4XFo20V0hJbBbjYFR1/SiuUJE7A0mb1/+T1V0GD45JIrD9BQzoWeiQk+ObV0ACJ42SjjvjTMFIRJonNFJO9VBaRE6iRg/0s+udkuqzlwVYNhRnCa8tTHHgyHZ7LlC6Eujsxf6vW/Z/NuvCsRzKD7u5bsWbwLzSAcovk44yTGvS56zzOikc/8uyZCLNEx3zJwno79HXO/f8YVablMlOdcr+rVlNvnThXcygthNaLmlirp8shCaSEk3dMP5UsjbyzpO2MbQ886h2f3ZMDUsEVE0Gk56Acew1gIQC05IMfueFPvUe+e32sZqYrwnHfjvVs2mg7rzGoaPqYwC2hxFTLmoV9addLx7cdUDQkXBnlWTyajF+X5SjZoXrmW//Y20tbhzd++/cH385Pn87ljQtL6O9qUTnAWulWKrSzzibniAaPBt2LJpvxPNt3mnHnfefCOjnPgvFMCqUwnRY3gzdnzuyy5oGyGXfVanbYRjHkPe0CP5ddjeHmLvKsQijYR+3nfdwnJs0dKskQvFgji5HMXX4oketEpqJfQfZIlHLTl1eEpEyYijDKoF4HHKMQQ5262/wjXWayKEctgNxtVEoYvU+PVCxH2Ofl22+frEcHRAUp7H5hyywwgTpAScwv5ZtE2ynzJ1Ky6f82zrIogDThYcpKVeEcWZ7lv08g7UX4Za1PeqdCNnj8D91AXYUsCSbQt3SfViA51pJoT6ueWlVtgFrFJvF8cwHkc6M/GnMYRP/N8PlE5sfPKs6P9wfdHsiIeH8J1XbuRIZLjBDxzzHl17PsfxDXQUgHI2PxHGmf3ROBf10VEoU3tsRmG7/nJEYa2bzmEC+Mj7rjr4onsVTjetSbfD9p/KB/x5LxOwpyf+ge0LKLsePLTRz2c/uCnnz9yAP3zbxzHwb+1vzH8b9XQNTRa5f75+U4HSmahiacXqHs+N8/6Iipa5nC9Z+bSUnJDqykBICNuVkxJpxweN0PyB7n+ygH/ygH/ygH/8Zd4FHCjgKcrrsfYIITV/vfwZNOo7mYfwClnDkLq9yCH4OnX1BGZUH4gRyl4+Myhg5ByVFIMnVbI7N4C9c6ck6M5x9X3voHck7PYr82NuY3N30T5CSO3bFoU0GMV1MurJmPzzQJdea1LfGkdKek5CY8r9/ev74Nf3pl3fDsax095P35r33m/3/yf8jvfj3z/S9uO4+p/9jvKGJ/eeUTmkzGzgXgu6VOictwg5HMPDKRAr2dPSHj6LeV3Uu2gnfAEEL3vnUMPg7Db7sCNR3nUeDPeuoboBXYqeTr3ZOCJWIJf5ZHDLk+mh1AyvDsfqxPT5m60tXDmQqKVR5FZu4cwciGk90eyVXOQdciVkorhRKHF0ycPCNlDrR/hSqb44qKD6IAI+rwwKRUF6fvs3l5gKGfUAF+glUQbHjV8lw0GWHHuK7Com9JK4jN9S2tP1IA7V8uqzf4c3yMC97YBDD2+AIrkltlaw73Qm3W71JN63PJSh/U9DFtrZyhcMlHR9O21kf+oYD2YkYAIAsZ0ojdUTpovywv20Mziy/BDvjEl2eDXMwE9v/76jW6ZG35oI8j1beOFmfG8njyuF9/jO2/5dz5/+zdev/+CfEj6p4rimn5McZ68Ij0fD3llnjEH6p/Zs5NvmDZeMzjjXwng6o7XoCPad2DiEZsB2QrIBXCJb9mvpVJwRkm2RnDFm74kyCAP1wKng9CnMj3X1VGsx4cpH6VK9dbOXGwlSW/AQDazLYi73l9gNpnbx/VHuTbjrlcOKCkfbmNivnzjHLEj84kC3Q9XmiioovP/Ye/dliRJcjS9D1A1c4/IrKmqHQ5fgO//SuQNRSgy5PZMV1VGuJspAF4AquY1u90iSzY5eZF20R2VGekHM1UoDv9BaPo1gXOWiglfnztvo4gCHwfjccufH6nkEu6ovtG7JBNuLzLCbUcjuLUn99uZ6gsFosgrgQRiDfXOroLq4Of7l5RdK4KCqqJyL3DeWJLBoSDa2GzAt2JibU/Y3wmyN9Nao0vjdldgY7OdTW5s20bXf2Lf96yfto2t7USvpnIEyleUk4iDkAdBINgC9jRvjIqrM19FJaXyzdCtI2NkGm3l7XUI8e3JFoFZ8JfjtwTSVbx6YDQjWcHbufogc8AaOtiYPm2OFlPo6MnI37gvwDFMtTdZgGVHkVIH2V3WuTsfiWjkmUiCdLf4reYu1Xuy5zpf1AXxlrGrAC4+fLFxTRQrdZfFVrPgFgX+M0d6enKeVK/HLtbUf+/6uwMmj5Ha2BOlU2ipbN5N7qLitRkWqSSCodk50XPgFUwWCyccXRqDUQWJv+h5y6Vx/DIsmjmFTI8iEZ6qtDIybcRKVGZxvUmkdij8qchsNg+RkSgSv/7OxTmmP4BZTUCvwwUuvWL1QD+V7h15Cn3rqDXcFGnK/nZHzmroDXA3xHtOHi2Rdfs0HT93vj7yPX6eqBo1PrZEdf7WhQ9KtmSaXYdzaE5fVbxovYLNZEeBsSMRmA50GoXOhmp+YyLSV+kmheJ6QejMCWoOkBJdvILjC+3UWyyT7fksUwk+GyUuZzEELpPPpOBVgH0pWgeZ+HukLFRYDjepYdlRyTwlv5Kfj0xCIzgnWq8r23eGXm1imYCX0eFZjTJCE7UDieyvYWEnUUCmfU3ARdLnIYPYvQL8k4k3TMkQzedarx+a/jMAHpYsM6nmNenNIjNA6qVjPoFtPf6MmM1/O73BWFFvIkWhZ0YdpeAp59rPQ2HCW9WqWCoJlEQnZZDPpmAVUdNPoD6jRTEdp/khZLEBeLwYfEYvnzi5EIvhV3FXmtz5uyXjgC9j89kcgUQktdY45PNKqL0RLff7CjHhiYokaOxYo0y86/XFKPcLRL6QQ3pZaMDgYmaaOPiTKRMUNcw1aj96o5VmOcVKyaFHNmQ6KU0kofSFrLCF5gfWgTSfnRE8xAmN1J/VfO9W9/SwWL4J38tlzdkGUAPnVvH646X4SDbKVr9/LBDFXO0dx8850M5rmXADtL6ADjYbzNKy6UDK64Q8q1B9yxjVZCUkwuBClheyhYvVMZkv+QazYLvYSCK21theHk49lLdjxtWdz1uBDvoHE60yv42UrFb+h4MIrncgmwLeBDllMVndHRtCKwKRiGOTrRFPRgxGDNyexXoo/ldyp1fRoIU0lG7cZrNeb2BBjHGZVxooHYmMRzqK+fGWReqQXsOlE3COauB5FZojHPUGFauigte2CpKo/eykjpTX4EKu4lKncfuZ3Nsa4gGojIWgN/Eael2IPqQKcMD8M9eBWTFbwLsUgtFT5raakUexrXbrK9Z8D5dJJ3w2QAA/CvgiWA0wD3X0LO3oKt5HMybK6X2yxlb+V8n7zAGsXUNX6bjlSFF5Y9jAexTLD8DRpuDXABdhgUxEps5+/1NeMGpYw2roszTLD83Xfb2apzcCZBLPRHEu4NH0g8iCdsl6aZQfw8799jUl5PyW0olbIHbPQWRv2J7yWtoMK019pC9m45KmiMyTGkbzL5yPZKinPJjiLeWvBHBzxqMhcUftmcVEPDM3UCUw7rdG+IFukzXoK+8glHvs2Gnomc/q9uiJvo2A0JSuARhTYqJxSiF5Ad2cfrvkCod4yo16MtRMogaDxdQSrqEElRtKSlZJxaS5P7NAK4aJp9fqEGevPDTlJKoRGI2Uu45VWH4v148c8EcO+CMH/MdfKS94LjzQHBAB/+2QOQt/gPKiqhq/cpi8yg8zbMWoFkpr01ty/t6LXBhaIB+KExFLcYWm2UeR3HHLN4OzENYQ0ek12LVm2UB6XZ9ysYl07kF/mVbSX1XtAUkGXuWVEr4GIPfKG79++8LX505rjXfb2PtG753buBEaDFFOGUvWh5eaeoKjooaRnfn6OeSNCDgN36YvRp7JHlPOUWjlnwEQdslYTybXTIlV4IiL4WTlYRmR5u75bavnM2sAOqz8IcEnVIwMUca0aqhhSDRHZp4iQvc/+yE5LGa7u7NV7nKUlFVbOSUg+uJzN/PmBMMFmsBqat0tH8oO9v2cV69rKXt/6evTJfioXNpDJ1KHqKFThK1zY8u/yD0xARD/od8zrwkmkWq4A5iVD64HVM6f3tvzXw0u6dy619FfZP3iJSbMfmFPBQSoWiCvCgVJWJ/nmVpKZ9bnFg/ayBwEBzHlSeZYI8APaLYjo86MTThJNYOMIyW7Tu0pvTJQaw+afEHJuivf4IbIk31PCa03fsrIouXPx8lDDrbWiSGchzNO2Pw9a7zNsiYy4+P8RGKQ2IKUR9tFeJYHYJ7osG0btOyHbg1cC/jnusLenwahr+tkPcN5lmT8i4AttgXqn+eqhtIsmTab7eiYvjPplWP+bTHeFVkMVWZMokEciCSwMep9L98tXbKg39PVSn5XRBL4GSXtX/X3CKddRwwAN+o8gGTl+VH100ZvgtLYTDELMIgzO+AfHrXIOvcRuZduICW1389iPfFBalAlAOra/xlnT73xJjvhg47hCGijlQQx0ZguQ+Hbyh0e9PKh3NliR0fLvHDmHKVYIgG73pMosb8jpHdUi/R2Vek0NvwEzh1/e7IkGyMqLuRelSgvVqBRayNiDR6fno7b6dM0FqMWMu9u4XRP0CumtOdAJMGCrTWeI8E4IeA2cCJ7AuI557BISVdV3mEB4byY9QfpfQSkl1VJwcusJ8lawcPZIhnlqqlfFpFy+kexhTdL766c1eT3D0nmbtYIHY2pJFZ9kTivg7Hd17mlxTxVU2i17yXla4dH7bcCqszD+b9z/f0BEwOkpqVkDI6A4f4iTcBCsEyyy9CX19iU4wXxjRRtWO75xWTgPlDtjJ5fRIcseZIm14efsnsmT6xMOkUM0XMhVIKoA0LyZoXSCxHWrJL1iCXfMoC7pn716bPI94UQsi7M0L9Xke3sq+HU/B3Oho9AnoCVKftKZpUxk/M5HArFrSMoNwtuJevy9ej8+nmn987PWwbbLs5zSxps13/D7BujijDI5E4ii4wQY3AQOGdPPVaVHZ9NFS10UX0ykZSomCi01hvqU/MxE+NGcMi8/4ksyqZmvsqUfMnB3uWd9LpJFyUZuZL0OmBcsjGcaK9E5OW9LmSuZsLnnhr7SaMuD6yA84UxAKn/G15Sh5KSRyP+7jL///065czmVS+JrnqYHs6YRqKNS15BHG2koXPL5xNypzQJQMcq7K+rr+YDy+8rFrsh0TtVcPQZ4HINwSwA8pXGPNgvxZWU72EW+1U8JZm7cvdZvEc1/oThvQCfKY25kErkYSeiVThlsTZ9VyYz8hlFcxVSVnE2LUsn3pqvgs1D1iHiehI+X8xfvoPWgQk6qZ+lGa3h0FoeLFUM5ntIHamXgbZtF2p6Zl4qukRrz/k55taQ/O5B7vFDgq1QwfN3LNK7JyWKwKwkyiKL/DmugCx2bjLxf1GymYHVDRh1tIrIMt+V1krvOCUdaJ0g96sBznUvrU14dK7RbDSkH8T3dG1ueeZxSUzl+hsrIVZeh+MAabq8Mc+Gk2iNkDJblmw2TCkUD5ZH0/SZm/tEVWkyOCo5UK2hwwIm1JYtVgsl20WMFS9Hb0tGdPQqyCPWUEhc2Uc+xPcy4nw/Ou+1fB8d7oX6+r0+x7d2lW+mvkABSxLHDUiN7hZ3TsmCfGst41QhVsKTjj+qQXYeiRpVq+I4HN00G3glrzuvNpmvYbWfnX4EDKXFxmZtIWICY9/3NPecJtyz6SnglkhW2XZ0Nv5nXEFrgDdlMuZpN0Eitj6XyEErdI+R8VHitlDy4SlBRPBCDffVqHIBnwOVipttOFOS1klZJ7OL9bZL5yzEWuiFXJzStolO/35Q4S4KzRIOFLH8DEOT3TXX5xAlRPE+pXliNVIPBnvbMzaRyfVAU0udTPxnXPYMQjh7+oJtHfWDoKHamIbhmWteDAqquFCxar4eL9KYuhpyVLI+Db7/1jUks505gF7U7jkImTmFCD3OlbfEyDiKK71tCIZ1odtWCX/HRWh9Sz8nF1zuhD+qSfZ7aoWrLhmENHTNZsvbufOYspGblnZ2riF3p5+D43wQ7lhuxDTyVUGactoD2pdkYBV89sRfBmc9vWrC2D3ls+LTYVTjwcj4wJRnyCJ2k0ZrLYdBm8DWcoDfOwcnT02fBZNLCib+O81pF6fhqARHc2gp5ZfmvsI2CnAU2fSGlA2cMdZ1Dm5yZWVeui0Jw+/l+pED/sgBf+SA//grwl5+fpHA08g8i2rKUetGk0nnMXK4GYH3G+0otpa+pXQOjkZ6aiXAJM8cr5qe1hYz3Lsx5ZGPnv9/sw0VzdzUbixPzonuhjVAauR7JMhH87/1zFHiBJ9UIyqR2lS+mmtJQ9cAaMlJeizGLVxyb1+PZDXsv72xPzv3+5173LkdQrOGt1wPP7c/+L/O+mybEbO/oQIxG/4UwDXBHKoCZpx5kKLFYMj8tgZPciRL6UrRMZHlOyGazBmvXhGA2QWS2thSyrLiRYKNWD5ajq7YMa8JHMkbo4hPKeV6/jpoxVJv4cgCPtc9rT5YxuEXCcAXP3DxauDGQKePWd37IRdQeTOQlg1Dr6GfefpMfS/XqJ6PFYhLZOY+t+Wl8wrQRkY9nc6UsLMuRRyU1cfLZmirvC0H7/AydNDGMb1KmtVNh2bpWWWS7LN85n3tOQBRrfxg7hdWA3rqOZiMpa4E6d+W7y8LYIDm2rbRU16dII4DzhPndn33uBj5saWcqsUnfuSg3w8W20C2rcAWR4K0CvQ2v99mfVmIcKZkV1eh857nrURJn2bT2C3jvDiE5HBXjsA+TnadUpyt6rKG9Bvil8RzRHB45mcJlhoQg2GOBUjrmCRYcLjzwWPdp/mk069vvuKlL7qUQhPdwvzD6eW61VCrjfvyDXo73/kSmU/29oFE+qb9mxarRt8w8xXfwy33a4EwU1q6nmF9APVA/HWM+Z9/9VnXl0/XbOpq5VGq2ac2qFiZ/86ptRSRlid0EKfNfLdlDX7WPfqwHEC0I59Z7235t3IYnMq+b+VnH2yeuad5xt2jXbVBRHBrgkVJ+mrWyQlee42zDghDwLapFpZfrtVgHiiQT/rbGinFf7/fuZ/v1f9vwC39ZEnQ2lkvFh705x/c6ns2CfZ+xft5FkyWYobn/sJOzp7FzAdH+PK9dk2QX+OGSifc2A0eKGbOsIPjTP+l9+2dyKkz8wwJcdDAZH+RuU6fqNXL8EDNVm6NbhXTBKpHFBE0QJqgdlkyrDxAnD1yOGmkFU8SYape10hpyvxkiOSMY6/98Zpvig2s13uUT3d0GFb7Rkvph0sxRrD/5wOmLM7ahVKKK8leE0P1689mk+ylsXSLRBxCSRIATXJAkF9wK21jaKYl0ZBspPBX+T1JPcJIGRSpCWk36LHVOVIJALI2I0zkBQvFoAQXIVXXv2tsy+i9xbmSsXlZSRXt1uklQddNiWMghUw7h9Fkx7cHQuM8d/ZT8qAankgeHDlBQ9hacD8zMPzT51e+Pu9062xHZ9933vfOY2RA93vwRzw5Pb02gJKEow6nYCJjbOS9c7lQTMRcfC8bDIUo6YjBkr250j2/0ADRSYVpSYNC5m3OAJlm8bmkejXuhgerkcrJ0t6b2qjCQvcT2cia7wuBSccrMXUF9y/Z9J0bzU5EktorUQfJMhlN9JJ8R2gggCcG7fJSmftrC12SJ+Cpb15oVQDXXn+pAAAgAElEQVRKPiaBnk54JjjNckbf4lj7JTW009uKkvoxnD2qSAldk32diZEey+DZGReV3Ocn0iXFIOUFMP9r/r/LDFyt0DGCzMICZdRn6ozVXLgKC5b+fhuJrpxJAyQTwKECv640tVXiR0TufUDNqzkhuLYy870ag+InfcqziIBWEzsE91jD1tlgbpr0Yy2dYWsweSFd9pINW+I9WMA0v/OoZxlZsCczT3lUDDRJs8WMt1LFWu5XceEMRVvPO76Yo2RhBIXCy2GKZPYBsaPT6Ffy6SGyJDWbdM6u66BvMqWWKAR+Npdba7id1xqR0q8PqgP2/VzzOxAThXWhqbWSjN0nwzVWEty9r+J1AgyYgyOBHr3Ym1QDLD0M2kJ8SZ05QrPOrRZm78nGiBcvixbK8eJpB3lP114wQPc6T1MWKMal867WuJ1viAg/fUt5t59+h02SWfJFB7+/zwa6rSbKcxa/Opi6+3OvS/sE7YScHK2xVVK+0WhNGOMJLrgZB3A88/XPSJRUaxu6lwwrz0S1OavZD7m3g4AR+IhalAvqzakpm3uLnvtyBNJOemz4mUmoFjvkcMvCxu8lj3KxUYY2pE53ldLkj6j9AeLXmm2qK1eZEm0xGrtPXfdEeUPKPsBE686EmwVUmQ0TV0BaFZ1K8ze6BmP6B3TBz9nAFKacCBVnvAkP/54AERUfXGb9Wwip3BwpD5JySwRr4OchmCXaiuaMuO57UHK5q1F5MQjHUqhrRfSbkiaaec3UZI/rs6GxGN2wLb+r9X4rB8rBVIhgNcyb12ZX0j4bDGm6zp8a0rNhHVjKgdWnnU3LITlUfFqaKQsgviOaZ/AqAt04eg3AzbE95ZHEdsSdpp1j+l+EgrWK9c4pB2yUjvnGDZDxRMeJyWB04zxPatbH0Bz8WKQU5yjmhkz0sESyiyK4hbOTjdM9e67sLmzF6msMztlUKGkKKVPfjvIk/dXCBXm7MyL4ZDBEqjl+yWsfNeiYLDSowWTN/mIBgwyzi1Wp0ZdXRd7LPAObNg4xjpJS6XOA6RfL/Xu5fuSAP3LAHzngP/6SP3nXBBGT4Ty4GmDXM92cepadI1J/w63TYs/7WgwEhWSvA0RnxCgp12zLns3Z6vBSSxWRiCAW+PYsklHQWl9D8ItU9SLtHx2NE428vVM6WKNkeAOUbLiPyh9Csj6HF/BD3Y+ISEmqyL10O7YFat2fHTNjH527vqV3tNzp0eh0vjQYY/B2e1/g0ZSdfPEnrNe6FYC3Y0Qxv8/Wkl0eMGXxTOXFb0pX/T99o9q45UAB6Ow4HzU0SzbZZk+irATm2ZEId115l6xm9nVOT7bFIefaQ80CtBhOCfrm1ETL57o5XobCNeB4yWUEZVj2T/SFqZRDE0UMet9z4Ft5yeayhtFGMlmShTHlgyMZrd/J9axh52blDffy/VsBN9pLH42S7jU3WhSz1g5Qinmc5/6tB+ovlgs1DZau1dMCGenpt54nMzdI1ouUZHMZmlStV/G/2IvZr1xHCH8Si4zpgyPru1yZ46h1ByYncMtztwWyK66PlHtVEB/V68r1ITjn+clNNGXU1QmrIdlk5VmrulSqYV730uFGy5hP0LVdXraqiDilUsgRZzGNs1OsNHp/5xj/zmnOF38rj718PhGxPPcAwsBH8MRXjAzf6IfjEpx2Zouw5yBUaUTv4OWxJC+SY2WL8irRue6/8qc8mpLViurNvR13vhwpxfXT843/6aef2fedrs62bfyb/R/Y+e+531V42hMIRvhiwM++5pigGsgzlFJE+s6UjCYwbqlDvq7xYjFLbKunsdjhDSKytg7xVHcQWSon8aIqNc4ncZRcW515YqkkIm3DVfiq9wQbVd4kIrnvLNDuFxmgBkyhgu8Dt8HZnY0jQQVTVQsrpqFgui1mpoyME6KNW7+lRLQZYY7FQGVDZbJ0E1DXDEJjAQbCgtEGjJHMISzJxaJ0TzDwZvsiLSR3cgIALkUYIuutEQ/CKYnUjkRHXdntS95A88WsUpxhH8VcrQGMpcdT05QbPOUz86W5FzjwKTvH4GGz95J5vfYbUgOyIPNQkbQsyHO7ZOhUypPuArREBIwJsBUkeoIqhQSgzeHlZJZaES9UMhYJoHsCqD1tdvYxY0wy2CQmuAhmIJhRUkRKenf7m2v873Yynk1QF/Yx5T/q5ihL2xRe0AuVdN1Ck+YcwaYDK4NVKYTY4dPgimwurOJec6EwEd3B0Y8rIJNNuz5y8EXkQ6ftVXjWmmAGP0EZaDRU5JJ9o60kHwEfF2JYKYSJ1pEUSsSjFqBW4hBsM5l7GM8jH9BvZ/7e051z3Nm2jTd1+Ezq+WMreZnbDZXUYLwdd379eOc8T356bvziv6BDaW1jZ+fe3rjJt/qsO/+nf/Lt8Q3KP+BogZW5pPtItAGepu4C7byab9EvbykrjWGTyUCqZ7mKo5LY68b0L3DK6FGyodpaQ9lKQip9oaYJeBRrKsKW0SVc09JZGs5kI1GW7VL03kpGIpzoiQJPFF6hJ0pa5CbBKE3wzZlHJE0f1RA5uTim38eVrDLWzZgIp6GyCvKUJq4Eqcx/UxM1kRq3ONHyqdplGkru5UkWhAyeJT04cjKMsKWpPbBJMGV/FjKTzoiZtLfXTAtIaYwpC4TYaq5ODe3ufTVqcy9mYz3ax/Iq2ZcpJ6snsYRYZKz1JyRCElKLONcHpQcNZxwrkQ+5Z9AM46hBQe+VSAWcRx6mqoXwjGA0XUwRKf5CDi07IoGNk9aU1hSzkxBFu67CUeKS3FCc2wz4FaxVOs+KMQ3FGDgpJaCi0D0b4MVGtJKeutB2UU1QkNbWcH7OSlMHeza1xzI49Vrr0xAyP+ABGB6Bbfn3z3EhwhRHJaWn1CIb+QKhyiB9M9YZE6n/L+og31MjHD5E6W5ISShM9NvQVrJC+ay3l+8CiR628hc45WSvdRM1eDdPhoZqDpd8HESkx46qYs4CLOS5Uk0lvwAR8/4FwkSqSpvoaSsgetBQbpUw9gmpw1fx9fWx8S+/3Xk+n/zyrZivj87mX9i2DdsGb5rol9FSj/dbf5YMWDYSvdBPIzIufGie06cOQs4Vj1ynjr1gduLq+AiOM/fYH/rk22Fslqjg4YOPoWxbNoBNDigtYo8jExftjGKRHO3J2KrJfGzQMskxMTxOWn/nDzu43+8c42S489t+8E1Ohgy+7R/M5LH3kscYx0IJKY2tl4b7BCmEI+1ZSVywTwBLzEacYX029mM9q17SqxGxzlANOIo9LTaHEnnGujijS9H6G96rmX8ebKL0rSPmnFNqpZIXI/Dt43988f9/dE3m1ojMJ3rFymcE2bAkk9jymkjt6WoATHmPUMzTo6Taxfl7kjJzRmpZ5xvOoOXslfeFPBHZMg2s5xizuQSczTgq39sqcU7BnDL9jQsdvFMNZ2v5/pHNwSkp3GKATPZ7vX9c+WTU3hRRhIoPsa1zqZVRstgB5QHkGM/Z9Ft5Zfl4AL2KITMDu9Nax8zRmO6WT8xzT337bbDxUzbU/JYNkjgZpZ/92Z487AkKdqvivxufpfvf74redrwpj2qYnnrSQ0ipm4EOB3f60ThPv3ylRPDdaY/8rMcEtvm+/Ef0rrR7wwS+yZnNVwmebQ56QatotirCGpcPqrWeDBbJcymHXh3EEHFw4V3eUFI2bpyD/aZ88kQwmsDesmkqtMsXh8//95vhH3j9yAF/5IA/csB//GUTRFm+mbNP0eBlsDpo0+eqPn4fUmDYBARM6cZoj+ot5GA798XAGFjA8WL4bGUi393R1lK23qcHUsavHAyfxfK5QA4qLVXwInB9LnNwMSv3m0AudAPUebRXcydcFqMilNWQO6ZPIQnghWD3G2/PLwlC+OONDtxto8sNfwrDjNv+BXHFnq3AHsrmnmy+5nQRiODt+ZUvj5RW+udzY9s2vsjFvPuLP/m3/gfnefLHdqZka8tmdiYCim4XiBhA+rjig5dXES+ygKqkP+H0pMhGeI9khmzosgAgYj2jZ8nEKs6YoFk1bDGMZg4++e6g0vmciPg679Wl/FuTbTVlJjdmjvjCQN86A0sZ6Trv3nRHvdeQ1xnygW662IBD4oqH38H1FhtlDVLPZaoHyVJBiLAkA4gg0itPahy1JzwGVj56LXvPHH4Bdlw8pQHJuguq6fvCPJ6xfslMlXKPSFlClM/pPn3PYlu5xIlzVG9KKyg68eIRKCUxlSChef7N52DtwKquavvO89snEe8cOvMKYdisQU6MQT86TkppsX/L3pUA+lGDknMx1VzOqwc33hjDOU/jrd1RabSe/jBZQaZ32zkGYTBOo+mNdnP8OLHhNHa+/fbgp8/gy5evuB1sZwLfvsqdQx65/60Gq08Qe69B5xvHXWm9M46BD2ePxs4tn5Pc+L1/ALL6fcaZHksEmzudF1sUouS98vsl8z3/4/2R/jL/9PkTv/7+E6rKl/MLX/wntm1D3xq77fz66y/8z7e/8Pvvv3N8/u8cLb2nZh80ysemtcaGLN96nUwLO9D/kMv8Z18ZK2D0smsZseqMybILCqQpL//QY3nOZgt/B8u4AWA8kKGoDYYpx+MbZsYtvlRdDhLGFs4enYd/S+bpmV50b8/Ge9twb3wL8PJqXgAclBGDww7GGHR5gzDupUICO71k1U0T7NtaQ1s+ky+t8fs348TYviYzSDxoh/P5+yedXxJM6CDRiDN9kbxVPv88ibMR3XnyoN07vXeOZ4FAdxbbMofQVbu4ZW8fWQNO0ZQY9GHVc39DIoHCYwziGDCyLvz2/IZb+tuaJAj4pnf+8BNnI9pB7I0RwdC8N6ED/ERUOfrAK4kLAmnCE13gqAijb3lG2yjAlE64Epxhxb4VqByb9niRpAyYNVWxlYdcPXaVlPeLCI6KsTvl29myZjOxnB/EE1fnVGXzS7Z/q3UYVdsKwalTkee/vf5udjhphpMiu88HheKlgZmz77yaK4SmsV3LItLxSq4EK1NfVF8GVIq3QhyODP2DnVF/huQUf266qQEqVSQZSrOBks2ZTAByYRLkJK6KLyluc/ON0CPlXsQXHXsi0lUFn8ZVcqA0JGSZQovldxcR2r3jx7fcgK4pY2DBJwa8cbslopZQ/BzLlLmI5EjcOQ/DLJBjT63w1pB4A9ngdkf8iaD0E7q+g5/JnIoAHYglis0ZRB2SlR/Tol+BdfgatkyNzxBdjZguymXMnd//iGfen8hkQElmWROllTG7VmKloYVqBGqqnEa8L8nSDJQvJnxzwh3WOKbrIXslDwMxpcnGJnBOmCBPVJRMAQrxUrI2CKhnE9NrZXxP1xZ3wtMTK5PqKb1Ywz4kZYnKqHTSkJ3GbhPJkkVw0xeJrjiWV4UVWiVr8mpYaMNe+njRJkuvkqjYSsM9ZSxzu1x6pURjm/++NZ5latdG/p6JJSKMiRawStwSWSMI7tMR7QXxVP/vvqNzMCnGROIyB7uz3wC0JovGiU/qaDYHgJSYmIimFsg04xXW4HX+Pa7ZTAGcvdZ3QqisTMWJ2bQquUvfX9CHYJOGWq+PgNqe/VV/EgJNO82O/Lbzc6CICYdu2eCooYbI1WB1suDJIXIm3jE2tA1ab5gPTs3Bq45EXjSEmINdgeAT4mqob6J4DVU4obf0vWnVHD4FWiUxOnZ6IS8KtA7snP37opy7dQaX/rm5EJEownnenKHL5NyqYBrSGDEZOEK0jGvdqxFEeqrMZlsr3xzFadKSyl4baw6K8rzLe6UjgQpZkOlCqo3s+KHxXOuB6OD3iqfV/AnY61bvo9OG0q3RpxZt7GztRpOG86BX80KfuSb63aEarIaAZ1yYDWzxjsQNCeWcKL4IrBJet5HyFQK09EtKnz5wE9yEYQ+0Fdp50t+lEWfpteuOhHDzjcK1EyG0489rSAOEG711ntZpbsg4Ocqg3bSStmapXa1zP0blBrbilgFRQ8A25XE0iNL6bg5NL+8Xd8fbAyktfql8Jp/rhQKbEicRKecrItymvI5kkzcHC1eMaVIFc8tm4AiHOFLHHfAqTs+IV3uD7+DSvA9TIrKaMW0YZ7uktHQG5iUd12hzHWjKEno4+oK4ltBlR7Yzhw6z4PYl7xTR6RWXEj0NhCMyh0rKkBNBlu9P5gDUa2XTFCTr2srRR3kBuWSekEn6S7NryUB7NVgS2JSMDF1xpsW2UH5Tp188Fvp2i0Gfe34OxfREyPN3DJDutEj5Ho2tWEDFJIzObvfUqT+hnXsahUdHTXFJeaZhwXnmGZFDtJSWO88HUey/z/PBr/oFM8EKWNX2RqCpyT825NxzLBAkGlIc6nwZz2JWMJmZOVw+G3hPby5Rq8HO4BwnsqWnxkwjjmI29kejt4bouTzSzjauplP9i46wnW9A+pS+eTE4JaWRTD6Qkc35DzEiboh0iB0f+Tz8OwMZ/cgB4UcOyI8c8B98BVv6M9d/L1YW6W0ZEXQbq3E3BzFWLBaAPQYPslZHAjOnWdbXySDSyu2CV1S+XQliDgYb7JbeltW9yM+oWf17xCXdGp1WTbEmsurwUWCgJopNRgYsn7Rmrc5lvT6KxpLsXSxf9OoDWKMfyvnp8MgGuD0Gh0JrOawaZw1wSiZVhvHevnLYwZfxSfAVgC/PO78+JvPgndvtxi99Z/Rci+32O4MHDxvJZnKhhXJOj+ZwZNS9fon7F5pfF8L/+i5zEJE9B48j+x3L26zRJaWMEvhCNcGteh7pCTp7WXPlUAPAbgN0B4RDBCo3C30QUfO9YrY33/mz+urV3INcHh4n6i+s6spR5yIdIWmtoLYG09t31LKY8rkiM3kqzypxRCa7wYvFJAs4Eryw8or9CfCs6V2Pvh6p6eBsWaNMRhxenqhA06jayVdObnrUPkzLDmWnjoJ85s5iO5sPfJvPnHqfqE+cyUnoVntt1kDXUL15ekC5O89nngcuAyZD0BvPkRJuTW8MM1TOZJzeNsxgePnaFhNRZFs1XoReDBsPjjgTiOee+3N80AvkmDLcipPA60ayYMYJ6YnSOJ+fnM8bMgb+fELPPEhFGOcDHefUOkowlirncFpvbE358v6Vfd/hTXi77dzazgefDB/080bbP2vYl9Kttwiqusx+6ywH1veLay14gr4iYuUy/Rm8PfJZbeOGtI0WN4RO8xtxCrf2jrTOT+//yn/9/CvCiySYKlSsRBzt1ZscVbeJIHrpVn0PV2JntPYNYEK447usdTfUClx1MQclhKNqnFaMFWDdXwfOBoc5u5yIHIQ659oLymZvRBOe50CfLSXpz5EHgDUkOhLOPk6OLafL02dTav21JrSuDMv7Ogpct+GcBQiy4TQtQklJ1w9PbJ2ZYR9w68kszyGhssVczGB+KaP56ClpLAPdd5AdCef0ExvTlxmC9Dae93iyEFU7WwVwL0hw2Fj7Tq2znVP24UxDGMv+B8VAt+E0y5WX7yU8jid93+jinAW69NgQ7ah3tI/cD8MJqTVYDLXN8jtHgMW+lE6mkttmF8OzwZJkhqqHeSOYs5LXIWq+5mQ+RgRSPZME35ZyQnOIvd5j0Aqg0/VM2T/PvCgiySdWym7N31Npw5wWf3tf/d0B06Zl1hWp8/skk3irNZ1f8AomU7ZMffodZMF+brNguQLO1EYGquEmoFNZt1ozkoHXNYNsjFGNsfzC2bi5GmKaP2AiS3u4SXsJ4jXhXJ4UgWNL8mEa4ULKJuWBumWREzANycDTaLzQHLgjqoWsk5Klc8xO7Hji+70KkoGH0ceO1rCtj0AfX7HzRI6OaWOcQb85YLyheGyZ9KXIQhUnTk59DC+jQMgmWSLt65m0gS8haifaLBKUUvckpCbDdl90vXIXRJqjU3JG0gQtCDQMs5HeA6GYJxVvJuytPp53riQaXpKqvOm7yzUVlevfL1PiiCpysiCe9125pvytT2SaLRq/KYVy5ru8lFhD0JTGgDYkm16RbmKiNyAKeZaFqNbksFLsaw0Cp8ZCxinBzYKJzBLJpp5qJkmtWAevzQVvsiRDohLlCK5nyr6anyJG1D4f1X24n30dBilJWk31pekf0C75qXgdPNYl3guF5kuKp3kJuXj5LdTPMpuCUnqykT4NmdzODF0Q+mIoaK2PdBe7ZTyp38rvSKJeajDa6r61asAROx7QGIvlF80WGn2FNT3oLY1rDeE2dVb7xmmGjls2kFqDDr5MyiueSiNqrTcf3K3lHqii+GDLBL/11F2ukGbMRvBY8XazUfrwUihKSWp8vX60uDSMa000tCRK895MdN5E0Y44/zw4/g4u5Ugkfg3ZRVMuwblYnD1iGYaPrDxz9UeeXyrQPQiU2WXtAUypGXJAlIzWjFdmxlaISvGo4UEgf9IlL+ACznQsnjq5fejS/27ueGRxHjJNMzORzr/vyNPpJvRxK+DHzm4bGsq2fwE+IVg6uxoshtaQZ56HkqhxEaHFnS7JQNpFixbu3CyLwizYclDzzQ/6pvSu3JrzoZqFSIs6e5yzhvvND7aSR9ntpwv1GNnY0yOQNovXicAvXepi9hgHoYq1R7F4DzZPGSL3BK3giSQ3DLRVQ2HeupF+EnUG3aJfSVa8NF3mUFK4Ek7pC+2occWtPaLyDC82XBSQhapuM24YWl6MVVy506VxBNgYmN64VQN2ItHVLZuS38nVY0PCkPITixnz5jCUPMPnJcWo8BbX2RvKVoMZZ8poQJ8schL7kpGmgEMC0/q5NS0pgGw05C94NfTSp6uV7PtMdXoI/SU+TV+Z6RMaMmhzGBa+CjqbUnAOa9gE3CoHnMz2lKeo5ooeJUcWiPcc7FgyArJhmPlYNvunP1y6uAiC9MFZTRntwekPWm/4VnIIthfbSznPJ02MRNfes/F+KOeA4xl8PA4eVmyxvpEKkjVu0FQAGONIRGEksvDht4UOxt/Bb/kMP5PZtPllpA6dI0i5J52D5IPeO9oF2YTBSZOGYGlCr8Ze59unBPvMSyoOSNzWs96cxYZb99823o4cKt3Pn/gyGr13fmppRC/xV972wRiD4X8hNJG0h2S+HdEQ+9syDv9Z148c8EcO+CMH/MdeKkf6DqzcK2Nw+lulkkmeQ8mm2KuJe3hK/SQIqKPqBE73cnZuCYjwej21vJd9yobJiw9j+GJzaHkSuTg2B5gKT28r5wCQcUk8mShWA4xuEwSUw8m116tZNxvs00tiMuCm7NyrQfv8ubnDaXAacTgmAWcyYXVLtvfnkcCg9jhScuzYkHs2HYUbtzOjz+18537cc4h8fmVvd3beed8+iy2kfJMDGcGj/UFE8LEpbYGWBdNs8M+hnQtQAFd3Rzt/8vhxDDFd+YRGNd7Vy5/JEDWaBJyNU6e3zGy2UX5NxaCJMk2f0sqqxfJ31N4XOG3mkJt7tdIT8T1lIqO84U5PbyUtsMtscK7IoCyKlLtfLLiS1yX6NdD/Dq7J0twqLnj597zKoCWbM2uE6fF6FCAA8iyYfn9X689XvtYcvBro888ihE2y97elbmfG5jrzzuiUWCce1Zgm4zSR/SQXijk1gYex7C2EHKBnby+tPHJYUZ4xlfOICLsnUF0kfR5lS1bU9HbMIWwpFpgBlo15E45j4D14WtY54VuBGT6WB6Bkl6tulpT00Im1Lc8cuyUTI8B1J+Ij68zW0+vUg96zLntv78i40Vv52LSGkSzVvMFBK9ZgDCME9i833t7fMp9qN/qX/Pl+v/PT+0/oHnzuN55B7S3wOpeUuPyOyaFxXzTbyndfJIpNhe1ItqF4Sijuh+bxufq7whhesc24xzuDP7jfd36KX9n++hsAz/2ZG1pPzoofIwa2Bi9ZfzWJVVt8L9esT6wWfDnUJrux1rgXQDIHuXV/5Rranao1pGD1wl2cQ5+c7cxBTwOaomc+m9OBx5k1rQZ7b7gIujXEFTWpAY0yiuKW2VreU2+aIFEXxhhI+fk9vYAxbkjL3Mn8iZDPWDbBIxguNQpqHJ8BP2XO1nt5OQ1FfEpXXjMD15NAaH0n5wPp+xXjRHoHv/rzk1k/VBZYIevXWbPMYSRLQvXmO8bMEbMG0jPyeYyBiKbEer+Akd4OVDuq8IefjHjWfsvXPhqccw9IXKoUqWOM64AFBLMFppgzC29XXz8/90watFZMSfsHQCdePRcln2OnQBbccLI301vWfBZK1l5B+kAHiGB1/vYQUHAPRIznApI+kZZ9ixZ/u1/xdwdME4F6aH7Bbf25rmQaLpTQTNCnSW216S4NxyrCAZpdN24dpmsx5Xwtaar5SqMmiIlyzd+ZzYnZ5JlmUyG60J8DuM0h1PRRAEafgxBfAzK4aOvTbCubTbMgifUz8ayk5JNRB+uknb250rjTueEOfpRxVyR1OCylCtJMayOkMfzkeQz+6DkhfD+r3fIUtBX1eg98a0TrjJ60R8Rp0Upq4UhUL840Bx5tu/jebMxCfiJ4jih2lUGTsXRUrVANWAqMRDX90sDxMs9r2SJjwqdmc275N9ulfd0QtGSr5uXiPFemcv35GkZWwzCysiqvhSyC8l/URnQD3djI37WpYfoybPyeriz4Z9M4P995nSE8Qthn8KiGwkxqRVKSqUeuqzGbV9mSqJdI3c68vGQeBumBkO89l8Uo6il+vhRJLH3jXsG+Nb1Mf0XpdlYCdvmI9GkeNxl6CLfIxOzws9BN+flmYL2KoOv+OM62Dsxpzstqas57iEgxJynvgCrS9UK55elYgb3CVpvNezJhWnGzBreZ8J1ru4unlE9wadpPaQQkEcT5XSY1GySepPRIT7YKILFhoWkir/fU6R85zJ9a69dV/ghudeBLAm0lf9ZQ7DBSLmhf2sqJyJqm37kXJuKiFyBgUvNn0r3eVc5CLjYiEiEFLY0OiYXcMwd9kRb9Hq5N4GiXb998Po1q2gDDbZ0jLlUwVTIAFXM1m59TPufUfKYpTyR0TZPvXoPv1oQpNQRCr2cUMVF7SiLqk+HAl00AACAASURBVLo96u9bNSmUoNcDGO06j6SQIfJSkW7eaJ7InRn3b62vIlsi5U4A9tvXlDTheYEyXAhyQDZ19EMH3oLoVEHohRRPXkeyQm9sfaPvjbPygfftxjd/oIctfeUegrZK5KSXbFEwSiKt2xsb75gbfjpEKx3mgUQkojQct0gpKLmx752xFWNIDG1lEtobjel7ECvPsGrMm451Ds5zyQim4X3zGlGIcKoSIoy4rbh8E6WVr4JpAl7cMumLiGRqTwj7i0b63E0bV9Ny5jamA6HTVICDUah6rXMtRKt59X1cmjeIHpch/EQM9iq+rVjZ6SuSiXRb+yGLRSfzwz59f1oWqP/x5J8+OxtpcA7VBCopqWXIrUqv33UPjlayKDMmiVzmqlDGv8EEqL2eNd1ywJv//vrzNXRBl4H3ZGoNvdBhKiU1LNn88HBENloksjtbjJnzHbPXZC0bSgFHJPLN3Dh4csjO3i/UsEXqlKs2Th/sWzYOcuk5w0/Mgufz5Pl84uxo79kcRjDdU3rRHbeOVo44uuGaAB6VlNPqEWxn8Hg8aWW63GzDoxUrL59vZMezPqODGqgS6ow+GGIc8UloEE1xSURpIrMz3rYGZR2+hv6wM23SphH9ft7Yz0LJP+786r/w3t/ZFW7bja+//Av/pm/85S9/4SPO9DciG7HZbFUm2fN7un7kgD9ywB854D/4kquhWH9wAQaC/J/oSHl7mTRcHNVzNcAHz/SDFqlmd3pf2lz3OF5n3lYLN72cqsH5orFWyk3lX5J5k9XQ6fUyZfkvRESet3FtBpE24aDkA87cdTYph7BYvhHpr+WeOWpe+lKbX6jmHo6NBDs8feP5HOwNbn5PYEfRIZtTskdCG4qO3O+3o/F2fqH3zs/6lZvc2OwrmzU0lC/3wbv8FZOd39t75tA813czJkI6MjYhqGxML2jVkhEOf+ljJMo+c/TOJl5qNEd5/3zDNc+uQKphGstLulVMCo8Ei000d73BOWOmCOhYQLHVxyqP1hnjpoWAFEgopNihAnu0yrOjXjKHkasZrrCXnNR63qFrLX4fV+XOc/AzvW7xpaSzwFjOMpXfLJV/gGyezlfTyapM4M2MWV6g7tkOklA2JgvqZb+0HAiecjK3tUbH9QXApooNQ+Oc8JoE54kslnwbr3G2PLCEP8Xf6WtzNk+7jzA2uZUy6EkwQUCKekmTlxLS82iIds5TsF4SfkyPesVEKx+S7JnGdV6JK3akNKe44dFSAUo0QWzRsjKLlFlVcqDbe4fDcMn3eZzOe9vBnmjlcGbOfn/L/d/eELPsB/rOtu+odL68/5xD4y+d/csN5MjuoTsi5xqaZu+2prUoV77s67tMAMj1DGVJh95H5zxP9LnRR9AaeD/QGPg5EN6x42R8q4xOgt73BTSf8dLImjw9dwWpYYNr1ge97XxnJxVDlB664vahgrTO0DlsynUdmr6Ws4bMc7hA/56DzvRcruKlKU03zjCiXYN1nyoeZ+e385ObO10TrCU4urWUdj2UZpcq1SVfnP8XvWT2WwEyxbKGrxzQJAF/07bm8DN7LMXkeEgyjM7z5Pc/Pvjnf/kvEPA4j2QBKrPrgLhe3zVIppoH3k5Oz/nCjJtRcVkpj1lJL+BWP6tp1WZyZciVR2UO/eStphy7pPWLjEEMBWt4KNY+U/6+7ulNGk8/+DyjfJ+STThLeGuXekOELBb9JEfk2ZHqMC36OmuCKZOdSjGp+HKufkLE/OlEuEBmIjU8lyu3m9EsVHErz0ANem/lSZ0grVSPqdevetklB0uik7V1zQdEJIE4/hpH/3z93QGTaTX6NRCd1tlJgZt0xOa6AvafBwSJ9Hk0w0Z9mMGSiFvIBTqfcskbuDsSloaVkVPZqafrNV3rskFkWqAWWEsa96tR++jzQG/8Ud9/fUxG6j6KILLTCyHjOlKjOoxgL1ZPWwMS1TR9NnUeU1Ifo+2N5xjMOZ4pDAyVgVtj0463DbGklR/PvyJ7Hsa2nXzyVx48+IsZB7ekqzKIM3j4N/bT2fed3/WTz/dPdEsNzJDg6QPVvNfedB1uvYqpNAatBKoOtjzAsrjq7ZqOqg5aLfZT90T+S0/DMQLEKrFiNXFRcDuz6aCCV7I00VRZENVmikaX/NwzKAiXd1ZzEG6riQVJkRw6PbmUw3It3WtTmSmxOfQ0FhzFXuhxq6DUOW/fF8ru2XJopxOhXWboWyhnyfJItSeBRYv0uJhqHbKhE9PslPRpqYbFKcKUW9nEEU2EkZx5L5+a7DkRISjadjRWSIjOfeQa+enIhO2/fHbumkarv7U/+I3UGf22F2JW7uxl9vL1cN5sp/fOrpXwNeMv8lfMjN+2k48Z+krbPAu+bFhYxIVWr8RE4VpLZMGfzca5vq7u4FyeEWDSUCv5zCWZcayhKKFoGchaeQVEBOEp3aDel1cZtctT736+STXZJGVGIgIZiWzXpkgcWA1MQwXdFQ/4LEakeq8TqS3WyohB06kZrktf95INcpZ8AI77yAJHsgx1gppfZPPOZgM1pYaaDFa8lrEMnF0g3DH/QGKnSza/1W6ZvFVS/tXaYgN8L9ehaYw8gQaXpnYwlTfPJjzDKydO4aGdKAktQCYrM5b8zqcmQiykWLKFCht/OtiraJH0p8s19oGLpyZ+6eObgkS/fn5JcCKCmzdCJo15Xn014E7Z+PbwhU6JkERA9qB3YXRB7lX8uyAj6Bbsc1DSn6BzsJZSfE0aVgX4dn/jvude+fn2NQcmfmQCGcGG0hWO42ATuNHxzxO5O7133jfl0XK4bxhR6JdRXg09jDdPz6QeD87jI5PrmPrfqXEvIrAduDSMk+GJ9A71bKZqtv8OO+vPWR4cqbddbJIpyVYs1+HQ/KxYkJRy9wDvqEhJe6WUwBmspkYs1PvGVmFGWhrNZhH1Wc9PllfjHjs+vRy03AEHiD4qVXPOmadUA/eN7WLWfAfXJnMPFapzMYxGIUG9micTpegvPic1CETRpkQ450y89TJ7BvC9Bk/h6JZ+JYtzovnagfMsA7U29mxUaMbElklJossq/1nm3AFhiZjsLZ9tHAeUXIH1xrYo9WWq28qolslumCizZYDyZ1P11VxS2rYXS3CyvW4Y22JEQOZc46wBnTSMlMA4n4PNd/Q0oigJGzu7Ns7HM1kHxzdaa/S+5XptB6jRzsHdIexg6ynDvPfGbyd8Cpyn8dEHz9tngbdGMjGacjuzOX0/g/77wZcQ9pLWNjciRg3YgxGUJM695CdBSBkIF+Oo+/ps6blxRHoxJVsSpHKMJpmjqX8wtfxTjbn2wvEz7s4vv73x87//TETw9fkr9/6F418H25efkbc3vuw34rbxz7/8L7zZ/8bx8b9yHAdeA/pjdzT+dhH0n3H9yAF/5IA/csB//OVy5Fm9egp5zx8Yvc6aZjstboQHW6TfYQ64J0vdXiadBWRsKRM5996tWlSTketbp9cZoUiyCiKWFNxcx7lm7WXP5g28vQAysmleMn86Tbw3Sq9yyawCyMh9s8scPUMOk3L4afG23utWzOjuzvn5B/Z88Dzz+3zGYKscy0/h6/jKGIaT648uKUs0YJfG/ZH52tu/f+U93kpWUzjHQONBjxu6bdz6yb3/Ctsb/x7/yjEONrFiKeWSbxyYJ6A1n1nmERHBZzNc/0i5nmLQXKL+eeX9qLNZwOKd8OnjZFNtEFuDnBomCdxjLPnQtVYi/Z7dHW0PdKv+Uz0jUy1/PIgYKwYl0BZc0rcNVcI66nvmJgIgCRaJA/dgE1/gigvQIvQXKaT/7KuXJO45gVMTyCVbxt0IrF1s1DmIe9QZlzEn2CsXP+Z3M4eElKVcdTGP1t4VwyVb7eHtkk+eaH4PevklJSgr3+uxZVyL9plsIQAKUBYwVQlCFa+8TfSSooLqDbqsPmWCg7JGMh2YDkY35NFyCDuenJFnoVvaXHwbB+3x5Ha7YePkfGaNlGzqho6U+XP39LYsQI1y53wY5yN4fDPe3nbQk2En4oJa8DjTG84lEsRjaU+xdeF9pAj55x/f+Pz8LK+ijb3deY4nyo1W53Fr2VJvodxGDqg2fcdayqZtu9DbPQHnt43j4w+IHTmTZbHrn58l5J6wqoEmCOtUpZX/y2Y7d8vcr53KeIKcnROnbTsWOx9nsfD9ydvbG//1t0cyVUT4458eeNuzJuUbOXMbObSVVEdAaljSE8D4myer/nu6RvNU26p61KpvYeFoxRTREuN/aeKHyGLu3QJy2RjDM6+5xSVHGSq08l89j7xn1BDuUfKot7edeB6c7ZO3tzciGn6AiLKNO3171J67zkd564SdWHtw/P5Hxf/ZFL/hlSoNlL0bxzNwizxf+hNvZ4JK/cDOOSDrCBt++vJs7kESN6q+c4enA4+TbdtoKpz9ibwrMjIWbE25WcaCYzvwOYCi0SKBJXOnGw7aM3bJznt548nY4RTikPR/HoPn8eDbePDx8QHjRmuNX75oDmVbgomGKFK5mKqym/PQkecBV/x67XGLyRrWUAMwb7lX+riINOI7R/XOZ23bX7znQHMgBLSSWU5Z4AJYeJI1ti3VK8IC9cD9pKnSYlueemaTQXfJ3wlBbz9lLRdPwgPlyHnQ37j+bifjLKm1qfe7TZkM2RbK1pvQKstcCY5KHThJXU2Ju2zcWARvnofHHDT1F9Nsr+HFpHNaJRQIlzl7Jfaqim1k06JpohjcK8G+kkufyLHawLundnkm9pkIEF5nZcpWqHbmp5jTyNnyC2G1P0xhPD+ZBvCQaMQBYM4e77gPns//m7337ZEkR9L8fmYkPSKzumdndFpI3/+jSYCgw+n2ZqarMsOdpJlemJGevbc3AoQ9bL1oBxrdXVmZGeFBJ80ee/584m1N9OcOz/Y5wQsf1wff5ht2/UBr5cpJ54dURjmZPpi1o2+VMYx61AArHNbGbiz2xZcClAfw2v+vCZrM9OvGlCVYHMiewumyCNRBo+XGFHYScS/Sam8K1dM/3uLw3sUzgnulzCULHODBHypLfuzKWobHLBGwys2CcdP9+odNJJmQUyPPxHzCvCWILZVZQ9cg7Nqf/89yDYlGfh14XpN1h1DTK6u4MmqyM/KeqyplMTZcObKgXfZNXXw3nyVZMGFpmeGzXnaTXKibKWxZ2JUqjPysHv7g2yu8OX95ReP95/nONx3UWvnL88l/ebuYZfL/lB+YGR/D+FOPz+9P58GvI8CFp8TBMr9NGj0YYHYxMutkLsalGCIlC1XZa5WtLLTN1M0dIF633YPlUBrIBvwgGq2yv882E+RWilj4nzvxPKx9QB75aOmWrEoCZV5sH+K1VjT9lbePshSYhEewRk5E7CCxn0VSXfxOtcpCstcWd5gEK8wV8bGBybKZ3tyWpK57CNzysDqxbRkwNVgoYwykveIQ7uVL6Gbdw/kvWgLWHtrdaOUFBbQvyx2l8HMVbKpHfm4zGSmeBe3NCHlM24zDtZmFXdcC8gojhynX16BIWwMSyYy8CDI2swDFic/jEnYhrBRSzkNfEy47ODwHGcm6dua268PIUErd6/9Wv8Z+OZJV90GnlUbDmEViACZhjQdw1Iq2CA/VRxYKen9mmkHL4hPxB600igfrrpTCnI3pUP1glBcg2KyYdCgVNcevi2GG//nJWi+SjCzVsBJxCZ/8zb7K4spV0PLI5yhUU8ZESnx+pUTDo5pB0BLni2bo5LIUcJfNuJm2zj9BpOxhlVm0lWojbCxEIS1xACwt4HTGcylf7HABLp1Z+L2CCJFg+VfP42AL6WYfuyll5U5mxldnoNS0E2Q/Q2tw4RoWaz/LFYAlFFsDpvUFdqaluuwakbS7GTqj8NUg+Sz28LKKE4nzCiQIRdzfvtQWpy7iC/t7d5Fe7sK7dEM8FeG59jUHmqF6cmYShpor1o2hwQIHUrW09u04iyt3wHP1lTt0D9rM968CGYil5UeeO9f8xAgFHzPqsgCo7u/BQFTTemnVc0c2/iUZ3UHKUnkHP5nX4NA3ipZ8RgrtcaCzcBwD9xgcqSpopbYG429MO0GM2kYOO2Otxp5YOdI25tHfsdcra+N7+FnsQmbYW7iHLcl0QUujtANhUKrgzfcweJ2PkS+SNbjIbr6cTzxB8Ns6gp3B8LgKYzj1o9I+StyHGUoRpWKX0en49Wdcn9lAPSij0KzRytoTjCH/4yboP+L6owb8owb8owb8979KKq1Mwu5Pcyg0uUEZqRP1BGi5z/lecv1Mp8kaeMalM9SAIk6Z93nXlcjl8m1wFZ9q1ouyzpUOEDk16uE8wpf1V3Rse9YA2jLrz0P5q6NmPrGA6bbMDHVcfE7bbnjYJsTE9wdTezuxAWjEA6x98WFB4hhjUvnB52cEp3sZHMdBGSOsUoEXQVxiGnJd9NGxErY7WiueRNdCDUBszLBjxUOR4WymtXNi2pDa9rB9ysiErGBVl3ns57iUwA+UW+ElC3PIjCVDtnId/fK+ExuI3Oc1JAm7ZVhkl8iLQxVHcR/5/ZG/WLRQJr8fTENaEi28ycKtJ2sZMiMj8K1wTggJqeElQuajJo7PrEmofn+WqxfuPS3/X0Ro06PvcNKeM/bFUZb6wiLWQIAqrD1cgTGiVmklVTsKZNSDlgR+ZbBA7eHPdOmxL+DqDV9ekrWUCHemStjaxdDU6WWp2+P1tRmgeHxuQSOC2EOEIC1s8nUOQxGhtMg/GsQAapgjNrjEU33hDAbVT/DKsLC+akyKx7+rCB2hpy2imEe2LLFOVQpzLMefIKyXHNp8njNJ8B5DKXcKT3y8UIPWHjwKoUb+6FQr4BZ57DbwCaqZ05fPRrUSe5rF+i28Rd2XBHCnhPqhg+tk1lcOkNYnoKxzY+aQFQlsdoHfgf3FnigZ5Odj2b8bcxSuk7SvFlorcFRe3dA26VfWteVAxknlHhZO4SaJUvJ5DIagzNgHq/48fRWE6rTIWs++lXvLTlJyz97ZfpCENKKvRejlzmfWdJcSrchDqa1R/i5c/hk2hKtfxvdAv0jjmleorqcx+0BnQeeDWitVO83DXcF1EVsEvIN3VCPuZM5JSWKmz7FVsgDncqyyE5cSZKoSn4lNuHqP33XWqH3Nw+HBFZ1Qsl69PHO16ivUUiKMs8Ivofpedsz4EWQZB5ltE2cUNhly4dTFC1Oid1cbOE/MQ9Fn3dAz1FZm0dNeM2JiijrmgyFRD7rELCRlQFyZbXppvBb1UPMbHvvYUuUSz0NYMhtuneiJYzcaONWW6kr28H49a20+1uYZ9odlPYOW9Uoo+kVCbLKe1xgAZz1Rg2AcdrFJRM6ImimkdV7u3/qZYp64j8XHnqv8W9c/HDANH7gZTdL+JBlQYNsyhFwLADW/7l8eCJWRTWkU9gL0kr60AsiPLRsrV0MsprdXZlpUlb3Jz8WCG45Qo+mapI8hkIAZfjMD3WSHnle7X5fnhzyRHFx9KdoRigVoGIzKtYndDK/Ffq3ypB6aB2b6/HuLGzstXmcfFAnV0ZyT3j+xIzbLPgfaDeWK5ScnfZ7YeOb7NkZzpoYnKVMoVGQ+Q05XftxWMHbtARCSmxE9s6GCcdDzbS4Jq5nRlw93LqZoWr4HsOeP8FnXAnJtdj5rACUj/dmDYeQa0nVLP+9gpyxANw6S+0OIAvlIH4HmBduMzlya9QWLPVwcG57AcBxVtcLIfAYl/NIBSpaoQ24Pzp/lUo+DfbF6V6HsRGEB4DUknVE43+JelZQc4wyW9WIOfj2ei3V5zUJth2JOJL1iirMZE9siwAtvCYR+ez35dgbL5M8/osD/s/7K8YBHfTDni0s/GDYYI+SuxeBxBqv5T6+DX/ydhz6oOniUB8NPTAvDBt/LX/nhEYo5ioWfr8TGHm5RA51vewi919LqiL+wL/vuccvvLFZ8g+m31/N+QGyytj/FmJvhHIx8k7ASi8Yg7FPMjEVdE3v7AiQEYGJiMWRVpTkBYLogySxlg+Ig6miu+yXpj9eXe109N3urcbMbFxR7uEAqQ/uXw9ytgAgPt/2sCxdUKPVm+KrOPbAX9P69GvuyUyKwkFCjmn31jop7vp/Rn+ZaAK7mxyyAM8uX1+7ra7fNZ6UmaQGgYNnILENcRXkuPYWQp1hYyNi8QfF9pWexZWisyyeeDG1n4vWZHM2UG0seZATAug7sHWY+axafkvYbsR/08UBLnBxlVlQq0mfYYKny9INrRjN9q0UshjH4BpTKeEbDjkNlA9yZesEQQ1NtMOcHTE9/nBnWLj4pV6cdD3rmGrnDlYMzc4swccI2bgr00SOTQjtFMufAnbfyLeD9Ujhq4/1NeHsWejai43fAQkkrEsUIAO4rmUCFbS0l61xRy4LTKN5Ywc4LlLv84FjWhCL7+44cSJ46NxD1ZunqnQB52PJpZF2IREG5KkUxjMhsMg+Q0JytYLIkSbzkzEbg57hGMTgHJV/nshmemkUoUObgVizf17bSIgvZfaU6QZbSL9j1KzsyGF4SKrQNGETDYItRLoMV6k0RjqFgRl3DqH0PQ0FY7IUgUTNKgO/bmdeXx3nWLRLgyOa5KZsFt3IYhkb5DyD2pOVZUKPwwn3VyM4ljmlSpmRsUFo9gAWGQHrizzkZPX73It+WGW10UUV4UO2Nox7UBbaJQXnxfD5Dvbnsp58FV0Wvgo97WF2SCX6W8N7u/eB9PNLqpfKY67/ZNV73Qp+GS6ePGICLhR2GiVLeDmYpzHoxHsLAMJVt42zLYnAuuyDjkvmlV9D972fuxW9XY06l/ShID1yoJhBVa0ULXP3Ff/uv/4L/xahVsXowrWIePMXer7C0/AdN0H/E9UcN+EcN+EcN+D/hEgMf1JF2WZkXUqbcmIVcDCoUEA3r0ng+FPK5+tfX1GXDFmdB4ff7Sdjf5DNkiiQ4bStYfcjeg6w6i2Cr885E1gzbniaZYSdbiYSybZSDaLR+871+toKgKn3G3ysznUqkZl0W9qb10bBPY+Yh6JdvW6ltK6wKpbEY0HPeJNJDne8fH5z9ST+NyyfaPhmlIN8e+OhQ4n3Px8TUYl16RfngVW5l9FIQzezz5wKrReK+jwDRJaMRihue5/TE8bzXYklCcoes0RzZpBbNOkQp+/61xL7vzzHO6mW96VIYHp+RFuJ5VBC7bUSJvxp2zQkAUwIWnmLscInxFhZN9QqFlTiHXZRaGGPZugb54HFvaD/BZb/P0c7+6tIb3JaVJfrl2bG0RQtSuuf+EkBlKQFqsveXtYbveIupMUJYVltr/1mZ6RolX+7PJfMW2XWbFUMWUagqdayhbNZqor/H9BZ5yYN4VqbsHmnqwbHemmva3c3Au9Q4izJnD6A5exkZwuhhSVsfnWKVox6IdzCJM10DODbKdttuZhxHQaXHOtLIRPE8K80dJ+1KhSQLXaDCGBOfL64Z70GLUaozZry+63rxNh57395vSWAUYUo4YRSbYbMpCqUGKam/eGtK1UKTAMjHGtp4hczoK750aSBZt081zBPnHe/oCNep2kcQYRZBpqf93hF5b9ZP5lQeFaTFGSrf+wbCWw5nD4fXIuPoQKcnOb0ieFi368+TbQuxTiIzPtVeaf+trjmYFWaxPTiz5ZLiN0FG3fZ63gNczc9VhPIQ5Kj4GJg5E2N8nmFvLBV3xXqnulNf+XP7yc5EnbEXiwQRLPZHEBqtvgWeL4HRX1xBnCl6112u+/V7MOqYJYb247ygFSoNmcKQ+Ge6hbWchlXosIWvxyCLWaAN7HLg5CFPoDLnRWsVlXsYtvYUiDlBWXtDnuXsDCKofMv4H6dcJ+U6QS4co49Phk0mFyYdy5nF5R2TjhanqzHLYmw94zc1h9X7ed/WuiK6ex+lo/l9Q+X31YcOhsdaqLRtp7ioL+LzC2mx4tt+VsAcLb4xDP0y/ygWjhWjhdW9k31cfr3KcioxtMYAjhlEo+hZTpA4v/s/GCP9w+pQLFgVxRpMqHJ78G9mU2FLhEeJqZl7SKADx6uoDARDvHKDECktd0WXjYMXRCWAuRkT1iuVStGERWltahS/BxElGc29xc85XFB5/E6KJpJFNAEQdmKBid5+k3UGPFUMni6UkhZEmflwJetGuVlqqsQidWWZCIaFgrJ8Jqc3hk1e9h3HObXzytymqkppD7gGJp2ZHYFJT9nhk2JCsZiiFisoinjkVqAHw77n6/JtK6MESztCSrOwlYakbcsCdKLJz0ZfZHvtV5L9K7aZI140wBAHyfDyYhoScPjdwTIXc9Bi3eyn5kseknv44+98DHe8xOszCdWSfllrDytc66H0mPoWv5AFNHlmD3gUMyLRGC1m0M9yaQLFsnqZlHn31UgnO2jpTM/cfAqTjFTkYdEA3iVaTOcXaGaAJHt+ZalNkQiVJn5ny/t6yi2DPEZsPI/u/PoZzckvZ2Q+POUXmjbe2zsf9lfeMbp3DiGYb3Pw6KE8eMzKN/2FZo2KUHul1ifPczLGoNZGnRM1i6LIw8NU87OqX4DkksyEQdvgwRoqRxPle18ZW5lY972YqpybfbG8029W9QpnXVP6GCnfoLx6YdqJAi0tKYZDT5aZm+y9Rd1gGlPrDsieUsCP3FsGEfrLnTficYgtL+q9Z9nKVxCOBQSsQ0JaFhNRZUsO1z0BTvO6AV7zEay7vBfrPi3ApU7bKtKSzEvzG0x16YwEsI4MOnU37GtgyU9xZQuZQJFlIxSpSzfgvLCBaZkLIW1nxmgENkUGkSwbWPC0zmoWNnsA7svCKgIncXiJoyXOnmrhKe/+FvfaYVC53DIvybM49j20qBn6Drdytnjdtnnuk2NZvtLAIodpzigWpzjPEyjCJAJlq9UMNk9mjP9rhvc9FFKp6AGeQF9c4VPvOMeET4K5bfMFeqKl0IEhkd9xSdiPCIbOKxiLvjydQW3Gmp0Pag6OIigzGNHFQv30OODt7Y3n88nHI6wk5BL6EUDMJyPC0dd57AFCgfTFpwAAIABJREFU7jBnJitwYw0IgsWTQIaMeC5F0MwCaLPySGT/MENKWDVc1bZaLWj/wlV81yEL4HPT+xmlUZfSN5uCkcOLvK20DMjsq+AcNxj8M1zujmgOUlWxXKfdfbOA1YWZn+M6a/AWhBl3qgU7S0Toq/C39iXXCKiWAbC55wCFBh4ghqXqa7E8P9nQGkph70QWWTLFomnGY39X9bRgjEtyEBqWWcby0i95fiDcQbNq9J3fuX7C78kyZf93WhN4nPFBzLoQe0STZrnPb7/9GDIsC0qXinEwknUaIOWIYY8JpVVqU45HpWYTN02xEY007qnGE9QnPiK/dBI21629U1pljLFdCNScOTysIqfClZVBdKnUGZ+1TePUVwCtuy5TzAY1WXifdEaNeqJrMm1VQhFmRmSGxudaJZ7jS25P78c4kBn5Gc9+cJ4ndTrBmDQGL6rDeZ18HxGo+5gH1o1ik17DcmiKM2h4Uaa8tu3cz3L9UQP+UQP+UQP++19qAWjN3BsPS/WLvygp11ufSwxTFolmZh/vIMuaMlQrZmnnmr2zQGTWAaLRZwv3kM/0InJ01udoMWzJe1lGwzJHZqleJjUswnAagufQuZOAVyl4nqdRfSy1Q2L3YgxfKuNHYDUsFj/BKtdV7wmvzBNdQp8TDUBehIc4NMfKRMQCfLYgcnr2/lNCST9n5/P6norZRlPBzxdPh6Mc6FDmGWSs+TCsePyzPi83TEOxuC0ana3GWu4k+7NF8czNivcahOOYKOX9TcA+nwTKSEV5qqs9iUfujg7ZFnWaoONVeqph83xcGSapvAXBSqqOBNTefrcGG19C4EWZS1nhvyUwXFg5eS+UMh0n1NWbaLCG4D/BJVIQH8zcl8sGtI2xMi2nbpxpsezDHjvu2TShpitA3FZhlkmZqUoicsOi9rpYSr5iIBaAc8vBfV2EjEkQ2lSDub/r0XWW1cxLhaiyEmdatagJEHvoVEczfkFoeEYzLMJa5DWtNZekmSJ8TmOa0/CNN0a+ijPGRcn4juqFZ6lUqfx1xr8d8BwqiILaUnErWChc+3RQGOq0wbZA1cw+9HxnUSeGzbJZELZEBa+VzzGooqhV1Grs86ueHYGzxpok9r8xKI8CUkCMaTEc7yXwXiuS3EvFdOFtzpH3X9T3sGwmgaZao81nnmnR4/mYMMKxQQdgqayxxrQLykTbxePxQH1w8cJRup3IikORVOSU60sPUpm5xzx6DgipzKwrf5rLDybhDBbDpPjjwwY1ex8fZatld15mXUORwOdXJtrK4wv70c7onc77JnQNfTF0MOUFHradp8G8fgN5YFMIHkpDrGCdHK6v5yotYFePB1iZfH6GCv3ZauxrJVRDsX+W216+KH3G2XHKjNysc9JfhAWvz7D5tbZjVOxL7u/4DEy4OzzkGVajVZAOqFPeDJ0zhq9JChC/rXKNELCsMxximL+GTsUN6VGPMtMK2J1Xv+g2mf1inDMPEL+jbIpyNPBHpeuahayzQ1gerTOKyawnLAiUi5A7JrXWe+9cA31psW+J4DZxKTvXOuYn4YgW7h2OZr2zauPhvutF1w/ukc93pEDxiO1Z5IC7v43X0aj01U9YRCJA9KLuzqAz6/8YX/+HA6YWNVZ6ht7ggZjTk4EiEmzSbTWzwJNs3sWch8SGXX3uAn5l+Ax5UrLKGZYLTT3k2e4cNrmSDbJCn5veU8fCYPlQ1xyOKDHQKKKMalt5JSOLCnVaAobq4Q/r7vzlM4KE3zv8KX1UVSp/f8bB+Lc2IpisWljrAa6Nq34yMN7XJzE/uEYwVaV8Mj/eeTwevI5UPRV4eshkw/ZNGdeLOb8Fu4E8bMwo/qI8GqXMYH2PeJjf6jvdOx9+UfSRgN7Y0+JVoAWIcrNh9oFEMO0KcGQ+yHMqjW+havLPtNYwTonJ82KWhLKJBEltM/IOezA9Dmy3ZzaML7pmwZAMIhHZ1g32pfG3PARBtsRSuAJcAKrIbggvic3og0lJcBLgtUO+8/3LbTXzs1yH2AZ9omEoe9NraU7tgKXN5JpaUy1bEAdZMsfb+qGEQUT+Fr0byrIsBGLtiwjFHOOVBVX8RTlLgNMofz6/8U+vYK9+e2XYt7zBVWA8eHv/J65i1N5jLY93vr865bfKr7/+yi/zHXrBp9JR9HEg1jje3ylz8nadPDzyV87yEWwct73BuQpn/b2arRen5V7R7MvWlZY/mO+wXZPBzsugbNsZyPmCDmaC3gux2AdiDmpLFi/NKqbve1N3B+qIyb97AD5iSNHdsDEHaICijCcru6TqDBB8fm4lymd14Az7kSQfVCl7DWPOWBt/siCLzJSvEtZoud8WS5sXucOiezLWF+Ml3muuJXdMKxfh22tkE1UnbX09EhNZku2Atb54af80V3p+r+YsPz9gh4JqkgGADdB2u24BUz4PwbqLRmEW3ZameNmMR5eowc85eeT9f7O7IV58aKFQ06ro8MqJhW1WBpDGYCP+5lXOne1SEshRn4z0rBYpaFsWE505jV4bPn+grhxV6D2zDPWKQuY05G1lVSxALTttZNutAPRxIjOylx75BoodOKFG+BwfVO0Ik1MEqFzX5PXZ+fZLgS48vG/21bKuO+wjVVUPmgtXn9Rx8FajOW8S521DKfqgtUZrjccjLVWJwdsUZRJBldaIM7IUjJkM8rCjiAEaO3B+g5IifGjc6zaePK8ATn85/4S78/5q/LnHa3kvwi9/iWHhv5S/8uov/u/xL3w+wzL2hSQm5aniDSWAL/aZzG1tVTZYapTM8JAJxwY74zV1Lfda/AmuyYQaTDYjbe8cVISWhWsvsgc4256KACJEwKpsoLasOlEGj7nCVec+/97WoyuR7ePum7QSIFYysmenJfmocyvqA3iKGtCT+GQ19/4Ci9ikczKSfhwiswA5ag5a3ZUkvDI0QuEBHksJ5HaftPJCiEI9zhwJe5F+21pGRtFao8Y5PrZ3th4DG2E5MvsPfA7q8YaWiagz+4PBpPugyUC+FWZ1/uktM9Q+J/4B3STC7TWan1fmpDYtaCQHc7QGfgbjOD+/Q4SnPJhM3kaheAwYJFnwf78ukB6ZHLOEq0FrPFDKFGoJVnx7VPilMuVkzsmpJ2gAOkEOC0Zzl2d+BvEcaCr7AJ698naGbab+5tQuHKfidBBnzA8u+8hF0hgd/st//jvjPCOntP/GeUxQOMOhjFOUkjXuz3L9UQP+UQP+UQP++18iBS9Bag0AJvLfzGUP3kV8ZxzsYazCVynLlTZZQihNrCZQI7EW12cxGKAgHs8TxADvVrY4mi4s97BzUPOBnSWwi2FBZAWoYwI9FmmScl/eA+hX2cp3gOeIGnQOw5LB7tL5LJlFyI9Yr9ZiXxAw/cZg4gV6DsqOqmgOM7sY388fvOkbxSdMOMeLzzOsjGZRnnXSxw8+5uTNQwxoXeilYO2ktxY5eOcHn/8cYHhvMFy4KCyHGRFNFWYMYYME4jvsXPUOmTdXRMPC2RepFENqutx8ub9idYOIqwatWXcNHqwd9rPeg2nqlef1BAnMSeXAdt50WP2OeeEzVDguZQ9ZFtFVvypG8V3PLZ7rQwWdgAhjRH+gEtlziKCZFfSzXDF8L8hitWdmTOwluS9rYSkxLC16H16Zy8p3hH2TJKAb90liMFQC+zu2Sir2mlCdLvZ/jW3PyZo67bJKZpDNGlifGebrrLf9rKiD1ySzzagNHZhpjW0C6jUGqLE7I1ZZURAqlWvtf1I5WuH1+qRfodzpPjlG7PVNC9++feM4nujxFljmrxN/i/f9LJFfckz4rLGT6ISWuSnFB5cZl3Xax4E+BdXHViA8rPO9920t7u5IDXXFsI4X4+xOKfD3v/+df/7nf8brwd/sB712Dn3binaoTIMxj02mkzF5SOGplacLdVS+X78x6uDz/OS0H1xHnoO73zVO6ZsMwbYvTBtqhLH7zYN2fcOvizq/YdfFdV34GXvCx5yU/hZrqFXElPYYfOhvAPxX/W/81l6MMfioOXSfbe+/cGUNBSOdsBgZAfITXV4mZKwLRHvi7lxat+uTinLK7/PBjpkkNnOucnGZIRpZrgAyhfYAa4X+ObHjk8/5yfEKC9HzOsOy/nSGNqYqz/7km3yju/HL6cwXYY06w9tEBc7EYT/U0PmdqZPPefJK+3idJ2LCQx/cFq+T6c4Ygz5zMCKOH4PmQcQbIxU2p2Knc6rztMi17aJI/4FOo9U3zvPExflxRkaTFKVfP3jZyfw1axRupZLLwp3/1ZVngs6JbXKX8cz7fPXvXP0D+3jhV6f3zucpDG9p02kcteLfGvIXxd8K5zfjbFHDesveNnOq3B2fvqMYxAtFFaZxJCnSLqOWpWZLMoywo3c+iyX5VqNfEnARLsnht4zAz4XAqQDsouejWPyIgZU74qv3+gI2LPEJbMLzwLeNaQOObUPZIo5Af6+M+tfX/4e+XREafTGe1/NZB9eap7qhEpYIK1T3HiYEwCMJnswWm/mw2xaiTdnDJi81rYPkLowjtT1uUFkexXrbm2gUkRATNiQYMMveqEgF65EBlSxy1Zu541Z28/Ltimbjf/ms/OLvaRXklJbFpJ4Ylcs+NgtsmnGda0qeB7AqUzvTZ8i9k7U6eqiSxhg5K/x9OtDQi5nSuzYbgkTgq9eYOPO579vy1C+WZnQS/LkNpM1lnXFgWUD5Wnj+xaaBYLapKm+9xYMNjFJhwssdawEYzHIh2hN8DS/8ZgVPuzy3cts7JSW+iTIl5LxDZt4jzyY52AarOZ7UHYq+Bk81vDGyCRcss0wqMOYIb+mS0lfXkO7a7UFd9A2TD36qS4zikkxDWNJWGBsoqy6UsYL+ougefvu1XpoZIBpWSwAuhV7SlsZlMxKXS1MjwuZigwwpcvAudQNhx42qUTLgWcZi2U3kUehXhPPJAX4G81FmYb5Ort+EjzH5ph3VGhaQnp7cruhxRO7YAG01gKRUIA69n4fpUObdsAVzorI9mdM5W0RijRCgnySo5sy9loItnoyCte7FEfnch7vQYDUX8RcTpiRAjvwZfecXyF6XKhNf/rD5YVRt9/siQgqj+c/hQSkb/HnVe+C+VJDijVU8tiA+3I0Q9/MQ/51pcQ6HrMZmcpUFaiuhKIDD1s/fixGsYaJUjd8J0L+EdtahmxEqS8atuhlLP83lkSMwU0Ww7M9EHLeayDE8kpAwFmP368+YI3N7FKupahhzs9+GBovkX19douB5WIb9ws5KMLebPaeKbkuPCKm1oOndA6Qv5/UCtGqy65QeYA+p5iiAHZvF1nvYSIkoRsGTQTkz+w57bRxlq01kYBk2K/aG+Svs9mQ1as4a7ZsAUxAL73ArjQV5jmHIEXkEgqAGQ5cv9LGJBc002FL2Qu09C1GnFIkCSJTpUSg/ZlloIZjwKEoVR0ucbTN/l0goKLrNfXYcMy1ZJNTEcT/vIVuxg5asthVM/6cfBw/7RmuNNxG+WQsgoQhnPfnbedJNgnlrwY6ac27ASTNTBM894neWfoQaOBtV1BN8h2UN2+Sgy89kOxT3ZXk7u6/mXxnLNs8rY/q9fiUU1gtQaDOEMXEb1jpXvCrmnuHraUu5bBs1cs7cDPW6QdG+1A3uDJ0UJeoruYO2VTXrjLjPtd8h3qGqAqXsGtEgrAxVGCu74guZhaw53X3vGTBuzZIIR1I2l/UAfmxlPB6qe8/crzFPbHZs52iEjU/kM5zMLjwejWsMSilUSdsRB2kPKpPHURGNIPijCdRQdugT+vikLDsfsxwgZ3isD65kPS713UzFhZhzjskvDoKnRU0qHWxgGL2HLVlpNbLaasOr4g/DDqfXiykBjlgy6x5ULhuIw+T4wtQeu569wd0KV9jv1VGwPuk2aXMpKuB1RpOlmesjD/iwH7yuTz7GB7zlgH3/7EqR8///I/A/4/qjBvyjBvyjBvx3v4Jg2bcya5YFwAYZxiFye8ViOezbGU4asXcbNQdQkD2mazi5kN+TYMzKY5x6g4DpekTYmyxMY6nZnWORYsx27/2ZHqDuzqgF3b/LcDfaLJvVHPVSfK5GjV633Blh5p3qAUD6FyuepWYyIj+vo2HVa4ZO28NMd6Gbw9V5ZtZhvwTXEnEGcjFc0fZExLeN4tM7/XyFsqSfjHFxvA089zDXsRXIS6UppjdZF4laPAk6Uff6tobyIr9b/yKCSUNtRl2VOXPTC8tyufoCu28caa37UFZYWlQnFlKU7i0JX+Ac1CRMrXqhWmUwQrn9xZpynafyhbCFWGSCmSGp2G0DNIG+or73K1ItF+KQn8ciz2R8hSG3esxK2e/VrXFoDOYFBwPVQjPFzdOOF0CYciEqYYG2nA2AVQPUudZ5oUuJXFkbX0hiq/Kq2CB+lhRqT9unHBQiQTh0nDr17qu85drQVONYqPlyAN1SNSFYTG8BL07JeIap8ey31jgeUf+3/gYNnq3xVg+ezydNn9CE4zjociII02aQrERQrrsG0yDQiwimg2YHZRgqM2y9WTR6wmpVrlASeqhWVYSCYqI8ypNHi/fYfQTWLAPsEco6uzCLrE9N0L/IBIMigjZhaMdq47QSkTg4VTVAdT1wObfWAb7ieELzxlxqpmXPpQdHnpXVKvaSUCqNeOrNJpMg5RdTpg+qVB4yML94qfBZch+pxrCsgzz6eiuF57jv5X56PMQNSJBpfqZLLAYwa13W/ITdT1Y9GPBnqDHja57r1HERmra79kusYGrY2psY5TGR0lDteIV+TSiTc4Zie9ikasUNzguczsNbrA2FWgJHMbvzq0QEK87ZLzicIWf82VRaawgXIm/7NZ3W6bPDysk8ll1r1FB+heU1Y4bl7zReclKkcJD2xOL0+cGYJydg4+A4DmTC6A9UoM8LncIMdDjuR2lbTadY9qExn3A8RRKxRpppOC24UebBgePVGSNsicX7zk5yPbjGyXMWPniE9XALJwvHsemIKq5XYg+C6kxLxKX4XDbjiouixWirFk21uIpy1jX4CeGFi3JtV7d8Lx4uBSXf9xaV+C36cWqsuS9Th/K77M11/js9FXImipiki5wFeUPi/cysN9Xun/evr3+IZETwq1DXgII1ofb9Qw1FJVjjC3gzHzkZE1TGwnPwkaydxeAimtdlD1FSKWUarVDcqLG9sVfYYnXfheFqPMwMy0NMnS/MpPT+FI0i051okeNDeRvKr2eG0n5+Y87J+3jwzSOcthWl9BiqXEd837/Ya/tgD8/N2IxL3m5G7WrG/MFlL5iGnRdeK/aLIl7BCscbUCwyBZL5IiI4D+5cAKfPwcC3PUba+3PQEwAJexXPQlf/jcJ/BWcit8xZxsHjFaqjN2v8JcOwX9lEvbTTPR7ykMueCbQs1nEFjgRuB+o9G94AFi9hFxGI7yJ4xEdJ5NwvH/TbL3l9wFdJVEEkx3EpN1QYmXchI16zcO1mcT0sU2D4z8VeLbPGuv3S6AZ7U29Fl7N5VubBxupc8dwIREBwFmT5LEQZWFMq7ViC3jXlqpKbiSo5hc2C3aMAf85vlJQxP07FzljX/RUN5Syd+nJ8Gv6YzD4YV0fFsWH458Xr5fR+8kv5TwhHAGRVGBOkSrDazDhajUwJg8aBufHajZAgct0WXfMutnfem6Vvs0CZAV5Xgkltbride9jZZWy2+ironBkybUk/87SImQn+GhZFiVlu1v13g/PpdlssWQKvM4qFWmv6msYzUHTw8lRhuuThXUONMWeA1bnufakbMGreFxMYiUSscMI6Hf1q42Cr4Yr3EXt3SUDh2HZrt/zmLlhIa4g4sJKpb7f0ekgMBeKFLSCVHaz9s1wzD/KcKkHKrDebF6fKsQuOYytnnZHMEeNgptl9tfDwnhnADiBe0yP+9gIv2jisYsOYMjZTcV2iB6bQzVAJYHo1kWFvM1JNsIZiS7mU2XNfgkCnZvHBAuXBxkXlLexpgR7q92CVmlMU9By01iim29aHZK8WCVuZCF9OlYrBSayJBsgYzBFN3hTdLPM2On5dzE+j/OlPYQMjV+zXsgb9yVo0oxLFZSFss9DkGlllDqGUinsDqZSjQJnRjFkAoZLkErFQWEeBKITgNyzO1n17pBIAd85dmxxoKpqLFx5pB6U/8s/6Lzz9neKF9njycKdJY3Dxy/HO/zX+C+WLH/2UqFdWPsdVojGOs3EkMGj7+Zta8z7HZ9UyIwFfzc+B6c/TCDmPHB8mQL9yJOyuVfIL8cjRwqlGDU/wupcRymyBpQoUieByiIbZdQHD8dMuMZ4JChi2QaZbKRb3XA1QvXPTZMBen2F7aGWGvc4CRAWCwHTXSAtoqPvd3EpHKc7YgOJtTbSu6oX1nVPgmoPnl683UzyJVFNvNZ3UFWoeuRJFohEPqzqD+UCkZi0XQ9LDhcoRNnPT0jJG6UdaA2oQwkwE1c/4/VXC7mJ05mfl1/mIOr5GDVe7I8NgTso5QStuYf/o7gzv9NE5z5MxBg95MrpyHTHAfzSFFl7/aAzbh3ZWxXZieObRmQg+wr+bZAzHQou9qM6D2pXeJ+fZMXMON4bDdQ1MC5+nhmKuTGQYb++dl16UUvgog9NJsDRJVnKyCGs/y/VHDfhHDfhHDfjvfy3i5967Jaz8xgZj2F8PtQ9Z92mCL4WiBTLjx7KeFApf5wbLctjqnY22akT1uokINe/Z4XUPNtGVnXerZ0TGl55dOVL1NFxREZAeueeLxDGyXrEHOLTusJ1kYk3MOXklGD6L0JPVfLjwJ33DxkiSg8agJ+RsXHpSvNC7UR/PQByGciUJwV2Z3hl2cc6Lh9znOBq14imh1aY6nva368weOsOSMN4quvJJsxYK+8KsLyeMGs+d5bB5NNmYgXvfbifF3vP9GcNWtpUgFkQM9nNSNgA3VZC130qEsBd0uxSrRf0ez0jaLrGyHm2DpsD9fHwB6iqSy2IzbDCvdD0SjXHa+hn2StSsUNeA8We4PFbuUp+vobbYfktEjhBI1uMA0xsJ2VHFuHIvxGuSwsLgdczoK+omhbf8meULO74xUiGDP1gEQpfBxMKiWDtgVMs9LUJY49v1rvdWbtHwSvEZ/Y+tn80XhbDsWBDgJkInQbA0DxcMcx7PQn37T5Ed64KUgjdhiKKlUGvF6NQSxKVYTxXZ1rSByzkgKybDjDo9fp6GZV+8jgtVZ/aBpeppavS2bkIz4/l88vn5SZMKw2PYN5V+Gq03qgRmt+y+sIKUAQYtXTI8cjRysK0MM64xfpfHFXtiDIrbiDPYi2Ke1nvcqtfDcrBnyqMLvVsMD3BwC+KCTTChlkmTUD7XUuBtpB0edFNEGqVEdGnk8jgz96FaKrJySD328cBEv+7V//FX1Yhg0WWhJotw1WjDI8YkpjAEXSZBXwqP9RFMmD7TuSs+ysrk0Mow40RoxZDqzNaZ3jnPwSL0uRf6HDCE+Vnpl/O/UTAXmgmfXsIFBbiylmpmtBa473cZdLtC2UpH3JnSOLJ3cPeIbHa2EOD5PHDOqO1FOM8gIuV8KeuURbyUJLiFpesJvGaHtCAvVSgvp9XKa/hyHmfZ3aoJk2Of9VcObpqEsnnIpMx0PrMHB42znzQiloDWmD2y1epx8CSzRo8kyT0LfXa0Ks/q/CaGFkWa4UxkLlpLnCW6y9kR9oglhmQhjnkiSf6JszwGtIclSUiEKQ1DEIm9VTiT0BtRNOphhY5Fb2dFdl1homi6RyyntK+RNdiTIScxm49BVMEYfqXDQqElScr8xSJw35j7v7HG/9EDIDSUSl3ZQmkYLgKSzLA6HZafcVmF+9pAA+xZ4ZLrQa9yM9MAbEbzvxqHr18rVgMn8NsaocDepN3nZtBAAE5lxAMU9+9m5qwbMrqlhFJ49sr7FTf9+CyYCW/jT9TyoHiB4ryNaNR/tSh0nv7i7zUOQW1fisRZwAQzZc6VCzSZF3RzOpMHlfm6sG8TFcHGEZJphzaPtJIxpp8ghSEVpeNeGG5c2TxhE/HlkxwDnBikJaNh2coxmb4GOHdBYDmJbOON9xGF2bfznf+1PXg8HnQPWd//Y3/nx7hwV37MwsuCBfdIlscUKPLKjRG0SLBddWVWCKQ9iRgxqPrvrpywqmfD7Phcw8gGabEXlje5wCVSQQKo/cRE9vqI74sHrJnAv6E4+I+83NOe4V8B0RE2m4wZT//M2GUAdgjrYoVb8d99f7sGU0cUTW4bDJRkyc2d4+K4F4rEJrL8oCFAczNnnpPPHwF0yljSbWWWQpUKMumfPdhqctJ758frEz4DiPirf2O2kNm+edhMzUYsQgM/JqXq74A68R52BpC2A/L7+2W36iLaooEgPEdDBCrhfV3rwW82OHOaXyXurYjcoZRz5sbvsVmv5j4BgyEau75kvoaFfY2nQk4cSIb+28ggXCng7zDARRKwCIDiYLFL4qAbzBzCG18JAKt4E2/b53iYbnuPQTBPXCK3Q0SoQ7hSCl4yaHPZeQBcX3zyfQVGFoIN4XH666LSEu+vZVGJxFlta++11ZD/fJfmkH6Zm5Dr2pnoCn3GsC/PEUSNPXP8btY5eOZ6j+flFMuwS7BiHONWqoZqabIy7y6vG4hYB28jwRiUbrk/rxe9mirT+98rq1As3oMMeo1n0Wh42iaF+juVSyOsjzgcewl+BKsWADlw/rqf8TsDKIEoVZA/IQLP8mDOOAff8/7Nc3KdKfPWwqWC5X6wlA9uFv+UTk+/qwksi6J2xhlT54H2UKYOnEeqmcUVcY16QoLQcOoHb+XX2DvKCHn/nDE8yNfQ8my/LO5HmqPl2r9BJl3sXf3cZTrj12A8m1N6FHEPKjKMIoV5Otd8YpIkCpynP3D7G4KHED+HfS4d17CqKp6ABsar3usgSCidwx/J/KmblVhJf/CcM/4sV3ViPdorhxLx5+qhIAgYoG124GIR42HxCOwsT1XdzOApNwPLcxqa48C89B4Yw1aM1eWC8YxiAAAgAElEQVSnrdHwrvOjJrNsqdG1wZy3PcrDw3Zn16Jf3qMCOm4LzQAabva+GfusHsp+3c8dcC237RTwfDwY+h1Nq61ChKOG/U/BrVANhoaivVWFGo1ymQfuFezJ25E32w+UwuwGXXnTd3QqByUYcR72OrVURn9ha4CsqcR0RWpkVDzentS6LBrTRWC8g0mwW4cG61tKMOAtas3z+0cA4SKMMgKAnIJfUN8LWjqWuXLIQHRm1sakr+dRQPza5bj7Ypy/U1Ym1TmpHwLDOa5gtPYzPrNQ/lc+Lc7OqgFUfQ7npRdHOzjl2s3T0BccoH1swPJnuf6oAf+oAf+oAf/9r9j/bQ+adKQJTJmRW+y+LXFgEQ3Y+xaw7ToBvC51jcXaWufVevfLfcUD+Mtvoq6zI4eZOr9kQYgx0D38jNf5xb5RBJGKmFElWMLmi8WeuUEar+rZY/29D+X9TOZ5GUxXoPGdIAX8qMYi7RarPOoDJpRNFHbG6Pv+/JgfvL+/c6W69TfpDCZVjO5GGRc+zyD2nEstmtZpbeDvhatc+Fj2+FFnR90WLptLAb4UK1VXjVv3fZjOJs3KygAZ7VZCzdsefxEKqh+Ee7Ix3RhrMLDskul7wBjAY9bBa19J4hWAl5k5F75tD4srXeN3HV+sKxexaFtZChS/VYZd43e0Ygx61qm2rWLhl7RS7PxMT5cLWet75vUkYApcuogLHV1qnz2AWKpPOKbur0+1jeXUeQ9h1/et/TdWe/yumcSJ+NWefymOSjPDZ1hIrv0uRvtzr41ijZ5DTU/VT8NuorzN1KrGFfu8ss8fa/fwmorZ4K0eaC1UDRu5VmuCrwqqHKXd5y+NupSt4z0JAp1FrPlKgplqjFf0WwVHbKIaZ3kQEAwf4CPOfwFUKy4DbYJ9gA/n+rx4uwxGqGV9ODUJS7LUJB5TQpcr6sg5+RTl4W+4CbOH8tw9SO71aNRSmWtwl18zfYQoVIQpcBAZ8ZJiAp8N6TEsP6xRu+BdeJ53tu3pI7N3LtR+YQ5B6+A8P3lY3f0qY6LpZHRETA4dp+We/rIrx53wTAvSeTpFf55nCgAbFNedkziz/ogzbJ1LQkmPM5MYJGidSL/XavUcgOf5hMewRsuBHM54Vl49zm3LekMAmx31g6pPZAiPx8Hb2xtvenD6oFjkEN/3ON0h8neBUo5G0SAVDgID9j7ohCrJpfDteHK6pE5AqFR+eaba0P5Gv05MBSuKHcY0w0fYz4cRRTBKTQdTgvCkaf9baAxTXpfxer349ddf6fLjy1BY9z7SdXBlb+BJcjSLgS0FfCqzKzbClcvNafLgvU10Or068mz03uklnE3qo6Fv8P48uL4QQ9fQMOxPY36AyI5qqDOzMxmYZ++vYxN3JeOErkL2RtEXFAI78KXS17EzsSYW5ZoIRcLKXHQy9Faxm6+eNOtp7sH71JH1jG8SU3GYxCC02ZcIisy8Dvz/fzxG+ocDJl3NWh7EM1/ozKYZgvlZZ/gOlmzSrR17mDT9CVy5T3cWhDA1Gh6XRi8nYMxk8R61bH/4RUI2M05dD2J2KEQxMnMyvRqxqV/YYGmVEQ7FC5wYq3vh7RTeTuW6LvR7parSrwtxaK3hZ+FNQyHzPKNYerZv9HyvZUYoYL8GfYYSiKnpux/gpqQ/Ra2DWpVKw2gUKnM6w5VJwRDO3PiLvOgWTN5TnCKF0a/t+TyW54VHsBrJFFjB1JYb1CV+2/YweeTBoD0W9fvrnb/89hcA/vLxT/zT8Qtvb2/0b38LQEga9n7x8fHBq3dqeupOiSYnWKp5cKvwKRoPawa1qYQn9CrozWLY9LCbUaY5wAxP2fizcx+mkxXc/WA9TM5MZofasQsDk5PlzRw2WILOStO7YPwZrkGLAVr9fWFrGiHGkE2cruFlNsnc6zoGj79/fL2NOJAk2Y3LFiqf26FhsRIAt1Hy8C1nbFY2CYswwD8/Ob/HZ/LxUmqtvA7jeFQejwfVYbx+o/fOq0QTc56dz79+zz0A+uPPPOaDv4//RimFX+sbV/uklMKnf+csJ67O1bKxkNt/v3ZJVV8+qgK9VNrIAPCr8pePPwHwv/94UErhF23wPNGu/B+18F/nZ4Aeh1Ez4LWsfYEMA8TBY1YvkBuoIHSWrVYAAnlgzIGgG/AE59MGpeQQNc/9Lp83kIHtvJ9iMBLonHh6P0cjH4DS2sdsD2kPkeB+hfdnghRssPcsyUIUocw4QDwtCCCa7MWikKTPn8Te6kBlcIx7UB5M3GM33AW21YwSljboEbk4P9WVQcFScIc6UhGL4y1Wlplypke4y5Kkh0WbCDw8rH+CMZLDdH9nlGQvu4FE41Lc8DnpFtJlEcGqsuBrSyAKeXEkEHHwCAvVeQ/aTYxR2UXAUvcuJQ6qX6xFBnLItiwFKHow+B5H4iuyR9psmMVzdf4ymP7Eh8af+QIx4rlv88nQOEOv+uTwHxQtaZGT9/VIH2Wb0RwShAqfFQZcPz74+NsPyp9/ZbZkL4nTPD3Yk5V9vgS5Yr2X+cSTs+l+4B62fupOKYrWA/cfSTw1RBy1SU1Gz1FsZ1h4Wt5UV5BlkQVelGkG6/PDKbmHPF7K83vhPAft7y0/0wLtoF8Agx//+YNff/0VbSH5L/OdolHAPsqLnjk1I+1bmtlmyomERV9NUFPEeVKZcw32jB9Eob2srsLy4eeZMB2jhqJKohldOGUR5UjC0dSo32Jwk8CecIMkPrPQl227pq6MZCTGo5HWwLJs2yavZavisb9RYv+MbMj8kji1l13bsZ65TlrvgUo0JACaw5fh/M6KsmD/3WBvLuYZts+CunJf9FaPiEejC7Gffv/+nYdAxyi10KShdjKGozx5P56MdtLL4DgOvBnHY3JdF3+vH0h78FD4uH6jtbB48Kuhc6J6MLrx9vbI+yKIXVQbXNdFnca3BWQjjDm5OOnVMVWOo2YoOlQPcO4533jvD67r4ps3tAVAXXVyXZOnO/1ItaQWBmETc7aDUUD8k4PJnDCkZxPDBhyLnxzJyHaNQTyAZ637GMqvn/Ec/OnvjfYDxlD6+SM/q8GPHz+y7nF+WFhxMODxeCBHZTwMP4RTrp0f2kaqT0x3jfmzXH/UgH/UgH/UgP/+11WyHsijZ8rqyeuurFw+2fcwe9eivj83tRr7mnw9ECxcO3JYvr62iEFBbpEcot7KtjeWxRbsLCE0FIBA00fWcnX/TFXFeqyHTaDAmVvFd/B+xjPwzx8BLv6nH0/+ktmRDwT7FsObv719Mufk/5wffKy8tiJ86MWHXjT9W9QtNLSHjb+NJ4PInVB7cBwHZzvp5YparMwkeE7qVKoFviDEwF+LUQl7TnNnXJNSCpyRsXyUN7z0BPiuTYZdw4jC7WTSzeLMdQ9MwYyHF3QRlywGVK01mkY26Xi86EjUr8WgxN8dlmpCecbvdHiMuZn5K0pg6m3/5R7qSABJtaBr2S4ISCgtYj8OTGS63RnYl0KSh9oVe7DWi29+ppX/Savf4nPxAxdnWMH07g/+oy+xA/PrtoUutx3kg4hyCFLLGuDGWaJ2RxOYKy3jH44kD3f6Jout7M7ADB2zSdm2zL8f4C3C/OHKkQo8A67Fq1HdZJ51F/3/Ze9tmyS3kTzPnzsAkpFZUvfMzn3/z3dmO3Pd6qrMIAG47wt3MFJrszqzs76ZeiGaVbekrIiMIAGHP/wftCPrnmbv6Sz1tv8o4uCvWA3cAHtEkKIhIwkUJloy96whf6g+6Bp1oUbXCqkHdfwSDXkvtPZrDFT1CmAASuupVlFeZ41iXPMTuJB2hHx5PRMcGZ9hiPM5Lj5/XCHn/aiZKyjnPHn2C4pyfb/QEb3Idjp0p9gHbeb9tmjYT1G65LB2VD5cMClojeHWkMHEuWbKsidQZSagXbRwLunxWanJVpIcelSvbP6GTaM8G+MEt8KwwHAMhCub77KdjFxDv2ijHm/McoWMtFmcg/m7rhm1fOuOa0i17e64LXWQxWCrCD8Xg2k19hdBYvUrhgq2PKy83mBULWuo3tNHGKq3+LkIPdlkZXR4hNTtt8so+8CvEWCkBOerOKrg9uR//PoXtm2j7n/h7e2N9/0XhGd4OY2Nw4Lh0yX6HZMCrmztoLcORem98zDHbXAeb7T2QLeNrVaOUoB33FMWdmu4XpznycdU1DulOybZtTVP4OxkXopZyO9fc7LtD6SclBosxtLeOYqza6XKX2g/Cu046Ol71HWwJJXVnX0BSiTk18UnzWOwX58Xe9+QLrQhiBVqOZDSYHtjt4bu4UlqNRVhfhG+/8uTtjtP6VHH5/w7nh9oX4PjQV3nhpZ7L/eS/SZ1/Cas5EzFKlcqcG2zcuVy3ntK4RW+nFXBbBJCPYainJrsbaDM9b4evk4CXw2fN3uGXDrgCWQ7BZjx3D+BIh5ZlAeQt5j+f5fIK0g0ezzedNyBnhulERIDkg0IchiVdL71e2U9YHt9KNWUIZn0fOALDWRA1XUjuFFkeLyuhLx+vPU0RlmSNILNaG5EmbIeViDBV0NBJ2xpml5N8dOQQVDlusGMonb93M4HUgp1iwntXjZ6ezLGTA8gmNaZHmi6JvUeiqlUtt1pTXj79ldEhKdeTBOqN6adt2SQz5jUAjzVUv7nycBo2pjtQksUzasH1UtOJd3D2PRmBL/QJDeSHb+1m9tMc8S+cZxJSXaYUjFtFP+GunLUTw47Al3rv+FVSKG9uOfCHeybERTXWKH5yDacLVaLjEQlw6emP8Lwu/g3lXsa67cjKpDNKWRyW2t7FHa9XLzsPBu+JHDsuNFc50/WXOgKJrGv4BUgAOrvJCeSFeYLOTmpX3KgYKTle3jQIzUbCS4S+xJICArFYjAcyLGKzGXAGLqjUweegW9Ip1thzIE8U9LIKtZHIJ8fwvUMFOzHPPM94cx//px/5x9NGDygGzIEu0DPk1orHcM0ip/OQtMIbd0MeZm7rqXgXqgzPsvRK3t/w8x4PN+otfLLtiPzibryl/rBhzg+DDajZJD2LCyHt3TREJBXKupYeIhQ7k5BWQhffxnOW8rMBM04jOpFBLYotsb8msxYoj4ydVVwXfJPHgVJxtAX5ybjZ8kkaqZURiZsS6JzFTZhxkzoiUsc0ktGQgivF3g1JFaSfsvKeMbK1DTuhDl8xOAvCNsSI2UpE/+qGfITXPtCk64Ykp/ZFErCGNdzCoRcGkFbxN1gOIGyUC+JzORKqbNsQmgF4zZeD9QiUQTn3oZgVKWCwr3HFxoMXkjsIqkNHKsvqOYiLyTtfKFMRCe0huE3KnkbweaxlKAL7kVK72g0hn1caGsUSp7jcqMDCxeWmvA2PugqmIIlCMMkzOg7xqkz3i+T+DkHbsYcheen8c0nnugb5MWicl0NUqXYWxZlucXciRWneYNa7quLYeOF9LGJF898wpnSM6nmXp/rPpvAaDV03jN3wEN3ffNgLB/zndIbdQSSkmnM1rE0670Mvu2NHz9+8DF/CxTgLsjemWPget0FLNkQkbVmVlwWsoGpCwZyS4BMNYZ/4mIMOUIyh/7yAPkJLpdovMawyGl5n9VDdsrd0Qkz0fOLB2E+c2ibzRsAz3Fi5ojFJBPxl+fmktSoLngW1KeGr8gqhF309i6J5kDqz98IZA3g6Apyri+JvUTRKo55osrFsBxcqS1/mhdIJ1+YhfLKSxJEJFGIqGajQYS3xwMy/rs75+bUXlO6I5nVurMzqVIph+HfhO/fv/Nuv/HJZzDuxDAfjPJJ543xO0kluaMUFv6XRfeQ+1lIOgm/zzk+UMnnUQuzJJCrP4LtaYJ00tC3sW1b+gooWyt8bJPRCXmzKnw+L472gDR/LWp4jdjaGdj8jHyDyDsqhb48qjB6yuUtdPH7KLx35fm8sB9boM9m5P5zTs7L6JlXnuKUEsPgUydSjMdDoYSGv+lAm7M4qYYx1GNw/BNdf+aAf+aAf+aA/39clms+waj6kjSt6Uu82Kbu8Qzi3Ap5tBisF9oNTF1sP19bCFRSxk1uIGyc+YKjjJcpBtOXWXsMe90jj6q656dVUAlZr8z7gnGVb5F7vVAo840FQjoS1d6u6GO8nxu/zIPqFTENP4hSmFvkGv9znlidIbfIYIox5eRyp2hh+gIRx4ClS8XEqX6i7Dgn5s/o3+jG+7ZztQ11xzKGmBMyzelFZmZYL7hHE9s01k3xbCIS5vHLXeZmq0jHLCVpbw/qyKHcQgrrSJ+4t/Hgl2E89IHwiYvzfUz+XkdIbkqwyOIZ5tnpZ/S2NPKEPfPZu0tgvwefcOf5GSuQG+CigQWPHXufzfrqZUljZDO/lKACmMsNiBHdv+w7XmtJfq59ZSibRyEjGecCcNe/MPNgfQmR2IEr3ysxHonvumRLc7i+fkNIQeWgqGhI34nfALO5QECZq7lx+8+grzNCUQp6y3cGWPDl7ee5/4dHDfZVyeJ3l8/fMdoXK8Yke0ySfrNuSMqMMydO5CfeS9SCHgCGKgEi/10DWkbcLOwemtqYbDNAS+EDX7g9JVEw57qiQS/WYBZseNaaGdvGvNc4JFjlBIakHOwIZp44rs68xs3On+2DXd5C2cMN1VzjopS24eXvURG4oXMdJi9Jx5A1A1FNKw4HuxC5cB/YWVAegNNVQsptxrDR3BA/0U1otVJK1ArDlJ4H59DOGHmGS+xVKQVNWVFFEakULfeedLU1Z/hpLiPkStdaWPG/IpzJovzK7i5m9zn0kjYTfHl2sta6Y5q2MVo59o19HNBiAN+0UMvO4wiZ3ve//Eu+U2XlFnXEvtum0iwUTSL+Gl4CyGFmPN6VdgjPfjJlz541lNLYtoOtljiH5kR8Q8TyuQzejgff9r/yaR0VZWbtJw4t90KkRDtbO1B90lrjU5Rat/y74cupFp2P4lCsM5fqlX8FgziS57YngUFm5ZiFOQOssA9FZ6GaUqQxrUWEl8p0QT0BK7qF/9VbDyUFD3YSMsMrN+PGnK+zAlcW8czEcEkg7Ywh7WQphvhNrJlMPD2unqp3nfyZ+cHDSc8p8mhKZbVka0+RlycoE/jIXkW8z0Dv/rlnzJavfZsO1RZz3im3LH4qTuBY+m39Z9cfDpgmE9eaiezrMBjSvyTZHUuUkOZAZ1iib0To9WJJ6M01NLLQuI2ej9+I7VKWcaUmiiFRZl8OABdSxzAP6FaoWbQbKynUDGuRpIcsm2CMHGzV/HzxTHpqP/b0WuouVJP4uTTG1Sl7aOC7QxMNhI1GIPXS4o93Iv9s6Izvc7Q33t7DkKw+lH3fecqE8glmHPVAq7Coi3fgSFRArXusNK+ITC4+sjhJOjtOz83UxnEfKCtZM33eB2f1Ep4R7mwW5uk6AoEezZWNURqXlESmKPVsiBaa7Gz64IfHPRwzkW1VMVva5dxJkucAKQZmqR2L44kiKSuYKrdm7+bC+UV7WUS45ETCqIlBuYvAKwPo7pVpcQhHGhRSTCHXaEwq7p9/tMz/yy8v6YZ1GyGuHxiiS1va7+L6Nagt4V8mYbJXsjkXKDqnuYfWtQhTf4/XkJVojIlqAW/37yEb4aXrjRKaCuafnONkLw1z58f1DK1VhUdp2JuFbI3D6JPJxSkf2ZDeOT8/wCabxDDzs37Qaqe9v+frJmCvKuqLNAGuGRB5DRXpKAc4tPnG4xnV9z7eadJ4mw3xxrwmR/3Gof/BlJBJnMnQkKXNit2DUVOh53prOnFJ+ZO8R6SnheOQBtkuk50NFcc1kAtfWqmZFMbLTfxOTpcpbI2+YMbU9CuRl7H8+s5RUNZ7KFLcstkpdA1GqCZdGaCsIk1X3IO+mu/u6+PFv2f4HyXkUF5jaOhSGWWhq8c9NDBRqJnU/a4K+++/Zp4Li0GyZLgGztmySBRiPbjn5w+jXfXI+oOduZ4VwJK3qVEHiOEsffftVbgu49svRcq6n6UU+kJSMePgK6G5DCFvoK5Mm/kkA2u7Dvli9VWwagtkD34Pq8IkPcAgbsZWCmWGFE80KAXpG0X3QHdhGafj/S+tHEjIM9USoE9RZiZT7oVRPkN2ZcCSMxMGzaOQl/mE0Wj2jXPRv3XpRkOd8YrGxu7KmEZzezUO5cRRuhxIGex7YWsFLz3iiUwuuzDp9AJmMWCT/23fIIZbi+a7K9MvtFSYAwEevnGk79Jbr2xnRXoMntw9NdCuHI4o13kxx5OP8oNihbOd0ciWCT5feuolYBemIecRiW0kctH4fbvXxaLMqzkltZKHfKKiibz+skn/m681GFxShzcASy5arr/PEk0v+1KsC9xDmaGALTmayExEIkbdv+fLd463iHXnqiFNJMJipqHgqWVvbpRRY53pyz9EuRhLKo5ggpdSsMxBi4GL0i3GsSs+a+7x8C9JtlPR8PMSbmkCNb2Hh2X9XQ9gj1LonJmTQGuFYukRs+WgVcNjTVXxUnE+sfKg8c7pT5iNNp0qBZlb6KDPifcANI0Z5rFxv19SgwHIyqZyuajZaJRm2Jz88t5oKVm8JOY0Kpn4PAgPj/utZdLNeNQNPyI/Fqkcf3mjlJKfwXn8+gaP8ObUsjzkuNGryHWbzw41ypQwpbbtHlT7Cf3H4G1e6NwCLWwbc3Rm/87MZr3Nhu6ZLzaJwdmjMtvJJLzObq8ECba/TeEPQHb/LdefOeCfOeCfOeA//yopkHzKetbJOsHpCR+W+16Q55GjUsPXzZyL1TT38KN0EDeqxXuHM3ewRxerDXkxAxfbCUBmysbVEtJg7kyv4fPjzo0IlQtLT04TuZlV9wDT6h1D1TbajNcfVwCJ9lnR+ReEQh2CVAt27Ihz4dgbZ/qfTR1IabjMGChLeD11mxFvpGE6qC1ZxvOi9897EFKnYhPOZ2cb5R7GrPM/8tEChIx9gIAM8wvH+dQfjNUzmiWHFjF4cndmsdvbhXlS5QCRkElThaGohYz1t+fGv7KxnRtte0NE2Jh0mSjGpz8x0tbB174IGTPB2NmAKxu7cQ1/5Q0QjV/ktW5MBc09Olff5nfDElh7MRBr2SxNUJfKM1kYsNp+IoKUWGudQbGfZ1+pBHB65LmjusDLJ8IejUnJAfoCVEHwf7L3Z0UCgC1Cb6sP+Ps8d0Qq8/v9eZ8LSwUJTI4YpOT9y08ZPzO7/bNY4DoPoLhYglr8S5TLc2kqtGy99RoM7jJn1no59M1G6riZWuHLZhBT++yDNe+ICeelPI7ora3BsdyfNaTQZKkAiFKTFVS8Ir6xlTfKaIgVKOvVzpwXBaFpYROhFoE+aK6MEV5uC3TSRNlLDdm1z8/ofPojvIDdguHjfnukOtEP/XGd0Cr7NKSCFKVU53k+mXWgFETinkajf2KpUhF90is+r6aShIUq1e3fJRHrwsdrImPiDPBoYm8uPOqWgDBlzn7X3ZOK34CuAJRdaggjVTPCd8ix2294ciA/mUSeEjL7N7gua0YRo/LqA6/9NOKHhF/nij+TV+RaYE6os4VvV3kBuZYH3rE9eNiRvmCVlnu06kadSv9U5KjUWil2Ih4qURVn+kSWP5AI9X1jfxx8PD8pT6VK5X17j4GQVErdAxBWHO1Gn52mDWnRs/0XCtfn33JgHAzczZQqj2T7CTpiwEJ7R0TYUc6snfa2se3xun/wI3rw7rdHYtyjBW4DyfyAuUwUQqXDvbCPB35x+1q6O9M+aSbYuMAb4gE+clc8lSCkxCCzS8W/xHoctnLBAu+aMZLxaDfgTiklgUvZkwnmHTeRZP1d/PPOYWpaPpxV2PsrT1xKHSMVXYoFOC0+VKioxDkdf2/zdrOVIM42gL6IKqPgJf2iPWKfyCsvGdKof7Cv/nDA5ExMLQpA97yxjlIgE6giBXVjWUIFlKPeDbfXwpd78t/M47BPmaBH3pyeE3izQTGjAJdUaiLqjEj6yxda11RBpyRqRBKxfd03qIjcyCWhwIxEY+lIO4qNiU/jc8RUtkoN9Xx3RjeKN4SGenodET5OcQAObDN8X2Eg9Bi/ZUNp2zZKEbZtgwNKEZqXm8aLGNjExpOpB8MWTfyIXqQQKDuJ6b7PJfu0cDPnbVo46/OmeUtddONJWi3iqvh4yTSAI+fJfB5QAqVcOrSmoV2tynCjtoM5hFbfeLeOT6evpdOvLxqML+r0QuR0A9MXelSzEYJO3GGK3I0cnc6jJPJpGYgRBwxEQ+5a8kdFEVWmEQZ2DNwLJRFrNddq9ye9/FwMpjIrgqMpIbP+mGXxSybrNzJombdGMe1ATWp1HO4G7ozlawEEEiF9uG7kliEZ7PBKW5NrzwRbAjEyhjHEMS6ohs8z7+U/wBqbhE7qsBOXGHCaGDYIVL8Nuv+AUZkMTonm2n7JXXAXM3zk7PwOgFFUSzYT7/+8ZDrcaIlc26eiZzSoSq/4gCk78oy1Vu072zgwh6d/50rPsDuwu3JlwqqWCCchUESeCLZb2/RgyTDORN2tMS54SEFoygKt5FhA1Jhzjec9f2/8fDCoJHp+6r1flj68zoJmc6MMo24r4VgNqYFY3D+VQc17JJANVMHXYebC8mZbDX+RQklohUsyA9yZSQ0Q8xv9aWL0JV9hr1gi86U5+3NcUdBOT5kEXYjVbHKzvlfKcVmcW/H/K3qXu+i3BECg5WZFRT2w9mX67xAMgnj5vAvZkvrajmDzpQd+a/2vIjSOgPC30EDerQM/X8CUkNmYKN/e3/jtt9/CnBNgBmCCRJlhMSzSCkxj64puExkj5D72NTSI4qp6w3OFF9nofDDdOPxFFa7p1NnzTHJ3XC2KLOKezPFCCMWgTm7mmKxG6jAYPVnRF573RGyLHqN2lEKRYJ2Yg4rwlMElg6GG8YEHjIvNZw7LNBsglS6SuvkVt840p6wYyE6dwci106FfVHe6RIH1nL/FWZ9niw9hU6HXJ1YKZ/vk8oh7bsJKJ2d2F05xLIcyRkc8iuGiKRc2a6LWAhFrEoNFE4/kFb+lln6eS1ma4KuIGV9QU82VC1MnABMAACAASURBVAE3zgQZbSQDgGBNhGDbXarHHs33nO43yCQKysUAK6+zIUuqSphIBwBoaUuP8CIi1oqIMLyGrIvq7bFmbqxA0NFgfKunlF40I8aS44PbH6egd0K9JMcCjZ2SFgUeohh+NxZbEVwsJCe2d+q+cudEsc8R5tKqaHF6rSnz0yh2oVNo+hbfdTRUN+Y80RKfwadhKW8WRXx4GkTXNxoglziXTz75xPSiVA35Im23dBwQTci5jGIjxqkoVKWIIt45ZEPEebpT60atle09ZMnkm3Eez2CYUcFDUro5KRnlWBbRxeMcF4Q203D2szE+J8VqxAGP5vnwT7w4VmPQNefKeePcM3X2t4NRJ2PF+mLYytOzHhAZL9bPT3L9mQP+mQP+mQP+86/FCr+FhfK7mHBL6VdN4Ace9y/XWo46wTw9YiSbkh5N6XUUWb0HU6vexSqzLQbcuJvY2kLq5yqEJY3HehmJANf0ltQZzysYH9zgopHegsqJzD12/1SOZC7Jh6MGde5Ijx7JLHt4SkqBmS1dV4ZNhoU0jh6SstHx75fOABXhlPTuc5doWGvkYj4mpExYY6NYzRxmDZei37AxMQnPv+EXRjJesk+hqpE7umMcOVSINqlnTLzZJ8meAG4War022hVnzHZ9Y7t23t7eeKxn/TZ5bhM9jX/MJyXlB68S34dkQTvwybxlHmuem8VjaBTx9uWVtYC0l+vdKC/zSH9Uf3mbfrmc+kKDp/fZdrO3AnBzSQwOlpWEYfT/zVvvv/NSj3URvlXJSAHwIwfdEKifZPvl60xeQ3EXuNZZtQYgzu3JCTGsXgw9yOFd1lAmAbr7+nPjeA03c7BLenMGkBx0sUil5R6OHmSoPQSDA6J5aisfwyMnz16fEPtBs+kccs+OanjNoOCcOSAQlg2E45iFH3yxHb8uEMGagwuu4/7OJgmLF0Hbgy6fMQilcg14p9Gq5e9t9PJJbcqjBGukVEHV0O60UXCfMeilYUPoY9JUqLVSr8YkBq8uZzKXr5RfBdjo1z/grSC1UHfhlBFDHp+Iwy6EV44HWKjZdkuojvLyY/taV9vMs2ikP6A7zTwsSYYhMQ2kT+OxVWwIpXb6NTFXnvd7RZ1sJNlABBmK5loRGRF/WKBTgOerhPlJrmC8zvvMWmAN8VcNFJ6Zy1vu3lnMZKpU316Sutl/Vez2wi36oJcns8G+b0w3fj2+UXrUuELDT6XUGnHSFX+OZPY2ytwoM4c2LQgUJuGtFvmrsr2/Iz9+4F0xFeq2Ub3wqAeFwjGD+GDF2MU46s5oUZtdDFqJ51baAjaFeknZNjYa2/Ee9Xi/bhCDnMZje6CPHVoOvKzQn2Gpsrx4pV7U+XWAkrW1vAbPS3J/n7AT8cOuMz1xB2PIzcCqM9QyugZjUKzEHsq1afpSaxMRsI0QgCTAcLbFoCvzJkliBMQ5XjyGS0ViIDgCMQhETrAlqNAyL2klZhnhxckNAtqWx6G9lNuYNXtPqTdN/H2dyf5To+Z9sbl67rqUa8Oygcx4pcbbTGfM3yErfnf9sQfTfIsJqTqqi1oeNOd7KCCBnnJ3TlnB0lnj8JX0ur+aTxVuKbRg7eQGs5gMdlGULW9UaCgWlWgSuXN94Tqak0bfHsm0CO4H+9I3ZOB1ICq069Uk3DyQGIcrcn1w/vjBeP4FEeETQ+ovzOG08k5BmFfHznh4RQpvdec8T1wmeg4OV9rUNK18MDSmqsV39rIHOnRWCoX34+LZJud5MorxweBv40mZn/yr/EsmdH6zclo3NgmZj2cOpsIiPRCLXym3lvIRJkcE8PSwEBGY0HrLBlBuQPPQn7XB/Bx0P/k4jfYewzF/CwkVdaU4mJ4ghPko8GkDY+TENxJ1EaGWKPzq7Nj4uBONlTctSv49XQUu3ShpwKi+4eYcOEZuKiGT7ZRU8tCTnrqaD4OqEbiYkUhogfaTyTgoeRjKGrxd2Rx12ryy4KmRD7kz9ZWorUZJwbmIIeeV6BZ3Z8tG2xS/88A1jTckEduA/mChvWsm23MqYwT7sJ9PVJ/M2bGbTupcXtB5Ma7KHEG5/cfjGcHmfTLaJx/9g+PplGroVPby10AbeMOfwg//4GoF/RZDWEnNjtauGGi7ITZSDoT7e7RL+fWMz/z2acjf/w7u/O05eTwelG74nsjRGmi8ahWacKY8hBDIN3RQlwGv+z20blJSiunVCICTZzbIzPIwlAPJg931gltgIYsJL3HoJBqhLf1+lrRGogVVs5mdaHnJAswLk1jLu9odqKfEWp8SVOpgR2zUHGC4LiPGyZmSElFgxjs81vrxl/brTJ3WPAWzsBZUKmMMTKKQBF5SUz5vtMbPcpldqIQ+u2QDGs9G1v13yOHES+Z1FkWT4q/oLUtrACLscxX+gqtxEvtyWNzzw/T2FRGzm1L8aj4IIlskDj5uL0FLNqj3JSUQZ1PRl9wAxMG+YsUoJyeOPuDz32PNVQnUeSmFNia1CqUo71uyaLcNkw2/nOfnhR0Ze3NopQ51bPcNchOmOTa/s21bGFZaSyzExJbvURH2ozFnaOvbAJuKW8E80Jotb+aSmriuiz21pudomUzHfhERZEysC8MGpVzI7LhreC1Vw/0TS61upYTFu0Qhtho+nsyF4R+gy/A8vquNgl+KT2d8TMZ8ZiLWYq1/HmBHnN1t43t9srvxnQ+qVD75G5hTVAkRt5rN/IzVpBQA4PNJwSgqtERhbbf8lYSWtdVoxGTzQrSgP9Fx5RYaj7YtFnIm6hLJZ5xVRiE1veNVmdSGhDBCMFL8VfBNmfeAQwW2HAos/5lq3P4hiDHXwRdalKB6szdEWvY3XhJym4Xvl/WQCN6XF0Z2f0tRVvo73W5/gJlGx4pxpuxfs7f4lfmrV0NgscgFOEXw4oxZeT6f/Gs72Oc7x/7Ouz8QDZkIT3RcLZ2Z3pSPKkyeFFG+7Y2/+UWpNVHWQtVGP89g1bGDFLQUSu6ZOS7IHA0886QYtIfUzsboyr/927+xb+/ZI1TUk4nRjfeemuZsN8pPicLt7fErbsKxD/6HRCNh33fkEd4Xf9f/m99sYmZ87JNrPVeNhqcZdI39Ob1SPO5n6wcCXL91Hh/BIh3j4rQfDBvQwwfkH88T8wY0phe8TqQp/NXhzZnHJ5qyZLNcTElIVQ64dqnM8oelzn/59WcO+GcO+GcO+M+/hj9ij9iZ+UQ+C3mh2QPhH+uqR0APf4YhSD6jvljeMxDLUyrLAqkYd/9jmXZTJmWuBrkwSrJTUaQQih8ZlyWHxZP58kOrEL/QaDOkIeO5RpzuKmg2Fb+NytaF5/Ok/L2wlUK/Op/jM9HPwpsUrnExcgFvsqHyQXWh60X/APrkmhFH9q6oPWh1oyaoeNsa9R2O42B7E9pjJsvrwn1D1QLAUOMcLPcgqULvVK/RyhKhtUatsZZcGm6pKuNPNqJXUZIVZjXikZnhxVjidWYJ2u07377/irtzfH/nrf7K9rkhOtm2jb/OYMgf8gtP2/ibLTmtT5CCUO6m7hBhrhzUWg4YOsVeTduRcVc1hoH7HMEGEMH1vFmi807cskfhDvW838ty3xbJAZUI+KSOlNRsX5irP898Kda7Cl0llRMk1/YLGGSetg3CrTg0rN+9J5HIV3BS4QigMOTVy1tA8LIoSKroiIbwqBfVsy2a8VEXzNqdMaEupsbqkfWGlRhEFhuYD2y+AACXbJSU4BadhPPWRJhQCJbO+ix2RO7hnsx5R4az9wRUuUDff5eDaq3ImAEgMGfsNfuD2bCf85ZGdXkxWwHYN+azcLokSP2Nmn6vrX3Str/Qe6fNYIKoKrY5nCfb2YncVtAh7LIxPk92P6DDsEmzHMHLhYrywaTn+aZc1FLC80fPzK0/YxjGxLwwp0XNlgOy00acHxByZVlbLgDH0R/wrNgYlA9BPz+ibrJP5jj5nH+nj1UPHPxj/GDTjjyiD/msH/zQH4gIXb+zZ4s5ZsoJJkwVhekPPhNYM9OXyd1DXv0nuoq3kGgssf+tBohnekNIUofPBP9zA9qKl5BSA8BjgI+8YpYJLWXgtUDd3tBz0g6FsjGHhQzxNHqBqsa0i0ufqRH1r2y+BRBsPuCMqm/L3u7sP4L9TbD4Hr/8C8fHRbPKtm0c+zf+r+3fAHirO/u+pPPCq8mK8L6l53E1Ps4nvXfOEsPpuSvqB9vbG/vc+ZbnpRzBuvLijOdINu7kaQVzp/eQnGtyUHxJmke/QkSYJVQcRASZb6gIj9HYU9GkPQvtKehUXHcEY/ik92ecWyhylTiTysXW3tAm/FjeWPp58+zDUw4+5ZMFfq2605KlWAm5W9cnPc8FKsylPuGKFkV6udmyVS98xBoJMm+wvq4S9XjggSNfrCMG/55BOeJSw3V7EVuInSPNk5jSwAMIumWOK+owX/6QU6OXf6U3qGyKzf/z5PaPJfI0ZEokB0tL4u5rEEWMQZg5komsF7snaZgzagaeDGBTviRQxDkbVxTI1YVZ1qws0D0AN62LCMiWUnzecsI7E80sxlym6amvb/5CAzat6JU+SRJDmWFBK3N3fCoqPYyoz79j1xvHcUSzRSQeXu0sLwh0MOyJ+Bs+jW6egCfhVFDZArE5orjYfWMbUKj0cbHZRpuNfTUZF3JGCrtuyHbSmtD2N676CUkrhWAyrWlkZ9GGofiZWMeXDqkhaRLm7FksHBSYgWgsVrGpmGp8NZFAePnMgHJSPJKsZ0tkk4fhIDiiKVOnyulh8CgewSzkf8KYOP57TFGHv6aupoOLF8NKVDhMbkPOIUlDF2FKBSHM6WXeqMTRo7mlqftp+P3cf5bLrYQER8oFaiKnRJyR0gy4hYa6h7wHfN0nqeGfyCrPwS7yMj8vibYWkaThrveKn4uT6BroHsPMkHaaqGbuG4YyXIlD0RbNi+kWaNEeKLwxPyLJ2SplE87fPjln45u+Ac7MxH7ON84OaGHOYADAQh9Fw3/FCEu/iSgSf//3olEyuc6MB9fk4qIejSIg1eEq+BH7yLwxpEORu6lXHGomj+E9kUWfEBIobrwYeTO08hclWxXxARqDi/Uc5pyw/Q5SFU1Fd6xGkF5sUhNu3fueyVJc8ZmuelFm6LlOSaQf2fBwpxcDj/hTrLKQ/7r8ExCmnZnw80XLNw6OKXYPpoMVkgj7LBwUGFwhhTKNdoMH1ueX+/n9LFf1lvE/7osuyY7Cy+tC6t20Gqs5QMSa+5+TMvxKFsL0my/rD6KgEQmpoppsouqTUV4HbqC4lLYKWhVaMi+8BCCiLJS6GSqBePl6mRokG8PmQdkLVPBsDpnAu1WaNGoV9iOGTXVXWmvIJuzyd9yhVSK5EGEmysm9MUuaRsp27wXmHghY+wIymAUrSwrhiYlyjc4scNmktIosKQ0M06UJXJhj4pdTlnGS17tAmT0+y1neQc5IPmdJmSClTSgWTa+S67a7h/k7jub7jHHdzUi8ptG03YjTNivND5id5g3vwU6Ta+KX8fE88SzaHm3Da3iRTO04k1kKFOflz3PlWluo+RaMN3eaeDQyPHxPcE8ATA42NdwHTbiTuE0qMn4iM1p9Mop/QSIuVqCg9jJMXfFlMae7vPyW2jSu5W56MxH0LvjE632eb2N7DWbTS8h9UDLW+Jez3DJfI72UXthZGIvBjaHyEthSfUlw9TR70fmSUXCCeRQkiPiuvV5IGkOHwDaIhDRepJvtHqTu5YAq7POdzQ7sI+LMY6sUKUgaQV/TqSnzYTWGczGgC781zcEowOXOt/JON0enYDWYHavxBZWpkzFmDlgriGPjBzYGak7daso078zFarGGWZiPx71RmuVw0J0pBSd8qcSVVjemKFtTtrZh2hHPXIRolk8mzxoFc/MY9AovENQkJCkAWpqnj4+LdiabyeD6CE30boMxFZuVsZgWpfEcg7dti+bH3lA9Xyh62yi5x9aAUr/8789y/ZkD/pkD/pkD/vOvthjNsvoHr1xq5QBqMcQTER55bncZjDQYbKPS8l70Es2rKdxyUFONMubdA4m53JLiA3OleYUJPX0yayKKa1MY8VlqbdEYyn252EFeYwgWn8tBhEYBSUN7lIZEWzEZn9cJMmP9lmK4/4pIoc1YMxsHh25cQM+haCmFJg1FqeXgly0GOI+3X3H/oNaKvr3x66+/ovXfmTlguRBEnVKFq0ZOByBE/l08vFHGGDCFXhquQnfFtQHPL02zFoNK9y/rP4aYYUMw7nW7LXaaKeXKtToasj8ir/eQ0y/joPYHuxVq+Y7X77ekZexlu3+XSLljLzX6Ujrt9juMYaVEm6dsAZhgMMu4PyeJ65ZsyqGC+hUNPs7w+yBQ6aKG0W5GqeXwMoYguU79JXP5M1xWkj2eIJ7oWRrV/c65ikgMa/OfgYhDX0xkymJiEOtvTme1IDePZifOPch19WDZudN4DTNEgwk0JJ3WPZi7pGcRnj60dcY9ndGTlGyKeo3fqW4pHWoE6zuVJeaq20KODAjEkwmqATAXkZCjJfqIp+1secZaxpZG4cpYXSRqRJFXXueT8L4s0cM8S+Rlu/aU1HQqAfBTqUhNaWEvqD5R2YLVoRqSmh2KVHY7+MXemDbBNFjFl91SWD6/5o7ppTQ0ZMMkhuxb+4bKQWGiviMecmpSdqR2Zk8GaPpxmY/4eQKtPvIZ3wxZNooJ/Zpsc+fyYIi4hDfceQ0u1jD8oHnknE99QlXGUbnaygsGy0vVMq7ihe6KljgH61yDz+gdGj9RTZWXS2O0552ZypLhx7gkcugyK/Um474YkrMsEIvfiimWffbqi6nimD8QfXA8Kt4+ufrgTSu9LvWHUDqIN1OaVDYP2erzObE60Bt7moBYrfQ8Cw6BuhfaUdmewVRq8s45C601qButhdLBmpq7ewB6LcA8R4m94sW4risApq7MUVAalC0P2bDP8dMx3/AciPh85vkZw5TP65PxuO6zmmQbT/w+YiqRJ4g1WlfmdLYr8vI5VjxwuiqjvFRaLplUFWDSraM+GZnDu4wbZGDp6T0D0QwCFyfIG6KCsHovNSyH8nUjP+Em6as9Yv1GP8YiBlrCPN2ZUzBt8c2KYklX6i2VvnypbgjQb++pxWpayjv3zGGZP+aNqinNKzlzqYvdLyvPklsK/j+7/nDAVJMlY9mQkkRUDnFYhqZew2gLbu1wneP+hKoNyYe1qM5TZ1Ak80u0RHUOTZM3LcwMCPaamdAWypkwEnMLNEg0HUJHNYo08swPiQdfBnSJVFHf6Ily6B4By2psKjODEVIppRRmn3zfvkOBvo/QrZwQFqid6YrWwkxDSXenjJNvDaTASaH2NO+sTqvJcgrNFY5L+X8+/oNNB5hS9xiMFFW2o7GVyv6IzWplcJTK8HGbzgeSOBMg4ZafeJlbAIneho5kkJLBbU67TDTdO2NeTOu0vVGrhucFkTDGvU1fAcLY7MJfsjEks8kmS3/fEHpqS6NCvZL+LLGK2yx3knKlrndc0UTpqpQ0fS8+UgNS0NTvVwSSXhym9ksfOP+Yp5Hvz3WJ+2uw5kveabI00b96wrAkQwg5nihIBui6B8nQ8MpLs1/hlrcI5Jz5WFA5tmk0jf1kqQKBXIySyVW5osEg0NInpA/jKRedSS3KnJ+xbyW9AuoT9gp7Racw24zExyaocBLyV2aD6xqQ8hQt0fvd5U7O1BwWy81+H8DcPU2h04dLJm4XmxzZ5nJkCiUz1SYjWHpAv5HwBy2lyJaBcXzfRfOXRGfJSye/KFLS92Mh1OJms7wEvJNecoZrQwTqHNF45lU4mE9ctkBjSaC/l+ms2aD44DaClXJrsg8N/qxOy3pUOFXu2BjDZ2GkPFUkIIWvvgrxKrubouYzmQmC3eyb8HUINP9Epcf3mo9ECcFCgf4s1+SIeCiZcMhE1+BoIbV51bFq7VXcB08y7tdCBWeTV+e8BxlxGr0KlAxj9C9eBJZIqqCgRzJiqbMrVlgK7u7xaUYJc9LQ2b5oY7E713sQSFonm+7fbq3xkWauj61xHAfiSmmhn3y2jyj6VNj0EQaf7rSxGucpeSP9Lnx670j+99kmvXSa7YTBp+DXYJZECWrhNPhxDXqd9D7BPGjc2QApCwkzauzJcbKQ1AEcmbgZvaQ8iVbEd5yKbIIkuhuvuIXe9JRXYbsaMS5fUDQplaCyUX2CFFqeW9s42D4b9pzoD8NH/H76xK+BiGI1tIZPOymbQZlcCag4dXKuYcRiH0j6AxBNc0v0lJXrXiuymnNEAzNYytB9oE0RsZT1i/zmZ7l6CelZzaFZSGJogHhuLSilZXwqGZOgsoxKewltdYiYsRCtKy9bZxzAqOPek80TeVzWe4IkitskPBaDVTGosmXTYf2eaCIZUGelJrP79qgUblmDTjQXgjWieMnPmVIC5hYNDAnGPoSUwmIATQS1R3xui9fpFDaL5t2YymwZn2ucNaU00Il6ehtspKeasu8tG/zxnYsXdBQ2dkTKjViMvEDjTJiKSmX6Cd4zd4jB1bZtSPlAa/xdz0PAZhRWzJeDy5DwEIhhWshveSKxHCImymD6wOuMwVJxrhLSW12uZHNwG9rG5wwG0zErR4/9eWQOKrMwrWfuXTnPM0BM05kTZulcub9HM6wZj7cH81CuLbb7pRUUTAciI3zqNOLnmMbpP5vs5J854J854J854D//MigeHgSENOT6zsurQnxSk6W5mtlq9V53I9fD12t5OphFrqiaGchScvEXc3loC481X8Kw3NRdmxFnlwxiXA50FvMN8nwgYoBZeFU2AyzAEjJG5KV+MvqgXAbs0Z8wY84e9XuPngX5WVUqzSzk2iwaRmJCqw+shFf09v4OPZkfzRAaux88+MQwrnJyzsGHnTHgLIkKzx5uyJXG4GVaA+yW1zJLsM8iUTqILbndxSYMOwWVyJc998CSOhKMkpKpNk/G+aTKgdqGXQKbcM2R8oLj3qONGkwbn/fZjztSVu72GvYNQsLOirL5Yh6Gr0vke/mcLLJ5d0eXROWd6xBSXQuYHRMzEMvcP33S9DXwNTNaqb8btv23Xx6sAclsQFIu0g3qXA1Khzw3ZjaSRWp+Vw8ZwhmMJivrNUZJmdeiwWr3PBMXeJyb8a83uOIFci/UBJP4fL2uaiD0Q8I8QVCkMoAqa/GZ2P3MQG8vrBUzncm28s058BwgB6AGpMorlopEjiLxXuABUi/pY1ugq+CaHnoQqg7sGUMMTfC1SWF7f6Af37E+MIXalK22exC7nxvTJ5Tw4O0aOeN1XRQRHo9QWNprWJhc2SssJaTl5gJRWmXMzvfnqzleTHgblX4K7VHplzD2hk1FZeOyycyzRlHwiCOagM1SnB64OiTBIs2E8mzw44oz1TtzXHz6Z/ZhFUbmAhhDT2ByjotNNkaNvHLt5ZHPVW+Ag91yh2A0iTjYEsxUFMx/LjlX9In7ZCQo/2buYbfEmxLS3aoagBJyoJZsJXduEBGePWHiDxJrfEjk6FOVTkhV7nmuuDueqk9iwuiD0d8R4qy3q1N7Mgunh4zhMZhccRbkMFZVYwirkfvUorRW7jU7Ru4zlSDPLFaSOvub8nxeGJ0pJy471zV5Q5GiqEcsVmIoNVe/Rgq44NZiD8yBETXDGFeAa+UlyRns5Bz8rH07ooYzM+YQdMywzElfvt57DLEFjIo2g+aU92DFX9VuoO4oQZiASL1FheaN01954p0vfvGGrEulwAfMlPfW5c8bwBJzD4CFh8TeKTHOHyLY1/Nz+UdZ9Lyceiv2iCkrRM3VL6lxL92davur/56KIl2hywLq2QtUOkKwQM+dPyIG/uGAqdhgamVbKJ81tODFYDK4A2bNX76QDIH+cJ5pNq552BjK7q+b7dlcmURyXxA8k2FbCZzqHazityqlKF1Dw/K1aNL0XFdDsTLXM50LORHGYVFUV+SC2oWydEAhqmNzbBPGgDmF2UM3f+hEZ6BQRJSPKly10a9oapzjZDehaqHUidWe96VwtGx0ZWEoetHKgRIDnVYqe9s46sFxhFTP+7cwPJNfTj7kP+K+lrfQR/Zxe4GEcd46nF8F2e1PYAfNo5m5l4NrXpThaBooBjJjMaMqaHiLqISMDxiuYRR2004TRQKBylJKyjPksy6pJypEMMiN3WbNJuUTWb5S/ioIllxFEQc5UZyzGNuIQDozMTjGRk/T3TI6lUDvXzpQFYaPe33+LJdrMMKESNQg8xJ7DduGca8vzb9nr91PsUDdRRGzEuB6T8YVRUdK6KjcScydXAF1Mc8W+jXEK6PAnCB5AF3EJN7sCSRSqA7MQxrsIgrhzQ+sCU/vfOfil2waOCfO5Px8hr+XTPo0Nt9iOk8cQo0ejAUnjZjTTyDRoTLDV8E8GiJ2xb76mE4V4Aml9Ri+jhiW1lpDOoSV6KSBp/TwJCMKAkmJmPgfYSbyccU5X8VDgt9M43AIRGsJc3Hi8Bs22USpM3RVnf1LvMyDXRVLTfhiGidSDs6LKJuld4mHDv4ghxBtvGLdSvI8EB1yw/IAm9hqymj6n4hANjlcDJFoJG42ktkIlsPcQEyQ0pgaB6Y5NRu33V+ybj/L1bM9fz8kGuGu5PmMwwNnaUUv/e8u1y37EnsrmUmkJwMFHS8z7LVfajYA4/1y30rs26IlP0+UG5LsXs3YvNCRNi012l+FTmFmE//L/a1gGEc/KBWcSP6fz8GmB9U3zMIvJqwG502j7+ZUCfyunhftWzY7EtG3kGcrptdca5u/I0PwTOomUfhXBpgFe3UGVT1MXWFeHd9L+OMpbJk8OTOAC/kNAVw0mlREI8vd8dQnnzilVC42HKUX5Rwdp1Ky2TkLLGPZVfGrBIhCVUEm5htzzjA9FUGmQh/41Sm206zQu0XBVHa8F2qJM8TKE/NBKzuLcT0denpVbOYBuknwDcBZxt1QwIVt7aUsOmdvaH3GXkLZE3k5UNyNU4z9Jzqu3CUaq+gJQwAAIABJREFUqSxPxPBZwOstC9lmDB0iLiVDadqdeJ4lEPFxxkScCqGaV/NsIUWnrEbCi+1c/SW/MRPYpK5fGlY5aLobdikzRTSFXWBI6HjfcVz7Ky/ynH+533HfUMQf4EQOZ8vbkVuCN3KkkOmIPAU23xjXCKlIL7grpZabqXK/J+EnBoLWOAOLwns5+He+M4aljF+cB7MHkrtMBX/E/jqi5Xxh7ORQgIZbxPCHKH1G03uIQwvJLl8gIyqCBJrawifJtYRkkCzJvbiJK/UYhOwGTfES++CSyZDOYPDUK2X5wJfXjRksWbFxUCy8MMrn5Pr8pJ6T2ePzP8c/uNy4+sVkMC38ldZ79WrMN/jRPilV6XUGME1Dn71LSokVaENRlB86b/+Ln+X6Mwf8Mwf8Mwf851/B1KpYxttBTA0j1CfSuKyhndw4zLMsNqzHAOOW7o2cUm7PpXjB8tXRudDLG9cKlwxm1rSrwe1EL0dVkWkBevTMCtyZ1u8+S4TdFTuD/eymOD2bRxdPhI95cYzB6B33Pc5GJNYizjUH1gJpXKSGZ1KetZXCpm8vOebW0Nli2DOFbQsZyaYnOietVGrZsmcgjHExxhV5QRx9eEnGsTSM13exGdJF0yOyxfAuzyADTXlQl5d358pHgRfwa/27TbyP8NIexo/xiRlUSki3jsmskRuI6s2KHgvdXQZlRu47voCVroVEd0+AajyjczUQiaTi9w219V0W+CxyiWgWB3NUfIL7bbx+DH81+AbMkrYGBOjosvmHTbv/8ss3ah9cze51HAA85daby1gnIhRZe2SwWowxZIoa6AZAQE4YIVgGgAjVY6h4AmWmUk7xHO5x5yXZUoq3UYLXJ5KD1PBSuV1SpUMOHfb1+ml4ezX1Rw6QlppDdQmIvTvKBvn+4gNxw6vczFUTxW8Q4WLaCGXOYPaaB+PXDN8W0D18vwRDTV/sByrFG0d9403e2crGUfZg0kGy+S16kcVwUVoTtl0pF8xz53go53Uh84JxIuqL4BF7PD3QpiqXCD+uJ6Q346MNvFswFi+NZT0VRBhzIqPiLS06ZgnZMiZl9fR8UOXMZ55nrYNaR+bFvE4+58nwweWTaTM9ZCpalK4awJdS4bjgiDx+6Cv2bstUeTFHRSkJjDIPtlTwX1YcdgY/G8goICBqMbRdah+43qfqZh5AG+wmDXSRl7QrqfYkC+yxrAFSGt47qhtmF0VGDvFrpBqeftE97vtF5EphN/LBrjtqkzl7SvZGLlpceWrH1TGF/W2nbIVi2etgsGuJ6kK+sJzTlyv28Gv/qtTYp+nnBSlxbPmdveAmt4+rmyUIaAajwjWGVlZ4nh09Q4GrFKVYTyW2yOgs5XGLvUYfZpHv2ux0C5l7yx7DNUeyfBQ0Bi5ala34a2CdgNaa1ViwqUo+C6H5i7W4QERO9LGRHnll1qsimU9mDiDe75xuit55x5JQdCu5PmBqoa0cTsKTCXdaT4KJXPe6sGRW40/cA2wjDIRH7tsrclu1+7NPuHmAKf6BynWDiP+z6/9FIi9+fGXj6YWmguHLzPk1NBgZWF2XJIYxpMYa8UUdDZPmXl7FPbK8JJZh4AxZHgIlXqogXwYZZpOXY9srMFdz3MP4bDFoRjZ2gNuY08oT1/f7M/UZZtsnsUN0wLDvUehcDy6M3jZ6i9u7jQ1pZ+DQrVCsY+fgxz9+CwT45uzbhnlu6l+StYRxXj/QXdFZKFa5PoXvn87kQPydt/Zr6FhujzB9bg0JS2quazLLHshfDRx1JHMD0TCzFmk5JEs9cAG9WUcHuz9AoHbFR2GbDyoPAMpWOTSkMgZPzmnMMrHNGDbwJnTCdPRa7612J8luDdEjD+mazLdP3HpIKFJvw8wrKYTiQsvCbc815TjXloeFvpKRkM1baKQ8jM3ZegEKUyo9at9Au4uG2dn8/F/svdmSJEmunvkBqmrmEZFVXc1lFp6bef/3GpkLUoanuysz3MwUwFwAah5NDvuIjBySKSNlItWdmbG4uy2qwI9/+Ue3+f/wQ+Wsa5fN82IuZHGyvEMLyAq4SvoakSywLJY1g3uR2wcevW5GP0D0bJi1puKj7WwLVOc7F4sRlqu9dUHOzFuLXwef/9dfEqguZhe239P+sIvnP+cg92/HkXYKv+y5qVgq4363k9Yalx80m2CN6/PBcTrxobTauBpnWpQRWAF5TQZtMXrsFSjftWUxMQMlwe351+CKwLcn8a3V82P0b9mMyP7GYxbANxYL9OBHazf42+ocLU/7znbj+4KzsRr9On+1KUgxrzwUVGk3WJ8MXm25HmZ8XHBZbnBdd0YkU1vwDIWPFHJnMHnDF7POweWg9QyWd3OaK64JWnhIernDPeDF4wbluvVi1AaLQLH5TqsPOMO5Q4klVaTNdjZ/r+Lt4BkDN6j4g9se82c6dj9B/M4FuK1clJuVPEbcuW9nrUV3EDLQGsxukO1M/nzvjMoNEqDX5rtsVobncwmUQqGaqmpdk6GZr9lzdbzB+ZAgron3+9V49irU1/Y8O1vZP5w9uEJx6exbTybuMy1qQ5wmdjOeFgu1R+dbFw472MRo55JnQ9N+K4SEoLUNtxNQpufXLhGUIwkNLYvUHOAo/3Z/Yzsn/3z9JRmlPZjVtJl0Ji1t7eSRKp8VPltMwvDOnIZPYU7DfPL+bumJfp7FFLbbZmjGq+DZTLG2mrJlESVIBXmaTARLEoTnFfn8/M779zeGBXpN4hLikswiDE0PZHkSpJLFPoy5TXzkWn1Jh7IymPoajN2WBVxficgclZ0SBa5cew6XWlNiBm/2qKb8wsM5uPiUn8fOwRPazgJdhH4DBoM7x6ItYDrXSoCpqTACEjCN175EYto50IgMlQ9d+Sbr5OnN+g7Vm3jSy2alySt3a/bGvNVUVVfKsn1LoMjKbm+xRG2RTYG0e8k/LitNoRO69odkb73eWza5mUURNDa6vpTp13HQ5dud36F9EG3lquXv1zHopewO+0RlZzB4+huP/oGK8qSstY4TLiGuC7Ncw3qX+/yHNo5lK9OUfm0YxncfHOb8bid9F96+bcywO49qoITNHKhrrhXzFGTm+tHWUN0NY+Yesl0MDVSNY6R65dln3v8qPOyds+q5c9mniPFe6PXHMfjz5xvnefL2vdPPnc/jd077a9pj+OSYP3AcC69Zht8A8F/C+A//9E/89tufuMaVSrZ2IRJpXRZgnjVsjC3zhkKIL7alP8PxRw34Rw34Rw34r3+YalqErmFNO1iKB1hkF6HFnvtx2XkmedWK1a20Ui6s/GqJoEnVLeJ3iPxSaYoIW91fqdkpokINtqNv9/uwkb1sZj/meVR9o2ZS+bOR72thLlvbkiwVkfVd5LDPPh2l8fSDK5y+bKyeF/ueg2kZje0E3XLP2WtYaBZ8Pr8nIdMOhu6ModjToQutN6wNRn/w1p1Tf6PLwamdZ4DwgSB4/FJ7utJ759dvH3jPNVjfg7MFYwzO9sl1XahvnP0zr0k7c/gvsGCuN8/MvnW9pJS6W62L8bwIq9wS97RuPZ2/iTFpxMOKgBKMveP+z8w5OSXtfDZrnPLIfGadaasMqRhUpcnE5IVZrdU0MXbBL8MkQTWXYKl0tnWP+bjX4CaOVT8ipaI927yzGNM8Jolm6kdSb9TuOupnOEQvmAO9FjGs7Lp9MvXrAL6Gtl+GSl84P/iWmKDfqqSO9VQKhMUNnhJlF03HNsEi8Mq79QKUF0jbZtn3oTkE9gCpHBH5sj7Jhl9lm7WUVlipPZOs0Vv1QrJVxt28s7pcz8xZAqSBpl8q0UdZvTm99o+oew8Jpj+Za5ZYeVCb53BOL9Dziaqyb53DltvBwGZD2GnboG2DbXvnm46qfYGKoPgRUX0Z0A72LZA35U8/fuO4TkwrwiKUjoDlQGrZ5SnC+z74d38Wvn9euYd3Jfqkvz1y2DYck09CPkEPusJeyuu5K5cfeD8TC1wDpjPP65gJbvfPi/ZpvK+B/pH95DNm2soCbR+4CIc04g22bzv6p9/hYzLbD15D907E+xfinuDymXW+GREXrHo7NkQyM8bi58rhbBI034giei0lici4CV0iwbJcX4OEXQa7P9KutJerEwK6lEZaVmhAE7wZ3oy+Cduj0f5asyoHi4wMkIC3eCBXZbpW9uLuHZ4naCB9JM48fmerDCXRie6Dj99+hb9mLWN+8JRP9r7T5snePupabUAqvYNBeOBzS7u7cMR/0BCe1/d0l5nKh7/xWJmQa02MRnjmE+KO8IOwif540s24Pjv222B6L2eTJACEVraQcwsYNoP9siTJ+s51JVFtHoKZY1epWVWJHnQGHo2rK7JteFdUF0nojXd9yxmDzFRVimPjTAVWQLssFXy1J2TNlnaDiGcusTtT1rOutzJPYvCw16AK4C0UL2XflUtfPndFPJoSWCvCmTwISzFKq7qj28AWIQDH9HvWKOWYkK16rYEOj6UyLgs+N0/M479x/AtPXA5enAqorJZcApQokICSnXLbqLQo9rZK+rRGhgVnXFWxvqrRTvDlxfzIG1BejLqecuuvRWLacddQ6UuBVzIZpK3fG8lYL5ZflJmlXvHlZza8Na6aLLrnCZuyIaSc2tz4cR24TegNk4lFSgTThP5ifn4SZy5m8zxS+onz2DamX+m3byMniPMsVmblVMwTnydo58iuM5kbvdF8Vj5IenlLqazcYdnV5cIEN5E+/D4/DrcMWDnZ7RcAdnvHj09eodfJRbNizo9mbB0Orqyir2A2xbR8iL+EMy4bJyeYrtUwppWORbFIJJmsaxgYy4/XG94WG0w42lfmGdnA/Z0CKW/8WffCkCvDjEkQ66o/r8GU++RnshyCZPB4PT8RsPyoHc1HKZKluabE61npkaNG7sJ32XtUBSPjfkZdoNUuFVSopDtWjVP/EtzGzczM5zLJj5YMOPcc1hK5UbmAKtON1vOGa+TiubMzxk5EFm/5rZKbnATPMB5hyRZ4pgdz+ndq+TU/WRWph7O6+1UkdtFSpMAYjcNPiAvXZFx+2g/k6GkvMoFIm8WvXfDXRrMlHs3VHOXAw7lkVM7LFxsEew2xrdalZ1NkVmOhjbFYBqTVmkSxY6PGDAugLX/8Fty2K9o0/aTDy8pmfcoKze2KWEMl2Y9LEr2Vrdnh8958azskmtEXo66RDGeRO5Q4S/AFpo6bdUVZtOwuZYvptBgvZkSzKiIk89t+oiP5Zi930LlA10h71iAl3osduZQiIV/zl1KRlAzhAtLiQrQYlJL2HOlvGzd7SlZDyus1kwnuiPj9rDnVpK7vA3zoPZRIZqPVflvgkF8sS41UY1h5/C7QGii7PTdniICl9YebI49iIdNoDLwIHd7S9KN3u8GntneOCm12udDWUQYtkh06pnH0PLF7F87m+bOfySYKm3fBg4BX2GuQ7L1ukkw50mNYwvCYqZCK9OxPf+We64i9gtNbE0LnvV7Bi0lj9dycagU4C0QvmxS/mcbdOmKeVrHRmXFlkbdyjzSwFoQqunWukTfUIdkszyZ3GG9TMGatJfWs4TcQkQCg1fsryxsm5opb8GY7WedGFnkNegSuP08jdGc91l6ixZxaTDhIwAGoJuC/PiyixlQvMCJBhFZrnd5WQGun7i4skmLzl+e4Wg5uqdotl7Gv3Kr6GeIGBxK0L7Del+LM00NbMy/DV47TPURK8C/fbkfI99llstTc81aOB2e8ZcNTw2zE0b2BFpBR4IBJ1lrCZNO1qA7Cc6+1rqwsFaJUh22grGYjz4X2UlDWZ7We5088uJrmeicb0QIdD9xObAp2Obt8ZHNwQcxUk1FqEXyWjWc+/7l/ObMLMhQRg+ZI17Q+BJ6cHLPO33CWaXu/Lb8mGxku26+dfmz4Cb1A4KNBeNbUk5NnEYIWUUB8x2oAO7fJ/vFge9/LmmLdi4tFnv1CggpGSOD2qqF+luOPGvCPGvCPGvBf/4hmaVF7W2Ol6uGlYn8B/SKC3ft2WbpHZsjcWQXr3wl61QBqr7rLNPvy7qSyq46VQ7OOy/22hDXpyPyepATJwZ5EZmFkbnCuB62lrVfmBzndtlpPN8ZsbNZh5OtvT3AMC5Ar+B5ptf/4dZT1atAtiTqZYeJIN0zT7nTGJ2ZvXJcgW44IzIPhHZtCjx3VJBm4bYgb5+dklw3IOIFNRqoF9we9a2b+vQefe0UEyMbondCTtipynS/3gMq4iYAWyy5NblLJFvm1Tfptq+ek0lCl1qeYiAtmabmqJtgchDc6Fx3FBEYNOZ46aQWMj7KDjKHU1sYlqSKD5eATqIzbQjF7h8Q31hrTqj5JRVztq3CrMC0CdCkzT5h77l6r3mkdrp9nwJQKiWthokR86ZfqmXDWmvW678fffYTEEom4+y3F7zB5IG13I5WkOTTwzDABWhOEzGy9HXtivuIPJLMXEWHlaaqkAioiuCT/nqz+3BNe2e5JAvCW+/KwHChLNFrtKybcERwuF62nGvy2/iIJ3kE6hYFwWNwDZlNHZtpVqmy4JXkmc91TobGKX/XMzm2t4dqI1u/hTX0DTdOm9F3g8IPwwHrirO/jwWPLLEK3QC3QrvRjW+8U2fOZVUsg+gPF5vc812Pw7W3wGALbZHs4+7LnI+vXw4PeWyrHi3wVxbZ42MZZSpXd33OvO4QuqfhXge39T/jzSTs+EVlW8JnvgkxkJMndunIp+bXCl1060q661hvVEZSlfJ77aMtxYpbF6xvoz/NMAchVjhf1yCw84pRZqpuq+dYetgacpC1b3DmDeSwnL+/Cdl0EwaWDaIqMDi2VdtqihAmpfBZyuG89+6HpBqei4Tw/HSUt9/v2pDXY44HIM7F8fTBG4/F4cPbJ+by4etWznjVqtAzHSSU3IInvTktXE5vpzpB2wp1LnOcMdAZHP7GQ6pmKzBlxK09PNYjEBEzAVZhx4UWOtWjVjwnN3/BSJ26VA21m6DVoU9iiYdfg+XzyLPLgc/6gyQcgTA8kvmNx8Rlp3zd73Mrvo098kQLLUh24nW4gFbV5ClY/PXFzuiqbpR2ie5JXCbAYmOUzRxMuykr8XovtHuwDSVRQhQok6gRH1YhembgRQZflM+d8taYNTxWZ172lJIk3CRRg5SgwLHOYv85y/t+Of4hkOJ3woK2dZTUz681EgDxY5Ov1luMLA+MipVp5AvKmUPrNIm+R1hwLEAK4GmvalB98MRfuodJrineKlsROMgg1nCZCI1lu1r6EihfzurVGVMDy+vt1XQkWSXChLOuAy07GvuH2g34JfWtc3Wk6sHky1ejvgrWTro05J5+zsemTZsFljfl50B/C798/0Tbom+M9N9GIxrySlTHtya4dtSBaShOPMJpnBlNcD+z9BxaWIFVk47kshyg7ixyoaDEUvg6bUsoakUG6Dc9pNxfmk5AHvgnSsjmcMfEQzrAczvnjDiHr8iNBCuHl29gazEmTdrc6Gjs7XsVUgj7JAnSaKuIzp/iREt5Vo0exX7PIfIEzWuF1bVlKCaxXI51+6xdUvooF7bZW/HkOiRdoMFfxYF7+otA0c72AO+vjUiPvmVTrWcvnaYVau1sVUdns2/JmlbQ3MpxWlhxTYGM1StWsqrGNkrXS+EumHSfbgMiwzGJrSQRvkdettQ967wxXuvS6ClkwqPTbQsHmCTHYt41Lnfn85NEbw8rPU7P5ys+cBaeqvsDJ+FKMWmCeS6DEBW5IDTptGufcOK4n+74z9eDStYjmz282OBoIwjYj5fRS4XsBF/vd2FipNSCBsIhAryVVlVIqZtO6QvBCFuBVLJRSZIpYqfDSfzb3kc70ST6nC+jM66SaIetNHLd6+gSa7lCD/x1nriZmOHWhkLKneQXRgssAyVDOu6ORVKtmQ1SNt066pwWaNf1ih1WFpjvyD8L9/mccg7TXWNZaWmtERNpnAHnuajNedl5ZuNXGL9yNglbmYOay1N4VztEUmqZ9DbDFCkYXWswvFrGLga7oykdQ56xG1WLZL7zUVuA0dvSLTN4UlCtlz7EXIAxoqUtcbpl8giav7KbWGi0Gn/NAvOd6v3ItKJasv6fdT5Snr2n9HkNRxtYYI5DTOenskQBZdHiIs0njIR3DsONJny0JEd3vrEC1QZwl0dYkn0RX/HkWEJn2IJwHx/Gd3kl/7doHJsE5L3SLbLoiG81WtjF5wh0sqvjKNVBn3tebZZHUT6Nf76g3dF7M6yTmxJZ8X2FqZCPY4Imxt55WJwt40mVxcWWdQXCuAUwIPaj7Rm7bl+XLr9HSt1+V6I7No65R1jhDH7SfKNfi9jWPXI+CJf15DYOaWNYWkYOy3HNWzZYkoM7KB3mxW6FIR9FQPxKUXjmbkmzmpfxaodhRZCMvldoCcfptabT2esFafw3DNA0MttpTz6SQ11Cn36zbVWt27cjKAf36ues6XTrJTI+yF5NU3BzxRHY4vwfXIPOUxsbKbtglaVbIyzoig5snPi/G0Mqnj3sYLWgixLV3Nc8h99dpXq51Xn1MZd7IRNRI3FjpPclUeqWlY7esj4Zt6TJgVrZB2QmuJtcicjBd93aYE/ZyFDBSwWc4M+Z9X7ikjebwjf3KAdPbc6P9CB6RVpduRo/gxzwJn5w+8ZbgqBfT99qCQ4I2On/+X39j//Mbn3HcIHA2RcVYp+Oa50qsEZ5mTfEF/P1Zjj9qwD9qwD9qwH/dI0k5ztRSxhVTWbFbrdXWIC2+iI2lJZHxri3SAioqoHsT6Eu6BohnT7qUfS4Tb+u5sJv8uTpSiXpWI4DKvJAcYuZzm/cBC/Sr57f5XbkmQFv3lXsGor9fj7SN9Pz09RuYfjBdsBC2NpiRls8hgTbHZHLa8yZv+iV8cuIqjHERUmvPdWSWUwhqSZrZZ6noDVrs7CMVcw/d2PedXTZ+e3tPsHKc/KgIBCWY86KNCVU3heSgM/Gfwm9otx3SI8gczYDd8vyO8/UMp7XuJOMBcjivbqhFDdYEbckOtz4wERqTs4aki6skklmoq7ajl8Is9CarbrVfF1XtHjze2WayajwQEuzv8vLacVlquS33LmrAoI4oxHquNLAvma7/s4+rz7wXl8Jm2T5GsJDOHL7kujdrnc3HZZF8yiBPuHM8Nl4gbIjS3bJvkKxjgszNytcMWq27V6k6s6xZvZ7fS5l6XTvJwU7UUGtWDapr0NCFpYaCtLPO5zdtH3Mvyt7s0u0eSDkb4cI2UjmUmThWlq6v85a3g1f/kzh4TuOk8ux3tvhTuaN/vnJ3ZNKb0ZuxRSrjsvzNvTCV53FbBTZTWo97fzq082DwJhunKEM0n1dNMmDXwdvonOeJSH7+bdv49m3Vow+iQds7fXRGU1zOVMbSEA4YgyvSqSpvZEUr681V+OXKAdjwBZqXlWaAjs44cuJnklZrfTg2C3MFXIKmcHLQpWHN6fbBUoZZJzMl617rXkOKAJ9X7Y2p9hVS0SPxhZD5ExzRO+qTKGu8QxdJKNdKBCScle/bbN33et/XWT/m/67hbrMguHIopYH0ja01dMvh+ilG10BH7m+B4eooe+4vNjlJ+3rMcn1vSpuCWLDNzhkbEXDIk7594+zCfH/waRfBBieoKK291upzqUGOzMALhHalOjcdvpJ00NSRLjyvJ1M/qnYRRFePd+V7difkwsLTZUGuzJyawXlCH4ZufpNIkJPue+Hf+W+7NfboiDtvJnyvOnpHMTfOGFwk2QKbnFOR1mj47eyw8mGtZQZUYtY108BvcCd9ttYasvL6Xv9dCdv//V6uV6694pi8asKIUlXJxChr0qQaZp1evdEUR2wlQR43kW1BDFOMfruddTx6fUfNDGT9OfGWUeBYGid8sT/8bxz/IlU2T1KCL8t7OsRQH8kU9H5PwO4Q1ZreJWMuF3SRBMIWMKQlgw2feLE7XyqlxrCSk7eJutEKOIwIdBaLU5XuxeQOeEm10ns8fx5WvoVpBfnFyRtpSxAcd/iiSTLYTBviWxbWDnI6+OTcJm2rsHXxbBIkoCU4NuOooczg+fk7TYNH30EG5hdt7szPi7F3opfH4zzhSmWSihAceAjXlcXG45EM8GVLoSf4DFozNII2BVshm5JWP3nd4h7SrXyDdcNHOMd1cM6Td3FCoPXGU2ban4ijSPpRmmEhXBZYXwyBVDqt4ZIXY1sdvHtuDgUsiucurSvYsRbJFp8JBkbLwgQIfflsiuYgyaax8SXg+A5zfxVzl67GwWkrSLesi9xfuQs/y6GSLPeX4075e2uG+72GrbXIVEG2HL0QQQR2W+zyFf7o5CNdnuP387ReJbPDErRTVoDyx9HrWepss3IV5kQsgVDxXJZOO4thJDweG799vGWA+NuWkudL2OZGPzvihm4k48gSAPq2f/Dt8Y1tbGzN+HFANEEeDdVeG8k6KQqL0VmrVLMELMwmuNJESQ9wx+dVQFOGmqPpKNqQXJ9KlRHF3gweqfSoJlJKSRAFjCZg17PQLW/8PLwah5z8J3PHCNaQvNhTtAIYshBu8tUuIHhM5+orNFSwaoSjV+PpjtpFWNzBfEP7CxDwYCljmrZkzcpLDep+4i1l9GrvyT+Ol9844q9sskiv2ojMDgjA2wNv8+WXfst0c7PpbDT7x5vL/+hDpKVSZwVXL7WkBHcuRXTGncexAKMCw6TulXWpw4EMdl4WXs07vuiNi1AherNrWmi+ngiX1NBnaqp1kBqGF6vZVvDlUnWuJiHX+hX0vNtAW17fSzOLLhTa2IhnydJJdnOz3J9EwB+5YYtnMVQO6jCTMW01uJ+SgenTJo/YsyEHBu/06PS9I7HR+87xY4LOYps7apNB8D4emFr5pwfmRr/aC+BpztgE14n4oLdcp5ru0DtXBaSPx44mWS33ZllFdaq2LtUb/AFFTW/bGkUIZhaUkdd1r/1mu95SAfzXT2L+QIBpwekTiyrKImhRyi+C7/E9g5dV7yDPrGkW898W/9zvAAAgAElEQVSSSRar4iLBiBUKLZqDpYg702E4UPmLZkYftR57z3B38zo3P8dxA6zF2jc5qm4bBaTlXqWAezBaFqDNX4BllHVJDobWs9dpkff/lGB4Zc3orGFA46VKEVapquUhbREII8+tJXvzVs25Z9aX5Z9TeVCWRVKh0n7S7mf2paxeVpRSADnk0GrtvSfP/Geh1ofAeSBliyImqCubCqMF+IlbsMtbkrMWWzP4EpScAzr5YveYTPU8v8fxSZxSLOv6jjBG2exgwRm5n1scRNXbDaF3pQ+964BhSrO0ddmuRzIVZ7oGeFlqPauuwHopOI0pkrWwbjAmsxtzZVPo8/5cK7vC3emVePuwzrjSWi0ObquPVdM6ZaekiruVogVmaNnjTK598v6nD8a/2e6MBK+phcZOxLVapzu/Ivfd3M+3n+iZgj9qwD9qwD9qwP8+x1qDSulWdrPjS11oX5jsaztSszubs7kiRUiZVcs1F2bVRd209p76JQX0WVs2r8G2MIcv72up6D0mqhNEONcwOTKvMtfDCtaWZcXqjNjwlfESytkmczg0K5W3omX/M4dwumGRzOgmwtVK7RPk65N3s11Re8zfEtBXOMkhce+dcOWcuS8GnllcInS/0t5SjL2/p4Kp5c+8929ckgPJuC5aqQgak6HOcGd2EFWckUrFWPgETIzty99XxgWx5Xo2k7CS5wLmrMB3D67jZGyZWZZ1seGWnza0qkZPpVpEIkBjjBv2K1QBiRxWtfnCPKSyNV0CtRzyn7qx8uNWDmmuIXn907J/qWzWPnxB/cwMp/XCPMraLYH5n2fA5J4r8spb62t9kVQtRQTNP27r0H5/3CRHL6CTldFUg5Souh34Qgzi/rfh3HV3C8kczi/LTbvX7mAYRGUsZQB9ErgSh8o8Fq9aXOsevsjnv2b9CeAStxLRnXSXUGVcqYyG1315WVlPamfZ+uVnXX1nDlK/7sEiAqczembb/5il0LL+UtjIJMzy2W1pKbbJTpPO6KWCnM+c60QkbiZyK8a2qfy6f/DPbUe2HIZhztUm/W3Q2dDobKNTpk58G4PPdvHjxw+eJ7y3wa/7G/u/zWe7H1oKyYlJJ7zISJo5o6oXVF5WxCKWKLtnVvwW0IaCNnQGoSehF6MlwR9tRLO0+9su9g/h/b0RD0Xlot2SBfJ3e/bmYeWooFrXTXBt91DG5UI62bfcuU0/x9E841yO2iVu2CHifv4lXvXQ/IJz1neCXC+C/yLxxQHstValDZu701tjvD9AP7N/9+xftCz6dNU9MysfMwcZ+GdDZON9v1KMMZ93frVLzxgbgu3jwefzO9gJ81f8Eg5TpDm991tlf+ozyVXhbC4oo2AXAYSunRGpkOo0TjsZOu5ieUpwidV6/rW32biui+PHCaejDynlYn59wl2bLZebIRtydUYo2jZUs/84ybq0s4GX89qyEzThmgc7I3Pbak0Sjy8XsZTzIklOjuBy463WjpUNt0U6dbjPXD+bptJsLaaRZGYjSSALD6GIC9Y8BSkBrqky0gisZT+XQpu1jxqrAF3EkhYOi9AVX/ecGtxau3NYQTmrHlqZ06HxDwe3/7DrEo2Cw1YoaPp5B05bm4md9wleV637dS+2SkcilVArZE5FbtkcCkdeB7rlAt+C286u8cblKb1tliBEJ25//qs5U9Jf30LIPSuY5YuoLCbB66bS6FwxE2TT4GonTz75YC+52clpackhsfH8ftDaZO+NMy7eGExpCIbw5BmT5/N35plFwzV/h9bZ9A0ZSpeRDNk4+PxxMN5/gZbSxOf3k8/rM1VJffK8nlnYaU5B99gxv7IobI6fT47PT9ojP9QWKxcCPHJTXYO6NeV81SonV7yBZNFJWapYNObpbNs7ek1cBJt/obXGeJtMe2I+UfwGH/G3YhwaMPP6WgUWqiaTUFKqbjpx0mf+LPspPMPEop2rnsDbWflReWNHBJ0KKAtAJiIlQWzJBnr2XHAiAo6dPjLTYpsdIugtEH/8o9v8f/gR7GjAYzEmY3yh0lGNi9+LQauNcXyxo7h0Mov5YMuCMGHTBFdv1ssLlOuWABPAt8/Bn587rTV++8zi6BcZ9NrE/iP/N8HfkJBbgvnrv/8PvD86YwwMo+0p+Z4tOKzz/fvJ96vz4TsyO+/xxvt45/19sG1b3k99RxDOUzi//8jcicfk7W3QH68m3mrRTaZk3jMeJz3y5zX8HujOrhx2Qjgxnc7F43QOW8PjTlgFdNoqEtutIGmV9bA25EbDHWKxeme/15CoIXeXkYVgBGa58WbhuTaG1yaSdhOriciNXLXY4JHrldSAw88jwcVQpD3qZxI0t9dvRyQB/gjPkEztBXqUEmLsIJL+xgXcZXv1Ch0+ddlUXmyRjJ879Dco2y/FZN5hp8s/27vwc/GB4LNd5KCois7F6AmAtC8dDnfQYX3W2V7nFfHy478fv2K81bOmgVTTFEshRVQAq6Qw2Su092aJzLswOMPLn13Y2iIPnKBpz5G2baWkWP7926zsJlBvWKksrm1y9JPZhCtqTuUPtD0TYI60zfJ5LHiebsL4hDGU5wBVwexJuKblm05kq6HQ2dgeOyMejJhIa+j2zjX/lgqDLRgfH9Dgt/PJX/7yF57PJ8RHytq70i67hykRwVsbbFun90a7FBnw/v6OE5nBAuyPwf72xvj24Hy7KgC2LG9jv734J8FcShbJXKyIjVmsbXVoVxag74fwfE70KTx/z73jvH7w6c9cO6vpNHrmhbTG2aC/v+MDbCsWnj7S1iVS6azSikzzCvu+AcDYXv3w+oNOuEOtR4HkAprgnnThM34mQkTe+y32Ov/5r0vtxaoIS1Fz556tYUmtqV62xV4qeLDbugecq9887RvAzlIjn2O/VWPFchJDl5d/SwAsCU9SDW++/vTJiBPv6a3tkSBE7x+5ZpKWNVIWbys7QeRVN4542fWpPGpoVYCLpGKhx8rZHCn2EscvoY1O945oAm69UWDauElYF4pHwxyabbzLlut/FW7P86Qfz7JJMNqWCoSIvRap4D3ILBrdaKWkVx08xsb/4v+GJg/4T04/lA95Y87J4/fOmwx6dDLXJxmnYgkILvuZtAzNGern/J2uSSr6rpmjMfUi+rwHOuMAUH49fgXg7W+D97/lUHW/BFyZc6ZFhqWdhDSlb4NH/8a8PK0gbGLuzPE7v/3vv/BP//Qn7De4+MxzV2viqWliCGlndK2w9gKXp1/8+kcN+EcN+EcN+P/7GrBHKidziP0Cdv1LFg44M15WyRGB94aXOnXt1aKlIhdhliIsIjhl4v1H3Y/5M02EvSw/Heepuc9pBc8TSlBWrAFWNqIrk9hqH8wXdNDBjLS0dM9n/eFHuYYIOaAQvl+Othy6e/XG4YPLBLmc828/eLd3zo+TJ8nwvhAeW+fHefD8/D0HTN93/rT1xE8uGPOd6I6+TXoI9hjovp4VxT8v/PMirif6p4kSNHmn68bpil6lzBbgeYFZqg3caY0vyjK5Afvbrt9rT67hcLP3/Lq/cV0X+9mzzhWh942tKZIeuKDBc5xcDUKFT5/oKKJLXX1rSerIodd52ydDqwFfR3W/7QS1nhEpCz0XkLbX+4/bdeXOZovOIpE5jpT9rda+1CPzRCKCrrA4s7vl68x5skx3foYjnWWkbLnlBu/za1mfCeddr4wqAk/tt6oPHC2Slfci4KH3+jstiQGtdfbbui7u++TS1/Btlm229gd9kQmbs83A7DUQ9K8n0ZI8IZJ5T+7Oo410mzC4a9hIkLhrT6Ke1foQqRpPlVyp3LcdYiSpwdJVp4vcQOPT7bZWb7rxMT7YxoZqYx87LsFliV1efnDcg8ZvyOhIZWC21gg7c48Po481mIscerccviw7ciV4vP/K2D842sB8cBh82Ea/BtvY+Ni22xZSVdl1Y3vAR89En29/+qBp49GWHXzHD2PXjWFPTsn6V9kT7PZ6LxE0F/arOs5zZ2Pn/RC6RT5rYby9G/2C98dH7pvay05XkfeJ/fuya/s2ua6LKWByVo+xlRk+IGe2T8FttRk6sNqX5bZG585G/lmOWSrOYUVCUW6CyLWcHFRYKrg1hF8KvtQA7XeNF6WatD7qnk5b0dmCUJC3tLA/9QD7BQml1dBXRPAW9/PRyq4yhvJtvPNog238ubDbE7nyvvWtM8bOx8cvPP9zZrLOcA55Euq8j7RQjQj0yL6ii4BHDoFlEteJmCXRz4yBQmxc1+Q/+1/Zfv2VaJMllEjF4NrXA3RDe2e0xvn8zvH5HX4E47cdcyGKXLyRpEOAUbhye+68VW/wHoq0YNsa3c7MC9z7XStob3h39n1jvjvfvr3zV3nec4Vm/cavX5nQVFMsWa/VGrjO+THIfSUsreRjr3NcA6hy4Uhs/UAlbkItgMx2RzqoKLGVHW8AUiO7eoYpJTFwE4u6j8yEAi4c/y/2nUHlUQo8y44vgCMWIVt5yP/HAVNa5FAFDSzTnt2+KEkE5A5PWxYESqsb3NRpBQit8k7UXqHEKBlcC14P3OYNqc3A5So/QAFJhsnUl6LF1G+v+GFVtNnLRkHUoBcgtZzkLsd1lph+J3SiI2iSsrg5HSIltqGCncWqnAedjWG/0Pgs9kOn6wSfXFc2KFs8oHUMyaGrNqxAQ4DQtNZLNrShR+DTUTKcMsGFvGmuKwPPe+8JBIbRmtxB6S0GR10Lvxuxm2KbLLwCMprvyMw/zwtsCuFldxTBdX0iqw/vRt8ah5ZPs05cTi65yvZpVVUbsQBX+T19vcNorIcoamFI+5xZTVS0JRdXluGxyGQFZjodUUHtC+NMJvuSAHr+/k9tKAlWhDpcF9oa4eWzHbPUUD/PoawwP4C4GT3WXvkiEVagNXdHOb8ABsU/A7g3KG9yh6FP9fseutlBkRZZIsIvc+NPR7Kqf33u9N55K8YMwDkevO8Zztcf6Qn8GO/0UbZbNIa2ZMy1k23r/O24uM4gPJULXQZv2zu9GarQ+ytL7XS4rnzWBKe38lyOl9ewFuiupS7INeJienqshjk+DXfDMSaWm4IpZo0ujdY3gguJszboKkhr8hzlryzFSvUvaj+Nk7Te5Jbniq0m8hU6rb1hYveaBMkyMVbBELdndzYXwoT0oiYwGqElGm45wEf1XneDV4aM12a5+7fbEvRU8Ap6nAuARdkOKWs2iMhn9HMhxHXks5iBi9QrAOy2owWE5/3oBepXEKr3237lZzlSiVCbK9wNTbjSIq+vWAE2gK6OsPnNxl+s3r+/ltDqvIe3tE1wZ+piLCtXSdZNNtpMqweJLMJUMjQxN/kOnl72zVc2XhCWa93VV2bci1niokTdd9Nz18rwzyx6Tr2Yl9FV7vDnLLqTeePWkNojtuloN2IGYyYD+upkthE5qBl13ro2mmR47iY5oIv9wWMX5pwcTFw+2Zuyj8Y+CpSbgupWJmqZT9XsQbME4B/jF0SSoXYHvBqIwmW5hu260bux7R0z42/8wCxQjmQLQipjZBV0nWW5ouT+//CNbT7yupzB+Tnp88T8mUOCOG7WeUjmUzCM4xG0Fvg7bCOZr1D7WXgVlIL6wMdrLU9Grd8WT+LJZP06bCRmKrkpa6QC84TPun/8i6rhZzjS/nHtK5DnwcT+DhDyu/invuelNG4idS/CVhXsFLsZmKOk0H9PjMng2ZWtMCvnicWYjUaTl2rbKHZ3qZ5msepU01JFJJVxZgESZRFX7FmB2fMzzMWM9k7nrKFYNgGQSjxVZYYyq6IdAq6d6Wlv5kDolsNHzdVeI4N7JexVB0buP6LGRQLbA2Gvol/OKvw/Pxmyg8OQB+LpSb5ro7WWqnmE9/eNxpmZZs1AEtC/7EKeDf1U3ITegiGdFjtNGxoXXk2Mh8JMRceduxUVvx6ANA7/JBwOLHORCpF1dxone+RgqRcgN74/2M+dpfC6rgv/0smoK2IPWjjvTA5OwpxP/UEbjd/+tz/z2//xZz4+Bn/lk1UQya1ESbuvrDfXPRtkXq6nGO6nGtr+UQP+UQP+UQP+9zi0+sDVM66xQs8wIyDxntILck8dIjVGFQDAVsNIqHV6JEjubgXujKzxSCunYUEUSSRcXiSY9Mste5xkIKsJVw0tltVaN7+f+3w7pWBCCRFGZOh50571R1NmOLp65zDC672GpurajGsGch58zWUWTaLIow/OgCiF++fnASi6d3r/GxsbW4xUv0tapEYk6MQEOzLjjtgIz7zlc170dtEt0lKI75lvacZVA7Rgy6w1IORlK9TKnnCqFXlDwMa93nV33AziQciBtpYONQsr0lkZPdcN3q4BVipLKltVJldc0Kt2med9rUWEPTamTFrPJ8Fuu99OaHuRXMg6xwuz0Llwp1RfC9D8M8k1KrVOObqXElNAMPSq+0wAMg9ovJaRn+BwkGCj2DF1tJg3iUNnAqjAy0IayLzXHLC2u66tnsD7TTTf+iJC++0WIcjdi+CNS7N2eixCcvhNeCJyAO7yujYFvRW+9cKZMEW73nU6QCpQa0928nnR3F090ooLHRjOVshh15YZWiKYbvf9lblk5OCT/VZ2yz5gDN72B29vb/j5g99lWXadNzGG5kxODvvkl/bODJjWSBv2RsyLlQ2XroTLMaMGBAx6e6Clzmi2Z96fNkxSnRdFGNIutJbPbutSA/ANtyTPXdfBvufPiznhjvdJi8yC8VLbeqnq82Q+aFcNjs8iF/pWkrAAc4ZtjJQ357XSD0bLvni+/cDee+byqmCaLhtR2ZoidvfOL2cCbhvy3E8FREqh/NqDf6ajxfl3eTo5DRCaNaJqoEPajXtnfwP8F5EfUnl1qR6LHJ7rqicTHze37IPeOj4GNnLosFnH40jCS2GzQsucKxX2feNdP3jog72kib97qqAWgel7TGJrjLeN/hicM68V2jjILMfEuht41aKrX6woG2QR9nKteGK4BqcdKYlsgrTKA70eJcDImUJJVfBmtIcS88KeB3b8QN5qjwCCi1Fqm62sbbsrWnEqmYepSB/sauATa+0WFmpT2gf03ri0JcYv/iJVit/CFl8ZkEE5yqTF7OyL9OJZc0jnapHqcxu49XRzWDagQX5WyTztHkKY0z1nAmd7bRQRD1wqioZnkRrgklkuIvlMfCWKmiorSsIkXUGyJ69fqnLfX6jd1q2JUUURpP7bz9W/MNJNoKvfjNzFLPPbD9KreIVkX+aFPHhhd8rUtejnu1bdyxc9MI674ZHIKdypgcryeU2f6CwQ6kKVpjWbywuxLNhtsbHi4pZV4/Rbxtvu9x/1gLmeeBMunEt62iq538wIbU/Y3tn3wf6x8/7+zmN0PmWkV2yfPCuge1ah4nPS915sWIetwJQqdlzSj7S3tCvymPmfKXjg0xBXhuam4goeaYk3Y2bWRZyIpD3ho5gany0HOsmcy5tJb4llhrsKHXfjOMpaqU2UM4E+aVxGeqnvgE6mXrn1ClgMNj8Jm0Tb6uwGUQHMHu/IAoIsA828d7iKkS/lfx3ga9AUDVlqs2L8BcFWvssRjeVXqV62O7wymNRTISeRVom97qN1JMfu58tgAn0pHDQVf62KWMiCx5ZMsD5rFmi1cajfIdmLeTk8faQXC2tJI6VeqIfyMbNxGrbxceW0/HF8o1vnfexIHKTS4Btb24rZUB70o0HPLIuu8/amXgVj78rnPJmSdoqhD6S/o/I9n985kXoWT4LPcSBngyvZZGbBbHrXsIrXApd/N1IFOYttFDpTTbBYTKZckrD23o3ovZ7tqPcoWBU0apS8M18pVrEZi1E4sWxP2GTe4AD9qnPab2myN0FtWSC9cjuQwCPLHfc1YM4mzaU8uAEtz/98+WKJ0r4M7pM96e40zQHJFMvzQPp3L8kqcHvPm/S72KZ8rVsxma+WIY4gxQz62uTAnA1pS36cDPsgUM9CxAUueQ3yf4ZDGHR/MSFjsVQjXvJyXnvLsjJDvtifEXeGwtqv7nskio0W2bg2yyH2Na7bKkYtsCI0rP3Q20zAOAroKALAVcMNF01Avkmqo7LSvF9fQ+9nQGTW217MJkNdkuEWk8wSqOyoKzMpLnIQkwquBNYbwhlXMak7LEZtKPrIAdJokv9JJDlUhW4bzMz96+r8aJIhn/LGMU5+P0/aNelbSst76F3QtACVjUbw9ngwWj77qdxRrBs/nget7by//8rbm/PX+Z8Qsxu8czlv/+mpyeDKc0RZfJ3cCrZ4z59xx+eTef6gmeFxcpXft69rLYVnNOdoF9++7fBh2EjA0cTRpuzJcMnrqgozCRrHVoWXDe41OlPm87lZz3eRdlYzsa8w6Taq0eRmgv4Mx8o2smV7zFUg7CIHBd4CXYMhFrA3WPsC8IUQlH9v95YsoFL/LoT32r+kbHDyNftybavzJjR6JMvZJRUei/1HBKqTqXqDiFbgVZNUEuQasQbJSrNX9hPkOrhSprpctz0M81E15usaqfSq4Rz3k9aCITDizD00HgkqO2AZ6OzXvBujtgujQKuJ8EvZL51VvB+2I9V4bLvyLso+tlSRmN1B1CLCW9uwysVJtYFj49/R443jOLADes8A6X1ks5V71SQtphVCMCvWGyBjEAaaKDXeIvefKPKSRtpFl9XRYh2Pc0vb4vNB3AOllwbDLV/LrbPshYQM1n57NM4t2LaNx7/bGb/ufL8+sfYCkNZ91UPSuo+1f1nVU+/Zu9vxoi7+VMcfNeAfNeAfNeC/5mGqScipv7e1xgcvkgeZZ7X+DP8lSOLFJoc+k8wyw0gLoqW8KVBrWceq1hIjuUaRf9abhNGRGkRcvYNvfH3JBG7WtdZ7vVxJd88QWuWShDQOOzn9QsYjnxvN+9nMmGKc55lAXh+IXIyyjldVNjJ3WZsnKGaT0d9wTzKpx3kD0EAqCOyN6MuWTpiXEj5wG/n9LjRvtCaoeWaeSBJYz7KkW+rgU4KzHuhBR0uRYi1zQxJbyvvyas6jVOi5JwfIpJUCtM2O9xrMSuagHpGk5WW/CqnSaAjhwRXnrcbJcw+QxGYi6za5n2sy0tAzSiCD45XmL1X9Mj+EV1b0suSWcPrKg+4vhRQrzkEGp+Tav2x6d/u5lBadiqQvTG1ZG1srvKYGAS8Ludcg90UGu/A2CvRcReHJygbMX1j/tyybLIh6fp24Yw+srRiEVz3povRZjj1lPS6tY8nwztwxW5her6iMQcj3+3PeNSgkSRlgGjhY01ulvgjZaNxZWojT22Jn59f3/Y291tpTspbZ951v+4OtD76H0XuqufPezs99kjm6qHxZax36qDXM0NSTMuarrgpdhJWeJCRSQRg2EYPOgy0aHnIP2Z9hdASVRm9bRneGMO2Jto3TJi1G2vA9FiHQOWQmkD3zXD9U8ep3x/XGHklYUAksDCStyB1HIpBaj6I+8+YN05OuHVPDKkPIeELzJI/LrEHLxnJm9dp/NByvAUhamNc9UJufOvea87McU5bNc9YlW52TqyeJxaGyK7OeXzhFFnt13eucLKJd/lu/+yVxIdqV9p6f0Hpnexu0Zydm4gURG6K9yC6wv7+h2svRYeNtKI+h7OXeoNboNUzv8eRkKc8G8btih2Ez+6/Gi6SBOLLW05WTHVok1sQGzC6UtC8XgtNOjCcinSbZA/mUG4ux2g+0pXMaGD0yl4m4Ku5GvtR9q07M1x/e2Io4kdmHJYgIZd/emOFExRO0bdDftnQY+9OGjJ62mkvAIPnM3kPq+jfx7ElD4TFznfwsu1sNpUcHmxyhbHpiDl3e7mu9fj4JKjU3GYNQpfPgtHQsoMG+1gNpNGlEXIyy+zVZCqS48fcT4eXO4zRPQsxyRdtDuTQJ0yFpt5g1RBGeaWx3NNF/ffzDnUxZrJdFSy1ZnIAV8zYDx6vIrAfA2FiLrHOgJRfPoiqnd6MmiKojC4sqtfPr2YSuwvY1mMq3O91vBuAyhcjmjBfBQhY7nHuaLXxhCFUBFRHQlGNeGE9CgqbZPG/bxkO/8f6n33h7e6Nvjff3d77P79g+0SFMn9U4pBeliqK2M68k7hAdKRl9WvgpYW/0ORELrh9P/MeVbNztJM6D8XiwtZ4yfw9aWS5ZnFyWOVFuxoyAN+7FtvPyWOSe8L/o0M16Nv8eyLXBJehsYFFy1wBNhoPJRohytSdn5J0w9ariPe7FbEoAW9oStAlzha4vJrZiWj7EAVo3ZlvWAJywJOpitTG8ghzRLGLyomkVmHd5hiJ0WyAYt2WI6muDaf5zFWwv5umSLq7P+mUajRL+lZVLyv5j5aE1Vue4ApT/Phu+VA75HfVL+12kffsc7J9pj9LmKIa2ELVx/NL+DePxf6btDh0J4RnGwzKg1mejSwJcsS/v92KdI4h09CEc8UxmBGlxaZpm8td8ch0HTyCejY9vSoh/sQZIO6+IuH2Cm7+ajMMPjivts9QFu4rB1IQ2BphjfoBsNLdUOogkSzSC2XvRXhaQ/7I0AG5WDiKcMuleqsl6FpEXS1KkYUUJiCoSuvQEw91wF4YudsgCD7jZq+B4ZbJJWAXdnhAFnoswyWygFbQ8iVv9odHQFRA6pJbSjo9i7VxGSIIDpdb9EnQciHamLAuqunt0QqkAs53Om0xGNgW438yQn+XIPEAnVrB1+VX3eAHH3g252eJffvZmBylXXcsVBNl9or5UKdzn0mpQ1ady1bMr9bNZ0CwblobGLOuGzANxd84FyLZ270WqlJ0cNyMwrRuqoIPXcF2TVZ42AR9ABtluhc9ZwJxZ2M0v2SZZhwXiG6NvDMtrmk10+nKHGJMnQ4XWNpAsQJvDjPxMXXYeftFFeIjwBH648TGgqRE+af6oQmoS82Czt2xoPOBKi4YEgLIRe/z6WwLp8Ua3zxy4TSc257ieXKpcpcrVyGcji6crmWAzSQkA4yKHb57DtvexQ/+OtGCeFzM0yRwieNtREXxX+rfG+KVzvSmtwAuTkrIAACAASURBVMRHbIXx+W2XZpp2EtJ7giqx9uK8PpuNfF9fjmkBZaWkft5+7aOGlZlL8/OoLV55FUsp9gJmRIxcCheII+iVBejZ4VXPwd9NBQBv7QujlbthkiIRrecHICItmoCX6hBnysoqkXtdc03vaZNe7z0HSGNZGYXTNBnGOTSTzK/5YvYkKoQeaf+jysRZRLGraly3gWvmBs0rz4EGmbXZBSUtYcQzh+sYdg9DiAQsb7fhK2iRaqPWT1TSi77yXOkd5ntj33d++/Ybmw967zx65p5FBFR+SnS97S1UExz8t99+5U/nxrVffBfDvFhqLZsYG8p5Br21BAKuE8Ru0H63qPwC49pmEsbUiTVMFM0ay4VhyjhqrTwDvybjcrCVUQDKxGxiZfk07UkU6B6MVIOK0B4bfd/Rj41Pz+f7aqk2WYoQEaEv7+0v9xaAFNAUo3H5T7ZZ/VED/lED8kcN+K995J6kldHBqx9GvxCKJgtoevXHVfMpiLdbQWejVJL/D3vvthxJkqRnfqpm5h4BZGVVD8kdociK7Ps/2F4Md3qmuyoTEe5mproXquaBapLNvRhu50W5SElBkEAgwt0Oar/+BymIB04RQ2YFjgc7ZTLxbPL6UgqJXI3d2LZK7C1uV6baSyX16Ywq5/X+NN+Z6Iw4l1TkahkMPRjSGAyqhD3pkCDd2qx0d7QcTHO2oyAjFAKTwjlOpju9xybTx4HKG3Z23ravtFYQ8XBzwXj8+g35JfaYp5/Y7NjsaC34NEoNpXmtlScH1TwtIwcyDUmrP1Wl+UDz8045sRJNii3XaHHBNQF+U3riN1M2jtn5aTQYLR7WHGiJJsZjdNTCSqjLGc/EgxwUjaCk+5TAVNxiH7uVPQlJMRaKv9Yg9dxzmGiSX16K9KitPbOVPEkCLqHIjN9f45CwpBJFp71qG4yZ9sAt7Xu78hqrP8AVJN2osVezFrjy8qLB4leux5JkXJ8dMNmz2eSp7Qp8ce1Poc5o0RBYhHJeTTyWNRSgY2U/fkK3XC/MSJNsYmbXNHepF9o5fZGROrCwy3Ex+SMpNxqKZ808XHO8Bo7VA+/FSqdkEWca2a1RjzZaa6hWRII48aaV1t5opYVlGYPty40qN+ZxMESwpa6wsB0bw1KJH+NtBDJPqcqYL3w07t0NlY9Y7vRE7YHag3u7wfGd+WzMUhhFwxlo366xaqaIt2svOcVjPVEuddNSFg+bHM2JbTEaUxBENE3bsTaU24h6+62DWZx/JeRgjDmvMeAru7MYvjVs3/ASzyPIaxJZMwikbVy1dhFqZjaYTn1cpIFZnojlGJCXY8n2AxH3AESdZtGwXgIJiDXHV13HzjpP+spc/XSpK3OpZdKOEWYQ2TwaWNYCd7ddOY6OK5wUBk6p4Z4ycWrNZp/eKLIhCFVu7HKj+RYqRVe+bm/8VR6xFrLHs4BoqN7e8G89rY0L0w9GNitGrvNFlZF2fNus3PwdKcLkL5zTuXtjzIEibFW5y53Cq1EUWUJcJLpn3hMtN855stXGIYPjHAjnhY879bL3/HRawMWyLvo0PhKjwQe1RlOp6QatUGvlezk5bDCKcWTW8CK+QtS4oYAvjKwLq4OXCDuoVq7fmTrxCpUXqe/UI+uHxlrlCtGcC2wnXMKGdEhrXJnzlce11uhsnMX+ZNFYWmxaYv7NrEfjbJ2uOTkWnxK1qRPNdBmZ1SVr/A0e8lrn//b6+w0mV1yF7q8iTCQNfJbHpfdPjJ3FEp9XcF4ZFTnlYiGICEN7DDqJ39FPDYDfL5qAvPz016Zrs1wHKtF5dWs1f98/AVYuMwLD3V8sPsrll6iq7Hvj7e3GPuPAvRen1Tv7vnPXDdm+cLvdKNUpWmkcfJnh0XvMnfF8Yid8GwfbtjHqwc/V2N5qMDul4UzGPPHh6G8TeQu537d/+zP98cH9fg+WRY0grbC8CIs8n/GzjCelKD4MfTO2GrYslqDM6RUfOZiWXNYrnofWQkvFUbAPtTnVJzaTcWfCtr0HJ05O0MKDzrN8YGJ814NKbFALPK0njBJSvN13ZjZ2Oin/1PI65HqlZWipLpsHN367UiEXICRXKHqdBZ23C6iavgC7BQj5xQQW369N5MqedeXQ4+8N8//fr+ECVNQnkgeXJW/9fPBZDVXPz2z+CqgMC6IMSV/9NyvgwQa4jS/JSObKjLkdjdu3wvP5xP/9xJ5PpBSsxxI221cyQIHf5Dv7vnOeZ/pXJSBqERw+x84487nOkQvWb2yz08bJ8XzQ71+51xoHLskDscwsogVT49Ef2L8bx3ZH74WWGR3nUn3AZQlU5QvNYkzXQgTKmzOTUXQvjXu9cdtv/NxuHGLcBjx2u/x5V3HJOa8cOXUNJoI7eh3sJNix7rhuV0Bsg1y8X1J+52TP4lAWOOwbvaRJWLL/AeZqRJhT5rIUOPEBbo6o0rSioyRwFswO9ZgDIwMDTw5kvVfVUAyKcI4oHKUops8sAh0bv0egah6YAObcuC3yS34mE8OWZYfdgkHEIhRAkR21H2xe6UbxcYUxr/0mWBoJIFi5gpsvRpCcl51e/OJL2QBQrTI+2eGsImIVybPYiz38yeZE8561IZfnvruHTRdCzTFZhgfT5vq9/H4CWqecHKnynP3GfbFwLH2JvdIJcsMYg7L8NVbmghllGIzQhWx64zzD7vT20w1RDfakKl4UiiJesH2j1xJrVBZ34XmfBZV/Z1IZc3L3O7ILD/uVcgabVPZCNRhj4k+njIKfFn7f2sBLBK7jqIR/dBPAHlQPdW0vg26DIZHlp6rcFgNbLRlMcQiORtY79zPu9X7s3H4NVvzXcQ+lkTyZe+zd2pWxxXM/5BZw792o/6To+46+f7yaHWqMMVLlnKBMMcxDtbxYnfuMplYcNPUFQFqCilIvBRS+vfa13BfRk/H7M8Q/9vqkBAei0eIxjtf71GTuOkAbkZ9g/O5zWO5vETkl7NMo9um1dRXWnkxMv+5ZnRGYGmqcUFzo2K5iutqTuwH4Vcyf4jDT2kaTTcQr/FcZlJEZaHXiabPcpTCnUSoXA9YYLIu1pX5APNZPg+KF6l8AuOnGb8dvqO3J+K+MraVlgnMk2WorkyY/JXhe0Fvsccid3U+sGNND9fHP/+kN/6XFnO3OVr+gKH0AGexb61ve53HVEqHYCuuTsYf/+X9S4bdsvBgBMLpPNgpmQh+Ds0bAufYYk2Oc9PLBVja6T446KMV5lJF7kcAMK7XWhdJjrvmfC2oFP8dlBTmncxxpQ31WbE7maJwS6oxejO9pozbfC7dfvrC/b/zGt6vuWax710EtFfOXikKGsujnw3N/kgp/5xD0j7j+qAH/qAH/qAH/d1wVmaH2AWIusCwiX9ZbCyBZane77mQM4zVvPDMW1cF9Q0VoYzI0QTs58v+CEMDX5voCOHkB6KaCqLKbXu/Fl22f7ZeCJXCOj8AmAtoJVYbfmGlfut1v+F+FPjL3gsYsUQ+1btxkMMekzBtvZeNPdeOxx374mz3YN6Gf3xkjxkfvTtU7RTfEYd93Vgg8gLRoXCHAMM5fH/CcjNvg6YNNlFubWFqGDYvPXsrBnJ3eO308aK0hVmljkbD41ARIILVkO9ODtBHZOhN5duz7kznDIm96ZPM4Z9jryQFaOO3kYaHwGOXBWdOmeC5Fc2XLPKxmFoQygZWDesikpp3kEEdMqWiOf6diUONeqtdsFjlLJbvB1Rgxr7SlBF7gcBJzoqnFtV/ZPKNzwU5bdcYPcMXYj/OGA74a5dZB4hTUZWnXuYB+zSY3wK1vnCUzQS52/8nWX8rjFbsxCWxQxXHbc9l84guHzHtvPlg24sPGq7G0zm2fb6FXLHN4SYWjuBPkPAG/MzXm0nEBzXaRDPe5XZ8lsgEdq4rfAohu585t/0KtNTLXS6FsCnOB4jVwt7qjdUS+W7mz644Pp7qwzRex0WdAwSQpYtoD0zvTPBUN2UCY8V7UOz1JXb067bZT943f3GhinD0sAG1Mzibc58JVC9MEk++0sYFHA3bMSvNU3K26+zFphNr+s0IxmoHCrcf+93beuH1Ew0pP0PC7wLaTfnSGDp4zLd0kbF13qRQetDLxvfLMffdhsYKeWQeJCKcKWMumbY7R2bDSc6+zy9Zr8Mzz2X7hoD/KVW1HBPZP1q0QNdyZ9dzkoM7I8i2p/LYS4yIar5KN2heJtswt+wdhBb4al70YtgnjTTj/nw9QmLpx07do/JfAvG9lZ9vS5nH7iboVSmuoO6013jn4k5+MOTjHBz0JvdtWeXu7MRfB14IoZvNbZG/2OG+5Fm591T3Cvt0ppXC3hlWjyb/yNv7C4/Hg6/sbX9o98jtX5IGuSJceltDzN8YYPIuge+OX8YVxfMf/vXP/p43HLdded9oi4SRxSWaoKnvv4fiCUopyy2fxLnemhJrLmkDtlDJfNp5yMjRqgPmpYa6pijWTS/MyhcyGjHovfj/OKyJQLS3K896JKgVHcq6r37DwwUXkic1Yn1oJm2QKHBehIZutC1KPERfkL9XLFSxU8g0RUN+Yn6IiIEgCi5DkLtGecnCfV67T7W+Dmz6P8f/pvxBdti5B7IiJO6I44+IzBQPXV+c0P9yVwZS+iqugztctmavjHkySzweqxdx+MV/tUrgsCW4Xv5oqlxRQJKzSBExOzNO2jUH9lM8QEl2jsMIAlb02qlRaSqm3tvNFb6gpteyoG9LPtJyAZtEBjmabIFWggNiMn7XJFOXRBz/dnE0dVPnocX/udWOrubE+wE/QrSCzUUf4htMU92BnnqlY0tqw/kBcsFHR7caUJ4ce14ISwV6SSp9gFK6NUU1hFsY5ab7hhGx3lpd3+P1W2fedX9sTMEyf+VyNJi2ltVCSietyho+lalhGaG7iXsLKT0Z+X8MiyWNMLA/VLrCvfJEFWOlLyiiU8OnN8bDUB2vj39yZsoCERwSSwd94Q/5YUbRrI2m2AoBfVJwrLN4KZfmIr890/RCxgS6Aen3b9GLWRdgW+e9pU3VC7Q0eB+fz4NsZTGhZN378mdpDhkoLv08Zlj62wSLyqczpiJ30tAmQlraHbhzPzvHsPMyoqlnEBUAYl4ZNgYwIxiyF73OGv7dqAH041QaLCWUJPuEPYGfbCmInVVvaV4Uv+tdffkZbjI/3L3fYDdWC+J0y8sDYntHB1xdTU6V+Fvqtp8RKvJv+GpujxriqfGILiDAzA2I1B8TOC6iwVK4AITf3dHxePqs0fMaqGrG2weRd/qpihtRgF0PkEKD7SwFggiZAvRWPZ2UD+dQ0Kbn2rQPvZ4ZckWXxAHb5OGehD4haWvfEKATSe/3HCk4vPgiGdqodao1bIQBrv4FZnxeDA5al0ycmXYQgXMVr7HHxdbAV132NMVXtUz4N+mKRL7ajA0TB3HkFpkOqb7Rcitw2FbuMxdPSxhSfAay3avTMNnEN2XbnyW1sMX+swAwbL6yAO6YFLADoKpNa3rBSMfvOeRr9y0abJJOscmrlBL6chonzkMlPJexh1JaqORiHVTZ0q9yOJ45xl8rwEsCv5N+uQpgPJvO6TtDOfpVeXAXPKQ1NpUJhMvSAzTmPZx62xmWThpY45MKVrbVPYZ8bZsb9LLSjxtg1D+ta/YrND7amVFVOK4wxrgZPe2/Im8MeViZnshKHTGYxunxAFvRFMscheKjx2dSo2XAZerJUHiP3MHWFDBV1DuaIHB0pz5cl2f/3If+//Sp/sy4uyybXQbUFfvtrOn0CRtb3hoSpRzQSgw01VSMTBXjVf7DZytWZXDYQDHT5+ufm2UxpM+bR+yhsqync43k9i/Ot5Z7UBzODpdfnEcLaYFnnjFROF3pUuF3RIuF5P6+dl3blMTgsdZq3fI9KtZbkJWfkIblYubIy9qT71bZdgK22G8UIq2cNAFRxCi1CfqcDkRHWxBEbLA/+uM8S+7gI2PYKbZUzFPWukT9FMBXvybgDY5bKuFXq2NJCb1KTNTo8gLAAxOLnT/4K0kBKkJAEmjsyo/be+Ylbj/XpncmwyZyVmUCmmVE72GmMIbgpuxWsdrp1jmqwn7Rauf3yxvsvb3Q50GSqTjmBUGMGSBSM+AXoTq0vxfqlHhxplfPjXH/UgH/UgH/UgP/x1/SwAV55WSFpzgZPWd+Lex4NgKWgdmYO0Los+2VZt8b8unpWviXuIJS06CXXQiAtIHNeLNswD8wkEOE43y5lBoCU47JcRkbY5hiZMSnAydQHAEaj+E7lhjdlzEnNvDW9wH/jdtu5fdn48mVj3xunP8Pefn5Q2RK8OjiPk2lfqVvgGLOckdOkr+y2Ugp9LILv5Nvz4Dkm711CpWvKHBlVUAQlSLHejY82Is/v+uyguTaXT/tYJ4k53sEMFaHORvPI2tjOwX1GbnWf0RjwUhgeyqWWPJKzWDQrJCwcJbvvJceBeNRlZSli1nOdRnFN1UTgR0i78KirMdIq6jGuAseSHAszSR3tGnNTQlW5lAXx+ZQiI5tdASICDNk/FX8/zn5lEvuUJWlllPmaH9ca8unck2tOMfvE69ArVuP1zcoiSPzuWpbl6lQ7rlpFrw0k5k+cEOKaukGq1JU4y4SN8WJepH+RO7i8asEVUC8D7WkBtrKa1nw24LITjRYjgGnh5/3G8xlK9yqNW7txW+rGCV2JqAgbkYukGgpJKag3ar1RayhQ53IHEIva12MPcBHMC1PC3q64hF0xRG2mC8hOxRed6dE0N4vz7FRllrSNTjtkR9mzEFGc6Zm3JxrZoDS8vXESVpa1bmG9aRJzx2FkDmfzN0rW6zpb2IPMqGEApjvniP1k0jhLR5UgmTlIqeh2x8uGlQOhMefAa66POi/sEbjGwiJIuHaKxbnLpGGZ12MWzecunyzkfpDLbCTY//t1yNSp+V6rRMoQcClP1NLqzENhR5Ir5Vo/K1hNqr6+MiXTeru2B34PG/w3JvdsiN50Y6uN0qLR5O7UsrGsXRmxr7bbOxsHykCS+BXE2YP3950/Ew4MpRSkVkTfYj/WPKv0chE7xIQiyt52hgzchX/iCz/VnePtoMk7u2xssqGpKlKBnud+xTDfkdrwLebtn86OSKONRj1/wuv3aBwXQ1M53JL4WscJpMuKRIZ0EDZyfIlGhl6JbLyuSVhMPCcs7y1UgUT9C1CWQolxOZhRCitrWK65IrTlVMMbZJN9lYsiI74WEBWqBVEw4H3BOfGZRpDT4KrXsvHuPeaNh8XeprmO55hr1Mvm1/Tkogn4UgOOtJcOTL1KKKp0hvWliuL1f+648ncbTFMJaRrhXTu1xuFXRvIxyQ2SaDJlsbUNXgHMHLitsPJ43WfpLNlV10nVl188AqqVtjqMuchCysHivr8K4AL7ZX+RNg0SztSiaf/BWmxeklnJTX8VcKqZjwHhWWiOthgY4sEMbyLU2mDW8I7U8BymGJOe4bhGt0kxZZOGo5StpXdkFCBtc6okO+DoCdAIW9kD3PCZi08AFT3DIe12MpJNcsxBc2N6wfwte0svSfHaf5yCSCxA1RsbEaBdnDh4ibK1PFC6st937vc70o5gLhKKKlfCHm+x8PIPuKXtni/P71vcXX0AQpFg1ts0pm+0tFkUkWA4uK92L002uk2YgY3GDxq1v/IpZspk9ZpgHV2TXcJvFMhA0ld48o90lbQIWDLEvjYASyAJoHBt2IsFb0Tmlruzz1cuy2KvWpWrCCqMlwfYyqUwSd1FeNfP/mB2ME9Aut2YNqL5KSd7LRScvoByC39u64bKG7J8qM8oCE8bwX5hoBb+2d/nk5JBkJGTkkB/V7oPaMLHt4PjMVC7syilzdt14CWZPWGBmeCY35ByULdGebtzB+5f3sOywZ2mGyqgUmh6MlN14OpoUcaYrwaAcDEH1nX5qhLAQk/5cck5HOyiPKhyhKWD54EhLc+svCyiFhAwk5E4ZrmapFONKluuTxHqK+Va46EY5zhjw9aZB7fbKxckXz8cwuSaKyVVgkeLQ6ALVz6A+CuLYJ8t5rg7thi5InDNnSysXwhRsIrmj2PlBeEHizik/HrkWBG5WAj09pHrxidig9RY29zZ3DnT6uICj1As1SZGMOPigLIUKIO2GOZizCwOn3Wtw3YVBEv+LkRWXKxbr3t7yBnZEMlkFwkgzOUZ3r9DM7jTw6JNwwvb1JAimaKSe3Y5r9epbgEkFni7VWw8r7/ZptLzwLDZy2N8OgxzMGNoWDXM8lJHiIfqydyoW8GfhvdBkbACsTxoikTG4RlBLgk0BFGlwQW2AThOyXF5ZLMhpPigIohVrCz2TQ1/b6D4UlcXmoXaqPQ72iNFY84szITwSvcaSjc58N55y71z3IMcZzqYZTBl5WoYU8JuT9SS0Sl4WQe0LBI9MiRjhozLbikYKGRR9j3HCnR9MDNglRRf/Eh71ilhm7bWmhfIGPWhe+RrXUDcKkz/htTUbAHM2WSMBep6zZeXftQ3YcmWa6eGGgwVGNFIuXXl56T53ftXdgt23ci9orZOmWFP8usGzxne/7Is/8zw0tOk7JOozD2ewzhxr1fz5lIEUShamMMvdUktQk1LCbzHf8CYgmihmKC6iC8Z4moa6gwRfJJjy1G2VL0DaROk7vhsFKnMZG5Fi2sdHAWjRjOpbJ8aldkUUCHgO6WKYf1MsCjyD0yV2gxzR+yN749OLY1Zr045Ux7UGnlRD3lCeZF2TJTiGxBBtu1U6MGexyZ9THwBRa5IcQ45ER95BjBOmWExpk/srngT5K3Rq3OWC5ek2IZeBskBYuDGeXVYPqnM8uDtPhcM/MNcf9SAf9SAf9SA//GXycDqi3h6nVf1pSYK5DNruJX1vNQChA2WUVEVPNcQK2fmK0ITuQLlW4JvM/Ty+R5CrRYN8IvRcI3lUSrFX7mfkFbzNSMI0BfQk7Y5G9mgIs75g1BEDXM8CaWrr7jfhK9ff45671653W+0omw4rSinCvbd0W6cmYchbFRvFKsXKBygYTYVjnHZwx2z8ziPaC5XQCXH1YxGsETG4RyTMJeLFWdIrMXUMzIHge5vSDLAS6oZLBVBwSMKsqrnJj0Px3BG2kv7hG1T3I0P+6CVRq+TnnZMw15r69qx1IN5rZAqPXLerXueTUEJQ7doeCTgmBk8I9VqfrkdxGvF9/rLspfFk1lNJg/ryVzDAdoI9XPNgsitcPxA1pPuYb1dkxS+Mpam+9VAxaMh8fkSStiZAWBpmxxfr6v6sqXjahb5sjR3p5dopit2EWeuPD6pFzhfPNRiS6RiTjQZ8mw13WGE9aWSqqDCp6yacr32KQn8X0RFxacwUgkSb1+pvqMsVr9zB9qciGRuoVQ2IrPMSmVD0anMLbLCmhY2aQzvbFrZGdgMGyurHjmYV16vZ2NLmF0oktEg7mmp7qmAzLE4evznQVhxDJt6EXWsh8J1SBB/Zp8cue/6ubG9b/TBlfE0NuF8gnvDt51RPmLOzKw1hwX+NydqGz560BBzDx0owxRzmG5BAvCsRSQU0aNOtAx6lZjDPljOFBlvk3PyuBrTq2msbPRVr8pgegEpUDommdX4iVT6I1xWgpj4cjF+zYtlyb0y5CDWEclG2dBP+3A2uNdcnFJfaX5u1/e1BFHorBq5shWabewtFERb/UIphTd9QyVEGQGnNIoXrCheNlQmb6oMVartaPlgjMkpQI33PFWwohRuNG3ZN0gS3MbV7FNV9tZopVI1FIC3/QvIoPeOzhtv9T0+JzMcF0woJT63C9zyvryvRsfoCB78319h6p5/98nbslw+De8zBC4mtLIxfGAWm+jIPUEdJGtPE6eUfE7puBJk4cR5vF6L01j2w7wc2OaMTOz47nIYE3ytKxo4QmBCi1jGRXxp1igS1uQu8T6ldHyubMRCWYSltad5RXxmc9Kv2nPVKtG/TTWk9k94xRpbjqSAw/3lGlJyvBmvM8r/6Pq7SMY2NkzL9WHU7ZOCKd7q5vOyI2vJBlJpL5k9weqFF+hQXfnMzh7pyf0q9urFnEHC5zlk6OvDVdoKBFTFkv3tGQQ+JBZgiMN5J3w/WV6Io2BEg0g8MjoWQ8kWmOYzFkAzSvp0u9cArlI25h7erEXjv0mwfpo2ulZGaZTS2NqNt7c3mgq9d0rx6BSXwtv9C98+/o3jODhscMqM8K4EzL77yeTExRkdztFT0jfpfcKbQcraTMhDD6/7RwHvgVcAeAT5Ue5IKRQKW3nPPI/CfS/sbePcGlst6NAAOpLR8JwjJ0wycrUujl78BYklUfLwJOq4t8AV3fiQOHztI6DQgVHTU777ZyWBvhqAWeCFxHlenxVSdojmvmqX/7lYTKFYexdT+se4GgVTX/gZi80mSIBLea2zyQrNXgYd8bk6i4G41IJWx/VaU42y7DUys0Ss4GdHxmSeynMEePuWFomnV+Yd0BL3twTwLuaYTQ7igCAiGN9xiw2iZOheVDOVOYRjQJ+OXiAVmBrz+cjCv4MPxoiA2o+/HvziX4J5IQLV2CZX8QQLpKwJUPTw2VellnuM33qn1i2KyFq4jYPi8Js4NcH2KeGxP31CZmiIOb3kGrLyDUSCRcg6BC7rSWItQC6561Bghry8KtEglhf47V7Cl1sEnYspWq7APKHhemIOY5zUWpmzXgfKdewFrsKpoah8xN93OFvMl3bu14HHfdmynQw/idygBJ8+7Qk+KlrjAKk5ZoZWPmfWKfH7mtLYiaKfrIl+hMvLTHAtFEh7HhCm2wvc0XatjYv9Pb2hcTZkyKDk77/u/ASOnEONTzTDvOyS389ZcI1n3ZKY0QnCBcRc9Hz9YEZarHX5SlVqBMsSweqQc8xALMNOadGTV2d6ZKLMXHerCq/gzyh83IPpSasUBu91x8rJTZ+UGaZhno17947LW4ZkBtgwxC6LPLl8huPQwAhl7FYjUFZrJbD0kSHmqVzpwYIsJfbS6RZK5loxd8bIA/iwUFu4RWB1YICRbCoVvQAAIABJREFU1ThnZOPkocV9voLZ8/OrnejZqCbIOeI+miEzrI/mmsMlbE/eROleeW5PWmuULxuPvdOBXmJO4lyHSKVcm4+aXHYgyy6x8FKzjQRa4lCwJtwLPIrz8swDQgAXm8PtE4j3j75MnyhcVk6fr5X1U4A6V1Bo/psZUz9bH2dBmmvqPgZrfn1eZ6IYhqFCu3xulUHkh9zzPt76ja/f4+ufx40vtSFTAngCNv2OejaJTFB9EsKkPICrXHa+69lE0zjXecL+sJbK8PaqR1aBLe1SLpYcH3NM+hnAytS4GbVuCP7K2FKNw5toWgI5zaLNFcfEil52nJldKq+DCfBqICWZqNTPh82VZxoHIl0LfYIvLkc00zUzjzwzPuc7+E5tgznCfuLWYi+2UrAW78E3wWuM7ZF7e48qP+ZJf0fmjcpGlcGcHZ/G2VOhJw2VzP5Y4IN3XEc0L0oEX9/vDb/VVA6OaEyJxIFpKSiIg89R7GLkmdSrRlkkJEwv8tuPcv1RA/5RA/5RA/7HX9UNpFwN11X3VS8cyzpUUikmchEiEq6NH1aljFCJdgURQgVKNoCUy1J5WQgqVw80m8GLvBT/Xma99kb3fpEz1vgprvSyQK1oMn7eb7QE0Acw0k75tu+Ixdl+k4ZU53a78X5/43b/GmO4KKXsDDkRot4UWjS4xhNmQPR1Ts7+RMuNoT1qXoEZPqw8HwPJvJTjrx88Ho/8LGEzKRjiEc1O74wkHhlOT6LNsP6i6S/rRfmgZPNt4UyTTvUtm03KGGHfeuUbDr3IHQa4RK6F1FizpsT+NG3ms4hn3PL59ZrAHUbEkTqIRMYGoSxYvnCO4x7koKWEF7dwZhGJsbDqB9bzr8Arj2MpAlkNXEK9Ejdw41m2HAup/NFxYTo/wlU87cguq660xHK5nIjc5bIEfymVFEtL4En/74DIWezqKsWamj9r92svbFljxnPgqgGAsPNeE8Qrdf07sAhBW5IRhjhezrTWS3K46aUIjoyRgopfWbnxOssKqlzNal2KNnHUK2KFmmRBM8v139FUt9VSwGeojjILN5TzN5o/qNZptuElsucjXiTOSZQexOmVU55XTwBbNfJQgqyW+CtCr8KhTp9Ox+hmnOU7X247ZRpDQoFQpmLu9DKvbvyUzjhrWDcvKy0bdH05HU2pYRmbZCopFXlWihd0jAuH05mN9BlYKTOUsKHCCsJDKUpx47zIUAO3aEiYBPUw6uzIolTsZXWdPDTPXNU1FgrLzjDz19x5mZX9GJdIoU69LP3rXI2kkTZkziyKrgaH5ue3eo37SpxxY15wCSwWtD/0vNycZtkwMVorcBfmGOh4p8rO3nY2bxQKriWyhVURramAciphj1bnjaoDH52vVfnugnoQAeK8IAg7Kjdq2dAtau+lsAqSLZkJbRRttLpT6o1aK5uHgs8C9AhxhhliG3W7XfVx751pMDKORYi68pf2jnoJC72jIdnZrlbZepB45Ih1ShzEJjZnbOCr2yexEw3vmFe2GiRdkRBoXPNAwybS3PGqqO+5lmfd1/KMKQKl4mdYPVvarYoOLDF1pWCEE0S5csOfkJhCNWGK07TA+vv2ZObrNzNMX8IKMYPpuMa+3ZNUFmq0eCaDkmNtrfNpGbrOwVJZ5Xs4hsRYVSuRKWjK51iIv73+boPpvD7HiQhscU+CDZQH9VFfGUpn3jTqcf1RT4/xuNbGk7JqCaXKJT1d0lg5gbcs8ut1kD91FWMN01X0jwzd809/B0bNG+QToVJErmBJMNqU6IpbDYXSOa+Qu+EzOrYjZJlnn2zbRp0DK0qzivV4UKMWUGW/36kbnGOgbMxvRr037voLf/ryX6OYfYsG05gnb0V5e3vj//o//ivffjtxc2wGkFK0MfYKVdHS4NnjOcyTLYMmi3Uakwfnq+vo4AvUyU3Q/eB2hj3SdsDtqey+88W38Kr2GxFwXZBRMRscR0eKwZx4HYh8IGIMi4wps2BDQCwaK/S2eBQf7s4zKweb7RqU0eXdcFO6SODAs8fXkCDpesbJUDIP+xqJRuD4ZC8BIHWxceO/W3qCr2Lvs7fvj3KVGXz3fkkLYzHpEqxiSMnyp9C/UAPqK5h3lisoD3IueJZLsddc7NjFZ9i94o9J/+3g/H7y8de/ZMH7TmuNKcaX7Q0fM7JFtOMcDIJ576deFgxdo6E8p/G4wHuhPw/m2SnS8MfJ+9tPzP5AVcOL2ybneTI9MiRUBd1hPjpf7I1/t5lAOQEAquIjA8ynsfXJcRzUD9j9axRJPdi3dTbYK6VWWo+DWNFCo14BqsMLPpze4EHc71r8YpLWmZkWDi/5vl+erbZUJTboCzDwO6ygv2wMixvVMoRZDNU9x2gyrtQia4AIkjafVCXY7H2g1bHMhBtTc1NWWhaBG08eJcEXJiUPRz1BFGG/PpNzw9NPWXwd7HqyECQsYzxaAS3319NOxN/znnxirS31Ds7xdzaWf8Q1xZgeeT4A2elAdNI/7Q1XoPI6m9BfYHO0l+L7i5E8OpLkBSsPTrsDTsvsuDmTYSdCNX1lK+UaeRNFLeboo2goeACRCGpUHxeAWBFc2yt3EHg6r0w5Ij8P4KgDauEonQdhx/MnuVGm0lqjEkCb6xme2QhbvXHXb3y9bwgdMeHP/cBuz/zMP1M2x3sPFtEY+PZThGeWDaVeYdbI5KxLtv6OlhOt3zl75mX0Qp1x6Lqp0+ekDaGugkqcnrZFy3N6D4MLIJhQD5mc8+R7PZkyeZZ+KbzEhboF4eLW33B39ofw068whvF+dHimXztC74M5PrEsZbBpYd/f0C9hDfvchI+sHWbZP/F5ouCus7Klx7RbgyPG0iOpkFPOi9Cg+GVtdbHn/BU0ikEr9/z6oADTjI81CX+Aq4jj1uir2ZmHFS8aQeUSNrfL1dGSvenpge7uYbdDVLFKFLDzk+2tm77WqgQBi70IRTKFm4WNwdffwpLpl7/u/Pw9cn/+C195y0MMNWyC/mmcPMs33J3v54P/9vbnUDMlM+nfbh8cPWuU9rmZFbaSxYIIIyb09Oyf0xge4O2bnAy2AJpPgTHDxsorrTRkhA2DnIO2ZdCwCLe0uHM+HVI8VHZ6ffa1Am1XXRvELcXKyemvJm8oIRoiYUIYwNsK+M3mrNTrwMN4w48j96XMUbUvdP8r0beqlC0sJ1ZG0+kzwffJhxqHxn5w5DNr842fjhtzTu7f4a2HvbP4oJXKMf6C9A5zcvCdMSwt7mLP/MZJ50RUeO6TX37+J7bbjWM3XJWTwqyZh5agCESzIQApvcbfKT2ake44K7x94/iBLIfgjxrwjxrwjxrwf8dlwpVrBtCzi3ZgQU4U0OnoQrl+93sLRxjRRPd54RhdaxI3HcWof3OmjOdarhpwZKbfzHVnLemLvHDVnhckEkQNFfDiobB1LvD46cpbgt13a2zaKf5ke4v5eH82lC+RVaE3SuZQ+q0xzsIuhcPOUDzw4Nvjg5OGEdaoXpU+n9R2w6Vwe98DlNLIaxOdNFH2befbv/6V+ZfOrWyYxfgrpVxNWTPo4yMJQZP5zDHSBlUr5+gce/6sJEtfXrqW5i1qb4C+sVEZFmrMrUQex96itu1P4+0tQtjHe4CWz/Zb1BwiVC+X5fQzyUgzG03RhC+oh4X/slhzA8/sb/XXc54eFlylzSAImIEN6lK/LKv/tkgqAcxevYIZ+/koRKvWncnGtmzEypM5J63WS1nzI1wiAaKOy48zBm0vFlZSAiAX2UCW/AJ75d3yIvbZpz2t6/zd3wGoaQUJpAI3nt9MJdh6ftVvLKstkEvBN8tI3NLo2RQfZlSpqMZ8mkxc+0vtK5EN/1mhCZYgOIxxIB7/Xnij1kJtoSTos4dS7gHlVjlLZ9s2jmIxTghy24rg8HPVejPUIii7/5V3iwb/SaNRGdZ5fPTIf5eJy3cQoX9SqUOsFyLOlsrMTkf7ZHOhWUf7EfEWjwf2eETtXjs4PFJ1Z/BaD91wOehz8ttvEaMx5gf3GmS930r/9Pe/xt0/K/tx4/F4UH8tlCObUTPJIGb4jL0NTeW1C6qhv7T+oLaJ8+DUSVdnuiEzm+k1SKI2DarQcq4OAVHlWZ+RyQVIibgOgGpLxe7/ncLuH31tY8OA7cpETZz0U8O6mDLWugrgYbdO4g1tCi1V5OHCYpxlXjlFmk1tBE7tuDj7TSlfvmK9U44GE+YZpFZMwm4Yz8bOuOo9ZAThchZ2VRqNd3vnnqS1laNabjs6hVkGh5/8l/2XWEsvpyq41bCLZNRwFCFqR0XRpngJtfaQcFiBWF/dHRsT/IO27YCB3JJw9BNzTr40508z9sqPx4O+chb1iUs0psY5gcbN9muPrYSF63meyJjInGFvVw02GG9KOZyyFUrJjDEHUnHrVkCzIbrWwLRxV1GqQzhCzstqHoUiHRFLInPUbqYvG0/J855zULMG8UVMkTuPbIodpeYaXMK9zT32qkE0dgVmWvf1JDYtIsmqbao1EOE2XmScNW+CILWUnqvWtQvj+B9d/4sMpjOC0+33P1bspOe7chTJjfsCGfTjWqg/s4Qutp3p9YE+W6lIvtFCAG1kQR0tai7VEnRMc7O/vifX3xvFUo3k6FC8QtECtuf7PCi6ZR5TZdbJKMbIQdEsHo6JBWPZZx4BwJiY6SUjl1rY3n7il//8z3z713+hf3wgh7DtyrZrhDV6B4TNC1UFbZV7K+zlxi8//cJ9+zPP5zMKrdowLRgFl8rt1lDC8kf0oObCW8tG0YaaRfeYKIrEXpu7EMzakouMZoM2jqmR1dSMlAWGZYxZFOdPOpSQ64/gJ1FKC3kiJeyKRJBRQ5HmuUDmZNNknkgJRmUsLoad8QxWUxJXVk4FpleRvxbQCxghZX85ti62EBrMWnfEOnZ56r424PEJXP4RrlmCxXF5r7IABXh9spBPxiITBdMs4/os0iKQDpySIeiHfGqyyknRVeim1RSF5g7ngZ+F/vhGrZWHF57j4F6E+XDuGPU2mcOZprgdKPChA818lWbB7gOuuX44tNuOtsoxJ885+fXx4CcVSglmrijMc3COGnLOCf3jg2cpfPTjysp4eqfZCi+MIlNmgQ7jMZBR2Sf0HuxpQfAZYJO4MswZNtFaEBmxNtk63Au1Wzapo3BdRX7LdScOnAnOuDKorzWNsHFYLCtk8adflqImQkERmXQMyw2/DU3f3UrxsOIsMuJg6R6HS4g5oR/pKf1GsXqpYAAeHioQw0HtAmNjWRbc42/GxluRBEWWzYCGQXIwtyiUZNut5kFkbiSQXl7Kg54MiCGOzh+LvSq25YxIduFi6n76me5G9VQTXI2oeTGFRfwTpBSFWaEFaIQkWSFYwzPBZtEdsWVx5ZeKpZPMK5xHWSCEfHpWCyiM5WoBzOtwtKxukMrQ1bQAy7yhIfE7vQyePPDpPOQ7P9e3WPf1lkzoyHsppSD+DCuUWlGLMV39dZAW+aRQKHKBetM3OsJbfcNL2Os9VZIwMOntiW+VU4Xz+WDbNnQLWwfH8O6RMSORa+AKppOX0jYAQhvCkINZFKszZOuymKOAvV02bV5Gfl+oHn7j1gXrgAW7pqnT52DMgk/nEDLrgqin948AJzaj7s5RJmPlN5SBrPtCAKE+j8zrCUtds54M9KWQaHjOG/VKz0P5CsMVPeFilftlFSAJfoJ+ajD84y91xa1eCr0BJKcEWXuVc6kBncg9Ey+Zrwnmg5osvFFfRkVyzcxGzYCTxbCan1ikKFHwA1W2yMx6wD62ANTkDmlnVzyV00NQq9dB+OcjbGh6/RV35+2882gZtJqNISAznsLabmSNFFpEw21Qk+5l3C7wFn/tgUASgOTTmJ0hFxBh1JJAigH5noswLZprDWXyWuedZMzqM+eiMBNAXuo9sQyAt7ScFGFOY0qu+XjUcmY0DOxE3Ohu15jzeQd3XL6H+tuckjXY99GZI9j03WaOX7nQ0X1stLEhY9D6DZkDN0Mn2HC2lhbb9lKtjRH8cXdnjO889wBl2tsdea/IrUI5QAPQNclsmzHjbAAsT/nNw3ZMRNi8syyXLcG9zsDGj9Vg+qMG/KMG/KMG/I+/ChI12zpSZoOpIHzOcr4sbfP3qn9aH8Qu1vhg5cmsrIxoQBV7PQeAUyd1+ayqU23P2i9B9fLa9booN/Pf7Rnzk6qqzpeyUcyi8ZTE0SAMDVxCEWQS6hI82P7nOFAKH9nw2WanKPSn4VuASVsxpG1I2zj9YEjnnE+2BOrMoNSoZ/a3Ehb/4tzbja1uyKjImIkthB2QzMjciL3b4YRxDISB7wH2DZv0Oa7PCet9r9p7EY0LurKWdal9NWvZiU6laGPfd95vlds96mbdgrzSMMrM2rbAYOEfWz7TaBzW2iKjLGuXQc0C23ANu7+a2dIruxv4BK4rasrK5Km5VndL95tPmBTOZRmNw8z8zjn75ULZ5j32ap/0smxg//FXsXR2yDfaM+/R3PA816gpkpXLlARVTeN84Ot1ci4lQazXTxl1Ai2B9l7q7/524IxykdpXg6u4oZ5kEoOxyBrJwtcZ+6xI1JrjqtdSvTg1Mx0D14vcGrkAVRVHxpl/q77y+mo0P7t1Wrkx0q7LtDNc2PWdRcCrVsN5sRSGCK2mZZUHXtqnUR12i8Z0rMqBozlB8kBCGeS+bLUcz8acjMD5LPE9gCrKps69Kd9Gp8ng43kg+gYmWOXCYmWt72pXM11ckRLqoj4eiM5oOuTtCyvHmNOaLiG7f2UzYZpQT09c1mEEne7744Bl8aeKlz1qNwailVOetFtBS2HUIGkYoOv85Efsn+KJw5bAO6+RoszlEiFwk9daH6rNH2ufAq58w0NXlnO/CAqXAgmQ1TllOS1EHWfuUHtivo6bJIHiUya0vYQVohtuRmkVduVIEqn7ZAyj1wracHbUgxhTtyT0z0mpuc56ZZvvzDm5yQe7FOaELhNVp1XH66AzUI/mf62v+XO/318EWin4yh3SwDWqKM4dJmzVqBnxcrmGFSJ3iaiHffQYCw61tCB6PKM+u5UvvF2uVydSDS/OqSdzTuxxgobS3luBjx6W0KUyLdTu3TVIxN25bcKoHntIAcuIAoAi59VQl7Hq+fLJmjFzzTyeZTibeO7hgrBIl37VF45d5+h8oIhkozYv1TxHAudscS5zwGcqlxdGASrLPnmNpRc5be1TEApFJNaXWVPRrwo5tlYOuXrkTP3Prr9v9i9G4XltwC/mAizpvcmg5MSwCwQzXENJErLuzK9IBgh6Uiw+cPUBCfgtywsIUEJVoyOS0sixCm+PUOe4QSWFzrCsgXRqMlig1whNVVFahpxONpARoV02uVOpXq6mkRGyVy0FnwPdNkRCYmmzc1osuEuCXtvOl59+5lb+G4cNtmrsrdCKoFW4aYBnixEv6lA6E+Gnr//Mzz//K4/Hg1+/ffD+y58QN95d2LVy2zbeNbqu3/qBt9jsN2nQnWYkvxDE7q/GygLBXNhmFLviEXgeHdUZMt25ZeGsTFdQx3Lyx8FUKHMLq0H/YIWxF0KmuREH+rUAzE8HtvCQDa95pMDUkNzajFBGooH12uw8m4keQXXA1Hjd6OCnnZAIsjrzq+8vYT8z/VX8xfjjxdj7Qa46YRS9DjXjml8vP2eZe7b2XlZZ03tMepGQ017+7UAW++u5qyuah5ilKuun8DiFbtCP8Lcd3bEWh4NjdOQIWe6+KX12bHamzBw/SpO0BZHIJnN3nj0+R9dJ04a6svkC1/xiHokHI8G0ItUuePHuFft2cPz7r4xblHimcYhzd+7cGHNQPjFQpoaCYzApuZgPhGZhVTQk5J7mkS1xzHVfXgv/vpjgn6Sfr8DFAcsWDE35vV5AlmSnP+58eMGu0RiM1jyQaoaJetqe1YlLMFu3ZLRNzUMZMWpFIp/MJOwYkCds75iEhD5AiAEp2XWAVFWsZ4IXigfAMS3snpIfBqS6Zp3xXDjKi1FvFhk/urJEvEaeBrlv4VTjygP5YS4ZuRaUT+UYgFKJw3PTgfHa8GEZDiVTjYGx5MF5P0pBrCbYG8ob4GrKmNh1EJriF3toMYeGleUGxVkmPYPNV+9cBdoVOKyMZbeXa+lp47KHt8WogfDQngGgLaZdaRvKjdIaewuVsGjsk+IC5R5WJAJ/uv9nvn37Fk38bMwPiWZBadtVOE0UHdC0YNLTCkZwHxdRRFzZ242b7Zw+cCuo3QL7MGP6DbRhLtEYk3hlv8BgiFN4WHGd7kztCcxBJywZjM4pnhYTgvVguOnY8TnxbxX7Xmjths3JnFFI9lyjIvR0kVsM2kT3Cm/ADawdeH1eXu0jwTYDBINibCMeXOFAl8yfBUi9irfJTKV2HgBIRbWtOkehJ3CusYCU0n6nVvtHXwNNn+kcwP7K01yBplXqq+6wVYs5kn7v26cC+crGQK/fmdqvejIs0KDYQa+ZqTl3XNJGhpLKgB2VDZUtmkoWAJQS3u7qb5DWwhj81GN9HBJK9XH/xvcWxf5jjshFIPYmAPcbUwPUNyyETVpYnvMREJ0fVZbqzmEoxVs0rDU81k9R3krM0WUzvcZEfNZCwbAxMNVrLq87BeDWonaVg76aebl/RXZG7NHDInNOIMhHGk0yN8fnZLhzqsQcTvvJ4SdejrBeBorEocjzOQvGlAg9724J94CPWMfaUbkdccjcLTJ7PElLYBwYs2wMDUV92OEZzxEH14fDX/w7P98q8jaxG/Q26Q3CBrNTfA87HXXGqucyK8+tXDUG1LDUIw7n655oeZ0tfoTrjxrwjxrwjxrwP/7Si8SSz3ApwwUsG6+eKUuwMgjiir1JwOplsXe5VSZ5ifUK+vszpboyUvrVJiyi5cWmyLoj7I7HRTxZBJMg4eZ+WKDPrAsy2Hz317icJfbK1hq7R4N2coZi1oWpN8QHRQvmhT6Mxsv1Y/gNb0/q20bdK8c4guhTKpRK3e8U3WmtcVPnOA6GG7dS2Erl//yn/8S//N//gkyBGVaTVSrGREqjWEmVtjKHYD3XNNvANpzOXGd+8bQnBOayBXyB5ToKbRYYkQFaa2P3ylbChq5sxn4vgND2/F0FrRIZaxhmI/GX+DttFGhbZKCaciab+/Uwt8jIE0UMSs82Y77NUirTVz7PjTnizfZkQKvJNdZAsWXZqmsNreye9odSrzFyWT/L4HJZ+AGuWZ/UXq4MuogYdZCNkhZoiFHR13h3zybty+rv/LS+xM8oI1XU6vapGfxqvlrJpn7eTzNjk5XPThAWAPcTTRwy3oMHiSObYlZgKUeFHUE45OOqQasoNdUGlx2tlTgvZB216l3L8eJC5mUao6RiWjZMFNVCtZJ5bLF3qBOWlFuOfU9QXIM0UZELH7TMkW26B7knyXdSAsccy99UljWtMTzORUOUfbvz5ctXPqzzvt/4N/kLY5yMceK6I9tyi3qd31YGX0HADoqE8teoSKkMNqZPunVqqsNXg1CHUc6NNmK/2lLN8kj7smmDWWJ+H0OprLNlQ7Wx7QVvJ8M9LPuIZpLkGcB6rtkCwws1x8c6KxUDYxH30p7dIyfRRQPvtB+sySQnU3nl2no04EwHl52fcDUbrLzqEyXdnlw513lgzU8rLBKjzJ5EK7mUOrNWyl6Y3ycPGbxhsVdQmV5oc1IIrN7PQW0brbTAMAaU8OdHXdjmT7ydv0W9UONsVaXifbBtG+9vP3MvX1BRtpUF1fVai2FD1/vPtSFoUzlXrcZ5hHB+UJeYx4k5V2tpkeqYB4l2DkGqM8bg5sr/y96b9UiSJHl+PxFVNXOPiMyq7p6bXC64AAnw+3+YeSOBAYczO9zpqzIj3E1VRfggouae0739QPSi86Gs0cisSA9zO/SQ43/AoLUWuV3GKy96offOh32lGlhpfH3/DbPuiKT0W3SeMN1RKZStJ8BO6WdTxU7pzOEhdRt7TY5Pnykl6RRpkHtRccEtQEFiyXJFEwj2NC9FObLvsVvuoUStPOLGBEcnKFMYcZ4F0HQN9jWhRkLGhmot41rBs38S3oAR230ki1SlJMAlrlms5dqf+bI8SVP+keNP7mIuI/Vk18bXzoV/6CokHJAJcV2foz9+xzbOPUVvK13mKaY4L/CBATNkKtOSunoiGh6ojn4GgAaLrkz6SDDRlGoJdGfeDxXzySydmQwaF8O3C10rlrq4Zhp+0japTXA1hvdAESlggdjQp8ZK3Tfap8+Mr++oX2iXRtkKVQtjaa5KNGWk3AOFOYRPlzf+5odf8Ot/+a+4CS+lcNk2LvvG5bLxWjdkE47joOsHvu3sG/wqAdOHeXa8+SbotXy1B5WXNPgN2ZbUac3n3stgFVeraCLw/SxuOg/dxjjnQjmkv4k+JTxazt9bhwLVWwT6AlIjSTGPBErEH3RBb4g5KnIWCWKjSPqm+zkGwhNBgXmizeLz8WdLZMVR9DRw/F6OWeWbh6RPHWBZ0oZZLBfhnCunngJPHWZ5Otc3chWGeBqlsgPhQ2aH0KTS1LjXzhyDOQmtTSamymBw743jGBRtfEgs1m4TSqPICtQqfUmXuNO8ssvG2/bK796/JH0Sbt2hD173C8WENjeU8FwIpkPO/8N405DaOUY9dUgFpZUwP+82z0TNJRbintrKKi8cPrnUSKd6FnWnDuyUzEy0GSz1WtICBeD04CAxjp6Lf3K603wxq3Oejc/V/Yf0riE200QbVPybxqdboMvnmVBkkUIEUnPYykEZWyJgBWSZpK8CaKyX8ZvBzoj1LgvVMp+azSHRts4PgXpoaVbtksVTj3XdxYORsIbVs3a2hw53gA++H51wCCR9yLeuAtJCtBWQI7V7HT092fLp2TyZtOJpoCmPBpV6MDYB1J6MbU8ZWKEvOb7yQayH8Nh4HsmtoBQxipQzqR3zsZ+Zlsd7S2+mTefpLaOuj+DRFXGnlIYk+kcdWilcWsh3IUJZAUYpCAc92QAa8B65AAAgAElEQVQvUpG68xv/OBP66cKUDvURNKjG3m/UbBAtpGmQM3BFD2ezQrMN6VA0CmdtKpXGVsK/sGoUAzwBAetYvDHXnSmGqZ+MYjPDiz3WQThRNFtWgrZ+jf3k8CyaxrvqLphWZvWUdj3iueV3To3Au10KUh0vt5DRsAFqiUQlGx+B/j6Nw3lI8egpOzS/KSqRaPlcPqIpdgZEAnX5ZQm1CWZ3Hq6vf/lDk9u39mjTW/7czyB6FVSjuJPNNy9n0yZOsMbTY2zzXNBNg/O1x5lHoB1GpQfmIYHoUSnAtGH2wqQxPcZmnxIyKLn2VvQxj0fIJwxJ6YQ5eB09mo9Xy71WmHV958DYsGloWZ4s4KvwZ3nnZpQEUM05UY1inegLtGjMwGDWC56+UmcDIQs1Ed9k29sHrk8Ib2JPCabPQKRSV9xpTwWP0wOgU9LU9u4O09hRumRjYgbiD4vCW8j8GIdGwjp9MNNmrMwZCZKQa5GE70KPAstuEtfdndKVgoYO+DywOZji4UNGZdaviEzoxvTBfdy5e3jhHNXoTfHrxvZ6QXZjykFP+ZZAYGbxCD3X6lMa+qn4hAzEQhJadWQBZlL75f/P8P8fdvwcA/4cA/4cA/75j5lSZ4ultQ71R264GJHAeX9l1nNuKUadj/hHRMInGs76x9OZ889+fvYuHkLLAjURvzoEtpbf9yRxmnt9ACcXSKM+NTyi8TRqQXu+6ad3USyAU0zBvEaBbU5qSic+zlOwLLa7RhHwul3Ztytfv3wEI8g22qhsLhSvXOqVKsYsgh0Hs4HXwlZ3LpdLyFRSKK5UwpPBZ9yLq0AJnZSJJ3JamNNRe0WWjLDLaWKuCS5FBRmXLBBDmQ2bsKUMZiHk0IQszo+IbXua3U9R3EPWf0nRLkYJQK0aQDC3fOaGebzJAPtstFkDgKHHyR57xC52NshsKpwm6EsCrj7maASa57yNebPqWHHfNQfmw6OronLjezncPdhBy4dzvTt5ng9Zo+Exz76RjsDiefPUZPJy7k/PcMATrMNi9T22N81mQRRp9WkeHcxUHpA1p6ycjebnImjUJ4UlEQxgmnsyIBkjisb8PedQ5l1qAWQaXPBa8BoyeC4W/m7TAuCuq4hmuBZEC0KAlDRlXykjxr1NMI+is0YhOFSKOkWNQij9GKlckezZ4tHIqa5IaTmirtQCL9cfeZ03Silc2NNnvaGtnrXW9azmCDUkACnKnEc0q+YdGZPOYM5Q4NhcuEvsrJeMq7YJu02qCrsWeAKV9d6xkv63ZvhQzGIuD+/A5KqN3/jXALn4ZHBkvNrP5rBlXFRSghQeqlkBLepZpwx5ZgFMMg+ele/Ni32mutPptTw9C/wFXzVV7ME4PnPMdQYnJtmaB7mOalidxHc0POujzSViZXVKa5TWIg+3QSlC71HL1eJYnQliAtlWbpHgjcUadEe6sqdtiSQIydoP1NK4bld+cXmlSTR0F3NQwgAv91WQVRtZ64I5mvGdPK0XUkuCRkEyBon7VFQETQ9N1ZBgV6nUrQbTHGizMVJ9RkvUTQA4Yv2e4xWd4d10m51p0ag0/aDUFjux9PBgyjV9iJy1dsPDk1kEXc8nuhGQ4NKgbMgZxseeUc4FboVcy7uzZA4rInQeDCRDg1UmG0I26Sexxk6Lcc8qxud7yWa347gGoKyoMVJtDH+AUM4xmmvqzD2ylGg8lZGy7zqyh/DHjz/ZYOo1Em31lDhzyZtvbCsh8g2XjxiMKxiVDV9ydBiTCLJLLmrVlYV8Lvb8jWdJ70z4LVp5OdgSKSIPilagkSeo0GYOSH9DZyy8WjwC7jRnrAjVttAWd2dW6NyQzTC+xHfqBXJB1nqJBNmEcZvApFSDUZBSaMdOofN6+cSPP/6Sf/u3/8ZWLtQaL7i0jVo3SinsxMYyzJA0SvzF50/8l//8X/in/+ufeB/Gvv+S6/WFt+vG29sbzQfixqUZL5cr7/VLPIPtYIzBxg30FhNXjUPzvmcs4PuobD3QBtf3CzpD+1JOVpWeXdcpnVoAMaaGyXrng6EtixkHtnS8JSe+NUpOtl5CVhCJDmsRoY09FxBH/JVxBhdRVCHRmTHA3ylS89yJjDM/x52LMHVLFFgMnOs0aiI+cOUjf+/I8bUWou/pGFQCr7JQtYk8VA9jcpyhGyEf+DThTwQeIIbag34OgVge+jCdXcXPHQ3D0zH4GJ37vAOKzdjEfSrdnJImjuZ3XA80adLcJmrOmJV7c0pxVDqvry3ec/qsXK9XfrX/il++Xfmnf/5/+Jff/I5t27h6JCR45dNlo7x+QudXvsyD6/XK3H+BmfGv//WG7o23tzfk80RS1mehxawLbWwc947fKtadcThHz0Jfi+LcZFDYcS5MU7rXKGIKUFPWZD6hJHBIfeUeP4jNQzNB83oWgM6AtgRK1+PjsQ5FBTnfaKfYYxN6UGNBVFHbmLoWfjmboEtFQVxyfwgUaZslLyw3mAKaRfybh1wBDi3Xyt220/DPbaFdQmc22B9Gr4mi8+0slOxZuHTvZ/DW9RbMDndMHtKW39tRcWSuoIuzUD+YKekK+PbwaGKxWhrVMkhTuKw8/5TQC4khIBrb+VzqSBkPnLH8mHzjkChsLi8HatCcH4FSzUAonmETP5FYbtE0ipPFd24qbIvir8CSiBMFhbe9Ut2ptSI3w7bJ7INaN2prtDZZEmImEoHmBLbO6/WF3/WDu32NeaGw18Y8OpKFtsOcIo75pGiihczwGXPDzSj6iuL8aO/I13fKreC3V5q9BZX+tmHWIqjJebEkzOacCVQAa50yBe+Dwz+i4O2DmsyYWgazDsyd2i9nglPfN8btxuVDGSMZDDKYc0m19myIVMbS4NdB3wdenYPBXnas7hFvZFBXVgLKET83hwSibLLRF6oxEUXFXs9ExkpHLIJb0wzCe6MtZ2MZ2JI7Y8siZfme+kuhD+4WQFv3s9E5JHB0gcwK2Sl3IuAVAeop16t2P3XEfRmkTjuLMPokZ7vYZdGu2B8NIgkf0LGBt8L9Mvj9r3/P58tn5NgZ3di2DZmGFknprZqAI+cif4WZ8cl/oPfO5fbK5YdfA/Bv/lv+3+sBDh9uqECnBXMAAztoS5YsdeinKLBBiXqREMg+tRpSFV7Z0j9FFa49GFbPSW5Jnyrm/k3C79Yj3rFyIg/VnBbiDVEwT9+VONFkpCZ2dEuXBEzGyD7RabmXHhzLP9Rz95pO9XsmRImiNeeGMachpuwjJKXfvm7cx2TbKkVTeeAnB0JxoM+O2gjg0LzF3zlQqfEgGowp1BJITTNDX260T85f/efPlB8H7/tXAFquc5OYh9HqfUiVLeR7XXoRAmpwZIxcs0hZfGP/zvT3f44Bf44Bf44B//yH0EDH6VO2iv6jCprlDnVhG2t/j99z7DQPnxJ+EAB+Pj9/KGVYyOPGuRYTqkD+XYSseQgkwFa8omMV/eT0BK2ZW2uyYFcjwlg+J8lodcMzBhQRWv2BVmF+fERM5VeKREOnuSD9iHiQGBNlCFsuNbXC9aXxV3/9I7/91W/59W/+DXWlbY3L5cLW3nhpn9GpvDTYW8PrpG6BBP8//vf/jfcx+cd//Efev97467+5UupORWmys+01vC1247CvyJwUCj/NWwCGU5Ypai12voM2Yr+btlHSO+XSX2j3KCpfssDZPES6RGB83NF9i/mbccTH/Hc+Lj/h7twb2CiIPtxVw3N6MW8GNWUeSxawSpqpQzQTBu/xjFcDxTgb7Opg1s5xA6Bs5/rhswD3rF/9nsXO8vwdXE8/L7VUPlAJ8MB3cgyx6H5l7LbAduYeksGA+Su2Gk8rnJMHKy+Uhx9rJQDFznijPjWLHnNXWMCSIX6CCiyL6T7DvwfAJZo3z8AcUTtl0p2QXoPoM5pFLrNqkqrg+QLdFJFCGQ8wguhEasZrqslq71h9xWpllMKQQqkVZg0glDRqzfkrA7xjc0QhHgVxfIKZs+tGlfDKvUiAezag+IZO5X7/yq9efkA8pLA2tnOvkSqobpgYtVZ62ZDWuPxi528+/4reO6+/+2f6Ubj2O9NB9uWVGo3WiDnTg2wUvA/YlLtNtq1w58BfF1yj01KCss2ox136C3U0Ko3XqthIb6r7pLHxk93C3sNCtSLyKZKpZfRdKPqBilLKEeAI4F4WsNJOwFrJxvEqtEcseJwsw+F+evou6W3FaN+ZnOtDZTVBdSeoM5Q6IGrli611/h4rtpNkM3EqegCxby8Ll7VpEWPY3bltg6M5+y8Lfut8zA+OcvAmBbSg+pnNNIkhwpwd94m2Si01PIo0mvmvcmHvfxVz9Gtc//96/Qfq31+5Xq8R4d4Wm4yIMVbz2KFRwCIe8ZRYFQgpNgGvHpKOCQKSoqh7+P8S+33ihrGUBA/1s7gXAJmpzqKdotdv1oiXraIt6vKvL39F7++pchZz4d06ts/YSwv8dvsNIsLHfskY8uvpvVdKeA46j9xFcDTBKjPjSPzRMBffTuaiCwz6Nw03gYwhl7xexGuTuD/nhjADxDQ9lM2AI1lTA2OmT2hxDyUIgSkHbk5nZt8mJZWTrNLOoShYAh4NS7CVMOv7ORpdH8Sf/3j8yV2sjS1NZhWz6OwHovAAT0Sg3GIRzosMyQpnTZopDz3kFZCOMtKQbE2cRb2Nfy+zRqffI53UubwKFgLHTz3raFHEuQ71bGR9UGaYDWpEzetrzmNJGmlpqbc7spsfchJINGWm9TBt98CYujvt3pC5aOGgTPa98fL2wn7dKYdTrUQgJDW1ex0r+XmpoIui6pRd2F8bt5twv9+jUFI+Mb1w0UCdl1IoVTgsNbl9R0zxRI0C3ItGwOuB5ETCrGufjd472i0kBAymxMbd5CUkHyBNXk8cCmAhwWSBkxvs4VdgFuhzj2DskPVL90i43MFP4vtJXVU6ZebERFP98IgN2wz3na32lGd4yHysplSZG9XviAXyyDIgm15ACmqTLYOMj2QUuIdW/Pd0iDXgoZmu5zS8oyOTSLXTzLovP7gnnfARpi3/4cwrXeakeZ//ooqmvMdwY9QHCsZ0nMFG74kMOWC/OFoGSCRf9/FB/4giQmuFa90xbdwtED+7GZNGazufP7/x337zO3ROpEigaDblc91DS3srXFoJ/5MSRWHxf+frT1/49PoGriH9qKBHSjxqC/TecLzfGRbIoYM7hlG6YNWZfXI5nrxeLJ3ERFhosq5OnYF0Fp3R3cdRic9FAa+dvhbkGK6r6KXQl746HsGtygmUqh4JIzhbFiRjvQukunMPDWsPKTaTpa8cCEQtcqJ4QvZnBVoP1JWbJ30fxK95Lmc6iSqIZq/xSLRxD5jEHDSPouEtJn+iI8LgUdQDUeVOs8K9rOVzoWhCouJ7OkbSek92a86BYpxZT7HBfenZ/xFEU1nRGws5D/AIbp+71aMkTduFlkGElcd+VzLyEZunNKl46Mm782T8zINBxNKqJiRLiAKrPXUd9lUE9kh0pzpT7qgaXUJPuT3VU41Kqcm0UYJJCxQuOM4mG9uI6sO9GnN4+PtlAVymMVNSVT32YRWYfDzu2wUR5U0+o72GTIpXbESfbE6ntQ1BU64iED1jrHeQDDAP/W1143YMxvWge8eX5IiH4TnAsJ1iUWArtzv7mIE4zKbS4QNLpJ3Y0pI+zkLSrQ78qlAVeWl0yb3EFxvCaGOhk5K5Y1FMFwk/HUbsQ6ekjnVmSncVHmyvNlMymO1EfYdMeSDQ5wJmuPF97VahbV9XUXPNjbzKTBWoKaVktuHANsu5Zk0J5K5kMyNkSApjFSckTemfUPyu49R3N6tIxohW0s9hb5gY7/d3fjU/wwx2hpcovHpTVJfcWGO2FpIbM9gNL/bOjx8BtrlfBh/jC2bGkWisKDLeYv9xhTkTcRca+dqg5EtvPkKiw5xjLkZCPaUp1nwOwFM8v/jdLLDIgc6UwCsV0SWVEtc/cWx6Mr4DIYcFulpEYNRTBggq/R5sDiEausOFPiIhGNKZ3Jk2T08I9R76DhAJknsUYKbiwyD17k90/H3A/fFZvSlFjVqVgQc6XcCWf5oKxTawiQ2laInEqzqzGz+8feLl765cXgof9U5be9xCwXplqXkNFy4LiV8eyZAtln2O05DJindifmDfT70O+DkG/DkG/DkG/B9ySKzFvS4FldxTgHWtKz6LAkzuN66IWxaz5+OuTl+Pg5qLyBQ5/72d6iE8AWcMq9loSgBJsX4i1YNZmA2uYwFvNUEoRvGRnkxG1ShSDYFRvuY9fWaOd1Q6sxiuMO2OyhXDGcWpVRjq6d1W6Hdj7Gk74MpNjLkV9s9X9s9X5L0gpaF1C0ZuM8pWeSnheTjGDa3BrGq18PmHF5BgNVRtbHVn041WG6+1oDLpvbP5ztxeuVwufHnpOdZuAbTIpuryTRa2KGAVYZ8xV1p36rEAYVGdUNXT97kY0A2tSs8Y/5iCRSUz9s6Uu8NWzepALOSBhjw8UW0uBgyUZA1MPRjTGOY0zQZYMepiyJlTEkF+pOy/up81D5E7jjKzViISsqXzlCOzU5Z3larKFOZ3NK2qK13SMdP9BDzsZifrqtkjl1rrVHU/49+ntCqK4qpcpnJoNOVNnoAUmZ9UIxszAZSoMrOJuywV7iylremNavZNDFmmnQh8I8BzUTMMV3Gzx/7pXhKcGJJluoqqmSPe0zMRgT5WU0oR7Yh2CsGkCI9dDZm85Y3uoXox8/unz3iWJpTjAnNylStbyhx3c3ZpOb6jhVC2nbbHWt2kUJskWD2uZdu2GNMSjdT7cIoXXvWOtY32V/+Jj/eYf/W600pI8B005oz1fjKw9b8RP/mgc7937m3S2wwVDNuiQepOnZeQ6JwTSeZlUcE0/DPXmoqWAGAo6bmTgKYyQUJSzLUyAReosjPnPJWIBvJoEImwjZLvMnMIzRwKMLWHPyoLEKIn0+R7O8Z8eNQDIHZKJxcLmfb4e/xp1bBk0+3TsCIUVYoF+M2thgoLgD5ytz6DVbulHKWZYnvKtEnEB+6R684Z8VrI8gVZYnBEbOAVt5FN88ZVPuPm7ItVVjZU95AuZ5wx61KWcRnoCsjthkkL1SqivxBgWIi2sHwTt7gZUydLIk54SBbHR4IjdPK6hz2AeKKJ3nmcc9rOlAEWsXCtr5lnBSt2L5FTqip2vXGXK8dxsCVgr5ZC8Y98bRP/lraZwMHMs2bKaC6QQeYpY9XP9T1ARbkvAAStJtlsCZYzM8pSEnFONnZXR3MNCCWDiDWrea7binkwE5kXcEftKyyVAJlPhJ/8fttOkO0UY0oSh3J4HZo56X/n+JMzTr3B9FOuzB8tV5aRnhPMEREJWj0rCH18qS+2iy8EQmXQn4p1WQhcA0Vjgrk7KpadWWesplW0KyNOXsZ0QlCtPV6qJxJvm/pI4jIhDhTW6jBa+ChIGKKKCD4K1IGoBgo3dUCXoZ64Yt1oW+Nad770G2JOrRut7dzfe5jmFce941l8s5yACg+TrXKnqfDjpzd+9/57Zjd8xr/3W2fuyl6WXqLyUd7y2t8pRRGvHCdyY6SETHgriQibF5oHwlfvLQz6PFD3ZpND38GXnGAYv23bhnrFXUIkYiFTiOYePh/Iv9WWBqZaLlKPYqjpfhZXg7YX793lCG8QwOzINGxikhvR2pyz6LbGHFlgWXqi39KkK5Mw2NVECLkJZv/9Dutf5JAjA661Ca75VU6kd7GHFMwfQwpWf5phqxAuBwsFN6TTsoA009Bu9A/k/cack5dx4Z6NPckNZisDRDE1hhs/XF653W7M1O+fOXdEhFpe0OtOEcHvRu+dQqGZ8ePrZ4TCP//LvyJMagMtxuVyoW01jNltPynpX+VOrfBC5d/ef+L29Qv2w4ZnIXZks1CpTBdux+ByFNwqNqNRqQh9hmEfc9B9w5NBolJxDVPEGVyDWMifpNIejVE9qbkjk4CJoom4mylPJPiZcB7P8hmJbOtitESNhpmjYRaocxFJeU1AoEwHiXl55Pw5PO5XNZOTaScaH0ja78TEkvFwI5bO7VyLIQsr8nAdKieFNgy6T+PEDOTL03MYMjPyIHRieZZx6P+BffqXP3o2LhYS92F6/dDX7mWcDKaS8+PQkASJZ6vns16InwBBrUTkDFdoMyMDkbOpJT4piV4VS68gS91gJ4OckErV9I0QtbOQM+vzXF+JWnx+ff+RHkq3GkHOWxHYa3hbJPJ1rYlhzhkshlJK7mnxLNS2lFdoNMm1wPU0GR8lJYWYFOtUhDIfzKtqciZRlmyGX2yfuZYIwuZNGMNwF65tp6aeus+V6C1HP9D58JDpPpmzYZcbzAxQZSH8Oefd5qE3PedklwvYnY2CabB7izk202x5jCyewUx5QtkmUgrbfuFDn/wfLa65WOWUnLIlEZeBfymoj2T0+OnBFPNDMzaRR1KwYhwZLKRzRbiv2ORZ+uocYd/DYdSp0UATOQNjV3nyp9AzltO1ZpeD8geIwQegaCiPpu0pIQBLsiOex5IBMYQAMdlq+pSdXox7f+f377/jU309r3cVh80iSRKJNAQBL3sCaz5xzSD9dVzY9QN3pXjKxrWHYHOdT4WL4x5sGmmoB3O/8Ur1wsftoBx7IFbNOUrINVwW+0mEMtb19EjmzBCv9IxRzO0sasryJ7M0cpZHMdrFo0HkMPtxxrXqqRMOYe7eO2CY33LO3fgoPRC4wxId/4ix9CwWGGqR1NZSgnmGcNVP2RgeHMctvycQvXNOCjUSWQBe4nusss9YX77aQXXnpV35SYIZ9vLLK/rXhVph+mAp0C8pwOKPZkkRpdeH14WIcFMHDTYkpYQPmijIoI9IqGT+IZjgL3r8HAP+HAP+HAP+2Q+TEcCdJbWahSgE2kLfPrNDVlGywAMU+9j3y5Os4aP8MU6Wcc9YqY7Y05AFGNLMQ7NRUdZzdtwHC4k8smlR55Viwa46FETS9yUlFvu8UcbyJR54eeE+DdUw8L54MBRLKZk7ByjYJRo298M4xmTfaxTz7aBV5fL6Rt0v6NF42S/RRKlG1cJ1vzDtgBbN0+KCmmLF2a8XtsvObUzqZYdaqEUpVdi2SjVFhtFK5dBKc+FNd6ZPjvmRUs8xhs9ilTiiwmbKZUYBuXmjWIBSq0XcpmVbeAiqyLn3rfOQ82EV8g5fDaUlE72f8XFhhDSyO2MBWkhZLUIVAZ+4hXxsKYWq21m0nN5B6/ldAQgpkBJ3VgyfSwkBwEPyzGKwOEJN8Mpc40+fah7fxWEBlF4SXUvx5okh9AzgWNDi45QQ91zn4udKSLcOmUQJcsGUMoaZDyZSSdZnMZDcy9a7rU/lS8WZORbK+bn6UAvwyjiLtjP2OHnaU33S1n8viWLnXB+KPQw6St5X9w+2+plWauRtM2SHpymlBPJ/suEo4jOeX66rbgIaHnvuwku78vmIRmUbd/RQyj28BGsVXl7DP33LWKxmA2pfigAejcrYTgqX2RhTgkHnzuvLhVYDeOQCKkothWPcQza8BFPGMMa0ADDNSZ83eu/4W2U0x4sztpA5m1lkV1X2WWishlKllco4erD2gaYhazsnjDFpJZSQpgY7xPRgJJDe0FByExj/QSoMIkaa6buz/GOeJbejbpmHFKJ27Mz6fXmxryZLCzTW2SgQ9MyDrMiZ+5/7rhXKikUkAfQGXcERUM69ApQj5eVX/DBK1FxFDK0lPFHFsDERh8HBVmqQM7KhATBHwaaAfKAS7PpNOtvlU8zbFRfZQdsUs8mkURIUeDJIDUquJUODDOE4Dx/euN9Quhgs77S1/0rW/i19Xj278aohG6eueOYLQyZzxQATJOviksCJgJLkeqMEs67U8OtKEEKt4YPaES7lBuKYloAHykOkeIqC929qTxF7pIqKF4R7Ako9m0qCysrdFJaPXKZQw2JGmztNoPiNoiC55/VThllwKdznjVZbNuzBbZ6S/tVDNQaLvokIMC84d5aPcNdHvANQ9OOsXbgLcr7jPWtD/fSm+2PHn2wwlVmim7wCgOWFpDfGWQQxqkQDSOaaMPO8wKkDT3RcmRUs5OwqSYcTfzCDslVr5YEOR0bQz3OwuAf6rhFU3TJA0jzuyIE8p1ESBRqs17jWJWczyuSy7sknV17RcuWe5n+71CzqKaZK3UPb+JqBe3tt1JfBp7dPfLlcqR5GmPeL8vlt4/hyR6XjdmP4ndstdFDftkBbD60UiwBkzo62yt/8/d/xT7/+N772X3NFee/Ctm0cvFJnGESbVl78FRPjB/3E7bix9Y3tkokJgfRYSQaA247fDb8b6tAtm3wdzIThN6beEhVUUWm4Db5wBEKYyUe9sxhmIlD1gaSccHaDfU5mGiC2JUewoDgOJu9IWQ0+UhoJdFzDoLumGTWW3XKn0CIIFIlxJpMwtw6E+PT9THImoQUdYygRrfr+CDy/l0NGjK3zB3r+mcQwUFiapuXUnn2wM9qolKUDfRZcDDwLpa4nCsut4AatVu7DmdP5yhHVJIW9OLWG4fHL/srLywsvb8p+3bjfO/z2d8wxcZvIfMWOhhel9bfo8reQmdIpbC8xF/+nfedfXv6Br1+/0kul1sZl+xFrMEpFL1F8MzNeNfT9fzkaXygcv/2J8XrBf5RE3T4KrvteeHu7cL3Ddji9T66jheHtyw/cPMbKLy7/wL3cKFqYTH7q6cmVNOTDjbGKC944pYHKnUkghtWC/WAu7FwyyQ40/qy3J9PWHJs85oVJCXkGM3T2KBqUWO9KKcg8aOnjhsb3A+y8hJm1KuQaqH4ga5PKJHUmrThYJdATymVZuJhURL5gWDAw83AuZwNCPBAiQ8eJ/jmyyV6noqlXO2WeRZXh6W8h9Uyev5dj+kSx06B+bW7FImCTVbhb803WGiYY9wxgFZ7Q3EjIpbgtFIlGQEgmgrmvuS/5mEC1wEKHB4KfbOZY3SnJ2pmZyHjhlKOTQDB806T/kENbzAgAACAASURBVHck/Q9bH3jqI08vjDGw6yvzJRDgQxIGmeOhlIKaUOsFRZlywwkz0TaiuLjNC/v2GgGL3wOtbYamQfqYDfXCvA/ePv14ovvi/EE5r4QM7OGToRPbjRsfsdeYccn7n0OY/R4sFFdmmnGGV4sHcMXu+Cj0+8E4+jdFoUM7OmIfvdyvvL1X5hQ+fd24DsVtMq1SUW44MoL5EYGa09WoZWATPmrn8rlw14N7+uzcqOd+ZhbzAIDlHWjgLbSZr3lORM6iIDrOxFWtnsnumaj6I8npDIyQUZvl0Uwo39G8avYawfIMlJZncj2xs+g/VakpibyOo3SGLh+B553ugWO1p4KKJhuonP5jKekkAIKXkAG+5/tor/D1bze+fv1K+bjQD6HWyrVVdDiX0bhuJaTt91i3a61nwfCtKjUDW+X3fMzOcRy8lxuBQq28b6thHawbAC0/YXMGk28S0jvHxi47H8cH+ywBStLBpXRaaxTuVEnJPQnPrffZM8FURA5qy2a3GGMlGSuxc6FaxADdJqPfMo4MU13pscfHA5wPRF+uM8cz+9F7SCIbyWJ69gzLd1WVRYQPZLiytZpr3T3G8gamUfj7ehzoEQChLvOUo+vSUQ+98kN7Gt4OvBpFle0aDLL6943fb19i3zr9MZxOfGebD/SpyQMsNEuuo9KjwaIR9wa7X2gzZCx9yilD9N0cP8eAP8eAP8eAf/bD0Gi8rmKULHDjZCRDrcEZv6x6ShXnnvfHbGdzf8kiFhvn/U+JPBuCpSkiHFXZsuux+RYFcRGORGH4tLMJScrLBtAgvuem6dTgocpySXnUmyzY0wR/FN6HHgw92MQQDd8hkQKiaKlIglIDue7UqbRbY2PjUiu9vtGPzqfPv6Jtr0irXOYbL/6ZV37gMnfaUSnbalB/IJ5+kXbn7//27/hf/uf/xP/5f/8r8164thcu9cL1euXz6xuqdy5jYH6w1ytjDL7KB907dVzYUv753jxZ+7AtkMp4w5NxzodhE0Q04nSHaTeqRNw5LxujhW/cfa2R+wvwDjibHUjNWki61A8ejRF1Th+gbTEFxkZNVpKrRiztBMvRJyIfyWTnbH4B4cPqIHzJ9yF0+smcqem/aGwsBZuQQ0xQTH4uWFF/CCj4Sx2x9+oJYhhR7gvw8ZPZ/WqwPeLfx9rg3/iDx+87euZd8QyD9ne09MqaF/qKa+SGZe2ozJZr8vUpTzsS7e9PjeBgxM0ZQLI9C81zgaTaPEFSJsKRjUaziK9aLaeCgbCz52clYxCh8DEOrESzbfgdo3Mp0aRFYm+LAv1A5kOau9aIR1v5hOP8wnfe5i+Yc/KhA2HSS6f9bY4dl7PxKSija4LcgqU+44LOoi9saN3QbH5Ou7Pt4Tk6fEQTWYTPvTHq4N3ujCNAT/jE65FAo4Mqxm/+9be8/8r58ccf4TCqDTZVXm3DhvE6hJeFlpuTuxm0huT+1bzg3FPBWXh7eYv5cf2g1sr7L2/My6RbZ5TIyV0U9c8x5pinV9uUmgu3IKvOyR1fyiTOg/mt6VPpna5L1uv7OMrcUsUp/nsROfBg4UCwHk82ZX6uoGftYcpgpGQ7qeaBjCdSSEEsvY+W31aZ9D328P5ZKP8ec+hNSEaY8qHB+N6lhZx5Nh1VNSxfaosx3Fq8Z7IfKwJzpzNCulFCClscvD/YcqTM9XSDMZhjMk5w7UBIUoUW5kITJOiiS4e+gAWTfQS4rJeeYJwZnwG8zxMUSRfuEjWJufydA7qXgODKXj/FGlaWpPvkblF/L8OYrSLtwrVF7snGqYhSpMNMr94FvEXDoEEkVbkWWSLemamhIwwcpsFJck6QnmZyphLsyPcFjtGMKz3/DZjdY95Mo0nDzWi6s/jWCvT0Oi7zoWIzKNFQLqnaQdT0A/RAKFwAqDFyDvlc9TBBV43jjxx/ssE0NNBwSypom6sw9qCIu9UwpeORIs0nul81w5Y03gqwCKk4JBAcIazhIQ8iEiarI1Gj5XHxks0FPbuOisp2BomXfCkfco9umwQCbW1Cy0egzUe32LXiRZFWQ2dVBM/ubNFG0cK1fI6AW6OIcdGKD6McV7Z252Vr9I93qihv1xd+W3/PdKNujU2dfr9RLhdKX4XNwUzE+MU3lHder40X2ThuN/r9zn3rbFsUtWY62ZYZXVZ3Dzr6tdHm70/q6NZDazoG0CNhHXehcGFj58KGT89irGBlp5QMDMqBaQjmdfuIZ6ahn4wvhlJ21v3xLlfgK2xsfkcS2b6oemuyBeJSs0OtCBoofgnZIjEP1IdPdElKMakWyVcvA/cWG6nEBNsl1NYBmh/Mh3gkeOj2jz+QEfnLHkYUnx9Ob4/rWyWHJeEY/0+01NNtTLXTcH3LiCpatbnZCCeCcSODCqncZSAapuBr3tYSXfTryw+8Xd4CiWCO1Mb17RNaCzY6ojX0od1wKr0HQqWWLYPpO5LmkKrK6+WNn377hXkzLk2DaeeBRHIqL+oxnil06VzK4Ecb+Ltz+2rwaadQWH5rLsoYxH9X5WKNvTieGqoQyLnL5cLbvrNvkXC8cmUnJJBuK9C1p657Fv1E5XwXxSZkISHQiwslkUwKC3kN99VI8G+Ca4AyOuohxeIzmHvNNdgUEFNHQtqp2kJp3KHGPFAzVFZSsiQEUqbUdA2LZNjkbelg+pIcBUQZ/qBXy7SwhbR2ypSqvuOZnKFJl1dOnXAXp6dpsS0vIpNAsXxHR6ElKjze8aKGK07o1UKxhZbjiXXkJ+pYMUpol52fM4lCnXskIpIB3dnYLiODGCjiJ/qwpxnmXWckJQUKd+5tIULSY8k8DD4JNFNPf8CR1xTyGhE8ea3UTLpMLDxhZKC6BViBYIB2m7QZusZ2aYykMhciCZ7zYe649cbrkeCQOTBz+nDUG9Mm11moNQAPUTBfzbprzBcHL8Jww6gZ9BReErUd61AidUQobZmG/p7GiCJdSmy4K4eA2eTj/s5I/77FdlHbeOlLPkXZ7yWYKhLSg4XJfYSM69VTt5mg1gfarvFRRprdTpAR5ruZ1GqxpwR1hrFmSgFEswFqzovu/mAmOenN8yhaRaF/FSKyOKVLkkAo/QkVnb+j1tDviHE7pcfYzpvq9WndzH21zHqiC/sp9+LnXoY8kqMT7SQjG50Q0O8HSygatQ/5j6pkwU65Z4DMvnEdDlL46XdfePlaY03sL4EybvBBILprWJHDBEuQlLhQLAoUF/ngzcLb5zerEVp6ao87swRbrpSCzkopFZkGumGAycRvIUG8AyoSBUKCTa5tw0ukbjJTIkHKuadUueC5VsEt1ll7kk+zckrAFU8JEzd8TDDDxLHTTGRjekoh5UuxbDioaozXQfoXrEZ5gL5UFRnQVVm8PPJ+tlxzmuyPd5VFzPnxO0h5DsOxJTOYXi9j3pglUJJ3M3qNefF1G2zbBtLTIBuGKCKKu52SL3g9WaeDiq/iHAuE9thzTQdlRiNgjdSWDLnv6fg5Bvw5Bvw5BvzzH5pMo8WNXsW78GbKeGqu8t3z9AtWhQhYuT/5SecaWiQ67oRfjJyx4WMDX3vLGHrKGq0LGDLPppJIqIPgj5qIcw8GS6T4jLQdqKd+W8gGqSpTlTkjh9ZWw7uRdrL4xGNsivC4z5nqKyJUqfhQxCqbGK/bzs3gJl+5SKM2xaYyh1BbrPW7XJl8zZNt7JfGtl0os/L1y50fPv8Ko+ASzQhDQAtqNZtxATKqruz+ha8pnaVPkmekj2B1pY0wW7ePRjk02VwTQWiz0rmHzGa+V1VlrGavhJ+FudOlgq7GwhoMDwktsWAmrr+vQuAMpFeYm8dAYOY8ZOip3lpLZebkW3u0e8W9A1kc9j3/PZuNCGo8rrWk7JwJcwxKaQjfAnb+ksdaJR+M8zX2H+tntWSQSAA7gDN/AVCvJwN7gd/CMy7lbvFHzSjfTcdRXfO4UW0QIXj6UD6Bslyd3csDkOTOpDPmyHMrXjZAsIxlti4n8CtijycWOQEUWHJ/+CMm1xyPvRhaAjRUxPGh0ZBswQYAQ/I9I+Nci5b6jtSC5zhzCf8iVUP8jktnbxWRAK+7VWoW5ZlCmQ01xfcZ4+rx2MAeXn9rTGpVbESMVlHcW1qZ3AO87kALaUktgtgFmwfVSE/bwvHlC3PvaBUKV5jQbpl/9e18vyr1ZLPM8pCVLbMiRZAq1EvEm+VzrGm3+RVshkR6GRyUiHGTdSRWTwYojFPeecWwzkbJdxROJ1lAT0DfVEe+M6uMiIkfdYA1b2LPyfXJH2DOxaFbXmLmIeG+PJtnPQBPWdCU6xR9NFjW4ZVb+lDu5cLYUvWkVkxiDDSHrVTMj5NZWWbBptFKYSPGIybIkUoR6lkL8PUSgFAiGGOgtSNq9COu0fH0uLNozPe8rxKNVHe42zzrDVN6NEKYD4bqUI6UxF/228OdmZLhdSouxhjpxTgMMLQt6fuQtoy90pj09EOMeVmqMovjDEaJPF9EQTZKNVR+fc7rGHNR6/AFBEmLl2DRwzEeZIlQkYm6BYBqJ4VIT48pe6KIizisxhkJdqglpA7NmCIUCQUNBxDF54GzmLlRcwfOuWry5SRlhOR5xjBl5SATL498RHNtDb9R4j3/CfDen24w1dAAX9RYz2ComDFXU0k0C3LQ80LafEZ3F3wl0mvjKfYwkYqzAJzGmmCoLrrct9IW8VJALWQ83Bvq7QzuAfYyOCRTZDOC1SMxlDQaHAsxbnlv+74zOYK1ZnJ2yy5cuegWxTUPQ7t9E9pVqVrBXri2F3ob/LRPalOoYDaCLqsLwQBjBgpXVVn61V2+oK2yXS/s+85PXwfzzZBXx8dEtYZu/zTQHZH0Y1p6+E8dxOqNkQtSzSSzzo3mO46zaSNnJi1RPTY15G5UoU3mHtqNojOQuqrfBBLrOT/G/cDZooMtDSGMwDSRXSLK8FUQjb9H4wg0ImE02UaTI00xCSNeYD92jiXXKfVRoEoEzESoiexDjlM2ZeZYmP5AAHwvh1ihTjs9WJY5nXt4tcC3hYQ/JkNhOs7A715WEVO++ezyoAnEVKWUTrlsiBlVCsdPGRCjbPuVbQ/5AymACkc9mPuk/rDzcfwemxX84Ha/g1f+5odfUWt4K7gTQXvfQqt7Gp8+v/Kb3zZ+YjC8cz8+KHpBieJqzeR0FKMovOmVn7TTe+fjp872t58CIKXJdgwxfTBj1ws1m6m+x3kaL7zULedHO+d4xbh4JAVfUyc4ZBSi8Ob+MPhdY73rg+qfEPtvX4A7YoHEFqn8RyCnWEcSh7LNh6zXQpJG8zvGeOhwj3NeCDDngZX1WQULScvVOG9szJSPUX+wARYYoPC4ZvMo3kXyUx4N90TuVduZeU2neaZHATiQ9PU0mrxlk54C5fi+Aja1LeR6eLyrSFiElRHOwokulRUQJ4olz3LOvTWX2rQTkaiqlPGHfkzndz393tQRxXXrQZ+G1CVOKYfFLPDHflrPOfy4JpVkfjipA54FJ8s2WBHKVpAujHHQ9oI6TA6Ge7CFiYTXEWxGwGcWLNHrLMg9Ct9Dwbxwv98ZTKRW3tobu2xpGp1JkUiO3dTknXLqSC+pikizDswC4W3mGSBG0W6vFzqTqZPiG3NOOgbJXjVR7vdg/y6Gy5Wdl/GKmfHpduFyu4Qc3hFIpWMVXlTRCXXeAmepns/R4lmIMMx42ZZZVTb9pJ1IQORAq8WeaSk/JH4WEM30LG5H4vzwHQzUuWMpJUyJJpeOBi31w3WeCW5ZxQ0D+a6Kdobr00D3R8i4noNXOYtD8vR7p48inJJCa8UQ2olILAu4ks0EgQD4rGAbEL3hTGbLRmE7eK9fMTXmfuHjI5oqdd5p2ujekBFzf5hxLSUSh5mFaPH0x1R2v3Kl0Q0+S6Nb5zIsAS0ec1eCWb2Q6yob1R+sknn/SpNJLYFOLdrwWrASIKi1PksG5qvIEJLREBlWyDyv4P1E1+oIlqQZRhjJIo7N9DgyfRTg3bDpuBi2RTLSTRHvFAEfHRnfxnPmk6H6KHhbSNps+f1DKro8npamvme8LsKulT47/bjjGhJP0UCOz954ZyaT0FT5oOPmvKtRro33bXDbF1I4ZMzMJfcyCQTdGj/KmfAu1pa4gT/mzCMhj4Tjq99PBtr3cvwcA/4cA/4cA/75D5H0az4BDU/NvpPtIEg208aSwPUHWnifT4CHLP71woPNDCfbq521Dx5+M1XZknG6kOR1OIEvXVKwWbPI3LRIAa8pmRoyhZHHxvmbbyBRUHUVhk1Kq2jR0zMtvDHCkyKYcnIW4kppbFsL/2dXLmXjPu5IK1yvV+5yw+zgON5DprROSg3J01XEbelLXYrTUN7aThGYdud+fKWWF7p1bt5pgTKieuUyNzap3OQLVhaifjGjeMjBKYCEEr4Dll6g+b8YfsKcwd73Kbh2qglVaz5fCdmvPVhKISe7GnerAK7nXADOeYNs594xkh17+LEuDLUEZTw37txYXqnL98KzEQaEzYQvP2hPGdeFZHeKO2M1dhFUF8j6jyz4f6Fjk5qyZLFWPsd15yH28DZj1QkrmtK1VvMpP8UQz5CPYB+lXG/mFM/83qipR2y4mr++PJOAPgOsoSuOIcaVajzzUaPWtb7N3Zk1eunuAdDZxnM8BtNiHYibrmcdz7YAzc0RBXArGiBnGbRtR3DMBqpyNsPcJlSj1srGS1ynlbM2SSonqCzRQEVUggmFIl3xETKY7gUvHUo555HQGPlEG2C5rqz13QEpGpJoM/YCJOQcw2+2IOL5vBTNplx4xBauo9F7o/w0qdtGrbl/TAnGvtc8ZyiJQMRquy0QUIH0AS6lMPWg7huHfuBi9AJHiUL5XQrdZoA9sqkmJeQFRSI/XXvRytXCu+Y5N/l2DKv12EO/o0PDuPVUVZi5jjSTB7BDj1ABc8fKeuYtJavJ3DkVwta4lUfuEHvY8q9N1o/wkCisSlFnzMGd8Kq76gtilX5LEEAL4oXk+N/0haIhwT00LARMPK577a9LcUCjOVlaCQUVZtS8rWCWYr/L5ib3aqefuSGu9GnZwMpmsPbzXQ8NBpQn2NPnDPlJ08yzBjaPU/Z+AU1HgvBinMT9lfSbCuZqSP41lRBHUA0JOo+ex6ZQ9oYcFXv28i5LBjCfhYfcrns8Iyfi5GEp1+oPEKqLMFnKWwHSKt7OGGHdD5DrgBHNrKhqqJZHnnNK4D3ivm16MKZUo++RTbVHg0gQXTWxHEs4xVrGgOlTGU8+mv36aNL/seNPS+QZgDFOg/M49a08dfO9MmoWaVYnNTVm16DmyXwPwpR31fyL6Ym2KkmFO+pD+9i9PDQK50oABEu2k4xKz+T8/Aqv1NzkjmKrP5fo9XxwaSo41ZAG20vjnslGN2XTSq0X9m1nb2FeWYpGkS2bVKH2F+i9y/7CS+9cdKcb3Lnz0T/wW2d7M9QO3N7ydytDb0EXlQutTj69vPL26Qf+/Xe/YRydfi/cVbiVgacp7tARm87TQinOqeXZ1aIj6g+JJbdANIqAl9BJXsghM2PMQi3RENsujaHhQTDdGWagnF4KQ+b5Xs9rkAM5tclvOQYcfPlQKDOTyFh8svjGiCaTAraaiQ8U4EIb9HKcvzO94TWNpW3D8WDZeQYrvgXF02GxphhQyveDCIdY/KdsyFrYMDy1cedChfvB0jq2mgb1WSuPZlxojarqGagN8bNgof7wLSD1wKfcqTXQb7tutBbBzb5fuV6vVLY4pyu9hbyXtopuAtWZ/SPkQSRomN0LX++TV12a9VAl2Byiwq9+eOE318r714P+/s5xe6fOSXVn1g3bM3nmSlHH/WDfrxk0hZtWBHWpcioFoVJ0j6p7ie+tvMT6oo1aooP/rF/uMdEACUTLBEos6JFwBNVWRJi+/A/83MRE7A9QXDoN1w1Xja7/2g9PTeDy+DuchZQV+FRR5JRhCNSFqpzNj3iPq9ARyb2L5wkSOboCE1/oS3lITJlGMidhIm/pkj5ISSRdyA2JTScD1aKcjYB1iFcWC7YloimCye9L07hRYfqjKPKEThNf783puV+Zl3O9WYeYnOifWXKtSfkHAPd5sjgeP3usa2UK92+3Q1zLiRxxC1ZmxPdy/mzJog0stK7dmcugWgrk+LSyCpEedGoRpDl3dY4CnYPhg6IFGx6c6wmWmt0hMfIRScAtiyTSqHPHzDjKxnBjKxv7S0hY+TGoVgMF2CUSBRHChyaBJivJxhDLspzcHqhaq9hI8MJTA7CZBvuHQFnPMc6xWN2RD0dK+l3UGuyQozAntI+CdqPmnHEPI+YI4pzZwAjpJUlPjbnMtluhXDb6QkumtKt4X1MszGzngaieWu5zdkaLRMgp+SZhJUIOp1Sw6A211VQQcGXWC+IBZDFxthXbLVkl68z6/ZjR2lmY/8PkTFLmeKZpLxJFvPzN83eMR7xny18oygJP59Icnzn3FHQhSsVOhL67gBaMbACpo5/h47d3xIXdQ1u7yC0kc2tl98osE6lCKUrThlehaEhFtVm52Auld3b7SnFlt/+PvbftkSRJ7vx+Zu4ekVlV/TCz5C73SEG8450Op+//KQQI0HsJkA4iRYFL7u7MdFdlRrib6YWZR2TP8ebVgtsQOoDlDHuqszIjPdzN/vZ/cD5PwIvMGhs5qNTIVauZzlqHoj2UE7U8UbQgpVL0Si2V3hYuD1tlNAaGTrXX6IdllVKxGk2h5WBPTUFiwBbnYUIQmQ1xHxORA8aaQ0qwW6rvygY+GOmxbnqCa0hY6J3jlwAV8PP8q35nd7IJO61G5/+u71b2Txtuxo4zEvAcWc/1PRl9HuDoKGGL0p6U9qTcFGSEO4BIObJ80FnDn8w5pLPkgGzk+qiRDhf1rO4BZnAcyYgIm3+rAb/VgN9qwP+/14CTjTy/rWOohGKZLVUdXAzVM/cGYGbfDeEYNp6vamx1eSDOJNBzDIjPgbeJMeduk0jbS9AhAwhbOBdL1A2FGOyXHEmOmfWYJCAke30JQui6fM++Oa/7GyKVTkFJ1ZINVlZaaczvVxehqnNZLugT+PiB/nbHdeH9++/5vf49dW0sz5GThHn8vgGa59DIdVe6QFU+vP+Oa22YhSrMxdAaTignqzsUsS6CtsrYd5x6gsFuSeuFNa2EXBRGRczz3AysomQRsLOzE5ke9115sSVJxpldNpzuYaMW4HfaJOoMPleKzWGrnvaycIKx01pNONjo6jlsky3xjblnPJCM5hrMwV4opaY6v2U1EaBy1P9y4FruiooyhIOQ9jVcOoIE9vAnwBfbA82+JERArNVdYtCnpkcNF8NVjvMcIOxcJ9CaLzCJw8AQP1TUmvaR0j1cC0ph3XfQAGMlFWuNjVESRHbnUYUkIjAqu/RDCRLxEI485PJNorzrLfNWYc2zVEzDfpyClRjy2FC2Kljuw+PYiwurhk35zLC1UVEtDLM0LT97iQB9gwxYtNBlR3whBt7xuV1K7OEiSO2Bq7qjfjmwtHuZ2NsdMg8XjVymyCkN6606arpcSJxLoyNynqEFodQCd+DHQXvOc3ELInzpk0RoRG5u7pUST1wfC552paOMeAuMvL+x5971FnW9xbnpybJyPHrBudZGZSo55v4Jio6ZUWeYfilMKL5+Qaz6Gq5QLgnTHaPOzFodD+dqOHokvS16LCwt08LRYFrtH6+L4zKJJwuNk6Dl7ogtKD0FvQZLZPwMCbtky/5UVSnjcuRkUYK4Q20kypsDFMKiLvfE1gXyuam+0HNoMWoPQmAX3Hu0Gmb4lqKArJW890PVY/na5hFzEPm2C6R1tJki6S4zxQXbPg5y21hG9p+C+AiVdi7KMTyKHWJ7WEUZlop80YjZ0cIqmufY2yGGUA0XmMh3PW3wJ1HYxYKFYNthbx1K44f4BLNwmMm5hIjBJD2PGD6eKuAo/Hve42Ka+deRdVjJez73uEciYD47XXZqCWFLYWZgNQZy2CyfeYjxOqo1sHiHIPFt53slVKf6C4/VLyMZXuPQmOzrnGDW9I6H8MoU95/9RXsokOZk1rPYj5syZYFnWpMfNg/xwXMKPsbxYLURlnGiHU9AYmuv4TMppzTX6jiKDcWQfBj3LyrmKLa9Kq+l0xenvb9yu914+fDCh/qedV150udgq5aVUqI8aHUJ0BHFO1zKJ4oI44Mx/t1f8X/813/g07ZR+50f7xu/ckW18bpvtBZSdrPYzHep9E25XP+Cv/nrv+X//seNz6+Grne8XHgyQfoALbSy5vsWmr1A31nlSh3hi1iHs0u8xwlo1FvnsoUSaZGGlBGDsuwWLk/X45a0C+j1yhiDe73xlmGc157sdnG2nHb2tKpxKexlHix36gyBrzH1bH3gGtL6jp1ywFnYu2KpUjMJxp254T7Bg5KLOx5q3VpO4aes/cLIdSUejLopR4QYUO02syC+jqsywBtGFDRzQhzgddyL4rMwOK1S3PvpLZ6MnxhiJ0tRI1gPoiEsnKxed2e/DxZvIbu1RtF4nvZ7SF3HYhTrXEqlqQc7ohQuf/mEfYJ/+fRKSevK5W6sP/4zLy8vSH2mtcbSCgZIKdR65+P6kb/927/lh//9v/L6+sqPP37Cn2PP6Eun63MATesFLcq1vkPKhZvcuO3gP8LL0wv3DJJkNvxeEX8HIzI2Rm7A63Kl2ZVihbWvWI/ssCcJW7ExQJJm5WOnl8l0VFoORC+Hd2oESAN4eY38iId9TmgUuz4IX27553b8c8pNQ80Y30UpJxugZZEt5R7foYFLx2bBNJvDPYCAIjrJcGxmjGRJijrVlzhMph2kBqjY+2BXaBJN2mjKVCD2o+COBkBEGKPEWuOK+H6wFMpsCKg0cTYbqH49Ng4wbUg8CnHk2EPwGqxskQh+PQDK/E64Hc2RsT4MwWPraRb3H4BHoGk2lgST1R2s+AHqWYK+1dbjjFIRyp7DhPaWDbUcUuhiwrIna2uy0IpjBIDljiwY8AAAIABJREFU7pB2cjWbYb83lrXy+XXgtdL9TvFgxYY8fENnc943kGDvFMIiTMuFYWuAxR6e9xCDMQh7gVoiQNME6rRfkWiuQ5Kd636UOJ/diSyp2K/3Efu6OnSbDGlBrYEZrkZBqTZoaUT84e2veDd+imynW76pVuBtY9s2xm1j1zi/Oi1YhQLe4rsYXtGyspSVQjLZL4p/LKzrQvl+Y9S4hxd1YPAmHhZbRHF74XqEwUdh6YgMalXMBHoqoRPYKskgBlhGo05gPK9R3o7geBOOKWXr8TtVN+QrsshzHwxZKAn+zIGiSU/ASyj4UfDPHJNBPUlEDo8WYPECBXmU1s9GPMOxH+2rCuMA2mcBXGWwL2Hj+/auoL9t/OEPf8B+jMDZ8fYdzZTr9cqtLqzSuVwuLNcLKKyygHUYg7EtXOszF3fe28bwwe/vP/Iumfq995OlnH7kvkcQrJmhcoURlm7YJWpTecKl0HdoHgHh7s7IHBhJCwl3T4vAetxv9mBrep57Q2AfMzBbEI2GajDYxkbvg5H36z46NXMz5mDae6fnkipqlAyiPe+vorNJ8kIhCUS5Tn14KKiAXQiFVikgb8yu/3l54lJWNrvx0wb7vrP7G2MMfrp9jqEu0NfBchV+9auP3D+GbecQo/F0xDmU3B9u7SG3wfcDZG0TMDwUG4bJZ1TjLlruj7cj5zhg26/p+lYDfqsBv9WAf/rLLXID6lQ0Suf4Nh/a/+Ep/1ZNVUn0ngE8l4OBrRPQ8Z5EF/LV0oIoQeelC3Mh9HqSXPqxz+qBT5y4hOCpptB+no8icFvuufeGHaJIWEt6+LyCGC/vnniTzrZt6IjvZ6mFhSD/XC4vFLGwA67hevLUnnjhlXVtPNszf7x95ldP7/iHMnh7+8z79y9Y73x6/Uy3wfr07mGAkuSP/sb4cWO1hd98/A3/1z//nqfWWGg8N2GnUDSAur0J1IaNQeMdtTqr/8Cyx814bTeaX/KTrwEU9jhP1cPedC1xz2p+Vz3QT0pRcGHzN9w7txEEYVGnTFDO4F7yz83jXNWpBPSoS3Q5vhMAK68US1KTKzoJawmU2lB22ZLg2o46RkY8mNoLdRIHHDad2WkxHDCRI8+8mLFO9ffMCHdn+4Vci3/ry7OineShJVWhQ88sD3E9iF69TkJ6nNCqEdlwCuFzaERLFyJHRKnTrSjP770MZEyLMygj9qr3r0+IwPPthWeL/O7VhDrVmokH/aF+4rO+YSb8cd15S+lTP5yY7nhRtCo+Fm6+RW11kBrGoZwrpuFVTtRQgvDEwmVt9C6R2aWd7iMsHXFY1sPiTEUpLKHiOIYHI84UHNkSvCds1j2fidiPB2UUeqow8IJZDEvVW1p/C1IIYqHeGIdlazoZWePNYds36gjLLzNDrTCGUdWoY8VZYkCvHRen8oarc5Er70tkfu5vG7wZ27axvQWJ69Z2bpmRIwI1FRIcGVTOTpxP4isNZ5hyzz331Xa23nIoNfCaQ+WHFqHNnsCckp/PiTM3cgyfcq+Gkf3UrIvCKvbLodOf+zpI8OTAMwmtXTneazESfz8trZtx9EcRufxlXdKkoD4Ja474XO/P+XvzHrsj7Y5+UManHX/9xBDBuqIIY0CpK62FwGEpYZG/S6hADWAM/B41Ys/nbtOwWybJ/tpzSJTPZ2stSBRj4NYxmxlFYdXX98eBvTJGWqQ2Q3Ucg7E4P3csLfImaWHbN0YOcopH9lQ8CwVPtdfIDMCqNfsdCTWUhL1eGyuGsCxBwJs2+VWu7H3H7nvsXX2w5r6yiyRUHcrUGKa2yD91p8oNP6RlU61uB84T79+Of48aTTCNASCyx/cN6RoC9I5JOKtVa8eAaZTAK3qBYnMPyOzQMRgpjV7UWUfDexCUJ8w18/TEx9FvWHlFPNZQDMpiH/nX3BXm9YsDpiGVYp2isyhKwMvLsaCthBVMLJADejteYy8PN+2QOY9jMaAEW+ah4ZV9NuDJW5uMuTyhHGWvdizAkov5dFcznBlimt7aEABAXhOoMO2oG+qGrPHA2t1xK9hQxIy2lrRaCFZeoVCoUf77ziISD1678nsE9sFw4fW2cVsHe3+j7E4tF7xDa8AIn8S9CRc3xAa/+v4j7xdY2Civrzy/e0fVtHqQCQAsmDlKoSHUvqAZQK7DaFNGmCtl6ddg9lvYPTQJyblMz33CwqWUQmkDl58QCZuO6uFb2ttb3qx2LDw/VFMVuCX7W7BquBg1LTP24nkgRrExfA7WAuQcYzC9sWuvwSr0U7pc6kBHiddiJFPp9FaVZIZHzRI2F6FeyOBQ98My4qu5EmybzKWRobqPc9q92NGQzIVdqCeRXDSYiJzNlMiGJpNX4CA1I3FfyrS2gJBb73Pgu1OK4EORMhjd0G5o2ixenl5YLk/02+/w6QnbN6zvYIO9dEwChKrF4nN4Rcvg/fv3fP/yzPbpJ3x0et/YtrBbGKaol3zWLQIrx+CpXnnqb/zw+Y7UK5LOjlFEGtZvYE/HfbEE71p5ZpNOFSj7Tsk1KtZYskyuEmtOauwd8/uYbHxj7juGE/ZW/Rg1+GkPYJXJwBfaQ2hsNgm6hxrGDJOFegQ4xsB7lKkM9FRNbAeTFKCNRk4UEClM3/v5njc2qgIeg/s9i/oZRIpD92hM2/SMtzztgzcd7Dx3CiWGJSLncMQ5GPQmO56sMDwa4Av+9YF21sPWdU8P6gcm3LS4g4pnqHDNPaRnIwrkNx2hi9OO8zFTkAQEYLI4wqLBjrNH8MPyY97LAck6QoRRUtI+6lEkQXwX7hVkeolPBZYzpozax+EfH4xboS9G2ZSqBWvCbROKNi4l8pisnwGp4NQSw6RCz6GBYLIee+iajFHLvb5pYZP0MkcPi7yaqo7JFiLezbmP+YJzx9wQj+Efk70+BoZnnRwsHHWhlQvMprJ13L+HDkuSBPrnjb4XihdkcABB81dWbYFTu8O4MfNIJNm9twXqKrRLY6+dW4u1MO+vDTC5pYXFEgpaAK/x+b2c/sjEAM+yfgBQCduhWCMSNolwsAuLNTSbok0GM+xz/pyNSvmKWOFDoRwDVsHLZFTbcU+LTXs2Z1ZbCueXwuPzk5dsx9+JtTMHTHmuq5/MYrGwOkZox5lWsQxl3trO08sT9IVPn+P9vYwb9IrcozFd2gsk48sMvFRsxL+XsrJmcP3CZ7p3nvw9t/HD4e8/n2nJWmJUIzBfxW+DzRR3PXz4h0QFJgJmdyyfKR/ZOJfTpukxN8enskuAEk3cGJOtZ+x+p5WCE2z3pVRs79wk8qJIVRZwMmV7qEEgzsoaXdDxVbgM7ngyDo2q8lCPO2KD4XOPUtTux3cadYsQYIyzlAivBthvK26d0W+MBJL62pE68EuPGk2EUuU43cKuJbzkZ+PSdT+ISZceZ3XRgvjGVPJsDz7ho+7HGgHYp3rja7q+1YDfasBvNeCf/FJbMN0OUKRZglNmh4q9ulKmHY+UwBN8/ju4yEEMGcw6slLIPRY7yEUTYO80mHa4dHwSCrIfbV1xnZhE0FMFkLSymXk1c9+tCUrN/ODqgk/WfvCRA9SrO1u/o8WC3CPBuL6UEv+7PCfoK6ylUIcio3JZV7wYl+sb16eCq/O0XOO+6Jbnk/Np3FjKQq0LM36xaaz1l5cXPnz3ke3/+R23Wyhs+9ioA+5e8NIo0lNRWxDdqaUg90KZwLDDSKXKtCBUnLIXxCS+K22ppHAwo0kog2SqKjTOwvmdz5Giu9NrWEq6g5dwrRGSHCbgZlS5HaQy97D96mltFm9orhVj2AhwIsG6gJ5S8Zh/vwBLEgZMtyOflcSkSm+HykYtz04Jtnw8X0LzrwcMH2roODG6rnOfAJ3a50A9A1DOQdCuybCXyEItY7Lqc/hbetY7oQSbZ/y8Sr/QS2BP6zBqj3v6tAfI+eH+zMc9BkyLS9QVuReWUqg9yCx737G6M2o8v2I1wdcTyB5yp494ptrQsBeFICHlPUBjL9eR2ZNq0duJo8XQHDS6GKizibNQEI3XM99CSctpJ364pLvQR8RfnCgl1F6oFLaxBxHbk9wluT+NmS3TUwUuoJFjKUDJ97SPHcSoDaTvUceaMeweThhaMQ0b5mqgNWqxuseavKxLKBkVsMFtf+PtZvRORJYw8Baq5orTpeZZanTrSbSIe1mGQ/bAlktHVLmW6K3vbCHecDmGIxWJ/E2PnqNKrJvpISro0UO5O7v8jKTnFf/izv75rxy/HmpXTcyiHC4FRAaY51mR928vX+Y1qZ1TOBGhmjOOk9lC6QZMRaCXvK/uoQBfhdKhl8hS6n1QPS3czFlSedeGhu17U6rHwHUUo2nshcUjtzNgiYd+z3NvnbZ/+4b2Owr0/Y5N8hwlHF6moiff/2Z3kHKo7YY7qpWRjig+8RDNfUe2c74wHgf1nZpYxZoRM2UMRgpHxAvNSlrXhXKneY18RhG8KKigtdDKQvdOY+enmUnpJzluSKhdTXJrdAdbUXnNezKdwE5ysZrQ9i+x6l496j6ZKyZev/b4uzdq1KFGWAcmnjCHbhEJJ2lPHjOAUkr0wO50Ck7LdQd7fT1selWCzIjNum85SKO7hGVo8cGm/30Bxy9nMOkGtoT3bDYhkFPTLMbVg1Ey+1H3YH0cMtpkh53/N6AEf9BVuYTFw/QrVpwu49iAqu84sKWlyO7CGFPCxcHyOuwgqOAehzYy3wRTyRT/nkXByGl9GdTaMOv0/c6dnVIao4aEEVeGGFoqrhnQLDEAW3VljMGyD75bvmPR4BaaB8t3dEl7AgmLvNDsxu/vHauKa+HDyzN/8+sP3O93BhtL7TTrqKy0kgx2ksmXQxXZjEt+i5/sDK6fjVWhIxYT5mVf2H2jtQgHxQVphSqV1hq0O3uCMHuJ13L6MU21uh0NieY/Kzt1TL9QQaYtygyQL0uEUEsUk02njQDx/p0jo6unn7LKLEyISfnMaKBjmvkcmYcFoPLGDMWu9SwaAtAb9J/ZHfy5L6sDfGdMKiIAjqvgMpugs9mYfxYgaD5XcHiWjlxLs3ATHOdOT8/bbY8NpOmC93sy8jtYBREaQjOlibO4JnBcwIJdU9vCh5fv6OXvkR7rzuzG7fbK09MFCHBOq4T1pCq7v3E1pbbGr3/znn/8f/9P+nZhbyuthWWNmSLSML9Gs1A6K8FieKqVT6+faatFfskYhEoiBtbd71gGSbLHfbptP2JypYwCb4ItPYPZU1MwG0cL39hpQ1CJQws5BAXZWEp+Lw7JzprDStfwc42X7Ucex2QmmDlGAVWqRwEW37LhCEUU9BXc6exIDt/nEPzRQ3iCtSEjzsIv7VPCAvPMyRvpea3FsNwjg8k++6TCtHya9g7uUDObba4h0x2Ztgje8+edmY/jZQKLX8/lGkOQgyXiSzYCHD7GyJ06GcZ5Fjwegnu5nQXOEYLixx4YbOG81xMNlHKuG7VD8lzn+iglA9YF8xrQjmgOrvx8BxLrztMf+Mhowg5AOAqS/HgezJZSwKpRrgU+O0UdWuetG8091vwELlQOay4P7QlienpaYyA92IZTYeKwJr/TPXya84HCstCXfG+kb/dx/3zFxk6ZgIltCZhnws7Ipi1LaIMDDFa5UGXam8Re+Xn8/iAXUJaoHTwajVDPDEpPSb7X6SB0BFWKSFqQBIA7g2On4togBxsadUECrJoKCpOjp6FY2AwMH0wLw+LrsdcMhCVl+5HpHfaAlvkL5eDMxtjT3Wn5c1/LFferRi2IZ+PtIIqLZ7aHn/vVZOznECr+jC8bDiCDVQLY4QS95eFplKP7rkdA9rHjqB2Znm/NuCx36vcN+Xznxx9+4GLO87jS+sbiwnXd2HfFbsK+7ywfF7oQWTEWag6AdTRkd5o0ilcU5663ZApm0UIwQqfNAHKJ+Y2H+KhWRe8d2o4kMCYy6PuO5fe8E8Oc+JwFPZojO9iHg7l2hO6WCorCnWCHFo3hphfHew6lZMNsOWpLiMZ1z3tclf9m397FjvsaQbcJTuSQImCCOQgJbzFxP4BL+n4OywSeSuRZuSx0UYobPQfErgNfC6NBX7KWVRj0AEskF4xAqTPHyZkDsrBOJNeDpi3feV72up+gTT5dSoefgVd/7utbDfitBvxWA/7pL9E9LLny2R9NGRhdjHV+FBE0z5mWJEezcxgEHLnBcy8pD2rbGAbFupn9ttgJborFQPBhRn9gGyBR13lYP/Ucgpdq9Gn7Iwkl6WmHHFma5HsOkhLFeXl5ieGOOlin1EarV9anK+2yslxe4rdK7OxGDUKpf6LiXHTloitj24FOv9/oy8atv6ILEexuhllPMim0WhAvPL//wIfvP+M+6H3jNt5oe+VyqQnMxM2byowavlhcRfhDZl0Uu2MlcIVpbao2qMMBoVrhpV0CFFOL7FAv9CLnAKfW45wMgsL5XDsF18xZszmkP3OlvZzkiTlkGt2P4+KR/HJk8FCZvkA6YhCH+xHrUKa3YDLAl8TKNma+2orlGX6zndLmcNHTKtf+G7u5P+cVw81HC7yp9CpHXtHMGgHwB0KvxR+gSD4rHrU0IN7osmdlsWKHSj7/sp5ZVsUbLz3WzPtbkGjef648j1BVtFJp+ayg6f4gRslBh3pj338A4FOLfb27cvpRRG3SfaBlgr+FmW3ZCWtNVT2s8i6WI4ushVxirZdDfWbsGuSJAkcNotM+K8194yWmsl3AywFKOzkcV0e04N2p6LHvHkR5D5wrCNsSWWsAuWfXUlAzBgNbWz7voHpNK8jBXRwpGsStW5xvlLS9rReKSthPU3hZKtUaN7/Fc+GDZvN7F6aF6H14tM9jQD6zJXFCldgjguw+CPeCfI6yBm55L3c13KM+jDUTERnW5vnrTKu5+JnZLySRTfqh+vlaLnXSNjKfp6mgPfp+wCslrQv33EeCIKbH3jTjRMg63o9zGnohh5rEmSexdWX7zihOXSu6adgKitLLOyTrFh8NGUqRGrUWYR181NYuDNlzaDEH7JIkurCjs4eeNjDjxjBLBVPBbQ5KB+LT4jk+U8fpanQ31CNH15xwkcih/TwjSZKdqeFjRq2c1sfNJ5lXAkcvQJKilqUxcoglorh2xITdwnK81oJrS0eAwSrhvLK0F9oIh66tDYbU/Kwn2ahLWrn7HCrO9w3IoEx3GzNs2qbnz8nwg5CMWNrvy1FbVKlYqv2wSk1C7Kxla41hkmQfMDzsAyOPK8gYy6GwFVqfpLywkdaS9vC5ruYwVHwPdZzIF/v9z69fHDBVekwlM71NExgBUEkJpEswS9xZ7EtpG5zMbuAInEUqR+aAGJIHywSmrBh1yDGAOEhmPq0fCtVP5nT1/Nn5+60FiOaET30Oxibzu4udQasaQ7JaC+15Zf9poLWwjk4ZN0YvyGqUqqg4xSyD1veTvcGc9g6u18Z1WfG9s+0b9/2G9UHfdp6sskqlyjng0rrSSkFcqFX5u//877nf77BXeu8sFS5aDnuCUXYUZc/N+loXLhkO+pQMJnenZhaTerCnxQ3sRtkrZShGTGprWUg3FMqAVzfm9rH1Hnkg3IFkAc3BmkQLuwxnl9n4xNRcVanpgawjGil3DZB1FmE6js1A0q9VXBLQkwiyBuQAHeaNzuLcb5iEqs3Mc+nYYU9Us/JxLMKov6LrYElOye5kbRNHM8RzMYHMyXItuaFC+LDuWo/JsiBfWDBMhtR8ruZzW5tyv98p1nDbsjAShjmSzLSBoaOmNDUYyR8/fp8M6nzmclO63+9s7Y3r9Yp4o5nFpl7KIXlda+P5cuWff/odfl1CTt8XttF5WRcuJcG9KnTCdujjfuG1/8jyuuO1IaJQlD42zDsbG2KXYKPltF40pOiCcnvt6FXRRYLF6SH7FdbwmvfbAVCKKMVnIRo3fa4jAO3Btnb34/uRBAnih5dotnFm9piNh79fH7qFIy8sGkw/BgzJaMtBhojSewwadnOQp2BZjDf02HmUIEtFToKZYSOGESacoJ9nNowKjJYHcwPZwxdW5GB/dHnL9SX0tPkQV8q0jZHcH8x4zFD5Gi73QRmCTIbxtM40PQqckvknwGET2uEhAPvcbmajE97O8zt0bIICzLOuTNyZ4luGGMsRvjnsPJt6NbyAPZQaZegZ4OmD4ZYNQp614zwE40CfXv5EEysSe4lsDNnZFUbfeB4tBiBKMJhFKDIoc9kywU07Gh3QY0gwvfddCoUeMLOMh+Z8R6b3VtqbzPyiea/EPBmcsWY24uycQN60vsInOFNYJOXl5hRvEVw5bTP0HSYR2rl5hOcGuDD3fWHoYPQee1oW21k30XVnlA2roT6aYL7PEF+J8F08mD5z33y895bNYGGh9u3wjo8D8v6glmvsR65AfD4dTskBgA1jEpYmC6iZMeTrOa8iq6Cf4aLzmeC0OQ7yyAS64/uYYCoActqqzGtMns38kfxP1R73yrNx2ic78WicJ8kmivm3ckebcvmrCxt/5O13dxYHvCM35fPywhC4iLKuKyID1dgLVMJz28yom+J74VIa1/2Ku3OrcSb6xJvjIwXw4k5RZXicI5VBE2VRBd/jtX1j6z2aJ7nF/tmV4mFR6Rg2X1jBNdjT5sa0HJxM2a4jaiIIz/QKi6yMrmzbxu4dEsraJ/N6NpwCjIpOtVNeNd+7CKiXg92vxz4RDbx7KOfHCMISw/L0kgOmqVaQ0mhLw4ka9lfLB/4lbfNaU8q65BDiwsg1ZWWNz2gP/vNzb3hQwO2F3B9z/ej8TPl8WT37hOPzNfqjHeNXcH2rAb/VgN9qwD/9VbyjD1nLxlRmwqyhXApz+5PRqRBZKQ6TyfxzjkcZlb1NFXeAdiJyvGYZD3meopQcMk53FpfCmFkUEnVGDJOSSCs5eHQ/zz14yLPcvrCLGi7YcC7vVvhc6Jvxvqy01nher1yXa5A7E+irolDIGrCylAptoftOJayUtv1Gqe9orcR+sw+G39BLBWt4nu0QQy53WGtBZbBvr+jwOBOHxazIwgFFZQ5q8h6NRsQiy5HBCcfMBu1n7b2ikcc3YE1AvpeVpp1aK1YL2/UWQ+T6St8idGEOezqVYsqXddxA9C3Xgh3g/qEdqYViNcgbGJrWloP5XAU55gB7j8y8024SojRR0jJU5MgQuhXFLawltVTuWfsp47B3E/nZAvxzXl5RB80hqvl0BYiMLwh78pl2fvRNMSMEOEbr8e+zXjbE20lumRaifoLRZC9QbWHZI6phuce6vown1r6y6ELTdg52ch19V4S1h22a3Qr7JXOJsn9pbJDDSdPIaYXAwVSDsBags6H4g0NTXLsad7nhxana2EuHJjFMqVH/xaYrUKPfFIn9RZJxXXMoaspB/FMsa2Nnk56uPk5jP/L1+n07PmoMj5O4bQZ3qMvsC1O1IpxDaHGMnjZmgKZbRQ7QEAPJPEDCgrzUhSBZDhY6Up315cLaPrHvO7dtjyymEvtcJ84uH46NQcfO/HY6XXeWZcGrYiLsogxfc330I4vV0m3EfT9q5FF6WKK741xzaGGUOQGd2DRBIow91Vm+or4K0nZRORTLEBlsNYqH/BPD08Frnr9HNexk3Xjm2bmTNUkOIO3MBTqETnL2MUOULiO+syVf+R4/q6Ix2Cyd4Z2SA566Re1dSolIABdkCIz4zd5C3QP1zJnFqTlUGvsbuhV8DIZt+NgR9xA0uIfbAYkpK0dd4qIYgttg9PO7PEgw+Q91w9PS3kUOg6s+9CANW9awCw100MctHBNmnI+H9eNdboEpFaV2pZcLPgYmSxzT1tB8RnzsqJ5ZsXjUH6UEhq3D2VPs4VkjVtajtxoa6zw+QzwL4kZNa8mBnkP++S9ec91AqL3mTdkSr1BmeGa1kf3CSeQzb6H4zbnmOjGhA5MfBzFDRZAc0pacUJp4OKT9d65fHjBZ+BJsWQGETVuALDNWtlpjsdkQJrOrDnScgML8zNODEc5QMk12Aw4yC1w3RspXCw3jbKIAlgEiT6Cw68YtP/TBXNf9+NIqnSUBnZ4Fv/jK5mmTpJqh6p2nIpQibHbjdVzYOxSeeOsbxQfVK6LKfd9oNGpZAnTo7wFow3nRJ377/n/gd3//iqqyfdqxvxRKW6jvntnG4LJWsA1VYV2fkVoiwBzj179+TjCuJ0M0PMaPe3mEbsdCeCq/5d1eGT64vv2ez8v87q7s+w5/FCyL4T46ssBGZ+wxOR1S0RJBcWWBnZCBv0n87y4bb9NyJNCPIxAsVukeajQRzEMOPgeDAqws7ASbq+py5mD5BIFhuOY0vR4H4iGNlQgcjoMpcrRmw2RuoVbXAhK2fRPInb7Ibo888a/jslQAPL6rKDz8YNQo53f+5ZU+6RKT9rjZyX5u/QRzBWoPwLwny/NSHK9g3XmTN0bz3GSvdN95Xj6CZpz9CF/xp/UZ8zuX5xdUN/bxmaKFwjM3/wPj9ikAiqpcLk/UVI3UooeP729/88xlufK//m//C3575cPThbIIH16uPF8aF49hZ/MGfqW1xq/fGd9tfxFZDn9MEEQNMePSN8qb0tLzt7y8D29gc/beU5FXubQFFWWVJy71zr7vYX1QKkUKUgozXH3XABlOoJsD9DEhgq2BKVPGjTLBHTUG0ZCM6blcnNPWMl8jGXfxfHuENAvBnpcdUTle3/v9kNFrAdVkCk2fCoviI+pBhT1l/WkHorMMkcm8C/nykCULz4r6EgXBOIESTdAohgkth82O6QSTs8C1MZ3MvqJLES2Hv7DlHjDKA2gHEd4NdCYzJJk+HrlAzAFBggARnn0WgW1MsDNA2eFOz/9eNXzjAaZCaC9Ayv/dztd3OZ97PdiRxuogPXLz3D2sb46wcaGNtAeYoH/pbKUhT41lqZTPMUQa3FAGtxbsycjhU5Yp6yHWmOr1+P2CMqQcoAekpUGPImbI/bgXnXHkNDEzFT2AtwA1oecAypUEMbcZKEL3U94+0rYiGso42woLU0VSAAAgAElEQVSWdnSCaoDx79rCXkLtUPedfb9H0WrJXtoHNxPu9wADZ/aL6S2Yju+U/Z2zyxumgyqZcUB8HyqVrQUQcpM7U3lTpcbAzQqaaovOT1iZtiqpdNKCZZF5l9uhcqvEs77qTq8/HWthycawjWn/EM3W13Jt80DP9bdIPSyHDsD6ERAokR+0P9j8xacJmxuVYJ+KDbZyAjL1YOSddnt7OUG4k0U18plR+hw6qdEk1tPTyxPv//oDP/3+j9RaKOo8iVDvP/C2/8SLfc9uO+VzpS1Oa43uxtaVfR/UfqFy4fvlzi47fXR+RLgdX0l81lZ3/H6J/XE3nuSCagyvWms8L1ciqHjE0LIDCE3fcb/fuW03fuo/xvmlK57gw9DOmMnwmZmiygEyhMIx//NU1ymwOqVGA/D6GjYM8+42l1B0AIMNa3mPsyMrQ5jGYDKl5QQ7UVVZvXCvoZaybrhrWEmSKiatBwvRBe4SDXFfK6zw63ff8f76A/f7nbf6me0vHFFlz+//VY0dDZZfOT29bdpYFeeRsdv0whiDmeNZvMG0pGIcarQZ9GwI9SuzSf5WA36rAb/VgH/6K1QScgRjT8KC+jm4DsuZc1gS/90e6oCwNA6AJnrnXXkgNMDPJ1CRm5Yn3bBjyDhHxhC2epPdfII88ZLGfmQxrJC/OwYaUQNaZDu5YyqU1el9p14u7Kuw3xXqFV2uDF4wv2K+UrzgpoxrQ0uHUnBurCxc1hXdFX82npcLUhZ+2m48v27sT8K6NJ78gryCtD4FRmxVGB7P43fffcd//Ovf8vr6yuvnH3i6Nsb7C2VZQsWjleZhv+z7R9yd9/7GT3uwvvcOW5kDmADq1qE8jThPa10C7FTFSkFLpZULo4KWQl0NXUOFVltgF8aglzlUvWNpPVfyO+uyP1jU7UgOdUb2DU6lS0Wq4HahZz6W1Vu8jo0AIo/JyCQ/zexDOfbgoRI2RO6MmupSk3hmRaIvsVB/dt1w8SC+/ILt0L/1NRIErw+g7rzmIKy6HMSDlvvDUDuysjcZqeyLXKog/vUHmp2eRK05+JABdiE2sAXtSyjY3jIvlo881RVF0aG0UQ61HMC2L9TM273ahfc91Dof3n3CzPiHuvH7siMI3XY2aYflXOyVuRePgctgyQdgAtqj1ASFwVbHfoLNOrK9MeqOXj9yyRpKEjeLvx9/Zn1krpJTqfgyz+0YCCHEsAowucfwQMBkMOpcv3H+94fsXFVl60n0KtPOO/Zryz1FimJjEHlzMTi4SFjwqRWoH6KHwai1hv06I92TYjhWSuFaKldA7n+kjxv7HrjqbfsEQO/xmbahuFsOoApNQRS2GvbT/bHv0YqX7cjtib2wHWQBpAYJgBhoWxIgbLqUAJbWiuIx4CqlQWYQfS1Xr1nXJqGkjdgbxKFkvVr7wsUkSfs5YJM7rzmU6lXYp732/OyyHYTG0GlMcuvMdVKYWHwv9HGltsb6/I7b7RYZwRL1/VBjI4b5O+EmUBZFxsawKGCHXXDPrFpAd6NXwUs4CjytM0vUsFQt3fWGYezi7JkHNpJsYx4EjulKBbn/J1kznlE9+uUpNDnOc3fumWNcDHy6WmmJteVBetUkgbYeKn6k4haDIc+hmt4u2HOJXkegFiPGuREd0DdhvyTGUMox95k506owlVUUKDWMlzXJTANFZWDudPHDyWSU/DtSkXxuVMBGfO7HbEfPPtEKRw5dn9mhD8NKQSk4qoXbHPOXfhChRITNcg8iyVpDkOzJh+zUn5Eoip+OPf/a9Ytd1/2wW8ublg+4w+FBHP84wSGICeook3mpD3Z4J3Ay2SLDhRl4iU/bvZPFY7JiuZhmw7UXOWzVtFeKnsMsd095WLz+LgP1HRVN5pKjPpjBjZosU3OjPK0s757YPkeQo6ni+UVPefQYg6Ut0S2YwL7QZHpfX7jf7/zN81/il9+x7zvvlgtPTxcul4VVC1IyVKxBKQJiqK3QFfcFkTfAqSWn1qXgerJGRWOTn57j2Mb3+i48WDH+YPc8eBrDldv9Dfedtix42c8A2GEMc7RG8xKgTw/wLg+SWNRLhGznChAN5vJcUpMlC0JlOSwjJlvBRwSjAww985DGmKH3NdiSquDhla8ilGSWI6e0njHoySyZsk+fpy4xrPQsFueTbuq0xy7+K7jm25kbpCb7VOwMGv25pVCwwqfgF3ChjWl1FYf6XvWQo0bDHAfP4mEZubGx9TdGqhg0bRyEctgulj0HiJuzXoXLUtFLBHv/5dOVv/+Xz1RdKN7p3lnqEt7AknZRI2TtFeLgJH7Pxw+/5m9++z9iZjw/P+Nl4S8uLzzVC60FM+nSnhEdMWytQmUwyuDed/reKWuntsJffv8R+biwWARc9pulp35D1qc4jJ8Ev8ah83StfCp3tN95GhE8fpdgcSpKGK8kzcFGMgY7Z0CkHuw6eQgPjnZUkFTrCcIMClYX+qNVwMGOHBHe3mvIz0WiSEyAcRYWcuSKQSgwFfW51ScDI4EMf1BSqlWKhAWMEEVaWGEv4R8u89AxZKTNpHQ815JKZOgMjc/snsSQ3F8VycO8pVfw13OJX8N+IQc/W5IUwgJjFiBGT+B6Zve5FGrayshEgkiw2529dFoqZXDYMxT4mJXr9qBqr2RG5dE8+ThtkOKcCoWBaMANQxRN6TIaaqZgpRHnmJ8KquEBKLtzDN6VDVjjz6umWpUAy6XgZSGOGklmXYIumiCndWDJhhfo8b6WGuf63vuxwgb1XJf+dgz78SxyDPB6qp/mYEAkm5uKZfMcoHqyYzRzQ/QcXEDFTTHP50yVwki2sDLUeDXD3MOKwSy97wzZwyL3bndqfo4xBvr0FICACCZ6WOMxZpG2ocTzXFmwPo73TwkrxOH3zAAgg+GdORixVIC5Gc2VkhT5Yie5JjtJ0M6Y66pm4+fK8nP69J/xmjDlBNxmLpBRj2puL1uwLtMqQ0RoXg6mqhF2kCLC8ACckYfnw8fRfGdeatha2rynzky2H3oLMGosx3sU07Cr8mi+L88rf5QtmgzbaUPYtmiSti2AsX0f9O7o8yXe4bjQWA6runflwk8sdJTVCm/5AOxZyyx7AwsVmm6g9/DPD4OIhupCkcux5wgBqLkal3KlLRf2LdQf5hteOua5H+RamWrv4XpY9MUoaIKjZw3UrIQ1dXX0ycM2aURD1h4UnI6iLYd5FsBczJ5GAmLOkuzqwGYMrfGNTzutIjO7ZcQwOW2fSykgjbFn1kHtx3M3cOq64OsbNGNMB4PcczUZh0I77DzlcCwA6WcTVDIAfpPZjwRtadY9U804Mx32sZ22O1/J9a0G/FYDfqsB//SXWyhGJj5x2gkzwYrEAMKiRo69Rig5gIv9JwdEXvNjH7xxTHqoeR5/ry/HeTiEQxnXy/k7YpOKoccc7s+9yswOS0x3CaARSeITtH6yl6MvNkqVJAgp3iwcL/tg9wE1rPzdQnlRF8NLxSnRT49JnlJent7R2so+nNf7jddy47btLH1AC5JrIVQXUZe+xfmMsa7K//xf/o5/+qd/QkqlVmNtgpbAN6JKmgBXwd2Qbkew+jIi+0M4Iw7KqGGdPyL7x0eoHIZDaxXTwtpaOrAYP9Y3hg+6xEkwNJ4Xx0OVkU4Ck6BcvTHPO/UWiiSH4pEbPUYOgzXiEWoJW2fpUWOIFB4FsX6goJO4EWvAEzScdYweOIejiX8AXJKwNoPpRUdgQl/JNXDU/MEi78y/np9hZv7BaRuJGHveh8glClr63Neiq0mgXE6nmakyOOZNkn9n5q1uRm2NRkX9EtnfPqi7IN0PQLlpKG7GGPhYuUqoXbZ71Kpv9c6rxSDkbVW8N1QamS4KuuFEHbEk0cfdqQneVtEY7CdeGe2kU7hQpbGaBInBI7f9wD/nnjpi15bEu2Ye4i6R8zJJAfGhFyydKxiKJ/HOeACS8xvY952WOZpze1atFJfEyO6pSpejRnfhUOpFNnucLxddg8ggHANwd4g4GsWXeJ0Plw/sQ3l9fcXuO+QA9e47vXe6F4ZE5mnvUTPW6pjcCXL5OGq0aSfm5rhd8XxPlfizqfAF8Mz+xGeFm7jyfOYcijZkLA/WhV/HZSji5ci1L3YOp69b9KyXfeFpRG3dctDUtfIhB4yfTbjler9Ntw41hqQFG/5Q+yZm7ycSP6iMkja+ywW2uVdWhIq7nNagcuYGDSUsgNVQeTt+L0yTqUKROFNn5IC54l5QDeJn79HL9LsdpKpDwSSCq4f7i4aDg9jsE+1Qdo+u1BZOD1YCIzcZYePnjg8/yKc+Kq0GvjwxfRNjeOz/MUpp2G70dBQ71uGILKu4dzEEFIdaCm2604jj0o+exs0wLZFt5h57yLQUznocGs4NkcLq55BwPJJZNLTyk1AUKvn8At2ATlXBrSBEv1VmrdPtqA0LYcnocNR1YIcwx80p2uJe2IgfLBU5VFWnef+RYenjcFn4165fHDAJA1zPKeIMl2McD4WI4NaOgjwO7f2QeCoVG48FeS7sacMj20M4av6YKBwSMY6sjH0yLuUs7szkKCbzL9PYjmnv7speOiLnzVHfWc1TEmvZSMRiK0vJHI1zKLbZxlKXE/hyZfRgrXvLRgFYR0F74z98/zds/xws59/8+i94bsrzUmjh2YKNQjiBF4Q1fGItAtPU1zkbC2ugnJXVWgDDZQUtkd1kxtKeojCqAXLVt1dCxn9hGxv/wk71wfMSbItN5gQ0XlfdkF6wYZSy4X2E1/liDOvhwTinqqocAdRzi5J522dxEEO8yUZYxZkWhdWgy3Mc+KpohlVXCSsVXGgpEzWJELpufoBwj1kPPgFMK0w11/ENO8wCMrzrv64mqLolyJtPO7FBxv97PiOzSdEjb8qoMi0rwt5J9QSPRuahxXdS8Sllz5RRcSgMRIxGwWeGgqVPdkg9AFi1oj5oWlitUw1+8/F7fvrjD4ytY3Uge6G/Grfrzj6M+97pJVlEZlxTfi4ULuuVf/+3/wlsC2k0z5Qa/slFnmlL47pejrWC7qzLu9gsubPZlh6sgjblaX06LDdteMpOB9bSemANWauZceMTz75SPWwWBkKx7SiYldPaSeT0rz32JSwC/gDteU9HPQJIkTeCVXwW3ZulvYKeIY4iUMeKE/75cy0Pfcv9VLFcy/bgaQ2NkuDezIwxOWWq6ifTw6NrjsPDwv7StePScR/gl/g5j2BTI3Lo5vduQuSnWEc1B++eth55uTvFO4v+4vHxb36N0oPJNdk583yGZNo5pAJSIJtFAbP0Eg/bmZ5htVYz6FdXpu0eXoOJx/RPjr83Qd8uA00mpk5Pcngo8gIiFoQZIFt87l1G5LEIcLL2a3r+x7r0wwP8i/DJEr7x9/rGfayhuHFjjM77bUdrABHSiWBPPc9MdeglbY8MjmHJHB7Bwxk7Ay0d6wve5+IZWeQX6nDEjK4PAyaNQE4rcuYmcWbrVKtMD2mbn4+d6dHdxSkaNAZNiLWwULThFuSKYzZoTt8GZitjEYoW9laRZWEvRk+WY9fbwzEW2RYFOyyAztwdjs88pEfzhECHfdaBUxVmsYeqKp0NSVanHaB3SYAvSBgmwdu6y5Zr4KGW+Qoul4iWP1j7R+bIaQnk7PQkgzwC+csMPJ2AzwHUxX09lU96gOmdS/7iUxm1c96VOq7ne5t/Xy3seT0AJhWlFztAvJs7ur+xyMJyvzFUuL+9Uq8r2+hBaCIba5uB4k+8+BO77Vz3G68SAL4w99+w7jEzeje27qzlVBmGHfD5nBVNG4UErop00I62yr5t7Bb14lbGGfI1m2iLXK9DVZgEKk+FjvuCygYCYp1VLpRWEbZg/Ob4BaCIIgmQDAUvBazTDsCRsHqBw6mpMUlmAt4wTX91mTkYA6kHZQzd5zMRw4XhPVRoqlhxelpkRnB2gKzF1nP9H89/3gbnaIKUsONxkgVolgPLZPxLDMMgzu8JJn9t17ca8FsN+K0G/NNfk7QguYamMhTpOd/xL35qzgliP/HzNf41xeMcNmK4fDm0QORQaAQ3aWZ+xuMtrCeA6isun+cvjntJifonSQTuQQ6ombkQdpqT0SRhkWeOFmFZG3xOsGfsDB/sNmD0VF4rbUAdsRfulcAccBaUpS28X6/8449b2AL10zZpGxvdO0/tKQD1XL+y7NRaKdX5q3/3W95//MBt79zvd1prLFWzjhV0pP2sKsOc1Z54lpXRB9pXFk4bNICxG9qTkDJ2yDNZB0jxyFn2Guq5VpDRI/da5NgXRffMJiOY6yLHPXUrlL4iQJU9R/Pk+k+lnufAGkVrOsnMnC1CNQFhQaV5TqvEoMXwg6Nm4gdWdhInDMu8r8seQ313p038yyqjHjSCP/sVVnd2YGo9iR0i43jviUrm+o2f26wzHwcDdEz75POa5PWCZr4jMB2O7HIQJYYaXmPwM2rlvu9sRcKuDQmXhbIAguxzwBTDLiVcJZ48geYtns39dudtCUXEZj/yOclFWWzF8+6OCDQJi1B3on8TYXhBNez6qtQQ7KlS3ahueHe0hjpILEiEX95XQ9KNYo+ZNqqCjqjZorbOcx1HRubWzN7J7Kht9n2jTlK3OP62UVuj56BHErSPPmdBktBD2oDfdbDaHHrqUWvM4enAzkzig0QnIKH+KAW0vOfy/gP0Oz/89GNEfdQr3O+MsSEz59ZCadjHObT38UbPYTnudI+8H08nqsfe4nTC4vhvRTtDJk4YQ2WfAL47IttpQ/2VXNWNQclnIE6JSVxdklD17q58N16CKEbuIyj7+gYIa73yU1r3lhLn2Gv4ysUv0X60E3XMWua0DB161tZ729lb5MRONVJVQX1lbINaHS0lrNoIlVPtO8fgN5/7wNo7YxhKYcseaK7VIaBcaMVp+kpBuN1uWOZXi42wpnSjYye5rEra6hs+yJ/t9Eoq8C5gEcepPslmIyILiM/Zxy1Vjqn+lw2TqIe2sYfqHMkcaMN9Rd+cMkDWwVYjMkitoha90SIhALF2kmNjsFkYef7FDdJjlnEMmBRIm0eT16MGg9g7Q3CYZBcZ9Mznnpf3+OwihDDDoEihP+T5zf3YXJARJtE5AsueIGYbQdCq+TzFs7WX+zH4xCT3q3CvmWvxl+zHf3nANIvUo7AMj8c2OA8SB7N7FlvRMHlvyYqMSx8GS8drz8NE/LBwm1cZFfjZJsLJRhJ/sMCTio/JqPIs1gZn4JuGx6CHmiUYCHF4TK/KTfcMrI5GVUSwEs3HNhpXW09LFxX2lIfuGt7FPg/OtlC18PTykf/p7/5jWBJdnnh6+UCtwcoxMygxyRQLD9bJ5hTjsMBLUiiPgIy7RmBkP4GopheG79gYvPB9MOk8AwHXK/qr+LuqSh9C39MKZUQxWQyGxiHtvWMWGNK+GUKNoZIv0dSxMb1eRx78+lgteAWfyzm+s66FKSF3K4jvtCIUTe/b3OyqlmimZQM3pKxheZHWH6Fq8iPrYeaQKPVUEvgDEDY3OxpDjhLyq7giuyEAhjmwjUFiDAkn0DPl55ZNiCezIKoce1jDqciwU1oLHJNn0QjDLovQy8J9e+Od1LTagqKa/tnQlkatlUbhosIqT6wtAIP/8Fd/zR/++Q/8/vf/H3vvtiNJkqTpfSKqauYeEZlZXd3TPdyZJXZ2sQQWiwV4Q4DPz7t5A94RILDsmT5XHiLczVRFeCGiZp5NTvOmMZMg0oBCVmVF+MFMD6K//Ic/YDSGCjVBiX53xkW4UIPtpopJFAylCVoK7z/8HB/Guq6o1mOxqovSmlI17HemmlEKbGPDVamlorthtYIrfVfatNKSRisNXzmUd4YHwCtG8adgWEtlpbENZ23Gq0ywFPCYFyMBwJFgqGfXftqK+YMt05k74niO00IDdxqFLsHwjnDBVH5Ij0LNPFimfkriB/Hz8Z0e1j0hD7wxB6Oe1wAMAHR69kv4ZPsEMvP7aQLmari9MZU4OjcOBZssw7kBEuyNOO4mCAwHqBxslm8r16IYCeR8DdIfNjVEkTM3/JHhusMN8y0L8XO9isJEeNyLkE6Z2TMJzqlLsA/znrp+vd8p/cjQi30uNvbz+d6BimgcWJkHhYdiZc/D+jBjpi/UgxkkQRhQpVphFMPYWdhxjO7rAV4Wj8+jeUiYoPXqwXh2ONZ0J+3jdDx8Vk2wI7ok9jBOEZAxDk9pcZiROqOkJ/J4UAR73GdVZWQQZnaI8vVSCaE1mH5u6JisWEHNWXWh1UoRZWfn0+0VRhy8htzpMihqWB2wOLo4Ywlyxk4/WG3BIBe0JKPHHRknOcGr4qnd6WlBVFRZpATIfTzsCJUfY+BE3k0OpngdD5WOezDE3U+IKwAJDsbXt3A1NbqdRiYHiMZOJceMchze5u5ffQLVTu0FyjmGYPZOZsaVHaHc8/A4D46Qc3aG9R4dwdgjAEw2JPdFk2gWl2uh3+Zn3pF+p28br6J4N+TtwhOVa1O6WrCVRaCEbdaqC1dbqaZcrBzhp9OqTh10tNgnrSDe8dFp2lkYcWh0y3193pWH3lFtrGsAoONTpXRlDGfsd5CWTYMcM/aGaK7/Bi3r2f14Kv3oBjVfcXZazf2nBKP1qLG9UOa/H3ilJTgUa96p+E5AQOMAM33XhQjadanUtApqqbivouBxiFts0HvnPra4b+KUqx6B957rcvMa/urpIS86kgWYdU091WrmW3q0OzrJTtlg0sPmNMPocxkuYl+NvW/h+l4Dfq8Bv9eAf/2rHHXTITfLZ6qoBXg0mzkQriwQ3/Eg0rrySIaNWqwfe7UfGTwEuUVC0RmKvfid43yaWMnQ+1HTRVOwHP89Q7erkzVYWqedaFN8t2Nd9rA6xRjjzrpGmDrqwcYWw/YNVDKTLN/Pw6pr2RvVwy7q3qIOfV4/IONP+YU7jbBkEomGThWghoOJqtLaU/5Z6P3G9bnxpPFd+pDjXqlWxNsBjLsL7y4viP4tt9uN7f5bPk+bS5b4ub0xco8aFJAdtIAs3PaNZVxxuadi2FNpC4yG2BK2+hYK6yHBsDYL20M8SEQjmyTdBekkqUQPkgTEXqduB+Fp2tq5SzjGiDBUaYnZ9OGUUjHbUZ+4hkYb00FGNr4txpKIMIqiYwFmthOg8m3tVxK2tZLfs0aXBZG07xUO66bz7xU1OTJwIt8nG1H51YqdZBfEDjLF9GJ0P63BnRGkIRW2tbPJxqadbYt9KZQSf9ZA8GwAqiKlIVxjDUw735dt42W/MYbwEwVrsX5Pl4ZJeJmfPx6JQGa4qe/06UCwnXM5COtBMlpmI3IEUS5fIf50xS1J+eFpHn/nBbfK4wgo441tTGV77ulukN+lpJODSjgOdG+MfaO1hnu4dswqVKUzVJBaYPQEoYkGlGo6TeR+kRCx5PestYKMyFb0yLgV0SBdyMzyU97/rMb87tGIVom5PcbAV9juX6hFDwVsiKdjnwfyjC7RPpSYn5HD60fT7fFm+tEAS1Q3ldlTyRKZxt9O0xYiLzD0tqlczK9Ve+V6j7rmw+3CzzycEJ6TLHQXxUdDRFjXL1zShvCnNUh82ipfSijJebTDm65dBmZTbbnTazRJP9RKKYXb2LiUjotRdeG23wK/3pR2Keh+P+4rnLV5nc9SwrovkjDjXDSbIlE7TGIlIJWyhHW/jzf23dgEfGzYGIhMG0rPaDDLeCM/3LIWX1DXQ40nQ44zdncO7MUFug4MD4WPKF2VknZ6szkrIoguDO+8vX3BNVaOpRRIcnHVFuSlDviGitOSsGRuB3Gp4sfZrJjkfJGoFRPfn3S66bhwNOzjbvIokJiYjErNujRIye5hn46FfWixPUaVxtkurNblIAlVy5zQJK713ineI3ZGs2dy1FIzV0oOPIeJjemfVylfX385g2lb2QuH97Lmwtar0MaU0Y/wsXZnesk6ftgJmPaj81xSgt+rYPnhu3jS9JyasmBL2WA8lJgjIsLiwfrZVI7wSytKyfwCd85BX+7EYtNpyfjracEX8rU4ACHRjAKnl43nH698/vXv2cuCi/GhXjEhFvdFETUktOhgcBmFZaksy4r4E6U41w/v+Pm7JT+TMySYMzrCvmPYmK5u4ZVZJksjPoeIsBCHiSDN2cTzsgmWA08F9wsLhe7BgF3X9tDsg/Xdj7E4SPjM+mv6kO8hZxUqo2Yx9eLc+YQqaJFgvplENhKEdDXHxjoABO1+hJpvEtBlDJb0AVc9/O+tdixBoe7bMYc0G5SrX9AsOHqPg9pCWNgwYJQb2zzQSDC4BGg2wadxhtXH/IgN0r8duTlA12dqd/b2evzdCSYnqDsBu4cm3AxbE41Ofk/23GSsukDLbCvT7Qh8Jplh7dJoP3zg09srd0A1bFFsV4o2Wqm8tBculwtVn3h5JtmlC0UK/+Uf/hvelX/8x3/k0+686cCr0bbO58+v/P37laYr67LG4SQ3rLUVWmthzSBntlhJ+5Z99BjLJZmVgI+OjVD2tfSTd4O+xQJ9r6DXGQoJ932HHdpag02jCqRthXTe1Xd0Ol/aa9hnWUVaNhJQWp9NCI0i2cdxCBUdxybnJdUT3pJZ4HRGBB3m4QNApR1e9sOiyx/fO9aqPkF8d9p90MpUdN4O5pIxQcFQcLgb2JpF7HY0aXWMLHpPhd/oghc5Cgr1gUhhSSXPjmJlArl2gBpucWhroxwqU6QfzX1NdY8C48iD+zauvRjFC4OvQ3vLGIdFV/HG3JwmYFJoBFvLY3zOF8z5pbLgyRJCDEbYyT3nTVl74d02Ad5oUpgZt4ukBVXnSzFA2K2wl8gumWB672dB0uzMezpF/5KhmQAVJJmeWZE2Yp12QJ9W9t9Nr+wKXoJpJBUlWKUuK5YNJ4CiHv7vfr7fBNEBrFaGfQlGjAVwN8YA31G7gHsoNkQwP8FuNFbk3jsmeRBRxUZNVex2kCtGj2ZSYTkO53gF2ejbjuiS80cPK5EhHWlPqDtLryoe2+sAACAASURBVLTqaG3cbjfaUrjZG7u9sizOJ/1IXV7wuhy2Mos43eZrAQU2VxhpByectLmcl3cb2IgFt6B0By31EDCJrOxmB1u6zLXXztzJWeTpbmxlqsVO9Uv9iyXbv+5V9xK5ZpY1DIA7TmNa/RUDKRM8m7lgHgACMJqhfQU/bVYMjsZlNH2zEXdElpwgoSlBCoKwc4AIP07v7jr6Mb+txZ7y/MOF22tkw+yu3PNwub19YqfTu/Hlyxde3z7z8uGFDz/7IWqVsqZlVKMslbvf6WJs4zeYGR/1S3zmTWj3FgHHf6g87VfWZQVzttudfR2UIqEIdw+gTYJU1FpDRJF6jfd8viIYt9uND73zxz/+kd47W09GsPsBZCys7MQ4aUcpFA0GCKuZmWEmq9JEeCqK3TvbtrHdlNd+T0A99xzdDvuTKKrnCyfQTUl2baGr4TXAxSUf5iIlgDQRSqu8vP+Rt7c3NvuCe6O0G7TIprq3/WC8dY1D8KiVlvagitDu81iSB659iT3IDLEIcBc5rTui9oz1p0uZSBBr1vvVz3r4W7m+14Dfa8DvNeBf/5JRjrN1/MVUMj1YuTzik7MhxHKC3ehRO5qcdeGcj83KYa07Mxg7HPbzKhttZD7ntA3q0WAUiHwf6vG6LkodzpiOHn05GoBHloZCIRgTIk5tQQSVJRr0Q27ctrBpHR5qjzEcyc8to+FFMBeUGoo2dwrKtm38r//xf+by9n/w008/8c6UX7y/8vKy8u7ylMCyoh45mEXDLq9IwfcN0Zdgz9dC02xGJUlmsEV+ixkt68qXtwtPW8Mvzg925TM3fDi+BzHn9x8/Yz3WC0kSr/WNrtmUeVuQS6F6ZdFxANe7fAm7WRFsKqEJUFLxI/O0j3EAZcXDQsuYxB9n9VC6gzHUEGK9KqaYDXQ7rYT2kjZLY2DidNupXijyHHvpPg71/1zfuwzQJLT5SR44claR07r5G7hMwupR8z6sfmZwbjb3qNPhpwwwE0Z5OxXtsv8/9uDIpp0WpA//45jAlcPWshi/f4rsUvmxsu87/+cffsPf3f8GVeUdV8Yan2++1iVrOXOh3heWOp0LQjGgveIpQF3Kwn+/R233ebnnOi/RdM99dS6ss3lqXKk+GH0wSmXLc9lCR0vlZVXUb2gpdE7l/STwBCgcr9/r15lwZI7hoTRxjnNlJ/FCH8DANXDFsCjfEa2YxV7wE3s2mZTFEgetg4vmAp6NmcVCkebWcXuJ+lwEyfx1sXDn6ONU+aoWdIAPcG1AC9CNsGR9KnBpHXkS7FeDQc8Gxp/4rf42x0CSf9pCLbEvbj5iC3ZnzBrIAVnQEgoxdj/OqJMk6Y8EkCQvdkqSkVraLH47VxenjNMSd9li/Pzsyzt+9cdYa3/88sSzXCml8KRTjf4DIoEh/GL7zBeJGvLT9oq787tl56fLG2bG79rgNefYNm2+S5BXIJpBVoLg8kXv2LNi147dOi7CZq9cyxOq0Iph9kak2WUGnfSjuSypyozctVDYOTmmojsf5zHxaAZ7ZC+rK40LvTQWdd59aBh75Bz3zu/+9DsARvfYM4ujZU2VlUWmrhT8nhE4qoxsN3UVdCRu7orZkgrvsF1VP0mNph32zA9NNVxY6l3Z3jqGI2tg5XWErbE+KLhVljDrVpKSQ1JFch575CfCua+LE4SVSSZKkc4cq0EMPkmoUvP9EvsWvbCnK4qM9SA/1fn65c4Y4brSfbBmEfSUKvaxh2K7WuWtOsoAc+qBNxVakpB2hZ6ZbhdXIGwHx8Ne++fXX2wwHcGVMyz96KQZrvPgkzCACFpu+d3PolPcDkDvq8CuSUS1KGiDrRIPxbVzkHjlZEx0yY/7UETHC8YPHnY8vifLO0AKy2bH9E4V9GCjGJWuoXCJYtHC91gs2J+bxmCQWGS3205hOdgKyxo5Er0bVQsiio9ZUJD+qy28Q2fIpxpjdlV9hpYRcr4QQh7gn4xgFUyGlbGf7BYJ5rB1xaSGHNsCtJjAHaaMXY5NoTZlWZ6oVK7LCnrhngv/aIZlBkbvPYDBxQ/2cDy0GXo7MxFm4QbQMZ0TY43iwKHr/nBYzs+vs0gZwbITYZPtmFijT9/ik3Vg+OEDHe8h+Z7nWHr0g3RPj9C/ZBL5b3FJZ69nQQn5uMUYE1R5yCJp0ilF6Xs/GIVdz0XqZN5BzzkaWVfnfFUND/3nd0/8869/E0BuiUJrlfCnvUrYlazryvVyyd56+HiIVt5fBn//q3/Pr/+Hf+J//7/+O6aDUh1dhHat1MvgUp1WRqrjClUqCwvFIqAVFrAoGMoluu1azowzCJWfWthD+IgwW6HixdI71NFdY2kSwdpUADpu7VTFpTdt1cbFn7n3O2154qk2qn9GyQaAGqPG7yw+i7o8dGfBZLmId5/jbyopIjdCknd45NDpyNImFu0aXyy8ZT1D9CYzrg70zxSbbgIajFqXYB4KoZZxFJcr7vds8k9NC4cM2WP3jtwaT/TczzXYvYc/dn7PmX1SyM1O9SAUmHB6xx5Wccs3l2sxbU6nbY6T46OUsH7zYLLyZ2vEce+FY/4BJ6Mw7z9JnFhyP1u2WAN/eCu89Gjsv4wrkkDSJ4lQ4JvfkR5F4JclDN7FYcv9bMg5V4ee3uyWBwnxTknbgsg9iTVxpuCYFEaupyIlvIoFut8RadT6crDPqhfmWHi4ccmYPdl2cc3Xf2DQlGAWuRhiSxZyeeAZI+xOszgRgd5vOV+nJ7giEkw0RWBUGKfVTy0FwRjDMNdzjfQdoYRS5mCdS+yp7kiLn7uUwfIUB5Uvo+H32Fuv64Wny5XPbAydny/mZjCBkkQhhWFL3ArdWHIMRPagU8w5g41LMOOMQ8VscqO4BqCBY1mobgkqKuWQiLnux2MoaemgXI6D0rdw9Tpt7lIVkoxsZYICwpDJRBRGyTHkJ2BZHHoGZE9byXKsWLFHe9qinNkVE1ANUsteYq6taZcQkNE486CT9TpqArY/XPA/hGXPUBgH/bvTy4bZle4bIk+Rp9UNLUJ3o1aljcpyr2iHS2ms6uwjrZbd0FLQVrG+0+877+wZdgeUWhb2/Y73ANdRDgbobDJR4jOLKIXMk3h64b7/RO83brcbZYsmyj4s1nCHXnZKHl9mowmgJbsxFHi5B0jJCtjR9RI2EuyML0k4SpBxJ1h3kiymNefUXEejuTQRuVBrVakUeQRkGypKqRVn53KtFItD4F4uD3OuHkDsRhDNinM4GqhBX9LewZIsNdVrEodYyzk7h9BQDjs8ZDvz4vJAPpyDuPTNXN9rwO814Pca8K9+de2RETczk3NfER4U45zr5swSGKkGDFC3sM8zdqoks3UERPbbZBvHQJ428hM5rgeQ1I6JeSrEBv7A6AYkLO9KkjZN9uP/zzmhFvlq81KxWP/UA6cYnU6n1MK9d9bRkVoYpTJUuOrAfSpDToBPTKnW+OUPv+I//e0rf7qsfHj3K354/yGs7i7vj0y1+bsAUgIXERpFMhPFQFGkxLyMXKlLZJw2ZVhkdSzXJ6xm5l8XWn+jj04vuaa/KOPTnapGqU4INYzOGk237U7TFXHlTV4ZmRs9NBpCXfywj40PG7XoVC05dljcUTjIFX0CGVncTIwnIgwEPHZeU8fLzOExdm64OpI4g9QGfos9LDpvce+y2hvFconwbNLO+RTrgkvjURnwb33NHM655u1aw8LNPOwHAfPMvJJoakM0mQ677YcDx2ycjIdmkLlyOeZc7u8Oe9ado3q6cDtv9Y6p8bns/OSvVKlcrCF7KqwlMmv2YizmQJCRPTMxba7J9sy7ERlMr+OJd3Vj2zc+13BncvxoxJp0DrvZPCusTuJuoYLzMe1q4x96RUqobUlV12zmR/5LgO7xXZdzfcXw3GMm2U8GeJ74TO+Y3+I1Z9ZM1oc2jD7gXtJye2jaGXdeBUSF5mB95qrMOV3B1nBjmLWqRkZQKO0smuQeFaWqBHY7H5kl0SGt9Wa9HTZ6wpCCVAVVyvIC5TP7vqcC19kKjKnqSEVJnLczv1jO9bBoh1Rk2/mT9LQ4NOzMMaQmNqkMO9fPb+EyKii0VMHWxNnL3mlbWJuuo7HISqFQNQmvRFaguFCJDCBVRXsQT7TcsT3VpLUzxhQwxJoYohFLgkFgBygRD0PY0410X3ja4/lH5nDU+I/g+5CKEGP7IPkJh4Ws0MAKY8LR4pSmdE3HsKFYznHlJTDt3rHE5Ftr/PDufUaoaDYdA38YozAG7LfBGHZYHKuUPGcKAwkfF4E6BnHaEW4SNt9tnLjHgETfY+4ty8JSKmUtqYoP67yCRnOJcDBBldE7Xe/HHPZskAoxj3BHWRKjOc80Q8bhAqMeDasgak4StJ37R/oYxx6R91M701/E2FhKNqpHDzKED7wGkc9cD5KFZ7a0MnK/DBxsmga7xFmhb/vR5HWHqfHd8/tp4v7/0vWXT10pBbfjoJ9FvAcAEF/0bDrMMKlHNkbo8fJfJyPVlyPfwbWgNjvPySYb50cz7fTZeT7+fNx8lZpUsMkMWKxCBolvxegjDv575gMVOT2xqwsuYSt3x+ijc1+crRY6zkWdK06RKCYQ4bbduUhjKRXVenQxh4f/PySrlwQRsmHkCX7YEOjjbKpNFogPRgnP1l2zaWMhDQw/457MczmVPEh4V2IR8pyXz/tbA1ANuevCSMabq7L+cEG6oxME0ztrWUPaSmRo4DNA2xPYy4J8vv9D+GP3cgBRJVneiB33N64JoN4DZ7MIqNVSuG0LZSJGR9BjjXsggst2+qx6AnhqlMz4KgL10cKPBHweJIbfwuVpwzUzIuA88GgeiLoD7gd7cZKKbcq3JTZ43NE8GEdANPk6p7/8cS4sFX1/of7wxO13ysUXiiqrtFhMLy9c6zsu5YoQtlNFCotvFCuwF3744Rf85//8X/j17z/x06bYzaBBK43L5cI1GeRrFaSGN2/sXsqCHqGTXZW7Ga2FekS00MdcH8KI0ZOZNtlS4jtihdE7xZS3LcHOp0KtFVMYdouNV5aci1DHhbb8FGG3rkCh9QXBKersvOFk2KSHN7lKP0EbToN6zQUaW7KxHjNC/kx+rVaxcuNYFcdkt8ZcGDhHZp1a2gOdRfgol5g77mHpMA8c2SAJO5X8O33FMph7gtc2JIpjVXSstLyHQ6ZSYoPDfdzY83BgJe9pf/CLTfuiGEyT0Qr655YE/8bXkbXx1ceKA8aQh61uWr3MrIeHppJ8lRk37YsMsWm52ik9GBs/e4s/398Wfv4llDGLFjSZcs/JSPq0vtHWsCT5/f0jXyaSk38MjcLn8L2en3+yszT2EBcCuDicNGZT5AHl0bQKG9B3Yg1ZwUTDD5h6AEnkWlMY2YSXsBib+/G0hDFCSpwdfBkLYpaKggClMUPcI78lP//IEHLcGWkFUdRy3FtYLJ2fJL/zbLpYNOqO4NI4OIg+rpUcgetz6ysqWBsUVT4sC3v6rb89ZWA2ShmXfIdOep7lXi05pzz9zYl7L8JkxJn0gzU3tMY8HANhCfDPyGYY9NKxZArFQTLTArM4w8pDXtg8SMEyD1XfxDUL8CzC8/7rWI/5tqkeB+JzTN8OS58ucSiFsI2C2L+Gn2YXWuK594cdbLbpOGlM9Gw0HfUNQVbREU3dLYfj08tK/dvCx3/6J/beuew5TqQzXKK8lAhC7250h94HdU2w0YS9OEPgYk+s5QW3G8VvUf8a7LuybYLfbgEK6YI53PsOa8XZ6Cas1IPxPOb5TIg5I8IR4irQ2gsv653qyq0Gyad//pwWeTH+pmogRJGxF20Jns05oqrUHt85X51SF6yAba/hgz8PhMMwr2GvYpVNo3itsuU45wCPIlPMY41Jxm5z59YH65qq+yQf+dKhCD1nuZlxdz/A/6jXNUA74mC1u1GlRFN7qiN8fAVkjySUIVtaTuvRVBFzmAqu3KuKc5DXvpXrew34vQb8XgP+9S9NG0FLS7pWyjF25iTQbNQFADRznRvTVt8eArY979UucFgnu1GPKuU8W86Ge+AcJ1ADU90UJJwhFZnNc592g3fQWW9ujCTdzrNzjJupojJsKhcdyrKy108xMFUi566BFGPVQWmVrUAt085PYE9AuF2oJayM/t3f/x1/86tf8u75b9ASjSUX0BoZzXO3DneTwCGm7df8jNGQKYgEOxsHNQcbIKHg2rVQEri/1Ip3pVbwcmNdV35s7/nD8pHb7RbAuSm1LpR8f28NaQliAt53xDNTWwSxICYdjfdcVwfJgH8Ys90M1bS7y2ceER1K33eE6X7wUHMUEliDyny/yG5yDxUT5J6ZOdrujmUuV9hj5t5rwj5VbiM/q9VwWvhGLiVq4bO2m3NDEa+pEsq8D9GTHO56zJmWYO+h0pF5vsjWrfQDyIwGSz47m2ecqMfc4Z75VLd244t9hg2uXXi3PIfVU6rcpYSKT1WgKctc97gCaQfLOwCe3Fl9Z+wCa9Rld90C7BRynW7H5wt3nqzJzLiLcWEBKUESs8bQxjIqmphX3gFuxXFV2lBUKsMG2p19ArkapMIobWOtn64H7g4jbIp9GNuwXN/kAIq3cs97H81Mk43KldFnoGPDewDIHmwVbMAu0aitZpTSosTSqaIP8iZCNOtiUDPPkK6RKC/kZ57WzC6Hm8YmAbjvZUdKR31gaaupNhj5s+I7khajlvf8q/pNicGogiQZslMYaUHp2g8IQGc15HoQkr6taxINnJLFmm0Duw/qUtDxRCktrNx9OfaMotMRQ3iOQoDFw4Yw7ASTsFNu7BfY+87IZuRebzH3BLbqtF6zATWggZcdUpUyLY6/+sSuB+k0SPyxbD0q8IJwI199v6hlwPeKtVTjaTi2HI4r5M6ZOdaid+ryhNYUI0goaYpHTTjG4It/ib0qiQhWKpZNu0jBHBgh6tAk7FQrmTcLpcb8bB6Yyrqu1HIJ0t91ZV2ewgVMB36Jz7jVcGYp2mJro4QARB7ENLln7HFDKIxojAKzv9GlM0ZiPyJn/jOpYOTEo4YYhQpE7WiWQp/pwv9Qi5jeMB+MohFLgOM+sAMHm65k0VdQFXrdDwGHeqEbGTVwPlvL39PZuBdo419uI/3FBpNLSKElxuIB3rtMT1Jn0/S2ffyCUvHJYrYIG48PmNY+OFPiZe6nrGuufyiTJRUFfLzuDCJO4lr83e5ct1iY3t2jaHrRhhO+v5+WNz5fZubDyVI++azRPCI7r1ILWpdkGzkiJby4HUoWUZEZ4bic/rLxwo7ZoIzlBP1EDlCsEgy4jXEEPh6nLRJ8yGI4Dh0aG5FHJ3OoHPcVHsIViUO/uh5FQJcRnqzjXCAcclOMw6oNQAXV+E5FhbZc2bvH7TdnKwMdLRbsh2yRKQoybUzGiVlMsJgsCQgNI3tc4RVbAtAruTEh68GCKUWPIE09AgFP8KmUQh8bARjHxlht5VCuoXQeCjOJL73NGfiNXCZbMFGOUagHwAkRIFp8YUgwFcaRQwUut/wNEIkiwC2Ot48soWjCJmMhJ8tn7TyVwvL8jPxxRwfUqlzbO1prPD99QGuFEiCAtU6pQtcIRW5eeWnv+Xc//3v+/a/+iS+//iMAK8IP1yd+9vLCUiM7Sx0aDbHwQy1EYOAu0/5K0a6olPACJg68PhSGs/ctgKdcpHvvOFF0GZ6ZM7lG7IOGxyYwQIsiQ/A9i5sS6kVR4WWsmDd+LyXYGzZCzWgTjIoC1R4WGZHGkqzZvWjWNrf4DCJU0yPf7bz/9/R8jwPpDCLv+X02KsVjDBd3yNwJO5QUHZ94rU/f9tNyQ5n+vQRzMNWCkou94ahcjsbErU4FRtyzhlIlxlonVAiqGlZrFgQBm4wruwVjcr7ZHF/fFrZwbn6T8JCnwH6sk+HRP/cRTdXDriPX1iBRTOZ+mY197/hkNVvlaY9Df9sbZsbLm/Lcr2ElZErNBsamt5gLN+UykpFzeeGz3Rlj8PES97LWldcSjCSTwi5n2wVOa1ktBUbY1EXT5ZYNKAeWYKirJgMyfr+UxqKXYOru4MWxMvexuC8Bsvuxn5whoAmSpCw6DjfBflUHNeVteutPFo33gyiih4VQNvMEenVqMmn2YmEb684Mugxbl2T46oaLYWME6IqwqQZDWSQPvdOuKJ71TUPJaw7ijevLe/Z9p13j/u/F2LLDJq5BaDjGsTOko4zAtmWO9ofTNcEIBtLuLw7aNesC6XaEpgZYl3YbY40DG6d9MPKQq5D1QDHL5/ltXIMd/BIAjqTSLbG6UcIGobixqX99wLBygP6BsukZhq3KZvUELO1+sNjaQz2UuwI3VfBp9ZTAm6UEglirXJzhBGCY4+z53Tvax49sn/ejxhRfE9y9UakoG7bHgURVA2T1AFR8hFK91srSCqMrjGh8dVuopoy3nb3veBmYd4bdMReuIqhfqKUipR0cr6WlBV/mphmhnbPcSxSjXBpNnWUr7Krsl8LeZ0B2OJsfQFW25TwbNPEdo6LQObi85v0PUOHdhwDtt/0WCi86zSsMSyVTroslg9ZFWDzYtNXCZkvEMW7Z1LvmAUupo4Q3CqC8oVqoWhlLrjXsaAJw0yIMwj7aLKxVTIGilARk1R5qbNkiCxXCIqaAiJ8B8SKZaXECYZSB27flv/+9BvxeA36vAf/6lwEudyTrBZ9NbOE4O7ueWQgyMxi9nc1ECSXMV89Sb18pw2QCNUl2fOT4nFlJp20epGKhhFLJuROWwbPp5WGvAyDKmrk9XUdgL+PKnYb7Ix0q1j6ITGjXsNwqeIBhQO+SDVzCWcYB6TStaCkIaxAL1PjZu9ybULaRFljJ3DEJxXA0sQeSweJGYdTALdbMThN7yPJyOeqhg05iDuWFvu9hTi3XrC2u1FEpT4N2fce2bfh+5/4aRIt9E+73O5F58Rz11tK5y4haoo8gE9TEo0QowK6zRvTImKgGGWwefPRJ4MrP56Bj0BB22VgfGlLu0L2imV1R7CHnJdeibWIxZBaVpLonS806otkeY63S0/pwjrdCP7K4v4XLxSnjJBIfSL3EemwIVV7Y8/5N5XmRjakAHVIyVzGIezDHbuI8KMZUEMaNUjqmoXx3AdKaz2o0Z/3ivGaj8tPtM62uGQeh7Obc+51CZK6JF1qeEUpmHHq5crUPiAi30Xlqn0E6i2RerMuhVFQqMtf3bKqpR+3vooxtp7ixaI0a1ZUqmnVdnCOnS0K1dO+RcFkSCeXRIbBxzqZouhvxkGkKA+wC1ulbnCUpA6tJuk6XhagXwy3D7Y7kGS8U8QUbSmU78i6HvwVA741iAy0t9q/5TI6KPJq0R73vHmdkzRpEB7JcEtTvDAwfkfNSa439a5mkqsiMc2Je40oj7NyjaRl1z+770cQuViAbUJKiARVF57nZkw8poWQN4mA/9s9v54p4l2NXzb0oSJuV0UOAYKKR7ZbPv1bDM+MSryzZ8MQviBnXe2PPjfkXm/K2vOJaI5N4dG5uR2ZuGXaSHIuz7xuIsls0qsbYEbtGH8AiXiZsQTkIP7GuC3iSJmQ2lqYQIM5kcxk16czoYZkNyAHQzzVwLjHjko2ajkvgwJETtuPiXJrRiLG1D4+mpjZMwz2ilDsj8Z6wcj4tf0WE4lfWJT73UipNL9F4zbNSKwt+LcjSEFlY1phvS2mRJaoDHYaW6FlMNew8x+6FqV3HxcPe8eHyPtCaGL2ctVls655n5iUbkIKVzG7FwS0s+Evsvwpofz1smFUrg84oa+RZ1bM23KYQpBTQG33EnhM9ZJmaVWq0xeLvzJngRc1m7sxO/peuv9hgUg+fxXr4DwdII3AUHnXUAHMkNmh3p8t+TGaRkexLR/Qt31RpswixhntYhJRx2r9tcwN+VJ/Ihgg8Waftkff0w+cn3n+MB/Dj3mit8aGseImia9w6v93+iLvzhyVe/zf1C6/pgatCHqaMngX4+uGCf4ru4N43bkNjU7JnqioLEmwIB99vbF+iA1mYzSdhrWvKBmGRliylfDga9g9m0caaE6+MSnmLe91aQ9UxIr8iDknOqhNIsIPZNxnnBvQ9CuPqhcgYGeiUexdhVDv9z0tyDqxgw/FFKKOzClzbggzj2nduy2zQtEMyjMXicZEKCW40SfuS0Q9Qcvdx5EsUUZbhR+EXJecNz8Ww64VZ089GW/hOZ7G/O0suwnUCTgpz49tbxyZ7KF9IbYHxbWUwrUOTt5t5FTUKEOlGl7RrlCzIJXIVAIqMY15FzT7tCpMFKfUhu2xh5Byav9PLG90u/OKXH7CPf+Lp9/EctBtuO/ePr5T1gnfBVFBdk1UULKCbP7N252fvn/lf/uuFL7/53/jxxx/5u//xH/jw4QPvLi8sKiF99hJATx5ozAe7KUPvWSgtOCGdbembFOynEQAzG7cv9xzj0Hvnddug7UfQ5CXl285g7zeQRuUpF6gV62EfIVJo+wca8IsWbIY/+Ts+3zb23elPOnNFEW/B1hOPsQMgW/LvHfU4DOzM4lgS3Ht8LvHMpvWBDskxHoWYADpulKl8xGk0VPwAXas/cCMFrNxyPuRaYDvm/bTQyPca006onpD48IcDTebLFDNG98ivkU4vJZvdwd6VYiAbeBQVQa6Lzc3MkGowvp1DUFzxHUeOi+MGyin9xTjmxbzDgrOOuXd5hlfLAYCKJQAEtLFwvV3iQP1T2M29e/2BJ16oo7L0K+WJBGpe4n3MsHvM61+9vvKx/QTAb+0nzIzfXD/xu0t6mhcOoEHJIq5q2EiJo6Wfh4cRjEwfxtBrMOn2O2JGrZV1bYdFUNPcY4scBeXEPsz6of4dIwtCOJpqo0s2RwrmO1KifHUVhC8J9icQNRrbg60Q7R5jdDKq9o6P2JtLv4BtQTSxKd8XrMXnWwj2n9ZGz4J35RRkdzEu12jmXaoFAOly+J1vfYenhVYWluUtCA76GcsiqYvgY/2qMRJkjQR9cIZtuZ8uTLXXZD8b9pq6uQAAIABJREFUAZ6MYbi8BRGlTIWW0z0aIgCiuU9P0/18B/XJWp6H6wF651u5nhCQwS3BA8ug2J3ITkIJmf4M9WZaEkk0Gwj//pI1cZdoIhZ29ADwhDoCBJs2F49XQxIgNHaNHM4oKWIAX3aFBASntdGn5SNeO89/d+X1y0f6p/j7aw+LLdu+wNMLr/dX7qrsnz9yvV5pyTa9qNA0ATd94lf6c7p0VAqvr690W2mm/Omff8/lT43l/Y1LUy6qYQ0m0JoEO8+D7VprPSZdQykjrCd8d3YdSShaWWqlyEDqndY7vizc3iJDqeugTYXOtMp05W7hV25jBSmETUtYOwgcqsXa4XKJdWnLeXLb7txve+yxrzcY00om50GVk/jTFfUCDEqT+POiqIZtxVN9f+SXUDOT4EnQFvVqbTzMr2z0D0XUKVqCeZcz/O7xiIVG8ZiHixtPaZUz5jysxmykFGuYTgvRCTh0zt3w27i+14DwvQb8XgP+ta/VX5kOv0JQXmN87FwsVS3FwnYfHqzoXtG5X9VCSYb33MsnYHns+7nfiSQRFWeqPHetB+lRZOIcEsQcUZq12OcMlsRR2rh83dDKJnolCCp7+3JY0Y1kbwNsLevSJ2N7e6Nz59lWbES+WdnDomcbziiZB9gG7eUXoU6SK4KwjGiQOOBWaEfGRtag0lFKgL4oPS2UAOQexCZcA/Ss87vHP/eJe/hUWQrsI5jwduGqa1qiDhgw3GlVaO0aQOMlwD6A+/3Opx1mhtFeGm/LJ/Z9Z5CqQCI3aWIexTInbdalXtMaDDSV1m5+5Nt5xg24BIlqKmssMStVGBK63K4cOXJjxPiopniq0IsHgOfujMxCGbqhh91aAKTRuM6cSO0PNeK//aUysbHZUHhU3YaqyHilSBCOpr9QZE9FFeEW1pXgR/2tPg58r9i5R9l0zPHKPVVqxcIVR0TRHF/61Cm/go8fP/HT7qy3lnlDUdPbcmFdr6iHZXO4DUVTXUSp4miqsN/7lZ//tPKjL9geBBxn5+MSa33xc34OyQbR6BSB7obslUULFeEFaCKsiyJZT7qOc81wCwLb2EJxr7F+HFDtI59t3mf6ofx2FxhGQVivwrYZ9/2NsSXByAwp6VRUOJR96adLtXiD0VPl6o7fdzzdHHY3ymUByld7muecqrbTJTScUjJXVzYGlaUtlHpBSuH5+ZmR2ao376h1ygjV264r7hZkRAn7Ns211ofT/BkzY8t4jWJzXgvh4BpKj5GqKqSfpHVzXHcQORS4KlC/KWcIWLrhslGS9DZx4NfWeW0GGM/3O0/jkk3DyNMaUihlumwUlCcUqGlti8OyPTPG4NI/sWSN9CJvbNvGr8cf+bKkSvBBNDDH8+5fuJVQhA+v7LKjRXnTPW3lKsOyF+CDezGKFshmZe1PB7m3SpD3oqE7MZivHcikJCadGWHRuF4S894oY0GlhPMEoH1nYs6yL1SB2uC6OPIUUQB9ZGNahZpNkGF37rec28VZ1zVsNTXz0VRYNZVDJRxJil4xa2F3viY2VGOfq0vDRkV6j/+WguceO5vxUQvm+5fBqwcWvZNqWBEuudfMWsDd8faW9zd+3z3yxuqIRv3UYg65h6VuyT6Cfa2qdpeznrT1uG8916XNZtZ2oR1KqHStcMPSCheyYZtr2J6W9yJ+4Pv/b9dfbDAZIFbQ+sBgJv3zjy7+wu7BttFyz8PQfsjwi80CRSCLaR/jZLN2wa0iprmuBot85kDs1Zgeg5OReDGOgOHLWCkfodbGs3+gWOG6KNUKxQqbvjLuT3m3A+y6rzuWu9nIbmxsAjHpWlG6ZmCgvoKtlKoh+YkgJKzEZOvuNK+htJlWghKMXk1W715ifS+TouA1NhRx3E5AZfSRm7iw9RngJ2jpzID2Lsn8tTiwWLK0zIzhnhkXYS0zfYa15yHUN5o+hdy1RBG8uLLVyTiPAHdUUuYehfnMyHLth+XRHGjNTjZQrztCHuaz8aVF8WRhFIMlfcBP8oMeRlVSOp6AnogF88MswVXNheoh3wuBXglXCAVfjjDvkhIrtTiIflNXK7Apnpun54HBih5zDDqSBe9kKaqnHD/+Azz8dUkVgXDaBw09lQ9Tevt8E673OJC+X3/A9IaKc3UPy6v+yt4KdNDlmoV5eki7YvaZLT+fVOEf/sN/5Je//CU//OLnqCqXGgeFWkNpMa1xnGkNskGfPrKxgUr6VEcBfjLmvF7o4zV/39j2O/e+MwPzXIVSg0VXRgJpo0SAqgllH7CuIYvdnTVvW+9PmBnPduFZYDPnPtLeUjXtZyxA89lgOPx8Q0Yem+CWKKeEjNgm028+5M608hziqUKMZyYiSCnHvCm+UdLSQTTZUw/MgDY4MybyjqiHPzKxFKTyQ6Ceas+piDSB0lNxYfE9uwiLBHt3l5qBoaQFkqBsYEsWtH54GmNh9xK61W/nEATg7OAVZ43DY9oz4PX0XJdOs7mfTEbvWd6H1fepBAWywE32mUfW3xjOdk+ghoW6rVSrVBXK5tHIST/wvW6oRxGjVnALNvaHZKW/rTfue4yPj9JZp1WKx0I5bBBM2bjnl6Q117TUUSssLvThhKDYqaKsXhOMDn9kF2FwRy0AqvlsZR9Yvp+7B2vencn4NQukN9aozlQ4RGVSGLulSjmydszDK9/8ho7JwotxuSQZJRh8b0exeZAsvFNnXhN6UJnmXooHGz6KHaVY+K13dVgazR21CAitxbgnE9RrZbgjVik2rW5q1hR/No4PS1alTQs+gtWtODLBgQHdBoUavuCAj52R/7/KxhkUM+KwI8ZU94Y7xXPUTgSQ52L0b8jLYfca9UquS3DWc4d1ghszs0ATrFFbD5W27EYvs97zXH8S4QGQ7XjNZo/Wy3GfYp5OgD2bnjYBW9hUWA5wKC107zc2Ueq18vRhQb7E+tYD7aCpHs9ujDsLz1geWzXHpyWxZekXnvvKGJV3tSFe+O3rG/aHO1/++fc8b3+L2MD2jbcKl3ZhdcO8ZzOyBAt6kMGwimnWbh7Ao1CTda+hqAREKlYU64bonWVt0QiYtlbaEnjrwfxuC6MHcMAwrAbsWaSQVH6Misncl+Oqa6WlGu1K4csXUjWTzPdtI6OvaGZs4zUY8/uejfQLVRrOEmzLfN3JXO9IitiE/ZGlnJdNGxYRnIWOH/ZMAM0BX7JRFh7qAbTHWNxH5FgEIz1BiPgAOb7q1zai38L1vQb8XgN+rwH/6tdUDJ2WLqF4E5dDZbtYkCvHGLwdpE/FZ7bjWHD9+sx4kD8A9zBrC4b8NPe1aG5kM2aO9zluOknSEaGoUvYWYHf+9rtbzXNuKIBel7ivW9twBx/CVk8MZgJYc6wNhd63AAWH07bKKgvawH2kKl7QUmj1ElkMRak9wWZAkggb3KC8j5kdjVr0HkuoMjSVATayuRqVEWOAqzJzKmOdjjVsy/xl87MJQamRXejpGeNOs4bvSWhJRe1wxURpyxPX5Y4R+2jVIE/te1orSzDtrURjXkYJsNOdlkojqsW4tsgrdEnlR7IwiifMY8ZAjr2zWE2cAeyU3x416mA731PmHIocmQMDI2IbPOfYSGDZH+ZR5Fne/uVB/q98RX6hHjZls2kLzJ2WMhSVBXM7jcc9VcoO0wg36vq4HKEd08wOF4K5V7l75HIR66cteYZIbOmtXXh+D3VZ2D4ObiPsDD3V3oXBbkFG0NaQluOsRgyF1yBHA9S+stolSGhjgTFYbKUldrWHZUP87DwvitEtFEHNNloroVTK+jayNnu4NBkMoq6s00YLQ0YoLfFyzG3TU0FZHs4CQYt4UO4LWHF0jfruyLmlInuSJGWEQ5MK5sRnkYH12AM0x95u49jLYi0r3LuzRJFFV4m1wj32rIMEEwquWp7AS5ydvFJSZVZaNsXvr6nYiunU9Y63HhW3B8ZnecbWccFKkC42mcpmSSwZSrbb4v1T8TEKTCK/GejI40XOadNT7fuNXJG3M+i5398ml6Wt3NaoB3/iJy63im7KU7ngHURbCB6I56l12rjnGUuDyG8m4Ffe7I6q8mHf6QNeWdlKP0QV59kgXqv7aXcKhtURzfFRwYXSO9OC9DZuyLXSe76GGaavlNsadWkxhoRKmj7PjB5OLO4UXaMJ63EmCsvVh+zQvtLTgnPa8bpYnp3PJjZAoaLTDUvXo1k1z6m7VWpp4B1VQ4Yg2o46S0aSCRzQXCMsMjpFBOlCSXeVguKWWUzZuG7pNgBwn014B0tiQfF6EMWGBga0WqVqCHbEsgec+Dn5VGC6h8z5e+774hF8EM/fI/MzzwHuoZotms+akfbOnJni7miPe2ZCNONyncCdLu2MMOJ0cVsyMxqHW/2X59VfbDCJFUy2o7CafpYmIKMxDAQlsYMjKymUTznxSdYr4coYv++MPDhFjoHnjdRknu1gMyfBjsJvfo1NK89Hwb/SP23oUii1siwL7X5hWZWlLrQeAz0khNEVvBen3+NGfWp3RglvSPX0a5Yeno8YwwXbO64FUcG7Y+XG3oVSL1QJyXj40E7vdEP2DSmRLVRKAG6HxN6zs2jhR2852dQfmkEy5WslQ9NgcxhToZNMN88Bb4DdIjNLkrXK4ek9Q+Qiz6jUEoDgcGRZjkMHGhYYPoxSO4WOmHNP5RkyA5lPQKdzbnZqFZdpXxL7YPWw6wPwVhi5EE27RbxBNuawL5EnlQM6NqgGFu+C6RHijUXTsLnScyM22yg5sdrBNrJDovitXLqFDYEl88mIRc10HKCZJIAMcOi9HkGZaDliFnPgbNhNSbMdh5B2D9Dicq+8vz0hIvz8qfH+7wIM+PzTYN93ijh92hjahvoSrII+ooj2C0M3eu+oVv7hf/oPvH//HknJeRVlpBxWWsH2ecjIxrL5sZnNrnxUG/m9lrOgNL+xXoKxph62AdWM3omCbl3i8KNxcDtYnCPtk+qpGqEpU76r/gUV5SoL1/qEjsLVhY9yB8kmt8SBbeQhSfATVI8gNXBFk12lpgeQMPNZkNNTPw7jAfYd5t3oyehjDbCRUH+Sh9lZcJs8vC/R51YGpMWGokcGR+kRXmhqWOwu6ADN7BJNwAFXbsRhcJRgIwYo9RbFRV+ZUKFaAK8i8rDJd8r/hzz2X/sywLUf7FQnPZllP8AbCJu0Yy4JWAn25SzoD6u9/BHVgkiyP8fAixI0C2H0QeWSxADFXNI/VAPsFGG1y8mUdQWdlh5x4L6/PWHlLcgPY4/nxmlDuqviuccoMHMZejKNq1bUG00rpWSmXfDSGWltoZnFIKr4CBuFYnN8azaR4hAyrVCCxZJev3I/wLZ578RXmhptbcfP3rc3tGdRRqib8cL0EbYKlxxDYwxGmwyqeXgtiEW9UEVPMFHC03mIRIPQY55aD8CfbOapxL7rtlNUEH87DvpVhV7Hcf++2hdy7971LZRHGu/ddFroWE6/hT7tW6mEQvhUInXupzLHFzx/1hO4aQibn3VUOfRYMVayV/PNXG4F0x31sOoxnfZcctjaWT4PIQ7B5PqJz2eycwSoS+pKHr+jL1gytkt6x+96+vMftSExJ8JPunA0oKjB+iUYcw6UUlGpCIXl+Xr4FlnN7Mti7AyUwZKAWKh02gnu5oFbhlBGpUrjxZ4oInzmE58+viK70rceqsmyUjTed1CoI+DXp+ua+4Ll8m+YhQVREg6pnnuHnQrK8D93mg7apeYePXjdE0Ap0z3gGqp4VawYb/aWczZqNcwQneBxg1wXS+5pVXc0M1UXFkS+cLvduJSwmd6tYz2aPn02yKzj7cLeDbdXlgaY85PD++tzHi5zTpvhZTC8R+DuUS+ezRTRrHwk2mwI9GkXQTnYzbs4NYGs83cHJQEay9eF0xt8Lx35XgN+rwG/14Dxrv8/rgFPlCDBtvm3IpCg3K6Kl6gZNJnOCZvnrz6wupPwOcSPPavISDv6c0yMBxzkeF8/1daF9mBhr3F+Nnje4vffbYUXTaseV/5okSvxWS7MsPYJkEpI8qLe0Nivrs/vYIXdnWFRj3VxmmicxcWoRSmFJHIopXOodoobhlNSkTDnMxKApYsfNXAoD+JeujnDd4oULD/TtJSbzYRpnTaVcS6dkYQU6cYuA9fMpkYY3Q/MZpCZphbkEgMWLewtFA5DN6w2rDaGG7d+x9YTcxCpRzMnFsiZkxn/iC1xL4HClnV1ZGeaD9R3Dv/DJXNQzQ6VrUoQIsws5hCA3xEPoq+a0LIGvJPkGtesYYLwEnnd5+BxlWMP+yYu6bHW5doThJW5184skdALehKHVKMhNfEYy9dIk+XjspLEJa/YkUdox9ibhAlNm3KALccL9Y1Pe0FflP3nwu2f3rj7DdvieV9o4EHgGGPQllBl7LbTSgurumx1yqg0XajqXNqFzbdoEOWaLrLlWPKDmNiGsOyOmFLdshkLOoKssY0NRtoMK2kteSoKxB7qIw0LvBh/Ax0TOz0ts0TClq/H1gNAkxWpAq2zz6zL26kwtJEHJRaMW547KyI7ZoM6TqKY9en+I+jFYIS/UCkl5ncJzBIDtcQNfdpBhiuSSCoZ81kHDgltvbD1tILUwCkjrqMwzBK/S4WoCrsYXuKjx54dtQhA9TslVW77tK73FvPbCQ5fztnGSbzxb2lOkU1LQG0EtjyXj6fBp/0WDYj1PU/7PRqNu7AqLHflrjnHxsBarNFhDxnNHKFRFJ5M6P0t7L/3J3rv/IEbzV5DFc6Z+Tzrrg0OnNhd0F4wc1oFhjEyJ3OMgXthJDx8OKOYMmxjWZaoTWWcbdIxEIl13R220WmZ3xVWiXO5lSTMECIM91n6fLV+qCfmLYJJuLvMGg4R0OVYVYoHiahIWDDGUbUd522RwEtqDQw8UtOcsoc9XI/CDtfTjezKykUWbBiqC1t5m58s5j2e2IFjMtWDcGH5v9l72x5JjiS/82fm7hGZVd1Ncjiz2j3cHSB9/y90OAjQQdrVrmZ2SXZ3VWWGu5vdCzOPLK5WIxwwp+kXjDdssJ4yIz3czf72f4h8R4s8NvPYF33GYK+XZeHHSUKrKI5Fj7TU2Brn6TphjXb2VpL3qouAhvX7wTyHUe5Ok/Vd0PyIfVwkiG3OOchcv331psthbs0X/kfXn++65IjNwOpZMMeL07MImzJOS4wlcVQ88xeiAAszi4ef6GJxxXU/mQEngwp5sM9ZQA6oLyWMcixicHVmNbwGm6A44DWAkVlp+iHYBgroZ+ac/HifWO0x2GnOl1TNuAY7QGpBWuV+vzN8xGE6Jl2/hAR3PsdGOgdmSi8dJfIu1gOuTnieHoaSzKCWQfEI3SbDPQAR7zFssiMnspxh6zqVu4z0kX14P7v2OGTNkaHBAiQeNvNkfwsIMwdN0cdtyRAM78QFhKYPrEOpEoz+d837rnFAdyf5oeEFCfEzupjuOO6LQZaFKQFumhnDRzQlpTzk6BD+8gKOxtR4+auKMnycU18tOaYUzgLYkjFiualEcPjDD3lUO1kO38p12gyeReVii0k0jWTDmofrupbvafyS3LxEaB5ZCD2kdXlfYMu33eZTrO+vzvzF2PedfX7ieokh7qetcBwH/+3zZ1ZwnrMxZDLN2GtY2EwrzA7uhbpduF6vlFLQQXiQZpGxfLzF7lmMxyWMLKwdktXV+8Sy4b5sT3hmqpgZYS8x8OJQB37cAvgT4RgHolcUpWpJxlJEiaoob/NOlWScmSJjBnsv8xk2b2x2QaXyKgPI15p7zFHH6aVe/X2hl4Nt77wPO5Z3m6wgweg6AfnJUoPM/Ax7hlsisEmymPCwVICwi2CxujWLxMdaKK6MhKJMlFbCQoZSs6F8NAQDPX8XMqP4zL3i3a+M90pY2qgZnocc3jCL517KAv3Gr5qib+FSLBv4BEXkUZwHwA2sgYX7qYwtLPuH9NOns3L2ALCRtavTq3LIwNR42ZTbrfOTvXDdn3idg11rDDaYbLnGSympQFWQihKF0JWPmBs/GHT7KfdI458sQY88xKtJ2Ep4xD8OQHKoEZ7bJDgV54Y0ZaqFjzLOPe0LWmlIssVW+PkaIG357545EZ5AcHhyP8CXkg1E3MkR4JVqWpMGSi6lR17DykWxyRmgbTdmPq8ioTKO5jw/RHP2HFZICdMT0cgxhAhV9rS1EFfK3MJyRZzWKqU0ZhtZi3zBM79vaKfPHjXNsiGSwaluFQgCRae32IXVyhnybcTXh61VA8qIc3Vankm5R+fXpw50KWllBbQashjwcGarnMqDbwywK35k+HQOaFbdBfgJFG88crvicnpYNuQxVz2VQbm/n5lmcA4nQ+29uiw4B0jy7t85nHD1R2PgD69/8nzRKowNphgfr88c5UuADrnQzIwpLwzrSK+UAfjkTgxq6vNGCeEgYoWWBf1lXuEQnvvBf/rnv+d+71hRZlV8q0jWTiKO1o3L5UJtSs1zp78jxosGOO4y81zL25XsseXjHTW0UbXSp3Oc51p+RgJSskZWaG2n957rDUrIyvKPHuw8Z3O+ZfO+hzpdoFyU63Gw5d4zhoCVU91xzMHXr6EqaQbMsDW6W2GMwf3+xtPHQq2Xs+4yPaKWUOPgjucwa6lKhXGCFaIzwTWjsfaGbMA9GHd3PU477lAEXHG/Zd3CYxD+ru6b79bmt3D9VgP+VgP+VgP+5S+hgdiZZXAq0DJrOAZrhLpUhD1zXaY+espixjwV06k2k3BdiWdPz3WxBtf+ziWjvBvs1nPbGSy4ZRsbT0ecl9+/BdP6x2PnOkrY9minjJGK0lSQ8caXawC0R4SDAmA11pDs+zmY1K3jPun9TrFQeOhQtlSXTnFmH/i00z4oPLuiznMXSDsjKQriZ408xgjFbYJmLsG8XsIKkTBuPUFrAeoaVg3GjNp3SNSFRRyb67nKfcvAx7Jx1nNg4ThSV/33rqf3Hs4nJRRJU0fmE4LYqvvDfQBIjOJAxRnyTolN/A01R5kUdfALJnmWEmqybgP1BeZmPfMeSCwgHjnbwzlVfq7G8Ilg56AYkoD9K3xtnjZy38JVUgl5rnlZfZNhZeXOrR4hgFSDU8EeQ0V7kIrfXXNloMljvLSGS/D4m5QgL4kI1tI2chZuLXJo9+8/8S9/DKvEP2DR3xzK1a/s4lzqzutwNhXqVnAtmE6QcVqwXgkbvP0W9eCVwtctM1RNE/PyfE2Cps1UKQUxpd9vyLYxfNJa4zhu1G2PPXI6M/ckL5lv45NqO2MGhrqI/HMOTFf9tlyfwMpS6Rsl9yVLsL/olXIJzHBMw3sO7mYhDDAMtyAoGK+YZQzHqidknOoPM8/XEkNDIcFD21BKkBZEUkURBJcazMT4CRv0YwvlmOaAisFl2xljMDyU0ULNIdNklMD/IGqjaWsNePa14Aneu9nZG88z72s+6qICK++qyzrf7JHR9A1dsZZa3DuN93C7KFsf9N75/PzC3pME8DrpHOwMVGre3xq1V4uYE1VB1SJPR8LYdvePiAlPftBN+TQqL66MaRx+PIikJchG44Py9jZRcZ5mZeodR5lH7Mf3+ciMmzzcYVZOb1CkAu9F31nO5/kwU7ke+0IMQ90LZdkdu58YcFmyNX9oPN0Eqbn/e0XSVj0qTkd9i2ebFD0kuXXyID6swqDaMteOJVVquHipKz4Jwl/2hHOClqW8ulAIQuPenrjdbhz6Es4cJEmgFBjjFBwqRkkVb8A5DiWsKPEYnFM8yBb5LMo0NB1r3qtcT2vDnHec13JckcfX1y00lCZJJLLEuzJ2KD7PDllba1ow2r8aHs18JleP8j8r//68gklKFBYaPsPmehaUS1X0/mBYh2ZhZd5E2PZqnEtJ6xF/x2KQeBMiASK5OzOZvO5OTSVT/K0sRKxgadv3ogP5oPzp9TO8Kh/lI0/XH1JuuVNdaZlP8Z1/h2Fc+i987E/c73eu2wt/X2Lw9FLDhqg9VbY/NH7+rz9xswvNnhjibHPHOmxNaHuLsPXqOaWVLMCSguyKW7znO51aahShklYMJcC6o9/xBPEMe8zd8rrbiAwMF6oLx1tkEKxp9TwGPQu047gxJA43K1v4ZZqfwWO45tQ5Bn9aIqx5gRtNd/a5o6ZsfmGacylXulmkYYidMukz/NDm+QCrV0iPyfUsHCL0lKGbwUVTKpxsOOMNRlpDyEYr4SNv9gJzMrWeHo8m+8MLW1fRakxGsCowNJVLvhhSfdLKf1/Y/DWvWQZDwjYhpL8rSLfhaxgJoDd4t6loggYAuCdAFTbo3ZZtR7DbitXT0qJYFA1fPt/58NOVvgv/7vlKb1daa5Td+f53v+P5b/83fvl85/X1lTvKcQQQ0YfhCH28IBYqwevl92y+nX645OdSy6O52C/BvluAxRgQKsLYS7rF87AGyLe3ce4LVRr4xr41bvdXAtKM0MH4/cLN3qha8fEEeaiVpShohvXMWStXWt5H3eNg/v76Ay96cB937vLKFw9A48girU6iwQBEjXqqDnJwqbAQPhdFzgDgxZ7eTlJuPH73+KxlxAZudu53wd7K77VlpdBw7rjDrcpZaS+f1mM6krklKgIy2EqNwz2H3Ou+bgjmd3CYPmIIYO18lhRj5OGPkxJg51gsKClIi/XVeVh6fmuX6qcEEOLGnxkixc5D2PxAKcHUzCyBiZznWdg8DXJmQShSC70EE/qot5NdeCnf0WzjP/6n/8L9pbNtGx9vF75//iHu1XHPvdhpLeTWhYryCYDNr2Er5P9Ce9tC9TMv3LcYNv20p09vdWZafxXJYGoHLDTBgsX6y2FR07C76jlCO+6GTWOOwW7BAnUfSKpJRee5r4vI2cjcSwBbLkKdue8uUoIqWpzejgBvNSxfnkpF5zhl5fHsOy89Pw3fYGrOHRozi9U2cwDlGTorgveVs6fITKYfTl3Nd+4hrTXavFCkUppi3AIIu2qGYnqC14p5C+AulTKX+bDoC3ZiZU973ul+5rlAfL34xkyLIbf61vvgAAAgAElEQVQYbAQIEiwi0ckKoIX6rvjbTpJHyxxF5ZGfgc/zfU7ee1T/la96DfslW8ysI4ezwWKMs+phH7XOXRSGlnf2iGFlha7hYHrJE6q+omsFZkEr49wTsUfjUc7pwaN0dWaQnDxOAfc4LVAwmwwZzKesPXv+nDbErvEMHUbPfE6nUKsybo26VD/6xH6LV7M35/ALP//TT3z42RgvBSud8dI5uAON/bsPPOkntvrEpls0K5kbcF1qekLpIQ5iNaysJhxulC3AekkbJ52VlYKyq+IjajqXh3Xx0HLa5UUOwQXzI+6/OLosE2js9ZkxBiXBCR2K5ZntUtk/bvEaZyghtm3DxnwAsXlfrB/03nn58pXRB72/0e+V19e0NctScDTlYNCtoyWYtAjIerb6TEa8IzO275j3Rp1srgGOIFQtzGVPFMEAeT8rKhneLQlEsGyKypl58a1cv9WAv9WAv9WAf/lrasFtO4masqycMFYWhBJWbiKC1cgqlrSkF5UY/LF6zjwv/ADkBMsXwOmszOMYigNMLg8h1btrG/G79kP4+LpxHAfXf4765W/n77iWRjkK5anxe2IP+/IW5+2n8cIf5RfmnPypHRx12SOHirHshfL7jS9fvtCHMYbRWuyHYwz20phDkVooKowyQ5CogSVMdXbZYAY4Vi/h/OKp9jYfiHso2nLNujszXVRm3lsRiXgDTwu7ptT7sqd1ygy1C4B7oR89BpcizJIZL7OzNjn3LYboONYKdzfaFgCiS9gaFik8X59pd2G6sFk7My5QOW1Cz100az1RoejBysHzVF6ZbojMJHtklp+DJzllk0JPpfSqhWIPDxvXiHd4jNRPgqtFbVJFaItga4Wh4XAjnmtVJ/3PsML/l1/1ShHjzqrB0iJaCiavIMKQzjLHc10W0tErSPYsp8KU7CWsMXTZbh5ndqu+s1c83Ze8Ru3nmUcoIJfOvUZd154K3/37wj//w5+Qn15j0CG/57hdqaNyvXzku0vUgxe7ZNSDoXJBC5FlkwOg7/wj3Tqfyyu/WPQytzqihnBfXCsin20yZ0e08zo3jm5MFTbf+NCe8Nwq3f1c91GchhLExldKKdRUN5F3yGa6CmWmS5UtbOAAEQe9x/q0RXa4hC2jO5fngzFiv0JCmexSTptgBdBCx1KNBfbhCvdyWhPXtmzaw7VJBJ7lsalJDpkWHnz4ZBCEDjwNp9OZSkSppWJa0VqYVbBNeHs7In+qpkKkztxrLmj2sEt8MGycA/4pke8aa2Xd28Jcg4bM24qz6gH41/ltnVuTSZeNLc+qexY+DeXFX3B3vlRnlKid7vc3bBo/fP2evWxs28aTFnz/xEhlSq2VvexhnSaKtSuV2F8+3u0k+h9uTELk8M/yBiLct6jxr5925s+d1/udfSjFvrDvO2ZBYmpsOcQXphj7hxjM+kFYI6PM4aCpblNJl61bZBVROFaO4OQcDC5rZJXISFv/30vahaYLzTBFRzlrTMmhSilJqKsPm2W0YlazBh3pnhDrDaLeK/Qc1sJMcpRLKFDNCqMJXgK/0BXzI9fcC58o9QIyKbpzPxXvwpgguuWw1hEUrOJmCJrv8zEkRv0kWq3zY9RBXX0aMViO95zEXnamPfaNVRsPXQrniWS+aVU9XXFGnuHqGyWJN6ZkBELEAbiCjg3Vx3xjWWOuPKzCfJAA/o3rzw6YNgvmyE3Wgxuyq2Jw6JKlvZsc8+sP3N1ROU5rOJuxeFz8HEotR1Z/P6GUR9izmrNnYXaG2yKQCqepB9ePV3wan3/5ypefXvg/t7+LgsRgFseWd64ZmLGp8Tw7z/Ujczo/8VNMjj1AhlsuLm/CTQ+e/IZqi0ZX4HN/TdWWolS8LP/rlLXpFpCKChMJBvrwyJ7SkE1PRpDHmmAK/Rjn/QvmQRy29zIpEiHnA6i/mvI6ww3r92T+hC/5GIbMeyimpKY9QPTjJhqqo2Uh1w2zfKgQSnlmctD0Gg2U/YyduUfjYf+zzsrFvHUPlp8uxls81OoP71SdIDkYrCVyFRa3MQq0GKDinEWMe9hAxProzGR0Ptgxd1IQiblTEvxoyTLpMvmm5OZAIxoeDUQsGlIJwLXmtNtkvQdOS4soNOJ9TxEG87TCSfIQK5S2eQzyltWOq6BN6HbQ3w7+4a3yf/z4N9SyMZswVbExeLpUlI1xvLE2rEGn9/i72w71mjla+X5WELLpCIZ7UYrM8FmdM6kLhvlBRYNlaW8nqHUGVbuEhRgwvdOSubDphjZFr8B8jZ+XZG67nSoA543JHr7dfbKsSMRfKfWaAHmPxoKN7y/PfD4mW2tn8WapZqxFToa8Y49GK9+08mBFe3IL3J0yn3JjH6f0+OSwvZv2h6WWhTpjCvNkmC+5a8WTtV08vP7XgGExB11XnkWlrOJRwN3A2+npjr4i/mDLxmvuMBtaFJ0XpB4p1R8Mn7nZLhbnwNInuCcLdzVU39Rlhso4WXElz4jdAFuMpji/NJ+VIpFT0cvaTw6K93gu07BW8zMCKHOjJ3vmrb7E8/Vs/HL7QqVi9ygCaq1cpTKmU3Vjzof1SHn0nhSE7s98VDjGwXd98HP7Sh+dWw3l6aEdWxY2BPAUP7/A+AdLqO6VvhQB84ZNaO2HyG2aFgCBDKZNQv0URku22IEqlGx2ylKmuiGWaHHRYNiIUWSyZd5fz7VSmlJEzz1LVWmtsO+hcBivHWNL1uDBCvn1BJt7Mca797VsNbYMq6xsjGEJlgNSsJEgWYHGFUVopTJ1o+3ZNBWlz8FNJ5bqgfAljtc9UlqOCHranwTLOxpkPa0t1O4J8IfNg4gwZWUwxRBORCO8uWS+jAXormwwa1YP/bTVCfWdcRRf5OFv4npkEZydMhB2NWTWFsLppX/UiUjoT9RGnHEyaAnoLb7Yq9RTCVDloK7cq/kY9J2yNbETxKlZ97zD3NGpjPZoHh1nuqOlY0xuVpLopKe0fx/O5EBxOuXhs91CrWMyT5V89XdM2/tOmZWPZePH9sT0r9gAnRs6N/brB1p9RsYF04JpQVs5CTlDgn0e6zfO0V+VJyqpbA/VBaKRFcGkVEF8Q54HYwyakaz8wsVB57JWIM9HQ5inqjtmcMao96j88xnQo1KWZbU47jWQtdJxFe7dT8Z2qcLTJVQrcwvw/m9nBOceR1in/enlc9jbdT8zQazGAKmXOw+EJgfJpTISfJpeHxZeCyS2UAWIRGbFLI+hbzRDJc9NBxtcUp3QtQZYflpTfTvXbzXgbzXgbzXgX/5SDxu2BaTMvGeib5mB7EyfKNmTPsZ6ybyOPeYEY9cwUfz8/NRDGQtrXwpXlZMd6qHKFRF0ZSx7PeuKSkXEOY4br7cPbKZ43XDZ0LpRR0HqnkPmXwLI68Hq7rNz08EvaS12Kr+1heuL384saIgBhkthWNQcvU+2rZwkHhFnjBgi3z3UBhDruImga5BEsGPiJBKKLBb6HZ+LIBrWaZPIfTE37N3hdqTlVZBOMtOzd4aswWbmwqikwi4+n1EK8eUZ9kXulMw7GmE+iI3Orhdc4UUnSw2Iw0jlw6qRvSfJhfUoZP2cuTdhEf3Oqj/r2IccsZ77wnE+S346+UAaaItAqvfXZWY05vnzlnkjCz+J1/VtEWIRy3o/auDpGcsglvESj/UW19rHgtASt9YfSq4kxgDv7KAlMxv9HNQL72oj19OOb/cFOBN7shizDOypsf3uiZdfwhLs4/0NcWd6hZvSLjuTjsmIAVC9YEtVlIQwM6MeCqOgh7CJINK4+UzVgD9I4OnSNOeETvYCJbLNtoZt0UsBcA975BVFYWb4soRcuOAiResd48AwZmKXkxL5iyIEoyPrpaUmtX5myVePDGD3yJOvJfqt0Zd1rpxre/VooHEP8/eOVFAtrFGtPLIX3UJlqY/PMcIyLoxpaClJ+nY2kkznmsQhwUvsusOMPu44zlHCcSM+C6OUUNCQQoNCuF24h4LMSjp25EIxvZ92so6eDknosv37hpqqvEwGKo+hwXrNJk5ved8vhcv3wjiMl89Z97/9jL1dOY4SecefapCELpdQyVlDKVStyJin3IPtwrDBdRY+9LAk/Lk9zqhBWKFu1yuj3fj69Wcux4YWZ9fJU2nsbUcZSWaDoo3na8SVsAchzTXOl2VzqknSOHqqkgi8WzBcO5y9dwx/rChNw0JPN6EQKt9FFr29DtosacEp57o/85ZkIDUt68eNUODNqIWTyHUkRrIs9c5hVSp1QwGb9ercaAqjKD5CsVjmIqsogjFH9D6rYF/b4eShIv/X1+oByyI85JBehMcJcBIton728thrk+aHEyIccahJeool5cxpaW8reBknLm+nbmvHLPYu8xGzGgfxinvgU+pb9iNGOZ3p0nqaGpbY/4Przw6YZgnbuSV9I5lX3vScnGu+YHgc4HKyTz3ZzY8iI3KHyikBVleKL+ZPXGoBQsUHGIF3AJK6c9MIT3V37gWeLxv16YJXmGb8w+c/8fv9e+7H4OnpAxsTbTFYiaHQE5dkCH2cV36sHzn6wS/6OX//pLixZ6DlkGA+iMQU9KlsSG3BfPfwW10bN4DPQSs1WLrYWczBKlrS3shXUeJUAfMRBaG9Cww9HGsZpiyQBqOIxeEg56YcReDsjlQNhsLhaJmpekv/79Efm4AEm02noK6YVCLY9YY2Q3Wx13IAaI8DZZXl6p4gYCxATTvFmRCaSVg5LFbz+gxleZdrfWRT1fDZdDzsj0rBR4B18bm0kyW51tukneBk+PAncz5RujpXXsO3c2UayaksW01OKSM+Bwsmysj1pYDWHNgl0JCrKBkfGfJGPz37h3Yu07PZiQK3XDasGsdxcOtf+ac/Nm6H8em7J0q7UuvGtiltK/BL5eV+wBzMmqDc3miyU7whJvQcgkoyAMo7HEetUieoadgIzHdsJEJq+VgrOSCUfrKQcWf6YiQrWiu7DI55pZTBsE5sX5psjQh3XdYYpobUHDSYRNOjJRjc2zNSBo3K8/bEx+175PYTQNhteYTwkcUVooilB+xZGNv579j7c53KYiKN8LfN11+wBH/W5D/Ar9jMO3ZacuQGXlaTFFdm1iIerCGdEaipqohOxnlIxS8t9rCNcvMT6Fjy/p42HoYljrChAj1DtZGRhb6k0sLzja6/U05Q6Vu5nDvYdtqreg4HptSTkKAyYthgOYQxw+o4wYEi8wQ23YO5aIRPLsSAXrJBvWUxcflBGWPy9faCuNAORbpg+5WmjTmNqw0oBfML9WRKbLE2fCL9ArNykVc+9oqZctM3xpjUMjiSfGBeTus+z72gZuMvKqhXag7dW2vUWqnFT7/vgqG1hJVWqRxHEjVmNNViwtRceQu9MDkHDNPtJDnctbLPZOLgiAmH3LBS01P/kaMT61SQPqgjbCDEhVkWQzg/xGlYlldihZoA2bSwXw37oszRsU6RUMYMj71zEwJ4I1jFRQLYnmVEA1Xk4aHuivsGSB6rcWa5SJ7Zt8cQwHLQVAbSM8OmxvOx2D7xWTSW5B008ksWWKJKkx3jlnWDQl3s2Vx/COOdauqvfZkfTOZj/zjBAzmfKQfm1li5HsDiep+/Z9THXhZNop2WEFjF6kGAfKs4Vx72U+MdEJi1jBukxZup436cn58IzNopc2JMdCvceA0V+8w8NLEkrxSMyZsdbMA+KyIaip1k3g036sg2TTuC8fvnH5h/C2UUfvrSQxUplb3uKbRIlZuH5Q65jhfZ5/29EOO0jUNH3D2fybKNGmnlWIg8LLSChTcDxJI445svG2ZAB0UbtzlOL3tLVd26hyqgVU6gxF3yjCGG0f+KnSau9KEc3fDZaK3x9KnhOvhQa6gh/yGslO7lBVfj0AiRTv3habsgmeMRpKdYN1WVQY2Bd76PluqANVdc66qyZaaPB9HLnWkdS6tqzwZ38B7I+jau32rA32rA32rAv/zl3DE2yspok7DxC2DpvwdC3NcA9mElH9q4la20gKBHVgX+yBBePX8PWUB+Q5yLQYRMouyY53MxpFFkQ7wy7c7RB2yhUFCryb4WVJSL/Q6ADzK53zpmG7ftxn28BthWRwJmQqsbvinjTbh5Z6SdasH5vQWZU1VhHtR9QyRypt1hTKHODXVhKJHPOS0yK4ljaSYTW33SJWueHsHv8bgu60Q5cyqnCTVZ3yssHJ/YnPgY9PuBS+RNa7HEIfT83iFH2BKrxvNik+lKSZV3sy8UCda/Kiewrgne93pDWaBcPqvlBp4qeslzFkGWKw81nA6SRD1tMLGHzfHkHOLHwLGd9ZyIoD4j41qEmfUkPLKWTI0EozjKQNhxM266iNT2joTx178iJkJjtKhQUok5xYhHSihez6gqy/5gMh7DclHKu2E8nta9soZ6McDM3/BuYLWwHjttoRagqVZwQgVz1EbvcPnuI6/bjT4HXQ6YjTEB7hxvt8zyy5iIa0l3pqQ3DMCg1tgvvusX3rZX3JxXdr4uK8dkGFSFTXfq3jA6lWeqVCqN4hcqOyVfs29GY2Am2OiRzZekdbOIcZgSqhAnvo5yWplPHxzFc+ijSNqE77mlLSxREIZMLjSmTe45DAjHo1vUFb2eVl4Bohs6gtjhLkjpQT5AwK7xnj1wTQiCv3hBeIcHGpFvioAduO9xVMgOKEw5h/bFOZ+tRaxZQoUgChoraiMGtLnPJjfCpWC5btamqlZ/raRYES6ss+qR4fWtXErUpSsv7sEsjFrB3RntwtiC4KM/XLh/eeOXzwO7wb7vcRaPr1zblS1JrGobe2IbpVR6ErLaqMiAC9/x3COn9bq/saV7yJAg7UgV5FIYxXibr1xEqEjMf1yp2xWVINGWsiO0UOFtlxhwlsfQVihI2iSOEbVqN2ffo18cwziOEeoj2TB3dtljKKIS2YAqiQlHNfTcwlIvamQQq6m2DSKfATX7abXAr9GCyMGoQcyQsYarNQUKD6FLdK93RBSfew6NLLKfe1jeFUm3GHe25jxp4asYGTl61gpizkjsKDKvI9Nv2aKaDJqNJMUcMbwVoWs7X8/aC4tz4jhLoTWp51p3AUn3FU+8gtah5+BOYvg2bCCpAEwdbohPMKq1tCvPzGnxk7xV3RG55WvNN2h2EgL+revPDpj8DF1bQ4Hl4fxgKL9nLjz+PfPNRBMhOWBY0APv/GVNDFa2Uh4mauXhZWjlZIydYWQUYhFArca9HWy/2+mf37jdbny+v3ClUWdF24a2J5hCyQGJlnFaZlzswsfxzLCdn0eAEC8ejGTTCXYwZ8i4h0SYe4S8J7t8TLySwWDzVwwgCMlZMUeW/HdZkZwLJzeFBWCSk/uZDyMBxgCIenisvzuLVSfaHJ8Gt4l6wfpAa0WL0qfTkoXm6qjkVBmnlAYoQyJ+ljJwZshjq0MxbHgw+9wZRc9G/gR83E5mFhABaO64xOcTYIiem8Gyour5gE3reJ4MFcM9A+J9Ay9U289i6zjzDR4DJpXJZD1swXTAH0OtABC/nWINokCKnKyHzzcAYpH7YBbycVlf7/E9DjJCFTaT7QMQPrkrPjMK39iYOX+vu6OtMPTOwY23+45/+Qkx57k8cZ+D/dMTYs5G4Wkb3Hp8bpqbVikNcWX2AIFXaCUlQL0qwIRSlKHOWCycwzET3IQxwu/YiMDKs6ODBBwFBLoe2IwpeqVHY62VVi2GolRsBfGlr2gfUejEa43ndN93dG80LdRSE1xXhMazPLO3na918DQ3xlTeWoiqJX1xSfYN+QzI2rixZPHxGLx6/JybQw1wXQTwyQoD1plFVDb0QIalriH1AzBbTUyVEqF9IpDFuyzWtscA1TIgkbSbMPXT+zWWvwV4JweLEbS8f10ednFk4+bMsGIjNaYWA+G6+DDGSTL4Vq5oag5UlsIlGkcYj2dhGsWCITKLQoG7Pc42RRFPu4/1fEk5i9Pw9I1f1pO9d3kOsKj/PPjly9dgvNSGjDtNjE964SuTXSttdqYFs79JpWgJ9r4YaspT37m0yMt4GsYYhc9zhmKEtVZWw97zM97yvx6/SwtaK6KKVEXLoJXFYxJK2mlVFVRh+J3Nr9zv92Q4n4FIsb7GPJs78Y2efv3VK70svCx+ptnOSKafFMFGqodlUmpBNj+9vm/3r9nkC2NlGXgUYVFnwCBCmptHvXHrA10AnuwwO2aDTQu1Biio+ckN7VRRRAvVCu41fPjz7O1Mal0EjQp4FJHlFRVnMuIccz8VHi4Dr8EYmloR0tprhB2haDRjod4FSeWOqOPmHPJCFYl7JsrI3Iea9YI4WPmGFLdeUenvisi0PEFA172Tkwl67mlwFr6Lvb3qHRGlIJRUps8y0MznlKWk0ceAyaSiEqzVs4m0PQbHHqB0fK88gBnfmCoMc3QDb8ZxvzMkmJfula0WxC0HpANcgvHuwSyW/LcLZw2KBGmm7R/5w99u7E9X/st//m+M4WdGkVjBS2Ur6/WHT31rsadbKpLWue/ueJ4LdQqTiqCYOFqUoYNq6zlxpMQKt6yRJ86WPt2HvqvFLKwrahlMC1WmesXlQEs5rWhiz3fcDR+PAPll7bMIQMHIr9Cdogr36InHNYbH5oK2wo9/8wfe3t74LCNUTTboGujA5DHsljzLlO1UssdeWDMs+57fZ5w+6gKaxAFmnJWx/dzAw3n/rA9NIjza7c/aOPw1rt9qwN9qwN9qwL/89SuMUYTLjGFzFz9tXVwm2CNbad2gk61PDF4gQB13Z6qdAHos1vw6DysmzxqoMPMckhPocrHTtg8slL7PlbE5r8edX443VD/hUym1cvEW3IEWe/CzfGLOlU32HW/zSFub22lBuV83hl3on2+YPKf9ZAd13sbgUhpm0G1SbZwgL5AK/bQRlAAB3SZlkYzOftqTWAtzWqzpKZGLkpczg1haIq/lNpdyK5+bPpk2mSMyLBmWaylMLGeb79RASUSVAhqWfdUezxCthRLEFZVCK1sMHpK8Eq47GnuMP5T+a9ynBnXZE2fOIrKfynb3/s6GLPY1KEGgsqiBV50iEsB5MTtxCARGFg+xhQpt7CdpGosctSAd516ilmq7b+TyinjnPT4fszV/5FpZe6icc5/z+eW833jHWEPXhSHNZOhHTb7qjRM7q07LcydMpdbQ+KH4OCM7qzJ1UK+F7XdP/OlPf+J1Trb5mkOfyuvxypQZLj8+2O4X6p57MUKfMWBRi0H7E5VnNo5+UIYvV8xzjLyNesZ+9BxAay2UBnUXLqWGdSnxTNQSmONMq7beJ7cxA68Tzb4peoeSmKgtq3GfadslBLErbQizBifPAi2FOi+I3dHMtWHArFDTGnluhiWxMGpTp/NKl7AI3UTjbJaHusWEUDIAQ2cMmQRkZUn6FsMgVdAYGlwuFWbUJKMMbBFHlkpEAt8LEpadqlNxewDTZw3quLxbX6nCWnW5QBD28rKWaplzqF2o890C/gauzUoOl+J5yVY0LPF0YQyDow6mOPdPxo2Jf75z9Ro9+fyIvNzw4VAjV2sO4fYUFqeVyjUz8DpRDxbfuI4rc04+3C58enpijMEve5wjVhzdt8iWlTtFvguSqZQkqCmijVr3UCd5jYwyGzHoqQWVjaJK2yQHUYX7EUq6agc2ktTmgn053uHm4NkfiwjTH8/40qlo3RFV5nTc4v36DOJVCarriVc4YW2XUA/zmCHgWDMNnXCaJxu4oElCCuaDpC2ecvigVkDD4SK2eKOVDfE3yqzU0vOMXITkrK/cV+IljqMcSR4yluO3p+058lAYCjs1VXyhu4pLyhqyH4+zzANXByipQFImoxwxK8nPrkoQb1U17hsDEqfoEoKisshsgxCdwMOdjHBSW/XAw4Xgv7/+vIJJ9uCh+pJDRWjz+qGYKpZzE10FXE9wwN1xnYhlwPNq/qc8niZgro1jNQbG6R3+/loB0DY1kRs49M7PT3GDf/j3G8eL8J//7//My5++UGvlx883fvz+97TWuLQInrteKmIfIjMC5Q8rTPi6c7vd+OP4GWvKd99/5P6PbxwvXxNUUVpr9F75cjiXy4XSdmx3OiPYcUWz3giQSy0s9IYbYQUcwMJuawGGBK3VLQ6eEmzySdiO2LTwpnWJhjk9ZwfkYCoK6PBrfeO4hWVGGQM1pWpjpF8jE3zLEOuiDDqNmiBLNEIuBVT4WC6UYlyOzp2eNcAVtyM/73xAvccUFUADpIvaMKwDgonbAzAA1tHh2lmyv+O0hlBEg+dqMpgMSt3PgkNQROYpscfB9R7We+sgz8LtnsCdzAuXb00e6xVxCbtIc1Z4pXbnCKpzjFBTSj6k4zZj6JpFRjFOpuq6FyYTzS0srAvj668tnt/63Xfov7vw+R9feR4he/7pfoM//syHD4O9fUdNNX/RwcenSu+dW0+Vwy0+k2hMbiEVLREiCdCs5UER3sTNW2QGJNO93407sZGKKbf07XY9TpBlLA9QgX2E92yvWZgqyBAulwuzDz6/BQvjSKBfKgkkO99/9wPaQgVXNJQkqyk/3gS5fKAc4GPwyTt/V/+Gr7ev9B7P32u7xz6GIN4eIkx/2JMt0FN0nkOHlf/QBeY65MIXIr6XUExMBUauUX3nvyxhcXQw8BFAe3vHFIrf53h5ZZbVFE/myKwarico4nnf0SfKrFg3msfndxdjlrjvxttDMr8CZ3nGk60QFPvVcCfLzwF5/f+48P//vXa7MBVu9gpIBB165MCdTCcJ6xsIW9MA4mqcJ8AskvyHlTcUZ9FuJRt6OS3yluT2ZXfwz8hzge8Lf/9//QMiwh/u30OHl+MZEui6Xj7y3J+51oboHhaqXpGx4WPQCvzQo8n4WoXeOx9KYUqwBu+lQwJEvZAD9wlHFGyjDjztCNQ11r1e0GXToaGiUFXuBXRvFH3iSY2rXSgI99HTYk+53++8+C9n7onXGk23SIS/6zUKpZVP4RW3paKYqP568KBboe2T+lS4WoBsYwQQfUILGHEAACAASURBVBwHbxr2SYu5p/YWgzOCYXPTtAYTBZscaY/3y2Hol6/8AeHyQdi2DZHCEKP7wGTS7YhcDIlPthQY5DPcosDt1nFbVkIz6xA5h25qGyP9vSPTYVlJPAgX8Y0wXZEMDlZfjZjxtgYD6sk6h5nghjZn+zOS8//VV3cD35FkMYmE6qS5J2t7EYNyf9CVeeFnpkFc9YSMQnWy0c9B2sZSGS9xX5mcX1eO06KOBAG7GDXXllrkPZk7W+aKWXEqQinOi3R+/Lsf+ad/+ie+3N+iBtQtM7QEp2K2M4bjbJTSGMMwOSJ/iIYSyu+LPkGBMR3jhY/fNf5D/cQ//+ML4ziYBqVWRO+MPKtdgFroHCfohCnLqsSKMxOghxKErBk3w93ZLjtYNGdqhq4MpBwalALH6c3dsHOz00XZOm3V7v3A/CnB62wq1OgHwWDV2HPirMxaozSq9WSRT0Qi50nbhqtwfB2wb4xRwDpSjbo13JaV1DhtvdQ1MkqAMdKKEz0zV7VkHpf7AywuPeKW3GkSAwg3x/Qt313s9Y4zGiwmfbHM3xHF18L6Vq7fasDfasDfasC/+OXWUBzL83qWW4Kyqx+NoZsl4bMuRrAUdM44i1W55M/fCSv3MgkSAoE7LTXUcYaJhy1UPKuLYW/cair8Bmd+oFZ4rR0+FPTvGm8/3fiP//X/4W/tb/j973/P9A3VwCpkBkFnK8oPSRJqx8+Udk0m8h/pvfOFI2x6q/PqX2izZEaDMShoAZcLrTWQjfsRA9hSHipd0gJNpuCzMz2IwqUURoWhgplTR2Xgkdk1OxGDbhzLmk8aIvk0uMJIC6aS+FE3eu9x9o2wToaB7oFN7EV/dYZNN0LUkxZIpaKEVZG5wiagQpHKvR9UjT0grH3znMvPbSYp+leQmEf+hmZoYJCeMheJjY3YOxcR1rmzhrCyVH0AybpfOJe7Y/Ut7Yb8PPf8JAdAkLGXIijZ9W6/Gub8tS/xwFvaiHPnSCu3OCci13tKO8F+S7yw8rg3LkGBcGAFE4ls5yDXhYfNqryr69Y6wIOoTRATJDGoNMTh8Mm9xvP3u//9Ez8ff+J++5nt+MA44AsWw9V5hKJ223jZXrjMC7XWUGe2yFhq8kQphb/ZJyqVUQa34x/xS5xVI9f5G/BBjF9ePlOPGg4NIqjviG1UFcqq/wW6LZL5hVIK12vlqbyd9swd5+XlBW4TI56Re5IoACSVY2E7nj2EZEZ9MYrG3eybobOkrXesaaWCwraBjU4tv3AcB7M60yZj9iSnQKchR0RrrEFvKaEAXnVHb0K3wZxxPpd9UCzU79UbFei3gXBn33farswSZ91RoLDT1NnKhd4729gim8kMHZOSfdks8cwPW71uKONMFIqeZFKdD4FC2DstzHqR0n99fn4Ll2mjWcOyt15q0TIfAxAX5fUa7+W+H5QPldd557/98Sd673x6feF5PlNvladyZds2Ply+p92vXC4XLlfHSo9c1hJ5g4ydK58YPvh+vHE7MiOz/HPsWX7w9N0nti8Xbn//wld542qw7xv3e2eTRhkW1sm7J7YQzihFhOd5oZQ9SDkWQ405oGqhFaGpMPWe/Yxy2SPipfceVo430sUk6sFld9fTFaJyxDBnER56DnCK0c3CMn9FEohQUqwhLpQZ9Z7mnj4Z2IzBmNRC8ZU9lr3XtWB7EERqiRrQCQtcd6fVnSKFp8sTG2+8zgPhnfkLyuM0S0s+YCmkZW4sJxDxja2Ea86KfcHL2fvgz+czIPY4YyJuxnOfWVO4NaCuaDqiuA3MjqgBSvpAmGPrNLQLIontOLgro/R4F6rIvETvTg7D3BGNr/+Prj87YBI64OcAKTvgR+5SkKkCdHBH0u6guuCeHsEefz6OAzsbynuyHQLsiRncsv6hPERO9m/sCYU4jEWEY7vjRyyWVxrlo/J1u/O2d+a8UW/P7L2zSUwiJzPYQR6WdmVubBoektfjZ+ps/MuMm19LOQ8Td2eMDuZ4i6HJ7M5swuYBsolpsMpm+NOGTy2QbJjVhBWb3POt1lrPyb3RYtijBa+D2UH9Hj7PRO5QKIiC1TuG0bZC82iy8Q3VYHRP1ZCHasibNYdM4WN69h9IBTJLgm40icmwpA1/LOwEL0oPpgQ8GDiz4OXB6JOT/c5j0Y/lLSrnA7YKv653PBnrwyqNYK+ScvFYP8nW8JTt1gpZxOgMRRrEoHJZyeDx+6t0+vi2bByQgXl5N9SL9zrsUfhaIf1JY2jm7vjJ3A/we/gKsY7ncSq4VZbF4LKhFF3Dt0H59IHxk3N/HewlBqPdB2/9xpfxyqf9Q77GLXyu49WE5U0+ZyYBjNS64zKz4XKwwtzDeki1xvMsQI2w7s0LMiu3240pR3h+qkLztMwqSPoEt6phc6gRJItHuOrMxq21neuMIuxZo4iqT9fwL5fwZS2z4SbM6sk8g5rsmW02vIS9Q9PG7mEsdhFnivPmICxbNcMSIF+ATdgyrqyY/E8WvQGuW2aPBaLo8lAkCpExJusZcj3ZkV7C+rNwx2uEa6LGnEtmmywnGafFlKmhJZo6sTxM5JEVUExxLYgWxENhqGXQLbd034LVCQnU5WB4ZfnIOxls5luEjcw3xLIDkIPieoKZZ86fvAtRhxN8iH0598HFPjU7Qez1syKTLssjfCBpz3rugXLwuiV4cBHsB3h7e6V9juac3rn0OGP2cmXUYHjVuqEqYb+Xz3Wjslswip7fNtwbL+XgbYvP9V7CshWRh3UtRHNP2HSoKToFt8oUzRy+zLvpBYoji2lZCnLNgVQRaqmU9N+e5U6RyjyeziLm7hCqFkUmlLao5w8pdzPOM2YkeWSBU5WGRAAMKg2XjpTJ/rSzXZ1yf8W3Fky76fBOKq5VkbcvSBF6T7A+P1cRRUvh9vOd4fDjj8/gyiYV90mdlTor8/IZEowMRlHuF2tApiOsYBQiL2kNCZJpR8XLqn9uzHGj1hpSfLMAddc1SxSKAvP01+5Y7usRCbHFR1+DaSXOGZL8LVxCWNigK6Mn/n8aV5zgZl2g67LDmZP1BIoGZyvOMHLTmb92gVmWFu/dbPNvjSyBY/+M/x8tTdpiqZ332XKQUHxgCeLIBeb9mfKh0b90BgOpP6D3hiBU17BTXFk9FtmWzQtmYeVSPcJpm67PuXCpT6Ho2Q++/x5eX1/D6tBn2BWFOThzTva65ZBbsy6urAl1U00wJr7e0xNcJfLHxGe8FoTuRzQlwCEH0+Y5vAWotp1WWWQmqKjhFntW08ocyYbNM7FImHmpeACM+fBWoGhB3cJSOT/5WmqcryaPJvIOqGMDuI60Ho3shj5fGbKIQzG4iyyCmrz/cdpq4DWwbIdS/GGDUWJYJkgo2d+pDoYObNVI7ueQchFaY/v5tsCF32rA32rA32rAv/wV9yNqGIh74DiqSXC0sHw5FeFZs6jVzHiIoe3KNqkeQ5rAVfJZS2IkPLISTBRNFakr0X+6n6qESihGRYRRJ297DFguTxeaPNP/NLl/feXLy8+gH7l8vfDhw8Y0Q1tF/QNGDPOe+vd8xwiAsT4xfNC1x/O1V4wblrZm2BsiFTk2bCuYgrJj3tFTdSVJD0+LwLQuBWBGVoeqJMYR58OGxFkyJ3dPtcDCSQh3AMmf0wSjWCo/DXIPTIY+MJ5unapRIa5Ll7IphPmhIqJgnkpgF7ZZoE+kWWRaeo0hkHiws9d5QOAkUx82skVmDBfgHPQgLdxr1k/Z2luX4lijni3BSyukTaWFWsSLYrYUIkDeaZGMOvConc5bvHLigvEBOpjf0HM1Fjk4iXXJv8PILCEc5EByQHRmrvPA/JDyyDVbeJgfqZAk86dW7Mai9EM/75OdtotBn4hab2Vbulb6TPWAKN///nv6H7+ctbrOzv0eZ9ebzlhrX+5h9boVvBDEQ5GwgJWC8wNPHHTvfKhXPs/MO0yC4pY1oXdjHh25pJWg7+d6kcRJx0nCk8ywBamFTT5Gr5HPXxsbs9253yZzvLAZUTuL0m2d+zUymVTPXCQlh0h530b6yW3r4RqOtXQvKsbzp08cx0Engf0vX+gzstiYwmbxi84oEyQHrGGhaR42yEda0zIr6hcc6FjwNV3ZNkFZf5dw1RiVssfr7x73pmuuG7d/lWV2CWGJRkKe67JqW8qupU50NMl+7v1US40UIog81uW3cqlsocjXNexYanALJw5VTN7oqdZ8McfVuX4q6K1yfLlxzDfm643L5cLQyBYb3vhggeOaGb+7fgyhQ+IagwFjR2bluV/5vsb660R9dxNoLeyvv1jh6B1MuIyKXAWqRr+QLgZuYSdaNPrdiUQOJI6MOGNW3lEpJQQnHuNMK4FhzzmpJYalL9xP635JtZp7KHAUDSJE9hNqgmoMOpvFAG3MgVn0n7K3UC3ipwK8lIJ7WD+aGbJNRJ2K0lLtJZL3n7A4LzUGtsvCTnJotWmDQWAuKL3FHrgyGl1gZi4kEDUCnLapVnpYp2YNP7PGXCMXk8jEdA+1VvVUd628UEkbSJwpk6JroL/qUj8zvkSFNkGHYyWH5ZoKNHdQ47RklrCsX09MfH2ctuXmDxvgP/dc/U8s8pK1uxzDkzknLgFcZREtmcGjy7LBFQj1U81QvffT43UzhWQvsm6WrXtyFrsTPRtGWawPOU5rAsSwGoXN7VIQceq/2/lyO6DCW3/jy+u/sI2Ncv/Atm3MS0kbh2CzbSX8INsezLLNw5++qfKFcTIywtikMuS7yHtS45gHJQG3Kk+IRGCyeTDwSkt/WQFPT/41fQS4W7CI4j5zHpgqyrZtVO4UJx8Kz9BXwn9cYA5FszAOIEh+xbDqM1gVRUI0tjg4Tlj4FOuUtM2LmU9DJRh/tUAEcWeT5Zxh5ssiz3SgHu6vEcq3/sJ2TsNXeG3RFh6z/pBDs4ZYRGGh7ywjQip89m646/l3JT1G0YdtnntkkLy/1P/tIeVf8zI0QN5k8iy7xtiEcjMQociWYZC57pXM+wLxgalEAKyFj65YRVdY+vv7kPf6VjrfXeD7v/0e7Yr3AxPhZbwwx+TLcWMKXC4X9qJhBSmg0uj9wJJBFviTnLkkk5RK2h16wUXo0tEtmn6TBDy2cM4uW8P84Hb/SmvBuB4jbclyPagKpewBatyicKh75AOEhWKA23NOrpfvIj/CCl7XWiKejzkpKJN7BBNm4SNW8NnACtuoXKxifuFL6Nz5hdsJ9BRT6tqPUt5vPJ7hsOqP5nLEf+jEIRjDigA1Yg9IVvUgmaxxLcba+8EGCX7LDEupYIDnRyoFsoDw4lRPS4b8+jTLPVlhGpNUpRAFl1n4rcaecj8VLosVIh4sIclnbrHlNdlj0Yw/7Ji+hStMGHJ/kCxEk3H1CGC+ohqMnXW+xSFJ7kuA3s5NJz6PmowNECr/2svftEE2MremPP+40b8evH75nMH33/ORwRgHx8vkBw1b0qlGa42Pzx9ANMJv2anjhh3OUxZBP7bJrccZdKuwxBzL3z/YkBpFVT+oVGoCfnNOtM9wV3JnULDpocyQiZQEslMVpK5YbXlGR0DsbkLtkdsRORK51so885i6Gm7GlpZxK3cIFd4JXOhqbF5g7XVeKAqSwKl7KGPsONA+qLpCnYO59+ESb36MEVYAL6kySXILduO4FW6vd+bH8CDvagFKFvKFBEAZRXB4ha/LfbCyfSI7JzJ5ynpfYkgyKd2VRqV4icLXZxaWec7n2lrB6sEUt/MZ1vlIFopQUwc2ZH47jVA02v0EPxdjdNke8/+y9zY9diRJut5j5u4R52QyyarqnumBAEkXWuoP6P+vtRagxRUGkDRz1equ6a4iM885Ee5mWph5RHKkKUDAzG0uGADR7CKZeTLCw93stfcjiS/Dwx7YmRZPsVBjQHvD0spp2gQFSDe+2tOAr4Yl81K9x34rvAtMjX1JDnryfJdndoadRb063Xe0CfUSZ4qNjrEgwC4VIUDs4sZwQ81waeHpLY4XwUoqsBVKeWO3rFPEKLVyfXrisjyn3/hGrQ0QugkyZlB4NrwObhaAsGuyhLPGLsTAduZtagy6Zm0Y9zS8+H2ylnJfHghkE2JiiGquW4+vlc2f5XAd4qxt+FF/eOaTdmkR+uuFyY5SNarWr4Lkw787H5+AjQBPh+44g9Eqro/jPR4JJGh6w9uw4zy9DMU13mXN8w3OMHVjOe2YpCe2cNo4iw2KLMdngyAPvH/Hv4Xrew34vQb8XgP++19KDJmmbZke3pj92Euatnf2/ieZwzNvaqghdhJETWKIkFhxvKGHHdNU2Z5nuViNDBWgjqxLZKcf+IhDeeDq3Msr+7Jxu2y0N+XWdxiwrs/0242CcBGliTB6yYyNjdUvqBd+8BcGgze/RY6fEcP8sQOF+wgbysX7cYaaRC5L/Pyav8I+SVUzlyaLzEGeu4XFHfcT94l1Ay2taIePdFc5CTtao25zwk5NJbJYag3A0Wxj0+2oDUwc6+cat9biPNYA2V2i7/dmmDjVKk0vIIXGQp+focbDqgg1Ca7bV3VzvHfFBpZ157SethIWRvP5TuXNgYc5lAmwOTSSZZ574D628122UHCqhL2tWeQYzdqEd19XZhYLX59ff+srsnY67jMvKfYmH9kmuScp2I6/Pwl+YbWmDFU0a4iRJKQg1Uw7XjuxndznDKXm0ADkKxwn1p6dfZ30yAWRyEOrz1de21/YbWagPbBxZRe4bzcWFm63WwDeIiyqNJl5Q0rxQjXjRVY2hKsstB57wNCzxjVRdnOKCfsWtuqlPShDGSP7guPSvDsVLEBib6kOIGxI1+uFxhOP+kAdbrdQOA2NWhGCOJMwNc7MQBS2d1haneWCTyBb0BFErV0bQ3fKpTH6TpXCT7//kfs9SV4PZRpPGJN0UFIBOLAKfYTN5bEN7pVODBoWOnrf6fedz/cde4YPf3g+LCjrokBHZND7hmUWoPoaJCfZEI26B4s9SfyO8i7nK2tX8iyTKuyT0GaNoSNrlHmdhK5v5eoe+paR5CKZShMp1FTfaA5zwOklZ2mfLtQ9BtWvf3yjbgPTDdPBPgpQGTjNGru+UL4oT09PrJcgE6gtiD0oLrT+xA85HHnljV0r/7Lf4jnVyj42bn7DML484mxcNHqcnYHqI4hopSAlesCCwz7SySHIRmOMqL0gLDLnApOp0JFUEDtrFSCU81V6rD0PBWORwqCGCtFCGRSc4LDth5lBOV1mjqIqM2bzHcp+vGrFNG3pVA7SsFj0R0Urw5PYoNmDSXy+IHGBDo9f1TmyvqedJAPkEfu9L+fAJd9V98ii1iQZnHE4Ocx3pcsk526oBymSme8bI7Bj4H+eG1kDW00iVNTrUiuDtCInSEKD+ecLKtP9YRJCU11PFrVHvzJxd34z3/Y3B0zBVNjCx1aEKB3k3Z9OtmBOk0/uHZWePzRH2LGRjEztRNixozYO1u/hlwnIBCLwQ2A2w40rdgadS0FS/h6DJuPpxxcef9l5fX3lsj3xaew8HoOHBgh0f11oraBN0bXgviA4175Su/LkF4KpLiCdPgNDRwx27uOB9B7DqiFgnSIF2R4seHjRs+VLt2Di0djb9IU8C+CYcEaR22Uc0vxQTQrNV5A7ZiN87yPpC+nB8sa3I+BXHPq2ZxE8c48Gq1To8fTWNeXN40EphU2VWkE1LGwil2kcZafIBdfwYzQI8DU+YTynd7I79Xq2XGnzYGM5ZHuzQIEzjDogh2Anqizs+QWKxWoa/i580znYI4PwZBa5Ix72OOrgegIfwWZxNK1UvpXLxRKge1dcaYQIT0adEM813uv4mYMlHvcqUukDVCjJfgywKooP0Y6NyWjJ/y0D08Hzpyf2n3/l/ksc+LLfcTHe9tvRKOu10XwOe+Ot3zRC71WVy2ih5sMP8Nr2jiUQLLXgaYHjJcOPCeWfqGOmXJ8+HvdkaTD6FqvBjNGMS32Owe+0P2lObSE5Zx+U6Q9M+PmyS+RmSDQEIy1JrMfhLMwQZj18+lWVReBSFVkbV3kJIL3cj7NJnSOMWpIwgxVc57R/uqvC5FcV68d/KjaONUwGO9u73dIlFCihGplZJc4yoiDFl/ABdz+H8OyYDLo7MipdZpOSLDKLonQYsW8n45lk1Kqkh+9sso+Bb3x+K5FP4h7MoYORmWsBccyf/v8s+/8qV3EL5rc7pJ1X5zzoZu6BClidnvbjIAEYUOQ5hwIdLXMfbcecZCozNIuJ4kKXBUQYZYOnynVd4bPwy59+4dIWSodt7Dx3QfVnvHzERKnDeF4uaIkBu3vFu6LeeMrwymE33jQ8kz/bxr3c82dJxbA5zZKZPQG1UsDucQ+6M8oEjQbS4ieJsFZoe3rKJ3HE6mntJa1QZEN7xR6Fvj3wkaCVFvYpvqolfOdNsTEiD8+Elk1ln+8SJZS+EHsYc2+P2qBSGVSWuoTXdw1gei0ZVNsNyaZqaRceb7EHYJfwQh/CXgbFH2m9GifZzCmIJz1AMldDEmDymsoUOwF8KpoeyiahmjCJItLdKWPBZMEHDH2Ld9Mrkqw6tRoEkz6OYOJqwmFBFDTG+P7ZrMeKfS/j+Vtfhklh6lcm26rLzrTUCVZwDC0miDpcD9VR5CnuUQPNuscnezyYbLP2m5ZSJl8PLU4gbw6CjcUKbmEVKfPcz2K3JsEnvmY0Q16F8lzpj8Hj1XhKBZ/Lg95LWAcQORTVFR89PkdVyiXYdXsW67UWah/sGYZe2hV0YEuoTAJGjyJ+Dq+DXBTnowJSMqhWRrKejVENkfZuiBTNx8gwdy9g+2SVRtCu9YEnM68JuMUZWrhEA+v9OAt32TFyQNDfUFWGNKQtjN5RD/u7sGnumA9gPe6va0nQHASje6clC94yS64TFgs7kU0w3zsEujije9YDZ1031RGj1gRzjb0kg2+iusDgjtS5l01QXwm1BcDKSHLbgS1nE/stXd9rwO814Pca8N//EtY8adMiKQdFPdUuU2EWdZxTEkeoKctwd3qNftKM0xYxa6t5ZiFn3RL/shzvWKEfRIiew3IXOZSnHhwARJVHG3hVyrNy/9y5jy8s+8L6+glDubSF/nbn+dMzh+tKb1z0yuIrr+NXQHnaKjcJM9exFO4jiDCtv0X+RX1i0YFKZx0ds7D7dw8gVhNUlwgDizXgGjiLO2I7qMQQWwXMc1hagqgrhTGyz/Z+YLlB4rDDri+GbT0IP0IoxLd4L7U79B1v5bQY8lDqRyB7gISt2WHfOkLihDOocqFKgG4TK4JpG+3MLkD8ysz0M0J9HgPT3MP8flRg7jGoC6JaKp+kH0SZgtHSits8yErNlsM+OADz3K/zbd+9c6iLzY8+4qvrG1IwmQwM4V+zNIY7JWuU4UFinkN2IPYPSxcjs3eY3sRwRuZuJ7k4lWR7iuoMo76rhecZ3j1t4fIZxtda2PMvbDKQS2WvZ95jV0O3DZfOGL+y9Rb54hIZMcsSqt14zpVWGoONYgsN5YU13BBwHmqherM478a2o74w3Og2GP0e9uKucCgSog4speBp6+06lR2C1fihWyk073RvXJ6f4r0x4218po+opZouQeq2cASSPG9tBJBdrR5DwKm6m8SH+DAd48xDUpXoRZck84ketmOWqjCphtMYDDxtbeNepd2hOyIWeVJD2dfoq1ThdTcufcVr7B172ei9B35pkZmrwxk1iBiFBfOwZlUkstW8UnygomyyYJkXeFhJqlISU6TsJwlwnrDu+LFuvpEr8VKZTgw5SFmduI9pU285kL1Nd4alU5aF8vGC/PjG/sVCCd5vsYd//oI/x724XHZu2wOpBZMW/QIOKQpZ5YkqMbT4wTa2sfE2NkyFpTasPbg9GlaUVirWhfXxV9Z6wXxDy8qH5RrZnLVBqVQvISCQGLR0J9fxzLCLTjHO4j3JRHqQF+qlI8PRIoxOKGPxk6ypEcviEoOgSj16j1IquznSOIbh1uP86NMagVDBRi0oiEfOXxcCqxcBKdlP5Sg3SRWTyBe1ktO80RILUamUxPKHTMv3d1i/G32+j3LmfJvHmKjacuyNk6ipftaIMdCOP531xfuhe5GZGs6hJhXdGdkDOA+YPeewnNmsxz0Jo+6W+8ZGkKJW1DfcYoi21zmryQNeQjjyb12/OWCq9Q4ofcS3j78eN7dMJovXmBg6x/QrWDJZBA+h1GiSus9JmR8yaJMcMMChRinOIbuKlmRaAcV/C1/s/EGHHFYojxaN5+W58+N/d+H2z//Cr5//kf9y+8KyLNz9hXIv3Pqd5/aR5+dnnnVh0SsCXMdH6tj5vdz4pXxh33d+97tP/Od//McA7HpM1evyxH37wLJ0riv0AsuysKZs9I03rtcV9cFrf/BBWgBy8+ANOurxMyNTYljpaf0nxAHRWsHsegQMugiX9Ypf8uuY03SGxDlPlLCfyIOhu8MIkO7hxto+srQGWqmtsVxWpIQdiS6NZX2K3A+/UNx5Kh948y8MG+xlHAt3+knPcCW3yEXwDMzsx4sWzY3mizXVaLXHbxYZbCVBK+docg6rIXkwmZixNT1ycpsDrmy+mGuROyKw7tmky/up7rdxRexoQSzuUSmhqItgupyAa8jsY5N5jv/v23F/uoGOJe+rBoNIOtR+AhQZyjYkw74dbjzQqvBh4U2+JOtKke2Ny18v+NNPyVS88LLOIlq4Liuvv/zMcMdEeNPKwjVYCfn63vZBqRGsLcO45eBTZTLZBWQJADIBKxGhZmFa2vUMAJfCIxEibXMo6pScnHtxxgyztvjzTTpFUj2RIG801QMxxXbPwXRhDPLAKyz+wo/lJ978jc+6c6dwsRs919oodoARxWLncrkeFk9Djfu0zMj/Vs2pk+Wmgy7B6p6HWnBG5pA8ADa3CD4NkGFEMDphiVL7BMJDXWHeIuPlwDTqAboBeFVs+uMXS6CQw6ZFJQpnc6dLAFFxrywbhgEHsw8qAQRNP+gJKH9LkqLfCQAAIABJREFUl6kx8tAWicEHgLvwmGdTeaemlckaD8AUYHEB3+J98hqNjwAJlKoKkgDQhDS7NbROla8x7Tt//58+8ff/8Hv+z//5n/jd/iPssJmyPzpvb29cLzeu1ytgXJfG9Xqlj0GRZ7Q4a4k8ixde0EcUjNenv/C/7Z9xd+4alh6LvURRZ8alPHPffsE1rPkoxqv9mcslvMa9LqzLEyJQS0WQZHgHi2fshmk0HZJWXevygtVOXQprvwT4PAb6sMOTt3iqnpqztxiU7Y8tw6PhYu/UFzq9yIUxykEEMHeEleoOorS0VwGQ0WKfqiUZO8I2lKeXDDO9xr1qrbDVz2zbxtoWbh4AfC1PkYnjBnaLJ2eOJPnAx0ohWEp4hLSbcJ4zDirC6oKPJd8L5z6BrKEUFJMRwyURut4Y/bT9EBGkrWgfmefVTyvg3Kt9FL4ppl0W5f0YvE1Lk3bsNWcBfCqcqSOaJxF0LFR55v3fHjaYjMziMNpbfolx1JU1QZayXdLrOQKGQTApRyanoAkERcHt7uzFTvDPHH3asTUA265OH3fcLgxxmjmiDcTZ98g6avWK75L7fqXvcVasWf8MH/g6LewKq73LwiQGqWjukGqorog4XiXzdhTXaGyqzMZY8VIPIMDTFky0HvVTZWUjG54+QDRsKnMoVbXH0Nc1zyKjdGUyz2IYHrXj3Sp9N+TIWI09c5GCqdBk1k/jeO5N1sOqQmqo7/dquMSwztjp5ZXddt58Y2dnc6NnKCwjmlp3R3oMyptpWHclCLNNpm6GbrsYngMG08e/Ug9I5qTl1/d9ku6xBNr51kLT+V4Dfq8Bv9eA/xHXSALkVHdPGy8N6kP04MMoZc1hQqyfbR7EQPF64Bdm+W6ZpPVv2FDO/XjoZEXvIAnGJmgLMQQMcFfwfD46PK1cnbHE3vvy31+5vCz8/PPP/OnPg/HZeRpP/P76O1prfPn5wcd1jdzn8kTxQgH+oF+ScHHjr/bg8Xjw69X468jnbrAbNLkibjF+q4PnEkPtWi50BlLbYY2soox6WgQCbGbYmIQHZea1IJVaDCnQVqW6029vYddTCuKRzYLDA2PsjrcSVnYCS1H2qpH7l8rLW7/TcxjY1Gl6DXygZy32AFs8yV8N8SutrCzLG/f7nUUalUcQjoqjftoJiQjF7/TMgFYH0WntFvEDLgXpST5DD4uhTgTAQ6XzdtjAfik56HgkzlVPUFLEj2ESaYUVNkvTztXRw7I715xLqt2+jaskMfjMsdFj8DGVbEUklPyi9BxEa38cFpHiK9prgpfxdSPofhKGYhgfZ0T+uTvGVNpx2EodOKO3w7LJeTAyPPB2ib6o/v6FX//veA8+jYLXL+xmLG6hLrqsOA/6eGPzsBdWVawog522Xyj6RAE+yo2/b53H44Ftv0Zd4oI+7rz9/Gc+ffkJ+RTnug3lfuusPvBLfL6mBS1Rx5UWNaaYE9uUM0qnJOlhKwv1uXK9LCwvz4wxWN6uXO4ZO7L3yKxShZZqMIeSQPuepIroYZJYlPBjAOoVLAjllTiLHwy0RS+0rAUfMUQr/YltSwL5EMpScijtxxqIYZkcWFtpC14Ly7KgNTLWXh9/5tLirO1uaFO21w0tUYvusgUB48COFTfHfdC9I0pa1BpM4obYabErj8jrkhgKz9dn4o3NFMk8qm/l2mueVRaOHoWKFuXhJ/HSk+AoIofif7Q7/eMz66fKp+Xv+Kef/zM7II8L4kIfRr/deH0or28f+Omn37P3F5Zl4Xq9UpeCSZBXtSjXfG5/74Ohg4vAmxnP5SO/yMLr21+xrUJ5Yl1XSr3x4fknFl+4rLC2iDVZNbNeiwaR0DUUbrIRMSwXxsg+JJWDQ2sknrhzT9UZrBQxFmnca0d2x1OtFAPswH8dDyWPZg+oLVzCNDK5PIkJxp72nLFOg2y6ZzZnoaS17eaZ3yRCKQNzZ3MLYpFq4AVCYO4zV88rS3nG/cFFn7gS9t+3xIhqEgzjkqO1H3XLtQ5jqiyLH/XkVCVVF8Y7DHvuneMdOW+SV8tQ6iwGfdq6dpqvMYytS1hXjnGchcbGezXtrFcm6cLLPXKr3Bl6OS2fPfPgBOzdoP9fX785YMJrAHaTWaXp3ewhgT6Aez8LZoBh5wGrxCYBBDsG0gd4Thj3yKAAhk2GyeQYHV/+qzJWxWj5oN7LsZecrO96p7TG88vC5/bGdn9lu70iaglCrWwU+lDkAa3Gwbf0ivS0ZtA1lEH1QR93hkmE2ImwPx5UL6hEuKGsUKoySjB1LouG36hE1kV47ip7WjM19PTJH5aqoYKIYjoDDOOaC+FU5QTwVyyGPFZgnUWggF8voELLhktuD0aLF7TtC30RpAm1FoZCKyXiiko5mt5WBLGQq86XYxZjB8strxm+7e4Me4BeCGVrDsq8HcW4vnuuprOAyyKPfJly2j0llH0/ma4QmVnx29Mab8zZnfTj804PzAAtvp1iDTgYPZcJLsrJ8NIs5obvlMO+YYtzVYK17O5pFRA5D54ggrrnBh1WTKsFYHTClRb2EWK0q/CZGwg8p3rg9fYzRRQtHe2wlqdUQsxQTsGyyNfaworBxhmm1y5H4QXn87F8p1zPibu6JIgPQ0LiXVzCL9Ud3I414Ba8/q3AMrKIkE4ZyVKtsamrdXyyWAjlW/wuLM7GcNgGZSnhI5zsxsl4rbWyakFqY3l4xr/kBj/Xo89D7gzscx5HWPB7xtLJJnCKTC5WFE4FweS8r+Ij7pFHuGyln+wcG+fXyr3QvQVAMd+tDLWF3FdEqAmwmd+PVyjABcNlhH+zgNMPr2WXmRe3YcMysJsD9JlX8e0dsvxtXCPDvactymHrVTgGIcDBhtnnHqVysLZHDw/oOHxjjVwxdjFEHfFKT7u8nt+nsGHnwz68yjd9o35QxiVUPwD97ZX7HqDF6L/yeNy4tAv9YlAWUKXKIz6TLGERJ/CJD/TRue1vvPQobvan3Cu4494Ah/sMXQxW5zBDfUF7p6pSzdCR2VNpobXUFvuGw26DS1sQFyTBtyZwl0f8/GVB0zJNtIT3uKT1mypD4xxBQFc5vJTdJmPOEBdabUSAeBZHfYmwWYQDycv6IR9aMMclmLUky2jr0ETpPfzQWUGlclkrrB25xfc0/Ph1qF20Ml2GpyWKmCSrTIJp//7FS9BvPuyHjVPNNVVSaJJPnTKCKRugau4btlF8pGLDjmys3DKTZPOOlvQ3vmIvPvNv5vMygSV3NLdyvD+Wje+DexSjwJD9rOZyfyxjYCWbUnY0B5F+WOhO1i+Msp1qlONzDc6w57AJOIkkwmxBAMQvrC2IMFs17KL43dhLDs1ckVS4OVucqY87++US6nUV1jvoovQ6z4xYK+MxaFpY2no0NGMMGoU+z0WpHMMQyz3b7cwqKP0ISFeCTRjrcyoJ3581RpHMdGgF79P6KcYqXTgsq6fdQ6mRHRYWEcrQHsDw7mDOg/sB/lc01mSJM6jWio2Kz/yMUnEtuIbSMfLj4jNhIwYXXrExsNXZ945rPz3THdAtGrX8+XsNH2+RtBGS+danzqD48fuSzxZmXxCWXWOyilXBpu1YNj7ejnrzW7m+14Dfa8DvNeB/wJUZZpZDtCHnve3ZV1fXA9TZfdaK4+i7xTyAPTiepcoIG1NPFW+eNQfmUSSJsCA23uXNxKUuef8FJdS/QFhHuvMob6xPQhvC7S+v3Mcn7HHDH3/l+fmZH58K2+sa2d3LoF3ifev2FL29VFbd4pnXyDiL4PJUkHOn24oO46ZGGVHnXtLWKpR+M4c0sJzjbPVkUqeybdRzwBa4Rj+GTgIxrCqZI+ih1DSz07VoN1hiv3qUUDkyMr/Sk1AcRRg+jI5ljEDc07t2FloA/MOpe2RvPMsK9Ymf90Kj0q0zyja5Y+RML9jzFvQwUxiZKZZJiOEC8G6wcbx5ruEUK2EneKgP0sq6ZpGy2CUHl5GF4zKD2/OOmcbQiQCQZ6YaEgC4s3HuHH/7yyXtoYkasE68zn0+cYBj4FBTGXQvwuKTQLYfOYDzPnQdYXcrgWtFRlm8n+5ONeGR2I6LInkW2qzV2SHzSfB6kJDQC+bO+kF5+znzVt2ovQYQLVExPjAuY6OPjf0umK4x6K8dVOmrM92qr6PRVICCWtR5pcG2de73jXU8sH5nyOAiV8Q6+mwHQc2sHn3CzCJCtjj3RIAllKEiXHZFSzgDVG2gjccSdd2+7yjCYw/F7FRlxpDH0FJZWuYq9Y7brB/kGBCKcwyGZmRFQY/1R4HVwtViDrDiv1coBaFSc3JTc+DsopRLuGyIOFqFdV2pa5Dy9/uDqlvUfMMYYw97vJI9me/4kKyNa+CE77DHIYomaC4WeXfiHnaePnAf77BKDsvelqvNtJzv2Tdyufao3ZhEODuGEkZirrJBZj7XSZLyCnrH3PG14GvkYy4eOa+PLQiorTX6Dk/bC/KmtPuODfj04w+h8qRS4SA5Pu3RwzxYKbKBVlaHz4+dvg/2NUl07QlXR6qwtgXRHVGl2pXmgu6K1VxjGs8ghCLTBr9gNvOvBzXzVa8qaZM8UWKP6IEOqEddiUefL1kHTWKeh9W4WxBBrYCN6LOrzrpoC5zEiViA2cNlvdMMtjoPiVBWbn2gtTCGsYhipaOiNIt6FaIeaGgOoaK2Ezn/fGR+qryrF89d0CIn0p3hPSypOUlKI/tTPOpd/X8NSe2wTvZjOAta9rBgN2fz8G0JsU8Yl+6zbh1hbyqSURKJjc26VAd0Wr6Ke9TuwqG9N0nr3X/j+s0B03BBiSItWG75I4mF37NI/rdgZc1vM0PW562cNg1WEkxyo8+hE1DyQJr/oDpHsTvcD6RwAi+KhIyWWbhnqF4ehNWEUYzLxyuj3SCHLbceSqbX7QtuhbYIX+hclx9oLby51ZVqC099Z1jBXj7wGFFALf0e4MnjRivPLNIQKSxlpUrjIjVC0tvKksOsUoIhbjZCeqvh4W9pLSHujLEjEqHxhbAvEZ1sM4Jx4AlAaDAfJs2jkYAb8zkU1uWKJaO9jhbDJnH6tVDLJUpchyrKrsE+MZxhPQA9FbQovvm8ySDGKNs7v+BpaPxgygWLlokZJFvMEckAuxGAUGdJNk+uMdsy6FiADjJCfZ9yVvGTreEdkJNtCzCK4aOdw6bpGTsJVjHw/rautA/a6wl6DOfIJoBoQyT97WeWRVXNIEtAR3hrimQTFMPfI3eCUwXWkgVrCltNz+FFWWz7amOxHraSYwz2ZaBqqXwgpK9S2Xp8rW2/QxGu18pObOoXH+mzPBDNsBgHkQEz20Kj8RBNJg2c80NK/DhmmHAwNnd5JNPJjoGr9sqQRxSkotkESGZ7RcE5g72LGGOE/762gutASmXxQjGlF+XKE5flyqt84bbDsirS/LBYOUfccfAgr/QZnO2DGbDpzKBRQeW0hJzBlSfjCtTDiqhrNBruoBNw8MqM2nXGwd46MzcCyJ+hg1jPxjrsQosTTLK5GvKQw8MT+33/IuIUJvtSjgPY1XEbOMqQyVJ4d5jIt1WwmbdwEPVb7AWTDmJ+3HeY4JCHC3sezLPIoEjYdgBKsDQevkBQJbKhmXZnCX7J6Xktfsr2HzWa95efnrjfv4QCYr+wjVf2/sbafuTRO//y+S8sj4VuO9frlR9fXgBQNTCoxVn9QhPjw+ONF/3Evu+sqQDYmFkP8Lq9sZiiQ7AM36yXaGy6W/jgp00Xe9gaeMu3R4SmcuRsiEQDM6Si5Zrsa0OlUTVyWWxPpqvEuuoY1bPZdLCaYO8e76WZUImsFCsLWuJscLEoWvvA5HEQGsaIPUCsp6WY0pY5AApwIuyRQpG1PcCXeAD7HsoIpcaQQztDbuEdnxZd05bAsjmtLjGacMdZgsUNeJuhloMCOQSJOiW2z5qgpzEl8aYdt1CJzTNSCXuVYPxF8HMswxaMQYFvyc8r2oPIG3F3PM8ixbD8OYUMLZYEZ94NTyCqEs39ZQbE96a0cTaR+1SoxBfMYjkahyKCVTu+GsSMbzahkSAUHoOT3DSHLLFmd1yuDDdMhbIu7BpsthiAgaQdW+2ZW+QD6QTZ6NERJmgWag23hkqj1cgDc4kzrapSiiObs6LB9j+yv0INZCZxZvm0iZjlnOO+5+AziFwlk80noGdeSMeMzPJUHn1QTLOhEWqyOm02pCaohY/2nnkXca8HKJT9bAOGDJZjALAiFjUsGk1u0RgK1KIJ+gjdPWe+OZQdG8U7OsKmbhR/Z/sF0+B/ZpEOIVjiHuvtcBKTGETNnJ+4iwFkxuc/GdFhb5F2GnNocAxnIj/im7q+14Dfa0C+14D/3leL3Z45kBYPbMJljj8yoyifwTkomjB53r/8/ZGRZtEjxxbbT6ubqdAb44CMxD0G/XISQ1UEldnTtyPjJKxmYa+Ffelcfnfl85/eeP3ymZ0F7YXty8bVVkZzTDudyoc1rOeXkfnR9cIHES515Vf9zDY6BY+9uBQ2HC1bbC278fy4QhV2mXtxDes5EUQqZGagpPNKQdnSnaTZSV4QN6RMsCkHnW1HaIftUTGoUtAtzsoYogeRosjOTZwukU8EYL3AVESI8eQdtajVVBXpg74Zy7IgpWQNZ+iI4YT6QIlMHznIBuf75zyQHKZ1eeCpfjVP+39fcPYgLABFp7Xfa/xxDmVLFaSH2mMC43kzUe0J4vsBRkySW/zzd1mTRx01P2fD37+cf+NLXY89TTitvIpIZIzE30rilUTYN4EDjhxNmThlDoB8Dnr9tCAlLasdphXnrhw5lLgxbQ3lIAUYQjtV44cdXihxrh9WLs8XXl9fQymzlYME5Ti1BJHpvt/RVlm3LXugHAb1qGtqrZSx8CKNIcpnbwwf3B6D+y8bj9edce+MD49UpDWWutB6BW05/Jl7Uuy1oXCMPsB8ZrkkURzjyhqZL+z03hFzlqIUKpsbjxb9XNRnShenaZyAi9TIxdzPumeZqjIRHmJ4j0F01LpBUDqyYQ8vPY58my6RVieFIBNNC8ySZJIS6oiiDSnKy+8+HIQNVYWnGw++hBpKZ00XAgMk9umTv6B0C7xXlOP5m853L+px97NVKnvD6on9SQ6jLO0tdTgy/m0rr7/JZU7sSuceDKDNkFlzuFLHrAHnnnHnUTPbchGWH564//orPoJk8xgL7G/sXSj64PPnC/t+Y2kf6DZYr09cloaWElhA2hjjoXL/yJU+AnN4WloQ1NTxYfgIjLlRj/zl1S+sdQ2VOopIP4gvogpd0Rr9cY5c4tzMOqOW7JelI6Vie2fPweU6FrzEAG3mGkr2hoExTOBFDgFL9FbRC1kJMpWoR24TO0UcSSs4HTE3iO1244NEPabSQhAxDNMdYUBdQsUHx7keg/FKLcIqwuY76Hk+RmWhSajzYw87loAZKnFvpuoo7tBpQeeZ94QvxyFxqNTnCMdzADfnJuJ0G5js7DkUqqaMXihlQfz12DcLkY2IOH7QMnPEp+WYVeCFfcbdzD7S9CDL/H9dvzlgine7BFOAc8AjpTBmiOMEYNxPNpXAPmKzi/Dr9K6eB+wxs42PYG6o6OGHrOZHsFfMotOj8h2r5JhQeMF9Mm9iCKYFMOfpckU/rvBLLFDphf1xZ7TBKJ2tP3gtyvP2hWu5kiU/ZReqRx7Ej20gdmffOtu40lpjrTtP44FbBL7XppQq1LIEA04KtWYgZxVSucu+p/WFXBBS9pdh2DYCwFSJIu7YbS1f7OgoD2YURAE73M6GXbKEdlj7ymDwkA1KzlK9xt+PsV6Ah7vhQ2lNkRLNm5lRanpQXp8Q/xy32trp+ZhroVkCa+5YHYdd4WETIckAykNl85Ql5tcZCWQigvaCWsmfP7NEkJgIT6adT7vEnLp6AJnupF1DhqsdgKHy7rz8Ji7xADcNsuCZhyFHXlUYR2Zznp7tMoSS+QIbZJBcNk6eg8h374ilt3OvyYwY0aiaOa1+PBnk+cxs37g//kqRZ3Yt7H4N+ejItVCecX/NJrVgxdltRBC8DXZ2kJBTFwq2pHc1cgBknWkNckEO+48J2A5GAiQR/D0Z4BncrgEoBlDSmc96MqLFLEJb3YD7YT/TtVKaQAGTHVWPSimeBnil8oS5sZQPdFHqXigaxfW9xZ4liaB6fsYDL0PfYcKxTs3GYXMQ1lnzfYm/lSIWDMGlH5ahpLXk+4E9skGGKU/P/8WCnRTv9fw8wSgL5uyZQREsyfh5F4nBcygAkmlbPAsyDnDLpB5WRIYfn2Yvc9+340D/Vq5ja7RLVCHlHs9Kj8oG+ApXOYZNBQ7mSZH5lzXvSRS18TVOT9xy2DLxFTtq3pY9gbyXv/87bn/5NQb+dcenssNeGQZf9isNo78Jmziffrj+q8+3cO3X3GNf+AN3Nt+47blvtLCv2Pc9rEaIAN4nvx65HpSOOfRRaf2O1orM4rsb+5KgnZ6M6E0kB21yNPdmW6gR1CmXilpYIKCG1GAH7hJCAlTDxwnwJe0b9h1GZVgw1VeNveUh0czYbgeQ071k3oVDgZ2RSglLiT2Z2zfQruz7CAVQsk96c4xOt43xeEPNqLYy6rkYdDxyTSSIkPuBwPGzmNmhMNA9Sj8zi8xB/Ro8gHrkDJk7Ij2BxMlSlSN/wccTXmaoZjQHUqD/RsH2X/tKePoIwI7mTnDKuzyl+bPLYUnhB7ebfOHynua+KVSCUZYWWT3u/SQOhVG9ZeFdeE+iAZKIM/fkenzfg9VGNOeT3blVw4vi9zgfrbwDRl3xoVAKET5cYrjRF0SVUVoAdjaYav0tLYhHDtdKCdVNHR6s0BqAwcybNZlM0xi+jjL3CUcpVIs11UsywQWoBRP5SjmuAtOrPJT+UavGN3JcN4Yqg6wtIVQtM0PJHJP9VMyYBUtwKpT8XfPig94Hul6ZGZ0ugrYWmSIym0hA7oENmTE0B475+YpZ5lDN+u1cI1NBMv3xzYJxGGds/sxWGTr3QsWSFT0/r+lOxaKisjDDkncqQDM/ztVv5fpeA36vAb/XgP8Rl3LxHsAHsE/1FQEEAajYOTQ8JkkD8v7NOi+GCqnAcNCprObr8zmGiSeUUtIS3t2PrAIr5wBCtB8M4nmuehV6NsXrj0/8+s9vLNbRsSImfO5fuNiatdeVJ1eKNowFF6d64+4bIoVLFe7cKBQeNw8rpOUpFBCPjV4bH9oVZKFPG1kRRJ6C/ME97K08SRxZAyFgbmERmO/CfIXiHY3zfJULnS3Wi5cgZQB17ZSl0ns/nkV1Z1myZ+8zry8cAVQU98KGIC6srHneOFJaKns7a6l07/gwMKc/BHQPsF9PBdJUiyzjHdObwv6vaosh5JAj96as8feZ5SQRiwDO4pVKKP7bzBBSo43Mrc6zEE4VqeSZCwGQz6NqDtvlHcbx7VyhXhPRg2TsNo5BnVMPyGoqHvE7msS86nZgWlOdVSRyhI76cdpSHoDqWYt0OXOxhBW3+LNiJR1qggANJybJ1fnwwzOfb7+G8jWxJCP6h3t3ZOlhJ+4bTxrYm+Ix0DAwW+ldw0qMC907L2Xlvt8xufB5f7Btob7rblQBKrRrw7RTbaHWSDDtHnVQIQY9LtMuFYzI6IserNIzZxJKxFy0At0wG+jaKF1yD/fDiaJ7ZvbSkaXS5ML+SGWvTBVCDIhCTeI57Ir3wPKsdOnsAmOEumKCdSUVUPE95xrNM1Aj/7ZpQV0YW+SUerTXtOUp6kwRHrqAFrr54WxxqY0tltj5C+FQo/t+7J/mhZEKU82hy2CEcjRr+7ivzsj6YRdl/Q2lxd/icol3qKYr0zrt08pJcICsXUphnju+rWjmxT2Kwo8fGOxsI4YMy6PH2a0xwLztr0FM8HCT+PD4iMgLpSlue9QbDlPBemlPSFOkwz98+IF/9j9hfbCVUIttRdncqarIFv1JFaXVku5fEiIFFYZ3qEnwnASBMKPP4VA5MW9PUoYKMqJ3oDrDpkpu1ogd0cB41M+zWMRyz5UgtwqYV1yDkBUn/KytykEkrPl90SccpZace0jsVDrguqwMCVJdT4KFahJ7M+8wk6Wij2+xFjvLiRfJu/zld4P5WTeatKPGem9iUi2FPAMOuRmTwGJpmxf1+OngtSBaw0J2rjcVBkliy39vRG84GFQVZHx9FgrGINxxuniee+BeTvVj/7fHSL+tYNKe3uXxTWsWtmM4jJRbTvaKGS49Q5+NlljNjseBKhFgB7APZXqmq/RgamNMDlBaZwOphspw1Sl3HxY7kIiE5+OUoaaXI32wKYw++Ph3V7786Qv7Y2exUDr9+uX/Yit3HtuV6/WFVX5iOFzXZ9ydZ37iOiM72pU/fPo9f/7zn7mjbFvn1/ELpSu1KRd95n5/w31lbUuwqcsKXZBSaKUiz/H51ykrs45unW3bAnATiNDxQhn1q5fmgjMy3LJ3Y7cEM5LhU0WPqaWI00pYoYgGELroU3i2urOI4ha++aPG4AoUlhjmtAdYelWKG82UcbuFx79XWgIU7n6EBwprAGIC8MaUBE+Q1jOkWERCNusd6MeIsRKyzjEsmAfao8n2UOSaGUU5fFp1+lX6tG1Yk5ESRc4sUsQz88E7Rb6eGv+tL9GQ5x+Fls/ANWOUtL8iQMgAYNIvmh7MbA3P+iFROk+JYjGOTTg617SuzD0p7lGAE7sVntawP5GRh/DdsLHTt1957MJyfWIgXEv46a7rCnR63wMY9Q8UL+wJdI/bG1oFkY1lWagjgmQ7KyKw1oJTQnbuhOeoBAM6gK5ZYUApgveem3QwuANwOZvbIxjbV4qAloXOHcZAe8GzMFIBtQVBGUORUbMQCmsfGQv7FoZPH+SZRuUPyx+4WzDuer0fzHhkP5lmSb8ysYMd1/N/Te1g4XV/B4YmUz+UNj3LbzlCzmcmDF5p2SQP1YO9OhmtmozU+HMD2wJkSB9x1XpsogGb9sx5CGBBXFmSlWYeoCEkG989wd20ByE06062AAAgAElEQVRksgDLmJL+s0n7Vi7XO9hCmYwYy4F776fvtwawB8nMy5DRWQhPdn/YFc31M+jHAOHMDyyTsce78EY/mYmjRRbED7+78vI/fOSPf/wjbw/j6i+xrkesicf2GS877BvVC6/bTmuNJRUUJsE6AfjUf6KIsNnGoo3H48F/GV/iXJDC2+0X/HaFdRYPMEbBxIOx9nHl+SUCbae9gqodeSulKmOGDnvwesVb+Hu7sVijTfCSjXZZ2bbMnrFBE0VcUdeQfKcKBYmCM8g6sWvVIXgOoIpGbscmDUwDhEjblvh2WRtIoSMMC2BdL0opNc+KDWU9LKakG6WtVHEusmAYi8dwLr7YgJkDQgZ86wBux8/ffEFKxfcEtX1h2umpDCxtiabapsl6ADIu9yM/coJ7A0FZA/DizICYLCuTU4HwLVwuQmVgk/0uJ8jZM7vHWI577jnpadNqUIS1K3uJJmH0af/WozkioYs5FDrU6pXjPZV+DJhOHdPADvalHcVuJoZHHWI57AGgxu8vwVzrxY/MzroPhFdsQOEjRZx+eyCtZI6E0ulYtfD4xrk/4t+W0lh0Pd6lGQQvbTBqKABDaJT7ZhFclaYla1d4aGaCjFDHlZkN50ZRRRflUIynDXCci5HlJT3WejTXC3vuKzMfpRfDR+ReVRSxJfINSqw7rQstn4X0zthSlUgow+/3O8VHnP+1gMZ97dFHUuTkQ+3ScTGGd3oJIG4UR9IOp1djpC2UjLCiaSikhZ0X5eYzdygHLVIyGw/2sjN0D8Zdri+GIb2EzctXQbgneIp8Q7lmfK8Bv9eA32vA/4irC3QuQKhRJM/fKM9yQNb92GPnZfb1/jBStRLvJWFHeVjIQcthU89zp8t7BQuQysORwxUDdOZDuSd5V47e1MV5q/EO/fjDE3+tv/DYB5IWxNvnL/z++iPrunL98MKy/gNXguATLPIfcN14bA9eloVLebBtG6NXvny5M9obt/Z7Pn78iLpxf7shDstSWdeVy6WiGutDtQbonH33JB09JtN+EHWzZo6TxHqTBLMWN+p4zvtjp02hPCHARZKAlNen9YXb7ca+Z7bnMO4j1uCqwrV9YF3XsEcGdL1Qr+2oV+vFuYjw0DvN32goi4aypTOOwdDEJm41hhPzvJ4WVAchJUpZilaKF2xiGuOsga4WtoJHFhWwt3iXfBgj7U5FLkyFlKTSSWXEcEYkFPCTeD17lAFlvLtBf+NrcIL7w96/842S51O4O8SesB8Wdl/x+o77O8+nzmDKsdXPGqJyC3AaRy2dbESOe3ZY4Y3GpjN+wymWdt25bl9948dPz/zu8g9s/+sXpFXcjCpB4Bn9lXsPTTRWuJWwBNbMLorcddCqNHvi06Hi6uyy87/80z/yl//jT9T7xn6/017g5fnCIk+RjViewi5yWVhL5BEd95MA0NVIt4gShAMI27QOkuu9SsOrcReltJXVYTzu3O93KmE57lJpEn3M3NtKu7AusWbf9o6NIMeplMhNJAbvk/GjOlV9ytjCTvlwjfLC6R10rs25D84h4tg3uH5gf2vQGl7jPqo5vRm4slfj7X5HagEJlZWa4jO7jMAXowbM3Doz9Bi8ytEzzP3VscNuVK2ylzs5n4h7rsa9fVs2ycUMTMIGD+gtz1UJBU/UCI7WB6ZK2U9VyUaojT5fd9Y/PLOuOzZu3G436mXBFbaxc7HOvg22h3O9wrbd+fThE2YxlFuWhb7nMyoXRITmSuHK7y6/53/6H6/8+X//zJ/+9Cd67Syi4Dtj29nkzv36IertotRyCXylGlpaWqRmWpDnjBCDRdE2rUvTJWWMzHATqIrWPAu8Qbtj+FHDiq9RNzvxb+ZyFGX4oI9+ZB535+i9RTvzmI9STvNsj04prD8n0S4UVrVGtnNlDnoGtVb2A++pFK/07cHSKs8uDINtnEPz02a/U0YQY2cPpK5HD6DvNsw9s4gLDcs/UD3t+YGznsw8tYLxyFzujkfRV431PTHGk/iQXneufsQdDUIQAmSuLXQqPglPAtdDhHrWQr/FMfrtDCa7HIdrPJQE3zxuVjydJaVWAdy5O801AkbNAkTJkJ0+pazeQLZsjM7N6gABHcp4yluy0fVolROcMHREoGCxkwUYCsmYqlMC3GOtUJSytDj4x6Dujdv+mZD9Cl+eXrD7g55Bxc/tSq0/BNul3flvP/2O2x9/Zmx7MhwGwzv72Nj6AxdlOHzuNxZdKL1xqRdKqQytSG/phxwS3FoblB2poFscoL0Hr8+QbA5mAZsDmlKIefx5v4LFFzcuCsMEJUo5FmIwA4PFaTqA05bFk/khtNyyO54y0tElGpxSsJ4tk493MtXJcjubDaye/t359V12LO1j5rApPtcEjwqGREC07PRkljVJdq1osBEFvIzD9kXedcz2jnU22X1zQGlqLP7tFGswm7W490BYQ0lO6d2SiRjh1SogpYdXsemZ1QEww8GTOaYy/TodvAYTKpmtEMVEIWwk1Y2WMtuWmLgNZysWrC/buG83pIC2lYHz1AbtcmUbRu8bwmde91/ppkfhuE6mqa18qB/o5rQabIER2tHcAC3ZkU7VWWQ9wGuy1Ayrehwyqkq3gYzM7lKOzXKCk2OM8OV1T2l+XOXdehd3vA+8F3oF62H7RQL4xRuLCrVfKSwxBOjrQaU68gOwd4W2HntXT/Bv10q1YA0NhTEDdD2Ok+Z+yNZl7qfE+yvJWt9n8eSOJOPvUIHK+Gpj77Ss6OeA9fxzkXFK2iV+qVdMwkyklxtlnPwwESjj+WAr8M6TfqTVEmLINKj+hq69dDwDCGuZzc84OtoApXJYcYReHxwPwA8LhUNM4ScreA6UADaZvv2KzPvn747UBDpf2+CnH5642Ce2LztLNs9qC+bGPj5TO1Ch32487s7oQcqoVcMWtScjyYzVnimsfOgbT3Lll+2Nhwr7btxvGwvCo++Mcs0GurOWlXVZWfWZXeZgKX9iCfm4iLAPOUKH59At1Lb5s9aC9Gl1u0SOVQlLFSD9xgQbIFSKRDaMkD7IWpGyM8ZgexesIz7XeeQuVRVcWnren5veLDRFJdjzChRJ5axxBSJUObBwGZ2KY6WyjY1NzubFZYT6g3yvkxE0g3GLO2V6vM+6gopY2rzSESth2ZEDpl0cygNXjz3Oyf2YlPQvhy1PFz+s5EZNoE84cg2/ictrrva0OJzgrpbM9AkbCs29bIbaH3QhJ1j8Ygx73ziuZyXzzmZJ3lknz+uko3CQaTD5KpvzsE+YioYxB1Wkrc9kyoa91bIq8jlstxDBkilpNrA+kKVSu0f904RX2+i78GQtcol6At4S96faDI/NgSLtePYFItMMwTPfwms5apVaK6iG7VzaBgYgV8lACDxDcVVq3qMY0jHHC1PtZYKXOGOOGkgyc0Rgl2CVCyCzVpzrFGgyswI4BjS+C5sDfSCLhtpBcrBXapJNp5pTeVPYFDZxNvFg5icj3GUgVrAxKNPxwM/anxwsBqvX85nWsMvxqOldzoEwDtUrvSSjdZyhukcgrgzkG7KdhO814Pca8HsN+B9xKYaWzj4z/cjPSm6lY2BaD4LsVNdEXkSqjRjIiPU660Z7D3CKpTo5BlAQgpRp91WCKRlrPGuJSWtyD9a+JnFmKp+cEtakAroUyrOy3R7oHnVBL85nu7KZU+8Xbl9uiAnLamn7GFanbTgvy6Cpc9/vbLqy6c69vyF8Zh1hb9RaWJ9WqTRtrHWlXALLsRJ9fVjdpv2rFETmuxY5FE7kOrj0g2EOsPmJFcVKT9VDMtFFj2TNqAtG2FUWeQTp4l7wVNOpLLgXes+9qxRsgO1Gay0wHou4BtFQOje94mz5PUaq+ORUhuupDXQxyoigc7cYWokrmvuxF1imBYr6gXX1KomzLAyJuqEdI5V4L9SdveZAQZLcpkRt7/HU1TxQHxEkiSGuQtdv6L3SAjiWG5xPEFaIsHklVCt5e8tUu9OxM8Eqq7izfwqMLvdyW1htDnXTPkuOFMUYLmq8d2SNdXE5hvnohuW5YxLftWmQbC5PV/ynHftzjEi0z1w1QyTOlKsHCcclSDEquQda1l8maI+z9mP9gInxtC2M10HtFR+wb2H91fcbRY2ujbW2Q70784CqheJNC+wl7kZBWVLNs2uoDIqWUOsBu4WCNBQalUvRUM7rJDTK8Wum+IjAXrJOGkHKiXPSmUoOz1pTZeA6sw9jyNx7P4ev06khz9aZJfPIuupqMWwtqpTe2csNLZHzE84VPboHF9gHS57X1VoO6B8seVg9aPR0BJEsdkSXILcDVuSwIDM77dQlYUBTDneFmu+suQf++E1dUftYkvLETqep+Qa5DqoUbNiJj5uB3iNryAtjcZZPhfq48Msff0HrNYk5g2ELgkfkib0iLNz3O0Wv7LrThmLrAjiyS+zN1qBEPfn8/MJ/+m/+jnH7lb8Mp1bldu8sFWrLZ3cHXwq0yLkUr1QC+/dS2LMemiW4OEcmtRSOcyNw/BgamTilKDsjhrw5hA2hgR3ntlBo86xxgwKjZ96yG17SoSQJPdNGsdoCHsOfabenrvRZz5VQYgZJoLENi8+1lIhwOUhO4FpxHTEkFUXKzEJ1vOzsqWYqplADRyljifeas9+DLbAn96Nf/H/Ye79fyZLjzu8TkXlOVd3u6R6SI2olUoR+rHYlYBcGbPjRr37z/yw/CYZhL2xYu8I+2JRWlEhqhxxOd99bdTIzwg8RmVXNpWgDpsV+mAOQM9Pd93bdc/JkRnzj++NWBqXfyTBlkn8JTH1v9T6wLwdtZM5VEkKHclfGA7FjxlA9SBVCTQFP1IR5vyah0QaSA6bo56ewZOL/d7eyX3X92gGT6IjQVZ/N+n0qVybg4gf68G0cGOmvL2mXsdjHWeGq7B8V/jabxQkjPIB0EWo7pbOxaapv648OTcsB98V+7WzcCrgW5Ng4tIeTQttSOqeob3hXjuPgw4ewfNjKW8q5MkrlkkXTGef3vv07/MP+n3h/fYe4cJMXSn9FvV3Z9eC43vBh1E3ZtmDH9k0xddQHJ2q85D2KK1HlVF+j3lCfrJdpwZS3eIIMGj75AmwaEvdQc+lqSItHgyQeEBDEAWDW8WK0OZgDtroj4lTPzczCh1LdaarsD/kXYs6uT8j4Mgqr6e1AsDjigz74qItEALV7bG5jwGmjDk8LoY+nr3EpZQYRSsMnCwXyfuha1GVUTI41tY0/ckK5v0yz4J/2KvjHQ8xP4WrZ/y9P9myCwtZmKrPqKkrnxL7ruzUwVISSNj8Dj18cD7ZFeFChAMv3s0uDgGBRrYx5sGmGi24vaKuYdW5ycOs3+nOnvhZ0C4/7vcJVBp3w5Aaw3GFKKVgJcMD2sooR02Aqh19wgrcU8HzW02rHt1hjEqycUmY2V/wUQxsXCauwhi3W9pR8Dn+JgF48AhQzm8vkiDBD0czICD6nekHsbjUkIpx5FdZdtnHyDYZh0tOO5c40llTtxc8I7UHTKiJU2z7KnVBCtl18suAy3DEHo8hktQZo1kWWl7SPU4AQIuy5rod0hGkltGOjr+caLK4rC7yiRU6FhWQ/1sZBZJ6Bmj6EjSZT7Zdemcn+k4kauzLKx3lov+3LNcy7msxDljgnRllssOG+ttkJ8JYRu6YA7pWRocXTkkZGFBmlKGay2OLMoQh1sVsf9/BRptrSOfYT+7dfo8+dlx8eCSBlcyUXrEkUGzYYz8/U0wmvG44wtixiRFE/U45oXl97o4/O69sTtcIYyk+vzu3WeHraOLyHNVtRpJwCIHKPV0xYKgBUQw0S/7EacZnFhJcoxlQp24jPCUhPizBg5NngHhDmuh7e30BZjFEDXBW7nwPTS1mGPZwN2dvm1weTdiTwHY2+S48BYRZJPiyyP+YzcKNbNH4qlaHKIdPPudBTuTGbVkGo+bmqbZQZbt9LMpI7gxiuDBW09AAZPWw9XAivb3dUZ26TYFnAlcHdymMMTHOtSvjuq31aYHgvYcU0hw7Lx3w8x04hgB7IOK8BCJDZVckYV2OGg94Lt/5Q59mDZ3X+itxts2KnTPAgCSYuY/3+0H5fZnmVB+KLrgFG1CdmERo+wVezvthxRzK2+wi7vxsHZ4SnbQ9mtTo6BmJGpWKHIbVgFmt/quurN1oJIF9MKTVehQD/41xbq1TqehcOiU5ZBFSnBYJSCDAk/hfAmsoOYmHJY5H5YFRq73nfo66O7JR8Zx8slqvFkKwhbGO+6yxXgp4sOsSJUqODhSVlrRXZE1TvLZvHeBZdG6N0GtEUu0nUGhoUKhdHK8jYs7kalLmu1Bk2G5r0+ZY4fxyneQVta94bYEdB114iD/XeZJ7v/HJ252/7+qYG/KYG/KYG/M1fYzO6RIcKMD3c5hIKALvE2gDqBH1lx5g5ZYNNYogy7SoRguDokRuzjSAqTCePoB/HuT6EVPLeQc1QEaZ9jkcGIEzj2LCtIvfrhqHnUNKoD47jCJvQ0bjdjGe58PXxQq/Ca9k4qyJ2xkxiENs7b06vePnqPQ0LVfmm6Cbx/hfl0Ipo5Wk7UfczsiumFSlhcVRLnA299/XPfRjD4v4GmSL2plK3NeSN9WOoBOmjuyPT9p48r4tS5+LyjvuRNl1PuDtXvaVdoOC+Qc9CPt8122PY4SVt/sc1AcI461VTXSTCoW2FrK8Mn8wf84f3DBEk1aDil3sezYCSe1xw8TMDzqJ+9tJpI8+mfJZVOoeEhdAjeUNHuvlYxVO5ZqQi3qMuDIKBsMKsP4GrSPB15oAZlaWs9cypDdr1rMeCDBDZjnXdeyPytkcOp8RHsgSCcDwzMedZ4g/7KRI0I8+/Q1VpBbaszw8xygMBXkQx7dxqZ9sEOddlAzuVVqFLCOD6EOfGEe5JKFUrQx0tkaP1eihbmzhVDF1e+YnLCLVRwbm58twdLRtVdk51Q6ogVdhKqP1iQNrj/hFkBgCxGL4JqWTVGMj4wvlYe4kD29OFSy3Iy5H55kKbBATVBQCT92tmwAZxR+45l/N+lkpPizG003qQsxkNxzHZ4xmt3izrhuke1YWS5Jirwis5RR6xxT4r0mINuK089uvR0X3mp/cHskZfZ40R77MXi5wms7XnBvEz7XQfzyqvkQGqaXGf62cSSz+Vq3r0B9PFojz0fXcXKyd637BYBLCNlV+6yUC3E0/7E2UI8v4r2odOkVB8tuppCay4GIc1Xh0vVM7Uqjzb4PU2M5AybsQc2FFXNm18/w+/z7VfKf/4c67XK8+3D7zYxskqx3HmNg6ejxdk20Pl7sLwDZGKyMg14oxseIr5ehcFVoRJTWzGVRiLoCBU3VCiTmujcUzXkSQ0NcISebMkGNnI894IR5nwohkSw1Mzg8wClSpsUYrlZ0qilCs2YNvuThoUD6xBgJHryzZkBDHP64nWBTNnbEcOTj2/PvLe9lT2LqcvU5pmfSK6yAbz76wjBkeWmaRbi5/7BIlHwPAPaNH12VWVsQmjd6oPeu4Lmxmjhz3htDkVv4JeA7v3yNaNtZB7gQ9mXSO+572J2s/dY8/9pd77ozX+614A94Dp7ZfeSyG9FLNqa1nY9hwhiyu3Ek1P9Hxz85zfoEeRN6eMyXJR0/umII9yxjktfAhGfPhe88ewnNarH7idAeHWrhw9QxjF2PaC9QPZhM5Btcr15R2jXzmhbAj7046XPQ7MPvjTH/wJ7f2Nl//933G9XpPh03i+vYO28+r0NsLZ5UTpRukd6zekFGDDswApotEUijIE6n7CShSdRRwdskJpI6dBoIRPpLuHfcSpBntqDu3U8g9LHIgeh0gTw6vg3Slj+nM/NEAZfrr79FAHccfyBZwBYOeycSobLy8vRP5Ci5chQZJ4WDnMsUqrUVgOM5xg6YqVBbyWBD/matAHoFUtDuf5d0MATXMaaxLSzfmyhT3KjUIMLHWED+/9c3G/R5/SNQPI80At6bMffXfKlDWYYQumE9BRFwtOcMhNIFgP+b3l7hM9Q9g1mZGWcuMxRgRELpvKbPhHYYijRZB247APbGXjNmKIedILtTyhctDbL2gSjbrns6h7QbYL275z1jNbjUKzinLaTx/fgxIbsaRfq+GIFjSZhaPECp81gZlxligSzTw87Qu4GWUyb467EsGAyMtQqhDvlzi6Z6OyxTcXVbQ6pO1HEaWgPI3KeT9Bd57ajesMUhNJUMzjwEKiYM7rXhZ09gdv0lGSSZnsYocIMIXoVggG+m2xOQZHqgHFG5L/3vL5nx1aKkPdbzAZ3DpzK1iASHND09d6yACBZpINELhtbBRKqfQs4sSv6+dy9WB8EOwSCPvU66/Xv/7zX2KYBwNRkCWTNo/hNOQ7t96V+Q9dmS5xfmh4g3P/fUkVRimFm83cwdzDsgCcCon7FX/uKs4uN8pT4bPvvuUnf/dDSil0j+J68yPZosaTwfUlQkxF0gJo2zE/MnSyolkQPvkFCvyufItrd263G3//ohyHYZujF00A2ThLR0pw1+lQt7AMExG0CF3qyry7KwDiX4qN9V6IjVgnveN69+WO+zED0dNiq9b0MTeKnrLpH6gLVQudzKOahWWCyWXEs7C8f7OoCf/ygie7CGKdbwa2pWpDjUcZuZXI4OtFOSZDkRKWNwLTekzz3KiD9HQXkM5mqUwqaWkyPZ0TxlbbYYIrxHuxvKKpiMa7XjLsvpWDOu3kGIutWRJ8OvTOiv4UruId8wfbXgmbnyG6pP9h5xLgyEhwYKAJyEAMAj8uIgP0mSzFuyrgvoOCz4D1B+vbZXtmuuJIxe6q7PvV+NgWbVqQBWGnnHZGZrSZDkZ6mtuIzLLCNewdrUPbcDU23ahHqvTFI9AYKEdfOv9lHUWlNjL/Z6C+R818ivW2ybbsBJURijwzTrpxo2fDEGsq1HzJplfFs6EqUnHvXOqWobZhLzQe1r8A1ZagKwafuT4pYD4iGH3ey8yXUVU037GyVbYWwEBjpH2LU7MJC9Divq0aGlaW45k+OlKNkhlDOnTZRs4B/rR4EAnv/rt90r7qJLH5ngY4EbOUuNejD0o6rKvva4g2sgmyog+s6k/k+qYG/KYG5Jsa8Dd9DasUIWkvsLjgTgaUBzlF1p+PAd6y7gImpTXqu+yzzXM3TsxjEV/04Svu17RMneiLGEEQSuu0WRt25plxRrOO6Da4vP6Ma+uMaw2EH+XojV2F1m4czwdqGj+fOCfdwZ/AnZN0vvut3+HnP/0Zz/2K4jw/P2P7GdfCK+2MfuBbodugjc5FXq9g9EKqm2rl1X5K4sNB98ZonU1KqLxE6G545riVMskfsf+YeQxnazyAOZANG897bYDudxzBfWEkANUHVAuShCtVKkqha8NssI/CqEbvg2EHxcG1URJHcIIwFv+egwWz9f39Ia/OE18SGaS59iKwQNgbo4FbBf4ReM5t2YRlvVpq5uIIOo4HMuy2allP6zdTW0SukgepW//1tPB/7ssrGznQTlATVYweCh8PrEontlPnXnYnJGOVqjGwHXOQmzggzPcn99c8t2OomOD7COtbNwuVgYLacVd1JOFMJHHHBLSDuBTZX60mppUfq7sH+XkYx/WGng769YDza0oJ4vTugmbuytz/Lkco/X63vOH3zm/5x3cHXQIM9uuBXE4x5KoFlT16Hwa11Kib6gMhf2LXBmxRA24GB6GGLzkwFS2IE7lFbugQTlo4iqa9Z9zzIEbaqsPdRyi+y2mpfXattFmP2Z7Dh86GMtwjwsRGKoJSTd1ukWeXG+es0Vbmqva03QKIerl7w1MVq1uQ/TzGZvGzFmdsoTAaHqrFWEAPfbR0wj42s36JQcFUKccwUWJoMft579mXxbdSCTvyXweE/zYuQ8O6N+9ht5kB9nB5XS4b/aOvji/q4hyneO6np8KbL17z/sv3uB7UvWKj0EzzeR1I3bnZ4LUN+nELS/zjhm4bllaogQPE8N5wPn/7BX/8R8p3vvgZP/nJT/jbH32N6Y3j9oFWXjMIoukYDZGNIXfJiUgo8M2MOvdZCUJLSYLAtAZG5jAycHiS8DJqrpExEC+cLHp4PLCZOqaKP102RNHh+JAUndxJIrhFDtsk/aiuwXZQYx3cU+OTmITP/FDLmCAPwi9J3PKKoHS75c9w7ztdYvBODpDKJAfNPDE5gljy8Lwh7Mnjz431OfEj+z9oua53PxBqnBtaUAKTiaZBsodL4ovuiE2RT7w3ZtAz+62ILvIwI2c3S3sdK3Y5ZTDPxsHyHfwV168tD3fbQk6/1CqZTTFi2hkPeEPKLQ/wZBMkyzNKMr0fqjkB6+73jckb9UGxVLWGHcfDpWsanUWZ3w+vwaCvoUKywaRi52cAyts3nL5d+NnPfsYu34oNdjsjCV608TW0Qdlf0cfBsIawYT2LzuKcTzv/9t/8N7z59hv+4i/+gnE76M+NXox38o7btxrSymLNnOop7KvdqAzqcBgdKwWtwq1YELpVkRLS8nLa42A54kDdhkdw2NiwEk2YebKvPOV2cQPopScjXe9TYoThRw6nonBUV7yPYDhk4zfolBpTXkZArSKK2gXc2H1jH4rKicMIZdgqyEC0PQyuHHxDcIqc4/m32wKAikGbw8BkCo9i7JOZIB31ioqmN3EAxmMW6ciEEe6LXGIwBXE/u5ywLF4CRBlrrX0qV/VoyG16KqRtoVth2mRUQFJJkWphGnmgEi1SzHWVQhTo6oIsmw2nPgz+AM49nldVODXnq+s7tm3jaOHnulO4pEz7Wp0X6wxX9mfDR2P3C1Lhsy8+5/P9O/zD3/1DbNbF2erGdrrgekYl3uGzRvFy3jZU0ou/JMNMnVPKrydQ2UbnVoO1LVI4T6vl2fYNx4oshubJB4OB+SVsVFRoUyZvtsC8YsSgVh6G2B2uNTIvMGevc41FQ3Wub/h8b3TtXAc0exefJdURN7/hk7U7Klo+3mQlYaEANXc0C63yGDaenuDr7YcAACAASURBVOyiDc+shLtll7APB1L990A5ioavsDxP4q2NYUHKaV33BTht3BhMhWR8/iIVTyDHUlI/0oYiQNx2b3zsPtjv5UP80/vKH/hUrhLpw2t4Tgct0Sx3D8bdsLqsUGZAdV8es5J5L093sA5Ar3TPQ5tJiCCUPZBhkZFRpNLXOyypANDiXF8F0/f02Yk3f/57/OhHP4pMCFHGYRzja2DnZRTqi0JpuL5G2sHwTt1iqHIuBSPsYy8tAInfk+9x7b/gpVXqFz/gp/6LZFArfu3sb3eGJmCnZPNN+Per0iWyKFQLrbDex5n/EA2I0C2yC4Y6sm25vzcEo2pmN4z471IKG0rf6pKLl6L0Hpz9UsC74fIM7tQjvh6LgRCSS74EveeU74cTge+KYkU4lVP892TTdhZjtZce0nVgbwJNeCpCzXU9NMDuUH6kPYqSoaCRh6QSe+PwnuBgwBRFQr1hHuG+nvZHUzEiGg2qjpoMzwQ3/LbOK1k1jSx2Il5X8PencAWb8vk+QKmzWFdqP+e/s9Z8s6k60VCOMNfToxIhrlES+NG7wkIXWypVDCIIDUvwZ9aYd5zWsx6Y7+QEjra018jWWwMc6Xs++zLYX1c+fPjABaVYgFuWZJTWr1QbbNvG7dbQ9pahwTYrpfD09ITdPoTiYdR1RtUagbxOWPxMduU+GlCwls1CG7iGzU4psgCJLsKmsR8tno1XisVwbf50pQRDtxbhRmTUWAEf8SjGGNSFXStmqS4RY9pH3DxY+G62BgSTWWgMegmyUcXRTSmbcknFB63hyeKzU2XQIvOiXBl2w/Jsbtbi+Yx473uJs3n0gdS04xsWuTmAaGEG4epadboUCF0L1QM83G2GepP2KoKVg5tGDVN7WMaFEvHjzJXf9vVNDfhNDRg/0Dc14G/yEjeGybJQH+PB1k7vZ0zYoOkCR4ZLQp+OU1empvW0KxRBE802duoDYcLS2msO8+JM7/gDcSIUhpMIocsMRCSAMrcR4JI7oyrnb73h5ef/mScM3Qp2OxjqvPQPCyO49AtNOq94xau6saUyr9YL/+2f/1t+99Vb/sf/5X/iyy+/hJMy2geO6+DFP6NtbykNbpeCH0aVSxAJtg27CMgGUmmpsN6fLpyssR0H7WYYY50x5kItdbmqBIDekR7ZGt79rvixOGM1g+tNjGKS2EnYL7oo0/pTErOIA2BExsYOMpRSdgYH9MCfZB8UcV5tF95xpZutwYS6LyDTNK2Ngab7Gjxpqti3cR86xrqPIdStTpILHCaIC5sYp7kfpALxMA9yiw+EiqXKVOcAamy0zAtXz1pFJJSLBHnHfglO/m1eV64gnWJ7WCPaGR+xnsmwe7cHpn+PXmd4XYBpUcHkuOenE9a2de0rd9urSfQDlhq3E52X4FRpMA5cCh9vP/NrAATbo/5oNMpZIfkN5yM+89acIV8jVPb6mufRqLUy2oELnIsDlSLCZezYS6yPIx2BfvDFD/j8v3rLD3/4Q/7u739Gu36NvNoweUXZS9RrOi1elcg2e6iDxYLkY4ZrYF1IkOWK7OsnMgRNBw3VIAJ6M8YwkC3szzxIIfE1Y/W24UyR9mQeN8BMI4PTjGoNSYzNk2RSRemZ5xeSlig41OKdENmwdS7n33k+06cbgx2YXRLA7rGniGMYwwbGwfvjHaN0Dg/y/U09XB7MkrzxoOJ2sv+Kc1kM9kyEGulWUkRj93bP9yf25y0YjNRUsnxKl/kWw8GpIvcYOHq5LJK9FsvhzVjP51EoUEqcwwC3s/LmD75Due7433/g2hqXA6QnBm+D47jyXr9k706zM/7KkAYbnXraUZRNlVvMd9j6GbXBF2+f+BdffJ8/+YPO26d/x1e/OLjdbjy/f8eHz17YL2eO0dF2cNKoz8IBYfbUEf0iIuwaFqMxqM9Gjsj+EpF71a9KLYJmXuSmwlDhGBt7nhlutuzR3dKC3BSZQ5MHksgwidzXEeROHyPWnNoa+taJqwsU1YzFqeiWvd8kVeafs1uDk9GPg3LuqB24DTSduNwu9Okg5pX5002bY+ROfkZ63ifHRhLBdlvWvu4l3WeETWPgeuhYtbDK4GJhs64E3h5bzbR/7/g2CTNZI4qnvT08Z1ZhDOsC3znrFSbp0A86++rJ4+P3da79quvXIxnS2QxasZw2Vmwkczcb/qExlIkFQQ4/bPl8h3ImtiHXaxwBfuYeHhdyRiAm2qOxewyp4vejGQsKZjIbVFcwVVTM2/q8s5ic9iBXO3j61lu+fP81L0cMokq9LvBhV6XW+NreD47jyu12o26xwG8E86nuJ7733d/nz//ln/E//2//nl6cYZ391DFTSjnRVBm14lqoOHg0RDo8/RxDxlaH0LyH73oJXllwqiJ7YgzLiXO8CKTlQ1mDOv/o0clc7JZSSHcs8xGkxES49w6agYESL7cIjKqo2QJG1Bski13iLUOsMEaj77cYLE4mMMSUecr63Jff8WTZyqgUP1JBptSVOQFjHBRLb+QSPsrDJ+B3xjDcb2gyaicbQubL6MHmGNMTOA9S97B3cEDszC/P/n/bl+bdE+6MSAdU2oMaIAZj6g8DXl/mXMkIn773GYTsMRSeIGiOoKmTLad3ezBT42ZXem+UlswqE1xiw64OPgRrTq+G2qCZs23RQJy3yuu3r/n6669xF1ob2HVw8/eoKq/qTifCJA8JT2uthYYEIU8UK/eN192pUuk5RK7NOOzuRR/+1RJNNMGaco1haBkdEaXJTknQUh6G1iZKzYn/ZDcV8tfMk70+7UGCOX4uG5/JicNDUTDyHloyZYU7KHI3R8j/dn/wvgfolD7l630B0ZO+pD1BJWfZEIj1pW6MfTNtbXKIHiqbe5OrHl8/AVJDuNHSQrPevfI93vOB09PyA7uHYTszH8jY57nh/SHPIr+/yAIfPpVLCbm154EpDNycqhWxA3WnWlm2KCOfwwSfnXgWRX9pv3DFHkA7kn1YmP7WgBzB1MEWUBR2YbG393yvv7Yr33l6zZtvf4vxHO+KtRNbAfNO5wN9XHh+eZ/nSqGWLI5dudK4aBQZQ4KRjHVen16xy8arH7zmdP6K5+dnnj8cmHXa7WA71ch0yHc7msIYcqjrsh0oBqQEHc+cgYTKANpjg+QDSQVTSNYD8HICdLiZU0qcM3E8OKpR6ACLFBJgaSh/TFoqiMB0T/tXSX/1PF90B1fUHN9Cep4TptWYAHgP5lyVsIxQcbqnGZWElZabrQIXhEOMkf+tdtDJwPVpG+SGl7tiZiQ477KhpYRdi5N7sFHltgA8gDo2egZxIo6vgnOyw+/v2qdwCSn7yqvn2uk2gGsMSDya2th3o9YTY91XmeoaeQi6l2RoMpUG8y/Muk6UMgFV1weG+B2clVTH9RqDSQB9YGixwInpiU0MioFDQvl2a4OmoXAYZsgY60wKQCRY7x/G+2ja9UxxY+8dNMBBhmcxH/aZSo0ZQQKT4nGQ24gMTVUYu1MtmJWq9VcGpU6W6OOsO+7frH3DvkUValV6j/qgWQyR5vlUFRihlinJSYX4+d3DXuaYQOLDs55DTzNDMgPKNADweNbxGbQ1fAsIKEhMDesZGO+huPK5p2qPlsQH4hN4YfX+YT/U0AeFXGTd5M9iG/CC4HjuPaUZI89NN0GIbC2XLbNSPjGGEd/UgN/UgN/UgP9/XM5AvC1geqwloJGVqIqMVKjbQ64Vobr1tdt+DEYKYw0Aih94AlLFiK+ywfhIpfuxsmmgkGHi6r5UyjZrJ2Vlf44NKAWpDqcbw51SToiN7Hkb727vOAgCqdmBnt+yXXakVjY9oA3+4He/z3/95x/4y7/8S94N5xidUgY3Pfj6+MCVxtWFz4ryusfq9mGcS9w3EV/ZZWOEDWopG5xfAAml/Ki0sdFdIjNGhLBd7JTqlLJz81sqdOMsUxQyQ0Y9FBciioywqg2bo4lzBJFncVPK3do/Dosc2njYvEo3djO83ShA2a4MCRB75MuqVte7uvc7cXmeUSWfmSBYveE5cNfM3hwMJO2Pm/S7ktt0YQ+zXgxK1DnXZq5RfaGOSX4JQlHU8wng+8FjTMRv+xLu9VX8QhKaPe5lCC+vq0uYiZlVnEcVuQLmvu6vL/tKoYzTeuWGsrCkpVCSTk2Fp3DvOXRiX+x3YhhZJxG2cWMMLgW0jWXVGENhZ/cdGWFyPrZcS5vMERgZJktqOoIYnfXXyZ74zmXHf0eo8hn/8PMYvLdro586x3Zw7mfUJfLCukMh1emEEldi3NboDJ3DbIWlpktyQYk8JtwpKjy3Z1w9CA4Fegv74onDycrhC2D/Ywi4hzJYQi2IO3UE+SfeuYaSdoVxFC7SSlwlXEJE2LJ+2UwjaxVZg7T4/CV7MmPIwNQYpSM+cBpdE6hWp/iG4qGsnjjnPCsfSHdKv+cgmrLmFIk5ixt3i70J3tsiAHwqV+EAJcgFxPsw8YgN1pApiA+h3H9U/qtq9Kp5L+YA/Px258M/Xjn6wVkK+3wHpeCEVdrBDXEYL4rup6j1e6fWSldnn0IAub/PxZxadv7k+3/GP56+5Kc//WlYQjqMo9F0UKux79FjO6Esix5y1qOhupLM7HyML/E8/x68zhje2cq0FHZEo28Kp5Ko5DRztqbd4JSERebYQx/RjVFDQWxzCM0IN4wWM46e1p9VNNzhVLASopbeYz2rKvTnOIu1Y+WK7EF+wEa6QaQTm/ZVi6AdTSvw4omH+L5ctyT3FyEdyAjlZoFwN6uKyBHuLZ6EwckozHs5a9Ni2T/atNyDo9T74HLiWSPyrkQk1PYSxJjlLmJlwSOmkckoIugg9+B6P5t/xfVrTzHT8K00iOZYzlHY8lhkzqZX7sMFH8zVZMTCyDucf/bA08d0bnQAmoOq6Rk4v6ZP//0gKaZCJXzYZTao3NUxxY00kqBV4fJm47PvfsZxe4e784rz7LtoIuwEC+7FDGmNz8eVUi9h7+MbXQpjwP504Y/+9F/yv/7VX7G3aKClnKOhbget3eJn14FssRDDRzUWqkgO20xwEcZIKxITfMRCmQOidSIMwersYsK7MiTDeYCI3PEfAXqAZm4Z5CWSQy9lM8siUXEJ8K+r4zWGe7XKekYB9MTrL2xRYI8n2rSry3AM50MUofLwmOfHySKga1vMjTkgG34BLUzTgvxmjN5xV8xyIfsEDuZqmOBmyiL1Gbw9/KXBdi2+bsjHjMFP4BoxyseySJ2MRZeH8FN9aD6n37HIAl+HKyEkjUZ7Lujp7S+TKSSCS02GS1+hjF0Ghw9kGOej5QC0hh89AlI4lRjsDgsbxfFGOW87275TqvD555/z7t07bi3u/0BCkqzB0LMTtDYQacEE7wMrAWwXKVgyaiaLc0iUCGGztSdQS3YXCgXuPVwcAI7jZQuQeYwcLISEeoUhK8zqVbHI5zAPey+P9dc9WQwWB6EC0js6BpvLOiQOyD2oM1/SkiGocV/j84rPIW3+3bOYZouCyIBk34RNzr3RhSi4lADHGmWthXv4Xg5RZCo7JvMgDr6OMXPQlg2BKsGijKJsriXHkBzeuu3584/FWCru3OSUxecs0sanB9z5Hmz9CabJNfcdw2dzIs70DZ/33K3kMpNklesqkAFcXrgDDhnMmx7a6w7k0Emlp3WXQLLynUYjzrutdA6uvP72E9f/3DiOIzJPfASwZ50+gabxgVM98Ww3LgTT0oA6AiBCZnjwjlMo9URV5/M3zl43Ci8cx0H1IIqclv4hgI6h4DKoEgqbCVoPIkAyBvuSAfRxzvvwIB3kursUaCFpxnkIJneQotxnBPNutZWDU2t4h0/l7xxmTUtTkRuWjYykEqibQI/9pKRVbymFsZXYHxGa3ML/35zjlut1L+l1HUpgIdRqsR5CceNulKaQwbRKpUsooWdTCE93cJAA7V19+f8X3+55UkqAQsk+D4D+fLdnMV1rUBfgpJ+UgmmBL8u+pGTPPRjSGNbCRuRhSuDuUbGtoewWDV6C43Fm9TVMEg8Pe4gBrQBuTvcMYvfxUONkc+V77GU41TpMK471yWXZgcXunAWVT7bnGdEbpQrlFuzH4UaxeGfNg/F+9+1OeyP/QKXS5Rw1GyBjp6TNb5XKYHBxDYsz98w6S1vpSaCxue9ErUOur8hNy7WeDb8q0TwwUCXVXVAyIFkID3tJa5GSwyAswUss1XIJkBow/GGopUwULzwHksmdNVTnfm5BMOxBM/Ml8jy9x7luteObRC5VYoAuUVu4BxCrWNhyjhqH87AFTqm+sHZVTT/xDv7g/+0r4y3Bk8d+wR0ZsRdPpaqX68d/5hO4vqkBv6kBv6kBf/NXsQBIsKwpUkVglvuehTLWEhWZeZHmG+K3BYLNPjP631A32QJgjZpql5FOHU5Z96rrwX9xVzwHTO4MdzRrnHuuScOJzLVWoZczejnx4esgcYRN6ikAuPJCN0G6YeNEbze0OXKpFN1wXrGrs502fvC97/Oj732f//ijH8dYthtX3vP1y4VX+op933F22m6cCM5EyewFD+lvnAvhSxzkkeOEOBE+r1FnxQqa90pR9qi31SnbOS2SZl7YYOHVSaQFp0lLRdNUlgmDGyE9EeZxscs9Y1qZSNpd9UK/D5DirMuB9MyjExbqEPWFrgyp6BecMQFWV2ySpaeVkYdi1HItzSJXxhZnvbWHesXA7yBfAHwRMzBzo2SETbJlPaSxxD6Zqwxd9o7x31mzFlvEuyH9wS6tJONeEGLY0D3rqsdvLNCpCTpPgtg848EK92xI2Zj7q+kzk7y+wjNtvz//vIz7fS/bjtfO8LC8KqWgFv3CBLQ3C8tDtsjB8hH1uyIgG8zvp7G+vDV6g9P+it/9ovDz9/8AQ2ij04+RuZyJd2WPEyrbCa6HzVZ4RBtbT0uwFHVJniG4J0ExLOrcD0rioF6TgCCB793h1nhGrRz5ThakzJ9ToKfCPm/ZwNOm2zETThYkg5vWBK8fMDSv+UYKVR7VZgUVpWwlzi1AvDPaQDdlZmhh427NShJq/ASWinNRehR9Ye+XBJNZr5ZRkzUV7yeAlZFqQM9eI/7s3GcHBp/YgClquRr5u+5Zt4A0AQ37POTKYSEOiJ8tSGuGMhyq74HhuocG2Yz9swvl7eAYN/oQTjnMLiOGEjdvgSs35+JGTzLY8I6yUXWnawxSbRQ2KrVWNm+4OeftzJtXr2lvbuwvg/1UqZuG+0GJnlgdyJzCUgO4b7Ovd4leSzM7dTp6TGIVvv4dr5QR79GYp8vWw4FFFEYIQ8AY6mtIC4T9ctc1pHZteAY+zV8r6aARJYNQMst2pJWlmGNNsBG1RdUgqjQJFwjEOAocad+n+4nW2urnhX4f5rhz7/fnu+fxbvnsk2ZmavR4Vg7wHReNHkF2hoFLqNHruk8kySx/9iySVXZ8Znti+KyLbA6B78M/5xZ3+GEfVcuUMwfQ2AcdXG65d03L3199/dqua+thYXZafoH5cKRxZ/T2ZTmg0/scXyFS4bk5QYFYaEKEkE0gZrK7l3TfgJSITitaEVleuE5HHzx8j8W+Lh8VwCJCr04/C/u3X9F+9szonVtrPN3CZqgg9B5TV8Xx0TmuDfWN0+mE24al1YDhfPdf/CHf/Z3f5+9/8i5ennypxxhYd9qto2+DERt7qK7BkifzU+tpSeTriHA9Z/qvB6tnLFaNIlbXEE+9xcOWmHq63htOuOcnCcnuRXKqSoSSe4KoZV+Mb6VQJAIPIdgpJYs4vKJaqXWn64AEZ2fjZjWaW3enuK5732VCRj3yLojgNktwxOxYB61MsI4aayuBYADT+3h06xUvR74s2VBJWdL3QWMxf+YGMnQx8z6Vy5MNN3MpVuCdkwznaIj0Iaw+WIi2bHPE93A9SeAXyc1sAro4A0VFAvCW2NRaNkldSMVgp8mVnvLsLe+fSGXke02J7uxUC/tW2eqGe+Ppswuv3jzx8o8/43a78f7DB86XV5zPZ8SVNhV1ydzBC4yY7G+iEfIJSL7rXQg5rFR6Ce7J/NkoMLbOtLKKexIBl4wtBq9iWazHBt1z8FhNsVqi5JlZHhpNkyaoXexKMadn7176TjiaVk77K0b/BXAvkA1duRDxj1StzOfllSTXEKBfhiHnICLW9ykBgrYsYJZMPRYGeAZZJogwD2lGPnOBkwtWojmewlX1uiySbJIC3ChdQZWqnSE194q22K3zXVROeLmCwE3jsA5QZWY62FIjfipXiCYObPl6a2YyPaiSfESGgRlWcq+xffnvuz0UNxP0wkK+7mn5Wm65X08f9c4jtD3zLEJHEMqeLQNOpYZaoW4b/rrw4asbr1TTCgfMD1w+MFzTOrbgdgVC9WsjWGuzfAEo5RLsZTHGuFHLzqunwjZOHNsBtj1kYez5WeceE1BSSMrjW7qFakjqKUdls+gIwkL40MNpWAD8GsqN2TzVHAqpVXqd51gqQ8QYLQtmFwoV9ygWhzdMRkjq3am+3fe3hLldBWGjd8M11DMqikhYrKjcGVBFoOiWa7yAK6Ybolfi0AorOzw9mQXQI4qvEkCkzCFkLolNwqdcELqNCGvO3zMfREUwWUq3KNyz+HRzVI+1hwRzczZuk4n5CPx/Cpc+/D8L5OwKNfeMEQETcR9SBRAVRzIyGfcMIOJ5WmH5QQ+td0Bvhj7nwA6PerI+fD1ErRR9k9CsUphh87PxrAgjB6Nj/XpPkKkpIDUaVDvj4yWHpLm/1TMQKiuxAvVIZPuywAdtQu+d7tdQZ6jC0XE1xn5mJLDkAl2DHThIBlo/kBIg+/CyfNiRut4vEugX17X+3MMuRVVRjeZQXNlGqBSudFS3YOnpCBuVZOK5hbd4sxE/y4h3fdOoyQP0EjTZ+Ruxdk8oMoSZHzJr18n2Q47ckwZdByY9bctSDyAWGTJAE12ohs6nUnTZeoVaP5qgKrG/DDF6vp5hqzj36Pg+FWf4tB+Tu1qqvOSStTyjP53rmxrwmxrwmxrwN3+JS3aGsW42y5+bymThi0UdAXeiLHbMB0VJyERV8yx2Qs05tZ/z7HHgQ6zNaTlDkB+mBf/MWBv4yg90aZFdQ2IfIugY9BJga7Wd09l5+/mJ558fHKNxolIz/8Aw1F5wb7Trhu9hcVz8RPEdl5ZDzMqb87f4V3/45/xfP/wJVgb9+sJ1P/P+/TP7fmYYmIeVlZRL2CcL7G6hJnKlqEZv37MWmKoSJADJMfPdEq4XqFl34VCGIwmCa0mr6gVsQ7Ek/GiNs7oeMeQZg2J7PiNJnCL2o31ETtrwwimLg68JZbVulT3/fisCORjVzJ2RmBzEZ9bINrXch8yMQ+RBsBOD12CYZy64JCBfA6jzfG/U44wdlbD2yqsSQ2+nop7El3qLbMERm/IExu+L6Pn/xWr/57nmEG4uftfIrmziiywFuuzqVIxSBW9bALcW+3jzTDlJpYa4LFceJKt292UhfVeACjw4G9xrvL7eR7jh6QKgcsRxkVkuRYPcM87CcTvoJWwah+beWhQs1l7s306RwDa77oiWUPOmhdeeOeVuLTPqjf2sPF3eJLgchKlaH5wOhrMl6byJrAzZsEVLckGCzqWD1ST15VBpOi7FLYoaUUSpPUlz6ouU3hRKTSB5JMmoxL4nIhTtjGrhcpS1w2EaOXMeFbBlXt9UtBvKyEFITdWCJJNbRUAKUgpaCopFDRZAIloCo9PhMUQqEGQmCMIXjHKjJmn97MKzjAVsizlKuZNF3OMeAFVifflQ2jzXpS9rYJM5rev8Pxl2/XNf1WNAu+cw/jYJekDLvaakQwYkfu4gkZYFwKG3sPEUweqg946VjcvbnfIC/dbQ9IbUGi5RYAx/B6NwLmeu12us+1MBGxScPfuv1ZaIYKms3qrxdHlDfwPDv+a8VfailBOINuAJbenaJWBj5kgmEaY0Nj3HXokwkphRx1TjTycaYRNA98jZtGmhaFAdKYXW0jxzhGZKSwx9PPtqL7elGrIkdA0LLAGSV5eZyOYDkxMuTnWntUYtO2Pc0mGrMlpaVpfgqozi0E/ICFygxBJfCuXGHPgCHtm+QOAeOE0qk23RRTCJARc6z5p0McveevoPmOf753dyZhfDkjCzJQnAayqxgCYjiRWC1rQXHx4YBnlLrIbya7lkODNipxjL7nXu9SZHDLb/qTX+T/4O0Nlw28Iv0e9WE8IGEp7rW99i2AF3+WlueiIBz/g0EJ8vUFEGz5jEvK4+TM1EhFEFyfDNnl61IkKfbLE5TQOG+mIBKX2xnSdQOErnvb9DXyvf+aMv+Nu//Vve+Gu2HPbsXonYSMcFjt7owzn6YPiNMzvwFCyM4z0A//1/9z/wV//Hf+CHP/whHz503p9+xrY7xXfseI/wliKnONgctOQwLh+a9bYYITc6KorWgnl6LUoACmHzQASB52Iim8N1+MYdzU03JKguHl42ec8nODOqMkxSdRZKockCvzP2459VTnTvaIPTvmM+uHjjg80iOf5msboKo1EOSnpHTiOLJpVjNsnyzJz1aDnlZwbRawzezJaP+JQID5KZkD/zVCZltmSAg3Pi7ZXJEiyT0ZJA56d01cRYpjVkn0xdMwa22AjzES6/b68xkfaQNmu721UtueJk7U4qi9+n9Y2K17g/H4px+f4X/PjHP6beYrN5unWKfBaMOTmQ8hyHxKUgp7AWaaOgdUPKAXLw+z/4Lp+/vfDXf/3XfPXjH7Ppd3j16hX99cGr/cx2PodCYoxgAIw5QPXFGNOakvcJm4twLhp5EZbWRjYQ39duXUrByjkyVvL998zIiSGuYKcMeh15KCGYRUNdiqByhD2RCco5AsaT4VB940k+Y9ig+Fecy8ZxHHhusLuGNcIaRpBA1jqSP85SedmjKC/rvYTdZ2bL/Wefv3vICBaOBBi1xb9Q82GuYl6Fw30dkrLen2wK5yUxAOji4IPKGSHCbhXFlpVXMq60Z2ETAY5FECFBJQAAIABJREFUjiwuH/eJTwtcuBUHL1SfQE/NqREPoH2lpPx4hk4aLUJBCSC4J1g9BxUmcUbNYbhLnB2Tfc5DsHxkfk/PdWL/AYrXYGPVQn86uPZntt8/c3r9xIe/+wquT9Ra+azv9FFCCXFtNBNq3/jF8XMulwv7vvNBlFKEk5zSejTWhgrsPIFUmjeoA6Xz6hRkCndHtkbW8ZzYUetUC+BtWmD9Mtnf3RllAnq2AKhewgbQVEE9LAjpHK3jye5ZwPkwcMdb+LW7+2puzAUTh20PIFkC6JyWNAKRAVNijCCHhfWVFW4vB+3WOV12Tqc9VB8W6+AqhJUtxnV8oEtH5CWAexHQjdBgeJJAHPWNbTW9oQ6JD5EFo74P1iXBDhJiqGaLSd9WweduNBQTz7BRiGT5JMpYwfT5ztxyT8LHp8O0E0lrhnzXi8xBQAxuonbYwt/ZI5srWLqT9ZQWiTrP8GTpjg3Lhj0swLK2ezDzmO+sIwvUXL9XjzXsUtoD0BDFckmAL5hvJd9RWc8ZuXJ68zncnnn3/gMXLpgYO5pNuFItbeFEUNsiPFXAx6C/3GgSmRFPopwmQL6UEp0wx4yhbJ1nlNZQlRcDi5yvYqz7qwLkGT0DjBnBFJ9NWr5uQFgpl03pGg3Pk+303sO3vUWyykAWeIIb6AxWFobF8LNIYZihHGEbI+HZjhlbOUVNahFAL1s2b8MAxW3D+RCe5tr5II1Op8mgyeAmgknYexXLEyUZdRhRs2SdH/l3AWY13kcTKs7M5tqGovSo7/P+iGxMyurM5RpjsOUgoppT+qd1Vn1TA35TA8I3NeBv+nIRXDamhqVmAHZJ0ASgV6Mx71WCTxq6m1AYxb4Wundb+IOx43iykx9sfgFKY4xLPktLwiaox9Aoyqc51FDaYv7P7y1r8N7kxrW+4um732Y7zvzN3/wN53Ji6/Nd75RTQSrctsHPecercUX8wu7CaURdeDTY6uDP/vW/4d//8D/yf/7oR7g7N1O+dX7L4Jlhr2n9xuZGqY26TfA7a7TRERVGv5NHpe65xwgMOJ/PAWxa1Dzew5kk8qUU8SO2oXmrRBeRw3rnyIGqWkHyGZQjBgpDI9dQVVM5CyKFTti21soCvgsnXAqnekLLidvLC0d1rMSw5j6o3jCbqoGsLZRV4916X7bZiqH1Oc/e+Py1Rw8QYK/hE/84ZV3XYsBdSoHm1FT0zMGwl8LwUw7VjGn3zxrswyNh7bd9Ff8s/mXa0SXeJxbgLsSWPHGYacNE6Svr45hONO5AkKNVHC8vWXfvHFOZnBhXQaAmyc+2BK/vA/CyohHCwm7WzaLpqNQBOUCM61n5/Pfe0L76ivdHWLi+rq8IMYczVDAfVBdO1xZOCV6xksr7bfAklVID7xJ3pH5G7S8MlM2E7333TZw7qZqsYlANw8ItyGv83lDMBudt5yCs+s71vMBlEUVyrxqTGGO61mf1Qt0vHMeRQLch5vQE+qRsoGnUlb9ffeAj1ZJ2JiwsWe+e9I77gZvx0mAj+krJ51brxmZ7DrgPama5jC1Ou809M6KSCaI1st5LOktYo23PuDjjVLkdQX6/1cABb6Nx5P5wA0h8MGpjodTzncivMBXvIxtfEe4kNOnYDNyav8SJ6cbwqVxNdopVWs0M+rQL7tqp6Y5gzsp4m1lDSI95gzsq4OUFEeEoFU7wwZ5583bnyZ/w6zNHy69rSSBzoMf+dh1XxCJTq8uFk1S2Xjg8+u1tCF6fkHICj8+56c5ed8678ub1Tn3zmlrr+h9yRXgCgtzmEGdIDfvH6ifaYhwaZVpGptVbUxbh8HAFU0qpUCyQ+l7C8hynlC1UymJ0a9QijNaTrBPd+3T9kiT8hUAi9+xxx5ddwo1FVemamIkcbFtBxJHaGWZJWnaqCDYayoHSwHc+9HCluGYOrFlbZJY44nMWUDKeAVnuCqFEK6CF6mH3uXVZkQJjL3fhhBFObs7CFtyEln3QinUaHbJuKy7IFmcRWStqkXuWuJ3vDgpui6S1ClJnHeLTWcz0uvaQX3X9WuRddDDyr0GiSBMRbCg+gr/iAqXWVVhN9QwpmDYUScuPWYoO5yMQZWQBF4eso1KYxYy5BnvL/e7J/1Cs4ecAp0SwuRkiD4GeI6zyfXC5vOJyuWA3ENcsdAQvjhdn2AuilSaRF4AWbihzKlJy6PH68sSf/vGfIOb8/Y9/xvPN2IdifcRBexsh793yM2QIlyCYh0ztKLHgN783x5OBCI5sUdDcWrAbgtGpixFts4k0wWW+Tjl5xJEMVas5hZ4DGEvmRCkbiBC5tj3YQqUEWAg55FJqF6p2djN2Ks+TxcMsFoLtAFC9xYDLHdIyRhWqH1F0DFuDJfVbfm1aMAK1dPCQno985iJTxSZU2rLUMImv95H/nQXJKPPztWzMZirIp3MZsSHeWRjhqWkcS0nRZTDtG+bBuY1gEjrgabkgyUiAAKf84Udd0sz5rqjhJdiTt63y+bffsj+/4/iq5bDTeMqvHWpIifd7txL+1iZY6+h+QmxHPQrNN2/P/P73vuA//ejvOPp7eDmCvfl5R4pz2c8UDeDfdaobkpVtiRe4U0vHbdoi9ZCBi2ETkO6DfsogSbXlXb2VsLgk2ZgqMPRKUQUfqDhmaQvSdTXhsT48BsCTqTvvn9ZQZCrstbA3ARduU4lB7rUC2MAlpOSzhhH5OFejtPjD/9RKnACq5zOdUtcA91mscc1fk7VWIp9msb5iFBJvVX6WKVmOrJ25r+ZQQhW3I/ZjZ5kPHTy8W9opfoqmySZQXD8plh08gHBz+FxmEXG3b0CewK95RuXBTY88ARHggGwQPA/56PiyIZVQRTm6WI7qB55nQ5FjtYbGbGrD1ycAP2ingm3C5oXL56/5+sdfctGeHvFnht2wdmCphtnGwVYqOgy7HVAriAeTvwSBYTlFaKfoK5pfodxiX9HCVqc9bVlkkDVAMwvWrQiiwb55BPvgvq+oPzgku8MmqJbEMZ1bGVTf44zCF7ulZUO+S2XQMPdQM1iP8YVqKg0KZ5vkhYZoFHxe9vg0XrAtnk+hLFbcaIYVx7cBNQI8xUKx0q2jESgS74GEbYQxSQ5p50DY5iGZGeljyfdHAlFhgRMAfTGjaxApZm1iJkyJf8jLQ6exglndl+VviMem+joBUhn/hdXsb/MaagESzcHStLbozlDFVRnJ+BZVimzR4I9klrljjLCBwJFR0jKuhg+1BVAuk8S0GPGhCoyzwOlzwJv1h7g/1L13oLMyz0RZQawblWdiqw6TIWeUI5h0F0FqgDyyWKDBohsS70Shhw2l+/p7mj0jef4cVTnl/qHzOQ/wkuuELZptjwDW1gcXOeHa4tNrvFMx4PW7jQHEUBZbWWRK1IU+jOrB4jYNgEHEaRrKom7GlgojyVBniHqRtLSEOZQYTFdr86hjI3M1QMLRjE6wHMOaJO7BnudtK4ZpALPOjY0B3ukcYbOt/aMIh7AG9OVCIF7xqbuQYBCPMWgl90tdWicuRxKa3NcATvTAMueiqCFNqRTCEime2aelCvymBvymBvwVa+KbGvD/+6UF8UrL+x4qQA1vjhzmetGw+n24RDJj2udivBNdYq9SdGZo0e52Tfn1izADofqa68NnIkMMreIXK6S6dg7TRz7HGBxXbhiiwuu3b3j67DWjhTq7FM3hWVjklN0Q7bz0g9cJwL5IoU6Vn3XEhX/9x/+KDx/e8eWXX1LOBfODYdPKzNlLWF8WDW+QmjbC7hvVwt2k3aVLaDkh6jRe0B7A4jF6qN9HZJZFDd0zJ0zDtSTv9ZFgemSf5eBFoo/fpK53LADBkoB7ru8RtktxRteoc4G6WdhWNkd1UDA2P9b3H1rzvdWFk7gNPPMHp3payt121OTAPWu8dIiJNZCfJRUG87ycQHE1CaZ8IQhV4nlGCwfOUe+19Z7y3EdMTNZk4bd/DSGVtfM53T/7JAxlscIcmELsNVVmLpLFYFtYFtiFSh2yau1JDjam/Z0sURd6pU+LrbyPhbLeQ7OKJ+FvbslDwUvHxKi9c0hHzgXboI1Qsc09G25UM6QdGJ8F8WdPulMRIEkQJZg8sae0/5u9d+uRZEnu/H5m7h6ZVdV9zlzJ0VLicrVcSFjoAn0EvehJH1sAv8GuBAESJJC7O+TRucw5XZUZ4W6mBzP3yB5Ss4A00NRDBzAcTnd1Vmakh7vZ3/4XtDeUUItLv4St+BZD0YoE5qWhFsccrYIKq4cKckMgYIVQW930SAyUUJ6742rrPLDikUsvBSkW9aN3KiUJVQfoNW/MJF+DFMXGANfTGWoOL/S2zgrxtCwE2lR9+oWjBE7omsT+Ulb9UbiAGUXgqBtSGqVWdBz5XaSi04xdZm5tAuWPlvM5dJ+16zxgO+EgEHbkYzFmTiXFmeZThrInDljSb9BF5uT23VxBRjVkhO7EZWPYoHZfZ5AqHAu7iPpEhqUiPYcU6T6izL18oz41PupXHD8V7KesrWv8UksPTufgOu6M8Rz4bzfM7ni54iOHEVKoNew7kciMGqbhTtBjb6vNaM1psuUACUwtz9KwgRxuqy6N7L0zp2sWRJ5kKHHwiUNroXOE0KCmghuBdOry0iCHsltiwyJgtoe7WNqfBvY+YBBKvlTrhSouBnbFQeQaSqsHa+piUGsJ14opovGBqNKrL3vVMQZaCuaZReuOlSuSA57uJfF2sq/ztSQDE39l9ryTJFQs7J8h1vWMMlgkX3nIG1OLuB33dL2Jx6dOgUcHGdEbRfa045zW6fhDTqFPEq5A5lB31fU8TeZwte0PZpv9wQGTlp1qN6Zd3ZiLQZSq2/o5YQTzzj0KAanAhgPVPFidIiBzs61ZUHkcWhpgwWR7SYJyUWxFbHKutvnO1u8e+tBQ+QQUHopzKnt9S1/FF7bnJ/Zv7xwJIs5hWO87rVxRKRzHG0UvqELvg21cooDITf/u8LNf/oJ//fRf8fNf/x3/9t/+b1zsFcYTjI4NOPZBqyFLnE2I5wFrI+X2DgeSFj8hQZNS44vPjRY1isXgDQmmlajQqAniWbA5iaEQtjM/uUgyohMU0qAfhP8s2RdFGncEFxps5QR6xA29lBhWiefwaxYZmmwGWd7TscENHrdxJ2xgZkZD6XkzZj4Bho9OUw22hLfw6Zd9ncI22WBc1xJoUui9PzTTknlhUxIbB4y7fwZuvIerutHz/gGRl6UaDXlAaQkexN/Pwr5uheqWKrdsgh7utsHp/QzBCIATsHSY6opRHX9uPP/6hZ/+/u9DzTc+YGl39SQbMdjUGLiqMThopdC904qyQrTp/OY3/4yPT/+GH77dGUfnh7dv+e6rX2NUrrVxeXmhlmCKBjjg6/ONlNAql1WnGh4yUQWtKRv1jUvPYbUroj2Ag4AV12sGqLeF56xpBMAeE1CbgDF4iYGsFF2qlnn7xDSyNqyzuXDFqMpS8HV5vKeFmsHIInUVdIVTmTnZk5LT/igMYshr2AJu53c9vYfdYbPLAi6L5eBe8h5lgXGurdnlRrJcHFwe36tbFiPReE6v72bxeR6ZuOq+PqP69mBXYLlvd2ScZ8B7uMS2zCv5Kfebnlk6gOYAxfbYJ9KyAwDfs+iKpiisVCbIM8+gkfuvMCybkslGEdYAyzgBqtnERqsbkmgroP6Gq7PXFuDwpuxv4Sf/5jeKlCASyI1djKYXikHvoVgIXDqaEVzZO1ySBaReMemZm1RorVC2aJijiLJg/LiuRiwsFgAc6VFYAr8HyibLUtsCyEw0Bk4iaNEoUkXRmooJ5x+xxkKVG8Gb4pbsIlvPbzFb3BETpdgFkYL1DKIs8XzFGTbzoQStzvAderKdRgyLtgEcYacXyuvXk8Xk0PJoffRkXsMiCVWxpYVFSP47ZRTEjKHhZx5gXzwLlxH5kPH6ZxbAtO3qputsMq+0PDtnWLqaI+8IDTcqRcIzOzKEZvjwiGLZLQkcUVFYP4OUo1gmzvTc7idbS7O5lBzmTE/qxQYmrIHnYot9+8FSzGIQASBp6jHPekFo+f1Eww3Nw+Z4ElC8Kfv9TvtYsZ8Gxy2D7XsJJqaHiYFAWJFZz2Yjm/jqeWZA9VAMxvqItbWPPQJSHbofeGu4SYavZhaFCN2jKfcE9DoJ5uTrrOFnAuk8DBOm7ZsMo2rjGAf4ATaiQUobFTfOelgGbuEpbmPmUjmzSJIxOHq8tlVPkBCsFdyNzepqtHYPkFMIljBiHGVn15EAYs8VlD7fEhaEJjfmeDDA7YL2DEIvcZ7ZBCE87GzamHVnjTGbkKSwCXDk+W4Vavj32/T3l4e9/p1cX2rALzXglxrwj3+JaSiLbarLK0LBuK/7b8YiWq6sBIMAmgwsFTpO9tah7NYEitw3tlxj857N71hEaKPMF1znmfm5/4RGLO38FzEpLd+zRjwKgFOelY+/+sD9u++p9SVgFBJ81VBxVi34uHN7veMXgkzUNkQ18mrc+Ku//Od8uv3I33zzN2y3HW+h1D/KDfGPUWttSf4sAiWAQXHiTK+ngsm6RJ0nQtWGpxprE+HeeyjcLAOTPDKYgbR8hqySSR4I5tMyLQm6YtSqkQ0iiT2InzWSatpbCmU4tLjvJgIJTFcvFIs8S6v7AmJjb8h9RySq8zH3oxxQyOPgMHCTGDhVcONwo05LU90whSGCjcjdKeeCCvAvMRbXyQ5P4H0+a8u6cdaA27pn7+aSvvKWJp7ikrXf2jJSfZbgKDZzah3hzN2ZL+C0YOC7g+yfWYE5MVZYvCxmbybxiuY5cJo5no7almdIDMpNA9g2oFTlxhtH2anXRr8f3PqdbWbBeItYDxG67xQT7nag2sLqeB943bJXCsB3U7D2RkO5vQnXpxgWXS8f4vkslept1fPSYrM1ixrTqGFt7hZRELkemjd61ktlEvQMZFqTFgM/qLWGzd3sMYunDXdFxxz0SZ4viXQ69OpL+Vw9hkYtozrUHblEpmn8fQLl45ZqWo8zs1Q6g5ZZLqM4YS4qXDQcpHwYJvOsDitoS2xWRLLeiX12k4dIFYs9R0TwEt2FP1gYuite5qB3gvOW1XMQwybZYs/nqNDelTMEZJ2m/Rxah5CfrgJTWStnng9kLyrn547zYA7EJWqBVjjuSi+Fy88+8uPffgMEIi8ClU5Jj7dD33gaH5Dd2FGu1yu3o1OrMYbRtHAZNV1PsvfbbqgU5FCKw/P2AWDFwhTZVr+hPiLzTgRG2vBrW3vx3AOjz4l94TJyjwakGKNJEvSirglL/ho9Gc6R/VRLJZhrQWoo14f5Q+1fkX4LYqPHsDVEMhNffqhJZzbm/FkzvNalInPPwegQZFjkcreBW+zx3eMsrV4he8bCASWdNZj4fiqn8awJjmX5D+AaZOKoFTSfHV0Eh7DdzfmBK0PeEo9JFb9yzk0mSRdiHoHHmZZ77K7OzK4cJd3gxEPE4k5QRI/PviuhofaQz/Z71x8cMIWNwINpic2p3snGWWwF1WhukRVOFm9AV/6FpfCtsGePHCzpZaMzX8+jKYzXLot9aQ9vd02rDXoOaKY9xq7+wNy7U/SKZ1C01sLdYXSBorieft7mAlIYDt0OmlRMShwwKEcG5baiVIyvPlzZ/tO/4IfvP4VE/H5n3G44R+RXqBEBlboKFQCvsbjC3ijCYadcbl5T1lfcwGb44ci6KBuNIhmGmw+jn8Xu/I+tlNy4rRH6JUyf/1I8vyUJL/4cVk37ikZFiQLYHkhY87vS6U2dQMDqY2fRJCWsjoR40CYrOVf6YYMqVzASVDhwNXqq3orf8ZSr333EKlKNwkFJBuUMCvZVBB1zgFXKKuLfyxXArEahANwkbFGCpTVl8v1sWuZNFwO75Mn0kBXzYMm1CD8E0wA4mcKUtVndauHWdi6/esL+7Bd8++23mJXllzrGgNZDfVeimJSiHBoNehmFNr20XKgq/Bf/8q/53/n3fPr0idF3vv/xd9TLxldffcW1bKhGmPEceE7QI8D5ydyef6hg5/emENYkPhn/HrkmPlnv2eQZ4Ztvc70rkk11TPazCHXi9w0oteQB7chiV7Vglji89EKxJ9w6DUtv75M9435mQEx2qbLnLF7ycMn33WsyG4Qz48cZZYb91vWJxYwyc8omY26G92WWWewRE6B1ZO17B0oOgbOYW//OUziRoF2XsRjy87rJWM8SKe2PJTgBmJDAv6erGeA9mmEPsyxPIKaRRZl0JpZzl2m5WpEx91XLDIZsaLVQXDimcsP9QWGSh7CdoFTe5Yefm83Ssdgq0zJUm6Jaubxcuf3wE4rSRLjoE6bCVcNTfu93ujjXcqXqhvcbrhscyraFbUH3nk2245oWojl8mZYTqkq3YJfG2okTyXWJdEFj8KOqWCuLoRnWS9GwTKApWDph52AWv79eEjgpyhgHvZ9nUZRQljcpcnXu8xyMZcnBqZuqLtQSRc6kB5fJJp2ZKyX3K+0gUdAN7hgDmYqlPHuLaHj66x7nsXR6Fh9lZfeVqAMAPWddIGF5NqyCBmjgOFUuydSKZ6VI7j8edotzj5bUrBdOy1ahr6Z7rqlZbL6XS1JZMUqcUSpR640OyNyLk/GEMJJJ2GUJCNMmOJsjnefaedYhnf7Zn8f9aA/7j+T+PtXuc8wyAVhPwKgwa8DHbEqiUXU/7704r+UW1os/K3z6LgaPrV9xcTaViDgRUD3CCnIuUonGabEnEXY9EDrXEc1QZNfkd3sUSgHfO13jrFzsOTfGHjYKqkoXpeoZCg1QtARQmQMmKVkP8rbuBYSa0btSPQa9JFBTTHCLvCgtBforYoaOHPhSV71nFjVz0wZHgPDtsiE9hl77uHNtW9hIzc9vyuBgjE7fnLvtBHwZz7pbCdZuNi6pjcjvXhEaQxeklwDg2V+oaSjpgE3Hav5mto+7L1s4EWfM5oyw0nTxlXnyXq4vNeCXGvBLDfjHv2oSi8h9vrQDSbXM/eFcncO6c/g3KDYie0WzZptYBEmGyGF/2HVWptoyMHZhDmDmsxgvHP9ljwqmeAdA7FtzaIUX5rDQNYYirwdsL0/cy3cMvwXJw2DZdx07aCpnbm+h/miXxAWgpupsu37kP/vNX/K3v/k7vvnujfv9QCTIr8ON+7FzvB1sWzyja0iQhWHXzgQYnR3zIMaenzfOZq0CBxwJUFUPzMUsSUTuyHwtnzhIgJmeNZzunJgTio6RhJ5Ca6GQhlzPagtgHR6fZ5NGlQtNHeHOnIGcw8S2vhj1DZ9uKJZM/8wljXUBc+LtfiTIYjhT2Rf/Zoyx8kARC1ed+IF1f856Z2AlPnuxE//SiVNIp/mV93JtZQSg+gCuujteArsCcnXHOAlvqBYC8Ys6OWqmOFf6HKCzL1VUwIE5IJiPiVeY1rizNvQ418Oqclv3buhYNcAJxxMYH85edz5sH1E36nNhB448E4BQ42VWU9XGXQ7E35Aj9gFpwm7hevSc3/kOeNkYA0QGoxj1UpFSETNECloTnIZUnJel4B1j4AUQzfo5Pvi9fE7ShugbpmsRCKIDwVApq1ac2KB41IprDyNgxjmUhtj73Y2hwnAJxb0oooJQwyJSNXogi+HvcmEgVe/u9Dz3azmBbjT1swN0Mi8fCD6le1iKm+DbwMUIMfYGOKVEvRrDgrnmzhxVn03rWjMO0tEx1Vgdn44T+d977ax89ndyCR1GjTMalpFVFbJOBqfSk7C4VGfZ78QQ16FMjCFrbKncm9NFuH6o6MfG29sbm8SefLELU9W568EbrzRttN6wQ3G9c0gJd5RhHEl6LCUtw0sLp5NxCVeV7Amtp2qVkfaZcZaO1Ny6KN2zX5R4Fubz/dmCt3buC5p7j0UvMUl2Ip5qHnLwkY4GhO13Ie0DcfqY53FiIH1aUcrCRSbhVJNOgEe2mJacd4gnKSLe6G0SSMI0Gi2s18AcnYS40RGdfUxbKuqzdh8rrylKkYK4ZAaVA5EVFz3RQenPCLKy0WTsDJ3Zh5KzDodxxB4EjLRoVWGpsE0MLcphd46pRup1VUglCY0me7onRMc986BWLYicoo5/4vrDAyY2Rvclb5w3dzhrAalc46aIRD9gFtY3c5svmtYECQmYI+XMTQpuSD5g4gtceWQ+ryDAz95bXgIrayMPuBloCyBeKcnIeT1ubL+88u3/8S33Ej7FOsDlihPWIK8/feJj+1kyIo26bTGtHYrUlMpvL/S0gLteGv/1f/ff8N133/HTjzvPz8+UVkG3bDhG2PgQb1FVqRATWcvA1vxoXS2D0JSSdn+FjlWPMGcpC0jx9DSpooxuCwiM5ibAwwDVYE/AEI1PVcqJKNooqFpYp4gyvU29j5ARHoZsgpjQahQNwb7NAEfvoDOc9FxOQ6LoMr+hLe1LZG7+rMOvURer2bnHAyghn4aw8psSRM81go8V+Fe90Otk+0hkcLhHQyTC5R1Jzec1BB5ZtTNUOaxfUgmQz1Q0qsGeHlIw3YnwYtYamcNYt8ZicVhh8rAkZeqOsx0zCLNzk5Dw/+pf/Jr7tnP/D516i0OoCSFzVYugZpSf+ieeykCLcdNg/IRMOt7zf/Iv/hX/+V/+NWbG//Xvfsf//L/+e47ffcvbz77iaTyx8UxLICka/bTc1PP7Hflklz6waXeY4FsMsWdDzLo/RTQKSRurQZ4FyVQ7eJ/P4B5AHRWRYEEcB5SneP2RA8xalE037v1OtxrPno8oflUx09N2zSuaA/Vj2l/p7Ry+AybnQerJDJ1e9kUL9ThBBYgBqahjIzZ1T89wSWXn8PNeeHH6ZPdkYVbrhiZLssmIfdfA8zAwOuiUGU9v2hMUbn5Z4M8QQXK/2xPQ38ZlHVbv5Zr3eLqfLOMzEY4Z4mxhuaGqXMYsWAPUUpUopvsswud/twXGDhFaFgkJZ0dO4SJREEXvwyFszmdqoDpBpU3p7uhvjCZP/PDDD8gneLKvqAp2ZD5PVS7bC2+js1kjWHA7dymozvlOAAAgAElEQVTIeOXjyzNPJZ6ROmDfw+O8tcxoIkA9c0NRBjpxpQA09hvtYsl8md7ZwuaJsAP7ZC36QDn3VCuOZ6gvgN8dHUHCmAAfIoxhDw1qNPDig0uCcrt45sGczPAuTjq5Lkn4kB280i3OqQ9PlxwwVVCl6w23A7PB2O7s/IRVw9rBfdy4l/sCBYVtnb3z6myUrD2GRrBsPIcH5sJWleENBBp3VG4xPOkj//11eS53ObBkx87GrnCgK0Xely2LJTnGRJDfU339KS8ZMWCqGZSqpUddYDDLR+f4jMgSlos1lA2SjNI+TyNb57Nr2qf4aYPb53BAJs85dsT5LE2QAZlKs8hpcNtz/56qnLOhddFQ9bnTk9HfG4zEcJ4/fMB+0fj06RNt/4CqUAfUVNy7WIJiASTE2fUUYfHu3Psnaolz5maKqqPq1LFTa2WIcUufi0t9ptvgp/FGuW601riVrM8YVBvQS6rFsuYuoeKXxL1E4+eLB2O2DkeG492QbvTDwR2favFjrOdlHMGItNGTym9IWkIiZP7aJA3F2u39tpioxQo2b3He05t8YpcfAXjbXuk1ms6p3lBXeo2crOEFseeornUPu2zt6+tS2+J7HIPa49m+yBGAquUgV644sNsBVNQrR5m2ZbbA42lrqbKjvx8s9ye+vtSAX2rALzXgH/9S2yIbU/dUX57WPC1z+cZ5NDCVx+ay6oLiPdXXHrlXgMuZD9SF89xeL9QXQO5inxFGAMRDtxR/FiC5zE0XEL9D/lkd51DG07bu9iT0T7GuvrIrRWooI0ah352+7dzLoKnQ94N7qTEkqldEhP1251df/zP+h//+f+Sbf/g/+Z/+5t/QfOC3nf3HT/SfO/JcOe6GeEVrKuSnXKWHMltVOarih4dtUYJb5k4tYX/pwxNUA21t1cLqiQlYDaY4UM3oYw8VrxGZe2WEyq7EUGOSCZ6LImKMWZ8NQ+Z9gHDVGR2Vuiz+xTb09FF7+N5TRS4HJPA6S/Qg+043HcX8VPQ74LWwz8H/UC6uCeY9DGNTDdXVM2ZCcqirlEGo3Ag1wciQdWu3/LMt8g/fyTXGHCJNIDGH3rbPggF1pyzyjuSsVRmZW2ZUlBvuoXOJq3O2IRl773PyDTzEMZwGaOA5NI/B7Kyf+8pon0OnRzJgVbg/3RjbwHpBqvLmr7z410Fo6E4ZO+7Ck73EPjqgNM3MEmVvB5eiDE9HHotaQ92Q2nhqbYHVClkfajwLaKRySqjLSxI9REIBdJvzEgmFj6daaw2IwhCQqSooNc6CcYQjRK1JDhKnH5avMftXjfWag6Q6wnLP3NfP9E1wJiEJrtLOwawWpFW2Hr//QGFA751e0874OMIpQwTnoGTtxchdr44g14lyu90YLbJBZRQKhWHCeFB0H3JAScKdezg7SE8SW2HI2/qOkSAWHJOQIx23CeSnbdqhbLwvVWBguOeedA5WN7TPTMp7WooT7laQETUl96y+8OV4TeeQwa0JXoU3h4//6s/43d/9HT99f6eUwrYXniSiSOjOfe9h+2+vvPWdn9cG1nAXeilgwtEPKmGdfXGjD2cYXK4fkjgAbCUoNcex6kKxVMG4U0ZbTlY+oq6kSIhoRJI4AGpjESR8KKPFwCes0JytZA7aHPy3gZvhGRsw1FAPxwVXodbKcRw4g+6f9ybuMURdrhva80xr655Li95nVA3LOk/HL3e0g9awT/e+QfZpovf1/R2TaFpsEfkgh05stDkYrZFh28dAOVCJiKHLEc5wnXA3iCF7qm7LtnZG94OR2JNIQ4qgvWEcYcENLPcUgT4MscZms0+PIXEC+0yByfxeEBh2ycFm/P7hZeH3/9T1H6kO4wuts2DOA9rSCzK8rvvkLWBsi+W5rEy4L/blInXkYkBys5sHg5yNxyzmgs0W72Myw+CcPh4YIlN2FtZF6mMNSoQCs/kswTauT4W3206RwpM/oeoIEfypqtztzmZPjCEc3YCPkX+0xmGeE3sSGRJafeH5wzPX6zUYBT0GOeJR/M9ryiFVQqLn5VRQLfAFkuES4KTkA+BuS8Y7D1gzY4aAPQ7hPBnWPYui4Zae9WHbYsPT9i8A2aKK5SQ87n9DllfqBRdnt58YyQgRn4GLBrlxdLmt5qRYLNhDN3RuFvnncR+CITGQdagYESQtIlxm6dGviMfBcdTb8v+e/vubT7ArPnPtba3cuYb19/y2/9SXeAILs7mcnzWDHGPNZxgfsu7lTGHAHFdnaADJJZlgQl8sKE8VIEBNoGko9Bpr5XrUBYSaDD58/cI3/+4faKZp9VPpduAjGGK9h7/1fji1KQVnlC0AUcC1wH1gNti2jV/8pvHxb/+By3Yi615G2BgQzILFHprTeA8gOdRwZ0g7YwMKh4zTNsTKAoe3LCzCjmDLfUPIdiAYnwVsJOtaCC9lyIIwB8iuwbgxTz//LcLeRbnKxrHf0TZ9Xk+1XgH63GSTDbcX42nIAk2mZHvaoICeShALqa5IJrB55JsUC7AJD56EJLPS82ZNZkdL9hEejW9BF8vFAR+XGATzYBHFwat20CgoN0+WRMr/H1TZtBHAOUCROOBGQkHv6QrcR9ewZwY5Tm9vgCKe/UuAtnGORbEXjVSuRTltVqfNnoijdr7W3LcqB6RMuJfbufdMFec4hw5qCfaQw3Z3pBXqxwsftsIYb4xbqIJaLpDDDxpv0XjJNdapNUZ7AuCt76heqVIS/J95QbE3upxKmoGjk2k9wSll5a6IZTbKcIrGWncJ7mqAyT3ehkiu0ViX514miySCFqRm/p7HoOuwG822IDpo2JzGPYznv7Sa1qf5DKedyWlmy+fDg6OE1/d2rO/aOXJAEcHP/bhjxUL15Nuyq6mi2FJ+zT2YBazriOwfM8cz12LI8dDAQhPN9xtgi9qOLU/WZGL5w2t6XcOK+TlEZNVDu0d+wnu5ilXwipR77MXmiCpNdHmDx6C1r6EIMCetsSeNc33E+RY10yE9QCgr655VPWu8yWJDIict1kNZr3OuuR5A8bCwh4Jke85aIKwSAtM/77lp2iiocXn5wI9vtwDUMUbZI/zWjeay9oqR9nAqO2Repnu0rsOV4VAl1sqhDfGDZmVhJvfjFvaOWhHLocmIfNLTWtAWw05FI4sn93JB6H2y7sIqDTOGvRFGKY0hp4rdzJI1N6eqtpqsUDkKYrp8tKPRm/Vkyd+ZqgCiWHSSMSthRdcU9iT2DEKZ5X3gLYeqDkd+b80qe9pETJLQqEKZQLUr1neCQRiDMvWKyC1CwYVlnSdsWSvkdyHxmiPbmpb3cHBmPL2X60sN+KUG/FID/vGv4kEkGj7SQj6BHK3nYM3TAl4eziWDwlTHplpMhBmAHbmbYXMciug8w1f+wKlQMj/7z0UyEqi5FoqxyPSLSKtGWQijMOysve7Hjms8uyLC6AclFVSjhFpmKFjTyDfxweahbtjdUFEuUrAjlKm//tWv+Nf/5V/z7bffcnsz7O3G2A9eX3/ier1SyhOhpirrM4V9ncdiqrqGdmaKZtVXzPM8GkGchVRBthwyzHPnfG4oFiC0h9LUxehqNFi/o5N2kAozr5D8Xiee4u743VLdteFaOMzpZax7PBUu43yC8ut/IK+QoHriC+IS3707KyrCR2RpuyPsHFzgxMaDlDSz9ZyoiHMwLCaoXZHyloQiXXu05RnQva+8tfdwuRVER6oDYR+FYSD1AwXSjrQDNYkvmoq1QO0EUHnjYRwLkFZVc4BCkPvgHNSRpHOP0cca1q/4i7HqlhjoJHCb4KvaOaBxAktUhXLZ2IrSf0zl2gJ90w6498DG3jp7qgY7Rq01B50XsKjZzHd6AtkxjHnoTdTP4SYe9ZRLrjlfanuIddKXEiUA+xMXZA1BZxW4/riAm3FIDHXdnVE8SWwOx8DIDEI5KB5OSbuNqA3rHiqr3plOPyYnyW9RHkSgRT1Y832LCkNjSGKmsEf21JG90BIVANjOGCNsL4vjew+HgZoDyhQekGvmmHaYI864ItGvu7OyK6dyN75/Bdlx4uc9+4WS6hUfl1Nx+U4ulY57Xd/z2hXlHoSZxDfnYHoSNM3STDtaRspSuie2DDlkgN6csRWef/kVMm7c70GwtCTyQyiOYo+LuunT6w2zGy8vL+jliu9hRfpilXKpuBT2/TXx/3OEsPBo0hVhRB17zfzebndaa6gpXXWdpQwJ5Vx+5+ez6HQbJ7lwnqWLKKDAQfj3Cd3ifBkq4DdcHO2ZhUdkTgWO7pHDaIGni3UkO/zDt/g9y4q90A9oLUQsI1V+zW4x81DFxBg2UlkXn1lTjW7liHoJuFWQe3zXJWtmdZYdqiSu7Q4mQX4tOZzPn6ZkzlQH8Mgc7uV1/fuy9snEmITl2hH/ztbgvcQENyxJc+/VUdffuzvUEBjF+ecYt1SfXROHN1xOIsDvX39wwLSL4wqXDD89gbP0AEbB06M/Q/PWz+QB3KWsfIvJshM7mVe7sEAB9dm4soYmY26yQixAEYaV85DRYz2kM5grmCtzs5IASID75nR19Osrt+93WgnLjyEvlPTgFnFuY4DcuRTYvHDYEYdWDnqEC2SxbmLs446rcL0+sW1b5jflAE6njdBkFCRjT6K5GCO8++PNHuEHKVDSC7GUODDCTkWCoaMaB6/lwZaTbffzYMayAKPhdpzFtNp6sDW7D9cHaV8Oi9EoDlWj2WytZcZGsCAHZ46ApFxW2FbDG+/nwXqIKAiGzu/4gs0KMtk84UylMXzLlTR8AodZrEvH3dARh71RqSMKhV7PINzTh348nsfv4tqkBnw2q+w5YPO+GuYAP7NIF41N1NtizZThjHqDyR4Aql4SIHUebRp6hsTNwRyEz3vLwvcQpT6/cPP/wLMOOsaTG8e9I1uAS3aAjwj77kPR4wO1xBDVF0spwm+7C1u78tXXz9zvd6Tfuf4TQrL1jGbjFABs3gLbYj27g3aGdUwvWV+limQCVMvearJ/AMp6fUgFSdHV7BdAdYYqx9A8y9h4KfNci5ULF4pXKo0y+8HysKmqrRDuyYJs4/SZDUuSLLiyKGifecNOICDUl8MGpV8iY0CELX1P8fDQjc+nYCOABOSUyOiZ3eHp7zCKMXoW21mYmfpi0Uk+uypCIb3POV/HNNmuD5dyytffyyXVMX/8XtL7Vk8mKcMWkXGwMSyUMov1LEaJgEDK2scGJlFcqzglg68nHhCK2b6Ya2OBBrmv5dk5196ee2DLImpcCttz4fr0xO17sL0HcVRYLKV9TyaO7eFTb30RIvwWzesmQk+wX0SoK2PqfA7qKCdYPws6C29fCx4I4akHHPYQ5JqNd4VZCherYfPD2cwFQJ1nHxLPptv6O+TCFPDMs2cWpvBYPMI2WHkRLhn8PuScMYgsoHwyagJEujGZ3GhHZMQaSGX1VAi5JNtITtbjtFXztLVQUVRJex1nd2HL/MYAFTtelbI3vDszQySYmA/1kDyAGlP5M89PiRyimQu2n/DLn/yKe5r2Eh7NG1JQT0WyhZ1P/L2uoZBx3lPTsgZslPIACv3jgzlqw1jPJ3gZtaY/3pb0np41VcXXeRrgQj2fz1lzwrK/chzKQAuMZvhlp35w3vZgEV/7U54BDqI0Esg1YFl3pH+1x//vLpGrZE6tweQMdvfgyGe5eMM9Etn2u9GPA7XBtlVcFWuVqegPuwmFrmd+gebp5cpIVcqeGTTdY4AOZHj7BfP5PN7zvtmpCM8HybWlVXICB3PAOdXgzMYPhoxQ5rujNZrUrh1vAR507tz1CBa6nhZv51p4ZJGnT3luPLE/zrBvXzbLI5sbJBquIdOmYVpMxvcQVjRjrUFPMF6NZSv2Xq4vNWB+7C814HqJLzXg//frvvbjR1BKGH7uRY7jZQKb8WPFW4Z8B+t4PpBj9utWlooaWAqXNYWb3zEQllf5c5O44rG/h/KsUHr2yQ+Zg2NaGFrkhQQQJrSngpXOzd6iBizXAOflfGZ8GOPoyCXttOYZK0EudWt4CULD8/PX/NVfVa7XjW//PvbNfnf2S+d61bCoWqD7OUCc++k2lL08DHZm7pkkcdgtrPizrlMbqES+RVGNgXUypN181RZ4DPZUOsfKQzPI3GnVxHkkBl+S0Qi6W3zH8ytpJ9AvmQES92Jmn0nakUpWDseqGdaaEEug2qOmzscratCw3CxagKdFtKnTLUU7UxmnqtCnQjju3yhRT/lUD89ssMXB8TWEfw9X7Bmn2r+UE/+TbrH/lI2RygPJviQ/VfxfawydKuOpJmcpAVxs1fBlbSmWeFTUIGXVi0k+h/We4twvqweL953EnNwztW2M46A3h1YwLQujE1f0CCzOfWDmVK3IPfLAVBzZDSmGpdvD4XeUceZESXRGkww3LRxj344MIXOHvqGt5gAu7knzRsuDY0jjWDchCRhyDiJCxTvdiE5FwlR9YIMuPcj0a88DT7XzrjdGEi0KGxhUK+t3TXJDfnHx+8vnh7dI3LOqD4Mwq9jQtN+T/JlTreZ2Y/QdVWj1wnEc1HQEGGpLEY9XrnOvTJcCkyk4iN9V84xfZD/2zLuLvC8sbcOmVSr+mQruPVyxj+WzxUlaMC/UtCB9jKOZn7WIr3+zBkvuCy8w7et88tLZdXD5uiL3K5++feWonZ6ELtGeCu5BTbVXKTeES6ig3wa9C15gf1ZqEXYXRi+MbkiV3Bdh2LSolOUCUo6y7MlHDdw/Mo3SkSutd32ApKX/KolFUNqqgSWxgPnMzp/BQsHetNGtU2nsxDO/c1v3qVtgEUHEybWknlb/kVFZLe72XP/uIwhbA6rkENSdOT63LRRV+zBgxyQy0abaFZR97eUSIxN3Blv0hoBIkDcNiz1OZREUDrEcUgfZZfZ3czh9JJ4fr25JpIknOXrzU5G+HCAW4SFqbUkLeu2ShJmoS6OHmCQT51Y72qO+EH3IuPx/O2By7Rk4/ALOWV6Oc9GLSrxpGZADoqGAbzHt9ggynpcAo4Q13fzfk3FAMi2HZ0Hivtgmnx0c6qtRlVGxUjD31VgWb0vWrMBtLlyH7qC//MD9m++4jTtPbOk36hQLEGPYGz6egyVoCWrdB/0yG5bTd7C6g+wJwhVKaVyfXgh/yGRNLNZsLE7V9FgUKFJjb5BzEBb3KMOLS0HHVDY53iJw+8wBAbSuh86m7VMJcNXuPZomJwZIGfwsa+HYOryiscuGZBzxdx4bYe/GIIZtkR0VoKNaBBQ68XnqAoJmkGwD2RPw0/hdRGEHZ7MLkcdUVFfRMC9j5lXt0I0iEraHBLgyNKXbvv7P5+v4/dRqQLBD1M/3NZZnui0mZ8eo2fzGWjHEerK/8plIL/VZjB7saV0YzI4FkC8WT4LhwEhLo2C8dOpWuPsrd49J/eu4I1IxH7QxqLUi/c4mhXIcmDh2hHViqZ5N8yWfM8VV+cWf/znff/99SLT3naeX62rIRBSfLK8xgWmHtB3yapg/ZZMy79wscgIc17QCmZkx4hbNlAeD7BHcatpyCJ4gS4m1G0NKo5ChvrnxWgKGEEHPDeVaGlu+/r3Yua7mrN3DF1pE6HICRbgiU523siKMM20mcuTMjDEqLMZ1NlRINjwTfsj9cDFN2zpkUjDBCvibd0ydUEDaAjpbDgKGjZDT5rMnIriO9Tr2MKSVyQqTNRd+N1e3I8KK/RmAwS12M5sMfLJgzab+ATCYoH/x28NzOdnVGUZKqLTnt9amVZTDUbP4wcI2Ll9b5GRcTmRoZPF4zGykVtg3UC18/NVH/O1gqDG0IgJ1Pxh+IFRe5Y19XCkUqn8dgMMQtu2Z3tMjd0CtJQYDxNG8gnndUZ/A0QSYgRFMV70LUvMMUWEMpxWWzPuRVTfE1jNjk4TiDU8rlQkGqCqlR+tV0FC6ExqVQbJeh6fdV1oweMjdI6vbqTWa/VGCpR8voHQ7Iug6P+BR5HzG7cAnw47wYvYaVjjuwfYpsxnM89ofwobdH/yF83MWU7zeGCTjOTq3UI3AYjQHuyuahgCALg8rNd+rzvxEX8HGY9LP3skV0E1csb7jz4qEklv1BMYAFssMWzWaui7bK6Yyh9OiQ8TWazRLYEnKUgsen+mR4xrzexEwdcwOQhmQa5rIg4qGlQXiyPyefbBPpHgb1MsVXoTjpwg9vveDJqfFZF8FV+y97Yy+pJcde1AJAjyNKzWV/gfOJFcNGYgY++E8N8VcKD3CrrVWxDt2SfuBEYDN5jCqn0Qk2aOms3OwMPebLkavwm5w8QPBGL0jCXSYS1oVPTYmM0vzASQENM/nwTRPCdIZEoy5MdV/PvikB96ctzp45QYlVE0gER47h1QL8JEVEC4WdhYQg9xSNd5fPohNj1Az5dqbNogT3C4SNjXhWuP4tNZJQMVVT/D9nVxfasAvNeCXGvCPf6nCMZxWUmU2v1/T00JL+lK3z6FQScKnA2JnGHZGnYV6xlL5lRY8ANOC0PwcKjXri9yw2MNelyrAdT+Ve7mvSa7zGNjkcFPgXg5MjK9+9cL9x1e6Gi+2re9i83RVcdAhjFvHrydZRzOvb4hQ7EATCHy5VP7izy+8bK+8vr7y/FJ5vly51IaMBjWIWJOkNKTH70jG9nkSW6jiVVEid3AIXEfY+h8SDgHh5pKf2Srm+zkATfa0J2iXP0RsWYJKTbBVH1TSjVD8DQ4mAzz+U/YgQpXfr6NWFvOBegDQKmGl6o+DaDZg/6yGX4P5AGu4JCv/WHDeecSEnWUQc/F9bVmzhLgTrjuuQTCag+lZw76vkyr6JGVg032m5uDUYrgURBhDZh6VHwyHVhqW1rajcFo/W6zZIieg3PFwGiJ2PmA9V9M1aGaUf14NWn43ykVib5tXF6NYSey9hT3VHMh62MSF0s5yT0+lhdvKx1QLlXicn+EWdJ/9W7+v71RU0yFhgsay8gHPMyisrpywKy22rSzGOaSNTzXWMNuzbqwqTGvUR4RLrFKlpkVq5j2VwhiRGWvyuEGfUSdlKk8m2VJfk5wYS7wYn9WzoBxzyONQ6xzgxgvUWrHRs0ZVsMx4m8r4fJVSCod2jFCjJ5eTgeMebheXUdazf+QgyaQgaeeKB+4sIjSLfzO8M2NB48yOzqVrEKvUTheR93ItJ408pOtU2K7+mJXfGP87vyyt4cowRhBv/IFE72BF0NxfR9vQFsO+p49w5Yn+Tcf37KFHZRw7pRTeyu+oUsE2nopzHHe6Ce0YtNZggFpnuxi3cbD3nQuVzQN/N48BbR0nXmLYci+Qrow+UvWk0b+0gkzijTxgxzkVKeoMm1bRwCJUjNx3KjVJxe4x9BwChbZIMrM2LnKgOnLQsjEsiIEmoaAykbDf4yTqqQhdR7S1LuuMn1hIEcUuB4M9CHV2rPpSROhell2jMjhq4P2aJNhiYCnQiJypcDSTtKQnZyA2ghhbyrmGRaDIjSHnHjMxq7tljQgZWQSbKirRI+kkLElh1pgUZ5C9haczjZ5ExHqkXd6aE4BIp/jnxKPH6w9b5LmC68ob0oeDdIWvaYS5RaOfB4CD+Gl9s+Vm1s1wiyJ3bmBzg44bVHKBeW48niydYI/3hfwA6UGpKrhZMK+8rL+v6wYIe3KCjxKWEPW58fO/+DN++9vfcjflvhtVlJoTYB8HnRv3fXAcAycesGYtHkReKNUjEBOnPnW6SFgKtRaZAJzBYX36gc5CQjTCvyAs3vLvoomMAt88sjAiS6mvgv6wsTZRt5ESvzhgbZwqsznNR51tzMm/xAQyg9Nn8S0J8ogIKhNIVXBhmLL3neGDps7FgWEcdc+HaKwTP6au+WBOFrwelLSycBFq0oxOuX+na3iDisbsUlXPMDTtwc/L7zcjIbjLLFYu6JgKqj0ZjB6MT6LhXbkM7+SykXGYmfGw2LVVV0MHysFkdMymL7JiPIvawjx4cq3bCPkwDuVUUpRpcZnhcQB4YWgcPMfTwcHBX/+3/5Lf/i+/5dOnT5RRMK9UGwiFew9P9jHu9O7I8SOag8m2zXBM5y6peNPC17/5DX690g9g0wyWS+bEEc0BgMwKPJnMsVZLsjfW30Lf6RL3aHgsO80JvY3OY+llK5Mh9h3pQU2YW4iI4y3sJTQLtAngTdu0SxbHz+WJj/oVcleuEnvJbqetVkHYPcHLB8n+o7+uTYaJTwatMa1STEIybAQhN9Zyp4lBWlFVbM4n8t/YAzi1L/AhEXlai0IvCkKjtPIZUDNwer6nogSTz8B8AvQRuusa6sm6qt8EIl3eHSs8FLRn1s+UOduoITkHdHoPE43+P7rGOK1a8zMPqWHfIGHLM4v/t4V17QtMHxoAjMMZ5pqqzsm2UW9McQSANEOeJAYgP7tQ96/54YcfaBlGqdYoMhhZ0NkxKK1x3CSCPK8f+GnEc3e9XkNp4caFbBJ2XWrUoXZ6HU+b01pwDWs6U6Nkxot6C4sui0ZGVWneT1CtQDQT0czVqrRaqBZ7WFWhDsEyTHfYQLVmYC/RZHlhOHhRDjuo3qFncTwGI7+vyApU1AuSTMXhgh/zzE5m376H98Zw3vTOJw2A5nUcWYQrxYPVJPiyol1MwdHQBXJoen9LFvpgflsq4jIa8xmLM2YWevGsNruvwdU8F02eFoDftMfrxbeBCFx4X4idlrDOmASWWTAOnGOilw/7gFncm57kPMtsAmV608e96EG3i72Gh6GDTAteX/v54y4TIKlj/orLtC/ylccC2UAPBclGNeujqMfyzPGKZZD6Xjv6clA/XPhwfea7777j+2++p+ovERFedl01yHy/b+ja3sdwrKZVWZ4hdzpYQcRACzaUWisub0EaapW7sKwvrrbRu8F4Qo+sC1quhZrKsFQ8zKHfzKew7kEASiKS9BHKFI2mzQZgWUtY1BClhFIBkv26zipLUhfMDLouvkAwk4NjzzygApF1duNHf2OMwe/8jVu1dV8B+gFWpn2YL//zkuHFZhZgPIA7PZ4qphAAACAASURBVJm8U1Wl7gsIHjIYi+qWf2Zn1oyLUJaF5gRvx2dr9D1cX2rALzXglxrwj3+NMVCi5y6l4EUZZHzDzCND8EcyLDA47bLCKljXfg9g0rES50W1soYJlkBMMJDnzz5C4PGn/UHN2R+Ub3MI4h5kKCQGHNYWrQMoXL76wPbnG9988w0vckX3zuVyyexkYRwdzwyZYReGHWxPNfKyBVpVXJ9prVHk4FqFojf2o7Jdn/nq49fUcg219vjEVWNIesznU06VtWhZTiG7xJBoDIctB017kgAUioV9LWlfFPdngIWCRx1G1kObhWro6MbC0VypLR6TArE/UOMcMwtR5yXzqjQGttoPZB+U7uilMvSRXBaAXpFpkUgwxoWVS1q0J+gJYIxyi+d1qvRHW3uo+W0BirNfiM+4L4KElKidfaR62ErgLyRA7xkGOVUJAH+AFf7/92X6Fqs4LUU7sooylwskEXm6GGhaax9mkMPwUME/1NWquNXIJRkjAM2s3/ZV99myzYpBUyieu9xjHyXIy5Y5EvuDP7O7BxF9qVmNMjx6lC3A3PLhgv0YWSk2rlh39n6gqWgDTaJ7pbiw3w7Elbd+0Fpjqo9KKVypdHdsTHs4EDuwzP2rZYt9lFlDhhW5UpMgd0ZluHY2z2eOOPeHsRR4qC4VWZ0Ze2PD/EBQuChv+w9x1m2xJw47qFlDKacLxKy7iz+t79TuxyLOXfOhFbdlwXeXiA6Jcz9IHFUaVNZnrx5D8jFJVg6f/M7wwU2dQ26MMugzT83e0p5dGaWHlS3E9pfPV4TlOGr3GP5lDeoJep9kdVmYqukkI73FvXxHl2d/uYgbTJw9yr0gmyiTKFV0Egd6ZMqG7dQaQs5aQ+ZARyTcwT50hhnDr3z4+S/54fYNT/f4++bGkB1XpRj0bvT7j7yWPcl1PyCXK+xwuVy41xsfuHK/RQaWHDf0OheOcr93tlJ5SIVBjvgOjjLdqwreCorTjo63SZLpSciLrGiILaPZZPNNPOV88aolLLDdKRzRX5ojNUhx2gVksDWh94IR2LcnDmJjLCeTVkKpKiLUkhlXtS3bufFoOa0RC/MqnwAyh+z+4JBxBF6gYNk81QHbkd+x1STxyOkIIYQwBNActloR6oihtKYYZqnWgOqh0kRifxCLM+Sa9uvxfEctJN4ZPZ6xIk9r3TkdN+coDVJFKDQcKNUpPZWeOMVPp5qpkOp8+H9c439wwCRp91KnJV4eeprMrAhEfbgWQ2RfN8DUcmoWhYG7U8ZGYc8p2eMrPBTeTLZMNlfA9FwXcohFsAU2jxuk5Kasx8mCK5PF8LDiq3G9Xvn48YWyy/lFxPJjjDu38cbwzuViwIY7uNfwEbVB0YZLBPepBnhQaFGYeD4e7un3fP7qmXs0GaNiutiZvZzF6RwIfQ6vhIVfLJoZrqhMNiOATul6gg0DOOLN0CyAOHOnZ5TT5o61nHAa9JrTVI6QPMsRUmGXXGD5TpYFIpQxwx2dM0D2BHyOaV3IwxQ+V/fug9nxKAmI2KOYNTYE1bwX01rRpsfl4DJzOvwAndK+XJJunD7Z7+OKr6Oi2tcw0cyWJ7xoPDeTbVlyjfkI/u7cbCunym8WRGItbAjszsodmIwdCZZZFF+hUHPAajwfH372zC9+/cLt+IFxO6KhHINj60gJBqo20BqRlff+GoVWj43fWqFZ2IxUYoFdnz5iF0Mz8G+Fl3p4/MPqscPvenqfSlmZb3OY3UiJq89CLYvP4nFAOuvv4z/5ushqisejsTznGlXPwE6NNVa0oPUSGTGuNBSOgVsCiULag33uQj8l2bFczybBmblxCaCKrIG849QEAF1iQCKExZOJcx16FvQemTBFdIEL1Ta67tmwfL5fqApYsMzj35+g22ph5bSS8WmPJHu8lqchpp2vGT9XVtbDe7mqCuLO/eEeBDu5r4GzpkwaWKx+pFNn7Z5MNXg06IoshjhbnGkV4/o50CkiJ2BArOfJ9jAryXKDaesz2eUqYFsoPO/d+fiVYLed+6dgoLoWbMziPr63+2FIqiZsFMrd6L1zuV/4+PwzWiv0+2T3lTVg0nIypnoO+fVhLTMbecA15O9IqI/muXU+QWdDDaTFWzBmwjP/iCzAh/9M8X4UhOA2UA97l2LGYan48VjjYxwJikXx2fSKHJO9rZgIYwhh/Rq5ID/1ALvHNdQjLuA1358bIjOb54Al659NrSA8rOtkZZZkGalo7Dt+evmbGz7t0nSAkT9bmIHEttQ0B4/ZQBN/nExmc1///7u4xDDb0RJs0Wn/FGzvWT7W9Z1RA1jQAtID0MYm4UXCHxsA/8y+Sueenn8Xv3v+T12F/VS6iJwWauqVkkxXI8AKU0sijoM/x2s74LP56pkcEQ2qtXsMxraN9nXj9uOd44jh3xNXStauk8UrvWLzLCsBzDrQphKjOuF9rwiemRA76Ebvg+ftsoaokiHhWgQnAs61VrSM3L/C8vkzwHN6faskwzbXsHvUWwJtpFrBTtjdRcNL32zVyCKO6Jmr2sdkBDq1Vi52qp3wDbcAPEYC2WbGnlkuo3RG6esMFhFq3ZKh+nktPH8HsMhdOlItASu/IJqwua9utMzEmIDlVCTmSnoAGmz9GXx+7v+pry81IF9qwC814B/9sjwTrAiDBzIM9cQnZMfTOm9l6/lYn7+YU8p5DyLH7jS/MiGysYBQprGOrPg3/7jfVCq7ns9gTULMHHTpAg+NwcDtmoSLfPet8PHrr/j09sr+NnguTveD7pVaKkbkY7oU6n5AZkG7KbWGaqCqIkWoHok5QwtarxQZtOsFvAUJtFZkKR8mSFXW+WDIZyp0QZKoumfmNKCCjVh7kxAwvwslQFLE0nElbl7gFEFImnZfonARpaise5zCS1SnepGwjXZPQksLlxOJz1ry6dzzXOIwmth637bO1rkvPda1isQBw0hpgbrlYFuBK5aDo0WW1j3yAt0Y6qg8Y8Mormn5NhaR132sOmo5XDqskK53cInEWatrSfS1JqbySxAKQUjztD1Det4Tp+YALjCbyN5TgU4MsEuS1ID12YcaWy60NqJmc3eOOkkVtzwHPElnk5ASQPGMsYg99xzm35sDQnva0BYq8UKJPBF33O8BjmnB5Y1ukgqjOM+Uxm2/YxrEdBTGYfHvc5AaxCFfe/EY4yQ5afx+kcQCizLcqPnMiVWoaUOehIf+e/WLe9RV6nPPEDh6fh8Ww2d3vEc9KQPGrKcENHscSRv5YSMA6JmX/nlrh4iziYAIVaHbiEG9hQX8o02gqEQUic4BSBBdioX6cNLU4gwdifmOeFZUGabZpz06ZnRIhdLMFszFCKQl2XIc4YFo8ngWvrMB00OGJMx90TLkKs8l2SAHNMokI+WgmhjgxRoqkZeZg7i6CPpGzyGgeed+HHz1y59RX/O73iM7LYa8B46y2w/UHuun1ZfA8FWhO/4pXFLKPjGQQWupvs190KxTLVRtKsKRma1mtiwoh3uewfksIJT5PNg5LIytN9ZBl9zzAYjBsVso0W0EAW+eBeLgfZKXGpbrVS3FCJZ5UZbkE/dQLraSBBRiyESUjaqSas14X6vfBegj7HVLaC9DHRl1X/VKsRNbsDxzPPtJtZYOESc5GcDTHaK4UT2fG2FlNJG/J87znJt4Qabd4ln4hjI098mwko44BFXF872Tz7LnGYxE72t9JLkke0CV7CUqSOxvfwit+I8omB7AEFW0kk0xubA139EcEOy5KI417DHXnB/kz6tQ7GG7dHkoPOJDuHACBumFm98k0WKGfQEO1Tx6jAUMOs4RliwS09wH/ltuaka9Fj7+/AP9d68M7WFb14OBaghir6hcEb+w2w2ziu+ppGGjFqFqwQrcScVP3g71Div8TDHmNHhu7idbw5aXbwb9LcTp5O/qSIsENBbLLKpEkNMwJEAdPz9nvMy51R7a2bzQbYTiqhQOtWA9qrLne3Nmcxbg2TEOXDw/0gyIDeCsuCzGa/iwnzLcqC0e8yY6kv7Oe1oqBYAZXvQR4Fk/W0vYNSwMKXjX1SSWfKhKP5d3NEnJZJ3MQE4103u5oqmwBRbpzJ1yzSKbBJTrWq8BQsQqEBHqqVXL7KpgjY3MkxF85TascGExOpPJb2wJth0CSNgy/uxXP+en2yf6j3fu44aZ8aJXRI23e9iHiVWueoTnt8O2XWPTsZ2RysIDC7ssbSADqTW8Wkfm4phFqJ2Gl7a7Mx7Yo+ExnozLeeOENayWh+G2ygSla4CZZkh3JmNFfJxKgofn0iWedRSKNMKya/pHOzslfFm9IMO4lEqb7JAmy/bJHzxv5xUH5Pz9trJkJOXMXrYVjF4M1IItpWJQUjUy4pmYljdxCzwzygrFYm9+tD+bjKEqYTHkDkhhH56g/tv6N5MVbh6AUBwkWZTbhsnb+YxPOyJLkoBtvDdGkOVB3VJxMeorgsb9GXn/zDJ7IfacfKJ4UB6jaTkqcygAAUoAsD0UsmfzPRW5iuWvkmWNat6ClGGG2XXtkXNduxyLifV/s/c2S5IkObbeB6iauWdkVf/d6eEVLsgVn4Dvv+NbUIQi3IyQ819dWRHuZqoAFwDUPHumS7joO52LNJGqysqI8HA3U4UCBwfnbHvDtp233/+B408/E3CPcatGiBvnPPI8vkcBMt5peXaez8F2v4XOfRY394yRlfxZq2mSKNpPHdhM9rYbezbhTkZOXShInNkqeiX9KbUDJIt3MlyyeI+CTso7KZno/bzyBcvk0V0uyRKE6UeA8ml0D45Lx5DF2JUC3imGnrFtivFcWtDP9mSmrEJ5NXn+t9irxeyX/CzWJlaECediICe+YX5QZs9bAR6iPNMIs8kFamJvlzJXZJ4IH1gmn2LX71+xThx5WYt/60uxYIEXC9hq7xyUZj41bW2V+kObITsVDczGIee65wAiW+hVe00XaSbUXBOIedmLrOUVU50tcyCzGyph7q65N4df0wXAy57LiTQ/oSRbZELfmG489gPr0D913kcYPL+1Ha3CO5+XyfHaiV0I89GOLGQU0406jXUUIJVyvzOareHl5RwEm7vpZL9pmFevDoqnNIGD+bqv4bUxcdJo3Q2Z5zKTN4umM+ZULWvu2QDNzYCET6ZkmafbReWGLAq31QyLIi7jYgE9X02C6mU3tpqRl444CTw5vhoJza9mEiJrsnIswGhDy7NDb1h6cuz5ntqL9EnIRyeok8dTS4+sb+n6ngN+zwG/54B//WtKejq8EDci7u7rXFHPSTpRWvorxKJJeRxti0EfMUrpzJdhtItQVIdA1cAQzeKLOXL9TMl1UdNRfuWd6oblGbi5ozMx7oyRox+0+8an3+zYz87zI8DtTxrrN2SZY5LoXU/ED4bDNoKc0/sd7YqLMIlzVtTZ7y3OCGl0sgZ3e/msKV8nMxqzEiSsJeGlHvteAO/YjO3V7cULqsiguVbCeJ1ozrnRE0yuCRSzFwBZ4JSOSVv5lomhmjKGTpyBHkxwI9apuaJtZ+oXqknWrAhlmtO9glijodi0aGir0vya4m1EfmNmKcOaBCM5oknWlM12DAtvQEDnzmxBoHZxZGbNwcUOrylekGt6N/1CTBS1b6dx69oCGs37X/43U4yaumiUTxsxfSC5BbJBrXLlY5vF2j7Ld4nAkMQvKwsIAH4RsRm0xKYqP5lJQHfChqIvDcrM37mIMiKyzhBPgsqpsG3KyQwVHU1JVR8pxWa0Fo1ek8Z8RkO49wRx28ZsJ6Eq2uA0fE5EgyAUKU3GlEnK9zrSG6218MTrGVM16ywirkzNSahF7LHVIA/VIE/J3JgsMB85hRr3fCMm4yeJUw5fManiPEBJaYhI+DDNkCXcrEiW+TXRa9CAtggh45xsm67XUCJtVSJPnJoYZ02TuuF6MpP0tMiEvkVnwQEZdO5ZK5QcepyxcX61Ne0bzYUZU3XrvTqaOcaZ9hnChvrH/+81/19xhYdqp+X+H0WmeWGrNIGZuZv1sDtBghiBBLnOxbAJKi3wAbUA/0XAjNu84m/bbry97Zz9yfAT0zuavkHOL1ljv3F6YrYmtMdnTITTHWzyc2KvvXc+izGOmP4doxq6DWuScpSePYnA52PAYI86QmJ9KTX7GXhzxOfCTh5Rp7fGhoAFmW60bPpkbyF6n54k0iSktZ02Qk58jFhbYjEt5DbikHGjpxzd0MtiRnrDrTFb0BBFGkhMuwOp/uC0YTx1YCnZaLCk3wGmDjavmpEgy8FS4hh8LIJBYyxZ+IqB3QIjl95wJsIJic8LWR8sAkRnT4JaqXPgPXyopHoNEVHUwvdqssUZJQJyLF/f6plE7y16Dy2je/QwfdUhf978fr1+veqSDVwXK2i1H1qcHpYpgzaWhEosikv91n2GdByEvIcF27dJ3QDlaJenQqErRhZUVNSMokaImNgz8AwtoCqq2kr6lua4K1sdOGkyOCQ0x7fPHT7fGD/FSHYU6RrgAPGaxzHYOKE7drvTmnLOg/ePYDRsXRHTGBHNn/E0mYv7EZsfj6JJ8kCt7nzTbWEnpoYuObtq0iz3glhobql7Wg0aW8bYdY/jXsVts9R7rdcroEw8upO7K9aCMbCLMhMECsapYDbY5GT4ExmDkoaswmnKFs0fL5mgbChR7FigZUIyNSasBMK3S5HuaAIizaA1S8mUfOhpiBkB9Fz3omVQZLZL+zfamjEpMPcENgWzb+tgKcPEVfOTQBnRrS6z6pItJFkm6KB0glcSLiD1M6rUaGMkXVkkvZjzagUnEcaawIhn9tge3O43fvv3P/LTPxr8+0kTYdrJmPBpyzHyx4m2D/potH2PQql32uyYDdwikWht0gXGFHykDAnBJpoI2mKfWjKzS+MbDwZigJNyMaYIBnzFGRJoGxq6/1syH1SUkSB3NDZ7GoWzZDQNYiQ7mQlinqB2Sgo1oZ0aZtq9s/eNoTtbCx3/oW2NrBuXDMNqtr/EXBelW7C9Zh0s7cmofU9nl54JVzHsjZ4xQpmMBbSEsXpYBGYinFIpc060dxAJQ8PXNefpLyCfAGg+VhM2WNIzAd5bgiBHJgGyCp5oOkejgPatCU/GnghXwwENRONeaE41ALiHxIe5XSwZ1cUUbR4TlzFHG8kcL0BR+O2VnNMloyFssW4zuQZWQaUcWLFn9RGSQyJLVm9MLiawCtYn2+eO7I3n8wl+LgAJB9M8Ew7Yto0uyjl1nSlzPnk+B923fH4hGSYCrhM7Sws7QH/JZxs3IHyRNJtlbiO8WNIcPSYyIl53FcaSxa2iJUw0pSltGp6Fko0OTEROJBteweAKRntMxOb6T9PnPh3VXJ+eDKSkr4XkYcMkfjZAxyiyrKfOsgdlJTw5kjHYzgsMEgVJhn8WQsFIznjjkZIU2SKeqaJV4Mp9TWBvNM4zdPVbTvS8yuLEowvGj86rMXcdAtEsUx+U3NW3cI0kfpY8zhRn+gx5quwkNDlDVlIWBSqaJ/kals0T/DIPluJt5bm3mFm+4cXALzkCZzUjagJaJJJr9wCXLzzsMq+NZNgIp4SUmYDMK+daByINSXZzT2m/7Q8bcsI5wk9jZAOk8fLeFgiU52wWN601RoPm11lrOoON7T0+1mKqAQn0hvH5k2E7TYgCDaefByJ9TVYEQ1YWiKreadMYp6MDxJQxxpKecfdIt8gJdiOLhNyzGv4BgjBksmvKiBp07TQaxgE4G5NTI4ftPWLOL2qcWtMXsM2ef06QTT+wmixHQfbITyr+Cng2lRgEmO7XhJuoBnFLlZBGuuRkWu3PAq+wle/oWkfbV/vwW7i+54Dfc8DvOeD/gEsvlvC6RIAZkjgW8jtNqgmfALnuq9ljEtM17r4mVcy4PP3olGRlTcQ2acwCyOVJwdmvPp7y0nnf8s/r5LIAjoVo4I0euZkWE32H89nYf/MbPv71C/pMkpAHQGdjMu1BE8P3xhyPaAg2pWuQePyDmIjfQmqxtUZrtsAzb7cA9nzxsZYUXJNr0me8TM5J7knSD1BEkOl5dim7z7JZD1zFqtnTM8Y/men91euedcHPasxGvhTqJsXOBk/CymtuFkCjIEd62+iOeHkgXv6WmxP3rTAiiXUTgF3kKJo3YIqDHQG0aUrd8eQ5o2XUB1h6V2iCk7MfC7dqxiJMLD8uOTP7cJAjJj0J8kv8t135/jdw1dk6sm5BNCbaJ6ssUmTlxTWg2j2as+WfbeWTitc2WK8dzTh95aWEvFc18CV9moTV6IbXM16YBWdmHA5P9WiAIrLis4yO43xSZduN4zyZzTlbrM3tPMKb6xwMm9xuNw432vkEjCMnI35828CEeRoncBYxx8JfdHNl+R5ZKja4YxLur9YCu4v7M64PLsKeXuWVT2/mi5BkhEoSJrFmJIghrWls3EFOFlzk73sLKefKwZY6RyQeMW3FxGTSpl8+e5D+Z7k7m9LMmEutL9aBNKX1WgxyPctUpDAMdmHY5DDPifSQKDWydtd7rrNoQsUzrOaEgt1DslAGPWvwwybmQazZijRgG6MUJfLzD3myoMtv5FI3mo5Foql6p6kugoP745K0z2lRSLUDd4YNpPXMAWKAo/tV58AV97x0Td+U+x/e+NM//iNvrSFHvG4fQQxiPLGcZtPeGfoe2PXxCTN4Pv4U9jB34WnQPBpM8yyVETCLqeDeO8Oj4Oh0zIXnOGl6I3x2JZQu9M+n1WrtCWxRlGWFgEgPuccJJhLedTOn8/uGHhO3E8lBimnhaY0pXSZjDphRZcd8a/qAGthp9N5zr8yIQS2HXCSn8EUyPzAGGmfZGPgc6G7ZiKqBElk1a9S4mS8WyY7G1Ppk0GtcpHxY9b7Ot30FXF9xdxqI30Iu81WaN3O12Y6YDAtmyxpHqW8Vn5Tnq0v6wbmvLmc0msY6K0m7n6lV+17Ekf/s+tUG03Y2WpfV1bOpybhkdV3DYC0k26r4lqkvB//VjRx+RINqzbHFTe9nmLJvmeDGDc4INiczpYw0x7Y0JWrqplQXXq8IveSHyAQh3msu2s0ZOXb4d//zj3z593/B1LAzRunmEQZ1054MPThGPOS39iVMzD79PuRUxmDfoxjvvXMXRVvjmOHbpJrJuREj0pIBWaOoEc3Fm6PzRyMKHDeCdQOSmunBWI0CoWmY+EVVOlcHGhzP0b96Njd3fFQiNpAS05dqCN7po1hwE5kJCmSjR/XgOT3M9trOmTrULIm+BGAddmvMnptl1iTRE2NHgF0U8S2bfNFAVFHosdktGXsArRBfGcz+yGLgxJMRX13rSV9sqnrcZOfWs2Pdvx28Lq5kyNNGJuwhc9OaIMNyfy3ELQ5woPmOVGLOq5a3L2Z+s9QSV16MbC8JoywNMU5qWqySkIcO9LYhf/yB/+V//yP/1//xf7LvO8fzybTB3XZ0dA47GP6B6GDuOwc7+76z3XZoncd58JSNt7fY18E6ET6fYwUwdYnnLrIalGRZFmaugt6SIl5+hH7tlekDKaPdBGEMC4DZLFg+1QQ9M8FXXQVfZw8mj0cyFqO7TsuEb54faILPXZTdBJfO7b5xHI7xhbMMeruBXUmCu3N4GjpL8NVc7gEwywNVoZ8z36cweXspkuLDbtLjzwmedbsn6FeN9Wrmx8N2Tpo0lLcAZ9yWb8bggaR3m8w99/0tWEHuSHssRoIRkj0BarwtCYQoui/DROdcBdG3ck0P1gkyQ3M2mz7qbbFXTWAkG77lwdq8rwbTgUMCKDrjkL7JXMC1y0uz2qPgVIeZcW2KQZInpEgQPtD8cz/C5y7kUUidXQWJGPfL5ugehfgf/9fPvP/jLzwY7B+3jIGO53ncMHyenDS6koXUnZ9/+cL9fmfLZKK7M9myOGmoD2TKpdU8Mo7sDj2mKXrvbO1GtNoGPnLyQxzvUTyfGvKuEY8LPIlLRIKFnVPPp82Afj1kW+ecbAhTYzoWj8nc8wxZJxHBW043NF/3f84n2rcA/9JPNvbbhDGgn5hGPJx2ciZYMgoIGnde8yF7YRdFDHkHRk5k6UusDlNOnRfo4vK4zKGTndi8MZIJKXIuOcApyVr3TyzZKu/caq9ZeTEZ6F9O2P7LL+9gnTaiQK6hndkfLCDVHabRRC4Wql3Q45TIfdx9MbQGLT0b4yqcYU18ybF+VzNbk8+VGc+aTAQmdsk75e/Hg0Gp7piMRdMZVLE22FZCrvj5OV5rS+mH33R+3O68v7/zy//7zvgSZ+jdsxk7G5f8lTIcpMVZNhlgk1OCuSniYJ85DT78AxHhc8pO9N45jsGxBaBw1z2m+GxAgogPm+g4Y/+q0elIa0ydizU3Hbxv+BxMOzO/Hrgbbegykm0+lymsZV7twxEPX4Gmjb5BaztzyDqjmgbrtreNrT94PB4cCU6P21gTfD/3yaNVP7+YxMLM525m6HbiOGcLcLyNy+PJ+yU90WsavX7WA7zNbkx4nXrKImWRptPp/rv4udxnLltIcn9L1/cc8HsO+D0H/KtfJeN3TcHGpJs66c2WWEQ2EEpKZu2TIoVKqKU4hrmgpOQVhL9O1r/1fAOq2nOds8DiavCG0kaCnarMnN61bCYu5RLCA6gap1bEnWb8cnunf+78zj/z5fETqsrzuKPqQQYS4RwPzEL6fo6BHAfsO19mNJRutxubNPZbkDbszGa3R2MYFLHOmb7GmtKp7qypn2YvMr5qq9kW/Hph07ZWhdMJY3VPrMLDrykovLS2BTM6ur2YGdsZ0yDxPIRphk8YfMTXt201FoqA5O7QDtws1+XJOQ+6TO7PbELnz5yumM4E8frVCF6kZ1t5QnPB9VPu62eQYnxyy8m42YxzPHD1NTErdoFu3Xba3F5ASQ88rfc6JJmtzvGMH6Mh/u3A4T4/IQ63rJeqqWAeVhjuzs0/re+frabdJ3hLT7fOWfnGgqB87Rm8r3ppZWUejff4n8d6/fayt2fuQ9Nx5eKV64kwMtdRJGw1RKjJxgmzyQAAIABJREFU4ff9nc+/ufN+PvjxsdFSbvhsLQlqd2QKz6fRRMOPxRuT9IW9N24ZPz/YlpyfmPPUk/utLcuK042eDR63hu47JjfEt5Rs3SEl9FQlZY193Uuh4c2gyQKq3QnSBKCyh8+eduhPnmfWoC0IEnZumMaUyWag6X219I1sco4gcQyMWxbEwhY1W5uLoL8UIIChIUy99x1vLaeuQPLcdAbmzrs9+RjveHMOGbwnIWlYVBXadtzjPAwZycIsbwjpqykjm9yNM9eikZO9/khFBAG7ZJJLgeIrn89v5OriwLwmlvLMmG40ibwpTqPy7SkcvdaAQ5vIHKj7yuE6suosxC5/6BZ76P2m/E9/9wP3cePx/7zz4xbr+UiJvdOMc9bQx08oP6Io9/kZJjT5zMMaB3c23XjKR8RkBDFhzEZve9Tcp1Jqq4XP39pGOwbHKfR9o82NbdsgbQC27Yp9URtnltFDZcV1UJPTZoPnTD9Fmbg6z2b0GRi6SMpym4ek+fSMK3G5+vJWbK3x6dOdMUbkC60x/YiJ53HlBq01hh5MJiYnR4NJNlX1zrSBklOvBt4CM3LP7/PCmEBlcsui10Sx3HdHTiLNVF8wM9CNLSfZK1dshDpA7LvLU1LI/e8Wk4kQOaGWvGL+lRjnIv9Z4C2iS6pPslfjfp3zAJKye9MbR3v+5TX+F78CSI+Efa5CLYrFJlDjmsaxgo2tv4sAvkTearO3MBt3Pda4bbAxC4i75Qew1cmDSBrdocyxh8wFLqhFgCuiuXvKiVAHC3i7Anv80J5dUWDrnBqJyiifjp7dUTOmPSIgi2Cy4T55/PwT3jquwv3+xr1tCSh02Bpzgsu82Hi5sdRftA9Fk6mcBtUa46Xdr0ILotRQyIS/r2mxPb9PaaGt7dlsKxZMUAJCD1dL8u6S14gx15BV8dTI9GQVuEOzGc09F8yD0fXsYzEmTIph0PPNJThUQGA7F9jTqmur2ZmVa00YRslZ76KhPW9GS+aWqSzmk2lozuNcXVMZy98ixnzr4MuCUvwrsOtbuGo/xZxxMMJdPNnvmnrO9h9/0KOoQ5L1u8C4TFyTwbG+Pf/ekzEk4kwpdvGV0NV1NuPYMsm+fcZucOgI0KIpp5yoh5Zwm50v8uQGbHNwngd3/YGZoLkzFhOzD2H71Jl7z8IvPncwSSVZvIKpZjc9GMu1H73LWs/d4iA4PPxZ4ic3BOHwZ8jGqGImwUJzLj31lyv0+7dMOFswDoKchWG4NkoedHehYXScxqDLRBmcmfwNQBPsq3XtAm3E3g8rzjQ7zWk97xpTIQA+rthW+v1+RiJM7BmTmI6AYvEp5o/FsCzo91FJVAO1YmzNlbzGrbAwUk/WlPsM/devgOHbigex9Erq8pmAmNHnrx4f/+WXi+VhsTMH9JZg98v3rMQMQsqEYmnka+iTKnHWXmNL5vgFHgGreXB6h2zFWJ5luaTj9S3l+ESw1l4UtcIk0TLKx059MvqGmfEUZfvxxvmnJyM1cIt5C8CUFcNrglgE/LDqzMTr6OCmGafnxFPfWUtGtMHeNEbtiQLQpmEKvcdkQ6yEuJeNAD12jwkXsvEUn2hiuR+bE00E92ywpSxfapnXvQzQMxpQrTuM4Garh+we7tcz1GBTB0NIaC30o3t5Lh4Hg0h+Tk2WqiqtfACwlegGcaOmHeL2tK9Y3758tkqS1/Dlk6IzYrmIsAnhASDRWIx3PANAEmHL1z1kMIqJe15Mp/JUjPbbfxL7/4bX5FyAWgGu6tcUluMZP6BlYcwiCjmuLcx8RSgT0fDfKkbvWB4ryz/EWROAzxbNq9iLWSwVE0tCnqeS7iZF6snXE4CRSi2+vCM2i4Z0ge6yjMDzrGgR39vnzrgPtveSBpZ1nqrnWeqWMgOajZ0Se3SwKPumlSH0DRBOGTQiH5a2ISM0y0+uGCxEwb55A59hSDucpgrDrpburmw5v21NycEl3IJpbpqSRBJNZZEz4kQmze7G9PD3UYddOyobbQ+G/JgHbp3WGqoHe7/BLkH48SjYKlZWQR/3NX15vIFEEaItQAcEemm2i+DZANf5uJjcdfx4AK5OgEueWv1WxDJ3dF5SzFNSAs5v2YiRq3H5jVzfc8DvOeD3HPCvf4WXx2u9NzCHXdoFVtt9ATwFVHn6S5PTOfZaM7q/zLuWPUA2jvLvAkR/5Nn3Oi1Yr/+1MsnMJnmdcXNN3Eb+tb3uYXd8U/xwDjt423/g9H+hS8f0iAbR7LEWRJn2gVl4h6kGG3s+ntEodmhyCwBweObAwmxKeSCj4KOwgNyL6/1UIzxN0FNNBUBmSLV404UpiIZ8KwmsxatNXBp5+FD5juQZVGd33UF3silVPRldAHR4LmXjTwnvaSbCYI4Hts8Xn+9qGhnmcQ4DLxKvuf+ZS+53AOrPwGe8PIc6ywvbHLHMUYtQ/HIOmirzpb5Aoh4AjYkTGtMfySNIoq36JWn6DVybn8RTK0nhr6dvEeHRLwJHGc0vZrzHmTP1AGR5N6pqEgIBBm0UwTwn0ajaKPPvIrX/meWBu6e/XOVyNSUgC7x3brG3gbHNJbE6xJG9czZjY8NwzMs7ValJRHXPkOGMdtC2xnk+l2TWPk4an1Y+qU5YbqwGtqSMG4i1RdoPuodCl8xVnWlO7wUKF84lScKSmMR80ZAUkdVYx50mHU1BwfJoChHDAvkdGTPr17p/IW3s5mDO08r3J5u3B9CibpQeucDr702OYL6fIHbE/syYZhPfneM4GNsHtDP8qvLMmd5xGUyPPBYN33udlrVA4skSRIdqMHsR3DW8bHBwnfTVNK44/e1N2y4/+nrGWaPgthqLGFjmA5ULjYqZknnKyxkuEg22V9WxumbKEA998ux3bn94w/5tYM9BqZEBS7Ehmt1wy2GVaeFT6+1A5A0zS38l4zwnnzSIKwcwbbC1OD96KnZ4NmdC0SvPB3r0GOZJkyRB5ffXGVNT4tHomTTpzNckyyVry5Qj1450oh7DmHPENLw3poyUqqsp8ev3xP+3IHklXtP0FRu6cIdSX7Gyvsk6dw4B76hnw7sP2ss4amVLIz9TT2nzelLr5PPy5VOUgbbIwyWHQZqn+kzWoyJZIUlJwUfzONQK+jqXpoO2jucQkIktmWRqUEXkWot1j0ncPjEjybNq8MR/xYfzV7PD6ZH0zDWtAlEMHHSJwNV1D8hGLl1e/Lrpmw2GnjlaHIe/M5NNVEly3cwX1msGzpiQia+fkh869fYB3Bq95VhZ+jNs01nMNR1LvfVix+pK7E4ZjJvhPjnykOymNPU06RPeZ3Y4xxnGZQrb9onjfI9PdLux6w4Yx/lgH8KwwbZtSN9XQbwSeEZ4LzhIb9kc868/47quBM4QWrjYBncsE6wNX/I+7sD0l3TYln6/zpZmYXkjZvk/zXU/ReK1Pkq2yITZnWMMxhhYT53gZEQ1tgBY3FeBFu8/gEXxI9ngobO6wN1KAuYMPWWLRlPIFNiln6+Kpzlg9wBUITRtg23RKUkqdfC2J2CZL2CWJmbfziU+o6CtMdgCPye4WQBIrvk8U9tWgyW9ijxzpBLj9C/Z/qyRFkOC1YCNxK309wXlMhItSajO0HhGH23y9sff8s///M983h7MbXIft9DVVzg5EOvodM4YfuU8vyDzvoL2x/GRYGIDD5eYnZKHjMlGB5aXB4BG8SYqCxwRlRXY3EK2QKUxi9lRB4QJNbvdcFzTxHjG3glG5jXh1ygpMF/sp9ob4YcQz+Vhim2NQUhzneag1fh2WnaAgzgfwVxHGf6B0HGpg+DamT0Th+lB+TYzeivmzx5yRyIBWkcmuAClISDpdWATKqPq2RiXpjCKmXDPykwoDxH3gzLfVdJA3H01dsU+r706EaTY4i+z11/Hqb/9FYRvqb7OSuJVW8i95NUyeSCLAcegpb70vEBn12L9X7/DRLMJUMxhp0lJoS3IN4HVvE+l2Ougsi1GUhS0kiBEAKhTA7ihgX9qtHbjS/uFty1YLP00IPZYSBHA7OEB5ZLj8ALDbQFSIuEhEMUtafwqSDHOnPhCyqC0GdK4U09EkjUUH4RNhdHa+pz5YZl5k4SQRtKUfCvDciPWrusAi4bcEMtCPQgFpdtd7JOYdo37NlIuKRoUQeLYdF8+HsE0Nj4Uhj+DHMJBsOLmAgSAlGeAMSbSS2s4Zf8g5WyqkZfs14wrXe/YfOT7m2wiYWxM+WucCNeU7prMWF4oN3r+LrQvmbM6/wX9z4Hlv9Xl4Xg565lUmEZWkXcqeEpYoaknbeQwf0gU6osXowDqE9FnFlQKf56kvjBWjWvyiGT5thV7UnZvzpDPqPvoAUKJhH/NTBJO+TggFrKOGRPLd6TkC3XbOFLyQT93/vRTTB7JGYXdXYJ6ReZummDTkvfSE9JXR3FMTkSF02M6gCHsvaOifIyZjaSNaTCS8Ry5pob0QkkXwFrLW8bydqbfjSoyB3amx5dHbE/MMO/lNblJNncPOWgSJCmbykj50Jbx4dZu2C0Zay2LFzGkOzYnpgNrFSstDL09JCvwAFdMr2bimNXsTaDNGuodRXF7o6WkUOWAbtfsnOmgeQ+5tQKJ/crnmymuaXAtFZEzpn1D1/cc8HsOCN9zwL/65ZoAfq2byzOyYuBmY+WGc0vQznpOPSdoSTDIL0UVf5le/xrgjm8ctGIiv/x1NbWmSviMACP9wvIN5yu2lbuqOp61ctGjNtvRbLLaDv7WeZrxlBPVyRsH5lvKPz/54v/OLjscxpyNucU5vNmG9sZ+3zgJgDeM0ye3qbkHzpWDWdbxbYYsmiBIE0a7ct2619V0C6DLQGKCpAmRqxZxoltMGpnlBGCu2zNZ5+bLo0jsXPe7cgfJfG7dwSQ6jP5kMjn8gyGBkUyf62yQNE7H7oTCTJw/018aQIDpzsiGowIyt8jTMxafdiI6cr/MbKI7WBA3Gj2wKEiwkfXnAlpDGlpoOKNAwbp/fp1938SVHphaE0yVq7nhvRrsY01j7nWW6X1NlqsMSq60ptnd51rfkL5oqhR7fPoSJM69nPeniODr354NvSDp1QZsckk7CecL2SH2Whdi8lkOTt+S9G3ZlPEAmURBnSkHKpbTmzvxvA9kTZEaNt/XxJ+iIfVb8dsJMuBLkzn8CEMtoWQYAazJOqtKvSgUj8Axhmat8ULwWikdAe63LRSWal9Oj2n2OAWfy+cRkkg/om6z8lkrac7wHwH3iI0ocmywJwBfv/c4mVu0BKWHBFmRB+eMpv+0c9XO3iKH1MQep38g8xOYIvpE2VLGPp95ez1vDM1Jj/CACzxx1IScEew/LkLpZMa0x7d0efkb54JNRpVIW5879lp9vdb/VcviDouQFv8fEvfx5eYEoYJXzNQ5xOif7zx/8+T55Uv0OGf48Z3lsUoizbmvXSwIngyGPjNn7ah8RoA5Y9rnc7/HWjoPujc0yT3aiHhgB2f62fkJp4Z6wr3ythZqCWaTc9OY5Af28qgSXVEDgWnRhLwIsx44QXd0PNh10ppFHZF54hySFjOXnGBrQrNQD/DMmoOcdtn/uBvMayqsVAN8YdyZQ1nI5voAL2zEaviF8K/MplQ9X+dEM462JBE1jDOPpzYeq07NtxzrPJ+VWmfUviUkDk0kMPCayiTln4v4+5K+tbnzSo6pXksRJNTDayqu9OGS/tLs/o/XrzaYTAdOZ61lnaGHPvY0uwZEAzxwEGohzRy39q8OSp8Wp6deAE405S8dcPeUupNiucn6erCLQwO41Uh7jWJm8gyk4eVcr38uj54AJ25+MFt5Xjj3Hz7x888/4yqpZThQS1b4GQmZmXHwBWSnsWNPmPNk0xOVH2kKs0dBHX4EUYTInJFclccEWVjlwSHWF3sX8u++ajK9MpkgihhZC0ZsMKN8TITRmcODjZrjqkjDU7tfmvC6HlSDjRO/IJmtKgRO4rieAf7ZSfSm4/20PFmmfixALZrqwWJqXklBHggqzHlwWuhyVlI6+ojEs4FPReUW98Yy6fJgS8W1LTPokYXxlp87WCPGaHnwkSAHviQdvpVLNIpMWpnJ79fYYoIKKiTT01fgxC85wNC9LuZDFgPJQoFMjJe2a32bsWewmJEL5PcW+LdxprzNR3N++P0f+Nefv+AfLIBYLPcxysHATth0omqcj5BrvN1uHHNeRpB0eo9/Zq5h3TtzFfqxb261LzSayvFRMwbUFR8M3HMdkQ3G8ITZZplFQzGtJAHACFIN1WQQSfwzm9ISjDSb6zCZsi9wpyNsouz+CUfZZmfPychhMLR/hblbn7RZz/dE0uNCtCc7WUInGHA9cWuxL2cZybL8SiIGPrN4IWMk0PoC3c/cD92JRsE8cC8gwS97u2IHyrFYLro8aiT92BzhA52ZmCCMlCYqFkyw9b+tkXO1PdjrSTgwy2SCYyW26mFaH5rFI5v7wJi0BJqm5CSQEM0TkkGfe6lYr8Uyci/5lZLlqnW3/YcGFRIxNM6/TLZF8Ew4RIW5B9v/49iRt47vzvkRSU8jClaBlCqoZ37HSfa0hBRCy7VrTXHdQ15IrqJtesqemTFPgxZTrWeCAjrnkn+1lhJCtLVXIkEq0K7AmCpi4n3UNInSmDbpY8v1DzaDrefTEA9/RVleTLHYjxl65sXos5hhjX3nkfBKE6Z0xhiInwFQZiFyyGTK5EgJryG6zJildWYVayMKIZXwjHQcdDASVPP1/GWRa5AriM4cPQ9iQzQemlUeQ86XRNwdeo2Ut9Iy9ythXVM838AVCbSuBpMXOOx9geJxZaE989nZjckTCP+vlcORecHyGYmJ6SsWJSBngmeRGAVTsbtTapIrtukM9mpIBEQzNKa2r2kaTfbnyM/Rp65mlPrASmqlGpkexunTB/cfPoM+OcfgyPxj95rny/j6VRJPThTmf33DMwBXgTFxPmzQpLGh7ITUDzyScFPAm7G3vopIYAF1Z0lwDolpzd6z0IvcV9ot4lU7VwOVprgFe7gcLdVrWjDy5pHG9zthGt9vG0Mi9w9f1pBHtD457eDxMokYAFJI4JU8jbfbYiG6dVTiXKmzSIlYjGjqyWc+mXFzthGTce5MU9A0Jc46wiaLJehce2kkaD8EvjLE+Qau7zng9xzwew7417+MPR7B8jSpXNAQL/8ApSTeTy+APJjgIkIfnZnSlS8tFDyBuhcMe02sa8qixtnxAgqWqks1vHMvFhB1yfqP9Ip0Zt8uvn3GPfqB2oaJ8VDn7fe/4d/+7d/Scy+mniYnc54UxiTinE05BzlJIJzniaHc73fGiKXQuyIaHmUh+adrSr0ANBS05FKDhpPve7UA4t8ecsCymgC6nsFF2olmysw86TX3ccm8enkUXkQWy2cy5fxKdmmpqkwFF7QB6kjLRk3611XOETjuSNB//6qJGCumc2TjOoDCoLdM9tiGOhNqMWQSkpzuzJy2cjc8p1maNGyWXFXcJ9XAKgRhyIl4SPBpSvR5g0NeAsnf+BoSE6ul9CB+ZHwybFbedAYALRKEYBGQA9eSwJtLorMahQarKenu9DUtUJ4nV84jwsqlF3ncJ7W2iqQnVXhAxv6cwBFneYhlLtBko/cb9/vnJG5/vUbVKVsbhLlqlGYekuTjRPSybLCQLApynTYOm/SM+Sqd7YXQNA9j/6RYC+L7JxIvlJDL1STpbRE0Qga6jnpSAQJW/Ijj8AScG7pyumfuy1AqipxUbKNbkYtC2cheJizLpy7wU2daqDGheT75hGfkKkeLM3jMB10GQg/VISQm7uWZ++HktJBDbz7ppwCNZ0qodwfnQFJ60u0J4iHBJyGhS8qWwrEwPck1MzVqL3PjZPD20n4UIc/2b2dPxRW52mxJapNQ4yAJYXFmPcLvDLB5+d7Uun8ZMP7qKoK9mKJ5Rp91r4dzahDmth87z9wPVVMxzzV9KL7HuaYC1nMiFbADc2HqDxw93suuG+YRu8rly/zyBmprOrXjMpEGx5hZ0wmPVMXYm69hg2lz9RWeZC03bWHCc16Ti2NN4hB1SrRjmeacI5rZW6mn5F4abjTSs3FrzJQ5nho1UhPPBtLX97cm95okZWs8sU2w7BWUSoA0W8/H2lWDVLP8VV3LPXobJlzejO3qlZxNYQ7KizdixVyEIeOMeTAL8q7neYMOTh+o9CBFkjG8aZAnyHO7vfZSKgfXxMmSxCQ1THR93/YrhoG/2mCKhDeaI9GFj/E2aWONG958eyleguEzJRa4EwmYtp5tB4JVJc4wv5ILr82QRZOkZ0XWRTXNVMlsh7VAvICOYoYQ8FZLFp5jNCvt0BzLFHhmYPqlP/n8+9/wweT5/AXtCoNgsDQ4eDLPWyZWe7ICDjow7GBmh9d/mDx7NE9OaUgLVWa3kBEooE0kRsz1tseE0xxxCEmYs41s3KhcYMVrXJxHFB/NTtyVMeZq7pSBZjSgwoi2eckpJMuhFYvqkrg59dJ+NT+Y0zJgO09xzikMC5bxRoCOteHs2GlNFlOkNqhyRDJBdGYjYRA27bE45Rb7XB48ki3UW7DNXZwmwZ7TsVE8MNMPLI1aXTMZE4mR7PxlauUBlc1O//bkUR5Nw3DXQl6y2xYzDgbWd4YZQhhNkiA3sORuID/n2jfVYX5N8i2ZfLC9TI5p3mtTu163GGIidE/grQ9+99/f8Nsf+eX//nee/sS+fFlM5D7BzifHCbDDtjFnPLfjfGfbNvr+2/jAPrEPeEg0eXvv+IC5bytIikg+5RkgiIUxeWsNS+aPvgTo5oanR07V4PcGPi+gcmaT0TbnyBhw87aYa1U9yjA8D3HxhhnBZNKUi6TR/YYNQXuYl262rzFsVWN/kXvCI77Nute+0wu0mHfEg2VS7Ny+GHQKcqdlQVTrVjngRborlvoJWfiIGUnERNLQvOvbYpxNP2sjQjZgz/kpgBL3YNu1Z+7RmkQYTHlfv7OYQHGYCBy3r9gP38JlAsJGyzHieBYwpK1iRUSwNCGduZ7mvL4WhMqvwchqTq26pcDt/PqUK3kQGwu0Ee+xxfKgNrNIrOq91L57PYZnW7D9eftgzsn+3+/82/sX3J3fHL/hlkDRpoY3YW4D4yOYc+ONZrYmppBg4HzxX4Dwybvvtyz6GjIHNLjNaFz1ftJO8DFRCb17t/B+0R6saUv2T0xZ5BRFy72sJ0t3fZ7czsbuyjgmcypjNIQTHyMmdc7w4thHTqbojaMk7mjIrmyqbAmkNZuMk2CTmjAkpjza/kR34Xk4rYVkxrH32MvGmmI++cB7NkF4sk27mOvq4Ns1/esNsTjbRI6cxIp4oKLY7CkLe5lXGw+aFcMTKKlWv2Ls/byed5nYlmZy9Cm/nQbTI/0dlta7Zq4loQXu7nQTbrKtfEVF06fiJX/RKgIkz50LXHMxyHtWXmiztWgmEM2nsGUOXlnkPx73VEJ2uCQTimUc0wJVJMkqmDYv8/aL2R7JeOy6I5tEysl9vwHQ5Mkf/rff8w//8A98GT/RWmObb+zFgtcc18qcKvaWltc0xmD5wVUNlCigN2O2xrHF+pNzgr/Ha5Rp9u0Tmgbjmxnv/iWkKNLovIniR+SVBaLNObk/Ih/tre6FgM5sVjj7As8TBE2ZzWgUHRzZMHqcwR6Orz2Y/mAy+al94ewnv+gvvGeR+eghM2hujATKNycn3etMuxrv8f4vr4SRDFrnKmC625K9mgIDycZDMh5f7j3AczECS1pk0s6/LOPwt7i+54Dfc8DvOeD/gEuFbhHzq5lT/MKSJHqXE8vJC3tRW+nZ+HQ9Mo5bUWViGvlF6ux1KqVyqemJX7xc6/9U1hnj+eyr5o+rrTpfJtdEgpfEJelXEmz9H//ujQfvnP8a3pC3sUWN7x6f84QxP/iTBZDofdIf8b2/HA8eHpPpt024N2Efhh/ZOLTJ1kISNWjnRFOtZLH4GpPwJP30lJGOqFyfNSezJM6BmCwPhnfgAODZXI/9EPnEGJlDi2PbGe9F4rwf7WqiF1HL3RnEdOxDheFBjClp47A4SCUamcu/kPlEiXN+eYtN454+bJIAZPyu+J1DbxSDW0bKdVWiSZJUlsylYpqTU0up5yKh6bwvOf9q1mzoksv8Nq4gPBTQa158F10LvBm4lsxzNtrY85kBttOlfn6shndJRamQxAP+bIL/a0Z9nPHlh3utA/Mrn2M1rVKqWggp1jDoZub3He2DL7rhPzSev53YAWbCLTGmZgetTVyVmK/OBusQdDhuD478TKo73j8hCLu1zDlt5WM4DPWUHM/bdgy69ZSCNWSk55kLtgVByiSn8GlrOiFUn0iQvT6rrdx3yo6OUFb4dE7mnAwzxkj1IQYP2SlZ6drzuzXGdHw4nJccoRINszUNK4al74vKidA4+cQxJ2IHG8JNQtb69Im7ceoXPnrUsx82lhR1kIuELhJ+OBbEocMsSX6pFsFtNb3xG0j9fSyAH447R1qBnG54JgRSvj6iXJqO38Z1EftjvwSJS4J0kwMcQ8NrOAiN8e3T2yKExWTs1zB+eO7kWlCLiXVCAQqBR5v8cot993f/7Td8/POd8zy5nRvHmJhsaClWqKH9oG2OtltMlkdyzpiD1t45jrRY6dGsF/PAhHOS731GDlHSmbvs3JJkZvMB28bz+YQtJmgP7fS+R1N7XJN6NVgx56SNxLo9JOWFIG1EHQ6IpaLFYHAy5gM7hdnDB7N83MyJda3pWSgXtmE4bdvCW9hymj4P/md6n+p02q2FB5VOpjxjHS/bH1/YU/crhokViefCl0Qa3QeijVs+s9M7M4d8NpRGj9xGg3hrfuUKppaEM6UnidCnLWW4mNZKX1vv2AT1uTAIZseyjnPOJOpE/8Ut7Hh0BoEz1DGSZPArfoG/2mBqcoZ5ef5/gSDYCxPTjE0/5QfIqR9R0DI6b2vs6wr8158NvTQA89JkbtZNkRyDrRsZbPHXn7k6l9chFIfJAto8xgWDvz2W7u5FHIvFAAAgAElEQVRsCruy/3CHf3rEZhfQ1JicwOkho+ASyVvjWegd1sJY6zFPdgGn0bad7oLNwdSNdhqtd2x12xu7xgLuDjOTka7XYsxTGcGYNfElUUw7xpDQMm/aGRyRVNpVlE+iOFEZ2YUMFpYSm2hDv9Jqh8iPpsRIeR2M7sHidTFMR2hRiyMeTTd6w4k14noQ9CkPY3sNHwJxSxA3Dd9EIAGF5sanKpIdanTPsqj2cWmDC2G+GrJPjpsx2dciNiGAKHc8DyATFpD8LV1hxmzZdb2KErcIlmHymAl0yai4X9qgIpRcUGpWrKIzGtcK/pe3dxzs693E64tDguIiwuEn9x8/Md8efPnyhbmBncXYVyQTlgcH52xs9jn2qktK50TDebvdcZ6odRpxmJlMzLfQob5LNoifzAH7vge42MOXpS9AyVnTH+JUqhaa6cVWv+RPXKpDrZSWfQUzVWM4TIwuKWOQjJ1gLjY++MBxejECVFDZaSVFVL4h1heAuooI12t6s5GscWiZXDssabXQPs79Jo2Z7KMCzcQ3XB5rb5Pr4kzAJMqoZFJ5TN9EM8OuxKRAA9/yHsS9BPDmjPJhS1bhaMaW6Ibmeoz1UiCKL9mvb+WaLScs88YXHND9MqaeOpdEEHkIUxIfubckGboLfAKuPcJ67poVkYi8AA68+CRdBq1ISJVOny+gTOoQh25pFGV+rvV7NMPE2H/7A5/+qPz000+8Pw7QN1prdO3M1/eL41oeP8ZugAjzfKx4/iEbwsa0yZ5a+m0GK9nMOQ3urS/G/DEH3QzdOuOY3Nob5xZNF5UdLIr/CyBMo1WHLhPrxVpywDAbDAmSR0gZxddmcIQZFuAcuS9QSyAiC5GutFbFV0gpuYAnoaDLjSPNoCGSdm++WK5NFLexpAErU6AaDxoSNmYW5sw9ZGGYkSzjyjMZnF07+AOfHhM+wgL0gJTzSmBb4nc2Pxe7KbyH4uwszX3xIHd8K5f4ZMqgl8Rdjs2pODXD4ypL6ouURBSuBkKMPNQkV02tKLxI0xyVsC+QAfYk5bj0lMTLuDirOXXFfCn98QU48NXrq1ZuFO9ZM9bHe+E6F6rw0En5KMw28Dfj89+/8XF+8P78hXu7sST4PEyFNU1QY70EnBnPWXj6z5F3+VtInY2JNE2fpIYfsY+0N47Hl4wLCW6OxtYMMwkmq8S0XbEXh05Oc8YY9N5DXkg8JVWc83Q2rQZEgAYz2aVRUPXwa0mEuuULD7k8kmRoyA0pDD85z5OHvCd4/wI4yuAZiXZOpwyYOz19W8TS8BxZecaaY7J5NQVFaQkImihnIvltRBzBfT2fMu+uqxqbBch3ePHh+Hau7zng9xzwew74171kGK4z6SSeXkeAT8aaBhv4qjnz80mO7UGALFYTUPF32wuQEz+Xf/D0i+T6dtcRK1ZkgZpDnwHwAbNNtpFTHPlCFcPijJjMxDE0QXxzw0rOL7rQ7D++Mf7lHUGYTDbfwzvIYqJONSwA3J0ug+HRYLKHwO1PMZnut8BY+s5zZrOKjthMvMEAwVyCiCCCTaUlKDZVQMqfMM6bADdzGg6h5+QGHjnDZpNHC60T8w1jRK9ilPSTotoz9o+Y9nFhswAwz/I5lAT9YMVJAHfBh7Ppthjo0ViI9SsUqVlAXmWB+lf7KxdGEEQk/ERir/Y8Y/K1NfAXf5Hg8pyMn5YEaS6JSbGKZRAjaOXvmuCjOrdvCAwPEvh8OaNqHxn0ns2YBpMlEQdwGpe/iAhYSX+m14fbkiyOyf2vXz2YYJc0cIWa5V3DXBOerc7MVXvlfswJ3slFvlGrCdeN5xZr7tMneGyPyKHOe8RyFSY7LkqLrApwfA+Cvc59NTjMRigxqKakVZDbjyTn3/xJa8b0g08hEgtm2BhIa5xPp7e38FMj1YZEkGzqojHhCOBz0tsW4HrJeYsyZUQNOzxJcSlrJlF3Le8q2xfR6iRqrXZMbA58TnTGvqt8WoScuGsp+27rYbg0DOU2yaZ5xNTnHlPXp8ak4pPBdGe6c8hcKg5LZUBLuQqGD46exIs8QHe/fHFMB273fNYsMkTPiWcVu9ZIpBUpkfdt+QVqSU/mGpKSnh8vm8F9NStZ9wrIqcg+5cW/Nn6kIZCKKOjBlMqw45k1AdFo8Dy6sf/+xvu/f/ALwqGDW280DxUUbYo3zXM0SKwuG25JMrSTrsS6n+EjO8YDZYt6RZSz/I4yjjJO6CAzvIy0RwOVObJGgDFCOUWkcVIDEJ3pk82dwyO/acOu/F8Un1EH0Y9U+BKmt3jPfjJGnVUpZUdLHEET9zZMgrwYTRdLmV3wYkW8XEMEOx0fRFM4c6dnFrLuzlY5uAMWDRpLNbjo1ue50Z8IpbyReR+AhntbNPEjDkf+GP2NEIWL97iGcCRIE6760h6pvongpfwmM+4Nmd9YnYFFon5efYKrvF44h1t4cv2l69cbTA5R0qZOphKAldrSE55q0LKZNCx1DQ0lzVwlfJzg8sL5eqjeVrev6J3VECqQr861CpDRRKrPfCygoCNfHTB1VZLWqmllFhNSgDVHtpP7D8qxhb7u3e5hculCszAzVlhajFNHaKSLoG2AnYwjN3GOybctzZzPE0PYgbZVMWTM6TkxtK2HNabD0mm1HP/uNBLMEWGJntoTMIZMpoVBrEswzc0MRnIS9zzIssiQNFLTNY6c35cHR9MwbRsquMW7MNGQ8vAdKa8DSUauKi4zC7pnhrDoYEeRE59ZNTSuda3SGJfe3ReDKX40G0xLqzUB4Pz3kpWqYCpzbSp1QgJH4FW+51tj2bnHcy1GjFsE5jknUpIf6S0iL0AacrLMVh22NFU8XkxKxa+Rx7qqoAXjfGm21b2ETMwIbdFIcnM6YN/44fef+RjvnEMvluRpaE/fGu84mlreHxRbqyXAN4chdI5DODzGW4UbN052FXrqFI/ecI2iecpcn8+WoV+AArX5JRmnmoATHuOlVmDDy3PvFu91+KRl3Vcvaz7ycCdHP1mMajPj3Ih9qcLmnp4vncXSS1aBvNx30ZP+UiSIXGbjJc0klnCaGEOruK/ApgGGU03ieqFiZxs0sGzczlFmhVeMK9NHYWSiCctrQW5ZZDliI415WYBTM1ZcNVilk7xIEbVvzOD51JCtqWYHqbnepbjuRAxc+sYprOC6JD1d49iuQhkSzKvwlMbb0cReL3kxKuvXVBLgzjaL9CBM7WuU+wKRrSgUTAmT2lVUKRz9F37797/juT85n5NzDqw5t6GL0aO1bt3YNSYbZrsIBM2SEDAGRzJ055rEeXnnA8Zu9K6gQRYZbmiNcj8/wHbatgET3yQbSr4SE8l4PBNENgHtycocEgC2g7PRZ4GmsS43bcleFYYMpmpkIDPA8ypEBKG3xnNM2qZoTYX1Hv/4ROTkLOPKl0uJYiUYRbmei/EmE2wPWYweUjGx2HMCA+iy5340VPZoqHgArSFPVBNqO0bca5UQsp3TL9DTe3hSca3PtuL6t3GJnjTf8VZnbCWeklIWKZVRDYDli3Pd892F2kttnV99PRej8sTrah4/0bWljn+Cc/UzL2Dfwkr5+t5Voy7MTXM/kUUqvgqT+bI+ilV4p8XgoTvSB+/yhN82/mD/jX/6p3/i4zxQCyC+jWgsfW1/c8m3iI2QaSMIZo1G0y1JSOAmnC1AjD5uTA62bUtwD8YpuG05QWSrWTazyJ8eYL8jnAN8Otu2hVY7wjye+G3PRviJeEwwqhFNnb6jpmhrAY6mWXlvGlIVPtE1offkQwZDJmfmmi4HI2OO02kzST4KmDH8SSX/Xa6EvjySgiG953RHTiQBaExXDP9AR6y7zSUAOa41EeBX/tFfGZ2XP9F/8Pj6G1/fc8DvOSB8zwH/2pcQIOuRci+1b15zobgfef+X31QCMu7RXMrrmrLttByvNbEltdqqce6agCFM35F2rhhYDcS5fmeAPPUbIMhKIT2YZ18eatbqd8IsVrQqH/4IIv+n8Iecz74k5pzOu30gHuCamXEXpfffhq+fDx5/enK7QbcNtcl5c9QCQB4SHh4iYDMnhltb0ozuzpFrIOTD8hzKnk0wsnPdpv/mK5nVTZAZfhUqIXsarPRi3QdJNQioDdh4neruU5g97pXQgXPl49JK2ktxye/LJvfIiV/S20eEmAxcT2JEI8+N1pOpzZlYFLmvPJtLsW9KilHLm9Ad95ZvN2TvjJqmi1y0q6QkZZKocgKMwnns2/LhnEQyJinhVjmryUUGr0aPq67pQdMDzakF1cFJTbhl/vsCwgJryn9ZLqBsIyfb21hNg6u9pf8B24l6K993eqxUnVXHoWUcbGNw9nhPP3z6xLv9gosvcHjzjbtEw8w8srmQpyrsMJpVEDFRiWm2yitPb4HLuTO9sZVnqaT3uZISuIqMuF/iDbcdPVv+XkVUMU5KdjI8XWpKbIYkn1/3DzVOHQwdkEpE3pU+4kw4cchzZ8u1/fQZE/MW7yMk81hJbUwJSqRq1TBGkCkobXnwQnkDEgeETPDJoeH7M5gMyQ3DFTs08zqIZl01XTyfXygTlRrTFh6ntXbiAAU54j3nNFf9PJATF9+anGvU/asxtBoBM7yaLUYCov+uIZGWPxnqz9F8qjNKKe8kQTmyicvKlSqiqAqjR6z6UOOH393Z5BPnTx88/AH+AxwtJv2kQdYr0cJVpodCCJKEtWy8iodCmLe+PIutNeS5BSG29l9XxrOm6Dfu3BLzb4CED6mHBOlNG3vJludUj2f57TiHDtqIPE8I4t2YA2wkjhB+YPM46fMi7VXxMVtMXFkRKjqBZRAyr8MtavckNBUpmMy3wzvawEZM1CcxZPlYOi+edXBmbNm9kZwCkGd+r+XjEi56tNFSctRpNLmke52IyU1SeSfl9SBxDMDNUL0UKuqqrwett8Cte75/XcQY4YbxdS4FvNhD1P77z69f92DKG7OKhEo8sygpHdZRzITmiLxIBcR3MSyC0jLtvTgKEVT+TBJmCvisDEfQMrwqWWJ8MX+8GTJKHqM+6dcHF9l4qkkhkWj6iAjeTs42kC7om/L8eHKo8EnCyM/MKU300PtUIJhprcXnn3ZG0n/0KOzNGFaLUlGbzHmmMSbs2w2zwXkappfesaLseWCNuoVVrASl8JKhSe2Msw0kaVpd4TgMn7n5NY5/T11zVcjfxjLV1YslITKZ4/9j792WJEmSM71P1cw9MrO6e45LgLsUCm/4/m+zD7ArFGBADIDp6sqMcDdV5YWqmUcNgNkbgFMX5SLAVHVlxsHdzPT0Hzrijrb04RBPqpy5Z2LYtiUpBOA9sCnSzE73k4noqqlQnv0iC1FqZtAL4aNKpHJkPvdK/Wej6qsFKr78M7Yy48Y3sCft6zalhiZCjW/vir7uTwS4KgNFdFsyw1N/P+PFDIy+vo95A60mX9SANwwvucUZcgDuOk2/r1ZrEr6rSJKnNVb/9b0HrbxgPn3aaV827Ms7snRgdRlCQupZj9bXDhQRRpzp9VBmxyYHm2xISwmlpimHYjJRKjc0FLNEaTtbHvZnfRsp6i8g0tYQcurVn+2e6CQBMVnMNY/BKYFL6sxbOD2ycT1lK7tP3ftCn3rhrAJiOFtPVEVSCDOhm/cvdLCQwk+H7QxmKiOHw+vuB25Px3VIGveGp/Yw0GzHZ6JKg8m6qdefCdS2dTTS0HMuHpFi7FQgUvJzuzsy9cDL+8GtHIbm4LoQX8G5Pn+zjpf2ahszWD6+QnR+C9c2mx0lGxOzmSkszz4LWUE85XiKCyEToVeNKxEoWSGl06c+vpLoD3l61DFWRDPxROPUJSI8mqZXHBM2cOldE1SJlgmTVKEcTDNtoA0e/WD/zY3tEfj7B9V+xz2lTjRaDpkwDs333eYKGzdcgtY00b3VyBJ1jEHjlVs9zFNSq3uEsbVsiinCVh4zcdOSsxjFJErmU3vWt3+KwxbKKsaJkly4mAezvek11EuWRMk2cJlQusNxDPZ9R7WKLwn2/SXPwNUIOmnqCCO11ku3++7vBazIXCTT+OujtpJ29SZLszrY+JgPtuTY+vQLgcuUWfLfs3gmGxhlXu/lT+mSmvtqfRVX8zUBdCbPomzj63zor3mFb1W0Ve60nu1YcmaswobLM8SektFnH4XKKZ+BQKHjKo6fmgiNlg1lE7zHAhZFJHxkouc3z/fIxOECGU1Jp2x0zbNhJtPFnKln02qou9ZbD8RaDTgaqtl4jzfnd//nb/mHz3/PXmfixi3P2niSHHnKO0KeGF6AoYifyRwCur7BADFn8w9etp3H47HQwNsWDM8B5ie9MSu101L+RLUzznl/HNFGjPTTVNUsFB9HypJJo0sOLkY1eoQHIa9VbHQ6o2QOEygUATIuRsjgncMPDn3k39vgrKXconIN5jCIMrKtwqgM5Z8vAcw/qqHS2Qo9OAqclDJU+f4nKdQjkH57wCbTKzYQFJmDgXVA+3NY/jau7zng9xzwew74H35Z22iu2GomTiUOX43mLlwKLE8m0eK9csFszulEGJMxaD7f0GTK51Aj77HpwsfiLc/qIBbLNJ78GNvyF6rfJ8FRMy96qILPwUd5LURfPoGjwdZ26AK95I9oKclVoF6rNfTwlOI/JDA/8+tYxppoJ80afjqKpwRPa5wKWh4t3ZQ5hDRN8/X5uRf7fzW1Knd+kvvLxZorcBSqfJjTRyGlLZBhiPliaHjTatDV0Kh6Luk9mnH7ahb6arz6KeV16DgnwwaiA2t29RoioNlaC83r2UL+LgkWMaZ/a+Zm7l4AZq0z5JFnX9PV+DfV6hfVsFlSnpry0ZtgpuGDpmf5mjzFqUj/sBz6fzuD2xBNH02uAei8Tk2JbXWF6HNGAUiRxHIdp99jwehmrHnOA8RXf1CNyqdYBvfz+QMLrNOjZ88oUuINnZ6zV+9v5oLOwCtH73WmqqayRITz3g78p53393dea+u90Ogld9dc0F4qBvMyx70kul3wiiXJvABncKv3dBFOL+/0GipxjmKzD3htMAEK8mBUjUPApgnmlup5NWk5IJLqu00zXmbD1zO+jsBbe7rLNRSOZCtBAp6QPErOnkAQ6LSqwaZUmvq+ZNmGSg4Oag+NIKEyU6kiHN8bNoJzSsQyvWwqZy/FicVkao7VinCWCEl5ayYQv0f1NOMo/62nNRosKbBDg6NUJjbLGv6Grp7it3J5Zqvo7Ad45TGaZ65W3/Zc9ZV//dtCeiRVbt0jebseisZea+lYcp2XaliC7yKC0Z3zVbntr5yncP7THf3jHT+VaMEeLT2rp6qVKGf1eyOC3TciHDOnVz/itMYQrbWezJrTLMGCIhzn4I1WcpCBPw62240RJKiJYJMErpoZdo7Vqwbww5FiuOHJeDIziFQeiZHEiwiwR+bFZqmE0a0GLTJV1faLLdtSCi6ZTRXLWqTiTeQcZJTM8cwnQmAzxU7wRyxFWY0LsDLjYqrfUACNOp9C2Uou0iTWkHB5aMWNmlZkfC4gjCx1nDPBk1GvXzma1rpPMmU9/ycEZKva02JwtsuzOqW2ZSmqeDsW2MH0CZC1bCNmf+ffvv5iFDN5z6RLJnWbNTUNHdUdykRARNikl6xcUkhnIFmIhTntl4n+yqRuUvzWBDcgiqqlsJBB59P3iGlC5jVE8WS9ZFCfjYVK/lfFk0gZpTEfk2F8bJ8B+PRfP/H5n77wL1/+hYd8AoEX0gBTe0fECNIofXgiKoYkislRhhsjGs4r93Fj2zY2OmNv4IPtvmbIZS7p7C8Dk5QqCnXOI6e9+Cg0mkAU+sLm3HJ6DghdXqHda4OlL0XUAZA+GHnrG4qcHelX8xOBY3O0aIAhg82zmTcKuectF16EYe1OlB7oRBaI76hM9PrJR7G8oIZWWCUnoJqSCtJbUmsjEMvNoprnh3pPbck5tJRRTS4B3RbTYDCRnW0N45wjDSlVeakmnfq1rr6VK1FTugrFsDT1boXCyO+XKKol9RFBaFsbXGVka9zr3BWppHhqaO7rELB6PtLsQm27rGPh0u7NvZKH4oP7XkX/D8pvf/wv/OFP/4NWBsr7o9Nq4j2vMR60mmwTJ2pRiB7HdWM7btA+svgJ5fh4z4bxVkVQP7j1F7Ztww7DSttVtZKXBrdbynFKyzpfRNjrfHjcnV6H4aEDG1f7epRmq7sn9Vc6N93qbAvOnp3+7Qm9KOFZfG+JsnNrSBPUlN06OnJ/3jVR3Ov3RNg81/VEJ08mw3yWoh0vrXwJWIDLmqK73nnUWm/tkl4QK+q43JJSTCLwTevMrWql9YZMDw/xTNqfPNrCHkk1l2D0k2alO1s07W63lZz3YCUpXuwXcWHqIH8rV0q4jHXe2+rePXVlJJiax8m8zBISb6vgvBrmj3rlgzVCchZCfvkjRCKZ81n68l2fNOw+0ZX1/OdgYl7zPK1Xo0WOS+a5uenO6EE04fY3L/zp48HHxzt+z+LmR2+opKxK9w5HUp5HqySnCmixksM6c88+JAueTYUj7vln2XnYCQbdd1pr7PvONCV/OYSXFgVecHgo2nvJluZw5lH3okkWg5ngp4RQlypiPAshOrilN1X+jhDVPNhbY5h85S2oRrKOG+gtQREpK1f623ryMx/c5c4RjzpPnbfywDnHNc5ruq3zziEHSOMqgpyTx5TOmyy00iIHOImVh7SY2sqdKM+fEOgyTd4LZdWcNOPNdGiCdubnUOSrPOevfU3Zt+UVVchBVImo/fGE2lwMJ7dVBCs1AIJFzc8kvZh68VVPdhXkK9dp+ecsnq6foZ7JgVbjGU6twmtE+X6m79PMYS9kozG1r11G2SfIap4k8jrRyU2ER3ukwfqZ3pb77z7xp/vnHNqY86m6HodNuc3r/1q0BYLSW+JwXeBh87v8zN5/ABIRd+sbvVgsvXf2cSwPshEPPI5ElG+9JOzAhiwvuVkc3W4Vi0wTqa7Krb9i06x75oLq2CjWSVOOXcGNrUBIrTXYc5h1bCdjD8YWHIX+/ZA0cc5OqnHzAkJVQyUf/awNHLb8boefVeRKaZs7G7MRzxoQNtueZBqy+SsiKVoTgbOv2iJzGcvPMocL7kj5w34r1/cc8HsO+D0H/I+/hIFrotzzP5REXBpPoaLJzJp7aA57NM/6fBYK2PVD1P0rtkvGwmq8YoSnZPtUWNlMV5wZxfYIb8STT4zG9Aouf2tSFjFzGBLIGckmcnc2gR7Ty0H44CR68NOvf+IPf/gDt54zaAtDRg6kMp8oRsk4OeRn0J3eXripIPbBuDeiNX6+C2+vP7HJxs0DMzBOvKcX04gEJbQW9NZzrahmI3GfNf+M4uMr2wPXAjLIRojTVLGW4N3mA42s/2XGSxpRg2opdHorRJeIsJWKzAJpeTLIog3SxGCAfKDNsXZPTyMPtjoLT20rNu9nRyhP0mq6792RSKDsSXBYdVDClrRyeA4bTmJJrhHZFtTyvZrrZqqqzNM2AR5e6c1Ye3SOAoRGxLfDtpgsRZnN0tBir5/06ZPZnOCxzjIRSdYzV91jlcNplKyrgE42kPQE79UAMN8vy7f5mmOCoifAgux5EcFAar9e4B7RAJ+WCYp6Mm/WULgNvHKY0IMf//ZH+HB+/h8PzIzNb3yyAmQHxDmWJxLkflPJOu9UeMwBzvmo3p3RZyiMoI8NE0FvN4YNYtYGIpzD6X2nd8OkI7cE07WWIA20oQVEj5EscVUpy4n8v+VB741xjqxF7E6Y0Sy9St0or6+RMsljMpSk4rSWP1pJiPnL+vwrrmg+IlWBLXO8uwqhkz1oUMzOydo8xDgxRgzuGtzb9CbcMhZHsI8a4uqNPqeIBUgLwOPIz+C2WCUXyO+qm1KGs5d/7sDcEBqPp9bnt3AZ6TlaKwwhPbCMWJLOzS4uSwS01ng8M2wHCPmMhJFSlATnrLPiYkQvtp/45UHUg88Vw9/+jx/46XeNz7fPfP5/EpD549nYI5lBzQ0jh5Eqe7HhjF6L/L3ywtZSkl9DafLKVsMmkzzzeu98iSRUdH3DPw62cUf28pntn3iMAo9F56eiJLbWlmLLHKohzuPMOlTFOM8TIzhnDurH8vNr7vzyOFZO4+7IeQdyKEzr3PrGeZ4pg1z99+nJNHZHy7YgmavCLh3dNnRYTsO/kHvxpQB9eqx6xnxLmbsIfORwubdj7dtuJY0JhFWPRU9epqc4lkCliJXDeTzX1lUnEFkHzz6GHMns6tfZ+LLQy8pm85yt85tLvpwQvGrrzWxJQj/7hjf/92PVX2Yw0WnRmZI06wrSZMq9kqpkuYzy+rmSi0J8r+5ZDZh8vzDOAnpWc6YSuNCrSLcWjCWPcCVoE6VHjKojMwlIds5laOs60EnXc2fXRvN9FVlDUrbD3bnfDPn1zr/8/WdU31PjUV659TkEa/XQOs1ecnjTNEEvNWAxG5grXTbOxwO9ORbZHDipYGJHUmRhFSg5QR3cNsXDUq+3AqHkh83h0Szm6n+Hp+mqBmlmFrPabHW0X4ne8/kaKqkBqVNej9ys7SQ0OPs9pTJqWJUGZBsDUMnENyjJk1ydBDsdzbesw6TFDfSi9c2GmnpK4UWz1UhQUsd2frd8vh0pJDP+gmoaSJ8xE88NK3TzGEfSAUPXt866+9tJ1oBldje3xdSRziw0pYOEgUxN+dovGjp9RCFs+cpMmY6J0s41UgZyEas4T/urfFZCmqPm2svAoNLwHLHn6LVefjaSbr/5xMfjwXEcfNJP9MeX/Hx1CEcTRkwNZmezjS49tejPQewVEOfAWm4ch7MDpw30lvvWyD1triWlkmgHA/zjC713NjYeJclphVzIQFJI5qcGYkpHeDEkBsNPbgTn9GIRQUc240efzYyRCO0WhBvuj0yOLaqh05jG7fEU0MRyrfawnG6KEDGZj1mwIInilkreGonayER6Uoc7mwkejtklfdmmvJY6GiO1nwWm1I3EpMOSz1FSklPqM2ibNHTHpis4SBIAACAASURBVE6vNKQayFMnXivYqQjEuYJXDu8d6bEGIN/KlQ2QjurX+z3kil3qX/Cld7ev31tyTQFbj0pintAktbeUp77DYrdcqFdEaGuA1EuzejYkUj6DuAzpr9ecDIFZeIJN01xvtF0LRGD0X70ScvLLSF+Xztt6rZRcrfes4mG4VuKuC/k1G9gpGXRHe8MYeAxa7SG3ky49adaxs/XO8OCDTIq7Zgl+jvKP0ZT2mPIfB0arZvI5kpEhXZK5K4kqlE2IrnBG0uvd1uDOI2DPRHTK09hwTlL+BB8pIBtBq0Lyw51xS2+MIcIwQaSn/j7ZlJ1mykHLnAIWuscBe5Jc3YvmtAy2Q5m68Fuk3GGet6n/nQDaOs9j6joLbTbn5AHFlgkddTaQjUvR0jT/dtCrzdMBxWUm6ZV3DUAnsiOu+FVnquML0j2imnuag1wgEeaSrDX1zpSvOKtPJRJL1m5jlD/JxS6TORSMHBAtU+xKR+aJm3uy4dMrYybj4QxGSfxmhmuWhsQTIDPfyxrgb7g4555Dxf7pFf31yZcvX3hTZczfLybceVxsKAtjK5mDX85fqokrhX5OHfJHndXNb6gHo9CtNgy5fRB2S7RrU2TkGWTVLB4SC+U3PJsqvXf8I/f3p9c3zlIXMD/Z5tEz0fmn0reUWkmmUBY0Z/TMpw+Flr4apsHhB2ecGbOYkqK5/k0DP8vAOajzjmufiOMTMT4lcYxq6ubeWzak1VBSaWvoAVs+74gaEmapMxnrYZcsFTHzfiug1Ldzfc8Bv+eA33PA/4RLNpIV8qj6sdQtCMRvZWOxMzfR2nXRVn0d0lBJ5nG0+1pLy8OElJ2aqPO5BRdLtljLUHUu+XbZRJT8fZngpYxSyYrZmLBY10Rg8+THECWBaAp0J9zpbxvbp4adidCOkkXFqpnOhlujaefWW6LIn3oCdh5IJKv68Xhk061tWCGhXyNlfWVPbI23QOPOiF4+FTuj8Na9QKXEE5OZHMKtprwIoY3w9JRR9dxfEU90dkmACtUfUq1GdUqLSRfUp4/YuNQFujKGo+4k2DbYvXG2kxwD1OOJYKnmxI5UDjh7WjGU0ZIBYVYqByIgN4Zlc3FKv/WYvRlfwKR4GjYC6aknsp6jEzTudT8aXQpktgYrQTzl9H/tqz0pEmWMF9I1w/P8A7qdq1EaLrUntPpA+ewkNlTkSUpxLObqZERkDnmtl3rX+om27mWez0AknCYZq18D97Rec/UaSyXAa2BkMWj1zHZ/xVuwf7rhPwW//PyFd/tIcIsqu7SvlIZEBO9CeE9+QThOyWUW60EdPur1e8AHRm+dXjmRqSAFB9okh5GP8cA5eO03/OH4bUND6QKjVZ9UBmm6EYi3HPTERq+40URAMrY1z6byGYOJtZBi30rkrkhAV4K/deswPJUGhMu/JxGSuc+iVI9aQ1oxk8QZU3kiskcaceU393ZykuDLgcA5vWmzhycRS50oa7AJZKtY5Ol9RgAaDJ0DlHnmxJLEbg5bDe82T2mxKbn3LV2XPPFU/8h6KKIRlOIG2U9PcGPHbdBcE1RFxpfJxnWepNtXz/1p0D/9Hp/YgvmvCRJqe2DS+OF//wn7MH7++Wc269xIee3bHIQwsAnW2fLZuTun55kZI6B1mjTcP9P0RwDMKLACDILehaNANyGCnrbqIaDOysFHZI52KyDAx/FgDphaa8go6WMZuGcslQJw/DIO3HJg/LjHknvNmwfdax+agx15L4hk2Uoqz9wtv5dYI17Lt7pmDWcr1rikLOOtbuyXUISG0Qm7gJYtWnlbpSR4ZoEFAlNZIItkQ1IqA/n9+oyDwrIVcvaUlKyadbH06vx8uHGUJKjJoNe6Oarv0ChQdQSuj2u+MAdM/lY1dRA0TL72W1LGUgn4t66/3MmIfhVAEUh7rD/7E7pnTbPmh8vsl6z+jSUJJBdyd0muxIVwiPryww+kqDfZcKsCoPJq/EqCEV+pQ059gwUOoRK8Kk43yQSvyfTYKJ3pltN3unP7tKE34/6RaDlTOKvh0SXZUdiZNEZI6qgkYlJmo+IcRJnf4sEWe+rbVzYaTRn2XnTPTAObbEAWSrnwdNFt57cRrSbc08ktEpxbUgD1dLS6B35Os6/L32hKrqxkD8lJcztYB1F5IAU9gxTByVG6yLoOxTXzk2oE1j2aY62o5yrFtJqX1LqxkpnSp2flcaymlczKFsVlUtyn9nk+8Zm0zeZiY0t/D7sQ14Etvchv5coEK2VlEuE8mOjqjiGS6zZgHUyQmqTytNZnQTrllfS50YwzvcfMyaazyGrkpXzDtlK3IAgTfA4eLbBWjeKWB8/r//YTIYNf/vEf0X8xXnzuIcVFiNbAb6vZfGyDYc5m2dA+j3e2Xswz3xG506VzHIlc2FGGn/iwFTw2NtIXBXrbGRpJ/eZqIC3q/DDUpyFr1HBR0nOgltMeWRQ+HvdkZmBIg+6zyGmgivdYzAnTg9xOgm2CBbR2A+7179dQvRVy0LQaXxH5rKfma69zw+yrs49IY+6jvtMWmRY1TVT7EaAyCy3o9rRn9YAzh9hNJyJplNY/tJBVvDR4AgYk+zTvzZO8XATRfBVJ6r4azNXG4zrjv50r9M/3+aQZXx5KyIZXwG/zGbdLEx1RfCLlqqDIgflEXO3Xty5fC9FzUc4zWc97efOKN944pl8K9lUDIgdEiXKZ6NkiNtNjNjyObJA3YcRB/93O26c3egs+f/7MGb7kfbbVMklkSzZos9Fg4Zlq26gGSUMauCoMy6a0O3qU1v8GYYZ70GMwHoO+NaJlM8/dF4KccxCaQAcrNpKE8VFVzbY1cC8GcaSErKXRpZAxJO+5JmiBJAqtlk6/kJIdRRVc2mpMh9wzBvkDHYIOod0iZYEiiHYZDM8XFXtlDhEhafbJjKgmbbszG7dNJxBELikdDfBkzMx0aFsSKpnotlJeXOj2J7BDGoFX8qY5hEk21r+3wv8al371ma18DFpshTCNkofSSmrL77EQzZmrZPEcBMzzaVHsyYbXk051/s9YfzFvqznwMgeNKk+sv4wHz+hZSUdtIJHBJlmwzbRCrNHZU8qmADFNhEQhz+bT1VB17qBwFJjl05sSrztx/8KdD8KzIG8zPyPXiteaHxOxPgt2V+4jfcXCN26R903lRG4vuU82odOxc+cmmRe2cxaWxksNnXNInHliDpqyoeOV7z3sFySSUT/iZHoIdPbFlnfPPNH2RrN6CBUzTotiesIpD2xLv1D3RMH67fJgGN5Ttlqk4pWX/n2tC/Q6iwvx2v1p0OKZD+ezTO8OUasfSHkWq9rASiZah9K8PKDW8ORaS1vTa719I9f3HPB7Dvg9B/yPv4RBNEenV6+W29KT51/Yk2SmTgmnnemN2Bxc5zPJOBKTdTJ/rUCPi8XuumJLDriqMfrVp0u5S+dqvNj0oeGE8j3psWN5jOUQPsAlEr2Mo9aTfSHOXRz99MKXP31mk4ZrwgOmT5tHDji0K94aJ7UWKlc1OQgf7PIjPgxD+DDn7faCAPcCh+6h68seouBnNtrVkSh2qkwkPl/dq1DFyZ6Nu3OOE/cBOEd5WHg46lsOxWxcDVKVZdEALf9sQZ8N0vAc8gCnWMojq9AkauChq6cx90pug7o/4jRh5SlzEN9rwLi5JgCKPGNUFPerD+Iz0OiTT+vTU3eUXoCkUKmzPlZTWEQSFa6soVdKLvPNXSZzQFiAaAEpvz3xzJ/y3Ki1H52YgAcJeuWOvVgIo6wnIPfcPCu9X19+NlTbyuskPZY8gT5HvZfE9TsTUBicF4ALVu4V6+cAf8m8sCuPAlHw2hkf8G4HuyQYvIUhmsO0PBuCm2/LTy9Vd66eFECTvkA0LS51A6vht4xaD60xxBntylFuk2k6FGlwxB2lX83xahpHzLrFV97lI4Hmgzxs3HPtymRzRRSYKq6ht8sFcukbZtVsrqU8pOqYAJDF7kBr5lNWH0gO7a3WxQRFROWp6Stkq0EO+boaKbeYsfJYNZnUcKWxX3WIXJLaUsAtV6WPy7u4zftet7QxvillCKDOjIqmEajX5285IAoPLLxYc7k/VJWeE706U3JSmDngZKFPo5G8LhDTowZ61xCnuzLZkmc7MAz5sfGb//arHKb8/Mr5OXOxbYLn7CzGPIzIc9xKCcbcCDeME3GhtxfMf6FJ48YrbpGgVU7cTprtiBpHPBDdSxHiC3Oof9POYS3P4yOHUefD1z6IrfyOBMLvhDvDBo9WwAQzzC1jjljKONcySs/XndFyD24OduQ61QiEHSuGuYsT3Zd8Nd0KsJigQpWdH+XGH6Y/NycegcqDCXhKVrXTW56HQvqhzVi9QJUC04j2dAcOQgKNkwsAWc90nKjOiONYqcgtacvoBB/1r8qoemPuKw2S7VbPc57X01vw6tzXPZv9Fq5ZTqz4/K+vvzhgqjwci4kGmsODSF33ui7T8xpeeEm1BUTTbJT5ZViJ90Ud7/6Eji1tb9FJ0wdqCHJtF0mDVrF1WMaky8UcKpw57SbNqLQaQlG0NotgK6ra0WCvZOEo47NPf/MTZwze39/Z7IVPw+mtV8NBQMZCpqsYwZbf1YtO93ggvRpS0jnuJ70njV5E2FrR70IZx8m2beDJplJnTSOpg59JsZYy87rmS4nynEnM1nFPFFKb5qDBWqyGI9pBLjppE6AocHjU9wmUltRSST3GBID6pcE4H2UcaxWeruj8AckBo+glSwOpj6n6hA52Y1Tg7p7SDPn7t3q2xvRUcQa9En5diKhCsBAY2yUfMiWJ9P7NJWsuqdc+JYYWQ6tROtAzydwLhRbr9xZC1VsVR4kjAqrxd9bPd1ymH0Jf+8Nl0vlbNtSAIANYSudMeasXmp01Tc/GRPuh0/zGZl/48uUL46Ma5Geu2d1faO3APXWC27ln47ydDNdkmxWdcos3Ql+xEbTIYWsv6QIXoe2C6o4vfy9oGtjhUGtCS65xNjWz+Tt1wlmsEN1Oeu3tpJM69/svHEen907vO2xSyIVKXswZReMeOohVtAtjOGccsGUTbXPHPddwbruUWvJJGddEuAFfFSHR7nlf7XWhf2bC4WRylfelr3XR4l5nbax9F97wkobsk6cogi39LdhlaiQnKqJxocL7TOpgve6IYJoqZiGRxYGOa99d+/rbuNLIOo2LgWU2qyqEPOo8KRmiqKZUQEGlr31WNzZq6JFMiWrsylioVJ3vGh3nBKk1VDq9RjbdpaWpcLINhBkG1ec5pjTPho0RTM/BYz5jcaQ0+VtLBsC+Nd7aJx774P0fD2TkOnmJK8nGL7+pJQcWLyvxEvEc1HgmIh7O1vo1opL8fGmiWWwLLTSZONaFkg/OVy/W10SUAohZMVfq52Jweurtd+lQRUEfVSis9hkLqa+qDKnYWhAGl6j9fzC9ICdr4RF3ogcmJ6OS6qlt/JwwSTxIXWmIWjM8NUaIS+qmdYjwNCAtJGpH08i3BgoigjCqIR6Jsm1nteIKhRy6ztPNWI3QiaoUacvD4Vu5kt38NLwVMB2MMnp1WbZAREg2ki1W4inRSoJIrsaMsqS2EM9GWGRLKIv0vvx8CpsFpHZ4xjJZ8Usjz6vsIVXe02rQIEL0TGSH2fIdaaLFsKkCO6i/dIZ54Yfm0CQFMjNvyQIk3hovv+p8khvG4DzzfPQyLBdtHOEFThwwKletnErIwsTMIZyzZfNtQ7g/5gAotb3xGyF7DW0e9FZNkem3Eo7f73lfTAmV1BzfQbRjKOof6QOKcNrGtm2EPzgdQjpazQk5GrrPIVYWcqc/8IqFRvBxfuDhiURtKbfSPGPx1nQGwXV+6pQhnblZhQ0txPHc8SKCtsAsc5gmt/VsfDFAAyvN8K20kTVYUo7Pvg7TRyNzwm+HFQjfc0D4ngN+zwH/4y+LUbOv63tfA7wp8ZcNlzWQBohR/gMQzeglsWcVR8L7YnClx86akudriuMFoG1hy4dTS+rf5WQCcdUDn6y5ehV/MrNSOWdHHANEFDm9mj6ajNpIb0TbnNuvXvjyP//IWV7Gu+zr84kkcEhiEJb5qItzauapjYZG5Htq9niaK6eXVP+Zv5+3Nb022rYjLrgHoiBV07dMclNKbXoQtdwfOQsuLR63xaDY2DnswCzwAtf6ZKNGDtxkxnxgMBIZP5NEyec1e0GqSlgyLw/PGEu0fN/yqTPZVj6ziacPVfWRAJpuOfyA5bex1ksEQ3w1yNUzDmUOWgo8sS0vD2lt9Uqi4lcOcC8QW7Bf+bIIhNL4Gin+17xcBdfBoNW2itWM1BqaRtU+PDXCHQibfpjpB9Tm/Wg5SPxz8PsEWUCCMOY9kyf1orPXOeyC1j0fEkR5y04XwGFp+5CfuK+z8vK8UqIlyM0JosDZL7995U3fsD+Mku8OfOw5ZK4eXOZystZRDk6iBj6TnRNI+bGepLpDQ/BTUJXyDMqatMuGlYxyyqClZ26rwUzrAvIB0RKU15KpOWOKqFbLLeuidhqEM6jYSPpY5rDHaWOyRPL3DzlTRpeodZx9tQnURpOZPAHuoYK2BtWvTHXC2hMSOREkMClJMY5UbKge4jr3/qyDnbmxLjnGJSev97VHnuzssjkvQrP0F02guSD2VLvD9Qvf0hWdHLDW4HPmy5WvZs8612eQQC/IeEDVIbOXISTbLJ/f5QkNzqkzRk2wiLDPelxhek23NnJdmrH9WnnbX9g+3fh5/Ev+8KPqgoeu81e8c5eP6vPW15I9QRYRDBNad9zTG01EcNtR2Qmv87w1wkH0I/MYTQnkbdsYDmNvnONMyWFJyb81ILVjgQ2mHObAsx41x/2DYYNhJ+f5uOQzJetU50BNCYPhN449F2SXnREnXTxtYaKa7mdHehJDeu+ZeYfmIHhrSMlwqp/EOUC1gHJVl1aOINwua4T5mdpIlmYkaDNnKZdqmWvunUwVMpdz9SWJTnRaKF0aPiXwFLZi5sttDr+mx1nFo5geV/rUP08GIjpSZQ1ARkqcA4sBzIRD/9vX/7LqyiRhduLm4cKi04cUOrBuVESakk2fimY90a4iS+P2EenvkF/O0UIRWZ9GtB3+jJYLMPS9vvykedfnknzzxMkIXTs+TbBGe2qYdeYHvbf5oDciciiTqm3B7b++8PKm+J+CL39/Rz5vgPFGo1XC4VUkGSc7SaPNMzYnlVP2T4cxbgcbG72/0Fvnfn4BK8TevjPc+Xg82PYGvDAq0VJV6Ns6HFV1SY3MBIaRQ5qc6KaW8/BY52kTFoIGwCM1u6d5bEiDKckQDjpKs/4BPmhk8hlxSdnlGpgLbL+CxEQrRACXdro9UZfbQrrOQ+++6IwZ1HLjtacMUir57gTGUYiHabiqiCVCqYVBrSGXQswO6PqXtsD//5eWZCJl2KZyLE+KGWxcUm8TEXpMZl+/EHNQzQeYKHtTMMuGqetYSFV5atTNJuvRNBEuQPg0cE86fETKUk7q46zP3jnRTx+8/V+v3H5S/vDf/4H7/c5LoUj62LidiZT+ZB3XRNPeCv2vfXCvAejLNriJpdT5yCL/y/0O2rjdbtw+cm/wgFHsjP3ljV5r8IP0gDvPM+UeRdj6rdBlUQib/H4vIXwao4LPgdkg/AuPe+cQgW3jpukBMNEB0R54z+dj8uCL/gLAL+2j/n1H2nEV7G18XST4nvsqgnZsaDtXgyeLFFvmso/2vrTWz/rMe1fOQjhtZyB7NaIXIspK8gQEZYvUxJ+phXGWr0Xmeh9hieyr5NelJ3I8guFc+22hsOBoX2qxJUocis5eRdBCO3wz19WwFEkUY572XuhSuZhCIikXJ0B8pHdRNbtNtxXnItKfbho421OhMsOnyp1bbUwToZEDFV9N+UIXEezuPIre30MJBCT1tanPOqTu+0KTeKKWSJnf83VUofzB/umNsb/z+IPzZbzTOrwcL/W+0wjSngZcX9BIKn2TH3mczotsCXs1OOyOavkuumB2so1kh6oqX+xnHiWvp0OXWfNcM601XiX9WsSNR+3dU7MIE9oqylp04oQxBlbPZWvJAHPPQdXpUrKvabhhN4jVcHBeNCVHKFPLmPJ+7rgpUeCFcX5cAA0ylopGytlF4Gq5HmLn1EmJ92V2iVXZGok8EkifA6nG60xH7Gq6GQKRz2ICUsDLwDoLpZYdPpiIPonV6PoWLt8+IIwphUJMGQZBZSKzHkgV9w4ccRK0dT50Eba5PyaK3mI1wRRw/SVnqW1KfBkyG7bkYC6RipUgw0Kpa0CXjQThVJ5TZt8AOnL/d828MlF4ilRxnF8nEElBgtYE8YwV+fk8mXCU1JsEsm/47zbipxu//tvf8cf//vc8Hg8+8ZYx6fwoVB/gYMe9Plet3daXl1doA02GVQ+hHfm5b/3G7XZDTuPUZAs9cPb9hX3fuZXK0ptmoUbAfZx4aEqIxY1unVfbEQmGn5ytsbszaiCVcfNHruM/ePMp5SMZE4Ep6+hx4KE8jpP7PmWeMt+igWhy3muFZIPGg5AbWkCnmY6vQYeyNP/NzvWaE1hkcQHMWvtIBkY4UybEIiWX8r4qWBVpJe0BjdBvp2EH33PA7zng9xzwP+Ny9pKymkzZOos0iHiv2jlrSQIWHz08B0ci4MqQ6xzKOjkVPPJnO7qGfXOvHmxT21MsmYYi0GauY1cjo1+vZQUIUkDiE5AeYGf1ImbPZTXsJf3qDs2z9+OtYE6/3/j5Hx88Hg+wN1orCbfWczAqktYD5F6fn/+wlOrRUOz01ZMQUtJ4b51hJ+ZAeXQNPuh7DqCajxwmtYbFVAaowZImGHTeC5cCPO07fjxAhZMT715IfGGE0ezy2948sAI8rAGDO2158lGMGkAGYwxOu3wqDinJyQi88oVX25kysKGZX2ZjtljE6jM0J1Nx5imiOUAx565zKPRg7Ale21a479V/E1w/MCbISWkNhiZg190Qyx6MiCK2rYP2W2qHZzOyrxiAvtegjBXLgxmByOajByIj80CiJNcO3O1J7jZlrHOAtLPJZJiVfKyfVw1EbdGIBZZTOS9vXMZqoMccKqss78Fswk+2VL2PNlwNjxzDPPZRICG4/e0Nd3j88VG1iBTbI3tvkOy+6Uvk4WDTK6V6YE0SQBDJ3j30lckuFzJW0ZSDwQ60Anrn4C4Q6Yhk3Ny90c4OJ0QTDr0G/wBbeAECEsBjmvYZYuAW+HiAb8ne9Kyx5uAbQE6jxVHnTOeEpXY0wXS9lJ5yUN4XacARfqg8etZlX/p7stu3B2MMHu3kiFHAF8/aiAkcSnbcKOWPl5HgsvBg6iW7WEprRuS6KMBMK0CBRKlAiUDkmRfAVvVd02IzflPXBM3Mv0/m205QvsdyEHHWfqkB0dw/Kpjc18AT8uuLyFeAheuP+fqnKrJYggOvOmckkpD+SfDdePnpxva7H5EflMfjwZc//MxxHIi+oWPLz+dloxLBbvk5bBz0ti+bgQkcsOM9vTW9YWTcoXXaSEnvPtLfdmsnoq9EGAedj+Nj9RhSni4ZQmZGby/0XsAOv/yadYI3z/e0VDnuDDe+3D8y3nnGud77Ag60/k6cb8ko9IE/nB9e3zKPVgXfML8T3hH5xHEayEliVDdeY+P3rz/x/v7O/Uwg72OT1ftIFuet4tJJ643myhjpqXug9OpdqCZIwRS2lXc0nHtJ5xVAQhUXZbjT3Ol8ysNYC0zRnEkA6kbujQCt+YVILMUOj1Sby/qgFo3tCzjhejG/VywwrUH5v339xexQpGh6hc5NFksZkpaOqKjhFI2sGnsSgkklBVHLutAoMPWmU1omjQ1r41TjZcgDWcgDXU2hOTUz8Zrs5U3fnw+OyKl7i0wARK+hyPwMoSnxMi/XDRR0FDJDnf7W+Gn7ERvG/T0X5RiN0EazDVmsH7A4cb/kV7q0lOwJ6DjneAGZCOaT6DuC07VzmvIx7jkN3V5pbkkRr+JeROhLfkkXwHpKwliZobl7UvzswM1wShNdEoMmWsgLJop7Gp0lFc7d6XZie02BI5sqwx1Xwf5VxpPf50QuDUgZbCQSfganiAfnLLxCIaqgrlfRoksCRAvwD0Icm1NsF7Y6IY8cc+caqI6v+MbQsxKPc60F9Q6eMjFPao7fxCXtgcQr20yEeMkGtN9XYhvMIaHgFRiEWOgcl1jJ1/Ts0HisgFw5Xr3W1NkHnumM04OmglOPCylLnGjd43P2ucPgFcyc/dcv/M3//Rv++Mc/8vnvMpnYeYNTl3fYGx/rYAYycJyzYA8e8ShJAuE8jI2Drb8yDke04X7UIEAWJXZwDTGlkkc7csA6xlXg931ba/A0ZVRQljA2Fb7cv6DygpvT44V2KzNcn98VRungIskqmWvYzLDdc49I7sUOhaTJe9rEiFGFvA5sJo8+UTYbbSZ3EbQQzKAX4okhK9hYm4iTax9q64RV00j7wm2vo5ILGbNkLwNM5pphIc6UYmJGgGSSfUgs2aNsnu8XIqjiwDcGXs0CUbR8Jp7ksIILfWpbDYgEeAI0cDFHtcAPiSAPQo8LZa+WA21YgTdvxCx4ffkcKXPwMg/PRB1vc4AgV0I+DUg9DV9yvz5pSptOJKCuAcWUrP3N73/g8JPHz3fezysJmCilUIOF9Fb2kHVee8CJgMWSPXgwUppKNk53ZEwDbK2CJj+fGZVEsgqRNpwH04A1uEf6OFlYFWEwvVWCGw83HGVK4maumgU50glJpGyIpaxe9CuWivOYXoZlZEkMvCXy9yp4WPH60HPd810U6RfbKsI542TK0wpKVCNiyd8IuFZzPj6eEMrbSlSfoBHXftSJRFJEbvV+Je1GpG8Aif7z0vf/Ni5Pzfjecv3MbSRRUjtUtqmrfwZAGFfilvc7IpZhdESwzeKfK65LTKaZrqLCJd+jfhKAJpEyEpGI61bMoFlMHepcKctzDpnPZUOr+ef1HfPfZjLvHvQaNJtWESsCWvIuW4DBaMJDjZ/+62/5qpZxXQAAIABJREFU05/+xMcf37n7na03+tmzyB7ZXExZmGq22blYc9o8gUmq2JOxrJnyeDhvrrQpqYPCOJGmKwf86J0ewhijPCTAbCTSbhj9Vmi7SKm70fPs33hNsJGfUB43kPJfRDD8YIhze2nslTecmhInooEWOtnM0MmY15FbfNEPWShLSKbRhej2bCpKlCfX1ASv82Wi+CovBxBrFcv1OtOlEz3l5DQEYqveVzUv9Przt3J9zwG/54Dfc8D/+KtHI8RXnPEpjx6e503dnYvxNyW0nnI4fJmsz3j0HEMClozt7K30SBkpoPw882xbrZfQSxYtlMkSVPIZOB2VBMGc0pHyUJpCJhZWaP1Cqtd528qr7/abG36cfPzTz/zSNnoNWDc5s3exD/YJ2FDFyAZUL5a24Aw/kx1kO4ecK3dKb82GFIK+6Svayus4nL7leT2aZk8nWt4Xz6HMKBAOpY5CebRlA7WXTGCeF0LZO85Bi3RuMcEpz7YB9aRc19pe0tPtYrs0uS8ZUn1mhi4/ElvDPHcvxnF+LnenhaKSjOFp0H7ibOR3R6oPxtXINWEhwXOX5ecxLlCzoQlU0QRby4xYHrn2rv7wX/2a4Lf5kTxFGGvQU3HpKbyKVC5jkAEscL3Tpq9Wm5OpVrk8CEZUT27mbVp/v/LzWn/c6ucKnAVI7MtPqWQGQJ1t7lnxqaZKL1apuiCaYIwRI/1PI6DA57cfbmxH536/Ex+Xz2WrhnnRPwoQvad/OBS4Coac9GJRDxOkrYM716cFGxPMk9LGOeBSvHK8/HrCo4JS7x1F6DbBCgWYmvKDvWxNyj9zb8FhA1yreZxylFPab9YvI87smdbSy4/qjFbKDPte9SyIOrRRtV/u22O7pZStKmYPZEsZSJdk/pqOHHBXXT2ZxWMORCTn7ln3go2pQlL/7vfV9DbxXEtPay5tV+YCTEBFRNBKOl3LE+fbuvI5eB0W3aecJF99t0vis/76vC+kfDJFVl2cr3WBIVoNE3wB7X2dVRobrV5r9mGbs1hPZzvov2rs/sKLbHz+/Jkvx8mbN7yIJHNge0ymZyj3J6BYr3ztgXKasSPQjhxs2AGtQIvhNVS8pbSc5fqYzOvAaNFonpLcyeB60GipyIDnYMidvU0QTfYdQtLr6P3n6rV35eHO6+0lGXWVo979nn33ynsfoQynGLmDrb1xHgHtXjLQDWvXfOQmOx/ne1omKDxeU679kikEUWVzBUuf6lCSY5hT3Xzd2vfyNChUFOUl45QUc1AcbBRL6obVYOlj9uTdK/5m3okUyCgmW16Q8rZqeEmUs3IVlfPJhw3iqbe11upfuP7igEnFcig/A2slOBKX1Ix6Q3VSf4EgpfKqCdZE2OZP1x4xjsvEjSs4rUlaJVF5ize8DqaJDB7i9DJmzEZYIdZm80OpTZW6lt6SIt08F/DQJ9pyXBO8KASZK8h+wg77b298/udfMrG531CNRPPaZfI5C/LV0GhHsqlESIyUMRywRJihjSQXG8d5oj2LuvvDsJ4FzdZvnHbySZISmLqKV0BvZUTvMRDPzXa6E5yICkOnf0h+XhUlxUy0MuRC73qsZCubRNmam6a5BgxRhiiuD2xu2JiIntxIBmyShmfaoChuELE2SzxVI3MqbBbL5EzCF1OAyWpqjaOChauuFT2RI8hJL+qvr1/OxJSmiLelcfktXcEDfWZWSZqNO+dKpHQaJcbVqL6kluJfeXVEGG0lfFcQyd5ZoCSrAyiqY2ndyhwGXoE5ylw2X1dWQ/fUYi3+EDT9gd/89kZ//Wf++Z//mV/+4YO2bdzjzq98513zrHiLexXJe8lrCWadl5fc81EFbWjnEKdJYzhstj8lUT3ZFKIXPXbeh6K5uqXJ6+12AwaqqVk8tHEuymhRi1sjqbaOnQe+bYx0NK4GX5mNi+T+mFrpIyfm3VlFrMq5EPxTP9hoFyuBosa748Xi3FpHZhJQ+6/LlXyrlzxGpIwDk95eQ4sWzlkNkyFjGcy25VGi62d3T8xHrqvyqiAWDT15NFn8RUkR9QhsTJrunkVG5Kqcn5lvSMYBAI1k+nTPfvVM+C8yQ641/qz5H1XsFMZtkJq0FwtYV9GRLzZj20ScPcsycZ03de41T+ZR9mQcdDI/0ihyhC903hHGVmjOGReHRMlM1UC+a8WDSuxu8PqbT4zunGfwPvK5nFXYNi/dZtInYFg1EgqEMPQkLAdB7ImozDlQNRhko8U74sKLb/xiXhKv2ZBPL6ZErX+osVVRNc3k7RxYIb39OHHLxrvJnV0zYdKWoAQvmYg874xBod5iDrGKxh1RzId8LuZ5bj4aDIwRg/PJbFk1h2Gj+/JvzCTaKqfJexMyGJWob7atRGp5BMkBxRYRl2q2Z5wNsuk7ZSc8GhMV7ZLfYzToJe2VOMWzBmt1bpsiFxb0r3+5pBRJKE0UaxfiupY3wlioTpgFo1yqFMVEqTnTyrmy4ZC7cTWB4mJbXznEvx2/s+GTYJP5TG3lAIKtgudijEyQk0t6P+Sl6/y2iRiP+dlivRcE3g3EaKH4PpAteJzCy+87tx9/oN0aX/7pZPzjg60ZhqFuHGNkEUEOTOfQI/fxLXMjTx8YCLYtG6XDAxsPbpINQ/eTI+Dz/ZeFwHv1E4/BcRzEvfZ8a7wIdOmch+GFLtRdM08jJTi3vhGeTKP0nmt8fPklCzY9UAK125KlcTo9HLPBqDPJUM4yrddaG5V0rPs7h9lWzY+UG5z/fqzi1lyzuSiwZOP+3espn1z/RaHN/OCSbLG//EJ/let7Dvg9B/yeA/7HXiGkn1n1HCaMdPiUchG01vIc5Cdw4mK4iNqSKWxp0Jc5xRp6HDRLZvLafuLXeCqeep3rDxeQ9qx+SVC1sQAMrAyzknlf718SvCHG+dQTme1+3+4Md15+eGEbG74b/nfG/Y/BS+8YQVdhL+nWZOyeeEkShzyQ1jnGBzFeoAsP7myesaXEQdKYvIa17nAc94X+lkhWmJqmnFM17GaOrV65G3m+DK9Bi0gy8MLq3yZYKYd5qpqSzLMZWo3M8wk60qSvYZmT5xIGZ3h6XTep3BomoEvI9THMCD+JRSEov7UutGfVlbmeBCDo4hw+05lkg839BLn/ZjNdIvsxEJe0mkj6B4qwGys/qpl8rZdvKAeUkf499SBWjiYJRIso1n3lzarVr/Lne5hDeLj2jDFoMYFEJ3Mcq89tydiZrJf4s3uSz3I2n30BkZeM09pFEHEuOcw53HDNuDK/01Y5Usz9+WbIoWwvyvnlznZ+QqS8+sxoLZvPkDFueuEUDgAifdJyGNU5Sw6sl9erSTLYVBW29JJfcpQOIUbfcmhrfcbf7NGNI/fHlJttomwObW/oZmB2gbhVObBkK/UgSr46yHwsKj/WmD6Zfnm1eHo0mkV622kymWhCa53HjJVdrgiiBZwTOOXOYGDiHNU7dN7ptdAvj7k8H6SeWUzJc/LzhbCYEvoUgy6JRcc0wSjhtVYEzj8f1HxDVxPNenGqO3CtT40cjLn6V370c8BpdRbxFYjkAvmt2yJjKUXMdQesXvq1QzOuJENsvi7QjHOrf/39Cz/+ZuOXjz9x/NMHjnPzzmHzWV7y49fl3D0Znio7iuI+uMUt95kKBw+69AWSsvMdLQaXR+Nsda6O8a+YdT7AGthonB8JpmhdGI/KkYFxGD6C83ESVbfECbJtTFfJCWi7i6ZsquSgx4ppC6nOgpYSCq8JqHqVNQ/RSKBJD7jFDgbdhaOz5g1z8Kd1r3f3rFkjgYYUMGUCFFJVZeaYPePC7C+4Q4wErESkYkZMKfk8B/WJpZ7xaJJ5niZDMhDJ+H3VC6UoUWcvsPw886lentkL6PdvXP9LDyb1jpUu4DL5e274WDVUaoAzv9wKBtaxojNOWhdyaa/q0/+fjYTNuIwb9SrKR034m3eGVpPGuOiW60R9X9RY9c428v3P/lFDE18oLo2O1/c75V59xsEaof1449Pf/pr393c+/imRy913NrPczNHXz2qhU49wNmmEO6d80Eqyw2aAroFQp+N+Z4/XRD9oImJaa4Q5m24c5xVUu3SkENjHsIUeRzQ3qxsRTtOGTbMmhE4iVxPx+PyAMxnb1mKBsCeUgSc7K7qRY6Ad9RO8jMhD06C+CkaM9Yyd2fyBC5LZl3eXRepVOoG1+Sx9JfFbLWqb1OqMuFA6qxp7IY4U1wOaZrJTn2VKJUVrC7n0rVw9BJWGl0ziRCw0ObBCpMz9MVHZiZZylEQh5ncs5lct1RaXEW9zxWqP7E9BeO61lBnxKk53YJqdFztiDo2hDi3Be1S9HBwyiBrCvv63X9H+yyv/8+Pv+PicB/9uD1qhaD4KkSx2rj0ecud89NJZrc/cGhrGceQaH4XK2dvOBESMQpZBFm9mRtPXlF8Ix/zk8ShEas/EbzD4uGlJ0KQ2LK8vjPPMhqIJ4oZ46tcHgZkiemaQUWGWj1aJE6RZdETKMETkeZDoOIh45lU2mmfiMxHLEcI+6owLX2ba6wBXRy31yz3md67UO7Ip0xi5Fkbg1UA1ycK3j6eCV6q5UMEiNWKjhvyBcJbUKcscExlsszkvQSsdV/Re90GJv0CN/WtcwkZDkWrgT/StyYPQic5RlozWlMIpyZBMbwdtygpVYWzOkgrSiZiEtQ+/QoTbeSH9JKU5konk1VBW6Fs1e1Ky1WuvmRtNnFbZyJJ5sadDWwZtdBq6pCaOONk+7Wy3V15ofP7y/+Z+82SBiurSlN+eGCRgCwnu0jnHUfrYuYakTG/tdmI1RDB17BzVwN44qxB425VTLCWxNJGkIeQqHeVvEMrhA3s8Sgro5LXXHreWOs3uSX3vvfYeJdmaiaU+Htie56a4ZFOGqyA5+MLJUUXNsxyH0ppy85QYaq1hrTEsZXeDKPRq0JfUha5nG6sbvrGkByOIXvumitO+fDoS4Zm64yVJDtyHwyjEVOVXuRZn7nStr2/ikoa3y4dgmsNKgLRHFaGyUHjUmiZiDXCmFFo2H4qdMjrHZKjAijVO3hcnaJaD1ok4hmt4G35y6FzTDstAu5pQ0uhcBX+I4FUIJAvhYonlQKz08GdRu/Vlitzc1/4fXhBPGenjSUAzjjbwm/H2+xfaj7/jD/4H7vbgOA42y0ZuhC/JSD8c123FcVdW824VRrMRNhxpjpJNhCmzZ8dAvPNHxvrvADffU7YhHB8n59Zz/xLo0YjYCgVew8Ku2JgMJkO3Djh73BDfE7E3m7FyZqGhwq2e3eEnvuSTehZosGSMzxqo5ZlkDH1U/ZDv2eMFKQN4DSd6xioZt2rYU42VyBy7nuPzAEufJbV5rOc6/8usJ76V63sO+D0H/J4D/mdcngO+GVdWs+tiKInkLhByYEoDN19+LlLMijwPe7GZzyVHmMCeGkboBZSde0Xq/CPqtci4NnORIdmKJUvm+nSyYtPhsK94oPmBl1/H1yV8/ndHbk779MKn/SeO+8kvP3/hIQev9rZk2EaQnksOElbg0pb7w9PnM1mwit4EPwfegn3f0bjh5bXkIbRo2JBk3yaEHqs8Nf0ZM5veQolIb69kCWc8PbnYyRKavh91/6wnMy7EEe88Vu6QX3nGurz/Uc9a+f/Ye9MeSZIkTe8RUTVzj8jM6mtmdocXwAvg//81BAkuAXKXg52e7q6qzIxwM1UV4QcRVfOc6e39MrudH8qAQmfH4eFupofoK+/RGMuqFQ2CiVtBLMjIvQaoXgh7bK0VlbDrCqwg3ocGur4a+pHPCjO/sTtLwiZy7TOL9JrZd57/Lv5I8kp0kAawJyaVAyd/L+HO5xzQ7+AK7M/R8WRLhsQ6POsxCiIJkY/4/kzAiT3cQjEkkXsWtVqsmQKIl0UOmoQKtZcQ8EmMr2njamTz0R/gc40rTDmhJMEtrMVK1p6sWAvVWStcM0m4hYMOMMYj6q8q7C9OlUp9g/GIerXlnq0jLMLmSwWhxVf9bmVgOomBSrVXzDpWNkoSS7oAPrgPBSRUUmygRmsHkJnl5Q7uWB940XQ6GIwWCmBUUYRmxnZEg0pEUhGxAe8rcxRCWRSQXTyLakEKQwsDRRJbnLlTg2gimsc4jj+p3PJJB0El82h9o+G00Xn02BO7jlDxpiXoIgDkIyi5xgmC+EkRGKlUua6sIQjyRby/+Sjryl13sbVWTpW/S0Gfz+nfweUC6mU1pn3ZpMtTkxRshjZPBapdJCCTE/IcNRu4Ml6/3SQyv8qygR3N3rw/fuW/aY6JXq77pA66B+Gp5Xnhw3//ytswfv75Z34YJ7VkbuaYjZrrjw9lWYdWP7EBpRbOEaRF746WG6M3atr2+QDt1/jrue5ojsmayp34W3DrSVg6glhXTRdJ9IWNYoYdJ7UZR9rtlRLEBh+hCty2jaYCPQikrbSwjdVfhWNbKfQBMuJvTOLpOIWygRZFe+HuO7/aP/FT+300uwzqU6N91tQ1oHlGIawd42msZuOUq6jJak4FCTVyFsWnPXk2A4Vstsdr3XLd67shHnrtYrcl5ljjY60JRN5Xuqe4pJIp1VLrec5ewezveF2OOn/u+otIRrGcsBrd4C17FgMPmaqDlTz8Eb6y0YBhvYGbw6mx2T6XorPwM1Ocy06PuF1IFrEROT5BwbgbUoLlO7tyR+k5ANNGSFjsGVfhLG85AYnCozd8WgLpwDyl24ttprQtgbf7z9z+uw/c+gv6sfHzzz/z448nx7jj7rzYjduZE99Jq7uNMxnVgnL419iYxy0Z4x2n50aknJ7hqdwYZ9yLfd/xzRgOYp6ZTBbWJKrZALoGrnuqr1oqj3pMhNvtZXXGVZzXsl2HRsBovG0JeGFM0FFqZ/STs3zF9IGXwVFaSOiKZJd6MAZhN+ig1Z6ecaqKzJYEMxiBCXrmqC3c2UZsokMaLvPAHOPjkDOsjEqwE8V7Kqemx7NSPCR+IVuIMVstg4rHf44F+1//6jKAEZYUCOSkHuLLNmcIFImA+Mluj4UlN3HT8OeHK1eGcy1go1wLx5S7bvZUvIqtDUclPOVbjYJ6daZz9y6LQTEYNVkuei6vfn5l3MuN/+nlf+X2Y+enn37iyz+84e+pBGjhrVpO1rP6qK88WqecBUugyX1Q04KIYctXv5B+30XopvTeQyqe683OW76/yM9gKLZ/pHmhddi2F96HfRtIXEA8lH3N4BzGoCMSVit7qTglAWxnMjX3AhDMs1uL0X7cBm02zCe7AqFnnpmTPuiarHtiPrynfUXYcRhwZacdgHsqQSwUm8Bio7gpKh/jbybjOeZDsp+9IgsIL9jMMJkHo9JWI8Xw8DjGVwO4oJTFDhv0EmvYzGFDuNQd38lVxj0Ap3lQSbnwBOEgi8/1GXOuUGiJCBQfSw0BYBbrSsn7Nkq/CLwrQ8bWv1kNDdZBY3hbjYrAcOcmnQWTOU6lamVIzGNgFexFLiuaJsp5ZcgCQumDh/0JNnj9mw/85vVv+Md//Ecev/8jYwx+eH9lz72nDCEEuGNZ+YkI2xq/+xo3pQfZ4efzC5rgQa0VL7HXfKVSsvHzeP/M/X6nlMJjAS1J/DBj2+OznOeDfl57wxeP7I2dEXkbHhYQ5zjZyz3mszuP6aUtRvWRhxuFLT2Uk5VuqeaYPu2TdT4tb3TMhwBb96Ummg/V3Zf/v+EwLfjmYdnCGz3uf0UzI2OsZ/7M6H7Kk8kH+NFfmU4NxU8srYTx+2rCfMsr++teY1kJT6ZkvkevWIJkXlh77GSWIX19itKjAYRfiguvbzMZDHx7qr1mbhiMPH0OL8kCZp0oq99WEHtXYXAEfLqYw6wc0Js7RwkgI1hxRi3KLccUpgHSiXDm/mlm7DZthMESXCLXv1Yln6Pg/sYeL84jMdj/9u/+ntuflD/96U+8/8NP/NO/+xF3Zz+VZh20InJxemtmcVUXpEdY66yhdYOzhz9+5Ho9WQS9h/rvkU2J+yZoksDMYr6OEVk1IkLRG49HeKFLZqk86gkalsyo8mI71gTXwqBylsI2D0G9sr/cqLLxWQ/e3t4Yr5f9FhqqmQAPI4xXa3gExF7CynoRiRwuN6fYK3spGCc+ogHt+nUBe2qpxkCpFgC6P63Tz4zvlaGTe+EE87+n65ca8Jca8Jca8F//iqbsK5aKc5t5h8+gV/7v3MfcnbG1NZaY91KiKeUaNqzzJQzDM9h8Oq0MWLkP4mU19s4ENdQFy3V7nw2LfLVopHqEiZuDWtjyIMgEWMdtPatvLJNE0AKHOf01shs+1ReGd3788Uf6YWzbxsfxgvpO70a1igUnmC5GbwdwsOkrw6CUjX5ELoY8jGaDuhneA4hDvqBZxPTifLh/YN8rGOhwPu4wHUiGs+yBpc/86Gg0mxlVBR8Dcad5MOy3sa064lEnqHzhHR1jS8LWAEy/5r7+wNw4S8c7FHJfyrVxgtLmjmgL/EoMz1q0572+dC/5fFd2YH7fysI0Qn2b/9ZZu9yCKOGOEfZP0diK918w1GItqQy0BybSMj96SOV5mfprX84RaE0NslSfBDvb11qlgOa+ZdqzjtYVQK+WkKl7Nj80zjoXurlY9SOzvKV+Xe+hjAppvafMOt2pmWEozmUdqz2IBmKEWjPeYa23tS4CCM6xshkbe+ajbNnMb9vg86f47t/8tx85/Z2vX7/y6csPALzYC+QZUr2tz7oySXwPq0uRyEHPZz7Pg0VvS2GjWilJnKmcPLyirhyts20b5Rys3KFSKEtxPOjdqXXnxKkYkCoHJ3JkVTEeYQPoQSac5J9YLwUrQUKIy9i3BJp9Nj/ALUha3iWVV8K2xb59SKGUQM1Pf/AujS6dlqSJ9kSAwnemYnepcQ3gTFxQ6RQo2zpPFalUtpU9/7yCigimjedz00iC+bSz3XWnfoNA//WvYqnUTMt0S2Wncam3onlQ1xgTEXqVRX4bxdZa/Of8ygKljdxoS1VaTwJM/I4v689FAlzOLNGU8hpNqF5jX9z/1vn1h9/xa37H+z/8xE//14+YGfdWOc8TzTzkqFsKpvH5eg8Xk8fQZce/ywucb2u9D+Jo2LaaGcMl2JuA0LndbhRzvMffkq1y2z+s2lGGoCe81J1SCs1O0JOHPTj9CBWfpCXm6BiBLWhXbvZCLTu9nUhPy2X7kWnpupcXigRmLzYVUkeSbIQirxRr3MsLN7vz5csXto8V9lkvnTjhonG5soFYKoHZlr34tHNWueoS9R3zM3YnmWSXFyTzcUcPEm/0YOKMsJ0XGQqxjCSCqWb3pxaQsaE6x0L+kipwubdMks20gd5GBflPb1Z/scG0mKNZhE0/zOKXDUyonObGmg2pp7LzXKwEv3IM8Mt+R20tIro29qsDrUL67F6vKi7Z1fXVLY0JOb0QYwKS5XXP5tR1z2pK33seWq98KCAGd9rAiRRKHZQqlN99oN+cr59/YpMAPSIDKSZUJ7zvtcryGd2kQkrHsYFWoR9O550xKl7Sc1GVF4ucA1XlPIMldfpgSzaCqLNtEa7WuNi/m0nkLo3GcOM8T2xEMbh7QTNwUyk0m53PGbCc/u7qOB3JxtrwE5dOpdE4GQwMwzTCHt1KNu1kHXJP48kzUoCCC4vlVRDqmOBpFgYmDA3P2n1Am561WZgLGyRLsGZp+XymUc8MkWS6LtbnKOnjHKzP7+kqo6aN4xzvV/hvX+zTaw8IoCDyK2JzkCxWp9xx2hYpZwLo8f/n506gW+CqXMMiKBa+3KAGRLDk3MCmqcRc4DSblYr1itXZZXeMzusnRXTnw8dfcdt2/vB//5HWTl76zEwJNhsCDzHc31FT6nih1sphjV5CwWBi7LLjZjzGW9gBdYfthsmgWUfGHVWJkPkFzKZEtBmTIR33SJctZAAABZUamSvFOXvI3W+ajDcJFnc8l/RqBj7qDTPjJ5/y8ih2dPraS1o/+hkFJg40NBnz6jOPLA+weVi/eKv5flU50xP/zr5YDGWxGI+rI29bNPUt1ux4zH2xkNDwFJ8FQ7yPKDTj+V5h7T3BBy/bejvCQViA5VjJcfS9gXYQd8+zUJtWGkowWiCVJBPIlzmusygnG9v5uWIjh2FCn7FJzsUumWd812VX112WJcgM434u/CaoMRvscyzMxjp6LtuceUgF1mt9k2GSapDD+1I9HbVzu23c/+YHfDR++uknWhOmXVRxRcfMgpihxkRBD6ieeGY0OQXRjT76UsuqE1Jq95D48zEOHmenP96oLzeWZ7sIWkuAJhZMu26NIZ3BoI+w7uvm+DYC9JCTezIVD3e23CeOmdHyOPAtfPiPUtDmaecVdkcmQrOwYuh+xOFY5AIHqi2Adbg81RzX8/EEpYbsy4u4pD/4JhrkEODUI0A/earXBWbwieq+8gHXHmS2GF3iwaANJm4A6Or5x76TyyQL2qn4MWL/kU6Xq16btYhMFiFxcBERihTGDKZ/Yh4/oyiSNjNzSRv4agRXLxFYLJd1gAjYMjiIukPyFCVBV11NxSES2TH5szHnTty2ADoK1x7IzKoRugQYhdQ1ZuLjx/46VRdoIWp7WY1YMUc+wg/3T/zw8sJP//CH8PL3D/n7cWDftvSaTwu8e1O8DATDU0lXZYLMkrXRud4DAtIrWs701n5FN0EK6CagHpaf+b67O8WVcXY2jlDLy42RGSFy7vS0KytlozuoOqOnJUXp0bwT5SY7px2UJvSati8udKup0DtDmacBGagSmTV9AvAJ7stAtdN92nlUVMJCB+b+GOC3+P7khDDrfsUSxIxzxqyL99iqbHwDSHwP1y814C814C814L/+NZsws4eqmlkM3mNewKpP5j4VjOJtZV66pzXUVAG451ybKtkkn/i1phhOz3W6Gldm5pOycrLOFcFXDuPIPTKb4Z7j0mSNWwCXzqlzrjp7/umeSidXZ3iAbL4bn/7tRx7lnfOfUoVkdywtpIpHvScqK59DpUaNRZzT1TT2JzGO9sDRsEZtnaZKbFp5AAAgAElEQVSdIlNFfufsFuznJP4cVlaGxSaXTWcJbA+zB5Y2hW2cOU+FwtzfwvJMRfFYJGO/nM1utajtJe9fj+rVCzzOA9k7x9aWKnwqA2aWuFg0GcKaueLeAGXLcd9Dfou5xfzOxkmd4Jrs0Zw3Y4hgSW6Z79/N1xptCKapokliRLVjudk4BamzCZrP2vxJDfV9XKGw9Xw+OUfkeKqeb8w9TNee8QToS1vN/UUWt+3af9ALOzKLfE2bqguJ+rkQpCbPWhnB0w53M2PauIpFo8bwS3EvskhKvggWg8LMRmUR7preQVPxlKrGL2rcPrwwRuPxZaQ64VzzO9CxnOtjkusDs4slpK5YCKyQOuR1Vmh6YjYVIA3qDUW568boD7DbynAq/SJcLaclj6yzMQbCSSlJjprPYICNtMDFLuXprIvlYqOYPFtNxxXikiTi45HLzsBssJUNp9PTVtLkEdZ40hnSA0tVQWVP+7eGaUnILs6SLuT8EFxPTIKYsbIlLc4GszcynY5CSQqmx+WK5cqQSV4rFK0UUzxFC9/LpRlfMokrOucVXOdVSjawSRweRN7juUuepyRFA/M8Jp0+M3Sci8w/nrKlFzbSJ09uZUvH2ariZtkIzPXZE+fejP4aY3z/7cbr1w98/vwZ+ymytkQLGotEkGp6qIZk7DGvu9Nr4N5v/hnNOVCrhmC0F8oUQgzDeziaiA68hWsD3cISrhW0NqpW+rDVxPQB27ahnGCdsx+JYcwxGuNDGEkkifViDF/18DCneKGqIhrZZjocVYca445R8JLN0iTpmRm1pIJzQB+PzA/VpXichBezjliS4opw9sATIscRTLZFYFAO1Kblfjxqt3fcb6gWSlFGC7xl1jhmiid5TLQtolr2gjE/1/pXpQauD8vy3oqsZjAulJkPnfXHWaDYf7qN9Je9WFJqeHndkwUm6+QTvrITMUm/4LlRumPFLsaTT5uLSpme2/7UYVsHnyfQx+fiJmGXll+z9Rba+vkp/1LTtXG4DFag59xXPJhs0SAJdtYcmKUUyjCM8D7FhSMHZa1G/eFO/eGd3oKdeeOFI/MVCiX8Z8cDt2B/I8bR30OGpzcM5xzvDBWKFYoUysgwWr+AOZHCeQhalTPvU9XC3tNSQ+cAstW4c3fs/cDOk9MPzgPGrXMv9/j7dFzz97Op1/cSGVJjgHRuI+61M+KGbQWaIKZhN6Fz5MeDELVLTeV7LCpZBM8n2XOTH1LWGlgsipEhhTKyQ89OnftCjuA2GXUiAcgtz+/YoIfWq4j3gubfKn4dzs/vSxlLIT7zCo2NXilixlTDhrXSc/M0wO/V7fZ35mIpRAO2aSxgc5PyPBDPBaD4BYpbMjxi40jAGCAZqU5blgWsBuzFaFQJFkBc8VAfPtiLs38sfKi/wprx5csX+k9Ca41yDO4JhIzxE3YGK3XHqVR8ynYT9PYa86K1xrBg7dBio9j3O2YtF/RYoEuuPe7EnB8BINQujHoFv8YBroCc1DLtZjKYVBQTCdJa9i0RuMkLpRTeaQhhzeUutNY5DyPPi5mhEA9Uci5omDVFcZ72KwgryDbucioPnwq7W1prIidl7MlOnd/flvc4ctKTYa7M7LW62PzFMjPFWWNmKGtdVi1rDpVsls81NtbQtOGQi2WG76g/KTS+g8stCAWSjIuyLERPLFmIVzB82AFNkHaO4chrmYBUvrBoHkLjvs0GUFnPQpmsuDLnqsVzh1Rw5GXlyuqb2XTP67e7rDEgI6xh91KDyUMedufPS7AwFbmUIQJHafCq/PD3v+LcGu/HO5qFwTuNWzaIWj5Ta8rubTGv/Qx2uKOYpo/9XCuK0DNY+uEbe4agz+DyHWdop7VGLXc+vsS4bDaiEXQafRhjGP08af6eYdSFbo29lkUuoEHTC+SBIIv0Y7BZrA2huhC0jiiMPWwYhsWerhkWO5s2JY608SysL4XOZAkFOFeSQVmelGvzAdoCXVWclgzzC7M60ks5DrLfZAoB1R7LFgJXTg37OZtKqq3yPVnkVYJNtWVtFazg+M41v/5lQyy8nudIv4DwdeB/Ul+HvUX+vdU0GJhPEkvNGvCak+5pc0UcE/SfvYfqAllXtKU08sislMI24kCuGhll8xnNOdvFsXGxPCdQ33UW6G2p44yazWhZXzu9gzjlXvj4mw98+pu/4/zDH9AejMoPegOeLLuATQt1c3oeukfv39ZSolRkNYh7jmmvg70G292sY3vFZaD2DlLoZQLvsNmdkXt4F0WG8GHbsEdhHAOtJ3UPBnlRC/W8Vbq+UcvcI2KP2WqEwwfhbAIB1yMXalpFvWGZGxcWEGHRtaHJehfaBAMlgfO8rxDrpyQAIt6eiGpRj3qCoZA2IRZqwHNavaFg3xe48EsN+EsN+EsN+F/iMoTbRVTIc+4IKHMBbGscWDT4KGGhFE2hcu3BmTMza4Y5H/85Z9fwVGYGEjAZxMJTIHteUefl+ythzVot8iUdD7tGbpFrNNcHjcY+CTSOBL6jKTL3oXzNbeCvG69/+4m7hOvK4RvVKvOoryv3KEFFtaVqGN7CXtMtnjtQdGAeGEcdocYTN8S+xhl/tCQrCMdtAw/ygokHsVavRmrvJ0Oj8Su9MxLM6lmDqQ0K8bu62cVmz9pglJYWrxDpWGVZ5okIxwjHk7B/aQtfksygmrZbkwQsPrUv+ZoGo04A90Atm4BZc+KxzzIbxAnwrlowHthag3suDFP1NLivc0K0w2NvKsu+WlaEw/dyySSNONEoMMMmgQTYrYdFJ7JIPG4VkgyD78hqhmckgqQlMJeNFrBY9MAiBvrTmlhSvaZeIEl4ok+qlkmIH7fVXIysn4Rd06LPXRZOaEk8ANb7jIZmqMvOapSboJ82zsfgON6Q+mvuPRu0FgB0OPbMeWTInGfiuWdERuKwUOFPpx7pIyxRVVEce39n3/elNi31jd0S4Bdf43+qWqfVIMBZ+srt8RFkjQ0J8sEkaslVD4USoyPLLs2fMtDk6eeyWWahyFLVsI4Wy30u9vWmJyfvePHIbJ/ZcRLqK1Ol5ZxSgsxfvET9DJjfA590Xc+v51lKVan9Us7NcREEsDyriSLjnvXi5WRh8s9X7b/uZRiUx2qwTAvNIOtMPGJi3qm6ZBJMsjGrFey2cPQg77EIq+aVOrMnc/wHt8/ztS5Hq5rzshUQG+isXRLznT9X7FIZ7i87v/v7F/SufPGfeHxtlDfjhZesO8izAHQ56KPTHby9U7PJLx55mHvL9fsxqOU1cpr15LVsnO1EdFC90oag4zUttQd1bAzvOI1hI4lKg/M8kGFIkjy7H/SaRCzfI6PXBlWjBdceHdtmwzjwodvmoJ2ylYUddBvUtLlv8uDGhuqOa6ecytYr3jxiFw5Dy46oorUswurcvw8UZEdFI0ZgZtGuuo2ne1/DWhbmlh/xUB6N5eHhOhF7TPxO9bGIoOqFupqF8bUmsl5s4OvrK6upwyj7WlvmuFwzyacbw5+//jO72OxgXp3ReNE//2tdxoXqS44qtzXAsPv6dpp9A77yCaaEXKU/ZROEJ2lsIsn0GIpno8FkLMuA2cFOkm1MVh9hk8Z10wBcg4c3PKtoFFSjJtGLzYLuuD2iGNoGYsb9Nx8RU37++WceZ+MjOcEtu+kmeDekKkOie2lU8DO8wesORTmbcX/9QBsHm27IYzaXZPnE6vCVMcW2pUWPIDVBhn5iEuGAxhtvFqF6vaW1gcDYjFu50fXGNu1SSjIHTBcLYii4nykNjK+3swSTzUOiqakmMp1WdgNL+EWJw43Dkj4Xjayl1UjMMWQSGRsFD+kTV0bVN5fXp8bgWN7a0+jAaYhMwFfY0zpR8rA10t7xe7sCCr8O/ZCHuadQ4GWRk98PRmss9oWNPjeRyd4Vo/SrmyY2D5z5ih4F3/xbsTZdLFV9OlBW4hAei1yucgmkKxmrtUDt6b2r2G4MH/Sb8el//Bvq+wfsH0Na/tO//wOkXHZvAZRHpkWj9U4f172oCqSkXHTgplAr48yxPoTRHawhJWSraNhr4TB4ZVhBrPLuvgoiK45KQW5gfYfi1GKYRCEWigdNNkK8163soI+4N7bhFjY1pze8eNq4TLsxx1de2AUckG7FXtK2zf1a7/InYv3Jwwwl2XUOwyjVce9o4WqGJyPF9fLs1eyXmAglC494X/EMyyzY7byY4GZPXvUk+9YDrjOLUPCpDJhWY36uZ/W9XL28I9yegj/nfrVTfDL+z5xXCUYmaLbsWd2YmXzTf9p9rO+Lc923uX16RZJB3dPTPpod2bTQaTNGDIgsBC8W1hooQDRf8p8AbChdrgPrVBL3PFBLYRWZrVjM1wIHzu3vPnH83Dh+jLVCh8Rr4ZkJ4agLfVj4IUfbHvMaoO0Ab3U1nx59IBZqCxsHPi0mtg3RUCMVHzhGt5Mjf7e5cvSDPk7sjLnWWliRlVJw1zw07SuEHs5gsOZVSuHsB2ZKd6iibNsNM0KxIoJpHFr6SHA+D1ol7SW69JgfZqEeys2hSyhzNe9vkXjKM3tnZri4tgXwFyQk5w5Lai6FGTz8XDtd7DpLdl3sXZaqZUtbJsTo/7my7L/yVa8ex2pkIhewKFz2QfMaEs2HvDmrQVim5Z6eF5OezrWrj1kWLjWUqq3CeSrtCj2ZobHeLvwu68qh0ahzPObhYuhno6hKklEk657rvcfcVGrWYKM8ZWXIZMl5quSnXuJbIMSGY8UZ3jjlxt/+m7/LA80Z6oyHsOst2euxN0WobKOODFWfbDy92N0TYIwG0JZB62EbXWqlqHHjY2YEOAzY/IGQewUPWnqan2n9VdtAkvAjTZb6febf0MfaP7XoAjfCO9DCXsUfqVqaZ4VrTXNquLa4rKBzkMiIUY2Xyfse9X68xjaywahxHghw8dtGYjgQ2Bo/RabyyVFPpRdOTaDoe7p+qQF/qQF/qQH/dS8jlFmtTmXCZHefCxN4XuxXDeiTmx/5CDNDeqotuowgHuVCY2ttm/esJUBEKrsnafLbzIIgE9Rl3zyxi8hqyhqG27+4r8P9iZB0Loua52Y7lTzzd44ddKvcdafdOo//7zM3+XXUPXRqWnfBWOv28PdUJd0Qa6HIO4IAJE2CpGVK6z3sq4CtKH04SGREqSrt3Ik6NhQipUrUtFkDPTz3Thu4Rx3eWkMmcN6NWwKopW+UOu9RjmsKlwFvNuUcfATGI90YNeRShQ49lTV1i887762DcYFns3m4IWifdsU3JNdY9Q2GxV8Wi3rRLbGkizUOQXKeDS+WNVjmvGaoO0SNYwsAnNmxV07dd3FpAS/4bJbSQHLkL6L2QCSb6ExiRL2yRZ+aDJIOE0o0/6MpcdW8Ot15svEX8+RqiCxAnB75njjDLXJ8SOIEgQFN54dQV+d5KVUZeDSGhCz8Zw3nnvNImbZ81pW3m2LbnR+K8vX3D0Y7aUnc2+hIFpKXuqDPUyam41Ik2h73LCSN1xnTthjHblA2ejeoUbd6Zyny453G61kqNL0/oqkKyHBInLDbBNRlLVptqp2nsleVPTOY3MF8YBI1/bItBEo2iHwkqV3IiBTLQ9OBm4UrlXTG6JHLK8ZRRtbZDtIzYiNUYz5X0WzQVoXo28X5yuNNhbWkK5un7RswJp7IHu4cOs/JATpPAoQnaf97ulw7uD6t4enuQGU6RlyYqTOB0EFfjQAFTB/g0RxwPBp6y2GsLwvOtXdxKX2DUBn3+NC5/0STN2yQH1jO0VnbF5TSw2XA6jv1N8qnlzv3V6X+KPz0H77QPwfuKrbhzL3Y6PmfA60HaUIs8yBzrJnVsLYDig3eexBJe3sgZ2f0wpbniG3bOPVzzKEt1xdm/m7Yp09MuklFttcg7mXDfJjDsuwLS2QALyeiSi03ankFL3QR9mzmBGZk/FBfcQwbwAljL6gUfrv/GjD+qT2QUaL3sNlybrNpO+eREx3rF6s2ryOyjFtp1L4zgaPpHLcIL2mtvlSeszAh9ieRyNcMgkQ+WC4nkCJCm5/ZI14Iou8C5Bpwka/Hk8obwIos27w/d/1FJCO6wra62GLbxdBYcurOpNzZUzhhzVW2iIbU2Z0yD/le8Z4dtCJcHYQEq3xf7MU4KEQR2Ffgdlvs8c2DyTBtTeKDPzWSpFD9CQhcDJPJRB2Qxd42bDV40LQT6Ib7BlLwGoff+99VPv1m5/5FGX+EP/yf4a//cobf7s12hmq0XRx2KxzHwc8JiFSrlDxkvX3tvGiljZOv4/Nq3s33uWlhK3PhnX7iWxx4gLoZVaGMCEk8vfF2vNGPPNacg6122v2O6vtip1avWTi2BRp17bid0QHOou69BUBqZmAbo4RNQpsNntGXKiDsfbJLTvyO9TNqT7Po1M+OvBZclNLvtAsRjgnnvgCtzfu6Jy7bBRTPMfpUGAQeGn6jo0w/4/2Jfv59XGJxQF8Tt4bn/CZgWcQJJ3iwO0kbg1EGM1uEcUdnwbdknSfXJ73mwNyM1X0tbCqXd7TO+ykB7YSViQABAMzCIKSWfW0WC7ToE53fwxoAOLaTpg+4CS8fX3nhlduvlfa58/b2xtc/HozPbwGsnW9x8Gmhmqu1UtuGHDlvy+B2u7GxIaNSGNzyEN5dGH5PNUOAY+rO3j8zakWHcqsfMC9sWoOxRA0s4uUEhOqFfRTMysouqzVz4US+OQTMr9185+W8RxZNdYZOa6VzgfHzENFMUUkLp2xehD3DuYCC2fzesmAU2xbQg1ROJ9ke8aK75kYneTDK4tKy8V5GWAmFyi+3I7nWFXFfxbdLXeutaMzvaqBZ1M8w4FiM7+seDL1sVb6HKxiAI5sFF/sMD2AmGvdwMRXnXrCvw2AUp32BeO6wWRQUADIK51QuzHXJw2ZVRbjZBYC2tG94BgE8Lbgk2Voigo3cW4F7k7XejSyW30xyL0m2eUqWd4LUEH79aSEllb5NVUTDK/zwv/wW/48Hv//97zms8TEt5CYTXi2K12ED8bcYNYejvMbrDF3Fuehg3+6Mc7ATPwMgR4k56sG0ityGxuGeGUuZMWTK0YzjODi8UXSDDneTmPflzltaDKncuc9ChwAfAawL3RrUSmuF3gUb77Ee3DujOlIK4rfwOyfqBAGKl7DQswgznYwiydyFyAWKA+BmLNBo+hyLbHiOexk7e41mwBpLXM3ELrJsDq9cLafpBGPvecgIhrv5ZFV+P/Nqs1dMT3yRfxLIpi6v/Yr+S0BMnhiFamn0wGJWFtcrUwJbhJ6VtYTwSO/tULTFgVHyb/pIluViQU77KQI4GtO2Tyhy2VWqzHXdVhHtHkHOMHFAwbSuIFmTYFxGBpJFJocrNd/rZN/GM03rI/FVdpzd+c3f/47yYeOfxj9xnicvtw1J28X5gzG+Cp0zsx/i9/dke1sGZ7y83ti2jUfLfXG7xpyIoGkvMS03nNvKGX1Y/N0xQvFXSuGtvVO1oKIUCp/bFzY2dESN+Hq7o+xIKbiORX66148Uf0O+vOFbwVF6nXsFzEZ68Q1d/j+srNZzbqlbDaahgI5tnQdKMo2bt6h7ZAKC3+aIhnrsmeH8iD2xa9inqbCPpyb/d3D9UgP+UgP+UgP+61/OTi/TTikHoghOQebZOkFX4LKqg5VFAT0s8/xSm29sFz4hdtVoC6eI+i0ALqJJLkSjIEHjoWeCso8kWjhlZsjowLKGqPSlOJzvUyOCBgj145Z2qa3MfUOo3RkW70lmHsoPhY+/+VvG+Efe/tR5PB58ZLA/5/iZUdmC7T9i/dx1i89mFeuG7K+MEdkYLhunhZqudUWSKDEtgurY2UyX3f8+MydX7nYAp6pKd1u2/tLjf1/vL5x7vL7W/o2zi7tTj8LGpezrJSyAvpQHhtH3ghE2lr0K1e8IWTMCpnP/y8ZfzjedTgMOVQ8WKdZjvJ8la3c7lirDPcYWAkKswZtMA7QAi1fjKIdjx6lLlXxewLHP96QwnjCRv/KlXoJwlvNJUyEE4GUqRAybwfPZQFGg2MtqKkj4i69M8DgA9Www2DqH6biUYFbP1fibNUS1aavnaK4/boU+czItMKghQNbtNoytRB53YLAaNVaOyef6YCipWkxlvYHdOkUOMKPXjV9/+sTn//1HPvTMgO2v7DkOpjtS877OD3HEihqyy9ccy4Dui2RXObKPINxG3EM5wwlJnAt8rpVbDXLRaJ9j/9zq4ny5FcbwpepTDcJdTaKjboPDBhjLOan7Tn1SI3d/xDMoQXwTNsxC9aFakaJoKVgq1MoWDYjeDd8abRd6EawMmjVOH/QcM3HOTCI4t6g7PVWjTuTbMBtF0WSMPWlgkq4WOT9mhq5LkNvngl36JHukrLjryqH8bi6PBuxsFordsllekDJrvGjuAjDHmp4MiTw0sxMlagubdQAwnkD/6VSycoQ9/4YIqo9cu+Ao6RwwYgxrDQt7y7Pz8xyZKkPbCz+OE38Vbi+/5nd//2u2D//E2+9Pvn79Sv/yBf8a7+nWHJc4uzFJmF6RPgkvGRFjoYY1MwZO3Uuogab6p0El6r1qjZ5nPn942CgXY+i04VaK30Ihpc7tOPHdOSxcWs7zxNiy+eyo93RUqRSNDCczo1jBfcM/kY2nrFG3LY6mbjgbL48Y13ctfLI7P/38mV4bdd95DFlM05Z7I3Je5EpzSGHElu+/emX1pVE0x/Vg4lWZCYVkZmvWfvk5qguehLPOmTiFrzOGG+ica2JrXyPtJA3Qcc9z5FPDuVxzqckb/6nrLzaYpuet5mauhFy8U5KdynWiB5hhjm6rMBOLDd3xlWNRxlh+sxcMwTc2J8bMebi+Nrt3+gTiQchoJTvU8W426mqAXezTqVpSrs3eAc3G2bQcCbucYEH43nKgD2ra01Hf+GzO+Ki86MbX/1h5f3+nZqdWTzDfEXN2F9rIoLtsepxeKD2UQhyFI8OW3Z2SzKDJJrNygzYfatzjx+PBqWdaQxS4d8wU88Hj8aC1g9Y2juPgw17pI5gMpdy4pYQQssiqZR2ItA0aB4PO0cYCKQo7Ko7yYJ0jF3PgtsCzR4Vq52qiTdsURiyCc/GLDxiMp1F6dOGXZU4DPCwBRKIxtQJQ7kyO/dxsCx3PAtAEeiqrpg//GA92bnxXl/Rkkl5MQVQxP7PXHpdLsDvnJFXv65A79Ct7WjrIKmD7GtfhEz7Z89P2B0hW8hhbBt7JU7Za3MM4WA2KTlA0fDnNg2mDRHZAX43hXDTlLfypIQLpthgLIwvGT//Dv6V8jY3n/OT8P//H/xtA+RYL/UbmbbRO6cq2TVBKsWYMTqoFlK4jMmBKKXhyccUNl4a50NsHuhn7Xrn7dVBDK0YYIZWeYeGi0eXHqJpFqMGS9PuVDbJRERU+1J06lPPs6F04wguIaq+AMuqgjsk8icZ0hD5H00IMjgQRxXwBq/s6V7QFFB0AcuLq1J6sbm+UbNx3L9QF6tUMrG0MyzH29Fwn+1T8BkxQqj8xWfMQ7v2KJXFWQ1msBRCmBc9n/b1ciuS6EUDI+sxlMr9het67O/XJcnWuF/AEGkxAoSjLE1ltMW3m92XEeh9spEuZscgkeMxxWKAvTPZQ7q+5nh7qazt1jiBt6Mu8+2HXlYymkSQJJeyKIi9GsHytyfKUW2H7tfJiG6c3vpwnUoTbtF+QhvlJ9466ZQPGwnbCLNRCWVzuXng/HpgZhwhbjWZQrTvjPPjgr8uWR3F6emm3LKPsNI4+MsDTQD3t9kB659VTyWMDGw4ajSfVmRHyHoCaFIYNznNj27YFGNQT9J4/Oga2ZzaMTp2JIKXi3mnlZMsD4NQUmSfhJddDscmmlGQMDnrLPVpPPAHgMZWzDpe9jjMyVFQyuBqTAHZ9gnYBhFWPezLVKt/LJR5r/VTjaVojjGgn5Ge77EkWC/5ZjWwx7+LrjwQR7syP2YVlCeNzfbI4jMTlF4iWFr6z2RpARHlSFZJNCaHke6geKniAMf2ocy9bweH6mvWmz7ccAgQJZb6l3/y0VzGxdfC7LK1kuVc5xt5yf6nAtnH/9ImXT2/0zwPvAyxhqJUNkFZUpaMql3V0CSV4KYVqL9xusW593HYUBfM49E/g2OYanwcPrbgFyBAWYp5s3w4S1iwuN1AJdqQJZsLurxQKfkZTzbvjVdiS/d5ao/cOKEWCNapc+apRV4Ca4ZOBLILkvjGtisRtHXKsXHlenv7gQ20x/TdTxF5y3MymiCF+Pf8afTjwPdTzyLdM/+/h+qUG/KUG/KUG/Fe/hjSwutj883KvC3wULwzJ/SM/s3iN9USg+omlGm0q+65aDr5RlyxHjkSigc2iPgEWuXWIYDWtuUaupzgzt0b8yuLoVGzm8jCJC5c9vAiMvV8NMIl5aZpJUR7WyZN0233w8rtfM+zkIQ8OM2jZDLGeZKOobSDKzx2h9x7B5bXw3k+mhaRYpZSYGz46U9A6qtLHSa0HXxNA2wzslg1zi8Zt3L8JnHXGaVgbmMVn+nwevBRj043SDrb6EmqokkCZK6ZJiNKx1jP1hhDEKsl8zWqDVj3t/ZKcatkw9KjbB1HDFu0Jyo8k+3iSwGZGyhxAV9PINFTo8dyjtigoW1rkvQsL2F2qJvVVB3lUpPF7c4/yiBP4Xi4XRWRc8nVNgpy/rffuVp5ICgF+X+co2KxiZSrB8ssOMv15JNYVAaxcSqmZvTiwiH4TWc03SwJErGlgMx8kSUhqMc8BvBrnWgACb7o9NVm7OHvO6wneqveFCVYHZSAS+TEiwvbR6V971o1bKGyBwclsM6+yI2uhsEDlgkzdkoxXIitUhI3KoRU3j4y0RjTHZGa9GNqN1g/AqFIZ7UwiYDpmeKxlfQBmjNFwfyR4vq3cnpnvXnpHyozPYNkhHqIoQinOa5K5zYxa514TGTHWBrrPZnvm3pmFlSTGPi5C15CdMvIe570qFva+qgqDtG7NHqRI7EX5fDplWbxJEgirbWmNGyp3qxWHxhIAACAASURBVN9C2zLq5Ur1nVxDQbCoK8xzvDtou6g7Wpb7xVTojUl2FUnMYVr/hnUkXmOwzb+DJxEv9xQvYZmrQndlZqVJ4vfFdGH5s8kaZ+j43637Iq4YN8yjwXCmu4P+9s7HXZGvA77c+NO//5kxBofFmrq70ofmXhWZQWZG8UeercJ+ONDdB2aDImWdrQr3sI50RaVgR5BY3Qc0Z5TAHmotlJJuYCKYdzT3olured4umMQ5sLqjpcb67I2iwl4rYsZt39ir8Pphj8ZS1lJ9iVeiEa/pz1xH/IcM2ntYQNqdZTkd1naGOauBJAgjzzFVsgbFWS4H3VZzfkuF4lAiK8uhlLHGiMg8qwJMhwxd590x1xIr1HGszzDP4SV7Fr1eGXYDR3Qqy3Ktlc5iQv6Z6y82mJZ/cBKxlFDokLLgGOBXgVmmZYjDkpvSqP8sh4CUgMfGEKK5uCbL1Cj+FSR6K0t1tHTplenTrh4bevzF+H71pxuAofmzLZkqA8WnNywZOA3sU6InsI3ZqNjYkm12btGI8S7cyjuDwX678av/5lf4j875+2NN0BLOORyrkRVhy6pKe7xRbIaQfWTooPeODXjZb/m+UrbXOyZhP6JWue0fGGNwcjJscC872koesjrHcdB7p58wWuedd/Z9cNqDXRuDFzbbVvNwM0AaqDLUGFlkmp/03mn1pMuRm/zlHT0LrCa2PIbh5EwWBwnOFH/yxpWruCjTBmR6YUKCSGF9g7MYYSuYzJxlRD3HXRmrg6h0RloTjLRfwYX+56z3/oqXeYmieNxBdDVDD9vweknBq5a07JhsDMFlMuLrAq2vDAxd+TAmtpio0+9TRDO81udPA6y8qpKWF+6eQau5oWdDd6Mw2ZegbAtgy7wT81D5SYSqa0t2Xk3mjRTswwtahA+78duvLzweD95/PBilMRy2tH648cBavs9i9CE4OyoFd+Hhyr1osGxtIEU5e6OWAHJPH1RCoP5uJx/3AMw1V4tgnmVxZcaQKWfPpvpwXAuiGlZps0mpHS2Fwh2xwl7uFDrbyM+aa62OQUvWeXUDPxMkDyDw2eqn4nQuYA34pkjzXdEW+WZzgVfPeMbJPkmLNhWNBoeV9XxdJf3lDRueVlwHuZgjtj/Zo8zi/boXUaPHv/uIMdCGsdd/mb3yV700vOvLmGHBEzyxaAaQntUem/kEvcPJJu3wJlA+q1vCk1j9UkmuDIL1d5V9evk/rXFkEeJeV+5Ol7RDmNwsB5e+wOTq0HK/Gvl68kTDmN688bPTriufeapmp2/3phOgdbYPd17kzp0X/vD+xzzcxv5e3gd9BOtfrNMmw7f3sOqSnU4weXrZEavx9WLckzX4mgDi5/HOPZtRrZypVDYk97AxlJ7ZMq06QyLM+SaaRWChpr2d+mCMGU6eLaD5zNzZRDjGO0Ma1WJe9j1rEjeErwyPOTF9/ovWULewpTItrpkNtB6yBDBTtedjFZBgt8+DtKBYgnkhQ49iT2dwLgVfh94LPJqZgu4tGgSA2I66IxbKqe/mWoyoyMCJdSXWUPOpLguVXtgr5P70zDpOJpknaAOkL3autbD2MJ/WyO4rdHla0LAaSoSn9Zxzvq/8zfgF58U9qG7EgXbLhtTME2syINfKYHEeiEBlAraKSw+2ml/sWZtoiAkjQcjNCv/87FpdFqBiopz1pHnj428+cNiD8f6gzvBvkbDWc8e8LXBLRNICT6G/JlO0suuevzPHYaGjyQSFuYafMxS6FHR6hjv4FvNK9YnMVAL4qF4we2GMisWU5P0MgpWos2097KJU2Uz4uN35PH6PSCgZh0vsd0BNpYxwYlMRICyFy7R7jnrDV9NiNiu6pmpJDGYD0itapkIjD9xqFwHA3/MeZFg2AC//4vn8ta9fasBfasBfasB//cvZMTVKNm7qVJdm3tb8GaFn7TXVkE5JS02RsvIsFqNXlPu4iIqaaphWLzLPKgtFKDPrYCqR9KRboqayrdzhq5I4vrGQGuOythSCBDSYWEio2OZWFGB6HpoxdESWmTsLdL19ghd/xW8DrYXz7ad43z3AyQ7oOUkbxiMbcIN3Ntmop6aVqzPkQc05rhRu2SyZKu73vrGN2HeoThmBacjYCLZJBet4Asqtf2XYoLfIJ6ScjBoN3V4u9wBrua/IwD1/1qZ1ZADU7pGz2EsSm0SZAMEk+8BLWKu5M+xYNYmnMsfl5Mo54wJrp91xKfSsTcwqZENiNnAvylKod+crTbU6EtZYAlnX5j42ayOR9bXv4RKrocrxSYZ4i/0hFtH1M9PCzZjWgNNmUpZt19w3gFQ9XQSCuggjsf8FBabNcmsRiqYSJRxxZlNnLDK6Wiihhnyrrhx2JGZ5ORrdMq9xdZ+JpBMAeyLKI8axxVr8YQyGGZ/+zSeO3vj8+TOFTpn2zRMjU+WYtqls1JztI/dX9UHvLZUYfVnWnfXgpcf8OnsoEdA7Jc8r/RyUXIrKbASXbdWjMgp9kgTzvZg5pMr59BORIM6LbGlRXjn7QCSa3/tSdoU7Q5EP2NyfJAmb7gswb8XClhynyYPuRvewGXSZYz7q1t3zzC3Crd9iDcCo2eA1qXGOwKn5mToB1kP8bZPpNrJl062sZ6hWF8lzTPWOgj2fEb6HyxzTBEonqQqAjuS5sVhfWOs8QwbxfzZWLWoWt6VAdmE100UcKw0jSAgiwiZxZgtV9oW+zwbceCa8WYkpLrKWQZN0lRIwDkYO+KonmLG9GPX2gnwQ7r+pjDH48uULrkI7T47SKYkD6Ij/XBzvqWaUiude3PNrvYNLDWtkP6DEGHj4C7uEOi5cKASzHqbr5tTXO4hn1l7UhWaz2alsh3H3LTO6QPdwi6jEWevT/QOlFO73O6VKOHiI4XZb93pP8ulQTVtNkHKn3AblvFH6V0o3qm3XOWXtKYPi0748InhCMTidukZEAnnUbGLPhJbE4+cckb7OWbehoIprkjEwvFiQ2FLZGHbAnZquGyPJEFH37PEsTJZTSTiV5c9OcMy3hcn8uesvN5hcwetqEPQ80LoEc9VJyZvPDSW7XU8TWVRp+WHmYUW1h8w/7/FigzxJhVc3+qnBpKscK5C5R0PPxW6c5bGb0+pjgYsjvbWHZ3i5R8RwdB2Jol2EPt/fU05CsWA+BJs2/OIja8qgwmHv3H6983L/wMbO58+fecjg/kjgKbuzAa41ekqADOgGX+wrd16C2dAFzUNCqY5T6CaopbeobiusXm1ndOHhhlWD3ija6Ga8PR60FmBpHwfjCHDCtg49mkekDZH4S4QT9h52DTUOIK0def/HsihsJAtPZDFO1Y/VQOxaqVOaqZOf9WQj5ZbZCXEgLKUw7G0Om8j8yCJEc4dQuYLLTIMh7rCyP0R0MVbmgUyECN+EtOz7foo1IJk7G7byHKJodX2/GrESSgnDM9NFMrPlmoMtmUSXw6CymrSuGQroyx/fGAEUzp+d7Lp10LUoHCQyRy7wQrJYz0JM4vfXfItgGszOxV41wHPjKT3sDs5hmL6hr6Avxm//t9/x5csXXv74zpcvX/j6H07alyNtP16wEWOlnMkaGEqT+JoVRw2KFEQK4sbmwjktHuXEygh2GnfE7ohVzAdBDtClnhhhJhvM4VzPBhoZAMkwkZIy5jqtZgKcGRb2Tkc2j88sjk2NrYdVi5lyq8FIqFN9OSpMG0c1ap+Hu3y+hErE3NBe855fjImhAhlgPHPJwl99Hkrl8r1mA2lBNFigaoyHUBM8uFbPPHjJjGuN51tIcDgP1MW2aIB8T5c3pm83Hs2aYDSdaILh9lw8ZUFf82A+i+fOVCnEywbMlkCcsfaxeYWCIQFyAZ8HlAmk4qtBUpiZMFwZJxaKggnqmXlaxMUeEge2i7Dhcwx5FOEil1VRN1sZDWOupZvzLiddnHvZ+W35DX/4wx9oPz1yzBjFQ/GjZiFsQOi94WaM0vAE+t57oWqqcqQwjrA4eqhwqze2sS8GYKHiOmuDOOQ0eTCSHXUTAckmARV3GKPTdfqDV3ofmOmyARtulHLDzRm98+I3QOmbMYZTmrH3ZJ/XgmbKqM3QTAHSsjUOhEl+mQ2+EUCUIKGyzrV1kAAqek0Vq7mXxhwMcMGYdoLFjL7yTmaNE000EYn3MudQMp+MYIJ9L1eXyH6YobELA5BrFkSLM5qlNptn+TVPTM2XVcgE7C7gKP5OAnolC9xZ6+X8UMlmrE+g3bDp22+GDF91onvuablWFjP6PpthsxaIhsrwgdCpcluNDtFokvRJqAKQq550n1loc1+OoNkJDq5r+mVLpZWwkt4/FMpX6H4QC3LYw5hpZp1cdfRW4/C9y0e27Z6sW658zpm7Y8LLKMFkVV0qsJJ1eFFJSwOlYqEmqRL5nWYrc1QsrMJ8nJx+sH24no9KBz/ZpYaqz33NqW7O+3mwbRvFG/MQYrzlMw+rOjPP9XFmuASQJjrykOxXpoA/by5PE5ELKJCZZTPHCXzDxJ/rn+R54nu6fqkBf6kBf6kB/wtcEvtxScWwSlq1SVtqIJd2ZTxL7C2RK2O5d9nV7HnKH+g61U6+1pOlMBJjqqFCZJs2X4lDnKbrbw41rEwLmgk625VP6HWdbyeSIjguE9ZRJvStWeO6Gyo7pQTxYIwzG0TxfItt7K/KbdvZEH7+fYC5H+QOONI9QF2L/f4l6zaVAAhNCsZg33coJzffV27g2yPB0ATFmh3ofgMzzsfgbY/a+kMVaB28cas3FGcbB9oG5+PB+2i01tjuN+QR+RrbttFGYiJJiLCiGWtUMAvVUjTeg5gSFqBf8/7FWjHMGDlvqoRqxmyki8BjKbRzY18EGSRIE+t7EI48vebeEiiHpopgkmhOmTVlX1jWVJvNtTOe347N5v8EwwfYkjN9B5dEVso0ESCVRnUMZkYffkJPazztUZ/P3hFT1ZxAeiq+dTzlYeFY2kPNGmo8Zd96MeL0FKBd1Nr7arAirKafSLoc2Iam9TV61eVb3vsqivAIYthq9l7zPNbXCZEa0g11p+uBFGG87Lz+buOrfaVZY+vzZ7MWwdE2GyHXeVNGkok0K+cCvUQDr7XG1o2v1lae0FRB7iXOg8gIK9cxQGOda3bVv/hVU0xr634Ente7UMotXIxcsRo5vF0k8V7QYYyS5Cdiz2IM0LCwK8DxZPUe+yfrXHrYSfPIaRqiDHEad55rOM0MrKEN18hVar1GEp28ReyXPzX43a5aRQ6WSwmhTulPzcQYU2l7j+a5ZFyHl+/kcpmE1ciQXUsGPJ0j9mVDOF1OhgaG8A2ZNV8v/hGNwjkcVJ6IlMApdZFgZi3u7mudK7Np55GJ2tP1ZWEM1ZCp3LXrmcoINbbdFBkdLZET/bf/89/y6fGJ9z+888c//pH3P75RutOkwTnSwtyoa208L/xWOldeUWDptyerYkvbSjNg+xj3hwqpDC1EXRc/S+yRVWLtUQU92blxnR0zBzDVfKWE0jYUjYqNzCGzGdcjnCLUUlDtkFmxxY0Xrdw84gV6j/Vn0g+mzbHO9TNeDJf0nckvdc9+isCJo3nm8qcHP5/AUKAnkbXe8z0bsuqWyulBGtI4TtPZVtnnel5W2JM4QF01VRC5Wo6L+J1iLOvCP3f9ZYs8y0m8NoprEi91kz8d7PODNK8UK4vFEAfCa8M0L+tA4xbKm3jNqYFTPD3jsboOkMvmQnzNLB0V8QyxWs2NwUCjMI/byVYKmxnYZK2P+UEoWVCvHAA3espxW9lpNps6edPszm2+1dqQT1+4f3Taa6F9qfzh3/3E/8/e2zVZkhxneo97ROapqu4ZAMTXktLamu2FpP//dyjTSsa1JQguMIOZ7q46meHuunCPyNNDEldYm77oNCNt0FV1PjMi3F9/Pz7GG2MMXo6dnhgXomkp4mSIXozAD6XVZthF0VGhgT2LN4bSo6XaKSDiTMugviEmbG3n4yjZ6gZujjchnuagpjNaFmiCIZ5t4f2eA6b3Gpi/MkPP26iDw8rUKIy3PfMtThncI736t9kMaSMiD/5kidW9cu12CxQa3ekjfcibF7jnURuiQFz2KbqGlaPYZDU1rXu5n7mANoejfHYjjGnNo3VvdmnLguZLuabvsk6w2wUvgKzP5lac8PTntKiJtl1qQdcj94XgskGxvtagARLv65A9Vl3b2n095wQP0lImOCuIERJkX6xwlcuuqHLM8nGriKniMWiYTWtKofUKsN/GKvI2j/X4/OKJl292tr9v/FaE+79+j/zZ+ad/+ic+/OED/ik/ny06pyl+vueVBGL26Bz6xqYbcu7YUGJ7T1PDvNHbjllLFuatY/1OnCdNb0zbi1MzLLp3Zd+iirkEwogEBnrvoA2vXB+bAZneeNadYxw0GzTPAWpfiLQyGsva67Vu3OY57FYJXjz9l/GNrVSAp6RK8tUENC1RXJ1emXVThh86sHpN3VKZIyKVvA3S7rXGIFmDeykt0rJF2lMO5iNW4QLV5JAD7JkPYdM2LAIdZwUifnH1WtpjhiULfl6SrHxrF7tu/ruUPcBUShABWrLjh/fWjAUWmypeTUsUc0VEli1VVHELLBZsiC1rPDVfGQe5XyZT85xh7HKuRk5IFpxzQDXAzQKvgEpptoquUVYBKjlBUYXhOx6ONVKGvd/wrdF2+If//Hvs+5OPHz/y4Z/+lfP7bG7aPa2vzvNcjDo/FZ+5RD2IdRAboTseQlPnPJMRPShP8XBuPYPNp/JKSC9kESVRvjpbV+g0nG7ghsaJj1yj51nWhg0oqX0vJdVuO2L5mTy/qwkSjlrAeF2gXYIKioSiEahvZVPwAGjLsdhjEz6NyGFKNnxWNwTFnrvVfpDnZbAhJPB99rHs02wG2LouQXnIzmP84Hyu0b+cXAtnMnPn/VnDPw9sDlXD1v052VT407JqlLgGbLM+OAmk3qcES8V8WVEGu+UgcDRZQJrXA2j0ZVUZcSBbfYcuTE//Pj/77pkvAavWbIz0JtdSKsjD6xPBJdLfXBVlEGZAJCNayHvIcih6oqWSllT5528uZX6Iw5b//fSLJ77Rb/jhX/6MHjUAsszppDW6G9aSELSVxVtn5yYJ6vfeMWaGm1JzN4wECiQuC88JAMoG2y70CDaFfeZbFBBxngZn2QWe8LztbNvGUzRaU577N9jzc9agw4kj7+WXd3esDdrY2O/Cjc79wSpqFPHH6ibXyobTUUoPl9wHRgK0Kor0sop0XxN6lc/rHnkMslVht/zE81+eOGcuhN2qPwH+Csvu57i+1oBfa8CvNeD/mitdTVKhZNPuj55DcgFwQjJjxAtU9djwPpvXTsQrq0gkh9rnQx+5lsJDjbDyPsSTLIlgkSQLkSBmJgqPyqh6HFHOyD1e9KpB5loe5uuXJyD+Gbg3hxlFVkqALu3YBLjf7ox+Ek/Bt9vOb/XX/OUvf+HDv2T22fM46WVF32zndWUs16DOjRGNZo1dGx9b5lqIOZSNTifPhQ1N4IocwMqZSty7fkRVuaGMo3Kb+p1h6Zzy4XjlGAfjg3B7e2Hfd/anZ162Z0SEp74Vi/strVsjiDg5NQHYt55Ds3v7dIWUa+FAqsS0IFxWY7nf3iVtMm+jcBJptMrOnBlacFny2v3CqnQqOkcAbeWaTctR0ztRA/nVlYQyybBjHLzQlyW1iDBcF+b0JVyb5zjTytlgDrOFVAzIrIcCiMqcLcB8zem8X6rAqcRQXeWixhWhIDMjMGytP7FSw0SsfBl/UEiFXwqL+Zy+3bNWEJBTuRUxx+tvDGM8hIdOIriGFB62pV2lOy2kiAxwtASRz/3k3d/dePnlr+FfDo7/t4aaRz2PJ0ncI/f7lTUjc79obPrE/e0C+aEso0cOWPe+cbzdeW134ty53W60Hnx4/Zhk+S0VTl57cuKECme5LhU26ue9rO06cr+x70U6r/fchz+QTJRWEqnlSnU40iqWQ2FrGypKjxN3ob0a9y2H5ufLyev4hJnxGm+EBGfzIhY6yMFeGfI2Nsyyhp51o7DhMbIdry+zxXbVGt5qMcnKdWrRL0Ynlxhh+D3V9ugirX8pl3hmJKawRJdy3IGYTkyltAGW7Wq6aej185+wpxIHH+t+mvb/M3M5RSNZA45QtLystXIaPT6tQfipkT2qSKpgIkiCQ7k3AF5ZraOGgkMOdgxawzzQbx39ZuMXv+n8Ur7lvA/0NXh9fWX8MPjxD9/zww8/YN9VP/R6qdFcqN4rhzkRgnZfeWGCckwnklPpkbVcJ/MCbQhtKh5ViQZBsDNtBff1XpMgUXb8lr2XR1pX+hA2aamgUk2VWGsYxvN2ozWlbY3DTiI8Fb+x83v5FccQxtvgT3/8gfj9nn/Xa5g3gqaJtbh1xBoewlk9U6/1l2SPN85xWdZFZOzQVvf1bqBlHy7tXnXNtb/JaGjVFRIT13DGytHMQefso/PLGIRv5aJwT/W/6lJma3w+wPzp9VcHTEPPayrOT4rJOeGawZkiC6iZ3vyTyToXwMpU14tdCpFe8Q/gRJ5P9bfFdBWhijZImKFYXs0Jk3U05QLa0zeSwCLl5cLVIGlwyXiBXn6DF3PCaVVYHN0eWEr5im9oMSqSITNBPu+Nb37zS8R2Xv9o/PnPfybGnXetgvxGefyKEJa2eDYE6flY99Fxy4NlBMRhbNF511NO2HsnNMHE3RVZYGexWV0uxmAxHEwHvSx/vMEZZzIbR4KAx6FVADdCIkG1gCKsY+rlK5kSbm+DEGHmvQkphxfJHInj36mLFi/OjJnLZKq5RamUJDIg2gJ2fSnIerniBdIG1MYbtRmmp3yxUMSuMyYuv+MvKdMCkg2v4QmuUH7LIiRTKJu4BMnnupmI87jW/cPkWIulhvjVmAirYJuHFaS9DfWvk/k116JGvxqfRxVi5KGmIbnyPEPOqeyzKDl2075sk3JITHqhO8mMI1mn6+DTfPV+pGLg5dfv+cUvdrZvhX+Wf+ZP/9+PxSzaCdViR2up2ATVBJCO7LhoBE3yvpA42aOnPZadvN2hNej9TIlwczQ2sIHoBtJpqrQQwgd9T/m1iKQfejGcZpZYO5WGsY0otrzV91kHA05EHnLiybhLy8aRKhZXhh7JDG3C8LcK/duzANZ74QTFtqgDMWpPDr8t9opGJ9yySJjfSfTFkii6bikKrn1Xk1fFAXS5bHnyWeUhALoUBJD2TCSq+Zkt1Rd0TUXsZIBZSbqzqH/IaqnCIh5sXnEnw2gvoDQ0czzWr9TZ1hzCrSx06oyo4E7gYch+bYqPdnzTmz2DZqfS5VIgUAXd9EDO3xW0/O8niysDN6fyI89HVcW9zjzf50yEaAPZlVDo33Zenl/49t1/4dMf/sKf//xn7n86ePuQrMtG2pBEOFtlIykHWrZ40hUv/3rXskKLjZsbTZMRpyQwOs0HW1fOUremlWEpiFq2BEfkiCatOAYRxuljgZpdOk0s78fmmA7u7qh3uvaSbnt+JjoQy4LIyjIn955UYCXwPcG6bDCbjItJ4k/LysZ7VRhqaw255H4UxMqDUR2Xv7F4gqgwp5mkfOoq8q6a6Aoef2T6/dzXBAZW7acj2b4VugulL5F5T89G+UDm8C1YgM963IiL7FP/O4cm+d4316zRVNGwCrC9GHsWkfs3eY5YPU5Isr1ElGmQ1oKVFTMJUS66hnsSV4BsSGVjVPGNO67FVCfB4fyba2im0fMel8w/yzPrUhUG1/rt242Xd3MgNMOsdQ1hIpSnczKBdQ1qTaxIPsYM0aaagdxmik1Mp83BTJ4a9Lf8vtIKRdDKcNG2sW+dlxs8bQmyjeNgr+ahz/0f5VkVqVyXsECb5utnYwvhDPBz4LestVU1FYIC4ffMwZAA0StrVW858JfOtEYW56HevEKF5+VyZNg2QDE/XdrVT8hAi0UoMyMsPmd6fgnX1xrwaw34tQb8219p58Wy+2tzyP0wRNNClDweyLMxwGpwWllcnz0u11rK8nDu9/X3bKtsmMDOZXMjqIyVaWnwGbFEajh7qaZKUQVJTK3n8RgXoSm4CEDuVX/W2ef5LrMuy4cZ7utJ75uwPXee2zc8xc4PP/zA+WnQiqg6/BXau/W5CMIZbzU87Zyu7OOWacm6s53V01fdOaTTbTqXNG63jZi5OSGcYdz0jW3bEA+OcXAcBx9eX8u+p4hb7tjHoD3XZzAS4N73jmmBoDg+X6MnqffU8xoyiC9cZ9reWVidO+Ct0cqSeVpDbZ4EZaRyENcgr9Vn7st6S+Sos2biU6WgmqW/XNkxK6OcLW34AKGIBi2/M0g1qT1aNv/Ml8XsVUr5NYerkufTPHceVbAIn8Wzp4lkVVEPqpSVNR71d2RvAxDYpcogHX+yoJg2yhWTIQr0ZZsWcygVtr6GEHKAC2xSDEJxRtWgpql4kHA2dtBUCbone39En3N7tGo8VeNoEBo8v1d+fDLMjOcxB3FZ14wYqXSdfaFXpr2A2b0GWI6QmJ17rhMzI251zxiIO3E/0SMJQMcYaFnpaQ8sysq1WteZJzZGWjqkQspoOOcpdS8X4C3OOfc8dY6pqvaJ7SbR6X4O2u7EqL9rNRzpRw1D0uHpjFdCgtf6t0N8uYeoVV1Yw4ocxLLAbQ0Qq8zHualKkrCyx70lAYQr/cWirQyhRHdz/2yV5d6If2tt/zNfykiLzci9wzTP7/CWK62w7JX1PNdSTIScBxwdHocydTzn88Q1lACIZkRUxpL62heXS4tchKXc7fLBWpEWXHzVHQ5IS2v02ddqjOVE0ZiW8oLXoGh72dne3dj9Pbffbozf/Y4//OEPfPeP/8rHjx/x17FUe6iuuiO0hhvkvjzJA9P6TkYSbNP9PLGHOe0WEcK8xhKJO4gI0nsSUQOQRquBlpeTWG8brtkfekgpthvSW5Klti3rXE1rvsSlnT2eGGPwLDtb3JBobP6J43Da3gl9LVeyYMRTNbBCm3la9fmeHMt6tHusK86xIAAAIABJREFU/87vMzMeJwnFvV+91bIBDaYwKKO1rtobIUmgMhXpXo5xrGEmUY+pXiTZnapo1r32mH/70+uvDpggGxMre5TPZgfxyPgc9aoqTMt7gvoTDKiVsbzXI9aAR6UlMQqQxfiUBC/qMVfszlRN6SuTriChsAqzkhriawEpGegNGU48L5+RAsCMF9iqCFLtGb5KbdJVjKy8BIllPRCevozSFJ42TIT3v/uWd7vB08Hb/3zl/uN5MRgExukwrIYpwWvJ2mbT5ufBzlYDJcjwN0Vbx8urNVuoqDDLYmf3zmaN3oJP3DFPGfDMIJJoqCsSV67RGIO9ZTGs1rFR7Pwt7Vl6vMIKAdtzsPcIeMIqjFvAZte/QRbiW7GgRG7L+z0KkJkbVRZ4rOplZp6w7rxUY8lPpvXxE+RgsltlqRIk2bBf0JVSfl1WSb4+y30SM2geKyTTaq07XKeGsIAWq+GnysMauio7lq2Qs9RcOYBNYMzZiLqX1sRbjmWFwQTCQjI02yMzH1oCQRodFYr1ld/PCMUtmdJbpE1PtzOP/YgCzIrRXE2ThWEdfvn7X8OPwl/+xz8SkY7pIoApQsMt1WwmWci9edrzmDhKRilzGqMfdOmc553b1sp3PnM1PDZAcAezYNdqHDlJ/DzBHo+UuS8riwJnzAzdUinRLJlYSsuJf6Q36hM3Mky+QoURMhQzLS2sfNxFrTLtfLFEvDU0Xqrguq+Nv9dnlgz3+f2CV4hC+rTnv8/Av5DJHgp6WXQ+EBtW/gNc67Y5D6Cn5Xtc99PF5vuirgnmlD2JFcBmcUmTgdXgnFNqrQ/HoBzJfhJYw4dI5c0siNfgSdK+ZnNd6zaCNWT3yiVCWAVx6g7mvVC/5w+ECS7yQ9R6NKCfKc2egJEgBWhkTK5KhjVbGITibg+hu8roBcZ7p5Xl6C5BNKH/cufXt2e2X73w9u2d//76TxzHkXYmjby3I9dVAt4JfDdJuT4anMUYFjFcn3At0N3LVmjKsjTWgEp1LAubyUa0aFBhlF37Gkz02fD3VPTWNAG2CguVBDLd51gBtnDEvArnBDvTg2EeTvsDISH3TxfLkO4IiDvaUqUyWZvEvhpNCava4qqNxFrZm8wzNve2SVhx9itjKfrlb/yQBzbJFV/CtWwc6tywpfQ5lg9z5zG/TK8NqBpxj6wjP7skoZiItL0VTS/8mZmhaiQqTZ1NtWaWNdD1eK1U2ubJeM2BYiCWr2twsfiYgIZn3o+q1oA234tXretO1Y4VDl7rNaZSMJRW9eKpqcYQktiTQHenPWRLjnr/bxGw78h+g3udKrGXOCCtSrxlAK9L4Ay20HUu24hUaJizaSuotGHrXBhIhaGra1o0F3HIIojeEAtaUwjHx8m2bXw6s5bYxqVqmeHBykEbW+1lDcexYdg9azLzzvn2ht4aWKNrq85z1D7WaCsTs+Nz/dVXYmLZKEUNMiTBxTI7TTsYrQFmdJjgQT3OjtZ4vi63dcBNa4vJuPtSrq814Nca8GsN+L/gagajre9Ko9d+zMq2i5lNBosQAL3II8XYXusu950cC81hW/68cNz6fhL7yD54kCTYPBNz3xRMhNCqiRaWcH2G6rHqx3g433JfbFivV2GO1Nm1eZY0I8ZiO0PZgHnWEmMMFGWfc/2A7V0nNqfrzrEZP7z9QBNJqy/fefMcnEw7sSBwPxn3A20bMY51D2h/qeyU/N2tP6NWJAhOpFc+hk9r01S7WAQ0xY6Dt7e3eq+BmHKeiZlsEbxJqgzVIwdVCq1Ufu6D2NP+626vzAyPM1JNgsVyBLCKFxC/rXpbz7as/SaQa9KRimAQiwXASWy4SWWcJF5TWO66r0SEkLc1GOkGe2V3TbKRaeBVR23S0Kp9h5Zq4XNI42e/xBshxlYD2NHz8zIyUzY3G19RFS6TeJTdDpDYYGV1zfI3E2OrFxCg+iWJmcGk66y766Ven4DxUjZHkn3SGlfWvqbosq5W6bk/a9Y9IkIftnpAjcQpI3I4ISJZH07QvOU6yiv3FG8OlmpQvzX0m8bxdvJ65p7ychjtLGKOKG1MMkT1OsfJsL8s9Ypwy6GSCyNSLXEc+VncWmfThtmBxbEA+Kci56tpEcYHqvAkLUnpkeSE1xretta4bU+0vSPasTFwE1RuxBarXlpk/mqutDXCcs+xEdCnACAV4qGOtLS2DbvXvvhQd3CyjYvIqXMKQu2fnMwglSy1t/W95M/lYejyMKBfw9vgmFEZdt2LTdMCOiwu0PwLuS7bdICMAEmy5eOwhiXi6OWcYtL5d2dl045dPWs0sp5pRUgbMYknmW9aJePax6czQqt6LiLY4iHn03MFbi3JErNnkqnGnBhGPPS4kvmRZka02eOn6g2BscG7dzd+95//Hn0D+2Pw+vqBc1S9787s+VpciupFvpWOV5+RNsD5+2nNmJlIXjaPguUe0CZiLrTWESkMZravCFi+m7S1nMOUQSdqV1OatNq/cyh1yj1rb7NVI972Z37Z7ry9vfHDkWtn64J71qjhnaNEIaJee1wsjKpFm6NEcopBfcbVe0vDqncss/D8jJelfay5i3pbRM1ZF6r19Vxwrauox8ztsRcBNPveiCs+Invj/7i3+qtdV0OywS1v0Qn2hFwewvP38povdFsT5BU8FrEaRpPBZhmOiNwXvTCzKiIZkmvAIGsCO8/diCeYk7yY/xcsX2LO+iDnwkh2plbmhcfB/CIuxi2cVYA4fsnyasA1mab5e8LmkzHu6++UbM5GN57/7sav3v+W+/uP/Om//U/G3ThHMEb62c5wyedxeTCqdNAEwk4MIUO9jn1wu904xXlCaW0jg2JbDlwkUG3s0oiWstcXwGXjNGH60IZtWOt1iPdUPEU69avkNJWS9Lcj2DZFZKNPORzG5Q06LRKF3Dcmy6U+C5uZC8k+V20lx3tb35tUwY1Naz1dAbYsZoleMueANv3954Cswcw/yYNl3pP5/IYvZtKXc3mxwp+zMZS5UcO08DEyTwEu1nT7iRIifsJyyk2lNp6HEyhWAe2IPdX3H7VGp/84mD/Rln2A0v0K5k6gULHQBdJdLogFKFQ2A5BWixxgEPpMAGeD4Vo5HMnYQYTRyz7KgsPSP//2fqfvnfM82WdD/WC1aQaHpCz82TdEknkxdCS7J3Ioa+6owOZpi5KjayN0Q2m5JZvDVgdJBVGK5/szM2w2RGYrEy68JdjhLYPwZu1Ttj/RlDF9tPVc7KBm5Rst1352aKdNFoAVUDkMphWA6GKH+ZDVWK52X1iWkqHLRGoxuTLDJA+gC8gykCP/bSluMtMgi41ApyWqQMxsDCa4UZZ0X9DVytd5eprj+wIXliUrPBSlNRxYIE1BBg9S3YhIFUdW00AUkwcKTvocqRFbh3BIngdbjOvxo2cDFrGYevka5tmTNkdAhddDJOREuNF4IjOCrqHGdOSf7OgZBGnVWbs5U88R0okCDe+VP3G3E7kFz7954f3+ju/+8B3n998jRzYkLRpCNvk7zyk5j7kfDSSS4ZY2JGnPV++k7CwaPXpljIy0MwCCrZoXmLaDaDKQW4W29qluZYIxW4bHRvoc96lQGif0xt76WncZ2jxtT6pIewCamwptkU7m0LBUZETav+YTE1LsY9nWHudcDMmpjnI9LvZsaUiyPrkk5ba28cEROaQcPQGTzTYeXDt+9ksYNHu6Cl4uluI21TxT9cO1dC7FRNaLxNXIAIj3UiNkMyk2gdbJQoyHusgXYHipK84ruzMabWTm1yGVW0Kq0FXSEnGCNlIs67TEm/WKL3b49B9Pe7v0MT9tvs/Lhtkkkb1ZT0rsBZqnasZjf6iVOlJAsutshnKQrKr4OJIxKNDGxlnKpaeq4k+VPLsFkAO1ja6Xakrq/szeO4PXsykvkDOsQuODYND0HRaCjTmAcSh2YNTQg/xU8jnYcLFc/7eR9s4EcR74cYdjIM3pXTDa6hNmX7BHcEarffECIlsNnzFdm7DKiZYCcUwWvJbSwjNDbZ1rNbwd3tb9aep4VF5aFLtZfN23X871tQb8WgN+rQH/1lfm2HSYmSSaysjHIGqFVXu1IulEjBzI10DcCt+QAp0RveoyYrmhbLU+QnJABNRaKrhNUpmdJIu8crh8kTKS3OlrWNFNmcSVCQQlYFsA/kOfPXfC7rr23W10xjb75FdCg+axcn3cj8QsntLu/lle+OG7j7yG84bxradlVrhz1tBEAsYopxd/o1y92OhEfOQ4Djp7DYI6n9q5LLm2w5DYoCVm8NRvnH7m4NXzszkpW0qSDR41SB4aHOaEph1enlcbJ0aMwfCT51F/u+dn6DEuS119VKTXOe63VbcRse4R5rnpW97XAqJXDt02ob6AmUNu1khLAThr2C+cC6hT35eyo9m05XxwUdDOqJrDKoRFxfEHK9Sf+wo1JJRTJ3aU9Yv41cM03h7O5TlwuyE+z/Crnmoy+6r9wUKPayo++zPxhelt1jnm3+kj4b3WwUNe0szebZ5DG6g1GQo1kBGEU99WNu8ofHJxK0jxg5RDQ666OSyr1+TgPYfS523nm998g3wQ7iMB5b0pZokR9pEkhqxLqq477mkVLY6o0eJkKtyabXmWjbR/fO07n3rW1LczEE2LOzvrU2iZ4d57J8Q5PXNtxJJEbm64FZAuG60bYXnrqiif7EQ1VUlusZRLPsmAFsBg33eEwZsZXVKd0uqzO8k1Lr3hcWauTtW950M93Jw1YI25ZsqpKt0DdmQS7yp/JjfRrX6XNbjUB6vR7jlUswZbkazEG9T9+qWpbdNBJdcFwLTSDL9IPo2zyDVChNY5z9pTTB97rrzcoD2o9zJDR+i1fizS0h3m31aVnxPBvM/j6t9Uysa3aFzRekYCRODW0bL2nK/DBaw/ree+x0G0YC9m5lAYtSfvw3ntd2QTvvnNO97iPd/94TuehyKiNHQN2Ig6i1ti4yrZ2zxbWley3XAppTiBWuDDUvxBLv/eBjl6a8hDDStNCTzdvuoTgeoOuyNFGqUptED36oF8Q3nFzDglknCLIrNua4OdLbGC0YkPJ3trWNuQEKwN9jlfEacXuXa634yej+fuSLsc5ZrthScpO6mylNm7VtwN5NB8qpoc2CrHTmSvuv6q5ZXL6SdqmOtyQimv3Z0uz/VcNQuxk/2vDG7/+oDJ+2dA1jHt8PSswivvKFu/L+sLs4eHnkXcXAEhHZf7BTasFZJKFbBk/AL40wJv5ttQNXgs9rjCfvOZMg9BBLaheLuKYPfcdGdl5k1An9fPs4ARVDIAebMKfha5Js4e3MsndgvwaW/UC0SwO9+fr3CD2+83/o9/+K+MMfjw33/kn//5n/mf//cf2c4dAe4OV1DiJ26tvFS1I/2k6QvBzjkU68ZfxsmuwnM/2HRj22/Qd7Q18Mj8CgXIx+fT64QnEflIlJzwaAl00DobuSB7H0jkIbK9NESC3RozfNIhVUQiCyTYR9BrWNQ6nHYVHJAsRvTAAkJ2JjNhFmrusop/5VzB1DK96c2W5cf8vuFBFXcMdCvLF7nnzS8pZcwi5oVr6/0yrlP7AlseB5cxgSkSNJ6gwvy56dVYpI3KZYUCYA85JhaD7UI/awarGPccIEpbm+gcIJ/t8jSW6FDAWquwbA+YocKqShzT35x6nNvy87xhnG2uhyhA+MbupWaL/TrAmODjJ06F+xh8++2v+NWvfs133323hoVyH6wevPJLmhQ4gHH3V0IaMU6enl4YlIS1g9sHzqPR/EYLaJoFk6ribcNNa+BKMQ5TXp4N1eA0W/e9ezII99iJe7BxY/vuE8/PO+N9Now2AkjGlim0QpWPh+y3afeYAEy+x30xFy/1zOZ9MUKCM78XeSOqeG7l3Z7AanoXuw7UUhXQpDzBgeiTxfm6Xoe4wXhOUKOKmWe72Ktng1M/1X31lMVcSA76v6BrtATi1Cc7tOwNuHIlLgYMV+gyeYgjQpOgWavzJi2MwvUhp2ln5rzNgjnVsrWGdMPXuqkizlryxAvwmMXj/L1orO/P6rvKN5Tnb48jC+0Ai1eaZJFglcXUfENiWnXoAhLatPFwX/YMKYOufaMPDHLI0dMnfH+v/G//5z+w/bHjfxi8vb1xe33JnAtJC4kbrKYrzspTSR8/th265trJorazta2k8sq5AqFqD5nDmD0BbvWR6l5SBaItCxsblJXEp8sDXhsvT/m62u3bsvBTWuVSMD5h8UbTzijl75bof+03uogsMwA4xsv1/QYFhFJAUBb8M7vrqozqigBJOyTIhsenmsTmkAwm+yo42Vu2rrvtTNE2X5DaIoQ1iAUQ2ap57wkeAzASNIXV5LtMUIFED+Qta8kxlcvnqgVMD/C5lopdasqoTIwIxUupoFPpFRtWZwmA1e+2Yh6b31Ph4JYDzVnwRydE2KVl3eJCi4NPkuyyWGzlluQiEW5ng0mMWZk0ulTsKrDsLtf+cmlq0qKgCnLN+/kX//B3nP/9A8dxcOP2OHVEzxPG4LUao5ctC1ZRpbkijMzrqXNRN8G1LE9C01ISKMNxNlJdIpLko+P8UBkq+V2cdgOrwZs986xVT1UN9fxeoN3Z9yhC0aj9UXnixj6E1/uR9/6Toi8TaN3rzOz0OMBywIFPO9CsAZresQqNdjekAqbRyVLMGlEEJJSId9dnG+WCMe2vwpFoNGl13+Zz3hcU+2VcX2vArzXg1xrwb39lH30yoY3xaB1ZOMIpMO/Yi8jaC1zJ/cTrfUXVVeq3y1K1tBeQvxsB4aXfVUXJ7MtcL7mXNpdFdGwylg1oK6awPXjm9cjMy3wB9ZxhNBLoU3IIP9dmRDBCaCNxjHCtTCBAdjQCiwOrsHi7CaGf8rNgxzp883/9ipf7C9999x3255O//DFBs6fX/PzMUhmfZ3ANECL4FEIj77FbnGwbxP4x86RVOXzw2hunpeqntYYfJ13zvwWBFmxPig4pi7DMP8zMncYx7jjGaFkjjh9/yDVN1tMfXzOb8H5OhVTigCJKHBtnn0SXqvuSpZDfvz7898OZ3cd0HzhSARHBW7LJaEPYyr61y1lWzrGy10RuC6hLFUw+5iTHbKNfx70XyVZYr6NJW7ZQX8J1qlVezFT7zP2DNRQfra/ar+Ii87x5eBsTx5mqS31Q6AYwpk3xw+NoTAcAR+rzj7LGC5mWhQUIn5OYkWBwWje91u/C0A1Z9nzQi3iQzxkckoPCWctukmQ5N+eQs8jM0Ma0ld3TDptgbAf8YoP3N37322/5+PEjf/x//gX9ceM8T168I+3g9HNlWRnG6XmmWMV0iGRVZ+NATFZf0s+3da6/9c5L/e+7ZCY79ZrbaLzvNz764DxPRmGjZg0vBdFTdMy3cqFI63OXN/CqHbbM68wM+NrTYifYuNuBS+fbJ2X4SR8b26aoNEIybzE0aH3H7CCOyqXb27J693aAf6h7YOYG3pY7UYinmg2YNtx3ehIp3XFxnvpW+5dVnqHnmqtIj3mWWtUY9xl78gVd6czV1/4wrcZSITkx8Y79JI8txBcW3eINm4TXVU9lXhJQCqgTInLoJMKTO2914/eY+EfQa1PyBs0vheqpDW1Zb0UEdzuZLiCdwq/zBZTjl/BW9XyEsXmjt0bXPL/MfZ2lHjBaZjfvf/9rfvvrb/juzz9y/x8DB273jRb7uvfzaXTVOhtJxsvHesvhnAuvLtx98OxJjGutscuNQBkWtGXTPBYRq4nQeq3BEmLQlT103TsdQTy4n3l+ht55XUOdJ864CFnbtqFH45tmPMuNszv/9OGPvH34gfhtZ9t34mmr4WrNUP1elUm+vj4GRk/FrN7QOtdH2g8w4mAqLm+e9pflSZ/vSRsRY+H3r8VeLcfnnJfVvuzi3OffzQGtNILXmukEvfpg9TwTb00R+7dW5vP6q0jGvb+m+ucnvn4augCTEF2N7gJ+YhYH6ZPfamNZeQQeeDXPPR5YxJMB5LfrObP1yIZ35SikCip/uTHZnbKCGS/Zl7XrBlpKJVG8TemrP8wflHk0tkgv9JBgq/c1lqXLZa1jbdBnIGbMzwRaKYn0SbifA1fnd7//JX1zPv7z9zTJJstec7LvVbg16zQa2p4glCYXkBFmtGaYn7g/EdGItvMUG5JV8Qr8miFhut24eRZu2y60ljYMzzzh7txQek/G6L6/gBRjQ0mPajvxM5lIuzdOmzLw+Yl5WegoEk6rhmxmVjS/pUJKle7y2WcEySqYE1axvtyLVkC42MJsnP3y0q97sfUzfyciGXc6rQtyE8IvIOtLuWbQWq9Q1vX6oucGAasZgkuRkXfmZBE+WihcknRdfpievvRcTYwTjGr4R1hmiUVgPZkzyvYZQJiPHcywGqVUdvkCLqn7XNZNVtaL9c/fA2TD26YaJFgFa5CDQadjmhlfdxvI08ZoqUJPJUWysLPJShsIjcsKrSF4a1h5m2rTAmwGYxz5ifcdceNZnuna630ExpEqvvmehGLi5mExmUr5OTp2Gt0E9Z2n0fnRy/u1irRo52KkbcOIlgCgTn9mOtMbNb+Q2uTru+9l8Zm98Q71/L1YPE6H8j8OVXycKytFVRFTIs4C5y7QaTKV57eXjCahT1a5zfvKl63Q2cayZbE62IdqWlJ9QZfYU8qlCxieVkEi7bKLg6sRmqz2h5DCcKmwTRZqdkF6gBxzPrI8vVMwPVWeo8DpK7VJJZWfCfAlWPxZQHNtcE3IgOA6BzsXkLd+/aHOUj8LJCSZggXK9rnHFhBgehV01qBVCPvstVSce9wJCXrbiSZsL08c+4mfA+0NtS2ZtgyGTiaZ0GvvlWhsvbNHAxRVYdtavdeB9n3d2xqTFaiLOS1NEHG0vRD9rKYmGXYZgp7ZhFs0mlRRKU5vN3rvWE+LGkLRAlk7CbybzO9FILbarwSXo3yFc2ddoLbOIQPEtOHgsnSdrLvM0KlCzJIFhuxr8GJqDyHrNbT0CVzmE3j5LutcS18WFyJtgzyB7M+KfBnrtarvS3Xla03x2ToTv0DVAIiXxX53gpiMtioMDrVkytZ3o7O280kmkTmtI1n4BS6VkqfT1hpL6+Ei1Ky6pdXfpSXRZOQtG2cFHQU49jceTrt1ln7uzlv11rQBevysrGUegKTXPKpsWyqVokg+U2LlcSQrUYQ+mzRqn8fWQGF+bvkGGxFeVpsXKDEZt+l9X7lsksxAkYYWcxGmb39w8pGn/oK2xq02utumWC/bKTV8JMlKeEIj+GZ/4ZPcEcu+YOUq5Iur9zBBvFTG5FrLiap7fm/5u7FA/SgbjszRmE20XoT0WQPpGyuzBOgF/snIe9bkvhRCX8r1tQbkaw34tQb8X3KZetrWEPldkKY2ptOCabAGtmubvrJyJPqq96zwh+BcFoMisXJoXHYQQUYwczgjGsQLAmxlHYyQ5BZSJeiV3RM1RN9C1lo5hAUQzSGgyJYDwgBUiKqLci8MumzLag36qjvs4ZASNggInCFl/b8XWUB22tONX777Df7+jfuHD9xfXzlEGJYZR3MqEiH4SOAuWdyJy7yF4DS2UfZhQNfOiATp32sCdBNonhmpW6mBR+tEND6+vTKtWJGDTZ9JUk4OdlUVKzcaRBl6Vo1X+2bYGqYeXGlaXvXGstoC0AMpQtlybo0TYU8Ckj5jtUanfS96LhKQEVfmX33UjVb2uEk8O5fKojApvfgkwz7R5Zv6jufwo9N/Air/nJfU9i/z+5+M+Ae1fipv85okvlQATTeJTpQ7zTVL3WnM76QvNeayjRYYpUw1guZZ03nZqYbcFiZHNLQKg7lvuoyyzfZUAtf3t9RlD/8/c2d84Ui5V3q6HQkgRqu9rlVPkLl7vc6dQfQ8R17jYP/VM+//0zt8c84fX3n7CHEY0YJxToKZcT/Tyah1waKVwulgj3eI6gKfT70jpMVrYFi5S5jsFTtxz3N7Uz7FKxJwnAdnEeVPe4I4Cqc7UHf2vme8hUcOZIbk4PYE6VvaMHvi+WyOeBCW5L+381OqmSKVvuIbZoIZ2Lax63tC7oT/WKrG+hgl7dwbo/bSmS154FpkxXI9Ai61O5Z7oORwN43KUseUdreGiqENwkFtqmXSTjok/n1buZ/xarN3nsQD6r4FpitT8/4ZmQGuugzAtZVVe0DcIQKXp8+oj/O/M0saKCx2njdzKzxl1qAHVjVi1qnXvpUkIefKbYKYAoCpZowL0/DC691zvbg43YIxBx121ZDeT3oXvvnlL7Dvvuft7Y3RO63Vfl19vZQ16cx+trLI63WPffBP3Pp7ek81slo6H5znnadetXP0rIkCZv5vmiCn29ZKT4hULDlWxNSaPxS2km6Z1dvEK1GKZpZqKh0gBOFpeyJqSm33/J51T+Wxau5+UbUYYunm4U/I7AOtYXVf9EUumeuKUi2V0wUzIujqt0TtIXc4irwsq3dGPM9iQKYltitUpEKTaS2Y+7FHoLKzyX+sYv+rAyaXPESmD2ljTsJsNXzNdDVvrT5o0wfVUsm3HvA6Qh8aEqKahmS45MYrq5HOBnG+qQe7nDnn0xObN8gCc9IaZU5gx2w+ZSqQYC5gt462Bwf3AjTOcNACGlcjX0W6nI+JHuvHM7w2JNjYUA08OkOCULjvQf/VCzwH/a0YpJrsXxGBW7D7raxyGuLCpiAtmyCV9PpOgI3KPFJEJuMjP2URYbf87DZx2DTBria0thXLKp/ndntGSWltD18B8+YnKplpsrkiZ9DPloVRpIpsSo2FCiZWp5UNw6yVrKX01YFDT6gCcTXOxMMGM9bP+kR6Hm5RZeBM6eWU0PaypanMkmrUJ+AVTBuQL+iSUd6oP11+V+DaLJCBtRbCL9AI8QW6Tb/NJsG0hvAKe7xAtawSZ/PoWgH0wgK0qYI+mc1pKxRcB5TG4+Hm9JVqy0PhfzU0E8i1OQAmsJaNVbP9YgTNTVmOBIFF0NvG1jpdG11vNG30HmgBh+1UJDY54z+6AAAgAElEQVTEJ3M7X9MZd5AtrbDOAx/CdtvR/g7QdF7sBRKWqsFOx7cKc67XbwE6GfhhuWlEEKMTzrJNUFU2TW/YcR/wUpYvbVs+wBCrORTVas4HEdc62GKGUeb9exagE4nC0O05m8+VSZOexR5534+ije2Wnv9tZgYFIMfao0w/BwRChQy5t9VkiQhYcNa+0syhRYHiBhjD92Xf86Vcs4GZVjL7ArYuVZBJ56fWeFr3Tv0mk7Awk5FsnQMkI7F+t9chnk17FWS1lwex/kb0XN+1S9nWNF22XI6upuwWqZbKBrxAciuztRnqTF9WPUgr9naCRqmYmdBuKp1gPLCclFbKAZmEDRHatudjorz75Tti73z68SNHGHEGeO6x3W8ZPCkVPF1o4q2UsZlnY7RW7D+RDAFt134+IrM+Nnw10iczwFzY20t+bi2ZRm1vbHT2fafHlt7iZRdhkoBB2Iao0s0YR2Xr9IbcIYZz7Plvt9p7s3jqSxEbetQAI6vhRaKYCqdgDdiQWdAbEtOCY6Kx+R4BxCKZfUV6yT2uAPj67npZw1FD0fD2RVnkJZPQYWVsZX1UnQrAZ0oKlZknuS/LHnW9wngLhDvbWIBcfnqfh5sSUpVB2ZaI5vzQHW1KBmVPT+9YqjGZVmuwhr5RgKE+Zls9DMhyvTcgrYTy3zoXySkfcSqAsqDV6+/rMXKY+2+72F5eWxGxztpvv33PeDoYHnB3VDPgmdFoWQiD9tXMYDPLYyDyQvgaL6WfumRGTau9LLPSpn3eBIYEUWg994Qoe7IcCNf9F0bvSmuajZYIp3lmVrWG09I/HdJyg+BZ3qHxA+fb4PUteHr3rr6LY9WIozbDN23cLNdSKgEBKgMoUkFm1TFFdU+NdlnB2UarvWbuuSNyWAjgBreHIVyWPU8rq+iLub7WgF9rwK814N/8WiDiVDROe3d17jWAfySgrjs7LlWJxrHu8Zx7R60xQbTsi+bPZ85gC8Q2ktQDM1tsWuXkuVkDQzlRn8P9BJaGDNIuMqu3pf6t1990LMtRC62YuTyLRcDlstWh6jOYr0VSVVXD5NBzFb85mBawO2cYuinf7E/426/44YfG8a/G6w8/cL6OhXBO+/vjNIjOVipA1cDdeNJAQ+nS6XVmaeuLPEBvtJa1ooguW9zmqeTovZf6DxIwm8PROnvRAqDz9eye9fHdpAD0OehLEH/IVDNshQfJ9f1H51a2osvaumqwjBdVtrIjGrUvuLQ1BNmLvJKfZT5PA7zA2sTQ6uczjF3SJiq/ixtRAKLMzfCzHffnv0Id8eOqn+Sq66biNSQHF3kVdhd6EbT0eHQeX48jxfhHxzUgfGDET6KeLFcEXy46eUv0GjqdSSITYeWFSMeDxMtcQfL+/OyTjeoVxOGsgXu5RRwt2GaWT3AhVfKwNiXtFc0752ZEh2MIB8b+2/fok3P/7sS+M17PAzOjbWlbdxwHE6EaZ8/cTfe0BtbM0O3LLQPgNSkU8ZJDJks1j4aismP2CjIYbkRYWm8fedYQRw6YNehP6axwwrKzVbkjCMd5R7yvGmoAGoL7wbQU094xO3FXztmvNsGiA53wVvXkSIWxg0pwVq/YSbWRwFqr+X1WDxY7l5hhrrnA617T0TIXLEirvQh6KKJTDRdrwLGNzkbn8GM5inwpl3jP+nYRpoCIVNXNNSZjEU7mAb4cJCXPbWcSJ/I3Om8PTwKx+rS+nker93IpUn5c7g0mSoupagGf+OkksT62ONHXYJfQHHZKrLWshe1n3Zp1ilU5GhEMTSUhJAnIzPjNb/8O/bHx3Xff0T82pLDgTh6uaekrWROJ4vW9e1n/N30GjWXZaZoZtq0ZFr2GOTWYXo4qwoi0oA5nkYhFnNoOsrawkWt05dxyEQNQLJuXtDCfPUtPQt+T7LyXG8dx8PrpY6oE39+qhs4eeuZFdU+c3vxMlm3AqeeqrXuRSZIOVTmusCwpZX3nwagBkUYwc49ZffqWmAZUf1+bdIxVn+BzKBf1HQbqUdSb89/Uk4/XXx0waYXcTaa3VrHVHrxRBadZAkLTL3iyMbNYtWsYxBxUsWR/GRZ2WbAF13BARDhazhWzYMjGYymV8gWQntB1sLvT2ItRDOinxf5uk+EjL9chIQfjYRpL5AJsi753wzRZRNMzv3msAqU5HJoF0DYK9FJyg4wsWs6WgWqnOXrb8NbRl/zd/slBS6YaVKF2BZcfFmDGtm2Eb9iuiCqGcpTHpLV7sdhghldO7+/caBVpqTCSOnBdLTOXyAY+ZUadSfOYRd3uDfctvZT9YEyGbn2jIZONExAn0qJAmDqM7IZPH/lwrAIEp0+uyjXBRsZiA3lBUpOFvOyUKrdhEHh4ZixUxlYLFvtkAlntJwzKL+KKvli4IleotsJaVwjLKuWzP52M//ArsK3WByJoWUEQLZVhVTALQvi2kPKuTpvy6dpMbzYY7ZZ3UFz3wmMTtlSK3FdY9AVOgEjmH4gGo4rsK/wzaLUZ5hrJwnoUkmJ6rib4VZz9/RP+p+rrxeneUdkJkgnUfSoH8151bZlREJ0xHNkaTZXzNKJZWXAFDEuWq41r06xDZCxl5fT9zgPTrJpvGYQmo1W4rBG6KeLCuB/s+7S3qEPaA5EK2dSWh1ftD/P7CM91vTBPbLFyTW3tYY+DEi37jghZjIMZGCkCMQ8RbB0c0/85In21Z+Fi1RzNTfCRBNBCOXXGIm6oNHY0lQ1f0LUamJjswtmQPwBeDz+//s5wqaFODS3yu64m0NJENO8xYVQBN7NIWuI/dYYlQSILvRmqvXPvRzI+gOkDbig4WNgCDVt09skU7MnvtkgJOUDIxrAaiwhE5Eh9FEDcDI764vI8jZWh99l7FiEiARFTI7QRtLSs2BpP37xj+63yl9fvOFqgI+8p0RrSASInqpJWJ5FEE+s9lUOSaglt5akfM0i0CAgAbmx67RFungHI7rmGzOi6EybZkA/DEFTAIsPcJxNH/Ui28pbMpDGcZo7d33h69463EfRNGSLFvNH1nUEW+/N+tpaNn4Yu1pjWZ92jrNWAy7S3foFU5M7BidKwqlmob9DF1l85nV52YVRTHH6paL6EK+jZJBZQ9bg2lkWk5MBgNYcAcoF7wnFlJxX7LKQvKxWXM5sBAV8s8o3hBZQVmy7rhb2alYc0mmoyAWL+jQmTuyxy4LHzuWpQ1qAZm2dpZPNedcM810LvCXqZsQ4ouSyvePCXn2tD7cq8EHlbDdcqK59uvPzixt0/wQdHIxtmk8EZswaMpURwGagKQ9L+TVpbaKoYCViKsEnkICnSv1uk7M1IhZ8Qq0OVImJtrrQWqUDcn+FMINDLLiIiA4Dz47stdl+roWmn8yQ3zjj58PoJj8k0zD3J2sB1qybnqvdkdsT5IYHAKX4N6+tHFspsVZTqD+IC4byBW9aATxODfLg6QvMvS8X+tQb8WgN+rQH/9tcafs49ah07fdkOpYXjGpkWiH3VSKYHj+QC9zybZD2CLiwjqo/NvJc8A8ey8goOy95+j/o3MgMjCuia4I46y04y6AxJFXcbdf/FhkUOEwFC05rLbGYkBa1wl7s+OH3Ua/RJ6hTA23II2Ur5OG47fhoWgx/9B97/7j392068B/lj8C//7U9EDWU3D2KSDCIJM0FaEyeQnGq3OVHd7ZZ7gSZpNu20OiGNFpl/JVA2rw3zVN7lfe2JK9DwqjVHEyzu9NbzLDDorWM80bXnnjYjGPTam7a6z0drS2WZxJCZ11yflwSHpNNLp+OFVc38ROo7B3B2bkvGcyn8pjItrtJk1QbANczSsrqN697NOvmB9PwzX+J5v1fcz1IINxG0hkoWQjyA0nl9vjfMc8v9WnNzwJFD36nSLecGdJ1Lphd5ezoeSeX4qQSKEX4B6PP5V/6I1MBQLyJEO+H+UMJPzGspEuwxZRW637hUH4J6cLZetX59vwL3rV7r7eRJd95/83dsvwr+YP+Djx/vDOsclgT2m/Sy09S0vCzbL2FApHqw98zb7NLBQdsg4d/M3lQJNO5r37azBkxTwS/B7ieglU3khQXm4KjeLG1kjdsc3uxjug7tjXDhrPM8bcgdtcxGVLXapwT0cp7YzRnnYNvrfYkt8ln2SNXvFnhtevWGnUAfyI/53YyrhtADKSvsWcu6aAHkWdf7zHetjbCboPJva6mf88oBOMyCVQGqFlw99lwewaWw9Fn6CxEnkPmveWZVXunKfetQQ9w51Jk4QT7Ywb1Ucj7XWCxvF9A9lWs1jEJAh9ML0/2MgucDJTA9P1/Xs06vWi1VMxexctnkayMQnn71Ld9+2/j++w9EU9oxCZ9VJ5E5eTj4lmOOXLv5e9u2lco+728vu1Nl55ST2+229gAxT1tuEaR1RgxUEuNXVcaIRdJKwkgOo1ZOar+hteH5uOPkenUGw5UeG409e357473e+OTGx/FMvKb9oVni2yKZtq2qeQ/gdXvXOn7AErTsENtUPNXl644qDEwP1EbVbTlwyvcx7emLoAc0PZjS7OYkmVOyHoGsv71YgWv8Eh2T//is+qsDps0bEtcEVYutY2ToXt1W1x+sDcQv6aw0xmLvVgHlbS18YBXEFCvk0AQqsue8GGCTXToPgAQSdihP1iaBtI7FyaCKgGi0ssOz6REawbwpWxduYy6Ah0nslNkq3KYE0C1ZXS0343wtOW0P4KwF2O1cLOXwnJbm4Chf98s3txXsJe8POCBi8OxbFkTZ5kCkbNJly+ZCg357yhsQY9s3vEeGQkqAX57ms3FQ8rHzE1QsRgafxTPShXG+cvZkh5sMes+/65py3Bdu6HCOt084J9q3xaQHOPS+ivGjKXKCSKcXe870lV5Aw4KFIjc+qcJ0DvhCOrGKi7q7ViNWy6xYdlvdC+6KlLItbR58FYDJIrM1uf9SLqUR6hkQGpcycP50XjebG1t+PvfGWmOnKt33ZC74Ux5RZqkYQEClpukX+N3k8gE3LJt/YQU63qUl676akWRSZIYLlN9ybbY+mflQNj/KaSdIhp56BGp1L9WmdzLWidnIoD5BOHvJ2L1xL/bk1oTf/Zd/4FMcfP+P37H1jTZKgbCl9YBbsqqTiWpE/4jyDlEDsjCyCHbpHLbj0pFuaDTsfKPJhntO9U8bWDijGrbWFLGW4AxedufCqRWeqTvwLRHOk528yIe0ofxxoC3YftM4Wh1iImz+LkHDcifZCWxaZQEUs2B+ruINrSb0SYxRXv7Ud7n5AdMWJ7ezuleugppiFkzLOGA1Uy2ePrN0mEqOeZg5kdZu5GNvY37X9yQIyM7WvixW+F52Z3Mb9zau4n/aJxhMcsCofSxQpgWQI1xBh3XpVOYEzsk5h+eFDYUI+9xzmNYdgLXaq+8JAIiQNIiUTD/P4bmkSimvN2IrAHjarxWAwRgIgxv1WspyB3eiadmsdvq4GJ8RmZ+wgCJXjmUlUeCG5VAjAQ/nTd9wnN///W949Tvf/fg9/Z5rNUkHVVCh7PqUYH2RPPLeVSQEi5O2NVwca/m3oyULWARa2xjb9FjfUjk0AvfG/c3SbtUzk1CnPcJWjMNQngK6JIFFW1koEbwrJmK7D971jaehGZU6hNHTLsEivaLbmGtDc7jYDlrc1hDlqjkyC8YJzpnX9JlHWtm0Nlv1QA9DuED6rPB8MeTzfHzPGCMD24s4MgNcv4RLRPDGRfjVLC6jRqiQ58K0XbrsaC/GL3IxuWe/3vxSGmoIOuup9cx3mlbx/JDBSDWJuva7gDCirEDaBHF80G02Tm15Suu96rp+ZUqIXgpClwSxcF9MQeWGnEKLtlTq6teAwxRMpq1KNXbhtFGqPp6ydY7IwRBgT867v/8lP8obf/rhB37hGVLRvKNVj+bH45xI1rCldozdioVX+4TnmswBoBNb9SEroD1DcPP8uOyyIhI0Hx6cY+Mczoe3N3q97+f2vixZTnoII9Lmq29Ve29Zi2wBu+7ECLo8YdFo2taei5wPivKeBPRIJn/+Y66XiAB/xuiLcJZ/c9LLEsnpnBMcrV/YTGHZxsVaXyMuham2/ziI9ue4vtaAX2vArzXg3/6a+3hfZNKLvOqtQMmlgMl6MAkFFzA9epI/YPacVGj67K0HMWuzAt9apEIHyVyLiSUIA52D4BrwZJ7ZkQSgme9cCrysV40e+eSnyRpUKNN9BLaZm6Dzuc5lS/fkJ8cKl5nnoaWaiBw6brP2nFlCsXHviR90cX5or/gNvnl65n//T/+F7/78Z/RjWZSNgbZbfc5KPzPPpfe9DvDnBENFiVBaCHYMRiS4d9tuOYxSxX1PRbtIrVl42W3dt5DrW1VXjfeyVYyAKnvvxJbf69YMN+ckh3ytJbjdtvm+C2fgvgqNFtul9FuEEv//2buXXVmW5EzMv5l7RObau07xkFUEqJ4IaOj1JKJHmgjdUhNoQRAF3UZ6gqZeRlONpQbU7FI1S6d4zt4rI9zNNDAzj9xFqoQUCqo1+D+im4drr0tmZITfzNw8F7MdU65qPZoJreZXGUmF4sjP1vOMsrhHMlDUFMcqd1ftANb1B3CVFM3dWm4Geyrb/UcnNwiu11nzgIFoA8wsSnVmULDPuDemRt8d49wJrfatSu/Ox7q2kCshsCYrE5a7JiOQ4IiyUYJHto+V6BY/VsHSGtu8u61SVYqVpwTkeO9syAQMA9xQlYAqKdmhsNpJA+RZWXFGe603bVeNzXVPVcK1vO3wW/RBxw78xc//aZwb8yPwt3/7t/i3/+v/Bpc3zFG7cRW9b2iu6ywYk4bWFA2CfWYVC/M1bwJszWX62DBPQ6waRln4Cpr1+4baIXnqj5jtbQVjRATtUJzyiKC1DPSsEtHqzFTEDiM1RTtvOLtC/UDHPZ/jL+iIMub7RMxnp6GfWX51OKw+KI9AfYxXzxyjbsg9TfkazgyE9DXfm7nzN3bVZLB87d+J0vP1OVTiC8Yjq1nY03l7H0NtWKydQ3W2HeQaAbr01UfXdHO2A0PrjD9Dlxk/48g1ZkEbkXAlrlDxNb6u/3e0uL6x+22sAFQMlmMXUzxHD0iP9nGfmSSmb3A88twhQ9Nrx7zNiSER94sAyIkNVQ66SgPbChw3O9bkcmoHtKF9t+HP/6MNX7Yf8PXf/gT8neJxHGvTR5OGStJVjTOsBPFcRtlGg2bQCNsGy8HR7D/h5vG7VGOH7YG3dX6tIsYPc8Z5XbE7sNpyAFuL3Y2IdRQAeH+P8ulmBmnxO8aM+ZA54FuH5xik6Wf8on+Pn93e8GX8BseXA/OTw36xwV1hufZdMZZKVqny1qd0bJUT6QAiRRBrUi1jHaeDKr3sQKW0qu0rdmL5fJwea0pxr/wMrRIb1AB3GL6uz+o0X7uotV6f7KsC3T/m9+9gWjX0ATfHzMyz5ieuQehz9nYu2OlVQzMKk2b0tErH4FwPFfya3MN6fp8DuSvoioRer2vtcEJlp1fW7BmDdYnFg3wXq7xGDfqiCY56xHN+uYbV7QpK1evfpgI1mMwtnDryYUBFzvNhzA91iGPPA2ErV/Q56+Xt7Qb7rcTCkmsemhg70O9a0cp6VR1bRufVAHm8o28buuzAIw4znZqTIT/XoeSKHSqKjoZR25D7GRFYB9AOTD/R8en6WzlIjofhBjjwGLkLCIIxYkCtgpVlrXadm9TGCfeWD3uVM8zPXyQCUbW7YAWprg82GtL+zZfjQc7JLRRDGmxOzBwEtIboXARw1zXYuEQpqo/EpTLrsmGtACvwTTCsBip1fUe/Iswbeg6YHTMHfKoNFZ6ED+jzpDInQqPGc351XCtLPzttQ+Tm69PCXmVmVdaxAevZNCDPf9C1GCgy1nZPSJVTdJz5PmNb+m29NrhiambVZBZFaxs+f/4OP+6/xTkOWI9DaWNXyYHe7rGTTfOZFmDggemCLvsqMTNgkT3jA8dUYAJNb3hklqCI4Jxn7ORrABBbj9HeAXdMOzEqa9g+xbbt2eByQixK8mxzh86J23Fi2zqq8hWmwdoJm3UtnyYrGaAwwRp8rbMUXCASZSqxguKASuye8abold0IoA4oXufduT/V0sfKPquRi4mugfSAP5VyCd0FbT2r35aKigwIv7ZGfxCCDebAubZsZ8fqsSgAYO0kALAOc42a7MhHMHZlPocOYpHb8uDdHav+cB5crhDM/L7oeCsYlUEJ92vAiCgv4x4lGABgG7KKeA7sK5OyJnRxDnEumkrV8pfV7k0FZvZxI0dDayyfb2Ttink6j6mSQB56LbiceuJNI3NsztjleviBrplYMCtDOtqJs+cEJRcoMWLBurUWbXfLNqXnRAMaiRhxMXDPrOuqXz6b5/gCkLEDVQJW4ryWORVZrRhTBZtqlHdt9fyM2BHjUdd8zIn3xwPHGbuiTK6zcwwC1cj5EZ9rnObyNf+7o4KNz1lCVY5Kn9rqKqEHm5FgY4ZpHb3nYmQuQkRpMM2xTbQBmzZU3nqDwZ5vvg/AcV79Ru2Gk7VODHhfT1VVQhxyLdiIXDt81rjx6efVOlpOcmqRFcAaLIv0teCnayxQD2y9iCtJSFWxtSi3aGZZ5iMDfXtl0cbiSAQkjqskhMbChqnHRBmxmFR/perwmx/rYPbh+fqy7QUA9HdsduTP3WIRC1c5YFfDgQ16/wz3f4+z6s+b4l7jlZqktU9Ai50tEtXrIW7Yal6Ri1wrAzfWQaJsjURt8topEuW5sixYLYJutxxLzyxxEWecmeYC0BScWcIOdu0EqT1kO2540xvGONAn8PXHL/j06RN8zwWOeYe1LNvhT+dIrcWbyoiLeuo1Vq5zXCM4KTBzqOIfLhQIcDwFbSv42NYiBDII/nFwDMgxIMeAf3g9Sy3WPT+ldp0qRpbrB2IeW99TAajVRJis8p5r3Ga2+u2GjjOTGivr3jSSUUQEtyxfJyI4+wYHsq3NxRnHWqjKweI3fysSKmutJMYOzWJHa7zmc/372qXgjrEOjrC1MP58Rk4dJdBcszzp9f7hMUZ0RIDtho6JiRMD+75D74B+HWhNMFXRLQ5ObwI0ecvFyvjazN24+SCt9ZcmPRY8EedxN4ms6b5eQyZWeJyZFS9uyzOiFYq456DxHlRiUV5nXAfPhUc/BdMNbe8Yb7KCpDVu22dbY0CRCC7Ar74C0OscQQGq/K26X2tI+b1t+rVj53kHT40lDWtsB1g28b/TF62EiWviMX/3e/6ovgJ4W/9X3clqDkjP3f1fI5EFsu5TF6yzYSV+AABWOzNVoHbLtgTQuratxpgDXu2XvgMewfiJeAHtadypiKo2a51JIvnYcndA/L78TDV/zgdWUEKu4LRlqONpUgjg2ilQ58+fLdak6p7Y8ozxOh8l1gY7BI7WHWNO9L3jfmv45e3P8OXf/Xucf3di+oG771GasTWIGFrv+d+5zoUobzzNMiE7rvX6TATwLD2rrpFArgLz2NHhqpBm0NbgsCj9l/NdwOETmPm+pAkgEzYdNhG79x9RPrP3jlMmbtstF/BjoX6io/sZySIa7d8qvea543GN++JsmGwY45rKFQw74asv8womIc+aqr6unq8sExvP0NUXaZUu1x0OwORAHx9rHXDtWKzz8vLrz3mLz23J8xdFYk19NMG0qr5S5XYnpl51MipWvxLycM2TDsndu4Jot1GJtWOtpcvIM2/rd5jDVqUp5HqDYBiQr2qt+SPLk7s7Hg0QifXYCvYP2dHtqmwGACcMt13xJ7/8Hv7DwPtPA23b0LPco4yWc2oBpsF7lCQ2cTzswL3FtYBHkpmi+tfYCQuXKDGrhlNvaKZwN5jaGg+f+eh3jY0iIgDmwNQ6s/kqK/f8WQkaXIDTMgnwNLTpaE3h+45dd0gXfNd3/Hge+Pr1gH8RtH1f8yWYZclzwTYMR1NABApDVqddc9MquVw7z+pMU/P3p40gzwkO9WJrLCmQOo6o1usRzwskkxEdmHNCJTbxxFijrXWt5525v+v3BphGPrgxYI2FAEFORqo8Cjqszu2pesOOtQhnbVzZq8l1oM/rQMr6kNYkHlEuTur3e9zsvRYpdItSEhbn+1z5frmI5bYG6Yaok1qR7/j9HSrvGXm/flrt+WygsLIRRNAy5GztXLVjTeIVuF8fY7Po4CCRcWnIBcdckNjf7njH36N3xNbxHhNDPX0NjtfgDzegdkCZok8H7MShBpEbzvNz1GmdiJXIPAhQPCbuqkCbAm0NNnVFrqukhjaNicKcaNuOLT+qkWUuMA3btsfkfmSd7/gQ86I9YGuH2lPWjXkeLuuoAN3zZHWuXWgNqJIo/tTo5s0Qa7Dxt05ReB0Qr/GZ7tbhtRPBGyp7L4KEiAO67dv7749NvMr5VVZofD0a69pVcIfVlvKVmTFhuZAA/QKZn3LynqUE0K5Fv1SdQC3Y1ODOdaCyzbWi1mLXQYB2lVm4gp2KekoVetWktijXEIt4Vyde93BE4KPGfT33hh212+OAxYARHiUX3HGqwXXg7Wc73n52ww8/vGPafQ3udutwr5ISWcfcLTIGRfGYX+Eq6K2jW8ut4ApkyQPDF5hH3XzFvuq/3nsMqFxGZFrYfHr/WMGH1gTWFD4dhh27fMbAwDi/wqaj245RtbWfrmNlcYmMlRlQgyYRwSnRrnQTeMsDzmFRtgPPi2uKufW1I7N+lWWwW2ZbW1cbxlM2fr4Oua/yOmq6OnxkEH2z21qQ8G+C3o5pEyYDfV5t50dgiNJpKxEOVx9zDdp0dTSrNrpvqz0zGVDMWKDNdkPnjOzKeDDW9mStkUeW9oQDo87ykciOi+CLwaTOmDGM3K2yBlTNYJmdJlDALQ97lfU6tWF9zl6fMWIBvXmU1oq/W5/jmvXm4Y/XZ1WDlPpeha+SKeoTtkVw6bQb2g7IDdjOLHVksf1eVeFToh62xCReM6MONU/WhlOOyG7FDuTrFVzjBG9x1kdzR9OGYQOebZz3CN2JSmQPuQG7xj7YLj4CSjEAACAASURBVBAT9D0z8WqbvwwMROBgu+1oD8F5PvA4BPvtLc9iqYlO7AQGcJ3dI+9rDrNqwousmt5T7coS0oHns4fWricXNG04HesA9ZVEgyPDgwKg42xXsHLOiS76FGL845PYXn0F5db5MFH6ILIQ5+rD1kKkzSvHBxuknasddY+SUpUFZtXvS5W1c0zo6p8i+zsPg85Aypz9yvjTyMKq0ZYigpImDRBFnwOaRUWqhrVBV/vntuGs3T643l/1myKaJReAvcZFFrsKVePskmOVoaxyAYq55TM5gJFZXvV7hk/cuuHTdzf8O3O0VVjd4uwYABpR2zgHFVUTf64zUmr8sItF+RQRWHMocqG5StRpvJ74/yNTPIJVWR7Jt5W55i6YufPSMjOvaYsEM4syXXeRnPRf5Yi7A/fW0fwBf7wDvUGbxLkCOta47mqTAfi9/uNp8XysMzNqDL/uAUSW9Mwo5qoiYIKZZWnMq3yHw/P+6hB8rKUFjgHjPXEMyDHgH5gcUL3KXAmuXXZ13eLaZwkmfVoCqXPO0COzGlcQCi7QDJa6b7AeC5tiUb5KdGKrxanW1y4H1G44kfWMPc+JgVxAfprnGrY1fNvW14COAxWircXCPfuTmQlN8SsN3Y9rsRaAqkXZOkR7Gfewr+x2axs2y2slcS9pa9A2oc2g2jPDVbDfBNuIsZ6go63dUlh/X8yhGuMek1xsM89zjZDBa18BBuCa+wO6dof34ZAj+jbvDa13wGVVH0CWLI6gZ4ysNih0DjRrULe1M2/tAMhE12vBNbcUrsC+rbOFpnS0M4L2Na/o7quNnn2suUONEZ+fiImOlmd2ilSZN1ulhgFcpa/yJ7d5h9rHea4cCvHHGoPUGUgTHufAVbB5JZ1no2KehSHiXrkqPsTvFTN0HGtJe/7Orrv43LIihF39zkqQ06vctNeh9E8/3y2DTXlWUY37e94HX8TRM9Aq6CvhEFpBKQVytxQQAShVxeh1/vcZpdjy3jHEYvSqnAwD7AFRgYpi9tjBayb49OkT/uyf/AV+e/wdJhz3h+YZRoBqw36LNbWWZ7pIjhElhpPrXl9nplQquwBtbmj5fGz7Lf+1ZxukkEhjy/eUr1UMnvep2YkjA1M4zxgPuqKbYgyDoeO0IwNXBwwT861jyERvjt0F3R3DDGdWIZja1q48xxUzuWWJvtY2nC3Pt7Mbrtv/CkpWye3ZBtQy2CBnzjsdXmcIzqu8dMu1RRHB2D5WJaNYU9jXOVNrjCBXW+h6rKQ+zyQtfxor7KZYlQry/de5VqVGBg3XGclW5Tw1dpzHz9V2iLHW7+Pcs0jurHJsjlvczzZj57PYCvJFnsBAn5kQ4z3mZxmcqD61RogKrN1m9Zq6PoAu+PTzHf6L7/D1V78C4IDua7d6cwc8X9fMYGeLaianvcNn7mbSuXaeqvWYq2qDyw0DDTc3nIIsmR8JoO5R4aQ2uPTq9wXwcUJUcTZd7c0qPQyFaySYwne4CbYWPZKgQadhE0WTDd9hg3vD48eveO+G+3cduuWYXHL8LQK1HXevYNw6fXU9tx0nZp4fDG/XfSOOmWPPdb95HoXgHgm1QJS4zCNmIIbaJFP9j2FCpOV1v3aIQmcEhXFi/n/dwRQN5VVzW9eCnK3OcCrQrQIM1dG+YWgeOutARfvqAahMBZHKEMiLkG/KJd6giGA2i8g1ALE9s80emIKcAI/r79Z2c78irnBgzBh8rIut7zDEzzXD08ACiAGfrU6vmcbik2MNKnbb4RKx3qGKmXWwJTumNjqaVumA2h4fZ0aYGT5/93N8lXeICG571NefcwIbYBYP4Rrs+oDMDQ2KGwzjmOi9Q92jzv/2DpMdkhHrqJ0YDwGkYbtv0BbXeYMAZ2wH7C22nt5utTsrXp9LZOn4IxY7dUYJDTsMvp/wFVi7SpbEJDEDj5Vlkj3/NoEod5iLOxmMWhlEiAXT+vjXQvBTyZrKIHI1QGJCpbZDAQg6+nyqfexZmi9HIYIN29ob/TGYPDDQseUgYOJcWTC13bBjRhQdwBUt79gy82OumsWOmvS7AVdpgeuctByL5KSyztB6OmNiNUrXRHi2A1VT+jqIurK/DbNnmSmvQzgFnofcrkyf/L1Hy621BlhOniPjKAaitfgaB7ICEEGXAxMN/ab4k+8/4/3xI+ZPUQLJ3fFwXJO4XMiXOWFZQsm2louRkdVa2TlxWKWjiWO7RVsx4dikRakk2yAzSo7JiN0GLnGgOQCMvOYxP4yyl/toeJMbjiG4tx2YwHEM6J4tmwAjO45uPbJEpOcu1NwxIzH4rjrqppmz745TzvW5jGqyDeh2R51BU6rdBBrmOtz9BqzFuliIMegKqJteB4tr7gI8+rVINKR2rQh0TqAp2jDIB6tpPPqAr1JzVzZrTHIrM2NgLbau3RiyzlowUUhmP6nnRL49UAddKgSO2OEyq0SYdXgdYGq4Sn7kLtkBi8klAPceZ2WKYNpTI9gzR8AHmhmaxPMQf1O/yWqqhfnnAWmcJ/Pt+T09u9ZmQH/K8McKllyTkppICWJwAjWgDXz++Q19b+hvW9Tc9rEG9HEA7ZGBgTuQB3h2iYmYY0Jnj4zVVmcxKlpmFW5DIT4iW09yd/TTgo+aAU2g4tg8dkX1PBRaYNCukGzbR7ZvccaSYc4JU4NKQ1NAcObi7L4OlQbiPI5oF2tMonleQg5483aqZ6kZYIgB2RWAEEie8eJ6ZtkjB5rkZ/+0ODGuRdsIHEj+nGd9+PFUquiPr85Xmk8JLxVAjYXqCCCsta21oHUF16BRNhDuMB+RxQZdY7QmE6MyrjM4KMgsqvVCrp0Y8HiO1xlp9WxmCblYZl8nKkRmd9bWrvJFKsCZfWWcJxHnn/R1fujI8mCI8Vdl3da5Q0+78HQ03HNicrYq75a7RxDPk2f555r3uTqmPLC9CdreMI7sH2bDXJOMPOgVrY41jUXdFcGN6zElrhqQixDZrh15DXrfUQfRTjfc60XkIudmI8Zxkmc05bi6uozTBywXklprmO8tzphpsfOo+Y637YbWBT/oF3yVaK/OXPQT71d2siiQwfYVi0TDyMmzwnBbuzVqRTx6LM+xT+1GGlViT6PQmgNoegXe0LJ0hWwrgPNRcAzIMSDHgH94EZC7zgjSpxJWtcNgZiLmN93s01lnKhMyr7LuQPRra2QpA5gt7/kKPsoKxpmMlfxQbdVtRojI3TF0rjntNhWSVVAA5Nz1jDHVCoAA3WYurOc6y1pArISIthJfqiyliqKvtrTm+RF8aytgnX2wRcAsxodAz12CaB2nCbbbjlMfEXTqCq9+0La1oF5lNBUGSAQh0W/rXOnakbHl+DDezVV1BRm40KdEVVHHtOu+VGzw9nkllQ4Z6Nnnds+1DUzIppGMMc+ns1vqvd7y/FTAZWItg61derlA6LHLqsaGvc7m8WsX/1MWzfWZ6z37eof0E25PyVeI8+7mzDO26q3nudWxq+D9CnZ8AIr2bUngOATxWkDO4JmtcUWWCcb+tMOoo+U6jT8tfB5aiWEWyWvZFgKAzh6Lz44IHNe8J1u7bvsK2k051+eDp78Jj/WiqRMjE+NmllPOooSA527duiczgccxIDLhZthmJgeZAVoHa8nqX0UFZ42xcjzan9oXE0PL85q+5uv807/4BW4Phf/KsP244TZbVI0wgY5IOq/xdKQD7TAY1CzK6vUer88rchclmU0dfa81tdzd0rY4v00UN2vQfKZW8HWeuHbJRhDbckw6zaD9FudwOoDe4PuA9SjZ25ph0zhn8zDB5g3YNnz98UdMP7LE+VPlDHeIxnjyzE7VdMDtnjsRJ9oa4+WarkW7KiJxZqhHGUuXmGM3P2I+7rETt6/y25XgJ3mW58eh1qHeViJp9SUZ8o+vWQc0xsZVhcXXeC8qEjSL5Nc4962SROoZ65hVtnud0Zg7xIG82eNHTGLNOpL+V2ZJ7nYSnJkoAH/kblXBgfeVDHH1RQNAjwQDsZUI1rJdGOLYMtDhvq+dwXUOrsuGdxj07TM+/1nDqf9H9JV9h7tlFZIsSa+OrlETPIKngg036JbXExMzS+IrDN1/Bp9ZHQ3xzHZBltmbsfYhcd1VJNaNvM75zP7csvy9yColHUFUg2k8gyJHPosS6+iSyWTe4TaxScdbu+OTvOM8T7w58HV0mMZ7qNCIt3we3aESa0PAtU6uLnCrMqTnGkevNSxEclKsbb3HWdN+nfHVrEP1sdbkJXeqzixnqL5BtM5AxpUNscacGrv+/x/83gDTmtDn/x61E0T9aWBlV631tUjQV5aD4EDDmkkCiJ0o3eMcipgWVWOSHTkEMzNON5N1WHrsFHOIRZEgz6im5UGDqGzhK98PQF9RT3g8qNMEoj3LpMg6z2fKnh2LrwHco48VNdxzEcm6AmdN0uJgciDW5OY5cN6O2KUrUQ/bPba3ugLmhk8/+wS9RYk83W7Y2gb3jvNwzDoPKv9msxGHU0qUKNxcV7GV83xAFRAdkN7RtV8dkkQHOx2wbMT77Hjrn66tc1Zb3+5wxELodKC1DuCnGAyPgTeJsgBfp+N8fMF2v+MR+wGxTV+30dTMXnl6B9OjrIwjMjPajEtbh36LzWsWiityX42RZ7wtbrsNwJkHj2Xt61pSEkTdzGxg3xH1ouEO94+1g6kyAYZVdkePBUbP7CoAD5W1dfYaAF/baHM9KSevIxuzuQZ34pFpFZ91LLSY5w4PxIREsmH0mfc1sOqxNveopw9g5PPbLUodRW7PQJt3rN7JIxhY2ZGzveMqDRDfZTMar9oRUAOx+hX3cVsLQd2/YsoD+yfFpz+9o/294HyPs0piQWFbk8eWixRD4uDN1gCVr4jNKvH8vatCbGDbGuY84aNh9jPqDOsBnN8Bqjgl7sE+G0wPQOO6jOfdeRKLklV+Rrpg6ANbB77XT/jy5Qu+/ObAud0iywceGUWei9aIhZaZB9tPuTqpKiMwHOtssoa+ssOOXICX4WvwuM1r52UFDazbGojbddesv2PIg1GR2Wdrobxqz19Z5a4RNHD3CDgjzjv6QOvgAAD3CahCbF/vERI7cevQyyjTuVLM8n9pllqthdvnBIjoF9YuSAe2OsA3Mz5Nx1MmGOB5GHQNbpsIqlyfoWPLuv/V7o0xVv35JrjKm3hl5Sk067sPUZzZD0l/5OuQlQW1BhgSpbHiWbwWipprvB9gXQexiRuuRclmBrO4/26f3vDp5zvG1y8wnTGpWQeDV5YfInsMgLYNB+KA5N0F1hqghjay1rYppHXAY4eW1aDXkBmvVwaoqKHlvZmxDNiI0mfbtmHgwE85kI5zgBznEWWOBIpNb/isP8NPX3+C/XZgTsB/0XIBWtDEMovM4bWY47fV98YuD1+/vzKL6nOfLT5Dywlq7FDr0W67A+qxm9piMTQ/gcgGBqDYMN4fETirLtkMxwfabzF9i4zjNaCqBYFrd7fCMPHtgkgtOsOBfZ6rvwckS13URCna1irvsw5cFcE9JyaVxR0BxPg8zjwgWhDPSZ1Lc525ESUD5jR0U+y4r0GVmOFsJ/qoZ6XFou9wVB1+96uU19AYjQKRZesO3Oa2xip7jvVQbY7Ha6rPUTUmXbGbscpfObTHosYv/slnfPk373g83rFDYJZlH2NKjw3ZFwE5Ac9Fx1lZhoJzxs9M39cOCcsJ0OkPSJ0Dg8h4VFXIyGs2O6TF67bmEG0YDrwfec6GxifcWkNrDvcZ5fAsz0OTBtgdGzr+XP4MP/zdv4Htgv3Pv8O+7/iyH2i56HlozBliHbPa4Yk2a1djAzR2kK5dNaMhdvJHv2Q54cY6JyhGgZ7Pau0mPNWBpvhxjm/OfP0IOAbkGJBjwD+8aBJ1rUWsfkvG2uHT6ntwlXd5Xnts1tGyssp86ldqHWRGaxg/V7tWfKy5p4gDWRosj4DBu8aioDvQZIPPqyySIO5Z6JfYGaYtyr9BVmLAsBskE3NMBaN2AeZzs1mLwGgGMqZEmTeTGBdFMobk90awK97/dd/EbmrBNiuxM3YkzznQPt3xvp3QrcOOeL9uBrfYfQAA0iUXCm/YJUvojQ7VHMP5gdYUX7/+FKVOVaMMY+4s0FoU3TasMficGGec87O12NV+ziuJaWLAu2Ti8R3mjs3e0O3vYcOAoZiVXLz6/46tFtqaXGOHSjSWA45HLkwDYp/ivqjdcDJwVlkg0XXW40SP3faIZTfP/4F0mHuc3ZVB9gnHzOf3loGl0xXTAXG7KsV8ADI3wKL1eQ66Alj3jsGvAF0dFO/9KbEjkyFy0RsADmzw7KsByUdS4tlBJIvUbgzDhqr5UKWp3Tx3zAu2aXjvsai7Z5bdbAPDol81ALAG0TiyoQG4nV/XQvyE4sjdsCN3NcFybJlltSrhb2anK26o5KbNztWWVLLZFVCJ5mNorX1FQvn+pvjlP/0PoN/f8Kv/5X/Hm9zRe7Rdu+SugGwn3t1hmv2Ze+7SHjCP/vSWZ6NHAO1E77Gro6pwdBNYJppDYgdTBPNynXNrMMmy6O64zXh+R55deYpht1izxeExJp2KrW2x29c2bFNx33aITPTTcPcrkNwGsK02Nk4SrvF8BBoUz2dG1XBtzwXAIbEPxN0Q5XtrnTQS4qc3aJ7HuJlft2gmg5hODPs4QVsgx0g4VpthuZNyKq62KHdcA9eaJzzH3IhxZCUjyKh+e8bO2koKzGD3rPUNjxlVBONP+IxeqAZhPvsqmTwb4P2BY54raaEp1m5qzGuzSSXAbLZnH+M4+sDR4xmx3CnTpKNnta5HsxyvOCTXcd+7YlhUIfvuTzf86X/4S/z617/G1x/i7KRPcgNuudHBbM1Da+d6E4mjZ8zh7QGgrs+Or2poreHmgjEMG5Bz9whszzrXOn+3tLnGywZg4ETThuYbRBQyYzc0HGhDI8glkokLwGOLfldcYg6ihtYF3+t3eJMd86eBYQPjN5FANzZARXA87eDTETtoN7uOZ7AMYB044XnC6ek7tmy7psTnG12TQTTWgyai0oG0mfGJDltxnQ6z2ASTo48M/uWYHcBjvOffv+bkV9WOf+j3Bpgqu1bV1gHKEfk3YLYogfZ8uNrTxEZygBalP64/E1khijiPKYt0ZCdV2T4mEg3I8wQKwO5xOKNNheVgZvixAlDIyzLnFZXt6PAWg6xRNSr1ygh3OM4sP+Q5SXO7tpo195URODXLSYyva4dO9/0qSSEHtMV29SMP6VNv0JGZGTlxlv3E2/dv+PWvf43RonRQXILnbJhrN9eUExFeUjzahLWJHTeYW17H2L4WSTA5cM46DpsBlal6imJrEy5PAbizwzUGU10BmXFA4JEd0ESHSXTSzTq2s6PrDba/Z7S9oQ4LaQC8Mh1Xff1rx4BYHJwWgan4tintykJ0XLWPc4DXTFdj121iap3VEA5puOcDEp19LVScqDqv/QOVHAIAwS0DtLfM+okaxSaPdd0EAsvI8SoXaH2V9QKugdYK1mGuBkg97x3P7HFE7d0qT7UOsHRci+/jtiZO0h7osq2sWtX67CpLTaFtZBAvt84DmJmJLBZ1pON5r7MhokSJu2P6p8hG82u32WzHqrJoumGK4hgT2+fP+PT99/jNb/5PWA7W71lCLBrJnOTN/B2tw/aObicguS3Uojk5reN+v8d22jFgc0L7PRatXIH5GYBi6oGx2hWDWrVNtbMO10IdDHseNvhp3zCPOHxbjglFwwHFpln2BDnJkCzD5g7z/Zq81oRX5roXTB2atajbrBKXHeJHToIVZv2p5moEW87nRbXKTkVcBx0xiYsarOcKcKxJgjd4vpbuCqnt0XkzvstPq+TGR+G2ZWnQbP6zLNf0tt5XHdoYsr+Sp4PHfVv/vgZMrhi1/Vwkww5YJUCjnbwCUm2V4YpAUxxmf4UtND9vq0W7Fn1X/KutmYkbcsLsaMidm4p8jmJxQwC0pwmprqCP4KyY2NNtMMWx1wHYK5AFTK1t0gOOASgwMgtUbzseesIA3EaOCxzYzfDIWvzVX7VcmIxED8Fmsa3bcxewa0O3yj5taJJl/kTiDT/dw9DoX+LAS4PNzLLJ/sIE2POAznevhANdW8N3a9h1w8COzd4hx4DaDVbZbXJeZVszghV9TV3LscYxm0fCy4GaBAGCAzKz/86zUPposc1dYwHVc6Hptkqy5GAz75XdJbL683zL3Rymv3dY9v+rdbZWZretzF0xXMWJ41QFANc99VQma0KfFhqu3cYXXQsJWtmvdgVw/Pm8DGw58J3XGEbfVx+AOmNyTXsAEcXMkrrRFiDKheRu51WSQmQtjgBY55PEKR5XMFYQZ/7UWSfRf9aEL7N0NQIfMYmOcaZAgMyiNRs4ukIV+O7Pv4P9ZPjtr/4vfJ0Nd7ljwtE8zmobTa6dIr2tnZWn3GOhwlscgOyObg/o9gZBlpT2GZP3bL+bGaQr/Gli6GqwzDRtDuDE2oEIAEeOTVXbyhKExQ4IQLFtN0w8IG64yQ7xHT473s93tL1hxlMDFcUNE37m7vz6fF1X0NrVUBmDdRbR5rGYAgAPaWvn2pociK3+Mco4xO6CXmORD7UnMHAMyDEgx4B/eOKxtlD90ZS+EkOqvY6euhKOMuAGeQowDJg+nW0FwJ/WMBps7WyurHLx2lEhGHiH5wLcrDONEeXdHb5KYQHVnzp6BjHRrvJVglyLyJ0Fs0sOj/w6JD3vpbNHOR0R5BlIE2K5mCSSCVQZgGwHkFnjnovhU681h9j1FuPdzTeIdPzyT36B8asvUAXu2w0YB85pkVy1zqOO33/TgZVQleUdAeDEAR+Ge/uEG+LAcYPEBmd3SItdG00UZ6456bahm0O3BpUdmIL91iIZSSXOJ0QkRKlk2axD0G4ddp7Y3gW4t7VwHYHteN0RuHhan8rEBfORKUgCaAQvgGscbchs4fgk1vO6eQR0bSJK7Elc2Kb1w3tGGw7s2Qdqv3bm1O6D1jaMD3ZudCQwZCmm+lIDrHbQAKgderU7zuTAVXby/GYiEol3E9P2XKq7ztCpM1gBwFvuqpm3uG8BWO7wbE87/86maLjBzfMMoOu8rGizMnjk89qhq4rubS1KH9n+bsA6r7BMdVzlZJ+f+eu911Ndu45nG+sMvKER4PYcsxgM5+54zBN2B8Z3guOn+F37iHOWVBXWco6JAc+dv3HBcjeJ5T3dG1rPEoDi6wyYTWvXSszLIknoxDhjHa5KiAoaVHr0OQIMHBgwYFqWQ0eWEhM0a5jT0XvD9Dhv5zvdgOZwjd0bBkSJvNyp5/ozYLXJV3IUtOUu80i+RN5hs9aEV/9zHXECVxwqcNU8a8dyvhElbb3JmtdZVnayCXj7WM+UOLJPrhJjeU1MIGstWtc4eeRZSeLt2kHjN6jE3HqVPURbY4n1W0XW4ydZUWLmvfS7Y2Ov1wZArGO2MzdHOMwBt2vnpUIBu45wKWdVRzFbO8e0Srsi5v6QKPuK1a7W5z/hGkHYH5vj8y8+44fHD3j8fbTPm27YZlSH6OixmzjXG9QVUMMpHSqKt9roIoKpBzbvmb9T91ckt2Y+RZzp11oEY0XgE3jgjDNpqx+eM54r99w1Vv1KlO2PJKGa3zeMVmcrCVSu6idQwdZ6JPQOw9evA9vPPwEuq4x0nKc7r/WOdXbjDXBgqK+At2ZiLTx228ZZpuOakzdDGw51wXAA7pEkghzbY0LzzCrLQBn0RB3J4D5jV2pWAAEAa3pt8PlHyHMjSkRERERERERERERERPT/5mOlHxEREREREREREREREdGHxwATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDARERERERERERERERERC9hgImIiIiIiIiIiIiIiIhewgATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDARERERERERERERERERC9hgImIiIiIiIiIiIiIiIhewgATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDARERERERERERERERERC9hgImIiIiIiIiIiIiIiIhewgATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDARERERERERERERERERC9hgImIiIiIiIiIiIiIiIhewgATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDARERERERERERERERERC9hgImIiIiIiIiIiIiIiIhewgATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDARERERERERERERERERC9hgImIiIiIiIiIiIiIiIhewgATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDAREREREREMvrBrwAAIABJREFURERERERERC9hgImIiIiIiIiIiIiIiIhewgATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDARERERERERERERERERC9hgImIiIiIiIiIiIiIiIhewgATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDARERERERERERERERERC9hgImIiIiIiIiIiIiIiIhewgATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDARERERERERERERERERC9hgImIiIiIiIiIiIiIiIhewgATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDARERERERERERERERERC9hgImIiIiIiIiIiIiIiIhewgATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDARERERERERERERERERC9hgImIiIiIiIiIiIiIiIhewgATERERERERERERERERvYQBJiIiIiIiIiIiIiIiInoJA0xERERERERERERERET0EgaYiIiIiIiIiIiIiIiI6CUMMBEREREREREREREREdFLGGAiIiIiIiIiIiIiIiKilzDARERERERERERERERERC/pv+8f/8X//J87ALhOAMBoBgBobnBrAACxjiYSXxeP78M7pvv6PeodqoqKZ+m8YyL+3d0BGfG78veITrjP9bXm8e9wje+vn4vfBnVAVeEzXp+LwgQwM4h2CMb63QDwsIEp8VrEDd2B1tr6O8Ptm+vgJnB3NIu/ozCoOdz9m99br+kUBdAhIlAHhkyYGawJROJ3icd72yawWf49MZjE7zk134sL1OK17i4Qies+Ifn3DNbm+r1zXNdFRKDt+p19Pl07r4/eACjMDFPyeqoCHl9zF7y1eK3n+fV6r5rvexosX6uI4Mh7YGbosp8N3TeICEZ+5mYG9Osa13UbMtf17DM+f5UdZ4vvMcT7nXNCPF7nNhXNevzOaRA9v/lMJgQTHX/9l//99cU/sn/5r/+lA0B3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cH5mH2vAFyOALJs+zzDVvXAHNFRTlKHwcuDsipej44EBOw3fffiIoRF4j6PcBUVijlhrhUKiaqwZzsxcd+xFpdipPXfNRYnCUfsa7wjKKisfZcZzMSV3fYvp2sE9x6TqWCXNvwYHDkAfsHVGTo9kg9/5iO+D4NfduIKO3Ma9/j299PURrJj3NN8d7LPSal7bmAtddhfORZ/rZ8k+rOCW77/D9YGiCsAiOUoVZj3Kw2MGwOOf+5if78DIQD28xLEDAIpnlRY58PrxwJ/8R3+M337+FfwRSTNqsStqVEUbB4aPqFKT52gWvUFU46ynmXyj8ecOwEVwy4lNR8nPJmiWiQMnogqEKk6N8rA6DB2O1hoOA043mMdudRfgqDcMO3H2gaMceGkDpSmi9DsAbbGY54KGI84jfLvD7x/x8nKD4csa48eHvC7cS4wvs60c9W33hTleHnOBwh3AiIUlIPosj51ac1hSvMDKTA7LZ0kGjlmmXmyfDZcN2ZAz3k33PAvLMm7z9ZQb/zHx/NzjZSUhAnEGs8/FgnHkmey7fTB/7Coslx15ayeU11URIJIScjw4zx4WrPLfozwygdxX5Y162SEPxILefPf2h882GpF8KyJrB7VhnxcWY9wjE996nnEGrCRfA4AYL55QQJH9wUw4AxQ1YgmrVPJn3OWBU07cXivUBtBPWCaeqssqBygQuGmUoDTLs44Qz5wAjzIgeMOwaNdbb4gpmsGsQ4uiKzD8hMJwVofXCsUL4I7ed3lUE0fRPPd+VqFRWddf1FBGRUHFTU6IKNowSH+DasRcUSKGO88QE+3oOYZsJrvM75oP1LXzy7DP6ZLLDlm1WcnoADK+F8OS3E2WE1tTX0d0zEWnanW1p3rpl+e9iB/y7x4DyruHhoiIiIiIiIiIiIiIiOjf42vbNEhERERERERERERERERfOS4wERERERERERERERER0VO4wERERERERERERERERERP4QITERERERERERERERERPYULTERERERERERERERERPQULjARERERERERERERERHRU7jARERERERERERERERERE/hAhMRERERERERERERERE9hQtMRERERERERERERERE9BQuMBEREREREREREREREdFTuMBERERERERERERERERET+ECExERERERERERERERET2FC0xERERERERERERERET0FC4wERERERERERERERER0VO4wERERERERERERERERERP4QITERERERERERERERERPYULTERERERERERERERERPQULjARERERERERERERERHRU7jARERERERERERERERERE/hAhMRERERERERERERERE9hQtMRERERERERERERERE9BQuMBEREREREREREREREdFTuMBERERERERERERERERET+ECExERERERERERERERET2FC0xERERERERERERERET0FC4wERERERERERERERER0VO4wERERERERERERERERERP4QITERERERERERERERERPYULTERERERERERERERERPQULjARERERERERERERERHRU7jARERERERERERERERERE/hAhMRERERERERERERERE9hQtMRERERERERERERERE9BQuMBEREREREREREREREdFTuMBERERERERERERERERET+ECExERERERERERERERET2FC0xERERERERERERERET0FC4wERERERERERERERER0VO4wERERERERERERERERERP4QITERERERERERERERERPYULTERERERERERERERERPQULjARERERERERERERERHRU7jARERERERERERERERERE/hAhMRERERERERERERERE9hQtMRERERERERERERERE9BQuMBEREREREREREREREdFTuMBERERERERERERERERET+ECExERERERERERERERET2FC0xERERERERERERERET0FC4wERERERERERERERER0VO4wERERERERERERERERERP4QITERERERERERERERERPYULTERERERERERERERERPQULjARERERERERERERERHRU7jARERERERERERERERERE/hAhMRERERERERERERERE9hQtMRERERERERERERERE9BQuMBEREREREREREREREdFTuMBERERERERERERERERET+ECExERERERERERERERET2FC0xERERERERERERERET0FC4wERERERERERERERER0VO4wERERERERERERERERERP4QITERERERERERERERERPYULTERERERERERERERERPQULjARERERERERERERERHRU7jARERERERERERERERERE/hAhMRERERERERERERERE9hQtMRERERERERERERERE9BQuMBEREREREREREREREdFTuMBERERERERERERERERET+ECExERERERERERERERET2FC0xERERERERERERERET0FC4wERERERERERERERER0VO4wERERERERERERERERERP4QITERERERERERERERERPYULTERERERERERERERERPQULjARERERERERERERERHRU7jARERERERERERERERERE/hAhMRERERERERERERERE9hQtMRERERERERERERERE9BQuMBEREREREREREREREdFTuMBERERERERERERERERET+ECExERERERERERERERET2FC0xERERERERERERERET0FC4wERERERERERERERER0VO4wERERERERERERERERERP4QITERERERERERERERERPYULTERERERERERERERERPQULjARERERERERERERERHRU7jARERERERERERERERERE/hAhMRERERERERERERERE9hQtMRERERERERERERERE9BQuMBEREREREREREREREdFTuMBERERERERERERERERET+ECExERERERERERERERET2FC0xERERERERERERERET0FC4wERERERERERERERER0VO4wERERERERERERERERERP4QITERERERERERERERERPYULTERERERERERERERERPQULjARERERERERERERERHRU7jARERERERERERERERERE/hAhMRERERERERERERERE9hQtMRERERERERERERERE9JT6h/7yn/0f/9zVATODiAAwuDsgHYIOABiiWOtUHt+uikIccHdYEUB6fF1SBzBKfH0xFLN3P9fgGBgAAJGy/ryM+P4Kg6vA3fHwExVH/H1+m1MeMMH6LPCanx/5mU9Y/kwxh0LW51+fU/LvZX9uAOvv1+eyl8vXPODu0GJwj+8pKFB0mBksv+dQoHhcywJZn7s4MObHdI3rJwp1zZ99rs9wFoWqwkVRhubXG9Q8f8e+vt5FISIwVOgY+z6oQswvv5PgcIl/1+Pr3R2u8aEGFMPO9VkBQOXAkHhGDBWKR/w99j0fiOtvstcz1zVrBWPM79lRh8e9kni+3qBwucV1tWN/rTnMDFU7REd8f+s4h6x7HT9DARj+/B//T/sB+Hv2Z3/xT9yhUMzPqnmtByDxrg3Zz6Jo3LNiHZB8B70CiPvqEvduIL5HPNsKuK5rOb9Xu36QvMbzWZ3f090xvKPmfZ/vwny/AcCtQfSEiKBLPCdjjMv7alCPZ9Qsfo4NhaKglAJ1Q882RDW+v13aAUXHwPt3EV7Xu+I4kY891OL31OEwjetj2oB8b4opZBSICAriG7xVg2vHGAMwx6FHXKMzn7+iwMh3qDpUsu3JdstQMSSfa3/AcYeIoOXrJeLrupjU1ca1903d+r3jOhmGdqhqfC6vKKXE13h9d30cJ3pxqCq6A2f+eRvx75Rrs+XHblfy93cXFM/2SBSiZ9xDzWexnJBT92f2I541j3etiENk4J/+V1/Pe/XP/2X0V/u56fk3l+uW78587wCgQDAwsq3rMI2vK5b/vrTVBsWf27vvf+3bAMBt91ma13P9nQA3i581+5ZTOnreCykKMc1nIp65ofrudyiev9ew/b2HQDX64p7ft3bJ9qFAPB7MXqONcHf4bI/XdQLEDcWQXzf7HV/9afxB/Lm6rvdxWtc+f1fPJ9PyWosUwI/8+ujp3R3F4rlvBvTsG0f23fFLxz07vcb3dYfgDaW/xd+3HvfUKyzbszIOmMU9OLHvaUG8b+rRL1/vzwMNZ8l21R2Q+P6a178YUCw+SzGNsQx2u+ACGKIN73pf/WjPz6GXsUgzg2cb8SZxnR7i6AX4H//R//ZVvFf/9F/+CwcAHfGLat5wk3PdU5MOz3FDyWdPzPc1NF99GGafMmS1NfPfja+L+y1S1vtndWCOPT2f4+KG2W2dw9e7YtnwVTiubZ32bLfzPowcFwHAHOKJCGSOsdTXzwSAkeMSlZf4+WaAWDw/UGj+fccDtVZ0Gxie7YDY+ixD5wujsPwzHQaZfTX2Z5nMDAX7f9/yGsz3EGLoiOeoONY70yGr/x2a40avUI3v6dZQSkHBG8R3m6aO6H8QX3NYgR/xzg447h59qViMUSrGeg+KY92jLjE+eJTdV9sAjp792tA1n5ifOd6zeFcf4jlurND8Wc0Momc+QtmOmcDLEfOU0TEv+zmb4WGACf78v/5fv4p3CgD+7C/+hcPP9b/f3e9sC+B19bt7HvIF+7lUqGVbLHtc37MvBxDzL+y5k5ig5HzurB2Wz42tXENd7T8Q/dFs/80M0fXtudMh873Kd63W3S5gj3ek53xHxvr6Ud63vUA8b7PPNNT1js/+R8dY4xZ1rDnV/vd09y9WITkfUfR3PyM+X3333JpK/B7ZHw4FFNGGndKgY0BVUX3Oh/zyvRzVy7u51Hym3R3mj2wnL22dD5S8fzGPjuvRa4OIoPaxv5f09fPWPde65mjwipb3baxnwdac6dp/n9kGOU6ozTG9QnJ24O7vrsO8t1qjL5Sx567wA//tf/M/fzXv1X/3v/8zHxrvALDn79d5fvQ5+c/ybka0xj2mca90jsvEAZM1blK8f27FBlzz/uulHZ/tqvUYh0n2e3OMKDFuUceapw34enbmtY+x0O6v6vsfj4Hou6IP6yj53O7fq6x3RW1gKHIME33YKIbiLX8X3XPC+fU6IDafdc0xKWCIuBCA9V7AfPVXJgbL53H9fMfq72ovK740cm7b3C7t3f69kdesy4j3YQwMAaS0PdbI79/yunctOGeMo8x2dax2yaRB5QXj0q5E3Co+81AA/QbgMncTW+/gnO+6O95wj5+v1/nXvtcjx63VG6Bv0a6o4THHNCPGhqoKDOC//8f/w1fxXv3ZX/wTh8dYV0RguuOBe1zmkGxMPd+Tqpe2VgB4zbZ9vnvxO7s7xIGS79RD53tmu91HX/9c5pjdOmrNsc5ljlou98kyjmja9/uDW37OhlFiDiB+QvSMmFjeu9MVbvFOqGO1HzrGuxjVHqPOnzvjHVjte4Gszy823wdd/ZZC1vsVY7g99wLi/Z9jqNUP6I6nifnunyDwcb77+hhDZLzJFY/L+zL799nWXeN0ex7U0czQe4fisfqwe6kZbykrfnqY4PhR+2ioa4x6nctOo9iKKcPrpV/K62Njz1PHbJMFEMMYAw8UuJSY640OZMzxOrb3avjz//J/+SreKYDxCsYr/v8fr/iDC0zoFe4GkRhGiA5AgOHAXaOBa6NAfA6oX7KjGXkRBMUcnsHZOYAyM2g+VDHxef/gKASSs0TJRl1E4DlozGEEAEfTEgMOAGf26nIJxnaPZY/4TtlZmKyLDu2XALzlQsmeBPglyLB+L6/AnCRIx2v2LR2AiKKbr47DteOBsW4MABQXOBQQwByw7CiG7w7JxOCI72PzqUB0ztG57IDMkHteP1mdT4FCVSDWYADcHOIdDTNwMAAD7q2shy7G0Bn08Tm5UXjeg+j48pPkPR3ICWX8H0rPl0kGBDExFplBIYUNvGss+72jeD7g5QMcjvy/uA76BcAJCCB4jUAW8vKLwUUgOOEeQaVW4/O/+dgf9ivbqOf5eVwNcwkuxukDjgr3/MRzop8ji4oCnxNSjYbB4xvCHYAPCOZA0AG/AQ5IGXnBdvDm3fwhn2UbcYO1KIqX9ex7BptqaauB7uKAxpBQbU8m1C0HaRoD9mFrYFQqMNQx0DFGx5WZQWvBGLlY5XV3JLMtEIPPAJ0BbQU45XJNDkCAevqcj8AwYHUOtOYCkUOGQGwG9irMBk65o7UW70cViETwEBkYmJOQ6g2QR16Lsa7B7liz3ZRoeVzet79mhreKtbBUBUABbtYAB4pUmAPeHR0NoxwwGBSPfL/zupujWEHJTnC2Ww891+dr9kCbAcy5iO7HHvDi/2Pv3bYkyW1tywmQ5pFVOn3+/0N7V2a4kUA/4EKLklqnn7pi1CjbQ9qpiHB3cxqJy8LCgnFlEDFyL227uOVH2+sfMsIWZ0B3+5vvdrkNTG9oENdP8lMBNhKRP/TPd9pSN2PjjPW/0zf8ggSqf2l837lXPNMnGMwp0qqDVJAyKpH6Chy/tV6ViZRP+k8cRF+oOEIEiXMD+ke8J86qIrqED1FV5BIsn5W4ZKComHtY6FGEB2FrgLGexVhxYfiV/1bI5Nr1HX9XQLykw8pz99r8G5AxRPhMP1nkk1hnrSeCZDF2s3lZfJeJYsvY3KiMsEEI71zrucDdsOtn71v3u5OhuX+cQMgriLYguqzNjzz/5sqvK1ZyLsFHAa+1T25+94GbRxFdIhktsf0FAAAAIABJREFUgFI8bafDp+4DmmTs8bp/9DqL3wwmjjOKg8PG8zsvUTwTtGH/i703P1TBv9rGv/IqwggVxObP3UYDAlMu8FcmAfH7AnYFIr7KIJsqJkkk1PF76bNYYJRiLO0P6/vp93nsSZ2OSRFjMnn3/IyMNfbM80l8B3H/kufGr8Ouujv3fbM671JQQVSRBiws7n/A9kXVf4oMpDhqDxuZz7k/UxajkgEF2b+DO4ZEMehPCfozEfqfjE8nFfgPxgPo2RVb+4YNQ4xtGTexUBHGFNwz2Rk/M+5wfF/stakzLiqsqZjdDWh85JnULBr+/OIL9BFPxlr/ti7elUSKBpCwM3apemPa11tokpOPG3PHlzFs5f1L2ChgNEgM7ASu5GJn8jQ8bOat+uTGfIvr94ypKk/5NV4Pn5IAlm5MfkaM1TYNxKqQoViSq3TlF/QXM5PEPd7o8i++ysSwEbb07CCvSJILQcpXuOFJshEUMePif0VOYmFbdUTuMTRihZtTeFZ/oeljfojgOGsGqO/usJXfqgDCH5HYDicid489uSNnG7KzqPlHx4CuN5YFX2+noHiStNCFk8QdJj/SrNZeVD9FyO2wdePqeMab0yP+E4GX7ywcHF8mKDt9dBQ6izClad8Hzmfka1z8cOn9HoS4QzoUUXbmhDOQjiT2ZR7IRvZARRHNeHjDscir88gCVN5DcUbbwIrdr225lq8D9vrOXE0ilyB8dxWRRYR9v77sYfP3KaJ/k+vO2KWKHd47fHdeLwyo+g4HPHMPq2s+0MPIyr+LPFgk96Z/PVdezyR9ZIO3nLyj/j6Aqvw58aybFBg/ZCT5UK9Y/5+3sMYpgKz6bDlAUhRAHGTgmVd00eXx31s894ggGlw68zvjtXCthVcoI/36Y83cTuHNvb977eUoOsR9blXMD7CtGtCXAmaOibfPvxIgXr5Zadd8jz5vdXiuNVAfzBEx5Fth7d3P5JVgM4Ca474YY/DiynyGXkdQbjFc4U4fiFifFV1w5bm+syjndgWBkQeYKbFmIoLs2aCq6S/sCkLzkp340gt6zQQWjDHA6zRr55nf4Rp+hR3IXBZ54wTBY3vZLI294N4kR8/T5w1oVOyWsYYJq/JvAct4wpMAbmJBEAcwHt4qc5FxsRvPGGj6COuXON7rONEsLFUwILpQVhJuEtdzjSMkwov5IB0YkjH+zvucKpGPrQ1ZFC1bG+D/J1v+FXuEge7fH3kl6F6dly43nFPgubqwXdibBR7gjgooo/Ehd+cyiejVYPsh+koWvc3DrwrCHmEfn8WnsXavi07r/fcrq6q2wfWFfHww9r8aM70yjllF4B2Da2qSUZ57WKm4xl07b/OEoMW9wf3Iz/9ElBVBvYp9jmeOa4CKs/X3zlPnBWI7CtAV18iA+3thFv/gFf/gFfD3xiv+a9qlRJITm/Y8FFXlJVf+6MG8lHcEYH4eajER4kvkn0WUlq8TBuVs0zCzeezxfn+p7g2xk1BET0Qa3qq+LWYG22qPxK0B6yj8eH1Hn4GqSlQlsdVf1x7fu/6uA0VV3BfvNAY6HLONyT6bHEGzG+lOcGLkXcd3fry/zT7cnkFLgBcVzAEFztTfuSEVOKmjacTLxausBj3MozAgj/eY69l1Er93TkAwnGbrmCieO6+4lwHWPCrk+kaAux1EQTqwXBiPBCveILp2EGH4mz2/VtCfXWVr/ESskhwLlrGsx9ZUXola/KZRZLzdsK99O3/51WzuvoqRqL2vzTeimZDmAXYE07ZWzc5oFoxqsLwkHHcV9rzPqMODGdKMvjyzqjM+3wVh4tyIgGaQott5HszqZllazEoYEgHayH0PoBlwfsphEf2ny1YUyNwckQsyoDjMlY0l61WG4FlUqYRPz7bF50QKdNMn/9vOdxdp0EzcAhTUJ0ukq6kEbiknCZP3w574eS75SRtlcc5pFeELBHDR7tzSAcveyVyoICoCxgiSjClvzBdbIzk1oe2mPwqPPh5F+Lyld3aJVjAaQOdh/S15s3M9AhpNoFgiOJnqHbS7A3NgW752SX2Dq87V81wc3/HYt8cRhf3iBG/TL1xW2EcuROCWT2axaNzxoBJQzKJy4HFZs0MLaN2EjXV3Fi80C38BiDsjwQf36Nw1FqKC2ucXQIq81zGu/qz6+Z2dpde4sJVdjBLBwpY7wCuiKK0SCRO247sL7ATkhwd7xzOI9w64jr+t61bYaW+K3bklkgWhQHHtADe+4wZ3ysSHPwIfYc/HCtZpBDSeTGFnp40R91j6vD9LosvTNG3L74KjXuzRTJR0dZchea/xe89972kPA3Z95euXRvB8ufE53g2eNICTyZRdJ9hSP+SP2guXe8S8eDD6RgW8xvbNa7zgYa3+6quSvogx4mdRXKD/Ny5I2oq6c3t07cTf6AEbODaxrgLaHiWs/iz3x5ktO+pBXvHcY+r2pfgAESM6UcApxvkJLRzXKmYN+NKlbxkHWb1TMFAtCAPVcVpAeyTm/yHIfnbBm+BmzGSsizrrEX4XaB5stpMgPc9e/fsjE4rqhtq6MEkWoWmC5BEnR9HOuzVeNe+HR4fZMw3QN5LkIRnxnjeG62YMGFuT6XdKYNOjI9ndWTOKEc8YbksUlgI8NCyZzeqHMVmKBOqwRtnCOOtC2BpVRferi57H5DouQUJyu9jJ6LQitrH+TSXhr75utbAJeYs63rmXtOPhYo1D+bZi4kexUF0wN0jQCEDszTMne1URLuOT+3Gu8pNRlSigUEB3FSBOwbgveaMymq2+OoY6udXVB/uOOMbD1iFJTKrkZih3x3aKDgXe+Z0F9EqwrBxsnPVO2OWFVCEgAVv1rwDJn/fh87tvOWfLgq/Y9klE2O5sD1a4ylmXIwIxG3xevthVAKjXp58PgJGzYZNpr2NFrEE89v3YoyJBh1RPsE6uLzFM3P/5+5cHmBqAUBYF/xTL7HxmG1AV3G7mqhhb+l46bpQN07pz7TcP8KK6PIcKv/YffK/LTp7M8THCOF1uPLvI0gbxiTSA9epn9VRkKNBpQBeuaFtnQUIIAOTsq3pm5g0kiilFnO3Pefi4gXSRMu5BeOnxFpbdbgGmJSaizp25xSXzCdf0/R+/cjrtTlfIFaRW9wDynsV7kYfvhugMybVwaZ/akMzQLrKJC/rMgR5/W8fcCN+wNWIl28kg71AhyX3po02liSI2Btuiu0VHPKvbT0HehxBMFQ3yLY5lt2sUhR73wuoHUmArDp950y55bsSRJFW46JdORhFgrLTLseLvccOgCy2+DxFlOPjI+H+m/bX1AJ3/+ivu+3QQWcbfm8lV+0xqT0dXRRRaM3bUpvVkvhTr7KYRi0hicNUZ68YQopheuVx9jJz9FuelOt7BbecZzULq3qcDSgGyw6+6bTmFjIgR81z4BCTyH1sMTZ+cnzsy7gtA3E5XVm7oKjhuYNjZO6Qt9s5FoIouW07cF5hpxmsZ71aBHAlfXnmLZw77HhqEEPcMOzMvyfN7l2ITcV8+JN6nuqmS0awaeGq5uEfDPXgUjm+V7AAVbKad2lmcF/jMXAZ53L/vzIMFikzxvFSRxHt8xGdB1gfIgnv551wDFzpG3OPd5PwrO3mGkhiWsPfnVyz3G1z/4BX/4BXw98Yr/muBKToPZmwcQK0CKLBRLLXZQHM5TXw2OLsVdJejOYej2uKGXUgD7G/M4gF2i7jYgSmyg6qLCwD2g1HSaeMURzowHIomC65alB1l3GlwNRmVZG4nAjrxZOqbWt9LABqx2CLaxdFiEY4yqqzTYucfRBBq4aiAsQ2vFnPxlrgTe3Elo6qCRdGRgLsw5G7GhnThLANZ9wxi43u/9pPRms9ngFq+nwYgM10e8hjQSHIGm8NGd6CAhUFzRzKx2nN1kPHp1gzgVicRY1PgweJFteGfYKK/wzAks7cC8iM5C3b0TtaVe7ZjC/i+O3meCF5dP+T/t2jz+06X6UL2hTzap4FM2tNwD2km5iwq9xcnEIUByG4aItivglxJP8T6Ffg2UI+z7Cp4MXpIY7cHQgZSD5ZCyyqKPYK7YIdEWBTBuqaco4jwenaM57njdj5fUcS1PU8xxxZiWdx0gGhN1/lOI12faawshIgEf9TTOYgK7NHtwqZXBEGZwFz/AWCqgOVZYJ0KeFivkcW4cPBx1loGRTalRNKMWvdmtoEj+sbdstgX6yL+IwODT4pF8vZ3OB97vNcayLZMQKIVV11CCoCUAcjgLZ55/nsFI+E9F8b/HEcrYSN0RSeSirDSPtgtyKwC1E55vhdXgTbmyAk58+t98N1o4WNPXBclW+qarfy+j7yDaAOcVSCMAL4AaCd53A0CuL9BLc+DozbAYfh4BGpH7mkUIFY21AXziUrC3H1GT8duxMmCyeCujsF8dh/o8Scm3aEQrxRuu9F6Lvbww8k+3nqC15cre78R9wZaNpvL6vkOLNPBOmuuhnQi9uJauZcJm3MAwGTa1b7ZG0YFlbFWah4+x4w9Vu/LqxIxHahH96szOsGo368sJriDu/IhE7eKJ9I3pA0axr8l6v/ODJ35rePZf0auhIjiaryTYSklKyWvCBQ82+QLyGjgxPtcmC+kyAHJCL71dCGbgLdUr2bXy5Ei+A5XSPSezurqAjddmaBnMNoAS54ZlUiJq9BRxfAHKFoYzpN0UHGhdMLtYduLLJBnSuTiRBkL0WfJo55JgkUYr5Is9gqyZ4NI6gnU5f25RnFplf8jhFbClrxx8ege9ReKZiErky4gutPfSAFmAurvfK4TcIZvdr7GfBwgxK0lC/BXeB2T7vi/NiDvBsfC5xT4EcUbslhjhd1IxBYRz2n4rnpOOLKjyzziOmdJklUyhhC/mXpBsuRXAnmzWf7KSPmGud/9rFY/jyskTmzHZ8fh7UJW2M6Kcd7MPOsV95iFfJdkfFNAaCkXyL6RZL+DMYpQ1b7UEfkPBcC/8HK1tG1pV5M5vWRnOVMY9mpwYTegGSScysOqi7wb42TT8hgMdoJGdYWsXP6tS/gwTtivCQSR3q/Iq26GSiTp3XGvAQiIWCseVKoeQJLhOwgru+/hSP289tX5oI6FiKMPWTwqN3AaaXLsQZhTJLsOPt5XgwK/tKRgdhc+4Uj3tZVwZ2WMHfFU9KlMD9+/fMdZMzD51eCmym+xvnfG1SJM3fyqfZkF6MkrWfT5ccVezfeXLWiSA7e+g/ToHsVQB8arbeOV8iwRQ5avnmddJNbWHa6KyzJWjLhndedWdPrH+t3D+/uLny52AL/CRwWIZJCgk1qQ9/Rl/D6+VwfTZjMcBtUZF+u3dDdooxIArYhweRIU3UHu2L26OOS105VTAF0QYcuPRB4qMlBfuMPSxRPYgvIdkp8ZdgpoQoTgeMU4c6DZBXSKNrPB6jwFqCpv/ePhY9Ner5OTkXHHSIJc/PeI2KScA4S6icUy3Gj/vIqlYExKmeaQR/whh9T7Ruous6CTnUtacpbpm2OtYbhHzlUHJcF9kejmvXY8H/UqrNO+3iziNURb4s8TM4pPXzDCpqm/olNlQMXr3pGzwBD2NiTj+/aRWYgeaYuszqEIbhPN+15lH2zQBXd5dxFcJKRLzSZlDsWcqfF5njn0Zp/C5He4fALjEFrkV4Kdx29ciwSlSZAXkJmxSkR/bmEv35J5uUS3cjzKFRgWNDaGvFuiTjIOxWGkzbz1ANbIwsTYnHNgYnyqM8Zg2sHkRhb05pJHc/zBiVp63xN/dGMW2ciM/QIG7L1OLpl+SOWchycZQl0C63I4zKoAzhPyPRJfKK5FoslCqr8bxx1+dTdP4GR1JuPfEzgdKnkvZnzKQkWTBBxg/Rp57sSZ8oGIp52pw/xoDkhihBHdvFZ+yr0x3L09nhulSFBrEZgqEqoxo7pldz5LAVKh6tpZUOi9F4Rd8+rsuRvn2YkNGo6mDZkuIefl3mQjsfuo33yT6x+8gn/wir85XvHfO5j+9OXaWOjoooj7JpgKp7vC7XTwVJj1fKixQKMDjVXauJKBgNCHydFOFI0CaTWSTaLQ0gW0HYdsxM7Iz/X+fZhfZ9uZ1YKONmae7NLDRnEuuY4TajmB8/5x8LxjVFVF9QNJAxcV9BEthKVhHKhBFl0egai8qfJyVVivLjfnwy7QppyrBBNSNDdArvGdDGP3LJB5JDijWBSh2hytcB1Mab7GwT7iMAvsbOkdzil2zVM0qlkEyAwd5edz9igyRa1H+Wwd6NTU9wheY7/t/N9wPdqF33rHc+OCtTvIFBFuNquYTW64FiU03mebfTtwIeZBWBp2OtnBV0gfCAlcRbHVPNsY9edhTT8S7UpCTXIvC7hE0SLeKwIBs0XJf8gWSFCp1qqlRQCxdwOIdX72Y88DzRqvK2T58m+ZqGVLNAEUmA5GfpYmYwayG06DDdSSD7JQied3Eo8zbwwdxKwH6bMXZ7LmTxSbiZj1oIfRcW6YTA4t7Jj66Tx0bfhS/cr29JSeA8Z6MH0zIXIv9ockw0DPWZAAgoItQvVdhqaxztTUhduD4WC+QGfeZMoMqjTzQCzW1fMvSrLSq5iM4FwpjWk9p6qAxNBqDcmPH2QBySPhQeD2Xwz/Vz3YaOd+6PKXnvZ3upY4wmxMqpho+MBaf3igqRH+1pTUyCA3gOs3EapI28XLB14zLB7bx+QkoU2DsHzAAEk4cE+mHh6MMVkZsOdrnqC7haZtzeMC2P6iuvEsbT4cRjbYmWMjIDvsxdbyHNHNGMwZY1sChBn4TOQUZh3ylzxBkmqT1uxACABNG5RqN+aPuSCsk2p5ydAqw2P+nCHNuuu5ENawZugHP+aExTfdZeLiGdmPAIw0WYV8MtKPLVmcZC9+b38CW+t/xms92LeexQo5Ekbk+Ro+MYmY42PFdwRaE3sl6C8ifGyQnJMR4FZESntbSKIQMp+RmJJkFw7Y/g2uSOrnCULL5fjhcNtj/9I+xI4EnmehSOQAc2IN3Lg9fUqux8M/SAbieEjIQbBEteMGmqxR1xdbL4vqYnaChafVQVKf0vsru0L8gJDBKM+/9biDnTFcXD/AP+Pdu412sv2j5VWKclVx3eLCRpEVDiiHjHRmJy4yDXCN+twu8pPAWxRdIh4KVFJEQUrW8DMS2XyAw/WA3g6qF3jQXIIRt+N+tOKSi1cmaQpNDupmalOQgaiCG+tRoBAJoN4hOwVGnq3YF+4RI55E6jnd5MQWySfCZIXUUBbienuxGRo64fUsx0pFAhXMvs+ZgrAXEXtkToDjWoSd8D1RcCh/Xn4/OzG8umJO0STszv7CfkaPgkTYaUUsZeX8DlsGQEqa9D2lDFcmvz4OINHpEG8sGY0azBde0pY9309zfz/OY+rXbwGSaGRZtNn6P/EnFfeVRFLLg0UeE7ZEsPwuZHwmw3p20Vtzkq/kCrcEU/pt89bvV3s9SFHpcziyYchJld04XVsSe3vXcxNhSoAT062LGkvOXIACqhGFbagEcekutmwRnnwGaG9ZLNY4L9KAjwYI5P4MIc4sDTQL8qDiUe7ykIIpwEAkpD9DBSDfJOftJWc+94/xzoI5e6EzfNV3iwHHfiGa5DcRysirGe9cVk0Z/ACr8/yIA0XaPHJrHVdvEroNKZmen9cFIvsi3WlV2OtOn1e/p8l6YCt2fEASA4ad2TPyjCXzUnc0c489QuVA95nVrJycSV1Q0S8FC/EXnjl15dGg4CFCNk2xKoZk7jgqHvRADs69PfGL+kfkCbGnBr9tyf1ZtmrzTlUMMQ4hom20dtfTLAwDkB3FglP0C5LDpeRa1/rE2QzMQbBd+XH8Z/tER8y5dW5mFuvEQDwUOeI+v/7/+oDpF1M8ZYk+j6qFH3WVntekypbqrLpytmHk3vFrbdtuCega2vnKd7hiL+4Tg5QE7XgfTEuzA+nLvnVgdOFINP7ds2JYvS9FTmdP5dBmUIo8DodUXjFzxj9FsiRl2aq7Vh2uGB7Iuo5EaOEGJtp4bpylwhxTNWfsBlRrMgtp9uN9hMi0AUv1k8c+P4B/5OC1b0ui9FPTRvuR5IrrFMPKl1vGS/G9TuGqRmmEP4v1FxfuP6nkiAo/PEg6N8KWmlGXz3Qu3MLe32PzKgm9Gr/hv3dcEHbqzJQCmKrM2zBz1kgxQ481ExGWJr4YOyKKqsB+3ey1AmupWd1y8oCTb+yOAdStc18juwVlUB+6t/FB5MK7ZdN+MR6E6u9w/YNX/INX/N3xiv9PFPQKIouFJubctXM19GpbVglwvXsja1iU3Dj5ZVRYHvN29vjFK6kvw4xRrcQVDO8N18hg71TDawaRibLsMxhVHgthMrorRPFTOJIb3EOPs5OulYlugh4AkmA8jpugKRVCBiK2J1Y6syJIJ++ZCGzhteI73RosAVHpz4maVxrrNDAAQ7yLAqfoQnS8iHCZtIScWLXqbcRmgDBCD2cuSYoI1M6Mqa7oJ1Ae4lhHXuJ6/3YCRRGEj8Ne1v0o3AU4/UserdP+i2UjBkfXo7pv0AI6Ju8a4l3/5ZOZoLfy7hZAsphoXt0wFSjXwY71+11+RFufx/48bjUDn+FdIPs+V2jY3slYLJ3h7VdLOqodg2taQBdg2Tz6qCzXTCdT2nBvnFkBbzIgVKHm8uDaQI+XTA3PZ7sPS4YrDdBTNu6PNqI1QHzb5jXDYS29qWGMVRMSjDvZbDBhk9II2YJrRzN38Stmpw36fZQYDA5gDEyuMMKpVxrsyvj96z7SmMUGapYAsEfo88e5j84dxylGqvhCRq6ffXSRmwIphjN3FWRhjjNUMQqD75gRsDfDL+asZ3TmVkwmev3g9dAKvt1C73gsxkPT/L3vsG35k+HeTHK1XZhAA8G6Bx8pqyJ+Zwt+gDMIwWxISdGR9jpAi+yGU+9isohECDMH75SeHOMxTPWbXLE1glENx/GJlpSHh93LgKlmyt0SjjDinR1JrZ1ztf16ACnWre2hLx9BWMlGHAYMjJofMWd25xVzM/bVWb8zjLaShTnPHMGf/guKib5vpsbrZ+3fBHYhAo/xcac9/VOwsjMIywSs5Fklh52Hb0qJK+gkQwuA6qAwfMmNMQhWz/CaO2HcVeRPsDE+KzE1ix5cUeG1jbeWb4y1WnoS6yVU+nbAL2gfoersGpy+kkk6BEZ8/5tJzO3L2EQhupUr0zRWAZnZmegmTHbORpO2PXf6sM3NHjk4XjevHWt7SwBI072Z6LFPohPUBdZeCXgGw+u3HUKkcStVQLi+DF39qy/x33CVBglIPWoR+xI3DfwAUgR4WzbF1Bgpr7RTBkHz76rA0PFYrsNy7zkaASB4xjJnwDCQQbIyvhCDJDl0CWKhaLIvFxYzJ+ToUUe/yFc5OpnCx2MQew9YrtmUnGek/DxJ186YEUF9NOj4eiY/mXhJNeRz4pphfTw7IVxiDXoJZz5EFfCGTXxEPKbl1z25UyKwbpwjfXCl/enh407PsEJrZmmckoibk5rlIXl0NdM25VV4x+eJxMyd2tMCqjEfaG4JUphYp3H1nWeWVeL5PYD8vGfRYx+HX3xY6bXns9IXu+SAlbY5l/1vsEz2vtnMwJ0J4CxZLh5gD19nWpl75zNPFu7GuTVIIGMV4PBiJHhUHREqmr4e3G6c7F6QC5Of/W4APhXRUimIYodlwdMd8NP9NsTxBMtUm46D5jOs8xTvNdPnrgAwTDAMG2EJXEKPnzU6RvUk/nQc5w5qD2BrMjOPWTP3Ku9WeRgsLDXpDZoAGeC+U/UHNwP/yS7Qq1mRowlv+IvVzyDlVK4bT7k4/AUZb60aUr8OyGgjOsNVlc8kAb1sMFLy+fLzDJkZd6YdGGME8aiKiZKgdxIHA7wA9Ff4vTZN6yFFpC3dVHKls2RFDX7YsyAfa/0vH7w18oMl1rnVlc9MXL5KvH+Dy8eP2K+5hwoz2CrMntei/VyrWLnlYvZcoSPRX2uy9Aez7LL/HnEPNNAVhd+VuVtOh81wS5Kg1bOqmawspEoEJQgDKemwtRGHOecpvjzAXMrXObzWJLoDBHTlYG74XGc2jaSkVsuB36vjreKvrmGdJwYIV5jAO9cn2M+BKRzJeXfPOdrHfol/slPhxgZ85rmrGWgD4beS5kL5RRZW027oGlxV+B1Gthyxxmal0F2Demx+eMjPfo6fOasjZfJUI8eb2QURSGNItts7OqjHDBly251f6Yo5HkEWhvc+hQeIuW3bIu69dLWyz1eShDfAWTmpjMEYinMxrGaM/wb+kybrAvj9RS7zL7/GHTLzWViaOb9cDLacDpjyUUV2oSXxk9CcSapm5/ZA2MMzb59dWNea/6WzY51BSJZC2udnDEhiFh55U+XSohezirpGk2zCZFVXbcpRbu9OtMIeDWOk9PDWAnhDts/MGBo4V2CPdL7WsaCSMUrEyHvW7KW87/Fbx4ch1VhA95FvrQ5ckf/Vf/sEnSm/uuF0uLy7nbC2lMoZEyDClxxDRUBenTeH0QpJ3ulB/LhFUCvQ+khsXv5ubLGAfPfjoz2JtbK110VkHAKJLwYxy+ld4wM8SBCiGnZThJDbjd/fanGWyTXT6IcRDQ89UW6Ltfb9zu7rQbSefZ/rH7ziH7zi745X/J9nMOW/4CS+WzZrZhB/D6zatqx0C8/DjaB2tUGqykKkrGSAa49EFp4TfsYM4FuItj2g9T/jnoI5qhKGd+N5OCuAyi4HJ6qy7qC7E5fheZiIdrZinI7UCc+yUhwWj0LOJS8sq8qubyQruLVc01YGjJKszkjuClEIwCTYQPJYV2NC68cfwGR3V049Ge8AVuzrIyxN+2pZFR8PSYUYoh0GJav58rNB6e3Sc2GGWQayn0gNEnaJDiV3KugLIKWKXhkg2mHR/ZrEWiOoH9ZztyMThyW+zucp0aYcAd0hByqL6XkAM1jfAktraKN3hfn5+m/WGRuXz+5GuUuOwauvLIqMBdoNDRDAi00gwpaZDMOTTJUGKziyLyyDFOtODNupAAAgAElEQVSzcM5n6ahHoJjFO+MkQbKO4UmdZNPBlZPP34MuKGseq/jPYS8Xu7Ucj4lyMVPqZrB0sMz4nLE/L4l97e58WLTb16wLCPsyLQKeZc5u0so7E7uv87j6QJrAo8On1r+YtmI7ZBHijzNpP/Ike/zxKHzmc9JYz0gMrmjNV0mJQLj8he/R379sqWXwGsy1jWBMsWxr94p+uZ1m9FwSgaoaPe9M9UcX2245EnnFUHCcN1d5SUgGZV+SAV/6pPiq4c7i/Lz6KO60giSJwAXe6+Z6she/weW6IyBt1mgFJBBMqmCUnO7aCsisC4jqAcsg9NwO0ZAsqICrRTV2RCH70bn352Q7Ptn7jHzijDzv3SFhbwbBvnvPCiQ9utA8JSK1dPU/mkn4RR6ngvO92Hsl03M/ZsQUADdahmx6AShBMhg6YBvWsxQDtBajO04Zfor87tTcxDyIbBmcAdCxyv188nnU98uHlnuXvCc5bHc/61hyljbG0VbTid7Xo7POGWoNst86cU9d/ZZcAE1J3cEGKzA2QVX9ZI/Y8yqRmMUeim5A5R12BlALVqIovMwb3LD8nLcIr5qNZp7z7f4VpkhieOqyn7EHRs3y8I6nvsPlY2fynz/I0CvS5mS8Ca2JXcn5kJyhgyN7sCUS+eEXRWX4oq9vnxkD1h75OKbc3+iopJ88x1YWCWX2mWgZki5YxLNNmetOwpbsBgyFZEACkRjFTZlnkuqTkbNQhnwkyeixRpwCgWvCG+4t1abmPOfCgHCZc1dXhGbfvUcUWpK/T/ZmAdUD4dpfA/pnx7gO2Ks6PCJWMB18rI9HAe3MLeh3EKID3AXRjJ3y9/u++Z+MJS6UKzuTe0yFnPuQYpPl8xU0i2sW8a6dAbLv7Cr+OfTxJgdkqPW7PH4e+cR57s2C5APJQslbDpB/FdtvKe/xXP+//poeUh41Q6AuM+t8SJL4IhxGZDH1a2+rh/2QQTCQfSK74r03KjvOaUvFRR4kUlJgWTBNXX11sqsmO8p9ZY6iKV8+qMKyzSoy010Nw/zMNso9FR8Qdnab8XsOPLpl9O9laOYuoYYRhKcdmu8ZBxcQP41OwitG9Qfx7WOV3xZ+tfpFJf7e6hcjZ61VTlZD1IvcBsfvqM/s4qD3nY+rQa/3IwjubruhfZbDB4c/vgqg9d05LSzwyagupcqjU9rSJIhEcdX5PoVplZUdECcWQU5c4xa5Urwu8ymNfYgnUPeczeM169PzXDueBbB3gn5mg+Xfi7ynDuIBRo9xbJGz+STlDMVZtQcSAFXX8GHEuTkEgooVT9FX8fZdBXQtDO1zO778nvoPFeOf2Vz0mQxcY68obhVjmCQROCFNVXaBfn99vNcr9/b7gIFa9jIaHABU32jO3tLcZ1Gg3wXPnAIbQS7xFgmjMQvPvV74RceToo3gRNdHdEdurW5DO1I97JBuz+8UscMd7GgR3pLdZtBn6eO8eYKEVXQyyE6ymbOAzRZksajy0OGneznmphXYeQgx0YxSMqa11oGZ+PJHlUCPH310HYlUPv8YUVBYjV+MPQ+wm+/7ls/00caPf5NG+gsvMdSFW2puOEDIwQ/3jj+qG3dkABzzgXLmpGtK9h4iT/mbTnvLnz/mbtc+DxWc6lz6ujZ1Hlbu2/FUGqLsG4hVrlIqLgNP8vVWsLavD58sK0ZLYDmigfPeEvG+Y4z9IKATM75kb2TUeXWQq215rVN1dUS8U/tHeXkYDRs58c0NUskm7jA7i+TudSwiuEdSGsWwlp3Th4+m52ZX14y4dwHrcgOZbQvqnmoUSfsmd0xnAO527OMZqXGuYWAtaSiYxLweIwhnNccmPkmRxhmr235SIxFcZtuCkgK0JC8BXGIdTlrGtjHP3PlO1z94xT94xd8dr/ivSIbrCuZZbYxaKDFmSW2pduUzFk26eBAL/sbzYVfrasiZZFUNuoX4sF5f3aIm8tCN7OLDj9aDHM5hw5bhkwMuO5NZ1dZKTCzYsFUAq2qlS85eak37YHkVc0V2GCqxyRSP5GgUs49k28Q50iscbwwqLMZRyozU3nFC7q/nE9Atsw4ZpWRyDhz9dD8yD3nFwX+y0JK969rMEOdmeOh1lp632Qsp9icXKlGJ3qVNTjhBVelZPPIAksoBBYtxBlvH6K4SXTUoDRBtI1hjBAc00OJoAwySzjh0WSvwAx+R0FQLseEPCcUAcwBeHB3l+xtJDsEpytWMh1kdZkMf1WDDs9p+QAALRhuwPaEySaa0CMscycKhajxvh1OEVNoYBCO69Oc1C4BXBy6DQbWkku2yimPznMszzDuKpbNFuMHFuKVYz/nxXu8b/3vk4HDLll9VZyotlTcS7BgFxJmw5GQXxRjzLAq5PKR2HGi2+XwE/4cldAbCzy64DavC5DxGngI+eIBp0sBEfFiwQ3axp9WZlt2J03iXj7H0VUbIBaZTEwtb8arALfdAFLYJqY5Hoipy4TqaPVXFw2Limzzu1bPwKEIBryLvZmsMtz4jUeAL8Em8imMgBEB55/pOf4ojfp9LdFMF67aPckMFx/7Jn++8hg/H348OMQrs1mYCO+5vPM/bzM7KIV8B304gkmXyFCuYspGenRbDpINheqHiMZwz773OzZbjjxbWH+AS2sBa7dhmCDOSawvGdpAzTpF2P+7GEkRUtzCeHnZDdg3NLBZdzJkRBDeh++gkugBFaHahiEABnEqkD5nAkTF+aUoP12YNHgB+9+wze7aMp8xqHMmSrSmmj/BKu3+74FYki1NI7+7MR44x7KNn21iiKrfICYhpNYyT/PkHh8X/PqspSk6VxQucldAIB7jsRn1wezD88CBJ3ATIU8lfDHj+PvIoHXz38/lIX/6LQYFT6buJlvwgLVjH1ZuB2dWJDlnab5khWWnaPEgOck5oANWSiaQwOBK59V4g3e3EQ3q5bGGwNz2BhkeMVInXU1+qGFx+f5HQU2ZIwkX7AsKr5WqFdpGMsXpQd3UGt8wX9Cwk54DiqhrJE85lF6tkxzrxGe2KJG040PJbpJ43tS41m4i0Ia7c4+rXyyrw+oA8AWQK4iNkhdypuVKqnuCLsH3h5rxeL4rEdT/7xjWYwNXxD8qWIzc7hvLJaiYwxDyrVcApNRP1MNpv9QZPhkdXi5khcoEIwjtnA8Wa2BbMnIuSbj7787tcmuBlFdFq+5YSAUDIGR4ArToJRsYaJhakkwS1XWJ2ZSkeyH4h/usRr4dvr+c+Pal7Waw4p65AnUDAgrhCxoinwOTryOTIA4ndiafdumKAMU2o5jLhV9pP8xutuKy2cnbaRH1Kz5B0r70a821CqtJT39/7rAr0+RmE/n18VluUYztcU54kSVS1R3IeVv1bgOEFYie1zgOwKfbrNG+JpzrvkrY+cj9h1lygknDsXkHAJzLqEwrEiBwhTsI6rHYNHqna4m7bEmdNhC4kzb0fcnezO9pKMrxIhPX6AsDfescz0DNXKDoGo9gx/UJFectnzKL7RtdkE4D4jIJNqa+INAFWIiMAItYBwF8HlLMflNRrFwHsAE7uu8lz5ZemCJ4zLsQHkqonbjWP7N2vV18xCznt5Bg5+1aCCR7F+AdBDlB3vLsE5cS4XpiGMaUKoz8YBZa7wY6YSxqY15Y7l2j5bFm5umqPehUtWQ+faxTb/rJ5gLWcGfg57IsEoLSM5SmSVwxlkYgFVrKjmBxEjRyXrtYyZVgU3qITsWYeRvnJ3GK2CzD06s6PLRl0+on9dBhSs6lM8ZqtRRyHmmpXRJIiC7+yABQSk+S+0ocs0lk7jWHQmDnOK85zqWu4NOY1HqCm5Ey6YYZ+TSn+0itQoK/+M9ZOsJlx2a7MlyPbCTELLWPiWXH/qV4mWTz/Rxa7Q0ZewE5XlDAjx3hgTieOix9MeRSm8o7L7MfIhZF4Sp5p/IxUYB0fXCTOjJ0CJxx0l2/mHOUnYm6WMWxGjJuQgCUmB5my7SoWn3MYZ0oe3VPx+YXvzbQvi4N9xRuWL8o1IfLIyP1Hd4FNO2B9fdObyE2748qdobMPiDHaX/c9KdzjyONbFq5mYkjiGvmmB3l277R7qVgzcG6EoTFf7i67iGPmKK+O12MNIh4l7ZuO7NCRuN+tlVeGDf3wF9U5vTH2yLlA/Ibt6Mb6IuX9Ta5/8Ip/8Iq/M17xXwtMlkn1qVDlLB78tH1xtK1L0qOhfw9Go6ulX8iH87ghc067ntbi0EWDmOGTnTF5EJeeYGeP1XqL5KKbVIUwWQL10HuGTMgY9IH2lEvAUZVO+v58bU3GQkoRlCyfxVTN1hDWCXdXIK2KlVlgi0LJyNheDLRYaqzckYdNsB8dHFuOMSCT8we2kE4hA7Rqt/ffqW1nYo85UKHfrTYanFbRkCvJyjAeWpMvd8TCiVTC+zmy2izSweROXfUG6Ek7kHqawZKowCo28kYRfvZzOWOfQ0LgroMm4XSsJRRjfW7drF2H/oRBlszGJ+vju1x7/hGa7Zm8S7I/DIG879ChzeRYKmEex+F2UkC3pKvPlkBUDMtiTHVKmR+gwqZT8zASWuLSdTTjWaG3ybFwbykAK51Fyh1B+RNppt+WYFCbWYNL4srOwET8X+e7cIMIY3yw9h13r4tRcn9lF/Y7BkDW/czDas+P7z5eG9agFPajNVfbYGcBK1gGcmbC1cC/0BvMP73bZp1h2JxWfK5eB12ZOKphzbqPwd3eRUGiMJ8FsNBBryQlguCoz2bytlfFIIfFOj4YLATDuXnPtJfprLZCD2fE0Zy1oPJHAqIFAIacZrEjLRNhU/j0kryCFyV1kx8/Xvz+nVh20MSGuqvVfncy2+eMh9Mu27IpPW+TrwysZvQm0KN65p2UvIraCElI6rW5B0vqwU6xUj262UQESQb/Jh2BgA2nCso6c3++rQG2MUdIF3VCknIEKwAmhy4Wmhs6ZgcrZhZyiun3PP2eiyDbwAIwqXliEb0Jsk/yEPb/MJ3fhc9UUjYGPdsNeKdP7ks0QA+JgKziiLYzOpohHhI8RRrJzxHpLkDEmennb0jAQbmzRcJ9owm2Dwt/FfM+4r3eswZ2OyNB2Q3Ndo0gtbokqivgM86cw8ugWIsrv/9bZw9RdxekdN3XhDGZBvaQmFCJxGpkgIw+gsPvcEkAujUf4vh6ozTfrWM+sOry9gP6u0TBJZ59nNEL6WC3CD4A4eIc5wy0DducZyEBw1HdHwC+2H66Drz+zwYRdYa/LNapCFzuIZkMoQ9f8wr9+F+ulAPddbJgaSXUEWKLesj+FSudFc2hPpNMkKy57jSwvr+yQ5JgvgisKTHwGJoA4GI9Kwa8z+94+LKKt2NvF9M4iwfqTTISjwQOoYsTyEJGzWUx3FILPtds77tZ2OI561IOoWovpTqrJYHWDS3jLGshCTRocLKSeTnx1EgXCtRP+Q05gN1lo/fNlsWL0ognAandOvDLNx+jZG3eYSv2kSr8LtdWy+JfSUaX/7dmguKaLPAAIqKjJOwa5WcSoIpY31hzMqw6l2/u9FEjgeRgv74D9LGc2+KETXawIYdQmLER5B4VCTtfuSWc55BxeXUbRB4YignPGO0eNQsjcqGYbxb2M+SSATSBiIvhkmBVxpVh4cOUpPQXRDc75M86x3mDvwDv9YUE20VCUoRnAbJ8dMWN0ufeZLSvumfJFmkDkOKO25tid8e9pG8uH/blvIZv/EhyFegjP635LPDKGP3WEcUTB83ZYubGKEUDNXxHd/+JkV9UL4npaAZ4Abhuu22Aekh/mRnTnSGwtiWpNPZXj4bKKWtzO5/VBvpNLktswCWKcIUtLJGUtHbQRXms9luPDjAloOTwy3J+3914CXzV0pD7p8HqQ1zdXagK1RQz49LR+0rkiphGV/uz8WWOTKEpZy6Uu2I6e99Yxg0Ru8SzNM25Qrx77k/PmLEiUZw82iXyCHJVThH2jqcvB5N5ynS+ibxOHjhAALm1si8kwV66G+/EC/e0ltsJ0i8xQ6SLNo6PI0sbHawjYiSvmC9B/pbiDwKqE+SFeip7ErakqjcSPqrn4lYx0iMWNreQWNxkDBv+7LLVAD/QRUw4MUbPENcRLPe05/H+Pw6Ooo5aSCTV89n4lzX+HpfRxBXRwMx0M+35zPPyWK6Ie87ro/giB49LUmX8Ngur0LKTauPEHYwz9iGLGrVHYmmFM4PsxIHPuKhs85DybecZ1t+YWRcMRT+SnBDypBdC4eUjYzqTJLFMcmxGkLM9xxo0+fmxJ2SHXLPsh+2U43/2MKozTieZizzPVC4ytGyYDZrEKhxpwk0RZ68TT3oUdsNG5e/xIGXnvewCHOqezZvUj7xbcnP9aWRGxQC1H0Qt88iMSa3w0pjZmaK0bKdHjeg+/trVszN7nLw7GwAspd4CW7x7RNA9oknB3fklN8yJyB/o/p3vdP2DV/yDV/zd8Yr/rsWiv+JRV/Kc37SqhPlHDY7W4MwwqrEQFwdUXb1RODIFIj2AvgZOrbGYHoF3FGoOCyiSJe+q4vY4RAFEZNBmZ+bKzhkulfDENbpFeatFl5J76yojC9F4QGbV6kfMRHFj2U+KBYGcAdieGshR8KjP2qhmDbqk4Ny76uvXYj2qqdeKxbpHGX7FOMHkk1kQ73Pava+UQcCzbc09kuzUSVVdZOk7qti+cSZYDpf0BxCTDK0r/V5Id0Cx64L7N3j7J0urPXbiKwL7myPBNvfFyLlYU3OuVhYr0RNgktIdAL9ye23ZR3+eO+ZB2GmBHTaZWsOyVw+C3LkHpiy+1uv/+qvPTs4rqKr03MVeFcwVUuJMswJ9tOFhGkeHtGYhyXwUeDaa8yrsytZ7aGbEa08uSjbgRhD2iG4VM0uDU63s+bn7ETj77GLHOQuLmvwtHhX/IYqkhrXqI2HShSWS9iE/8uU3moPPl092asSPnNWk44M752ltpYcVl/EbujuJVl+tA/5K+xF7hL5nr+l7OCuHlJde9vbBaE3jwcvrfbXfq9ZFJGavxbopotE1t/SOJGbffOQ9Xj3IdrPKmUB/7qBmjxmfJXc3jZUDlqUAo/2JZTHpHsQwRuKMINES363BapgmkzlRu5df6P6RgfUPLgsb8c4OtWEju6AiSK9ZDVd2Fvoy/u8vXJe//hK/gySQ56ECNhe4u4PNOmAbldj6C6xseDFR8rUEu3l0MXc2K63APZfP3tcRgCQRopy9LCQdvjLi3FoC3HLShghSRvvBSFjCL8o8hIgC2RU7icmsyEkTVANEWTuDFC8dXkHKn5Ym+ZZgs0jI3ohqtJ8Xu34qPDXHd3jSxYMxmGu2eHNpJKBq+igCHB3nq+ahJEBX9+0e0JXPx3DxHDxdn3PtSa1YDAGtbpXorFFoVuSS3Z9r8sbV+eWfoNZJidXA+SzQsmHYK9jvTG6P4rvOAjg/8V0BOQhXkMSzm2PsiSTLHnnjxLm7RoZaY+L7g7UWykLnDyJsKrvzweAPvstlOb8l4kBOWMOx5S+nwVN/6H13wswOcEmkCy1mMOpMuLUP8wbSUnLXA4ZOBJsiJSzJLloR1Ha8B3KAH72aMReDVvO9ks1nDlYd9S74injllmBJTwMhhqPqOEClWia34vifyCsRI2UCQMa7IikVFzIQl1sClco7/dPNgO6sejfAcmQSHkCNT2RUvBrr99qvBkXmenU8etdA1/GGOidR+Ymuqdi4hPx00UyUkhPrznv9CKAAmCo5dyHnGnj0GRXLXD1ZbpD2xPhU4WXxbNRBZzAhu0CV/Wz9/fxfXzeh3CfudQ2WndBJ7I0z71iTKcEQBxj+I0p5+v1mxZgk4epLB8rpaBIBhnaHwu4gbHXcMd1Z40gUMUDtJyNnZroPPO1iMRNlfnJ1cmwtCyRVgDTFqBkr88FKPXORuhMi5ZDj5/FPWxb3LTDtFQm1QMmki3vPeBrrd8g851JjrcW8wj4Oksykv8LPVfFnKHtVvjdT1tE7iR/omV9gJ1YzZkvNmFQ3l3SxZWztRLlmoZgqu4dFKy7FVI3vujiSzlPu6DInfKyZRT7V8u+jZ4+VHKYt+MzXvHzgnnPScrObv8P2SYCt5rMLS3unRLTkvAUxdq7FZyAJjO2wAyR9maQdhQ7b9PUAezdjwZRn187v7GLajsXSm703JtmBqDC/XXZlGbfmvJOccfwDugAkfkC9Pn1eXTlBnNM+A7XvFSltz8crT/xjnDKqRReTwEy8Su4rciYNYK2wihKsMI94zt2bxJAfkJ9meBWT6sQneEXJY0owlAfawPZkoZfiO2S7+84lAD2TBIrNWI9O21J9ufZHd1W9H4SO8tPxOXk2O4e52m4sgqEdX6X2Go2FjH3GJ0jJXq0TaOj6YOZss60gCGtuLOPF19Z+nWR8sBBGgfgO106iYn78Wu8unGOjiyQQMeXYmzEkCiU7OsPMzgyyNTb62PeTkh+PvwjAtGKjVAFBqFkmWx3f8fPhjsqveB47Y58hiP93aO7/z0tIQkn6WzJvOaBx/E11Jq3qzmL8qej4tWjmkhM7RZATNbRs11Cn5sxtPao3leluoTt9hsOwQ0oCukOCjGuqaLvy/hHrjgEV4WUzHW+e/YwpC3srH/nbynMixs5ndutKIr2jKfcW89RXAuVC5YWDUvTJ2ZQiOX+oCpERB4OwMy4V6A7TrZNjHp6qQrWuEW8CTZh9s6mxEeIBHEMUxQJ7de6HzPSV67IfxJ3qlbmM6Lyx3c0HxgMn3c7YFc9EPO3qvJPEIiPi2b13dkJkR/Wdsbmu7vYTuZN7YR37bya/+YOYAYh/xngJEcYWNjvP3ZWKTP8Xn9+sg+kfvIJ/8Ar+3njFf5/B5OUU6mAe6bveZq6dCNeg5Z2ySlobjMcGI7pW1He/VfNZxCIIcakPeVR168E70zWT9tQOzdlKzxSyNrc6rKwEutbQZ4t2eMgE7s+GJwxgAR0NYGeh5aUfERCYxTC6USxEjdt0//Juvacf4ExJ3cVgsfwspGXFSKA5QPbznZodJ/mGpsFKzWJZrfXKeU81a0rLgeWMgFrzaqss8L1mKVRgsLwkJSRhnrqbB6DQsncxmM8sUtRIjD215jeIctiXZAExZszA1w6tnQVEs/MzGSvbGbUDvGBhxv1tOTu12K/3Y/2+z/V1v5UcQVaA4t8Pbe36z2mGBdfVQXbttuHrnAHZuQbeLZxRyKuz6JjEsygWqHTbtUShaHvPMziV9DLS/mVdq5p99GSVbrZVzhymUXKV2mBlOaA4HwoEUNSdjXnW3EEewwRrjtmsIMuSKeMOHsz3eP90mMUucA+d2sJZHOigL9e9WuABZLEzUY0XSTgkr+cH+M51XBnO5gA995YMeF47jX28Pvh2e2/8FZrLy8K+QYC1ktJ9xTg29QYUIlBPYNPkYftqneASxS36AsyMt2xe448s5l14PgNLdnsUriNgCDAm54RVsGAcAPS7XPI+CYucJHWPw7C7dswRd3d0x9+GznGRGLTPwZMl3+whvx/7Nr9/AlbVYWAPT1SFXct5KEDILYjwdUecZ1V+0h6axZ993qKIOsbgx0omtTpuDwlIqS5GsGYO5r7eFt0MDjqqi/T+MnA01oF+vmYWZxhYqg1UhS0/oApk0bvAk9aDrLuJI7ULyLPdIPmRhBnsNN7he6uYm8mRaA8tjc8s+YMIqJYpFz8y6bwoVm75fpLdbzkUd6S/0mEpB6nNbDT7xZ4JThQLaUAN2FQCIHiyd/f4ddZN7pRJOsH7axuf41cAtXeQH2IPlibyjdj3OVdtQ6T+9/ld+y2MyoIqnojifyaOFgCwij6Soehcjmf6eFP3jMeEmpfn/m7iSO2vkM+wtpEVT/XIk2SRusRf7/QjkpJa4ue7CNZdQ+rZ1fGw/9H5Hamw53NiTGq2BHbkeapDqgga8QErSAgpJudBsW/AGz/SuKLeAPlZEv+y8L5ivkgB/RXrQBIvHuQeyKbeZsuOeF62+3Wa8igBxOt5bX6XKODRsUa4AGvt9Ocxt/zuxQY3i4LEPSpGDFRIuwBpDFsH/IcvCgcQ8XsBSeo02aKSsRBfiUKGcGYc0J3xm/s5GPsbXIYxH6xtnrFdA65vqt+NXfbvId3rs/Oor68NqXLRM+ukuyOwTo5FJkX7PVGkdYy/AZLQU5JTBWzHi7Rt1RfJ7lXyVn7k0jt2sv6sPX91sWXvleDFITGt7CCojojKB0om2nxRUsVAg/cFxDn7QV6j5xlVbucY17r6vkteugdY+yZ00YV7ACll7ZmbtRKMBMjTMxDSFlT3d8Swdn5PzRc1PPfyesxVaynRFXPK4kU3XKcgFN8jZssti66QAoBOUXIzc4j3ttmHtBi9sXdyrkn+/kRNYPITq45+97j/+g65Xa7v46r+X66KS7T3etk6d+ezAepDiFCb3DOJbFLdarvJYVHAqvNQayon7nFC08Cj418EXLIwnHv56Do8C8zhm3pT8TD7kr7Pa9ZMZ7pASPnjeQakHxOqJWtEF8ASnelCsNfn1/4YN7IT6BrecnqFaS0vNOCBHTxXXOxpzR7D4f/D5ZOWMi/QW+VIL+ZslXhetN0qhv6WUwTolZwjcttcHd0nnq9nVgC227vJGS1LNwSwVN9ItreQslPgch2f6xrkBTnr62pHwWbTEkZLapj9q8kt8NV/B2j73Q5V7NlRsVMXXR6SZnrI06s6HbdTfeohp3xmyMGxIb1/Khyq/OqxLtEN+zUuGiKsPGfb4YxZrPcTrMYPJCU6iAnxPus2RGbO/ju57RcySs9VOxJcq7WfR3yGGag38UA42ILtPGvp+856Rqy2JED0xiAl4s6CB59xQRGMTdbxEUV4TayvFvAUoNImySk6i3DUXVT6/Dd2zujcs9eSuj3Bh7C04oqSDfQom3vgfTNB7fj2MV+m8RgsZqPhrUoVMV+Si8W7I7q6Hy+rIgQdlz+72MQ15PpipbCZnWUeRFuTJ3b5Ta5/8Ar+wSv+3njF/4EmkY+8DVIM7/sAACAASURBVH4NkJ89YL43LTTQH4WKdPwy+mF21wlyFpB1tKvtzCOihgPKoNhv2p1Cp4PKxFkeg+56aLOmpFslyfMj6z7nPoZl0KKD0ltuw28RjBagW0ZUPWTlhll0i6RzuBNANk/pAj1J3MSb+fCcG1Dgu5mCxIwU9cUZVnsSjtJ5FnHUa+5BAsouvNh9MFZv5iM2NyvvkwNaS2ugKqlGi8mRVxh9KG92OWTRSF3TMEEUEpa/UFVedn2RxXG84kOCJRvtlgDvrAPIwxgOn+1EY/ixwDwGDLmiYv0wxpdbOxyKNQK8tDSu/z0A/quvI3+Ywcszwuyzosm6doSaCwSnZXk2a7QAGbHRDPIWDyUSijgfX7VedybaLUPu+wG6hSSLaDrmlh2JwqXY65GQWzr+cPjF3jEp/V8P9p84e+SgRhZqEdxpDzx9c1fCsy1bcUNeAmKn7gz21ZQ5Quu35RjFeeVaLhazQLNyVhlokkHp6cKMmXLPfbJF2LmW4pPq4sS10sADetnO71oDnsNu2CMQrz3s7Jy5MTmtuznLYAwk2VHDjtwhONMDoH1RRfKQrQpGaQSwImAzhgR/bOlC3BrCIkU5xCjmlvsHIsp04WfqjJcdGf7+2qVawW0Hd57Mh+9z7UxyqiO1CA4/lvEzk4Ib58o4ogbSL6HB7OBFF8Ba8yEcJIuBTJSv31vtBO+3Hj/TWseeZVfPIDC32UgWyZLNkfDRTjBrkGnIiM4M5haXWGpUWwMEVsg61kxSM0V1tiQEgI6TpJWk69QrC7h1PhSzAxK777arocWfccBD1uF5Pedx1MtqzXbOLoz3vujBvr3WEgy5tPHl+4zSL39HPSP9tVeCWexxVnB9Rbgw/A6G7l0ghYGP7DzRX5gFe5Qda2p6AAF0dedAfadlodOMkF00CQTlWd2qbW9qsHAwyDX3muTcSIErWM3x/TYuwvDP/7Cif+0Vcq36p58dKZHn7+5nAC9hc4YIlzuYYSMICiORUJE/AQlW8iN6fI5ar4mVNINtpobNlSHMkpzuVpcViXLaRWnGY8o9yBtbyZabO+cMGZbsSvGQimpfmfHGBFRH2MH8qCXGVfFW0aRl4aTcqFhLndxJrFB7ncSGiXZcc7f8QGNsbMZhWqFygXHmDaLc88zDogb3ZpLoAq+ai/Cnrl8g5i3pSB9e3VPSRQX1skmC62K7JPj2ZjCYGlrnwb7NuTIPgMHGRhLI3zN9NrslWRSjGJk23vjWtgnFknzsEHzUPJN326yn/z7zQ1L64pvhCgD4ZIme2PbJWG/w8n+agVyM4PA11UXuDexVjD4ktNz7rSQKtk7Jt00sO8DMj0xkJZzK6Bw8CFuPAnPa3AJ/lZD46K/kIPM68ay/ugs8VKZSyuRZVCvJSo4ygUipHFRhgJwrBT5Gg+d+Egiu7GpiKCXze1W+6N6+NFKXkP0KiCAcqNrrFMiSRGXjD56bpwD+W7IDD9hSks/O0siprjs+c4o2k3ibtV+RnDkTiXz+bcoahaxZzSR9cWVufI83R2E/Y9icB+xmsY9GnYE4qybRzYVHPFkAqTcQ9O5VwBWfzd/F3blV6HanjLmrW6B8sPxpnsNffykuq+OxaxXD/kkardjqSLUtP+v/PF+VK4gcICyKmOkXKpYDdj7rIbsLw+oxQ1j9BUVAJQpWAdQkdsA+En3OkfquuK3Y1ZVz9J1knk6pRCjiE6uqjh9/1IQJg51qK2U3TeCqZ+2gr7TTW9nbUT3ftQHNvINyVN2V5Yvd5AkPmX93rgRInyoswzVjZs8iLlxbGj+peWdx3yX/HwUPOO/nTsu7uyvOnfjIhWaRQRL9uFeongB8IDCCKPIeNdbBuLY2NuHVbVVAqo6DH+W5FZHTZSp3x0QDw7OjdCZ5F1YX7aII7v3sYv3si+zeX30F0Flxk2AtpcjxT35mXxYONx6gtLu0+kcVteMqjGJTc8HLVmPaMvnh4QI92hQ2R89EiaJvKenUO8dso1hPY2SsXTGiLklVLSemCR0Avr738Fd0mFQnmjtV8LzQkKUbUaxV0iZWruCL6krU7L+K71JnbgOB43wlFUl3EzapXNZDhlDZ1U2WeW3Y5iyK6u57LF/mc/d8cmNRXVo1BXAz/0SYrdwvzppqkHLj96OJqPgv9t7M8ToxhMU8rHyELafqea9up8C1Cg987PnKK+P4nVllhZdsri78Fzl5cgdmKYIVbiPCHs7egRGWUud3uf7BK+IO/8Er/r54xX+fwdTSKLkZS0ZBSi4tGExHeiClBSqIc8PFqHbzCiyCUVJAurR0wLNaX1qD051i+u8aYuZHl7B0kcPw0EC6ZIHBbTRzwSvh9pvWxi55NxHuNHauls4Q0NUdIAU4R8dO6Ji7XJ14yJ6w4TU+WHxmgSUA6HhoZ23vYpEJSA49Vhl88rUg4swz6LeDTAlwNxOnd4G+VbXkUZTh0QXmG61ENR3U1nhuweoJILpYx0DIPmSbrGdnWezRSmY2v+mrwWwXxcU5I3HPpr4MSB3PV/29C8NKrjCqu3H/xWpKQDzQc6ZmwizHmFU1fzwYlTGcOILkt3yfdnMAdGeRKarFdyU0QrfGF1usAqkTqdVehJXsUm9A5T7zwzxaJiFzcOfoEAOwmllWTt4fIIeasdOJ3Qn0hNPJ565GtWFXhSqYXcEajhlR1JfIW0omTzoGmxbMlxHBRMgZxK+XKyNBudIYtUxyxxjsNCYRZJHaydJdT8NHMi/owEoSVqigbY+Ug/PV+rOnWPmrW/1F94Pxc+xNBUEu1ync5gwS/AL5mYXjZAvnM97AGmVt4plKdp+NDMJjmO1IoGKBRPt+MVqHC3dJ/wjc6UQ/tqaDOsH/FjhF+kzK9kRH2OglhhZQ8kxdvUCsnawmQ/ROB+uPIOF7XCs39LFx8XMTDYYn+X1SbquBbXlweHxj+pDF8ewoyF8PCRsVZyD30YNk4WKUgsKV8gOHYRSJc71Zd2XgTWMMRk4+95yh9Zsq71HDymEn+aICBuMpW/Tq7zUEbK8I7FvGlgblRoHhTiZfEPrbfFm/mNV22If1/uqneH181mnpj79JezVOkOsE883FQ3YWmD2QRuqWEK4shDpSLfX443kFwzQwwn5CATB5lBgYOS/ikcRXh8c2hfRdNfRzmHTh1BBGzx3IZ/oIRsXHmRXZPmbTQazPiCOQM0+mk3XF0l4VucRyPo78KSH4K68YWP21CASkZFT8e8tq0kQRV57EEfXDvqxgHxUk2VkDDkki99L03fPuTPwkVLU/HHbLg2xkpN2sYH6fAgmqYV/d+X/Ye6MtOXIcWdAA0iNVPbP//6PbXcpwEtgHM4Ceun1rHytPHfk5M62SMiIj3EkCMBjMaOjNdZnSDPfkeuSULs/hHUAOEih+hB2grta7ZbO4pk2k5FKsabR87pnANDI2G5AD94NpasHtZ/ubGAypKd3O5faAK3elJ6npvhRQQUBZpVvHRt5+kpLeynevuGEiNNX7bz/5YgBI3YPy3UIkJkr2ZcBwa1Jtyronu1mYfiP0vWp9XJiM825EN3UnIphD23qhSCQRmkiunBepHJH5+D1+sijLygshWbcpk+vRRK8sKbYAPvJ7xaq6DunsYaAtM++NccA6Acm3v9FND7POg8cSi38835N1yjA0sQsRSBGWMsajmVX5th3fCw9kXHgyHvmz/J/tgV9Z6ZzKkrxKZLPKswHVaEAWKqwjgl4ODmn+L5IERR7jQIHOl5FY8n/1GEB9FzGxbW1s/TlH4GWDwHKuPtfrrBrPJq39xJIs+n/zoslw7CzZmLq7s3PLxK3pMDwmPgzlWzIBTlNmokIlHx33za0G9xwTrxAD3U7ceMUH3pLQO6ROAh0+AI8jF1j5R0lKAZKF4qd4iHsdoJf12uw/w3gOLN0zyi7y0VcubOYY+YHvdLUH7WPaCAASZLIn+Ll7v5VXiCkQWyBtSUEDkO03HJw5BNSMbdWOamKeZiJpvqypo/0hFp5N5NrPFaPCx1F1Gd4N5Tq2Fs65SSibn39K8hVGWTrbVDIZqrsrkzAbHUNhwBWzbQrMDJfySYAEihH8PTyyg3lc+xOeZp3DG+Cq37kzkf5vFJOb3hBAWBEJvfddyZzBrJsFlRvCGDtWYTm+1LabmP18A0Lwul4iUbLax29MkVv3KFDv+JFEJnJ6g/hAYm/vacO6+7xPJenrx69pbyhaHgL1nt2kvG1i9rPje76HPxoAXJ0kwwblCBfg+/t4R8cY8BiSKTuNhmXZZ0HqbDQAoxo9FhhFDtlGCT0mFnrncdZcUjJ2+MC7m0bZjVbX/WMzHkBq0qWaQWat6OKdO3BmxRCYodiDIgok/DIgaekA81O3PPE031pjx2+6PFfucaZxaz0lgPLRnhZY+Clc4cWzMtGNFMtJuWFkB+1aE9ZncU2gfAXHaxL/NO0CyMCwOp/1XDQxYexQ4LyT9mr9Xaz2Lfd0mDzerjiNiKUGIGN0JeeTWFOi65ZpaI8XpGquy+E9tZItQFrErpXAp+T5zXiuJI76zraB2TkusNUMhp7lp5OIXFPMGZyIVvsF8Ohm/Xe5fuMV+I1X/MPxir9E3i2GtLD/n3OwQ4zWmjpBInVTD5G1JheAkR84Oqwl6UUTy0pW9qgk9QTdV5TUiCOlB/pSsRMWsC2gexquePXr3B03AncVTD66eK1D+doXaiJhpyMxkQmMAkzVWAISdwR+JqVADjjNvv8GkGth+qBBpU7NG0DGxQPurskAYFWBYGRZ8cAP3Bc/+3W/emS0/VPGQNiNzIDhPocQjql1dZM9TlNh9b+98dLGZKe1Xk8txbE/8ecwuA+seWNs8pDecRLY95iSdfEeNy9phG2Oxd1FcbA0DJ+AydDUFlzBdyWTPd4PPvMxHPclkzKsZv5cOqxgkncwg+dEKNBnFVMWlEwEwZe1PxVkppgLL8C+T7IGkPVoPnpMdIiR8xQWgAGpQ+5Tz2zGY5IGJwiVNjbfQ89nz173xUvcbt2Zd7EW64pfTCTLIBwArto/QWNLczYi7/zUvi+vptEAIo1ma99XYX/D40ezBHvCppoqnQMlfCwAgZI9H06W1HtQX9cz2DgdAPInzPg5sF9AJjwuDPkFve2z78swHu13+1wAMwYiOZn1lH2bBbo9ZEBbQgj34++2klp0YbFf/+7faTHbw8K7ODcUAzv8sAB2qJm3daa4pptQyfPA3hu33yT4G7BsooxPw+Q5oiYS98jAEEO+CjP2+pjQ7flJuZUIwI/27nvX00ikE1TM+yfmnEiPLg6+zyUD8V+ZbOn93Pao09Lgt5ptdkCXhDVIXt+umJWVXB9yg2SZws7vTOBHT/eyoA4Hqkn+CrIezVh0M27dvfVCOr6RAglAxmQVVRZMbgwAbHZcbp3mJxM+N2A0sdzFLsoB36VprDsRjvSHBJEuw1tm62id4DCpZpth2RseYnN3vHl1UUgd7NXfi/d092dkSOHr3soHMP6E3zQrN/9EjgHgISeGAORzk/aBnnguRtG4sR4G2WOJMYRBLfC1CjnCGDKXTbSRdMSriTBhtJTnfxTo6riWpLmM7NMq8KrBUVKm5ZfBoppr4TY78g3OSQ4ATLidgOc3UsiDZ2DEcRzovOQXubtiZr1aG3xjz5owWW2w2+BoDoxqKj2OkQDv8Rs3TGcWH2fphCs/wN3xCWmCcOwU0Ub5J+jZ7PFT71XMNJM5Odl0I0SC0j7IsVGSE2+nbJiZ4W0HiAdc8rFAxMIYzLvMDBcGRtDjbtuAb7Feo8D9q412kdmEGjzIU4cIEdhafy6Avu47rJp31t+1c7xaujDY4pkT48LIr+cj82wRW3CIXDWZbOZYQ9P5G12oT92z+8lhS6oHHtZhIGxilLRqruO14Ya9F/Yr+zt5REvVXAKtyisHoIdheQT1JEYmYjLfDN+47h/MQ6M8R9Y5H77V9fQ90T30n6epJPYwmwbyYHxODOETqTy52MHFcuV/rI57DwEpWL6BpN8OwPv3LoDLDhEJCFy1mIppbt4AmufJLSHAyrDZPLbyvdIexzG6Z7ZuiMH6yQBcWQz5CyEgKW1T0jsPkGZaC2MMMigF1M58iYw0sZHwQQ/Jz/LjzYTXZ6zzXw0eAFjJOus0NRNPmt4Ib3lnyEtl2Cds6ft5IJ1/fxdQbofdCwBXUFaspjsySl6SPqxuNyw2blOdOEnqiwjY+lfXMRXfzBPT2IymR8kPIbxvgRALt/THfb+7HihW+HWfVlN4n0AiRJnAq6nJy40/bDL+gfv6to1l38cvsC+LQ56z2jdLk3smL4vyOtBL6rUJmK32l30VQJ7R3jDh0Q1TQH5btmHtneR8fwOG1u/IfPwWNkW4TKqR4oC8ft6qa82sZZ3c/AFAUoK76gGkFE0aTB5wYzPgKiIeLuRizb0Hc3dOCfJcRy68pEiR60wmtjxcbHhmx8adqk3i7nX/rjPCDUjGe8sb6yog9Zwl9XwsH/57ymcLJAbkI+hL1MCScwTOdCsN3Sn7ramxmDh+QRduUGbzJaatOeeKkInb/1SjzbqBHP7GHgJzIpvk2HKQjz29xsbdZ6ue1TgTPoDjc8pTqF8WyhkSn+vGH/bSvg1k0FP812mcv/MKAG4LpeLZgG3IvVkxohWE9N8exx883M+EkEjdkdYkyATvz96Bq9d5dG6xgUoBMbaaWf7G0PlJ+UKRh5Q3DYgg5Q6LjTTmY9gVYU4DPnP3NE83Fy3xtpLVj+4PuxMjywxkjG503HYwDf7cBPJHb/vRNYLwrm3t9bVw7lX6gK+amqOcsMcnlhW5+OyfVzy/Q93/D33mwmb4WQtzffuN4TXVp59163yOsUCN70cyacJEkcerZuQHycQbTe79c29cftbFzgSCcnARgcvRa2mrAeBIXFGTo5r2xHNKf7VHFHBj6HuHJkxIApjVkUANJWAnBgbuHWU//o2u33jFb7zin41X/GWDKdUx2QCgziPQpYa+FFmhZDxpU9RBXi8ucLV10oNTExUI9rNrWCwv6w3Sb9XvM/rwsrCWTeGv2zp0tMB8Yy5JcbU0wOjNiDwLsKQ4mLDz9QMDiYVhhm0VWBgUeFgGKOd3QGhbqxdljoRFTRKUjuhhM4W/YcHvvLAE/GY/Gt93M2MS3vfAGsj3Hk8eD3PJHqfdp6sJeP/eE/gvTkgk2SZbRdarWKipRoSeSUpq4dYGf4cjlXnFbTIEBWZoOgSGYQspNmJJ7F0qXH4aYAosl/RqzYxNk+QoYY3Jc0OUTKPYI8nUMxNYmcCV0swM7JR82MO89DtcnsXH4VW+WMB8NGPXYczp5yjHUWPq0e9QBXPYkYl8shS60ZMbW82HGX4YbWlwQ7eeeC1ATNaSmhkGWKqBM5T8GUDZOPXktVjTFq4as1awt7yoLwue6QU6VON3+fE1+qrbrclDny3DsD2QCjxMMgGEseBO+htQNiIxMtobpA7zsU6DNoD+jlagH2YDWGY47Ch8Deb8/AtlWms9YRTNyDNkyxYVU39LEgBW96K8rUoPOnGp4VbNVIANqglHLGDPk4Rtaa03+7bAHxNLUnJVLbuXgQEGrxkXUA1dcJ/tHGcCwACUX4onEPod/r1Au2qkF6u5JCDJHuW9eq1nyCupm+diC2xn0lryLz29hjLQ1H/VyH6B2QDPOJ03r+SEhicnwJDA0Wvn70oUuKu97ImIjfTE3QC6d1HrECswcQpzHGnQeh8WD9UApdcGE5dETO63ajYOq7hBKZSVms7NCRN4XhuSpbhYPGlYD9kGAiKMh7VuooAAZ0k31kQzpQ1fgV8DRv5R/pOImEcuo68JKPZYlOjJYQVmzsPqjSXZBI2Jx2Hg8WedPiXucAGUw9A+PpFofWMLxquJiQ8oRygGeAK3AN65J/3VTKzgLPZWKIcaQL74O+LNPQjA9ZkXoqWdvsNl0jA/0appRl+k8Sp36kkFD7hyhdJ/5zSMn2dgZ9LlKQdXzLkTF73Z1t1A8of2OGiA/lwpAe+8M+3EmwOGePuZeC56RWZiqLEPjGN1Ywt7PAv5BPww9zcO4OjKlbZRQgBmzM80hQu/2KAx5pZmJEx88T7q4h4othtvtXwYHxpmBWiWp8QexwsmBRRnDhUelBfa+JoPMbYfGaEiQXSJZN7Fu/kN7DI95/uXXDb3/GEtBwy5N/d45SAtAW0YuZh/b6rnN8nGKgfkz177Dwwco90h+aPKFW4PrjFTfNQ0lSum04PpCfp9h0tG11b5coEM0bm7QwDsqa01wVxrRaxyQPl5An4kj4HZoE9dZtm5z5FGfgIWCS9580yUV4yVrFAs7Quj9GFUMyWrvwkIaHA7hBxXLsb+TQImwaMq1KXzH8HmK9f/haFcY9snX2v7nN8wNqHrjsrXywXUu6P/PPfGrik67fXb5mFiJ2uhegacyjtT/nsc8lvFUhurG2AAWpa9wJPAqf3MKJHFn63GaCDsA0DiFYZQzRujQA7n4ZWA2wt7cI2MXeCh6ptB36ktIHzsFywCwxwr7m7sFUIbLSn9dU9c5TfCIhfL6ZVsMFy5mY8aAR4L4JXR8fG7XCMDiehau43L85htUwJK96DPkMQschfWg/QgEmDMwyBP7zhkSf9UQTansd6faLMRk9wDBJounOuch9xvBTS7PAv1Kzfat4frn/Lpb5H71qIs2xgDQxOgAJCtDuINvAME1IGQdLlh7tk1zACaPJblH2sLn8ImHNnNWWNmpbNbz0AxnjjKPGdUKZHsJ2vcUXJ45IOYzrrQ8wTuqoN1lm2L9tFJ3CSdmncDjFKDLyREdMQn0s4ExkySAzPpdetK+KZqsP2YVoHkencCUAyf9lDjccdYAijbx3aiJkRGBmaUPK++52XYeYMTGhtDjcmIjb03LnfKcH6Ty/LGJuoG4GBH28q77WsO57smvbLj/XMCtnCNr6rL0bVxxMGoZuX3I7A7L1aNHcy161mNKOk84WkjUbOZa0xcj3oJILG1vyM24kFwB4BXOMYo8D3oKWVG2VGw/is8a2vqpq6KRUt19fDNpkcChkFfZr+/SElWM8z3gPUUFN8HmMeXTPYCALjX+Ru7hudZwr//rHttRjzEqJKC3MpzA+4Ge48j22iBpd/1KrliBH2zoXxw1T26+p4V3nFhwhSvy+NmJ5gbOh/8NtVQ8g28gvWyu+PeP/jUHjneNKOfkK60o0Jjrt+tc+aVAytrrQqIH1fjOd/l+o1XoN/nN17xz8Qr/loiD9LEfjImwY70Ag/Ri0ugX0OGST7eg5IXBQTzZzZlM1REmyQh2GgyrEgxNXE6ckA3nQhu1MG5kPDHwcqu6aXD7kZipjMm2fn96bWo0QC3KUAhgVTxfm3HW55Prk5kmAN7Ybrz4ftbG0gyFc6EPyIo51UakI8ObDP7gpzETHThz0VVXjWbG0cfvu5H3fONzZamQHD/5QxNN3yWB5QPvH5pQCyjFA2DBOeDCJDU71HHNCiJxbH/wFSxs9dGM+L8B1xAxVWA+pXYoUbElVgCCnYAGGIolE65OaYYG68CMTxgDRScxC70OLffPaCXlt3ZZi9mcCrmmxVBnAQCR8YBfNHfxzkAZ62bLHkaiDVu2pd6v0fhAKCnkWqM31c1WwMzVdjCMfXcQlJxlsXAU8Gg0U4PrgnPC6HO9tjcN5mHbXevm3qd7tJr1X59nAcu6R8LsLjhJue1CflR3saQYiSM8aHmFU39ACUuS+/vU4VvYovZcg9g1O9N/R4A8z73rH5v2OzdVa/ZvuCpicm92qMieRrD7ELkzwMEViHbRewH/cEA7Dx/n2Ll00695Dxe2FYD4FW5To0WV0J/AjqSjNcyyA4/pqJ1hjxlrUY8CtUsE0ACLjCORlPXGqiQ8EompDyBvKfL2tdCn/s7XTVtsXWgnsb8q5MM3nPFFPt5XtzSiMC1aw3wrwZP4dOQLCCGbw4XC4ugDwsEQOdxMfeSa85i9XlW8DnhPa1A/VIDHkV49Fnx5Qy086zzAcBvNS5dSZTtwcQnE9tWT8m+leS/BuBb3mpm8EWp11pTStUBAB/wlu/avuCzDJiVfBq19hnHH2DDKLJKnvv/AH0qcYtMRMvXsDh5gnYEDHQvzSRPcu7JShaVgOGH2IV8bqafC/l4cEx/Q1MsqFzk+CIYRrMpU0yfK4BPI3snH9MY9ZnuYdzLAljSy5OuJCkOScLtBeT7rCVoKmB8p8btGb9/Fq6UudI5sI+p8MkRNcUOPhsy/Y9nx3bgPpx5AlxATxlkbtQE6LKNtCqoK9k2tD1xzAfxpt7ROJ2eCfg4UiAPad9K3BfbWgCOTA+wH42SIwPUvlDj+ELtvckYB7qwetnAWecvfpfGpwNpmzJEbpJRqiK94rXhHkvN/odngRnzhzzenpZocMYTLSuCyqGTPnywM71RPwsAYRdJPsk2XQE226sRZC3ZtP0D2G9onh+cHE8s7GZ6H/CV/3eZY1XT60Kzjj0GkALe9fw+jdK2CVBaqRdWnSOBsZ8eDlxfsfmMXIz2zMSqvffeaB2Nb3KV7+wIEjdq/dBN55yJp/qpvKe7OKwJ/o/cD533AS4pDWsvC8pfFEBWnpuPMxnRDQYDuqBsGeTcDSiP8AZ9TQst0jFLPsyym2UQqYoARwHJ3vtJZTEnK/Cp4n0hpMHv+kzb7QsZx0WuexKqKl9a6WePTzYINlhzpc77kjwJf9HzFADsfXJSVM4U5x7ZmzHDVIcZ67IiHlUsGoEj15RoKbBu+knuLzMRu6TzEmb0g8qInsoybGAIQD/ftIHGcJIEI1lHO3gOZOX4/m/ubAEpAOSXW7I4mo40w1vdxmUBBKWczQErCTd3JAho7XPwf4sr5f1QoFl5InA9ndqh4toW8WEkeDYmAawDiD8EBSvHHuuRj1Rev5vExnOvPI6niA3Jxl7lpL3/H01LNdYJ/r5geeSKMvaRqCqgCAKfkk1hEgA5dVBYSVYAqJ6TCYhvKXnelEAx0wAAIABJREFUtTQ8JG8JQLOODEB7JcsjKqYmsnDUbGqdAwgf4OBcsNZs+Xx+FMOZBnqPp9eucrnHqbf1PvxdjC2WG2eKyFEE2JqwmPAHU1t1kO4Jzy45VqnJ7XHkwmqv1mcO5dEAsDfJtyvR5BMywHke/dmHhstzxDhBsrmHygdtKdfOCJhXrLbH/bu+4F5/90WsLdhse+YPMIRk+unvfGooALjd+0Zl4mtTETobmzxZfu39cr6upz2N3pyZ3ehI26jE08I4tQZDWT4kqHKSSKy9kP6huuERcwTiDgzifzjx9XY0Idfi1JPR0+acJASAkYnYC1fFXq0fF+EVMbBzcyrBS675fE9OyANIehyGS8HpIeHp7bt+YYsw82fVeLFh+4N1n/08OVhZcWR2Y4/nBgs8Ti8COViFZiZ2bqRwuBG7f2/5vpuNxmG2/MsigJa+tdVydqH7f0fAK0YbJ24xABNZ4h4XXsYW4NhL8rfW9g33CEzlIAP7yN0VDlz5q7O5YZqWKV82uMG+0Z4CfuMV9cLfeMU/F6/4ywbTkhFMGSh3h97IkssH2y4zscv4cpyRv4+1JbcFFA1vQ2OorDgeGomSZUM8Nkh0km5i5oz4wKrJdR/sWBr40AuQDY2W5pQnlB1NeQMDnxKy2kC3H43quUtqYuECxy5ypJKCBKrZsuNEROY5mPtCeEpK7Ca7xh2XGlBrvNtXJjGxnAvMFmB5f32Akb0oEIY9D8AL8FCpZGoKCGdAKZYiza75vTfeYunVPV/VLTdunZJ4qa7ux21YXjroNJu1abg1VRJzw8RyCBO4kYmtpmE4xylLxsFTfjoyGY1VhygNB/f4wfXhxolJO8Wj78TWGGdNavDOSecWL5hYwcVK8nE283e50tlUq4J2jX+rqQiUdIMjWuLGo5J3maMn8J6nMTcr38nEbcHG3Y4vhzhAKbgsQ6cKbOBaiEwyfsfprFfxupX8bjhcptFe2whKsjJxiZ3iTk6frd1r2ZTgl6b78gJI0I0SHwWwcNw+/V9MRhbXipmSoaQprg1NJmpfhcXRHk2ynhgkx9EHHxVwE1AR6EHNf4IO5R8waS6vwF8jtc3IckeGErq4u8m0RxWOhyVg+ySKqfs3YjQjDGbNvnr78fhYqMnEApaA8lkzDGzt0Z3HtLFkKNgw1IKztyQTaXrJHNA7iXhOCG6/H4ANm5ojFqKlDF4qjsbRof0ml8MOoAVgKvm8H+BQPArWZ6FT8q3I0dOrlaBtW5RV0dqrKbc6a1ngc99a8nMABH3S7CGTw/O4ZVmquHr4g5gZ7l/8ZmYMhGQlDAOhhLIBgUyZoBuZJbh6P5gBNiZyc/px+MQWULUyeB5E4tK6uzYQYooFEmMMEkyqoAjgVl6QCHpbAA1Ke/7v2QPLznlTTKXn5CRPFv6xmuw74OMkOZRiOWfVRuBaxSrMLuRWTVkKwCCQGp3wtZGlb1hukRE4hVNEEzcgcaEkeR3RrN8lEsaagbnkq0FkX2cj9dXDEg4ClJw45p2q7N4Dh32I1R4qz3X7K0nk77w6VoHn1l368XjDk0AomUMlK1UgzYPxbQs5j+cEQACwwIMyFuVzuHTvTtPKsRGS81xTZ/o6fNE1R5+Ppc3uiTMZD5x8Mm/lOobQPkByxpZ7ZvbvfVsxyBxjb31ufaZ0LKN8zh6BH1rSVUST2c3zYdmn5PhMcYvSzEPTvG6cXGYR4bDyBYWS/ifa/SBX1V9vTfAAPKtr/dREwvvhmfqeaAZkSftcG70PEkeiDjJ0HQ008p4mHsSCBN7jZkXjNFsukkPmIDvWrOVnYqP3emwWz0Mxmd6B2UB4Jr0N77F63dQkG/PZImwBLwFBtyXCJc2YFxtV11ed9e9wlR4987QTMxyrvWA3TFKPZN8D6HtX+baLGLJz6Kw7Z+2hYXEfJ7Rum+DqrU4x9Ht8W/vXAifG1Jk4s84DAnzi2zS72rCRLg/JfZqg1fRjQ6nAW04ZAcwrWLYZhrwYYgeuHMhE124LC75nM8R/qsHjcXJBMzU6430K5REtGVw+ltcGluoJer0e7xAIdA/dn+XeU2RfvBCUEwycyb2KVTNwJuKTtSVQTkiJz7G7mbfth2pRa+Nyw3+U9ybec4nwlSh5/7QLV1QO+Or3v4oVb8AL/2/H0WIFt99d55TAjOg6c0i6mUOmmhbYN0qiL/ACBuVUvlttVVcB9HH6Q+i0w3me8bwDb0DsQ/jDOM+48m2zPm/C0H5L9zhE0SiZT1swDLGqlUvkaPZ0jmcNX8oID8UAyEOs9qBqswtFP2N9zlfLs9Av1sRGIJ5+1OgYlB4yi1djtYBbAW5FnuXbf4K58QG3YRvleQdz5qHy5MmaQvSK8SVtp++gt301DrWEtahJK+uAuv2jmkb6hiU7frywsxuDZsePgt5Ihp2BKZzE4oBcWR7aO46vNQ5+U2vZAvCHxFEPiVbeNgaW8AezhDv9F2etCRXHCXoBtx3DqGcWyM02WvixM0h8qP709mL+DpfZxjLHlZT4vOuBjnzUNkdxJVQLBT4B8DlMJMzHl/ctLySunUTqAexSH6qGdiaAySYKcAgSPkiCB+C+EY2T8Ao7eNPIxD0+NeFZ5+OGtRfJwi0fzytqEm5ghiGDuEux+4tMUI0sXvQBLfsPgHhVYlCVaG1gvABYN1023o9GrfANALg+D/FCa4oEpXP+pO77taP3V/nJ337qXXp3AveYp0GON8qPp3A089kNYCSx1sRGztFyedsGzA2e7/YPqvGNNMPGu8/J463F3O7DBlD58NzdIFtGexKPBLySaOJQh7zLOxACol8bKP9Rrwlnd3ioZjRrub3d0tr23ThGv/GK33jFPx6v+Mso9mOxoHY77Mi+dPB9OtkLR66M00NVxHbXOnkLCHyyA2pqPPmum14ARXbXnCwHAJlnksoeur37aIuWkT1sI8cLKxc+/YKvieGDUnnqsNem0QAtzA3D/lQy9uotneGtQ1rj8Ly0AH0g819cFDWx4Gczjpzwgf58EZt5mMzTzI82to3VLKVnNxjyuIIDvv/VG5mFTXXadPsVsHqh4AXT2N/AQPZUDBfya5cxJrvZr9wEwMsfxl79XWNGjx8PHVQvM/kVGJCf1FXXv7ERkAIH6vkJ1MjZU2WXEjCzW55eif/gpQknwy7GbliPFhbI4tgY+F9+Z8uekmsRgg2NhH6jK+uehhqD/8O/d65NgAnE0Bry/VLyfQ4u6F6yMXoS8FHSiRrxfDYj32bN/oGdhJ4LS0aNBRLG6IT+hw7Vtycsbh6Gzn3JNShwRIGPBvDSSa2/F7AwUIxTgldmBsQPNaHeMAEp75FYcyHTMDcHWclSGgosk0nZo0i+TGwIQI2tQU3r4WIZnPOFUkyUZdl+irpSQkp/NRN3ezSTsOUW83H/SkMbaLlK9nlklJkAwGmoEVXY3tjxB5/PSPiQfnhKpqh9J/Jx8AM7ye71XM28u/0PZIkaV2N1UxqIH9kF5CT+yD/YFAd6JPvf47BnkPSOmxvdRMwxmgFdBfeNhc9HMv8drpQcpmmKrViiVzx/6mHe2A1YU7HDeFeyA7MZ9M9im2uHl0gKcKDkVXKi3Ay21bOu+wYEoiUWAMmW4NzH2w2oe12FQ96Yt56rA1lSKzj7L8WUDSSyWCb6TlYN1ExOpq0DcEQkpyKDUidvAGNKYii5Zyl/ocQkdheAOXAKobMtcJLj6OZ0gwd2Gp803v6aW7wsuKcz8ekpGUfANbWQaYgyZkvHVAEbEBEjCww1jLwa4FgvJd85sUtiCwQFio1vZrD7bgY3Y6cDSN5D8PmVVvWNONMYehYfYCHGeP9u6Tgvr5RIpP1bK9Fh5XugNTe8DNm/x2W4YGDsgB3ALhP4scj4/DnPBiNzGvixHtMXMl1l8VnnlJ/JaQ/4Z2hyVZ4roi9kJoZdzHKMoC3ACdNVRqi5sbzWAZlt137hmNJOSW1l55hhYGFkwJWBzBtmOHszHZkE0QILY1zdbOL3TLwQgA2kzS7ilhUgiD7rNyal6WJ3g+6HXR3rESJqDeaNd5tVC7AZcc7yBGI+Za90O7PkYRSvzPCuwjNc/puGj33jP17n4nl9AX6efgBonjC6Z1WE3sDS5ytPBjgg0PSnbcy7mMIln5KanC5pJRX/k3nfnxm48gcigQ/8oIeHHVLFjavzzp/zJ0EDHw8fUH4K3v+NbUNNxANg1T78LldJ6TZrsxpB8cL1lOGofKzOVD9wA3sGlXup3tK0dDHw22u4fHExgD7/yu/kNBhDk30Vy3atO32+hUMoyjRN3lDCkdMVBtgnw4IDu+StGk93xhrVK8cDp4A0ykUmEnMA8fAcNQOu0BSIJj54iyj7EghcPpCaAAQmxuC9sFgyhUfXTDFckssJwzqsXqDzuexCOpCoaSqR2PbEHiTnWRKIZb6uM2ZIYgSQxFTl43pW480Z8Uz1Z6U60I0IPZMMShDig8Bk55pv3PVV8QkM+TEN6Lku2FZt4IAt3tfQcx+BnpYLv8/n2hfcDB+48afY9jEXdhN1BSThhV/9I/7uK/CCZ+CqPK+n0o6MKRtBAnO0LqfUCgDwXP3le3WTCQLGO2XTVAqy80aqOADIQNipzyvHWNvxU2D6ENj8koE2lLcFSNC0rFrGgZKutIBJSQJqMLtUGjIS9wjhEiFvJkqrbsVby2gw37XYbQRKqo4eKEtgXeWYTiUSgB5Bygt7Kg5H/SFsde7K3LRyxCKUHCl45Kp0sTGjd+EjIJjsz4lcgCoYj9hVm5VqUiTlttSRHdmwUlVhc4hnUDcrhM+YGS5f7d+XMVFGwEtA542fwCj84X+w7Q1M1WYg3ybU5B4+gCjJW1kBnL4/kNFn5Nj8nZ9+7tl3uP4cZ+obhvbPyTBEfCh/vjGUAxTJBwAJM2B8qgmYW/twBvBilFYppRxdsTHSGCeNhNnCdmrCbWNjmlWI5GQQAEBnsibr3Rw2L9hesLAmp889UF4rnz4wOO7EGGncw5rXJVrTa47xOuNfjTka3hKLRNdEwECM//DZD7L/iV1LFtdm4xXjIJrIsAeZ/8gC1tQOm0a179QosIGUOhDhjOOPCqCnEOr3IkkEr/g2t/drHAth1Sysz+FstiWxgoqh3YzQfa69NuTP7fFiTpCTnlQGvC2xb01uy9/FEHjdb8U/x5+anDxeQa9uYP4cjvLyrOmbV7KJWL+/8uyhgmUuTj5/p+s3XvEbr/in4xX/PzsuMDOaHX8/vGzqpl/SW4WAAgCYuVqL0GA9WufSE7dEA6nA0SNEj5WzCDIDzOIc2Eq2toe67YmwrQZNnmQJHxggw+ojDTE5pdQmp+lH+9QkwYZHEWTvToY8HQPndQD1lKu4CUuWRO7IStBcDxIAkiB5dX7dqC8J+S0tHJ3vt52E3/VhZh/w1CavZzEeBfOZAHsmvqer+tQOh1Whz8UdBsltAbAbY2saLKkNvjD6PYcgh0iN55lhJJBWzy2BOFxMAjaJ1Ah73V+HN7MhDPipV7zGi2vFrM1v98iuqKmzrGZZy9+caSYW62IsVKMLwI9Hk+U7XJ9X4lr8vFyyVdigg6Dl7udGacJnscsklhI2QGWrE9nrgoFWY/pW9yL6WTqeSUyxIRJF83MVzMBjTeaRTgSCldSjYM6YAtx0oCt5C30eRK1JNgZRWuRKIsp/oz+rEoa7DCPd8KMshNyAtWDuqGOM5rIKlv7Z7J0VPzphL18LNoDr+6+WEilZIN+aKjQa7S4veRAVfvE6Rn7puGVoPwSAjBxkHgh8uSS5WQaMEY7yczI7hdzFYXmO5gcnJvdF9i3ZVX8IyFkIMb8ZNLgvfjxYfrYJWLydsA1/sXSYY2LES0Dh/WD+K7DDWup0O1oGMSoJSe33b3T9nIGPOx9NwHPGPxO1uooscIt0AAAZh7UZOJKRX15VDL0892Rqj1qeaYIqrmAnXqVZFwdt+AjvCYvtwFWN0CrSnE1GgIlTsZdK0nLjs9nHpbPNc0UeLyZGv6k0Ih7AyTzXKdC5KxlM7kBq3URo/blLh1hsHWTr/yLLX7DuUSJNckkJaR1XzD7s1TrjylOQ0xhaq/5+ND551gz8b+vv8zxzgYap75QoWZsqZPnGAs2H4jeg5FqxR14Xn3YMdDnhQl38WgYzh6a3lS8MR0bgjzTFxYdEx/gJj//BkPHnXhuG0dOEhuhiM3TW5kh8Kyw8VTZrLVYDfg+C+QSWDmu//fRsYipfQ2itP46LkdS05+XADNB/QiBg/aDxrC+JNZipMDKUhF6a4GmzllNg4a+mPjZiFPOLH/R2fjeA5syVK8ws0J3nG9PASbk292YLCgXUdznNegLslPjboi+luYhrztzXHTc2ZskYWXIKH0x1Tx6rwlGTRCRmAKazbPWa1KNKeh5k5V4tpectD7UxMeT3057rOOANEK0kUO/J96jCg/cgE9gC4ab9iXlLkuRyrFwEdYwgQMJxiLbeMjL1+K/4iZWcetkIye0AWYCc5AgNoJ8FPgnUNlCUeI/y/Ri9Bka+tWyfEo7f4xrBtTAQyrue61bn/mPsqo2a0Xgs3v5cA/zDtQgEkmDkiAcYwFixlXcmnr4YtVYdkO0PgYmeMrQClx6+O2ktNRVqOk2/O0cHgBUVU+p94nwBaeJzfS0BQ29IBRrpjo8KBQLcYT+wwMm+IRmVrv1Ul4VzshCGNrYmkPE1njOGRX+uFDAZ/22tWDBffuTb8YwvKMUATlDxb3bLPnmsjuEFggVegJHQB7CJlJaYBaZgY7f8scPFFg8Uw35hlscEFK8ciLVFdjwTYntbn03XNqZEA5h4Y++NNR+eeS4JGTd6DCQZxyVX+LF1rj9UDr7L9RbL/cddk35VmyTsWbvojJwdgrSA6v8/fXu7fjrNom13N/+q9k1He0Fs6Dnr/Rk3Aj15oPq26tS9z1QRGzelGCBgzgNHpjYp7WjWU7qcilJewgXP/7ZSkVj9nWF58lFhLmHWTWnHgitej6i9v/uepMiRAFVJLABYRSueRQVqLkdLmhY72+1AnlxD2i89oZEYAkvDLlwCYGtf3pJ6r2tbgW7696onlSO6gLJVhM6Hvny64UPySu3x88iFCQlqSnD8W/fnhdg1JYlHvn+p3lsYOTBsYEQgcAn3qrz1Z0++IR0fuhkFXs58NTD+PS7igHX18EpckHsim9/5E4D1lACpPbpsoJqhNSE0rNRN9H52SMl1nVhoZ7K6Aohk3Ln/ji9yT3L4YdyX8svzepawfE7cv6uIBLAvKh1pOMSNMZH7E6WYAxu95usVmYm9OMlI6bapqT81J90RInIvM5iI5AHg6iCpxWHeLSjHpMzrA4eLp+1HovNc/LdYpgbEwVo5XeeyJFhxYZZ044NQxcYH93lNFXYoj9FYVIbB8yVMSc20JPkIQDdUAE7EWwQSG7fJdy5DxBCS/fl8HKvX4KmxfSjXW6vJ1Ui09+FdeRU+/kst//dev/GK33jFPx2v+GuJPCVg9bW7x+7W5x4NJcXweIyQV2L3ZFlWcsSi+hzE/YCsgkQ02yuM2sJMctGHuSYAIb4/mPbIJC/AIhtkQNQYah2HObK9gjhrddibQAU1vmb57sS+Xv/U+zYYJxQiUYZowGZBlQVo7y8bIiB8IgKZl0zMzo8VMwngMTO7OHOZ6RpQ4MHjIAp7gga8J8dYFkCNlT8ZMm3izVe8nYFhJIuRmQO3mKhpm3JqqGQv4bMS1cAM/1K08plt4MF+Kmvsxovy7k35ZwLDLzWeUom9NEiNCViZdWu5AHa8EPh3578YzB0/x/dhhANki3g+pSEfn7mkztax8utDyxZWGc45MNbxsCjmQlbBDqAlZMB7RWYLn/slk/NmHgic6iJMMnfPvQDUj/LwNJRO8GGzPEcnVc9S/g3oZK++U58nXZBnv44jvgdAZBJ17s+MARtAxMIt47sR3joHHmiZAR8hViu6CR4nNcLAKV6sjOVDU1Mm6cJidQtU8zzPZ/uizBPIGKhn8kpJzKmhnHlY2W7AftXE5cUiDN2q42f0UNJtDPpQEw0sQMOAMGozXzL7jShJk4G8+J5mfLYRgaVg+S99bn7SwNKYbRs8AxhlNJtAjjiFbgRyWDN1v8s1AthjU/3U7IzMY8P8IQXSui7aazn7uQ2BZWZ2JGMeADqZX1pDqQRo7A6SMex4f+latfcAnlcmELrArW0N6s2NnvotlkkYTiYPnqeJBDSp4A/QFRlk8TrPgkia53pr/V8oCaBDAg0Yyph3977thvassX0ZUItFQ33xr0V5YGFC0mlWTGrAVKTzu9eUYbYMRu3LTKB0wwNnehapU9+WJg6BjANkdGK9D8OqnmMBKYz3kxK8sWF+dfJ8K0t7LbnLmOHOwJ/5RiDwGqV1ntjTCcolJzN8TprijoG9P4FiJtkHliVWLAL0w2DhWEOyYdv7XKlzcyMehdT3uOjC9lWWbSzvZ45cklHD4/SLPlP/b/nnrGnWMNg4RYDZ8SMAyGiu9yLQYQSYFKtuux+5mwCzMejz2ACdCumKKRk9jTViIkH5J5f0QnhKk5+v8dTUa4N8u3OoGyrZIwBbmsR6VVhlESVA0ceFij4r1XXJecgeCAwTI6/OJ1tITOVAAY1+PUDQr6bpOTiXwWlyAUIiafxAYuUxZq7XV8F6bcfnqxiDknG28+nMCsAAStqIIJs8ChHAtXHvjSHpiEHjG6CK0gJ9xMJ728RLGsweB7woRQDkk30/+rvUd7inddw0m11wFchhfuNrlvj3XzWdbnXulf8rrP3GDIfJ2QHA4khxxQ0LSUYrvsHHwzP3gJZnyjwfLM3dxJZQ8ZEiuwCQpHWdS3js95Lf3qdxpH/ixCPB6WVkgDbs3cBI1TMQ6KDc0AxzA299lysWpXvy4R9hC4EBOJtiJ65W3bY4PW/cE934TtYUz3OlJJqgT1hn21Opo+7/WN5gHtRcSMyHNOV83OtnDhwNXvRkIAtZ2GascbABQTLwJitYNyglw+kRh6Bnt8CiRIz6WWYTa1NOxQwY4wUT4DBz/MKMZu78ORZyJAlULoJXgVa4lHsClgMB1o3vmnYc65dz5O+/yNQ/sWkU09/YsAPwpTmxejk8mhaGZkCXcgGf0WEv12Rf5W0GrhXWo2rAGFCEN9bZUG414LiV7ylueTs5UOqtcsynqguEoSCRLuKHDrt0nGmCOE1hH+V56y1LBeAB8lKaiztM03SGBqhjnhy18jJ+rsI2gtI/OOoNJDloStA2yW5mGLllV3B1HQMARfTrfDPREkrbxpHX1Hdio1OkSAvMfMpQUgqo9n2GQLBMvDbzsm14EKAD78kmbjU+yv8XACXF6++V1z4nOGLcioWps41VnBmnn185W8Ieur+fwxtDivwJT+YeV8ctqoV8l2sm1UA624iKTwnHq5/XL+0fjEeN4bkbqxodM/yptkWJrjxKRWZxSLYGjKoLWhrXtH85jdsaping2ai0U3URpBJypBbReSsAxNzgDAP9o3NF1xJTDXfzobixua5Ebi7ytX4933+EpJwHwgdiTxV1mo7zDZJugaLhkxBVwPOJT7sacmaM3yKK2qAs5Fq7JyDTomvQqvtYG/O73uYdl9o3yd+IfTXgXUTiInKbATEqLsSJa6iY+HA4yvOMUxhTDCe2ksRJU/drgJKTIy6kiCFpJB8liHMSM3WYJiUsTmMNjxj+Zcs0zlXT+J/Y+w98p+s3XvEbr/in4xV/2WAyGyyFn4aKoBTZNJzD3p7/yretgil84a0kvVl2e37RRPf/8gGjDCUTLCgB+CJXIlCMTAPDWOmJivWf/OqGbL1VAsWjF01ULzAJ4DJxuE7ntBPLqzdbFyvxdZGU6exsQH4+kg0AOfFMVgccud+csvJP+OJD++nUxmQeyg204miyIw0vG5S4SurRtgGj7lkVrsWUSmmV6z/0nR8HSO7WJt62YCFN1ce4ZTOLYP2+ZU7qmD2NZLnwoXWxjUD0xkQzMU1+TyArFQD2fuhXsmrE9Im7zX8PcwPJQwhKbAGyo54IVjxWIRsTn8j8P9kAf/eVrikVM91XJqbXLvbu47n18wWa2SAwAFADI1mqVj3PJOjr9h4BuEb3wx1l2Hz7o9iogjoTr9LezDpUyI7jJ+XoZjdgADZKHp3/00wu5t8+QIgt3FagEduOM16dXDrektEDmJgz4Sw9U3a+P4CkWbroR73HWMQL4LK7mYIeGvHEbl+KPawZ3lWkpSWufZKbYmrWd7I8ewDph9ZV4Ak2mjkCYMatJtnd+wpYCowbCfo5lc53mgH5gpvB8hMf+2kASO3iAksBnsndGAalcUqn2DLh9oIPwD5r/QSu5Fr4NDxAOQbN/Tg3In/0ny2c51ZY6xt/l2uPAPKFj03awT3OWViySa+Mlr94nptVvG+YSBOnyE5bj0InsEvL2BYzG6wumEdaS1t14uuGJWaWJe9f7XczFknlv8AE7BRViaQ0QSU0mwCagdMkXA4DgD6zvTC3ZFZ6yvYTfW40yHBshNMNl8YBLCaGpH6WgO5xDQzJhT0LwmvN3uc/GwhFJ19XRJvXc0pRh5NxD46Yx9NGz2Q72W6o+6vY4nn8KaI02u2A1D1ZgyMbG7aQJTOqt4xIjHhhAPC8W3Kt5GGAE9dPcWUN5F4MvZjpeOeNaSwti8Ti5hjy/lhx5IyKdY6x8FqcUgxLmCbAbdRajD6LvsN1I+H5Q0aoZ8KzptIBMBa3ZO2R5ihfOc5qHtYiz+GrJWG23adQVN5kOXr9zu0IlPyK1qnvXr/jQbNhwcvTdSjvWLhwKa/ZWa//NwrwWU5muZlh74SbNesaIPB0d3F9sWlj2Wfu1YbOiQj+bvfS60/scKxBn8iQHITbC9PIaCVGXMmlI/Zb4CTX7rwd69I+gGHpLJsFHmScSQkcvyUWXGevAIk/0wAxjA9HNrtp8Z6BxKdy4EFyV4QKfOawBSgWsJYWvc7JJL/gNpkpJGM9LyE4AAAgAElEQVTt1HQECWAipGkq5bIA8JMNOv9X54hVuNJDYep5GCjJwU+QmZJv1PqLibmfeYlhh3WR922upHR1GfQ2IGDo9UQVBErZdIPXo2Xj3G40JVOSNyQZnRx4PGIc95d1nRLmDWSU/I8lkCg5yNXnc+VPV+VJRt+mrEZf+2acvMsssJdyliblJYUUqoncvjVbBB3H3Fy3iTe29mWnV/nCKz9YZOdpPJen7soFi8o7vZtINwbvSz7ubw7FCNIMW1IzH0BJlRv9B0OIOGQGjKXGNFbngwWuRb5xT9auYcpJAQz5zG3bqC43G6shAFSfDy8MRNfOI3/WLUREcApTtSdywDMx4uwvk9W6p3QRsu45QWGMn8pzgAmDBxvGpekf6YhRnr6U+TMDIssU2vDdJPJK8KKJbqkGSp74cz+bMbrSmCGZgFIP0X4V5/LBFN4eXdoXaDtjAPILe2bF5XPnhs4Lx15YF3OhklaNqrsFAlXuWvtjCOCvSaxW+PDykYWANuvauL4/khNoz2mzDWvfO7Nx4l3WFG7VNrPPeAtJeSZgvmg6bujcAA3mj/ZI8nSU9FwxHiibX0ob+zSzunEB1DQgDeAfZBawAVHNiDQA++EJCOJLFY9ITGC8bGfDpN9YEVrGA89hzL5bdh652jh9JHGtz3l9IYdmbmQErpLCm4kfj2mL9PM8WKM5btT9Wdgm3+0cGGPgvStX/h6X9bpRPlb3Yz/Wk89W5zjrj0Bx4Tst+dvNW8dTyi1aojEfz0L7J104Hf2/+OzewCPXnweB5lqEmrrJXCjHh96fn+cVkKe08pldRGo+3IRjeoHHDtcKSpGhhgjMAPGCarrsvTHGwLVf3Afgd/X4uk4R++BoGQ3g8+wSqb3rcm8gmP+tW70T2Jsxx78+F97HaoChAcyAnwmjsqeIFzKEFzwnUFDEk0DqMw3J81czGWDzyw+7vZ954Y1s8LPBF/Zn14We/xKmS4DfhsPvedqZVUtfC9b+0rwt1llsNcB0UyK7Tj3Sw6cZ+F2u33jFb7zin45X/GWDKezP/2o2OPdhlDRbB6dgLbNKM8Mad0+r3HUzfD3MQf1L57m6dwAw3MHFqMU6CGswyTqSVtUhHShTZP/C6KzjaNdhmTTD4r8aMj9QrIf6DEcR9fg1lQbm6TIW4Lu0cXjYAQw8vbZN8gznzsJnjdbykwM8TKL7dTLVjXYT4mcQq7ZG1+F+PpcvAKGfObrFpwGw+ns1uDDQAdVg2BcX6ZJJ5ojDXqa0hpgaNS4fGo23IXatCpbkkWBBlp2ZI+yFt3T3a8RwOAiuAxiYLW3xqk2zHGNcApf+A4tizfFzDvyBO2qDHimv1LOm2fYvgf1vvqzUgpxMY1tqtj3M4dgYreJCkjjSfue/s+HCq/aiWEQGZCdkTymhRNqFgNHrS6zuo6A4OqGhQXGZbNapM7pYGFDingQhmYRtDCWPE6FnYNhegAiTG674C3PXfipfDp2qYHNkikXQuXb6kdMMANhKxji5OHL0aHRigHM4LKjnPjILqYYLXKDJ4soeY1DTBYDvC2smImko2/dQ/zv8MKWBPN5NvcmvR8LDgM3veprNhj96yq7eqgAh2l4sNmA9pbNqfa/W/kBWg29vWMlcDoJ478AZY02ceyg92PfDW+C/srtzto4x8IYXwFp1V54z+NtcarYXO7D92vaZiAgfCK2r8iC5hsHiD+zFBuhqxsrzvlTy94Z5gXmDGVP+IKMMYAFd4+st/VqJ25EyYgyRwWlKjhEGA+U8AHQSyfus143RjJE1jmyVqZk5kianxEYeoF6tBb5SbyfAI+w05h8FOWQM7mJvu1PqqwDM7WSvUIKLSNXAaP/BdKPvWx5TUc+BVzBOv4f1JzpTwYFdjKcw7hckizp9gc4zLPoZbQX8ncCWTE5JbvIRlFb6RGgyL3MiZhWLWgvxPM8o1+XuyCsQSRLLFuBBJwLBFkqEx7owykAVQF51XoXkNZIAlwHDgGU/tVb0zAMY+TXm/52X+UbEG2t+PBLfhNsbkDwJPXo2waqqC3RSMvE/07pG6iEMwB5lBLuaGdbSQPnwbsAN09TKVt4VIc9AY27RyZXu4w7vBvzM3ey2WblcoCU/wo6sGl/MBLt5PaPiXQICX9NG57CUDyITdbgScGejjLlmYuYPRATl4XQe0wPHAOz2htp7Y5akhAgWdyZBX32eSwCLl563AU0AMJcWOU92Aiac5icoc5jAFRMeOD/PiWbYViwauNKRkZLs4r7qcxb0NijQqPKKEAvvBUlCGGAR+Hlxkdxa+5GrmYNz56NQIgiy5wb2kqRMEtg+K1SkKMV3fyNKNqfIJogu4r7LdfkAMFoWY+Oz64mXnl+bMsPYfEhm3+0/mj/OgwP4c0YtfYDruwg7Q802gMd6gwNVaymWZxCgKGDGCwgtGSdPNaESvi8WrGa9NiMCGWxQzZJ7+4KVHslt9oT0jJJNlyv3gRJaTvxUYwTR+ZpLE3as+aLjU7OsQLEvGGA52ThF4dz0zagDi+Amf8UuIDPxCwCoHO4Ur0h5bADZuGpL5+WPbnbNQNe1cRLHLwDIMZ8/6h2UGwM8zjTKnZxs3wD2rQbcGJjBNsS+Crx7E0zPwHs48HLsveBb+bgfH7ads3dIC5jZDXEfsR34yPKSoX9Gen6R7f4O1xgDkdFnxCzfojwTtfvJB7PymLrhW6BQvr7Q4UkCmAd8wsEKZhMyB89BM04JNhNacd84MZjd7HmrTuX7I6ZIr4YbnCQlq3trrS4B/TysE2rW+yHXLjC2zAfSUOzvNJO0KRtYA1Q+gL25xVyYQdLzd+yTT7m5atMtImnouHVcObuZ1GeAbcDfnS+wkXDuW514AL5MXqWapW6qZ4zN0QaQ9PkDiah4nUDFvrrn29nk6hjQNWU1lllzs14aWJI9r1bHNEfGDz1X06nBPAVmsNjHuwnZMpyJN3w4Xhu4y7sMG7cfZnzdk24C2KU8x/Cfi1gap0ie5/rfe01hQm+txYo5c9yPfOh4qF/aaEPkbz78mgwCpqSVs5tLABAPO4g6P4/cP3NmrpnbWTfNXbJ7rKXsse4LED9xw2CLuN98YmCPvK+wLav3RCLzsyMhqmmyuXeefjQedNnj+wx4OtYI8T+SDcXxH0ScScnh1n3cHUHbCkAg7pGiNzPYAIZknnNHT/BUjm3uPYliKX80A7aIN88mp+ONbZJvxlRTfYAKR8oBtepzSJY1rOMuJcMKrK+8y2DjTDj2bQ+umY84ZybyBXeef7F5Pvq44WoUh+OXvAZArDaU3HtTvnUMNb2BtRNTe+p9RQ+OvoBu3s5vFqt+4xW/8Yp/Ol7x1xNMuDjd0gVNTfgklpLsudGjj33V2GX9uSeYRnedu9mds2+s64nkWEpEArY5ms8iRhtw8KF++azGuFSKAambzhFDvd4LJAhsFXPcFNUJ1EJEnjFeZ8FTrwNYZJVedWbIKBaAmDALZ6qDmswMW9UptfA+FBAD3YrKtx7cCeLmR8eZHfzqUutLK5BmJiz/BDB1Dwr9uPr7ecQZXa0iKw478h4vjf4bYD9RuYHv8gWqs8c6dG9pbAL8ufsxLWTmQG4kNnxYA97AYXOZGTKOKbFriqmmNn1MABqxjx9kAIMAFJK6oC99/x2GNY2bOs4aHN8srmxXp/2uJpkO230D41LBfFithxlpLWtniQcL5DTY6kp7Nhl5lb5wZCWwfMFVxcSDKTo88GWtgWBDB4md57knUxU+En0+T9UF2R8ss/a9ZC31yyoxWs9pyNCUFbIBE0utD+ilCiKeFO+APUCAHHitMxJd59Nn6buODcuSydy4YgCxEX4Oy2LcWBhCpq51rlx5xvvpTaXx7d7L8/x7HAAGeDMsW8KTierG1fISrd+fRlANZE6O/NCZyHPnMsMWKDMQXaSZupdp0XsM22AFJAmUYcOqQFdH7CoO9Mz3C/d1pJKqcdfG8P5YGN/kGuEE0pxF+49V57nhVBoL1XwGVPCakxkOTreuXzTdCagR4HWxoAlamFayt4wrwH0CHE3dZ1H2LBxN8jch0Cx1zhXD3BQLLK2L48gz+Zi9vw+jCYEGmOtLL2ezmrH75zkPBTSZO0Jg9s7HJK4KZxhwfPye0pCOe5w1UIVEAffARm5NHZd3IAYlGrzAxdqv554gObNbiVHiFEjX4kRsZgICBgBg2UcDfZWvwAd2SupExr1jjyaXjByIpUJRr/n0PyEtAZgNjLm5gqJYYPdXKYY6IzUZSS32TkKOhDpu0jNi4qV1Q0tE3euHH9HTe+XvvmY6Fj6wHg0XAEg3+LiwI7BGtAyM2WGBhvKtbQfoLiNgaPoB0H7pCcwiPYw2NaavigoWPWOvOGiG8H22d7PtnjvNEcWIrUaWwh9zxGcs09SqobWze1rLDkgM7AblIUkjvj/34W2JDOWs5kwdh3daVtPEbKAQlGQOxAkl88dkcCa2seCfMcgehM61/k6HKWwlCZFJHXvlg/34XJOzJdeqqRMAQEzs0VCbvvYGiSXEXffgs6EFYyJt8j2y/DfqrBBJynY/l7TAq5jKMudFvJoF54n2/qvNcwenbXNt3DbguFR8XVoDv+Z4ldscxmo93+9yLakc3Fq5Y0sKblgDdSOPLMg2ZiMxjg9lxS0ArTgQD3IdJ8551VQMQYynzIXWfX0OTddU2pZqYs6+f2TNAlUnFcnuyaisBo+dHEixDm4tTzXXi0ftY1/eYWq6amrD9uN9Ce6WVy+BAOZQIXLdeDQSKCwp8Dt+4JYfTaq2CfvZeywx0I3VwXvNaXmx7TGatVs+lRsEeMwAfxDCnrH+VbcC0Q2skkX7dEo7ZTLXrzpy13dtJhrXwRAwy/BqsH1jdFOg9nB24/0ZRUa4coPznJ7Xhnx9ABwtmqNeUU8EAMZiM2/7Qj5Y69/huuPGnoZZAJZAM4JcJZE3kPjlHkg5BMk98trV9Lhg5rhgXYcENLEEYFUdC8asA2ufyTuevMfzlYDXD8aK/AmHYXkecl8CfpUcn/wR4up68NqspQxGHIHB4DTASo5Pf+b32qwtDPKpq8+nvGaS6EbAkbU76yTmpdwvOlPCAElX+gb9DXEY4eGBuS7+XgvWNsGYT0KKoXwtgNMQM/0eYiqs7zeLPP67GtlkzFdNeDzCG86SogQlVh2mxmFNvtCsvaa3FjzfX16fWaQFwG2gpBVNYP+M3Vjo1hnKmp11+Tbv83wPF0BXBQc9yisGIrMbj1YexZhscn6TS/PjKFuKuu6xGnvwfeP8a9XQigHJpkSdS52fZyKHDOwfVg1PRnw8aswml4rMY5GcphCmgFI3QfljWXsZJQx3lAzdEIayuq7YSJAPa8TGkIh94uc2Nsi0egAAb9+9TmYm9qy4rZPcWR0S+6Q0XPNjg6SXIo4gvachxyKGCJgkdHkfQ+euJWm67Aa9+k73mWbvYw9Qh4pFg/IO/KLIgianc9udXKkn9ZyWCrzTVze1Utjv2PSFhgE7r542KkWVgYT3YIK1ZDUADB+Id3azbW7HxiReJUB7WckJ8jxwNRnLF+sLfSgM3ZyUHC3sUvz8PtdvvOI3XvFPxyv+ssGUFxD76kO6mgDmjmuX1JJ10loLdnmcbiasQcky5R0bmhxKecZwtJwjfLyRd60D6e12gAawMuFiC42wZswdRkRBw4nPWd18U5+RIC7ZAmJ/6v1rRLVMJ/tScV1TDB6zg+0Ib53kJt49BGSitEofRRJGYMfDK6eCTnLuoxKp3mDd2Tec5l0o8WMyCwDX/ug3s8EF9BkMHKbntDXhU0UKs9zD7MEQyw/HULY321F06O9ErWQtZncsr8IPvL9EUvQiYO0pozaNOC7phZs3KM/RRh1Q5lgFymBja8kWCzHT8eIcPLbnQ8ZA/jOx4b88zu9wjcAx1UveE8aVheHA2xauI6QKQHGyOtzGKR8A8rkqzL/8FeKARg/OWI0i38MfPmf8qT+2dSAbkd2Q7WAxcQpyy2YtEzAwWICapaAU0XNkk79/YynZvhY6iIVVg/kEthxVXNc30x6uINqHWnIyC6mDvCRFrtZM5+/Wz++pYHBrMixh9gakg70FqNjQLu778fX51T1J7Z82QKyjIBe2ijTmOPV5lXzaAb2ob//ini9GbQQg5oIpiHJBv/ldCQXpZjh+ogpeiC3n3XR65cTCYa27OSxpSFjMui++AQDMb7x0Rt2nnus1R1D2e22sYZAUCUHdqMI0Fl768x1qRgJYSjZeALaK5/e4++wqyYfXwmHAP2PpIyYlFeyRdqP155VcPwGd8ifsv3M1CKv4zYU9Sl6gZK8OML1tgUlnL03ueVOB8cBRO57Vnk2g5XGAL0+8kiCSdF4AEqmm6sYBoM3fDZQFHK8ywNRaWfYmpm6MVdmjfSy472YcymS+b2EBOo94gYCJlJLVpHZrVi9wpBvLwByY/f0yF0JTECW/sfHCrkLXXAkWANeEREuW8dO49uAS48fWbC/IIfNLPleBK3tjlj60Oa71J8YYuDWyv7FbssBj4CWZtOODmD3x+S0un0CsjvvlPTHTsEYAg1PGgIjGBkC5FEtjsjDvMZSD6Xzeu8HnbdHyUS2T8PgI1nLI3DtmUN5YObHD9HxLFi/qkAWQfsCbkkRJGyI30/j1aMbXPvDO8WaMzkeOEfXkWkzKg2Sd6wK2XMluTd3U6wzcK5ROUPG70SCWg/IKbicW30MAsq50a3YZUJJPW6BKYLikMGpC+AHY7LHajyeVt01LtIOCR4MW0fHzBev7T/goAU7lGqX6SvrB8jT70kqW0DCVQ1tMLKZreK0fOjNuXPnSfQF6qkAH18ce2MOx1sKIianiahsB5O2Bj5Qkc8ck6/g7bX/xTf0O15pvNhmVWCwrH5DzXKvmqHzfDBh59/kTHsBSFtDg31Mk+lw1ZWACCwHlkL/kWDBJmlTzN7xzBADYOJ648E25uKpMrT5HkV1O/FvpgFP4xnd5OEUXwuWTciF681+YX+T+kASv0//kf64Xaoq62PHpu4H2sagUEZHYvjCN3yWaGf9quUFgNChQk0Tbtlj1BMSqcbaxu/Y6suveE42HGHZqsydoWtPjM4F7lg/njbfW/Yj/YYwM7iXKeZGaBNPkCagkUk32hcTQtBRrZwI9G3p+O3BZnTep7/dI7Gzh7txanz8PELmduUcicTnvAsmL36txO/wCdqCEP9au2ucofbj8EVIArYEt1+qrvZYaE2ZqovPfClgFDv42ahIns8l/kQmMm3CUnQmnQlB3OkqaKtWo2RbdDA1MTBE1O0+06AkrklCtwe5U7XtY73GajFmSOa9mmqeha6OAIABcJ4eyOGByJ5mJiFu/yzErlkk6sJqk/IKj8z6P0fhBRoGdaNl1PhLt4ZKchWN1nH4k3HWe4Or7N/KQldu36iHHCQusi1jPiCONByhnsw3Puk+sQ+e6BHLyPepEHWrabqQImAdAs+lYSzVrSqLPgCh3nsfXcOP0TojwO3WGvAdPUk4ef+K7XJXzjTGwdyBRazMQylXDHVMFU+dgOLEAQDdg+78ttABM9Xg930eDQ9hGTG7EahCaGd6+MR6+esWqHyVvada13s6BWdPtSS9N2JF5L9lEmME39xTrMu75iVqriltm4pOLxDJHE5LKcgL/H3tvtyRJjiPpfgBpHlk1I3Le/z3PVGW4kcBe4IcW1SI1e7UVUpImu9PdmRke5mYkASgUqj7xKt1EGBk34hwyLElE7oGZ1mTTvhTbx7Ygf5zhMb0Tf/BstknI23UDZT68G+tZnxrObHa4bznYB9ZRjYN+lgTeURNW4REUa7VkiJHF9ldisr/1+Tq9zrmHrYjraXblLX4gSEmJXRcvi4b4mvk9duBZTkx/1BykpG/RhSGS5FtTtpcq0soX8Pn1LPkG1y+84hde8W/HK/62wYRPGKdZ1fKED73Q6aA6w5yLmuAJBmst03pBc5MLMRJdkWDDdI8xD7stTjFadzoKS70MInG/M9mfKGU8VWt1AFu9G2Kjmpn50oUROpGZfBl5ytfXltVfVhF26VwXSMtELHh8XkWVPw/lRz/dE9yuxNQBHbglQDJmgxtq0VyIB1eI7oPJ4lUQHHbrlrvHGEOrMf77ZxWBFTTc8dfqxlD9WXhM5fca1gaII5kJ7jFBJSLsMeHRNIjvOyivgGAXnUcpIgzNw8Qd98EUD4Cb+hwLlh9nbNAFLLPVZ3F76wvLqZNK4LDBzwxCIUeRLMN1gPO5z7v9DtcweItzyTGNxYKo1XbaAmgkFA1+pZwOwD2CyVbMLAjQ/xR8URVF4zUPFYTPZAzFDJoiKnxkN1c5YJS6RTPqkSLqo5kpotFxgjYpFLMcHT/+TmdkNsG6vbOvWYyHuDP3/KAdzeKxDqu8dlP5SEQzOGUjhHNPXIilxKPeaOqQsq9mCms5qbrmN3bQi7vMrDOYjpR1iLNLOOGtEiP5ct81qVjjtjEJdcCiR2Tqq1kQ5nh6dlBsNt94Ma3E2VmQzRX77i2f7JIiEuuAoVvSh2716Ko6AdxAe4lgYYIdRtjaSUSzJE2bNQ0BDgGMXediGSl+n0tE0D3YoyZm816TxRPBOKSJ6gw5zfZIYD+2N5Fgeu0vOYwYDgh+vAPjXBYRtmszsJ860PPZbHXPsz+BxF5fkVhINoFr6iPuJ4snjjRWfWfxwTOU98h7g+ZhTBu3c+RppRJa3Whq8EdCOYBkqD3iRTCOZudTLziG85mErLVzb3XgqbuKff8otkPmNfddTU081tT0LNBFkrWT97Eryll/7+f0xpFg+uhJ4QBNCUDTapL6HWA89Z4MZT4KkWMyPNL3Y+vOc1YCMM3p3mJR3XaHSaoGYcLkIrPyzI+cXTKe4nFfQ5mZ0C79TG+N73H1ZMMDII37hFfr3r14+hwGoBnn9RgKbu17AvGu1jR4SKTMznOq6Z7iKhL67DUhdQit2uC4EHuotdyJBn/LiQKDO5diyDfoDtBYJWT3Cniq6ZnKV+tqj6Fsrww0vV+lz4EoCOLPpmiwtD1jdn6f4ZGUWzLIIeKy7OPjyYjCYWYxNFVbkicxs5CfSeDnyoaeeACLRdrUnGh4KgpMl0fcfWfuqscjyV/Ha/RhiFugezTdIi+YXvn8aKbtdOdd+XY+/7ftLpKHwI+VoErmgD/0t8xFA/xZ2awowGURIKYwo8gaQQaZUjISFs0klWx0edYSBYj8Z+z9p683b+ZUUjGaVxWsbg+JK+3iUfu7Sr/X7YrWWV/+CBbgOGQ8HGHwW/4VDXlmEVtn8SEOPeMcvW4670lyXazqT1TfkSH0ZPMPnJEEGW9Q6MS+uIfYi0qxczVzdEU6L1Kg2Z1luqwaYLnnZJ7VVFHe/+M7ybwoqa1BfH83Z2QRvp1moDdjFnJKMtZN1XeV45lV8yEaZS6kjv2RiDpyjHefGyPhRTjN7C0LZcWkhSy8ZL0ioQ5lg3znLtZ1WOUvId0Zn/nhwvvhIVXnpuYUobhRPmVPqbA9Ii+Ks9K+1BPDtTEpccEsGt+1LqZr19Tf51KGaDQzOKRWWdaS1WJxzs8xQkLHndc6eyYEo6TxiFwAmQ+T5+wBXuM/d0vdoNoeB+0bInFvsW53A8Ql3zdNT67BafK3lByCpEUAMrpZhNV70Z4MDPIX4KFYQGIOAkcppGJCeql8mSxR55lh1XO5PHw5lr4PwOQXkxnrNeW/f+7PL+uiFGDqT4bs9kIcxpFnZSMqLEo6F7DRDYeSC3vmZS6PxlLfU0iDBXfjxPTI+iQUaHZgMjE9fUW82XfkiKLMvP+3SNfZ1bjaj4npa5/pakY1IGenv3KoG0fSlxES92aMjF3ISX1VeBAl/vlruzHG6DWzKJ+Qx+S6KaXEc2qlM7UZZ+bxW6r6a3ZeOb7k/v1T9ffiUA0MBLfYs5Zsl84PPWQJoy46/uSXtYFA1yCxRw5Rfia+QNUaMhrPMn33nrX4RSjS2Fv7g0M0k4naRos8j3Jm9ZyhA/GaKoHJxld9V2tC66khH8D/4zl57j1kUSywaC7FT/XeyHuM52JNjjI5WOxID5siCcODWKuKVVOUwSjvuM5P4mbdnJedvN7l5Lktue/WcaWkOE2Fl1XcMd56cKgA+r3X37DTeC71G4sRk3gWKNeqaZEHceYbedvCL7zi3N8vvCI+6t+HV/y9RN6K0cMxDjsMKl+pDqHz3n8kCpxFqr1Cm28MtgprhReK5oOVPOy7SfEwRIxG3TFO/joim2wJt2ZWDb8bga5PWaWfmAuu5Z8K0M8NAY7760w+NZ1Puqu7sA5YBTgvW3TBpSBsYnIi73NHsBljpMReai/X9E01mdyDyZNdQZkTb+ZCMdOuPhhEBclCa9XzF8FzxOetuwstM+vDuEZv156Y3PHZeVhvZt5Dggh1GNW45jhAUMigxGY8R1Um4CLMtTuZ2xrMgWv94C4tfTV2SZTJ/yAqvIe3H5Psq3Xnu8jUkzhumbhFQVqM2YvNO1QocdEMUk6iPyFn8c0MnsVXjmXGfd2jOsDRpI1DOJmNerShw7ypisgZbyHPvzFGmI5baiK78GLlPz/7q4DCSnLjw3IDrYXP+PlPNJOXEzi2SSZFzlZh5u8iGZYyRgajyjrjXX9Ksqu39GEvYlgZHHc2nr5IBND0ZNLEd7YsziQThvAtqMRTLKQXHGe7deP5OUBtzU5dAZSJgCnt21DgQkoERiIdU1ryCBqL9DMTogEkf4LQHmKoITuZ32qQEnoFpAykm7k4bKvG4SlYNZkHvqvIje0Z5wa8a9pQAPkjPkphp37qj/X/9bop076dzL85YtTZzJD1CnAki+C4pTvWG6EKP+5cqw+g5eZvIss/cBmOjYXsuMfldd5HvNGRTUWN9/zqhGh14e0uvHIyT0c8xye76zlyrRRwdmR50FMc1lTG9JQRFR5ShoJsa9DNR5hKrpyGCyZs/Py1jzebE1KhAniu77f8bPPFSGXq7DKeQYkAACAASURBVK4x85gmCVBoYHKatADiM4oOczybjZIARXAADS8zWPnoM95EIYuJxuH4SHYSIKunJGuKmIeXzK3RCIjn9p/Jv9grCjgPXXd3eI8zcRnfs4CG2HfuQbiIM1Q7UhWr3WUz87kFOJdStxreDS7Oyx/Job0jj2i/OGdpsJTHDgZnMKECyOWiY5dfPzHLM8EUUUX3Rt3SP8G4q8lQEwYWCel3uZYs7rEbVCzGo+jGc1EuNcZL2HuH0a/tHOvXPg+taVZRmLx2MejzebWkQnmixH5WCX+8AtiPs+V596AUIalyuJBwXuc9ShU35P8+cqQhU5VnwTgg1SoJvJIkyrgTcWB1MwsRXP4yxS+O6E+si/ha3w8mJ/ksfWbxJJivjou3hcee7YdmsMgpbjrOnuPJZIU0qp+CbY8nCEcDDW0U7XCVTjqLV06Y/Jy1D/RMA/vrS6FegF8RM9ZcPBuH7pVJ17TF5k18X+UQnj6LBZYkkT4riHrgJiZml/wJ6e00PHT4970iXifY3/6srffwgdr3YYRDFKPjNmY3LaJeGY9puSX2aLLFs942WUlGCbmcjHGVi2UMD1azcKd8xnOqqL1oOc2QasYFiHuIZSvrpAIHJ9r6/VPCABpyKoNYZ0sk5fANm46OaMCYGYub4TOBwkde3sv7yJctNpoeDZcoQwe+jZ1WApTE0SNWVn0Sdd8nqkkykmiymduDcCq9RsQNGekB295jsDPHEifkUx5AvMiRLxGBYZVQJ+tV3j0V85MD4JBNDRUHn8lifkXr2uLPAtDeOa3kKDezzLxzin3JQHZJeipq4SN6Kykvag0uvUYAw3AIl2/+J+5M4cJR+T3X1NWxiJZItAQSHMuJxqWhifCdrjqPam2N3PdbZ9utaAJHt93hwSCRC2SGEOSB9kDIGLVBRKNJWeA09LkuCNcuj4nZEvxlCu6iScyNCaCrpUCMyrJPH3w8oAg5P593uD28Xw7grOHplqCPc7f3V2Ebm81utr+ARcu/fG9Kfszd04etgIQDXkUZoiFdqddRtPGqe7LZnOuuwNDIQQ+ReIlwJhAU2TW9m2bt191NnfDbecQugqRwcD3DK3d6PLPh1aSaXQe6lzOk8sqqess4zXEv75DZNeyo31tnmnvIA2fcWhIN4Dhv4+wZbgHWmcGEV/kUZcCdd3ovi6BM3uVRvEaei6vxre9waYKN8o4m4fVYpwW+fejV5MpdZAA5Ulju62FrkaQCoLy6SpI4f2P8KzmNvLnlNIP8hTsxkVk4r2cNwKlrwrul5GAf2HFbflj6ooSBvbfncxBv2UEKCNztouhDozMax8hp8nE/7DDynl2AO+KgLcb8vW4AgHc2m82MHzKYV5y7H7fwP/rZADRELK39IxyNpC03gkTDqqbgH82FBsc9GhJ45uIPXDXeDyyPnF199V6qXNMkyEthb7bAjscYgNmPqLEEPvmzN+jIRoCrsAuTM6d8xS0nrdS1MddSsioiW0y2nxr2Q2d4u9tpVAUh93ztWqTvbM4U/vGdrl94xS+84t+OV/xtFIukw87o5WMDT6sEYrFSrmxkMWNiiHxgorgIondu8jzMGqgVnM1szedMzDfcSe1Toxszx7Bu46xmyva0UXdAz9hfgA8FxEr+yRsv5pq8GY8HVF1bz9FXt8GsJC9vc+TvABh7YGP0oS8i+OszgBgWB1CAioYvfYV2rdBj4yoKZpRP0WFOaYM7/ngXZRIZZp0R5EICszr2WWjJbvapq6GpvfhkA/X1mNyqex05BVId9POsz2RVm3Sq5LuXo1FNNByKecJMHc+WdbNDD4aQtJOjw173F93o4CJX4q8ahsE1xuv446OOxIA+1u13uWQaXoElWYSUZA4hITASfCgps8D4a/LOISfP5jhg1SodYHvIZOb1pbPvB4h5JhPejNgf/SxLM95lc3vs8TV2A1iSycDVdE+i2Mh9PwDcMLkoHtsW2PsdAFEz986L2sVGRpr5tdxhhPyPqsFdjMD0HTLBNbVn9Tgw2Hj3+PWTOSAWZ4iObApnE7SeX+2Ez7l6X/3w0m9+gGzwkC2q57vONBrvA6BoAamvlqXbuhgWTbLdz1SoPEF1dqFnWRybRqMeYAzH9o++n0gkFj/n/8T3K8avO5LseGOBfASwKUc+w6qImsblKxMLsOxGTlMwZw9HxvcC7WyMkB3Kx37IV7PfhYvG2LZAmwcDPmZMC4r2KLpmQY2sZmRGTIvPahlXThNe3Dq5qqmMzTFlfDbxJLupoX0cU8A20qSR04y8VVuewE24eyS5srhz7snzzwl2rA3hw84ZUWevtGSKN4A+ZDfAedhvP/GaXJMF/vt5wMWKbq8GCdkkd6YNtNiKIwvJR+0THhdJBrETd0o+N6ZF0rg16Nvpw3aukgWo2K/Jzqrw+WXcHsBXTB+LhD+jVnJa557n+SGoObcEg7POSvX01SBQDs/M1m0HszmlTuO5vgmwNyYUxxjAphbpvmP649mYCH3tp/nxP3u5kABK/O9qLs99TrdLQupKUSivum1d0KiPI7Pck04X8NlN/fbOK4bXAPGfQc4hvITgEEs8GaF1GRovOZ/j8DveDwG0VmL+3BuH0SeU7EuxXDd+PA6H5j0+6jb38zOa/qLCkUt25U4Cg7jz6l9ViyOKi5DCi99f0xH1udamuIY0pTWKlOdeevJn1OeZ1O8G2vvLvlP7Ed8ngWy8pbcZ3Mk0TVlBAHkf0N0WV8aah2ofpe/uJocYQYAkQwS7/iufK5SM7fBgju9ixolEnJtJLkn5t0lJMkR+LPzZufM2ScAv97/G9EI0IxOo5zCCv8vlLiHpvAE02NNOswHNDNEZ0l1mTK1nblgRgjZcBcDk5HPLDLmDeBOKji/W7IJXWC1xFPIdcX4eSPnUL+WrcbPRkpkSjqxLNqVuWd1M1jUIVnPot+MaUl45vRfAbuagKbOy3BvqH+nboiOk+VzDz7c0+8XjDJZ4MOfhZkH9lnwa7ny4cnnIrVeo2Y8dvRVeOrGUFAcSuL6zUTCQ7MxU7VUcsVjrD8yuGqyyjgwoj0mRbKIJsz8LOJNhkRZkzZU+Zry55Uyku4PpT+6cGnET0B8p+xl5eEg8xxm7zJkJBG2qrth9Hm0P2XnQlu724ViSxNx3++Y4GSdd+Wos/s9f4c4sB1juetg6h7c8L9wCcFVVlumpnfP8LTJsXDO8GDzwiKO6kufO4zmIOqPyraxC4om+4qy3oypR8WjYOcTFDiHBMz+ScXftJDjzzuomyXWGshIoE5+NE0jGvRQFzP9/Zuwgz8ynjKrEfo7fn3lv8eZUYWtPQQY+RDdf4vtL/AbnSzNGXDt/6LxM36cxlHvpWj9yL8QZsbQau4+8/AGbivXsTH6O9b5TotnzvMSVO6cYLzO2ZuzN8tvks6dQ4kPKMJ3IDSlyhoS3TnYuJZtCzegeykc1mvK+zj1pkkLP2flVfOT77KstL4YdYuFTbnakhGqIzWdMCKAPpCkemQdUMyH+TCTiRSVVljL1XyaZSkrSTw2EB/HVOCSZmvCEBGL7zKpaZiF+NdkgiDvQZBs1tETnLZVRZOO5tmIavSwJShYw88YRe3aWhGXe5pKIZYahUyFjiempeWzHlKHm2LkAP8255LFuSFm6Jt7EtFHE4JKbBS2c1g+mo71P6bNqNE6WeM1Jm+OR+wxit526VnPa/a+vZ2YtuPMeAmP4bMUUJ7EHG2g9/7EauyIJ1SaLn1JWHmf9DxvxfFIyUgDxz5gQYTcOWcB/E7dycrunD1z7/X2X6xde8Quv+LfjFX9PkxgWh+3mi1RZHDw19jy5UhKhEuiRB6gRKG0s9mKA1PcJtoH619qgUhq1DDZ+jEYb6NY4sMQlpbzO13D3LFwqim0sQeWaDrFs7kDIIAw5B5OZZ85dZtX1v/Nwk0pedwLS9XvOvxtIFwahNir5OCOAidLj7NUIi2CxOglxJWRUKGmL/B2rGju1mZRhpfR7zJ5r0apIJ7+bKOijA+oNvpSOs+n7gPxtXjpabuDrWGNtag4o76FBGYlisVl2NiNqGiVG+nqDyrs1HoXF0A8QYe6ziFsizoSdWv64YxZTHuORbHqnNNUB/joF8y0usdD21pSD23aCdt/qC1BUEmxAEywolkyAZSLQxEkX5j6bvQzTV2lgo8G6dnj50XadXYRJJ3mboynfzUZ2G7frEsbJ7hBVxL0bFGIC8sqTshjT0tnJcI3kKp9BJCHC04xbxOPg9AClkGTWuLO15EQOeLKmNRvNJSQd3B0bsO4zGQj0mDgj7sMqoeoiNLzHAvTinB3VpM6iroq3YsfVVBlPlki+y/hOhxXuo4J8fj6C7EzY9JPyfhPb5x3lBMDwwwj86UqJzv9W2qo2WfoJxUjIhmzpxG8Jc2hJdkyxav0pzeEzX58HgwwQIkkWDvT0XS73HV+lAZ48I6WjQf5v7YISQJaFXEUFzf68+M+Lh128LOocPF4Lz7vQh7RWnUFxT893H5/1RGgj2bm2HqTqIdfVjWfkPwpmSymGvoMC8HZpJ/94NFbvZEZVohYBueKYuHTCtitWyIxYTiRENqIg9xyrBlALH7lPXcwVshCSSVOQC9LE/gGebNFm6FVFFErlJ+nRFU/+yuJqjTCJrmZwJWrPhu/Zd37O0wJstuCpezz8TISeZ7cZ/WNXx7EeM+fkCtGMiOZLA20PUFE83k1MYnr4LspgbGFt4zJFNXwtVuYLe/BFmu2fvswXwyc64/nPDTvNj7uxIRFXQlyo8pJoCIAzxz5r9ktjPpHUyPhChiXP6S3S4FgXQyIUjyvecb5TD738iAUHHrfHz7QMsJy84AniWJ9vKVfBw6hWjGKHUg2h4V3vzT0pT8kGS/AuiGTfyMjvUv5BCfRJgqH1nexxPvjpBFAGuaYgO3JCSbKDE5Kqca4/Jrb7fBnnTNEjI5j9ryxeSUBb4S/n5/N6+WAVOzBjRRvNE4CGcOX+yj0vfPHulPXVUzVAl8hHbXhKaICP1fm8SUyJqY/O8UoyVxFeO4CubfDWnD6QsxrGN4tW0z1JHQncPVQCLOVPfFvLgljLzkxG1lp7ZPWgCkvqNWajIJ5PTUmLlFeDMR/rui77sm/zkkVNcNS+nZnbIEHYa9+hbEoMB7m1481rA4SPiYpybWWkKbLpyUGrUGYbVtMHMhvAtEjDMN94BlyvjgzO6EmS0f4Ew0v+JP73Imqq+o7O1QCY6CdmK87pei6uuP8eYUSdvzYgvuSq+iBOtvzZ/NJgqgmSaaA68nyqOurR4MhnuiSUP0SE4T8oWfFqGr6ZUUdY5LI1tbESKF1jRbx1eEl4MwVxL+ra7T/QnHzHFZX4rtZnHahMtm020koYPUnAX3Off/5yW6hej3dVDPsAoFUV0WD+6jjNiqmayiShWtK54Mz385Ce1MzlgGZ985gWE/Ne17WW/MFOLjnX+B8JFI1z3ruOPq92guH97/PzO3alUomzEP+RAKz2tEDcC52vV8O9SLNRSm8U404SWfujqGKJDaCKlITXoKd6Ih7fZ095+pHVIraQbg08O6TTRbTX2NZ5zOl5TBl4TIqtfEfCIW+ECmbWYXZ3TO20+ekt9gXei+vH/rpoazakcJDKWc0MnxqyQl5+05KJ8fN35rNun5lJ+ZKPaC/krcxs7N74cFY1Mi0+f9QEkI5H7f3PXzPrjyA42/HPytq3LC8ozEbLD/LkiCpXf996HsaipCAjv3mchcQaK9mvKFHHl7zB5N3yt9MNpHzD47rFmy5hMhpza6m4nJ6J/Ek5XZlX5GGy8FnqQ9rfuS5/5BTTAY1dX58rZhGL4kOxkWe5nb+vbbLVehJQNfyg9IHtuFZel00sIyTBEid0G9yFdakhuZZfO+jwo2IYEGTfrMEa8z+5aegCBnn7nmev1JT09EF5122pWG+ZL4ZsWktgPkjHRT4Hbcyut7s8mqormiyeZJOo1dMlTgTRxbonMBuSvFf424gIUyZ7fwKTlUlukHK/kbctv/CKvoNfeMXzoebn/zvwiv9lDlejeaOLjaHyasmT/kyPRM0A/EJVedvRZi3Defg6hn35TW2jMmit6RQchtUIpXHt+eXnzY48GD4fQEc0rZbsHvGeHoGoS02PIl74LQGTcFmq8kxStsDb3fPqDQArOp5oF0RHQ9F745rsThA8x+oBJKXiSlomgo22aaD6hVmM2o5KYPZGUmLMcnQ7upn1pVcntibKSJ8rb6mti/bKeci6nGe2CJZI6RHnwZBJxBobz6mnYaeoOt/vfFbo4Oe7tjhkbn3HKiQSxJhcDQnCaCpcXF7JykccGOa9NrCfyaiIAnWVrFoma1uVkXIGS95cpsw5sQzi93BGn7bf44pxa1h1cPpX9gLE2pCcqlEtQIecFiSTpDTwXXmoCOjDiHYVi6AZzxeDYIKojU695fHvujBTi+AMOZkUh2nVFS6rGQ8h3yDgxy/KdHEn8GRZ1A4bXGm+iLyZs0DH0CZeHmO2IsJlwcgRkz4lhn+cJHOvXkPTTzO4DmvzA1qoWydXJWMyyvB5B4NjI6CjpS0ClLNci8pMFkFJyVgWERByfpTOaiULHjzBAthOwZulojwKuX21pMSRF9IurLYedkZ+dHAo06RdfbZsTYGq8gCXlguXTLCYlorX/ZlTU/F5YdQLMmoy00LCBdA9+7l5gsJjKGN9M0aQaCTHFdbykb/Tm0Q1WJ5YFZIRr5aGXnPF7mLvVHHTPipEIWTjwQojJmvrPJy+WJrx7KGJszNGCPowEM5/lmAzwNx2ZBHqd4q2Dq7KOpIelPeXtEdLs5jy58wN3RY+LR7grVkBDUky8JJziKS3kpx7BHMzMtNT9LGTeWMTn5n8zgDuBsqcylqL4SFbGazpONOvfbzV1LXJIS21/gC4ZY/H+HcSUvQjGrJuXBu890A9k/PzTwD1yG0peCSw0dg9hVaAd0WskGw6xzM0jf3/wy7Y5QED75L4YCNDcy0k61ImH/mu7l0G3h7nsgTLd5dht+S5vffx2/kG15YXCM1IM3IKch/oRpNdet5Treb0bEhz1MgdC7AaSHrESRbwvgtMiFzkMz0txrYs3h3ZBzyHKiheHXfOo3NGM0pnFq/CysltxdKvJr5VkQX6p4czayLVvP1NhhxaTntfElr88b2giEeyQ66AEXKqIuD+e65XzzUHsj8zvwnQ5c7Jm9K5Fn6LxN8d2QF8SOWIlSalgfZwbYN2vGRd0y/UPf+spF+JfFho9juyGQlOfmTetnIKXkR4IwdULbIJNOPwfhh531rF5vEHUKf9mk7TK5lyfC1+CxwwccRCju21lJV7bmusl9d+sTXOs5p4jl6idy7h/vXM/acvlRd7Gm9bQZLKWL2HxZSeKjCxXdBnXG/1x/tbvOsRfgQgGlJ08V2fvmdlDhwSdCmxZxMkYt+ZTtHTSJA31301KASkd0PGRzuyUVrNYA0/KSGArwKgrszrl9ANSHXrxijE59xo15nmis9YGQU+mXl7JDnvBLCqzhJIuW/EHuB/3P0OzDO8lTyac7MAMBss/cTxjq8hdVUI3EMOLkFRk0de5qdorxxW7DzL8tiM8yjkHtWuZhebP+81lS4sUI9IHTTrM5owKXpzy5F0KXJYAbnThXel2EtRwhPuymayqQP/Hf9gw8oJk2KFL94pOUkokeQ7asl21y956Xe4VF6oH7m0kmHdouiY0RQ167OnGhXO/uKxVSbZ+gDHCiANjKviTYF8k8Ji1wPIbD+1PenDejwaIC0tCXeuy5DPSQn9mtyV2fFJnSY3xPt1Bq8DSqkyrOrAzG+g86LIleqUjt+/ZGdeFc3aUmnQNPsWGR1XpieQLqE24/JiyJHejLypzv6enXzI0wrCj9yDq7EaR6JRmzVZ4CObNeP3adkHyHg0Ll4PZj79TDsflGcz9GsDQ1WDaU5NRRe9/MYoMuFm8BFnSpJn8fsAeGKdxxSAq27HKoAfqLzjPMsazeVCqtm0DTS8p9RjKgBf7P8Nmvt/ePX3aiJr+njIZLqFPxvgfGZdG/nidulJGBNNiVHFs2nqHFWiICdXgyjXuRmmv+V+2+2pXG/URfEEOs1hPrx/4u8HNYIQa+lB5sZ7GiBq9NOUnmm5sAiAG/e4z/ItSkL0TvIDRAO/4hLZ1F2Jp6jANBgScQ8LT07Vie6SsAwcUYbCWsQfC1ok1FiA+fEzzx9pCbp3xmh32LK4YlQ8p1hj0rkkUr80WnLvDGZjg+7HU/WoH8V7r2a3c3AK9zwnyzcd7wnAlQSJC43J4zxjSuHIs6n8nm/UPTG9F2Nf4DlsALz2O/aaxFmrauy9ublyCuOj5W7NDJUilNWkx3jgzN/j+oVX/MIr/u14xd9GsZJcu3IsLEBTjTGv1OAcW5kZGFzA0repm5pm6MzFWBsFa4k9CFPO+Pl4KXvvNjSTlNEAMN1fDg2Auxox7o9u+N3J/JbPSDi1DmBH1gdP42PP4sslpxA0jMiEWPshq3g21ZZ9wGXRfE7+GNUbUEA6CXY/7rvZsAgh7lxJoPS4ebHk7rEZ4jF54OAjvlsZipppF9L4i/f8+rKneyfB+Aeave3ylYq38SOfsZ3OagaTa8M7tWXfMzc0Z4PrPqC+yCkENd/J5S8qMDph8AwJRLiz90lggtnkIBLME4F5RTOtAt6U3/P+4xorWSKBKCB6Y/7u93iZs+W/+G6X4Z0wb36PdGEZH3Uwjj8wtfDmqUAiL37PpWO2ssCNxmsksJF0QEgu7GTs3PPsO829Ot1aH7wlDOSMtg4bzEq+8p630MFkMHu9Q414nsJJGC0LdD/Av92N34GkjEIFmMlHr6V7/InZHUCEnrMiJoXA7ZVsadgtf2fdwcesU6DpyiV1RlUjxoL5g+NbmGXyXh2XR5Mz9r/md6wgTic0LnC8QR5nYWl+2wl4VTCKhsRgMZFtJ9Ow2bOZHHr4kLT5n0eQfU+LRFYF95sfkE3q0etFczRYZHdxc+WM7sV/dbPsnpaMfMM8Cu141xVMxwFN8gy2vbnG9ymCgGDlPoLdDysgZrD3zkIHXqJ93lmSIRSaVVzVa6iWblQnH56JiZNHsxwZDX9xxoQVtb8wQaGBsCW7Gcg7dWw/bj8GzQ+mawc+gH7/9FRj/JJYI4ME09Xw8g/wMIlXST6sxLnT7KTcbFPmkRY1Oh7pTs8bPWbe20DHkbOSZVwlVQssX2xZjJnAxS5Wp9MBNVm3KDHpCN2slLEpzzQT4055lLmTBbTvtNkI/d/Zfizx+9/i/aynSEslb/nI+9NYIyK8hQcpy3A31ogp3mKqis2U+JyRxAnIjCb9LTuKNgG0JGuCqWSWPpHVg7UowTWLBIDV+VCAJ17N7VML/OOX9vRrAqTV7hdDJQFNgaZajgJRTlFiW1EJ9msx0GwsrkSGjPIA0ZiQTXLIqxODN5WqlvzMfACyuCNfpIXj3WhKNwsehBeqgRVTvavWngrDpR97Ta2uarDLOHKmXfh4g5cILL6aCk9TXF4Rv+R1vDgyr4nHkGfGeFHRyoeiu4CAlCN0C2N6EVCJImLHnhpjYGunGXA8zQJ1XBxzZ3kUF01qSOLHkUVSUtGBYQNNSen18C+QzqGOjGztaZObP8p02a+YVCZISO7OrRLSdrnn5jpnJcC8/8TGR4LvIEVmGDVtu1paMfyyRrAac6uETFj+/n0UA2qa+pNDuPoul+iOPaQAxmf7w1jHkrFX+wIVua4AMTKXGl5yP4pqnOPF2o7Uyhs4d3feetM+n9LcemZ5n6ENKrW0iD8IadByw55xqMh3qnk+xJg5qqQUWUhuqAqXScuOuJOy4vVrHGPFGh0h1bEqdywgXAUv81CblMQOXuD8biaqDrqOMWaQBQE89qoOxTy9K93TxDnXlYf0sneTVB+N1SIR6Zm+EMGKNCe52TQy1GCrCzPB0JIBHS4Nau6hjzMz/9NKTioe0DvPnpn3eN3/3XE72La5R5Ip73irGFg2tkiABmDa9SAK7nj2Du9XsZc3K8te2ZLPR7i88g/7Imv9Ha6psT7fDzY2RHPhlaDR9h1APg85M0lSpcbyrWkxa6a0crknqufc7X/XizelgyI2euZYy3NCbgwuwjdteuTZdUWNJb3WbJyay3f5xQS4JCJ8ymbmtIumWkzMl1Tc+ImnakiTBHead5NyW+ORP9Zz8pMX130FyU1gh4OOeE5ejFhHosaufO3RwLk5xu5Humv2uoIfUXvZwUUaYBuZU0n6kKX3mdqpvVwqNniDAdXs3HiSGuOjrv57+vfcOR27GO0nXv6SW+jp4wBHi6y7+13W+5mMkEJzfxBWwCUa/vd8RR4wwMizZi/EQrpS9eaVvh2R/yXwzNdmyXe4ArdVXrsI0TumsUiVlNxLsTQ2aDhdGeC+GCJNOI+JwlAPgthfhRm11YVwvKhyPUBI5p4bOjjbX9Pm+ZCdXIBrKiwVXmDlA58/neu06naFrH2MwaBEUJYZc07G8JjuIvwSD4xeeMSJxZXpep4h8a5zDe8d/zZxNh8kkcNDuhNwf/iHYqCBSN7jeH8elZEfkU8KrPFGRPgTY3j6n7tio5oKhWPSnx81VQXpfP5WOCu82UgSU2blkHawQfUzLSaSPtl8tO/cW4zPR41bILrJnzF5rLBTArSw4TvJHp4gzEtDtvGde2bJn1g1KMURGR3H6108ZUi/w/ULr/iFV/zb8Yq/RQgvlKWDo6R6vhzJyLTp2FppDhrNInvotTZTEjKR8Cxmx18+L4JMjLI5Wp3ANG8TkWNE3xNBwmtJTB0g7YMy/EeAEk7LiMRDCD5RBPD8DPVOLAwi0eQk+8OMtx6Txu4E1wJ3ZcuVgEE91AHFLPOceRKJrjwRfEU/A6TWH+dehC7+69IM1mfc7ciDFIuxdSGrtuPBOmHwQ6qrOvnZ5lw1dv+QN3HtgHLLY5JkZ8VGjbgfD5op3gf/+/FKbZTGqvGqTeHR2/3Y9gAAIABJREFUrY3GpCdg/SxY38FmNusEPmrHKAiU/37usPieAgxNJsQL15/BdqKMavVLcfwdLks2SuwD4bKfUaBOYMXBEn+uTIS7C9oA80IybzC01qgiBp8p66aqcHuYAgPLT6Ct5BAOSHcMnmkJOOSdsouHgXZLNVqCWVBNjy6Lne72uwuldTz60JxR4rkz7Hos8zTX1D8ebDfvJnNdwTSK3z/9sNhWSRN4hUgBfxpoHyDA/sK4jMfiwXCRYBrFvj1ykxtl58+Vtjrz6Ihvly+gVvy78/mW+u+dlLundEXJSE6Gf+R+fJ+fS68F3TSHOQBCiQZaSQAJ3DOYxteK/eND+aggp/ZoAleRKQ1akUmAs6PI1dgzR8cXNCVA6/2JT275XqOBMa2aybhIAKSPJNM9pK/+iokEEKUss/7vEAEVyMI6k919NMi9JhDtjeZauQnT4fiLetbZAAfwY3A8M4vSsds0kf3jMTJdzBnD8gyIgndl3FLAWert/zdd2jjVUtJAZHe8MLFmnUsVetP7XlVAd5nY5lXmue4Eqdo6no44ys47kPT4SBBg8/DfA8Q/EQk2bygtxQ9fBYQ5feIoNXlY8SffoZ+EtSQYekJ5eCRafY5VUpQkFyb4lYyf9zn7wi0QtTv2SP7K0UQUz2RM+r2Y3L2fTYoV+EJNUUL2qpn3eW6ONWPiMf/0vOlI/HTTmtrf4SppqNr3dakrj0EWdkpn1j5QPwXLGjvetQMJkunS3ieXA1ks7X1yzWKsVkwK8Db/8iFdYFmIAC3/NRiYJKNN6CLM+hw33L9KrgBNynD2KWjlxDjLCaBgSdbvDwKQux/tedX2ixIJEaHIMTNmqzejFhdMil27D7Rk9fnxXR0i1y3J6JLRde/vH8SSIDzE4JigvGlJIX8CZvUuabJIAI0/8hk+vEjyOalJF6dbTzE2LBohy42RJKdrBSljKP37QRscrKlYG9JTUyGltk/u36lnSqWI4x5gqWjJFDk7GXshZphyjpU2+Uaenhrf4Foi8ABiZnoM1LkK5FRa+UicZmDtG/GQFRaN5lIwhaUbl5KEn5gmSMka3oRcV6yLngQs8p6VETlHro+zVq5Nx6Lhyk5ZoJFy3sY+TRetZoYkezpik+w0hc6z3fFmZMaV02xb2c1EDqBsD/CsUX5YyEY/J6C2D3z8kb5VH7itPLsubPzMP4/4MZH0At3RQKpY07Hwnfs1cjT9S1wXCWhBVVNCLnO7/BYuo2Wvgnh0ZIOq0X0VgDheuJ98Ld70RqSmPFcY0mtOC7gj03sayfHYZ1nHeoJTI6fBnJCoFpGWQhPbnSuAtWfrtvQKkX3qKPE4j5FuOsS+51tdlvKNBVnsfNeXHsUBx6uv8oXTPpP0eMvKxsfJwa9lX+LNyRvSx06M41t0mgNe9bUs3DTxiQXJJC6VgiXXA3Sys8YoY/VTC40AXoJwkJe6JesaVnqjPtfi1lnFzhdS6Km3Tl47DLzA8PJekRdSRFy9QT9P7Nzji6/SFmusB5+hDyPS5JNrKy5/RBkTKGLeQ9YbA8jYbcLJHWsvWILwHqTeIjRUXj0eE5/xzipfiz+6lUMmtuNtU/ASTepMXZvh/a6iP/DGkjR9W9QEsW/r+Qp3g79/MK0a8VVbRu4ooqz5xqysG3Kqa78Q/yvm9s9dc+d0TZ5lIQGXbme5P2zcB8xPG4eSU7WmzyRhRl7ghnOf2kHsYcUAYwzemS/G32s3uCXRZdeQ7XTPqdPan7Wq1R9+lMLOeq36nVNXA8ZP359YGxHTtodX9XjU+JfEWK0/wPe3bqyaMHV+7yuAZZGUygvi81V71ySmAoeGZ1lO6IgpNytz1Vy7al9xrMZuCrDWA/rbyReCHASXLSxrpWGvzp3qesvJXbfqyZ3qz5gPzFEZKeVfY23qEdeqQXs1UT3ix1I5sm18QKnypHvXtAFDGDrAFm1M1HKWB/NFgmBbNWCQeC9m2xjQEyblzYQJwvfKAX/hFb/win87XvG3DSbx0Mr0fkAJXg9jVBFkK7qQqm1yqKNeqDF09Yk+IM0SDzNIHegke8ZkjSUbKAv7YM8/5TO0R8+dOw4l4rDV9tzJRee0pns9aM8irF5q+8qUTIXE6LaI4GM9wN13JAl2wWNBYCtr4DwExxVsMskiIeVFtJJFlJWmugE0n4PvcoENe9Tv92ZEILHgAqDuJXyktMa7u9TVaDIuPvfuBE9s4WbZeRZEZm9cE1riLoKNR4fV8nc61NTJy6swiWZdNnh5SpHUQVlTKwNjJWBjmfxGAMyCh9DTrE48RMNDPeTxLJt07s7NAlHUPBLyTBiXf+QzLi3JfZom3+QqL6UujPN8UDfI4kDcWPmSJQ3ATfSwM01ax9TQlFX8hG3HmDbZr69KRvam/B4iqFTAycSd8ZD80DaCNEryI2RC4r2tLq6qWAvN5Axm7pQUSjWFxBQnfJlu3kcT2Mrj6bwnYTMLFMw/NmY2xYL5sB6AZ1x6Jokk5XK0CoE8UKtxPIIlUoye1momN5MMzhpKrwxo5oS6UEa9avvBmDuH8NZoqMVofTQ+9zhsty1hVqpu7Cvfe54h9mjCggWQJOErFYxlx+djr2lJDkSiOYzwYCLPDKlR+kpMn2O6JxFV89aILx3xjx3BNwoyCY13Xej+XvvqTt8obTCrxuM3RXpWmeAnOQXYPvO8TF+wao6nRJWKsBOcKlZ0aYzH5xsmYYoo7p2Ut0GtDWigyBoMlk7ei9EibF2M8lZJZo9xI0VOkDslVGhACHfU8mfUW+6wzUPlTECICOuRYakqLb9DxhE5oF38zlNcspVjIOlIFfoppTLleM+EtGOAXT2NoFDszA1hBA/YOPuyvndoFsdntTlm0Ij67ChJywYoTdmjJgDmQx85H4YYNcWrSXgIcKSKQ0FzryGr97VIFU+OSRXTAR5tM7CSFzrn1ZaYqIizUMKY1j0axqq4XFiy6QsoFYGxv08hNLMR5FZT7LF3jGB2qcbaEQYqIZkklN5zt/tBC98aEfuzYABAnySQXOcJegLpwQP4YX5tzs+brFOkdeFRIHvKAWSsnJ5nn0TOJghuIYqC0I0Q95EEkCy6CjyR8sU8pAFYfVZWXjuQnozHI5emADuAMXgn200fkxCgzbyVmRKrqRZQz8UzHkcDLfT2i93tupoJXE2jktKL33U8ZrpppuFd6B7TtMVOEg8Z6bHPedFMd+hcweTIj7GPrEp5COoDDDVgZ0yuI0Y5ce/3XeWA4CndYFLSRHDLC894fOU+Mtn0hLESsjOP1ODl0rXJd7u086WsEbY3UBZrbLA3fI48qyXOqmAcCsNmMsG9n1EDbLnxokFz8rqWcuN18j1rigxFMjPRB4M8z+xx1mLSnOJj6/mLs7IGe4LKLpGfxDRTgeazfQTIfVmG9+cyCqh2hxHtqAQM/WvjUMA9fD2CMDN6P7/5ycvL03RlU+iOHq5EbWMJhEsCfZ4ZqbujLEoeRatBemuCMcLwmMCMuHUef/kpDH+4W/lZq6XkICk3CKfOlQc7WF0jxsEButV4V/zNhjjAq2KqXOwlKCOn8Hd/lrvHlEvu7c1qPxO3I6dYq0I8sBD8KIWI6wNc+h6XW+iDeOYowwIJUDzqKU5tHLHroWhQ8JFrn43iK6WKTjxTUWjQZeGezY8mJLzyWcsBgk3aTyk8X1INJX/R2CGPKRIG5xXHkv7MjVCEvagFEghLpZSQp0uw2Y6cXuUtkqTgAurUatoucZiI4HkzC92wt3GPOIM1Zf0kyW3Df9CQnkXM2XlGhTJEHsGyWgyiJJy2GrNJyMLKfGxr/LwQUrYQjO4pOaWVv87nPqRnt8YsCn+peAZxLt39KE/O3x5Sen3xw6j10c3CB5l5F/EBpye/2E08rmf91o3JggEXH3neGsXeNw05p2jQDv58/8Hr9YppVAB5Y/Li+1wrrCCK9LuTnCwxhSQiTPst6wCnpeSKDKyK2snVV8qYxmeceLK0FH4Gix0AagKuwx2nPIEPdqLZYDc9NXLnkq4NyBowVsmG5V+nlFg3JR41AjjbpaWBeTRYSr7KRR5TH4aWp1PjjVHrCcJ0bWzM4iDFfWNZN2wxrt7zzkhJ4FWEKMYXWWgK4O+4fXLoGglooNxT6roasUO66dvnhIWiTRB/LIggcjCm6NOmPKg/WridV2nIOkpMmBVNaidhXjikfXE701heRPPNSNnMksoEsPR9U1Vk55mhwtvuXGP1qkPwLN4Px5e9znrkq2TwN7h+4RW/8Ip/O17xt1XXu83H4vuaGZtoTqxRklKh/buB4weXbCihV02wD4MN4/JI9kxBc8y1GZt0Ymb5EmNqIxf4GCljGqDAtGpQ5P91ughBNuTo5CpAogB+hOkH2C4GCp6puDtTNrXAqgh3Wc2awV9QBtKPpkFpJlcpFv+3KoRTTMS9ZHLCkd7TbOSonUAdgTTHd0ti0J07gwH67iToVY0mZi52Z+iKxpRIF3wjA2dPOOTCKXmYiOg3yBk1j3/4n5VFmMOdBgMZsPoplFkdRENSqniJ+3/Zz/5Zz6YXbwf5Ld4PV08z4bFB3FaAIhzAJD40fKXscTh9pyvC4ddnaPLFYvmskR3J0H6wFUKHO4LESPb4n6WNLsE2KNNahWTOfX0WUpIeD4+xPmz8a+Ozk8B5EsK5iglbPyPcuZZVzkh33Gt6RGUw+fmq4XkeycpJkiSDbv18radjsByBLhgCBWQKeHoGJNhRz7H0kWWQk5WnwSYiyEhT12YQcEASDkvOH9Nk9W9qnL2ax/EXK++1AniCgpk4v7qBVyyWmlIsL4SbreWlxMPIL67BMQ+M/5/ebBnseDTZt1gEGjN2FqQtZ6HK8DeyJgNtc0ORwVUjsQ5I+V58P+mGuk7EOH8SLBbrONQyNOOcRcPPXgMQGyGLkInH2wNE8ECweI1MCf0kOSEjYomWRqLW4IH/3vdVHmruzpXxZMjVf69pXO5/2atYSB05V/qCHcBoPwCRw64G552N4ToXYtrhyjWz/PcuQrTMzsXZ8jMJMSWjUNilh/9On+fxvEUFWynJ0OP8tGRPrPtgPzsx8h7PbQcFCVImQpjbeag8HrCuZGAn2NYTU8q4NwIbW1ZMb7jDMGYVvTU5Yso99bFfYy3UwecZrxxQe3Fp7KdPPZ6Q2yJui78ZY4AEa3/IiCKygHPV9CKEYeHf+GEfwfhx8HFYZyHzJbye9/Utrkjo65Yi1QpGa6xHIk+pPC9zHMupkrrKpFZHAFdg7VvkOyQ7yt8TsuHtFR8Wc4SUSHuilHYxsUZWs6/3ObOJNbtUuboZngVtOCdRfIKZ6+OuvWeeKzbXb7EESYDVNeKOg8gETZ/PYkxmwg8JZEj8biUmCm7iM2zHpK1oTQYrkjKlDeZmMVf5pGdcqsIonlfG8Lp/eQBqvuKdQaJnCYT+hQwUcVO+TOEKZy/2v613VOWDAXnvqHWMaN7btmTPRkE0H1InEFv3o5taR8rlR97+zxkSMtiOglA/OkfctjsDiYLqZlYD65l3870MntdfmnydQz1GQgwBqewh/42Hv0h5TG6FMZT1ZSrsfMYpaZ6fe37rf0ZzrSM57gfpdQUk47saUGct9DTFlqMaodL3Ul5Lq4ATjdrLCwDPffunluxv5mD7r6tPaytxeUhkxXovf5nZ4L19iaGGeXiijXzGsozyGypGbfzL/N1qSJpBV2iHNDnP71B7cqumhEw+p0bDYx9b3vMXcAHC40MOoP3cbYYfEplYAjEegER9fAhAJkiXde7DS0FS3WLr3WtgJzg3isBlho1F+eIg0VSZMlv5VOeIyZEHqIf/9d3881f52nJbSmtnrvQ4K52oAxxjZbMRsr42Y4ilRGPKCnnE/WZ4+5GsPHvtppu4cmqXAmCnRL1Vr9eLQZzrz/WzwWATELuytohz23xnYzB+rEilvb8scnYVYeRaB1iaEwSMo6oAUAomHU+d09jebI1nQ4JXNqyJhJPJlpA7832eQFrtogb2irzJTVpO/yCMimnMNA6UmXXcRqMJoxGdIx7SjbkugMQiR3/kdfEMz54zPaBjyxE+7BQqoYnG8vEkjHcOSyunOT5jhf/EvEnc38uFlWBmKLiUH1GRH95cWxGFe9e54MzyxRbn4yNVSyxIxQ9Vvm9xuZANtSL09BsPYouGgspSeUj61/vSk9cl5qTP75aguMnjzITEFu1BYvmC7sDjvHbATR57Qr/8O6CB1GddFeShaKZv2oErMEmvsy7Pgd7b9Lsp+dLIna6jhHRSzYjhuYbri1t9PxSZqRKz54nFciB1lXPmFDFAhV7/DUN6TIkEsAzY+oLRuY22NzA5OV79mwCSK5Z5qDA5jUcON+4knoZn+uN8JOTTOncxO2SFzBUWlpNVibzmxPQuvGUsxo6z8Mc+ygJ7FlaxIKe0QbGUHq1zfVyvU2/6yXGOdLI2Ifi7XL/wCn7hFf9yvOL/gtanUKawJTklYaBaxXcL99WqcWXo+flmG6Rmv7vh+QJ0KLedn+srmQ0TjwRB6JekZgfUdY6XTP3GLMJwcJmdQJQO+9LFDBdJXK4OeLWXd0ptBaNwEOPhwpafZA0eRnuSxoxZMGgdur7w6kSKxCRDL5xMNqsQ0ebJJSPsnU2Z/C5jHGZOGyUKc56xwsOUnehjtDoWTBzk8e6caTU5lB1ad9w0OuWAZ7dUiuUmwi1x4K/x8GgiDoCvSZ5x/LHi/q41euwOWZEwux9WrU+uDCw2LpDFts3iD1C4LPQ2zYyxYywbgs23MWROfs+PX9xI67O/4qm6IQ+d3u9w/RSLaZx8bDONHl2NuzyyNKZ1zHJaUEjt8/gZn3ZkzbwaLQFmjaGh+VwN2zIXHatBqVinua9GJCPLc2rHk0UCHdDjgyTG5d2Znp11pxN3McNmMV/OfgVSCnFjuQevfXURpGVqLmF2GvcdY+WexbmosH01W2F4aCxHE+ghyyQe028S4FxJd7YiZ+nVrhXPKRtr766kM8BYGNtCTDOueld5oEaIzG6ZDWCBHzlQEUckzEKxMDaNhDPW5Z/TH3vJuBC8EilA5QRL1HsPvnaUL1s2Mb4MyEzk13kP62nEUeO+MvGVSKX+/wn2Tmqa93Lllj/qAXXC8DkfCVtOQ5WcYYCR34llRwJx2bjNszawYqUDkts567L4/pTV7JnpcL9zmmyUhNVMUpuzBty1rMcDKBJNfX3YmSCXr8X2c0LKfsa4WH6VdkfRQbPPtOpgB5nZqEzW8Gm4BiBguVb1oX0v8lskXrWvN6jsKAS8mDvOkkl53onFGq3n2UXcoyivyRURh7WymH6mEgfAbHJEnSgC1Qx1jgdCgdK301OaI71gRIQxY4//XG9ueSGqrKHMdRruQLC2c+JjesQ6Ue0C8TOLN1EBmxS76Zh2C55nwYbWP4bntGOcOcM06h6u8G0k2Jm+SutdUfuI2ItFPqIPgHFvluTEbckYXMrHN9IKX3NFo6HAldpGEgWLmbVczNdrM5zU2odZDag7aD7XeLFL6oTJTsKQqzHGYLEYKydnRwhpbKTjXQzdPnKRKvRjDoE4R1M2zKS1sbWmQk2bvQ0VD70lT1Qtwd2AH4rk9MqYttVbuxwZiLyiYKHITu+WZMFfvEtGmos0h4KOIZOawBJg1LmSIKCwUiY66hvvhk6hjXY0xxWe3kpwCiuI862mzNqTwGY/i5AO/Ar0mI7OIUJG4S+vukgvquGVtItMkXFZQ8bW3bFdRC9BE3C7TA5opYbkRPXO/X8ls28QzaqVheSa5bvjINHgCzCzCumP+hLfrGmbDSM/XqYx2WxNMrI+Y0c0XFL69gcjclqzJI5tbl8xQaOKPV7O9k0lPlpAe8YNEUkJyvi3VkCga8s1goHeIEceqEDc2Kvenpa7SH4qDeoU+zTO1IwDGSY2MX2nHrlteEo403ayvvPcb3WK3Hc7Ylk0alY2rjhrTfwwmTlA2ovIA8zgyrJX9gEuJxGng5GaN+kh7uTuXCzUZhToua/eHl4vXl1gkwYE6zx6NlLJKfMj2QKkv0A0BqvxW9OiM56FxBlgcmfxH399mbLlt342tR/uXP8xv/VnfBSbd8WwBpIunAC/L3ulz5ngM+UueUPWa9s2U/4Lx/mR+fH28LL5TtewyB98xLldkjOW52zUA3TzWbTOqjiPZSh7EwAtTrOXFepccT9+VJLgG+rdX6qZKQiQzz1kxaqxWfUN0GCa+YtSSbhkYKP8uuJSkaP4QBEdvPNcmULqJbDQPiPFwuv25crQ0ZLhqidPBHD5bNDY0sNFxhVNWNF8lPkFX1C0QNMzrVCNOkV5rcoHDQltJS55pQTuARFDvjS/uStzTt52A3c0y9TZMV98muWM8JDylEYrBnfl/BJ1oLtlwMxb6RfkTDvnWLH1O58eMUmLBTnPCT+UMQcg+Np9Hr4VFgHq15n9ETrjYHG+FCIzX9XI2rx3NcQ1fA9VAzvxIIfag5zzT1+2P4k1kwdHnQkrH+wOWdxpceZUWtSry509PSW2aPZ/9wPNgZuaXm/5JVV2Ko/slAP+ej1kCa2ihtO5jmlDikWaFKHlB9fDM9rVMa8cEk4JGWe7ynzkW3Hj64HpiR91kt5X09Ai8arwSU1SWPgOLeejJ6x2rx8VAdnsvbuuErejjuKkekkQ1WNPeeKTUcn08FjmQIY1KYwR8sFxLp6mlGiRVHnkufGs3uJ4Tm59Pmo9a3msRxwYdvwK80Z+W7DkzrrI+FP92BUIqP/glU2zkhkrT+h4ZqdBZCjDdkIvqd6zjVuCOOzwIALHvf687Exjf5PrF17xC6/4t+MV/xc7boVmsAdLS0eAp3WGPpOU0q+fezQIKS5oguRSSZEo72Y5WgCkkGPYnCREle3rkUCcIrEO87mUkeDAAXfPhi3AVOQkSC+ZXQjoY5KhDnBJcFmQ9L08nUP30JB83V/ZRCB4j8ufIvd5DR47vf7eZ2sPJ2eNWBc5Nr6Mzas/s8/z1MMWGVz1HlybpVDmvttOcT2MTrJCIi+AEinzV+I/zoaXCAKp/y/4l855kjO+jpg344H00wq2cATZKHSQwyb5wFt/X3cYQqtMRFM7fERgHRLsTku2UBGSh8Odo8mXG7rjud3ZzFSfPa74bS59gZeRrrN69O+MPqqfBpHP9HxA8WR0uCjFAzgpbDBJqljS/LkmlnC20MU5jO1kepB/vuWwSEzOn1/dWPZHBnmuYuEFxjC+rKWA/3K0EmFKyT0W32VmQ3BkQWGZ+CQI44pkEq5sdFRxHxt8awBQERyegdG62VVsiq0BWMU70PaDqIIk2H35/OFMMImmr4c9zpuUw3g8X9EX+DuCvDz2QANdhzF3zDvlTHbKOLJLEkaMAtxVxPmL1UndbtDIPcBCs89oIiULZOQzipFo5eb4Mn26hQ9KrxK+jCWHuevxcSvG7H8m/P/wZTkB2NORxRxR+l5d4dkYd0/wuwr9xY/mFsXznTpZOX05hrKtYtc5DLXAbSv+4pl6+LpR7Cv7KEHv+O9xv+MvP/Il9klII0W+lmPm3PgugHnSyV+tL4kmbsVe9c+MXSVvRDPRXA7TbEjuBZE+I+IMKd8Nx/wVCX49C9utWR+/oX7OGVreNTOJKrH34vnl19OSc8nvknIcKlHcq0ib4ereiPyFyeoJnLlHgxXBzTs3wS3AgQp3ud+ekhHtX7gdTwY77Ehy97nXIFRUPMogM2Dn+1R3Lp0N6gB8quAp9CQWzySe8ZF8uP0/c4d/6toe77rMjOtShHs4DO1p5ygy8n3uIP8MFE0pJ4jJbhHh83lCy+oGED6CLCsajROAlV4wrqySAOArADOsQIta+68Hk3SmpIO3VNqQnesv9MBXFiw1pS0yHvtUTz5Z+Q00CF4Tsu7OVUbNfkg7wuCFUmMMInH36oYOTWmX8gp9xMvaQ1lYApANoCJWqJZPYMkjvamJ/QYPqsAjc/f6WiU3W7gMmePnf39n4fmD48N6P2TD+uk4SfzJpoXXfcXa3tzMFWfW1oPzuUZM+oPV58Qw6a28pYB+pRgeqvMYsGez0Mx7Il6gPRq0zy6+3XXtACFLHhoPjxRfNwxn6uS1BzaqiZagfvcmlUn4awYoLLFnLtJzKQC97eVNdQhjl0UjhcC4gAC40KoHYi39uKtZci53Hl4v5/yTLEyuWzvHK/k3iPuNnz/reyznMGGz9qtpBWKtvNbXl7c1jZDd2eyeyvftjDk6JooItjWkA+MXdp3YcflSXhaTkSbGRTLxK1Rk3AxWfgAley9MK+5K/67nd6ur6kKgpfLqc6NuClmUrz//rB0z5zdP1nk2nnr6zTJXrQ/OM+mRV0rmtcM1ZKb8qDr4VNDyBQq4B8D8j6jR9gvyXKq6coxBWEVn802+T6wCQp7xMYK3EcxDvjCUVgwdsw3nJWuQncTEqK0E+OrP9xIJw24PUNvGkeCL2uP4Uam8uslXwFpMpZTvyEbtKzlr+NVv/e3edeDRtAiAt87zNut+kHKlpLt4ZTuebhoNCYnzAWCrZYtodraAB9tcPGKzO+goUBx0/AjCiCm1msO/L60F8vl9QOd4isE9Um1koDKIgZaSkzyyQmoGe0UM12Com/5JgWXlredog/0mION4+wYOAlImCkav92oGtmcFhR9Yf5f6zDtBtfIRN/MmKbqWaFFcy2/MLSUkQwViFA5kk7cWABhN9P/wAZYPtsMr673F5ha+zTVSYWjk+iMxpSHC8lQYSlK2uzMfedM71VHm9m5w7IxpwzQa5xjDQmi5GiSaeTGluPHI2VOlCkkZ/AC6z7RnXfHndTPSvt4lsyxYK67g2h7vnXfZOUvnw+OsriD0HrxvZVyybPTjM+SryH/38HB394hHuf9sBaYTOWcQkbSkgSHyqP4qBvs0dOPzLeQyPTC2nhKTQ5bo77Z2YoenArQKPYAx2TU00OHTmkgff1DYQ6mcPBSJTDt3Luzo84K54vsehAT+AAAgAElEQVSErGtgrG0rsugcHA8i2X5OY8vxkIswGXW2bkUsmuCDFRW/n2nds9O+YRL4C6/4hVf8y/GK/6XBZMheD1PhisCKe2gBbpmH2VAf6jO+jAeDo5Ok1NWNF/AAvytJXaWNbckQgj0tik7kLDqNBSzAmg9T5NKg3v6QeYiH9eygIqsTvNgMXxMMIacnCJCEPFh3HgDjth6BE/QBvmYR/tezLAlrSm0gf2xIbe1TTaNczwSzmHH52BgyKdO77WW0SwQVP2w8ANkGdjYMHo+/gALpCKS074GcQq9/pgAI8kCpJFalk4ruqpocWRsPUN5wbB7tW08jtwJBthrXyhFIEbRkGAYxFsopQn/aRplRLOZzWnI36ziCShpMpjltbIxvlK1BRFNRuBdDNRpnuRcqR5opRQTkOHQGIQuPMmWyZ+oTE892aIAroZep2AqA7xxAo5tttwgfOSG1HyzObgyrsx4Byd255LC+f+rkt/WVvTgICbj8bUBJKz2M55KpI3IzNJqpxsjD+6HNS+nA02yYS4NNFn9/hWGeBCjiVPPaMNvJUrX8f/MrWEgyGBIAiAInH0xpg2tMMhb7qMhDI7+T5xhy3IwwWv4xPv/G0BFN0rFoSQ3dnuflCHDEYw+35GgXOTfFpFU7YOurGSUW78OD9b8lmcbrwh1cwrxPPEZoZ+E8LfMhEfxVcVb7clwZTF86QnzFk6VSmrkeh42LIN9sgqnAEvydzOcohJV5plT5SITHmRlYzTR8AwmJLNN4LpcXUWKAGqoDsd1Ja52twWhNTz/Nxv3ep3HswR6J8+qw0kp7eInHBJuHN5cVY+nR2K3iRh9yZZV4uDylWbORSTJ6ANdBuF2GjrxKFIRVsIh7m0O6hxykpuRPfL8TGxW4az+7tmdgPQs14S0rWHjzYu+TvO0dALw4yBistfpsImWVQh0844lbVwiLoxlchV3s2QQkrey6HeRPVAUzZVqZ11djYHa8j2GHAjaPmOqJF8LLKz0pnesDlAaLvhjSFY8vrOAHFwYXQ2KNxBcR7mo8+CeewFYsP0k/D77NNYjzYydqcM7fU/yunGrH4Tf7kbnMAUrV+nSNz/B4D289cnY0+JPnkM+OPv+HvbdbrubWkTYfgKwl2f1NzP1f5sRMb79aRQJzgB+W3B0+tcLh6ohttyytnyqSABKJTJN3+8LVfxeuTpbnNlxTU3y/E8T5/bwmI+dGoQKMiTbjbsIByqtIfjR44t9H7ruHgXvmiDho+SdY7AQbwlw1se+5Brz9CLWaP07kA/4RRZgD452S0FXMeBNywog+J2z1FWe+geeeFqMlHUa9l9Y0bpaSmWO5hryaL3+8V4AC8ZljT/y30EUsKoRR7Hme4solHhO4ollySoMzbi9iwqjuW91bzbVwGP+WHkPVLALY/geX/96frzEHCZ12Q/F99bM7hLokoSEseUKCf/+l7QlW50/kR8PuWJso2Mgps2zeqWYtVFf4lUbcAHblGTF9sY6MRAPhYPyaMSX3YQPdCaw/XvWASGfdlKZ9+IfUZ1DGrn0bv/fWYCg7MeFXe8pyEkl3gXaAesvYlUzy5Vf7nRWp5wn0D1aT75QNFvLZQw+oIVL74yGj5AHKVNyq++fZDDWvKRVHczJT+j0F5OrJkzK5Vw9vS1WFvajMQL3kVc5UkpMFbX5yEWICUivPdZZ9/66fK/ykQHjrQPwjz7P/TvmtkIevmtKsGtGRWKhr10nu4ZugOng/ZKBdABVuX30GVhEymdUTRx0uf2f+qGD+bQLg51xxplS+W/mFDUWzdpa1WFeC5umVPLZy57k52ae5TQK5O+6luaXnX9a0I19nWcdt408BD3DulBtyPu/Pb5+32NF1mUv71NX9nfvke4Zx1TLJ53jrwRTEZn//JSFjvv00Y1UE79isHevs0ZgTrqi9MoYmBpmk1ZOX1j/dk1AimhOqlk3lF2zDNlwVY0SDHJcl4U7PtlkTHgS+BAL2GZ49j09WBMKufSsf7rzw/MyF9jOpvzfOuiiMpD4/wJB3IpMBcNqfZDpdvr75pQ2NVx2snKYAkYvIDm48ZXF3NwBXiOwloabu3y+xlAc9snw/4bJLudYxhh9csRxU2WM2XjdqzLpS3Zx+i4n0m/KiyrKbm6jDDcMaKHU+LCZNpyg1gRIqTSUNHOvwzUITTyq54uf1bU8JTS5duW4v4Eo88k588EkSsOlcd30dRVpCK/67PEgTjsUezDd2d8aW9pEJr3VPoLpUSqLeAZDxmQomNUEyEBlNEKDyRAA7RP+Y3NXI1bxUia4DdfYIVzTOpfC8P92rbO8lSKchfUY0X6P+LG8rAb3Z3WLNKeiHF+J+NECesoFFRGu5ZHdeOcW+ZB/fNFkpTaosCfWAexvM/Cwi0SR3BxY6Ruy5bAa7c2JxEnjKm/FHXf/iFf/iFf9wvOIvG0xTbpgwqluYN8XZcYgohM5ALKpRyYo64scrpUCJejo+JmNfIfMwT2KryZCYHo0jyOSgtP4fI86D0rc/N1HLC+lPrKqamukMIjV68zH0z0tD1E24SxPfstspAdDH6zmMTAptQUL8K4H6pas/U0x9xORNGecNH62Pr0uo0eidYDySLEEBEUOzg7R59+cujWaRfNjuKNaJr40DjvQiU2sJjbyjbD3eVnFDvnfH3KxZCIodNmi9Jrv9Dy6bXH+ii77lPnqUDLxkS1rQ2XiPYKEOdgRt9x5nFX3h4jEujGGaxs/JjpzrJLhblJkbe3Vn/oFI/JDLZaAeOtcxwRfFoqlyrYosr25IWo4zPtf6lyyGRGNlZ2D9zT/iYN1RUO3U46ymkKepQjEMviQKodJW1YKZHPiTHwYSo5g7mebDv07TxMuc8Jica8qAPFnZ4Fw5TXTLK5ocCGjMy1gnAw4+I5F9gHzDBSFBO31/Z/QQ57CPKzVWLUkvjvs79rzZt9FYr5Z5UKbipTz1amckXLYNXPBkoVlLGXkDIdMFl2cTKw99z2JJT+NIs+CDMBisdbtGMd/jRZaA1hlhyij95GZBRaIqQuijp4Gspw64ZrPLAXx3E7ELS83JKY/EzXYaNIqhV7Bdp2sW1Naj6OuO8wnTlC34OdclIfDpI/ytekxfDdJ0ciZ92P24coRkQ8jfjNsieOcZLCo4Z/RZBMauRIwEp/ZJzoVYj3ImB+MhBOg3+GLndGURFybBQHeisd664+XHJZuSLjXJJqEIq4E4fWiYB6NLOLJTxs3uKZMAdo0ExUVSpqhm1hbriuSzpCTsUeixjak1Pq7sUY1vyeT/1e8bnzoNffVO4A9eXODwUim+RDRIOblGAGjKKmaxBFPouZewnWA0HRekmh3ZONZGm1NCyXYTQMTPKHqVR86dDeRorBYwOhL0dteWRZrEtG2wuHLfqqPpETO2QpkgZ3ET5/a75ay05FHz74efhv9PuKZnQ6OZV8UC3c2S08f6uFlRLD39gTQmL4A+h+HNKJJOdD3iP5f+umo3+5fPkIfiyENJho4KLeoDXzBSm/3o2QvCG+Pq/QEB7ta0aEwgTcAxzbXPjWW+K/mM433qdR9efQx2eW62hiCnGfYIDOWRJzrw8o9B+4xxCYDBPH439kEw3gNcdt6+GDPNZYGtF7pmwXrNBNwS0rex50/Bb0nsQALYMWhJFSyLDgs/wmAqe7wWAe+Rzb7KYUUs9fu9CU+CcKdmfigGDYoQVIC3llGsj/bOkiw2Y/8lsYTfKMWlJ9b3wQQ7EiAj38PSCNezYH77PjXIT7nEuHw0WlXqCV9DMI35kEnIJ8W5k5P54wHs2qm5KpYMu7sZVJJY7h51FnHyD4um3hLtfL7YyU//26XGlU26qo2spwGjXnm3GXieo1uOF4OfwvZjVyxakTfWunw8lpJgL0DiTEqf9SuycVvJzv1AMi9zuSJHLUD8ccV6uztGjpzQUp9sXe0RUuSb9qQV63NNCXChmjkOLL252NnPiTOj/r7WdcX9qM1qakbyXDM0fQfc55m2yus9Xjwb2uIRm0wGJoLI5r7Kn+aNvLMpNpKcaCtyRKJeDI6AHRlQSZKVO7ouSFm2kjPc+jhveeNTuc0YLa1oR/78h1xbNyrhAR1NC2Iiyc/Mq18cX4dGi53Lgly152Lsh8SSWUxIZr439mTlupP+Pe+GuqF9jwtUHTulukXitbIhbgkUbb0PZuAw9wNUyn/uknb0xcjsteJS+G9Ujvu8I+ULplg1Zm30WveUbTTZjzotYnYzrQUiicvvtM7+HvMhh171omsQQYlc1nLK4Wu8KZP2xiGclGYKMDP2RmNqGNrNPs0mrVSz1mFZxFGRIJ1aebLUBJl5n3HPplBd4XFy5/6nn5VLysf7xq6oQ3c+/62DZRGvF4uLC3zzwStifZI+ICZ7fcceHHVu+2d7AUeT4Ctvb5B2Jsr40zTO33npjmdDYjdV94rSZu+I8s7ndzFTpl3D25ho9r8zXzzSaBMNzSYQGDk6akl8tL2+kaZHFm5K5jEGRcI0sV6f5CSYjE1NZWoX+nEeiEiu0yC+KJPh97fYoTskvKJev2g/twKJGQQJI+VVO5gGKUREW9HF9Ezs2y65QWdnziKADjBbqHw2piJN9jlyf8sPNtPEpmExFeLE2unaL68Ztb9TZ1RN0p+8toB6tcVb67uGdKf6/mZ1EfK6gjSR26gGTtR/NdW4M8fR8PkTATZ6aze1RYRPO1OBCweNdfFKg5uhsHKaVi3wkUhhB3sLtwepLfJeb+nh9l0z4f5h07b/4hX/4hX/dLziLxtMd4KxZRo6vcayji72IMbv3byTnS0hwxQ3yCNw0s031jaUFX+7IokAkHGlxNVN+T6JzCOHlkXYW73ZbVNWF9TOf6MqbB8tjxIb79U3o0F6qcUuXeRVJxJxXqXXKQHUxvfNwKKnYDWRGLPVHspG/DOSChEUY0omcg8puvKjYngXzUtglZZ5HvaXei+g0MiuZs+OKTCBW4vF9i5+CJKjxe0FFZ+WmYdP6Va+KmnYVajtDjxV5Pc4v6xOTAucmf5COnNXrMz7OhiO/u+iMQUDsGY1LWMThU7ki8pTP/ZDe9VjPblLaLeb5USJ4Cq8KmAL/PI7krligwg/ihEOUSiylTFiY9taAaaMKOpCWvAdGx4aaBFu9hUJ3ZXJULBePkPy5GuhGs8qpAvA3Ln777Xvv6k1+LCopPjZajz/dkC1CAjR3/hs0OlIxRlkYLkjmtUXjn+mhKPjoZ+f7JXG33wEw5VkDRKsnEgyYwS+Djb2QMd/58uXLukFOxMbsWYEORpyPEpLCQW4U3tFj4xQ6XHvd7Kl87+d9DBZHGGG7R42y8PDb6nBBQu2fQUpOjk9QfZX31MHiwJPpYLB2aPxfQr8iGA07EgI+XakZTTz9/UY2kYLOYzTrwxA9/YwbpZgM0pPYCX7x2JibIzwDAtvNAf+q/8mv8GPucYO0sNu/ec8r12ZeXYL727m1cGoC0r+1F4XYjHnaZp1rMfkqIoia3Vj9bdkbdsQ7vFHspE+g+kj55l9UBOcMcFQ+uoFpG6bnejPzQO8PrHgPcNLYbixMiGoM153eFcE0L+6ofzKtWUIlusKGww3RjNcArQjP8uS5Bi6h4GvyLcR+FtDClYQVG/glRJDeQbrYhbYaPBfsxqnEdsBbt95XmsTIiqhKjNTc4vp1PyvHzYittsZ0acbqQFgqyp7S3uImHzxHscLAMDmkba0R2xv2SAXRFbI7OzIFUSEt2bxqVDePr5ychJnJ4hiG2TUGbt4lw9QemFc9gH8ji1DPWSpRIRpf/R9+EnXzoRUyKZF3sdblZfFJOO7ffOAoZGoP4DHDw9Wr5mFJE76DVQRrfo6ptcj1uXX/qMnMMZroK1z2+hz5woqfho0/wtL0Yk1H4/4rLf1wHDCBzGAbHe4xbECvHxhlSO2P83oJ3XjDAvmpNyePi1wj2gm3dfX8U1ZvxOR2CGZfG9fCWbFpOnMyVwHVMBMuBPQUlGGBiFANM98+6N9DcCaaXvlmS6miJbk0huVFWdRAkEhl1zgyCfiueflP0DknQdIHjEx7N5dKe/fBxr8cKSm1UfIYIjAK0GZ2jWQBepI+SBGACiQZsMES1msWZYflDReNOCKzW9rIYQ41BCFnRK88pdlzt9yGZu3pvxF/iSmzZQhVwMldW61xK/zqHeOr0E8j8h1d0qXsDcqUT98ZIfXiCbVInzRymMo0+kEcVNS5eVcd+Ve+Sll9Zk8bPKrzrrKn4Yyd+q0++7t1pLkvKKJaPGsy5ut5N4MDgCpwp37WilJ6ReTzyCdMXrdSjZKKsuKuL2+NZxiD3qsZYG13qHaMKuhlvmAg+pgM5FV/qUzfD68PEZConL1ZJ812KnZ2EXugGIaeK/vFRNT0UyOmmfFAZt3Nl5zegDQAUBa1wO5vUI1shhh/tF/rjs+//DFV+agjifB8DTGP/b/01LitxjFQi/QUCykhiJHd24LUHVlI2q4oV7enD/juhDGfkiK5hVM7NP8XxKCZQUK2xCCNK8Yk0H6NtQz8wNgD4PPUlOpepiUJncQ/KEEUlMrJeMWeIddp7NajZzyqCkAvT4rZNOzcYiBEHvs1pK8ka6nWvZOpIm67s61S6lEKdWVyjt9hDcQgOyQrgpy4n/nh3r1BN2lD0+2XT4u2hNI5sbbA5R6TxjvwEcuKd/laF6XP+NOYnBJq63gf1PM9jojDg4TZJCI/eREVcQjVWW7JXkRRF7tJ11dn1JriOe3uWpKpp/1ZGXsPgqEkUMbjtvFtUs94hd7R01551783CfeRG5dDzH+ebkkGFb5bzVBzsTnn9fv33l9Zc0p8uo4AzB5xf7xwC0KVF7ZNJrXaKKz+wVJmFEeMkw5QXpZVCrt8+4BBtvKHIForMdUQGFPsbsiP9dHMxxEzxQO+QraecDKWGONZyHG6zGFUz+r5iWPONIdMaH3/+TzEPGrrtKberaDqIFG9qWKzCk55eTiiI9UXjregQogQgxHvJIgcZRc6kwIuCXX9XDWLd2sBfAdDa+a8InPCfeV0s4IagHkv/yQfQvjKZjU3Rnrt8A5KO+6IEGPkmJTzQFA5x4lIWt83AMRzQZBxMWWutTRmNSSq+uxahSp/5YTNM7Lb17yyude4CLhF+T5+VNW+i55OTny1z/l+hev+Bev+KfjFX9deXnqsRemW5ltdhXj4JhtAjUsE3oqqQ0Gj+p1XrK7mAVITMwLqMwEwWDsamqMR4Mg/uZ11wEV01LVTWy9UVn9maYLIxOI0liduwyc4+tsvA/B+tznoT5uoISeczBA86Y8zHN3dxdjAM0dTD3lL4RrPScyrBO8Ms7dc5EWQrwodgu9aEJndOSzOM0Az+JcdWLZmBkPNket+rGsk8SRQLprJHmijps0o0nC2QllMC3BoWHYjCRoPiaVCgjX8RWNqkdcHwh71DMfHE3pur9gEgfPlPCDiiBTetOv8BUyY9yKTYLO0GPz0f3vMXlLzfK8p2NfzXL8KZerZ7Oz7kVKlWmwb6k1kwbA7f/jzvQda3Zs9j1RnSEhoMpbBi97dyHlFsypRy2D9/rIROVZJA2+JWnjTwF5j4fRJBNKykYqGT8eUhtv9t5zrRTreXj6bT1kGTRoh/F7BDDkGkVAXSfxMnYmGePMrXYR6A/T3SnKTtZqaeGHfn/upRHj083ABtArvR52JlPPBBNeMkLSBDC5I9ETEM7UWAFBqrMbzs1Y0mT9AMLoREpK58GuPrrFz7PogufR7H0Pwy0knKrwie+RDUTdx18u2YcvYO+VTFpghMGxJ0PB1HjPGsm30OPP+yaZXF8/a1tFTFBpGSFLGS+DZB/Hr5Wswl0/mNHMBPi0jdj89qzBeNe6mspMKdcu5N2Rr8GUiV2wfCfYl/vXlFWgnyt1W+thPpnCB1yQjkvOkQHdamxP9kv62egOv5gS1TqAY5IRXAMAI5Kw3iNlSO6chF/o2HhYTv7QD/fjc5MFyRgDszum2vWzv5cN5/VIyEIaSyg5NaCB+9CEjt/TlAx9rZBIDcnPLHKcnuaToBTHfUlPgeGRFAc7WLFiG5ZsmB2ii5rG3o8PGz/LwlSQmPi0jIc5IRhXJJw2NLT5RQ8RYqzvnoT7HVIixeit5+vBbhXC9+Aklv/Td+TvvCYxVVln6dAC7Z13gjDrMe0aha4S0zG1vpXpgzFicrdGZro4xlgZAzP5SBGWTIb2jaYnY/3F5qZMEYxHM77DiX3PUXoatHLBJ6Ckvd+twZ58Mc9kvgvuE4slcyhNTwqROMsj6d/MWhN7snIivrwPXYzyxblyryMxFeR1fumIPSPOS46k89f6QjWIV5m2UjmEYsdDJidhLn9RIkzCxcocoNy4TefJMeRXMxGb2OJCT1IIR2a1ih3ZB7wbC3IKTZMMpH7oKlH0PIkNSTBJ8E1cmSSQla9zM3BZbNmw/+AeR/pMNfLaWnM8mLTxrs5brAGTn3J9zQUbPiWBIA+ptMvANQpi/yY7c3UsqDUoQJmI14G6FfA4y02OV0mxY8WFK9mpIsbImsuLmkktKhBdf4qD3fqIfzfl9cgdC8gpqSPS/xHovF8JTX4R/eYJUHldxxxo+ApoHX2TnTLFAcT4qCnw2su7JwXC1yoIUcqRXy4vovtl/drLLq5SWsja8rX6BIoGjxJ+Xz2t2JsvbDHG7t91wCZ8ElNk3yY6dxX09Hnlj4Z8fek1nGtr75WO17kXL5usrK23eOr+5z0kZN515PTFWDEZGYsAgC+5QO4E+k+dVDLl8aQVFeWX0ySso0ixfhx5jxn513jnvapJo0edLuLMrey9kZS4m/Zq0HZghxzHAbNN+AaMkwAXkIo+VduMZkWT8eZr8oh2xqf9qYkQI6v5rxMpMmte6tm4BDbSHg1VpwdLPWTl1mMtTT8m6oUzvF2wlLk8+GzW0Z7Fhu00As9JKw5mIfvqKRDBgtXsxPkMoMrIaSpZO5sMQZqr7/ThH6y9YsrVE/SSzB12qqYIoO9TJycOcpk0KInYI7Zl7eJKQ1syIl8U8JQfsueIlx6/msKkPM8Wsl6s5OdaO9VRtH0Azf4vZJVkZ5EBjmxSfI4iUvRpdt7Lz3Mh68Ut3zGUv/uqtXy1t2M1VV/cRdRmPbySMz48mj41nRZr0Xp7vewjCJKmzHH3+5kbosrS4zs33dMuIiefdTAyl7m4o4kFaNU3QzqXimwmp62oSed3798IWTUNFT9zl5T4yliV+a6U9CvWEwOyj9RhPU+X42cJs/EQIAkj4U9q1bSrGChxP0SEReF1GlOLHrmslLQicVabcWqxJIQi4T9pZrzGBevIBBe56kVIXta0fnjsOWdytuQzC2+I5lcRQp5bqUm4vh65I9gOL8Fdsq4cfLW9yqgzLidsqq6zArxjwiMIIxrECI/3jPu+WVeQkMRB8/tYTSJqDAL8qOtfvOJfvOIfjlf8ZYPp2uHfIpks1DjsejDrigHk3j68qd+Yn1ePyW7pgGsmM8GuPIlzaSQPnydBQ7lT6mImi3XkzR5j8OVR9MeBX8n2AH7F4Tuulh0rliw5vTDGgG3U8Pxb67A6Ccxvt/UBeA/LwOBIMpiUfaRO/I98/xckCyzG0U8XHyqAxe5Q82YFX7fgK2VJRozl6fYwpM7vVXqXA/LgVz7ssFOhgPD8rmN2MqNl4CX0ZxF7xYa2TFD9uVgkAHNVqqmoq55rPjP5ZNpXdqh3B46WL0vmSHxWOwZxnCK5GikbEL0xrMf5xUZMUJnhA+78jpoL3Mxyr0Xi/9HgR06PjN0b/KdcH/YL5ASFqaF37dtYVxX4KxpOfppl13p11NGVzaicpDFbDP3ExJMN4zh/BggWW/4PUAVXJt65/os5DQQg1phDrltmA3XuziudIVe+jtqOBkleunMM9bH/V46ewmo5HKkpOh3nNHW4PKZ6rkymtpZhoLNVee1kh3kWvKbB3vWj0Q3gYzdYU0xXM4OxO6C6b1SEkRJGysQkpgixFYpNbpEEwDewMxhGGTxHAgp7obKTeXomioY9Cr4KuHLj2bQZ+nvKQW4sk7tgFWdjqIGgya8rPuu1ZiTwT5SX0+y79sLnB3u3dSf4DEaPgVy7TRerSe/8fxHwcoS3Gu3Trgy29j0w/YBrS0gmzTrP6/7JkRLaakdyQ77iZ/vdxQXtB3Ka6PdY6IiG/zDQnLREk13tN5JehOazu92HcDCiGQsx4pzPf4wwGB92wvDgMPtHTrw6J8HZKO1R4vEsth4D5GFPn7LSZN4NdCAkMC3hZ5F7xzKeRagtqaIsoiW9cQRea0QBLRrTpwXc5z1dan3eji2UbrplwhoSIiUrU1IRaVavkfgYrwBJAZFkSCdYuOTGtUDZAxrFtKbhl0H6juEaxaZzkkiUOtjCZL3yl/yZjM6otnsn+SXxFZDuaTK4eoLuxLOyN6OCpL+Y8pEm7ZVwv8E+MYkYZVfkDN23x3j/oIGLJRt08lueD13k4FFUA+qLz8x3LMTyuSxArFpfZwo9mXf2i62Rw7F2xPyHh51e1jLIa0xWTkuuVefoaCmuyCm+x/jRzoTRTJoPz81gqN3tMTjYDc7OIh6J9DoOrntKgSTItiSKaxFBtnBJ7fliLE/EShonC4WSQxAJmdyaiBCYBcTbqwGOUcxsPYxWF0H11Wd5YGEByoV/0qTINyHvHPlmkay2ru72jGQUxj48uZTud/5uFjHu0N8/cwv3Pv+Hc57FI93YSRBRTxkldzy0gfJep4G3GCXZInJRdiI27iSDCPiMglSuJGaklBLw1ii0jNjTzXhfO5+1dPz8KdflF653TF97FNvZoTwyF2JIerGWJ62NkGOKS7sxeeU5drN47oX216wiPe9l51OqbM48ntiMaTJ3Ni8sz99Z4MMjnzRmx0jPfCvA5KrnYlIdONOK9jpAPNLnck0ZvAfUZJw66UkSWSL5yrtNmd9sfsuarCQctZnUOFgCATuErOLH2TiLvPkyEpEAACAASURBVCxAs4GxfDJ0cO2sHdS48rwwnznJfiaAhgUpJ+Qkv9pPq3Ml35guNhuV2WbRmkC5+JFQ2/KQWGoA96zZy7XXcAF5LzM09VOWDMpft7zhRD4Qfyd2Objcw8sgz8XbJeUUhSmxt+rJgichoM4tTXKWM2xG084vTH+WTHJNl52aI8/z+etRe27U/w8iI84joJjJ0TSZWIJiRVw0NWZ64boadwKXKycuhkD5CsfOePV5HyQueah+BFnzSe4Lr8MCyqrz+PwbelrOx2qJ+OhKZFMk1U6G3+2dJP4R9c515PPRgS3pZioQrkBeEwjlgS1IkndjRaxcV+EPA0l4zPs2+4w/+ZKqs3N68isb358yWAx8KGMF8GlVkxEklkHI4m+ZyGNKLuS6AI98e8vCcrq3VXPK3iAxlyZAZ7xWSm4erpQgzRsT31/q35MkmADu9PBzVne+injsswkT08vqId7X3dnT+HDyu5D3WrkeOWhNH2+JHOiePOqRv//63BdbI6cDGhvb+guo+PTuGkSRrI8PiXI4QZ7BT9NpjOObokbpKGuSjG0f3/cgIF0JUBdgu2GMVt8Z44+4//v3PL/nIZ/z3U8wirEja29+Gkt1bQTRqIOu9niS8EUBFhvNh/oexqzPUc0fO74wx5ua8J0B7jx7IWw0yptGjKx3Tt7mulqpRc3OxHBeUUfFuSw7ZAndYiL+GlfWQjNjFT1RzLL0aRKmDLBYj9bT3yHDT8qaAVwOnhNCT0JXEY+GS9/MkVJgt0cjII4pa4nS+gbWHkTktFpJ74LZJiwlarqk1JxANFZINdI88azCTL0lCJ+kgZ9x/YtX/ItX/NPxir+MYjacabPN8Uq/cOxzsCin4DxNpfMaFxOxA/bWuD3ZlTdfIWcB0c03C+PhDDbrBeqpjTyKYSXBbrAVGzEXm+dCDBA8JAPcv9hahXR+aQ8D1FjXh2XXBf1jBO/WY1LmyazQlr8C5YVzZ3FYOvmLVSadBmXkasVsk01Lkmj5HDjG5rMlumoBSTNKAcRqjDIOgEEswhorFgk9y93PJ9gMISvn6Eh9/XzP0OFWUDCbfY+cr2627fSwUtHmFLZHkhzd2lMg0WzB+JF2p1lrrRQDS2JsJlgc6xSwnl47VsZoJPsh37fBIWX7anCq2J0z2QDuzlfL2vyMy2o9VsGQ/5+7tpygayidxpeIn4U05MMU1kc8u2Tu7uuYRpsrvuMwaHUhJteqgl+6OK7C6B7WQNDYub5VsdqLuigDcJfNe0TCd2VneYi0Vwbu2Ijn3lNP7syV7NP0LAr2aa0fGqFSvFm1e5zRYZtVmG1K3mXYJ0h6QzHSNyjWWICZEYBFhJH3bscXCqZMZFAhdaCz2TNqGubyOoKVMQZWEz4SIGJ8FmEQiQGmDAmJziklBXDGXDcH5NRidYn2PTD/yr7fyOB7/OwAvtLzQFjNHFnjHZrIpD+Ax0lTrFjzi5cJQ2ZrvAZImoFvKSXFUh4kLpO9LHlfn8wa/6+V64rr+Vw/4arCxWZ58QXY6xzvimtHoQwFvkn+Tmy8JeEjJ8R4NWSIfjCQ26S15FXkA21/PXskEjVhoa25DnBnHF2uMSrtykhAY2OolFZ1Xj56GuR1v+L16gwgz43S0JeF25nERchDOPeSfIFc7b0Csf4iUSvGW4DaJZcaIE3eXDF01x6uSV1vM9WRPgbBhD0gSN8Trc8roNbFYcRjQ2Qyk5PqA6yYsPk/A4GxOwfbu86GuhvHHyHWQxWVub/0yDqKXkieXeWdo76wzFdCKKeYxDHh6L674e/sMCLG2UUF3m/MZrI3NZrbfqrXW97h0dgAWMX5jKM/CFiAiunGKk12r33inQsMHbwfgA4ECFzs+yYAEBhC5CIa0zwW+V0l/svKK4YurAIwzn9Pz5StryMZ9SCQ1K6JtKtyCaeaLnf+kjpMq7OOwz7OZ2s7wAUIcMTkDZJyoYByBWDpAfAXkNA+nQ85A7XQF0/3iAzp8X/9gRtcOFJFPQEcPLL4LDum5yMXi0aLR1clGgUWxVPkwSl/ZsZOg27Z57WacOo7mHkjdksVmppNhaXe7M/p1jKGFRM20mfhFsdn7PmZRXJTMYRg/da9zjgoFs3K+Eg7n0E7JIJvEEeHY3KxiSnthicMzN9Z2h7QgmIXx4PlJ10xsfzCsllijwbYVWeCR/SN6FTgSsg/FfjAHYzJuzySHmc9nCnjklP0vQ/4vmfnk+/yZ1HrSY1rQU0J1gRRSP8W0W+warLOUkbTjow3El43QDOa7elPm3UUcHTm5dQOFQLj7Cj/3z8yhwuJR9K/Ba/fU5YW4dCjPhVh7lBjiD1WeWFMxtneoC/ULSaRVPpzPIF82/H6VtMwkqQ8jbtR4MdwsqmQjGsRNhr7AQkwLb+DdANBOETQ/Nlu7Ieb8JetZiM8m/0g4tkAOXU2WMeT6SH3JQ+Z9vAxCHN514V2ky7WnKlzGwFKoOcZpx/fLS/4aeoQHkDLVUofo6QVnVt+hRzX/oAGTvPvGNzjkEltGWOEsoCZsfzNnY3sp1WW7Gjia07/l8SXygpPFWawpi2mPCPv2UeRoDxs/EiubrEzBZjX0nVUOnzQuN+zcZ7qFgf0hbAagHG/jhS5HC/lmoB7ubdE5NjOkJTuonACC8Y3tUGLSR1qHJK7Ldp3aRxezfKx2Htz5Rn/FuGqemiETxjj5NMkAInGqdH4HiF/H6lUAIjDtKWXKrYKjo+RdV6A0/FZqvE9vuUJL6szOPMZr3rM81lHLXx3vWPtU4ZYA/dftTCWRD2qyvDMlZRuwMFpQkdbYDTWZESDwjnTJn/3ZSNUbLwm6PQ00jXXl4UDFpEVOyjctvAiS+DoKungarrc3BZ7aqhgaaYog1DTMGOPyNfnnkhK23UjMFitpylsCW/rikkcf1ObwYagWStYTzys73s5z7Xah44H8eIkFPn9D3G3pKDFrf3cVA9++PxLkasbJPGz0+D1OU89WXhYvEM2RzerfTBpkgQ+Y23b4ukvfUgMBpb+LAnGbzV8l6JLTGi9RDovUwPsjcpRSQoVlYrhFn5YhYtmo9xqssyBwmoTZ7yEzMM9fK4TwO9GmTwmNj0bu4DLRtVZWxhWcqObbUmAyPdfbPBD/qDvhaEaXjRHfednXP/iFf/iFf90vOIv/+vIiQCb9ANynFucj1WLdeHJvhMpeSXvxMSAy2Ix1lj23MpVWcMIJpWZ8Z6WklgRoESE1x5RaHuwtOJPbv5IUdCJBusuGzu4c83fMHtnMj7bnNXlsG2qERExrwyIi3kWjSsVwXX3xihGpsmKhBG4dfDa1bk/jMzppaO+Y9IEmDvZdEPC3IvC0/sY59bvn8/t6o7x4E4WCB2YNpqMw0iMxl2Ji/aiudF+P985mOiGivDa0oU+8upmlPDRgbUYQGSzKjZomYzG/9akSo2pnxHwT2pCxX2zCaBmiz98doIjrD5wSamyO5swssBnMIAywTez7NAL194ov+ez+E8bUBab71rC9cOMaL2ZgnnYebFFziFttqkI/suLGeNdnP/mE029UJMwVhcTbq8m8GDI/52vleOWU1quMgAxhUF4QADDdx+mQwVfMcU0tFh2xjbpwqYPqZzGuqW8FgQbxrSvLHhqmi6BQgHYp6mS3/nm5nPXvQm0K9Zisnlkc634zvcE9pXx6Kl5HTKPJr8opi5oBFenpTeHvhE24gl5WTI9s/42JrIClPlYgzhiHE8WyP873jmRCbJ/R3zlOH4Upj5hk4XT1i5IjmnnTnZhrOn61r+IacCBc2cz7do8xo8PqFpSJYrmeRvrRmREYygThkWxG4RZMgZjJd3T08z9nY3DxTbjc/8fZur8Xg9N8/+k5vuvubkeja+fcNkYiHibxQ4NP5W3BCMFB3kAXB8VRDkyrKbCTjF4fTrKF0PbDMkG8WpJDs//HsXT0cqXPKMWpqBTWbxhR0ypMWO9laE1hWfsVzbf7wRMpjFW6ujmbEYUSpU4+AGn5Dl5ED/6zcMxK+LxhXu5BVYDgDadHHsGGzb+vwbu7jLtHDsQd0JSVXLqsWOUPORbJGAH95BpjGZm5REJBMxqcufZLgPD2dsCPMzk1ZlsN2xWXIki5MoJgBpTd1nBNoRokmbDuyV5WeyMzYHrFEO+IpmDaBRtaCTyIt34HzKPhr8625/JIYj/DvKRZ8gudZRuxpoVIYBvayzYtVF0qf2cfRXmzsrk7hwgztRxplX9QnVnYztBUOEhwyMsIZnFFTMsVpQDorwyt9P0L9ru3GUeq5qJcTVQwJdTjDWVR/FUetKDI/slzh9tGhuf6XN7fv4sjvO/eTPKnZIhWGKPBkUm2Nu4R4EM3cvg1SDgAZF4NGDqcnNuPZroBdMOHh4Du7whHsVb0FsD8Mpzam9DcrL7Qz5T/qDWpPB2paZeXO6W+OrvLJNpRZyI5R8TLAdq6SliCbku5DG1tAZ35QiuwVTM16r4ockyF9288xn5noA8VZy5ZeHJ6CsW/bDf+tnd8xd3ap7X8vsUsnEWOSYj5K/eI0hS875aJeGnXD4nyDt4ZEI3mIIpn7/DSABMKEDXPYtpssglJtIMUiLx/Y2JvQctO7W3oQPUU27y2ZgqSQw3rh1n8tI/Oi5cK/KmqeOYUQ9N+Bz+aMDje649M5+c69RelvIlItq/f+uZJCgvGjgym81YHr9x+a8qEcM7SGBVYa+C+leCg6slv1Umvkt/4kZUMPkd9QvJeGMjSYAPYtCWuP2fy6j571fWfvtj9Ro8yhB0wa9Z54T08oYZ8iLDdgLhG83aSMS7V1PiyDEBVs9HM594EB6f01TbmNGyz/gUEFQBTU9wu84d2cVKV1wmd9UJNWW5NiJXAn4WJtGq/FFAnY4Een7OFWCWdg5QRMsXHywNAugegq/EJ3KxlTJBnHsLHcEr30k9+NAXpnBbNhQSYCv2syVZdRugi3dPuOQ/xj4TADubtSKMIvnp6Cbr3EZN8dXkw9YX5UttchqH33xf+EyA91c2WMHTx26Jd452D2u5vbkTyLTryOrbm/DLFYbE2evmbTC+syYH8ly9QKS9RPYjH3yZYBo1fQ0QGLPrrEticsNyKgNg+d2ED1BG+mVImcgXRuLpX1zTuaMkoBaVsI2h7FX3qIKzPFRdhC8/sS9+cX8jy1buVnJr145mhIhwD+UtNwxY71hfX/MO/Eg1ajc1GMpbAmBUP7WHkBLlCJ8e3my/erb651w2vHOUA96+2Tl18doXlrlb7Qkn5P3dHdmbnaB5+ekNTq3gLoxZ5J28hvAlZxLwXRO3d0riosVgDunSK6cpXXmbgRpX+oOOKDES51p9Dkw7k4qORlwoDEKl9+8ajpakcFkL9HQt6XNZjaWqhfgudZnqKO09KTwAWgvyBUF2Wt8aX8L7QRqJxTHinwl6yxDIHHDwokjtMyd87m3UBhRWNOYANscfsc6yR/0x8vnKnEwLFRSXd+MBXrWSGGKe5N4BNR2fn9fUuHb5ORl7lFd25KomMydg4trrF4IwPajkk8nW06CzkUQl/09Or0g3M68N+e2y1PKsaX9WDvgvXsG/eMU/HK/4ywbT1wgGXS3wKpIlHwBUAZGJR7EVekQ4Dp5q8LTm/UOf3wDXjShodQeRZLUqt16EhiCUqXx4wbxzsYXmI5kox82zZvjE7xLMm6LuCbjU9EON6fq34+epI15ARo3AOtKM3rFuyHHOOnR1Ky1ciFG9V8v78GSaPae93AkjWIfS8N22GDk6jWh0Sz0kWmqSZMuKcTs3lgaLahIiW+YT9WAZH4MyqCrF/SuYwsKRsVCwLCgZyhjGWgtTz8YHD9NnMhkOTmGxREqaQ8y6kVCBJt6+1khKmBDTUpbNPn+MNpuHDOEWC69VkWRqxoe18h1y5Z0d39pAQ6WbgT/l6sZrtDSw1t7Opg+kpnc861m1ykous2rKEabHQTYa3DQaDyLZqI2/q2RZF0h37k/xWqCY+aA0EG+JBuQYo1/nWURvefW5EGs4nmd+UnDnHtk402JPX8w0Xt6PplDl/S/RByiZHh1KaPJKMqFTB1lPrw2SaW0Wo/SigoZ7SP9u+WVUhz4So2AKqe1zoNe6dsP1HcnZBEYArO9XTlna6u8w7Y3LhWcTaLml3nge0gMoeUoPgCBaSLFXxWDn+19x67jnGRM2YP6ZfSMrGHcioanLOZvcYzdWYAkQMcCVbQdkRVOKQBbYVzZvI3G/h/FqXabJToazl6mw0oy0n3IVoFoguHjIFb7UAogi5Cm013ACenas1tVH64Vb90UDbKrzfO+vHpWOgkmayQaz5aYkgZ57wIdb3PwiUQAzWSChKFCsdO0CbaUMSxhp1ie0HGsHkq0y1ArhYE1rsHZkMmAyYn0LkfiMYlsHI37aw+yWBNcf1431tKHp6AJpsLsqL0aNM7oQU4kEz90juXRnTefVnnIDVoyhuwjbQWWnpxyY3+jIJKrkW2xwGYwRZ6HkQe9CTGTujVMxyPDSGq7vJDPyk2wAVIHUrEJXbNQUpoLPOCMaoPee8hTJIheQyg1EwePv99DHdE0BuI8bm/ruAC+u9MK4wX/Ovpo+Mv+5ooGUgNw0x4tkNM5hHApXxwcu7n1494mfgrxkRmry2BNgrknKHdoY8SE8QJgwZU0QQpxZxAVbzVotOYHhcEutydOMGhUrU7agYjGe8iK5z+xR7CqTim2vzFnWFfGxv88qHe1Kto80cYCWRY56FOa1Th/PW8wpwkb5BnnuzyLkvFumNs/26Uiik9vfaBq11jOZurHcp1slpPvkgANqfqaMPOO5QJn3CiOkWjxAk9MOKmDOOscIklHet0fB69lUGK7hocppRojDGn/k288A8gTIPPnSA6RvX8w6XyE9W/XhYSOR2w+Pqd4EZOf85Cddmw0+Ovd5AvWWDb7J7iZd1Qku0qxr5+6pE9WsU0aoBAQJKybebBm3LvRStodqBJo5HmcPNYtxp7SjKSafSRiqX9P2WpnL8ZnSkvWsH8adASLubKae73cmZE6+Ox5dsZVF9Fi7WdntaWIWEugCsJAEnWaCV/G88/6MV6tvOHdo1AN4EIfk7ampL8gcsO88D/L8nsJIpG/L7hhAfWcX3t0wD/JUNJai9jORzKGELTfqFj4wV8rq2QTuPnMa9M7PfNmJFzuZ57if6QebbVCNjJZaLwDUZOd+hc3EvWRCj9fJdmspvIpFloQ3dTK3BOED12i6zCIj/SlP+AnXKyWyq7ZpLwiJCbIi8q0kZbbsnO+OPdOVPQ6ApiNqo7FzogHrJmvX71I5IiRpGTjeM8uPH0t/tqEpoqLsdTOtYDTYpJxRTlWchof3c3JPScm8KtpN8z5XPGun6a/GLNSD5Fvku8iF1mnA5P5yyCnDkJA8nsFH+gyZSVQgmNqeKhsVS6VUMQ7hInLRmArKYz3lmqrB8AC4Le/btv69YL9nzjY0JAPtaYY+Wr5Vtx6FnTrEZEETYaXrrKoLxJ8AH2AlB1bx7urGtVgo8cSUxspzaTK2PXK97+SUl4yT4rkiOflWHjXiPBpsf//lMlK9JwmNeR/u/fDETAnJmBAtDCfOqwCdd8Q498AJK1zk1Mu4nf8Njrw8cvi31N1TuAIHfebSxtlfi4WL87FGAsOK65utpbTkICE7WqpH5UmCn1yxauhveSKJFAqp3VX3iM71lcojPXGBiNuefneVl10u3Fmr1oQ55POvPBRycwWOWsSQ/t5m9CFftY7dR0Eo46ZqkCdUlSmRO0WNms9KayKeUPdyzfUd31UWickliSzvyfLKa2f7HYmfZnFdw+wbZuipxCT59cS9cZxhMPjopra789abV66rt8Q3cw/1G0+sdrZs02AmNlZTOWGf8HOmAuFfvAL+xSv+6XjFXzaYpi+WaBe6U05Rfrx2dh9SJ5BKfyFV7ySljOlw74MPldYLLkmUmQc+kAZnCaTPGkEPFgQOa2jrKHPe/cjebY1R1AJt82dnTRojRyutDbSUsc+tqQYZ+T3FlJlFbxjlSiY8p4G2K4GRwwzAq3KfSDa4kLjH7s4ait6W9z43NcK2SIOHXFAYf+7fm9VAjPgmyKHWk0Rsw+dHHDUCkobINjKg+aRGMC2GteP5ZtJmTjKCgqHQiU+N9pv3ARWtwfJoqQaQcJI563G92jTuICXX57C9ZMcq8/zPkbZ2+2bUJyKwJqbao5pd3+o7D5jJ2D8LXNDIevjz9outEYd4rBQBEUaZXg+lJA9MNrq9iG5AJm7NMAfunLLL7fHh2rI7g/X0HY7PZd4G2urKVo+kI3XEY2A6JEmGfVKmq2/90wsR38/sVza+JIucnf5kwHNkudvpMRUUydyZ6KrC6LKY1glMYLXp2yF4PyQuZMUak0iWmllgI4PfjeRE4cpgphpyi1AJWSZ0Q4MR7xW8HPVPPnYlgcE6j8kxST8IexRKGWCdZhoDEcC3RbCreJJnbBSoJwk4mvLVNBq4/pFJ4MDknUBQnVGTRoWCyxifdSQTwqvRlkFmviIMV/GaUky5MpgeZqNqX7jD59JTkf2Qa6tl4VyyPtHoF6zznSn+YPVWM86gJ/tWFkLnddfwPk/kBp0h28nOydf/Jb5GnHpIG+YeCjPIYtcE47ieXXzo3ykZ35lAsXD020W9WSbTKxYsJEExNetEdI3aaw/NZov/ETmEjlu99dVBuzhvb0S8Pe2CVX1AmZI2K4DQbVFeAu7B/w3OXiTPNmcXJeX2JY9lJJ6yuhLSZdv/Ex+7cgMP/f+y6zmyFnZYsPJInjNp3aOAzIhzccbN9qOoolIejQXTN9IP95wtO89lfcQ56+nod5MrEG2QG6QNaHcXiFEUjzHYdodXDlc/y59whVRDSWieM6HlQ8imTRX3IyLXMOddBuvlPQQ9lYIsll/IGDEp34Qc+riqc1LFWB7xaqwzzv+4jZGPeBYJFkXNyGR9D+v1Lx6gR5TPlfdox5A+Mb1rkW/POdNz1N69J7fOZozWOT33avkOQZlVONRromeCShzJF9vDWAmAfKZ36ECw9mGajFIEiDcIqel8XcvIE0BEyqk+2NhjxHc3syhes0D0x1nuXXDNMNt2bfY6/dr6aHQcQC6mlyq3PZ/pys8QZMLc+Q/C0zFF/4Um+3VUo4wVQILHSSKenicVV9Gmh0k9T7zPLxnGWD9nKhAqx9HOp2cXsWdyuTwp4JCEPMeb4l7Aq59bgmNc2M51vBJQyCLTbsNniM2FzKS3PIi6Zn69Gq8SRgKER9p3jZiaKJJbsyOLvW7We0DtbnCg83JZlKydu1JS4edMNKi4LPQER33LaUpPxDNTtguKsetFbhPAdvvKDC7c61wNkpMN0hJNGDZj0ty9SU4j2DiZ95Q/r+N3EK+2gNivzM1f6MNsW0R4OSypSRcBeYPsNnWXMMPoZ1lEzQPbShMKQ64ymawp6TX2q0Fv5d2gkQVDkWmH6RxvmdMAKTH5hxh4TLbNIVBm2FUPi4ZPZ75AkQIkiZ5krvGTLhPjsskxkE2gxA5o4y6MJDtYAT5ULhV5x0wZxdM490OUtZGETceTOFY+uADD3x27pmW8sfEgk2bOsE8D7KxwQBZKSRC9Mh6eM9zducc5O6EwhlMPnfdKgNl2f/9XxjbnUc8TzU6IFLEleqClv0tyVf2sUbVsmEmJ1ge4NhorOrKwz6mkAo6HH2C7JhyAzpWDsHHOBjOQ124wXR1M7ZvEqJqys/apn4vEhEDc05gWFMn9d/4yPkcll30ZIEcWD+FrlMzm3WlLwb5iE5kj/d8uSh3isvB0Gx5NhpJ5fY+oN0MvGGRd/Onx/r2X1MRRxqO894Pr+zOdmmdb7anTdBWSNPTt0vD05Zx9FYsKUNY819/VNC/lHw1JNnXtadPKTcTT9F5obHHYbEzwf55ZITlcnpgF2EvVxwXm5m8/J7m+2YFYedUT2ORDJjnuxQvHsh6VXFXZKBlArhPdo/0pZ8sCBngwIGSyMm6MRz7mO0j9rqeJVR/v0tGf23IKE+fUnTyaqg5FiG2PKjFITBB7AWV7kTmWWU9emyizfOl5YqeP+PLnBhQeZ3aeLVtK7Fi71grsUMB2TD7hx74jfdolf1ckcZiSv9SfF6v+xSv+xSv+6XjFXzaYYnIvWG7BwoxkScRP4imHmVojdtFoiQbCWwsAzuofZ0IXrIKHRq0bk5RN86PTbnOz8X4YKvDaC5cCGuwwUwg2Fgy8JdxOcfziCqm1cQ5g5EaS2fBadRstmHfFtmjmS4KzVfRIPLgaZ525UJcfk0ygvWAGJV2S0lQePiglezLSBPM5TqiyohBVZXMjek4HkWAiaTerDOE+99AMvV5nA6kFu8OD5aSqDNm8KwyJkWNW4P8hB0jYHiD7crq4qe9W9y4Sb4kpRfeeNIpFmZtGtbupxbYbTk9OhZ/SV/ZeHoVdrq97vI82rQcoP5EeQw7goZCuV94/f3Trf8a1Ujf4LiCnzohmQDmfix79XGlEvAM6QgiWx64kNw/oUaP9eY9WTXqXlqoYq1jNM5sb7oxks4UGtyagYGFEWpifWzLSC0gY/Lpy3ZJJmOs3lorwWyQxWjIPh9m3FW6tCZ0y73tFw9gdsJzwCmZDHODSn8fQ0OJ37/fUnEqqBuXqQ3jVoG435LYfZkboxuyYIpJ3Tmp9gkThcnuwDxAY77ipn2OyyfH76GNFkqfB7tANy8sA2eKzqRIeCsGKlARD8Tf3KNZ/V/SZUARbsNh/VeQqqxunWyLhtFoLgOo6ZtN79fRpJJ8kGBUs/EjqsmD+NllQe/jdz70lmlD8WRT/gGuYIbobbCxT0PKVgixD8ox6d9Ge4A9QfnSVHMf+CplGJwCJmfIYFaOG1Rke79AkjHz5t0cBFOvqTL6NNFpW+6+W94givhKliJfuo/d0fNYI6GPG+tvcYQ6Z36/ZriVhKBe7wCGxnoarvXZZeKzElPGNfDP7zjhTHl3MPq/Nj1zPajBZG5GyeQAAIABJREFUmFVAibZ0VS2V0OuvQn+2wWTJqyiHHewKm8+IF9WgUDm2D9sQzbK+JNQAkrCAe+epZZDrMhjJ7hp22FOWz2wPegpF9scB0Z9AhKXUjqwujJ9wBPYrwYPfvv2dCUzVx0i5hS+AwEqfgC2Lj/1z4pVhCSjF+WmSGs16wJuXnZxk5n3/Qw+4MOXcg53pBcz+3T3WY9olE2AzNM+6hbdEnpfX0P/4pAuzk9hfvnqiPPKHKp5r0sg6L0KMK+95/b3giD1k5UrfvCRZ+Oy1MS1TJvcmHawhDXJ6xpE4U4pE5Z0v+n2fBpcReZ6EHBaU5FBtodXTQFduvq99jHK3Oua/YMCrzqxpPQw27WL12a5xzzBGG2DTcn8mlYcbQ39reZ9oNu6WnHZ9+He0ssA5P9VP/DIeBudZbE0cSxbRFu3998r846uklHG2C1eSvzwlgtWMVwFNwjkLsxEXDonHKP4nXC7O5bsn8VfJMLn3NPMeh9BXPws58rgX04Nt6h0bYMoKxnn+bNoVNYXH895rhSzegIRaOfyTyCt1xP57P8fEUyZEt/ZedrU2XK/4uXU2CWYPUv7lER99ttRU3If45/B3k5G8pnq0DMgf3qJyztqFdmPSs/B3jCvzLvfF6Lzl3TGq96B6yE4nKP6+BLNoBtS0pPLOJlyu7zFYGpPybhtP+ZKLKwBFCTnM8kib/nvUrvoLZAaZ6DFVZVxx/sc3iM+VH/ka0QEzC5Dp5TEN1t50curIex5/1JZXUxpElBW+LjqErTOb2MZ+WXqPDsSjDtc2h7C+V/cwxFJB5MGg/0leMRDNo5WkVzg1+NtXrxvxr95XUg1ao9eoQecrpb5RQHjwAYyawJFsDmIw2+/q3J93NYpG+I11veWZV6VEXhHU6v1r2qye5a+xH014eork2XwZ3dmdTZBticWhXKsmUB7AvOycAn00+937DNZs1u8hDAuS2eIXs6bg9ELYWVN0xkr6KpAIQH7CioGLPaqJOakm6ZCK+5oymoSt1LSuR+qWqP0Rcly8mJ77zSqGK5cM9t4NpAGtuhPEzDz0LFjZzyZ4xKVnh6f20zl5rh1g7xJ5nL9l+yAdj0nyjWQFEZ/j5rVeiDlfInnerp62xHc0Fn/MlahDIsnbs1kruW1EGGiSQ6HyPn8AmmBQTYeWhdOuBWqVBLibDXghG60e90gIBZ36e8/mS53rdxJzH4TUnaeq8mgaVuNDg9gjkrmOkMlp0phFmxgDp8appj26+c7Szf37KIsPIZtu3HsC7TXhh8RL1ZS7Cy0BVhCFSEhr1mtJkQDQ9LC3JHp7IkRFli+8YNK3Wl5sKw+n8DJC3ulnk4QTGY1/9LdbOyerjjRsETtETzNu5JTWwabiu1vu+b1HnmVHqhLbD8nt1QSAIvVjwso6XqYdyVw/0y3JFokBBK3zLZsT7t/O5Z9w/YtX/ItX/NPxir9sMH3aBZzR6DUL/B3NTn1VIiEQrUpH5Lzsa92oeTN6ANTnQ283QNVBSO0JcbhZRw1lZ2IrDpjxHi8+7IW4ZLfyNHz2ji5keRCFWVwWr+4MVd777gNYNNgs3ge5gCvvyArYchIDqMLtMKQG7+4wVxEy5TMCSLLP6gxdmcHcupPdGsGqDr5IMBQeMUvkk488uF1GezOVpr6q8cpo7AzMBNvRtOnjKJkRLGPmZ7VsZPke8fdEU+GYAdTUTxrfriNJEgd/NvD8jOOZD3YVqgSbYqv3hJjns4hutPbfy77z/mw+U8bAvEwKHbLB8Nt68UdO2CyiMFpyx/MRAVn8ns96zVgLxpna+SnX5x64Sxdqw455Ztd2AqfbHD97baGhNZnInaPOswxZFbIxiiuzpHayGy7iMUW0N/fe3TSxEXINr805oCyatW2A546n3KJIGIh/5gTRTonD2F+z36vX6IPms5vlALXQP3L/idCJCc1eBjDcwqS5gpD2VBLoE+C0MrNerSOK7GhCIs0yLfPp+PzAfuX7vVqmEiwTQ8LLWbXlCuMzBHNxurSmMOSalujtd/GRflBW46hLCKg0iqO5dj+r+Bwjzl0h7n2O6hejy+XqdeNKAFXu34DXQTGGBsVOxTMJ8Y2OAI2GgV8R+GTFvrlzbahKeBeU91oCRlNGJxk/6fJHYVaN/TD/rP+eUcojMNcaq6Lh1RIGwb4UEbZPNnc8B4V3rtur1upDk5404nyecb+X5II7Wz+xfAYF6k2lZSVsvnvi8MosSORZiAHJnv1lQeQQP99ZMbQkPx6M1nNZJ+01on/L+CbBKL6+/Z063G0AGhPJcS+VX5kodSEmk/KDUSu/tViLIwGvLpqcBrtHexacaT3zXwEwuvNbSlzFSLj+Cez2BKYtgYFIrlVi7cY93P33VRSBJqlDuJlRaDL42LPBiu+61nHdY8e5i2OeAF+SYy77jZGaxkJMO/azUdj7izLDVVf+yz9gB7gYBqDXY1rk779Gfs7yNhRg6GB7ThWZ4bKZ+j1WXa6dBA8PWStVRbfjNfGU4N600T4IF6cwDMkpuDiMx65HRxTVZjEpehrg9OfwmnrxydMzwiEJPPHL93XA547FcmTxnu2sBsaGNKAXkjrz5CuAmLHorlDkhg30Z7Oqzhx/ijyspFYId/6CuCGzzFedK1lmtbannM91c6SG3h5g3eUj3sM9jHofvgCqytrv9vgbFmxX71iiLLeUXfEuhqMgu5o9XEWU5gRTE1MQfO6WODINj5t+SALbw1/E3Rn3ZqSXSE3yuO/OS142uDIHrbpmSDRDXKNh9pGfcaSf6PbND8MWcp0IV66xd5/R48EUn31fzwp8MvpHr4HnuF3E5WpifDXRSwRkL+ZOIGjc3UzyJAQiH7F+JGq7MhZv/RUSsFIN6er8/HePKC2WHMnq+qgFIojT4MYap5l45V5SvVvSKkCGJD/lXha/sZFAk3824UzqTJd5ajkCYACQnn4/ckgio43rfSx0pxxNAr5j/d6NV3TxdseMBo/VFWUEecgij9JA+aBY5SMaPpMXnvctrILj/Yu8+CkvvszSMyEabL/kHUCDCDKccaePZrK2b7VT20jsIQQkm6mXlWeB8x7C9pLGyyYAymsP3CdrL1ze6Hg07d7WQMmnhPxn+HxlXnEfee+fcpWssxQoMmLdfPjuezV9UN4tdcSLXAfgrwlM6jnF/nlOK9RknHvK87v2ufZrhI+SmWFX1BXjfjYijGIe7xVKL5e8HmCusfKMvtuMPVjPwcrej3ywPGQmVO5rR7Fj5CF5GeEDlvtvS0oj5RToM0d03Yilh3SuhVDTiDao8klVcKKOlOpIx1DwESB9xOG8j+Ubw0DtEAmrt+WqSKk57HhPVbCdzYEC0gzs/j0IsoyuGX3Hup9j4NtQBPErFCqA8k1y2S31D85H5sGa544J7RMYy6mA2fgL9cg1S9LeEnfqfFnvjvOip9lvVc9ubTUdPBR8Rjc3YCG9737C5fwRlhYlg5yWCu471rgZ6M2XpkRaTVz8mYCYXiolJb81CCPVdLxK6ajIMuxuNo0ddBwzi/rILCfN8trjkSPmfRRQQt5we2IFevzItylj7CSueOfd9bxErL0l4+dVA2X8QcMjh1jjb334lwMf+8Sa6eWdxpmG1aj/IfPRljFbeX+PtLL5L3zMbsBOj70kWUvYO4jLSLx+TTYXJmm2uqa5HnKeJhu3jfngVd7NSk6BaZ+TF+HHY+Y4dxP4K8edWE/4LSGlW8/E/pZ4LpH2aNMpKpaQsSzyzpxCRY68pY+eSgzfGuuz2T2+zRwxoTsc2AXGn2d6PFF/zvUvXvEvXvFPxiv+ssG0HxrZ8WXz5xxZvHXORerpHK1e+FjxGk+M391pFUk5Y6bFJtLt7BFJduh9P4FMQf3FjTE0WbVE4u7J9noth5qOEPoGWG60PdZj0mJx7f7oUczo4KlJf2s1UiKZHG49aaAYpjWGX42aHdMV52XjAWXTYw1LI89sKnXxdnbWuV/13WOBzd59NYIq/SxG5GsJgEQwvbBeVLJnP88hE9nRta23UvPzuPsZRkAOsDoYdNFLfOUBv7p4XOMALIfFccwLReC66z/MDByrO+jkpIZDj+0FwLWAWAv6MHKrse200AK0zeNkL4Y7pmcc8qdcu3XlM9Hp/fNoxPwvsTDMwDMJMe8pPgHIIHs/Cj7NgHCCrGXgrXsal2s0PsRopjiajJo0YSw2SQFR4ifhbykaE/bwlJrbqQV7zg3Qpmdu7HFw13ewPOjCM6h7qfm8vW0K407VLdoaie7lVxZuDnr8PExPE3jLK5PgB2DyADvdgl0TyXO8U8sBPQqxk4RK+iKcRMbNcpw4Wb8eRZsDmqPnkgwAiIlHzwKjJwNTxzj2WEoReJhsI3HwP9eI7JHJe0gsTg3d7BRfiTMwfgGAT5vNbhJ1PJu8W8jR1+BemUfQGZYPogzakQZvfsoVrNUTTx49RGq1VJHu0JONr6q7JQwfG2ApSdf9IliOxuBNSY0syZilXr3UTAILzA2Q4MUAi3WxUge3GIAAPqoIsG6cAlhRmV0alDNdPQX6RE3nKlZfJSU0SyimLqqg0GCmy/OeKJKa2CFd8v2+brxjus3DyNlCM9BaGmzZSV7z/YBmTwEdI+CjH5JZsMNN7gaju/hAGhS3ZOuNWdObmt/lzoQoQB+phnu9fuUmCqWrZBjD0nsniQkT2MM72b/ywT7lFYqJmJRBBGHUtIFKPb4AUR7SY2LwDtGjYKJDEFkA9gSZqO/jWfgDrgBhQZO4EIyrjYkHgKCD8IN7+imS3wUibis1dREsPYi1l/rznLxjuyXAqx1XQup+dF4DcaYOA4ay/n/23m7JkhtnEnSAjJOl7u/933PNdqXKEyQwF+4AI9Ua7VyN0toq2kxSV2WeE8Eg8eNwOMKRkjVxq0HgknaLwIZ3bBnyCU9cdMTHWfM+Un9dPK8G4cyFPeUL14VXitWrWJFKBUUgQe9DSoFkg0kAYGwBVuKxm4hUCfRMg60JKMly6OcPXsVh2+cu+blpSHUnhBlgplhXhCsQGGe3a92L43RbnXMYmyfIhuGnpGW7AThPfF+yNUCemsc+MzEGon1QnY0isZBxmA2a1GxOMw6lZpJpDfSUD74fw7h9sKPrFDgctm68vxm2QEYpjortX1TAwuKxH8/v5cNAZz5mbqJyr4otOEuJYLDm7wzHttmgYDERK/4x+Je5R7bP3BoAmHNgGW1XqFgJoJnazA037TV+O3lA+QeKzzfgXB2BW5Ldcy/skt3BwJIPNP+U/fmU7BGA/B3Av2FmuJJAYeTJHdYMjCVZ9NRsmMc6cvOXjwXw8FFjDNhD/mq7A4qRhvJNS2uAtWSvn3NK4SEmNoB8Af4HWJ66ADN4GD4238t7gF14qbg7gSIlATxr746Jz6aoWIOS0HVeS31D3wvmwJ3R7bs/szORMZFVnNOeuiy7m/IeAdsLsekryXo/NuK7XKvk/KFYWkPil1kXOt5GXK38ANf4Pu8Nz9ixDujqeJysbnbc2a5h9oEiv4UBf9iGTdmlTLjn49yW8CPnVVRZoeK294QKd9kANmJ0DgE7Hb/Hbe2+56fvaRueZPFxTZ4AXz3l6VbIMBT/ooaep4mSa5RtrFpcQPJlyC6qzIHuPOTj3w2QcX2S+c//5mpZrji+ggXtyjPVtZHVYbZZ7NFZvuP415nMd8u3AMDlF27wXV77rEL0MxO4572cuR0t8ZaBbY4VLMAODPi0tsV4PNsIqu3EQzp0Lr5/qu0EhmYwVb6KdNx/Ls78k5e9uWe0/7PPDP89xtd+8sLWbrMz/wPjkGddZyaBjZ/smnRgDcXgRdyBY3Wnm/Kji1kB40aC61TiOXHE0kz00diWIZbDYIgv5irw6ZpRFpUrP33yiSv6hkH1FgDq7C+g/ic8X/oR2Ux/cdaJMZocwXsoYqb5KXrkivZbP9arfW4Rn/Y0VMlti9gAQAVWdkCHZrmES0rPjjwy57EzrnpntlkrnDOD8v8A85QxhvC1+rmARgBSqk7GZv5HJyVtUslyPQs8ABpLKVWraBwz2VkKFr0+hf8i/sW1eGDK77Ilej0+XIX0cw9LawHXzGz8ZYj1j16/8Ar8wiv+y/GK/wOE8JlouxhULi3A7Bd8ug24PBXsppsce+LR/4VjuQOwag+XMXQaEK71VJCSgL1RP8XaEgs10wAkuxQiAjEO+zTtzKDpTRtvJncRbMuUMa1r7zdgqkCagkE75svyJOTAwhbzomtSycGXvGfNaIKpUJPIxQ3DFww8C3LQ79njRdcBjQdjon6OW5EM2HsnI2fTg6djO3UdGWSfocH6ACCMjBQA8BtQp0KKjYF0FIlv7FcDPdVREU7JCH7mfsrGc63MqDUOaIB1MRb1TOqEIFuDA6sJ0pdsXnS3FZLOx90p8WdMJtOrnTM63/GpQboIxPxenmW7WrmLtV2SL4+ixUaSpQI0m4nF0t37KjVstC6L1exKFfv53w9KgEPBOsQ0Br4UfwOvPguhIIFBXgUFSngRDUSsLq6UtrBYLVZGUrIHO7uo9gPAbqmeCjL8OKb0Dmh7YKudosvGKWJmGtypT2qNlJ2zwHv64HPp993FcLOSoat7FdCnwX01T+kExzgaxmAMZfGVnUhFwxramSJq0yFcIAvCAthDTkjsyCoSmxk1k28VX22huiHvqDXmPVehNfLdz13SF6FiWgVxZpRv2XsjLhatUrugZEYdG8TrjiZvOMFTBu+jO9vwJ7v1T18ncFUiJMZPII90Jv8WQOKjh9EaSp5yJQP5YmwwcX03cB7wlm6Ekyk+1+zgb5ghg1ICFYgtuwExVngueT6qWEzrTVZZjg0LMZV0/skyh76fQSHFDNXJ8Gh5H+z30HP6f6xLfXcvg9YKgx6dwEHZywoCN9wU8CdnuNBGnOHz5ZaGb5i6CBGnJJyPY9m+M7PJB54Cp2HAoBTLHpQoAoCVq+fFxOMdm9dgad2HJZZT6sfgiHHIC/X85Q7CHHcnWHo+8w54CfbLLhQklLODRAvDaOkn+iczPJhojlS3yXY+H23+uz9zFbO/GM0WX2Q5/vkrCGgJQK2E94rFwroZKElsTEIexJvaZyOyAbOtznCkEuwMdkfZAecAAOYYKIYiA3YCuPp7B/KSvwwRZ4wEjAYkwL3iOZpxtlJFfwjcM0P6g7n1iK8qcXOf2Lv8qohBmkllMEzP0+mBAmFOvLvd+p22e3ok3wBOJ0U+pHpUjGISR6mPSlienxXmZIj20tShLIIFZwzQrx1gqJjCsNm2/o2FD9Nw7JIle4DmKwPjWRwzA0t4XjeNNQiqj1wH/K6Zpo+EtJ/dmcSQkSc/bkB6kR5uuD7rDWBoHmCYt/9zZl0CyAXIF0u9E4ZvdMkXdPGmXAoe8fkD1K6uphnW9v0egO3DkDczfKQA4sef8R2dAi2LpIbMHy1/4SO+ALo8d7v33YjzeROVj5y8L9vOTyB/488CDVo7Sru9YkUA2LCylfjPc7cG4xi+609GPH5IOL6MMjNChc0KWJNP2Hd3SOXgP2ij6puOZEqqmJeZGLsQnIdsDdDkqsaZ/cRAXwhhoXda8zX1vrOKXbqBtMBb3UoWP865KP8zziwGZPQw7TPjimfjYNGniFvx2l0DwG0B+7m3yIIuyeVpo+P4utJJXgx1ZJVtHBHYYYA73va/LxT8E1fJLIUAzIrvd0q2rN53/c/J3p75dW2spKIrX0ig5KEjAPcXHguvXzqxec3XCwHg+CIj45iTcXgJH5QUqb68O4YjCOB7JlYM7b+JLdt4SQ7qCU7xmb++ywBOB91fFQUzO+oL5XyM9xyAYeQ63bmPGPFGYItOP1ZKpvvV8bZZYKcAyp6n5mevGVUgnvflkktNfc8YSbZ0xcs+AKlzYC/YlKSlOlY5jODYQBf5ouSPYjiGDb3/aPnRXivDQ/XEURJPNfcjjDiETZEvKnTA8a1XN0gZcvDdGhbjiDlE5ExcO/HTAis2fhiRog8Dcpfs0z9/jfwAnMV0swO+Vp7YpIcmOYjEo8gApqK8uokal1AcSKWh+NKV0FfFPSDmEerKhvLm6py3dIxZQeoCMlmUSRWeJFFZn6k7ICyZidtOjDYU5KYZ1siHL614s5zko6QRlNR3VWYzEjk2O+YrNrkkJ1o+CSfGMpv4iAP6hnLALjDkxTwSKkzuInRwv3GuumMHsYo7QTm7WZinYlwDEgZ3dvv0ivspwPL/FiYoDGrfwCg1m/2I4V56l494fxc2Yo0XbtvEsworrgqHReNGWfvITCM2hHeBXZ4PFhpJb37m72BMbJH2bweuEEkjJiwC91hY/r1kkn/hFb/wiv92vOJvC0yh4ojvAijFOHVWrjJP2zAD4adMVMmmxWGi1pyRCMTDcLPFmey2Brd109OSAzUhHfJkB5E/EpWrW/oANydgajSq9/PZLcRyeFEar4JRrt7DUY5u2zMzfKzD4MvML4u2bDbbB2r7dvPuEGGirS/AaQu3PCzQEeeAVXtvAc7UkL0OmyDG+Yy6eyXVbNM/LAEkE1DoudwurPxkQRAlNbeQCmLxrFZjAQjKj30p/Xs/CwC9Bz/vvLpGyqZtAjx11X4pFupxQgF4cJgzEqYA+jMJmM8xcd0D1jmdiU1XhSjexXq09CcC6YHrT3nAP30dXV6tWwc+mg8RQR3bOgu6/21BJh6AkVTHJptHDAQALeMYcQZHQ0HJzW8n/+UHIBZegWfpL0mtQfJyupe6zzTES0nOe/cwZEQBDgMlmXIFMEu7tYpiAx2MY9G58IPj2IIuMh+wo5xRDaljwIIGyPpshmlOlAKSLmj/oFZvJLaMKY0ybZiZN7uHxdyTYFKG0xr4Yceh1tGqtTeRf2LktS6rioHHXxouv5B7tY0zG3Cdd8E2YIFO97A4CJFznEKgYw38M9jmO6X9AhDBBKjsYrjmeVkX49KjW58JYKmAFI4xBkaOZlRNWA9+JwtEe+S76e+byzFqlpn8isOwi11YnK3kizbQJpkPFfGYuCDRNhoI+B7IlIwlKuFgwhS5MfZJLouRVdd9FXgesCj9aQDwLpZrm+hvrrbpBCec83/dwcHmJwhKAHOf7gXu668dCDw/Za8dT6i177Vbvv34vmahJtK4PnW+MhLDBkYcAA4AhgZoG0rmoxIs05MVCgxYLNTMm5WftPP20bPnBgxhZ60iAc9kx6Npjk7RTh+M2aH5g8t2+2YvuTR72JXlzWpm4pVAHPmwVOGE61QRJ5p1T2am970CELNYxWCHnJUGz6J0rifnB0R2INiyS+5Y30p/nySTHjo9qhABlNo74PixJFPTfn2gQOPE3V3EZWcMA3cnAA/bWefUHGPJpmHjpz5rCTDf2zCC+vEzgLekdQqsD+qGqvDhPRdmyE4zDpEMRyxM2bL0r8UPM6N0REkPjPoce2SHX6W8uD6r7cTIw77uSMpOkhEPyRIAmALYnl1W/Z/mh7AD7kEmiY+h5x1jJc+sX5TaygRnUjClq7iBpku+KGQLMtFN/r1W6GSPGvfv073xYI8We49FM86P8V6+IzVV0tZXbNzNgo7D1EfZzZoSSsmPvVMukjbJtrVkCAkpC9ihQkqKufe9Ckzz5rnpRE1A/40H0GPRAdMl/Xvao3NetkCn15bOfvopRBjgssWh7p2ZgRq2nanZDADGXpQOopA8AMqJlzw1AAHZcjr5nBcJ9OxGn22Laf2ZsM5YQABDsndVVGp/KUJfItS9LlC7s3t14sQnrO2jq7D93H2BsHcXWNIkTbwNs7vWz097SwiNU/h5FBq2igrcvwStRh/XKYUN4M6NV+vqh+KHR77jp+O7GP6RA9BZmf675DsJqJgZfav+mz5ZtqfkUPILJHh8SUsRnefx5CzciMRHxdDuh7yHaHYvl9zY0QSDDcBykezX+R5/58/D2v/pa8YHOzprLm8VH8sHm8HybuktoMTe0GAoL9rzV0Ck1dFKIBtv/SwkryZQTDnL9jPr1hVvjghkHnKWb3UhKO+oCRkVt42aLTKY4/l2pADzsYGQhB1BWdluh3LH01lYdntAxTKoANY5fYF6d3ugNO+5vHVlWkuLOU5OOiyRsj3zgeeMmscdu+UKy8Y91Suu6tKLc+5M8rhV4HJAZMbT2epaH3dDVjwcDgTwjHDbRePYMcQGhmJ1BBa+2mA+nM5yAIiyN+e0CbfHMmtJ2sIiPANWxRR+Ie38YsdJ2gtZxQQDfih3qOL7sPkYy/DPX25nhgcAmGTm0x2XciUWizRLWVJtATvkVWFTMDtkzRF4iQzBeLGK8erIwO5iRdruWefIF3G/R9E2nflKxZbMm0jC2EJS6/V/CBeIfDNuhGL6mrOns7EAjM0c7ca75ZMNs6VQ98NXmCQAA5pVFJITNQgPFEKjQn861ZjMOF7AJVeJHgdw3sEVL2Aw91yZ7RcsplSFjLOqg3jj5U/JT53ZmlkFkZACgFRwThwHztuWrFnZJIYGo3+3ZycWh8c5ouP4mkPaz0zkcGTKxydQsmQWm+QgLLj9kM9G5wHRUpoAZFOIlXjjMCyUTcwimusag/KvMCnG5PcqMP3CK37hFf/teMXfdzBV986UAyxVy1ioCuqESYghMaqqBhmcZKEgKzApKbV5datV8gwhIvBR1cXwBjICZ3jjDz+dHqHPj31k0XhvQX1krhuuALV9zbB3iIWTGLeczMuaDVDG1NMxFaBZOCDJEIL5BsuBSoET6Bk3dUAy2ODMJOnJbtsd7KaOvafj7SVZsJGXGAOM/JEJlOarp6uCaF2VDXMMUF8WU3IAmzMJzAw7DKOq1blxjTog/M45Jmx9wq2kwTSqLV582+NgK5GB3AvmhpexzfkdDwkNDxg2zB6MxwRGM5KyW/dipp5Z2rQDBAJwwwydWDIY+QAWENIzrwJWmiP3zZb5wbL5S17yru/fj3L6N7kSWw6U97WuKnqQ6WvGRLuYYQX0bzwGhrq1NM1QgWi980E/AAAgAElEQVTm6PbwPTZunG4xxAI0o6CG9w05hqykJ9kNBgC5Azb8K+MtJ4a0fC0nrs+t4ERBw+B+q6tSlm2UdbuxWrt82zHcAOhgH0BbSTaw6MIr7BLoRdZ0OS43GrjhiRucNzZhlI0zA3Ii/FkMSTpz6ZuzpFnlmkuGlMlhAsCeXaAZZnAnoy7VNXSDLbAADrsp9d7kMHZS4sUryn0dAJG9SHzvtwAj5AamAlLztjdVnAybAtAC7tnFRIfBfWD76M6lNQlC7tBgdgN8G3LUk1MrHCD0GNjcC+Wj0nDbwpxTACYlOr4XZAfcYzERroJky7huyVRBoEEBME8pGbYeJzauKKB6KzixHsIOSHcaeMiVnivts1l2n83ePg7KLMudwm6yitcF2JJEw76O5ATdKgvAFtixuf9HSX64nvvMsKDuOOg7immI1UHiLcCFN1vARMIkrRh49eB41/mpAbnR8/tMwyoDsFtg4wE1EUcr+jcFzTu1lnmGVcfwLlIOyXa9bcOTzHay4pS8yxZ8InCpED/27I7DpeC2zc9wjMzDWssBM+A1Xg2+rCsx9lICWM8GZAWZNWi6C79iLo2f+szZrNUSvfkUI52SnS+UXNEhpAWWbw0tdlhWYUNySzhybt/hsmBHTcXN1VVrG1jy4cNCsgSnqwQIRGr2Yzpe0p3nuyfbq1jkgUM2sCYAnKHcQOBjk3Hpg+zU8AK8N94DPcdh6vsps+LyVbRqLMacZ3N7C7x1wExn9qLE6/5E5g2gBkUrMN+P+UV6p9sWFoocdYryc9esAe5jxmt6oiCjmeC7owgNbtH2Yil7t30SdXZwo+0Wk42ay8OZMyXzQGCuZvZ96twf8g+2ul5jd7dxeJmHPEPNHYhd8wwJKi8lORgA1oDZk4TFf3gXpYbmDQBvjwYHa+gzEA2Gm1tLboekhQwfKqYFIid+y+rc5X3+9MRbn2VYiLviZZ555Dik5W9yVdocslumxNHt2ArD1bb6vurPdpPQkAtT9s+ckihwa5IVMPBWV5KPN4pMEsp9MJzyuJmc2jMcE5wDGhF454aN0x2wESTzPxjglcjWoOVrZ/tZxo6J2LsTUrNoX0WTqxi3J6dLzhdJFnJ9kx5549VnETgA8m31/t8oRZXAh2QyZdurAycv2eRo9YUUI4/xoM5fBoFPw5mvBCbyAMQK13k3g1fsXABmrO745CzLhyyMO0k7kmiK4VjrDQw0cWkuoxxRndk610rI0rPzZItESG7vltRUxsBS3GsWHe/eRRZKa3AjpiSRq4stgZc5rsrdkNjjpRaxhR2BiQ/8zzc7VwYW0kmgOp33bsxLYQTkrEAtW4CZ/Bdjo2s7Gd2RPeOLPZoEzi+Wa2TbhXPsAMRafmViaGbeygCcSiLhNxZuhBF4pj/SfGoLxXkEgl9gXmLUBoM5cJUR0BxixqjRBY4CYl32Fzj5QuXdiZSii2LYkku04+P4q1KmqQKYZe/L21fHUFtIYwJ4y/5P4HS22TmjIXWUiMAUSB+yAWaG+AIQaxyBk9ziiikMhhWONQ6TfCjnC0wMB9JWx8Zpp1vKFYMCOPGYP+aa1Dc/9LRiePuj3bDkl3I2iZ7uuKIA9o1b9vYen/394SzUeBgu/xA+FHgp3h+aR3Rn4I/5jQpMscEZkyXFBQCGyI14OlbZbagj4GUsHjAGRONoodmKlhvvcWK8ml00cN7TlUWAvDt2C0nvD39mVmAxIgJFlLYE5v1WFHJmZFWK/vaBax1fVV3k4Y5noSIi8Eo/oDb/EHu8jy/mSnEZuErKdUSicGJrBPglsdrYIvPC6p4w25hp7W8AdY7L/rzySIEaq1XCbz7gPjDCKG1maClKz0CMmjXjWHDABQBnwC2OXzV010lBND5WEyQMF3YVJrzIyQTp3QcyljChJGnBQGnq8f/wTRi6S7Hsk4XB44xf2IO/B2e8P4msC4eNhvTME6zhTcR2Svv7wo3AnYHlN2yQjB7firj3C68AfuEV/+14xd8XmPLFmRyV8FQCKSMAAMvIZeXGH80SqM3u8UZVyXftFIuWWTilzEf3gSeGNsttqwP3YodWJR1mSPvAe98afBcH2NXnm5kO4GEm7L05EA/g4FN7MOLA7OTTazgfdd+F+gMw6cGq6OZH3KES8jR7sMH2GXZYrCFV1RhU7S68hZ3lqFb/5Qlb0pI1xzRJv40qUAFeDBsZ/Yx9OogOkRjpYhxlknkCYGNhiu1gdtrQgd86GITX0NMT2J6hYv3VfLwsxkE98wQeAUPlkU+/XC1+ZDG99CbEcMhHBXcPDEk2sMXTsMPhWESY7A3k/+jeZGy20TF/o8s22TqjJHTwrnoyHSsA5Me562Je1PbJBDBaBqI7ifZ5PyMNb6NhaTwhP7BXAQaOLSO4MuDDEfcqKX6kv7GMjqcZR7Fg22FfwjoAFhjDcecbeZ2Bc6sDlhrIiJYufDLk0j71eAvHJJ25XYcJdjX70+yzg9epobY0gFt+7u65BIar2TXVKpsjOqCsfcLnpmymL7IIuW7nYFbCWUkYv7feKVqHnAa/WkvFTMqkXNMYbDkvUBHRBfduTUegtNLDVg8GrQ41Jqg8A0NJHu+rmB9ASHLBM6tWBUQBDoYIAqgzHZVeDYGyN8gEd2cR18VsHsmWc4/ss/xdLqatACQlspxMZs6z4vpcGNgKeAgoCPS100VXZzBA4NmQHWRQJqf++/3nW+A2cccd0V2se12SiCjQm8FFaXEzHpI/QhxaWPIsDUcP1QTQmvJLbtDhuEVy+LE2zlQ9ff6VDcCXpjKXqTcFirnjGQxe0SOjkfj3Q4LxBGNMHjSQtrpVYvQeHDAxd8+ZyXRq8CuGyD8F/Ww95/4c4T2bI9MYMBoZS+zoJWi398aF0to/vmmPxO5hnnr+7Z3IT0l+EJhU0mqXJDANCNO8j6TWsj6nAEj+znFkjHfISjOf8OUPBpWAWHdADFCL1UwiYoaOnRe2/X1Y9n/1ssAeaEZdAcoFyAJMdtOLhPPu3dcyPTaxplrv87DsKTBH+7RztuSFAbhzwU2Sx6bC0gN8RQRWhIbOn3jinYCb4wMDtilZkmbdmfTUi97yj8NYEAoAuD6wdT8nslsovMdTbNH86Hh2xOv4bV2vGKcTQzb3Ge5SI53JTPhhj4599PenzuQtuVWrGJl9YNLWBpCnE2HjgGthoPzQBtDSYnd/13r6Vt3/xwZM8cZzFobj1fF6+OnE5/dch1Gb60QHnSMsFHuS1oo+2PMNoQh4yf+uvM4ijZ8wGHawqSbhuGL2jJqau7X9LcJHAvbmfFHF65mJKzaec0e+w/UFGotaa2tGJ68jxV0/nfFCKq4YAdljYDf69kK2YsCiDmR9Yn1HpWGlNhBnTupKAMPZrJNkowceUjrzABee6MHeQHXJb+z5FqjmiDXBGY4qMMfpuqrE9Ak+ADjSjH8xlNuz5nSd/As4RRfk6yEv470HM0tI/KxZkQZh4qC5fqI75gO2K+895MZizCICJlLlfs0GhKDPXjB4SRrvwFCeZsmcx0LzFxJYASzltVcU41eKDUk5cDwY6Syi8zxxrY5UXsaJIVtujI8Jg8H8p3w9SVjTJtYyvO2PLzmG5cAov56B237S3krlwHLBxEr/LtfbU9EMc3kWF0lsMBWNYG9JhdJGGDRMXuv3OQhsw9A9+g4WU8yMYGwVJJ2g9vKNsQdg40uRfmKToDUDqHlmyM5TlvM85uNdpm1iHX1ODWO/Onne5pQmMutuNv5cERPOjKYze+5RFDF2MkL3yGI8ECkbb+dcTc0HcPmpJpFAcY1lxysNXmVTCwiyTSje4ppPJ7gdf5GX02e9OoYbKx4AluYBe5zCF9Ckxd736V1Q2x6wwkwkS8czrDXzEtBDF8FHXA+JptURnsfBNpZQ17GTnQNRXbRUlLDYlCJ/vfB2xhnVKfLyjZanxek2exvzjTvug+l8g2u31LpsbjtoMkuLWNMy6/Zm3qTCOd9ltBHKKiR4YuRRvLECk+QrfCfnshgB25J5bXl6DIQ6Fav0DygHTzy6LcFcvPeE9muS6DTG4IwiO3432ZKIEcfXpPLK1Iyl7aullU9HPLDblwZShOFXbnVYAeHKOUccvMwXZ6BDoD8+cKi1PFPYKmrb6lkrYReKDltSaemvBpANmhFo65BfAVzrpXuNVjyK5D6dRr+ptJjvMV9d1Nk2MatY1nkr13xvgH1tKlDp+zw/e13cjvRgyU42Rgqe7yKJJJb888V3AeK4szooJCUZImFU11ORy9I+gATcFoCf+E7XL7ziF17x345X/L1EHk5hpwo1/ex2EoNLgVPOAiGKZWdAvrjBs4BMFYqcL9rCDhAtoza2gpUEXDOEaIR/58OZY0Z1xWwALlkHVrABdhUQS1aSYYar9LINDRjM9UJJadWspgBgajudDz3zkOZ+0p8ik+zeUDJWjncY+vfsUTWsxNFB3UUgaQz11zP13WbdTTV2tua9K8Ef5oh9tbPbSjiRrKhu29jOhG8uNDXHYNoYdlTv0juYZXdXiweTGfVgqDzB8+pOGSC7sUI0vvaHBrxvgjz5LBSg30Xmxs/hfUAbXahiID+En2UGjxtAdtX+D/+ds4jEIrqhQl0uFGO69Si/yTWzwDntF0XzewRclEezOB0io5hDW4ETtUD9S1gFpNgOdFaBgQ85cemCzsDLOCzcwNZqsuiI4OwJnG4vze6KwG1+EktdYZ9IY5hM7CZg642R3P8bL/wWUOunUts5AHsDFljTMCEgS/uCifsTwHh9+XuD934Mk+MCYPY7nUj8hqgi6yP5MmhuRFW/zTjjq7SQDegh2Apiss4FgBu3NLPx5fsBqFWezznGwEvMk09nellXP8OUGIYcLIOggNdaKEg3n+0sMokU9nsGlODKnvm5L3u8o8JZRlaBz/Ch57zhrQ9tAhv4WUy0rwTPXfKML4GVtt/cl47q7/o2VzFXTJ15H+sU3SphZrLO/673WzPKuG+CXV79ecDM2WD5ANeI9kot5yOPbrf8ggXZ3Wbye9LiT9Nsq4j2VcsSsxOhQEtDpbo8xm/4SP7/Zee815sOOwOiw55SB14P2uCAS+6lbxYAGTEMPnw7INDMrDT/3/2l1hPWee0aMq7k8LbED2ovYmQFR8erdDevAZaBvSsA5PrEegH2hg8yCqtw67FUVKXU0BgD2wzW3RtKfGP32bLwjjmOjrJ3cMluGyZBtZdNM8iAYvHwQKeV/vVXdldLZJimok0Ob0cCn7aYOBlQQjxm2UFcDMcWq706YFgA+cC3urq4lN2ZfA/rsRJeySjOPME1meWTTbXhihGawICr4aWEK/mIRyemI3LBhwP5bkkZgElMJE+MJ7XC3d5KOCawN7Y7foQIAZl4DxEf9L5mGtY4gEDJZ+11AINKTM48BkkLJACLTm4BzgL9j0v7aDuOnFgcWVfD1D0fQtRWlzttBQAz+J5KOI3x2kNzPSOYBPRXOmpmRMKxggxX0/q5SCPdsSzbX5DgyvexC+DP7kyUTj6AE9s38sY1ZnhKJh+fr/zrZiGiaiDpAqxEhshs+ZuJjfsh7UVbOmAgUJjOGNbMFFdAhT7N04kfPGtJX+4mQszfDKL9J65AdFGu8oj6G0B//pAH+SyTjWPrJ1bb1eoOeMXrFHZx1BGqw8jDG3wYmtk57MTjBAJZIAq//hMEbpkPYOyr7fnIAPaCX9HgVsRUvI7Wfh+2O1Zxm/iMH4ShHrlFr0R652ktyfXosueCKPdU3HRJ7oRP/wDt8wD2zYS1B8D3vB5SS2kFk90IbdIAejZn5xY7YYqtgUBGYODVTOKZ3gzwD8me3I/n2JnNYE7ltssWt63pWwWwXGuiZnI26DcSRaIqoHHAUBKMzNdrHtGlcw9kzcGDYeKQwzITexxClSfPEsAiJKPkifnNWgPpa7ILqgVxJhIzyiTPxjKW31xLp+Qqi+gk1WVmj25bdneHwXLHh3KTa7NQGHCMymMVLGcmAbLKiZzdfI7jW34Tcev3xzMYJqLtFWVGR84Gw1+3PUQ5vP+5rWLMwO0Vw5Ys1zMvOKBbFaUoRReyy0DNEbtkSwla0e5nnIJ24n7MZqoYin9Tb+TV331kUAvsNjsS7SSLuADhMize8XmPDRAu4WYY+NmwaXnjp+RrfR8Qj3N+wGjYhbQi0Fa37+P388CfWzPjgIQ//H0BkLHqMx1Iw/CJj43/iB0Tp0C3sYHyx1b5nOPr7PN/+gpJ4BVe0NW3ttmeAd8Vo6kb3ZKxUxZJtWyxugnBDvRM7owq6s2Ga6x9neeLShtmraTEPNXaFppy1tuBHevLPPCZC9u5xz4291zkUB7Cn+kf137YvhDOeYJ+i6gEdhlzDxy/YYkG0JskNIPqLWDXESShN0QEPg0lhndmE+m9ZJ3M2ldxf7JrxTUfpwgbdA+HTEHsSN2APoXdnG5jYCAnRN4CKngvGef0Yy+cr51deAWfqOMlMnqu2fZbuEQVQ2R3ixCcA6PiAkz4qhxXcoNOkoV2lfyvNfYX+jPOteHLZwGz9p8B2ksVJ7s5Rs+KcuRjVMd3uH7hFb/wiv92vOJvC0w1wNBx64VVtZibuRj1W6jBLF3ZNGRWBY3SawbD0s9Rgkl/7dBYkWwHYsO6M4ZVwcXkVZIZDjw6PV5HPiqrxRXdomnSRU4A705sHJ+d3AI+phiQuidw6CBZCtF/ProAeJgs20/gUsnQlUNCMC22cH4fZAJVJ9F+yv5hSue2QhBQ1zWfbdxlGA4zMWqQIBZyBxDUR7cIwH7r30Uene3dzm12EjLy6SC4cUOAOZTEuzl27D6AGIkRJffxmNejCvvODan6AXnaFutKvQODAoyeJ1TavCcR52Gs39ccgbgQyRlSPF8sVy4FAzb2t5NHiWFiVdV66y+SzgBgkFCgwEBJvb2xcXOkgG0O9i5HnokPe6lIymDEZHjWoAEw2EOucZwZBXJM144+V5zNxTb+j5jAFrtMv8+h7ffXNk97YSeDuLkUcPlDjzWpD05WZqA7ByuBsNMZyQSxbvYEO8XsIJOgWr5fYjFtcNCgYeEiM1CFld4ExVbICx0x5QNELCcm0IxDYxOf/tYw0v4ValPrR4dxcOzqYRDPBOSARqbEjawJJlMFNnFdqwjtZPJlIP1uxl2K+YgO0msJ/7RWiWYXG5T8JXBbaVpz3Qi8LERWEHJYDqdY5WyTzofdGJzB8b0uKt6/xEKJa7QtC4G2c9MuZ2Z3Nu4uPALb95mJlgW0OFKa9/waFvu22rRnWLOm3/5w7AquxpoM5HSXlegAaEmaOpevnMA6EjsA4L6wFIR7uphIBzDzh2bxfRlSQNhVTECbSJAdtccnSt/+dI7OHrBLqRQBtD3IDy219Uzcw4JJGoDQ0GUS3M9+v3tfniJ/FWPTvNlVIbYU7P34fMdniHWmroQPSXWc7kcH/MQLgROw5vDO04tFZO3LIBZx6u5kdyPRBIkEKu107YXEhVRHr+cGHsltKsGt+CDceoB07amZJgJErUqj9MhkohrfaBjtjEa2ARh2dTbYmVmy8/RjhDplPFJFpcS2dwPAtX8IgFagbS2JW2yybYmBF783nXEcJAXiHGwaIXbmAGBTttJ6H97u7bBGLHZnVvwzopNos4/W4q8YbZm1XN/YB2SqrtgIa0DoiNqd53t2ZJAtLqC5Yhlkz5KsWUhMDID00USjYvf+6a0AMCw7z3v1vMVsYsNQEqYwgDN1bPKMuEP6YJRBE0nCzYF8kayTC7vsJaMtFY7EOtYzDgTcBVrXzJ6s+4TYwIo1/Niq54ypesaV2YzHmqmQAqdO10r0d2QmVqATM5jsbVa3gQPzgJjf5VrDu5hqxmcCgMTpJvKYnSjWbuIxrG68w56kxGKyUyIrpzidW2VvArP9xrZT3Cz7yv1WMyrQnzXq77BaXeG2hUvn8e7waeHa/+LvPwq6WRLF+fB91TEBaP4JayijQADgSMxBOZJ9nU0x9BUFSm0/cz/U36DvD6wsKelazImeVTOcsxBA0CtB+bKaN7L33fFofb4TUdO9qsDmtP8EyAOuoo27kxgYgRs4Nqz9gp/9/vAJdfkznhwqAA4A+8xrY29XotnnOFJsHOB96/PB2CTk/WSLdzqGMe4wABbWHZ/stCrZ+qvSQdx57vE7XIxZHva4QvzcIjCqqFF+TN2QH4t7IZNMa+ZhJr+jAlt1PoQ3VnEPUN7GLhXiWbi7VPAOO3bngmE6FTgueCtxuDsuKXMAoORqd0YUCYLAOwt9+bCdOqsqRloeW5qZ2Cp+5DygpOcLW511Nff6CUSh7M2XVP1gNgFgFCPALyBKhlB/lMxvy6dN+7pHyg8wt1rHHvTvn58fOEB8kX43gl0sSaLcpTN0u3xrGraPfhckYmxAnSfmJ8/kPNmyQ4XlPGPc44efa9Ks9we2sEAJv2kXWg7ODiv8dPRybwE1M7F8Yt3TfuTp//yVPmTHqUJSc81HQEVsAMk99hXdWZgCtfd4Fjh40fadYvcrK3cqDMQQj25MU77cIETuxh5HAmt8JSiMAMaUfc4XievpQE4W82M/8n3DGJqFwrBIflBknfFqv/FzVtHn1biChx+icOVyewAqui2gi/HWG8nb1wOjiTPTnLOneq9xXp53B5ercwNYHu0zrk58mANxHr32lP1oW0j5W94IyfLj/P9MjA28tMZ7V1yyiSmapPs6oaV/nblpg2BIOwpKNXOV9qU6x9aRXjXG+BmP945s+eqOfzIIl1hg24TNR2xcuWARpvSM5WPrmcc362L/hVf8wiv+2/GKvy0wmW2NxtEDxKkGl1+dCbzKiFS1Go7uVs7EUuD+sVqrC5CBQTo+FMTDFhmZqu6TRRfdtvbTCjBw0NkZSkZib+qdtp6xv3sh3/nCGKMDxNhQRT9ZsXS2vL+qBfqyHkrNET6qdsoZvPZ1ZgZnsgAHdEEAewNR81aig43tB2SpfGHIyJheaiUZZyUZONa6LBWmVoMbd+tLDzOkJ51CyZ/hJ16obi8jyw7ApULPZyxkloThAVJq6EJoHUtn844gHUvB9AKwK3jVBs1MOmMDrjmApeTQF0q/fMto7M2ZL8iE+24WVcUinEXV1UbUELWSKEx/SQtSr0OG82VOUCEcP9b3YoSz+6bYCmUYQa3QklaE4WnkkAUkyKHj1fq6NfeoShP1z12btKTgYEAXeYOt+I+iye1xAi78i1V5AH+IsfIcujPx0iBbRygIGfPCXFk30k4AVjPRBvYk03nsC+/Wxj+JX3VDwqKlLotN/n7IRoxw/PR/9V4rVgGasQIsSRNEBPaQ5nUxEyGJkDLiZfDrGW2w8OMGS+NapjfL5qmPPC52L773J+4qdiMw2hkBJb9yJ0G8mpkQYoftFJu9B0ED2H/w1ecp6JZchAeL1Gacw7ZlcAtcTHwgxx/62cRd8y50sF7beq18b2o6J8+wu2OvJHsRACRxSSkdBdd7d5H7u1w7Nxx3ExmW2uvJeCHQwzZzgtUF6plpWLiA89q/z7r0R/mAOb74G5KsvN/PiMDn8PY9EYG4As0u1iy0NKbKNgyvNXrezNJnAGibu2Jjj5+a1XF14fDkUuNZK+1/luRO4kZNj5zxW1v5gmEoM3qAivAKiGoFHNaDOstuFZgyxLLKvpXqvfwjDZZbNuY8/9CMCB9LwUueiGJWS/2C5cK/FADv2GLuEbAnu21R8ibzwfh64e5ukYWSgZLWA0b8G5BdWGK29jMa7WOkgjYA2QGXA6DEm+dDIiM4k3DEbzADXmsixSB/Y2N3J24BdQmLzWJIJrLZWZLw9JI++h7X9iLWVMDJAv4b0YmOy+TTPxVobhiSSZj2L9yj9o38j1HGlR2cpzOqk6L6PDNY/tbAQY4CRTfP3aaM3jUoPXoF44c33riLMTsmCkeeyjHHzfoKgdqjud/1tDSE9na49f5svNCtZU3HPglTDwpHwh9FjZoxpageQDRQz2CQ4E2BgpUwFBhXkkAh+RKuAaW+RrK4xrUaXbirmSDjAbqPnJ1oBtjlH/gJCDSJDRGTcBiLuTVvK0leepBg+AOjO8zMDgD/0vslIUbJcY4jqdDEi2PzZjr+YLCDmk8AjwbyzKITSoLeiZknhpk5ELZZIMgLsYHLd4Of3+WKEepNOLMhu9hS6Ixx7ZB5bJpHE8FWAgMfKq6U3KQjfDdo2XMzBOSlGyzeipkD/6rEN/hTnz4b9IycJKK4k5xnwJUTKwsUXtj+wgY6VruX4UqBIz46Ht+yc+9iVoMF0Oq+G9rvi4raKEJadYJQyYDx8RN7jVRc24Vbx89KMwNdQDIzLJ/KnQTYhAEPeY9boP8l8uSnJ2aySD7HCX7fAQCB12Te5sYYMcnDegAtZJwOpx9ZOvo+mKfEjpPI28Temt2rzkY9If/ph/lavsoTMGds9trAz8nfTkxESlFDJDGLN39feTaLCzhzL4zs3ojAVrE498JWV07gQoKFw7rn+xFrf5crYlG9QPv6XTNCHjnzK65WGNkFnKFURcC4wk8XGwC4DXzU+QRZ4JnRhLEBAV3gTLgbq0HBIpYRzzG88uJ9DXqVHhI+q5DxA5Y/lXMx7h74HWkvpJHcl64/z987LgxTHpyL3UaG7raYvoCQ1FkE47QMfMowfjjg95k1XXvtrRwDcWxV51oA0LJxj5xoL/6kQYSO8g01V0MdQwypujj8qnOT1vY+H/Nnu3Mx34juMvyBVWx7r7MCrCDoNcdE3OsRH0taVhH7LhtpQAYLyxj72I2sHN2aNc548tgUF371SnXP+u8AOC5i+d1KEUDFzC9Uhp8ePSPFHjb+9RfyoP/UtbBZaG7MSetg9Q/gesRtT/Bz2Zsx7bLupGjA1DjLDOA6fDZTv+bKjc6hAWDbiVsAxlR1ZD/nIXqvCPh0zPAm8eR4dRf5qhl00zpWdzcsTMChERgBR2AKKN6RBxvp4uRXadfygQWibfOeX4PqArrEnAUAACAASURBVAM6/wDmwWjg7L5P2tVDMgDzFiSqw4TynholkVXIXEcudtHP19/vvbGqMATApklFh/fFelcADzKEGedMz873jTPQkSoYLM706w7gZ7aMozAlOU3k52PdfvR/xxOCLjwCC1v0tbRPFljGB6aKJhde+NQs6WW0g2+88VIn4EhgTHYYj+oKQj586ve4fuEVv/CK/3a84m8LTDsTNtU0YnaA4BzNKJupyrM9unlsd9AEs4f8kt7pPmwNwPH2rxsIOFIpI9AD62a1ffVONYQrcLYNgAMv3RzTP7A3R3O+8ELNEDEzBie4xWThO0u1VDLQSNSg1mtTO5XGVsEqDnOFt1LN2bz/KQkQPn4i84jk0SjYYQPZ86lVJMIJ5jyYZPEPqZVqYOs6HYv1WvMzh4ZUV4DEyv8Ba3QfCvouv9pBxAbMxXgsZkVOAQlfAx4zNCBSzmx198NxjnkboICyi4iZgFFjdpq33F7EphSXP9idiZbkmHlYlgPFcsxmjvFN8PlnXJgG7Mc8qu90kRlV1XQZQ9wtD0NGdzYjkn+/+rlhu5m+3oCUt24990IZdp1bnEAgELDhPNd1T8nfG0NOSWjakIkf6W0AAw732YPeAKjVstrXA7OG43XZ8i1GHhlmVSCr7798dmFx5ZvFKpTdYFfeU1ubduQUTflj0hY26sPz/jbGUvt+sgdwggNWM9gtGHquAkgzQ2vJJHF4AYQ12+sAafCUwz0gYfg4AfkDoPU877PnmKX3IphYHIno4BHzDV9fu70SL0iTgetbhbdyVvn5YDnyPBU7jOtwug1hQOxN+Y2cyEWN8mJv/lVgxg6C75MEAVyaSMeQfMfVjLiGXCmzATrGspuZZLEa0EU4dsTRbs6dvYeLoW8JrEp+HgnxdscQwLlQibxqs2Zioul1WYEc7BSpIA9W3cEFWpNVTkb5xkfUnDpeY1BurAKf6K7aSuQ++h1SFml98UEcinzW0Np+//37nTBM41npAoAPDBVLWVilfeFa1qeeRIzTZNBg/Ww2kiE1yBQwMoLTOFzWGXyFObALPBBQCeuztP3MKZt6xxDTNzPF4noATWbc920DOIeiPquAJFRnaTApQ6LZ0cCxwTxf2jd1/nzBQDv6zCGXOhOHfXQX43e4Wq5EMnlrVgCL1oZOk8yaPSWFveUrwga6RF62xDUraNBvpFheBew4oiWJAe9BtP4nW3Q6u6s4o8DbVut4u+9+j9VAvQV0DB9ke3qx8wUuDIOJRTrgjxkv+lcAJjuz5pH8GXFYns9m7fLbRZa4YQ/G9vlBn0v3miJZAaa1PSCX4j0VDQasD1fiMaDVKKWF2PAC+ZLSeCRxVRd9wELyWEb2/TNbDdhpXR3RvzezmHH2sJ/0XUxYUjWCOGcGA+s5ZxC0Aa+yHygfCRSz3HLpHbGo4SUji/KhKSY151ZVZ7a1jNH38lPAuaOeafbotEHUuSFIQlv3GKSatS8DwMDzSDChJ3hZyXD5MuHfcPxQreHGriJh78XBc2k4Rbk8ccVKznOgDZ8PUE3gVA74Vtc9qBWfmd0JmUlJMX5nIC4VM5ZizX3s7wTl2Ax25LdsnLgI6MHliJpd5m2zbs/jdPAnH6t3kI+cclZONessM3+jr5xn9og6NiKjZ9m6j1YUqIL1DJIzAcWKITBTMd6GYxUQkjesCIja088YPjDhfz43eQDajd0M+jXYPbPBLtICH2jD+Y6RtItpBCgmvNUF8Fifu3LLpxxU577sVPlOV1hg4EzdHcmiWYxEZMm3bmxT8btmp7oTy8jE7UBYRSb1OZBEHGBwfsdDNipzI5VhwRNLRQgPns+PLpAblmTsupiTzPO28TMzAtP/pXPAmRYxAhkDYdZ5kRs458yoGDOk5LCsMi9gQwRRG7hK8WFP5Kh7r3Ml0SPFhU1oqxjXy9ZoBmERRU+I0y7CrNMUwM+8ovrUiGyJQhbAyo/ozzSLl3589JyeYuW6f2BFthc0n483VZ9R3RKO+JP99/jTT2/ZVlPRJweKkdI5VD4hfzt5djggosb9EpM7rBVwgKixH1CprT+niy1+WOd7b4zqUPlGF/N+/verinsqYgLECp/qOrSDDxxoTNoLGF5a/2mMcyISy6y7kUq2CxZnLlNOIEP269xXSx2md7H8IwZy55GAAzCq80VxD385aP/BMkvt2ZEgFrgpC8bu00T0ntC730fClnunOtEV/4/RGAqJ5lVAPbBrgduJ8VDqOZL2Fd9+BKUB68+PHCpJOMMuIFYTS1zxrhnVfThmRPbLgVDsVjHCFcBOYHrNi2bOUicrx2qcrrsHgBJ6QbhK8Qkg/OR4VYC2V4P+vAqz8T4nhVNdy2CyGVHNB0mrS3LRxNjCYcZPrBBW8/BF9S7v/iNDSY19l+sXXvELr/hvxyv+fyTyoKFtcuUVTPVBpSRBbzDdIAsOVTn+RObXAgxluCowTtj+WoFkEPazDaBnOZFXD52voMFiwGyJ6achY2ZASTnkxLZonVwACNxi5QqcUBtr6TJGJiK22uxwuqrkGPbAI8r+izkrlh3EmDngzwDqa9LjeGjea7hdgjOOWDwImD1A8+rckTa4I7AUgEXMZsWOnhnjYutw7lI7wWKP4iRYeQG2yE4sVtGwwA2yIMIY/JGR9fz8AhyegVuxiaqwpFbLlA9S1RQeiB64Zjpw2casdEq5fhzImUq8MhNrSAM6T9ANRKvTG+JbtZsDUHC+WjvVao0efI7sQbIbdsKYB9gfSGhwZb64pYz9K80Q1T5bj/kJu1lgidK77uIHAoYAMuAK/vgOBhkQw2Ce2GuRsVyF4Ueh4h7F/iHjkgFTOY4JyJjDvZPvoWBn709gDDE38iGDKbth3kHaFKjF/34GDlVgcz6XcX6QxUBGPgJCdHs1S0OVAQp0486RUQ08Wg6RAOb9W38jGT1kG5dsCoxa7RGBmKuZjh9gQpIJYEri6QkQeRUdcWQwDfBxioj9szYQmfq5w97rlVAgOAIarF1dlaDd1g/PbfgYtDE9mtPRjMAMw87FP9O5Sju25rtco7TZ6y03IMBkuorTtW9MxAB/yJh4+gn0tZfWtWDb+oy6BXxwQCkTqcBsuS1trASG1+D5BeS/eY9as8zAUmJrcwN4MVEI6OwBRxhpo3qnPdGyqrNZThuU1ATQz3q2LBNgnql7QD7F1IEI+H6QP+Lx35rFsXCALFhgLlcCAtowQ88MuKfazhn9ogayLyhI8hvbSqPd2fZthi2h6XsDVwU8XSDg0GYu7RLAKNNV767lR/xENY+4p5JeD+97TieDkaAJdZujupC5QXoN03kDIflZoOKi8bDJBFnG41gUkJQoyZzRBeG5b5Q8Wmmqh7+/laTrmsG1fQxANjP5Wcpt0TdnB6FmD7ZVBdNR/rkGFb+ZFAME5tr8PqJYO0mUW8DtJOe1ZkDFhtY/G9R1hkvyBLkoEQIc+zkGO3Ny9dBo3qn3v6dkfEY4Rg/V5d+//XTxjywJuUOGQG5AxbjXVpwKIyCYiRyJbKD9FJvMFhw3/UfZsWRqLbPcTHwOHecZLP9ueeSVayndB1xyZRaJmIpnic7Awrk/3UVa+NMGTNotxokOt0+deQEh+QaiAEEHjFB8FQu3LRg0MzTOUNDGeTx6AHSKuVh/Tyts7CrJgIXjs2LbIIN24ObeS4KXQ16s5C4o2/v95FFgq31w1qBm7XnTnuhd1j7BkJds6cKXPOQQR8r/FQumgCiCgF00tkSWpvoossvjM58GtP/srVhtI/FqKY4tmQyzC7iAjXXOstmRIPZAzRwhELaREQh1W5v9u7+q5MMiArkLhPm6ihfKx0KRy7Efr03ZD4AJd+VkJQ8TKPkqFQ+SAL8vfm8iWuIs4H2gXqaC9wC67mIsWpTfAwI2Bzx22w279CzVzRnR0sd86ZI+7Fjv4sDvIFzUwGsVU3d0UQwYeFexQPfEuaPstHHLjnFPNyNQskJbeRzcOlbg4PsDXhReXO/cLBB5OvC+w2W5kXD4IzYdTr+yJK0ZOQXge3fWMiovgqzs2eNzOStCZxVQJ90zcCdZzfBQbgALKCwmnm4oZGCelLV/38OQm3LZS7I8nfvi4Bd3zezxA+SGgHB+/ujAxSvH2SUfDgxfmHWOC3rYVytURDrJAXrHgIqtQc8yk/aKftx6D1Q8PXD2GO3K1/zVPFEznjwL3/H2oVEvBEnfxv/CrlEDPjB9YK2lImq9I/TvT4O6MAmaMvarDpmHFIfWHXqn/Pcpplg+hts/rwfTu/IFk1zS1ueaGXwxjz53pizff/b7rAKapau4hO7m+g6XYWFuAzTruzq+kPPgSLJBQBFKoHEItU5378X3A/ys9WM8vw+2lKnuLr3zHH3+utDfcvnM26aKgG6MsbadXCZdeTcfCADjjtOVtPqdV140paISRoC/VCE7rnGcAhiAGgsyl2LEDOABvnaBpWQ3w7FGxSUnLyTIv1XYKtA15X+0NyUZXQWn8Bu+jGRZPl2/PSCBuVsWckMfZaZ5RnWHCxFQsWZhXAPRBIh18HtJvZK4UN3A5/ylG+4m1JbPenShJ2fXASoAZbJTogjH4yndG4hMjMwmb41cWOMGi+HBooEtdoII1ggwbxy7itKOub6X4sovvAL4hVf8d+MVf1tgosr+YWeW/AdfPgceju1dNWuN1VyaBQN4/MCNknJSO+eDxQ8EZjlaJVvxeOKddzM1HZTaGnHJ6bODJ5IyANMWFzbf/WjLb0RU94Ge657YkgSZMNyjguQyzT+R+A0RGzGuDqytmDbbsf282NLlR68TNzgDOA5NY2u2N5OlkolUp0pX8WMgoop0SnqaeXTYilPT+Shh8zBMW/IJ+7AfVlTotqqYKeYNHW8dZlvROs6vMkZuCAd2BOYeqG6RLlgkK+eZEMhUCUmtzez/MzY3MDIl86H3UUzcANx+8L81d4oJ0BkEyXBTA56NvVxX5n9I3FxRgY8fluY3uW5s/NjeSXdVrXfLmhimWKoFNADAxmcHR2zbrplolXw7g+XgXipjZmpr3LkfszBwjGUlpkEgce/NCvwjOHIFhR6c13D7H5g9G6yCpB9k3DqZJ3dCgxbfTHCmoTSN7T0RlxyGnY67npVg0UyZiWrHtcfcjLuBAqTAQ1TXEaTXLTBy/Gx29qhid6DBiErQgeOsWFwqWbmr38G1VNi0w4StghTMMCFQcwOGd7N6vIrolXjsTcAsA5k/UMBtFXx9b6TOGh0XE94s7dgcYjXnY1YSTtBds8/AQMbxCfMzINXiAyMOc8PLsQjgCzsSWJRhqT2j9TMg/959/F+/yPC/2tHfg5IX1w5JoZhYQyFf8Nae/ovnSM5/yEwtqSmgBXw99w2w9onSfQvsSiDzgy49VyfU9+BQSACte3+vwCw0dQSiO2JL5hSPPU6tYj4fZY52fA04f6gg/LWwTvKHYyGSutfVAYk0aRGTCWdRXSRclxeA9yjNW3TAQZKD1l7rMW6CARXwlm1rXfM1el6M58At5/qx6APu+AMw6Z7n5DyaVFeFAPZb/vbKocIpekYI35sY5OqQ4bPI3+XCIYUkrGrIRVjp9g/9RHV/7vod7/cXeWKAE7Is1DDZxHp0Kmu/xI2UFMXM2cNSP3vQdPzHzIJ/8gpM+dIC1yQxYInPlrcqSRnOEzTjQNnPypt0Tp6MTMRo4g0EVAPAkHxbMeeQ3LWJgUh7aECTpMEilGNoz74lBdpdtaUX38/Dy4EuLO2SgAUThkyB8B2nRsvgPLOABtfHxiVixJPp3wZYXRuMZ8RhzgtFojEcQhIy2i4wriIAU/r8sJ+ozp7tdxcNiinqCVjt796nr06IHNZxNMQUTMMDyL6BLPJErSEwilyFT2RQcnjiU0lQcnaoGQdc15y/rnAFgBvsRPnRydNZx8Oim5FI3feIH/r7AK0QOwS8Y7tocHz2ua29mn0mM8e3KtryqsKtDO8Wy9OzpcdmHKJY5UYbWzmD+hv0Xn70/NsjSS7orb7tYZe5GMtfgB+/z7gT+Km1LHZx7XuC2v/CzqO5nhp8X4xpgFJwJOft0+HUv+Dwm6czPbC3BiGPmvX0sDUhaaKqNAO4s/4/ZSuHZk+F5r21yplxftDUuhI8ru76irGygToLg+Wln/gJSwHFWl+S2B4kHudQ8pKHSQsx8sHvcRKaLE7PQs1VqEJPge0EVa07+8qGpB6bibzjT64J2yF5FLAjpOZltb748c6J1XblzGygbWTY8cKSBBU06Poes3PLG9lF5qlzd1s0U/rbXPYiSKJunvLnxrqmZn0YtksOreSyHgLxmQNhNTNMa4qLIFiySw5g/npUTh27VEceDGtXaLjwwrAqFpG0QKIdCw2fAAtQFh1Xh+wDu5o4a8M122LnRsDwUiwBcKYvAGAGSoBk2YcUTRLX6mpS152rozbWRppTvSKhEQLoDoYBR8bofPRdHb++MG7N+ZJM2Qgj98SUpyvPDM0F3ulA5fSJU7iTLKEHJeT0hyhC3sZL/jyZ0w/H646ne2+5/LAXzYgt+BbpUUx6GEm97AS5287VvKtcBOIAdWX1bB35Q90T/341i/3Ifj2IA3Edtnjlk/YJkdr1nj/0790Snd8pt8oYGBzrrj/gv0YEbsmObnkYAGe+FVFR+ZfR8Qj3OHBjYFb3gBFfY1yiQgI2Ij96DvK21yNHBdjRVN3Mnzz7YKG4jsJV4eJ2VFdckWw/wnALCF+YDa4WcSlyUEbUjDHHn0hGcwM5RRqI0T50DcXAf5KOWlP5lNK1ZaczuNaJf07pRQD49yo5VO8YGwDe8oHVwTW3U04uk7Z8HttPEhFQe5bx0wHg+YfMRELP6Zu2sUikBiDukt8PXKHY1Kszfve6wOIQ4YXdjHCk/MdIb+LMtQs7WqdAFdexOw+MpWa1h90kR0QAWMIdZwP9jFMCiMf7x6Jizze6fuEVv/CK/3a84m+9WBgTgQpCKiEGHFa6gNcZrJf7Nz2045Jh3O4tRZWQ4TUGSFwQa4MOFbA8jrHyGMgpI6uD8h7RlbRreQeO/Tg22FqYiREDl9rg72Y1sW2Z85rQoG4FELD/obvMxIyq4CfQLBtnQKr5NePPlfF9Yw8Wg8ICC5UEFBvIAS/27iaLIxMl3+XuePWznA4mSHeZoIYMhDsyxChodi+6PdkTXSCLcbqVtt4FGlx3YHAalJmdgo0eaQyu6Y5qx6xM7uGAkgwKOhEFaIhuSQ5DFyvr/Q1YHRUFXG+QCFjffMCp28BZMbVZ6hqTXebp2jsAcNPRzGgWw3e5HJAspBxiszUu6tLDNLSajiXEFvOYp0ChQbOAGGNmWKEhzMMQYndkpirPZAFXy/ACC8UAMPalTpoJtx+a8xOwOCyETMDyBvzGfAHXypbPgBIfW79j41FRl+O4zWBDLdwydjaS0j/uuNbEBbJlSg4xxmggKZ/Pidq3L54rALOYmQ/5lNv9tNzHhM8CEM95HlnBm6FkTwoIDDMsnfcwYGwxhDV/LPA7g9Egs74kHUvfGbYw1JI/JJmABNzV5u0De5d05Gq2dgESXSgzCs285QRZ1GNCbJIMMDsSTqvsRo6WJg0AZh9IoGed7MFutohgsazPKJNBFiIZ/GcY3PUsKWeFPDIY3+QqR1ftyyVpQKBbeySOJn9pUNWMP15+bCcKojOMODKc9xHW5vpg4+1HkmBpeLZDUlkxREJIXHvhHmKCar6E7X18YDq89Y11/oz6+e7sZNigfR7vkIyBoeYqbDsD7eszr1hn7klOXPLnbKPmnvMiPOTuzjX/EvEVI+0PdOzyvhDXs4O3fC7/z3ZHVjAcQQbQyPb9lnYGrkuXOecLexPocnvD85Kf5lq9c7UE0Y7AbFkh9W0YNY+j2KgKlFufn1PM+3dyHKmJvkqTOhIm1maBi2bR+z7G3Xvijwr7dsILtB279aEja64F13JMQ+6BT33WpTk6WKvv/Ttc1w7EMElsJO7rZ/9dlp51XDC8kHEY0Rw+WxKpm8UFs7bvlw0gJIC39xkm32ywbMDmwX9GNssxOjF7+43/t+xuMFb5eHTep10t31zJfVr0NvDLke9KUtCgesmb8Jn4+3V25g4BCQJG3mQfr0fAX0G8WbZcYBcU0gGjpCrzQd6rxcQqmT2wjDByYFmQeIQXzKlLv8QU3vn6opVfCZNDhaAEdhWIZvRZ2j2DT1JK6t69QfZ8D2rPxKu07ONH25p7MF7dlYBmIuw+8ixa/1XDlRMAds9BtF4fa5bjGgdAeusFmw1ciuFeazar8u1k6FFG5NiqISGLPRUvm2E/Clrf4Sq7cdVc2ia3WReVaIO0hxu7MZje7052j5kZ3gJ65souxgxbh+2dU3st8Z7+5TsTAKSIsOf/14m679exiiUhnsCwfyOiaE0kCFUMFrlYdAlgXwsmUGob57w+mc537VmgwV8SyvSsOk/Popjvo0gwAthKmkfLkO8e9m7hKLY4Qd4lUKcYoafA4J5A/kSRArkm6Lgwsbr7u86FmyPmAZ2bXKfuEDUN8nfG7NlMGZxp60hYx5UTo4CgUrxwQCIquGpujAEFhPh69XduBEYl/Q/30fLgidMRL8P36QOzFS0WBzpXfm+cG7S1116+TjxO/RzOR/lmMskOzhIuUiELS5S4alWRfDG1yuQcETPFz8rHFBfxhyX39QB6Mhde8SBLQLZPwUxCuRLQefaw6mThmu5xf8FUcqEVngYWz5tANdjADsCduaHvxFvH/JbUP+3JmZcEL1D2AjbJn0UQdn/BhKA5GRzqZAjGRqaVeBTQgMTn65yltuHrxMvlj/Pa8JzISPwLE1uYwLsIJ+7YZcPTcGWRL7i/t59Z1GbljwHbG7mDoWLJ517WGPlEEnSH4Wd+KjaBYk9DzlqnC88CVsj3+JcZQSdPKPyr53IjGkuqjhH6mQd9pW1w4jdFMJ/OQlnEQnjqrAGpMQWRCz4dv8eC2+9/ub//iWuYiu9LONoJuXEkjR8kngPn4drCDow+4FmPJohZsnOBS90y71EEBlP3BUQ25d5M1N4+paRQR3BmYg3adsqych/dg3FYQ16oGXLELl55ZgNm1J6rPUJwFeC87y844u24nJ38n2MhkgUCGgFH+JFGHkqcvkjL1ygQQxM6LxiWijFv3fNloc46Htaab+o489uhIri5tezXKSAZTosimlwM+d2NgT0M0prmWoIz10m+ejXxJ0P4oT/mOmW0RGLAVHB8vOtB+5rg+1nKBzyrqxAI+dXtp9vqf7H3bUu22zqSCZBSlT3//6MTPfauJRKYh8SFa/u0o5/aFY6tiHNs12WVRPECJBKZI2JHAfCEDYFjwdILJohfFyamPYVtWsjNla+PK66Uwvwm1y+84hde8W/HK/4HNAmlxJNwe4DEwZAauT6ROtsZcLEtLssGLc+VgStgaC+ZBlLzc6ijn5rkTEhVBc8VCe+xeJZ4eCf1IrIo5pi9g6azpLYItKuC2v+h0/xhuVkiPcawR+qaRvDvgKtwIokCvmAzAvui0swCDdSjInwMN43vIvmWTfadOwRX6WymZ4qow5CGbrGwBYCxJX57gyIWfgJkAUVQpaNYipAdnUvNfBADDN1l5MwhGeQC9GxRSmJsXIAadCjwxMEph8eRTUB5IObfVEcU2+Lza+OI7hfXAn1ENl7yDi504hnapNmidwSAUiwJKZ3dO7SMEQWA73TR8DtF/FBGlmoC0aNDJt6RRTWcMimcmCbnfIsig7IanaWG1DZlgQGhi9+GoxYB97XRgUJS21whERx5SPYMY3LGg3vXxi8O+Hbsa0DisHAb1fWU4BxkwmR2lxKy2BGb6dbqBpwGXLHJlemnjELttj0VxP8s0YlgL49g7Ine2Jnco8GdXNXFtxJEYuoAhAm30e8rAy4NKSbysTdBAGkeZxZG+bN8b27dWZVGnlwz/FsmEkW9GhJMD01/SxnSJ5InrX1h7GSHsaOJwWfOse58Y6IYz5wsnk0Wk2ehSFNOKgBUdyD2RfhnFQa7sPuzJOY/f1ntLTFH8pDGrgKgYpQMaQY0z5igPIBxnOR9w6DGbJpK8hMBoAwLHDUH3Y1M1fy+GP264hxcKhWI8zOEzK4Kzu7am1MObFtIlQjZn5ezuOgzWs5BQoZE8LkK2UaMgxbTGnU2O0b69OnAqemdidaG1Pr98B0gwdXMPGnZA/qGgGag8e1hgNkTn2fQMWIPSwmeBJAPABFk7ZtbJGdMZHaCZ5ufO6BgR7Ee74XwzXi6KLEjoFsRBNFPMiRlJQyDDyDFVWDVWePFsEumYYwQ542Q/UowMAGRCQPN602Z9Jqf+u3RyZhrJ8gvhMUUC3aQKP75y8bAMOA1MzjNkHEhO2QXbnaZShdV0q4XoARMJhSIDqPtLPCzgA2Mkm6NGG0IUMSbs5OCf2CYl3SNiGLE+BLv3RGvRoevT2ieOU2JbHkgV6Q0a15jDLRWt2KJRgdoypyQY8xn6TD6I/2BrOd2scH4Dd4TOkXwQ6IPGpK/6HgahpZUEvmrkry8ypcI1T1EAEtE4HJBnfvbPpOHlIxSw3SNosEFNcDXho+4h+3dOaaGPjEzxnsHmYukUNpFnQOYU1dMgPLheLTBHAIM2YnxivNNMXLdaH/uBcFyRoLpZZBSeSRDsCiy7H+U6PyvXiyiaas1eJ4vZ7J2nOGHDLBE8k+r5pQmDFb40CKywRvIrSTcPw5jbsS51dsR/LOBIj2+kdKW7iQiJRmvyD1xvqrhOdayToJyH4fPpKaMcnh4jsHODTOqZSQxSETrrCk/SPzkH/ATEU5llJTX8AZClig6/+Q1sFviaDhWFh3Sx62kQSPWzsJpgPtbu1tIZdQ7on+twy5U9wOLSlxjlwyoKHxcQS8EdK8qiG8LnYZD6cPxBVTBV/KWISGNuAXRpSgwJwnApAuY6SfKcb2qQJgA71kMzz1q2idmSNVvWJ2BGb8PTEhTxL/FlYV5i3FX3VEsGUj1hNBCIhYZpwAAIABJREFUYJhXRcP+p0WHEee7xrugmoc7SZEphVrz6SAWUMroXekDQMXqjLGIaeDo/KsirrTMZaowfPhkcQXMl2SlwgUQsAyS6AdkEbFjLBYAmPsPp9+J4L2AtHKLR7PFXVuqvt6/3i1PawNzp2w5ChPKGNb40QDQ6xbtyTb0IeYhQhlzJ4lkxyK7NuARB1YHFw6vYbwwI57LYuFl7Oby9JwoWZ8oYKHjq+ktheh6RXHwq/0RAYh8vL9DlX4osGBt4LpkPmzQiPc/oJWHpBznGkmmZW6RhVton6sm3+fEEqE/0HP4VAKAucCzuGij9pJTYjWB7NvaV7u82tHqJAAl5RFfZVzCuUQMwtFvivL67NbmmjY1PEYpO90pY2URT7ZXHP9sF4gULKoOJ8mVRZ0+04bFmjwJLCF7+pqIM3gHRpN5J3/uMnY+qSrVm34qxrtaxf+WRl3x+yzmnR53bRmQ48G8Jbv7pFSHRLzwu5Xeo9p42QUD7T46vrC94OM3vpf11Lvg3sk8Biv3NCALfRkzC/pcIjn1nQi+YWivUa0YJgtcIwrozKUW0iyiOy3o6c0Ytrt5+U/BQHazUU4viSOPs7jxAX3Dy77D9Quv+IVX/Nvxir89xby6TMYBisYE0utISu5OWIDofDoTpREANwchBzkn1BMt+Zzgwp+PjzO0dnLoTnEzzxesUq2XhjSEG1g8pqG1EARQHkYLmWxE51IcGA/oP3SZlNybmtTLfjQWokfy6sqEPiZYedlsK+YcgJKwygBuOqqd3oT/JiFVN2LDtYgePQ4Rc8N2gThZaz7Y6g/fbI0EK6HxQsgCCqDYPc3x4qAA2p9HP+AWzDi/oVH4yW4n+AMD2/NlP1C92a4bf0l1QkFZNeYmGoUF3vOSlgPYol1YrAP7SEi1C1EjQJCiYwFwu+D6Ag9eO75PIGknq9kBi4U6nB0g3+miYa+GHMgBNKkjIbRZTKoORnvcGNR6rQHOdUPrWAMTbg8AFlaTLRfqKlA80GAXeRlpHnIeAItR8DB/IyudRx27eqCRJJWHltUhOOcnZgBJZAsCL8k10KwS28BdhZCFDP50TwYZgpJzHNOxql23W2pzJolY+LkBNK31fpbyT+sgbRgL09vPAKz58lsBqGJtbsDxV/j//lDzFzzwhpEtLa5VWMuAgUOkAVpmMdExcBOUFcB2Mo5+xGFNUGXvjSmK5RNzTPgOmUSbh74xfaayoA0gvOsO8CdZt9muLIj9SuBC9lFJfyAPXQsT3ieYjr1uNRiW3+nKgzTb8kvSwCg9CETiHMDACLmvJTyTuJ/K8VwxVm5vwF+B3QnKCmVvKu2M4GpanJszNiUEGzL3I0lT8YEU+F66MO2GQOq8cATzcQOQ8IwZSsaQErTV0KqGdE9oBxk7SBs5d6/YjyMwNINFEZmSItGZEu9cgkELoDsZYi4Uyy8BrEw+qqAZ4NS4gs1rJBQIZZU4jhUKsKiqA0k8ceXuknuRwghKuIeXQgaq8fOC8s0AKmeHlpTMCapslOxRAha6sZguRWB9xjGR0BQiwW4TQKLTIDr9SlbnBdvcU5vhOVAymOEVA6BAkoXeq77DtURhw7BTlkvyXGW3ZMYiT8nD8HKX8jTw1N0VzmUIk9DHo6tdafjcJIEIRzzOj1ouzRrfso4uTy9T4NS5d/EjoV+tP5/yX+bQkXElCTQ6aGaac5fbt2BDi3hhV/vHTItu46TIOZB7hgnlmUQ1ui4i3ss9SqxYeibN/tR9kYnofpzFSXBI4+eL684zltMCAquAFUkSC0QAMAEdNL0PP74Hi90nsgk4CM/jMeP33TB0MGBdWZToeMyChdUxR+6NnPPZLaugJnneU6YdaQrvYoxnArxLchVwBwhKGEcg2GOVZwaQ8acXe5yvKTXfcx9UPP/JR+MfvDzmXRnQn7JlkQS2qbMD0hKNkrmJslDLaRLzVtDsTwCe5LVDpmmXxNBdWJsn+C4Z5/GrVXRN5hkEy14YYwSbMxjimoQwK8Ic55wBozvHAUBlQubgiRleZiTjWOSOqbJg4Z0RNwbQrP00FY64ZmUH1z4oMDqOLgGDWEa1nY8Vr0cWKK7iMX8iwHWegVs9mtd7f5h+oeOhzv+yDj5d4XoxNxIHNv+2QkPyKEiDZu03CkCj60tMKn9dilDwOHMZw2sexJ/sWC9w3GAj4uUSN+F3VADfo1jja7xwXgTKvyJEZPy0A2gZ5QFkeL0fj//4Vd7M+IiC9BdpXH6CIAsS+3Eykr065RzTb7zAvb1yLzhg3JMN2mzrfB8+CyR68PR6zvNq7xp/dcUdnUV5Yi6lt55UXDTi/mKujo2U4PKUjUQTA5cFmJ7nXCl5BFAFoR8yHH+4Y0aOkl4cHnYI/I2FMR1uDs2uInTHqfpTcRcL2EFqiPx1GN7m2ks2c0891o8mUDd5Tjiw07tPlCbn4ONkHuPasj8aHScGhU8E0eEH4MCSmwoegyB9qr58FdN04lhuSI/vVOxYknsdRy+BxbYH7DjBhfFcF9wDy9ke78kqD9mCOsMtZGLXdoy6mThjx42zI+ifvqwoLVn05MWwLnN50jz4HxkLKjxAXxvesVWQGtR3ndU7iEEA4LjAmDo+zigj7KHk48iOi36JHF+r2xQhHuYj4gpccKMPZHaSqjrGetW/u1O+Kwm/S0hi2gDuwN1UgZVSqPJV6jP0aDvjQMSE4bqcCjx+zCOwW3+m14rsGme1UUTQuRvDSGm0XEPZAQKwUGfCWGz6OHKcJFjEfiHEikQeiJb7D0Qm0kPKRHDlfhiGRi4TS3OsEN253Tc+/eqcDQPpsZ44J2XSuvA4SukmVXImpTlFYbhr/1xoHJbzIzsxY58fsb6NBWTmiAgCgdDyEYrHqSjzna5feMUvvOLfjlf87YoTD4PFSkJiIhwHMICSgGvDSK/HnBBcO9hv8f1hLXOA4/nzYnIRn+WxbPwcqQZOFRuWwTqeGuIhCKPPrpbnc1TK4gTKNUCPjYfLbkzc0f0wHdgxGT5CK3Gr4w7mg4jjEQYSKVO1tY0+uZ1n5xL/7iPWFXgMJvFg6/kdf6OLd4oyM85F4Q4Ywf3XUXSo8YziRB+6+cesNFWzrW37hsmMariB55qDIWUwJTJoD3aOrd1+UiIR6DkgDDKYQPGW1DtAU7B59iy429sE8PfJIFKSevzug6y8S8g5kLGah1RL5DnIHNl/mV3f4zLRI0CyBtOQ45pfI8ugW/cBgK2adgBuAEAd3zwMFtIYOifTziRJBB5byFkYznuJjwpZN6+ENQ/1bRtYEzcGN6o4uNU3oDt0fClvYkY/J3ODmkPC+LwMb4HabLePkiMQSeZQH8TLN6wq9I4OTsIcWaUKpxqycwB4mGWR0v1YH9QBV0gW5pHrhvcVwyfNuEog0N0xk3GyACgLS75RIOxMHzM4ZPB+8+D33JuiiLzsD7KvosNwRxAHGYDdmPqDXhXIrq4EblFA7s9X7jtwFMu8wAe7gND+VnlxvrhXMreHQVeDTleBtV0YXkcx7jtcCbzVce0KNwsd40jsgDdpJoDdEOFziel5+OIvBcycA7kSvxDynwoamjtw+8mSPtfWAYYXEYKfcy2Dh/ypBvuTp20EWNo7hULpexhFQzN2lPqKnU6kOkJfI4qdhyUHW+D5FK/oNl3DMMMUVJx7rh5tn+4NjuBYR0CfaVyj0WbuvY8LBHPOatnn2s4uVIV6Jo1tEu94Yo+fWJqsY37m7TRrz/Hj0X6Mc8g55l05Gtjmftr72TTFkmToxv1uwUchCUcCW8PRX5vW+20Jvbp1kddmJds5ZhLjmTHOls3C8yvkzAQQaxm6f/oatiNG4nWlPgpGgUTs0MlxiIQGLQHDZqRgXBe5gC39ff5wzE/gJ79FM+VMtGP/jZ1YIkaQYFp5FS/OuCX/75wqUoD5sDhPNrDDO0J3gFfu+LCWA93oZ81ODoVW8paJ8UsQPoo8x7ykSV/1TOeufXo3TXsHKhJQUBEYKFlKCSUa8WoQC86zXFzwgHE6l3J2e4VnJoCZjNTxe3e+A7BttYY89gqLMfRjPvf4vq+TGNYw2wVEdsSw/J077vM1EGcZi1YiwGU9H0wSMFdYAOlijikpw5zA4gzWZoCFO4HaWd6Ls3wiv8flkoz2HffaBdqUQktJNghzEAGC8BEFPL/IYI1x5Z7SnpoA5+hbjOcO9fSKGUiGuOV+L6M2u4zduReHf4IFo9QcZChxXK+oT6h+AvPQ2S9Z8Jif86rz8ePA/J8jlNix17Pg/B8Gr6SdtWLH2QqZOOHt7thnXiKQjnHQoJ1EscjRZ4uIEyxzdlZ5xI2519O7LP6u9DtwSzNu3v8QFtPMMycxslEV2BuIpKuBhFgXc/cAfe5ZkoJXkJGWfsCiwwhogDd9Vl2vimUgesSJMZfwSel6dzxqMHka1BEAtkte3Z2gA+vVPEPX0Dc/he9wVaQUcUNJrR85sWNDwk+oZN0CDE4w7vMveePAS7sDqYkE/Nq1d8X970o9KQXVec6IGIFjnYxlZ+4Se5pH58NTRR9HF63iEQ9/QUXka9t41qan3c53arCZ3m4jztk+19gwwc//XGAeYkD6JCq6w0Lt9xg03rfFuGUXKbeSBvayu7Z0XHyFlGyqIET+B3qQTLmQftZIX23gwALYaStRALfwptlGiwaXkJ+qH+d6+Yg7+FIpMFNA0iqJlPzxa/c7lHhPJD/4+xkbeEgoV50vPcB+jo8I5ZToEylIHz33lJ87ctN6m98HDE8PzTP3BTIWy0Jr42vZffFSqbyItfqI8WLNrQMTPEnHGnFL5v0ZMypOnITnZJGXhyId9DIWMDEko5an4oh8P99dkB0kXqDxvLDwVRp7AyYYY2AN5omQEFi09MqMNY0BLcZMEodexBjNQqI35vlo/3WH8qw/ZL/owf4V+0bGLXp87lOluFIREe7NzKs6AkglqYwzGka9aNGXUmPCPcnMMGxClcWGHuxdMYqKYQXhKWWyt/Zzi09K9EWsFg/b+1e+G6A6KZh/h8+m/tGx/+BzfkaxVoR7bs47EzYYiKWKC2Nv80/uT+khtQmgf6frF16BX3jFvxyv+PsCU1TXmzCYSdCoB1C689XNAtFJEkDxcMBmApVknXzNWSw66gzXX8xHg0vosFbA2/JQnlqpDkAnUrs3F8rMjR70MnFJjceYKGoM5CQ21ANABgDzF36UTAcqWBPEhjgW7OFmtaIN1+F4Qo/7XsCIsTurin4Y8QL899dYDarIIhP4AHSI9MfR7pQ14TvRkFKQ+ixFAw0mMUCyq0K+BZjpq3KA6JMnbVUnuRhSwpDsRzHDwIKnfEMygYMdamJw/Mk2Q0glnllpzbHMYCFlOu74GwA1VlNsLN81k2xW1EVTMgVRX3cMW5DsYNoPEMws88Gnlk397G90eRgiZvErC0jJoAN4SOZTaozKAAN/AdfcAHggZQCukogQX32CakoptBUMD4CBFfVTpTYQPyRF3Gd7BIcu5zYL9o9ioLVfKynPOaHKrigHIIZHXjWhszOwkSj2xwDAlTI/DgCrOgftjn1nT4ydf9MqXinmhL3gIWewJgEIALVJApTeY3KudSAqBNfqNZEyD7luRNqgMkO7GYe0iEDGqHepOuERzq71gwDkoOQFD8Q+9EkNAmDGeSyC7OJ7jY9il+o2jP2BvQHXMHj3L2iytjW8F/iy+U+xKuwucVz5WfFjQxasQhuD4wsiDA7NDIOhQQF5uZ+nbNSAFPjwfS7KooqkSax0QBFa+o8AEgX9lFzwSN5VJVZaeBAgDlnJzsoI+pIVrizAYvhhpDlR8ihxVyHaEp9pcCf7ZuaYQjCFusdcc+9rWHTj8g6Stia7hUm/by8jyhuzArlPV4g5XtcoWRtXhdVn0e/iEYGme6QLdDbzm9d7t1p1QfqCSSZCcW5tBar7FCUBlfIIDkrQcDQfevW4AwGoyHF2TLkhNoKh9oUx6K4ill6FwI6v60p2oMJshQ6y0YQTiG4LwAcwAqAjMBDm3REL7OPFkW2UsUMGjt0hcK/Z3ZUxPkueSg6mGVau9wARqR89Yw0tvEI/+cf4I0b6d9yHQeo/faW8W0pHpzZ8A2SU6xTk+EX3iFzlDej+HCSTvBQWidQW4B5ch91occadx/3U/tnSwm4b1/wNjgazNgxLV8ypgezQsEioljuJCQ74MMwd+69kp6tX12kCc1VAcof4B14jgOsgbWCgwGX4gNuEucD0D+Cm9IKNVfGZBbitaIBd3aAg4y3Z9XrEvTofpGStZDc6BNgfSMAwE6ban6PdOIHGlFNNYtOzv1CgswMTg2DLAZiukNN9QraOLLyIt70Z3I9tVCe0p5cLUKQwByxYxRHUggzNGLfd+UBhE5ELmBmGr+pu3ymNbRwld/pSzZEJ3yb4AC1w/rtcM2K4zKbbK6lBK0Mnkppm5tLZ0sZCKiVIgF+UkG65wGRrF5DklNogOD2RxJIEO04pPnfHTcSbOY4Dey6kegCLjZyL+0ry0QqWbM7D8EWIyXjhgezPINYoXumpZgmO9R4hvstfJoG0NTZ05178ARsJtUWuqqOArrmjaycKoxkPryRKDUCfGSA4oojd3qTsGAnQw0GlB+CngmrnY0zrpCfu4u9SFUPxGoy+TbiGXvKCDybsWH/W3jV9QFTw4Kpi2PLuMP/zAu/zfFfSrOXq3HeHhdfvMMAj95u5F47/gqfsHnYROTkPnHtAyXcNrChAUSmEMc0YPR+/07U1feEyLkfIKAHwJpdl7sEcP7otDgmvyst2A05cuCkhE/N2nABPFzcKUJJWNNhiGJZESf7c5Q4L2rUNynvRED06rcaEFK6htUhMUioJVagcSAY6sII9Tdm92GOlOyRyWxzPj8IhZA48O9DlLJZiHuoIVv63EEBHEuk4H3+Mgbk5LpdPEjTcMbeHXNjA2X0CSc+0IDTLrjRmmFYnZ8ZilEaj95yr43mo+jAH46YNqbmeLPAxRsX7stpPi6XfD+5ncTumzIO5R61WeAkictNceH/5LM/8EXvBbt8N3Bg7iCgz4to1IbEvzt1S+FJESykvyu9w1ZlTQDefd+qqHNlCutDdC8afmBUY87wOHGpkIVeqwA/sltSNPa/9Tlg0Eue45+e4LLiyqKg+kbT2Kgi6VIzEruogVpRMPN46RzEUGMCMdbguejixgaFz9yECqEC2lL/4loGEL1TCw1wGhpEIvYccVhkJ3g88yrHxLRhB+ByOJgZkrqY4LA8UK/xUSGgVsFOEH+17VFdBdh8Idu3trrw3DmwSUBgP8DNu8pNFIOGH5ZCyTEjpfnfHE+P3sScJxgDgAxp+XTpm7Jse3RM5BLuK0g4HxgqfV0B94E5MqQgC9X8QUSzbRRAQCCbYFWxGIkmRkFIyFHfNq+9z/cIrfuEV/2684m8LTOYTKou1vkgyOCgt37HF3tgeOcEbH5fSA/2T/Eu2W0dgOzyIMiE/x8PhhTsM2xjwfcTL5qRy6RYuN25SZ9eO6nvBqKtyTJaq9XaHhmXefx2kWh0PEJREWOmNmlZgdjnNW90ZrIwx4FBotkRMwFaC+hyzZIIIBHNxYvHSNniu7gDKXxVoEIuYrZMAQMkMOOVFWJdlsSCfpcJS8zLeRi4gAbI1UzC5WDza4Zyyg3l/W1oaQNyLjaem0VF0x4I7CkuHLF8McnwW//PLWIWOR6l5dTlHaOcBXIegVwAhAMYLGBksbxYOPGodydjQb9YaC2FRrAo4ki2OfU0XPDGE2SacnkIAGnyTNrBWHIm9jwiNuMG7+1tVnkd3yEAgD46ngrotXEcA12fKpolzraYsHAAkq3nPXaATdkiteHt0GYCPoF6MrZXd7JJSwillXlfrpj6xyQYTB60jyg8YtW5HJWPcJFMr37OQuvnHWIy0+P4pwWQYnjIIzc7yHngkywBo9qkpgUp/sQilAsBautArceguRi12V3xdwMTSk5311LrI9Z0/yzUqZRB8djNVElSFJK/v82iMAhSkW26Fh8s7U72NIi/jjHFHBfTf5arzAgNmjt9SXiRNE9DK0AACCMugjeynD+d/ofYcMnUl2LuWsJ+Ag+WONA8HeDZlQn1eycamOXEXAeOXoIsJ/cDBgJXUtvdifPLLL+4V3nOpJToWFowNJjIBEZ5FtYbIM+V+EF+7W/+e/Gye0znNxhD82Oe8CtAGcZZ534tZnLH5s8UWz7PPApThJyXA7AImAA5IBCz0ylxYtmC24W7wMaqzMWOSvZxt6jEWRl0EmqU/efbm/ZBBCmGxHnWeIbTztVvhZSGfJD3SDH4Er4YRA5vvbDrZqkzE2v9vC8f0cgKrqoIHAQoSi4+k9A8834i9aoi4JWM/gPslpIrij5APxtgggbNNSV+w+yUD25xFI9h5UDol7ZDm7fNHcMV5t6ZUDHpEctWJY9LgXnnRqcJxAQ4sbf377HB11XppZos+SHL4u+woZmAARpkrdcFX7INDgI/qWmJmf655sYmhQZJyw1rZ5RvJojhe2nHRVVRe7TM65hFjPurLuztGxlPZnRJFtPx+Mr1HUoUzQXLu++R29L1emDV+Jh1v+CFF5iFJpAwW3ubI23NL+ikJxhSY7TjfGyiwN5+QSIzzTsc4TpWfzpehkHWFWXzH+ztiWMQzMm5y3MnfECtW83e6WEwJ35EAAVQMO7orRNg1k/Pe3XHtUXsNSWSZk/XnJugF35AoCCcJ67KNr0jaDQ8QXTta8lyosRz7vVuH9zwh/lV/vwvNAcpBO0YSg0RXwpUdRiIsYDoApaS1u4eBC8qXDSB4W56WJWGG8ujKk5s/Sx/Z4ZQRIejWjOWxpYhSSWLT7QU+LJcCimumyK79SGQglQP3sa5ghH34fvodiAjtdUJVYGEcnfaMH0Ywc7EM0947zRJcy7jM4UhfW0mpJbyvnp+lcngj/JvPmPQ1iGcFbw2OB+YG1wWVkLov+RaBz85K3C/gALL4M/hWl8fZkwCKJVBpHeMKnsqTytfFBc/AsSvGl+M5L3dY+obERVAmfbH6d6K3FsC7qsszPeJ1er6gcvjczeJs2VZgdcqv3bvXhTvwJetNls00fZ0U6klgiNgCAL2yk8jHkYkBimIzi1UdPyfoWSXuzh2EzOWMFzO8znNLLIsDlN8ugrUgpGsXZV0rqcJbzAjvDgyTAYvYoDo6QcnJxERcBaJ69G10Hkeftyh6Y9VeevpaVOyeZu47JGkdjP+qiP/Xok9KqPEDPvly9sK8BBjADrkzFykpJJkRJ0sSLvm5KYdoCgx//vK3/unrzOP5z1b+4Dv3N8P3cRTAV8Z7QOTcjo81CstBlX9Q7yPJoAD3v4Q/Uthte8vg39vqrMu8eCtKCQZ+ozvt8g8Bp3+k7OguD68v2XrkWEAn2SEBqy29rLYBJyEJvjCEspg5I3V7/X53TXqdOfS8Oc7qn88SsOCc66jOjqhlD+lOhOQH1C17JlxRiPBROEpvf+w223tD9QUbVjEIx5/3Wz7NTnHQj/QDjDOde8CCjZSEZu7EfaHVC7LATm/ByJcm6vlJsJY6c4FD9So748A5KbG2tmXs43C8k8qHvPA1vlcM+AuvAH7hFf9uvOJvkQwFi0xlDhZRm5w8MxeopYxCfMkEWbRYAHYkNylpkQMEcGMYuMLccsGdhsNb7lhkK/SxQYPgvK+DLZSgAZwdL8s3QddI/LOql51OOlAVSDtCO48OK1bo+/etYuwIBA7AQhzw0fIbqdv4CAM381cl5CYhb8Vhi8N11+cKDJRacayRgIwzIRNQCiZOpx2Mveye8iwKBXggoZk/r67OKkYxY5KNMQV4SUja7Aef4LCnJMpwcnxUFM/hezCE0l9vh7VdtQByUu8+w6ADxczwCiw6Ybz26nmV7FwHnlwgw6EPT1QPZtnrluquUJnRht7BkJZ2/Pe5DNyIjtJfbfgnqJI61KuYb/m7Ca4lK7zHTI1JoiNNDylJ4O541JFkrO4kOssELKxyLFd93RNU0sHCMIDLFU+yRyuwuYpdBHnxHQyvtYaQxlRVYOf899bUnygjydtn4Vg7NrM9qL0tEXz8pcBxmK+OfZXEiOuRCIf+8zAN42ialBcokx5huZGLwLAqubHBtba9fTPE7c2g1AGIPs2cQEv0pZSSDi1t1mEdSCT7ODrDwXxfAE+jQX/ba6UAm3epEtX0CiGoOGIOjCxjCndmzg/FroQLwRS/8IrozjBwrdzDMuAU+DdbVy4XzGk+qCJ40uDcveZ1d0F6BadAJxqvYcWqS9kgBbA9fTFGzcsRAKlbH6Mqhv2THwpcMTwD6onspuiA+aeB/Kl1Y4ti4wcggFmzokd6v4hhx7y09aq5ngC2yWclN1NmyFAJvgo13CxGCyB6ATu90Pg7X/4AsUcvcdw7mVFa+01KmLlSYoljJSjZhHgP6lLxhDjHwHHIcLpjIn3IeBZzaQUjVbSY3uIP5TfNsPET4GIGHys8+4As3zuAEQEhCx89R0aAj7UXHwWH7H6WA0xyaaJEEj+YG4RUhzgQTLQMUh8hS5B7+F1MI5cNFAv++3TcKviMGuOv8sKI/XQFI/qRRQmpiMwAwZYBiIf5qb3NaRHB9mB/isDME19GnoXDpIBc9xsqDOwz7jOx6oK2AHFFpJMzMaQ8lsoqMkOeGNu89a6HYnuGae3hZHtGnJH5iISZNe8lPfrIGJQyVgeAsZ/qxjJTJg8BevCTJjRkFoCFlUbisuOPOS7L85aAVxd2ci2C4wctqRHHU7BlzuWUcilWI/rsBRBKBTsMeOdBuErixgOIY0yBBgjBK+Qi1AtouUCpIziAbQEEtCdrnYNA6fCbGDY6tu+Jkv/s9fBSINvpqBYncF/9ZgUlR/hKfwP/K2Hin74WJNQR+C6GkMm73TECyFbRKswiEr5n5BoDMrI4LxetPS2ztLcC0DzINgHGMecOeQ7t7+0h5ROa+ziw8SPZjXh10h976lTQlQ5rAAAgAElEQVTlfHeypjVArOxuGMPhkfzv8YNndsYpSg+wlFiCUo7c3WGxjxvm4Rk6MKIzyQpU41kbmGUYTgtcB9Kna4UEHeG/GeCXV7ydBuHMK7O7f1Zh9PS5PM+KVWDmC3Bg4rMIR2TP8kcnMoZUXB7xsCrw7APsbkccvldhwS9IfowblZKbwueuEDYAUjukvuCAxX5d+TAol6hwmD4IzAiX3TGmLb+TkszOSgQAytzg/j5nFRDnFXqNqCxKT7uWnJ0fHTQrK580Q+C/xpyr/VFIdBzHX1nYEFEWpZzzqIy3fZd3WOW40e3KfGPiGRkD9L7oJzks7mFM5jTbq8eMn/MflAlVjKAXJuAv4onYUBV2QAZC73NCn5BMTa+XOSv3MF9QzU7ctz/Qe0ZcWwmeiwgQHk/DtHCCyxTdXZgyrYb0wNjKGNEPbEjR58QFwzR6SPceYABy3k8IJrYZMHiGDf0IUrPDRKCR0+wC+p5gsIfCTjxP+kNvbTP4PV/Heg9Jc2+ZTas7RiSaDpWbZH0RDHGkKkWmaEtX5d/PAH6r7Szmiocyzje5Ut6tQekkc2xgR/FAHzyg3O3H/og1Y0AU9ShQx24jxjQOG5RqVFUsGbDo3NYodD5jNuArTS6yIA6o/VYdhFvB2KnCTGJ6aZ8Boe+PHDmJofEsyAupmoOIya/rI48CjJ2+c0pTewHcX4Vn6GsyTkNL4C3RQ9ZxYIYPYWJ77uz24L9bgoJ4xFqOrtbfee63Bwo8fFDtPsijq7yZzNujr3NdxvQscBAPIenA2cXloFKu21EUEI6LGIhzB/YBxq2XEycl6PxUDLIjGlUbFQNkYRVeXAZi/qIxriiFqyc6n0kcybOeuzz3nBWh5sLlgx+O/RdsYh252ne5fuEVv/CKGsJ/KV7xtwUmzzqeIxZAmtB1ZZ9eKE39EREsCCQYZTGyldCKgHajhyydpKamx+/4DgNVYI/Wfe+2tT5s+Dm98DieDF6ymp6nTraL8nkmVJQvIBkJDozSiYwCk1+dUGdHx+6t/nbF5Z3QA8C+kmGQG3QuSC4El9ZGbTYCAKeclnsD4mJahyZNNONwinFwST1fx5bQcRaB3ClTYkhJC8MsxqRCogPJg/sKqAwWFAFoHkxiOZrU20SynGLjhyD1ksW7sy2ldSgpgxq3TFjzM7ccwZpMtHlmPmezzeBXsZRECeSrk5ElIuE3FZ9lrLqe3gbf5Zph0Jcs4jQQ56X1/xmbdDfb6bmkx/qKMTXFsGTvKDT0t7MQ5a61cZ9nQoFea8IjIRZvm7cd4BbZApEE7AdLUl882QBk3zG4jKKrdyeUKnCtyeBkUEqA8z8CVptltIoK5h2yyGLQ2i8y0fk70MjK+Hy6MflxB/IwZgTFf9c0sWdw5nDqooaUyTCvtV2a0uh17VHV50XpBhu5uXJfq45L9TdPDI6vxut07psApu7qENvm2DrgbnVgDNUurCqgu+VM+f66gGlwZCfjFgZm0/bbPVh4pCgYmm/ZGDnvRPGVQEnsH/z975MEAWBgdHDCqgAZAIwDELuB8BYsGVMnQAywHTnb/iuxxMRAEB5kYafcYgCwFodsFvxT3z3nVwfqTE6zoN5FdjvACS+2/bVmrfc9fovkCwgFq95L/ap1I+MD66ciO9x4lgdhwkOO6s4kwyd2Aln2KuC6AA/vM+jeNDhOtvsTyWIGKdMngTYAIjR75QPwby4l3yXZc5pIYJzXU1p+xIQyoi5EdwRM9PrspwHlGHzb7KzbQJqQ+8QTY1zebDa7i1eNrDd3IKSQdEmA/DyEc7vNgOsUehPXYkrn6xagYhs1x4zCQSYJ6g4JJtoWkC0L4MrYBIDZH/gul8iAuGNpBPQRl50xitvFDgykJDAC4OG82VvRfjoRrCvoX+BOv8xYS6nXTcmsLLYbtsa8iDk7kvgkwBgoIF6tz8hy8jyZx/H7iu4UUWPcAcfb+2SWjUps3R3Qjb0N0yXDQYiEhJZrSRdAXofErJUvyghwXXR1EuzUnue/t052eRFoAw6GSZjySBwg3cU8TAtU0MjWNUhUDhA0Prsi4jNduFtONyD2h4obCpDmp1rFKPEspvAyLKShL305Y42LwyQVCbzGzWEVP/QbaiCluuUPaWkXqcJhWR48D2SkzrthRwFK3WBu2FBc30wmmfPMOqmPa6YmPBBdP8mozF6LJg4xbu6RS/DzJB41EFroQM3Fy9a7X8zxcwFrF9CR1QsT7y5BmcjOKIlEV/WCpCSLjJqidwBRYn1/w3hW6GAOZHth+Oz9fwKr2OgpWT4q98yz0x3QxY4QAQ4AlPu6AzRxj2dIouPwiZ0bu5BLS8JOkosc8mh/ZtxYYvviWufqDv9Z5iqc/y+8SJSChC9F5ikc3UsUroP+O3tBbq7RLMC5L0h0NolSplmHYmyJ89WpHiEh65bFbaf3klQxKADFkYQh7lGXsvudgN7VXaZKIHUsYKcUkzToV4xcHZ0nfpPLg7iQTN1k1g8DC4TuMZe1CAUshloVhehvdxSYQOAm5bTcN7EEAzJuAZ7az4dNiCd5rnO0SvMzFhOpfNsPgthNpDa+nvmu1fwloeAduvk4QEPIKlJiLkB2A2fcsrsmIpGveIK7DjNFdvjknGf3xxVzrPGfufj3ULgL4hzJPHPB0pci45sxeF5JSELlfhGFTeZpeY5bydXlXHcYdsj2bN8lH2q7iRTJwFafWL6gQ6HFah919pxSdDvjtr3hB9bV/n7EMgQoQoUESM/nC/UUuQAY3OihUTKTmUOuxkUUgte46h4YJ+6/Be3+ty+tMyEA4MPPUVImXyawDXqUYeGKEYCuRTcngMLzmL9m3hAxnkrFfRBr1ZYByAoPu8AWRgK3Qhnm9Bmq+M8ENkjcIOk9crDawfs5gNGqRMYCGbGCAJy112LOGcONyxXYrMuYx5mRsZ6P8t2z6PYnnlAoMLqAoxULrAEqG6FzOPrEx/0CsDiDLyQeMYAAldPL7LxEu1tyH93cL8/YaiAJQ+x6WG/xtke3syhJLxpWFAnIbzxRLASAzqGzX2zZLrwCrph5riMLGQvAHeOuJeulyKLyjfRfVzc8IX+tKwhp7mXpQpzXKkbk/jbKMuHbXL/wil94xb8cr/jbAlNq9r6EXj8tffDC5xMbi3bVbEmwIxEHL4ApkQQ5CmQAHHPxoZ7RCSS/z0HaESiMpxr08MxcikdSZVJAcso1fG6HjS5qZaKaki2iAx9bIUaWhdkdraEcyBsGX6nHPHBFNfjPOCwuLGTrKNyLbbKD5T+eE3ptD6gOsATXTsC6JfNMWHkWAKkXuibg8bNLHJ+xMSdzj+wfVqbhd2k35jMv6Y6PuQQAQfPLDDAW+54wOtyiMG+/LN5fTL4AslvK4dgMu58vDtnQMXdKf6TUm/qs5JZ7Uizz6opYIXeC4/rJfDc2Mwe1KlUBXWQ40dA4nn8gEt5vdqiAxYDn4J7KUThSxCYqxyyvXCH08kVCKkXqkJAoWL2qp7hbS3ODmUBvwoo68FOKh23S3Z5d9+dM0jQM9fKaC3UIAJQ3eY4dpQyA4/4UwKPJdjPo81U/S21uAa5ge7EmBIHgCh3f11qVzKj0BpeXS3oJMWCSfQc4QKavqJYcH3yV/rxtx4d0gkeW5mLw6wBkY3krS0MQyU52gSlmBd/c64YqxK4a/3y/w5MhwJPX3bFMeTiAe8EY1FA2dey9YZsHGzuREnTLBBSwxysoLykaFUxjwPiMVxcz+YBYQ4AAh9x6b7+D5WJy4QlGkrtRB9cMn+h24vnNpCfdhbIJGXDVDD4Kz8BxeGcQ3wHJxqpzJHMbcYNl4RAkUPDvBVAG1L4GEBRDfIf7aq9BdZ6ZQM7XKKgHQDdAMECk5SdGFF7r9Ezj0mDJUO46ky6lPjGAa+ecfcFDn35sYGkavjJoGraqCLy3l7xoBuyQBQmd4ZHdCfE/agdLje8jLW3raFBOynR79x4Eq/36OvW5cxz1B8FxQQFtQ6TICwz6oiBrNJX1TLjcsJ+NGckQwHvdtus8FhvlKcjuZY5p7scEMKx+liCHtSyGW51tVWxJmRUhO+gjCwoWAftI/xJCuenNloyxLd3R+x0udZ6+qc28MmQUq3N/7gU3fTuz3khuAsYC7tVRQWyOYPIGx1lEcOU+CSDnVHYg0NCbH3j5hZR6kGVYoWVFj6iU8Iux3b3/Zo75qOPSB3nY5e7/JPg+uqNB4KXxPcwwRPBAK8mBPzXHzFaDdwkOyllAie9Zixw75iENqyEP3M+Pozth4gQlvX4uPXTcmcDxb3iNdbJvFQ437mUS73L7gMtFTXdZzYQNIF4wax1QnCBB03gWFTwls/GCyO9c18m205gr7nCbeJLENF+V2PSEaenYq45kFtAYxjp8Rzdu7FNT7hqqZzDRJEswC2P/hY40vskVSXCGHYzX+f5SlurR7lAqWTQRJBXerMFVOYqhmkkougA1jlRvgd9/Kd3J+PdzT9NK9IfPAu1aGlsxLRm1d+UulPEG4HH6CWWQLmQnRABJ1l6111YWftzhDz/gNQloighetjFScKz8vjr2H0cROlNZh7YsWeRjeZafTQEE6Ry504z1CZf/V0AEB2W3EoM3GFhng0UhV8P/ViOPgrOoamR7m5EsNIVd+ddhmozMmOUT2BlvJbjiSD6TGItM/P5VD5Gg91hAMo1dksGtQQCNGKVyQsbV8EnSoBk0VQZiblDpYEJ3MnGBERJ9Hkx8dSvFge9yiVD2TqpYlgFIFNmAKNbH9w/GchHqvP1K+nMF85B4+pEdRsEQV0d3Dg6HbgKgz1Ekh4acovOzON4c0x9o/MKytREoiSj2aAYm4ZSZAwANsP30ZgMcn0aA78kCtSpmzi8AdludCSISQFUU5Ccwnjy7cpOPdScAfGJE7mmYMA9JT++96lUkh9xHPO6X+VHWZEwOvwzP2HI2aXV8hfdOxtwsNv+YnLdmwOfiX7oiFhSX8EsTxhXujPOO95mfRVuAd3lKw9eByWjsM5QXzwKGj5Tdk3cCvwjcPqGRJQxfSF+77By9TWE2a+z/zM6ZmDOX3L3Gv8GVxBBELMs5z32u/cMDSQZw4n3DAbjXmSQi5Zm8VUs28NqGe+f66neNKECMrdgjRP9zzcpArh93ShGKNB75qEN2dgJL5Ot4UyHJdejuWJKKMaPOgYx7bxt4ZRQRJPSF0SQiZ2ltHAQRiyLIaz8xDtzrP4Vd4Et3d6r5jfTOGRv4Gu8dlOqOab0nWVQ6XzjHiu9hmBYhqSTzZbWKyyYGybkcvzsciOdT01qfCVT7mBDbJNtr7x0ZP5utsvdIgnLjHIxbu4lc8NJWixLJc5tJ5ZD2kh+xNkSJD7szFh/795hpsR7XwFf460BW5MhhJeLccBzfx9sW+IVX8Gd/4RX/Zrzib6PDJYDragZHJXx3FXuujdZh5S2z9hoPYNKB+XntuHH1Tv6lGDqoSXOa8I2Y3EsaiN8yMfC+wIYILtux93XA3l48C1v7MBKL5RSBzJKNIQodA2ILK0ws75Bb24qQ12IHV95itWLfiquShaMYk4t2e7XhjxyjurowBgBjCdYx1ildl0UAgTGoCSDbg2lRi0alIOE9DOohtVFFH7wXYbJ1ULwWiMQm7dzJyow077d+VaLjTQQ6LFisC+rJjKAWb74j5FejqCUjTjOgggjH3e2Itot5JMgkV7Gy2wzSAFiMyzM3TnbYd7gqAY7/TpM/INkFOGB8VDR+xcYOd+yRxsKHUNyIln+jL5aNDNh2fc5YCZQpntkMYuJ2zQ61NwZVcTZrKVvI7qRZ9DnPGXw+zRg1LYm57NYycWQMPVeyPLNo4jRgToAqmPBjCvY+2at5W83sSfY14HhmJDl+8TMcqGKmC3YcIopW7FUkk29D6kAV/LxVLiwGrkomezJ/ywNKjm4zM4gHKypSF3WCBhlErZCw22NhG8o82eMT26yY9/HgYI4O4CM24SbrK9ZMCENwmv71+8vf10oeXhFkuEavoLC4fFtIVNmmTMAYbfT7Ta4hDpcfxbDtlvzerxL3JPMmxtSZ6AMpR5kGv/lLVqapATeHzGMzNku71pvRk5e4F7hjyUwSMuk8zkq+YwMw6szLAvAzX5QUi0SvgJBKTppQYDPIBqBsAK9Z99eFZcDTEyIOQUojRleiKkm07gDuknStMY37wzmPwIDOI5rLcxxAeXzw/D618Pn9/yBvH2MdnxtECcMhMyaABzNwR2s3x4PyZ74VomEs7QvmBlGUT9xWg83cD2Kv0gX3XusZR072ZXeBVxhIbn1fA2dSCBiemGtXsr6FWsYEvB7c9hH7TRZGvAsX3+Ba4aEgJcHWrM/yCYgkMd85gDfQRdyJp0uh0BC5wnvO4UqZZcDhmVgLSlLhGWACDkfCsnuw4O4AZAh0nLJGlMax+PzWpu+bukXwZJBt/bk6kpEpSCNil4FsYreIl66Nkk/xqQWaZPfOHfOMmvWO53o/s9RPwNsi6SL5ZIWUS8a4wVnP30QamKM8nKQAHHoBhDzEZFcZpYxZqhjpQ+NG2RHwTN5h3mpmuKVBe1GB7I2ZXfDOzmCe8bx2eH0k4D2GEYiQZOpbdD9EATLP6zTtVqsk1J0pU4LanFXH2pYGRlJKbRiwtSWVTR1DW4fd/X4zDP8Ol+jG9kMe+JDk7fj98JKtJJ+s3PTDkjgjcm47NuZPnwmgAGlXqT3NYS3rlj+nB0mrzjE/Zl9+rkfC2QA+wP0iCTUDBNYTvMu5kJv6VmsPmwDVFRsr5LPEW7J5WuZbBo98YmufG+lvNExxpdQZpEC7iY2V9M0MYlUx99WghM0CKjjW0YUHxmrmT+3rTDcMGuQ8Fy05PBYngKEEBlUZi5TsTbFo+6LEZpCUjrg9fVWzKPIzqaplx+RYI8k+tTq3WRTOzrEulOS7UtUilKbqg49NEpaxa86VCiMpJb/KXOf7XXLksUDKiSa2JG8n7CknDQBD+xwBIgbTPkfcHTP1rz1jOYelnJMZ9nQYdgG4BMmCNS0kjyHIEARsuuqiNgoLWSMBZUrpMyYHZObm+IIO4EXRTQANfomgyAqCzQKXkMW8dxSyk7A9GtCcG9AGe1rePOJieEQogoiNk4gX6053nV2W+amEfGYyz1NJxe1nhSWIP9AgIg53rBF5b7wLV2Du6NZ0Z/4SN8/11QU6qJfCS2IrJ0kSsFpDFQPaKP/BoRpnmQR7ndKhBqEBvRB0rCIdANEfMCNAevvqfThu6aX7kFLSgocIHCt2yOl+l4tkIMcYNZlq/6oxy4KoKl6Zx8PxFaG0AlWAqFwLk9LIkp1GWSAfRyzXku4d3ycBg2ObP5uUnRWxJpumIh4ccabk35c4g0Va9r0gKc6XJzxJ3B3P3AfupYAqZO/qojblPHDtyTw2iRkmFmcN4rkXUjZo1mHc6/fRJDk0cHxRmqTyJi1SdpCIjjlNec3ohDhIERJx174ys+oc7DVe1TXlODyZEWeZU8Z3Cwv1mxXn6uZauGuvVSzMOLcKyB4bjjOvChUfXfEMLKABmVNFAWEJu6/EkBYqJkrpSRAfROTIiVmJjArOM5cw8ZIu/C7XL7ziF17B8fj34hV/L5EnynY7S7m0OEAdtclvXYDPn37vSKYd0EpFD6+ZkMM7mTenBnEXFZpRl0nErMIR/8ZL3osyDqtziV0QIwLBACFs8FBxdm2UeWBqs4qzSg+H6Ag2DH5qlS6aau2iAibw2wlumxlbynJ8anIrQqQXW1AHD6Xz8sFD3guKa/cYSaEasZZEkCZfJtTjdPfwvRKweJMH/iGHVqbbimSyDruQjEDVr5p0eYAz8QgzwFyIbyDzjYENFS4QN8ftv9U73+HnVMmwO+BXbbDAjxpXr2RqQ3YzN6SY0vz+x/7AcnoVDLux9Ed/NkBtf3lfVP/05SpIaREAoS8bbK7/8PMqsxi5+RN2zPdkt8JukD1keD/Oc65OZJv7okA351CiQ7AGOtwPRmMW+9r0EVFwZIAd2sdiHbi4QrCDdU65pAQYRAQTCxbF5VyfWyNwiXf9xHqb0U34wsYEAYE1DNNyP0jz5AQwGXjtCDS3tVFhFVZ8A8nOHWjWdrT5umtIHEQSH/NueifmsChI+axusTSfvGVgVZu5cu9yAPYZhzWQZsO6B57xg79fmvcrugeS5ZeHc95/M06HaAUXM9bqPqRDrcpUCdCwRTjX1ArGirtDJTykjv3NYdBkv4hCIIBpFam/yyW6ITgYkRVwaSUCYlrdtR0OWElMKbQNEovJ3wEdvWgE2P4upxVXzof8XICg32kmyyUSOsvIYC29XVA+WzsD9mil9wjqs2Bc2KMeCfXxd1TZmStRNAV4rto4gg4Avhd0pI/JhelkwK3UcdbNgq8q5LFK0F2OxoN6Zu3OARdc+e+pQ+8bj14QFVzrSBrlp/mNmIPpwxMxhY5XS4b6qi49D/81tYkNjeDzIwYXmAjGqyzsbC8HMO2nZF7k7V3lHNkBJE4INJiEj646+9X7XUvEFiZNCEkt+BVrn2ffxOvww4AwQPyLt9w/eGlEb8kirsRf+F3gmAMAOqRctaZM+txI8EAQcZ0AaruJRrE2eB5k7KHIro1ku7nk+cVkSArwS4+hAJaMEmnjOOPcHTKYCAOAwdpA3D/i+Yzs0HjUBCCn3pFY21v0XJGdR0KoFJg2ILSz9a1oks9Xl7es3LSQ/wgjX95jjrVGp3YDkhBKVpiRcCWaUtBJ7HmwsmvEn5A3BczJAr1EgM1xeU3Aw1chDXHJYmQiprYO+ePsRlckiWteE3t/RTBMtvwwrj/e62b3lkh1wG5fBwaXLMGI90QguwGH5L3wDM04gax2d8rP5N/6P7ix1sKWr5Z7/TaXYcjEEy94hpcCQscdAhY+c3uMsz6BHUTxhd1OPV5AKzbQZ8T694Ag7qUM9pHH5OVe5C0AME1flrgPd8bmIKCXc7j+phhgJAxxXwhgLwk+0AILTSZ2gPNXrO9bWlrdBD0Hs3tnKPbuGOnna6tBIoZjAVqrqKAeyb2+/zxzwgtTHt7iTiC9Jf7osfOKvSW7GFJKkl9LLwTNPBMPRviKDHxWnMvx4RxIz9KzwPERZ+nLew24AJffrQoAcDEkIUxP6UF+7d4Rk4owVsvOwdwDXSJ+tyCZhaR2qj+Ywm0X+XKHV47pwDaCJ98stYqxHqgd+VwLda8TCNAtv76i269i+zeAv7va+H2hxDYA7kstaeMegFKdZ4wFhuBYa4zNz3eOo6tqiRXY/Eba8/7ZUWztfOaWSX2JVIGt8nSX3kNsAxEPJROccmYou+0ZOecge47FkyvyeDnkAvd1xIDBRPcgXLgDQs8aMqRj1ltK9bAzxVNCLwoMGnNPALgYpcbMsEc4Zu+OZ+vdIhR3AudJAvPAYv5c+RPvq+I1XZhx3iUoSr9HXrRHiHHLfXMbXJNAOzEK0+iCgIRP0CMKzU7hHH9/GOvBIb5hcU779QOPLTwOzJ+A0H/yquynvIs6V4J3l7Q6cf2EsE4CojjxNTnOdU/MIa72KQ4iObw6MM2lpaIkyQZALmo1BY7OKp4/9naWaEgY7uh8hwzK+zrCi4VrKb2YLtUigTIOjHw5tuARWAtAGfs5RszxxjktsNPTBiH93dUdrxkYxl5w+z3+XRjf8odjSHjiAvTdeZPWA1reE6wZfzwPQ7DqID6kjQ2l+pSXm+MpRYIktTKGFRFAB8RILjKRiNO8u278xpDsLB+F1Wa8a7sxihO7TRLZkF3Ehi1NXpLMldVjKBSXoXwY1Qiku+4jP9lvuT/POvvvqgL/2PULr8AvvOJfjlf8bYFJ3Mh2Cdb8FZ+zj0T52v0RGbiXTQm4QZz63/DsXvHAka00SffRmuq+3wcSLc/y4X8cCZCSZcXR5dfEgnXFw+aOhPaJ1sI0SeVAAfgpmHNcZB9BYNjFtM1JNa09pyyk5rLdOZkTuwBqBq4AWnsVVuD33PGy4jplHNypdXjWcLLTgYFUAsQ7nktrcxXXqKA2623DqBmLXgAzJfkAmmgmmyZbCyFwPHAhY3SrFKPJzIDRci3iFkUCw1gT6oOtuHn/mvInHi2aguu6mHOFwXSaEzbLKFZcBPkDGibOKa8zcdsNcSZR6RFjkU9MCPy/n///0BVgT9aFRptO4lwr8TIyEZHQCwUoR+c1jxlEDACrNqCZDmpVsJlrl5GgSTPyVrFVcBRqnzrEOlnzSqa5NhKA600nAUgm+IPFRuGTTE/BBrZxJ/u22zUdKYG4NvBbzFWyux2w970lWWaZntwOGD5qvpcXtHQROi85Nk5Rh//FAbLlW0YEwrYNkN+glURIrUMv/dNIwo4MiJbA2T+c6/dGYH7Y8iMk6gQ2sgDUe+x0BWaskQjcsiibBSSNltVX6uHasfaPgzW9BAgu9NN6HixIKasRhxC7Bav92MMkUQyIgPi7XOYTH1uBSO5SVJssMn6JjI5OigDO7hMgyKAhE6XewXkw31XQR8kr5H618by15QMI7Xe+n2egPq3DgkyEMhDKMm3eH8EH4o+C+6f9zCC4Yv5+jU4O2FgwMNESUuuc5pUcOvQ1MGQyLDSBORmnEAJdY4PSCq5QTePe2U+RSWV4UeR171wPga25o7sYJyS7YDzPqcOv8VxDARK4pQcQ971+r7yJrQbdJC34+ID4Q7a1Ls57i8BOOLKGOEeVMYX6R4GxpE+ldw4PFBuL3ZducIxaV3luM17KboGv6ih+DS9JlVPiN0Etl+h2kXO2/fOXYTGGy/0zgKPsZRIRILpiWYDnsz84mGtGoAnIJxP6+sV/TTcSJvKPHvsQhPIpz3hFUeIKQPipn5/Lsa8GLgACEhCuJXoRNVOO4OkL+63m0NJ/qnwXyfhcciN9i1LGJueoGePXe7Rk64DigcJ0YzvnHOeHtG8QvJ5/GOMmHYCsBYku3Aeb0iAYBeTf2wp0QMhwcYMnKDFEQ94KeAVwtwQFONgk250AACAASURBVGIpNlLi6onEEBBhHPjbFqjvWHsJjAEe65SqTnEu55odWkmM7xf3qSxEggVG9Ve8GxaqBB3LirT0xBn3lIQvOiEl2zU6MALI30NRjFU5QCx3TB0Q/0Qdtt/q6s713utaEz+15fnvKeMRlwiGcS8VaaIX5SZDRtmA10iohvPzUa63BNIb8k5AAiWLw0Liu7SUHX8fMDKTnSmmu+OyAbo/cv3Rrzc66wCsKdXNJvA4y6QY8A6n+gRYOIREd01yBg2QOQn8+uz9t0hGAFJTH3eMkcR+xHit5tUBxIi8qoiWni/ilF5KYhQVHBI0e8/BmNuOeAf8/ZUxgAAItifHvc/HNo8Hpl6Ru8R+uizyNEBwkcEaRR3GrQ3Qqjp2FJR2SuFNlGZ+ry/eqwhgviFYGMK5lntUxti3a5MXofS9A/DCBYXj8S/oN1tWBmN3ae7t5V2H6mIkeWsCbLLkNbWAsKix1CUIn99YF486riC3PSMVBdCxTDHpQ85UBPfqgdqj49HMIzziUcYgUkWLmimuaCUJwPEVRQpKdj/+gvrvNR/bbojdpHuzZWKMgQ9TmL2iDBdFD+XziQMyCRyZdJ5hCqj1XpTdOgxUAxc5gNLMJwQe3izn/LMi0u0DLK8iuEh1G4gw79mHbCR7AXnIXVAgWOFWcqFS3bHuGgBYrzl2geY9X9ixh5KUwl6xYo1L75elsCPAlgETwfRBANHzvUcMa1lkoJ8McaJVGNFGd6NIqFEMCFQUez/lq/IdLsbIozpUPIqnJzFnS58hiS1ZzgMAvgVTck6HL16dPoyPnkjYJTEEnPgVicLct/u+SgpOGn+7Y5n8UBK0AeA2wauS4CiUi+Ej5u6XA0MuuBsELM446MvmTq+7FX/j8sw/gMrlNHJsj6PRHfLsEAKLDgs5fYGAPbvLxgCohE+TAUnEXXIQO7OQurXigRl7ViIrhWt6yv1FjFc/wb+jaFUhgCR3i9xrDQCbBYLpEZs440RXflY8Fl7Rsc+cm7N57F2dTTmNt76vwQy+NbvcfcKDZHsvxZ8jLUoCyznOalMUIc2UuYgXTpiTI9dqehO29Nh3uX7hFb/win87XvH3HUzucFFI6XDHTQnq5NjaCz+vAQbVeYB603/iH6MOJnctZodGJweZkTFBser2R2yqKwxj+biK2zpRiz9UiZm64tHsSkjpjQUR6ng/ACC/AUAF7ioSwTuNYNUTPI/APQ9CEbjM6kCibB5ZFwmvDCeLwMzYDuoe+qcJXnTrrB4BpICGmhabTx0cgwdsQvqUOSnYpsbYwMUxoshW4xfgQOvov7CiQrpBYBlA6X2ylW/H/Y+qfKpMYKB8WiAC0YtMhVzMAmz7IquRH1rPkuxThePak0ZiUFwRGe/xiqDuqfn7TIJJAIoF6xj4kvSVQjE5cgFxGnwfPWMAZBv6hgV7Jds5cRyi8NYGXRHYTUgF8Wks6kAFIS5e0gZqu9q1c96vq7Vtj70QE8mykQZ0BNU6noZ8cI32a4fprPVQxZQE8YTsoTQXT3M/kVmHyUsR86ITbpakYl6oFxBmUcDFBPZOc0CFrWSbc33/6Y65EWDgUwevOPBxHIhAQZsBiu0q8u6RCUKYV6uAkiMA1NlFFhJJKJNRxzN6rAHAlmGGzAPZUyExpF9cH/tVHZHTB+AvjDHYTQVgL2Xyouxe2rogiir65frNbS+9RzIw8K291qOIzP08k6Uu+5Np0kV2FaF2chSVbBte4Vp4JStePht0/SbXhAVzsZNfCSAs2VGmfD6H17mm3kV4FYHpn/H7mR50YTXhBxHgwz7gsR9l5+l1yIdmEvtMJtEiTJiuN/iCe7lo7t3kXRdbxz26VmNdq5eclkUng7uVfMXEKlDrI7tZS/IFYOdbrHUjkjTHTclW8PGy2a6KAm7BGAKw2R0pKhCz0hBPA9X6+wgJo7hHSbkYdYzFNQQFdnQk5h6oFigHANiDkkqVDR3ShdoYmywuux2MpBnnuD2Q9IvQLOLzXRgUEMMMAKO7jNu7bokguzRyD/MNqFycXOa1X91IUNgwYj997MKjD0TJPnZx3PtC+rgxRe+9RzXAyzcJ2n/2yrP7Cla/ac9L7q9MTMQJuCZB5NwZhlh5GNXXXaJDgxHejPeaHdopIwUAezwYca6Z/MHY0pTG5AB8Kr0DgQKBpDouhRFkxFvlGYMHslksH+qAHSw+B0SfkMQBJgbGyPWX5vBE4McYwADWEbsBCGDtpseNGnbEKDUmc/BuRKBfKySXQLPs+HqD+S+ESjIMenR8W5CfwtJeKJWXS+QKI3Sx9mJxsRqrJJsA8f7AJe/BUZ5B8rKhJd8FABJJzBWrby92PRDU/4KEJG4BRXJ2FLyASEjn7qJASicbbtyW8doOIOjQCbfZ+7JFHrGsuqoc/6/mrCdr2AHsv011/tevTDwzdEopNoL7B5A8QjYIm8muM17I3ArIYmDIm8Fiy/KI+5uIAgCXcc1yCk9oMCpVknFszDlEMGVDJH0nzvtO0J4otIjWmRp9jgBYnNlBfkuWo5hhKO/VfODPRPiv6ICLUITdE5x35oDN7LoCbrsxI9H9ivsrflBIegLAM5/DN/g/7Kk+Ctxh0SmSZ+cJrWollwcA9KLsMeUoc928FGiqUwMKxYAXwOT/8m+t3+udiCqGEqR5JDv+uc9QJjnl20j2nMU8J9kv5ajWWNXRdYfH2sLFaMIdgo864yzy0OVfVUyDvJrcd0hk9p5lcP/z7bkvGW9z9TtcFy5spSQonyvOf6D2iCSMAYVzRo6fUtstr5rXMw47dt9YI+cKlT6GtPSa4Yqci8tGJGTuE2DWHxiW3kkA4FD9QKpyQF6AUeHkLcLOYF8c6sQs8k2to0NTZGDAA0xUjOgUVAewmVsj1tiOHFRtwhWMsdTwA19AgOYEtFDA/RTDzi4M6Twz47Y/sOHhga1x9rCsEL7aKriyoxeKFXM6c6gv/UKqzSiMHsujOw/dLaEEmAB3sQ4zj2TnokdMYrEPVsej4PB6fDDibLY9eZ7OySJS6OLqFu5hGQsFVgKh8Ky/geAAZEGic9Gjc0w0ZHud3bYSAJ0B5W0GADqU/hnfiBWr4euXcQlzFX7vHTCNr8GiYMf/5pzWit0z1nBsaJBg9ugcIiOJ9O9RHewuKwm1eHcxp5MAYIEDrpSPPFQ2lgs0ZOIt9yx54QmvF8XiGSXEI1iMUCzLuH4g+06lCl3dBcT7CG+9Hb9/X/j/7H3ZliTHjawB7pFVTc3//+hcUVUZ7sB9MCyeTQ31Jubh6ZgzIpmVSyy+AAaDGddNYo53xLZ1zlA88INyxUDJM2Nveqk4IBfH0fdYAZYr1D+LOJD+XomIclytkkVKL3vXxXyKbyrpPI+i2Y6YCgA+bFU3jIVnzfInvekAuLZ8mPlX7IGzJIuXKOetapO47g0bxDNkAbvkRJXyfvJEzt/v+R1dqKh54jqRQUg1I0ZeCeDF580jbsxiirtjGeDyhXc6fuEVv/CKvzte8adZl8YDLjBfUuuwq458XsmCiQ146cu3fGdltF4LIBrNemEii2JkJrgNjArcVjK7HMgWcjKruj1ShObOydwbWw4f0gC0fcIlPFGEwmMAx5m74/LUeRfo7s6shGQvW9Eu3Xq/BObjjdsgkxXE2Ctjw+KDerpBd0tUFQvNAZRUxr/T27bqVhphorkF0J0dLNLmbRosvi2YJ+iS2pfJ9kGzcbVOAtjR7lodUYNtm82e8/hNBSQM1dwx0TIO7g4dEdUC0Y6cm3KwBPezjbVtF6gzYgx9xeQTYVW6NNEHgzXVBRgXA0HomrrjOwa9XrOS43c5+AwNj/KYiOeD7hJ0UGuW3UIRDBwV7CHKIMC9gP5hq1hBE4LvBAI8/c4AUy4Qjgszxnv6kRHksgj2UdqvKfmhGswrRKEin0UyGRyt3YmDcZHMm0MnuBmY1KTmBoIa98OkCs8PcYKRU6ABTixQ437vTQDRaVDncR5nvXkNlL5waj7zxBfghEWqiysZj76PQHCwYyw2P3O2/1fhdOT1RxuxCMwXxCXAn0h4QOYIk04gZTREHHI9sN2rsIuDdWcCpKTiDNnBMsGNQDX9NDLldJHqtOILyhvjM9Lro9h7JmeSLDOrJNlltnFqtiu7w/BeAduwFWMm1hCL5H70awiZBCASUQ+2YnqMzEVWKAIsFQHsR/3dTYvdeIIrLS/cxezu5qCGNPMgxZb0aoiNyQ+2P85zi81DkrsSRd8KYsjO4nrb0qFnPCiS2vCxp+kVcjBSgdHCjZTxMAWu2oeTTPAsYoHBqhV+zxtjf8YaFWuBzZdE3uSrAhLeJ4PIB8hDyvvoIfnJdvYcg5BxdB4mi0oxwb3peQRvebjviA8AwYJceV8bYNcBXruFdKQqjqUpOqI99pMwo814RVk8d3jtVS/kFlnYeERSN0MqtJMCyglEN8gOD5ZcjkSAfXax/vWHuYYs1sV11XLNRxVxTEfd37I5keh8rsLSfhnzBgmiRSQa6bGSXBSlrnzuT7oSPODftzu05udvJdGViVUyHN0dE459ygiIAFYpOeAtIXp2dWp0Eokjrp8EAwEwTV+6zVckNCn5sb31r7cKFI9I2q3ex3iZErGlVOSOrXKUBrhmZC2I3cBZQIk3+CqJNTuAdJJ2eIkvkhc5lyJhvR2QkMcSt4N9TbkyXQ6JzjHLL0Q//zm+kZJLgruYmK4PXp9cZS7PlczqGaty5bHwPRiwik1LB94GqvAnzqQQQEq9SZLQBHjYhK/uzDIz3GLAocX+FkeskVMyj6lNqeIpAEUSSX5kWLcAAAYG9JCPzld3xHDD5Cgi5rbQxBLIKr+KBix6/eFe88B5uACeMYogVnEBooPabocPizzxrmLFR4FPPAcAGOpY60iocy+GQWQyTh5ZzOKznKYlceQxd/K6eQ0t2T7Mq+MfsrDiWjJ3FTn9USZGxHv7MFj/sRP0t4ifHPCW+V4BDo/9L8hPRDYSfoLcgxvqs4iGZKo7Vo5hIdEJ7nAluK3KcV/zYBAoKGNm77jgumkYzutL8NCRHS7mG73RxP5lF4tb7nB8YyPzgFFrdYOxqz6um/fBjvv0PodhmGPPWEO9gZqM128/n9SxXtYYYrxRy2skFPnOLczERIAdUhk/giibefSSLlAFTB75vUdxKfOMLADns3RcayI7B+8Y3kvu8qXOzj12JuRvpDQYCb4ijIXSyyXVHnjFJFyYvK4FcHbqzjD+4F6UhLTuvl0iLHSCaYhZFwJUFSrfvFcefk4ppQr6rcAm7ipsCShV3jlbgpAAcIX/rZv38I2rEBHMTTk+7vlJhgG+r8hT4RALwD+XWOdTH2PA9AkL8lwClGITA4YRxd2Uekt5I4jiIYZlC3vsn3K2+P5I8qZv3OC5sw7mEL8pgSaUSHKEzJUsQBwyHUM6t/irjyGU10pVoJwJWxF5YktEAkASO4c30seSQxYAMhaXAnq3VthQMvbXSo9Cg6jS6/HlEI7VwJOeYsQro2i+j645hRXO5+jXs9tXpYuWK7BON61Ch2HXOEibh5Ggbhwfm6z/i6Z72LoZjwlgRlxUAkOtLV6sCsGZg6iAMnOq6K7Y38Pj3AH5wgx5Y4Tk9HBB+huKX0fcHffUG5/kdeZeMUJp6ejk8N5DEr0XdDyG8E+CexGfiE7x2tYR57ZyikD3BsLPLL0bLeeEDHiOm+qUc8CDUPWSn0kVu4DMv6xk/9KnPb1h+NofFbH+6uMXXvELr/i74xX/wYNpRIGBu7/GV1GfdwEQ7PloLeF8UMfvmfRilYklZNTAdLRecAYNr18SQbpIBBvA8gp72SJdHRL8+z0AFZ7Xc4KLF2Jjk7g/WWAxwYUssCgnhwRrBezQWj/Jq9gY1Em1gAE0tLr9NMA2DBXY9gpccrUduyv4KhOyskNEYnPu32Lh7Vl3IpmoWx4FZGcS9mNdyGKOeSYudGDhzy+If8TrJ8MnDz3M/bLdO9orzWi8meFytqg6u1LIHgEgT4wJrCgyjSEFHjDpDQ8G6e/y2giEjAmgNgcxMllygctAOeGkfdSIbw0vABVoaPKzZvw+gB2Q5JLWxM0NgIEvr2z6xcKR9yR1b6M/Pjd9AY9cBJJSIRLSagAgim2bgXgZY3tJUl5Rd81Ck7tjO0EbAUq+bUXCDAh2aGMDXYBlQNlZQCVYkSztw+iSGt7RZpm/5MlaAWxYBS9bJRb/J0weNW6fwSTI69yqGMm0llEbxbB+/h5zVWyX5jCQpXj0hgHpeQs75GqORTqSPMpFefwePcjGGJyrnkVwxsFZNDPbNFP3uN44lTtYRtRO7pnZwVEnpAAZTbZZOFNVMp9QpxnPM4AgPcw7PSUpBFIeJrnmI5gKvIcTXtG/FLj0rLH0TgdlSAPkjYVhuhVzRGsD6ETjNP8c1l0YLh8M7tSBYI1DUPIrP/klxufjs+64K2MCJGdGgaYGgEzjHTI8fMYxlwMYAIDtO2Q8hBKhksF5mCjHniUqcB8FpidQJmLBXGFrs2auHr+pPo/f513iWIrWfUwsi/GVQBu4j+V4eJRR9lXB5tjA82Kgm3Kgrg61TIRmJfc7gC41jjreA+mOQjnWSA8/GID61CIhD8skxxJQOIgsQEi6Gse3DoWJl2ytBkDuF3DkLiFL6cda54Bxtu/D+LueVUVJ3kWO1IB2gn4aJIutEb8AzXQ/2/jf5HC5cFXncq5fLV9ggiqmWHblwKCekk8UtamcOgpAjBteYe/U23bpce64K5HXBLzlC9s+K4ZI0LeaVkI2uZOFiJucIO44vT9xrLRViHlgx3dOUySJYwVpwMRgI8YsVgMlSbBQEjw61sk1nn//BvARKNyUM2HwkvXKQ/VqaeS8N7G3kF2usOz8Oop22b1AYFP/8HcvkDBILM55kDGox7yT9HYSHPJ5gNezYAFHFRAdwJPgiCnnz7LducEBjsqg39/eN3LNphTPca2xx0sViKRINjZJcJBlJR+zxeCxfiHWBvpZ/AxO/bUH5f1OUY0EJ489XzoenweImduuAbD5Ku+dvkcS+1R6IZCVmTFCsBxtM3mFVw5n0JIENztioAJ/BjzAz+057kgkc3fopJQRtd1z/AuexZid/A533MMgY2DvjSHBbt5PMqRVcQG4q+jhbXYd16zba/0EEISri5KJcYzoQtjjlAME9z4cWebo2PLaXcCpLdEVqVdX8ybuoQiletRegZgtg5Gh02x9mGKKUN3Bge3fwN7RqcQiG7X4g2kf6hQ6FIJREkvZXfEpAx/gHNtq3bEu6bth8Hp+h19GGvOEjIsAELu4Jia46MzLSj7H52EGzpV1ulKK9I2OYYZ7onab8h3BDC9YKrCcOS/fF/+b+0z89d+NFXUtP5hHgFe3AlfsAU/duCAVX/FUOofwJJGiz1OLuBGKFfw4kvNs+4bPBO4HpbsAjIwlwIKtu8Gw2sMnHs/ju39zDRTYXvuOGGyuAscsTmDsQ+ptpGeh4ylcg69tVVywwAmGBPEUQehLv+eY90spbysi0GGVQM7454JhLq7h12Duae6nQuALMJm5fhbgdpB+EfnYldYLwQrfzxt7WMj2TRj8iBlZ9Je0bZDGP1feTCMYn8XYBANfY+i8/QOpw6giMDeYak1Bl/1Hf0BZcHzjfY6wdBiD60WRlGNOHMVXAAX+AuuQpbT695bkt8qHx1E8yvzqS7twlR2J+Zzz9+/j1qUE6bbIxTXlQTk/Slq3cIEHz8kjLkLmSwtuG+JdFAMy8ugtccmo9XFgwIYDo7HNZasWDcWCXRxjYkFWEgVAuVeRJuempYCGLB67eT+w9BkdtKP2aBZwBYnYAZGq79dxqNaKAHAl+VUEO4ghww6JSkc9Yz/Is5nrkFDCf9uR9114xNwfGOq4rUkSVDjSSqxIsj2wI0HkSIn5DRY4gPIohD4PQtdAK67wCxTGYn3ECJLPPpsbtNe/dzp+4RW/8Iq/M17xHzqYDFkhj4gAZgCc5oZM4h5AMdlzgbSfGJPr+CvCfC8q6OYduAa7nmaj/zc7Kh8+QWs7Ph8JDcieZSu5oozyshDlLdHGhIAJWTLY8mYCXADS4P4e0cEVLa2sXGq19JUs22RhxN0xL4WFvEzKU/mkrF+abGawd+vG9JO/yJhqabbDfWHsR9yD9D4avQgIIJoFP4vvJAuDQM/E2NmdlYGToqX/btya3UIPjkHbkGj55cbHosa2D0gwSMoc1q0ozCoc7N9AtM7mIsMKqO5Y8MUAS+nCjZngSRw0Hkug52ijltR+F6zUvDarYmKOv+1aC8C7HJd/xHWF/GEKHgqqdXmY1oTZ9U9KLzAgMPyUMvPfysAZxW5Nk9UL6IxZ+OwEgh1AmfuuDecxEAUlIJkvNuhtlseeuRBlEDBqrvBzCWTx3x/uWGNWAcexWVyuMXmAasXwBkzTM4Kv7b1h0Dh/9FohC3ugEqIaR66YSN1o1L3uOa6lL700EwfqHOcmmmeWwS29BzI55QLNYtOGuUF14GyhX1GkL18lvVrTWjYsDQRL8/xZbHiRcSAdFoapgOI3YMeU0y+ICD591Yb1jWSOOJIJU/NCyGjghq7deRCvmUyY0IzWfZR0VRp0i1xHkPcuRySoKamEDkKjnl9t4ACfJf3keq/aAlztpoxikaaWs+ux3vZ3XYvr8j1SxrMZlUyS0oBYopPTa1wPkRpDL0zAOL6Fvymx/uqxPooIZHJ+mRj3oDKVjG45+CFTm39yZGv6ADB2B/wJnOdYfJrRmBbAtFnzWtyQws/fAKCK4auS8j1W+Xnkb7pQ4ztZZS0CI7VH5nMjkP4Vp50a/A888/wAfC4mJyrO5NeBMdLXxVvqQRQYGgAuZSxkoGIHFz7PbbtYz2T3sRPQjjVUo3tUzKuj784g3zXGCDDdg6jSz/RbN3ZIFKlNPDBqziWBwP44BP6yI1e4LNJrzbFOclyAFfIecwdbAagxOzCQqHgm+eb5bVwjP6xJJnzOu9bnywx3gMYZ+z3lHwWibTU4ngxR46dTyjMBWcuERPP3Dx9O4XmwMBan7q2DLkcxalRy3UU1P2LdJEsZLNZ8Xucjgc5IbMS/YRYsVbHy2JMtGIMkoOVcx5/2pExcrWFcyyWEUcae2PKvin1TQOBzAUBKtKLuqwcr/Vn7vuOjgErHI1hsEp3D7FwPTXY5u6lSjvfBoBeA24JocvH5/5xjJF3s5bCLf6llVrUZ6sLObTLuEN9wA0dh7A4izLVSD5wFKF6L4uGAL0o681kwuXqnQwFAd8VTGftsXTXuAQX2FaBpgsvoQgHQ+3LGNwLgkNXOvSILVUB3+fvYyMJsxsgkSwYpRY5cJFjhXC5Ts1/QOHYnxsUUz/jNHVdIgqhqxXUjrKCnUmYFxmCGWwo7qD+tSU/uij0PprIeXYTZjeSKC+mLs2CjC3DXTwz4p3oRisbW6HhrP0vRvn7ZeW8Fz2A+zdVm7iIbriGtl+uD3Hh651ka93NYPBvRUOaMmA4Xhg54gAtZvBEHvYZxh67/4DpsC7H5B/AQe1D6oYnCw2fNRSr2kTSaliZfCbpYkWttStuIKHBvjPujxhXz5pbCeZfjnq/POONdVUP6jiyzmkPVDaqr1vvLAM3xGt+T8nr8ToEcsuQAwbKUihkYJRd1ByhHv6uY54LeDysdayCXxTvuM1VAnp1PPXFjYtZ8Jz6z4U6wasyjM2R0fFNhRYyDLGzmvnGEKfDoLs3lJd9LeZ4GoJYIZlyXAAGgt0n9KemaoLXggs1vzoX7qv0z7/U/fIQQA+Noxwaq6MbcLNczBz0QubenukZQVgNnsJm/z1jyHtzTtwcwzROvTiTDbjI0GniHsujzOMwbXaV9iOIJiTtGAvfemMtWYlGOuwuL0CDFOB5cUiFub9ZvaxEDWdZfAaDvHRiTjJ86uSiTRiD0sXo9yQ5kg7YXmQj3I6AN5geqa2gYkKbKK2K1uR23J5BtSJUOj1jdg1jCZ3LEaLVmo0msiDkOoEhGsvCRhFgFkFKKsX4OmVWIxEGE1yQ11H0DRB7cQ49JNgxBKABs6FFUcIhucHVVQBVSBToBfGAcPooApa48iOhMvrLDI2PUyC/MMCEBkJOYw68xiCJkG0et8RWXuLSMchUVCESwAyvlmjdsGNSYL99uJHxLQ80GcO/CsRd558uuJN8AaLljo9IKY5DGLNl5CZh8VFyu8gAQEn0ZQ7rAkQWIdzl+4RW/8Iq/N17xHzyYsoqY+vd8nYMmpPLGF1CLbG4c6AIOvH7mzPHyu9Zku+RrRXKW14iKwcbrFdhIWQUNiOKVmeDyDTUWqygalkE0v2d4G1Qz2Y8NIYIkxy6tQvFZjLgRF7d9V8I6fRW+n63aWxlU5UPIu+x+Bctu4RmV3ccabNU2wx44lsDQFHUFojIr+AcenvIXvVislLODshosZEkBBF90hU66xVV5M7skupLcHdO0NtyVxTBRyPAKt9SjMCZPkPc6kKuAQ5Ct9WZWy2V23cge0LzWmZNuYEdgMT3aIUWqnD/QseZw67XV2WE1RJpVLQpLUCGS6AGpcfEux60GNe/zPlir1fo7rgp0up3Vo+WUBJWrOgI7WSoPILQpZzJaAWDuDB42Xb7MOvkxMnaKpYBDOhGA2MdLSWvluTqf5RZBSw8ZJl7XBQJjlOoYhkj+HdlN6KbFmFlDixE3019AFcNuDFHqY1e1x+P6TomLXiYdjjUMYww8uloHRKKfLJq8145T4iJ8AQLUOOf42TlZOE8VcwHbZDuoa7Wc5iYO5f1yd+gGAzBBBayCQe3uYHBkt0AGyieQxGSZgfQXb1R8Rxb2Z42x1E8eHvIywoS6zef5v8OAKa/yOBIbFzxm1HgvcOFbJ6YqPDtJPcEQPwgPDZAuUfp7ebI4CNSUJGoNIOXYBZPcLMYdZd36jDpqv0ohluFtBIliGYOdfRA+2xjD2w8mSXzuEmvpU7QERMqfDBAcIqKrT/9ppAAAIABJREFUrxID4Hdi8/kNCW9D9/pOET1Mse86vxzLlyumpFnlbuNN6dL9qLXsGViAQNajuyjj+JoLO76XMqx8VikNKsGizvv7cLLKJYAy0RtYqd8/sOIeiF8EBNNLxFPOK59rJKqy+slZdxTCGYhdp1SFToxIjCw00bEtLIABmYRSuU+nfwNgmkagT0iAWrekRnjswyKwYfi9ihQM7OQw4nyHQ50dLQkK744Eai9gkvAKEgGAReu9uR4sZ/4t9waPBPBLMwbg38nCD+ILpMDW71zbZJS/ivjGOELZJBIkCF7nJT1nlyrEEohIINxqS0EU9bnm2dHhEVevD043T8mq7r5n/DNq/3kIT0N1RAfvgOEHLhhsGWR8QO2GIgDniLE6zp/heRgx8Tq6tQC4sCghojC/q2ixRmiyO7Am2e0pJ62qUQzkXqzHk0tT2wzH1ScZ+w5MUSxjEjWyC9/8ILY8miiS3dSbgIYaE+e8lzlXE1TlcxoY26PAgYgxO6k2mcV0D03dAEc7tv0yw+kPKD4w/M18ODFjnucemg9zYi5U3EUpmv7zCQIrkbPj8/SeyXmhaFmr7jbuLvEujEr9QJN8EuSJ7poCdKwKLXDH45D6JpnJj+dKbxqIwGcUL2BV7HTvos22lOGSGne8HcEorXxsYCXQJYbvlN/GhM6Ub09CEgFGAHC5SiolX3tssFAQ3/dxp9z0I25nE/VwdBnOFfdJVuWeYh0Dlv+PS82rqRPlAQx2aAHtSSroeGNgQgfYyRKoJ+PHx5FrM8Y357nBH0VOEzfYtijwnSl+ghfhBydXsabHnswtBEU8Ur3hkQcoBFfkVlu+I5ZZ9PZ4o8P8Efc0JOYOaTj3KBCgfcQ0QFWYly8PCw2vhSpJ2jUQUmdVWY3PHOoEYiVNKbG2lfuBg5L/QZB05FzIGJRydl8J9sUzvewqTATKscX/pJIMPMCuMTBsdCdtKCLsa1e8N1y5Xzrvk4rAxbED4lZwnbfdxAA+b6IGal0EF+n5PyM+gv8gGdFJTsi9eIYSxhCB3L/VfpZ7dxE6fNb9325Frkhwz9SgKeMqIwi+TXhwaa8Jm1qvb59Ya8Gui3G+A7CBD00/Z55PqmpkvJaWPoixbmoouaitFft8HulQXttzIO67wGPef1jH9sNwFAsAN8Otj+7UfoOjOiLraGwolXJODyYcBSTu20pA03NdPH3Rck3yUE/rveixe+xAB1LCUuL/2HnNuNwRnbUi9Cg0Bz3NO7nXtH/wUb9/B5a44TDskO3P+OUbMjlOZQtEfnvxlkRiVcCxFzgq59ALSW4nBnbBAqcjCZVlTNVRewsL/FYF6qqX24U9P5GEqZIsbXAGw5Lksyt2feyPuj6+D4BuxvFCUjnfIBAfgcUQM3Wc8b5jFkH/qtdEsqjVndV+j1aYyrh/LyB92xxIz8juWhH0Us1f5l6Z8f4nQXUnASUpv2LZicVCjcPhFnvVrmiHeam2h+A7HL/wCvzCK/7meMV/kMiLB/+Tmbvr6jjX7AC4eYhJBdkD6xj4qY2NkkLT1E11+sa4O57adULDKpOxUS3ouZI5XO7a5DweHlyxYjExfFbXT3oRTU8gw2G28JVAaTI3DyDYRauYs89zjmMdxYEZRSH1DXe2tlGKLN4rBpprAh/x4hi8V6oApP2uii0i3Pp4tgDdlL10I12fuCUkLuyCBoshheMcN5k6wsAuA7+8vqWpY94MBXfHFYv19gaqpTZxMmxUFMmidXfY/J2MygBU2DKroHyKAmpY/g0MYOwHFyhxaLTh77HgmxNzjjBT8wZSTHDoftOjQdQqwHN1lBSLsMLuDtzyXkkQ/IaJ4nKyP2oD6FwXNlYVlr7T/DEYV0DmOq8JMxmcSTukHCGAYlUnawUAXA0r5lvp/Gtqd0aRMPgEmUB8nIaAamhN5WBL2K6E+mGClcln6dyTfQbnuRBIcjyVz1wBaLT2DtzRXguMnQbtg/rITiBgIjuXONbIokLUJ63WiyX0+JAAO4FX5hgAPFYmOfytNVBMJEOzO6EM1YZLPR9zwcxNOUMra8bocpY5IRHuSiimu2NvGlJWNbZAQ615JDbqvNLE2/bExmJxGl7P1dLcfgz4sd66nxrEUmAC/3OhPN8iyDFlYpFJkIVMqMZJWd77Nzpcgp16rM8A9XI/jjmW8yVvOY02U8bxJ6ZVHBJSMgauvRyjF7JzMzVvr92EiJw3I8aCCJPzJdmR6VzLhwFBSFgSYzTvrTseIlBbkXyAgQ4QxX0woEywXdBjMPajIQFqRPDKBBehbZyAch/7dbuHQkpqiY6FiS6sSJBeeykz0VDv+dQ+bFmsSAAmb3Cwxr0lsBrg8whCHeIewTMgIZBKYJLPetjAOJlqcS6mKc9wSG2oA8H6zSD0miRNkEG+SubrgKvhkShvUWRHX/3VvIrY9yA5hcFxfFY+4EKJmK1NbpFmTsD+PCz77x6uMDyg+P3l5SmKZ+asB6MOx9yLS8aQXTGavv41xutCGjo3yLpYRIrA+xyS9fzi4T4VBbwygOb353MxMXiBWLHXCRMf1TCwLpA31gYRBF4B0wWtfTX+4ZWyk21KKjmSZQdVXEGcuEywYk4mixeg/Bdpn92ddLvR30K4B2wALqu6HrYCwwm3q6VUxDfSoH4Pq/fe4xlkAuXvC4FQdmF1Esl1L+L1PdvbCW1QDSR7EoD8FveAMbazEhL3l88NYBIiwgyXJKGIPWJ4J/NuvQBsG9nwPirhHsWehFl341Q3/K71YzsVBbh+hEyyCuSd5hQAxU+ykSkReBQ1TAwjwbraq5tbn/cPQN0fsWBzg/lSdjDcDbUA4H19rPC+DMKMu2NHASjjqhwjxTR3R/lZiWEP7XHj4aGF+JzsAgg1mJUo1ipAECnHzYHOHkBJmnenJ68C4RNFOeFRzGgS/ShzHuNVHgQb3XH7KgB51ga1Guh3empKdBnUfT3PxX4EsBrgiP6OG/v4zrOLLPf+YHtix+to2Z7y12ppTRGpWMLQTF51h/nnCxlN5ffeK6Rje8Gqz2Xu7uG/W6CdAHKs1aILSShL2SN4x3g+L9yWz7LXVbzEWn/9MaPzdKeUZ2IY0Ipz9tr4LLZsFkMtOlsStT1yKlCi8sb/fehmHhNfihzEW3LOSH3XCIwi9wt3x/T0debn21Yg5qftAurcw29J+jvdBR87Afw8B1QB618+Ki6mv+3ziPMF5oqZ6+XwKOLHmNyUAEwJuZNBP3zB8/U4/2VftZ4AlIQX6b3VRRqMNq04tOZFgZFx/zN2qA68DeiqtdNxg7B9YBEQpI+f4gnPgoJPTJnY625cXgJXCNk7PouWKXTfmIcPHI9VWAlECh8ZJY1p5f/DYgaLeWIZg/yT3w2H6LO6d7enrLu9GSEiCo0RY32pxHW37OZ1LN85Jm/Vih1EDr+k/PsRC1mQI4gDRIeqoOSJb0corQDYrcZReYesMrY3aEjJofYCN8EOZY8sTpis+ruAuQHT9BgvCbIjcujZSTqn2Q0gi5MGLT+pXB+ZL6WiCGWZHSuWh9yrsps/C8jTiVeMMZBSWBZjEUiifuIsjW0dOwPJOXJ2wGjluIynn0XQB4iRmXm8ZlXgLGJqjEvgVaKtYxUCzTzXhSTObCMWYQKUP4IhPLcUcnMd1JBfpELUIklGpGKBJZtdpUEaSPWAKCOww9cNay/4/lH+qT7ufEfH8G9y/MIrfuEVf3e84s8l8pythjsX4azu+WygO6qQlFDLxdCgmbDjQQ1DvhuIEz0D05SyuCMwk0Naiu14sSFkOf/syfJ5DKD4sw1IsO/HS4U0AedO4lz5G0yoUoN44g5mznUEWtU1pJ8V4Nm4y6jWcWOMgbloxgoAW2YFVuljAB24kmV4bJI7kjSRDuZ8A+dwuSU8hrKq6lcV+2xI6V3OzAF9svJsHuBDMAeSreNWE9bheMSA1p0LiBRbi03SE1DA1ifITAnTZQGmj9KWBIidqBv2CL6ytJFigjtjr9DN58KmjLwwA9z/1pYHYQlyR0U7JzXaHE+8tD9zs19+LmDvcYxoN8+24WwTFnxlZzPgUpvwlJTVAQ54oYCWlN3pCj9n3h6rNg0gmOYp92MSWvKO5xWbsGVyxe+fcY/zN09DS2BjeLO8ACBsUaNY6Lj2CFPjXedR6gKuDGrcItgG25wTCAsWG+dYysTsaJoJNpiFgbIgjCBXjA3D2KMKwtNSpqk3jgyaucj3VeV56l7Ibjx1oVSFJJM0OueqvmfwqGxlMnPJhSx8id9Ufxmh2WwBUgiTGhNtH6kA5cwfxeZ3CB77xwvQI/6EjwcLwGrAjo0j9GnVWn7gjmJ1bfKOY6cEFgZGbGgFtrhCZQPO527CdWnG9U0Hvt+scEuZmT5SjhNos2Qc7J9MLgi4BNgXsgp6+IXFt8V3CloaMRITTGRAvebAtXttAoDn2BUkuLJLlNKUMT9c6vOKWfhaGqwPe2IlucH3wSDrYyETKQ3WjyB9yEQcrjtARYnidM/lZ+j/cnxRV7+7MQj+3VmYHQqNQvPtAyPYVsliWvKNDBQN7Y+Wa9VwBAEDEUPk3vpRv+fxLx74EBO4uGayLorVZKGtPXPvxJMdF+4YQp19jml+PAM/Yk/d5Zm+F9t+YFr4CqoxqTHDDqNLF0CCkDII5cV38Tcv31gjQFm9IDvB/OzS/MTU8J6TgS03knUlInAbb1VgsiCIlHxQzgk7YhQ/PYN6T0Ilv1prWe0V1BGOzz8gmkzIYHslcw2d8OdvVdGhACsmUgRnY6/Cs/yGxn7UlM8kXUCZAkF4CgQjWo4kiMkGg/pk6ifwc8ZkiLVSVeHlMZmSMoJ7NJBe0h9u8M2EPiDMuG+LXRkByFFH/G7Zrf0IwojDRwT+oBSLmWG5FaEkr2UJpQ9E6Kfk4675yb9fuJySGO6SCEbE+wSRttLvkgzs2GssjaaflbjYGMH2ZQwCp8xLme6K4lEG8jEiGrvgnU1sqCSzDXJ0yuSZZwoxgyVNlmHsrQhGeqwTw9/J0wLgSt/syPYj71xGnV18rc+OYEA2EJ2dY10U2fXcbRqitHd46bQUioXJPRDPXQCVyXxLEKDBiLU2JXLb09RAoEFEKje71gTkCw7e91u/AQGGjeA7ClYAHRwfuZY247TSrBfgINcNIP1JdKAUFXAU25KkN1yxwpRYMXHHGFiRcM81CY5HrqocbGgftp6v3DMyvsxi2gkaa7KHyDp3juuNHd9JzyKCQn1VK5jG7ukFDHSscfhmQDH8CfGeHz4fqC5BeMSfXjHoHPTYYB5n/H0AD+t7eUZMW0Pexa4AJQbEmNuLLFiQDm3m/H8tcr7DkfuUIiKcfD66SvZuiJafERDFNGX2AmdHSWIacGIa93wi7xXnkeLMrZ6jO4TMBYiuGHEr8K1AW9m4Nl5ypz38gDUm3BeSdAdPKSJuiHwOD0AEIz3WZHPtFYFbfjc/IkKSg8f1LyAIGelt3PePe0R7GOdYZNyfHXgDIz2qrw01Eg1Sdgf6gFpKGNkxnUJ9BUfHRsg48riOAmiAqn5VR13iw1TX+FfcU2JMnOPZ4aKY2cWLUSM8C6LsborcUPhTAwrsIMIKi8zMgwZGtCamPJEZ42zeXilSZHbDnOuH2tnRG+cv3WVJUmcTLEQFuhTrfCh/+cHikkeHaMtiyYtM8UtsB1R+BQDTH0dBqYsXfuBFYrz/82DJW8ksO7zmDOfG0F1rIUkR+Uw2hkZcmqomAtz68SIV6vKApt+lfNUelPGT26NzxPGJEVJkJfNs7FAQcG4lmSOJrTajUOibg0Yn9wHp9b3J8bvHqRrEqGAzQglo747XtraqzfAPru++jnh8Q3SDkRL32mWGkbGzUs7V0MQnF4UoiRBqQMoBjiIf9zpB4i1ff1Z3G4tguadMpJQ+93nlDeHnLfCa+JrEtqgWazH/Iy4oILuJT8O09p1Cw9wgPqAiWLM7SLIYvnG9GxfiF16BX3jF3x2v+I/RoR03O1Phsx3WYoCn9BvinRKsjZJxeskWDsmmqFLm53hsHLHby8HN4qjAVQJ0vKZHi6HktMqryaSBr/F3Uls2Ai6hdJg7cA8rULkDSmYQ7gBEoanD7AMqMxKI9fJbZLEFSGHcpDhBumSwg81E1uchn3UwOlbsLCkTssdHXbvrYiv/cRgCgAYw9gWNYl62+ZoCz/hO8U0ZO1FOapHYlJqZZ1lBjQrWD/+IIEAAZ5cIjmdhuqqAZ0tLk7cMNxWQlYxDr3uZkjya4yhey8q7C8UXP7wX2+GowHXHRDW39rB6m4MLlQUA98yN0ydOdmgHqlkQHXitvcvLvOp5xPEfAgz19yVe4bZNbvzuOJLzfm7uO3yE2k8tTXITiBNfUeBJhliOeY7vNdsXgUxZr2uibxdBhNr3o5PmvEd9XRyvS7vbMLFAJj8OV2CfOvvFTjJkUHsm7znvlzqkWkYDAITgOXj/3LUAtOqgd0Xpn6vCovsxjxt3+CQxiuBjstyN+FmRkLRgwiPx32bGDqqVskMC00VZwAzy5AGEqbRvwRMCUaU+vCrW7oD7Eq1APQHaWxRa0poOOZiwFiBlJevG62UgnS3pjvlm80pjrzkDccQrVwaqR8djnr95J0JW7FHKnKac0/Foa28iBpeylR1QbX2VfO39hmQJOxhg2zdEGhRUtFcAIkggmzI/49XenXtFar8jfqFTaALkhTWIUCrSEvDg6x++8S1CFudo1jtJZAK/kdY1+FyAjbwvT0AE5oCM8J+wiW9pJu9ceV8SiEs2EO/ZPAD3fnZ5zw2apI8itzQr3aAhpwJIXCsDrUiO0ABPSvYajoRWqKqMMSEJNNnCM4giwxgIU3Kl19YkN2xNSiXKB+AeqLW3pJJEUOjI2Fge/mv+LNCpFAPEIfZnXOn/9vFKDkoNZz08ipZ2bKR7NzBWVR0Faszk2LL2xASgCTDLDa6PjuxAMcgxP5KsYLAYZ2qhj33MC8UT4jS9HbqL0VxJtgFD+c1cw+N7/QBHJPzspMHEjR1SrV7rfwKFXut4JPllNn7ex+g2d2CMGbHsKB12gEQJrssgcz14eIwLF2T1Hplds7dE14JrdS1kf4zjLmKHOrjeq9TYFSUXN8GHWruiG15MKiETU2DSM8mtTd+tNkYLo9t4Wnvjkg8szzm5GHsE6M89TSpe432NsWTHXl9d9jhWO8SY/A7ZKcAhFRvu8JpSMeyzy+5NDotEXwRY9qxYTo8CEuPEn4stR1eT/Owr0LnN68FiIT+XMdg30oMpzbRTjipzg59VcGl0nGN5lrG2IhN2L8C4JL0ApDyJmwLqUVTZKBMnNOCuLwzpVwk+8yfSoYRAZ/sW9HfkYRVj67C6b1nEXpPy4YAwd/gJgYpsMRihE9X9he+4R03oC+dXRD06rn+DUDGB+uwW0QDSuc8a3CnXpUHQHCOATt/wKOQrDBgCHYIs9lG684gDAkjNff2GkVwXr9V+HuODBLEsHC7cAcqaIyJCrXOhG0pEGimPIugfe5Nji5b/DYDqAGThKN+V/seK9O6yY+9AkMNKv0CBs4Apwn6LE6QQCJ4jSV6KaSzGs0shx2XvpWeRkUDNk/fXnTLvEXAlfDeQYGEUaMgGQBdAJ3yE38wx17l2UuY7k2N60uUJRCx4jP1pSY5gFwrHV2InMa+LNNhyeUkiWXLDUlZPdpEzPqh5GoSOkFIXQ0ozVVjovd+xML5i78ku6BvYn3XvWu9GI/lcsCxmeecxFx5wEVCeNAvaNzxizOwYHjKhmzJmrk+C6wCm/Yj7tw+Iw+C5N1t6Anp5GZ+dmafB+vC0RXBI2DlYFvEUh8TUX3+YGGxEpzf0dcqXPQFwZPI8fNZ7E885D8q2hk6Ke1RNOj8zfda8M6DWKpKQf1p3ZAM1jqTmm8d+tuv8pOIj2E5rL8bhGc9FjmtK/26PMZXbananEezNduzjvGMiCC4WbFQDA7uzfhC//zz2v9d9a83ny/3dhXyhflNEmJ/AKXmfU94VO7HMxHggBQRrFFDNHCv0H12dRWh32BDu+07VJhJWJ+DfnCdjYRe+OQrP08CjVJ6l/GtqzEiNhHQqGSlG5nAWJibCbYW/taoY3h3Eh9eLAGZNWgYQZCiFjIErcjk/7pXaqBzjXY5feMUvvOLvjlf8KUKYicTP5qg9qHmcrd1AVP2OYP5nkOJVX37Bk3VfLDzeSDJIGkS/Pat+3/UAlz6pHYoOIIdfR6KhlYStfFjCpDODwWxDZwLDAHp4Ag68TQy2ghXjrZFIploYXMuMqvyNuR4BdFh1XZjwvJYtrGgJXXI3eKH/hPln3FQmFiQWxiAXi3bzs8KN2oQFoxb+lb5GSyABDigc5l+xmISvjU98rpwmE6abwethoikRQE1nYK0KPEpq7XeyFuFkhmhUoUuzfWBhYtuGCZNWF8Fjt6VhSiPCHXtyE1orPZRa2gDix1gMo+vYWMiINaSGpGLB3CF647c/FTf47x9cKP8YcNEWKAshq8D+HYwFyKrkdYIdNNrrCFZouufn5SX4i6Hchk6RNLByzvnyeEnQy/QS6QlhwXLJYG8eSQCXqGZqr2ZSx9yaa5Rh3nDFEkrdpc74E0wIAGDLjeGpHxwAQ+nBcjuqRDs8yoajkZh1t/QfxktwAgBX6nYbmeT3aLkYnr9z7ojwOvcdyU90Liq7AqlfPkr67/uKz+Mmk0lC7zWDAp9xRjRMp2kzWHB1zg1E4mvRxp7F+B2dBEyGVhX88/BMpiSJO1HAtAaNENJ7E+iA2A21FaRslFP7NdlfGKHJrMleFUz7xFsduflldBuBw7Dey+b+rd5eTGk8anxMLJg+AwTWY59KYP1kFBHsXL4hNVMysIg3xKtWHauAp7+erAaPXhJW7gnJhHN4g7auDNBynsY/L3zWOTEZc8CY0PjwkuPZuvCd1xpMb3XDNMHEYNBWSZ3FXNc6f96zBY2rW4rosuB3PgW49hV7H6roatoAopTUyyim5hUBrsrzCM4A2Z0UkBEsgF21Blh6cGSxVJ/sbBSylBDnkl+p0TUIoE2eo+va3YGLANwyrp8aPjYp/+BumLqgKjBbVZhNwEa21KMc9nU819iX4QGygPciddOP52lvpBXONWa131Gsj3cAXADX3ZJbkh4nelw75eCAXFNEpDTj6SWTTHyCLbVNxTxKvzoXgtMKas67O3XAR3ZmRqykv0FopAeX9oOk5K/Q9D2WNlPHTlPYOGeTYE/DoWBBhdeXPk3dSbBlYIdmQcaqA4KRRsZY2FNirwGmKqY4xNjNukZ3bdDaOQDcAkxmAGb8u4+QEfYca7u8RAZ2zZ+ULXO9mt0oAk2/q1yHDJCxYW64RyaZnKsAcCHnSbL8AoyJPYU+EnH+aqVkkAUw0ycBBHN67ewAd30A4aNQ3p+D7FP+cMS1a/FcRAAVwNpzlNchxZgcMg6pmWTRjmJFv8+RIFr8VxFrFqyKRlqvP4swd5JwEpQMcpYqxBXrVIzIdTE9XXRz0QY6Cz/2qgSx+YC11rUE2gztUzZw1d/d2Y3uwyDCbusNKSnw3BcVN5Ad+4fPCPM6ANNgtS6csf8CHLAN3PoZ+6fh4U7SWkqO1xfGXqWhrrEXRK+OkeK9D29FB4HX/N17Y3sAo0NxmWBKdE5FUfluLUkoRngegcVOAGkvnaTFFC23gFjmrbjHZOlUAQtmeIIDDoHbgtvGuhweuUEWix8ln8NOC7HM6eKk9sIdRMXLP5HF8Czs38Nw7ZTJnng8m4TFGP2QWPLJIja8WPMim3vcGx3DI9JLVC06U4ejOpiayq4EwRNPW8ccw+u47b0lAFqL8VhDILtM+awh9LPNQoOc8kyy8HNh1TUKsHBoym75EeeB3aeEjOmbVPFQHBbPn0Ai955pH1yD5w0PpYvpGgp9LCaywHUjJYy2tpG3RbwCOHxnF+jkHioK4H+w/X8JBsZcmrhx2XcDlvifmq8AIFuhWXCwWZ448Af3YPyr7+selUe27/RHYybSXTDb+nsc/wIEuGRgRB5HKSiH2EDL5g2sxzdxHyPQ9z0WPiLlNlP4elansYhgbQJyIsIlNNVbBwfStR5043HHU5/wyJlKnt0Hdj4ro00BSS4pc0pCztsc2amM3pcAkOSYfkqZq7jDxu+RV8T7VDGX4hm55Quc+LIvR2eQJjb3qPVfgkDE742Yf4/CC4CP2hf3MOhQfNtmEQcsoF7KHN2iAKUQiHQOa0HYZP4EYlgSxT8ISaOq5Rl/BPe4oijLfY/PdtkTiD3FTSFyytTzPl5yhZ90E7bUR19L5qhTcW0Sdhr36e/aouU7tmXCgojlSchyr7x4OyVdBVJKR9PDQx4AfGJmE0AQSFjgIiC0bJYqlOwf9NQxYWcUPL7zp2KIzoi3BfAPel5ZS/HJVhZzHXjiA5qdVcii00Zyi3mfRsfkAMb+rEI269ive6H6DcEvvOIXXvELr+B9/e/gFX9OQY8uipYDOSun5wb4mrxtsXqAc2/QJDD9UQTbQB3HONQZrI0KwmbI2NFQzEsbNNlgozbjHbqmGSypKsS8GEkGwEMuj4y5CDYgESQYrihuwCZEtEByeGprR/cC0tAwB174xsT6MGJSkWGaslSCVaa3wSbTCccKLHx1EuIPfNR3GeAxkHiFvFeTjIFp2cI2UQvIsgpiRDKZaK8Cj2q4H8GyQRuQEMHIzx0eVOaGvQ0YV5vtZu3WNTRB455EwpMlHZE07AxNz91dbslodaWf0lQNMJ7SERBwMcxkwXebi4a0WjnrwjmZq/OJ90DEq7X9XY5q+33psosjXrIjASlm5WhDNTW8mHOXvEN+lRyF3bwnu0GjOAEAwVIB4FiVlw3LNn0vZiQbiWJ8QctUc7tCVDDXB8rLR1Yl2ufFDYuFD1cFfMk0htz4Sk1yG9CYT3om7Fk6D8DNsqUawJxKzdO9G7kBcJqUtox4mkiSMTCLMRbdemlE7rFxScIF8Vs7nlszft4HAAAgAElEQVQEoqm7PPexccfGZNjAKaWSxZ7N4q+qku3kDpcvmBvmtggyFD4IRmKgTIPVL+xcp6QLey3PouiW6hs040UEumSip9fCiHM9hgQAhWUApFZjSdGSK+vtZIdyX4rOhhSqlTbbXuOrxnAy2V5a1d0qYDni9wNATYnVfAsBgZY46i7S9q2Q2iHpoZKeKwkEn/efyQiZYFm4dWBnG7mx/du9El5xP0wnBc8I9FfM+ymoNVC3NngvBLMNfMYEmrqI+1GgI7WE7fA/IdOWe5O5Ncli97rD88ukOq4fd+lnI+ZvvVdDYjLO1W1y/5Lm5CoMp/5+dXB66KL7xWcVgTHGBtwr4Sf7MO67WZBLCK2w2BvBpzOpTE9AU67DOgAIJV/1NIGP/Uz8A0PSX+0TO7pAEtRLUD4DtDEyQU8gNeKEdzlcMezxh/VhxN+AIEYk+HYkHv1vsz8u3Gu4ZsazN4UHUzoNZqehJpBHMQPScr15MiKCKUKvIndsGWHUDOyJiJU6YR01J1srnwfjohtpRBwyH3Bm5MhrnQDkALsAaNhJq+JRyJhhSsrlXZDFboONRdRAP7jOuEeXRXYu70quJLwrzZvEseDhZcDYMs/d2JKFcT+xJQF8rhNjt2m6+iivCI6z8F0xFhSmdbd+eiABVnuNuqIcdgUB3JF5DSAIJ8Y6UN0jxvMmiM58vvuRz9U/MTS6xdYAgoSS68BW1D7JECQA0Fjnza5KnLhjJhA2Yj4drOU3Ocy1kt6zmAeZ1QkO9F7TOLJWMfdFnswVtoFrSEkqU3GAY0Cl42jR7M3oDhyX/i4p2SKD+imz7FVc4prosBq3nFPqyg40YbKe5KBHjh9r+XBPAAu9TzzjXuy9MWzhmkcym3dJQLP0rex8gwIjxlvo65sRUPRUSpgTt92RPXKOPxZac98YU8EQ8mnOfSo1q2UjGeDRfwXRLvYZALVUwOBHWJyJffuQfUdIP+b6w/2AYOPrw76LLS8YtW+WBJPZSy4x9iR4ksb1m3JngvRuZZF2RVFBLAywhT6bj8NjFUjN/lijS95cIHgyl/s3JLm/+kjqa3vC9P1JUqbGf9sGNDzEsPi8CYB3TmyD6/qyQ8nBmmFusVZZ5F8AY630Qcv5SwC25ds9JZzq/GIeOii15pmTeb2ea/hJgtvlk402ifeWsraZ3YQC9R5v12bcswNHeSLJDSzS6U5pzV6DB64AraLwa8lW/wQgVbSCT+I2ce4jMIHEJky0CAWAFv6xhcXKDW9CwNi1zmU3BWBHx+98iaeyMDfCjwmwYuDLlqBucG3jXFVo7HlPPHjOtkJWnH93HyRhCAmFJqvu+9hX7cJpPwBoyf5Dw5VOOucUKCT2MPgDd8XDgS+NTZ+pdzkOHyMgwUaQ2FlF22f9zaNb1aQB7jUtWjQOXMInBo4CtaccXf7GWRQhVieQkpX7cFSB4taOFwAgyd2WUo/+Ub4vM8B0gsjhSwSjEksUsIgB9PxUbMoIH544Z9cHcx2Sq8/O6w9odfNEnYfFJDPad4CeULbXIQTdR3oM2lq4cXeYEBKO2fUzHEjfdYS0s6M7x4heHPcnvMxzDd9Oz2YWc0gscZGKTzZ27QUsXF2F8/B8CK4LEAXViFEqn3Sen4OFlM1M3bN7ZM4qcA+zKnIPYSvVVu3YwxxSmGoCYl9AkPPVgTvWEkfgK3YVjvROxy+84hde8XfGK/7cgyk3xuOkULc3AVivyvnP7wIAV+riq5wGx/1Z3sQ0uD0+h2TwpGTHpq6ggNXpTN5hbGkFyxswx60MQghYKDQLUHm+x0PbR+CWh0gvxqzqZwKdIGtKwngNdv4hF8hjMdSNO1vnsaLS/Fn+OzBEtdehPrHSULJGJNDGXAsmV/TL531CLzD6+0sy5rGR5mBwa/3vbCA1RW2ICgI77iBT2B0uDA9VNZ6BBIiQQUeD5jVO+BjqMzkptxp0RQXXm4UFE8w5KfdQQEBWeuVlAFe1P0GkTIAskrkM98J0e8jEK0vmrz9ujTbzikx7Gi5/lTxRZWMvZTp6JqbmO/eeeHUf0gsvch9ai9WLfZmfso8piRsL8hQYkoEZwTD2i+wJX+9ntodFYU+wXTBzUbJIijwSkkFPn5JIygKWTTyOMZTPfUtuTDmm8/wBqGJlh4/EGjAn9r7Dx4PB48cdoFkGYTapW++UEWnJCAAgg0D3cX8i4VPJ63MCnu5l5JybJ09fi1XNmxD/iNZUfhfXV92t56pROP3Gwr44xx6uGP5gC3Rtdoo0CE62qYiEvCWNMvVov8/bVnKDGhtUnPcfJRmOrcH2sahz69TDmP1djl1G8K+vn+xJAlQZVP9GRhpOMPT5b1VfCgyX/gFFmsneSJkMw8G6rqNPKPLyCkIABPMxGJXlX9LBs8EDxM05ZxFkxHWAJqj5uewETj+afTDihMjQyyEqwRok4PYjPBjq7+ebFQEecz9Kz7w0aHXfqaAT526vX+Ko7tYVSczP61CuVxjAi1pSnVBIC6SUKwgamLWJuQQQwJ8kazwQG5SGuuD43UEzWt/YwoB57+NaIiFiF+mDwevQSHakCA/iAsUD2zYu3FgJ6uSpx77nkTybhx9OJHdM3t7nWKKw0eBaJpQE3eJNYi/POVmq+WcXK+bTiLjA/NlrmRi7rBGsVydxKItNS47UuOSIrZMMXE2MqCRnAsb1WDJmjPOvtTq+0pAxHkKil4WcLVJoSu5raZj6Oofi/mzDVq7l3O++6jPmYIEpTVTF4deKwH4jfUbnQYx4lZWm9N504BldCTMARdfZ8rXjwjZ2/T9n7CkGfASAOapDqg9XKekHskKlBqw7E85ki8qQP8RTZ0zB+89/z3xZYVUkFGdHFI3NGZupAvAH57J+IdA8uGexi2dOFbwkUwikQMTjWlxqfmcOkN1d73SofALyhCRrM8a1hmZw+mrOUm/oz55F1lKSSKLKRnV0U6I3Yj+kVMZs2SY/pcQjnobjNBM/12WJdSs9wI5+odcikGdRxVsuLnIwpnoxB7wBK629jlGni+N7oKQXO+F3FtBonIJlBt9Wv8Paq7Do64qFlMs59zMClTvuV11+gv6bMQGlRjIO0iqmCXJ+T6CkuNF6+cfzqb0c7adUNSGPDowqFedF8HPmjo/0J3YHNo3fi/xnx1wWQK8NYAPCnItpWeTYAOpiuZiF13HK7QHPxCfPDrkEGuyQ58643QB5p06LOqzz3CJSWs0pQ6Xq/QnNHczwgvRKZSQVT0zv7+dBcmMqMUQFjx+PZ96yoY6pK9bIlp4zUeyI5VUOuasEsaULQCqv8577HV6So632MncNFooUiU6GSXmMnxFgoLvje6M8BfUcC2PAVbG3137rMrDdAI/CLcKMXZ8Rg02slfsov4vdtAeWFDFPkmIBlEc037mP/Zp+MxuI2KBlxh77Gc/nH4B+BYDG/C4L4gD5HSO8MFh05fdqrD0yxsumdhbYAWDoReb8cYa81pgXMHrCSOe2fH3EMxcWZtzDd0WiaBljxscrGPZXH9UhkLltXtCChW/bWWw+dyeTVVhQSlkhirbDFrqmbfXJnIkOwGv8ZWd2P5dbZwHCy58HnhDneBRImKvxcyu9luSfkBhpBMcjlwG4d6E7q0Wlzz/W50TNAOZcLIpSYo7xmeOu07XCfMwUEMV1+E/5VOgdedFoEvKOvGqMwSbeAnqFXbax52w5VYME8I0kLohIFIz42Wt5FFt7TlaO7OA6AC8MhkR8RPwg3PPszgwmrl+B9OtDyzRXByy6awb2W3VpW+w/9KUO3xiwGM/gM7GfPB9KvEkC3xXLaBGL9jCUYowOGDaeqvh8swLTL7ziF17xd8cr/oOJBqt7+XxrII8Ji8BdZMHADqMU6FrWmwVkceE1sKUWAEQrBhPd0NBDzvk/WG7jjVbFXfJS0bWjTuadsAU02zXVM0nS0lZlOzmZWzSv4wQoposIXO/6fg/wNAO/waoUv/dgpJ53qLqLsm1LHGugmAVlYhlJ9HCthXfiLuaRVanu6ESB5iqDrReG8b3fmi2kE4gWtelSHUJyLPwJXvgwIDa1lOYzaDXSXIuVXwE3byY+UoG5YgXggGpxX+h2//Q6MjNgKFRZIbarF7h5JJUilBq8Vbm46DxIKLnx3d2BRFQ85FWOJM4yUbbSkqcEoNBcWM9g8K8/PsDnkP0fmSyYPztxyMNAI01RPI+/lwZozDVVxSUozXm4VjW6mQkOtp0zsWzWndUGYrUZGRQfTFydY/xbdiUhEuxgAPCMEkcUQDyAplgwLMbchGPG999q2Lu9vQBE+J0b41UFkA4rBdmOKxjVlj8SRMhNwiyKSTFYhdI7Ywzcu5dDF0t3C3Tffoxl0cPMFOhuoBiXyVqItSSZ8eWXpoOBljtoDj0q4WHsdmNk67H+3jKAsWh/mBZ7lizTvMchk3IPoAruXsWkGc9UxoVixc8BW6/Xp3sD0dW0ZOMqJu6/ka0SQNaKQHXGxq543cn/+kNC6k8j+Mx57yadtEgX/6+cH/75Qo4YB4NclUVbs4PZkoEhyBAxM1xLI+k2PPU1ANkyao1XLK7yuZE79bPrGigKCjjwnFnEy2CNO5pEgJ1DecYc/vmBPELy0sBAgT/YHa/ZhbGOKGBilg9H39f8F4PqInCpAFyg8hvMDE9FEEkO9gMUdyxnbUDaycewIHCIHIyYI9p2hQcTNNltJkexA6sZcK6AOLiTZJzB+MDRskjsHIi5piyCE+CMYE8NlzF4+gYTLAGaUeUsaDsc26yCv4Ih9Qs3jNv2jT+Qb6iaGd3N0cLOk3kGCHMd3Qp//aE+mbiVpnZFgw0qOCoG0Op27H2M7OfsdNCQuXutUyT+dhb016A/zTTpAlIkzks2igDlg9J6AmiYl9+C2LiYBLv2/OWMsmLCFogggjuKEQ4KeYsIPm/FPeRlThMA6HFuw2IPio4PGQ2eONcdP5I9WQAmx9Y+YmwRqRgvZXLmDk8+VXbHh+Y15VADfM85tQY8dPXnbungBD/FBY7sQo3XQACGe/FrgaF+J2KMDUCCMNUFRBQoPWXgTjDdM+kMXxQPIELDWSTvu3c8M8JXJr/XnYBQdXHLPqQVM0ackGCsQryAsBEStrcD4618zWKfEcedBdEEEcKWnnFdL8xX/PuNs2vmMFGPMSRLS/MeAPZgt8lEgzM98RKskZJlWz6rq+nfEbP8osAbx+mCWujLl48rIWZk/FcAOOcqYaZRINiIvSzn4HCJHEODtdz7JICSGx6xb2RYU2btrjU+AMMVb7hFozgJfGTXyr6xokNq7gAujqKby8Qa7Zvr0YVUe6kYlkxAen/jHJIa9zjWPYm9xqpQwHWDv+/YUby+LLpXVJHgxcNiTu1eS6c+6HcTkimwlDfms8s5M4bi6bsUBe4oPugete5sBXyFNFvu2fYBRJf6AOpZIKSrxW+8VbctGNPbuR8lkx6Gb1kEt00rduo8Ul/Wu2TeZyKuL3NBq/hv+GIsdszXKYorwKPvKGTku/PzKcVa6ijuMPUoNmt3FgZ7fGNXjmKG8BTjdyHIEP2ds7pcW2sHzI0FGHvjBouVeVwbuEeS6O763Djyoq1J+sTL52aoqhRHbQHwB9xJmEhYZFQMrbhDNi4BTIBAIEPZXfgLXGGavhYpuzUhekfspJi7z5GA5Fed9w5pTQC1xt3q2HZjKN2sbkiRXcwN4hMjQLl64qogkQZhM9DFkMwBH6kqI1Z+ZgqukflegWAL4PKNpDETEzQW5kBZP32nApP+DrVZMcR34jHCeAdgISFjOPNHECWsYv0bL5BN4D09voZZFXBSVnWpVacYIJhRCJSV+ZADnp1TghWx9koChEpZSgALie4uPJEE8avm9YAF+egKCVCMWZ1kw1reLskTkEd3dalDaIgHWSN8O4mzAWB3ShXmc05qdXLssSrGplhrSts9YMZrHQPY22C68B2b+p3KJyC5QETwY43CUb5z/TpwDxGt/DPn5JpShKVATXkuiTHYhRFVeRJ9olPlyJWRxV5VCEbdLzPDkFmFDFV6P7LjuOdGy+gaZEeMKBbryEaRy32yoCZdGdgBhOeh+fuSGNI//8gq+IuPX3jFL7zi745X/IcCk+E0t7xzoCqwfYWURQ4iyjqpKqYCK81VfdbJVpXwZBP6xMbGPkzbkjHLxAdAFKa+5FjMXoKp1xbph/dmYAIgu6BKzxXNZvAnbK0w4rtfAO+81kySyOhTegnZanA/EpZshNv7rk4Hd8VYvx1fhtC2zo3qs9ihKS9BIDc+sb20o9Vv3HJDVKo1GLqL+bRhsbkCV0R1FwQj7tstGzuQcLXQyddV7fQiOILB7JoikMQkuCOEJPAkc1dVQypQy39hDMInuPPzAo/iXC5KC16Jj/iuIH8aN87n0J+Mhh8sVlYyQF1LMrNoYsYNl4nRrUZN2zc6+GytNuf2KzuJUx2YZ2V/YJbE2612zKMMTLU74wCkxmsVowKQYqFp4oFkxzEIf57mgQZcKUMZbBYmLVf8Ypub5r5NRmSAX95gYX7+dzXYTPBKi/2Y8izbvNuY7V8HUEJ2e7es05MD00uTGAp87kwSuVE8o/U4Azozqy7K7f+LuR4R3GsBZPn3uax2qjUN5r9HQvQPiEi01uYzsyqMevhSXT7q+UGEBR0AI4vNUazjHv+o69aQiHyaooqsgyOEjAcyCC65q/i7N3g/gFpLplitd1hoXwpLr6mBZO1Pb/3nXFYNAErb16IVHwQ3IyE++qzf4pj6YELqBNXaLLbfs9WqeJ/zR+VZe9M63p+AKt92BGyHdwTAYNtGyktSGxhAFQ1HAVKAQfAVgaQapSXthVkVY1ak1sWX/UjIhHM7WKQ6UKwz9HWX6TdwBO95lUwquEct6O7uzx0SSwUIhLcH3PCFZ7nEqT0Ap/noNH7m+dI52fd6z9NTIDzZDMe459+W8nezM3CW3nkkh8FAJmij0DCZrW4Y5fUAgNvAcoHqqGtTHyyeB2mizGpZqYX6gJdWep6/Y4Rm9DCuW2aUaXnWjIlnhQYF13Ag71Y8k2tZJ5qiEPWYYyPuy0TKub3LYXh0XJCybbBiXC1IJY84xoyCc+yxrQL3ZjS2LxK/IxJeRNyE7/BKoI9FBr6LgRVjMCR47RXjZXHB0R4QpozDyNyKH/QHUp/fMWpf1dInHxC/uL6PWCkdQOyZS3az+7OrSWL9sA3FjTnbKJYS6Vw3RYTAV9yKS0d3ecsNlwlRKb/JS7ju2J263T1neFq79ritQrJvkIgQceZXhAXXvmpBqVgLipRVGQB2gCkJcqpK3JMNGqFzXSlJH2vfGJjjEgL1K27ZU6zlt1xLMgb6ZMgWoDDn+Wz2a3aMLCsghvOpkyu+4YmUiFV3jEjYCbA6HiKHfNF7HAv/D7efieD/8b6IM7IpS/ZJQercyhD71LAj2T4LveEbAo89x0BRnevIpYBH3Dd2B0h5XOTviKU8JKWeskQ5FuOe6nDP3K2AhBGAhfS3ZXHUKbnLvUgoNYKU9o4xcADu6ZmrpnikhFDIrPu6sWsP9ZJbZLhCUtSK87+uAV/5/QPf4cv5UWPtiWHMI9YA7mPecP8aDXqMibmicJNST2ZVxAUcwzfMSGpkF8OO4nl75PohHSqx9zCUMcC4V+RaSYt33l6O94W9WYTTofA9Yl1u9nCC+vCQh5YmFFFyUpDqILf+jiv25+xA5B4dKgvmeDd1iGoUQvtxABxxXv4D1mz/zK1cX+KsJjVmXFH/EzKlJ8QHXC5AmYUr1kggJ+97f7kJuhgT+QJz6I7hq0jeV1agFXGD9PVhDvFAzxGB13pyF6Va20dtCOd9vBsAbPQYKU8qoCUAbeEz1qLbvvteqJYqRJJbxwZmSakPbP0nAOAZ++EGYzN3x1yMgbNTGTHO8vs/TGCgUsaKYHIPSqUnlHnlpr4BgF1hOwo8JkfnTN6Jp7J4IAIxYGKH1zH3DrPY2wVQndDN4i3/ZlDvTmZ+R8bNWYBj56Z5ShrVL/N/HUiirgnPP61SzIzKFm90TFHIGPARxZLcn91K+WNutP+kOty5NuWj0cAz+B5iF3cAl/GGzluqeDuKKC1HF7uMJBFH4s//qn97JBHAGgtxuV/yMDfD8FnEGvJhEkfbxNiOx7BLIp8nSyKAlJ/TcqVMH1drANklTxzrHptS0O612Q88a798fAuAlnijdD/vAkBshPnkJPki1mLX7IxV4jy5/cacfKzOBds3flYBZkuScff/Z+/NliRJcl1BkKrmkX3//09H5lSGmyo5DwCp5llnet6mQ1rKRLqjMhZzW3QhQRCgVFlSDeUU1C893d3dRlRLkfywCw8yADnkZUYPH/fR3ohJbwRey9j4K95SYuIAeJnTUzSlSFBzSs+xYsIiKo9Q57D2qmN5YvIw4lNYFbPbxPuBA/yE4x+84h+84r8dr/j3Enk+z6CPY+7q6+QwjmLFJXyczeOkQf4AFfTyDKedHECIETmei2NOvcCFkri7sqprlajo/PhmXFwJQDxMOv0kR2UGyYW/On0Mjl8EEtTk7QDWriSiqpzAqurfutlVoAAh8JBmAydKbIO7YW6aDGfK7C8T92OCZhwNxxGADT3LXUWXCS/QJB1THSiVBIYtJhHGBsBrZYMdZsaNqWVlDtuHyzQlIlKTYiOBlp0ZGsCssrMe5Nhigh4GF4CcMBsYxVYMcnPW2hjTzu8GWs4MVu11GzUMr2HdBrxwaa82VOvr8vsR2D8MaUuizwLmExlBCZ6gNONPIgMBYhA05/TB3o7TBcYfTJwiEoGmFnJ4sIN6AwJw7aqGv9sM+El2S2myh0m2BBUUoQsGnCPeTOqaqW8/RpJmA2+1Zw/NC85+gYK+MTSHw9Dzrj7D9/HTiGaGGsrnDHYYC1vtsMCU3B4/jPqqR0bzPbwTYlh0YXKbuvvMO2HcmJgaV2QQ8Lk1G84GMG5tMhtuv/isxMZg9xQXwo3AzkubiIIA/AsQU8oDzYTdo2T1HKHg7Fc4soxeK3B4neL+K7m5S/MEe28ymvxLidlCVAKroiD1pKvrCg9GkQtssWafWQ7kqE2qtI055+FGo2KBCnWfz6DvpxyBwFcE/qpAxjT+sLjRqjDYV11FxTybaJ0JwKdZuvSd48GYDD0Tzl+ajtIqq/aC2sR3d8M5ohOgkBwYvTAqIY5joKoLrQSeIJI3qOTqlthB4A2ADJwrvH51EoEC/mL1epzYTHSNuwEAbHvBd2IagS92QBhb4bWXbrEGt83WAn4yOatYS2pCgWUCJ7Aw1WHoxmA3M/E2h4+BGTeG4OwrBlLsqjKzv83EqKFfoJWuezGsBOplJqVkBKCVrNivCH4vQaCgwPpaQ8s8E8AVZBCZFhx3h68KpxwjBmYpbtoBQq3Ah/30fnMVW4A1NdckKRqRsPwXyiEA+DneZgVRW3B9DGexpEkRIHTVAHm9+yqQi11v5ZHywb07xIdTC0/B0Q/tbY8uYD2ZXR38w3tfaanTZGdqpgxjy8ukSA+RcJFdFoBfJSNckmTI9kh5JY7/hgGmd9kFLKAlvkgGcw5JjZQrksbLWZsX4EFpAzPGPD7rugfXZTOYEZz4zg1YwqeDp6gEUOtPHBbeuxL/zPaacZ6Oe4W/8FJXR9YzCcOen4WOJ6Ox/t0krse7ZjI3GtjIfNPDxh1DCZplAA5JOOwjk1gfEQFswxgOsxfw8GVgXnACODk88X4KV7TvQ1KBGH8Gmk5nYsI/2Po/4UiTnHGtG6vW5ON9yJ+rc0yEvetRXoqcgCSKUJJ6iRP3dIyk0WE0BEayNvDZLV//vZF2IaGup/NpvM7wjlEsTwzrnYQeKZVt/B3+nIbnOx0Xzu9a+Qnp9VSXUKkgVKfApT13eTyKYt5XWCttZBKoBpnsM6p4s1kwBnp/yHW0+JfIaQbgPY6/w1j8m2mOW/NqRq3zQElvWgLfF5NC3zUvVhc1eL5D2DKA3Z5F7ttDhCDrZ03P3IepcgHXj+d3vBAGisGeeHWG7AbEpkRNSKnjytHg+zGodsw6V0m3mCMbcAiEv5EqQ5Hk9PAb+SHH2V0O/sC9d2Fu3tee1vKqZ+Q8i1P6y85btU+hvGKfe5dyd8sDTnm051g5qzxrHO9nNdlULvTXKQr5AbLSCijOXu83vAs4d+VbMKRkh8b2Jspd2icXXLJAA8+us8rHeavHQPyr5psCnLGDnlwAQabO4wHbIib0WD/y9ui+HGDuyk0AbBaNhqmjMYFL3VxvCxiG8I04xbBe74HEbxamAGSWskwVtc7zXZBvUpy5dnvgS6lWDKM/iyegNXYMeW45FVduxbU7Sdh4qTvMYMgxgb2F71TikS0H64ieoru7SQxr8r1c4Q2OO6LXqjOSf8CRLK6sIglVAd2e3WM8Kk6oDqE6RgK2GV9sm7AIjFy9f1xBjzR/xFYb3iSaZwxQ3YXrA9hxDI2DZYVblJxr5b+6AXU2v/Zk10iNKz8gOPDs3oNsPI4UfibzuuoUiXE8Nw+5XQUwE9bhG7H5bs0MN3bnD8gvDHVOrXCYUZUoCpMBAWReC+Cb8+MbiikDneMuO+tfdC62H/dmsF3dkkM4ZoIFcj33UhqquA6HWJFT/jYR7A4fQ1YkzAFnDtwTWm+mJKBn58Bhv/Gyf0kpoD6Aa8UYJAm3KI7ila80bJMHHBZiXB/Yku8ia3zGrZW3V379k45/8Ip/8Ir/drzi3xeYiB+TFemOY1S/etBTZkst491m/Excol/g1oVbnCCZT1m8trgUIGtBtXrpug8t7rMXeS66WUG40cT17dlsnABNkuuha4Ygn4ElTkJtMNy7GBLA7S9KlIGt5QC1qj1NSashYsHagBIE3G0BGbjHS8m9ozTld954VRKYaP37PQNjn+sAWCkl40XScLUY9csxQPItl7HNmM+IG/xGHFTmUVk1iDG1gZBmd0oWLIHufsgcGLuMrw8oU6D+sC/suGGRNA7EhnlilYH+OOsAACAASURBVC/NHixUAkCexYrjRd/uAtigFIChWwk9JkKTzvA/Z9S0CZk328uDhS7LZNCYibzfP44RNMJPNyAqeOGcqGuN+IUR8ZBLAcJeXWy78OpArzt9MrDnAWdOwnPAse6qAUEBM45BFhXZxhxJ6ctboJdtvbM0hMZ55EZ2EvVWS3xqhtE0fAmMq3Y3swtzlUF3Y23UNN8b5rNli9weHZN6BpSFILiUkjnYkpAwM0xb+JY0ZS6gdOsMiZ3lBcd7mntgeSUmNDzmelJriR4YZB/eoNqRX6l2U0pein1ajCj/fYwWx8BYTdvuDaEk/lb5IjF04jXdgOm5us0usnN9TGROTevE8H8hgoz9Yp2/cx3Q15jIhQICfvjRV9/VDfccG2UemWTCextoaq7a+PDj+gnHTIJ2bXIudqfn9XFvf1sN/gjWjmAVD4d3cv9kA53W5ziSgTHIA9Z7YLH17Haplm++y+y1kLI5TEhK0rSvOQpMqsRJ58IXiDsFrIEgwHYBUDfc6IeWEFAyjlRBfwUaPBgl9ZK610z4fjfYDgTuWs9tYZcXV0m+LsfMq0EdH9L/zQK9C9Q6yTgyCZyGno+S/5xB8ABnC3P8wpFrW832ruSR90FW366HB8C3ivJ+NXvZQY8O4CSr6bPnDYlWiyUMdRY+vRfcNl4dByuovtZJZvyNGf/qmIZF8N3t/8W4Mkxs3yoGDOwf5Gvh9ibg3c88zv83uHnG9wkoHYHJGlP+hr/5vNvyJdFr6QCOn5Le87YA5tS6D3TcUolP5tlA5CzEPaySFQOcM4nrpbTo6+pyIFWA8HS8JRtV+w/Hpa4lo/0vGlgCJQcYky1ECuCfTJJmjgbhtiVGBCVU9Mzod6KECwO/soo9JFOYAYs6YLgHSTbkcj/ASisJ1bO4kbnKXbgkeSi1p30vFhmEOIAB7N1d8mGBI9lwOqs3uL65+5nzStMw7gZahhl8XwdkA2D2P8wBjJ857V96tuoyT8MegFng5TfBG3W+nfWuwKEp4AaIVlQYyPJLzNfpvMJSfDNb8/+nHBYyun90aQOP4h1/CchiZ/Jbz53Kn4oOQb8mqhLoWw8CyNNDjfXF0pNXB0V5k8F7fdqPT6u4NLHxVLUoIGLnef8dF0Q2eFAFYVN5hSSVibtuzEplQnPNWUB7aY7V/jO2owopwEmu70f9sN9/HjUK7g/7FMAU914a99wLnyQc9XvV/RllkBOnGDbjSBGZDcx8yvJsgooPMuEqP42S8Y6yeDd5AH2M9H5f/OqAbbDPQv7CuDCrg8uAdO6VY11I+bBRsTQAD0wBdHoDCPzhsdPkLsaCJIEVWEzQygC82ic2unD/U46WEK+5oKIJu/QVoyXXa8PZz3174xYTgWV4MMFPnKcwrGO0ihXSzhh8hWELNOrxN5+g231mVp58qudboIvMHiSUbvsG+py7C+oj+Y5C50ISqikvv/fQVhYJeCq/pp9YZuJBf4c9/JLLQ6PUW95muOKm74P/HyzloRmk6rJzQGsAZksFbdxHbaWeorZWrteOIXnLJeDtla61r8ouD58psFC1xfIezwKN8rEmNJvAzngQQEDsYikXHJt51I6NnUM4x298+YW9FzInwcxHMTJswZ1FeCznOoHjpJbY57nyl/QuFWv6PgC+JWbFjq4OMzvr5k84VqrYmlPy8/z+yKIfaZZo/JFgfGTbAWGCVYxNdhC6T1QX+dtFaq7fBedykatHz0Xg3R1M5/zXcrS6SnXd2QJy9V5R8ZjnJM43gPalex7a3557ClA6OUdO+E5eGDuA7GBXKClUR0lgmvYPymIp38/A2Nx/YwzsKOzr3Z6ajxrd5/WMA9Dz1xIhL/cRs+PcIo9HK01x/6u8qWSYdxjMXoJZswHoagRo+c0EbqOvWQh7gbHrKAjEYOsdcy99C2e6u1jGIqPi+l0FOcat5BoFoLlwtW2gtyzY7UWoYuzOogOL/jXNh8bC8IplEuH/Fu7+//34B6/AP3jFfzle8f8548IDXprZdeQTRtBXbSBmBm+tXhnRoR4mFwKzpc2pHufnZbgeOBeejaEBUjcdmSiflQKceeMV4L9PgSYNt1drHUfCTHu8tIlaeAE+6OllQqtEtgKcisUeG9uAjLsSp9DhlbSYBhIZD1tblPsE9lInCwCbCvyjwYJfu/5eDB9AQE4levpWBoY8Crarrytb+RsTF6L1XPmUALS+vRmZfm0G5yyajYdnS5v65vEzMjqGIu1oOVvqXHl0J39Px0vtiG7BiWnW9zxtYuWprKcWgJTOd2jjMCXD+ai8dndJJeePMXoJEAn76qrvTzn25TiGvYmnyd4pCiyUX1KxcBC/G1RyRJtnHnPU1cU4z78HEcwHa4HTOwWUOJcsg3XgX+TET+4vN/Htfvy+7OK5ETIt5gK49yK7pZgCADX6mes0M2EraV5B9wb3SupUGIsqLG3k2EDNCxnZ1UjtFmJ3eJu4AlvFlx6nZtj2QumbA8DU9NiPwl+2tOI4ReCmDgBXvzYBDcbCjJsBubC0ro11EkpKN6DXNgC4nsybsMfaRQDgiqMqZGGYNrEXZSt4T9/45WetOgXJSph/sQgufwOe5wCoTA51zw9T6/qO4QvWHhYqKmZ8zLefcRypPz2J4x/nZ83ucaJ5UQbq7o7cZ31vkMIOMOz4/Qj+zhpZHR0xvGWwoC6wyOw/IeCqiETMl0jTvOZKf4r7+moPRhmAnSYz1aHO4vP5JhIBAztpvkNGzAbcydWy5nhdf8rgnAHJkcLtPdBLztObXhZwlLRWHWsAvrQHAMB+N6BXe/qan/stWVtQcg9cnVtRkRigdBjB+Gx95DDg0jP4XdVcxSbmjrkdt/arqQ7szOTrNOt4pZhYe2/AB2Z3ZAYZSd5oE+Dv4xmnoqy7Y6tNvTowU8+7zEy9yCV2P7wSuE+6Oby87XIA6xd+0kEg+7zz0tfH4z76vyoe2Ogk52Mv0pzMVWMHALwlaarLHHCMXH+TTT/s2FMgCau97EgDmQ0gyXLkmq7ks7TGBpmrBT70vdaeY4BLapkz6FyIFUxepuFwWGi8B6hVH9ZrhtnCLdB8zJL9IxkhExi4GhQLfxg/P/0B8Iv7gsXR8dbz2DgeOn2dZi15YSI/AEDi7k6GvufyfEmZ1T9Wq8PGLXB0d/KWDZKxmAeA3a5aE8480VoT4Jzzu98jkzia1RqAvA1jEIAy7YUjo2Ocb/9+mG1XXJMMPs1g/o3j1fHSPe+HJNbPOE7cMvvfdewnuFhAQe3ldcvx5/2sagT72JXOefgl07prpwo9/StmyI61DJa7x3gbMT86agIb04YANh3pKBUEGElGADCyFBFOwk5IUQCQgCIAHacNpGKWk4udhDk1R3WvFSLXvbvjzlOAGgDsIcPO+xuUS6v1pNnzfGCuQoE+Tuc68RmvpXIPwBssYww78sHQBlgUyLoaUErTC4R5SPyUfBGOZDiLY0cpo0yqq1uN8ksVJSr/1ZTD4Lq6NgBzWPv+AF1Y1N5b91pfts2OD7trVbGURSJ+WgzYQHa07Cm7cs6vBGb7Bjxz+Ybf7I8iHz6JecBTgUUAb26UCsLbFiCwtfeoRzH0qeDCQisxkwit58ZV4XSzQIVXxo0Z1iSBJVB7Vl5fBdeaDxtgZ8/nDTicgHYVSCVPX8oVJZPomcIuOBZ2KFSNAi5vxcfn/IHPfbw/szEXoLqJ3ladUdrDDSKfFJgFvU/K4gHPecd4tcgLWV5HkQ0sE5jmmW7hIC+Bekj+7UjAQYIuwKKeewG1uqfgeKp19xmHkGjIOVxEXes9cjar3KvYsOiXw9z9zKt33b8Z18sfcuwpEF8WCAej+NyDGlT1+ff96UmGgJaQOJ2iOoPyrSJ5hjw1D0n2c0wV8GwkVkMkUZcbU7LowjglcNVarngx4s0wVTji6Bhhf+yLRdwsf/L6HnO53fd+7kNjN4/UpWXyfgaazLMzOX4N2HkjHuvqs5uSXUmfGFbl9mf9SgwBNox3vZ6osJcLFoXTSQoVwIrCYZ4ddOyqP/glz9SFhkjOWbOW79+SB8xMzEjMKrbF0pi+mmyRAGJUpxv/PVr4FcQ1oq5wNnZ5ni/UXZu9vmZufKt7pMj7ADCzGgkS23+WD+c/eMU/eMV/O17xbwtMW+Ympb1ZEduMF1a/QPoYwQ6brVigBlPLYwHZktIYFxB3Fx1CbBjvTg6g2Dpkgt4C2k9CG0QHEEhcJXlgrJq4OVYvRgO/tKBnFAPlLckG3lKo4Y4JLYOt7fXfxfqpuyWIUoanntEeRlWhv7HV2pvU5RULsV70l83WtA6gF5SxX4Cxa+EvCYFnGK59FvkuNrT2ZQHxlN1qPcRHp0Vdy4Uh1mL287mrEjmk17rqvqDz75ZtyxEIbWKlx1utnPybhMUXuQjm2HvjlwORS0Q3h81aujaQG7c5rmpjRTFiEvD/UbAwWsolYwApPyv7zQAe5yjWRTExASAug+2fE6wBlF90TJQM4awNREEP/xGw0jx+dtXUxlDfz3puBvcXQkEbJRwFXiyx4bB64SVggz4XlORYiBEng2ZA43mItdBze3SxalSLZ5K5fD5Lckeln2tsR7VO4GoTujB8wpQY8vaDQZEZVjlA45sFViU9Nkq+RIt63BiRyL0fGuMAwkVuCsR2uLObqQLZ5mtYgWNkTFXFniygOC8P9GWqqTaT7FDdDIDAtt3B5ZVoreMZp41+4eHHVMLcClTHfsnHjf4EJaEXBbaM8jwIAQW6rryRRlkoEzs5ErAgO6mYUdf+13k+tqidrKfBTeyNNTgXKWFV3Vo1Vg1HFfuHHEmZkfBqqz6BR8sFyoD2mUC8GgBY1U6hn8gUE1qro0bKJ7gAPILfzN4Hn6atNa4zHW2MKlC9IN1E4lIikJm4T3aLXQXTrd9lZqRtieaqEYFrU7IyM+GiXI8w3OPV18l0/RxmhvRfPS67i9KoRW76m6fnoB4P/L46+HF3RK7TJWfUDwYqCCaj3Hpv/O7g99e75qsjqggAB5oVy4ueOKCd5YVb69GVfySrCSQmrvoAu/ne/Ub67HnkeSlgcpIdAt0FORIYky4KQ/NibSa+ALCGw4KsO5g6K8MIEHvJ4i4V3HWdYXDFIQN/yAdnIq7vctb4EQfH/7nGKcZWmNObAJStggpPQ3I3qxIWAIE3rkoUwcJUej463QnqMkECoPlyPDN3x1aMyxPw2Z0SlpQ8gUCA7sQoJtZmYlHADefxkXFuco0ZvHwUAFz7gGSXhtFSYP6c0yKOdhe/RWLZRHlX3jD4pXgsJI9ljteTXlZa9TZRdIQZlXAmtnszg63kVEWumjhdTc8uqfKetEoOM1sOgc9NxKa8GrjmDSm2F0kx7Rj1Ak+Pmtp3E0tz5r0CF7UkenVcAqddnVRtyqtnMQfXNSQwfLFYloEsCVv/1QDOEzyxx77tIfDes6Vt7vGbfxM3vYV+0mGfO8lWYTZxk5UfgeshQVeFWZdfIvOWU6aqjgZ7SBYFgPTT5R7BHpWhePL20/1fVzJGFSrkR1JyJ1qTqf0uSXOodzDP398WDfTCFq59unoAIHxIOq7iTui8BYQNlEye5W52bV3lHGjPWd5XeYpqTx+OjTdWUpq84rYIwxfA/BAGt5JUGYhN0XVswNNQxTxDtAE3BETX93mqA8TwF03xrwtxnP3zwAtWksv6W58XdlU6jFLwZqdo4BE91/lsak3bcAP22lhO8Oay9cj5uIbdWJTEts9rKcDe7OSkEewo+zhGYuy3EMEX4LPfZWayGI6fBtoBSK8wHXM43IH7aUaPI79alVH6VvG/CeD9Gdt+lpxq3x5xnvkzOmw6BbcljulaQNOO90mGSAaG4Q/ygYtIV7xmW+1xQZBP41IFidu8lSa2Hd8fr+KPG0bHlRsXJOlWPoqmvjY3hDmuZ5eq1px60xcC10hdqyF3T2J9ubXpaH+4uOeWYsPwCxEQ2HiuIfuZWq83IyZicD9Z3Y0weqyPPdpDBP77WDnIEy49seoeVfiew47CzZaCTE1DMwRelH8f4LzcEEkzMKbJ99eBTJi/ECrvee9XG6k1Mmxj7MkCTcpvbXJ8qczRskpD62aGa/P9GcfYBYI+8hYAwDxgeM5+/0jGN78iuri2hmNjE0CuNXUsSZ7x8MdeBwCW+ADgVWbEmYtDxUouvbuLWGdNDRXtRvghC9RlOn3NDpG8riPOOQCREeaJZ1zdf2O3z9MrAt0l77zS2w7hZ2BgruoEUaddriZMvPNgH3Mm7M314aW9uiS7ns+n5mcVyIpgMB7nYrdPAvg+nd+Z7VvmIi24XezqD6nLjIn9iCUBYp1mfC8T3Or8rXk0WHCortGmjkni18JRu2UYSfG82LO/le+7mQOSS9y3ZGXdet+xeDFGNMYbALGlsofYCOzxpXe8HnjLz8IB/8Er/sEr/tvxin9bYBo2yJYppv3D2L7HUr55kh0ItYE/9bgz95EdqTgkaK7oIJvtMT30mqI1t1mW/FwYfo8NQxnmHWYPK51sly1m2Ib9TcopzZuZFenN/ikGRHq1seJIo0ATV1U/b9POw0wCGMz/2om/uth2ts9K9n7HN1mvw5CLQcdOYQzjxeZDeQIMJGKcz7Dyq4rydJlw+S7tAZgKRKEIeroBm0ze5SwQkAlX4A0wNT6ehbO7xjm+tDpQTzKtmDsKhm1hqLWcHliH/TGHIYKLYZk7ZtNcEjboKfBboeuQ2WUmREg1eAQSxaZ6Y5fBbJ5rbhZoAvYIjAHAYuL+QWygOgKOr1ua8GXEaqfyznFVoJMWe0dHXF878N0SRfzye8Sj/8S7vfiw7yaufRaDpeSktKszAm32vQeDCTN2RSVD4iO7cuPow/PiR6DZz3sYQozR8nKKEQwx9b267jW4WY1H0WsExDg5GqkB74T/tZyJB4Bq0WUQw7H0zo1XO2MH7J49t/eunko+vyuiA72hIMUeQdrAWZvqoNeTggAnh7wOglqj39s7EzOG5oW2b7OO3ciC4gMpo9uRjp2TuWHQK61AwEzNVTHPlwGwG3tvzESRTVjYz9RmWazVMs38q69vI/GrbD1EAsgEbiVMwwZZEUAXaxP3p5njDzhiT4wIeHVfjwNELSVJMwM5R4M8PHYHTzBgS/e31x2AAJZ+vdg5z/s/O0z03vAJYpDdaHh4mRRglGct9r2xJs77A7Dyl+amAX6ApCNXCMwlpqk7x5b5o5sx+woJcDH4+NI7vwcZlQSdCGKSHWOUuETAN/cGm4fBaDuwSpJ1lT+MH9WcBHaW/If21ooBMnHF7CJuxQYVzACAYxB3zkcHhqQeOJfR5vAlNeF4NwCavrowmm7ISHybYWPB3DCXdfBYcpAstkpKMwK4JQkgckvJGdBDxrFxi6AxxV4dh7WciegOhUoYfgGDMqY7J56sPgKB3z3XfsJR7LmvDyYj5TriQTICgjKcFQ/F+V3PiRWSUe1FL57qUdjOxHD8L8lQJDsryAgrlidgkGTyBucMBK1aSWOxY5zB/kvsOM2j9AaxlJ4D4Dyqo/bH515cwNT9mPEzgUsJTxXQYixyMrWWO2q9KQ++bJ+MIpuNMQDbmEra3SYQBD9HRnsTLC1URwIXZy+dgdPJUMnLi9dlShjqp1m+iJ8a2iUXS8afcU/Q98xqHzvvN2HHi2GM/thiVia+S20WACWk6vN5FldhI4HN5JMIaoErgRS6P3N0DFlz0sO7WxjhqEXG918CYY0AxY86qjyk8ZwsShgeHch4QAMieY0IWPtJ7b+BZui/5FHAVElSU4+iiDO7c58y0+Y7K4+eF84c5vmuOINtNbP1kHECgRR5L+EwV2daFYTA2IfFmZNbmeSV4FMSKmR/Ms0nAMxCD/C1zl5WY/GeBMJXsCTWMZKu+7XRnmdDs30P4rhpZH0P3Vt3kBlw5W8AiTV+9bibBbgCndMBgMnHSag/gXmN4YnfKGnN+uPAmYv1xvnn/JyFyb26mO0P8mAigfFmQTkCdz4AqorrGjinZPzpUFLhP373XuPJwu+TJQ5MhC8BOrdYrYGV3yp42QPc+hlHQ98Pz8DzkypgLLKsn7L+seingxrDn/f1lOh6zq/OrR5xXKQ3aMf9RH5+5aFhT+lFxQcRXVgOf8EFxgMa58luAgJq3GfN0GMFNU4qVvLqEOUaPqLAaILdDQFXJ4QtAJ+eubVfEYMp4B0ABnzZ42efxbiBiTXQYLO/WdS9BSa70YeNQB890fjOdJ75hm8CxPCExSdD/Sm9Zr6bAD1iw3X9UWxvs445X5vTMz1QajcjTucEvbLBLt6KU2F4drkxlPaeQ3gUHjK5M8/tSCuwe3+A9I0G6T+2AzlKPlGgqt1QOfxHHJG/Me0X/iy60ms9FMA4xi4ShHzpcHWB33fiHi4gFYigZ7tV3J3O/cKepOF4rGXcC7w74wpIL2Wi6PHZa5g5Zta/vck15+cAJKMLoAkE1z5KJwffW91FVTtgxuh9c2A25lbrxNc2+Ucn9wbnXrasVHrQ9zdLph58nFlk+1Fz4wsZQznG/42K50y5upk3UP+2h79lWVJ8vLsggRhq5M8ELnpbVl7sazLf+18KnZ6J2/X8qlD1/LkD0FgwL7wAKIsVxBvmp2uG7+Rujm1YMF9KIEetgVO5H4HeoUld3GPP0evrwAt35YCPfeAHqU4C+Aev+Aev+O/HK/59B1NoMOmhHsLl+2yaj+CiBvSd6LZLxjqSRekA9xOwLaDzyFj4Q2/079UxFjIYaG1csOqq0U3TBC/10g4LDMYHFelY1YLou9vBTIBAGc6ZGYZng9YrqI1p2B2AWrgGvAAPGJYfqZanruJl3ES2pTTnDWyr1883C0YAW0brmB0YLdi69cwq4QTe4+ibs3PV4MtaaqylTOIEW33uHBjFDNiGrY0hlYyls6UxMzFzt1+MqwBGGS8+NupBHxmHunMPR5FCWpP9wbSs5D/CZWKc/UzCAI8tUP4A5c2INOvA1LICN+tWRaZxP8c0HeBmTFadimWBNr0+xdgFaGFIeX+NcXWCeg+2mXI86U+ysRVEBu6pKvQ6/gPVzMX3OQSGKYgzBtQww/BKkhkR1sbC9moAUADy2HDejjb8OyzBxD1Lmo1jhxvLGSMmeZzA1YXPe5TfkB4QIHY6d9V74AFGCuh0b5Yf0g67BTT8y2Twrx/3321Ht7H+GURXIFhs9JaqyUT7NcUA2ueNf7MMiFFJTHbC1nKNedqg3V3nSExt6LzMjx3/kcAGkIEvVBACfAeD6JaWEFjk7lh4H8mCDqbPDNGsev5YwGzdU56IZNS9eMtV/pQj/DfCga8/JAI9rSVlYEB5GNjzXVcSmTRZTgdsb23OlFGFQJr4A3wIoIOUk5QThC9QrJKcP8fX82C3XiIfcwwAxvjrBJcJWD/3kjra7HDIYu+LDS4AvUyl69p+lZTI+JQfgmYhBPgWWM6HWM/nJEJw+lAA6P1w2MTMU5i4ofOLvYlM+WgAhoD/YcyaiA40kdlxdGsW4xRj9z5d02UAOlzElQZ+tLaFShNx1jjA24wTSHVzbLgVb99VCAlc+r1tG1BXDx/r+JgezYZCitDOgK6SK8fClpkr/O7k9qx1hp8l51Xv8ayxdbQOdg3NtF6fCdhqX4u/+984HO5LLLsCvM++/2G4bgbg0jxSRJXRgNAanJ9MrgTOSl6tYpEKzB0VKxmQ1QV+9rCjbW3I7vYxrPYR1JrbIAEBrfsPbe1k4MJnJ7aauWFurkXLojuBLE5SzgKU5rIYInuvD1/T2qvW9e7PL+k/X6P3KOt941mqMFgzzg9Af4yxK6Q3MgJ7fnHOuCj5HK8FLnx2gx1ZL4FLThAuFFv2VmuSFII63E3g6zYAsyVo31UF4GX1nP4A6QocXw+mcr7067/ZNfWjjgKrHnO9ANnzDWzFFSWbdvtzD3nK+ujIIEDjp1DFUz/j7QcQVuufcf0sQl2i4r4hoFbz0w/zkjlAxWkiiWW2RxG9Lz8BqEScYpT9nT0O3A/QUEWnnsOAxcKS6kJmdvLskv99iVWfmeqE075h2fFor9FxejNHTCwaX55uQATKq5ddCJovJeGEG+VRs8dq/1xoL2Iypk4GGLB3x/mAgJ+adw9G687dOdi31f0BFQfOqDhwIruDLA/7NU/xpKXkLSTPXHEIAeDauMLfsMgmlR2SQHUmBJZvdpU+ZN8/C1L/+aN8yJqop3E/njEBQrL2B8AOHCAONluGqD398jkvz6xNO3PJPsa6ctoiESiePmvsGSsAkDGx4B1HRXs7VO56cogB6zX+Y1UTO9MFGhqM40rvyWq+2fHPLX/qYxUAJL7xfqiGlD9rz9sI/O6C9OmIrGe1LWBFrs/sPbUx0dh4Cw/yXO3XcvabA0tlbubFEfCaXx6dJw4EPNQZqL2KfaC1x6PHeItELNMYMBIXCv9p8ssbJY8e6l4iGFdjqZcARAIbv896A4BuUnq+Zn9rRhoZDyzNz1ioDoI9ukj/Ew4Hi0y1StfthIcIBzy2O9IdjxD48bPjL410FvBiInL9sSbpV7I6prXXN+CM/l03FgrRsfPZZQDiIaMK/VgY5R/exBvmvSZCUsWc5QvImvDxaa61rgsdCK4ZyVzvdLzzWLaV6xi7dnUOf6ybjYNd/rFnh2SQ5xrCThMw4q63crPMbLKO503FEpjIuSXvrEJAesv8syHg7tjOzGCbgD2LMtZ2Htax1EZbOdjoYkHfhzEfcuP/3prsNSfCXsiK9w2YeIFF67feKTE7SpXFybE7P/MHqZ/5Hq9FaxICVwivwd042vLvU8jC8Sf/Ccc/eMU/eMV/O17xbwtM70zkaUBGt8oh4EpSLsxjXKVPv7RQAMDohCjO5qEWr9q0xyN5dnesYkag6hIFKlRiwsKJnouSrpNwug3YOMGYgRJ+JUewpn9U4hAMNmoiZm4FAExGfBezgskW94TojaeDCTF9zK4eKBccSC5sfEz8jFXGf4BZKwAAIABJREFUbjjf++0Jj794TivWoSMGsDcTs6Vy92Gvugz8OAECrHzeeGP6hOfs1v/XdkL4cbRh1wByPzbs8ZLH1VuJzQDszcQDoxdx72Tn4iBNBtu3FvFL/kEzX8gqrM3AXp/RVrrhpQAv52iJN4+Xkq0LaW8VNzh7zQyhouG4Wdhit9Ps5M2sEsKFX/mzgHAAWBF4/WE6OO7ohISxNBOOmDKCBZRI5zGDdgfGWUSfrdTVzrivvxeBXxvHy6BZ4QOjWAp2n8WmDR/RG1uaFsBET7ydhi0pIrJ2CsBi6yry01S4mdZWmv8TW9+bCEy9zK13fQOdMF5+YdZmM84GkvjF1tvB9ml3x/iesNLfrWst9roZkHlMVatAk2QXJhL3dVO24FE43Q7Yt8Af39259R5MCFdKchIM7tK4+YdAV7ijZRzjBUtCodV1dt/cUNwd0xxvvJHBJHfAsXNj1f2F4wpK3lVivcEOsCrGviQ32GUljwbdPE43GN8LGVfLrw6ISzrKsUBD0d+48iFD+AMO1z6zO1AvSRljN0AyufvWesRCr6NW4ZJs9UHJzi2zy5QEmHSJOsM6QOZEFSsNBPgyszs0HGdvBAwudiPDDgJxgVpD/ch3VNcZvOUpmEgXK1rv5GEQwJjo+kiIjtk5fTNqPo1NxuU9ouXOLjjcqhtDc2XkYW8/gEoASKcp5tObDALX3iMwNyUa1vh7wjzXqz3PSud3zY2l+/xaGxhaG2L3NVVAdsVAysT3r0GwmgCr9gOtJVwv5SVhE7XepXlLmcyVsAgMBz10ErAVmHrHb2dAd8F7DQnb2FvdHtUan94B2c5ELZIx/od/4xPIF5PinEey9NF5+8k2/M8eU74SRXh5F1kn4iPhmeUvIoYW9wXeifvUHhJH0gqaP+pi9s1ktvYnMqz5TGfMZmQdqa7R7MThp1BUHVTWyQcAPBP/+mwByJXwV+zqZA5TMEiydDYwda7VINTCVm72EJ9CeQWZA7PWH7/kdwEgJ9yAyIXv6sb2E9vOrNjesOtZDGuCwwzyzzlmi/15YqqJjVtBxJ6VcDum4vHbZnfEd9eu5i/P//DWk7xSZuIt4tNlpkQ/4Xs0oavB05i9Vxx/lxf3HU+MNeHjjJtA4B6LMmV6R29tgkV4tbU+PAc+CiR6JyNu7uPzat+eNhXva/5Bh559rRtHfx+dHPvyjrG2Cp30T+K4uWLhLyN7tVUj5oDhQmTSD1PPdCTnx87sjgGHnQSz5x0gm0xqxkf53ZbsmsONMcAx9z0M6RHHjNzDUX5Mqc8/eu6MdX7rFJXjeU4UfOxE2MF9Swl7bFwiZl2TRKuIAg/pXUEWZqqDsLo+FmI+df9Br4siT9p4yJ2VZNcpVo7A6bJSMW2PaKBr7Nl5bI3OnQKakyD277yR6r4yM4wxYGKnuq4Hhu7QmDDM/IKFYQcLvmVADbCY4njE/rXfmZ9C7CA0O8zxW+oF6YzrRwKzpCri6r0otb9uP+SobY6xB6VIARgMe9lH3PgTjsilMXPwA4CKDzmreHOKRavykWmnEyaBmAJbK9bzYyDPtf/qwisAyUYJKIvs3KXmAtUm+lNxxdUgHsGboM+p4dEJh/6bTO5tVYQv/GzkRJHYVD/VHixVEWEWEQuf3niSTS9pzYcHioehvFyvDVzy1Pldhl/q0MqkQkyq4FsG4sjVMmhr3JirJJ7OepFJ0tse68SjsZAJ7PxqwgIM7Nh9mDHafh8ScxSuQi9GPtOJ9DfXsPHwZCkvJBFnMwOBibkNwx2Jb4GLLi868Jzl4eHMxwiA1yl/YxiJuUs+te6niGDxAlTYKFLu9uhi5oZ3bIH2EEo8tsj/+BFw4khaH5bW0QzG+C7/EO4d1oBy7myS5coTz30UegcQwbzkGfdWCNKqRhZYqKKJyAy44AKELV8o9v2udzc3MUs7RCOeu/CK6vZIdogDwvNceMOGYfX1HqHWwkisi8qRibc/we9KEypepEdQ33kEY2vlqqukBt2Rm92ijK0C6cAdsgcY/Pwh368t9Rtuz4XTTBWe6N30JE+xkJt44QLMqndAWKyKSj6AvT6aAsIcQ0UvwxesgfiGtlGFgsQbPpLPOWmVcZswK2M871V0UNeerQCmCh+2gCjFFca430AToeuzmBtrzuUXIsYZW858y0SiZkHsZykZ/YNX/INX/LfjFf+2wATgY4GtopE/gqXth5GGQCecNar3R2ClXwuZRuu8T12/nQRQey32wM5KCmRCFy7Alw/N/zg//Y3IsLIHezNaXz+6MO75kE5oBhO6ajyCbWFV9EHm2dRA5ltNDodAjocpduJu0MSKQZFJvlDWBvpYOJOsspK0sAUVygjSfMii6KF7BXuhwpsB/xqUhMk0lHbpwt1M0Wox9Z1Ab0LUyY1+ZgymqsVx+2Lga0AZBP/OwxyacIz84vMI+sVgLN7eIIOifGeWpPZGDi5wqFb4ipxZtvP7Tbk8sJvG47PA1qQ9KAmolsX83WW//HHsVd7l+KPw9T2jgSZLb4kceiKQTxnmiAyMDIzu46/EFx/SDtYsh0cBV19jBP6oL5HsZfR5aGnHJPBHoGr383agF8ZTJq0SJwEoSPrOk2Vex0OHFw7Y63xubW4VcNjdi7m2PHge3yfOLK4hYymZEpOWesyOCW6w3EzEPCjAYIf8oKxu848nBJgkD2yfQKuYfyNe2Lj5/XwhylQ2h+a3NeCQSEwllNsgAOwkXDSC3fo572/aZEeeitYvFXPa7DNX358sPJtpCEBsIP7uC68uXJYOOgn2FTmfoiDHUSJsYASD/2WJoY7O0AZpMdBMsB9yuANhTNdItCd/yu2zIE+jQtEeEh3sugDxrODaAjbYgn49xCe3KxlQkGN4t6H8MWW3Bjgz+7UAkKG9WbPA9tNUNh8difECMtnWLA+b6izj36mAKzkSdpcMbBkIN5CfYqdwZreR5FJE6UZteUDjK797PwCA1x4NpP0pibPp/o0rCEIsy86p5lIiYYDtvzMBgdXzeZ0H1IzWtIvJd6rgbgZEYge7c9llwrRvbgbh8RqYsWBgO/mqgjSSALRdp/MhswGaGIF0Sdt0pE0picwEdmC6K7SudzUQeqqzOwGcMl6ZgO2HDNwJtdos3dB7a3UAHDbxzzpKHsSS8cZ2x+sxFi7d6HsCHVTrKKY+AOzcBxAd55zMJ7KBdmzvosI9DpmnYrSBgRBQGjjgYBkx28faRKmq59gLX/CS+7TEpaJEFbKiJq0BwOoOn/Kdszh63QHgakmEigvRMr+B3ey8KlBFAoesAXS3Exek8zsAQsA5DHiPjWv5KcYl0Cz4THrglGyJYuS3kVMNUEZoOd9HA16jAC11vVai00kkMNuQmwB+JkkZ9AoaWPJVCmwM7cVFBkkKE5KsMd/93KyWmFvyFsbEsghbta7ZE5DzI6VRCw1Z1NyPbN/tCZkd2OTfJK/+00d2MbXknwpuUNzSh39o8G88utFrL4Mj5PPqs2IOgISeirGCjMzYXVjNcUCF9KfUd0nJoUIvRLP8CYomCIoXWFDvZDnamB0WsGD59WLSgMzdc/ieR54lBDLskkAylpxa5kXveltgJYszy1Id6UNdbyx41OeHT+x9a1xGgwKmZ4pxChBzxd/UHZjbPr+jPXJUMdbQoFWR/Mwwq1Nkn9R7wTEE1G/n+mIjcC2xzmHtj9meBEZxZmQi/ULGpleQwP9i2Nvgnl8FaewBbICOeENdU+uMqkfO+pTNWSquVweYu5MdnUAGpeGrUMjA+/3oVvwZR63I1Q3wMt3P9PZms6Akvbsjx1mLdhUbsQDJT5evLyzOYMkJT8YYz3goK950HHKAfjbTGsijz+2tGI1+SYmN8Iob0Ah7AWVm63wP6BikPAcTz73vajmobcy90ha2uvyutLYQCBTo7McXBcCXujHWJACW7hhaA8INS/KLluwceOZWbi+8/Q3AMPfAcHZGVbMGvZQUN+6Tm2fhI8Fck0SVV8+tAtOBF64ViLWYm6r41OIQTgDNzIAlv26IzQ3gZey5JebAfYxMc36vpIwAdbhE+WZsdQTMJsKWPG2i5mutf5o4CJi6SUKED41Qvj8BvDVaEpSnf5JG/tNH+Ru1V7ikHE3Ynj1sLpAJ1zvdwrc5kWaTSyPfPT/DH+W1Pzri6S1czzkkuwWU11HEM6Z+zNVW2Yh+9wCJOCy6qivVNiDyMuxgMTsd5oaR1jEU4FgV45lQDA/cq2LKfeKWx1XF2MqbvYlByAl2z+rdG/e3Wb5iMLy5+xEgjsCNjdkEe/SzHFKZIv5VRZuFVT5PAGAGz7OXGYy5k+6l7im1PuxYqO7hj6JGFZNUwIiMlsfiSFdsbsAodRxDd4e1N+M43UiWHFd4SJnxhNyjf1fRFU9ysneO+CzAl1ytCQznP5QXBP62v/+nj3/win/wiv92vOLfIhk+GHRXG2cFaOWnA2gBebSUFtBbGrf2XDT+XypdJ4l4/t4Bx8swS3fG/6y+40yB4GcD6e4PZkYYXUDSBp+Hr5NAs7DKrNIsz0MHWUqfAw09waY+v/6uK4F1wQaMXR0azyfBdrryRAGAnH72uRCgkf4oxHkvAs/EJ8W4cL2PP48RJe9lPVjbmtUGbme7HnX0uVW8zFGG1alN5MkkKsmZEWjZtdiQBFhiOt9NSv6s7vGaXyyY9WL18JeK06ZeSRSZWIsJ5QKqq8YVXNgHoxUnoCh9/oz/9Zn8J49i8NY76KsvRkK3d/JLsTAMZFM5CpzLfu9uFQDVHJ1t+Fz6/adjjgnNER9FfdAJx2ToyP+uxMu7WLnhzQepect0xQEYcliP5SFwYcQJ3B3B5NgMtr801s8EGWo9B9DB9vZHMcsdU8XXG9QgLeZGZnYnEK/fxNo9vhUDo+fSwtM4vYCs8/fPuRajArLTYeWJ43Wgp/FOts5WwuheLF6tkSFmADhns7qNCnyTr1OChbB6V1VMnloLqgNrxcU3UcmQLSx/93Ot+fchwNOF1ypQWhfJTVI75kf6ge+iggQH7p/VwcTXcZK19nFLdHIX5h10dFqUCvIiAHuze/TEHXh9+ARyjlGfmEezrv48CkjL6NniSUNVPJKnkhgF1HlWWsSc9B2gGcA5+thHCGBzjd4oxo/W5w4YC4Rg8lydFdVpkFiI0nzPh2SHjvXYDyMCa2j+bXy0n4fAsMfFfez4NQY7QEZ0UpgQC8smi9B21g3gyGEmQibWDt9+AkljEDcWpUSLETZVGLj1AifOfuCakARNU4BJ9t7BZ/eMeXjVrWkd0aBOHb9ux66wagSWumuK0Tvi7OG8BiZQrRMN+9/H0n/o6ESngLiWmjsBveECfH+sX4GHJArOu499gJlK3p+8QvdTPHjKXIwOs3QeJxmFCVkKvH6snw/5LbMByy8VS4rxiJZzre7gBBr8tjRM7TtLhQ9+dOt/9bVk7i7W1LGdzy71nBrcHKe7psl17rh1/SPpZUkD2gOUPvdGzu+STi5AUneQ3ga77ApTsechY/Da5Wd1ErooElWZYAKA/9bffqHY35d5JymOjTEAE/O12HHlw1SEtLw47smSDOS66TeFWj8IbIwx4Dmppw7udW7ONa3eVZ53VPOQxJbq3jhAfxGnZF+Pn3QcCUj/+PpkPYdN7kNxgJzhp5hI8I4gQ4F5Ydmm7Fe+UJJ2XiQke5iRY7XsU1RCvKM7McqUHgLAE5TjNgGqaaIMFblHBeJESQE5zFLSxaegUT6cSEJyTM6D+4XVnKEkl+PIVDJ3884RRpy9sv7GCrDPhOVqMuCw0XlYTm/w64LGoFvr1ddeMfY8caDhIYeGR56pOTjoBYdMjFbcuLEuAd3xpd8DSlDg2tF7YVi0HFNave/H5+HuIpsDGIMxWnnSLU/glifdZNzpG4x10oFwTHudNfKkrXp+s2PYq0ilWWVhdjvag5CU+vrTpCerTFt+DUjFDlUEAZBzAgLsan8LeHcFUXrm7MGUKWeM39KDsFZh4eeeuBJ2igadG2V2gYYkivHx87DB9dKA27Lz26tl7VLFvgQ0b82MRSEjeNoKLnlAo7yERSRE8Ev6tFaoVsBeQj5NPJaaqNKHvBlGd7BYBELAr4MgqBnwq0gaEX1jewQl7t1bFokfrr3fDOX99O6013Ht0eNzON/JB+aheI/v98/OEWvA0p1k2tQ9MBZkUSSRmIaPnaHyGzfrYvDU2HHtq7HvY+vQkknWhL3aWxNcM8J2r0+MMR8fiD/uK7kW/CS/GHc0lgAVloY9c6EidOr5Vh0BLGRSFi26aFAdmvwZC99ReS4/5O8Xkd65a3p5iR2MgP7MRYJULGRoryEERPi0jktThGx6mq2WKXVJ6/ryJlbxfg4hyYx9VDmy14tfkuO6hGt0bgIRjow5VpFfiBcK25CMFfcKFqSR7ELn31tL0ns6CziAZE+5V9ZeGB6I6qYrEq06nmpsQ1jpyV7oTwMAQ8orHbNn+auetzOz+oyLnEoSUXUqpmLYseVPZUkvGTMmQ4WjDDB2y0AtwNtVRHOGL6mYqMi7oucT9/UilgVM/tlwQ8irvuLePR6d+T/k+Aev+Aev+G/HK/5tgYmb6ZNh4r2pd26MwFYL38gJN7aj7jCE2CGXqpkoEzKL9p8xROPc55yfQGgdu1tkvx5SK9nyV/VSPaDuggJBLj4K8wbNpwZWbXzPAKVGiRnaKLWwjQrw6vl8j3OlLkNNx3czRh2B7QRipwL46Y7cDgvqWhdQPBa6jX8vDqYchmgz6tXAecsxpKMsFdcgm/MAK2DkKdBgJlpipl79DofnbwaTZoj4Cz68K5nDNsq08bVnbyIpeZdh/miXc2TJS+h5Ib+0IBmQ7MIykG3CAHB+MHXruZbUwbXZnofF58v3bx2MpEXr0y8MjErY9D0Wx34OYAf8b2P7UVUEWyK3QCNWiAUu7PGQNAkM6XjW91iUOYW3Ou4CzeAHUICfDb+lNdAsE4JvtTwoGDBueJ3M2ykxNWjWLBrAxpc+X3dnaI8kM4GUmdj2BpCIvFCyOuxwO6aCNddLGiHTHt5qlBxELMBm69COKFCM7aTPw8OP5izY1v2s0I8IfJeDpLF4yoROt5ePgrNlZw31bgcurCSDo+4nMilBCOuit96Q3v0JmBLRzypwGOg1r64GOKTpXvIfBV6MAfdfklQhIEDwoj5znC7Gp6feIzThfIOCDS6CprWMi/Xf1+j/5EGcqKQ/AM4rglY7+fzJyq93pMDIFtIXf1bpTgQNaMHxVpKcpQcPCIiBHkUxgmr9q0QaHF3N+skjOVtjJfAA2X3IuPX8fdgHBN9B0bBCvbUPmiQPsoK6Sn53A9DEESuBEHiRvzoVMo3Pp2cHEjKvZCB/iXzATsqXpEoWDdxz9B7bvh1Ad9BlZu+DOxOmQC3LayQdNa7SgPUA1QpUdThMbfS1zh32agGjZH+3VngZRQ+ekYDPwGp5zsf8rYByb6Skcg6TkVfDpPl0ZM77/Lzk5ArsAggqMiF4enCc53MkOnE6C3/A8e30/3Gtu9XBmHbICldM/KW19OGe0D8336d7fNb8efVvbsUQ5RkJfO4VBJqV7NY5kR0Ecz1lAl3zYD+IOZlHkiOL9Tp3F0BoqE5QoCXwtsOa3e4olWvD9Vj3K9YxfI965+coKbq0gQsFLBR4e34zXdJekUAS6EaSNBKbhbpw7Xu3sfM5gXycw4uxKXYn8sjakXlaiTi0xyReFUMvyW/twLYXhhv23lgxpQN/JJto3H2SX4IU9IWxTDH7vPfgiMBYNE3PFOCRBqyayXzne4jJnAvXuLD3xpT9iPu/jmlzZhfrzvpquFDFpMe40lrpDyDipxxVPO0iXDE6J/cnzpHjRXBWBD+gVILo6+OwOFJtNAAmW3z1vuVwkcCYi5WsTn2ONWBgOGvR9mL8O4JICMb2LgzBGOtc8DYyJlircqRNwlGV4GYStNLPoTjMI7FVufFxYszUnlbkQfOB35n41UXWAkArZgRBBO2DY9gDLNT+E98IN8CBeT9k3fV1eWLsl/bQQHWvF5HQ8YgB4Zgt5V1Mb8qS8/jrzPnu0jdYSoYYCzcKuQnF9Y81IhMtqVzEIvMmSkY44C+MMXDJf/iNN1wgy671y+woJ2z0c7v97KH1zLdV5yDjVldxfhdoZ5/ko59wcC9xrFkxU8l0WnfIlNwQcPJhT0I/LCSgc9ILDmwgNvOy2IwXmwOoibnhXTSOx95zsIHHnt6tmzhdF5jHkyzpyVpFYADKcUu6cba6AlqWi10GnAuO71k+ZFVckV+XGXJQQjPz+Ess3x85dQFYW34zGYBrrRlTnTyR8AypIiR+y7PQYPh1lzfZxc8OgwuTYRxcL+AXSkFh7BPnVsfpRHWRcN2rnL46t/jswfWoYgTNITNrL4oqiHPdA2ILoMSNcgXk86ryMAHArwjAE+4FPia2GUbn4Reqs8MeBaapjp/3FK7xAJMnnnGrd84Z8oBDjI8C53/6GAlKJf0BJF4Zvd8yy1ChrYvmhgz5LBoFstIqn9TcC27yLPrUMz0xYOZQ3u092fZYPX66ewJLP05kzYm09g/HY63e9eztIZW1X92FO9TdE3PgWgdPKV+kbyJQvScBTimr/cZ0V35FuWFl59g+sZXrwN9H3uyBjZRMcMK68j2K3I8OwQBEd1CQTFKqUTWmQgVzpy9UqAuvuvj9/WdjB4CJEUeiEUY0jqSDhNns/ecoRCVSHnF8V6Y1I5kj4uSYIxJW0r/Ah29LisxaW+WK6tLVuoeEL4MNE6i5uhh/9tQkjgGu3eXFvspDC+OPHO4/f/yDV/yDV/y34xX/Xovl+8LAhdazHLO7IK5H8DvSMcwR+xcv05RNZsDijUA0Y7EKTW4EPxNsv+V5nh9ezJqrk8MZtVjtM9hMdo4P5uJcx5yOQfpDPxkclLMSoESD7s2SrCp8knVUn//S57/90jlPxw03m9MRMPU9W4YptlLJUPxfuZHDgAG8VpIJkIkcr+6KgApwO5nwcJP9ohEtTj71jFtp7qcNqTUguTAVwBySsKtrjvmmxxQAy4UXXkz6+74M4QVupza6wFjXqfDWZMmNjPp+LWpA5r+ABMKXal2pJBVs2yx9/3DE/tY184jxG1BboOXElDRBFbK2qV3RAODGjl/9Ds0YeGz8LHABAg9a27TH5kRos2AXtYAmPf/LJKgYLMrW+/UOmF5PJKLLVqWR6uNsNhUYGQylXZx74SwJ0cWI6jLLp7Y0SgqPh4Hj4kQus6v1NfcWyHyqay5pzdKOd7uR8mvi3wQA6vZnJnYErkEG1PXwbGCAP4C8EF6msKsZMRzR8fGsYIFLz+KGHW+zZrA7vha/t32hdJsPxyHFTDDciQ9Zm8zEzhuwCs4ce+FhvgiEvXtOwhYDrsxmt7pdh/UGBqPFMK/N/Hpoel+h4ErrbMaFd/yPfNSeaxRfwAVHeBVsB44pYa2BxUAGfCeiC0vX+b2fg4PzSEeEdxfEKnPG641wPvnrubaZTD9jYoQCKVtk1fkBCZATO4MAMPDxfYByIuVhwq2CQcAt0JmhYDKushtlWFtMxgt2zNAz++cHIY/2GczczaDbcK7FmsVI4IpP0OsUaJV8e7bXxAHrN35piYxhIr071uhfUBLPNaT+MKYDd34GdwBuvz/2mOdncUZU0vdCrfQTQEYVDaQJPazh4u/BfY9mw0yUfr1fKLZ8VEt+fDWowkCM7fNDLBbb15mpxmSsHncBTymm950DeX+Dyem5p4oNKA2ieXHxrO9NedwCw1sWxBw2DbbtwyfPrJiEpyP7B9WXQFmAEyZ+FaUShlvef3f+BSzGELvYQvLoIwt4Ykf2PuamWK+LSpI522IvhrxNNEEmsiWRP9hUcaRQdML+2XTq2rPAI5lWMwx55Nm+kfMvAEDkq+ff7L3UMXb5OGbHWSOK4TVP4pcn5Spz9J03E2lj5/zoAhBjyN+0kwUA5JpwBCwNr8hmggNFGJjNaNuuAg3Q+/MSaGxmgL97fn/d6qToxA4E5hZjim1M3gYSq96rAcsmcgyYkdzj2ExuEwgQ3BlG83LWFgzbS0qXMgzmXMXq63vzXW8P2Djjic8XmA2kOpA3O+D1qheW5ADVBdCJbhXQZndyhJJjvit5X+B6xFg/4zgrQBF+FjKYY20DMBy2V+8xuV6SOnufxvMM+J6PtZbxYjzar30yFupZYwFB0/BIlGx3nwN2JD/idC14kGxSKhEA86hQASb8zXjQdkv9EHSi1M8Wpmy4ugsboLwiczrFH77go4BAFn4B5TlWXfGOvc56wvEnxmoGEAUivFq+a8VfuCI+9fcl+QYA3wMdIz7fTn3G9tHjqvK8a09sXeuIwNKzrBhSUYj2ilB3FYu5ZHLPXleWcR/ms6hc9uRw20fnBmuc6wwrc3jgeg+MGEj/Zq4WzG0TKtJHvasCkg5Qe8UC/CXQsIYKJRRJ9Dob/2hvL8Pa/wc/6bBwgTta+8LgTgglIDmm5Hrr7se3CqDbdHIejccYAIApYIlAzUQOxo7PyKeKDvOxFdVefj9PZ4Dn3e+W8+l+eGCYvKuBS90Ee1BNAGC+mCJ8Jeg7UgVPU4cVIuFm3Qm0zdtvpZUuDAitxZ7ALkIdBl5CsLdVXoT2GGLoLyWNXUAnsCfBw687Ub4aMwI2i00uuc7Y/dzew9Hm7yrUjFwPouxqYHUl7+kbp3AdOATMAuc8B6w9sk5RpDq0vsfAsN+ICPzlgN+hzhq96xyYAmi9C/zWXcpzWt9LWHSRrn0XbCNyIOEYsTr/rrgVADx+oUgaFZtPYRc34lM24z995OsBLVdMAgC/MARUT3MMYVb3LJzQtW47LuHGlWUCnBt3Pd8ssgk7O6HP2wQc+JzbD+9YTVSsXf4zAAFPQxFxWIBhzpwiXSsXxoZvFZ1JT1Y8ecif96hxmA3qOhIZ+cj5Oc9i/B9dX337yPmaBb52PR/O5bxZlBtjYH4HqsAAeJMMe7yhAAAgAElEQVT5q+ZqiyP9kJs+XxE/82AXI5m0bfl5eqKLQSsTszqYGtAG4IeAH7ckPPVhK0IFAgB8coqtNTdNMs6cKQeULlsF9w8Lku1PVScj4K/lxR6FtzqRpQNLnfcjFFscZZbpaLk/vmLhPRpLOf1DUvFHHP/gFf/gFf/leMW/nXEpIKCA8I13t7wugQMDX/1wuogEYOvm3X6hdR7rvMlCxTCnuV2eIKduzkPGU/Z9KueDDLGqevLRSYaq5pIZQY4Gn4/2a0m9WX53Jw73L3VA+b+UWNFcrsFftUF3YlIgtLHQUcWM6EmHDkZsDEADcLkzI48NwzeD/fHqdvmxHYonW7ZvBjByNHt4KCEz3xhjYO+HeeCzmqoEYGDB9fmU2LuhbRkwyqw8PZiqnbsLPOYNhBsuVGU5VJzgxlYV3FTZwXpRXOnIISDH0N1mXt0Z+YLrpiPnA8DXM44EcOt9en9uBdXUsC3DOoepAJfSct++gP3DCkyqa/dC92gZr/btiMMcKLZWgHMyLODwNob0P85bx58Jc+m2A2CBr9pgmzlUwZABZvRqAGAeiL0pFSnmiCOAj4WHf1PVbKofHwNZnkdgIICwiXd9vt4fJRofHZPOxXSpKEkC3YbBxFAoFt5hbnhsBoKbXUvujhvvXkNqD/SYbXadtjtJsAYCAyZGzIxH4czLQ6Ra/ZmaFmjDmZVYZXZmRpPb3G1yybmksZ4CL0065bUpGINjgiYJLyM+zVtP4J61rjpWMviYlYzZX2RUJNmnlw9pXg8VwAxDvlBpu0HL0QnZkflINxQS0vXvxGMD+xkHu2sPo2eWZns4RmuIo8c5/lhrAMiYfP4RcIQKf5xz04t1dIrB/ChTkg0ksgGB1QEUQFPH53oNyOmyr6WZ0j0/0brmazCQ1JkpOWVqYwdgm2OL/6BpMsdSnTNbP74BunTckhCYK9uzrhKlb19wHDnHmkpzo3Xt9yOgnMiWGGnPsMdQsXSlIX0jMmRHB75kDmUnDbOYtvHV57n1OVzJKgnUegEg8ZvkDeMbofzE6CDWIluuFNB+boEsrecMhEBB6/ugMXTdT3VGtufCKKYPmVwtnfmgDH4wggZB0faxtAUr+tSPOFya6wSqt589wiXjURC5fpv/koxDvWJLygxVscqNbjOxaPT89JT8c15W8Zvv7Vlo4poZ2C1hl0pSDKeLIvyNEPGl/X/MsPNX3+WfMs3dJYPEMv/wvixwmNeW2H6f8WBlPuwf0rB7HFPUVARWgz+zyvpkkodGM9XjHJHzeE8lkOoMij7nEoCZeIUfH8fyBYwljXcDRsXZJ0kPsKseIGM0BHSxFGEALrJeM+VBoSdTz0L/YBi+sf8cvsk1daOAkvOuE0mT2kcS2f7P1SGWu9/MPaJJLgVS+P16+HNYqwEuY4xNKepPwPg/ftjSAzwxmkszHUArQiCrsIQT/zVTNRos6yNf+IC9cwIZPS+3xVEX93+dv1ex1eW/agZ4fmHjtyTuNqyT6ZqLEzmYTxTgEMVABaRccBXkxOJPbrh8Pj0nULlTj+UzptiRULGpnpLPlsQymPxc0PN/hxBEAxwLof14RBC4fQwDzycQFv0uOsey0Z2VVwJ//UEqXHZjroohve8765kWIIAUuVDXov3vzFsAoHwJMg9HK4B3UjryQrK467ruCNzjhic1+scGLruBuLtoxZic/71Z7aZUTE6xU/N0yedkkcsOiJl2wbWelVcInyXj3lz5RJt/xFGNSzXfbcg3LEMm2QCMgprp6H13Psdaz0KgBoyN3SbYO1fPJ390mmyJnifmiRfq78N7DSbTmXOA6zrLNdVJw4kmzKXjk3UYxGYwFFG0DNprjlufgn/FopM9ugphbyAll1jdkBa45OXB4xJOc/wXhgq0TzDTbGIJrL5wmNIt3w3lfwbMIkTkIc8N+S4TLDvx8LZvzp9wbOE+uwo4cNwiIUYszC3ChPZ+z63CjTqq7Mh38p29sczp1eTRRbbylMwG8hLbUoTOs1ZbZhM8w2Y/ax/1/r1394QDs2RuhTPlVxNsx0O6Kisex26pop94nDGCjjUCH3BA4xLlKRLpmA6SdYrEE45LPo48Sj65TuQP8LI8AO0D7+G5OI/6zwosHWAxU/k68+kzNyInMMqXyXFvdlK4MCx22K4eq0WMMMWd+bAkiDHYpWPs5K0u2hnHP7S8+2p/+H/Y+7YlSW5cSQfIyKqZ3f//05GqMkhgHxwXZvdYn306nSbrkJlUqspLXEhcHA6HqeHaArrx9j8x9ABAx52Ux8w48zUePe46AOIoI9aPBElqacfOYzuuOsfs/L6xI2YWmyySb3t51hmP0Wby87+iKD1TLt/ByLfI9t1JujX3DJA4joJEEh1M2ohRJWkifKc7VJwdcfWptJ/Y3amYxUrHri5s5N43wO0Vh/7dxx+84g9e8U/HK35d0pVgvpWecA8q1mASUmv/+DIRGqaRsEPLaAA/JEPIhCkvJAykKuALgMeAxHhtMRa9jLZJa7NeyVRAJ/qUAovqYH3/JDsMdBo7hp5mX5yAmyDwYOTcgRvxUI/v8UjgAOqmslIr9GdZeGM1C2lIWFSlriUNSCTPOIIs7/9uGOez2SBoIIIhD7aty8DY3eKdzrN1iWeB0ibe2qRxLVfsQG6S4uhBUs/VPYpeArjjEU505HvUjnZXK6br2YN7B/PJtCukqWcr84InI2X/XYWAHoJ5d3LjgmSvZqANtIYxX5cJKZ/3PO7J2xzyiWKQWQdGTDVyACX6vsiOa2DQO0J3X/VRHYVAgkRtgOz4OY8MlrjnIgiIooPqLJbO9htAa+XD6YBqOCeAHKZ5FqbyVqsIWVxZQAEgPuv7/QASa4DzlBpaCeBgQfB3YwgT4gJVuCYzyLKQ9XM4djDVATqQO5im124nmQ7rhiBnFeQVOHqfTFdIgV25d0Y9KxaUjnNi9NkJlkgktxyUmzaEgbLH/onEPpw8Df3m8wbwjEQ2EzyRBVktNK/xXfk6d8FdXYKCoRMyBPOZ13djhySD127j0wASzMrgWMthTUM/0/VmjCCxSB4BDJSUTAGUqi/+rFnbTHKBtDssk1dHqmit8RysiXoHfzrnwK2XRAFAzn1RJfFALiRRwj2kS4/LSHgj7znPuVnfqS+fQB8Bu/Z3uQdbXsgqCBMfP1kFl1WAwD33S3Cx9wZkliTCWc5OxtDJCBJxeIDJpoZ1SoGA8hOQkFUIJnG8s8CA+u5jFkEOcFWZBSqKWRRGPYbUOkSevO+SgRuv6yMYsaN0nB02gJN9Qy+/AWl2arruefjjc07eOlrFeZ15H9h5maSTuj+4CtTj67/7b5GU+hvJecm4YLkPVHHX/YrO6wH8Tz4Hgp5fUhK2QLbfK869A2AoBzoDFZc8gl1+B0nIfFfQ7AAsC+AzQaAEwigD5GrxfOPvQ8rWWyRXjAHDFw0wcA9QMDuzJFiwXsOh2UF0jjNsYK192aDrDi14YNrEE/8FVJcrJMKaakMZ4a8GbfbzyH+cazJ9qCoQSU+C31CDlhwuWbVJpAIE9jC0su2G4xtJiEq22kzClPYsU4tEKO0S40LUXqhY37VIJgZrxYCIK117DfBZhRxezh3c+gKa3yn/Ae7NId/ICqE4Sqb3tB3JOH+Xg+t/lSybjBjIG3M/EHkBwdm+ftZPnlGM6k7+8k+ygOgsTBJSHiwUgfbcHebPKkJY5kgSa88MU54EDVwKHHKVYHXms4yvz+vSJjGtAGIZ42S+5C2lFBEvwITc3amXH37tlvKgXZyJ92jKI+e+rzI39/LyhQ+5yveKOObKeDPOQ7RnogFFVEpWtScjKI4rpBJ22AQ1b0lNoKVCQoKSQ+oTJLuR/FYfAY55gyIluRXgG0B2v8RaMFd45gbIod0B5sRpPiRnVASIAnaP7L0xfEKwkOxyyrVwRhffo5RCdxR4pEomNYQDvqsInx1u4wAy3uTgc2kweoNDPKhi3QoKAAC3sjF2tjhKM3Tz8jbukoXZsKPb6EB4i/37rNgrN4bAurC42ZFGMSz6NehCya96z5rNOYElCSQEukaAv64x1666H17nSGzJfU20hoQMznZlLtbVzK0okHkEoeAE+xMd2FGIEqGsvw2JAk/kDecsYEgRiFfhPKtuzFYS2ezoWpBE3QD6Lmf5b0bxc5Xv9/geDXtFn0t53R2zZjKW95YbNQVm3IvNQjRwSqcpJHJvdhN+UWklbR2DNADCvaCZKx5AW16rkmrpUcxlB+HCSAa+PGrcg+lXLha8Tsr4vYcdXWAAApMLex6nuY99kBhOzt8DQlYzCJkaa1pzlSv+a6HaBjsz+V3JnGe+xC+vkiw8ihqVmwrHdNC25YmFvHPkBwhZNsJIgh2YjPAiWLAE16pL7Pn47P7cLkryxwaIIT3XvKXpgygca9enwjVLa9kxn/e0i1M4ClDcq4FZeheKXuTOsgDOBwFgY6UcaOwRVaEygADuCxqzvlVWqzmFfXT3mvtENxfXHYZwDYs5UwI5JCcr/UklKRzZgju2xVqX6DwVFrtTAi9V8cyOYlonuC0BGoOIuM/7W1Ku0F3/iyzgbz7+4BV/8Ip/OF7xPyOEPjEqSOcCu6DFtnjZs7K4sHT0BQBtBLHLeN5VFOjPSJammeFKoHQrLGUIqisrbx5gOiuAyQUMebIdD87OAWjLMrhDRzMiRQRDElyYVRXdgzqpWdV9uRb0Bsv2ORa7krciweKJ18VDnca26a0tdTaMLEWAC3AYgyWJRfPCNgIAi0GGEWCaP0tnVrBLhzirkivOA6Dj173jPqUjO59gjAH1blEc+KwBvZBnDE2sqBnH7QmH92oOXAwjNPVhIPsnjJ4Z2cs9F2iWpEXJvu0LIzrgXB0eQfgGh0qPOYHoNFFvRlrleiZvp73aOyc3fgTjHim3CIZfsNCTlwBHyOrK4YXUBFdBSaI8bKDnQny/sH/qSJYmDkdvNPLqs1lyCohxNtJiGyMGyNJRJ7szTV9LSwJX7MEtHGyewU4aYyvGX7fD1uxg0dgrUusv1yKZlbt1UgUxj0xwjxzontr0gnE3i1C8i7+P0DDd96zk6YGJHa3UEo5hBQMuj9QExx5VzOn76tGxeCYFVmyB6cr28gLcGHBaJE58ZjGEsz7D6nruw+KIA77ZLt86uoaUXko2iIjh8kxYoxjmgKYkiLfp33MVA/lVGzmTiAYII1zDtvEiz/kOhzrZk2lbUTO2WlbpPEatsVGyDPeM4M1bsjUL1xadbB/B8IdQxxfbgCz26qpvsthLl0xkzKt5LpkEOO1pp0oASsO4Q8OVsjzWiVSsWGzdXGvugI4CSzQ6b8XZRctgyMkwEwqN8jxTOoJ7rQgbe3I2gbcW+H3IbF7gdb3IH8sEknHkAx8BmtoIoGPJkSDy2oCYyNMoZVy9lb3zFdeiAzO6mxEApwMY9Tsvf3v5Llmi1OROQIJA1DiC9u/w7bOAHsXEsi/GBAdTfmCwPV5zRsVx/Zug0BgDZmcyleBlF9yLkIO+DyJ4Ceh+98HYaiLlNb4PWbsyVRslX5LHFUks7Y8B0flksY6mouYsriiwE7QKxmJ8Dh/bOML6tEOj4gbGOR5yoNrv2ywiySF4VCASvPX7LZ+JHP5lYeb68B4km/OLxA3PTBzQMWnO2rhcC7zYGsm/AJ57UijdajHDIrv/4faTXd0e9h6pkh37u0zGiDkYJPEk0aHAn5qXFXJ0lveMf69CFGjr3JJprS97FHHnliRAkqccDMJBuT0teeYZrMBVktrmTR5KxMCXlE9VLFgUGJs4dMZzHsUFdAfWRMvASg/A9shHOBT5fYq2wGsMCHRCKxJrQrUkj7cZctaS+V8EwTSZz3FIF9WuzKN2zzWoQnCQBkUAyYICgOn3S87GAsyGpu6/J0gQMUEUj/KuVgwXBYwkgAly2PiBCx1+LZUeICMS4x37ioB4EoLOvFckpcy89mD/jYUrVcpT/VTsBMoXiAr2GaPWS3q9uwi2g3LV8fmPAOKWdDcdyTixt0sPkFG2gM8rQWPZaUus7IpJ+6Ihd9jAhR17aDqBGRGBbsmwgc90G4Y80Mz6WF0ae8tCmlIn1xIQc3YJzojyGquwlIC7ea2lHzJ9AA6xBZF/4Z0O3Z+FKbh5Ff4d+whU4n5UXMC4rFngu+LjIgv4xne8dngDdDUXAz2M2w89gzqvnBsr0Umwm7UNRJ6ay6YgekBqHtpdRdoJwYj9bB6+t3wVomBxdEPxour9rCkzT6oCNbrYmTjP+TsWl+Pv1oQGkYudP5t+auCc0RsX9FPxQJEdEMMQ0naCkevPT4yHQGu+z90457ukwgXzGG0gUQxdB+NjJA6DjFsHxma+RMgwYmtoEfjaB1/IcQXYORdjVhehi2NmwTVnZe9Rz999HTYu8jVvQoUp518TSwkQEFJ29x2Omu+oX0e8DACc1Z3zAlPqq+JrLGywAyyLNufhKhUvqXReUXOmLWN1VBcBcHSXu9Zsons4ct5Rd6MnqQhgLp02lp/zFObTEueSzlJ91Hdpzpw+4nwJQFic+0yEOVPu/+twSTHCDFsReAiOeUpKZZIduSC494YRmOZcHX7OhMHkKoJvSVld/NK1F+4IIYdKFcAr14ICib3IhPu/KOyT6jEx5gRgPKdJqIK0f0zQ3g07CB6Jt60pda4GZfzvBgSxyd2xal6XIfv2EmNZ20om2V1wyXiRs9X9OOKTv+peW9ixbR9lyxTPPhd/lF9zea+uwD94xR+84p+OV/zaiw3A57OqWvmIE8QFmGAIch5SVuu/q11Wj4fSgLK9MF1rmGmc5yUnU3YfBjse5GhQevnf+HEGUw6DhAAqEpsE/H+lnmi1S+uEhoYh9Avmjufk2bl2dwSAmo/yeou8Z5nERlvWFVieVFZD+3c5NJtB33deKsF6jYCYVwtEp4HgqsBqiZN+Q2pW+MxRLctBZjo5NdFRciZEwJYvINlMAiDa6YrBpc/oVgvQ4gcd0404t2RZlGbtmdSx+2SgmWIKRIsoW+HNDEP+DZ0xaDEHOmIDYJuhX6u6odx3PB8/TJ1hhZ5mJYt7HiysNznkCaBn4xQvRdqobmxg7NhvMXQXdC4A5xnlZWnc/9s6GGSb8GvApqqQ+3h+EVykvMzyDRQAR26BO4snTBYEzwi4KH3isS7bcadUj4jB51X7kOCEpQIoBKPaS1MgaKClhtiBl3uahpiSQVFgBVCX4hbmSHow/Bjw3Rt2RJvwnbJ/17OHvOsJeoSxN4VqdpAFM4I3Jhyc95MTlIxhz0DrJGXpOvZCgiDNTuQA3gyOeS+XCBDFa8KLwWio7f0B14+eqZXsq5DK0zEYyJkB88ayv2kbZ3yAOU5Kz9bcswEe6cBlaCeYz5fCvzyvNxpECwDfQ3lNAZhOdBfZ0rucPJB+IqNUw/2DJ2TXWTC2/GjTFsOefwWhgPfnTqc9gIHVg7elP0uTHQ00ISDlacR7jx7FxJ2z+3xX8Ew7ncB6+OWQWhIhaJ+a9yVSYFrSZJct3KOlArg/W7YCh2xQajK7C2x0ELXr+hbXCLgfVDWGU57lAe05YA64bJzDy0uyE+GDt5W01xDKJ0AAHzsAy5E0iJdhs0/5u+51g0J9Jtn6TZuY+uGrWLGOTXswgNQZ5jVGoHrEM/vonsl7VUx0ZwnEtmOPFRrNbReuxcHb9FGvc+74g1XB/i2OAKStZJVi0Plo8M3HrkRxZuIosdYFAaz5y55aYiRMxKEOkpZ8wtxgGoCL8NkVYFM/rLLZQxM/D7Zznlesja3SnQb1/l2JwVaNYpWXzxRz+Ez7tqtA1ivqdQbhVSBSSwol488E8GCnzgK7FHM75dtGy/hsJdPb3fHI67AN6MJ24Dk2MF79yfBRMabYRLUjIUD40RHStRc7MwQF6LkO7uq0JyPnk0bciv58XvcNEZSdw+Rey9kytGsOkRtDATOOqh9jxIwQCfAkiVGCO77bTHDpIEg6KG+j8fzJolxkVEsCk4DaZ4NSYt1xF2nKkI1XXv/vP+7xxNhZVKXNJ2NRahj2nn8z7hjo+WVRaAQEy6XioRy0bLrwDL8ts5ND05C/2q+5VwHs8V/axe/yMaPsYOxlsyrM8vcJG8T7s4+hXjMiX8kv1Jj9JMF4zvks/JznWFWwhNDeZAzZ964lvQsAS2kP7R361ENvXxeuuMYbvVbEc+6EI9PhzKFu5Wt4L3fscXY+1TUJyU/TvZ7BBp8hJX0aHKdCurQ4hbWNYDE6fI1zDml+LkDpZHdgr90yKUdyalHQBlBMco/1YUIgadsd800DhBGFy0XA4zI8N2ctp7WYLpj1sKWKeaUYYIL5ZrJD3/PZ60lQ+QbUE8eBCXNaQcipmQGDc0gznjNRzDkrR3CbzQqWYwh2FDPtIDGySByxU8UJWp1VE1qxf2bo7hp7R+BueNb7AtQ5ipncc91h5U45sPZ9UbHgJ/M7l1SxygYATwn5QzovwIJr90xZP9bfiGveF8+Xtt6wUnUhZsxIFmsjrtrIeJp2zHbniyNIvUlIANjV1Hloy2/uaBMhHtXrLmPTAsWyy9IdKj3CwCNP3TH/ikDeREYXJoz/nv4Fx2SRel+A/F8AwDPeL76Ze6tCF2cNQQAZUXTSVfdV/BWf4DWzoDHGgK11xMNZ4JglWf4Wh35xvQjxv+w85jpLGd4+Z8fkM/IJkcWOBbHCDJNF774BvVvCbvb9yWPn+ICjQJqFlINdEf/sF+JL5kRwzgyysvPRWWVNXhAf+HfaRol4Vh13xO/DTvsacYd4rR0WCyLeqqTjNT+2cQEQXLux0MQqTXpmNIZix/rOuYFfMjE3qgBahdAjDrx25nON+mVRx9w7n1SH44vFhHS1s0lc7ufPHj6O945AthAIB2UE6cuz+MB9dovEcs5CFZCMKDMjOXwMyDjXfuYYRpxmAGkTnt4xypoDWUD3wL7Gfja5zEbtqR257rkL3+X4g1f8wSv+6XjF/0cHExtZJZwLhBJwZ2tVAbmaGwVHCznwtB0Pk1UPtqIeCetxfuzKyXdygZRDOaq61UJeSWr83WNL5vfHDcsN+OOtsNBwBXoDcNxgqCS7VqL98r7jjGrRZdAF6xsgHSxlcD+Iyldikceaz6Myz2M68Ij7u2WXEc9Na9W9QSbqTCmQY5ZKHboIhMOrXX0xUuKm041xJwCeBoTfxfd0Z5pEhXn4QMqe0/69FpjOZ+tCRghZzG10REYkzgtmCMcZVVsloOXusOcF1dyQoeNsfyPlPar674B0agH89NR/72E+oWI1A6h3ghWjBx5tv0A9C0cbigsoIyvZlgnHlmdL2KXk5FnAjSCYg37DIVcu0jrVWxGdX5RI49+zq0dg4piVWMR5+GGsVYEQQ9mxftR2sYgMDljs27IF0iyMvN7jDqmwFJpFyn0MTeXpewWxEIVcXBNzsz32lBNEVPPdHXB7aQUHgBEAJAeTd5LDYlsHm8lcSxm//vwOLkV2sSamS4S4LADRdjlnbwkDXYC25BmMlhshCyCCD+N+f9gHdkod4S5ZoGIp7ZBMFDr0lgrJtcQkTESi4TodV4JdHTicrAcrbWMlA/qNDiY2VnIz4tm5uruLMQp/ZxHaynYgpDZy+DfXxA0rJqw5nbiZYc9gmwPH7K4Hyp9EcqunCQ7NZRbxEyhbh4lyPIe/rmsoRmj5mlgn0sjkh2ss7V8G9iuTGEgV7E2VLe7uWPoV5zEqyDV0h0oCA+yWa8atHD4qgYQBp6LjNV8YQjWLMIBEuEHjBUtmsY+WhmyTPiOhETKSJOxVxABzC3rOT/venEN43rfP3eFN+/b8f2BY93E6wqXagsmEDuW8mQRel1dhW1KuEgOXJoM5A8LNc/LUi2f6mwGdejLNqCmui8Oeod8he+Uxl+A9DvcbjonhsV+y3d5BiU2AxZR8fc3SkQKxNMAxdrbGW0zgkfxWp8rmvcl+o/QFW8imB0K5XQQi3YU+Iubj7wNAcMUNzq9zeHXcF3jhjHuYHAu1woEjMWpfxOsJX1q/a8kgl3FITvT3FKAZg9hP4M/d8Y1BBnSsNQiwfFUiuTXkUO+WKMvjZN/DZ8l24dDaT3+ophUvbl14hFaEB7hn6HJZdoLRbya4o0d8BRS7v6S42KEkYMxQ+tye53xx4cf98B3SFWFj7+icFhFcahBccHOYXLSv5iE5IRCTSj7zGocZZ50CJBpX9/sdMeQMqaM3Otak/VJFP1aJQl/sIekYLYsGFNLTmBMrWFtZkAplgWSttveORHFPGnSdp4r0EW9l0cVhNsDC0MYdheH0GQY+30xCO3JLO3rYLp9g9zS6Azy+10GgMIlB8JxvcR3x4KLw1wuQppRbQscsgLRMexlyILMM5lwP7KP4y/8+8Ui/5opnzMgoHX6fFSMBpxRzvM6UAIIoplvPhQBt/gKwgtg01jEMWxKI4zOTIEGirot51jSpYpYJr1EPAp+BxVdKgeZ+QhSzA7AI0EKXhVR8EJrcYa4lGWcG/DinTKxjo2sLZ4IB1TkqB6HrXQ7OOtXyM6swiS62OhRSmMVkbOdeMT7ANbqdXQ98nXDPWgJ+jK1hRsLFcRsW678vh9oEZy+DzyHn4yHtNCq3NxzzZuLXI2arqQiGK8yeRVTL1+6wqQruN3evTgL7aW4OAf+UxXKzmCckPS8WnY98D8ETjhjCjekgWRdaYCbmrBzrsyRXG8S36JRT11pL7GzMDod4j3+WXaKsXCiURLz8NRVz/5x7pI0ZMZcMAHOreNSZb29IFbmJGUU8WYWPB2ePO2fdZD+Sg3KThlnxnhzBbj5RwxeGe+wPLSLE6YIGlDkaPqODGxVjuwCy32dfEVRs2caeGnVgCH5hluoNwPwjiAqSecJrfA4otjEOC2PDzwrsRvz0T4e6Rz6vkygBVKGvfMVhzxSz4lXGPBsuXvHg9BE5u/c/EtL2YVgrTi28sPuiR8jzA40BZOc8MYKrZ7Rr33boiKsAACAASURBVL/CDRyVF73kYKJkUMks2WjbSnKQAxhZlGURjLf3GLWBBJylSB6Z9TgAGzmjaMPi2QwfNVYk95yVrSC4XYSUjOf9KFD4RRsiEtcYeamxaHILT8KwcEUsx5TKahao7Xxfjjf5GzVf1RzzJ1WilpsGDnucW0vl5e/vcPzBK/7gFf90vOKXBaaJDbcRI1g6QFZ04UAgMVgVBUQXmzBuB59/u6WZGurJvj8TghxmHK990Tg+HMqM190xMJYfvuum5JM0F3ikz60V2YHPOAtA2a4p/WBPyaisCg4DxP0HZ0kn484uA7VZyR5++CwRLmR3hw2p66Ke8uvCAgg081iAdrsdN1OnkoC2/nx2x6ih23hjJhEoRYG4ZZZ6l9nW98K8K0SGbbFZrb3JtrKhxaK61ajPj9AfxxHEAYAY1npdjFyi8czVsNc33ASWjOE9saUTNwBVuGI9i23WHsUKQ0jw1dyI8VPX1e8+VDpUA4BvrKiaN3vw1F1tv+jo59GyZVWdhgGhZw20ZAOS9cLsJuRXYuCfOzSTKLMAqNI4Wd7kOA89vt+gHg7nBfhKC9fMOFmUjBBhsqOioQIeCbV3Ut6F1UNywlMju50qAEzNIeRRHLG+p5AZbOlgnAqNb7LYst02AQ7OyHgNQG7dvGEb9XeJhGjuDjS3aH1ekatccbaUpk3cUWCTzcI9bfvGA/ry/Xz9jOejkLXI+BFK6RHQpIQhC4PPuEfc62MMwHivqgdKo9AU128l8ZSFxDj/SK7z+W8Bi4ERmIsI/BeD/X7XMWK+nRz74YU1AyDvKe9ABNTyVwVPqmzXB4ovAR1gWzkYUN9uHEqagcMLUNdBw4zkXbxt8LBmACcrjIQDCzkpA8vHr/NbclsNPwAe7zVbrxXBTsmqGtjdc0/UGVQ4HBJBoNuqwvLUBqqWc32KCwMtpTSKHT4xdY3Lbv0kh5IMxy4wfJU5tgJT3J8Fsozw1xxMvsjSycHrR0/udNRsnOy2c+nOiw0/iqMJ2njJbZDJl5Z4kekDglR7WxQlcsh5AOBgskcbtLDMwq5F5y2kkhlxSlvwJmcB5DUxFjwhwsIzdnRmv1MHEwiZJLtXI4E1W5AIpmWEfTXDQK8zhCSyHfcAUayASxJWwfUZ5KKd8lZ9lwRWIcSAAY7uqo+4JjstuhNjQ+AYwm5fIIkpvU/ihGCixUottpq8StXNn9a1NXAEg0gWZfKcN1Zc6xDnOsGxT3yCMRywluEKA0KWeha5onM24mdIyq80KC5yzMdxx9z1Dbir0+mQl/ENBGAn8u/4Ti0i1oSVDcsBwMutAMP0fwBtBffBhIdN0YNRmNfgMDwjBoFlTNEx7pC7Eurl4IyG8EGO1NQ/uloO9FYE8OGAp19H5SnO1m7kUOl3OnLuYsVA9XvBKv15ku9UM77IaYk5S2WxeBvFBca/fX+HzGIaJut5OpN2M9rxto4JrnLPMNHn73OuCZ9v/yxuFfulYsMcWvlgEaBEqkgkphWDneBurl8X2mUA4Fanlx4HKztn7d7YxeS+Dr9Qsjve/n+LFFP3Cjs/7QFZjMeWWs1Ja4TlWbLsW3uwOhhW4grvIe5YsmskZYIU9PM5W6pljSTOS8wL9BYYrnxwYcsWOrbW41mljKeBnTZww3TKjQM9h1MFGN45Qu5bPzr8suswwby68UDMssnrRxXpO6ZCF+3e5OCaVIzs+Ev/L4IkHVJGJ+3BqrykiXZBEEDnxpoVO4k9KdlF8FlrMI8zd8n9J1jI2Xi5pwDmNEUQrRghnrs7Jn4ARgU8h2SrI/dIg7kb7DqNzAMiDkd3yhy1/jpUtSSq1vBDfjWAtK14xLVC/yLRzgw+J1bG2REjDyFhI+PsPvW+wSdpLS9vzSTcAbKiMBvzNoBWn4DYAVz1vV7h4w0O1LUqlrS9oV3zAjs50eqD5xoff8nfgK0gfSyk77CYHcIu2di32iB776uehwUc0oLxnfAHVjxr+GgbWLlpjJl4k0OCGJ5deYnzueAglz/p2qXl2VR23xOgcteXQs2xEHMdyA8+CwDU/l2vy5lQKt21gsN/1bM9ik1b7gqrPbq1T9B++Vd1KGZetmEYBTi37GRifyW/6R7opjWAH0B3jRwoaXr60C4ec80P95oHN8OfvxBih1VXg4YDckd0iHM/lOzimWHklhOv6zMxfNbg+75viWcslgji4ibB531VB8yeu2QKMx40rCK8DiwM5zpRB8zoH104L24aDnyLX3NFaFgdx0k+TuKMUHXKkfF2xvv5/BWGR4Dkz7qvOZcKhrdTXPmDV/zBK/7peMUvkXe2QQLZSprziLo6zQBJZiaveXJMTfLIFqsczLUjkD+ZdOfBhOrHB38edgRL+2BUBYsRqOR7CFvPE4hgAnUWZYDSIQ3QdPoKZye4D8bYRoPMGVCOLcggFZ5Fo8kAzAFUQih4sfqGqBQeG07SCfOmJKB7ZbuiMPks1h9QbNGqeCawH9cUfViAO64A9t2dSTmCSeNMsoZzjhRdJY9dup9sp8zvuqMFfCIXWTifEJ2lkwUuXAdDp4eqDuM95JC++I5leGQ1OvWOfRfbaY/1whQj86ITWbYfWmRG8TmK2pTvcpAlMEqOJwOKravs3QWUYank/5B8y6It/x3GWHK4M39beckIs7G0FBVRn48CdxwbZk6Na1PskDcZxPTKsLiznfIEEJg4KR67DWqxY7Kt05IVg9DWT2MYr9OBma11MMz4/XcNBY17F2sk9flj6wE+S/5kSEg3CGJ9MTHIYH7B8AgbMHcyCdvhuo/WJE9gFDE8Lx1aMFnnCxjZDmJnELQHh9SDNqoSG7lA2UCmiSdLfLrCoz3V3TCUutDlgA5Azc+hlsoZFcMXYANihh3FS2rv1uooJ+LONOs8f97yDG5WzeMYWWw0rtd3OtJn7LTPMYOD554D61dLFyYQ5zkMkoXxGUF76vIzWA1/o8bBsztZoTEbLPSDFag1ZgHkTufsO95wO1gyQbSYlI8UcUpcGvjaV4FTfv/BdJYovOeeyc9Lp/49+FS3L0ix/hcQs79qpYrW7Dv4QrLJBx5FknDcIYFh1WGSEpfnniy5C+BlBoYVa6+ZgFsBxYoh1R3wkOHEq81pBMWEFUexk0CiRILo3FdeA4dPX5H3R+NT018nW32aYMjAjc7JBoJ9JDGg2oGhg8mOKnQTeFRVpCLudiMBBwnknECXA/qAgky+aRdyJlqeswFoBv87HCyEJMC7MgDXSQboYPcmdfaP2QUHGUHRiaPq5DbYq+RcLYfJbAsJUKJ71817Sx3tkEko35Xf80r0ybV1J+IOxlTijGsymHYTPJqBUV3yBxxS7H4xMp7ztUn6SPtBgCBlDLgnLpuYQuDveRCusgNqumMPzpG0A7weaFmmXJtM2JIQ1fIgWWoZbi8F/3wGM+V0xSvOFL1wp52ImE1VAkAVbJGeGRFxs/gsoHW4FXSZLnUML+kHE9Se5eNyGHZ1HWkksPkzQHAhJbGlQD2AcXWAMAWUHPav1oL3jNV4dvxPdtMp3o0PMeWT6Wrax5Qr9rMQAQ4ZjlKPiMT8hXyPNqoAxn4fW0tWyATFjh1LKdah4D004KSqplROY9ksurhE0v5C+bMifBU4sbL7wTE0JE/Ej84J2j99KRCSGMbX5q+92bWKAEqaUcn8KJmuVqxQ3R5544LluQrq+82edW3TB9mXm0UTB4GqPDO1nKnSa2zupjqmrXfRKgbqFmh2QNReaGRG7ao4PWd4QD0AJqnh0ABw5zn7qr8PyAGACqhWYEhZIRLInnXdLDRwryZ5zZUdGEUUtQs2E/gMAO8oZpz+c6viLEzl8SPJ8ncfM7vdTGJGzgop+ivWHliOyWJZDb73sruXKAwTtq0KVYCRaAYAsmA2I+Z5EmzTiWsHvhHyOq/HQs6gPokOGooG6g3wbfXu+AscQhGdNA6MY7aaRYeFw+kbAqTKGRT9urgGcA9lN0TmVMArllBS+3EK045ZHZvnBOdeeahi2z4IgS2r3nOnmKMw7jqwoSH4ToDxZHBHbiHmuA//SdDT6looHcjPewTwLueEYelnUaB0EaIpYQTjlNsr81RRrBFZ91gYkdOK0NzuKNYx523bOJHdHiNxceg2uPK7TFqOk50xYOExbSmSdC2/Bub+l48kjeQcxZxjCa+6Ce1LxhOe91rLFpEtkLhh+mUvdn2W2ePTejb10Ynw344kfroveEht9Xzx4xrMkx3FmDxyhVqJIuUDbfDvwx0zSQnhoNxJtE5BPr41ur/BjqeMIX/ssZsuVF8prE/KTEwfwE51gMAMT9jKUPYrw2XmMxyVIEvr9plo4X9dKOgbooslaH6vx3sE2dmad8mdElrcv0+syJGHWRWgtIoHmoaBzwVdvCNQTdmxIQqVhWfY2pTKO0n9gOLK4uKBmdbs0cCOX3yPa3WFsqv2jhy3u5728Q3vcPzBK/7gFf90vOKXfmxDo4UvXxZFpYkKNkUcNSQLWYzoYMKFDt29DcLHBp7aRZqVQ7hC7s32mUT9XBwwoBL5ARzBULZ5dYrLzxlRZaexvfGsGz32KkPY81MiCCv2Q37vAVgvBpimVlr2dQ52455d9CkgOT/ozFzCYTGTRm0Aj82oIrhHDCRVaRueRZcCBARLH9VmbnLVs8jZUQsLGAFMJ6AhHESWjA8oXeoV57Jk4U7HbKFnrFIyGelcGdR7VUA1gHRzY6JnBnPHQ/8Vd4kdFlueGLnah2GFsfQcVj20ohiRwbZrJBDB4splzYrOhDJdt1kymN/n2DE/ykLirVtkB2xJDBllAOoObLvJMBOuJQARDERym8GECGYUmXhkdhFOVh3Yi2wOaSAqC12XBdDkjq+5q7DscZ4CgeozDONGMq4sZhXdjir2Tk9IwWFRdBwasj4GLNngiAsB8H/4fn3iHs9ai8reYJTOviqZF7kfDw0jiS6fK571PYAV0opDNkQHZLBAY2Z46EQPVU3GRjDn3QFZuKP9/Lo/20kcLJhk/NlPTC3BFi8bYsOga0Sii3iuG9M+AthbgNxlL5B/z6d4yBaV8mbcs9q3wdJrINghqpDBgMWTPZlsiX0U49EAJmpI/E22AgD4BxyfdV4sTA3IEVC+w6EwgjOToCbC8ZMFclMuSyayoD0LcLAGbUVhMuCinGkmArEHrgi+TsXeYqfKqPuuWM2wi9eZGCxIGDm80d3x1GN+QQBsYpnMFuJGUsEBpqYURW7g5/SyxTP8HQB8BOCxZJaPdBhWFH59cc08dHRC5hNbm9Ag4L6ymKvis4dhXxu4s8shWbwh5ZJPxB8ZvHWRIed9jT2x5gDUMQ+Arcc+LEz/MUQhsMYiN3CFVIrgAxBgmHeYK896bYPlF9l0Huh4gmpCqakRz8vdsTzshgjEkrARIIkQYMznnkNv97QmeXjPitzO5O3CAx/+Gd0+q+xlD+aY0JS5fYNjwAH/OPK8LOgQZOa99Zo/wOcPAnCS9vHZOHjYzDmVey0So0yu63u24R58Pu3Pek/xtdGVYYArz+sOWdHulwc2dkuKgHvaBXhqMyHzeSVzWJaVbVSRljxIGRu3KtpAea5ngWMbDsY/WeEAk0kAMeR2QmVQJz19mi3YYGz6CK3+IQgWMZg85dBxWJA3FH8lL+mMvROQxlEgMG2t+rI5Xh0oJzsfYDFw2Kh4ldIyKJlEEQ3Akn9fgiKmQJiMTaddzAeYrtJT3gUAcv87cK1Mrnl86d8FyJit8lUp3fdYn8VS32olo5iA6eVNjnqXQ3BhyKr7UoUanUWEm2hJaq+ijeErbMZnyDwCWSBiR5RFbjXdSgr7HhYdzMCyJ7G/gyiYR5KC8hznyuSc64jJdhYud4GK31cqHwRgGimOJkklmND84MhnPJiqAtz1u06NNNZifj8QyhUxuNvV8fAJX449v+Aa5+erbHra4gcuPGOm1/I8twbyhwMSSAIxXgGwi/E6FwvivMaQCBwLc4VPm1JJOwrg5L5OxYCdeW4Ma9aVIAkKiCVpLsW2CA4QTOx9W8RPZ2wzBgsWs4AWcE7oGDBb2CHlNIQzLyy6HG3u6qaq4tlLobZzBBMEQN6Jwxry0jH5FsdeYd8FOnAUkBZJB4i0JvxNzgyECC7vnH9IAtJptx8w+YpinYacWuS6AzD7wl9KuSEZVkSC7qDqwuraCboSkEaslbtY9wSY3Vsm3f3oetImVVj44YGBkvzGMacGkSMYfVv67pobkdgHNlZK5OHRDGwhi/khvIfujv8cvo5lBMUYA49wkjcWwUS3kPDnHp/O3PZWQxqmO/7G6yK+4DawPaUJgcv7WuEUUNvRWujkaMe9juKidz7j+4IM2rmnfocJyom3jmHfsIhpcsQBYBge84P9UeSKLHoNDCyjXD1nVtyxDgb2tuh+i3gQXmCp4IqiJ0j+q9w24hD9iiVHfY93OaZdx9wlUBYKAKAkPuY9w2thfT75PhXBGl/dmStZwDcSaizsU5mdjvkK8HwpMCVBRSPeA4ALCzuk7nmelFuOd6iGIkkcwq7FHftwOGrcxAgi7JJDpF/RRcWoET28Mb6tWp3X+bsFXnvikR5rnhKxxPbSv99Dyz/nbDcMHPPn18u9cAVEFV8tmVKXxr0fvsLaVuSXuX1UwSnJHEP+Kux0Q3EjFZK09iSy89hndRnn6e2aiwh8mEJj/+TvOLE71/TgtfNH5kJjwCKGUz0UVJCAuDUhzB/Yiprz5e6Q8V34qYvCs+NNiD37+KsIV+9y/MEr/uAV/3S84n8kSqgqbo8BsZKDC4+E1WvUb7fS5fMSLua61bFYb2ow9HfgABdECBzUmrQ6j5LUcwewONPIZj2gM1nKJI3G9gdnvSeGx6DPIcAK0D7frvUv7olsDY4imQ/Figc4g3GQ58QHyesrxkw4JGqOR5dN3ZSj2fvQ4zwPCae1LEOjDvzdV3WQAV/1eeVYBLgj2lWs6lbJt5hQr5qMuP7OZ+Y9PipxcbmQzAZPcMGyQixIUQ0mISH/IjfcT7k1HiM1OB3w8w/gJhKPVvlkaDmzQomf/WBf7pijJTKKnVSJsnuxNN7nyI3CvbPj+hUCHR5FW+uNNACI0+nbXeuqZQNjXhUMS+YrkSC/LQKj6mA5mMAlMRA+gkEWjsB3V/LvARS0uAtKh10kNPdFos3aolDUwNs5wNPDCz1H7q9cPyxklHxIFFFSqoWHASFJmetojAGUDMYNjTWnelWXlDEyA7ZihMEawRNQVdzXKunANKL3XNAsLOUjOUAzGnTUz3AcrdtCHXPlmzP+FXO4fx97gmt4ZbFQ+WBo5J0gX4AHLPCttrewYxhqnKY4rjDv3B4aNjeD1A62zS/OYxiDwKqnFEQ6kVPKh0mmnvPg3uRwGRjmvZ9y2EPZc+pHi+uLrxBv2yciwE5ZHoKorgt3slxcq2Cthw60nYyxeqg/2/IbEkW8Bg2TTSRR7K93Hz8ki8XFsH7wARv9HDZ6DSQQwf2ZQNJo2YYRfs+bESty1eyVbIPn3uh7lezXTGSS/ACAw+QzaVItgHAAwRpvQsY9yYISQev4ulYiIj8aMjA5fR7somcwmUbMJBAFxHuIdPBwQsea7fYwD8ADEbwTJuEziQGmEh3LcS5DJeTKtPaVepIAYpR1raERtgjYq5MsQDD8yc5HdbhprYF61v5enYG3hp8oGx8yCsp7JgIYbnCOqCJnM6ruMg9DBu4kv+fwVZHqBuWw0onmknGtJDHmRs+mzMQkSUZQx+0D1+EXkvSSr58ykYWt9BeUecjkqIHFsuNjVgF97PaFd876yU4oz6J9spP5HU+eSgXuP3btLBF8FBN84KlZoCE30Qz4FkCVzNrspoIYVHL2YAb7goevkFQZ0W2AumZ+biT6R4EpyVuubR+GKf2lt50h+zoBP4m5VtJJptPfMEYUxGLAdG1ChHiv8/rePP/JWChiFJtZmIvEzi4AT7ixA17ttKtCYBIJmMRcGT/so+CFkf8OR7JFiwV9shgD1F3wozOaNsuAkm0zAUpLvTdOsIo547NYu6OZ1RbrYlgIDKvirg4qxy55MS1Q6wppjT1Q8xl2VSgBccYDgomcicpTjvlI4gEkKmaC46J1/ep8hiJSMY4eBbRikQ6BxVqBO2xmjKTwTZnkZFdzTBvP46l3fdZS+oepirlb3SJjr+BLYW+UFJCrYdWy0wAHtAqzZ1y7DsCaNoLzBR5JCAMigXI0UlKeqolPUq/GMsOj7Es+aqpzAIhZL1n8jixx16gCyvEtAnnn4IwdOTnQREtpQ3YUc2cDUDHgerpA7RvvdFDGfrRED6Seb+aO3GMsntuhjpDSj6wvysvnihu7b3HEZegIbwuOGFmPjsyM1doWp2S1QKoQRUmbCwUCK/Psyq3Ac6vClCcDXcsudNimJAA6r8XMcQ0top6LIPUU7ywi7R3nAAA3dpxYAtwkrLFASxueUuqKsQKfSVWUGwBmxHVxze64JyWdxm2A5hy39pGFLaDzE671tAGxFwVo+h1lQyVwIwjZ3Xl+rgsimzY1ciA54mXiO4zHy8W6Us3FPGKxtFd5L6TWgsasmDFGSUOZttqNB+g5BrvGksUPWRBVTGhJHaXM/8b9gsX87uN7duzE+3xgVrPtX55zKhndF7EKB7BFX/MRyQ6XI4dCFOOP/68+hhefH/EL2JkZ1gvISj0SbO5zcpMm6RRI6kCthUlLKlL+zUXL2GaHjcR6ERHcigL6t2jHU4ETqmvPqBOSlHL/FLHJwHWQ+zKvrHK4OLs9Y+6ZYuEZRBorUsMafjyXvqdVx4m1CQTeluSvseo9FSNJd1Pm4brw7NuBmstdruLGdcxf1ciHxu5CauI1S3rcikUO4CZQeVSM4CLYEb1wPqAXXkTcLP7RLHqhTk6PonXLc+tLvv4Oxx+84g9e8U/HK35ZYBoeDA1BDFZdGBGYdNvYEeTWO7WYkGy7smODJFCBONEVQZBhFmklglpV3JkMG/8CAKKLbVSI/EGy9ZrfsbFrAToOw6opaQWoj3Y4x8GEQCv5FfdKfj08jDmi/Q4w02OD9mfUnXAglw3ZwLyOdGJih86sKE5QIN/P0+y5Q7lB9t5M3KL7YeAqh6f4OBxEGHNdWPHgvJ7fWbQzeGe0DGg1NKHjuWhYtjglLLUyACoGV/LEahYCFHb3Btr6wWe12M5v/gXgKGC6RndSsmCf5dRZPKOXqwDMv6qgImbY4/O47wRvLv/5Of/WQ70CW+BMTEYASU4WcBZ0qdEGMXRLcgTTfWTyFMwEPwKeSujvAgxcrBZBMyOPfezx/CHFAoR/HpIpeqyvTEIHcni3igbTgusqz/FOgBFoLXn5ZvCq0s7EgWwhbt96fla3vA5LhlhLI7hrG81gcDIGbSe7j2HhkAVPKTliF+WE4Q/sYBRk7LbFKuGxuYuxhtjXlz9L2jGvt67CA/1yasqK3kCyUsNWLiWrnNd3UY+/ImaBYMLHd326puZuC/Hj1hmBLiU/zRiEZmJYQCN43y1AYnPDniz8A3EfsqV9DTq7A1B9l6O6s1Z3RAIR0ITx1Bgwz7vIv1NHuEHNlKUxdOJbWt1m8KnNMkMkRYk+6X5ZYwAY+NQ5ChMDpeyNg9ryEj+7SyVtyC4zvQG7GNRbP5d97KsO0pr8wNBVWHiPINQD2EgrfrKXAdSsnfg/dtL6rqQsfQGLtYaJB+A9E/Fp/qK5jH2Rmae9lirA9IkkW6S/ZqKahkWLKVcyoSZHK7mWVMKgAj8UVu/fooDtAkaBkCAJUGPLgC6pgm08YfrpeLoSTB7fOTh3FqDhI+QGgJJFcgRrHU5WPILhWYSPBfc70qMJw0fEFOnEtBPgNzjY2UngmZ218XsDpEge2s88ZnoIXgvQOby35FVqb4HyaRXT5mdarRmEbBgBm/xGvsbheCa4lOfyUvgWAFYDvNO/bE9iAT8n/Wd28w5POWIC6G4BYFSnagPCog7II+w6CRg2HLoFO5jyV5y/JjgOFJAPKERXxaYtJ6gQcWx13KkSoPOQC8u165TBcME+2OUJXoprdWo49GDctR0ReMwPUGxQL3/l+dnEHiGfYVZxQTJ9rWIZBww1N8SDYAJkoSDSH0GwdeOcbEURCfDxN1CktIxbDTm0fmPDC7WMl40nxiJj9TLH1/WMPz/i+vFDrPQOB/fS3ju6kwOkNW8wWoD0MRaxjplhhl/P4bvJGud62AUewRXiJM6sjAW3tfxWgkxuRwFuH/bVao1YVO3yWZsxsU16X77FD6R2jxWzXJgQiwDiC9ubEFVAUwVejN3q+4/IqUE5+jITvMxXJZjZQNTSfRSPtYhD0yfmnJCVfs2hAxhRFdiXh7rG7hhR/4rUw3FZskAnTjZXz/Eka1qTKJf7JOLR626d/FRvWEJrBiA6+4914pzhdO28V1ncXt35qQoNJ+raOWjO71WfEAe2SYEvjlaKEBmwY+5Cf30OuwYsutiTrCQmRbJ6l2MP5jUl9xYAdz4LAHAbRxGpZ6PkocBPOf2W9j3iDZb1361IBPCjMyiBzpgD6+6h5BBzGwoPcbgxT76Hhb9hp46I1Gw/B/0lZZA6N1IAT01QkSoZ3CQExDZaklawar83BOIYfsdnDqRIW3XmysLGDSiw0Ux2XWRDEyiMDr85qQSRsXJ1FBI7sQnIpp0Yh5xgFcnRMTQLdDzJk5CQz3KNlPnyikG5F/5NnGB8IYfXh/ocPVHiN2Lwioa7a3nLIpMfCh+0VwuUXYRwxoyqAoNSm5zNkQRj5hRUYlFcIME2Y3zTDfEPbAeWe/k7DXWW15z5DY4oLu8oxPXs3iZ2rKNrxlNSC5GDiMDVIGsXUTxjydsX43EHIMzTr2DTtCxxPPvIh5KEbZg1S0TcURSKGqaXz9ph2jhIHhyJEftQDFr51q6NJYWnafvFBEji3gDE1jzkrzw64zkzqeNdE7DTnm+M2I2LcrqS0QDG1TVnekW+PgHbi/vnmEtW4O4x+pxt1gAAIABJREFUyys7yXgreh3lmpcjv8j2gHMWPGC47kPgz0E8wkPSOWQp55wHoXVgRwxrvvAvxLycsF8au8sjhnjmmr/r7sKc8tC2b+6rLJg4Y6JWHDBsG5G7vha6WHD57BwziDzDe6zKuxx/8Io/eMU/Ha/4ZYHJoNyYydSPSjK7jbwfSgUrIcUFPrSEogVXGQo6mx0FGk+J7XiAnXBXx9KLUehqdG3G0FwcOkpDuevjiM3C7x07BkeiW8QZ+Lx2LFBHPh29Av4IjXfKQw2MuicGxcN6gQHAHvdhqhWPaA35Dqm76VpA/cNPATetmUcjZLFYvWcwuQQYcS9zJgxzzAfKPaQTlS+ey7GZxQdQAEc48UYbAGgFtplQ6t5YM8EZPxJK3tMvofyMg4bwstduMJMnZH40mITQuYyiSWFUuxlilGiJAqM1S8XVMXbrxLo7ODg17rvOYg6NCHYH0C2ab3PERo/TyoRO/Rj6OxiJux/dZuDa5gs6+LIKVjqcMV2VROVarVlYQGh0p45oGtN4tu4AVlXzS7hIuaZYHBZMfL4kZkxSJ5olGIysaK1110q89Gg/N4Qmen2UI+tXTAx67ZySmbpDxiCMoouU5IfJMdgcCltdjOHJ5mBJOt7vYNR9bjrsfchjQFa3tdd3O1YyLvyBJc8jyAFg82j5bxvmEaQ7ZhRvBY4PmH4xgIs2fV2K8pyuSAZ9BskKaXYUvAbc5nf6vLAziBgTO+9h3J+ltBhk13P+WrlxcWA/yhwrVjPwi22oGP+FsfE7D8cHFMAYLFgWscUNkvIuumE7riMcr/gHHHckPhPpkgiJAmYTrtEhkJSqH470VxZsfB6dECe4wNyESXPq5+thC+5B/heP1qaf4fSP3difj5aAkj1xBwCFAFeGr5IkqNZzT/14wH1U4HRtxfcZsIFDLBvUVv7eM66IGQfZGYsndhUxBzsiAmA2M2xlIIy6kh9YwXqKmyks2D0peyWyq/MQUMzhce4ByMCPwrCEn1JckZAYBHfKwK4eRL3C91w+YPiq5CVn69hI8Gagdf3JLnMPaSszLIuk0cjQTDbnDhatuyJZSPfQSmozUbKXeW7vcljIOFA6BiDIkE9KnOPTLRi6wl+29jVyLgKKDWZJ0UKCKa05DlBBJ+WFhimBQ/T8TMagD2xjwLyBiD1ZAHf0TAixjZY45VlrxCwJWmeH9ciuXTg2HpwRA695gHme2/mKiGKg0Ci8ENgTeDRPbM6t05x7EYUWWzAn4PLwxasWAtNZLMsOr2ECse5GregybP0lCru4/sZuff0OEQxijIduGZV01yB0+2ayowqXnnl4dn4nYFud5QC7uBBJJrKDPQb/SgCxztmKbhK2Lr7XUTbJ5QH9oM3W+wBCvJwZEyqGBQUUlFf1WdKIGM+SMqq8EI8zXHqPo+YMDcp5gUz5F832A0gYyZSHxSxcrsUknkgAtSMGqVe8nZLRBQQlaMv7kiFESV9AW2oKXdTJOShmYDc4gIGJZDIbwr/poTLgAYm4H8oMAQq5x/rLE4jPcUHSsi/r31fXvnvNIlAAw59h12NuhwbCC2DYLnkTCgJENxUUbgodAoB+fRtifiXJf9xLjyqs0v+1P+fv9JWkFLYlzffAXZ3lM7o8WCQNW4PRkLYfsfuPcbdIDFnvgvvem9cxNeSlbuwoqEZVD7fto4NkYg/u8Y8bIU26kIPb1bXsQtpNDYUQROG8CEf6bB+9fwkh/K8fPccn/K732ilZJt0VuW5JDEBbmhFA7qHMoVw6f8o9BbSUzkNngcL/rThAoi0Ax0sXZ4GDrly6iUMkgOUkX2xIdQebdGEQPvv6VkHX3fGbMbDkNBkAmPWQtYoFbWtICOZakChUbXfswXUnB+vbdULvKCxFYXP6wFK+ZwAVr2VXF4kccSZ71vfmPZnH7dsT0BqglzBjl/8uswLbkrAwHLjnX23D6KSKFAw0wEZB1YPoIT1nx0AgMUF6cfZG+jXpD43PdUAD3XtARPD0TcnYyEFyboUHaPxwQUqamxu+kbFLdKXJLzG7//VjSGJS2XWbkvxajmX6wAopfq19xJjNY/6NDK5BGVoQ0Ag5Xg9yMdAkpNoz4Jr06gTgFwysKjABtN/ZrZhn0J/QHfH5tF0p/SYIGfkgdE4GkMjpJMyrGwjOdWWOQ0lHo5jt9ew0fCUAXM5oMW1KHVlsi+K+u2NsPebTK/efGgTP9uvF9ApJanj5h2tpz14bxEhkrVCCERaapfFLADGfJVSZth74aOw5NRZ/hLtMBxsLxlH0W+HPL/8sADonG6ZMJoCXgnkpLmE0ausXZHFfaRSzt0wgibIYODs5eK9fMZb8vyJLCK/2nY4/eMUfvOKfjlf8uoMp2g8foakumokfGQ0eiUPWOx3hVANaIJDqAO642fnJBDfNNnRMVttiyBmLSrE2haeY4KYf3TbDMnC8GAStXdILNzq5BaQG1Wl0+iwIdlToBgh6uxkgeZ6cL8KznLxJDpQN27uBcjdIsAvvSiAm9Qqd0Me6DicEx8aNmlFkdgwgVlwSScKx6U0UOhQfpqWpjl3iFXhYBG1q9b4ZHQ2fZ8cG7gCopZzNczg+Y+GejMRs217YxeJwbHxXF1gEFnuEJr8w0a92vwj69IoFKNBFDX0+1UGJQ5l4HmFEdp0MI2tX5CiguJA9JVF8UIHLRxnD52AiLgKMnEnjR93iTQ61aGD9IYqk8wgd6rMNHRp7LcE4AE4N9HgnHa87ru8oLKqGfGP3xA1vprkCNZS4GNNop0Jpy7TS2cIvBxAxQ1rxYBrJjYGbz0c7GMu/13NMYHFtqAg+AhTZLixsikD3xiU7HnSsb5ec0xkBBVkJ2a66VWEq2Lah2uyajRuPnCsR++PyB+5hpV+acnp5XGCbrZlhy7O6HW9fIYfQid2W7+7yiueoNvA9EiDdTCpAg5yXrznwT55Qi0F6cc4DH5CwEUtv7LjGUY73i63kUcy7g/mwRgK1hpGFYQh0ki29M1nARWBKiMlYOo4rAtjNocQMeAHIVXsQEGzZuFOr502OD1sxK4J2Q621ZSV8k/oVMk4ITW2CawK2CbsbMAIsDZlPSvZEQuSAl8wX1wcdNc+BAGwHFHkwaSfJ5+yGIEvEK2JhcJRF/Ly/C0tGETvy95n4XvjGzKHK+kDOoMhnbRhQTymhK/YLvRvAeYgu9JE3mt2TASV0VBu3VLcgYJPDQG0b2lYoRmptagwGduA5DDIE1xNl99YYMI+ZeilteQwUZbCT+0or4NpXrssVHZvSMYILTINI4koJHEfNslAIPuJUN5wt9O7lz4cYUtcbUGyhrnsGvNu+67kOA7KT08IvDfWSOhjWSbFkB4bwiVWSeujZ11p5I6adQqqrU0Rq1g3ZV5GwmhdYkMG8o1lw8AnDN59pMOJZ6OZaWmaQoO03M+sM4gHEAFh17rmFZyF2ohue9syTDfcoEgq7XyIuSaD88KXDBz4su+CDuU14qX6X3ePZSaIARJtM4Uh+JtfTlfHhiBhz0ZHdUSibMivp3Ur2OE9cS6orO3NvKGYWeJ4oIDKZ2bcaxuJOWeMAlQuPIXjseS9/OLZMMvBFMJbjM4FmT8D6PwU0lCCGH88HhqHck19ihWoOZ4wWoifcHxW3oxJm1ydCEA6mJLSpajCMgQtW3V5i3s84vv85/wb8u/bUlLxvPOapHf4mhyoB0JqfGWuJtzcekk8UXCb0aWICC4kSAOXfznmaIySjCV5FDBB+akv7DyZJr+Cu427i037g7NDJ4oiNiFsMcJuRuwGQ3L0CCIlRo+JA69iy8olz5k3bb8l4XhQfaCPg7jCNPGBvyDj1/3M/O3YMe6cSBd8/92BslaCgW+Qi8b2TjHoDoJ7FAmtwQD77tafNznVl/0ZG2sUaF8FVczo504M2KgGV7wbqBUeXZvhA7EO2SA8wdQLCWHHFXtgCYP4Vzzq6BMT6PR9G4tR+YkUnCoIskOB2Ai1p6003MO64F0/skFNKMI/SzO8zLxAI0BkoQkNKKDku5Jw3EXuZV5TxbPoLstsuqEgBKWKLc/OAYDO0tNTUCbiyExcgeaD8zM85HjvNcoYyIkG1kCiPObGSeWAUaxXIAqDgA5fls0oinVZBnkQQfp9HB5+YVYwluGlLRNAktlGEgjUElnP+EmhUaaWL3TbhgUfjF3Gpi1rsGEMxDHjq3/EM4o654qNs9Saw5p74JDs7o1g1NuNgFvmiUBWSriKCzyUV52axY/uNJRMOyuOPiLMrrhKjzKoAI7AmzphgZ65Fd42I4LIGsUcW9VY/V6pc8gYsY746hXM9HI5hq+XSs/tZOud2d3yIwM1g0cktfoKWv/9Y+AtyMDRGdHabrXqo6sADCbZkh+ou4s9lhlsP3++OKwg3lPZFSaRpyk+p1poaALIohwKdN2YWSqro277wlgWxzOXuQ+kozsNyBlp0MJnUvmCuG+CrRzxYWEEQoYGaPemSHeM/ZH9RFB5RjExChkfesRPoF8OVc9VVsaLYk3iHr42U/wfYYcerTfmrEsPFHgtjR9E39uqO4h5tQT/LUjBSwbUDbxg4APrwz0vwiQvEW1F7dc3o1roHRt5fbAy/q4PPI1YM6gnUBFeOyJhfB8lrYgzgYSy45WFmtDMBuld/exQF+N5+/dInNIlgeR1vVlwC/uAVf/CKfz5e8csC0w7AYPirHJLjRjFnRCrptHrfKiMuUcVkPmIVNG1h26rGhoC1UNjLBUhX46ton47MyYjNQXTnGfLBR1CPwe8vDd8bOdgREAzPQYUXAwynMeQnteHSqkQG9ywKXXsSLNiOqsQyOQRc/kYuupxFYz5xBXLOFvK8cjuGjyXD0QguxM291nwpxhEcABM6fFXvXibU1KkNIAVSlduVbI09ytkp0AlPJDvTAevedaiyo6TmWwNxroK5+UzzXgKALi+W3vRHGXzTScYObuTQ3CnawwcXGdDJEU5mTDLORmjECnpAwTCpYHRkEKGzqsrvc8S8ibiHRbKo4cDhHJCsaRZiDIbU3gZQRQ8LB3Ntx76CXXk3dpAanKarviwHpANdjX5x6lHF5x8ymPEa6rcjMeCJ5Huk+ArZjeUAVEatL89178kGoPNiQIeSelMoZZjyhrgDcmNnYUciIZBmfqgGqKQKO4DKa5PEMeLeA8CeDG4roYw1WrJMBmAzaLvHrGKL+IRtie9M9sx8SSTdDXu01MjwNsLJBDewjVcEIS9xgYPjIyA9HCq2l8NNWaots57XMxgRmaSxnbmPDWqn61A8gkZoD4ff4RwdKNbxd9oXPl+BxEKNc43EVu35dh1Mt6Y7YxAwhHZ9o1vpybjILsgAdNAyoOfMwLQ1GnA6QB+WAc1wlA0u8EkGkv35At4l63mjpB1zngk134NJmowTIKRQHKqGW3kdNgyycwBjHv8i8CaCLcDwDzi85A+mEXgTEYzbgQg4M4nPYapuhgvZ3faKRScTe5TMAgkDe+gPfts47JY3oxhyV8wT+9beK4TjAySMd4uMmIvBz0IFr1yLPgRjH3anZhygXjdX6ktbkWKS8EK5sEiarDsCE+BUpCSoR/dvtOjHVtQDFFVHdEs4rt0DuqtzJqSnmDTQSZd+da6L/F7rxLb0a9/geE2WPcBrUNUlWdCQSr7LviawaoarwONONva5z5ipA+jigMuznq1pz46Ecg9bsuziZLJr3SPGHJtAcQbJO4DGhTzn1TGCOCwHrxSJacSJCQQfXDwAgK+f7tENCdA4XxadqXF/XATVLeTPKsCtYClO78KW2QLiHvwt0ZVhhpR7Q1wFBJhKyR7dG88kE9ise9nEuU6oxsEY3yU5ckF3DFgmWydvdTwr9LMQ9Pqv5N2BTY91KcEYEqcYY1ybw2fz1cm+tQBvuKbiuWMj1TySp77dsGvPjZ9mSA0YiwaCSLYiRnLKFi4RTP/PT8/tdx4GgAzBY2YqGPek3xG/C5QtOUdhbFVWzcIuHntsO6X29LDguQJeiEM+Ok9IwDRkfXKvnpFE7hVNWToBXO2FxWhmNTNAbJbkZBZfAX2ZNZFF3GRxmlz1fFW0weM4p+1Jcok8poZRN3CXxKfHpm0iq30X6SlBzac6PPbax2oFBYCzZZfu+h6TnkOZJKnpWvEc8PVzNHSs6xFFeBL5CGqaHwO8PeeLOiQlyA52MfXzYwaOfUJ14GmGEXbrMiuwUdbCpYrvYK5qArX+APaumQRT21fB6McAp611Z2ed9zwQ7CQ/8vx+Ndz5dx2CD3aMZIEmZoBwLk4AXT4KwElPqxixPiMPoFVHPX/dQaAAbPf7GqgyZDcBRtvGnhenx3dd8FD6uGP5mP7nAPEX43/vYt6tQEkUijPmFECMAjkhCEPfJ+wezGKhO7uJLmlpxsRk6ipEu6PU91HMTFuhUBhzOUgR3R7PgTvAwnLpG8h53XDH9Ov1sw4SAs8v8872S1mksGHMcwXlTweS6U1pvlSmyQLvEinQUELq1cyggQNc/nnMr92cf/NS0tFD2UWPJxegqO/K0xwDVqQb3t9vuTFDYWYc2MnOwotpzf5incOIo8WagDnwRnM4NSgieUjgPZySw3uyvGFqVPGD7waIR7kQzRkW6jvCTpQoMxFx0GMWEIBcM+x61eM3AMSwvQHkPr8s/kmvLbHCvnKXS8y7RBaTpGfm8RN35T3iBrHMyvuc8r6k9BWABn+NcR7g+J4DKPxRIKIY1rH+MIL5jF0VT4k8PP2cTHzsyLsU2DsKKNp+L/fc2DOKvF5BnK7DO8ldeW5yRG/pAjdxi/SrQSjXwcK3GRZmkf2nC4tsosxdE0tQQ3aqZyyYii++rQDuHvkwWs0I7c9Xymtq5krs/h8giJ5FdSqKRY4KjgJgU8Eqn/tucq5/8Io/eMU/Ha/4ZYGJbZujA+uy4lpfNH0cAHM+KC5gFpU6+Tn1dDWCH4uqGo1pDprFi7xHH7kovBxbBiKOBuyHxGKoaneyBDNYAq4IPKECS1YtuIEUPM18AFW9q7PIAChqSUhtyBIJ6bY32R28RAA6pNvuXO5+CAvgEOfzIXTbNlk2NBL3YKJ2JjU+FXu/FlNkW2l/c3hUJkmdsFIOjJr6q1giXEBLjrk4yjY6JaTAt8uI5IXs0wE6mVPbuQODSZkKjXXgTCgvsP0WLrBM2BKQ2T2MzIZjGUJOLZgT7vBBJzJkwHYMb01Aw/dxtu9y0Iz1euIxMUvvsyAhkQDQAPENiS67Lcr2bpFUxCDrKsGli5+I+jQGRHety1XPpbqV0TIRZEHsl8Kti7UeKbhfRbhngNx/ZXrp3OFYYSOykJGvSV1qSNgQ80p6xO8CwHL9bxg8uyExa2+kM2IRMnSwj0e+Fb0f6+xnne99aEnnvt+6g3HU1wEBdiqe+vEE5WCpxYfwefUTFnu9lyJkavA+eMheEGx0sEjfQJ5Ao+PPPArCevO6zDqYBGdQUEMdL45FI9jDYCfT8AEfEXAoaLuCOWPC1lirhTUgtYYYGK4Alt7pcHwzYKkdRbumOGa2AaChddRyfWGerHaciOcU87Hsh32L+PkSK1DYbKEGEGtKy54DsrU7DCyBRK5HFhDvY10z8dz2gEZnI0+a59+t24BLUBac3adkmPMa3Ht4JbSLwBZ7ZpZ0VwIUsd+8u1WyOxjqQdpABaGqCksZ6Tk4eNI4R2B7DJCUJ2/m9vr+MYBlfa/zDrmG5KpT7zm/K6+/ZIt8kfWJ9v3ud8lS8L5msssOlzuKE2RPRQIqwJUdxRI6ziC4I+HP1mhJmsyELghk0YYlCQqwF+349HcJ+Jg8IJK67g3M7tHstf8yGvK3HTWzz3utafjf/8fety3JkeNKOkBGlrrPvuz//+bujCqDBPbBcWGUZvu8nS5rU7RZS6pLZiSDxMXhcCRgt502x9F61qifbm9HFnLrhLfkExrc9X7eerDE87odFRsgiE+Kk/GYMaZFao8ARONMHWy3TNKmdAEmfSJleSUSZtRcnBFEAwsf00zXDMI17KggB5k/P0PQLLQtToKdADgrKu5hKlfPXGNALeA2CjT3YcEMvYtEZLoORll/ljrfjprDWSDjIX81ZLVMck6QNq2uk+zk4vdRzyovsWClR1zortizyV3v4dXNWzMMhYlPMvIN3GM7QZubA66ZHL8KPB4Zl8q75vp4gAuJrdBXe8fA3+TKeSgaSgeZXG+5AXwA8MfPt8476gG4E3jlvu7nS/8Q+7+OjiGE5A4g4YyJOrcC+Jpmo89a2FEWk1M+J+A1RyXpLlaEJibL8/Cl4Y/zjAsFqsy9pOxUrJJ4uBYDPu9Mnb8jg4l178WqdlIFAMCaEzm/lF2MO1ZiRed6U2R8vGA75FM85ulIJ9+Wa4fI/77kp4z18rwFEKRe/mcNy4gDiou5nFxFEvOxoZb3F3GhDEh1GdGajTEgI4rBUk4HGx7yiIC9JAqyL9iMk20XWJhwZLF66nEGhyJngOS8OvFBoEYA+C7bXjNPj8/8Xa4tFnlMz/VjLNzFooUAk+HHrKZd8p8WfpkgdAKgE1bPCpCK93qm2ajY0dDC970+M7v98MI7gRoPcqcOJJGPhWP+jUVhvmZlVs59zW63yPcO6Ityr1nSZbx+7QbbT0ynckOZ8EPi7JeM+cgX6QOiAARg6SzlEb5YkjAcGL1fcr22WFAsw4fE+d4ZY4mhdDd89qzCx3Awnmvy4NK+ZAFwx7OTKOryns1+BNHuR+XMjEujgyBxHNt1RljkTbnAfP+FFZ93usPy3EwN8q2Vv2Y8Hed9M5Zk10IDyMMac8k/hh8zcP7mK+O3IiFkocBarJAxf+QoYf+XB+Ap/LQjk4SSZyO5hPXvWThEzv/qXKfPJH8gMazBfR7YXX294pKw/QmCxjbaO+Wr2v/xjOWZD19GcX0AtLWecXuRbDuG5L6Z4T+yE+kTXnFX41jsTunPooPYiyv3jscsaljbkQuoONPGVYQbCzyEe5fxHAlbTx8vY1W85Bjw/RHfD6Uf8Ny5O7vsM58TAwQhbd3SvVU3Danr4f1cNPLJymVGdAdXtza7DEUEf0anlciAWxLJKe3m7lDpbmJgwZ3zpkVfOKAkxpSRYy0oc29PqS/mit/t+o1X/MYr/ul4xV8XmNSh1uOT+z56y/KM/4d3yEQd3c2EDPYthh5GEO/BgMtqm7hVAoaj6tyHTrOEBjGHReCU4PdDQ9yBrNjUfBsAOrLd/IJ4NZkD8nUD9VVpuwMpXxUZbK2LCBmVkHclVF4MmwZcFF1BTMN8ieETPeAPAD7sVa9vQAVvDiaXG1qDYg+/8LhyLo0f3WDZKZK+jhsYwI7W3UnwZkX1mi1+WsFgJTMwXIKQZOg2/VwrVuPDGPkdTSudcKpvJr4RZGQHVwIKXpqVjBcGImKMAqZAILsB9W5Hz4T3PwTL3+D6mpqRuXAOWCbTmKDJwQjy7PphcH7ULJqRDRSI93hPO1rvj4LIqaGZFWsP5+0RpCWIoQGwZaeYQMoZ3EclW0CmEou8R7KVzkDy2fRrTSTLNRKPCJjee2OMUax3gWC6V3sqIH0O9VzfY4XTHm0m6ZV8Ggg+xH09FJJl0cZgIgPVdFzTvQZnn2tZCasbkjT0Y1kBHX2DXlJHqoYcoHju1dOAi7+43w+g6YYdKNrxUTPgro+iD4Yxf2YzUfSQ05BYvwxCXSpQPnerFbMuAopvdHGvrrJnGbABXoXTJQ7UkGzu69du4Bmgfi4g9TthxQ/t/QQH6BOv3WHcTQYAf6p8YO8PdS0/5aePDDg8i8Y8dtlZ6zVDRWDHvs+E4WkHEiipDjoMXKUV0LPZcjbdG1qMzFvPPcD3mToxcsC4NyvItgHSoBwADCMrkXjYwFsXzI8YQFt/e+wZZ6g/z1ZD4drZ8p5fF8Hc2vrdmIe9rBWu1+OMmCdhwZxQK4sBUkXkugUn0FaJs/fAdxHg3pvUeADy6aUhX89DAB8psaGAD2wHmEU6BjZQ/vjprTPs+PUz/X1X+dMsnJwJdf6QjEoy7vBVd1AkdGZX8mjfBBZlMvndSlKRqlZc5WIl0fbwk8VO9Qfg0D6MxZoLGt3jTDg9WMKQZnTVjCFH2XCrfWItiYMFRFdBzeFoPLvmPgIEJFXj/MaZnsvhOUgxvnbtg5H3sM39aXMYtqoCO+WpvIbqylqUxRPtuS3WK5bnf+uRJIo+WNV1ZQeVoItJxr0/0F32py+ofertq0Sl1pVsZMfeo+bmbDXskpXoJHFDsW1jwQmcu+EjBvKaxnupRLKT8U+A9mNAMWr91M+0RgIc/V6+CohnH/JyI+ILlRkgQcdCAF0KC7QVPmdyE3+NfRn/T1+V87os9kWRs8FYJYl6p/nrzsSOIYt45P0uLkrpMJEqlIi/kfO8EIUYd+A90ud2+4c6gTHe4EGCS/sNMq3rmDrlzQeyuGK4koE9+mf6ssodMo5OIEEzH/XuXGSzYPhi4Qy07Hh8WcuEJOC8tYdpSxT7AIIMCcQUOG4ChA9j7CuwbVFEjls57lxEAOu4jYWTyHMTfNuKlGtKeRUSvrSA+rGje0MX4z3b8AAHtu3qpMi8L59rX3mDx7471nfr9zpXG8I5CrFuVXzwLtwDmkYbO4gPBI1znsgbb+lzQRLfUfjEIS3lJEdeAeWVD8+fS5xrjyimMN5L0OrWjEMtZFQBoCVuCOST0V7dCvm5BJBQIsnivCPJgR45cReOG4hsQkXNuZPFTtL4p43M09JGj5ollGCiOzgzWrzmCQLAMp5dIGLk7JawjBFRsvacahRfx5vZoCxQcpIrmb93DlbPaw1UsShjYPPZ8ur1LASmEy6Orat89nDhnKu6C2DrpoqNOxDAPNCdKaYjZPpo2/IMXn7FmdrQKGLYkChCOjBXFSISqeFswWdnIODRPfk9roGB7XakuRrYS9sKEpAb9QE4S6tmqcB6LljOpXt8ROsRFEl83VYd85BjRlOeKeCwWej5I/H9pREfCACfeMW306kHAAAgAElEQVT3U8qScc4R7wkeidSJBbBAPes7/H2r7o7hGlLNuwr02b3E12+bkHGwLhLFjyUAIFjRNXriDbo98ATKKY9DQkhA9zLjgNhR662z5Sw3kAQGSHb2lPoPczl3hw/BTomyKACR/GtQoTjYKpJQPJPx5rl2qvBkF2yrW93lqwHAhLPkDVQy0rAJEJ7fGOjGjyiA+rsaKFy6acE0c1ip9zdsmKSEaHTYYTywk+9w/cYr4n5/4xVcm38gXvGXBaZc4Cz3Kdo4vpN1Aosk4Ahg7FUawiu07p+B/2ByMgTYZOIzsaEzoBY2F+ElE+bcFFXJTMcQL3kfuoFAMCd236uUEzjuIdoRxeUZePJuocgKXSe0eW1tZsM94zg7qurnmBj2JyBsuasgPjuYPIFiFl3yAO1Lobs1aQHgc7Jin1IpW5i451Btk42VBQjrhPNj/8Gv+Y61FGxdX4beAcCsCu9WJ9vAW8pGfECjw0Q3E6qhA56tgP7GO6KNAcc1RgW33MiTrFtVTEiAPihGMOD4qd1Cb8km9gUowpDwM2+3rvYGs2EBzQZ1QOwZrElU1b/T5bgiODuTXwBHhTg1WAnHXeE4RxSVOBRavQ0LwMDtTmaCU0dbA1xKiTT3ZikAva5AODwRSqyJVmdSbhbKDEkZlhX1Ro+qvo9RsnYEHQJMjFfZ7gVkMSjqrhm+ZgcOJ69jDDqr4YIcWLfF4RGED6STExQXXCYsZz/Jgo6UxpMGBBPg3LuA1G6Jb7ARuKOI5nWW11holt2rznZp0otVEPd5CeZOxlsOFPQKROHKfS3AjHloPgHK/RhufdU8iRXPYNrAHwgpoNgT7EaK1mMbeF/pRBNkMgxNcDAYnk7gYgQoZDsDH++5F96gbCUUoQP8rS5VTLzQDDfuKxctSQ/HhlfAwwGvdoAkw0cn3VUM/IEVhAR1lNRGsrM+gQ7SDBgxWLVJoj/KHhkO6Sok0AM0pcbLtvLnCNpm4C7CjgD3YN9KdpBkkGDdUVjPT3Br+7iSlkpbaqM0zIcLbqE0UzaBLn/DY6+5fGBrnO+xYzaYQV784c99Yw4lcxWOEezOFaAp0FIQz7ggEwar56EOjHtEcHlzv0o/F3qKBMYTtWxZITGvc7nCL6zxiZRaGGtXx63YK2zSJ0wprXWr4/IXJSzB9R3D4Rn8YsNFoXMEUAJ8tug3TO4G2zOo8xcglEkzOc/VqnjF/Xv5K/grWN8CGyS4qK/6zC4S+Y6XhvOVaIExhbrKL2nEhQaDV7ArWPDNWTvmpOB4AuVOyT0WoFLuRkuySO39i5TWZ+4BFQi8mF3uTMfUtWbIqSm2pORO+IyBkOYRvLBq8HQ9Lx9HV+whWwu6bcOhDT4cPYicsZINRPLtJZ0Mt/A5/yvmBb5hm50GeZbncA79VcWaM2JFr/cfh6xKdpgtqS9hrlkDYuvSn12MQss0ZEIngR0RvMm4L0AWEbisAtng7RcYThBATPtEQCLlhTKZEozo0j1523d28cqMwdTP277lExCy9X7sF1ycEoDFZP6/8efCd9Pg33hFfJdxdsYfGwICoVCrbrIdcy8GupAxfWEJz6PE3CHs6+GXa8D8aOJaAb0h4wRvvw7rvXRq1uT392G31QEZHzTLEWv1PhBAFt56F6hAmyjVbTb9qpms5b/kBA47NpXMQZxzJLeDxLaRw5CThHVINYH+gSQnMrdFB674XPc2aMwVWrZ4XpTnhTG2QUreRKrLKolf8F1As4gWwBc/jj2OyRAqSDkbTfUF8S6GumLlDN/0/zNtTYDucSsDF0SAOQbqrAta5jPk0+cegEWX1jKM6dDBGQBmBscfFctPnbA7AT3p+Hh+VvFCNyXaJOatMYf7XudKLWdp/RHnZVW8XbVMNKvZDpJYSjsqFJDPBv5EAH3BRwCoRjvGGCiGgduCZ43UevB5yiK6Ktw+aLsB3LHvcubq2gM2tPZqFvQtDw6okMK8qmXnEz9n8SNmWUAKk0lLf+vZXSxlIzMm4zg2iXzQsavraMVA+AVPsulu8FKvAdmGMRrnsI36/DvktYEoBkXh2Yzm7zOjKxHMAMA/9kfhp/sgxSKeB18z5fAAmTsKN3ydoV6YStoRYj3MaxYmRInrbBvY+m9U55Y7Xq6A3iSPxHoA9J0AAdarQDrDMhbXTAyYwPQ3uvPzB2pcQgDeuN4PQDSxpPQBzA2/TwxoKmAhPjutVuWdWWAQuxq70CQpW+1jL4JSz/LauuFHd1t1tqZNGSiJSMWL0shmyE68JZzlzbxHalRERYJfYrYV3ZjZFWt+YZVMMLu08/wloK0leXV0o8tBuk4gXTY+s1id88vCT4pEcTM/S+CEe4wiMbGTIc5kdNcmFgoAr0swsvPLgJWBUvgPd4cOD5wUwN3kLRHBe1JxQETwugN7lHbxiwNaAAjENi67QMwwMCh1QDnzZ8sEQs6xSf+rzuk2wZVjQWKtxRdlAuNr2aEn4Qt5d/F8ZUOcc+dz9qgtBfAC1WX7vXJP3DJwJUnHJuCviG0+Aif+xH9gSPy912+84jde8Q/HK/4bibxn+9PRwEJs0j2G9uaMmEi09Q5NcQmmj9VCJ7NKQod1YsLsJ9vc0A+vqv0rWF7bumNA2lasloBsx8LoIgK7mBsQgSEANGWfSW7+Xh/bLvC4jkfFj0B3b7QE+AWpsYtg4USw46gkMdvmzB0fO4dojvIiBsHCItsjXlctikJmlTYW8A5WZYvZ4w3+d6udlw463++LE9+Omfr30jq0QDgtHT3wDwPu0WVTg5bZbsckKN8xNyEw7IZIAPTSMgBpYDa82lfvAYwd+v1RVKqhiHwYxc5CJLhMOuP+HGUYSw4R9u38igXbIM9SAlGuZ6srVUmBTu7VJ9v3zQFJpi+QO2Iph4vy8pIdMon1hFUBhdIFiAQ+Xl+UVWoxMtHr7HcSxj/DCIXmbuphJzqQOdFnMLlfOwIvoIzpFhBYY+5U73KCA9lVVM72kILLnxcRjDKgCkgEPugFPplSWYBhrsF3uzbw8wAP+N4o9pR6M8DL2cosRhtg5bAfTGnJpXIcfH8kWyX1jXOQKICQPAqYRAySDI0ozKbtIdefz19TisnpWHKOnCx76DgDgBlBAs6Zu3net8EGmAzUI96Pc9ywTTvTbwcuxP/vSIBStkciUD+TOqBZqNOfeyp1bpOdZv5v5NBQ+NNPAGSJZxffcLC7wlpSx9ImxfuMZLlEYbUYb5EozfQphTt7MLST6UPvcIJy7qePavtN0PxGdpECWrrXlS+B+4qMoxFSMIIVLCEx4wBLB259FytxSXvsVwScp6l1v3vg+aEVPqIYkYWGXAsyibWkgiCG6S2DVKue+CdwgPxP1hWvWUQJVyb1/Byxh+HwlNbK5NgBFTJpJ4D3vOPzMT6Z65CN0pYCTtut8LIrnK+SckexJmCBGBGwZtBuKgfYc1rBv/eqXRWSAXruM2/7kEl3Rk4DWuugOMFZ2jcoSRWPWY4AsEPWQQwzuyBgELMKlCW+f3T215pxkDMD5JSxe2gO58+pFPWB5zyLRGkAd+hVB5M2guuKUEXKL8txDswDnPbdXUOOimPW6NgxC0vDEsgceKvgWu+SLgWCGBAkI/KhFjzWRhUx1zLWZreUURGqtFmIQ7TlQpLs4WcHWIMaBUd6wvYec/cyKbTwTQACVOHvBuhvURS0nDoJIIqGEvE+Y0DAA6TLaNydxSImSQM7yCT26L56ETBZN+DvwEcUFr4SR9zr9tWK/L2X6Rs+CZaJyBFjC4s8CL+bSXWqPxx7frtXop0dDdut/ItE7AFwj00ZIaHdCe9xR/GnR2zKs5DnObtmys9E3FbEwsy3PBjSYMyQhKa0D1KD1YFtu/I03j73xPbu6vhIduhIX8u4k/kGi5vujiumVq/Zz5nc4A1zkiBfK+OBOB/La1j6OP7PwfFh25IOLlas8bPzMO3OsOcZAmjzsxNCQR8CAJfFuh3guyttXGal2cG0IlY10SpGaMgte4GTDvGLAL073Cj35rgBCXKWkInat/g12tYibFXuLP8O8JsRqYU0X5GM9uok5ptcFvmghHJKgslnN+ASL9ueB0rUq3PTYOUz4tSFXGjktgrMHfLeTlnxEQPYHyoRSNsZHQShPmL2o1m/VQxflTdtP8TNMy4xngsVrXj28bnRYK4CuGKvr8lnOY2oijuJbVbRcsSlIuHTAEQxJuMZSkYC2AMae0kC65G94Dvy8poPa1UAO3fYFGYn7imaxOsVXYs5Y0TcipBhsGPOWb9auoHp6CHzXpMvStWl5vw6kLMLL+TQeOBzfDKPi7iUPr67nwasOmNKAswPqfiDvKdJajWvBzSGARrAefyne9fzO1/3vL5TF7u7NEkaqEIe8wWpz5BFzfRpD9zFdnxOHlCuszzwRUiso1uBzacMexEkkJJYrX4C7/ertQ2cMOP7M0fKs6ZoDC+VkDx+h/nZjlwSSPwyxZdH4F2ZEw4w73MkWN4fTo/5KqnmfMnmrNCYO5VE3X+rld+9nEXfzL8Agt+d42QuQx9fX839m7mWK1pH6fla+XM7cIThetjHnI1JUi8EGBtwf0dumOfUUdiJKbK07XHe+Sx2xRU9a9qBKKzc/g47zWKln+D8gUsKXpVTp2S2uMP8zLWOURBAFD1+4xXAb7wC+I1X/E/hFX9ZYBoQuO0KFjwCNW5cjdgyjbKXNB0TvexmYkDGzZKdUDxM7iyazMGbzwHCQ1ERREofAChN/lvPjTHZySESA4wz+OdclS2bCwrHTFm306vp8691/3nY/CxQKMF97cPC6l1uACkDzU4LbgjNwCkHj8KPCnw3JG53zCgvnW2JOQwaR7CVFchbm6kKFailY4igKwtsIDu1tVNnPeNpqRfJaqyZ4T3IoBiOnsEED0YgmWFAVG2DXffWV0jf0FmZGYbfcLk48E12MTHZzk9W1dbsQDIyy4bgMgEMuL0ZTsPJamZuy4A/9w2AA/A/Lp+P4YHf4TIBLo/5ZcARuDoQe8jAvcVEjx9wAghaAChWF4FRMaA68KZpPooBDhZFIogjKNROhi/QSZeh5TkEySTONIZGKQvKWbg1t+q0mTKg9x13SNbkKeBYQTsOFow6zIIZJAPdcJoORmq4IMRCe9WwIonG8bOc8RZneAxsI+gkY3DOmveA4q1MEJtd10PF+bwmZnRb9dwCw64g7AdnAkSRp64aGrpxJYvvGNY+I7Fha3rKn6QU0qsc75Cf5VzZIsui0RKrQHhUQjiyxMRZCMbk2eKtNFqE/ZYKeKl/nM8ggxUmQvFFzmxyf7A1vhlmB8fmEErNdv5ZdjO1MpvVyIu2qP/tEnI07kWCgCzq06tiKfCRWvwBKDAzPWQ2DHgEEDX3jOu28txVsGKQIAcw/E7nwD/fc0Fxhz9VpEFrFY2Gb0U+G0yJLjWHl3yleLOmK5iRN2xQk1t9IVvdM0k3oBlFsoppa0swkF0meUY39s7B7VasIquZYq8K3mJ14v/HUO24v7lvWntH2cgts8CRSXMZ99g24pw956FFfB8M8B8LcX8jmKzHJdKz2Qa6AyCDqAnITg32ft9p/J2NheyZz+HWyarje6LnzZjgvo6OEGHH9OV/GZb9j14ScYsGwL3reTGoB8BYMPzCzKG8Pg/J1ranmbjSg3nFvjV7cYaMFbTkvYa3fErN2fz/ATD/IQk3s/IPNUdBg/BSv/TVmGVxC5RQDhYcGbQOFSPBAjwzFZAf8SO7TeP51/v7L+/E+UBZeBrYw4I91ODBHrQTsXj8exW4Vp+PsfDxDhteZAurhdnDMHe+btvyuxzMQUbIcyZdFKNMMqAueJdNeHfy7zwXDgcGNcLFR3WeA8ffI+F7r8XPaBuXDowd7NMjVuVyGDDflLDAwWjcozqyXT5R3UrFngZEvs9MCyBKNw7GKN6glkKhKc3onXwnwLe9O5BcFjSYxJ0Qcsi9iED3hsRcIYQUDR625QiM/fHHL1cq/DpQktvDr4g1JMg+gPiKe+WZGh7s2JTZiA5CcpHic0Q8ydwowT/6goxnEwS8AHjkFiQq8v33OGZE5Qyz3GcxY/eO2CfzxPFA6RUetic7t09plyU9Q6PiHmlFhQVUV8OqsH4ck0V6BtSOuRbJLhYR3KKVqFtIO10O3HEILr+KXCRunDPzugAMFurmjSskWjS60Cjpkvd/xBVIItONGeC8bCubeg8GIpc7HCzYb3yZSxPP6JuN4Yyuy5Zql9Ae9BOUke6erBlL3r5F1LFTlSXNogWohCgweIJ0G6LCZ+oTJvRXWguTCdkzHrQ6b3Ef6Dw7u20IwCbgc3OofZB1cwvW+diCKe3nsuMWO4ouQtKHnwUjMF4SEAfYEQqT6R771iNfgpJc4g6R0Z0rGAVWlVziMVYBUMw6N1GMOWQr1VFycHN/WTMwxrsPMA0A1tD6GfcbO4LM1w7gXLU6X8S8VD+8QOq7xyXkmgLYI+YrYmDszWIHFJDXI891HxiaPwvM6lxLgHZjLq/ua7M34F7zYNRH2VAeoGOG4VFw/y7XiP1S5jTLeGKcXhzgvbohHbc7AdHK3bFhyn2oOWDeW6rKBbAgF4kDHoSawsZEj6Iq9/lHeQuiHbkn7gLniVxmsatIJpHjDrME/TgLKxVVXAHLLGoEfriRN8CRGo37Id55yOy9HR28WZSCrIOx0+A/BZ74nnuwADd9YsesbRV2usoyrBlrtR13PIwrj5w6dGjFiPnn2IfMdEow+pciQZF90v8M4m/xXHKfZtdmyvnDkX+j4ktiHCoAPlk4KxxVoTWvwqAxJ9MythTgBaoX/BzM3U0E5itwxD/LP21dWKV8EOsftrf+XkoLYXPymXyj6zde8Ruv+KfjFX9dYHJWvBI0lgxGj00uB1C9tYPwugmwAncebQ/9zfp3HgADh12iK/ghjA0ArRFpKPBdZIfUg9RDNbS8k0OjsqkcXgdUoMDg4qrKvfvqwD9BdcxmqhZgkp/G417TiMb3RA/QPtkCDrdXbYhkkdpArYW6Y/jEFKkWfuxPAAtDB2wrhtCor0yo3qtMg6hV4LQkHPQ2BjYgKJMD3TJANFe2jEPIwIkBa1cMniTQwwcdvwGI4EYMHsMNjyRy7oU9uUnH2lB3bLlwpc65A++ZxoL/DbswVxuDWT47WCwb4CEGJl5VxNtRoFinLqS/SvN1+Wc8s26x/C6X2oQ5YqAzcO1IKoTDvJPFCU/JhDxzs3Rs9zRUwUazjftkRwNPsRAAMLYPGwsqdQZr6Ga3sQPW8g4JJlbg5oALmaTWSsWZrDAY38B4Pmvf9uWOIoTLxC6ETBjsROX8l5/vClqDnbyvaVfbAPNiPV/boXjRuVaXGNkGe2/OmBirmpAAYBx+/GU7bARqfsUezz3ldfYT3FKMm19bEzXA0iPw8f2BN1jElegO4GcIZ25GaSUJXq+3fn8yQMgElvi8LMTGCOxiNOfKVpAii/Zp/IBihjzgAVDFMx96Ln/My4MfbEL8sru+w+UluQHskJAc0lJc8F6zYk0fARtkhRZt5ROl2b0tOinqh9MfNRh9rsl5LoAEEBtYyyBnQ2GxV3XzDIhIFzlNjjOYRd5+/SGbwTv/hcTF/AA5aoaGCJLd1UDsLHYZ56ZZJCHzuW/AM6o5o0NaAiOvgRHkCHkmEE775ngj28SvncQJYEVMMEIalW82y/d3N0zLB9yyey0x6/u7mGxRghfBjALpcJR8r0Zxmu8VCdn6gIcTeu0UXjq6GcEEysywLJJAJdM/pdtO8GbsJHqQ7T01CydOooy3/yJIMzG+kbtKv3MW1gECdqW5Xf6ddlUQkVEkDEN7QHQCyYbWvwdC/x48SwplYrkzRjqGhB9gU521h4+P5xR7L1luuY+z00Ld4fbuDs+yAVkgI5Dm7rhVsaUZu2YGmJPiIYKxk+6Ty+BY8yQ87cpRsvtBjj25FTUI3W0jB7gPEEjn8sfnUsU7JC88yUToRFqHFWDnScwxKa19dpA/9/xK0o57AENpS9I+NTu4CEIimFn8sFkkpwQNkwTh5pyrlCxz0bJVpoCqQKdj2yf6i3l7vM8bVt3qkHd1ZkkK6vl1yIQAiA6PXZ1SgvubOavpg/rqJaeDiMHzX/w82xs0ZlK3e353JLLCag1/Zo+YN8N/tw4/WfuqfsQ5vy7KAMp+G1aDeiHTMT1zL77mjtwrvaLAAEOTdZCgY+dOw6P748gdEczK6yAJbtEjoe6cbUaRdwFFrNnyg99bWtJy194HQXFz9m8A0AD94zyZ4MZ5Y7B1+L3DrsjTx5vP2sss+vHv2THPeS/x7GqaE3OwApHjDCkM7xFybqk8YMDHjgKdKi65WSxXDoRfm59BBfg01HxMCbu75QPAZwGEKUd4gQVbbJ4fVcUNh+ldMQpAcKTUQbxjnGYjffwaov/NV9Wkv3xlqBV+APditWnICjo21UbcsWRQHtX9wRS+PO0dcyvfgM8Ei0et75ZZ7kTD1v9Kxjr2Xfw7VRdefejIYAYi10ob2mz1TH+HWxVVgC5CF46AlCrle9WcPWS+10RhB4BYF7Mf8bXPetYnR3spqY4AoCUn2QHMh2srqKTE2XGWL0KRR7EFWDpwtic/Zvh++XwZZ3IlG8irLly5Kg7YAZSt8CN8RS2ip/tVncOOCVEEVpPFrATTuxjsshufkgBw/QMYJAyPvSo/zS5oXAK8yfvnXLTYi8e62rzxXS4Rljlr/sch1ZaYQBVSAEj6JOtONhPF2L2vBQDckUo7OW8ZaMBaA7sDgnhZBYTGAArIxV3xTn5TKj6lnfSMB/Mci1UOxLyWcaArbexyq9ztsuPplAPurlTmlYffgGPNK/a6x++c+SLaDznj0h41spGqJhZdf+z04f562TjsSb5mxwDDAnZ0R+Z6AwNeoLEVOTmPj3rLdRq0CFFulJK0xGYd1UhAIv85p/l8/9cRe7CovPzf/J0xqlhQhCsxLOXoFBbuDXsbsAdEFKoLy3KsieH60smx/RWzzQDIKrJAjznIzOR7Xb/xit94xT8Zr/hvqbJbtKQ8HJnseP2qyahgpcEHCz3j/MqToUFpLSbxtx5JsjBU4TNKbepmZ9ZrODDTqWMg9fVLhsE35wWJYE2LYrBXhXU6uTxwsix26oSnsRLAQ9BVfP9ilnYYY0E4AP8j3jccrO6YkcWi1QY1lVUiqNo/6jOJ7+rgoMN+xecKAzCB5YsMU5UoRgB7cLO/R+/vaw9ucgBuyoKXWB0wnnmt5woggGTqTZt1EpWgDGUhrILke9K5fKTjt2CquMMUsBj6u87hhfuznv21I8hKvWF8wPEZbCF7bFYNh2rVXbKwV6yrMnEliayf0K9P61fpir/7mnIjxkFCRPBzAtzA9yN4Ye2RIYqIQv2NHZrfbh/YmowUrvlwqbN6MqAYOChsLZhwMPhOwAbNZumL3YjDn0IHZlr6wSYXa41o+Qndu+2DSH2UO2VSplWBhq2dUbBOeZy9KnDZCliweDKxmjKq88jE8F7hRGYCoV6MUtZekvEABrMK3Kzo4DaF+YaLY4nhY7VT5f0la4v6xbqOBQVw7Q9IzV3qIlluxQXHO0zYVbrRUmu5xr8f6z097isW7e2GYVc4+cXpFN7BtdtV4IVKgxe3/4hn8oly6SaAxbw5EdgGFoJ1Hnie2qyAVERgewAgS0SwYHiH/TiA5qML7DtcGzMSHtobSghmGzcT5rfuAI8FCKCMgWc47Og4BVoruMEtAKL4tGMNNAMyreC9iuNx+TKIJegw0MN8EUVFr+KuK/CuwnH+kFXADx9wac3jLABnEk4rGuBk5fsC0ewcXQVGl2wW4oyJwFQhK9k1wVTHgC4GJPPyAuPdHXs7fG2McUVS+cK+HHuT83wtBmrnMPQcgLlHSy7VsFg95Cih0Bj2/NYAoP2urpfhDSoUXCMOSPpzLQZ3Mdl0l5QQwDkm+Vn4gxuSHQIuuMp3RFLtAuwJBfCS/w3DAja6swWdgHOw911FGnfgxhsY9OHTrLp0JIK4j1uOIPTvv0RZiHlHYcELmOL8CYDJY87PlJxJYncl0CZygFKUYxhouc/DffPnzZi4Bjj8UEWLApCFjyLLE0V+ahD0RzHxFgZkZAEjijOLz0rd4bJR8s5AFMDC8wp9wUk+4NdZgRcRvPUFHz+RLEKeGccdzLlrp9QVu5IlGKyfEQY3yA34nBh7wdyxY/bobQbIjBlUu5LMLFRtF+QAerVXPSOSIOhL08UP72HHef7P9S3WIYCUElOg5m8stI+8KtntApvJqzq3JLrUh3vFCOLVhxWMeIKl7/BlP27H3neRXAg8NhD+vib0M7t8Q3pXb9i4616y4ClRtHBbR0fB97i6cyC6zJQSWbcb9CDA8a+ZrgugV9lSg8exE/gKWSLZSKmpcPt1WcqCHFIsX4tMsimVRSCnJ1clgWZ7i/1uSenFjo1Eg1VdckZaxJh8nR2EsRE4v6jWZ35PwTAWOl2byV/dD2b4GRJ78Bd85jBvxiKXUjUBANYY0Jirwdmgo2aSAtz/OQ/KhPfs7lhj1ByBLEyKG1JkKAsV07W6LiYE9yHLDQCfYsiCOmeI5SKQyW++sBwhkWRFUPw8FCkQ/uNlnFKBEbGpgN1isU8uVVzZYZEdcEAVq8mendGdn8Svi/dqAHQBeHMP1iyEYw4bhGxhoAop45Ba+y4XfdQxyzb81nbDkgZbC4hOCaxT9t4AG2SAl9cSLwBse58rqpOE/z8K9y1L3/lEFhrqPEsfTg7zDivqqFkLqeqyIgylXBYwYh5QFmDHzcJIxp0r9v0tnbvnpd5qMyYx00ERXR7RRVJOmX5Txb8UU8M3bOk8MvYF5xHxvm+wU1NVcS3mrku85Gt/Ahgxj+6Xmm68y1fL/WOhZPkJzPPrK/ztDeAjcIYGDB17cD7IWIqR87AhMP+TmAUoGeTyhkUc81poWaPAb3zfWFX3nhgj7MLimssccPsJHYOzuZkY9W8AACAASURBVDzAoiyA7C7WULaJv+/WJA1D5wh/+yVv2u20hUdxoyYlWwMKOQ/Tg1AA0I7MnDEXD3oPPlsSfuzwK/Hnl8713MP9p3ZHO7SUjXjGBCkrC6DmgDN2zFg2gWQBJ0ASt4ArsCPNCT9gKtVtJfX7TQTnaIkRsWFKdS3Gkc78Tos9kjm84V9xvoYOXFFDc+3OVd85y+YHxv2CRAH0z5KA67lUWZLcDvh4FkW3t9RXHdjjWjprhuC0zus19qEEIYafBeV3Wmb5xqxi4WxihefszQtDdhRgObPtXItbUEXlH7dWse2n0Se9wRguCVPT/4yPkoSwLlCwKyzwzYobFiTbU77J9Ruv+I1X/NPxir8sMC3sCJDTWcdgSryQfQvcZClPsNpplrYwimVTTDxRpBiCHswoG1IGLHOWaWjJgtLl9Sjs8kB61e0QGK6FhrABW6MrKg8WX/vkD2nACe9yFgJxrQ6a7OTI7ylfjPfkBGATjOAtCFIS4gYo96VsMaecw8++XenCFnRgZWEpHIcpgz0Bg8RzDhbAxD/JPlsVs0qYPI7LqWXO9ZuQLLLlM54t74JjEPDL2PqcupsMih0zWVrpuGXQvEjMWahck69zGVupPZ5H6q+PkuWLmVNh6IY+lGJjz7G7hE6NXR956AkMpbHc0JptdQS7RwL8Ha53ADDYlFmw0mZgQgpEF6tEN4+AjG8N1jczlYe2JxCMHO/PWgFbSRh0ok7tegZXd3ZSeQ8NFkul4b5cUIMqXVOX/DB2aCAJQjcCoIZ+inh1/gyz1qcXJthjHIkxAA1GQhZrDQuuwegUw5gJCHJvLVHMKNqpHXtRDHdJlURhXIFFfItJzEjQTEtCMGWhhsUQTHRw+9qp6xzdkl/mtE3rjsmlApRME/+c28OJ8/nuklkIJyoXLDszs1vQmQm6O2Q8GW5VJPSf/cxSFkiAd0iFZhJ7bdRrGhag67BxCC32DixKus+PdfhmmsYmJ7Oxn1XaHP5DsbWEHPmH0MYR0PMKWkfo6YqHh/gCdpXdduq8fz0rVawXrURlHc7YsQOUjwV3lNQPgIq4phPYJ1NdSgLCQmoH4W/ydzTuJNkuMlYAzDnbI0EPFEg9ArgW7wHUeZcmwpa+MbAewx2ToS1hNhyXbswd4KGRvVmt5MgkgMBvzdMDqttAMGpezzDFHcNKE1QXXDhnJdTw+QCj5ZR+2H9iWryHfgao053KLlfFNgDC9x17OuKYRweBN6tSpbuHbRg8pTWzZXwMwPg0Up8fkrEJ7edVZygCPu2k7TtcWwzQ2SSdjHGGA9V9MQgGMxPm952yQZnwpLxG8nQ9Cw3x/Qcjc0Tn9YFd2uPcAKLWHfW+HzMCGL/dxV5UWQX45f4YGEcSQTCRP5wEGMqbkLiB8sslLaIbiBlB0MVn5hH3CmOeEXPsbIBD3ol+VIw7D4NRhJ/dZ485OKVJ3FhC2mNCRZgQJeAFL+/mWJgBtJXk0Djs30YNpm8SEd8nVqOkgjwBkX0+ey07t+L5ibf9/ByOua7y9/Q51u8PK0bfirW83AuoEmW+AQC2XzQtY0X3sWJudlzxYue9iByzUhv87PkmDXR9r6s7+x6SSJo2zVHzIRI0OCBXhcBGzG5xDSLSITN3vC5Z2ZFYWhRTH2FxPv8YaitSkuh8odz3XvI77gbB1YkqAMV+gNm5P7Ngw/gvPvNiJ8Dpk6BSw74JsGdMGPcnnNPFWEiK/YkgWy0N+45gvzqT4yhRwpbhvsLWT8CE++baLVFUWg0SgHPZ67T7sVJb0excbcLXY0355LY06DfvjFv5rAgMKTQAmKlkMJ/R1VYrALrYqxLyMY6SNAJYWHZ3jE1FCgTASUm/2A/uMH0XYUtUqnAm6O6O6pDzSQDVvWy9cLm+1yULgonQ3aA1SLWGlH8Gev6pU77bsNt3iUHtM+bHZdyi2MEEPhqFigTgR+72a0nkIDkXeeGufwNgh1KCaqJY50uIUM3A014oVVtEUEPB5x2vTXvLhlep3OgkUCCk5tHuGmKc36sC9DxCNGkW0lI5CiBysnlLSfjb4P54B2CKMDEz7ZkCUOWsMenYr4rXIRGl1kTLHc+U/iT8QsJ08XlTAIUQYZAuziFGCc6lnKhbzeYSRzHEgZCq2pyLS1ARSEOpwrPs4gTjLGYgIuNRAsYCg8oLtg2mWt55R9w6IDX4XoSUkfSXEsX9Zvj//RcLQo1/ZfEQKhVjODruLTSASH98Hg3p3AaSu1FPICaltJOn5Yz/jsdQUozuUuC6AcfcqshrhwAhuc9SJ30RbaADalF4l6hg8bdTUjFT3JpxXMQPpbQZUDNZXG5kDJ/PtWfHZOk5/p25vismfkTcT4wnf/eVSkTxWZk3vinlZ03OReBfb7WyeYBCnZjjinsyAZKD9Z/me50zBO/xE6OKTCk9fHMfCCVgp118HIGzucX+B+iLI45eIdHrYxG/VdB/jfBx6XNkFDHinTGiNKEWYphKkgxJ5PG6i2fO1AH5LJtSc0ZzlUQKs/4u12+8Ar/xin84XvGXSMbEwIaySi+Ae2r5EegEAPVPiFmwK7np3LTBbwE8KqSSM0l21C8FJfMQPw2zHUlRVC21Qc0Cv+N/XguQBahYvqOFc+mEBKMxX0c8UrcoFt14RWAQgLk5XMiSJdgRXSSZrPlRFAKijb1BkrOFPOcv8ZapWc71iyDeNWbJOFTSeDYbCKb1ANUB08Wg0FIOQY/gdWAH6L6lD52Gs/ixrYqEudHz6iIBat1FeGiyBX64wmODrwyatJ8LoGzv9+P1ghEi+XdrFsHeUb0D22JncIgAdFVY5lHgs/p+VlgV4dwD6KgDFAY42Uvf6fIoHopM5IBCGs5X7VFX4awwafYZk6JMQgx5fKvoaC194IICnQCv1tCWDkA53CsjOe0CiyaQEUwdgMXKBBxMrACoZA4QDAsnEdrk7oc2rCPsCN/5qyauHzIjdbPu0ULLgg5liepTxXtJBzsl13kwMuJ1mFDGZx5adiLbeFUVdyXhE/sMUmoPReAnKcsk0Waa7NdIzsaqn3UXQDgqMfVSt3gUwwI0CpnEnOuxlJrk7ij96wRmBcSgdkoUOZ8BYjXiCcOircpxwzbf33Ne1lAmcgIgW8vzuUAwcJetUNdiBK0AQdQO9to3uYbsmDnXAE5dyerHwTg5umeb/NAtvyk1pMJz5Z6JTHSuafoTrb9zbkMW0+MsiAX5AlCbBSbnuhdg5v4A/bKDAK6VYIlJJao5qBPSAjwvoGxktnQzSenAoAuWGXwpQfAEhdNuPq6iJNT3dI32uQnEOCpRHrgOOdomebxnBrLn8G0SQWyjztr+BRcWvHYnHT8n6rx7gAuqg0mvAzI+W84h34WUef7dZwXSboPdn4cNgRhjgmMpllsNs5b1iTF+8LVstqzB4aPUg52UxfbB2YEigilaA3/rJPn8D2v/913bByC7mOw5ZFT2QLXLq6JnWaT99ciYBO5M7gWcoZeFqIDG4zwciVZ0OImj9LKLpRcRknrKiXD/FplCCHbs4QUOcmB4AooBSIwLr5SysoER4NOeAUo7YzQmG4f8W3Qo+ZDq1oIdEoIJ2OJf8fEF1FrPhDDv6SCIOOr3twAmGnMtwr/7Jvknhizydc+5TYCHpJFafk2QzOihAr0zcRm1T5ekj5aH9GmCQjnEdcWacg1aRjfBf7ergD2A4J6nzwYw/Q84bmqdq0Ek2IOexYMBn6OKSPpOuxjXUnajbc4InVms9JDa1h3SvwbT1Yy6L9JG3+naIc8zqoDSQFkaHM5nDdAq5yUeZ4Fs+rDxVaESjH0Wc9IW5f6s3LrmNwCgnCUAk5v2Nc/ASPnlnA1yH0VYwUTPqsnukVZycMq1AdWZLdiA5Sze9gtAxIUmUBuU9MENFe6tjHsdUs/VHEeMGTr4YnHeM86MdZuCFSbJo31/xOwzHWThqg2MMUIaKYqeFSyM0uVP/7Nl4hXfVgfmfuZWYsCaUnmIB3hwztR97QQyUgjJS95oyywJoo0bO3x0gs/qRycOFGr0RdN7SPewdqK+jHN4IoFWd/RAb5R0k4aKxgj1iAS9s6C/M8//ZoAdL334cIUB1rkKAJwzA8U3VCSYw+1jpg92mkiei1QgCMB5dYzgAVBVp8vRkToqN/roO5R3+dGuBAs0ZyUo50YACXAh9gZ/bgsgGbtVB4Hinf7kDFgi907SLEB/m9Fcy5P3jDqXT+SN1bD4WBkHsDFK1o17NGKaPGueZztiS2uGfPqemtctDvfT9/A1K+4LIiSiAETWeUsArbHoL90h+Ij7XtVBsbF7tlWuy2iQ7jLHp/Icbfs3iY5TCPyKhHxt7KX8U5X5hFDeqcYhxJ9nLOi+8R768EHMt5nbLTgscr7LF+PWE1j/Bte0CROFhdJPDrh/RF4CnDMi+cdZAJLA14it0WY3HuGOIgR5KtZY59AnNCCVt6OIRQo84ymE6bZIJ1RKlWjk3nArMvs87GTeTwINjN/7HND+0v9lEWn5zZgNHsefc0wK/ztHOdQ6GeAz9h7XCyKPbq2zZG1OFZElI4eosDCUG++xZ6xwHD9eD0g//cRetloXDl1LsjpjZPV+viKCPX8+fn/ciUkx/6yiiHrgKIY/dkoaL4j5WdMDELM69yZIHsWyV0mCHRQYtlrGHMZXxyXecnvn+SGZQoBv5q9+4xW/8Yp/Ol7xlwUmDmbzMjYmo6qSmSS4Drb3i2OiDXAaebdo746heaqDyYpE67X3IDjYJlArQOku+q+O46uecYMPfYAsuj/YhEAJrlwG6hfnpumujRyoyY/RryWPIoXAcoAZ6IOGZJt2JPuOCho494hfv0PmZLn1IDVYD5uVUY0QqtwAE7PavKcLXK9oM88K6MYr2+XdEDgJzMfx4GNTq8MfLovB09LeoDlAeZ6DektSIIeDCjwDxNlAx8iqIVB7piImAGJaEmZvpQSObpSWv/hAz5rJgPfNbhvETIRYn7sADy/tbPe7Xt+pmxbP/8uG+ZsvcWBI7Fo3uAyocm6R1FpQcpCJbj5LJkWI4mj+bA00FTJ5q8J9nBvVDJCa2VcOre1+PX/KvmUin23kXt1WnPbzNCzqgJecgAA7pPsMVcxd7hXwFIO8npmUgU95F8fX859djNyZ/Psh0weDmePyF1JjyXFj597MWx5KnexNPtzLmIja0Dh7i0whVUoZ7edwvSUN9CCZCQJ0W/4JbrWDOnci8yZ6pSqSx5+XO1yCSe5k7fJ3DlbU6ViT2ZDdglHEZkLQYHD6ou0DYwcggcWfhX9xkBrsrV3mL2Vctui3O1f8cLuSbkjPE+t1QhXxasaY9joOs7Dn0sV+GOciuEOtbeSVyY+i/IlLv08WM1mk515aYvX1qpTGuVYVXDAsb9/A10TtW3cO/waA97CjiJ4SSdG87GQamwfjLc7CAJkoDM4CvJIE1BNIPuRtBYD7wdLpgJbdGSnr0rMzeqZb77dX7NsbXvOjITfBBAAvEcAsJMaySGHVMp7dHlvJPuW5EMwqrI4YBvtkt5qE2FkCnL6hcVZcLILm8G3CbsNpuaYKDTDCI/AytG+TKUh5g+0s1g69kEUG2xZd2YAHK/yKY0MZONR525WIOvZo0PXvvvbg/Juck6klM2EozXhvIDu7WpGdywBO8g5DztyjCZ717ytNGMSBD0yCfGq4Mx4sX+GAMsYbjma5RZI8lmCNZIkr3J/J2TCDp6Y7Lngk+snINf8XAXpH2IdIyJAA0ChZry1vPvPH3tcqdHiK3R6+ABgFfBGr5Of/yKKXozpgb13lHyAdD2SB3+Ps8B+vKtwVeLh2dODm54t1z0oDRg9ox4GpZ95xJBBjdbEtVgPmwEIQfsSguyVW3FOG4SbzcVwlNfFh9JnvgbgnC9AonlsQo5YAKU82SSlGEshEUi4jJSHmkYjHBzHHtL9Mdf7nr+wSCiObs1HlUH8ANkG3Exxy+iMgiWzBZo3vDx8HkACcQ677a4ivKWbEhXv3M84YC5i4Soo89uJg7kfQWuGy63WZ+Pb9CzpvSvlkde3vi1YMu1JeCD3HVzBwRdHmM2aTChpUhGxoxGWZe8oRSwGAh1zelovAiTI/ZYcQ7Y7FnILLmYvJEM5/gBf5Snxhh0zyqi584D0yXrtxIbsT4/uiGNEp/sbAG++Igwkuq2oP6AaZvEk4cngA6f3g7kk7MuJZqVgxoM8YAXjFmSWrPmfGjZEFoiyEjCosKFax5WvPDIGuUWe94vCd4MPnMR/nu1wW/pd+ueR5Yj0rj00AaYQsvyh61sMp6ZpzW5TgXdjemnkXz9GEERaLKbF+luAYALzaRssq39g71Qo0YwHPH0WhzHIQdm9lt48nu5ixXRZ+x3HuCYy1v/JiktM38fN4+dbHagoiNz3jQius5Jb76NQIHGVcsJQYkxUqIsByIAmVr5VzAie2vKJIHssjn+U7hwF3dNRqgFm7ig/8bDNkjU5ZwhHSdFmU5XtxT5zDzN8KaAR0KqCEnsVUQveYp/b0HfQ3McvavTqYkjRs9oLlvCdPMP+ILYSS5xLPrGUoP/KhYOsTwP87LxNg26huWXFB/pdzkIlp8PNtb1vfnmlVDpn6Raa7SUCHzU55+iGz55ppFw3af6GK+XYoIYnN8IwGTSDXUPuj7NhhurzrI2VzXfClgzaKmhG3qwv6BG84mANo2dTwm4IqUJ1kEgDVtbOF+CTjpfXsaAY7JSVwmJcM3PtnvGvc84G98YXjz5KeVaRc6yjJ/vhR9yCj0udloY9+i3HXxzLMhEePbqfy+1j1+tlHyfuKGFm7q1Ah7Bz1wGgjfs1ZpWb6UB9I25C+VbxxFJd/g+/eazqBRzxb51+6iP4trt94xW+84h+OV/x11uUvADcmspX3RednN2o4386EE8VgccwjueaUnUIatmNj4WStZHKwgxXvsdB2aP0CgJUEgZU3MB8wjGcwJhbBjYRMCbghY9O54TCiWtrSemiUF/MgmUaC0o4VuZAnSNEyF1noUJ3NcsNV2pP8t0eLazM/1jHDSovd5hhDcK9PBmUq1aJqwpZ3LrqXfv21O1GU4u6hAp9P0aMrIb+p+Igkag+D5uDX1PT3CZd3Pb4yfFHrmC7YOnjAxaEHDp/GRI6KYBc2FHtvtv1lZVoMGJRLQ8hEOHbvFUe1FF7er5iFGIjgfrwTokr8fdhAADD8A4IegJnlEhYAebHrJgcZxvnYmXw71G5oyAlqDoJ2DtTmXyVrwP3MRYuNlUZX9RykeRZve68g1le9AwaxBsjS8rBtNINLREJTngauXjOihr36DNfKTMjB9BkpeXB2MKaxtGZvCkADbe8ABtJxMgm71fCVbVkJogqWLw72jfvGNqi/4DP69Az1OUadi77PuSb2TCPfQQATVsdcG1d1DAag44L76FUvsHKmHqqUDZoYxULIr63SROdOSla3Ke3mhwn80+Pza8kwAJEEywBirgYD9R3OOgYK4uLjMQtpF/7uqzSZdznb73KZAGJa0lEIeRDAcqx1BPP8Ps2eANs6oA/CBNwP9h1g2NEFOKEzZnzEsx6y0fMZIrh2oEDzvD+z4xUfd96xG3Ak18ee8f/iX+VdAdHcwQgMTfDkFKa0kYOgLgk4p7xOvu4BhlfycwDN8TWCXbzBJRP3DMkSR4BiUvfk7wszAOY973q9n1VAkGLnqo46r+8AOIYYRvpZSN13LUWsK819zy+cm/eiuIAYTG26mGiEb3F3rHFxVoVETBD2akBay1zuClznyoG3MdjeBz5rjRbeVwCU6aJsVbx0XQrZ73i2idoD70zEjcBIPXOhzOt3Up5M+TSTjAGT7TWQ9u3l3U2ZmedC+xhgIrvYkwBC0oyUX/GQ0hjCQb+iCZ7T/o8g3CRwxnAuT9N/QQzh52NWnK7yVQCQBfgeVI1Iqh3AT6h1cifCRGB7gguznnhLEKyQvXOCrEIZg11gm5d0sQIlr5SSbiRoSO3D9GVrHgN+geh07hk2BGr4XiOSpKkA1oxZLqhujnv+ix9dRhO+xOC4McbAFTH2kkFJXqesbRaWsrtGhgTTEZBKgtO2Euh+GaXSfCvlE3PZBRi48Tm6yxkBPP2MQhIMMRiaagTX+MDeGzp3rUGth7QU0sogUAzif3Bdt2ODQOS0d8WVE09J2b/78iDpbadmu1VRzMsXkEDTQDZAcMYihmAs3b8HpPxXPsvOcyAhMygo+ZsMixlXZlFIkIJy45AeT/P7WgpEDGJj4w5W+/BI9i/B3BpAWReQAO4F3t9ZAEr7y9h2mRUYJ9J7sTyWoMAxMeAKQlWqaLivIjQt6c9FixQAoQfAHhIjmi/2Am67QVn1sOvhNueg5v8JEO75sxCJNRx3zL3hZxX8sQdkZNFB8QqA3DXB9fvotJeae0PBkCwSdOeZrJw5FsQq25VPbTSq45Ebmk0Y/g9cHFMHmd/nao5dc7m2WoH+xWSXCz5ifvC+4HkeZ8ybE4faJ77Ttf1PDEfNO9kas0bRdgvgDFJRaVUTAdSvKNYs9FRTicISmebc1wC0pb9YpiGUTR90qkBkjPV/IFeAWo+iRXbbDYjdfIoyD3WIAIpGzPECDuzDqFQivL+c6aEwSHahZYE3Oh0S1Mt4SBOoG29k0T4L9yLC+c3mceb4WhccOfFlqGLvNwmMcRYVGnJWIbOeGNFBIkm5QoED8hOQ7gYR63O7hxH/OLAHcwvMQaJLhLc2iq2+sMOPKqTAPkW8RgLV8dUs0kqS5yDdhSkXco6Zha3mukUe7YYEC2te0FAgihwvvGGWeXzYaAdytpq5Y4Q9aB/f++Y7XCltJmGMlzZeVYVKyXEMUsVbIm8JTue4jc5DpzW5G2poCvihzFKu/yhw5/N0Q46iMJkhd4nG22SXYgdUqticaiMaEn70XwNaXYY82++M87yxBABFgs3RD3l/w7tLEQAcV8lquYfUP7zlOWUAfn+xT7y/FXZpIkmgACIGvmWVUgyEZ+/uYBtUZonFGvlHoMMOzkBL2b+IuwUTr00bsHRGRxcgOfNFOxe7+qkCcSYEn9g1746F2S42sZiXOI5D4/UEJiGxux3XzvEFb3AsRo//qK5g59yg6OcMokuc2uiwNek9Is78TcwB/z5nCviNV/zGK/75eMVfdzDJJ9RojLhSEeyIMfCI61fmi7EiH0mOHpq+XPMbmaS4WDnehNe3Apb61nJU81MqDotSKPFgVyb9aVPtYMEZehZAdgfsdhZLbngWuGJTTbCwhHj9NNa5juK7trzWnJT+dMNwJNSOYa8oeKWEQgdQbBNtRg3sDVE9BrUG086ZXCUjLgMg3VIJ5Q7GHEAt8uoeCVDF/S4JvS5lUFLC3WHmGPZHPtTYA+uYFXA41AjGFixYPsCtDpccpAgaPR8Y6AHMM6vxArhzaPUOTdCFHeyRCNwd7J6plbcKErKDSaEl/6bQutfUxhU3yP6LE/C3XEqHp63NecoLAGzdv2caXl5+GttjmDeAWvMc8CwA9MokZcZcIf21LRIpmdHABABs3Q8n4gCDNc1uOrpBoIesQo2yOk7V6Rn7rtwDBbUjCN1IoYZzL2YxUWHYETCkTAy0WT4Q/6VoJDJ4R5Kpg8ceBBCgB65m4C8JAM899phgLrI/9wQsZmyIvB+BEgDYGAW6rWllW5JJ9NMdPyyL1N03mM7cAqwFgI/da/RZNmfBo3Du+o5gN9YogYTa40eb6l4Qp+J0DlpUmwEQc4i4i5eev8Mx7XUMQefQX8fu17cOqqX6sc8i9fe43AWOq/bz8GQBKnbI25hoygeH0yeonL+zwX0pIpUwLXHOHotZYVd2WWrbwwS+eeQiEdAzoD0Zes/7zkIzz1WMm83CnztUydHqvZT+NDXdY1BzgI9IGclgBBl6f8H5GboDgQSPncPQD3BhW7BsZECQUk07iBTArSC4IFpgt+mbNrnIIc8zakLbJyK4bVXAklrPW61nXJgeUij82hUFj/ws+QxCxRfqho1P/sN3dwfv8EE6kFnXpxquAP0tHtFwibIJcGNhhn/XKAao2VFuQPm+LNIvaabedUdiFWvt7rglnxGwh9ZMw06aAeD7HCyy0WYUoMNvw2G4a02AkK6T9DfRQVlJHneCmFcSSskNXiY9wSWTlxyOjPi6OvdFArK2vQALA6DCUbOJ19o6fKMwQX14DBFIgNuXMR/JZEule1P5+h1E51m7Yx/z1AkMz+d4zq/ZQlkpdrmGn4BAfRcIN5Wg9nbBF2/BxFB7LaR8eJyZzfh8J6MkAezsavWbMwNEImzT0N4WAAO6CJ5LvlfOithMKJbu6mCjJTn8K4DtAsUnRBBSbR18E5hLO0AW37B+NkAAQpuA33SN+NqwgoVucLwyMYxt5QCmJeFsImeauM9IUCnfxls85ox+k2v7G5CJ4V7nAYi1SLtuBEgeMVTOvYx/e9gXCcCIMVyASUDJ/KocCg6Ze6AZ4sO7qHLa7NN6Zwyf89hYzEz76TQOpkdXVnRdxEVP26Bk1iHPeUMECSx+Wkr+CuGrZf8BjU4E0ZjLCceHa5AdNe4V2CLIuRAaM2a4Fgi5Rv4+C7MG85+AAGP/WZ6rBlC747NYsWcMzb/f+blEMFfEWtjQTf8xFvNojXgDAGTJAZx7Del+5Vq7otnNq+LtXfMyNQr1WSQJtndK6cExolgGGN7GM6K7pUWnzBr4XIoE6Yv2DcXFtRzHbM86y5zB9Z2uVrMICXoj0MKuiZB3n0bbBBaVAARhiriBh33kuYwOJhNYzlIIKU+J/Zm//7x+BeUKNFXtLowixW40H2JVjJCqAvz53nd+kFLz/9VBJ1rg9ywwfFRctUPSn/Y0fIijAEr6LnCvBmYxdseLlAFLfMAIfAPIauwMUC0JDxoz35bmvJaUiBdslciZHHukj0H7G2mybtlwnzBn19OVKvsAVFf89oAtRM5rVZDXkq2zh4eVk4iCAMATwLYNkYEc/8BndgOh/lBStDrTlQAAIABJREFUYGLdbbgmNAubovEaUqCoo+24uBI3ca/CSOI23+UyUWzzlgSOy126mOMam5SYFX/gFOmXih2rKGUOj/h9HyilViclgCDRkhyRr7tqneoeI+eRw77qtu6wRcvCtXucdY7cGMcw3+7XdDeIJt5WXjfvtMjTCtT6ZC5gmpLMzNXmGZM6MZa03ZcB7xyF4rNyjPQ199AohnNGWG76ETOpv0rejf0sRt9jA0HoUZ+4Vvh6oRSojQ2PAvV0P2Qfo7PaHHckO+59Fi6LHDtAb/ghlYgeF6Lec0K3GHYUyPzYUz/xSf+nlLd2O6TCUjEpixLIt41u/mOv8ZGkLbPOW75ZDPgbr/iNV/zT8Yq/LDCJo/QNm92JqvzHZ6zySgVFR/HHBdjGgVzFWkntqwiazttjsIsuKnh/GJN+UGN30EGyq5cxE3TRxQVgTYUBcbKB8qKTSyZtsnRj8Gzcf7aC9G/pEepZ6Fw3sL1k1wbiSFwnW6oS7vV4tZShgM+Sq7t2sgRRXWImnZRdOHUnFaqCYY51Bn5oA898pN+zdTu17v3lAqkiWBuRvFcxzgw6K8fDOgitr3s/USa+EeS7VEt0sbEcB3sTeEew9zIWGMVWOcnTQbSBtWLsGlBdN1lo8nwQ3+mSBcNhMCOBPpkXW/oZJaNQIfAalu64jdKPWeEZnimxw2V0ezJC5tKtGJV5nYEdrwisvy5b3F8O6M7SmBxAmrg1Y0gMaRi/lrQyvist5nij2+zx+gVAQCPJskdRY5fjylvcdbaHMUDk3xXmYYNuCyCPcilZqJ2h/zotZCwXsELGc49mZ9yj390juCbbJx0O9+KFNNwcOfxLmd8clyfTdxa79KMKP6M71zKZl5R8ZFFr2lEs0wx0owC1DXJo/VfnmAA7mMzqEajJQsozVOLa1DEssZa8jGSRQc/3YoUPOBmdmaQhGcPrAbplwDSrmHZ6oB7mLaGpLTbK4AyhbZVcP3csX8cYQeXg56Hld9n1kT8wj9At37JlpywlhESKcW5gAJ2PQCPazG7XDLYYV1v7e/M4ZyeQwb8/SBHOoIzdgpvgCvgeQ9ghx5VBSDTx78P4Wr6BFQD7HIq3KvZ2KKwIBZ+aNsxwK5PNM3A916SALtVKlD7CRSy9UeAI2ALP4DZJJGhQBKg5MuXPHbW3XzbLv80ISFfMBAQcw7Ll3THTd7pVYVwwqkjQnbIG3XjapfRF7hC8joD0mCmYoOM30t4HEP6aSQDQcdkjuY/FPYP9ESCmR3E9IWONJNQSxsnno4CIP3xFbWNbIdWj8CCLZCANB4a/q8NzFdjan2EHDOroxOCc/7eTMBW+SNzxlv6slAhOICR+yUmGEBGYehMPzrU5pCzcTxtzgGWquGTgEOxCMc2NCRcl4vq15OjGynddbYDqOVze8kke97Ck5yLk5YqDRASMkALbV9/7CvBmGotMCYoj7jllnCEooLA/tz3szWfIJqkzFnn5IGAb53dZsvJZ9BMg5os4XmmTTpDQFSnz8EgQ9XsxVs9LnICR6BMoHjGHgz/T+dUJRPecVsMU/oR6MzqbJd5M1yzgAZ0bLOv1UWU8ZugCU+ZxVTiu30eA84BZz1J5/BBAcCDnRArCZ/a3SUIMUL/yxUZTLm8gG4hYS7prCCalBLFm77VTQikBMsPZh8i5S2ZGPw3GPRsxG+yibNq4G2jmrJVItGvj2X8sXD5i0JrBE+Q5RxeVpDvUzmvFEkwHPOTBlg/k0iC6BQVvlJJF3I8DPYdNABss6tGCh71VPihhgg9oZLRfcAIpX+ohZR/PQSICEMNbvpe/WnLn6eAXjs8kIUs2vVUxcn/bEe+y0kOPZWH3cl/WDCEz6Gh5+EchVlD+Cujf2dk5hzOn66HciGdtop2Xp2KCnEUldnCePmXKBKBxxvax0/P7h6/1HWDw8fveP13nNHMRdyzNuCjjmLD9/vRNXy8NQ6HKGQ7smFWsQXv/sVGdDddRo8uXk2N/pY+6BVDQTi4F/qiC6dmBxVx1JYnRAcFHrO/GOggxX0Ewj+eez/XKVczB5zaPYsfE3o4xuoBt+AlH2rUmU/PzCNR2FbviDQEA7xy7bbuZMt/gWtiA9GfWkAxWt6NrZD+KHCyotZQtbXHHL0kyzV1T8zaBOmecdcUvDbU6R+l/yuwJpSLVFh5x95En5D3huA8cNo/nNXqu0j5H/iRAFHe0zicAzkEpFZaQDzyc3H6osXQXOn1GFhvjnA+Sdt09cJsvvsa1xwZo24xUVTqxo+kDOSLOUq4TxyUGm1bPJtcm70+3N4E/ilJz9JzDpefnekpXx8IXCSWfcJQc6rPcNbYkuu2xoYO+ZsEqz+5CfL/nkgPfy5muLtjZEe+8s/MyJvrf6vqNV+A3XvEPxyv+ssBUL5WfNIsX8GPbnSUmXhvdQgwjgCqQBrY9UlwhWzMx6Td1Th4f4ALgyTzRThZ6Fkmz/9LjcCg9A02R5tD9P/a+bUuSG0fSANIjq3v//0+3W5XuJLAPhgujulfzNoqjUz5nWlJmhodfSFwMBoNEsmpuNavGFJRtESnAQLG7GCSoYAqhPc38oQtcdwShFYDEPXIxZAv32YtCya7sqkpQ2n13m6FIBUmZgKkBL9+9AgC4NYvkGcesAEsH5W8FoG4jZtX7elo+hfqPuTlzlg5gUcE1vYLRBbi9IvBcb69foxjgAUSLZwGCIMUIJ1BdMzaLcTe8gZIRz3ScQadI6VlK/ex9gS9NxmLcMzam/+ky/18/mNdZ6w9rPqvvLqL5K4YRA37FM90xsC1YNr6VckL5rEUwd8rOGL5Hdvwd62W/8QMAnAkz6l1OA1YyJUOz202C5aPwYbUv8zNb9lHDbPZfBS6OBgeA0nI+NUpxdDv+WpgC9J3ZJZPBaGn6oxh732MVS0d1YB5ygrYNW4+ETQx7SjB4EdITaHBCFrKWc+22OwnmbNUahll5hzTb/gzvUucefkE2y78bp4H3+qc7f34P7mF3w2vzPn8s4IlA7xFNYjzmDhbSWHU2cW0ZTucepY54ssom96l7MTtucUBaB9zjfOOJ7s83eYDPOAYIFBs0gtzOHiQCej2HikcFMzWHAWD7xi0esgH5Tl4Ylpr+gI0BC99g7oAcQZiBs1E24OPo0JPaJNjyXhhl63MOEB9AstKC2chtEa3Rpi31UAD+hMNhO4O13HCRCO0Godwn/lG62KiEKfsfXRWwm4l9Md7I/hMhyDZjvt+tHprZ56bsYbgmih3P8p8xY+MndnWnDr16tk8WaNGz5dw6qal3bCMGzJLl+Tjd4fQBFe3ZhELChSISpUzYZPwSHPL3t4x4bMbOFgB2SdngFYzbGZIO/CzPr6q45EWw3BLY5Ht4Y81JyH7qiM5JbSmW2HcDgvuDWgM9nomGk9CUyhO8SYRkcj38sGMBqEZUwD1YCBsH/zLXNnBuSNt6dy3tcEDpMzdq6DpnyWQM1kBvxgMEyz0/HTEeb4g+LSgS7nCMQ6YuPmNe4Dg7zlN6Nu33QLLgDbvkGaoT1BV7eMh8SKgAHAC7t6QFk8ucF+gw2wRxhECX8hXU8bW5V3dK9BH7qGdRQ2Fj6qwNBYIssWS2TG7OcNzRQy2CpcBA2J9Y87pWSXaIt9RMgUcBjLaNib0Sa8ahkQiBUq7RVXH7A5GJpUxE3El+8Jz5aJyGAs8O44j3ETMJo/tA7RWxL/OOJ2WU64n9JzPxrz6mD64RyXg1yCxXxxIAk0KPtSgiWGhZIRWwg0ikC6wimNspC+NavJaezXoMBUZr7fO7BFta8swUMXMx0V7Ud2c3oAWQmmtKxctvukjFmtPTJx9SvfCyeyUvZS1OxtzrLDVH7F9yfqPyHBsrYpmNXeDKdaRKbSNyD16Y2J7SgU1/ypkCW6+KwfQN0Uyg00rWh0s99lU8860JPlC+Ofd4drkzpuzu8/RbXcrvXM9h/RIjz3RRwJPkoxXHm6KkXCofQJAD0Z0SFxSVfMuE4pf7GwRwCBq9+2ERhA7JZx1uwY4e71emrv36vGXBbWQxtYsACZaNjJ/AQsc8ANIvAFgdt7tvPPGdK3IsOeeNeRcol05Ydm5Ebi5bYhC9QI1yc7zAyL2x3grmuplXD2Mnj0AKlKMbC3s7KMXGXC3iXVzVGdG5n2JkN6O0Ag1itt44cIZ5+rPtaBmxkN+ZnadNJ5mP821ROd4VcmImAkSeOWrf9bsbZvXccl1OswLQAW5dd4NF4Q0yY65f+KgkAFsMizfHjvmM/M55nB3MB7XB98xzZ0jKqlh0RObRM7niP8vWyIErpfSlHl2+VKcJqdtQvRnadvMTDknm/Zm3iFCWOGKFIYYnMS0dsYcUOczeDx9BArcEnsiyg2vLNsEnZCT5Me1YA+BWMsW9ztwde+Soi/AJauXrXK3WQZm5s6jsr4xGw+cBUAt/JMgxAAI55j4NePjvywckip7ZqWYSPs89iAC/2qReYxMWOCDnx+T+zGfGnsaUc21iQmIYVxHBQLygCsCxT4//XdCIU73ykzPjWNqYZ+Id9/SaWar+Ax6qRNklXwUtM1ze+faqMQ+MOzpXfME28IrvvzDQ6Knip/6ktGvhKkfc4xNtcyKWUMo7d2wRcVWZ7NXv/0OO33jFb7zi745X/HkHU1aqk4lQQ9q05t4weU9jdxi1MHwq7MZI/X0mpbtbz92AzWr2dVxOsgQMq1hmaXST4ZMFonQyNdTYO5nY4i3vlJvVd8lbTUEVVVYYSxMaMwclBmouzFzVSpdDedXkYF6ElqOsGMAcbYOIBDyTsDEhxShigAYA0yeeeAQWFUpfOaiaN/SEEUhZA78M2TKsLlWtnOU5mlmi0C7IZLCLjVfcH9P2eMbxLJdYbOyoemYRryx3L65huxKyEewQ9xeDE1A+z0LGIWfYyGhQ6p4PJJhFP55soTUgAjs+k18SHVBqJF4Q/vFkga7lcz6svoQluxw+C0MR/MtVoJjIVQzv1MGFOBMXkN2ccypKI9TQc3FO5heaRXQy9UqfvxirrXNsIXAiqhjWxdjcK5mw8fr4mYFxzDbzkjFMY+TaA01Z+Iiv33SolwuSMXm2aa5MuYVMZzoxgWYbcVbTMSo5mXjBhmBjYx9rZIvSkdmChPGlOj8lhp7rD8TF9gwqdCL9RKHq2qiAdljLawoyoPo+Zrr1IMOU0lBDAZhQwV0F73A41RUJ6N6Ym8HZmFngYfAnInhB672mg5K0YeHwNdqgZV9HPTg0bfUnzFiY2gDGGHgBsO1VdNIcBCh8d2pWyfmnHCIeIEomzw1QZ6QpGQAd6xa6YZYyFZwDmN0RZOJ9V3BHdmoUXJ0A8BStBHMdcwPLX4EBMb9L0eJgPFwBMcI7ph4JToICAsdTHQRrPBjSQVGuFQFtKSAFdieZgDMFU0Z24zvBPNcI5JqRBOQsC38DlSS7MVRr1kRGA1D9JQjakMl5KMMA3xv/GhwyvteugNU9+bl8SrxWAgUA8NoDPljkzL/ccpc/W4KW2xKAvFqDIFlCCvgrrjUABdvtg4Dq/EPOx8CDlP15rXl0AG/Ao+gez0eWFR9mOgDRt1goEznGOfxO7kHHpQrdD55iKq8q3PzaYfKXHrIYWGquj0w9GXDS/yezSUoeQ0YnhHuvAgVqeLoO1CBTcXZVAtgh1QVBD+4VK8DQdxNfDlGMAgdSZ11UoJb2a8R8QCHZQoAVe5YkH5JmRFjyqrRVvmKdcgYVY8Nc9Yc8gyu2E4TMZEkgkM1h6MO8C1O1D62LYd7SXkDLnhCH5hpSMAba7vhZABzvJbsU8v0kULyV4KLoAo5u17SFHj/bl1bH/DDglezJ1MT3lHqJNZCxZ9yv2Q/YuGu9kBTkVbRTX7gCaHF3vAYLPmPzSRta53u446JxBY7nm3vywY4EswsZcwgH3MPh8sCjSPIEuDG9B4R/yrEkipwxdNeGVCEj3dLQDXcWTkyzsCocji4SA4YRz4IHi1MEurYEFoXOkS5cVezbCrhGt45F59TxnNRmdWkD8e79WHtK4E2YyfOc+K6lrK4YeNW/8/2zGJSEouxYz6IRiTl5N5ypBEExS8mej70sG0+pQmTHpJ5CDTXsm5fXNtbd8S3fGH4xHzOlXGAUdXlRKKBjm5Qtb6DriLEPl75G5pOKVM2Qs8iZKguYWBHvpiJH1TCchaBV9zKh4cN+rP6Jh6/b2JUncIwnp/A+44rrayBbFq/jJROyo1PAJnJO106GvEgV+R3zLf8GgB8+614+5ZARwFoBy4xb9mw5KoVAhkROuZDkvOyWMVvs6EuWvZOscIcUHLdPPIMYsP1MvM2y5XfHRQ123rYCyzfBeRGgYrRRmAl81rUQNPMAmnswuQl95KPpVwPgjjvMGS0WBoX7Tcv3rMwZ4xPuGz5TceKC2c18HxwGvi76FXfH4z3L8J60QXtz5pReEy8OF4nrp58tGUyhbza/ozCuhV8kmXRuwCO3y1gDOMBiOHPFOGr2VA2WGHhFF+6SXUQKH38EjqWlOvM99L/KG47eeAWMkn1okOEw/Q7/74DPKG5tSm9eA8MFe29svzibxwH3h/ZEtJswXThnClStqe/8IH8lI3C8WEcYic0NbF8xyyxJIgaXsEmBczgQxT2vuJt+P3MMzjAbxwwdAJW7AvQLCbVeMfdnbYVGsd1k4RUF+JpldXQpbpfAS4515K8jB5TaJ4KMWwSmL+a7A9DNHH3mjD5YYYMsIPFUA2ABzj3yEof7wq54JB/sAdxbFsuI6STOkSd9DWFR2R0P7pqZ2UfnnewEfLdFPDf/4wlpPham4/b9ENISFD6HyDtHdsU6IMb3SnxtAHDMJX0Nslh4wIExiRdUuBWYa2GMgRlSpiKCV/jlxx1jhd8KzHS6AIMYBu1JEjuIM162YCM7eGbLzuV8NQBqnW1+wvEbr/iNV/zd8Yo/hd63BHM0qvcps2QxCyYD+nyxWd2C3AU+c/4RK+4DOVNmB1gdG8x2gKBeN4sM1sYqw1fPNpMeiVvIltRg+4wjAFSPgOaoWtJQZou0dACBZPlQG5PGdR0PMFv8+jrNL1gURWr4bNQ3WYe06A4AdlWBNbqpTg1uhD5jy+FxmCWAwRZzX1pt5jsSACb5DAKnDWjyAH5xsgALCCmvUsNzN6qNfGIdDOCetbNiyCYEsKMlmu9cq5orMgjACLB9hpMmU9fhcOu29AqgxCFY2HuzmBdGJqXICHRrMEc6SE+YfOez9mA2Vly4Kvn+H5b5//rhIdbBllaCBmwXbrk4LmGJYlIwr7Bj8UfwVTnpDmevVawzvCqQegYHny9/kIUncRygXZzHUxwyCjH8y2p3ZjvyAYSdBCD3Y0gpnVkzWcOIHQXO4agiSl6T+YLGvcIjuXaHVAFx1d4bYtCccVRZ0m4A0APEGgJglI8sJ64TY0ViA2CNHPCbdqcdr5pWEWtmYCPA2G2jegYTS4TUp+6fpZRJJn6UzmwgYkbBe+dGw4MRNsKFRW+ZzRw3AaAN9ta7joF/I9ph+dsXNIR8M0YJk15OYqecYDqVSP4y8UugJl/Z4wsdnn7GsTLIzwQiW7LRAO4okKg7SreQieHmJZ1YG1GCTVT8Ki15z43Nv3Wr/aKjmVrFxAxnzsNwMucqSQgAcezZJlu+4vcbkmCxB3smwEDeSWsyD0+Q3Msuc37OiPttMD5VsbmvRy8OaP1tXWcUNXcRFghqePgeCSa1FTuOR7KOhjgouUJpLAF9QPl2ZCJh7Jp3h42WAStZBlfMGGqa74f/DParKMZKP0MATIQgOX3Equ8HyPjn53cA7E2yoJ/Of41ihQl+TrK6p76QLQIF7lj4VqE+Ml877wUIOU2/I1hWjAgkV8iGcH99VuHWxcq250wYIGYLgEkkb7mTQETwTxZegBAh4WDBpk6ZOnctdj+3sMD8gkcHJZmoATKl/XZtxrO8gF9BomDeMx85Epzah7v24YBUh0hKAJg2S3SEzyWvOL+noJPak1I/j86Fko3TkodwdHKf1y+4jgLUhIYk8lPAkxU7Pt9H/XuQLV7e+7eShuEhMdcxEuQEcJIEluB3kJ7q/K+4vhEJqpOwJfGiqpB1H5/R0sPXinFH8pjjI/GkAhw1eMUSuZLiRtk9rw36OygP6+7QlbGOA04d8zUN1+rCJRBg7IfJ5fmRQwGMjXLPrMpi9aDCh0+uOSJMLtPF5JxVg8HGKHDOnEPA8/fLUN1O7qQRsZsszjOsGOBAFCUKyKL6e80scYJpbhb2DeAkmOwOpMS1iOAJlQKLGNeBsn08VRax0ECdb56j8qYgHMbnTSbVKGKv0VdrMdAd35VnGBSiUYSMfaCy4KbMPUBJ4/d8oWNADII6Asp6AfRtNTMVgqdsAz//WrsIX8MXXs7Yao0L2UmRM0i+xaCxCfr5TnxlHixdIMrZc3DBo9/MLXVg2zfGGPjxpGxhg7KckRI2KNQnTARDw8opO0pdPSlskWekvMo78Mv48H1e3CccjPcamIZkB5aUjfIs5ErbiIZymcc6ngMXiJ9VXAlgkzSbMtjsuogOiuHYO+fKZG58XKQ2QlDPT26oXVXYAzI27NwnbQBMkNJSMTQBG9adqdag5Qjwaft34Cceq5q/v3OWi1O9QZXx1RYJ1ntcvzO3d7BbZcTcvzmMkozgjAiDRYE487w7ZqGh4kL3C9n9K3bs/ZQDdMeWGY9h1a7aZRekpL/EtGbKoUhw1v4OlKPnemVRyG1gh6TmxFf73kPpxc0wxmCs77n+DRhAkk74Koh/uHuRftd+MJ2jAQxaoGRKZ/ox7N0mpTjjZuI+9M3H/9VH2jAJ25n73xCSVkEc2EpCquecjoif03bsdHGZl3hjZi6KO7ouWF9hbpOzYnxPjPj5QnaSvecPRTTNrh2XisXVHH7I4XBteIGKzBHWaQQy4+d/mjImdcpwwYJQW3nI0zlIYBgqqzAKjil49w849ixgsMAghuWsln5W0zdWguaGWCve7ybWZNqrJGScxx051A8beAbzjVR8GWZ43mQZD2wDiIJWdIy7/2LQAD/iq8EKRJyGe5Izn58676VfEa9mgRBw7/2vg5hgvg/DhemGoQKTAV8tzefueAYLdIlJVDG/CmzdLf4px2+84jde8XfHK/50x6VxT53rXSzJU25gQost07JMXHQS84ZZ2dz80RsDyAUEJYDSIBXeN6/hv7A6hqdBoiRJAZ3x8PcwyB71GXHCFzkc1UShQraaHIZ4JnPTO5hxvEpeSgE6trojQQpFAJ0Ev+L+HM5gIW1dFlewi0UnesrKoEluHs9JDWIX3FgsM8/AcVQBL4PNJascSxojRMCaoFBrdieQcsf18sWlHrKCe8JEi3GxRbCzmyh20qTAV128ejJLbyYomCBrFzGDSeL6+c+1+QymTCisZiQMi8FzeTHgwN5kTuWSHntEkP3LA0zPYnFjH3RoAFoaRmCpodg9O4PtToYz8Rx71N0xrRmRaO6YfWTRfQe4f+ORV/z+FQwBxynj+KtsvmLULAkJAATn2tBudRXYUcyKPWjsxqqW00wc4p3RRUTrrGslCb1UpZyJSKRe0h54e+8hYMNSl/n4/KkDXd1SjpJM6MK4QadWUpCdU/9tzhcN0gEcIqQqUzt1kTkNAHtke3yfB6p4hUFJ9u6ZP0wbBEkBqP+L/zQ9urFSL7Wf1Wv9H9j4WQF/AjzJ4nNsPJEwqj9A7MNTPzlZx26br9oJ+4gILjMYQmrnYI2Ui3X7tG0F2A84vmHajA+EjU1yBG+UskuaTjYSEQOK2FB/CwHMYBGcuuCQWojg+VE8498AyOpNJqt4n+u/yUT2nLOWZzG1o1uAxcKlDsUVjhWM+USa0IGUV4ml6r+8GNcanAufkJA3SKDK+fLjO3N+Id7WcJ3SaJsIhKwAobwBD6DXxTTYTluVATMD0PgDBsruFWsAKU0U4hrjYHXFDZZM6iEV0cNeDbmGc8Avwdb4dwwsebifdrO28ljquFY+39XmLxl/AlyWrf5H8H088rQ7SxdG/CJB2yyq2Cb7NW1gzkcefs5a+IQj/Wh0TRy68kk2mIW8scNnSG8jAaB+UW6tEn4mD5lbj5Cd4TlmlC5uLG8CQXn1IqZY2eThRqkdoOQY6uQAXIwFdqDISQxfkszQcUsmXjnYlU/A3oBpgAksYyTDSMDs2HcugKakchVMANco1hyswOGHfAsMS0NaL256K9eHBvPwbUdIf47Xla+imYWAHbZGyhg5kqk7IzbmPl8p2YOWb1iCGJre35XQ2Qi2XB5FIop/39gtZRMgJwkyJEioK0on3O/6fb4f/g2v5aUbvgn2fqd/9FWEKN1WMWLL1f73WTl/5cHBx8UThUjHezMTaZtAxEszCCLYuySVO2eVAvo6BqI6hNiEG2IWKv/edm7OWDPWPscVxagfWysuytmPOTwYYPiw8vszWJKeIeXYlB6DszsIjGUsShjTO54dGceIVW7D9ckv7t2c2ReBBhj3hTnvL/h4ALqrPJ9RduzlnFnDRalqEZhLdOX3c42nheMk/EnEeGfX0gPHGBe7zONelzrmyjU6SdKpwrXgGV73OeTUt88Xa6WUwe/6Cr+IyFGZx4kAuhdgswv1oI2r+cIKqFNucc9FAN20iYIwjJHF/1gLsUfr9vOyMneUT/JTPFapcfBi7/QLNqAh27PzGUrHDdNRAb8AeISy/rnWZ9iUjMMZxTT2wMIK/1b2BSkH2MBrs+qPCy4jNQgsOii7lfb6iBXT923ROm/mjbkv2kd5PQ/GKn0oWLBkXJQ4TNoKSiKpZ5mxAVvZYIF7+iFjt/HorHgoc3aNdbOlZ3O4DYwxKMVvyVbfKDBb/hHnfKrYtBSVsyYWtOQp4HopMFJG0DtG3+Nf5Y99dDDCFGcfRMbNwohIFVPVdoC3Doyed10d1zpQ+ZAbNjZxGVFgBGElYgbFKgA25ziad8FfF5AKQdmx7QfA/AmHRIwPDRwHKRXHa30nXcfJ1O7IAAAgAElEQVRnRKC7bcmAYvvDzx1E7FyZvhvDoRyyYYiWZDsUnMUZ2JoK3macvUfxmRPMIrsYtN5f+QHl2st4pSQwAxAXYbJBnPHib4/CiuMpZQ+PblVenWXSU4okDK5YoMluIK6BKPROBUJudqvjlQBoBC6Pcs+bG0NbU0CAGQpKe2+SOOLZr0Ka892hcpGti93FSmlo95jlcsSwOb/z9AU5k01hUB8RL+/GGs+n76+3n7ld2HoBClz4WUT4RPLURpFcS1ZUep6OwKhcJeB1xmtYDDIxzzxOej5noUUD6ErIhxy/8YrfeMXfHK/4H0q6vwToyZg/NMc4TyYKS0enQoHXmjCzH8FKtzAecrR4ouiSD0BVA5joq0mnspItMsBqJc8c59RqzVTXA2vQqLd4ABDULh8RrBR4L619yu4RXtceLCdtoLX0VaAZYMW1b4lOhXS62pshN4rJjAIUYJo6qpRCyYWhAVKkXN7J5Es3D+tBigJtJy2tQJ8MEzrBbsulk9NmTO4GHSY1EDGkhxoqDM/YcAWunA+kWomcwTBxXiM3fZr7LBqICO7YYHhWM5v0wt53XIrTcRxADEGgUc7fo2CSFXrVWTNuMhgV/SWg/4DDNTtOQpoh7wles8FGMNz4qvL5otpl+WkGMnkuDzCmfq9ZpY+h2AOwkCCi3E4w1gI8SmkitiG/O2N36nDn3KhTTi8Dt2HO4DuD54o2O2DjoGEy5xIIqETAyZ4EIriwDjT4O61nAZ+Uv7MAFYKRk+daIqUKJOawHACZAY1oxkt0Cs5W/fw+PRjhQCeHGnt1Z0IBsnhzoGcOt0+g8rweAJhhax7JwbkJxOX1hVReSKy6O7buMk4Wzn3PuxImd+BVYFru7YEFjwG0CviK1mMeW9ruGAwj7FyyJbYqnUwE9Hkt+fxVOjj8mENu7iUNPou0M1frWQe5X+zoCOOswAFN7ftMMJzPogKaDJqAsjumP5sprQKReYCxUeRD7Dl4Q0BlKjXepVP2SHqvALQPZ0FS4/rgwXiFBYGbzE4vCau8TlSQ6HiQTKJz7oRUcGMFvhR7T3ro8daQjYVgCKW/LJIh1XeAjgDNEzZsHesn44cIiOG1P/jIg2Ukhp6konUtHhIBkO8C7zXuf+uFnNV3buBM/kwdc7Mb01Rg8norDAhQc+7elzevNTv/GNF2d/VYHZt0J+dTssBV+BUNYN4JiqfExuE25wc1W6gPEj90RL7QkkJpn4ejpK4ygE+JDBHBkO7eriTGtYJ4aRwP+W+mhB9EGCuten9R1N8dY8qYRbxp0sQvSUucd+xklHbCAcwmO8AOf5QStgMGj+9on4TQ+d7mGEnCKjsxymZ62pJ8QDx5xZX3AVxynX2j5h66A/hCyTvjKPIjOxUEGpragEWiLjGclvIm2cEzfKAE1fKS5J2kUdKpePEaQKBIRLA0ixhMqPj3o+wDuy/CB8U9D3PcITF42QV2B2gVgnK+AAAMmQSbgNKkX5Bg0AJrNFCU17EwkJ0KYwOuZN+nJM4wxtYfdcR+Sqns7LyOySoAEDOI0PYG4cv4UiK2zuQ57XN/hS9AS1e/n1eR9t6Ymx03ty3qGRe1rwQFNC3f5asKiMKr9t5ZRL0qPplQuWNfzJbclhXJOP0ZdS66mNS5aL/7LajB3hKKCQnxnUW3/JwgupXmVzwzg0nKns/wjV6yfidZCckkPfbx2699cQYBjKCbO+Cz1rWpRRHM8Vwpc77A7nyHYLdtzGeyBjTiQd7PU0VI+ndKZbs7fCuuPG8hQXYUJVJqp6XcTO6QU4rnuR1jTOzIDx63em9A57ynzPZzrLdPOMRpV0yzuB9rQASuM4rVHecD9BX06ynfHrJD8Xz5R/pLtwGfwQOvNZZKEyYCGRkLpczoDd0p+QmUKko+U6TEWEiHJZkvvpHzttpHJRnXBGXnEt8w78gni82mKMnu7GiEn9KO3TvqNghQStyhR7exLgzN8zUAGJnp8RYUT/oTBzIagwDbFgRfZYvy7/koyHrf4wu17333uISZhWUgOx/UJpaMyF2jEGWUVJW0D9kFUx0SET+I1NybeMXcS+osyMfVMVaQwkY4FzHnvXBGhxvZ4kVKUaUCDRqUy9iAowo6p03KSHbmApQ7+pSDhWRFd5gJsgDqnjnihlRRg87aAxdjocaBkTFkv/dWIdECy3Vkp94Rb+GrQeckRkRuqkpllIwR02YZrMBrwQZi/qbuUBxSFkmIoViv4GK3S5F4OM6yZ9+5O4bN6vCRiCPr/sH8RXaO3WhD2bPMenYR3/vpj8PuzyTKO54s/h+dSluVGFwC8OiYog95O/fcijUUm7rOgJAwnDGC2I4uxN6j7hMXen0/Hm8ypDo95nDy/0cXyMIXinjMSnPYQtnPq+zPLlmzmhslWnE9yRYLKrxurzyd3/Oo4srOOWcOxhghc/4zlviQ4zde8Ruv+JvjFf+DRB7qRSEXjwjEfqDaiU3h42cUJfLetJKLjVnVdMm2LhGIZVcFq2q5KIAAuENX3mIxU0KMi2m4kRkCf2PBlV6rj9KY9EGVQwb88cIFgAYjwUFN97eXxuTD3YHxILvgZQdDzLpNGLLyIRWj0+zCQjIDqaUOdIDhhtIDdV0lO3eLQ/Giw4sA6gupoxqGPee6hG4jNx7BirMb69RW9NjY5gY4K8vDn3BGUnHrI9xMBCz4fE03PNoJRXcA2o7v+qpdUlx+DNlDnJv696kTTlahQPAtBAD8q5m6F5oFmKf5Q/ucXy4FOngwPtdIfXPqyCd4so9OjZp18yGHYMBlV4ElWTTsQso7UEjqUGflXgkesTA5gZAfYXzG4uEeR/BRoBsHJw9/YbpCYrDg8gXfRh14BWATVczS+2BVK1mzvospzl+9J/1Giht/4gPi/+AajUIXxu6ED8d+Va+1LByfCzFQuxq9bwxouxMDjlV5HlNHzoYAaK1yHghkQrwBuAbzcijoq2aESF2HA/bP+PxCVemT/Sp1RYDM0CAGRmieyzbcEwUIrJFvNQa5ou3lVsdTUgBk8f0Qx7VDm1UjsPVmsbg82LEvVWiH42FyTUAwlZrgvh+88EV5lnCAim/MlI7yHgQYpizuOWyO7AD28ueOHw68PggIB2jHmfBGopnpee6DsteVfvN/nck3AarZrE70DRZ05fwAn9sTfxeBPwDsIEVAUcPIHUB0vg6Xmkl2XDltvDv2QK01DVt7uZQ0mWHDkh1W2rwxz0XYLeDFKotr0gQBCDicUDUATOnOP/cH3wVESAWtgvRxXqQRdcGUQZZzJJoGBlrujr2lSCFVIGBfBNeyrgBDuvA5AghMsLqKGcW2D/KFsvV/rih4FGNK8GQXJ55OeuPz8xbGB6FdvYfFXI+OmHzMmOkxYVUoCT/kVjYALk0ImcHEGgpEZ6XgChCR69LdgQ2smdIPim3c7yXzIvbrLOC/9DC/YSBgR1+jBcLl9tpqBSVHWYX20ckCtwzCgUpXHDsG90aSkAUUSZANYZcQMdgKYkSSLQbZc5GwHBUqAKBsT7zTfQD0lBoK4M07MRqetnb3NQTQYTtAcx1Y4cvEnjonO4vy+vOeHgLk8Z6zyGTOGX+KTiKcKzV+vqkKIAH5hZ/Z8GKCJ8lAGMBhw7EtB9wC034EQJPgyoOEy0S04rmWMWkw7R0U7SQjGamqP6sb5eyWymdpuPCN6LhNnXDtGNr3wIzrThac4Sf+iMRlquBLfgAAvm2T8W6UjWOMsLDG06CNAOrdlc2ZJVckiUmgGEXm+JRjeoJAsXOSRS8bmrZGrOLcss+KZoIW0NQAksLav4lS4gIRa7lH1SoNTLOM1XMA96rkUrznhBVNMOJQXl8WuAD3lEXyBuJlwX1EIp17dZdMsPqrGMqmMf9HUIUWgt1ZRIzrjHXFdPSGBpimwpkuwwek5m2OrNWA8s/MK+FOQFgGBq7IKTo2smJXj4qnJAfWp+8HILgPItaEPQZgYAS5b8mmfCQiBlDG4f/cOTNAK/d1kzpXzTFNsELAfDdmCQCIooiW4sHSYwBzgRxWHSxrGPb+NxyOV+xVtShQCCXWFl70T1HsMzfcwjlEX3Y8y7CPbn7EUp9xEDK2mkdVE1+O3ARAX7eG9J0rPOZVZZwtkGDoBvh7yAaNiJmTWGa2wkY2oueghBAAaMozlaGNAonON1UUXusF3z0Hi8eq7iz3DZXcuxq2wSs3VqCA1RZupf/i50/fEvfrwI+YzbVl4EmlhTiDBAiWa7Ukc6GY1oWEIbTb2fXiQo/PODL/LiX2BHs47vTpGaPhD4KvUSSuwmaS29x7Prg6ln0j5f/5iL0GuyuUBIS8hjhSclb3V+2hl37zmlyIwCEJgWFbg4m7rhXdUhJALAswO5BU9SvMOmPBVYSJyBH91aRXWcwZAeDOtdpSS59w8FoNHnbFkc+yiSHi0ioemYrapq11gtsSsXraNxfEPBYJzIuxsPsNtyRqxiySkMBNvIPKJZTFIyDuuIIskOuE+zalnIh9CQCbnGvGeZ1hfwFkPlRiIQ6Y8p4FhjU6L1MVPHqXepOLHV0NsZ53z7rh+8wYn13BW0YVH81G+VpuXV5TdmDBJ67o8Hv8Gz7u8CHfEJDkfiU2Y+0nGps5cKFB8m/FzkDF6MSbBFcUrS/jc5xRLGUl5FVmSYz+cRwFkXsYnlzAkufceKXc6hBcK4rxoSrlYoyBE1fJHDmlxEKX1DdHlqh4FULWol91iY53NxJW4JjlU9fHEc1/4xW/8Yq/O17x5wUmXWBokgwqBvauC9SNd/h8KpyauWaPYMyxYRYtXshFseHyHXmRBtOOba+sztZagsxIPAA0EyUABeGN5hKsd+N9AjEWLvg5JkNv85gEJXnQf0OWkYMahB1Wdlt6VUsxsIO1mc8J+hNqIe8QyTRPHsbOHDM0KpcNdruKwPGUw269bcMhHYuVmqv+XhT7/x1ihpFtbTZg+jPukwtoxPNzdw6CTQC7rkMr8VkiGBaOLW2BdZIkznkyQAQlcvQ4iLQMhzteEUBvn7g1WSBaGzzf0d6Cc+5PDdcOJywb9cy2aCXK68r3uT8uCUpgv9ZhYlPeTHBTh0X5OfUwGQhrVM1XS8YJQYPsiAMQkgcxAC/0Um2tYFoLtu7S88+9slVRbT02YJ5JkEbBpofCASiH1IlKd/4xPkk2QLTEv01P7oRKE2xxfWMaP9lumkAeAMRcDj6vAzSMQKiK1G9O0QgmjEHZmfjY5TkvxMqJqSKCW4WVvEUzoVISoNkNIXEU762bVKUBxBjo7R5udCj02ZBIUtUFQ7NzKYbH2lXBF2M1fteDAAewajgigNJAznl41W6uhhksExdAc2izvTiIEQKTB1LXHU7cZgOI0m39J6h6Mng/4RjRIrw2irBQkibJ4DcUa6xv4ClQ6r/pDYt4tUarHfaoivjath1APsPs6F323aCUHRP9Yn1scA24e8x56ERDkJI/FoGT4pRdYUClPa8LZNXS78S7zmQX6AKx2dGGnoA3wcFXreX4mQwyW8C1mDZqrgQXEcVxwGazr8a++b0bDGQ8hnfmUFCPgmutPQAYNVtl6caIorvGvZptmF71PIFXJILBgoIji6BfRniEga7F2QFI24C0xTmYfYQWdQK8OY8sfTBBzEi0JRJr81BpDQm4GHi9fGEGYWTE1lH3KOQH1lugUO/lR97lJf7KY2BgSQbPXH8M3tsnexU80uYFESRkiJPZmGuVH5LafgYFNosJ8AnbG351YEyXoOBTap/gQpBHukW9kkiT7goB7EjeG8QhMJ1rnX40GWJSQZeQuZUQhKed3Qeo/qO6uEcWdaSL9hArgL7mbGBF0gw83nYK3sUHs5gRqF/JHca33kAwxttSae+hiD8d6YMBbKMuPr+tdfWLJXfhVCUo+aOy74pi9IWN8Eguzz9072dtoM11d0rpFvi9MPwVtozxxSUDQ5xAgVx4/Dve1QDMmIAF6K27pc4SwxgOtLTzVaDPySs618gnHO6UldPMGXLdjq8ii7gcUkklbXF0zoSdQ8TePI9Wok8YOWI7ZI7RuZGC3SyqCt8EaVr6KkDoWmVZrEPHmsj0JgBud8g2lM5yJMQA3jvCs2gldXd8p64YOCScI1F3OMwz7mm7wPXYMl5Azt/5jmvtRH+a41QH7iNzMkAL7Eog8yFoLZwtsj2fIb//EalFNikHwCeV0qFLCgj3seBZDCIGQoJRdF4RbEMBpCxG75ZVIyvy2OfMR7PYx6J/Mnh7Tt2OWR3mNzQKw5WTSqgnILsN3nPPuRaGDK5TRymVLGE+ILDqivmUQ4w4QpvDeOYngAUgaXwlnwOhbXEHpH1LKmmor8OG5owcB4J179J7ReVHd2Fq29oz28r8JIv1BOyoauKCKlaMlMLj0FUAwHQ9CiQhV+Ze6iFb2r8VUCcDJfMdz4cFGD6FYVa5O3TVXtmqRz4+4Z6MZ43cpEE1jaqT+gDkhgN4WbDsHQdxVA7brPiKGCuLdScpo4FGx6z2zIkdAOZwFobdGB3UCYy+3U1xxbWu0T6uCjiyIPK8FZ9UeqauieGKbqL0d+yays/HXGg5lVIMO2LEDS8bnCSMgQs75kFBrEDBcrsmn+WvQtKvlWas1lwfq65ZAzA1j3sRSucvSXJS5EXwdtKu9Uy9CqvHjKL8M0d0IKQPi24LP+PEzt0UlDv0ef1HDOrYkGD/v02pyPs48oqMP4k9hY7WIBmBGMJV9qEI2SIlVTbXho3sNuFK1e3YjTzUdZOjGsWAtMUhSU8A3/CMGfkUyv8NY74yfJYUvldRAcf7eqLHvX3GEkCSECQPskucJCNKIKbMtPgq6cId4D3t4awcMvftioKgjwHbPYN9jyOHDcA/uyO2at3LSRDI2ERXxsb0S+reMm0IokZ27mYu5/Oti+wTjt94xW+84u+OV/x5H66x0u3aLANe9WKikiBy/Xl6COBkW13Qo2jEN5yB1UIA2JpFAzJe9o5OA2dARZZPGg0gt4Zg/AfbI5YOX4D3QyE73zBEKlkQ8GdIEARppKLqaIJ9zGDKTiCLaiwrtdHOiof3nstDuCC3y1sL4jUmOtwcTLQdrMr/8gq+BfW3Z7onsSnddwXL55Eb8AVJz0tnUK+IElsc4hWLCajkYtQQMUHN7dnAE0D4ruGzG5cPANSJz5k2DiBlUGBkpIofsmSaldzvInFeKtU1ky2abGvsCrkgN3su9OOenWCVqkJW7jA7KuCfc3CIeQQiwYyEWDHPJJMbgNK84YAEnTjQGbG4sZ3dcjV3yMgUEkgbU7CrSUVjNtk7pUMDHAQAtR4gmYuOKy2ciXidl9V9ZS0/cxRBDNjj+0tmQe4hAC33Z1w/Q6QAiXWAchVk+EYOWXdj6ymveyLZTieopxKMOUexsVHfafjGC1DA8V2458gOQUcVXbIQA6C0Y3EkP0s4QyAeDJ+VnkkMGEBF8CgeEnrhYHx4BQ8j97VdZW4N6LZx7CgKLRaOjvvlOwp2ehbP0lH7ze/KNuUx443ybwmmyAE03lCkZIjgcYngoYuKnzbXgpDSjS8AboY9FWR5d1JDYIRHBWS/Fk7zX95mECrAkAWnNGCxwpKJlgknDoCT0X0H195SG5nke+hviw8WOZ1SAwCwhUw7nnTVO8qu3iy00oYcA14jCDz3OddAB4SIM1/psPyQlqoCQNqFsD0RsD4jkyEvu+s2ijxSTEbP74ygtcCP/G+pmYQwSgEQUHgO8JB/bWNEcJzz6s5dwhZ4WeHXYbEfG5zZ6pgVm8R8QUc9o3vUxB3aGqEvS7t0WY1Nh9uEbYKZT4ZSdtdeHBAMTSJFyJfKC6fW8rDoKNQbAAGR9VH7inI87Ehq34RjD8D+CdGfkAO4kmSGmqUxhR/BvvuowNplQvSFHPZqAga98aCz5xLWyT8NNwMXsVnEFIwVsRZlp9IGjtCkLuZbxK81ZDpOax7dPO51rSP2RsY1ABMvD3Z6jF7geQpc2UUA4HyO3KPouPFYu76jcKWK7yHY2yDxGVNUjGTI/eRveyM7OSjdmj+PTgmZRQYh2xQBuNEOXauHiov/lwHjjnpXcOAe+V0BbOPw6Y6wTwJBSBDKDYkk5AoQ9QT0YBtDgKEEMLNLX3xAzPECKhZZMvCVQGZPMEIxlc1QncdHXiDaxJRPOMgZUhhGAaksEFF+q2K8/f6s8p27O2MgC3sddm5AKYcWyXUyDYssog4E+G02Kyk9j/Jp2KXJnqSa06epK9e7A3p211iscfGaRXO+841UsmgpzYDr3+L5HSBzFn0g4SvOWC58UsJLi0Mz4p4VFkUdNStQPm9XnfES46H2n17nFUAyJ9w1c0fq/O13n8H9LiK4csbV6M7ABUHOGcu5ESTvzcqtPYHTscMDtZ8guDcjNoznaLQBOZutOhNzNqsYgUnwXdk+pO3ltB4EKiTYqUUS8x/AsYd7fcQ8PpA5/0mHkIJV/52YhDhwh999OcmyJHLlWlq4EpSM+aMZowHAED1yr1piZUvdrTAD8yO20lz/D6qzzF7w6GwzzbjnkOi2CYkCRMcCDUVvQduF0EASwfssC2PnUck6+pFbirC7BG23n9HkiWHAndctAwLO8KruYwPGwZYf8bk7OsDUFGYvwB1bnlKSsBE5kCkQUv1jA/c8rhspm5WkFQ0FHKkYe27gtbmFFgaG6tvnh6Fk6yjZzmc7Lff46nPZHYBhxzRq+gZG3yNnBh22Kt6L2Hu3EdfHRkUt1uAbnzsXxwjvv+szrbihoph67s4POOSMKzofSIxCD/ueuZbs2d2O0vP0aiTMkUObt3zToaz6H9LHerzrBRZ7Eluzyptox4VD6LhXbRModlQsRL/VxAcrX9XvQYwxpgnPJXGvADB3IHMOAsmJU7zNrUvsDZgB/uaefkZLJRo2LDFPoM61POf5sRvZ3ID5gvmKHKU7kx4ALhLyXYnT9BvLecr7wDorBneF1SwVLfJTyomeJFdiG5njxHc7u69FBdv/gZWEVzOIKu89cVa0uoAFtuLwev5yzNRK0/CAez4xlCGThcNf4mD3nPN9rIX4nvfCwCccv/GK33jF3xuv+NPoULEAu6CYb8GWB5OUhj116qWeHWUdngJzJYDKHKxF1hVve4geg0l59h3tpjmIubpq8mp3BwCuViujKtybyRkQwVguDOxoL3O8QorrUQL0rCRaLUgyNOIhBVtmSeuUajAKlEsVvONkk+36jIlgyAZ8w+2qWTEzWhyf8Y0OLL0cy1ckKd/SxaKlXdE/GUAzBxnKAURHYsXNlV1JTL7Yrse/uxW4No0F5/P8jHMdwXQ4waVtuK4sRCzABgEFGwo1j4WZGxWQAK+zEBAnpWNWwSVf8TODlSzETedj0TkXbzS1N3uwnAM725QVuaS92k7142b7Lf0GtaWf2Dvn0MlcCy+4pEzBVWsxmbyQATsjMYAJbMqeZeH3MLBA6P9GYUpG64PzlzwLAEoi1RDvcCySSr0ELkpjX0O8UidgWYGnXEKkPwcAlZ/v4XDFqLaWqJhQPFEs0fqZH+DCbs3rcIiq2nKcDl6rAIrRM9VEAAH+7VEQBjDwBcG/0eybdMD89+kWa59X4xEkZZI17OrityeIZygnq1kaFkC6lTy1mK8qFJHxlIFRFeyBDiQl/7sTMAaJyWKQYnu8EpTjG+WbCzBq2y7ZoIEV6Y5XQGfywghpRYGUjEMy0kze2cafcMwIgi3wtlEVsJZNEEcFJM3yZKcuj6OML81O3ULmnOiupF2PzsitCcJ18lnnFK4lYorrkMZE+ciytbpoAyX9JOUDigUk7GjlfkopoF8D5/xv2mqFlaTJ2AQVWWROkOEcPumYO59PBmZgQuAetpS/v7ZX8k/1FYPiZ13qQK/r1TFkkD4EI6av8L2QkecibP9HdlQmOMFW87lHPDSASXyswfj81hvDHHtv3Nco9paWTAmTf8ZxqwkN8ciu5Xhm+/5kpU6kLdb6nW5HFlRMuvO5O0AIZJgZg2h3QDcE/6St8SrxIiXIRBbG/zQa83/xcBX4IasmGSsBKF+rf1SXq+fsoLQ3wvWpJZkQicsIuV0AZjd03A1VCG1nbq8aOKv6xuxt8uvChsFVizm+4cAI3XcbLR+V3SGjZzu4pD63QxPINmWBQwTdKYIKQkWeVMPDAItILLZE1y8UT5GwAGSHajxDBeqahqD05wHFsAXxHtR7rdcBfnyjfHSCM2GzRARQx65MKRIfu5CU9OGOrV8Vl8NpZ/YRI2TyP4NxajsuEhwePWPwitK88G+jE8bgJWvzVA4gJZO7h0e83AWivQwjWH5jO5Mbd0AJnKp1OfPChsgVQ2+baJTgnciqTos34O/DutgtQJYd6gmiWQD10ogHyGRkPSLlrdjVlHsrO5M9Cg1MfPla9tFV0fJRu/IwKIrB3NLDhurucC2paU+h+5KJEGxTIGdHRme8uyGg+PiOmPvEyihcpQsYQIEblFAUpsmxZ7Y4POeSeMzPdSlhP3eHxlr/HiF9edoYv7pIMyxY7j0AfPvAgMashxtPgTYte6Qr8lvliqV/73xrh5rGdMMrnnEWsljAqKQYe2QXWMRlA5grOkJDklxEKi50CC57B9B4LwTjWDtPJjCBHzMDBuIzWvbHzGo+rfqMOTx2dHx2fp/gFn4tNCNffcYHnQ98ykECWM8lNrfyTVUIF0F2n5Ync4GFVLdbDyHXAIVbqCcIc6A/CnEm5vU52wH3UdCNDqStNeeW3i0kR6PocY+npSnl5nBxIsC8L9GK84ZZEBSkiQGH3FbG6P1p2o0ExrcAM8HwfOcWcwkB3HOV0z1XXtNfDRb77hq5LzxkqYAHJI+ItJJCvBwAnLuR0oznvI1SIlFKP2bhbmqeP56vzModLwMl6VAZDvGmmPx+y8AsckTGyxMQjnVYmFDbEbtETqWbZ3MH/PC9MwuwAOTf9V5QxbYsElq9d7cLSXDeoJ8373ndpqOURLJrZVoXGNu5c/MAACAASURBVD7loI+JfD0wP+6j7Dpp/zUzjxetDkCus/WOAwgirzKInMSW7JpbDX4fwwVrZohn3gX0/Hcc5xmB6/GcKdGV3++w7nJ3rXwnpcRMEex/5sWNeyfGROUPBUmYWVfax7vrfzPs0Z38LJRMLCV2uB+DYvI7htVeqhl+xqISBMB6QfQ7Ebg+f93rKknhGXKsc1h0cAhJJgSHiggvvrpDKfclgCsk8EwBqw6nLgBVh6h6FQps/BtjxV7J+eLjG1cYxQfKGdlmQJHrX1SYcXYjeSoa1KymQDGctoM+26t44qJV6GYuSALEjj29BBDrovgnHL/xijx+4xV/V7ziT5EMwQWJLiI6wRcXqsZQqyPAcaMmtIhQTqUG1XrJM5QsJy6MZIx5s8ikkvgMwtPpKDC0E+pDT3Ts2Rsg91kY/fxRV7E1/L8ih1UPd+RMpa0a1V9HLnrTfHmOnPZkR4V1SVQIRWKAskMwU+IRrFJPzAEa9ngWHOXEUDODjeHaEiyReKoaEB1cLgNDkmmRzoBV2LP1GDilLrz+Fq6YMgA7GI1muHUHeLPwFZrnHm1x91xVbBJpllYWsLTafgFfGzOg6lyH4hOmNyUmBHhCvgIew8qOVln3Dd9/1LVCAJV/llTZ9/yOv3NoJAP/3C9UyimrAr9MjDfOocWfcZgPwK8GvUYmBt2RIk4tfr66ZpZ4DJJ1Xa1EgmD2uONRlCa0Vs++VWItNqNI2aFPt/Y38+CcsWT+I5L3P9qxBBjGfZuSNQbHgjtq3hYPtniKbs5KAp1QJjTJ/17mGIjZXOgBxQCqaFVsDB9Zo6y17i7FVD8HlxtWtYwXPgLBiCLz+R05aDWZaGm3kgma59x+0cqIYE0B9l3niJfZM6x8wzUkk4KKOwJUABxuG5b0CzAxk7E4D6oKsoikNu2aYtdnJlawnyhlELY5C1gFtjiy2Ci4+55g9SZMf0YwMpo17FbSTzsHqMO6w+1DjjVihlYVxvn8lh/dcDoq0U5igBd4986eoUy84PaFjFOGg6A72QXth4x+wzAr0RAkO7w1hQ2z2EN5jGhDZ9JhEGsASxDM1NDhxSbg5ObYkTAN6W5HSqkEIyVjAXSQ5MmgCzAOANQePKONpB/PIJnOI/aEo0G7rcA/1nuwuEEQkUCpAS8mJTOlZPYxG+8IP9KHwl4NajjnjxXb2oFbLmglqjdeORi4rnliT4OMHMYc7KuwMV/rRz0ftua/v4ujpou5DdWdHFrVqhMzZW1GMJYcmCnLZFYSVSYOXxl8rkqegP8LyCF98MuhH1a4laMrZh7MQ/cMYgHPJCIXvwFZIZoyjiSGMjnivT4h0gpgEoCEKyztuoBFDlcMFey96Z+07ZcGeGxH2OPPq5LjFeCNjEzc2SOcf1s2sKQ2wisV/hBrOmJPgVaHEn1Jyy/w+XTn9Ajm2d5NOpCIGwmEv6KAJzBxrJi1NOOZPfp/y5ad3WOl2X7I7RlmJf0SvkTF8Mp4DSgplxWA26OUfElf84+d8XJKRi3s0DcXd9jIZxQEDFuYaNuZmu03WMja89917vtasIfv4Ir732r4I4CGLwjmFYSlkvQSzCzsOQD5F7ADEEQScAL0cUdK79logk4mRJ9yrKHhTG6IRJd0xC1J8mBhLmLC1JkXKbBtYwJjEeh3SrhNrFirLH7kM3y7+3gWLqjYuju4D0hMWLZgbhTEtEzmw5Zl3JI+Y3iD2wAwdiT0YIy6sbFndJpvrZxQgyDjMgsIEXHKKvEvIjneuBMwEWDN8EuS4JMi5WMUIyShAUp28e+euLyviCk9Clv+i7Si+gWVV6zRnzXXJ+PV10FaUmghkNlVxUx0NKiJBGdy5rBgX9l1xPftHgU+ESxfZIurAsZik5mF3r5gjIEnB1Wb4HIPR7riuzZ+po0cE4jOuGsT8J2iQTZjHjj1zMUc8NfBWtb2195/k8XkjzmMeeqOAk0x1wXwyE01i7RHvMf5MgmQHbJvsS7NJ8HeiOHXJBmw5PoPoM58VXqVuZX46L/TBUQHUzKhxbw6Voc12Jtx68sNq4rppDQ4knQpAJ4DWJfyDbkWKWvE3849ykdUjiSdZYq9Sg6NZ+OVJKFOYLArfmoTz9GxwbVy3DjGYcfJxDbQJzmiCP7L7DF17uv8d6wNlZ5Rdg9ghEzq0P+Ml1yA75yr4Tc8CRUW60D+VV2w8BdufdUz4Fq5cVlIsgqaGHvUyr7j+X0JOzQobUlcbOEHsog/VAqXosqFA/qThXx3zDULGO4B8UASaT/hSCxgVAdc42O10H1Gh1AXUfTAOEz/VX0FFWsp55lrkG9EBvbeUE3LCaySOuPX7IO0I26MRxNUz1J8jpEwzrGOC6x8h/fACG9sq/9uCcyIWzaQ8/gyouK18J9JiK0wTFISuJ9dF+sZ20GYP0efAaWqRKDyj1ZFkhvpY1wVexNN6e//V523SQFN1hihLsPYzRiXWsfTr62Vg77NxB6nnHXMTgyTvzCAA3d9Fb7Xz/M7FrrugQvE8TKWkS1AjFWZzi62OSZW5aWtjsK5OYekLkAVKGGn2hZgeHQp1V9YFZMEDtHAFzOf9O+39/8Jx2+84jde8XfHK/4UIbSYabODrTCKwfAw+REFfLWkQDzVU95rIAs2PYOH1tBZhRa2dZkfw6LkBd9hTLSlvM5Kay42w7tBz7+rGZ4AevBy7ST+Q4SdGAfAnhXEZMGRxUqgeeOo4Jdh92IZODgM+k16rHQvTwc3go3DFt8amOmowC6H89oGgjCKqQH2KmAurY2sdFjXbkc8+2FhHyzCBAd6gPMD8iQEL9u4U9sx8obLBtaguWP9dgZAFE72ACZ2hbz15AExbKUmJnWH00mytXmUA01mUAb+YUzkZztOjGoZzvf3yMYlfyA7U7pNOYs2eCu8fcKhEEB2PaklEq3RrWP8Pva1gbYR62YfA+Uy3lsKqC/oIPjyq07yjq0Yyh8AUls73xUdi0cAVLWSnNuFU39UK0nJvTK8mdC7kuwADQEyUnIWkTs0B4dXj2UI4DnBs7mSOdYFpNJphmNk0SjuU8Q7iTzZ4wAkg8FgEcocDLqi8KaxDmmPAieNNbikmb6ZpL32iwPfHTBdR7El57ShuiUJGo0AQHlPyzeuhZoBknsoJTcedeRsvelWs9fSyA/bR2HNoRJSK3jF8wVMbrJYBh3PWhuaBV3zt+C0pTPZ9C6yKuEbvg7HxkHG2w3Xh4lPuseMibS5woyeM0FSTlGqG206WSbwTNelEj8ekcQGvMJzekW1JHVL6R0DiFkO8fFf4ll3J7PFunDo3u+h8fYGcwHEvpqA8VpMMtC0sHlWSVXZCncgWqurSdrJNGtGdOxV2fixuw06pU44i4I2PocmP6Llb8cRfCVDfvjGIyQH8LPRNp9yZQHgAMDXnviuGR193dm5pxCYfL15FZdvzmkLv5M/v2cyf/zN5q2ISWYAOUtQAOueUeyQlg2DjJDJZFQrJkE6oY0Q+RmDTfM7+A4yuZqewmdyfD+iQBvvPBmgfjw/bx93Xv9ffWTpOYsJKfVGoJ/J68IBKkvKCdMWZ4HeJAdExzqT1UzUo42/uJHHjDffCxog0Ebvl0LFBTEvFGh2qXMGEABnZhW/T1BgHWQF+jL6vYxRBd180N8D4z0Lb5//lFyhTsA6AeDYE9sfzumUvowrvpNrT3AHAWH7g6+av5mxAPA6Bsw/oxMDANwPYXTEHFvnAS4I1jZ0PqaUKAJBHK61HxB94OYYvnBna1b4e1EvggHjtwBH45LWmEjHrfIqcO1R+qGzg9r9GLYcCe8ehpE65lAAP0Nyd4bPvKGH9LJH0SU7lCn4cAD1ObfEww/7ZzFXgWYC5tDdnpPa5B+GaxpxRMZNg2RsEZClSyCmilJH4n3Be4t4qEjYBRshF+gKGaHbXiAvSn1A3EASjXJYdmHpuYc7HurC6mbxNkCjJiSRntdzI9MWct1fOZ8l5i+ICH6Ko+feRjyPAQR7OZUVEDEwrw3IKrNKA/0bVnuwpYujO0UQM1z8bd1tkYonxRSiP2IuRMcX062k7dIvLiGUOnxA8MWL0p/4jpmqGt87jjyZL5X77RG+33stDAyIp3TSwbKXoHCukB8XQXZAJBDouqtbyQRYAZpb+K99oBM/TCHWhUcCRVbgzq0Tb7OvAIxN8OSTDvohRXbhRQkGBsN1yOHBObFIwlZazhp2Zw5g2ZGbfu2JOIv/Wem1d2dS+avsylMtDoS9sc4PCSF+gr4gFRF81rmqq1FHgXo8T8gUhg9GDUqnuc1Cscf/CQCpWQwdX3Ss0bM23MnwzmKQgwUd1ywQdUcwAEhIJiYTX2zVHoQsQM8802NEQWnl07YAQKy/4XfFrIJVz7wguW3FMN84iuLpsGUgq0FDnrYN8S6nd9yocldhD5nzitf1cx7QQD51FpMXLms5KBm0s6Ua4/ehMDNxZWGtujU5NqHGToT0mmcHnTZp8xOOCccWDem1iHsiRynJYWXsDPdKFVU6L861inqSCAnWsEUKxniqwA5fJ4p5SLzW+IXaG7NBZ+9cwyO/2rLL1tvoURrVtWmGUw445WSjyaHXAho85+9znVnEjlL7hHeXZAmptUV1oszLOp4cQRDAWMhRCQteWCsEGFOwtmBEwDVgUL1gZvgZ938Zai6LYleHY+awIvOY5b4KdM6uPcreXfFbQOrngUvsBdPI8VZjmaO63VFzefK687nxmjsGFHyFRDBKXo22L/BVU/Ss1Cx0CJKEtRX4GfF6vssBqwIy5IIH3pNzvEU44f6Tjt94BfAbr/h74xV/WmBigQeRVEt1hZzBcDKBeDGZpJw62BG9h2HgTUWAEgkgvwyd3ItBBreIeCf4pcEoBolrYgEsf35cfLwgdavkpIoXNjmoUHgvFh1UQ7jIuVmo4evyIIfabqTu6XkYA64IPEQFy3rwKrJQIJnw0tFaQDBQrfktCsdIibO4VxXDkA1Vx3KFJAvg0KLNwHJrO8+jo7jlwfzqVuNMvEQxgoVm4+hMQiaxo4B+MtxiOUpuLqtEDe5YcV9l4FTwzKiWm8JjNtLlIQ1jwMyBmEatZ/NuEaYoYBjYbcBcUVTj+W9V6NPSe9kN9koddF4EPumQCbhvxGPFxAjd+lcHRFH4A1DXr94I1fANF7aSp6QGs+f4DnNACE5kAsRfALkeLVlaxVo9pAtsH1rCyQzRt2Jugo/JODX0oEYPRwmgEmRq8OaAS7I1AcAr8WlnuRWQi+bpFV11K6Qn+Xzs6JAKcE+01s0GeugoqP0KkFHmbhCw6KmqWM7hfiyUR0Bz2J1xgD7WjwTNRhcMnMNAEYM/Q9ZFXhibzvbxZlTZTCar1fpNltG80zamQ4/rz+CdDb3Ye2MrsEeAvMaX7O7QxTe0l2AKcOmFlftK7mqd3qLl+CDZZg2y+EA/UElcvCM9in2fcmw1UAokM5AEaBloAJQXKXZnFsbldPLa4N8pNZLsfFh1hpW/naOZ3bqK6GhogEtje7qDshjuxQxK6YB89lcO0U5wDgNaA1IFI+dt6X9KoxJAfgVo8lThFfVbKxA/5S0GDE8C1MJuDLJe844n7jBMKVWQf2vB7kyvuDGA6iIEbuV1X+4YwuAwpUrW9BpAmQOefeyyMYbZDPdjX7dvo2wm3yvqmSb7x0DbRnIIRfspS8rrm3bB8h2XfMZqaTRviYcEdNwVKf/Cd52scp5nCeqZqGsPeU8bLYCF9Bd9cezrZGqCLP5POZK1n/MjagaMdNAqmuk1juT5ICCIHp2jKdV1AJPi5Ut6w+yaMWeuwF5hq+m7tugBbvd8kwrtI/gukCz3f31nywSTRhrxmPV8kQJzYbX/L8TedyZ3SVIalsOYM/HrQa1MsHb40DijGAtJjprXx+WhsJGgPM9/rYmnLlyB49kRfLzK/5DAwPeRUjWKlu3CQUJyV4gKXqYsAJhhD614+bJk2rZErGMV0JF2y2D1rMyvArAd3wFurkOublThLe9jbOBJKTRZkD2wDdBBiRxfE+4hiyc3CW5om8Yzpa+3kmNMX0WX+Fkko5xjsyKx7WveHbdYx7U1E0QNsskI9WG1b9IXayHfiQLkxktNdWsAUAG4YogWIYszrKIrUThXE/5O0uIpJfK86KBBAhYeSg3RlXiCcZFgSxU4BzRkjNYMeaXlNQxd3orAKP8Xt4OT1Z3DkRkf5Wd65uxwoIYv5X1o6NZ7F5f4DOP77FUxsMmg3KY70opMO7owbWPHdc+Ml0Vgx+yvLCaKKc8/RhVOGe/Pfm8QyJhVYHvwhQmDqmBuvp8lgjGCieoTM4HTAEy2GWbEOy44AEaeP4c3AyyKnR1MAPAMw5OAir0oV4PT7m/IL/vwrz48YmWpImeCP8ecORkFJmzqCfKeLEHiBJykusWWS8nKAY1FLN20f4oaTD+iGHiqCJhoxe4eM7MARAch94tW0UJr38cnQFyagMn2DRvr7W8Gcg5XEEmL9Bo23HstQS5kASbz+IFjLpVyTgu9UQK0BH2L6RyqKQYt36VZ8NWN+4jBzTjvGQFUOjiInXkEqoiWz+e5ep9eWwnQId6rUNh8vNmj7O6NPk1TAmdJskh/Ws+ki4E7zsXCzqp4OedFwV/EKURqPu+Zj3GGnYSsaeebPQz9aYKsJ2h4vFux8l1ZzJ54n7HyVx9JHs3nR/INZaswkhAcs168wWgbu4jCG1qqPOdBlYwA1jPfkZy/rRVPploJ5LCQRyfV1tmIN7KzHABSZeVdEYW/aijYgf4uoO/hALtR2EbGOguukf+YQMB835zM0CGARy5hsvv7i3SeBbr8Lj4LhWBtfZs3NVVLvoqzDycwEMQMh6ngS1h0WvE8efcZS2iRsIZnjBh2zB3TvkJajLl/Erm/cpljQqrA136/Z9QJAMO2DchV+cKKvfXIgwsvuh0A5nfgFVfsf14tiycTlhKTsacHbiDy9Omrctcnnd7WygEG0CSa3Oe6DtLBZxy/8Qpe/2+84u+LV/wPHUx8wa47nMBpoI9gK3OZ43f5Mw5SbY3AZLYNmQXCehQlVmyKGXqsGXjk50ZUJWHGSmO92Pcr2toBYCZIda0IJkV1ivBa3B3YwSyLi3ck0JzVYMCc82ESYOHw6w2V/pmWF6QDe3eqAg/9RRXBNi/QQ9HJ1cgiFbRAeWwO0UuZlB7Oexgb/fVptJTVhPZiT5ZnBIkAontqVKIPEai9amDYed7sWiu5QHdKrUhK3P2gUTMBPBNGg45+hwAgPorhM0r+y6oKexZHsl2ag1TT87XeNd1pBnn87ExZxA86uB6sgBb3ZAN1YtCzHqQco9ipnb04fO+4Nwb6YWY1uoWACqZ5xFre3GOU1ns3GgCN+J3BgwX4JR3d7dC8ZRAeDk6ApUdFO1lYGmxWSLEIqaGb+yoHTQIWukDjkIG8FZGYl6gRTseazIhhhpEOxCscjmcTDilv0YGcEzeFxTZxp4QkEElZ/K00+7DZr0DJGJi/PWM6vZZGUTfseBTNTPNiTDV4gnrvW61sgEvr8o+jaAYzqFBD/AlUZMQ8LYFhhubz2C8GJ46S/OCQWa45BfBcXusy399lx7OUZgIR+NQezvghRyY6VRg9kp1cdyItFVIBp1ASwJ0DiHu+FZ9ZsvN4/iOxrUSh5wTyeE8Oufby+2NVS7dx155M4DqBrvShFg3z7vX5LP4n+8wqvBLAvzOfj/vr61nwIznP9dnvsX4jMfnO86epZW11LyO2iB7rM6641k2CdfRy4cdy9k3+ddggfv5GEkGAjRp0U88SpUmNM9C0GIx+Ptf8Hve6/i3svP6PBDJ9vgOvsGmMA+7Yg2FrRku1ELTZWDsKLPFiFRoDgjcJMse+WjKjC8gp71JM2biMD+u27W5XHjVz47xOV5R8Ru05FiqS5FMSoPXsukDEron3uEWQhATu6TXYhWBvnR5xiDWj8iBL7Pj8GeRmgWzDyu/KAYZrMj8dcP0v7KzU25Z8Z+y2TmJLiHvz/so+EMTOR5eMv4W0MYr8gwobgZIBfmCMeSM21K0RPtFHlsxSJAmaSAwSvGt56meu8gH1TNT4DNWRZDDG6R6Jo1ZCNPzcO3EvmSCZAXigpRMe4Mf4f+x92XIlOa6kA2QcZd3//9SZvqkTJDAPjoWhrKk7T5Oysgyz7lRJZ4mFxOJwON5oze5xxPXxrC6FBmNQTLGKmMI9PDCAQSb89H/umbAA50QQsnq0Cefsru9wDEjtm7RmzB0uIDu0jsUwYq2oAR5Et2042KedcNfcnyMPy7hw+YZGPrCDWJPSukDs9QQp4FWwyrzitKsAi5BwL58JTLxr5gla/z8QQoJS7V9zWHQWRbcKEgmhTFJI9UQ8duZ2LoDe+Vp2pLBDqomQrWTRUlZ5iHdhzNeGSMi6hL55glwiQsDA+BxqGLCsIjmp3PDaG7zvnJfWxdQZ133l6zbtnrnhLb0nX/H9jEkiNpcNTdkfpRXWlNozI+P9iNeZL1/RZU8QK597cPygGjNYjZI8d6yxWTvMqjuFQUeClZGbakfj3+UQjzxciFk85rDVjJETEMi5HVfltI+h6BrdK7JgFaf3nLImlHGeHQTYrjX3qYgJp1t39FzBYkLLQ26q5BYlY6kbZqPWl9sV10egSceABKlyAKguwyMuyatmYTi/n38Ly0lASTak5gKN8ld58potbnWUEYqCFXMjgt0bM2a3KNL/Wu9RyTMG9kipnSbobrXHvaMP8vIRWwHELOF52HiNIqFBanZHSmMyfux4I4E0z7jR9xGQGba8jnsFbP1ZwbXYC3tx4HkRiK27ZfY4CjMOpKRiEgbebEPkc7tb2PABufzmQ3xDfAaRCFWAob3qHNxhJFiHXRqmNV8Z3oRSIO/ThCT2g2PN+wg87VdlEB45I699wYZjlBye1jr0wED4PA7sKuKPc9ZVk5RaRrm6eYXeKNdxfg6ChKPeJA1eQ+zAOv+vxHQWhbeHNJdr+XJ35/zkM+6WPn+TPms9fNqw7F55YftnvRZAzPjMq5MSY8zIswF7RBx8V4Hgef+9SCF+4E+CiRnnlc0PmZtGJIGNd/jXhP8ckP8NEcGHpfSvcEaTxuwziVnqMXaHxcLenldKc9tBOCvrByztQvwvBcbffPzBK/7gFf92vOIfC0xk2Si0qmJprDbczoccSVDc6HEE8az0HSUUd7j9wC0rQM/W6K0mbWGxxc0gtigdF4G/m8GGlcQb35VOLKu+fQ2uPQslGaHi4+EMEIFV9lLv3SHTDMjf3YNRK1gjq7NZ7Y/FBS4mEUCLHTabcYFBfcr4PDcH9BORI2EOPkDKM8Q56YRJFpOCDQTgJS+C9GYYNzfHngw+8767O16Wrcm8F8OZUCSbwVXaCVkwFqPC6wBcPlGtNuhiT44EXU6AgyyOAZH/Om6+Q0RLO9od+GslQJ4DtAkEbdtQm9jge8qZAsBuhpG+udl+ZDvtYwn3cDzYDyiAbYJ/3gL//w/dG64NtKT27hCBZJs90oADHn/fMiJ4F8AntnKEqu9+5rmHyJDN4PmGmeGCVnJsHkzW3W3iJVmEKCDFjbNci/6uPeZq1a2Ws8WSqU7JOqnAOvPQMdtwrtPxpbE3r9e6LCzrhJ1Bz6y96HKUuEtigV1X5s2wAwCI4e2cM5YtsBAth8GvDvZLnNYgzYZ//xjY+6k1P3zBdw61HGQtIRI7B2QcBRj3w2n2daeNmNaSD2N90tHJK5JLAD6LNd66TQYL9o6hbe4VBSZ+34uBtlwFQsI5RFyhNZTRfGLsEYFuDJb3BUzq/VMyIr42bJ6rFJD4XY5i7G8mxLuS9F1rwc0KYEiAWWMeHGPrCIqkk1CCY+zK9UiEVISzZdxh+2exEKGZLCjgnfDkZ72W1sw1Dk51bPw3VoAbFwbU0jbEOQ+rWQjDNkZ2k8Reg7FzIX3SLqkEBi4W/6YNTcaMxvW6dofFdjK5uVaSVX8Ml+SZAwDuMZvddAxQpY9w+hGLwcW12WbJF3DY9IKbY27OQxvys4vs2HjPDGqTfcv2dRGKtiWjKMVcFNxrIsDHYnyRdjaJEzWjxkbti63JAhpYYHK2M5ERYI+OLa4I5k0UExc/07wiUNPN+6nowkMkvQorosQShJa4AMGejUWI73I06HWgugCfY8QQWsAAfYWDeysZ8oJBckwAyozBtOR1t3nM5kt5Ka4zDblSUeOEjNIHB5l56etUKtAt+YYoFvG1Uuu3pckicOdfg+wg5T9EHLKFM288rjdsobvH4HGJc+bsQ35nx1VZYGHfOZPyHZJg7oClfBYIIDOGurDBOVMwAleQGHy76cPFKXlX9u2IKYeMBzvuyCPiWSneZRcj7hNrvyLA1BGDyBNgMFxF6EEPxgZP/zJKObCG2NIVuQ/HapKS+8aenHEwgtD12juSxgHfH8f5xZfo4gxPo8zZZf/F/RdzTNQ2StJ6/ygp4J37SN5HsPBdDj3+bRkSjWKMO+WXskCT63pJEI4CPG+5wYyRW1CEoDX/a4bPcNtHchj7Z7fkt3y5UQn61nxQtf5O746blLzKodD0OwqbQUgpqZ4AMCSYzJZyhkmo61k0nBkbyW2c673Qn4WL+QnvDCCCHSAncIRKCYQEmzU//96tEnDNDyS9a8UMHXcOd4dzQHQXrnIv9MyUz0Efn6zS9DcZN05VvEoij/fEhBKeEMrCLElQ7yOeWas32DbAWYxc8SxUPmm/VOAygBVA+E5y2sLMYuJ4I2VAZ9wTMeZL4g61C1vfEAjeyMJ7d0E+ajKS3WIDS/+p3Pv//zBwzsCM7tBe1wM5I4U+KGO7mLlwzGJxl5rZmr39Guuy4qiw12MPrsaIz5ljoMiqnooLGb5n7v1FbtB1lm9UPzs+MzeitCKcaApnL3tWE2MG9gEy5h5MbMlGXct2LzZ5KyIAiK4fAuMZG0YREwKPTiR95NxdGPXathsQSukPDIzB2Oq1Ih41VMHfBVGE6BiP7PkElFE8fQAAIABJREFUzRV3zNIrpj9QoJ7uxn9qFrDNAm2HvPEZP6+IgzX8KdfCGxL7+LKIZXHma29c4dNstPpKxeYykHJLGUte+q5xCnBgDJKp30IwlvEP9+p1v5Ez46obcqPysO9wvEUAiZnQAFKKs0BVAEutJCYjuoJhVY4osmpuVvs+g+7wSy6Pwi/XbufrS1umXTz9/qzP+tijY4x6drtmZjoGhrxRxA0BsJQztpTdeSl1FSADXI1z7YDGPeDYSLlaqbIt53fxEGU/oBl9OMB4Vao7Pgt1ipddcGcHtm0SOkV/wo4CJxB+UhZ0KNQmzFisGdYjRMbmtVxuuAMPSJxvR47Hc524E5Ot4PATkngE0EB5Fq+8bRXkhkfuu4psEvjnUIwtjOfdq5Nw64Br4DdwJDl3BvFkO3MgALj2LFIzcn7MEVcOFww0yYPPfADZgeWUB+ZnRazgwLWe4P/vPv7gFX/win87XvHPBSaM6ECKBZ721w69XtH6gmz3HN5gtUMwsjU6W/uEzDkAcFtVoUxWhzho7EVg8oLAsJ2gpwqwMCthFo/Ckzuyv8GPqqX4VZIFO9rLFGf3RFc7p78CBLnbsEegCveo9ocMXAAScIVEa18WZYZM7OiKEldWGMEkpQ4hc2FjIodnbnshN0O35pIZRSJAg9NZaNItcS8cFHCJhGnznPaQbmmEssto4HCYC5qdYZhV+dRqZ9fD8Qua9Zut0Y4Zsn7UgO0ENf31Fd1Ww4AVHSo/MqZ0iuAxiAWuYABLR8ZYIV8jNvBhXpricI8AJu/LhFQVmEa4gPVvdxgmyKC0WF+Ao+d09bwjiTVIhx73Ve4CCAS52Y977wCM8Jmaculoa9uqdnL/OKvct8V2YMBIZyHFYmLeH9rRGWSd4ISgJDvyiiSHAz44JggN+7B38ag+hbJuxNeeRU0WTbwTmh7eVjbItbj2LFAHC7xJLLsCPbJvOIOpdJxx11I2OfWzmzk38rp1QcMh9LU65TXR+4A/B1NiM2gHgKVaBaRUc761u5XW0AKaEF1Jsja8AtZdDtUkW85bQFCxav1gvzFARvKUycHYR5KYAdsCgcMMYh5Fe+czeX+zGUx5mC8W30O+oQBvgOsp1zMiK3DAbYa9fKNapoupM+HegWreT1PaXtt2zHwjg/YEw4FmiCuAd1XrVswe3JixfnRrJM/xEo+5LueAbdl8BjlDwjcDp7jO3FuK2CvOWX9wh5hj1owGBqcW0pXu9F1SWtqM8iUKyXGBFTC5Cda+eFPRvtstgjZZBVjme3BKNAGdSOt/+OxkQFMarZimXp/vuIupOvJ7QOBVhLZkxs27VTAXZZQ09Z9tQ4Lc4LLCRuYhmNEV0j4jvytlYPOc2N1LZviFfQFrxZBeZFL1N9QGRxWDxSndya/KInrbu+9wiFwPX5DxgeD09UrJYrStR9pDkWijp91PGZ0tm4BQJBQZzzQ6zjgTAC5hwjOgh9fouK2019G+gHFaJrEDewQoECCHcehKfCXXRwJCAGdgsoOqIPTeSwDuo7hTPiP3DBDdOPx0jbky7k7ZGOH5+8HUXvYD2SngtgEYVILFqT8xdsrh9iDXYfyeEfsXQMjTRWdqFPVsPDuxrkrk4j3W0rIAIHbH88vEVVvGJySP3B1+ddEoObGGHUWQJs6IejHf6NPuLzGZVezvuqCWMXCcj7yw7u4itmCltjZ871mXT2j8rBF30kR8nz0FdEFFa5h1PBPxYtyzQyVAgVrXGznbDNbyyAXuWSavoB3PwtQjN0L8/CVezN9nsUhQs7EgEXutlpdigTjek+TBLMQCGDKwQlcfCCAPoyUAxY7vTZ3+mzMYzqAJqNzn2vqc+ZazMQN8V5eSbYJ7XKMAtmq968EOrpmnsU44kzNtQVs0l3Ek3zw27vp+9x3yJH4UYBUjfa07VnRx6qZRWVK0bBIxLc4186bNGMLdqQiuOHIywPBiQQ5CcDHz8MrNfkBzfqonudNL/kil7ZJrygk6Z+66hyReFwLUmrUucc4dZX+Pw4Qg7Qw7/1RvYPYh9jp8WtiaybVgB44A9L5gUxlJAvB9zAgJu6aouSL8ngUEicFjX+ZftvQQ9wLtLQFBhyuwNWfGMuGb3me15W4/S3Zn5I20++5o+fCKJRqgpalI0C7BrBzcjgDNaU/EN0FBuZAkCwLE7fO+dh+rOVQ2NOLgk3TIuNiw5mGHvM8t86OUu1tyw3M/F4CqGJZA3kbF2dHt4MOhMc9p6apYemY8vzNvin2Rc3AQM5i8C2/EPuK6PAmhUt3JCodMEn0pPWQw5TXxPkkpc4aF4/2MnL1yEKBi/GHozp/vcASBp7oOKmZ/V955+QdyTmBFYEKcLIkzvU5aJSPJpePcqCUbiVL58K2obqC4X+vwlXImqLE22A171TrRLPAHDrddwr/GMziKUSyiM1sDIrZz2ud8jvRJITnvryqmJYbjbhgL5auSWFBAOIBPWdFd5LAdXZDODr8sFuf8PeItgzFU+CqDFRliDZLJX7Aqhuf4irmtZrmLb+zA3LLbeZgWdiYiWCkBFvbrBqA581o4KxTCAn3fyxxlwLmiueeRseqBbdXUknOZxb9b/zeuFd228bt5zHpZkMZnkYRYjTiU992iqDxX7EHM4xu+1/EHr/iDVwD/TrziHwtMbONqI5JJjsrReu7AOqp1AIHmYg45tamrxcvYRZPyJyao1n09FnINB/R1FLZmJOs9gH5HQioRHBNEHch+PepVhvyYxmuEbdaZPGeAY7GBNY15JMrJhGQbcLQ1HslZVkXTWLsobGXQkw8ZWPLZiZEYXKKOGcHktQX3iCG2WbmXebTpOl7ZDZJrwS2kQOiMZ7JwRndPZGIztmIG0PyuVhHtQAiGlDVT59BnAkJnB9pd1yAAPsd4OMyxn4ttK++7q2CJVvJ257O21rMU/MDMeTSpKeZWA6aBCVeaI90sbmy5cc7o8sNI1np4uLHvcQxTyGAonzMXsgiX67JmG40MiHKwN/+erN0MXTVmHZEl18ZCNeG43mMbR+HmAB1yX68sbkXEXfOSSuf12AOZ60e3IY0hihGjGcyEsfOQxqxwM7zZgBUTVkRQI9olmWMdAEkk4gz8skCNYvN4GEUa9Gfh85RJodwiHfyYZByaGdR6QCRBhwAi4pqvpa3/i06SsrA+D7i1ZZvytR4MyU4oqtW0WN+Od8xVkujcggPXqVMbe26a1nlRwiWLb8k8ISPSwQIlE8qezfXhA5/GzqtaC/6qPTpcsLO1t9jHPcD4uxziMc8EIwZ6b6gIzAey9Md5LSfYmaBNptWKpQxPpFhcQEo8ef0fMLLAJ5PJAU693eOZovcV1/fTHo396p/BYjIZTZGMuhQTLgP++A/uEJmgO+Ush5GgW3wmxW/Q1+qpzxt+wyySE3awXhEIuSf4gDpny++N9aUzZU1inzgAn5Q49QlE920GjoBX58uWIGu6U8oUgPp+tCCfgRODxL7BPrVkYXo+huPOIqylBJKU5MvAwAJnNJjs2kNXibwrQZ+yLWnjMjawAPCiyOIf3G/rk8FWgiA6AF/HrAUEUPgq9tY41sLYAe4kwvFNjrHDzgvvWRGH5AClpeOtUcNXNV7gMH8V+LMDBxdTvGcXaSzW3PRInOVgkVX8F7r8ICOT9Rsy6afg4fcor3aCFIwHal7ktrJ/BOQQCTOfAZdgxzW9DpP5TeY/QcRzvXaBiwkT/cCK4lHHld1hMwBIzFKBTxZkxAF503dvhU/Dhh2+RDgfZSj2drTUU4dO6V9e9pxtOHYMto/XTe9EnbJfBMBfca8nBu647p+6CWQLkLNZFYIdZIqFUYSguCEYJrWlR8xCcGfUggA3c/6iuEDxCp8bz10XrujQ2TbIiHTAfURc73jPkBlaCxcGMt/O+3/OEPoOx8CAiZaigeZsMmM8RKCu/VMWAhYGWb9fDotnpj4IOLvHHo09lvGBaDFlAXbEnfGQCYCUhjQvfzYCxNhjdZINfcY27lAz3BpgEwyS8t6gb6XAeMYYAZz1B0DwcYBHTejJ+wAJFmj60y0R4wUQKLS7+X0bK3IbPYrj8e85t6PAb8V7RBJtVh1gC4bxN1rzKzT7JyZWyJW1zTAU4cm0YqhVjFQ/JJtjcLd7Dbbn6xOIDtsU58/9PBgHOgAVWHQ+eZAXec8S6DHOeRpocq1J+Jx8RtzDYw2gcmH0szhmNrGYB/w8/P93OERI0st7XTKsumqPMHqNZxSERt8JnICWeycpNvyTO0awpk17XZqtAoDTn5i9sYUFPKmut84NtsyagbFHngfBXn5XyuAD+QS2SMzscIgOWAC8rqd8XdyDJRW2JDjklTvxCvPwnD+Eu/z5ED0k8rgO2MMUXbg4u/nOPdyxTheDmghyj12dCFcq5IlgB8Ce1zF9dGFBOSODD0f7W8rHWJFDckaU6sDW/0YW9lryMa5ZpO2HMpBxt7J11ynlkaz8rNwh11Q/f1HO6xDfLDjZ4Oxjd2zrbrkQyIFjxowNYONFtQg+OH7mN0usxDljsbGJsE9GcBlAyLZRnNGP9yFi5ZP0zRl/QX6gNjG29mwX+iqv2ZSUSmsyQrm/kMOseCpLsML/e22r9S05JyaAXYAFHwkCN+WQaV134lsOqH3Ennuu+YrSj1zr/eW5TWsZsAHBPjq8gB6LsLdB1aEji0YsPOeeaDnkib1RhaAEqzO/GsZOxq1o+2dh10QLPHcFdLOrpezb6K4iE8VcX/yy9Ay6GzdS/6Vwpt2EpDUnYNmZFkX57cDomaUunB/9WsCcs0B27uNR87okdC2H/oUV+JYKsPZ/4r7nea7KE0hqi6UW5KpZ9/D7HH/wij94xb8dr/h/6MNVbP8y4DnYOfzdaiZ/FWJQhnegcAaQhcqHnsEeF1cGE7mpFLIiYVTFbd0yCKDkVQAGyaU/HgZcj2s2AZY+GZOKlpzgf8drM/HwXLBRADqAgAJus2tKpH5/smsrrfJTqoO/uLKyD8HrMXg25PjgD+ZVtYtC4JFI7UBfxnpVMWA6pRBOts+oFmUmZzm0dQeLY+qAh4Oe3g4j1FUwwA6mvAdlxOLzWcleR6KWbf5RIIyFyMXoMGsmZc7gykPmwvYXbBtyZMMDmpeWaKsgzLOAEOvuSIJEBC8flbB+l8OETF/NPZAV8oe29dltw+OCHn933GK1TrNIWGvyS1FjxCwqQwQkYz4KS3EG9ZNkEcPzLwzMshWcbMhVQQ6AHqzqLEymFImHY+EQW+pML3yiBfKbrZPgxixHwXtRVx1FX0Uk6DiMuiaTj1eS18pTDMN5gin1d+3uShhM7Dl3rHTSvZKFe+ZujRQrnsMjIY+9cA+DZGHOJ52IC2Z0Dgp+TdJFJOQthc7UA8CTftZSN+gYWC/JZvDDMR+yF2CR3MQwxoVlC4bFYBNecpeFATnlnxpSalD4OeXq9x8eQcLGDQlwBkgneoJLIftRc6UorUjGl6BZycG4wQbkZ7xWet0iA2LgSiCn5Ew7EdLth+/s/e6QSIr14W/IDkH7kHgtwP1XUhrIQatWPkLda62cbt8AiKbs6ag9DDAID+5FBTinv3w+Za2E3kUgCao59Z4514EeXv2QLOUXwmRVt4QFYAJBSUJcVnWBkI3soBpx7jmjYzn1i3mPEcnYxs/YHx/lB/s+JiHfYsZbJo0aCZ/h8Nc6MEt6PG1Az0rAMBg+sW1HUEybRTbUswCbtgqycDEafD6fMH/T8b3AcH9BHBjKNWW5toRJrAjnwuSeyLgqZZgAwPQngVERIIFy2w/fj5DPUNAeX4YYls4nuGlkv+jN85AD8El5ODv8Kvc2N8gIkGe4YkXNyQRlC4ZxPuYawZKuQkmD8kDaPx4D3Au05RGXZdAfqWAOQs2VaK5Q3LHmAnAJuz2jCJUyJorPYkFDUZLJVnakAQVgQVIWJHzVz+M2f2xUkvJKbEABRIw/IBgp63XEIjPi3R8C3EkmKumIBuxMs9M/dl6Q0dJmpWxgPLnyT/CZuBAgnBtTcZszoia7f2NJJ6QEZF+R8DhcVnSABSgq9AvfaEcBQMy7WhALhnXM+SCt5v8O2nOUeiT48ma8jWZ6m1gNaD5nFXShCRj7AIIlYpfdsYwFE3TprmKWS4jOROGK639DKjLI7CnvdL7vjLcc02YB5YBhxevPOSvJht5q9XEV6yhB+1pDw2EwTA1Grztgh5RdsoJlY1b3fhKrAqw/YkKC0imcufGWjKeBW7MjfdQ55TsvCD5idlKpGcdzoY92vGrt81wv17abw9D9mXzPHbYWEnUhyXk7USD2CUEWpoERP7t/8Byji15EWGBxYO/9BS7KbzzmKQX7/fIGhTmLOZ3nD/4jlKb6TgcBIyvyXRbO3XajZkD9XR6ASuQOfmHrJ4DognSLuJ0xQ86+AjqvAgyqBrOFHXmSnX5cFTMl7U2LVJc8T8ZtAYSpIFnpFn7BMKEBvLkxXueFrQD1Ou+lZKwH2KaBUVwwCXKac3D8GePxClAx0JVERc+8haQHR+Zc/a7Mo64gtW5vcgjzIN6HFX7aYOWvXB1zPc9DHJi7n9Oa6VGOZwyDqkB3godZsBAY7jJ8fM55qh6YQF/7BAF8ut4DDkvChnqGm5VbLrS1o52NdRPf3zL12e2XRqy7GQsY91atabkv/PJsfufBwjfBRT/ykkZe0r+zi71UlPPdTrnd3n6Ra0fsJYg1ojnrinnxtTfuLA6OlrRH+aoAZhExRkdXvM8qxAfzW7V68zrXR9p3x849iVd9rtc+3NV9n5jgV6nI7hJMwnrsp8hx1FlMMkHN0xRxjJHELZK53NgpkvGjxuxJlwt7b5gDV97jzQzLxbDqBhtGqSX1OabMLH0JnT99MddwFpCuTclDIPahO0Re8PBHWoNDUNcMaUw0yTD8/Zv7TzZzNY91Y6SaYOReEjCfBWADjk1flfGLrsIU77FgsYezK/FMpljsPOJhAfZoudDvcvzBK/7gFf92vOJ/KDDFELxsPa5fOx5qb9Lti6yu6hP4RScUABeOBEtE3GG52HMhCzAObecrDcNcCP28Tpwg1XrJIZW86XlTCXonUJEtvmAJri6A/6TOqMiARMv6FIGlBqXR6JeeOcBgNlgY2RUlGxj6roQnc//UDt/e8iRQVPUesoK5iorgZDcwoTBcg84vZ9isacdQX9QA51mAM2iAHNjDsDcTjpFAMpJ5Evdg9wBFCCIoyw6WWddSaYq1xB18YpasTJgeWbhjsS5VILq1hhvGAGxt3MH6872h8h8AnBPDF/ZaAVIiRgpIV5e6r0THf9b5n+DFdzocrJTvI1EpZkclOW2kkgF27vCtXE/uWaylS8h4ahzFJhztxS4KGRpjtfq+sDOwCzAyuogcIdlzGLuuYiwNy4F0QGn3itfsLcUdDmlX4jOAkpDzMGBbvIy4opOosQLI0tGSL75hKeURkiqqsxMr7WkCM6QfyWxJluDC9CwuSQFct3k8g3kAXOE0QEiEhx1M3BfSvY5HspCOb0J8xpaO69sO1zsAtQFPg5q2UDWCC8e1//uxenh/nmvHD2a7ADATvJE0g7sdTsw1cUzY4hmvAerrFqMDmBqSRBI2NkCvowQJ+RtG7+88toJyizEHJmLoKKp1sc2D/ZhA004WngUiV/49uxukWMXqXrbZcgAzNrYs7h0DngxtgGzLnBsBdCAZcLTO1gX3GwjW9Y4Wgw2HBKNWI1Di2aUPJXuHH2F1/g/CBybnqgiZarVfwT2dshecE8i1kEWFM5HUkJGV9B9Ge2+6MMbA9o2UpoIqxntiALhHaPo6YDm49ZD2muk7vckMYylGSqambx5eQNFwr0TnHrxnrs6gVSTkZ2hbEkDXYwXzFy2B4R7YTsYrLvDQMpY9Aqi7i8UELMwxYb7gbhgz5dcIm67hzbpMQMP6ZjKAa3sq/MRfuoB/5+EhR1bXnHNHcm15dBEf8DLB51HdRtONsmlOJimzkXHY0qPwL9ktb6EOxKC6ui4iCt5+aM/Hz8m0RSRl2dVpagQl5Ch6DG3w3Db2iBhGjxgtEinKNXRCxvPIqwXuZMIK2mdBKsY7524WiSli1QI8LOysS9mVKqDpX8UoM1lYlsBvsnNHxAJx3TPWbwDtF15NNLJRsdE90u4t6HzDgu2aksgZgw1JX8gCXQ7Zfc8YoHw7LLptJwQrYpcByrVeu9f/7YpbJZQM2DmsM+wIGL8aQFmk0EOnhCECaDeY/eTnVxKwkV0rt7f+u41DurBztm9xvDGwp0FzLlDErSSKRAyOzmMQkhns8LpjLVAK5kyub6UkN69ZK/nrQb+oPbbljXukrccxMNzCvg9YSVaH/RoEZCkxyZlH/K6IG2WEXUd8LwtoO7qCTBeVMTIfLNZ0+BMn07oYndJ2BXBsLCje9Tw1ZpolRj2ObkqCE+lXtHCWHXGfENmkixACADT7nTu1hJ9VYSl9iHpnTqar5miW9RYC2LyWxcKoADNYdxuzYwjxgwzIbvLp4/hO47XhJCwumKcE24KNtBtkd8vYEPCZvtfmfDYheNdrgeDNhsH8QhG9nAOyq4sUCskZRvLfkUMKbvvAdzpqfH10kJjmjK72qeoxa/jEMCJ6BwCMjZndFCqcIeQJggLAKBlPOfbeVgOUHaTL0jfQLr427zEGoHt3gUjSNk54xNsEErN7NtnU7yrqcI7DMS/DgSEOK6nW7oASn5kRUA7SCeyK7gLtVJTsaFcGzQ68xYEhHXeJYPngbEAxvKIIOYQFnKG0CVx/owswgyOcVRUeOYaZ4B35yoRWHDoC/CuVmDi318pzOGX+SGq9J1nefGwzupiBK7sEpeP+zMe2ACPOX9xoQ0DfmvlByYUZMI6OSv7ruHPWIjZeYSNT0heuxITGgJjDUu5MCIiqCxAFccUBBKetcNTz+w6HBi3c6j40eLnFH69MHCifI++Ws9Ae/nrXLDOpOcUuhywVOh6vHGo3MaBixCrCMP5vTqiGTTf4EJjxOeeoDB65PiKWEccI+zer63SnAiWAyS4TMCZ2EN+oojtWxabZGr6Es93qmpQYhXt2e7SvkZA8EwBTLmQxcuhu/yYbMpk1pkQzx5seM+ELhM9iUcTLEa8SGxxwjWJx5bNemN7AKKUjCyD6PRauxRjTx+QMamdXIgC8JNUJHCvnRalWp6L7wkiJSQA2ots25vd87qtmsgo+sZySra94TtsXbmWOvU1JtkYTPFRQeW3O2gMAi3xFPYtq3+f4g1f8wSv+7XjFPyKEG7sAyTzypuRiALQYcxWseMsoeE5wErTEnm/Kg0Xit6MTwsqJ6EPi6xwq684NcWeC4SjQORcgdSd5MNmMzZbyciKQYEksODyM5Neh9ay2ouebVJs5K+RmBpcRHUz5ZEBmTbWeE0Kg4exkMDV8XVisozFhAMjA43BccTVTFIiNqbJbRuR8PvEf+3Epq+7FjJbFkjCUUednPiqhSzaDSbTF6YCI1j2ouVGRHDmcxajYTBl4O5rNxMeQ8hV5goa/EhQaCnXHLnkHAdyQmriA4IrWJhNgLWp7auns6mEk08lQz/ZbHZJJfF8L44NmatF48eUesmk7umzMDAPdQq0AOjBr/XyPwhO5PhHoJ5P1i01g8qPFkmBrawYudiRC8WwsEnReAdrZ5zB3NEF9e0ljdjja+ztfxkHp6XYUM4tBx/dkEONUEQ7nkY7rDLSOwM6zkMO/iYCA49BinptFIhprkQU63tepgvvL8L8MtvmehWpJ9pZ6qOs7Y/B4lmQbWQBwx3sSmNFTyub4LLQcIi9J4s5nYa8HWc+6swwIWEDKYjuqCL1ggbMwYSB7dkJrttd+vJafeCbc3+iQVcCx+Uaepofmb66p8xkZdvkikQuw8eUZ9lBkM3ZusTCZkiiBj4qW72mwLr7jEJ0+5VWB55pRT7bOcUkWwG4kqZ0w517gDj+TVL7x6F6ra/WSj8wrJNM9ITzAZ8wHzMAJUuw3Ap3ZebDIxD8Pa26bmcEm15DF/lCggDL/8lYA2FOaXAD6Wr44Cw8A0J+VRWb1GCxshlcAGkxeYy1EpLMDxAAYqGcClIxeSQaRxJShtJcRDg+0DjSLKRs5H9XXhsiFqZT4EnjMJewYZokn/vmQWilQ2aQJN9/gSHlNk07mAUAS8QeAg705GMnDzYqENBzgMOxgaqYtOr4nl1ENUpcO0oEuJuX8lJRPyWI74vNyHFOyyAm+9qnSunNOSimcumIEo6xjZcVA+GBxWOrPZ+KtTXJKMJ/nd8x4wrnPmo3Jc27JEgkpYiCAOJvP/V+YiMO2QpXxsroe65Df5K7I8Q3ZnQu0zVj6Irh4fIEHq0AkAI667/G+A/BUG/DovJKQquNcqYxlkhjRya27t/2AYsZmvF+7SDavBG9cao3t2BPTpfyWYMXn9jPNmJKAZ6oDoGYOuKOkpb/LobJCJSDtNq96Tccs9p6ieqIPFrzF82mVg84xpk3kDAuzVbam4xUt/X2rcI6+bHsm+1qfm/FkftUOQENGyCwjNpxksfcZE4xYl1LS3SFlU3sh9k2w3/mtBPAo312JCtfcZqzTsW+fcxa6mljGXSYQFk1nr8G9N2RqgVpbNrK7+zxqppu0akYxNgV5A+Mexj1CF75xFJLv6ijPS+q5Cnmdta+A2BMJFDEqZjwc+wsCDaktV/a2Mf8LxqyQeb+xsSeLEO6OsbLYn/kRf97avrEAhkNdLIFvi6KCiWNd/8G3O8TA4djAmXGc0o7HU+NbRICyi1KyOPm3UyEC6Py62N2x3hBfmb4J0yKek+N72sZl1ZN4R+e97nxf5ekqBcYy30673l2kKalOEm7iDN0NKRG1w9mNIGAxy8FY6NVYH3DkHuxaGiw0uOPWhbcZuzCCGJGkVV7S4TsyXzKD6GR3UuAMLEZJA4ylYBPSfoIjSOy43dVwh9SR+oTbrGcjIris50ZfENhmAODHszbZ9d95vjV7zPprp3VunbPI9+ga3K5nAAAgAElEQVQ8am+vbqyJ7FDaZQe9yNcCJL4jgmqLQu5x5ul8D77VkblB2wb+/sSY2of1PuHknrCpDlonyeukms0bXEfcLxsWHT5k1VMWrEivX+yvifWe9lfEKX2YoIm6EjKpufPk6UN5TdwLI2JVFnYao1HtC671VvtXMBKHynme6LzuzCfbZwkenfGVF7KYJxLFPAGAmzHuGFC3XouiEetuZGHtsrbfJ/ZbJJ/RxcIs+g10UTqx1wSx+b8bbw2wHjNyAa/z/8SuDkyRJj9lB8YQzprMLrCU7tz4ATjYqRYFkMsvTHA+9IpY8+c0uF0wsFB5C23iyg5eAUdpCCBQDJCUq9Flz59/4Nsdf/CKP3jFvxiv+B87mMQ7URvplB2VUJijDKPJ4MhF2ta440ANgcoA/JDRUGgMjwu9bgfocPM97/o513/qUfM7eyDZeaQBJsieoEQEGO7F+LfxRrK8spDk4wRiJ7WrwS/lZvjgfCKdgCtS7s9T2sEXh2zGtUtoBLauqeCeAZ5jVLvjBPCKAkJWqTmINfUcHWsGQOETcItKPqvRnzM2mQAfpZ/yOgoV2VWBKh4ILtwagIZP6HoWIJYrLPrVx+6WYU12si3c2Uavu1gCCW6PvXGnnJ+v+uCRzESZvcGzkKFSrflTXtHKyLlUq4AmYMqEm7GwAEDcanZXM45XJ+ff5FgRBOSA1xxW/ZZTvuJRhwcAvGWxiq4pI5K6wqERLgPD2jwL6NST0RbcEQARuNWXHXs535ss1NO5uSILGOqK1pamrNCJd6hqBR9f6rb8fm9QsuY91d4P5oCzWy+LsVulvgvuSP5oFthENjy0eDPxyvtN6aUu2k2ZHOQeBbTPYsYzIPZxwbdBVMnIyTv1t2tJsY/B5QLBkBVlNxaDLBLWK2yA6w5N67jukp7MhHYCwRJKODLvDgHKSBiNJXyV51oxSefDAqy6w5ySF0AXlwj+xfe4w1IXyV/QKLrtDIbBIC4L799tX8Fz+PGo5JXMy27THjUHjJEVnXSXuwNK4L7JWyFeLdEMmnIgduj+as7NIys/wfgK2sRQDvnwE9Vt6IA/BtbnufTPtwYgJZRLcaBnoYCgrohgQeAWjJsYijl9ksQAIeNZrb43zoAyUsFeh3NNVix27F8vHd5s5NdHAKk6Yf5uffAdnl5O2adRgW7JSRzJ1ZXBgzvuYqNHUG0KwUf4rgVZDbwCJFBMV4ixEyRnFLwjYpJlKNkYX32Hhf5abdWzegKIeXahOQ3HkFUdw29JBqLg5bR9Q1BdGLwcxz0d106iTcc5NSQXA79U/3/r0Z1EADrKFi0plyEHYhxHDbQWiWHLJIPs6HTZw4rwOQy4RWPNEKiQmjcINjmcMshAFZzInGtd/Uw8KOPRvrAKFIVXtTQzlHvJrQNXFYXhRVvuq7qxJCwEE90EFuWQZ0GdF3CAIwnOxJ1ZQaYSEXxYz39g71fYmlg7d7CdAQKCGnKCkAOAdNT6a0JSXE4Bn7Txq+JVr3tVgNoyuN6oupxISIElutOdzSnD+9bdf/fqIWjClqI0xYE3rvx5pw9K+R0vkIjJHl+27r9qDuO0HxD7X3FPeX5LAtSB87nGZ2QB0e3C17zydx9iAteWRzylZ7NYIkeR8oGT13OLkkKCZVFs3VXkVCxhAeCSWmCUgcQzYe586vgOeWE47XYBCqYNTsnVuv3FKGWhIj/TcuYZeZSgbFuuq1lFkxygDpA8BQFusDuPMQrfvpXSbyLPCDmBTMGAFtDVoHXOySU4AmAoRhSlybQduAOIXn+TUIqj2KcJUr6MexMA870CC/ted2eXAc59tYPhr8MhO1ndimuzKKI5F0gWFHytGME6svZDrhRAAtVDLsqZo2faODa72AeBgJ/i0BFyiJLl7eww0GPWLdeGuMECnBmmSApZst+3O/OR73QkeS/jvQSKIy4AIraJogSU3ZAbLMoSmvFjv2kAo8oYDWnHE9gsx1Oy7cOBFTHgZUmkXTU7bOxZr5VDTqvXDVVB+FlpF9AALRGjR7zoDiwkQNsAdB4ZaWTRx4IhbUcOx9XP8/1hnfe5Oz5HAJsDgM+QaQWmxEh1S7mh/r6snRjCt7vSr+qiVKs7tnp3nMY5z2NnP9coIrdzCP6K56CVx0mAgtMbNBwGKkWgwT9+TkQo3rLmVxTBXQ7fDu34xwR7U9o+JdQnnM0rqtjxmYaW+AespNkAQFRxmx1FG0MTS+mXf2Gt/+Yj91LJoYZUZ9bIaJ+A7Aa6o8OHNiSATlv0F7GyeZ8HTBZ2gM4Li7EYvwxjk0SjohhuTcSOPcjzSmljqogAnbdprXoy89NuV6FStPaJyo3tE2OMKDjSm5R0MnrOiVdiOCseZZ8gY6OtGcXGBoj//4j79TNmEfFEMwY67qUoBE8SEKCUYF2ATWZeZoaFiZpllUVPAV5IubozLqWv/dRddowFZsfAKPkufkYUATW7V7SI35ffkB1jEIQzqkwzTiCe1YSTuC4VSroK5Qw1OqumfpIIZTcs7v/GC0M4W3FlHnFPtDZWd9S0Ok9jUw5FEn5rlhD8b3Go33r8wSv+4BX/crziHwtM6QSveGJZoDkN3wVByhzkfbYx6leQZxoAAIpmdZhwCBUA6OxuptIMh2JrMGBSx94BMcUYA298PhgfuUlWOqGjsps/rjOhCyCXzNHY7j460RJrpkb0BapvnPzbnkvULXodIGm9NoMSGlmtYAa57/yFWxBtc32fcy6KaQ9dM6fpNTFqOyNYU3Hjd3QqXd5JFCD4jG4t29mCTzkyntjCHunkosPLHR4dFgYDQqKuZf0Q3RT599AHz5szvaqq74NllFVP00MDdE7KtKUxzGvXH7j3BmTjilbire/YtAc4owN7H4WlfAL6ZLb87mNagHOZfBsHMw8omZTuYJdcFmjCGLmgCxFerfv8L4dYA2nZ6QOgIkQZWsoKQwj6kNkQjOKjW87dQxf2yLXEkA7d1DCqvZ2B9QzGZbIFxNu8nIwaOpZV8r3uWSg6URSDBOs723XV2dmYfYHrfmOMUd//CNgOm6OINXrMbHI47tGMKrI6LBIYgEmNYjGqRY6NrBKxb6SI0XSv2UgeQOWWjYJMxGq/ZwFWZbK91XnP6ln7BCC4xQB58bpkNTCamv3Rap8YhlV9qh1EahaTBaWAes9f0HCWsdfStqeTHvbGHs0UbhkLjWDBmER/oyP9AIFRAJqSL0ewsHfJfyYIkPYWILyw5TkDQ2FAdLyyW/dFrEwyId9QNzI9JmCm2IGZMdFuH2jS5IcCkgv0joT2KJzy7Slr2KE1RIqxM4UpArW+UyYsWtWFYTlSSslRTFiOY5FKnssnabSUH4lc+hMBu38JdhglXU/AWgRXdDa402dRxPQiiQOhH+4WkM4zBFFQ5qmfZK4x+iqDYmYrsr1g45PkDEt5DsMqKYBZwWbJlY13ET7UFSOHbdcgT8FMnePDnmSXqXoTWsy1xpGu0KSe2CyoKNm+KdGQAad6swrFJ2aA9IMvYqchvs/hReCJG3kA1SWfdCTv9T7NZI+M3pyFoSBB4Jzv4YIokLMkZKmNfUe8lLGU6gGA68Gg3RhfQBmXJgnhOP3M5Kt4JaErDj7fBlkdgnfsAUrE0W8w7lLvAD17kU5ALq8mO8K7QDd5V8SgMVx2zXeB3zyRkHsbCR7eSK30OQANeZ53yiSLQ+SCexIz8lHF/t1AStwt/Vnxdj+zEUVCYA2FB+vTJtfsWPpgB6+6pmT6jpY0GkyIAPRQeiGjkIxflKzMTPk0l8g1jq4w4Z51d+y5oFEUmbJiILfXPnYXWJa1pNdVJz5WTNrvcxjll7TtGhBxfnSlWCZx/mSwJsDlsF/0z3M9MkbTYmJWjhS2FwAuFex9F1scyEJJJK+eRCKpIHB4S08Os+oyy0KUq9V3beFrYseFT3F2Y2TuA1ScT28wa4+rs6uIeHrblzNObDA2UT0tEg3tUkt8pt/0ur9cc+mrEiC/0EBLA81ksiZzGEg/lfLVuxCQYtoDyMEP/FOWXqNbywIZCS+4QrJkoGcvzdjrMkbMyXJsCaAuwG5+54bm/FwILxWjSGxrKhBz21Zc56tIRoatn7iOWTgEJ2eBXgrHthwcnnb7E+uboXY3FiU9D9svQMnQAFFgDQn7PvvVBEeg1mizh7tbAQBy4PhCDq6/AdMCqhrsimKeTZ4XQLJCbds4TzVIEr0ElHwV+h7+jsbdsztCUDlPAWbxO1Oe65mHn3OBTFpisnyWeuWZugVvTbnFiFHRUkdyFJLEpdYoDBF3bUic5+0bVCo1aDK5tbv9zFcRHvJeLBhSi3/sKBaJYI+egdYxs7LwURgfCXdnJ+XACOm88Ccxj4USU2f8Gdfv7LgludChwthaxDCGYI0G1XbkEKRYRB7vWmojl9EmM84AicmYaHngXqdlydyQAPl3OKqL85CwAwAdIbsIh9VzlyOG6o7QJCA72n+JTKhT1tCEc/SA7rT0AxtKn8NupCReNhAO+TuMRwNfpMVqBSX6E/ddcY8782PDJtDrX9dkziOkrBwxrCYViA9kh1auzXugOqjUjd27QBQfmdfXLHe8Kp6RKKUwzsxnsGvOIuQCRdQ2ye8CvjdiyGGzSAoSSko2BKoXbG8giuNUEYjOJZ+1ZukLLeLhqwr0ea9gs5ROMrc+Y20/MIjshhJcha0MA7wIwIsFYxkYOT5D7of6QBboqxsr9mwVBcx4L8O+zm1YYLdVQEtEWPx74YB/8Io/eMW/Ha/4xwLTR2kqpnE/dN7zRkQlk44lb44j79Rtu+b2pASerBckNSAh0HPGEcDOgUxoAlQQBzyq5BsvApxRPPHSRh1kVbjUUGJ/FBeSTSBo3oqw9dK9NsqGFDvT5BOiGZjlg8xrBEQNd8wnKQPs45iBtGoxP1qKM8myUYm64YW1Ue3kACD+nwCdef2Z7EiB8gbcbArl02yd2SRJ7MP5pl5itm6fnQ5zbci4APT8HEAw/ANwMhdahxdVgc7KXTLt3Ayf9405J2xM3AFUb3gpeW1Jx6AYpTOw8K6lE/MP1oXh7JzjoNLsd6HeqAQL1N1DHzqLfGms7B83wO84RrJ9IiA3AeAOVYIzyV7N2VaV2GTBx1m0mxE8jMOAeCQkFbPjANMc1elitiIBPgADNKNn+DNoADKmTi191DwjyE8CEqIEwpzJiIRDr3ZZ5zNzo6xAsmtyblGyrxmM+tGyG4GnzR4gKYY1chAt26gvaRYLO50S1ByAvI9WVnrsqo/IG7rDNOe9xBvqOW+k5fbyTW4f1ZFImRM/7I1g7avacRVWAEyyhNhopvE+xSr5zQgSqZ8TQdbETPAgZRL3ws+wvaosY2fRPhPOFfaKwzU9Asqwaz6rsAd/Y9oOICGLnophrwruxuG8+Z6JS/7vw8h/x0HFlx8kIIgUO3RIs65vdME+d4hbJ+KDKXrZ0Dri/sFevB8jlObN4QZ4tN8rVs1l2IPdt2VnRSC2W7owi67A8X0K2Vq2i89Sy4+NrdDUJI5i7Q2poa45j4XH4lfYXcG16UXZAAfgqXD9LpbQzKgBQGqpL2R3h5TevYjg2hKzNSraxXLDTt8U65L7eFVi9o7ZNk4DyOvy5z0nqNKs6hH01S0dcAIGzcEXuRbFyN5yxz1WSapllCT2F4q1LDdSSgWednM8GeyhGw4FVAWf9xuOjTEGJgRzs839o7p4f9QAT/cNHT+x90YxnoEH+LUkbRQPssq+j0SexzRPzYSyGNMNimsE53LEAVtmdTiZel1zMcDsCMZVgezuDvlhbDsCWwUQg48f3fCZRHSSU2soJXbAJDsLFGW/gzgkAojtB5D8uH73nteQvxTBW1aRecxDJtoBk1mgSs0w0gvYVwApgOqARly2AUy7+rtlYaUsQoB0DJMZR5oBwwiwJAHkgmHjk17NZ5On8poEBaqLT6j/CPuRgIcchCarClXtLTXkjKdk5573R13wWoCIwkzxObLTPxj1m1InEEBUqxioQRaCWifJAtidtoxzEa9bgJBKMfFYVwXT4/KJVBcQm63VfsijTD/nGP7+o0zMzqJC+qxOEtV3LFeprp/tzdQXuwsET5to+q75MEMMd3YWnfI7lnHZzWexW6VCXOkXPBjKvniz4/ks69li7BZ7x6ci9ogDfs7SyE1I+6d7IJX4RMYDVHd3fEozt89ZEBV2oMHb4R07wv6L/+gC/AA84s/TKLlIVjTnniwxvFbGngrYVfEUAJi9+wNkwYrwlHkgC0wQ4NoOK/KX5Vuq6COu+Cs7LbKDDLuKbPdYtShMWkbljj003QlgquKqhMagwUTd0tJ8mfuoGz6OLsKW8bT6ndoPwA0f9xvJCq0uf3UgwPk7SUrHofbCFHyrY1iAqggfnJevBkSMcesb6uxIkEOdoDucBC65noKZj5T8QiitBFZAfJ10NGkf1XKKWYA9QDuvuiOAxBYMGiQC3v/EWnKPE0xnsULLj+oR95WPPTCA9HefsuBReDy7bZMLv9zLb201vDY7jj8183ohcC3C+DXjJXljJ1MwcQZBnYuii2kWSiRwDdk6AHoy01sdY1RhYR057avONYH7YQKPZzjTSshCFgDvnDORJyYCN2VxHwHEZSvOWZQ0zrbRC7h1F4gtwnlaORfaZFJuPe488jPPIeWZ95bs0o0sHPKsPr48y1633+FwC3wJLbnLfEAb+6l76I/VlXG9qdVYinxPxiQ6GNdg5fxhLqEEeAHAU8nIgXyaxOj4MztUurBRh3GFqyHmSqNl7URrlAMCtGaWc0VR2mp/aMTzcbEIaB/IYqtbdbmvxHDESgnGgZKw9Jyl452H+r45m16kQH53YO9Q71Feq5lhvVs265VxLT1wnN8bdxiYl39wO/omPgbg8ouFzsIciHd+hqQKpbtCEjme1OWj8GA1heOTnzEQNtV7fIELXiu6PpBxi+GnI8aHKHbGZvrq85efxHMG54zS7/8ABJhjAiufHyC6o/hikMRWM2+yiSGc0TaQsfupDvQ9jj94xR+84t+OV/zzDKbQOLXoWjGx0vJLWzaRSYQcCf2AJ9B/7GqNiF90w40Sb5CFtx+BSbwnWZDmFg+2L9SliwY5K6aMiITWbrYgQ37dfMH8E2ELXrbxVgFI9ACnAU92XrU1j74BUOTga0tnawyVcgHUS9FDmZHsOaGBIGvh5mIXoNq59wAkNO8daPZYPCNoCyY2Lanujw2rhHCiZ2NltXdiwJ1B7B5WxagME9wHNAIrWOub05lYsWSBkM8CIO4l/3IeclSxu9qrgLwimLgbvRBqh+vYNJLx6nlIwPE8W8t4CKoavor9uzG+GX3VhgQT1B7BZLbxJnPFWZYP9pT0RneyVzLJqSBLvIZuqrc8T75t2LOw9zdnxjZWkO1jcsxgQoCDmrraimQppLnhmgjUzlEsslQekmAV0IkcWs2SeqKo6/Ng1QCAh4PyR9TNwGLE/YFzEKaMHgCaHVqj1jwqGVq+kAHz9AkdqwBAgnodvPK9ee8biMuOxA3F3B3gJYtLqrV1FPvoc3Avz9XSmjDBmlbvrSsMppZhQQKc2DEXybdhj2BSzQsS3ZXprNXucuiyrJM85F5y7JiDJwp4JHc1+F48QC8AfpUNSccq+kZX6L7HwfbnVZIWkswRHKxqZXGN6zFZXkdi53fYfBTrPaUWVBUqlHKFxbDeKFQmWPt31WwyQRGJhnZCnt8JLy1sEStCRgYTxfQ+QFuuBWtQD21vi/2l+e/O2JCgVjFQo+hpqIDWvakXQJhj7+DcIEGk6EAnNjSXcuyPMcaDjFBrHUHU8B1M3ZBqDdRxquLelPxkgT2TNX7dtIWllM3Y4rDUDI7PHjaqMDHQ0iQJ4js+OdDcHOZv7GDNuW+YG8b4KCIJ30f/vZT7dmcHMBbXgQIGg+y/QBJGxrvOIvWOmTE4vicZWxFYZlKZQKro9yrcQgeBOO+ug629zjSSeDnAK4us2p0yUMU+lAyAj94DB/BFA/zcSBbz9vK1qhpDgKO7QVFye/W84dXJ4KIVw6ZUWw6ahgOiA2LRBRvPd1jbxO2nLwjpEZfWJpeFdYLLQpJSyggbblxqEHEMp9SHxfwTANi425Zm53LGcAIWVQ4btUMeQaJDyA6WGr4Qauh6d8d9MlAysgFObBGo3AAoeWWv/r4sYCSr1yIBI+jN85nbkIOKVTiLg3BsApY9FJf3NohikvNjCGTHF1bX198dZ2FzJaPdeq35AdwlY7he842Ot9BmXwexpI/cGffDb7k7VF+cH+KOsWPUtXtpxzPwys2gtawS3HXRIpTtv5EX5+zOz4jttAgtLZniD/CzZFNYoYRaskcTPEg/0blb+TC38gumCShR8ir91/Ygj7mVTyk5P5AURTJNgv9XrR/moAQ1p4CqD4a6P3wfP2s6Kl6oVSO9bmQqUrI4dxhTn/BxQ6H7i193wx0/T9skbznLBPkBW6Tk2fVKEtA77r8D+AHnSgCOnCrJRMO5lzkwPHO67Lbf9dxeuwuD79hqL+PM1Zxl0qxoHm8dcGt1jIGedcMrf85L+A6Hq0BswMCYIdfqEqPMnRM4rsar6saL93vYooq9EwxvW7J9tRxcPUo9FANW75GdPqCtsksDcCtjNTdskPg6j/NqQL5lkTjfGQ+fwB8aeM6ALwu37BLOe4SS6kn5HTlAJBxrPGeEbVsEzIWMb4+Y8C76McrHLEtJe/oxr/t6g+qMo/CH4SVkUbI7lOKIS5IL7twjZUpkQuJabbDXA2imvWIUCLozlht9vxKHARDXHdfqZSzZPUwOaMTmjmu3jLmV4Vw459vVdYe9FvciVGSxcrtj1py5ydET7tVt4cD36rgVo933DXNA5UX75NpdBQ1y4YzdqpPAWYxKnJxxRccZp/xSzVg68rbn5/6KXbCgfj1+p1hVdOcojegGLNJA+B/wfk+ZZbcB4Lykxq3apmSxq4pEdV4h57vPnJ7jI4jjZCyGssk+dtsI55dwHTEfTFLIuYb5/9E5rt3Db0fm8w684Yx/0oZnsRAAfuqu6zVvsnwS0sW7w8Q0CgEiWJ5+V2p22cCkTBu6KPf2HQJQitsn5BjuJ0FkEcS1ulaBwEImYW8BlHJ8mO+ydXNbYBTe4zFkHaR8ktPdvRUXvsnxB6/4g1f82/GKf5bIswGXF1z+08BAfOkVJ0Ct/HQMLZmVjEfk8Ll6dABscLiqBTjw/CuAlsh7/hzn5Yc72x9AsDf3YKFmxMKuT/1FG3tXCxn/O4PMYAZW5T4DjHi3fxxn0ayXGu6YG83J3EnDlhtvB7t12ypN9BHMELhj24iW4z43lYUtzeTIIlZryhuS2WNHEJzdXuZajNaxZ90DT0BaFCm7Zhvw2WB/shhTVisH6PJe9Xoo5rIHew6CoQw6lm+MFcPL1MtwvGVAasDagsDx2qiBmcVitLvuNUGguL4c4ln3gedwy5dnHRDLtzp8s6U8kkg7zjUIcUwnnIwdEmZKKK42diUhIRkD391SDiC3t+xgnyLXza87DgigogK6NODH30WRMhIAgM2iUYMUih5e2gEjUlPeNiQMO2f5jEqe8jM78O/IcpuUBu15rnlMnbUGb9W6jku49x1K4MEdEDIyVSwMkGFBA6DUMpw7ZZrAJOgMoDO9zmNY3lM6LgYzFxVQJHWcQ37FQRZJ+DyeEyp5ycu+B+DekptbQ2qosKNgaUYnpK4YupvgkSVm6f280ME7RLobzL3XUiZf0oxYceqaA4AJwSd8TUq/wUH2dawFR0lFmbZMJ6DQAA8UwShes8DIDNiBllEFOiEX1e6GQBRroZBgRW/pGSpV94cWK9lUOTeunM8pKcFuM8bukYkBJXMgPBH6FvcCJ5PhVP5ZLIZCSxAsTs1mXuXzxjVoB5Fi0Yg63FO+MYGSzUKuCHRIdQ8DkTTihipZpWMM3LyVZeMMd3cne8QBx/p82cAwdvXBMljLfyViiwueGETYu3l20GRhHXcN+5QA7ZYbdHto6QvmaMKGh9dOeYF48AAc05jcTL0KoGWg/WR9730f/nDgHrn/IhEURDEYUMySnXF8wuG45Ixdfv/BOshoOYdkKVtK5rD4oCHtmRKd04MzGMH8OVfAwSG/mTCpk805REO2Ko94tocMk0sTJGodmR7gqNULq1tTuJbrM9wD2Op4MNm0I+fXyKqkfAC15y0lWn3Xs4PPYvl1B/CxpyPJid0JEUDTFrjDZT1iXEPu0yikyLtY3pm0qWoQN7gGqygTUoO8BSnfdUGjY10BFNO8bF5EWOmTjvkUSFCEnpF+2Tib0CJxU9HydQ4LuyfUanfHpyxAXvyd/ToH0Iw2y8xgtmtdzPtH3EvU/geSaQmM/apndcV30lp1kZD3bFfc/F2OXJvymCeQccahQpCP1fkacYVmrGADZ9dJRNwoDlb4Q0rgpWKEtXSxrC8AHpBK9bzfxlzLUWQote4ucN3F8uwww4qJj6EH+dELaMznSD8W4Cpy9gRjewcgIU8FoTwdNflRzxcqsP2jGJciEiz1yEcPktI0xgEAoNEBeJ+5pwA9LDsLyz3gmOEi/el1tp8csfR6SKUwXq/5uSDY8yhQIQhW4duvlYOhNchOu3PXKkTyndUBmnnkBrqzKtjHDmSrjJlhCuWofviPej4A43KVT/hR7HR3LPuIPZnsXiC7XNypSPHNMisw1gKQRfqSDeRBsFWPnw+/IJ0p1lzZCpfZWWQWvbKxLmpGkjROIcf6KHUIbx+4ASTBbkYe7mIdsAKVePX27C5Z+BHHo/dd/szZZzFPCAS/Jlr2H3YUWITFqssmMkcxWeUvzjmG21mk23BcsW51AK8DCwAoi3njGcU4UHOlCVLtvhfxyvFL7k4bvhipIwmGKhI2Ju5h3YGvd8Jj1ks9/fj6ExNo0mxJi4oesXtgGqIPsCylktx7j3LfAvDJXNmNJI5gqxcJZiwsIxakgiKK5lfSenyfGBAwwFBrImpd0a8AACAASURBVPMXVRJlIutFkhtL/Qce+f6jIhN5GgHAsY9cKjvc4piiNXObxZnEhPJ+A61u8owRAPqRJLlu1ZDk6r8T2wscyRSIdabWQHp2SvAWVBDG76wvyniy95RI+O6cV+WCnoeSXU+n/zlAeQvVIU27AUAnYCty/u5gNGh9V5Gwjl1rIIakmZOIYKwgbB1Y0MQqWwVxvNJGZiypqBl06h811yx9xp0KByK49gWTAN0VvO/j2D+yqouWEzud55KY5+a1ZIxrZlje3TXAGz23LE9ZW6rzyBdzHqX4deDA3+P4g1f8wSt4Of9evOKfO5gUAG4IyPxhMuO4QGMvItA9Cmjsyn4aUA/mSHZCxI3QN2RnfLtODkwcrcuYzqTPhyBCthWzYSLa/bL7Ru664eqzGSRWipBkfMHhvjCzaJIDbf2jk3BYBROSA7Cc25nfZciqqG6L6u9AypsAODTBWVll9VMD6AY6IXrjdf2IwPCOJGPVZoNrbKLTsPZdU58QjWv3TGw61NsykcUo12yB25BwojZ6kJ9WpfeFHZ8pKuVESsbhMF7TDTd2gN6Au2GPZBlEwSQX69gAmPTc6SyH4NqZiPLCTEcBDDnLho/g7wGDLFAVeA7F9bev/H0HWQFAedTc9LiACE4czYDx1FFnmM60LuTo+MYIhqDdYnm0LeY9UbfeawEeVCKKDrbqPL8Um+xcq25lbFJ7OJO6fEsPB00D18fZGZXHOXcMaOk+DWaLS79+oI3qGVSmfFBzzYCFN/eZAKsG1r36/h3flYCHCaAhG/dgWmUacxRX+JG93vLairUfz43nitgbAvLsPaToeB02d5zHOtb4wo437kA8xh3T3bzPwcVxWTqQjRmtvTBqu5oZ7pCq2dGaHrFJJcoJVFmyTUSw5sJc/WwSFPGv6NRvPmp9aAZfLV9QLBmw2Mc9FvPsBov07oBj1eyTCri2VjcCSUDhG6oz7mBw6Mb6kujEH7hDTWs/1/pXQaKCwyn5CXdkNzW7YMOXAAVKpM49E2wWfq1Y6w5Ul0YTIyT5Oe7lY8W/jBWWTrrdPQCmY68EQ/WN+ehQhgCSAb0AyxBstyMIMW+fpayCOlD76Y1dL/ViGh8dHBazcSJpy3OVfR2JLJ/1yxt0E3kHqBgt8ANQvX6ZI5azZjoQp3a4B4JquDDlv5GFWepFK7uyE6TIeCGL5wCusNBLeJYZ3I4EKqqw+6td/J3HwgXoDUTnIw4pswJnzLAlh54noKagrBnCT5wzBzxIByG7Jlod735IFuX+O9dm5gfML9OXoZyLpva4WNkwyCjAJsk64qc/acAxpRkYiKdPkEMTnnvvK3u/tKnTTwilW+uKM6lCEwOSq7G1Cw5ZwEsfQnbdRTa1GeCKvR38Re78OyRk0uceBQoIbJCV63Bs6FGsOqKQg02Ihx/OV2RCv6FJ6Mg9Kw71FwSCKZ9Y8+hyMANMq0BhA5grixKhEuDkJjKh7S64H7VmmkCyx8aWVzxLfsdrTbQc7wRCBiO7hrcC132Sw77BkWv3yGn4r5IdLwRvShEjQ0Ub5d9cbrwfA34z6Yx1uyMRFdBOhhSRHEWLc+YV0DGbqtLWugVozeRf5JASp9QEMe9a6xuj4o62Y++MoRTI6Gx4JK1wDCeD2oDa5GfslczyocqEOkAp1x3AIy/gjpwSAPaeGLEvtr4Ovx3X6AnQRU4SoJlJx3IpHTh8Vwwgg+zvvdtWc6asPeOiqSQOOTDtRQY4gK0/UeRLS7brOTuKsjH7GCwPvTEGpdx1pcGbxYjV7fDNWcIDAaQk8dAMMIEMY87tK6TYftCei+EWhYcM5Yw5cQMLa0YMIBt3GLzpMXMVwP5m2RWZx6lkAnwFPxj3oP7uxQg+ED514JSIyUMEEM6r6Lgn7TYhqZzjep4RADgm7txjJpTJEukcxI98S1pp5DzvtNHjAIZdsiRdJxngGIEmxlsOFpbDJo9REn3d8dRSdeoTOaepui4UsBWsaWy8j0LACkyg41nmoSU1GbnHjOswn9ixp1UWursri4E9a3GFhxNBsc1hLyxQzvIyh4Y9eYcKBDs/zrhzlw3J+1c4wabcYYKhgGNrEpBZgMxZw+vAdJJUDHS3lmRlXxQ3AlHUhZmBQlzTVq3SLBulwl5p3k//5fn/zoMSUgoFO5dU3iwqKXAqBBXelYPuj3XKuUeR22rIMfohBSiJhVnPGgKLmvlh2Vm0Y6Gqafl9QHu2URxveM17zFlMX4/qCAVwcYHRNzsJFpZAuJL8ApyCQb3m+ZpYZ/E1ph7E1ie28hW3SILFCBzHsFhYqtmIFkXhXEijiLBW3bjAznxUe9RB7clYjn6s/a9/z3geYIdLYn78/AHErJsd5+vu8HO8ib2oLqBZfPXCpoZrY6KulWNr7pkBzCw2jvWYXUWQ2+oZvlW7O6zuKdcoAKwBvECytewPxjJ6lxzxdzn+4BV/8Io8/q14xf/gxRQMTPhftOsx4yMT0tFO4kbOYmotVINGUhGnEaydPSPI8yczJG8UHk43N15W947lJYsl77o1/I5acGLUVHYHQj7rPm6I8or48UeV1k8HLyc4Em2LOGXLXo+g0iAY/qYRll2b7QYTNx8vfG4DZWFQLYZDBoNecOGY2MOBQwy6n9JzXDI0GB/Gnu507CKCT33Vol26MFPmIeNKb71NmCDZo8OOhFxedHzyfhojAZa2g11TqrNtGFkTvjc+B5/1tWsV4K8tAAb+D3vftiTJrSPpABlZrdn//9Odo64MEtgHx4VRkmn2abpM1mF2jqTuqswIBomLw+HYbvhRveF0QuZWTObtjl3JAur3x57BAPsDKxLDLTdeKwOaZ8j9na4dMwrGjtZRRkaP+9xw2NRHpR8u4dyBodIzkKL1dbqyfR2nrjWqs3CdxdrRAU7PaBq1blvbySVLNYEfdw59zIBNhSwVdQ4DBgBXtsTyOzIAFRZBRaqgkk6Bj9cJNYfM5VBXfu8aiwN6gZDOzHWJYEMYZLAWI5DRLAGL2WY9ULCP7PRmrF0BzvVASQB+FHljeOQWrzZsPlsmFwbAIdo64bpGJUFrpDM0zPiSodZs+WD/TmPLcxbmj7cJAPiQCz8AuHmwewBswwyZgFeAFL4JNPRan3PkAIAzHXKWQRWMfVbL+UgwGQDkHcne+8Hk+A6XqMPtjRoyH6C3PD0GEIO/pQYaNrDrjmPGQVyOkCkIeajB39uFN3eXaAaDQNXS+3yJkElf8pQ8LQJKEtBfDVThNzW7ZcOjUy196BgDYzGI2AYGFnXdMdR4U9fbD8aPH8Cy9z0bviQ8h62QMWrIOrsNNDpOOrRI+YGho2VfbNUgzmTmuHzUub2luzfz79Uj6Q/wxS2LmQFg6mSylveTwKVksJMSUI63niUAgiDTBZ/zOVvSveUT5vYYMixQ95LGSJLKxif+EwC2eAwRFcEPfRE8tIZLKBIWAZnlSufsHn5uyhq4kHG0x/fyVSZvTHvB5GfEO3HDQ2s+CgoQ9441JJM+nr9xJrwCtAV27LVjNpFW16jZqk6Lv1uRYagBwhvdPZ7AkO51JCQGi8xie5JfCMXznGW8KkcSHHK/InAIwZEMe0QAH6iOcVe8I/BPNvWtBOUJqIVvd4CSPwzeS5L5lOmx2cB8SmK5wsF5PBY2YiV+pYq95xegZR/xEiCmsLgXapDXX8RvCJ6EnUgu879sYBp/b0+tn81ucXHBwk+4OT7V8bE6eVJX+B5RGCBpZjo74zGOe8bA3hvDP3B5z+EhuPmJBvK8Our9GDZfybp/lhRIPsHL3o85pN/iChZmDzxvD1X7PQoPAGqeFKVLZiR8b6h/IhmwiJ8oWTcdkZBav+sBAmdmAOZBgulrjBH+g99Pv3XeesZdaZs97wxbRsxFBUR6tlmCW8yxW2YDAU7n3BiLzsbMDXOvJkOdwHgCmR0zJ0sWe2Mr98qaBk+Jn85A63tdBd31Mw9gM+SrpIEMF8r2ZOxqRlt4I99fOfk+S46SL7n1T8gRA5oZhjVj32zXvJsCsR0BTguG/MCyzXMVMeYFq6HPgMDk/yCLw/SfAIwMXJUd54LFMB3Atp9Ie8xh0DN+n91kahMfpyHZDUDmt17Pasovv5b/qHzFnbHxGIOFypLQj+IOGpSFoOaJQN5NoDw+28C8A4LH7KmUbxub8+VMABlPydet6HetCwiZu+eIrDxXF0ovLS4HO4ZFKDebRYvsgNxmWIOFwekC7GfuSEk7ftlYjhlnvCgWIX5Q95ydf04MYi0ve3uvnAmFytlVFR/FAJ7FR3h75lxakqzpW6nksDET4IrnH1xo/uiBU1ASnIWKfDPEm/gzr3O9Azi8g9Sh+pSwPNn6Ep2LPafxXbEFtGO3EYVVScY6AHMy31XbXwl4n3tvYk2ZZ0dV74/7/xzFAn4fAFzxRXMLRP+mwPmLLtqSDYk5hitiKbE+Z7SpaYvzF1H7z0paHxW7r+jCpEw9qvB7kjezeOfCPjZ3x85DI1qgvAnBUgBU93CHobEvOVlIyPvywiGmH1368e5HEIl0KGxxBng+oLtje+9PkQ3IDlA2MbJZ+TjHeiR5KeNKIEkAN/4bt6+QNQPEow8jbJKZo0ZxuFMmUqU611chh/xHRkZSxYFdZ90EcJMDuFa4vSJHlMDcws7FvV5RRHAzIAgS7o618zM5/9tcsB34UZ0iQSIaCxadjuKA2x+8b2llFtc/4061uh1lJZmo99Jrff6lJUFheCf+7BbzyAUyqU4Qlg/f6fqNV+T1G6/4t+IV/0OBySD2gk8e/JQ38GgX54sFEKD2JW+oCNa40ex2zgBy51C57JgoiSe3YimIA0M1/lvrz5oF1IBBXWqA9VBZPvzhoHZLmdTAT+uOBQmJOt5fSAvIG8CrnWMGHiOq+rZrKO+GIwtQxTb0iZVFXEfNtSHoK7jXgkdQ5sfzK2al+h5dG7c+CwMzpFJzLdtnOz7HJwPPAweCdDIwY+aVCEEDgI5h1AFVpM5yVjjhs7VV7QXRGwIpGY6lqyrEfFPJzMy2TgLtKgobgO+Q8gq2wrM5/I6CmlXCxibAAO1dC7Tnn0kBSgzyf7ThjWRC/fz873GJ7zBQHESYQFfqzQOIwdsSwXgmxloDx2uylhyBG1DshIV+J8UCxd+DLDVMHQ10uSiLpFXcokFMub5ko53XiLXmsyAYCVYBI3V5+2dHzJLwYJ2nZBBEMHB28OS68cn4H1b6+2UrgPp3BrsMKzmUku2qmTi98bOcrPuG6ghWZ8wTcWDlEHfpxD/1z9VnB9QOmKaMYyZ0jhmg0OWKFSzsKxj6JvvQ3D3zyXjXYg+HoLXeaQu9mGAOCVY73ZUqWQrYLAnuKMBCAKk5Am3fBhay49FSZx+OHC6oNnrvZPCBi4nyt7oMvPOQI0QGtBtrJAiee0WQnYOOAT2HzOO5ty9lgqADMc8qbZxzD/g8zlbrJ3fh9ui+NYF8mVzQesaChR1st5b4ci+rCvWWPWlJVnaqViHWM5raBeBVTubUhD87CHlGT53nKN5Ga76EE3H3B7uQA5zZPZwJce7bDPgY0HbwOeSDxWF3XBvlOyvg9Xkw7AYGWMjcmp7CmcgdALS74x1B7gSZ6pzp1+z3Dg9YBM8Ek+8OAOJ3HF24BqAZ3HerAa4EuMO/IUAp3t/Einko+d0MxCOR3ZSLFRBoylmBpW/+Zcbgr76GDA5prUT11IKPpD1kzU5rbfYHFMmCvNEvICtBuzrNWXyghJAXM1EL5PlLAoUoT0UMqu5IatoJHHmd7+4qmPsJXNG/Dsa0QnkUPhqDe4TPyXx5C2MZ+FX2fY8F2Kbd3SGzpTz0ZhuqndpKALqrutcRe7DBGc2YRhpQ6+3r9Q7gM2a2gJ0tACDv8oa5B1UNHrEn7Ev8DEQC2Xt6sD6Da0eMPyZ2dDIw3o2zZ/3rM+kKIjnGCjYGzc/q77tJZQbcCFoAWHpBgngyNiF7ATCG1MBdNm1YkFb4ezM/VtBrMoAdPjNlW3SPInF9l6uUGTwT5Zzj2rbwlCP26mzz2OMOhRUYxr+LpD7kdB0O2x7yZpHLwAtE3trkQS/GqwE79hTyXHVMo/36SbKLeLCBNinynSMkrOWYb2stj+VnAc3pnwcGYxGEfzqlg4T+y0NdwcXqvHtIc44orAgcyxZyiPgr96pQvpug3T6IdkcOGUx2efi6uFN3zE0S060ryDd8V+MLqEafys9YCkjkRBtcL59S6hkbDdpkQO+uWPEFO2KXLOaZGzvAUn4djs9glf1YQGd9WvNwmxXdBUbYjwB3VnQuNbGpBZdj7cYduSfq5275Xh1M4pkZcte+BNGFJ+kwHvNtUjrqnMHEc7FjB+ZZUYzFc5Gdb7zYKTsdlVto5HXixwwZsVY7hB9ze857D3sLxpUiAr0JxPp4I4egn1hHSW2K1L4ZsAYFw2+7a/ljNsZxD2YnEf1vxP7WQKzgzzrf9cQacRZYYMnZ2nf8mpoWLrC0mecpZ69Z7BWSMDIGHKvj6nUwJJ90CTBWT/KJGj5rOXIGldZe5/+iezaqgoxFs5izygbsgyGPjF2ioEc/wjvfqhWTKCbc8zzFnDh4qOWkTFLbBd7fGzif6SA/pJ3zrz76F14TOwDbjMeiY4xDwQEkhsH/yK7P0++/TOrPu4BuIe3WNgVoAnjwlig1CtR7QO5ZAJdnPDo6bt/stjXVKjDhzJ3znFDXFwDzlq9xZka4MMc40Ii00ZzJkn4z8ZMAf59bFoLFeXfH/GuVF4Yzb/vS8FszkJLcavLuTgqJCMEdMzAQL3kuEifS8OTsuHFY8p3duGIsOphBdRSh6yqigcPGTwCUuvOS2dUgUnn5vCUG25vFfOwH8OxOyT0VdkCSkKz5KLwnbUKr7yi0iGBW940jCWtb8JQIlZAgnAeeIkkaO3zxb7ziN17xG6/4X8Ur/scOJtfVrYsh1+YyYBHkUgs/BslhcPOdCR/00J9PjdvVneGdv0DGBMNn7aF2J2pR4Hf/eyZbOIDmjOQYrMVnizzaVLNQMYxJP414VooHisXmszaVxDBr+AY0Ave9iwVV96qr9JKFfcSxEgDccUkEM86naMdhDE4BwLPqfNdLB1Av+LWjVU+A1PHsWTC9Piaowyx+cwhYL1G02AbdCAoxg2rPZ1Hc4YwYmNGheDAmAMqfsCVTYfV7vdYsSpB0NwmKWwfY4xxgjX5OzpNBDJmN9yjp5B2ikQL7J9xegFOrNAtMpZer0prw3+jyYERzv/GpFGSnMLmTqsJrGKsBBsvJrKsiabDtFgwzi0pqQAbWACBkMKQT4aC85z0xMUrWuIWMA/8rf4cXJTjStNTQ5fq8BvHOlU/5HiC7AK94vjxfie6h1qZ+V7gnEd1fLguIGQz596QWNduCICPIwshuoSiGDnthzyiOGloD+ViT89yN2x73A6zy28NQB0pqsOdoIEYMbNhHF/vcGlA41jCTqTNgoEk9k6MOfCXWNdmF1PNmV6mXlM671t2K6X6XJKGa0qkKZVTIir/jS5x7KV6u6ypb+oSUf/2Vc/WkZK7IpA/omj9T0o5SQdQV3RT1LgDgfNeKXivVGpCpBSC9UVxXadAuL5f+fZdOXIuwevjA+h13pKziJbx7glOAI2Utw8af2ZlPSA1Mj+BDvToTTRng8R1m5+jXzIrsFou9tu1dIBV9c6w3FCOKl8nOdqN8KoI8Ueex3QGuRQb+HqsKF9lynZKuBJvbd+bZMwut8FjT/nfu/40bc0XRIQNTR/lwJqkDGaxlhDD2xBTBhcWkLgDass9pNyEhhwTAVxScvfE8OeRZve1TrkFKFvBdznqHAwxy1U87+w0un4SyK6Gp8kUF4y6j2Kz1a+PuA6nylzMhEfvUmqiWn+LV52jLl45c1WKPZi5fyf+xX/yQUS2/UuxbqSSVEnX5YRqJ+9/bNvEEPjoJGnuyM0hQHRbDr+gYMNh+A0MeZ5qBfpJyVnX2BhUB8ACVI96Khm/IupGsVIt9BEGxdxWjkv63BjBk1nij0e+ICBMmALc7XLX2/ON5hR1e9IUIUJJFtA+LWTHzrlkH51mrOVRDKoGjjAR96TsJZ7Kiq8kwwLkeZlbdAjccOtjhlHuD95a+sAdUx+rDHZyL5QB8U4LtG102pDuYRL7kObwUHS8ka9phSBw2c9xKCv3oBneHOmdeugE2DsJedFeIH+clj4d1vvPUE0GBew1ISI1CSP92gnAiAUKi4xtVhSYoNaR8zAMojwLhBvX0zc7OGQG7DA26DTltIn3a0MjzHHC86ozJMTi6JM1hZb89CEnuIeCXMfkR21YRImRShgGJxU8HutaXhMWWJB9YEGyYeakHyAGCTxcsSxlC3sfEUZgjdQi0LUYWsLIIDbAmNnd/bseuAfrgirNA8JusY4IGLg5Ys4LZJQeIEiTP9SlCVBi+6YDY9wLt7sFY9zJAtUGvE8SfJWWDyrdLcrXynfYNeWV3rZrWnJYTwHoQrlKOP5nOqtVD4CJIBnfH+Z3PS8gbkhWdttS6g05DZu0AzUf6JaGsJGrwd5yvLbE/BbKdZE8mJHUfu2b4WgPccQ0RrNib4+gE0L+p3JsubF8Rl/XMscr58zPHwLjtCD8jXz3iqZ5r0zaOz3fOm04igqOKD47DHjIPnDEbI2W5av2+SEgZAN39ORKzuR25vruKIEMF6hdUHOY/Y1YGOk4yFuxUOZcczsLsCNmiJVZdgE9w8/swItQmoMY5dCJF/Bly3mMSg6UKNWlPgESX8kelcqkZ5NLpAyuKAlf85P2lCKuOyN2t4sbqOpobNaMrEvOJhTOvy6uhqcD/BEG6OXxkPMEQvrOBUcUqdkAmsJ9yr1YdePXMNipXtOMe8jmAxX0igukO5HfJKPwzD4IUVsL8a0ZnF878Q+gfdqwpczwcf2/x/XGOx2Bc5niA28NX5EldyKGb5jPMnaomUvZDTPGWG7Cb53p/PNZ9SqxvzgVNoL7b+PNDcfkH3os55ytGiUA/AHtT5l+762Kkv7SJGbPGXQw7WE66MhaxOt/f5fqNV+A3XvEvxyv+8cQZZhAx9+PHBc7he5IJSRSQ5GQ4RXI/ZrQUR7VQAFhrf7N63hqAWT1z+f9zsKbr0OrPDECxkJU3hSEYcdlV41IFoAEr5kqNrxHH2CGJIu9KiCoyshGGEpjyQmr81vBWI7MGwsOUoPCqDrCuFKoe7XaGv8xYUgy8nO3WNryKJXa8Ok2t+WM45R0J5cZndT84FJ85JExzENtVw5bhDJwVipRhyNYKJrlehzs/UxSx0h2Qu7ekhbiWBNywlB4TWDEs2KHDokkOYjwH050FMOAupiL6n0bW65aunG+giiuXfy+WnUYiw/csyBZTBmi53oyeaKhOa54ScH/9M1WvQoSHvj6D4n0k0X1GGtQIY1eBVgRRxzBogA6x5ySxJdPdo/3dw8kd6Ed0A/nwZu4craWO7JKL2WUPnWQ9PgsAWPyAf1bIBYTNEBamsVHzxEpvNh1vPsMUGDa2tvzF+/IKnksiML2oEIhMRs7ZvGzHnq81jO+fLthXJ0QeEkXFvt6KHYP81F/FuLN6LsetHu9VsFdopha4c7EtPZ1FSkJoBi0oUNNxzFqojDn3h+Ots5gXAFniPuwAN1BRtySIJB3If58rzsZXkDTOWP67hO2/MmBJoBYEU0165gcJEQnttKxVsj4lGEAzUL89tOWaKgxOW+bVUZksG4BLW0zqCML55wlGa6U2wC6AK4NQSpW1/E7cYBX5/WjtFtdiKF8pHXsUQ/OumZy/+jljPQYUKlLzA7Ml2zR+ZgNJeLh84FNCTsGS8SrVCXyuUK7wrbnVYv8XgLFqKXNQZ/ptnqsGCdLHDPfyU+m3hs1a3xWAKQDYSFmTQWlXAJDqE217K21TRGfNXKjlc3ZBwh1rHIBTBZRgPJH+qySc4uO9uzy/w9VSBac/riWMn+nneQBBuSo+4V/AAoGUL8kzxW6c9h/ngOWUBxg+AWjIYITpCyku3kvEcoP+yczg2slRA8cNeQzrd6p+wx1YumOgq8BcMaXZ/fy5WefrLc4z5n6cuRc74uERn+VQ85Rp2tXFDW17s464TqKDGbIheLPAIgQ72C0VFsEGUiZ6QaurxcTg6sEijHlOQia7QJp5ZxoWSaCHj6/OZhF4ziSxC68wVjYEGAPwu4YO5/uOfwn/jFpr2lr+XQZx6oyJXQEJ6WzOKI3EZgpcFcuM8zCyMBVrKbb6mX1WjCHHO2/56+9yMb4Sn/RPx8zXLooc4AvybPXBO2fJ7JLe6L1uaLv0mBkrBk8Q/Ss5Duj35zhAqfyjjSb6ZYwVPlcAl+56T2YxgFK/MGNHA2Nz+lzg6B6IexQRxpX7Bjpvh8h8hMPDUaxqHRrdUyFDqQTPVBW2GFklWMI3oGgqmtXndm6lRyEC+My5EfnlsoqJrVDY6NlnAKAmGCH3eA/BUo0Otc5NNnbszw2TBFIUqoJbBbCUeyL7VFRgTj79PboTzuWuovgOoEDguANkGkmgQnYhRl5ftvuQDwqi5bZdcxXcAY/c8UL7Q93fC7Qb+xWZw7vmUPA64nYBMp5oWSA99nrPMLmOGPfExaqAl/kyVvurx/30XlLJeMGQTOrnrCftf6zJV5M+yDZ2FonRXTlVwAJKQg++K4bLLrwhjjXzWcpZl69WZcFVlPvjnR3BmZvCOWfQAZFXxcwk3Y7Hvn/74jkFAL9rxlA+nwkLVuYb0PmwaY/7A2LfZ5iWRdn7gQ8R22HHcuI7iN/ZHpmkRgwtAgzF3ARvVW8UbTVe8IIFJiIktjykegU148sdIpRWcweukPP6KTdg6aOUXYbenXMWOBmE0sFtgVL+HRjnZvvFFzEdgWoIHR8sfsvZnB4F8MNnZEGNe1Lq9zLXAsAOiejISRwsT9ELCvOfdR8JfPcckvmFJJsxen9P4ilJkMHxDSqZT2csmHFDyFsNlH3fggOU52cPRxX42WEio7ByJwAAIABJREFUYdePz89CQIwC4WSM8PmnrxBDzUf3Yy/sXOuWj94T+LQNqOAVEqrnJW4QfyELRwBg8tnYS/jFr4W37Ly0qWUYE2OQ2vP0G3pLg9kABBOvWBd1wR7vsC3ha+2Fl6Vq0QqVK8en5txArxxa3fEK0rrYZPcaf5H+SwHJvCnuweUKu0ilnhF2e2nbjvntiOa/8YrfeMW/G6/4x+jQ8UnQ+UuJ00zrAGy565BPz4WMzQ5A7JTZig/Qq4ouqmCxCoCedKFyxj1YMY0Gk7EcNiWP45nMVXjK8jlyOJqndIB4dSuteJ7z+1n1a8bjPY6AEoDE0GT+R2ipozVgBXgYM9kJTrCNlJ8RLfh2yJmpYdmq6qu7w6MqPySAkC82cgkeTrZkxkp28KpOk3E42QxqHFbtbpcZ3JXyd1m0wsKuhL6ZX+8IgHYcChyJm8OZ0Itg2qgKqWNXwJoFSBcPTV+BLIMgqsXoYC9OTyxmrGU805abhYm8D8tOjtifKrjn92LZYRN0MSGocwPEW47hdT1iHEkficA6jcdseZNIBqYN5AyJ4X2uKgjyo2h0fm4wh46Od2ydzbopls5dUkEsr4wGbzK4yDDcpYuMocHNYestRWIrB9pFC+Zh+KgdG7r8yMRGoLE/FAoPx4EMwlSxMiDcHKzH4MUetSozw0qgRIBhAoAJ3bv2GQp1cQxosLZ3nCYDmFwJG4jbHvA+Y2R9FFC9h1JmMjUEOeft52yHkP+8tlVyO8xhNegxnCkmZDdjONd9A3AzbNl0aBHXJ7CSTCVTfibN4c1OSwc0mRPem2ENYMbch8moNe7hewVs7zsSSeU7KBkiNDignswhQQFl7gcAfRWDl39HW7l3dr4h5EEJ1o5KqmLdsFrqJF7OrGVKmZq0Zv39HezrkbTw77ZvZJs6z3aCCsdZPrAJs26fBwi65GVoiaU836+UL3UHtYNZbEy/JNAiDYmwkG9iZNLVYE/a6WM8B9wVr/KDLbGoKdOooxOBYnz2nnIXeLJN81gaMHMv+6aMGM5i592BKADzVfFJxRHpG9Vxp1xT+BiXi/rdge54zDdbFdtrFTuuJRgJ2iz+DmW/0ga3BFOu9XTglmTEHlIQ3qHrt1IKlxW+uJOQEzgGgBUrIkkwEMT5CfkO7yGsGdjvwWDVQZBKIxiSGG5sDmiyOGNGAuIuqMnPb2as48jCUcaLbpN+cURak/Y1/MLpELJbIpOXtOElpSSoGEo9vh+fdb6mDmx7Mspt/8kCWPh4ie4E+H/xd+Dw0QBfiuApgDtlVNHgNWRCfZCBphbdPDQkYywOvBYJ0Cdu244JKeb1WqZ/1PeS2MHZAXBKHovTL7TkBeOz3A+5QXMeIkxwD76ja7f9Rb4rFSZSe0PshREG0SyKA9rbS9ywrH0VBJwZ4jeuWIvUNHdPSSTBO0F1v7GlZ8Dm9Xcyi7/ychvYcAyJ6QmxV7ZL+fKxpOK5IspACihauoOEIqwvimAY7bsZY/WKN+IfvvPsaLEpgRM8P86F92zIzJc4g6GM2gEwcS9vA2qelAGIuCljOAANaDhnWQLME/lMA2KsnIoPCDgLtuJSB0pCz1Hy27xf4N7HkPjNeJRFbOl1DP88xkAMucDevQlHLZZ2wfrIsT6jiCZBwBQR3K5VMJOwkdD74bjM0p/zrDLSiBg3O7s8uzWZo94g6cokiut+EtRoo1Iq5Y+SMc3czsF6XMSDmXsK5ZHFD5nJkIzxjPv4KNCYKbB0lgyThxyowjFmA8Df4pKI+2Mece1V79iaMvDZPTlif3QMNhw1byX3DGPGOIvrkISvfaEHuNNF3sxjx+5yqtuA4ZOflV0Ptqubg52Fsa45VPyI/8SZL9GvpGyU5EMCcKTkYxLezILUcFxlI4qAkfbAYEFoyyRz6qguZveNydSJJIzMKSLeTiCchLgLhiQOHwCbpWxjd83WbJ2DZnK4hs6NoJVPrUHQHkD5QL7u8Kji7D4xrzxZl8AzjsFH5dQ7HNu08ZAvN/yninmcGxVSiUpVGPcNN8MteT74dtyBLavsQSpKXKu1H0QunnBnF3Gvz/dxWCvsUdoVtc4nMgfxM9bNnxOqY+Retcgh8zIguiQB2NFV+Egr+5xxj2U8wr8q4oN3LpwkWcGEB/k4lWH49/k9CXkDLvvo0MiZJy27Z65Ht23iKt1RcAuLuGYbO3CNK8j1eU5MtEkjzjmU2UW+5Kq8Tz0IC4ec3pZ2Jdg9v7lWyRXTOscCUgKLv3TjqvNPOgaRjpQ2ZoGm36VmkS3tmADi9MVj3TB9Qscecb2K8GzuQ5lIBOZv/IxnX2tBpgIi+NgCW4ahzJeSgD8U7OKquCWLF5zfXngJMw9AVhGql4w6S+Pm831EMec7Xb/xit94xb8dr/gfJfIg72KE8MHYdSP7o76scUYaiJkO0x1bj+Q0ft59P5j0KBZE/tBCaf1HC9pf7qs2exeYOMjT+VZ9B5j6wjR2TlWlU2+Yhn6hAJ7tcsEMXb4rsUB0fRTW7l7/DiAKBQigtu/uuegR2CR70G86mGOodUAnEbgaCqURMhpVFbAFyNNJqyuqtU3eBQaon10nYYy9yq1lFCDRASaCJYJqHErHfkiqnOzkNnB0SACZS6O0mUNqS7vokZ+XsQpbpCdGHEqzFzLbznc19C4WyRr9rDOMkmAECxAMvHMt0giKVuv1t7miQJoHF5ZAjOKFdOxazIXU3hBNUD8C0GRWSQbLAQW6YXszcnoG0ir4ieo97STyvqrTxTfE+ox7Ji6RZIgDmjOKIskR8+qXLM1uQQGMG88gMuX8KEsEaMjnsIDUnX+pF7vwDA43Nsw3K/sAxhA4XixO6YTYpKwr3tByLOlgd0kM1ksAak35vM1G+ConCCB0wv0hwVjAmD270XZ0Jo5wNls2TDOh38fv85+t68rgfMW6pAyK22mEJkz5Xu5xOqAMtHtWwGfYYzsKjWPPYvFbMI+mH3J9dsyji8Qc9v7bNfmV1wsvsJYYe7QiSkXKhFrac4SVFUGaJBGJ4P7UoY0Cnxt8G0wVkuxTeR+z55pwwO/GwQLrc1U8ngD/+D2d/D9ayVGRHVAJUu+LBM/6N3jvml2n+f5NK7mn3Q8Qpt4pDp/CPZ1MFyD8VoInAMTYH2wpX/Dl6gQx2/sBHEnprk7FjWTWZ1C7j+cz0+5IPJ7QUqZxDzzZipHAjCvOitYZvJU+tQaGBvB/7bC9YyJOyjHbZdXXlq0QRc4vcwU+PJNCjUi8Gf79z35rhokl6Y9H+dWRe9aaXPEdru2jWNcp65HBbV6nFa3AeV9kvsIxseOdH59rSUwQtOaXwuXNmZRHt62IYn9h9Kb+vQji7wLcykHcbjVnUsX6GJVNsDqrjnAL7m3/oQVULGlfpBCICmS1zBE2oAE6e9h5MRYHyqCnnBxCWlktiFKOtQO0isJa9WEfNlpT7gXoYtXJHaswvM9qMcvFsBMwQC832cNMIlPy2EWRA4tOya9cqxyezDWK39c+g6vmdXWMqPtHvIcJ2EbPlwjDu15IqaodcTntbvj13fbZsOGV0HYnTEk/+AA0CV191q9/5Nn971+2OU80pQnT/7o4diRyKqsJZdWFr4etu3GV9GB2v7AYYdKFJADQtWp/JZPynDvjRajT+s4LhoWcyRrB6HB4Ev2wkXNrXXju1MfjnEsGselj5Ko8T7DQEF8PrU74VeLzzsuDCa9K6Smr2J62YAzJ4CdygDj7zjPNtYu4DQMWZ2n43eeubMlx/tyQeeqMTomtSnkbZ+fi1KQVRWcdRgH8cEXO9RG9ADgoAvIRAOQ6CgB9nsoviwFBPmxfvCllDM5L2wU+0D+OMaL7wCHL6wwj7c7AQVizmADcg6LFL4hdgDsua7m4BEkNb0CeRYtffSmoLOJJSsjbE4dIvp/eIvVOYl5SxmNJpGi7ryQGmtPuxOe+ghW8zy6xI57PAqRFMRFxB+y+PGREHYDxXiLbBXBaeD9kYp3ECU+cgJ2vJeU2flZcZSUD28WXsVjsEGVsCwdEJ3YWkEAyA2U0c4Yb6s70OM82BB5D2stvyE/giG1T9eCdoOJmvJxdzHmNKHyeYwnUJl6l/pASlqsKQCuA08z1+VINrYqxQXksR875664VPsveJGKMgMNWzJlmgW5heZ47SgheVSx/xuOBMMFwle/eY3FutqNkB43irfx7efMdCzoP1O6C+RZX2kELck68NA9fweLOQVY4Zj1Ldj9gQjZ7LM9uiyQbDEVJSJ7PXsWkyNkrChMWCUupxPfRiZEzre+6JzEcPi5z8KvIz6b0defve0hV8jdmKRlJyWwZcj7KUguc1IlDeBR5j2U85VbdWQRI/y/mVSkV/QDkJm4mub5S55+2KlbCzhgxP7/zzZ5rjfK7gBYmVAVuGHoui8Kmx/iAWbnSK+5vo+ej1qycA4+QYw3zWkdBylSqGLyVYpOXU4abxC4nsSJjDgA/9oQludhQ9iE7PDcmJczC1uRsmH3Ig/2dDPGvvH7jFb/xCuDfjVf8s0SeLUAMQ7vNFKCBQw2Ot+PvAkTwSWaaACLr2AxxLW1mHYAcvlaAZRQ9yIBhQJ3JF4sbZ2DSzsry/qrYIxhyU6M3X6g7BAPL09mj9fb17rjBehZOMmT2ZBZ/VubTsJJZFHrh84WUJBH36npAzH8xE1xL6rBn4H4OH+0kadJhm2FsrZedDmJuh41wDLKAYEG9NRJOm7VJ9eC3Zhvw8BGLxRboFKy8cTC68jXlgOzjdcoQ3BL6+D5wDi9lp8gnZjIlN6vI3KTUn60EEMBIXVk4BJ9QjT2VQYjNavnUaid2IIoySzdU/uz3EayjYWcQ+OsvFiUXrpImnCAxdFXl33SxyCRnh95sbVRFMcMQ7fzQRfApEbO4NJCEZFDyO1FOpCUmr2ZzqeMdrMYXhwBBfOFUgch9mw2xNrzAiQFha6yzh0eQAEMGjLPqWynxSI1KGj7DXfsin2QYqii2s6D4EMe/MJyp3IIBShbgBvedqgLBZgDasZxdgensTRSp708N2QTgwhYCpT9/7q78KMPZ8q/Q2Oc2mNyPDezR78MPxgLtTj/WGgxW+fdkxlHHVutLc/bYyYLJwlsmiGZWzL9bPoEAO6c4fK5wxhGgCZCs5GmrQJOaVXIkad/lItBpSImXvGqNIxjN/9bQvM5gVFUhdpVcUa2/9FmhpGsG4rRh2zu48dOlRsuxWbvufQyoVMS79lXAvMmxH4/73an/D0NLRLXv6UXw5n8e88i2dPB9rg0D1g7Itmn4AMUVUgrGCng8sxYrjon7c405hD6COw4Ciy9KpnP/Dv/JtUwgzNDSYxAWRkUEY78ikbuR0hsOK/bODGKFK32eAFjawMTYHdzmAG3ey4DKKEaSbofpf471eUV7fcgQ3BtbmbgOs5J6VYp9hwQUQbjFabb8+5xh5LNljRxQ/Q8EPcvhe50odEAui11Fuc+PABkIW3rswz16nt9WC1sbQJsDe2xYsAtVtaWESjrgKLQcBjZBVyZfqVkt/XtAF/kzNj3te+3HdXzXxNhP4o4IJW2KKBWEGbjXYPh9MLr4eXWXse1zVotDNuMoGwtQxY7z69GRZBLwlCr06NgiseiNO3zRx9/432ForX9pGYgRktTrkB40WfWsNlL+aGFFJ4zbwGVS5yPJRKd0386O/2CPCj4wwALbckBXdDjs+HvzmIFDo7dymHSFxQaETZU9j+Q2yEpR4Mp7esTJYMyhqU8ujBPTVzEv+ITJs1Dxy68k6iC6cUbKD91VKFBDkbv8AO0YO3UBFkAVTbYKgarwI+rH78WVfm0rP4uEmOgs901JJ+R+JFgBywIWc6j0Ja5acQM85O/SJ0jeFwiGC2NFvT8IJE0BPEFt7qnLpfzieZXUi382uCuA7QYlGwhH3b+G/zSg/CZlAoG97wJt/PjNmlPq75IaF9uVpyLmF3HAfAM1cwVwqdkxsQHLDiUC+rQxcVZVa31kfUBj1pRG4Vr0Z3UQjU3pR9ssdjGPXF2MExQAqdrdN+M+CALhy1g84aq7UeB8D2BaAKQVj79Q4Z4IZuTEKxjk9wD+Km/2ay8T5k3QKMZn0S9BVpzxlVcHIOefxBmI+Tvc3w0WQxUp3pP7bmJCY35DFm6hR6xx+J7MrcwWJBj/2f0z0Az7zLpPkpsH/JagIkkNjYmIBxFChJ1QBdYdkquJlYiXjUxFAxcrsDpjUBUtYtoJdNXniWDDsTdVKjRIEnK3VOTSmKEce7E+4/DX7a/IRHezKpzzqHI2Cc27gETaLJI3CGdxAHQnsRkkWViSgkPJJmyUiED3iIKj1z0NM9xz1VpfUMCAOzqm91BIyTVtSAxo7xkWXWCca0LxjNelCDSoDoXEj0Qk5jrhW12aeIGguq0NTpIpk2E8CC9xpQz78BvVyYUGb6VyZMS8lEMaGW33eWUOBKCwraPDsLAR+gb1o2tvCmBX2OJ896FuJJQdTr9GEjcxgBHEjhHP+9j/kZO7O4YNmHr7wvj5fJIp7MxlsRlVMLDABE8g9vZPeMipnjHp2lnAJYrHeCq64jbwrs7yjg03SLQ376IS0J25O+dm7X5/a0bRzR07pPF+GGewAcQtRvi1JMK6cO783htvU6iE4kt8pS3rWS1jQeKsjr0hbrihVfj9FMPKbsgIBm9sTKMc2BY/5IN59sQ/M93GPTaqCzx/Ssa3k/T/jVfgN17xL8cr/rHAlJujM/zUwPXjofPltT74hnBjAoCPcqbZPTC1gYuTBZ9GQUUbyHbHGtG6nA5ERrezqtXLdk9mARli6XiGGyPwYFmsw1GIoBbrqbE8ImFeELmQLMME9CMW5zM42aUmRipGJObujn0cBlXKekEVNwyqqCJCPl9WHvteJvSY6jvxlGKhvFyzDy0eSnAyBT/iPqlPmuwPriW7KlQEugV7eIDKEhvqABb+xj5vBFsYNOJjcN2KobMPsbehuDa1VdUdvjLoj82q7zBS/A0G7b3OS7yqtb0+A+JpdBoUySRKYRj2x19v/BdeLHD0UF2yVQIQs+hWY6QSv9ELnwHbHRV15tmj6usznYusMpaf6S60A3/Fs3JPcCGCGmS7LH/vLRmQdYFSHZipo1qMYhY4M4iiiIbX/KIRsjAAg6R0grl798iClMO1B8efYgW1Du6ADMhQ5PwvkasKWUetlKx2CXkVAJHpH2tq3cabZxpanpN1nSjoljNyiKZsXhdjC5yQ0e23YgUPDR0FtLGYE2ffHMiCIRi4VXAGC4kfaUZTgBwEJHrAaa7pO2Zv7L2hdmFKnrs4a0mWc1AIwPNzA+ixTnwYy0Vw42Q0sib9vbKgGiZc/iKTwCOgwC6d3C5wUrefW7P9Xdk73wHoGFx6LsOUF8+dWCUypZmMBs1MTp3afq+IOE9FG7g/1tTDGLoLdpwFRZgK0FfEaUGxnmXCvcEJEcG2u3ycqMJWs87NI/k+6V2amvNdQLV6fpQ93tpMXg+fOhyUPFOFuSXl5JCZbQb+o71cBOZkzCar7loexsGjWzA1gFsSM7/Blc3eMEXzBgmeShTfO7ANObGcswgyyAl6UvXfgtn4UqaJ0wK0k4GX/cyHro7ElMpIMgTP02xQJwNHAzTAdnbeFn0jfu5++NxffZG0EsmCaktmqByM6r4qOVLAseBwXPYqQL3ApCOJMVmwkLHNeZB6xIgPux9FBHMNRh3ifH/RhHd/RL9530vz+xU9ezBkFdBdN2TOKRhHoshAGfO67mLUfWXq8X52kUEAANdVttTMoDOkVUUf9/kgXsk7bNSuJOweh48JQ3JPQzN9uyvEEqiWBlpUXrhHduQzgduIWYnmkCMeVU+ZlnM2If1Tvhf3ADQG18rqmRUIdi6Ljy0dMTwlMXIQryOLSaoocCGfyUAgPp+q5DfyzAiHz4oAsgWQnxFXRaHFUPrw3+WykFlKu3ju8Ux4DVlAECDYu65SoNgTzksguqdE+tefCd91Ems8Z63GW4BnR2DcJ9pGxiaJn3e4zJKny3O5XJqf70A6CMbzIWiT5ETfkMP+ZVzUR/c8C7EnhPQh4s2cQ0G/NMOf9W+pNqFNXSpnTbfDGJUAwgPHDLtwD8Ati5SUI0vyD9cvkhWgBs/D24bcAYbxw5WnTPLHOG9T6kkdSy6oKq5QZ5j3RdDSPQpLWiQpLsZs+RTv95rscMpSWTwvQUVzsmOZnzYAONfEEDzAG2BFgYI37ZpAPgHYa1/4Kp//HS7mV58dpwIwtbJhfjCct0d3ACZGSHip31W4QRDDHKP80TkD5C4Z8v7+G+0bbRzBnnEYufpiMQFS+0eOWCmLWrlvAIQsK+9ljwTFHBnj8KxnvOaVr2Rc5n4XyXb6hGN0CiRgkcQPJnzfdcVt0zmjZWL2fcWc2PhiGEBAKy/f0LrHiIXsgkrGsxb4CQ6CsHWxLORo0ye5U3KpiH7mNZuq5MunQlPOEVSMqcIDolszADiDYd4hGTvueub5BgmuMprUKxNuBpdRZ+jaYWMFARoiYvZevxF+dlSsvENhBDzDwsIXP0aOPOR7XBqzggGULQTiOeJnnoMq+t4lDsYSawWW8P9mXnEV/9seex7otGQdEpaXR86UdgwRT0oUaStv98asTTpfkoNwbq+j0IsAevPL9UHi+VoE2OmbJXPFWAXtn6tZN8BDylUgPZNtZyE2fVwTghJvFZfqmiC4TB+8As9bYxw25zBGEa+N3d0HG46V8Za/4Z6KKYHTbMHWC+zQYnx66yhC0NiKdxbTcnkR2NGQ6FTvdQMoIZgFjLmtuvnWoJydmeGNJK5IPf+o965Y2oSwxHxSHYlHOzCaDaRkzQPX8S5sfofrN17xG6/4t+MV/4hkjMG6vXgWJWoHRyGkh4Cx7hJzdXxXhwmrs/FWw1iYoBNtIDuru8JtXft3mdXGupQFIvFXubNtDscbmYSJCOerHN0BJcWVB9rWQx6rNlBiAcbDzwLFhe1p5KKoM1g0qcKQIdrJk1EbrLVgjv4ADfvPZAbajqVnS1x+79IJuyO5P95D+2ALg9qdCnwNId2wYg4PUAwc0zdSl5FvswtUIogOKyZdLl355fDN0HMfvek02F13FgPCMGSg8ALZlbmmKhMW8hzDgD3ZUZIBSUooujv0PkUqNA6T1/DcuT6Qcml50PjfWhJortkim4d2Yeuf+E6XYTJZjBRTkexnDtxrKKV/I68uEGkF/zuM0Vg9dBgAkpE1D6kPOxPCAgP5NtR2YjIQuzi7CMlcaFAkGXNaQEQkXpBqQyfAgzBSR8BVs7EMIQ6LkQGhDRpbSW14B9zR2t1M7lOOgUOPFRISCQsOE8O2DYNiCLsEt70rA0zG51avTiYxabmgYwemRNJ05TwEAFtouKf8iRszNLkFSw85EwAvW/UeL5dKGmt9pf/MfeNOhmCwT3cJBnAZspi3hY7wjQ0ZHuwjxXtISDBFkLKZvLEIpnjHnCqpg/ODRSwAb3hJTmbg8CkbM5kyR5CybMNtQ4Z2xPNNrhzaXZKacZZcIugEYq5DBm9h05SSqPRNZ7t6BvnJdCPhQkcO403g3Q57c8gahC2e4feSKXql/IhQsxoiBYDKUQROVrrIxKsSULIzRdgZUcX8SJQMKOs6nLZwDuCVa7KB1B8GOABziGKF9CqD9Xd9FgDcy7H1kwPGMZBEsOHKANBahggwuC4sd9wzOg1pPMLeWDHVtnZBAUYF/C0pNcHPsiAsJHvQFTDJgNIgcS5k5/ocre3Idn7Uuxj4DwBq6e8hDza/u4V9CuAwfLOI4i3/jdw01TApA0uj4GoBQKkhIcg9fj70pB0OO2ZWsEcyJNms2/zvQ///V18qCzPZ1gJAkoHVg1QLHAaQ0g4qA+JMJra+C0geqRe9VyWRKnrMC+QnEij+qy9DFJI+TIFIyN66Q4qI8UwCRw+gI2TaJLpyb2glpAKh70MnaXNr+DoA8kZ1P/hg0i92EG6EHQ4Aeui6xkzSvEfObNqYwADu+8YYUT5wxZWSEJuenWQA/tnnlw6tjK2CEB6ydQ3k53tJSZO3OlZ1sQ/OFkiAJZK/V3WCSOmQtzY88MpzIoKlC3tv7Pj+n2pAgLMC4MM4xeYVSQ4lpNnlLoqa8/ceKWXjuLLYhyaezNA+X3IUIwfwIwTGV7DQbrH2lkOhizb8ir1yAXiK1fz6S30C2rEPEICYSIEqZoyPJcqAoglcZlwyC/QHktD2fE4J8HX54hpphX1o/9YdUrf2vEnXLi5D3vRTcSgEgG17FHYJ/u5iPbs71FbEKGjiUcaFmMzfnAm5KveCWcrfaK3PrnyChCJzh7riHTPBHCmxpBjgWTf/2cWmnIrpIBMYiPkv3e2TQEDmNsBRWHZHSj9psNozSidjVwC9Kr8VEezNvV7g+GEvRYC9bhIgx4DNG3MT+MxZFRc4l2nvDcGNMf6La7D4PUNWdH0wVvGY/WHhX+/Z4MFKCcmoTzFruzDDPw3z6ILvWE9twiO3YHcAbf6rOvdfX4qcv/7K0izB7H10QCjsb0xAdd4W0GKw4TUPKS/+buIHSSQFHjNt4+8vSAE3Fef5BbU440MLqPHI/d4RN9CG6gGSJxPMOP8MAt8by3Ow+yo2/x9xxpoYDM6WMqOUj+/Ip1YRzVICi/JT1CIVW8z1glCiQhBshDzPf483VGed8QJKs7NVRt23yptqEgJodRoZOMKAKgsjcYTdOMJASJSN3TJXAADBClY1n/8DM9Y1506o3Zj5Wt3xjsIDpeocuC4MBsJwd/y83mVvCfAuTIxQrnGMlLKfP6EKzHUXQA5Qut/M8OdkbDFMcaXMaRa50HHrfRRVXltrppELWvpcv89ss4X3g2CTHVkkgKRNPBGrA6/4UpQhLpDgqVYHD9Cx31Fywoyi+rT3QeSMwswjBj1B0QB3MWHZaeOrChwJHl7bSS6K2Gul3Y9YT2VDne9hHIUvi4LlGn7g3BpdPeh18kHCb/zhSl9Tc6QFPkKasgMdAAAgAElEQVReEqtvLED/lh8E/gg8LEdM3IXffQDOfZar/sO81WVSfikKRXBgzQ23mAEXuQrtVKwbOUWAKObWwl6XshBruuCW8svRPeGMl1UEExsecoZZav6Qjq1ttDrM2BZjOAx3YEaQUQ0GH/uPx57Itfwzq7VFLh7QxDg8u3H59wTH9Vn4/gbXb7ziN17xb8cr/rHARIZbyztloWipB+MeXMjCmYNhkywzMIArpmEGHc5EQBXUiSwbGAdkAcnAST3IZFwxGbqxMugwL0PM5MnrdysFCPZBnimX0xmCbbCOCrpcBCMMUxaaeICz7Y8SXvzKEcB6ABLxIsgizeTjB5L5RieYMlu8oVXDIUfLioXjZGX1hb03hhrmfgIZDJpmOAHApbuzkg2Qm9rEDv3+WINstwVAGSwml2p5715MWb77fIfpLFtK5vILui8CS+5VRRdfXJttuCIo3SPAByDacwHz3Ylk7sFBnXN3YI1VgwytjOkzEUht2KysT8jhZL/HNeUF94FkdXexst8EA5R0LNnabcVosdBjFwgkACEVrSq+HOeuBqebHWejwbi8TjbCxI4oI35WyAJNprdJyg4AGWVNyUHHfIyUUytiF3YHMb5L4ii18aFa87jiQMa/Jrgm2MJ9fAEwjC6YBMQAMGEXMxbThGvRA0jbNqST5vPFvI7jPRWjAwpTGt4r9h9lEiJhM8GlKbF0MG1zaKUZrpu2K5MgO5x4fj8Dhkz8Gl4dW6ExYFN0kbEQZ0KQclSD5jMCQkXMgHKeu2K51DtejyHtHue52MtmWMmc8FEF7RGDTbejCmjf5eLeGpR0BEr+xH0fUh8OL7CYALC6sJjowd6MdU1Q1+CAT5Ii/JBbPAAHKd8R2IC3v5PHmVM69dCXdrDoWIOQfcN3SEn8pZuVoBhiMDzvMXZ9BjGRhDC44rm9DH3ugh1aNtMBUcqwJgtdjHbFU587AMO4g5bUHBfn5imA/TP+NuflSN0Pf/hIdL4ESe5etu5l/DP+vZacERKsV0oBZaI5glk8Q/5CTlBUY2aCSAFNplrzWuaBOKX86x49yBPJNzqCNAAlFcECfDwnEDKXrcPM2YYBko/sEiWxhOSNoyNoSLzbUazH73BdACCO7IjmPsiT/1fELuOHPE9wxwg7xCskLWQWCAY3+g4zYATxyDvGIWA4ayYEPWVW6pshjLK/jHly0LmLAvMz9kzeefrb0NP+av8VoGwYY7x81B0sXJP2HVBqnfNWYx/7CfA67sr4Y29eWoN4p2hJTiwYZF/xnSF/An+c2ZlM2BoQb0W8GeFzAZQmvatXYS+mQNG3H/I0xXL0Lpzlnk9FgNgKmD6gEPxZczDjHQGYYwKDc5Fs9RyNhck19gadZkntOSyIFWo3ba0qfLyx1gI0hlgA0C3FoE5Qa1qDi3MDmrM8UopM8O3kUfYkueOVTFLxiO2yG60ltHOFvexeJKdu9Vy7bE7ED6qPLvTc2erofO0EAmMDqDjg0eFm3oSumk3WOvUD4xxxQ/sQ8ivuwciNn837mxB2HwLl73jfeuRo6Zut/HTKM7ltIJiwBkUWNjOuVZ2c8WIJDGTXT6opAAi532Gz5KPVBZ/p18I/LBlHgUprtUx2ABvxbkSwZaEUBZySJxOGLT2T6jqACK412eQpv7SxYGELyVhFAHcKyAXFJgAtO8BFxpnmDu4m2pNVkuKOt4ZP37sD8chUdV1HhwBQsl04/gwTEBYFUz5aPeOT9ZhT9T0udpgU2bNUIKxkWF2lei9qNKtYyMJ5xP0xtzn2n7g9uktz3bLTdhx2U5wRgqV0GkJaOuEWf5VtTwk79R0WNM92/GgCqOF72W0RspYHID19QMTgzmKSPObREOiT6soCLBiZLQI+679UJpJp5sOx3DFgJDQM5V4ygw6uc86uKak63cdsKS0J9My9iOekPWp7N+0q6bkQBMQeDl1yxE5c1/fMEQZvGF7x+xHjrgmRN1dTtcDadyz/a9/R9crlHhW7Uw506ETO5Rabtcwf1napqfCTahLeKhiA4Z3xNtpPJSGi9yRwR+wNgHKVAojuyie+w6URe42REoeJUZRbDlvU/55XguMGZ14TM+T0iJ98p8/KHDNwozFxmQPmuFXhe8f3JcYxkejxjkK+HDdlieEFLilH3ufuuJU4mJ9nzgHDDYBxRhOWEh8TviMI85SMQYQxZ0r8qSrUeua0bPliKwUW90wSLJFD/k1OdrHaK3diBUKSTw1L95x57kXcudWre/4Ocja8CRLu/Q7tIGxXjqeHUkv42unRce8AMKGyouOjixppX+6hkPj9ETEgtMnFfsr2Cp9RVXFlJ8pWIHPA6F7Uo/toydm9n3+64dqYaF0Va9ghq/c9rt94xW+84t+OV/xzdKjJzFRk1pAsgZZqwqNgQyNoFYyKns2z/dTlhIZWT6pUALZYJXfHFq/FVAmGjcTLc7IIRM9iEHXCU4qFHxxBGroYUf+UUclJJ1MBjiNl6/hadmo0H0U1i4Ssvkp68NrQQYba4oemZv1Wqw4qFoHSxS1IACelOQ52LLD7S/6S/G/Rar0epjEkuZ/dTSIhkUwrHq/42nYkp9RF5zPmMObx+EyNG8tgYGG0dCGoOZnX9oUhBp9kmE7rwtSOZ7+MQ/04PHNjhmayqGOMgRu8P86P2dUm3Oxj1F4AUBqXu/qFBdf38is8BZrBEgPcLJSMY6jlRjr9xWQnwu5tDEBW6vdG8sGxxamzXpgYz2r8L42VCWjQjr0sgpKwe8vXnSJYwqTZQR3jNLJZtCjplTDu5nke+ecbu58T1H7nR+SZ3M1eRuuDn9dwBqAAkPImLhJAoHSBK+9ns024ZqUVuEDWnsT35qDy1hv1Ai9E9CgsJSPViik1nXJ+Zlas8gWPoJGyQVP4PNnNdcrQZMIOOGbNOWPAySSKkkwEPZgEqTtkCcZQbFW8Inl+q4cD83ovwxxbn3KGkE98WLYpj0jSUJaIsx+ecpz8AVpGshGf7+Y7XCySBrD5N4VltYk9NrpVO9iSgcuKdxehhGP17d1lKxMbixKwo4dGnqy7lLEskgQEps32fHknQQl07wTMTXErkAkcP1u6YH7qDxc4yc9I8ADwI4lgErUPsE75S2gLkevExGQ46OuTST2u6MYI0CSeO+d7VCs6aH8VHQfMiBmq8O/NtBuRsAt6HsvWF7SKzE+/CjxtDOFN+oot7QNGSOVOk9IYz24LNS0fBt0MCt0PRGdjRbKVPtbMap6ZSEssDSggm3YuUlC79JDSpb/mXsoiS36/xBwEfti1+M5cxjEC+tdfFqwpyeGkQTAADJISZulvco2OYN1BllfGCPlzOTCZH0opXFXAdlMAcg4DVOFmEcZlkaL3hsGgOTdIU+qrz6HAGpzPuBVHIiQhTuCd5ANG/1hnKs9c+5Eia7gD2CQBZSwpWqA9Yaa0NSMfmcSbOKI1u3IrJkJ+r0KYhZkdCOhE8e/s73iYvADf3ShlnGSOui/+2YedMWB3LqW8k1tPTRiavUKOPw7Az2cM2z6Az5wLtaXXvli5InB8tiRX+DczDjg2FxKqLsCMnR35FhLIywhFZT2SnJTKkTTqjmfn9je4UnKnAKj4cxYLwtaiIae+WoLNpaUukjjmw8sen488w6Yl4Ab0e+BnxRlWLaTQ0XlKku8u62KxBeh+pKz8XsvC7oBilM3n/o3uKDDh7ffKWG5PCVZiHIzwHw3e0nYGzoexAdXRDHrjbDURI7u0inRaZ9w07dPRr2797xl3D1v4KgmS91rrnqoUuooo+XK+i+moeI7jyMKf7ivypZtRsDuAu4D2fYetrZlSJA9ml+Vp+0bZURIFzazUHMSl/KrYVedwp8SS/mTMI0Lw4ssRMXlDH5HNWRRwEgmLJPc9LgMx541UbzhAGc240OtI1VwkGJnGAky7I36Smi3Ghtlj3fcsgh/pXOtx3rLzx23Rd6mB0p0A5xAmgJvWVAE/lVTi5BdOYaV+APQZTULBcM2jAffOs/bhK3J/9UqhwMuBxbMK5ob5e9uZo6WYNwu3QnKwb0zTYyZe2BATjJ15jtYezHlm23aB7e5cv+7IjRjU+jRKkFpzFIK6B+lZoIaS182i1pqOHzlr1hptzrP6aYZhb8w5OR9yd56pGn4jD4OgyAs4zr3F8122MZXzhC1s3RYtgF9xOuQEIttPK6x+NqVfhcPr8F0uQwDUSUg5OlRzy3NcdmOD/Zu8xARQKg9lh6d/6ShJU72NXX3q/QnDEMXH7oTx8JD0oxdJscdV7j997Jc1DXEpIHCDLRv9RF4k8wbcI1/J9CExKBFgD4LSYtGBa4BonV9ihj22g+/bmNsFRlC5jU0AC1O1BYX2l9g0iwXR6cbiQP59zzorcNrvAupVs6zsD8WbHEkAHGvsO2ziBRYwGHWp3RDv7kV2UCVOPDFyHsGhHpU4HxBzzQDcrkCcF9uNieYojDRZpu9SKXA5fFXNzAE0DNE9FmZ0+WaMOyC4v2BJ3+H6jVfwd3/jFf9OvOIfC0wmwJBRm5kyCVkh7Qp3/0K0uGUSzV1zDJ7PxGUXg8RsVWFp5/yZabTPUayBBnhgXxIiAaasIzjIcLzZLPFm4mXw/rhxIyE2RQ46S61fCQOWVdkdC2A9GKqem46PgcWQ1A81eFZR/Somq+7Ue0Ud2G4iBcjcXFFhjmQAN07tUNOWu8vvf1fllmlbbhYA0LGx/UjQS/Iikv9zoKJGwOfA3ALFgMiGl86A1gyDDEAvAGKvCPxmF/bCQN36f/F6z2IRpiavLCZh6+MNWYtBo00SUhiFY5nBNO7DFdPZGUYDkMXAF1JizqQTLj8Yq0v+arh/5TXdAH/BHwa3A5bazwgd9WK7IRJSsjjIBUL9TrKImkl0VLZjT2XXjgjqHWWSefAMwClhs35fEEzvKFMOYzsotT8R+qIJfghgGwINcCeZzLvOMgO/LOCkFdaQLkh7E2dRMkj6umYJKsT5EiuJSH7ILG3SeXGN7izgCCgBA7Jh5GEvAJEclOsQbQBwmgbLAFWw3ikhKcEuEYHvCynLQlSA97rq/KbEAAAZ1FeN4jPAovR0QFUgSoDQwc5RM8MdGuLbqEm9qsjHNd/ywlxdaExHV+weMVisK2QjWRTJtqAExN0+/QtTVX3gGzVa8FIl4yWO+5CWgkrGk8tdwGQ+m1ieGY9MqYkGTDWV0lWqeMxM2ezMFNcjqdJiFJ0ywV3etypS2m4QowIeXRhp7zOh82Y5bpmUIDjAcHcLDohEQtDJuYPAkAXjcuIDEntQ46y0nBjBBZ9fAjmfSEasDurwj9rThqEoWaNHSOFKRjyRCQAc1lpt4hCMuAcPduTYjj0bYMUDIGKT9vXMIxF5BEQUdgtc3+G7mXgCKOkR94Edzz/3wNiIQmqC1fQ5cPrGvZgAtb8eFa/YWEgQP9lFw27GN+Cg07nSxh1zJGOWx7HCQMQew49iwze4pidTKddvH8+TcUdL4rgo96FJzfMTY5EJEc+5A2ZeMjzDOvFJV6AZ3IZu9cIirhZrP0xrncwFyP1zoKTNAt9YMhq0CdKGxUwWsVc/S5GFopBTIEewuA6b3V9ENusoiQIJPzXrsy7ErBilhOAE4H+jXe24sfAD4t3BomuUjxHx8BWcpRI3EH+XBKQkagXoGHI9vBPrpL9klLQlh1wwc3864zp3ryRF8CeGec0G4jMN2E7Nb0PL+QWgtu+OzQU1k5GWJ/zdzRhjIKWsHLCcsWBF+KJ/a18FsJvYA3zcvgFLdn6cSb9LYva7XMwzvLtaEkh2KV8+vWfp5AuwmpgFnBSg9HNmG0OadX9eHrFZ7nEmkSl3Vr0c6Bk/3I8ichQovfeFZLFT4NVV8Wa3tYNzMHOGk8V+yXcLlFzxeV1L8KZzgXjkGUcBSXIuKxAAF4kwh+oU3AVjxJzePI9xjtPGAix8ZlGG83BiL+Y7CuCCSXqDhR5FMiL+PQw5i6TnNfNsupbfS6BfEDGiczB53X/4LFuGl8Sbsh7sXnM7Gbj3d46O15E/m4PhdUIjHs6ceUmcKwdj7PjemuWEBlccs/ZgjqRfckNC9um7XCIjOl5m2NnuYjzfTYHNxl2oVAfk3+EKjAMVd6VkFcA4ZMsL24Hr6PAbdZa0bWAAQnLYOpwy4inHZRsuI+IUi5koAOq+n5K0iDwjz8J0VDejyKg8PEmzrlY23GXhozCFsC/OjuI4pTD5jJ/l9tiYkY+ARdwEDRUHYaEP4R0M6GtrqZ6kDwX8kC5ssDzzKYfCJnOna1NKlTcTWZC8kLOKtr7Z+QME0AnM/VkzkhLIpJ+Pu9gb/hIsuTlPJs5e4oQ/TAFvkL4lY9PnLVQ3C16xdoZAlzDcOs7JYetASQQOs8f8yi7S89pydkP9+iunJE7JAknkDW4VC4tbSe1XDHSaQpGKsSGLub3bI29KMkKqrWznn5oZTCmpLCLVqeN+pZHGiYbskXiJwnzzuAS5AfHTDpJO6Gly5McNoIsmIpSEdaHaScZ8OR/GhiK73C9Z5Rcs1sYEeKUEndwQJTm0ydGjQG+Mgb1LUA4qr75RADbejWm5to8+MoiKpSSfp39siRcOe+PAmMrXKyTsP+euxDuQJKZuXDtxDmWHnjTxhMpLoX7k2RWCAKUF8E+qrsAxl2KAsX/OuLnHKMLaNK9YvUgxEHh1Df6oUQUdAr+xNWX3Zj1fjX/wj4OM8U2u33jFb7ziX45X/GOByX1zOF8l08k66WqqoFuoUm86mQUEGkZVM7OFUUxqM6q8ehYK/kOw2si4AwAzwcoAQ8ntI5hx10N3sBj/nT/rTnm1whVSb5RJFJkHqGBQgqGwbbE9Vnhct6bu4EckFu/awCI5dDg3BELCY8Rh4VwUAvyfUOFsmGKTKRNyM8MP57BiPXLhlnUgUJ8Fonukk3XsOAw/zCtIyyTVotiVSV4OkM0hZgbg2u24RiQfVzFsRsnBLPiDIcu1AEw+uUHtk5J2ZTgIaF9QwEBZrXCSM8D9dS/UYDW5cdlH3Es4u426pz08IHtpkAGof9dIiAEGPMWy+SKJ+Ksv00XHmImuci2XbSafAjyH52bRh/8/xoCaVMHTkBJ7+zCcKP39Mr+hWxwpcs8l8Bzk68UWm3hV4iAR7AyjkIc7XYF6yJDEOXE75lIooDFDIZ/Tx4zCSnRQWY7JDGNtqCDu4exMkSdqZ7Bus9jkTew5gkNcgJCf9MqqvzvGWHGmDskLsZLc1J0yFGTqiQiupVUMam110LCLwCAl87hiRproxgid2fPMjB0Jj1J2w51BAu2a1zvZ4thLMGXg8hFBtUTwyGA/z80bVu9q7Ikhwpkeue42irWU8+huB1L/ne84Bq/mhrHnQMx87juHdrvW3JFvcxnle2a6i/RTvpGdWSTjhI3IhEFR7Cjg0KXOxGQqdP+I5Gnhcs546Lr7wvQ3A3I92DGFHfJsRvQXUhhC3yHBxpZkx1wHrMNzPX0hJRFE74PwkQyfUYO94VfZ/h19B0t2nSvDXfrGWWDcPgFZ2DkTbaRMancsn8HbmdIkUS2BEJtG0oaDer47gRT6zgs3xLuF3SU753gNWTXs1GUd7Fiuo0Jx65FAxGySa8W7GoZBSlOBGQDwykQIjpTVcLxg/i5dae4ZK6RhbsBiL6g9JRoA4m25Pgr6re0DnjKuQ4uB15IW7K44SQRcv6SdA3LY8F99EWgbLRWUPh/dbepu2B4ssX1110Amx/6G5tDUfJ8zj4O1tIIq4K9gnQFLyAQ9Z2bm2bXRXaMMJ63iGQBxpgKcqKHIfbm3Zr6IY++r3glA+93/3fst51FSkiSTaMpa0a+lz52V3Xt0oOsoOA/ZCwwE+BCgzA8IPuefETvGvY4G2C8M7CgYXbFN3uollbX8vzAiuXuFAXJ/YaR8yuDd8V6DJGThC52+mDMtDKb/t2oDKS8yne8smbiiAtvH3vBXFSWKN4KFHKoOV8hqCzLAOTMJ/m+TWrcbxzkov69VzMxB1WYDS+4qhqla2Ry+f4HY4YS/wUWpx5TjQu8VoGKkKt442k+jYwX47uRO0BLIGRbJCzg6TLqI24XPCp7OYmVJJwp/1oFIlLBg0GDMKpKJ78h8zKBYIxjuUDQRMQtUfS1TIBJqRNeTyV1MXgvQ6WSUnteO+FPEcecyuNZ8lFH3Rx94QnLujjEFe5Hoo+L4WH88gJCthlvu8LULc8UcAuUaf8JY3AZxnv/H3rstSbLjWJYLoKp5ZHX//4+OdGW4KQnMAy6kRZZkz9Mcl5SjIlUZJ8JMTS8kLhsbGyV3Zvm6VHXP7zVhJbtHbDaQWoekdIpldwXApTdrxrrmDpn08mnXdWEchD6ZLH8f/jqexZUAuz2n7RmRqA7HuwBjqOd8urLrsou5MGmSQd7nONjXP+W4/W6gNOQE4+/FF54x0tLZXAPG+rDbFZu7b7Z9naMUlpYbmrMJFrS06+fxWezT5ccsYzL3yEjTiWqsnwB+4Qln4bGwjgCAwgZkjMebqwo5fjH/kLx204gjAfjCPP2dX2FfdDZ5dbnjKwbFjy7Mrx1v6p4/bX53HrU7gmfK5sNvcVbKn25bFPlrkQvbt0pIJT3Mfa4h3E/OT8zfnOJ4zjvCL54nVSny358BRUo0YK2Qd6vdJveddkmYjJbULMxjjheS8rXOe5N5vWzoi20PFWVu++bVDRfxwD1fIXknQg2zH247z3VpOb3bY8aN+tN25Scc4kGGiNniUN3sLeEv8jGn2ymS9v9uPAYsq7jx59On1WEeZIEogVQMEGC0uHaR2AvwVemTjJIPBVjZJSt7vowP6diRjFsu1/6dKPTkedtJBY7plnl54S11zjkZBuO6UB08UvL0GQPqYlVXisgmdFZNCUUSqLY5N85qFzNzi+5A1VfbgjVsk/bzmt45dqT35ZlDVL6ROOY9Ad+Fz/i8ta0XWVyrlIY2eG4j5i0Np2UlRxbIo/9xNvYnfOUzusK8XRevWVQtZVac4hdDFVkTtZxhxqt94+IFAg9vLGOBYc6vTj4qfjpiHb/alhW26vr80d3/A46/8Yq/8Yr/cLzi/yKgrFFV60T7qEDup4hkwtFtzccA+Lg57QcAuTg5zilVodwstbqPOaLoArSup8gJQG+geFgxZDQfuiB69y/No4W2GZtibB1vICHvSuLEnaukUgiJviVKr1TZTqoN9jHg03hhKKh2K9mywRozpa40Bm1a8HTJyn7timBD7Q3cI1KKOUKyUgmBvd3FlY5hsQNkZkt4lSSFANZ0Gs/iG81yVIw9nyWCRqDbEdWTmSLAFUw5c6c0jC+duJGMlJu72jTrf/3iyWDx8khg3bckSxcsRMCvLS1W9/SM1uQ/79vZsjjr2PQ/4Vg2WHivB0mjpr7lBoK1m068bGXK7sQ6k7Zyo9oZfX0ywDUD2mSIl5TkZjqzz0UaDyud8pRrhB7UPKghliFDWWu0ZV6cNoahHf/JsokeqWv/XgWo+akaeljf53BckMFOzxOrz+y1Kuy5HtXWLsmAB0v2UDFFaLshvnoAZDDOTomG7A7qNVTRwNxeRibv0ixPwyQ4PjI8kz1gttTYYzBc2KAYblkRd+ldKstHDja1z8KcRFv0M8rG0JJT1S6scrU2uvJU+1nco9nxbOFe1y5WVsCmv5H1K98TfN857O/YUz9Nf9+INVX60dbMGWGzZDZhwooYwZbFKUkBgO5sFd8+am39fKuE3VPUSDS7CGvfFiFjHWzt3blWUhFmuwvXBmgGYqVdrIfdzymUxB5MAFKSKe0weShAvMWLRPZat9nBSR0BNAyGVndI/UsY/OjOyKRKDp6qX6yW3NzSXyG9YNj1f/pZv0oGt2WJUlIhn2vd/1s1hmaKIDJQ+ZTR8Jw1sAOy+O57xOeGjz3ax+OCiq2dj38nJa6IfH3I6Ur65Phnb/ZSv/MEct2dqVeC8XTyfK3VKfW9LLtj9tFBPHyC8LZJEjJ+juyQeBCFZgWYvq11gZOPBoAVtmliDl/o9t1OM/LkAFb6cA1CCJtZ5ytiQNUCweP9lcxCyFBdiGgQfP5Y08Oy+8G9gaczoV7pFyMxqRUJ2/845xmLMdbAj+1ZNGIxC1BFtlxzBt3F+GvWUJI5yi65R5eBhk4BS61nKvbQa9+x87iMoTdmxvcBuud4YC7euN3h4zspOhJWN0i7KHl9Ux9Gd9cHO10k49w/7j/08yMOqLxAuBGChDLHN2YXQ0eDfCKOL1AVHva1vKy6mbP7zUPGaRDgx5fcrLX457U4CyW1VwqpiQJEXIkZTQ4TnbGH55aV+ymHi2eOEe/wVR1Kori+KeCgZ5K0LHCjAARod8ZL4dN2HsYGjbCQb1whtaUpv9PbcFUSX6d3Qnq4A/4GBYudP5ydaOaQ8kcmI23eUt/xGMQesbXt79HxoHlPQsywiO94g7IuJWEMRqzVl4TAkKQe4M7hEohx6aHNAdzQ614lctSRig2ChqzIYSvcvIsK6oqNnJeRNsJNNrhDgG5VgAeYIgeZ1Fm571Q1Z+o+VAdL08diqE9fw8ih0b91gVxdZHIRhi9W5lHDSFkV4XWwvGpG0CWTJx17kRsf3ezaePJx4Y/uQm2rD6xfaHa1FHgnf9jcn3AYF0iAiYm/Afk+j4HkOwabCTYJdjDBtzprvpepnQ9FfLdzD/GQgtvZShELnKtBWw4lF3qI90l9XE1i8wZwlxydwWl3o/Mj532Rcblt0i88fJZyI72YuVZfiywYxCxpCFBvS92sKLaYHcFg/H4806txgDj53DN+85lpzoL1Y4a2JBPa1TrfGGunUTP34tmO6G6sLOZ5Aaz27JlxvBlanU/5d+aYVjfMg0uQBZswGahH2jBn8QuVSC0jn3rjVxZ2sZ6RYhpzPtyPeT8p3y8qOeNLwKLYFaTYySvBeqtYNvGSAhRrNtjM5+hch7TaX3942rQKoctOdA7inuTxkr0auT4+Y/daSXfN5xGncpXpsxIKLS4AACAASURBVJ+JoD2H6cylWk4yfaXIJjBwSsTVzBq1iFc8O4f4jBtKJShvJc8pjMIDeQc8eLyKIlFEzrO4rt29YVJCZgcJs+bOs3P0PQooZ6JnDFpF7pqDguwZQ8eYmPjmKDwgnyWOe8y24rA/Z965O9aJ0SXuVKHJx8PwKtpaxyU9I0dGxxJqEf27e0j3E5bB/UKQkPGywbLV3RmXaeeXYSas17+5cGG0JL8YnsT6OXKeVY8OCByTjHGrgwoPubJ6ri2Z67GXxGDIxn9/wvE3XvE3XvGfjlf8e4k8AlBoWZBiQ8mulJcul0MnBuqy9RC9OppgB2XQDHmZvZiKjTf8qN+wgznrFklFOyzZizlwYImbzwVmR1fFZu492ZYcCUIUOkLDMQIHbfA7vrd/Ny7EohBDBKg3v/KTNaxxUZqo5hM8K/IpUcCYyIw5KgNgXanSn3JcR/1OfQ8KhG0ESgnMDxZjyAOkMboqMd0LW3wPay5n59foCuyUg/0mJZ927w4y924zlUaCDuYXXxh3gzPB3JuhtSvKWA/F5H0EGDUgtJLQK4IXEd65Ue5m4XoapnEACmkAjgDg6S67/dB0bYmYn3BcTqyJg6UQr+X7I+Hogm5vv0ym3VFerd3slfB97JUqNhxnc8U0gSGLpDp+YBuLfcwOrIrdfAY411GVp9eE7oR53WgGzECza7uN23eyJ2z7Utd/L/aASg42eRVwZECz6yyNaICO0XqdrBuLDsKRjLNgfgTgUDM+njF2+7SE4zMcMvi7sS1bY3c+HY6gR44uuZKQulDb5tX84+GGAzi+o/bkdUnOI7uwBBemX7tIO97JLDzeaz6DYvCLSHTJlYadeoOodoCSbUtEO1AzeactuNF0HOtYlcFwkG2gf9DhLiwiuAhgtwKOWENSQUBe+pP+olZdAU2jA/EESHMMN4CN3/1eKwlS3+sW9ACGMyB02VIEBFNtr32SQbNb4zu5OtZM/WYBg0CDP8OhwoTwKNEH11JC5u1jfV5YDXBM2G/4/uxI23Sy50IaN4PEwzn5gFuUZWufnwv0dyQgS5rZ+4x9P3ff1sHOLb/kq69F3XmV3JVWUBdDMYXPxG8HmatZPIgx7LM9vxU16j8OKRJ3Zw7l9a4EVGn53gp+TbEEIq71NBAg/jDGYE1v0SAbG+Y5Y5TuWvCy2ce/M3dy9AOOlfNs9IjX4n/3gN/z2BZtz+9QBV3FWIt/d4wlEQ8tYv7F8gCcJGM64Q0r+ErVkX4VmegkIzBaerfe57A9iFU0uq/Lz4hIYPP/g1/7n+5moSmPs+VRXGGULKBfaLLcrNGDehISl1Sxp79wJyQEteZazX0rvtfyOL7TseWc+CUYp81xxFKMS4whCWSnr1oDev6oQPj2GNwb20Ghun5MeXT2nim7VHK4uHwAqJBxdcfGv6Lb1oXh0S08POQM3YzLL6z3vfUe7mkz1U1NPB+5Btf63jEoun1tE8Nmg7f3+uokUVLz313xH1S0BRC+wq5agY8Ro6obrLI5Ti1RXwk+1vqKl/0RY6h8Fo0+/o13zufRAArNPgk9dRxsLE2pnQKCigS1PRcdz5UMlps34WfYAQBKEHLE9lQf8+tgzx4ggxUQayixFn1tW6Pk/BXCb3Sc2jlLntMO0FPm0RkGUW8ax/ekAZr+d5m9xtRmgnqr11qDdICusdno9fs8PUti2MIzZh5moWLhVxeO9egSNQ9QTTLXrjuaRMEUV6Yb6BXnAhg7TuvOqGVJGNJkPVsWyPaTPG+43mXNy7O3kkRX0N/NUerxtmth+rMk8hrgLqOeM0qA3UHA7oIs2R0VZ7SNnIhWF1QzMjvuEo/9CMBQZChqOQcjAegotgiSxQhlg2YfoFdes9sdzGQi1JKay6DXoTyRRScNYNBsT5zVBJhjj+5z13yFpbtA8LgxcsRA78UkqkUn0EZszCxjzklLT7KBpy5sJ1nU3dE5WeHIUTYu4zkfMeYsSj/fwhxKUnzhff7hIDM7I3IBrsNvdFwq8GqiSMkRerw/d9yk5+jiV8z49SA/XNkRvPJH30zMulzVMmH1UMZy7Aq7c7l0bNLvkxfVuHIjHbtWvhWFjVCkwK+WgBooNc97nhK8f/FxeZBptvT+9v9Tq+gS8YjjWBIYyE6DyP1nzmPZUb8e/3XJ1c93Q7QXkqD4lNXyx1fZadtFXa9CQu2h/HeRkm71Q8qxlEUmpf7iKdkcnwiyROCMmicLvBDf928+GLUnXUN6zKzxcFkzIpkkEJStqblwoaTiWZx89Wa0P5ObvKbxUUyp/K1+f2BJYirZ3fAhYfPGelEShKjgK+XYkih7dgh74rdF+JEck1JPLwhlryymhX1VH92NqfMrVXniv4cOsP+Ozk9VdEgvglm56FK+et4jzCJDs8AN4VcXsMci8i739tlLD78r1kW8sV6RK/IchdGfcfyNV/yNV/yn4xX/tsA0ZYUeZwUDFUy7NZskkOo0qjXk79zI/vRFkTIqk9cmqeQw1vOi/ajCiznW4G4FWLTUmuvsh1KyeiFvUufaCVfdg+g4wBFn8EW8xZmJR8je/cnQsgZXArSACOqrGEJqkIr/N71AMqFqXWtVYLIqifcHxisDtC/EU6pKKsmYDZSYhKZlXnbenwHbADzXTCMTYMJg0e3isgNrySLhbZYLhxySuQ2PSJy/gPQl2p0erb19iFeb/A7QxR2eWOLaQ68F7mCq2OGEdS0eLdk/5U4NyJtzfeVwQYFHq012OyMSFAcYmbDXu1vCBnd+yFESed5s7pRkiN0MZPGnJXbq/WsDMeLB5Ijqe3xncRYtYGbrpNX8CgmnltEXf+o6mLx7nU7x3rftwD5YQnuAqe6LjlkHeRtnWVlEMP8HmsH8FoOLYALA5maZvDXWZTiyO9aiL8yPFtXCFNeW7lQJeQHRr7bow0Hze5Lrd9jWOVc3qiOwgFTnm8mDIEypQfdy7L/B0ixcSjA9w3kHI8jk3Qx3JWTsItGM43oGpcUeY801AjGPoNEvuKyGjmZbsmb7vSVbdb3TYVxBAnBwfYcl84HKrwjouDCJIty0Yk7s92dcu3Oui4ZvhJtqeS8b+6JAHDukBH7G0R1VXhIM7+CTSTC5Ys3Yv9gDzUQICKZbzs+LICD67sxnJ00l69EAdfrAfb5cVzWpUd78C5BHygsgrKOwX8OLh0iHM+474T+TqJIXWskCiu+DNwCWtp6QRgxG58VKKVt6/47WYQZw+SfI1rT/YIQpzFoiTK7sNqC0tnniz0RQX4ycGHL+B5Dxr48kSB5egNrV97C7k+cRvO2j/s7E+CofkMUDP9hDEJJsoS/+HZKSY+Q7cmRas4bxyZCvfq5xUuNaGTTLQOSffd3TI4XptHddwLu/B6D2KyQAyOCsgbDUrEb5v4Rl/78fbjctPStrxxdZgOCZ3BqkHiOTSACsmc0+OiSPczrd5RMJTjLufBeyyhaHAlEQHsQr7vBmUfk4dMo7MHphFGifUHLtnQRxi5gTdKVNWYr79CbRVOd2sSvj2DbRZPJorHhLnxtgY0Iirs3eriTQsDYJBdXHuTQVrHYsgMO19r1iIb1wFRtP783+c6hp8Et/R1GudMM9JE6LnVryJqE+kDkZoaW/92yQLK61UHfEVz+pJvHoAymHq8u49SsT5ovLB+a/j3jbOq6otTDY7HJLgDTSiSwuyE7IlsLXOwtoEsWoJTOl88I+1KwL7MoE6c0pNfUTDuEBu9vWFTlv/eGHyybLuDISOIDM0xdQfkL7S+Yh3Ri2ztBLIxYs1vMBWteR0xHiNyXIS1X4CTu/fy/Wcl1wFk88LGB38nSCn3tNjHOmbBUrXOLO5qCbsqLAGmvgKYlIUeSIkz/VCWJfj4qBxzwkEDQKOOxutoj79rrsnd3y4zFXFIKVfVWhJ916+aQA7RbLq2ujAJEtEOUS+etJjhtGFzAswXgn86wwHMCi56fKQepyZ4jxVIeRgn5n3tPF2P3c4/4V8ygG1nNYKXemc3S8XIOeXW9YvyNPnNqSoPHzIZHtP0wmWQ9AB4gZLMTzLYmY/wkOEbtCtUGCiV8+WHh10akxiXEoHDT7PPwMTkp0VsyRgQ/RnVr2zLSIEPmWr9X72SWY3aEaEUWQ4TUjN9+xh8y3Zx4fKhW/wq/K3HalrvmY2yIDqAKZ7qKUER0QjqXUdyouyCAK+zAtZwjnGpv+3kaKWDfPFc+qCrdNhitCW0rBxXN799frvcxTknYJbzOu66KrNnJkl35hGRN8N7njjdqBQrnGXJgktLww1AdUwaDeVV7Ay7Xll9ZVOVnGQe4sfXfhGF9c9fd35gX8bvtkIkgwPDApWf8Z682dNR60pegzBjD7UJz4CYfaq3GWKqw7cM7qWB6U7d3N9gZmgv2GdgdLFtHcugF22Ib/tYqqFGbhINod2bJ23NZlKhl4dg9oxeHdsVIobUnxF9kpS1UeBZaIO4SW7j+qKubKyLywcqFxRjJi+Ay5yCbadykgpX8JnE9q3l522S2i0GInGM7n+zeZh6f+LBCETVl0l71NBtFVP2biB1XMBB75DnlUj30UXVtH/krgriqCJQbwXv9kjB0DON+5DrJooVBAv2BcLJYv3uqJlRpjZofiUFQlO29353H7zRxhAFWUdUR+70KHzra7+3lJk8Dchesg13hiJM7PIhn9jVf8jVf8p+MV/xbJuFGQi+8Zi/XyeNByUmRI9pc71Rq7h/w5IpoyBBF4q8LS92b5ONzp+DeL3jb7zr0De+XOJHZviscvniuM85MO5jqSKPF/hEQJhDwEYNfCzw2kUXCpgYJirz2zZK6+3+9R4MBFtdO7GLbipV2pK/rihc5iQ737t5+xX97tV7btgpoFWw2n5OiEiCGHaxsTN+cpneQUkXO/dzeSvEG+01hnoWnFKFmIe4zvpFZlvuV5bIAaXtm6kkd1bvhpoAsQknRuwRiWLmbFOZfcAcCbRYW4APM1ohNDja9shx36xdCqsvfrD5YTMOTNVXN9OsB8ZZCdn+siaDpbtZbX+DGHX5FQHkanjLB1wGSQwdpV97Q2W1CXI9EKxanH3Yomwi4A9F44c4FxtBd/Ol73YKEaxV7OxMZ24RcT3gezwT0607QDwxGF02IHea7xrk9pp9/NcMBalkc9xeQEZg6/FH0h/S7DQay1cPmmpHaaxDCMUGNJQCHBymJ1CzASnXgGDQBuKR7jEvB0/jVUspJwl39uh+NAJv8PEZhNBmJlj0bYTuhkJCRb8pp0BLtuhpMVVVjXh11FSwYqJRmmMbJby8xC3iXO1mwYo4J5jQDYpVnxy/cMjqZJA5KUVdWZEKq3MXJ33hTQI6wfNuD5lmBZFjA801/EHLoq9hn6x9BJVmim12wF483J1ggWSbD0zYyZjBA5TvHhu/J6ViYSw8EqSJQNymjpuJ8nEmmAtP5XUExCamDxQm20PwZwv6i5J24DT2C9Xy8PePRvzGvhs9b4dv+jWP+6WEYykuL37zE4Bzl6SvyIKY8Pgnup+cxe7EAQVnW6talbXawNf1vDQNMGmnansRKdMP3vqtzmbQ85ho2KDMyNNcFL8778HZGA9RVoFBfGAvtylj8gAeTdHpBi7NEc9g0Y/8x3kl2YFSCW1Eu9/yFNfhnrOux6+cPv7sIV7oMJfDX4JD+IvRrdAr8pSuCTIOpK0F9EudSaXVqyBasGi1o9sw3kAggLzaQ61k7tj80yPuP5IVnAqqKUC5bxWMSZ+7PuzjeW8lTByOvkJUHGuJ+SOpHoShCa5bjkFZInaT9Unk8SlQfxquLamkui8srih2zwVRaklEj9lcuWChuZ/EPYjy3JWmvrd1V/mLbXxhNDnUJayUseAyZb6gRgjrWTCIdfxzlK6idi23gfvw4gJj4TgCm5j55+lyUzET5GNKWB9Ds6dkewdB3v5NIPksqCkABDKMRO/Mm6RMWAwq0vZl6bT+HpGDnkxi5eHYPG7MWS7CCf28D+kH74qw8RZ8jsnEU1B4RbzWisrmLtwh9kQaJtsbCO+Sexl44akEymx74ZDr5CTnzHhRuoKmlc497zC4AaQL81858G/SyfbwBUI8lOnuQhiRiuXGzp7Ps45LfjGlUV8zciZC6zr8nSrg/TnP2S67AKcH8k/Xfh/qccmeRzyvUUBLeQkhsdz8FT8uLrV9oUw3JdvXXxlgIP6rx0kH0RZLm4V8Cjw6H9g4Vw2ZbSyqPiYcm+vgQwC1B5q7NWMGNj+Pro+/seu+ixTNIEOJ7d8FGp23a3pPm+qqi14M9in4igGW8bE8l5Jqgl8Ed34zsX8sNmMCkO8gQLWgTsf0XhU2ZXLv0gjzYTVz3WsDsT6XjB9J/9uSpc2qRJfXUME+ZVcZsAknYogN5lN8psMkFJvc+r9rV3gRGPLg1bli5C9owxEWR9cdsnaBWdR2dunzYyL/R15Dbi3oXFOpbQ3Q4K3KNi50p5Qr2kOrTWLExGeFVh8s7cxHaXxpQDzGwpptExYMgjxXp7UvbrXt/0nB3+Ede+9v2qeJMDTZxr5JwVuxPs/tVDzIUZUmxGYxnO9+6i8TgHsteCsqCGuLvi/msXeXV8zOhyqhYk3Anmz3NultP2bmvMvVoJQrh5Rs2eSak//VnzbcOG/bN9askwLbyJiZFPh40JuVdhWfk2zXl65F4s+w4+C6fR3bm53ie9mJqNToLVRfI0F0rFJPZOAdXhI8qKOQ7rRZWdC8B1WcxtgEOJyLNYlDm6e+FhMGq+RDsda/M6DG5PWcVVa/9KWdIoEk//P8iQxjjMjHvGTG2wxgMtzUcdG+9Kv+naktN1qNLSrUM0Ov0dXCpWEih81IUiGUlilpXl5KPgqR2S86Ev+UJzz67MNVV3J4uLYfbOWO8L4WboxS8e7LE0h/Fe1opacZDxRxYUMtt2+JbVmNVXWUyLrqQowBh7pmdKUTJSztDjWWQxdFgq2ggH6v4zjr/xir/xiv90vOLfF5hMWWpcI36yNBilEnIOINtBvR5+tqVKvKBVms5HK5X5REfprEabecWq6qA1zFm3Qc4RSB+AhPg7Am+XBjH8ZFrxDcVCygAmOrDI79ODrRZXAtK7gPG+T3343SlRPCgx7YdY9mvpw7qzU8N35bXbcd3QTAanJBdWAH9/MHgB3lytcbjcWwqmGQ52CBAehZQYshd65tUrIplQfhZoHPEvPBPbOxlRxVKdvljdLhhyetH5VK/kaU3IlYU6d8/BX45bSOVoAjFPL8aFYLzgcPxEECxGLc2h3x0073frSA8F3mtKdPVGqtvLt8SPOsQ4ZwxtUqi1YWtGySq2FZwDdVeOXZJsgw5rWectZ1OgU31PudY2vHV4B77eeyH0g/+UTIxAKIzNzPfkMRsqC6QVGJQMRBUyg41HAyIBIuW5KzG7dsFqyZ6tVg+lEuB8Ah1M2BHQVwoXDL3emb2fqlPpt2xQLgIsz2xgaybvc776GdQhaAOcxWQKcCXkEWzsIHn54mW/8qdiLZ9tvvEPleiHY5i6OolDLLqbAF0XeEjlxVMwUOuhvuRQ7qWTV32d2QHDIh2/XvghRvDr+UMCC3iXEoFAKDoIr1UDXMeh0/tDDpkRaXcV8853OkMr/2DB9H4BhirBZyyf9Tn3IhLL+JaOeB7FOI7jUy5sM5Slwfh6rsOVpTUjooLzsMcRrI9ew6MSKQHvwmFevXtoBRCgrWVHrPKHPn5ej3kyodlt1M30xhooczdWBvuqMQNlJQsGQEbKXWmCD/XoCzR0GnSKpLBmuu1MdNiVgTHNriot9xMxNOj/jkGbym8VrnyXxUoFYt6Zxi+7JPt3/lfv561ZTj/TqS90FROnOnRShrWS0JSAkGPOgGgEYm9fWCagdybKl3szikQOGbRKWCWhfhHUtoxc2cmYj8GPOXrf5EVdaWeK1ILDkJByCOC27MdxEwcDr+RTXOrPV7KrEiiV137O9RPDtixLKRYdgJPIBq29fJJuEa23el6jJIjG3tCEzEPZX2/Zugv4zj+t3t9atyZAPhuxXaxXYh7Dcmcd8ytGkrSKxev2tN+dwCuZZ+abfb4T/pvvUeDBHhZdNl3s4tG0JTqpWe8VC8zLO8hYFqBlgSYikdjivyMJO2ykjfJg+X0R3pr3a0ZJRrwi9cKWMeWMg4vksDApiTX2HEkxTJyhX9TcAZkWrDiJJDiAvMElL5YvFjeSyWu8vYin3e6IM3Ql0BigTuUr+6H8jEOzH6F8qOSzD6JZ7Dc5bUPPZ5CtH8+zSUICSLDEa/6Hzy2h1TyxAlFV06lXYansc3QOBmHnm/aXYlWfoeC8+F4Uk1qbXQZaDHBRvN97gYQFmoNZqjWYtSTL0i2PorrjYb8i1rkOuxKzba0La6oa8Z1V55sEKJXgTD0X0zjLM6y19h+9AthJ4BGJvEQTpIl5UqmekIm4yGDxnX53dyadb3kXLXYs/VQxdQ1qxpXa+txvlemmLQj5csXzHpcvsIm0LP3O82bZOjnTe8tXqZ07CQMyvyILkQ5N7hSeiKEA4c3Iwe3rmDPwwzA71jBk1SByML5ptmbF7+kDqlsIiH/LQkr2zQG7mGhmO9dUKBlLsWAUL/nmrrnTYxf2NB9qvOaMwcdsckJ1Xh61SlxnsPEHze7Wlgt3lJn7MECluI83UivAhCKAVtGp7r1+K0TqttypMg5ZJE21CrbvlmvLwx55ZpYhY22vmTnj6G4TfHXOtcFoqM6psS6QwkpKcYMuFrzkYWW3VHX7yTgk+CU6YaLC8Y2MyCtLeus1ry6ySe5BSyn3uteagVyH+wrbQ2BCa8wPwBK/GPwGpWdNFVgaZ9zxyv+knuJHPqAce8hGEFN42LMu//pDd/gQR1+7d1HkWqA5L738U0l1Ftmcf7EVgf3F3Kl8DmsXJMX3HGcT7dx2H957ZnskoHJUnVEAE0FMOl5S2TNket6fKY8MqlPB2UXpIkFVfWlPZdm41FA/ZP83eH9K2V9IyNhS3UrKukOibDlUV4D6lrg6ZyvWip1CdOf2nZOxaPzuI/BUUWBcib3sFxidQ7m+x+5ub5u1VhR+ZI83WdeF2DswDrUEvQW3IPRcS1ta9Xv00/kfpPxJ/CNinEGQjIQNfqtfPYOpi2ZFUnMH/9p4TvmseKqZv4UEdBRr3z17z//VQf+1x994xd94Bf/ZeMW/LTDVMEs5gpMyoCUooB6SeCK0MVQJvdNo9YVGrSthXlFRO1lm8RDLwCqe3RHutJNxrRuL/4sXncUeoQFxZx0V/tQcR1gjKuyu1l1WDEHs+WxPHdLgwe0jtNBxnnQ2zmYBhkRbLip2grDNwga6q4shGKDWf1cv6JGQsIjAMxbFvehgTUWw/PPVwzk/A58KhKJzx3ml1G8+YehtlpvWIGZS1bt9IaLMMRPEeKHr//RPjMpC8qTLvdvJR+ppWsqPuXuQd/PpTHYrbsmvOLoLHCuaGAEku1KCWZWttcTcqkgSRzDpxLJMleumihYpDyNyN5vrpxwd5Hdys/U+K8jvWUFHcU3kV/8ZwLJNslqTNFKP/L7ulvxjbesRWBc4UcN/lRpPGYbUMktTS5aLjZRsUMKpZRDgCSgwdku7zhz8udl+si6Gf/W1V3I9vIKcpzvf1BXJokyBCtJrr45kah+t98V7F/nKIEUieEsA0aQSLz+YIfsddGIlMZR26EDn3Ul7HY/k7Dd3TIONHuzC3zmoeSeMQ6QLQv2e1xdWiZPDqGJPAnnDBB9pQ/1VZHRsLFyDwbR6KKZwd7Ab7cTG3VIvOkdoLUN2RgVjyD0YM1OcmfIge+BsBKHFaJRkLFgyMof948O5/ohDQ6/Yew+FfId9LBrNAOgIJoRcHxVU/M6kJIHUoR38FpMKbHdDoD2DAjZ7swZIm7FZHh4FQurXPO2jSF6ThbyHSAA+ef4IaOKzeyRe3NdqprJ/2Ic6xLUTGp/RNRonyOe0JmsU+WHASu1/UuZkKT25YcWzkwhvkZYdyP2lIbMZezhY4EFYqOtdFIP4lwlP79d69sa9gn3ml3bQ+0+RkEoTGug5pXQ1JUculGGxltd49xq90o6+jVYGHf6dQ5v3bJ/LSzM/3vHdsgFKWNhf4JPgngbpJIYOFyChDQ6YvvGaz5jSsaIrisSQhf8NrNbxZ1z0Vx7RP277/Xwsrw1IYSuKH/k334SPV1X+MUdozEMAvuaUNI6vgrbLL71xA/FXz72LJCd/6Zj9VuCt83SXbc05WASrsgpBWEi7RDxLsPL8OtZdgg4JHo92NSGPVb6y3OdY3tKxlrFnPxEPxXesgvyJjhcLuOs8xQeUAOdnkrNeM6Q+JGO9SHp210+RqUBCC98d55thJfO8AasCemTFcNsoAJY8RQcfXHbhMhhjMMya8LNKykYkWKXA/f6vSIDNWK9gjteoPxNDl/C2zcpVVfT9Yg6yqCUdEJQqV4H0kbwKr9zf/x0pHb8cLElh4hPn3oCIg/B75yhHd9bbI2ZW3yzJn3MoC2+ZFM8BybE4MxGvmCOTPQigaccsRxeCecomRyFEEGwIK7vTx1GIUmIfLr2IGegHuHN0eg1qhg8NxHvadMjOcAmmUwlGKiGfHoDhYiRQNRPikpQhr892Al33ZbR/iPlDGScXINYgQ63fYvIqc2WhKqWA7gKfqcLwC9ybSWs6eY9DSkfI7pySKU/QLCXKLJmcmu/FfYUEuAA+PyRU3D1t+p4x474HusfvbxnqKELvRD8+n2BDzrcRfYVv9iRnicQQbyIPGylnGMWj6Bqra/LrCgk/0p443OwYIuKfzEOqe0SuzgjUfiESktHenY3Scz9+ylGFxSEp4uqfQA1EnmppO2otSkpMxxo1eoh9fm+J9rOMbqb8s0awoMdeadIqbAD7qG+LXbtIV0otMqnZdGKnjJ/2+9z3MMF+RU2FdxbZF4/sYlXbU1ZvlctS4EaUy1d0SI0C3fcwefe14eyM32QdHRZsgK6UTkTIGPIz33S7GgxfZ4uAbwAAIABJREFURJFBRBkzCR3y7MJRg8k0kXWpdexWUj3LpecHqht3SVVeGcOqoyvep+vaTL4skk80KCMaccWv969YBjmvS+zVUu2GI+9XIBtJKFT77pyTkoQ/4yIfoSaT99IdT/lMp36Dv9K2X4gUKJjYBXfP5PsRh+c8Yf3v/O8NMpZU4HUUk+qwXDuhXrL3RJ9WApurPLlnwRSI+UEyVXaxbpNoXZ+j8Loxqdgv2nlHxI8ptbUs/eCWt7IhgX97WjwB9Zs7sqDIdTIvqysKEmx8/7KRPtTb1z4eBYSK52VoF0w8Nm/HZSHjr9nNu6Hw3VVn3S02zBszqdlJhfv9WcirTrg1rg8yQPmiLjTYYV9UY9/UOUTA33hJfPrq2PLusCK7J4SYtV5+zYxblWGvndfI7N8NElDEH7N6zjzivrhXzTWUBF2zqMccUtVh8H61dO3jgzELi87pq/4ZG/6I42+84m+84j8cr/i/iv2LLXpiWgVdzh4W78dp8kddkkGq5AXtAc8iEhJQh+bnNjzx0M527Ug06mJicTx2QRo79a3jLVGBit+XPfhqfyBn/4h3sKEuUeFm/x4SmvCOJ7vAeuNXd1QZBVnBsghjXbJ5tN6yGdz5UqYeWvh1/QhkYLiUZPTQyeYam0V4FrP66Y0tRxcyLWm40+4+uriI+7qWsOX2skNqCOL/K96BgGYwGBvSMXlYEpvxtg2SF5spikn0Nbkn+8+qu+M+Ekp410DLZA2ZGNcqHfLvXVTJdkzSUPVa4Mpyn7Z97WchO6D37vp5PliPP+LIRK9YJc3MkPlHEFB/qmA/ZETob+0ENNhChxCRaDiej/OAZXJ4DnXcs3i8C6/BVPFcg2QlPPRWYyNPVhZhHfp/96M2yGp5OaDFQlL7V6GlJ00rsS0TkslBtdEKx97cHTbNQioHLVubVnh66HGwqvaw3zhGJ/A59TovvmxRMkZ9YdeD2I27dbFyyE0N4p2sACjxPStBSIcVL+wqMLR/8x2yNXUPLeFUeryaLAxNWxZg3iKS2recAww9Az1hau43ATSkHeLcUUx6VbDgNWTRYY14dk4wK/L9nDaaAnvSQdmwBkp+zpGdqV2QzaHDLdEhxLq8PjaFcUHaJZE9m6oG2wqRyBZTev+WgsjH7LT4Xv5cS2B5s38Oa9V+zSuArARLpP/dSZuqdHK0g/M6114HcsxpaDYK3nvEUmMfYp4FVIHZgl0nwsoEHAPVC/U35jQjsbpXDuiuOz+QGcVVAZNzmKblddDDntcYXFkweB9dx+9R0pIvLO3FBVjOJKvg19Raii0eWQa9mZRcOJZMuDnyRS4Yz2wqyLTdYQmwZLUcU8UlqspIqQmVtYF/NWZ1MT77/VrbK0PJBLjY5HY1eyvAkPj+PMCrqdvG/eVHsZULIauiz/mR6giXjP3cgSeKPRYRstew9ZIf+ZegdAPgAPg7hl6T+8APwEckfejKuIz2NQWSesWi7lzNRttrLHLYmQtVe8C366Sd7OHL/gUc4WnN94uUesgYLrry87qTWlvkqZaUGYraCbYX6BzguIpCKQKw+vlEXJlAlMbafeaA9JXiknGYb/sgMxiNYiFLkxu0VtnQ2YlJxMR7f0fcaJDswEfeDP3CxblXDgDO4oYZuClfEhIURRIz3YmPJHmiQQv3kPRqa3Kz7pDMLrLDImUm3NFDpqGSRUH6+eJX2Alx7uDWM8X4c7X91ccW8/28slNCMN9G1JzaXynVOTYOhNzFo9Yj5zmdBgP/yBuW51j2KlLq4UuixY2FdQxWh1gAqkIUkL3IURWLy9xASK01YBSBh/LNRR7zvivHGSZJTgNHGL5QYZOU2DLYdsSCotGtFPMJEsiVdxQm+zkGgDI75pofe5ySgvSc3SavvjL1Tc6aOpPcxhFvg1yVH2eXuoG2YkPYiAAS0v9O2ebOrV+O6/GuXeO+BMze4YOFlKP+hfnvjHHAUs5QEsgfMxioRRwSi9iyiybHe1N5szzY6J0PqEDGrSKGpw+r3E9ks19/6tEFHvejM/TIeXqm6i5ChUTWSOCyvmPRHZrFzAqNS7L+7MJtwiQ7BjSdjaNEIfUPSVhs5+ZYvyRPiSrfCzWOEf50HfajlFDMq6PQ+5rEvCUgR4HVugEvcbjbh0YcdfrRqUKTitEe9evqu/M1FWlssNnTxx4dZNyE5Zwm9mB2Qj48fuvBR+QbYxl2pUJG7XvXlmMyAUZ0tN5ZQPapB06ymrBRMcRvskjgi9d6dZxcM3JUYZQEkNJg7L0yyOHFZXtOG03AqXf9DTUXW63BmO6CWobLK3JEJq1ecciz+58ajH/lkTNfthRSYVthmysvyIjhwGC0cSwI2/0JKM+If2stNeiZPsPoTgxBmX/M0LH+HcfdOt8vH9M078MnnvbPAlmOj/jCjs5MiK5RlxUFS7zjrpLHWtDStKLZ+eTOGtt+L90+V3RjnXpl7uUTl0C7rsS7rqFoJgSzCRVX2ywROjcvEui6cncKuSnKB0a8PA4yh7hj2WVUkfyUbROrwJZPqa+95tOANOGqMqn7KGyr7HlS2phO+Kx6LrPVrugCQs3cxLbigCeYUnZE1Dmr9T0KQ96MrDBFjpnkWqMQqw/s6Gccf+MVf+MV/9l4xb8tME0HW8EGgmzjREKHMFfbS/bC2Sy33tIRsEu2WxXt5/+D7zyB5paS8mLXp4GTkMS6bOtEuyd7tL4jDikLtdlae9NMJpozfr6ajXIk58cWrWSPHHZWwVK97Prk9GwdBW6HSuVHO2ajODsjtY4BZG3jWZ0Yfty3fTjKT93LYm7t51dsuzsSUY+NufLvR74LcwH5JzVYugozt/0D3BMoZxeVfIZWbv7UHMpX68Ar7yp8e4AEK7PYmJE1+JopuSDRLsx6U8vwltBid0+ZDM8ArDR9FVwWy1ZvIPwXl5Rc2GaEPslIvoyP5/ITjljbGgEObKDMDnPuyp7Rk8+X3zsJcqhPmwS7zAhWah3FOLvT2KrDW3/3+UqBrbulOrHNdU11jmWKo/C041msDLzdpAtPmo4n2OBRxI1SYRjM0CatRGsnCbH2dmAkS2MGUhV92qSkrjMxOymKLnG++9KeG1HDziv53gXKSqh2+3oxweMSc12ZMuv5czrULHrxtLNwW1jSYv0wvC7RZafAQwSh1ypQ0lgJRKwjINsvbwXDJRnwKx/NJCJWc+nC6W3SrFy1dwKdBusKOEpCuiBw2Xh+I58PEnapoY6gB6WD3UOsRYK5WyxZ542v/8VPOma1xZdEQ+4rwXNOiUMO9zXzgw29JQMupedFkEnz9Ilm8BIBH+AbLIYEmT2ALK2Ke7IU3R25ngSeT8JGfsyk7a5JsB/bXwm8THgicsN0Yq1Pn2sZKhxK6LFsYyZ2dnFJdUV8x55ci3f76AtxC/1hnbx6KUaBoFh13hJacX+v7kwGrALFzXQ0BDQKlsMVEUVrqCvAfA7bHOf8Vud+/yPA8gV2ZYI0HwbK+3JoJpoyLc5/j5JAqwTPmViQQ6Bb5lUutDqR/aEmEZYPH6ZgC7PFHMovX9GtIfEunxWwqzvIWC1X9mgYqPscLnt0A/RcHZnd5o4DyeT9KNj8sT7+2iPmWS52l20c2vJR11TGlYzKK3w1rgkQRCGov+kcts4+zvfxdwnIBElF2E8oYhlDOy4ZKCI5n5NPtjPEtn/xhR9rbyF7DkRvd0mfYQEqVeLFDt57RqLv710eMgUAFgFPdrEaviKJGmybVCCW6sVaVbiri32Fb1nOzHl4UQir+Z3a4J+V1NU5ayUCVPJW8uuRoMT9DdZaOc8m4ubrPZgjSUjzRRFTcsRjdBM/Nzc3og9u/4z4LYs+D9EVEgOHNZmQwbw0N9y/mDlnAjHkSn+9ooXplbMEAXwZ/p4pSZVAjnsWxUD9fbAL65adu96PTFQTHLQgW4g7P2lHQayfIdIAfXXjmVwwi7D3GyPsbxVb1S/cqytm9qyEYlYOswYcLrk2eEnJkd8MLXa8ZW4lvS9FLH8DTF6tmNAd2pq+xp1zdmPnJadL0IHlDJ+V7y+oYQdHN/2cJWFM7G71H9fZ+vajSFQuHXfGPRXon0C4z2bTY/W88vxeAE4WBRy0QUvFlvVgc8jY0k9pxw3kgKD265MQpv/9WURTwf2/kmT1MK9at0mykmC8xvFijc903PzdoMo/TXI4/AH4EBJOTWJq1Y54pqGMGX93a0g9L1tNTIsO/IrxRg+mlooV5ogCIwH6lmzS0q98/7ZnNfyQY7lHMbO6rFbaUN2yWE1CE0E6fz6huNG5w7v2UuVaFuBWzxgsu6tbziueYSXCR4E3wSkXej5gXUuD4plzb/nsUmqBE4vozzcQmzEuIMMP2fD8fVuIP6gqUxybSf7LuTdBmEv8w27WeDL32s+tfl3l6j8Ps2arl5Cs2x0qNa4snS0POVJ6U9ZoG/F/rqdl/7WwDx+UYVm6k+JXzS4TY+ZenqIY/5VXU+TUsE3RGfKOQrEIKr8zXqC7j5ctzAuPyA4CpwuAw6IT0rMyEXm0Npguplnc1sh33aMunOlGzEUu4JZ+xy7vDGW2Go4c3dk/CbN4kvi7Zf+SMD5C9ilwGovOB5Veu4Z2/gAZ+5zE8iR2di2t5i9XF/oHvm2tYFTS7hUmO85bYhbMR1zA4Ml1NLs4E8WW6Kbe8aBJSk/m/dX11fiHsTNkqvvR1+prd18Rc8q2CS6hzlOkD3Wa7ORFyhokQSeK1pFrAdedOQr5LBZ3Sr+aTEZ2YNQsste6W9Ek7Hh1Ls2Ml0MVpnK06jz8vjZx7E7Z6aWBi57dWmZ7XtWNdLHtlfZhHLOtv/1i5N8vYJln95dHZ7vAW3cMYR4F4Xv+I3PFe6u/WL/9xr4Go+2mdqH+O2JTD82oPYgjYkzh/iAY/ITjb7zib7ziPx2v+PfR4cqAocDLekxHtSzawD43riC7q8J3189ugd2HnkNnO1g19ryZ3SZbaYn4JyAardeeMzyFT9+8F3X7MWcHmdCtr+swQJ3v5xfdvX9TGC3pLtjWQS9wHOsXYGrxHFX3rCKh73nZ09qS19CaQ9pA+DiZLLIdZR0+FJ8F1B//5hn4eASjFUxaJtvtOGUzDKJjKYPkbK29ntFIxXPl7+dMLlVlPO2PWWzWqdlE3ZnyAguHpP60LMzloAyEF5sOBayAkzQdVOhvFrg1qSHFtb7EDaeGrH13FXysKoT8qdv71x+SRn+/2txPcgBFsJ1oMaPWNtJT4a7vdQBH+BN3kFDZhljDBphPhgzci0Fb1fzsQvJDOpINoC0Nd3AlPcLdMgGrJCafv9uxl50qvpbUCVBqfh2wA4iETNKTyVswAO4o/moAlWaWrbaZGEheq+8ZXuf1y0YNQ/YuwY0qllfBFSrg7x3fl18shw9wNYtpMWz7YDz9MS8q32oDpfG+vWUD38tawilYTmkDVtpXmTjhWJ4BdhS7IFgmJQMq/f+yICtRQLLSVvXNKq5EGV9tz5RX25tm+fi+53g0TiRwh637YRJ5db3F2lr9d9LP514w7WCvsNv8IRKJmhN2TJ0E833vrgjKVcyNbDmudV2NXWohe2Qahflek3/WEuXqjttTfkL+x48rkutxS5dJd+8ighQLpZJsyd92UE1t4yPRi4HsNTtvS3l0AbtuSOoOdmG7Z9fwgGxQOq70BCArEWUD5GMgNdi0OutMmP5m6GANuNO3z2SxiluzwpcNxMpfrAAAV3D9IAJvPWIKVQ0ZjLRds2RA85oCPJPeF5fFsNuYMfIbFU1wtwbSX8d8vH6b+0/67qTgTHwL9LucmBnjzpbwBP1BEnkRtO3BzDOHiwJUNd1FGyiv+7xrzdgmo/xZRJcD1NtHPa+QApW03yXjUL5w5aVFAX9xB7UhWHx5lv3MAzoQUSRBCBUBSfihO5x2kjRyrlJ1S0kyAk2jeDTGyKDfj3k2Gwh/rJTJI24sMomYBuEGQ5cxEKYE0ARE/JLSpSozE7cTVKb3YcejksSO/L16Rk92ECl7qH3suBFxwhWfn/fDPV8Zbz2bZJEknclpnzx8iLOl44HftoLF6xbzS44h5Wu8t2yS77hEMK5rwPI9EJy714CWzrkektxUjLHlq2CrHHgV1hwqSB9ec1V/zqEYujZA1HNYUaqYKJ5EEDM8JUGWfO/khL0fbviYZQQZg+efY0bVQJKwVeuhCCTlQ5xg+ndR5fQ+nlFArivJOLA+C4Ghd5GCkOnu2E9knySusH/fyi/lTuiCYyVEalnkUDwTXhnHTLOjY2G2ndldjudc3+2fIt6sa9Ggafftho3Z+WM9zEGCAxlrRZcfTAlg/LVWPgMFf/K9XYh9J+iSLFUmc5RU1s1cIfV41e/M2eSnJULNFDMqxt+Ah8pkFHiZF/yw34WaoilLXd1z1dHi7twTokuBjhVVFpZAlGTRBYl5JmF7rn/J/f/qQzF8hq2Hw7/aatLoshn+zPdW8uO+6a5/uEoWTjbYGZ8vfGJDKNId/b6Z0LUXeu+k1U7b1koSHWtLfp/9feBKyZveLz3rgQrN+0oiv6trWj3zUPt3I4YMeccd67Xig05aFky2VOoo3OfIOSeziYl35yOScztCp6NtQOaOMirH+sSFpH37s/EdqU4oYY1n2xq7IwbDobssC+VZWHW/KtwpEVQ4zfLVRMzborPtGldLMwV35Dneez/ZTMIFTyWV6KwQ1lpHcT0xhyog2ifMJvIGrTmGD+L/q+8/3u/iX8LKv/AIf29I3YdG17Lnuyn1lH9JbDxnhcnO4YVt2/Hj3SeJuPxGH23XL3JiSa8NX+VnUi2p5ZZzH7nFuI4sKkYuEAVoQQpQiVty7Zyo8Hax9bEPdzRZP3L19U2ya90MyUKRuKHPnt45Rg7OZneSnkQgRngkRaNAC+g5a0YI+yt7lEEdJeHpThd84SjQjPRlAu7Ko+XzV90gUwIsHisSNVur444TmTKBa+WebOnoNzUDyNdiJQ5Te/wSCSl+WyDGoPK58M1GxhsOZ6dRKX554klASismzqgbJw68qcsV+b07n8+D2WeH2l99/I1X/I1X/KfjFf+2wFSFJO9ENY4nwe26vGaRHeC48oqCl87jb+OYvtvmDGXzYXanTkvMNXePI0nUDqyXVqLAsUE/f/HBjwAkHabsz1ha4df8HE7oaXRdkxmTnVLiV7TOunPJ5jaUE9Ut4M/bHWQhGKM7kc7hheG8VRVbu7AUjsBZYxeA4DPgDRYroNUVtOVTdIRT4jD0ptrdHJfVoiwNx5Cn6CSqc7SURExNzBjKXRsZbGgPDFuqvPKzQ1KawieeeqGmN6+VwIh7dMeZtZ51BHZZWPI7w8UHT5fhYmC/CAcduv3jMBDwxawK/Hnv/CzHspIBNvLCF557reH/NHbJ7C0DKNcO6OTNQ27wWkvQ6IoCctaZHRZfzJZIHCyN5zNK6q4YK8mObTmfSgSuhSxJVvIeO2mVeIpslicpgSJ9ZRlMhskWlxj0CM28US/WcgALr/VZ1F4rmudFBBnhaM2IAZQiPczVPX6/n5tLM5zJ70/xbq9eOF9r25Ng3qxmYqmtjoQHr3Y8qwfgviE783bwufVUv1Z2EeV+FUlxn7y+e+kG0CI/Aq6WUpE1Ahw6gJz4p0xK8y6iMHXt82gwwWPOWyVhyUhMSbxKfmX3Sef62OARYsc8lNBoHevF4YN+xFGs0VfJQDYovQ+TYDibWRfz8QsdtUa9tfSbyZYdm327f3S3imy7vUQ3weFj3tweAFsA0ZXPv6Sr6tzjDykJYXS33RKCVSSSkqglI5B7MIO2iHOiiPk0KSB2YgxDp/eLjtEgAmzbP3zHAFuKYB72ZktSlt8x0S4uLKU7Cs/jrckyBbCSjszOWUBG7KXLYN1p5xtrvkLOMe+jhpz7Y4BwcyG9l73fgQb1HtMCGpxhCxsV9Ebh3dcXJb01xeJ8CPiLNVO6ocHUbV977o1OahCoQbfMFzscL2CiivrKuZE0k4OfcizV3h8RWEcXaNT64z18FxFC97s2tDsJGnoY2kkEYv8SfAa7mrRZI5hvDjCaWKNpkzwLPiiYxzy6SsoilfEEfDNhtxxq3vtkE5eWwGAFS7BsbhaWcocQJZy0GQZyDy5Rli2mO19VNMn4SM/4ktkswRrEHqoK+Zn7lDcgurrbhpQc8Rlb00BBXetV7chH5/MqlqgGMBP/fnW8e6Ve+NSFE4ULk9FdCe/satc5er+uMfHU0y9p6Le9GTnXabK6aNIzWddGckVGd55tTXjrJAZP8E687dNlcxOHGo/19s8uQg/2Jvwl7tjImQsYxs+awxmzKC+ckk7c8i61ry6bPSB4lv+whUr44Om/0YwRuyuno7JgrF7tVw5pYSHfp2QSnh9KH1d7wFUaNC+gPI4F4i0DKbJN2PQYyxzI2cqCVYJDHu9/9uLO33fn7SExPNSQ7JiU54I784kCysTA613vjvUewC4bgNQVYFwdV3YgrEbfdQP8YoxkcGv7df2Q9Kvn4AmE3XNgI/LKhOsCCNS9Fy+/A4xVbwWLjVRWZ7mgHkB0dFLMfU8pp21+4wmUF/tY8Nbvd1OmcryjiPmucHWcxYn39emT3VMmc14NzNYzNK2Omj0TRj2L0bI/91MOkcEazruK6rnMC7eDnHvc34hn8bYCyckZcBXvxKeMIIB27tt/X3G7NsAKJ06V6i0m/Wdcif4g3zKwOGce99a4/uuQNNdMyEQGuyNrA1Ilh4g7akWWCN8x8N6k4T9e2LKDOLJzAGfgmivfU9/AHNXR8ZT5lgusu609KH71fNrreO5P3r+yMQd10M6tyl+t/tLGc+q/SWpk+eno1qiPiRDyYu3HB+/EbSqG9vF8gLS9t8WQAcuuDxnO8j2Nvahwr5p3dbPKbh6rCpnZwWjcaeNP9ZEi2rpeIZULxPzriEWH/VlC+KsPzYJI+NPIefZhErEbnsV81ePftdL+7GjPI+P5/oynTLtsQL19hTtkB2WVV5Z44wHum7xZHZi63lkMB9HRs0ZqPbmslul305bi34Tr3Wt75t5xOVG0anBbZnZwg3OxPPOnKqRIyBdHvjfb5w6P/PKtWg2OLFu8/rCrgofP7Rwi7EPLCB/YyhzWXcCdo9ruABK/cN5tP8pOXL7t5TBCGaBwwpz1AvnePYnKmR8OJpoSk/0eHYaEz/W5dgxiL8gicuVKsapiPMip4CaFV2hgRoFjzi76el6/yIXJ/7Pf0yqS1I4Jf5qc6994xd94xX86XvF/6W+PF70lJuLmh23ncrki/kpQNIN97CPwmjloVqnFcqZBUMyhehBqzpMr7GIPlqpDqppPAvEf/+5/fDZanOuhxAYZdNlWZv+5hoTt8pcz1ms7mWyrs+EIsTGnO1KdDhrdWiIDy2Tiyzyr+TDy5YntuUUu0U20bDH+B8T2z+V+DsVFYh96zXdR20aCTOqVqFqKRFC4z5TXvFkGz9g6yVNzHpLdwJXgUFXTFUvG7nVdfS+QbOVsfRaJoqBla/rFxZN2/9dz5Vp477VSrY048N2FgOpmCy1+IiiWzbL9gKpWVHQ1wZFwrD/LseBXBkY5w0elN/hXdywb8M7Epb6XVeNy4vrfH92ru7gRb/ckF0bi7D03Z/Li8tKgD837yyLA9gTfpLT+S26i1lh25NSQ9CuLJujuHAqQLxODNOrDiUQLkr1doE+2fmO7gDJu1BeSQWQ5u2CJSREAcZdMFvJzFUStX70X4Jul1U0V9xcBbe5ysY81LJJOupyYblZVrfsimXQClPdYNkR8D4Z/5BfVfl/zzIYtvsuJDkP/CAjVL66Z4NPIpI8sKKoGI1z+mb+Z9sBWB3STi7kWESZ+J5aTBiGfQaWGpqNtcDnSCNK3/MpI5r9Xa748jKOl9iccJfnS7fXptd4HM+TONT/QZvCyaFBVeTMy0dg60q9Pt1LdrwV2qrUkKWKdyBTQqvZ0ErTG5JqV0AJIzmrI3xQYFm3xxdJSmdtGmm8Atw5fXO3kay2HL2rd69oLlj5RFc8uDNgMoQAx8ysYMCADvACV9SOpKomd3YV6dWdgvIM4Hq0OvDfgHdTOZBL1sHvdafozLu4ZAN4aaSP06uAVdnJZPmCNd//ZZO65GTV0Wb6i2KsX5s6wAiQliRHawbUubVaT5XVOD4AkAIvD+GYb/HAg55i5RgJY7x2E5aXlDy7C9PTjNf/AldLX/gmH2sX0PQD88u+QYxV6H5SdU2hN+kt3DzqAzuj8mZbkCntvW03Ny4TbNYgrPrgTcHUBT8akj9/tC6Q6NNGP7u2wYSGNKiL4CuZqJLI7hu25Pxbd2bF9N0jhlWQlNblYqQCSUgeXhmT0yuRGPIpExWaFIGOFhExM6VRVxr2l6sx2X7r5m1SQ68RpZUx5sjjjvsv+zgS64fEAlvNs7ad27L7lid5j9TlLnutyZ6Zfr7X7vp5O7oaBrSAardpT69XgIupIFntKhiUkeAu18Y8iUZEcap9CSrvJqWEwuXrGVcSfnrYeoiimFLNO8dREd30wd8z5YeWlPCQKSO7OU7b49DM2yXJN+gR4u/bcl2GvBLZo+37V3iRys4rtpQpEYtHll8WqBg3/SBLr76ooQfqqXcDw/W4PMKw61YpEFmCx71jLQ+c+3mWRouiZI9fGq2M2wxMEIcmOkmUO9l84NLsb6G7uSgxFJKVZKl578zuTcy37br8w+e+8LmFeuae7Ne8kBZasGi1tLPoEkdKDiHit8A1P+vKXNQeYKuSeuKH6xLPTI7QdJiKKZWfAXK/9vMeMfePe+ehr3ayXZVwozCw2fc2agfXqGOhxj0HYboyU8rIxei+qjZi/CWjKHS2NPMTdUbXOP6LImURL/1m51TBLxZQAQhrogs59hGuvx7Shl78RK6nO+ccsBaM6aeJL2utBfcfAeznuwqVWUZHNHjaCWCmy58q8nFZ6GRJgarzmjMum9DmvBa8scDzH7LSSOhePLh2o7RCz1IrIaX4lqwlMAAAgAElEQVQhfmUXV2IvbJUD1YVbyLeuUmkYzqyuCrRntsLvjuVKFUX55gmXmQXuV1+3O8zrYTcmboURlwdRwUSwjIfcQ6bxtItDZM8AR7t7sRj7A/COQS+eFXu+CcquiGdh9ooOrcUKyUtVlHeTMAR2sUnjO2K+i7l2N+l2tK18p2pEPPtTtv58JyJx7mKljy6aAX/G+H/pkcogiakYER+8LAoj4U90+/AR+cqlINPADL80Ym7ouKDOW79Rtrq6ZsWutDExCzz6a+m9q353MT7GBOyZjCqKIvvZusc7IfeZJ7m6CBAScUW9EwA9OphOJG7lyI8TX1G/oOdyFYizsTV3eNxSFjXtQBcWlSsVTYI0rV0Y+fPY+U7kJV7Ylg++JWT4Zd0hwQjtP6L4XddV1+mbsKxRrHAPSncpvVTcF829uQ9QfpNydzOK8W+JorbIBdcbTT/8TqNzywFuA54xZr9zXyytURfahOCI5CNHqxwwyLN5fX4R3V2z5RonjoyS0Es7r8o4ruEnHH/jFfA3XvGfjVf82wJTsQp1FWNuFwKooc2U8YrEE+DSF/utvzeLDmDF43Q7kpVz0CVRlPhamSTwD0rzu5KMYRejBsJVEp3MiqiOzh66DNHaDbSUnuGUHjfF+iGAZic0gC1fgPjIIo7zlF4zF7OGQjsB6B+dOOorE0MBuYKdFpZys+t6/2hetzdAE88+/vdee/EvhTsZC49qO4NgCjpjPb2Bai09xTAYg9ca7fQsk4hBdPiYGbcYLz/kE9yZ8u62uNeyPWgth7PJsmQKCpO7n0tJ+113DAF1d1iTr/mV9/Jg9XxKB30ZI533qg4s4PcoMOJXK5G1/q7vCrs6PQvHkh15O1z84kcdaTwq3r1WrR+DsSU/1A3HGjyzZSzuSJIBldchrfd5nGspHJjk5+L8Lxdk7QF7xQyybJ02Vhs7P9b1mtXueuHyyjUdsw50Te55zL5IBnV1QIoMdP3q33yXja9iqNFJjsvsds3h1p1RGhShvPdABZdtw12djearWb30kG9vxxus9WDxDNMjGIz9c8tAS8PVlKfWoFSHXdqcfjZx4pUtqr4clyv1zdd+1xVwyosr7YY8D5oyEO90dmNF8ATJcMl3PPyNTeMZxsvy/vyFZ6I70QhA9OKu4NAGpm/c2RKY3K0jf6VMRDihu9dMDcEO3da4/2qJ//Kb1w/rDPSS8/KSWgi788uVlTbG0xb8CeZ1cDagZHV6QLL/cwNxHgF1nCuZvCYR0AuEfvLJ9iY129NfrAB5VFMoyslgOhgtVfiM/VJO4hfVRu5iUJ0JKT0ynGafLrFsYtxBUc3KgcpbAsRvWaH6adJNbQwRM+PLIeyG8i1B7gh7XEylfa8GXMUuk68GKVvm1rXaN3CeLdGgVWRQ3I+5AmkjrppLYvQQYBH/CN7cHV9XzJ4ww+7X4WgLQP9GqgND/zey9jwSkQt4535ynO+WaKoYRmREbGEHq+m4/iBf5B+XM0ZKVpYf921zI6gOe1JDQ18I46M089cewo3aQrVkeO+qIh0JjQYe4oT99ljPVxaIloQshvmeD3MeTsyKWSsKGHuHkez/d2jVw4csaD3HGQFafD6BLbEMnnHwd8/E9C41PFFYj7viWtIxWNwTTP/Hh38EmB5FfV/Se24QQP8p+Td5N2C4gJeF9JvGz2XcpgGYZ7d2XUt70GI4zot3Sey5N8O3AKmxlDUspYTyntk+8V7W4KTz3QANK6QCLx88Cah++52yV7XgQdZgeHTDPgp25Z5474T9v9IVTbl4ct7SI7NBxuuM91szMbt2/MKTUOQqARYlqBufu3jLhKM48EHw9YXwlcxF4CogKWJAY2H+xU86Hs/3kH77V848eOz5kCBf2Yk/xLNwa1ufXWfIRB5szuU31QkThJt4F9KAzI6BkBtL8KbITiFZE0kq9gvpwfMzikDFIndH7AVHjMX/297bLreS68iiCZCSV+973/9J73TbKhK4PxIflLvPPjG/lqOjEDGzV9uWVKoiCSCRSCDILpLxONcWgYiQpoTUXCQ17fP96HpLEs8FDcKacE6uCDz2iojAds+CKCIMWPQgzewqoANJRHQWgkhee+ERmvJLdsWpp5R7gp3Oac/hy57cN/aOAyapkOsR2EqpFwfzJOxZRWiA/veShb03HnuxiO+GbcwKH/lMRPB4Pfpep1yyA2NlkdUwI3Z7FfkOJVX03IBscH5FMqUvqwHOpq8GYh4s4j8wWWATAfZHdbEj9rfFWfiTbIcfStJDLnUF4PIH/8MOYDV/L8/yMT6YB5jtYIeHdH0NtbOKcU5y49YGbpFs++z4B+doZCfNAH1bAjoyvuiq3AGMmj83ct+YogXAFCuf4e5YhTOMiG1gUxWj5WtmYwveMZR7nA9j4LHBXN0WMGJWc2IylIeJe9pgpkkXsUtm3Nt/m4BExrgGiGDsj4hvU+4riCJCWSfKI3EHPy1Aw3y2AK7s1gWgKnhajmSIGBurYrCUGDIHPmM1PA5lDxeDRbz5mtmphJIazTlmmb/yO212oDoxpSTFZixLoDVjYByA/g5w8Qk5CLKshXp0CxLAHX8Pk36jRYe41X9xmYngiYzrve65FVtzHTK28Xdm59Q7+MgzrX1hm8Hki6MewLM48x2+/iqiOcdc5CwX5oIuPXtRTWstI8DR5eAMrcAUNjKv6qJMPVOxysczBnWXKipduqobUY6uQnHiHa/Btbg3sGNmDedpthSjRodHEWjiPfj/JxBdBW9wfeIZkesSwnjhPUCipF0+lrEZj++9oTPxx43lUrLPHoSqsecRX4REm4AF5m244mp++QeuwIQdlKBkZ30A1gJkt1QW8M4cl/PBW5bU6lr5fJbsOFPzGPqqvUQSPTiOA7HPYs/NynsHhv2sGPDGK2684t+OV/z3ApPPQxMQ5fXsZCtglSa2KjeDuBEUAHDqqVarluIALPA3IPsRDgLuWOMrHrYD1Q564bFnbYoVTP5sjfXNBElAx5TMmnQ3KsqBVu7BdAlt6wiqlhs+Ds5j6jUWm2ijHhDro9wc711Z/e9i1xr+LiXox4wh6WJC2pcAGsnn2IprZhKTSTplJeIB8ZCCH4+cG81dsGRRXgF0oikhMI3K52T1tL46A8xZHVpE1QPUiAPgJa0PP/dGtg6uYPt87GcMhWMSU1flBAtWACzcnBeGTrgZJPTAlxtGVbMX9BsXlRX0V22C6X/0I3AyPYa8O9vfbf2MexMbIsnOwPhsAY2hmi9oMZX5UgVUoUbHLt5BOJMJPf6NYhjkzyxOFpMVyc0DZp/IDpzvtjDg0QGjjhrgLNoBdDm5CO4cHmw2YREFF0iO7YRnox1mtnv6BixAs53FSskdDcAMM35fLDzdxXgSWRV8Dpx7qotWqeNqYnhatJwW+1uLWcHB1+EQIsKZ/qyzjW29q9/dEUMWDYhht+x4FFwzzsXd65gyC/Ede7ovddOVzv4ZDHiVxc81VGu0i1WRViKhnTsKlO4QLGh0G3kyEsXg8noLJoFOmBUoaQg3JrwOYKaTd8PrhxWYAO6B7KyS8RWFQ0MWDsmSYsEu2+wps0obxtlcuR7dnf5IgEKuswjaWQCyld8UecJCdwduLQcZ1IPjCKc1wAanQEKyul0X2XwAxC+IJCs2ni8nRtc75XWlXz2Zdo8I1viH/B5LD/kbkaOTVgEIZV6RQZaWlIn5k/NWeHfjM59A+CtzxyvAqAT4H4bQ/8a3HCgBIYLHCc1r3oO6z93yjQMMFLwIorrH0GX6sJJOivf/8omnM7jW/TwGEjOYfSpgOyTFXJFz1las+1/ygW2bvukMynMtRfItwokn8k332+0LyZqGT4zxRULFEfzZP5y9v8uWRDE+i9Up3qGLTN9aTA0gAIDs/2APsr8M7cMzPWa39fE9Sxalf+RRgNDo1AAADVF2ko0y+F3lL3NPDRfsZC/i+bYHeLVPrGDqCSijcP6J66iuTcoENADf75FJ8tvUgLhm/QZ+Z1EAkcTvt9ecCqUS8ic7hqK7XshQXUSww8flcN2lVw0I763hSAm9LRO6vL5rftOMK77wASxe10NHXevDr9jngwUsWBQP4iwLCbpxjZbT1Y2HpWTNO0iX2yXXkhd4g0oy1Tdc/oKAXdYJSGRcuWXjkex2pBwy+J1UIu2N898TsPhZwAIQ62DnbBUwRhDFA45LVsWIlZDGPCXzjgtMFmQRfi35mpIRCqszKtYv/yhi/xlMRCAJNupNbkPkNCJSeW+e4/z9atC9AGurdUXvESUW84AjFDvks7ceMpUB1A1p36p+FeElvweT2ZAblgWT99mU6grRV8Q9hlMakG8jsNDVHutxSCILO6XQ/pPSzx3zlfy4J7TCVcqfZUeft+Q3DFtHgH6Kx/6gT4/ZanDFeCmBSaFSBzsoUP7Tk6muF2Z0rSRj1ORZfn+YRBfmMawewEc8r3yuWfgDABufQWJz4HjVDBDPfVQHS6atnIeQM91aTuqnmLvAIEVkKKazAJd9YYyBKbPi3fM8T8lwE8MwxxTF2aBVXUnebkpLnqb9QZoIalYzxjrWhbfEUxIYDuLdNT9hIaVK5QKuqZwVTdmq91kS6gM4AFQNqcj0CybAFdqQNr+wU2Kv5JUWcx/lulZjJ63WNzWMwHmWTjg+Kp5OifU+dHoEwJtVsZrfjPMTn0VgrXvnWjHu1gbvcv1idGwLf5Z4jvif8f6ThSWQla9mfR6AnrRlQsHoy1mAzbNzV7cbzzMAsBqh0J0tA4KaV6sdLxwltsqpHCNA3WO32RPV3RukYdPXj9pXlgRNC6KurI4V8nwUzkg2O8ZfHJKRnEf8jm8RemtMomL8E4TNZxNzak4QF9EBlUVZx0d8VrxZdCXxs5qk6TbixEOBqy65JhCdOJVY9LXEYZDnp/gDhpTufTYxpL7TwjVSkr6lZweHxAGwluQSPcBnq+uuVE0Ai7EhHsUyd2e3TvqSunFSBae6/4LaE0uEcwAVtfbcs0gbEmOROF0DtS4RnWuQBdfAI3Z2SlpLXPImx/vmeJUFF4FIFtdzuFLEurrxTOzeFeesmCywN7mXBQ520YYvU609owD2jrgg9uTA/lsO8BPsxituvOLfjFf8d4k8MxheQGh+Z7FJsVoqRAbl0wAkN+EKppgym0ZVUI8HlAnp1h5aVjrbOB+QdTAQAYquB9lhElr6FYDkB4yj3bgZW6M2LbpA5I86DCWnzLnjJTz4nr5ZxQ1GJXWHX8hVzwGaqa2cDhY1qNU2kEzMPLy39/wX6plbBB7dYZQ2sOFOZsNWjT9tQGNEosh/b7Cp3zvx2BNiBphBFC13mMxIp5Is/d2EKVCa0QD2tHI8UwU7pQI05+b0obT0wqihgc+4ZsAlh7ixOKiq2P7kQGDphGn6AHYU6lLKTVBBhMLonIGq8EJe6OGA3Tp5KbUjze1gKv8QO9bOm3k7ydS2BcBW5H5Zme4E5Xp/vTGf/gaqAVmR3mNx3UZgz8QqHINIsQWOV9baIbgVBZ1j/YnvmLskQDqlIwmlZn98pwg4AEB2MhSAYuyoFZPWj9OgTKxazMcMB7IzsHdszF4r8s8HYBZQ1Bw7ojtDatXze7t7ODBFJkYFiBVjyUJvu2/4jqHUVZCaUg+EReyvOncQw6HdHUtPGRpw0H0kPjxPn4AbbG6MZfFZncim5M4Qj2sUnh/ZJo0MHLyOCRPD45vcnemChiSoAPjwXzy7cq6Fb+CntZxX8Ty+axRANzZ2yNPw7MMbCeIkBrj0f3vod0NjDTvA9Zl7Y9Wz8midmB7dCYjgXcjETJzBidox/6nAg+hNdsQ1PSCDoEcVBqewZqkuWMHyRIC3J9OEn5/dqnYUZiceI9vjA1Q2fQtcNrK7ddEdSuuPqwPmORMPsGAdJgOeSPWEO6Cyeti08vclSYEEgnMGRYZox6Elhv2NHKAwXM6Cuh7SIzztc64L/emWlgrI2ERwlbzAhd3nYZIfN+8A1wqjaoKlGq9ZJb86DnZPzYjZKQlGSZvr29Ej6OAd4uw4iJ/zXI299UPM7S/KIdSgz+ji3pR+UQHcVl1yzzV6ATtY4tavr0Horuh9hPp3BuDuHoxsFkKymGCZJR+SnuPo8lY7kqTam+tbcoB4XwDu2JIzhpioJ8FiRZI7js+bmVgPdMeQC2RM+HH92Ipnzqv0/L5ZgHsvZxG4TB++8az1seKcmD1jR5BIZqdQOWdAGozj4R77wz9gyRQuNrZgB6iw7LNA7W0LQwnUVIEv9jHJCPzMNkqLZXK6FHhazt9MoIlJSNJDLDuY6rkZ5Ox2TkZ7xRuzGOVmwCWRWG7+fkBKBtkFZLUCGPb/xDN6sRv3B5lBubAsiSmM6j3Y2j3/Nl8wq/hgYrBt0NHSkA2uOE5xSovkvoqCALKDTH0DaoAIVQhyk2RuIq8ADXLRoWaxkZWcxQkOKmaMHjkXUMCXG78XEAm3IEhGx/dL2TxYMcRzHHKRX8wIVpSU0vx7vCqriDU5f+bdpM+Yb79KJq/UPRs89z3YudlFiJCQQXcjsWgUcneFDlvtS14v2fjEqanskLf8lz+R0tMSsdk27i2AjFj6kpaeFLR0ZRHPAKR0Nclfr8iNlTM2BF0sj5ibMVKvIRPOfXJdGEH+W3BghTQ8sjAvPw60yyeeZLoEXbc7ZysZCVcdGARQNPWty0/s2/4DY7xWO0H8LV+foN4bSxiAa6ok/OqcHa/CMgwS9/8ctk4aaOcBUmdv7dIAWwucFAHis9QrfQ5FisAlJHOciWEr3jewD+sCmgF4xsXm3N/BULZ8hwx2QEx/4HsRtyTUQdAy2dTd8EqEh2liDpN3kk3j9dNya0Te5ewQSty09rWslnksYP9gZQug6wIgsNCeXXEApdzSOXZDhIoiadsHMdSjcKvyERLt0V2dsYh1p5XjK67JAmN5x7+SVAt0zMTLFWA/YD8oBlTlTCq3V82Ezk5iS9lPH/TBqpiecU/HeP+Ugb8D1sAb5AC8xUjuMcPoWyBn6Bxr1Jxh2t/mqVQ8xL8xYYdVYlM5C77WOUZgbzjW6XGh+xNTs/vhge0ec5iyg9rq/VD+iHeDj57RC4Amfte1hr/NUAk4/BrwinznEdjYPN4r3gAi7EgEgKEDW7MYdfrFuBe28YhZ7pwfeoDRMf+a558CPut9EzfhrMANKUwrcZ7wP/asvIjg+DuQra5v4z+kutfz1Fsldwc4LLGHQ6rUopi03fFI+cHwhQrODv9JduMVN17xb8cr/i8zmMBD+Zsj4PDXkOQYWoeg2PsfMjDpTV3sUgNSY1a3ogMUOq0lAEaC146UHMhgTPRCqniwyzBbk+NzjgULNJPC87H6VZV7kVGLzvEZG4aSXNXpBI9CUl7mE+afPeRyc9ipeTLnUMUBCCAjq/VReUcC1nVD+aee6TIqAHUcQ9hwDLvNt3SDIxM6MDBJhwaCKCNlAMXZHhvvBQAvLDziWvbQwLylCnCyjO9uxiGK8n4djOi7eo7ooMjuj7k2PBMzpTSfufTfI6vIvOa/t2vmM6GDzi60rMALEsDg5irpvBqjimJx/RRLNmGyrjlULxg+yVReCySPKJIhpf7rjdlUUhtVAEKxht8YB/Uaq3u+ZUbhDzF8j/tyjwbjMpmA7QDd+B58fRyMR5Jpeci9JVleyZ641L4wGGRkCuEAKA1Uyb8YJTkPB7qDkerunP21MtDTmOfVg4zJYezg8B3M5MGfPyH5Ls6jKFABXgGdw4p1nY7VRWuPLr1iqN/BrhIDQr91HJIJ/DzBdrJ/k/nnEU2MKCY/qP4OuwxujqlZZDTqdl8seKfNCDQ3PJgRwHoE+3Q9OlDOwNX6XrqN0Fw9nlp1dAVzTBwYwnvqwMT8xvn//ZanQyZ6FsESr7MD2hzGOoL93JIO4FkWS3hEuzRlK4/7E/dw+KOXes7hE3uTNYVHJ4H9Ct/VyWc1oSIxY4LCVrJDmdh+If3Fdko6mhlGDqj1jZ3XZLPWtUZwv9AzD80ptSAieIbUyNdYzQLyWYlYzRk4glQTRQ16ximFm5Ixq+6Fu9eebOlLoDpPNudCsLCa3XItvWs+Mb6RA8w2Rgy23/G5DI5irW+vREK2AY/c13FLbWJJS5GsKIbn8r+G45nJiaCTmkwa1QP8IUsoOxGzQxC+C0A3eSFnMBT72APkKqYY6l6JSJyr3wKu32hTw5fEf5fEplhJWekgQUBVMVJyyjljicmCwQ/ZEL4e/wxOSicr5Qs9BskClEVFd2xkJFVprWTiTWk/gDPwqou9Y+VOcOSFlTHCcKhSzqh85bYieXgB3q/6LtuFRCXQb/MfwErNfxsYchKuwpel1JVtHC0iRZTKoeLDX6UTzv9PElEOApe4W+6AiBbQmX73wsa0BDIMSwm4HUwJxmgi8P0+NyAJJOZ/gSo50pLXISntPoL9T7LHePEZFOMcwJDupKjzI7S/NYb7Qgh+qr93zZAlnf98QDwSqEOWbcWgYZVZg68hi0m8PYtd+WMszhjbz8gtYvixOTDpH6aggNIHHQd2nkkG+EB3pef5hBMImIwx4jcEmUsIDVt2zVzNQhRF8Nt/SXajHT61CX9/doGDrXeIcl++us6y6iTBcZbYxnjMAnol0JQxYw3u/+AhUs9OAbzk/0NJ7WAxBpKGHQ0Ah7cLtlsVmbc7BthB1PMLEuqO4mZI/BCYDDnGlFqXVxXJEX+/ZMMjJ6W0p8V9jk4RXXjkOW9A6ugXICOGuZNoluCm1B0SXHhc0cXI3raIb9sXj+hyHLZ6tocQaDV9FPnOMLGicypnxbAHkPd67F+wcYIphPU4a09icEw8a//F+OhxAetbceE3m8IIwkSROQVHHbtJsfas9ZLEMLNe9eab2cERFg5fBJUcvB8Hg5uErl0Le8lGYhnJ+vezCLNRABlSEl6kC/ou1YVxdgJRgs9h4pCdsqo5N5pzO4iT8DoZf8Vr5RMePooz6ZJQ9mfEHnnmB+iVM2PjfFlRTBYVDH1gkTlKMDfjWH3VeyThjTlRYhG8Jy8RzFi3BsZJ5o5X7L9pzdZnzDRg1nEd5sSjOpQYQ5H0mnfq8K3XJ/IuzOzm2h5djPEIcvaVoXCTPDWHP5psm8U1Axas8rWS1Ex/702S4ErInDzJNzMwDWIAKdGX5kc++hNMbPMcwR+wZdCZNPt+tnICwE7MyOyYbbwXuzVwxGA2C68wKIYfXXng+SPl15gPxwfzZ/GZVTSJFqQsmlMdKf9WkJ6v5qfQ4Qbovd6KV3UMSxQCzTmG3B07ru8DE6/8vXt1QdXWpmB9FOLO+8n/PQm1qDyV1rO1E/DzIPQyfxVRuBu2/4fEnojL3B0Pv6pr4zUTL0vPyzku7F6SWu8PSEl5PdcAKnaM4g+0lGpyPAmxobzQjwpW1uMT85DYys/Y4d/FgemdDzhBuiMWAXbkU6ekWOXFQMulJbneUXKj/Fs+o18LUM3Ot59TtAVuvAK48Yp/O17xXwtMMgTuC5azPqIo9HABdEBEyfTpaC3u6jwe9rMDu1PSqda0VjDAfRKHVDLzpBPJlKli0tTs0o1HHUx5E95rXQnQB1AOw1UBlWFGQlBeIIByJrKr5aui4yPlorZzrkAFWDEAS7GACOZUFXsd1VJkgeF9oQPvsmg5GHKrwXPRmx8dIlEAkk5Y3Fp2LIfkfeITWYI2n/AYXrZ3OHF1fFVCCkhUi3N24BIJJodjrJQRmEx0VaG+6swS6KF9Gt/jqHQ4JjRAbcshf/LCtp77MvwVSU8yUlnAUGExL1kpBK7AwWT+0QBTdPU8jo3g/4hk/T6b+v9WIQQAxn6xu+6sgegTy43Dw2NA+tQeiukx0wL4tpbikB94P+h4eLZEW+0XATRar22OSjiXSAxRdmS2syHBlEEd+vz8blnN0voINoIKB7UCZNMkaDhHB3Q5F+CUZ3F54soCSKywAa3kcC/UIEkH2aASV8g9ePV+sg5Or9k3+Rws3msUAARqUtIP1zD8FTMQwtfjYzTYeVkMMQVglsHXA08nQ0WGYIb05Fx8n18+sCZf/7BD2jAclITTH0KW8gvJgkgnbtjVuhrhiAj1zj0AzNJJR60LCbYHQYUATVXQqWhcBySkiXhvio2Vg4q9SuE/xijvOYopSa1nB3Q2kOpOoNSs5klBFCu7TE0jYNIY9MuU/c1VxteeIad4MkYBYI0EnSKw9k6a4KjkOtld2z1AX2BnVyDAAbkAXHvfiDrlO8ZoIt0w6Mpi7ZFnR+v6QxnElm5znNG1FxwdhAZcC4BDyjM5KGZaf9EHPumfEngBoDLqvQzN5s5rVbwAE9je7F6OuQgeweNjfADXrs+aATYjuvi2Dc4pGxRfwnp1shP3eiuZYL904RHz7VYNw2XKDwdsPDB3+PQA1x4mBVCrcx/wC3QinYmgyiz2VG2FueERZ+h2eIA+zzjYbAgcL35+gmBmWHGWPR4fLWP5A2yBBKJOAipDoQ47YobgznggX9ddk45j/yXb7luFqYpVhwRXxq17OpbnHMhg9BsClI/EHgnOxfwZMeycUzl6Vkjp5w+rGX/A4PxDcP9xZs+Gx/eTAawRSVIU0pYr/HSx1eUdcdtBanFhN+s2YIQf+Fiz9bp9YmBg740l2vI+mUUc4KRiYtb+4Hu9tPXLXZR3QhokhFmRrF5BZDBrib7nQwH/CMb+fJtPkozCGQnJlIU1eA9yBtN2gT95vsgFXOmD/Yri1wOVMPsscpBKAm78Znw+zcgfySe017eZKQrfjtx0lJP6JChuaEkjiVk4e1d3wk8xlV8Esed653gPI3gLyl+UInICKqIsdCSTPHxZdx31vsExNNiERVKxgV3ShA26DQn5miMMoNxHHtxXxXPIziXrfQ0cSWeB78wJINSUSHDuFc9/ukCvgv2KsJh75yGvAJ9QRMVhEpBgJLyIa+qvjGv8EbPbFswPH5bn9nG9NYtAUN06mXxPG1jBijZBxdAI4KYAACAASURBVAtZHMiuMwC45IVfGBAVfIS0o11ac2HoDWMv1QwtzjfArswQqhrkImBiVO4p+IJEETZPlrkdAxey6DGRXTEA3DH2FzsHpc9ltyy5CMQflEpxymCWhFte8naM8EXDCXQliQkA5uvjPYb+AdYDvfMnxzlcoMNn75fIJ5w124iRumO01Rf0eMuD2BVrVeSYVaAANPaT+1ssmH+zDrk9ICkDsccV3cWaZ5wZTsnVMb4KCOMWaXg6/R4ENb7gl44CxmGKOR6RWz2p8gEywNk5ueCeRLq8bsAi1jFzdgrzYpBnRMrumAArYss8tz1iceIwUgzqvLcuwNP+wx+MjZfy3FZ3wk5DgVBPWX7hc/A+PHZ0EQpjP9WY4Saf8f2o/KKqUKWPMjOMFffRAUFIJkaBZPnCwwJnkev93HB+W4k4ZY9dMp5FoEbL9zq+gPBpmZKPPVkEBvOC6Q/AW9XGzP82KuF3mtjEgGCEHusV98m17wPAApuiwX8/OrOt+oPalyWmEx9S3X5A5riCngHiVcxX73UGoGRHc3+fMWrOz9qDmGP+G6Cv05TP9Q88Yq9c1aVrMAkAWRjn8F25Dr/0BUTcah6fKsQVxhiMe11hbphmb3PniYF1JwawYLMJsiO6WdLv/eEOjxzvGgA7hhRLrzgbwO4hYa63owt95DqVv7DC/wwMTD/nPCEEjaJpwAApCaaY1XSQdB2DakrS06bEv6rYpztjPkCFAHpJvQFQeR48smfFIQsXfZVNiGeHxa9YS4rMwU1bQStz6HMmNudSEpN6jatIUifW+hPsxituvOLfjlf81x1XCW7sgFna0XGNkgEZHfjJUp3VtXAErMjvvnrgnKFeV+wpZ3LB/+hWYsRcHvFRi46BEd3P8ATSDY6UzpPukMlBsbowVu7qV8lvnMwIi2Bno6VWmDABkP+pA07HPw3k067A7nk84H9ge/ksoGTrAk4pFOS9MwAOUa3WafW/ByCKVWB8OgB1OQYhPpFSM56MRV8YIeUybWJFL/zAMwZ+7ijWCC5lFZVyXbwsc0e2DisMbu8zkNitEb93oIiOGWC6F0tFLNlAXjtcXOD+i0F0HFx5/ek4cjPKITEHxHW61kCyH2PGm5D3sthKDlj0528ftc8ME2b8+y7mWiW3WTxAJpsAD4pKvPl3S7IlMxg1eY/3r0oWko0zHVijq/MA5ZFKh96eTbM59i1zXaGMjfEHDRQqdgwMtD2rQLEFwMigMv7WAcELcC8JTReBZhICYKcMwdu37PtjI+9rH3M9MuTP448NpaMd1+86sY4zBJ4Dxmd8pwfgO2RbyJKwlAZCBHmWrbsCDS3iK3grw4FHONmtwCgmK/f/Sw+wRxGtsJT8IJA2qoj32PNgi+dmb+kGrh+LICHvz4JJsp+BGhRYvcUKzeKedyIg2Tophv1P59lvtNT9LRZTBijQbt3Poq5o66y7VkH6UmupjYMxVTKQ1tJdGUSZvOAHaMf16vBgr4o9OjgEKrnO5CcLtLzujXyGHrJRKl24h7e81jj8lsX8hbG0pCfze7zEi5HLjsj8/PBXqaF/fE8A+BQib3oEu8DAKW/A8/yQd7BfB7nE8UxNXw+/ZgB8YMp4e1YZuMEXfOb7Gyykm/Z4xtm0GVDtBBMMcGr1510fEdzJcIiFxnAlRxOPnOWYYEEEVwAwrIvsDNfzfb+KsWNI9t6z9NhPc1gchMB/1h/vv1zstgCAPb5YHFFHzhZkYP9zwAUNHfsqxlTgTWOnyQcz1I0iIakb9iEvktsv2XcKlJzAMPogACWlBRzY9diAfAHw0qh+2kf4rFjfJ5MWjoczZgIc0x41j6cs5YDj73tOZscKQ5J9Dqy1MEaDJJzPkWQNznASk9KjNlk13yXvGO8V//troPaaz8GnnkzLYKw9gth1vXFFrKWGMpkyr0RvnFSBvOc+q9OFMrozMNDowN3GuSTCl4yjrlCd+MeZOCwYhulz/D+Qi7HmJV5xTYEHTuJHgidJU+mZNinTLFCbUQzrPpjpX7WutgLm44h5WHSTw3dnwmnSifl3ws3vthmxwcrYNOZaQIEZjv88V3M+7DZAskgqfB2OAh3lr9C/R8ZVAWxj4JGMRBEgSCYZyxk67jDvWTa8HgDyJ38igAdDmx8y4xxucIFgcsxkFb6GzymlJVF5kohjjME5MXHdy6zuRYL/Doce83cx+grNDDZQa4G5Aer9HgEwJiNUj88HDDs7SOInexjjAhH8JQP7imcxLwKIrw2tucTA/wh//nHF89Mntq3qUHJ7xT3MM3Ie4jIp+alY5XOkclqyiLvAwBxIS/qRecF+u34EeZO3w1EV8VOSJyAJnp/x/hkCmuGRObM7iyLSoO8Sh1QnzM+w6ZTOtmAN17mnC5wxLNjqSE5pDYGfA9Md5infn7FhxA0n4C+GJMVWLAYJHxV1hOrs4/Ma0usrO1QY+61iJ+eNV6DjGU8mMeq7TGVnHVHlVn85/z1sVsE2z0RN+nHO0gFi34aaQ55BiDTSHSOlqFzg9ggfI33+ygtXSTY+al/tigE3ds1zZiHFvgG9HAczYuoUY2xKsnEeX3WBFTOdoBp9y4SHjP/jWPkrZW8F2DJgEHh2FmJXZe/pZPuf5wBgVQCcfhSkM+5DkyvPTugiUqJlhxgNxvcNpQ2IYUY+iLhn/OTI8fy9c+P3W7Lv+V8kDDlsb2B0/CyB1bm+qnN9HMVYL1mmjEUMkp0qmWs5IvBjUV8jhgNQ5Mgt2cHa3a3sZk3J//zAls5VeM8wKmxt1nsPA1xy5idX4uXPeg4G1Nz4VEQx9LkgPqsr0NzgpoB+VfcJYHB5whF5WcYu4YttSBGLLtvYEXtqzAndeCAlMA0G8Rw7EfibKNw/ICL4lMEmgMPMn7ABbN9wc3zYezyUGISYwWVB4izYOuNSJ2bMdRo20eFy5G8aeYtns2tITZvETCV0Dp0V4cPEZhCa+VmZ72YxUGz3TC8bUORYh1g0PlvWzTKPJkFfBNA9cXYF/QS78Yobr/i34xX/vaRbuvMBBOxkVu1KnrWSxPePOQfFfjeFvc1lQbKA8g+CjcDA6vPIlJLt8CpnN0O7k0HwBcChQtk4N3ZyJFczWUZuoyvekCrWpHb4Oesm27j58c2wKIan9HUdRf9+vfnRdZBSddatbAnAizDQi++SizllyRjzXtUat+r+WkuWHAGWYMRCFfiKIZryBfdHMI3z0TsmFl8qC9hPOpZgGfLTM7CyevfcUiMGlHH21ISUtrRGQvlsHXDeJV7pEUAVowWrnmsF8GIlpQIAQ/7i+yb4byigSP0Jm9lB9QEHsJRdeD/JkrwtWlxCAODAtWxN1A1FSMpVMXVkqMfBpSUvAgBxuEdnkWBBVjBmUpA1DxttnXmgu2cepKDA3LD06wAXYq2742FduLyyc67YJM9KPByoNuUEDW1vMu0McGlN8gQEXF7dlQMy4igfk51/Ws7AzyDkcDJbyVYX6dlPj93OVd/eq7/f4oM4gEjDjBlQL1PISC3j3LcKoEHLnBdVQ/6M+5LFWAVC9/2ZsdUA4GRpPHfIX4jWsyBomPvCOC8BwBUB+UMSBXTY+ES2NLt1EpRdoHQeCxBq62bi48GCFP+DAEadow7fHzx1MgCJ/dhg58DjB+mEA31OJVDb5zYAycHwu87rAur0Vd9PgW/FR1q2DAeZBAAw0f4ggWVHy3gSKiJT2OUcupoJaZzxiGq981VZsC9pSRNYSUns+n1/cY/X8YxOBvTrAGH7Hv2JHd8lm9MJqmTH4ar7NsNHXcrzytyhY0F2t6SnbFCCxY6r5MIcX5U0ezKHBoAAKqgvzPOkOk5tVlJhMnDFQHbsL3YDj92dyhA8oog8QV3wpaswU+wH5duAKuIz+DvXbcwTSewNIDkmzuiUfXkpXXTzhB0PXMWwy4yLg9ajM9FXD+EtQKk/EyDDD4Iijritd+f42y1jrgAHdNS1B6EeWxfMNWQAeB+2vJMhUiZBypdJAQFbRw3rPbkgea/NFzFZEUiwZewooA+xlsCL174kzmRBzOkMcO843/2U9s1LrdkIC9sXVBRjKx4jmbQRd+DqeA+PADUN6ROGDDJe3eFqlKhz1Nmjh89S4by7bY6v+eL3lS5W6XH/tw3gAD2bFMCijHuf4f2dWhZt2QvLZ4He/L0jO7C+P4OcBZR8LJ5/GyIWzG12Tmz/g4BkgqgOaEj/CByXfEX8MTGPuJJv2cOuhfRXuKOY4TakJNzUtWLfvEyGz3G+imBpAF3GQbpTAf0m3/27rb97Js8vaAyvf0/XonDkEsz25vWYrloXyUJkPhFdYJE7FEfEHQ+5AgGPGQ3BhNRaLyvieCanBRTHrzkPLGMwPXxsdJuLAOUXD3WGiMH3UoxDi77jvVU/eTsDYp7HrKrZ31NWsq6jWx4esh1xLcf1G9jtQWZ8xEE1l4ZeWEQakPBnvf4BwUp5ZuN+0mElDbonuxb3NqyQJH/sBagG+xpVzJsu3SkSv1sBqI4BPPZxlgkaYq2iBmM5YOMq2R/FOIfT86EcWvvPv80NEpm1iZ77AYtnuKW7V67Zvir9msV9drH/03jT32YmAIZCo+M/pfIEr7o3CoHELL2CFPwPQDdUHE8YLAAmrzPx/KKGJIK5ZKH4wpl/f+9AScBdRCKeYgyuBqgKBrQlVaW77aoYiY2hCRSyIJj+iH+3qtgxhPKXMqXAxe3SnR2y4OHnGtQ8TdGyN/2/SbS94MRgaj0RkK9arqwG5kWQc9hWzuvBd+mryNl3zP6bX8zXlLPAzJNBzWsTE0Be0DEw9xNy0dfsJ990LSCLqSKUDqMXoo+Ywu9HWfVXdJPmtQDwBX2T9M08Ifeh4uFdENmxb2qG1h5VGFRpBR8+CIPKLKKtiSW6w25KoKQtf4zFDN8szMPCQcuL5A4I5LFJqtwbYiyRuzQ4fX6fLDSJKzQ6hEzQnU/G4qBEcabi52qB+GKscRAZtmjJ1NecZ7ea+WnTDyWlvA4DwFxvK3qUQsQdD7mq6AmcsT+4Nr1jXBVrqTB9cj0Zz/V4UzyiwLn0Cpxkl5wfVYLiLB/ONR7+253/zHyccoUK+nBK5UngNjnnciML05k3OmxZfZtP+aLsc/hX9QXTF3QqO+yC6OwXr3WMQRzFHTa+qksyVWS2CmeoI+a0Ohj72j9DzFWYyzsUwDV/9ydyz2WH6NYn7PiZRIyiyrk7pqvkesWfMPlAdqo4SOQZP4wQe+MVN17xb8cr/muBqatkXURi4NmdInvwYni5zcJLa/d83iMtjU4WVyJwqsTAqkBCcDQ2W7KNZFQAZrDaqOTpOR2XcnaRbYWkLmJ0QGVwnLdlROFn7A7mEN0Rl8z6dhaBCryBYADVBp4s3y5JAUub5WfhjGe014lE0pK3RUCWRgRTHuBEzbHyZs4UW8e0nhOAt0OBFf6uVKfWLOQYDqxaUmLiBpfPKAJwBsulv3ANJlyP43PSmUNDxm1M+DZkG30DKFYao3zGfz/kqzUcs3XOk10ryg40dyhex6C/SILcYKFHbWLVrfaV7ehmVfn/MVZFOFpKP5on40yhqafq/Zcix9BZnZBoZ45aXu0TrpFRrPGdCaF7RVd6OH6P4X89KNkxTeDeK5c/HrUveVgnIyj2on7G+/J4NMn2+Uhyh/SQd7yqcy/1MnnMfEbAA/B4aikmc6vg1G2/sbLjso/148iI/5LZTKpYl0vsTd5jCmJGQXCm3JtdfBzwFnvBfTE4E/ogdYNEgdjdoWPgaXGAuQFW4oLxLEd8NxbEFRq3eYVe7SE1cyY58SaXhwsSQE2xcmabniBDBhEXGQfOwi/PgVfUHR3DX3B7HN+ZRdkRZ8jWechMXpU82XHO/QTLgm0yF4tmJcEg5lc7fp4sm1l7Mir5AL75zZ6aWQEfz6AEA7pYmUXKGWfR0kUnLgyoK2AjMhpzCM/kqKULASZiyRQTn52gWforxdUpMlyzW4DJwYbVHoNQd5n/TrAeoTMvb/66SAwhw4LogKxAWFoet+QpTCCZNLpXoMQ1o3ATbEl51ifJSe6wmSDMwjmvvKXDCKxutAysO5A9eSJkefnupHMNgQ9+vwSIBlrmzFcwGN2PLf6qzk0WKDpOKdbT0S2QuuTJQJc9oCmrBMUKdlPtyT0wJGfPKDTmEuRY1QXr5/MDTCSH5mZgnCzRDET57FwpvZQ5sqBBpB1nK3AEzoIixniw1U52Kexdtz4BIYl4Jlv5+f6KnE+SLMdpRyFMHDsJFZnEnIO1I1ECwn/Eeqn3VxT4nODrtFGzE6ZuGLRmyQBAig4xyR94A4eB6B6K/WsfWLoYyarBbRWgkEWDbXkWbDKkYzYjwJkciNl9jAeCspIxhFh97gxJJAWAlb7SAHnBPPZFFJVKks6ttbfXqBiipXAGSVoSx6v3uQIEocU/UOzmdKu1zHteoh7pQ5JFeP4wlrjUYEFvyv2YrHmSYxzJPuSe5LWkpMdPMZFPUAQowLBY7GTcZtcAIJXoKYHzbQdoZwW6wCWKcrPWtosB4QP4mYyXNdbVVgOMcyI1fQ4esBnkMn8iWfl5JD2AiqFMWz6cc7PCl+zo6j6/bw5inhfctedzzP0GdA/Md/a+tYSequIyhwx63A9XXLYg7rWUKUcZ/l9HXyvAwlH4XCBwjhz6HAQ8rqEoeonhU59xPnPmGl+a1zrAYTMWn5N5bAB+wlkxeSdSxpO+7PCd7rCxoqPK63m5GlbM1HUHNEGf7HzUFzKFz3jsnCMCUejKGHw20C3dwZLnMYF1nnkTnEFsnCCOvKAkDyyM+NEpdf/TLP1M+KuI66sbSKJ4jpBw01Rr8Dd/kBKU74quvba95sh1UakBY/oZdwJ6ojyxGK97nJcZdxkQ5A2C7Xz/Yd3980wJI7VQ5XBgS2Afs2JESrHmIgpihKzyjZy5EdKH4ZuHo4oqlOiJc/PoQk5Fm+9zgJ+WMRiB5S+db/fI8Em/WoXNVfOMFATISI4MOatrwKOA96X6RrTQkE4xGVAoBniOzjma2BtnoaoCISmkKpQCd8TNNc4R99nyvNqTeQtolAfEWPjSgzl8zoNJVnxhYpNAvvniRLrRMnK8f/0+IgPLMkb+gzgUDPMnySTrxbOp8oUoOrgiZz9is3NQgCZGBg5HAoAeEpU0FztyyCa8ABkvj9qzlHuN3BqTG7jmCjvEXw11JyDPwQNc/7bhGudWSuu7s8jOb1XFpIw7TQCNvHi4HmfrZ+A1r/ZVriX5m6SRl+sBDgcoD5T8oh642JpNlCUhNs/aiLXe8p6I+RCjIAIPVf4h3GMGjgMrFaCkZ4ZyXvyEb8EcCzqAkTOdgzT2iCLpECoZKSa2fLJjeKDkUmtMgcRcMjBHrVsVEnV5RrbFvY4OWQDQiNvEtQgzPvI5CUaMX3CVIGsEnhT5U+eioF8XVK6pgX38JLvxCuDGK/7deMV/LTANhD5pPpT4P6sDC7ARQKsZ4E/o6CClv1p8zSOxzK9uQG+cMHGNlkZEJV2xzbB9hP69l7OZ2FWAycNYHchow3UVwwRRPZSYVdRSAyOLsXB3XJBD1s+RjAbX/HuBZYEsnNR2sEDjjuEOBQ/WYtdKB/N7KPyfpAXkBT9YFnyQR8Lhox1OascCgH5FNdeQAyvnimBKDM/Q1Yf2zJZ8z2nAjmcptrAnA+U9Ijnfjuc6JAylmWAs+kX7nAGKZ0mBeXkYg54V9pA4a/Cnh7zhmOHQbeV0tplYNUGPDvRS1CBic1TRwyLjFEcxv36KLeHGywNxunI+0TBMsQBg4rA45BhEn/AsZvonf6fxtwjGb90fa4meSHKY9I8oMPC9uX75v88tBQQsCFadjAxSxKX3QiYMHoMK3WF+saApAExqDlevX4IWdTYMtp2u8cLeOzTCGeFohIsG4YBrAGTpddElZQ2eEQxttWLi7q3YkkPUBVd2WZU8yROmfxZYCnkAKvCQj9j6FxNsoMAXoB3Ttk9Mo8NWZ7Fq6IAuBkz7eqAqfDD8TxzSjygCjjEwNlkMe3sxmR6XYoCzxhKY3cPrEH/GPdUDHFkBDjD45uH6fT7SCpZTJp5qzyqoQ5K1DMxkz0uyFmKtaDL2Noh8CZLF+WMspV8q0Z/hONsBzhO1HplMt770dLyBz/3eHRANPQAyMHDI5IRiHDybc84ctcPRAPrh77j+KFWDAPJXRCwJwCqAPfLc39h7Y4yBnKYAn7WuDcB+gbO88nzZhtRUVtm1bhB7xQ8ddZ7t0QJ/JoTrgwzxAzCDf0KDlVda4sZuA86SkJqdU8QJA3Ym9HJxCKVIyKIYVCeuPB984uETAxMPY6RoZrgi6djwuhepHz1l4Atc61/YwMUkvoADcVwKAJsM2NVROQGP7i42UYyV+vk5I2jWuX0WqJOh79vJQBSBiTShIsghqhObZRrIsphdNHpoKRxv7JXfbF/RHTOXdlFZWEnIJAK+a1i61zo8O1EB/04skQXZ4bdHsHoF0J2kgycSBBNwqDx2xw3riIsE1zEgHfH5Up0yG4vkn1yjwlgth+LuAxxS/wpppZY4XaOJMRLBuLtVJ8kyYOBBNhdaUip3FT1VFwXSktjzmp+1tnUrpiSATMnbZdKMalcWHQxF4nF7wfyT+0AHVsg8ZAHvZcDHflVRassTcOCZxB7/hVd8v5dxPqKJFekCg3O2ABLKZJHRN3PO6JnYSss099yXLwior27HnNBMAhQvpC+xsercewa4c2mTz+AO3dGlHbKAtrXea3gnujjP3B+mv19iwNlZl5oAu4GH/B3QhCDzVn8QvI78KtUXDHrMN0GQfEYxgSe2U3oYugFhDLP8K87+VQxy9Y0ZRdRRt3ThVQU+FENyBzGGBC/Gm+wcyE6PlFdnh8VQ4OFP2OalJHvV1ArhG7CKa674SioLJpvFpijqEujI6weeca+2tYTSCQ/iKJA/dhSm9cFCtb//3laeQYpHbijhYbR9VTwrWPgVsikWN2fnHDeP+QBz1vXC+XizMC5u0D3he+PVNxsr59f4g/v5BDPs2XPcNuJccMzw3+aj8sEtaBpo5R0Nvjw2sJLhXLiUFmFpmFXXTBZDNWdx/SDTHfllnAHZ2Qr5RH9bzrxzOCRk/3KdWEmk8jsupwSlOo65Dv1Ow5jvmB65ERBENa8cC3LEpb4wDqkad3Bm2FtRNp8VQXOXkE0HAJ9vpFKBwOwF88fx6gB1829EossKsLkgYMF/ugLKroVmuloB2H2ZLJYC37uTgc8ApUbI8nwsoIl8IRFX+b7Efvgr/q2A/Ml7FfjMkl2Y0oc9671evuEbeIli7BUyh0/8oVSrmeF398Ngm7MUMRRzPWCbhYmhzLX7PrFbI9e9Q7GG4mPntcwKxB8HMfixO77JbpFcH25e5D2Xlh3PeHHBgZ0zclgk4PP5Ex5ztte3YfG/1WRhuWHo+4w6l+6ghQhyNlEqj5hNBHcIrt2VgiMfu1JSGai4O0nCTThigSnJPyWH/Oo98DAQUEYU6eO6TZhXPd1rPrdF8VfHE8/A8bamWCjwyg7gIGTkFaeKiICE54lnEDQIyjd5WssXPvYq3Kx8SmG3PYNJTPru+LM6jn28qpilKQ1mD8qrScK8tCSZiiyIxVyVmD+6LxIyAGBuxZQgCuclzz/wUok52YaPxw5M94uECbuyfIdtu/Zk1sj2USybcr3NuXJ3PPwoFPiESEiIScyQ8w2LvFn0gka3ccWdZHjx5SbYI+/rCmyVeRlj8+6qyA4oU8FjH9KgP8FuvOLGK/7leMV/72DCqi6BekbucH+1JLsM7JwPMrm5dXUyb7JqhgoONkwrVlhX3eKHfjSmEtSeARw7EM5bCzBXuKTmazgFOWOlUcXQPODZqdNgRXYebd9wOPUn7UkneSZrucCXFrOQ6PoKRgIPzSEXJa/g4DDrKMjkQvAHTLuyX/fbhbcj2BkC4OFXBXsGY8DirYNJQLnBlmz9u2KukiIGyUrMv8mDP32wcCgfgWyCJUB3OIk6XnJF4Miui7ecwhXJktIRrDd0AWqDMxzyb1t1PAETOueyowodqyP/DFvJpsnCViaULt6ghpCh+zwk/sY3bOt32zP0rPOYdH2RKQfg5axWUxYtOvGS3epkLJoZRsxw4NDGfKOD2QCUJMHYIDAjk3/jYMAW0gaZMEaoFetP3oo5zIhTAoWflYwhHsgS1fkosr4N/0x9+Q3zF2boglsE1mJPcpWMMhNMaPE2IBlg0ekEijwc1ucIPeI33UUvUMXxorTLmSDKirMlErSk3h/FyCxcT/xRkhkrmbh+oWVdONcCoIQcnfMLLx8YY0A9AyWhPIooZG12BYlhPxADEoUD0gFwlPVizmWoZ5FdX3JKP/oEgl2bbD/Rq+6VoruRMmMUm5UQiXeXplaHGLstCwS0DLSTweD/XCT/jWbCIEdDKiYBEMOhmW59NvF/FWILiCADCap+s2SMuCjEX7HSpT63p7MwGaKfibWyNmzucAMOoLsrWKD9AMDuWhOrZ+GpeYyNuZJZI1AM2MuAIwlV53VPVcgg2Fc6zrr6WAWZX3yGR3KHTE66HdpKsqVnXnwnjKwCQRvIeljMIBTOPhEVXEk8EMfEH3GnvuBwuDlWtM3zfdNfzOoitDzEt4UmsXA+wOMTiNZ1vuaJIYa1Fj4wYSMHwhMI9HFI2cgLa6Sk6ih2cevCdwJ9DrBO47OKf8f/jmHwQ6piVkE+R9NLBM8OHzEfCFJDO92eGD+ocGvRrT4DMMmxvoZN/wIcA4OlWd7nfdJVAW2aGioumjZQszz8iyCBXWTki2AHQ8uPz38LQvaj566klN/bHtZ3mRpwjcU0OwxY+ZKcnqlCAJ6+7AnXeI4bcDNsJBGEMzHMn/DY1+kJBUzuH7vBSQ729ZD+jUsO4sUAYmhznsu5DlHSt+4PSEryHPJflOKhdO2sOVBxfcI5RK48I56VtCYZbAEzkyjGlKqAvri+T+Bz7Imcn8mRCopYSgAABARJREFUW4plr7dzQdJXpOSJ9+N6ese8eebYkRiqHR04Rba6inDGDu1k4REkmdgQ/NHvGz5uS5y5JnA5oZjfbwtPDBFoSselVJoYPIDWZ7oIdEIosCOP0mZPJgnpUGaArPrbzDUEqyRBznxihDy1xXwNVAGX+UvOTdnwivc9ZH0BnqicRdnxJGCwkjrnGeHfQLE8Lx7Z4WfNtG4ZlzaL/INLbFWhWZ2AAFTKL7NTpecSWRUArppn+zrmiK6aUXRVwXzEvTOfzW7FrLUmShBmuuK5j0MPwMsfuCLu+poLvy7uUY8cBsZZwXyvQ50i3vsSKdlqQDHTHwf4culH32snE5kygc/8UUsc7klmOYBZElWoeQV7GGAPAN7FXChG5AgmF8RIW1L/K/LsY6bnD7EXKJ36EUXozC3PjsxZM4PA2MsBBLmNDfxWnRfjAPhO8UpF+KMEYra+kSqGrPCJsWb0quIVfUx2FqUKhKCjCCPzO64RDrgcDH1cjSl6spqZ+zGfesTWlVorO0BxALBteI6PiI1D3n6uiiFtHuSRAoWfOJd3EibgE9lRWnMaR3e2iWwMDwJvSEwKHrA6uKwxkgTAjbGjC3DhVbI/O++ZsTNRVTE2SIQUANlZs58Qf0WBjX68Ps1iZknE6IYNjSJ3FejU6rvO3Wdn7vnpXSRIaVCIVAzSaahD/NH4U5L01rN8HwTIXuzFqkLkMe9nyW+1lH/PomYw/ns+OP+HRTV21fpm/lq/95a4swNcBhJ8jY4o915bWVR1zlWSUuOJLgC9GsMzQc15TIxCrLoz9ik1lh7C+jnDm/RdW8u8/NO59x1cZwYUiVcENbdmh18d+CswSfqtXPL1Tud8KtHyi/TRM9YkImcwYgCJ3UQBppUsV+VrwIZlgalyqqOADAWiYzNVUhh/OEQcAx2jmZMwpAfZZVjHWk988MzwA3cagpmgszEetkMxhvlYFIbimkwBS1K+9RzJxh+6M27PVJHpPbkDo0wc8xFYbM3/sfN8/Rl24xU3XvFvxyvkLHDcdtttt91222233Xbbbbfddtttt91222233Xbbbbfddtv/zf7PvU233Xbbbbfddtttt91222233Xbbbbfddtttt91222233fYPdheYbrvttttuu+2222677bbbbrvttttuu+2222677bbbbvtf2V1guu2222677bbbbrvttttuu+2222677bbbbrvttttuu+1/ZXeB6bbbbrvttttuu+2222677bbbbrvttttuu+2222677bb/ld0Fpttuu+2222677bbbbrvttttuu+2222677bbbbrvtttv+V3YXmG677bbbbrvttttuu+2222677bbbbrvttttuu+222277X9n/D6mqPXRl5j3SAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Set the figure size\n", + "plt.figure(figsize=[30,20])\n", + "\n", + "# Set the rows and columns\n", + "rows, cols = 4, 8\n", + "\n", + "# Iterate for each class\n", + "for class_index, each_list in enumerate([rock, paper, scissor,nothing]):\n", + " \n", + " # Get 8 random indexes, since we will be showing 8 examples of each class.\n", + " r = np.random.randint(no_of_samples, size=8);\n", + " \n", + " # Plot the examples\n", + " for i, example_index in enumerate(r,1):\n", + " plt.subplot(rows,cols,class_index*cols + i );plt.imshow(each_list[example_index][0][:,:,::-1]);plt.axis('off'); " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3: Preprocess Data and Split it:\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total images: 400 , Total Labels: 400\n" + ] + } + ], + "source": [ + "# Combine the labels of all classes together\n", + "labels = [tupl[1] for tupl in rock] + [tupl[1] for tupl in paper] + [tupl[1] for tupl in scissor] +[tupl[1] for tupl in nothing]\n", + "\n", + "# Combine the images of all classes together\n", + "images = [tupl[0] for tupl in rock] + [tupl[0] for tupl in paper] + [tupl[0] for tupl in scissor] +[tupl[0] for tupl in nothing]\n", + "\n", + "# Normalize the images by dividing by 255, now our images are in range 0-1. This will help in training.\n", + "images = np.array(images, dtype=\"float\") / 255.0\n", + "\n", + "# Print out the total number of labels and images.\n", + "print('Total images: {} , Total Labels: {}'.format(len(labels), len(images)))\n", + "\n", + "# Create an encoder Object\n", + "encoder = LabelEncoder()\n", + "\n", + "# Convert Lablels to integers. i.e. nothing = 0, paper = 1, rock = 2, scissor = 3 (mapping is done in alphabatical order)\n", + "Int_labels = encoder.fit_transform(labels)\n", + "\n", + "# Now the convert the integer labels into one hot format. i.e. 0 = [1,0,0,0] etc.\n", + "one_hot_labels = to_categorical(Int_labels, 4)\n", + "\n", + "# Now we're splitting the data, 75% for training and 25% for testing.\n", + "(trainX, testX, trainY, testY) = train_test_split(images, one_hot_labels, test_size=0.25, random_state=50)\n", + "\n", + "# Empty memory from RAM\n", + "images = []\n", + "\n", + "\n", + "# This can further free up memory from RAM but be careful, if you won't be able to chage split % after this.\n", + "# rock, paper, scissor = [], [], []" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 4: Prepare Our Model for Fine Tuning:\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of Layers in Model: 773\n" + ] + } + ], + "source": [ + "# This is the input size which our model accepts.\n", + "image_size = 224\n", + "\n", + "# Loading pre-trained NASNETMobile Model without the head by doing include_top = False\n", + "N_mobile = tf.keras.applications.NASNetMobile( input_shape=(image_size, image_size, 3), include_top=False, weights='imagenet')\n", + "\n", + "# Freeze the whole model \n", + "N_mobile.trainable = False\n", + " \n", + "# Adding our own custom head\n", + "# Start by taking the output feature maps from NASNETMobile\n", + "x = N_mobile.output\n", + "\n", + "# Convert to a single dimensional vector by Global Average Pooling. \n", + "# We could also use Flatten()(x) GAP is more effective reduces params and controls overfitting.\n", + "x = GlobalAveragePooling2D()(x)\n", + "\n", + "# Adding a dense layer with 512 units\n", + "x = Dense(712, activation='relu')(x) \n", + "\n", + "# Dropout 20% of the activations, helps reduces overfitting\n", + "x = Dropout(0.40)(x)\n", + "\n", + "# The fianl layer will contain 4 output units (no of units = no of classes) with softmax function.\n", + "preds = Dense(4,activation='softmax')(x) \n", + "\n", + "# Construct the full model\n", + "model = Model(inputs=N_mobile.input, outputs=preds)\n", + "\n", + "# Check the number of layers in the final Model\n", + "print (\"Number of Layers in Model: {}\".format(len(model.layers[:])))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 5: Train Our Model:\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "# Adding transformations that I know would help, you can feel free to add more.\n", + "# I'm doing horizontal_flip = False, incase you aren't sure which hand you would be using you can make that True.\n", + "\n", + "augment = ImageDataGenerator( \n", + " \n", + " rotation_range=30,\n", + " zoom_range=0.25,\n", + " width_shift_range=0.10,\n", + " height_shift_range=0.10,\n", + " shear_range=0.10,\n", + " horizontal_flip=False, \n", + " fill_mode=\"nearest\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [], + "source": [ + "model.compile(optimizer=Adam(learning_rate=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/15\n", + "15/15 [==============================] - 27s 2s/step - loss: 1.0857 - accuracy: 0.5600 - val_loss: 0.6256 - val_accuracy: 0.9200\n", + "Epoch 2/15\n", + "15/15 [==============================] - 22s 1s/step - loss: 0.5107 - accuracy: 0.8800 - val_loss: 0.3271 - val_accuracy: 0.9400\n", + "Epoch 3/15\n", + "15/15 [==============================] - 23s 2s/step - loss: 0.3125 - accuracy: 0.9333 - val_loss: 0.2120 - val_accuracy: 0.9400\n", + "Epoch 4/15\n", + "15/15 [==============================] - 22s 1s/step - loss: 0.2304 - accuracy: 0.9467 - val_loss: 0.1527 - val_accuracy: 0.9800\n", + "Epoch 5/15\n", + "15/15 [==============================] - 23s 2s/step - loss: 0.1893 - accuracy: 0.9533 - val_loss: 0.1240 - val_accuracy: 0.9800\n", + "Epoch 6/15\n", + "15/15 [==============================] - 22s 1s/step - loss: 0.1311 - accuracy: 0.9833 - val_loss: 0.1004 - val_accuracy: 1.0000\n", + "Epoch 7/15\n", + "15/15 [==============================] - 22s 1s/step - loss: 0.1168 - accuracy: 0.9833 - val_loss: 0.0849 - val_accuracy: 1.0000\n", + "Epoch 8/15\n", + "15/15 [==============================] - 23s 2s/step - loss: 0.1047 - accuracy: 0.9867 - val_loss: 0.0685 - val_accuracy: 1.0000\n", + "Epoch 9/15\n", + "15/15 [==============================] - 26s 2s/step - loss: 0.0888 - accuracy: 0.9933 - val_loss: 0.0608 - val_accuracy: 1.0000\n", + "Epoch 10/15\n", + "15/15 [==============================] - 23s 2s/step - loss: 0.0742 - accuracy: 0.9933 - val_loss: 0.0520 - val_accuracy: 1.0000\n", + "Epoch 11/15\n", + "15/15 [==============================] - 22s 1s/step - loss: 0.0635 - accuracy: 0.9933 - val_loss: 0.0445 - val_accuracy: 1.0000\n", + "Epoch 12/15\n", + "15/15 [==============================] - 24s 2s/step - loss: 0.0527 - accuracy: 0.9933 - val_loss: 0.0390 - val_accuracy: 1.0000\n", + "Epoch 13/15\n", + "15/15 [==============================] - 23s 2s/step - loss: 0.0521 - accuracy: 0.9967 - val_loss: 0.0338 - val_accuracy: 1.0000\n", + "Epoch 14/15\n", + "15/15 [==============================] - 22s 1s/step - loss: 0.0438 - accuracy: 0.9967 - val_loss: 0.0367 - val_accuracy: 1.0000\n", + "Epoch 15/15\n", + "15/15 [==============================] - 22s 1s/step - loss: 0.0476 - accuracy: 0.9967 - val_loss: 0.0279 - val_accuracy: 1.0000\n" + ] + } + ], + "source": [ + "# Set batchsize according to your system\n", + "epochs = 15\n", + "batchsize = 20\n", + "\n", + "# Start training\n", + "history = model.fit(x=augment.flow(trainX, trainY, batch_size=batchsize), validation_data=(testX, testY), \n", + "steps_per_epoch= len(trainX) // batchsize, epochs=epochs)\n", + "\n", + "# Use model.fit_generator function instead if TF version < 2.2\n", + "#history = model.fit_generator(x = augment.flow(trainX, trainY, batch_size=batchsize), validation_data=(testX, testY), \n", + "#steps_per_epoch= len(trainX) // batchsize, epochs=epochs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 6: Check our Accuracy, Loss graphs & save the model.\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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7du3Z9y4cWRlZXHVVVeRk5NDTk4Or7zyCsXFxTzxxBMcffTRbNiwgbPPPpvFixfTu3dvFi1axKOPPkq/fv12qu3mm29mxowZbNq0iZycHCZMmICZUVBQwCWXXMLq1atp2LAhzz77LN27d+fOO+9k8uTJNGjQgGHDhnHHHXck46OtVrVdLmbWEHgIGAr0BkabWe9yx/QCbgCOcfdDgKvqoNZd5OdD48bQrVt9vJuI1LWFCxdywQUX8P7779OpUyfuuusucnNzycvL46WXXmLhwoW7vKa4uJjjjjuOvLw8Bg0axOOPP17hud2dd955h3vuuYdbb70VgD/+8Y906NCBvLw8rr/+et5///0KX3vllVcyb948FixYQHFxMTNnzgRg9OjRXH311eTl5fHmm2/Svn17pk+fzosvvsg777xDXl4e11xzTZI+nerVpIU+EFjs7ksBzGwKMAIo+8leBDzk7msA3P2rZBdakfx86NkTGqV1x5FIdHanJV2XevTowRFHHLHj/uTJk3nssccoKSlhxYoVLFy4kN69d2pPsvfeezN06FAADj/8cF577bUKz33qqafuOGbZsmUAvP7661x33XUAHHrooRxyyCEVvnb27Nncc889bN68mVWrVnH44Ydz1FFHsWrVKk4++WQgTAQCePnllzn//PPZe++9AWjTps3ufBS7pSZR2An4rMz9QuDIcsd8D8DM3iB0y4x395nlT2RmY4AxAF27dt2deneiIYsi8bLPPvvsuL1o0SLuv/9+3nnnHVq1asVZZ51V4bjsJk2a7LjdsGFDSkpKKjz3Xokd5Mse4+7V1rRx40bGjh3Le++9R6dOnRg3btyOOioaWujukQ0Lrckol4oqK/8pNAJ6AccDo4FHzazVLi9yn+juA9x9QLt27Wpb6062bYPFixXoInH1zTff0KJFC/bdd19WrlzJrFmzkv4eOTk5TJ06FYAFCxZU2KWzadMmGjRoQFZWFuvWreOZZ54BoHXr1mRlZTF9+nQgTNjauHEjgwcP5rHHHmPTpk0AfP3110mvuzI1aaEXAl3K3O8MrKjgmLfcfSvwiZnlEwJ+XlKqrMCyZbBli8agi8RV//796d27N3369OGAAw7gmGOOSfp7XH755Zx99tn07duX/v3706dPH1q2bLnTMW3btuWcc86hT58+dOvWjSOP/K6DYtKkSVx88cX85je/oUmTJjzzzDMMGzaMvLw8BgwYQOPGjTn55JO57bbbkl57Ray6XznMrBFQAJwIfE4I6TPc/aMyxwwBRrv7OWaWBbwP9HP31ZWdd8CAAZ6bm7vbhb/4Ipx0Erz+OtTB37NIbH388cccfPDBUZeREkpKSigpKaFp06YsWrSIwYMHs2jRIhqlyIW5iv6uzOxddx9Q0fHVVu3uJWY2FphF6B9/3N0/MrNbgVx3fyHx3GAzWwhsA35VVZgng4YsisieWr9+PSeeeCIlJSW4O4888kjKhPnuqFHl7j4DmFHusZvK3Hbg/yX+1Iv8fGjdGtq2ra93FJG4adWqFe+++27UZSRN2k79z88PrXOtMSQiEqRtoGvIoojIztIy0Nevh88/V6CLiJSVloFeuiiXhiyKiHwnrQNdLXSR9HP88cfvMknovvvu45e//GWVr2vevDkAK1as4LTTTqv03NUNh77vvvvYuHHjjvsnnXQSa9eurUnpKS8tAz0/P1wM7dkz6kpEpLZGjx7NlClTdnpsypQpjB49ukav79ixI9OmTdvt9y8f6DNmzKBVq10mtqeltBxwmZ8fVlhMrIUjIrsrgvVzTzvtNMaNG8e3337LXnvtxbJly1ixYgU5OTmsX7+eESNGsGbNGrZu3crtt9/OiBEjdnr9smXLGDZsGB9++CGbNm3ivPPOY+HChRx88ME7ptsDXHrppcybN49NmzZx2mmnccstt/DAAw+wYsUKTjjhBLKyspgzZw7du3cnNzeXrKws7r333h2rNV544YVcddVVLFu2jKFDh5KTk8Obb75Jp06deP7553csvlVq+vTp3H777WzZsoW2bdsyadIk9ttvP9avX8/ll19Obm4uZsbNN9/MT3/6U2bOnMmNN97Itm3byMrKYvbs2Xv80adloGuEi0j6atu2LQMHDmTmzJmMGDGCKVOmMGrUKMyMpk2b8txzz7HvvvuyatUqjjrqKIYPH17pYlcTJkygWbNmzJ8/n/nz59O/f/8dz91xxx20adOGbdu2ceKJJzJ//nyuuOIK7r33XubMmUNWVtZO53r33Xd54oknePvtt3F3jjzySI477jhat27NokWLmDx5Mn/+85/5+c9/zjPPPMNZZ5210+tzcnJ46623MDMeffRR7r77bv7whz9w22230bJlSxYsWADAmjVrKCoq4qKLLmLu3LlkZ2cnbb2XtAt099BC13R/kSSIaP3c0m6X0kAvbRW7OzfeeCNz586lQYMGfP7553z55Zd06NChwvPMnTuXK664AoC+ffvSt2/fHc9NnTqViRMnUlJSwsqVK1m4cOFOz5f3+uuvc8opp+xY8fHUU0/ltddeY/jw4WRnZ+/Y9KLs8rtlFRYWMmrUKFauXMmWLVvIzs4GwnK6ZbuYWrduzfTp0/nBD36w45hkLbGbdn3oK1eGYYtqoYukr5EjRzJ79uwduxGVtqwnTZpEUVER7777Lh988AH77bdfhUvmllVR6/2TTz7h97//PbNnz2b+/Pn85EzqxnwAAAZQSURBVCc/qfY8Va1rVbr0LlS+RO/ll1/O2LFjWbBgAY888siO96toOd26WmI37QK9dA0XDVkUSV/Nmzfn+OOP5/zzz9/pYmhxcTHt27encePGzJkzh08//bTK8/zgBz/YsRH0hx9+yPz584Gw9O4+++xDy5Yt+fLLL3nxxRd3vKZFixasW7euwnP9/e9/Z+PGjWzYsIHnnnuOY489tsbfU3FxMZ06dQLgySef3PH44MGDefDBB3fcX7NmDYMGDeLVV1/lk08+AZK3xG7aBbqGLIrEw+jRo8nLy+P000/f8diZZ55Jbm4uAwYMYNKkSRx00EFVnuPSSy9l/fr19O3bl7vvvpuBAwcCYfehww47jEMOOYTzzz9/p6V3x4wZw9ChQznhhBN2Olf//v0599xzGThwIEceeSQXXnghhx12WI2/n/Hjx/Ozn/2MY489dqf++XHjxrFmzRr69OnDoYceypw5c2jXrh0TJ07k1FNP5dBDD2XUqFE1fp+qVLt8bl3Z3eVzn38enngCnn0WKtkQXESqoOVz00fSl89NNSNGhD8iIrIztXFFRGJCgS6SgaLqapWa252/IwW6SIZp2rQpq1evVqinMHdn9erVNK3ldPi060MXkT3TuXNnCgsLKSoqiroUqULTpk3p3LlzrV6jQBfJMI0bN94xQ1HiRV0uIiIxoUAXEYkJBbqISExENlPUzIqAqhdqqFwWsCqJ5dS1dKo3nWqF9Ko3nWqF9Ko3nWqFPau3m7u3q+iJyAJ9T5hZbmVTX1NROtWbTrVCetWbTrVCetWbTrVC3dWrLhcRkZhQoIuIxES6BvrEqAuopXSqN51qhfSqN51qhfSqN51qhTqqNy370EVEZFfp2kIXEZFyFOgiIjGRdoFuZkPMLN/MFpvZ9VHXUxkz62Jmc8zsYzP7yMyujLqmmjCzhmb2vpn9I+paqmJmrcxsmpn9J/EZD4q6pqqY2dWJfwcfmtlkM6vdMnp1zMweN7OvzOzDMo+1MbOXzGxR4mvrKGssVUmt9yT+Lcw3s+fMrFWUNZaqqNYyz11rZm5mWRW9dnekVaCbWUPgIWAo0BsYbWa9o62qUiXANe5+MHAUcFkK11rWlcDHURdRA/cDM939IOBQUrhmM+sEXAEMcPc+QEPg9KpfVe/+Agwp99j1wGx37wXMTtxPBX9h11pfAvq4e1+gALihvouqxF/YtVbMrAvwI2B5Mt8srQIdGAgsdvel7r4FmAKk5IZ07r7S3d9L3F5HCJxO0VZVNTPrDPwEeDTqWqpiZvsCPwAeA3D3Le6+NtqqqtUI2NvMGgHNgBUR17MTd58LlN96fgRQun39k8DIei2qEhXV6u7/dPeSxN23gNqtO1tHKvlcAf4H+DWQ1FEp6RbonYDPytwvJMVDEsDMugOHAW9HW0m17iP8I9sedSHVOAAoAp5IdA89amb7RF1UZdz9c+D3hNbYSqDY3f8ZbVU1sp+7r4TQQAHaR1xPTZ0PvBh1EZUxs+HA5+6el+xzp1ugWwWPpfS4SzNrDjwDXOXu30RdT2XMbBjwlbu/G3UtNdAI6A9McPfDgA2kTnfALhJ9zyOAbKAjsI+ZnRVtVfFkZr8hdHdOirqWiphZM+A3wE11cf50C/RCoEuZ+51JsV9dyzKzxoQwn+Tuz0ZdTzWOAYab2TJCV9Z/mdn/RltSpQqBQncv/Y1nGiHgU9UPgU/cvcjdtwLPAkdHXFNNfGlm+wMkvn4VcT1VMrNzgGHAmZ66E2x6EP5jz0v8rHUG3jOzDsk4eboF+jygl5llm1kTwoWlFyKuqUJmZoQ+3o/d/d6o66mOu9/g7p3dvTvhc33F3VOyFenuXwCfmdmBiYdOBBZGWFJ1lgNHmVmzxL+LE0nhi7hlvACck7h9DvB8hLVUycyGANcBw919Y9T1VMbdF7h7e3fvnvhZKwT6J/5N77G0CvTERY+xwCzCD8RUd/8o2qoqdQzwC0JL94PEn5OiLipGLgcmmdl8oB9wZ8T1VCrxm8Q04D1gAeHnLqWmqpvZZODfwIFmVmhmFwB3AT8ys0WEERl3RVljqUpqfRBoAbyU+Fn7U6RFJlRSa929X+r+ZiIiIrWRVi10ERGpnAJdRCQmFOgiIjGhQBcRiQkFuohITCjQRURiQoEuIhIT/x9jFLTqP0IZnAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the accuracy and loss curves\n", + "\n", + "acc = history.history['accuracy']\n", + "val_acc = history.history['val_accuracy']\n", + "loss = history.history['loss']\n", + "val_loss = history.history['val_loss']\n", + "\n", + "epochs = range(len(acc))\n", + "\n", + "plt.plot(epochs, acc, 'b', label='Training acc')\n", + "plt.plot(epochs, val_acc, 'r', label='Validation acc')\n", + "plt.title('Training accuracy')\n", + "plt.legend()\n", + "\n", + "plt.figure()\n", + "\n", + "plt.plot(epochs, loss, 'b', label='Training loss')\n", + "plt.plot(epochs, val_loss, 'r', label='Validation loss')\n", + "plt.title('Training loss')\n", + "plt.legend()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Save the model " + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [], + "source": [ + "model.save(\"rps4.h5\", overwrite=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Load the model " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "model = load_model(\"rps4.h5\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 7: Test on Live Webcam Feed:\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [], + "source": [ + "# This list will be used to map probabilities to class names, Label names are in alphabatical order.\n", + "label_names = ['nothing', 'paper', 'rock', 'scissor']\n", + "\n", + "cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)\n", + "box_size = 234\n", + "width = int(cap.get(3))\n", + "\n", + "while True:\n", + " \n", + " ret, frame = cap.read()\n", + " if not ret:\n", + " break\n", + " \n", + " frame = cv2.flip(frame, 1)\n", + " \n", + " cv2.rectangle(frame, (width - box_size, 0), (width, box_size), (0, 250, 150), 2)\n", + " \n", + " cv2.namedWindow(\"Rock Paper Scissors\", cv2.WINDOW_NORMAL)\n", + "\n", + " roi = frame[5: box_size-5 , width-box_size + 5: width -5]\n", + " \n", + " # Normalize the image like we did in the preprocessing step, also convert float64 array.\n", + " roi = np.array([roi]).astype('float64') / 255.0\n", + " \n", + " # Get model's prediction.\n", + " pred = model.predict(roi)\n", + " \n", + " # Get the index of the target class.\n", + " target_index = np.argmax(pred[0])\n", + "\n", + " # Get the probability of the target class\n", + " prob = np.max(pred[0])\n", + "\n", + " # Show results\n", + " cv2.putText(frame, \"prediction: {} {:.2f}%\".format(label_names[np.argmax(pred[0])], prob*100 ),\n", + " (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.90, (0, 0, 255), 2, cv2.LINE_AA)\n", + " \n", + " cv2.imshow(\"Rock Paper Scissors\", frame)\n", + " \n", + " \n", + " k = cv2.waitKey(1)\n", + " if k == ord('q'):\n", + " break\n", + "\n", + "cap.release()\n", + "cv2.destroyAllWindows()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 8: Create the Final Application:\n", + " \n", + " \n", + "\n", + " It’s time for the finale, we will now take our final model and build a full application out of it, for our final script we have 3 different helper functions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Function for finding the Winner \n", + "First we need a function that takes two moves, one by the user and one the computer and then finds out who won that round. This function is pretty simple as you can see below." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "def findout_winner(user_move, Computer_move):\n", + " \n", + " # All logic below is self explanatory \n", + " \n", + " if user_move == Computer_move:\n", + " return \"Tie\"\n", + " \n", + " \n", + " elif user_move == \"rock\" and Computer_move == \"scissor\":\n", + " return \"User\"\n", + " \n", + " elif user_move == \"rock\" and Computer_move == \"paper\":\n", + " return \"Computer\"\n", + " \n", + " elif user_move == \"scissor\" and Computer_move == \"rock\":\n", + " return \"Computer\"\n", + " \n", + " elif user_move == \"scissor\" and Computer_move == \"paper\":\n", + " return \"User\"\n", + " \n", + " elif user_move == \"paper\" and Computer_move == \"rock\":\n", + " return \"User\"\n", + " \n", + " elif user_move == \"paper\" and Computer_move == \"scissor\":\n", + " return \"Computer\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Let’s test this function.**" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "User Selected 'paper' and computer selected 'paper' , winner is: 'Tie' \n" + ] + } + ], + "source": [ + "user_move = 'paper'\n", + "computer_move = choice(['rock', 'paper', 'scissor'])\n", + "\n", + "winner = findout_winner(user_move, computer_move)\n", + "\n", + "print(\"User Selected '{}' and computer selected '{}' , winner is: '{}' \".format(user_move, computer_move, winner))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Let’s do another one.**" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "User Selected 'paper' and computer selected 'rock' , winner is: 'User' \n" + ] + } + ], + "source": [ + "user_move = 'paper'\n", + "computer_move = choice(['rock', 'paper', 'scissor'])\n", + "\n", + "winner = findout_winner(user_move, computer_move)\n", + "\n", + "print(\"User Selected '{}' and computer selected '{}' , winner is: '{}' \".format(user_move, computer_move, winner))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Function for Showing the Winner for the Full Game \n", + "\n", + "This function decides who's the winner based on the points and then shows an image with results, After the game is over you can press 'ENTER' to play again or any other key to exit." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "def show_winner(user_socre, computer_score): \n", + " \n", + " if user_score > computer_score:\n", + " img = cv2.imread(\"images/youwin.jpg\")\n", + " \n", + " elif user_score < computer_score:\n", + " img = cv2.imread(\"images/comwins.jpg\")\n", + " \n", + " else:\n", + " img = cv2.imread(\"images/draw.jpg\")\n", + " \n", + " cv2.putText(img, \"Press 'ENTER' to play again, else exit\",\n", + " (150, 530), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 255), 3, cv2.LINE_AA)\n", + " \n", + " cv2.imshow(\"Rock Paper Scissors\", img)\n", + " \n", + " # If enter is pressed.\n", + " k = cv2.waitKey(0)\n", + " \n", + " # If the user presses 'ENTER' key then return TRUE, otherwise FALSE\n", + " if k == 13:\n", + " return True\n", + "\n", + " else:\n", + " return False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Function for Displaying Computer's Move (Optional) \n", + "\n", + "This function displays a picture of either 'rock', 'paper' or 'scissor' based on what the computer played. " + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "def display_computer_move(computer_move_name, frame):\n", + " \n", + " icon = cv2.imread( \"images/{}.png\".format(computer_move_name), 1)\n", + " icon = cv2.resize(icon, (224,224))\n", + " \n", + " # This is the portion which we are going to replace with the icon image\n", + " roi = frame[0:224, 0:224]\n", + "\n", + " # Get binary mask from the transparent image, 4th channel is the alpha channel \n", + " mask = icon[:,:,-1] \n", + "\n", + " # Making the mask completely binary (black & white)\n", + " mask = cv2.threshold(mask, 1, 255, cv2.THRESH_BINARY)[1]\n", + "\n", + " # Store the normal bgr image\n", + " icon_bgr = icon[:,:,:3] \n", + " \n", + " # Now combine the foreground of the icon with background of ROI \n", + " \n", + " img1_bg = cv2.bitwise_and(roi, roi, mask = cv2.bitwise_not(mask))\n", + "\n", + " img2_fg = cv2.bitwise_and(icon_bgr, icon_bgr, mask = mask)\n", + "\n", + " combined = cv2.add(img1_bg, img2_fg)\n", + "\n", + " frame[0:224, 0:224] = combined\n", + "\n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Final Application " + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "cap = cv2.VideoCapture(0)\n", + "box_size = 234\n", + "width = int(cap.get(3))\n", + "\n", + "# Specify the number of attempts you want. This means best of 5.\n", + "attempts = 5\n", + "\n", + "# Initially the moves will be `nothing`\n", + "computer_move_name= \"nothing\"\n", + "final_user_move = \"nothing\"\n", + "\n", + "label_names = ['nothing', 'paper', 'rock', 'scissor']\n", + "\n", + "# All scores are 0 at the start.\n", + "computer_score, user_score = 0, 0\n", + "\n", + "# The default color of bounding box is Blue\n", + "rect_color = (255, 0, 0)\n", + "\n", + "# This variables remembers if the hand is inside the box or not.\n", + "hand_inside = False\n", + "\n", + "# At each iteration we will decrease the total_attempts value by 1\n", + "total_attempts = attempts\n", + "\n", + "# We will only consider predictions having confidence above this threshold.\n", + "confidence_threshold = 0.70\n", + "\n", + "# Instead of working on a single prediciton, we will take the mode of 5 predictons by using a deque object\n", + "# This way even if we face a false postive, we would easily ignore it\n", + "smooth_factor = 5\n", + "\n", + "# Our initial deque list will have 'nothing' repeated 5 times.\n", + "de = deque(['nothing'] * 5, maxlen=smooth_factor)\n", + "\n", + "while True:\n", + " \n", + " ret, frame = cap.read()\n", + " \n", + " if not ret:\n", + " break\n", + " \n", + " frame = cv2.flip(frame, 1)\n", + " \n", + " cv2.namedWindow(\"Rock Paper Scissors\", cv2.WINDOW_NORMAL)\n", + "\n", + " # extract the region of image within the user rectangle\n", + " roi = frame[5: box_size-5 , width-box_size + 5: width -5]\n", + " \n", + " roi = np.array([roi]).astype('float64') / 255.0\n", + " \n", + " # Predict the move made\n", + " pred = model.predict(roi)\n", + " \n", + " # Get the index of the predicted class\n", + " move_code = np.argmax(pred[0])\n", + " \n", + " # Get the class name of the predicted class\n", + " user_move = label_names[move_code]\n", + " \n", + " # Get the confidence of the predicted class\n", + " prob = np.max(pred[0])\n", + " \n", + " # Make sure the probability is above our defined threshold\n", + " if prob >= confidence_threshold:\n", + " \n", + " # Now add the move to deque list from left\n", + " de.appendleft(user_move)\n", + " \n", + " # Get the mode i.e. which class has occured more frequently in the last 5 moves.\n", + " try:\n", + " final_user_move = st.mode(de)[0][0] \n", + " \n", + " except StatisticsError:\n", + " print('Stats error')\n", + " continue\n", + " \n", + " # If nothing is not true and hand_inside is False then proceed.\n", + " # Basically the hand_inside variable is helping us to not repeatedly predict during the loop\n", + " # So now the user has to take his hands out of the box for every new predicton.\n", + " \n", + " if final_user_move != \"nothing\" and hand_inside == False:\n", + " \n", + " # Set hand inside to True\n", + " hand_inside = True \n", + " \n", + " # Get Computer's move and then get the winner.\n", + " computer_move_name = choice(['rock', 'paper', 'scissor'])\n", + " winner = findout_winner(final_user_move, computer_move_name)\n", + " \n", + " # Display the computer's move\n", + " display_computer_move(computer_move_name, frame)\n", + " \n", + " # Subtract one attempt\n", + " total_attempts -= 1\n", + " \n", + " # If winner is computer then it gets points and vice versa.\n", + " # We're also changing the color of rectangle based on who wins the round.\n", + "\n", + " if winner == \"Computer\":\n", + " computer_score +=1\n", + " rect_color = (0, 0, 255)\n", + "\n", + " elif winner == \"User\":\n", + " user_score += 1;\n", + " rect_color = (0, 250, 0)\n", + " \n", + " \n", + " elif winner == \"Tie\":\n", + " rect_color = (255, 250, 255)\n", + " \n", + " \n", + " # If all the attempts are up then find our the winner \n", + " if total_attempts == 0:\n", + " \n", + " play_again = show_winner(user_score, computer_score)\n", + " \n", + " # If the user pressed Enter then restart the game by re initializing all variables\n", + " if play_again:\n", + " user_score, computer_score, total_attempts = 0, 0, attempts\n", + " \n", + " # Otherwise quit the program.\n", + " else:\n", + " break\n", + " \n", + " # Display images when the hand is inside the box even when hand_inside variable is True.\n", + " elif final_user_move != \"nothing\" and hand_inside == True:\n", + " display_computer_move(computer_move_name, frame)\n", + " \n", + " # If class is nothing then hand_inside becomes False\n", + " elif final_user_move == 'nothing': \n", + " hand_inside = False\n", + " rect_color = (255, 0, 0)\n", + " \n", + "\n", + " # This is where all annotation is happening. \n", + "\n", + " cv2.putText(frame, \"Your Move: \" + final_user_move,\n", + " (420, 270), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1, cv2.LINE_AA)\n", + "\n", + " cv2.putText(frame, \"Computer's Move: \" + computer_move_name,\n", + " (2, 270), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1, cv2.LINE_AA)\n", + "\n", + " cv2.putText(frame, \"Your Score: \" + str(user_score),\n", + " (420, 300), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1, cv2.LINE_AA)\n", + " cv2.putText(frame, \"Computer Score: \" + str(computer_score),\n", + " (2, 300), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1, cv2.LINE_AA)\n", + " \n", + " cv2.putText(frame, \"Attempts left: {}\".format(total_attempts), (190, 400), cv2.FONT_HERSHEY_COMPLEX, 0.7,\n", + " (100, 2, 255), 1, cv2.LINE_AA)\n", + " \n", + " \n", + " cv2.rectangle(frame, (width - box_size, 0), (width, box_size), rect_color, 2)\n", + "\n", + " # Display the image \n", + " cv2.imshow(\"Rock Paper Scissors\", frame)\n", + "\n", + " # Exit if 'q' is pressed \n", + " k = cv2.waitKey(10)\n", + " if k == ord('q'):\n", + " break\n", + "\n", + "# Relase the camera and destroy all windows.\n", + "cap.release()\n", + "cv2.destroyAllWindows()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Playing-rock-paper-scissors-with-AI/images/comwins.jpg b/Playing-rock-paper-scissors-with-AI/images/comwins.jpg new file mode 100644 index 000000000..19b56c52f Binary files /dev/null and b/Playing-rock-paper-scissors-with-AI/images/comwins.jpg differ diff --git a/Playing-rock-paper-scissors-with-AI/images/draw.jpg b/Playing-rock-paper-scissors-with-AI/images/draw.jpg new file mode 100644 index 000000000..95901f021 Binary files /dev/null and b/Playing-rock-paper-scissors-with-AI/images/draw.jpg differ diff --git a/Playing-rock-paper-scissors-with-AI/images/paper.png b/Playing-rock-paper-scissors-with-AI/images/paper.png new file mode 100644 index 000000000..e93c22b75 Binary files /dev/null and b/Playing-rock-paper-scissors-with-AI/images/paper.png differ diff --git a/Playing-rock-paper-scissors-with-AI/images/rock.png b/Playing-rock-paper-scissors-with-AI/images/rock.png new file mode 100644 index 000000000..ed3306be3 Binary files /dev/null and b/Playing-rock-paper-scissors-with-AI/images/rock.png differ diff --git a/Playing-rock-paper-scissors-with-AI/images/scissor.png b/Playing-rock-paper-scissors-with-AI/images/scissor.png new file mode 100644 index 000000000..2170bf96b Binary files /dev/null and b/Playing-rock-paper-scissors-with-AI/images/scissor.png differ diff --git a/Playing-rock-paper-scissors-with-AI/images/youwin.jpg b/Playing-rock-paper-scissors-with-AI/images/youwin.jpg new file mode 100644 index 000000000..a279a191d Binary files /dev/null and b/Playing-rock-paper-scissors-with-AI/images/youwin.jpg differ diff --git a/Playing-rock-paper-scissors-with-AI/requirements.txt b/Playing-rock-paper-scissors-with-AI/requirements.txt new file mode 100644 index 000000000..087e53b80 --- /dev/null +++ b/Playing-rock-paper-scissors-with-AI/requirements.txt @@ -0,0 +1,6 @@ +opencv-contrib-python==4.3.0 +scikit-learn==0.11 +tensorflow==2.2.0 +numpy==1.18.3 +matplotlib==3.1.0 +scipy==1.4.1 \ No newline at end of file diff --git a/PyTorch-ONNX-TensorRT-CPP/CMakeLists.txt b/PyTorch-ONNX-TensorRT-CPP/CMakeLists.txt new file mode 100644 index 000000000..bcdc05df2 --- /dev/null +++ b/PyTorch-ONNX-TensorRT-CPP/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.10) +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED TRUE) +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}" ${CMAKE_MODULE_PATH}) + +project(TensorRTSample) + +find_package(Threads) +find_package(CUDA REQUIRED) +find_package(OpenCV REQUIRED) +find_package(TensorRT REQUIRED) + +# TARGETS -------------------------------------------------------------------------------------------------------------- +add_executable(trt_sample trt_sample.cpp) +target_include_directories(trt_sample PUBLIC ${OpenCV_INCLUDE_DIRS} ${CUDA_INCLUDE_DIRS} ${TensorRT_INCLUDE_DIRS}) +target_link_libraries(trt_sample PUBLIC ${OpenCV_LIBS} ${CUDA_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${TensorRT_LIBRARIES}) diff --git a/PyTorch-ONNX-TensorRT-CPP/FindTensorRT.cmake b/PyTorch-ONNX-TensorRT-CPP/FindTensorRT.cmake new file mode 100644 index 000000000..abe5d0ac2 --- /dev/null +++ b/PyTorch-ONNX-TensorRT-CPP/FindTensorRT.cmake @@ -0,0 +1,87 @@ +# source: +# https://github.com/NVIDIA/tensorrt-laboratory/blob/master/cmake/FindTensorRT.cmake + +# This module defines the following variables: +# +# :: +# +# TensorRT_INCLUDE_DIRS +# TensorRT_LIBRARIES +# TensorRT_FOUND +# +# :: +# +# TensorRT_VERSION_STRING - version (x.y.z) +# TensorRT_VERSION_MAJOR - major version (x) +# TensorRT_VERSION_MINOR - minor version (y) +# TensorRT_VERSION_PATCH - patch version (z) +# +# Hints +# ^^^^^ +# A user may set ``TensorRT_DIR`` to an installation root to tell this module where to look. +# +set(_TensorRT_SEARCHES) + +if(TensorRT_DIR) + set(_TensorRT_SEARCH_ROOT PATHS ${TensorRT_DIR} NO_DEFAULT_PATH) + list(APPEND _TensorRT_SEARCHES _TensorRT_SEARCH_ROOT) +endif() + +# appends some common paths +set(_TensorRT_SEARCH_NORMAL + PATHS "/usr" + ) +list(APPEND _TensorRT_SEARCHES _TensorRT_SEARCH_NORMAL) + +# Include dir +foreach(search ${_TensorRT_SEARCHES}) + find_path(TensorRT_INCLUDE_DIR NAMES NvInfer.h ${${search}} PATH_SUFFIXES include) +endforeach() + +if(NOT TensorRT_LIBRARY) + foreach(search ${_TensorRT_SEARCHES}) + find_library(TensorRT_LIBRARY NAMES nvinfer ${${search}} PATH_SUFFIXES lib) + endforeach() +endif() + +if(NOT TensorRT_PARSERS_LIBRARY) + foreach(search ${_TensorRT_SEARCHES}) + find_library(TensorRT_NVPARSERS_LIBRARY NAMES nvparsers ${${search}} PATH_SUFFIXES lib) + endforeach() +endif() + +if(NOT TensorRT_NVONNXPARSER_LIBRARY) + foreach(search ${_TensorRT_SEARCHES}) + find_library(TensorRT_NVONNXPARSER_LIBRARY NAMES nvonnxparser ${${search}} PATH_SUFFIXES lib) + endforeach() +endif() + +mark_as_advanced(TensorRT_INCLUDE_DIR) + +if(TensorRT_INCLUDE_DIR AND EXISTS "${TensorRT_INCLUDE_DIR}/NvInfer.h") + file(STRINGS "${TensorRT_INCLUDE_DIR}/NvInfer.h" TensorRT_MAJOR REGEX "^#define NV_TENSORRT_MAJOR [0-9]+.*$") + file(STRINGS "${TensorRT_INCLUDE_DIR}/NvInfer.h" TensorRT_MINOR REGEX "^#define NV_TENSORRT_MINOR [0-9]+.*$") + file(STRINGS "${TensorRT_INCLUDE_DIR}/NvInfer.h" TensorRT_PATCH REGEX "^#define NV_TENSORRT_PATCH [0-9]+.*$") + + string(REGEX REPLACE "^#define NV_TENSORRT_MAJOR ([0-9]+).*$" "\\1" TensorRT_VERSION_MAJOR "${TensorRT_MAJOR}") + string(REGEX REPLACE "^#define NV_TENSORRT_MINOR ([0-9]+).*$" "\\1" TensorRT_VERSION_MINOR "${TensorRT_MINOR}") + string(REGEX REPLACE "^#define NV_TENSORRT_PATCH ([0-9]+).*$" "\\1" TensorRT_VERSION_PATCH "${TensorRT_PATCH}") + set(TensorRT_VERSION_STRING "${TensorRT_VERSION_MAJOR}.${TensorRT_VERSION_MINOR}.${TensorRT_VERSION_PATCH}") +endif() + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(TensorRT REQUIRED_VARS TensorRT_LIBRARY TensorRT_INCLUDE_DIR VERSION_VAR TensorRT_VERSION_STRING) + +if(TensorRT_FOUND) + set(TensorRT_INCLUDE_DIRS ${TensorRT_INCLUDE_DIR}) + + if(NOT TensorRT_LIBRARIES) + set(TensorRT_LIBRARIES ${TensorRT_LIBRARY} ${TensorRT_NVONNXPARSER_LIBRARY} ${TensorRT_NVPARSERS_LIBRARY}) + endif() + + if(NOT TARGET TensorRT::TensorRT) + add_library(TensorRT::TensorRT UNKNOWN IMPORTED) + set_target_properties(TensorRT::TensorRT PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${TensorRT_INCLUDE_DIRS}") + set_property(TARGET TensorRT::TensorRT APPEND PROPERTY IMPORTED_LOCATION "${TensorRT_LIBRARY}") + endif() +endif() diff --git a/PyTorch-ONNX-TensorRT-CPP/README.md b/PyTorch-ONNX-TensorRT-CPP/README.md new file mode 100644 index 000000000..ece14ec23 --- /dev/null +++ b/PyTorch-ONNX-TensorRT-CPP/README.md @@ -0,0 +1,34 @@ +# How To Run Inference Using TensorRT C++ API +The blog post is here: https://www.learnopencv.com/how-to-run-inference-using-tensorrt-c-api/ + +### To run PyTorch part: +```shell script +python3 -m pip install -r requirements.txt +python3 pytorch_model.py +``` + +### To run TensorRT part: +1. Install [CMake](https://cmake.org/) at least 3.10 version +2. Download and install NVIDIA CUDA 10.0 or later following by official instruction: [link](https://developer.nvidia.com/cuda-10.0-download-archive) +3. Download and extract CuDNN library for your CUDA version (login required): [link](https://developer.nvidia.com/rdp/cudnn-download) +4. Download and extract NVIDIA TensorRT library for your CUDA version (login required): [link](https://developer.nvidia.com/nvidia-tensorrt-6x-download). The minimum required version is 6.0.1.5 +5. Add the path to CUDA, TensorRT, CuDNN to PATH variable (or LD_LIBRARY_PATH) +6. Build or install a pre-built version of OpenCV and OpenCV Contrib. The minimum required version is 4.0.0. + +```shell script +mkdir build +cd build +cmake -DOpenCV_DIR=[path-to-opencv-build] -DTensorRT_DIR=[path-to-tensorrt] .. +make -j8 +trt_sample[.exe] resnet50.onnx turkish_coffee.jpg +``` + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
\ No newline at end of file diff --git a/PyTorch-ONNX-TensorRT-CPP/imagenet_classes.txt b/PyTorch-ONNX-TensorRT-CPP/imagenet_classes.txt new file mode 100644 index 000000000..722c98456 --- /dev/null +++ b/PyTorch-ONNX-TensorRT-CPP/imagenet_classes.txt @@ -0,0 +1,1000 @@ +tench, Tinca tinca +goldfish, Carassius auratus +great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias +tiger shark, Galeocerdo cuvieri +hammerhead, hammerhead shark +electric ray, crampfish, numbfish, torpedo +stingray +cock +hen +ostrich, Struthio camelus +brambling, Fringilla montifringilla +goldfinch, Carduelis carduelis +house finch, linnet, Carpodacus mexicanus +junco, snowbird +indigo bunting, indigo finch, indigo bird, Passerina cyanea +robin, American robin, Turdus migratorius +bulbul +jay +magpie +chickadee +water ouzel, dipper +kite +bald eagle, American eagle, Haliaeetus leucocephalus +vulture +great grey owl, great gray owl, Strix nebulosa +European fire salamander, Salamandra salamandra +common newt, Triturus vulgaris +eft +spotted salamander, Ambystoma maculatum +axolotl, mud puppy, Ambystoma mexicanum +bullfrog, Rana catesbeiana +tree frog, tree-frog +tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui +loggerhead, loggerhead turtle, Caretta caretta +leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea +mud turtle +terrapin +box turtle, box tortoise +banded gecko +common iguana, iguana, Iguana iguana +American chameleon, anole, Anolis carolinensis +whiptail, whiptail lizard +agama +frilled lizard, Chlamydosaurus kingi +alligator lizard +Gila monster, Heloderma suspectum +green lizard, Lacerta viridis +African chameleon, Chamaeleo chamaeleon +Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis +African crocodile, Nile crocodile, Crocodylus niloticus +American alligator, Alligator mississipiensis +triceratops +thunder snake, worm snake, Carphophis amoenus +ringneck snake, ring-necked snake, ring snake +hognose snake, puff adder, sand viper +green snake, grass snake +king snake, kingsnake +garter snake, grass snake +water snake +vine snake +night snake, Hypsiglena torquata +boa constrictor, Constrictor constrictor +rock python, rock snake, Python sebae +Indian cobra, Naja naja +green mamba +sea snake +horned viper, cerastes, sand viper, horned asp, Cerastes cornutus +diamondback, diamondback rattlesnake, Crotalus adamanteus +sidewinder, horned rattlesnake, Crotalus cerastes +trilobite +harvestman, daddy longlegs, Phalangium opilio +scorpion +black and gold garden spider, Argiope aurantia +barn spider, Araneus cavaticus +garden spider, Aranea diademata +black widow, Latrodectus mactans +tarantula +wolf spider, hunting spider +tick +centipede +black grouse +ptarmigan +ruffed grouse, partridge, Bonasa umbellus +prairie chicken, prairie grouse, prairie fowl +peacock +quail +partridge +African grey, African gray, Psittacus erithacus +macaw +sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita +lorikeet +coucal +bee eater +hornbill +hummingbird +jacamar +toucan +drake +red-breasted merganser, Mergus serrator +goose +black swan, Cygnus atratus +tusker +echidna, spiny anteater, anteater +platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus +wallaby, brush kangaroo +koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus +wombat +jellyfish +sea anemone, anemone +brain coral +flatworm, platyhelminth +nematode, nematode worm, roundworm +conch +snail +slug +sea slug, nudibranch +chiton, coat-of-mail shell, sea cradle, polyplacophore +chambered nautilus, pearly nautilus, nautilus +Dungeness crab, Cancer magister +rock crab, Cancer irroratus +fiddler crab +king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica +American lobster, Northern lobster, Maine lobster, Homarus americanus +spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish +crayfish, crawfish, crawdad, crawdaddy +hermit crab +isopod +white stork, Ciconia ciconia +black stork, Ciconia nigra +spoonbill +flamingo +little blue heron, Egretta caerulea +American egret, great white heron, Egretta albus +bittern +crane +limpkin, Aramus pictus +European gallinule, Porphyrio porphyrio +American coot, marsh hen, mud hen, water hen, Fulica americana +bustard +ruddy turnstone, Arenaria interpres +red-backed sandpiper, dunlin, Erolia alpina +redshank, Tringa totanus +dowitcher +oystercatcher, oyster catcher +pelican +king penguin, Aptenodytes patagonica +albatross, mollymawk +grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus +killer whale, killer, orca, grampus, sea wolf, Orcinus orca +dugong, Dugong dugon +sea lion +Chihuahua +Japanese spaniel +Maltese dog, Maltese terrier, Maltese +Pekinese, Pekingese, Peke +Shih-Tzu +Blenheim spaniel +papillon +toy terrier +Rhodesian ridgeback +Afghan hound, Afghan +basset, basset hound +beagle +bloodhound, sleuthhound +bluetick +black-and-tan coonhound +Walker hound, Walker foxhound +English foxhound +redbone +borzoi, Russian wolfhound +Irish wolfhound +Italian greyhound +whippet +Ibizan hound, Ibizan Podenco +Norwegian elkhound, elkhound +otterhound, otter hound +Saluki, gazelle hound +Scottish deerhound, deerhound +Weimaraner +Staffordshire bullterrier, Staffordshire bull terrier +American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier +Bedlington terrier +Border terrier +Kerry blue terrier +Irish terrier +Norfolk terrier +Norwich terrier +Yorkshire terrier +wire-haired fox terrier +Lakeland terrier +Sealyham terrier, Sealyham +Airedale, Airedale terrier +cairn, cairn terrier +Australian terrier +Dandie Dinmont, Dandie Dinmont terrier +Boston bull, Boston terrier +miniature schnauzer +giant schnauzer +standard schnauzer +Scotch terrier, Scottish terrier, Scottie +Tibetan terrier, chrysanthemum dog +silky terrier, Sydney silky +soft-coated wheaten terrier +West Highland white terrier +Lhasa, Lhasa apso +flat-coated retriever +curly-coated retriever +golden retriever +Labrador retriever +Chesapeake Bay retriever +German short-haired pointer +vizsla, Hungarian pointer +English setter +Irish setter, red setter +Gordon setter +Brittany spaniel +clumber, clumber spaniel +English springer, English springer spaniel +Welsh springer spaniel +cocker spaniel, English cocker spaniel, cocker +Sussex spaniel +Irish water spaniel +kuvasz +schipperke +groenendael +malinois +briard +kelpie +komondor +Old English sheepdog, bobtail +Shetland sheepdog, Shetland sheep dog, Shetland +collie +Border collie +Bouvier des Flandres, Bouviers des Flandres +Rottweiler +German shepherd, German shepherd dog, German police dog, alsatian +Doberman, Doberman pinscher +miniature pinscher +Greater Swiss Mountain dog +Bernese mountain dog +Appenzeller +EntleBucher +boxer +bull mastiff +Tibetan mastiff +French bulldog +Great Dane +Saint Bernard, St Bernard +Eskimo dog, husky +malamute, malemute, Alaskan malamute +Siberian husky +dalmatian, coach dog, carriage dog +affenpinscher, monkey pinscher, monkey dog +basenji +pug, pug-dog +Leonberg +Newfoundland, Newfoundland dog +Great Pyrenees +Samoyed, Samoyede +Pomeranian +chow, chow chow +keeshond +Brabancon griffon +Pembroke, Pembroke Welsh corgi +Cardigan, Cardigan Welsh corgi +toy poodle +miniature poodle +standard poodle +Mexican hairless +timber wolf, grey wolf, gray wolf, Canis lupus +white wolf, Arctic wolf, Canis lupus tundrarum +red wolf, maned wolf, Canis rufus, Canis niger +coyote, prairie wolf, brush wolf, Canis latrans +dingo, warrigal, warragal, Canis dingo +dhole, Cuon alpinus +African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus +hyena, hyaena +red fox, Vulpes vulpes +kit fox, Vulpes macrotis +Arctic fox, white fox, Alopex lagopus +grey fox, gray fox, Urocyon cinereoargenteus +tabby, tabby cat +tiger cat +Persian cat +Siamese cat, Siamese +Egyptian cat +cougar, puma, catamount, mountain lion, painter, panther, Felis concolor +lynx, catamount +leopard, Panthera pardus +snow leopard, ounce, Panthera uncia +jaguar, panther, Panthera onca, Felis onca +lion, king of beasts, Panthera leo +tiger, Panthera tigris +cheetah, chetah, Acinonyx jubatus +brown bear, bruin, Ursus arctos +American black bear, black bear, Ursus americanus, Euarctos americanus +ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus +sloth bear, Melursus ursinus, Ursus ursinus +mongoose +meerkat, mierkat +tiger beetle +ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle +ground beetle, carabid beetle +long-horned beetle, longicorn, longicorn beetle +leaf beetle, chrysomelid +dung beetle +rhinoceros beetle +weevil +fly +bee +ant, emmet, pismire +grasshopper, hopper +cricket +walking stick, walkingstick, stick insect +cockroach, roach +mantis, mantid +cicada, cicala +leafhopper +lacewing, lacewing fly +dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk +damselfly +admiral +ringlet, ringlet butterfly +monarch, monarch butterfly, milkweed butterfly, Danaus plexippus +cabbage butterfly +sulphur butterfly, sulfur butterfly +lycaenid, lycaenid butterfly +starfish, sea star +sea urchin +sea cucumber, holothurian +wood rabbit, cottontail, cottontail rabbit +hare +Angora, Angora rabbit +hamster +porcupine, hedgehog +fox squirrel, eastern fox squirrel, Sciurus niger +marmot +beaver +guinea pig, Cavia cobaya +sorrel +zebra +hog, pig, grunter, squealer, Sus scrofa +wild boar, boar, Sus scrofa +warthog +hippopotamus, hippo, river horse, Hippopotamus amphibius +ox +water buffalo, water ox, Asiatic buffalo, Bubalus bubalis +bison +ram, tup +bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis +ibex, Capra ibex +hartebeest +impala, Aepyceros melampus +gazelle +Arabian camel, dromedary, Camelus dromedarius +llama +weasel +mink +polecat, fitch, foulmart, foumart, Mustela putorius +black-footed ferret, ferret, Mustela nigripes +otter +skunk, polecat, wood pussy +badger +armadillo +three-toed sloth, ai, Bradypus tridactylus +orangutan, orang, orangutang, Pongo pygmaeus +gorilla, Gorilla gorilla +chimpanzee, chimp, Pan troglodytes +gibbon, Hylobates lar +siamang, Hylobates syndactylus, Symphalangus syndactylus +guenon, guenon monkey +patas, hussar monkey, Erythrocebus patas +baboon +macaque +langur +colobus, colobus monkey +proboscis monkey, Nasalis larvatus +marmoset +capuchin, ringtail, Cebus capucinus +howler monkey, howler +titi, titi monkey +spider monkey, Ateles geoffroyi +squirrel monkey, Saimiri sciureus +Madagascar cat, ring-tailed lemur, Lemur catta +indri, indris, Indri indri, Indri brevicaudatus +Indian elephant, Elephas maximus +African elephant, Loxodonta africana +lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens +giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca +barracouta, snoek +eel +coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch +rock beauty, Holocanthus tricolor +anemone fish +sturgeon +gar, garfish, garpike, billfish, Lepisosteus osseus +lionfish +puffer, pufferfish, blowfish, globefish +abacus +abaya +academic gown, academic robe, judge's robe +accordion, piano accordion, squeeze box +acoustic guitar +aircraft carrier, carrier, flattop, attack aircraft carrier +airliner +airship, dirigible +altar +ambulance +amphibian, amphibious vehicle +analog clock +apiary, bee house +apron +ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin +assault rifle, assault gun +backpack, back pack, knapsack, packsack, rucksack, haversack +bakery, bakeshop, bakehouse +balance beam, beam +balloon +ballpoint, ballpoint pen, ballpen, Biro +Band Aid +banjo +bannister, banister, balustrade, balusters, handrail +barbell +barber chair +barbershop +barn +barometer +barrel, cask +barrow, garden cart, lawn cart, wheelbarrow +baseball +basketball +bassinet +bassoon +bathing cap, swimming cap +bath towel +bathtub, bathing tub, bath, tub +beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon +beacon, lighthouse, beacon light, pharos +beaker +bearskin, busby, shako +beer bottle +beer glass +bell cote, bell cot +bib +bicycle-built-for-two, tandem bicycle, tandem +bikini, two-piece +binder, ring-binder +binoculars, field glasses, opera glasses +birdhouse +boathouse +bobsled, bobsleigh, bob +bolo tie, bolo, bola tie, bola +bonnet, poke bonnet +bookcase +bookshop, bookstore, bookstall +bottlecap +bow +bow tie, bow-tie, bowtie +brass, memorial tablet, plaque +brassiere, bra, bandeau +breakwater, groin, groyne, mole, bulwark, seawall, jetty +breastplate, aegis, egis +broom +bucket, pail +buckle +bulletproof vest +bullet train, bullet +butcher shop, meat market +cab, hack, taxi, taxicab +caldron, cauldron +candle, taper, wax light +cannon +canoe +can opener, tin opener +cardigan +car mirror +carousel, carrousel, merry-go-round, roundabout, whirligig +carpenter's kit, tool kit +carton +car wheel +cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM +cassette +cassette player +castle +catamaran +CD player +cello, violoncello +cellular telephone, cellular phone, cellphone, cell, mobile phone +chain +chainlink fence +chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour +chain saw, chainsaw +chest +chiffonier, commode +chime, bell, gong +china cabinet, china closet +Christmas stocking +church, church building +cinema, movie theater, movie theatre, movie house, picture palace +cleaver, meat cleaver, chopper +cliff dwelling +cloak +clog, geta, patten, sabot +cocktail shaker +coffee mug +coffeepot +coil, spiral, volute, whorl, helix +combination lock +computer keyboard, keypad +confectionery, confectionary, candy store +container ship, containership, container vessel +convertible +corkscrew, bottle screw +cornet, horn, trumpet, trump +cowboy boot +cowboy hat, ten-gallon hat +cradle +crane +crash helmet +crate +crib, cot +Crock Pot +croquet ball +crutch +cuirass +dam, dike, dyke +desk +desktop computer +dial telephone, dial phone +diaper, nappy, napkin +digital clock +digital watch +dining table, board +dishrag, dishcloth +dishwasher, dish washer, dishwashing machine +disk brake, disc brake +dock, dockage, docking facility +dogsled, dog sled, dog sleigh +dome +doormat, welcome mat +drilling platform, offshore rig +drum, membranophone, tympan +drumstick +dumbbell +Dutch oven +electric fan, blower +electric guitar +electric locomotive +entertainment center +envelope +espresso maker +face powder +feather boa, boa +file, file cabinet, filing cabinet +fireboat +fire engine, fire truck +fire screen, fireguard +flagpole, flagstaff +flute, transverse flute +folding chair +football helmet +forklift +fountain +fountain pen +four-poster +freight car +French horn, horn +frying pan, frypan, skillet +fur coat +garbage truck, dustcart +gasmask, respirator, gas helmet +gas pump, gasoline pump, petrol pump, island dispenser +goblet +go-kart +golf ball +golfcart, golf cart +gondola +gong, tam-tam +gown +grand piano, grand +greenhouse, nursery, glasshouse +grille, radiator grille +grocery store, grocery, food market, market +guillotine +hair slide +hair spray +half track +hammer +hamper +hand blower, blow dryer, blow drier, hair dryer, hair drier +hand-held computer, hand-held microcomputer +handkerchief, hankie, hanky, hankey +hard disc, hard disk, fixed disk +harmonica, mouth organ, harp, mouth harp +harp +harvester, reaper +hatchet +holster +home theater, home theatre +honeycomb +hook, claw +hoopskirt, crinoline +horizontal bar, high bar +horse cart, horse-cart +hourglass +iPod +iron, smoothing iron +jack-o'-lantern +jean, blue jean, denim +jeep, landrover +jersey, T-shirt, tee shirt +jigsaw puzzle +jinrikisha, ricksha, rickshaw +joystick +kimono +knee pad +knot +lab coat, laboratory coat +ladle +lampshade, lamp shade +laptop, laptop computer +lawn mower, mower +lens cap, lens cover +letter opener, paper knife, paperknife +library +lifeboat +lighter, light, igniter, ignitor +limousine, limo +liner, ocean liner +lipstick, lip rouge +Loafer +lotion +loudspeaker, speaker, speaker unit, loudspeaker system, speaker system +loupe, jeweler's loupe +lumbermill, sawmill +magnetic compass +mailbag, postbag +mailbox, letter box +maillot +maillot, tank suit +manhole cover +maraca +marimba, xylophone +mask +matchstick +maypole +maze, labyrinth +measuring cup +medicine chest, medicine cabinet +megalith, megalithic structure +microphone, mike +microwave, microwave oven +military uniform +milk can +minibus +miniskirt, mini +minivan +missile +mitten +mixing bowl +mobile home, manufactured home +Model T +modem +monastery +monitor +moped +mortar +mortarboard +mosque +mosquito net +motor scooter, scooter +mountain bike, all-terrain bike, off-roader +mountain tent +mouse, computer mouse +mousetrap +moving van +muzzle +nail +neck brace +necklace +nipple +notebook, notebook computer +obelisk +oboe, hautboy, hautbois +ocarina, sweet potato +odometer, hodometer, mileometer, milometer +oil filter +organ, pipe organ +oscilloscope, scope, cathode-ray oscilloscope, CRO +overskirt +oxcart +oxygen mask +packet +paddle, boat paddle +paddlewheel, paddle wheel +padlock +paintbrush +pajama, pyjama, pj's, jammies +palace +panpipe, pandean pipe, syrinx +paper towel +parachute, chute +parallel bars, bars +park bench +parking meter +passenger car, coach, carriage +patio, terrace +pay-phone, pay-station +pedestal, plinth, footstall +pencil box, pencil case +pencil sharpener +perfume, essence +Petri dish +photocopier +pick, plectrum, plectron +pickelhaube +picket fence, paling +pickup, pickup truck +pier +piggy bank, penny bank +pill bottle +pillow +ping-pong ball +pinwheel +pirate, pirate ship +pitcher, ewer +plane, carpenter's plane, woodworking plane +planetarium +plastic bag +plate rack +plow, plough +plunger, plumber's helper +Polaroid camera, Polaroid Land camera +pole +police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria +poncho +pool table, billiard table, snooker table +pop bottle, soda bottle +pot, flowerpot +potter's wheel +power drill +prayer rug, prayer mat +printer +prison, prison house +projectile, missile +projector +puck, hockey puck +punching bag, punch bag, punching ball, punchball +purse +quill, quill pen +quilt, comforter, comfort, puff +racer, race car, racing car +racket, racquet +radiator +radio, wireless +radio telescope, radio reflector +rain barrel +recreational vehicle, RV, R.V. +reel +reflex camera +refrigerator, icebox +remote control, remote +restaurant, eating house, eating place, eatery +revolver, six-gun, six-shooter +rifle +rocking chair, rocker +rotisserie +rubber eraser, rubber, pencil eraser +rugby ball +rule, ruler +running shoe +safe +safety pin +saltshaker, salt shaker +sandal +sarong +sax, saxophone +scabbard +scale, weighing machine +school bus +schooner +scoreboard +screen, CRT screen +screw +screwdriver +seat belt, seatbelt +sewing machine +shield, buckler +shoe shop, shoe-shop, shoe store +shoji +shopping basket +shopping cart +shovel +shower cap +shower curtain +ski +ski mask +sleeping bag +slide rule, slipstick +sliding door +slot, one-armed bandit +snorkel +snowmobile +snowplow, snowplough +soap dispenser +soccer ball +sock +solar dish, solar collector, solar furnace +sombrero +soup bowl +space bar +space heater +space shuttle +spatula +speedboat +spider web, spider's web +spindle +sports car, sport car +spotlight, spot +stage +steam locomotive +steel arch bridge +steel drum +stethoscope +stole +stone wall +stopwatch, stop watch +stove +strainer +streetcar, tram, tramcar, trolley, trolley car +stretcher +studio couch, day bed +stupa, tope +submarine, pigboat, sub, U-boat +suit, suit of clothes +sundial +sunglass +sunglasses, dark glasses, shades +sunscreen, sunblock, sun blocker +suspension bridge +swab, swob, mop +sweatshirt +swimming trunks, bathing trunks +swing +switch, electric switch, electrical switch +syringe +table lamp +tank, army tank, armored combat vehicle, armoured combat vehicle +tape player +teapot +teddy, teddy bear +television, television system +tennis ball +thatch, thatched roof +theater curtain, theatre curtain +thimble +thresher, thrasher, threshing machine +throne +tile roof +toaster +tobacco shop, tobacconist shop, tobacconist +toilet seat +torch +totem pole +tow truck, tow car, wrecker +toyshop +tractor +trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi +tray +trench coat +tricycle, trike, velocipede +trimaran +tripod +triumphal arch +trolleybus, trolley coach, trackless trolley +trombone +tub, vat +turnstile +typewriter keyboard +umbrella +unicycle, monocycle +upright, upright piano +vacuum, vacuum cleaner +vase +vault +velvet +vending machine +vestment +viaduct +violin, fiddle +volleyball +waffle iron +wall clock +wallet, billfold, notecase, pocketbook +wardrobe, closet, press +warplane, military plane +washbasin, handbasin, washbowl, lavabo, wash-hand basin +washer, automatic washer, washing machine +water bottle +water jug +water tower +whiskey jug +whistle +wig +window screen +window shade +Windsor tie +wine bottle +wing +wok +wooden spoon +wool, woolen, woollen +worm fence, snake fence, snake-rail fence, Virginia fence +wreck +yawl +yurt +web site, website, internet site, site +comic book +crossword puzzle, crossword +street sign +traffic light, traffic signal, stoplight +book jacket, dust cover, dust jacket, dust wrapper +menu +plate +guacamole +consomme +hot pot, hotpot +trifle +ice cream, icecream +ice lolly, lolly, lollipop, popsicle +French loaf +bagel, beigel +pretzel +cheeseburger +hotdog, hot dog, red hot +mashed potato +head cabbage +broccoli +cauliflower +zucchini, courgette +spaghetti squash +acorn squash +butternut squash +cucumber, cuke +artichoke, globe artichoke +bell pepper +cardoon +mushroom +Granny Smith +strawberry +orange +lemon +fig +pineapple, ananas +banana +jackfruit, jak, jack +custard apple +pomegranate +hay +carbonara +chocolate sauce, chocolate syrup +dough +meat loaf, meatloaf +pizza, pizza pie +potpie +burrito +red wine +espresso +cup +eggnog +alp +bubble +cliff, drop, drop-off +coral reef +geyser +lakeside, lakeshore +promontory, headland, head, foreland +sandbar, sand bar +seashore, coast, seacoast, sea-coast +valley, vale +volcano +ballplayer, baseball player +groom, bridegroom +scuba diver +rapeseed +daisy +yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum +corn +acorn +hip, rose hip, rosehip +buckeye, horse chestnut, conker +coral fungus +agaric +gyromitra +stinkhorn, carrion fungus +earthstar +hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa +bolete +ear, spike, capitulum +toilet tissue, toilet paper, bathroom tissue \ No newline at end of file diff --git a/PyTorch-ONNX-TensorRT-CPP/pytorch_model.py b/PyTorch-ONNX-TensorRT-CPP/pytorch_model.py new file mode 100644 index 000000000..d3d79a5c4 --- /dev/null +++ b/PyTorch-ONNX-TensorRT-CPP/pytorch_model.py @@ -0,0 +1,79 @@ +import cv2 +import onnx +import torch +from albumentations import (Compose,Resize,) +from albumentations.augmentations.transforms import Normalize +from albumentations.pytorch.transforms import ToTensor +from torchvision import models + + +def preprocess_image(img_path): + # transformations for the input data + transforms = Compose([ + Resize(224, 224, interpolation=cv2.INTER_NEAREST), + Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), + ToTensor(), + ]) + + # read input image + input_img = cv2.imread(img_path) + # do transformations + input_data = transforms(image=input_img)["image"] + # prepare batch + batch_data = torch.unsqueeze(input_data, 0) + + return batch_data + + +def postprocess(output_data): + # get class names + with open("imagenet_classes.txt") as f: + classes = [line.strip() for line in f.readlines()] + # calculate human-readable value by softmax + confidences = torch.nn.functional.softmax(output_data, dim=1)[0] * 100 + # find top predicted classes + _, indices = torch.sort(output_data, descending=True) + i = 0 + # print the top classes predicted by the model + while confidences[indices[0][i]] > 0.5: + class_idx = indices[0][i] + print( + "class:", + classes[class_idx], + ", confidence:", + confidences[class_idx].item(), + "%, index:", + class_idx.item(), + ) + i += 1 + + +def main(): + # load pre-trained model ------------------------------------------------------------------------------------------- + model = models.resnet50(pretrained=True) + + # preprocessing stage ---------------------------------------------------------------------------------------------- + input = preprocess_image("turkish_coffee.jpg").cuda() + + # inference stage -------------------------------------------------------------------------------------------------- + model.eval() + model.cuda() + output = model(input) + + # post-processing stage -------------------------------------------------------------------------------------------- + postprocess(output) + + # convert to ONNX -------------------------------------------------------------------------------------------------- + ONNX_FILE_PATH = "resnet50.onnx" + torch.onnx.export(model, input, ONNX_FILE_PATH, input_names=["input"], output_names=["output"], export_params=True) + + onnx_model = onnx.load(ONNX_FILE_PATH) + # check that the model converted fine + onnx.checker.check_model(onnx_model) + + print("Model was successfully converted to ONNX format.") + print("It was saved to", ONNX_FILE_PATH) + + +if __name__ == '__main__': + main() diff --git a/PyTorch-ONNX-TensorRT-CPP/requirements.txt b/PyTorch-ONNX-TensorRT-CPP/requirements.txt new file mode 100644 index 000000000..853ddc03c --- /dev/null +++ b/PyTorch-ONNX-TensorRT-CPP/requirements.txt @@ -0,0 +1,6 @@ +torch==1.2.0 +torchvision==0.4.0 +albumentations==0.4.5 +onnx==1.4.1 +opencv-python==4.2.0.34 + diff --git a/PyTorch-ONNX-TensorRT-CPP/resnet50.onnx b/PyTorch-ONNX-TensorRT-CPP/resnet50.onnx new file mode 100644 index 000000000..ec9fc652f --- /dev/null +++ b/PyTorch-ONNX-TensorRT-CPP/resnet50.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c904c5d300d569ebb82fdc0701161659a371c122531232bc909afda33262e379 +size 102483848 diff --git a/PyTorch-ONNX-TensorRT-CPP/trt_inference.py b/PyTorch-ONNX-TensorRT-CPP/trt_inference.py new file mode 100644 index 000000000..4354bfbc4 --- /dev/null +++ b/PyTorch-ONNX-TensorRT-CPP/trt_inference.py @@ -0,0 +1,76 @@ +from pytorch_model import preprocess_image, postprocess +import torch +import pycuda.driver as cuda +import pycuda.autoinit +import numpy as np +import tensorrt as trt + + +ONNX_FILE_PATH = "resnet50.onnx" +# logger to capture errors, warnings, and other information during the build and inference phases +TRT_LOGGER = trt.Logger() + + +def build_engine(onnx_file_path): + # initialize TensorRT engine and parse ONNX model + builder = trt.Builder(TRT_LOGGER) + network = builder.create_network() + parser = trt.OnnxParser(network, TRT_LOGGER) + + # allow TensorRT to use up to 1GB of GPU memory for tactic selection + builder.max_workspace_size = 1 << 30 + # we have only one image in batch + builder.max_batch_size = 1 + # use FP16 mode if possible + if builder.platform_has_fast_fp16: + builder.fp16_mode = True + + # parse ONNX + with open(onnx_file_path, 'rb') as model: + print('Beginning ONNX file parsing') + parser.parse(model.read()) + print('Completed parsing of ONNX file') + + # generate TensorRT engine optimized for the target platform + print('Building an engine...') + engine = builder.build_cuda_engine(network) + context = engine.create_execution_context() + print("Completed creating Engine") + return engine, context + + +def main(): + # initialize TensorRT engine and parse ONNX model + engine, context = build_engine(ONNX_FILE_PATH) + # get sizes of input and output and allocate memory required for input data and for output data + for binding in engine: + if engine.binding_is_input(binding): # we expect only one input + input_shape = engine.get_binding_shape(binding) + input_size = trt.volume(input_shape) * engine.max_batch_size * np.dtype(np.float32).itemsize # in bytes + device_input = cuda.mem_alloc(input_size) + else: # and one output + output_shape = engine.get_binding_shape(binding) + # create page-locked memory buffers (i.e. won't be swapped to disk) + host_output = cuda.pagelocked_empty(trt.volume(output_shape) * engine.max_batch_size, dtype=np.float32) + device_output = cuda.mem_alloc(host_output.nbytes) + + # Create a stream in which to copy inputs/outputs and run inference. + stream = cuda.Stream() + + + # preprocess input data + host_input = np.array(preprocess_image("turkish_coffee.jpg").numpy(), dtype=np.float32, order='C') + cuda.memcpy_htod_async(device_input, host_input, stream) + + # run inference + context.execute_async(bindings=[int(device_input), int(device_output)], stream_handle=stream.handle) + cuda.memcpy_dtoh_async(host_output, device_output, stream) + stream.synchronize() + + # postprocess results + output_data = torch.Tensor(host_output).reshape(engine.max_batch_size, output_shape[0]) + postprocess(output_data) + + +if __name__ == '__main__': + main() diff --git a/PyTorch-ONNX-TensorRT-CPP/trt_sample.cpp b/PyTorch-ONNX-TensorRT-CPP/trt_sample.cpp new file mode 100644 index 000000000..656d5b2a9 --- /dev/null +++ b/PyTorch-ONNX-TensorRT-CPP/trt_sample.cpp @@ -0,0 +1,219 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// utilities ---------------------------------------------------------------------------------------------------------- +// class to log errors, warnings, and other information during the build and inference phases +class Logger : public nvinfer1::ILogger +{ +public: + void log(Severity severity, const char* msg) override { + // remove this 'if' if you need more logged info + if ((severity == Severity::kERROR) || (severity == Severity::kINTERNAL_ERROR)) { + std::cout << msg << "\n"; + } + } +} gLogger; + +// destroy TensorRT objects if something goes wrong +struct TRTDestroy +{ + template + void operator()(T* obj) const + { + if (obj) + { + obj->destroy(); + } + } +}; + +template +using TRTUniquePtr = std::unique_ptr; + +// calculate size of tensor +size_t getSizeByDim(const nvinfer1::Dims& dims) +{ + size_t size = 1; + for (size_t i = 0; i < dims.nbDims; ++i) + { + size *= dims.d[i]; + } + return size; +} + +// get classes names +std::vector getClassNames(const std::string& imagenet_classes) +{ + std::ifstream classes_file(imagenet_classes); + std::vector classes; + if (!classes_file.good()) + { + std::cerr << "ERROR: can't read file with classes names.\n"; + return classes; + } + std::string class_name; + while (std::getline(classes_file, class_name)) + { + classes.push_back(class_name); + } + return classes; +} + +// preprocessing stage ------------------------------------------------------------------------------------------------ +void preprocessImage(const std::string& image_path, float* gpu_input, const nvinfer1::Dims& dims) +{ + // read input image + cv::Mat frame = cv::imread(image_path); + if (frame.empty()) + { + std::cerr << "Input image " << image_path << " load failed\n"; + return; + } + cv::cuda::GpuMat gpu_frame; + // upload image to GPU + gpu_frame.upload(frame); + + auto input_width = dims.d[2]; + auto input_height = dims.d[1]; + auto channels = dims.d[0]; + auto input_size = cv::Size(input_width, input_height); + // resize + cv::cuda::GpuMat resized; + cv::cuda::resize(gpu_frame, resized, input_size, 0, 0, cv::INTER_NEAREST); + // normalize + cv::cuda::GpuMat flt_image; + resized.convertTo(flt_image, CV_32FC3, 1.f / 255.f); + cv::cuda::subtract(flt_image, cv::Scalar(0.485f, 0.456f, 0.406f), flt_image, cv::noArray(), -1); + cv::cuda::divide(flt_image, cv::Scalar(0.229f, 0.224f, 0.225f), flt_image, 1, -1); + // to tensor + std::vector chw; + for (size_t i = 0; i < channels; ++i) + { + chw.emplace_back(cv::cuda::GpuMat(input_size, CV_32FC1, gpu_input + i * input_width * input_height)); + } + cv::cuda::split(flt_image, chw); +} + +// post-processing stage ---------------------------------------------------------------------------------------------- +void postprocessResults(float *gpu_output, const nvinfer1::Dims &dims, int batch_size) +{ + // get class names + auto classes = getClassNames("imagenet_classes.txt"); + + // copy results from GPU to CPU + std::vector cpu_output(getSizeByDim(dims) * batch_size); + cudaMemcpy(cpu_output.data(), gpu_output, cpu_output.size() * sizeof(float), cudaMemcpyDeviceToHost); + + // calculate softmax + std::transform(cpu_output.begin(), cpu_output.end(), cpu_output.begin(), [](float val) {return std::exp(val);}); + auto sum = std::accumulate(cpu_output.begin(), cpu_output.end(), 0.0); + // find top classes predicted by the model + std::vector indices(getSizeByDim(dims) * batch_size); + std::iota(indices.begin(), indices.end(), 0); // generate sequence 0, 1, 2, 3, ..., 999 + std::sort(indices.begin(), indices.end(), [&cpu_output](int i1, int i2) {return cpu_output[i1] > cpu_output[i2];}); + // print results + int i = 0; + while (cpu_output[indices[i]] / sum > 0.005) + { + if (classes.size() > indices[i]) + { + std::cout << "class: " << classes[indices[i]] << " | "; + } + std::cout << "confidence: " << 100 * cpu_output[indices[i]] / sum << "% | index: " << indices[i] << "\n"; + ++i; + } +} + +// initialize TensorRT engine and parse ONNX model -------------------------------------------------------------------- +void parseOnnxModel(const std::string& model_path, TRTUniquePtr& engine, + TRTUniquePtr& context) +{ + TRTUniquePtr builder{nvinfer1::createInferBuilder(gLogger)}; + TRTUniquePtr network{builder->createNetwork()}; + TRTUniquePtr parser{nvonnxparser::createParser(*network, gLogger)}; + TRTUniquePtr config{builder->createBuilderConfig()}; + // parse ONNX + if (!parser->parseFromFile(model_path.c_str(), static_cast(nvinfer1::ILogger::Severity::kINFO))) + { + std::cerr << "ERROR: could not parse the model.\n"; + return; + } + // allow TensorRT to use up to 1GB of GPU memory for tactic selection. + config->setMaxWorkspaceSize(1ULL << 30); + // use FP16 mode if possible + if (builder->platformHasFastFp16()) + { + config->setFlag(nvinfer1::BuilderFlag::kFP16); + } + // we have only one image in batch + builder->setMaxBatchSize(1); + // generate TensorRT engine optimized for the target platform + engine.reset(builder->buildEngineWithConfig(*network, *config)); + context.reset(engine->createExecutionContext()); +} + +// main pipeline ------------------------------------------------------------------------------------------------------ +int main(int argc, char* argv[]) +{ + if (argc < 3) + { + std::cerr << "usage: " << argv[0] << " model.onnx image.jpg\n"; + return -1; + } + std::string model_path(argv[1]); + std::string image_path(argv[2]); + int batch_size = 1; + + // initialize TensorRT engine and parse ONNX model + TRTUniquePtr engine{nullptr}; + TRTUniquePtr context{nullptr}; + parseOnnxModel(model_path, engine, context); + + // get sizes of input and output and allocate memory required for input data and for output data + std::vector input_dims; // we expect only one input + std::vector output_dims; // and one output + std::vector buffers(engine->getNbBindings()); // buffers for input and output data + for (size_t i = 0; i < engine->getNbBindings(); ++i) + { + auto binding_size = getSizeByDim(engine->getBindingDimensions(i)) * batch_size * sizeof(float); + cudaMalloc(&buffers[i], binding_size); + if (engine->bindingIsInput(i)) + { + input_dims.emplace_back(engine->getBindingDimensions(i)); + } + else + { + output_dims.emplace_back(engine->getBindingDimensions(i)); + } + } + if (input_dims.empty() || output_dims.empty()) + { + std::cerr << "Expect at least one input and one output for network\n"; + return -1; + } + + // preprocess input data + preprocessImage(image_path, (float *) buffers[0], input_dims[0]); + // inference + context->enqueue(batch_size, buffers.data(), 0, nullptr); + // postprocess results + postprocessResults((float *) buffers[1], output_dims[0], batch_size); + + for (void* buf : buffers) + { + cudaFree(buf); + } + return 0; +} diff --git a/PyTorch-ONNX-TensorRT-CPP/turkish_coffee.jpg b/PyTorch-ONNX-TensorRT-CPP/turkish_coffee.jpg new file mode 100644 index 000000000..23a65a196 Binary files /dev/null and b/PyTorch-ONNX-TensorRT-CPP/turkish_coffee.jpg differ diff --git a/PyTorch-Receptive-Field-With-Backprop/receptive_field_backpropagation.py b/PyTorch-Receptive-Field-With-Backprop/receptive_field_backpropagation.py index 06ef4f292..eef3f077c 100644 --- a/PyTorch-Receptive-Field-With-Backprop/receptive_field_backpropagation.py +++ b/PyTorch-Receptive-Field-With-Backprop/receptive_field_backpropagation.py @@ -7,9 +7,11 @@ from torchvision import transforms from FullyConvolutionalResnet18 import FullyConvolutionalResnet18 +import imutils Rect = namedtuple('Rect', 'x1 y1 x2 y2') +displayWidth = 1024 def backprop_receptive_field(image, predicted_class, scoremap, use_max_activation=True): model = FullyConvolutionalResnet18() @@ -137,18 +139,23 @@ def run_resnet_inference(original_image): score_map = preds[0, predicted_class, :, :].cpu() print('Score Map shape : ', score_map.shape) - # Compute the receptive filed for the inference result + # Compute the receptive filed for the inference result for max activated pixel receptive_field_map = backprop_receptive_field(image, scoremap=score_map, predicted_class=predicted_class) + + # Compute the receptive filed for the inference result for the net prediction + receptive_field_net_pred_map = backprop_receptive_field(image, scoremap=score_map, predicted_class=predicted_class, use_max_activation=False) # Resize score map to the original image size score_map = score_map.numpy()[0] score_map = cv2.resize(score_map, (original_image.shape[1], original_image.shape[0])) # Display the images - cv2.imshow("Original Image", original_image) - cv2.imshow("Score map: activations and bbox", visualize_activations(original_image, score_map)) - cv2.imshow("receptive_field_max_activation", visualize_activations(original_image, receptive_field_map, show_bounding_rect=True)) + cv2.imshow("Original Image", imutils.resize(original_image,width=displayWidth)) + cv2.imshow("Score map: activations and bbox", imutils.resize(visualize_activations(original_image, score_map,show_bounding_rect=True),width=displayWidth)) + cv2.imshow("receptive_field_max_activation", imutils.resize(visualize_activations(original_image, receptive_field_map, show_bounding_rect=True),width=displayWidth)) + cv2.imshow("receptive_field_net_prediction", imutils.resize(visualize_activations(original_image, receptive_field_net_pred_map, show_bounding_rect=True),width=displayWidth)) cv2.waitKey(0) + cv2.destroyAllWindows() def main(): diff --git a/PyTorch-Vision-Experiment-Logging/README.md b/PyTorch-Vision-Experiment-Logging/README.md new file mode 100644 index 000000000..8eec3c0fc --- /dev/null +++ b/PyTorch-Vision-Experiment-Logging/README.md @@ -0,0 +1,11 @@ +This contains the code for **Experiment Logging with TensorBoard and wandb**. For more information - visit [**Experiment Logging with TensorBoard and wandb**](https://www.learnopencv.com/experiment-logging-with-tensorboard-and-wandb) + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
\ No newline at end of file diff --git a/PyTorch-Vision-Experiment-Logging/Torchvision-Experiment-Logging.ipynb b/PyTorch-Vision-Experiment-Logging/Torchvision-Experiment-Logging.ipynb new file mode 100644 index 000000000..44b01f0cb --- /dev/null +++ b/PyTorch-Vision-Experiment-Logging/Torchvision-Experiment-Logging.ipynb @@ -0,0 +1,858 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "experiment-logging.ipynb", + "provenance": [], + "collapsed_sections": [], + "toc_visible": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "view-in-github" + }, + "source": [ + "\"Open" + ] +}, + { + "cell_type": "markdown", + "metadata": { + "id": "T__5bQVhKp3r", + "colab_type": "text" + }, + "source": [ + "# Introduction\n", + "\n", + "In this notebook, we're going to apply experiment tracking to the Object Detection Task on COCO dataset using Torchvision. We are going to use the code from torchvision as is, we won't change anything as the idea is to show how an experiment logging functionality can be brought into some existing training framework." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UhHQFy6P606e", + "colab_type": "text" + }, + "source": [ + "# Set everything up\n", + "\n", + "In this part, we are going to set up the environment, i.e. download the source\n", + "code, initialize functions, download and prepare COCO dataset and its annotations, install and import required libraries, and log in to the Weights & Biases tool." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0SaKUS4EaZri", + "colab_type": "text" + }, + "source": [ + "## Download torchvision code from sources\n", + "\n", + "Using the command below we'll download the detection task code from PyTorch repository. Please, visit [pytorch repository](https://github.com/pytorch/vision) for more information." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hBvcjvZZapxb", + "colab_type": "code", + "colab": {} + }, + "source": [ + "!wget https://raw.githubusercontent.com/pytorch/vision/3974cfeb447be9f5ef1fc95e5c320f0498fe68ae/references/detection/coco_eval.py && \\\n", + " wget https://raw.githubusercontent.com/pytorch/vision/3974cfeb447be9f5ef1fc95e5c320f0498fe68ae/references/detection/coco_utils.py && \\\n", + " wget https://raw.githubusercontent.com/pytorch/vision/3974cfeb447be9f5ef1fc95e5c320f0498fe68ae/references/detection/engine.py && \\\n", + " wget https://raw.githubusercontent.com/pytorch/vision/3974cfeb447be9f5ef1fc95e5c320f0498fe68ae/references/detection/group_by_aspect_ratio.py && \\\n", + " wget https://raw.githubusercontent.com/pytorch/vision/3974cfeb447be9f5ef1fc95e5c320f0498fe68ae/references/detection/train.py && \\\n", + " wget https://raw.githubusercontent.com/pytorch/vision/3974cfeb447be9f5ef1fc95e5c320f0498fe68ae/references/detection/transforms.py && \\\n", + " wget https://raw.githubusercontent.com/pytorch/vision/3974cfeb447be9f5ef1fc95e5c320f0498fe68ae/references/detection/utils.py" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5ZqebrClaIaX", + "colab_type": "text" + }, + "source": [ + "## Download COCO dataset\n", + "In this section, we'll download COCO validation images and annotations. We're going to use the validation set for training and validation.\n", + "\n", + "**Please, don't do this in real life as models should be trained on training images and validated on the validation set. Otherwise, you'll face [overfitting](https://https://en.wikipedia.org/wiki/Overfitting)**. \n", + "\n", + "So we're using validation set for training because the complete dataset is very large and training on it will take a lot of time. While our goal is to show how the experiment logging works and we want to do it in a reasonable amount of time!" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "d3Hbz3IMaugx", + "colab_type": "code", + "colab": {} + }, + "source": [ + "!mkdir coco && mkdir coco/annotations\n", + "\n", + "!wget http://images.cocodataset.org/zips/val2017.zip && \\\n", + " wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip\n", + "\n", + "!unzip val2017.zip && unzip annotations_trainval2017.zip\n", + "\n", + "!cp -r val2017 coco/train2017\n", + "!cp annotations/instances_val2017.json coco/annotations/instances_val2017.json\n", + "\n", + "!mv val2017 coco/val2017\n", + "!mv annotations/instances_val2017.json coco/annotations/instances_train2017.json" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xUJAxouGjeAo", + "colab_type": "text" + }, + "source": [ + "## Install required libraries" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "O6F5KFzSkYDx", + "colab_type": "code", + "colab": {} + }, + "source": [ + "!pip install numpy==1.17.3\n", + "!pip install tensorboardX==2.0\n", + "!pip install wandb==0.8.36" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Cn-BrTwM41tF", + "colab_type": "text" + }, + "source": [ + "## Log in to Weights & Biases\n", + "\n", + "Please go to https://www.wandb.com/ and create an account if you don't have one yet. Then, you need to open https://app.wandb.ai/authorize to get the W&B API key to be able to start streaming logging to W&B. Paste an API key from your profile and hit enter after running the next cell." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "1zfNvGTqXtKT", + "colab_type": "code", + "colab": {} + }, + "source": [ + "!wandb login" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dUDDmQe06yrt", + "colab_type": "text" + }, + "source": [ + "## Import dependencies" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "G59dSjd06Xz_", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import datetime\n", + "import math\n", + "import os\n", + "import os.path as osp\n", + "import sys\n", + "import time\n", + "\n", + "import tensorboardX\n", + "import torch\n", + "import torch.utils.data\n", + "import torchvision\n", + "import torchvision.models.detection\n", + "import torchvision.models.detection.mask_rcnn\n", + "import torchvision.models.detection.mask_rcnn\n", + "import wandb\n", + "\n", + "import utils\n", + "from coco_eval import CocoEvaluator\n", + "from coco_utils import get_coco_api_from_dataset\n", + "from engine import _get_iou_types\n", + "from group_by_aspect_ratio import GroupedBatchSampler, create_aspect_ratio_groups\n", + "from train import get_transform, get_dataset" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "n-lIOk1E_1gL", + "colab_type": "text" + }, + "source": [ + "## Initialization" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FVMZRHjfKdFC", + "colab_type": "text" + }, + "source": [ + "### COCO labels\n", + "\n", + "Let's initialize mapping so as to be able to see human-readable labels." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "NvGt0crlJ8sw", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# COCO labels mapping\n", + "COCO_INSTANCE_CATEGORY_NAMES = [\n", + " \"__background__\",\"person\",\"bicycle\",\"car\",\"motorcycle\",\"airplane\",\"bus\",\n", + " \"train\",\"truck\",\"boat\",\"trafficlight\",\"firehydrant\",\"N/A\",\"stopsign\",\n", + " \"parkingmeter\",\"bench\",\"bird\",\"cat\",\"dog\",\"horse\",\"sheep\",\"cow\",\"elephant\",\n", + " \"bear\",\"zebra\",\"giraffe\",\"N/A\",\"backpack\",\"umbrella\",\"N/A\",\"N/A\",\"handbag\",\n", + " \"tie\",\"suitcase\",\"frisbee\",\"skis\",\"snowboard\",\"sportsball\",\"kite\",\n", + " \"baseballbat\",\"baseballglove\",\"skateboard\",\"surfboard\",\"tennisracket\",\n", + " \"bottle\",\"N/A\",\"wineglass\",\"cup\",\"fork\",\"knife\",\"spoon\",\"bowl\",\"banana\",\n", + " \"apple\",\"sandwich\",\"orange\",\"broccoli\",\"carrot\",\"hotdog\",\"pizza\",\"donut\",\n", + " \"cake\",\"chair\",\"couch\",\"pottedplant\",\"bed\",\"N/A\",\"diningtable\",\"N/A\",\"N/A\",\n", + " \"toilet\",\"N/A\",\"tv\",\"laptop\",\"mouse\",\"remote\",\"keyboard\",\"cellphone\",\n", + " \"microwave\",\"oven\",\"toaster\",\"sink\",\"refrigerator\",\"N/A\",\"book\",\"clock\",\n", + " \"vase\",\"scissors\",\"teddybear\",\"hairdrier\",\"toothbrush\",\n", + "]" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Uh3zrzSKKTUE", + "colab_type": "text" + }, + "source": [ + "### Define main function\n", + "\n", + "Let's take the main function of the code from PyTorch detection as is." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "htq1VnoxKjHL", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def main(args):\n", + " utils.init_distributed_mode(args)\n", + " print(args)\n", + "\n", + " device = torch.device(args.device)\n", + "\n", + " # Data loading code\n", + " print(\"Loading data\")\n", + "\n", + " dataset, num_classes = get_dataset(args.dataset, \"train\", get_transform(train=True), args.data_path)\n", + " dataset_test, _ = get_dataset(args.dataset, \"val\", get_transform(train=False), args.data_path)\n", + "\n", + " print(\"Creating data loaders\")\n", + " if args.distributed:\n", + " train_sampler = torch.utils.data.distributed.DistributedSampler(dataset)\n", + " test_sampler = torch.utils.data.distributed.DistributedSampler(dataset_test)\n", + " else:\n", + " train_sampler = torch.utils.data.RandomSampler(dataset)\n", + " test_sampler = torch.utils.data.SequentialSampler(dataset_test)\n", + "\n", + " if args.aspect_ratio_group_factor >= 0:\n", + " group_ids = create_aspect_ratio_groups(dataset, k=args.aspect_ratio_group_factor)\n", + " train_batch_sampler = GroupedBatchSampler(train_sampler, group_ids, args.batch_size)\n", + " else:\n", + " train_batch_sampler = torch.utils.data.BatchSampler(\n", + " train_sampler, args.batch_size, drop_last=True)\n", + "\n", + " data_loader = torch.utils.data.DataLoader(\n", + " dataset, batch_sampler=train_batch_sampler, num_workers=args.workers,\n", + " collate_fn=utils.collate_fn)\n", + "\n", + " data_loader_test = torch.utils.data.DataLoader(\n", + " dataset_test, batch_size=5,\n", + " sampler=test_sampler, num_workers=args.workers,\n", + " collate_fn=utils.collate_fn)\n", + "\n", + " print(\"Creating model\")\n", + " model = torchvision.models.detection.__dict__[args.model](num_classes=num_classes,\n", + " pretrained=args.pretrained)\n", + " model.to(device)\n", + "\n", + " model_without_ddp = model\n", + " if args.distributed:\n", + " model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu])\n", + " model_without_ddp = model.module\n", + "\n", + " params = [p for p in model.parameters() if p.requires_grad]\n", + " optimizer = torch.optim.SGD(\n", + " params, lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay)\n", + "\n", + " # lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=args.lr_step_size, gamma=args.lr_gamma)\n", + " lr_scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=args.lr_steps, gamma=args.lr_gamma)\n", + "\n", + " if args.resume:\n", + " checkpoint = torch.load(args.resume, map_location='cpu')\n", + " model_without_ddp.load_state_dict(checkpoint['model'])\n", + " optimizer.load_state_dict(checkpoint['optimizer'])\n", + " lr_scheduler.load_state_dict(checkpoint['lr_scheduler'])\n", + " args.start_epoch = checkpoint['epoch'] + 1\n", + "\n", + " if args.test_only:\n", + " evaluate(model, data_loader_test, device=device)\n", + " return\n", + "\n", + " print(\"Start training\")\n", + " start_time = time.time()\n", + " for epoch in range(args.start_epoch, args.epochs):\n", + " if args.distributed:\n", + " train_sampler.set_epoch(epoch)\n", + " train_one_epoch(model, optimizer, data_loader, device, epoch, args.print_freq)\n", + " lr_scheduler.step()\n", + " if args.output_dir:\n", + " utils.save_on_master({\n", + " 'model': model_without_ddp.state_dict(),\n", + " 'optimizer': optimizer.state_dict(),\n", + " 'lr_scheduler': lr_scheduler.state_dict(),\n", + " 'args': args,\n", + " 'epoch': epoch},\n", + " os.path.join(args.output_dir, 'model_{}.pth'.format(epoch)))\n", + "\n", + " # evaluate after every epoch\n", + " evaluate(model, data_loader_test, device=device)\n", + "\n", + " total_time = time.time() - start_time\n", + " total_time_str = str(datetime.timedelta(seconds=int(total_time)))\n", + " print('Training time {}'.format(total_time_str))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mAt7M_0CLZjI", + "colab_type": "text" + }, + "source": [ + "# Logging\n", + "\n", + "In this part, we'll add TensorBoard and W&B logging to the original PyTorch detection code." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "auqJJWRJLKV5", + "colab_type": "text" + }, + "source": [ + "## Define custom TensorBoard Summary Writer\n", + "\n", + "In the next cell, we'll extend the default Summary writer by adding the function that combines plots to subgroups by adding a prefix to a group of loss dictionary keys." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "p_Wa90RzLHwp", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# create a new class inheriting from tensorboardX.SummaryWriter\n", + "class SummaryWriter(tensorboardX.SummaryWriter):\n", + " def __init__(self, log_dir=None, comment=\"\", **kwargs):\n", + " super().__init__(log_dir, comment, **kwargs)\n", + "\n", + " # create a new function that will take dictionary as input and uses built-in add_scalar() function\n", + " # that function combines all plots into one subgroup by a tag\n", + " def add_scalar_dict(self, dictionary, global_step, tag=None):\n", + " for name, val in dictionary.items():\n", + " if tag is not None:\n", + " name = osp.join(tag, name)\n", + " self.add_scalar(name, val.item(), global_step)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8xDcn0PaLmyx", + "colab_type": "text" + }, + "source": [ + "## Applying logging" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FtnU6ZWj6WW5", + "colab_type": "text" + }, + "source": [ + "### Tracking loss in the training procedure\n", + "\n", + "We want TensorBoard to track the loss. In this section, we'll use our TensorBoard Summary Writer." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IJ5raW_gIUnp", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def train_one_epoch(model, optimizer, data_loader, device, epoch, print_freq):\n", + " global global_iter\n", + " model.train()\n", + " metric_logger = utils.MetricLogger(delimiter=\" \")\n", + " metric_logger.add_meter('lr', utils.SmoothedValue(window_size=1, fmt='{value:.6f}'))\n", + " header = 'Epoch: [{}]'.format(epoch)\n", + "\n", + " lr_scheduler = None\n", + " if epoch == 0:\n", + " warmup_factor = 1. / 1000\n", + " warmup_iters = min(1000, len(data_loader) - 1)\n", + "\n", + " lr_scheduler = utils.warmup_lr_scheduler(optimizer, warmup_iters, warmup_factor)\n", + "\n", + " for images, targets in metric_logger.log_every(data_loader, print_freq, header):\n", + " images = list(image.to(device) for image in images)\n", + " targets = [{k: v.to(device) for k, v in t.items()} for t in targets]\n", + " loss_dict = model(images, targets)\n", + "\n", + " # ### OUR CODE ###\n", + " # let's track the losses here by adding scalars\n", + " logger.add_scalar_dict(\n", + " # passing the dictionary of losses (pairs - loss_key: loss_value)\n", + " loss_dict,\n", + " # passing the global step (number of iterations)\n", + " global_step=global_iter,\n", + " # adding the tag to combine plots in a subgroup\n", + " tag=\"loss\"\n", + " )\n", + " # incrementing the global step (number of iterations)\n", + " global_iter += 1\n", + " # ### END OF OUR CODE ###\n", + "\n", + " losses = sum(loss for loss in loss_dict.values())\n", + "\n", + " # reduce losses over all GPUs for logging purposes\n", + " loss_dict_reduced = utils.reduce_dict(loss_dict)\n", + " losses_reduced = sum(loss for loss in loss_dict_reduced.values())\n", + "\n", + " loss_value = losses_reduced.item()\n", + "\n", + " if not math.isfinite(loss_value):\n", + " print(\"Loss is {}, stopping training\".format(loss_value))\n", + " print(loss_dict_reduced)\n", + " sys.exit(1)\n", + "\n", + " optimizer.zero_grad()\n", + " losses.backward()\n", + " optimizer.step()\n", + "\n", + " if lr_scheduler is not None:\n", + " lr_scheduler.step()\n", + "\n", + " metric_logger.update(loss=losses_reduced, **loss_dict_reduced)\n", + " metric_logger.update(lr=optimizer.param_groups[0][\"lr\"])\n", + "\n", + " return metric_logger" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BTSJr-n3MEVD", + "colab_type": "text" + }, + "source": [ + "### Visualizing predicted bounding boxes in the validation procedure\n", + "\n", + "In this part, we'll add the code saves the first 50 images with the predicted bounding boxes and labels for each epoch. That way we will be able to see how they are changing during the process." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "5f1cjABEMFRO", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@torch.no_grad()\n", + "def evaluate(model, data_loader, device):\n", + " n_threads = torch.get_num_threads()\n", + " # FIXME remove this and make paste_masks_in_image run on the GPU\n", + " torch.set_num_threads(1)\n", + " cpu_device = torch.device(\"cpu\")\n", + " model.eval()\n", + " metric_logger = utils.MetricLogger(delimiter=\" \")\n", + " header = 'Test:'\n", + "\n", + " coco = get_coco_api_from_dataset(data_loader.dataset)\n", + " iou_types = _get_iou_types(model)\n", + " coco_evaluator = CocoEvaluator(coco, iou_types)\n", + "\n", + " # changing these two lines a bit to have iteration number and to keep image tensor\n", + " for i, (images, targets) in enumerate(metric_logger.log_every(data_loader, 100, header)):\n", + " img = images[0]\n", + "\n", + " images = list(img.to(device) for img in images)\n", + " targets = [{k: v.to(device) for k, v in t.items()} for t in targets]\n", + "\n", + " torch.cuda.synchronize()\n", + " model_time = time.time()\n", + " outputs = model(images)\n", + "\n", + " # ### OUR CODE ###\n", + " # let's track bounding box and labels predictions for the first 50 images\n", + " # as we hardly want to track all validation images\n", + " # but want to see how the predicted bounding boxes and labels are changing during the process\n", + " if i < 50:\n", + " # let's add tracking images with predicted bounding boxes\n", + " logger.add_image_with_boxes(\n", + " # adding pred_images tag to combine images in one subgroup\n", + " \"pred_images/PD-{}\".format(i),\n", + " # passing image tensor\n", + " img,\n", + " # passing predicted bounding boxes\n", + " outputs[0][\"boxes\"].cpu(),\n", + " # mapping & passing predicted labels\n", + " labels=[\n", + " COCO_INSTANCE_CATEGORY_NAMES[i]\n", + " for i in outputs[0][\"labels\"].cpu().numpy()\n", + " ],\n", + " )\n", + " # ### END OUR CODE ###\n", + " outputs = [{k: v.to(cpu_device) for k, v in t.items()} for t in outputs]\n", + " model_time = time.time() - model_time\n", + "\n", + " res = {target[\"image_id\"].item(): output for target, output in zip(targets, outputs)}\n", + " evaluator_time = time.time()\n", + " coco_evaluator.update(res)\n", + " evaluator_time = time.time() - evaluator_time\n", + " metric_logger.update(model_time=model_time, evaluator_time=evaluator_time)\n", + "\n", + " # gather the stats from all processes\n", + " metric_logger.synchronize_between_processes()\n", + " print(\"Averaged stats:\", metric_logger)\n", + " coco_evaluator.synchronize_between_processes()\n", + "\n", + " # accumulate predictions from all images\n", + " coco_evaluator.accumulate()\n", + " coco_evaluator.summarize()\n", + " torch.set_num_threads(n_threads)\n", + " return coco_evaluator" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-OtKa0GSM5tU", + "colab_type": "text" + }, + "source": [ + "### Saving config and COCO metrics\n", + "\n", + "Finally, we want to track the metric values and bind them to model hyperparameters. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "fqHEpFp_M4vY", + "colab_type": "code", + "colab": {} + }, + "source": [ + "class CocoEvaluator(CocoEvaluator):\n", + " def summarize(self):\n", + " global config, total_epochs\n", + " for iou_type, coco_eval in self.coco_eval.items():\n", + " print(\"IoU metric: {}\".format(iou_type))\n", + " coco_eval.summarize()\n", + " # ### OUR CODE ###\n", + " if iou_type == \"bbox\":\n", + " # let's add hyperparameters and bind them to metric values\n", + " logger.add_hparams(\n", + " # passing hyperparameters dictionary (in our case argparse values)\n", + " config,\n", + " # passing COCO metrics\n", + " {\n", + " \"AP/IoU/0.50-0.95/all/100\": coco_eval.stats[0],\n", + " \"AP/IoU/0.50/all/100\": coco_eval.stats[1],\n", + " \"AP/IoU/0.75/all/100\": coco_eval.stats[2],\n", + " \"AP/IoU/0.50-0.95/small/100\": coco_eval.stats[3],\n", + " \"AP/IoU/0.50-0.95/medium/100\": coco_eval.stats[4],\n", + " \"AP/IoU/0.50-0.95/large/100\": coco_eval.stats[5],\n", + " \"AR/IoU/0.50-0.95/all/1\": coco_eval.stats[6],\n", + " \"AR/IoU/0.50-0.95/all/10\": coco_eval.stats[7],\n", + " \"AR/IoU/0.50-0.95/all/100\": coco_eval.stats[8],\n", + " \"AR/IoU/0.50-0.95/small/100\": coco_eval.stats[9],\n", + " \"AR/IoU/0.50-0.95/medium/100\": coco_eval.stats[10],\n", + " \"AR/IoU/0.50-0.95/large/100\": coco_eval.stats[11],\n", + " },\n", + " name=\".\",\n", + " # passing the current iteration (epoch)\n", + " global_step=total_epochs,\n", + " )\n", + " # incrementing the number of epochs\n", + " total_epochs += 1\n", + " # ### END OF OUR CODE ###" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "N5ErQPjgNV7J", + "colab_type": "text" + }, + "source": [ + "## Experiment setup\n", + "\n", + "Let's create some variables to keep everything organized. Usually, everything is stored in a config file but we use the PyTorch detection code as is and in the project, all hyperparameters are stored using Python argparse. We want to highlight everything that is used for experiment management so in the next cell, we'll create the following variables:\n", + "\n", + "\n", + "\n", + "* config - will be used as config i.e. argument dictionary in this project\n", + "* log_dir - the place where log files will be saved\n", + "* total_epochs - the number of epochs\n", + "* global_iter - the number of iterations\n", + "* logger - custom TensorBoard SummaryWriter that is used for logging" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ElPLsK8EZ54b", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# define variables as globals to have an access everywhere\n", + "config = None # will be replaced to argparse dictionary\n", + "total_epochs = 0 # init total number of epochs\n", + "global_iter = 0 # init total number of iterations\n", + "\n", + "name = \"exp-000\" # init experiment name\n", + "log_dir = \"experiments\" # init path where tensorboard logs will be stored\n", + "# (if log_dir is not specified writer object will automatically generate filename)\n", + "# Log files will be saved in 'experiments/exp-000'\n", + "# create our custom logger\n", + "logger = SummaryWriter(log_dir=osp.join(log_dir, name))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OzdzsBtgPTYw", + "colab_type": "text" + }, + "source": [ + "## Config initialization\n", + "\n", + "Here, let's use the project's parser with default parameters" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Fj-W4GR_UOPf", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import argparse\n", + "\n", + "parser = argparse.ArgumentParser(description=__doc__)\n", + "\n", + "parser.add_argument('--data-path', default='/datasets01/COCO/022719/', help='dataset')\n", + "parser.add_argument('--dataset', default='coco', help='dataset')\n", + "parser.add_argument('--model', default='maskrcnn_resnet50_fpn', help='model')\n", + "parser.add_argument('--device', default='cuda', help='device')\n", + "parser.add_argument('-b', '--batch-size', default=2, type=int,\n", + " help='images per gpu, the total batch size is $NGPU x batch_size')\n", + "parser.add_argument('--epochs', default=26, type=int, metavar='N',\n", + " help='number of total epochs to run')\n", + "parser.add_argument('-j', '--workers', default=4, type=int, metavar='N',\n", + " help='number of data loading workers (default: 4)')\n", + "parser.add_argument('--lr', default=0.02, type=float,\n", + " help='initial learning rate, 0.02 is the default value for training '\n", + " 'on 8 gpus and 2 images_per_gpu')\n", + "parser.add_argument('--momentum', default=0.9, type=float, metavar='M',\n", + " help='momentum')\n", + "parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float,\n", + " metavar='W', help='weight decay (default: 1e-4)',\n", + " dest='weight_decay')\n", + "parser.add_argument('--lr-step-size', default=8, type=int, help='decrease lr every step-size epochs')\n", + "parser.add_argument('--lr-steps', default=[16, 22], nargs='+', type=int, help='decrease lr every step-size epochs')\n", + "parser.add_argument('--lr-gamma', default=0.1, type=float, help='decrease lr by a factor of lr-gamma')\n", + "parser.add_argument('--print-freq', default=20, type=int, help='print frequency')\n", + "parser.add_argument('--output-dir', default='.', help='path where to save')\n", + "parser.add_argument('--resume', default='', help='resume from checkpoint')\n", + "parser.add_argument('--start_epoch', default=0, type=int, help='start epoch')\n", + "parser.add_argument('--aspect-ratio-group-factor', default=3, type=int)\n", + "parser.add_argument(\n", + " \"--test-only\",\n", + " dest=\"test_only\",\n", + " help=\"Only test the model\",\n", + " action=\"store_true\",\n", + ")\n", + "parser.add_argument(\n", + " \"--pretrained\",\n", + " dest=\"pretrained\",\n", + " help=\"Use pre-trained models from the modelzoo\",\n", + " action=\"store_true\",\n", + ")\n", + "\n", + "# distributed training parameters\n", + "parser.add_argument('--world-size', default=1, type=int,\n", + " help='number of distributed processes')\n", + "parser.add_argument('--dist-url', default='env://', help='url used to set up distributed training')" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b_OMSXLYP1KY", + "colab_type": "text" + }, + "source": [ + "Here we need to modify the default path with the path where the COCO **validation** dataset was unzipped. \n", + "\n", + "As the idea is to show how experiment management works in a reasonable time, we'll start with the pre-trained weights and will train the model on the validation set. As was mentioned before, **don't do this in real life as models should be trained on training images and validated on the validation set**. You'll see that metrics are increasing and it is expected because the model is trained and validated on the same data. We're doing this to save time! \n", + "\n", + "Also, we'll change learning rate to *0.0001* and increase batch size from *2* to *6*." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "aofDb-VcZmgk", + "colab_type": "code", + "colab": {} + }, + "source": [ + "args = parser.parse_args([\"--data-path\" ,'/content/coco', '--lr', \"1e-4\", '--pretrained', '--batch-size', \"6\"])\n", + "config = vars(args)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1wEcq5w1QKJi", + "colab_type": "text" + }, + "source": [ + "## Weights & Biases synchronization\n", + "\n", + "The last thing that we need to do before training is to connect to the Weights & Biases. Fortunately, we don't need to do much since it can be done by adding just two lines of code:\n", + "\n", + "1. The first line initializes experiment with config and experiment name\n", + "2. The second line is used to enable TensorBoard synchronization" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "YqsHS8rfbDYh", + "colab_type": "code", + "colab": {} + }, + "source": [ + "wandb.init(config=config, name=name)\n", + "wandb.init(sync_tensorboard=True)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AJ7G6xx_Q4ov", + "colab_type": "text" + }, + "source": [ + "# Running train/val loop\n", + "\n", + "Here we go! Let's start the ball rolling. Please, visit [Weights & Biases](https://www.wandb.com/) to see how the experiment logging works in real-time!" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "JhKTNZEnUg_g", + "colab_type": "code", + "colab": {} + }, + "source": [ + "main(args)" + ], + "execution_count": 0, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/PyTorch-Vision-Experiment-Logging/coco_eval.py b/PyTorch-Vision-Experiment-Logging/coco_eval.py new file mode 100644 index 000000000..69bcc488a --- /dev/null +++ b/PyTorch-Vision-Experiment-Logging/coco_eval.py @@ -0,0 +1,381 @@ +import json +import tempfile + +import numpy as np +import copy +import time +import torch +import torch._six + +from pycocotools.cocoeval import COCOeval +from pycocotools.coco import COCO +import pycocotools.mask as mask_util + +from collections import defaultdict + +import utils + +# ### OUR CODE ### +# let's import our tensorboard module to track metrics +import tensorboard +# ### END OF OUR CODE ### + +class CocoEvaluator(object): + def __init__(self, coco_gt, iou_types): + assert isinstance(iou_types, (list, tuple)) + coco_gt = copy.deepcopy(coco_gt) + self.coco_gt = coco_gt + + self.iou_types = iou_types + self.coco_eval = {} + for iou_type in iou_types: + self.coco_eval[iou_type] = COCOeval(coco_gt, iouType=iou_type) + + self.img_ids = [] + self.eval_imgs = {k: [] for k in iou_types} + + def update(self, predictions): + img_ids = list(np.unique(list(predictions.keys()))) + self.img_ids.extend(img_ids) + + for iou_type in self.iou_types: + results = self.prepare(predictions, iou_type) + coco_dt = loadRes(self.coco_gt, results) if results else COCO() + coco_eval = self.coco_eval[iou_type] + + coco_eval.cocoDt = coco_dt + coco_eval.params.imgIds = list(img_ids) + img_ids, eval_imgs = evaluate(coco_eval) + + self.eval_imgs[iou_type].append(eval_imgs) + + def synchronize_between_processes(self): + for iou_type in self.iou_types: + self.eval_imgs[iou_type] = np.concatenate(self.eval_imgs[iou_type], 2) + create_common_coco_eval(self.coco_eval[iou_type], self.img_ids, self.eval_imgs[iou_type]) + + def accumulate(self): + for coco_eval in self.coco_eval.values(): + coco_eval.accumulate() + + def summarize(self): + for iou_type, coco_eval in self.coco_eval.items(): + print("IoU metric: {}".format(iou_type)) + coco_eval.summarize() + # ### OUR CODE ### + if iou_type == "bbox": + # let's add hyperparameters and bind them to metric values + tensorboard.logger.add_hparams( + # passing hyperparameters dictionary (in our case argparse values) + tensorboard.args, + # passing COCO metrics + { + "AP/IoU/0.50-0.95/all/100": coco_eval.stats[0], + "AP/IoU/0.50/all/100": coco_eval.stats[1], + "AP/IoU/0.75/all/100": coco_eval.stats[2], + "AP/IoU/0.50-0.95/small/100": coco_eval.stats[3], + "AP/IoU/0.50-0.95/medium/100": coco_eval.stats[4], + "AP/IoU/0.50-0.95/large/100": coco_eval.stats[5], + "AR/IoU/0.50-0.95/all/1": coco_eval.stats[6], + "AR/IoU/0.50-0.95/all/10": coco_eval.stats[7], + "AR/IoU/0.50-0.95/all/100": coco_eval.stats[8], + "AR/IoU/0.50-0.95/small/100": coco_eval.stats[9], + "AR/IoU/0.50-0.95/medium/100": coco_eval.stats[10], + "AR/IoU/0.50-0.95/large/100": coco_eval.stats[11], + }, + name=".", + # passing the current iteration (epoch) + global_step=tensorboard.total_epochs, + ) + # incrementing the number of epochs + tensorboard.total_epochs += 1 + # ### END OF OUR CODE ### + + def prepare(self, predictions, iou_type): + if iou_type == "bbox": + return self.prepare_for_coco_detection(predictions) + elif iou_type == "segm": + return self.prepare_for_coco_segmentation(predictions) + elif iou_type == "keypoints": + return self.prepare_for_coco_keypoint(predictions) + else: + raise ValueError("Unknown iou type {}".format(iou_type)) + + def prepare_for_coco_detection(self, predictions): + coco_results = [] + for original_id, prediction in predictions.items(): + if len(prediction) == 0: + continue + + boxes = prediction["boxes"] + boxes = convert_to_xywh(boxes).tolist() + scores = prediction["scores"].tolist() + labels = prediction["labels"].tolist() + + coco_results.extend( + [ + { + "image_id": original_id, + "category_id": labels[k], + "bbox": box, + "score": scores[k], + } + for k, box in enumerate(boxes) + ] + ) + return coco_results + + def prepare_for_coco_segmentation(self, predictions): + coco_results = [] + for original_id, prediction in predictions.items(): + if len(prediction) == 0: + continue + + scores = prediction["scores"] + labels = prediction["labels"] + masks = prediction["masks"] + + masks = masks > 0.5 + + scores = prediction["scores"].tolist() + labels = prediction["labels"].tolist() + + rles = [ + mask_util.encode(np.array(mask[0, :, :, np.newaxis], dtype=np.uint8, order="F"))[0] + for mask in masks + ] + for rle in rles: + rle["counts"] = rle["counts"].decode("utf-8") + + coco_results.extend( + [ + { + "image_id": original_id, + "category_id": labels[k], + "segmentation": rle, + "score": scores[k], + } + for k, rle in enumerate(rles) + ] + ) + return coco_results + + def prepare_for_coco_keypoint(self, predictions): + coco_results = [] + for original_id, prediction in predictions.items(): + if len(prediction) == 0: + continue + + boxes = prediction["boxes"] + boxes = convert_to_xywh(boxes).tolist() + scores = prediction["scores"].tolist() + labels = prediction["labels"].tolist() + keypoints = prediction["keypoints"] + keypoints = keypoints.flatten(start_dim=1).tolist() + + coco_results.extend( + [ + { + "image_id": original_id, + "category_id": labels[k], + 'keypoints': keypoint, + "score": scores[k], + } + for k, keypoint in enumerate(keypoints) + ] + ) + return coco_results + + +def convert_to_xywh(boxes): + xmin, ymin, xmax, ymax = boxes.unbind(1) + return torch.stack((xmin, ymin, xmax - xmin, ymax - ymin), dim=1) + + +def merge(img_ids, eval_imgs): + all_img_ids = utils.all_gather(img_ids) + all_eval_imgs = utils.all_gather(eval_imgs) + + merged_img_ids = [] + for p in all_img_ids: + merged_img_ids.extend(p) + + merged_eval_imgs = [] + for p in all_eval_imgs: + merged_eval_imgs.append(p) + + merged_img_ids = np.array(merged_img_ids) + merged_eval_imgs = np.concatenate(merged_eval_imgs, 2) + + # keep only unique (and in sorted order) images + merged_img_ids, idx = np.unique(merged_img_ids, return_index=True) + merged_eval_imgs = merged_eval_imgs[..., idx] + + return merged_img_ids, merged_eval_imgs + + +def create_common_coco_eval(coco_eval, img_ids, eval_imgs): + img_ids, eval_imgs = merge(img_ids, eval_imgs) + img_ids = list(img_ids) + eval_imgs = list(eval_imgs.flatten()) + + coco_eval.evalImgs = eval_imgs + coco_eval.params.imgIds = img_ids + coco_eval._paramsEval = copy.deepcopy(coco_eval.params) + + +################################################################# +# From pycocotools, just removed the prints and fixed +# a Python3 bug about unicode not defined +################################################################# + +# Ideally, pycocotools wouldn't have hard-coded prints +# so that we could avoid copy-pasting those two functions + +def createIndex(self): + # create index + # print('creating index...') + anns, cats, imgs = {}, {}, {} + imgToAnns, catToImgs = defaultdict(list), defaultdict(list) + if 'annotations' in self.dataset: + for ann in self.dataset['annotations']: + imgToAnns[ann['image_id']].append(ann) + anns[ann['id']] = ann + + if 'images' in self.dataset: + for img in self.dataset['images']: + imgs[img['id']] = img + + if 'categories' in self.dataset: + for cat in self.dataset['categories']: + cats[cat['id']] = cat + + if 'annotations' in self.dataset and 'categories' in self.dataset: + for ann in self.dataset['annotations']: + catToImgs[ann['category_id']].append(ann['image_id']) + + # print('index created!') + + # create class members + self.anns = anns + self.imgToAnns = imgToAnns + self.catToImgs = catToImgs + self.imgs = imgs + self.cats = cats + + +maskUtils = mask_util + + +def loadRes(self, resFile): + """ + Load result file and return a result api object. + :param resFile (str) : file name of result file + :return: res (obj) : result api object + """ + res = COCO() + res.dataset['images'] = [img for img in self.dataset['images']] + + # print('Loading and preparing results...') + # tic = time.time() + if isinstance(resFile, torch._six.string_classes): + anns = json.load(open(resFile)) + elif type(resFile) == np.ndarray: + anns = self.loadNumpyAnnotations(resFile) + else: + anns = resFile + assert type(anns) == list, 'results in not an array of objects' + annsImgIds = [ann['image_id'] for ann in anns] + assert set(annsImgIds) == (set(annsImgIds) & set(self.getImgIds())), \ + 'Results do not correspond to current coco set' + if 'caption' in anns[0]: + imgIds = set([img['id'] for img in res.dataset['images']]) & set([ann['image_id'] for ann in anns]) + res.dataset['images'] = [img for img in res.dataset['images'] if img['id'] in imgIds] + for id, ann in enumerate(anns): + ann['id'] = id + 1 + elif 'bbox' in anns[0] and not anns[0]['bbox'] == []: + res.dataset['categories'] = copy.deepcopy(self.dataset['categories']) + for id, ann in enumerate(anns): + bb = ann['bbox'] + x1, x2, y1, y2 = [bb[0], bb[0] + bb[2], bb[1], bb[1] + bb[3]] + if 'segmentation' not in ann: + ann['segmentation'] = [[x1, y1, x1, y2, x2, y2, x2, y1]] + ann['area'] = bb[2] * bb[3] + ann['id'] = id + 1 + ann['iscrowd'] = 0 + elif 'segmentation' in anns[0]: + res.dataset['categories'] = copy.deepcopy(self.dataset['categories']) + for id, ann in enumerate(anns): + # now only support compressed RLE format as segmentation results + ann['area'] = maskUtils.area(ann['segmentation']) + if 'bbox' not in ann: + ann['bbox'] = maskUtils.toBbox(ann['segmentation']) + ann['id'] = id + 1 + ann['iscrowd'] = 0 + elif 'keypoints' in anns[0]: + res.dataset['categories'] = copy.deepcopy(self.dataset['categories']) + for id, ann in enumerate(anns): + s = ann['keypoints'] + x = s[0::3] + y = s[1::3] + x1, x2, y1, y2 = np.min(x), np.max(x), np.min(y), np.max(y) + ann['area'] = (x2 - x1) * (y2 - y1) + ann['id'] = id + 1 + ann['bbox'] = [x1, y1, x2 - x1, y2 - y1] + # print('DONE (t={:0.2f}s)'.format(time.time()- tic)) + + res.dataset['annotations'] = anns + createIndex(res) + return res + + +def evaluate(self): + ''' + Run per image evaluation on given images and store results (a list of dict) in self.evalImgs + :return: None + ''' + # tic = time.time() + # print('Running per image evaluation...') + p = self.params + # add backward compatibility if useSegm is specified in params + if p.useSegm is not None: + p.iouType = 'segm' if p.useSegm == 1 else 'bbox' + print('useSegm (deprecated) is not None. Running {} evaluation'.format(p.iouType)) + # print('Evaluate annotation type *{}*'.format(p.iouType)) + p.imgIds = list(np.unique(p.imgIds)) + if p.useCats: + p.catIds = list(np.unique(p.catIds)) + p.maxDets = sorted(p.maxDets) + self.params = p + + self._prepare() + # loop through images, area range, max detection number + catIds = p.catIds if p.useCats else [-1] + + if p.iouType == 'segm' or p.iouType == 'bbox': + computeIoU = self.computeIoU + elif p.iouType == 'keypoints': + computeIoU = self.computeOks + self.ious = { + (imgId, catId): computeIoU(imgId, catId) + for imgId in p.imgIds + for catId in catIds} + + evaluateImg = self.evaluateImg + maxDet = p.maxDets[-1] + evalImgs = [ + evaluateImg(imgId, catId, areaRng, maxDet) + for catId in catIds + for areaRng in p.areaRng + for imgId in p.imgIds + ] + # this is NOT in the pycocotools code, but could be done outside + evalImgs = np.asarray(evalImgs).reshape(len(catIds), len(p.areaRng), len(p.imgIds)) + self._paramsEval = copy.deepcopy(self.params) + # toc = time.time() + # print('DONE (t={:0.2f}s).'.format(toc-tic)) + return p.imgIds, evalImgs + +################################################################# +# end of straight copy from pycocotools, just removing the prints +################################################################# diff --git a/PyTorch-Vision-Experiment-Logging/coco_utils.py b/PyTorch-Vision-Experiment-Logging/coco_utils.py new file mode 100644 index 000000000..26701a2cb --- /dev/null +++ b/PyTorch-Vision-Experiment-Logging/coco_utils.py @@ -0,0 +1,252 @@ +import copy +import os +from PIL import Image + +import torch +import torch.utils.data +import torchvision + +from pycocotools import mask as coco_mask +from pycocotools.coco import COCO + +import transforms as T + + +class FilterAndRemapCocoCategories(object): + def __init__(self, categories, remap=True): + self.categories = categories + self.remap = remap + + def __call__(self, image, target): + anno = target["annotations"] + anno = [obj for obj in anno if obj["category_id"] in self.categories] + if not self.remap: + target["annotations"] = anno + return image, target + anno = copy.deepcopy(anno) + for obj in anno: + obj["category_id"] = self.categories.index(obj["category_id"]) + target["annotations"] = anno + return image, target + + +def convert_coco_poly_to_mask(segmentations, height, width): + masks = [] + for polygons in segmentations: + rles = coco_mask.frPyObjects(polygons, height, width) + mask = coco_mask.decode(rles) + if len(mask.shape) < 3: + mask = mask[..., None] + mask = torch.as_tensor(mask, dtype=torch.uint8) + mask = mask.any(dim=2) + masks.append(mask) + if masks: + masks = torch.stack(masks, dim=0) + else: + masks = torch.zeros((0, height, width), dtype=torch.uint8) + return masks + + +class ConvertCocoPolysToMask(object): + def __call__(self, image, target): + w, h = image.size + + image_id = target["image_id"] + image_id = torch.tensor([image_id]) + + anno = target["annotations"] + + anno = [obj for obj in anno if obj['iscrowd'] == 0] + + boxes = [obj["bbox"] for obj in anno] + # guard against no boxes via resizing + boxes = torch.as_tensor(boxes, dtype=torch.float32).reshape(-1, 4) + boxes[:, 2:] += boxes[:, :2] + boxes[:, 0::2].clamp_(min=0, max=w) + boxes[:, 1::2].clamp_(min=0, max=h) + + classes = [obj["category_id"] for obj in anno] + classes = torch.tensor(classes, dtype=torch.int64) + + segmentations = [obj["segmentation"] for obj in anno] + masks = convert_coco_poly_to_mask(segmentations, h, w) + + keypoints = None + if anno and "keypoints" in anno[0]: + keypoints = [obj["keypoints"] for obj in anno] + keypoints = torch.as_tensor(keypoints, dtype=torch.float32) + num_keypoints = keypoints.shape[0] + if num_keypoints: + keypoints = keypoints.view(num_keypoints, -1, 3) + + keep = (boxes[:, 3] > boxes[:, 1]) & (boxes[:, 2] > boxes[:, 0]) + boxes = boxes[keep] + classes = classes[keep] + masks = masks[keep] + if keypoints is not None: + keypoints = keypoints[keep] + + target = {} + target["boxes"] = boxes + target["labels"] = classes + target["masks"] = masks + target["image_id"] = image_id + if keypoints is not None: + target["keypoints"] = keypoints + + # for conversion to coco api + area = torch.tensor([obj["area"] for obj in anno]) + iscrowd = torch.tensor([obj["iscrowd"] for obj in anno]) + target["area"] = area + target["iscrowd"] = iscrowd + + return image, target + + +def _coco_remove_images_without_annotations(dataset, cat_list=None): + def _has_only_empty_bbox(anno): + return all(any(o <= 1 for o in obj["bbox"][2:]) for obj in anno) + + def _count_visible_keypoints(anno): + return sum(sum(1 for v in ann["keypoints"][2::3] if v > 0) for ann in anno) + + min_keypoints_per_image = 10 + + def _has_valid_annotation(anno): + # if it's empty, there is no annotation + if len(anno) == 0: + return False + # if all boxes have close to zero area, there is no annotation + if _has_only_empty_bbox(anno): + return False + # keypoints task have a slight different critera for considering + # if an annotation is valid + if "keypoints" not in anno[0]: + return True + # for keypoint detection tasks, only consider valid images those + # containing at least min_keypoints_per_image + if _count_visible_keypoints(anno) >= min_keypoints_per_image: + return True + return False + + assert isinstance(dataset, torchvision.datasets.CocoDetection) + ids = [] + for ds_idx, img_id in enumerate(dataset.ids): + ann_ids = dataset.coco.getAnnIds(imgIds=img_id, iscrowd=None) + anno = dataset.coco.loadAnns(ann_ids) + if cat_list: + anno = [obj for obj in anno if obj["category_id"] in cat_list] + if _has_valid_annotation(anno): + ids.append(ds_idx) + + dataset = torch.utils.data.Subset(dataset, ids) + return dataset + + +def convert_to_coco_api(ds): + coco_ds = COCO() + # annotation IDs need to start at 1, not 0, see torchvision issue #1530 + ann_id = 1 + dataset = {'images': [], 'categories': [], 'annotations': []} + categories = set() + for img_idx in range(len(ds)): + # find better way to get target + # targets = ds.get_annotations(img_idx) + img, targets = ds[img_idx] + image_id = targets["image_id"].item() + img_dict = {} + img_dict['id'] = image_id + img_dict['height'] = img.shape[-2] + img_dict['width'] = img.shape[-1] + dataset['images'].append(img_dict) + bboxes = targets["boxes"] + bboxes[:, 2:] -= bboxes[:, :2] + bboxes = bboxes.tolist() + labels = targets['labels'].tolist() + areas = targets['area'].tolist() + iscrowd = targets['iscrowd'].tolist() + if 'masks' in targets: + masks = targets['masks'] + # make masks Fortran contiguous for coco_mask + masks = masks.permute(0, 2, 1).contiguous().permute(0, 2, 1) + if 'keypoints' in targets: + keypoints = targets['keypoints'] + keypoints = keypoints.reshape(keypoints.shape[0], -1).tolist() + num_objs = len(bboxes) + for i in range(num_objs): + ann = {} + ann['image_id'] = image_id + ann['bbox'] = bboxes[i] + ann['category_id'] = labels[i] + categories.add(labels[i]) + ann['area'] = areas[i] + ann['iscrowd'] = iscrowd[i] + ann['id'] = ann_id + if 'masks' in targets: + ann["segmentation"] = coco_mask.encode(masks[i].numpy()) + if 'keypoints' in targets: + ann['keypoints'] = keypoints[i] + ann['num_keypoints'] = sum(k != 0 for k in keypoints[i][2::3]) + dataset['annotations'].append(ann) + ann_id += 1 + dataset['categories'] = [{'id': i} for i in sorted(categories)] + coco_ds.dataset = dataset + coco_ds.createIndex() + return coco_ds + + +def get_coco_api_from_dataset(dataset): + for _ in range(10): + if isinstance(dataset, torchvision.datasets.CocoDetection): + break + if isinstance(dataset, torch.utils.data.Subset): + dataset = dataset.dataset + if isinstance(dataset, torchvision.datasets.CocoDetection): + return dataset.coco + return convert_to_coco_api(dataset) + + +class CocoDetection(torchvision.datasets.CocoDetection): + def __init__(self, img_folder, ann_file, transforms): + super(CocoDetection, self).__init__(img_folder, ann_file) + self._transforms = transforms + + def __getitem__(self, idx): + img, target = super(CocoDetection, self).__getitem__(idx) + image_id = self.ids[idx] + target = dict(image_id=image_id, annotations=target) + if self._transforms is not None: + img, target = self._transforms(img, target) + return img, target + + +def get_coco(root, image_set, transforms, mode='instances'): + anno_file_template = "{}_{}2017.json" + PATHS = { + "train": ("train2017", os.path.join("annotations", anno_file_template.format(mode, "train"))), + "val": ("val2017", os.path.join("annotations", anno_file_template.format(mode, "val"))), + # "train": ("val2017", os.path.join("annotations", anno_file_template.format(mode, "val"))) + } + + t = [ConvertCocoPolysToMask()] + + if transforms is not None: + t.append(transforms) + transforms = T.Compose(t) + + img_folder, ann_file = PATHS[image_set] + img_folder = os.path.join(root, img_folder) + ann_file = os.path.join(root, ann_file) + + dataset = CocoDetection(img_folder, ann_file, transforms=transforms) + + if image_set == "train": + dataset = _coco_remove_images_without_annotations(dataset) + + # dataset = torch.utils.data.Subset(dataset, [i for i in range(500)]) + + return dataset + + +def get_coco_kp(root, image_set, transforms): + return get_coco(root, image_set, transforms, mode="person_keypoints") diff --git a/PyTorch-Vision-Experiment-Logging/engine.py b/PyTorch-Vision-Experiment-Logging/engine.py new file mode 100644 index 000000000..39d45aa35 --- /dev/null +++ b/PyTorch-Vision-Experiment-Logging/engine.py @@ -0,0 +1,156 @@ +import math +import sys +import time +import torch + +import torchvision.models.detection.mask_rcnn + +from coco_utils import get_coco_api_from_dataset +from coco_eval import CocoEvaluator +import utils + +# ### OUR CODE ### +# let's import tensorboard +import tensorboard +# ### END OF OUR CODE ### + +def train_one_epoch(model, optimizer, data_loader, device, epoch, print_freq): + model.train() + metric_logger = utils.MetricLogger(delimiter=" ") + metric_logger.add_meter('lr', utils.SmoothedValue(window_size=1, fmt='{value:.6f}')) + header = 'Epoch: [{}]'.format(epoch) + + lr_scheduler = None + if epoch == 0: + warmup_factor = 1. / 1000 + warmup_iters = min(1000, len(data_loader) - 1) + + lr_scheduler = utils.warmup_lr_scheduler(optimizer, warmup_iters, warmup_factor) + + for images, targets in metric_logger.log_every(data_loader, print_freq, header): + images = list(image.to(device) for image in images) + targets = [{k: v.to(device) for k, v in t.items()} for t in targets] + loss_dict = model(images, targets) + + # applying logging only in the main process + # ### OUR CODE ### + if utils.is_main_process(): + # let's track the losses here by adding scalars + tensorboard.logger.add_scalar_dict( + # passing the dictionary of losses (pairs - loss_key: loss_value) + loss_dict, + # passing the global step (number of iterations) + global_step=tensorboard.global_iter, + # adding the tag to combine plots in a subgroup + tag="loss" + ) + # incrementing the global step (number of iterations) + tensorboard.global_iter += 1 + # ### END OF OUR CODE ### + + losses = sum(loss for loss in loss_dict.values()) + + # reduce losses over all GPUs for logging purposes + loss_dict_reduced = utils.reduce_dict(loss_dict) + losses_reduced = sum(loss for loss in loss_dict_reduced.values()) + + loss_value = losses_reduced.item() + + if not math.isfinite(loss_value): + print("Loss is {}, stopping training".format(loss_value)) + print(loss_dict_reduced) + sys.exit(1) + + optimizer.zero_grad() + losses.backward() + optimizer.step() + + if lr_scheduler is not None: + lr_scheduler.step() + + metric_logger.update(loss=losses_reduced, **loss_dict_reduced) + metric_logger.update(lr=optimizer.param_groups[0]["lr"]) + + return metric_logger + + +def _get_iou_types(model): + model_without_ddp = model + if isinstance(model, torch.nn.parallel.DistributedDataParallel): + model_without_ddp = model.module + iou_types = ["bbox"] + if isinstance(model_without_ddp, torchvision.models.detection.MaskRCNN): + iou_types.append("segm") + if isinstance(model_without_ddp, torchvision.models.detection.KeypointRCNN): + iou_types.append("keypoints") + return iou_types + + +@torch.no_grad() +def evaluate(model, data_loader, device): + n_threads = torch.get_num_threads() + # FIXME remove this and make paste_masks_in_image run on the GPU + torch.set_num_threads(1) + cpu_device = torch.device("cpu") + model.eval() + metric_logger = utils.MetricLogger(delimiter=" ") + header = 'Test:' + + coco = get_coco_api_from_dataset(data_loader.dataset) + iou_types = _get_iou_types(model) + coco_evaluator = CocoEvaluator(coco, iou_types) + + # changing these two lines a bit to have iteration number and to keep image tensor + for i, (images, targets) in enumerate(metric_logger.log_every(data_loader, 100, header)): + img = images[0] + + images = list(img.to(device) for img in images) + targets = [{k: v.to(device) for k, v in t.items()} for t in targets] + + torch.cuda.synchronize() + model_time = time.time() + outputs = model(images) + + # applying logging only in the main process + # ### OUR CODE ### + if utils.is_main_process(): + # let's track bounding box and labels predictions for the first 50 images + # as we hardly want to track all validation images + # but want to see how the predicted bounding boxes and labels are changing during the process + if i < 50: + # let's add tracking images with predicted bounding boxes + tensorboard.logger.add_image_with_boxes( + # adding pred_images tag to combine images in one subgroup + "pred_images/PD-{}".format(i), + # passing image tensor + img, + # passing predicted bounding boxes + outputs[0]["boxes"].cpu(), + # mapping & passing predicted labels + labels=[ + tensorboard.COCO_INSTANCE_CATEGORY_NAMES[i] + for i in outputs[0]["labels"].cpu().numpy() + ], + ) + # ### END OUR CODE ### + outputs = [{k: v.to(cpu_device) for k, v in t.items()} for t in outputs] + model_time = time.time() - model_time + + res = {target["image_id"].item(): output for target, output in zip(targets, outputs)} + evaluator_time = time.time() + coco_evaluator.update(res) + evaluator_time = time.time() - evaluator_time + metric_logger.update(model_time=model_time, evaluator_time=evaluator_time) + + # gather the stats from all processes + metric_logger.synchronize_between_processes() + print("Averaged stats:", metric_logger) + coco_evaluator.synchronize_between_processes() + + # accumulate predictions from all images + # add main process check for multi-gpu training (torch.distributed) + if utils.is_main_process(): + coco_evaluator.accumulate() + coco_evaluator.summarize() + torch.set_num_threads(n_threads) + return coco_evaluator diff --git a/PyTorch-Vision-Experiment-Logging/group_by_aspect_ratio.py b/PyTorch-Vision-Experiment-Logging/group_by_aspect_ratio.py new file mode 100644 index 000000000..517056056 --- /dev/null +++ b/PyTorch-Vision-Experiment-Logging/group_by_aspect_ratio.py @@ -0,0 +1,195 @@ +import bisect +from collections import defaultdict +import copy +from itertools import repeat, chain +import math +import numpy as np + +import torch +import torch.utils.data +from torch.utils.data.sampler import BatchSampler, Sampler +from torch.utils.model_zoo import tqdm +import torchvision + +from PIL import Image + + +def _repeat_to_at_least(iterable, n): + repeat_times = math.ceil(n / len(iterable)) + repeated = chain.from_iterable(repeat(iterable, repeat_times)) + return list(repeated) + + +class GroupedBatchSampler(BatchSampler): + """ + Wraps another sampler to yield a mini-batch of indices. + It enforces that the batch only contain elements from the same group. + It also tries to provide mini-batches which follows an ordering which is + as close as possible to the ordering from the original sampler. + Arguments: + sampler (Sampler): Base sampler. + group_ids (list[int]): If the sampler produces indices in range [0, N), + `group_ids` must be a list of `N` ints which contains the group id of each sample. + The group ids must be a continuous set of integers starting from + 0, i.e. they must be in the range [0, num_groups). + batch_size (int): Size of mini-batch. + """ + def __init__(self, sampler, group_ids, batch_size): + if not isinstance(sampler, Sampler): + raise ValueError( + "sampler should be an instance of " + "torch.utils.data.Sampler, but got sampler={}".format(sampler) + ) + self.sampler = sampler + self.group_ids = group_ids + self.batch_size = batch_size + + def __iter__(self): + buffer_per_group = defaultdict(list) + samples_per_group = defaultdict(list) + + num_batches = 0 + for idx in self.sampler: + group_id = self.group_ids[idx] + buffer_per_group[group_id].append(idx) + samples_per_group[group_id].append(idx) + if len(buffer_per_group[group_id]) == self.batch_size: + yield buffer_per_group[group_id] + num_batches += 1 + del buffer_per_group[group_id] + assert len(buffer_per_group[group_id]) < self.batch_size + + # now we have run out of elements that satisfy + # the group criteria, let's return the remaining + # elements so that the size of the sampler is + # deterministic + expected_num_batches = len(self) + num_remaining = expected_num_batches - num_batches + if num_remaining > 0: + # for the remaining batches, take first the buffers with largest number + # of elements + for group_id, _ in sorted(buffer_per_group.items(), + key=lambda x: len(x[1]), reverse=True): + remaining = self.batch_size - len(buffer_per_group[group_id]) + samples_from_group_id = _repeat_to_at_least(samples_per_group[group_id], remaining) + buffer_per_group[group_id].extend(samples_from_group_id[:remaining]) + assert len(buffer_per_group[group_id]) == self.batch_size + yield buffer_per_group[group_id] + num_remaining -= 1 + if num_remaining == 0: + break + assert num_remaining == 0 + + def __len__(self): + return len(self.sampler) // self.batch_size + + +def _compute_aspect_ratios_slow(dataset, indices=None): + print("Your dataset doesn't support the fast path for " + "computing the aspect ratios, so will iterate over " + "the full dataset and load every image instead. " + "This might take some time...") + if indices is None: + indices = range(len(dataset)) + + class SubsetSampler(Sampler): + def __init__(self, indices): + self.indices = indices + + def __iter__(self): + return iter(self.indices) + + def __len__(self): + return len(self.indices) + + sampler = SubsetSampler(indices) + data_loader = torch.utils.data.DataLoader( + dataset, batch_size=1, sampler=sampler, + num_workers=14, # you might want to increase it for faster processing + collate_fn=lambda x: x[0]) + aspect_ratios = [] + with tqdm(total=len(dataset)) as pbar: + for _i, (img, _) in enumerate(data_loader): + pbar.update(1) + height, width = img.shape[-2:] + aspect_ratio = float(width) / float(height) + aspect_ratios.append(aspect_ratio) + return aspect_ratios + + +def _compute_aspect_ratios_custom_dataset(dataset, indices=None): + if indices is None: + indices = range(len(dataset)) + aspect_ratios = [] + for i in indices: + height, width = dataset.get_height_and_width(i) + aspect_ratio = float(width) / float(height) + aspect_ratios.append(aspect_ratio) + return aspect_ratios + + +def _compute_aspect_ratios_coco_dataset(dataset, indices=None): + if indices is None: + indices = range(len(dataset)) + aspect_ratios = [] + for i in indices: + img_info = dataset.coco.imgs[dataset.ids[i]] + aspect_ratio = float(img_info["width"]) / float(img_info["height"]) + aspect_ratios.append(aspect_ratio) + return aspect_ratios + + +def _compute_aspect_ratios_voc_dataset(dataset, indices=None): + if indices is None: + indices = range(len(dataset)) + aspect_ratios = [] + for i in indices: + # this doesn't load the data into memory, because PIL loads it lazily + width, height = Image.open(dataset.images[i]).size + aspect_ratio = float(width) / float(height) + aspect_ratios.append(aspect_ratio) + return aspect_ratios + + +def _compute_aspect_ratios_subset_dataset(dataset, indices=None): + if indices is None: + indices = range(len(dataset)) + + ds_indices = [dataset.indices[i] for i in indices] + return compute_aspect_ratios(dataset.dataset, ds_indices) + + +def compute_aspect_ratios(dataset, indices=None): + if hasattr(dataset, "get_height_and_width"): + return _compute_aspect_ratios_custom_dataset(dataset, indices) + + if isinstance(dataset, torchvision.datasets.CocoDetection): + return _compute_aspect_ratios_coco_dataset(dataset, indices) + + if isinstance(dataset, torchvision.datasets.VOCDetection): + return _compute_aspect_ratios_voc_dataset(dataset, indices) + + if isinstance(dataset, torch.utils.data.Subset): + return _compute_aspect_ratios_subset_dataset(dataset, indices) + + # slow path + return _compute_aspect_ratios_slow(dataset, indices) + + +def _quantize(x, bins): + bins = copy.deepcopy(bins) + bins = sorted(bins) + quantized = list(map(lambda y: bisect.bisect_right(bins, y), x)) + return quantized + + +def create_aspect_ratio_groups(dataset, k=0): + aspect_ratios = compute_aspect_ratios(dataset) + bins = (2 ** np.linspace(-1, 1, 2 * k + 1)).tolist() if k > 0 else [1.0] + groups = _quantize(aspect_ratios, bins) + # count number of elements per group + counts = np.unique(groups, return_counts=True)[1] + fbins = [0] + bins + [np.inf] + print("Using {} as bins for aspect ratio quantization".format(fbins)) + print("Count of instances per bin: {}".format(counts)) + return groups diff --git a/PyTorch-Vision-Experiment-Logging/requirements.txt b/PyTorch-Vision-Experiment-Logging/requirements.txt new file mode 100644 index 000000000..6171b0079 --- /dev/null +++ b/PyTorch-Vision-Experiment-Logging/requirements.txt @@ -0,0 +1,7 @@ +torchvision==0.3.0 +numpy==1.17.3 +wandb==0.8.36 +pycocotools==2.0 +torch==1.1.0 +Pillow==7.1.2 +tensorboardX==2.0 diff --git a/PyTorch-Vision-Experiment-Logging/tensorboard.py b/PyTorch-Vision-Experiment-Logging/tensorboard.py new file mode 100644 index 000000000..f6a9582ee --- /dev/null +++ b/PyTorch-Vision-Experiment-Logging/tensorboard.py @@ -0,0 +1,124 @@ +# ### OUR CODE ### +import os.path as osp +import tensorboardX + +# create a new class inheriting from tensorboardX.SummaryWriter +class SummaryWriter(tensorboardX.SummaryWriter): + def __init__(self, log_dir=None, comment="", **kwargs): + super().__init__(log_dir, comment, **kwargs) + # create a new function that will take dictionary as input and uses built-in add_scalar() function + # that function combines all plots into one subgroup by a tag + def add_scalar_dict(self, dictionary, global_step, tag=None): + for name, val in dictionary.items(): + if tag is not None: + name = osp.join(tag, name) + self.add_scalar(name, val.item(), global_step) + +# COCO labels mapping +COCO_INSTANCE_CATEGORY_NAMES = [ + "__background__", + "person", + "bicycle", + "car", + "motorcycle", + "airplane", + "bus", + "train", + "truck", + "boat", + "traffic light", + "fire hydrant", + "N/A", + "stop sign", + "parking meter", + "bench", + "bird", + "cat", + "dog", + "horse", + "sheep", + "cow", + "elephant", + "bear", + "zebra", + "giraffe", + "N/A", + "backpack", + "umbrella", + "N/A", + "N/A", + "handbag", + "tie", + "suitcase", + "frisbee", + "skis", + "snowboard", + "sports ball", + "kite", + "baseball bat", + "baseball glove", + "skateboard", + "surfboard", + "tennis racket", + "bottle", + "N/A", + "wine glass", + "cup", + "fork", + "knife", + "spoon", + "bowl", + "banana", + "apple", + "sandwich", + "orange", + "broccoli", + "carrot", + "hot dog", + "pizza", + "donut", + "cake", + "chair", + "couch", + "potted plant", + "bed", + "N/A", + "dining table", + "N/A", + "N/A", + "toilet", + "N/A", + "tv", + "laptop", + "mouse", + "remote", + "keyboard", + "cell phone", + "microwave", + "oven", + "toaster", + "sink", + "refrigerator", + "N/A", + "book", + "clock", + "vase", + "scissors", + "teddy bear", + "hair drier", + "toothbrush", +] + +# define variables as globals to have an access everywhere +args = None # will be replaced to argparse dictionary +total_epochs = 0 # init total number of epochs +global_iter = 0 # init total number of iterations + +name = "exp-000" # init experiment name +log_dir = "experiments" # init path where tensorboard logs will be stored +# (if log_dir is not specified writer object will automatically generate filename) +# Log files will be saved in 'experiments/exp-000' +# create our custom logger +logger = SummaryWriter(log_dir=osp.join(log_dir, name)) + +# ### END OF OUR CODE ### diff --git a/PyTorch-Vision-Experiment-Logging/train.py b/PyTorch-Vision-Experiment-Logging/train.py new file mode 100644 index 000000000..007e1a917 --- /dev/null +++ b/PyTorch-Vision-Experiment-Logging/train.py @@ -0,0 +1,217 @@ +r"""PyTorch Detection Training. + +To run in a multi-gpu environment, use the distributed launcher:: + + python -m torch.distributed.launch --nproc_per_node=$NGPU --use_env \ + train.py ... --world-size $NGPU + +The default hyperparameters are tuned for training on 8 gpus and 2 images per gpu. + --lr 0.02 --batch-size 2 --world-size 8 +If you use different number of gpus, the learning rate should be changed to 0.02/8*$NGPU. + +On top of that, for training Faster/Mask R-CNN, the default hyperparameters are + --epochs 26 --lr-steps 16 22 --aspect-ratio-group-factor 3 + +Also, if you train Keypoint R-CNN, the default hyperparameters are + --epochs 46 --lr-steps 36 43 --aspect-ratio-group-factor 3 +Because the number of images is smaller in the person keypoint subset of COCO, +the number of epochs should be adapted so that we have the same number of iterations. +""" +import datetime +import os +import time + +import torch +import torch.utils.data +from torch import nn +import torchvision +import torchvision.models.detection +import torchvision.models.detection.mask_rcnn + +from coco_utils import get_coco, get_coco_kp + +from group_by_aspect_ratio import GroupedBatchSampler, create_aspect_ratio_groups +from engine import train_one_epoch, evaluate + +import utils +import transforms as T + +# ### OUR CODE +# import tensorboard and w&b +import tensorboard +import wandb +# ### END OF OUR CODE + + +def get_dataset(name, image_set, transform, data_path): + paths = { + "coco": (data_path, get_coco, 91), + "coco_kp": (data_path, get_coco_kp, 2) + } + p, ds_fn, num_classes = paths[name] + + ds = ds_fn(p, image_set=image_set, transforms=transform) + return ds, num_classes + + +def get_transform(train): + transforms = [] + transforms.append(T.ToTensor()) + if train: + transforms.append(T.RandomHorizontalFlip(0.5)) + return T.Compose(transforms) + + +def main(args): + utils.init_distributed_mode(args) + print(args) + # applying logging only in the main process + # ### OUR CODE ### + if utils.is_main_process(): + # passing argparse config with hyperparameters + tensorboard.args = vars(args) + # init wandb using config and experiment name + wandb.init(config=vars(args), name=tensorboard.name) + # enable tensorboard sync + wandb.init(sync_tensorboard=True) + # ### END OF OUR CODE ### + + device = torch.device(args.device) + + # Data loading code + print("Loading data") + + dataset, num_classes = get_dataset(args.dataset, "train", get_transform(train=True), args.data_path) + dataset_test, _ = get_dataset(args.dataset, "val", get_transform(train=False), args.data_path) + + print("Creating data loaders") + if args.distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(dataset) + test_sampler = torch.utils.data.distributed.DistributedSampler(dataset_test) + else: + train_sampler = torch.utils.data.RandomSampler(dataset) + test_sampler = torch.utils.data.SequentialSampler(dataset_test) + + if args.aspect_ratio_group_factor >= 0: + group_ids = create_aspect_ratio_groups(dataset, k=args.aspect_ratio_group_factor) + train_batch_sampler = GroupedBatchSampler(train_sampler, group_ids, args.batch_size) + else: + train_batch_sampler = torch.utils.data.BatchSampler( + train_sampler, args.batch_size, drop_last=True) + + data_loader = torch.utils.data.DataLoader( + dataset, batch_sampler=train_batch_sampler, num_workers=args.workers, + collate_fn=utils.collate_fn) + + data_loader_test = torch.utils.data.DataLoader( + dataset_test, batch_size=1, + sampler=test_sampler, num_workers=args.workers, + collate_fn=utils.collate_fn) + + print("Creating model") + model = torchvision.models.detection.__dict__[args.model](num_classes=num_classes, + pretrained=args.pretrained) + model.to(device) + + model_without_ddp = model + if args.distributed: + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) + model_without_ddp = model.module + + params = [p for p in model.parameters() if p.requires_grad] + optimizer = torch.optim.SGD( + params, lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay) + + # lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=args.lr_step_size, gamma=args.lr_gamma) + lr_scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=args.lr_steps, gamma=args.lr_gamma) + + if args.resume: + checkpoint = torch.load(args.resume, map_location='cpu') + model_without_ddp.load_state_dict(checkpoint['model']) + optimizer.load_state_dict(checkpoint['optimizer']) + lr_scheduler.load_state_dict(checkpoint['lr_scheduler']) + args.start_epoch = checkpoint['epoch'] + 1 + + if args.test_only: + evaluate(model, data_loader_test, device=device) + return + + print("Start training") + start_time = time.time() + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + train_one_epoch(model, optimizer, data_loader, device, epoch, args.print_freq) + lr_scheduler.step() + if args.output_dir: + utils.save_on_master({ + 'model': model_without_ddp.state_dict(), + 'optimizer': optimizer.state_dict(), + 'lr_scheduler': lr_scheduler.state_dict(), + 'args': args, + 'epoch': epoch}, + os.path.join(args.output_dir, 'model_{}.pth'.format(epoch))) + + # evaluate after every epoch + evaluate(model, data_loader_test, device=device) + + total_time = time.time() - start_time + total_time_str = str(datetime.timedelta(seconds=int(total_time))) + print('Training time {}'.format(total_time_str)) + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser( + description=__doc__) + + parser.add_argument('--data-path', default='/datasets01/COCO/022719/', help='dataset') + parser.add_argument('--dataset', default='coco', help='dataset') + parser.add_argument('--model', default='maskrcnn_resnet50_fpn', help='model') + parser.add_argument('--device', default='cuda', help='device') + parser.add_argument('-b', '--batch-size', default=2, type=int, + help='images per gpu, the total batch size is $NGPU x batch_size') + parser.add_argument('--epochs', default=26, type=int, metavar='N', + help='number of total epochs to run') + parser.add_argument('-j', '--workers', default=4, type=int, metavar='N', + help='number of data loading workers (default: 4)') + parser.add_argument('--lr', default=0.02, type=float, + help='initial learning rate, 0.02 is the default value for training ' + 'on 8 gpus and 2 images_per_gpu') + parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') + parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') + parser.add_argument('--lr-step-size', default=8, type=int, help='decrease lr every step-size epochs') + parser.add_argument('--lr-steps', default=[16, 22], nargs='+', type=int, help='decrease lr every step-size epochs') + parser.add_argument('--lr-gamma', default=0.1, type=float, help='decrease lr by a factor of lr-gamma') + parser.add_argument('--print-freq', default=20, type=int, help='print frequency') + parser.add_argument('--output-dir', default='.', help='path where to save') + parser.add_argument('--resume', default='', help='resume from checkpoint') + parser.add_argument('--start_epoch', default=0, type=int, help='start epoch') + parser.add_argument('--aspect-ratio-group-factor', default=3, type=int) + parser.add_argument( + "--test-only", + dest="test_only", + help="Only test the model", + action="store_true", + ) + parser.add_argument( + "--pretrained", + dest="pretrained", + help="Use pre-trained models from the modelzoo", + action="store_true", + ) + + # distributed training parameters + parser.add_argument('--world-size', default=1, type=int, + help='number of distributed processes') + parser.add_argument('--dist-url', default='env://', help='url used to set up distributed training') + + args = parser.parse_args() + + if args.output_dir: + utils.mkdir(args.output_dir) + + main(args) diff --git a/PyTorch-Vision-Experiment-Logging/transforms.py b/PyTorch-Vision-Experiment-Logging/transforms.py new file mode 100644 index 000000000..73efc92bd --- /dev/null +++ b/PyTorch-Vision-Experiment-Logging/transforms.py @@ -0,0 +1,50 @@ +import random +import torch + +from torchvision.transforms import functional as F + + +def _flip_coco_person_keypoints(kps, width): + flip_inds = [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15] + flipped_data = kps[:, flip_inds] + flipped_data[..., 0] = width - flipped_data[..., 0] + # Maintain COCO convention that if visibility == 0, then x, y = 0 + inds = flipped_data[..., 2] == 0 + flipped_data[inds] = 0 + return flipped_data + + +class Compose(object): + def __init__(self, transforms): + self.transforms = transforms + + def __call__(self, image, target): + for t in self.transforms: + image, target = t(image, target) + return image, target + + +class RandomHorizontalFlip(object): + def __init__(self, prob): + self.prob = prob + + def __call__(self, image, target): + if random.random() < self.prob: + height, width = image.shape[-2:] + image = image.flip(-1) + bbox = target["boxes"] + bbox[:, [0, 2]] = width - bbox[:, [2, 0]] + target["boxes"] = bbox + if "masks" in target: + target["masks"] = target["masks"].flip(-1) + if "keypoints" in target: + keypoints = target["keypoints"] + keypoints = _flip_coco_person_keypoints(keypoints, width) + target["keypoints"] = keypoints + return image, target + + +class ToTensor(object): + def __call__(self, image, target): + image = F.to_tensor(image) + return image, target diff --git a/PyTorch-Vision-Experiment-Logging/utils.py b/PyTorch-Vision-Experiment-Logging/utils.py new file mode 100644 index 000000000..82ae79bc3 --- /dev/null +++ b/PyTorch-Vision-Experiment-Logging/utils.py @@ -0,0 +1,324 @@ +from collections import defaultdict, deque +import datetime +import pickle +import time + +import torch +import torch.distributed as dist + +import errno +import os + + +class SmoothedValue(object): + """Track a series of values and provide access to smoothed values over a + window or the global series average. + """ + + def __init__(self, window_size=20, fmt=None): + if fmt is None: + fmt = "{median:.4f} ({global_avg:.4f})" + self.deque = deque(maxlen=window_size) + self.total = 0.0 + self.count = 0 + self.fmt = fmt + + def update(self, value, n=1): + self.deque.append(value) + self.count += n + self.total += value * n + + def synchronize_between_processes(self): + """ + Warning: does not synchronize the deque! + """ + if not is_dist_avail_and_initialized(): + return + t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda') + dist.barrier() + dist.all_reduce(t) + t = t.tolist() + self.count = int(t[0]) + self.total = t[1] + + @property + def median(self): + d = torch.tensor(list(self.deque)) + return d.median().item() + + @property + def avg(self): + d = torch.tensor(list(self.deque), dtype=torch.float32) + return d.mean().item() + + @property + def global_avg(self): + return self.total / self.count + + @property + def max(self): + return max(self.deque) + + @property + def value(self): + return self.deque[-1] + + def __str__(self): + return self.fmt.format( + median=self.median, + avg=self.avg, + global_avg=self.global_avg, + max=self.max, + value=self.value) + + +def all_gather(data): + """ + Run all_gather on arbitrary picklable data (not necessarily tensors) + Args: + data: any picklable object + Returns: + list[data]: list of data gathered from each rank + """ + world_size = get_world_size() + if world_size == 1: + return [data] + + # serialized to a Tensor + buffer = pickle.dumps(data) + storage = torch.ByteStorage.from_buffer(buffer) + tensor = torch.ByteTensor(storage).to("cuda") + + # obtain Tensor size of each rank + local_size = torch.tensor([tensor.numel()], device="cuda") + size_list = [torch.tensor([0], device="cuda") for _ in range(world_size)] + dist.all_gather(size_list, local_size) + size_list = [int(size.item()) for size in size_list] + max_size = max(size_list) + + # receiving Tensor from all ranks + # we pad the tensor because torch all_gather does not support + # gathering tensors of different shapes + tensor_list = [] + for _ in size_list: + tensor_list.append(torch.empty((max_size,), dtype=torch.uint8, device="cuda")) + if local_size != max_size: + padding = torch.empty(size=(max_size - local_size,), dtype=torch.uint8, device="cuda") + tensor = torch.cat((tensor, padding), dim=0) + dist.all_gather(tensor_list, tensor) + + data_list = [] + for size, tensor in zip(size_list, tensor_list): + buffer = tensor.cpu().numpy().tobytes()[:size] + data_list.append(pickle.loads(buffer)) + + return data_list + + +def reduce_dict(input_dict, average=True): + """ + Args: + input_dict (dict): all the values will be reduced + average (bool): whether to do average or sum + Reduce the values in the dictionary from all processes so that all processes + have the averaged results. Returns a dict with the same fields as + input_dict, after reduction. + """ + world_size = get_world_size() + if world_size < 2: + return input_dict + with torch.no_grad(): + names = [] + values = [] + # sort the keys so that they are consistent across processes + for k in sorted(input_dict.keys()): + names.append(k) + values.append(input_dict[k]) + values = torch.stack(values, dim=0) + dist.all_reduce(values) + if average: + values /= world_size + reduced_dict = {k: v for k, v in zip(names, values)} + return reduced_dict + + +class MetricLogger(object): + def __init__(self, delimiter="\t"): + self.meters = defaultdict(SmoothedValue) + self.delimiter = delimiter + + def update(self, **kwargs): + for k, v in kwargs.items(): + if isinstance(v, torch.Tensor): + v = v.item() + assert isinstance(v, (float, int)) + self.meters[k].update(v) + + def __getattr__(self, attr): + if attr in self.meters: + return self.meters[attr] + if attr in self.__dict__: + return self.__dict__[attr] + raise AttributeError("'{}' object has no attribute '{}'".format( + type(self).__name__, attr)) + + def __str__(self): + loss_str = [] + for name, meter in self.meters.items(): + loss_str.append( + "{}: {}".format(name, str(meter)) + ) + return self.delimiter.join(loss_str) + + def synchronize_between_processes(self): + for meter in self.meters.values(): + meter.synchronize_between_processes() + + def add_meter(self, name, meter): + self.meters[name] = meter + + def log_every(self, iterable, print_freq, header=None): + i = 0 + if not header: + header = '' + start_time = time.time() + end = time.time() + iter_time = SmoothedValue(fmt='{avg:.4f}') + data_time = SmoothedValue(fmt='{avg:.4f}') + space_fmt = ':' + str(len(str(len(iterable)))) + 'd' + if torch.cuda.is_available(): + log_msg = self.delimiter.join([ + header, + '[{0' + space_fmt + '}/{1}]', + 'eta: {eta}', + '{meters}', + 'time: {time}', + 'data: {data}', + 'max mem: {memory:.0f}' + ]) + else: + log_msg = self.delimiter.join([ + header, + '[{0' + space_fmt + '}/{1}]', + 'eta: {eta}', + '{meters}', + 'time: {time}', + 'data: {data}' + ]) + MB = 1024.0 * 1024.0 + for obj in iterable: + data_time.update(time.time() - end) + yield obj + iter_time.update(time.time() - end) + if i % print_freq == 0 or i == len(iterable) - 1: + eta_seconds = iter_time.global_avg * (len(iterable) - i) + eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) + if torch.cuda.is_available(): + print(log_msg.format( + i, len(iterable), eta=eta_string, + meters=str(self), + time=str(iter_time), data=str(data_time), + memory=torch.cuda.max_memory_allocated() / MB)) + else: + print(log_msg.format( + i, len(iterable), eta=eta_string, + meters=str(self), + time=str(iter_time), data=str(data_time))) + i += 1 + end = time.time() + total_time = time.time() - start_time + total_time_str = str(datetime.timedelta(seconds=int(total_time))) + print('{} Total time: {} ({:.4f} s / it)'.format( + header, total_time_str, total_time / len(iterable))) + + +def collate_fn(batch): + return tuple(zip(*batch)) + + +def warmup_lr_scheduler(optimizer, warmup_iters, warmup_factor): + + def f(x): + if x >= warmup_iters: + return 1 + alpha = float(x) / warmup_iters + return warmup_factor * (1 - alpha) + alpha + + return torch.optim.lr_scheduler.LambdaLR(optimizer, f) + + +def mkdir(path): + try: + os.makedirs(path) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + +def setup_for_distributed(is_master): + """ + This function disables printing when not in master process + """ + import builtins as __builtin__ + builtin_print = __builtin__.print + + def print(*args, **kwargs): + force = kwargs.pop('force', False) + if is_master or force: + builtin_print(*args, **kwargs) + + __builtin__.print = print + + +def is_dist_avail_and_initialized(): + if not dist.is_available(): + return False + if not dist.is_initialized(): + return False + return True + + +def get_world_size(): + if not is_dist_avail_and_initialized(): + return 1 + return dist.get_world_size() + + +def get_rank(): + if not is_dist_avail_and_initialized(): + return 0 + return dist.get_rank() + + +def is_main_process(): + return get_rank() == 0 + + +def save_on_master(*args, **kwargs): + if is_main_process(): + torch.save(*args, **kwargs) + + +def init_distributed_mode(args): + if 'RANK' in os.environ and 'WORLD_SIZE' in os.environ: + args.rank = int(os.environ["RANK"]) + args.world_size = int(os.environ['WORLD_SIZE']) + args.gpu = int(os.environ['LOCAL_RANK']) + elif 'SLURM_PROCID' in os.environ: + args.rank = int(os.environ['SLURM_PROCID']) + args.gpu = args.rank % torch.cuda.device_count() + else: + print('Not using distributed mode') + args.distributed = False + return + + args.distributed = True + + torch.cuda.set_device(args.gpu) + args.dist_backend = 'nccl' + print('| distributed init (rank {}): {}'.format( + args.rank, args.dist_url), flush=True) + torch.distributed.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + torch.distributed.barrier() + setup_for_distributed(args.rank == 0) diff --git a/PyTorch-to-CoreML-model-conversion/README.md b/PyTorch-to-CoreML-model-conversion/README.md new file mode 100644 index 000000000..936401eb3 --- /dev/null +++ b/PyTorch-to-CoreML-model-conversion/README.md @@ -0,0 +1,33 @@ +This contains the code for **PyTorch to CoreML model conversion**. For more information - visit +[**PyTorch to CoreML model conversion**](https://www.learnopencv.com/pytorch-to-coreml-model-conversion/) + +## Installation + +All required libraries collected in the requirements.txt file. To create a new virtual environment and install the +requirements, you can use these commands: + +``` +$ virtualenv -p python3.7 venv +$ source venv/bin/activate +$ pip install -r requirements.txt +``` + +## Run the script + +To convert any model from `torchvision.models` you can try our script by using this command: + +``` +$ python3 torch_to_coreml.py --model_name resnet18 --simplify +``` + +The `--model_name` argument should contain the name of any model from `torchvision.models` + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
diff --git a/PyTorch-to-CoreML-model-conversion/requirements.txt b/PyTorch-to-CoreML-model-conversion/requirements.txt new file mode 100644 index 000000000..9e9cdf3af --- /dev/null +++ b/PyTorch-to-CoreML-model-conversion/requirements.txt @@ -0,0 +1,8 @@ +coremltools==3.4 +numpy==1.19.0 +onnx==1.7.0 +onnx-coreml==1.3 +onnx-simplifier==0.2.10 +onnxruntime==1.3.0 +torch==1.4.0 +torchvision==0.5.0 diff --git a/PyTorch-to-CoreML-model-conversion/torch_to_coreml.py b/PyTorch-to-CoreML-model-conversion/torch_to_coreml.py new file mode 100644 index 000000000..7210541e2 --- /dev/null +++ b/PyTorch-to-CoreML-model-conversion/torch_to_coreml.py @@ -0,0 +1,155 @@ +import argparse +import platform + +import coremltools +import numpy as np +import onnx +import onnxruntime +import torch +import torch.onnx +import torchvision +from onnx_coreml import convert +from onnxsim import simplify + + +def check_onnx_output(filename, input_data, torch_output): + session = onnxruntime.InferenceSession(filename) + input_name = session.get_inputs()[0].name + result = session.run([], {input_name: input_data.numpy()}) + for test_result, gold_result in zip(result, torch_output.values()): + np.testing.assert_almost_equal( + gold_result.cpu().numpy(), test_result, decimal=3, + ) + return result + + +def check_onnx_model(model, onnx_filename, input_image): + with torch.no_grad(): + torch_out = {"output": model(input_image)} + check_onnx_output(onnx_filename, input_image, torch_out) + print("PyTorch output and ONNX output values are equal") + onnx_model = onnx.load(onnx_filename) + onnx.checker.check_model(onnx_model) + print("The model is checked!") + return onnx_model + + +def check_coreml_model(coreml_filename, torch_model, input_data): + + # get PyTorch model output + with torch.no_grad(): + torch_output = {"output": torch_model(input_data)} + + # get CoreML model output + coreml_model = coremltools.models.MLModel(coreml_filename, useCPUOnly=True) + + # convert input to numpy and get coreml model prediction + input_data = input_data.cpu().numpy() + pred = coreml_model.predict({"input": input_data}) + + for key in pred: + np.testing.assert_almost_equal( + torch_output[key].cpu().numpy(), pred[key], decimal=3, + ) + print("CoreML model is checked!") + return pred + + +def save_onnx_from_torch( + model, model_name, input_image, input_names=None, output_names=None, simplify=False, +): + # Section 1: PyTorch model conversion -- + if input_names is None: + input_names = ["input"] + if output_names is None: + output_names = ["output"] + + # set mode to evaluation and change device to cpu + model.eval() + model.cpu() + onnx_filename = model_name + ".onnx" + + # export our model to ONNX format + torch.onnx.export( + model, + input_image, + onnx_filename, + verbose=True, + input_names=input_names, + output_names=output_names, + ) + + # Section 2: Model testing + onnx_model = check_onnx_model(model, onnx_filename, input_image) + + # Section 3: ONNX simplifier + if simplify: + filename = model_name + "_simplified.onnx" + onnx_model_simplified, check = simplify_onnx(onnx_model, filename) + onnx.checker.check_model(onnx_model_simplified) + check_onnx_model(model, filename, input_image) + return onnx_model_simplified + else: + return onnx_model + + +def simplify_onnx(onnx_model, filename): + simplified_model, check = simplify(onnx_model) + onnx.save_model(simplified_model, filename) + return simplified_model, check + + +def convert_onnx_to_coreml(onnx_model, model_name, torch_model, input_data): + model_coreml = convert(onnx_model, minimum_ios_deployment_target="13") + coreml_filename = model_name + ".mlmodel" + model_coreml.save(coreml_filename) + if platform.system() == "Darwin": + check_coreml_model(coreml_filename, torch_model, input_data) + return model_coreml + + +def main(args): + state = 42 + np.random.seed(state) + torch.manual_seed(state) + + print("Start model conversion") + model_name = args.model_name + input_size = args.input_size + simp = args.simplify + + # get model from torchvision + torch_model = getattr(torchvision.models, model_name)(pretrained=True) + + # random image to make a network forward pass + dummy_input = torch.randn(1, 3, input_size, input_size, device="cpu") + + # save ONNX model + onnx_model = save_onnx_from_torch( + torch_model, model_name, input_image=dummy_input, simplify=simp, + ) + convert_onnx_to_coreml( + onnx_model, model_name, torch_model=torch_model, input_data=dummy_input, + ) + + print("PyTorch model has been converted to CoreML format") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--model_name", + "-mn", + required=True, + type=str, + help="model name from torchvision.model", + ) + parser.add_argument( + "--simplify", + "-s", + action="store_true", + help="Simplify ONNX model using onnx-simplifier", + ) + parser.add_argument("--input_size", default=224, type=int, help="input image size") + args = parser.parse_args() + main(args) diff --git a/README.md b/README.md index 5c031070f..34f4d1c4c 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # LearnOpenCV -This repo contains code for Computer Vision, Deep learning, and AI articles shared on our blog [LearnOpenCV.com](https://www.LearnOpenCV.com). +This repo contains code for Computer Vision, Deep learning, and AI articles shared on our blog [LearnOpenCV.com](https://www.LearnOpenCV.com). -Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. -

+

@@ -14,6 +14,22 @@ Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/course | Blog Post | | | ------------- |:-------------| |[PyTorch to Tensorflow Model Conversion](https://www.learnopencv.com/pytorch-to-tensorflow-model-conversion/) | [Code](https://github.com/spmallick/learnopencv/tree/master/PyTorch-to-TensorFlow-Model-Conversion) | +|[Snake Game with OpenCV Python](https://www.learnopencv.com/snake-game-with-opencv-python/)|[Code](https://github.com/spmallick/learnopencv/tree/master/SnakeGame)| +|[Stanford MRNet Challenge: Classifying Knee MRIs](https://www.learnopencv.com/stanford-mrnet-challenge-classifying-knee-mris/)|[Code](https://github.com/spmallick/learnopencv/tree/master/MRNet-Single-Model)| +|[Experiment Logging with TensorBoard and wandb](https://www.learnopencv.com/experiment-logging-with-tensorboard-and-wandb)|[Code](https://github.com/spmallick/learnopencv/tree/master/PyTorch-Vision-Experiment-Logging)| +|[Understanding Lens Distortion](https://www.learnopencv.com/understanding-lens-distortion/)|[Code](https://github.com/spmallick/learnopencv/tree/master/UnderstandingLensDistortion)| +|[Image Matting with state-of-the-art Method “F, B, Alpha Matting”](https://www.learnopencv.com/image-matting-with-state-of-the-art-method-f-b-alpha-matting/)|[Code](https://github.com/spmallick/learnopencv/tree/master/FBAMatting) | +|[Bag Of Tricks For Image Classification - Let's check if it is working or not](https://www.learnopencv.com/bag-of-tricks-for-image-classification-lets-check-if-it-is-working-or-not/)| [Code](https://github.com/spmallick/learnopencv/tree/master/Bag-Of-Tricks-For-Image-Classification) +|[Getting Started with OpenCV CUDA Module](https://www.learnopencv.com/getting-started-opencv-cuda-module/)|[Code](https://github.com/spmallick/learnopencv/tree/master/Getting-Started-OpenCV-CUDA-Module)| +|[Training a Custom Object Detector with DLIB & Making Gesture Controlled Applications](https://www.learnopencv.com/training-a-custom-object-detector-with-dlib-making-gesture-controlled-applications/)|[Code](https://github.com/spmallick/learnopencv/tree/master/Training_a_custom_hand_detector_with_dlib) | +|[How To Run Inference Using TensorRT C++ API](https://www.learnopencv.com/how-to-run-inference-using-tensorrt-c-api/) | [Code](https://github.com/spmallick/learnopencv/tree/master/PyTorch-ONNX-TensorRT-CPP) | +|[Using Facial Landmarks for Overlaying Faces with Medical Masks](https://www.learnopencv.com/using-facial-landmarks-for-overlaying-faces-with-masks/)|[Code](https://github.com/spmallick/learnopencv/tree/master/FaceMaskOverlay) | +|[Tensorboard with PyTorch Lightning](https://www.learnopencv.com/tensorboard-with-pytorch-lightning)|[Code](https://github.com/spmallick/learnopencv/tree/master/TensorBoard-With-Pytorch-Lightning) +|[Otsu's Thresholding with OpenCV](https://www.learnopencv.com/otsu-thresholding-with-opencv/)|[Code](https://github.com/spmallick/learnopencv/tree/master/otsu-method) +|[PyTorch-to-CoreML-model-conversion](https://www.learnopencv.com/pytorch-to-coreml-model-conversion/) | [Code](https://github.com/spmallick/learnopencv/tree/master/PyTorch-to-CoreML-model-conversion) +|[Playing Rock, Paper, Scissors with AI](https://www.learnopencv.com/playing-rock-paper-scissors-with-ai/) | [Code](https://github.com/spmallick/learnopencv/tree/master/Playing-rock-paper-scissors-with-AI) | +|[CNN Receptive Field Computation Using Backprop with TensorFlow](https://www.learnopencv.com/cnn-receptive-field-computation-using-backprop-with-tensorflow/)|[Code](https://github.com/spmallick/learnopencv/tree/master/TensorFlow-Receptive-Field-With-Backprop)| +|[CNN Fully Convolutional Image Classification with TensorFlow](https://www.learnopencv.com/cnn-fully-convolutional-image-classification-with-tensorflow) | [Code](https://github.com/spmallick/learnopencv/tree/master/TensorFlow-Fully-Convolutional-Image-Classification) | |[How to convert a model from PyTorch to TensorRT and speed up inference](https://www.learnopencv.com/how-to-convert-a-model-from-pytorch-to-tensorrt-and-speed-up-inference/) | [Code](https://github.com/spmallick/learnopencv/tree/master/PyTorch-ONNX-TensorRT) | |[Efficient image loading](https://www.learnopencv.com/efficient-image-loading/)|[Code](https://github.com/spmallick/learnopencv/tree/master/Efficient-image-loading) | |[Graph Convolutional Networks: Model Relations In Data](https://www.learnopencv.com/graph-convolutional-networks-model-relations-in-data/)|[Code](https://github.com/spmallick/learnopencv/tree/master/Graph-Convolutional-Networks-Model-Relations-In-Data)| @@ -25,6 +41,7 @@ Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/course |[t-SNE for ResNet feature visualization](https://www.learnopencv.com/t-sne-for-resnet-feature-visualization/)|[Code](https://github.com/spmallick/learnopencv/tree/master/TSNE)| |[Multi-Label Image Classification with Pytorch](https://www.learnopencv.com/multi-label-image-classification-with-pytorch/)|[Code](https://github.com/spmallick/learnopencv/tree/master/PyTorch-Multi-Label-Image-Classification)| |[CNN Receptive Field Computation Using Backprop](https://www.learnopencv.com/cnn-receptive-field-computation-using-backprop/)|[Code](https://github.com/spmallick/learnopencv/tree/master/PyTorch-Receptive-Field-With-Backprop)| +|[CNN Receptive Field Computation Using Backprop with TensorFlow](https://www.learnopencv.com/cnn-receptive-field-computation-using-backprop-with-tensorflow/)|[Code](https://github.com/spmallick/learnopencv/tree/master/TensorFlow-Receptive-Field-With-Backprop)| |[Augmented Reality using AruCo Markers in OpenCV(C++ and Python)](https://www.learnopencv.com/augmented-reality-using-aruco-markers-in-opencv-(c++-python)/) |[Code](https://github.com/spmallick/learnopencv/tree/master/AugmentedRealityWithArucoMarkers)| |[Fully Convolutional Image Classification on Arbitrary Sized Image](https://www.learnopencv.com/fully-convolutional-image-classification-on-arbitrary-sized-image/)|[Code](https://github.com/spmallick/learnopencv/tree/master/PyTorch-Fully-Convolutional-Image-Classification)| |[Camera Calibration using OpenCV](https://www.learnopencv.com/camera-calibration-using-opencv/) |[Code](https://github.com/spmallick/learnopencv/tree/master/CameraCalibration)| diff --git a/ReconstructFaceUsingEigenFaces/reconstructFace.cpp b/ReconstructFaceUsingEigenFaces/reconstructFace.cpp index 2d1e14969..d9db9e9e5 100644 --- a/ReconstructFaceUsingEigenFaces/reconstructFace.cpp +++ b/ReconstructFaceUsingEigenFaces/reconstructFace.cpp @@ -20,7 +20,7 @@ Mat imVector, meanVector, eigenVectors, im, display; // Right = Reconstructed Face void displayResult( Mat &left, Mat &right) { - hconcat(left,right, display); + hconcat(left,right, display); resize(display, display, Size(), 4, 4); imshow("Result", display); } @@ -34,22 +34,21 @@ void reconstructFace(int sliderVal, void*) { // The weight is the dot product of the mean subtracted // image vector with the EigenVector - double weight = imVector.dot(eigenVectors.row(i)); + double weight = imVector.dot(eigenVectors.row(i)); // Add weighted EigenFace to the output - output = output + eigenFaces[i] * weight; + output = output + eigenFaces[i] * weight; } displayResult(im, output); } - int main(int argc, char **argv) { // Read model file string modelFile("pcaParams.yml"); - cout << "Reading model file " << modelFile << " ... " ; + cout << "Reading model file " << modelFile << " ... "; FileStorage file(modelFile, FileStorage::READ); @@ -65,11 +64,11 @@ int main(int argc, char **argv) // Extract maximum number of EigenVectors. // This is the max(numImagesUsedInTraining, w * h * 3) - // where w = width, h = height of the training images. + // where w = width, h = height of the training images. int numEigenFaces = eigenVectors.size().height; cout << "DONE" << endl; - cout << "Extracting mean face and eigen faces ... "; + cout << "Extracting mean face and eigen faces ... "; // Extract mean vector and reshape it to obtain average face averageFace = meanVector.reshape(3,sz.height); @@ -82,27 +81,27 @@ int main(int argc, char **argv) } cout << "DONE" << endl; - // Read new test image. This image was not used in traning. + // Read new test image. This image was not used in traning. string imageFilename("test/satya1.jpg"); cout << "Read image " << imageFilename << " and vectorize ... "; im = imread(imageFilename); im.convertTo(im, CV_32FC3, 1/255.0); // Reshape image to one long vector and subtract the mean vector - imVector = im.clone(); + imVector = im.clone(); imVector = imVector.reshape(1, 1) - meanVector; - cout << "DONE" << endl; + cout << "DONE" << endl; // Show mean face first - output = averageFace.clone(); + output = averageFace.clone(); - cout << "Usage:" << endl + cout << "Usage:" << endl << "\tChange the slider to change the number of EigenFaces" << endl << "\tHit ESC to terminate program." << endl; - - namedWindow("Result", CV_WINDOW_AUTOSIZE); - int sliderValue; + + namedWindow("Result", cv::WINDOW_AUTOSIZE); + int sliderValue; // Changing the slider value changes the number of EigenVectors // used in reconstructFace. @@ -110,10 +109,7 @@ int main(int argc, char **argv) // Display original image and the reconstructed image size by side displayResult(im, output); - waitKey(0); destroyAllWindows(); } - - diff --git a/RedEyeRemover/removeRedEyes.cpp b/RedEyeRemover/removeRedEyes.cpp index e84f6167c..2304c9929 100644 --- a/RedEyeRemover/removeRedEyes.cpp +++ b/RedEyeRemover/removeRedEyes.cpp @@ -11,11 +11,11 @@ using namespace cv; void fillHoles(Mat &mask) { - /* + /* This hole filling algorithm is decribed in this post https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/ */ - + Mat maskFloodfill = mask.clone(); floodFill(maskFloodfill, cv::Point(0,0), Scalar(255)); Mat mask2; @@ -27,30 +27,28 @@ void fillHoles(Mat &mask) int main(int argc, char** argv ) { // Read image - Mat img = imread("red_eyes2.jpg",CV_LOAD_IMAGE_COLOR); + Mat img = imread("red_eyes2.jpg", cv::IMREAD_COLOR); // Output image Mat imgOut = img.clone(); - + // Load HAAR cascade CascadeClassifier eyesCascade("haarcascade_eye.xml"); - + // Detect eyes std::vector eyes; eyesCascade.detectMultiScale( img, eyes, 1.3, 4, 0 |CASCADE_SCALE_IMAGE, Size(100, 100) ); - // For every detected eye for( size_t i = 0; i < eyes.size(); i++ ) { - // Extract eye from the image. Mat eye = img(eyes[i]); - + // Split eye image into 3 channels. vectorbgr(3); split(eye,bgr); - + // Simple red eye detector Mat mask = (bgr[2] > 150) & (bgr[2] > ( bgr[1] + bgr[0] )); @@ -58,8 +56,6 @@ int main(int argc, char** argv ) fillHoles(mask); dilate(mask, mask, Mat(), Point(-1, -1), 3, 1, 1); - - // Calculate the mean channel by averaging // the green and blue channels @@ -74,12 +70,10 @@ int main(int argc, char** argv ) // Copy the fixed eye to the output image. eyeOut.copyTo(imgOut(eyes[i])); - } // Display Result imshow("Red Eyes", img); imshow("Red Eyes Removed", imgOut); waitKey(0); - } diff --git a/SnakeGame/README.md b/SnakeGame/README.md new file mode 100644 index 000000000..81558b93c --- /dev/null +++ b/SnakeGame/README.md @@ -0,0 +1,19 @@ +# Implementing Snake Game using OpenCV and Python + +This folder contains the code for implementing the famous snakes game in Python using OpenCV. The tutorial for this code can be found at [Snake Game with OpenCV Python](https://www.learnopencv.com/snake-game-with-opencv-python/) + +## USAGE + +``` +python snake.py +``` + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
diff --git a/SnakeGame/snake.py b/SnakeGame/snake.py new file mode 100644 index 000000000..778c459e7 --- /dev/null +++ b/SnakeGame/snake.py @@ -0,0 +1,163 @@ +import cv2 +import numpy as np +from random import randint +from random import choice + + +class SnakePart: + def __init__(self, front, x, y): + self.front = front + self.x = x + self.y = y + + def move(self): + # Moves by following the part in front of it + self.x = self.front.x + self.y = self.front.y + +class Head: + def __init__(self, direction, x, y): + self.direction = direction + self.x = x + self.y = y + + def move(self): + # Checks what its current direction is and moves accordingly + if self.direction == 0: + self.x += 1 + elif self.direction == 1: + self.y += 1 + elif self.direction == 2: + self.x -= 1 + elif self.direction == 3: + self.y -= 1 + +def display(): + + # Create a blank image + board = np.zeros([BOARD_SIZE, BOARD_SIZE, 3]) + + # Color the snake green + for part in snake: + board[part.y, part.x] = [0, 255, 0] + + # Color the apple red + board[appley, applex] = [0, 0, 255] + + # Display board + cv2.imshow("Snake Game", np.uint8(board.repeat(CELL_SIZE, 0).repeat(CELL_SIZE, 1))) + key = cv2.waitKey(int(1000/SPEED)) + + # Return the key pressed. It is -1 if no key is pressed. + return key + +def win_focus(): + # Ugly trick to get the window in focus. + # Opens an image in fullscreen and then back to normal window + cv2.namedWindow("Snake Game", cv2.WINDOW_AUTOSIZE); + board = np.zeros([BOARD_SIZE * CELL_SIZE, BOARD_SIZE * CELL_SIZE, 3]) + cv2.imshow("Snake Game", board); + cv2.setWindowProperty("Snake Game", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN); + cv2.waitKey(2000) + cv2.setWindowProperty("Snake Game", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_AUTOSIZE) + + +if __name__ == '__main__' : + + # Size of each cell in the board game + CELL_SIZE = 20 + # Number of cells along the width in the game + BOARD_SIZE = 45 + # Change SPEED to make the game go faster + SPEED = 12 + # After eating an apple the snake grows by GROWTH units + GROWTH = 3 + + + # Variable to track if apple is eaten + eaten = True + # Variable to check if the game should quit + quit = False + # Variable to track growth. + grow = 0 + + # Array for storing snake + snake = [] + + #snake's head starts at the center of the board. + head = Head(0, int((BOARD_SIZE - 1)/2), int((BOARD_SIZE - 1)/2)) + snake.append(head) + + # Start the game by printing instructions + print('w = top, a = left, s = down, d = right') + # Ugly trick to bring the window in focus + win_focus() + + while True: + + # Checks if the apple is eaten and generates a new one + if eaten: + # Create a list of all possible locations + s = list(range(0, BOARD_SIZE ** 2)) + # Delete cells that are part of the snake + for part in snake: + s.remove(part.x * BOARD_SIZE + part.y) + + # Randomly pick from one of the remaining cells + a = choice(s) + applex = int(a/BOARD_SIZE) + appley = a % BOARD_SIZE + + eaten = False + + # Makes and displays the board + key = display() + + + # Gets key presses and moves accordingly + # 8 and 27 are delete and escape keys + # Arrow keys are tricky in OpenCV. So we use + # keys 'w', 'a','s','d' for movement. + # w = top, a = left, s = down, d = right + + + if key == 8 or key == 27: + break + elif key == ord("d") : + head.direction = 0 + elif key == ord("s") : + head.direction = 1 + elif key == ord("a") : + head.direction = 2 + elif key == ord("w") : + head.direction = 3 + + # Moving the snake + for part in snake[::-1]: + part.move() + + # Collision rules + + if head.x < 0 or head.x > BOARD_SIZE - 1 or head.y < 0 or head.y > BOARD_SIZE - 1: + break + + for part in snake[1:]: + if head.x == part.x and head.y == part.y: + quit = True + break + + if quit: + break + + # The snake grows graduallly over multiple frames + if grow > 0: + snake.append(SnakePart(snake[-1], subx, suby)) + grow -= 1 + + # Grows the snake when it eats an apple + if applex == head.x and appley == head.y: + subx = snake[-1].x + suby = snake[-1].y + eaten = True + grow += GROWTH + diff --git a/TensorBoard-With-Pytorch-Lightning/README.md b/TensorBoard-With-Pytorch-Lightning/README.md new file mode 100644 index 000000000..47e2bfdee --- /dev/null +++ b/TensorBoard-With-Pytorch-Lightning/README.md @@ -0,0 +1,13 @@ +This contains the code for **TensorBoard with PyTorch Lightning**. For more information - visit [**TensorBoard with PyTorch Lightning**](https://www.learnopencv.com/tensorboard-with-pytorch-lightning/) + + + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
diff --git a/TensorBoard-With-Pytorch-Lightning/Tensorboard-with-PyTorch-Lightning.ipynb b/TensorBoard-With-Pytorch-Lightning/Tensorboard-with-PyTorch-Lightning.ipynb new file mode 100644 index 000000000..0481768c2 --- /dev/null +++ b/TensorBoard-With-Pytorch-Lightning/Tensorboard-with-PyTorch-Lightning.ipynb @@ -0,0 +1,7146 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Tensorboard Testing.ipynb", + "provenance": [], + "collapsed_sections": [], + "toc_visible": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "GPU", + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "06add6832ae94410861e93402a4407ce": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_82b5bdbec056425d9db5e91973d2fd69", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_13b64b55c89b4d5a8c3956e6b4fa5ce8", + "IPY_MODEL_df98408aa4784329ac6f6844d4645742" + ] + } + }, + "82b5bdbec056425d9db5e91973d2fd69": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "13b64b55c89b4d5a8c3956e6b4fa5ce8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_13be7a9e4ac447a984e0ec938ba3b132", + "_dom_classes": [], + "description": "Validation sanity check: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_2fec21701d2d4834b17b120b47495b01" + } + }, + "df98408aa4784329ac6f6844d4645742": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_41fa426d84d14762b074d103c433425c", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 2/2 [00:01<00:00, 1.33s/it]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_f33ecdfc71df4ed995f8c59e70231f99" + } + }, + "13be7a9e4ac447a984e0ec938ba3b132": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "2fec21701d2d4834b17b120b47495b01": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "41fa426d84d14762b074d103c433425c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "f33ecdfc71df4ed995f8c59e70231f99": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "166788b33ec140b9bf6891b3f8797d32": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_50b8bfa175444793a272bf0c34a618ba", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_6106b9226019481c8304fcde0e63a202", + "IPY_MODEL_66bd8a471c3c45ad816e79c7db7c35de" + ] + } + }, + "50b8bfa175444793a272bf0c34a618ba": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "6106b9226019481c8304fcde0e63a202": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_eaa96ec7f3f6458b96ff978ebbb52157", + "_dom_classes": [], + "description": "Epoch 10: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "success", + "max": 470, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 470, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_468f884d5cf249ab9878cd83cec045ed" + } + }, + "66bd8a471c3c45ad816e79c7db7c35de": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_f962be9fcfbd45d68cbc85d07a7dbf49", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 470/470 [00:16<00:00, 28.95it/s, loss=1.514, v_num=1]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_72a068171fcc44b08e4300bbeba2dd9a" + } + }, + "eaa96ec7f3f6458b96ff978ebbb52157": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "468f884d5cf249ab9878cd83cec045ed": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "f962be9fcfbd45d68cbc85d07a7dbf49": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "72a068171fcc44b08e4300bbeba2dd9a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "547946b574294a5fac045a78e815c747": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_8d1ee977e12343518eb1f3638b3a8d68", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_b3c16289906d427f8e5aa58a96e0dcb8", + "IPY_MODEL_674ef45d923045b29c5284159016420d" + ] + } + }, + "8d1ee977e12343518eb1f3638b3a8d68": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "b3c16289906d427f8e5aa58a96e0dcb8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_6e92cd364ab64a3d859d8dff72db10b7", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_fd905497be90433b93f3a3891b574dc1" + } + }, + "674ef45d923045b29c5284159016420d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_3435de8896dd45e8b680ddbc9cd4f8a1", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 2.23it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_9a29111183184f4693ba5de7c6cbea94" + } + }, + "6e92cd364ab64a3d859d8dff72db10b7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "fd905497be90433b93f3a3891b574dc1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "3435de8896dd45e8b680ddbc9cd4f8a1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "9a29111183184f4693ba5de7c6cbea94": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "bc5080cb96a24b2cb5b85813fa77e12e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_3251321b00714f8680e455a191fbc9ca", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_b9d725a2bf8043988d75cd9abce113f4", + "IPY_MODEL_3c359db366174498b4cd240b5414dd7f" + ] + } + }, + "3251321b00714f8680e455a191fbc9ca": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "b9d725a2bf8043988d75cd9abce113f4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_51669199bff44a3b85d90665f409832e", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_3404f6f821b648bea27397e9ca4fd568" + } + }, + "3c359db366174498b4cd240b5414dd7f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_19cc5abdec474fa48b076e411d1af943", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 2.19it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_c48dcb96532f4553941801dc714d4735" + } + }, + "51669199bff44a3b85d90665f409832e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "3404f6f821b648bea27397e9ca4fd568": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "19cc5abdec474fa48b076e411d1af943": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "c48dcb96532f4553941801dc714d4735": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "117258bc0cdd4e3198e173476200435c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_feae4123dd8b4300bc3f08125c6b1948", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_8b9b116ea4cb43b99a207e689e56ba4f", + "IPY_MODEL_e1a8289ca5144d9fb0999590bd5e79e2" + ] + } + }, + "feae4123dd8b4300bc3f08125c6b1948": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "8b9b116ea4cb43b99a207e689e56ba4f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_e00d9fd453034c02b9b06b29ae65e4f8", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_cbf9a18ad6b44b6380122311380a967c" + } + }, + "e1a8289ca5144d9fb0999590bd5e79e2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_e07bea8e56624fc4be74f789b2861a21", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 2.20it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_a34abcdf62da4d96a91bf30515d86ba0" + } + }, + "e00d9fd453034c02b9b06b29ae65e4f8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "cbf9a18ad6b44b6380122311380a967c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "e07bea8e56624fc4be74f789b2861a21": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "a34abcdf62da4d96a91bf30515d86ba0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "1b21483222ba416fa8f456a87782af73": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_524fc16894714aa098982b707219f360", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_2b51fccadb1544deb4212f8f2dc6ae36", + "IPY_MODEL_4d662f31c2b44e6aad5c07e2eec2fd08" + ] + } + }, + "524fc16894714aa098982b707219f360": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "2b51fccadb1544deb4212f8f2dc6ae36": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_7baa37345df5472380aa3a20f4d515b0", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_626067a3ea2e489e930357298bf4edec" + } + }, + "4d662f31c2b44e6aad5c07e2eec2fd08": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_baf7d82752fe4afc94bdef0ff90449ad", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 2.13it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_0bebb09292e9421295fda7ca8da23b28" + } + }, + "7baa37345df5472380aa3a20f4d515b0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "626067a3ea2e489e930357298bf4edec": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "baf7d82752fe4afc94bdef0ff90449ad": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "0bebb09292e9421295fda7ca8da23b28": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "bc28ca7097de4a2cbc46f0d42ebb5e70": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_8c60047983b84f4982da13b69511959d", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_be4bdcc280c24bf08f50f0581cc43e45", + "IPY_MODEL_1efb02f06f594569862225631367274f" + ] + } + }, + "8c60047983b84f4982da13b69511959d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "be4bdcc280c24bf08f50f0581cc43e45": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_b0fccc4a75414c6fbee773f7fa20edb8", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_293a945ce7a849cd858b9dfd93d07638" + } + }, + "1efb02f06f594569862225631367274f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_b2d0417743e746e490ccffc502c65e33", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 1.48it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_6e55c115dc02444a9592166ffb1a3494" + } + }, + "b0fccc4a75414c6fbee773f7fa20edb8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "293a945ce7a849cd858b9dfd93d07638": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "b2d0417743e746e490ccffc502c65e33": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "6e55c115dc02444a9592166ffb1a3494": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "822ef578aeb4482ca09f2c3884014cf5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_e8ffe3de6ca54df484958a9cf13d3252", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_79f86fee27cd4dc9b55eba51e2dafd8e", + "IPY_MODEL_b9733d27c6df42e0a7cf1e410962ad07" + ] + } + }, + "e8ffe3de6ca54df484958a9cf13d3252": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "79f86fee27cd4dc9b55eba51e2dafd8e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_3adde1e02cf543c2ab97c1c945b4c896", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_60c0822e465f46b49848030e0619ae27" + } + }, + "b9733d27c6df42e0a7cf1e410962ad07": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_4b40e778bae6427198289a348c0e839e", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 2.20it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_0f00a93e2586456590762cc71a364704" + } + }, + "3adde1e02cf543c2ab97c1c945b4c896": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "60c0822e465f46b49848030e0619ae27": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "4b40e778bae6427198289a348c0e839e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "0f00a93e2586456590762cc71a364704": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "fa7ff58db3644e2fa695ca889534222b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_2a94537b83ac4a99b31a9ba42f820fe7", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_aec0c015057f4fdebc72b4aaf1e6ec71", + "IPY_MODEL_9c61a20668c347eea6bad88f2819330f" + ] + } + }, + "2a94537b83ac4a99b31a9ba42f820fe7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "aec0c015057f4fdebc72b4aaf1e6ec71": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_442a99e054d54b4f8511673eebad2d7f", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_2af3f7ec723042b28fbf060b2ba9c02b" + } + }, + "9c61a20668c347eea6bad88f2819330f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_4edc3548d1364b69a33be523b24165a7", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 2.24it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_dd94806e23ab40bbbc4b65fa95478a35" + } + }, + "442a99e054d54b4f8511673eebad2d7f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "2af3f7ec723042b28fbf060b2ba9c02b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "4edc3548d1364b69a33be523b24165a7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "dd94806e23ab40bbbc4b65fa95478a35": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "12272021c2234ace8b0825fc4011a919": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_b3536c933c604fb889c0a6629ce0a43b", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_165d809cf2694bfa89202ef2fed621ea", + "IPY_MODEL_261b218116a74baab4f1b430204bcd84" + ] + } + }, + "b3536c933c604fb889c0a6629ce0a43b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "165d809cf2694bfa89202ef2fed621ea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_323778f9289f4992be97b592769a7eb3", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_57feb1626025410f9fb518707724f0f1" + } + }, + "261b218116a74baab4f1b430204bcd84": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_e0d925454000435782fb9a46654a1dc0", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 2.24it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_e1c5e4bd40fb4197812204b9f90233d9" + } + }, + "323778f9289f4992be97b592769a7eb3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "57feb1626025410f9fb518707724f0f1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "e0d925454000435782fb9a46654a1dc0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "e1c5e4bd40fb4197812204b9f90233d9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "1c2da3c953d64f2f8f0d52d53ef9a76e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_e3fdc27e03254b4c85a334cb8257203d", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_51acdd35dd534dc696c7b6942f5eb4d0", + "IPY_MODEL_670fd15bfad64fac9bdea338e118c613" + ] + } + }, + "e3fdc27e03254b4c85a334cb8257203d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "51acdd35dd534dc696c7b6942f5eb4d0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_f968728971b14f83bc635efccf191073", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_5142d3a0327f41c29d6e1dce42de2d49" + } + }, + "670fd15bfad64fac9bdea338e118c613": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_dbd0b779711d42b893ed6427a0e200cd", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 1.50it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_417a972906784467af59f5880aca329b" + } + }, + "f968728971b14f83bc635efccf191073": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "5142d3a0327f41c29d6e1dce42de2d49": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "dbd0b779711d42b893ed6427a0e200cd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "417a972906784467af59f5880aca329b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "444e17ff24bb4034a1687413ce81c706": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_378472c5ac2b4266bea077c384330e28", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_6a894f5f3ada42c1b04502b50f7cc7e1", + "IPY_MODEL_33f4347b60084c2bbc2954a1a4244d14" + ] + } + }, + "378472c5ac2b4266bea077c384330e28": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "6a894f5f3ada42c1b04502b50f7cc7e1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_89ab9598547e4d82839d9c5c35448832", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_29d183cbb8eb4f2a80624bf9cf258d4c" + } + }, + "33f4347b60084c2bbc2954a1a4244d14": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_51e6dbea5ba34115a7ef056880ce2773", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 2.13it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_3d6d28ee166248e6964291bd5ac8fbc6" + } + }, + "89ab9598547e4d82839d9c5c35448832": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "29d183cbb8eb4f2a80624bf9cf258d4c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "51e6dbea5ba34115a7ef056880ce2773": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "3d6d28ee166248e6964291bd5ac8fbc6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "f6b418ac9a784cf39f537e93b9712b0f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_bbb09b3b11454d3d902c981c1874e227", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_727f101faa1147dca0bab10a1b867754", + "IPY_MODEL_4ffae6daab15469181ad62dcf4b6755f" + ] + } + }, + "bbb09b3b11454d3d902c981c1874e227": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "727f101faa1147dca0bab10a1b867754": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_b067a85aa69c4acc8f38077444b0b62b", + "_dom_classes": [], + "description": "Validation sanity check: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_702e0c51876d491d84eeb7b93e021416" + } + }, + "4ffae6daab15469181ad62dcf4b6755f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_695279db98734f72b5a8187f484ed4eb", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 2/2 [00:01<00:00, 1.30s/it]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_b801e6dda709479fb28a11ccff2e9fd2" + } + }, + "b067a85aa69c4acc8f38077444b0b62b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "702e0c51876d491d84eeb7b93e021416": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "695279db98734f72b5a8187f484ed4eb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "b801e6dda709479fb28a11ccff2e9fd2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "b0caff9a0db3449da90c4696ff0c6dc0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_23f2a1c6eadb415c9253c74dbefd701e", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_8d61e6981653498dbfe5cd863d1d4abf", + "IPY_MODEL_bbbf9723a0214db3a55f7c643650a59e" + ] + } + }, + "23f2a1c6eadb415c9253c74dbefd701e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "8d61e6981653498dbfe5cd863d1d4abf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_e0543446503d4548bf7b49a1ba1c8811", + "_dom_classes": [], + "description": "Epoch 4: 91%", + "_model_name": "FloatProgressModel", + "bar_style": "danger", + "max": 470, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 430, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_a0b0e0209c5d4148bb50ef2defc83cef" + } + }, + "bbbf9723a0214db3a55f7c643650a59e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_c863ca4c52dd45bbb4b8d04ac7bbf13e", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 430/470 [00:15<00:01, 27.35it/s, loss=1.589, v_num=1]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_69c58acf0f1b477fb9486b214ed10ef8" + } + }, + "e0543446503d4548bf7b49a1ba1c8811": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "a0b0e0209c5d4148bb50ef2defc83cef": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "c863ca4c52dd45bbb4b8d04ac7bbf13e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "69c58acf0f1b477fb9486b214ed10ef8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "cfe1eb2121444a0a84266c3d75fcd963": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_3756191380f34b33a371f7956c88dfe6", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_6e0b815542c94c2a8d3f7c5272ae87b2", + "IPY_MODEL_fe1bd530a464467d915d23b7bf82dbe7" + ] + } + }, + "3756191380f34b33a371f7956c88dfe6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "6e0b815542c94c2a8d3f7c5272ae87b2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_2bb4b7c9b0104bfbb4699c0ae914fc53", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_aa0cc4c7dce948bdaa0857e028eadbc6" + } + }, + "fe1bd530a464467d915d23b7bf82dbe7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_c62dcf23227f4cbcbaa2ea8297455c76", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 2.05it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_7329aace66ce4a5290e0b8acb9273aba" + } + }, + "2bb4b7c9b0104bfbb4699c0ae914fc53": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "aa0cc4c7dce948bdaa0857e028eadbc6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "c62dcf23227f4cbcbaa2ea8297455c76": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "7329aace66ce4a5290e0b8acb9273aba": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "86169559e322466f9868a541c1f6724c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_448a75c288ab40e59b8e9efbf083ba06", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_478a909bdccb44949182a485aa4c7aac", + "IPY_MODEL_83cc7e5988fa4699843a873408375ec7" + ] + } + }, + "448a75c288ab40e59b8e9efbf083ba06": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "478a909bdccb44949182a485aa4c7aac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_ccec043d8c8c47dd826612978a1d8fec", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_37a1ca16333841039c6b1b3b260aebb9" + } + }, + "83cc7e5988fa4699843a873408375ec7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_3813ceefeb3841d9887c82ba0a3e659f", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 2.06it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_d1c400398bc74762b2f7882d1cc57702" + } + }, + "ccec043d8c8c47dd826612978a1d8fec": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "37a1ca16333841039c6b1b3b260aebb9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "3813ceefeb3841d9887c82ba0a3e659f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "d1c400398bc74762b2f7882d1cc57702": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "40180487115c473a872d7c896bacb3ff": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_f00cd38365174318af3c49ba42d67bc5", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_704f7b19739a4c05ae46a0d6ffa7a865", + "IPY_MODEL_33306403471c4538abdab5bfa05b4610" + ] + } + }, + "f00cd38365174318af3c49ba42d67bc5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "704f7b19739a4c05ae46a0d6ffa7a865": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_ffcb6cca375c4c8b9dfd9190671ff348", + "_dom_classes": [], + "description": "Validating: 100%", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 1, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_149e414e1c9441019eb052a4c36d19a9" + } + }, + "33306403471c4538abdab5bfa05b4610": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_fb7cab66a2474ab6bcd7946a2fb60f42", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 40/40 [00:02<00:00, 2.06it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_5e54c83fcc3a4efba43349a1b08061fd" + } + }, + "ffcb6cca375c4c8b9dfd9190671ff348": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "149e414e1c9441019eb052a4c36d19a9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "fb7cab66a2474ab6bcd7946a2fb60f42": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "5e54c83fcc3a4efba43349a1b08061fd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "02ec7b2afb7d4456bbfed4efe0ed3df4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_7d8abb71feeb4a64a7e21e645d5da2f4", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_26cf343f24e44198808769ff76958275", + "IPY_MODEL_e755ff286a074c42a236062a763ed59c" + ] + } + }, + "7d8abb71feeb4a64a7e21e645d5da2f4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": "row wrap", + "width": "100%", + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": "inline-flex", + "left": null + } + }, + "26cf343f24e44198808769ff76958275": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_d5a5178a43c1418092f7dd604b8f1305", + "_dom_classes": [], + "description": "Validating: ", + "_model_name": "FloatProgressModel", + "bar_style": "info", + "max": 1, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 0, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_67161adc5d514547a036374dee270d7d" + } + }, + "e755ff286a074c42a236062a763ed59c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_59a1f9c386db47e7b4d263adaa4a720b", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 0/? [00:00<?, ?it/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_6a9b117e0050412f85013848881988de" + } + }, + "d5a5178a43c1418092f7dd604b8f1305": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "67161adc5d514547a036374dee270d7d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": "2", + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "59a1f9c386db47e7b4d263adaa4a720b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "6a9b117e0050412f85013848881988de": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + } + } + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "VCkEWKWlD3p6", + "colab_type": "text" + }, + "source": [ + "#Pytorch Lightning Installation" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zw8Dr4nFRM86", + "colab_type": "code", + "outputId": "7f2f17b7-adf0-4f97-acaa-1c930cfbcd2f", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 812 + } + }, + "source": [ + "!pip install pytorch_lightning" + ], + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Collecting pytorch_lightning\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/71/ab/561d1fa6e5af30b2fd7cb4001f93eb08531e1b72976f13eebf7f7cdc021c/pytorch_lightning-0.7.6-py3-none-any.whl (248kB)\n", + "\r\u001b[K |█▎ | 10kB 16.7MB/s eta 0:00:01\r\u001b[K |██▋ | 20kB 1.7MB/s eta 0:00:01\r\u001b[K |████ | 30kB 2.3MB/s eta 0:00:01\r\u001b[K |█████▎ | 40kB 2.5MB/s eta 0:00:01\r\u001b[K |██████▋ | 51kB 2.0MB/s eta 0:00:01\r\u001b[K |████████ | 61kB 2.3MB/s eta 0:00:01\r\u001b[K |█████████▏ | 71kB 2.4MB/s eta 0:00:01\r\u001b[K |██████████▌ | 81kB 2.7MB/s eta 0:00:01\r\u001b[K |███████████▉ | 92kB 2.9MB/s eta 0:00:01\r\u001b[K |█████████████▏ | 102kB 2.8MB/s eta 0:00:01\r\u001b[K |██████████████▌ | 112kB 2.8MB/s eta 0:00:01\r\u001b[K |███████████████▉ | 122kB 2.8MB/s eta 0:00:01\r\u001b[K |█████████████████ | 133kB 2.8MB/s eta 0:00:01\r\u001b[K |██████████████████▍ | 143kB 2.8MB/s eta 0:00:01\r\u001b[K |███████████████████▊ | 153kB 2.8MB/s eta 0:00:01\r\u001b[K |█████████████████████ | 163kB 2.8MB/s eta 0:00:01\r\u001b[K |██████████████████████▍ | 174kB 2.8MB/s eta 0:00:01\r\u001b[K |███████████████████████▊ | 184kB 2.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████ | 194kB 2.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████▎ | 204kB 2.8MB/s eta 0:00:01\r\u001b[K |███████████████████████████▋ | 215kB 2.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████████ | 225kB 2.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▎ | 235kB 2.8MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▋| 245kB 2.8MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 256kB 2.8MB/s \n", + "\u001b[?25hRequirement already satisfied: tensorboard>=1.14 in /usr/local/lib/python3.6/dist-packages (from pytorch_lightning) (2.2.1)\n", + "Requirement already satisfied: tqdm>=4.41.0 in /usr/local/lib/python3.6/dist-packages (from pytorch_lightning) (4.41.1)\n", + "Requirement already satisfied: torch>=1.1 in /usr/local/lib/python3.6/dist-packages (from pytorch_lightning) (1.5.0+cu101)\n", + "Collecting future>=0.17.1\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/45/0b/38b06fd9b92dc2b68d58b75f900e97884c45bedd2ff83203d933cf5851c9/future-0.18.2.tar.gz (829kB)\n", + "\u001b[K |████████████████████████████████| 829kB 8.4MB/s \n", + "\u001b[?25hRequirement already satisfied: numpy>=1.16.4 in /usr/local/lib/python3.6/dist-packages (from pytorch_lightning) (1.18.4)\n", + "Requirement already satisfied: pyyaml>=3.13 in /usr/local/lib/python3.6/dist-packages (from pytorch_lightning) (3.13)\n", + "Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorboard>=1.14->pytorch_lightning) (3.10.0)\n", + "Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.6/dist-packages (from tensorboard>=1.14->pytorch_lightning) (46.4.0)\n", + "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorboard>=1.14->pytorch_lightning) (1.6.0.post3)\n", + "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tensorboard>=1.14->pytorch_lightning) (1.0.1)\n", + "Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.6/dist-packages (from tensorboard>=1.14->pytorch_lightning) (1.29.0)\n", + "Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.6/dist-packages (from tensorboard>=1.14->pytorch_lightning) (0.9.0)\n", + "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard>=1.14->pytorch_lightning) (3.2.2)\n", + "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from tensorboard>=1.14->pytorch_lightning) (1.12.0)\n", + "Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.6/dist-packages (from tensorboard>=1.14->pytorch_lightning) (2.23.0)\n", + "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.6/dist-packages (from tensorboard>=1.14->pytorch_lightning) (0.4.1)\n", + "Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.6/dist-packages (from tensorboard>=1.14->pytorch_lightning) (1.7.2)\n", + "Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from tensorboard>=1.14->pytorch_lightning) (0.34.2)\n", + "Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.6/dist-packages (from markdown>=2.6.8->tensorboard>=1.14->pytorch_lightning) (1.6.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.21.0->tensorboard>=1.14->pytorch_lightning) (2020.4.5.1)\n", + "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.21.0->tensorboard>=1.14->pytorch_lightning) (3.0.4)\n", + "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.21.0->tensorboard>=1.14->pytorch_lightning) (2.9)\n", + "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.21.0->tensorboard>=1.14->pytorch_lightning) (1.24.3)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=1.14->pytorch_lightning) (1.3.0)\n", + "Requirement already satisfied: rsa<4.1,>=3.1.4 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard>=1.14->pytorch_lightning) (4.0)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard>=1.14->pytorch_lightning) (0.2.8)\n", + "Requirement already satisfied: cachetools<3.2,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard>=1.14->pytorch_lightning) (3.1.1)\n", + "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.6/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard>=1.14->pytorch_lightning) (3.1.0)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=1.14->pytorch_lightning) (3.1.0)\n", + "Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.6/dist-packages (from rsa<4.1,>=3.1.4->google-auth<2,>=1.6.3->tensorboard>=1.14->pytorch_lightning) (0.4.8)\n", + "Building wheels for collected packages: future\n", + " Building wheel for future (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for future: filename=future-0.18.2-cp36-none-any.whl size=491057 sha256=935aea8e476324af1e7d1251a1466a35c30499ad9e3e0b65c5cd2a4c75327f60\n", + " Stored in directory: /root/.cache/pip/wheels/8b/99/a0/81daf51dcd359a9377b110a8a886b3895921802d2fc1b2397e\n", + "Successfully built future\n", + "Installing collected packages: future, pytorch-lightning\n", + " Found existing installation: future 0.16.0\n", + " Uninstalling future-0.16.0:\n", + " Successfully uninstalled future-0.16.0\n", + "Successfully installed future-0.18.2 pytorch-lightning-0.7.6\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XsFtJWh9NFkY", + "colab_type": "text" + }, + "source": [ + "# **1. Using Default Lightning Logger**\n", + "We will see simple logging using in-built tensorboard support for Lightning" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "He01VrrONse2", + "colab_type": "code", + "colab": {} + }, + "source": [ + "'''\n", + "Neural Network architecture inspired from: \n", + "https://towardsdatascience.com/convolutional-neural-network-for-image-classification-with-implementation-on-python-using-pytorch-7b88342c9ca9\n", + "'''\n", + "\n", + "#importing necessary libraries\n", + "import os\n", + "import torch\n", + "from torch.nn import functional as F\n", + "from torch.utils.data import DataLoader,random_split\n", + "from torchvision.datasets import MNIST\n", + "from torchvision import transforms\n", + "import pytorch_lightning as pl\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import torchvision\n", + "\n", + "\n", + "#defining the model\n", + "class smallAndSmartModel(pl.LightningModule):\n", + "\n", + "\n", + " def __init__(self):\n", + " #this is the init function where we will defnine the architecture\n", + " super(smallAndSmartModel, self).__init__()\n", + " \n", + " self.layer1 = torch.nn.Sequential(\n", + " torch.nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1),\n", + " torch.nn.ReLU(),\n", + " torch.nn.MaxPool2d(kernel_size=2, stride=2),\n", + " torch.nn.Dropout(p=0.5))\n", + " self.layer2 = torch.nn.Sequential(\n", + " torch.nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),\n", + " torch.nn.ReLU(),\n", + " torch.nn.MaxPool2d(kernel_size=2, stride=2),\n", + " torch.nn.Dropout(p=0.5))\n", + " self.layer3 = torch.nn.Sequential(\n", + " torch.nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),\n", + " torch.nn.ReLU(),\n", + " torch.nn.MaxPool2d(kernel_size=2, stride=2, padding=1),\n", + " torch.nn.Dropout(p=0.5))\n", + "\n", + " self.fc1 = torch.nn.Linear(4 * 4 * 128, 625, bias=True)\n", + " torch.nn.init.xavier_uniform(self.fc1.weight)\n", + " self.layer4 = torch.nn.Sequential(\n", + " self.fc1,\n", + " torch.nn.ReLU(),\n", + " torch.nn.Dropout(p=0.5))\n", + " self.dense1_bn = torch.nn.BatchNorm1d(625)\n", + " self.fc2 = torch.nn.Linear(625, 10, bias=True)\n", + " self.dense2_bn = torch.nn.BatchNorm1d(10)\n", + " torch.nn.init.xavier_uniform_(self.fc2.weight) # initialize parameters\n", + "\n", + " def prepare_data(self):\n", + " \n", + " # This contains the manupulation on data that needs to be done only once such as downloading it\n", + "\n", + " #download the MNIST dataset\n", + " MNIST(os.getcwd(), train=True, download =True)\n", + " MNIST(os.getcwd(), train=False, download =True)\n", + " \n", + " # See here I have set download to false as it is already downloaded\n", + " mnist_train=MNIST(os.getcwd(), train=True, download =False,transform=transforms.ToTensor())\n", + "\n", + " #dividing into validation and training set\n", + " self.train_set, self.val_set= random_split(mnist_train,[55000,5000])\n", + " \n", + " def train_dataloader(self):\n", + " # REQUIRED\n", + " # This is an essential function. Needs to be included in the code\n", + " \n", + " return DataLoader(self.train_set,batch_size=128,num_workers=32)\n", + " \n", + " def val_dataloader(self):\n", + " # OPTIONAL\n", + " #loading validation dataset\n", + " return DataLoader(self.val_set, batch_size=128,num_workers=32)\n", + "\n", + " def test_dataloader(self):\n", + " # OPTIONAL\n", + " # loading test dataset\n", + " return DataLoader(MNIST(os.getcwd(), train=False, download=False, transform=transforms.ToTensor()), batch_size=128,num_workers=32)\n", + " \n", + "\n", + " def forward(self,x):\n", + " # evaluating the batch data as it moves forward in the netowrk\n", + " out = self.layer1(x)\n", + " out = self.layer2(out)\n", + " out = self.layer3(out)\n", + " out = out.view(out.size(0), -1) # Flatten them for FC\n", + " # out = self.fc1(out)\n", + " out = self.dense1_bn(self.fc1(out))\n", + " \n", + " # out = self.fc2(out)\n", + " out = self.dense2_bn(self.fc2(out))\n", + " # print(out.shape)\n", + " return F.softmax(out,dim=1)\n", + "\n", + " def validation_step(self, batch, batch_nb):\n", + " # OPTIONAL\n", + " # The code that runs as we forward pass a validation batch\n", + " x, y = batch\n", + " y_hat = self(x)\n", + " correct=y_hat.argmax(dim=1).eq(y).sum().item()\n", + " total=len(y)\n", + " return {'val_loss': F.cross_entropy(y_hat, y),\"correct\": correct,\"total\": total}\n", + "\n", + " def validation_epoch_end(self, outputs):\n", + " # OPTIONAL\n", + " # The code that runs as a validation epoch finished\n", + " # Used for metric evaluation\n", + " avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean()\n", + " correct=sum([x[\"correct\"] for x in outputs])\n", + " total=sum([x[\"total\"] for x in outputs])\n", + " print(\"Loss val= {}\".format(avg_loss))\n", + " print(\"Number of Correctly identified Validation Images {} from aset of {}. \\nAccuracy= {} \".format(correct,total,correct/total))\n", + " \n", + " tensorboard_logs = {'val_loss': avg_loss,\"Accuracy\": correct/total}\n", + " return {'val_loss': avg_loss, 'log': tensorboard_logs}\n", + "\n", + " def test_step(self, batch, batch_nb):\n", + " # OPTIONAL\n", + " # The code that runs as we forward pass a test batch\n", + "\n", + " x, y = batch\n", + " y_hat = self(x)\n", + " correct=y_hat.argmax(dim=1).eq(y).sum().item()\n", + " total=len(y)\n", + " # returning the batch_dictionary\n", + " return {'test_loss': F.cross_entropy(y_hat, y),\n", + " \"correct\": correct,\n", + " \"total\": total}\n", + "\n", + " def test_epoch_end(self, outputs):\n", + " # OPTIONAL\n", + " # The code that runs as a validation epoch finished\n", + " # Used for metric evaluation\n", + " correct=sum([x[\"correct\"] for x in outputs])\n", + " total=sum([x[\"total\"] for x in outputs])\n", + " print(\"Number of Correctly identified Testing Images {} from aset of {}. \\nAccuracy= {} \".format(testCorrect,testTotal,testCorrect/testTotal))\n", + " avg_loss = torch.stack([x['test_loss'] for x in outputs]).mean()\n", + " print(\"Loss= {}\".format(avg_loss))\n", + " logs = {'test_loss': avg_loss}\n", + " return {'test_loss': avg_loss, 'log': logs, 'progress_bar': logs}\n", + "\n", + " def configure_optimizers(self):\n", + " # REQUIRED\n", + " # Can return multiple optimizers and learning_rate schedulers\n", + " return torch.optim.Adam(self.parameters(), lr=0.0005)\n", + "\n", + " def training_step(self,batch,batch_idx):\n", + " #REQUIRED\n", + " # extracting input and output from the batch\n", + " x,labels=batch\n", + " pred=self.forward(x)\n", + "\n", + " correct=pred.argmax(dim=1).eq(labels).sum().item()\n", + " total=len(labels)\n", + " #calculating the loss\n", + " train_loss = F.cross_entropy(pred, labels)\n", + "\n", + " #logs\n", + " logs={\"train_loss\": train_loss}\n", + "\n", + " output={\n", + " #REQUIRED: It ie required for us to return \"loss\"\n", + " \"loss\": train_loss,\n", + " #optional for logging purposes\n", + " \"log\": logs,\n", + " \"correct\": correct,\n", + " \"total\": total\n", + " }\n", + "\n", + " return output\n", + " \n", + " def training_epoch_end(self,outputs):\n", + "\n", + " avg_loss = torch.stack([x['loss'] for x in outputs]).mean()\n", + " print(\"Loss train= {}\".format(avg_loss))\n", + " correct=sum([x[\"correct\"] for x in outputs])\n", + " total=sum([x[\"total\"] for x in outputs])\n", + " tensorboard_logs = {'loss': avg_loss,\"Accuracy\": correct/total}\n", + " print(\"Number of Correctly identified Training Set Images {} from a set of {}. \\nAccuracy= {} \".format(correct,total,correct/total))\n", + " return {'loss': avg_loss, 'log': tensorboard_logs}" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wSRlyxbaZvAI", + "colab_type": "text" + }, + "source": [ + "## Training" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "H-AFLIIDZtpc", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000, + "referenced_widgets": [ + "06add6832ae94410861e93402a4407ce", + "82b5bdbec056425d9db5e91973d2fd69", + "13b64b55c89b4d5a8c3956e6b4fa5ce8", + "df98408aa4784329ac6f6844d4645742", + "13be7a9e4ac447a984e0ec938ba3b132", + "2fec21701d2d4834b17b120b47495b01", + "41fa426d84d14762b074d103c433425c", + "f33ecdfc71df4ed995f8c59e70231f99", + "166788b33ec140b9bf6891b3f8797d32", + "50b8bfa175444793a272bf0c34a618ba", + "6106b9226019481c8304fcde0e63a202", + "66bd8a471c3c45ad816e79c7db7c35de", + "eaa96ec7f3f6458b96ff978ebbb52157", + "468f884d5cf249ab9878cd83cec045ed", + "f962be9fcfbd45d68cbc85d07a7dbf49", + "72a068171fcc44b08e4300bbeba2dd9a", + "547946b574294a5fac045a78e815c747", + "8d1ee977e12343518eb1f3638b3a8d68", + "b3c16289906d427f8e5aa58a96e0dcb8", + "674ef45d923045b29c5284159016420d", + "6e92cd364ab64a3d859d8dff72db10b7", + "fd905497be90433b93f3a3891b574dc1", + "3435de8896dd45e8b680ddbc9cd4f8a1", + "9a29111183184f4693ba5de7c6cbea94", + "bc5080cb96a24b2cb5b85813fa77e12e", + "3251321b00714f8680e455a191fbc9ca", + "b9d725a2bf8043988d75cd9abce113f4", + "3c359db366174498b4cd240b5414dd7f", + "51669199bff44a3b85d90665f409832e", + "3404f6f821b648bea27397e9ca4fd568", + "19cc5abdec474fa48b076e411d1af943", + "c48dcb96532f4553941801dc714d4735", + "117258bc0cdd4e3198e173476200435c", + "feae4123dd8b4300bc3f08125c6b1948", + "8b9b116ea4cb43b99a207e689e56ba4f", + "e1a8289ca5144d9fb0999590bd5e79e2", + "e00d9fd453034c02b9b06b29ae65e4f8", + "cbf9a18ad6b44b6380122311380a967c", + "e07bea8e56624fc4be74f789b2861a21", + "a34abcdf62da4d96a91bf30515d86ba0", + "1b21483222ba416fa8f456a87782af73", + "524fc16894714aa098982b707219f360", + "2b51fccadb1544deb4212f8f2dc6ae36", + "4d662f31c2b44e6aad5c07e2eec2fd08", + "7baa37345df5472380aa3a20f4d515b0", + "626067a3ea2e489e930357298bf4edec", + "baf7d82752fe4afc94bdef0ff90449ad", + "0bebb09292e9421295fda7ca8da23b28", + "bc28ca7097de4a2cbc46f0d42ebb5e70", + "8c60047983b84f4982da13b69511959d", + "be4bdcc280c24bf08f50f0581cc43e45", + "1efb02f06f594569862225631367274f", + "b0fccc4a75414c6fbee773f7fa20edb8", + "293a945ce7a849cd858b9dfd93d07638", + "b2d0417743e746e490ccffc502c65e33", + "6e55c115dc02444a9592166ffb1a3494", + "822ef578aeb4482ca09f2c3884014cf5", + "e8ffe3de6ca54df484958a9cf13d3252", + "79f86fee27cd4dc9b55eba51e2dafd8e", + "b9733d27c6df42e0a7cf1e410962ad07", + "3adde1e02cf543c2ab97c1c945b4c896", + "60c0822e465f46b49848030e0619ae27", + "4b40e778bae6427198289a348c0e839e", + "0f00a93e2586456590762cc71a364704", + "fa7ff58db3644e2fa695ca889534222b", + "2a94537b83ac4a99b31a9ba42f820fe7", + "aec0c015057f4fdebc72b4aaf1e6ec71", + "9c61a20668c347eea6bad88f2819330f", + "442a99e054d54b4f8511673eebad2d7f", + "2af3f7ec723042b28fbf060b2ba9c02b", + "4edc3548d1364b69a33be523b24165a7", + "dd94806e23ab40bbbc4b65fa95478a35", + "12272021c2234ace8b0825fc4011a919", + "b3536c933c604fb889c0a6629ce0a43b", + "165d809cf2694bfa89202ef2fed621ea", + "261b218116a74baab4f1b430204bcd84", + "323778f9289f4992be97b592769a7eb3", + "57feb1626025410f9fb518707724f0f1", + "e0d925454000435782fb9a46654a1dc0", + "e1c5e4bd40fb4197812204b9f90233d9", + "1c2da3c953d64f2f8f0d52d53ef9a76e", + "e3fdc27e03254b4c85a334cb8257203d", + "51acdd35dd534dc696c7b6942f5eb4d0", + "670fd15bfad64fac9bdea338e118c613", + "f968728971b14f83bc635efccf191073", + "5142d3a0327f41c29d6e1dce42de2d49", + "dbd0b779711d42b893ed6427a0e200cd", + "417a972906784467af59f5880aca329b", + "444e17ff24bb4034a1687413ce81c706", + "378472c5ac2b4266bea077c384330e28", + "6a894f5f3ada42c1b04502b50f7cc7e1", + "33f4347b60084c2bbc2954a1a4244d14", + "89ab9598547e4d82839d9c5c35448832", + "29d183cbb8eb4f2a80624bf9cf258d4c", + "51e6dbea5ba34115a7ef056880ce2773", + "3d6d28ee166248e6964291bd5ac8fbc6" + ] + }, + "outputId": "43a2c43f-b70f-456a-8f98-dd8019420850" + }, + "source": [ + "# Using the Lightning trainer and specifing the requied parameters as arguments\n", + "myTrainer=pl.Trainer(gpus=1,max_nb_epochs=10,checkpoint_callback=False)\n", + "\n", + "myModel=smallAndSmartModel()\n", + "\n", + "# Begin Training\n", + "myTrainer.fit(myModel)" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "text": [ + "GPU available: True, used: True\n", + "No environment variable for node rank defined. Set as 0.\n", + "CUDA_VISIBLE_DEVICES: [0]\n", + "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:44: UserWarning: nn.init.xavier_uniform is now deprecated in favor of nn.init.xavier_uniform_.\n", + "\n", + " | Name | Type | Params\n", + "--------------------------------------\n", + "0 | layer1 | Sequential | 320 \n", + "1 | layer1.0 | Conv2d | 320 \n", + "2 | layer1.1 | ReLU | 0 \n", + "3 | layer1.2 | MaxPool2d | 0 \n", + "4 | layer1.3 | Dropout | 0 \n", + "5 | layer2 | Sequential | 18 K \n", + "6 | layer2.0 | Conv2d | 18 K \n", + "7 | layer2.1 | ReLU | 0 \n", + "8 | layer2.2 | MaxPool2d | 0 \n", + "9 | layer2.3 | Dropout | 0 \n", + "10 | layer3 | Sequential | 73 K \n", + "11 | layer3.0 | Conv2d | 73 K \n", + "12 | layer3.1 | ReLU | 0 \n", + "13 | layer3.2 | MaxPool2d | 0 \n", + "14 | layer3.3 | Dropout | 0 \n", + "15 | fc1 | Linear | 1 M \n", + "16 | layer4 | Sequential | 1 M \n", + "17 | layer4.1 | ReLU | 0 \n", + "18 | layer4.2 | Dropout | 0 \n", + "19 | dense1_bn | BatchNorm1d | 1 K \n", + "20 | fc2 | Linear | 6 K \n", + "21 | dense2_bn | BatchNorm1d | 20 \n" + ], + "name": "stderr" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "06add6832ae94410861e93402a4407ce", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validation sanity check', layout=Layout…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 2.302561044692993\n", + "Number of Correctly identified Validation Images 23 from aset of 256. \n", + "Accuracy= 0.08984375 \n", + "\r" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "166788b33ec140b9bf6891b3f8797d32", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Training', layout=Layout(flex='2'), max…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "547946b574294a5fac045a78e815c747", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.7407737970352173\n", + "Number of Correctly identified Validation Images 4830 from aset of 5000. \n", + "Accuracy= 0.966 \n", + "Loss train= 1.8832314014434814\n", + "Number of Correctly identified Training Set Images 45182 from a set of 55000. \n", + "Accuracy= 0.821490909090909 \n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bc5080cb96a24b2cb5b85813fa77e12e", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.6396793127059937\n", + "Number of Correctly identified Validation Images 4899 from aset of 5000. \n", + "Accuracy= 0.9798 \n", + "Loss train= 1.7029248476028442\n", + "Number of Correctly identified Training Set Images 52054 from a set of 55000. \n", + "Accuracy= 0.9464363636363636 \n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "117258bc0cdd4e3198e173476200435c", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.5858315229415894\n", + "Number of Correctly identified Validation Images 4923 from aset of 5000. \n", + "Accuracy= 0.9846 \n", + "Loss train= 1.6400469541549683\n", + "Number of Correctly identified Training Set Images 52792 from a set of 55000. \n", + "Accuracy= 0.9598545454545454 \n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1b21483222ba416fa8f456a87782af73", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.559800386428833\n", + "Number of Correctly identified Validation Images 4930 from aset of 5000. \n", + "Accuracy= 0.986 \n", + "Loss train= 1.6016995906829834\n", + "Number of Correctly identified Training Set Images 53187 from a set of 55000. \n", + "Accuracy= 0.9670363636363636 \n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bc28ca7097de4a2cbc46f0d42ebb5e70", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.5370867252349854\n", + "Number of Correctly identified Validation Images 4944 from aset of 5000. \n", + "Accuracy= 0.9888 \n", + "Loss train= 1.5763448476791382\n", + "Number of Correctly identified Training Set Images 53364 from a set of 55000. \n", + "Accuracy= 0.9702545454545455 \n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "822ef578aeb4482ca09f2c3884014cf5", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.5241750478744507\n", + "Number of Correctly identified Validation Images 4947 from aset of 5000. \n", + "Accuracy= 0.9894 \n", + "Loss train= 1.5586891174316406\n", + "Number of Correctly identified Training Set Images 53491 from a set of 55000. \n", + "Accuracy= 0.9725636363636364 \n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fa7ff58db3644e2fa695ca889534222b", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.5118769407272339\n", + "Number of Correctly identified Validation Images 4953 from aset of 5000. \n", + "Accuracy= 0.9906 \n", + "Loss train= 1.5447603464126587\n", + "Number of Correctly identified Training Set Images 53618 from a set of 55000. \n", + "Accuracy= 0.9748727272727272 \n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "12272021c2234ace8b0825fc4011a919", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.5051761865615845\n", + "Number of Correctly identified Validation Images 4960 from aset of 5000. \n", + "Accuracy= 0.992 \n", + "Loss train= 1.5337687730789185\n", + "Number of Correctly identified Training Set Images 53743 from a set of 55000. \n", + "Accuracy= 0.9771454545454545 \n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1c2da3c953d64f2f8f0d52d53ef9a76e", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.4986270666122437\n", + "Number of Correctly identified Validation Images 4956 from aset of 5000. \n", + "Accuracy= 0.9912 \n", + "Loss train= 1.5260114669799805\n", + "Number of Correctly identified Training Set Images 53755 from a set of 55000. \n", + "Accuracy= 0.9773636363636363 \n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "444e17ff24bb4034a1687413ce81c706", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.492732286453247\n", + "Number of Correctly identified Validation Images 4961 from aset of 5000. \n", + "Accuracy= 0.9922 \n", + "Loss train= 1.519001841545105\n", + "Number of Correctly identified Training Set Images 53878 from a set of 55000. \n", + "Accuracy= 0.9796 \n", + "\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "1" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 5 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iK1T1xr0TkUf", + "colab_type": "text" + }, + "source": [ + "## View in TensorBoard\n", + "While Using Default Logger location for TensorBoard logs is `lightning_logs/`\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "dHxHk0AFTjBY", + "colab_type": "code", + "colab": { + "resources": { + "https://localhost:6006/": { + "data": "PCFkb2N0eXBlIGh0bWw+PCEtLQpAbGljZW5zZQpDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLT48aHRtbCBsYW5nPSJlbiI+PG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDx0aXRsZT5UZW5zb3JCb2FyZDwvdGl0bGU+CiAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQU1RQUFBREVDQVlBQUFEQXBvNXJBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQmFiZ0FBV200QnhXc2pPQUFBQUJsMFJWaDBVMjltZEhkaGNtVUFkM2QzTG1sdWEzTmpZWEJsTG05eVo1dnVQQm9BQUJsMFNVUkJWSGljN1oxNWVGVFYzY2MvdjVzRkNWUnhxVnRwdFZXMlZseGY2MXF0aXEwTDlHbDlOWFVCRkVwRlJUSWhoQkFEQ1RkQU1BRWtDWXNLN3FCOStrRDcycWZCV2l2cVc3VmE2NzRpcmU5cmF4WDFiWlZXWlRITC9ONC81ZzRHU0dEdXpMMXo3NTA1bjM4NHpNdzU1OHZNL1hLMjN6a0hESUdqaXpoUEYzRmUwRG9NSUVFTHlHZDBQb093YUFBdWNWNWFoMFc1VlBCNmtMcnlHV09JQUZDYi92U2pFcWdHK3V6d0t3Z2R3QzEwVUNmVi9Ec1loZm1MTVVRV1VSdUxFa1lEOHhFTzJ2N0dqb1p3UHN4SFdNeGhJRXVsbEs1czZzeG5qQ0d5aEM3Z0pKUlc0Q1NnWnhQMG5INEppNWlVODdqZkdnM0dFTDZqVFF3RTVnR2prVzdmZCtxR1NMS1dJc3BrTW0vN0lOUGdZQXpoRTJwVFFoK3FzS2dDK2dMdVRiQnJlaXV3bUhZYVpEcWZlaXJZQUJoRGVJNHFRaU1YQXdzUUR2UEFCRDJsTnlMVXM0bmJ4U2FldVdwREVtTUlEOUViT1FGb1JUaHQrNHYrR0NMNTU3TkF1Y1I0S2kzQmhsMHdodkFBYmVBUUxHeGdBbUQ1YW9MdTZjU2ZpdkFMbEVxSjhZNUw2WWFkTUliSUFMVXBwb2hyRVdZajdMMzlqZXdhSXBuZWpMS1F2V21VY1d4TDZSOWcyQVZqaURUUnVZekNvZ1g0QnBBOUUzUlA5L3orMzRHWlVzYktYcVFiZG9NeGhFdTBnYU1SbWxITzl2QUIvNk9UT3RrRFF5VFN5aU1vNVJManRaNytIWWFlc1lJV0VCWFVaaitkU3l2d1BNclpIaFc3RVdFaW4zRWFVemtWb1JUNG15Y2xDK2RnOGJJdVphWGV3b0dlbEprSG1CWmlENmhOSVVXTVIya0FEdkNvVmRpS3NKajRydXNKdXB3U1BxTUtxRUtjOVl2ZXlrbTl6azFBRXdmU0xLVzBZK2dWWTRqZG9QV2NnMFVMd2xIYlg4emNFR3NSeW1UYTdsZWN0WW1CRkRrcjNPeXd4cDJPSVpMcERRaFQ1VG9lMkYzZCtZd3hSQS9vSEFaQnQ3QnNiMXFGRnltZ1hDcmR4U1RwSXM0RVdoQ08zYVhNOUxXc280Q1lYTU1iYnJUa0E4WVEzVkNiL2dpVnlFNWgyWmtaNGlPRU9SeWVmdFNxMmxnTVlEVEtmT0FnajNSMW9OeENJWFV5MFlTWkp6R0d3SG5nTE9lQjZ5a3NPNzBITC9IQWlYZjdHblFaL1dudndiRHBhd1NjTVBQOVRKZzVHRU9nczFNSXkzYi9zSzBqVGt4cS9PbVNhQ3VEVUJxUTdUdnR2T2pXdlloUUx0ZmtkNWg1M2hwQ2JSZGgyYWsvVkJ0UUtxU0czM2dxdGhlMGxYT0FGdUFvRDlkRTFsSkFtZncwUDhQTTg4NFFhbE1DenJSbXFtSFplMzZRTmlFMDhUbk5ZbWQzV2xOdEN0bVg4WWd6TGR5N1JqZnBSSmg1RVEzeWsvd0tNODhiUXlnSWRWeU14UUxVWlZoMjcrOTNvdHlKTUZOcStJZlhtdDJnaTlpUFFtWUIxeUVVYm44ak0zTzhoMUxEUkZhSm9KNEtEaWw1WVFpdDVRUWtnN0Rzbmw5N0ZJdHlxZVpWVDhWbWlDNWhLRW96NGh4cjQwMVg2bG1VbUZ6RDB4NUtEU1U1YlFpdDRSQ0tzTkVNdzdKM2ZPMHRsQnFaeVJxUDVYcUtMbVlVUWd2aUJCOUNwdVpRNEY0NnFKSkpmT0NwMkJDUms0WlFtMkk2UFF6TFR2eVpDSy9laHh1bGpNODlsdXdMYWxQTS9zNzNBSHQ3MUZwc1JsaElZVzZHbWVlY0lYU0c1MkhaY1lUN0VLYkpERDcwVm0xMjBPVWNRZ2MyNHJTVTRNWDM4aFpDalV3SWQwdnBscHd4aE43QVVBcG9Cczd6Y0FyeUdaU1kxUEdNaDFJRFEyOTJ0cmdxcDNuMkhWazhTcHdwOGxOZThWQnFZRVRlRUdxekh4M01RcmdPbk5tVnpIL3NkNEVaMU9iZTdJb3F3aTNPSVFod0dPREY5OVdKT0xOdDQ0T2RiY3VVeUJwQ2JRcnBZRHg0R3BhOUJWakFsMmlTQ3JaNktEZDA2SEpLNktRS1NTSE1QTlcweFNiaU5MRjNkTVBNSTJrSXJYRldhTDBMeTFiZ0Z4UXdUV1o2dEVFbkl1amlGTUxNM2FZVFllWVZNaTQ3Sy9aZUVpbEQ2RXdHRWZjOExQczVMTXFsamo5NHB6UjY2TTJjNlV4RzdCcG03amI5eFd2cktLUk14ckxlTzZYK0VnbERxTzFFZVNyVkNIMjJ2NUdaSVRZQzlXQU8rMHFpTmhZSE80Y3hkdzh6aDB6V2JSSlJ2eDNSQ0RNUHRTSFV4bUlybzdHY0h3aThhQlhhZ1ZzcFlhWTVEckpuZEJuOXNhakVjc0xNSVJOREpFbUVtZmNOZDVoNWFBMmhOM1FMeS9adUduVXRRa3hzL3RkRHFUbUwzc29neE9taVptNklaUG9GbEhJWnh4TmVhdldLMEJsQ3F4aUkxVzJRQjE2MENpK2hsTXNjZnUrcDJEeEJWekRDaVk5S1RHSmtab2hrZWkxeEpzczQvdXFsMWt3SmpTSFVwb1F0empRZzlQV29WVWhzMzF6UFVsa1QzbVk2Q3FoTklWOXhUaDhSSjh3Y01qRUVKS2E1bDlDWHVWTEtaOTRxVG8vQURhRWdUT05peEZrb2N2K2w5cFJPWEV2VlRwMDBoWDhnRnlYMGR2WkRtUVZNQWdveU5FUXkvUjVDRGFPRFh3Z04xQkE2bFJPd2VnbkxUdDhRNnhES1pZNjV1TkJQOURhR0FZdVFicmVuWnY3Yi9RbUxtSXplZnBKaDFnbkVFRnJ1aEdYdjdyUnM5MS9xQnVKTWxYbm16S0Zzb3JjekNweGdTbTlhZDBXY01QTngyUTh6ejZvaG5PN1JOSlJhaFA0OXFuRC9wWDRNMUZQRXpXTFQ2YTFpUXlyb1hleEZuQXJnQnFDL1IrTy9UN0NZUXhHTHN4a0drdlVXUWlzNHpqa043NHdlVmFSdWlFUllkaEdWWXZOL2ZtZzF1RU9YY3dpRlBvV1pYNUdkTVBQQXhoQmF5U2lFVnVEcnJnMmhQSW93UmVibFJzaHhycUYzY3dKZHp0alF1eldrUjFIS1piUy9XM2FESFZUYkZMT1pheEhtQUYvYVFWSFBYOHhiV05SSVEyNXRTc2xGVkJIdTlpSE1ITzZraUpsUzZrK1llZURUcmdCYXhhSEFMR0FDMG1OVG05aTJXRXlqMkxtM2JUR1gwZVdVVUp6aWFlYXBwemVoMUhNb3krUXNiOGVOb1RCRUVxM2lQNXh1MUttT3NzVEc5aTZxWkVIdWJtelBCL1EyQmxMTVBOVERNSE40RTRzS3VaUUh2ZElaS2tPQU14TTFuVEVJRjJOaHl6eGVDRnFUd1R2MExyN3JoSmtmcy8zRnpNMXhQM0VxNVlyTVk5UkNad2hEN3FNMkZvYzdZZWFTUVpqNWp1a09MRzZoZzFvWnpTZnBhak9HTUFTR3JxWS9XN3VkWmc2WnR4YkMreWcyRm5la0UyWnVER0VJSEwyUFFYU2xFV2ErdXpROGowVzVsUEtrR3kzR0VJYlFvUGR3UHNJaWhLRkFwb2FBeEtYMkUrVEgzSm1xQnRlM2tHbzVFN1NjSDdyTlp6RHNDYm1TQjluSzBjQkU0SjllRkFrYzZpYUQrMnQ1bFNOUjd0Y1k2L1I2eDhrR2cwZklSRHBrREN2b3d4QmdNV1IzSDBzNmhpaHlVdWRRd0NzYW8xV3Y2eGFvWnpCNGdKVHlzWXdtUnB6aHdHK3pWYTk3UTFqYkRRRlFCSlJSeEhxTk1kWXpWUWFEZzR4bHZZem1mSVFmZ1A5NzRUTnBJYm96RUxoSHkzallkS01NZmlDWDAwWVJ3NEJ5U0grZFlVKzROd1E5R2lLQk1JSUNYdFlwTktyTlh1bkxNaGgyUlVwcGx5dG9SUmdHL3B5bDVhMGhFaFNqVE9kZnZLNHhScVlqeW1EWUhYSVpHOEdmdmRkK0dDTEpOeERhZEFwdFdzblgwNmpIWU1nNlhvMGhkc2RJdW5oZEs3Qk5OOG9RZGpLZFpVcVZ2aWl6K0lUWHRKSUwwOGh2TUdTRmJMUVEzVG1DT0d1MWdqWXQ1L0FNeWpFWWZNSFBNY1R1R0VrQmIyaWw2VVlad2tWUWhvQmtOK3BUWHRWcFhPQlJtUVpEUmdScGlDUkhvanlnVTJuVGF0T05NZ1JMdHNjUXZTT01wSlBYdFFwYkozZTdGTVZneUNMdURTRStHU0pCQ2Nvcyt2Q2FUdXQyWnFqQmtDWEMwR1hhRmVGSTRFR3RvazJuT21mNkdBeFpJSnlHK0lMRWJKVHBSaG15Uk5nTkFWQUN6S0tFVjNVNjM4OXkzWVk4SXdxR1NESUkrSzFXMDZiVCtWcEFHZ3c1VHBRTWtVQVppYkJlcTdIVnBqaFFMWWFjSTNxR1NKRG9SbTNqVmEzbWUwR0xNZVFPVVRWRWtzRUlEK2tOdE9rTXZocTBHRVAwaWJvaGtvd2t6bnF0TWQwb1EyYmtpaUVBK2dHemFPY1ZyZUhjb01VWW9va3JRMmppNEtkQ243UjR4UkRnZHpyRGRLTU03bkhYUWx3ZGVqTjBaeVN3WG1lYWJsUmVFM2QzR0lIYkxsTll1MHU5MFE5bEZsMjhyRE1aRWJRWVExYlpqRkxQTmhhNXllVE9FUHRHemhBSmxLSEE3M1FtSzdXR2c0S1dZL0FWQlZiUndTQzVERnZHdWJ1Q3paMGhPaU5xaUFRQ2pLR0FEVHFUbU5xUjZ2NFpVa0g1RXhhbnlhV01sVEc4bjA0UjdnelJGV2xESk5rSG9ZVXVudE5hVGd0YWpNRVQza1c0a2tzNVdVcDVPcE9DM0JuQ3I4MUJ3WEFNd2hOYVo3cFJrVVhaQXRSVHdHQzVsSlVpbVI5ZTVzNFE4Wnd5QkNTN1VZVzhxWFhFOUJJS2doWmtTQkZoRlVVTWxzdXdwWlN0M2hYckFyMmVvUlN3M2xXcDBVcS9oREJKYko3Q2tKZTRheUdLY3E2RjJKbGpnU2ZWWnFYYUhCaTBHRVAyeWVjeFJNK28wNDJDRFZwUFRGZWJibFErWVF6Uk93TlFXbGpQc3pxYlU0SVdZOGdPdWI1UzdRWEhvZnhCNjFtcDgvaHkwR0lNL21KYWlOUklkS002MmFCelREY3FsM0ZuQ01uN0lMbDlVVnJZd0o5MExpY0hMY2JnUGFiTGxBN0s4U2hQNlJ6VGpjbzFUSmNwZlJMZHFDN1RqY29sVEF1Uk9mc2l0UEFYbnRIWm5CUzBHRU5tdURORWVyY0g1UWZLQ1ZnOHBYTlpxVFlIQkMzSGtCNm1oZkFXQzJFTVJXelFCbUpxcDdWblBWUm9Nd09DMXBBSnVwcUQzWHplN1ErMjV6MEVycUtqY3BiOWdCYUtlVkliT1Nab01lbWdTemhVbDdLY1l1WUVyU1VkZEJWRDlHYzhRQWRUM2VSek82aDJOKzFxekhFS1NsblFJdHlnTnNXNmhCZ1dieUpjVFhvbnN3U0czc2UrZWgrTldMd0M3bSttY3JkclRDbEsreUhmTWQ5bTRER2dqUzZlb0lqSDBCemRreENuUFdnSnFhTExHSVhTQ3RHN1YxeHRMSTVnTkxBQTBnL01kTHVOTXBNeHhOc29Ed05yMlllSHhQN2lRZEZLS29EN01pZzd2QWdkUVV2WUU3cU1ZNG5UZ25KbTBGclNRZS9qTE9LMElCeWRhVm51REdGUjVHSlBVaGVKL1FWckVkcmtKcDd2N1lPeWtKOXBKWmRERHQ1aExlRnRJWFFwK3dOMXhKa0UwVnRIMFpWOERZdTVLR084NnA2Nzd6THRuczJJMHhVcTVOZXlnQTljS0xtZUxyNUw0Z1MrM0VIRDEwTG9jb3BvNXpyaTFDUHNFN1FldCtoSytpRk1BNmFqN09YbFdOV0xMdFBiQ0E4anUzYUYzQ0NOL0ZXcmFFQ1psM2doblZKQ1NNZ01vWXNad2VlMEFOOEtXb3RiVkJIdVpReEtFN2liVGsyVmRBenhSVmNvVHBzczdyMHI1Sm9TRnJDWlVoSTcxM0lES3h5RzBLVU1wb3RGS0JkRzhUOGJ2WXNUV1VVcitMczN4WjBodXJpYkl1WkxNeC83SVVac09yV1M2eENlcFB0MFgyLzdvS05Cb0dNSWJXWUFRalZkVElIb1JTdnJQWHdGdUJFWVRSWitmVmVHa0tXODZaZVE3WFVzNUdtZHhuTGdXci9yeWdvQmRablV4bUpBNXRPUVFhR3I2Y3RXeW9BWndKZXlWVzg0RjEyMlVZM3czaDQvRjRYV0lvQlpKcjJKczlpSEY0QjdpS0laN21JVVczZ0RwWkVzbWdGQ2FnaFp3aWRBaGJ0TS9takptQ3kyRUhvVFg5Vm1WbUx4S0VRdlpFVHY1SGk5aThjUmZnMGNIb1NHMEo1dktrMnMxbW1NUmhqbFByTVBndElsQzRiUUJmVERZaHJDZEdBdnYrdnpHcjJIL2VtaURnbCtQU1MwaGdEQTRucVVzNEQrYVpjUnZEbDg2ektwSWl6aVlvU0ZFTDJyaW5VNVJSUnpIVjNoV1E4SlpaY3BpVFR4RGtLOWR3VjZWbExxK0RUdHFnczVrVVU4Q2F3bWltYTRreEVVOFJKS0M0VERESkJsUTZoTm9icDlMUHZTQXJ6b3VaanNtR01UeXF0ZUZxaE5IS29MV1k3d1IrQlVMOHZPQm5vSFEvUjJIbkRpMnI0WnRKNmQ4ZDBRT3BrK09vVVJXa0Vybi9BdVU3aktUWDZ4NlVTNW1zU0NvRC80WVE3bEF5ek9raHJlOEt6SWhWeEVBWCtHNklWbEEranRqQWRlUTl5SFpXY0xYNzVVblVKZm5jSW9uY0pLQ3ZrUWVCZ29BdzVDYU5ZcUJyb3BUK2J6SEhDekgxcDNyY3lUVXQ2bWdPOUlOUzk3VXRvWEhFTzBZNzJHRWZKeHEyZml0SndCS09jaWpFTDVFZEMvbDRkckg3cTRCVnpPSGlrekVINEU3c3lVRWVtWjR6VUsrYjVNWjZQSGFneFpJS01XUWlleHY4WVlxekhhVUQ0a01jQWJ3NTVuaFVacUJUOTJVNWZNNTFNazlMdlBIcWVBMDQwWm9vdHJRK2hrQm1vWlYydU1OZ3A1bjhScTZFamN4c2tJUzdYUzNTcXFOSEkveXE5YzFlTVZlMjR0MWxMQ2VWTE52N09neHVBVDdpNXVMK2NpTE41QldFN0NCSm5zb0R1QU9NMnVjeW1USU9DSGJtZHpLUGZ5WlM2U0N1OXVzakVFZzlzcnRmcmg1WnlNY0xsTzVZZXVzc3huSThvc3p6Umtpc1VTdXJoU0pvWWp6TnVRR2NGUDNRazNhelg3dXNyVGx5WEFILzBSbERJSzFNc015c1FtSHJBV2cwY0Vid2c0aEU2YTNHUVFtemdXRXlHdy81VzdVSzZSV3V5QTZqZjRSQmdNQVRCQnAvRTlOeGxrSHE4QVMzelNzenZhRVM2VE9sWUVVTGZCWjhKaUNDSE9jclZkQnZIMW9SWjQyeDlKUGJJWllaVE1aRTBXNnpSa2tiQVlBb1REMmN4Y1YxbHN0amdodzluZ1l5eEdTQzIveTFKOWhnQUlqeUVTVE5icG5PNG1nOHpqUWVBWFB1bEo4ZzdDcVRJejhJRzh3V2ZDWmdpTE9MZXI3WEtUU3llVGdYLzVJNG4xRkhDNjFMTEJwL0lOSVNKc2hnQVl3bVpxM1dSd0RrU2I2WU9XNXlqaVRKbkozOU10UUJzNHlrdEJCbjhKb3lFQXFyU2FFMXpsS09ZVzRDa1BOVHpHWHB3dE5md2ozUUwwUnFZalZIcW95ZUF6WVRWRUlYSHUwS3RURHcwUm16Z0ZYSU0zYXhPL0FpNlE2WHlhYmdIYXdHem4xQWhEaEFpcklRQ09ZUUJWYmpMSUhGNUYwb2lQMnBHN2dVdkVabHM2bVZVUmJhQUZjZGZ0TTRTRE1Cc0NvRmFudXp5RGRBczI4RDlwMVNZMGljMDRzZWxNSjd1dXBvQjUzQTdFMHFyZkVEaGhOMFFmNEE2OUpQV2pTYVNaclU1RWJPb0lpbElwTnRWdUJTYlIxUlR3Wis0Q3hxZGJoaUY0d200SVVFN2k2MHgyazBYbThSREN6MVA4ZUJjd1FXWnprM3R4Q2RTbW1EK3pCbUZNdW1VWXdrSDREUUVnTkdnMVI3cktFNmNjMkxTSFQzMU9Zcnh3WjdyUzFLYUVRdHFBSDZWYmhpRThSTU1RVUlKeW01c2piR1FlSDhKdXUwRC93bUtFek9iK2RFWHBBdm81Wm5BVm1HZ0lMMUV4Qk1CM3FlYW5ybkkwY0J2d1pBL3ZKSTZJc1h0OEx5WFVaZ0RiV0FlY25XNFpodkFSSlVPQXNrQm44TlZVUHk2SlRUd1RTSFNOa2lTT2lMRjVLVzBaTmdkU3dIOERKNmRiaGlHY1JNc1FzRGRkM09vbWc4eGxBN0RRK2V2cnhQbU8yTHlWcmdDMU9aZ0NIaUdDcDJzYjlrelVEQUZ3Z1Zaemhhc2NoY3hGdVpzQ1RwZUdGTzZkNkFXZHkyRllQQUVtUGlsWENmVXBhcnVoVld0WTV3eWM5NGl6Nmp3dWt3clZaakJ4MWtIcVhUWkQ5SWhpQ3dHd1A4cmliRldtY3hpR3hXTVlNK1E4VVRVRUtLVjZBeGY1WG8zTjhjUjVIRGpVNzdvTXdSTmRReVJZcGpiNytWVzR6dVpFaEllQkEveXF3eEF1b202SWc5bVdmc2pGN3REWm5JbnlDUGhuT0VQNGlMb2hRTGhLcXpuUHl5SzFudk9KOHlCWnZnSFRFRHpSTndTQXNGeXJ2SGw0MWVZSEtQY0RmYjBvenhBdGNzTVE4RFVLdVRIVFFyU095NEJma2dnN04rUWh1V0lJZ0d0MUJtZWttMWx0cmthNGwraXV6Umc4SUpjTVlhSGNwbFBjZDNXMGprbkFyZVRXOTJGSWcxeDdBQVpUNHU0QVlxMWpPc0pTTkFRM1doc0NKOWNNQWNwVXJlWEVsRDQ2aTNvd0oyUGtNRytnL05KTkJuZUc2T0p4SlBSbm14WVE1dzYxZTcvaVMwRjBGcTBvZGRrVVpzZ2FtNEJxQ2psT1JyczdmdFRWQUZLVzhUZmcrenFGRWNScEFaY25ZbVNQNGJSekExQy84eHRxWTlISkNwU2ZCS0RMNEM5eDRENkttQ3FsNlIwd2wxYVhTWnBaeDFhT1F5a242UHZlZWtPbzBWcUdkMzlKTDZHQVR1NUVqQmx5RHVGUkxJNlRLeGlicmhrZ2d6R0VyS0JERnROS0owY0FpMG1jWGhFbWlvbHpqOXFKVmxCdGlobkthb1FyZ3habThKUzNFRXJsQ3M2Unkza2wwOEl5SGxUTE1qNlNWbUlJdzRHSE1pM1BZNDZqZzNLZFRCODZXUVArUjhjYXNzWm1vSjVPaHNzVjNsMWc0OWtpbExTd0hqaFBZMXlDTUI4NDNLdXlNMEtZelQ1Y0JKd1N0QlNESnlod0w1MVV5VGcrOExwd3o2ZGRwWlUxREdBSVFqbndpZGZscDBGZmpCbHloV2RSVHBPeGpQWERET0RUT29UWXRFc3pyUlF4REZnQjV0cGFRMGE4aDNJbFl6aEpydVJwUHl2eWRXRk81ck5SbXBrSW5BVDh3Yys2RERuSlZxQ0p2Z3lWcTFncGd2cGRZVllDMmFTWjV4UytRd1VYQXd1QXc3SlJyeUhTckVXWkxGZngxMnhXbXJYUURRR1ZSYXpoTTc2SlVFL0MvUWJEenJ5QWNvWmN4U2dabDEwelFBQ3hUTEtDTGJJUW13SUdBNnZBLzJiUUVBaytBc3JweDdkbEhFOEVKU0t3NEQ2Wno3dHlFMk9CVXhCejNXMGUwd0VzcHAwalpCeXRVaHJzQW0vZzBhNnlrR2ZveDJuT0NuSktCNDhaY29aMXdMRXlucGhNREVjSVVPQ0dnTVNGaWJLQWxTaEhPT09Mei9lWXlSQmxObUJ4b1l6blhCblBHMEdMNlU0b0RKRkVGckpaNW1OVHdGR0lkOHZ4aHREd01jcGsvczVSTW83ZkJDMm1KMEs1ZjFnYWVRc28xV3JPZHNMTWgrOHBqeUg4eUlUTUQ0THdtMUMxRURzampUeEtDY2NqVElUMFEzb05obFFKdFNFQXhLWlRHbG1CTUFTbENXZ1BXcE1oZHdtOUlaSklJNXRrUHRYRU9SckMyZjgwUkovSUdDS0p6R2VETkhJaGNDNkVhNGJDRUgwaVo0Z2swc2c2UHVKWUo4dzhGSFBZaHVnVFdVT0FzNDExSHEzQUVjNEZLbUhieG1xSUdKRTJSQks1a1kva1JtTEVPUkY0UEdnOWh1aVNFNFpJSW8yOEtQTTRFL2dCOEhiUWVnelJJNmNNa1VRYWFHTUwzMEtwQmo0TldvOGhPdVNrSVFDa21hMHlqeVlLR1lxYWJheUcxTWhaUXlRUm00M1N3RVNVa3hDZUNscFB4UGd2NHRzdnZjOExjdDRRU2FTQjU1ak42UWlsd0R0QjZ3azVid0xueXlUK1V5Ym4xMWdzYnd3QnpqYlcyYXloZ0dFa3puM2RGclNta1BFeFNqbi9aTGhNNHJkQml3bUN2REpFRXJIWklyT3hzUmdFckNJTHB6bUVuRTVnQlVVTWtjbTBpazFuMElLQ0lpOE5rVVJzM3BYWmpLV0xzNENYZ3RZVENNb2p4RGxPSmpOUkp2TFBvT1VFVFY0Yklvbk00ZmNJSitUWk50YS9JSlJLR1NNa3htdEJpd2tMeGhBT1loTVhtNVhBa1pEVDIxZy9RNmtIaHN0a3N5dHhaNHdoZGtKc1BoTWJtd0tHUTA0OU1IRmdGY3FSRXNPV3NwdzFmRWFFY2d0cEdKQmEvZ0tVYWozbkFNMUVleHZyTXlneEtlZVpvSVdFSGROQzdBR1p4U01veDBNa3Q3RytDMXhKakZPTUdWTERHQ0lGeEtaVDZsaEJuS0VrYmtzSys3VGtGcUNlT0lPbFBEdUhCT2NLeGhBdUVKdVBwWTRZQlF4SGVUQm9QVDJnd0JxNitLWk13WllLYzM2dVc4d1lJZzJraGplQkMzUU9JMGkwR01NQ2xnVEM4MEJNcHBockJ6TEJ0QkFaSUxXczQ4c2NFL0J0ck84alRPVGZmTnVZSVhPTUlUSkVKdElodGJSaWNRU1MxVzJzN2NCaWloZ3FVMWdodGdsdjl3SmpDSStRR2o2U0dtTEF0OEgzNDl6WFlqRk1waEtUc2xEYzQ1Y3ptREdFeDhnTVhnRE8wTG1Nd3FMVjQrTGZSRGhicHZLWXgrVWFEUDZqTmlYYXlCbEI2ekNrenY4RFFkN1FyTWJMUjFBQUFBQUFTVVZPUks1Q1lJST0iPgogIDxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FZQUFBREFwbzVyQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUJhYmdBQVdtNEJ4V3NqT0FBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFCbDBTVVJCVkhpYzdaMTVlRlRWM2NjL3Y1c0ZDVlJ4cVZ0cHRWVzJWbHhmNjFxdGlxMEw5R2w5TlhVQkZFcEZSVEloaEJBRENUZEFNQUVrQ1lzSzdxQjkra0Q3MnFmQldpdnFXN1ZhNjc0aXJlOXJheFgxYlpWV1pUSEwvTjQvNWc0R1NHRHV6TDF6NzUwNW4zODR6TXc1NTh2TS9YSzIzemtIRElHaml6aFBGM0ZlMERvTUlFRUx5R2QwUG9Pd2FBQXVjVjVhaDBXNVZQQjZrTHJ5R1dPSUFGQ2IvdlNqRXFnRyt1endLd2dkd0MxMFVDZlYvRHNZaGZtTE1VUVdVUnVMRWtZRDh4RU8ydjdHam9ad1BzeEhXTXhoSUV1bGxLNXM2c3huakNHeWhDN2dKSlJXNENTZ1p4UDBuSDRKaTVpVTg3amZHZzNHRUw2alRRd0U1Z0dqa1c3ZmQrcUdTTEtXSXNwa01tLzdJTlBnWUF6aEUycFRRaCtxc0tnQytnTHVUYkJyZWl1d21IWWFaRHFmZWlyWUFCaERlSTRxUWlNWEF3c1FEdlBBQkQybE55TFVzNG5ieFNhZXVXcERFbU1JRDlFYk9RRm9SVGh0KzR2K0dDTDU1N05BdWNSNEtpM0JobDB3aHZBQWJlQVFMR3hnQW1ENWFvTHU2Y1NmaXZBTGxFcUo4WTVMNllhZE1JYklBTFVwcG9ockVXWWo3TDM5amV3YUlwbmVqTEtRdldtVWNXeEw2UjlnMkFWamlEVFJ1WXpDb2dYNEJwQTlFM1JQOS96KzM0R1pVc2JLWHFRYmRvTXhoRXUwZ2FNUm1sSE85dkFCLzZPVE90a0RReVRTeWlNbzVSTGp0WjcrSFlhZXNZSVdFQlhVWmorZFN5dndQTXJaSGhXN0VXRWluM0VhVXprVm9SVDRteWNsQytkZzhiSXVaYVhld29HZWxKa0htQlppRDZoTklVV01SMmtBRHZDb1ZkaUtzSmo0cnVzSnVwd1NQcU1LcUVLYzlZdmV5a205emsxQUV3ZlNMS1cwWStnVlk0amRvUFdjZzBVTHdsSGJYOHpjRUdzUnltVGE3bGVjdFltQkZEa3IzT3l3eHAyT0laTHBEUWhUNVRvZTJGM2QrWXd4UkEvb0hBWkJ0N0JzYjFxRkZ5bWdYQ3JkeFNUcElzNEVXaENPM2FYTTlMV3NvNENZWE1NYmJyVGtBOFlRM1ZDYi9naVZ5RTVoMlprWjRpT0VPUnllZnRTcTJsZ01ZRFRLZk9BZ2ozUjFvTnhDSVhVeTBZU1pKekdHd0huZ0xPZUI2eWtzTzcwSEwvSEFpWGY3R25RWi9XbnZ3YkRwYXdTY01QUDlUSmc1R0VPZ3MxTUl5M2Ivc0swalRreHEvT21TYUN1RFVCcVE3VHZ0dk9qV3ZZaFFMdGZrZDVoNTNocENiUmRoMmFrL1ZCdFFLcVNHMzNncXRoZTBsWE9BRnVBb0Q5ZEUxbEpBbWZ3MFA4UE04ODRRYWxNQ3pyUm1xbUhaZTM2UU5pRTA4VG5OWW1kM1dsTnRDdG1YOFlnekxkeTdSamZwUkpoNUVRM3lrL3dLTTg4YlF5Z0lkVnlNeFFMVVpWaDI3Kzkzb3R5Sk1GTnErSWZYbXQyZ2k5aVBRbVlCMXlFVWJuOGpNM084aDFMRFJGYUpvSjRLRGlsNVlRaXQ1UVFrZzdEc25sOTdGSXR5cWVaVlQ4Vm1pQzVoS0VvejRoeHI0MDFYNmxtVW1GekQweDVLRFNVNWJRaXQ0UkNLc05FTXc3SjNmTzB0bEJxWnlScVA1WHFLTG1ZVVFndmlCQjlDcHVaUTRGNDZxSkpKZk9DcDJCQ1JrNFpRbTJJNlBRekxUdnlaQ0svZWh4dWxqTTg5bHV3TGFsUE0vczczQUh0NzFGcHNSbGhJWVc2R21lZWNJWFNHNTJIWmNZVDdFS2JKREQ3MFZtMTIwT1VjUWdjMjRyU1U0TVgzOGhaQ2pVd0lkMHZwbHB3eGhON0FVQXBvQnM3emNBcnlHWlNZMVBHTWgxSURRMjkydHJncXAzbjJIVms4U3B3cDhsTmU4VkJxWUVUZUVHcXpIeDNNUXJnT25ObVZ6SC9zZDRFWjFPYmU3SW9xd2kzT0lRaHdHT0RGOTlXSk9MTnQ0NE9kYmN1VXlCcENiUXJwWUR4NEdwYTlCVmpBbDJpU0NyWjZLRGQwNkhKSzZLUUtTU0hNUE5XMHhTYmlOTEYzZE1QTUkya0lyWEZXYUwwTHkxYmdGeFF3VFdaNnRFRW5JdWppRk1MTTNhWVRZZVlWTWk0N0svWmVFaWxENkV3R0VmYzhMUHM1TE1xbGpqOTRwelI2Nk0yYzZVeEc3QnBtN2piOXhXdnJLS1JNeHJMZU82WCtFZ2xEcU8xRWVTclZDSDIydjVHWklUWUM5V0FPKzBxaU5oWUhPNGN4ZHc4emgweldiUkpSdngzUkNETVB0U0hVeG1Jcm83R2NId2k4YUJYYWdWc3BZYVk1RHJKbmRCbjlzYWpFY3NMTUlSTkRKRW1FbWZjTmQ1aDVhQTJoTjNRTHkvWnVHblV0UWt4cy90ZERxVG1MM3NvZ3hPbWlabTZJWlBvRmxISVp4eE5lYXZXSzBCbENxeGlJMVcyUUIxNjBDaStobE1zY2Z1K3AyRHhCVnpEQ2lZOUtUR0prWm9oa2VpMXhKc3M0L3VxbDFrd0pqU0hVcG9RdHpqUWc5UFdvVlVoczMxelBVbGtUM21ZNkNxaE5JVjl4VGg4Uko4d2NNakVFSkthNWw5Q1h1VkxLWjk0cVRvL0FEYUVnVE9OaXhGa29jditsOXBST1hFdlZUcDAwaFg4Z0Z5WDBkdlpEbVFWTUFnb3lORVF5L1I1Q0RhT0RYd2dOMUJBNmxST3dlZ25MVHQ4UTZ4REtaWTY1dU5CUDlEYUdBWXVRYnJlblp2N2IvUW1MbUl6ZWZwSmgxZ25FRUZydWhHWHY3clJzOTEvcUJ1Sk1sWG5tektGc29yY3pDcHhnU205YWQwV2NNUE54MlE4eno2b2huTzdSTkpSYWhQNDlxbkQvcFg0TTFGUEV6V0xUNmExaVF5cm9YZXhGbkFyZ0JxQy9SK08vVDdDWVF4R0xzeGtHa3ZVV1FpczR6amtONzR3ZVZhUnVpRVJZZGhHVll2Ti9mbWcxdUVPWGN3aUZQb1daWDVHZE1QUEF4aEJheVNpRVZ1RHJyZzJoUElvd1JlYmxSc2h4cnFGM2N3SmR6dGpRdXpXa1IxSEtaYlMvVzNhREhWVGJGTE9aYXhIbUFGL2FRVkhQWDh4YldOUklRMjV0U3NsRlZCSHU5aUhNSE82a2lKbFM2aytZZWVEVHJnQmF4YUhBTEdBQzBtTlRtOWkyV0V5ajJMbTNiVEdYMGVXVVVKemlhZWFwcHplaDFITW95K1FzYjhlTm9UQkVFcTNpUDV4dTFLbU9zc1RHOWk2cVpFSHVibXpQQi9RMkJsTE1QTlRETUhONEU0c0t1WlFIdmRJWktrT0FNeE0xblRFSUYyTmh5enhlQ0ZxVHdUdjBMcjdyaEprZnMvM0Z6TTF4UDNFcTVZck1ZOVJDWndoRDdxTTJGb2M3WWVhU1FaajVqdWtPTEc2aGcxb1p6U2ZwYWpPR01BU0dycVkvVzd1ZFpnNlp0eGJDK3lnMkZuZWtFMlp1REdFSUhMMlBRWFNsRVdhK3V6UThqMFc1bFBLa0d5M0dFSWJRb1Bkd1BzSWloS0ZBcG9hQXhLWDJFK1RIM0ptcUJ0ZTNrR281RTdTY0g3ck5aekRzQ2JtU0I5bkswY0JFNEo5ZUZBa2M2aWFEKzJ0NWxTTlI3dGNZNi9SNng4a0dnMGZJUkRwa0RDdm93eEJnTVdSM0gwczZoaWh5VXVkUXdDc2FvMVd2Nnhhb1p6QjRnSlR5c1l3bVJwemh3Ryt6VmE5N1ExamJEUUZRQkpSUnhIcU5NZFl6VlFhRGc0eGx2WXptZklRZmdQOTc0VE5wSWJvekVMaEh5M2pZZEtNTWZpQ1gwMFlSdzRCeVNIK2RZVSs0TndROUdpS0JNSUlDWHRZcE5Lck5YdW5MTWhoMlJVcHBseXRvUlJnRy9weWw1YTBoRWhTalRPZGZ2SzR4UnFZanltRFlIWElaRzhHZnZkZCtHQ0xKTnhEYWRBcHRXc25YMDZqSFlNZzZYbzBoZHNkSXVuaGRLN0JOTjhvUWRqS2RaVXFWdmlpeitJVFh0SklMMDhodk1HU0ZiTFFRM1RtQ09HdTFnall0NS9BTXlqRVlmTUhQTWNUdUdFa0JiMmlsNlVZWndrVlFob0JrTitwVFh0VnBYT0JSbVFaRFJnUnBpQ1JIb2p5Z1UyblRhdE9OTWdSTHRzY1F2U09NcEpQWHRRcGJKM2U3Rk1WZ3lDTHVEU0UrR1NKQkNjb3MrdkNhVHV0MlpxakJrQ1hDMEdYYUZlRkk0RUd0b2sybk9tZjZHQXhaSUp5RytJTEViSlRwUmhteVJOZ05BVkFDektLRVYzVTYzODl5M1lZOEl3cUdTRElJK0sxVzA2YlQrVnBBR2d3NVRwUU1rVUFaaWJCZXE3SFZwamhRTFlhY0kzcUdTSkRvUm0zalZhM21lMEdMTWVRT1VUVkVrc0VJRCtrTnRPa012aHEwR0VQMGlib2hrb3drem5xdE1kMG9RMmJraWlFQStnR3phT2NWcmVIY29NVVlvb2tyUTJqaTRLZENuN1I0eFJEZ2R6ckRkS01NN25IWFFsd2Rlak4wWnlTd1htZWFibFJlRTNkM0dJSGJMbE5ZdTB1OTBROWxGbDI4ckRNWkViUVlRMWJaakZMUE5oYTV5ZVRPRVB0R3poQUpsS0hBNzNRbUs3V0dnNEtXWS9BVkJWYlJ3U0M1REZ2R3VidUN6WjBoT2lOcWlBUUNqS0dBRFRxVG1OcVI2djRaVWtINUV4YW55YVdNbFRHOG4wNFI3Z3pSRldsREpOa0hvWVV1bnROYVRndGFqTUVUM2tXNGtrczVXVXA1T3BPQzNCbkNyODFCd1hBTXdoTmFaN3BSa1VYWkF0UlR3R0M1bEpVaW1SOWU1czRROFp3eUJDUzdVWVc4cVhYRTlCSUtnaFprU0JGaEZVVU1sc3V3cFpTdDNoWHJBcjJlb1JTdzNsV3AwVXEvaERCSmJKN0NrSmU0YXlHS2NxNkYySmxqZ1NmVlpxWGFIQmkwR0VQMnllY3hSTStvMDQyQ0RWcFBURmViYmxRK1lRelJPd05RV2xqUHN6cWJVNElXWThnT3ViNVM3UVhIb2Z4QjYxbXA4L2h5MEdJTS9tSmFpTlJJZEtNNjJhQnpURGNxbDNGbkNNbjdJTGw5VVZyWXdKOTBMaWNITGNiZ1BhYkxsQTdLOFNoUDZSelRqY28xVEpjcGZSTGRxQzdUamNvbFRBdVJPZnNpdFBBWG50SFpuQlMwR0VObXVETkVlcmNINVFmS0NWZzhwWE5acVRZSEJDM0hrQjZtaGZBV0MyRU1SV3pRQm1KcXA3Vm5QVlJvTXdPQzFwQUp1cHFEM1h6ZTdRKzI1ejBFcnFLamNwYjlnQmFLZVZJYk9TWm9NZW1nU3poVWw3S2NZdVlFclNVZGRCVkQ5R2M4UUFkVDNlUnpPNmgyTisxcXpIRUtTbG5RSXR5Z05zVzZoQmdXYnlKY1RYb25zd1NHM3NlK2VoK05XTHdDN20rbWNyZHJUQ2xLK3lIZk1kOW00REdnalM2ZW9JakgwQnpka3hDblBXZ0pxYUxMR0lYU0N0RzdWMXh0TEk1Z05MQUEwZy9NZEx1Tk1wTXh4TnNvRHdOcjJZZUh4UDdpUWRGS0tvRDdNaWc3dkFnZFFVdllFN3FNWTRuVGduSm0wRnJTUWUvakxPSzBJQnlkYVZudURHRlI1R0pQVWhlSi9RVnJFZHJrSnA3djdZT3lrSjlwSlpkRER0NWhMZUZ0SVhRcCt3TjF4SmtFMFZ0SDBaVjhEWXU1S0dPODZwNjc3ekx0bnMySTB4VXE1TmV5Z0E5Y0tMbWVMcjVMNGdTKzNFSEQxMExvY29wbzV6cmkxQ1BzRTdRZXQraEsraUZNQTZhajdPWGxXTldMTHRQYkNBOGp1M2FGM0NDTi9GV3JhRUNabDNnaG5WSkNTTWdNb1lzWndlZTBBTjhLV290YlZCSHVaUXhLRTdpYlRrMlZkQXp4UlZjb1Rwc3M3cjByNUpvU0ZyQ1pVaEk3MTNJREt4eUcwS1VNcG90RktCZEc4VDhidllzVFdVVXIrTHMzeFowaHVyaWJJdVpMTXgvN0lVWnNPcldTNnhDZXBQdDBYMi83b0tOQm9HTUliV1lBUWpWZFRJSG9SU3ZyUFh3RnVCRVlUUlorZlZlR2tLVzg2WmVRN1hVczVHbWR4bkxnV3Ivcnlnb0JkWm5VeG1KQTV0T1FRYUdyNmN0V3lvQVp3SmV5Vlc4NEYxMjJVWTN3M2g0L0Y0WFdJb0JaSnIySnM5aUhGNEI3aUtJWjdtSVVXM2dEcFpFc21nRkNhZ2had2lkQWhidE0vbWpKbUN5MkVIb1RYOVZtVm1MeEtFUXZaRVR2NUhpOWk4Y1JmZzBjSG9TRzBKNXZLazJzMW1tTVJoamxQck1QZ3RJbEM0YlFCZlREWWhyQ2RHQXZ2K3Z6R3IySC9lbWlEZ2wrUFNTMGhnREE0bnFVczREK2FaY1J2RGw4NnpLcElpemlZb1NGRUwycmluVTVSUlJ6SFYzaFdROEpaWmNwaVRUeERrSzlkd1Y2VmxMcStEVHRxZ3M1a1VVOENhd21pbWE0a3hFVThSSktDNFREREpCbFE2aE5vYnA5TFB2U0Fyem91WmpzbUdNVHlxdGVGcWhOSEtvTFdZN3dSK0JVTDh2T0Jub0hRL1IySG5EaTJyNFp0SjZkOGQwUU9waytPb1VSV2tFcm4vQXVVN2pLVFg2eDZVUzVtc1NDb0QvNFlRN2xBeXpPa2hyZThLekloVnhFQVgrRzZJVmxBK2p0akFkZVE5eUhaV2NMWDc1VW5VSmZuY0lvbmNKS0N2a1FlQmdvQXc1Q2FOWXFCcm9wVCtiekhIQ3pIMXAzcmN5VFV0Nm1nTzlJTlM5N1V0b1hIRU8wWTcyR0VmSnhxMmZpdEp3QktPY2lqRUw1RWRDL2w0ZHJIN3E0QlZ6T0hpa3pFSDRFN3N5VUVlbVo0elVLK2I1TVo2UEhhZ3haSUtNV1FpZXh2OFlZcXpIYVVENGtNY0FidzU1bmhVWnFCVDkyVTVmTTUxTWs5THZQSHFlQTA0MFpvb3RyUStoa0Jtb1pWMnVNTmdwNW44UnE2RWpjeHNrSVM3WFMzU3FxTkhJL3lxOWMxZU1WZTI0dDFsTENlVkxOdjdPZ3h1QVQ3aTV1TCtjaUxONUJXRTdDQkpuc29EdUFPTTJ1Y3ltVElPQ0hibWR6S1BmeVpTNlNDdTl1c2pFRWc5c3J0ZnJoNVp5TWNMbE81WWV1c3N4bkk4b3N6elJraXNVU3VyaFNKb1lqek51UUdjRlAzUWszYXpYN3VzclRseVhBSC8wUmxESUsxTXNNeXNRbUhyQVdnMGNFYndnNGhFNmEzR1FRbXpnV0V5R3cvNVc3VUs2Uld1eUE2amY0UkJnTUFUQkJwL0U5Tnhsa0hxOEFTM3pTc3p2YUVTNlRPbFlFVUxmQlo4SmlDQ0hPY3JWZEJ2SDFvUlo0Mng5SlBiSVpZWlRNWkUwVzZ6UmtrYkFZQW9URDJjeGNWMWxzdGpnaHc5bmdZeXhHU0MyL3kxSjloZ0FJanlFU1ROYnBuTzRtZzh6alFlQVhQdWxKOGc3Q3FUSXo4SUc4d1dmQ1pnaUxPTGVyN1hLVFN5ZVRnWC81STRuMUZIQzYxTExCcC9JTklTSnNoZ0FZd21acTNXUndEa1NiNllPVzV5amlUSm5KMzlNdFFCczR5a3RCQm44Sm95RUFxclNhRTF6bEtPWVc0Q2tQTlR6R1hwd3ROZndqM1FMMFJxWWpWSHFveWVBellUVkVJWEh1MEt0VER3MFJtemdGWElNM2F4Ty9BaTZRNlh5YWJnSGF3R3puMUFoRGhBaXJJUUNPWVFCVmJqTElIRjVGMG9pUDJwRzdnVXZFWmxzNm1WVVJiYUFGY2RmdE00U0RNQnNDb0ZhbnV6eURkQXMyOEQ5cDFTWTBpYzA0c2VsTUo3dXVwb0I1M0E3RTBxcmZFRGhoTjBRZjRBNjlKUFdqU2FTWnJVNUViT29JaWxJcE50VnVCU2JSMVJUd1orNEN4cWRiaGlGNHdtNElVRTdpNjB4MmswWG04UkRDejFQOGVCY3dRV1p6azN0eENkU21tRCt6Qm1GTXVtVVl3a0g0RFFFZ05HZzFSN3JLRTZjYzJMU0hUMzFPWXJ4d1o3clMxS2FFUXRxQUg2VmJoaUU4Uk1NUVVJSnltNXNqYkdRZUg4SnV1MEQvd21LRXpPYitkRVhwQXZvNVpuQVZtR2dJTDFFeEJNQjNxZWFucm5JMGNCdndaQS92Skk2SXNYdDhMeVhVWmdEYldBZWNuVzRaaHZBUkpVT0Fza0JuOE5WVVB5NkpUVHdUU0hTTmtpU09pTEY1S1cwWk5nZFN3SDhESjZkYmhpR2NSTXNRc0RkZDNPb21nOHhsQTdEUStldnJ4UG1PMkx5VnJnQzFPWmdDSGlHQ3Ayc2I5a3pVREFGd2dWWnpoYXNjaGN4RnVac0NUcGVHRk82ZDZBV2R5MkZZUEFFbVBpbFhDZlVwYXJ1aFZXdFk1d3ljOTRpejZqd3Vrd3JWWmpCeDFrSHFYVFpEOUloaUN3R3dQOHJpYkZXbWN4aUd4V01ZTStROFVUVUVLS1Y2QXhmNVhvM044Y1I1SERqVTc3b013Uk5kUXlSWXBqYjcrVlc0enVaRWhJZUJBL3lxd3hBdW9tNklnOW1XZnNqRjd0RFpuSW55Q1Bobk9FUDRpTG9oUUxoS3F6blB5eUsxbnZPSjh5Qlp2Z0hURUR6Uk53U0FzRnlydkhsNDFlWUhLUGNEZmIwb3p4QXRjc01ROERVS3VUSFRRclNPeTRCZmtnZzdOK1FodVdJSWdHdDFCbWVrbTFsdHJrYTRsK2l1elJnOElKY01ZYUhjcGxQY2QzVzBqa25BcmVUVzkyRklnMXg3QUFaVDR1NEFZcTFqT3NKU05BUTNXaHNDSjljTUFjcFVyZVhFbEQ0Nmkzb3dKMlBrTUcrZy9OSk5CbmVHNk9KeEpQUm5teFlRNXc2MWU3L2lTMEYwRnEwb2Rka1Vac2dhbTRCcUNqbE9ScnM3ZnRUVkFGS1c4VGZnK3pxRkVjUnBBWmNuWW1TUDRiUnpBMUMvOHh0cVk5SEpDcFNmQktETDRDOXg0RDZLbUNxbDZSMHdsMWFYU1pwWngxYU9ReWtuNlB2ZWVrT28wVnFHZDM5Skw2R0FUdTVFakJseUR1RlJMSTZUS3hpYnJoa2dnekdFcktCREZ0TktKMGNBaTBtY1hoRW1pb2x6ajlxSlZsQnRpaG5LYW9Rcmd4Wm04SlMzRUVybENzNlJ5M2tsMDhJeUhsVExNajZTVm1JSXc0R0hNaTNQWTQ2amczS2RUQjg2V1FQK1I4Y2Fzc1ptb0o1T2hzc1YzbDFnNDlraWxMU3dIamhQWTF5Q01CODQzS3V5TTBLWXpUNWNCSndTdEJTREp5aHdMNTFVeVRnKzhMcHd6NmRkcFpVMURHQUlRam53aWRmbHAwRmZqQmx5aFdkUlRwT3hqUFhERE9EVE9vVFl0RXN6clJReERGZ0I1dHBhUTBhOGgzSWxZemhKcnVScFB5dnlkV0ZPNXJOUm1wa0luQVQ4d2MrNkREbkpWcUNKdmd5VnExZ3BndnBkWVZZQzJhU1o1eFMrUXdVWEF3dUF3N0pScnlIU3JFV1pMRmZ4MTJ4V21yWFFEUUdWUmF6aE03NkpVRS9DL1FiRHpyeUFjb1pjeFNnWmwxMHpRQUN4VExLQ0xiSVFtd0lHQTZ2QS8yYlFFQWsrQXNycHg3ZGxIRThFSlNLdzRENlp6N3R5RTJPQlV4QnozVzBlMHdFc3BwMGpaQnl0VWhyc0FtL2cwYTZ5a0dmb3gybk9DbkpLQjQ4WmNvWjF3TEV5bnBoTURFY0lVT0NHZ01TRmliS0FsU2hIT09PTHovZVl5UkJsTm1CeG9Zem5YQm5QRzBHTDZVNG9ESkZFRnJKWjVtTlR3RkdJZDh2eGh0RHdNY3BrL3M1Uk1vN2ZCQzJtSjBLNWYxZ2FlUXNvMVdyT2RzTE1oKzhwanlIOHlJVE1ENEx3bTFDMUVEc2pqVHhLQ2NjalRJVDBRM29OaGxRSnRTRUF4S1pUR2xtQk1BU2xDV2dQV3BNaGR3bTlJWkpJSTV0a1B0WEVPUnJDMmY4MFJKL0lHQ0tKekdlRE5ISWhjQzZFYTRiQ0VIMGlaNGdrMHNnNlB1SllKOHc4RkhQWWh1Z1RXVU9BczQxMUhxM0FFYzRGS21IYnhtcUlHSkUyUkJLNWtZL2tSbUxFT1JGNFBHZzlodWlTRTRaSUlvMjhLUE00RS9nQjhIYlFlZ3pSSTZjTWtVUWFhR01MMzBLcEJqNE5XbzhoT3VTa0lRQ2ttYTB5anlZS0dZcWFiYXlHMU1oWlF5UVJtNDNTd0VTVWt4Q2VDbHBQeFBndjR0c3Z2YzhMY3Q0UVNhU0I1NWpONlFpbHdEdEI2d2s1YndMbnl5VCtVeWJuMTFnc2J3d0J6amJXMmF5aGdHRWt6bjNkRnJTbWtQRXhTam4vWkxoTTRyZEJpd21DdkRKRUVySFpJck94c1JnRXJDSUxwem1FbkU1Z0JVVU1rY20waWsxbjBJS0NJaThOa1VSczNwWFpqS1dMczRDWGd0WVRDTW9qeERsT0pqTlJKdkxQb09VRVRWNGJJb25NNGZjSUorVFpOdGEvSUpSS0dTTWt4bXRCaXdrTHhoQU9ZaE1YbTVYQWtaRFQyMWcvUTZrSGhzdGtzeXR4WjR3aGRrSnNQaE1ibXdLR1EwNDlNSEZnRmNxUkVzT1dzcHcxZkVhRWNndHBHSkJhL2dLVWFqM25BTTFFZXh2ck15Z3hLZWVab0lXRUhkTkM3QUdaeFNNb3gwTWt0N0crQzF4SmpGT01HVkxER0NJRnhLWlQ2bGhCbktFa2Jrc0srN1RrRnFDZU9JT2xQRHVIQk9jS3hoQXVFSnVQcFk0WUJReEhlVEJvUFQyZ3dCcTYrS1pNd1pZS2MzNnVXOHdZSWcya2hqZUJDM1FPSTBpMEdNTUNsZ1RDODBCTXBwaHJCekxCdEJBWklMV3M0OHNjRS9CdHJPOGpUT1RmZk51WUlYT01JVEpFSnRJaHRiUmljUVNTMVcyczdjQmlpaGdxVTFnaHRnbHY5d0pqQ0krUUdqNlNHbUxBdDhIMzQ5elhZakZNcGhLVHNsRGM0NWN6bURHRXg4Z01YZ0RPMExtTXdxTFY0K0xmUkRoYnB2S1l4K1VhRFA2ak5pWGF5QmxCNnpDa3p2OERRZDdRck1iTFIxQUFBQUFBU1VWT1JLNUNZSUk9Ij4KCiAgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8c3R5bGU+CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vdVlFQ01Lb0hjTzl4MXdkbWJ5SEltMy1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3NUZGFBNmowUHNiOTIwVmp2LW1yekgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9fVllGeC1zODI0a1hxX1VsMkJIcVlILV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by90bmo0U0I2RE5iZGFRbnNNOENGcUJYLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9vTU1nZlpNUXRoT3J5UW85bjIyZGN1dnZEaW4xcEs4YUt0ZUxwZVo1YzBBLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9Lc19jVnhpQ2l3VVdWc0ZXRkEzQmpuLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL05KNHZ4bGdXd1diRXN2MThkQWhxbm4tX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vaXNaLXdiQ1hOS0FibmpvNl9Ud0hUb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vNzdGWEZqUmJHek40YUNyU0ZobGgzb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8valNOMkNHVkRiY1Z5Q25mSmZqU2RmSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9VWDZpNEp4UURtM2ZWVGMxQ1B1d3FvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL2QtNklZcGxPRm9jQ2FjS3p4d1hTT0pCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vOTd1YWh4aXFaUm9uY0JhQ0VJM2FXNFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1B3WmMtWWJJTDQxNHdCOXJCMUlBUFlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0NfWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDd3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNGdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PcFhVcVRvMFVnUVFoR2pfU0ZkTFdCa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vV3hyWEphMEMzS2R0QzdsTWFmRzRkUmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL2NES2hSYVhuUVRPVmJhb3h3ZE9yOXhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzFoWmYwMlBPQU5oMzJrMlZrZ0VvVUJrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZQY3luU0wwcUhxXzZkWDdsS1ZCeVhZaGpiU3B2YzQ3ZWU2eFJfODBIbncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZTenVsZktTSzBMTGpqZmVheGNSRWhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vSzIzY3hXVlRySUZENkRKc0VWaTA3UmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0ZsNHkwUWRPeHl5VEhFR01YWDhrY1lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vMGVDNmZsMDZsdVhFWVdwQlNKdlhDSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9JM1Mxd3NnU2c5WUN1clY2UFVrVE9ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vLUwxNEprMDZtNnBVSEItNW1YUVFuWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0hnbzEzay10ZlNwbjBxaTFTRmRVZlpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9QcnUzM3FqU2hwWlNtRzN6NlZZd25ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9OWURXQmRENGdJcTI2RzVYWWJIc0ZJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdF9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdHd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0MUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9vSGkzMGt3UVd2cENXcUFoekhjQ1NJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vWkxxS2VlbFliQVRHNjBFcFpCU0R5NFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL214OVVjazZ1QjYzVklLRlluRU1YcllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL3JHdkhkSm5yMmw3NXFiMFlORDlOeUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL1J4WkpkbnplbzNSNXpTZXhnZThVVVpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL29PZUZ3Wk5sclRlZnpMWW1sVlYxVUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vbWJtaHByTUg2OVppNmVFUEJZVkZoWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFY0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwZlpyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBRdF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwVkJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFlncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBhRThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBkRGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWV9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWXd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6MXgtTTFJMXc1T01pcW5WRjh4QkxoVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rnp3WGFBWHVwNW1abGZLNnhSTHJoc2NvLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGenduNldxeG8teHd4aWxEWFBVOGNoVlUud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnoxVDdhSkxLNm5LcG4zNklNd1RjTU1jLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6Xzc5X1p1VXhDaWdNMkRlc3BUbkZhdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejRnZDlPRVBVQ04zQWRZVzBlOHRhdDQud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejhiSVFTWVpuV0xhV0M5UU5DcFRLX1Uud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQo8L3N0eWxlPgoKCjxzdHlsZT4KICBodG1sLAogIGJvZHkgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGhlaWdodDogMTAwJTsKICAgIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgfQo8L3N0eWxlPgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIFtoaWRkZW5dIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tbGF5b3V0OiB7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1pbmxpbmU6IHsKICAgICAgICBkaXNwbGF5OiAtbXMtaW5saW5lLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtZmxleDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWhvcml6b250YWw6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsLXJldmVyc2U6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcDogewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcC1yZXZlcnNlOiB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LWF1dG86IHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtbm9uZTogewogICAgICAgIC1tcy1mbGV4OiBub25lOwogICAgICAgIC13ZWJraXQtZmxleDogbm9uZTsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleDogewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMjogewogICAgICAgIC1tcy1mbGV4OiAyOwogICAgICAgIC13ZWJraXQtZmxleDogMjsKICAgICAgICBmbGV4OiAyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0zOiB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTQ6IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNTogewogICAgICAgIC1tcy1mbGV4OiA1OwogICAgICAgIC13ZWJraXQtZmxleDogNTsKICAgICAgICBmbGV4OiA1OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC02OiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTc6IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtODogewogICAgICAgIC1tcy1mbGV4OiA4OwogICAgICAgIC13ZWJraXQtZmxleDogODsKICAgICAgICBmbGV4OiA4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC05OiB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEwOiB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTExOiB7CiAgICAgICAgLW1zLWZsZXg6IDExOwogICAgICAgIC13ZWJraXQtZmxleDogMTE7CiAgICAgICAgZmxleDogMTE7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEyOiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH07CgogICAgICAvKiBhbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlcjogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWJhc2VsaW5lOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfTsKCiAgICAgIC8qIGFsaWdubWVudCBpbiBtYWluIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1hcm91bmQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItY2VudGVyOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfTsKCiAgICAgIC8qIHNlbGYgYWxpZ25tZW50ICovCgogICAgICAtLWxheW91dC1zZWxmLXN0YXJ0OiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWNlbnRlcjogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1lbmQ6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtc3RyZXRjaDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1iYXNlbGluZTogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9OwoKICAgICAgLyogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYmV0d2Vlbi1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYXJvdW5kLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH07CgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgT3RoZXIgTGF5b3V0CiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAtLWxheW91dC1ibG9jazogewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaW52aXNpYmxlOiB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1yZWxhdGl2ZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpdDogewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zY3JvbGw6IHsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH07CgogICAgICAtLWxheW91dC1mdWxsYmxlZWQ6IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfTsKCiAgICAgIC8qIGZpeGVkIHBvc2l0aW9uICovCgogICAgICAtLWxheW91dC1maXhlZC10b3A6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1yaWdodDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtYm90dG9tOiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtbGVmdDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItcmlwcGxlIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CgogICAgICAgIC8qIFNlZSBQb2x5bWVyRWxlbWVudHMvcGFwZXItYmVoYXZpb3JzL2lzc3Vlcy8zNC4gT24gbm9uLUNocm9tZSBicm93c2VycywKICAgICAgICAgKiBjcmVhdGluZyBhIG5vZGUgKHdpdGggYSBwb3NpdGlvbjphYnNvbHV0ZSkgaW4gdGhlIG1pZGRsZSBvZiBhbiBldmVudAogICAgICAgICAqIGhhbmRsZXIgImludGVycnVwdHMiIHRoYXQgZXZlbnQgaGFuZGxlciAod2hpY2ggaGFwcGVucyB3aGVuIHRoZQogICAgICAgICAqIHJpcHBsZSBpcyBjcmVhdGVkIG9uIGRlbWFuZCkgKi8KICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGluZ10pIHsKICAgICAgICAvKiBUaGlzIHJlc29sdmVzIGEgcmVuZGVyaW5nIGlzc3VlIGluIENocm9tZSAoYXMgb2YgNDApIHdoZXJlIHRoZQogICAgICAgICAgIHJpcHBsZSBpcyBub3QgcHJvcGVybHkgY2xpcHBlZCBieSBpdHMgcGFyZW50ICh3aGljaCBtYXkgaGF2ZQogICAgICAgICAgIHJvdW5kZWQgY29ybmVycykuIFNlZTogaHR0cDovL2pzYmluLmNvbS90ZW1leGEvNAoKICAgICAgICAgICBOb3RlOiBXZSBvbmx5IGFwcGx5IHRoaXMgc3R5bGUgY29uZGl0aW9uYWxseS4gT3RoZXJ3aXNlLCB0aGUgYnJvd3NlcgogICAgICAgICAgIHdpbGwgY3JlYXRlIGEgbmV3IGNvbXBvc2l0aW5nIGxheWVyIGZvciBldmVyeSByaXBwbGUgZWxlbWVudCBvbiB0aGUKICAgICAgICAgICBwYWdlLCBhbmQgdGhhdCB3b3VsZCBiZSBiYWQuICovCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgI3dhdmVzLAogICAgICAud2F2ZS1jb250YWluZXIsCiAgICAgIC53YXZlIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgLndhdmUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgICN3YXZlcywKICAgICAgLndhdmUgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC53YXZlLWNvbnRhaW5lciwKICAgICAgLndhdmUgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNpcmNsZSkgI2JhY2tncm91bmQsCiAgICAgIDpob3N0KC5jaXJjbGUpICN3YXZlcyB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICA6aG9zdCguY2lyY2xlKSAud2F2ZS1jb250YWluZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iYmFja2dyb3VuZCI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ3YXZlcyI+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAtLXNoYWRvdy10cmFuc2l0aW9uOiB7CiAgICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjI4cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctbm9uZTogewogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgIH07CgogICAgICAvKiBmcm9tIGh0dHA6Ly9jb2RlcGVuLmlvL3NoeW5kbWFuL3Blbi9jNTM5NGRkZjJlOGIyYTVjOTE4NTkwNGI1NzQyMWNkYiAqLwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tM2RwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAzcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi00ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi02ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDZweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCAxOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0xMmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAxMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCA0cHggMjJweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgIDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgIDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTI0ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCwgaHRtbCB7CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbDogewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLThkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICB9OwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbCksIC5wYXBlci1tYXRlcmlhbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSksIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIC8qIE5lZWQgdG8gc3BlY2lmeSB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyB0aGUgc3R5bGVzIGltcG9ydGVkIGZyb20gcGFwZXItbWF0ZXJpYWwuICovCiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1pbi13aWR0aDogNS4xNGVtOwogICAgICAgIG1hcmdpbjogMCAwLjI5ZW07CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIG91dGxpbmUtd2lkdGg6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgcGFkZGluZzogMC43ZW0gMC41N2VtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMpIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tcmFpc2VkLWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtyYWlzZWRdKS5rZXlib2FyZC1mb2N1cykgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1mbGF0LWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgYmFja2dyb3VuZDogI2VhZWFlYTsKICAgICAgICBjb2xvcjogI2E4YThhODsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1idXR0b24taW5rLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZm9yIEdvb2dsZSBwcm9kdWN0cyAqLwoKICAgICAgLS1nb29nbGUtcmVkLTEwMDogI2Y0YzdjMzsKICAgICAgLS1nb29nbGUtcmVkLTMwMDogI2U2N2M3MzsKICAgICAgLS1nb29nbGUtcmVkLTUwMDogI2RiNDQzNzsKICAgICAgLS1nb29nbGUtcmVkLTcwMDogI2M1MzkyOTsKCiAgICAgIC0tZ29vZ2xlLWJsdWUtMTAwOiAjYzZkYWZjOwogICAgICAtLWdvb2dsZS1ibHVlLTMwMDogIzdiYWFmNzsKICAgICAgLS1nb29nbGUtYmx1ZS01MDA6ICM0Mjg1ZjQ7CiAgICAgIC0tZ29vZ2xlLWJsdWUtNzAwOiAjMzM2N2Q2OwoKICAgICAgLS1nb29nbGUtZ3JlZW4tMTAwOiAjYjdlMWNkOwogICAgICAtLWdvb2dsZS1ncmVlbi0zMDA6ICM1N2JiOGE7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTUwMDogIzBmOWQ1ODsKICAgICAgLS1nb29nbGUtZ3JlZW4tNzAwOiAjMGI4MDQzOwoKICAgICAgLS1nb29nbGUteWVsbG93LTEwMDogI2ZjZThiMjsKICAgICAgLS1nb29nbGUteWVsbG93LTMwMDogI2Y3Y2I0ZDsKICAgICAgLS1nb29nbGUteWVsbG93LTUwMDogI2Y0YjQwMDsKICAgICAgLS1nb29nbGUteWVsbG93LTcwMDogI2YwOTMwMDsKCiAgICAgIC0tZ29vZ2xlLWdyZXktMTAwOiAjZjVmNWY1OwogICAgICAtLWdvb2dsZS1ncmV5LTMwMDogI2UwZTBlMDsKICAgICAgLS1nb29nbGUtZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tZ29vZ2xlLWdyZXktNzAwOiAjNjE2MTYxOwoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZnJvbSBvbmxpbmUgc3BlYyBkb2N1bWVudCAqLwoKICAgICAgLS1wYXBlci1yZWQtNTA6ICNmZmViZWU7CiAgICAgIC0tcGFwZXItcmVkLTEwMDogI2ZmY2RkMjsKICAgICAgLS1wYXBlci1yZWQtMjAwOiAjZWY5YTlhOwogICAgICAtLXBhcGVyLXJlZC0zMDA6ICNlNTczNzM7CiAgICAgIC0tcGFwZXItcmVkLTQwMDogI2VmNTM1MDsKICAgICAgLS1wYXBlci1yZWQtNTAwOiAjZjQ0MzM2OwogICAgICAtLXBhcGVyLXJlZC02MDA6ICNlNTM5MzU7CiAgICAgIC0tcGFwZXItcmVkLTcwMDogI2QzMmYyZjsKICAgICAgLS1wYXBlci1yZWQtODAwOiAjYzYyODI4OwogICAgICAtLXBhcGVyLXJlZC05MDA6ICNiNzFjMWM7CiAgICAgIC0tcGFwZXItcmVkLWExMDA6ICNmZjhhODA7CiAgICAgIC0tcGFwZXItcmVkLWEyMDA6ICNmZjUyNTI7CiAgICAgIC0tcGFwZXItcmVkLWE0MDA6ICNmZjE3NDQ7CiAgICAgIC0tcGFwZXItcmVkLWE3MDA6ICNkNTAwMDA7CgogICAgICAtLXBhcGVyLXBpbmstNTA6ICNmY2U0ZWM7CiAgICAgIC0tcGFwZXItcGluay0xMDA6ICNmOGJiZDA7CiAgICAgIC0tcGFwZXItcGluay0yMDA6ICNmNDhmYjE7CiAgICAgIC0tcGFwZXItcGluay0zMDA6ICNmMDYyOTI7CiAgICAgIC0tcGFwZXItcGluay00MDA6ICNlYzQwN2E7CiAgICAgIC0tcGFwZXItcGluay01MDA6ICNlOTFlNjM7CiAgICAgIC0tcGFwZXItcGluay02MDA6ICNkODFiNjA7CiAgICAgIC0tcGFwZXItcGluay03MDA6ICNjMjE4NWI7CiAgICAgIC0tcGFwZXItcGluay04MDA6ICNhZDE0NTc7CiAgICAgIC0tcGFwZXItcGluay05MDA6ICM4ODBlNGY7CiAgICAgIC0tcGFwZXItcGluay1hMTAwOiAjZmY4MGFiOwogICAgICAtLXBhcGVyLXBpbmstYTIwMDogI2ZmNDA4MTsKICAgICAgLS1wYXBlci1waW5rLWE0MDA6ICNmNTAwNTc7CiAgICAgIC0tcGFwZXItcGluay1hNzAwOiAjYzUxMTYyOwoKICAgICAgLS1wYXBlci1wdXJwbGUtNTA6ICNmM2U1ZjU7CiAgICAgIC0tcGFwZXItcHVycGxlLTEwMDogI2UxYmVlNzsKICAgICAgLS1wYXBlci1wdXJwbGUtMjAwOiAjY2U5M2Q4OwogICAgICAtLXBhcGVyLXB1cnBsZS0zMDA6ICNiYTY4Yzg7CiAgICAgIC0tcGFwZXItcHVycGxlLTQwMDogI2FiNDdiYzsKICAgICAgLS1wYXBlci1wdXJwbGUtNTAwOiAjOWMyN2IwOwogICAgICAtLXBhcGVyLXB1cnBsZS02MDA6ICM4ZTI0YWE7CiAgICAgIC0tcGFwZXItcHVycGxlLTcwMDogIzdiMWZhMjsKICAgICAgLS1wYXBlci1wdXJwbGUtODAwOiAjNmExYjlhOwogICAgICAtLXBhcGVyLXB1cnBsZS05MDA6ICM0YTE0OGM7CiAgICAgIC0tcGFwZXItcHVycGxlLWExMDA6ICNlYTgwZmM7CiAgICAgIC0tcGFwZXItcHVycGxlLWEyMDA6ICNlMDQwZmI7CiAgICAgIC0tcGFwZXItcHVycGxlLWE0MDA6ICNkNTAwZjk7CiAgICAgIC0tcGFwZXItcHVycGxlLWE3MDA6ICNhYTAwZmY7CgogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTUwOiAjZWRlN2Y2OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTEwMDogI2QxYzRlOTsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0yMDA6ICNiMzlkZGI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMzAwOiAjOTU3NWNkOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTQwMDogIzdlNTdjMjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS01MDA6ICM2NzNhYjc7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNjAwOiAjNWUzNWIxOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTcwMDogIzUxMmRhODsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS04MDA6ICM0NTI3YTA7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtOTAwOiAjMzExYjkyOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWExMDA6ICNiMzg4ZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTIwMDogIzdjNGRmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hNDAwOiAjNjUxZmZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWE3MDA6ICM2MjAwZWE7CgogICAgICAtLXBhcGVyLWluZGlnby01MDogI2U4ZWFmNjsKICAgICAgLS1wYXBlci1pbmRpZ28tMTAwOiAjYzVjYWU5OwogICAgICAtLXBhcGVyLWluZGlnby0yMDA6ICM5ZmE4ZGE7CiAgICAgIC0tcGFwZXItaW5kaWdvLTMwMDogIzc5ODZjYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNDAwOiAjNWM2YmMwOwogICAgICAtLXBhcGVyLWluZGlnby01MDA6ICMzZjUxYjU7CiAgICAgIC0tcGFwZXItaW5kaWdvLTYwMDogIzM5NDlhYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNzAwOiAjMzAzZjlmOwogICAgICAtLXBhcGVyLWluZGlnby04MDA6ICMyODM1OTM7CiAgICAgIC0tcGFwZXItaW5kaWdvLTkwMDogIzFhMjM3ZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTEwMDogIzhjOWVmZjsKICAgICAgLS1wYXBlci1pbmRpZ28tYTIwMDogIzUzNmRmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTQwMDogIzNkNWFmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTcwMDogIzMwNGZmZTsKCiAgICAgIC0tcGFwZXItYmx1ZS01MDogI2UzZjJmZDsKICAgICAgLS1wYXBlci1ibHVlLTEwMDogI2JiZGVmYjsKICAgICAgLS1wYXBlci1ibHVlLTIwMDogIzkwY2FmOTsKICAgICAgLS1wYXBlci1ibHVlLTMwMDogIzY0YjVmNjsKICAgICAgLS1wYXBlci1ibHVlLTQwMDogIzQyYTVmNTsKICAgICAgLS1wYXBlci1ibHVlLTUwMDogIzIxOTZmMzsKICAgICAgLS1wYXBlci1ibHVlLTYwMDogIzFlODhlNTsKICAgICAgLS1wYXBlci1ibHVlLTcwMDogIzE5NzZkMjsKICAgICAgLS1wYXBlci1ibHVlLTgwMDogIzE1NjVjMDsKICAgICAgLS1wYXBlci1ibHVlLTkwMDogIzBkNDdhMTsKICAgICAgLS1wYXBlci1ibHVlLWExMDA6ICM4MmIxZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hMjAwOiAjNDQ4YWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTQwMDogIzI5NzlmZjsKICAgICAgLS1wYXBlci1ibHVlLWE3MDA6ICMyOTYyZmY7CgogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNTA6ICNlMWY1ZmU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0xMDA6ICNiM2U1ZmM7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0yMDA6ICM4MWQ0ZmE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0zMDA6ICM0ZmMzZjc7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS00MDA6ICMyOWI2ZjY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS01MDA6ICMwM2E5ZjQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS02MDA6ICMwMzliZTU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS03MDA6ICMwMjg4ZDE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS04MDA6ICMwMjc3YmQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS05MDA6ICMwMTU3OWI7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hMTAwOiAjODBkOGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTIwMDogIzQwYzRmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWE0MDA6ICMwMGIwZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hNzAwOiAjMDA5MWVhOwoKICAgICAgLS1wYXBlci1jeWFuLTUwOiAjZTBmN2ZhOwogICAgICAtLXBhcGVyLWN5YW4tMTAwOiAjYjJlYmYyOwogICAgICAtLXBhcGVyLWN5YW4tMjAwOiAjODBkZWVhOwogICAgICAtLXBhcGVyLWN5YW4tMzAwOiAjNGRkMGUxOwogICAgICAtLXBhcGVyLWN5YW4tNDAwOiAjMjZjNmRhOwogICAgICAtLXBhcGVyLWN5YW4tNTAwOiAjMDBiY2Q0OwogICAgICAtLXBhcGVyLWN5YW4tNjAwOiAjMDBhY2MxOwogICAgICAtLXBhcGVyLWN5YW4tNzAwOiAjMDA5N2E3OwogICAgICAtLXBhcGVyLWN5YW4tODAwOiAjMDA4MzhmOwogICAgICAtLXBhcGVyLWN5YW4tOTAwOiAjMDA2MDY0OwogICAgICAtLXBhcGVyLWN5YW4tYTEwMDogIzg0ZmZmZjsKICAgICAgLS1wYXBlci1jeWFuLWEyMDA6ICMxOGZmZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hNDAwOiAjMDBlNWZmOwogICAgICAtLXBhcGVyLWN5YW4tYTcwMDogIzAwYjhkNDsKCiAgICAgIC0tcGFwZXItdGVhbC01MDogI2UwZjJmMTsKICAgICAgLS1wYXBlci10ZWFsLTEwMDogI2IyZGZkYjsKICAgICAgLS1wYXBlci10ZWFsLTIwMDogIzgwY2JjNDsKICAgICAgLS1wYXBlci10ZWFsLTMwMDogIzRkYjZhYzsKICAgICAgLS1wYXBlci10ZWFsLTQwMDogIzI2YTY5YTsKICAgICAgLS1wYXBlci10ZWFsLTUwMDogIzAwOTY4ODsKICAgICAgLS1wYXBlci10ZWFsLTYwMDogIzAwODk3YjsKICAgICAgLS1wYXBlci10ZWFsLTcwMDogIzAwNzk2YjsKICAgICAgLS1wYXBlci10ZWFsLTgwMDogIzAwNjk1YzsKICAgICAgLS1wYXBlci10ZWFsLTkwMDogIzAwNGQ0MDsKICAgICAgLS1wYXBlci10ZWFsLWExMDA6ICNhN2ZmZWI7CiAgICAgIC0tcGFwZXItdGVhbC1hMjAwOiAjNjRmZmRhOwogICAgICAtLXBhcGVyLXRlYWwtYTQwMDogIzFkZTliNjsKICAgICAgLS1wYXBlci10ZWFsLWE3MDA6ICMwMGJmYTU7CgogICAgICAtLXBhcGVyLWdyZWVuLTUwOiAjZThmNWU5OwogICAgICAtLXBhcGVyLWdyZWVuLTEwMDogI2M4ZTZjOTsKICAgICAgLS1wYXBlci1ncmVlbi0yMDA6ICNhNWQ2YTc7CiAgICAgIC0tcGFwZXItZ3JlZW4tMzAwOiAjODFjNzg0OwogICAgICAtLXBhcGVyLWdyZWVuLTQwMDogIzY2YmI2YTsKICAgICAgLS1wYXBlci1ncmVlbi01MDA6ICM0Y2FmNTA7CiAgICAgIC0tcGFwZXItZ3JlZW4tNjAwOiAjNDNhMDQ3OwogICAgICAtLXBhcGVyLWdyZWVuLTcwMDogIzM4OGUzYzsKICAgICAgLS1wYXBlci1ncmVlbi04MDA6ICMyZTdkMzI7CiAgICAgIC0tcGFwZXItZ3JlZW4tOTAwOiAjMWI1ZTIwOwogICAgICAtLXBhcGVyLWdyZWVuLWExMDA6ICNiOWY2Y2E7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTIwMDogIzY5ZjBhZTsKICAgICAgLS1wYXBlci1ncmVlbi1hNDAwOiAjMDBlNjc2OwogICAgICAtLXBhcGVyLWdyZWVuLWE3MDA6ICMwMGM4NTM7CgogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTUwOiAjZjFmOGU5OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTEwMDogI2RjZWRjODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0yMDA6ICNjNWUxYTU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMzAwOiAjYWVkNTgxOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTQwMDogIzljY2M2NTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi01MDA6ICM4YmMzNGE7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNjAwOiAjN2NiMzQyOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTcwMDogIzY4OWYzODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi04MDA6ICM1NThiMmY7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tOTAwOiAjMzM2OTFlOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWExMDA6ICNjY2ZmOTA7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTIwMDogI2IyZmY1OTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hNDAwOiAjNzZmZjAzOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWE3MDA6ICM2NGRkMTc7CgogICAgICAtLXBhcGVyLWxpbWUtNTA6ICNmOWZiZTc7CiAgICAgIC0tcGFwZXItbGltZS0xMDA6ICNmMGY0YzM7CiAgICAgIC0tcGFwZXItbGltZS0yMDA6ICNlNmVlOWM7CiAgICAgIC0tcGFwZXItbGltZS0zMDA6ICNkY2U3NzU7CiAgICAgIC0tcGFwZXItbGltZS00MDA6ICNkNGUxNTc7CiAgICAgIC0tcGFwZXItbGltZS01MDA6ICNjZGRjMzk7CiAgICAgIC0tcGFwZXItbGltZS02MDA6ICNjMGNhMzM7CiAgICAgIC0tcGFwZXItbGltZS03MDA6ICNhZmI0MmI7CiAgICAgIC0tcGFwZXItbGltZS04MDA6ICM5ZTlkMjQ7CiAgICAgIC0tcGFwZXItbGltZS05MDA6ICM4Mjc3MTc7CiAgICAgIC0tcGFwZXItbGltZS1hMTAwOiAjZjRmZjgxOwogICAgICAtLXBhcGVyLWxpbWUtYTIwMDogI2VlZmY0MTsKICAgICAgLS1wYXBlci1saW1lLWE0MDA6ICNjNmZmMDA7CiAgICAgIC0tcGFwZXItbGltZS1hNzAwOiAjYWVlYTAwOwoKICAgICAgLS1wYXBlci15ZWxsb3ctNTA6ICNmZmZkZTc7CiAgICAgIC0tcGFwZXIteWVsbG93LTEwMDogI2ZmZjljNDsKICAgICAgLS1wYXBlci15ZWxsb3ctMjAwOiAjZmZmNTlkOwogICAgICAtLXBhcGVyLXllbGxvdy0zMDA6ICNmZmYxNzY7CiAgICAgIC0tcGFwZXIteWVsbG93LTQwMDogI2ZmZWU1ODsKICAgICAgLS1wYXBlci15ZWxsb3ctNTAwOiAjZmZlYjNiOwogICAgICAtLXBhcGVyLXllbGxvdy02MDA6ICNmZGQ4MzU7CiAgICAgIC0tcGFwZXIteWVsbG93LTcwMDogI2ZiYzAyZDsKICAgICAgLS1wYXBlci15ZWxsb3ctODAwOiAjZjlhODI1OwogICAgICAtLXBhcGVyLXllbGxvdy05MDA6ICNmNTdmMTc7CiAgICAgIC0tcGFwZXIteWVsbG93LWExMDA6ICNmZmZmOGQ7CiAgICAgIC0tcGFwZXIteWVsbG93LWEyMDA6ICNmZmZmMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE0MDA6ICNmZmVhMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE3MDA6ICNmZmQ2MDA7CgogICAgICAtLXBhcGVyLWFtYmVyLTUwOiAjZmZmOGUxOwogICAgICAtLXBhcGVyLWFtYmVyLTEwMDogI2ZmZWNiMzsKICAgICAgLS1wYXBlci1hbWJlci0yMDA6ICNmZmUwODI7CiAgICAgIC0tcGFwZXItYW1iZXItMzAwOiAjZmZkNTRmOwogICAgICAtLXBhcGVyLWFtYmVyLTQwMDogI2ZmY2EyODsKICAgICAgLS1wYXBlci1hbWJlci01MDA6ICNmZmMxMDc7CiAgICAgIC0tcGFwZXItYW1iZXItNjAwOiAjZmZiMzAwOwogICAgICAtLXBhcGVyLWFtYmVyLTcwMDogI2ZmYTAwMDsKICAgICAgLS1wYXBlci1hbWJlci04MDA6ICNmZjhmMDA7CiAgICAgIC0tcGFwZXItYW1iZXItOTAwOiAjZmY2ZjAwOwogICAgICAtLXBhcGVyLWFtYmVyLWExMDA6ICNmZmU1N2Y7CiAgICAgIC0tcGFwZXItYW1iZXItYTIwMDogI2ZmZDc0MDsKICAgICAgLS1wYXBlci1hbWJlci1hNDAwOiAjZmZjNDAwOwogICAgICAtLXBhcGVyLWFtYmVyLWE3MDA6ICNmZmFiMDA7CgogICAgICAtLXBhcGVyLW9yYW5nZS01MDogI2ZmZjNlMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtMTAwOiAjZmZlMGIyOwogICAgICAtLXBhcGVyLW9yYW5nZS0yMDA6ICNmZmNjODA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTMwMDogI2ZmYjc0ZDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNDAwOiAjZmZhNzI2OwogICAgICAtLXBhcGVyLW9yYW5nZS01MDA6ICNmZjk4MDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTYwMDogI2ZiOGMwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNzAwOiAjZjU3YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS04MDA6ICNlZjZjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTkwMDogI2U2NTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTEwMDogI2ZmZDE4MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTIwMDogI2ZmYWI0MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTQwMDogI2ZmOTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTcwMDogI2ZmNjUwMDsKCiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNTA6ICNmYmU5ZTc7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMTAwOiAjZmZjY2JjOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTIwMDogI2ZmYWI5MTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0zMDA6ICNmZjhhNjU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNDAwOiAjZmY3MDQzOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTUwMDogI2ZmNTcyMjsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS02MDA6ICNmNDUxMWU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNzAwOiAjZTY0YTE5OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTgwMDogI2Q4NDMxNTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS05MDA6ICNiZjM2MGM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTEwMDogI2ZmOWU4MDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hMjAwOiAjZmY2ZTQwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWE0MDA6ICNmZjNkMDA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMDogI2RkMmMwMDsKCiAgICAgIC0tcGFwZXItYnJvd24tNTA6ICNlZmViZTk7CiAgICAgIC0tcGFwZXItYnJvd24tMTAwOiAjZDdjY2M4OwogICAgICAtLXBhcGVyLWJyb3duLTIwMDogI2JjYWFhNDsKICAgICAgLS1wYXBlci1icm93bi0zMDA6ICNhMTg4N2Y7CiAgICAgIC0tcGFwZXItYnJvd24tNDAwOiAjOGQ2ZTYzOwogICAgICAtLXBhcGVyLWJyb3duLTUwMDogIzc5NTU0ODsKICAgICAgLS1wYXBlci1icm93bi02MDA6ICM2ZDRjNDE7CiAgICAgIC0tcGFwZXItYnJvd24tNzAwOiAjNWQ0MDM3OwogICAgICAtLXBhcGVyLWJyb3duLTgwMDogIzRlMzQyZTsKICAgICAgLS1wYXBlci1icm93bi05MDA6ICMzZTI3MjM7CgogICAgICAtLXBhcGVyLWdyZXktNTA6ICNmYWZhZmE7CiAgICAgIC0tcGFwZXItZ3JleS0xMDA6ICNmNWY1ZjU7CiAgICAgIC0tcGFwZXItZ3JleS0yMDA6ICNlZWVlZWU7CiAgICAgIC0tcGFwZXItZ3JleS0zMDA6ICNlMGUwZTA7CiAgICAgIC0tcGFwZXItZ3JleS00MDA6ICNiZGJkYmQ7CiAgICAgIC0tcGFwZXItZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tcGFwZXItZ3JleS02MDA6ICM3NTc1NzU7CiAgICAgIC0tcGFwZXItZ3JleS03MDA6ICM2MTYxNjE7CiAgICAgIC0tcGFwZXItZ3JleS04MDA6ICM0MjQyNDI7CiAgICAgIC0tcGFwZXItZ3JleS05MDA6ICMyMTIxMjE7CgogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDogI2VjZWZmMTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMTAwOiAjY2ZkOGRjOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0yMDA6ICNiMGJlYzU7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTMwMDogIzkwYTRhZTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNDAwOiAjNzg5MDljOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDA6ICM2MDdkOGI7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTYwMDogIzU0NmU3YTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNzAwOiAjNDU1YTY0OwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS04MDA6ICMzNzQ3NGY7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTkwMDogIzI2MzIzODsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGRhcmsgdGV4dCBvbiBhIGxpZ2h0IGJhY2tncm91bmQgKi8KICAgICAgLS1kYXJrLWRpdmlkZXItb3BhY2l0eTogMC4xMjsKICAgICAgLS1kYXJrLWRpc2FibGVkLW9wYWNpdHk6IDAuMzg7IC8qIG9yIGhpbnQgdGV4dCBvciBpY29uICovCiAgICAgIC0tZGFyay1zZWNvbmRhcnktb3BhY2l0eTogMC41NDsKICAgICAgLS1kYXJrLXByaW1hcnktb3BhY2l0eTogMC44NzsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGxpZ2h0IHRleHQgb24gYSBkYXJrIGJhY2tncm91bmQgKi8KICAgICAgLS1saWdodC1kaXZpZGVyLW9wYWNpdHk6IDAuMTI7CiAgICAgIC0tbGlnaHQtZGlzYWJsZWQtb3BhY2l0eTogMC4zOyAvKiBvciBoaW50IHRleHQgb3IgaWNvbiAqLwogICAgICAtLWxpZ2h0LXNlY29uZGFyeS1vcGFjaXR5OiAwLjc7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1vcGFjaXR5OiAxLjA7CgogICAgfQoKICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CiAgICAgIC8qCiAgICAgICAqIFlvdSBjYW4gdXNlIHRoZXNlIGdlbmVyaWMgdmFyaWFibGVzIGluIHlvdXIgZWxlbWVudHMgZm9yIGVhc3kgdGhlbWluZy4KICAgICAgICogRm9yIGV4YW1wbGUsIGlmIGFsbCB5b3VyIGVsZW1lbnRzIHVzZSBgLS1wcmltYXJ5LXRleHQtY29sb3JgIGFzIGl0cyBtYWluCiAgICAgICAqIGNvbG9yLCB0aGVuIHN3aXRjaGluZyBmcm9tIGEgbGlnaHQgdG8gYSBkYXJrIHRoZW1lIGlzIGp1c3QgYSBtYXR0ZXIgb2YKICAgICAgICogY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGAtLXByaW1hcnktdGV4dC1jb2xvcmAgaW4geW91ciBhcHBsaWNhdGlvbi4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS10ZXh0LWNvbG9yKTsKICAgICAgLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWJhY2tncm91bmQtY29sb3IpOwogICAgICAtLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3IpOwogICAgICAtLWRpc2FibGVkLXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWRpc2FibGVkLWNvbG9yKTsKICAgICAgLS1kaXZpZGVyLWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yKTsKICAgICAgLS1lcnJvci1jb2xvcjogdmFyKC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMCk7CgogICAgICAvKgogICAgICAgKiBQcmltYXJ5IGFuZCBhY2NlbnQgY29sb3JzLiBBbHNvIHNlZSBjb2xvci5odG1sIGZvciBtb3JlIGNvbG9ycy4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTEwMCk7CiAgICAgIC0tZGFyay1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNzAwKTsKCiAgICAgIC0tYWNjZW50LWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLWEyMDApOwogICAgICAtLWxpZ2h0LWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMTAwKTsKICAgICAgLS1kYXJrLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hNDAwKTsKCgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gTGlnaHQgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1saWdodC10aGVtZS1iYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWxpZ2h0LXRoZW1lLWJhc2UtY29sb3I6ICMwMDAwMDA7CiAgICAgIC0tbGlnaHQtdGhlbWUtdGV4dC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWxpZ2h0LXRoZW1lLXNlY29uZGFyeS1jb2xvcjogIzczNzM3MzsgIC8qIGZvciBzZWNvbmRhcnkgdGV4dCBhbmQgaWNvbnMgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzliOWI5YjsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWxpZ2h0LXRoZW1lLWRpdmlkZXItY29sb3I6ICNkYmRiZGI7CgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gRGFyayBiYWNrZ3JvdW5kIHRoZW1lCiAgICAgICAqLwogICAgICAtLWRhcmstdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWRhcmstdGhlbWUtYmFzZS1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1kYXJrLXRoZW1lLXRleHQtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS1zZWNvbmRhcnktY29sb3I6ICNiY2JjYmM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tZGFyay10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzY0NjQ2NDsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWRhcmstdGhlbWUtZGl2aWRlci1jb2xvcjogIzNjM2MzYzsKCiAgICAgIC8qCiAgICAgICAqIERlcHJlY2F0ZWQgdmFsdWVzIGJlY2F1c2Ugb2YgdGhlaXIgY29uZnVzaW5nIG5hbWVzLgogICAgICAgKi8KICAgICAgLS10ZXh0LXByaW1hcnktY29sb3I6IHZhcigtLWRhcmstdGhlbWUtdGV4dC1jb2xvcik7CiAgICAgIC0tZGVmYXVsdC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItY2hlY2tib3giPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplOiB2YXIoLS1wYXBlci1jaGVja2JveC1zaXplLCAxOHB4KTsKICAgICAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlZCBpbiBgYXR0YWNoZWRgLiAqLwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZTogdmFyKC0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUsIC0xcHgpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgICNjaGVja2JveENvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICAgICAgbWluLXdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpOwogICAgICAgIG1hcmdpbjogdmFyKC0tcGFwZXItY2hlY2tib3gtbWFyZ2luLCBpbml0aWFsKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItY2hlY2tib3gtdmVydGljYWwtYWxpZ24sIG1pZGRsZSk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgfQoKICAgICAgI2luayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwoKICAgICAgICAvKiBDZW50ZXIgdGhlIHJpcHBsZSBpbiB0aGUgY2hlY2tib3ggYnkgbmVnYXRpdmUgb2Zmc2V0dGluZyBpdCBieQogICAgICAgICAqIChpbmtXaWR0aCAtIHJpcHBsZVdpZHRoKSAvIDIgKi8KICAgICAgICB0b3A6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI2luazpkaXIocnRsKSB7CiAgICAgICAgcmlnaHQ6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBhdXRvOwogICAgICB9CgogICAgICAjaW5rW2NoZWNrZWRdIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI2NoZWNrYm94IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAycHg7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDE0MG1zLCBib3JkZXItY29sb3IgMTQwbXM7CiAgICAgIH0KCiAgICAgIC8qIGNoZWNrYm94IGNoZWNrZWQgYW5pbWF0aW9ucyAqLwogICAgICAjY2hlY2tib3guY2hlY2tlZCAjY2hlY2ttYXJrIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY2hlY2ttYXJrLWV4cGFuZCAxNDBtcyBlYXNlLW91dCBmb3J3YXJkczsKICAgICAgICBhbmltYXRpb246IGNoZWNrbWFyay1leHBhbmQgMTQwbXMgZWFzZS1vdXQgZm9yd2FyZHM7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjaGVja21hcmstZXhwYW5kIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCwgMCkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY2hlY2ttYXJrLWV4cGFuZCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNjaGVja2JveC5jaGVja2VkIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgICNjaGVja21hcmsgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMzYlOwogICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXItbGVmdDogbm9uZTsKICAgICAgICBib3JkZXItcmlnaHQtd2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2ttYXJrLWNvbG9yLCB3aGl0ZSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA5NyUgODYlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDk3JSA4NiU7CiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7IC8qIHByb3RlY3QgYWdhaW5zdCBwYWdlLWxldmVsIGJveC1zaXppbmcgKi8KICAgICAgfQoKICAgICAgI2NoZWNrbWFyazpkaXIocnRsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTQlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSAxNCU7CiAgICAgIH0KCiAgICAgIC8qIGxhYmVsICovCiAgICAgICNjaGVja2JveExhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nLCA4cHgpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWNoZWNrYm94LWxhYmVsOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNjaGVja2JveExhYmVsIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZC1jb2xvciwgdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkOwogICAgICB9CgogICAgICAjY2hlY2tib3hMYWJlbDpkaXIocnRsKSB7CiAgICAgICAgcGFkZGluZy1yaWdodDogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtc3BhY2luZywgOHB4KTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICAgIH0KCiAgICAgICNjaGVja2JveExhYmVsW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3ggewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNjaGVja2JveCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNjaGVja2JveExhYmVsICB7CiAgICAgICAgb3BhY2l0eTogMC42NTsKICAgICAgfQoKICAgICAgLyogaW52YWxpZCBzdGF0ZSAqLwogICAgICAjY2hlY2tib3guaW52YWxpZDpub3QoLmNoZWNrZWQpIHsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWVycm9yLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9ImNoZWNrYm94Q29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iY2hlY2tib3giIGNsYXNzJD0iW1tfY29tcHV0ZUNoZWNrYm94Q2xhc3MoY2hlY2tlZCwgaW52YWxpZCldXSI+CiAgICAgICAgPGRpdiBpZD0iY2hlY2ttYXJrIiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja21hcmtDbGFzcyhjaGVja2VkKV1dIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjaGVja2JveExhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIGZpbGw6IHZhcigtLWlyb24taWNvbi1maWxsLWNvbG9yLCBjdXJyZW50Y29sb3IpOwogICAgICAgIHN0cm9rZTogdmFyKC0taXJvbi1pY29uLXN0cm9rZS1jb2xvciwgbm9uZSk7CgogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWljb24td2lkdGgsIDI0cHgpOwogICAgICAgIGhlaWdodDogdmFyKC0taXJvbi1pY29uLWhlaWdodCwgMjRweCk7CiAgICAgICAgQGFwcGx5IC0taXJvbi1pY29uOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWExMXktYW5ub3VuY2VyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIGNsaXA6IHJlY3QoMHB4LDBweCwwcHgsMHB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgYXJpYS1saXZlJD0iW1ttb2RlXV0iPltbX3RleHRdXTwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taW5wdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJjb250ZW50Ij48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogU2hhcmVkIFN0eWxlcyAqLwogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U6IHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90bycsICdOb3RvJywgc2Fucy1zZXJpZjsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tY29kZTogewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCAnQ29uc29sYXMnLCAnTWVubG8nLCBtb25vc3BhY2U7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWV4cGVuc2l2ZS1rZXJuaW5nOiB7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOiB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9OwoKICAgICAgLyogTWF0ZXJpYWwgRm9udCBTdHlsZXMgKi8KCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5NDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDExMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDQ0ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkzOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogNTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAyNmVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA2MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiA0NXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDE4ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDM0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWhlYWRsaW5lOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDEyZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDMycHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtdGl0bGU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtc3ViaGVhZDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJvZHkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYm9keTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jYXB0aW9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LW1lbnU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYnV0dG9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxOGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29kZTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb2RlMTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgIH0KCiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWNoYXItY291bnRlciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsb2F0OiByaWdodDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNoYXItY291bnRlcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpkaXIocnRsKSkgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzcGFuPltbX2NoYXJDb3VudGVyU3RyXV08L3NwYW4+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlOiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiB0byBtYWtlIGEgc3RhY2tpbmcgY29udGV4dCAqLwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgfTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1jb250YWluZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2lubGluZV0pIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjMzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICB9CgogICAgICAudW5kZXJsaW5lIHsKICAgICAgICBoZWlnaHQ6IDJweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLDEsMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1mb2N1czsKICAgICAgfQoKICAgICAgLnVuZGVybGluZS5pcy1oaWdobGlnaHRlZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWludmFsaWQgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzLCB3aWR0aCAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgLyogRml4IGZvciBzYWZhcmkgbm90IGZvY3VzaW5nIDAtaGVpZ2h0IGRhdGUvdGltZSBpbnB1dHMgd2l0aCAtd2Via2l0LWFwcGVyYW5jZTogbm9uZTsgKi8KICAgICAgICBtaW4taGVpZ2h0OiAxcHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwoKICAgICAgICAvKiBTaW5jZSB3ZSBzY2FsZSB0byA3NS8xMDAgb2YgdGhlIHNpemUsIHdlIGFjdHVhbGx5IGhhdmUgMTAwLzc1IG9mIHRoZQogICAgICAgIG9yaWdpbmFsIHNwYWNlIG5vdyBhdmFpbGFibGUgKi8KICAgICAgICB3aWR0aDogMTMzJTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZsb2F0aW5nOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICAvKiBUaGUgYXBwbHkgc2hpbSBkb2Vzbid0IGFwcGx5IHRoZSBuZXN0ZWQgY29sb3IgY3VzdG9tIHByb3BlcnR5LAogICAgICAgICAgc28gd2UgaGF2ZSB0byByZS1hcHBseSBpdCBoZXJlLiAqLwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1pbnZhbGlkOwogICAgICB9CgogICAgICAucHJlZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXByZWZpeDsKICAgICAgfQoKICAgICAgLnN1ZmZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtc3VmZml4OwogICAgICB9CgogICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSkgewogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciIgYXJpYS1oaWRkZW49InRydWUiIGhpZGRlbj0iW1tub0xhYmVsRmxvYXRdXSI+Jm5ic3A7PC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPjxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90Pjwvc3Bhbj4KCiAgICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlSW5wdXRDb250ZW50Q2xhc3Mobm9MYWJlbEZsb2F0LGFsd2F5c0Zsb2F0TGFiZWwsZm9jdXNlZCxpbnZhbGlkLF9pbnB1dEhhc0NvbnRlbnQpXV0iIGlkPSJsYWJlbEFuZElucHV0Q29udGFpbmVyIj4KICAgICAgICA8c2xvdCBuYW1lPSJsYWJlbCI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9ImlucHV0Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPHNwYW4gY2xhc3M9InN1ZmZpeCI+PHNsb3QgbmFtZT0ic3VmZml4Ij48L3Nsb3Q+PC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVVbmRlcmxpbmVDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJ1bmZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxzbG90IG5hbWU9ImFkZC1vbiI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWVycm9yIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWludmFsaWQtY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1lcnJvcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDowOwogICAgICAgIHJpZ2h0OjA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgewogICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgIH07CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtmb2N1c2VkXSkgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhlIDxpbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMgaXQuCiAgICAgIEluIDIueCB0aGUgPGlyb24taW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzCiAgICAgIGl0LCBidXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHksIHdlIG5lZWQgdG8gcmVzZXQgc29tZQogICAgICBvZiB0aGUgbmF0aXZlIGlucHV0J3MgcHJvcGVydGllcyB0byBpbmhlcml0IChmcm9tIHRoZSBpcm9uLWlucHV0KSAqLwogICAgICBpcm9uLWlucHV0ID4gaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIHdvcmQtc3BhY2luZzogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jbGVhci1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLWNsZWFyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtcmV2ZWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtcmV2ZWFsOwogICAgICB9CgogICAgICBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIGlkPSJjb250YWluZXIiIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPHNsb3QgbmFtZT0icHJlZml4IiBzbG90PSJwcmVmaXgiPjwvc2xvdD4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDxzcGFuIGlkPSJ0ZW1wbGF0ZS1wbGFjZWhvbGRlciI+PC9zcGFuPgoKICAgICAgPHNsb3QgbmFtZT0ic3VmZml4IiBzbG90PSJzdWZmaXgiPjwvc2xvdD4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgoKICAKICA8dGVtcGxhdGUgaWQ9InYwIj4KICAgIDxpbnB1dCBpcz0iaXJvbi1pbnB1dCIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgaW52YWxpZD0ie3tpbnZhbGlkfX0iIHByZXZlbnQtaW52YWxpZC1pbnB1dD0iW1twcmV2ZW50SW52YWxpZElucHV0XV0iIGFsbG93ZWQtcGF0dGVybj0iW1thbGxvd2VkUGF0dGVybl1dIiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgPC90ZW1wbGF0ZT4KCiAgPHRlbXBsYXRlIGlkPSJ2MSI+CiAgICAKICAgIDxpcm9uLWlucHV0IGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYWxsb3dlZC1wYXR0ZXJuPSJbW2FsbG93ZWRQYXR0ZXJuXV0iIGludmFsaWQ9Int7aW52YWxpZH19IiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iPgogICAgICA8aW5wdXQgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgICA8L2lyb24taW5wdXQ+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1vdmVybGF5LWJhY2tkcm9wIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pcm9uLW92ZXJsYXktYmFja2Ryb3AtYmFja2dyb3VuZC1jb2xvciwgIzAwMCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wOwogICAgICB9CgogICAgICA6aG9zdCgub3BlbmVkKSB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wYWNpdHksIDAuNik7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wZW5lZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1kcm9wZG93biI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyLmFuaW1hdGluZyA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudFdyYXBwZXIiPgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbWVudS1idXR0b24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiPgogICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIGNsYXNzPSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvaXJvbi1kcm9wZG93bj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItZHJvcGRvd24tbWVudSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj48cGF0aCBkPSJNNyAxMGw1IDUgNS01eiI+PC9wYXRoPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKCiAgICAgICAgLyogTk9URShjZGF0YSk6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlCiAgICAgICAgICogdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4KICAgICAgICAgKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbbm9pbmtdKSBwYXBlci1yaXBwbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtuby1sYWJlbC1mbG9hdF0pIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiAxMnB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICByaWdodDogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LXJpcHBsZTsKICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcik7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaWNvbjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZHJvcGRvd24tbWVudSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRyb3Bkb3duLW1lbnUtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAKICAgIDxzcGFuIHJvbGU9ImJ1dHRvbiI+PC9zcGFuPgogICAgPHBhcGVyLW1lbnUtYnV0dG9uIGlkPSJtZW51QnV0dG9uIiB2ZXJ0aWNhbC1hbGlnbj0iW1t2ZXJ0aWNhbEFsaWduXV0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIGR5bmFtaWMtYWxpZ249IltbZHluYW1pY0FsaWduXV0iIHZlcnRpY2FsLW9mZnNldD0iW1tfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldChub0xhYmVsRmxvYXQsIHZlcnRpY2FsT2Zmc2V0KV1dIiBkaXNhYmxlZD0iW1tkaXNhYmxlZF1dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBvbi1pcm9uLXNlbGVjdD0iX29uSXJvblNlbGVjdCIgb24taXJvbi1kZXNlbGVjdD0iX29uSXJvbkRlc2VsZWN0IiBvcGVuZWQ9Int7b3BlbmVkfX0iIGNsb3NlLW9uLWFjdGl2YXRlIGFsbG93LW91dHNpZGUtc2Nyb2xsPSJbW2FsbG93T3V0c2lkZVNjcm9sbF1dIiByZXN0b3JlLWZvY3VzLW9uLWNsb3NlPSJbW3Jlc3RvcmVGb2N1c09uQ2xvc2VdXSI+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIj4KICAgICAgICA8cGFwZXItcmlwcGxlPjwvcGFwZXItcmlwcGxlPgogICAgICAgIAogICAgICAgIDxwYXBlci1pbnB1dCB0eXBlPSJ0ZXh0IiBpbnZhbGlkPSJbW2ludmFsaWRdXSIgcmVhZG9ubHkgZGlzYWJsZWQ9IltbZGlzYWJsZWRdXSIgdmFsdWU9IltbdmFsdWVdXSIgcGxhY2Vob2xkZXI9IltbcGxhY2Vob2xkZXJdXSIgZXJyb3ItbWVzc2FnZT0iW1tlcnJvck1lc3NhZ2VdXSIgYWx3YXlzLWZsb2F0LWxhYmVsPSJbW2Fsd2F5c0Zsb2F0TGFiZWxdXSIgbm8tbGFiZWwtZmxvYXQ9Iltbbm9MYWJlbEZsb2F0XV0iIGxhYmVsPSJbW2xhYmVsXV0iPgogICAgICAgICAgCiAgICAgICAgICA8aXJvbi1pY29uIGljb249InBhcGVyLWRyb3Bkb3duLW1lbnU6YXJyb3ctZHJvcC1kb3duIiBzdWZmaXggc2xvdD0ic3VmZml4Ij48L2lyb24taWNvbj4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgICAgPHNsb3QgaWQ9ImNvbnRlbnQiIG5hbWU9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPjwvc2xvdD4KICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbGlzdGJveCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CgogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLWxpc3Rib3gtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWxpc3Rib3gtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1saXN0Ym94OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QsIC5wYXBlci1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1taW4taGVpZ2h0LCA0OHB4KTsKICAgICAgICBwYWRkaW5nOiAwcHggMTZweDsKICAgICAgfQoKICAgICAgLnBhcGVyLWl0ZW0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBib3JkZXI6bm9uZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgLnBhcGVyLWl0ZW1baGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCguaXJvbi1zZWxlY3RlZCksIC5wYXBlci1pdGVtLmlyb24tc2VsZWN0ZWQgewogICAgICAgIGZvbnQtd2VpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLXNlbGVjdGVkLXdlaWdodCwgYm9sZCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pLCAucGFwZXItaXRlbVtkaXNhYmxlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pdGVtLWRpc2FibGVkLWNvbG9yLCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cyksIC5wYXBlci1pdGVtOmZvY3VzIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogMDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1mb2N1c2VkOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpOmJlZm9yZSwgLnBhcGVyLWl0ZW06Zm9jdXM6YmVmb3JlIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwoKICAgICAgICBiYWNrZ3JvdW5kOiBjdXJyZW50Q29sb3I7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tZGFyay1kaXZpZGVyLW9wYWNpdHkpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWZvY3VzZWQtYmVmb3JlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzIj4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iYWNrZW5kIj4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zdG9yYWdlIj4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGFnLWZpbHRlcmVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgbGFiZWw9IkZpbHRlciB0YWdzIChyZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnRlZCkiIHZhbHVlPSJ7e190YWdGaWx0ZXJ9fSIgY2xhc3M9InNlYXJjaC1pbnB1dCI+CiAgICAgIDxpcm9uLWljb24gcHJlZml4IGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmxheW91dC5ob3Jpem9udGFsLAogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5pbmxpbmUgewogICAgICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmxheW91dC53cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5uby13cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZmxleCB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC1hdXRvIHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgLmZsZXgtbm9uZSB7CiAgICAgICAgLW1zLWZsZXg6IG5vbmU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiBub25lOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtcmV2ZXJzZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSwKICAgICAgLmxheW91dC52ZXJ0aWNhbC1yZXZlcnNlIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5ob3Jpem9udGFsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtYWxpZ25tZW50Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlciwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZCB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmFzZWxpbmUgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGVuZDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5hcm91bmQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGYgYWxpZ25tZW50LgogICAgICAgKi8KICAgICAgLnNlbGYtc3RhcnQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAuc2VsZi1jZW50ZXIgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9CgogICAgICAuc2VsZi1lbmQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAuc2VsZi1zdHJldGNoIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgfQoKICAgICAgLnNlbGYtYmFzZWxpbmUgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IHN0YXJ0OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGVuZDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBjZW50ZXI7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmV0d2Vlbi1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGp1c3RpZnk7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYXJvdW5kLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZGlzdHJpYnV0ZTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1mbGV4LWZhY3RvcnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmZsZXgsCiAgICAgIC5mbGV4LTEgewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfQoKICAgICAgLmZsZXgtMiB7CiAgICAgICAgLW1zLWZsZXg6IDI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAyOwogICAgICAgIGZsZXg6IDI7CiAgICAgIH0KCiAgICAgIC5mbGV4LTMgewogICAgICAgIC1tcy1mbGV4OiAzOwogICAgICAgIC13ZWJraXQtZmxleDogMzsKICAgICAgICBmbGV4OiAzOwogICAgICB9CgogICAgICAuZmxleC00IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfQoKICAgICAgLmZsZXgtNSB7CiAgICAgICAgLW1zLWZsZXg6IDU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA1OwogICAgICAgIGZsZXg6IDU7CiAgICAgIH0KCiAgICAgIC5mbGV4LTYgewogICAgICAgIC1tcy1mbGV4OiA2OwogICAgICAgIC13ZWJraXQtZmxleDogNjsKICAgICAgICBmbGV4OiA2OwogICAgICB9CgogICAgICAuZmxleC03IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfQoKICAgICAgLmZsZXgtOCB7CiAgICAgICAgLW1zLWZsZXg6IDg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA4OwogICAgICAgIGZsZXg6IDg7CiAgICAgIH0KCiAgICAgIC5mbGV4LTkgewogICAgICAgIC1tcy1mbGV4OiA5OwogICAgICAgIC13ZWJraXQtZmxleDogOTsKICAgICAgICBmbGV4OiA5OwogICAgICB9CgogICAgICAuZmxleC0xMCB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH0KCiAgICAgIC5mbGV4LTExIHsKICAgICAgICAtbXMtZmxleDogMTE7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMTsKICAgICAgICBmbGV4OiAxMTsKICAgICAgfQoKICAgICAgLmZsZXgtMTIgewogICAgICAgIC1tcy1mbGV4OiAxMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDEyOwogICAgICAgIGZsZXg6IDEyOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1wb3NpdGlvbmluZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaW52aXNpYmxlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnJlbGF0aXZlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIGJvZHkuZnVsbGJsZWVkIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNjcm9sbCB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwogICAgICAuZml4ZWQtYm90dG9tLAogICAgICAuZml4ZWQtbGVmdCwKICAgICAgLmZpeGVkLXJpZ2h0LAogICAgICAuZml4ZWQtdG9wIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtcmlnaHQgewogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1ib3R0b20gewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtbGVmdCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogIDpyb290IHsKICAgIC0tdGItb3JhbmdlLXdlYWs6ICNmZmE3MjY7CiAgICAtLXRiLW9yYW5nZS1zdHJvbmc6ICNmNTdjMDA7CiAgICAtLXRiLW9yYW5nZS1kYXJrOiAjZGM3MzIwOwogICAgLS10Yi1ncmV5LWRhcmtlcjogI2UyZTJlMjsKICAgIC0tdGItZ3JleS1saWdodGVyOiAjZjNmM2YzOwogICAgLS10Yi11aS1kYXJrLWFjY2VudDogIzc1NzU3NTsKICAgIC0tdGItdWktbGlnaHQtYWNjZW50OiAjZTBlMGUwOwogICAgLS10Yi1ncmFwaC1mYWRlZDogI2UwZDRiMzsKICB9Cjwvc3R5bGU+CgoKPGRvbS1tb2R1bGUgaWQ9ImRhc2hib2FyZC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nOiAxNXB4OwogICAgICAgIC0tc2lkZWJhci1sZWZ0LXBhZGRpbmc6IDMwcHg7CiAgICAgIH0KCiAgICAgIFtzbG90PSdzaWRlYmFyJ10gewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHBhZGRpbmc6IDVweCAwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgbGVmdDogdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpOwogICAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgKiAyKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgLnNlYXJjaC1pbnB1dCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDVweCAwIDEwcHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gewogICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpOwogICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMAogICAgICAgICAgdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbjpsYXN0LW9mLXR5cGUgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgcGFkZGluZy10b3A6IDA7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiBoMyB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJzY3JvbGxiYXItc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRhc2hib2FyZC1sYXlvdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InNpZGViYXIiPgogICAgICA8c2xvdCBuYW1lPSJzaWRlYmFyIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjZW50ZXIiPgogICAgICA8c2xvdCBuYW1lPSJjZW50ZXIiIGNsYXNzPSJzY29sbGJhciI+PC9zbG90PgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpZGViYXIgewogICAgICAgIGZsZXg6IDAgMCB2YXIoLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItYmFzaXMsIDI1JSk7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1heC13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aCwgMzUwcHgpOwogICAgICAgIG1pbi13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1pbi13aWR0aCwgMjcwcHgpOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgICNjZW50ZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKFtzbG90PSdjZW50ZXInXSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAudGYtZ3JhcGgtZGFzaGJvYXJkICNjZW50ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcHRpb24tc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9IndyYXAiPgogICAgICA8aDM+W1tuYW1lXV08L2gzPgogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LXdyYXBwZXIiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCguc2VsZWN0ZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIGgzIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogMCAwIDVweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWNvbGxhcHNlIj4KCiAgPHRlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLWlyb24tY29sbGFwc2UtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMzAwbXMpOwogICAgICAgIC8qIFNhZmFyaSAxMCBuZWVkcyB0aGlzIHByb3BlcnR5IHByZWZpeGVkIHRvIGNvcnJlY3RseSBhcHBseSB0aGUgY3VzdG9tIHByb3BlcnR5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmlyb24tY29sbGFwc2UtY2xvc2VkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1jb2xsYXBzZS1vcGVuZWQpKSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CgogIDwvdGVtcGxhdGU+Cgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcGFuZVJlbmRlcmVkXV0iIGlkPSJpZlJlbmRlcmVkIj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iaGVhZGluZyIgb24tdGFwPSJfdG9nZ2xlUGFuZSIgb3Blbi1idXR0b24kPSJbW29wZW5lZF1dIj4KICAgICAgICA8c3BhbiBjbGFzcz0ibmFtZSI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0NvbXBvc2l0ZVNlYXJjaChjYXRlZ29yeSldXSI+CiAgICAgICAgICAgICAgPHNwYW4+VGFncyBtYXRjaGluZyBtdWx0aXBsZSBleHBlcmltZW50czwvc3Bhbj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzSW52YWxpZFNlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4mbmJzcDs8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc0NvbXBvc2l0ZVNlYXJjaChjYXRlZ29yeSldXSI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxpZ2h0Ij5UYWdzIG1hdGNoaW5nIC88L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LW5hbWUiIHRpdGxlJD0iW1tjYXRlZ29yeS5uYW1lXV0iPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaWdodCI+Lzwvc3Bhbj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVW5pdmVyc2FsU2VhcmNoUXVlcnldXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4gKGFsbCB0YWdzKTwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNJbnZhbGlkU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgICAgIDxzcGFuPiA8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LW5hbWUiIHRpdGxlJD0iW1tjYXRlZ29yeS5uYW1lXV0iPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvdW50Ij4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVdXSI+CiAgICAgICAgICAgIDxzcGFuPltbX2NvdW50XV08L3NwYW4+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJleHBhbmQtbW9yZSIgY2xhc3M9ImV4cGFuZC1hcnJvdyI+PC9pcm9uLWljb24+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2J1dHRvbj4KICAgICAgCiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tvcGVuZWRdXSIgbm8tYW5pbWF0aW9uPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgPHNwYW4gaWQ9InRvcC1vZi1jb250YWluZXIiPjwvc3Bhbj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbXVsdGlwbGVQYWdlc0V4aXN0XV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJiaWctcGFnZS1idXR0b25zIiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMTBweDsiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybVByZXZpb3VzUGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzUHJldmlvdXNQYWdlXV0iPlByZXZpb3VzIHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iX3BlcmZvcm1OZXh0UGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzTmV4dFBhZ2VdXSI+TmV4dCBwYWdlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGlkPSJpdGVtcyI+CiAgICAgICAgICAgIDxzbG90IG5hbWU9Iml0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbXVsdGlwbGVQYWdlc0V4aXN0XV0iPgogICAgICAgICAgICA8ZGl2IGlkPSJjb250cm9scy1jb250YWluZXIiPgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogMCA1cHgiPgogICAgICAgICAgICAgICAgUGFnZQogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJwYWdlLWlucHV0IiB0eXBlPSJudW1iZXIiIG5vLWxhYmVsLWZsb2F0IG1pbj0iMSIgbWF4PSJbW19wYWdlQ291bnRdXSIgdmFsdWU9IltbX3BhZ2VJbnB1dFZhbHVlXV0iIG9uLWlucHV0PSJfaGFuZGxlUGFnZUlucHV0RXZlbnQiIG9uLWNoYW5nZT0iX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCIgb24tZm9jdXM9Il9oYW5kbGVQYWdlRm9jdXNFdmVudCIgb24tYmx1cj0iX2hhbmRsZVBhZ2VCbHVyRXZlbnQiPjwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICBvZiBbW19wYWdlQ291bnRdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNQcmV2aW91c1BhZ2VdXSI+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybU5leHRQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIj5OZXh0IHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAwIDVweCAxcHggMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZpcnN0LW9mLXR5cGUpIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICA6aG9zdCg6bGFzdC1vZi10eXBlKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmhlYWRpbmcgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgIH0KCiAgICAgIFtvcGVuLWJ1dHRvbl0gewogICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbb3Blbi1idXR0b25dIC5leHBhbmQtYXJyb3cgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlWigxODBkZWcpOwogICAgICB9CgogICAgICAubmFtZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmxpZ2h0IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICB9CgogICAgICAuY2F0ZWdvcnktbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHBhZGRpbmc6IDJweCAwOwogICAgICB9CgogICAgICAuY291bnQgewogICAgICAgIG1hcmdpbjogMCA1cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGVkZWRlOwogICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgIH0KCiAgICAgIC5saWdodCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbGV4LWJhc2lzOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIH0KCiAgICAgIHNsb3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgICNwYWdlLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IHZhcigtLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgsIDEwMCUpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZGlhbG9nLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbjogMjRweCA0MHB4OwoKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1kaWFsb2ctYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWRpYWxvZy1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtYm9keTE7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZzsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG1hcmdpbi10b3A6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMCAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgubm8tcGFkZGluZykgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIAogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgqOmZpcnN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpsYXN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQoKICAgICAgLyogSW4gMS54LCB0aGlzIHNlbGVjdG9yIHdhcyBgOmhvc3QgPiA6OmNvbnRlbnQgaDJgLiBJbiAyLnggPHNsb3Q+IGFsbG93cwogICAgICB0byBzZWxlY3QgZGlyZWN0IGNoaWxkcmVuIG9ubHksIHdoaWNoIGluY3JlYXNlcyB0aGUgd2VpZ2h0IG9mIHRoaXMKICAgICAgc2VsZWN0b3IsIHNvIHdlIGhhdmUgdG8gcmUtZGVmaW5lIGZpcnN0LWNoaWxkL2xhc3QtY2hpbGQgbWFyZ2lucyBiZWxvdy4gKi8KICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDIpIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAwOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXRpdGxlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tdG9wLiAqLwogICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXRpdGxlOwogICAgICB9CgogICAgICAvKiBBcHBseSBtaXhpbiBhZ2FpbiwgaW4gY2FzZSBpdCBzZXRzIG1hcmdpbi1ib3R0b20uICovCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyOmxhc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLnBhcGVyLWRpYWxvZy1idXR0b25zKSwKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLmJ1dHRvbnMpIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4IDhweCA4cHggMjRweDsKICAgICAgICBtYXJnaW46IDA7CgogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctYnV0dG9uLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY29sb3Itc2NhbGUiPgogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgo8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJpY29ucyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iM2Qtcm90YXRpb24iPjxwYXRoIGQ9Ik03LjUyIDIxLjQ4QzQuMjUgMTkuOTQgMS45MSAxNi43NiAxLjU1IDEzSC4wNUMuNTYgMTkuMTYgNS43MSAyNCAxMiAyNGwuNjYtLjAzLTMuODEtMy44MS0xLjMzIDEuMzJ6bS44OS02LjUyYy0uMTkgMC0uMzctLjAzLS41Mi0uMDgtLjE2LS4wNi0uMjktLjEzLS40LS4yNC0uMTEtLjEtLjItLjIyLS4yNi0uMzctLjA2LS4xNC0uMDktLjMtLjA5LS40N2gtMS4zYzAgLjM2LjA3LjY4LjIxLjk1LjE0LjI3LjMzLjUuNTYuNjkuMjQuMTguNTEuMzIuODIuNDEuMy4xLjYyLjE1Ljk2LjE1LjM3IDAgLjcyLS4wNSAxLjAzLS4xNS4zMi0uMS42LS4yNS44My0uNDRzLjQyLS40My41NS0uNzJjLjEzLS4yOS4yLS42MS4yLS45NyAwLS4xOS0uMDItLjM4LS4wNy0uNTYtLjA1LS4xOC0uMTItLjM1LS4yMy0uNTEtLjEtLjE2LS4yNC0uMy0uNC0uNDMtLjE3LS4xMy0uMzctLjIzLS42MS0uMzEuMi0uMDkuMzctLjIuNTItLjMzLjE1LS4xMy4yNy0uMjcuMzctLjQyLjEtLjE1LjE3LS4zLjIyLS40Ni4wNS0uMTYuMDctLjMyLjA3LS40OCAwLS4zNi0uMDYtLjY4LS4xOC0uOTYtLjEyLS4yOC0uMjktLjUxLS41MS0uNjktLjItLjE5LS40Ny0uMzMtLjc3LS40M0M5LjEgOC4wNSA4Ljc2IDggOC4zOSA4Yy0uMzYgMC0uNjkuMDUtMSAuMTYtLjMuMTEtLjU3LjI2LS43OS40NS0uMjEuMTktLjM4LjQxLS41MS42Ny0uMTIuMjYtLjE4LjU0LS4xOC44NWgxLjNjMC0uMTcuMDMtLjMyLjA5LS40NXMuMTQtLjI1LjI1LS4zNGMuMTEtLjA5LjIzLS4xNy4zOC0uMjIuMTUtLjA1LjMtLjA4LjQ4LS4wOC40IDAgLjcuMS44OS4zMS4xOS4yLjI5LjQ5LjI5Ljg2IDAgLjE4LS4wMy4zNC0uMDguNDktLjA1LjE1LS4xNC4yNy0uMjUuMzctLjExLjEtLjI1LjE4LS40MS4yNC0uMTYuMDYtLjM2LjA5LS41OC4wOUg3LjV2MS4wM2guNzdjLjIyIDAgLjQyLjAyLjYuMDdzLjMzLjEzLjQ1LjIzYy4xMi4xMS4yMi4yNC4yOS40LjA3LjE2LjEuMzUuMS41NyAwIC40MS0uMTIuNzItLjM1LjkzLS4yMy4yMy0uNTUuMzMtLjk1LjMzem04LjU1LTUuOTJjLS4zMi0uMzMtLjctLjU5LTEuMTQtLjc3LS40My0uMTgtLjkyLS4yNy0xLjQ2LS4yN0gxMnY4aDIuM2MuNTUgMCAxLjA2LS4wOSAxLjUxLS4yNy40NS0uMTguODQtLjQzIDEuMTYtLjc2LjMyLS4zMy41Ny0uNzMuNzQtMS4xOS4xNy0uNDcuMjYtLjk5LjI2LTEuNTd2LS40YzAtLjU4LS4wOS0xLjEtLjI2LTEuNTctLjE4LS40Ny0uNDMtLjg3LS43NS0xLjJ6bS0uMzkgMy4xNmMwIC40Mi0uMDUuNzktLjE0IDEuMTMtLjEuMzMtLjI0LjYyLS40My44NS0uMTkuMjMtLjQzLjQxLS43MS41My0uMjkuMTItLjYyLjE4LS45OS4xOGgtLjkxVjkuMTJoLjk3Yy43MiAwIDEuMjcuMjMgMS42NC42OS4zOC40Ni41NyAxLjEyLjU3IDEuOTl2LjR6TTEyIDBsLS42Ni4wMyAzLjgxIDMuODEgMS4zMy0xLjMzYzMuMjcgMS41NSA1LjYxIDQuNzIgNS45NiA4LjQ4aDEuNUMyMy40NCA0Ljg0IDE4LjI5IDAgMTIgMHoiIC8+PC9nPgo8ZyBpZD0iYWNjZXNzaWJpbGl0eSI+PHBhdGggZD0iTTEyIDJjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem05IDdoLTZ2MTNoLTJ2LTZoLTJ2Nkg5VjlIM1Y3aDE4djJ6IiAvPjwvZz4KPGcgaWQ9ImFjY2Vzc2libGUiPjxjaXJjbGUgY3g9IjEyIiBjeT0iNCIgcj0iMiIgLz48cGF0aCBkPSJNMTkgMTN2LTJjLTEuNTQuMDItMy4wOS0uNzUtNC4wNy0xLjgzbC0xLjI5LTEuNDNjLS4xNy0uMTktLjM4LS4zNC0uNjEtLjQ1LS4wMSAwLS4wMS0uMDEtLjAyLS4wMUgxM2MtLjM1LS4yLS43NS0uMy0xLjE5LS4yNkMxMC43NiA3LjExIDEwIDguMDQgMTAgOS4wOVYxNWMwIDEuMS45IDIgMiAyaDV2NWgydi01LjVjMC0xLjEtLjktMi0yLTJoLTN2LTMuNDVjMS4yOSAxLjA3IDMuMjUgMS45NCA1IDEuOTV6bS02LjE3IDVjLS40MSAxLjE2LTEuNTIgMi0yLjgzIDItMS42NiAwLTMtMS4zNC0zLTMgMC0xLjMxLjg0LTIuNDEgMi0yLjgzVjEyLjFjLTIuMjguNDYtNCAyLjQ4LTQgNC45IDAgMi43NiAyLjI0IDUgNSA1IDIuNDIgMCA0LjQ0LTEuNzIgNC45LTRoLTIuMDd6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYmFsYW5jZSI+PHBhdGggZD0iTTQgMTB2N2gzdi03SDR6bTYgMHY3aDN2LTdoLTN6TTIgMjJoMTl2LTNIMnYzem0xNC0xMnY3aDN2LTdoLTN6bS00LjUtOUwyIDZ2MmgxOVY2bC05LjUtNXoiIC8+PC9nPgo8ZyBpZD0iYWNjb3VudC1iYWxhbmNlLXdhbGxldCI+PHBhdGggZD0iTTIxIDE4djFjMCAxLjEtLjkgMi0yIDJINWMtMS4xMSAwLTItLjktMi0yVjVjMC0xLjEuODktMiAyLTJoMTRjMS4xIDAgMiAuOSAyIDJ2MWgtOWMtMS4xMSAwLTIgLjktMiAydjhjMCAxLjEuODkgMiAyIDJoOXptLTktMmgxMFY4SDEydjh6bTQtMi41Yy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0iYWNjb3VudC1ib3giPjxwYXRoIGQ9Ik0zIDV2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMkg1Yy0xLjExIDAtMiAuOS0yIDJ6bTEyIDRjMCAxLjY2LTEuMzQgMy0zIDNzLTMtMS4zNC0zLTMgMS4zNC0zIDMtMyAzIDEuMzQgMyAzem0tOSA4YzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxSDZ2LTF6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptMCAxNC4yYy0yLjUgMC00LjcxLTEuMjgtNi0zLjIyLjAzLTEuOTkgNC0zLjA4IDYtMy4wOCAxLjk5IDAgNS45NyAxLjA5IDYgMy4wOC0xLjI5IDEuOTQtMy41IDMuMjItNiAzLjIyeiIgLz48L2c+CjxnIGlkPSJhZGQiPjxwYXRoIGQ9Ik0xOSAxM2gtNnY2aC0ydi02SDV2LTJoNlY1aDJ2Nmg2djJ6IiAvPjwvZz4KPGcgaWQ9ImFkZC1hbGVydCI+PHBhdGggZD0iTTEwLjAxIDIxLjAxYzAgMS4xLjg5IDEuOTkgMS45OSAxLjk5czEuOTktLjg5IDEuOTktMS45OWgtMy45OHptOC44Ny00LjE5VjExYzAtMy4yNS0yLjI1LTUuOTctNS4yOS02LjY5di0uNzJDMTMuNTkgMi43MSAxMi44OCAyIDEyIDJzLTEuNTkuNzEtMS41OSAxLjU5di43MkM3LjM3IDUuMDMgNS4xMiA3Ljc1IDUuMTIgMTF2NS44MkwzIDE4Ljk0VjIwaDE4di0xLjA2bC0yLjEyLTIuMTJ6TTE2IDEzLjAxaC0zdjNoLTJ2LTNIOFYxMWgzVjhoMnYzaDN2Mi4wMXoiIC8+PC9nPgo8ZyBpZD0iYWRkLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0yIDEwaC00djRoLTJ2LTRIN3YtMmg0VjdoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFoLTR2NGgtMnYtNEg3di0yaDRWN2gydjRoNHYyeiIgLz48L2c+CjxnIGlkPSJhZGQtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMyA3aC0ydjRIN3YyaDR2NGgydi00aDR2LTJoLTRWN3ptLTEtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImFkZC1zaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNMTEgOWgyVjZoM1Y0aC0zVjFoLTJ2M0g4djJoM3Yzem0tNCA5Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yem0xMCAwYy0xLjEgMC0xLjk5LjktMS45OSAycy44OSAyIDEuOTkgMiAyLS45IDItMi0uOS0yLTItMnptLTkuODMtMy4yNWwuMDMtLjEyLjktMS42M2g3LjQ1Yy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjg2LTcuMDFMMTkuNDIgNGgtLjAxbC0xLjEgMi0yLjc2IDVIOC41M2wtLjEzLS4yN0w2LjE2IDZsLS45NS0yLS45NC0ySDF2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTMgMC0uMjUtLjExLS4yNS0uMjV6IiAvPjwvZz4KPGcgaWQ9ImFsYXJtIj48cGF0aCBkPSJNMjIgNS43MmwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTcuODggMy4zOUw2LjYgMS44NiAyIDUuNzFsMS4yOSAxLjUzIDQuNTktMy44NXpNMTIuNSA4SDExdjZsNC43NSAyLjg1Ljc1LTEuMjMtNC0yLjM3Vjh6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3eiIgLz48L2c+CjxnIGlkPSJhbGFybS1hZGQiPjxwYXRoIGQ9Ik03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptMS0xMWgtMnYzSDh2MmgzdjNoMnYtM2gzdi0yaC0zVjl6IiAvPjwvZz4KPGcgaWQ9ImFsYXJtLW9mZiI+PHBhdGggZD0iTTEyIDZjMy44NyAwIDcgMy4xMyA3IDcgMCAuODQtLjE2IDEuNjUtLjQzIDIuNGwxLjUyIDEuNTJjLjU4LTEuMTkuOTEtMi41MS45MS0zLjkyIDAtNC45Ny00LjAzLTktOS05LTEuNDEgMC0yLjczLjMzLTMuOTIuOTFMOS42IDYuNDNDMTAuMzUgNi4xNiAxMS4xNiA2IDEyIDZ6bTEwLS4yOGwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTIuOTIgMi4yOUwxLjY1IDMuNTcgMi45OCA0LjlsLTEuMTEuOTMgMS40MiAxLjQyIDEuMTEtLjk0LjguOEMzLjgzIDguNjkgMyAxMC43NSAzIDEzYzAgNC45NyA0LjAyIDkgOSA5IDIuMjUgMCA0LjMxLS44MyA1Ljg5LTIuMmwyLjIgMi4yIDEuMjctMS4yN0wzLjg5IDMuMjdsLS45Ny0uOTh6bTEzLjU1IDE2LjFDMTUuMjYgMTkuMzkgMTMuNyAyMCAxMiAyMGMtMy44NyAwLTctMy4xMy03LTcgMC0xLjcuNjEtMy4yNiAxLjYxLTQuNDdsOS44NiA5Ljg2ek04LjAyIDMuMjhMNi42IDEuODZsLS44Ni43MSAxLjQyIDEuNDIuODYtLjcxeiIgLz48L2c+CjxnIGlkPSJhbGFybS1vbiI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3em0tMS40Ni01LjQ3TDguNDEgMTIuNGwtMS4wNiAxLjA2IDMuMTggMy4xOCA2LTYtMS4wNi0xLjA2LTQuOTMgNC45NXoiIC8+PC9nPgo8ZyBpZD0iYWxsLW91dCI+PHBhdGggZD0iTTE2LjIxIDQuMTZsNCA0di00em00IDEybC00IDRoNHptLTEyIDRsLTQtNHY0em0tNC0xMmw0LTRoLTR6bTEyLjk1LS45NWMtMi43My0yLjczLTcuMTctMi43My05LjkgMHMtMi43MyA3LjE3IDAgOS45IDcuMTcgMi43MyA5LjkgMCAyLjczLTcuMTYgMC05Ljl6bS0xLjEgOC44Yy0yLjEzIDIuMTMtNS41NyAyLjEzLTcuNyAwcy0yLjEzLTUuNTcgMC03LjcgNS41Ny0yLjEzIDcuNyAwIDIuMTMgNS41NyAwIDcuN3oiIC8+PC9nPgo8ZyBpZD0iYW5kcm9pZCI+PHBhdGggZD0iTTYgMThjMCAuNTUuNDUgMSAxIDFoMXYzLjVjMCAuODMuNjcgMS41IDEuNSAxLjVzMS41LS42NyAxLjUtMS41VjE5aDJ2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgxYy41NSAwIDEtLjQ1IDEtMVY4SDZ2MTB6TTMuNSA4QzIuNjcgOCAyIDguNjcgMiA5LjV2N2MwIC44My42NyAxLjUgMS41IDEuNVM1IDE3LjMzIDUgMTYuNXYtN0M1IDguNjcgNC4zMyA4IDMuNSA4em0xNyAwYy0uODMgMC0xLjUuNjctMS41IDEuNXY3YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNXYtN2MwLS44My0uNjctMS41LTEuNS0xLjV6bS00Ljk3LTUuODRsMS4zLTEuM2MuMi0uMi4yLS41MSAwLS43MS0uMi0uMi0uNTEtLjItLjcxIDBsLTEuNDggMS40OEMxMy44NSAxLjIzIDEyLjk1IDEgMTIgMWMtLjk2IDAtMS44Ni4yMy0yLjY2LjYzTDcuODUuMTVjLS4yLS4yLS41MS0uMi0uNzEgMC0uMi4yLS4yLjUxIDAgLjcxbDEuMzEgMS4zMUM2Ljk3IDMuMjYgNiA1LjAxIDYgN2gxMmMwLTEuOTktLjk3LTMuNzUtMi40Ny00Ljg0ek0xMCA1SDlWNGgxdjF6bTUgMGgtMVY0aDF2MXoiIC8+PC9nPgo8ZyBpZD0iYW5ub3VuY2VtZW50Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDloLTJWNWgydjZ6bTAgNGgtMnYtMmgydjJ6IiAvPjwvZz4KPGcgaWQ9ImFwcHMiPjxwYXRoIGQ9Ik00IDhoNFY0SDR2NHptNiAxMmg0di00aC00djR6bS02IDBoNHYtNEg0djR6bTAtNmg0di00SDR2NHptNiAwaDR2LTRoLTR2NHptNi0xMHY0aDRWNGgtNHptLTYgNGg0VjRoLTR2NHptNiA2aDR2LTRoLTR2NHptMCA2aDR2LTRoLTR2NHoiIC8+PC9nPgo8ZyBpZD0iYXJjaGl2ZSI+PHBhdGggZD0iTTIwLjU0IDUuMjNsLTEuMzktMS42OEMxOC44OCAzLjIxIDE4LjQ3IDMgMTggM0g2Yy0uNDcgMC0uODguMjEtMS4xNi41NUwzLjQ2IDUuMjNDMy4xNyA1LjU3IDMgNi4wMiAzIDYuNVYxOWMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjYuNWMwLS40OC0uMTctLjkzLS40Ni0xLjI3ek0xMiAxNy41TDYuNSAxMkgxMHYtMmg0djJoMy41TDEyIDE3LjV6TTUuMTIgNWwuODEtMWgxMmwuOTQgMUg1LjEyeiIgLz48L2c+CjxnIGlkPSJhcnJvdy1iYWNrIj48cGF0aCBkPSJNMjAgMTFINy44M2w1LjU5LTUuNTlMMTIgNGwtOCA4IDggOCAxLjQxLTEuNDFMNy44MyAxM0gyMHYtMnoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctZG93bndhcmQiPjxwYXRoIGQ9Ik0yMCAxMmwtMS40MS0xLjQxTDEzIDE2LjE3VjRoLTJ2MTIuMTdsLTUuNTgtNS41OUw0IDEybDggOCA4LTh6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtZG93biI+PHBhdGggZD0iTTcgMTBsNSA1IDUtNXoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMTJsLTQtNGg4bC00IDR6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtdXAiPjxwYXRoIGQ9Ik03IDE0bDUtNSA1IDV6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWZvcndhcmQiPjxwYXRoIGQ9Ik0xMiA0bC0xLjQxIDEuNDFMMTYuMTcgMTFINHYyaDEyLjE3bC01LjU4IDUuNTlMMTIgMjBsOC04eiIgLz48L2c+CjxnIGlkPSJhcnJvdy11cHdhcmQiPjxwYXRoIGQ9Ik00IDEybDEuNDEgMS40MUwxMSA3LjgzVjIwaDJWNy44M2w1LjU4IDUuNTlMMjAgMTJsLTgtOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImFzcGVjdC1yYXRpbyI+PHBhdGggZD0iTTE5IDEyaC0ydjNoLTN2Mmg1di01ek03IDloM1Y3SDV2NWgyVjl6bTE0LTZIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnoiIC8+PC9nPgo8ZyBpZD0iYXNzZXNzbWVudCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50Ij48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTIgMTRIN3YtMmg3djJ6bTMtNEg3di0yaDEwdjJ6bTAtNEg3VjdoMTB2MnoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1pbmQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMCA0YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xLjRjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xVjE5eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LWxhdGUiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS02IDE1aC0ydi0yaDJ2MnptMC00aC0yVjhoMnY2em0tMS05Yy0uNTUgMC0xLS40NS0xLTFzLjQ1LTEgMS0xIDEgLjQ1IDEgMS0uNDUgMS0xIDF6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTQgMTJoLTR2M2wtNS01IDUtNXYzaDR2NHoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1yZXR1cm5lZCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0wIDE1bC01LTVoM1Y5aDR2NGgzbC01IDV6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtdHVybmVkLWluIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bS0yIDE0bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6IiAvPjwvZz4KPGcgaWQ9ImF0dGFjaG1lbnQiPjxwYXRoIGQ9Ik0yIDEyLjVDMiA5LjQ2IDQuNDYgNyA3LjUgN0gxOGMyLjIxIDAgNCAxLjc5IDQgNHMtMS43OSA0LTQgNEg5LjVDOC4xMiAxNSA3IDEzLjg4IDcgMTIuNVM4LjEyIDEwIDkuNSAxMEgxN3YySDkuNDFjLS41NSAwLS41NSAxIDAgMUgxOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTJINy41QzUuNTcgOSA0IDEwLjU3IDQgMTIuNVM1LjU3IDE2IDcuNSAxNkgxN3YySDcuNUM0LjQ2IDE4IDIgMTUuNTQgMiAxMi41eiIgLz48L2c+CjxnIGlkPSJhdXRvcmVuZXciPjxwYXRoIGQ9Ik0xMiA2djNsNC00LTQtNHYzYy00LjQyIDAtOCAzLjU4LTggOCAwIDEuNTcuNDYgMy4wMyAxLjI0IDQuMjZMNi43IDE0LjhjLS40NS0uODMtLjctMS43OS0uNy0yLjggMC0zLjMxIDIuNjktNiA2LTZ6bTYuNzYgMS43NEwxNy4zIDkuMmMuNDQuODQuNyAxLjc5LjcgMi44IDAgMy4zMS0yLjY5IDYtNiA2di0zbC00IDQgNCA0di0zYzQuNDIgMCA4LTMuNTggOC04IDAtMS41Ny0uNDYtMy4wMy0xLjI0LTQuMjZ6IiAvPjwvZz4KPGcgaWQ9ImJhY2tzcGFjZSI+PHBhdGggZD0iTTIyIDNIN2MtLjY5IDAtMS4yMy4zNS0xLjU5Ljg4TDAgMTJsNS40MSA4LjExYy4zNi41My45Ljg5IDEuNTkuODloMTVjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTMgMTIuNTlMMTcuNTkgMTcgMTQgMTMuNDEgMTAuNDEgMTcgOSAxNS41OSAxMi41OSAxMiA5IDguNDEgMTAuNDEgNyAxNCAxMC41OSAxNy41OSA3IDE5IDguNDEgMTUuNDEgMTIgMTkgMTUuNTl6IiAvPjwvZz4KPGcgaWQ9ImJhY2t1cCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6IiAvPjwvZz4KPGcgaWQ9ImJsb2NrIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNNCAxMmMwLTQuNDIgMy41OC04IDgtOCAxLjg1IDAgMy41NS42MyA0LjkgMS42OUw1LjY5IDE2LjlDNC42MyAxNS41NSA0IDEzLjg1IDQgMTJ6bTggOGMtMS44NSAwLTMuNTUtLjYzLTQuOS0xLjY5TDE4LjMxIDcuMUMxOS4zNyA4LjQ1IDIwIDEwLjE1IDIwIDEyYzAgNC40Mi0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJib29rIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiIgLz48L2c+CjxnIGlkPSJib29rbWFyayI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iYm9va21hcmstYm9yZGVyIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiIgLz48L2c+CjxnIGlkPSJidWctcmVwb3J0Ij48cGF0aCBkPSJNMjAgOGgtMi44MWMtLjQ1LS43OC0xLjA3LTEuNDUtMS44Mi0xLjk2TDE3IDQuNDEgMTUuNTkgM2wtMi4xNyAyLjE3QzEyLjk2IDUuMDYgMTIuNDkgNSAxMiA1Yy0uNDkgMC0uOTYuMDYtMS40MS4xN0w4LjQxIDMgNyA0LjQxbDEuNjIgMS42M0M3Ljg4IDYuNTUgNy4yNiA3LjIyIDYuODEgOEg0djJoMi4wOWMtLjA1LjMzLS4wOS42Ni0uMDkgMXYxSDR2MmgydjFjMCAuMzQuMDQuNjcuMDkgMUg0djJoMi44MWMxLjA0IDEuNzkgMi45NyAzIDUuMTkgM3M0LjE1LTEuMjEgNS4xOS0zSDIwdi0yaC0yLjA5Yy4wNS0uMzMuMDktLjY2LjA5LTF2LTFoMnYtMmgtMnYtMWMwLS4zNC0uMDQtLjY3LS4wOS0xSDIwVjh6bS02IDhoLTR2LTJoNHYyem0wLTRoLTR2LTJoNHYyeiIgLz48L2c+CjxnIGlkPSJidWlsZCI+PHBhdGggZD0iTTIyLjcgMTlsLTkuMS05LjFjLjktMi4zLjQtNS0xLjUtNi45LTItMi01LTIuNC03LjQtMS4zTDkgNiA2IDkgMS42IDQuN0MuNCA3LjEuOSAxMC4xIDIuOSAxMi4xYzEuOSAxLjkgNC42IDIuNCA2LjkgMS41bDkuMSA5LjFjLjQuNCAxIC40IDEuNCAwbDIuMy0yLjNjLjUtLjQuNS0xLjEuMS0xLjR6IiAvPjwvZz4KPGcgaWQ9ImNhY2hlZCI+PHBhdGggZD0iTTE5IDhsLTQgNGgzYzAgMy4zMS0yLjY5IDYtNiA2LTEuMDEgMC0xLjk3LS4yNS0yLjgtLjdsLTEuNDYgMS40NkM4Ljk3IDE5LjU0IDEwLjQzIDIwIDEyIDIwYzQuNDIgMCA4LTMuNTggOC04aDNsLTQtNHpNNiAxMmMwLTMuMzEgMi42OS02IDYtNiAxLjAxIDAgMS45Ny4yNSAyLjguN2wxLjQ2LTEuNDZDMTUuMDMgNC40NiAxMy41NyA0IDEyIDRjLTQuNDIgMC04IDMuNTgtOCA4SDFsNCA0IDQtNEg2eiIgLz48L2c+CjxnIGlkPSJjYW1lcmEtZW5oYW5jZSI+PHBhdGggZD0iTTkgM0w3LjE3IDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yaC0zLjE3TDE1IDNIOXptMyAxNWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6bTAtMWwxLjI1LTIuNzVMMTYgMTNsLTIuNzUtMS4yNUwxMiA5bC0xLjI1IDIuNzVMOCAxM2wyLjc1IDEuMjV6IiAvPjwvZz4KPGcgaWQ9ImNhbmNlbCI+PHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTUgMTMuNTlMMTUuNTkgMTcgMTIgMTMuNDEgOC40MSAxNyA3IDE1LjU5IDEwLjU5IDEyIDcgOC40MSA4LjQxIDcgMTIgMTAuNTkgMTUuNTkgNyAxNyA4LjQxIDEzLjQxIDEyIDE3IDE1LjU5eiIgLz48L2c+CjxnIGlkPSJjYXJkLWdpZnRjYXJkIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6IiAvPjwvZz4KPGcgaWQ9ImNhcmQtbWVtYmVyc2hpcCI+PHBhdGggZD0iTTIwIDJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoNHY1bDQtMiA0IDJ2LTVoNGMxLjExIDAgMi0uODkgMi0yVjRjMC0xLjExLS44OS0yLTItMnptMCAxM0g0di0yaDE2djJ6bTAtNUg0VjRoMTZ2NnoiIC8+PC9nPgo8ZyBpZD0iY2FyZC10cmF2ZWwiPjxwYXRoIGQ9Ik0yMCA2aC0zVjRjMC0xLjExLS44OS0yLTItMkg5Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6TTkgNGg2djJIOVY0em0xMSAxNUg0di0yaDE2djJ6bTAtNUg0VjhoM3YyaDJWOGg2djJoMlY4aDN2NnoiIC8+PC9nPgo8ZyBpZD0iY2hhbmdlLWhpc3RvcnkiPjxwYXRoIGQ9Ik0xMiA3Ljc3TDE4LjM5IDE4SDUuNjFMMTIgNy43N00xMiA0TDIgMjBoMjBMMTIgNHoiIC8+PC9nPgo8ZyBpZD0iY2hlY2siPjxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiIC8+PC9nPgo8ZyBpZD0iY2hlY2stYm94Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjkgMi0yVjVjMC0xLjEtLjg5LTItMi0yem0tOSAxNGwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiIgLz48L2c+CjxnIGlkPSJjaGVjay1ib3gtb3V0bGluZS1ibGFuayI+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0yIDE1bC01LTUgMS40MS0xLjQxTDEwIDE0LjE3bDcuNTktNy41OUwxOSA4bC05IDl6IiAvPjwvZz4KPGcgaWQ9ImNoZXZyb24tbGVmdCI+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNoZXZyb24tcmlnaHQiPjxwYXRoIGQ9Ik0xMCA2TDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiIC8+PC9nPgo8ZyBpZD0iY2hyb21lLXJlYWRlci1tb2RlIj48cGF0aCBkPSJNMTMgMTJoN3YxLjVoLTd6bTAtMi41aDdWMTFoLTd6bTAgNWg3VjE2aC03ek0yMSA0SDNjLTEuMSAwLTIgLjktMiAydjEzYzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNWgtOVY2aDl2MTN6IiAvPjwvZz4KPGcgaWQ9ImNsYXNzIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiIgLz48L2c+CjxnIGlkPSJjbGVhciI+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiIC8+PC9nPgo8ZyBpZD0iY2xvc2UiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem00LjUgMTRIOGMtMS42NiAwLTMtMS4zNC0zLTNzMS4zNC0zIDMtM2wuMTQuMDFDOC41OCA4LjI4IDEwLjEzIDcgMTIgN2MyLjIxIDAgNCAxLjc5IDQgNGguNWMxLjM4IDAgMi41IDEuMTIgMi41IDIuNVMxNy44OCAxNiAxNi41IDE2eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1kb25lIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xMCAxN2wtMy41LTMuNSAxLjQxLTEuNDFMMTAgMTQuMTcgMTUuMTggOWwxLjQxIDEuNDFMMTAgMTd6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLWRvd25sb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNyAxM2wtNSA1LTUtNWgzVjloNHY0aDN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLW9mZiI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0Yy0xLjQ4IDAtMi44NS40My00LjAxIDEuMTdsMS40NiAxLjQ2QzEwLjIxIDYuMjMgMTEuMDggNiAxMiA2YzMuMDQgMCA1LjUgMi40NiA1LjUgNS41di41SDE5YzEuNjYgMCAzIDEuMzQgMyAzIDAgMS4xMy0uNjQgMi4xMS0xLjU2IDIuNjJsMS40NSAxLjQ1QzIzLjE2IDE4LjE2IDI0IDE2LjY4IDI0IDE1YzAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0zIDUuMjdsMi43NSAyLjc0QzIuNTYgOC4xNSAwIDEwLjc3IDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTEuNzNsMiAyTDIxIDIwLjczIDQuMjcgNCAzIDUuMjd6TTcuNzMgMTBsOCA4SDZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTRoMS43M3oiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtcXVldWUiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE5IDE4SDZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTRoLjcxQzcuMzcgNy42OSA5LjQ4IDYgMTIgNmMzLjA0IDAgNS41IDIuNDYgNS41IDUuNXYuNUgxOWMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgM3oiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtdXBsb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNCAxM3Y0aC00di00SDdsNS01IDUgNWgtM3oiIC8+PC9nPgo8ZyBpZD0iY29kZSI+PHBhdGggZD0iTTkuNCAxNi42TDQuOCAxMmw0LjYtNC42TDggNmwtNiA2IDYgNiAxLjQtMS40em01LjIgMGw0LjYtNC42LTQuNi00LjZMMTYgNmw2IDYtNiA2LTEuNC0xLjR6IiAvPjwvZz4KPGcgaWQ9ImNvbXBhcmUtYXJyb3dzIj48cGF0aCBkPSJNOS4wMSAxNEgydjJoNy4wMXYzTDEzIDE1bC0zLjk5LTR2M3ptNS45OC0xdi0zSDIyVjhoLTcuMDFWNUwxMSA5bDMuOTkgNHoiIC8+PC9nPgo8ZyBpZD0iY29udGVudC1jb3B5Ij48cGF0aCBkPSJNMTYgMUg0Yy0xLjEgMC0yIC45LTIgMnYxNGgyVjNoMTJWMXptMyA0SDhjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTFjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptMCAxNkg4VjdoMTF2MTR6IiAvPjwvZz4KPGcgaWQ9ImNvbnRlbnQtY3V0Ij48cGF0aCBkPSJNOS42NCA3LjY0Yy4yMy0uNS4zNi0xLjA1LjM2LTEuNjQgMC0yLjIxLTEuNzktNC00LTRTMiAzLjc5IDIgNnMxLjc5IDQgNCA0Yy41OSAwIDEuMTQtLjEzIDEuNjQtLjM2TDEwIDEybC0yLjM2IDIuMzZDNy4xNCAxNC4xMyA2LjU5IDE0IDYgMTRjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNGMwLS41OS0uMTMtMS4xNC0uMzYtMS42NEwxMiAxNGw3IDdoM3YtMUw5LjY0IDcuNjR6TTYgOGMtMS4xIDAtMi0uODktMi0ycy45LTIgMi0yIDIgLjg5IDIgMi0uOSAyLTIgMnptMCAxMmMtMS4xIDAtMi0uODktMi0ycy45LTIgMi0yIDIgLjg5IDIgMi0uOSAyLTIgMnptNi03LjVjLS4yOCAwLS41LS4yMi0uNS0uNXMuMjItLjUuNS0uNS41LjIyLjUuNS0uMjIuNS0uNS41ek0xOSAzbC02IDYgMiAyIDctN1YzeiIgLz48L2c+CjxnIGlkPSJjb250ZW50LXBhc3RlIj48cGF0aCBkPSJNMTkgMmgtNC4xOEMxNC40Ljg0IDEzLjMgMCAxMiAwYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem03IDE4SDVWNGgydjNoMTBWNGgydjE2eiIgLz48L2c+CjxnIGlkPSJjb3B5cmlnaHQiPjxwYXRoIGQ9Ik0xMC4wOCAxMC44NmMuMDUtLjMzLjE2LS42Mi4zLS44N3MuMzQtLjQ2LjU5LS42MmMuMjQtLjE1LjU0LS4yMi45MS0uMjMuMjMuMDEuNDQuMDUuNjMuMTMuMi4wOS4zOC4yMS41Mi4zNnMuMjUuMzMuMzQuNTMuMTMuNDIuMTQuNjRoMS43OWMtLjAyLS40Ny0uMTEtLjktLjI4LTEuMjlzLS40LS43My0uNy0xLjAxLS42Ni0uNS0xLjA4LS42Ni0uODgtLjIzLTEuMzktLjIzYy0uNjUgMC0xLjIyLjExLTEuNy4zNHMtLjg4LjUzLTEuMi45Mi0uNTYuODQtLjcxIDEuMzZTOCAxMS4yOSA4IDExLjg3di4yN2MwIC41OC4wOCAxLjEyLjIzIDEuNjRzLjM5Ljk3LjcxIDEuMzUuNzIuNjkgMS4yLjkxIDEuMDUuMzQgMS43LjM0Yy40NyAwIC45MS0uMDggMS4zMi0uMjNzLjc3LS4zNiAxLjA4LS42My41Ni0uNTguNzQtLjk0LjI5LS43NC4zLTEuMTVoLTEuNzljLS4wMS4yMS0uMDYuNC0uMTUuNThzLS4yMS4zMy0uMzYuNDYtLjMyLjIzLS41Mi4zYy0uMTkuMDctLjM5LjA5LS42LjEtLjM2LS4wMS0uNjYtLjA4LS44OS0uMjMtLjI1LS4xNi0uNDUtLjM3LS41OS0uNjJzLS4yNS0uNTUtLjMtLjg4LS4wOC0uNjctLjA4LTF2LS4yN2MwLS4zNS4wMy0uNjguMDgtMS4wMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImNyZWF0ZSI+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiIC8+PC9nPgo8ZyBpZD0iY3JlYXRlLW5ldy1mb2xkZXIiPjxwYXRoIGQ9Ik0yMCA2aC04bC0yLTJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tMSA4aC0zdjNoLTJ2LTNoLTN2LTJoM1Y5aDJ2M2gzdjJ6IiAvPjwvZz4KPGcgaWQ9ImNyZWRpdC1jYXJkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiIgLz48L2c+CjxnIGlkPSJkYXNoYm9hcmQiPjxwYXRoIGQ9Ik0zIDEzaDhWM0gzdjEwem0wIDhoOHYtNkgzdjZ6bTEwIDBoOFYxMWgtOHYxMHptMC0xOHY2aDhWM2gtOHoiIC8+PC9nPgo8ZyBpZD0iZGF0ZS1yYW5nZSI+PHBhdGggZD0iTTkgMTFIN3YyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTItN2gtMVYyaC0ydjJIOFYySDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDIwYzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY5aDE0djExeiIgLz48L2c+CjxnIGlkPSJkZWxldGUiPjxwYXRoIGQ9Ik02IDE5YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlY3SDZ2MTJ6TTE5IDRoLTMuNWwtMS0xaC01bC0xIDFINXYyaDE0VjR6IiAvPjwvZz4KPGcgaWQ9ImRlbGV0ZS1mb3JldmVyIj48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz48L2c+CjxnIGlkPSJkZWxldGUtc3dlZXAiPjxwYXRoIGQ9Ik0xNSAxNmg0djJoLTR6bTAtOGg3djJoLTd6bTAgNGg2djJoLTZ6TTMgMThjMCAxLjEuOSAyIDIgMmg2YzEuMSAwIDItLjkgMi0yVjhIM3YxMHpNMTQgNWgtM2wtMS0xSDZMNSA1SDJ2MmgxMnoiIC8+PC9nPgo8ZyBpZD0iZGVzY3JpcHRpb24iPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bTIgMTZIOHYtMmg4djJ6bTAtNEg4di0yaDh2MnptLTMtNVYzLjVMMTguNSA5SDEzeiIgLz48L2c+CjxnIGlkPSJkbnMiPjxwYXRoIGQ9Ik0yMCAxM0g0Yy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxNmMuNTUgMCAxLS40NSAxLTF2LTZjMC0uNTUtLjQ1LTEtMS0xek03IDE5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNMjAgM0g0Yy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxNmMuNTUgMCAxLS40NSAxLTFWNGMwLS41NS0uNDUtMS0xLTF6TTcgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6IiAvPjwvZz4KPGcgaWQ9ImRvbmUiPjxwYXRoIGQ9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6IiAvPjwvZz4KPGcgaWQ9ImRvbmUtYWxsIj48cGF0aCBkPSJNMTggN2wtMS40MS0xLjQxLTYuMzQgNi4zNCAxLjQxIDEuNDFMMTggN3ptNC4yNC0xLjQxTDExLjY2IDE2LjE3IDcuNDggMTJsLTEuNDEgMS40MUwxMS42NiAxOWwxMi0xMi0xLjQyLTEuNDF6TS40MSAxMy40MUw2IDE5bDEuNDEtMS40MUwxLjgzIDEyIC40MSAxMy40MXoiIC8+PC9nPgo8ZyBpZD0iZG9udXQtbGFyZ2UiPjxwYXRoIGQ9Ik0xMSA1LjA4VjJjLTUgLjUtOSA0LjgxLTkgMTBzNCA5LjUgOSAxMHYtMy4wOGMtMy0uNDgtNi0zLjQtNi02LjkyczMtNi40NCA2LTYuOTJ6TTE4Ljk3IDExSDIyYy0uNDctNS00LTguNTMtOS05djMuMDhDMTYgNS41MSAxOC41NCA4IDE4Ljk3IDExek0xMyAxOC45MlYyMmM1LS40NyA4LjUzLTQgOS05aC0zLjAzYy0uNDMgMy0yLjk3IDUuNDktNS45NyA1LjkyeiIgLz48L2c+CjxnIGlkPSJkb251dC1zbWFsbCI+PHBhdGggZD0iTTExIDkuMTZWMmMtNSAuNS05IDQuNzktOSAxMHM0IDkuNSA5IDEwdi03LjE2Yy0xLS40MS0yLTEuNTItMi0yLjg0czEtMi40MyAyLTIuODR6TTE0Ljg2IDExSDIyYy0uNDgtNC43NS00LTguNTMtOS05djcuMTZjMSAuMyAxLjUyLjk4IDEuODYgMS44NHpNMTMgMTQuODRWMjJjNS0uNDcgOC41Mi00LjI1IDktOWgtNy4xNGMtLjM0Ljg2LS44NiAxLjU0LTEuODYgMS44NHoiIC8+PC9nPgo8ZyBpZD0iZHJhZnRzIj48cGF0aCBkPSJNMjEuOTkgOGMwLS43Mi0uMzctMS4zNS0uOTQtMS43TDEyIDEgMi45NSA2LjNDMi4zOCA2LjY1IDIgNy4yOCAyIDh2MTBjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMmwtLjAxLTEwek0xMiAxM0wzLjc0IDcuODQgMTIgM2w4LjI2IDQuODRMMTIgMTN6IiAvPjwvZz4KPGcgaWQ9ImVqZWN0Ij48cGF0aCBkPSJNNSAxN2gxNHYySDV6bTctMTJMNS4zMyAxNWgxMy4zNHoiIC8+PC9nPgo8ZyBpZD0iZXJyb3IiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJlcnJvci1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTVoMnYyaC0yem0wLThoMnY2aC0yem0uOTktNUM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJldXJvLXN5bWJvbCI+PHBhdGggZD0iTTE1IDE4LjVjLTIuNTEgMC00LjY4LTEuNDItNS43Ni0zLjVIMTV2LTJIOC41OGMtLjA1LS4zMy0uMDgtLjY2LS4wOC0xcy4wMy0uNjcuMDgtMUgxNVY5SDkuMjRDMTAuMzIgNi45MiAxMi41IDUuNSAxNSA1LjVjMS42MSAwIDMuMDkuNTkgNC4yMyAxLjU3TDIxIDUuM0MxOS40MSAzLjg3IDE3LjMgMyAxNSAzYy0zLjkyIDAtNy4yNCAyLjUxLTguNDggNkgzdjJoMy4wNmMtLjA0LjMzLS4wNi42Ni0uMDYgMSAwIC4zNC4wMi42Ny4wNiAxSDN2MmgzLjUyYzEuMjQgMy40OSA0LjU2IDYgOC40OCA2IDIuMzEgMCA0LjQxLS44NyA2LTIuM2wtMS43OC0xLjc3Yy0xLjEzLjk4LTIuNiAxLjU3LTQuMjIgMS41N3oiIC8+PC9nPgo8ZyBpZD0iZXZlbnQiPjxwYXRoIGQ9Ik0xNyAxMmgtNXY1aDV2LTV6TTE2IDF2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMmgtMVYxaC0yem0zIDE4SDVWOGgxNHYxMXoiIC8+PC9nPgo8ZyBpZD0iZXZlbnQtc2VhdCI+PHBhdGggZD0iTTQgMTh2M2gzdi0zaDEwdjNoM3YtNkg0em0xNS04aDN2M2gtM3pNMiAxMGgzdjNIMnptMTUgM0g3VjVjMC0xLjEuOS0yIDItMmg2YzEuMSAwIDIgLjkgMiAydjh6IiAvPjwvZz4KPGcgaWQ9ImV4aXQtdG8tYXBwIj48cGF0aCBkPSJNMTAuMDkgMTUuNTlMMTEuNSAxN2w1LTUtNS01LTEuNDEgMS40MUwxMi42NyAxMUgzdjJoOS42N2wtMi41OCAyLjU5ek0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnY0aDJWNWgxNHYxNEg1di00SDN2NGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJleHBhbmQtbGVzcyI+PHBhdGggZD0iTTEyIDhsLTYgNiAxLjQxIDEuNDFMMTIgMTAuODNsNC41OSA0LjU4TDE4IDE0eiIgLz48L2c+CjxnIGlkPSJleHBhbmQtbW9yZSI+PHBhdGggZD0iTTE2LjU5IDguNTlMMTIgMTMuMTcgNy40MSA4LjU5IDYgMTBsNiA2IDYtNnoiIC8+PC9nPgo8ZyBpZD0iZXhwbG9yZSI+PHBhdGggZD0iTTEyIDEwLjljLS42MSAwLTEuMS40OS0xLjEgMS4xcy40OSAxLjEgMS4xIDEuMWMuNjEgMCAxLjEtLjQ5IDEuMS0xLjFzLS40OS0xLjEtMS4xLTEuMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMi4xOSAxMi4xOUw2IDE4bDMuODEtOC4xOUwxOCA2bC0zLjgxIDguMTl6IiAvPjwvZz4KPGcgaWQ9ImV4dGVuc2lvbiI+PHBhdGggZD0iTTIwLjUgMTFIMTlWN2MwLTEuMS0uOS0yLTItMmgtNFYzLjVDMTMgMi4xMiAxMS44OCAxIDEwLjUgMVM4IDIuMTIgOCAzLjVWNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAydjMuOEgzLjVjMS40OSAwIDIuNyAxLjIxIDIuNyAyLjdzLTEuMjEgMi43LTIuNyAyLjdIMlYyMGMwIDEuMS45IDIgMiAyaDMuOHYtMS41YzAtMS40OSAxLjIxLTIuNyAyLjctMi43IDEuNDkgMCAyLjcgMS4yMSAyLjcgMi43VjIySDE3YzEuMSAwIDItLjkgMi0ydi00aDEuNWMxLjM4IDAgMi41LTEuMTIgMi41LTIuNVMyMS44OCAxMSAyMC41IDExeiIgLz48L2c+CjxnIGlkPSJmYWNlIj48cGF0aCBkPSJNOSAxMS43NWMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6bTYgMGMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04IDAtLjI5LjAyLS41OC4wNS0uODYgMi4zNi0xLjA1IDQuMjMtMi45OCA1LjIxLTUuMzdDMTEuMDcgOC4zMyAxNC4wNSAxMCAxNy40MiAxMGMuNzggMCAxLjUzLS4wOSAyLjI1LS4yNi4yMS43MS4zMyAxLjQ3LjMzIDIuMjYgMCA0LjQxLTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImZhdm9yaXRlIj48cGF0aCBkPSJNMTIgMjEuMzVsLTEuNDUtMS4zMkM1LjQgMTUuMzYgMiAxMi4yOCAyIDguNSAyIDUuNDIgNC40MiAzIDcuNSAzYzEuNzQgMCAzLjQxLjgxIDQuNSAyLjA5QzEzLjA5IDMuODEgMTQuNzYgMyAxNi41IDMgMTkuNTggMyAyMiA1LjQyIDIyIDguNWMwIDMuNzgtMy40IDYuODYtOC41NSAxMS41NEwxMiAyMS4zNXoiIC8+PC9nPgo8ZyBpZD0iZmF2b3JpdGUtYm9yZGVyIj48cGF0aCBkPSJNMTYuNSAzYy0xLjc0IDAtMy40MS44MS00LjUgMi4wOUMxMC45MSAzLjgxIDkuMjQgMyA3LjUgMyA0LjQyIDMgMiA1LjQyIDIgOC41YzAgMy43OCAzLjQgNi44NiA4LjU1IDExLjU0TDEyIDIxLjM1bDEuNDUtMS4zMkMxOC42IDE1LjM2IDIyIDEyLjI4IDIyIDguNSAyMiA1LjQyIDE5LjU4IDMgMTYuNSAzem0tNC40IDE1LjU1bC0uMS4xLS4xLS4xQzcuMTQgMTQuMjQgNCAxMS4zOSA0IDguNSA0IDYuNSA1LjUgNSA3LjUgNWMxLjU0IDAgMy4wNC45OSAzLjU3IDIuMzZoMS44N0MxMy40NiA1Ljk5IDE0Ljk2IDUgMTYuNSA1YzIgMCAzLjUgMS41IDMuNSAzLjUgMCAyLjg5LTMuMTQgNS43NC03LjkgMTAuMDV6IiAvPjwvZz4KPGcgaWQ9ImZlZWRiYWNrIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDEyaC0ydi0yaDJ2MnptMC00aC0yVjZoMnY0eiIgLz48L2c+CjxnIGlkPSJmaWxlLWRvd25sb2FkIj48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJmaWxlLXVwbG9hZCI+PHBhdGggZD0iTTkgMTZoNnYtNmg0bC03LTctNyA3aDR6bS00IDJoMTR2Mkg1eiIgLz48L2c+CjxnIGlkPSJmaWx0ZXItbGlzdCI+PHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiIgLz48L2c+CjxnIGlkPSJmaW5kLWluLXBhZ2UiPjxwYXRoIGQ9Ik0yMCAxOS41OVY4bC02LTZINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4Yy40NSAwIC44NS0uMTUgMS4xOS0uNGwtNC40My00LjQzYy0uOC41Mi0xLjc0LjgzLTIuNzYuODMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1YzAgMS4wMi0uMzEgMS45Ni0uODMgMi43NUwyMCAxOS41OXpNOSAxM2MwIDEuNjYgMS4zNCAzIDMgM3MzLTEuMzQgMy0zLTEuMzQtMy0zLTMtMyAxLjM0LTMgM3oiIC8+PC9nPgo8ZyBpZD0iZmluZC1yZXBsYWNlIj48cGF0aCBkPSJNMTEgNmMxLjM4IDAgMi42My41NiAzLjU0IDEuNDZMMTIgMTBoNlY0bC0yLjA1IDIuMDVDMTQuNjggNC43OCAxMi45MyA0IDExIDRjLTMuNTMgMC02LjQzIDIuNjEtNi45MiA2SDYuMWMuNDYtMi4yOCAyLjQ4LTQgNC45LTR6bTUuNjQgOS4xNGMuNjYtLjkgMS4xMi0xLjk3IDEuMjgtMy4xNEgxNS45Yy0uNDYgMi4yOC0yLjQ4IDQtNC45IDQtMS4zOCAwLTIuNjMtLjU2LTMuNTQtMS40NkwxMCAxMkg0djZsMi4wNS0yLjA1QzcuMzIgMTcuMjIgOS4wNyAxOCAxMSAxOGMxLjU1IDAgMi45OC0uNTEgNC4xNC0xLjM2TDIwIDIxLjQ5IDIxLjQ5IDIwbC00Ljg1LTQuODZ6IiAvPjwvZz4KPGcgaWQ9ImZpbmdlcnByaW50Ij48cGF0aCBkPSJNMTcuODEgNC40N2MtLjA4IDAtLjE2LS4wMi0uMjMtLjA2QzE1LjY2IDMuNDIgMTQgMyAxMi4wMSAzYy0xLjk4IDAtMy44Ni40Ny01LjU3IDEuNDEtLjI0LjEzLS41NC4wNC0uNjgtLjItLjEzLS4yNC0uMDQtLjU1LjItLjY4QzcuODIgMi41MiA5Ljg2IDIgMTIuMDEgMmMyLjEzIDAgMy45OS40NyA2LjAzIDEuNTIuMjUuMTMuMzQuNDMuMjEuNjctLjA5LjE4LS4yNi4yOC0uNDQuMjh6TTMuNSA5LjcyYy0uMSAwLS4yLS4wMy0uMjktLjA5LS4yMy0uMTYtLjI4LS40Ny0uMTItLjcuOTktMS40IDIuMjUtMi41IDMuNzUtMy4yN0M5Ljk4IDQuMDQgMTQgNC4wMyAxNy4xNSA1LjY1YzEuNS43NyAyLjc2IDEuODYgMy43NSAzLjI1LjE2LjIyLjExLjU0LS4xMi43LS4yMy4xNi0uNTQuMTEtLjctLjEyLS45LTEuMjYtMi4wNC0yLjI1LTMuMzktMi45NC0yLjg3LTEuNDctNi41NC0xLjQ3LTkuNC4wMS0xLjM2LjctMi41IDEuNy0zLjQgMi45Ni0uMDguMTQtLjIzLjIxLS4zOS4yMXptNi4yNSAxMi4wN2MtLjEzIDAtLjI2LS4wNS0uMzUtLjE1LS44Ny0uODctMS4zNC0xLjQzLTIuMDEtMi42NC0uNjktMS4yMy0xLjA1LTIuNzMtMS4wNS00LjM0IDAtMi45NyAyLjU0LTUuMzkgNS42Ni01LjM5czUuNjYgMi40MiA1LjY2IDUuMzljMCAuMjgtLjIyLjUtLjUuNXMtLjUtLjIyLS41LS41YzAtMi40Mi0yLjA5LTQuMzktNC42Ni00LjM5LTIuNTcgMC00LjY2IDEuOTctNC42NiA0LjM5IDAgMS40NC4zMiAyLjc3LjkzIDMuODUuNjQgMS4xNSAxLjA4IDEuNjQgMS44NSAyLjQyLjE5LjIuMTkuNTEgMCAuNzEtLjExLjEtLjI0LjE1LS4zNy4xNXptNy4xNy0xLjg1Yy0xLjE5IDAtMi4yNC0uMy0zLjEtLjg5LTEuNDktMS4wMS0yLjM4LTIuNjUtMi4zOC00LjM5IDAtLjI4LjIyLS41LjUtLjVzLjUuMjIuNS41YzAgMS40MS43MiAyLjc0IDEuOTQgMy41Ni43MS40OCAxLjU0LjcxIDIuNTQuNzEuMjQgMCAuNjQtLjAzIDEuMDQtLjEuMjctLjA1LjUzLjEzLjU4LjQxLjA1LjI3LS4xMy41My0uNDEuNTgtLjU3LjExLTEuMDcuMTItMS4yMS4xMnpNMTQuOTEgMjJjLS4wNCAwLS4wOS0uMDEtLjEzLS4wMi0xLjU5LS40NC0yLjYzLTEuMDMtMy43Mi0yLjEtMS40LTEuMzktMi4xNy0zLjI0LTIuMTctNS4yMiAwLTEuNjIgMS4zOC0yLjk0IDMuMDgtMi45NCAxLjcgMCAzLjA4IDEuMzIgMy4wOCAyLjk0IDAgMS4wNy45MyAxLjk0IDIuMDggMS45NHMyLjA4LS44NyAyLjA4LTEuOTRjMC0zLjc3LTMuMjUtNi44My03LjI1LTYuODMtMi44NCAwLTUuNDQgMS41OC02LjYxIDQuMDMtLjM5LjgxLS41OSAxLjc2LS41OSAyLjggMCAuNzguMDcgMi4wMS42NyAzLjYxLjEuMjYtLjAzLjU1LS4yOS42NC0uMjYuMS0uNTUtLjA0LS42NC0uMjktLjQ5LTEuMzEtLjczLTIuNjEtLjczLTMuOTYgMC0xLjIuMjMtMi4yOS42OC0zLjI0IDEuMzMtMi43OSA0LjI4LTQuNiA3LjUxLTQuNiA0LjU1IDAgOC4yNSAzLjUxIDguMjUgNy44MyAwIDEuNjItMS4zOCAyLjk0LTMuMDggMi45NHMtMy4wOC0xLjMyLTMuMDgtMi45NGMwLTEuMDctLjkzLTEuOTQtMi4wOC0xLjk0cy0yLjA4Ljg3LTIuMDggMS45NGMwIDEuNzEuNjYgMy4zMSAxLjg3IDQuNTEuOTUuOTQgMS44NiAxLjQ2IDMuMjcgMS44NS4yNy4wNy40Mi4zNS4zNS42MS0uMDUuMjMtLjI2LjM4LS40Ny4zOHoiIC8+PC9nPgo8ZyBpZD0iZmlyc3QtcGFnZSI+PHBhdGggZD0iTTE4LjQxIDE2LjU5TDEzLjgyIDEybDQuNTktNC41OUwxNyA2bC02IDYgNiA2ek02IDZoMnYxMkg2eiIgLz48L2c+CjxnIGlkPSJmbGFnIj48cGF0aCBkPSJNMTQuNCA2TDE0IDRINXYxN2gydi03aDUuNmwuNCAyaDdWNnoiIC8+PC9nPgo8ZyBpZD0iZmxpZ2h0LWxhbmQiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTcuMTgtNS43M2w0LjM1IDEuMTYgNS4zMSAxLjQyYy44LjIxIDEuNjItLjI2IDEuODQtMS4wNi4yMS0uOC0uMjYtMS42Mi0xLjA2LTEuODRsLTUuMzEtMS40Mi0yLjc2LTkuMDJMMTAuMTIgMnY4LjI4TDUuMTUgOC45NWwtLjkzLTIuMzItMS40NS0uMzl2NS4xN2wxLjYuNDMgNS4zMSAxLjQzeiIgLz48L2c+CjxnIGlkPSJmbGlnaHQtdGFrZW9mZiI+PHBhdGggZD0iTTIuNSAxOWgxOXYyaC0xOXptMTkuNTctOS4zNmMtLjIxLS44LTEuMDQtMS4yOC0xLjg0LTEuMDZMMTQuOTIgMTBsLTYuOS02LjQzLTEuOTMuNTEgNC4xNCA3LjE3LTQuOTcgMS4zMy0xLjk3LTEuNTQtMS40NS4zOSAxLjgyIDMuMTYuNzcgMS4zMyAxLjYtLjQzIDUuMzEtMS40MiA0LjM1LTEuMTZMMjEgMTEuNDljLjgxLS4yMyAxLjI4LTEuMDUgMS4wNy0xLjg1eiIgLz48L2c+CjxnIGlkPSJmbGlwLXRvLWJhY2siPjxwYXRoIGQ9Ik05IDdIN3YyaDJWN3ptMCA0SDd2Mmgydi0yem0wLThjLTEuMTEgMC0yIC45LTIgMmgyVjN6bTQgMTJoLTJ2Mmgydi0yem02LTEydjJoMmMwLTEuMS0uOS0yLTItMnptLTYgMGgtMnYyaDJWM3pNOSAxN3YtMkg3YzAgMS4xLjg5IDIgMiAyem0xMC00aDJ2LTJoLTJ2MnptMC00aDJWN2gtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnpNNSA3SDN2MTJjMCAxLjEuODkgMiAyIDJoMTJ2LTJINVY3em0xMC0yaDJWM2gtMnYyem0wIDEyaDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iZmxpcC10by1mcm9udCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMiA0di0ySDNjMCAxLjEuODkgMiAyIDJ6TTMgOWgyVjdIM3Yyem0xMiAxMmgydi0yaC0ydjJ6bTQtMThIOWMtMS4xMSAwLTIgLjktMiAydjEwYzAgMS4xLjg5IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJIOVY1aDEwdjEwem0tOCA2aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnoiIC8+PC9nPgo8ZyBpZD0iZm9sZGVyIj48cGF0aCBkPSJNMTAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yaC04bC0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImZvbGRlci1vcGVuIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bTAgMTJINFY4aDE2djEweiIgLz48L2c+CjxnIGlkPSJmb2xkZXItc2hhcmVkIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS01IDNjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem00IDhoLTh2LTFjMC0xLjMzIDIuNjctMiA0LTJzNCAuNjcgNCAydjF6IiAvPjwvZz4KPGcgaWQ9ImZvbnQtZG93bmxvYWQiPjxwYXRoIGQ9Ik05LjkzIDEzLjVoNC4xNEwxMiA3Ljk4ek0yMCAySDRjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTQuMDUgMTYuNWwtMS4xNC0zSDkuMTdsLTEuMTIgM0g1Ljk2bDUuMTEtMTNoMS44Nmw1LjExIDEzaC0yLjA5eiIgLz48L2c+CjxnIGlkPSJmb3J3YXJkIj48cGF0aCBkPSJNMTIgOFY0bDggOC04IDh2LTRINFY4eiIgLz48L2c+CjxnIGlkPSJmdWxsc2NyZWVuIj48cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiIC8+PC9nPgo8ZyBpZD0iZnVsbHNjcmVlbi1leGl0Ij48cGF0aCBkPSJNNSAxNmgzdjNoMnYtNUg1djJ6bTMtOEg1djJoNVY1SDh2M3ptNiAxMWgydi0zaDN2LTJoLTV2NXptMi0xMVY1aC0ydjVoNVY4aC0zeiIgLz48L2c+CjxnIGlkPSJnLXRyYW5zbGF0ZSI+PHBhdGggZD0iTTIwIDVoLTkuMTJMMTAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDdsMSAzaDhjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnpNNy4xNyAxNC41OWMtMi4yNSAwLTQuMDktMS44My00LjA5LTQuMDlzMS44My00LjA5IDQuMDktNC4wOWMxLjA0IDAgMS45OS4zNyAyLjc0IDEuMDdsLjA3LjA2LTEuMjMgMS4xOC0uMDYtLjA1Yy0uMjktLjI3LS43OC0uNTktMS41Mi0uNTktMS4zMSAwLTIuMzggMS4wOS0yLjM4IDIuNDJzMS4wNyAyLjQyIDIuMzggMi40MmMxLjM3IDAgMS45Ni0uODcgMi4xMi0xLjQ2SDcuMDhWOS45MWgzLjk1bC4wMS4wN2MuMDQuMjEuMDUuNC4wNS42MSAwIDIuMzUtMS42MSA0LTMuOTIgNHptNi4wMy0xLjcxYy4zMy42Ljc0IDEuMTggMS4xOSAxLjdsLS41NC41My0uNjUtMi4yM3ptLjc3LS43NmgtLjk5bC0uMzEtMS4wNGgzLjk5cy0uMzQgMS4zMS0xLjU2IDIuNzRjLS41Mi0uNjItLjg5LTEuMjMtMS4xMy0xLjd6TTIxIDIwYzAgLjU1LS40NSAxLTEgMWgtN2wyLTItLjgxLTIuNzcuOTItLjkyTDE3Ljc5IDE4bC43My0uNzMtMi43MS0yLjY4Yy45LTEuMDMgMS42LTIuMjUgMS45Mi0zLjUxSDE5di0xLjA0aC0zLjY0VjloLTEuMDR2MS4wNGgtMS45NkwxMS4xOCA2SDIwYy41NSAwIDEgLjQ1IDEgMXYxM3oiIC8+PC9nPgo8ZyBpZD0iZ2F2ZWwiPjxwYXRoIGQ9Ik0xIDIxaDEydjJIMXpNNS4yNDUgOC4wN2wyLjgzLTIuODI3IDE0LjE0IDE0LjE0Mi0yLjgyOCAyLjgyOHpNMTIuMzE3IDFsNS42NTcgNS42NTYtMi44MyAyLjgzLTUuNjU0LTUuNjZ6TTMuODI1IDkuNDg1bDUuNjU3IDUuNjU3LTIuODI4IDIuODI4LTUuNjU3LTUuNjU3eiIgLz48L2c+CjxnIGlkPSJnZXN0dXJlIj48cGF0aCBkPSJNNC41OSA2Ljg5Yy43LS43MSAxLjQtMS4zNSAxLjcxLTEuMjIuNS4yIDAgMS4wMy0uMyAxLjUyLS4yNS40Mi0yLjg2IDMuODktMi44NiA2LjMxIDAgMS4yOC40OCAyLjM0IDEuMzQgMi45OC43NS41NiAxLjc0LjczIDIuNjQuNDYgMS4wNy0uMzEgMS45NS0xLjQgMy4wNi0yLjc3IDEuMjEtMS40OSAyLjgzLTMuNDQgNC4wOC0zLjQ0IDEuNjMgMCAxLjY1IDEuMDEgMS43NiAxLjc5LTMuNzguNjQtNS4zOCAzLjY3LTUuMzggNS4zNyAwIDEuNyAxLjQ0IDMuMDkgMy4yMSAzLjA5IDEuNjMgMCA0LjI5LTEuMzMgNC42OS02LjFIMjF2LTIuNWgtMi40N2MtLjE1LTEuNjUtMS4wOS00LjItNC4wMy00LjItMi4yNSAwLTQuMTggMS45MS00Ljk0IDIuODQtLjU4LjczLTIuMDYgMi40OC0yLjI5IDIuNzItLjI1LjMtLjY4Ljg0LTEuMTEuODQtLjQ1IDAtLjcyLS44My0uMzYtMS45Mi4zNS0xLjA5IDEuNC0yLjg2IDEuODUtMy41Mi43OC0xLjE0IDEuMy0xLjkyIDEuMy0zLjI4QzguOTUgMy42OSA3LjMxIDMgNi40NCAzIDUuMTIgMyAzLjk3IDQgMy43MiA0LjI1Yy0uMzYuMzYtLjY2LjY2LS44OC45M2wxLjc1IDEuNzF6bTkuMjkgMTEuNjZjLS4zMSAwLS43NC0uMjYtLjc0LS43MiAwLS42LjczLTIuMiAyLjg3LTIuNzYtLjMgMi42OS0xLjQzIDMuNDgtMi4xMyAzLjQ4eiIgLz48L2c+CjxnIGlkPSJnZXQtYXBwIj48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJnaWYiPjxwYXRoIGQ9Ik0xMS41IDlIMTN2NmgtMS41ek05IDlINmMtLjYgMC0xIC41LTEgMXY0YzAgLjUuNCAxIDEgMWgzYy42IDAgMS0uNSAxLTF2LTJIOC41djEuNWgtMnYtM0gxMFYxMGMwLS41LS40LTEtMS0xem0xMCAxLjVWOWgtNC41djZIMTZ2LTJoMnYtMS41aC0ydi0xeiIgLz48L2c+CjxnIGlkPSJncmFkZSI+PHBhdGggZD0iTTEyIDE3LjI3TDE4LjE4IDIxbC0xLjY0LTcuMDNMMjIgOS4yNGwtNy4xOS0uNjFMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxeiIgLz48L2c+CjxnIGlkPSJncm91cC13b3JrIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNOCAxNy41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXpNOS41IDhjMC0xLjM4IDEuMTItMi41IDIuNS0yLjVzMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41UzkuNSA5LjM4IDkuNSA4em02LjUgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiIC8+PC9nPgo8ZyBpZD0iaGVscCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTEgMTdoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45LjkyQzEzLjQ1IDEyLjkgMTMgMTMuNSAxMyAxNWgtMnYtLjVjMC0xLjEuNDUtMi4xIDEuMTctMi44M2wxLjI0LTEuMjZjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEgMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz48L2c+CjxnIGlkPSJoZWxwLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxOGgydi0yaC0ydjJ6bTEtMTZDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0wLTE0Yy0yLjIxIDAtNCAxLjc5LTQgNGgyYzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAyLTMgMS43NS0zIDVoMmMwLTIuMjUgMy0yLjUgMy01IDAtMi4yMS0xLjc5LTQtNC00eiIgLz48L2c+CjxnIGlkPSJoaWdobGlnaHQtb2ZmIj48cGF0aCBkPSJNMTQuNTkgOEwxMiAxMC41OSA5LjQxIDggOCA5LjQxIDEwLjU5IDEyIDggMTQuNTkgOS40MSAxNiAxMiAxMy40MSAxNC41OSAxNiAxNiAxNC41OSAxMy40MSAxMiAxNiA5LjQxIDE0LjU5IDh6TTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJoaXN0b3J5Ij48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiIgLz48L2c+CjxnIGlkPSJob21lIj48cGF0aCBkPSJNMTAgMjB2LTZoNHY2aDV2LThoM0wxMiAzIDIgMTJoM3Y4eiIgLz48L2c+CjxnIGlkPSJob3VyZ2xhc3MtZW1wdHkiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnptMTAgMTQuNVYyMEg4di0zLjVsNC00IDQgNHptLTQtNWwtNC00VjRoOHYzLjVsLTQgNHoiIC8+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWZ1bGwiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnoiIC8+PC9nPgo8ZyBpZD0iaHR0cCI+PHBhdGggZD0iTTQuNSAxMWgtMlY5SDF2NmgxLjV2LTIuNWgyVjE1SDZWOUg0LjV2MnptMi41LS41aDEuNVYxNUgxMHYtNC41aDEuNVY5SDd2MS41em01LjUgMEgxNFYxNWgxLjV2LTQuNUgxN1Y5aC00LjV2MS41em05LTEuNUgxOHY2aDEuNXYtMmgyYy44IDAgMS41LS43IDEuNS0xLjV2LTFjMC0uOC0uNy0xLjUtMS41LTEuNXptMCAyLjVoLTJ2LTFoMnYxeiIgLz48L2c+CjxnIGlkPSJodHRwcyI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6IiAvPjwvZz4KPGcgaWQ9ImltcG9ydGFudC1kZXZpY2VzIj48cGF0aCBkPSJNMjMgMTEuMDFMMTggMTFjLS41NSAwLTEgLjQ1LTEgMXY5YzAgLjU1LjQ1IDEgMSAxaDVjLjU1IDAgMS0uNDUgMS0xdi05YzAtLjU1LS40NS0uOTktMS0uOTl6TTIzIDIwaC01di03aDV2N3pNMjAgMkgyQy44OSAyIDAgMi44OSAwIDR2MTJjMCAxLjEuODkgMiAyIDJoN3YySDd2Mmg4di0yaC0ydi0yaDJ2LTJIMlY0aDE4djVoMlY0YzAtMS4xMS0uOS0yLTItMnptLTguMDMgN0wxMSA2bC0uOTcgM0g3bDIuNDcgMS43Ni0uOTQgMi45MSAyLjQ3LTEuOCAyLjQ3IDEuOC0uOTQtMi45MUwxNSA5aC0zLjAzeiIgLz48L2c+CjxnIGlkPSJpbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguODktMS45OCAyTDMgMTljMCAxLjEuODggMiAxLjk5IDJIMTljMS4xIDAgMi0uOSAyLTJWNWMwLTEuMTEtLjktMi0yLTJ6bTAgMTJoLTRjMCAxLjY2LTEuMzUgMy0zIDNzLTMtMS4zNC0zLTNINC45OVY1SDE5djEweiIgLz48L2c+CjxnIGlkPSJpbmRldGVybWluYXRlLWNoZWNrLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMEg3di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImluZm8iPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi02aDJ2NnptMC04aC0yVjdoMnYyeiIgLz48L2c+CjxnIGlkPSJpbmZvLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxN2gydi02aC0ydjZ6bTEtMTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4ek0xMSA5aDJWN2gtMnYyeiIgLz48L2c+CjxnIGlkPSJpbnB1dCI+PHBhdGggZD0iTTIxIDMuMDFIM2MtMS4xIDAtMiAuOS0yIDJWOWgyVjQuOTloMTh2MTQuMDNIM1YxNUgxdjQuMDFjMCAxLjEuOSAxLjk4IDIgMS45OGgxOGMxLjEgMCAyLS44OCAyLTEuOTh2LTE0YzAtMS4xMS0uOS0yLTItMnpNMTEgMTZsNC00LTQtNHYzSDF2MmgxMHYzeiIgLz48L2c+CjxnIGlkPSJpbnZlcnQtY29sb3JzIj48cGF0aCBkPSJNMTcuNjYgNy45M0wxMiAyLjI3IDYuMzQgNy45M2MtMy4xMiAzLjEyLTMuMTIgOC4xOSAwIDExLjMxQzcuOSAyMC44IDkuOTUgMjEuNTggMTIgMjEuNThjMi4wNSAwIDQuMS0uNzggNS42Ni0yLjM0IDMuMTItMy4xMiAzLjEyLTguMTkgMC0xMS4zMXpNMTIgMTkuNTljLTEuNiAwLTMuMTEtLjYyLTQuMjQtMS43NkM2LjYyIDE2LjY5IDYgMTUuMTkgNiAxMy41OXMuNjItMy4xMSAxLjc2LTQuMjRMMTIgNS4xdjE0LjQ5eiIgLz48L2c+CjxnIGlkPSJsYWJlbCI+PHBhdGggZD0iTTE3LjYzIDUuODRDMTcuMjcgNS4zMyAxNi42NyA1IDE2IDVMNSA1LjAxQzMuOSA1LjAxIDMgNS45IDMgN3YxMGMwIDEuMS45IDEuOTkgMiAxLjk5TDE2IDE5Yy42NyAwIDEuMjctLjMzIDEuNjMtLjg0TDIyIDEybC00LjM3LTYuMTZ6IiAvPjwvZz4KPGcgaWQ9ImxhYmVsLW91dGxpbmUiPjxwYXRoIGQ9Ik0xNy42MyA1Ljg0QzE3LjI3IDUuMzMgMTYuNjcgNSAxNiA1TDUgNS4wMUMzLjkgNS4wMSAzIDUuOSAzIDd2MTBjMCAxLjEuOSAxLjk5IDIgMS45OUwxNiAxOWMuNjcgMCAxLjI3LS4zMyAxLjYzLS44NEwyMiAxMmwtNC4zNy02LjE2ek0xNiAxN0g1VjdoMTFsMy41NSA1TDE2IDE3eiIgLz48L2c+CjxnIGlkPSJsYW5ndWFnZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6bTYuOTMgNmgtMi45NWMtLjMyLTEuMjUtLjc4LTIuNDUtMS4zOC0zLjU2IDEuODQuNjMgMy4zNyAxLjkxIDQuMzMgMy41NnpNMTIgNC4wNGMuODMgMS4yIDEuNDggMi41MyAxLjkxIDMuOTZoLTMuODJjLjQzLTEuNDMgMS4wOC0yLjc2IDEuOTEtMy45NnpNNC4yNiAxNEM0LjEgMTMuMzYgNCAxMi42OSA0IDEycy4xLTEuMzYuMjYtMmgzLjM4Yy0uMDguNjYtLjE0IDEuMzItLjE0IDIgMCAuNjguMDYgMS4zNC4xNCAySDQuMjZ6bS44MiAyaDIuOTVjLjMyIDEuMjUuNzggMi40NSAxLjM4IDMuNTYtMS44NC0uNjMtMy4zNy0xLjktNC4zMy0zLjU2em0yLjk1LThINS4wOGMuOTYtMS42NiAyLjQ5LTIuOTMgNC4zMy0zLjU2QzguODEgNS41NSA4LjM1IDYuNzUgOC4wMyA4ek0xMiAxOS45NmMtLjgzLTEuMi0xLjQ4LTIuNTMtMS45MS0zLjk2aDMuODJjLS40MyAxLjQzLTEuMDggMi43Ni0xLjkxIDMuOTZ6TTE0LjM0IDE0SDkuNjZjLS4wOS0uNjYtLjE2LTEuMzItLjE2LTIgMC0uNjguMDctMS4zNS4xNi0yaDQuNjhjLjA5LjY1LjE2IDEuMzIuMTYgMiAwIC42OC0uMDcgMS4zNC0uMTYgMnptLjI1IDUuNTZjLjYtMS4xMSAxLjA2LTIuMzEgMS4zOC0zLjU2aDIuOTVjLS45NiAxLjY1LTIuNDkgMi45My00LjMzIDMuNTZ6TTE2LjM2IDE0Yy4wOC0uNjYuMTQtMS4zMi4xNC0yIDAtLjY4LS4wNi0xLjM0LS4xNC0yaDMuMzhjLjE2LjY0LjI2IDEuMzEuMjYgMnMtLjEgMS4zNi0uMjYgMmgtMy4zOHoiIC8+PC9nPgo8ZyBpZD0ibGFzdC1wYWdlIj48cGF0aCBkPSJNNS41OSA3LjQxTDEwLjE4IDEybC00LjU5IDQuNTlMNyAxOGw2LTYtNi02ek0xNiA2aDJ2MTJoLTJ6IiAvPjwvZz4KPGcgaWQ9ImxhdW5jaCI+PHBhdGggZD0iTTE5IDE5SDVWNWg3VjNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi03aC0ydjd6TTE0IDN2MmgzLjU5bC05LjgzIDkuODMgMS40MSAxLjQxTDE5IDYuNDFWMTBoMlYzaC03eiIgLz48L2c+CjxnIGlkPSJsaWdodGJ1bGItb3V0bGluZSI+PHBhdGggZD0iTTkgMjFjMCAuNTUuNDUgMSAxIDFoNGMuNTUgMCAxLS40NSAxLTF2LTFIOXYxem0zLTE5QzguMTQgMiA1IDUuMTQgNSA5YzAgMi4zOCAxLjE5IDQuNDcgMyA1Ljc0VjE3YzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xdi0yLjI2YzEuODEtMS4yNyAzLTMuMzYgMy01Ljc0IDAtMy44Ni0zLjE0LTctNy03em0yLjg1IDExLjFsLS44NS42VjE2aC00di0yLjNsLS44NS0uNkM3LjggMTIuMTYgNyAxMC42MyA3IDljMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWMwIDEuNjMtLjggMy4xNi0yLjE1IDQuMXoiIC8+PC9nPgo8ZyBpZD0ibGluZS1zdHlsZSI+PHBhdGggZD0iTTMgMTZoNXYtMkgzdjJ6bTYuNSAwaDV2LTJoLTV2MnptNi41IDBoNXYtMmgtNXYyek0zIDIwaDJ2LTJIM3Yyem00IDBoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTMgMTJoOHYtMkgzdjJ6bTEwIDBoOHYtMmgtOHYyek0zIDR2NGgxOFY0SDN6IiAvPjwvZz4KPGcgaWQ9ImxpbmUtd2VpZ2h0Ij48cGF0aCBkPSJNMyAxN2gxOHYtMkgzdjJ6bTAgM2gxOHYtMUgzdjF6bTAtN2gxOHYtM0gzdjN6bTAtOXY0aDE4VjRIM3oiIC8+PC9nPgo8ZyBpZD0ibGluayI+PHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIgLz48L2c+CjxnIGlkPSJsaXN0Ij48cGF0aCBkPSJNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptNCA0aDE0di0ySDd2MnptMCA0aDE0di0ySDd2MnpNNyA3djJoMTRWN0g3eiIgLz48L2c+CjxnIGlkPSJsb2NrIj48cGF0aCBkPSJNMTggOGgtMVY2YzAtMi43Ni0yLjI0LTUtNS01UzcgMy4yNCA3IDZ2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0tNiA5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnptMy4xLTlIOC45VjZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2MnoiIC8+PC9nPgo8ZyBpZD0ibG9jay1vcGVuIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2aDEuOWMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bTAgMTJINlYxMGgxMnYxMHoiIC8+PC9nPgo8ZyBpZD0ibG9jay1vdXRsaW5lIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnpNOC45IDZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFzMy4xIDEuMzkgMy4xIDMuMXYySDguOVY2ek0xOCAyMEg2VjEwaDEydjEweiIgLz48L2c+CjxnIGlkPSJsb3ctcHJpb3JpdHkiPjxwYXRoIGQ9Ik0xNCA1aDh2MmgtOHptMCA1LjVoOHYyaC04em0wIDUuNWg4djJoLTh6TTIgMTEuNUMyIDE1LjA4IDQuOTIgMTggOC41IDE4SDl2MmwzLTMtMy0zdjJoLS41QzYuMDIgMTYgNCAxMy45OCA0IDExLjVTNi4wMiA3IDguNSA3SDEyVjVIOC41QzQuOTIgNSAyIDcuOTIgMiAxMS41eiIgLz48L2c+CjxnIGlkPSJsb3lhbHR5Ij48cGF0aCBkPSJNMjEuNDEgMTEuNThsLTktOUMxMi4wNSAyLjIyIDExLjU1IDIgMTEgMkg0Yy0xLjEgMC0yIC45LTIgMnY3YzAgLjU1LjIyIDEuMDUuNTkgMS40Mmw5IDljLjM2LjM2Ljg2LjU4IDEuNDEuNTguNTUgMCAxLjA1LS4yMiAxLjQxLS41OWw3LTdjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLS41NS0uMjMtMS4wNi0uNTktMS40MnpNNS41IDdDNC42NyA3IDQgNi4zMyA0IDUuNVM0LjY3IDQgNS41IDQgNyA0LjY3IDcgNS41IDYuMzMgNyA1LjUgN3ptMTEuNzcgOC4yN0wxMyAxOS41NGwtNC4yNy00LjI3QzguMjggMTQuODEgOCAxNC4xOSA4IDEzLjVjMC0xLjM4IDEuMTItMi41IDIuNS0yLjUuNjkgMCAxLjMyLjI4IDEuNzcuNzRsLjczLjcyLjczLS43M2MuNDUtLjQ1IDEuMDgtLjczIDEuNzctLjczIDEuMzggMCAyLjUgMS4xMiAyLjUgMi41IDAgLjY5LS4yOCAxLjMyLS43MyAxLjc3eiIgLz48L2c+CjxnIGlkPSJtYWlsIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9Im1hcmt1bnJlYWQiPjxwYXRoIGQ9Ik0yMCA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgNGwtOCA1LTgtNVY2bDggNSA4LTV2MnoiIC8+PC9nPgo8ZyBpZD0ibWFya3VucmVhZC1tYWlsYm94Ij48cGF0aCBkPSJNMjAgNkgxMHY2SDhWNGg2VjBINnY2SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibWVudSI+PHBhdGggZD0iTTMgMThoMTh2LTJIM3Yyem0wLTVoMTh2LTJIM3Yyem0wLTd2MmgxOFY2SDN6IiAvPjwvZz4KPGcgaWQ9Im1vcmUtaG9yaXoiPjxwYXRoIGQ9Ik02IDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMTIgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bS02IDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJtb3JlLXZlcnQiPjxwYXRoIGQ9Ik0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibW90b3JjeWNsZSI+PHBhdGggZD0iTTE5LjQ0IDkuMDNMMTUuNDEgNUgxMXYyaDMuNTlsMiAySDVjLTIuOCAwLTUgMi4yLTUgNXMyLjIgNSA1IDVjMi40NiAwIDQuNDUtMS42OSA0LjktNGgxLjY1bDIuNzctMi43N2MtLjIxLjU0LS4zMiAxLjE0LS4zMiAxLjc3IDAgMi44IDIuMiA1IDUgNXM1LTIuMiA1LTVjMC0yLjY1LTEuOTctNC43Ny00LjU2LTQuOTd6TTcuODIgMTVDNy40IDE2LjE1IDYuMjggMTcgNSAxN2MtMS42MyAwLTMtMS4zNy0zLTNzMS4zNy0zIDMtM2MxLjI4IDAgMi40Ljg1IDIuODIgMkg1djJoMi44MnpNMTkgMTdjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzeiIgLz48L2c+CjxnIGlkPSJtb3ZlLXRvLWluYm94Ij48cGF0aCBkPSJNMTkgM0g0Ljk5Yy0xLjExIDAtMS45OC45LTEuOTggMkwzIDE5YzAgMS4xLjg4IDIgMS45OSAySDE5YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJoLTRjMCAxLjY2LTEuMzUgMy0zIDNzLTMtMS4zNC0zLTNINC45OVY1SDE5djEwem0tMy01aC0yVjdoLTR2M0g4bDQgNCA0LTR6IiAvPjwvZz4KPGcgaWQ9Im5leHQtd2VlayI+PHBhdGggZD0iTTIwIDdoLTRWNWMwLS41NS0uMjItMS4wNS0uNTktMS40MUMxNS4wNSAzLjIyIDE0LjU1IDMgMTQgM2gtNGMtMS4xIDAtMiAuOS0yIDJ2Mkg0Yy0xLjEgMC0yIC45LTIgMnYxMWMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjljMC0xLjEtLjktMi0yLTJ6TTEwIDVoNHYyaC00VjV6bTEgMTMuNWwtMS0xIDMtMy0zLTMgMS0xIDQgNC00IDR6IiAvPjwvZz4KPGcgaWQ9Im5vdGUtYWRkIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE0aC0zdjNoLTJ2LTNIOHYtMmgzdi0zaDJ2M2gzdjJ6bS0zLTdWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0ib2ZmbGluZS1waW4iPjxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwIDEwLTQuNSAxMC0xMFMxNy41IDIgMTIgMnptNSAxNkg3di0yaDEwdjJ6bS02LjctNEw3IDEwLjdsMS40LTEuNCAxLjkgMS45IDUuMy01LjNMMTcgNy4zIDEwLjMgMTR6IiAvPjwvZz4KPGcgaWQ9Im9wYWNpdHkiPjxwYXRoIGQ9Ik0xNy42NiA4TDEyIDIuMzUgNi4zNCA4QzQuNzggOS41NiA0IDExLjY0IDQgMTMuNjRzLjc4IDQuMTEgMi4zNCA1LjY3IDMuNjEgMi4zNSA1LjY2IDIuMzUgNC4xLS43OSA1LjY2LTIuMzVTMjAgMTUuNjQgMjAgMTMuNjQgMTkuMjIgOS41NiAxNy42NiA4ek02IDE0Yy4wMS0yIC42Mi0zLjI3IDEuNzYtNC40TDEyIDUuMjdsNC4yNCA0LjM4QzE3LjM4IDEwLjc3IDE3Ljk5IDEyIDE4IDE0SDZ6IiAvPjwvZz4KPGcgaWQ9Im9wZW4taW4tYnJvd3NlciI+PHBhdGggZD0iTTE5IDRINWMtMS4xMSAwLTIgLjktMiAydjEyYzAgMS4xLjg5IDIgMiAyaDR2LTJINVY4aDE0djEwaC00djJoNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS44OS0yLTItMnptLTcgNmwtNCA0aDN2Nmgydi02aDNsLTQtNHoiIC8+PC9nPgo8ZyBpZD0ib3Blbi1pbi1uZXciPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiIC8+PC9nPgo8ZyBpZD0ib3Blbi13aXRoIj48cGF0aCBkPSJNMTAgOWg0VjZoM2wtNS01LTUgNWgzdjN6bS0xIDFINlY3bC01IDUgNSA1di0zaDN2LTR6bTE0IDJsLTUtNXYzaC0zdjRoM3YzbDUtNXptLTkgM2gtNHYzSDdsNSA1IDUtNWgtM3YtM3oiIC8+PC9nPgo8ZyBpZD0icGFnZXZpZXciPjxwYXRoIGQ9Ik0xMS41IDlDMTAuMTIgOSA5IDEwLjEyIDkgMTEuNXMxLjEyIDIuNSAyLjUgMi41IDIuNS0xLjEyIDIuNS0yLjVTMTIuODggOSAxMS41IDl6TTIwIDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tMy4yMSAxNC4yMWwtMi45MS0yLjkxYy0uNjkuNDQtMS41MS43LTIuMzkuN0M5LjAxIDE2IDcgMTMuOTkgNyAxMS41UzkuMDEgNyAxMS41IDcgMTYgOS4wMSAxNiAxMS41YzAgLjg4LS4yNiAxLjY5LS43IDIuMzlsMi45MSAyLjktMS40MiAxLjQyeiIgLz48L2c+CjxnIGlkPSJwYW4tdG9vbCI+PHBhdGggZD0iTTIzIDUuNVYyMGMwIDIuMi0xLjggNC00IDRoLTcuM2MtMS4wOCAwLTIuMS0uNDMtMi44NS0xLjE5TDEgMTQuODNzMS4yNi0xLjIzIDEuMy0xLjI1Yy4yMi0uMTkuNDktLjI5Ljc5LS4yOS4yMiAwIC40Mi4wNi42LjE2LjA0LjAxIDQuMzEgMi40NiA0LjMxIDIuNDZWNGMwLS44My42Ny0xLjUgMS41LTEuNVMxMSAzLjE3IDExIDR2N2gxVjEuNWMwLS44My42Ny0xLjUgMS41LTEuNVMxNSAuNjcgMTUgMS41VjExaDFWMi41YzAtLjgzLjY3LTEuNSAxLjUtMS41czEuNS42NyAxLjUgMS41VjExaDFWNS41YzAtLjgzLjY3LTEuNSAxLjUtMS41czEuNS42NyAxLjUgMS41eiIgLz48L2c+CjxnIGlkPSJwYXltZW50Ij48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiIgLz48L2c+CjxnIGlkPSJwZXJtLWNhbWVyYS1taWMiPjxwYXRoIGQ9Ik0yMCA1aC0zLjE3TDE1IDNIOUw3LjE3IDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg3di0yLjA5Yy0yLjgzLS40OC01LTIuOTQtNS01LjkxaDJjMCAyLjIxIDEuNzkgNCA0IDRzNC0xLjc5IDQtNGgyYzAgMi45Ny0yLjE3IDUuNDMtNSA1LjkxVjIxaDdjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptLTYgOGMwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTJWOWMwLTEuMS45LTIgMi0yczIgLjkgMiAydjR6IiAvPjwvZz4KPGcgaWQ9InBlcm0tY29udGFjdC1jYWxlbmRhciI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDNjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDMtMy0xLjM0LTMtMyAxLjM0LTMgMy0zem02IDEySDZ2LTFjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xdjF6IiAvPjwvZz4KPGcgaWQ9InBlcm0tZGF0YS1zZXR0aW5nIj48cGF0aCBkPSJNMTguOTkgMTEuNWMuMzQgMCAuNjcuMDMgMSAuMDdMMjAgMCAwIDIwaDExLjU2Yy0uMDQtLjMzLS4wNy0uNjYtLjA3LTEgMC00LjE0IDMuMzYtNy41IDcuNS03LjV6bTMuNzEgNy45OWMuMDItLjE2LjA0LS4zMi4wNC0uNDkgMC0uMTctLjAxLS4zMy0uMDQtLjQ5bDEuMDYtLjgzYy4wOS0uMDguMTItLjIxLjA2LS4zMmwtMS0xLjczYy0uMDYtLjExLS4xOS0uMTUtLjMxLS4xMWwtMS4yNC41Yy0uMjYtLjItLjU0LS4zNy0uODUtLjQ5bC0uMTktMS4zMmMtLjAxLS4xMi0uMTItLjIxLS4yNC0uMjFoLTJjLS4xMiAwLS4yMy4wOS0uMjUuMjFsLS4xOSAxLjMyYy0uMy4xMy0uNTkuMjktLjg1LjQ5bC0xLjI0LS41Yy0uMTEtLjA0LS4yNCAwLS4zMS4xMWwtMSAxLjczYy0uMDYuMTEtLjA0LjI0LjA2LjMybDEuMDYuODNjLS4wMi4xNi0uMDMuMzItLjAzLjQ5IDAgLjE3LjAxLjMzLjAzLjQ5bC0xLjA2LjgzYy0uMDkuMDgtLjEyLjIxLS4wNi4zMmwxIDEuNzNjLjA2LjExLjE5LjE1LjMxLjExbDEuMjQtLjVjLjI2LjIuNTQuMzcuODUuNDlsLjE5IDEuMzJjLjAyLjEyLjEyLjIxLjI1LjIxaDJjLjEyIDAgLjIzLS4wOS4yNS0uMjFsLjE5LTEuMzJjLjMtLjEzLjU5LS4yOS44NC0uNDlsMS4yNS41Yy4xMS4wNC4yNCAwIC4zMS0uMTFsMS0xLjczYy4wNi0uMTEuMDMtLjI0LS4wNi0uMzJsLTEuMDctLjgzem0tMy43MSAxLjAxYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0icGVybS1kZXZpY2UtaW5mb3JtYXRpb24iPjxwYXRoIGQ9Ik0xMyA3aC0ydjJoMlY3em0wIDRoLTJ2Nmgydi02em00LTkuOTlMNyAxYy0xLjEgMC0yIC45LTIgMnYxOGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE3IDE5SDdWNWgxMHYxNHoiIC8+PC9nPgo8ZyBpZD0icGVybS1pZGVudGl0eSI+PHBhdGggZD0iTTEyIDUuOWMxLjE2IDAgMi4xLjk0IDIuMSAyLjFzLS45NCAyLjEtMi4xIDIuMVM5LjkgOS4xNiA5LjkgOHMuOTQtMi4xIDIuMS0yLjFtMCA5YzIuOTcgMCA2LjEgMS40NiA2LjEgMi4xdjEuMUg1LjlWMTdjMC0uNjQgMy4xMy0yLjEgNi4xLTIuMU0xMiA0QzkuNzkgNCA4IDUuNzkgOCA4czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0wIDljLTIuNjcgMC04IDEuMzQtOCA0djNoMTZ2LTNjMC0yLjY2LTUuMzMtNC04LTR6IiAvPjwvZz4KPGcgaWQ9InBlcm0tbWVkaWEiPjxwYXRoIGQ9Ik0yIDZIMHY1aC4wMUwwIDIwYzAgMS4xLjkgMiAyIDJoMTh2LTJIMlY2em0yMC0yaC04bC0yLTJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnpNNyAxNWw0LjUtNiAzLjUgNC41MSAyLjUtMy4wMUwyMSAxNUg3eiIgLz48L2c+CjxnIGlkPSJwZXJtLXBob25lLW1zZyI+PHBhdGggZD0iTTIwIDE1LjVjLTEuMjUgMC0yLjQ1LS4yLTMuNTctLjU3LS4zNS0uMTEtLjc0LS4wMy0xLjAyLjI0bC0yLjIgMi4yYy0yLjgzLTEuNDQtNS4xNS0zLjc1LTYuNTktNi41OGwyLjItMi4yMWMuMjgtLjI3LjM2LS42Ni4yNS0xLjAxQzguNyA2LjQ1IDguNSA1LjI1IDguNSA0YzAtLjU1LS40NS0xLTEtMUg0Yy0uNTUgMC0xIC40NS0xIDEgMCA5LjM5IDcuNjEgMTcgMTcgMTcgLjU1IDAgMS0uNDUgMS0xdi0zLjVjMC0uNTUtLjQ1LTEtMS0xek0xMiAzdjEwbDMtM2g2VjNoLTl6IiAvPjwvZz4KPGcgaWQ9InBlcm0tc2Nhbi13aWZpIj48cGF0aCBkPSJNMTIgM0M2Ljk1IDMgMy4xNSA0Ljg1IDAgNy4yM0wxMiAyMiAyNCA3LjI1QzIwLjg1IDQuODcgMTcuMDUgMyAxMiAzem0xIDEzaC0ydi02aDJ2NnptLTItOFY2aDJ2MmgtMnoiIC8+PC9nPgo8ZyBpZD0icGV0cyI+PGNpcmNsZSBjeD0iNC41IiBjeT0iOS41IiByPSIyLjUiIC8+PGNpcmNsZSBjeD0iOSIgY3k9IjUuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjE1IiBjeT0iNS41IiByPSIyLjUiIC8+PGNpcmNsZSBjeD0iMTkuNSIgY3k9IjkuNSIgcj0iMi41IiAvPjxwYXRoIGQ9Ik0xNy4zNCAxNC44NmMtLjg3LTEuMDItMS42LTEuODktMi40OC0yLjkxLS40Ni0uNTQtMS4wNS0xLjA4LTEuNzUtMS4zMi0uMTEtLjA0LS4yMi0uMDctLjMzLS4wOS0uMjUtLjA0LS41Mi0uMDQtLjc4LS4wNHMtLjUzIDAtLjc5LjA1Yy0uMTEuMDItLjIyLjA1LS4zMy4wOS0uNy4yNC0xLjI4Ljc4LTEuNzUgMS4zMi0uODcgMS4wMi0xLjYgMS44OS0yLjQ4IDIuOTEtMS4zMSAxLjMxLTIuOTIgMi43Ni0yLjYyIDQuNzkuMjkgMS4wMiAxLjAyIDIuMDMgMi4zMyAyLjMyLjczLjE1IDMuMDYtLjQ0IDUuNTQtLjQ0aC4xOGMyLjQ4IDAgNC44MS41OCA1LjU0LjQ0IDEuMzEtLjI5IDIuMDQtMS4zMSAyLjMzLTIuMzIuMzEtMi4wNC0xLjMtMy40OS0yLjYxLTQuOHoiIC8+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlIj48cGF0aCBkPSJNMTkgN2gtOHY2aDhWN3ptMi00SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4VjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk4aDE4djE0LjAzeiIgLz48L2c+CjxnIGlkPSJwaWN0dXJlLWluLXBpY3R1cmUtYWx0Ij48cGF0aCBkPSJNMTkgMTFoLTh2Nmg4di02em00IDhWNC45OEMyMyAzLjg4IDIyLjEgMyAyMSAzSDNjLTEuMSAwLTIgLjg4LTIgMS45OFYxOWMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yem0tMiAuMDJIM1Y0Ljk3aDE4djE0LjA1eiIgLz48L2c+CjxnIGlkPSJwbGF5LWZvci13b3JrIj48cGF0aCBkPSJNMTEgNXY1LjU5SDcuNWw0LjUgNC41IDQuNS00LjVIMTNWNWgtMnptLTUgOWMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02aC0yYzAgMi4yMS0xLjc5IDQtNCA0cy00LTEuNzktNC00SDZ6IiAvPjwvZz4KPGcgaWQ9InBvbHltZXIiPjxwYXRoIGQ9Ik0xOSA0aC00TDcuMTEgMTYuNjMgNC41IDEyIDkgNEg1TC41IDEyIDUgMjBoNGw3Ljg5LTEyLjYzTDE5LjUgMTIgMTUgMjBoNGw0LjUtOHoiIC8+PC9nPgo8ZyBpZD0icG93ZXItc2V0dGluZ3MtbmV3Ij48cGF0aCBkPSJNMTMgM2gtMnYxMGgyVjN6bTQuODMgMi4xN2wtMS40MiAxLjQyQzE3Ljk5IDcuODYgMTkgOS44MSAxOSAxMmMwIDMuODctMy4xMyA3LTcgN3MtNy0zLjEzLTctN2MwLTIuMTkgMS4wMS00LjE0IDIuNTgtNS40Mkw2LjE3IDUuMTdDNC4yMyA2LjgyIDMgOS4yNiAzIDEyYzAgNC45NyA0LjAzIDkgOSA5czktNC4wMyA5LTljMC0yLjc0LTEuMjMtNS4xOC0zLjE3LTYuODN6IiAvPjwvZz4KPGcgaWQ9InByZWduYW50LXdvbWFuIj48cGF0aCBkPSJNOSA0YzAtMS4xMS44OS0yIDItMnMyIC44OSAyIDItLjg5IDItMiAyLTItLjg5LTItMnptNyA5Yy0uMDEtMS4zNC0uODMtMi41MS0yLTMgMC0xLjY2LTEuMzQtMy0zLTNzLTMgMS4zNC0zIDN2N2gydjVoM3YtNWgzdi00eiIgLz48L2c+CjxnIGlkPSJwcmludCI+PHBhdGggZD0iTTE5IDhINWMtMS42NiAwLTMgMS4zNC0zIDN2Nmg0djRoMTJ2LTRoNHYtNmMwLTEuNjYtMS4zNC0zLTMtM3ptLTMgMTFIOHYtNWg4djV6bTMtN2MtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxem0tMS05SDZ2NGgxMlYzeiIgLz48L2c+CjxnIGlkPSJxdWVyeS1idWlsZGVyIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0uNS0xM0gxMXY2bDUuMjUgMy4xNS43NS0xLjIzLTQuNS0yLjY3eiIgLz48L2c+CjxnIGlkPSJxdWVzdGlvbi1hbnN3ZXIiPjxwYXRoIGQ9Ik0yMSA2aC0ydjlINnYyYzAgLjU1LjQ1IDEgMSAxaDExbDQgNFY3YzAtLjU1LS40NS0xLTEtMXptLTQgNlYzYzAtLjU1LS40NS0xLTEtMUgzYy0uNTUgMC0xIC40NS0xIDF2MTRsNC00aDEwYy41NSAwIDEtLjQ1IDEtMXoiIC8+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLWNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiA3Yy0yLjc2IDAtNSAyLjI0LTUgNXMyLjI0IDUgNSA1IDUtMi4yNCA1LTUtMi4yNC01LTUtNXptMC01QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLXVuY2hlY2tlZCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJyZWNlaXB0Ij48cGF0aCBkPSJNMTggMTdINnYtMmgxMnYyem0wLTRINnYtMmgxMnYyem0wLTRINlY3aDEydjJ6TTMgMjJsMS41LTEuNUw2IDIybDEuNS0xLjVMOSAyMmwxLjUtMS41TDEyIDIybDEuNS0xLjVMMTUgMjJsMS41LTEuNUwxOCAyMmwxLjUtMS41TDIxIDIyVjJsLTEuNSAxLjVMMTggMmwtMS41IDEuNUwxNSAybC0xLjUgMS41TDEyIDJsLTEuNSAxLjVMOSAyIDcuNSAzLjUgNiAyIDQuNSAzLjUgMyAydjIweiIgLz48L2c+CjxnIGlkPSJyZWNvcmQtdm9pY2Utb3ZlciI+PGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjQiIC8+PHBhdGggZD0iTTkgMTVjLTIuNjcgMC04IDEuMzQtOCA0djJoMTZ2LTJjMC0yLjY2LTUuMzMtNC04LTR6bTcuNzYtOS42NGwtMS42OCAxLjY5Yy44NCAxLjE4Ljg0IDIuNzEgMCAzLjg5bDEuNjggMS42OWMyLjAyLTIuMDIgMi4wMi01LjA3IDAtNy4yN3pNMjAuMDcgMmwtMS42MyAxLjYzYzIuNzcgMy4wMiAyLjc3IDcuNTYgMCAxMC43NEwyMC4wNyAxNmMzLjktMy44OSAzLjkxLTkuOTUgMC0xNHoiIC8+PC9nPgo8ZyBpZD0icmVkZWVtIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6IiAvPjwvZz4KPGcgaWQ9InJlZG8iPjxwYXRoIGQ9Ik0xOC40IDEwLjZDMTYuNTUgOC45OSAxNC4xNSA4IDExLjUgOGMtNC42NSAwLTguNTggMy4wMy05Ljk2IDcuMjJMMy45IDE2YzEuMDUtMy4xOSA0LjA1LTUuNSA3LjYtNS41IDEuOTUgMCAzLjczLjcyIDUuMTIgMS44OEwxMyAxNmg5VjdsLTMuNiAzLjZ6IiAvPjwvZz4KPGcgaWQ9InJlZnJlc2giPjxwYXRoIGQ9Ik0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlIj48cGF0aCBkPSJNMTkgMTNINXYtMmgxNHYyeiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNSAxMUg3di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9InJlbW92ZS1jaXJjbGUtb3V0bGluZSI+PHBhdGggZD0iTTcgMTF2MmgxMHYtMkg3em01LTlDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTIyLjczIDIyLjczTDIuNzcgMi43NyAyIDJsLS43My0uNzNMMCAyLjU0bDQuMzkgNC4zOSAyLjIxIDQuNjYtMS4zNSAyLjQ1Yy0uMTYuMjgtLjI1LjYxLS4yNS45NiAwIDEuMS45IDIgMiAyaDcuNDZsMS4zOCAxLjM4Yy0uNS4zNi0uODMuOTUtLjgzIDEuNjIgMCAxLjEuODkgMiAxLjk5IDIgLjY3IDAgMS4yNi0uMzMgMS42Mi0uODRMMjEuNDYgMjRsMS4yNy0xLjI3ek03LjQyIDE1Yy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoMi4zNmwyIDJINy40MnptOC4xMy0yYy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjU4LTYuNDljLjA4LS4xNC4xMi0uMzEuMTItLjQ4IDAtLjU1LS40NS0xLTEtMUg2LjU0bDkuMDEgOXpNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0icmVvcmRlciI+PHBhdGggZD0iTTMgMTVoMTh2LTJIM3Yyem0wIDRoMTh2LTJIM3Yyem0wLThoMThWOUgzdjJ6bTAtNnYyaDE4VjVIM3oiIC8+PC9nPgo8ZyBpZD0icmVwbHkiPjxwYXRoIGQ9Ik0xMCA5VjVsLTcgNyA3IDd2LTQuMWM1IDAgOC41IDEuNiAxMSA1LjEtMS01LTQtMTAtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InJlcGx5LWFsbCI+PHBhdGggZD0iTTcgOFY1bC03IDcgNyA3di0zbC00LTQgNC00em02IDFWNWwtNyA3IDcgN3YtNC4xYzUgMCA4LjUgMS42IDExIDUuMS0xLTUtNC0xMC0xMS0xMXoiIC8+PC9nPgo8ZyBpZD0icmVwb3J0Ij48cGF0aCBkPSJNMTUuNzMgM0g4LjI3TDMgOC4yN3Y3LjQ2TDguMjcgMjFoNy40NkwyMSAxNS43M1Y4LjI3TDE1LjczIDN6TTEyIDE3LjNjLS43MiAwLTEuMy0uNTgtMS4zLTEuMyAwLS43Mi41OC0xLjMgMS4zLTEuMy43MiAwIDEuMy41OCAxLjMgMS4zIDAgLjcyLS41OCAxLjMtMS4zIDEuM3ptMS00LjNoLTJWN2gydjZ6IiAvPjwvZz4KPGcgaWQ9InJlcG9ydC1wcm9ibGVtIj48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJyZXN0b3JlIj48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiIgLz48L2c+CjxnIGlkPSJyZXN0b3JlLXBhZ2UiPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bS0yIDE2Yy0yLjA1IDAtMy44MS0xLjI0LTQuNTgtM2gxLjcxYy42My45IDEuNjggMS41IDIuODcgMS41IDEuOTMgMCAzLjUtMS41NyAzLjUtMy41UzEzLjkzIDkuNSAxMiA5LjVjLTEuMzUgMC0yLjUyLjc4LTMuMSAxLjlsMS42IDEuNmgtNFY5bDEuMyAxLjNDOC42OSA4LjkyIDEwLjIzIDggMTIgOGMyLjc2IDAgNSAyLjI0IDUgNXMtMi4yNCA1LTUgNXoiIC8+PC9nPgo8ZyBpZD0icm9vbSI+PHBhdGggZD0iTTEyIDJDOC4xMyAyIDUgNS4xMyA1IDljMCA1LjI1IDcgMTMgNyAxM3M3LTcuNzUgNy0xM2MwLTMuODctMy4xMy03LTctN3ptMCA5LjVjLTEuMzggMC0yLjUtMS4xMi0yLjUtMi41czEuMTItMi41IDIuNS0yLjUgMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41eiIgLz48L2c+CjxnIGlkPSJyb3VuZGVkLWNvcm5lciI+PHBhdGggZD0iTTE5IDE5aDJ2MmgtMnYtMnptMC0yaDJ2LTJoLTJ2MnpNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptMC00aDJWM0gzdjJ6bTQgMGgyVjNIN3Yyem04IDE2aDJ2LTJoLTJ2MnptLTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bS04IDBoMnYtMkg3djJ6bS00IDBoMnYtMkgzdjJ6TTIxIDhjMC0yLjc2LTIuMjQtNS01LTVoLTV2Mmg1YzEuNjUgMCAzIDEuMzUgMyAzdjVoMlY4eiIgLz48L2c+CjxnIGlkPSJyb3dpbmciPjxwYXRoIGQ9Ik04LjUgMTQuNUw0IDE5bDEuNSAxLjVMOSAxN2gybC0yLjUtMi41ek0xNSAxYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNiAyMC4wMUwxOCAyNGwtMi45OS0zLjAxVjE5LjVsLTcuMS03LjA5Yy0uMzEuMDUtLjYxLjA3LS45MS4wN3YtMi4xNmMxLjY2LjAzIDMuNjEtLjg3IDQuNjctMi4wNGwxLjQtMS41NWMuMTktLjIxLjQzLS4zOC42OS0uNS4yOS0uMTQuNjItLjIzLjk2LS4yM2guMDNDMTUuOTkgNi4wMSAxNyA3LjAyIDE3IDguMjZ2NS43NWMwIC44NC0uMzUgMS42MS0uOTIgMi4xNmwtMy41OC0zLjU4di0yLjI3Yy0uNjMuNTItMS40MyAxLjAyLTIuMjkgMS4zOUwxNi41IDE4SDE4bDMgMy4wMXoiIC8+PC9nPgo8ZyBpZD0ic2F2ZSI+PHBhdGggZD0iTTE3IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdsLTQtNHptLTUgMTZjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzem0zLTEwSDVWNWgxMHY0eiIgLz48L2c+CjxnIGlkPSJzY2hlZHVsZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiIC8+PC9nPgo8ZyBpZD0ic2VhcmNoIj48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiIC8+PC9nPgo8ZyBpZD0ic2VsZWN0LWFsbCI+PHBhdGggZD0iTTMgNWgyVjNjLTEuMSAwLTIgLjktMiAyem0wIDhoMnYtMkgzdjJ6bTQgOGgydi0ySDd2MnpNMyA5aDJWN0gzdjJ6bTEwLTZoLTJ2MmgyVjN6bTYgMHYyaDJjMC0xLjEtLjktMi0yLTJ6TTUgMjF2LTJIM2MwIDEuMS45IDIgMiAyem0tMi00aDJ2LTJIM3Yyek05IDNIN3YyaDJWM3ptMiAxOGgydi0yaC0ydjJ6bTgtOGgydi0yaC0ydjJ6bTAgOGMxLjEgMCAyLS45IDItMmgtMnYyem0wLTEyaDJWN2gtMnYyem0wIDhoMnYtMmgtMnYyem0tNCA0aDJ2LTJoLTJ2MnptMC0xNmgyVjNoLTJ2MnpNNyAxN2gxMFY3SDd2MTB6bTItOGg2djZIOVY5eiIgLz48L2c+CjxnIGlkPSJzZW5kIj48cGF0aCBkPSJNMi4wMSAyMUwyMyAxMiAyLjAxIDMgMiAxMGwxNSAyLTE1IDJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzIj48cGF0aCBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVDMTQuNDYgMi4xOCAxNC4yNSAyIDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYXBwbGljYXRpb25zIj48cGF0aCBkPSJNMTIgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem03LTdINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xLS44OS0yLTItMnptLTEuNzUgOWMwIC4yMy0uMDIuNDYtLjA1LjY4bDEuNDggMS4xNmMuMTMuMTEuMTcuMy4wOC40NWwtMS40IDIuNDJjLS4wOS4xNS0uMjcuMjEtLjQzLjE1bC0xLjc0LS43Yy0uMzYuMjgtLjc2LjUxLTEuMTguNjlsLS4yNiAxLjg1Yy0uMDMuMTctLjE4LjMtLjM1LjNoLTIuOGMtLjE3IDAtLjMyLS4xMy0uMzUtLjI5bC0uMjYtMS44NWMtLjQzLS4xOC0uODItLjQxLTEuMTgtLjY5bC0xLjc0LjdjLS4xNi4wNi0uMzQgMC0uNDMtLjE1bC0xLjQtMi40MmMtLjA5LS4xNS0uMDUtLjM0LjA4LS40NWwxLjQ4LTEuMTZjLS4wMy0uMjMtLjA1LS40Ni0uMDUtLjY5IDAtLjIzLjAyLS40Ni4wNS0uNjhsLTEuNDgtMS4xNmMtLjEzLS4xMS0uMTctLjMtLjA4LS40NWwxLjQtMi40MmMuMDktLjE1LjI3LS4yMS40My0uMTVsMS43NC43Yy4zNi0uMjguNzYtLjUxIDEuMTgtLjY5bC4yNi0xLjg1Yy4wMy0uMTcuMTgtLjMuMzUtLjNoMi44Yy4xNyAwIC4zMi4xMy4zNS4yOWwuMjYgMS44NWMuNDMuMTguODIuNDEgMS4xOC42OWwxLjc0LS43Yy4xNi0uMDYuMzQgMCAuNDMuMTVsMS40IDIuNDJjLjA5LjE1LjA1LjM0LS4wOC40NWwtMS40OCAxLjE2Yy4wMy4yMy4wNS40Ni4wNS42OXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYmFja3VwLXJlc3RvcmUiPjxwYXRoIGQ9Ik0xNCAxMmMwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDIgLjkgMiAyIDIgMi0uOSAyLTJ6bS0yLTljLTQuOTcgMC05IDQuMDMtOSA5SDBsNCA0IDQtNEg1YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS41MSAwLTIuOTEtLjQ5LTQuMDYtMS4zbC0xLjQyIDEuNDRDOC4wNCAyMC4zIDkuOTQgMjEgMTIgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJsdWV0b290aCI+PHBhdGggZD0iTTExIDI0aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnptOCAwaDJ2LTJoLTJ2MnptMi43MS0xOC4yOUwxMiAwaC0xdjcuNTlMNi40MSAzIDUgNC40MSAxMC41OSAxMCA1IDE1LjU5IDYuNDEgMTcgMTEgMTIuNDFWMjBoMWw1LjcxLTUuNzEtNC4zLTQuMjkgNC4zLTQuMjl6TTEzIDMuODNsMS44OCAxLjg4TDEzIDcuNTlWMy44M3ptMS44OCAxMC40NkwxMyAxNi4xN3YtMy43NmwxLjg4IDEuODh6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJyaWdodG5lc3MiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6TTggMTZoMi41bDEuNSAxLjUgMS41LTEuNUgxNnYtMi41bDEuNS0xLjUtMS41LTEuNVY4aC0yLjVMMTIgNi41IDEwLjUgOEg4djIuNUw2LjUgMTIgOCAxMy41VjE2em00LTdjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDNWOXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtY2VsbCI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTE2IC4wMUw4IDBDNi45IDAgNiAuOSA2IDJ2MTZjMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjJjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE2IDE2SDhWNGg4djEyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1ldGhlcm5ldCI+PHBhdGggZD0iTTcuNzcgNi43Nkw2LjIzIDUuNDguODIgMTJsNS40MSA2LjUyIDEuNTQtMS4yOEwzLjQyIDEybDQuMzUtNS4yNHpNNyAxM2gydi0ySDd2MnptMTAtMmgtMnYyaDJ2LTJ6bS02IDJoMnYtMmgtMnYyem02Ljc3LTcuNTJsLTEuNTQgMS4yOEwyMC41OCAxMmwtNC4zNSA1LjI0IDEuNTQgMS4yOEwyMy4xOCAxMmwtNS40MS02LjUyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1hbnRlbm5hIj48cGF0aCBkPSJNMTIgNWMtMy44NyAwLTcgMy4xMy03IDdoMmMwLTIuNzYgMi4yNC01IDUtNXM1IDIuMjQgNSA1aDJjMC0zLjg3LTMuMTMtNy03LTd6bTEgOS4yOWMuODgtLjM5IDEuNS0xLjI2IDEuNS0yLjI5IDAtMS4zOC0xLjEyLTIuNS0yLjUtMi41UzkuNSAxMC42MiA5LjUgMTJjMCAxLjAyLjYyIDEuOSAxLjUgMi4yOXYzLjNMNy41OSAyMSA5IDIyLjQxbDMtMyAzIDNMMTYuNDEgMjEgMTMgMTcuNTl2LTMuM3pNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJoMmMwLTQuOTcgNC4wMy05IDktOXM5IDQuMDMgOSA5aDJjMC02LjA3LTQuOTMtMTEtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvbmVudCI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtY29tcG9zaXRlIj48cGF0aCBkPSJNNSAyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIMXY2aDZWNkg1VjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJIOXYyem0tOCAwYzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOEM2LjE2IDE4LjQgNyAxNy4zIDcgMTZ2LTJIMXYyek0yMSA2VjJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NGgtMnY2aDZWNmgtMnptLTgtNGMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDl2Nmg2VjZoLTJWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMmgtNnYyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1oZG1pIj48cGF0aCBkPSJNMTggN1Y0YzAtMS4xLS45LTItMi0ySDhjLTEuMSAwLTIgLjktMiAydjNINXY2bDMgNnYzaDh2LTNsMy02VjdoLTF6TTggNGg4djNoLTJWNWgtMXYyaC0yVjVoLTF2Mkg4VjR6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LXN2aWRlbyI+PHBhdGggZD0iTTggMTEuNWMwLS44My0uNjctMS41LTEuNS0xLjVTNSAxMC42NyA1IDExLjUgNS42NyAxMyA2LjUgMTMgOCAxMi4zMyA4IDExLjV6bTctNWMwLS44My0uNjctMS41LTEuNS0xLjVoLTNDOS42NyA1IDkgNS42NyA5IDYuNVM5LjY3IDggMTAuNSA4aDNjLjgzIDAgMS41LS42NyAxLjUtMS41ek04LjUgMTVjLS44MyAwLTEuNS42Ny0xLjUgMS41UzcuNjcgMTggOC41IDE4czEuNS0uNjcgMS41LTEuNVM5LjMzIDE1IDguNSAxNXpNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJzNC45MyAxMSAxMSAxMSAxMS00LjkzIDExLTExUzE4LjA3IDEgMTIgMXptMCAyMGMtNC45NiAwLTktNC4wNC05LTlzNC4wNC05IDktOSA5IDQuMDQgOSA5LTQuMDQgOS05IDl6bTUuNS0xMWMtLjgzIDAtMS41LjY3LTEuNSAxLjVzLjY3IDEuNSAxLjUgMS41IDEuNS0uNjcgMS41LTEuNS0uNjctMS41LTEuNS0xLjV6bS0yIDVjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1vdmVyc2NhbiI+PHBhdGggZD0iTTEyLjAxIDUuNUwxMCA4aDRsLTEuOTktMi41ek0xOCAxMHY0bDIuNS0xLjk5TDE4IDEwek02IDEwbC0yLjUgMi4wMUw2IDE0di00em04IDZoLTRsMi4wMSAyLjVMMTQgMTZ6bTctMTNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcGhvbmUiPjxwYXRoIGQ9Ik0xMyA5aC0ydjJoMlY5em00IDBoLTJ2MmgyVjl6bTMgNi41Yy0xLjI1IDAtMi40NS0uMi0zLjU3LS41Ny0uMzUtLjExLS43NC0uMDMtMS4wMi4yNGwtMi4yIDIuMmMtMi44My0xLjQ0LTUuMTUtMy43NS02LjU5LTYuNThsMi4yLTIuMjFjLjI4LS4yNy4zNi0uNjYuMjUtMS4wMUM4LjcgNi40NSA4LjUgNS4yNSA4LjUgNGMwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxIDAgOS4zOSA3LjYxIDE3IDE3IDE3IC41NSAwIDEtLjQ1IDEtMXYtMy41YzAtLjU1LS40NS0xLTEtMXpNMTkgOXYyaDJWOWgtMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcG93ZXIiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem0yLTIyaC0ydjEwaDJWMnptMy41NiAyLjQ0bC0xLjQ1IDEuNDVDMTYuODQgNi45NCAxOCA4LjgzIDE4IDExYzAgMy4zMS0yLjY5IDYtNiA2cy02LTIuNjktNi02YzAtMi4xNyAxLjE2LTQuMDYgMi44OC01LjEyTDcuNDQgNC40NEM1LjM2IDUuODggNCA4LjI4IDQgMTFjMCA0LjQyIDMuNTggOCA4IDhzOC0zLjU4IDgtOGMwLTIuNzItMS4zNi01LjEyLTMuNDQtNi41NnpNMTUgMjRoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1yZW1vdGUiPjxwYXRoIGQ9Ik0xNSA5SDljLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMVYxMGMwLS41NS0uNDUtMS0xLTF6bS0zIDZjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyek03LjA1IDYuMDVsMS40MSAxLjQxQzkuMzcgNi41NiAxMC42MiA2IDEyIDZzMi42My41NiAzLjU0IDEuNDZsMS40MS0xLjQxQzE1LjY4IDQuNzggMTMuOTMgNCAxMiA0cy0zLjY4Ljc4LTQuOTUgMi4wNXpNMTIgMEM4Ljk2IDAgNi4yMSAxLjIzIDQuMjIgMy4yMmwxLjQxIDEuNDFDNy4yNiAzLjAxIDkuNTEgMiAxMiAyczQuNzQgMS4wMSA2LjM2IDIuNjRsMS40MS0xLjQxQzE3Ljc5IDEuMjMgMTUuMDQgMCAxMiAweiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy12b2ljZSI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTUtMTFjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNGMwLTEuNjYtMS4zNC0zLTMtM1M5IDIuMzQgOSA0djZjMCAxLjY2IDEuMzQgMyAzIDN6bS0xIDExaDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnptNC0xNGgtMS43YzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxMyA2LjcgMTBINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMGgydi0zLjI4YzMuMjgtLjQ5IDYtMy4zMSA2LTYuNzJ6IiAvPjwvZz4KPGcgaWQ9InNob3AiPjxwYXRoIGQ9Ik0xNiA2VjRjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDJ2MTNjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmgtNnptLTYtMmg0djJoLTRWNHpNOSAxOFY5bDcuNSA0TDkgMTh6IiAvPjwvZz4KPGcgaWQ9InNob3AtdHdvIj48cGF0aCBkPSJNMyA5SDF2MTFjMCAxLjExLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS44OSAyLTJIM1Y5em0xNS00VjNjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDV2MTFjMCAxLjExLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS44OSAyLTJWNWgtNXptLTYtMmg0djJoLTRWM3ptMCAxMlY4bDUuNSAzLTUuNSA0eiIgLz48L2c+CjxnIGlkPSJzaG9wcGluZy1iYXNrZXQiPjxwYXRoIGQ9Ik0xNy4yMSA5bC00LjM4LTYuNTZjLS4xOS0uMjgtLjUxLS40Mi0uODMtLjQyLS4zMiAwLS42NC4xNC0uODMuNDNMNi43OSA5SDJjLS41NSAwLTEgLjQ1LTEgMSAwIC4wOS4wMS4xOC4wNC4yN2wyLjU0IDkuMjdjLjIzLjg0IDEgMS40NiAxLjkyIDEuNDZoMTNjLjkyIDAgMS42OS0uNjIgMS45My0xLjQ2bDIuNTQtOS4yN0wyMyAxMGMwLS41NS0uNDUtMS0xLTFoLTQuNzl6TTkgOWwzLTQuNEwxNSA5SDl6bTMgOGMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6IiAvPjwvZz4KPGcgaWQ9InNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik03IDE4Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yek0xIDJ2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINS4yMWwtLjk0LTJIMXptMTYgMTZjLTEuMSAwLTEuOTkuOS0xLjk5IDJzLjg5IDIgMS45OSAyIDItLjkgMi0yLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJzb3J0Ij48cGF0aCBkPSJNMyAxOGg2di0ySDN2MnpNMyA2djJoMThWNkgzem0wIDdoMTJ2LTJIM3YyeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLW5vdGVzIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTggMTRINnYtMmgydjJ6bTAtM0g2VjloMnYyem0wLTNINlY2aDJ2MnptNyA2aC01di0yaDV2MnptMy0zaC04VjloOHYyem0wLTNoLThWNmg4djJ6IiAvPjwvZz4KPGcgaWQ9InNwZWFrZXItbm90ZXMtb2ZmIj48cGF0aCBkPSJNMTAuNTQgMTFsLS41NC0uNTRMNy41NCA4IDYgNi40NiAyLjM4IDIuODQgMS4yNyAxLjczIDAgM2wyLjAxIDIuMDFMMiAyMmw0LTRoOWw1LjczIDUuNzNMMjIgMjIuNDYgMTcuNTQgMThsLTctN3pNOCAxNEg2di0yaDJ2MnptLTItM1Y5bDIgMkg2em0xNC05SDQuMDhMMTAgNy45MlY2aDh2MmgtNy45MmwxIDFIMTh2MmgtNC45Mmw2Ljk5IDYuOTlDMjEuMTQgMTcuOTUgMjIgMTcuMDggMjIgMTZWNGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ic3BlbGxjaGVjayI+PHBhdGggZD0iTTEyLjQ1IDE2aDIuMDlMOS40MyAzSDcuNTdMMi40NiAxNmgyLjA5bDEuMTItM2g1LjY0bDEuMTQgM3ptLTYuMDItNUw4LjUgNS40OCAxMC41NyAxMUg2LjQzem0xNS4xNi41OWwtOC4wOSA4LjA5TDkuODMgMTZsLTEuNDEgMS40MSA1LjA5IDUuMDlMMjMgMTNsLTEuNDEtMS40MXoiIC8+PC9nPgo8ZyBpZD0ic3RhciI+PHBhdGggZD0iTTEyIDE3LjI3TDE4LjE4IDIxbC0xLjY0LTcuMDNMMjIgOS4yNGwtNy4xOS0uNjFMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxeiIgLz48L2c+CjxnIGlkPSJzdGFyLWJvcmRlciI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRsLTMuNzYgMi4yNyAxLTQuMjgtMy4zMi0yLjg4IDQuMzgtLjM4TDEyIDYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6IiAvPjwvZz4KPGcgaWQ9InN0YXItaGFsZiI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRWNi4xbDEuNzEgNC4wNCA0LjM4LjM4LTMuMzIgMi44OCAxIDQuMjhMMTIgMTUuNHoiIC8+PC9nPgo8ZyBpZD0ic3RhcnMiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyem00LjI0IDE2TDEyIDE1LjQ1IDcuNzcgMThsMS4xMi00LjgxLTMuNzMtMy4yMyA0LjkyLS40MkwxMiA1bDEuOTIgNC41MyA0LjkyLjQyLTMuNzMgMy4yM0wxNi4yMyAxOHoiIC8+PC9nPgo8ZyBpZD0ic3RvcmUiPjxwYXRoIGQ9Ik0yMCA0SDR2MmgxNlY0em0xIDEwdi0ybC0xLTVINGwtMSA1djJoMXY2aDEwdi02aDR2Nmgydi02aDF6bS05IDRINnYtNGg2djR6IiAvPjwvZz4KPGcgaWQ9InN1YmRpcmVjdG9yeS1hcnJvdy1sZWZ0Ij48cGF0aCBkPSJNMTEgOWwxLjQyIDEuNDJMOC44MyAxNEgxOFY0aDJ2MTJIOC44M2wzLjU5IDMuNThMMTEgMjFsLTYtNiA2LTZ6IiAvPjwvZz4KPGcgaWQ9InN1YmRpcmVjdG9yeS1hcnJvdy1yaWdodCI+PHBhdGggZD0iTTE5IDE1bC02IDYtMS40Mi0xLjQyTDE1LjE3IDE2SDRWNGgydjEwaDkuMTdsLTMuNTktMy41OEwxMyA5bDYgNnoiIC8+PC9nPgo8ZyBpZD0ic3ViamVjdCI+PHBhdGggZD0iTTE0IDE3SDR2MmgxMHYtMnptNi04SDR2MmgxNlY5ek00IDE1aDE2di0ySDR2MnpNNCA1djJoMTZWNUg0eiIgLz48L2c+CjxnIGlkPSJzdXBlcnZpc29yLWFjY291bnQiPjxwYXRoIGQ9Ik0xNi41IDEyYzEuMzggMCAyLjQ5LTEuMTIgMi40OS0yLjVTMTcuODggNyAxNi41IDdDMTUuMTIgNyAxNCA4LjEyIDE0IDkuNXMxLjEyIDIuNSAyLjUgMi41ek05IDExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zUzEwLjY2IDUgOSA1QzcuMzQgNSA2IDYuMzQgNiA4czEuMzQgMyAzIDN6bTcuNSAzYy0xLjgzIDAtNS41LjkyLTUuNSAyLjc1VjE5aDExdi0yLjI1YzAtMS44My0zLjY3LTIuNzUtNS41LTIuNzV6TTkgMTNjLTIuMzMgMC03IDEuMTctNyAzLjVWMTloN3YtMi4yNWMwLS44NS4zMy0yLjM0IDIuMzctMy40N0MxMC41IDEzLjEgOS42NiAxMyA5IDEzeiIgLz48L2c+CjxnIGlkPSJzd2FwLWhvcml6Ij48cGF0aCBkPSJNNi45OSAxMUwzIDE1bDMuOTkgNHYtM0gxNHYtMkg2Ljk5di0zek0yMSA5bC0zLjk5LTR2M0gxMHYyaDcuMDF2M0wyMSA5eiIgLz48L2c+CjxnIGlkPSJzd2FwLXZlcnQiPjxwYXRoIGQ9Ik0xNiAxNy4wMVYxMGgtMnY3LjAxaC0zTDE1IDIxbDQtMy45OWgtM3pNOSAzTDUgNi45OWgzVjE0aDJWNi45OWgzTDkgM3oiIC8+PC9nPgo8ZyBpZD0ic3dhcC12ZXJ0aWNhbC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyek02LjUgOUwxMCA1LjUgMTMuNSA5SDExdjRIOVY5SDYuNXptMTEgNkwxNCAxOC41IDEwLjUgMTVIMTN2LTRoMnY0aDIuNXoiIC8+PC9nPgo8ZyBpZD0ic3lzdGVtLXVwZGF0ZS1hbHQiPjxwYXRoIGQ9Ik0xMiAxNi41bDQtNGgtM3YtOWgtMnY5SDhsNCA0em05LTEzaC02djEuOTloNnYxNC4wM0gzVjUuNDloNlYzLjVIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnYtMTRjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InRhYiI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDNWNWgxMHY0aDh2MTB6IiAvPjwvZz4KPGcgaWQ9InRhYi11bnNlbGVjdGVkIj48cGF0aCBkPSJNMSA5aDJWN0gxdjJ6bTAgNGgydi0ySDF2MnptMC04aDJWM2MtMS4xIDAtMiAuOS0yIDJ6bTggMTZoMnYtMkg5djJ6bS04LTRoMnYtMkgxdjJ6bTIgNHYtMkgxYzAgMS4xLjkgMiAyIDJ6TTIxIDNoLTh2NmgxMFY1YzAtMS4xLS45LTItMi0yem0wIDE0aDJ2LTJoLTJ2MnpNOSA1aDJWM0g5djJ6TTUgMjFoMnYtMkg1djJ6TTUgNWgyVjNINXYyem0xNiAxNmMxLjEgMCAyLS45IDItMmgtMnYyem0wLThoMnYtMmgtMnYyem0tOCA4aDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0idGV4dC1mb3JtYXQiPjxwYXRoIGQ9Ik01IDE3djJoMTR2LTJINXptNC41LTQuMmg1bC45IDIuMmgyLjFMMTIuNzUgNGgtMS41TDYuNSAxNWgyLjFsLjktMi4yek0xMiA1Ljk4TDEzLjg3IDExaC0zLjc0TDEyIDUuOTh6IiAvPjwvZz4KPGcgaWQ9InRoZWF0ZXJzIj48cGF0aCBkPSJNMTggM3YyaC0yVjNIOHYySDZWM0g0djE4aDJ2LTJoMnYyaDh2LTJoMnYyaDJWM2gtMnpNOCAxN0g2di0yaDJ2MnptMC00SDZ2LTJoMnYyem0wLTRINlY3aDJ2MnptMTAgOGgtMnYtMmgydjJ6bTAtNGgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2MnoiIC8+PC9nPgo8ZyBpZD0idGh1bWItZG93biI+PHBhdGggZD0iTTE1IDNINmMtLjgzIDAtMS41NC41LTEuODQgMS4yMmwtMy4wMiA3LjA1Yy0uMDkuMjMtLjE0LjQ3LS4xNC43M3YxLjkxbC4wMS4wMUwxIDE0YzAgMS4xLjkgMiAyIDJoNi4zMWwtLjk1IDQuNTctLjAzLjMyYzAgLjQxLjE3Ljc5LjQ0IDEuMDZMOS44MyAyM2w2LjU5LTYuNTljLjM2LS4zNi41OC0uODYuNTgtMS40MVY1YzAtMS4xLS45LTItMi0yem00IDB2MTJoNFYzaC00eiIgLz48L2c+CjxnIGlkPSJ0aHVtYi11cCI+PHBhdGggZD0iTTEgMjFoNFY5SDF2MTJ6bTIyLTExYzAtMS4xLS45LTItMi0yaC02LjMxbC45NS00LjU3LjAzLS4zMmMwLS40MS0uMTctLjc5LS40NC0xLjA2TDE0LjE3IDEgNy41OSA3LjU5QzcuMjIgNy45NSA3IDguNDUgNyA5djEwYzAgMS4xLjkgMiAyIDJoOWMuODMgMCAxLjU0LS41IDEuODQtMS4yMmwzLjAyLTcuMDVjLjA5LS4yMy4xNC0uNDcuMTQtLjczdi0xLjkxbC0uMDEtLjAxTDIzIDEweiIgLz48L2c+CjxnIGlkPSJ0aHVtYnMtdXAtZG93biI+PHBhdGggZD0iTTEyIDZjMC0uNTUtLjQ1LTEtMS0xSDUuODJsLjY2LTMuMTguMDItLjIzYzAtLjMxLS4xMy0uNTktLjMzLS44TDUuMzggMCAuNDQgNC45NEMuMTcgNS4yMSAwIDUuNTkgMCA2djYuNWMwIC44My42NyAxLjUgMS41IDEuNWg2Ljc1Yy42MiAwIDEuMTUtLjM4IDEuMzgtLjkxbDIuMjYtNS4yOWMuMDctLjE3LjExLS4zNi4xMS0uNTVWNnptMTAuNSA0aC02Ljc1Yy0uNjIgMC0xLjE1LjM4LTEuMzguOTFsLTIuMjYgNS4yOWMtLjA3LjE3LS4xMS4zNi0uMTEuNTVWMThjMCAuNTUuNDUgMSAxIDFoNS4xOGwtLjY2IDMuMTgtLjAyLjI0YzAgLjMxLjEzLjU5LjMzLjhsLjc5Ljc4IDQuOTQtNC45NGMuMjctLjI3LjQ0LS42NS40NC0xLjA2di02LjVjMC0uODMtLjY3LTEuNS0xLjUtMS41eiIgLz48L2c+CjxnIGlkPSJ0aW1lbGluZSI+PHBhdGggZD0iTTIzIDhjMCAxLjEtLjkgMi0yIDItLjE4IDAtLjM1LS4wMi0uNTEtLjA3bC0zLjU2IDMuNTVjLjA1LjE2LjA3LjM0LjA3LjUyIDAgMS4xLS45IDItMiAycy0yLS45LTItMmMwLS4xOC4wMi0uMzYuMDctLjUybC0yLjU1LTIuNTVjLS4xNi4wNS0uMzQuMDctLjUyLjA3cy0uMzYtLjAyLS41Mi0uMDdsLTQuNTUgNC41NmMuMDUuMTYuMDcuMzMuMDcuNTEgMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yIC45LTIgMi0yYy4xOCAwIC4zNS4wMi41MS4wN2w0LjU2LTQuNTVDOC4wMiA5LjM2IDggOS4xOCA4IDljMC0xLjEuOS0yIDItMnMyIC45IDIgMmMwIC4xOC0uMDIuMzYtLjA3LjUybDIuNTUgMi41NWMuMTYtLjA1LjM0LS4wNy41Mi0uMDdzLjM2LjAyLjUyLjA3bDMuNTUtMy41NkMxOS4wMiA4LjM1IDE5IDguMTggMTkgOGMwLTEuMS45LTIgMi0yczIgLjkgMiAyeiIgLz48L2c+CjxnIGlkPSJ0b2MiPjxwYXRoIGQ9Ik0zIDloMTRWN0gzdjJ6bTAgNGgxNHYtMkgzdjJ6bTAgNGgxNHYtMkgzdjJ6bTE2IDBoMnYtMmgtMnYyem0wLTEwdjJoMlY3aC0yem0wIDZoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJ0b2RheSI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOGgxNHYxMXpNNyAxMGg1djVIN3oiIC8+PC9nPgo8ZyBpZD0idG9sbCI+PHBhdGggZD0iTTE1IDRjLTQuNDIgMC04IDMuNTgtOCA4czMuNTggOCA4IDggOC0zLjU4IDgtOC0zLjU4LTgtOC04em0wIDE0Yy0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02IDYgMi42OSA2IDYtMi42OSA2LTYgNnpNMyAxMmMwLTIuNjEgMS42Ny00LjgzIDQtNS42NVY0LjI2QzMuNTUgNS4xNSAxIDguMjcgMSAxMnMyLjU1IDYuODUgNiA3Ljc0di0yLjA5Yy0yLjMzLS44Mi00LTMuMDQtNC01LjY1eiIgLz48L2c+CjxnIGlkPSJ0b3VjaC1hcHAiPjxwYXRoIGQ9Ik05IDExLjI0VjcuNUM5IDYuMTIgMTAuMTIgNSAxMS41IDVTMTQgNi4xMiAxNCA3LjV2My43NGMxLjIxLS44MSAyLTIuMTggMi0zLjc0QzE2IDUuMDEgMTMuOTkgMyAxMS41IDNTNyA1LjAxIDcgNy41YzAgMS41Ni43OSAyLjkzIDIgMy43NHptOS44NCA0LjYzbC00LjU0LTIuMjZjLS4xNy0uMDctLjM1LS4xMS0uNTQtLjExSDEzdi02YzAtLjgzLS42Ny0xLjUtMS41LTEuNVMxMCA2LjY3IDEwIDcuNXYxMC43NGwtMy40My0uNzJjLS4wOC0uMDEtLjE1LS4wMy0uMjQtLjAzLS4zMSAwLS41OS4xMy0uNzkuMzNsLS43OS44IDQuOTQgNC45NGMuMjcuMjcuNjUuNDQgMS4wNi40NGg2Ljc5Yy43NSAwIDEuMzMtLjU1IDEuNDQtMS4yOGwuNzUtNS4yN2MuMDEtLjA3LjAyLS4xNC4wMi0uMiAwLS42Mi0uMzgtMS4xNi0uOTEtMS4zOHoiIC8+PC9nPgo8ZyBpZD0idHJhY2stY2hhbmdlcyI+PHBhdGggZD0iTTE5LjA3IDQuOTNsLTEuNDEgMS40MUMxOS4xIDcuNzkgMjAgOS43OSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHMtOC0zLjU4LTgtOGMwLTQuMDggMy4wNS03LjQ0IDctNy45M3YyLjAyQzguMTYgNi41NyA2IDkuMDMgNiAxMmMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02YzAtMS42Ni0uNjctMy4xNi0xLjc2LTQuMjRsLTEuNDEgMS40MUMxNS41NSA5LjkgMTYgMTAuOSAxNiAxMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNGMwLTEuODYgMS4yOC0zLjQxIDMtMy44NnYyLjE0Yy0uNi4zNS0xIC45OC0xIDEuNzIgMCAxLjEuOSAyIDIgMnMyLS45IDItMmMwLS43NC0uNC0xLjM4LTEtMS43MlYyaC0xQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBjMC0yLjc2LTEuMTItNS4yNi0yLjkzLTcuMDd6IiAvPjwvZz4KPGcgaWQ9InRyYW5zbGF0ZSI+PHBhdGggZD0iTTEyLjg3IDE1LjA3bC0yLjU0LTIuNTEuMDMtLjAzYzEuNzQtMS45NCAyLjk4LTQuMTcgMy43MS02LjUzSDE3VjRoLTdWMkg4djJIMXYxLjk5aDExLjE3QzExLjUgNy45MiAxMC40NCA5Ljc1IDkgMTEuMzUgOC4wNyAxMC4zMiA3LjMgOS4xOSA2LjY5IDhoLTJjLjczIDEuNjMgMS43MyAzLjE3IDIuOTggNC41NmwtNS4wOSA1LjAyTDQgMTlsNS01IDMuMTEgMy4xMS43Ni0yLjA0ek0xOC41IDEwaC0yTDEyIDIyaDJsMS4xMi0zaDQuNzVMMjEgMjJoMmwtNC41LTEyem0tMi42MiA3bDEuNjItNC4zM0wxOS4xMiAxN2gtMy4yNHoiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctZG93biI+PHBhdGggZD0iTTE2IDE4bDIuMjktMi4yOS00Ljg4LTQuODgtNCA0TDIgNy40MSAzLjQxIDZsNiA2IDQtNCA2LjMgNi4yOUwyMiAxMnY2eiIgLz48L2c+CjxnIGlkPSJ0cmVuZGluZy1mbGF0Ij48cGF0aCBkPSJNMjIgMTJsLTQtNHYzSDN2MmgxNXYzeiIgLz48L2c+CjxnIGlkPSJ0cmVuZGluZy11cCI+PHBhdGggZD0iTTE2IDZsMi4yOSAyLjI5LTQuODggNC44OC00LTRMMiAxNi41OSAzLjQxIDE4bDYtNiA0IDQgNi4zLTYuMjlMMjIgMTJWNnoiIC8+PC9nPgo8ZyBpZD0idHVybmVkLWluIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ0dXJuZWQtaW4tbm90Ij48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiIgLz48L2c+CjxnIGlkPSJ1bmFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NSA1LjIybC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTUuNTVMMy40NiA1LjIyQzMuMTcgNS41NyAzIDYuMDEgMyA2LjVWMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNi41YzAtLjQ5LS4xNy0uOTMtLjQ1LTEuMjh6TTEyIDkuNWw1LjUgNS41SDE0djJoLTR2LTJINi41TDEyIDkuNXpNNS4xMiA1bC44Mi0xaDEybC45MyAxSDUuMTJ6IiAvPjwvZz4KPGcgaWQ9InVuZG8iPjxwYXRoIGQ9Ik0xMi41IDhjLTIuNjUgMC01LjA1Ljk5LTYuOSAyLjZMMiA3djloOWwtMy42Mi0zLjYyYzEuMzktMS4xNiAzLjE2LTEuODggNS4xMi0xLjg4IDMuNTQgMCA2LjU1IDIuMzEgNy42IDUuNWwyLjM3LS43OEMyMS4wOCAxMS4wMyAxNy4xNSA4IDEyLjUgOHoiIC8+PC9nPgo8ZyBpZD0idW5mb2xkLWxlc3MiPjxwYXRoIGQ9Ik03LjQxIDE4LjU5TDguODMgMjAgMTIgMTYuODMgMTUuMTcgMjBsMS40MS0xLjQxTDEyIDE0bC00LjU5IDQuNTl6bTkuMTgtMTMuMThMMTUuMTcgNCAxMiA3LjE3IDguODMgNCA3LjQxIDUuNDEgMTIgMTBsNC41OS00LjU5eiIgLz48L2c+CjxnIGlkPSJ1bmZvbGQtbW9yZSI+PHBhdGggZD0iTTEyIDUuODNMMTUuMTcgOWwxLjQxLTEuNDFMMTIgMyA3LjQxIDcuNTkgOC44MyA5IDEyIDUuODN6bTAgMTIuMzRMOC44MyAxNWwtMS40MSAxLjQxTDEyIDIxbDQuNTktNC41OUwxNS4xNyAxNSAxMiAxOC4xN3oiIC8+PC9nPgo8ZyBpZD0idXBkYXRlIj48cGF0aCBkPSJNMjEgMTAuMTJoLTYuNzhsMi43NC0yLjgyYy0yLjczLTIuNy03LjE1LTIuOC05Ljg4LS4xLTIuNzMgMi43MS0yLjczIDcuMDggMCA5Ljc5IDIuNzMgMi43MSA3LjE1IDIuNzEgOS44OCAwQzE4LjMyIDE1LjY1IDE5IDE0LjA4IDE5IDEyLjFoMmMwIDEuOTgtLjg4IDQuNTUtMi42NCA2LjI5LTMuNTEgMy40OC05LjIxIDMuNDgtMTIuNzIgMC0zLjUtMy40Ny0zLjUzLTkuMTEtLjAyLTEyLjU4IDMuNTEtMy40NyA5LjE0LTMuNDcgMTIuNjUgMEwyMSAzdjcuMTJ6TTEyLjUgOHY0LjI1bDMuNSAyLjA4LS43MiAxLjIxTDExIDEzVjhoMS41eiIgLz48L2c+CjxnIGlkPSJ2ZXJpZmllZC11c2VyIj48cGF0aCBkPSJNMTIgMUwzIDV2NmMwIDUuNTUgMy44NCAxMC43NCA5IDEyIDUuMTYtMS4yNiA5LTYuNDUgOS0xMlY1bC05LTR6bS0yIDE2bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6IiAvPjwvZz4KPGcgaWQ9InZpZXctYWdlbmRhIj48cGF0aCBkPSJNMjAgMTNIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xdi02YzAtLjU1LS40NS0xLTEtMXptMC0xMEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWNGMwLS41NS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9InZpZXctYXJyYXkiPjxwYXRoIGQ9Ik00IDE4aDNWNUg0djEzek0xOCA1djEzaDNWNWgtM3pNOCAxOGg5VjVIOHYxM3oiIC8+PC9nPgo8ZyBpZD0idmlldy1jYXJvdXNlbCI+PHBhdGggZD0iTTcgMTloMTBWNEg3djE1em0tNS0yaDRWNkgydjExek0xOCA2djExaDRWNmgtNHoiIC8+PC9nPgo8ZyBpZD0idmlldy1jb2x1bW4iPjxwYXRoIGQ9Ik0xMCAxOGg1VjVoLTV2MTN6bS02IDBoNVY1SDR2MTN6TTE2IDV2MTNoNVY1aC01eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWRheSI+PHBhdGggZD0iTTIgMjFoMTl2LTNIMnYzek0yMCA4SDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMVY5YzAtLjU1LS40NS0xLTEtMXpNMiAzdjNoMTlWM0gyeiIgLz48L2c+CjxnIGlkPSJ2aWV3LWhlYWRsaW5lIj48cGF0aCBkPSJNNCAxNWgxNnYtMkg0djJ6bTAgNGgxNnYtMkg0djJ6bTAtOGgxNlY5SDR2MnptMC02djJoMTZWNUg0eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWxpc3QiPjxwYXRoIGQ9Ik00IDE0aDR2LTRINHY0em0wIDVoNHYtNEg0djR6TTQgOWg0VjVINHY0em01IDVoMTJ2LTRIOXY0em0wIDVoMTJ2LTRIOXY0ek05IDV2NGgxMlY1SDl6IiAvPjwvZz4KPGcgaWQ9InZpZXctbW9kdWxlIj48cGF0aCBkPSJNNCAxMWg1VjVINHY2em0wIDdoNXYtNkg0djZ6bTYgMGg1di02aC01djZ6bTYgMGg1di02aC01djZ6bS02LTdoNVY1aC01djZ6bTYtNnY2aDVWNWgtNXoiIC8+PC9nPgo8ZyBpZD0idmlldy1xdWlsdCI+PHBhdGggZD0iTTEwIDE4aDV2LTZoLTV2NnptLTYgMGg1VjVINHYxM3ptMTIgMGg1di02aC01djZ6TTEwIDV2NmgxMVY1SDEweiIgLz48L2c+CjxnIGlkPSJ2aWV3LXN0cmVhbSI+PHBhdGggZD0iTTQgMThoMTd2LTZINHY2ek00IDV2NmgxN1Y1SDR6IiAvPjwvZz4KPGcgaWQ9InZpZXctd2VlayI+PHBhdGggZD0iTTYgNUgzYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bTE0IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXptLTcgMGgtM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xeiIgLz48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5Ij48cGF0aCBkPSJNMTIgNC41QzcgNC41IDIuNzMgNy42MSAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjVzOS4yNy0zLjExIDExLTcuNWMtMS43My00LjM5LTYtNy41LTExLTcuNXpNMTIgMTdjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLThjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiIgLz48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5LW9mZiI+PHBhdGggZD0iTTEyIDdjMi43NiAwIDUgMi4yNCA1IDUgMCAuNjUtLjEzIDEuMjYtLjM2IDEuODNsMi45MiAyLjkyYzEuNTEtMS4yNiAyLjctMi44OSAzLjQzLTQuNzUtMS43My00LjM5LTYtNy41LTExLTcuNS0xLjQgMC0yLjc0LjI1LTMuOTguN2wyLjE2IDIuMTZDMTAuNzQgNy4xMyAxMS4zNSA3IDEyIDd6TTIgNC4yN2wyLjI4IDIuMjguNDYuNDZDMy4wOCA4LjMgMS43OCAxMC4wMiAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjUgMS41NSAwIDMuMDMtLjMgNC4zOC0uODRsLjQyLjQyTDE5LjczIDIyIDIxIDIwLjczIDMuMjcgMyAyIDQuMjd6TTcuNTMgOS44bDEuNTUgMS41NWMtLjA1LjIxLS4wOC40My0uMDguNjUgMCAxLjY2IDEuMzQgMyAzIDMgLjIyIDAgLjQ0LS4wMy42NS0uMDhsMS41NSAxLjU1Yy0uNjcuMzMtMS40MS41My0yLjIuNTMtMi43NiAwLTUtMi4yNC01LTUgMC0uNzkuMi0xLjUzLjUzLTIuMnptNC4zMS0uNzhsMy4xNSAzLjE1LjAyLS4xNmMwLTEuNjYtMS4zNC0zLTMtM2wtLjE3LjAxeiIgLz48L2c+CjxnIGlkPSJ3YXJuaW5nIj48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJ3YXRjaC1sYXRlciI+PHBhdGggZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyem00LjIgMTQuMkwxMSAxM1Y3aDEuNXY1LjJsNC41IDIuNy0uOCAxLjN6IiAvPjwvZz4KPGcgaWQ9IndlZWtlbmQiPjxwYXRoIGQ9Ik0yMSAxMGMtMS4xIDAtMiAuOS0yIDJ2M0g1di0zYzAtMS4xLS45LTItMi0ycy0yIC45LTIgMnY1YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTVjMC0xLjEtLjktMi0yLTJ6bS0zLTVINmMtMS4xIDAtMiAuOS0yIDJ2Mi4xNWMxLjE2LjQxIDIgMS41MSAyIDIuODJWMTRoMTJ2LTIuMDNjMC0xLjMuODQtMi40IDItMi44MlY3YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ3b3JrIj48cGF0aCBkPSJNMjAgNmgtNFY0YzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2Mkg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS02IDBoLTRWNGg0djJ6IiAvPjwvZz4KPGcgaWQ9InlvdXR1YmUtc2VhcmNoZWQtZm9yIj48cGF0aCBkPSJNMTcuMDEgMTRoLS44bC0uMjctLjI3Yy45OC0xLjE0IDEuNTctMi42MSAxLjU3LTQuMjMgMC0zLjU5LTIuOTEtNi41LTYuNS02LjVzLTYuNSAzLTYuNSA2LjVIMmwzLjg0IDQgNC4xNi00SDYuNTFDNi41MSA3IDguNTMgNSAxMS4wMSA1czQuNSAyLjAxIDQuNSA0LjVjMCAyLjQ4LTIuMDIgNC41LTQuNSA0LjUtLjY1IDAtMS4yNi0uMTQtMS44Mi0uMzhMNy43MSAxNS4xYy45Ny41NyAyLjA5LjkgMy4zLjkgMS42MSAwIDMuMDgtLjU5IDQuMjItMS41N2wuMjcuMjd2Ljc5bDUuMDEgNC45OUwyMiAxOWwtNC45OS01eiIgLz48L2c+CjxnIGlkPSJ6b29tLWluIj48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHptMi41LTRoLTJ2Mkg5di0ySDdWOWgyVjdoMXYyaDJ2MXoiIC8+PC9nPgo8ZyBpZD0iem9vbS1vdXQiPjxwYXRoIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0ek03IDloNXYxSDd6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pY29uLWJ1dHRvbiI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CgogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIGhlaWdodDogNDBweDsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLyogQmVjYXVzZSBvZiBwb2x5bWVyLzI1NTgsIHRoaXMgc3R5bGUgaGFzIGxvd2VyIHNwZWNpZmljaXR5IHRoYW4gKiAqLwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b247CiAgICAgIH0KCiAgICAgIDpob3N0ICNpbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZC10ZXh0LCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBhdXRvOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpob3ZlcikgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uLWhvdmVyOwogICAgICB9CgogICAgICBpcm9uLWljb24gewogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxMDAlOwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8aXJvbi1pY29uIGlkPSJpY29uIiBzcmM9Iltbc3JjXV0iIGljb249IltbaWNvbl1dIiBhbHQkPSJbW2FsdF1dIj48L2lyb24taWNvbj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJydW4tY29sb3Itc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2NvbG9yLWNsYXNzPSdsaWdodC1ibHVlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncmVkJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdncmVlbiddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwdXJwbGUnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J3RlYWwnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwaW5rJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nb3JhbmdlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdicm93biddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdpbmRpZ28nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tOTAwKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbXVsdGktY2hlY2tib3giPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icnVuLWNvbG9yLXN0eWxlIj48L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dCBpZD0ibmFtZXMtcmVnZXgiIG5vLWxhYmVsLWZsb2F0IGxhYmVsPSJXcml0ZSBhIHJlZ2V4IHRvIGZpbHRlciBydW5zIiB2YWx1ZT0iW1tyZWdleF1dIiBvbi1iaW5kLXZhbHVlLWNoYW5nZWQ9Il9kZWJvdW5jZWRSZWdleENoYW5nZSI+PC9wYXBlci1pbnB1dD4KICAgIDxkaXYgaWQ9Im91dGVyLWNvbnRhaW5lciIgY2xhc3M9InNjcm9sbGJhciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbmFtZXNNYXRjaGluZ1JlZ2V4XV0iIG9uLWRvbS1jaGFuZ2U9InN5bmNocm9uaXplQ29sb3JzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYW1lLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciBjaGVja2JveC1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJjaGVja2JveCB2ZXJ0aWNhbC1hbGlnbi1jZW50ZXIiIGlkJD0iY2hlY2tib3gtW1tpdGVtXV0iIG5hbWU9IltbaXRlbV1dIiBjaGVja2VkJD0iW1tfaXNDaGVja2VkKGl0ZW0sIHNlbGVjdGlvblN0YXRlLiopXV0iIG9uLWNoYW5nZT0iX2NoZWNrYm94Q2hhbmdlIj48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciBpc29sYXRvci1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQiIGNsYXNzPSJpc29sYXRvciB2ZXJ0aWNhbC1hbGlnbi1jZW50ZXIiIG9uLXRhcD0iX2lzb2xhdGVOYW1lIiBuYW1lPSJbW2l0ZW1dXSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1sYWJlbC1jb250YWluZXIiPgogICAgICAgICAgICA8c3Bhbj5bW2l0ZW1dXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAjb3V0ZXItY29udGFpbmVyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5uYW1lLXJvdyB7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyAvKiBtYWtlcyB3cmFwcGluZyBvZiBoeXBlcnBhcmFtIHN0cmluZ3MgYmV0dGVyICovCiAgICAgIH0KICAgICAgLmljb24tY29udGFpbmVyIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmlzb2xhdG9yIHsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvci1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNnB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgfQogICAgICAuY2hlY2tib3gtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAuaXRlbS1sYWJlbC1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICB3aWR0aDogMHB4OyAvKiBoYWNrIHRvIGdldCB0aGUgZmxleC1ncm93IHRvIHdvcmsgcHJvcGVybHkgKi8KICAgICAgfQogICAgICAudG9vbHRpcC12YWx1ZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tY2VudGVyIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tdG9wIHsKICAgICAgICBhbGlnbi1zZWxmOiBzdGFydDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtd2JyLXN0cmluZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19wYXJ0c11dIiBhcz0icGFydCI+W1twYXJ0XV08d2JyPjwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcnVucy1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyB3aXRoLWJhY2tkcm9wIGlkPSJkYXRhLWxvY2F0aW9uLWRpYWxvZyI+CiAgICAgIDxoMj5EYXRhIExvY2F0aW9uPC9oMj4KICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbZGF0YUxvY2F0aW9uXV0iIC8+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxkaXYgaWQ9InRvcC10ZXh0Ij4KICAgICAgPGgzIGlkPSJ0b29sdGlwLWhlbHAiIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+UnVuczwvaDM+CiAgICA8L2Rpdj4KICAgIDx0Zi1tdWx0aS1jaGVja2JveCBpZD0ibXVsdGlDaGVja2JveCIgbmFtZXM9IltbcnVuc11dIiBzZWxlY3Rpb24tc3RhdGU9Int7cnVuU2VsZWN0aW9uU3RhdGV9fSIgb3V0LXNlbGVjdGVkPSJ7e3NlbGVjdGVkUnVuc319IiByZWdleD0ie3tyZWdleElucHV0fX0iIGNvbG9yaW5nPSJbW2NvbG9yaW5nXV0iPjwvdGYtbXVsdGktY2hlY2tib3g+CiAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgaWQ9InRvZ2dsZS1hbGwiIG9uLXRhcD0iX3RvZ2dsZUFsbCI+CiAgICAgIFRvZ2dsZSBBbGwgUnVucwogICAgPC9wYXBlci1idXR0b24+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZGF0YUxvY2F0aW9uXV0iPgogICAgICA8ZGl2IGlkPSJkYXRhLWxvY2F0aW9uIj4KICAgICAgICA8dGYtd2JyLXN0cmluZyB2YWx1ZT0iW1tfY2xpcHBlZERhdGFMb2NhdGlvbl1dIiAvPjx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvdWxkU2hvd0V4cGFuZERhdGFMb2NhdGlvbkJ1dHRvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKV1dIj48YSBocmVmPSIiIG9uLWNsaWNrPSJfb3BlbkRhdGFMb2NhdGlvbkRpYWxvZyI+4oCmPC9hPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgICB9CiAgICAgICN0b3AtdGV4dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICB9CiAgICAgIHRmLW11bHRpLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAjdG9vbHRpcC1oZWxwIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAjZGF0YS1sb2NhdGlvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiA1cHggMCAwIDA7CiAgICAgICAgbWF4LXdpZHRoOiAyODhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgLyogU1RZTEVTIEZPUiBUSEUgU1BJTk5FUiAqLwogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAvKgogICAgICAgKiBDb25zdGFudHM6CiAgICAgICAqICAgICAgQVJDU0laRSAgICAgPSAyNzAgZGVncmVlcyAoYW1vdW50IG9mIGNpcmNsZSB0aGUgYXJjIHRha2VzIHVwKQogICAgICAgKiAgICAgIEFSQ1RJTUUgICAgID0gMTMzM21zICh0aW1lIGl0IHRha2VzIHRvIGV4cGFuZCBhbmQgY29udHJhY3QgYXJjKQogICAgICAgKiAgICAgIEFSQ1NUQVJUUk9UID0gMjE2IGRlZ3JlZXMgKGhvdyBtdWNoIHRoZSBzdGFydCBsb2NhdGlvbiBvZiB0aGUgYXJjCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgcm90YXRlIGVhY2ggdGltZSwgMjE2IGdpdmVzIHVzIGEKICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgcG9pbnRlZCBzdGFyIHNoYXBlIChpdCdzIDM2MC81ICogMykuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSA3IHBvaW50ZWQgc3Rhciwgd2UgbWlnaHQgZG8KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MC83ICogMyA9IDE1NC4yODYpCiAgICAgICAqICAgICAgU0hSSU5LX1RJTUUgPSA0MDBtcwogICAgICAgKi8KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKCiAgICAgICAgLyogMzYwICogQVJDVElNRSAvIChBUkNTVEFSVFJPVCArICgzNjAtQVJDU0laRSkpICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbjogMTU2OG1zOwoKICAgICAgICAvKiBBUkNUSU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWV4cGFuZC1jb250cmFjdC1kdXJhdGlvbjogMTMzM21zOwoKICAgICAgICAvKiA0ICogQVJDVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uOiA1MzMybXM7CgogICAgICAgIC8qIFNIUklOS19USU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uOiA0MDBtczsKICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKCiAgICAgICAgLyogVGhlIHNwaW5uZXIgZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudHMgdGhhdCB3b3VsZCBoYXZlIHRvIGJlCiAgICAgICAgICogZmxpcHBlZCBpZiB0aGUgZGlyZWN0aW9uIGNoYW5nZXMuIEFsd2F5cyB1c2UgbHRyIHNvIHRoYXQgdGhlCiAgICAgICAgICogc3R5bGUgd29ya3Mgb3V0IGNvcnJlY3RseSBpbiBib3RoIGNhc2VzLiAqLwogICAgICAgIGRpcmVjdGlvbjogbHRyOwogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5hY3RpdmUgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjb250YWluZXItcm90YXRlIHsKICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIH0KICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTEgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTEtY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTUwMCkpOwogICAgICB9CgogICAgICAubGF5ZXItMiB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItMi1jb2xvciwgdmFyKC0tZ29vZ2xlLXJlZC01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTMgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTMtY29sb3IsIHZhcigtLWdvb2dsZS15ZWxsb3ctNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci00IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci00LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJTVBPUlRBTlQgTk9URSBBQk9VVCBDU1MgQU5JTUFUSU9OIFBST1BFUlRJRVMgKGtlYW51bGVlKToKICAgICAgICoKICAgICAgICogaU9TIFNhZmFyaSAodGVzdGVkIG9uIGlPUyA4LjEpIGRvZXMgbm90IGhhbmRsZSBhbmltYXRpb24tZGVsYXkgdmVyeSB3ZWxsIC0gaXQgZG9lc24ndAogICAgICAgKiBndWFyYW50ZWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RhcnQgX2V4YWN0bHlfIGFmdGVyIHRoYXQgdmFsdWUuIFNvIHdlIGF2b2lkIHVzaW5nCiAgICAgICAqIGFuaW1hdGlvbi1kZWxheSBhbmQgaW5zdGVhZCBzZXQgY3VzdG9tIGtleWZyYW1lcyBmb3IgZWFjaCBjb2xvciAoYXMgbGF5ZXItMnVuZGFudCBhcyBpdAogICAgICAgKiBzZWVtcykuCiAgICAgICAqLwogICAgICAuYWN0aXZlIC5zcGlubmVyLWxheWVyIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uKTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0xIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTEtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMS1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0yIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMi1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0zIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMy1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci00IHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTQtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItNC1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZykgfSAvKiAwLjUgKiBBUkNTSVpFICovCiAgICAgICAgMjUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovCiAgICAgICAgMzcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDU0MGRlZykgfSAvKiAyICAgKiBBUkNTSVpFICovCiAgICAgICAgNjIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovCiAgICAgICAgNzUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDk0NWRlZykgfSAvKiAzLjUgKiBBUkNTSVpFICovCiAgICAgICAgdG8gICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqLwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqLwogICAgICAgIDI1JSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSB9IC8qIDEgICAqIEFSQ1NJWkUgKi8KICAgICAgICAzNy41JSB7IHRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqLwogICAgICAgIDYyLjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKSB9IC8qIDIuNSAqIEFSQ1NJWkUgKi8KICAgICAgICA3NSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqLwogICAgICAgIHRvICAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZykgfSAvKiA0ICAgKiBBUkNTSVpFICovCiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0xLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDg5JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA4OSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDEgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMi1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAxNSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTMtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzYlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci00LWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDY1JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA2NSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhdGNoIHRoZSBnYXAgdGhhdCBhcHBlYXIgYmV0d2VlbiB0aGUgdHdvIGFkamFjZW50IGRpdi5jaXJjbGUtY2xpcHBlciB3aGlsZSB0aGUKICAgICAgICogc3Bpbm5lciBpcyByb3RhdGluZyAoYXBwZWFycyBvbiBDaHJvbWUgNTAsIFNhZmFyaSA5LjEuMSwgYW5kIEVkZ2UpLgogICAgICAgKi8KICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyIHsKICAgICAgICBsZWZ0OiA0NSU7CiAgICAgICAgd2lkdGg6IDEwJTsKICAgICAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsKICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyLAogICAgICAuY2lyY2xlLWNsaXBwZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm9yZGVyLXdpZHRoOiB2YXIoLS1wYXBlci1zcGlubmVyLXN0cm9rZS13aWR0aCwgM3B4KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlcjo6YWZ0ZXIgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMjAwJTsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5sZWZ0OjphZnRlciB7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIGxlZnQ6IC0xMDAlOwogICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLmdhcC1wYXRjaDo6YWZ0ZXIsCiAgICAgIC5hY3RpdmUgLmNpcmNsZS1jbGlwcGVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb24pOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIubGVmdDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGxlZnQtc3BpbjsKICAgICAgICBhbmltYXRpb24tbmFtZTogbGVmdC1zcGluOwogICAgICB9CgogICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsZWZ0LXNwaW4gewogICAgICAgIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB9CiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxlZnQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyByaWdodC1zcGluIHsKICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICAgIDUwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcmlnaHQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5jb29sZG93biB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZSwgZmFkZS1vdXQgdmFyKC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbikgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlLCBmYWRlLW91dCB2YXIoLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uKSBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItbGl0ZSI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItc3Bpbm5lci1zdHlsZXMiPjwvc3R5bGU+CgogICAgPGRpdiBpZD0ic3Bpbm5lckNvbnRhaW5lciIgY2xhc3MtbmFtZT0iW1tfX2NvbXB1dGVDb250YWluZXJDbGFzc2VzKGFjdGl2ZSwgX19jb29saW5nRG93bildXSIgb24tYW5pbWF0aW9uZW5kPSJfX3Jlc2V0IiBvbi13ZWJraXQtYW5pbWF0aW9uLWVuZD0iX19yZXNldCI+CiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIGxlZnQiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIHJpZ2h0Ij48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxzdHlsZT4KLnBsb3R0YWJsZS1jb2xvcnMtMCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzUyNzljNzsgLyogSU5ESUdPICovCn0KCi5wbG90dGFibGUtY29sb3JzLTEgewogIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTMgewogIGJhY2tncm91bmQtY29sb3I6ICNmYWQ0MTk7IC8qIEJSSUdIVF9TVU4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy01IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy02IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGIyZTY1OyAvKiBDRVJJU0VfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTcgewogIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA2Y2NjYzsgLyogUk9CSU5TX0VHR19CTFVFICovCn0KCi8qKgogKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuCiAqLwoucGxvdHRhYmxlIHsKICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovCiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAvKioKICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTCiAgICogKGlubGluZSBvciB0aHJvdWdoIGEgc3R5bGVzaGVldCksIG9yIHVzaW5nIHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlCiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS4KICAgKgogICAqIFBvc3QgMy4wIHRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIGEgbm9ybWFsIGRpdiBhbmQgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgZGltZW5zaW9ucyBpcwogICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgIjEwMCUtYnktZGVmYXVsdCIgYmVoYXZpb3IsIHdlIGFwcGx5IHdpZHRoL2hlaWdodCAxMDAlLgogICAqLwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLgogKi8KLnBsb3R0YWJsZSAuY29tcG9uZW50IHsKICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovCiAgcG9zaXRpb246IGFic29sdXRlOwp9CgoucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lciwKLnBsb3R0YWJsZSAuY29udGVudCwKLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzCiAqLwoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIHsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICAvKioKICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuCiAgICovCiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7Cn0KCi5wbG90dGFibGUgdGV4dCB7CiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKfQoKLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuYmFyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQgewogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLm9mZi1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLXBsb3QgLm9mZi1iYXItbGFiZWwgewogIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqLwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgoucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsZXR0ZXItc3BhY2luZzogMXB4OwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUuYmFzZWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUgewogIGZpbGw6IHdoaXRlOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHN0cm9rZTogI0NDQzsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUgewogIHN0cm9rZTogIzk5OTsKfQoKLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUgewogIHN0cm9rZTogIzNDM0MzQzsgLyogaGFja2hhY2s6IGdyaWRsaW5lcyBzaG91bGQgYmUgc29saWQ7IHNlZSAjODIwICovCiAgb3BhY2l0eTogMC4yNTsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEgewogIGZpbGw6IGJsYWNrOwogIGZpbGwtb3BhY2l0eTogMC4wMzsKICBzdHJva2U6ICNDQ0M7Cn0KLyogRHJhZ0JveExheWVyICovCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIgewogIGN1cnNvcjogZXctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdGwgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRyIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1ibCB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYnIgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHsKICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovCiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgY3Vyc29yOiBncmFiOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUgewogIGN1cnNvcjogLW1vei1ncmFiYmluZzsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgY3Vyc29yOiBncmFiYmluZzsKfQovKiAvRHJhZ0JveExheWVyICovCgoucGxvdHRhYmxlIC5ndWlkZS1saW5lLWxheWVyIGxpbmUuZ3VpZGUtbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLmhvcml6b250YWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3ggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC53YXRlcmZhbGwtcGxvdCBsaW5lLmNvbm5lY3RvciB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUgewogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KPC9zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwbG90dGFibGUtc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KLnBsb3R0YWJsZS1jb2xvcnMtMCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzUyNzljNzsgLyogSU5ESUdPICovCn0KCi5wbG90dGFibGUtY29sb3JzLTEgewogIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTMgewogIGJhY2tncm91bmQtY29sb3I6ICNmYWQ0MTk7IC8qIEJSSUdIVF9TVU4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy01IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy02IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGIyZTY1OyAvKiBDRVJJU0VfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTcgewogIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA2Y2NjYzsgLyogUk9CSU5TX0VHR19CTFVFICovCn0KCi8qKgogKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuCiAqLwoucGxvdHRhYmxlIHsKICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovCiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAvKioKICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTCiAgICogKGlubGluZSBvciB0aHJvdWdoIGEgc3R5bGVzaGVldCksIG9yIHVzaW5nIHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlCiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS4KICAgKgogICAqIFBvc3QgMy4wIHRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIGEgbm9ybWFsIGRpdiBhbmQgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgZGltZW5zaW9ucyBpcwogICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgIjEwMCUtYnktZGVmYXVsdCIgYmVoYXZpb3IsIHdlIGFwcGx5IHdpZHRoL2hlaWdodCAxMDAlLgogICAqLwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLgogKi8KLnBsb3R0YWJsZSAuY29tcG9uZW50IHsKICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovCiAgcG9zaXRpb246IGFic29sdXRlOwp9CgoucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lciwKLnBsb3R0YWJsZSAuY29udGVudCwKLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzCiAqLwoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIHsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICAvKioKICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuCiAgICovCiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7Cn0KCi5wbG90dGFibGUgdGV4dCB7CiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKfQoKLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuYmFyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQgewogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLm9mZi1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLXBsb3QgLm9mZi1iYXItbGFiZWwgewogIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqLwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgoucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsZXR0ZXItc3BhY2luZzogMXB4OwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUuYmFzZWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUgewogIGZpbGw6IHdoaXRlOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHN0cm9rZTogI0NDQzsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUgewogIHN0cm9rZTogIzk5OTsKfQoKLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUgewogIHN0cm9rZTogIzNDM0MzQzsgLyogaGFja2hhY2s6IGdyaWRsaW5lcyBzaG91bGQgYmUgc29saWQ7IHNlZSAjODIwICovCiAgb3BhY2l0eTogMC4yNTsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEgewogIGZpbGw6IGJsYWNrOwogIGZpbGwtb3BhY2l0eTogMC4wMzsKICBzdHJva2U6ICNDQ0M7Cn0KLyogRHJhZ0JveExheWVyICovCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIgewogIGN1cnNvcjogZXctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdGwgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRyIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1ibCB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYnIgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHsKICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovCiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgY3Vyc29yOiBncmFiOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUgewogIGN1cnNvcjogLW1vei1ncmFiYmluZzsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgY3Vyc29yOiBncmFiYmluZzsKfQovKiAvRHJhZ0JveExheWVyICovCgoucGxvdHRhYmxlIC5ndWlkZS1saW5lLWxheWVyIGxpbmUuZ3VpZGUtbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLmhvcml6b250YWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3ggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC53YXRlcmZhbGwtcGxvdCBsaW5lLmNvbm5lY3RvciB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUgewogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotY2hhcnQtdG9vbHRpcCI+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotcGFuLXpvb20tc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmhlbHAgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAxczsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDFzOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmYWRlLW91dDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDMwLCAzMCwgMzAsIDAuNik7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLmhlbHAgPiBzcGFuIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIH0KCiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1saW5lLWNoYXJ0MiI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0iY2hhcnRkaXYiPjwvZGl2PgogICAgPHZ6LWNoYXJ0LXRvb2x0aXAgaWQ9InRvb2x0aXAiIHBvc2l0aW9uPSJbW3Rvb2x0aXBQb3NpdGlvbl1dIiBjb250ZW50LWNvbXBvbmVudC1uYW1lPSJ2ei1saW5lLWNoYXJ0LXRvb2x0aXAiPjwvdnotY2hhcnQtdG9vbHRpcD4KICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idnotcGFuLXpvb20tc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICAgIGRpdiB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IC5tYWluIHsKICAgICAgICBjdXJzb3I6IGNyb3NzaGFpcjsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhbmtleSkgI2NoYXJ0ZGl2IDpub3QoLmRyYWctem9vbWluZykgLm1haW4gewogICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogICAgICAgIGN1cnNvcjogZ3JhYjsKICAgICAgfQoKICAgICAgOmhvc3QoLm1vdXNlZG93bikgI2NoYXJ0ZGl2IC5wYW5uaW5nIC5tYWluIHsKICAgICAgICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgICAgICAgY3Vyc29yOiBncmFiYmluZzsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IGxpbmUuZ3VpZGUtbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5OwogICAgICAgIHN0cm9rZS13aWR0aDogMS41cHg7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2OmhvdmVyIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idnotbGluZS1jaGFydC10b29sdGlwIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgPHRhYmxlPgogICAgICAgIDx0aGVhZD48L3RoZWFkPgogICAgICAgIDx0Ym9keT48L3Rib2R5PgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIHRoZWFkIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIHRib2R5IHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIxcHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgdGQgewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICB9CgogICAgICAuc3dhdGNoIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICB9CgogICAgICAuY2xvc2VzdCAuc3dhdGNoIHsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggI2ZmZjsKICAgICAgfQoKICAgICAgdGggewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5kaXN0YW50IHRkOm5vdCguc3dhdGNoKSB7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjaGFydC1hbmQtc3Bpbm5lci1jb250YWluZXIiPgogICAgICA8dnotbGluZS1jaGFydDIgaWQ9ImNoYXJ0IiBkYXRhLWxvYWRpbmckPSJbW2RhdGFMb2FkaW5nXV0iIGNvbG9yLXNjYWxlPSJbW2NvbG9yU2NhbGVdXSIgZGVmYXVsdC14LXJhbmdlPSJbW2RlZmF1bHRYUmFuZ2VdXSIgZGVmYXVsdC15LXJhbmdlPSJbW2RlZmF1bHRZUmFuZ2VdXSIgZmlsbC1hcmVhPSJbW2ZpbGxBcmVhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBvbi1jaGFydC1hdHRhY2hlZD0iX29uQ2hhcnRBdHRhY2hlZCIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiBzeW1ib2wtZnVuY3Rpb249Iltbc3ltYm9sRnVuY3Rpb25dXSIgdG9vbHRpcC1jb2x1bW5zPSJbW3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1t4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW3lWYWx1ZUFjY2Vzc29yXV0iPjwvdnotbGluZS1jaGFydDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkYXRhTG9hZGluZ11dIj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdChbX21heWJlLXJlbmRlcmVkLWluLWJhZC1zdGF0ZV0pIHZ6LWxpbmUtY2hhcnQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2NoYXJ0LWFuZC1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjbG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDJbZGF0YS1sb2FkaW5nXSB7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSI+CgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcy1zY3JvbGxlZDpub3QoOmZpcnN0LWNoaWxkKSk6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRpdmlkZXItY29sb3IpOwogICAgICB9CgogICAgICA6aG9zdCguY2FuLXNjcm9sbDpub3QoLnNjcm9sbGVkLXRvLWJvdHRvbSk6bm90KDpsYXN0LWNoaWxkKSk6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvcik7CiAgICAgIH0KCiAgICAgIC5zY3JvbGxhYmxlIHsKICAgICAgICBwYWRkaW5nOiAwIDI0cHg7CgogICAgICAgIEBhcHBseSAtLWxheW91dC1zY3JvbGw7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXNjcm9sbGFibGU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ic2Nyb2xsYWJsZSIgY2xhc3M9InNjcm9sbGFibGUiIG9uLXNjcm9sbD0idXBkYXRlU2Nyb2xsU3RhdGUiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLW1hcmtkb3duLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9Im1hcmtkb3duIiBpbm5lci1oLXQtbS1sPSJbW2h0bWxdXSI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgICAqIFJlZHVjZSB0b3Btb3N0IGFuZCBib3R0b21tb3N0IG1hcmdpbnMgZnJvbSAxNnB4IHRvIDAuM2VtIChyZW5kZXJzCiAgICAgICAqIGF0IGFib3V0IDQuOHB4KSB0byBrZWVwIHRoZSBsYXlvdXQgY29tcGFjdC4gVGhpcyBpbXByb3ZlcyB0aGUKICAgICAgICogYXBwZWFyYW5jZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGxpbmUgb2YgdGV4dDsgc3RhbmRhcmQgTWFya2Rvd24KICAgICAgICogcmVuZGVyZXJzIHdpbGwgc3RpbGwgaW5jbHVkZSBhIGA8cD5gIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEJ5IHRhcmdldGluZyBvbmx5IHRoZSB0b3AtbGV2ZWwsIGV4dHJlbWFsIGVsZW1lbnRzLCB3ZSBwcmVzZXJ2ZSBhbnkKICAgICAgICogYWN0dWFsIHBhcmFncmFwaCBicmVha3MgYW5kIG9ubHkgY2hhbmdlIHRoZSBwYWRkaW5nIGFnYWluc3QgdGhlCiAgICAgICAqIGNvbXBvbmVudCBlZGdlcy4KICAgICAgICovCiAgICAgICNtYXJrZG93biA+IHA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDAuM2VtOwogICAgICB9CiAgICAgICNtYXJrZG93biA+IHA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC4zZW07CiAgICAgIH0KCiAgICAgIC8qIFBsZWFzYW50IHN0eWxlcyBmb3IgTWFya2Rvd24gdGFibGVzLiAqLwogICAgICAjbWFya2Rvd24gdGFibGUgewogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRoIHsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0aCwKICAgICAgI21hcmtkb3duIHRhYmxlIHRkIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTNweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGZlMmU1OwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0ciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2M2Y2JkMTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIGZpZ2NhcHRpb24gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAvKiogSG9yaXpvbnRhbCBsaW5lIG9mIGxhYmVscy4gKi8KICAgICAgLmhlYWRpbmctcm93IHsKICAgICAgICBtYXJnaW4tdG9wOiAtNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC8qKiBQaWVjZSBvZiB0ZXh0IGluIHRoZSBmaWd1cmUgY2FwdGlvbi4gKi8KICAgICAgLmhlYWRpbmctbGFiZWwgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQoKICAgICAgLyoqIE1ha2VzIGxhYmVsIHNob3cgb24gdGhlIHJpZ2h0LiAqLwogICAgICAuaGVhZGluZy1yaWdodCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZmlnY2FwdGlvbiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19uYW1lTGFiZWxdXSI+CiAgICAgICAgICAgIDxkaXYgaXRlbXByb3A9Im5hbWUiIGNsYXNzPSJoZWFkaW5nLWxhYmVsIG5hbWUiPgogICAgICAgICAgICAgIFtbX25hbWVMYWJlbF1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tydW5dXSI+CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgPHNwYW4gaXRlbXByb3A9InJ1biIgaWQ9ImhlYWRpbmctcnVuIiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0IHJ1biI+W1tydW5dXTwvc3Bhbj4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0xhYmVsXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgICB0YWc6IDxzcGFuIGl0ZW1wcm9wPSJ0YWciPltbX3RhZ0xhYmVsXV08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZmlnY2FwdGlvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Rlc2NyaXB0aW9uXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvIiBvbi10YXA9Il90b2dnbGVEZXNjcmlwdGlvbkRpYWxvZyIgdGl0bGU9IlNob3cgc3VtbWFyeSBkZXNjcmlwdGlvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZyBpZD0iZGVzY3JpcHRpb25EaWFsb2ciIG5vLW92ZXJsYXAgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgIDxwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbZGVzY3JpcHRpb25dXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY29udGVudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgcGFkZGluZzogMXB4IDRweCAycHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICBwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSB7CiAgICAgICAgbWF4LXdpZHRoOiA2NDBweDsKICAgICAgfQogICAgICAjaGVhZGluZy1ydW4gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRmLWNhcmQtaGVhZGluZy1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBjb2xvcjogdmFyKC0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kb3dubG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InJ1biB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfcnVufX0iPgogICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3J1bnNdXSI+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ydW5dXSI+CiAgICAgIDxhIGRvd25sb2FkPSJbW19jc3ZOYW1lKHRhZywgX3J1bildXSIgaHJlZj0iW1tfY3N2VXJsKHRhZywgX3J1biwgdXJsRm4pXV0iPkNTVjwvYT48YSBkb3dubG9hZD0iW1tfanNvbk5hbWUodGFnLCBfcnVuKV1dIiBocmVmPSJbW19qc29uVXJsKHRhZywgX3J1biwgdXJsRm4pXV0iPkpTT048L2E+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgfQogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgYSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMCAwLjJlbTsKICAgICAgfQogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgZm9udC1zaXplOiAyMnB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNjYWxhci1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIGNvbG9yLXNjYWxlPSJbW19nZXRDb2xvclNjYWxlKGNvbG9yU2NhbGUpXV0iIGRhdGEtc2VyaWVzPSJbW19nZXREYXRhU2VyaWVzKGRhdGFUb0xvYWQuKildXSIgZGF0YS10by1sb2FkPSJbW2RhdGFUb0xvYWRdXSIgZ2V0LWRhdGEtbG9hZC1uYW1lPSJbW19nZXREYXRhTG9hZE5hbWVdXSIgZ2V0LWRhdGEtbG9hZC11cmw9IltbZ2V0RGF0YUxvYWRVcmxdXSIgcmVxdWVzdC1kYXRhPSJbW3JlcXVlc3REYXRhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2xvYWREYXRhQ2FsbGJhY2tdXSIgbG9hZC1rZXk9IltbdGFnXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iIHRhZy1tZXRhZGF0YT0iW1t0YWdNZXRhZGF0YV1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249ImF1dG8iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW3hUeXBlXV0iPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgaWNvbj0ibGluZS13ZWlnaHQiIG9uLXRhcD0iX3RvZ2dsZUxvZ1NjYWxlIiB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJGaXQgZG9tYWluIHRvIGRhdGEiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8cGFwZXItbWVudS1idXR0b24gb24tcGFwZXItZHJvcGRvd24tb3Blbj0iX3VwZGF0ZURvd25sb2FkTGluayI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIiIHNsb3Q9ImRyb3Bkb3duLXRyaWdnZXIiIGljb249ImZpbGUtZG93bmxvYWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtPgogICAgICAgICAgICAgIDxhIGlkPSJzdmdMaW5rIiBkb3dubG9hZD0iW1t0YWddXS5zdmciPgogICAgICAgICAgICAgICAgRG93bmxvYWQgQ3VycmVudCBDaGFydCBhcyBTVkcKICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLW1lbnUtYnV0dG9uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8dGYtZG93bmxvYWRlciBydW5zPSJbW19ydW5zRnJvbURhdGEoZGF0YVRvTG9hZCldXSIgdGFnPSJbW3RhZ11dIiB1cmwtZm49IltbX2Rvd25sb2FkVXJsRm5dXSI+PC90Zi1kb3dubG9hZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXJnaW46IDVweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgIH0KCiAgICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICB9CgogICAgICAjYnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyBhIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1tZW51LWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQogICAgICBwYXBlci1pdGVtIGEgewogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItcHJvZ3Jlc3MiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pLCBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciwKICAgICAgLyogdGhlIHN0cmlwZSBmb3IgdGhlIGluZGV0ZXJtaW5hdGUgYW5pbWF0aW9uKi8KICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBoZWlnaHQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWhlaWdodCwgNHB4KTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgI3NlY29uZGFyeVByb2dyZXNzLAogICAgICAuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciwKICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXItY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTMwMCkpOwogICAgICB9CgogICAgICA6aG9zdCgudHJhbnNpdGluZykgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgOmhvc3QoLnRyYW5zaXRpbmcpICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTsKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm07CgogICAgICAgIC8qIER1cmF0aW9uICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWR1cmF0aW9uLCAwLjA4cyk7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMC4wOHMpOwoKICAgICAgICAvKiBUaW1pbmcgZnVuY3Rpb24gKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiwgZWFzZSk7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uLCBlYXNlKTsKCiAgICAgICAgLyogRGVsYXkgKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZGVsYXksIDBzKTsKICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWRlbGF5LCAwcyk7CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCk7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tMTAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNwcmltYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktNTAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS0zMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZGlzYWJsZWRdKSkgI3ByaW1hcnlQcm9ncmVzcy5pbmRldGVybWluYXRlIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGluZGV0ZXJtaW5hdGUtYmFyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLWJhciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtkaXNhYmxlZF0pKSAjcHJpbWFyeVByb2dyZXNzLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKCiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb246IGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtYmFyIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgICAgNzUlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguMjgsLjYyLC4zNywuOTEpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMCkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgIH0KICAgICAgICAzMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjQyLDAsLjYsLjgpOwogICAgICAgIH0KICAgICAgICA5MCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtYmFyIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgICA3NSUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjI4LC42MiwuMzcsLjkxKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgwKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICB9CiAgICAgICAgMzAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjQyLDAsLjYsLjgpOwogICAgICAgIH0KICAgICAgICA5MCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0icHJvZ3Jlc3NDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJzZWNvbmRhcnlQcm9ncmVzcyIgaGlkZGVuJD0iW1tfaGlkZVNlY29uZGFyeVByb2dyZXNzKHNlY29uZGFyeVJhdGlvKV1dIj48L2Rpdj4KICAgICAgPGRpdiBpZD0icHJpbWFyeVByb2dyZXNzIj48L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1zbGlkZXIiPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtMzAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1hY3RpdmUtY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQ6IHZhcigtLXBhcGVyLXNsaWRlci1oZWlnaHQsIDJweCk7CiAgICAgIH0KCiAgICAgIC8qIGZvY3VzIHNob3dzIHRoZSByaXBwbGUgKi8KICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5PVEUoa2VhbnVsZWUpOiBUaG91Z2ggOmhvc3QtY29udGV4dCBpcyBub3QgdW5pdmVyc2FsbHkgc3VwcG9ydGVkLCBzb21lIHBhZ2VzCiAgICAgICAqIHN0aWxsIHJlbHkgb24gcGFwZXItc2xpZGVyIGJlaW5nIGZsaXBwZWQgd2hlbiBkaXI9InJ0bCIgaXMgc2V0IG9uIGJvZHkuIEZvciBmdWxsCiAgICAgICAqIGNvbXBhdGFiaWxpdHksIGRpcj0icnRsIiBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0IG9uIHBhcGVyLXNsaWRlci4KICAgICAgICovCiAgICAgIDpkaXIocnRsKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOT1RFKGtlYW51bGVlKTogVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBydWxlIGFib3ZlIGJlY2F1c2UgOmhvc3QtY29udGV4dCBtYXkKICAgICAgICogbm90IGJlIHJlY29nbml6ZWQuCiAgICAgICAqLwogICAgICA6aG9zdChbZGlyPSJydGwiXSkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTk9URShrZWFudWxlZSk6IE5lZWRlZCB0byBvdmVycmlkZSB0aGUgOmhvc3QtY29udGV4dCBydWxlICh3aGVyZSBzdXBwb3J0ZWQpCiAgICAgICAqIHRvIHN1cHBvcnQgTFRSIHNsaWRlcnMgaW4gUlRMIHBhZ2VzLgogICAgICAgKi8KICAgICAgOmhvc3QoW2Rpcj0ibHRyIl0pICNzbGlkZXJDb250YWluZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICAgIH0KCiAgICAgICNzbGlkZXJDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKDE1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICAgIG1hcmdpbi1yaWdodDogY2FsYygxNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgfQoKICAgICAgI3NsaWRlckNvbnRhaW5lcjpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogMDsKICAgICAgfQoKICAgICAgI3NsaWRlckNvbnRhaW5lci5lZGl0YWJsZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTJweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICB9CgogICAgICAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAucmluZyA+IC5iYXItY29udGFpbmVyIHsKICAgICAgICBsZWZ0OiBjYWxjKDVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE4cyBlYXNlOwogICAgICB9CgogICAgICAucmluZy5leHBhbmQuZHJhZ2dpbmcgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnJpbmcuZXhwYW5kOm5vdCgucGluKSA+IC5iYXItY29udGFpbmVyIHsKICAgICAgICBsZWZ0OiBjYWxjKDhweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgIH0KCiAgICAgICNzbGlkZXJCYXIgewogICAgICAgIHBhZGRpbmc6IDE1cHggMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItYmFyLWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXItY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1jb250YWluZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbWFya2VycyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogY2FsYygxNHB4ICsgdmFyKC0tcGFwZXItc2xpZGVyLWhlaWdodCwycHgpLzIpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAtMXB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbWFya2VyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQogICAgICAuc2xpZGVyLW1hcmtlcnM6OmFmdGVyLAogICAgICAuc2xpZGVyLW1hcmtlcjo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4OwogICAgICAgIHdpZHRoOiAycHg7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKC0xNXB4IC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgICB3aWR0aDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgICAgfQoKICAgICAgLnRyYW5zaXRpbmcgPiAuc2xpZGVyLWtub2IgewogICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4wOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2IuZHJhZ2dpbmcgewogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIC5zbmFwcyA+IC5zbGlkZXIta25vYi5kcmFnZ2luZyB7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4wOHMgZWFzZTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4wOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBtYXJnaW46IDEwcHg7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMjBweCk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CgogICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybSwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyOwogICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICB9CgogICAgICAuZXhwYW5kOm5vdCgucGluKSA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuNSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgICB9CgogICAgICAucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItcGluLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgfQoKICAgICAgLnBpbiA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICBtYXJnaW4tbGVmdDogLTEzcHg7CiAgICAgICAgd2lkdGg6IDI2cHg7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJSA1MCUgNTAlIDA7CgogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlLAogICAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAuMThzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuMThzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlOwogICAgICB9CgogICAgICAucGluLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgfQoKICAgICAgLnBpbi5leHBhbmQgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDEpIHRyYW5zbGF0ZSgxN3B4LCAtMTdweCk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgxKSB0cmFuc2xhdGUoMTdweCwgLTE3cHgpOwogICAgICB9CgogICAgICAucGluID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgY29udGVudDogYXR0cih2YWx1ZSk7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xNnB4OwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1mb250LWNvbG9yLCAjZmZmKTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CgogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgIH0KCiAgICAgIC5waW4uZXhwYW5kID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZSgwLCAtMTdweCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGUoMCwgLTE3cHgpOwogICAgICB9CgogICAgICAvKiBwYXBlci1pbnB1dCAqLwogICAgICAuc2xpZGVyLWlucHV0IHsKICAgICAgICB3aWR0aDogNTBweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICBAYXBwbHkgLS1wYXBlci1zbGlkZXItaW5wdXQtY29udGFpbmVyLWlucHV0OwogICAgICAgIH07CiAgICAgICAgQGFwcGx5IC0tcGFwZXItc2xpZGVyLWlucHV0OwogICAgICB9CgogICAgICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwogICAgICAjc2xpZGVyQ29udGFpbmVyLmRpc2FibGVkIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmRpc2FibGVkID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLjc1LCAwLjc1LCAxKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlM2QoMC43NSwgMC43NSwgMSk7CiAgICAgIH0KCiAgICAgIC5kaXNhYmxlZC5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgfQoKICAgICAgcGFwZXItcmlwcGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNsaWRlckNvbnRhaW5lciIgY2xhc3MkPSJbW19nZXRDbGFzc05hbWVzKGRpc2FibGVkLCBwaW4sIHNuYXBzLCBpbW1lZGlhdGVWYWx1ZSwgbWluLCBleHBhbmQsIGRyYWdnaW5nLCB0cmFuc2l0aW5nLCBlZGl0YWJsZSldXSI+CiAgICAgIDxkaXYgY2xhc3M9ImJhci1jb250YWluZXIiPgogICAgICAgIDxwYXBlci1wcm9ncmVzcyBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaWQ9InNsaWRlckJhciIgYXJpYS1oaWRkZW49InRydWUiIG1pbj0iW1ttaW5dXSIgbWF4PSJbW21heF1dIiBzdGVwPSJbW3N0ZXBdXSIgdmFsdWU9IltbaW1tZWRpYXRlVmFsdWVdXSIgc2Vjb25kYXJ5LXByb2dyZXNzPSJbW3NlY29uZGFyeVByb2dyZXNzXV0iIG9uLWRvd249Il9iYXJkb3duIiBvbi11cD0iX3Jlc2V0S25vYiIgb24tdHJhY2s9Il9iYXJ0cmFjayIgb24tdGFwPSJfYmFyY2xpY2siPgogICAgICAgIDwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgIDwvZGl2PgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3NuYXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1tYXJrZXJzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbWFya2Vyc11dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLW1hcmtlciI+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPGRpdiBpZD0ic2xpZGVyS25vYiIgY2xhc3M9InNsaWRlci1rbm9iIiBvbi1kb3duPSJfa25vYmRvd24iIG9uLXVwPSJfcmVzZXRLbm9iIiBvbi10cmFjaz0iX29uVHJhY2siIG9uLXRyYW5zaXRpb25lbmQ9Il9rbm9iVHJhbnNpdGlvbkVuZCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXIta25vYi1pbm5lciIgdmFsdWUkPSJbW2ltbWVkaWF0ZVZhbHVlXV0iPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlZGl0YWJsZV1dIj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgdHlwZT0ibnVtYmVyIiBzdGVwPSJbW3N0ZXBdXSIgbWluPSJbW21pbl1dIiBtYXg9IltbbWF4XV0iIGNsYXNzPSJzbGlkZXItaW5wdXQiIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiB2YWx1ZT0iW1tpbW1lZGlhdGVWYWx1ZV1dIiBvbi1jaGFuZ2U9Il9jaGFuZ2VWYWx1ZSIgb24ta2V5ZG93bj0iX2lucHV0S2V5RG93biIgbm8tbGFiZWwtZmxvYXQ+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNtb290aGluZy1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPGgzIGNsYXNzPSJ0aXRsZSI+U21vb3RoaW5nPC9oMz4KICAgIDxkaXYgY2xhc3M9InNtb290aGluZy1ibG9jayI+CiAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InNsaWRlciIgaW1tZWRpYXRlLXZhbHVlPSJ7e19pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcn19IiBtYXg9IltbbWF4XV0iIG1pbj0iW1ttaW5dXSIgcGluIHN0ZXA9Iltbc3RlcF1dIiB0eXBlPSJudW1iZXIiIHZhbHVlPSJ7e3dlaWdodH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgbGFiZWw9IndlaWdodCIgbm8tbGFiZWwtZmxvYXQgdmFsdWU9Int7X2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dH19IiB0eXBlPSJudW1iZXIiIHN0ZXA9Iltbc3RlcF1dIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAudGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLnNtb290aGluZy1ibG9jayB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgZmxleC1ncm93OiAyOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNjYWxhci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGlkPSJzaG93LWRvd25sb2FkLWxpbmtzIiBjaGVja2VkPSJ7e19zaG93RG93bmxvYWRMaW5rc319Ij5TaG93IGRhdGEgZG93bmxvYWQgbGlua3M8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggaWQ9Imlnbm9yZS15LW91dGxpZXIiIGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgIDxkaXY+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMC45OTkiPjwvdGYtc21vb3RoaW5nLWlucHV0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ4LXR5cGUtc2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgQXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHNjYWxhciBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBzY2FsYXIgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIiBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtc2NhbGFyLWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiBkYXRhLXRvLWxvYWQ9IltbaXRlbS5zZXJpZXNdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBtdWx0aS1leHBlcmltZW50cz0iW1tfZ2V0TXVsdGlFeHBlcmltZW50cyhkYXRhU2VsZWN0aW9uKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHNob3ctZG93bmxvYWQtbGlua3M9IltbX3Nob3dEb3dubG9hZExpbmtzXV0iIHNtb290aGluZy1lbmFibGVkPSJbW19zbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9IltbX3Ntb290aGluZ1dlaWdodF1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKGNhdGVnb3J5LCBfcnVuVG9UYWdJbmZvLCBpdGVtKV1dIiB0YWc9IltbaXRlbS50YWddXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1tfdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW194VHlwZV1dIj48L3RmLXNjYWxhci1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICN0b29sdGlwLXNvcnRpbmcgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQogICAgICAjdG9vbHRpcC1zb3J0aW5nIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICB3aWR0aDogMTA1cHg7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuY2VudGVyIHsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXJnaW46IDVweCAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRleHQtdG9wOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICBoMSB7CiAgICAgICAgZm9udC1zaXplOiAxOXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGlkPSJsb2FkZXIiIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGZpbGwtYXJlYT0iW1tfZmlsbEFyZWFdXSIgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iIGxvYWQta2V5PSJbW190YWdGaWx0ZXJdXSIgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIgbG9nLXNjYWxlLWFjdGl2ZT0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKG1hcmdpbkNoYXJ0U2VyaWVzKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgc3ltYm9sLWZ1bmN0aW9uPSJbW19jcmVhdGVTeW1ib2xGdW5jdGlvbigpXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfdG9vbHRpcENvbHVtbnNdXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIiB4LXR5cGU9IltbeFR5cGVdXSI+CiAgICAgIDwvdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iYnV0dG9ucyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiBpY29uPSJsaW5lLXdlaWdodCIgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiIHRpdGxlPSJUb2dnbGUgeS1heGlzIGxvZyBzY2FsZSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQ9InRydWUiIGxhYmVsPSJzZXJpZXMgdG8gZG93bmxvYWQiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZH19Ij4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJkYXRhU2VyaWVzTmFtZSI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tkYXRhU2VyaWVzTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDxhIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5jc3YiIGhyZWY9IltbX2NzdlVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+Q1NWPC9hPgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmpzb24iIGhyZWY9IltbX2pzb25VcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iPkpTT048L2E+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWlzc2luZ1RhZ3MubGVuZ3RoXV0iPgogICAgICA8ZGl2IGNsYXNzPSJjb2xsYXBzaWJsZS1saXN0LXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlQ29sbGFwc2libGVJY29uKF9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkKV1dIiBvbi1jbGljaz0iX3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuIiBjbGFzcz0idG9nZ2xlLWNvbGxhcHNpYmxlLWJ1dHRvbiI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4gTWlzc2luZyBUYWdzCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWlzc2luZ1RhZ3NdXSIgYXM9Im1pc3NpbmdFbnRyeSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgUnVuICJbW21pc3NpbmdFbnRyeS5ydW5dXSIgbGFja3MgZGF0YSBmb3IgdGFncwogICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbWlzc2luZ0VudHJ5LnRhZ3NdXSIgYXM9InRhZyI+CiAgICAgICAgICAgICAgICAgIDxsaT5bW3RhZ11dPC9saT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdGFnRmlsdGVySW52YWxpZF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoaXMgcmVndWxhciBleHByZXNpb24gaXMgaW52YWxpZDo8YnI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImludmFsaWQtcmVnZXgiPltbX3RhZ0ZpbHRlcl1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdGVwc01pc21hdGNoXV0iPgogICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICA8aXJvbi1pY29uIGNsYXNzPSJlcnJvci1pY29uIiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+CiAgICAgICAgVGhlIHN0ZXBzIGZvciB2YWx1ZSwgbG93ZXIsIGFuZCB1cHBlciB0YWdzIGRvIG5vdCBtYXRjaDoKICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QudmFsdWVdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC52YWx1ZVN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0Lmxvd2VyXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gubG93ZXJTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC51cHBlcl1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLnVwcGVyU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDxkaXYgaWQ9Im1hdGNoZXMtY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2libGUtbGlzdC10aXRsZSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlQ29sbGFwc2libGVJY29uKF9tYXRjaGVzTGlzdE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNYXRjaGVzT3BlbiIgY2xhc3M9InRvZ2dsZS1tYXRjaGVzLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsYXBzaWJsZS10aXRsZS10ZXh0Ij4KICAgICAgICAgIE1hdGNoZXMgKFtbX3Nlcmllc05hbWVzLmxlbmd0aF1dKQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWF0Y2hlc0xpc3RPcGVuZWRdXSI+CiAgICAgICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIiBhcz0ic2VyaWVzTmFtZSIgaWQ9Im1hdGNoLWxpc3QtcmVwZWF0IiBvbi1kb20tY2hhbmdlPSJfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hdGNoLWxpc3QtZW50cnkiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1hdGNoLWVudHJ5LXN5bWJvbCI+CiAgICAgICAgICAgICAgICAgIFtbX2RldGVybWluZVN5bWJvbChfbmFtZVRvRGF0YVNlcmllcywgc2VyaWVzTmFtZSldXQogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgW1tzZXJpZXNOYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5lcnJvci1jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBtYXJnaW46IDEwcHggMCAwIDA7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQoKICAgICAgLmVycm9yLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgbWFyZ2luOiAwIGF1dG8gNXB4IGF1dG87CiAgICAgIH0KCiAgICAgIC5pbnZhbGlkLXJlZ2V4IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQoKICAgICAgLmVycm9yLWNvbnRlbnQgdWwgewogICAgICAgIG1hcmdpbjogMXB4IDAgMCAwOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDE5cHg7CiAgICAgIH0KCiAgICAgIC50YWctbmFtZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzaWJsZS1saXN0LXRpdGxlIHsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHggMDsKICAgICAgfQoKICAgICAgLmNvbGxhcHNpYmxlLXRpdGxlLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciB7CiAgICAgICAgbWFyZ2luOiA4cHggMCAwIDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGlkPSJsb2FkZXIiIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIj4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGljb249ImxpbmUtd2VpZ2h0IiBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iIG9uLXRhcD0iX3Jlc2V0RG9tYWluIiB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InNlcmllcyB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkfX0iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9ImRhdGFTZXJpZXNOYW1lIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2RhdGFTZXJpZXNOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmNzdiIgaHJlZj0iW1tfY3N2VXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5DU1Y8L2E+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uanNvbiIgaHJlZj0iW1tfanNvblVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+SlNPTjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWF0Y2hlcy1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZU1hdGNoZXNJY29uKF9tYXRjaGVzTGlzdE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNYXRjaGVzT3BlbiIgY2xhc3M9InRvZ2dsZS1tYXRjaGVzLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaGVzLXRleHQiPgogICAgICAgICAgTWF0Y2hlcyAoW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0pCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19tYXRjaGVzTGlzdE9wZW5lZF1dIj4KICAgICAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJzZXJpZXNOYW1lIiBpZD0ibWF0Y2gtbGlzdC1yZXBlYXQiIG9uLWRvbS1jaGFuZ2U9Il9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF0Y2gtbGlzdC1lbnRyeSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2gtZW50cnktc3ltYm9sIj4KICAgICAgICAgICAgICAgICAgW1tfZGV0ZXJtaW5lU3ltYm9sKF9uYW1lVG9EYXRhU2VyaWVzLCBzZXJpZXNOYW1lKV1dCiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICBbW3Nlcmllc05hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI21hdGNoZXMtbGlzdC10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4IDA7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1hdGNoZXMtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfc2hvd0Rvd25sb2FkTGlua3N9fSI+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZy1sYWJlbCI+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMSI+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9IngtdHlwZS1zZWxlY3RvciIgbmFtZT0iSG9yaXpvbnRhbCBBeGlzIiBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciIgaWQ9ImNhdGVnb3JpZXMtY29udGFpbmVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5UaGUgY3VzdG9tIHNjYWxhcnMgZGFzaGJvYXJkIGlzIGluYWN0aXZlLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPG9sPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW4ndCBsYWlkIG91dCB0aGUgZGFzaGJvYXJkLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgc2NhbGFyIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L29sPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgVG8gbGF5IG91dCB0aGUgZGFzaGJvYXJkLCBwYXNzIGEgPGNvZGU+TGF5b3V0PC9jb2RlPiBwcm90b2J1ZmZlcgogICAgICAgICAgICAgIHRvIHRoZSA8Y29kZT5zZXRfbGF5b3V0PC9jb2RlPiBtZXRob2QuIEZvciBleGFtcGxlLAogICAgICAgICAgICAKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkIGltcG9ydCBzdW1tYXJ5CmZyb20gdGVuc29yYm9hcmQucGx1Z2lucy5jdXN0b21fc2NhbGFyIGltcG9ydCBsYXlvdXRfcGIyCi4uLgojIFRoaXMgYWN0aW9uIGRvZXMgbm90IGhhdmUgdG8gYmUgcGVyZm9ybWVkIGF0IGV2ZXJ5IHN0ZXAsIHNvIHRoZSBhY3Rpb24gaXMgbm90CiMgdGFrZW4gY2FyZSBvZiBieSBhbiBvcCBpbiB0aGUgZ3JhcGguIFdlIG9ubHkgbmVlZCB0byBzcGVjaWZ5IHRoZSBsYXlvdXQgb25jZQojIChpbnN0ZWFkIG9mIHBlciBzdGVwKS4KbGF5b3V0X3N1bW1hcnkgPSBzdW1tYXJ5X2xpYi5jdXN0b21fc2NhbGFyX3BiKGxheW91dF9wYjIuTGF5b3V0KAogIGNhdGVnb3J5PVsKICAgIGxheW91dF9wYjIuQ2F0ZWdvcnkoCiAgICAgIHRpdGxlPSdsb3NzZXMnLAogICAgICBjaGFydD1bCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSdsb3NzZXMnLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcidsb3NzLionXSwKICAgICAgICAgICAgICApKSwKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J2JheicsCiAgICAgICAgICAgICAgbWFyZ2luPWxheW91dF9wYjIuTWFyZ2luQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgc2VyaWVzPVsKICAgICAgICAgICAgICAgICAgbGF5b3V0X3BiMi5NYXJnaW5DaGFydENvbnRlbnQuU2VyaWVzKAogICAgICAgICAgICAgICAgICAgIHZhbHVlPSdsb3NzL2Jhei9zY2FsYXJfc3VtbWFyeScsCiAgICAgICAgICAgICAgICAgICAgbG93ZXI9J2Jhel9sb3dlci9iYXovc2NhbGFyX3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgIHVwcGVyPSdiYXpfdXBwZXIvYmF6L3NjYWxhcl9zdW1tYXJ5JyksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICkpLAogICAgICBdKSwKICAgIGxheW91dF9wYjIuQ2F0ZWdvcnkoCiAgICAgIHRpdGxlPSd0cmlnIGZ1bmN0aW9ucycsCiAgICAgIGNoYXJ0PVsKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J3dhdmUgdHJpZyBmdW5jdGlvbnMnLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcid0cmlnRnVuY3Rpb25zL2Nvc2luZScsIHIndHJpZ0Z1bmN0aW9ucy9zaW5lJ10sCiAgICAgICAgICAgICAgKSksCiAgICAgICAgICAjIFRoZSByYW5nZSBvZiB0YW5nZW50IGlzIGRpZmZlcmVudC4gTGV0J3MgZ2l2ZSBpdCBpdHMgb3duIGNoYXJ0LgogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0ndGFuJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3IndHJpZ0Z1bmN0aW9ucy90YW5nZW50J10sCiAgICAgICAgICAgICAgKSksCiAgICAgIF0sCiAgICAgICMgVGhpcyBjYXRlZ29yeSB3ZSBjYXJlIGxlc3MgYWJvdXQuIExldCdzIG1ha2UgaXQgaW5pdGlhbGx5IGNsb3NlZC4KICAgICAgY2xvc2VkPVRydWUpLAogIF0pKQp3cml0ZXIuYWRkX3N1bW1hcnkobGF5b3V0X3N1bW1hcnkpCjwvcHJlPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGFzPSJjaGFydCIgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgZGlzYWJsZS1wYWdpbmF0aW9uIGluaXRpYWwtb3BlbmVkPSJbW2NhdGVnb3J5Lm1ldGFkYXRhLm9wZW5lZF1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhcnQubXVsdGlsaW5lXV0iPgogICAgICAgICAgICAgICAgICAgIDx0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVucz0iW1tfc2VsZWN0ZWRSdW5zXV0iIHRpdGxlPSJbW2NoYXJ0LnRpdGxlXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgc21vb3RoaW5nLXdlaWdodD0iW1tfc21vb3RoaW5nV2VpZ2h0XV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiB0YWctcmVnZXhlcz0iW1tjaGFydC5tdWx0aWxpbmUudGFnXV0iPjwvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjaGFydC5tYXJnaW5dXSI+CiAgICAgICAgICAgICAgICAgICAgPHRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIiB0aXRsZT0iW1tjaGFydC50aXRsZV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiBtYXJnaW4tY2hhcnQtc2VyaWVzPSJbW2NoYXJ0Lm1hcmdpbi5zZXJpZXNdXSI+PC90Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmcgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHdpZHRoOiAxMDVweDsKICAgICAgfQogICAgICAubGluZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWltYWdlLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdj5zYW1wbGU6IFtbX3NhbXBsZVRleHRdXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHN0ZXAKICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj5bW190b0xvY2FsZVN0cmluZyhfc3RlcFZhbHVlKV1dPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQgZGF0ZXRpbWUiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnRXYWxsVGltZV1dIj4KICAgICAgICAgICAgICBbW19jdXJyZW50V2FsbFRpbWVdXQogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCByaWdodCI+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIV9pc0ltYWdlTG9hZGluZ11dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJzdGVwcyIgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIgbWF4LW1hcmtlcnM9IltbX21heFN0ZXBJbmRleF1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CgogICAgCiAgICA8YSBpZD0ibWFpbi1pbWFnZS1jb250YWluZXIiIHJvbGU9ImJ1dHRvbiIgYXJpYS1sYWJlbD0iVG9nZ2xlIGFjdHVhbCBzaXplIiBhcmlhLWV4cGFuZGVkJD0iW1tfZ2V0QXJpYUV4cGFuZGVkKGFjdHVhbFNpemUpXV0iIG9uLXRhcD0iX2hhbmRsZVRhcCI+PC9hPgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiPgogICAgICAvKiogTWFrZSBidXR0b24gYSBkaXYuICovCiAgICAgIGJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IEdldCByaWQgb2YgZG90dGVkIGxpbmUgaW5zaWRlIGJ1dHRvbi4gKi8KICAgICAgYnV0dG9uOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IFNpbXVsYXRlIENocm9tZSdzIG91dGVyIGdsb3cgb24gYnV0dG9uIHdoZW4gZm9jdXNlZC4gKi8KICAgICAgYnV0dG9uOi1tb3otZm9jdXNyaW5nIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IDJweCBIaWdobGlnaHQ7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW46IDAgMTVweCA0MHB4IDA7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgfQoKICAgICAgLyoqIFdoZW4gYWN0dWFsIHNpemUgc2hvd24gaXMgb24sIHVzZSB0aGUgYWN0dWFsIGltYWdlIHdpZHRoLiAqLwogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IG5vbmU7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pICNtYWluLWltYWdlLWNvbnRhaW5lciBpbWcgewogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1zcGlubmVyLWxpdGUgewogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207CiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQoKICAgICAgI3N0ZXBzIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMTVweDsKICAgICAgICAvKgogICAgICAgICAqIDMxIGNvbWVzIGZyb20gYWRkaW5nIGEgcGFkZGluZyBvZiAxNXB4IGZyb20gYm90aCBzaWRlcyBvZiB0aGUKICAgICAgICAgKiBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nIDFweCBzbyB0aGF0IHRoZSBzbGlkZXIgd2lkdGggYWxpZ25zCiAgICAgICAgICogd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwgYW5kCiAgICAgICAgICogYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZgogICAgICAgICAqIHRoZSBpbWFnZS4gMzAgLSAxICsgMi4KICAgICAgICAgKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICB9CgogICAgICAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDEwMjRweDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI21haW4taW1hZ2UtY29udGFpbmVyIGltZyB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGltYWdlLXJlbmRlcmluZzogLW1vei1jcmlzcC1lZGdlczsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWltYWdlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfYWN0dWFsU2l6ZX19Ij5TaG93IGFjdHVhbCBpbWFnZSBzaXplPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8aDMgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5CcmlnaHRuZXNzIGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBtaW49IjAiIG1heD0iMiIgc25hcHMgcGluIHN0ZXA9IjAuMDEiIHZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19IiBpbW1lZGlhdGUtdmFsdWU9Int7X2JyaWdodG5lc3NBZGp1c3RtZW50fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgb24tdGFwPSJfcmVzZXRCcmlnaHRuZXNzIiBkaXNhYmxlZD0iW1tfYnJpZ2h0bmVzc0lzRGVmYXVsdF1dIj5SZXNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMyBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPkNvbnRyYXN0IGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBtaW49IjAiIG1heD0iNTAwIiBzbmFwcyBwaW4gc3RlcD0iMSIgdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19IiBpbW1lZGlhdGUtdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIG9uLXRhcD0iX3Jlc2V0Q29udHJhc3QiIGRpc2FibGVkPSJbW19jb250cmFzdElzRGVmYXVsdF1dIj5SZXNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIGlkPSJydW5zLXNlbGVjdG9yIiBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+PC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGltYWdlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGltYWdlIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWltYWdlLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iIG9mLXNhbXBsZXM9IltbaXRlbS5vZlNhbXBsZXNdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgYWN0dWFsLXNpemU9IltbX2FjdHVhbFNpemVdXSIgYnJpZ2h0bmVzcy1hZGp1c3RtZW50PSJbW19icmlnaHRuZXNzQWRqdXN0bWVudF1dIiBjb250cmFzdC1wZXJjZW50YWdlPSJbW19jb250cmFzdFBlcmNlbnRhZ2VdXSI+PC90Zi1pbWFnZS1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItc2xpZGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHVuc2V0OwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbdG90YWxTYW1wbGVzXV0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwIDxzdHJvbmc+W1tfY3VycmVudERhdHVtLnN0ZXBdXTwvc3Ryb25nPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnREYXR1bS53YWxsX3RpbWVdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgICAgW1tfY3VycmVudERhdHVtLndhbGxfdGltZV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgIDxhdWRpbyBjb250cm9scyBzcmMkPSJbW19jdXJyZW50RGF0dW0udXJsXV0iIHR5cGUkPSJbW19jdXJyZW50RGF0dW0uY29udGVudFR5cGVdXSI+PC9hdWRpbz4KICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tfY3VycmVudERhdHVtLmxhYmVsXV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtYWluLWF1ZGlvLWNvbnRhaW5lciI+PC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3I6ICM0MjQyNDI7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgICNzdGVwcyB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwYWRkaW5nOiAwIDVweDsgLyogc28gdGhlIHNsaWRlciBrbm9iIGRvZXNuJ3QgYnV0dCBvdXQgKi8KICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBpZD0icnVucy1zZWxlY3RvciIgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBhdWRpbyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBhdWRpbyBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1hdWRpby1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIiB0b3RhbC1zYW1wbGVzPSJbW2l0ZW0udG90YWxTYW1wbGVzXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iPjwvdGYtYXVkaW8tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tYXV0b2dyb3ctdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRhcmVhOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1pcnJvci10ZXh0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIHRlbXBsYXRlICovCiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIAogICAgCiAgICA8ZGl2IGlkPSJtaXJyb3IiIGNsYXNzPSJtaXJyb3ItdGV4dCIgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PgoKICAgIAogICAgPGRpdiBjbGFzcz0idGV4dGFyZWEtY29udGFpbmVyIGZpdCI+CiAgICAgIDx0ZXh0YXJlYSBpZD0idGV4dGFyZWEiIG5hbWUkPSJbW25hbWVdXSIgYXJpYS1sYWJlbCQ9IltbbGFiZWxdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSI+PC90ZXh0YXJlYT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgbGFiZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dC1jb250YWluZXIgbm8tbGFiZWwtZmxvYXQkPSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPGxhYmVsIGhpZGRlbiQ9IltbIWxhYmVsXV0iIGFyaWEtaGlkZGVuPSJ0cnVlIiBmb3IkPSJbW19pbnB1dElkXV0iIHNsb3Q9ImxhYmVsIj5bW2xhYmVsXV08L2xhYmVsPgoKICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3M9InBhcGVyLWlucHV0LWlucHV0IiBzbG90PSJpbnB1dCIgaWQkPSJbW19pbnB1dElkXV0iIGFyaWEtbGFiZWxsZWRieSQ9IltbX2FyaWFMYWJlbGxlZEJ5XV0iIGFyaWEtZGVzY3JpYmVkYnkkPSJbW19hcmlhRGVzY3JpYmVkQnldXSIgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yJD0iW1t2YWxpZGF0b3JdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGF1dG9jb21wbGV0ZSQ9IltbYXV0b2NvbXBsZXRlXV0iIGF1dG9mb2N1cyQ9IltbYXV0b2ZvY3VzXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIG5hbWUkPSJbW25hbWVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWF4LXJvd3MkPSJbW21heFJvd3NdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiPjwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9hc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2FzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjMzIzMjMyKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9hc3QtY29sb3IsICNmMWYxZjEpOwogICAgICAgIG1pbi1oZWlnaHQ6IDQ4cHg7CiAgICAgICAgbWluLXdpZHRoOiAyODhweDsKICAgICAgICBwYWRkaW5nOiAxNnB4IDI0cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMjYpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBtYXJnaW46IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuM3MsIG9wYWNpdHkgMC4zczsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcywgb3BhY2l0eSAwLjNzOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwcHgpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhcHN1bGUpIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCguZml0LWJvdHRvbSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhcGVyLXRvYXN0LW9wZW4pIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNwYW4gaWQ9ImxhYmVsIj57e3RleHR9fTwvc3Bhbj4KICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b2dnbGUtYnV0dG9uIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6bm9uZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1iYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhci1jb2xvciwgIzAwMDAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhcjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IC0zcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gbGluZWFyIC4wOHMsIGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b24tY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNTApKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbi5kcmFnZ2luZyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYmFyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJhci1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICAgICAgICBvcGFjaXR5OiAwLjEyOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF06bm90KFtkaXNhYmxlZF0pKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudG9nZ2xlLWluayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTE0cHg7CiAgICAgICAgbGVmdDogLTE0cHg7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIC8qIFRoZSB0b2dnbGUgYnV0dG9uIGhhcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZiAtM3B4OyBUaGUgZXh0cmEgMXB4CiAgICAgICAgLyogYWNjb3VudHMgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIHNoYWRvdyBib3guICovCiAgICAgICAgbWFyZ2luOiA0cHggMXB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICAvKiBpbnZhbGlkIHN0YXRlICovCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1iYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1iYXItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1idXR0b24tY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1pbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtaW5rLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCYXIiIGNsYXNzPSJ0b2dnbGUtYmFyIj48L2Rpdj4KICAgICAgPGRpdiBpZD0idG9nZ2xlQnV0dG9uIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtbGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1taW5pbWFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgbGluZWFyOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCguaGlkZGVuKSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgY2FudmFzIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwogICAgICB9CgogICAgICByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6ICMxMTExMTE7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwOwogICAgICAgIGZpbHRlcjogdXJsKCNtaW5pbWFwRHJvcFNoYWRvdyk7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdmc+CiAgICAgIDxkZWZzPgogICAgICAgIDxmaWx0ZXIgaWQ9Im1pbmltYXBEcm9wU2hhZG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTUwJSIgaGVpZ2h0PSIxNTAlIj4KICAgICAgICAgIDxmZW9mZnNldCByZXN1bHQ9Im9mZk91dCIgaW49IlNvdXJjZUdyYXBoaWMiIGR4PSIxIiBkeT0iMSI+PC9mZW9mZnNldD4KICAgICAgICAgIDxmZWNvbG9ybWF0cml4IHJlc3VsdD0ibWF0cml4T3V0IiBpbj0ib2ZmT3V0IiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4xIDAgMCAwIDAgMCAwLjEgMCAwIDAgMCAwIDAuMSAwIDAgMCAwIDAgMC41IDAiPjwvZmVjb2xvcm1hdHJpeD4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciByZXN1bHQ9ImJsdXJPdXQiIGluPSJtYXRyaXhPdXQiIHN0ZGRldmlhdGlvbj0iMiI+PC9mZWdhdXNzaWFuYmx1cj4KICAgICAgICAgIDxmZWJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImJsdXJPdXQiIG1vZGU9Im5vcm1hbCI+PC9mZWJsZW5kPgogICAgICAgIDwvZmlsdGVyPgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0PjwvcmVjdD4KICAgIDwvc3ZnPgogICAgPGNhbnZhcyBjbGFzcz0iZmlyc3QiPjwvY2FudmFzPgogICAgCiAgICA8Y2FudmFzIGNsYXNzPSJzZWNvbmQiPjwvY2FudmFzPgogICAgPGNhbnZhcyBjbGFzcz0iZG93bmxvYWQiPjwvY2FudmFzPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLXNjZW5lIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzdmcgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2hpZGRlbiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyogLS0tIE5vZGUgYW5kIGFubm90YXRpb24tbm9kZSBmb3IgTWV0YW5vZGUgLS0tICovCgogICAgICAubWV0YSA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YSA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgfQogICAgICAubWV0YS5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCwKICAgICAgLmZhZGVkIHJlY3QsCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgcGF0aCwKICAgICAgLmZhZGVkIHVzZSwKICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBwYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmFkZWQgcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgdXNlIHsKICAgICAgICBmaWxsOiB1cmwoI2VsbGlwc2VIYXRjaCkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmZhZGVkIHRleHQgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC8qIFJ1bGVzIHVzZWQgZm9yIGlucHV0LXRyYWNpbmcuICovCiAgICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gcmVjdCwKICAgICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiBlbGxpcHNlLAogICAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHVzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZmY5ODAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qICAtIEZhZGVkIG5vbi1pbnB1dCBzdHlsaW5nICovCiAgICAgIC5ub24taW5wdXQgPiAqID4gcmVjdCwKLm5vbi1pbnB1dCA+ICogPiBlbGxpcHNlLAoubm9uLWlucHV0ID4gKiA+IHVzZSwKLyogRm9yIENvbnN0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gKiA+IC5jb25zdGFudDpub3QoW2NsYXNzKj0iaW5wdXQtaGlnaGxpZ2h0Il0pID4KICAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiBpbmhlcml0OwogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgcGF0aCB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gLm5vZGVzaGFwZSA+IHJlY3QsCi5ub24taW5wdXQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgZWxsaXBzZSwKICAgICAgLm5vbi1pbnB1dCB1c2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLm5vbi1pbnB1dCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLyogSW5wdXQgZWRnZXMuICovCiAgICAgIC5pbnB1dC1lZGdlLWhpZ2hsaWdodCA+IHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLmlucHV0LWhpZ2hsaWdodCA+IC5pbi1hbm5vdGF0aW9ucyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSwKICAgICAgLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZAogICAgICAgID4gLmluLWFubm90YXRpb25zCiAgICAgICAgPiAuYW5ub3RhdGlvbgogICAgICAgID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIE5vbi1pbnB1dCBlZGdlcy4gKi8KICAgICAgLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCwKLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IHBhdGgsCi8qIEFubm90YXRpb24gc3R5bGVzIChsYWJlbCBhbmQgZWRnZXMgcmVzcGVjdGl2ZWx5KS4gKi8KLm5vbi1pbnB1dCA+IGcgPgouYW5ub3RhdGlvbjpub3QoLmlucHV0LWhpZ2hsaWdodCk6bm90KC5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQpID4KLmFubm90YXRpb24tbGFiZWwKLyouYW5ub3RhdGlvbi1lZGdlKi8KIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qIC0tLSBPcCBOb2RlIC0tLSAqLwoKICAgICAgLm9wID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAgIC5vcCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5vcC5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgICAub3Auc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAub3AuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgICAgLm9wLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQoKICAgICAgLyogLS0tIFNlcmllcyBOb2RlIC0tLSAqLwoKICAgICAgLyogQnkgZGVmYXVsdCwgZG9uJ3Qgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+LiAqLwogICAgICAuc2VyaWVzID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICAgIGZpbGw6IGhzbCgwLCAwJSwgNzAlKTsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogNSwgNTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC8qIE9uY2UgZXhwYW5kZWQsIHNob3cgdGhlIHNlcmllcyBiYWNrZ3JvdW5kIDxyZWN0PiBhbmQgaGlkZSB0aGUgPHVzZT4uICovCiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwLjE1OwogICAgICAgIHN0cm9rZTogaHNsKDAsIDAlLCA3MCUpOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gdXNlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKgogKiBUT0RPOiBTaW1wbGlmeSB0aGlzIGJ5IGFwcGx5aW5nIGEgc3RhYmxlIGNsYXNzIG5hbWUgdG8gYWxsIDxnPgogKiBlbGVtZW50cyB0aGF0IGN1cnJlbnRseSBoYXZlIGVpdGhlciB0aGUgbm9kZXNoYXBlIG9yIGFubm90YXRpb24tbm9kZSBjbGFzc2VzLgogKi8KICAgICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KICAgICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLnNlcmllcy5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBCcmlkZ2UgTm9kZSAtLS0gKi8KICAgICAgLmJyaWRnZSA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6ICNmMGY7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTdHJ1Y3R1cmFsIEVsZW1lbnRzIC0tLSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUuc3RydWN0dXJhbCB7CiAgICAgICAgc3Ryb2tlOiAjZjBmOwogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBSZWZlcmVuY2UgRWRnZSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUucmVmZXJlbmNlZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjZmZiNzRkOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTZXJpZXMgTm9kZXMgLS0tICovCgogICAgICAvKiBIaWRlIHRoZSByZWN0IGZvciBhIHNlcmllcycgYW5ub3RhdGlvbi4gKi8KICAgICAgLnNlcmllcyA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiAtLS0gTm9kZSBsYWJlbCAtLS0gKi8KCiAgICAgIC5ub2RlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiAjNDQ0OwogICAgICB9CgogICAgICAubWV0YS5leHBhbmRlZCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgfQoKICAgICAgLnNlcmllcyA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDhweDsKICAgICAgfQoKICAgICAgLm9wID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNnB4OwogICAgICB9CgogICAgICAuYnJpZGdlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ub2RlLm1ldGEuZXhwYW5kZWQgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgICAgY3Vyc29yOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuaGlnaGxpZ2h0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM1MGEzZjc7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM0Mjg1ZjQ7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uIC0tLSAqLwoKICAgICAgLyogb25seSBhcHBsaWVkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGFyZSBub3Qgc3VtbWFyeSBvciBjb25zdGFudC4KKC5zdW1tYXJ5LCAuY29uc3RhbnQgZ2V0cyBvdmVycmlkZGVuIGJlbG93KSAqLwogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zdW1tYXJ5ID4gLmFubm90YXRpb24tbm9kZSA+ICosCiAgICAgIC5hbm5vdGF0aW9uLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+ICogewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYWFhOwogICAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgICBtYXJrZXItZW5kOiB1cmwoI2Fubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTsKICAgICAgfQoKICAgICAgI2Fubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjYWFhOwogICAgICB9CgogICAgICAjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNhYWE7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWxhYmVsLmFubm90YXRpb24tZWxsaXBzaXMgewogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLyogSGlkZSBhbm5vdGF0aW9ucyBvbiBleHBhbmRlZCBtZXRhIG5vZGVzIHNpbmNlIHRoZXkncmUgcmVkdW5kYW50LiAqLwogICAgICAuZXhwYW5kZWQgPiAuaW4tYW5ub3RhdGlvbnMsCiAgICAgIC5leHBhbmRlZCA+IC5vdXQtYW5ub3RhdGlvbnMgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBDb25zdGFudCAtLS0gKi8KCiAgICAgIC5jb25zdGFudCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjODQ4NDg0OwogICAgICB9CgogICAgICAuY29uc3RhbnQuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIH0KCiAgICAgIC5jb25zdGFudC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEFubm90YXRpb246IFN1bW1hcnkgLS0tICovCgogICAgICAuc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2RiNDQzNzsKICAgICAgICBzdHJva2U6ICNkYjQ0Mzc7CiAgICAgIH0KCiAgICAgIC5zdW1tYXJ5LnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIGZpbGw6ICNhNTI3MTQ7CiAgICAgICAgc3Ryb2tlOiAjYTUyNzE0OwogICAgICB9CgogICAgICAuc3VtbWFyeS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEVkZ2UgLS0tICovCgogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYmJiOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNzU7CiAgICAgIH0KCiAgICAgIC5lZGdlIC5zZWxlY3RhYmxlZWRnZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuc2VsZWN0ZWRlZGdlID4gcGF0aC5lZGdlbGluZSB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHN0cm9rZTogI2YwMDsKICAgICAgfQoKICAgICAgLmVkZ2Uuc2VsZWN0ZWRlZGdlIHRleHQgewogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgIH0KCiAgICAgIC8qIExhYmVscyBzaG93aW5nIHRlbnNvciBzaGFwZXMgb24gZWRnZXMgKi8KICAgICAgLmVkZ2UgPiB0ZXh0IHsKICAgICAgICBmb250LXNpemU6IDMuNXB4OwogICAgICAgIGZpbGw6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5kYXRhZmxvdy1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNiYmI7CiAgICAgIH0KCiAgICAgIC5yZWZlcmVuY2UtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZmZiNzRkOwogICAgICB9CgogICAgICAuc2VsZWN0ZWQtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZjAwOwogICAgICB9CgogICAgICAuZWRnZSAuY29udHJvbC1kZXAgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDIsIDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBHcm91cCBub2RlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0tICovCgogICAgICAvKiBIaWRlcyBleHBhbmQvY29sbGFwc2UgYnV0dG9ucyB3aGVuIGEgbm9kZSBpc24ndCBleHBhbmRlZCBvciBoaWdobGlnaHRlZC4gVXNpbmcKICAgaW5jcmVkaWJseSBzbWFsbCBvcGFjaXR5IHNvIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgPGc+IHBhcmVudCBzdGlsbCB0YWtlcwogICB0aGlzIGNvbnRhaW5lciBpbnRvIGFjY291bnQgZXZlbiB3aGVuIGl0IGlzbid0IHZpc2libGUgKi8KICAgICAgLm5vZGU6bm90KC5oaWdobGlnaHRlZCk6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciB7CiAgICAgICAgb3BhY2l0eTogMC4wMTsKICAgICAgfQogICAgICAubm9kZS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLmJ1dHRvbmNpcmNsZSB7CiAgICAgICAgZmlsbDogI2U3ODExZDsKICAgICAgfQogICAgICAuYnV0dG9uY2lyY2xlOmhvdmVyIHsKICAgICAgICBmaWxsOiAjYjk2NzE3OwogICAgICB9CiAgICAgIC5leHBhbmRidXR0b24sCiAgICAgIC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgfQogICAgICAvKiBEbyBub3QgbGV0IHRoZSBwYXRoIGVsZW1lbnRzIGluIHRoZSBidXR0b24gdGFrZSBwb2ludGVyIGZvY3VzICovCiAgICAgIC5ub2RlID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuZXhwYW5kYnV0dG9uLAogICAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAvKiBPbmx5IHNob3cgdGhlIGV4cGFuZCBidXR0b24gd2hlbiBhIG5vZGUgaXMgY29sbGFwc2VkIGFuZCBvbmx5IHNob3cgdGhlCiAgIGNvbGxhcHNlIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZC4gKi8KICAgICAgLm5vZGUuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm5vZGU6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLXN0YXRzIHsKICAgICAgICBmb250LXNpemU6IDRweDsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwgcmVjdCB7CiAgICAgICAgZmlsdGVyOiB1cmwoI2hlYWx0aC1waWxsLXNoYWRvdyk7CiAgICAgICAgcng6IDM7CiAgICAgICAgcnk6IDM7CiAgICAgIH0KCiAgICAgIC50aXRsZUNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRvcDogMjBweDsKICAgICAgfQoKICAgICAgLnRpdGxlLAogICAgICAuYXV4VGl0bGUsCiAgICAgIC5mdW5jdGlvbkxpYnJhcnlUaXRsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjbWluaW1hcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAyMHB4OwogICAgICAgIGJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0idGl0bGVDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0aXRsZSIgY2xhc3M9InRpdGxlIj5NYWluIEdyYXBoPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImF1eFRpdGxlIiBjbGFzcz0iYXV4VGl0bGUiPkF1eGlsaWFyeSBOb2RlczwvZGl2PgogICAgICA8ZGl2IGlkPSJmdW5jdGlvbkxpYnJhcnlUaXRsZSIgY2xhc3M9ImZ1bmN0aW9uTGlicmFyeVRpdGxlIj4KICAgICAgICBGdW5jdGlvbnMKICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxkZWZzPgogICAgICAgIAogICAgICAgIDxwYXRoIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1zbWFsbCIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1tZWRpdW0iIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjEzIiBtYXJrZXJoZWlnaHQ9IjEzIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMTYiIG1hcmtlcmhlaWdodD0iMTYiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXhsYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMjAiIG1hcmtlcmhlaWdodD0iMjAiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8cGF0aCBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtc21hbGwiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbWVkaXVtIiB2aWV3Ym94PSIwIDAgMTAgMTAiIG1hcmtlcndpZHRoPSIxMyIgbWFya2VyaGVpZ2h0PSIxMyIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjE2IiBtYXJrZXJoZWlnaHQ9IjE2IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC14bGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjIwIiBtYXJrZXJoZWlnaHQ9IjIwIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQiIG1hcmtlcndpZHRoPSI1IiBtYXJrZXJoZWlnaHQ9IjUiIHJlZng9IjAiIHJlZnk9IjIuNSIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gNSwwIEwgMCwyLjUgTCA1LDUgTCA1LDAiIC8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgPG1hcmtlciBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIwIiByZWZ5PSIyLjUiIG9yaWVudD0iYXV0byI+CiAgICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICAKICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtYW5ub3RhdGlvbi1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjkiIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjciIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjUiIHk9IjIiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxzdmcgaWQ9InN1bW1hcnktaWNvbiIgZmlsbD0iIzg0ODQ4NCIgaGVpZ2h0PSIxMiIgdmlld2JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTIiPgogICAgICAgICAgPHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz4KICAgICAgICA8L3N2Zz4KCiAgICAgICAgCiAgICAgICAgPHBhdHRlcm4gaWQ9InJlY3RIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuIGlkPSJlbGxpcHNlSGF0Y2giIHBhdHRlcm50cmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIiB3aWR0aD0iMiIgaGVpZ2h0PSIyIiBwYXR0ZXJudW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIiAvPgogICAgICAgIDwvcGF0dGVybj4KCiAgICAgICAgCiAgICAgICAgPGZpbHRlciBpZD0iaGVhbHRoLXBpbGwtc2hhZG93IiB4PSItNDAlIiB5PSItNDAlIiB3aWR0aD0iMTgwJSIgaGVpZ2h0PSIxODAlIj4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMC44IiAvPgogICAgICAgICAgPGZlb2Zmc2V0IGR4PSIwIiBkeT0iMCIgcmVzdWx0PSJvZmZzZXRibHVyIiAvPgogICAgICAgICAgPGZlZmxvb2QgZmxvb2QtY29sb3I9IiMwMDAwMDAiIC8+CiAgICAgICAgICA8ZmVjb21wb3NpdGUgaW4yPSJvZmZzZXRibHVyIiBvcGVyYXRvcj0iaW4iIC8+CiAgICAgICAgICA8ZmVtZXJnZT4KICAgICAgICAgICAgPGZlbWVyZ2Vub2RlIC8+CiAgICAgICAgICAgIDxmZW1lcmdlbm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgICAgIDwvZmVtZXJnZT4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgPC9kZWZzPgogICAgICAKICAgICAgPHJlY3QgZmlsbD0id2hpdGUiIHdpZHRoPSIxMDAwMCIgaGVpZ2h0PSIxMDAwMCI+PC9yZWN0PgogICAgICA8ZyBpZD0icm9vdCI+PC9nPgogICAgPC9zdmc+CiAgICA8dGYtZ3JhcGgtbWluaW1hcCBpZD0ibWluaW1hcCI+PC90Zi1ncmFwaC1taW5pbWFwPgogICAgPGRpdiBpZD0iY29udGV4dE1lbnUiIGNsYXNzPSJjb250ZXh0LW1lbnUiPjwvZGl2PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgfQoKICAgICAgLmF1dG8gewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICBwYXBlci1idXR0b24gewogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0idmVydGljYWwiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t0aXRsZV1dIj4KICAgICAgICAgIDxoMj5bW3RpdGxlXV08L2gyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRmLWdyYXBoLXNjZW5lIGlkPSJzY2VuZSIgY2xhc3M9ImF1dG8iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1lZGdlPSJ7e3NlbGVjdGVkRWRnZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHByb2dyZXNzPSJbW3Byb2dyZXNzXV0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW25vZGVDb250ZXh0TWVudUl0ZW1zXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9jb250aW51ZUJ1dHRvbkNhbGxiYWNrIj4KICAgICAgPHNwYW4+W1tfY29udGludWVCdXR0b25UZXh0XV08L3NwYW4+CiAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iY29udGludWVEaWFsb2ciPgogICAgICA8aDI+Q29udGludWUuLi48L2gyPgogICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlLW5hbWUiPgogICAgICAgICAgT3ZlciBTZXNzaW9uIFJ1bnM6CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJjb250aW51ZU51bSIgY2xhc3M9ImlucHV0LWJveCIgbGFiZWw9Ik51bWJlciBvZiBTZXNzaW9uIFJ1bnMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBvbmUpOiIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIxIiBzdGVwPSIxIiB2YWx1ZT0ie3tjb250aW51ZU51bX19Ij48L3BhcGVyLWlucHV0PgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZ28tYnV0dG9uIiBpY29uPSJhcnJvdy1mb3J3YXJkIiB0aXRsZT0iU2Vzc2lvbiBSdW5zIEdvIiBvbi10YXA9Il9zZXNzaW9uUnVuR29CdXR0b25DYWxsYmFjayI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUtbmFtZSI+CiAgICAgICAgICBUaWxsIENvbmRpdGlvbiBNZXQgYnkgV2F0Y2hlZCBUZW5zb3IKICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0idGVuc29yQ29uZGl0aW9uRHJvcGRvd24iIGNsYXNzPSJpbnB1dC1ib3giIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iVGVuc29yIENvbmRpdGlvbiIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb259fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJ0ZW5zb3JDb25kaXRpb25NZW51IiBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Db250YWlucyArLy3iiJ4gb3IgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgKy8t4oiePC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWF4ICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1pbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWluICZsdDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggLSBNaW4gJmd0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1heCAtIE1pbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+U3RhbmRhcmQgZGV2aWF0aW9uICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5TdGFuZGFyZCBkZXZpYXRpb24gJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJnby1idXR0b24iIGljb249ImFycm93LWZvcndhcmQiIHRpdGxlPSJUZW5zb3IgQ29uZGl0aW9uIEdvIiBvbi10YXA9Il90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2siPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJyZWYtdmFsdWUiIGNsYXNzPSJpbnB1dC1ib3giIGxhYmVsPSJSZWZlcmVuY2UgdmFsdWUgdG8gY29tcGFyZSB0byIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0ie3tfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWV9fSIgaGlkZGVuPSJbW19pc1JlZlZhbHVlSW5wdXRIaWRkZW5dXSI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC5jb250aW51ZS10by10eXBlLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IHBhcGVyLWRpYWxvZyB7CiAgICAgICAgd2lkdGg6IDM2dnc7CiAgICAgIH0KICAgICAgOmhvc3QgLmlucHV0LWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgfQogICAgICA6aG9zdCAuZ28tYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nIj4KICA8dGVtcGxhdGU+CiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfb3Blbl1dIj4KICAgICAgPGRpdiBpZD0iZGFzaGJvYXJkLWJhY2tkcm9wIj48L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJkaWFsb2ciIG5vLWNhbmNlbC1vbi1vdXRzaWRlLWNsaWNrIG5vLWNhbmNlbC1vbi1lc2Mta2V5IG9wZW5lZD0ie3tfb3Blbn19Ij4KICAgICAgPGgyIGlkPSJkaWFsb2ctdGl0bGUiPltbX3RpdGxlXV08L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0N1c3RvbU1lc3NhZ2VdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLW1lc3NhZ2UiPltbX2N1c3RvbU1lc3NhZ2VdXTwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXNDdXN0b21NZXNzYWdlXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvU2Vzc2lvbiIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+dGYuU2Vzc2lvbjwvYT46CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlLXNuaXBwZXQiPmltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCmZyb20gdGVuc29yZmxvdy5weXRob24gaW1wb3J0IGRlYnVnIGFzIHRmX2RlYnVnCgpzZXNzID0gdGYuU2Vzc2lvbigpCnNlc3MgPSB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24oc2VzcywgIltbX2hvc3RdXTpbW19wb3J0XV0iKQpzZXNzLnJ1bihteV9mZXRjaGVzKQogICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL3Byb2dyYW1tZXJzX2d1aWRlL2VzdGltYXRvcnMiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPkVzdGltYXRvcjwvYT4KICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL3RyYWluL01vbml0b3JlZFNlc3Npb24iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPk1vbml0b3JlZFNlc3Npb248L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwoKaG9vayA9IHRmX2RlYnVnLlRlbnNvckJvYXJkRGVidWdIb29rKCJbW19ob3N0XV06W1tfcG9ydF1dIikKbXlfZXN0aW1hdG9yLmZpdCh4PXhfZGF0YSwgeT15X2RhdGEsIHN0ZXBzPTEwMDAsIG1vbml0b3JzPVtob29rXSkKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8va2VyYXMuaW8vbW9kZWxzL21vZGVsLyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+S2VyYXMgTW9kZWw8L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwppbXBvcnQga2VyYXMKCmtlcmFzLmJhY2tlbmQuc2V0X3Nlc3Npb24oCiAgICB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24odGYuU2Vzc2lvbigpLCAiW1tfaG9zdF1dOltbX3BvcnRdXSIpKQojIERlZmluZSB5b3VyIGtlcmFzIG1vZGVsLCBjYWxsZWQgIm1vZGVsIi4KbW9kZWwuZml0KC4uLikKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHN0eWxlPgogICAgICAvKiogV2UgcmVseSBvbiBhIHNlcGFyYXRlIGBfaGlkZGVuYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRpcmVjdGx5IG1ha2luZyB1c2UKICAgICAgICAgIG9mIHRoZSBgX29wZW5gIGF0dHJpYnV0ZSBiZWNhdXNlIHRoaXMgQ1NTIHNwZWNpZmljYXRpb24gbWF5IHN0cmFuZ2VseQogICAgICAgICAgYWZmZWN0IG90aGVyIGVsZW1lbnRzIHRocm91Z2hvdXQgVGVuc29yQm9hcmQuIFNlZSAjODk5LiAqLwogICAgICA6aG9zdChbX2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIDpob3N0LAogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgIH0KCiAgICAgIC5jb2RlLWV4YW1wbGUgewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CiAgICAgIC5jb2RlLWV4YW1wbGUtc2VjdGlvbiB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLmNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAuY29kZS1zbmlwcGV0IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKICAgICAgfQoKICAgICAgI2RpYWxvZy10aXRsZSB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jdXN0b20tbWVzc2FnZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZGVidWdnZXItcmVzaXplciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iYmFycyI+CiAgICAgIDxkaXYgY2xhc3M9ImJhcnMtcm90YXRvciI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImJhcnMtdGV4dCI+fCB8PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdChbX3Jlc2l6ZXItaWRlbnRpZmllcl0pIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYmFja2dyb3VuZDogI2NjYzsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2lzLWhvcml6b250YWxdKSB7CiAgICAgICAgY3Vyc29yOiByb3ctcmVzaXplOwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICA6aG9zdChbX2lzLXZlcnRpY2FsXSkgewogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICByaWdodDogLTE1cHg7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLmJhcnMgewogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgZm9udC1zaXplOiA1cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgIC8qKiBUaGlzIGJsb2NrIHByZXZlbnRzIHRoZSBiYXJzIHJvdGF0b3IgZnJvbSBoYXZpbmcgYSBoZWlnaHQgdGhhdCBpcwogICAgICAgICAgdGhlIGVudGlyZSB2aWV3cG9ydCwgdGh1cyBvY2NsdWRpbmcgaXQgYW5kIGdpdmluZyBpdCBhbiB1bmRlc2lyZWQgY3Vyc29yCiAgICAgICAgICB2YWx1ZS4gKi8KICAgICAgLmJhcnMtcm90YXRvciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaXMtaG9yaXpvbnRhbF0pIC5iYXJzLXJvdGF0b3IgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgICAgfQoKICAgICAgLmJhcnMtdGV4dCB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMTUpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdj4KICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9ImZpbHRlci1tb2RlIiBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9IkZpbHRlciBNb2RlIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19maWx0ZXJNb2RlfX0iPgogICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Ob2RlIE5hbWU8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+T3AgVHlwZTwvcGFwZXItaXRlbT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJmaWx0ZXItaW5wdXQiIGxhYmVsPSJGaWx0ZXIgUmVnZXgiIGFsd2F5cy1mbG9hdC1sYWJlbCB2YWx1ZT0ie3tfZmlsdGVySW5wdXR9fSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgY2xhc3M9InNwaW5uZXIiIGlkPSJsb2FkaW5nLXNwaW5uZXIiIGhpZGRlbj0iW1shX2lzTG9hZGluZ11dIj4KICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgPGRpdiBpZD0ic2VsZWN0b3ItaGllcmFyY2h5Ij48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgLmxldmVsLWNvbnRhaW5lciBpcm9uLWNvbGxhcHNlIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICBtYXJnaW46IDAgOHB4IDAgMDsKICAgICAgfQoKICAgICAgLm9wLXR5cGUgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7CiAgICAgICAgY29sb3I6ICM0NDQ7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQoKICAgICAgLnBhcnRpYWwtY2hlY2tib3ggewogICAgICAgIGJhY2tncm91bmQ6ICNmNTdjMDA7CiAgICAgIH0KCiAgICAgIC5ub2RlLWV4cGFuZC1idXR0b24gewogICAgICAgIG1hcmdpbjogMCAwIDAgLTEzcHg7CiAgICAgIH0KCiAgICAgIC5sZXZlbC10aXRsZS10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xcHg7CiAgICAgIH0KCiAgICAgIC5vcC1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIDI3cHg7CiAgICAgICAgcGFkZGluZzogMTBweCAwOwogICAgICB9CgogICAgICAuc3Bpbm5lciB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNmaWx0ZXItbW9kZSB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2ZpbHRlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIC5oaWdobGlnaHRlZCA+IC5vcC10eXBlIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CgogICAgICAjc2VsZWN0b3ItaGllcmFyY2h5IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zZXNzaW9uLXJ1bnMtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0ic2Vzc2lvbi1ydW5zLWRpdiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNlc3Npb24gUnVuczwvZGl2PgogICAgICA8dGFibGUgaWQ9InNlc3Npb24tcnVucy10YWJsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJzZXNzaW9uLXJ1bnMtdGFibGUiPgogICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICA8dGg+RmVlZHM8L3RoPgogICAgICAgICAgPHRoPkZldGNoZXM8L3RoPgogICAgICAgICAgPHRoPlRhcmdldHM8L3RoPgogICAgICAgICAgPHRoPiMoRGV2aWNlcyk8L3RoPgogICAgICAgICAgPHRoPkNvdW50PC90aD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAyMHB4IDA7CiAgICAgIH0KCiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgOmhvc3QgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLyogVE9ETyhjYWlzKTogVGhpcyBuZWVkcyB3b3JrOiB0aGUgdGFibGUgc2hvdWxkbid0IGdldCB0b28gd2lkZSB3aGVuCiAgICAgICAgIHRoZXJlIGFyZSBtYW55IGZlZWRzL2ZldGNoZXMvdGFyZ3RlIG5hbWVzLiAqLwogICAgICAuc2Vzc2lvbi1ydW5zLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZCAxcHggYmxhY2s7CiAgICAgICAgdGFibGUtbGF5b3V0OiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgIC5hY3RpdmUtc2Vzc2lvbi1ydW4gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLnNvbGUtYWN0aXZlLXNlc3Npb24tcnVuIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTcyLCAyMzIsIDE4OCk7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50IHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50OmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNvdXJjZS1jb2RlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImZ1bGxTdGFja0RpYWxvZyIgaGlkZGVuJD0iW1shX2Z1bGxTdGFja1Nob3duXV0iPgogICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iZmlsdGVyLWxpc3QiIGRpc2FibGVkPSJ0cnVlIj4KICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIEZ1bGwgU3RhY2sgVHJhY2Ugb2YgTm9kZToKICAgICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLW5vZGUtbmFtZSI+IltbX2Z1bGxTdGFja05vZGVOYW1lXV0iPC9kaXY+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImNsb3NlIiBpZD0iY2xvc2UtZnVsbC1zdGFjay1idXR0b24iIHRpdGxlPSJDbG9zZSBGdWxsIFN0YWNrIiBvbi10YXA9Il9jbG9zZUZ1bGxTdGFja0RpYWxvZyI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDx1bCBpZD0iZnVsbC1zdGFjay1jb250ZW50Ij48L3VsPgogICAgPC9kaXY+CiAgICA8cGFwZXItdGFicyBpZD0ic291cmNlLWZpbGVzLXRhYnMiIHNlbGVjdGVkPSJ7e19maWxlUGF0aFNlbGVjdGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zaG9ydEZpbGVQYXRoc11dIj4KICAgICAgICA8cGFwZXItdGFiIGlkPSJbW2l0ZW0uaWRdXSI+W1tpdGVtLm5hbWVdXTwvcGFwZXItdGFiPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci10YWJzPgogICAgPGRpdiBpZD0ic291cmNlLWZpbGUtY29udGVudCIgY2xhc3M9InNvdXJjZS1jb250ZW50Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZmlsZUxpbmVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJ7e2l0ZW0uc291cmNlQ2xhc3N9fSIgaWQ9InNvdXJjZS1saW5lLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtbnVtYmVyIiBpZD0ic291cmNlLWxpbmVuby1bW2l0ZW0ubGluZW5vXV0iPgogICAgICAgICAgICBbW2l0ZW0ubGluZW5vXV0KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSIgaWQ9InNvdXJjZS1saW5lLW5vZGUtdG9nZ2xlLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICAgIFtbaXRlbS5udW1Ob2Rlc11dCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtdGV4dCIgaWQ9InNvdXJjZS1saW5lLXRleHQtW1tpdGVtLmxpbmVub11dIj4KICAgICAgICAgICAgW1tpdGVtLnRleHRdXQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPGRpdiBjbGFzcz0ic291cmNlLWxpbmUtbm9kZXMiIGlkPSJzb3VyY2UtbGluZS1ub2Rlcy1bW2l0ZW0ubGluZW5vXV0iPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzb3VyY2UtZmlsZXMtdGFicyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogOCU7CiAgICAgIH0KICAgICAgLnNvdXJjZS1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiA5MCU7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICBvdmVyZmxvdy14OiBzY3JvbGw7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CiAgICAgIC5zb3VyY2UtY29udGVudCA6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmMDA7CiAgICAgIH0KICAgICAgLmhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1udW1iZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjb2xvcjogbGlnaHRibHVlOwogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuc291cmNlLWxpbmUtbm9kZXMgewogICAgICAgIHBhZGRpbmctbGVmdDogNGVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICBtYXJnaW4tdG9wOiAwZW07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMGVtOwogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLWVudHJ5IHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLW5vZGVzIHNwYW4gewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLXRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgI2Z1bGxTdGFja0RpYWxvZyB7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHdpZHRoOiA0NSU7CiAgICAgICAgaGVpZ2h0OiA4NSU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2RkZDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLW5vZGUtbmFtZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgOmhvc3QgI2Z1bGwtc3RhY2stY29udGVudCB7CiAgICAgICAgcGFkZGluZy10b3A6IDFlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KICAgICAgLnN0YWNrLWZyYW1lLWNsaWNrYWJsZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5zdGFjay1mcmFtZS1ub25jbGlja2FibGUgewogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICB9CiAgICAgICNjbG9zZS1mdWxsLXN0YWNrLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yLWRhdGEtc3VtbWFyeSI+CiAgPHRlbXBsYXRlPgogICAgPHNwYW4gY2xhc3M9InNlY3Rpb24tdGl0bGUiPlRlbnNvciBWYWx1ZSBPdmVydmlldzwvc3Bhbj4KICAgIDxkaXYgaWQ9InRlbnNvci1kYXRhLWRpdiIgY2xhc3M9InRlbnNvci1kYXRhLWRpdiI+CiAgICAgIDx0YWJsZSBpZD0idGVuc29yLWRhdGEtdGFibGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0idGVuc29yLWRhdGEtdGFibGUiPgogICAgICAgIDx0aGVhZD4KICAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgIDx0aD5UZW5zb3I8L3RoPgogICAgICAgICAgICA8dGg+Q291bnQ8L3RoPgogICAgICAgICAgICA8dGg+RFR5cGU8L3RoPgogICAgICAgICAgICA8dGg+U2hhcGU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+VmFsdWU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+CiAgICAgICAgICAgICAgSGVhbHRoIFBpbGwKICAgICAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0ic2hvdy1oZWFsdGgtcGlsbHMiIGNoZWNrZWQ9Int7X2hlYWx0aFBpbGxzRW5hYmxlZH19Ij4KICAgICAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWNhcmQ+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFsdGgtcGlsbC1sZWdlbmQiIGlkPSJoZWFsdGgtcGlsbC1sZWdlbmQiPjwvZGl2PgogICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgPHRoIHdpZHRoPSI1JSI+PC90aD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCAjdGVuc29yLWRhdGEtZGl2IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IC5pbmRlbnRlZC1sZXZlbC1jb250YWluZXIgLmNvbnRlbnQtY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDEwcHg7CiAgICAgIH0KICAgICAgOmhvc3QgLnRlbnNvci1kYXRhLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgIH0KICAgICAgOmhvc3QgI3RlbnNvci1kYXRhLXRhYmxlIHRoIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CiAgICAgIDpob3N0IC5hY3RpdmUtdGVuc29yIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGJvcmRlcjogc29saWQgMXB4ICM4ODg7CiAgICAgIH0KICAgICAgOmhvc3QgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIDpob3N0IC5oZWFsdGgtcGlsbC1sZWdlbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIDpob3N0ICNzaG93LWhlYWx0aC1waWxscyB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayA6aG92ZXIgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICB9CiAgICAgIC5oZWFsdGgtcGlsbCA6aG92ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxzdHlsZT4vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLnRlbnNvci13aWRnZXQgewogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxNHB4OwogIG92ZXJmbG93LXg6IGhpZGRlbjsKICBvdmVyZmxvdy15OiBoaWRkZW47CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoudGVuc29yLXdpZGdldC1kaW0gewogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICBtYXJnaW4tbGVmdDogMTVweDsKICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiAgcGFkZGluZzogMnB4Owp9CgoudGVuc29yLXdpZGdldC1kaW0tY29tbWEgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDEwMCwgMTgwLCAyNTUpOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1kaW0tYnJhY2tldHMgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0Owp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgd2lkdGg6IDE4MHB4OwogIHotaW5kZXg6IDEwMDA7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0gewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTgwLCAxODAsIDE4MCk7CiAgZm9udC1zaXplOiAxMnB4OwogIHBhZGRpbmc6IDNweDsKICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigxMDAsIDE4MCwgMjU1KTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUgewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDYwLCA2MCwgNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDhwdDsKICBoZWlnaHQ6IDQ4cHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwYWRkaW5nLWxlZnQ6IDE0cHg7CiAgcGFkZGluZy1yaWdodDogMTBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUtbGFiZWwgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7Cn0KCi50ZW5zb3Itd2lkZ2V0LWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MiwgMjUyLCAyNTIpOwogIGJveC1zaGFkb3c6IDJweCAycHggMnB4ICNiMGIwYjA7CiAgaGVpZ2h0OiA0MHB4OwogIGxpbmUtaGVpZ2h0OiA0MHB4OwogIG1heC1oZWlnaHQ6IDQwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDEwMCU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWluZm8gewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDAsIDAsIDI1NSk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogMjJweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXJnaW4tbGVmdDogOHB4OwogIG1heC1oZWlnaHQ6IDIycHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWIgewogIGNvbG9yOiByZ2IoMzIsIDMzLCAzNik7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LXNpemU6IDE2cHg7CiAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1tZW51LXRodW1iOmhvdmVyIHsKICBjb2xvcjogcmdiKDIyNywgMTE2LCAwKTsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUgewogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1sZWZ0OiAxMnB4Owp9CgoudGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLXZhbHVlIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNsaWNpbmctZ3JvdXAgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTAsIDI1MCwgMjUwKTsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDE5MCwgMTkwLCAxOTApOwogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMThweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgcGFkZGluZy1ib3R0b206IDVweDsKICBwYWRkaW5nLXRvcDogNXB4Owp9CgoudGVuc29yLXdpZGdldC10ZW5zb3ItbmFtZSB7CiAgY29sb3I6IGJsYWNrOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtbGVmdC1ydWxlci10aWNrIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yKTsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci10b3A6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm94LXNoYWRvdzogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjb2xvcjogcmdiKDExMCwgMTEwLCAxMTApOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMjlweDsKICBsaW5lLWhlaWdodDogMjlweDsKICBtYXJnaW4tbGVmdDogMHB4OwogIG1heC13aWR0aDogNDVweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0MCwgMjQwLCAyNDApOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBib3gtc2hhZG93OiAxcHggMXB4IDFweCAjYjBiMGIwOwogIGRpc3BsYXk6IG5vbmU7CiAgZm9udC1zaXplOiAxM3B4OwogIHBhZGRpbmc6IDVweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgd2lkdGg6IDI0MHB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2lkdGg6IDk1JTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSB7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIHBhZGRpbmctcmlnaHQ6IDJweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2IHsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci1yaWdodDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogODAlOwogIGhlaWdodDogMjRweDsKICBsaW5lLWhlaWdodDogMjRweDsKICBtYXgtd2lkdGg6IDQ1cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHVzZXItc2VsZWN0OiBub25lOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDQ1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24gewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IHsKICBib3JkZXItbGVmdDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCB7CiAgYm9yZGVyLXJpZ2h0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCB7CiAgYm9yZGVyLXRvcDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiB7CiAgLS1ib3JkZXItc3R5bGU6IDFweCBzb2xpZCByZ2IoMTQwLCAxNDAsIDE0MCk7CiAgLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEwLCAyMTAsIDIxMCk7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1yb3cgewogIGhlaWdodDogMjVweDsKICBsaW5lLWhlaWdodDogMjVweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Cjwvc3R5bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGVuc29yLXdpZGdldC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoudGVuc29yLXdpZGdldCB7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDE0cHg7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IGhpZGRlbjsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbSB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIG1hcmdpbi1yaWdodDogMTVweDsKICBwYWRkaW5nOiAycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1jb21tYSB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIHsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTAwLCAxODAsIDI1NSk7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjgsIDEyOCwgMTI4KTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGN1cnNvcjogcG9pbnRlcjsKICB3aWR0aDogMTgwcHg7CiAgei1pbmRleDogMTAwMDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigxODAsIDE4MCwgMTgwKTsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogM3B4OwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEwMCwgMTgwLCAyNTUpOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWRpc2FibGVkIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZSB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogNDhweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXgtaGVpZ2h0OiAyMnB4OwogIHBhZGRpbmctbGVmdDogMTRweDsKICBwYWRkaW5nLXJpZ2h0OiAxMHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtaGVhZGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUyLCAyNTIsIDI1Mik7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBoZWlnaHQ6IDQwcHg7CiAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgbWF4LWhlaWdodDogNDBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogMTAwJTsKfQoKLnRlbnNvci13aWRnZXQtaW5mbyB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoMCwgMCwgMjU1KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7CiAgaGVpZ2h0OiAyMnB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIG1hcmdpbi1sZWZ0OiA4cHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtbWVudS10aHVtYiB7CiAgY29sb3I6IHJnYigzMiwgMzMsIDM2KTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtc2l6ZTogMTZweDsKICBtYXJnaW4tbGVmdDogMTBweDsKICBtYXJnaW4tcmlnaHQ6IDVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWI6aG92ZXIgewogIGNvbG9yOiByZ2IoMjI3LCAxMTYsIDApOwp9CgoudGVuc29yLXdpZGdldC1zaGFwZSB7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLWxlZnQ6IDEycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUtdmFsdWUgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTkwLCAxOTAsIDE5MCk7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxOHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBwYWRkaW5nLWJvdHRvbTogNXB4OwogIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIHsKICBjb2xvcjogYmxhY2s7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1sZWZ0LXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3gtc2hhZG93OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyOXB4OwogIGxpbmUtaGVpZ2h0OiAyOXB4OwogIG1hcmdpbi1sZWZ0OiAwcHg7CiAgbWF4LXdpZHRoOiA0NXB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXIgewogIGhlaWdodDogMjRweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGJveC1zaGFkb3c6IDFweCAxcHggMXB4ICNiMGIwYjA7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEzcHg7CiAgcGFkZGluZzogNXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB3aWR0aDogMjQwcHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtY29sb3JiYXIgewogIGhlaWdodDogMjRweDsKICB3aWR0aDogOTUlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWluZGljZXMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIHsKICBtYXJnaW4tdG9wOiAyMHB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayB7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnVsZXItYmFja2dyb3VuZC1jb2xvcik7CiAgYm9yZGVyLWJvdHRvbTogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3JkZXItcmlnaHQ6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDI0cHg7CiAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYgewogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4MCU7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIG1heC13aWR0aDogNDVweDsKICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIHsKICBib3JkZXItYm90dG9tOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWxlZnQgewogIGJvcmRlci1sZWZ0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0IHsKICBib3JkZXItcmlnaHQ6IDAuNXB4IHNvbGlkIGJsdWU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIHsKICBib3JkZXItdG9wOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1zZWN0aW9uIHsKICAtLWJvcmRlci1zdHlsZTogMXB4IHNvbGlkIHJnYigxNDAsIDE0MCwgMTQwKTsKICAtLXJ1bGVyLWJhY2tncm91bmQtY29sb3I6IHJnYigyMTAsIDIxMCwgMjEwKTsKICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXJvdyB7CiAgaGVpZ2h0OiAyNXB4OwogIGxpbmUtaGVpZ2h0OiAyNXB4OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDx2ei1saW5lLWNoYXJ0MiB4LWNvbXBvbmVudHMtY3JlYXRpb24tbWV0aG9kPSJbW19saW5lQ2hhcnRYQ29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHktdmFsdWUtYWNjZXNzb3I9IltbX2xpbmVDaGFydFlWYWx1ZUFjY2Vzc29yXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnNdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWRdXSI+PC92ei1saW5lLWNoYXJ0Mj4KICAgIDxzdHlsZT4KICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIGhlaWdodDogMzAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3ItdmFsdWUtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0ZW5zb3JWYWx1ZVRvYXN0IiB0ZXh0PSIiIGFsd2F5cy1vbi10b3A+PC9wYXBlci10b2FzdD4KICAgIDx0YWJsZSBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGFibGUiPgogICAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9InRlbnNvci1uYW1lIiBvbi10YXA9InRlbnNvck5hbWVDYWxsYmFjayI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRlbnNvci1uYW1lLXRleHQiPltbdGVuc29yTmFtZV1dPC9zcGFuPgogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJjbG9zZSIgY2xhc3M9InZhbHVlLXZpZXctaWNvbi1idXR0b24iIGlkPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiB0aXRsZT0iQ2xvc2UiIG9uLXRhcD0iY2xvc2VCdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImZvcndhcmQiIGNsYXNzPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiBpZD0idmFsdWUtdmlldy1pY29uLWJ1dHRvbiIgdGl0bGU9IkNvbnRpbnVlIHRvIiBvbi10YXA9ImNvbnRpbnVlVG9CdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0idGVuc29yLXZhbHVlLXZhbHVlLXRyIj4KICAgICAgICA8dGQ+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPGRpdiBpZD0idGVuc29yLXdpZGdldCI+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9ImRlYnVnLW9wIj48L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlNsaWNpbmciIGlkPSJzbGljaW5nIiB2YWx1ZT0ie3tzbGljaW5nfX0iIG9uLWNoYW5nZT0icmVmcmVzaCI+CiAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlRpbWUgSW5kaWNlcyIgaWQ9InRpbWUtaW5kaWNlcyIgdmFsdWU9Int7dGltZUluZGljZXN9fSIgb24tY2hhbmdlPSJyZWZyZXNoIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBpZD0idGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iIGNsYXNzPSJ0ZW5zb3ItdmFsdWUtYnV0dG9ucyIgb24tY2xpY2s9Il90aW1lSW5kaWNlc1RvZ2dsZUJ1dHRvbkNhbGxiYWNrIj5GdWxsIEhpc3Rvcnk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgPC9kaXY+PC90ZW1wbGF0ZT48L3RkPjx0ZCBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlU2NhbGFyXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgY2xhc3M9ImlubGluZSIgbGFiZWw9IlNjYWxhciBWYWx1ZSIgaWQ9InZhbHVlLXNjYWxhciIgdmFsdWU9IltbX2RhdGFTY2FsYXJdXSI+CiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlTGluZUNoYXJ0XV0iPgogICAgICAgICAgICAgICAgICA8dGYtZGVidWdnZXItbGluZS1jaGFydCBkYXRhPSJbW19saW5lQ2hhcnREYXRhXV0iPjwvdGYtZGVidWdnZXItbGluZS1jaGFydD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVmFsdWVJbWFnZV1dIj4KICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0idmFsdWUtaW1hZ2UiIGhlaWdodD0iMjUwcHgiIHdpZHRoPSIyNTBweCIgc3JjJD0iW1tfZGF0YUltYWdlU3JjXV0iPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAKICAgICAgICAgIAogICAgICAgIAogICAgICA8L3RyPgogICAgPC90YWJsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGVuc29yLXdpZGdldC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnRlbnNvci12YWx1ZS1idXR0b25zIHsKICAgICAgICBoZWlnaHQ6IDc1JTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIH0KICAgICAgLnRlbnNvci12YWx1ZS12aWV3LXRhYmxlIHsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLXRhYmxlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiA1cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggMXB4IDFweCAjZDhkOGQ4OwogICAgICB9CiAgICAgIC50ZW5zb3ItdmFsdWUtdmlldy10ZCB7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICB9CiAgICAgIC52YWx1ZS1jYXJkLWlucHV0IHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KICAgICAgI3RlbnNvci1uYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC50ZW5zb3ItbmFtZS10ZXh0IHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAjZGVidWctb3AgewogICAgICAgIGZvbnQtc2l6ZTogOTAlOwogICAgICB9CiAgICAgIC52YWx1ZS1pbWFnZSB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgIH0KICAgICAgLnZhbHVlLXZpZXctaWNvbi1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgI3RlbnNvci13aWRnZXQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICAgICAgICAvKiBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogICAgICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7ICovCiAgICAgICAgaGVpZ2h0OiAyODBweDsKICAgICAgICB3aWR0aDogNDg0cHg7CiAgICAgIH0KICAgICAgI3NsaWNpbmcsCiAgICAgICN0aW1lLWluZGljZXMgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtdWx0aVZpZXciPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UZW5zb3IgVmFsdWVzPC9kaXY+CiAgICAgIDxkaXYgaWQ9Im11bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAjbXVsdGlWaWV3IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogM3B4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2VlZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0b2FzdCIgdGV4dD0iIiBhbHdheXMtb24tdG9wPjwvcGFwZXItdG9hc3Q+CiAgICA8dGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cgaWQ9ImluaXRpYWxEaWFsb2ciPjwvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2c+CiAgICAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBpZD0ibGVmdC1wYW5lIj4KICAgICAgICA8ZGl2IGlkPSJub2RlLWVudHJpZXMiIGNsYXNzPSJub2RlLWVudHJpZXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+UnVudGltZSBOb2RlIExpc3Q8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSI+CiAgICAgICAgICAgIFNob3cgQ29kZToKICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSIgaWQ9InNob3ctc291cmNlLWNvZGUiIGNoZWNrZWQ9Int7X3NvdXJjZUNvZGVTaG93bn19Ij48L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0Zi1vcC1zZWxlY3RvciBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZGVidWctd2F0Y2gtY2hhbmdlPSJbW19jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZm9yY2UtZXhwYW5kLWFuZC1jaGVjay1ub2RlLW5hbWU9IltbX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZV1dIiBmb3JjZS1leHBhbmQtbm9kZS1uYW1lPSJbW19mb3JjZUV4cGFuZE5vZGVOYW1lXV0iPgogICAgICAgICAgPC90Zi1vcC1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzb3VyY2UtY29kZS12aWV3LWRpdiIgY2xhc3M9InNvdXJjZS1jb2RlLXZpZXctZGl2IiBoaWRkZW4kPSJ7eyFfc291cmNlQ29kZVNob3dufX0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+U291cmNlIENvZGU8L2Rpdj4KICAgICAgICAgIDx0Zi1zb3VyY2UtY29kZS12aWV3IGlkPSJzb3VyY2VDb2RlVmlldyIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZm9jdXMtbm9kZS1uYW1lPSJbW19zb3VyY2VGb2N1c05vZGVOYW1lXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgY29udGludWUtdG8tbm9kZT0iW1tfY3JlYXRlQ29udGludWVUb05vZGVIYW5kbGVyKCldXSI+PC90Zi1zb3VyY2UtY29kZS12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDx0Zi1kZWJ1Z2dlci1yZXNpemVyIGN1cnJlbnQtbGVuZ3RoPSJ7e19sZWZ0UGFuZVdpZHRofX0iIG1pbi1sZW5ndGg9IltbX21pbmxlZnRQYW5lV2lkdGhdXSIgbWF4LWxlbmd0aD0iW1tfbWF4bGVmdFBhbmVXaWR0aF1dIj4KICAgICAgICA8L3RmLWRlYnVnZ2VyLXJlc2l6ZXI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0Zi1zZXNzaW9uLXJ1bnMtdmlldyBpZD0ic2Vzc2lvblJ1bnNWaWV3IiBsYXRlc3Qtc2Vzc2lvbi1ydW49IltbX2xhdGVzdFNlc3Npb25SdW5dXSIgc2Vzc2lvbi1ydW4ta2V5LXRvLWRldmljZS1uYW1lcz0iW1tfc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc11dIiBzb2xlLWFjdGl2ZT0iW1tfc2Vzc2lvblJ1blNvbGVBY3RpdmVdXSIgbm9kZS1vci10ZW5zb3ItY2xpY2tlZD0iW1tfY3JlYXRlRmVlZEZldGNoVGFyZ2V0Q2xpY2tlZEhhbmRsZXIoKV1dIj4KICAgICAgICAgIDwvdGYtc2Vzc2lvbi1ydW5zLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucy1jb250YWluZXIiPgogICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9zdGVwIj4KICAgICAgICAgICAgPHNwYW4+W1tfc3RlcEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPHRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyBpZD0iY29udGludWVEaWFsb2ciIHNlc3Npb24tcnVuLWdvPSJbW19jcmVhdGVTZXNzaW9uUnVuR28oKV1dIiB0ZW5zb3ItY29uZGl0aW9uLWdvPSJbW19jcmVhdGVUZW5zb3JDb25kaXRpb25HbygpXV0iIGZvcmNlLWNvbnRpbnVhdGlvbi1zdG9wPSJbW19jcmVhdGVGb3JjZUNvbnRpbnVhdGlvblN0b3AoKV1dIj4KICAgICAgICAgIDwvdGYtZGVidWdnZXItY29udGludWUtZGlhbG9nPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8dGYtZ3JhcGgtbG9hZGVyIGlkPSJsb2FkZXIiIG91dC1ncmFwaC1oaWVyYXJjaHk9Int7Z3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e2dyYXBofX0iIG91dC1zdGF0cz0ie3tzdGF0c319IiBwcm9ncmVzcz0ie3tfZ3JhcGhQcm9ncmVzc319Ij48L3RmLWdyYXBoLWxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIiBpZD0iY2VudGVyLWNvbnRlbnQiPgogICAgICAgIDxkaXYgaWQ9InRvcC1yaWdodC1xdWFkcmFudCI+CiAgICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfdG9wUmlnaHRTZWxlY3RlZH19Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdG9wUmlnaHRUYWJzXV0iPgogICAgICAgICAgICAgIDxwYXBlci10YWIgaWQ9IltbaXRlbS5pZF1dIj5bW2l0ZW0ubmFtZV1dPC9wYXBlci10YWI+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJydW50aW1lLWdyYXBoLWRldmljZSI+CiAgICAgICAgICAgIDxzcGFuIGlkPSJydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIj4gPC9zcGFuPgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0iYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iRGV2aWNlIG5hbWUiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNdXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgY2xhc3M9InNwaW5uZXIiIGlkPSJ0b3AtcmlnaHQtc3Bpbm5lciIgaGlkZGVuPSJbWyFfYnVzeV1dIiBhY3RpdmU9IltbX2J1c3ldXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgaWQ9InRvcC1yaWdodC1wcm9ncmVzcy1iYXIiIHZhbHVlPSIwIj48L3BhcGVyLXByb2dyZXNzPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZV1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iZ3JhcGgtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8dGYtZ3JhcGggaWQ9ImdyYXBoIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgYmFzaWMtZ3JhcGg9IltbZ3JhcGhdXSIgc3RhdHM9Iltbc3RhdHNdXSIgcHJvZ3Jlc3M9Int7X2dyYXBoUHJvZ3Jlc3N9fSIgY29sb3ItYnk9InN0cnVjdHVyZSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW19jcmVhdGVOb2RlQ29udGV4dE1lbnVJdGVtcygpXV0iPjwvdGYtZ3JhcGg+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGV4dC1tZW51Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlXV0iPgogICAgICAgICAgICA8dGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXcgaWQ9InRlbnNvclZhbHVlTXVsdGlWaWV3IiBjb250aW51ZS10by1jYWxsYmFjaz0iW1tfY3JlYXRlQ29udGludWVUb0NhbGxiYWNrKCldXSIgdGVuc29yLW5hbWUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZ2V0LWhlYWx0aC1waWxsPSJbW19jcmVhdGVHZXRIZWFsdGhQaWxsKCldXSI+CiAgICAgICAgICAgIDwvdGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8dGYtZGVidWdnZXItcmVzaXplciBpcy1ob3Jpem9udGFsPSJ0cnVlIiBjdXJyZW50LWxlbmd0aD0ie3tfdG9wUmlnaHRRdWFkcmFudEhlaWdodH19IiBtaW4tbGVuZ3RoPSJbW19taW5Ub3BSaWdodFF1YWRyYW50SGVpZ2h0XV0iIG1heC1sZW5ndGg9IltbX21heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHRdXSI+CiAgICAgICAgPC90Zi1kZWJ1Z2dlci1yZXNpemVyPgoKICAgICAgICA8ZGl2IGlkPSJ0ZW5zb3ItZGF0YSIgY2xhc3M9InRlbnNvci1kYXRhIj4KICAgICAgICAgIDx0Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5IGlkPSJ0ZW5zb3JEYXRhU3VtbWFyeSIgbGF0ZXN0LXRlbnNvci1kYXRhPSJbW19sYXRlc3RUZW5zb3JEYXRhXV0iIGV4cGFuZC1oYW5kbGVyPSJbW19jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpXV0iIGNvbnRpbnVlLXRvLWNhbGxiYWNrPSJbW19jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKV1dIiBoaWdobGlnaHRlZC1ub2RlLW5hbWU9IltbX2hpZ2hsaWdodE5vZGVOYW1lXV0iIHRlbnNvci1uYW1lLWNsaWNrZWQ9IltbX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpXV0iIGdldC1oZWFsdGgtcGlsbD0iW1tfY3JlYXRlR2V0SGVhbHRoUGlsbCgpXV0iPgogICAgICAgICAgPC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIHBhcGVyLXRvYXN0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIHdpZHRoOiA0MHZ3OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzMHZ3OwogICAgICB9CiAgICAgIHRmLWRhc2hib2FyZC1sYXlvdXQgewogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzOiBhdXRvOwogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aDogbm9uZTsKICAgICAgICAtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGg6IG5vbmU7CiAgICAgIH0KICAgICAgLmRlYnVnZ2VyLXNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICBwYXBlci10YWJzIHsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIHBhcGVyLXRhYi5pcm9uLXNlbGVjdGVkIHsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgI2luaXRpYWxEaWFsb2cgewogICAgICAgIC8qKiBUaGlzIG1hdGNoZXMgdGhlIGRlZmF1bHQgei1pbmRleCBvZiBwYXBlci1kaWFsb2cgYmFja2Ryb3BzLiAqLwogICAgICAgIHotaW5kZXg6IDEwMjsKICAgICAgfQogICAgICAvKiogUmVzaXplIHRoZSByZWdpb24gZm9yIHRoZSBncmFwaCBhcyB0aGUgdXNlciByZXNpemVzIHRoZSByZWdpb24uICovCiAgICAgICNncmFwaC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMTIwcHgpOwogICAgICAgIC8qKiBDbGlwIHRoZSBtaW5pbWFwIGlmIHRoZSBoZWlnaHQgb2YgdGhlIGdyYXBoIGNvbnRhaW5lciBpcyBzbWFsbC4gKi8KICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAjZ3JhcGggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmctbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEzcHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgICN4LXR5cGUtc2VsZWN0b3IgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDVweCAzcHg7CiAgICAgIH0KICAgICAgLnJ1bnRpbWUtZ3JhcGgtZGV2aWNlIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgICNydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgICNhY3RpdmUtcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiA4NSU7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuc2lkZWJhciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtZGVidWdnZXItcmVzaXplciB7CiAgICAgICAgcmlnaHQ6IC0xMHB4OwogICAgICB9CiAgICAgICNjZW50ZXItY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIC8qKiBUaGUgcmVzaXplciBzaG91bGQgaGF2ZSBubyBzcGFjZSB0byB0aGUgbGVmdCBvZiBpdC4gKi8KICAgICAgI2NlbnRlci1jb250ZW50IHRmLWRlYnVnZ2VyLXJlc2l6ZXJbaXMtaG9yaXpvbnRhbF0gewogICAgICAgIG1hcmdpbi1sZWZ0OiAtMjNweDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CiAgICAgIC5zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAubm9kZS1lbnRyaWVzIHsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDgwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc291cmNlLWNvZGUtdmlldy1kaXYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDQwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgICNzZXNzaW9uUnVuc1ZpZXcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiAyNXZoOwogICAgICB9CiAgICAgIC5idXR0b25zLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogMjBweCAwOwogICAgICB9CiAgICAgICN0ZW5zb3ItZGF0YSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDIwcHggMDsKICAgICAgICBtYXJnaW46IDAgMCAyMHB4IDA7CiAgICAgIH0KICAgICAgI3RlbnNvckRhdGFTdW1tYXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CiAgICAgICN0b3AtcmlnaHQtcXVhZHJhbnQgewogICAgICAgIGhlaWdodDogNjYlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC50b2dnbGUtc291cmNlLWNvZGUgewogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICAgIGZvbnQtc2l6ZTogODAlOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGkgewogICAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICB9CiAgICAgIC5pbmxpbmUsCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydCB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItbWF0ZXJpYWwtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIHsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgewogICAgICAgIG1hcmdpbjogMTBweCAxMHB4IDEwcHggMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1wcmV2aWV3IHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtYXJnaW46IDAgMTBweCAwIDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAuY29sb3ItbGFiZWwsCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBjb2xvcjogIzc3NzsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgICBsaW5lLWhlaWdodDogMjZweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLnRlbnNvci1jb3VudCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZSBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nCiAgICogMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMgd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwKICAgKiBhbmQgYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICogQXBwYXJlbnRseSwgdGhlIHBhcGVyLXNsaWRlciBsYWNrcyBhIG1peGluIGZvciB0aG9zZSBwYWRkaW5nIHZhbHVlcy4gKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHRkIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIHdpZHRoOiA4MHB4OwogICAgICB9CgogICAgICAudGVuc29yLWRldmljZS10ZCB7CiAgICAgICAgbWF4LXdpZHRoOiAxNDBweDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGU6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5kZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCB7CiAgICAgICAgd2lkdGg6IDEzMHB4OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCA+IGRpdiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgI2V2ZW50LWNvdW50cy10aCB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyNTUsIDE0MSwgMCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5wb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMCwgNjIsIDIxMik7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMjA0LCA0NywgNDQpOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24sCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5uby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24gewogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJjYXJkIGhlYWx0aC1waWxsLWxlZ2VuZCI+CiAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICBFbmFibGUgYWxsIChub3QganVzdCBzYW1wbGVkKSBzdGVwcy4gUmVxdWlyZXMgc2xvdyBkaXNrIHJlYWQuCiAgICAgIDwvZGl2PgogICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0iZW5hYmxlQWxsU3RlcHNNb2RlVG9nZ2xlIiBjaGVja2VkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSI+CiAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgPGgyPgogICAgICAgIFN0ZXAgb2YgSGVhbHRoIFBpbGxzOgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IiBtaW49IjAiIG1heD0iW1tfYmlnZ2VzdFN0ZXBFdmVyU2Vlbl1dIiB2YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOjppbnB1dH19Ij4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICAgIFtbX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlXV0KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIWFyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBpZD0iaGVhbHRoLXBpbGxzLWxvYWRpbmctc3Bpbm5lciI+PC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIiBpbW1lZGlhdGUtdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBtYXg9IltbX2JpZ2dlc3RTdGVwRXZlclNlZW5dXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWF4U3RlcEluZGV4XV0iPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIiIGltbWVkaWF0ZS12YWx1ZT0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIG1heD0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGgyPgogICAgICAgIEhlYWx0aCBQaWxsCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGVdXSI+CiAgICAgICAgICBDb3VudHMgZm9yIFNlbGVjdGVkIE5vZGUKICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZV1dIj4KICAgICAgICAgIExlZ2VuZAogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaGVhbHRoUGlsbEVudHJpZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhbHRoLXBpbGwtZW50cnkiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItcHJldmlldyIgc3R5bGU9ImJhY2tncm91bmQ6W1tpdGVtLmJhY2tncm91bmRfY29sb3JdXSI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sYWJlbCI+W1tpdGVtLmxhYmVsXV08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRlbnNvci1jb3VudCI+CiAgICAgICAgICAgIFtbX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZyhoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlLAogICAgICAgICAgICBpbmRleCldXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyhkZWJ1Z2dlck51bWVyaWNBbGVydHMpXV0iPgogICAgICAgIDxoMiBpZD0ibnVtZXJpYy1hbGVydHMtaGVhZGVyIj5OdW1lcmljIEFsZXJ0czwvaDI+CiAgICAgICAgPHA+CiAgICAgICAgICBBbGVydHMgYXJlIHNvcnRlZCBmcm9tIHRvcCB0byBib3R0b20gYnkgaW5jcmVhc2luZyB0aW1lc3RhbXAuCiAgICAgICAgCiAgICAgICAgPGRpdiBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUtY29udGFpbmVyIj4KICAgICAgICAgIDx0YWJsZSBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUiPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpcnN0IE9mZmVuc2U8L3RoPgogICAgICAgICAgICAgICAgPHRoPlRlbnNvciAoRGV2aWNlKTwvdGg+CiAgICAgICAgICAgICAgICA8dGggaWQ9ImV2ZW50LWNvdW50cy10aCI+RXZlbnQgQ291bnRzPC90aD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHkgaWQ9Im51bWVyaWMtYWxlcnRzLWJvZHkiPjwvdGJvZHk+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSI+CiAgICAgICAgPHAgY2xhc3M9Im5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiI+CiAgICAgICAgICBObyBudW1lcmljIGFsZXJ0cyBzbyBmYXIuIFRoYXQgaXMgbGlrZWx5IGdvb2QuIEFsZXJ0cyBpbmRpY2F0ZSB0aGUKICAgICAgICAgIHByZXNlbmNlIG9mIE5hTiBvciAoKy8tKSBJbmZpbml0eSB2YWx1ZXMsIHdoaWNoIG1heSBiZSBjb25jZXJuaW5nLgogICAgICAgIAogICAgICAKICAgIAogIAogIAoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tbGlzdCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWF4LWRldmljZS1waXhlbC1yYXRpbzogMSkgewogICAgICAgIDpob3N0IHsKICAgICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgfQogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIEBhcHBseSAtLWlyb24tbGlzdC1pdGVtcy1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtncmlkXSkpICNpdGVtcyA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNpdGVtcyA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxhcnJheS1zZWxlY3RvciBpZD0ic2VsZWN0b3IiIGl0ZW1zPSJ7e2l0ZW1zfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkSXRlbXN9fSIgc2VsZWN0ZWQtaXRlbT0ie3tzZWxlY3RlZEl0ZW19fSI+PC9hcnJheS1zZWxlY3Rvcj4KCiAgICA8L3RlbXBsYXRlPjwvZG9tLW1vZHVsZT48ZGl2IGlkPSJpdGVtcyI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgoKICA8L3RlbXBsYXRlPgo8L3BhcGVyLW1hdGVyaWFsPjwvdGVtcGxhdGU+PC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWl0ZW0tYm9keSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsgLyogbmVlZGVkIGZvciB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcyB0byB3b3JrIG9uIGZmICovCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICB9CgogICAgICA6aG9zdChbdHdvLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXR3by1saW5lLW1pbi1oZWlnaHQsIDcycHgpOwogICAgICB9CgogICAgICA6aG9zdChbdGhyZWUtbGluZV0pIHsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLWJvZHktdGhyZWUtbGluZS1taW4taGVpZ2h0LCA4OHB4KTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoW3NlY29uZGFyeV0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeS1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtaWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAwOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtZWxsaXBzZSB7CiAgICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCwKICAgICAgLmZhZGVkLWVsbGlwc2UsCiAgICAgIC5mYWRlZC1zZXJpZXMgewogICAgICAgIHN0cm9rZTogdmFyKC0tdGItZ3JhcGgtZmFkZWQpICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxzdmcgaGVpZ2h0PSIwIiB3aWR0aD0iMCIgaWQ9InN2Z0RlZnMiPgogICAgICA8ZGVmcz4KICAgICAgICAKICAgICAgICA8cGF0dGVybiBpZD0icmVjdEhhdGNoIiBwYXR0ZXJudHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIgd2lkdGg9IjUiIGhlaWdodD0iNSIgcGF0dGVybnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNSIgc3R5bGU9InN0cm9rZS13aWR0aDogMSIgLz4KICAgICAgICA8L3BhdHRlcm4+CiAgICAgICAgPHBhdHRlcm4gaWQ9ImVsbGlwc2VIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjIiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGlkPSJzdW1tYXJ5LWljb24iIGZpbGw9IiM4NDg0ODQiIGhlaWdodD0iMTIiIHZpZXdib3g9IjAgMCAyNCAyNCIgd2lkdGg9IjEyIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2RlZnM+CiAgICA8L3N2Zz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdDT05TVCcpXV0iPgogICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxMCAxMCI+CiAgICAgICAgPGNpcmNsZSBjeD0iNSIgY3k9IjUiIHI9IjMiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU1VNTUFSWScpXV0iPgogICAgICA8c3ZnIHdpZHRoJD0iW1toZWlnaHRdXSIgaGVpZ2h0JD0iW1toZWlnaHRdXSIgdmlld2JveD0iMCAwIDI0IDI0IiBmaWxsPSIjODQ4NDg0Ij4KICAgICAgICA8cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnT1AnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTYgOCI+CiAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdlbGxpcHNlJyl9fSIgeD0iOCIgeT0iNCIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ01FVEEnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMzcgMTYiPgogICAgICAgIDxyZWN0IHg9IjEiIHk9IjEiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdyZWN0Jyl9fSIgc3Ryb2tlLXdpZHRoPSIycHgiIGhlaWdodD0iMTQiIHdpZHRoPSIzNSIgcng9IjUiIHJ5PSI1IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU0VSSUVTJyldXSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNiAxNSI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLXZlcnRpY2FsLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnc2VyaWVzJyl9fSIgeD0iMCIgeT0iMiIgLz4KICAgICAgICA8L3N2Zz4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyF2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAyNCAxMCI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdzZXJpZXMnKX19IiB4PSIwIiB5PSIxIiAvPgogICAgICAgIDwvc3ZnPgogICAgICA8L3RlbXBsYXRlPgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ub2RlLWljb24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgLS10Yi1ncmFwaC1mYWRlZDogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRmLWdyYXBoLWljb24gaWQ9Imljb24iIHR5cGU9IltbX2dldFR5cGUobm9kZSwgc3VtbWFyeSwgY29uc3QsIHR5cGUpXV0iIGhlaWdodD0iW1toZWlnaHRdXSIgZmlsbC1vdmVycmlkZT0iW1tfZmlsbE92ZXJyaWRlXV0iIHN0cm9rZS1vdmVycmlkZT0iW1tfZ2V0U3Ryb2tlT3ZlcnJpZGUoX2ZpbGxPdmVycmlkZSldXSIgZmFkZWQ9IltbX2dldEZhZGVkKHJlbmRlckluZm8pXV0iIHZlcnRpY2FsPSJbW19pc1ZlcnRpY2FsKG5vZGUsIHZlcnRpY2FsKV1dIj48L3RmLWdyYXBoLWljb24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAjbGlzdC1pdGVtIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIC5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuIHsKICAgICAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbS5leGNsdWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuLmVkZ2UtbGFiZWwgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmZhZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgIDwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXgtaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgLmluY29tcGF0aWJsZS1vcHMtbGlzdCB7CiAgICAgICAgaGVpZ2h0OiAzNTBweDsKICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICBpcm9uLWxpc3QgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGJhY2tncm91bmQ6ICNlOWU5ZTk7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIGNvbG9yOiAjNWU1ZTVlOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ub24tY29udHJvbC1saXN0LWl0ZW0gewogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC1kaXNwbGF5IHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgc3ZnLm9wLWNvbXBhdCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGhlaWdodDogMjVweDsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC12YWx1ZSB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pdGVtPgogICAgICA8cGFwZXItaXRlbS1ib2R5IHR3by1saW5lPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfZXhwYW5kZWQpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlRXhwYW5kZWQiIGNsYXNzPSJ0b2dnbGUtYnV0dG9uIj4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJub2RlLW5hbWUiIGlkPSJub2RldGl0bGUiPltbbm9kZVRpdGxlXV08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3AtY29tcGF0LWRpc3BsYXkiPgogICAgICAgICAgICAgIDxzdmcgY2xhc3M9Im9wLWNvbXBhdCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDI1MCAyNSI+CiAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgPGxpbmVhcmdyYWRpZW50IGlkPSJvcC1jb21wYXQtZmlsbCI+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BJbmNvbXBhdENvbG9yXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3IkPSJbW19vcEluY29tcGF0Q29sb3IgXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgPC9saW5lYXJncmFkaWVudD4KICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgIDxyZWN0IGhlaWdodD0iMjUiIHdpZHRoPSIyNTAiIHJ4PSI1IiByeT0iNSIgc3R5bGU9ImZpbGw6IHVybCgnI29wLWNvbXBhdC1maWxsJyk7IiAvPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wLWNvbXBhdC12YWx1ZSI+W1tfb3BDb21wYXRTY29yZUxhYmVsXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci1pdGVtLWJvZHk+CiAgICA8L3BhcGVyLWl0ZW0+CgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgSW5jb21wYXRpYmxlIE9wZXJhdGlvbnM6ICg8c3Bhbj5bW190b3RhbEluY29tcGF0T3BzXV08L3NwYW4+KQogICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0iaW5jb21wYXRpYmxlLW9wcy1saXN0IiBpZD0iaW5jb21wYXRpYmxlT3BzTGlzdCIgaXRlbXM9IltbX2luY29tcGF0aWJsZU9wTm9kZXNdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW19nZXRSZW5kZXJJbmZvKGl0ZW0ubmFtZSwgcmVuZGVySGllcmFyY2h5KV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGl0ZW0tdHlwZT0iaW5jb21wYXRpYmxlLW9wcyI+CiAgICAgICAgICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tY29sbGFwc2U+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbm9kZS1saXN0LWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3BhbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQwcHg7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0uZXhjbHVkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3Bhbi5lZGdlLWxhYmVsIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDFweDsKICAgICAgICBsZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPjwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJlZGdlLWxhYmVsIj5bW2VkZ2VMYWJlbF1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLW5vZGUtaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuc3ViLWxpc3QtZ3JvdXAgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMzAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CgogICAgICAuYXR0ci1sZWZ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICB3aWR0aDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLmF0dHItcmlnaHQgewogICAgICAgIG1hcmdpbi1sZWZ0OiAzMCU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogdGFibGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLXJvdyAuc3ViLWxpc3QtdGFibGUtY2VsbDpsYXN0LWNoaWxkIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLWNlbGwgewogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDsKICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICB9CgogICAgICBwYXBlci1pdGVtLWJvZHlbdHdvLWxpbmVdIHsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDRweDsKICAgICAgfQoKICAgICAgLmV4cGFuZGVkSW5mbyB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sRGVwcyB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgOHB4OwogICAgICB9CgogICAgICAubm9kZS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBmb250LXNpemU6IDE0cHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAuc3VidGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICBjb2xvcjogIzVlNWU1ZTsKICAgICAgfQoKICAgICAgLmNvbnRyb2xMaW5lIHsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuY29udHJvbC10b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGUtZ3JvdXAgewogICAgICAgIHBhZGRpbmctdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZSB7CiAgICAgICAgbWFyZ2luOiA1cHggNnB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB0OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAubm9uLWNvbnRyb2wtbGlzdC1pdGVtIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItaXRlbT4KICAgICAgPHBhcGVyLWl0ZW0tYm9keSB0d28tbGluZT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX2V4cGFuZGVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUV4cGFuZGVkIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIiBpZD0ibm9kZXRpdGxlIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDx0Zi1ub2RlLWljb24gY2xhc3M9Im5vZGUtaWNvbiIgbm9kZT0iW1tfbm9kZV1dIiByZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhncmFwaE5vZGVOYW1lLCByZW5kZXJIaWVyYXJjaHkpXV0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+PC90Zi1ub2RlLWljb24+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUub3B9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgICBPcGVyYXRpb246CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5vcF1dPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUubWV0YWdyYXBofX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgU3ViZ3JhcGg6CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5jYXJkaW5hbGl0eV1dPC9zcGFuPiBub2RlcwogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvcGFwZXItaXRlbS1ib2R5PgogICAgPC9wYXBlci1pdGVtPgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgYXR0cmlidXRlcyI+CiAgICAgICAgICAgIEF0dHJpYnV0ZXMgKDxzcGFuPltbX2F0dHJpYnV0ZXMubGVuZ3RoXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImF0dHJpYnV0ZXNMaXN0IiBpdGVtcz0iW1tfYXR0cmlidXRlc11dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPltbaXRlbS5rZXldXTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLXJpZ2h0Ij5bW2l0ZW0udmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2RldmljZX19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgZGV2aWNlIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPkRldmljZTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItcmlnaHQiPltbX2RldmljZV1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBwcmVkZWNlc3NvcnMiPgogICAgICAgICAgICBJbnB1dHMgKDxzcGFuPltbX3RvdGFsUHJlZGVjZXNzb3JzXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImlucHV0c0xpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMucmVndWxhcl1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0gY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIgY2FyZC1ub2RlPSJbW19ub2RlXV0iIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIgZWRnZS1sYWJlbD0iW1tpdGVtLmVkZ2VMYWJlbF1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgIDwvdGYtbm9kZS1saXN0LWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcHJlZGVjZXNzb3JzLmNvbnRyb2wubGVuZ3RoXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xEZXBzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xMaW5lIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX29wZW5lZENvbnRyb2xQcmVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xQcmVkIiBjbGFzcz0iY29udHJvbC10b2dnbGUtYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sUHJlZH19IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfb3BlbmVkQ29udHJvbFByZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0icHJlZGVjZXNzb3JzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHN1Y2Nlc3NvcnMiPgogICAgICAgICAgICBPdXRwdXRzICg8c3Bhbj5bW190b3RhbFN1Y2Nlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpZD0ib3V0cHV0c0xpc3QiIGl0ZW1zPSJbW19zdWNjZXNzb3JzLnJlZ3VsYXJdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGVkZ2UtbGFiZWw9IltbaXRlbS5lZGdlTGFiZWxdXSIgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgaXRlbS10eXBlPSJzdWNjZXNzb3IiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N1Y2Nlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfb3BlbmVkQ29udHJvbFN1Y2MpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlQ29udHJvbFN1Y2MiIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7X29wZW5lZENvbnRyb2xTdWNjfX0iIG5vLWFuaW1hdGlvbj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaXRlbXM9IltbX3N1Y2Nlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0ic3VjY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaGFzRGlzcGxheWFibGVOb2RlU3RhdHN9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIG5vZGUtc3RhdHMiPgogICAgICAgICAgICAgIE5vZGUgU3RhdHMKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy50b3RhbEJ5dGVzfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPk1lbW9yeTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXNdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2dldFRvdGFsTWljcm9zKF9ub2RlU3RhdHMpfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPkNvbXB1dGUgVGltZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWVdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy5vdXRwdXRTaXplfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPlRlbnNvciBPdXRwdXQgU2l6ZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW1dXSA8YnI+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2Z1bmN0aW9uVXNhZ2VzLmxlbmd0aF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgICBVc2FnZXMgb2YgdGhlIEZ1bmN0aW9uICg8c3Bhbj5bW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXTwvc3Bhbj4pCiAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGlkPSJmdW5jdGlvblVzYWdlc0xpc3QiIGl0ZW1zPSJbW19mdW5jdGlvblVzYWdlc11dIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9ImZ1bmN0aW9uVXNhZ2VzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzTGlicmFyeUZ1bmN0aW9uKF9ub2RlKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWluY2x1ZGUtZ3JvdXAiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIGNsYXNzPSJ0b2dnbGUtaW5jbHVkZSIgb24tY2xpY2s9Il90b2dnbGVJbmNsdWRlIj4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2F1eEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaXNJblNlcmllcyhfbm9kZSl9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idG9nZ2xlLWluY2x1ZGUiIG9uLWNsaWNrPSJfdG9nZ2xlR3JvdXAiPgogICAgICAgICAgICAgICAgPHNwYW4+W1tfZ3JvdXBCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1pbmZvIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNjUwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7c2VsZWN0ZWROb2RlfX0iPgogICAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBjbGFzcz0iY2FyZCI+CiAgICAgICAgPHRmLW5vZGUtaW5mbyBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZmxhdC1ncmFwaD0iW1tncmFwaF1dIiBncmFwaC1ub2RlLW5hbWU9Iltbc2VsZWN0ZWROb2RlXV0iIG5vZGUtaW5jbHVkZT0iW1tzZWxlY3RlZE5vZGVJbmNsdWRlXV0iIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSI+CiAgICAgICAgPC90Zi1ub2RlLWluZm8+CiAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIG5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iPgogICAgICA8L3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGVhbHRoUGlsbHNBdmFpbGFibGUoZGVidWdnZXJEYXRhRW5hYmxlZCwgbm9kZU5hbWVzVG9IZWFsdGhQaWxscyldXSI+CiAgICAgIDx0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3toaWdobGlnaHRlZE5vZGV9fSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19Ij4KICAgICAgPC90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQ+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1ib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6Omhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAvZGVlcC8gLmNsb3NlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGxlZnQ6IDE1cHg7CiAgICAgICAgYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nIHsKICAgICAgICBjdXJzb3I6IHByb2dyZXNzOwogICAgICAgIG9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nLmVycm9yIHsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgIH0KCiAgICAgICNpbmZvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDVweDsKICAgICAgICB0b3A6IDVweDsKICAgICAgICBwYWRkaW5nOiAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAzODBweDsKICAgICAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgfQoKICAgICAgI21haW4gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNDBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLW1zZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXByb2dyZXNzIHsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IDZweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogI2YzOTEzZTsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgewogICAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIGxpIHsKICAgICAgICBwYWRkaW5nOiA0cHggMTZweDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc05vdENvbXBsZXRlKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtYmFyIj4KICAgICAgICA8ZGl2IGlkPSJwcm9ncmVzcy1tc2ciPltbcHJvZ3Jlc3MubXNnXV08L2Rpdj4KICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgdmFsdWU9IltbcHJvZ3Jlc3MudmFsdWVdXSI+PC9wYXBlci1wcm9ncmVzcz4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPGRpdiBjbGFzcyQ9IltbX2dldENvbnRhaW5lckNsYXNzKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0ibWFpbiI+CiAgICAgICAgPHRmLWdyYXBoIGlkPSJncmFwaCIgZ3JhcGgtaGllcmFyY2h5PSJ7e2dyYXBoSGllcmFyY2h5fX0iIGJhc2ljLWdyYXBoPSJbW2dyYXBoXV0iIGhpZXJhcmNoeS1wYXJhbXM9IltbaGllcmFyY2h5UGFyYW1zXV0iIHJlbmRlci1oaWVyYXJjaHk9Int7cmVuZGVySGllcmFyY2h5fX0iIGRldmljZXMtZm9yLXN0YXRzPSJbW2RldmljZXNGb3JTdGF0c11dIiBzdGF0cz0iW1tzdGF0c11dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBoaWdobGlnaHRlZC1ub2RlPSJ7e19oaWdobGlnaHRlZE5vZGV9fSIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBjb2xvci1ieS1wYXJhbXM9Int7Y29sb3JCeVBhcmFtc319IiBwcm9ncmVzcz0ie3twcm9ncmVzc319IiBlZGdlLWxhYmVsLWZ1bmN0aW9uPSJbW2VkZ2VMYWJlbEZ1bmN0aW9uXV0iIGVkZ2Utd2lkdGgtZnVuY3Rpb249IltbZWRnZVdpZHRoRnVuY3Rpb25dXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJbW2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIgaGFuZGxlLW5vZGUtc2VsZWN0ZWQ9IltbaGFuZGxlTm9kZVNlbGVjdGVkXV0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImluZm8iPgogICAgICAgIDx0Zi1ncmFwaC1pbmZvIGlkPSJncmFwaC1pbmZvIiB0aXRsZT0ic2VsZWN0ZWQiIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBncmFwaD0iW1tncmFwaF1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1ub2RlLWluY2x1ZGU9Int7X3NlbGVjdGVkTm9kZUluY2x1ZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgZGVidWdnZXItZGF0YS1lbmFibGVkPSJbW2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tkZWJ1Z2dlck51bWVyaWNBbGVydHNdXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IiBjb21wYXQtbm9kZS10aXRsZT0iW1tjb21wYXROb2RlVGl0bGVdXSIgb24tbm9kZS10b2dnbGUtaW5jbHVzaW9uPSJfb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZCIgb24tbm9kZS10b2dnbGUtc2VyaWVzZ3JvdXA9Il9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQiPjwvdGYtZ3JhcGgtaW5mbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJhZGlvLWJ1dHRvbiI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplLCAxNnB4KTsKICAgICAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlIGluIGBhdHRhY2hlZGAuICovCiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZTogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplLCAtMXB4KTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgI3JhZGlvQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tcmFkaW8tY29udGFpbmVyOwogICAgICB9CgogICAgICAjaW5rIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgI2lua1tjaGVja2VkXSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICAjb2ZmUmFkaW8sICNvblJhZGlvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtYmFja2dyb3VuZC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjI4czsKICAgICAgfQoKICAgICAgI29uUmFkaW8gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNvZmZSYWRpbyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNvblJhZGlvIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC41KTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsIHsKICAgICAgICBsaW5lLWhlaWdodDogbm9ybWFsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBtYXJnaW4tbGVmdDogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDEwcHgpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjcmFkaW9MYWJlbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLWNoZWNrZWQ7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsOmRpcihydGwpIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1zcGFjaW5nLCAxMHB4KTsKICAgICAgfQoKICAgICAgI3JhZGlvTGFiZWxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogZGlzYWJsZWQgc3RhdGUgKi8KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNvZmZSYWRpbyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNvblJhZGlvIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNyYWRpb0xhYmVsIHsKICAgICAgICAvKiBzbGlnaHRseSBkYXJrZXIgdGhhbiB0aGUgYnV0dG9uLCBzbyB0aGF0IGl0J3MgcmVhZGFibGUgKi8KICAgICAgICBvcGFjaXR5OiAwLjY1OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InJhZGlvQ29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ib2ZmUmFkaW8iPjwvZGl2PgogICAgICA8ZGl2IGlkPSJvblJhZGlvIj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InJhZGlvTGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJhZGlvLWdyb3VwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgcGFkZGluZzogdmFyKC0tcGFwZXItcmFkaW8tZ3JvdXAtaXRlbS1wYWRkaW5nLCAxMnB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9vbHRpcCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgei1pbmRleDogMTAwMjsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9vbHRpcC1iYWNrZ3JvdW5kLCAjNjE2MTYxKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbHRpcC10ZXh0LWNvbG9yLCB3aGl0ZSk7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2NhbGVVcCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjApOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTY2FsZURvd24gewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lRmFkZUluT3BhY2l0eSB7CiAgICAgICAgMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lRmFkZU91dE9wYWNpdHkgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNsaWRlRG93bkluIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgICAxMCUgewogICAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTbGlkZURvd25PdXQgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgICAgMTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmZhZGUtaW4tYW5pbWF0aW9uIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZUZhZGVJbk9wYWNpdHk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuZmFkZS1vdXQtYW5pbWF0aW9uIHsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVGYWRlT3V0T3BhY2l0eTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2NhbGUtdXAtYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTY2FsZVVwOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24taW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNjYWxlLWRvd24tYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2NhbGVEb3duOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zbGlkZS1kb3duLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNsaWRlRG93bkluOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNsaWRlLWRvd24tYW5pbWF0aW9uLW91dCB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2xpZGVEb3duT3V0OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5jYW5jZWwtYW5pbWF0aW9uIHsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IC0zMHMgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLyogVGhhbmtzIElFIDEwLiAqLwoKICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRvb2x0aXAiIGNsYXNzPSJoaWRkZW4iPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW5vZGUtc2VhcmNoIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJzZWFyY2gtY29udGFpbmVyIj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJydW5zLXJlZ2V4IiBsYWJlbD0iU2VhcmNoIG5vZGVzLiBSZWdleGVzIHN1cHBvcnRlZC4iIHZhbHVlPSJ7e19yYXdSZWdleElucHV0fX0iPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8ZGl2IGlkPSJzZWFyY2gtcmVzdWx0cy1hbmNob3IiPgogICAgICAgIDxkaXYgaWQ9InNlYXJjaC1yZXN1bHRzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3JlZ2V4TWF0Y2hlc11dIj4KICAgICAgICAgICAgPGRpdiBpZD0ic2VhcmNoLW1hdGNoIiBvbi1jbGljaz0iX21hdGNoQ2xpY2tlZCI+W1tpdGVtXV08L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzZWFyY2gtY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgI3J1bnMtcmVnZXggewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjc2VhcmNoLXJlc3VsdHMtYW5jaG9yIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtcmVzdWx0cyB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjc2VhcmNoLW1hdGNoIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlyZWN0aW9uOiBydGw7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtbWF0Y2g6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLW9yYW5nZS13ZWFrKTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1jb250cm9scyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgfQogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxNXB4OwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTVweDsKICAgICAgICAtLXByaW1hcnktdGV4dC1jb2xvcjogZ3JheTsKICAgICAgICAtLXBhcGVyLWl0ZW0tbWluLWhlaWdodDogMzBweDsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMgewogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5ydW4tZHJvcGRvd24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA4cHggMCA4cHggMTBweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5jb2xvci1kcm9wZG93biB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXI6IHsKICAgICAgICAgIHBhZGRpbmc6IDlweCAwIDAgMTNweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlIHsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiAwOwogICAgICB9CgogICAgICB0YWJsZSB0ZCB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyB7CiAgICAgICAgcGFkZGluZzogMCAyMHB4IDIwcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtaG9sZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgY29sb3I6ICM1NTU7CiAgICAgICAgcGFkZGluZzogMTVweCAyMHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAudG9nZ2xlLWxlZ2VuZC1idXR0b24gewogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGVnZW5kLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CiAgICAgIHN2Zy5pY29uLAogICAgICB0Zi1ncmFwaC1pY29uIHsKICAgICAgICB3aWR0aDogNjBweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmRvbWFpblZhbHVlcyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICB3aWR0aDogMTY1cHg7CiAgICAgIH0KICAgICAgLmRvbWFpblN0YXJ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAuZG9tYWluRW5kIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgLmNvbG9yQm94IHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLmltYWdlLWljb24gewogICAgICAgIHdpZHRoOiAyNHB4OwogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLmhlbHAtaWNvbiB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuZ3JheSB7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIG1hcmdpbjogOHB4IDVweCA4cHggMDsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgIH0KICAgICAgLnRpdGxlIHNtYWxsIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIC5kZXZpY2VMaXN0LAogICAgICAueGxhQ2x1c3Rlckxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNmaWxlIHsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgfQoKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CgogICAgICAuY29sb3ItbGVnZW5kLXJvdyAubGFiZWwsCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHN2ZywKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgZmxleDogMCAwIDQwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICB9CgogICAgICAuZGV2aWNlcy1jaGVja2JveCBpbnB1dCB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAuY29udHJvbC1ob2xkZXIgLmljb24tYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luOiAwIC01cHg7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CgogICAgICAuYnV0dG9uLXRleHQgewogICAgICAgIHBhZGRpbmctbGVmdDogMjBweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgLnVwbG9hZC1idXR0b24gewogICAgICAgIHdpZHRoOiAxNjVweDsKICAgICAgICBoZWlnaHQ6IDI1cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CgogICAgICAuYnV0dG9uLWljb24gewogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4taW5wdXQgewogICAgICAgIGhlaWdodDogMHB4OwogICAgICAgIHdpZHRoOiAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC5jb250cm9sLWhvbGRlciB7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAuY29udHJvbC1ob2xkZXIgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgc3Bhbi5jb3VudGVyIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgIH0KCiAgICAgIC5ydW5zIHBhcGVyLWl0ZW0gewogICAgICAgIC0tcGFwZXItaXRlbTogewogICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgfQoKICAgICAgdGFibGUudGYtZ3JhcGgtY29udHJvbHMgdGQuaW5wdXQtZWxlbWVudC10YWJsZS1kYXRhIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICAuc3BhY2VyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIC5jb2xvci10ZXh0IHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAvKiogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyB0aGF0IHN1cHByZXNzIHBvaW50ZXIgZXZlbnRzIGZvciBkaXNhYmxlZCBidXR0b25zLiBPdGhlcndpc2UsIHRoZSAqLwogICAgICAvKiAgdG9vbHRpcHMgZG8gbm90IGFwcGVhci4gKi8KICAgICAgcGFwZXItcmFkaW8tZ3JvdXAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0byAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubGVnZW5kLWNsYXJpZmllciB7CiAgICAgICAgY29sb3I6ICMyNjYyMzY7CiAgICAgICAgY3Vyc29yOiBoZWxwOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1jbGFyaWZpZXIgcGFwZXItdG9vbHRpcCB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICB9CgogICAgICAvKiogT3RoZXJ3aXNlLCBwb2x5bWVyIFVJIGNvbnRyb2xzIGFwcGVhciBhdG9wIG5vZGUgc2VhcmNoLiAqLwogICAgICB0Zi1ncmFwaC1ub2RlLXNlYXJjaCB7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImFsbGNvbnRyb2xzIj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDx0Zi1ncmFwaC1ub2RlLXNlYXJjaCBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIj48L3RmLWdyYXBoLW5vZGUtc2VhcmNoPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9Imljb24tYnV0dG9uIiBvbi10YXA9Il9maXQiIGFsdD0iRml0IHRvIHNjcmVlbiI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImFzcGVjdC1yYXRpbyIgY2xhc3M9ImJ1dHRvbi1pY29uIj48L2lyb24taWNvbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24tdGV4dCI+Rml0IHRvIFNjcmVlbjwvc3Bhbj4KICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpY29uLWJ1dHRvbiIgb24tY2xpY2s9ImRvd25sb2FkIiBhbHQ9IkRvd25sb2FkIFBORyI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImZpbGUtZG93bmxvYWQiIGNsYXNzPSJidXR0b24taWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXRleHQiPkRvd25sb2FkIFBORzwvc3Bhbj4KICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICA8YSBocmVmPSIjIiBpZD0iZ3JhcGhkb3dubG9hZCIgY2xhc3M9InRpdGxlIiBkb3dubG9hZD0iZ3JhcGgucG5nIj48L2E+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciBydW5zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+CiAgICAgICAgICBSdW4gPHNwYW4gY2xhc3M9ImNvdW50ZXIiPihbW2RhdGFzZXRzLmxlbmd0aF1dKTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIG5vaW5rIGhvcml6b250YWwtYWxpZ249ImxlZnQiIGNsYXNzPSJydW4tZHJvcGRvd24iPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFJ1bkluZGV4fX0iIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2RhdGFzZXRzXV0iPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbaXRlbS5uYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dTZXNzaW9uUnVuc0Ryb3Bkb3duXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgVGFnCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudGVyIj4oW1tfbnVtVGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0pPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIGhvcml6b250YWwtYWxpZ249ImxlZnQiIG5vaW5rIGNsYXNzPSJydW4tZHJvcGRvd24iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVGFnSW5kZXh9fSIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZ2V0VGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtLmRpc3BsYXlOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd1VwbG9hZEJ1dHRvbl1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+VXBsb2FkPC9kaXY+CiAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idXBsb2FkLWJ1dHRvbiIgb24tY2xpY2s9Il9nZXRGaWxlIiB0aXRsZT0iVXBsb2FkIGEgZ3JhcGggcGJ0eHQgZmlsZSB0byB2aWV3IHRoZSBncmFwaCI+CiAgICAgICAgICAgIENob29zZSBGaWxlCiAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhpZGRlbi1pbnB1dCI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iZmlsZSIgbmFtZT0iZmlsZSIgb24tY2hhbmdlPSJfdXBkYXRlRmlsZUlucHV0IiBhY2NlcHQ9Ii5wYnR4dCI+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRHcmFwaFR5cGV9fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0ib3BfZ3JhcGgiIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25PcEdyYXBoRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSI+R3JhcGg8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY29uY2VwdHVhbF9ncmFwaCIgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvbkNvbmNlcHR1YWxHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iPkNvbmNlcHR1YWwgR3JhcGg8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0icHJvZmlsZSIgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvblByb2ZpbGVEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIj5Qcm9maWxlPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3t0cmFjZUlucHV0c319IiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICBUcmFjZSBpbnB1dHMKICAgICAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWFsdGhQaWxsc0ZlYXR1cmVFbmFibGVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGNoZWNrZWQ9Int7aGVhbHRoUGlsbHNUb2dnbGVkT259fSIgY2xhc3M9InRpdGxlIj5TaG93IGhlYWx0aCBwaWxsczwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5Db2xvcjwvZGl2PgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ie3tjb2xvckJ5fX0iPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJzdHJ1Y3R1cmUiPlN0cnVjdHVyZTwvcGFwZXItcmFkaW8tYnV0dG9uPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZGV2aWNlIj5EZXZpY2U8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ4bGEtY2x1c3Rlci1yYWRpby1idXR0b24iIG5hbWU9InhsYV9jbHVzdGVyIiBkaXNhYmxlZD0iW1shX3hsYUNsdXN0ZXJzUHJvdmlkZWQocmVuZGVySGllcmFyY2h5KV1dIj4KICAgICAgICAgICAgWExBIENsdXN0ZXIKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InhsYS1jbHVzdGVyLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSBYTEEgY2x1c3RlciBpcyBvbmx5IGVuYWJsZWQgaWYgYXQgbGVhc3QgMSBvcCBzcGVjaWZpZXMKICAgICAgICAgICAgYW4gWExBIGNsdXN0ZXIuCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIgbmFtZT0iY29tcHV0ZV90aW1lIiBkaXNhYmxlZD0iW1shc3RhdHNdXSI+CiAgICAgICAgICAgIENvbXB1dGUgdGltZQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSBjb21wdXRlIHRpbWUgaXMgb25seSBlbmFibGVkIGlmIHRoZSBSdW5NZXRhZGF0YSBwcm90byBpcwogICAgICAgICAgICBwYXNzZWQgdG8gdGhlIEZpbGVXcml0ZXIgd2hlbiBhIHNwZWNpZmljIHNlc3Npb24gaXMgcnVuLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im1lbW9yeS1yYWRpby1idXR0b24iIG5hbWU9Im1lbW9yeSIgZGlzYWJsZWQ9IltbIXN0YXRzXV0iPgogICAgICAgICAgICBNZW1vcnkKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9Im1lbW9yeS1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgbWVtb3J5IGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgUnVuTWV0YWRhdGEgcHJvdG8gaXMKICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBGaWxlV3JpdGVyIHdoZW4gYSBzcGVjaWZpYyBzZXNzaW9uIGlzIHJ1bi4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iIG5hbWU9Im9wX2NvbXBhdGliaWxpdHkiPgogICAgICAgICAgICBUUFUgQ29tcGF0aWJpbGl0eQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0idHB1LWNvbXBhdGliaWxpdHktcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IHdoZXRoZXIgYW4gb3BlcmF0aW9uIGlzIGNvbXBhdGlibGUgZm9yIHRoZSBUUFUgZGV2aWNlLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgPHNwYW4gY2xhc3M9InNwYWNlciI+PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzR3JhZGllbnRDb2xvcmluZyhzdGF0cywgY29sb3JCeSldXSI+CiAgICAgICAgICA8c3ZnIHdpZHRoPSIxNDAiIGhlaWdodD0iMjAiIHN0eWxlPSJtYXJnaW46IDAgNXB4IiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgIDxsaW5lYXJncmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMTAwJSIgeTI9IjAlIj4KICAgICAgICAgICAgICAgIDxzdG9wIGNsYXNzPSJzdGFydCIgb2Zmc2V0PSIwJSIgc3RvcC1jb2xvciQ9IltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5zdGFydENvbG9yXV0iIC8+CiAgICAgICAgICAgICAgICA8c3RvcCBjbGFzcz0iZW5kIiBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3IkPSJbW19jdXJyZW50R3JhZGllbnRQYXJhbXMuZW5kQ29sb3JdXSIgLz4KICAgICAgICAgICAgICA8L2xpbmVhcmdyYWRpZW50PgogICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMzUiIGhlaWdodD0iMjAiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQpIiBzdHJva2U9ImJsYWNrIiAvPgogICAgICAgICAgPC9zdmc+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5WYWx1ZXMgY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpblN0YXJ0Ij5bW19jdXJyZW50R3JhZGllbnRQYXJhbXMubWluVmFsdWVdXTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5FbmQiPltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5tYXhWYWx1ZV1dPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxiciBzdHlsZT0iY2xlYXI6IGJvdGgiPgogICAgICAgICAgPGRpdj5EZXZpY2VzIGluY2x1ZGVkIGluIHN0YXRzOjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGV2aWNlTGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnREZXZpY2VzXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3cgZGV2aWNlcy1jaGVja2JveCI+CiAgICAgICAgICAgICAgICA8c3Bhbj48aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlJD0iW1tpdGVtLmRldmljZV1dIiBjaGVja2VkJD0iW1tpdGVtLnVzZWRdXSIgb24tY2xpY2s9Il9kZXZpY2VDaGVja2JveENsaWNrZWQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuPltbaXRlbS5zdWZmaXhdXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpdGVtLmlnbm9yZWRNc2ddXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJoZWxwIiBjbGFzcz0iaGVscC1pY29uIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCIgYW5pbWF0aW9uLWRlbGF5PSIwIj5bW2l0ZW0uaWdub3JlZE1zZ11dPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ3N0cnVjdHVyZScpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCI+CiAgICAgICAgICAgICAgICBjb2xvcnMKICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+c2FtZSBzdWJzdHJ1Y3R1cmU8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZWVlIiBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmlxdWUgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ2RldmljZScpXV0iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudERldmljZVBhcmFtc11dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IltbaXRlbS5jb2xvcl1dIiBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPltbaXRlbS5kZXZpY2VdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2VlZSIgc3Ryb2tlLW92ZXJyaWRlPSIjYTZhNmE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBkZXZpY2U8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAneGxhX2NsdXN0ZXInKV1dIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnRYbGFDbHVzdGVyUGFyYW1zXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI3VuZmlsbGVkLXJlY3QiIHg9IjAiIHk9IjAiIHN0eWxlPSJmaWxsOltbaXRlbS5jb2xvcl1dIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5bW2l0ZW0ueGxhX2NsdXN0ZXJdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgIDx1c2UgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhsaW5rOmhyZWY9IiNncmV5LXJlY3QiIHg9IjAiIHk9IjAiIC8+CiAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBYTEEgY2x1c3Rlcjwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdvcF9jb21wYXRpYmlsaXR5JyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci10ZXh0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iT1AiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiMwZjlkNTgiIHN0cm9rZS1vdmVycmlkZT0iI2NjYyI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPlZhbGlkIE9wPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iT1AiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiNkYjQ0MzciIHN0cm9rZS1vdmVycmlkZT0iI2NjYyI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPkludmFsaWQgT3A8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N0YXRzTm90TnVsbChzdGF0cyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmFkZWQ+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bnVzZWQgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1ob2xkZXIiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlTGVnZW5kSWNvbihfbGVnZW5kT3BlbmVkKV1dIiBvbi1jbGljaz0iX3RvZ2dsZUxlZ2VuZE9wZW4iIGNsYXNzPSJ0b2dnbGUtbGVnZW5kLWJ1dHRvbiI+CiAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJ0b2dnbGUtbGVnZW5kLXRleHQiPgogICAgICAgIFtbX2dldFRvZ2dsZVRleHQoX2xlZ2VuZE9wZW5lZCldXQogICAgICA8L3NwYW4+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbGVnZW5kT3BlbmVkXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz0idGl0bGUiPkdyYXBoPC9kaXY+PC90ZD4KICAgICAgICAgICAgICA8dGQ+KCogPSBleHBhbmRhYmxlKTwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZDlkOWQ5IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIE5hbWVzcGFjZTxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVuY2Fwc3VsYXRlcyBhIHNldCBvZiBub2Rlcy4gTmFtZXNwYWNlIGlzIGhpZXJhcmNoaWNhbCBhbmQKICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBzY29wZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBPcE5vZGUKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgcGVyZm9ybXMgYW4gb3BlcmF0aW9uLiBUaGVzZSBub2RlcyBjYW5ub3QgZXhwYW5kLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iU0VSSUVTIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBVbmNvbm5lY3RlZCBzZXJpZXM8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBvZiBudW1iZXJlZCBub2RlcyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIGVhY2gKICAgICAgICAgICAgICAgICAgICBvdGhlci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNFUklFUyIgaGVpZ2h0PSIxNiIgdmVydGljYWw+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgQ29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG9mIG51bWJlcmVkIG5vZGVzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iaWNvbiI+CiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzg0ODQ4NCIgY3g9IjEwIiBjeT0iMTAiIHI9IjUiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIENvbnN0YW50CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IG91dHB1dHMgYSBjb25zdGFudCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNVTU1BUlkiIGhlaWdodD0iMjAiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFN1bW1hcnkKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgY29sbGVjdHMgZGF0YSBmb3IgdmlzdWFsaXphdGlvbiB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZC4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLWxlZ2VuZCIgZmlsbD0iI2JiYiIgbWFya2Vyd2lkdGg9IjEwIiBtYXJrZXJoZWlnaHQ9IjEwIiByZWZ4PSI5IiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+CiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgPHBhdGggbWFya2VyLWVuZD0idXJsKCNkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kKSIgc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBEYXRhZmxvdyBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoZSBkYXRhIGZsb3cgYmV0d2VlbiBvcGVyYXRpb25zLiBFZGdlcyBmbG93CiAgICAgICAgICAgICAgICAgICAgdXB3YXJkcyB1bmxlc3MgYXJyb3doZWFkcyBzcGVjaWZ5IG90aGVyd2lzZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtZGFzaGFycmF5PSIyLCAyIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY3kgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGUgY29udHJvbCBkZXBlbmRlbmN5IGJldHdlZW4gb3BlcmF0aW9ucy4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQiIGZpbGw9IiNGRkI3NEQiIG1hcmtlcndpZHRoPSIxMCIgbWFya2VyaGVpZ2h0PSIxMCIgcmVmeD0iOSIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIiAvPgogICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICAgIDxwYXRoIG1hcmtlci1lbmQ9InVybCgjcmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQpIiBzdHJva2U9IiNGRkI3NEQiIGQ9Ik0yIDkgbCAyOSAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFJlZmVyZW5jZSBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoYXQgdGhlIG91dGdvaW5nIG9wZXJhdGlvbiBub2RlIGNhbiBtdXRhdGUgdGhlCiAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgdGVuc29yLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJlcnJvci1kaWFsb2ciIHdpdGgtYmFja2Ryb3A+PC9wYXBlci1kaWFsb2c+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFzZXRzU3RhdGUoX2RhdGFzZXRzRmV0Y2hlZCwgX2RhdGFzZXRzLCAnRU1QVFknKV1dIj4KICAgICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA1NDBweDsgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOyI+CiAgICAgICAgPGgzPk5vIGdyYXBoIGRlZmluaXRpb24gZmlsZXMgd2VyZSBmb3VuZC48L2gzPgogICAgICAgIDxwPgogICAgICAgICAgVG8gc3RvcmUgYSBncmFwaCwgY3JlYXRlIGEKICAgICAgICAgIDxjb2RlPnRmLnN1bW1hcnkuRmlsZVdyaXRlcjwvY29kZT4KICAgICAgICAgIGFuZCBwYXNzIHRoZSBncmFwaCBlaXRoZXIgdmlhIHRoZSBjb25zdHJ1Y3Rvciwgb3IgYnkgY2FsbGluZyBpdHMKICAgICAgICAgIDxjb2RlPmFkZF9ncmFwaCgpPC9jb2RlPiBtZXRob2QuIFlvdSBtYXkgd2FudCB0byBjaGVjayBvdXQgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9ncmFwaF92aXoiPmdyYXBoIHZpc3VhbGl6ZXIgdHV0b3JpYWw8L2E+LgogICAgICAgIAoKICAgICAgICA8cD4KICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvIGFkZAogICAgICAgICAgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgCgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAKICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhc2V0c1N0YXRlKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgJ1BSRVNFTlQnKV1dIj4KICAgICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgICAgPHRmLWdyYXBoLWNvbnRyb2xzIGlkPSJjb250cm9scyIgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiIGRldmljZXMtZm9yLXN0YXRzPSJ7e19kZXZpY2VzRm9yU3RhdHN9fSIgY29sb3ItYnktcGFyYW1zPSJbW19jb2xvckJ5UGFyYW1zXV0iIHN0YXRzPSJbW19zdGF0c11dIiBjb2xvci1ieT0ie3tfY29sb3JCeX19IiBkYXRhc2V0cz0iW1tfZGF0YXNldHNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tfcmVuZGVySGllcmFyY2h5XV0iIHNlbGVjdGlvbj0ie3tfc2VsZWN0aW9ufX0iIHNlbGVjdGVkLWZpbGU9Int7X3NlbGVjdGVkRmlsZX19IiBzZWxlY3RlZC1ub2RlPSJ7e19zZWxlY3RlZE5vZGV9fSIgaGVhbHRoLXBpbGxzLWZlYXR1cmUtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIiBoZWFsdGgtcGlsbHMtdG9nZ2xlZC1vbj0ie3toZWFsdGhQaWxsc1RvZ2dsZWRPbn19IiBvbi1maXQtdGFwPSJfZml0IiB0cmFjZS1pbnB1dHM9Int7X3RyYWNlSW5wdXRzfX0iPjwvdGYtZ3JhcGgtY29udHJvbHM+CiAgICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgICAgPHRmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIgaWQ9ImxvYWRlciIgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iIHNlbGVjdGlvbj0iW1tfc2VsZWN0aW9uXV0iIHNlbGVjdGVkLWZpbGU9IltbX3NlbGVjdGVkRmlsZV1dIiBvdXQtZ3JhcGgtaGllcmFyY2h5PSJ7e19ncmFwaEhpZXJhcmNoeX19IiBvdXQtZ3JhcGg9Int7X2dyYXBofX0iIG91dC1zdGF0cz0ie3tfc3RhdHN9fSIgcHJvZ3Jlc3M9Int7X3Byb2dyZXNzfX0iIGhpZXJhcmNoeS1wYXJhbXM9IltbX2hpZXJhcmNoeVBhcmFtc11dIiBjb21wYXRpYmlsaXR5LXByb3ZpZGVyPSJbW19jb21wYXRpYmlsaXR5UHJvdmlkZXJdXSI+PC90Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyPgogICAgICAgICAgPHRmLWdyYXBoLWJvYXJkIGlkPSJncmFwaGJvYXJkIiBkZXZpY2VzLWZvci1zdGF0cz0iW1tfZGV2aWNlc0ZvclN0YXRzXV0iIGNvbG9yLWJ5PSJbW19jb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0ie3tfY29sb3JCeVBhcmFtc319IiBncmFwaC1oaWVyYXJjaHk9IltbX2dyYXBoSGllcmFyY2h5XV0iIGdyYXBoPSJbW19ncmFwaF1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIgcHJvZ3Jlc3M9IltbX3Byb2dyZXNzXV0iIGRlYnVnZ2VyLWRhdGEtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIiBhcmUtaGVhbHRoLXBpbGxzLWxvYWRpbmc9IltbX2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tfZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW19ub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iIGFsbC1zdGVwcy1tb2RlLWVuYWJsZWQ9Int7YWxsU3RlcHNNb2RlRW5hYmxlZH19IiBzcGVjaWZpYy1oZWFsdGgtcGlsbC1zdGVwPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0iW1tfaGVhbHRoUGlsbFN0ZXBJbmRleF1dIiByZW5kZXItaGllcmFyY2h5PSJ7e19yZW5kZXJIaWVyYXJjaHl9fSIgc2VsZWN0ZWQtbm9kZT0ie3tfc2VsZWN0ZWROb2RlfX0iIHN0YXRzPSJbW19zdGF0c11dIiB0cmFjZS1pbnB1dHM9IltbX3RyYWNlSW5wdXRzXV0iPjwvdGYtZ3JhcGgtYm9hcmQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC9kZWVwLyB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRpYWxvZyB7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1kaXN0cmlidXRpb24tY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBydW49IltbcnVuXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICAKICAgIDx2ei1kaXN0cmlidXRpb24tY2hhcnQgaWQ9ImNoYXJ0IiB4LXR5cGU9IltbeFR5cGVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSI+PC92ei1kaXN0cmlidXRpb24tY2hhcnQ+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIGhlaWdodDogMjM1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogNzAwcHg7CiAgICAgICAgaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgewogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9InhUeXBlU2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGRpc3RyaWJ1dGlvbiBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgICAoSGlzdG9ncmFtcyBhbmQgZGlzdHJpYnV0aW9ucyBib3RoIHVzZSB0aGUgaGlzdG9ncmFtIHN1bW1hcnkKICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4pCiAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtZGlzdHJpYnV0aW9uLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1oaXN0b2dyYW0tdGltZXNlcmllcyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0idG9vbHRpcCI+PHNwYW4+PC9zcGFuPjwvZGl2PgogICAgPHN2ZyBpZD0ic3ZnIj4KICAgICAgPGc+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeCI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHkiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB5IHNsaWNlIj48L2c+CiAgICAgICAgPGcgY2xhc3M9InN0YWdlIj4KICAgICAgICAgIDxyZWN0IGNsYXNzPSJiYWNrZ3JvdW5kIj48L3JlY3Q+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGNsYXNzPSJ4LWF4aXMtaG92ZXIiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ieS1heGlzLWhvdmVyIj48L2c+CiAgICAgICAgPGcgY2xhc3M9Inktc2xpY2UtYXhpcy1ob3ZlciI+PC9nPgogICAgICA8L2c+CiAgICA8L3N2Zz4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgc3ZnIHsKICAgICAgICBmb250LWZhbWlseTogcm9ib3RvLCBzYW5zLXNlcmlmOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmJhY2tncm91bmQgewogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBmaWxsOiByZWQ7CiAgICAgIH0KCiAgICAgIC5oaXN0b2dyYW0gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuaG92ZXIgewogICAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgICAgIGRvbWluYW50LWJhc2VsaW5lOiBtaWRkbGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyIGNpcmNsZSB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICB9CgogICAgICAuaG92ZXIgdGV4dCB7CiAgICAgICAgZmlsbDogYmxhY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgY2lyY2xlIHsKICAgICAgICBmaWxsOiBibGFjayAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaG92ZXIuaG92ZXItY2xvc2VzdCB0ZXh0IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuYmFzZWxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLm91dGxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAub3V0bGluZS5vdXRsaW5lLWhvdmVyIHsKICAgICAgICBzdHJva2U6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIsCiAgICAgIC55LWF4aXMtaG92ZXIsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIC5sYWJlbCwKICAgICAgLnktYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgLmxhYmVsIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LWFuY2hvcjogZW5kOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHRleHQgewogICAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC55LWF4aXMtaG92ZXIgdGV4dCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktYXhpcy1ob3ZlciBsaW5lLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIGxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktYXhpcy1ob3ZlciByZWN0LAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIHJlY3QgewogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICB9CgogICAgICAuYXhpcyB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICB9CgogICAgICAuYXhpcyBwYXRoLmRvbWFpbiB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgfQoKICAgICAgLmF4aXMgLnRpY2sgbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjZGRkOwogICAgICB9CgogICAgICAuYXhpcy5zbGljZSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmF4aXMuc2xpY2UgLnRpY2sgbGluZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMjsKICAgICAgfQoKICAgICAgLnNtYWxsIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnNtYWxsIC5heGlzIC50aWNrOmZpcnN0LW9mLXR5cGUgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnNtYWxsIC5heGlzIC50aWNrOmxhc3Qtb2YtdHlwZSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAubWVkaXVtIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm1lZGl1bSAuYXhpcyAudGljazpudGgtY2hpbGQoMm4gKyAxKSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAubGFyZ2UgLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAubGFyZ2UgLmF4aXMgLnRpY2s6bnRoLWNoaWxkKDJuICsgMSkgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1oaXN0b2dyYW0tbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgCiAgICA8dnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgaWQ9ImNoYXJ0IiB0aW1lLXByb3BlcnR5PSJbW3RpbWVQcm9wZXJ0eV1dIiBtb2RlPSJbW2hpc3RvZ3JhbU1vZGVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVGdW5jdGlvbl1dIj48L3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzPgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDkwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0iaGlzdG9ncmFtTW9kZVNlbGVjdG9yIiBuYW1lPSJIaXN0b2dyYW0gbW9kZSIgc2VsZWN0ZWQtaWQ9Int7X2hpc3RvZ3JhbU1vZGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im92ZXJsYXkiPm92ZXJsYXk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ib2Zmc2V0Ij5vZmZzZXQ8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lUHJvcGVydHlTZWxlY3RvciIgbmFtZT0iT2Zmc2V0IHRpbWUgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3RpbWVQcm9wZXJ0eX19Ij4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGhpc3RvZ3JhbSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1oaXN0b2dyYW0tbG9hZGVyIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIgdGltZS1wcm9wZXJ0eT0iW1tfdGltZVByb3BlcnR5XV0iIGhpc3RvZ3JhbS1tb2RlPSJbW19oaXN0b2dyYW1Nb2RlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi1oaXN0b2dyYW0tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRleHQtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHJ1bj0iW1tydW5dXSIgdGFnPSJbW3RhZ11dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGlkPSJzdGVwcy1jb250YWluZXIiIGNsYXNzPSJjb250YWluZXIgc2Nyb2xsYmFyIiBzdHlsZT0iYm9yZGVyLWNvbG9yOiBbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdGV4dHNdXSI+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InN0ZXAtY29udGFpbmVyIj4KICAgICAgICAgIHN0ZXAgPHNwYW4gY2xhc3M9InN0ZXAtdmFsdWUiPltbX2Zvcm1hdFN0ZXAoaXRlbS5zdGVwKV1dPC9zcGFuPgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InRleHQiPgogICAgICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tpdGVtLnRleHRdXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgPHN0eWxlIGluY2x1ZGU9InNjcm9sbGJhci1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLnNjcm9sbGJhciB7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgICAjc3RlcHMtY29udGFpbmVyIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgLyogY29sb3IgY29tcHV0ZWQgYW5kIHNldCBhcyBpbmxpbmUgc3R5bGUgKi87CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQogICAgICAudGV4dCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAzcHggM3B4IDNweDsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgICAgfQogICAgICAuc3RlcC1jb250YWluZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4OyAvKiB0byBjb3JyZWN0IGZvciBib3JkZXIgKi8KICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgIH0KICAgICAgLnN0ZXAtY29udGFpbmVyOm5vdCg6Zmlyc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGV4dC1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHRleHQgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgdGV4dCBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi10ZXh0LWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBydW49IltbaXRlbS5ydW5dXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLXRleHQtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSI+PC90Zi1jYXJkLWhlYWRpbmc+CgogICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1tfeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW195VmFsdWVBY2Nlc3Nvcl1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlRnVuY3Rpb25dXSIgZGVmYXVsdC14LXJhbmdlPSJbW19kZWZhdWx0WFJhbmdlXV0iIGRlZmF1bHQteS1yYW5nZT0iW1tfZGVmYXVsdFlSYW5nZV1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIgZGF0YS1zZXJpZXM9IltbcnVuc11dIiBsb2FkLWtleT0iW1t0YWddXSIgZ2V0LWRhdGEtbG9hZC11cmw9IltbX2RhdGFVcmxdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCldXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIj48L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CgogICAgPGRpdiBpZD0iYnV0dG9ucy1yb3ciPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IlJlc2V0IGF4ZXMgdG8gWzAsIDFdLiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InN0ZXAtbGVnZW5kIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTdGVwQXZhaWxhYmxlXV0iIGFzPSJydW4iPgogICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItYm94IiBzdHlsZT0iYmFja2dyb3VuZDogW1tfY29tcHV0ZVJ1bkNvbG9yKHJ1bildXTsiPjwvZGl2PgogICAgICAgICAgW1tydW5dXSBpcyBhdAogICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtbGFiZWwtdGV4dCI+CiAgICAgICAgICAgIHN0ZXAgW1tfY29tcHV0ZUN1cnJlbnRTdGVwRm9yUnVuKF9ydW5Ub1ByQ3VydmVFbnRyeSwgcnVuKV1dIDwvc3Bhbj48YnI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0id2FsbC10aW1lLWxhYmVsLXRleHQiPgogICAgICAgICAgICAoW1tfY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bihfcnVuVG9QckN1cnZlRW50cnksIHJ1bildXSkKICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICB0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiA2MDBweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgICNzdGVwLWxlZ2VuZCB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAubGVnZW5kLXJvdyB7CiAgICAgICAgbWFyZ2luOiA1cHggMCA1cHggMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuY29sb3ItYm94IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMXB4OwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgfQogICAgICAuc3RlcC1sYWJlbC10ZXh0IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAud2FsbC10aW1lLWxhYmVsLXRleHQgewogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTbGlkZXJzXV0iIGFzPSJydW4iPgogICAgICA8ZGl2IGNsYXNzPSJydW4td2lkZ2V0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJydW4tZGlzcGxheS1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0icnVuLWNvbG9yLWJveCIgc3R5bGU9ImJhY2tncm91bmQ6W1tfY29tcHV0ZUNvbG9yRm9yUnVuKHJ1bildXTsiPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icnVuLXRleHQiPgogICAgICAgICAgICBbW3J1bl1dCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwLWRpc3BsYXktY29udGFpbmVyIj4KICAgICAgICAgIFtbX2NvbXB1dGVUaW1lVGV4dEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBfcnVuVG9TdGVwSW5kZXgsCiAgICAgICAgICBydW4sIHRpbWVEaXNwbGF5VHlwZSldXQogICAgICAgIDwvZGl2PgogICAgICAgIDxwYXBlci1zbGlkZXIgZGF0YS1ydW4kPSJbW3J1bl1dIiBzdGVwPSIxIiB0eXBlPSJudW1iZXIiIG1pbj0iMCIgbWF4PSJbW19jb21wdXRlTWF4U3RlcEluZGV4Rm9yUnVuKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIHJ1bildXSIgdmFsdWU9IltbX2dldFN0ZXAoX3J1blRvU3RlcEluZGV4LCBydW4pXV0iIG9uLWltbWVkaWF0ZS12YWx1ZS1jaGFuZ2VkPSJfc2xpZGVyVmFsdWVDaGFuZ2VkIj48L3BhcGVyLXNsaWRlcj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAucnVuLXdpZGdldCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICB9CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgbWFyZ2luOiAtOHB4IDAgMCAtMTVweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc3RlcC1kaXNwbGF5LWNvbnRhaW5lciB7CiAgICAgICAgZm9udC1zaXplOiAwLjllbTsKICAgICAgICBtYXJnaW46IDAgMTVweCAwIDA7CiAgICAgIH0KICAgICAgLnJ1bi10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgLnJ1bi1jb2xvci1ib3ggewogICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgIGhlaWdodDogMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lLXR5cGUtc2VsZWN0b3IiIG5hbWU9IlRpbWUgRGlzcGxheSBUeXBlIiBzZWxlY3RlZC1pZD0ie3tfdGltZURpc3BsYXlUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXNdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iIGlkPSJzdGVwcy1zZWxlY3Rvci1jb250YWluZXIiPgogICAgICAgICAgICA8dGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IgcnVucz0iW1tfcmVsZXZhbnRTZWxlY3RlZFJ1bnNdXSIgcnVuLXRvLXN0ZXA9Int7X3J1blRvU3RlcH19IiBydW4tdG8tYXZhaWxhYmxlLXRpbWUtZW50cmllcz0iW1tfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllc11dIiB0aW1lLWRpc3BsYXktdHlwZT0iW1tfdGltZURpc3BsYXlUeXBlXV0iPjwvdGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gcHJlY2lzaW9u4oCTcmVjYWxsIGN1cnZlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcHJlY2lzaW9u4oCTcmVjYWxsIGRhdGEgdG8geW91ciBldmVudAogICAgICAgICAgICAgICAgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIiBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtcHItY3VydmUtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bnM9IltbaXRlbS5ydW5zXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVucywgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVuLXRvLXN0ZXAtY2FwPSJbW19ydW5Ub1N0ZXBdXSI+PC90Zi1wci1jdXJ2ZS1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIC8qKiBEbyBub3QgbGV0IHRoZSBzdGVwcyBzZWxlY3RvciBvY2NsdWRlIHRoZSBydW4gc2VsZWN0b3IuICovCiAgICAgICNzdGVwcy1zZWxlY3Rvci1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByb2ZpbGUtcmVkaXJlY3QtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgPGgzPlRoZSBwcm9maWxlIHBsdWdpbiBoYXMgbW92ZWQuPC9oMz4KICAgICAgPHA+CiAgICAgICAgUGxlYXNlIGluc3RhbGwgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBwcm9maWxlIHBsdWdpbiBmcm9tIFB5UEkgYnkKICAgICAgICBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmcm9tIHRoZSBtYWNoaW5lIHJ1bm5pbmcgVGVuc29yQm9hcmQ6CiAgICAgIAogICAgICA8dGV4dGFyZWEgaWQ9ImNvbW1hbmRUZXh0YXJlYSIgcmVhZG9ubHkgcm93cz0iMSIgb24tYmx1cj0iX3JlbW92ZUNvcGllZE1lc3NhZ2UiPgpbW19pbnN0YWxsQ29tbWFuZF1dPC90ZXh0YXJlYT4KICAgICAgPGRpdiBpZD0iY29weUNvbnRhaW5lciI+CiAgICAgICAgPHNwYW4gaWQ9ImNvcGllZE1lc3NhZ2UiPjwvc3Bhbj4KICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBvbi10YXA9Il9jb3B5SW5zdGFsbENvbW1hbmQiPkNvcHkgdG8gY2xpcGJvYXJkPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICAubWVzc2FnZSB7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgIH0KICAgICAgI2NvbW1hbmRUZXh0YXJlYSB7CiAgICAgICAgbWFyZ2luLXRvcDogMWV4OwogICAgICAgIHBhZGRpbmc6IDFleCAxZW07CiAgICAgICAgcmVzaXplOiB2ZXJ0aWNhbDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAjY29weUNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAjY29waWVkTWVzc2FnZSB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcGx1Z2luLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX29wZW5dXSI+CiAgICAgIDxkaXYgaWQ9ImRhc2hib2FyZC1iYWNrZHJvcCI+PC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZGlhbG9nIiBtb2RhbCBvcGVuZWQ9Int7X29wZW59fSIgd2l0aC1iYWNrZHJvcD0iW1tfdXNlTmF0aXZlQmFja2Ryb3BdXSI+CiAgICAgIDxoMiBpZD0iZGlhbG9nLXRpdGxlIj5bW190aXRsZV1dPC9oMj4KICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLW1lc3NhZ2UiPltbX2N1c3RvbU1lc3NhZ2VdXTwvZGl2PgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8c3R5bGU+CiAgICAgIC8qKiBXZSByZWx5IG9uIGEgc2VwYXJhdGUgYF9oaWRkZW5gIHByb3BlcnR5IGluc3RlYWQgb2YgZGlyZWN0bHkgbWFraW5nIHVzZQogICAgICAgICAgb2YgdGhlIGBfb3BlbmAgYXR0cmlidXRlIGJlY2F1c2UgdGhpcyBDU1Mgc3BlY2lmaWNhdGlvbiBtYXkgc3RyYW5nZWx5CiAgICAgICAgICBhZmZlY3Qgb3RoZXIgZWxlbWVudHMgdGhyb3VnaG91dCBUZW5zb3JCb2FyZC4gU2VlICM4OTkuICovCiAgICAgICNkYXNoYm9hcmQtYmFja2Ryb3AgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNkaWFsb2ctdGl0bGUgewogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY3VzdG9tLW1lc3NhZ2UgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWJlaG9sZGVyLXZpZGVvIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8aW1nIGlkPSJ2aWRlbyIgc3JjJD0iW1tfaW1hZ2VVUkxdXSI+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIGltZyB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtYmVob2xkZXItaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaXRlbXNdXSI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24taW5mbyIgc3R5bGUkPSJoZWlnaHQ6IFtbaXRlbS5oZWlnaHRdXXB4Ij4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+W1tpdGVtLm5hbWVdXTwvbGk+CiAgICAgICAgICA8bGk+c2hhcGU6IFtbaXRlbS5zaGFwZV1dPC9saT4KICAgICAgICAgIDxsaT5yYW5nZTogWyBbW2l0ZW0ubWluXV0sIFtbaXRlbS5tYXhdXSBdPC9saT4KICAgICAgICAgIDxsaT5tZWFuOiBbW2l0ZW0ubWVhbl1dPC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbi1pbmZvIHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQogICAgICAuc2VjdGlvbi1pbmZvIHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1wbHVnaW4tZGlhbG9nIGlkPSJpbml0aWFsRGlhbG9nIj48L3RmLXBsdWdpbi1kaWFsb2c+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxwIGNsYXNzPSJjb250cm9scy1kaXNhYmxlZC1tZXNzYWdlIj4KICAgICAgICAgICAgICBDb250cm9scyBkaXNhYmxlZDogZGlyZWN0b3J5IGlzIG5vdCB3cml0ZWFibGUuCiAgICAgICAgICAgIAogICAgICAgICAgICA8cCBjbGFzcz0iZGlzY2xhaW1lciI+CiAgICAgICAgICAgICAgQmVob2xkZXIgcmVxdWlyZXMgd3JpdGUgYWNjZXNzIHRvIHRoZSBsb2cgZGlyZWN0b3J5IGluIG9yZGVyIHRvCiAgICAgICAgICAgICAgY29tbXVuaWNhdGUgdmlzdWFsaXphdGlvbiBjaGFuZ2VzIHRvIHRoZSA8Y29kZT5CZWhvbGRlcjwvY29kZT4KICAgICAgICAgICAgICBpbnN0YW5jZSBpbiB5b3VyIG1vZGVsLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMz5WYWx1ZXM8L2gzPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2YWx1ZXNTZWxlY3RvciIgc2VsZWN0ZWQ9Int7X3ZhbHVlc319Ij4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ0cmFpbmFibGVfdmFyaWFibGVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT50Zi50cmFpbmFibGVfdmFyaWFibGVzKCk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1hcnJheXMiIG5hbWU9ImFycmF5cyIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIDxwcmU+Yi51cGRhdGUoYXJyYXlzPVtOUF9BUlJBWVNdKTwvcHJlPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ib3B0aW9uLWZyYW1lcyIgbmFtZT0iZnJhbWVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT5iLnVwZGF0ZShmcmFtZT1OUF9BUlJBWSk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFsdWVzTm90RnJhbWUoX3ZhbHVlcyldXSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19zaG93QWxsfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj5TaG93IGFsbCBkYXRhIDxpPihjYW4gYmUgcmVzb3VyY2UgaW50ZW5zaXZlKTwvaT48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5Nb2RlPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJtb2RlU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19tb2RlfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY3VycmVudCIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgY3VycmVudCB2YWx1ZXMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InZhcmlhbmNlIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICB2YXJpYW5jZSBvdmVyIHRyYWluIHN0ZXBzCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFyaWFuY2VTZWxlY3RlZChfbW9kZSldXSI+CiAgICAgICAgICAgICAgPGg0PlZhcmlhbmNlIHRpbWVzdGVwczoge3tfd2luZG93U2l6ZX19PC9oND4KICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJ3aW5kb3dTbGlkZXIiIHZhbHVlPSJ7e193aW5kb3dTaXplfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIyIiBtYXg9IjIwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5JbWFnZSBzY2FsaW5nPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJzY2FsaW5nU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19zY2FsaW5nfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1sYXllciIgbmFtZT0ibGF5ZXIiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIHBlciBzZWN0aW9uCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbGF5ZXIiIHBvc2l0aW9uPSJyaWdodCI+CiAgICAgICAgICAgICAgICBCbGFjayBpcyB0aGUgbG93ZXN0IHZhbHVlIGluIHRoYXQgc2VjdGlvbiwgd2hpdGUgaXMgdGhhdCBsYXJnZXN0CiAgICAgICAgICAgICAgICB2YWx1ZSBpbiB0aGF0IHNlY3Rpb24uCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJvcHRpb24tbmV0d29yayIgbmFtZT0ibmV0d29yayIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgYWxsIHNlY3Rpb25zCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbmV0d29yayIgcG9zaXRpb249InJpZ2h0Ij4KICAgICAgICAgICAgICAgIEJsYWNrIGlzIHRoZSBzbWFsbGVzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMsIHdoaXRlIGlzIHRoZQogICAgICAgICAgICAgICAgbGFyZ2VzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgICAgPGRpdiBpZD0iY29sb3JtYXAtc2VsZWN0aW9uIj4KICAgICAgICAgICAgICA8ZGl2IGlkPSJjb2xvcm1hcC1zZWxlY3Rpb24tbGFiZWwiPkNvbG9ybWFwOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2NvbG9ybWFwfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bWFnbWE8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmluZmVybm88L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPnBsYXNtYTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+dmlyaWRpczwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+Z3JheXNjYWxlPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGgzPlVwZGF0ZXMgcGVyIHNlY29uZDoge3tfRlBTfX08L2gzPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iRlBTU2xpZGVyIiB2YWx1ZT0ie3tfRlBTfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIwIiBtYXg9IjMwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJyZWNvcmRfYnV0dG9uIiBvbi10YXA9Il90b2dnbGVSZWNvcmQiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICBbW19yZWNvcmRUZXh0XV0KICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgTm90ZTogQmVob2xkZXIgY3VycmVudGx5IG9ubHkgd29ya3Mgd2VsbCBvbiBsb2NhbCBmaWxlIHN5c3RlbXMuCiAgICAgICAgICAKICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc19hY3RpdmVdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gQmVob2xkZXIgZGF0YSB3YXMgZm91bmQuPC9oMz4KCiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3VyIHNjcmlwdCBpc24ndCBydW5uaW5nLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBhcmVuJ3QgY2FsbGluZyA8Y29kZT5iZWhvbGRlci51cGRhdGUoKTwvY29kZT4uPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIFRvIHVzZSBCZWhvbGRlciwgaW1wb3J0IGFuZCBpbnN0YW50aWF0ZSB0aGUKICAgICAgICAgICAgICA8Y29kZT5CZWhvbGRlcjwvY29kZT4gY2xhc3MsIGFuZCBjYWxsIGl0cwogICAgICAgICAgICAgIDxjb2RlPnVwZGF0ZTwvY29kZT4gbWV0aG9kIHdpdGggYSA8Y29kZT5TZXNzaW9uPC9jb2RlPiBhcmd1bWVudAogICAgICAgICAgICAgIGFmdGVyIGV2ZXJ5IHRyYWluIHN0ZXA6CiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuYmVob2xkZXIgaW1wb3J0IEJlaG9sZGVyCmJlaG9sZGVyID0gQmVob2xkZXIoTE9HX0RJUkVDVE9SWSkKCiMgaW5zaWRlIHRyYWluIGxvb3AKYmVob2xkZXIudXBkYXRlKAogIHNlc3Npb249c2VzcywKICBhcnJheXM9bGlzdF9vZl9ucF9hcnJheXMsICAjIG9wdGlvbmFsIGFyZ3VtZW50CiAgZnJhbWU9dHdvX2RpbWVuc2lvbmFsX25wX2FycmF5LCAgIyBvcHRpb25hbCBhcmd1bWVudAopPC9wcmU+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHVzaW5nIDxjb2RlPnRmLnRyYWluLk1vbml0b3JlZFNlc3Npb248L2NvZGU+LCB5b3UgY2FuIHVzZQogICAgICAgICAgICAgIDxjb2RlPkJlaG9sZGVySG9vazwvY29kZT46CiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuYmVob2xkZXIgaW1wb3J0IEJlaG9sZGVySG9vawpiZWhvbGRlcl9ob29rID0gQmVob2xkZXJIb29rKExPR19ESVJFQ1RPUlkpCndpdGggTW9uaXRvcmVkU2Vzc2lvbiguLi4sIGhvb2tzPVtiZWhvbGRlcl9ob29rXSkgYXMgc2VzczoKICBzZXNzLnJ1bih0cmFpbl9vcCk8L3ByZT4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBldmVyeXRoaW5nIGlzIHNldCB1cCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL3RlbnNvcmJvYXJkL3BsdWdpbnMvYmVob2xkZXIvUkVBRE1FLm1kIj50aGUgUkVBRE1FPC9hPgogICAgICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgICBOb3RlOiBCZWhvbGRlciBjdXJyZW50bHkgb25seSB3b3JrcyB3ZWxsIG9uIGxvY2FsIGZpbGUgc3lzdGVtcy4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzX2FjdGl2ZV1dIj4KICAgICAgICAgIDx0Zi1iZWhvbGRlci12aWRlbyBpZD0idmlkZW8iIGZwcz0iW1tfRlBTXV0iPjwvdGYtYmVob2xkZXItdmlkZW8+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgICAgPHRmLWJlaG9sZGVyLWluZm8gaWQ9ImluZm8iIGZwcz0iW1tfRlBTXV0iPiA8L3RmLWJlaG9sZGVyLWluZm8+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwOwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogNXB4OwoKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1yYWRpby1jb250YWluZXI6IHsKICAgICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIGZsZXgtZ3JvdzogMjsKICAgICAgfQoKICAgICAgcHJlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiNyZWNvcmRfYnV0dG9uIHsKICAgICAgICBjb2xvcjogI2QzMmYyZjsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uI3JlY29yZF9idXR0b24uaXMtcmVjb3JkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZDMyZjJmOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbi5iZWhvbGRlci1kYXNoYm9hcmQ6bGFzdC1jaGlsZCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CgogICAgICAjY29sb3JtYXAtc2VsZWN0aW9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbi1sYWJlbCB7CiAgICAgICAgbWFyZ2luLXRvcDogMTNweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbiBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CgogICAgICBoNCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgbWFyZ2luOiA1cHggMDsKICAgICAgfQoKICAgICAgcC5kaXNjbGFpbWVyIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIHAuY29udHJvbHMtZGlzYWJsZWQtbWVzc2FnZSB7CiAgICAgICAgY29sb3I6ICNjMDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tc3BsaXQtbGF5b3V0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCA+ICNzcGxpdHRlciB7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBtaW4td2lkdGg6IDhweDsKICAgICAgICBtaW4taGVpZ2h0OiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvciwgI2NjYyk7CiAgICAgICAgZmlsbDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKTsKICAgICAgICBAYXBwbHkgLS12YWFkaW4tc3BsaXQtbGF5b3V0LXNwbGl0dGVyOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFt2ZXJ0aWNhbF0pKSA+ICNzcGxpdHRlciB7CiAgICAgICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pID4gI3NwbGl0dGVyIHsKICAgICAgICBjdXJzb3I6IG5zLXJlc2l6ZTsKICAgICAgfQoKICAgICAgI2hhbmRsZSwKICAgICAgI3NwbGl0dGVyIDo6c2xvdHRlZChbc2xvdD1oYW5kbGVdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsXSkgPiAjc3BsaXR0ZXIgI2hhbmRsZSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDkwZGVnKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJwcmltYXJ5IiBuYW1lPSJwcmltYXJ5Ij48L3Nsb3Q+CiAgICA8ZGl2IGlkPSJzcGxpdHRlciIgb24tdHJhY2s9Il9vbkhhbmRsZVRyYWNrIiBvbi1kb3duPSJfcHJldmVudERlZmF1bHQiPgogICAgICA8c2xvdCBuYW1lPSJoYW5kbGUiPgogICAgICAgIDxzdmcgaWQ9ImhhbmRsZSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIj4KICAgICAgICAgIDxyZWN0IHg9IjE5IiB5PSI4IiB3aWR0aD0iMiIgaGVpZ2h0PSIyNCI+PC9yZWN0PgogICAgICAgIDwvc3ZnPgogICAgICA8L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzbG90IGlkPSJzZWNvbmRhcnkiIG5hbWU9InNlY29uZGFyeSI+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1xdWVyeS1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9Imh5cGVycGFyYW1ldGVycy1tZXRyaWNzLXN0YXR1c2VzIj4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsIGlkPSJoeXBlcnBhcmFtZXRlcnMtbWV0cmljcyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gaHlwZXJwYXJhbWV0ZXJzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5IeXBlcnBhcmFtZXRlcnM8L2Rpdj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19ocGFyYW1zfX0iIGFzPSJocGFyYW0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aHBhcmFtLmRpc3BsYXllZH19IiBjbGFzcz0iaHBhcmFtLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbS5pbmZvKV1dCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tocGFyYW0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aXRlbS5jaGVja2VkfX0iIGNsYXNzPSJkaXNjcmV0ZS12YWx1ZS1jaGVja2JveCIgb24tY2hhbmdlPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICBbW19wcmV0dHlQcmludChpdGVtLnZhbHVlKV1dCiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbF1dIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1pbiIgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIgYWxsb3dlZF9wYXR0ZXJuPSJbMC05LmVcLV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tocGFyYW0uZmlsdGVyLmludGVydmFsLm1pbi5pbnZhbGlkXV0iIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNYXgiIHZhbHVlPSJ7e2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXC1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbC5tYXguaW52YWxpZF1dIiBwbGFjZWhvbGRlcj0iK2luZmluaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIucmVnZXhwXV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUmVndWxhciBleHByZXNzaW9uIiB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLnJlZ2V4cH19IiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBtZXRyaWNzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5NZXRyaWNzPC9kaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfbWV0cmljc319IiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1ldHJpYyI+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3ttZXRyaWMuZGlzcGxheWVkfX0iIGNsYXNzPSJtZXRyaWMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljLmluZm8pXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lLWVsZW1lbnQiPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWluIiB2YWx1ZT0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1pbi52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTkuZVwtXSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWR9fSIgcGxhY2Vob2xkZXI9Ii1pbmZpbml0eSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50Ij4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05LmVcLV0iIHZhbHVlPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1heC5pbnZhbGlkfX0iIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIHN0YXR1cyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlN0YXR1czwvZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zdGF0dXNlc11dIiBhcz0ic3RhdHVzIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tzdGF0dXMuYWxsb3dlZH19IiBvbi1jaGFuZ2U9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICBbW3N0YXR1cy5kaXNwbGF5TmFtZV1dCiAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbCBpZD0ic29ydGluZy1wYWdpbmciPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBzb3J0aW5nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U29ydGluZzwvZGl2PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU29ydCBieSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc29ydEJ5SW5kZXh9fSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaHBhcmFtc11dIiBhcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW0uaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWV0cmljc11dIiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWMuaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iRGlyZWN0aW9uIiBvbi1zZWxlY3RlZC1pdGVtLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zb3J0RGlyZWN0aW9ufX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+QXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+RGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9InBhZ2luZy1kb3dubG9hZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gcGFnaW5nIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5QYWdpbmc8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgTnVtYmVyIG9mIG1hdGNoaW5nIHNlc3Npb24gZ3JvdXBzOgogICAgICAgICAgICAgICAgW1tfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHJdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2UtbnVtYmVyLWlucHV0Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUGFnZSAjIiB2YWx1ZT0ie3tfcGFnZU51bWJlcklucHV0LnZhbHVlfX0iIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbX3BhZ2VOdW1iZXJJbnB1dC5pbnZhbGlkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD0ic3VmZml4IiBjbGFzcz0icGFnZS1zdWZmaXgiPgogICAgICAgICAgICAgICAgICAgIC8gW1tfcGFnZUNvdW50U3RyXV0KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2Utc2l6ZS1pbnB1dCI+CiAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCAjIG9mIHNlc3Npb24gZ3JvdXBzIHBlciBwYWdlOiIgdmFsdWU9Int7X3BhZ2VTaXplSW5wdXQudmFsdWV9fSIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05XSIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tfcGFnZVNpemVJbnB1dC5pbnZhbGlkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBkb3dubG9hZCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXNzaW9uR3JvdXBzUmVxdWVzdF1dIj4KICAgICAgICAgICAgICAgIERvd25sb2FkIGRhdGEgYXMKICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICA8YSBpZD0iY3N2TGluayIgZG93bmxvYWQ9ImhwYXJhbXNfdGFibGUuY3N2IiBocmVmPSJbW19jc3ZVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIj5DU1Y8L2E+CiAgICAgICAgICAgICAgICAgIDxhIGlkPSJqc29uTGluayIgZG93bmxvYWQ9ImhwYXJhbXNfdGFibGUuanNvbiIgaHJlZj0iW1tfanNvblVybChfc2Vzc2lvbkdyb3Vwc1JlcXVlc3QsIGNvbmZpZ3VyYXRpb24pXV0iPkpTT048L2E+CiAgICAgICAgICAgICAgICAgIDxhIGlkPSJsYXRleExpbmsiIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLnRleCIgaHJlZj0iW1tfbGF0ZXhVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIj5MYVRlWDwvYT4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAucGFuZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuc2VjdGlvbiB7CiAgICAgICAgbWFyZ2luOiA1cHggMTBweCA1cHggMTBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA3cHg7CiAgICAgIH0KICAgICAgI2h5cGVycGFyYW1ldGVycy1tZXRyaWNzLXN0YXR1c2VzIHsKICAgICAgICBmbGV4LWJhc2lzOiA3MCU7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgICNoeXBlcnBhcmFtZXRlcnMtbWV0cmljcyB7CiAgICAgICAgZmxleC1iYXNpczogOTAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuaHlwZXJwYXJhbWV0ZXJzIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubWV0cmljcyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnN0YXR1c2VzIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAjc29ydGluZy1wYWdpbmcgewogICAgICAgIGZsZXgtYmFzaXM6IDMwJTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgI3BhZ2luZy1kb3dubG9hZCB7CiAgICAgICAgZmxleC1iYXNpczogOTAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuc29ydGluZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLnBhZ2luZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLmRvd25sb2FkIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3gsCiAgICAgIC5tZXRyaWMtY2hlY2tib3gsCiAgICAgIC5ocGFyYW0tY2hlY2tib3ggewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5kaXNjcmV0ZS12YWx1ZS1jaGVja2JveCB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7CiAgICAgIH0KICAgICAgLmhwYXJhbSwKICAgICAgLm1ldHJpYyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmlubGluZS1lbGVtZW50IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDQwJTsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgfQogICAgICAucGFnZS1udW1iZXItaW5wdXQgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgIH0KICAgICAgLnBhZ2Utc2l6ZS1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDYwJTsKICAgICAgfQogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItbGlzdGJveCB7CiAgICAgICAgbWF4LWhlaWdodDogMTVlbTsKICAgICAgfQogICAgICAucGFnZS1zdWZmaXggewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tcGFnZXMiPgoKICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoOm5vdChzbG90KTpub3QoLmlyb24tc2VsZWN0ZWQpKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWhlYWRlci1wYW5lbCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsOwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgI21haW5QYW5lbCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1ib2R5OwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2Nyb2xsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zY3JvbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNjcm9sbC1jb250YWluZXI7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IGNvdmVyCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1jb3Zlcl0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY292ZXItY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5QYW5lbCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc3RhbmRhcmQKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXN0YW5kYXJkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zdGFuZGFyZC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHNlYW1lZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c2VhbWVkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zZWFtZWQtY29udGFpbmVyOwogICAgICB9CgoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXdhdGVyZmFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHdhdGVyZmFsbC10YWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGwtdGFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLXRhbGwtY29udGFpbmVyOwogICAgICB9CgogICAgICAjZHJvcFNoYWRvdyB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzOwogICAgICAgIGhlaWdodDogNnB4OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zaGFkb3c7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93Lmhhcy1zaGFkb3cgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyID4gOjpzbG90dGVkKC5maXQpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgPC9zdHlsZT4KCiAgICA8c2xvdCBpZD0iaGVhZGVyU2xvdCIgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CgogICAgPGRpdiBpZD0ibWFpblBhbmVsIj4KICAgICAgPGRpdiBpZD0ibWFpbkNvbnRhaW5lciIgY2xhc3MkPSJbW19jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzKG1vZGUpXV0iPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImRyb3BTaGFkb3ciPjwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10YWIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1pbmxpbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbbGlua10pIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudGFiLWNvbnRlbnQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50OwogICAgICB9CgogICAgICA6aG9zdCg6bm90KC5pcm9uLXNlbGVjdGVkKSkgPiAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDAuODsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiLWNvbnRlbnQtdW5zZWxlY3RlZDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgfQoKICAgICAgcGFwZXItcmlwcGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdGFiLWluaywgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgfQoKICAgICAgLnRhYi1jb250ZW50ID4gOjpzbG90dGVkKGEpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItdGFicyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iY2hldnJvbi1sZWZ0Ij48cGF0aCBkPSJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiIC8+PC9nPgo8ZyBpZD0iY2hldnJvbi1yaWdodCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10YWJzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKCiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiczsKICAgICAgfQoKICAgICAgOmhvc3QoOmRpcihydGwpKSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWwtcmV2ZXJzZTsKICAgICAgfQoKICAgICAgI3RhYnNDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1jb250YWluZXI7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIC1tb3otZmxleC1iYXNpczogYXV0bzsKICAgICAgICAtbXMtZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYnMtY29udGVudDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQ6bm90KC5zY3JvbGxhYmxlKSwKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudC5zY3JvbGxhYmxlLmZpdC1jb250YWluZXIgewogICAgICAgIG1pbi13aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgLyogSUUgLSBwcmV2ZW50IHRhYnMgZnJvbSBjb21wcmVzc2luZyB3aGVuIHRoZXkgc2hvdWxkIHNjcm9sbC4gKi8KICAgICAgICAtbXMtZmxleDogMSAwIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDAgYXV0bzsKICAgICAgICBmbGV4OiAxIDAgYXV0bzsKICAgICAgfQoKICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLm5vdC12aXNpYmxlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIG1hcmdpbjogMCA0cHg7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvciwgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmFsaWduLWJvdHRvbSB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogYXV0bzsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhci5leHBhbmQgewogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMTVzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDEsIDEpOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmNvbnRyYWN0IHsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE4czsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMCwgMC4wLCAwLjIsIDEpOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQgPiA6OnNsb3R0ZWQoOm5vdCgjc2VsZWN0aW9uQmFyKSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0icGFwZXItdGFiczpjaGV2cm9uLWxlZnQiIGNsYXNzJD0iW1tfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzKF9sZWZ0SGlkZGVuLCBzY3JvbGxhYmxlLCBoaWRlU2Nyb2xsQnV0dG9ucyldXSIgb24tdXA9Il9vblNjcm9sbEJ1dHRvblVwIiBvbi1kb3duPSJfb25MZWZ0U2Nyb2xsQnV0dG9uRG93biIgdGFiaW5kZXg9Ii0xIj48L3BhcGVyLWljb24tYnV0dG9uPgoKICAgIDxkaXYgaWQ9InRhYnNDb250YWluZXIiIG9uLXRyYWNrPSJfc2Nyb2xsIiBvbi1kb3duPSJfZG93biI+CiAgICAgIDxkaXYgaWQ9InRhYnNDb250ZW50IiBjbGFzcyQ9IltbX2NvbXB1dGVUYWJzQ29udGVudENsYXNzKHNjcm9sbGFibGUsIGZpdENvbnRhaW5lcildXSI+CiAgICAgICAgPGRpdiBpZD0ic2VsZWN0aW9uQmFyIiBjbGFzcyQ9IltbX2NvbXB1dGVTZWxlY3Rpb25CYXJDbGFzcyhub0JhciwgYWxpZ25Cb3R0b20pXV0iIG9uLXRyYW5zaXRpb25lbmQ9Il9vbkJhclRyYW5zaXRpb25FbmQiPjwvZGl2PgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0icGFwZXItdGFiczpjaGV2cm9uLXJpZ2h0IiBjbGFzcyQ9IltbX2NvbXB1dGVTY3JvbGxCdXR0b25DbGFzcyhfcmlnaHRIaWRkZW4sIHNjcm9sbGFibGUsIGhpZGVTY3JvbGxCdXR0b25zKV1dIiBvbi11cD0iX29uU2Nyb2xsQnV0dG9uVXAiIG9uLWRvd249Il9vblJpZ2h0U2Nyb2xsQnV0dG9uRG93biIgdGFiaW5kZXg9Ii0xIj48L3BhcGVyLWljb24tYnV0dG9uPgoKICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b29sYmFyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItaGVpZ2h0LCA2NHB4KTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0LCA1NnB4KTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci10b29sYmFyLWJhY2tncm91bmQsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbGJhci1jb2xvciwgdmFyKC0tZGFyay10aGVtZS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhcjsKICAgICAgfQoKICAgICAgOmhvc3QoLmFuaW1hdGUpIHsKICAgICAgICB0cmFuc2l0aW9uOiB2YXIoLS1wYXBlci10b29sYmFyLXRyYW5zaXRpb24sIGhlaWdodCAwLjE4cyBlYXNlLWluKTsKICAgICAgfQoKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMik7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1tZWRpdW07CiAgICAgIH0KCiAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMyk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10YWxsOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCk7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1jb250ZW50OwogICAgICB9CgogICAgICAvKgogICAgICAgKiBUT0RPOiBXaGVyZSBzaG91bGQgbWVkaWEgcXVlcnkgYnJlYWtwb2ludHMgbGl2ZSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBlbGVtZW50cz8KICAgICAgICovCgogICAgICBAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAyKTsKICAgICAgICB9CgogICAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAzKTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLXRvb2xzIHsKICAgICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAjdG9wQmFyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC8qIG1pZGRsZSBiYXIgKi8KICAgICAgI21pZGRsZUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICA6aG9zdCgudGFsbCkgI21pZGRsZUJhciwKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSAjbWlkZGxlQmFyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7CiAgICAgIH0KCiAgICAgIC8qIGJvdHRvbSBiYXIgKi8KICAgICAgI2JvdHRvbUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtYWtlIGVsZW1lbnRzIChlLmcuIGJ1dHRvbnMpIHJlc3BvbmQgdG8gbW91c2UvdG91Y2ggZXZlbnRzCiAgICAgICAqCiAgICAgICAqIGAudG9vbGJhci10b29sc2AgZGlzYWJsZXMgdG91Y2ggZXZlbnRzIHNvIG11bHRpcGxlIHRvb2xiYXJzIGNhbiBzdGFjayBhbmQgbm90CiAgICAgICAqIGFic29yYiBldmVudHMuIEFsbCBjaGlsZHJlbiBtdXN0IGhhdmUgcG9pbnRlciBldmVudHMgcmUtZW5hYmxlZCB0byB3b3JrIGFzCiAgICAgICAqIGV4cGVjdGVkLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoKjpub3QoW2Rpc2FibGVkXSkpIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiA1NnB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbiArIC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIC0tcGFwZXItdG9vbGJhci10aXRsZSBtaXhpbiBpcyBhcHBsaWVkIGhlcmUgaW5zdGVhZCBvZiBhYm92ZSB0bwogICAgICAgKiBmaXggdGhlIGlzc3VlIHdpdGggbWFyZ2luLWxlZnQgYmVpbmcgaWdub3JlZCBkdWUgdG8gY3NzIG9yZGVyaW5nLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10aXRsZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQocGFwZXItaWNvbi1idXR0b25baWNvbj1tZW51XSkgewogICAgICAgIG1hcmdpbi1yaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGF1dG87CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAvKiBUT0RPKG5vbXMpOiBVbnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIGZvciBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlCiAgICAgICAqIC9kZWVwLyBjcmVhdGUgb3VyIG93bi4KICAgICAgICovCiAgICAgIC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1zdGFydC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5jZW50ZXItanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmVuZC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CgogICAgICAuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWFyb3VuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9wQmFyIiBjbGFzcyQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3NlcyhqdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0idG9wIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJtaWRkbGVCYXIiIGNsYXNzJD0idG9vbGJhci10b29scyBbW19jb21wdXRlQmFyRXh0cmFDbGFzc2VzKG1pZGRsZUp1c3RpZnkpXV0iPgogICAgICA8c2xvdCBuYW1lPSJtaWRkbGUiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImJvdHRvbUJhciIgY2xhc3MkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoYm90dG9tSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9ImJvdHRvbSI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtcGFuZWwiPgogICAgICAKICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkNvbG9yIGJ5IiBpZD0iY29sb3JCeURyb3BEb3duTWVudSIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e29wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4fX0iIGlkPSJjb2xvckJ5TGlzdEJveCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW29wdGlvbnMuY29sdW1uc11dIiBhcz0iY29sdW1uIiBpZD0iY29sb3JCeUNvbHVtblRlbXBsYXRlIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gZGlzYWJsZWQ9IltbIV9pc051bWVyaWNDb2x1bW4oY29sdW1uLmluZGV4KV1dIj4KICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KCiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJjb2x1bW5zLWNvbnRhaW5lciI+CiAgICAgICAgCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvcHRpb25zLmNvbHVtbnN9fSIgYXM9ImNvbHVtbiI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbi10aXRsZSI+CiAgICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGNsYXNzPSJzY2FsZS1yYWRpby1ncm91cCIgc2VsZWN0ZWQ9Int7Y29sdW1uLnNjYWxlfX0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkxJTkVBUiI+CiAgICAgICAgICAgICAgICAgICAgTGluZWFyCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ibG9nU2NhbGVCdXR0b25fW1tjb2x1bW4ubmFtZV1dIiBuYW1lPSJMT0ciIGRpc2FibGVkPSJbWyFfYWxsb3dMb2dTY2FsZShjb2x1bW4sIHNlc3Npb25Hcm91cHMuKildXSI+CiAgICAgICAgICAgICAgICAgICAgTG9nYXJpdGhtaWMKICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iUVVBTlRJTEUiPgogICAgICAgICAgICAgICAgICAgIFF1YW50aWxlCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmNvbnRyb2wtcGFuZWwgewogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC5jb2x1bW4gewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgICBib3JkZXI6IHNvbGlkIDFweCBkYXJrZ3JheTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgIH0KICAgICAgLmNvbHVtbi10aXRsZSB7CiAgICAgICAgLyogRml0IGV2ZXJ5IHRpdGxlIGluIG9uZSBsaW5lIHNvIHRoZSByYWRpbyBib3hlcyBhbGlnbiB2ZXJ0aWNhbGx5LiAqLwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgICAgLmNvbHVtbnMtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgLnNjYWxlLXJhZGlvLWdyb3VwIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMnB4OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWFjdGl2ZS1pdGVtLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93W2FjdGl2ZV0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1hY3RpdmUtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICN0YWJsZSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgICB6LWluZGV4OiAtMjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbaW9zXSAjdGFibGUgewogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdICN0YWJsZSB7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICB6LWluZGV4OiAtMTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHsKICAgICAgICAvKiBBbnkgdmFsdWUgb3RoZXIgdGhhbiDigJhub25l4oCZIGZvciB0aGUgdHJhbnNmb3JtIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGJvdGggYSBzdGFja2luZyBjb250ZXh0IGFuZAogICAgICAgIGEgY29udGFpbmluZyBibG9jay4gVGhlIG9iamVjdCBhY3RzIGFzIGEgY29udGFpbmluZyBibG9jayBmb3IgZml4ZWQgcG9zaXRpb25lZCBkZXNjZW5kYW50cy4gKi8KICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtYm9keSNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtY2VsbCI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiPjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIj48L2RvbS1tb2R1bGU+Cjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zaXplci1jZWxsIj48L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtc2l6ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuY2VsbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgZm9udC1zaXplOiAxcHg7CiAgICAgICAgbWFyZ2luLXRvcDogLTFlbTsKICAgICAgfQoKICAgICAgLmNlbGxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jb2x1bW5zXV0iIGFzPSJjb2x1bW4iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXItY2VsbCBjbGFzcz0iY2VsbCIgY29sdW1uPSJbW2NvbHVtbl1dIj4mbmJzcDs8L3ZhYWRpbi1ncmlkLXNpemVyLWNlbGw+CiAgICA8L3RlbXBsYXRlPgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbcGFzc3Rocm91Z2hdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpb3NdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICB6LWluZGV4OiAtMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2lvc11bc2Nyb2xsaW5nXSkgewogICAgICAgIHotaW5kZXg6IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgOmhvc3QgewogICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgei1pbmRleDogLTM7CiAgICAgICBoZWlnaHQ6IDA7CiAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgIH0KCiAgICAgOmhvc3QoOmZvY3VzKSwKICAgICAucHJpbWFyeTpmb2N1cywKICAgICA6OnNsb3R0ZWQoLnByaW1hcnk6Zm9jdXMpLAogICAgIC5zZWNvbmRhcnk6Zm9jdXMsCiAgICAgOjpzbG90dGVkKC5zZWNvbmRhcnk6Zm9jdXMpIHsKICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgfQogICAgPC9zdHlsZT4KCiAgICAKICAgIDxkaXYgY2xhc3M9InByaW1hcnkiIHRhYmluZGV4PSIwIiByb2xlPSJncmlkY2VsbCIgb24tZm9jdXM9Il9vbkJhaXRGb2N1cyIgb24tYmx1cj0iX29uQmFpdEJsdXIiPjxkaXYgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PjwvZGl2PgogICAgPGRpdiBjbGFzcz0ic2Vjb25kYXJ5IiB0YWJpbmRleD0iLTEiIHJvbGU9ImdyaWRjZWxsIiBvbi1mb2N1cz0iX29uQmFpdEZvY3VzIiBvbi1ibHVyPSJfb25CYWl0Qmx1ciI+PGRpdiBhcmlhLWhpZGRlbj0idHJ1ZSI+Jm5ic3A7PC9kaXY+PC9kaXY+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXJvdyI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyI+PC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2RldGFpbHNjZWxsXSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAudmFhZGluLWdyaWQtY2VsbFtkZXRhaWxzY2VsbF0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctZGV0YWlscy1jZWxsKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIC8qIEFuaW0gKi8KICAgICAgQGtleWZyYW1lcyB2YWFkaW4tZ3JpZC1zcGluLTM2MCB7CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgdmFhZGluLWdyaWQtc3Bpbi0zNjAgewogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNzcGlubmVyIHsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDNBOUY0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtOHB4OwogICAgICAgIG1hcmdpbi10b3A6IC04cHg7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtbG9hZGluZy1zcGlubmVyKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2xvYWRpbmddKSAjc3Bpbm5lciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICA6aG9zdChbbG9hZGluZ10pICNpdGVtcyB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3dbc2VsZWN0ZWRdIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS0xMDAsIHJnYigyNDMsIDI0MywgMjQzKSk7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctc2VsZWN0ZWQtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLW5hdmlnYXRpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KDpmb2N1cyksCiAgICAgICN0YWJsZTpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW25hdmlnYXRpbmddOm5vdChbaW50ZXJhY3RpbmddKSkgW2ZvY3VzZWRdID4gLnZhYWRpbi1ncmlkLXJvd1tmb2N1c2VkXSA+IFtmb2N1c2VkXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb2N1c2VkLWNlbGwpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtyZW9yZGVyaW5nXSAudmFhZGluLWdyaWQtY2VsbCB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQoKICAgICAgOmhvc3QoW3Jlb3JkZXJpbmddKSAudmFhZGluLWdyaWQtY2VsbFtyZW9yZGVyLXN0YXR1cz0iZHJhZ2dpbmciXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW3Jlb3JkZXJpbmddIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtczsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAjc2Nyb2xsZXIgLnZhYWRpbi1ncmlkLWNlbGxbcmVvcmRlci1zdGF0dXM9ImFsbG93ZWQiXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDAwKTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBvcGFjaXR5OiAwLjk1OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgQGtleWZyYW1lcyBhcHBlYXIgewogICAgICAgIHRvIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGFuaW1hdGlvbjogMW1zIGFwcGVhcjsKICAgICAgfQoKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1tYXgtZGV2aWNlLXBpeGVsLXJhdGlvOiAxKSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIGJvcmRlci10b3A6IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgI2l0ZW1zID4gLnZhYWRpbi1ncmlkLXJvdyB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1jZWxsLAogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMzVweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgIH0KCiAgICAgIFtsYXN0Y29sdW1uXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSwKICAgICAgW2xhc3QtZnJvemVuXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZF0gI2hlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtcm93Om5vdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIFtmcm96ZW5dIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbbm8tY29udGVudC1wb2ludGVyLWV2ZW50c10gLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2lvc11bY29sdW1uLXJlc2l6aW5nXSkgI291dGVyc2Nyb2xsZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgICNmaXhlZHNpemVyLAogICAgICAjb3V0ZXJzaXplciB7CiAgICAgICAgYm9yZGVyLXRvcDogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItYm90dG9tOiAwIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAjdGFibGUgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjdGFibGVbb3ZlcmZsb3ctaGlkZGVuXSwKICAgICAgI291dGVyc2Nyb2xsZXJbb3ZlcmZsb3ctaGlkZGVuXSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtc2l6ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpemVyd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IC0xMDA7CiAgICAgIH0KCiAgICAgICNyZW9yZGVyZ2hvc3QgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uKSwKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLXNlbGVjdGlvbi1jb2x1bW4pLAogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uLWdyb3VwKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgLyogRGVmYXVsdCBib3JkZXJzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIC52YWFkaW4tZ3JpZC1yb3c6Zmlyc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93Om5vdChbbGFzdHJvd10pIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgIH0KCiAgICAgIFtsYXN0LWZyb3plbl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICAvKiBDb2x1bW4gcmVzaXplIGhhbmRsZSAqLwoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1jb2x1bW4tcmVzaXplLWhhbmRsZSk7CiAgICAgIH0KCiAgICAgIC8qIENlbGxzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1oZWFkZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb290ZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgW29kZF0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1vZGQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pW2xhc3QtZnJvemVuXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbC1sYXN0LWZyb3plbik7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlOm5vdChbc2Nyb2xsaW5nXSkgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93OmhvdmVyIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1ob3Zlci1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbC52YWFkaW4tZ3JpZC1jZWxsW2xhc3Rjb2x1bW5dIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZSI+CiAgPHRlbXBsYXRlPgogICAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc2Nyb2xsLXN0eWxlcyI+PC9zdHlsZT4KICAgICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxkaXYgaWQ9InNwaW5uZXIiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJ0YWJsZSIgdGFiaW5kZXg9Ii0xIiBvdmVyZmxvdy1oaWRkZW4kPSJbW19oaWRlVGFibGVPdmVyZmxvdyhzY3JvbGxiYXJXaWR0aCwgc2FmYXJpKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzaXplcndyYXBwZXIiPgogICAgICAgICAgPHZhYWRpbi1ncmlkLXNpemVyIGlkPSJmaXhlZHNpemVyIiB0b3A9IltbX2VzdFNjcm9sbEhlaWdodF1dIiBjb2x1bW4tdHJlZT0iW1tjb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtc2l6ZXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNsb3QgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CiAgICAgICAgPHNsb3QgbmFtZT0iaXRlbXMiPjwvc2xvdD4KICAgICAgICA8c2xvdCBuYW1lPSJmb290ZXIiPjwvc2xvdD4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJyZW9yZGVyZ2hvc3QiPjwvZGl2PgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIgaWQ9Im91dGVyc2Nyb2xsZXIiIHNjcm9sbC10YXJnZXQ9Iltbc2Nyb2xsVGFyZ2V0XV0iIG92ZXJmbG93LWhpZGRlbiQ9IltbX2hpZGVPdXRlclNjcm9sbGVyKHNjcm9sbGJhcldpZHRoLCBzYWZhcmkpXV0iIGlvcyQ9IltbaW9zXV0iIHNjcm9sbGluZyQ9Iltbc2Nyb2xsaW5nXV0iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXIgaWQ9Im91dGVyc2l6ZXIiIHRvcD0iW1tfZXN0U2Nyb2xsSGVpZ2h0XV0iIGNvbHVtbi10cmVlPSJbW2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC1zaXplcj4KICAgIDwvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXI+CiAgICA8c2xvdD48L3Nsb3Q+CiAgICA8c2xvdCBuYW1lPSJmb290ZXJGb2N1c1RyYXAiPjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbiI+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvciwgI2ZmZik7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtcm93LWRldGFpbHMtc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXNlbGVjdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtbmF2aWdhdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1jb2x1bW4tcmVvcmRlcmluZy10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CgogICAgPHZhYWRpbi1ncmlkLXRhYmxlIGlkPSJzY3JvbGxlciIgbG9hZGluZyQ9IltbX2xvYWRpbmddXSIgYmluZC1kYXRhPSJbW19iaW5kRGF0YV1dIiBzaXplPSJbW3NpemVdXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSIgcm93LWRldGFpbHMtdGVtcGxhdGU9IltbX3Jvd0RldGFpbHNUZW1wbGF0ZV1dIiBjb2x1bW4tcmVvcmRlcmluZy1hbGxvd2VkPSJbW2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkXV0iPgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIGlkPSJoZWFkZXIiIHNsb3Q9ImhlYWRlciIgdGFyZ2V0PSJbW19nZXRDb250ZW50VGFyZ2V0KCldXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXI+CiAgICAgIDx2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IGlkPSJpdGVtcyIgc2xvdD0iaXRlbXMiPjwvdmFhZGluLWdyaWQtdGFibGUtYm9keT4KICAgICAgPHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciBpZD0iZm9vdGVyIiBzbG90PSJmb290ZXIiIHRhcmdldD0iW1tfZ2V0Q29udGVudFRhcmdldCgpXV0iIGNvbHVtbi10cmVlPSJbW19jb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyPgoKICAgICAgCiAgICAgIDxzbG90IG5hbWU9ImZvb3RlckZvY3VzVHJhcCI+PC9zbG90PgoKICAgICAgCiAgICAgIAogICAgICA8c2xvdD48L3Nsb3Q+CgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCBpZD0iZm9vdGVyRm9jdXNUcmFwIiBzbG90PSJmb290ZXJGb2N1c1RyYXAiIG9uLWZvY3VzLWdhaW5lZD0iX29uRm9vdGVyRm9jdXMiIG9uLWZvY3VzLWxvc3Q9Il9vbkZvY3Vzb3V0Ij4KICAgICAgPC92YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwPgogICAgPC92YWFkaW4tZ3JpZC10YWJsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFzZXNzaW9uR3JvdXBdXSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgzPk5vIHNlc3Npb24gZ3JvdXAgc2VsZWN0ZWQ8L2gzPgogICAgICAgIDxwPlBsZWFzZSBzZWxlY3QgYSBzZXNzaW9uIGdyb3VwIHRvIHNlZSBpdHMgbWV0cmljLWdyYXBocyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXZlTWV0cmljcyh2aXNpYmxlU2NoZW1hLiopXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBtZXRyaWNzIGFyZSBlbmFibGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2UgZW5hYmxlIHNvbWUgbWV0cmljcyB0byBzZWUgY29udGVudCBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQgaG9yaXpvbnRhbCB3cmFwIHNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGF2ZU1ldHJpY3NBbmRTZXNzaW9uR3JvdXAodmlzaWJsZVNjaGVtYS4qLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cCldXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zXV0iIGFzPSJtZXRyaWNJbmZvIj4KICAgICAgICAgIAogICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGNsYXNzPSJzY2FsYXItY2FyZCIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS10by1sb2FkPSJbW19jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHNlc3Npb25Hcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNJbmZvKV1dIiB0YWc9IltbbWV0cmljSW5mby5uYW1lLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX2NvbXB1dGVUYWdNZXRhZGF0YShtZXRyaWNJbmZvKV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIG11bHRpLWV4cGVyaW1lbnRzPSJbW19ub011bHRpRXhwZXJpbWVudHNdXSIgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIiBhY3RpdmU+CiAgICAgICAgICA8L3RmLXNjYWxhci1jYXJkPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIAogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXRhYmxlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tZ3JpZCBjbGFzcz0ic2Vzc2lvbi1ncm91cC10YWJsZSIgaWQ9InNlc3Npb25Hcm91cHNUYWJsZSIgY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZCBpdGVtcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMCIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+VHJpYWwgSUQ8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPltbaXRlbS5uYW1lXV08L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2VuYWJsZVNob3dNZXRyaWNzXV0iPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIwIiB3aWR0aD0iNWVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5TaG93IE1ldHJpY3M8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0idGFibGUtY2VsbCIgY2hlY2tlZD0ie3tleHBhbmRlZH19Ij4KICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc11dIiBhcz0iaHBhcmFtSW5mbyIgaW5kZXgtYXM9ImhwYXJhbUluZGV4Ij4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMiIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX2hwYXJhbU5hbWUoaHBhcmFtSW5mbyldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX3Nlc3Npb25Hcm91cEhQYXJhbShpdGVtLCBocGFyYW1JbmZvLm5hbWUpXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e3Zpc2libGVTY2hlbWEubWV0cmljSW5mb3N9fSIgYXM9Im1ldHJpY0luZm8iIGluZGV4LWFzPSJtZXRyaWNJbmRleCI+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjIiIHdpZHRoPSIxMGVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19tZXRyaWNOYW1lKG1ldHJpY0luZm8pXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19zZXNzaW9uR3JvdXBNZXRyaWMoaXRlbSwgbWV0cmljSW5mby5uYW1lKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGNsYXNzPSJyb3ctZGV0YWlscyI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tpdGVtXV0iIHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgY2xhc3M9InNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdmFhZGluLWdyaWQ+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAudGFibGUtaGVhZGVyIHsKICAgICAgICAvKiBsaW5lLWJyZWFrIG92ZXJmbG93aW5nIGNvbHVtbiBoZWFkZXJzICovCiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zZXNzaW9uLWdyb3VwLXRhYmxlIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlc3Npb24tZ3JvdXAtZGV0YWlscyB7CiAgICAgICAgaGVpZ2h0OiAzNjBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSI+CiAgICAgIAogICAgICA8dGYtaHBhcmFtcy10YWJsZS12aWV3IHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9IltbX3NpbmdsZXRvblNlc3Npb25Hcm91cHMoc2Vzc2lvbkdyb3VwKV1dIj4KICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfcHJvcGVydGllc0FyZVBvcHVsYXRlZCh2aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXApXV0iPgogICAgICA8ZGl2PgogICAgICAgIENsaWNrIG9yIGhvdmVyIG92ZXIgYSBzZXNzaW9uIGdyb3VwIHRvIGRpc3BsYXkgaXRzIHZhbHVlcyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxzdmcgaWQ9InN2ZyI+PC9zdmc+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHN2ZyB7CiAgICAgICAgZm9udDogMTBweCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuYmFja2dyb3VuZCBwYXRoIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7CiAgICAgIH0KCiAgICAgIC5mb3JlZ3JvdW5kIHBhdGggewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNzsKICAgICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIH0KCiAgICAgIC8qIFdpbGwgYmUgc2V0IG9uIGZvcmVncm91bmQgcGF0aHMgdGhhdCBhcmUgbm90ICJjb250YWluZWQiIGluIHRoZSBjdXJyZW50CiAgICAgICAgIGF4ZXMgYnJ1c2hlcy4gSWYgbm8gYnJ1c2hlcyBhcmUgc2V0LCBubyBwYXRoIHdpbGwgaGF2ZSB0aGlzIGNsYXNzLiAqLwogICAgICAuZm9yZWdyb3VuZCAuaW52aXNpYmxlLXBhdGggewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIFN0eWxlIGZvciB0aGUgcGF0aCBjbG9zZXN0IHRvIHRoZSBtb3VzZSBwb2ludGVyICh0eXBpY2FsbHkgd2lsbCBiZWNvbWUKICAgICAgdGhlIHNlbGVjdGVkIHBhdGggd2hlbiB0aGUgdXNlciBjbGlja3MpLiAqLwogICAgICAuZm9yZWdyb3VuZCAucGVha2VkLXBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQoKICAgICAgLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXRoIGNsYXNzLiBXZSB1c2UgIWltcG9ydGFudCB0byBvdmVycmlkZSB0aGUKICAgICAgICAgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBjb2xvciBvZiBhIHBhdGguICovCiAgICAgIC5mb3JlZ3JvdW5kIC5zZWxlY3RlZC1wYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDMgIWltcG9ydGFudDsKICAgICAgICBzdHJva2U6ICMwZjAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI2NvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmF4aXMgdGV4dCB7CiAgICAgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZiwgMXB4IDAgMCAjZmZmLCAwIC0xcHggMCAjZmZmLCAtMXB4IDAgMCAjZmZmOwogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPGRpdiBjbGFzcz0icGFuZSI+CiAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgIAogICAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzZWN0aW9uIiBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBvcHRpb25zPSJ7e19vcHRpb25zfX0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHM+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgICAKICAgICAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90IGlkPSJwbG90IiBjbGFzcz0ic2VjdGlvbiIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBzZWxlY3RlZC1zZXNzaW9uLWdyb3VwPSJ7e19zZWxlY3RlZEdyb3VwfX0iIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iIG9wdGlvbnM9IltbX29wdGlvbnNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3Q+CiAgICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMgaWQ9InZhbHVlcyIgY2xhc3M9InNlY3Rpb24iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIiBzZXNzaW9uLWdyb3VwPSJbW19jbG9zZXN0T3JTZWxlY3RlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGlkPSJkZXRhaWxzIiBjbGFzcz0ic2VjdGlvbiIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBzZXNzaW9uLWdyb3VwPSJbW19zZWxlY3RlZEdyb3VwXV0iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIj4KICAgICAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjbG9zZXN0IGRhdGEgcG9pbnQgbWFya2VyIHRvIHRoZSBtb3VzZSBwb2ludGVyLiBXZSB1c2UgIWltcG9ydGFudAogICAgICAgICB0byBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4KICAgICAgKi8KICAgICAgLmNsb3Nlc3QtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0YSBwb2ludCBtYXJrZXIuIFdlIHVzZSAhaW1wb3J0YW50IHRvCiAgICAgICAgIG92ZXJyaWRlIHRoZSBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIHN0eWxlIG9mIGEgbWFya2VyLiAqLwogICAgICAuc2VsZWN0ZWQtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgCiAgICAgICAgPHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIGNsYXNzPSJzZWN0aW9uIiBpZD0iY29udHJvbHMiIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iIG9wdGlvbnM9Int7X29wdGlvbnN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgIAogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IGNsYXNzPSJzZWN0aW9uIiBpZD0icGxvdCIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IiBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IiBvcHRpb25zPSJbW19vcHRpb25zXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdD4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyBjbGFzcz0ic2VjdGlvbiIgaWQ9InZhbHVlcyIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXA9IltbX2Nsb3Nlc3RPclNlbGVjdGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgCiAgICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyBjbGFzcz0ic2VjdGlvbiIgaWQ9ImRldGFpbHMiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tfc2VsZWN0ZWRHcm91cF1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaGVhZGVyLXBhbmVsPgogICAgICA8cGFwZXItdG9vbGJhciBzbG90PSJoZWFkZXIiIGNsYXNzPSJ0YWItYmFyIj4KICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRUYWJ9fSIgc2xvdD0idG9wIj4KICAgICAgICAgIAogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJ0YWJsZS12aWV3Ij4KICAgICAgICAgICAgVEFCTEUgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InBhcmFsbGVsLWNvb3Jkcy12aWV3Ij4KICAgICAgICAgICAgUEFSQUxMRUwgQ09PUkRJTkFURVMgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyI+CiAgICAgICAgICAgIFNDQVRURVIgUExPVCBNQVRSSVggVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLWFuZC1mZWVkYmFjayI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tidWdSZXBvcnRVcmxdXSI+CiAgICAgICAgICAgICAgPGEgaHJlZiQ9IltbYnVnUmVwb3J0VXJsXV0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0iYnVnLXJlcG9ydCIgcmFpc2VkIHRpdGxlPSJTZW5kIGEgYnVnIHJlcG9ydCBvciBmZWF0dXJlIHJlcXVlc3QiPgogICAgICAgICAgICAgICAgICBCdWcgUmVwb3J0IC8gRmVhdHVyZSBSZXF1ZXN0CiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWxwVXJsXV0iPgogICAgICAgICAgICAgIDxhIGhyZWYkPSJbW2hlbHBVcmxdXSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIiB0aXRsZT0iVmlldyBkb2N1bWVudGF0aW9uIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci10YWJzPgogICAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICAgIDxpcm9uLXBhZ2VzIHNlbGVjdGVkPSJbW19zZWxlY3RlZFRhYl1dIiBjbGFzcz0iZml0IHRhYi12aWV3Ij4KICAgICAgICA8ZGl2IGlkPSIwIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBlbmFibGUtc2hvdy1tZXRyaWNzPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iMSIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IjIiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3IGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0iW1tjb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3PgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tcGFnZXM+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIC50YWItdmlldyB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC50YWItYmFyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgfQogICAgICAudGFiIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItdGFicyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci10YWJzLWNvbnRlbnQ6IHsKICAgICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIH0KICAgICAgfQogICAgICB0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuaGVscC1hbmQtZmVlZGJhY2sgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICAgICNidWctcmVwb3J0IHsKICAgICAgICBib3JkZXI6IHNvbGlkIGJsYWNrOwogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmRzOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBtYXgtd2lkdGg6IDE1MHB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLW1haW4iPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8dGYtaHBhcmFtcy1xdWVyeS1wYW5lIGlkPSJxdWVyeS1wYW5lIiBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249Int7X2NvbmZpZ3VyYXRpb259fSIgc2Vzc2lvbi1ncm91cHM9Int7X3Nlc3Npb25Hcm91cHN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSBpZD0ic2Vzc2lvbnMtcGFuZSIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGhlbHAtdXJsPSJbW2hlbHBVcmxdXSIgYnVnLXJlcG9ydC11cmw9IltbYnVnUmVwb3J0VXJsXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBjb25maWd1cmF0aW9uPSJbW19jb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW19zZXNzaW9uR3JvdXBzXV0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lPgogICAgICA8L2Rpdj4KICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDx0Zi1ocGFyYW1zLWdvb2dsZS1hbmFseXRpY3MtdHJhY2tlciBpZD0idHJhY2tlciIgdHJhY2tpbmctaWQ9IltbdHJhY2tpbmdJZF1dIiBuYW1lPSJ0Zl9ocGFyYW1zIj4KICAgIDwvdGYtaHBhcmFtcy1nb29nbGUtYW5hbHl0aWNzLXRyYWNrZXI+CgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBtaW4td2lkdGg6IDEwJTsKICAgICAgfQoKICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRmLWhwYXJhbXMtbWFpbiBpZD0iaHBhcmFtcy1tYWluIiBiYWNrZW5kPSJbW19iYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iIj4KICAgIDwvdGYtaHBhcmFtcy1tYWluPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1tZXNoLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyBjb2xvcj0iW1tfcnVuQ29sb3JdXSIgY2xhc3M9InRmLW1lc2gtbG9hZGVyLWhlYWRlciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTYW1wbGVzKG9mU2FtcGxlcyldXSI+CiAgICAgICAgPGRpdj5zYW1wbGU6IFtbX2dldFNhbXBsZVRleHQoc2FtcGxlKV1dIG9mIFtbb2ZTYW1wbGVzXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcChfc3RlcHMpXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwCiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+W1t0b0xvY2FsZVN0cmluZ18oX3N0ZXBWYWx1ZSldXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jdXJyZW50V2FsbFRpbWVdXSI+CiAgICAgICAgICAgICAgW1tfY3VycmVudFdhbGxUaW1lXV0KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwgcmlnaHQiPgogICAgICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFjdGl2ZSBoaWRkZW4kPSJbWyFfaXNNZXNoTG9hZGluZ11dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzKF9zdGVwcyldXSI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX2dldE1heFN0ZXBJbmRleChfc3RlcHMpXV0iIG1heC1tYXJrZXJzPSJbW19nZXRNYXhTdGVwSW5kZXgoX3N0ZXBzKV1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDFweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFweDsKICAgICAgfQogICAgICAudGYtbWVzaC1sb2FkZXItaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwNXB4OwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9Im1lc2gtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIiBjbGFzcz0iYWxsLWNvbnRyb2xzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gdmlldy1jb250cm9sIj4KICAgICAgICAgIDxoMyBjbGFzcz0idGl0bGUiPlBvaW50IG9mIHZpZXc8L2gzPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2aWV3LXJhZGlvLWdyb3VwIiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRWaWV3fX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9ImFsbC1yYWRpby1idXR0b24iIG5hbWU9ImFsbCI+CiAgICAgICAgICAgICAgICBEaXNwbGF5IGFsbCBwb2ludHMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0iYWxsLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgWm9vbSBhbmQgY2VudGVyIGNhbWVyYSB0byBkaXNwbGF5IGFsbCBwb2ludHMgYXQgb25jZS4gTm90ZSwgdGhhdAogICAgICAgICAgICAgICAgc29tZSBwb2ludHMgY291bGQgYmUgdG9vIGZhciAoaS5lLiB0b28gc21hbGwpIHRvIGJlIHZpc2libGUuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InVzZXItcmFkaW8tYnV0dG9uIiBuYW1lPSJ1c2VyIj4KICAgICAgICAgICAgICAgIEN1cnJlbnQgdmlldwogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJ1c2VyLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgS2VlcCBjdXJyZW50IGNhbWVyYSBwb3NpdGlvbiBhbmQgem9vbSBsZXZlbC4KICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ic2hhcmUtcmFkaW8tYnV0dG9uIiBuYW1lPSJzaGFyZSI+CiAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0ic2hhcmUtcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQgYW1vbmcgYWxsIGNhbWVyYXMuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHBvaW50IGNsb3VkIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcG9pbnQgY2xvdWQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbWVzaC1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBzZWxlY3RlZC12aWV3PSJbW19zZWxlY3RlZFZpZXddXSIgcnVuPSJbW2l0ZW0ucnVuXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIgb2Ytc2FtcGxlcz0iW1tpdGVtLm9mU2FtcGxlc11dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1jb250YWluZXIiIG9uLWNhbWVyYS1wb3NpdGlvbi1jaGFuZ2U9Il9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlZCI+CiAgICAgICAgICAgICAgICA8L3RmLW1lc2gtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gaDMudGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLnJ1bnMtc2VsZWN0b3IgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgdGYtcnVucy1zZWxlY3RvciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZpZXctY29udHJvbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnZpZXctY29udHJvbCBoMy50aXRsZSB7CiAgICAgICAgcGFkZGluZy10b3A6IDE2cHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE2cHg7CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAudmlldy1jb250cm9sIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLyogTGF5b3V0IG11c3QgYmUgaG9yaXpvbnRhbCwgaS5lLiBpdGVtcyBhcnJhbmdlZCBpbiBhIHJvdy4gSWYgaXRlbXMgY2Fubm90IGZpdCBpbiBhIHJvdywKICAgICAgICogdGhleSBzaG91bGQgYmUgbW92ZWQgdG8gbmV4dCBsaW5lLiBBbGwgaXRlbXMgbXVzdCBiZSBzcXVhcmUgYXQgYWxsIHRpbWVzLiBNaW5pbXVtIHNpemUgb2YKICAgICAgICogdGhlIGl0ZW0gaXMgNDgwcHguIFRoaXMgbWVhbnMgdGhhdCBtYXhpbXVtIHNpemUgb2YgdGhlIGl0ZW0gbXVzdCBiZSA0ODBweCArIDQ3OXB4ID0gOTU5cHguCiAgICAgICAqICovCiAgICAgIC5ob3Jpem9udGFsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgIHRmLW1lc2gtbG9hZGVyIHsKICAgICAgICB3aWR0aDogNDgwcHg7CiAgICAgICAgZmxleC1iYXNpczogNDgwcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0ic2V0dGluZ3MiPgogICAgICA8aDI+U2V0dGluZ3M8L2gyPgogICAgICA8cGFwZXItY2hlY2tib3ggaWQ9ImF1dG8tcmVsb2FkLWNoZWNrYm94IiBjaGVja2VkPSJ7e2F1dG9SZWxvYWRFbmFibGVkfX0iPgogICAgICAgIFJlbG9hZCBkYXRhIGV2ZXJ5IDxzcGFuPltbYXV0b1JlbG9hZEludGVydmFsU2Vjc11dPC9zcGFuPnMuCiAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0icGFnaW5hdGlvbkxpbWl0SW5wdXQiIGxhYmVsPSJQYWdpbmF0aW9uIGxpbWl0IiBhbHdheXMtZmxvYXQtbGFiZWwgdHlwZT0ibnVtYmVyIiBtaW49IjEiIHN0ZXA9IjEiIG9uLWNoYW5nZT0iX3BhZ2luYXRpb25MaW1pdENoYW5nZWQiIG9uLXZhbHVlLWNoYW5nZWQ9Il9wYWdpbmF0aW9uTGltaXRWYWxpZGF0ZSI+PC9wYXBlci1pbnB1dD4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHBhcGVyLWhlYWRlci1wYW5lbD4KICAgICAgPHBhcGVyLXRvb2xiYXIgaWQ9InRvb2xiYXIiIHNsb3Q9ImhlYWRlciIgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgPGRpdiBpZD0idG9vbGJhci1jb250ZW50IiBzbG90PSJ0b3AiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaG9tZVBhdGhdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaG9tZVBhdGhdXSI+CiAgICAgICAgICAgIDxhIGhyZWY9IltbX2hvbWVQYXRoXV0iIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvYT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWRdXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0b29sYmFyLW1lc3NhZ2UiPgogICAgICAgICAgICAgIExvYWRpbmcgYWN0aXZlIGRhc2hib2FyZHPigKYKICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZF1dIj4KICAgICAgICAgICAgPHBhcGVyLXRhYnMgbm9pbmsgc2Nyb2xsYWJsZSBzZWxlY3RlZD0ie3tfc2VsZWN0ZWREYXNoYm9hcmR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9ImRhdGEtZGFzaGJvYXJkIj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19kYXNoYm9hcmREYXRhXV0iIGFzPSJkYXNoYm9hcmREYXR1bSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzRGFzaGJvYXJkQWN0aXZlKGRpc2FibGVkRGFzaGJvYXJkcywgX2FjdGl2ZURhc2hib2FyZHMsIGRhc2hib2FyZERhdHVtKV1dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRhYiBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iIHRpdGxlPSJbW2Rhc2hib2FyZERhdHVtLnRhYk5hbWVdXSI+CiAgICAgICAgICAgICAgICAgICAgW1tkYXNoYm9hcmREYXR1bS50YWJOYW1lXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItdGFicz4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pbmFjdGl2ZURhc2hib2FyZHNFeGlzdChfZGFzaGJvYXJkRGF0YSwgZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcyldXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IklOQUNUSVZFIiBuby1sYWJlbC1mbG9hdCBub2luayBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEycHgiPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggaWQ9ImluYWN0aXZlLWRhc2hib2FyZHMtbWVudSIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkRGFzaGJvYXJkfX0iIGF0dHItZm9yLXNlbGVjdGVkPSJkYXRhLWRhc2hib2FyZCI+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIj4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzRGFzaGJvYXJkSW5hY3RpdmUoZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcywgZGFzaGJvYXJkRGF0dW0pXV0iIHJlc3RhbXA+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iPltbZGFzaGJvYXJkRGF0dW0udGFiTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9Imdsb2JhbC1hY3Rpb25zIj4KICAgICAgICAgICAgPHNsb3QgbmFtZT0iaW5qZWN0ZWQtaGVhZGVyLWl0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpZD0icmVsb2FkLWJ1dHRvbiIgY2xhc3MkPSJbW19nZXREYXRhUmVmcmVzaGluZ0NsYXNzKF9yZWZyZXNoaW5nKV1dIiBkaXNhYmxlZCQ9IltbX2lzUmVsb2FkRGlzYWJsZWRdXSIgaWNvbj0icmVmcmVzaCIgb24tdGFwPSJyZWxvYWQiIHRpdGxlJD0iTGFzdCB1cGRhdGVkOiBbW19sYXN0UmVsb2FkVGltZVNob3J0XV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncyIgb24tdGFwPSJvcGVuU2V0dGluZ3MiIGlkPSJzZXR0aW5ncy1idXR0b24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiB0YWJpbmRleD0iLTEiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci10b29sYmFyPgoKICAgICAgPGRpdiBpZD0iY29udGVudC1wYW5lIiBjbGFzcz0iZml0Ij4KICAgICAgICA8c2xvdCBuYW1lPSJpbmplY3RlZC1vdmVydmlldyI+PC9zbG90PgogICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz5GYWlsZWQgdG8gbG9hZCB0aGUgc2V0IG9mIGFjdGl2ZSBkYXNoYm9hcmRzLjwvaDM+CiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBUaGlzIGNhbiBvY2N1ciBpZiB0aGUgVGVuc29yQm9hcmQgYmFja2VuZCBpcyBubyBsb25nZXIgcnVubmluZy4KICAgICAgICAgICAgICAgIFBlcmhhcHMgdGhpcyBwYWdlIGlzIGNhY2hlZD8KICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgdGhhdCB5b3XigJl2ZSBmaXhlZCB0aGUgcHJvYmxlbSwgY2xpY2sgdGhlIHJlbG9hZAogICAgICAgICAgICAgICAgYnV0dG9uIGluIHRoZSB0b3AtcmlnaHQuCiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbYXV0b1JlbG9hZEVuYWJsZWRdXSI+CiAgICAgICAgICAgICAgICAgIFdl4oCZbGwgdHJ5IHRvIHJlbG9hZCBldmVyeQogICAgICAgICAgICAgICAgICBbW2F1dG9SZWxvYWRJbnRlcnZhbFNlY3NdXSZuYnNwO3NlY29uZHMgYXMgd2VsbC4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgCgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGk+TGFzdCByZWxvYWQ6IFtbX2xhc3RSZWxvYWRUaW1lXV08L2k+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFMb2NhdGlvbl1dIj4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT48cD4KICAgICAgICAgICAgICAgICAgICA8aT5Mb2cgZGlyZWN0b3J5OgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRhdGFfbG9jYXRpb24iPltbX2RhdGFMb2NhdGlvbl1dPC9zcGFuPjwvaT4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zaG93Tm9EYXNoYm9hcmRzTWVzc2FnZV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0id2FybmluZy1tZXNzYWdlIj4KICAgICAgICAgICAgICA8aDM+Tm8gZGFzaGJvYXJkcyBhcmUgYWN0aXZlIGZvciB0aGUgY3VycmVudCBkYXRhIHNldC48L2gzPgogICAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjxwPgogICAgICAgICAgICAgICAgICAgIDxpPkRhdGEgbG9jYXRpb246CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGF0YV9sb2NhdGlvbiI+W1tfZGF0YUxvY2F0aW9uXV08L3NwYW4+PC9pPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3dOb1N1Y2hEYXNoYm9hcmRNZXNzYWdlXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz4KICAgICAgICAgICAgICAgIFRoZXJl4oCZcyBubyBkYXNoYm9hcmQgYnkgdGhlIG5hbWUgb2YKICAgICAgICAgICAgICAgIOKAnDx0dD5bW19zZWxlY3RlZERhc2hib2FyZF1dPC90dD4u4oCdCiAgICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNMb2FkZWRdXSI+CiAgICAgICAgICAgICAgICA8cD5Zb3UgY2FuIHNlbGVjdCBhIGRhc2hib2FyZCBmcm9tIHRoZSBsaXN0IGFib3ZlLgoKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxpPkxhc3QgcmVsb2FkOiBbW19sYXN0UmVsb2FkVGltZV1dPC9pPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTG9jYXRpb25dXSI+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+PHA+CiAgICAgICAgICAgICAgICAgICAgPGk+RGF0YSBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkYXRhX2xvY2F0aW9uIj5bW19kYXRhTG9jYXRpb25dXTwvc3Bhbj48L2k+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpZD0iZGFzaGJvYXJkcy10ZW1wbGF0ZSIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIiBvbi1kb20tY2hhbmdlPSJfb25UZW1wbGF0ZUNoYW5nZWQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtY29udGFpbmVyIiBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iIGRhdGEtc2VsZWN0ZWQkPSJbW19zZWxlY3RlZFN0YXR1cyhfc2VsZWN0ZWREYXNoYm9hcmQsIGRhc2hib2FyZERhdHVtLnBsdWdpbildXSI+CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS0xMDApOwogICAgICB9CgogICAgICAjdG9vbGJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKAogICAgICAgICAgLS10Yi10b29sYmFyLWJhY2tncm91bmQtY29sb3IsCiAgICAgICAgICB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKQogICAgICAgICk7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDZweDsKICAgICAgICAvKiBJbmNyZWFzZSBjbGlja2FibGUgYXJlYSBmb3IgY2FzZSB3aGVyZSB0aXRsZSBpcyBhbiBhbmNob3IuICovCiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICAgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZGlzcGxheTogdmFyKC0tdGItdG9vbGJhci10aXRsZS1kaXNwbGF5LCBibG9jayk7CiAgICAgIH0KCiAgICAgIGEudG9vbGJhci10aXRsZSB7CiAgICAgICAgLyogT3ZlcnJpZGUgZGVmYXVsdCBhbmNob3IgY29sb3IuICovCiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogT3ZlcnJpZGUgZGVmYXVsdCBhbmNob3IgdGV4dC1kZWNvcmF0aW9uLiAqLwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItbWVzc2FnZSB7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICBwYXBlci10YWJzIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLXRhYnMtY29udGVudDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItZHJvcGRvd24tbWVudS1pY29uOiB7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSBwYXBlci1pdGVtIHsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9CgogICAgICAjaW5hY3RpdmUtZGFzaGJvYXJkcy1tZW51IHsKICAgICAgICAtLXBhcGVyLWxpc3Rib3gtYmFja2dyb3VuZC1jb2xvcjogdmFyKAogICAgICAgICAgLS10Yi10b29sYmFyLWJhY2tncm91bmQtY29sb3IsCiAgICAgICAgICB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKQogICAgICAgICk7CiAgICAgICAgLS1wYXBlci1saXN0Ym94LWNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmdsb2JhbC1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgLyogRW5zdXJlIHRoYXQgaWNvbnMgc3RheSBhbGlnbmVkICovCiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmdsb2JhbC1hY3Rpb25zIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgI3Rvb2xiYXItY29udGVudCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgI2NvbnRlbnQtcGFuZSB7CiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0cmV0Y2g7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNjb250ZW50IHsKICAgICAgICBmbGV4OiAxIDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmRhc2hib2FyZC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLyogSGlkZSB1bnNlbGVjdGVkIGRhc2hib2FyZHMuIFdlIHN0aWxsIGRpc3BsYXkgdGhlbSB3aXRoaW4gYSBjb250YWluZXIKICAgICAgICAgb2YgaGVpZ2h0IDAgc2luY2UgUGxvdHRhYmxlIHByb2R1Y2VzIGRlZ2VuZXJhdGUgY2hhcnRzIHdoZW4gY2hhcnRzIGFyZQogICAgICAgICByZWxvYWRlZCB3aGlsZSBub3QgZGlzcGxheWVkLiAqLwogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lcjpub3QoW2RhdGEtc2VsZWN0ZWRdKSB7CiAgICAgICAgbWF4LWhlaWdodDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAvKiogV2UgZnVydGhlciBtYWtlIGNvbnRhaW5lcnMgaW52aXNpYmxlLiBTb21lIGVsZW1lbnRzIG1heSBhbmNob3IgdG8KICAgICAgICAgICAgdGhlIHZpZXdwb3J0IGluc3RlYWQgb2YgdGhlIGNvbnRhaW5lciwgaW4gd2hpY2ggY2FzZSBzZXR0aW5nIHRoZSBtYXgKICAgICAgICAgICAgaGVpZ2h0IGhlcmUgdG8gMCB3aWxsIG5vdCBoaWRlIHRoZW0uICovCiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lciBpZnJhbWUgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC53YXJuaW5nLW1lc3NhZ2UgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CgogICAgICBbZGlzYWJsZWRdIHsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAjcmVsb2FkLWJ1dHRvbi5yZWZyZXNoaW5nIHsKICAgICAgICBhbmltYXRpb246IHJvdGF0ZSAycyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcm90YXRlIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCiAgPGJvZHk+CiAgICA8dGYtdGVuc29yYm9hcmQgdXNlLWhhc2ggYnJhbmQ9IlRlbnNvckJvYXJkIj48L3RmLXRlbnNvcmJvYXJkPgogIAoKPHNjcmlwdCBzcmM9ImluZGV4LmpzIj48L3NjcmlwdD4=", + "ok": true, + "headers": [ + [ + "content-type", + "text/html; charset=utf-8" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/index.js": { + "data": "dmFyIENMT1NVUkVfTk9fREVQUyA9IHRydWU7Ci8vIENvcHlyaWdodCAyMDA2IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLy8KLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi8vCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTLUlTIiBCQVNJUywKLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgovKioKICogQGZpbGVvdmVydmlldyBCb290c3RyYXAgZm9yIHRoZSBHb29nbGUgSlMgTGlicmFyeSAoQ2xvc3VyZSkuCiAqCiAqIEluIHVuY29tcGlsZWQgbW9kZSBiYXNlLmpzIHdpbGwgYXR0ZW1wdCB0byBsb2FkIENsb3N1cmUncyBkZXBzIGZpbGUsIHVubGVzcwogKiB0aGUgZ2xvYmFsIDxjb2RlPkNMT1NVUkVfTk9fREVQUzwvY29kZT4gaXMgc2V0IHRvIHRydWUuICBUaGlzIGFsbG93cyBwcm9qZWN0cwogKiB0byBpbmNsdWRlIHRoZWlyIG93biBkZXBzIGZpbGUocykgZnJvbSBkaWZmZXJlbnQgbG9jYXRpb25zLgogKgogKiBBdm9pZCBpbmNsdWRpbmcgYmFzZS5qcyBtb3JlIHRoYW4gb25jZS4gVGhpcyBpcyBzdHJpY3RseSBkaXNjb3VyYWdlZCBhbmQgbm90CiAqIHN1cHBvcnRlZC4gZ29vZy5yZXF1aXJlKC4uLikgd29uJ3Qgd29yayBwcm9wZXJseSBpbiB0aGF0IGNhc2UuCiAqCiAqIEBwcm92aWRlR29vZwogKi8KCgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gT3ZlcnJpZGRlbiB0byB0cnVlIGJ5IHRoZSBjb21waWxlci4KICovCnZhciBDT01QSUxFRCA9IGZhbHNlOwoKCi8qKgogKiBCYXNlIG5hbWVzcGFjZSBmb3IgdGhlIENsb3N1cmUgbGlicmFyeS4gIENoZWNrcyB0byBzZWUgZ29vZyBpcyBhbHJlYWR5CiAqIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgc2NvcGUgYmVmb3JlIGFzc2lnbmluZyB0byBwcmV2ZW50IGNsb2JiZXJpbmcgaWYKICogYmFzZS5qcyBpcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuCiAqCiAqIEBjb25zdAogKi8KdmFyIGdvb2cgPSBnb29nIHx8IHt9OwoKLyoqCiAqIFJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4KICogaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi85LjAvaW5kZXguaHRtbCNzZWMtZ2xvYmFsLW9iamVjdAogKgogKiBNb3JlIGluZm8gb24gdGhpcyBpbXBsZW1lbnRhdGlvbiBoZXJlOgogKiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFOQWVXNFdrN0k3RlYwWTJ0Y1VGdlFkR01jODlrMnZkZ1NYSW53OF9udkNJL2VkaXQKICoKICogQGNvbnN0CiAqIEBzdXBwcmVzcyB7dW5kZWZpbmVkVmFyc30gc2VsZiB3b24ndCBiZSByZWZlcmVuY2VkIHVubGVzcyBgdGhpc2AgaXMgZmFsc3kuCiAqIEB0eXBlIHshR2xvYmFsfQogKi8KZ29vZy5nbG9iYWwgPQogICAgLy8gQ2hlY2sgYHRoaXNgIGZpcnN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgIC8vIFZhbGlkIHVubGVzcyBydW5uaW5nIGFzIGFuIEVTIG1vZHVsZSBvciBpbiBhIGZ1bmN0aW9uIHdyYXBwZXIgY2FsbGVkCiAgICAvLyAgIHdpdGhvdXQgc2V0dGluZyBgdGhpc2AgcHJvcGVybHkuCiAgICAvLyBOb3RlIHRoYXQgYmFzZS5qcyBjYW4ndCB1c2VmdWxseSBiZSBpbXBvcnRlZCBhcyBhbiBFUyBtb2R1bGUsIGJ1dCBpdCBtYXkKICAgIC8vIGJlIGNvbXBpbGVkIGludG8gYnVuZGxlcyB0aGF0IGFyZSBsb2FkYWJsZSBhcyBFUyBtb2R1bGVzLgogICAgdGhpcyB8fAogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9zZWxmCiAgICAvLyBGb3IgaW4tcGFnZSBicm93c2VyIGVudmlyb25tZW50cyBhbmQgd29ya2Vycy4KICAgIHNlbGY7CgoKLyoqCiAqIEEgaG9vayBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmaW5lIHZhbHVlcyBpbiB1bmNvbXBpbGVkIG1vZGUuCiAqCiAqIEluIHVuY29tcGlsZWQgbW9kZSwgYENMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTYCBtYXkgYmUgZGVmaW5lZCBiZWZvcmUKICogbG9hZGluZyBiYXNlLmpzLiAgSWYgYSBrZXkgaXMgZGVmaW5lZCBpbiBgQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVNgLAogKiBgZ29vZy5kZWZpbmVgIHdpbGwgdXNlIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZhbHVlLiAgVGhpcwogKiBhbGxvd3MgZmxhZ3MgdG8gYmUgb3ZlcndyaXR0ZW4gd2l0aG91dCBjb21waWxhdGlvbiAodGhpcyBpcyBub3JtYWxseQogKiBhY2NvbXBsaXNoZWQgd2l0aCB0aGUgY29tcGlsZXIncyAiZGVmaW5lIiBmbGFnKS4KICoKICogRXhhbXBsZToKICogPHByZT4KICogICB2YXIgQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVMgPSB7J2dvb2cuREVCVUcnOiBmYWxzZX07CiAqIDwvcHJlPgogKgogKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgKHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik+fHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTOwoKCi8qKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmluZSB2YWx1ZXMgaW4gdW5jb21waWxlZCBvciBjb21waWxlZCBtb2RlLAogKiBsaWtlIENMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTIGJ1dCBlZmZlY3RpdmUgaW4gY29tcGlsZWQgY29kZS4gIEluCiAqIHVuY29tcGlsZWQgY29kZSBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyB0YWtlcyBwcmVjZWRlbmNlLgogKgogKiBBbHNvIHVubGlrZSBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyB0aGUgdmFsdWVzIG11c3QgYmUgbnVtYmVyLCBib29sZWFuIG9yCiAqIHN0cmluZyBsaXRlcmFscyBvciB0aGUgY29tcGlsZXIgd2lsbCBlbWl0IGFuIGVycm9yLgogKgogKiBXaGlsZSBhbnkgQGRlZmluZSB2YWx1ZSBtYXkgYmUgc2V0LCBvbmx5IHRob3NlIHNldCB3aXRoIGdvb2cuZGVmaW5lIHdpbGwgYmUKICogZWZmZWN0aXZlIGZvciB1bmNvbXBpbGVkIGNvZGUuCiAqCiAqIEV4YW1wbGU6CiAqIDxwcmU+CiAqICAgdmFyIENMT1NVUkVfREVGSU5FUyA9IHsnZ29vZy5ERUJVRyc6IGZhbHNlfSA7CiAqIDwvcHJlPgogKgogKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgKHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik+fHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUzsKCgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgbm90IHVuZGVmaW5lZC4KICoKICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBkZWZpbmVkLgogKiBAZGVwcmVjYXRlZCBVc2UgYHZhbCAhPT0gdW5kZWZpbmVkYCBpbnN0ZWFkLgogKi8KZ29vZy5pc0RlZiA9IGZ1bmN0aW9uKHZhbCkgewogIC8vIHZvaWQgMCBhbHdheXMgZXZhbHVhdGVzIHRvIHVuZGVmaW5lZCBhbmQgaGVuY2Ugd2UgZG8gbm90IG5lZWQgdG8gZGVwZW5kIG9uCiAgLy8gdGhlIGRlZmluaXRpb24gb2YgdGhlIGdsb2JhbCB2YXJpYWJsZSBuYW1lZCAndW5kZWZpbmVkJy4KICByZXR1cm4gdmFsICE9PSB2b2lkIDA7Cn07CgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYSBzdHJpbmcuCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYSBzdHJpbmcuCiAqIEBkZXByZWNhdGVkIFVzZSBgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZydgIGluc3RlYWQuCiAqLwpnb29nLmlzU3RyaW5nID0gZnVuY3Rpb24odmFsKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gJ3N0cmluZyc7Cn07CgoKLyoqCiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGEgYm9vbGVhbi4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBib29sZWFuLgogKiBAZGVwcmVjYXRlZCBVc2UgYHR5cGVvZiB2YWwgPT09ICdib29sZWFuJ2AgaW5zdGVhZC4KICovCmdvb2cuaXNCb29sZWFuID0gZnVuY3Rpb24odmFsKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gJ2Jvb2xlYW4nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIG51bWJlci4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhIG51bWJlci4KICogQGRlcHJlY2F0ZWQgVXNlIGB0eXBlb2YgdmFsID09PSAnbnVtYmVyJ2AgaW5zdGVhZC4KICovCmdvb2cuaXNOdW1iZXIgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gdHlwZW9mIHZhbCA9PSAnbnVtYmVyJzsKfTsKCgovKioKICogQnVpbGRzIGFuIG9iamVjdCBzdHJ1Y3R1cmUgZm9yIHRoZSBwcm92aWRlZCBuYW1lc3BhY2UgcGF0aCwgZW5zdXJpbmcgdGhhdAogKiBuYW1lcyB0aGF0IGFscmVhZHkgZXhpc3QgYXJlIG5vdCBvdmVyd3JpdHRlbi4gRm9yIGV4YW1wbGU6CiAqICJhLmIuYyIgLT4gYSA9IHt9O2EuYj17fTthLmIuYz17fTsKICogVXNlZCBieSBnb29nLnByb3ZpZGUgYW5kIGdvb2cuZXhwb3J0U3ltYm9sLgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBvYmplY3QgdGhhdCB0aGlzIGZpbGUgZGVmaW5lcy4KICogQHBhcmFtIHsqPX0gb3B0X29iamVjdCB0aGUgb2JqZWN0IHRvIGV4cG9zZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmplY3RUb0V4cG9ydFRvIFRoZSBvYmplY3QgdG8gYWRkIHRoZSBwYXRoIHRvOyBkZWZhdWx0CiAqICAgICBpcyBgZ29vZy5nbG9iYWxgLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5leHBvcnRQYXRoXyA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmplY3QsIG9wdF9vYmplY3RUb0V4cG9ydFRvKSB7CiAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgnLicpOwogIHZhciBjdXIgPSBvcHRfb2JqZWN0VG9FeHBvcnRUbyB8fCBnb29nLmdsb2JhbDsKCiAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgZXhoaWJpdHMgc3RyYW5nZSBiZWhhdmlvciB3aGVuIHRocm93aW5nIGVycm9ycyBmcm9tCiAgLy8gbWV0aG9kcyBleHRlcm5lZCBpbiB0aGlzIG1hbm5lci4gIFNlZSB0aGUgdGVzdEV4cG9ydFN5bWJvbEV4Y2VwdGlvbnMgaW4KICAvLyBiYXNlX3Rlc3QuaHRtbCBmb3IgYW4gZXhhbXBsZS4KICBpZiAoIShwYXJ0c1swXSBpbiBjdXIpICYmIHR5cGVvZiBjdXIuZXhlY1NjcmlwdCAhPSAndW5kZWZpbmVkJykgewogICAgY3VyLmV4ZWNTY3JpcHQoJ3ZhciAnICsgcGFydHNbMF0pOwogIH0KCiAgZm9yICh2YXIgcGFydDsgcGFydHMubGVuZ3RoICYmIChwYXJ0ID0gcGFydHMuc2hpZnQoKSk7KSB7CiAgICBpZiAoIXBhcnRzLmxlbmd0aCAmJiBvcHRfb2JqZWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgLy8gbGFzdCBwYXJ0IGFuZCB3ZSBoYXZlIGFuIG9iamVjdDsgdXNlIGl0CiAgICAgIGN1cltwYXJ0XSA9IG9wdF9vYmplY3Q7CiAgICB9IGVsc2UgaWYgKGN1cltwYXJ0XSAmJiBjdXJbcGFydF0gIT09IE9iamVjdC5wcm90b3R5cGVbcGFydF0pIHsKICAgICAgY3VyID0gY3VyW3BhcnRdOwogICAgfSBlbHNlIHsKICAgICAgY3VyID0gY3VyW3BhcnRdID0ge307CiAgICB9CiAgfQp9OwoKCi8qKgogKiBEZWZpbmVzIGEgbmFtZWQgdmFsdWUuIEluIHVuY29tcGlsZWQgbW9kZSwgdGhlIHZhbHVlIGlzIHJldHJpZXZlZCBmcm9tCiAqIENMT1NVUkVfREVGSU5FUyBvciBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyBpZiB0aGUgb2JqZWN0IGlzIGRlZmluZWQgYW5kCiAqIGhhcyB0aGUgcHJvcGVydHkgc3BlY2lmaWVkLCBhbmQgb3RoZXJ3aXNlIHVzZWQgdGhlIGRlZmluZWQgZGVmYXVsdFZhbHVlLgogKiBXaGVuIGNvbXBpbGVkIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZSBjb21waWxlciBvcHRpb25zIG9yIHRoZQogKiB2YWx1ZSBzZXQgaW4gdGhlIENMT1NVUkVfREVGSU5FUyBvYmplY3QuIFJldHVybnMgdGhlIGRlZmluZWQgdmFsdWUgc28gdGhhdCBpdAogKiBjYW4gYmUgdXNlZCBzYWZlbHkgaW4gbW9kdWxlcy4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB0eXBlIE1VU1QgYmUgZWl0aGVyCiAqIGJvb2xlYW4sIG51bWJlciwgb3Igc3RyaW5nLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZGlzdGluZ3Vpc2hlZCBuYW1lIHRvIHByb3ZpZGUuCiAqIEBwYXJhbSB7VH0gZGVmYXVsdFZhbHVlCiAqIEByZXR1cm4ge1R9IFRoZSBkZWZpbmVkIHZhbHVlLgogKiBAdGVtcGxhdGUgVAogKi8KZ29vZy5kZWZpbmUgPSBmdW5jdGlvbihuYW1lLCBkZWZhdWx0VmFsdWUpIHsKICB2YXIgdmFsdWUgPSBkZWZhdWx0VmFsdWU7CiAgaWYgKCFDT01QSUxFRCkgewogICAgdmFyIHVuY29tcGlsZWREZWZpbmVzID0gZ29vZy5nbG9iYWwuQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVM7CiAgICB2YXIgZGVmaW5lcyA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUzsKICAgIGlmICh1bmNvbXBpbGVkRGVmaW5lcyAmJgogICAgICAgIC8vIEFudGkgRE9NLWNsb2JiZXJpbmcgcnVudGltZSBjaGVjayAoYi8zNzczNjU3NikuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLyAodW5jb21waWxlZERlZmluZXMpLm5vZGVUeXBlID09PSB1bmRlZmluZWQgJiYKICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodW5jb21waWxlZERlZmluZXMsIG5hbWUpKSB7CiAgICAgIHZhbHVlID0gdW5jb21waWxlZERlZmluZXNbbmFtZV07CiAgICB9IGVsc2UgaWYgKAogICAgICAgIGRlZmluZXMgJiYKICAgICAgICAvLyBBbnRpIERPTS1jbG9iYmVyaW5nIHJ1bnRpbWUgY2hlY2sgKGIvMzc3MzY1NzYpLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8gKGRlZmluZXMpLm5vZGVUeXBlID09PSB1bmRlZmluZWQgJiYKICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmaW5lcywgbmFtZSkpIHsKICAgICAgdmFsdWUgPSBkZWZpbmVzW25hbWVdOwogICAgfQogIH0KICByZXR1cm4gdmFsdWU7Cn07CgoKLyoqCiAqIEBkZWZpbmUge251bWJlcn0gSW50ZWdlciB5ZWFyIGluZGljYXRpbmcgdGhlIHNldCBvZiBicm93c2VyIGZlYXR1cmVzIHRoYXQgYXJlCiAqIGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VudC4gIFRoaXMgaXMgZGVmaW5lZCB0byBpbmNsdWRlIGV4YWN0bHkgZmVhdHVyZXMgdGhhdAogKiB3b3JrIGNvcnJlY3RseSBvbiBhbGwgIm1vZGVybiIgYnJvd3NlcnMgdGhhdCBhcmUgc3RhYmxlIG9uIEphbnVhcnkgMSBvZiB0aGUKICogc3BlY2lmaWVkIHllYXIuICBGb3IgZXhhbXBsZSwKICogYGBganMKICogaWYgKGdvb2cuRkVBVFVSRVNFVF9ZRUFSID49IDIwMTkpIHsKICogICAvLyB1c2UgQVBJcyBrbm93biB0byBiZSBhdmFpbGFibGUgb24gYWxsIG1ham9yIHN0YWJsZSBicm93c2VycyBKYW4gMSwgMjAxOQogKiB9IGVsc2UgewogKiAgIC8vIHBvbHlmaWxsIGZvciBvbGRlciBicm93c2VycwogKiB9CiAqIGBgYAogKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHRoZSBwcmltYXJ5IGRlZmluZSBmb3IgcmVtb3ZpbmcKICogdW5uZWNlc3NhcnkgYnJvd3NlciBjb21wYXRpYmlsaXR5IGNvZGUgKHN1Y2ggYXMgcG9ueWZpbGxzIGFuZCB3b3JrYXJvdW5kcyksCiAqIGFuZCBzaG91bGQgaW5mb3JtIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBtb3N0IG90aGVyIGRlZmluZXM6CiAqIGBgYGpzCiAqIGNvbnN0IEFTU1VNRV9OQVRJVkVfUFJPTUlTRSA9CiAqICAgICBnb29nLmRlZmluZSgnQVNTVU1FX05BVElWRV9QUk9NSVNFJywgZ29vZy5GRUFUVVJFU0VUX1lFQVIgPj0gMjAxNik7CiAqIGBgYAogKgogKiBUaGUgZGVmYXVsdCBhc3N1bXB0aW9uIGlzIHRoYXQgSUU5IGlzIHRoZSBsb3dlc3Qgc3VwcG9ydGVkIGJyb3dzZXIsIHdoaWNoIHdhcwogKiBmaXJzdCBhdmFpbGFibGUgSmFuIDEsIDIwMTIuCiAqCiAqIFRPRE8odXNlcik6IFJlZmVyZW5jZSBtb3JlIHRob3JvdWdoIGRvY3VtZW50YXRpb24gd2hlbiBpdCdzIGF2YWlsYWJsZS4KICovCmdvb2cuRkVBVFVSRVNFVF9ZRUFSID0gZ29vZy5kZWZpbmUoJ2dvb2cuRkVBVFVSRVNFVF9ZRUFSJywgMjAxMik7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IERFQlVHIGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBkZWJ1Z2dpbmcgY29kZQogKiB0aGF0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gYSBwcm9kdWN0aW9uLiBJdCBjYW4gYmUgZWFzaWx5IHN0cmlwcGVkCiAqIGJ5IHNwZWNpZnlpbmcgLS1kZWZpbmUgZ29vZy5ERUJVRz1mYWxzZSB0byB0aGUgQ2xvc3VyZSBDb21waWxlciBha2EKICogSlNDb21waWxlci4gRm9yIGV4YW1wbGUsIG1vc3QgdG9TdHJpbmcoKSBtZXRob2RzIHNob3VsZCBiZSBkZWNsYXJlZCBpbnNpZGUgYW4KICogImlmIChnb29nLkRFQlVHKSIgY29uZGl0aW9uYWwgYmVjYXVzZSB0aGV5IGFyZSBnZW5lcmFsbHkgdXNlZCBmb3IgZGVidWdnaW5nCiAqIHB1cnBvc2VzIGFuZCBpdCBpcyBkaWZmaWN1bHQgZm9yIHRoZSBKU0NvbXBpbGVyIHRvIHN0YXRpY2FsbHkgZGV0ZXJtaW5lCiAqIHdoZXRoZXIgdGhleSBhcmUgdXNlZC4KICovCmdvb2cuREVCVUcgPSBnb29nLmRlZmluZSgnZ29vZy5ERUJVRycsIHRydWUpOwoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IExPQ0FMRSBkZWZpbmVzIHRoZSBsb2NhbGUgYmVpbmcgdXNlZCBmb3IgY29tcGlsYXRpb24uIEl0IGlzCiAqIHVzZWQgdG8gc2VsZWN0IGxvY2FsZSBzcGVjaWZpYyBkYXRhIHRvIGJlIGNvbXBpbGVkIGluIGpzIGJpbmFyeS4gQlVJTEQgcnVsZQogKiBjYW4gc3BlY2lmeSB0aGlzIHZhbHVlIGJ5ICItLWRlZmluZSBnb29nLkxPQ0FMRT08bG9jYWxlX25hbWU+IiBhcyBhIGNvbXBpbGVyCiAqIG9wdGlvbi4KICoKICogVGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgbG9jYWxlIGNvZGUgZm9ybWF0IGlzIGltcG9ydGFudC4gWW91IHNob3VsZCB1c2UKICogdGhlIGNhbm9uaWNhbCBVbmljb2RlIGZvcm1hdCB3aXRoIGh5cGhlbiBhcyBhIGRlbGltaXRlci4gTGFuZ3VhZ2UgbXVzdCBiZQogKiBsb3dlcmNhc2UsIExhbmd1YWdlIFNjcmlwdCAtIENhcGl0YWxpemVkLCBSZWdpb24gLSBVUFBFUkNBU0UuCiAqIFRoZXJlIGFyZSBmZXcgZXhhbXBsZXM6IHB0LUJSLCBlbiwgZW4tVVMsIHNyLUxhdGluLUJPLCB6aC1IYW5zLUNOLgogKgogKiBTZWUgbW9yZSBpbmZvIGFib3V0IGxvY2FsZSBjb2RlcyBoZXJlOgogKiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS8jVW5pY29kZV9MYW5ndWFnZV9hbmRfTG9jYWxlX0lkZW50aWZpZXJzCiAqCiAqIEZvciBsYW5ndWFnZSBjb2RlcyB5b3Ugc2hvdWxkIHVzZSB2YWx1ZXMgZGVmaW5lZCBieSBJU08gNjkzLTEuIFNlZSBpdCBoZXJlCiAqIGh0dHA6Ly93d3cudzMub3JnL1dBSS9FUi9JRy9lcnQvaXNvNjM5Lmh0bS4gVGhlcmUgaXMgb25seSBvbmUgZXhjZXB0aW9uIGZyb20KICogdGhpcyBydWxlOiB0aGUgSGVicmV3IGxhbmd1YWdlLiBGb3IgbGVnYWN5IHJlYXNvbnMgdGhlIG9sZCBjb2RlIChpdykgc2hvdWxkCiAqIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbmV3IGNvZGUgKGhlKS4KICoKICovCmdvb2cuTE9DQUxFID0gZ29vZy5kZWZpbmUoJ2dvb2cuTE9DQUxFJywgJ2VuJyk7ICAvLyBkZWZhdWx0IHRvIGVuCgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBjb2RlIGlzIHJ1bm5pbmcgb24gdHJ1c3RlZCBzaXRlcy4KICoKICogT24gdW50cnVzdGVkIHNpdGVzLCBzZXZlcmFsIG5hdGl2ZSBmdW5jdGlvbnMgY2FuIGJlIGRlZmluZWQgb3Igb3ZlcnJpZGRlbiBieQogKiBleHRlcm5hbCBsaWJyYXJpZXMgbGlrZSBQcm90b3R5cGUsIERhdGVqcywgYW5kIEpRdWVyeSBhbmQgc2V0dGluZyB0aGlzIGZsYWcKICogdG8gZmFsc2UgZm9yY2VzIGNsb3N1cmUgdG8gdXNlIGl0cyBvd24gaW1wbGVtZW50YXRpb25zIHdoZW4gcG9zc2libGUuCiAqCiAqIElmIHlvdXIgSmF2YVNjcmlwdCBjYW4gYmUgbG9hZGVkIGJ5IGEgdGhpcmQgcGFydHkgc2l0ZSBhbmQgeW91IGFyZSB3YXJ5IGFib3V0CiAqIHJlbHlpbmcgb24gbm9uLXN0YW5kYXJkIGltcGxlbWVudGF0aW9ucywgc3BlY2lmeQogKiAiLS1kZWZpbmUgZ29vZy5UUlVTVEVEX1NJVEU9ZmFsc2UiIHRvIHRoZSBjb21waWxlci4KICovCmdvb2cuVFJVU1RFRF9TSVRFID0gZ29vZy5kZWZpbmUoJ2dvb2cuVFJVU1RFRF9TSVRFJywgdHJ1ZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgYSBwcm9qZWN0IGlzIGV4cGVjdGVkIHRvIGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUuCiAqCiAqIFRoaXMgZGVmaW5lIGNhbiBiZSB1c2VkIHRvIHRyaWdnZXIgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBjb21wYXRpYmxlIHdpdGgKICogcnVubmluZyBpbiBFY21hU2NyaXB0IFN0cmljdCBtb2RlIG9yIHdhcm4gYWJvdXQgdW5hdmFpbGFibGUgZnVuY3Rpb25hbGl0eS4KICogQHNlZSBodHRwczovL2dvby5nbC9QdWRRNHkKICoKICovCmdvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRSA9IGdvb2cuZGVmaW5lKCdnb29nLlNUUklDVF9NT0RFX0NPTVBBVElCTEUnLCBmYWxzZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgY29kZSB0aGF0IGNhbGxzIHtAbGluayBnb29nLnNldFRlc3RPbmx5fSBzaG91bGQKICogICAgIGJlIGRpc2FsbG93ZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuCiAqLwpnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFID0KICAgIGdvb2cuZGVmaW5lKCdnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFJywgQ09NUElMRUQgJiYgIWdvb2cuREVCVUcpOwoKCi8qKgogKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIHVzZSBhIENocm9tZSBhcHAgQ1NQLWNvbXBsaWFudCBtZXRob2QgZm9yCiAqICAgICBsb2FkaW5nIHNjcmlwdHMgdmlhIGdvb2cucmVxdWlyZS4gQHNlZSBhcHBlbmRTY3JpcHRTcmNOb2RlXy4KICovCmdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyA9CiAgICBnb29nLmRlZmluZSgnZ29vZy5FTkFCTEVfQ0hST01FX0FQUF9TQUZFX1NDUklQVF9MT0FESU5HJywgZmFsc2UpOwoKCi8qKgogKiBEZWZpbmVzIGEgbmFtZXNwYWNlIGluIENsb3N1cmUuCiAqCiAqIEEgbmFtZXNwYWNlIG1heSBvbmx5IGJlIGRlZmluZWQgb25jZSBpbiBhIGNvZGViYXNlLiBJdCBtYXkgYmUgZGVmaW5lZCB1c2luZwogKiBnb29nLnByb3ZpZGUoKSBvciBnb29nLm1vZHVsZSgpLgogKgogKiBUaGUgcHJlc2VuY2Ugb2Ygb25lIG9yIG1vcmUgZ29vZy5wcm92aWRlKCkgY2FsbHMgaW4gYSBmaWxlIGluZGljYXRlcwogKiB0aGF0IHRoZSBmaWxlIGRlZmluZXMgdGhlIGdpdmVuIG9iamVjdHMvbmFtZXNwYWNlcy4KICogUHJvdmlkZWQgc3ltYm9scyBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4KICoKICogSW4gYWRkaXRpb24sIGdvb2cucHJvdmlkZSgpIGNyZWF0ZXMgdGhlIG9iamVjdCBzdHVicyBmb3IgYSBuYW1lc3BhY2UKICogKGZvciBleGFtcGxlLCBnb29nLnByb3ZpZGUoImdvb2cuZm9vLmJhciIpIHdpbGwgY3JlYXRlIHRoZSBvYmplY3QKICogZ29vZy5mb28uYmFyIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QpLgogKgogKiBCdWlsZCB0b29scyBhbHNvIHNjYW4gZm9yIHByb3ZpZGUvcmVxdWlyZS9tb2R1bGUgc3RhdGVtZW50cwogKiB0byBkaXNjZXJuIGRlcGVuZGVuY2llcywgYnVpbGQgZGVwZW5kZW5jeSBmaWxlcyAoc2VlIGRlcHMuanMpLCBldGMuCiAqCiAqIEBzZWUgZ29vZy5yZXF1aXJlCiAqIEBzZWUgZ29vZy5tb2R1bGUKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZXNwYWNlIHByb3ZpZGVkIGJ5IHRoaXMgZmlsZSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICovCmdvb2cucHJvdmlkZSA9IGZ1bmN0aW9uKG5hbWUpIHsKICBpZiAoZ29vZy5pc0luTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cucHJvdmlkZSBjYW5ub3QgYmUgdXNlZCB3aXRoaW4gYSBtb2R1bGUuJyk7CiAgfQogIGlmICghQ09NUElMRUQpIHsKICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzYW1lIG5hbWVzcGFjZSBpc24ndCBwcm92aWRlZCB0d2ljZS4KICAgIC8vIEEgZ29vZy5tb2R1bGUvZ29vZy5wcm92aWRlIG1hcHMgYSBnb29nLnJlcXVpcmUgdG8gYSBzcGVjaWZpYyBmaWxlCiAgICBpZiAoZ29vZy5pc1Byb3ZpZGVkXyhuYW1lKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hbWVzcGFjZSAiJyArIG5hbWUgKyAnIiBhbHJlYWR5IGRlY2xhcmVkLicpOwogICAgfQogIH0KCiAgZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKG5hbWUpOwp9OwoKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgcHJvdmlkZWQgYnkgdGhpcyBmaWxlIGluIHRoZSBmb3JtCiAqICAgICAiZ29vZy5wYWNrYWdlLnBhcnQiLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmogVGhlIG9iamVjdCB0byBlbWJlZCBpbiB0aGUgbmFtZXNwYWNlLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfID0gZnVuY3Rpb24obmFtZSwgb3B0X29iaikgewogIGlmICghQ09NUElMRUQpIHsKICAgIGRlbGV0ZSBnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bbmFtZV07CgogICAgdmFyIG5hbWVzcGFjZSA9IG5hbWU7CiAgICB3aGlsZSAoKG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5zdWJzdHJpbmcoMCwgbmFtZXNwYWNlLmxhc3RJbmRleE9mKCcuJykpKSkgewogICAgICBpZiAoZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZXNwYWNlKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGdvb2cuaW1wbGljaXROYW1lc3BhY2VzX1tuYW1lc3BhY2VdID0gdHJ1ZTsKICAgIH0KICB9CgogIGdvb2cuZXhwb3J0UGF0aF8obmFtZSwgb3B0X29iaik7Cn07CgoKLyoqCiAqIFJldHVybnMgQ1NQIG5vbmNlLCBpZiBzZXQgZm9yIGFueSBzY3JpcHQgdGFnLgogKiBAcGFyYW0gez9XaW5kb3c9fSBvcHRfd2luZG93IFRoZSB3aW5kb3cgY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSBub25jZS4KICogICAgIERlZmF1bHRzIHRvIGdsb2JhbCBjb250ZXh0LgogKiBAcmV0dXJuIHtzdHJpbmd9IENTUCBub25jZSBvciBlbXB0eSBzdHJpbmcgaWYgbm8gbm9uY2UgaXMgcHJlc2VudC4KICovCmdvb2cuZ2V0U2NyaXB0Tm9uY2UgPSBmdW5jdGlvbihvcHRfd2luZG93KSB7CiAgaWYgKG9wdF93aW5kb3cgJiYgb3B0X3dpbmRvdyAhPSBnb29nLmdsb2JhbCkgewogICAgcmV0dXJuIGdvb2cuZ2V0U2NyaXB0Tm9uY2VfKG9wdF93aW5kb3cuZG9jdW1lbnQpOwogIH0KICBpZiAoZ29vZy5jc3BOb25jZV8gPT09IG51bGwpIHsKICAgIGdvb2cuY3NwTm9uY2VfID0gZ29vZy5nZXRTY3JpcHROb25jZV8oZ29vZy5nbG9iYWwuZG9jdW1lbnQpOwogIH0KICByZXR1cm4gZ29vZy5jc3BOb25jZV87Cn07CgoKLyoqCiAqIEFjY29yZGluZyB0byB0aGUgQ1NQMyBzcGVjIGEgbm9uY2UgbXVzdCBiZSBhIHZhbGlkIGJhc2U2NCBzdHJpbmcuCiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDMvI2dyYW1tYXJkZWYtYmFzZTY0LXZhbHVlCiAqIEBwcml2YXRlIEBjb25zdAogKi8KZ29vZy5OT05DRV9QQVRURVJOXyA9IC9eW1x3Ky9fLV0rWz1dezAsMn0kLzsKCgovKioKICogQHByaXZhdGUgez9zdHJpbmd9CiAqLwpnb29nLmNzcE5vbmNlXyA9IG51bGw7CgoKLyoqCiAqIFJldHVybnMgQ1NQIG5vbmNlLCBpZiBzZXQgZm9yIGFueSBzY3JpcHQgdGFnLgogKiBAcGFyYW0geyFEb2N1bWVudH0gZG9jCiAqIEByZXR1cm4ge3N0cmluZ30gQ1NQIG5vbmNlIG9yIGVtcHR5IHN0cmluZyBpZiBubyBub25jZSBpcyBwcmVzZW50LgogKiBAcHJpdmF0ZQogKi8KZ29vZy5nZXRTY3JpcHROb25jZV8gPSBmdW5jdGlvbihkb2MpIHsKICB2YXIgc2NyaXB0ID0gZG9jLnF1ZXJ5U2VsZWN0b3IgJiYgZG9jLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtub25jZV0nKTsKICBpZiAoc2NyaXB0KSB7CiAgICAvLyBUcnkgdG8gZ2V0IHRoZSBub25jZSBmcm9tIHRoZSBJREwgcHJvcGVydHkgZmlyc3QsIGJlY2F1c2UgYnJvd3NlcnMgdGhhdAogICAgLy8gaW1wbGVtZW50IGFkZGl0aW9uYWwgbm9uY2UgcHJvdGVjdGlvbiBmZWF0dXJlcyAoY3VycmVudGx5IG9ubHkgQ2hyb21lKSB0bwogICAgLy8gcHJldmVudCBub25jZSBzdGVhbGluZyB2aWEgQ1NTIGRvIG5vdCBleHBvc2UgdGhlIG5vbmNlIHZpYSBhdHRyaWJ1dGVzLgogICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvaHRtbC9pc3N1ZXMvMjM2OQogICAgdmFyIG5vbmNlID0gc2NyaXB0Wydub25jZSddIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoJ25vbmNlJyk7CiAgICBpZiAobm9uY2UgJiYgZ29vZy5OT05DRV9QQVRURVJOXy50ZXN0KG5vbmNlKSkgewogICAgICByZXR1cm4gbm9uY2U7CiAgICB9CiAgfQogIHJldHVybiAnJzsKfTsKCgovKioKICogTW9kdWxlIGlkZW50aWZpZXIgdmFsaWRhdGlvbiByZWdleHAuCiAqIE5vdGU6IFRoaXMgaXMgYSBjb25zZXJ2YXRpdmUgY2hlY2ssIGl0IGlzIHZlcnkgcG9zc2libGUgdG8gYmUgbW9yZSBsZW5pZW50LAogKiAgIHRoZSBwcmltYXJ5IGV4Y2x1c2lvbiBoZXJlIGlzICIvIiBhbmQgIlwiIGFuZCBhIGxlYWRpbmcgIi4iLCB0aGVzZQogKiAgIHJlc3RyaWN0aW9ucyBhcmUgaW50ZW5kZWQgdG8gbGVhdmUgdGhlIGRvb3Igb3BlbiBmb3IgdXNpbmcgZ29vZy5yZXF1aXJlCiAqICAgd2l0aCByZWxhdGl2ZSBmaWxlIHBhdGhzIHJhdGhlciB0aGFuIG1vZHVsZSBpZGVudGlmaWVycy4KICogQHByaXZhdGUKICovCmdvb2cuVkFMSURfTU9EVUxFX1JFXyA9IC9eW2EtekEtWl8kXVthLXpBLVowLTkuXyRdKiQvOwoKCi8qKgogKiBEZWZpbmVzIGEgbW9kdWxlIGluIENsb3N1cmUuCiAqCiAqIE1hcmtzIHRoYXQgdGhpcyBmaWxlIG11c3QgYmUgbG9hZGVkIGFzIGEgbW9kdWxlIGFuZCBjbGFpbXMgdGhlIG5hbWVzcGFjZS4KICoKICogQSBuYW1lc3BhY2UgbWF5IG9ubHkgYmUgZGVmaW5lZCBvbmNlIGluIGEgY29kZWJhc2UuIEl0IG1heSBiZSBkZWZpbmVkIHVzaW5nCiAqIGdvb2cucHJvdmlkZSgpIG9yIGdvb2cubW9kdWxlKCkuCiAqCiAqIGdvb2cubW9kdWxlKCkgaGFzIHRocmVlIHJlcXVpcmVtZW50czoKICogLSBnb29nLm1vZHVsZSBtYXkgbm90IGJlIHVzZWQgaW4gdGhlIHNhbWUgZmlsZSBhcyBnb29nLnByb3ZpZGUuCiAqIC0gZ29vZy5tb2R1bGUgbXVzdCBiZSB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBmaWxlLgogKiAtIG9ubHkgb25lIGdvb2cubW9kdWxlIGlzIGFsbG93ZWQgcGVyIGZpbGUuCiAqCiAqIFdoZW4gYSBnb29nLm1vZHVsZSBhbm5vdGF0ZWQgZmlsZSBpcyBsb2FkZWQsIGl0IGlzIGVuY2xvc2VkIGluCiAqIGEgc3RyaWN0IGZ1bmN0aW9uIGNsb3N1cmUuIFRoaXMgbWVhbnMgdGhhdDoKICogLSBhbnkgdmFyaWFibGVzIGRlY2xhcmVkIGluIGEgZ29vZy5tb2R1bGUgZmlsZSBhcmUgcHJpdmF0ZSB0byB0aGUgZmlsZQogKiAobm90IGdsb2JhbCksIHRob3VnaCB0aGUgY29tcGlsZXIgaXMgZXhwZWN0ZWQgdG8gaW5saW5lIHRoZSBtb2R1bGUuCiAqIC0gVGhlIGNvZGUgbXVzdCBvYmV5IGFsbCB0aGUgcnVsZXMgb2YgInN0cmljdCIgSmF2YVNjcmlwdC4KICogLSB0aGUgZmlsZSB3aWxsIGJlIG1hcmtlZCBhcyAidXNlIHN0cmljdCIKICoKICogTk9URTogdW5saWtlIGdvb2cucHJvdmlkZSwgZ29vZy5tb2R1bGUgZG9lcyBub3QgZGVjbGFyZSBhbnkgc3ltYm9scyBieQogKiBpdHNlbGYuIElmIGRlY2xhcmVkIHN5bWJvbHMgYXJlIGRlc2lyZWQsIHVzZQogKiBnb29nLm1vZHVsZS5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlKCkuCiAqCiAqCiAqIFNlZSB0aGUgcHVibGljIGdvb2cubW9kdWxlIHByb3Bvc2FsOiBodHRwOi8vZ29vLmdsL1ZhMWhpbgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgcHJvdmlkZWQgYnkgdGhpcyBmaWxlIGluIHRoZSBmb3JtCiAqICAgICAiZ29vZy5wYWNrYWdlLnBhcnQiLCBpcyBleHBlY3RlZCBidXQgbm90IHJlcXVpcmVkLgogKiBAcmV0dXJuIHt2b2lkfQogKi8KZ29vZy5tb2R1bGUgPSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCAhbmFtZSB8fAogICAgICBuYW1lLnNlYXJjaChnb29nLlZBTElEX01PRFVMRV9SRV8pID09IC0xKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIGlkZW50aWZpZXInKTsKICB9CiAgaWYgKCFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ01vZHVsZSAnICsgbmFtZSArICcgaGFzIGJlZW4gbG9hZGVkIGluY29ycmVjdGx5LiBOb3RlLCAnICsKICAgICAgICAnbW9kdWxlcyBjYW5ub3QgYmUgbG9hZGVkIGFzIG5vcm1hbCBzY3JpcHRzLiBUaGV5IHJlcXVpcmUgc29tZSBraW5kIG9mICcgKwogICAgICAgICdwcmUtcHJvY2Vzc2luZyBzdGVwLiBZb3VcJ3JlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBhIG1vZHVsZSB2aWEgYSAnICsKICAgICAgICAnc2NyaXB0IHRhZyBvciBhcyBhIHBhcnQgb2YgYSBjb25jYXRlbmF0ZWQgYnVuZGxlIHdpdGhvdXQgcmV3cml0aW5nIHRoZSAnICsKICAgICAgICAnbW9kdWxlLiBGb3IgbW9yZSBpbmZvIHNlZTogJyArCiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L3dpa2kvZ29vZy5tb2R1bGU6LWFuLUVTNi1tb2R1bGUtbGlrZS1hbHRlcm5hdGl2ZS10by1nb29nLnByb3ZpZGUuJyk7CiAgfQogIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cubW9kdWxlIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBtb2R1bGUuJyk7CiAgfQoKICAvLyBTdG9yZSB0aGUgbW9kdWxlIG5hbWUgZm9yIHRoZSBsb2FkZXIuCiAgZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZSA9IG5hbWU7CiAgaWYgKCFDT01QSUxFRCkgewogICAgLy8gRW5zdXJlIHRoYXQgdGhlIHNhbWUgbmFtZXNwYWNlIGlzbid0IHByb3ZpZGVkIHR3aWNlLgogICAgLy8gQSBnb29nLm1vZHVsZS9nb29nLnByb3ZpZGUgbWFwcyBhIGdvb2cucmVxdWlyZSB0byBhIHNwZWNpZmljIGZpbGUKICAgIGlmIChnb29nLmlzUHJvdmlkZWRfKG5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTmFtZXNwYWNlICInICsgbmFtZSArICciIGFscmVhZHkgZGVjbGFyZWQuJyk7CiAgICB9CiAgICBkZWxldGUgZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW25hbWVdOwogIH0KfTsKCgovKioKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG1vZHVsZSBpZGVudGlmaWVyLgogKiBAcmV0dXJuIHs/fSBUaGUgbW9kdWxlIGV4cG9ydHMgZm9yIGFuIGFscmVhZHkgbG9hZGVkIG1vZHVsZSBvciBudWxsLgogKgogKiBOb3RlOiBUaGlzIGlzIG5vdCBhbiBhbHRlcm5hdGl2ZSB0byBnb29nLnJlcXVpcmUsIGl0IGRvZXMgbm90CiAqIGluZGljYXRlIGEgaGFyZCBkZXBlbmRlbmN5LCBpbnN0ZWFkIGl0IGlzIHVzZWQgdG8gaW5kaWNhdGUKICogYW4gb3B0aW9uYWwgZGVwZW5kZW5jeSBvciB0byBhY2Nlc3MgdGhlIGV4cG9ydHMgb2YgYSBtb2R1bGUKICogdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4KICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICovCmdvb2cubW9kdWxlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHsKICByZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKG5hbWUpOwp9OwoKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbW9kdWxlIGlkZW50aWZpZXIuCiAqIEByZXR1cm4gez99IFRoZSBtb2R1bGUgZXhwb3J0cyBmb3IgYW4gYWxyZWFkeSBsb2FkZWQgbW9kdWxlIG9yIG51bGwuCiAqIEBwcml2YXRlCiAqLwpnb29nLm1vZHVsZS5nZXRJbnRlcm5hbF8gPSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKCFDT01QSUxFRCkgewogICAgaWYgKG5hbWUgaW4gZ29vZy5sb2FkZWRNb2R1bGVzXykgewogICAgICByZXR1cm4gZ29vZy5sb2FkZWRNb2R1bGVzX1tuYW1lXS5leHBvcnRzOwogICAgfSBlbHNlIGlmICghZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW25hbWVdKSB7CiAgICAgIHZhciBucyA9IGdvb2cuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpOwogICAgICByZXR1cm4gbnMgIT0gbnVsbCA/IG5zIDogbnVsbDsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn07CgoKLyoqCiAqIFR5cGVzIG9mIG1vZHVsZXMgdGhlIGRlYnVnIGxvYWRlciBjYW4gbG9hZC4KICogQGVudW0ge3N0cmluZ30KICovCmdvb2cuTW9kdWxlVHlwZSA9IHsKICBFUzY6ICdlczYnLAogIEdPT0c6ICdnb29nJwp9OwoKCi8qKgogKiBAcHJpdmF0ZSB7P3sKICogICBtb2R1bGVOYW1lOiAoc3RyaW5nfHVuZGVmaW5lZCksCiAqICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTpib29sZWFuLAogKiAgIHR5cGU6ID9nb29nLk1vZHVsZVR5cGUKICogfX0KICovCmdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gbnVsbDsKCgovKioKICogQHByaXZhdGUKICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhIGdvb2cubW9kdWxlIG9yIGFuIGVzNiBtb2R1bGUgaXMgY3VycmVudGx5IGJlaW5nCiAqICAgICBpbml0aWFsaXplZC4KICovCmdvb2cuaXNJbk1vZHVsZUxvYWRlcl8gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZ29vZy5pc0luR29vZ01vZHVsZUxvYWRlcl8oKSB8fCBnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfKCk7Cn07CgoKLyoqCiAqIEBwcml2YXRlCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSBnb29nLm1vZHVsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW5pdGlhbGl6ZWQuCiAqLwpnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiAhIWdvb2cubW9kdWxlTG9hZGVyU3RhdGVfICYmCiAgICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLnR5cGUgPT0gZ29vZy5Nb2R1bGVUeXBlLkdPT0c7Cn07CgoKLyoqCiAqIEBwcml2YXRlCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYW4gZXM2IG1vZHVsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW5pdGlhbGl6ZWQuCiAqLwpnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfID0gZnVuY3Rpb24oKSB7CiAgdmFyIGluTG9hZGVyID0gISFnb29nLm1vZHVsZUxvYWRlclN0YXRlXyAmJgogICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy50eXBlID09IGdvb2cuTW9kdWxlVHlwZS5FUzY7CgogIGlmIChpbkxvYWRlcikgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKCiAgaWYgKGpzY29tcCkgewogICAgLy8ganNjb21wIG1heSBub3QgaGF2ZSBnZXRDdXJyZW50TW9kdWxlUGF0aCBpZiB0aGlzIGlzIGEgY29tcGlsZWQgYnVuZGxlCiAgICAvLyB0aGF0IGhhcyBzb21lIG9mIHRoZSBydW50aW1lLCBidXQgbm90IGFsbCBvZiBpdC4gVGhpcyBjYW4gaGFwcGVuIGlmCiAgICAvLyBvcHRpbWl6YXRpb25zIGFyZSB0dXJuZWQgb24gc28gdGhlIHVudXNlZCBydW50aW1lIGlzIHJlbW92ZWQgYnV0IHJlbmFtaW5nCiAgICAvLyBhbmQgQ2xvc3VyZSBwYXNzIGFyZSBvZmYgKHNvICRqc2NvbXAgaXMgc3RpbGwgbmFtZWQgJGpzY29tcCBhbmQgdGhlCiAgICAvLyBnb29nLnByb3ZpZGUvcmVxdWlyZSBjYWxscyBzdGlsbCBleGlzdCkuCiAgICBpZiAodHlwZW9mIGpzY29tcC5nZXRDdXJyZW50TW9kdWxlUGF0aCAhPSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBCdW5kbGVkIEVTNiBtb2R1bGUuCiAgICByZXR1cm4gISFqc2NvbXAuZ2V0Q3VycmVudE1vZHVsZVBhdGgoKTsKICB9CgogIHJldHVybiBmYWxzZTsKfTsKCgovKioKICogUHJvdmlkZSB0aGUgbW9kdWxlJ3MgZXhwb3J0cyBhcyBhIGdsb2JhbGx5IGFjY2Vzc2libGUgb2JqZWN0IHVuZGVyIHRoZQogKiBtb2R1bGUncyBkZWNsYXJlZCBuYW1lLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBlYXNlIG1pZ3JhdGlvbiB0byBnb29nLm1vZHVsZQogKiBmb3IgZmlsZXMgdGhhdCBoYXZlIGV4aXN0aW5nIHVzYWdlcy4KICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICovCmdvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2UgPSBmdW5jdGlvbigpIHsKICBpZiAoIUNPTVBJTEVEICYmICFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ2dvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2UgbXVzdCBiZSBjYWxsZWQgZnJvbSAnICsKICAgICAgICAnd2l0aGluIGEgZ29vZy5tb2R1bGUnKTsKICB9CiAgaWYgKCFDT01QSUxFRCAmJiAhZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdnb29nLm1vZHVsZSBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byAnICsKICAgICAgICAnZ29vZy5tb2R1bGUuZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZS4nKTsKICB9CiAgZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8uZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZSA9IHRydWU7Cn07CgoKLyoqCiAqIEFzc29jaWF0ZXMgYW4gRVM2IG1vZHVsZSB3aXRoIGEgQ2xvc3VyZSBtb2R1bGUgSUQgc28gdGhhdCBpcyBhdmFpbGFibGUgdmlhCiAqIGdvb2cucmVxdWlyZS4gVGhlIGFzc29jaWF0ZWQgSUQgIGFjdHMgbGlrZSBhIGdvb2cubW9kdWxlIElEIC0gaXQgZG9lcyBub3QKICogY3JlYXRlIGFueSBnbG9iYWwgbmFtZXMsIGl0IGlzIG1lcmVseSBhdmFpbGFibGUgdmlhIGdvb2cucmVxdWlyZSAvCiAqIGdvb2cubW9kdWxlLmdldCAvIGdvb2cuZm9yd2FyZERlY2xhcmUgLyBnb29nLnJlcXVpcmVUeXBlLiBnb29nLnJlcXVpcmUgYW5kCiAqIGdvb2cubW9kdWxlLmdldCB3aWxsIHJldHVybiB0aGUgZW50aXJlIG1vZHVsZSBhcyBpZiBpdCB3YXMgaW1wb3J0IConZC4gVGhpcwogKiBhbGxvd3MgQ2xvc3VyZSBmaWxlcyB0byByZWZlcmVuY2UgRVM2IG1vZHVsZXMgZm9yIHRoZSBzYWtlIG9mIG1pZ3JhdGlvbi4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZQogKiBAc3VwcHJlc3Mge21pc3NpbmdQcm92aWRlfQogKi8KZ29vZy5kZWNsYXJlTW9kdWxlSWQgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICBpZiAoIUNPTVBJTEVEKSB7CiAgICBpZiAoIWdvb2cuaXNJbkVzNk1vZHVsZUxvYWRlcl8oKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnZ29vZy5kZWNsYXJlTW9kdWxlSWQgbWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gJyArCiAgICAgICAgICAnd2l0aGluIGFuIEVTNiBtb2R1bGUnKTsKICAgIH0KICAgIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXyAmJiBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdnb29nLmRlY2xhcmVNb2R1bGVJZCBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgbW9kdWxlLicpOwogICAgfQogICAgaWYgKG5hbWVzcGFjZSBpbiBnb29nLmxvYWRlZE1vZHVsZXNfKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdNb2R1bGUgd2l0aCBuYW1lc3BhY2UgIicgKyBuYW1lc3BhY2UgKyAnIiBhbHJlYWR5IGV4aXN0cy4nKTsKICAgIH0KICB9CiAgaWYgKGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfKSB7CiAgICAvLyBOb3QgYnVuZGxlZCAtIGRlYnVnIGxvYWRpbmcuCiAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lID0gbmFtZXNwYWNlOwogIH0gZWxzZSB7CiAgICAvLyBCdW5kbGVkIC0gbm90IGRlYnVnIGxvYWRpbmcsIG5vIG1vZHVsZSBsb2FkZXIgc3RhdGUuCiAgICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKICAgIGlmICghanNjb21wIHx8IHR5cGVvZiBqc2NvbXAuZ2V0Q3VycmVudE1vZHVsZVBhdGggIT0gJ2Z1bmN0aW9uJykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnTW9kdWxlIHdpdGggbmFtZXNwYWNlICInICsgbmFtZXNwYWNlICsKICAgICAgICAgICciIGhhcyBiZWVuIGxvYWRlZCBpbmNvcnJlY3RseS4nKTsKICAgIH0KICAgIHZhciBleHBvcnRzID0ganNjb21wLnJlcXVpcmUoanNjb21wLmdldEN1cnJlbnRNb2R1bGVQYXRoKCkpOwogICAgZ29vZy5sb2FkZWRNb2R1bGVzX1tuYW1lc3BhY2VdID0gewogICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICB0eXBlOiBnb29nLk1vZHVsZVR5cGUuRVM2LAogICAgICBtb2R1bGVJZDogbmFtZXNwYWNlCiAgICB9OwogIH0KfTsKCgovKioKICogTWFya3MgdGhhdCB0aGUgY3VycmVudCBmaWxlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RpbmcsIGFuZCBuZXZlciBmb3IKICogbGl2ZSBjb2RlIGluIHByb2R1Y3Rpb24uCiAqCiAqIEluIHRoZSBjYXNlIG9mIHVuaXQgdGVzdHMsIHRoZSBtZXNzYWdlIG1heSBvcHRpb25hbGx5IGJlIGFuIGV4YWN0IG5hbWVzcGFjZQogKiBmb3IgdGhlIHRlc3QgKGUuZy4gJ2dvb2cuc3RyaW5nVGVzdCcpLiBUaGUgbGludGVyIHdpbGwgdGhlbiBpZ25vcmUgdGhlIGV4dHJhCiAqIHByb3ZpZGUgKGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgaW4gdGhlIGNvZGUpLgogKgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9tZXNzYWdlIE9wdGlvbmFsIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBlcnJvciB0aGF0J3MKICogICAgIHJhaXNlZCB3aGVuIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLgogKi8KZ29vZy5zZXRUZXN0T25seSA9IGZ1bmN0aW9uKG9wdF9tZXNzYWdlKSB7CiAgaWYgKGdvb2cuRElTQUxMT1dfVEVTVF9PTkxZX0NPREUpIHsKICAgIG9wdF9tZXNzYWdlID0gb3B0X21lc3NhZ2UgfHwgJyc7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ0ltcG9ydGluZyB0ZXN0LW9ubHkgY29kZSBpbnRvIG5vbi1kZWJ1ZyBlbnZpcm9ubWVudCcgKwogICAgICAgIChvcHRfbWVzc2FnZSA/ICc6ICcgKyBvcHRfbWVzc2FnZSA6ICcuJykpOwogIH0KfTsKCgovKioKICogRm9yd2FyZCBkZWNsYXJlcyBhIHN5bWJvbC4gVGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRvIHRoZSBjb21waWxlciB0aGF0IHRoZQogKiBzeW1ib2wgbWF5IGJlIHVzZWQgaW4gdGhlIHNvdXJjZSB5ZXQgaXMgbm90IHJlcXVpcmVkIGFuZCBtYXkgbm90IGJlIHByb3ZpZGVkCiAqIGluIGNvbXBpbGF0aW9uLgogKgogKiBUaGUgbW9zdCBjb21tb24gdXNhZ2Ugb2YgZm9yd2FyZCBkZWNsYXJhdGlvbiBpcyBjb2RlIHRoYXQgdGFrZXMgYSB0eXBlIGFzIGEKICogZnVuY3Rpb24gcGFyYW1ldGVyIGJ1dCBkb2VzIG5vdCBuZWVkIHRvIHJlcXVpcmUgaXQuIEJ5IGZvcndhcmQgZGVjbGFyaW5nCiAqIGluc3RlYWQgb2YgcmVxdWlyaW5nLCBubyBoYXJkIGRlcGVuZGVuY3kgaXMgbWFkZSwgYW5kIChpZiBub3QgcmVxdWlyZWQKICogZWxzZXdoZXJlKSB0aGUgbmFtZXNwYWNlIG1heSBuZXZlciBiZSByZXF1aXJlZCBhbmQgdGh1cywgbm90IGJlIHB1bGxlZAogKiBpbnRvIHRoZSBKYXZhU2NyaXB0IGJpbmFyeS4gSWYgaXQgaXMgcmVxdWlyZWQgZWxzZXdoZXJlLCBpdCB3aWxsIGJlIHR5cGUKICogY2hlY2tlZCBhcyBub3JtYWwuCiAqCiAqIEJlZm9yZSB1c2luZyBnb29nLmZvcndhcmREZWNsYXJlLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBhdAogKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvd2lraS9CYWQtVHlwZS1Bbm5vdGF0aW9uIHRvCiAqIHVuZGVyc3RhbmQgdGhlIG9wdGlvbnMgYW5kIHRyYWRlb2ZmcyB3aGVuIHdvcmtpbmcgd2l0aCBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWVzcGFjZSB0byBmb3J3YXJkIGRlY2xhcmUgaW4gdGhlIGZvcm0gb2YKICogICAgICJnb29nLnBhY2thZ2UucGFydCIuCiAqLwpnb29nLmZvcndhcmREZWNsYXJlID0gZnVuY3Rpb24obmFtZSkge307CgoKLyoqCiAqIEZvcndhcmQgZGVjbGFyZSB0eXBlIGluZm9ybWF0aW9uLiBVc2VkIHRvIGFzc2lnbiB0eXBlcyB0byBnb29nLmdsb2JhbAogKiByZWZlcmVuY2VkIG9iamVjdCB0aGF0IHdvdWxkIG90aGVyd2lzZSByZXN1bHQgaW4gdW5rbm93biB0eXBlIHJlZmVyZW5jZXMKICogYW5kIHRodXMgYmxvY2sgcHJvcGVydHkgZGlzYW1iaWd1YXRpb24uCiAqLwpnb29nLmZvcndhcmREZWNsYXJlKCdEb2N1bWVudCcpOwpnb29nLmZvcndhcmREZWNsYXJlKCdIVE1MU2NyaXB0RWxlbWVudCcpOwpnb29nLmZvcndhcmREZWNsYXJlKCdYTUxIdHRwUmVxdWVzdCcpOwoKCmlmICghQ09NUElMRUQpIHsKICAvKioKICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbmFtZSBoYXMgYmVlbiBnb29nLnByb3ZpZGVkLiBUaGlzIHdpbGwgcmV0dXJuIGZhbHNlIGZvcgogICAqIG5hbWVzIHRoYXQgYXJlIGF2YWlsYWJsZSBvbmx5IGFzIGltcGxpY2l0IG5hbWVzcGFjZXMuCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgZm9yLgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG5hbWUgaGFzIGJlZW4gcHJvdmlkZWQuCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLmlzUHJvdmlkZWRfID0gZnVuY3Rpb24obmFtZSkgewogICAgcmV0dXJuIChuYW1lIGluIGdvb2cubG9hZGVkTW9kdWxlc18pIHx8CiAgICAgICAgKCFnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bbmFtZV0gJiYgZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZSkgIT0gbnVsbCk7CiAgfTsKCiAgLyoqCiAgICogTmFtZXNwYWNlcyBpbXBsaWNpdGx5IGRlZmluZWQgYnkgZ29vZy5wcm92aWRlLiBGb3IgZXhhbXBsZSwKICAgKiBnb29nLnByb3ZpZGUoJ2dvb2cuZXZlbnRzLkV2ZW50JykgaW1wbGljaXRseSBkZWNsYXJlcyB0aGF0ICdnb29nJyBhbmQKICAgKiAnZ29vZy5ldmVudHMnIG11c3QgYmUgbmFtZXNwYWNlcy4KICAgKgogICAqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgKGJvb2xlYW58dW5kZWZpbmVkKT59CiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLmltcGxpY2l0TmFtZXNwYWNlc18gPSB7J2dvb2cubW9kdWxlJzogdHJ1ZX07CgogIC8vIE5PVEU6IFdlIGFkZCBnb29nLm1vZHVsZSBhcyBhbiBpbXBsaWNpdCBuYW1lc3BhY2UgYXMgZ29vZy5tb2R1bGUgaXMgZGVmaW5lZAogIC8vIGhlcmUgYW5kIGJlY2F1c2UgdGhlIGV4aXN0aW5nIG1vZHVsZSBwYWNrYWdlIGhhcyBub3QgYmVlbiBtb3ZlZCB5ZXQgb3V0IG9mCiAgLy8gdGhlIGdvb2cubW9kdWxlIG5hbWVzcGFjZS4gVGhpcyBzYXRpc2lmaWVzIGJvdGggdGhlIGRlYnVnIGxvYWRlciBhbmQKICAvLyBhaGVhZC1vZi10aW1lIGRlcGVuZGVuY3kgbWFuYWdlbWVudC4KfQoKCi8qKgogKiBSZXR1cm5zIGFuIG9iamVjdCBiYXNlZCBvbiBpdHMgZnVsbHkgcXVhbGlmaWVkIGV4dGVybmFsIG5hbWUuICBUaGUgb2JqZWN0CiAqIGlzIG5vdCBmb3VuZCBpZiBudWxsIG9yIHVuZGVmaW5lZC4gIElmIHlvdSBhcmUgdXNpbmcgYSBjb21waWxhdGlvbiBwYXNzIHRoYXQKICogcmVuYW1lcyBwcm9wZXJ0eSBuYW1lcyBiZXdhcmUgdGhhdCB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGZpbmQgcmVuYW1lZAogKiBwcm9wZXJ0aWVzLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUuCiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X29iaiBUaGUgb2JqZWN0IHdpdGhpbiB3aGljaCB0byBsb29rOyBkZWZhdWx0IGlzCiAqICAgICB8Z29vZy5nbG9iYWx8LgogKiBAcmV0dXJuIHs/fSBUaGUgdmFsdWUgKG9iamVjdCBvciBwcmltaXRpdmUpIG9yLCBpZiBub3QgZm91bmQsIG51bGwuCiAqLwpnb29nLmdldE9iamVjdEJ5TmFtZSA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmopIHsKICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7CiAgdmFyIGN1ciA9IG9wdF9vYmogfHwgZ29vZy5nbG9iYWw7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgY3VyID0gY3VyW3BhcnRzW2ldXTsKICAgIGlmIChjdXIgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CiAgcmV0dXJuIGN1cjsKfTsKCgovKioKICogR2xvYmFsaXplcyBhIHdob2xlIG5hbWVzcGFjZSwgc3VjaCBhcyBnb29nIG9yIGdvb2cubGFuZy4KICoKICogQHBhcmFtIHshT2JqZWN0fSBvYmogVGhlIG5hbWVzcGFjZSB0byBnbG9iYWxpemUuCiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X2dsb2JhbCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgcHJvcGVydGllcyB0by4KICogQGRlcHJlY2F0ZWQgUHJvcGVydGllcyBtYXkgYmUgZXhwbGljaXRseSBleHBvcnRlZCB0byB0aGUgZ2xvYmFsIHNjb3BlLCBidXQKICogICAgIHRoaXMgc2hvdWxkIG5vIGxvbmdlciBiZSBkb25lIGluIGJ1bGsuCiAqLwpnb29nLmdsb2JhbGl6ZSA9IGZ1bmN0aW9uKG9iaiwgb3B0X2dsb2JhbCkgewogIHZhciBnbG9iYWwgPSBvcHRfZ2xvYmFsIHx8IGdvb2cuZ2xvYmFsOwogIGZvciAodmFyIHggaW4gb2JqKSB7CiAgICBnbG9iYWxbeF0gPSBvYmpbeF07CiAgfQp9OwoKCi8qKgogKiBBZGRzIGEgZGVwZW5kZW5jeSBmcm9tIGEgZmlsZSB0byB0aGUgZmlsZXMgaXQgcmVxdWlyZXMuCiAqIEBwYXJhbSB7c3RyaW5nfSByZWxQYXRoIFRoZSBwYXRoIHRvIHRoZSBqcyBmaWxlLgogKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGgKICogICAgIHRoZSBuYW1lcyBvZiB0aGUgb2JqZWN0cyB0aGlzIGZpbGUgcHJvdmlkZXMuCiAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aAogKiAgICAgdGhlIG5hbWVzIG9mIHRoZSBvYmplY3RzIHRoaXMgZmlsZSByZXF1aXJlcy4KICogQHBhcmFtIHtib29sZWFufCFPYmplY3Q8c3RyaW5nPj19IG9wdF9sb2FkRmxhZ3MgUGFyYW1ldGVycyBpbmRpY2F0aW5nCiAqICAgICBob3cgdGhlIGZpbGUgbXVzdCBiZSBsb2FkZWQuICBUaGUgYm9vbGVhbiAndHJ1ZScgaXMgZXF1aXZhbGVudAogKiAgICAgdG8geydtb2R1bGUnOiAnZ29vZyd9IGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4gIFZhbGlkIHByb3BlcnRpZXMKICogICAgIGFuZCB2YWx1ZXMgaW5jbHVkZSB7J21vZHVsZSc6ICdnb29nJ30gYW5kIHsnbGFuZyc6ICdlczYnfS4KICovCmdvb2cuYWRkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgb3B0X2xvYWRGbGFncykgewogIGlmICghQ09NUElMRUQgJiYgZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCkgewogICAgZ29vZy5kZWJ1Z0xvYWRlcl8uYWRkRGVwZW5kZW5jeShyZWxQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIG9wdF9sb2FkRmxhZ3MpOwogIH0KfTsKCgoKCi8vIE5PVEUobm5hemUpOiBUaGUgZGVidWcgRE9NIGxvYWRlciB3YXMgaW5jbHVkZWQgaW4gYmFzZS5qcyBhcyBhbiBvcmlnaW5hbCB3YXkKLy8gdG8gZG8gImRlYnVnLW1vZGUiIGRldmVsb3BtZW50LiAgVGhlIGRlcGVuZGVuY3kgc3lzdGVtIGNhbiBzb21ldGltZXMgYmUKLy8gY29uZnVzaW5nLCBhcyBjYW4gdGhlIGRlYnVnIERPTSBsb2FkZXIncyBhc3luY2hyb25vdXMgbmF0dXJlLgovLwovLyBXaXRoIHRoZSBET00gbG9hZGVyLCBhIGNhbGwgdG8gZ29vZy5yZXF1aXJlKCkgaXMgbm90IGJsb2NraW5nIC0tIHRoZSBzY3JpcHQKLy8gd2lsbCBub3QgbG9hZCB1bnRpbCBzb21lIHBvaW50IGFmdGVyIHRoZSBjdXJyZW50IHNjcmlwdC4gIElmIGEgbmFtZXNwYWNlIGlzCi8vIG5lZWRlZCBhdCBydW50aW1lLCBpdCBuZWVkcyB0byBiZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgc2NyaXB0LCBvciBsb2FkZWQgdmlhCi8vIHJlcXVpcmUoKSB3aXRoIGl0cyByZWdpc3RlcmVkIGRlcGVuZGVuY2llcy4KLy8KLy8gVXNlci1kZWZpbmVkIG5hbWVzcGFjZXMgbWF5IG5lZWQgdGhlaXIgb3duIGRlcHMgZmlsZS4gRm9yIGEgcmVmZXJlbmNlIG9uCi8vIGNyZWF0aW5nIGEgZGVwcyBmaWxlLCBzZWU6Ci8vIEV4dGVybmFsbHk6IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2Nsb3N1cmUvbGlicmFyeS9kb2NzL2RlcHN3cml0ZXIKLy8KLy8gQmVjYXVzZSBvZiBsZWdhY3kgY2xpZW50cywgdGhlIERPTSBsb2FkZXIgY2FuJ3QgYmUgZWFzaWx5IHJlbW92ZWQgZnJvbQovLyBiYXNlLmpzLiAgV29yayB3YXMgZG9uZSB0byBtYWtlIGl0IGRpc2FibGVhYmxlIG9yIHJlcGxhY2VhYmxlIGZvcgovLyBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIChET00tbGVzcyBKYXZhU2NyaXB0IGludGVycHJldGVycyBsaWtlIFJoaW5vIG9yIFY4LAovLyBmb3IgZXhhbXBsZSkuIFNlZSBib290c3RyYXAvIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKCi8qKgogKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIGVuYWJsZSB0aGUgZGVidWcgbG9hZGVyLgogKgogKiBJZiBlbmFibGVkLCBhIGNhbGwgdG8gZ29vZy5yZXF1aXJlKCkgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIG5hbWVzcGFjZSBieQogKiBhcHBlbmRpbmcgYSBzY3JpcHQgdGFnIHRvIHRoZSBET00gKGlmIHRoZSBuYW1lc3BhY2UgaGFzIGJlZW4gcmVnaXN0ZXJlZCkuCiAqCiAqIElmIGRpc2FibGVkLCBnb29nLnJlcXVpcmUoKSB3aWxsIHNpbXBseSBhc3NlcnQgdGhhdCB0aGUgbmFtZXNwYWNlIGhhcyBiZWVuCiAqIHByb3ZpZGVkIChhbmQgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgc29tZSBvdXRzaWRlIHRvb2wgY29ycmVjdGx5IG9yZGVyZWQKICogdGhlIHNjcmlwdCkuCiAqLwpnb29nLkVOQUJMRV9ERUJVR19MT0FERVIgPSBnb29nLmRlZmluZSgnZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSJywgdHJ1ZSk7CgoKLyoqCiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cKICogQHByaXZhdGUKICovCmdvb2cubG9nVG9Db25zb2xlXyA9IGZ1bmN0aW9uKG1zZykgewogIGlmIChnb29nLmdsb2JhbC5jb25zb2xlKSB7CiAgICBnb29nLmdsb2JhbC5jb25zb2xlWydlcnJvciddKG1zZyk7CiAgfQp9OwoKCi8qKgogKiBJbXBsZW1lbnRzIGEgc3lzdGVtIGZvciB0aGUgZHluYW1pYyByZXNvbHV0aW9uIG9mIGRlcGVuZGVuY2llcyB0aGF0IHdvcmtzIGluCiAqIHBhcmFsbGVsIHdpdGggdGhlIEJVSUxEIHN5c3RlbS4KICoKICogTm90ZSB0aGF0IGFsbCBjYWxscyB0byBnb29nLnJlcXVpcmUgd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgY29tcGlsZXIuCiAqCiAqIEBzZWUgZ29vZy5wcm92aWRlCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgTmFtZXNwYWNlIChhcyB3YXMgZ2l2ZW4gaW4gZ29vZy5wcm92aWRlLAogKiAgICAgZ29vZy5tb2R1bGUsIG9yIGdvb2cuZGVjbGFyZU1vZHVsZUlkKSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICogQHJldHVybiB7P30gSWYgY2FsbGVkIHdpdGhpbiBhIGdvb2cubW9kdWxlIG9yIEVTNiBtb2R1bGUgZmlsZSwgdGhlIGFzc29jaWF0ZWQKICogICAgIG5hbWVzcGFjZSBvciBtb2R1bGUgb3RoZXJ3aXNlIG51bGwuCiAqLwpnb29nLnJlcXVpcmUgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICBpZiAoIUNPTVBJTEVEKSB7CiAgICAvLyBNaWdodCBuZWVkIHRvIGxhenkgbG9hZCBvbiBvbGQgSUUuCiAgICBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7CiAgICAgIGdvb2cuZGVidWdMb2FkZXJfLnJlcXVlc3RlZChuYW1lc3BhY2UpOwogICAgfQoKICAgIC8vIElmIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMgd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcuCiAgICBpZiAoZ29vZy5pc1Byb3ZpZGVkXyhuYW1lc3BhY2UpKSB7CiAgICAgIGlmIChnb29nLmlzSW5Nb2R1bGVMb2FkZXJfKCkpIHsKICAgICAgICByZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKG5hbWVzcGFjZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7CiAgICAgIHZhciBtb2R1bGVMb2FkZXJTdGF0ZSA9IGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfOwogICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG51bGw7CiAgICAgIHRyeSB7CiAgICAgICAgZ29vZy5kZWJ1Z0xvYWRlcl8ubG9hZF8obmFtZXNwYWNlKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG1vZHVsZUxvYWRlclN0YXRlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQp9OwoKCi8qKgogKiBSZXF1aXJlcyBhIHN5bWJvbCBmb3IgaXRzIHR5cGUgaW5mb3JtYXRpb24uIFRoaXMgaXMgYW4gaW5kaWNhdGlvbiB0byB0aGUKICogY29tcGlsZXIgdGhhdCB0aGUgc3ltYm9sIG1heSBhcHBlYXIgaW4gdHlwZSBhbm5vdGF0aW9ucywgeWV0IGl0IGlzIG5vdAogKiByZWZlcmVuY2VkIGF0IHJ1bnRpbWUuCiAqCiAqIFdoZW4gY2FsbGVkIHdpdGhpbiBhIGdvb2cubW9kdWxlIG9yIEVTNiBtb2R1bGUgZmlsZSwgdGhlIHJldHVybiB2YWx1ZSBtYXkgYmUKICogYXNzaWduZWQgdG8gb3IgZGVzdHJ1Y3R1cmVkIGludG8gYSB2YXJpYWJsZSwgYnV0IGl0IG1heSBub3QgYmUgb3RoZXJ3aXNlIHVzZWQKICogaW4gY29kZSBvdXRzaWRlIG9mIGEgdHlwZSBhbm5vdGF0aW9uLgogKgogKiBOb3RlIHRoYXQgYWxsIGNhbGxzIHRvIGdvb2cucmVxdWlyZVR5cGUgd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgY29tcGlsZXIuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgTmFtZXNwYWNlIChhcyB3YXMgZ2l2ZW4gaW4gZ29vZy5wcm92aWRlLAogKiAgICAgZ29vZy5tb2R1bGUsIG9yIGdvb2cuZGVjbGFyZU1vZHVsZUlkKSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICogQHJldHVybiB7P30KICovCmdvb2cucmVxdWlyZVR5cGUgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IHNvIHRoYXQgc2luZ2xlLWxldmVsIGRlc3RydWN0dXJpbmcgb2YgdGhlIHJldHVybgogIC8vIHZhbHVlIGRvZXNuJ3QgY3Jhc2ggYXQgcnVudGltZSB3aGVuIHVzaW5nIHRoZSBkZWJ1ZyBsb2FkZXIuIE11bHRpLWxldmVsCiAgLy8gZGVzdHJ1Y3R1cmluZyBpc24ndCBzdXBwb3J0ZWQuCiAgcmV0dXJuIHt9Owp9OwoKCi8qKgogKiBQYXRoIGZvciBpbmNsdWRlZCBzY3JpcHRzLgogKiBAdHlwZSB7c3RyaW5nfQogKi8KZ29vZy5iYXNlUGF0aCA9ICcnOwoKCi8qKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIGJhc2UgcGF0aC4KICogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0JBU0VfUEFUSDsKCgovKioKICogV2hldGhlciB0byBhdHRlbXB0IHRvIGxvYWQgQ2xvc3VyZSdzIGRlcHMgZmlsZS4gQnkgZGVmYXVsdCwgd2hlbiB1bmNvbXBpbGVkLAogKiBkZXBzIGZpbGVzIHdpbGwgYXR0ZW1wdCB0byBiZSBsb2FkZWQuCiAqIEB0eXBlIHtib29sZWFufHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUzsKCgovKioKICogQSBmdW5jdGlvbiB0byBpbXBvcnQgYSBzaW5nbGUgc2NyaXB0LiBUaGlzIGlzIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4gd2hlbgogKiBDbG9zdXJlIGlzIGJlaW5nIHJ1biBpbiBub24tSFRNTCBjb250ZXh0cywgc3VjaCBhcyB3ZWIgd29ya2Vycy4gSXQncyBkZWZpbmVkCiAqIGluIHRoZSBnbG9iYWwgc2NvcGUgc28gdGhhdCBpdCBjYW4gYmUgc2V0IGJlZm9yZSBiYXNlLmpzIGlzIGxvYWRlZCwgd2hpY2gKICogYWxsb3dzIGRlcHMuanMgdG8gYmUgaW1wb3J0ZWQgcHJvcGVybHkuCiAqCiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgdGhlIHNjcmlwdCBzb3VyY2UsIHdoaWNoIGlzIGEgcmVsYXRpdmUgVVJJLiBUaGUgc2Vjb25kLAogKiBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgdGhlIHNjcmlwdCBjb250ZW50cywgaW4gdGhlIGV2ZW50IHRoZSBzY3JpcHQgbmVlZGVkCiAqIHRyYW5zZm9ybWF0aW9uLiBJdCBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlIHNjcmlwdCB3YXMgaW1wb3J0ZWQsIGZhbHNlCiAqIG90aGVyd2lzZS4KICogQHR5cGUgeyhmdW5jdGlvbihzdHJpbmcsIHN0cmluZz0pOiBib29sZWFuKXx1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQ7CgoKLyoqCiAqIE51bGwgZnVuY3Rpb24gdXNlZCBmb3IgZGVmYXVsdCB2YWx1ZXMgb2YgY2FsbGJhY2tzLCBldGMuCiAqIEByZXR1cm4ge3ZvaWR9IE5vdGhpbmcuCiAqLwpnb29nLm51bGxGdW5jdGlvbiA9IGZ1bmN0aW9uKCkge307CgoKLyoqCiAqIFdoZW4gZGVmaW5pbmcgYSBjbGFzcyBGb28gd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QgYmFyKCksIHlvdSBjYW4gZG86CiAqIEZvby5wcm90b3R5cGUuYmFyID0gZ29vZy5hYnN0cmFjdE1ldGhvZAogKgogKiBOb3cgaWYgYSBzdWJjbGFzcyBvZiBGb28gZmFpbHMgdG8gb3ZlcnJpZGUgYmFyKCksIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duCiAqIHdoZW4gYmFyKCkgaXMgaW52b2tlZC4KICoKICogQHR5cGUgeyFGdW5jdGlvbn0KICogQHRocm93cyB7RXJyb3J9IHdoZW4gaW52b2tlZCB0byBpbmRpY2F0ZSB0aGUgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuLgogKiBAZGVwcmVjYXRlZCBVc2UgIkBhYnN0cmFjdCIgYW5ub3RhdGlvbiBpbnN0ZWFkIG9mIGdvb2cuYWJzdHJhY3RNZXRob2QgaW4gbmV3CiAqICAgICBjb2RlLiBTZWUKICogICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci93aWtpL0BhYnN0cmFjdC1jbGFzc2VzLWFuZC1tZXRob2RzCiAqLwpnb29nLmFic3RyYWN0TWV0aG9kID0gZnVuY3Rpb24oKSB7CiAgdGhyb3cgbmV3IEVycm9yKCd1bmltcGxlbWVudGVkIGFic3RyYWN0IG1ldGhvZCcpOwp9OwoKCi8qKgogKiBBZGRzIGEgYGdldEluc3RhbmNlYCBzdGF0aWMgbWV0aG9kIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUKICogaW5zdGFuY2Ugb2JqZWN0LgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY3RvciBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcyB0byBhZGQgdGhlIHN0YXRpYwogKiAgICAgbWV0aG9kIHRvLgogKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSAnaW5zdGFuY2VfJyBpc24ndCBhIHByb3BlcnR5IG9uICdGdW5jdGlvbicKICogICAgIGJ1dCB3ZSBkb24ndCBoYXZlIGEgYmV0dGVyIHR5cGUgdG8gdXNlIGhlcmUuCiAqLwpnb29nLmFkZFNpbmdsZXRvbkdldHRlciA9IGZ1bmN0aW9uKGN0b3IpIHsKICAvLyBpbnN0YW5jZV8gaXMgaW1tZWRpYXRlbHkgc2V0IHRvIHByZXZlbnQgaXNzdWVzIHdpdGggc2VhbGVkIGNvbnN0cnVjdG9ycwogIC8vIHN1Y2ggYXMgYXJlIGVuY291bnRlcmVkIHdoZW4gYSBjb25zdHJ1Y3RvciBpcyByZXR1cm5lZCBhcyB0aGUgZXhwb3J0IG9iamVjdAogIC8vIG9mIGEgZ29vZy5tb2R1bGUgaW4gdW5vcHRpbWl6ZWQgY29kZS4KICAvLyBEZWxjYXJlIHR5cGUgdG8gYXZvaWQgY29uZm9ybWFuY2UgdmlvbGF0aW9ucyB0aGF0IGN0b3IuaW5zdGFuY2VfIGlzIHVua25vd24KICAvKiogQHR5cGUge3VuZGVmaW5lZHwhT2JqZWN0fSBAc3VwcHJlc3Mge3VuZGVyc2NvcmV9ICovCiAgY3Rvci5pbnN0YW5jZV8gPSB1bmRlZmluZWQ7CiAgY3Rvci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGN0b3IuaW5zdGFuY2VfKSB7CiAgICAgIHJldHVybiBjdG9yLmluc3RhbmNlXzsKICAgIH0KICAgIGlmIChnb29nLkRFQlVHKSB7CiAgICAgIC8vIE5PVEU6IEpTQ29tcGlsZXIgY2FuJ3Qgb3B0aW1pemUgYXdheSBBcnJheSNwdXNoLgogICAgICBnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfW2dvb2cuaW5zdGFudGlhdGVkU2luZ2xldG9uc18ubGVuZ3RoXSA9IGN0b3I7CiAgICB9CiAgICAvLyBDYXN0IHRvIGF2b2lkIGNvbmZvcm1hbmNlIHZpb2xhdGlvbnMgdGhhdCBjdG9yLmluc3RhbmNlXyBpcyB1bmtub3duCiAgICByZXR1cm4gLyoqIEB0eXBlIHshT2JqZWN0fHVuZGVmaW5lZH0gKi8gKGN0b3IuaW5zdGFuY2VfKSA9IG5ldyBjdG9yOwogIH07Cn07CgoKLyoqCiAqIEFsbCBzaW5nbGV0b24gY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBpbnN0YW50aWF0ZWQsIGZvciB0ZXN0aW5nLiBEb24ndCByZWFkCiAqIGl0IGRpcmVjdGx5LCB1c2UgdGhlIGBnb29nLnRlc3Rpbmcuc2luZ2xldG9uYCBtb2R1bGUuIFRoZSBjb21waWxlcgogKiByZW1vdmVzIHRoaXMgdmFyaWFibGUgaWYgdW51c2VkLgogKiBAdHlwZSB7IUFycmF5PCFGdW5jdGlvbj59CiAqIEBwcml2YXRlCiAqLwpnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfID0gW107CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdG8gbG9hZCBnb29nLm1vZHVsZXMgdXNpbmcgYGV2YWxgIHdoZW4gdXNpbmcKICogdGhlIGRlYnVnIGxvYWRlci4gIFRoaXMgcHJvdmlkZXMgYSBiZXR0ZXIgZGVidWdnaW5nIGV4cGVyaWVuY2UgYXMgdGhlCiAqIHNvdXJjZSBpcyB1bm1vZGlmaWVkIGFuZCBjYW4gYmUgZWRpdGVkIHVzaW5nIENocm9tZSBXb3Jrc3BhY2VzIG9yIHNpbWlsYXIuCiAqIEhvd2V2ZXIgaW4gc29tZSBlbnZpcm9ubWVudHMgdGhlIHVzZSBvZiBgZXZhbGAgaXMgYmFubmVkCiAqIHNvIHdlIHByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUuCiAqLwpnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUwgPSBnb29nLmRlZmluZSgnZ29vZy5MT0FEX01PRFVMRV9VU0lOR19FVkFMJywgdHJ1ZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGV4cG9ydHMgb2YgZ29vZy5tb2R1bGVzIHNob3VsZCBiZSBzZWFsZWQgd2hlbgogKiBwb3NzaWJsZS4KICovCmdvb2cuU0VBTF9NT0RVTEVfRVhQT1JUUyA9IGdvb2cuZGVmaW5lKCdnb29nLlNFQUxfTU9EVUxFX0VYUE9SVFMnLCBnb29nLkRFQlVHKTsKCgovKioKICogVGhlIHJlZ2lzdHJ5IG9mIGluaXRpYWxpemVkIG1vZHVsZXM6CiAqIFRoZSBtb2R1bGUgaWRlbnRpZmllciBvciBwYXRoIHRvIG1vZHVsZSBleHBvcnRzIG1hcC4KICogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywge2V4cG9ydHM6Pyx0eXBlOnN0cmluZyxtb2R1bGVJZDpzdHJpbmd9Pn0KICovCmdvb2cubG9hZGVkTW9kdWxlc18gPSB7fTsKCgovKioKICogVHJ1ZSBpZiB0aGUgZGVidWcgbG9hZGVyIGVuYWJsZWQgYW5kIHVzZWQuCiAqIEBjb25zdCB7Ym9vbGVhbn0KICovCmdvb2cuREVQRU5ERU5DSUVTX0VOQUJMRUQgPSAhQ09NUElMRUQgJiYgZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSOwoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IEhvdyB0byBkZWNpZGUgd2hldGhlciB0byB0cmFuc3BpbGUuICBWYWxpZCB2YWx1ZXMKICogYXJlICdhbHdheXMnLCAnbmV2ZXInLCBhbmQgJ2RldGVjdCcuICBUaGUgZGVmYXVsdCAoJ2RldGVjdCcpIGlzIHRvCiAqIHVzZSBmZWF0dXJlIGRldGVjdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggbGFuZ3VhZ2UgbGV2ZWxzIG5lZWQKICogdHJhbnNwaWxhdGlvbi4KICovCi8vIE5PVEUoc2RoKTogd2UgY291bGQgZXhwYW5kIHRoaXMgdG8gYWNjZXB0IGEgbGFuZ3VhZ2UgbGV2ZWwgdG8gYnlwYXNzCi8vIGRldGVjdGlvbjogZS5nLiBnb29nLlRSQU5TUElMRSA9PSAnZXM1JyB3b3VsZCB0cmFuc3BpbGUgRVM2IGZpbGVzIGJ1dAovLyB3b3VsZCBsZWF2ZSBFUzMgYW5kIEVTNSBmaWxlcyBhbG9uZS4KZ29vZy5UUkFOU1BJTEUgPSBnb29nLmRlZmluZSgnZ29vZy5UUkFOU1BJTEUnLCAnZGV0ZWN0Jyk7CgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gSWYgdHJ1ZSBhc3N1bWUgdGhhdCBFUyBtb2R1bGVzIGhhdmUgYWxyZWFkeSBiZWVuCiAqIHRyYW5zcGlsZWQgYnkgdGhlIGpzY29tcGlsZXIgKGluIHRoZSBzYW1lIHdheSB0aGF0IHRyYW5zcGlsZS5qcyB3b3VsZAogKiB0cmFuc3BpbGUgdGhlbSAtIHRvIGpzY29tcCBtb2R1bGVzKS4gVXNlZnVsIG9ubHkgZm9yIHNlcnZlcnMgdGhhdCB3aXNoIHRvIHVzZQogKiB0aGUgZGVidWcgbG9hZGVyIGFuZCB0cmFuc3BpbGUgc2VydmVyIHNpZGUuIFRodXMgdGhpcyBpcyBvbmx5IHJlc3BlY3RlZCBpZgogKiBnb29nLlRSQU5TUElMRSBpcyAibmV2ZXIiLgogKi8KZ29vZy5BU1NVTUVfRVNfTU9EVUxFU19UUkFOU1BJTEVEID0KICAgIGdvb2cuZGVmaW5lKCdnb29nLkFTU1VNRV9FU19NT0RVTEVTX1RSQU5TUElMRUQnLCBmYWxzZSk7CgoKLyoqCiAqIEBkZWZpbmUge3N0cmluZ30gSWYgYSBmaWxlIG5lZWRzIHRvIGJlIHRyYW5zcGlsZWQgd2hhdCB0aGUgb3V0cHV0IGxhbmd1YWdlCiAqIHNob3VsZCBiZS4gQnkgZGVmYXVsdCB0aGlzIGlzIHRoZSBoaWdoZXN0IGxhbmd1YWdlIGxldmVsIHRoaXMgZmlsZSBkZXRlY3RzCiAqIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzLiBHZW5lcmFsbHkgdGhpcyBmbGFnIHNob3VsZCBub3QgYmUgc2V0LCBidXQKICogaXQgY291bGQgYmUgdXNlZnVsIHRvIG92ZXJyaWRlLiBFeGFtcGxlOiBJZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cwogKiBFUzYgdGhlbiBieSBkZWZhdWx0IEVTNysgZmlsZXMgd2lsbCBiZSB0cmFuc3BpbGVkIHRvIEVTNiwgdW5sZXNzIHRoaXMgaXMKICogb3ZlcnJpZGRlbi4KICoKICogVmFsaWQgdmFsdWVzIGluY2x1ZGU6IGVzMywgZXM1LCBlczYsIGVzNywgYW5kIGVzOC4gQW55dGhpbmcgbm90IHJlY29nbml6ZWQKICogaXMgdHJlYXRlZCBhcyBlczMuCiAqCiAqIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgdmFsdWUgZG9lcyBub3QgZm9yY2UgdHJhbnNwaWxhdGlvbi4gSnVzdCBpZgogKiB0cmFuc3BpbGF0aW9uIG9jY3VycyB0aGlzIHdpbGwgYmUgdGhlIG91dHB1dC4gU28gdGhpcyBpcyBtb3N0IHVzZWZ1bCB3aGVuCiAqIGdvb2cuVFJBTlNQSUxFIGlzIHNldCB0byAnYWx3YXlzJyBhbmQgdGhlbiBmb3JjaW5nIHRoZSBsYW5ndWFnZSBsZXZlbCB0byBiZQogKiBzb21ldGhpbmcgbG93ZXIgdGhhbiB3aGF0IHRoZSBlbnZpcm9ubWVudCBkZXRlY3RzLgogKi8KZ29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0UgPSBnb29nLmRlZmluZSgnZ29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0UnLCAnJyk7CgoKLyoqCiAqIEBkZWZpbmUge3N0cmluZ30gUGF0aCB0byB0aGUgdHJhbnNwaWxlci4gIEV4ZWN1dGluZyB0aGUgc2NyaXB0IGF0IHRoaXMKICogcGF0aCAocmVsYXRpdmUgdG8gYmFzZS5qcykgc2hvdWxkIGRlZmluZSBhIGZ1bmN0aW9uICRqc2NvbXAudHJhbnNwaWxlLgogKi8KZ29vZy5UUkFOU1BJTEVSID0gZ29vZy5kZWZpbmUoJ2dvb2cuVFJBTlNQSUxFUicsICd0cmFuc3BpbGUuanMnKTsKCgovKioKICogQHBhY2thZ2Ugez9ib29sZWFufQogKiBWaXNpYmxlIGZvciB0ZXN0aW5nLgogKi8KZ29vZy5oYXNCYWRMZXRTY29waW5nID0gbnVsbDsKCgovKioKICogQHJldHVybiB7Ym9vbGVhbn0KICogQHBhY2thZ2UgVmlzaWJsZSBmb3IgdGVzdGluZy4KICovCmdvb2cudXNlU2FmYXJpMTBXb3JrYXJvdW5kID0gZnVuY3Rpb24oKSB7CiAgaWYgKGdvb2cuaGFzQmFkTGV0U2NvcGluZyA9PSBudWxsKSB7CiAgICB2YXIgaGFzQmFkTGV0U2NvcGluZzsKICAgIHRyeSB7CiAgICAgIGhhc0JhZExldFNjb3BpbmcgPSAhZXZhbCgKICAgICAgICAgICcidXNlIHN0cmljdCI7JyArCiAgICAgICAgICAnbGV0IHggPSAxOyBmdW5jdGlvbiBmKCkgeyByZXR1cm4gdHlwZW9mIHg7IH07JyArCiAgICAgICAgICAnZigpID09ICJudW1iZXIiOycpOwogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBBc3N1bWUgdGhhdCBFUzYgc3ludGF4IGlzbid0IHN1cHBvcnRlZC4KICAgICAgaGFzQmFkTGV0U2NvcGluZyA9IGZhbHNlOwogICAgfQogICAgZ29vZy5oYXNCYWRMZXRTY29waW5nID0gaGFzQmFkTGV0U2NvcGluZzsKICB9CiAgcmV0dXJuIGdvb2cuaGFzQmFkTGV0U2NvcGluZzsKfTsKCgovKioKICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZURlZgogKiBAcmV0dXJuIHtzdHJpbmd9CiAqIEBwYWNrYWdlIFZpc2libGUgZm9yIHRlc3RpbmcuCiAqLwpnb29nLndvcmthcm91bmRTYWZhcmkxMEV2YWxCdWcgPSBmdW5jdGlvbihtb2R1bGVEZWYpIHsKICByZXR1cm4gJyhmdW5jdGlvbigpeycgKyBtb2R1bGVEZWYgKwogICAgICAnXG4nICsgIC8vIFRlcm1pbmF0ZSBhbnkgdHJhaWxpbmcgc2luZ2xlIGxpbmUgY29tbWVudC4KICAgICAgJzsnICsgICAvLyBUZXJtaW5hdGUgYW55IHRyYWlsaW5nIGV4cHJlc3Npb24uCiAgICAgICd9KSgpO1xuJzsKfTsKCgovKioKICogQHBhcmFtIHtmdW5jdGlvbig/KTo/fHN0cmluZ30gbW9kdWxlRGVmIFRoZSBtb2R1bGUgZGVmaW5pdGlvbi4KICovCmdvb2cubG9hZE1vZHVsZSA9IGZ1bmN0aW9uKG1vZHVsZURlZikgewogIC8vIE5PVEU6IHdlIGFsbG93IGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIGJlIGVpdGhlciBpbiB0aGUgZnJvbQogIC8vIG9mIGEgc3RyaW5nIHRvIGV2YWwgKHdoaWNoIGtlZXBzIHRoZSBvcmlnaW5hbCBzb3VyY2UgaW50YWN0KSBvcgogIC8vIGluIGEgZXZhbCBmb3JiaWRkZW4gZW52aXJvbm1lbnQgKENTUCkgd2UgYWxsb3cgYSBmdW5jdGlvbiBkZWZpbml0aW9uCiAgLy8gd2hpY2ggaW4gaXRzIGJvZHkgbXVzdCBjYWxsIGBnb29nLm1vZHVsZWAsIGFuZCByZXR1cm4gdGhlIGV4cG9ydHMKICAvLyBvZiB0aGUgbW9kdWxlLgogIHZhciBwcmV2aW91c1N0YXRlID0gZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV87CiAgdHJ5IHsKICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gewogICAgICBtb2R1bGVOYW1lOiAnJywKICAgICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTogZmFsc2UsCiAgICAgIHR5cGU6IGdvb2cuTW9kdWxlVHlwZS5HT09HCiAgICB9OwogICAgdmFyIGV4cG9ydHM7CiAgICBpZiAoZ29vZy5pc0Z1bmN0aW9uKG1vZHVsZURlZikpIHsKICAgICAgZXhwb3J0cyA9IG1vZHVsZURlZi5jYWxsKHVuZGVmaW5lZCwge30pOwogICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlRGVmID09PSAnc3RyaW5nJykgewogICAgICBpZiAoZ29vZy51c2VTYWZhcmkxMFdvcmthcm91bmQoKSkgewogICAgICAgIG1vZHVsZURlZiA9IGdvb2cud29ya2Fyb3VuZFNhZmFyaTEwRXZhbEJ1Zyhtb2R1bGVEZWYpOwogICAgICB9CgogICAgICBleHBvcnRzID0gZ29vZy5sb2FkTW9kdWxlRnJvbVNvdXJjZV8uY2FsbCh1bmRlZmluZWQsIG1vZHVsZURlZik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIGRlZmluaXRpb24nKTsKICAgIH0KCiAgICB2YXIgbW9kdWxlTmFtZSA9IGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWU7CiAgICBpZiAodHlwZW9mIG1vZHVsZU5hbWUgPT09ICdzdHJpbmcnICYmIG1vZHVsZU5hbWUpIHsKICAgICAgLy8gRG9uJ3Qgc2VhbCBsZWdhY3kgbmFtZXNwYWNlcyBhcyB0aGV5IG1heSBiZSB1c2VkIGFzIGEgcGFyZW50IG9mCiAgICAgIC8vIGFub3RoZXIgbmFtZXNwYWNlCiAgICAgIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlKSB7CiAgICAgICAgZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKG1vZHVsZU5hbWUsIGV4cG9ydHMpOwogICAgICB9IGVsc2UgaWYgKAogICAgICAgICAgZ29vZy5TRUFMX01PRFVMRV9FWFBPUlRTICYmIE9iamVjdC5zZWFsICYmCiAgICAgICAgICB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICE9IG51bGwpIHsKICAgICAgICBPYmplY3Quc2VhbChleHBvcnRzKTsKICAgICAgfQoKICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgZXhwb3J0czogZXhwb3J0cywKICAgICAgICB0eXBlOiBnb29nLk1vZHVsZVR5cGUuR09PRywKICAgICAgICBtb2R1bGVJZDogZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZQogICAgICB9OwogICAgICBnb29nLmxvYWRlZE1vZHVsZXNfW21vZHVsZU5hbWVdID0gZGF0YTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtb2R1bGUgbmFtZSBcIicgKyBtb2R1bGVOYW1lICsgJ1wiJyk7CiAgICB9CiAgfSBmaW5hbGx5IHsKICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gcHJldmlvdXNTdGF0ZTsKICB9Cn07CgoKLyoqCiAqIEBwcml2YXRlIEBjb25zdAogKi8KZ29vZy5sb2FkTW9kdWxlRnJvbVNvdXJjZV8gPSAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyk6P30gKi8gKGZ1bmN0aW9uKCkgewogIC8vIE5PVEU6IHdlIGF2b2lkIGRlY2xhcmluZyBwYXJhbWV0ZXJzIG9yIGxvY2FsIHZhcmlhYmxlcyBoZXJlIHRvIGF2b2lkCiAgLy8gbWFza2luZyBnbG9iYWxzIG9yIGxlYWtpbmcgdmFsdWVzIGludG8gdGhlIG1vZHVsZSBkZWZpbml0aW9uLgogICd1c2Ugc3RyaWN0JzsKICB2YXIgZXhwb3J0cyA9IHt9OwogIGV2YWwoYXJndW1lbnRzWzBdKTsKICByZXR1cm4gZXhwb3J0czsKfSk7CgoKLyoqCiAqIE5vcm1hbGl6ZSBhIGZpbGUgcGF0aCBieSByZW1vdmluZyByZWR1bmRhbnQgIi4uIiBhbmQgZXh0cmFuZW91cyAiLiIgZmlsZQogKiBwYXRoIGNvbXBvbmVudHMuCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoCiAqIEByZXR1cm4ge3N0cmluZ30KICogQHByaXZhdGUKICovCmdvb2cubm9ybWFsaXplUGF0aF8gPSBmdW5jdGlvbihwYXRoKSB7CiAgdmFyIGNvbXBvbmVudHMgPSBwYXRoLnNwbGl0KCcvJyk7CiAgdmFyIGkgPSAwOwogIHdoaWxlIChpIDwgY29tcG9uZW50cy5sZW5ndGgpIHsKICAgIGlmIChjb21wb25lbnRzW2ldID09ICcuJykgewogICAgICBjb21wb25lbnRzLnNwbGljZShpLCAxKTsKICAgIH0gZWxzZSBpZiAoCiAgICAgICAgaSAmJiBjb21wb25lbnRzW2ldID09ICcuLicgJiYgY29tcG9uZW50c1tpIC0gMV0gJiYKICAgICAgICBjb21wb25lbnRzW2kgLSAxXSAhPSAnLi4nKSB7CiAgICAgIGNvbXBvbmVudHMuc3BsaWNlKC0taSwgMik7CiAgICB9IGVsc2UgewogICAgICBpKys7CiAgICB9CiAgfQogIHJldHVybiBjb21wb25lbnRzLmpvaW4oJy8nKTsKfTsKCgovKioKICogUHJvdmlkZXMgYSBob29rIGZvciBsb2FkaW5nIGEgZmlsZSB3aGVuIHVzaW5nIENsb3N1cmUncyBnb29nLnJlcXVpcmUoKSBBUEkKICogd2l0aCBnb29nLm1vZHVsZXMuICBJbiBwYXJ0aWN1bGFyIHRoaXMgaG9vayBpcyBwcm92aWRlZCB0byBzdXBwb3J0IE5vZGUuanMuCiAqCiAqIEB0eXBlIHsoZnVuY3Rpb24oc3RyaW5nKTpzdHJpbmcpfHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfTE9BRF9GSUxFX1NZTkM7CgoKLyoqCiAqIExvYWRzIGZpbGUgYnkgc3luY2hyb25vdXMgWEhSLiBTaG91bGQgbm90IGJlIHVzZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuCiAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgU291cmNlIFVSTC4KICogQHJldHVybiB7P3N0cmluZ30gRmlsZSBjb250ZW50cywgb3IgbnVsbCBpZiBsb2FkIGZhaWxlZC4KICogQHByaXZhdGUKICovCmdvb2cubG9hZEZpbGVTeW5jXyA9IGZ1bmN0aW9uKHNyYykgewogIGlmIChnb29nLmdsb2JhbC5DTE9TVVJFX0xPQURfRklMRV9TWU5DKSB7CiAgICByZXR1cm4gZ29vZy5nbG9iYWwuQ0xPU1VSRV9MT0FEX0ZJTEVfU1lOQyhzcmMpOwogIH0gZWxzZSB7CiAgICB0cnkgewogICAgICAvKiogQHR5cGUge1hNTEh0dHBSZXF1ZXN0fSAqLwogICAgICB2YXIgeGhyID0gbmV3IGdvb2cuZ2xvYmFsWydYTUxIdHRwUmVxdWVzdCddKCk7CiAgICAgIHhoci5vcGVuKCdnZXQnLCBzcmMsIGZhbHNlKTsKICAgICAgeGhyLnNlbmQoKTsKICAgICAgLy8gTk9URTogU3VjY2Vzc2Z1bCBodHRwOiByZXF1ZXN0cyBoYXZlIGEgc3RhdHVzIG9mIDIwMCwgYnV0IHN1Y2Nlc3NmdWwKICAgICAgLy8gZmlsZTogcmVxdWVzdHMgbWF5IGhhdmUgYSBzdGF0dXMgb2YgemVyby4gIEFueSBvdGhlciBzdGF0dXMsIG9yIGEKICAgICAgLy8gdGhyb3duIGV4Y2VwdGlvbiAocGFydGljdWxhcmx5IGluIGNhc2Ugb2YgZmlsZTogcmVxdWVzdHMpIGluZGljYXRlcwogICAgICAvLyBzb21lIHNvcnQgb2YgZXJyb3IsIHdoaWNoIHdlIHRyZWF0IGFzIGEgbWlzc2luZyBvciB1bmF2YWlsYWJsZSBmaWxlLgogICAgICByZXR1cm4geGhyLnN0YXR1cyA9PSAwIHx8IHhoci5zdGF0dXMgPT0gMjAwID8geGhyLnJlc3BvbnNlVGV4dCA6IG51bGw7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgLy8gTm8gbmVlZCB0byByZXRocm93IG9yIGxvZywgc2luY2UgZXJyb3JzIHNob3VsZCBzaG93IHVwIG9uIHRoZWlyIG93bi4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQp9OwoKCi8qKgogKiBMYXppbHkgcmV0cmlldmVzIHRoZSB0cmFuc3BpbGVyIGFuZCBhcHBsaWVzIGl0IHRvIHRoZSBzb3VyY2UuCiAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIEpTIGNvZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdGhlIGNvZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgTGFuZ3VhZ2UgbGV2ZWwgb3V0cHV0LgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0cmFuc3BpbGVkIGNvZGUuCiAqIEBwcml2YXRlCiAqLwpnb29nLnRyYW5zcGlsZV8gPSBmdW5jdGlvbihjb2RlLCBwYXRoLCB0YXJnZXQpIHsKICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKICBpZiAoIWpzY29tcCkgewogICAgZ29vZy5nbG9iYWxbJyRqc2NvbXAnXSA9IGpzY29tcCA9IHt9OwogIH0KICB2YXIgdHJhbnNwaWxlID0ganNjb21wLnRyYW5zcGlsZTsKICBpZiAoIXRyYW5zcGlsZSkgewogICAgdmFyIHRyYW5zcGlsZXJQYXRoID0gZ29vZy5iYXNlUGF0aCArIGdvb2cuVFJBTlNQSUxFUjsKICAgIHZhciB0cmFuc3BpbGVyQ29kZSA9IGdvb2cubG9hZEZpbGVTeW5jXyh0cmFuc3BpbGVyUGF0aCk7CiAgICBpZiAodHJhbnNwaWxlckNvZGUpIHsKICAgICAgLy8gVGhpcyBtdXN0IGJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHksIHNpbmNlIGJ5IHRoZSB0aW1lIHdlIGtub3cgd2UKICAgICAgLy8gbmVlZCBpdCwgd2UncmUgYWJvdXQgdG8gbG9hZCBhbmQgd3JpdGUgdGhlIEVTNiBjb2RlIHN5bmNocm9ub3VzbHksCiAgICAgIC8vIHNvIGEgbm9ybWFsIHNjcmlwdC10YWcgbG9hZCB3aWxsIGJlIHRvbyBzbG93LiBXcmFwcGVkIGluIGEgZnVuY3Rpb24KICAgICAgLy8gc28gdGhhdCBjb2RlIGlzIGV2YWwnZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgogICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgKDAsIGV2YWwpKHRyYW5zcGlsZXJDb2RlICsgJ1xuLy8jIHNvdXJjZVVSTD0nICsgdHJhbnNwaWxlclBhdGgpOwogICAgICB9KS5jYWxsKGdvb2cuZ2xvYmFsKTsKICAgICAgLy8gRXZlbiB0aG91Z2ggdGhlIHRyYW5zcGlsZXIgaXMgb3B0aW9uYWwsIGlmICRnd3RFeHBvcnQgaXMgZm91bmQsIGl0J3MKICAgICAgLy8gYSBzaWduIHRoZSB0cmFuc3BpbGVyIHdhcyBsb2FkZWQgYW5kIHRoZSAkanNjb21wLnRyYW5zcGlsZSAqc2hvdWxkKgogICAgICAvLyBiZSB0aGVyZS4KICAgICAgaWYgKGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J10gJiYgZ29vZy5nbG9iYWxbJyRnd3RFeHBvcnQnXVsnJGpzY29tcCddICYmCiAgICAgICAgICAhZ29vZy5nbG9iYWxbJyRnd3RFeHBvcnQnXVsnJGpzY29tcCddWyd0cmFuc3BpbGUnXSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgJ1RoZSB0cmFuc3BpbGVyIGRpZCBub3QgcHJvcGVybHkgZXhwb3J0IHRoZSAidHJhbnNwaWxlIiAnICsKICAgICAgICAgICAgJ21ldGhvZC4gJGd3dEV4cG9ydDogJyArIEpTT04uc3RyaW5naWZ5KGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J10pKTsKICAgICAgfQogICAgICAvLyB0cmFuc3BpbGUuanMgb25seSBleHBvcnRzIGEgc2luZ2xlICRqc2NvbXAgZnVuY3Rpb24sIHRyYW5zcGlsZS4gV2UKICAgICAgLy8gZ3JhYiBqdXN0IHRoYXQgYW5kIGFkZCBpdCB0byB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbiBvZiAkanNjb21wIHdoaWNoCiAgICAgIC8vIGNvbnRhaW5zIHRoZSBwb2x5ZmlsbHMuCiAgICAgIGdvb2cuZ2xvYmFsWyckanNjb21wJ10udHJhbnNwaWxlID0KICAgICAgICAgIGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J11bJyRqc2NvbXAnXVsndHJhbnNwaWxlJ107CiAgICAgIGpzY29tcCA9IGdvb2cuZ2xvYmFsWyckanNjb21wJ107CiAgICAgIHRyYW5zcGlsZSA9IGpzY29tcC50cmFuc3BpbGU7CiAgICB9CiAgfQogIGlmICghdHJhbnNwaWxlKSB7CiAgICAvLyBUaGUgdHJhbnNwaWxlciBpcyBhbiBvcHRpb25hbCBjb21wb25lbnQuICBJZiBpdCdzIG5vdCBhdmFpbGFibGUgdGhlbgogICAgLy8gcmVwbGFjZSBpdCB3aXRoIGEgcGFzcy10aHJvdWdoIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGxvZ3MuCiAgICB2YXIgc3VmZml4ID0gJyByZXF1aXJlcyB0cmFuc3BpbGF0aW9uIGJ1dCBubyB0cmFuc3BpbGVyIHdhcyBmb3VuZC4nOwogICAgdHJhbnNwaWxlID0ganNjb21wLnRyYW5zcGlsZSA9IGZ1bmN0aW9uKGNvZGUsIHBhdGgpIHsKICAgICAgLy8gVE9ETyhzZGgpOiBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIGdldCB0aGlzIGVycm9yIHRvIHNob3cgdXAKICAgICAgLy8gaW4gdGVzdCByZXN1bHRzLCBub3RpbmcgdGhhdCB0aGUgZmFpbHVyZSBtYXkgb2NjdXIgaW4gbWFueQogICAgICAvLyBkaWZmZXJlbnQgd2F5cywgaW5jbHVkaW5nIGluIGxvYWRNb2R1bGUoKSBiZWZvcmUgdGhlIHRlc3QKICAgICAgLy8gcnVubmVyIGV2ZW4gY29tZXMgdXAuCiAgICAgIGdvb2cubG9nVG9Db25zb2xlXyhwYXRoICsgc3VmZml4KTsKICAgICAgcmV0dXJuIGNvZGU7CiAgICB9OwogIH0KICAvLyBOb3RlOiBhbnkgdHJhbnNwaWxhdGlvbiBlcnJvcnMvd2FybmluZ3Mgd2lsbCBiZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUuCiAgcmV0dXJuIHRyYW5zcGlsZShjb2RlLCBwYXRoLCB0YXJnZXQpOwp9OwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTGFuZ3VhZ2UgRW5oYW5jZW1lbnRzCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKLyoqCiAqIFRoaXMgaXMgYSAiZml4ZWQiIHZlcnNpb24gb2YgdGhlIHR5cGVvZiBvcGVyYXRvci4gIEl0IGRpZmZlcnMgZnJvbSB0aGUgdHlwZW9mCiAqIG9wZXJhdG9yIGluIHN1Y2ggYSB3YXkgdGhhdCBudWxsIHJldHVybnMgJ251bGwnIGFuZCBhcnJheXMgcmV0dXJuICdhcnJheScuCiAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHZhbHVlIHRvIGdldCB0aGUgdHlwZSBvZi4KICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgdHlwZS4KICovCmdvb2cudHlwZU9mID0gZnVuY3Rpb24odmFsdWUpIHsKICB2YXIgcyA9IHR5cGVvZiB2YWx1ZTsKICBpZiAocyA9PSAnb2JqZWN0JykgewogICAgaWYgKHZhbHVlKSB7CiAgICAgIC8vIENoZWNrIHRoZXNlIGZpcnN0LCBzbyB3ZSBjYW4gYXZvaWQgY2FsbGluZyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIGlmCiAgICAgIC8vIHBvc3NpYmxlLgogICAgICAvLwogICAgICAvLyBJRSBpbXByb3Blcmx5IG1hcnNoYWxzIHR5cGVvZiBhY3Jvc3MgZXhlY3V0aW9uIGNvbnRleHRzLCBidXQgYQogICAgICAvLyBjcm9zcy1jb250ZXh0IG9iamVjdCB3aWxsIHN0aWxsIHJldHVybiBmYWxzZSBmb3IgImluc3RhbmNlb2YgT2JqZWN0Ii4KICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICByZXR1cm4gJ2FycmF5JzsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgIHJldHVybiBzOwogICAgICB9CgogICAgICAvLyBIQUNLOiBJbiBvcmRlciB0byB1c2UgYW4gT2JqZWN0IHByb3RvdHlwZSBtZXRob2Qgb24gdGhlIGFyYml0cmFyeQogICAgICAvLyAgIHZhbHVlLCB0aGUgY29tcGlsZXIgcmVxdWlyZXMgdGhlIHZhbHVlIGJlIGNhc3QgdG8gdHlwZSBPYmplY3QsCiAgICAgIC8vICAgZXZlbiB0aG91Z2ggdGhlIEVDTUEgc3BlYyBleHBsaWNpdGx5IGFsbG93cyBpdC4KICAgICAgdmFyIGNsYXNzTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCgKICAgICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKHZhbHVlKSk7CiAgICAgIC8vIEluIEZpcmVmb3ggMy42LCBhdHRlbXB0aW5nIHRvIGFjY2VzcyBpZnJhbWUgd2luZG93IG9iamVjdHMnIGxlbmd0aAogICAgICAvLyBwcm9wZXJ0eSB0aHJvd3MgYW4gTlNfRVJST1JfRkFJTFVSRSwgc28gd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgaXQKICAgICAgLy8gaGVyZS4KICAgICAgaWYgKGNsYXNzTmFtZSA9PSAnW29iamVjdCBXaW5kb3ddJykgewogICAgICAgIHJldHVybiAnb2JqZWN0JzsKICAgICAgfQoKICAgICAgLy8gV2UgY2Fubm90IGFsd2F5cyB1c2UgY29uc3RydWN0b3IgPT0gQXJyYXkgb3IgaW5zdGFuY2VvZiBBcnJheSBiZWNhdXNlCiAgICAgIC8vIGRpZmZlcmVudCBmcmFtZXMgaGF2ZSBkaWZmZXJlbnQgQXJyYXkgb2JqZWN0cy4gSW4gSUU2LCBpZiB0aGUgaWZyYW1lCiAgICAgIC8vIHdoZXJlIHRoZSBhcnJheSB3YXMgY3JlYXRlZCBpcyBkZXN0cm95ZWQsIHRoZSBhcnJheSBsb3NlcyBpdHMKICAgICAgLy8gcHJvdG90eXBlLiBUaGVuIGRlcmVmZXJlbmNpbmcgdmFsLnNwbGljZSBoZXJlIHRocm93cyBhbiBleGNlcHRpb24sIHNvCiAgICAgIC8vIHdlIGNhbid0IHVzZSBnb29nLmlzRnVuY3Rpb24uIENhbGxpbmcgdHlwZW9mIGRpcmVjdGx5IHJldHVybnMgJ3Vua25vd24nCiAgICAgIC8vIHNvIHRoYXQgd2lsbCB3b3JrLiBJbiB0aGlzIGNhc2UsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgYW5kCiAgICAgIC8vIG1vc3QgYXJyYXkgZnVuY3Rpb25zIHdpbGwgc3RpbGwgd29yayBiZWNhdXNlIHRoZSBhcnJheSBpcyBzdGlsbAogICAgICAvLyBhcnJheS1saWtlIChzdXBwb3J0cyBsZW5ndGggYW5kIFtdKSBldmVuIHRob3VnaCBpdCBoYXMgbG9zdCBpdHMKICAgICAgLy8gcHJvdG90eXBlLgogICAgICAvLyBNYXJrIE1pbGxlciBub3RpY2VkIHRoYXQgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZwogICAgICAvLyBhbGxvd3MgYWNjZXNzIHRvIHRoZSB1bmZvcmdlYWJsZSBbW0NsYXNzXV0gcHJvcGVydHkuCiAgICAgIC8vICAxNS4yLjQuMiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nICggKQogICAgICAvLyAgV2hlbiB0aGUgdG9TdHJpbmcgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46CiAgICAgIC8vICAgICAgMS4gR2V0IHRoZSBbW0NsYXNzXV0gcHJvcGVydHkgb2YgdGhpcyBvYmplY3QuCiAgICAgIC8vICAgICAgMi4gQ29tcHV0ZSBhIHN0cmluZyB2YWx1ZSBieSBjb25jYXRlbmF0aW5nIHRoZSB0aHJlZSBzdHJpbmdzCiAgICAgIC8vICAgICAgICAgIltvYmplY3QgIiwgUmVzdWx0KDEpLCBhbmQgIl0iLgogICAgICAvLyAgICAgIDMuIFJldHVybiBSZXN1bHQoMikuCiAgICAgIC8vIGFuZCB0aGlzIGJlaGF2aW9yIHN1cnZpdmVzIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgZXhlY3V0aW9uIGNvbnRleHQuCiAgICAgIGlmICgoY2xhc3NOYW1lID09ICdbb2JqZWN0IEFycmF5XScgfHwKICAgICAgICAgICAvLyBJbiBJRSBhbGwgbm9uIHZhbHVlIHR5cGVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMgYWNyb3NzIHdpbmRvdwogICAgICAgICAgIC8vIGJvdW5kYXJpZXMgKG5vdCBpZnJhbWUgdGhvdWdoKSBzbyB3ZSBoYXZlIHRvIGRvIG9iamVjdCBkZXRlY3Rpb24KICAgICAgICAgICAvLyBmb3IgdGhpcyBlZGdlIGNhc2UuCiAgICAgICAgICAgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PSAnbnVtYmVyJyAmJgogICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUuc3BsaWNlICE9ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAhdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUoJ3NwbGljZScpCgogICAgICAgICAgICAgICApKSB7CiAgICAgICAgcmV0dXJuICdhcnJheSc7CiAgICAgIH0KICAgICAgLy8gSEFDSzogVGhlcmUgaXMgc3RpbGwgYW4gYXJyYXkgY2FzZSB0aGF0IGZhaWxzLgogICAgICAvLyAgICAgZnVuY3Rpb24gQXJyYXlJbXBvc3RvcigpIHt9CiAgICAgIC8vICAgICBBcnJheUltcG9zdG9yLnByb3RvdHlwZSA9IFtdOwogICAgICAvLyAgICAgdmFyIGltcG9zdG9yID0gbmV3IEFycmF5SW1wb3N0b3I7CiAgICAgIC8vIHRoaXMgY2FuIGJlIGZpeGVkIGJ5IGdldHRpbmcgcmlkIG9mIHRoZSBmYXN0IHBhdGgKICAgICAgLy8gKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIGFuZCBzb2xlbHkgcmVseWluZyBvbgogICAgICAvLyAodmFsdWUgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy52YWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJykKICAgICAgLy8gYnV0IHRoYXQgd291bGQgcmVxdWlyZSBtYW55IG1vcmUgZnVuY3Rpb24gY2FsbHMgYW5kIGlzIG5vdCB3YXJyYW50ZWQKICAgICAgLy8gdW5sZXNzIGNsb3N1cmUgY29kZSBpcyByZWNlaXZpbmcgb2JqZWN0cyBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzLgoKICAgICAgLy8gSUUgaW4gY3Jvc3Mtd2luZG93IGNhbGxzIGRvZXMgbm90IGNvcnJlY3RseSBtYXJzaGFsIHRoZSBmdW5jdGlvbiB0eXBlCiAgICAgIC8vIChpdCBhcHBlYXJzIGp1c3QgYXMgYW4gb2JqZWN0KSBzbyB3ZSBjYW5ub3QgdXNlIGp1c3QgdHlwZW9mIHZhbCA9PQogICAgICAvLyAnZnVuY3Rpb24nLiBIb3dldmVyLCBpZiB0aGUgb2JqZWN0IGhhcyBhIGNhbGwgcHJvcGVydHksIGl0IGlzIGEKICAgICAgLy8gZnVuY3Rpb24uCiAgICAgIGlmICgoY2xhc3NOYW1lID09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHwKICAgICAgICAgICB0eXBlb2YgdmFsdWUuY2FsbCAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUgIT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgICAgIXZhbHVlLnByb3BlcnR5SXNFbnVtZXJhYmxlKCdjYWxsJykpKSB7CiAgICAgICAgcmV0dXJuICdmdW5jdGlvbic7CiAgICAgIH0KCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJ251bGwnOwogICAgfQoKICB9IGVsc2UgaWYgKHMgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUuY2FsbCA9PSAndW5kZWZpbmVkJykgewogICAgLy8gSW4gU2FmYXJpIHR5cGVvZiBub2RlTGlzdCByZXR1cm5zICdmdW5jdGlvbicsIGFuZCBvbiBGaXJlZm94IHR5cGVvZgogICAgLy8gYmVoYXZlcyBzaW1pbGFybHkgZm9yIEhUTUx7QXBwbGV0LEVtYmVkLE9iamVjdH0sIEVsZW1lbnRzIGFuZCBSZWdFeHBzLiBXZQogICAgLy8gd291bGQgbGlrZSB0byByZXR1cm4gb2JqZWN0IGZvciB0aG9zZSBhbmQgd2UgY2FuIGRldGVjdCBhbiBpbnZhbGlkCiAgICAvLyBmdW5jdGlvbiBieSBtYWtpbmcgc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3QgaGFzIGEgY2FsbCBtZXRob2QuCiAgICByZXR1cm4gJ29iamVjdCc7CiAgfQogIHJldHVybiBzOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBudWxsLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIG51bGwuCiAqIEBkZXByZWNhdGVkIFVzZSBgdmFsID09PSBudWxsYCBpbnN0ZWFkLgogKi8KZ29vZy5pc051bGwgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gdmFsID09PSBudWxsOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC4KICogQGRlcHJlY2F0ZWQgVXNlIGB2YWwgIT0gbnVsbGAgaW5zdGVhZC4KICovCmdvb2cuaXNEZWZBbmROb3ROdWxsID0gZnVuY3Rpb24odmFsKSB7CiAgLy8gTm90ZSB0aGF0IHVuZGVmaW5lZCA9PSBudWxsLgogIHJldHVybiB2YWwgIT0gbnVsbDsKfTsKCgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYW4gYXJyYXkuCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYW4gYXJyYXkuCiAqLwpnb29nLmlzQXJyYXkgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gZ29vZy50eXBlT2YodmFsKSA9PSAnYXJyYXknOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBsb29rcyBsaWtlIGFuIGFycmF5LiBUbyBxdWFsaWZ5IGFzIGFycmF5IGxpa2UKICogdGhlIHZhbHVlIG5lZWRzIHRvIGJlIGVpdGhlciBhIE5vZGVMaXN0IG9yIGFuIG9iamVjdCB3aXRoIGEgTnVtYmVyIGxlbmd0aAogKiBwcm9wZXJ0eS4gTm90ZSB0aGF0IGZvciB0aGlzIGZ1bmN0aW9uIG5laXRoZXIgc3RyaW5ncyBub3IgZnVuY3Rpb25zIGFyZQogKiBjb25zaWRlcmVkICJhcnJheS1saWtlIi4KICoKICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhbiBhcnJheS4KICovCmdvb2cuaXNBcnJheUxpa2UgPSBmdW5jdGlvbih2YWwpIHsKICB2YXIgdHlwZSA9IGdvb2cudHlwZU9mKHZhbCk7CiAgLy8gV2UgZG8gbm90IHVzZSBnb29nLmlzT2JqZWN0IGhlcmUgaW4gb3JkZXIgdG8gZXhjbHVkZSBmdW5jdGlvbiB2YWx1ZXMuCiAgcmV0dXJuIHR5cGUgPT0gJ2FycmF5JyB8fCB0eXBlID09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwubGVuZ3RoID09ICdudW1iZXInOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBsb29rcyBsaWtlIGEgRGF0ZS4gVG8gcXVhbGlmeSBhcyBEYXRlLWxpa2UgdGhlCiAqIHZhbHVlIG5lZWRzIHRvIGJlIGFuIG9iamVjdCBhbmQgaGF2ZSBhIGdldEZ1bGxZZWFyKCkgZnVuY3Rpb24uCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYSBsaWtlIGEgRGF0ZS4KICovCmdvb2cuaXNEYXRlTGlrZSA9IGZ1bmN0aW9uKHZhbCkgewogIHJldHVybiBnb29nLmlzT2JqZWN0KHZhbCkgJiYgdHlwZW9mIHZhbC5nZXRGdWxsWWVhciA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIGZ1bmN0aW9uLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24uCiAqLwpnb29nLmlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gZ29vZy50eXBlT2YodmFsKSA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBvYmplY3QuICBUaGlzIGluY2x1ZGVzIGFycmF5cyBhbmQKICogZnVuY3Rpb25zLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIGFuIG9iamVjdC4KICovCmdvb2cuaXNPYmplY3QgPSBmdW5jdGlvbih2YWwpIHsKICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7CiAgcmV0dXJuIHR5cGUgPT0gJ29iamVjdCcgJiYgdmFsICE9IG51bGwgfHwgdHlwZSA9PSAnZnVuY3Rpb24nOwogIC8vIHJldHVybiBPYmplY3QodmFsKSA9PT0gdmFsIGFsc28gd29ya3MsIGJ1dCBpcyBzbG93ZXIsIGVzcGVjaWFsbHkgaWYgdmFsIGlzCiAgLy8gbm90IGFuIG9iamVjdC4KfTsKCgovKioKICogR2V0cyBhIHVuaXF1ZSBJRCBmb3IgYW4gb2JqZWN0LiBUaGlzIG11dGF0ZXMgdGhlIG9iamVjdCBzbyB0aGF0IGZ1cnRoZXIgY2FsbHMKICogd2l0aCB0aGUgc2FtZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZS4gVGhlIHVuaXF1ZSBJRCBpcwogKiBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBhY3Jvc3MgdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbW9uZ3N0IG9iamVjdHMgdGhhdCBhcmUKICogcGFzc2VkIGludG8gYGdldFVpZGAuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBJRCBpcyB1bmlxdWUgb3IKICogY29uc2lzdGVudCBhY3Jvc3Mgc2Vzc2lvbnMuIEl0IGlzIHVuc2FmZSB0byBnZW5lcmF0ZSB1bmlxdWUgSUQgZm9yIGZ1bmN0aW9uCiAqIHByb3RvdHlwZXMuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBnZXQgdGhlIHVuaXF1ZSBJRCBmb3IuCiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIG9iamVjdC4KICovCmdvb2cuZ2V0VWlkID0gZnVuY3Rpb24ob2JqKSB7CiAgLy8gVE9ETyhhcnYpOiBNYWtlIHRoZSB0eXBlIHN0cmljdGVyLCBkbyBub3QgYWNjZXB0IG51bGwuCgogIC8vIEluIE9wZXJhIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSBleGlzdHMgYnV0IGFsd2F5cyByZXR1cm5zIGZhbHNlIHNvIHdlIGF2b2lkCiAgLy8gdXNpbmcgaXQuIEFzIGEgY29uc2VxdWVuY2UgdGhlIHVuaXF1ZSBJRCBnZW5lcmF0ZWQgZm9yIEJhc2VDbGFzcy5wcm90b3R5cGUKICAvLyBhbmQgU3ViQ2xhc3MucHJvdG90eXBlIHdpbGwgYmUgdGhlIHNhbWUuCiAgLy8gVE9ETyhiLzE0MTUxMjMyMyk6IFVVSURzIGFyZSBicm9rZW4gZm9yIGN0b3JzIHdpdGggY2xhc3Mtc2lkZSBpbmhlcml0YW5jZS4KICByZXR1cm4gb2JqW2dvb2cuVUlEX1BST1BFUlRZX10gfHwKICAgICAgKG9ialtnb29nLlVJRF9QUk9QRVJUWV9dID0gKytnb29nLnVpZENvdW50ZXJfKTsKfTsKCgovKioKICogV2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFscmVhZHkgYXNzaWduZWQgYSB1bmlxdWUgSUQuCiAqCiAqIFRoaXMgZG9lcyBub3QgbW9kaWZ5IHRoZSBvYmplY3QuCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2suCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlcmUgaXMgYW4gYXNzaWduZWQgdW5pcXVlIGlkIGZvciB0aGUgb2JqZWN0LgogKi8KZ29vZy5oYXNVaWQgPSBmdW5jdGlvbihvYmopIHsKICByZXR1cm4gISFvYmpbZ29vZy5VSURfUFJPUEVSVFlfXTsKfTsKCgovKioKICogUmVtb3ZlcyB0aGUgdW5pcXVlIElEIGZyb20gYW4gb2JqZWN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgb2JqZWN0IHdhcwogKiBwcmV2aW91c2x5IG11dGF0ZWQgdXNpbmcgYGdvb2cuZ2V0VWlkYCBpbiB3aGljaCBjYXNlIHRoZSBtdXRhdGlvbiBpcwogKiB1bmRvbmUuCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byByZW1vdmUgdGhlIHVuaXF1ZSBJRCBmaWVsZCBmcm9tLgogKi8KZ29vZy5yZW1vdmVVaWQgPSBmdW5jdGlvbihvYmopIHsKICAvLyBUT0RPKGFydik6IE1ha2UgdGhlIHR5cGUgc3RyaWN0ZXIsIGRvIG5vdCBhY2NlcHQgbnVsbC4KCiAgLy8gSW4gSUUsIERPTSBub2RlcyBhcmUgbm90IGluc3RhbmNlcyBvZiBPYmplY3QgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB3ZQogIC8vIHRyeSB0byBkZWxldGUuICBJbnN0ZWFkIHdlIHRyeSB0byB1c2UgcmVtb3ZlQXR0cmlidXRlLgogIGlmIChvYmogIT09IG51bGwgJiYgJ3JlbW92ZUF0dHJpYnV0ZScgaW4gb2JqKSB7CiAgICBvYmoucmVtb3ZlQXR0cmlidXRlKGdvb2cuVUlEX1BST1BFUlRZXyk7CiAgfQoKICB0cnkgewogICAgZGVsZXRlIG9ialtnb29nLlVJRF9QUk9QRVJUWV9dOwogIH0gY2F0Y2ggKGV4KSB7CiAgfQp9OwoKCi8qKgogKiBOYW1lIGZvciB1bmlxdWUgSUQgcHJvcGVydHkuIEluaXRpYWxpemVkIGluIGEgd2F5IHRvIGhlbHAgYXZvaWQgY29sbGlzaW9ucwogKiB3aXRoIG90aGVyIGNsb3N1cmUgSmF2YVNjcmlwdCBvbiB0aGUgc2FtZSBwYWdlLgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KZ29vZy5VSURfUFJPUEVSVFlfID0gJ2Nsb3N1cmVfdWlkXycgKyAoKE1hdGgucmFuZG9tKCkgKiAxZTkpID4+PiAwKTsKCgovKioKICogQ291bnRlciBmb3IgVUlELgogKiBAdHlwZSB7bnVtYmVyfQogKiBAcHJpdmF0ZQogKi8KZ29vZy51aWRDb3VudGVyXyA9IDA7CgoKLyoqCiAqIEFkZHMgYSBoYXNoIGNvZGUgZmllbGQgdG8gYW4gb2JqZWN0LiBUaGUgaGFzaCBjb2RlIGlzIHVuaXF1ZSBmb3IgdGhlCiAqIGdpdmVuIG9iamVjdC4KICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGdldCB0aGUgaGFzaCBjb2RlIGZvci4KICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaCBjb2RlIGZvciB0aGUgb2JqZWN0LgogKiBAZGVwcmVjYXRlZCBVc2UgZ29vZy5nZXRVaWQgaW5zdGVhZC4KICovCmdvb2cuZ2V0SGFzaENvZGUgPSBnb29nLmdldFVpZDsKCgovKioKICogUmVtb3ZlcyB0aGUgaGFzaCBjb2RlIGZpZWxkIGZyb20gYW4gb2JqZWN0LgogKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmVtb3ZlIHRoZSBmaWVsZCBmcm9tLgogKiBAZGVwcmVjYXRlZCBVc2UgZ29vZy5yZW1vdmVVaWQgaW5zdGVhZC4KICovCmdvb2cucmVtb3ZlSGFzaENvZGUgPSBnb29nLnJlbW92ZVVpZDsKCgovKioKICogQ2xvbmVzIGEgdmFsdWUuIFRoZSBpbnB1dCBtYXkgYmUgYW4gT2JqZWN0LCBBcnJheSwgb3IgYmFzaWMgdHlwZS4gT2JqZWN0cyBhbmQKICogYXJyYXlzIHdpbGwgYmUgY2xvbmVkIHJlY3Vyc2l2ZWx5LgogKgogKiBXQVJOSU5HUzoKICogPGNvZGU+Z29vZy5jbG9uZU9iamVjdDwvY29kZT4gZG9lcyBub3QgZGV0ZWN0IHJlZmVyZW5jZSBsb29wcy4gT2JqZWN0cyB0aGF0CiAqIHJlZmVyIHRvIHRoZW1zZWx2ZXMgd2lsbCBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24uCiAqCiAqIDxjb2RlPmdvb2cuY2xvbmVPYmplY3Q8L2NvZGU+IGlzIHVuYXdhcmUgb2YgdW5pcXVlIGlkZW50aWZpZXJzLCBhbmQgY29waWVzCiAqIFVJRHMgY3JlYXRlZCBieSA8Y29kZT5nZXRVaWQ8L2NvZGU+IGludG8gY2xvbmVkIHJlc3VsdHMuCiAqCiAqIEBwYXJhbSB7Kn0gb2JqIFRoZSB2YWx1ZSB0byBjbG9uZS4KICogQHJldHVybiB7Kn0gQSBjbG9uZSBvZiB0aGUgaW5wdXQgdmFsdWUuCiAqIEBkZXByZWNhdGVkIGdvb2cuY2xvbmVPYmplY3QgaXMgdW5zYWZlLiBQcmVmZXIgdGhlIGdvb2cub2JqZWN0IG1ldGhvZHMuCiAqLwpnb29nLmNsb25lT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7CiAgdmFyIHR5cGUgPSBnb29nLnR5cGVPZihvYmopOwogIGlmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2FycmF5JykgewogICAgaWYgKHR5cGVvZiBvYmouY2xvbmUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIG9iai5jbG9uZSgpOwogICAgfQogICAgdmFyIGNsb25lID0gdHlwZSA9PSAnYXJyYXknID8gW10gOiB7fTsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgY2xvbmVba2V5XSA9IGdvb2cuY2xvbmVPYmplY3Qob2JqW2tleV0pOwogICAgfQogICAgcmV0dXJuIGNsb25lOwogIH0KCiAgcmV0dXJuIG9iajsKfTsKCgovKioKICogQSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZ29vZy5iaW5kLgogKiBAcGFyYW0gez9mdW5jdGlvbih0aGlzOlQsIC4uLil9IGZuIEEgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5LgogKiBAcGFyYW0ge1R9IHNlbGZPYmogU3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hpY2ggdGhpcyBzaG91bGQgcG9pbnQgdG8gd2hlbiB0aGUKICogICAgIGZ1bmN0aW9uIGlzIHJ1bi4KICogQHBhcmFtIHsuLi4qfSB2YXJfYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXJ0aWFsbHkgYXBwbGllZCB0byB0aGUKICogICAgIGZ1bmN0aW9uLgogKiBAcmV0dXJuIHshRnVuY3Rpb259IEEgcGFydGlhbGx5LWFwcGxpZWQgZm9ybSBvZiB0aGUgZnVuY3Rpb24gZ29vZy5iaW5kKCkgd2FzCiAqICAgICBpbnZva2VkIGFzIGEgbWV0aG9kIG9mLgogKiBAdGVtcGxhdGUgVAogKiBAcHJpdmF0ZQogKi8KZ29vZy5iaW5kTmF0aXZlXyA9IGZ1bmN0aW9uKGZuLCBzZWxmT2JqLCB2YXJfYXJncykgewogIHJldHVybiAvKiogQHR5cGUgeyFGdW5jdGlvbn0gKi8gKGZuLmNhbGwuYXBwbHkoZm4uYmluZCwgYXJndW1lbnRzKSk7Cn07CgoKLyoqCiAqIEEgcHVyZS1KUyBpbXBsZW1lbnRhdGlvbiBvZiBnb29nLmJpbmQuCiAqIEBwYXJhbSB7P2Z1bmN0aW9uKHRoaXM6VCwgLi4uKX0gZm4gQSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkuCiAqIEBwYXJhbSB7VH0gc2VsZk9iaiBTcGVjaWZpZXMgdGhlIG9iamVjdCB3aGljaCB0aGlzIHNob3VsZCBwb2ludCB0byB3aGVuIHRoZQogKiAgICAgZnVuY3Rpb24gaXMgcnVuLgogKiBAcGFyYW0gey4uLip9IHZhcl9hcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgYXJlIHBhcnRpYWxseSBhcHBsaWVkIHRvIHRoZQogKiAgICAgZnVuY3Rpb24uCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gQSBwYXJ0aWFsbHktYXBwbGllZCBmb3JtIG9mIHRoZSBmdW5jdGlvbiBnb29nLmJpbmQoKSB3YXMKICogICAgIGludm9rZWQgYXMgYSBtZXRob2Qgb2YuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwcml2YXRlCiAqLwpnb29nLmJpbmRKc18gPSBmdW5jdGlvbihmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICBpZiAoIWZuKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICB9CgogIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgdmFyIGJvdW5kQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIC8vIFByZXBlbmQgdGhlIGJvdW5kIGFyZ3VtZW50cyB0byB0aGUgY3VycmVudCBhcmd1bWVudHMuCiAgICAgIHZhciBuZXdBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkobmV3QXJncywgYm91bmRBcmdzKTsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIG5ld0FyZ3MpOwogICAgfTsKCiAgfSBlbHNlIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIGFyZ3VtZW50cyk7CiAgICB9OwogIH0KfTsKCgovKioKICogUGFydGlhbGx5IGFwcGxpZXMgdGhpcyBmdW5jdGlvbiB0byBhIHBhcnRpY3VsYXIgJ3RoaXMgb2JqZWN0JyBhbmQgemVybyBvcgogKiBtb3JlIGFyZ3VtZW50cy4gVGhlIHJlc3VsdCBpcyBhIG5ldyBmdW5jdGlvbiB3aXRoIHNvbWUgYXJndW1lbnRzIG9mIHRoZSBmaXJzdAogKiBmdW5jdGlvbiBwcmUtZmlsbGVkIGFuZCB0aGUgdmFsdWUgb2YgdGhpcyAncHJlLXNwZWNpZmllZCcuCiAqCiAqIFJlbWFpbmluZyBhcmd1bWVudHMgc3BlY2lmaWVkIGF0IGNhbGwtdGltZSBhcmUgYXBwZW5kZWQgdG8gdGhlIHByZS1zcGVjaWZpZWQKICogb25lcy4KICoKICogQWxzbyBzZWU6IHtAbGluayAjcGFydGlhbH0uCiAqCiAqIFVzYWdlOgogKiA8cHJlPnZhciBiYXJNZXRoQm91bmQgPSBnb29nLmJpbmQobXlGdW5jdGlvbiwgbXlPYmosICdhcmcxJywgJ2FyZzInKTsKICogYmFyTWV0aEJvdW5kKCdhcmczJywgJ2FyZzQnKTs8L3ByZT4KICoKICogQHBhcmFtIHs/ZnVuY3Rpb24odGhpczpULCAuLi4pfSBmbiBBIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseS4KICogQHBhcmFtIHtUfSBzZWxmT2JqIFNwZWNpZmllcyB0aGUgb2JqZWN0IHdoaWNoIHRoaXMgc2hvdWxkIHBvaW50IHRvIHdoZW4gdGhlCiAqICAgICBmdW5jdGlvbiBpcyBydW4uCiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFydGlhbGx5IGFwcGxpZWQgdG8gdGhlCiAqICAgICBmdW5jdGlvbi4KICogQHJldHVybiB7IUZ1bmN0aW9ufSBBIHBhcnRpYWxseS1hcHBsaWVkIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIGdvb2cuYmluZCgpIHdhcwogKiAgICAgaW52b2tlZCBhcyBhIG1ldGhvZCBvZi4KICogQHRlbXBsYXRlIFQKICogQHN1cHByZXNzIHtkZXByZWNhdGVkfSBTZWUgYWJvdmUuCiAqLwpnb29nLmJpbmQgPSBmdW5jdGlvbihmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICAvLyBUT0RPKG5pY2tzYW50b3MpOiBuYXJyb3cgdGhlIHR5cGUgc2lnbmF0dXJlLgogIGlmIChGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAmJgogICAgICAvLyBOT1RFKG5pY2tzYW50b3MpOiBTb21lYm9keSBwdWxsZWQgYmFzZS5qcyBpbnRvIHRoZSBkZWZhdWx0IENocm9tZQogICAgICAvLyBleHRlbnNpb24gZW52aXJvbm1lbnQuIFRoaXMgbWVhbnMgdGhhdCBmb3IgQ2hyb21lIGV4dGVuc2lvbnMsIHRoZXkgZ2V0CiAgICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB0aGF0IGNhbGxzIGdvb2cuYmluZAogICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgb25lLiBFdmVuIHdvcnNlLCB3ZSBkb24ndCB3YW50IHRvIGludHJvZHVjZSBhCiAgICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBnb29nLmJpbmQgYW5kIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBzbwogICAgICAvLyB3ZSBoYXZlIHRvIGhhY2sgdGhpcyB0byBtYWtlIHN1cmUgaXQgd29ya3MgY29ycmVjdGx5LgogICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC50b1N0cmluZygpLmluZGV4T2YoJ25hdGl2ZSBjb2RlJykgIT0gLTEpIHsKICAgIGdvb2cuYmluZCA9IGdvb2cuYmluZE5hdGl2ZV87CiAgfSBlbHNlIHsKICAgIGdvb2cuYmluZCA9IGdvb2cuYmluZEpzXzsKICB9CiAgcmV0dXJuIGdvb2cuYmluZC5hcHBseShudWxsLCBhcmd1bWVudHMpOwp9OwoKCi8qKgogKiBMaWtlIGdvb2cuYmluZCgpLCBleGNlcHQgdGhhdCBhICd0aGlzIG9iamVjdCcgaXMgbm90IHJlcXVpcmVkLiBVc2VmdWwgd2hlbgogKiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGlzIGFscmVhZHkgYm91bmQuCiAqCiAqIFVzYWdlOgogKiB2YXIgZyA9IGdvb2cucGFydGlhbChmLCBhcmcxLCBhcmcyKTsKICogZyhhcmczLCBhcmc0KTsKICoKICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gQSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkuCiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFydGlhbGx5IGFwcGxpZWQgdG8gZm4uCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gQSBwYXJ0aWFsbHktYXBwbGllZCBmb3JtIG9mIHRoZSBmdW5jdGlvbiBnb29nLnBhcnRpYWwoKQogKiAgICAgd2FzIGludm9rZWQgYXMgYSBtZXRob2Qgb2YuCiAqLwpnb29nLnBhcnRpYWwgPSBmdW5jdGlvbihmbiwgdmFyX2FyZ3MpIHsKICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgLy8gQ2xvbmUgdGhlIGFycmF5ICh3aXRoIHNsaWNlKCkpIGFuZCBhcHBlbmQgYWRkaXRpb25hbCBhcmd1bWVudHMKICAgIC8vIHRvIHRoZSBleGlzdGluZyBhcmd1bWVudHMuCiAgICB2YXIgbmV3QXJncyA9IGFyZ3Muc2xpY2UoKTsKICAgIG5ld0FyZ3MucHVzaC5hcHBseShuZXdBcmdzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIGZuLmFwcGx5KC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpLCBuZXdBcmdzKTsKICB9Owp9OwoKCi8qKgogKiBDb3BpZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc291cmNlIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuIFRoaXMgbWV0aG9kCiAqIGRvZXMgbm90IHdvcmsgb24gYWxsIGJyb3dzZXJzIGZvciBhbGwgb2JqZWN0cyB0aGF0IGNvbnRhaW4ga2V5cyBzdWNoIGFzCiAqIHRvU3RyaW5nIG9yIGhhc093blByb3BlcnR5LiBVc2UgZ29vZy5vYmplY3QuZXh0ZW5kIGZvciB0aGlzIHB1cnBvc2UuCiAqCiAqIE5PVEU6IFNvbWUgaGF2ZSBhZHZvY2F0ZWQgZm9yIHRoZSB1c2Ugb2YgZ29vZy5taXhpbiB0byBzZXR1cCBjbGFzc2VzCiAqIHdpdGggbXVsdGlwbGUgaW5oZXJpdGVuY2UgKHRyYWl0cywgbWl4aW5zLCBldGMpLiAgSG93ZXZlciwgYXMgaXQgc2ltcGx5CiAqIHVzZXMgImZvciBpbiIsIHRoaXMgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBFUzYgY2xhc3NlcyB3aG9zZSBtZXRob2RzIGFyZQogKiBub24tZW51bWVyYWJsZS4gIENoYW5naW5nIHRoaXMsIHdvdWxkIGJyZWFrIGNhc2VzIHdoZXJlIG5vbi1lbnVtZXJhYmxlCiAqIHByb3BlcnRpZXMgYXJlIG5vdCBleHBlY3RlZC4KICoKICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQuCiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlLgogKiBAZGVwcmVjYXRlZCBQcmVmZXIgT2JqZWN0LmFzc2lnbgogKi8KZ29vZy5taXhpbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CiAgZm9yICh2YXIgeCBpbiBzb3VyY2UpIHsKICAgIHRhcmdldFt4XSA9IHNvdXJjZVt4XTsKICB9CgogIC8vIEZvciBJRTcgb3IgbG93ZXIsIHRoZSBmb3ItaW4tbG9vcCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9wZXJ0aWVzIHRoYXQgYXJlCiAgLy8gbm90IGVudW1lcmFibGUgb24gdGhlIHByb3RvdHlwZSBvYmplY3QgKGZvciBleGFtcGxlLCBpc1Byb3RvdHlwZU9mIGZyb20KICAvLyBPYmplY3QucHJvdG90eXBlKSBidXQgYWxzbyBpdCB3aWxsIG5vdCBpbmNsdWRlICdyZXBsYWNlJyBvbiBvYmplY3RzIHRoYXQKICAvLyBleHRlbmQgU3RyaW5nIGFuZCBjaGFuZ2UgJ3JlcGxhY2UnIChub3QgdGhhdCBpdCBpcyBjb21tb24gZm9yIGFueW9uZSB0bwogIC8vIGV4dGVuZCBhbnl0aGluZyBleGNlcHQgT2JqZWN0KS4KfTsKCgovKioKICogQHJldHVybiB7bnVtYmVyfSBBbiBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwogKiAgICAgYmV0d2VlbiBtaWRuaWdodCwgSmFudWFyeSAxLCAxOTcwIGFuZCB0aGUgY3VycmVudCB0aW1lLgogKiBAZGVwcmVjYXRlZCBVc2UgRGF0ZS5ub3cKICovCmdvb2cubm93ID0gKGdvb2cuVFJVU1RFRF9TSVRFICYmIERhdGUubm93KSB8fCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAvLyBVbmFyeSBwbHVzIG9wZXJhdG9yIGNvbnZlcnRzIGl0cyBvcGVyYW5kIHRvIGEgbnVtYmVyIHdoaWNoIGluCiAgICAgICAgICAgICAvLyB0aGUgY2FzZSBvZgogICAgICAgICAgICAgLy8gYSBkYXRlIGlzIGRvbmUgYnkgY2FsbGluZyBnZXRUaW1lKCkuCiAgICAgICAgICAgICByZXR1cm4gK25ldyBEYXRlKCk7CiAgICAgICAgICAgfSk7CgoKLyoqCiAqIEV2YWxzIEphdmFTY3JpcHQgaW4gdGhlIGdsb2JhbCBzY29wZS4gIEluIElFIHRoaXMgdXNlcyBleGVjU2NyaXB0LCBvdGhlcgogKiBicm93c2VycyB1c2UgZ29vZy5nbG9iYWwuZXZhbC4gSWYgZ29vZy5nbG9iYWwuZXZhbCBkb2VzIG5vdCBldmFsdWF0ZSBpbiB0aGUKICogZ2xvYmFsIHNjb3BlIChmb3IgZXhhbXBsZSwgaW4gU2FmYXJpKSwgYXBwZW5kcyBhIHNjcmlwdCB0YWcgaW5zdGVhZC4KICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBuZWl0aGVyIGV4ZWNTY3JpcHQgb3IgZXZhbCBpcyBkZWZpbmVkLgogKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0IEphdmFTY3JpcHQgc3RyaW5nLgogKi8KZ29vZy5nbG9iYWxFdmFsID0gZnVuY3Rpb24oc2NyaXB0KSB7CiAgaWYgKGdvb2cuZ2xvYmFsLmV4ZWNTY3JpcHQpIHsKICAgIGdvb2cuZ2xvYmFsLmV4ZWNTY3JpcHQoc2NyaXB0LCAnSmF2YVNjcmlwdCcpOwogIH0gZWxzZSBpZiAoZ29vZy5nbG9iYWwuZXZhbCkgewogICAgLy8gVGVzdCB0byBzZWUgaWYgZXZhbCB3b3JrcwogICAgaWYgKGdvb2cuZXZhbFdvcmtzRm9yR2xvYmFsc18gPT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIGdvb2cuZ2xvYmFsLmV2YWwoJ3ZhciBfZXZhbFRlc3RfID0gMTsnKTsKICAgICAgfSBjYXRjaCAoaWdub3JlKSB7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBnb29nLmdsb2JhbFsnX2V2YWxUZXN0XyddICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGRlbGV0ZSBnb29nLmdsb2JhbFsnX2V2YWxUZXN0XyddOwogICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkgewogICAgICAgICAgLy8gTWljcm9zb2Z0IGVkZ2UgZmFpbHMgdGhlIGRlbGV0aW9uIGFib3ZlIGluIHN0cmljdCBtb2RlLgogICAgICAgIH0KICAgICAgICBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXykgewogICAgICBnb29nLmdsb2JhbC5ldmFsKHNjcmlwdCk7CiAgICB9IGVsc2UgewogICAgICAvKiogQHR5cGUgeyFEb2N1bWVudH0gKi8KICAgICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50OwogICAgICB2YXIgc2NyaXB0RWx0ID0KICAgICAgICAgIC8qKiBAdHlwZSB7IUhUTUxTY3JpcHRFbGVtZW50fSAqLyAoZG9jLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKTsKICAgICAgc2NyaXB0RWx0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgc2NyaXB0RWx0LmRlZmVyID0gZmFsc2U7CiAgICAgIC8vIE5vdGUodXNlcik6IGNhbid0IHVzZSAuaW5uZXJIVE1MIHNpbmNlICJ0KCc8dGVzdD4nKSIgd2lsbCBmYWlsIGFuZAogICAgICAvLyAudGV4dCBkb2Vzbid0IHdvcmsgaW4gU2FmYXJpIDIuICBUaGVyZWZvcmUgd2UgYXBwZW5kIGEgdGV4dCBub2RlLgogICAgICBzY3JpcHRFbHQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHNjcmlwdCkpOwogICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHRFbHQpOwogICAgICBkb2MuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRFbHQpOwogICAgfQogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cuZ2xvYmFsRXZhbCBub3QgYXZhaWxhYmxlJyk7CiAgfQp9OwoKCi8qKgogKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3Qgd2UgY2FuIGNhbGwgJ2V2YWwnIGRpcmVjdGx5IHRvIGV2YWwgY29kZSBpbiB0aGUKICogZ2xvYmFsIHNjb3BlLiBTZXQgdG8gYSBCb29sZWFuIGJ5IHRoZSBmaXJzdCBjYWxsIHRvIGdvb2cuZ2xvYmFsRXZhbCAod2hpY2gKICogZW1waXJpY2FsbHkgdGVzdHMgd2hldGhlciBldmFsIHdvcmtzIGZvciBnbG9iYWxzKS4gQHNlZSBnb29nLmdsb2JhbEV2YWwKICogQHR5cGUgez9ib29sZWFufQogKiBAcHJpdmF0ZQogKi8KZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXyA9IG51bGw7CgoKLyoqCiAqIE9wdGlvbmFsIG1hcCBvZiBDU1MgY2xhc3MgbmFtZXMgdG8gb2JmdXNjYXRlZCBuYW1lcyB1c2VkIHdpdGgKICogZ29vZy5nZXRDc3NOYW1lKCkuCiAqIEBwcml2YXRlIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPnx1bmRlZmluZWR9CiAqIEBzZWUgZ29vZy5zZXRDc3NOYW1lTWFwcGluZwogKi8KZ29vZy5jc3NOYW1lTWFwcGluZ187CgoKLyoqCiAqIE9wdGlvbmFsIG9iZnVzY2F0aW9uIHN0eWxlIGZvciBDU1MgY2xhc3MgbmFtZXMuIFNob3VsZCBiZSBzZXQgdG8gZWl0aGVyCiAqICdCWV9XSE9MRScgb3IgJ0JZX1BBUlQnIGlmIGRlZmluZWQuCiAqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfQogKiBAcHJpdmF0ZQogKiBAc2VlIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcKICovCmdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV87CgoKCi8qKgogKiBBIGhvb2sgZm9yIG1vZGlmeWluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBnb29nLmdldENzc05hbWUuIFRoZSBmdW5jdGlvbgogKiBpZiBwcmVzZW50LCB3aWxsIHJlY2VpdmUgdGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGUgZ29vZy5nZXRDc3NOYW1lIGFzCiAqIGl0cyBpbnB1dC4KICoKICogQHR5cGUgeyhmdW5jdGlvbihzdHJpbmcpOnN0cmluZyl8dW5kZWZpbmVkfQogKi8KZ29vZy5nbG9iYWwuQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk47CgoKLyoqCiAqIEhhbmRsZXMgc3RyaW5ncyB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIENTUyBjbGFzcyBuYW1lcy4KICoKICogVGhpcyBmdW5jdGlvbiB3b3JrcyBpbiB0YW5kZW0gd2l0aCBAc2VlIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcuCiAqCiAqIFdpdGhvdXQgYW55IG1hcHBpbmcgc2V0LCB0aGUgYXJndW1lbnRzIGFyZSBzaW1wbGUgam9pbmVkIHdpdGggYSBoeXBoZW4gYW5kCiAqIHBhc3NlZCB0aHJvdWdoIHVuYWx0ZXJlZC4KICoKICogV2hlbiB0aGVyZSBpcyBhIG1hcHBpbmcsIHRoZXJlIGFyZSB0d28gcG9zc2libGUgc3R5bGVzIGluIHdoaWNoIHRoZXNlCiAqIG1hcHBpbmdzIGFyZSB1c2VkLiBJbiB0aGUgQllfUEFSVCBzdHlsZSwgZWFjaCBwYXJ0IChpLmUuIGluIGJldHdlZW4gaHlwaGVucykKICogb2YgdGhlIHBhc3NlZCBpbiBjc3MgbmFtZSBpcyByZXdyaXR0ZW4gYWNjb3JkaW5nIHRvIHRoZSBtYXAuIEluIHRoZSBCWV9XSE9MRQogKiBzdHlsZSwgdGhlIGZ1bGwgY3NzIG5hbWUgaXMgbG9va2VkIHVwIGluIHRoZSBtYXAgZGlyZWN0bHkuIElmIGEgcmV3cml0ZSBpcwogKiBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBtYXAsIHRoZSBjb21waWxlciB3aWxsIG91dHB1dCBhIHdhcm5pbmcuCiAqCiAqIFdoZW4gdGhlIG1hcHBpbmcgaXMgcGFzc2VkIHRvIHRoZSBjb21waWxlciwgaXQgd2lsbCByZXBsYWNlIGNhbGxzIHRvCiAqIGdvb2cuZ2V0Q3NzTmFtZSB3aXRoIHRoZSBzdHJpbmdzIGZyb20gdGhlIG1hcHBpbmcsIGUuZy4KICogICAgIHZhciB4ID0gZ29vZy5nZXRDc3NOYW1lKCdmb28nKTsKICogICAgIHZhciB5ID0gZ29vZy5nZXRDc3NOYW1lKHRoaXMuYmFzZUNsYXNzLCAnYWN0aXZlJyk7CiAqICBiZWNvbWVzOgogKiAgICAgdmFyIHggPSAnZm9vJzsKICogICAgIHZhciB5ID0gdGhpcy5iYXNlQ2xhc3MgKyAnLWFjdGl2ZSc7CiAqCiAqIElmIG9uZSBhcmd1bWVudCBpcyBwYXNzZWQgaXQgd2lsbCBiZSBwcm9jZXNzZWQsIGlmIHR3byBhcmUgcGFzc2VkIG9ubHkgdGhlCiAqIG1vZGlmaWVyIHdpbGwgYmUgcHJvY2Vzc2VkLCBhcyBpdCBpcyBhc3N1bWVkIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgZ2VuZXJhdGVkCiAqIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgZ29vZy5nZXRDc3NOYW1lLgogKgogKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lLgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9tb2RpZmllciBBIG1vZGlmaWVyIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBjbGFzcyBuYW1lLgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjbGFzcyBuYW1lIG9yIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjbGFzcyBuYW1lIGFuZAogKiAgICAgdGhlIG1vZGlmaWVyLgogKi8KZ29vZy5nZXRDc3NOYW1lID0gZnVuY3Rpb24oY2xhc3NOYW1lLCBvcHRfbW9kaWZpZXIpIHsKICAvLyBTdHJpbmcoKSBpcyB1c2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY29tcGlsZWQgc295IHdoZXJlIHRoZSBwYXNzZWQKICAvLyBjbGFzc05hbWUgY2FuIGJlIG5vbi1zdHJpbmcgb2JqZWN0cy4KICBpZiAoU3RyaW5nKGNsYXNzTmFtZSkuY2hhckF0KDApID09ICcuJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdjbGFzc05hbWUgcGFzc2VkIGluIGdvb2cuZ2V0Q3NzTmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICIuIi4nICsKICAgICAgICAnIFlvdSBwYXNzZWQ6ICcgKyBjbGFzc05hbWUpOwogIH0KCiAgdmFyIGdldE1hcHBpbmcgPSBmdW5jdGlvbihjc3NOYW1lKSB7CiAgICByZXR1cm4gZ29vZy5jc3NOYW1lTWFwcGluZ19bY3NzTmFtZV0gfHwgY3NzTmFtZTsKICB9OwoKICB2YXIgcmVuYW1lQnlQYXJ0cyA9IGZ1bmN0aW9uKGNzc05hbWUpIHsKICAgIC8vIFJlbWFwIGFsbCB0aGUgcGFydHMgaW5kaXZpZHVhbGx5LgogICAgdmFyIHBhcnRzID0gY3NzTmFtZS5zcGxpdCgnLScpOwogICAgdmFyIG1hcHBlZCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICBtYXBwZWQucHVzaChnZXRNYXBwaW5nKHBhcnRzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gbWFwcGVkLmpvaW4oJy0nKTsKICB9OwoKICB2YXIgcmVuYW1lOwogIGlmIChnb29nLmNzc05hbWVNYXBwaW5nXykgewogICAgcmVuYW1lID0KICAgICAgICBnb29nLmNzc05hbWVNYXBwaW5nU3R5bGVfID09ICdCWV9XSE9MRScgPyBnZXRNYXBwaW5nIDogcmVuYW1lQnlQYXJ0czsKICB9IGVsc2UgewogICAgcmVuYW1lID0gZnVuY3Rpb24oYSkgewogICAgICByZXR1cm4gYTsKICAgIH07CiAgfQoKICB2YXIgcmVzdWx0ID0KICAgICAgb3B0X21vZGlmaWVyID8gY2xhc3NOYW1lICsgJy0nICsgcmVuYW1lKG9wdF9tb2RpZmllcikgOiByZW5hbWUoY2xhc3NOYW1lKTsKCiAgLy8gVGhlIHNwZWNpYWwgQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk4gYWxsb3dzIHVzZXJzIHRvIHNwZWNpZnkgZnVydGhlcgogIC8vIHByb2Nlc3Npbmcgb2YgdGhlIGNsYXNzIG5hbWUuCiAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQX0ZOKSB7CiAgICByZXR1cm4gZ29vZy5nbG9iYWwuQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk4ocmVzdWx0KTsKICB9CgogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqCiAqIFNldHMgdGhlIG1hcCB0byBjaGVjayB3aGVuIHJldHVybmluZyBhIHZhbHVlIGZyb20gZ29vZy5nZXRDc3NOYW1lKCkuIEV4YW1wbGU6CiAqIDxwcmU+CiAqIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcoewogKiAgICJnb29nIjogImEiLAogKiAgICJkaXNhYmxlZCI6ICJiIiwKICogfSk7CiAqCiAqIHZhciB4ID0gZ29vZy5nZXRDc3NOYW1lKCdnb29nJyk7CiAqIC8vIFRoZSBmb2xsb3dpbmcgZXZhbHVhdGVzIHRvOiAiYSBhLWIiLgogKiBnb29nLmdldENzc05hbWUoJ2dvb2cnKSArICcgJyArIGdvb2cuZ2V0Q3NzTmFtZSh4LCAnZGlzYWJsZWQnKQogKiA8L3ByZT4KICogV2hlbiBkZWNsYXJlZCBhcyBhIG1hcCBvZiBzdHJpbmcgbGl0ZXJhbHMgdG8gc3RyaW5nIGxpdGVyYWxzLCB0aGUgSlNDb21waWxlcgogKiB3aWxsIHJlcGxhY2UgYWxsIGNhbGxzIHRvIGdvb2cuZ2V0Q3NzTmFtZSgpIHVzaW5nIHRoZSBzdXBwbGllZCBtYXAgaWYgdGhlCiAqIC0tcHJvY2Vzc19jbG9zdXJlX3ByaW1pdGl2ZXMgZmxhZyBpcyBzZXQuCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gbWFwcGluZyBBIG1hcCBvZiBzdHJpbmdzIHRvIHN0cmluZ3Mgd2hlcmUga2V5cyBhcmUgcG9zc2libGUKICogICAgIGFyZ3VtZW50cyB0byBnb29nLmdldENzc05hbWUoKSBhbmQgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMKICogICAgIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9zdHlsZSBUaGUgc3R5bGUgb2YgY3NzIG5hbWUgbWFwcGluZy4gVGhlcmUgYXJlIHR3byB2YWxpZAogKiAgICAgb3B0aW9uczogJ0JZX1BBUlQnLCBhbmQgJ0JZX1dIT0xFJy4KICogQHNlZSBnb29nLmdldENzc05hbWUgZm9yIGEgZGVzY3JpcHRpb24uCiAqLwpnb29nLnNldENzc05hbWVNYXBwaW5nID0gZnVuY3Rpb24obWFwcGluZywgb3B0X3N0eWxlKSB7CiAgZ29vZy5jc3NOYW1lTWFwcGluZ18gPSBtYXBwaW5nOwogIGdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV8gPSBvcHRfc3R5bGU7Cn07CgoKLyoqCiAqIFRvIHVzZSBDU1MgcmVuYW1pbmcgaW4gY29tcGlsZWQgbW9kZSwgb25lIG9mIHRoZSBpbnB1dCBmaWxlcyBzaG91bGQgaGF2ZSBhCiAqIGNhbGwgdG8gZ29vZy5zZXRDc3NOYW1lTWFwcGluZygpIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwgdGhhdCB0aGUgSlNDb21waWxlcgogKiBjYW4gZXh0cmFjdCBhbmQgdXNlIHRvIHJlcGxhY2UgYWxsIGNhbGxzIHRvIGdvb2cuZ2V0Q3NzTmFtZSgpLiBJbiB1bmNvbXBpbGVkCiAqIG1vZGUsIEphdmFTY3JpcHQgY29kZSBzaG91bGQgYmUgbG9hZGVkIGJlZm9yZSB0aGlzIGJhc2UuanMgZmlsZSB0aGF0IGRlY2xhcmVzCiAqIGEgZ2xvYmFsIHZhcmlhYmxlLCBDTE9TVVJFX0NTU19OQU1FX01BUFBJTkcsIHdoaWNoIGlzIHVzZWQgYmVsb3cuIFRoaXMgaXMKICogdG8gZW5zdXJlIHRoYXQgdGhlIG1hcHBpbmcgaXMgbG9hZGVkIGJlZm9yZSBhbnkgY2FsbHMgdG8gZ29vZy5nZXRDc3NOYW1lKCkKICogYXJlIG1hZGUgaW4gdW5jb21waWxlZCBtb2RlLgogKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIENTUyBuYW1lIG1hcHBpbmcuCiAqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPnx1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUFBJTkc7CgoKaWYgKCFDT01QSUxFRCAmJiBnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUFBJTkcpIHsKICAvLyBUaGlzIGRvZXMgbm90IGNhbGwgZ29vZy5zZXRDc3NOYW1lTWFwcGluZygpIGJlY2F1c2UgdGhlIEpTQ29tcGlsZXIKICAvLyByZXF1aXJlcyB0aGF0IGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcoKSBiZSBjYWxsZWQgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4KICBnb29nLmNzc05hbWVNYXBwaW5nXyA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQUElORzsKfQoKCi8qKgogKiBHZXRzIGEgbG9jYWxpemVkIG1lc3NhZ2UuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgYSBjb21waWxlciBwcmltaXRpdmUuIElmIHlvdSBnaXZlIHRoZSBjb21waWxlciBhIGxvY2FsaXplZAogKiBtZXNzYWdlIGJ1bmRsZSwgaXQgd2lsbCByZXBsYWNlIHRoZSBzdHJpbmcgYXQgY29tcGlsZS10aW1lIHdpdGggYSBsb2NhbGl6ZWQKICogdmVyc2lvbiwgYW5kIGV4cGFuZCBnb29nLmdldE1zZyBjYWxsIHRvIGEgY29uY2F0ZW5hdGVkIHN0cmluZy4KICoKICogTWVzc2FnZXMgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgZm9ybToKICogPGNvZGU+CiAqIHZhciBNU0dfTkFNRSA9IGdvb2cuZ2V0TXNnKCdIZWxsbyB7JHBsYWNlaG9sZGVyfScsIHsncGxhY2Vob2xkZXInOiAnd29ybGQnfSk7CiAqIDwvY29kZT4KICoKICogVGhpcyBmdW5jdGlvbiBwcm9kdWNlcyBhIHN0cmluZyB3aGljaCBzaG91bGQgYmUgdHJlYXRlZCBhcyBwbGFpbiB0ZXh0LiBVc2UKICoge0BsaW5rIGdvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlcn0gaW4gY29uanVuY3Rpb24gd2l0aCBnb29nLmdldE1zZyB0bwogKiBwcm9kdWNlIFNhZmVIdG1sLgogKgogKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRyYW5zbGF0YWJsZSBzdHJpbmcsIHBsYWNlcyBob2xkZXJzIGluIHRoZSBmb3JtIHskZm9vfS4KICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+PX0gb3B0X3ZhbHVlcyBNYXBzIHBsYWNlIGhvbGRlciBuYW1lIHRvIHZhbHVlLgogKiBAcGFyYW0ge3todG1sOiBib29sZWFufT19IG9wdF9vcHRpb25zIE9wdGlvbnM6CiAqICAgICBodG1sOiBFc2NhcGUgJzwnIGluIHN0ciB0byAnJmx0OycuIFVzZWQgYnkgQ2xvc3VyZSBUZW1wbGF0ZXMgd2hlcmUgdGhlCiAqICAgICBnZW5lcmF0ZWQgY29kZSBzaXplIGFuZCBwZXJmb3JtYW5jZSBpcyBjcml0aWNhbCB3aGljaCBpcyB3aHkge0BsaW5rCiAqICAgICBnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXJ9IGlzIG5vdCB1c2VkLiBUaGUgdmFsdWUgbXVzdCBiZSBsaXRlcmFsIHRydWUKICogICAgIG9yIGZhbHNlLgogKiBAcmV0dXJuIHtzdHJpbmd9IG1lc3NhZ2Ugd2l0aCBwbGFjZWhvbGRlcnMgZmlsbGVkLgogKi8KZ29vZy5nZXRNc2cgPSBmdW5jdGlvbihzdHIsIG9wdF92YWx1ZXMsIG9wdF9vcHRpb25zKSB7CiAgaWYgKG9wdF9vcHRpb25zICYmIG9wdF9vcHRpb25zLmh0bWwpIHsKICAgIC8vIE5vdGUgdGhhdCAnJicgaXMgbm90IHJlcGxhY2VkIGJlY2F1c2UgdGhlIHRyYW5zbGF0aW9uIGNhbiBjb250YWluIEhUTUwKICAgIC8vIGVudGl0aWVzLgogICAgc3RyID0gc3RyLnJlcGxhY2UoLzwvZywgJyZsdDsnKTsKICB9CiAgaWYgKG9wdF92YWx1ZXMpIHsKICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9ce1wkKFtefV0rKX0vZywgZnVuY3Rpb24obWF0Y2gsIGtleSkgewogICAgICByZXR1cm4gKG9wdF92YWx1ZXMgIT0gbnVsbCAmJiBrZXkgaW4gb3B0X3ZhbHVlcykgPyBvcHRfdmFsdWVzW2tleV0gOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDsKICAgIH0pOwogIH0KICByZXR1cm4gc3RyOwp9OwoKCi8qKgogKiBHZXRzIGEgbG9jYWxpemVkIG1lc3NhZ2UuIElmIHRoZSBtZXNzYWdlIGRvZXMgbm90IGhhdmUgYSB0cmFuc2xhdGlvbiwgZ2l2ZXMgYQogKiBmYWxsYmFjayBtZXNzYWdlLgogKgogKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGludHJvZHVjaW5nIGEgbmV3IG1lc3NhZ2UgdGhhdCBoYXMgbm90IHlldCBiZWVuCiAqIHRyYW5zbGF0ZWQgaW50byBhbGwgbGFuZ3VhZ2VzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGlsZXIgcHJpbWl0aXZlLiBNdXN0IGJlIHVzZWQgaW4gdGhlIGZvcm06CiAqIDxjb2RlPnZhciB4ID0gZ29vZy5nZXRNc2dXaXRoRmFsbGJhY2soTVNHX0EsIE1TR19CKTs8L2NvZGU+CiAqIHdoZXJlIE1TR19BIGFuZCBNU0dfQiB3ZXJlIGluaXRpYWxpemVkIHdpdGggZ29vZy5nZXRNc2cuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBhIFRoZSBwcmVmZXJyZWQgbWVzc2FnZS4KICogQHBhcmFtIHtzdHJpbmd9IGIgVGhlIGZhbGxiYWNrIG1lc3NhZ2UuCiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGJlc3QgdHJhbnNsYXRlZCBtZXNzYWdlLgogKi8KZ29vZy5nZXRNc2dXaXRoRmFsbGJhY2sgPSBmdW5jdGlvbihhLCBiKSB7CiAgcmV0dXJuIGE7Cn07CgoKLyoqCiAqIEV4cG9zZXMgYW4gdW5vYmZ1c2NhdGVkIGdsb2JhbCBuYW1lc3BhY2UgcGF0aCBmb3IgdGhlIGdpdmVuIG9iamVjdC4KICogTm90ZSB0aGF0IGZpZWxkcyBvZiB0aGUgZXhwb3J0ZWQgb2JqZWN0ICp3aWxsKiBiZSBvYmZ1c2NhdGVkLCB1bmxlc3MgdGhleSBhcmUKICogZXhwb3J0ZWQgaW4gdHVybiB2aWEgdGhpcyBmdW5jdGlvbiBvciBnb29nLmV4cG9ydFByb3BlcnR5LgogKgogKiBBbHNvIGhhbmR5IGZvciBtYWtpbmcgcHVibGljIGl0ZW1zIHRoYXQgYXJlIGRlZmluZWQgaW4gYW5vbnltb3VzIGNsb3N1cmVzLgogKgogKiBleC4gZ29vZy5leHBvcnRTeW1ib2woJ3B1YmxpYy5wYXRoLkZvbycsIEZvbyk7CiAqCiAqIGV4LiBnb29nLmV4cG9ydFN5bWJvbCgncHVibGljLnBhdGguRm9vLnN0YXRpY0Z1bmN0aW9uJywgRm9vLnN0YXRpY0Z1bmN0aW9uKTsKICogICAgIHB1YmxpYy5wYXRoLkZvby5zdGF0aWNGdW5jdGlvbigpOwogKgogKiBleC4gZ29vZy5leHBvcnRTeW1ib2woJ3B1YmxpYy5wYXRoLkZvby5wcm90b3R5cGUubXlNZXRob2QnLAogKiAgICAgICAgICAgICAgICAgICAgICAgRm9vLnByb3RvdHlwZS5teU1ldGhvZCk7CiAqICAgICBuZXcgcHVibGljLnBhdGguRm9vKCkubXlNZXRob2QoKTsKICoKICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY1BhdGggVW5vYmZ1c2NhdGVkIG5hbWUgdG8gZXhwb3J0LgogKiBAcGFyYW0geyp9IG9iamVjdCBPYmplY3QgdGhlIG5hbWUgc2hvdWxkIHBvaW50IHRvLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmplY3RUb0V4cG9ydFRvIFRoZSBvYmplY3QgdG8gYWRkIHRoZSBwYXRoIHRvOyBkZWZhdWx0CiAqICAgICBpcyBnb29nLmdsb2JhbC4KICovCmdvb2cuZXhwb3J0U3ltYm9sID0gZnVuY3Rpb24ocHVibGljUGF0aCwgb2JqZWN0LCBvcHRfb2JqZWN0VG9FeHBvcnRUbykgewogIGdvb2cuZXhwb3J0UGF0aF8ocHVibGljUGF0aCwgb2JqZWN0LCBvcHRfb2JqZWN0VG9FeHBvcnRUbyk7Cn07CgoKLyoqCiAqIEV4cG9ydHMgYSBwcm9wZXJ0eSB1bm9iZnVzY2F0ZWQgaW50byB0aGUgb2JqZWN0J3MgbmFtZXNwYWNlLgogKiBleC4gZ29vZy5leHBvcnRQcm9wZXJ0eShGb28sICdzdGF0aWNGdW5jdGlvbicsIEZvby5zdGF0aWNGdW5jdGlvbik7CiAqIGV4LiBnb29nLmV4cG9ydFByb3BlcnR5KEZvby5wcm90b3R5cGUsICdteU1ldGhvZCcsIEZvby5wcm90b3R5cGUubXlNZXRob2QpOwogKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IE9iamVjdCB3aG9zZSBzdGF0aWMgcHJvcGVydHkgaXMgYmVpbmcgZXhwb3J0ZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNOYW1lIFVub2JmdXNjYXRlZCBuYW1lIHRvIGV4cG9ydC4KICogQHBhcmFtIHsqfSBzeW1ib2wgT2JqZWN0IHRoZSBuYW1lIHNob3VsZCBwb2ludCB0by4KICovCmdvb2cuZXhwb3J0UHJvcGVydHkgPSBmdW5jdGlvbihvYmplY3QsIHB1YmxpY05hbWUsIHN5bWJvbCkgewogIG9iamVjdFtwdWJsaWNOYW1lXSA9IHN5bWJvbDsKfTsKCgovKioKICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLgogKgogKiBVc2FnZToKICogPHByZT4KICogZnVuY3Rpb24gUGFyZW50Q2xhc3MoYSwgYikgeyB9CiAqIFBhcmVudENsYXNzLnByb3RvdHlwZS5mb28gPSBmdW5jdGlvbihhKSB7IH07CiAqCiAqIGZ1bmN0aW9uIENoaWxkQ2xhc3MoYSwgYiwgYykgewogKiAgIENoaWxkQ2xhc3MuYmFzZSh0aGlzLCAnY29uc3RydWN0b3InLCBhLCBiKTsKICogfQogKiBnb29nLmluaGVyaXRzKENoaWxkQ2xhc3MsIFBhcmVudENsYXNzKTsKICoKICogdmFyIGNoaWxkID0gbmV3IENoaWxkQ2xhc3MoJ2EnLCAnYicsICdzZWUnKTsKICogY2hpbGQuZm9vKCk7IC8vIFRoaXMgd29ya3MuCiAqIDwvcHJlPgogKgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY2hpbGRDdG9yIENoaWxkIGNsYXNzLgogKiBAcGFyYW0geyFGdW5jdGlvbn0gcGFyZW50Q3RvciBQYXJlbnQgY2xhc3MuCiAqIEBzdXBwcmVzcyB7c3RyaWN0TWlzc2luZ1Byb3BlcnRpZXN9IHN1cGVyQ2xhc3NfIGFuZCBiYXNlIGlzIG5vdCBkZWZpbmVkIG9uCiAqICAgIEZ1bmN0aW9uLgogKi8KZ29vZy5pbmhlcml0cyA9IGZ1bmN0aW9uKGNoaWxkQ3RvciwgcGFyZW50Q3RvcikgewogIC8qKiBAY29uc3RydWN0b3IgKi8KICBmdW5jdGlvbiB0ZW1wQ3RvcigpIHt9CiAgdGVtcEN0b3IucHJvdG90eXBlID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnN1cGVyQ2xhc3NfID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOwogIC8qKiBAb3ZlcnJpZGUgKi8KICBjaGlsZEN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY2hpbGRDdG9yOwoKICAvKioKICAgKiBDYWxscyBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yL21ldGhvZC4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHVzZSBnb29nLmluaGVyaXRzIHRvCiAgICogZXhwcmVzcyBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gY2xhc3Nlcy4KICAgKgogICAqIE5PVEU6IFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgZ29vZy5iYXNlIGFuZCBmb3Igc3VwZXJDbGFzc18KICAgKiBwcm9wZXJ0eSBkZWZpbmVkIGluIGNoaWxkQ3Rvci4KICAgKgogICAqIEBwYXJhbSB7IU9iamVjdH0gbWUgU2hvdWxkIGFsd2F5cyBiZSAidGhpcyIuCiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIGNhbGwuIENhbGxpbmcKICAgKiAgICAgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciBjYW4gYmUgZG9uZSB3aXRoIHRoZSBzcGVjaWFsIHN0cmluZwogICAqICAgICAnY29uc3RydWN0b3InLgogICAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHN1cGVyY2xhc3MKICAgKiAgICAgbWV0aG9kL2NvbnN0cnVjdG9yLgogICAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kL2NvbnN0cnVjdG9yLgogICAqLwogIGNoaWxkQ3Rvci5iYXNlID0gZnVuY3Rpb24obWUsIG1ldGhvZE5hbWUsIHZhcl9hcmdzKSB7CiAgICAvLyBDb3B5aW5nIHVzaW5nIGxvb3AgdG8gYXZvaWQgZGVvcCBkdWUgdG8gcGFzc2luZyBhcmd1bWVudHMgb2JqZWN0IHRvCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAyKTsKICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGFyZ3NbaSAtIDJdID0gYXJndW1lbnRzW2ldOwogICAgfQogICAgcmV0dXJuIHBhcmVudEN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdLmFwcGx5KG1lLCBhcmdzKTsKICB9Owp9OwoKCi8qKgogKiBDYWxsIHVwIHRvIHRoZSBzdXBlcmNsYXNzLgogKgogKiBJZiB0aGlzIGlzIGNhbGxlZCBmcm9tIGEgY29uc3RydWN0b3IsIHRoZW4gdGhpcyBjYWxscyB0aGUgc3VwZXJjbGFzcwogKiBjb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50cyAxLU4uCiAqCiAqIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYSBwcm90b3R5cGUgbWV0aG9kLCB0aGVuIHlvdSBtdXN0IHBhc3MgdGhlIG5hbWUgb2YgdGhlCiAqIG1ldGhvZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24uIElmIHlvdSBkbyBub3QsIHlvdSB3aWxsIGdldCBhCiAqIHJ1bnRpbWUgZXJyb3IuIFRoaXMgY2FsbHMgdGhlIHN1cGVyY2xhc3MnIG1ldGhvZCB3aXRoIGFyZ3VtZW50cyAyLU4uCiAqCiAqIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBpZiB5b3UgdXNlIGdvb2cuaW5oZXJpdHMgdG8gZXhwcmVzcyBpbmhlcml0YW5jZQogKiByZWxhdGlvbnNoaXBzIGJldHdlZW4geW91ciBjbGFzc2VzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGlsZXIgcHJpbWl0aXZlLiBBdCBjb21waWxlLXRpbWUsIHRoZSBjb21waWxlciB3aWxsIGRvCiAqIG1hY3JvIGV4cGFuc2lvbiB0byByZW1vdmUgYSBsb3Qgb2YgdGhlIGV4dHJhIG92ZXJoZWFkIHRoYXQgdGhpcyBmdW5jdGlvbgogKiBpbnRyb2R1Y2VzLiBUaGUgY29tcGlsZXIgd2lsbCBhbHNvIGVuZm9yY2UgYSBsb3Qgb2YgdGhlIGFzc3VtcHRpb25zIHRoYXQgdGhpcwogKiBmdW5jdGlvbiBtYWtlcywgYW5kIHRyZWF0IGl0IGFzIGEgY29tcGlsZXIgZXJyb3IgaWYgeW91IGJyZWFrIHRoZW0uCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gbWUgU2hvdWxkIGFsd2F5cyBiZSAidGhpcyIuCiAqIEBwYXJhbSB7Kj19IG9wdF9tZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSBpZiBjYWxsaW5nIGEgc3VwZXIgbWV0aG9kLgogKiBAcGFyYW0gey4uLip9IHZhcl9hcmdzIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMuCiAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kLgogKiBAc3VwcHJlc3Mge2VzNVN0cmljdH0gVGhpcyBtZXRob2QgY2FuIG5vdCBiZSB1c2VkIGluIHN0cmljdCBtb2RlLCBidXQKICogICAgIGFsbCBDbG9zdXJlIExpYnJhcnkgY29uc3VtZXJzIG11c3QgZGVwZW5kIG9uIHRoaXMgZmlsZS4KICogQGRlcHJlY2F0ZWQgZ29vZy5iYXNlIGlzIG5vdCBzdHJpY3QgbW9kZSBjb21wYXRpYmxlLiAgUHJlZmVyIHRoZSBzdGF0aWMKICogICAgICJiYXNlIiBtZXRob2QgYWRkZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGJ5IGdvb2cuaW5oZXJpdHMKICogICAgIG9yIEVTNiBjbGFzc2VzIGFuZCB0aGUgInN1cGVyIiBrZXl3b3JkLgogKi8KZ29vZy5iYXNlID0gZnVuY3Rpb24obWUsIG9wdF9tZXRob2ROYW1lLCB2YXJfYXJncykgewogIHZhciBjYWxsZXIgPSBhcmd1bWVudHMuY2FsbGVlLmNhbGxlcjsKCiAgaWYgKGdvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRSB8fCAoZ29vZy5ERUJVRyAmJiAhY2FsbGVyKSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdhcmd1bWVudHMuY2FsbGVyIG5vdCBkZWZpbmVkLiAgZ29vZy5iYXNlKCkgY2Fubm90IGJlIHVzZWQgJyArCiAgICAgICAgJ3dpdGggc3RyaWN0IG1vZGUgY29kZS4gU2VlICcgKwogICAgICAgICdodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtQycpOwogIH0KCiAgaWYgKHR5cGVvZiBjYWxsZXIuc3VwZXJDbGFzc18gIT09ICd1bmRlZmluZWQnKSB7CiAgICAvLyBDb3B5aW5nIHVzaW5nIGxvb3AgdG8gYXZvaWQgZGVvcCBkdWUgdG8gcGFzc2luZyBhcmd1bWVudHMgb2JqZWN0IHRvCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICAgIHZhciBjdG9yQXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBjdG9yQXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07CiAgICB9CiAgICAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IuIENhbGwgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAgICByZXR1cm4gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovIChjYWxsZXIuc3VwZXJDbGFzc18pCiAgICAgICAgLmNvbnN0cnVjdG9yLmFwcGx5KG1lLCBjdG9yQXJncyk7CiAgfQoKICBpZiAodHlwZW9mIG9wdF9tZXRob2ROYW1lICE9ICdzdHJpbmcnICYmIHR5cGVvZiBvcHRfbWV0aG9kTmFtZSAhPSAnc3ltYm9sJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdtZXRob2QgbmFtZXMgcHJvdmlkZWQgdG8gZ29vZy5iYXNlIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wnKTsKICB9CgogIC8vIENvcHlpbmcgdXNpbmcgbG9vcCB0byBhdm9pZCBkZW9wIGR1ZSB0byBwYXNzaW5nIGFyZ3VtZW50cyBvYmplY3QgdG8KICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMik7CiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgIGFyZ3NbaSAtIDJdID0gYXJndW1lbnRzW2ldOwogIH0KICB2YXIgZm91bmRDYWxsZXIgPSBmYWxzZTsKICBmb3IgKHZhciBwcm90byA9IG1lLmNvbnN0cnVjdG9yLnByb3RvdHlwZTsgcHJvdG87CiAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykpIHsKICAgIGlmIChwcm90b1tvcHRfbWV0aG9kTmFtZV0gPT09IGNhbGxlcikgewogICAgICBmb3VuZENhbGxlciA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGZvdW5kQ2FsbGVyKSB7CiAgICAgIHJldHVybiBwcm90b1tvcHRfbWV0aG9kTmFtZV0uYXBwbHkobWUsIGFyZ3MpOwogICAgfQogIH0KCiAgLy8gSWYgd2UgZGlkIG5vdCBmaW5kIHRoZSBjYWxsZXIgaW4gdGhlIHByb3RvdHlwZSBjaGFpbiwgdGhlbiBvbmUgb2YgdHdvCiAgLy8gdGhpbmdzIGhhcHBlbmVkOgogIC8vIDEpIFRoZSBjYWxsZXIgaXMgYW4gaW5zdGFuY2UgbWV0aG9kLgogIC8vIDIpIFRoaXMgbWV0aG9kIHdhcyBub3QgY2FsbGVkIGJ5IHRoZSByaWdodCBjYWxsZXIuCiAgaWYgKG1lW29wdF9tZXRob2ROYW1lXSA9PT0gY2FsbGVyKSB7CiAgICByZXR1cm4gbWUuY29uc3RydWN0b3IucHJvdG90eXBlW29wdF9tZXRob2ROYW1lXS5hcHBseShtZSwgYXJncyk7CiAgfSBlbHNlIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAnZ29vZy5iYXNlIGNhbGxlZCBmcm9tIGEgbWV0aG9kIG9mIG9uZSBuYW1lICcgKwogICAgICAgICd0byBhIG1ldGhvZCBvZiBhIGRpZmZlcmVudCBuYW1lJyk7CiAgfQp9OwoKCi8qKgogKiBBbGxvdyBmb3IgYWxpYXNpbmcgd2l0aGluIHNjb3BlIGZ1bmN0aW9ucy4gIFRoaXMgZnVuY3Rpb24gZXhpc3RzIGZvcgogKiB1bmNvbXBpbGVkIGNvZGUgLSBpbiBjb21waWxlZCBjb2RlIHRoZSBjYWxscyB3aWxsIGJlIGlubGluZWQgYW5kIHRoZSBhbGlhc2VzCiAqIGFwcGxpZWQuICBJbiB1bmNvbXBpbGVkIGNvZGUgdGhlIGZ1bmN0aW9uIGlzIHNpbXBseSBydW4gc2luY2UgdGhlIGFsaWFzZXMgYXMKICogd3JpdHRlbiBhcmUgdmFsaWQgSmF2YVNjcmlwdC4KICoKICoKICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBGdW5jdGlvbiB0byBjYWxsLiAgVGhpcyBmdW5jdGlvbiBjYW4gY29udGFpbiBhbGlhc2VzCiAqICAgICB0byBuYW1lc3BhY2VzIChlLmcuICJ2YXIgZG9tID0gZ29vZy5kb20iKSBvciBjbGFzc2VzCiAqICAgICAoZS5nLiAidmFyIFRpbWVyID0gZ29vZy5UaW1lciIpLgogKi8KZ29vZy5zY29wZSA9IGZ1bmN0aW9uKGZuKSB7CiAgaWYgKGdvb2cuaXNJbk1vZHVsZUxvYWRlcl8oKSkgewogICAgdGhyb3cgbmV3IEVycm9yKCdnb29nLnNjb3BlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aGluIGEgbW9kdWxlLicpOwogIH0KICBmbi5jYWxsKGdvb2cuZ2xvYmFsKTsKfTsKCgovKgogKiBUbyBzdXBwb3J0IHVuY29tcGlsZWQsIHN0cmljdCBtb2RlIGJ1bmRsZXMgdGhhdCB1c2UgZXZhbCB0byBkaXZpZGUgc291cmNlCiAqIGxpa2Ugc286CiAqICAgIGV2YWwoJ3NvbWVTb3VyY2U7Ly8jIHNvdXJjZVVybCBzb3VyY2VmaWxlLmpzJyk7CiAqIFdlIG5lZWQgdG8gZXhwb3J0IHRoZSBnbG9iYWxseSBkZWZpbmVkIHN5bWJvbHMgImdvb2ciIGFuZCAiQ09NUElMRUQiLgogKiBFeHBvcnRpbmcgImdvb2ciIGJyZWFrcyB0aGUgY29tcGlsZXIgb3B0aW1pemF0aW9ucywgc28gd2UgcmVxdWlyZWQgdGhhdAogKiBiZSBkZWZpbmVkIGV4dGVybmFsbHkuCiAqIE5PVEU6IFdlIGRvbid0IHVzZSBnb29nLmV4cG9ydFN5bWJvbCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyCiAqIGV4dGVybiBnZW5lcmF0aW9uIHdoZW4gdGhhdCBjb21waWxlciBvcHRpb24gaXMgZW5hYmxlZC4KICovCmlmICghQ09NUElMRUQpIHsKICBnb29nLmdsb2JhbFsnQ09NUElMRUQnXSA9IENPTVBJTEVEOwp9CgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gZ29vZy5kZWZpbmVDbGFzcyBpbXBsZW1lbnRhdGlvbgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCi8qKgogKiBDcmVhdGVzIGEgcmVzdHJpY3RlZCBmb3JtIG9mIGEgQ2xvc3VyZSAiY2xhc3MiOgogKiAgIC0gZnJvbSB0aGUgY29tcGlsZXIncyBwZXJzcGVjdGl2ZSwgdGhlIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhlCiAqICAgICBjb25zdHJ1Y3RvciBpcyBzZWFsZWQgKG5vIG5ldyBwcm9wZXJ0aWVzIG1heSBiZSBhZGRlZCkuICBUaGlzIGVuYWJsZXMKICogICAgIGJldHRlciBjaGVja3MuCiAqICAgLSB0aGUgY29tcGlsZXIgd2lsbCByZXdyaXRlIHRoaXMgZGVmaW5pdGlvbiB0byBhIGZvcm0gdGhhdCBpcyBvcHRpbWFsCiAqICAgICBmb3IgdHlwZSBjaGVja2luZyBhbmQgb3B0aW1pemF0aW9uIChpbml0aWFsbHkgdGhpcyB3aWxsIGJlIGEgbW9yZQogKiAgICAgdHJhZGl0aW9uYWwgZm9ybSkuCiAqCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ2xhc3MgVGhlIHN1cGVyY2xhc3MsIE9iamVjdCBvciBudWxsLgogKiBAcGFyYW0ge2dvb2cuZGVmaW5lQ2xhc3MuQ2xhc3NEZXNjcmlwdG9yfSBkZWYKICogICAgIEFuIG9iamVjdCBsaXRlcmFsIGRlc2NyaWJpbmcKICogICAgIHRoZSBjbGFzcy4gIEl0IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICogICAgICJjb25zdHJ1Y3RvciI6IHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogKiAgICAgInN0YXRpY3MiOiBhbiBvYmplY3QgbGl0ZXJhbCBjb250YWluaW5nIG1ldGhvZHMgdG8gYWRkIHRvIHRoZSBjb25zdHJ1Y3RvcgogKiAgICAgICAgYXMgInN0YXRpYyIgbWV0aG9kcyBvciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBjb25zdHJ1Y3RvcgogKiAgICAgICAgZnVuY3Rpb24gYXMgaXRzIG9ubHkgcGFyYW1ldGVyIHRvIHdoaWNoIHN0YXRpYyBwcm9wZXJ0aWVzIGNhbgogKiAgICAgICAgYmUgYWRkZWQuCiAqICAgICBhbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIHByb3RvdHlwZS4KICogQHJldHVybiB7IUZ1bmN0aW9ufSBUaGUgY2xhc3MgY29uc3RydWN0b3IuCiAqIEBkZXByZWNhdGVkIFVzZSBFUzYgY2xhc3Mgc3ludGF4IGluc3RlYWQuCiAqLwpnb29nLmRlZmluZUNsYXNzID0gZnVuY3Rpb24oc3VwZXJDbGFzcywgZGVmKSB7CiAgLy8gVE9ETyhqb2hubGVueik6IGNvbnNpZGVyIG1ha2luZyB0aGUgc3VwZXJDbGFzcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgdmFyIGNvbnN0cnVjdG9yID0gZGVmLmNvbnN0cnVjdG9yOwogIHZhciBzdGF0aWNzID0gZGVmLnN0YXRpY3M7CiAgLy8gV3JhcCB0aGUgY29uc3RydWN0b3IgcHJpb3IgdG8gc2V0dGluZyB1cCB0aGUgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcy4KICBpZiAoIWNvbnN0cnVjdG9yIHx8IGNvbnN0cnVjdG9yID09IE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IpIHsKICAgIGNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdjYW5ub3QgaW5zdGFudGlhdGUgYW4gaW50ZXJmYWNlIChubyBjb25zdHJ1Y3RvciBkZWZpbmVkKS4nKTsKICAgIH07CiAgfQoKICB2YXIgY2xzID0gZ29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfKGNvbnN0cnVjdG9yLCBzdXBlckNsYXNzKTsKICBpZiAoc3VwZXJDbGFzcykgewogICAgZ29vZy5pbmhlcml0cyhjbHMsIHN1cGVyQ2xhc3MpOwogIH0KCiAgLy8gUmVtb3ZlIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBub3QgYmUgY29waWVkIHRvIHRoZSBwcm90b3R5cGUuCiAgZGVsZXRlIGRlZi5jb25zdHJ1Y3RvcjsKICBkZWxldGUgZGVmLnN0YXRpY3M7CgogIGdvb2cuZGVmaW5lQ2xhc3MuYXBwbHlQcm9wZXJ0aWVzXyhjbHMucHJvdG90eXBlLCBkZWYpOwogIGlmIChzdGF0aWNzICE9IG51bGwpIHsKICAgIGlmIChzdGF0aWNzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKICAgICAgc3RhdGljcyhjbHMpOwogICAgfSBlbHNlIHsKICAgICAgZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfKGNscywgc3RhdGljcyk7CiAgICB9CiAgfQoKICByZXR1cm4gY2xzOwp9OwoKCi8qKgogKiBAdHlwZWRlZiB7ewogKiAgIGNvbnN0cnVjdG9yOiAoIUZ1bmN0aW9ufHVuZGVmaW5lZCksCiAqICAgc3RhdGljczogKE9iamVjdHx1bmRlZmluZWR8ZnVuY3Rpb24oRnVuY3Rpb24pOnZvaWQpCiAqIH19CiAqLwpnb29nLmRlZmluZUNsYXNzLkNsYXNzRGVzY3JpcHRvcjsKCgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gV2hldGhlciB0aGUgaW5zdGFuY2VzIHJldHVybmVkIGJ5IGdvb2cuZGVmaW5lQ2xhc3Mgc2hvdWxkCiAqICAgICBiZSBzZWFsZWQgd2hlbiBwb3NzaWJsZS4KICoKICogV2hlbiBzZWFsaW5nIGlzIGRpc2FibGVkIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aWxsIG5vdCBiZSB3cmFwcGVkIGJ5CiAqIGdvb2cuZGVmaW5lQ2xhc3MsIG1ha2luZyBpdCBpbmNvbXBhdGlibGUgd2l0aCBFUzYgY2xhc3MgbWV0aG9kcy4KICovCmdvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMgPQogICAgZ29vZy5kZWZpbmUoJ2dvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMnLCBnb29nLkRFQlVHKTsKCgovKioKICogSWYgZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUyBpcyBlbmFibGVkIGFuZCBPYmplY3Quc2VhbCBpcwogKiBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgd3JhcCB0aGUgY29uc3RydWN0b3IgaW4gYSBmdW5jdGlvbiB0aGF0IHNlYWxzIHRoZQogKiByZXN1bHRzIG9mIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KICoKICogQHBhcmFtIHshRnVuY3Rpb259IGN0ciBUaGUgY29uc3RydWN0b3Igd2hvc2UgcmVzdWx0cyBtYXliZSBiZSBzZWFsZWQuCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ2xhc3MgVGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gVGhlIHJlcGxhY2VtZW50IGNvbnN0cnVjdG9yLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfID0gZnVuY3Rpb24oY3RyLCBzdXBlckNsYXNzKSB7CiAgaWYgKCFnb29nLmRlZmluZUNsYXNzLlNFQUxfQ0xBU1NfSU5TVEFOQ0VTKSB7CiAgICAvLyBEbyBub3cgd3JhcCB0aGUgY29uc3RydWN0b3Igd2hlbiBzZWFsaW5nIGlzIGRpc2FibGVkLiBBbmd1bGFyIGNvZGUKICAgIC8vIGRlcGVuZHMgb24gdGhpcyBmb3IgaW5qZWN0aW9uIHRvIHdvcmsgcHJvcGVybHkuCiAgICByZXR1cm4gY3RyOwogIH0KCiAgLy8gQ29tcHV0ZSB3aGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBzZWFsYWJsZSBhdCBkZWZpbml0aW9uIHRpbWUsIHJhdGhlcgogIC8vIHRoYW4gd2hlbiB0aGUgaW5zdGFuY2UgaXMgYmVpbmcgY29uc3RydWN0ZWQuCiAgdmFyIHN1cGVyY2xhc3NTZWFsYWJsZSA9ICFnb29nLmRlZmluZUNsYXNzLmlzVW5zZWFsYWJsZV8oc3VwZXJDbGFzcyk7CgogIC8qKgogICAqIEB0aGlzIHtPYmplY3R9CiAgICogQHJldHVybiB7P30KICAgKi8KICB2YXIgd3JhcHBlZEN0ciA9IGZ1bmN0aW9uKCkgewogICAgLy8gRG9uJ3Qgc2VhbCBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIHdoZW4gaXQgY2FsbHMgdGhlIGNvbnN0cnVjdG9yIG9mCiAgICAvLyBpdHMgc3VwZXIgY2xhc3MgYXMgdGhlcmUgaXMgbW9zdCBsaWtlbHkgc3RpbGwgc2V0dXAgdG8gZG8uCiAgICB2YXIgaW5zdGFuY2UgPSBjdHIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgaW5zdGFuY2VbZ29vZy5VSURfUFJPUEVSVFlfXSA9IGluc3RhbmNlW2dvb2cuVUlEX1BST1BFUlRZX107CgogICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IHdyYXBwZWRDdHIgJiYgc3VwZXJjbGFzc1NlYWxhYmxlICYmCiAgICAgICAgT2JqZWN0LnNlYWwgaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICBPYmplY3Quc2VhbChpbnN0YW5jZSk7CiAgICB9CiAgICByZXR1cm4gaW5zdGFuY2U7CiAgfTsKCiAgcmV0dXJuIHdyYXBwZWRDdHI7Cn07CgoKLyoqCiAqIEBwYXJhbSB7RnVuY3Rpb259IGN0ciBUaGUgY29uc3RydWN0b3IgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgY29uc3RydWN0b3IgaGFzIGJlZW4gdGFnZ2VkIGFzIHVuc2VhbGFibGUKICogICAgIHVzaW5nIGdvb2cudGFnVW5zZWFsYWJsZUNsYXNzLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5pc1Vuc2VhbGFibGVfID0gZnVuY3Rpb24oY3RyKSB7CiAgcmV0dXJuIGN0ciAmJiBjdHIucHJvdG90eXBlICYmCiAgICAgIGN0ci5wcm90b3R5cGVbZ29vZy5VTlNFQUxBQkxFX0NPTlNUUlVDVE9SX1BST1BFUlRZX107Cn07CgoKLy8gVE9ETyhqb2hubGVueik6IHNoYXJlIHRoZXNlIHZhbHVlcyB3aXRoIHRoZSBnb29nLm9iamVjdAovKioKICogVGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgdGhhdCBhcmUgZGVmaW5lZCBvbiBPYmplY3QucHJvdG90eXBlLgogKiBAdHlwZSB7IUFycmF5PHN0cmluZz59CiAqIEBwcml2YXRlCiAqIEBjb25zdAogKi8KZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18gPSBbCiAgJ2NvbnN0cnVjdG9yJywgJ2hhc093blByb3BlcnR5JywgJ2lzUHJvdG90eXBlT2YnLCAncHJvcGVydHlJc0VudW1lcmFibGUnLAogICd0b0xvY2FsZVN0cmluZycsICd0b1N0cmluZycsICd2YWx1ZU9mJwpdOwoKCi8vIFRPRE8oam9obmxlbnopOiBzaGFyZSB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGdvb2cub2JqZWN0Ci8qKgogKiBAcGFyYW0geyFPYmplY3R9IHRhcmdldCBUaGUgb2JqZWN0IHRvIGFkZCBwcm9wZXJ0aWVzIHRvLgogKiBAcGFyYW0geyFPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsKICAvLyBUT0RPKGpvaG5sZW56KTogdXBkYXRlIHRoaXMgdG8gc3VwcG9ydCBFUzUgZ2V0dGVycy9zZXR0ZXJzCgogIHZhciBrZXk7CiAgZm9yIChrZXkgaW4gc291cmNlKSB7CiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgewogICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOwogICAgfQogIH0KCiAgLy8gRm9yIElFIHRoZSBmb3ItaW4tbG9vcCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdAogIC8vIGVudW1lcmFibGUgb24gdGhlIHByb3RvdHlwZSBvYmplY3QgKGZvciBleGFtcGxlIGlzUHJvdG90eXBlT2YgZnJvbQogIC8vIE9iamVjdC5wcm90b3R5cGUpIGFuZCBpdCB3aWxsIGFsc28gbm90IGluY2x1ZGUgJ3JlcGxhY2UnIG9uIG9iamVjdHMgdGhhdAogIC8vIGV4dGVuZCBTdHJpbmcgYW5kIGNoYW5nZSAncmVwbGFjZScgKG5vdCB0aGF0IGl0IGlzIGNvbW1vbiBmb3IgYW55b25lIHRvCiAgLy8gZXh0ZW5kIGFueXRoaW5nIGV4Y2VwdCBPYmplY3QpLgogIGZvciAodmFyIGkgPSAwOyBpIDwgZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18ubGVuZ3RoOyBpKyspIHsKICAgIGtleSA9IGdvb2cuZGVmaW5lQ2xhc3MuT0JKRUNUX1BST1RPVFlQRV9GSUVMRFNfW2ldOwogICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsKICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsKICAgIH0KICB9Cn07CgoKLyoqCiAqIFNlYWxpbmcgY2xhc3NlcyBicmVha3MgdGhlIG9sZGVyIGlkaW9tIG9mIGFzc2lnbmluZyBwcm9wZXJ0aWVzIG9uIHRoZQogKiBwcm90b3R5cGUgcmF0aGVyIHRoYW4gaW4gdGhlIGNvbnN0cnVjdG9yLiBBcyBzdWNoLCBnb29nLmRlZmluZUNsYXNzCiAqIG11c3Qgbm90IHNlYWwgc3ViY2xhc3NlcyBvZiB0aGVzZSBvbGQtc3R5bGUgY2xhc3NlcyB1bnRpbCB0aGV5IGFyZSBmaXhlZC4KICogVW50aWwgdGhlbiwgdGhpcyBtYXJrcyBhIGNsYXNzIGFzICJicm9rZW4iLCBpbnN0cnVjdGluZyBkZWZpbmVDbGFzcwogKiBub3QgdG8gc2VhbCBzdWJjbGFzc2VzLgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY3RyIFRoZSBsZWdhY3kgY29uc3RydWN0b3IgdG8gdGFnIGFzIHVuc2VhbGFibGUuCiAqLwpnb29nLnRhZ1Vuc2VhbGFibGVDbGFzcyA9IGZ1bmN0aW9uKGN0cikgewogIGlmICghQ09NUElMRUQgJiYgZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUykgewogICAgY3RyLnByb3RvdHlwZVtnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfXSA9IHRydWU7CiAgfQp9OwoKCi8qKgogKiBOYW1lIGZvciB1bnNlYWxhYmxlIHRhZyBwcm9wZXJ0eS4KICogQGNvbnN0IEBwcml2YXRlIHtzdHJpbmd9CiAqLwpnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfID0gJ2dvb2dfZGVmaW5lQ2xhc3NfbGVnYWN5X3Vuc2VhbGFibGUnOwoKCi8vIFRoZXJlJ3MgYSBidWcgaW4gdGhlIGNvbXBpbGVyIHdoZXJlIHdpdGhvdXQgY29sbGFwc2UgcHJvcGVydGllcyB0aGUKLy8gQ2xvc3VyZSBuYW1lc3BhY2UgZGVmaW5lcyBkbyBub3QgZ3VhcmQgY29kZSBjb3JyZWN0bHkuIFRvIGhlbHAgcmVkdWNlIGNvZGUKLy8gc2l6ZSBhbHNvIGNoZWNrIGZvciAhQ09NUElMRUQgZXZlbiB0aG91Z2ggaXQgcmVkdW5kYW50IHVudGlsIHRoaXMgaXMgZml4ZWQuCmlmICghQ09NUElMRUQgJiYgZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCkgewoKICAvKioKICAgKiBUcmllcyB0byBkZXRlY3Qgd2hldGhlciBpcyBpbiB0aGUgY29udGV4dCBvZiBhbiBIVE1MIGRvY3VtZW50LgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgbG9va3MgbGlrZSBIVE1MIGRvY3VtZW50LgogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5pbkh0bWxEb2N1bWVudF8gPSBmdW5jdGlvbigpIHsKICAgIC8qKiBAdHlwZSB7IURvY3VtZW50fSAqLwogICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50OwogICAgcmV0dXJuIGRvYyAhPSBudWxsICYmICd3cml0ZScgaW4gZG9jOyAgLy8gWFVMRG9jdW1lbnQgbWlzc2VzIHdyaXRlLgogIH07CgoKICAvKioKICAgKiBXZSdkIGxpa2UgdG8gY2hlY2sgZm9yIGlmIHRoZSBkb2N1bWVudCByZWFkeVN0YXRlIGlzICdsb2FkaW5nJzsgaG93ZXZlcgogICAqIHRoZXJlIGFyZSBidWdzIG9uIElFIDEwIGFuZCBiZWxvdyB3aGVyZSB0aGUgcmVhZHlTdGF0ZSBiZWluZyBhbnl0aGluZyBvdGhlcgogICAqIHRoYW4gJ2NvbXBsZXRlJyBpcyBub3QgcmVsaWFibGUuCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuaXNEb2N1bWVudExvYWRpbmdfID0gZnVuY3Rpb24oKSB7CiAgICAvLyBhdHRhY2hFdmVudCBpcyBhdmFpbGFibGUgb24gSUUgNiB0aHJ1IDEwIG9ubHksIGFuZCB0aHVzIGNhbiBiZSB1c2VkIHRvCiAgICAvLyBkZXRlY3QgdGhvc2UgYnJvd3NlcnMuCiAgICAvKiogQHR5cGUgeyFIVE1MRG9jdW1lbnR9ICovCiAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CiAgICByZXR1cm4gZG9jLmF0dGFjaEV2ZW50ID8gZG9jLnJlYWR5U3RhdGUgIT0gJ2NvbXBsZXRlJyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLnJlYWR5U3RhdGUgPT0gJ2xvYWRpbmcnOwogIH07CgoKICAvKioKICAgKiBUcmllcyB0byBkZXRlY3QgdGhlIGJhc2UgcGF0aCBvZiBiYXNlLmpzIHNjcmlwdCB0aGF0IGJvb3RzdHJhcHMgQ2xvc3VyZS4KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuZmluZEJhc2VQYXRoXyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIICE9IHVuZGVmaW5lZCAmJgogICAgICAgIC8vIEFudGkgRE9NLWNsb2JiZXJpbmcgcnVudGltZSBjaGVjayAoYi8zNzczNjU3NikuCiAgICAgICAgdHlwZW9mIGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIID09PSAnc3RyaW5nJykgewogICAgICBnb29nLmJhc2VQYXRoID0gZ29vZy5nbG9iYWwuQ0xPU1VSRV9CQVNFX1BBVEg7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoIWdvb2cuaW5IdG1sRG9jdW1lbnRfKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLyoqIEB0eXBlIHshRG9jdW1lbnR9ICovCiAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CiAgICAvLyBJZiB3ZSBoYXZlIGEgY3VycmVudFNjcmlwdCBhdmFpbGFibGUsIHVzZSBpdCBleGNsdXNpdmVseS4KICAgIHZhciBjdXJyZW50U2NyaXB0ID0gZG9jLmN1cnJlbnRTY3JpcHQ7CiAgICBpZiAoY3VycmVudFNjcmlwdCkgewogICAgICB2YXIgc2NyaXB0cyA9IFtjdXJyZW50U2NyaXB0XTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBzY3JpcHRzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdTQ1JJUFQnKTsKICAgIH0KICAgIC8vIFNlYXJjaCBiYWNrd2FyZHMgc2luY2UgdGhlIGN1cnJlbnQgc2NyaXB0IGlzIGluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIG9uZQogICAgLy8gdGhhdCBoYXMgYmFzZS5qcy4KICAgIGZvciAodmFyIGkgPSBzY3JpcHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHZhciBzY3JpcHQgPSAvKiogQHR5cGUgeyFIVE1MU2NyaXB0RWxlbWVudH0gKi8gKHNjcmlwdHNbaV0pOwogICAgICB2YXIgc3JjID0gc2NyaXB0LnNyYzsKICAgICAgdmFyIHFtYXJrID0gc3JjLmxhc3RJbmRleE9mKCc/Jyk7CiAgICAgIHZhciBsID0gcW1hcmsgPT0gLTEgPyBzcmMubGVuZ3RoIDogcW1hcms7CiAgICAgIGlmIChzcmMuc3Vic3RyKGwgLSA3LCA3KSA9PSAnYmFzZS5qcycpIHsKICAgICAgICBnb29nLmJhc2VQYXRoID0gc3JjLnN1YnN0cigwLCBsIC0gNyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfTsKCiAgZ29vZy5maW5kQmFzZVBhdGhfKCk7CgogIC8qKiBAc3RydWN0IEBjb25zdHJ1Y3RvciBAZmluYWwgKi8KICBnb29nLlRyYW5zcGlsZXIgPSBmdW5jdGlvbigpIHsKICAgIC8qKiBAcHJpdmF0ZSB7P09iamVjdDxzdHJpbmcsIGJvb2xlYW4+fSAqLwogICAgdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fID0gbnVsbDsKICAgIC8qKiBAcHJpdmF0ZSB7c3RyaW5nfSAqLwogICAgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0XyA9IGdvb2cuVFJBTlNQSUxFX1RPX0xBTkdVQUdFOwogIH07CgoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBtYXAgZnJvbSBsYW5ndWFnZSBtb2RlIHN0cmluZyB0byBhIGJvb2xlYW4KICAgKiBpbmRpY2F0aW5nIHdoZXRoZXIgdHJhbnNwaWxhdGlvbiBzaG91bGQgYmUgZG9uZSBmb3IgdGhhdCBtb2RlIGFzIHdlbGwgYXMKICAgKiB0aGUgaGlnaGVzdCBsZXZlbCBsYW5ndWFnZSB0aGF0IHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMuCiAgICoKICAgKiBHdWFyYW50ZWVkIGludmFyaWFudDoKICAgKiBGb3IgYW55IHR3byBtb2RlcywgbDEgYW5kIGwyIHdoZXJlIGwyIGlzIGEgbmV3ZXIgbW9kZSB0aGFuIGwxLAogICAqIGBtYXBbbDFdID09IHRydWVgIGltcGxpZXMgdGhhdCBgbWFwW2wyXSA9PSB0cnVlYC4KICAgKgogICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgZXh0cmFjdGVkIGFuZCB1c2VkIGVsc2V3aGVyZSwgc28gaXQgY2Fubm90IHJlbHkgb24KICAgKiBhbnl0aGluZyBleHRlcm5hbCAoaXQgc2hvdWxkIGVhc2lseSBiZSBhYmxlIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gYQogICAqIHN0YW5kYWxvbmUsIHRvcCBsZXZlbCBmdW5jdGlvbikuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEByZXR1cm4ge3sKICAgKiAgIHRhcmdldDogc3RyaW5nLAogICAqICAgbWFwOiAhT2JqZWN0PHN0cmluZywgYm9vbGVhbj4KICAgKiB9fQogICAqLwogIGdvb2cuVHJhbnNwaWxlci5wcm90b3R5cGUuY3JlYXRlUmVxdWlyZXNUcmFuc3BpbGF0aW9uXyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHRyYW5zcGlsYXRpb25UYXJnZXQgPSAnZXMzJzsKICAgIHZhciAvKiogIU9iamVjdDxzdHJpbmcsIGJvb2xlYW4+ICovIHJlcXVpcmVzVHJhbnNwaWxhdGlvbiA9IHsnZXMzJzogZmFsc2V9OwogICAgdmFyIHRyYW5zcGlsYXRpb25SZXF1aXJlZEZvckFsbExhdGVyTW9kZXMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEFkZHMgYW4gZW50cnkgdG8gcmVxdWlyZXNUcmFuc3BsaWF0aW9uIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbW9kZS4KICAgICAqCiAgICAgKiBJTVBPUlRBTlQ6IENhbGxzIG11c3QgYmUgbWFkZSBpbiBvcmRlciBmcm9tIG9sZGVzdCB0byBuZXdlc3QgbGFuZ3VhZ2UKICAgICAqIG1vZGUuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZU5hbWUKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogYm9vbGVhbn0gaXNTdXBwb3J0ZWQgUmV0dXJucyB0cnVlIGlmIHRoZSBKUyBlbmdpbmUKICAgICAqICAgICBzdXBwb3J0cyB0aGUgZ2l2ZW4gbW9kZS4KICAgICAqLwogICAgZnVuY3Rpb24gYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjayhtb2RlTmFtZSwgaXNTdXBwb3J0ZWQpIHsKICAgICAgaWYgKHRyYW5zcGlsYXRpb25SZXF1aXJlZEZvckFsbExhdGVyTW9kZXMpIHsKICAgICAgICByZXF1aXJlc1RyYW5zcGlsYXRpb25bbW9kZU5hbWVdID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChpc1N1cHBvcnRlZCgpKSB7CiAgICAgICAgdHJhbnNwaWxhdGlvblRhcmdldCA9IG1vZGVOYW1lOwogICAgICAgIHJlcXVpcmVzVHJhbnNwaWxhdGlvblttb2RlTmFtZV0gPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXF1aXJlc1RyYW5zcGlsYXRpb25bbW9kZU5hbWVdID0gdHJ1ZTsKICAgICAgICB0cmFuc3BpbGF0aW9uUmVxdWlyZWRGb3JBbGxMYXRlck1vZGVzID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRG9lcyB0aGUgZ2l2ZW4gY29kZSBldmFsdWF0ZSB3aXRob3V0IHN5bnRheCBlcnJvcnMgYW5kIHJldHVybiBhIHRydXRoeQogICAgICogcmVzdWx0PwogICAgICovCiAgICBmdW5jdGlvbiAvKiogYm9vbGVhbiAqLyBldmFsQ2hlY2soLyoqIHN0cmluZyAqLyBjb2RlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuICEhZXZhbChjb2RlKTsKICAgICAgfSBjYXRjaCAoaWdub3JlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHZhciB1c2VyQWdlbnQgPSBnb29nLmdsb2JhbC5uYXZpZ2F0b3IgJiYgZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudCA/CiAgICAgICAgZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudCA6CiAgICAgICAgJyc7CgogICAgLy8gSWRlbnRpZnkgRVMzLW9ubHkgYnJvd3NlcnMgYnkgdGhlaXIgaW5jb3JyZWN0IHRyZWF0bWVudCBvZiBjb21tYXMuCiAgICBhZGROZXdlckxhbmd1YWdlVHJhbnNwaWxhdGlvbkNoZWNrKCdlczUnLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGV2YWxDaGVjaygnWzEsXS5sZW5ndGg9PTEnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM2JywgZnVuY3Rpb24oKSB7CiAgICAgIC8vIEVkZ2UgaGFzIGEgbm9uLWRldGVybWluaXN0aWMgKGkuZS4sIG5vdCByZXByb2R1Y2libGUpIGJ1ZyB3aXRoIEVTNjoKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9DaGFrcmFDb3JlL2lzc3Vlcy8xNDk2LgogICAgICB2YXIgcmUgPSAvRWRnZVwvKFxkKykoXC5cZCkqL2k7CiAgICAgIHZhciBlZGdlVXNlckFnZW50ID0gdXNlckFnZW50Lm1hdGNoKHJlKTsKICAgICAgaWYgKGVkZ2VVc2VyQWdlbnQpIHsKICAgICAgICAvLyBUaGUgUmVmbGVjdC5jb25zdHJ1Y3QgdGVzdCBiZWxvdyBpcyBmbGFreSBvbiBFZGdlLiBJdCBjYW4gc29tZXRpbWVzCiAgICAgICAgLy8gcGFzcyBvciBmYWlsIG9uIDQwIDE1LjE1MDYzLCBzbyBqdXN0IGV4aXQgZWFybHkgZm9yIEVkZ2UgYW5kIHRyZWF0CiAgICAgICAgLy8gaXQgYXMgRVM1LiBVbnRpbCB3ZSdyZSBvbiBhIG1vcmUgdXAgdG8gZGF0ZSB2ZXJzaW9uIGp1c3QgYWx3YXlzIHVzZQogICAgICAgIC8vIEVTNS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvQ2hha3JhQ29yZS9pc3N1ZXMvMzIxNy4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLy8gVGVzdCBlczY6IFtGRjUwICg/KSwgRWRnZSAxNCAoPyksIENocm9tZSA1MF0KICAgICAgLy8gICAoYSkgZGVmYXVsdCBwYXJhbXMgKHNwZWNpZmljYWxseSBzaGFkb3dpbmcgbG9jYWxzKSwKICAgICAgLy8gICAoYikgZGVzdHJ1Y3R1cmluZywgKGMpIGJsb2NrLXNjb3BlZCBmdW5jdGlvbnMsCiAgICAgIC8vICAgKGQpIGZvci1vZiAoY29uc3QpLCAoZSkgbmV3LnRhcmdldC9SZWZsZWN0LmNvbnN0cnVjdAogICAgICB2YXIgZXM2ZnVsbFRlc3QgPQogICAgICAgICAgJ2NsYXNzIFh7Y29uc3RydWN0b3IoKXtpZihuZXcudGFyZ2V0IT1TdHJpbmcpdGhyb3cgMTt0aGlzLng9NDJ9fScgKwogICAgICAgICAgJ2xldCBxPVJlZmxlY3QuY29uc3RydWN0KFgsW10sU3RyaW5nKTtpZihxLnghPTQyfHwhKHEgaW5zdGFuY2VvZiAnICsKICAgICAgICAgICdTdHJpbmcpKXRocm93IDE7Zm9yKGNvbnN0IGEgb2ZbMiwzXSl7aWYoYT09Miljb250aW51ZTtmdW5jdGlvbiAnICsKICAgICAgICAgICdmKHo9e2F9KXtsZXQgYT0wO3JldHVybiB6LmF9e2Z1bmN0aW9uIGYoKXtyZXR1cm4gMDt9fXJldHVybiBmKCknICsKICAgICAgICAgICc9PTN9JzsKCiAgICAgIHJldHVybiBldmFsQ2hlY2soJygoKT0+eyJ1c2Ugc3RyaWN0IjsnICsgZXM2ZnVsbFRlc3QgKyAnfSkoKScpOwogICAgfSk7CiAgICAvLyAqKiBhbmQgKio9IGFyZSB0aGUgb25seSBuZXcgZmVhdHVyZXMgaW4gJ2VzNycKICAgIGFkZE5ld2VyTGFuZ3VhZ2VUcmFuc3BpbGF0aW9uQ2hlY2soJ2VzNycsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXZhbENoZWNrKCcyICoqIDIgPT0gNCcpOwogICAgfSk7CiAgICAvLyBhc3luYyBmdW5jdGlvbnMgYXJlIHRoZSBvbmx5IG5ldyBmZWF0dXJlcyBpbiAnZXM4JwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM4JywgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBldmFsQ2hlY2soJ2FzeW5jICgpID0+IDEsIHRydWUnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM5JywgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBldmFsQ2hlY2soJyh7Li4ucmVzdH0gPSB7fSksIHRydWUnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXNfbmV4dCcsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZmFsc2U7ICAvLyBhc3N1bWUgaXQgYWx3YXlzIG5lZWQgdG8gdHJhbnNwaWxlCiAgICB9KTsKICAgIHJldHVybiB7dGFyZ2V0OiB0cmFuc3BpbGF0aW9uVGFyZ2V0LCBtYXA6IHJlcXVpcmVzVHJhbnNwaWxhdGlvbn07CiAgfTsKCgogIC8qKgogICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbmVlZHMgdG8gYmUgdHJhbnNwaWxlZC4KICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZwogICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gbW9kdWxlCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKi8KICBnb29nLlRyYW5zcGlsZXIucHJvdG90eXBlLm5lZWRzVHJhbnNwaWxlID0gZnVuY3Rpb24obGFuZywgbW9kdWxlKSB7CiAgICBpZiAoZ29vZy5UUkFOU1BJTEUgPT0gJ2Fsd2F5cycpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKGdvb2cuVFJBTlNQSUxFID09ICduZXZlcicpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmICghdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fKSB7CiAgICAgIHZhciBvYmogPSB0aGlzLmNyZWF0ZVJlcXVpcmVzVHJhbnNwaWxhdGlvbl8oKTsKICAgICAgdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fID0gb2JqLm1hcDsKICAgICAgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0XyA9IHRoaXMudHJhbnNwaWxhdGlvblRhcmdldF8gfHwgb2JqLnRhcmdldDsKICAgIH0KICAgIGlmIChsYW5nIGluIHRoaXMucmVxdWlyZXNUcmFuc3BpbGF0aW9uXykgewogICAgICBpZiAodGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fW2xhbmddKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICBnb29nLmluSHRtbERvY3VtZW50XygpICYmIG1vZHVsZSA9PSAnZXM2JyAmJgogICAgICAgICAgISgnbm9Nb2R1bGUnIGluIGdvb2cuZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxhbmd1YWdlIG1vZGU6ICcgKyBsYW5nKTsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogTGF6aWx5IHJldHJpZXZlcyB0aGUgdHJhbnNwaWxlciBhbmQgYXBwbGllcyBpdCB0byB0aGUgc291cmNlLgogICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIEpTIGNvZGUuCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0byB0aGUgY29kZS4KICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0cmFuc3BpbGVkIGNvZGUuCiAgICovCiAgZ29vZy5UcmFuc3BpbGVyLnByb3RvdHlwZS50cmFuc3BpbGUgPSBmdW5jdGlvbihjb2RlLCBwYXRoKSB7CiAgICAvLyBUT0RPKGpvaG5wbGFpc3RlZCk6IFdlIHNob3VsZCBkZWxldGUgZ29vZy50cmFuc3BpbGVfIGFuZCBqdXN0IGhhdmUgdGhpcwogICAgLy8gZnVuY3Rpb24uIEJ1dCB0aGVyZSdzIHNvbWUgY29tcGlsZSBlcnJvciBhdG0gd2hlcmUgZ29vZy5nbG9iYWwgaXMgYmVpbmcKICAgIC8vIHN0cmlwcGVkIGluY29ycmVjdGx5IHdpdGhvdXQgdGhpcy4KICAgIHJldHVybiBnb29nLnRyYW5zcGlsZV8oY29kZSwgcGF0aCwgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0Xyk7CiAgfTsKCgogIC8qKiBAcHJpdmF0ZSBAZmluYWwgeyFnb29nLlRyYW5zcGlsZXJ9ICovCiAgZ29vZy50cmFuc3BpbGVyXyA9IG5ldyBnb29nLlRyYW5zcGlsZXIoKTsKCiAgLyoqCiAgICogUmV3cml0ZXMgY2xvc2luZyBzY3JpcHQgdGFncyBpbiBpbnB1dCB0byBhdm9pZCBlbmRpbmcgYW4gZW5jbG9zaW5nIHNjcmlwdAogICAqIHRhZy4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLnByb3RlY3RTY3JpcHRUYWdfID0gZnVuY3Rpb24oc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLzxcLyhTQ1JJUFQpL2lnLCAnXFx4M2MvJDEnKTsKICB9OwoKCiAgLyoqCiAgICogQSBkZWJ1ZyBsb2FkZXIgaXMgcmVzcG9uc2libGUgZm9yIGRvd25sb2FkaW5nIGFuZCBleGVjdXRpbmcgamF2YXNjcmlwdAogICAqIGZpbGVzIGluIGFuIHVuYnVuZGxlZCwgdW5jb21waWxlZCBlbnZpcm9ubWVudC4KICAgKgogICAqIFRoaXMgY2FuIGJlIGN1c3RpbWl6ZWQgdmlhIHRoZSBzZXREZXBlbmRlbmN5RmFjdG9yeSBtZXRob2QsIG9yIGJ5CiAgICogQ0xPU1VSRV9JTVBPUlRfU0NSSVBUL0NMT1NVUkVfTE9BRF9GSUxFX1NZTkMuCiAgICoKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvciBAZmluYWwgQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXyA9IGZ1bmN0aW9uKCkgewogICAgLyoqIEBwcml2YXRlIEBjb25zdCB7IU9iamVjdDxzdHJpbmcsICFnb29nLkRlcGVuZGVuY3k+fSAqLwogICAgdGhpcy5kZXBlbmRlbmNpZXNfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gKi8KICAgIHRoaXMuaWRUb1BhdGhfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgYm9vbGVhbj59ICovCiAgICB0aGlzLndyaXR0ZW5fID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshQXJyYXk8IWdvb2cuRGVwZW5kZW5jeT59ICovCiAgICB0aGlzLmxvYWRpbmdEZXBzXyA9IFtdOwogICAgLyoqIEBwcml2YXRlIHshQXJyYXk8IWdvb2cuRGVwZW5kZW5jeT59ICovCiAgICB0aGlzLmRlcHNUb0xvYWRfID0gW107CiAgICAvKiogQHByaXZhdGUge2Jvb2xlYW59ICovCiAgICB0aGlzLnBhdXNlZF8gPSBmYWxzZTsKICAgIC8qKiBAcHJpdmF0ZSB7IWdvb2cuRGVwZW5kZW5jeUZhY3Rvcnl9ICovCiAgICB0aGlzLmZhY3RvcnlfID0gbmV3IGdvb2cuRGVwZW5kZW5jeUZhY3RvcnkoZ29vZy50cmFuc3BpbGVyXyk7CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPn0gKi8KICAgIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshQXJyYXk8c3RyaW5nPn0gKi8KICAgIHRoaXMuZGVmZXJyZWRRdWV1ZV8gPSBbXTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBuYW1lc3BhY2VzCiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiB1bmRlZmluZWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGNhbGwgb25jZSBhbGwgdGhlCiAgICogICAgIG5hbWVzcGFjZXMgaGF2ZSBsb2FkZWQuCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmJvb3RzdHJhcCA9IGZ1bmN0aW9uKG5hbWVzcGFjZXMsIGNhbGxiYWNrKSB7CiAgICB2YXIgY2IgPSBjYWxsYmFjazsKICAgIGZ1bmN0aW9uIHJlc29sdmUoKSB7CiAgICAgIGlmIChjYikgewogICAgICAgIGdvb2cuZ2xvYmFsLnNldFRpbWVvdXQoY2IsIDApOwogICAgICAgIGNiID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGlmICghbmFtZXNwYWNlcy5sZW5ndGgpIHsKICAgICAgcmVzb2x2ZSgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGRlcHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21EZXBzXyhuYW1lc3BhY2VzW2ldKTsKICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnJlZ29uaXplZCBuYW1lc3BhY2U6ICcgKyBuYW1lc3BhY2VzW2ldKTsKICAgICAgfQogICAgICBkZXBzLnB1c2godGhpcy5kZXBlbmRlbmNpZXNfW3BhdGhdKTsKICAgIH0KCiAgICB2YXIgcmVxdWlyZSA9IGdvb2cucmVxdWlyZTsKICAgIHZhciBsb2FkZWQgPSAwOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlcXVpcmUobmFtZXNwYWNlc1tpXSk7CiAgICAgIGRlcHNbaV0ub25Mb2FkKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICgrK2xvYWRlZCA9PSBuYW1lc3BhY2VzLmxlbmd0aCkgewogICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIExvYWRzIHRoZSBDbG9zdXJlIERlcGVuZGVuY3kgZmlsZS4KICAgKgogICAqIEV4cG9zZWQgYSBwdWJsaWMgZnVuY3Rpb24gc28gQ0xPU1VSRV9OT19ERVBTIGNhbiBiZSBzZXQgdG8gZmFsc2UsIGJhc2UKICAgKiBsb2FkZWQsIHNldERlcGVuZGVuY3lGYWN0b3J5IGNhbGxlZCwgYW5kIHRoZW4gdGhpcyBjYWxsZWQuIGkuZS4gYWxsb3dzCiAgICogY3VzdG9tIGxvYWRpbmcgb2YgdGhlIGRlcHMgZmlsZS4KICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZENsb3N1cmVEZXBzID0gZnVuY3Rpb24oKSB7CiAgICAvLyBDaXJjdW12ZW50IGFkZERlcGVuZGVuY3ksIHdoaWNoIHdvdWxkIHRyeSB0byB0cmFuc3BpbGUgZGVwcy5qcyBpZgogICAgLy8gdHJhbnNwaWxlIGlzIHNldCB0byBhbHdheXMuCiAgICB2YXIgcmVsUGF0aCA9ICdkZXBzLmpzJzsKICAgIHRoaXMuZGVwc1RvTG9hZF8ucHVzaCh0aGlzLmZhY3RvcnlfLmNyZWF0ZURlcGVuZGVuY3koCiAgICAgICAgZ29vZy5ub3JtYWxpemVQYXRoXyhnb29nLmJhc2VQYXRoICsgcmVsUGF0aCksIHJlbFBhdGgsIFtdLCBbXSwge30sCiAgICAgICAgZmFsc2UpKTsKICAgIHRoaXMubG9hZERlcHNfKCk7CiAgfTsKCgogIC8qKgogICAqIE5vdGlmaWVzIHRoZSBkZWJ1ZyBsb2FkZXIgd2hlbiBhIGRlcGVuZGVuY3kgaGFzIGJlZW4gcmVxdWVzdGVkLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGFic1BhdGhPcklkIFBhdGggb2YgdGhlIGRlcGVuZGVuY3kgb3IgZ29vZyBpZC4KICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfZm9yY2UKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUucmVxdWVzdGVkID0gZnVuY3Rpb24oYWJzUGF0aE9ySWQsIG9wdF9mb3JjZSkgewogICAgdmFyIHBhdGggPSB0aGlzLmdldFBhdGhGcm9tRGVwc18oYWJzUGF0aE9ySWQpOwogICAgaWYgKHBhdGggJiYKICAgICAgICAob3B0X2ZvcmNlIHx8IHRoaXMuYXJlRGVwc0xvYWRlZF8odGhpcy5kZXBlbmRlbmNpZXNfW3BhdGhdLnJlcXVpcmVzKSkpIHsKICAgICAgdmFyIGNhbGxiYWNrID0gdGhpcy5kZWZlcnJlZENhbGxiYWNrc19bcGF0aF07CiAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgIGRlbGV0ZSB0aGlzLmRlZmVycmVkQ2FsbGJhY2tzX1twYXRoXTsKICAgICAgICBjYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgfTsKCgogIC8qKgogICAqIFNldHMgdGhlIGRlcGVuZGVuY3kgZmFjdG9yeSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGN1c3RvbQogICAqIGdvb2cuRGVwZW5kZW5jeSBpbXBsZW1lbnRhdGlvbnMgdG8gY29udHJvbCBob3cgZGVwZW5kZW5jaWVzIGFyZSBsb2FkZWQuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3lGYWN0b3J5fSBmYWN0b3J5CiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnNldERlcGVuZGVuY3lGYWN0b3J5ID0gZnVuY3Rpb24oZmFjdG9yeSkgewogICAgdGhpcy5mYWN0b3J5XyA9IGZhY3Rvcnk7CiAgfTsKCgogIC8qKgogICAqIFRyYXZzZXJzZXMgdGhlIGRlcGVuZGVuY3kgZ3JhcGggYW5kIHF1ZXVlcyB0aGUgZ2l2ZW4gZGVwZW5kZW5jeSwgYW5kIGFsbCBvZgogICAqIGl0cyB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcywgZm9yIGxvYWRpbmcgYW5kIHRoZW4gc3RhcnRzIGxvYWRpbmcgaWYgbm90CiAgICogcGF1c2VkLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRfID0gZnVuY3Rpb24obmFtZXNwYWNlKSB7CiAgICBpZiAoIXRoaXMuZ2V0UGF0aEZyb21EZXBzXyhuYW1lc3BhY2UpKSB7CiAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSAnZ29vZy5yZXF1aXJlIGNvdWxkIG5vdCBmaW5kOiAnICsgbmFtZXNwYWNlOwoKICAgICAgZ29vZy5sb2dUb0NvbnNvbGVfKGVycm9yTWVzc2FnZSk7CiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7CiAgICB9IGVsc2UgewogICAgICB2YXIgbG9hZGVyID0gdGhpczsKCiAgICAgIHZhciBkZXBzID0gW107CgogICAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAqLwogICAgICB2YXIgdmlzaXQgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAgICAgICB2YXIgcGF0aCA9IGxvYWRlci5nZXRQYXRoRnJvbURlcHNfKG5hbWVzcGFjZSk7CgogICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgZGVwZW5kZW5jeSBwYXRoIG9yIHN5bWJvbDogJyArIG5hbWVzcGFjZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobG9hZGVyLndyaXR0ZW5fW3BhdGhdKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBsb2FkZXIud3JpdHRlbl9bcGF0aF0gPSB0cnVlOwoKICAgICAgICB2YXIgZGVwID0gbG9hZGVyLmRlcGVuZGVuY2llc19bcGF0aF07CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXAucmVxdWlyZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmICghZ29vZy5pc1Byb3ZpZGVkXyhkZXAucmVxdWlyZXNbaV0pKSB7CiAgICAgICAgICAgIHZpc2l0KGRlcC5yZXF1aXJlc1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBkZXBzLnB1c2goZGVwKTsKICAgICAgfTsKCiAgICAgIHZpc2l0KG5hbWVzcGFjZSk7CgogICAgICB2YXIgd2FzTG9hZGluZyA9ICEhdGhpcy5kZXBzVG9Mb2FkXy5sZW5ndGg7CiAgICAgIHRoaXMuZGVwc1RvTG9hZF8gPSB0aGlzLmRlcHNUb0xvYWRfLmNvbmNhdChkZXBzKTsKCiAgICAgIGlmICghdGhpcy5wYXVzZWRfICYmICF3YXNMb2FkaW5nKSB7CiAgICAgICAgdGhpcy5sb2FkRGVwc18oKTsKICAgICAgfQogICAgfQogIH07CgoKICAvKioKICAgKiBMb2FkcyBhbnkgcXVldWVkIGRlcGVuZGVuY2llcyB1bnRpbCB0aGV5IGFyZSBhbGwgbG9hZGVkIG9yIHBhdXNlZC4KICAgKgogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWREZXBzXyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxvYWRlciA9IHRoaXM7CiAgICB2YXIgcGF1c2VkID0gdGhpcy5wYXVzZWRfOwoKICAgIHdoaWxlICh0aGlzLmRlcHNUb0xvYWRfLmxlbmd0aCAmJiAhcGF1c2VkKSB7CiAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbG9hZENhbGxEb25lID0gZmFsc2U7CiAgICAgICAgdmFyIGRlcCA9IGxvYWRlci5kZXBzVG9Mb2FkXy5zaGlmdCgpOwoKICAgICAgICB2YXIgbG9hZGVkID0gZmFsc2U7CiAgICAgICAgbG9hZGVyLmxvYWRpbmdfKGRlcCk7CgogICAgICAgIHZhciBjb250cm9sbGVyID0gewogICAgICAgICAgcGF1c2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobG9hZENhbGxEb25lKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBwYXVzZSBhZnRlciB0aGUgY2FsbCB0byBsb2FkLicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBhdXNlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICByZXN1bWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobG9hZENhbGxEb25lKSB7CiAgICAgICAgICAgICAgbG9hZGVyLnJlc3VtZV8oKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBTb21lIGRlcCBjYWxsZWQgcGF1c2UgYW5kIHRoZW4gcmVzdW1lIGluIHRoZSBzYW1lIGxvYWQgY2FsbC4KICAgICAgICAgICAgICAvLyBKdXN0IGtlZXAgcnVubmluZyB0aGlzIHNhbWUgbG9vcC4KICAgICAgICAgICAgICBwYXVzZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGxvYWRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChsb2FkZWQpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvdWJsZSBjYWxsIHRvIGxvYWRlZC4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgbG9hZGVyLmxvYWRlZF8oZGVwKTsKICAgICAgICAgIH0sCiAgICAgICAgICBwZW5kaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gRGVmZW5zaXZlIGNvcHkuCiAgICAgICAgICAgIHZhciBwZW5kaW5nID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9hZGVyLmxvYWRpbmdEZXBzXy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHBlbmRpbmcucHVzaChsb2FkZXIubG9hZGluZ0RlcHNfW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGVuZGluZzsKICAgICAgICAgIH0sCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBwYXJhbSB7Z29vZy5Nb2R1bGVUeXBlfSB0eXBlCiAgICAgICAgICAgKi8KICAgICAgICAgIHNldE1vZHVsZVN0YXRlOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gewogICAgICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJycsCiAgICAgICAgICAgICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICAgIH0sCiAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgc3RyaW5nLCBzdHJpbmc9KX0gKi8KICAgICAgICAgIHJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0czogZnVuY3Rpb24oCiAgICAgICAgICAgICAgcGF0aCwgZXhwb3J0cywgb3B0X2Nsb3N1cmVOYW1lc3BhY2UpIHsKICAgICAgICAgICAgaWYgKG9wdF9jbG9zdXJlTmFtZXNwYWNlKSB7CiAgICAgICAgICAgICAgZ29vZy5sb2FkZWRNb2R1bGVzX1tvcHRfY2xvc3VyZU5hbWVzcGFjZV0gPSB7CiAgICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICAgICAgdHlwZTogZ29vZy5Nb2R1bGVUeXBlLkVTNiwKICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBvcHRfY2xvc3VyZU5hbWVzcGFjZSB8fCAnJwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgPyl9ICovCiAgICAgICAgICByZWdpc3Rlckdvb2dNb2R1bGVFeHBvcnRzOiBmdW5jdGlvbihtb2R1bGVJZCwgZXhwb3J0cykgewogICAgICAgICAgICBnb29nLmxvYWRlZE1vZHVsZXNfW21vZHVsZUlkXSA9IHsKICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICAgIHR5cGU6IGdvb2cuTW9kdWxlVHlwZS5HT09HLAogICAgICAgICAgICAgIG1vZHVsZUlkOiBtb2R1bGVJZAogICAgICAgICAgICB9OwogICAgICAgICAgfSwKICAgICAgICAgIGNsZWFyTW9kdWxlU3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG51bGw7CiAgICAgICAgICB9LAogICAgICAgICAgZGVmZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmIChsb2FkQ2FsbERvbmUpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICAgICAgICdDYW5ub3QgcmVnaXN0ZXIgd2l0aCBkZWZlciBhZnRlciB0aGUgY2FsbCB0byBsb2FkLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvYWRlci5kZWZlcl8oZGVwLCBjYWxsYmFjayk7CiAgICAgICAgICB9LAogICAgICAgICAgYXJlRGVwc0xvYWRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBsb2FkZXIuYXJlRGVwc0xvYWRlZF8oZGVwLnJlcXVpcmVzKTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICB0cnkgewogICAgICAgICAgZGVwLmxvYWQoY29udHJvbGxlcik7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGxvYWRDYWxsRG9uZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9KSgpOwogICAgfQoKICAgIGlmIChwYXVzZWQpIHsKICAgICAgdGhpcy5wYXVzZV8oKTsKICAgIH0KICB9OwoKCiAgLyoqIEBwcml2YXRlICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnBhdXNlXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wYXVzZWRfID0gdHJ1ZTsKICB9OwoKCiAgLyoqIEBwcml2YXRlICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnJlc3VtZV8gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnBhdXNlZF8pIHsKICAgICAgdGhpcy5wYXVzZWRfID0gZmFsc2U7CiAgICAgIHRoaXMubG9hZERlcHNfKCk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIE1hcmtzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGFzIGxvYWRpbmcgKGxvYWQgaGFzIGJlZW4gY2FsbGVkIGJ1dCBpdCBoYXMgbm90CiAgICogeWV0IG1hcmtlZCBpdHNlbGYgYXMgZmluaXNoZWQpLiBVc2VmdWwgZm9yIGRlcGVuZGVuY2llcyB0aGF0IHdhbnQgdG8ga25vdwogICAqIHdoYXQgZWxzZSBpcyBsb2FkaW5nLiBFeGFtcGxlOiBnb29nLm1vZHVsZXMgY2Fubm90IGV2YWwgaWYgdGhlcmUgYXJlCiAgICogbG9hZGluZyBkZXBlbmRlbmNpZXMuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3l9IGRlcAogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRpbmdfID0gZnVuY3Rpb24oZGVwKSB7CiAgICB0aGlzLmxvYWRpbmdEZXBzXy5wdXNoKGRlcCk7CiAgfTsKCgogIC8qKgogICAqIE1hcmtzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGFzIGhhdmluZyBmaW5pc2hlZCBsb2FkaW5nIGFuZCBiZWluZyBhdmFpbGFibGUKICAgKiBmb3IgcmVxdWlyZS4KICAgKgogICAqIEBwYXJhbSB7IWdvb2cuRGVwZW5kZW5jeX0gZGVwCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZGVkXyA9IGZ1bmN0aW9uKGRlcCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxvYWRpbmdEZXBzXy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpcy5sb2FkaW5nRGVwc19baV0gPT0gZGVwKSB7CiAgICAgICAgdGhpcy5sb2FkaW5nRGVwc18uc3BsaWNlKGksIDEpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRlZmVycmVkUXVldWVfLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzLmRlZmVycmVkUXVldWVfW2ldID09IGRlcC5wYXRoKSB7CiAgICAgICAgdGhpcy5kZWZlcnJlZFF1ZXVlXy5zcGxpY2UoaSwgMSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodGhpcy5sb2FkaW5nRGVwc18ubGVuZ3RoID09IHRoaXMuZGVmZXJyZWRRdWV1ZV8ubGVuZ3RoICYmCiAgICAgICAgIXRoaXMuZGVwc1RvTG9hZF8ubGVuZ3RoKSB7CiAgICAgIC8vIFNvbWV0aGluZyBoYXMgYXNrZWQgdG8gbG9hZCB0aGVzZSwgYnV0IHRoZXkgbWF5IG5vdCBiZSBkaXJlY3RseQogICAgICAvLyByZXF1aXJlZCBhZ2FpbiBsYXRlciwgc28gbG9hZCB0aGVtIG5vdyB0aGF0IHdlIGtub3cgd2UncmUgZG9uZSBsb2FkaW5nCiAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZS4gZS5nLiBhIGdvb2cgbW9kdWxlIGVudHJ5IHBvaW50LgogICAgICB3aGlsZSAodGhpcy5kZWZlcnJlZFF1ZXVlXy5sZW5ndGgpIHsKICAgICAgICB0aGlzLnJlcXVlc3RlZCh0aGlzLmRlZmVycmVkUXVldWVfLnNoaWZ0KCksIHRydWUpOwogICAgICB9CiAgICB9CgogICAgZGVwLmxvYWRlZCgpOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwYXRoc09ySWRzCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5hcmVEZXBzTG9hZGVkXyA9IGZ1bmN0aW9uKHBhdGhzT3JJZHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aHNPcklkcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21EZXBzXyhwYXRoc09ySWRzW2ldKTsKICAgICAgaWYgKCFwYXRoIHx8CiAgICAgICAgICAoIShwYXRoIGluIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfKSAmJgogICAgICAgICAgICFnb29nLmlzUHJvdmlkZWRfKHBhdGhzT3JJZHNbaV0pKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gYWJzUGF0aE9ySWQKICAgKiBAcmV0dXJuIHs/c3RyaW5nfQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmdldFBhdGhGcm9tRGVwc18gPSBmdW5jdGlvbihhYnNQYXRoT3JJZCkgewogICAgaWYgKGFic1BhdGhPcklkIGluIHRoaXMuaWRUb1BhdGhfKSB7CiAgICAgIHJldHVybiB0aGlzLmlkVG9QYXRoX1thYnNQYXRoT3JJZF07CiAgICB9IGVsc2UgaWYgKGFic1BhdGhPcklkIGluIHRoaXMuZGVwZW5kZW5jaWVzXykgewogICAgICByZXR1cm4gYWJzUGF0aE9ySWQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHshZ29vZy5EZXBlbmRlbmN5fSBkZXBlbmRlbmN5CiAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUuZGVmZXJfID0gZnVuY3Rpb24oZGVwZW5kZW5jeSwgY2FsbGJhY2spIHsKICAgIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfW2RlcGVuZGVuY3kucGF0aF0gPSBjYWxsYmFjazsKICAgIHRoaXMuZGVmZXJyZWRRdWV1ZV8ucHVzaChkZXBlbmRlbmN5LnBhdGgpOwogIH07CgoKICAvKioKICAgKiBJbnRlcmZhY2UgZm9yIGdvb2cuRGVwZW5kZW5jeSBpbXBsZW1lbnRhdGlvbnMgdG8gaGF2ZSBzb21lIGNvbnRyb2wgb3ZlcgogICAqIGxvYWRpbmcgb2YgZGVwZW5kZW5jaWVzLgogICAqCiAgICogQHJlY29yZAogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnRyb2xsZXIgdG8gaGFsdCBsb2FkaW5nIG9mIG1vcmUgZGVwZW5kZW5jaWVzLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7fTsKCgogIC8qKgogICAqIFRlbGxzIHRoZSBjb250cm9sbGVyIHRvIHJlc3VtZSBsb2FkaW5nIG9mIG1vcmUgZGVwZW5kZW5jaWVzIGlmIHBhdXNlZC4KICAgKi8KICBnb29nLkxvYWRDb250cm9sbGVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnRyb2xsZXIgdGhhdCB0aGlzIGRlcGVuZGVuY3kgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCiAgICoKICAgKiBUaGlzIGNhdXNlcyB0aGlzIHRvIGJlIHJlbW92ZWQgZnJvbSBwZW5kaW5nKCkgYW5kIGFueSBsb2FkIGNhbGxiYWNrcyB0bwogICAqIGZpcmUuCiAgICovCiAgZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUubG9hZGVkID0gZnVuY3Rpb24oKSB7fTsKCgogIC8qKgogICAqIExpc3Qgb2YgZGVwZW5kZW5jaWVzIG9uIHdoaWNoIGxvYWQgaGFzIGJlZW4gY2FsbGVkIGJ1dCB3aGljaCBoYXZlIG5vdAogICAqIGNhbGxlZCBsb2FkZWQgb24gdGhlaXIgY29udHJvbGxlci4gVGhpcyBpbmNsdWRlcyB0aGUgY3VycmVudCBkZXBlbmRlbmN5LgogICAqCiAgICogQHJldHVybiB7IUFycmF5PCFnb29nLkRlcGVuZGVuY3k+fQogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnBlbmRpbmcgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGFuIG9iamVjdCBhcyBhbiBFUzYgbW9kdWxlJ3MgZXhwb3J0cyBzbyB0aGF0IGdvb2cubW9kdWxlcyBtYXkKICAgKiByZXF1aXJlIGl0IGJ5IHBhdGguCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBGdWxsIHBhdGggb2YgdGhlIG1vZHVsZS4KICAgKiBAcGFyYW0gez99IGV4cG9ydHMKICAgKiBAcGFyYW0ge3N0cmluZz19IG9wdF9jbG9zdXJlTmFtZXNwYWNlIENsb3N1cmUgbmFtZXNwYWNlIHRvIGFzc29jaWF0ZSB3aXRoCiAgICogICAgIHRoaXMgbW9kdWxlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0cyA9IGZ1bmN0aW9uKAogICAgICBwYXRoLCBleHBvcnRzLCBvcHRfY2xvc3VyZU5hbWVzcGFjZSkge307CgoKICAvKioKICAgKiBTZXRzIHRoZSBjdXJyZW50IG1vZHVsZSBzdGF0ZS4KICAgKgogICAqIEBwYXJhbSB7Z29vZy5Nb2R1bGVUeXBlfSB0eXBlIFR5cGUgb2YgbW9kdWxlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnNldE1vZHVsZVN0YXRlID0gZnVuY3Rpb24odHlwZSkge307CgoKICAvKioKICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgbW9kdWxlIHN0YXRlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmNsZWFyTW9kdWxlU3RhdGUgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gY2FsbCBvbmNlIHRoZSBkZXBlbmRlbmN5IGlzIGFjdHVhbGx5IHJlcXVlc3RlZAogICAqIHZpYSBnb29nLnJlcXVpcmUgKyBhbGwgb2YgdGhlIGltbWVkaWF0ZSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGxvYWRlZCBvcgogICAqIGFsbCBvdGhlciBmaWxlcyBoYXZlIGJlZW4gbG9hZGVkLiBBbGxvd3MgZm9yIGxhenkgbG9hZGluZyB1bnRpbAogICAqIHJlcXVpcmUnZCB3aXRob3V0IHBhdXNpbmcgZGVwZW5kZW5jeSBsb2FkaW5nLCB3aGljaCBpcyBuZWVkZWQgb24gb2xkIElFLgogICAqCiAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrCiAgICovCiAgZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUuZGVmZXIgPSBmdW5jdGlvbihjYWxsYmFjaykge307CgoKICAvKioKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmFyZURlcHNMb2FkZWQgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogQmFzaWMgc3VwZXIgY2xhc3MgZm9yIGFsbCBkZXBlbmRlbmNpZXMgQ2xvc3VyZSBMaWJyYXJ5IGNhbiBsb2FkLgogICAqCiAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIGxvYWQgdW50cmFuc3BpbGVkLCBub24tbW9kdWxlCiAgICogc2NyaXB0cyBpbiBhIHdlYiBicm9zd2VyLgogICAqCiAgICogRm9yIHRyYW5zcGlsZWQgbm9uLWdvb2cubW9kdWxlIGZpbGVzIHtAc2VlIGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3l9LgogICAqIEZvciBnb29nLm1vZHVsZXMgc2VlIHtAc2VlIGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3l9LgogICAqIEZvciB1bnRyYW5zcGlsZWQgRVM2IG1vZHVsZXMge0BzZWUgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5fS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggb2YgdGhpcyBzY3JpcHQuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBQYXRoIG9mIHRoaXMgc2NyaXB0IHJlbGF0aXZlIHRvIGdvb2cuYmFzZVBhdGguCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcHJvdmlkZXMgZ29vZy5wcm92aWRlZCBvciBnb29nLm1vZHVsZSBzeW1ib2xzCiAgICogICAgIGluIHRoaXMgZmlsZS4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBnb29nIHN5bWJvbHMgb3IgcmVsYXRpdmUgcGF0aHMgdG8gQ2xvc3VyZQogICAqICAgICB0aGlzIGRlcGVuZHMgb24uCiAgICogQHBhcmFtIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gbG9hZEZsYWdzCiAgICogQHN0cnVjdCBAY29uc3RydWN0b3IKICAgKi8KICBnb29nLkRlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncykgewogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5wYXRoID0gcGF0aDsKICAgIC8qKiBAY29uc3QgKi8KICAgIHRoaXMucmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5wcm92aWRlcyA9IHByb3ZpZGVzOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5yZXF1aXJlcyA9IHJlcXVpcmVzOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5sb2FkRmxhZ3MgPSBsb2FkRmxhZ3M7CiAgICAvKiogQHByaXZhdGUge2Jvb2xlYW59ICovCiAgICB0aGlzLmxvYWRlZF8gPSBmYWxzZTsKICAgIC8qKiBAcHJpdmF0ZSB7IUFycmF5PGZ1bmN0aW9uKCk+fSAqLwogICAgdGhpcy5sb2FkQ2FsbGJhY2tzXyA9IFtdOwogIH07CgoKICAvKioKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYXRobmFtZSBwYXJ0IG9mIHRoaXMgZGVwZW5kZW5jeSdzIHBhdGggaWYgaXQgaXMgYQogICAqICAgICBVUkkuCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5nZXRQYXRoTmFtZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhdGhOYW1lID0gdGhpcy5wYXRoOwogICAgdmFyIHByb3RvY29sSW5kZXggPSBwYXRoTmFtZS5pbmRleE9mKCc6Ly8nKTsKICAgIGlmIChwcm90b2NvbEluZGV4ID49IDApIHsKICAgICAgcGF0aE5hbWUgPSBwYXRoTmFtZS5zdWJzdHJpbmcocHJvdG9jb2xJbmRleCArIDMpOwogICAgICB2YXIgc2xhc2hJbmRleCA9IHBhdGhOYW1lLmluZGV4T2YoJy8nKTsKICAgICAgaWYgKHNsYXNoSW5kZXggPj0gMCkgewogICAgICAgIHBhdGhOYW1lID0gcGF0aE5hbWUuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhdGhOYW1lOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIGZpcmUgYXMgc29vbiBhcyB0aGlzIGhhcyBsb2FkZWQuCiAgICogQGZpbmFsCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5vbkxvYWQgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgaWYgKHRoaXMubG9hZGVkXykgewogICAgICBjYWxsYmFjaygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5sb2FkQ2FsbGJhY2tzXy5wdXNoKGNhbGxiYWNrKTsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogTWFya3MgdGhpcyBkZXBlbmRlbmN5IGFzIGxvYWRlZCBhbmQgZmlyZXMgYW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGgKICAgKiBvbkxvYWQuCiAgICogQGZpbmFsCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubG9hZGVkXyA9IHRydWU7CiAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5sb2FkQ2FsbGJhY2tzXzsKICAgIHRoaXMubG9hZENhbGxiYWNrc18gPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNhbGxiYWNrc1tpXSgpOwogICAgfQogIH07CgoKICAvKioKICAgKiBXaGV0aGVyIG9yIG5vdCBkb2N1bWVudC53cml0dGVuIC8gYXBwZW5kZWQgc2NyaXB0IHRhZ3Mgc2hvdWxkIGJlIGRlZmVycmVkLgogICAqCiAgICogQHByaXZhdGUge2Jvb2xlYW59CiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LmRlZmVyXyA9IGZhbHNlOwoKCiAgLyoqCiAgICogTWFwIG9mIHNjcmlwdCByZWFkeSAvIHN0YXRlIGNoYW5nZSBjYWxsYmFja3MuIE9sZCBJRSBjYW5ub3QgaGFuZGxlIHB1dHRpbmcKICAgKiB0aGVzZSBwcm9wZXJ0aWVzIG9uIGdvb2cuZ2xvYmFsLgogICAqCiAgICogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgZnVuY3Rpb24oPyk6dW5kZWZpbmVkPn0KICAgKi8KICBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfID0ge307CgoKICAvKioKICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLj8pOj99IGNhbGxiYWNrCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHZhciBrZXkgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDMyKTsKICAgIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF9ba2V5XSA9IGNhbGxiYWNrOwogICAgcmV0dXJuIGtleTsKICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IGtleQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18gPSBmdW5jdGlvbihrZXkpIHsKICAgIGRlbGV0ZSBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfW2tleV07CiAgfTsKCgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkKICAgKiBAcGFyYW0gey4uLj99IHZhcl9hcmdzCiAgICogQHByaXZhdGUKICAgKiBAc3VwcHJlc3Mge3VudXNlZFByaXZhdGVNZW1iZXJzfQogICAqLwogIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja18gPSBmdW5jdGlvbihrZXksIHZhcl9hcmdzKSB7CiAgICBpZiAoa2V5IGluIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF8pIHsKICAgICAgdmFyIGNhbGxiYWNrID0gZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrTWFwX1trZXldOwogICAgICB2YXIgYXJncyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB9CiAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7CiAgICB9IGVsc2UgewogICAgICB2YXIgZXJyb3JNZXNzYWdlID0gJ0NhbGxiYWNrIGtleSAnICsga2V5ICsKICAgICAgICAgICcgZG9lcyBub3QgZXhpc3QgKHdhcyBiYXNlLmpzIGxvYWRlZCBtb3JlIHRoYW4gb25jZT8pLic7CiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIFN0YXJ0cyBsb2FkaW5nIHRoaXMgZGVwZW5kZW5jeS4gVGhpcyBkZXBlbmRlbmN5IGNhbiBwYXVzZSBsb2FkaW5nIGlmIGl0CiAgICogbmVlZHMgdG8gYW5kIHJlc3VtZSBpdCBsYXRlciB2aWEgdGhlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgogICAqCiAgICogV2hlbiB0aGlzIGlzIGxvYWRlZCBpdCBzaG91bGQgY2FsbCBjb250cm9sbGVyLmxvYWRlZCgpLiBOb3RlIHRoYXQgdGhpcyB3aWxsCiAgICogZW5kIHVwIGNhbGxpbmcgdGhlIGxvYWRlZCBtZXRob2Qgb2YgdGhpcyBkZXBlbmRlbmN5OyB0aGVyZSBpcyBubyBuZWVkIHRvCiAgICogY2FsbCBpdCBleHBsaWNpdGx5LgogICAqCiAgICogQHBhcmFtIHshZ29vZy5Mb2FkQ29udHJvbGxlcn0gY29udHJvbGxlcgogICAqLwogIGdvb2cuRGVwZW5kZW5jeS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uKGNvbnRyb2xsZXIpIHsKICAgIGlmIChnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQpIHsKICAgICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCh0aGlzLnBhdGgpKSB7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghZ29vZy5pbkh0bWxEb2N1bWVudF8oKSkgewogICAgICBnb29nLmxvZ1RvQ29uc29sZV8oCiAgICAgICAgICAnQ2Fubm90IHVzZSBkZWZhdWx0IGRlYnVnIGxvYWRlciBvdXRzaWRlIG9mIEhUTUwgZG9jdW1lbnRzLicpOwogICAgICBpZiAodGhpcy5yZWxhdGl2ZVBhdGggPT0gJ2RlcHMuanMnKSB7CiAgICAgICAgLy8gU29tZSBvbGQgY29kZSBpcyByZWx5aW5nIG9uIGJhc2UuanMgYXV0byBsb2FkaW5nIGRlcHMuanMgZmFpbGluZyB3aXRoCiAgICAgICAgLy8gbm8gZXJyb3IgYmVmb3JlIGxhdGVyIHNldHRpbmcgQ0xPU1VSRV9JTVBPUlRfU0NSSVBULgogICAgICAgIC8vIENMT1NVUkVfSU1QT1JUX1NDUklQVCBzaG91bGQgYmUgc2V0ICpiZWZvcmUqIGJhc2UuanMgaXMgbG9hZGVkLCBvcgogICAgICAgIC8vIENMT1NVUkVfTk9fREVQUyBzZXQgdG8gdHJ1ZS4KICAgICAgICBnb29nLmxvZ1RvQ29uc29sZV8oCiAgICAgICAgICAgICdDb25zaWRlciBzZXR0aW5nIENMT1NVUkVfSU1QT1JUX1NDUklQVCBiZWZvcmUgbG9hZGluZyBiYXNlLmpzLCAnICsKICAgICAgICAgICAgJ29yIHNldHRpbmcgQ0xPU1VSRV9OT19ERVBTIHRvIHRydWUuJyk7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKiBAdHlwZSB7IUhUTUxEb2N1bWVudH0gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICAvLyBJZiB0aGUgdXNlciB0cmllcyB0byByZXF1aXJlIGEgbmV3IHN5bWJvbCBhZnRlciBkb2N1bWVudCBsb2FkLAogICAgLy8gc29tZXRoaW5nIGhhcyBnb25lIHRlcnJpYmx5IHdyb25nLiBEb2luZyBhIGRvY3VtZW50LndyaXRlIHdvdWxkCiAgICAvLyB3aXBlIG91dCB0aGUgcGFnZS4gVGhpcyBkb2VzIG5vdCBhcHBseSB0byB0aGUgQ1NQLWNvbXBsaWFudCBtZXRob2QKICAgIC8vIG9mIHdyaXRpbmcgc2NyaXB0IHRhZ3MuCiAgICBpZiAoZG9jLnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJyAmJgogICAgICAgICFnb29nLkVOQUJMRV9DSFJPTUVfQVBQX1NBRkVfU0NSSVBUX0xPQURJTkcpIHsKICAgICAgLy8gQ2VydGFpbiB0ZXN0IGZyYW1ld29ya3MgbG9hZCBiYXNlLmpzIG11bHRpcGxlIHRpbWVzLCB3aGljaCB0cmllcwogICAgICAvLyB0byB3cml0ZSBkZXBzLmpzIGVhY2ggdGltZS4gSWYgdGhhdCBoYXBwZW5zLCBqdXN0IGZhaWwgc2lsZW50bHkuCiAgICAgIC8vIFRoZXNlIGZyYW1ld29ya3Mgd2lwZSB0aGUgcGFnZSBiZXR3ZWVuIGVhY2ggbG9hZCBvZiBiYXNlLmpzLCBzbyB0aGlzCiAgICAgIC8vIGlzIE9LLgogICAgICB2YXIgaXNEZXBzID0gL1xiZGVwcy5qcyQvLnRlc3QodGhpcy5wYXRoKTsKICAgICAgaWYgKGlzRGVwcykgewogICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IEVycm9yKCdDYW5ub3Qgd3JpdGUgIicgKyB0aGlzLnBhdGggKyAnIiBhZnRlciBkb2N1bWVudCBsb2FkJyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIWdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyAmJgogICAgICAgIGdvb2cuaXNEb2N1bWVudExvYWRpbmdfKCkpIHsKICAgICAgdmFyIGtleSA9IGdvb2cuRGVwZW5kZW5jeS5yZWdpc3RlckNhbGxiYWNrXyhmdW5jdGlvbihzY3JpcHQpIHsKICAgICAgICBpZiAoIWdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8gfHwgc2NyaXB0LnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJykgewogICAgICAgICAgZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18oa2V5KTsKICAgICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdmFyIG5vbmNlQXR0ciA9ICFnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfICYmIGdvb2cuZ2V0U2NyaXB0Tm9uY2UoKSA/CiAgICAgICAgICAnIG5vbmNlPSInICsgZ29vZy5nZXRTY3JpcHROb25jZSgpICsgJyInIDoKICAgICAgICAgICcnOwogICAgICB2YXIgZXZlbnQgPQogICAgICAgICAgZ29vZy5EZWJ1Z0xvYWRlcl8uSVNfT0xEX0lFXyA/ICdvbnJlYWR5c3RhdGVjaGFuZ2UnIDogJ29ubG9hZCc7CiAgICAgIHZhciBkZWZlciA9IGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8gPyAnZGVmZXInIDogJyc7CiAgICAgIHZhciBzY3JpcHQgPSAnPHNjcmlwdCBzcmM9IicgKyB0aGlzLnBhdGggKyAnIiAnICsgZXZlbnQgKwogICAgICAgICAgJz0iZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXyhcJycgKyBrZXkgKwogICAgICAgICAgJ1wnLCB0aGlzKSIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiAnICsgZGVmZXIgKyBub25jZUF0dHIgKyAnPjwnICsKICAgICAgICAgICcvc2NyaXB0Pic7CiAgICAgIGRvYy53cml0ZSgKICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgICBnb29nLlRSVVNURURfVFlQRVNfUE9MSUNZXy5jcmVhdGVIVE1MKHNjcmlwdCkgOgogICAgICAgICAgICAgIHNjcmlwdCk7CiAgICB9IGVsc2UgewogICAgICB2YXIgc2NyaXB0RWwgPQogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFNjcmlwdEVsZW1lbnR9ICovIChkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpOwogICAgICBzY3JpcHRFbC5kZWZlciA9IGdvb2cuRGVwZW5kZW5jeS5kZWZlcl87CiAgICAgIHNjcmlwdEVsLmFzeW5jID0gZmFsc2U7CiAgICAgIHNjcmlwdEVsLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKCiAgICAgIC8vIElmIENTUCBub25jZXMgYXJlIHVzZWQsIHByb3BhZ2F0ZSB0aGVtIHRvIGR5bmFtaWNhbGx5IGNyZWF0ZWQgc2NyaXB0cy4KICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgbm9uY2UtYmFzZWQgQ1NQcyB3aXRob3V0ICdzdHJpY3QtZHluYW1pYycuCiAgICAgIHZhciBub25jZSA9IGdvb2cuZ2V0U2NyaXB0Tm9uY2UoKTsKICAgICAgaWYgKG5vbmNlKSB7CiAgICAgICAgc2NyaXB0RWwuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTsKICAgICAgfQoKICAgICAgaWYgKGdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8pIHsKICAgICAgICAvLyBFeGVjdXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgb24gb2xkIElFLCBoYWx0IGxvYWRpbmcgYW5kIHdyaXRlCiAgICAgICAgLy8gdGhlc2Ugc2NyaXB0cyBvbmUgYXQgYSB0aW1lLCBhZnRlciBlYWNoIGxvYWRzLgogICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgICBzY3JpcHRFbC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChzY3JpcHRFbC5yZWFkeVN0YXRlID09ICdsb2FkZWQnIHx8CiAgICAgICAgICAgICAgc2NyaXB0RWwucmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnKSB7CiAgICAgICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgICAgIGNvbnRyb2xsZXIucmVzdW1lKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzY3JpcHRFbC5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHNjcmlwdEVsLm9ubG9hZCA9IG51bGw7CiAgICAgICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHNjcmlwdEVsLnNyYyA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZVNjcmlwdFVSTCh0aGlzLnBhdGgpIDoKICAgICAgICAgIHRoaXMucGF0aDsKICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpOwogICAgfQogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBBYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc2NyaXB0LgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggUGF0aCBvZiB0aGlzIHNjcmlwdCByZWxhdGl2ZSB0byBnb29nLmJhc2VQYXRoLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHByb3ZpZGVzIFNob3VsZCBiZSBhbiBlbXB0eSBhcnJheS4KICAgKiAgICAgVE9ETyhqb2hucGxhaXN0ZWQpIGFkZCBzdXBwb3J0IGZvciBhZGRpbmcgY2xvc3VyZSBuYW1lc3BhY2VzIHRvIEVTNgogICAqICAgICBtb2R1bGVzIGZvciBpbnRlcm9wIHB1cnBvc2VzLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLkRlcGVuZGVuY3l9CiAgICovCiAgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpIHsKICAgIGdvb2cuRXM2TW9kdWxlRGVwZW5kZW5jeS5iYXNlKAogICAgICAgIHRoaXMsICdjb25zdHJ1Y3RvcicsIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogIH07CiAgZ29vZy5pbmhlcml0cyhnb29nLkVzNk1vZHVsZURlcGVuZGVuY3ksIGdvb2cuRGVwZW5kZW5jeSk7CgoKICAvKiogQG92ZXJyaWRlICovCiAgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCkgewogICAgICBpZiAoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKHRoaXMucGF0aCkpIHsKICAgICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFnb29nLmluSHRtbERvY3VtZW50XygpKSB7CiAgICAgIGdvb2cubG9nVG9Db25zb2xlXygKICAgICAgICAgICdDYW5ub3QgdXNlIGRlZmF1bHQgZGVidWcgbG9hZGVyIG91dHNpZGUgb2YgSFRNTCBkb2N1bWVudHMuJyk7CiAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKiBAdHlwZSB7IUhUTUxEb2N1bWVudH0gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICB2YXIgZGVwID0gdGhpczsKCiAgICAvLyBUT0RPKGpvaG5wbGFpc3RlZCk6IERvZXMgZG9jdW1lbnQud3JpdGluZyByZWFsbHkgc3BlZWQgdXAgYW55dGhpbmc/IEFueQogICAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGp1c3Qgd2FpdGluZyBmb3IgaW50ZXJhY3RpdmUgbW9kZSBhbmQgdGhlbgogICAgLy8gYXBwZW5kaW5nPwogICAgZnVuY3Rpb24gd3JpdGUoc3JjLCBjb250ZW50cykgewogICAgICBpZiAoY29udGVudHMpIHsKICAgICAgICB2YXIgc2NyaXB0ID0gJzxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbj4nICsgY29udGVudHMgKyAnPC8nICsKICAgICAgICAgICAgJ3NjcmlwdD4nOwogICAgICAgIGRvYy53cml0ZSgKICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChzY3JpcHQpIDoKICAgICAgICAgICAgICAgIHNjcmlwdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHNjcmlwdCA9ICc8c2NyaXB0IHR5cGU9Im1vZHVsZSIgY3Jvc3NvcmlnaW4gc3JjPSInICsgc3JjICsgJyI+PC8nICsKICAgICAgICAgICAgJ3NjcmlwdD4nOwogICAgICAgIGRvYy53cml0ZSgKICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChzY3JpcHQpIDoKICAgICAgICAgICAgICAgIHNjcmlwdCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhcHBlbmQoc3JjLCBjb250ZW50cykgewogICAgICB2YXIgc2NyaXB0RWwgPQogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFNjcmlwdEVsZW1lbnR9ICovIChkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpOwogICAgICBzY3JpcHRFbC5kZWZlciA9IHRydWU7CiAgICAgIHNjcmlwdEVsLmFzeW5jID0gZmFsc2U7CiAgICAgIHNjcmlwdEVsLnR5cGUgPSAnbW9kdWxlJzsKICAgICAgc2NyaXB0RWwuc2V0QXR0cmlidXRlKCdjcm9zc29yaWdpbicsIHRydWUpOwoKICAgICAgLy8gSWYgQ1NQIG5vbmNlcyBhcmUgdXNlZCwgcHJvcGFnYXRlIHRoZW0gdG8gZHluYW1pY2FsbHkgY3JlYXRlZCBzY3JpcHRzLgogICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBub25jZS1iYXNlZCBDU1BzIHdpdGhvdXQgJ3N0cmljdC1keW5hbWljJy4KICAgICAgdmFyIG5vbmNlID0gZ29vZy5nZXRTY3JpcHROb25jZSgpOwogICAgICBpZiAobm9uY2UpIHsKICAgICAgICBzY3JpcHRFbC5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpOwogICAgICB9CgogICAgICBpZiAoY29udGVudHMpIHsKICAgICAgICBzY3JpcHRFbC50ZXh0Q29udGVudCA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0KGNvbnRlbnRzKSA6CiAgICAgICAgICAgIGNvbnRlbnRzOwogICAgICB9IGVsc2UgewogICAgICAgIHNjcmlwdEVsLnNyYyA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0VVJMKHNyYykgOgogICAgICAgICAgICBzcmM7CiAgICAgIH0KCiAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsKTsKICAgIH0KCiAgICB2YXIgY3JlYXRlOwoKICAgIGlmIChnb29nLmlzRG9jdW1lbnRMb2FkaW5nXygpKSB7CiAgICAgIGNyZWF0ZSA9IHdyaXRlOwogICAgICAvLyBXZSBjYW4gT05MWSBjYWxsIGRvY3VtZW50LndyaXRlIGlmIHdlIGFyZSBndWFyYW50ZWVkIHRoYXQgYW55CiAgICAgIC8vIG5vbi1tb2R1bGUgc2NyaXB0IHRhZ3MgZG9jdW1lbnQud3JpdHRlbiBhZnRlciB0aGlzIGFyZSBkZWZlcnJlZC4KICAgICAgLy8gU21hbGwgb3B0aW1pemF0aW9uLCBpbiB0aGVvcnkgZG9jdW1lbnQud3JpdGluZyBpcyBmYXN0ZXIuCiAgICAgIGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8gPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgY3JlYXRlID0gYXBwZW5kOwogICAgfQoKICAgIC8vIFdyaXRlIDQgc2VwYXJhdGUgdGFncyBoZXJlOgogICAgLy8gMSkgU2V0cyB0aGUgbW9kdWxlIHN0YXRlIGF0IHRoZSBjb3JyZWN0IHRpbWUgKGp1c3QgYmVmb3JlIGV4ZWN1dGlvbikuCiAgICAvLyAyKSBBIHNyYyBub2RlIGZvciB0aGlzLCB3aGljaCBqdXN0IGhvcGVmdWxseSBsZXRzIHRoZSBicm93c2VyIGxvYWQgaXQgYQogICAgLy8gICAgbGl0dGxlIGVhcmx5IChubyBuZWVkIHRvIHBhcnNlICMzKS4KICAgIC8vIDMpIEltcG9ydCB0aGUgbW9kdWxlIGFuZCByZWdpc3RlciBpdC4KICAgIC8vIDQpIENsZWFyIHRoZSBtb2R1bGUgc3RhdGUgYXQgdGhlIGNvcnJlY3QgdGltZS4gR3VhcmFudGVlZCB0byBydW4gZXZlbgogICAgLy8gICAgaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIG1vZHVsZSAoIzMgd2lsbCBub3QgcnVuIGlmIHRoZXJlIGlzIGFuCiAgICAvLyAgICBlcnJvciBpbiB0aGUgbW9kdWxlKS4KICAgIHZhciBiZWZvcmVLZXkgPSBnb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oKSB7CiAgICAgIGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGJlZm9yZUtleSk7CiAgICAgIGNvbnRyb2xsZXIuc2V0TW9kdWxlU3RhdGUoZ29vZy5Nb2R1bGVUeXBlLkVTNik7CiAgICB9KTsKICAgIGNyZWF0ZSh1bmRlZmluZWQsICdnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tfKCInICsgYmVmb3JlS2V5ICsgJyIpJyk7CgogICAgLy8gVE9ETyhqb2hucGxhaXN0ZWQpOiBEb2VzIHRoaXMgcmVhbGx5IHNwZWVkIHVwIGFueXRoaW5nPwogICAgY3JlYXRlKHRoaXMucGF0aCwgdW5kZWZpbmVkKTsKCiAgICB2YXIgcmVnaXN0ZXJLZXkgPSBnb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oZXhwb3J0cykgewogICAgICBnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhyZWdpc3RlcktleSk7CiAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKAogICAgICAgICAgZGVwLnBhdGgsIGV4cG9ydHMsIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWUpOwogICAgfSk7CiAgICBjcmVhdGUoCiAgICAgICAgdW5kZWZpbmVkLAogICAgICAgICdpbXBvcnQgKiBhcyBtIGZyb20gIicgKyB0aGlzLnBhdGggKyAnIjsgZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArCiAgICAgICAgICAgIHJlZ2lzdGVyS2V5ICsgJyIsIG0pJyk7CgogICAgdmFyIGFmdGVyS2V5ID0gZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCkgewogICAgICBnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhhZnRlcktleSk7CiAgICAgIGNvbnRyb2xsZXIuY2xlYXJNb2R1bGVTdGF0ZSgpOwogICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgfSk7CiAgICBjcmVhdGUodW5kZWZpbmVkLCAnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArIGFmdGVyS2V5ICsgJyIpJyk7CiAgfTsKCgogIC8qKgogICAqIFN1cGVyY2xhc3Mgb2YgYW55IGRlcGVuZGVuY3kgdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQgaW50byBtZW1vcnksCiAgICogdHJhbnNmb3JtZWQsIGFuZCB0aGVuIGV2YWwnZCAoZ29vZy5tb2R1bGVzIGFuZCB0cmFuc3BpbGVkIGZpbGVzKS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggb2YgdGhpcyBzY3JpcHQuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBQYXRoIG9mIHRoaXMgc2NyaXB0IHJlbGF0aXZlIHRvIGdvb2cuYmFzZVBhdGguCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcHJvdmlkZXMgZ29vZy5wcm92aWRlZCBvciBnb29nLm1vZHVsZSBzeW1ib2xzCiAgICogICAgIGluIHRoaXMgZmlsZS4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBnb29nIHN5bWJvbHMgb3IgcmVsYXRpdmUgcGF0aHMgdG8gQ2xvc3VyZQogICAqICAgICB0aGlzIGRlcGVuZHMgb24uCiAgICogQHBhcmFtIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gbG9hZEZsYWdzCiAgICogQHN0cnVjdCBAY29uc3RydWN0b3IgQGFic3RyYWN0CiAgICogQGV4dGVuZHMge2dvb2cuRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKAogICAgICBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKSB7CiAgICBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeS5iYXNlKAogICAgICAgIHRoaXMsICdjb25zdHJ1Y3RvcicsIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogICAgLyoqIEBwcml2YXRlIHs/c3RyaW5nfSAqLwogICAgdGhpcy5jb250ZW50c18gPSBudWxsOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBsYXppbHkgbWFrZSB0aGUgc3luY2hyb25vdXMgWEhSICh3aGVuIGdvb2cucmVxdWlyZSdkKSBvciBtYWtlCiAgICAgKiB0aGUgc3luY2hyb25vdXMgWEhSIHdoZW4gaW5pdGlhbGx5IGxvYWRpbmcuIE9uIEZpcmVGb3ggNjEgdGhlcmUgaXMgYSBidWcKICAgICAqIHdoZXJlIGFuIEVTNiBtb2R1bGUgY2Fubm90IG1ha2UgYSBzeW5jaHJvbm91cyBYSFIgKHJhdGhlciwgaXQgY2FuLCBidXQgaWYKICAgICAqIGl0IGRvZXMgdGhlbiBubyBvdGhlciBFUzYgbW9kdWxlcyB3aWxsIGxvYWQgYWZ0ZXIpLgogICAgICoKICAgICAqIHRsO2RyIHdlIGxhenkgbG9hZCBkdWUgdG8gYnVncyBvbiBvbGRlciBicm93c2VycyBhbmQgZWFnZXIgbG9hZCBkdWUgdG8KICAgICAqIGJ1Z3Mgb24gbmV3ZXIgb25lcy4KICAgICAqCiAgICAgKiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDc3MDkwCiAgICAgKgogICAgICogQHByaXZhdGUgQGNvbnN0IHtib29sZWFufQogICAgICovCiAgICB0aGlzLmxhenlGZXRjaF8gPSAhZ29vZy5pbkh0bWxEb2N1bWVudF8oKSB8fAogICAgICAgICEoJ25vTW9kdWxlJyBpbiBnb29nLmdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSk7CiAgfTsKICBnb29nLmluaGVyaXRzKGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LCBnb29nLkRlcGVuZGVuY3kpOwoKCiAgLyoqIEBvdmVycmlkZSAqLwogIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgdmFyIGRlcCA9IHRoaXM7CgogICAgZnVuY3Rpb24gZmV0Y2goKSB7CiAgICAgIGRlcC5jb250ZW50c18gPSBnb29nLmxvYWRGaWxlU3luY18oZGVwLnBhdGgpOwoKICAgICAgaWYgKGRlcC5jb250ZW50c18pIHsKICAgICAgICBkZXAuY29udGVudHNfID0gZGVwLnRyYW5zZm9ybShkZXAuY29udGVudHNfKTsKICAgICAgICBpZiAoZGVwLmNvbnRlbnRzXykgewogICAgICAgICAgZGVwLmNvbnRlbnRzXyArPSAnXG4vLyMgc291cmNlVVJMPScgKyBkZXAucGF0aDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKSB7CiAgICAgIGZldGNoKCk7CiAgICAgIGlmICh0aGlzLmNvbnRlbnRzXyAmJgogICAgICAgICAgZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKCcnLCB0aGlzLmNvbnRlbnRzXykpIHsKICAgICAgICB0aGlzLmNvbnRlbnRzXyA9IG51bGw7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKCiAgICB2YXIgaXNFczYgPSB0aGlzLmxvYWRGbGFnc1snbW9kdWxlJ10gPT0gZ29vZy5Nb2R1bGVUeXBlLkVTNjsKCiAgICBpZiAoIXRoaXMubGF6eUZldGNoXykgewogICAgICBmZXRjaCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICAgIGlmIChkZXAubGF6eUZldGNoXykgewogICAgICAgIGZldGNoKCk7CiAgICAgIH0KCiAgICAgIGlmICghZGVwLmNvbnRlbnRzXykgewogICAgICAgIC8vIGxvYWRGaWxlU3luY18gb3IgdHJhbnNmb3JtIGFyZSByZXNwb25zaWJsZS4gQXNzdW1lIHRoZXkgbG9nZ2VkIGFuCiAgICAgICAgLy8gZXJyb3IuCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoaXNFczYpIHsKICAgICAgICBjb250cm9sbGVyLnNldE1vZHVsZVN0YXRlKGdvb2cuTW9kdWxlVHlwZS5FUzYpOwogICAgICB9CgogICAgICB2YXIgbmFtZXNwYWNlOwoKICAgICAgdHJ5IHsKICAgICAgICB2YXIgY29udGVudHMgPSBkZXAuY29udGVudHNfOwogICAgICAgIGRlcC5jb250ZW50c18gPSBudWxsOwogICAgICAgIGdvb2cuZ2xvYmFsRXZhbChjb250ZW50cyk7CiAgICAgICAgaWYgKGlzRXM2KSB7CiAgICAgICAgICBuYW1lc3BhY2UgPSBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lOwogICAgICAgIH0KICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAoaXNFczYpIHsKICAgICAgICAgIGNvbnRyb2xsZXIuY2xlYXJNb2R1bGVTdGF0ZSgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGlzRXM2KSB7CiAgICAgICAgLy8gRHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB0aGlzIG1heSBub3QgYmUgYXZhaWxhYmxlIGZvciByZXF1aXJlCiAgICAgICAgLy8gcmlnaHQgbm93LgogICAgICAgIGdvb2cuZ2xvYmFsWyckanNjb21wJ11bJ3JlcXVpcmUnXVsnZW5zdXJlJ10oCiAgICAgICAgICAgIFtkZXAuZ2V0UGF0aE5hbWUoKV0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKAogICAgICAgICAgICAgICAgICBkZXAucGF0aCwKICAgICAgICAgICAgICAgICAgZ29vZy5nbG9iYWxbJyRqc2NvbXAnXVsncmVxdWlyZSddKGRlcC5nZXRQYXRoTmFtZSgpKSwKICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlKTsKICAgICAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICB9CgogICAgLy8gRG8gbm90IGZldGNoIG5vdzsgaW4gRmlyZUZveCA0NyB0aGUgc3luY2hyb25vdXMgWEhSIGRvZXNuJ3QgYmxvY2sgYWxsCiAgICAvLyBldmVudHMuIElmIHdlIGZldGNoZWQgbm93IGFuZCB0aGVuIGRvY3VtZW50LndyaXRlJ2QgdGhlIGNvbnRlbnRzIHRoZQogICAgLy8gZG9jdW1lbnQud3JpdGUgd291bGQgYmUgYW4gZXZhbCBhbmQgd291bGQgZXhlY3V0ZSB0b28gc29vbiEgSW5zdGVhZCB3cml0ZQogICAgLy8gYSBzY3JpcHQgdGFnIHRvIGZldGNoIGFuZCBldmFsIHN5bmNocm9ub3VzbHkgYXQgdGhlIGNvcnJlY3QgdGltZS4KICAgIGZ1bmN0aW9uIGZldGNoSW5Pd25TY3JpcHRUaGVuTG9hZCgpIHsKICAgICAgLyoqIEB0eXBlIHshSFRNTERvY3VtZW50fSAqLwogICAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CgogICAgICB2YXIga2V5ID0gZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCkgewogICAgICAgIGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGtleSk7CiAgICAgICAgbG9hZCgpOwogICAgICB9KTsKCiAgICAgIHZhciBzY3JpcHQgPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPicgKwogICAgICAgICAgZ29vZy5wcm90ZWN0U2NyaXB0VGFnXygnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArIGtleSArICciKTsnKSArCiAgICAgICAgICAnPC8nICsKICAgICAgICAgICdzY3JpcHQ+JzsKICAgICAgZG9jLndyaXRlKAogICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZUhUTUwoc2NyaXB0KSA6CiAgICAgICAgICAgICAgc2NyaXB0KTsKICAgIH0KCiAgICAvLyBJZiBvbmUgdGhpbmcgaXMgcGVuZGluZyBpdCBpcyB0aGlzLgogICAgdmFyIGFueXRoaW5nRWxzZVBlbmRpbmcgPSBjb250cm9sbGVyLnBlbmRpbmcoKS5sZW5ndGggPiAxOwoKICAgIC8vIElmIGFueXRoaW5nIGVsc2UgaXMgbG9hZGluZyB3ZSBuZWVkIHRvIGxhenkgbG9hZCBkdWUgdG8gYnVncyBpbiBvbGQgSUUuCiAgICAvLyBTcGVjaWZpY2FsbHkgc2NyaXB0IHRhZ3Mgd2l0aCBzcmMgYW5kIHNjcmlwdCB0YWdzIHdpdGggY29udGVudHMgY291bGQKICAgIC8vIGV4ZWN1dGUgb3V0IG9mIG9yZGVyIGlmIGRvY3VtZW50LndyaXRlIGlzIHVzZWQsIHNvIHdlIGNhbm5vdCB1c2UKICAgIC8vIGRvY3VtZW50LndyaXRlLiBEbyBub3QgcGF1c2UgaGVyZTsgaXQgYnJlYWtzIG9sZCBJRSBhcyB3ZWxsLgogICAgdmFyIHVzZU9sZEllV29ya0Fyb3VuZCA9CiAgICAgICAgYW55dGhpbmdFbHNlUGVuZGluZyAmJiBnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfOwoKICAgIC8vIEFkZGl0aW9uYWxseSBpZiB3ZSBhcmUgbWVhbnQgdG8gZGVmZXIgc2NyaXB0cyBidXQgdGhlIHBhZ2UgaXMgc3RpbGwKICAgIC8vIGxvYWRpbmcgKGUuZy4gYW4gRVM2IG1vZHVsZSBpcyBsb2FkaW5nKSB0aGVuIGFsc28gZGVmZXIuIE9yIGlmIHdlIGFyZQogICAgLy8gbWVhbnQgdG8gZGVmZXIgYW5kIGFueXRoaW5nIGVsc2UgaXMgcGVuZGluZyB0aGVuIGRlZmVyICh0aG9zZSBtYXkgYmUKICAgIC8vIHNjcmlwdHMgdGhhdCBkaWQgbm90IG5lZWQgdHJhbnNmb3JtYXRpb24gYW5kIGFyZSBqdXN0IHNjcmlwdCB0YWdzIHdpdGgKICAgIC8vIGRlZmVyIHNldCB0byB0cnVlLCBhbmQgd2UgbmVlZCB0byBldmFsdWF0ZSBhZnRlciB0aGF0IGRlZmVycmVkIHNjcmlwdCkuCiAgICB2YXIgbmVlZHNBc3luY0xvYWRpbmcgPSBnb29nLkRlcGVuZGVuY3kuZGVmZXJfICYmCiAgICAgICAgKGFueXRoaW5nRWxzZVBlbmRpbmcgfHwgZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSk7CgogICAgaWYgKHVzZU9sZEllV29ya0Fyb3VuZCB8fCBuZWVkc0FzeW5jTG9hZGluZykgewogICAgICAvLyBOb3RlIHRoYXQgd2Ugb25seSBkZWZlciB3aGVuIHdlIGhhdmUgdG8gcmF0aGVyIHRoYW4gMTAwJSBvZiB0aGUgdGltZS4KICAgICAgLy8gQWx3YXlzIGRlZmVyaW5nIHdvdWxkIHdvcmssIGJ1dCB0aGVuIGluIHRoZW9yeSB0aGUgb3JkZXIgb2YKICAgICAgLy8gZ29vZy5yZXF1aXJlIGNhbGxzIHdvdWxkIHRoZW4gbWF0dGVyLiBXZSB3YW50IHRvIGVuZm9yY2UgdGhhdCBtb3N0IG9mCiAgICAgIC8vIHRoZSB0aW1lIHRoZSBvcmRlciBvZiB0aGUgcmVxdWlyZSBjYWxscyBkb2VzIG5vdCBtYXR0ZXIuCiAgICAgIGNvbnRyb2xsZXIuZGVmZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgbG9hZCgpOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVE9ETyhqb2hucGxhaXN0ZWQpOiBFeHRlcm5zIGFyZSBtaXNzaW5nIG9ucmVhZHlzdGF0ZWNoYW5nZSBmb3IKICAgIC8vIEhUTUxEb2N1bWVudC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICB2YXIgaXNJbnRlcm5ldEV4cGxvcmVyID0KICAgICAgICBnb29nLmluSHRtbERvY3VtZW50XygpICYmICdBY3RpdmVYT2JqZWN0JyBpbiBnb29nLmdsb2JhbDsKCiAgICAvLyBEb24ndCBkZWxheSBpbiBhbnkgdmVyc2lvbiBvZiBJRS4gVGhlcmUncyBidWcgYXJvdW5kIHRoaXMgdGhhdCB3aWxsCiAgICAvLyBjYXVzZSBvdXQgb2Ygb3JkZXIgc2NyaXB0IGV4ZWN1dGlvbi4gVGhpcyBtZWFucyB0aGF0IG9uIG9sZGVyIElFIEVTNgogICAgLy8gbW9kdWxlcyB3aWxsIGxvYWQgdG9vIGVhcmx5ICh3aGlsZSB0aGUgZG9jdW1lbnQgaXMgc3RpbGwgbG9hZGluZyArIHRoZQogICAgLy8gZG9tIGlzIG5vdCBhdmFpbGFibGUpLiBUaGUgb3RoZXIgb3B0aW9uIGlzIHRvIGxvYWQgdG9vIGxhdGUgKHdoZW4gdGhlCiAgICAvLyBkb2N1bWVudCBpcyBjb21wbGV0ZSBhbmQgdGhlIG9ubG9hZCBldmVuIHdpbGwgbmV2ZXIgZmlyZSkuIFRoaXMgc2VlbXMKICAgIC8vIHRvIGJlIHRoZSBsZXNzZXIgb2YgdHdvIGV2aWxzIGFzIHNjcmlwdHMgYWxyZWFkeSBhY3QgbGlrZSB0aGUgZm9ybWVyLgogICAgaWYgKGlzRXM2ICYmIGdvb2cuaW5IdG1sRG9jdW1lbnRfKCkgJiYgZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSAmJgogICAgICAgICFpc0ludGVybmV0RXhwbG9yZXIpIHsKICAgICAgZ29vZy5EZXBlbmRlbmN5LmRlZmVyXyA9IHRydWU7CiAgICAgIC8vIFRyYW5zcGlsZWQgRVM2IG1vZHVsZXMgc3RpbGwgbmVlZCB0byBsb2FkIGxpa2UgcmVndWxhciBFUzYgbW9kdWxlcywKICAgICAgLy8gYWthIG9ubHkgYWZ0ZXIgdGhlIGRvY3VtZW50IGlzIGludGVyYWN0aXZlLgogICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIHZhciBvbGRDYWxsYmFjayA9IGRvYy5vbnJlYWR5c3RhdGVjaGFuZ2U7CiAgICAgIGRvYy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoZG9jLnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgewogICAgICAgICAgZG9jLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG9sZENhbGxiYWNrOwogICAgICAgICAgbG9hZCgpOwogICAgICAgICAgY29udHJvbGxlci5yZXN1bWUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGdvb2cuaXNGdW5jdGlvbihvbGRDYWxsYmFjaykpIHsKICAgICAgICAgIG9sZENhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICAvLyBBbHdheXMgZXZhbCBvbiBvbGQgSUUuCiAgICAgIGlmIChnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfIHx8ICFnb29nLmluSHRtbERvY3VtZW50XygpIHx8CiAgICAgICAgICAhZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSkgewogICAgICAgIGxvYWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmZXRjaEluT3duU2NyaXB0VGhlbkxvYWQoKTsKICAgICAgfQogICAgfQogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudHMKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogQGFic3RyYWN0CiAgICovCiAgZ29vZy5UcmFuc2Zvcm1lZERlcGVuZGVuY3kucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbnRlbnRzKSB7fTsKCgogIC8qKgogICAqIEFueSBub24tZ29vZy5tb2R1bGUgZGVwZW5kZW5jeSB3aGljaCBuZWVkcyB0byBiZSB0cmFuc3BpbGVkIGJlZm9yZSBldmFsLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNjcmlwdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggb2YgdGhpcyBzY3JpcHQgcmVsYXRpdmUgdG8gZ29vZy5iYXNlUGF0aC4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBnb29nLnByb3ZpZGVkIG9yIGdvb2cubW9kdWxlIHN5bWJvbHMKICAgKiAgICAgaW4gdGhpcyBmaWxlLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAcGFyYW0geyFnb29nLlRyYW5zcGlsZXJ9IHRyYW5zcGlsZXIKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlRyYW5zcGlsZWREZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIHRyYW5zcGlsZXIpIHsKICAgIGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3kuYmFzZSgKICAgICAgICB0aGlzLCAnY29uc3RydWN0b3InLCBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKTsKICAgIC8qKiBAcHJvdGVjdGVkIEBjb25zdCovCiAgICB0aGlzLnRyYW5zcGlsZXIgPSB0cmFuc3BpbGVyOwogIH07CiAgZ29vZy5pbmhlcml0cyhnb29nLlRyYW5zcGlsZWREZXBlbmRlbmN5LCBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSk7CgoKICAvKiogQG92ZXJyaWRlICovCiAgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24oY29udGVudHMpIHsKICAgIC8vIFRyYW5zcGlsZSB3aXRoIHRoZSBwYXRobmFtZSBzbyB0aGF0IEVTNiBtb2R1bGVzIGFyZSBkb21haW4gYWdub3N0aWMuCiAgICByZXR1cm4gdGhpcy50cmFuc3BpbGVyLnRyYW5zcGlsZShjb250ZW50cywgdGhpcy5nZXRQYXRoTmFtZSgpKTsKICB9OwoKCiAgLyoqCiAgICogQW4gRVM2IG1vZHVsZSBkZXBlbmRlbmN5IHRoYXQgd2FzIHRyYW5zcGlsZWQgdG8gYSBqc2NvbXAgbW9kdWxlIG91dHNpZGUKICAgKiBvZiB0aGUgZGVidWcgbG9hZGVyLCBlLmcuIHNlcnZlciBzaWRlLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNjcmlwdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggb2YgdGhpcyBzY3JpcHQgcmVsYXRpdmUgdG8gZ29vZy5iYXNlUGF0aC4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBnb29nLnByb3ZpZGVkIG9yIGdvb2cubW9kdWxlIHN5bWJvbHMKICAgKiAgICAgaW4gdGhpcyBmaWxlLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpIHsKICAgIGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3kuYmFzZSgKICAgICAgICB0aGlzLCAnY29uc3RydWN0b3InLCBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKTsKICB9OwogIGdvb2cuaW5oZXJpdHMoCiAgICAgIGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3ksIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KTsKCgogIC8qKiBAb3ZlcnJpZGUgKi8KICBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbigKICAgICAgY29udGVudHMpIHsKICAgIHJldHVybiBjb250ZW50czsKICB9OwoKCiAgLyoqCiAgICogQSBnb29nLm1vZHVsZSwgdHJhbnNwaWxlZCBvciBub3QuIFdpbGwgYWx3YXlzIHBlcmZvcm0gc29tZSBtaW5pbWFsCiAgICogdHJhbnNmb3JtYXRpb24gZXZlbiB3aGVuIG5vdCB0cmFuc3BpbGVkIHRvIHdyYXAgaW4gYSBnb29nLmxvYWRNb2R1bGUKICAgKiBzdGF0ZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBBYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc2NyaXB0LgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggUGF0aCBvZiB0aGlzIHNjcmlwdCByZWxhdGl2ZSB0byBnb29nLmJhc2VQYXRoLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHByb3ZpZGVzIGdvb2cucHJvdmlkZWQgb3IgZ29vZy5tb2R1bGUgc3ltYm9scwogICAqICAgICBpbiB0aGlzIGZpbGUuCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcmVxdWlyZXMgZ29vZyBzeW1ib2xzIG9yIHJlbGF0aXZlIHBhdGhzIHRvIENsb3N1cmUKICAgKiAgICAgdGhpcyBkZXBlbmRzIG9uLgogICAqIEBwYXJhbSB7IU9iamVjdDxzdHJpbmcsIHN0cmluZz59IGxvYWRGbGFncwogICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmVlZHNUcmFuc3BpbGUKICAgKiBAcGFyYW0geyFnb29nLlRyYW5zcGlsZXJ9IHRyYW5zcGlsZXIKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIG5lZWRzVHJhbnNwaWxlLAogICAgICB0cmFuc3BpbGVyKSB7CiAgICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LmJhc2UoCiAgICAgICAgdGhpcywgJ2NvbnN0cnVjdG9yJywgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAvKiogQHByaXZhdGUgQGNvbnN0ICovCiAgICB0aGlzLm5lZWRzVHJhbnNwaWxlXyA9IG5lZWRzVHJhbnNwaWxlOwogICAgLyoqIEBwcml2YXRlIEBjb25zdCAqLwogICAgdGhpcy50cmFuc3BpbGVyXyA9IHRyYW5zcGlsZXI7CiAgfTsKICBnb29nLmluaGVyaXRzKGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3ksIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KTsKCgogIC8qKiBAb3ZlcnJpZGUgKi8KICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb250ZW50cykgewogICAgaWYgKHRoaXMubmVlZHNUcmFuc3BpbGVfKSB7CiAgICAgIGNvbnRlbnRzID0gdGhpcy50cmFuc3BpbGVyXy50cmFuc3BpbGUoY29udGVudHMsIHRoaXMuZ2V0UGF0aE5hbWUoKSk7CiAgICB9CgogICAgaWYgKCFnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUwgfHwgZ29vZy5nbG9iYWwuSlNPTiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiAnJyArCiAgICAgICAgICAnZ29vZy5sb2FkTW9kdWxlKGZ1bmN0aW9uKGV4cG9ydHMpIHsnICsKICAgICAgICAgICcidXNlIHN0cmljdCI7JyArIGNvbnRlbnRzICsKICAgICAgICAgICdcbicgKyAgLy8gdGVybWluYXRlIGFueSB0cmFpbGluZyBzaW5nbGUgbGluZSBjb21tZW50LgogICAgICAgICAgJztyZXR1cm4gZXhwb3J0cycgKwogICAgICAgICAgJ30pOycgKwogICAgICAgICAgJ1xuLy8jIHNvdXJjZVVSTD0nICsgdGhpcy5wYXRoICsgJ1xuJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAnJyArCiAgICAgICAgICAnZ29vZy5sb2FkTW9kdWxlKCcgKwogICAgICAgICAgZ29vZy5nbG9iYWwuSlNPTi5zdHJpbmdpZnkoCiAgICAgICAgICAgICAgY29udGVudHMgKyAnXG4vLyMgc291cmNlVVJMPScgKyB0aGlzLnBhdGggKyAnXG4nKSArCiAgICAgICAgICAnKTsnOwogICAgfQogIH07CgoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBicm93c2VyIGlzIElFOSBvciBlYXJsaWVyLCB3aGljaCBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nCiAgICogZm9yIGRlZmVycmVkIG1vZHVsZXMuCiAgICogQGNvbnN0IEBwcml2YXRlIHtib29sZWFufQogICAqLwogIGdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8gPSAhISgKICAgICAgIWdvb2cuZ2xvYmFsLmF0b2IgJiYgZ29vZy5nbG9iYWwuZG9jdW1lbnQgJiYgZ29vZy5nbG9iYWwuZG9jdW1lbnRbJ2FsbCddKTsKCgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxQYXRoCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPnx1bmRlZmluZWR9IHByb3ZpZGVzCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcmVxdWlyZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW58IU9iamVjdDxzdHJpbmc+PX0gb3B0X2xvYWRGbGFncwogICAqIEBzZWUgZ29vZy5hZGREZXBlbmRlbmN5CiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmFkZERlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcmVsUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBvcHRfbG9hZEZsYWdzKSB7CiAgICBwcm92aWRlcyA9IHByb3ZpZGVzIHx8IFtdOwogICAgcmVsUGF0aCA9IHJlbFBhdGgucmVwbGFjZSgvXFwvZywgJy8nKTsKICAgIHZhciBwYXRoID0gZ29vZy5ub3JtYWxpemVQYXRoXyhnb29nLmJhc2VQYXRoICsgcmVsUGF0aCk7CiAgICBpZiAoIW9wdF9sb2FkRmxhZ3MgfHwgdHlwZW9mIG9wdF9sb2FkRmxhZ3MgPT09ICdib29sZWFuJykgewogICAgICBvcHRfbG9hZEZsYWdzID0gb3B0X2xvYWRGbGFncyA/IHsnbW9kdWxlJzogZ29vZy5Nb2R1bGVUeXBlLkdPT0d9IDoge307CiAgICB9CiAgICB2YXIgZGVwID0gdGhpcy5mYWN0b3J5Xy5jcmVhdGVEZXBlbmRlbmN5KAogICAgICAgIHBhdGgsIHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgb3B0X2xvYWRGbGFncywKICAgICAgICBnb29nLnRyYW5zcGlsZXJfLm5lZWRzVHJhbnNwaWxlKAogICAgICAgICAgICBvcHRfbG9hZEZsYWdzWydsYW5nJ10gfHwgJ2VzMycsIG9wdF9sb2FkRmxhZ3NbJ21vZHVsZSddKSk7CiAgICB0aGlzLmRlcGVuZGVuY2llc19bcGF0aF0gPSBkZXA7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3ZpZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHRoaXMuaWRUb1BhdGhfW3Byb3ZpZGVzW2ldXSA9IHBhdGg7CiAgICB9CiAgICB0aGlzLmlkVG9QYXRoX1tyZWxQYXRoXSA9IHBhdGg7CiAgfTsKCgogIC8qKgogICAqIENyZWF0ZXMgZ29vZy5EZXBlbmRlbmN5IGluc3RhbmNlcyBmb3IgdGhlIGRlYnVnIGxvYWRlciB0byBsb2FkLgogICAqCiAgICogU2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8gaGF2ZSB0aGUgZGVidWcgbG9hZGVyIHVzZSBjdXN0b20gc3ViY2xhc3NlcyBvZgogICAqIGdvb2cuRGVwZW5kZW5jeS4KICAgKgogICAqIEBwYXJhbSB7IWdvb2cuVHJhbnNwaWxlcn0gdHJhbnNwaWxlcgogICAqIEBzdHJ1Y3QgQGNvbnN0cnVjdG9yCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5RmFjdG9yeSA9IGZ1bmN0aW9uKHRyYW5zcGlsZXIpIHsKICAgIC8qKiBAcHJvdGVjdGVkIEBjb25zdCAqLwogICAgdGhpcy50cmFuc3BpbGVyID0gdHJhbnNwaWxlcjsKICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZS4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggcmVsYXRpdmUgdG8gY2xvc3VyZeKAmXMgYmFzZS5qcy4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBBcnJheSBvZiBwcm92aWRlZCBnb29nLnByb3ZpZGUvbW9kdWxlIGlkcy4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBBcnJheSBvZiByZXF1aXJlZCBnb29nLnByb3ZpZGUvbW9kdWxlIC8KICAgKiAgICAgcmVsYXRpdmUgRVM2IG1vZHVsZSBwYXRocy4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZWRzVHJhbnNwaWxlIFRydWUgaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgdHJhbnNwaWxlZAogICAqICAgICBwZXIgdGhlIGdvb2cuVHJhbnNwaWxlci4KICAgKiBAcmV0dXJuIHshZ29vZy5EZXBlbmRlbmN5fQogICAqLwogIGdvb2cuRGVwZW5kZW5jeUZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZURlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncywgbmVlZHNUcmFuc3BpbGUpIHsKCiAgICBpZiAobG9hZEZsYWdzWydtb2R1bGUnXSA9PSBnb29nLk1vZHVsZVR5cGUuR09PRykgewogICAgICByZXR1cm4gbmV3IGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3koCiAgICAgICAgICBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzLCBuZWVkc1RyYW5zcGlsZSwKICAgICAgICAgIHRoaXMudHJhbnNwaWxlcik7CiAgICB9IGVsc2UgaWYgKG5lZWRzVHJhbnNwaWxlKSB7CiAgICAgIHJldHVybiBuZXcgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeSgKICAgICAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIHRoaXMudHJhbnNwaWxlcik7CiAgICB9IGVsc2UgewogICAgICBpZiAobG9hZEZsYWdzWydtb2R1bGUnXSA9PSBnb29nLk1vZHVsZVR5cGUuRVM2KSB7CiAgICAgICAgaWYgKGdvb2cuVFJBTlNQSUxFID09ICduZXZlcicgJiYgZ29vZy5BU1NVTUVfRVNfTU9EVUxFU19UUkFOU1BJTEVEKSB7CiAgICAgICAgICByZXR1cm4gbmV3IGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3koCiAgICAgICAgICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBuZXcgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5KAogICAgICAgICAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IGdvb2cuRGVwZW5kZW5jeSgKICAgICAgICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAgIH0KICAgIH0KICB9OwoKCiAgLyoqIEBwcml2YXRlIEBjb25zdCAqLwogIGdvb2cuZGVidWdMb2FkZXJfID0gbmV3IGdvb2cuRGVidWdMb2FkZXJfKCk7CgoKICAvKioKICAgKiBMb2FkcyB0aGUgQ2xvc3VyZSBEZXBlbmRlbmN5IGZpbGUuCiAgICoKICAgKiBFeHBvc2VkIGEgcHVibGljIGZ1bmN0aW9uIHNvIENMT1NVUkVfTk9fREVQUyBjYW4gYmUgc2V0IHRvIGZhbHNlLCBiYXNlCiAgICogbG9hZGVkLCBzZXREZXBlbmRlbmN5RmFjdG9yeSBjYWxsZWQsIGFuZCB0aGVuIHRoaXMgY2FsbGVkLiBpLmUuIGFsbG93cwogICAqIGN1c3RvbSBsb2FkaW5nIG9mIHRoZSBkZXBzIGZpbGUuCiAgICovCiAgZ29vZy5sb2FkQ2xvc3VyZURlcHMgPSBmdW5jdGlvbigpIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLmxvYWRDbG9zdXJlRGVwcygpOwogIH07CgoKICAvKioKICAgKiBTZXRzIHRoZSBkZXBlbmRlbmN5IGZhY3RvcnksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBjdXN0b20KICAgKiBnb29nLkRlcGVuZGVuY3kgaW1wbGVtZW50YXRpb25zIHRvIGNvbnRyb2wgaG93IGRlcGVuZGVuY2llcyBhcmUgbG9hZGVkLgogICAqCiAgICogTm90ZTogaWYgeW91IHdpc2ggdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFuZCBwcm92aWRlIHlvdXIgb3duIGltcGxlbW5ldGF0aW9uCiAgICogaXQgaXMgYSB3aXNlIGlkZWEgdG8gc2V0IENMT1NVUkVfTk9fREVQUyB0byB0cnVlLCBvdGhlcndpc2UgdGhlIGRlcGVuZGVuY3kKICAgKiBmaWxlIGFuZCBhbGwgb2YgaXRzIGdvb2cuYWRkRGVwZW5kZW5jeSBjYWxscyB3aWxsIHVzZSB0aGUgZGVmYXVsdCBmYWN0b3J5LgogICAqIFlvdSBjYW4gY2FsbCBnb29nLmxvYWRDbG9zdXJlRGVwcyB0byBsb2FkIHRoZSBDbG9zdXJlIGRlcGVuZGVuY3kgZmlsZQogICAqIGxhdGVyLCBhZnRlciB5b3VyIGZhY3RvcnkgaXMgaW5qZWN0ZWQuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3lGYWN0b3J5fSBmYWN0b3J5CiAgICovCiAgZ29vZy5zZXREZXBlbmRlbmN5RmFjdG9yeSA9IGZ1bmN0aW9uKGZhY3RvcnkpIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLnNldERlcGVuZGVuY3lGYWN0b3J5KGZhY3RvcnkpOwogIH07CgoKICBpZiAoIWdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUykgewogICAgZ29vZy5kZWJ1Z0xvYWRlcl8ubG9hZENsb3N1cmVEZXBzKCk7CiAgfQoKCiAgLyoqCiAgICogQm9vdHN0cmFwcyB0aGUgZ2l2ZW4gbmFtZXNwYWNlcyBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIG9uY2UgdGhleSBhcmUKICAgKiBhdmFpbGFibGUgZWl0aGVyIHZpYSBnb29nLnJlcXVpcmUuIFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgdXNpbmcKICAgKiBgZ29vZy5yZXF1aXJlYCB0byBib290c3RyYXAgQ2xvc3VyZSBKYXZhU2NyaXB0LiBQcmV2aW91c2x5IGEgYGdvb2cucmVxdWlyZWAKICAgKiBpbiBhbiBIVE1MIGZpbGUgd291bGQgZ3VhcmFudGVlIHRoYXQgdGhlIHJlcXVpcmUnZCBuYW1lc3BhY2Ugd2FzIGF2YWlsYWJsZQogICAqIGluIHRoZSBuZXh0IGltbWVkaWF0ZSBzY3JpcHQgdGFnLiBXaXRoIEVTNiBtb2R1bGVzIHRoaXMgbm8gbG9uZ2VyIGEKICAgKiBndWFyYW50ZWUuCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBuYW1lc3BhY2VzCiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiA/fSBjYWxsYmFjayBGdW5jdGlvbiB0byBjYWxsIG9uY2UgYWxsIHRoZSBuYW1lc3BhY2VzCiAgICogICAgIGhhdmUgbG9hZGVkLiBBbHdheXMgY2FsbGVkIGFzeW5jaHJvbm91c2x5LgogICAqLwogIGdvb2cuYm9vdHN0cmFwID0gZnVuY3Rpb24obmFtZXNwYWNlcywgY2FsbGJhY2spIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLmJvb3RzdHJhcChuYW1lc3BhY2VzLCBjYWxsYmFjayk7CiAgfTsKfQoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IFRydXN0ZWQgVHlwZXMgcG9saWN5IG5hbWUuIElmIG5vbi1lbXB0eSB0aGVuIENsb3N1cmUgd2lsbAogKiB1c2UgVHJ1c3RlZCBUeXBlcy4KICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSA9CiAgICBnb29nLmRlZmluZSgnZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FJywgJycpOwoKCi8qKgogKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIuCiAqIEBwYXJhbSB7c3RyaW5nfSBzCiAqIEByZXR1cm4ge3N0cmluZ30KICogQHByaXZhdGUKICovCmdvb2cuaWRlbnRpdHlfID0gZnVuY3Rpb24ocykgewogIHJldHVybiBzOwp9OwoKCi8qKgogKiBDcmVhdGVzIFRydXN0ZWQgVHlwZXMgcG9saWN5IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci4KICogVGhlIHBvbGljeSBqdXN0IGJsZXNzZXMgYW55IHN0cmluZyBhcyBhIFRydXN0ZWQgVHlwZS4gSXQgaXMgbm90IHZpc2liaWxpdHkKICogcmVzdHJpY3RlZCBiZWNhdXNlIGFueW9uZSBjYW4gYWxzbyBjYWxsIFRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kgZGlyZWN0bHkuCiAqIEhvd2V2ZXIsIHRoZSBhbGxvd2VkIG5hbWVzIHNob3VsZCBiZSByZXN0cmljdGVkIGJ5IGEgSFRUUCBoZWFkZXIgYW5kIHRoZQogKiByZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgcG9saWN5IHNob3VsZCBiZSB2aXNpYmlsaXR5IHJlc3RyaWN0ZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAqIEByZXR1cm4gez9UcnVzdGVkVHlwZVBvbGljeX0KICovCmdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5ID0gZnVuY3Rpb24obmFtZSkgewogIHZhciBwb2xpY3kgPSBudWxsOwogIC8vIFRPRE8oa290byk6IFJlbW92ZSB3aW5kb3cuVHJ1c3RlZFR5cGVzIHZhcmlhbnQgd2hlbiB0aGUgbmV3ZXIgQVBJIHNoaXBzLgogIHZhciBwb2xpY3lGYWN0b3J5ID0gZ29vZy5nbG9iYWwudHJ1c3RlZFR5cGVzIHx8IGdvb2cuZ2xvYmFsLlRydXN0ZWRUeXBlczsKICBpZiAoIXBvbGljeUZhY3RvcnkgfHwgIXBvbGljeUZhY3RvcnkuY3JlYXRlUG9saWN5KSB7CiAgICByZXR1cm4gcG9saWN5OwogIH0KICAvLyBUcnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5IHRocm93cyBpZiBjYWxsZWQgd2l0aCBhIG5hbWUgdGhhdCBpcyBhbHJlYWR5CiAgLy8gcmVnaXN0ZXJlZCwgZXZlbiBpbiByZXBvcnQtb25seSBtb2RlLiBVbnRpbCB0aGUgQVBJIGNoYW5nZXMsIGNhdGNoIHRoZQogIC8vIGVycm9yIG5vdCB0byBicmVhayB0aGUgYXBwbGljYXRpb25zIGZ1bmN0aW9uYWxseS4gSW4gc3VjaCBjYXNlLCB0aGUgY29kZQogIC8vIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHJlZ3VsYXIgU2FmZSBUeXBlcy4KICAvLyBUT0RPKGtvdG8pOiBSZW1vdmUgY2F0Y2hpbmcgb25jZSBjcmVhdGVQb2xpY3kgQVBJIHN0b3BzIHRocm93aW5nLgogIHRyeSB7CiAgICBwb2xpY3kgPSBwb2xpY3lGYWN0b3J5LmNyZWF0ZVBvbGljeShuYW1lLCB7CiAgICAgIGNyZWF0ZUhUTUw6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVTY3JpcHQ6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVTY3JpcHRVUkw6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVVUkw6IGdvb2cuaWRlbnRpdHlfCiAgICB9KTsKICB9IGNhdGNoIChlKSB7CiAgICBnb29nLmxvZ1RvQ29uc29sZV8oZS5tZXNzYWdlKTsKICB9CiAgcmV0dXJuIHBvbGljeTsKfTsKCgovKiogQHByaXZhdGUgQGNvbnN0IHs/VHJ1c3RlZFR5cGVQb2xpY3l9ICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID0gZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FID8KICAgIGdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSArICcjYmFzZScpIDoKICAgIG51bGw7CgovLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUy1JUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgovLwovLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgR2VuSnNEZXBzLCBwbGVhc2UgZG8gbm90IGVkaXQuCgovLyBEaXNhYmxlIENsYW5nIGZvcm1hdHRlciBmb3IgdGhpcyBmaWxlLgovLyBTZWUgaHR0cDovL2dvby5nbC9TZGl3WkgKLy8gY2xhbmctZm9ybWF0IG9mZgoKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xsZWN0aW9ucy9zZXRzLmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHMnXSwgWydnb29nLmxhYnMuY29sbGVjdGlvbnMuaXRlcmFibGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY29sbGVjdGlvbnMvc2V0c190ZXN0LmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHNUZXN0J10sIFsnZ29vZy5jb2xsZWN0aW9ucy5zZXRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWQuanMnLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5BbHJlYWR5Q2FsbGVkRXJyb3InLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5DYW5jZWxlZEVycm9yJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnLi4vLi4vdGhpcmRfcGFydHkvY2xvc3VyZS9nb29nL21vY2hpa2l0L2FzeW5jL2RlZmVycmVkX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuZGVmZXJyZWRBc3luY1Rlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRsaXN0LmpzJywgWydnb29nLmFzeW5jLkRlZmVycmVkTGlzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJy4uLy4uL3RoaXJkX3BhcnR5L2Nsb3N1cmUvZ29vZy9tb2NoaWtpdC9hc3luYy9kZWZlcnJlZGxpc3RfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZExpc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuYXN5bmMuRGVmZXJyZWRMaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90by9wcm90by5qcycsIFsnZ29vZy5wcm90byddLCBbJ2dvb2cucHJvdG8uU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8vc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90by5TZXJpYWxpemVyJ10sIFsnZ29vZy5qc29uLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvL3NlcmlhbGl6ZXJfdGVzdC5qcycsIFsnZ29vZy5wcm90b1Rlc3QnXSwgWydnb29nLnByb3RvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYW5ub3VuY2VyLmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2Fubm91bmNlcl90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQW5ub3VuY2VyJywgJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uaWZyYW1lJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hcmlhLmpzJywgWydnb29nLmExMXkuYXJpYSddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hMTF5LmFyaWEuZGF0YXRhYmxlcycsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYXJpYV90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hdHRyaWJ1dGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5BdXRvQ29tcGxldGVWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuQ2hlY2tlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Ecm9wRWZmZWN0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkV4cGFuZGVkVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkdyYWJiZWRWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuSW52YWxpZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuT3JpZW50YXRpb25WYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuUHJlc3NlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5SZWxldmFudFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5TZWxlY3RlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Tb3J0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2RhdGF0YWJsZXMuanMnLCBbJ2dvb2cuYTExeS5hcmlhLmRhdGF0YWJsZXMnXSwgWydnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL3JvbGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5Sb2xlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXJyYXkvYXJyYXkuanMnLCBbJ2dvb2cuYXJyYXknXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FycmF5L2FycmF5X3Rlc3QuanMnLCBbJ2dvb2cuYXJyYXlUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczcnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzLmpzJywgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJ10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRvbS5Ob2RlVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuYXNzZXJ0c1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9hbmltYXRpb25kZWxheS5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvYW5pbWF0aW9uZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9jb25kaXRpb25hbGRlbGF5LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3luYy5EZWxheSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvY29uZGl0aW9uYWxkZWxheV90ZXN0LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXlUZXN0J10sIFsnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlYm91bmNlci5qcycsIFsnZ29vZy5hc3luYy5EZWJvdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVib3VuY2VyX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRGVib3VuY2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWJvdW5jZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlbGF5LmpzJywgWydnb29nLkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5EZWxheVRlc3QnXSwgWydnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0LmpzJywgWydnb29nLmFzeW5jLkZyZWVMaXN0J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRnJlZUxpc3RUZXN0J10sIFsnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvbmV4dHRpY2suanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL25leHR0aWNrX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2tUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuLmpzJywgWydnb29nLmFzeW5jLnJ1biddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuX25leHRfdGlja190ZXN0LmpzJywgWydnb29nLmFzeW5jLnJ1bk5leHRUaWNrVGVzdCddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9ydW5fdGVzdC5qcycsIFsnZ29vZy5hc3luYy5ydW5UZXN0J10sIFsnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy90aHJvdHRsZS5qcycsIFsnZ29vZy5UaHJvdHRsZScsICdnb29nLmFzeW5jLlRocm90dGxlJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL3Rocm90dGxlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuVGhyb3R0bGVUZXN0J10sIFsnZ29vZy5hc3luYy5UaHJvdHRsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy93b3JrcXVldWUuanMnLCBbJ2dvb2cuYXN5bmMuV29ya0l0ZW0nLCAnZ29vZy5hc3luYy5Xb3JrUXVldWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvd29ya3F1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlVGVzdCddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlLmpzJywgWydnb29nJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYmFzZV9tb2R1bGVfdGVzdC5qcycsIFsnZ29vZy5iYXNlTW9kdWxlVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy50ZXN0X21vZHVsZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlX3Rlc3QuanMnLCBbJ2dvb2cuYmFzZVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdF9tb2R1bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9hbHBoYS5qcycsIFsnZ29vZy5jb2xvci5hbHBoYSddLCBbJ2dvb2cuY29sb3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NvbG9yL2FscGhhX3Rlc3QuanMnLCBbJ2dvb2cuY29sb3IuYWxwaGFUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNvbG9yLmFscGhhJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvci5qcycsIFsnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLkhzbCcsICdnb29nLmNvbG9yLkhzdicsICdnb29nLmNvbG9yLlJnYiddLCBbJ2dvb2cuY29sb3IubmFtZXMnLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvcl90ZXN0LmpzJywgWydnb29nLmNvbG9yVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLm5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9uYW1lcy5qcycsIFsnZ29vZy5jb2xvci5uYW1lcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Flcy5qcycsIFsnZ29vZy5jcnlwdC5BZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5CbG9ja0NpcGhlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYWVzX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuQWVzVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5BZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2FyYzQuanMnLCBbJ2dvb2cuY3J5cHQuQXJjNCddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYXJjNF90ZXN0LmpzJywgWydnb29nLmNyeXB0LkFyYzRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2U2NC5qcycsIFsnZ29vZy5jcnlwdC5iYXNlNjQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmFzZTY0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZTY0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5iYXNlNjQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuLmpzJywgWydnb29nLmNyeXB0LmJhc2VOJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZU5UZXN0J10sIFsnZ29vZy5jcnlwdC5iYXNlTicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlci5qcycsIFsnZ29vZy5jcnlwdC5CbG9iSGFzaGVyJywgJ2dvb2cuY3J5cHQuQmxvYkhhc2hlci5FdmVudFR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcycsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlcl90ZXN0LmpzJywgWydnb29nLmNyeXB0LkJsb2JIYXNoZXJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkJsb2JIYXNoZXInLCAnZ29vZy5jcnlwdC5NZDUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jsb2NrY2lwaGVyLmpzJywgWydnb29nLmNyeXB0LkJsb2NrQ2lwaGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYnl0ZXN0cmluZ19wZXJmLmpzJywgWydnb29nLmNyeXB0LmJ5dGVBcnJheVRvU3RyaW5nUGVyZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiYy5qcycsIFsnZ29vZy5jcnlwdC5DYmMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQmxvY2tDaXBoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiY190ZXN0LmpzJywgWydnb29nLmNyeXB0LkNiY1Rlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQWVzJywgJ2dvb2cuY3J5cHQuQ2JjJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdC5qcycsIFsnZ29vZy5jcnlwdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdF90ZXN0LmpzJywgWydnb29nLmNyeXB0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2N0ci5qcycsIFsnZ29vZy5jcnlwdC5DdHInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jdHJfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5DdHJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFlcycsICdnb29nLmNyeXB0LkN0cicsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaC5qcycsIFsnZ29vZy5jcnlwdC5IYXNoJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaDMyLmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMiddLCBbJ2dvb2cuY3J5cHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2gzMl90ZXN0LmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMlRlc3QnXSwgWydnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2h0ZXN0ZXIuanMnLCBbJ2dvb2cuY3J5cHQuaGFzaFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jcnlwdCcsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZScsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9obWFjLmpzJywgWydnb29nLmNyeXB0LkhtYWMnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2htYWNfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5IbWFjVGVzdCddLCBbJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnLCAnZ29vZy5jcnlwdC5oYXNoVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDUuanMnLCBbJ2dvb2cuY3J5cHQuTWQ1J10sIFsnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDVfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5NZDVUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0Lk1kNScsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMi5qcycsIFsnZ29vZy5jcnlwdC5wYmtkZjInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMl90ZXN0LmpzJywgWydnb29nLmNyeXB0LnBia2RmMlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQucGJrZGYyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGExLmpzJywgWydnb29nLmNyeXB0LlNoYTEnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTFfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGExVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMi5qcycsIFsnZ29vZy5jcnlwdC5TaGEyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjQuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMjI0J10sIFsnZ29vZy5jcnlwdC5TaGEyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjRfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyMjRUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LlNoYTIyNCcsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Ni5qcycsIFsnZ29vZy5jcnlwdC5TaGEyNTYnXSwgWydnb29nLmNyeXB0LlNoYTInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Nl90ZXN0LmpzJywgWydnb29nLmNyeXB0LlNoYTI1NlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMjU2JywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMl82NGJpdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyXzY0Yml0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJywgJ2dvb2cubWF0aC5Mb25nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyXzY0Yml0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdF90ZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMzg0JywgJ2dvb2cuY3J5cHQuU2hhNTEyJywgJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NicsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTM4NC5qcycsIFsnZ29vZy5jcnlwdC5TaGEzODQnXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMi5qcycsIFsnZ29vZy5jcnlwdC5TaGE1MTInXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMl8yNTYuanMnLCBbJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NiddLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb20uanMnLCBbJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb21fdGVzdC5qcycsIFsnZ29vZy5jc3NvbVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vaWZyYW1lL3N0eWxlLmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNzc29tJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Nzc29tL2lmcmFtZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZVRlc3QnXSwgWydnb29nLmNzc29tJywgJ2dvb2cuY3Nzb20uaWZyYW1lLnN0eWxlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFtYW5hZ2VyLmpzJywgWydnb29nLmRzLkRhdGFNYW5hZ2VyJ10sIFsnZ29vZy5kcy5CYXNpY05vZGVMaXN0JywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFzb3VyY2UuanMnLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuRGF0YU5vZGVMaXN0JywgJ2dvb2cuZHMuRW1wdHlOb2RlTGlzdCcsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuVXRpbCcsICdnb29nLmRzLmxvZ2dlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzRGF0YVNvdXJjZVRlc3QnXSwgWydnb29nLmRvbS54bWwnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkpzRGF0YVNvdXJjZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuWG1sRGF0YVNvdXJjZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS9leHByLmpzJywgWydnb29nLmRzLkV4cHInXSwgWydnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2V4cHJfdGVzdC5qcycsIFsnZ29vZy5kcy5FeHByVGVzdCddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuSnNEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZS5qcycsIFsnZ29vZy5kcy5BYnN0cmFjdEZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3RMaXN0Tm9kZScsICdnb29nLmRzLlByaW1pdGl2ZUZhc3REYXRhTm9kZSddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5EYXRhTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZV90ZXN0LmpzJywgWydnb29nLmRzLkZhc3REYXRhTm9kZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuRmFzdERhdGFOb2RlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Kc1Byb3BlcnR5RGF0YVNvdXJjZSddLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFNYW5hZ2VyJywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuZHMuTG9hZFN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzb25kYXRhc291cmNlLmpzJywgWydnb29nLmRzLkpzb25EYXRhU291cmNlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Mb2FkU3RhdGUnLCAnZ29vZy5kcy5sb2dnZXInLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLmxvZ2dlcicsICdnb29nLmV2ZW50cycsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzWG1sSHR0cERhdGFTb3VyY2VUZXN0J10sIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS94bWxkYXRhc291cmNlLmpzJywgWydnb29nLmRzLlhtbERhdGFTb3VyY2UnLCAnZ29vZy5kcy5YbWxIdHRwRGF0YVNvdXJjZSddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuTG9hZFN0YXRlJywgJ2dvb2cuZHMubG9nZ2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGUuanMnLCBbJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kYXRlX3Rlc3QuanMnLCBbJ2dvb2cuZGF0ZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZWxpa2UuanMnLCBbJ2dvb2cuZGF0ZS5EYXRlTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZXJhbmdlLmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UuSXRlcmF0b3InLCAnZ29vZy5kYXRlLkRhdGVSYW5nZS5TdGFuZGFyZERhdGVSYW5nZUtleXMnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuSW50ZXJ2YWwnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGVyYW5nZV90ZXN0LmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZHVyYXRpb24uanMnLCBbJ2dvb2cuZGF0ZS5kdXJhdGlvbiddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uTWVzc2FnZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kdXJhdGlvbl90ZXN0LmpzJywgWydnb29nLmRhdGUuZHVyYXRpb25UZXN0J10sIFsnZ29vZy5kYXRlLmR1cmF0aW9uJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlLmpzJywgWydnb29nLmRhdGUucmVsYXRpdmUnLCAnZ29vZy5kYXRlLnJlbGF0aXZlLlRpbWVEZWx0YUZvcm1hdHRlcicsICdnb29nLmRhdGUucmVsYXRpdmUuVW5pdCddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9yZWxhdGl2ZV90ZXN0LmpzJywgWydnb29nLmRhdGUucmVsYXRpdmVUZXN0J10sIFsnZ29vZy5kYXRlLnJlbGF0aXZlQ29tbW9uVGVzdHMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlY29tbW9udGVzdHMuanMnLCBbJ2dvb2cuZGF0ZS5yZWxhdGl2ZUNvbW1vblRlc3RzJ10sIFsnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5yZWxhdGl2ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3V0Y2RhdGV0aW1lLmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWUnXSwgWydnb29nLmRhdGUnLCAnZ29vZy5kYXRlLkRhdGUnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS91dGNkYXRldGltZV90ZXN0LmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWVUZXN0J10sIFsnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5VdGNEYXRlVGltZScsICdnb29nLmRhdGUubW9udGgnLCAnZ29vZy5kYXRlLndlZWtEYXknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RiL2N1cnNvci5qcycsIFsnZ29vZy5kYi5DdXJzb3InXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9kYi5qcycsIFsnZ29vZy5kYicsICdnb29nLmRiLkJsb2NrZWRDYWxsYmFjaycsICdnb29nLmRiLlVwZ3JhZGVOZWVkZWRDYWxsYmFjayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5UcmFuc2FjdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvZGJfdGVzdC5qcycsIFsnZ29vZy5kYlRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRiJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRiLlRyYW5zYWN0aW9uJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9lcnJvci5qcycsIFsnZ29vZy5kYi5Eb21FcnJvckxpa2UnLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkVycm9yLkVycm9yQ29kZScsICdnb29nLmRiLkVycm9yLkVycm9yTmFtZScsICdnb29nLmRiLkVycm9yLlZlcnNpb25DaGFuZ2VCbG9ja2VkRXJyb3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvaW5kZXguanMnLCBbJ2dvb2cuZGIuSW5kZXgnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9pbmRleGVkZGIuanMnLCBbJ2dvb2cuZGIuSW5kZXhlZERiJ10sIFsnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLk9iamVjdFN0b3JlJywgJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIva2V5cmFuZ2UuanMnLCBbJ2dvb2cuZGIuS2V5UmFuZ2UnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9vYmplY3RzdG9yZS5qcycsIFsnZ29vZy5kYi5PYmplY3RTdG9yZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kYi5DdXJzb3InLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkluZGV4JywgJ2dvb2cuZGIuS2V5UmFuZ2UnLCAnZ29vZy5kZWJ1ZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvdHJhbnNhY3Rpb24uanMnLCBbJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5kYi5UcmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1vZGUnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5PYmplY3RTdG9yZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuQ29uc29sZSddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGVfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Db25zb2xlVGVzdCddLCBbJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RlYnVnLmpzJywgWydnb29nLmRlYnVnJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWdfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Z1Rlc3QnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuZXJyb3Jjb250ZXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZWJ1Z3dpbmRvdy5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdyddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWd3aW5kb3dfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvd1Rlc3QnXSwgWydnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzLmpzJywgWydnb29nLmRlYnVnLkRldkNzcycsICdnb29nLmRlYnVnLkRldkNzcy5Vc2VyQWdlbnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jc3NvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRGV2Q3NzVGVzdCddLCBbJ2dvb2cuZGVidWcuRGV2Q3NzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RldmNzcy9kZXZjc3NydW5uZXIuanMnLCBbJ2dvb2cuZGVidWcuZGV2Q3NzUnVubmVyJ10sIFsnZ29vZy5kZWJ1Zy5EZXZDc3MnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RpdmNvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuRGl2Q29uc29sZSddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VuaGFuY2VlcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnRW5oYW5jZUVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VudHJ5cG9pbnRyZWdpc3RyeS5qcycsIFsnZ29vZy5kZWJ1Zy5FbnRyeVBvaW50TW9uaXRvcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeSddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZW50cnlwb2ludHJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5VGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvci5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3Jjb250ZXh0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Vycm9yY29udGV4dF90ZXN0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dFRlc3QnXSwgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlci5Qcm90ZWN0ZWRGdW5jdGlvbkVycm9yJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLlRyYWNlJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyQXN5bmNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJ3ZWFrZGVwLmpzJywgWydnb29nLmRlYnVnLmVycm9ySGFuZGxlcldlYWtEZXAnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcnJlcG9ydGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLkV4Y2VwdGlvbkV2ZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmxvZycsICdnb29nLm5ldC5YaHJJbycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVyaS51dGlscycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JyZXBvcnRlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5lcnJvcmNvbnRleHQnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZmFuY3l3aW5kb3cuanMnLCBbJ2dvb2cuZGVidWcuRmFuY3lXaW5kb3cnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Zvcm1hdHRlci5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXInLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuVGV4dEZvcm1hdHRlciddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5SZWxhdGl2ZVRpbWVQcm92aWRlcicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9mb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheS5qcycsIFsnZ29vZy5kZWJ1Zy5GcHNEaXNwbGF5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheV90ZXN0LmpzJywgWydnb29nLmRlYnVnLkZwc0Rpc3BsYXlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRlYnVnLkZwc0Rpc3BsYXknLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXIuanMnLCBbJ2dvb2cuZGVidWcuTG9nQnVmZmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2xvZ2dlci5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2FibGUnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nQnVmZmVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dnZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dnZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmQuanMnLCBbJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvbG9ncmVjb3Jkc2VyaWFsaXplci5qcycsIFsnZ29vZy5kZWJ1Zy5sb2dSZWNvcmRTZXJpYWxpemVyJ10sIFsnZ29vZy5kZWJ1Zy5Mb2dSZWNvcmQnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmRzZXJpYWxpemVyX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcubG9nUmVjb3JkU2VyaWFsaXplclRlc3QnXSwgWydnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLmxvZ1JlY29yZFNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3JlbGF0aXZldGltZXByb3ZpZGVyLmpzJywgWydnb29nLmRlYnVnLlJlbGF0aXZlVGltZVByb3ZpZGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvdHJhY2VyLmpzJywgWydnb29nLmRlYnVnLlN0b3BUcmFjZURldGFpbCcsICdnb29nLmRlYnVnLlRyYWNlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5pdGVyJywgJ2dvb2cubG9nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3RyYWNlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLlRyYWNlVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5UcmFjZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlZmluZWNsYXNzX3Rlc3QuanMnLCBbJ2dvb2cuZGVmaW5lQ2xhc3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlbGVnYXRlL2RlbGVnYXRlcmVnaXN0cnkuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVsZWdhdGUvZGVsZWdhdGVzLmpzJywgWydnb29nLmRlbGVnYXRlLmRlbGVnYXRlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXNfdGVzdC5qcycsIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXNUZXN0J10sIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGUuanMnLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kaXNwb3NlQWxsJ10sIFsnZ29vZy5kaXNwb3NhYmxlLklEaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGVfdGVzdC5qcycsIFsnZ29vZy5EaXNwb3NhYmxlVGVzdCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Rpc3Bvc2FibGUvaWRpc3Bvc2FibGUuanMnLCBbJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdG11bHRpcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLkFic3RyYWN0TXVsdGlSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uUmFuZ2VUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYWJzdHJhY3RyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2FuaW1hdGlvbmZyYW1lL2FuaW1hdGlvbmZyYW1lLmpzJywgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLmRvbS5hbmltYXRpb25GcmFtZS5TcGVjJywgJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLlN0YXRlJ10sIFsnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUucG9seWZpbGwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbmltYXRpb25mcmFtZS9hbmltYXRpb25mcmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5BbmltYXRpb25GcmFtZVRlc3QnXSwgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYW5pbWF0aW9uZnJhbWUvcG9seWZpbGwuanMnLCBbJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLnBvbHlmaWxsJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZS5qcycsIFsnZ29vZy5kb20uYW5ub3RhdGUnLCAnZ29vZy5kb20uYW5ub3RhdGUuQW5ub3RhdGVGbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZV90ZXN0LmpzJywgWydnb29nLmRvbS5hbm5vdGF0ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmFubm90YXRlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Fzc2VydHMuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHMnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHNUZXN0J10sIFsnZ29vZy5kb20uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2F0dHIuanMnLCBbJ2dvb2cuZG9tLkF0dHInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VyZmVhdHVyZV90ZXN0LmpzJywgWydnb29nLmRvbS5Ccm93c2VyRmVhdHVyZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcnJhbmdlL2Jyb3dzZXJyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5FcnJvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5HZWNrb1JhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5JZVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5PcGVyYVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuV2ViS2l0UmFuZ2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvYnJvd3NlcnJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvZ2Vja29yYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkdlY2tvUmFuZ2UnXSwgWydnb29nLmRvbS5icm93c2VycmFuZ2UuVzNjUmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvaWVyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkllUmFuZ2UnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9vcGVyYXJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuT3BlcmFSYW5nZSddLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS93M2NyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2Uvd2Via2l0cmFuZ2UuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XZWJLaXRSYW5nZSddLCBbJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnVmZmVyZWR2aWV3cG9ydHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5CdWZmZXJlZFZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9idWZmZXJlZHZpZXdwb3J0c2l6ZW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uQnVmZmVyZWRWaWV3cG9ydFNpemVNb25pdG9yVGVzdCddLCBbJ2dvb2cuZG9tLkJ1ZmZlcmVkVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmRvbS5WaWV3cG9ydFNpemVNb25pdG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NsYXNzZXMuanMnLCBbJ2dvb2cuZG9tLmNsYXNzZXMnXSwgWydnb29nLmFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vY2xhc3Nlc190ZXN0LmpzJywgWydnb29nLmRvbS5jbGFzc2VzX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3QuanMnLCBbJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3RfdGVzdC5qcycsIFsnZ29vZy5kb20uY2xhc3NsaXN0X3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZS5qcycsIFsnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLkNvbnRyb2xSYW5nZUl0ZXJhdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdE11bHRpUmFuZ2UnLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5SYW5nZUl0ZXJhdG9yJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5Db250cm9sUmFuZ2VUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldC5qcycsIFsnZ29vZy5kb20uZGF0YXNldCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldF90ZXN0LmpzJywgWydnb29nLmRvbS5kYXRhc2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmRhdGFzZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9kb20uanMnLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFwcGVuZGFibGUnLCAnZ29vZy5kb20uRG9tSGVscGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV9jb21waWxlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkRvbUNvbXBpbGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV90ZXN0LmpzJywgWydnb29nLmRvbS5kb21fdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uRm9udFNpemVNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkZvbnRTaXplTW9uaXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXMuanMnLCBbJ2dvb2cuZG9tLmZvcm1zJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cud2luZG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXNfdGVzdC5qcycsIFsnZ29vZy5kb20uZm9ybXNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uZm9ybXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuLmpzJywgWydnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cuZG9tLmZ1bGxzY3JlZW4uRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmZ1bGxzY3JlZW5fdGVzdCddLCBbJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaHRtbGVsZW1lbnQuanMnLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lmcmFtZS5qcycsIFsnZ29vZy5kb20uaWZyYW1lJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9pZnJhbWVfdGVzdC5qcycsIFsnZ29vZy5kb20uaWZyYW1lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZS5qcycsIFsnZ29vZy5kb20uSW5wdXRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZV90ZXN0LmpzJywgWydnb29nLmRvbS5JbnB1dFR5cGVUZXN0J10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaXRlci5qcycsIFsnZ29vZy5kb20uaXRlci5BbmNlc3Rvckl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuQ2hpbGRJdGVyYXRvcicsICdnb29nLmRvbS5pdGVyLlNpYmxpbmdJdGVyYXRvciddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2l0ZXJfdGVzdC5qcycsIFsnZ29vZy5kb20uaXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5pdGVyLkFuY2VzdG9ySXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5DaGlsZEl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuU2libGluZ0l0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9tdWx0aXJhbmdlLmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RNdWx0aVJhbmdlJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbXVsdGlyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3InXSwgWydnb29nLmRvbS5UYWdJdGVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL25vZGVpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZUl0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0LmpzJywgWydnb29nLmRvbS5Ob2RlT2Zmc2V0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0X3Rlc3QuanMnLCBbJ2dvb2cuZG9tLk5vZGVPZmZzZXRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZXR5cGUuanMnLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vYWJzdHJhY3RwYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLkFic3RyYWN0UGF0dGVybiddLCBbJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9hbGxjaGlsZHJlbi5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5BbGxDaGlsZHJlbiddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9jYWxsYmFjay9jYWxsYmFjay5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svY291bnRlci5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5Db3VudGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svdGVzdC5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0J10sIFsnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2NoaWxkbWF0Y2hlcy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnXSwgWydnb29nLmRvbS5wYXR0ZXJuLkFsbENoaWxkcmVuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9lbmR0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRW5kVGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2Z1bGx0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRnVsbFRhZyddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uU3RhcnRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL21hdGNoZXIuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hlciddLCBbJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLm1hdGNoZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5wYXR0ZXJuLkVuZFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLkZ1bGxUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaGVyJywgJ2dvb2cuZG9tLnBhdHRlcm4uUmVwZWF0JywgJ2dvb2cuZG9tLnBhdHRlcm4uU2VxdWVuY2UnLCAnZ29vZy5kb20ucGF0dGVybi5TdGFydFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLmNhbGxiYWNrLkNvdW50ZXInLCAnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0JywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9ub2RldHlwZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5Ob2RlVHlwZSddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9wYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcGF0dGVybl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWxsQ2hpbGRyZW4nLCAnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnLCAnZ29vZy5kb20ucGF0dGVybi5FbmRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5GdWxsVGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTm9kZVR5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5SZXBlYXQnLCAnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZScsICdnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uVGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcmVwZWF0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlJlcGVhdCddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9zZXF1ZW5jZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZSddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5BYnN0cmFjdFBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3N0YXJ0dGFnLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3RhZy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi90ZXh0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlRleHQnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLlJhbmdlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uTXVsdGlSYW5nZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5SYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZWVuZHBvaW50LmpzJywgWydnb29nLmRvbS5SYW5nZUVuZHBvaW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhZmUuanMnLCBbJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbiddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2FmZV90ZXN0LmpzJywgWydnb29nLmRvbS5zYWZlVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkY2FyZXRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9zYXZlZGNhcmV0cmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2F2ZWRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NlbGVjdGlvbi5qcycsIFsnZ29vZy5kb20uc2VsZWN0aW9uJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2VsZWN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnNlbGVjdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvci5qcycsIFsnZ29vZy5kb20uVGFnSXRlcmF0b3InLCAnZ29vZy5kb20uVGFnV2Fsa1R5cGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdJdGVyYXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZS5qcycsIFsnZ29vZy5kb20uVGFnTmFtZSddLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdOYW1lVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzLmpzJywgWydnb29nLmRvbS50YWdzJ10sIFsnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnRhZ3NUZXN0J10sIFsnZ29vZy5kb20udGFncycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnQuanMnLCBbJ2dvb2cuZG9tLnRleHRBc3NlcnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnRfdGVzdC5qcycsIFsnZ29vZy5kb20udGV4dGFzc2VydF90ZXN0J10sIFsnZ29vZy5kb20udGV4dEFzc2VydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZS5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlRleHRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGV4dFJhbmdlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlaXRlcmF0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdXJpLmpzJywgWydnb29nLmRvbS51cmknXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3VyaV90ZXN0LmpzJywgWydnb29nLmRvbS51cmlUZXN0J10sIFsnZ29vZy5kb20udXJpJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92ZW5kb3IuanMnLCBbJ2dvb2cuZG9tLnZlbmRvciddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdmVuZG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnZlbmRvclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3ZpZXdwb3J0c2l6ZW1vbml0b3IuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92aWV3cG9ydHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20uVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3htbC5qcycsIFsnZ29vZy5kb20ueG1sJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS94bWxfdGVzdC5qcycsIFsnZ29vZy5kb20ueG1sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20ueG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy5lZGl0b3IuZGVmaW5lcycsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2Jyb3dzZXJmZWF0dXJlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXIuanMnLCBbJ2dvb2cuZWRpdG9yLkNsaWNrVG9FZGl0V3JhcHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyJywgJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvY29tbWFuZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29tbWFuZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29udGVudEVkaXRhYmxlRmllbGQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZCcsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9kZWZpbmVzLmpzJywgWydnb29nLmVkaXRvci5kZWZpbmVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ZpZWxkLmpzJywgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5GaWVsZC5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvZmllbGRfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuZmllbGRfdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1cy5qcycsIFsnZ29vZy5lZGl0b3IuZm9jdXMnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1c190ZXN0LmpzJywgWydnb29nLmVkaXRvci5mb2N1c1Rlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9pY29udGVudC5qcycsIFsnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ljb250ZW50X3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLmljb250ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvbGluay5qcycsIFsnZ29vZy5lZGl0b3IuTGluayddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2xpbmtfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuTGlua1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlLmpzJywgWydnb29nLmVkaXRvci5ub2RlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pdGVyLkNoaWxkSXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5TaWJsaW5nSXRlcmF0b3InLCAnZ29vZy5pdGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLm5vZGVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5QbHVnaW4nXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW5JbXBsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luX2ltcGwuanMnLCBbJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuUGx1Z2luVGVzdCddLCBbJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW4uanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdEJ1YmJsZVBsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdGRpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0RGlhbG9nUGx1Z2luLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmV2ZW50cycsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9iYXNpY3RleHRmb3JtYXR0ZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyLkNPTU1BTkQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Jhc2ljdGV4dGZvcm1hdHRlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CYXNpY1RleHRGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJsb2NrcXVvdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Vtb3RpY29ucy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnMnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbW90aWNvbnNfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnNUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW1vdGljb25zJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2VudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlT2Zmc2V0JywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmcuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5pMThuLmJpZGknLCAnZ29vZy5pMThuLnVDaGFyJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmdfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5GaXJzdFN0cm9uZ1Rlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvaGVhZGVyZm9ybWF0dGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlciddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9oZWFkZXJmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5IZWFkZXJGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlcicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGUuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUuQWN0aW9uJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0QnViYmxlUGx1Z2luJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rQnViYmxlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua2RpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nUGx1Z2luJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3REaWFsb2dQbHVnaW4nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtEaWFsb2dQbHVnaW4nLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua3Nob3J0Y3V0cGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtTaG9ydGN1dFBsdWdpbiddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9saW5rc2hvcnRjdXRwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW5UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW4nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpc3R0YWJoYW5kbGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpc3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlzdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaXN0VGFiSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlzdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbG9yZW1pcHN1bS5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9sb3JlbWlwc3VtX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5SZW1vdmVGb3JtYXR0aW5nJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZ190ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0VGFiSGFuZGxlcicsICdnb29nLmVkaXRvci5yYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlNwYWNlc1RhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3RhYmxlZWRpdG9yLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5UYWJsZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWJsZWVkaXRvcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWJsZUVkaXRvcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWdvbmVudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdGFnb25lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLlRhZ09uRW50ZXJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9NYW5hZ2VyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9TdGF0ZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5icm93c2VycmFuZ2UnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG8nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvbWFuYWdlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb21hbmFnZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb3N0YXRlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdW5kb3JlZG9zdGF0ZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGVUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcmFuZ2UuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnJhbmdlLlBvaW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3JhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5lZGl0b3IucmFuZ2UuUG9pbnQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3NlYW1sZXNzZmllbGQuanMnLCBbJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnXSwgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnN0eWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc2VhbWxlc3NmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5zZWFtbGVzc2ZpZWxkX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5TZWFtbGVzc0ZpZWxkJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tSYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3N0eWxlLmpzJywgWydnb29nLmVkaXRvci5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc3R5bGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3Iuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvdGFibGUuanMnLCBbJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cuZWRpdG9yLlRhYmxlQ2VsbCcsICdnb29nLmVkaXRvci5UYWJsZVJvdyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci90YWJsZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5UYWJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRXcmFwcGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2FjdGlvbmhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkFjdGlvbkV2ZW50JywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQWN0aW9uSGFuZGxlci5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuQmVmb3JlQWN0aW9uRXZlbnQnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5BY3Rpb25IYW5kbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJldmVudC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5Nb3VzZUJ1dHRvbicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9icm93c2VyZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJmZWF0dXJlLmpzJywgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZSddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnQuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50TGlrZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cy5FdmVudElkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlclRlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRpZC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHMuanMnLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkNhcHR1cmVTaW11bGF0aW9uTW9kZScsICdnb29nLmV2ZW50cy5LZXknLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuTGlzdGVuZXJNYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHNUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5DYXB0dXJlU2ltdWxhdGlvbk1vZGUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0X3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHRhcmdldF92aWFfZ29vZ2V2ZW50c190ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldEdvb2dFdmVudHNUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0YXJnZXRfdmlhX3czY2ludGVyZmFjZV90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldFczQ1Rlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0dGVzdGVyLmpzJywgWydnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLk1vdXNlRXZlbnRzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc1RvdWNoRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyVG91Y2hGYWxsYmFja0V2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZVRlc3QnXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuUG9pbnRlckZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJUb3VjaEZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFdyYXBwZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZmlsZWRyb3BoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5GaWxlRHJvcEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9maWxlZHJvcGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZm9jdXNoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Gb2N1c0hhbmRsZXInLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2ltZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW1lSGFuZGxlci5FdmVudCcsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9pbWVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlci5FdmVudFR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2tleWNvZGVzLmpzJywgWydnb29nLmV2ZW50cy5LZXlDb2RlcyddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5Y29kZXNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuS2V5Q29kZXNUZXN0J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXloYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLktleUV2ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXluYW1lcy5qcycsIFsnZ29vZy5ldmVudHMuS2V5TmFtZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5cy5qcycsIFsnZ29vZy5ldmVudHMuS2V5cyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuYWJsZS5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlS2V5J10sIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmFibGVfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVRlc3QnXSwgWydnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJ10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZUtleSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmVybWFwLmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuTGlzdGVuZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9saXN0ZW5lcm1hcF90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL21vdXNld2hlZWxoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Nb3VzZVdoZWVsRXZlbnQnLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXInLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubWF0aCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbW91c2V3aGVlbGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5Nb3VzZVdoZWVsSGFuZGxlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuT25saW5lSGFuZGxlcicsICdnb29nLmV2ZW50cy5PbmxpbmVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL29ubGluZWxpc3RlbmVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9wYXN0ZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLmV2ZW50cy5QYXN0ZUhhbmRsZXIuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlci5TdGF0ZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubG9nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvcGFzdGVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxldmVudC5qcycsIFsnZ29vZy5ldmVudHMuV2hlZWxFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy93aGVlbGhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLldoZWVsRXZlbnQnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5XaGVlbEhhbmRsZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2VtYWlsYWRkcmVzcy5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9lbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0LmpzJywgWydnb29nLmZvcm1hdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mb3JtYXQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlci5qcycsIFsnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXInLCAnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXIuQnVmZmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlcl90ZXN0LmpzJywgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlclRlc3QnXSwgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3MuanMnLCBbJ2dvb2cuZm9ybWF0LkludGVybmF0aW9uYWxpemVkRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuSW50ZXJuYXRpb25hbGl6ZWRFbWFpbEFkZHJlc3NUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmZvcm1hdC5JbnRlcm5hdGlvbmFsaXplZEVtYWlsQWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyLmpzJywgWydnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlcicsICdnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlci5TYWZlSHRtbERlbGltaXRlcnMnLCAnZ29vZy5mb3JtYXQuSnNvblByZXR0eVByaW50ZXIuVGV4dERlbGltaXRlcnMnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLmZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyX3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyVGVzdCddLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeS5qcycsIFsnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5LkJlaGF2aW9yJywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5GaWxlRW50cnknXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeWltcGwuanMnLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZUVudHJ5SW1wbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVFbnRyeScsICdnb29nLmZzLkZpbGVXcml0ZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2Vycm9yLmpzJywgWydnb29nLmZzLkRPTUVycm9yTGlrZScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRXJyb3IuRXJyb3JDb2RlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2ZpbGVyZWFkZXIuanMnLCBbJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVSZWFkZXIuRXZlbnRUeXBlJywgJ2dvb2cuZnMuRmlsZVJlYWRlci5SZWFkeVN0YXRlJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXNhdmVyLmpzJywgWydnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLmZzLkZpbGVTYXZlci5FdmVudFR5cGUnLCAnZ29vZy5mcy5GaWxlU2F2ZXIuUmVhZHlTdGF0ZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtLmpzJywgWydnb29nLmZzLkZpbGVTeXN0ZW0nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtaW1wbC5qcycsIFsnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCddLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZVN5c3RlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXdyaXRlci5qcycsIFsnZ29vZy5mcy5GaWxlV3JpdGVyJ10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnMuanMnLCBbJ2dvb2cuZnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCcsICdnb29nLmZzLnVybCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnNfdGVzdC5qcycsIFsnZ29vZy5mc1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvcHJvZ3Jlc3NldmVudC5qcycsIFsnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL3VybC5qcycsIFsnZ29vZy5mcy51cmwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvdXJsX3Rlc3QuanMnLCBbJ2dvb2cudXJsVGVzdCddLCBbJ2dvb2cuZnMudXJsJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zLmpzJywgWydnb29nLmZ1bmN0aW9ucyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zX3Rlc3QuanMnLCBbJ2dvb2cuZnVuY3Rpb25zVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ0Ryb3BFdmVudCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3BfdGVzdC5qcycsIFsnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wJywgJ2dvb2cuZnguRHJhZ0Ryb3BJdGVtJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW0vYW5pbS5qcycsIFsnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCBbJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbS9hbmltX3Rlc3QuanMnLCBbJ2dvb2cuZnguYW5pbVRlc3QnXSwgWydnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5hbmltJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9hbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguQW5pbWF0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LkFuaW1hdGlvbi5TdGF0ZScsICdnb29nLmZ4LkFuaW1hdGlvbkV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbWF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlLmpzJywgWydnb29nLmZ4LkFuaW1hdGlvblBhcmFsbGVsUXVldWUnLCAnZ29vZy5meC5BbmltYXRpb25RdWV1ZScsICdnb29nLmZ4LkFuaW1hdGlvblNlcmlhbFF1ZXVlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uUXVldWVUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb25QYXJhbGxlbFF1ZXVlJywgJ2dvb2cuZnguQW5pbWF0aW9uU2VyaWFsUXVldWUnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguYW5pbScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3MzL2Z4LmpzJywgWydnb29nLmZ4LmNzczMnXSwgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvY3NzMy90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2NzczMvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvblRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5jc3MzLlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZS50cmFuc2l0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3NzcHJpdGVhbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQ3NzU3ByaXRlQW5pbWF0aW9uJ10sIFsnZ29vZy5meC5BbmltYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Nzc3Nwcml0ZWFuaW1hdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvblRlc3QnXSwgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvbicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RvbS5qcycsIFsnZ29vZy5meC5kb20nLCAnZ29vZy5meC5kb20uQmdDb2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5Db2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5GYWRlJywgJ2dvb2cuZnguZG9tLkZhZGVJbicsICdnb29nLmZ4LmRvbS5GYWRlSW5BbmRTaG93JywgJ2dvb2cuZnguZG9tLkZhZGVPdXQnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5meC5kb20uUHJlZGVmaW5lZEVmZmVjdCcsICdnb29nLmZ4LmRvbS5SZXNpemUnLCAnZ29vZy5meC5kb20uUmVzaXplSGVpZ2h0JywgJ2dvb2cuZnguZG9tLlJlc2l6ZVdpZHRoJywgJ2dvb2cuZnguZG9tLlNjcm9sbCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLmZ4LmRvbS5TbGlkZUZyb20nLCAnZ29vZy5meC5kb20uU3dpcGUnXSwgWydnb29nLmNvbG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3AnXSwgWydnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AnLCAnZ29vZy5meC5EcmFnRHJvcEl0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdkcm9wZ3JvdXAuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3BHcm91cCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3Bncm91cF90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdEcm9wR3JvdXBUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5EcmFnRHJvcEdyb3VwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnZ2VyLmpzJywgWydnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5EcmFnZ2VyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2dlcl90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdnZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2xpc3Rncm91cC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdERpcmVjdGlvbicsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXAnLCAnZ29vZy5meC5EcmFnTGlzdEdyb3VwLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXBFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdsaXN0Z3JvdXBfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdEdyb3VwVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0RGlyZWN0aW9uJywgJ2dvb2cuZnguRHJhZ0xpc3RHcm91cCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbicsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnc2Nyb2xsc3VwcG9ydC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ3Njcm9sbHN1cHBvcnRfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydFRlc3QnXSwgWydnb29nLmZ4LkRyYWdTY3JvbGxTdXBwb3J0JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZWFzaW5nLmpzJywgWydnb29nLmZ4LmVhc2luZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Vhc2luZ190ZXN0LmpzJywgWydnb29nLmZ4LmVhc2luZ1Rlc3QnXSwgWydnb29nLmZ4LmVhc2luZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnguanMnLCBbJ2dvb2cuZngnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb24uRXZlbnRUeXBlJywgJ2dvb2cuZnguQW5pbWF0aW9uLlN0YXRlJywgJ2dvb2cuZnguQW5pbWF0aW9uRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LmVhc2luZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnhfdGVzdC5qcycsIFsnZ29vZy5meFRlc3QnXSwgWydnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L3RyYW5zaXRpb25iYXNlLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb25CYXNlJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UuU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ4LlRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dvb2cuanMnLCBbXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9hYnN0cmFjdGdyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLkVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkZpbGwnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdHJva2UnLCAnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2FmZmluZXRyYW5zZm9ybS5qcycsIFsnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQWZmaW5lVHJhbnNmb3JtVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5QYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkNhbnZhc0dyYXBoaWNzJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ncmFwaGljcy5BYnN0cmFjdEdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGVtZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9lbGxpcHNlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9jb29yZGluYXRlcy5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2Nvb3JkaW5hdGVzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LmNvb3JkaW5hdGVzVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50X3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnRUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dCcsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2VsbGlwc2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsbGlwc2UnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2V4dC5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5FbGxpcHNlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LlJlY3RhbmdsZScsICdnb29nLmdyYXBoaWNzLmV4dC5TaGFwZScsICdnb29nLmdyYXBoaWNzLmV4dC5jb29yZGluYXRlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5HcmFwaGljcyddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvZ3JvdXAuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvaW1hZ2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3BhdGguanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGgnXSwgWydnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5tYXRoLlJlY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9wYXRoX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGhUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dC5QYXRoJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3JlY3RhbmdsZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuUmVjdGFuZ2xlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9zaGFwZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuU2hhcGUnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3N0cm9rZWFuZGZpbGxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZpbGwuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZvbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRm9udCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlN2Z0dyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyb3VwZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5Hcm91cEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ltYWdlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5JbWFnZUVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2xpbmVhcmdyYWRpZW50LmpzJywgWydnb29nLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuUGF0aC5TZWdtZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9wYXRocy5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRocyddLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aHNfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRoc1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MucGF0aHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3JlY3RlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50J10sIFsnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsLmpzJywgWydnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCddLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdHJva2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc3Ryb2tlYW5kZmlsbGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5SZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdmdncmFwaGljcy5qcycsIFsnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvdGV4dGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy92bWxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlZtbEVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxSZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFRleHRFbGVtZW50J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5UZXh0RWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvdm1sZ3JhcGhpY3MuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZ3JhcGhpY3MuQWJzdHJhY3RHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLkZvbnQnLCAnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5WbWxFbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxUZXh0RWxlbWVudCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50LmpzJywgWydnb29nLmhpc3RvcnkuRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmhpc3RvcnkuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaGlzdG9yeS5qcycsIFsnZ29vZy5IaXN0b3J5JywgJ2dvb2cuSGlzdG9yeS5FdmVudCcsICdnb29nLkhpc3RvcnkuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5kZXZpY2UnLCAnZ29vZy5tZW1vaXplJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2hpc3RvcnlfdGVzdC5qcycsIFsnZ29vZy5IaXN0b3J5VGVzdCddLCBbJ2dvb2cuSGlzdG9yeScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaGlzdG9yeS9odG1sNWhpc3RvcnkuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnknLCAnZ29vZy5oaXN0b3J5Lkh0bWw1SGlzdG9yeS5Ub2tlblRyYW5zZm9ybWVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaHRtbDVoaXN0b3J5X3Rlc3QuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuSHRtbDVIaXN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9jc3NzcGVjaWZpY2l0eS5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5J10sIFsnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvY3Nzc3BlY2lmaWNpdHlfdGVzdC5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5VGVzdCddLCBbJ2dvb2cuaHRtbC5Dc3NTcGVjaWZpY2l0eScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoLmpzJywgWydnb29nLmh0bWwuZmxhc2gnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5mbGFzaFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuZmxhc2gnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvbGVnYWN5Y29udmVyc2lvbnMuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2xlZ2FjeWNvbnZlcnNpb25zX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9uc1Rlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZycsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlaHRtbF90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZUh0bWxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVodG1sZm9ybWF0dGVyLmpzJywgWydnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWxmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVIdG1sRm9ybWF0dGVyVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXNjcmlwdC5qcycsIFsnZ29vZy5odG1sLlNhZmVTY3JpcHQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlc2NyaXB0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYWZlU2NyaXB0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlLmpzJywgWydnb29nLmh0bWwuU2FmZVN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVzdHlsZV90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZVN0eWxlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXQuanMnLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXRfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVTdHlsZVNoZWV0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlVXJsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnMudXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmxfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2FmZVVybFRlc3RWZWN0b3JzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZldXJsX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0VmVjdG9ycyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2F0dHJpYnV0ZXdoaXRlbGlzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVTYW5pdGl6ZWRXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVXaGl0ZWxpc3QnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3Nwcm9wZXJ0eXNhbml0aXplci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Byb3BlcnR5c2FuaXRpemVyX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXJUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3NzYW5pdGl6ZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Nhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuQ3NzU2FuaXRpemVyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9lbGVtZW50d2Vha21hcC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcCddLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvZWxlbWVudHdlYWttYXBfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcFRlc3QnXSwgWydnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLmh0bWxUZXN0VmVjdG9ycyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyLmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyQXR0cmlidXRlUG9saWN5JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXJQb2xpY3lDb250ZXh0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeUhpbnRzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclVybFBvbGljeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlU2FuaXRpemVkV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3InLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdCbGFja2xpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvaHRtbHNhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuSHRtbFNhbml0aXplclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyX3VuaWZpZWRfdGVzdC5qcycsIFsnZ29vZy5odG1sLkh0bWxTYW5pdGl6ZXJVbmlmaWVkVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuaHRtbFRlc3RWZWN0b3JzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplci5CdWlsZGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXJUZXN0J10sIFsnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9zYWZlZG9tdHJlZXByb2Nlc3Nvci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3NhZmVkb210cmVlcHJvY2Vzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3JUZXN0J10sIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci90YWdibGFja2xpc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuVGFnQmxhY2tsaXN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvdGFnd2hpdGVsaXN0LmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLlRhZ1doaXRlbGlzdCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZS5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZV90ZXN0LmpzJywgWydnb29nLmh0bWwuVW5zYWZlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkF0dHJpYnV0ZVdoaXRlbGlzdCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zaWx2ZXJsaWdodC5qcycsIFsnZ29vZy5odG1sLnNpbHZlcmxpZ2h0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NpbHZlcmxpZ2h0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zaWx2ZXJsaWdodFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2lsdmVybGlnaHQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGVzdGluZy5qcycsIFsnZ29vZy5odG1sLnRlc3RpbmcnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkFyZ3VtZW50TWF0Y2hlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90ZXh0ZXh0cmFjdG9yLmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGV4dGV4dHJhY3Rvcl90ZXN0LmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvclRlc3QnXSwgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkcmVzb3VyY2V1cmwuanMnLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRGlyZWN0aW9uYWxTdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdHJ1c3RlZHJlc291cmNldXJsX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkUmVzb3VyY2VVcmxUZXN0J10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudHJ1c3RlZHR5cGVzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkdHlwZXMuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3VuY2hlY2tlZGNvbnZlcnNpb25zLmpzJywgWydnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdW5jaGVja2VkY29udmVyc2lvbnNfdGVzdC5qcycsIFsnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdXRpbHMuanMnLCBbJ2dvb2cuaHRtbC51dGlscyddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3V0aWxzX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5VdGlsc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnV0aWxzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGkuanMnLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5EaXJlY3Rpb25hbFN0cmluZycsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5iaWRpVGVzdCddLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpZm9ybWF0dGVyLmpzJywgWydnb29nLmkxOG4uQmlkaUZvcm1hdHRlciddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmkxOG4uYmlkaScsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRm9ybWF0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGlmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuaTE4bi5CaWRpRm9ybWF0dGVyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcmxpc3RkZWNvbXByZXNzb3IuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5pMThuLnVDaGFyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2NoYXJsaXN0ZGVjb21wcmVzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvclRlc3QnXSwgWydnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcnBpY2tlcmRhdGEuanMnLCBbJ2dvb2cuaTE4bi5DaGFyUGlja2VyRGF0YSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uLmpzJywgWydnb29nLmkxOG4uY29sbGF0aW9uJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5jb2xsYXRpb25UZXN0J10sIFsnZ29vZy5pMThuLmNvbGxhdGlvbicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jb21wYWN0bnVtYmVyZm9ybWF0c3ltYm9scy5qcycsIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYW0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jeScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19odScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ub19OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9QVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poX1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29tcGFjdG51bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc0V4dCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZ3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FrX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9BRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9QUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9YQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc19JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JlbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jlel9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibV9NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWJ1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lZV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbF9HUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0ZKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0tOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01IJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01TJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01XJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05GJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1ZHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1dTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19BUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19CWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19DUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19HVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19OSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19TVicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldF9FRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZmJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX01SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZvX0ZPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0JJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dQJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01DJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01VJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1BGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ2QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3VfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYXdfVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHJfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hzYl9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pYScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19paScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWlfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXRfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamFfSlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19qbWMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2p2X0lEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYWJfRFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZGUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZWFfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ra2onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsX0dMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa21fS0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29fS1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXNfTVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXVhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tem4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmVfTlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfQlEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfU1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25tZ19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubmgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19udXNfU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX255bicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vcl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vc19SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0FPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X1RMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3F1X0VDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JtX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ybicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JvX01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb19STycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb2ZfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfS1onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfVUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcndrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2FoX1JVJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2JwJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZF9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZV9OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VoX01aJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9UZm5nX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NsX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc24nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fREonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3FfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3ZfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3dfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGFfTEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGhfVEgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGlfRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdG8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHJfVFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHdxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHptX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VrX1VBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmxfVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192YWlfVmFpaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192dW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193YWVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hvZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195b19CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnRfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dV9aQSddLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jdXJyZW5jeS5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5pMThuLmN1cnJlbmN5LkN1cnJlbmN5SW5mb1RpZXIyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3lfdGVzdC5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5VGVzdCddLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3ljb2RlbWFwLmpzJywgWydnb29nLmkxOG4uY3VycmVuY3lDb2RlTWFwJywgJ2dvb2cuaTE4bi5jdXJyZW5jeUNvZGVNYXBUaWVyMiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsZm9ybWF0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlLkRhdGVMaWtlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzVHlwZScsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0VGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFBhdHRlcm5zJywgJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbHBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsUGF0dGVybnMnXSwgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9scyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFscGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJuc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJucyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsc3ltYm9scy5qcycsIFsnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRlaW50ZXJ2YWxzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9sc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5Gb3JtYXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuX1hBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3N2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGVfSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvX1JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3YnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGFyc2UuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGF0ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhcnNlX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19heicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ibicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jaHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXNfNDE5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX01YJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaGF3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ttJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25iJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3J1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZ3FfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYW1fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXJfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0JIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0pPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX09NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1FBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1REJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1ROJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hc2FfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzdF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXpfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iYXNfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVfQlknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JlbV9aTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnX0JHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyeCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icnhfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ic19DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JzX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9BRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jY3AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NjcF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2ViX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZ2dfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2hyX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ja2JfSVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2tiX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2N5X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kYXZfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGplJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHlvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19keicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kel9CVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lbl8xNTAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRksnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1onLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVE8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW9fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0hOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0lDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1ZFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V3bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfSFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfV0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2Z1cl9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meV9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYV9JRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZF9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3N3X0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2dzd19MSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2X0lNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oZV9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oaV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9IUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1X0hVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5X0FNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZF9JRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZ19ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pc19JUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9TTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9WQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qZ28nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfamdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qbWNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FfR0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rYW0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FtX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rZGVfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2VhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19raHEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2hxX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trX0taJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ra2pfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tsbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa29rX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NmJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzZl9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NoX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xhZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sYWdfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGt0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xrdF9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sb19MQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19scmMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xyY19JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdF9MVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdV9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x1eScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdXlfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWFzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21hc19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21lcl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWZlX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21naCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZ2hfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ta19NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tcl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19CTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdF9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbXVhX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215X01NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tem5fSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmFxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9TSicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZF9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25kc19OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9BVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9DVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubmhfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnVzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ueW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnluX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX0dFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0FyYWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGxfUEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ1YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfU1QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfUEUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fUk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9mJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9CWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9NRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd19SVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcndrX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2FxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhcV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2JwX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX1NFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2VzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Nlc19NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZ19DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG5fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2lfTEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2tfU0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Ntbl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbl9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9BTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9MYXRuX01FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9BWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190Z19USicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190a19UTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190b19UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dF9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHdxX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3R6bScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWdfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZpX1ZOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc192dW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfd2FlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aF9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194b2cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195YXZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWlfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3l1ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196Z2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemdoX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFudF9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNUeXBlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jeScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhdycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hZl9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9PTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9UTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfTGF0bl9BWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JlX0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbF9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMTUwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0pFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0tJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0xDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01QJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VvXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19DTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19ETycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19JQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19WRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9CRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZvX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0dOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0hUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1JFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1dGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXJfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2FfSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2xfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1el9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYV9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGlfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oeV9BTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWRfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfVkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2p2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocV9NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ra19LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa29fS1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tva19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXNfQk4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXRfTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19teV9NTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251cycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bl9VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vc19HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BhX0FyYWJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsX1BMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0xVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1NUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3F1X0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ybicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JuX0JJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yb19STycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfS0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcndfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXFfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXNfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoaV9UZm5nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NrX1NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc29fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3FfTUsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX1hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9MYXRuX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3ZfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3dfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGdfVEonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGlfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGtfVE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHJfQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHRfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VnX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VyX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9MYXRuX1VaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192YWlfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192aV9WTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfd29fU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2X0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeXVlX0hhbnQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaF9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFuc19ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudF9UVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrLmpzJywgWydnb29nLmkxOG4uR3JhcGhlbWVCcmVhayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrVGVzdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9sb2NhbGVmZWF0dXJlLmpzJywgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZSddLCBbXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2xvY2FsZWZlYXR1cmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmVUZXN0J10sIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbWVzc2FnZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLk1lc3NhZ2VGb3JtYXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9scycsICdnb29nLmkxOG4ub3JkaW5hbFJ1bGVzJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9tZXNzYWdlZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0VGVzdCddLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lLmpzJywgWydnb29nLmkxOG4ubWltZScsICdnb29nLmkxOG4ubWltZS5lbmNvZGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaTE4bi51Q2hhciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5taW1lLmVuY29kZVRlc3QnXSwgWydnb29nLmkxOG4ubWltZS5lbmNvZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0LmpzJywgWydnb29nLmkxOG4uTnVtYmVyRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQuQ3VycmVuY3lTdHlsZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0LkZvcm1hdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5jdXJyZW5jeScsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRUZXN0J10sIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUdfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3VfbnVfbGF0bicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHMuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FtJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19heicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2N5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0FUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19NWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oYXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa24nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa28nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm9fTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfUFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190bCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREpfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1dfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT01fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0FfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TT191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1NfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfVE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWEInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUVfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzYV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc3QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXpfQ3lybF9BWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0xhdG5fQVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmFzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZW0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JleicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZXpfVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm1fTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icngnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnNfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfQUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfSVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2ViJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2dnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jeV9HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYXYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0RFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHNiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHVhX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R6X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpbF9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19GTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ESicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9IVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ORScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9UTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9XRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ZVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZnVyX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsX0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndXpfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGF3X1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hpX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hzYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oc2JfREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHlfQU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lkX0lEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpX0NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1ZBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2phX0pQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfam1jJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdl9JRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2FiX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYW1fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rZWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2VhX0NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19raHFfTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tfS1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tqJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbF9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2xuX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ttX0tIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rb2tfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzaF9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sYWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xrdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG9fTEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVfQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sdXknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21hcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21lcicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21mZV9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWtfTUsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX0JOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210X01UJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX211YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU1fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXpuX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25hcScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRfWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZHNfTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NlaF9NWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VzX01MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NoaScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZ19NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19za19TSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbF9TSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc21uX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX1NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX01LJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9DeXJsX01FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9YSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bl9SUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X1NFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0xLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdGVvX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnX1RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RoX1RIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrX1RNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX1RSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0X1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R3cScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdHptJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R6bV9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191Z19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191a19VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL29yZGluYWxydWxlcy5qcycsIFsnZ29vZy5pMThuLm9yZGluYWxSdWxlcyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3BsdXJhbHJ1bGVzLmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9wbHVyYWxydWxlc190ZXN0LmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXNUZXN0J10sIFsnZ29vZy5pMThuLnBsdXJhbFJ1bGVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVmb3JtYXQuanMnLCBbJ2dvb2cuaTE4bi5SZWxhdGl2ZURhdGVUaW1lRm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaTE4bi5Mb2NhbGVGZWF0dXJlJywgJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5yZWxhdGl2ZURhdGVUaW1lU3ltYm9scyddLCB7J2xhbmcnOiAnZXM1JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vcmVsYXRpdmVkYXRldGltZWZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9yZWxhdGl2ZWRhdGV0aW1lc3ltYm9sc2V4dC5qcycsIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0J10sIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJ10sIHsnbGFuZyc6ICdlczUnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi90aW1lem9uZS5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdGltZXpvbmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lVGVzdCddLCBbJ2dvb2cuaTE4bi5UaW1lWm9uZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci5qcycsIFsnZ29vZy5pMThuLnVDaGFyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlci5qcycsIFsnZ29vZy5pMThuLnVDaGFyLkxvY2FsTmFtZUZldGNoZXInXSwgWydnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5pMThuLnVDaGFyTmFtZXMnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlciddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvcmVtb3RlbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5SZW1vdGVOYW1lRmV0Y2hlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlVyaScsICdnb29nLmV2ZW50cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5pMThuLnVDaGFyLk5hbWVGZXRjaGVyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci9yZW1vdGVuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuUmVtb3RlTmFtZUZldGNoZXJUZXN0J10sIFsnZ29vZy5pMThuLnVDaGFyLlJlbW90ZU5hbWVGZXRjaGVyJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3VjaGFyX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi51Q2hhclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lcy5qcycsIFsnZ29vZy5pMThuLnVDaGFyTmFtZXMnXSwgWydnb29nLmkxOG4udUNoYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lc190ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXJOYW1lc1Rlc3QnXSwgWydnb29nLmkxOG4udUNoYXJOYW1lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczYuanMnLCBbJ2dvb2cuaXRlci5lczYnXSwgWydnb29nLml0ZXIuSXRlcmFibGUnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczZfdGVzdC5qcycsIFsnZ29vZy5pdGVyLmVzNlRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLmVzNicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyLmpzJywgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhYmxlJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubWF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyX3Rlc3QuanMnLCBbJ2dvb2cuaXRlclRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2h5YnJpZC5qcycsIFsnZ29vZy5qc29uLmh5YnJpZCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vaHlicmlkX3Rlc3QuanMnLCBbJ2dvb2cuanNvbi5oeWJyaWRUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb24uanMnLCBbJ2dvb2cuanNvbicsICdnb29nLmpzb24uUmVwbGFjZXInLCAnZ29vZy5qc29uLlJldml2ZXInLCAnZ29vZy5qc29uLlNlcmlhbGl6ZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9qc29uX3BlcmYuanMnLCBbJ2dvb2cuanNvblBlcmYnXSwgWydnb29nLmRvbScsICdnb29nLmpzb24nLCAnZ29vZy5tYXRoJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRhYmxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vanNvbl90ZXN0LmpzJywgWydnb29nLmpzb25UZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb25hYmxlLmpzJywgWydnb29nLmpzb24uSnNvbmFibGUnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9uYXRpdmVqc29ucHJvY2Vzc29yLmpzJywgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24uUHJvY2Vzc29yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL3Byb2Nlc3Nvci5qcycsIFsnZ29vZy5qc29uLlByb2Nlc3NvciddLCBbJ2dvb2cuc3RyaW5nLlBhcnNlcicsICdnb29nLnN0cmluZy5TdHJpbmdpZmllciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9wcm9jZXNzb3JfdGVzdC5qcycsIFsnZ29vZy5qc29uLnByb2Nlc3NvclRlc3QnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXMuanMnLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXNfdGVzdC5qcycsIFsnZ29vZy5sYWJzLml0ZXJhYmxlVGVzdCddLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2RvbS9wYWdldmlzaWJpbGl0eW1vbml0b3IuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlFdmVudCcsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5TW9uaXRvcicsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5U3RhdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS52ZW5kb3InLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWVtb2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9kb20vcGFnZXZpc2liaWxpdHltb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL25vbmRpc3Bvc2FibGVldmVudHRhcmdldC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyTWFwJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy9ub25kaXNwb3NhYmxlZXZlbnR0YXJnZXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXRUZXN0J10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9ldmVudHMvbm9uZGlzcG9zYWJsZWV2ZW50dGFyZ2V0X3ZpYV9nb29nZXZlbnRzX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5ldmVudHMuTm9uRGlzcG9zYWJsZUV2ZW50VGFyZ2V0R29vZ0V2ZW50c1Rlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL3RvdWNoLmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoJywgJ2dvb2cubGFicy5ldmVudHMudG91Y2guVG91Y2hEYXRhJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy90b3VjaF90ZXN0LmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoVGVzdCddLCBbJ2dvb2cubGFicy5ldmVudHMudG91Y2gnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdi5qcycsIFsnZ29vZy5sYWJzLmZvcm1hdC5jc3YnLCAnZ29vZy5sYWJzLmZvcm1hdC5jc3YuUGFyc2VFcnJvcicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5Ub2tlbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdl90ZXN0LmpzJywgWydnb29nLmxhYnMuZm9ybWF0LmNzdlRlc3QnXSwgWydnb29nLmxhYnMuZm9ybWF0LmNzdicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5QYXJzZUVycm9yJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdC5qcycsIFsnZ29vZy5sYWJzLmkxOG4uR2VuZGVySW5mbycsICdnb29nLmxhYnMuaTE4bi5HZW5kZXJJbmZvLkdlbmRlcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0VGVzdCddLCBbJ2dvb2cubGFicy5pMThuLkdlbmRlckluZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196dScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9pMThuL2xpc3RzeW1ib2xzLmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hbScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19heicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ibicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX01YJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcl9DQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2luJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2phJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ttJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21rJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25lJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X1BUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NoJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0JIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01SJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1FBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1REJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1hCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1lFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXN0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzdF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXpfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JhcycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iYXNfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JlbV9aTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmV6X1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JnX0JHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0NOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyX0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyeCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ic19DeXJsX0JBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9BRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9GUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2NwX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NnZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZ2dfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NrYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ja2JfSVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NzX0NaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2N5X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0dMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTEknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RqZV9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R1YScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kdWFfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R5b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19keicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maWxfUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fRk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfREonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfS00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUEYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfWVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meV9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZF9HQicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3N3X0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2X0lNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhd19VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oZV9JTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9IUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1X0hVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZ19ORycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paV9DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pc19JUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9TTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qYV9KUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qZ28nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ptYycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qbWNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanZfSUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FfR0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thYl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rYW0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tkZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rZGVfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tlYV9DVicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19raHEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2traicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ra2pfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xfR0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbV9LSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2JfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NmJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NoX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1X1RSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5X0tHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xhZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGdfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGt0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9BTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sb19MQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHJjX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdV9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x1eScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHZfTFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWFzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tYXNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZmUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWZlX01VJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nX01HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21naCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWdvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nb19DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taV9OWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ta19NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbl9NTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tcl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdWEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbXVhX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25hcV9OQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9OTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZF9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmRzX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25kc19OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9OUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX1NFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZWhfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2VzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZ19DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG5fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2lfTEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2xfU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbl9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19ESicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19TTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9BTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsX1JTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9MYXRuX01FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9BWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9TRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9MSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Rlb19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aF9USCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190b19UTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9UUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190d3EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHdxX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190em1fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWtfVUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbW9jay9tb2NrLmpzJywgWydnb29nLmxhYnMubW9jaycsICdnb29nLmxhYnMubW9jay5UaW1lb3V0RXJyb3InLCAnZ29vZy5sYWJzLm1vY2suVmVyaWZpY2F0aW9uRXJyb3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dCcsICdnb29nLmxhYnMubW9jay50aW1lb3V0LlRpbWVvdXRNb2RlJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uQmFzZVZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uLlZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svbW9ja190ZXN0LmpzJywgWydnb29nLmxhYnMubW9ja1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy5tb2NrJywgJ2dvb2cubGFicy5tb2NrLlRpbWVvdXRFcnJvcicsICdnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25FcnJvcicsICdnb29nLmxhYnMubW9jay50aW1lb3V0JywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdGltZW91dG1vZGUuanMnLCBbJ2dvb2cubGFicy5tb2NrLnRpbWVvdXQnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dC5UaW1lb3V0TW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZS5qcycsIFsnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbi5CYXNlVmVyaWZpY2F0aW9uTW9kZScsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uVmVyaWZpY2F0aW9uTW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZV90ZXN0LmpzJywgWydnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25Nb2RlVGVzdCddLCBbJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2UuanMnLCBbJ2dvb2cubGFicy5uZXQuaW1hZ2UnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC5pbWFnZVRlc3QnXSwgWydnb29nLmxhYnMubmV0LmltYWdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LldlYkNoYW5uZWwnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cubmV0LlhtbEh0dHBGYWN0b3J5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Jhc2V0ZXN0Y2hhbm5lbC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkJhc2VUZXN0Q2hhbm5lbCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuV2ViQ2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jaGFubmVsLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2NoYW5uZWxyZXF1ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXN5bmMuVGhyb3R0bGUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsRGVidWcnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmVudmlyb25tZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvY2hhbm5lbHJlcXVlc3RfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jb25uZWN0aW9uc3RhdGUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Vudmlyb25tZW50LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuZW52aXJvbm1lbnQnXSwgWydnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvZW52aXJvbm1lbnRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkVudmlyb25tZW50VGVzdCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5lbnZpcm9ubWVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9mb3J3YXJkY2hhbm5lbHJlcXVlc3Rwb29sLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuRm9yd2FyZENoYW5uZWxSZXF1ZXN0UG9vbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2ZvcndhcmRjaGFubmVscmVxdWVzdHBvb2xfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2xUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Gb3J3YXJkQ2hhbm5lbFJlcXVlc3RQb29sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL25ldHV0aWxzLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwubmV0VXRpbHMnXSwgWydnb29nLlVyaScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3JlcXVlc3RzdGF0cy5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzLkV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TdGF0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdEV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuVGltaW5nRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZS5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5CYXNlVGVzdENoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxEZWJ1ZycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQucnBjLkh0dHBDb3JzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZV90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGJhc2V0cmFuc3BvcnQuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmpzb24nLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxvZycsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LldlYkNoYW5uZWxUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcucGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZXRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUcmFuc3BvcnRUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbEJhc2UnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3dpcmUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4X3Rlc3QuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlVjhUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldpcmVWOCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQuV2ViQ2hhbm5lbFRyYW5zcG9ydCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWx0cmFuc3BvcnRmYWN0b3J5LmpzJywgWydnb29nLm5ldC5jcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHIuanMnLCBbJ2dvb2cubGFicy5uZXQueGhyJywgJ2dvb2cubGFicy5uZXQueGhyLkVycm9yJywgJ2dvb2cubGFicy5uZXQueGhyLkh0dHBFcnJvcicsICdnb29nLmxhYnMubmV0Lnhoci5PcHRpb25zJywgJ2dvb2cubGFicy5uZXQueGhyLlBvc3REYXRhJywgJ2dvb2cubGFicy5uZXQueGhyLlJlc3BvbnNlVHlwZScsICdnb29nLmxhYnMubmV0Lnhoci5UaW1lb3V0RXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC54aHJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxhYnMubmV0LnhocicsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3B1YnN1Yi9icm9hZGNhc3RwdWJzdWIuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cubWF0aCcsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9wdWJzdWIvYnJvYWRjYXN0cHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0b3JhZ2UvYm91bmRlZGNvbGxlY3RhYmxlc3RvcmFnZS5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdG9yYWdlL2JvdW5kZWRjb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLmxhYnMuc3RvcmFnZS5Cb3VuZGVkQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0cnVjdHMvbXVsdGltYXAuanMnLCBbJ2dvb2cubGFicy5zdHJ1Y3RzLk11bHRpbWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvc3RydWN0cy9tdWx0aW1hcF90ZXN0LmpzJywgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcFRlc3QnXSwgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdHlsZS9waXhlbGRlbnNpdHltb25pdG9yLmpzJywgWydnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvcicsICdnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvci5EZW5zaXR5JywgJ2dvb2cubGFicy5zdHlsZS5QaXhlbERlbnNpdHlNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0eWxlL3BpeGVsZGVuc2l0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXQuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdFRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyRXJyb3InLCAnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kZWNvcmF0b3JtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3RpbmcvZGVjb3JhdG9ybWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kZWNvcmF0b3JNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFueXRoaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cmllc01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cnlNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkhhc0tleU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzVmFsdWVNYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kaWN0aW9uYXJ5TWF0Y2hlclRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5IYXNFbnRyeU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnXSwgWydnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudF90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5lbnZpcm9ubWVudFRlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Vudmlyb25tZW50X3VzYWdlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLmVudmlyb25tZW50VXNhZ2VUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9qc29uX2Z1enppbmcuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2pzb25fZnV6emluZ190ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Kc29uRnV6emluZ1Rlc3QnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sYWJzLnRlc3RpbmcuSnNvbkZ1enppbmcnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXIuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5BbnlPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOb3RNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmxvZ2ljTWF0Y2hlcnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcubG9naWNNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9tYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlOdW1iZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNsb3NlVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkVxdWFsVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkdyZWF0ZXJUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkxlc3NUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLm51bWJlck1hdGNoZXJUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuQW55T2JqZWN0TWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5IYXNQcm9wZXJ0eU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSW5zdGFuY2VPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOdWxsTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5Jc051bGxPclVuZGVmaW5lZE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNVbmRlZmluZWRNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk9iamVjdEVxdWFsc01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5vYmplY3RNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5PYmplY3RFcXVhbHNNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9zdHJpbmdtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlTdHJpbmdNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNvbnRhaW5zU3RyaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5FbmRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxUb0lnbm9yaW5nV2hpdGVzcGFjZU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxzTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5SZWdleE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RhcnRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RyaW5nQ29udGFpbnNJbk9yZGVyTWF0Y2hlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvc3RyaW5nbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5zdHJpbmdNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5TdHJpbmdDb250YWluc0luT3JkZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2Jyb3dzZXIuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9icm93c2VyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmRldmljZSddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2VuZ2luZS5qcycsIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZW5naW5lX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2V4dHJhLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9leHRyYV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L3BsYXRmb3JtLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdGVzdF9hZ2VudHMuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC91dGlsLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWwnXSwgWydnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdXRpbF90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWxUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXIuanMnLCBbJ2dvb2cubGFicy51c2VyYWdlbnQudmVyaWZpZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9hZGVyL2Fic3RyYWN0bW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlci5DYWxsYmFja1R5cGUnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvYWRlci9hY3RpdmVtb2R1bGVtYW5hZ2VyLmpzJywgWydnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJpZXMuanMnLCBbJ2dvb2cubG9jYWxlLmNvdW50cmllcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJ5bGFuZ3VhZ2VuYW1lc190ZXN0LmpzJywgWydnb29nLmxvY2FsZS5jb3VudHJ5TGFuZ3VhZ2VOYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2RlZmF1bHRsb2NhbGVuYW1lY29uc3RhbnRzLmpzJywgWydnb29nLmxvY2FsZS5kZWZhdWx0TG9jYWxlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9nZW5lcmljZm9udG5hbWVzLmpzJywgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2dlbmVyaWNmb250bmFtZXNfdGVzdC5qcycsIFsnZ29vZy5sb2NhbGUuZ2VuZXJpY0ZvbnROYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvZ2VuZXJpY2ZvbnRuYW1lc2RhdGEuanMnLCBbJ2dvb2cubG9jYWxlLmdlbmVyaWNGb250TmFtZXNEYXRhJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2xvY2FsZS5qcycsIFsnZ29vZy5sb2NhbGUnXSwgWydnb29nLmxvY2FsZS5uYXRpdmVOYW1lQ29uc3RhbnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvbmF0aXZlbmFtZWNvbnN0YW50cy5qcycsIFsnZ29vZy5sb2NhbGUubmF0aXZlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9zY3JpcHRUb0xhbmd1YWdlcy5qcycsIFsnZ29vZy5sb2NhbGUuc2NyaXB0VG9MYW5ndWFnZXMnXSwgWydnb29nLmxvY2FsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZGV0ZWN0aW9uLmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbiddLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS90aW1lem9uZWRldGVjdGlvbl90ZXN0LmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvblRlc3QnXSwgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZmluZ2VycHJpbnQuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0LmpzJywgWydnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVBbGxMb25nTmFtZXMnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVTZWxlY3RlZExvbmdOYW1lcycsICdnb29nLmxvY2FsZS5nZXRUaW1lWm9uZVNlbGVjdGVkU2hvcnROYW1lcyddLCBbJ2dvb2cubG9jYWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lTGlzdFRlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvZy9sb2cuanMnLCBbJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubG9nLkxvZ1JlY29yZCcsICdnb29nLmxvZy5Mb2dnZXInXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9nL2xvZ190ZXN0LmpzJywgWydnb29nLmxvZ1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtLmpzJywgWydnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5BZmZpbmVUcmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkFmZmluZVRyYW5zZm9ybScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9iZXppZXIuanMnLCBbJ2dvb2cubWF0aC5CZXppZXInXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYmV6aWVyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5CZXppZXJUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5CZXppZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYm94LmpzJywgWydnb29nLm1hdGguQm94J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2JveF90ZXN0LmpzJywgWydnb29nLm1hdGguQm94VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZS5qcycsIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwgWydnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZTMuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlMyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2Nvb3JkaW5hdGUzX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZV90ZXN0LmpzJywgWydnb29nLm1hdGguQ29vcmRpbmF0ZVRlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9leHBvbmVudGlhbGJhY2tvZmYuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmYnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvZXhwb25lbnRpYWxiYWNrb2ZmX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmZUZXN0J10sIFsnZ29vZy5tYXRoLkV4cG9uZW50aWFsQmFja29mZicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyLmpzJywgWydnb29nLm1hdGguSW50ZWdlciddLCBbJ2dvb2cucmVmbGVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5JbnRlZ2VyVGVzdCddLCBbJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9pbnRlcnBvbGF0b3IxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5JbnRlcnBvbGF0b3IxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuTGluZWFyMVRlc3QnXSwgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3BjaGlwMS5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9wY2hpcDFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDFUZXN0J10sIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTEuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnLCAnZ29vZy5tYXRoLnRkbWEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxVGVzdCddLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pcmVjdC5qcycsIFsnZ29vZy5tYXRoLklSZWN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lLmpzJywgWydnb29nLm1hdGguTGluZSddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5MaW5lVGVzdCddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5MaW5lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2xvbmcuanMnLCBbJ2dvb2cubWF0aC5Mb25nJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucmVmbGVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbG9uZ190ZXN0LmpzJywgWydnb29nLm1hdGguTG9uZ1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoLkxvbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aC5qcycsIFsnZ29vZy5tYXRoJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aF90ZXN0LmpzJywgWydnb29nLm1hdGhUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL21hdHJpeC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9tYXRyaXhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeFRlc3QnXSwgWydnb29nLm1hdGguTWF0cml4JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGguanMnLCBbJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cubWF0aC5QYXRoLlNlZ21lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlBhdGhUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJywgJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhzLmpzJywgWydnb29nLm1hdGgucGF0aHMnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9wYXRoc190ZXN0LmpzJywgWydnb29nLm1hdGgucGF0aHNUZXN0J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLnBhdGhzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3JhbmdlLmpzJywgWydnb29nLm1hdGguUmFuZ2UnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlVGVzdCddLCBbJ2dvb2cubWF0aC5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yYW5nZXNldC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlU2V0J10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5tYXRoLlJhbmdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3Jhbmdlc2V0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SYW5nZVNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5tYXRoLlJhbmdlJywgJ2dvb2cubWF0aC5SYW5nZVNldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0LmpzJywgWydnb29nLm1hdGguUmVjdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5JUmVjdCcsICdnb29nLm1hdGguU2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SZWN0VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvc2l6ZS5qcycsIFsnZ29vZy5tYXRoLlNpemUnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9zaXplX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5TaXplVGVzdCddLCBbJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3RkbWEuanMnLCBbJ2dvb2cubWF0aC50ZG1hJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdGRtYV90ZXN0LmpzJywgWydnb29nLm1hdGgudGRtYVRlc3QnXSwgWydnb29nLm1hdGgudGRtYScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMyLmpzJywgWydnb29nLm1hdGguVmVjMiddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjMl90ZXN0LmpzJywgWydnb29nLm1hdGguVmVjMlRlc3QnXSwgWydnb29nLm1hdGguVmVjMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMzLmpzJywgWydnb29nLm1hdGguVmVjMyddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZTMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjM190ZXN0LmpzJywgWydnb29nLm1hdGguVmVjM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy5tYXRoLlZlYzMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZS5qcycsIFsnZ29vZy5tZW1vaXplJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZV90ZXN0LmpzJywgWydnb29nLm1lbW9pemVUZXN0J10sIFsnZ29vZy5tZW1vaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbFRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2J1ZmZlcmVkY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuQnVmZmVyZWRDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYnVmZmVyZWRjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkJ1ZmZlcmVkQ2hhbm5lbFRlc3QnXSwgWydnb29nLmRlYnVnLkNvbnNvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5CdWZmZXJlZENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmFzeW5jLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvZGVmZXJyZWRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5EZWZlcnJlZENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9kZWZlcnJlZGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJjbGllbnQuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkxvZ2dlckNsaWVudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2xvZ2dlcmNsaWVudF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnRUZXN0J10sIFsnZ29vZy5kZWJ1ZycsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbG9nZ2Vyc2VydmVyLmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJzZXJ2ZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTG9nZ2VyU2VydmVyVGVzdCddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL21lc3NhZ2luZy5qcycsIFsnZ29vZy5tZXNzYWdpbmcnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnaW5nX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsVGVzdCddLCBbJ2dvb2cubWVzc2FnaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLk11bHRpQ2hhbm5lbC5WaXJ0dWFsQ2hhbm5lbCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NZXNzYWdlQ2hhbm5lbCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWxUZXN0J10sIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNhbGxlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cubWVzc2FnaW5nLkRlZmVycmVkQ2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjYWxsZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuanNvbicsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWxUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRuZXR3b3JrX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnRPcGVyYXRvclRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcmVzcG9uZGluZ2NoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlJlc3BvbmRpbmdDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9yZXNwb25kaW5nY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5SZXNwb25kaW5nQ2hhbm5lbFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5tZXNzYWdpbmcuUmVzcG9uZGluZ0NoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRjaGFubmVsX3dvcmtlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcudGVzdGRhdGEucG9ydGNoYW5uZWxfd29ya2VyJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy90ZXN0ZGF0YS9wb3J0bmV0d29ya193b3JrZXIxLmpzJywgWydnb29nLm1lc3NhZ2luZy50ZXN0ZGF0YS5wb3J0bmV0d29ya193b3JrZXIxJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRuZXR3b3JrX3dvcmtlcjIuanMnLCBbJ2dvb2cubWVzc2FnaW5nLnRlc3RkYXRhLnBvcnRuZXR3b3JrX3dvcmtlcjInXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvYWJzdHJhY3Rtb2R1bGVsb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkFic3RyYWN0TW9kdWxlTG9hZGVyJ10sIFsnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL2Jhc2Vtb2R1bGUuanMnLCBbJ2dvb2cubW9kdWxlLkJhc2VNb2R1bGUnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tb2R1bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9sb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkxvYWRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLm1vZHVsZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL21vZHVsZS5qcycsIFsnZ29vZy5tb2R1bGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlaW5mby5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVpbmZvX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUluZm9UZXN0J10sIFsnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkY2FsbGJhY2suanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFjayddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cubW9kdWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGNhbGxiYWNrX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFja1Rlc3QnXSwgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGVyLmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVMb2FkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SWQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5uZXQuQnVsa0xvYWRlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTG9hZGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkNhbGxiYWNrVHlwZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLlRyYWNlJywgJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2VBbGwnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLmFjdGl2ZU1vZHVsZU1hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlcl90ZXN0LmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8xJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMi5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8yJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEJfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQl8xJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Jyb3dzZXJjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvcicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FdmVudCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5IYW5kbGVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLkxvZ1NhdmVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLlF1ZXVlZE1hcCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdGUnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuVGltaW5nRXZlbnQnXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5OYXRpdmVKc29uUHJvY2Vzc29yJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcmNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWxUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcnRlc3RjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvcicsICdnb29nLm5ldC50bXBuZXR3b3JrJywgJ2dvb2cuc3RyaW5nLlBhcnNlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2J1bGtsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXInXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuQnVsa0xvYWRlckhlbHBlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXJUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyaGVscGVyLmpzJywgWydnb29nLm5ldC5CdWxrTG9hZGVySGVscGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLm5ldC5DaGFubmVsRGVidWcnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbHJlcXVlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LkVycm9yJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NoYW5uZWxyZXF1ZXN0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsJywgJ2dvb2cubmV0LkNoYW5uZWxEZWJ1ZycsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY29va2llcy5qcycsIFsnZ29vZy5uZXQuQ29va2llcycsICdnb29nLm5ldC5jb29raWVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nvb2tpZXNfdGVzdC5qcycsIFsnZ29vZy5uZXQuY29va2llc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubmV0LkNvb2tpZXMnLCAnZ29vZy5uZXQuY29va2llcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInXSwgWydnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5Db3JzWG1sSHR0cEZhY3RvcnlUZXN0J10sIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9jcm9zc2RvbWFpbnJwYy5qcycsIFsnZ29vZy5uZXQuQ3Jvc3NEb21haW5ScGMnXSwgWydnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nyb3NzZG9tYWlucnBjX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNyb3NzRG9tYWluUnBjVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm5ldC5Dcm9zc0RvbWFpblJwYycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Vycm9yY29kZS5qcycsIFsnZ29vZy5uZXQuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5uZXQuRXZlbnRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZldGNoeG1saHR0cGZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmV0Y2h4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5VGVzdCddLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZpbGVkb3dubG9hZGVyLmpzJywgWydnb29nLm5ldC5GaWxlRG93bmxvYWRlcicsICdnb29nLm5ldC5GaWxlRG93bmxvYWRlci5FcnJvciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmZzJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmlsZWRvd25sb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuRmlsZURvd25sb2FkZXJUZXN0J10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRmlsZURvd25sb2FkZXInLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcubmV0LlhocklvUG9vbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2h0dHBzdGF0dXMuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaHR0cHN0YXR1c25hbWUuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXNOYW1lJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLm5ldC5JZnJhbWVJby5JbmNyZW1lbnRhbERhdGFFdmVudCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklmcmFtZUlvVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuSWZyYW1lTG9hZE1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5JZnJhbWVMb2FkTW9uaXRvclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkltYWdlTG9hZGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuSW1hZ2VMb2FkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5JbWFnZUxvYWRlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzLmpzJywgWydnb29nLm5ldC5JcEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NkFkZHJlc3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklwQWRkcmVzc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cubmV0LklwQWRkcmVzcycsICdnb29nLm5ldC5JcHY0QWRkcmVzcycsICdnb29nLm5ldC5JcHY2QWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzbG9hZGVyLmpzJywgWydnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvckNvZGUnLCAnZ29vZy5uZXQuanNsb2FkZXIuT3B0aW9ucyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuanNsb2FkZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy5uZXQuanNsb2FkZXIuRXJyb3JDb2RlJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNvbnAuanMnLCBbJ2dvb2cubmV0Lkpzb25wJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzb25wX3Rlc3QuanMnLCBbJ2dvb2cubmV0Lkpzb25wVGVzdCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuSnNvbnAnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5Nb2NrSUZyYW1lSW8nXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LklmcmFtZUlvJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5NdWx0aUlmcmFtZUxvYWRNb25pdG9yVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L25ldHdvcmtzdGF0dXNtb25pdG9yLmpzJywgWydnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9uZXR3b3JrdGVzdGVyLmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbmV0d29ya3Rlc3Rlcl90ZXN0LmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyVGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cubmV0Lk5ldHdvcmtUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3JwYy9odHRwY29ycy5qcycsIFsnZ29vZy5uZXQucnBjLkh0dHBDb3JzJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvcnBjL2h0dHBjb3JzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LnJwYy5IdHRwQ29yc1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLm5ldC5ycGMuSHR0cENvcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHBic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvYmFzZTY0cGJzdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRQYlN0cmVhbVBhcnNlclRlc3QnXSwgWydnb29nLmNyeXB0LmJhc2U2NCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9iYXNlNjRzdHJlYW1kZWNvZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFN0cmVhbURlY29kZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5iYXNlNjQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHN0cmVhbWRlY29kZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRTdHJlYW1EZWNvZGVyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvanNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlci5PcHRpb25zJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2pzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvbm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3BianNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYmpzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXJUZXN0J10sIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3Bic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYnN0cmVhbXBhcnNlcl90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuUGJTdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3N0cmVhbWZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuY3JlYXRlWGhyTm9kZVJlYWRhYmxlU3RyZWFtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyTm9kZVJlYWRhYmxlU3RyZWFtJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9zdHJlYW1wYXJzZXIuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvdXRpbHMuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgW10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhybm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuc3RyZWFtcy5Ob2RlUmVhZGFibGVTdHJlYW0nLCAnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3hocm5vZGVyZWFkYWJsZXN0cmVhbV90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbVRlc3QnXSwgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhyc3RyZWFtcmVhZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmxvZycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy94aHJzdHJlYW1yZWFkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXJUZXN0J10sIFsnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0MS5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdGVzdGRhdGEvanNsb2FkZXJfdGVzdDIuanMnLCBbJ2dvb2cubmV0LnRlc3RkYXRhLmpzbG9hZGVyX3Rlc3QyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3Rlc3RkYXRhL2pzbG9hZGVyX3Rlc3QzLmpzJywgWydnb29nLm5ldC50ZXN0ZGF0YS5qc2xvYWRlcl90ZXN0MyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0NC5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdG1wbmV0d29yay5qcycsIFsnZ29vZy5uZXQudG1wbmV0d29yayddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5uZXQuQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0LmpzJywgWydnb29nLm5ldC5XZWJTb2NrZXQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkVycm9yRXZlbnQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJTb2NrZXQuTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LldlYlNvY2tldFRlc3QnXSwgWydnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LldlYlNvY2tldCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3dyYXBwZXJ4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuV3JhcHBlclhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hocmlvLmpzJywgWydnb29nLm5ldC5YaHJJbycsICdnb29nLm5ldC5YaHJJby5SZXNwb25zZVR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLm5ldC5YaHJJb1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cubmV0LlhocklvUG9vbCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2xfdGVzdC5qcycsIFsnZ29vZy5uZXQuWGhySW9Qb29sVGVzdCddLCBbJ2dvb2cubmV0LlhocklvUG9vbCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveGhybGlrZS5qcycsIFsnZ29vZy5uZXQuWGhyTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyLmpzJywgWydnb29nLm5ldC5YaHJNYW5hZ2VyJywgJ2dvb2cubmV0Llhock1hbmFnZXIuRXZlbnQnLCAnZ29vZy5uZXQuWGhyTWFuYWdlci5SZXF1ZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubmV0Llhock1hbmFnZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cubmV0Llhock1hbmFnZXInLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJb1Bvb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveG1saHR0cC5qcycsIFsnZ29vZy5uZXQuRGVmYXVsdFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5uZXQuWG1sSHR0cC5PcHRpb25UeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZScsICdnb29nLm5ldC5YbWxIdHRwRGVmaW5lcyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgWydnb29nLm5ldC5YaHJMaWtlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ2hhbm5lbFN0YXRlcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcycsICdnb29nLm5ldC54cGMuVXJpQ2ZnRmllbGRzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxUZXN0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuVXJpJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxyb2xlLmpzJywgWydnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5DZmdGaWVsZHMnLCAnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxSb2xlJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnQnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuRGlyZWN0VHJhbnNwb3J0VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9pZnJhbWVwb2xsaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5SZWNlaXZlcicsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5TZW5kZXInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvaWZyYW1lcG9sbGluZ3RyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLklmcmFtZVBvbGxpbmdUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvbmF0aXZlbWVzc2FnaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9uYXRpdmVtZXNzYWdpbmd0cmFuc3BvcnRfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9yZWxheS5qcycsIFsnZ29vZy5uZXQueHBjLnJlbGF5J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvdHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuVHJhbnNwb3J0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy94cGMuanMnLCBbJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5DaGFubmVsU3RhdGVzJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcycsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5uZXQueHBjLlVyaUNmZ0ZpZWxkcyddLCBbJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0LmpzJywgWydnb29nLm9iamVjdCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0X3Rlc3QuanMnLCBbJ2dvb2cub2JqZWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9hYnNvbHV0ZXBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzdHJhY3RQb3NpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYWJzdHJhY3Rwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYW5jaG9yZWRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uJ10sIFsnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkcG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQm94JywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5jbGllbnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvbWVudWFuY2hvcmVkcG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9tZW51YW5jaG9yZWRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5NZW51QW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvcG9zaXRpb25pbmcuanMnLCBbJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3Bvc2l0aW9uaW5nX3Rlc3QuanMnLCBbJ2dvb2cucG9zaXRpb25pbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy92aWV3cG9ydGNsaWVudHBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0Y2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbiddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvbmF0aXZlcmVzb2x2ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlciddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL25hdGl2ZXJlc29sdmVyX3Rlc3QuanMnLCBbJ2dvb2cucHJvbWlzZS5uYXRpdmVSZXNvbHZlclRlc3QnXSwgWydnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvcHJvbWlzZS5qcycsIFsnZ29vZy5Qcm9taXNlJ10sIFsnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Byb21pc2VfdGVzdC5qcycsIFsnZ29vZy5Qcm9taXNlVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Jlc29sdmVyLmpzJywgWydnb29nLnByb21pc2UuUmVzb2x2ZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Rlc3RzdWl0ZWFkYXB0ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS50ZXN0U3VpdGVBZGFwdGVyJ10sIFsnZ29vZy5Qcm9taXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3RoZW5hYmxlLmpzJywgWydnb29nLlRoZW5hYmxlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkRlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTWV0YWRhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3JfdGVzdC5qcycsIFsnZ29vZy5wcm90bzIuRGVzY3JpcHRvclRlc3QnXSwgWydnb29nLnByb3RvMi5EZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9maWVsZGRlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2ZpZWxkZGVzY3JpcHRvcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3JUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9sYXp5ZGVzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5MYXp5RGVzZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL21lc3NhZ2UuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9tZXNzYWdlX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2VUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9vYmplY3RzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvb2JqZWN0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLk9iamVjdFNlcmlhbGl6ZXInLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGFja2FnZV90ZXN0LnBiLmpzJywgWydzb21lcHJvdG9wYWNrYWdlLlRlc3RQYWNrYWdlVHlwZXMnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90bzIuUGJMaXRlU2VyaWFsaXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTGF6eURlc2VyaWFsaXplcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5QYkxpdGVTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLlBiTGl0ZVNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3Byb3RvX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLm1lc3NhZ2VUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcycsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnLCAnc29tZXByb3RvcGFja2FnZS5UZXN0UGFja2FnZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3NlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXN0LnBiLmpzJywgWydwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCcsICdwcm90bzIuVGVzdERlZmF1bHRDaGlsZCcsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvdGV4dGZvcm1hdHNlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5NZXNzYWdlJywgJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXh0Zm9ybWF0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5UZXh0Rm9ybWF0U2VyaWFsaXplclRlc3QnXSwgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJywgJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi91dGlsLmpzJywgWydnb29nLnByb3RvMi5VdGlsJ10sIFsnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvcHVic3ViLmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1biddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3B1YnN1Yl90ZXN0LmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3RvcGljaWQuanMnLCBbJ2dvb2cucHVic3ViLlRvcGljSWQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvdHlwZWRwdWJzdWIuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cucHVic3ViLlB1YlN1YiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3R5cGVkcHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5wdWJzdWIuVG9waWNJZCcsICdnb29nLnB1YnN1Yi5UeXBlZFB1YlN1YicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0LmpzJywgWydnb29nLnJlZmxlY3QnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0X3Rlc3QuanMnLCBbJ2dvb2cucmVmbGVjdFRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9jaGFpbl90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jaGFpblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvY29tYmluZV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jb21iaW5lVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L2RlZmVycmVkYWRhcHRvci5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5SZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZWZlcnJlZGFkYXB0b3JfdGVzdC5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5yZXN1bHQnLCAnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJywgJ2dvb2cucmVzdWx0LlNpbXBsZVJlc3VsdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZXBlbmRlbnRyZXN1bHQuanMnLCBbJ2dvb2cucmVzdWx0LkRlcGVuZGVudFJlc3VsdCddLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3Jlc3VsdF9pbnRlcmZhY2UuanMnLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCBbJ2dvb2cuVGhlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsLmpzJywgWydnb29nLnJlc3VsdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5yZXN1bHQuRGVwZW5kZW50UmVzdWx0JywgJ2dvb2cucmVzdWx0LlJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsX3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0VGVzdCddLCBbJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvc2ltcGxlcmVzdWx0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy5yZXN1bHQuU2ltcGxlUmVzdWx0LlN0YXRlRXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3NpbXBsZXJlc3VsdF90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHRUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC50cmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC93YWl0X3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0LndhaXRUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9kYXRhLmpzJywgWydnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENzcycsICdnb29nLnNveS5kYXRhLlNhbml0aXplZEh0bWwnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRIdG1sQXR0cmlidXRlJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkSnMnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRUcnVzdGVkUmVzb3VyY2VVcmknLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRVcmknXSwgWydnb29nLlVyaScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnN0cmluZy5Db25zdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L2RhdGFfdGVzdC5qcycsIFsnZ29vZy5zb3kuZGF0YVRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zb3kudGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyLmpzJywgWydnb29nLnNveS5JbmplY3RlZERhdGFTdXBwbGllcicsICdnb29nLnNveS5SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLnNveScsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cuc295LlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnNveS5SZW5kZXJlcicsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzb3kvc295LmpzJywgWydnb29nLnNveSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3NveV90ZXN0LmpzJywgWydnb29nLnNveVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc295JywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9zb3lfdGVzdGhlbHBlci5qcycsIFsnZ29vZy5zb3kudGVzdEhlbHBlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ3NzJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkVHJ1c3RlZFJlc291cmNlVXJpJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3BlbGwvc3BlbGxjaGVjay5qcycsIFsnZ29vZy5zcGVsbC5TcGVsbENoZWNrJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjay5Xb3JkQ2hhbmdlZEV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzcGVsbC9zcGVsbGNoZWNrX3Rlc3QuanMnLCBbJ2dvb2cuc3BlbGwuU3BlbGxDaGVja1Rlc3QnXSwgWydnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0YXRzL2Jhc2ljc3RhdC5qcycsIFsnZ29vZy5zdGF0cy5CYXNpY1N0YXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RhdHMvYmFzaWNzdGF0X3Rlc3QuanMnLCBbJ2dvb2cuc3RhdHMuQmFzaWNTdGF0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5zdGF0cy5CYXNpY1N0YXQnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy5Qc2V1ZG9SYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvY29sbGVjdGFibGVzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXInLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuRXhwaXJpbmdTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9jb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkNvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2NvbGxlY3RhYmxlc3RvcmFnZXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLmNvbGxlY3RhYmxlU3RvcmFnZVRlc3RlciddLCBbJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuYmFzZTY0JywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uU2VyaWFsaXplcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkVuY3J5cHRlZFN0b3JhZ2VUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXJyb3Jjb2RlLmpzJywgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9leHBpcmluZ3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXhwaXJpbmdzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2Vycm9yY29kZS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9lcnJvcmhhbmRsaW5nbWVjaGFuaXNtLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vZXJyb3JoYW5kbGluZ21lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc21UZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckhhbmRsaW5nTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXNlc3Npb25zdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVzZXNzaW9uc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVNlc3Npb25TdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVXZWJTdG9yYWdlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2lldXNlcmRhdGEuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pZXVzZXJkYXRhX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TZXBhcmF0aW9uVGVzdGVyJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2hhcmluZ1Rlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pdGVyYWJsZW1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaXRlcmFibGVtZWNoYW5pc210ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uaXRlcmFibGVNZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5NZWNoYW5pc20nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21mYWN0b3J5LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnknXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVTZXNzaW9uU3RvcmFnZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vbWVjaGFuaXNtZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnlUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21mYWN0b3J5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zZXBhcmF0aW9udGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zaGFyaW5ndGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc210ZXN0ZGVmaW5pdGlvbi5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLlByZWZpeGVkTWVjaGFuaXNtVGVzdCddLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TaGFyaW5nVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlLldyYXBwZXInXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2Uvc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2Uuc3RvcmFnZV90ZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2V0ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5zdG9yYWdlVGVzdGVyJ10sIFsnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9kZWZpbmVzLmpzJywgWydnb29nLnN0cmVhbXMuZGVmaW5lcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsJ10sIFsnZ29vZy5zdHJlYW1zLmRlZmluZXMnLCAnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCcsICdnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsSW1wbCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy5zdHJlYW1zLmZ1bGxUeXBlcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfaW1wbF90ZXN0LmpzJywgWydnb29nLnN0cmVhbXMuZnVsbEltcGxUZXN0J10sIFsnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsVGVzdENhc2VzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfbmF0aXZlX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMuZnVsbE5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmZ1bGxUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvZnVsbF90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJ10sIHsnbGFuZyc6ICdlczknLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX3R5cGVzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZS5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGUnXSwgWydnb29nLnN0cmVhbXMuZGVmaW5lcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJywgJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2xpdGVfaW1wbC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlcicsICdnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX2ltcGxfdGVzdC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsVGVzdCddLCBbJ2dvb2cuc3RyZWFtcy5saXRlSW1wbCcsICdnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnXSwgWydnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5saXRlTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90eXBlcy5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3QuanMnLCBbJ2dvb2cuc3RyaW5nLkNvbnN0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3RfdGVzdC5qcycsIFsnZ29vZy5zdHJpbmcuY29uc3RUZXN0J10sIFsnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9pbnRlcm5hbC5qcycsIFsnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL2xpbmtpZnkuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnknXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9saW5raWZ5X3Rlc3QuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5saW5raWZ5JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lcy5qcycsIFsnZ29vZy5zdHJpbmcubmV3bGluZXMnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMuTGluZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lc190ZXN0LmpzJywgWydnb29nLnN0cmluZy5uZXdsaW5lc1Rlc3QnXSwgWydnb29nLnN0cmluZy5uZXdsaW5lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhcnNlci5qcycsIFsnZ29vZy5zdHJpbmcuUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhdGguanMnLCBbJ2dvb2cuc3RyaW5nLnBhdGgnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvcGF0aF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5wYXRoVGVzdCddLCBbJ2dvb2cuc3RyaW5nLnBhdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9zdHJpbmcuanMnLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnXSwgWydnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ190ZXN0LmpzJywgWydnb29nLnN0cmluZ1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nYnVmZmVyLmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2J1ZmZlcl90ZXN0LmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXJUZXN0J10sIFsnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nZm9ybWF0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXQnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2Zvcm1hdF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXRUZXN0J10sIFsnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5naWZpZXIuanMnLCBbJ2dvb2cuc3RyaW5nLlN0cmluZ2lmaWVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3R5cGVkc3RyaW5nLmpzJywgWydnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvYXZsdHJlZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2F2bHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jaXJjdWxhcmJ1ZmZlci5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY2lyY3VsYXJidWZmZXJfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jb2xsZWN0aW9uLmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY29sbGVjdGlvbl90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvblRlc3QnXSwgWydnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2hlYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMuTm9kZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9oZWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuSGVhcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5JbnZlcnNpb25NYXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXBfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcFRlc3QnXSwgWydnb29nLnN0cnVjdHMuSW52ZXJzaW9uTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2xpbmtlZG1hcC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbGlua2VkbWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5MaW5rZWRNYXBUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbWFwLmpzJywgWydnb29nLnN0cnVjdHMuTWFwJ10sIFsnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL21hcF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuTWFwVGVzdCddLCBbJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9ub2RlLmpzJywgWydnb29nLnN0cnVjdHMuTm9kZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5zdHJ1Y3RzLlF1ZXVlJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUG9vbFRlc3QnXSwgWydnb29nLnN0cnVjdHMuUG9vbCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UG9vbCddLCBbJ2dvb2cuc3RydWN0cy5Qb29sJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlQb29sVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9wcmlvcml0eXF1ZXVlLmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlRdWV1ZSddLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UXVldWVUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3F1YWR0cmVlLmpzJywgWydnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLk5vZGUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLlBvaW50J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVhZHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWUuanMnLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1ZXVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXQuanMnLCBbJ2dvb2cuc3RydWN0cy5TZXQnXSwgWydnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc2ltcGxlcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RyaW5nc2V0LmpzJywgWydnb29nLnN0cnVjdHMuU3RyaW5nU2V0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zdHJpbmdzZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlN0cmluZ1NldFRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMuU3RyaW5nU2V0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3N0cnVjdHMuanMnLCBbJ2dvb2cuc3RydWN0cyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RydWN0c190ZXN0LmpzJywgWydnb29nLnN0cnVjdHNUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJlZW5vZGUuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RydWN0cy5Ob2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3RyZWVub2RlX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZVRlc3QnXSwgWydnb29nLnN0cnVjdHMuVHJlZU5vZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZV90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuVHJpZVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2JpZGkuanMnLCBbJ2dvb2cuc3R5bGUuYmlkaSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvYmlkaV90ZXN0LmpzJywgWydnb29nLnN0eWxlLmJpZGlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2N1cnNvci5qcycsIFsnZ29vZy5zdHlsZS5jdXJzb3InXSwgWydnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvY3Vyc29yX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuY3Vyc29yVGVzdCddLCBbJ2dvb2cuc3R5bGUuY3Vyc29yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZS5qcycsIFsnZ29vZy5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udmVuZG9yJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnN0eWxlX3Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbC5Vc2VyQWdlbnRzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfd2Via2l0X3Njcm9sbGJhcnNfdGVzdC5qcycsIFsnZ29vZy5zdHlsZS53ZWJraXRTY3JvbGxiYXJzVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGVTY3JvbGxiYXJUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3N0eWxlc2Nyb2xsYmFydGVzdGVyLmpzJywgWydnb29nLnN0eWxlU2Nyb2xsYmFyVGVzdGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS90cmFuc2Zvcm0uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNmb3JtJ10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zZm9ybVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy5zdHlsZS50cmFuc2Zvcm0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zaXRpb24uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNpdGlvbicsICdnb29nLnN0eWxlLnRyYW5zaXRpb24uQ3NzM1Byb3BlcnR5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zaXRpb25UZXN0J10sIFsnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RfbW9kdWxlLmpzJywgWydnb29nLnRlc3RfbW9kdWxlJ10sIFsnZ29vZy50ZXN0X21vZHVsZV9kZXAnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0X21vZHVsZV9kZXAuanMnLCBbJ2dvb2cudGVzdF9tb2R1bGVfZGVwJ10sIFtdLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0aW9uZmFpbHVyZS5qcycsIFsnZ29vZy50ZXN0aW5nLnNhZmUuYXNzZXJ0aW9uRmFpbHVyZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Fzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRvbScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sLmpzJywgWydnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbFRlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UuQ29udHJvbEJyZWFraW5nRXhjZXB0aW9uJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9hc3luY3Rlc3RjYXNlX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlQXN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jdGVzdGNhc2Vfbm9hc3luY190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVRlc3QnXSwgWydnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2JlbmNobWFyay5qcycsIFsnZ29vZy50ZXN0aW5nLmJlbmNobWFyayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2NvbnRpbnVhdGlvbnRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuQ29udGludWF0aW9uVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLkNvbnRpbnVhdGlvblRlc3QnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLlN0ZXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvY29udGludWF0aW9udGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Db250aW51YXRpb25UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kZWZlcnJlZHRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RlZmVycmVkdGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkRlZmVycmVkVGVzdENhc2VUZXN0J10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLk5vZGVJdGVyYXRvcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLml0ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nXSwgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvZG9tX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuZG9tVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2ZpZWxkbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL3Rlc3RoZWxwZXIuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy50ZXN0aW5nLmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvdGVzdGhlbHBlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50cy5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50c190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL21hdGNoZXJzLmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2V2ZW50cy9tYXRjaGVyc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL29ubGluZWhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0Lk5ldHdvcmtTdGF0dXNNb25pdG9yJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnRPYnNlcnZlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlcy5qcycsIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlc1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2Jsb2IuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LmJhc2U2NCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9ibG9iX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2RpcmVjdG9yeWVudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9lbnRyeS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cudGVzdGluZy5mcy5FbnRyeScsICdnb29nLnRlc3RpbmcuZnMuRmlsZUVudHJ5J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeUltcGwnLCAnZ29vZy5mcy5FbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZUVudHJ5JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2VudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5FbnRyeVRlc3QnXSwgWydnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGUnXSwgWydnb29nLnRlc3RpbmcuZnMuQmxvYiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxlZW50cnlfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVFbnRyeVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlRW50cnknLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZXJlYWRlci5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVyZWFkZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVzeXN0ZW0uanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJ10sIFsnZ29vZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyLmpzJywgWydnb29nLnRlc3RpbmcuZnMuRmlsZVdyaXRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcuZnMuRmlsZScsICdnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlU2F2ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnMuanMnLCBbJ2dvb2cudGVzdGluZy5mcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzVGVzdCddLCBbJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9pbnRlZ3JhdGlvbl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZnMuaW50ZWdyYXRpb25UZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVNhdmVyJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9wcm9ncmVzc2V2ZW50LmpzJywgWydnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Z1bmN0aW9ubW9jay5qcycsIFsnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2snLCAnZ29vZy50ZXN0aW5nLkdsb2JhbEZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTWV0aG9kTW9jayddLCBbJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnVuY3Rpb25tb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2dyYXBoaWNzLmpzJywgWydnb29nLnRlc3RpbmcuZ3JhcGhpY3MnXSwgWydnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzLmpzJywgWydnb29nLnRlc3RpbmcuaTE4bi5hc3NlcnRzJ10sIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5pMThuLmFzc2VydHNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmkxOG4uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkYXN5bmN3cmFwcGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZEFzeW5jV3JhcHBlciddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkdGVzdGNhc2VhZGFwdGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZFRlc3RDYXNlQWRhcHRlciddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Kc1RkQXN5bmNXcmFwcGVyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdC5qcycsIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdGV4Y2VwdGlvbi5qcycsIFsnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbiddLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2xvb3NlbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLkxvb3NlRXhwZWN0YXRpb25Db2xsZWN0aW9uJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbG9vc2Vtb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Mb29zZU1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJ10sIFsnZ29vZy5tZXNzYWdpbmcuQWJzdHJhY3RDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tZXNzYWdpbmcvbW9ja21lc3NhZ2VldmVudC5qcycsIFsnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZXBvcnQuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja1BvcnROZXR3b3JrJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydE5ldHdvcmsnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tFeHBlY3RhdGlvbiddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnByb21pc2UuUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZScsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Nb2NrRXhwZWN0YXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NsYXNzZmFjdG9yeS5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc1JlY29yZCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xhc3NmYWN0b3J5X3Rlc3QuanMnLCBbJ2Zha2UuQmFzZUNsYXNzJywgJ2Zha2UuQ2hpbGRDbGFzcycsICdnb29nLnRlc3RpbmcuTW9ja0NsYXNzRmFjdG9yeVRlc3QnXSwgWydnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2Nsb2NrLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xvY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbG9ja1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY29udHJvbC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NraW50ZXJmYWNlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZSddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrbWF0Y2hlcnMuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5JZ25vcmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkluc3RhbmNlT2YnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5PYmplY3RFcXVhbHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5SZWdleHBNYXRjaCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlNhdmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlR5cGVPZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja21hdGNoZXJzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb20uanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb21UZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3JhbmdlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlJ10sIFsnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5nZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2UuanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZSddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tTdG9yYWdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrdXNlcmFnZW50LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3VzZXJhZ2VudF90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbXVsdGl0ZXN0cnVubmVyLmpzJywgWydnb29nLnRlc3RpbmcuTXVsdGlUZXN0UnVubmVyJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXIuVGVzdEZyYW1lJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tdWx0aXRlc3RydW5uZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLnRlc3RpbmcubmV0Lk1vY2tJRnJhbWVJbyddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSWZyYW1lSW8nLCAnZ29vZy50ZXN0aW5nLlRlc3RRdWV1ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQveGhyaW8uanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuVGVzdFF1ZXVlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcubmV0LlhocklvVGVzdCddLCBbJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuSW5zdGFuY2VPZicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW9Qb29sJ10sIFsnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvb2JqZWN0cHJvcGVydHlzdHJpbmcuanMnLCBbJ2dvb2cudGVzdGluZy5PYmplY3RQcm9wZXJ0eVN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlLmpzJywgWydnb29nLnRlc3RpbmcucGFyYWxsZWxDbG9zdXJlVGVzdFN1aXRlJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cycsICdnb29nLmpzb24nLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wYXJhbGxlbENsb3N1cmVUZXN0U3VpdGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnBhcmFsbGVsQ2xvc3VyZVRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRhYmxlLmpzJywgWydnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BlcmZvcm1hbmNldGltZXIuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyLlRhc2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tYXRoJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRpbWVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlci5qcycsIFsnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvdG8yL3Byb3RvMi5qcycsIFsnZ29vZy50ZXN0aW5nLnByb3RvMiddLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuT2JqZWN0U2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wcm90bzIvcHJvdG8yX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wcm90bzJUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnByb3RvMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BzZXVkb3JhbmRvbS5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCBbJ2dvb2cuRGlzcG9zYWJsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wc2V1ZG9yYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbVRlc3QnXSwgWydnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uLmpzJywgWydnb29nLnRlc3RpbmcuRnVuY3Rpb25DYWxsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRDb25zdHJ1Y3RvcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvblRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkQ29uc3RydWN0b3InLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3NoYXJkaW5ndGVzdGNhc2UuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaGFyZGluZ3Rlc3RjYXNlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b24uanMnLCBbJ2dvb2cudGVzdGluZy5zaW5nbGV0b24nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b25fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnNpbmdsZXRvblRlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc2luZ2xldG9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0YWNrdHJhY2UuanMnLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJywgJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlLkZyYW1lJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RhY2t0cmFjZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZVRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZScsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZS5GcmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdG9yYWdlL2Zha2VtZWNoYW5pc20uanMnLCBbJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RyaWN0bW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5Nb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0cmljdG1vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3R5bGUvbGF5b3V0YXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlLmxheW91dGFzc2VydHMnXSwgWydnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9sYXlvdXRhc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5zdHlsZS5sYXlvdXRhc3NlcnRzVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3Rpbmcuc3R5bGUubGF5b3V0YXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZS5FcnJvcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuT3JkZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlLlJlc3VsdCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdENhc2VUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy5NZXRob2RNb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0cXVldWUuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RydW5uZXIuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuanNvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHJ1bm5lcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHN1aXRlLmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RzdWl0ZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHMuanMnLCBbJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnJlbmRlcmVyYXNzZXJ0c1Rlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3JlbmRlcmVyaGFybmVzcy5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3N0eWxlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy51aS5zdHlsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3RpbWVyL3RpbWVyLmpzJywgWydnb29nLlRpbWVyJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0aW1lci90aW1lcl90ZXN0LmpzJywgWydnb29nLlRpbWVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXMuanMnLCBbJ2dvb2cudHdlYWsuQmFzZUVudHJ5JywgJ2dvb2cudHdlYWsuQmFzZVByaW1pdGl2ZVNldHRpbmcnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXNfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5CYXNlRW50cnlUZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2Vhay50ZXN0aGVscGVycyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5LmpzJywgWydnb29nLnR3ZWFrLlJlZ2lzdHJ5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50d2Vhay5CYXNlUHJpbWl0aXZlU2V0dGluZycsICdnb29nLnR3ZWFrLkJhc2VTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cudHdlYWsuUmVnaXN0cnlUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdGVzdGhlbHBlcnMuanMnLCBbJ2dvb2cudHdlYWsudGVzdGhlbHBlcnMnXSwgWydnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuQm9vbGVhbkdyb3VwJywgJ2dvb2cudHdlYWsuQm9vbGVhbkluR3JvdXBTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5CdXR0b25BY3Rpb24nLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlJlZ2lzdHJ5JywgJ2dvb2cudHdlYWsuU3RyaW5nU2V0dGluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdHdlYWsuanMnLCBbJ2dvb2cudHdlYWsnLCAnZ29vZy50d2Vhay5Db25maWdQYXJhbXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5SZWdpc3RyeScsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWkuanMnLCBbJ2dvb2cudHdlYWsuRW50cmllc1BhbmVsJywgJ2dvb2cudHdlYWsuVHdlYWtVaSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLkJhc2VFbnRyeScsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWlfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5Ud2Vha1VpVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuVHdlYWtVaScsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWJzdHJhY3RzcGVsbGNoZWNrZXIuanMnLCBbJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlci5Bc3luY1Jlc3VsdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FjLmpzJywgWydnb29nLnVpLmFjJ10sIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5JbnB1dEhhbmRsZXInLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYWNfdGVzdC5qcycsIFsnZ29vZy51aS5hY1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNlbGVjdGlvbicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FycmF5bWF0Y2hlci5qcycsIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9hdXRvY29tcGxldGUuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlJywgJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXV0b2NvbXBsZXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbmRlck9wdGlvbnMnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2NhY2hpbmdtYXRjaGVyLmpzJywgWydnb29nLnVpLmFjLkNhY2hpbmdNYXRjaGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyJywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvY2FjaGluZ21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy51aS5hYy5DYWNoaW5nTWF0Y2hlclRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuQ2FjaGluZ01hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9pbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLnVpLmFjLklucHV0SGFuZGxlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2VsZWN0aW9uJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbW90ZS5qcycsIFsnZ29vZy51aS5hYy5SZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbW90ZUFycmF5TWF0Y2hlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvcmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5SZW1vdGVBcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW5kZXJlci5qcycsIFsnZ29vZy51aS5hYy5SZW5kZXJlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyLkN1c3RvbVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguZG9tLkZhZGVJbkFuZFNob3cnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5kb20uRmFkZUluQW5kU2hvdycsICdnb29nLmZ4LmRvbS5GYWRlT3V0QW5kSGlkZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcm9wdGlvbnMuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hpbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlciddLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlLmpzJywgWydnb29nLnVpLmFjLlJpY2hSZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLlJlbW90ZScsICdnb29nLnVpLmFjLlJlbmRlcmVyJywgJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJpY2hSZW1vdGVBcnJheU1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hyZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlclRlc3QnXSwgWydnb29nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjdGl2aXR5bW9uaXRvci5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FkdmFuY2VkdG9vbHRpcC5qcycsIFsnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWR2YW5jZWR0b29sdGlwX3Rlc3QuanMnLCBbJ2dvb2cudWkuQWR2YW5jZWRUb29sdGlwVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFkdmFuY2VkVG9vbHRpcCcsICdnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5LmpzJywgWydnb29nLnVpLkFuaW1hdGVkWmlwcHknXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZWFzaW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuQW5pbWF0ZWRaaXBweVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFuaW1hdGVkWmlwcHknLCAnZ29vZy51aS5aaXBweSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2F0dGFjaGFibGVtZW51LmpzJywgWydnb29nLnVpLkF0dGFjaGFibGVNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JdGVtRXZlbnQnLCAnZ29vZy51aS5NZW51QmFzZScsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0LmpzJywgWydnb29nLnVpLkJpZGlJbnB1dCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0X3Rlc3QuanMnLCBbJ2dvb2cudWkuQmlkaUlucHV0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5CaWRpSW5wdXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idWJibGUuanMnLCBbJ2dvb2cudWkuQnViYmxlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzb2x1dGVQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b24uanMnLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uLlNpZGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25fdGVzdC5qcycsIFsnZ29vZy51aS5CdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk5hdGl2ZUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2J1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25zaWRlLmpzJywgWydnb29nLnVpLkJ1dHRvblNpZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jaGFyY291bnRlci5qcycsIFsnZ29vZy51aS5DaGFyQ291bnRlcicsICdnb29nLnVpLkNoYXJDb3VudGVyLkRpc3BsYXknXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJjb3VudGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hhckNvdW50ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNoYXJDb3VudGVyJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hhcnBpY2tlci5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5zdHJ1Y3RzLlNldCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInLCAnZ29vZy51aS5GbGF0QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Ib3ZlckNhcmQnLCAnZ29vZy51aS5MYWJlbElucHV0JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRvb2x0aXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGFyUGlja2VyJywgJ2dvb2cudWkuRmxhdEJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3guanMnLCBbJ2dvb2cudWkuQ2hlY2tib3gnLCAnZ29vZy51aS5DaGVja2JveC5TdGF0ZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hlY2tib3hUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGVja2JveCcsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51aS5kZWNvcmF0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94bWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuQ2hlY2tCb3hNZW51SXRlbSddLCBbJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3hyZW5kZXJlci5qcycsIFsnZ29vZy51aS5DaGVja2JveFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JNZW51QnV0dG9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuUmVuZGVyZXJIYXJuZXNzJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b24nLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ycGFsZXR0ZS5qcycsIFsnZ29vZy51aS5Db2xvclBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuUGFsZXR0ZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29sb3JQYWxldHRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuQ29sb3JQaWNrZXInLCAnZ29vZy51aS5Db2xvclBpY2tlci5FdmVudFR5cGUnXSwgWydnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tYm9ib3guanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3gnLCAnZ29vZy51aS5Db21ib0JveEl0ZW0nXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubG9nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkl0ZW1FdmVudCcsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbWJvYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3hUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21ib0JveCcsICdnb29nLnVpLkNvbWJvQm94SXRlbScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnQuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50LkVycm9yJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tcG9uZW50X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnR1dGlsLmpzJywgWydnb29nLnVpLkNvbXBvbmVudFV0aWwnXSwgWydnb29nLmV2ZW50cy5Nb3VzZUFzTW91c2VFdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VFdmVudHMnLCAnZ29vZy5ldmVudHMuUG9pbnRlckFzTW91c2VFdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbXBvbmVudHV0aWxfdGVzdC5qcycsIFsnZ29vZy51aS5Db21wb25lbnRVdGlsVGVzdCddLCBbJ2dvb2cuZXZlbnRzLk1vdXNlQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRhaW5lci5qcycsIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Db250YWluZXIuRXZlbnRUeXBlJywgJ2dvb2cudWkuQ29udGFpbmVyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db21wb25lbnRVdGlsJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51aS5Db250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUV2ZW50JywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRyb2wnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udGFpbmVycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJTY3JvbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRhaW5lclNjcm9sbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9sLmpzJywgWydnb29nLnVpLkNvbnRyb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2xDb250ZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS5Db250cm9sVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udHJvbGNvbnRlbnQuanMnLCBbJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9scmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRyb2xSZW5kZXJlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb29raWVlZGl0b3IuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LmNvb2tpZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29va2llZWRpdG9yX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5jb29raWVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvb2tpZUVkaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NzczNidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3NzM21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Nzc25hbWVzLmpzJywgWydnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b24uanMnLCBbJ2dvb2cudWkuQ3VzdG9tQnV0dG9uJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21jb2xvcnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlJ10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3VzdG9tY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DdXN0b21Db2xvclBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyLmpzJywgWydnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5EYXRlUGlja2VyLkV2ZW50cycsICdnb29nLnVpLkRhdGVQaWNrZXJFdmVudCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuRGVmYXVsdERhdGVQaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLklkR2VuZXJhdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuRGF0ZVBpY2tlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSEsnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGF0ZVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RhdGVwaWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EYXRlUGlja2VyUmVuZGVyZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWNvcmF0ZS5qcycsIFsnZ29vZy51aS5kZWNvcmF0ZSddLCBbJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RlY29yYXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZGVjb3JhdGVUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmRlY29yYXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWZhdWx0ZGF0ZXBpY2tlcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkRlZmF1bHREYXRlUGlja2VyUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuRGF0ZVBpY2tlclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2cuanMnLCBbJ2dvb2cudWkuRGlhbG9nJywgJ2dvb2cudWkuRGlhbG9nLkJ1dHRvblNldCcsICdnb29nLnVpLkRpYWxvZy5CdXR0b25TZXQuRGVmYXVsdEJ1dHRvbnMnLCAnZ29vZy51aS5EaWFsb2cuRGVmYXVsdEJ1dHRvbkNhcHRpb25zJywgJ2dvb2cudWkuRGlhbG9nLkRlZmF1bHRCdXR0b25LZXlzJywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50JywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50VHlwZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Nb2RhbFBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2dfdGVzdC5qcycsIFsnZ29vZy51aS5EaWFsb2dUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5jc3MzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RpbWVuc2lvbnBpY2tlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXInXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLkFubm91bmNlcicsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkRpbWVuc2lvblBpY2tlclJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmFycmF5JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kcmFnZHJvcGRldGVjdG9yLmpzJywgWydnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3InLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkV2ZW50VHlwZScsICdnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3IuSW1hZ2VEcm9wRXZlbnQnLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkxpbmtEcm9wRXZlbnQnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RyaWxsZG93bnJvdy5qcycsIFsnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZHJpbGxkb3ducm93X3Rlc3QuanMnLCBbJ2dvb2cudWkuRHJpbGxkb3duUm93VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYWJzdHJhY3RkaWFsb2cuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nLkJ1aWxkZXInLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cuRXZlbnRUeXBlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cmluZycsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL2Fic3RyYWN0ZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9idWJibGUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm9iamVjdCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvd1N0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYnViYmxlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9kZWZhdWx0dG9vbGJhci5qcycsIFsnZ29vZy51aS5lZGl0b3IuQnV0dG9uRGVzY3JpcHRvcicsICdnb29nLnVpLmVkaXRvci5EZWZhdWx0VG9vbGJhciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nLmpzJywgWydnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cuQmVmb3JlVGVzdExpbmtFdmVudCcsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLkV2ZW50VHlwZScsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLk9rRXZlbnQnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTGlua0J1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2dUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLm1lc3NhZ2VzJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL21lc3NhZ2VzLmpzJywgWydnb29nLnVpLmVkaXRvci5tZXNzYWdlcyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyY29udHJvbGxlci5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckNvbnRyb2xsZXInXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyZmFjdG9yeS5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuT3B0aW9uJywgJ2dvb2cudWkuVG9vbGJhcicsICdnb29nLnVpLlRvb2xiYXJCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyQ29sb3JNZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInLCAnZ29vZy51aS5Ub29sYmFyU2VsZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvdG9vbGJhcmZhY3RvcnlfdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Vtb2ppcGFsZXR0ZS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSW1hZ2VMb2FkZXInLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuZW1vamkuRW1vamknLCAnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuRW1vamlQYWxldHRlUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLmVtb2ppLkVtb2ppJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaXBpY2tlci5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYlBhbmUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJywgJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Zhc3Rfbm9ucHJvZ3Jlc3NpdmVfZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5GYXN0Tm9uUHJvZ3Jlc3NpdmVFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudWkuZW1vamkuRW1vamlQaWNrZXInLCAnZ29vZy51aS5lbW9qaS5TcHJpdGVJbmZvJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZmFzdF9wcm9ncmVzc2l2ZV9lbW9qaXBpY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLkZhc3RQcm9ncmVzc2l2ZUVtb2ppUGlja2VyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3BvcHVwZW1vamlwaWNrZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9wb3B1cGVtb2ppcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3Byb2dyZXNzaXZlZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9zcHJpdGVpbmZvLmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvc3ByaXRlaW5mb190ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm9UZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnUuanMnLCBbJ2dvb2cudWkuRmlsdGVyZWRNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkZpbHRlck9ic2VydmluZ01lbnVJdGVtJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5GaWx0ZXJlZE1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRmlsdGVyZWRNZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJvYnNlcnZpbmdtZW51aXRlbS5qcycsIFsnZ29vZy51aS5GaWx0ZXJPYnNlcnZpbmdNZW51SXRlbSddLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZpbHRlcm9ic2VydmluZ21lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlciddLCBbJ2dvb2cudWkuTWVudUl0ZW1SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZmxhdGJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZsYXRtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmxhdE1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9mb3JtcG9zdC5qcycsIFsnZ29vZy51aS5Gb3JtUG9zdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Zvcm1wb3N0X3Rlc3QuanMnLCBbJ2dvb2cudWkuRm9ybVBvc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Gb3JtUG9zdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2UuanMnLCBbJ2dvb2cudWkuR2F1Z2UnLCAnZ29vZy51aS5HYXVnZUNvbG9yZWRSYW5nZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmVhc2luZycsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5tYXRoJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuR2F1Z2VUaGVtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2V0aGVtZS5qcycsIFsnZ29vZy51aS5HYXVnZVRoZW1lJ10sIFsnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaG92ZXJjYXJkLmpzJywgWydnb29nLnVpLkhvdmVyQ2FyZCcsICdnb29nLnVpLkhvdmVyQ2FyZC5FdmVudFR5cGUnLCAnZ29vZy51aS5Ib3ZlckNhcmQuVHJpZ2dlckV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51aS5Ub29sdGlwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9ob3ZlcmNhcmRfdGVzdC5qcycsIFsnZ29vZy51aS5Ib3ZlckNhcmRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSG92ZXJDYXJkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2YXBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3IuYWxwaGEnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkhzdlBhbGV0dGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdmFwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvci5hbHBoYScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Ic3ZhUGFsZXR0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2UGFsZXR0ZSddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2cGFsZXR0ZV90ZXN0LmpzJywgWydnb29nLnVpLkhzdlBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Ic3ZQYWxldHRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWRnZW5lcmF0b3IuanMnLCBbJ2dvb2cudWkuSWRHZW5lcmF0b3InXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXIuanMnLCBbJ2dvb2cudWkuSWRsZVRpbWVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXJfdGVzdC5qcycsIFsnZ29vZy51aS5JZGxlVGltZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSWRsZVRpbWVyJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lmcmFtZW1hc2suanMnLCBbJ2dvb2cudWkuSWZyYW1lTWFzayddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWZyYW1lbWFza190ZXN0LmpzJywgWydnb29nLnVpLklmcmFtZU1hc2tUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pZnJhbWUnLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5JZnJhbWVNYXNrJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pbWFnZWxlc3NidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ltYWdlbGVzc21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lucHV0ZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5JbnB1dERhdGVQaWNrZXInXSwgWydnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGFyc2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVpLlBvcHVwRGF0ZVBpY2tlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaW5wdXRkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaXRlbWV2ZW50LmpzJywgWydnb29nLnVpLkl0ZW1FdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZGV2ZW50ZGF0YS5qcycsIFsnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZHNob3J0Y3V0aGFuZGxlci5qcycsIFsnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0RXZlbnQnLCAnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0SGFuZGxlcicsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLkV2ZW50VHlwZScsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLk1vZGlmaWVycyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleU5hbWVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YScsICdnb29nLnVpLlN5bnRoZXRpY0tleWJvYXJkRXZlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2tleWJvYXJkc2hvcnRjdXRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9sYWJlbGlucHV0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbGFiZWxpbnB1dF90ZXN0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXRUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2xpbmtidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5MaW5rQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9mbGFzaG9iamVjdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0LlNjcmlwdEFjY2Vzc0xldmVsJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QuV21vZGVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cubG9nJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxhc2hvYmplY3RfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyLmpzJywgWydnb29nLnVpLm1lZGlhLkZsaWNrclNldCcsICdnb29nLnVpLm1lZGlhLkZsaWNrclNldE1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0TW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvLmpzJywgWydnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvJywgJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9Nb2RlbCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5Hb29nbGVWaWRlbycsICdnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYV90ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYW1vZGVsLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNhdGVnb3J5JywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNyZWRpdC5Sb2xlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQuU2NoZW1lJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5NZWRpdW0nLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLk1pbWVUeXBlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5QbGF5ZXInLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLlN1YlRpdGxlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5UaHVtYm5haWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvbXAzLmpzJywgWydnb29nLnVpLm1lZGlhLk1wMyddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21wM190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1wM1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1wMyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3Bob3RvLmpzJywgWydnb29nLnVpLm1lZGlhLlBob3RvJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGhvdG9fdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5QaG90b1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuUGhvdG8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9waWNhc2EuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhQWxidW0nLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bU1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGljYXNhX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bScsICdnb29nLnVpLm1lZGlhLlBpY2FzYUFsYnVtTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lby5qcycsIFsnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgWydnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lb190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLlZpbWVvVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS95b3V0dWJlLmpzJywgWydnb29nLnVpLm1lZGlhLllvdXR1YmUnLCAnZ29vZy51aS5tZWRpYS5Zb3V0dWJlTW9kZWwnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3lvdXR1YmVfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5Zb3V0dWJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuWW91dHViZScsICdnb29nLnVpLm1lZGlhLllvdXR1YmVNb2RlbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnUuanMnLCBbJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnUuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLk1lbnVIZWFkZXInLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YmFyLmpzJywgWydnb29nLnVpLm1lbnVCYXInXSwgWydnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLk1lbnVCYXJSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWJhcmRlY29yYXRvci5qcycsIFsnZ29vZy51aS5tZW51QmFyRGVjb3JhdG9yJ10sIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInLCAnZ29vZy51aS5tZW51QmFyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXNlLmpzJywgWydnb29nLnVpLk1lbnVCYXNlJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b24uanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklkR2VuZXJhdG9yJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuU3ViTWVudScsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9uX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlN1Yk1lbnUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9ucmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVoZWFkZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlciddLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLk1lbnVIZWFkZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aGVhZGVycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlclJlbmRlcmVyJ10sIFsnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtLmpzJywgWydnb29nLnVpLk1lbnVJdGVtJ10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUl0ZW1UZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aXRlbXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWl0ZW1yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5Db250YWluZXJSZW5kZXJlcicsICdnb29nLnVpLlNlcGFyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yJ10sIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51c2VwYXJhdG9ycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2NrYWN0aXZpdHltb25pdG9yLmpzJywgWydnb29nLnVpLk1vY2tBY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vY2thY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5Nb2NrQWN0aXZpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFsYXJpYXZpc2liaWxpdHloZWxwZXIuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2RhbGFyaWF2aXNpYmlsaXR5aGVscGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFscG9wdXAuanMnLCBbJ2dvb2cudWkuTW9kYWxQb3B1cCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlcicsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbW9kYWxwb3B1cF90ZXN0LmpzJywgWydnb29nLnVpLk1vZGFsUG9wdXBUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kaXNwb3NlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1vZGFsUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9uYXRpdmVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL25hdGl2ZWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTmF0aXZlQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL29wdGlvbi5qcycsIFsnZ29vZy51aS5PcHRpb24nXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BhbGV0dGUuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlSXRlcmF0b3InLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uZGF0YXNldCcsICdnb29nLml0ZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGFsZXR0ZXJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGxhaW50ZXh0c3BlbGxjaGVja2VyLmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BsYWludGV4dHNwZWxsY2hlY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwLmpzJywgWydnb29nLnVpLlBvcHVwJ10sIFsnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cFRlc3QnXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wb3B1cGJhc2UuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBCYXNlLkV2ZW50VHlwZScsICdnb29nLnVpLlBvcHVwQmFzZS5UeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cENvbG9yUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5Qb3B1cERhdGVQaWNrZXInXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51LmpzJywgWydnb29nLnVpLlBvcHVwTWVudSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuTW91c2VCdXR0b24nLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51X3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBNZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wcm9ncmVzc2Jhci5qcycsIFsnZ29vZy51aS5Qcm9ncmVzc0JhcicsICdnb29nLnVpLlByb2dyZXNzQmFyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlJhbmdlTW9kZWwnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdC5qcycsIFsnZ29vZy51aS5Qcm9tcHQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdF90ZXN0LmpzJywgWydnb29nLnVpLlByb21wdFRlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJpZGlJbnB1dCcsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlByb21wdCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmFuZ2Vtb2RlbC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JhbmdlbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmF0aW5ncy5qcycsIFsnZ29vZy51aS5SYXRpbmdzJywgJ2dvb2cudWkuUmF0aW5ncy5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JlZ2lzdHJ5LmpzJywgWydnb29nLnVpLnJlZ2lzdHJ5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmVnaXN0cnlfdGVzdC5qcycsIFsnZ29vZy51aS5yZWdpc3RyeVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yaWNodGV4dHNwZWxsY2hlY2tlci5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwTWVudSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmljaHRleHRzcGVsbGNoZWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLm9iamVjdCcsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JvdW5kZWRwYW5lbC5qcycsIFsnZ29vZy51aS5CYXNlUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuQ3NzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuR3JhcGhpY3NSb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwuQ29ybmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yb3VuZGVkcGFuZWxfdGVzdC5qcycsIFsnZ29vZy51aS5Sb3VuZGVkUGFuZWxUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNzc1JvdW5kZWRQYW5lbCcsICdnb29nLnVpLkdyYXBoaWNzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuUm91bmRlZFBhbmVsJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcm91bmRlZHRhYnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlJvdW5kZWRUYWJSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyLmpzJywgWydnb29nLnVpLlNjcm9sbEZsb2F0ZXInLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2Nyb2xsRmxvYXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0LmpzJywgWydnb29nLnVpLlNlbGVjdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdF90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdFRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TZWxlY3QnLCAnZ29vZy51aS5TZXBhcmF0b3InXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZWxlY3Rpb25tZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b24nLCAnZ29vZy51aS5TZWxlY3Rpb25NZW51QnV0dG9uLlNlbGVjdGlvblN0YXRlJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0aW9ubWVudWJ1dHRvbl90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VsZWN0aW9uTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2VsZWN0aW9uTW9kZWxUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VwYXJhdG9yLmpzJywgWydnb29nLnVpLlNlcGFyYXRvciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VydmVyY2hhcnQuanMnLCBbJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5BeGlzRGlzcGxheVR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5DaGFydFR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FbmNvZGluZ1R5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FdmVudCcsICdnb29nLnVpLlNlcnZlckNoYXJ0LkxlZ2VuZFBvc2l0aW9uJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTWF4aW11bVZhbHVlJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzQWxpZ25tZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzVHlwZScsICdnb29nLnVpLlNlcnZlckNoYXJ0LlVyaVBhcmFtJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuVXJpVG9vTG9uZ0V2ZW50J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZXJ2ZXJjaGFydF90ZXN0LmpzJywgWydnb29nLnVpLlNlcnZlckNoYXJ0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NsaWRlci5qcycsIFsnZ29vZy51aS5TbGlkZXInLCAnZ29vZy51aS5TbGlkZXIuT3JpZW50YXRpb24nXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5TbGlkZXJCYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlLmpzJywgWydnb29nLnVpLlNsaWRlckJhc2UnLCAnZ29vZy51aS5TbGlkZXJCYXNlLkFuaW1hdGlvbkZhY3RvcnknLCAnZ29vZy51aS5TbGlkZXJCYXNlLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuZnguQW5pbWF0aW9uUGFyYWxsZWxRdWV1ZScsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZG9tLlJlc2l6ZUhlaWdodCcsICdnb29nLmZ4LmRvbS5SZXNpemVXaWR0aCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2xpZGVyQmFzZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NwbGl0cGFuZS5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmUnLCAnZ29vZy51aS5TcGxpdFBhbmUuT3JpZW50YXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zcGxpdHBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU3BsaXRQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL2J1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9tZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuc3R5bGUuYXBwLkJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zdHlsZS9hcHAvbWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5zdHlsZS5hcHAuTWVudUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5QcmltYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuc3R5bGUnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudS5qcycsIFsnZ29vZy51aS5TdWJNZW51J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51UmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudV90ZXN0LmpzJywgWydnb29nLnVpLlN1Yk1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51JywgJ2dvb2cudWkuU3ViTWVudVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLlN1Yk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N5bnRoZXRpY2tleWJvYXJkZXZlbnQuanMnLCBbJ2dvb2cudWkuU3ludGhldGljS2V5Ym9hcmRFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudWkuS2V5Ym9hcmRFdmVudERhdGEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYi5qcycsIFsnZ29vZy51aS5UYWInXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYlJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFyLmpzJywgWydnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhci5Mb2NhdGlvbiddLCBbJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYkJhclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJCYXJSZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyLmpzJywgWydnb29nLnVpLlRhYmxlU29ydGVyJywgJ2dvb2cudWkuVGFibGVTb3J0ZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFibGVTb3J0ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuVGFiUGFuZScsICdnb29nLnVpLlRhYlBhbmUuRXZlbnRzJywgJ2dvb2cudWkuVGFiUGFuZS5UYWJMb2NhdGlvbicsICdnb29nLnVpLlRhYlBhbmUuVGFiUGFnZScsICdnb29nLnVpLlRhYlBhbmVFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJQYW5lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFicmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVGFiJywgJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90ZXh0YXJlYS5qcycsIFsnZ29vZy51aS5UZXh0YXJlYScsICdnb29nLnVpLlRleHRhcmVhLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFfdGVzdC5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRleHRhcmVhJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFyZW5kZXJlci5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVJlbmRlcmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhci5qcycsIFsnZ29vZy51aS5Ub29sYmFyJ10sIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ub29sYmFyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRvb2xiYXInLCAnZ29vZy51aS5Ub29sYmFyTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b24uanMnLCBbJ2dvb2cudWkuVG9vbGJhckJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhckJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Ub29sYmFyQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkN1c3RvbUJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b24nXSwgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcmNvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcycsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uJ10sIFsnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lclJlbmRlcmVyJywgJ2dvb2cudWkuU2VwYXJhdG9yJywgJ2dvb2cudWkuVG9vbGJhclNlcGFyYXRvclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyc2VsZWN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZWxlY3QnXSwgWydnb29nLnVpLlNlbGVjdCcsICdnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yJ10sIFsnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJzZXBhcmF0b3JyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuSU5MSU5FX0JMT0NLX0NMQVNTTkFNRScsICdnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFydG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJUb2dnbGVCdXR0b24nXSwgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sdGlwLmpzJywgWydnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51aS5Ub29sdGlwLkN1cnNvclRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuRWxlbWVudFRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuU3RhdGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbHRpcF90ZXN0LmpzJywgWydnb29nLnVpLlRvb2x0aXBUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvYmFzZW5vZGUuanMnLCBbJ2dvb2cudWkudHJlZS5CYXNlTm9kZScsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS9iYXNlbm9kZV90ZXN0LmpzJywgWydnb29nLnVpLnRyZWUuQmFzZU5vZGVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJywgJ2dvb2cudWkudHJlZS5UcmVlTm9kZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2wuanMnLCBbJ2dvb2cudWkudHJlZS5UcmVlQ29udHJvbCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVOb2RlJywgJ2dvb2cudWkudHJlZS5UeXBlQWhlYWQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVDb250cm9sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS90cmVlbm9kZS5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVOb2RlJ10sIFsnZ29vZy51aS50cmVlLkJhc2VOb2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmVlL3R5cGVhaGVhZC5qcycsIFsnZ29vZy51aS50cmVlLlR5cGVBaGVhZCcsICdnb29nLnVpLnRyZWUuVHlwZUFoZWFkLk9mZnNldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHlwZWFoZWFkX3Rlc3QuanMnLCBbJ2dvb2cudWkudHJlZS5UeXBlQWhlYWRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLnRyZWUuVHJlZUNvbnRyb2wnLCAnZ29vZy51aS50cmVlLlR5cGVBaGVhZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyaXN0YXRlbWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW0uU3RhdGUnXSwgWydnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmlzdGF0ZW1lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbVJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3R3b3RodW1ic2xpZGVyLmpzJywgWydnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuU2xpZGVyQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHdvdGh1bWJzbGlkZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ud29UaHVtYlNsaWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvemlwcHkuanMnLCBbJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweS5FdmVudHMnLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3ppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuWmlwcHlUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuWmlwcHknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXJpLmpzJywgWydnb29nLlVyaScsICdnb29nLlVyaS5RdWVyeURhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCcsICdnb29nLnVyaS51dGlscy5TdGFuZGFyZFF1ZXJ5UGFyYW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91cmlfdGVzdC5qcycsIFsnZ29vZy5VcmlUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91dGlscy5qcycsIFsnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXgnLCAnZ29vZy51cmkudXRpbHMuUXVlcnlBcnJheScsICdnb29nLnVyaS51dGlscy5RdWVyeVZhbHVlJywgJ2dvb2cudXJpLnV0aWxzLlN0YW5kYXJkUXVlcnlQYXJhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXRpbHNfdGVzdC5qcycsIFsnZ29vZy51cmkudXRpbHNUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVyaS51dGlscyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlci5qcycsIFsnZ29vZy51c2VyQWdlbnQuYWRvYmVSZWFkZXInXSwgWydnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlcl90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5hZG9iZVJlYWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmFkb2JlUmVhZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L2ZsYXNoLmpzJywgWydnb29nLnVzZXJBZ2VudC5mbGFzaCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvZmxhc2hfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuZmxhc2hUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9pcGhvdG8uanMnLCBbJ2dvb2cudXNlckFnZW50LmlwaG90byddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5qc2NyaXB0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9rZXlib2FyZC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmQnXSwgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQva2V5Ym9hcmRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmRUZXN0J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcGxhdGZvcm0uanMnLCBbJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wbGF0Zm9ybVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdC5qcycsIFsnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF9pc3ZlcnNpb24uanMnLCBbJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wcm9kdWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnQuanMnLCBbJ2dvb2cudXNlckFnZW50J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudF9xdWlya3NfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRRdWlya3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudHRlc3R1dGlsLmpzJywgWydnb29nLnVzZXJBZ2VudFRlc3RVdGlsJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwuVXNlckFnZW50cyddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDMyYXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQzMmFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDY0YXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQ2NGFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzLmpzJywgWydnb29nLnZlYy5NYXQzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLk1hdDNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5NYXQzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkLmpzJywgWydnb29nLnZlYy5tYXQzZCcsICdnb29nLnZlYy5tYXQzZC5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMudmVjM2QuVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDNkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMubWF0M2QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2YuanMnLCBbJ2dvb2cudmVjLm1hdDNmJywgJ2dvb2cudmVjLm1hdDNmLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2ZfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0M2ZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5tYXQzZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQ0LmpzJywgWydnb29nLnZlYy5NYXQ0J10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuVmVjMycsICdnb29nLnZlYy5WZWM0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NF90ZXN0LmpzJywgWydnb29nLnZlYy5NYXQ0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5WZWMzJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGQuanMnLCBbJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLm1hdDRkLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGRfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0NGRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmLmpzJywgWydnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy5tYXQ0Zi5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9xdWF0ZXJuaW9uLmpzJywgWydnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlF1YXRlcm5pb24uQW55VHlwZSddLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMuVmVjNCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3F1YXRlcm5pb25fdGVzdC5qcycsIFsnZ29vZy52ZWMuUXVhdGVybmlvblRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLk1hdDMnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMudmVjM2YnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5LmpzJywgWydnb29nLnZlYy5SYXknXSwgWydnb29nLnZlYy5WZWMzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLlJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMuanMnLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLkFueVR5cGUnLCAnZ29vZy52ZWMuQXJyYXlUeXBlJywgJ2dvb2cudmVjLkZsb2F0MzInLCAnZ29vZy52ZWMuRmxvYXQ2NCcsICdnb29nLnZlYy5OdW1iZXInXSwgWydnb29nLnZlYy5GbG9hdDMyQXJyYXknLCAnZ29vZy52ZWMuRmxvYXQ2NEFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMi5qcycsIFsnZ29vZy52ZWMuVmVjMiddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMl90ZXN0LmpzJywgWydnb29nLnZlYy5WZWMyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuVmVjMiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZC5qcycsIFsnZ29vZy52ZWMudmVjMmQnLCAnZ29vZy52ZWMudmVjMmQuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmRfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZi5qcycsIFsnZ29vZy52ZWMudmVjMmYnLCAnZ29vZy52ZWMudmVjMmYuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmZfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzLmpzJywgWydnb29nLnZlYy5WZWMzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLlZlYzNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5WZWMzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNkLmpzJywgWydnb29nLnZlYy52ZWMzZCcsICdnb29nLnZlYy52ZWMzZC5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZF90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNmLmpzJywgWydnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZl90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZlRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNmJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzQuanMnLCBbJ2dvb2cudmVjLlZlYzQnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRfdGVzdC5qcycsIFsnZ29vZy52ZWMuVmVjNFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGQuanMnLCBbJ2dvb2cudmVjLnZlYzRkJywgJ2dvb2cudmVjLnZlYzRkLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGYuanMnLCBbJ2dvb2cudmVjLnZlYzRmJywgJ2dvb2cudmVjLnZlYzRmLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGYnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3ZWJnbC93ZWJnbC5qcycsIFsnZ29vZy53ZWJnbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3dpbmRvdy93aW5kb3cuanMnLCBbJ2dvb2cud2luZG93J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3aW5kb3cvd2luZG93X3Rlc3QuanMnLCBbJ2dvb2cud2luZG93VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cud2luZG93J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9iYXNlLmpzCmZ1bmN0aW9uIHdhKGIpe3ZhciBkPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGQ8Yi5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6YltkKytdfTp7ZG9uZTohMH19fWZ1bmN0aW9uIGdiKGIpe3JldHVybntuZXh0OndhKGIpfX1mdW5jdGlvbiBsYihiKXt2YXIgZD0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZiW1N5bWJvbC5pdGVyYXRvcl07cmV0dXJuIGQ/ZC5jYWxsKGIpOmdiKGIpfXZhciB3Yj1mdW5jdGlvbihiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09Yj9iOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOmJ9KHRoaXMpLFJiPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oYixkLGYpe2IhPUFycmF5LnByb3RvdHlwZSYmYiE9T2JqZWN0LnByb3RvdHlwZSYmKGJbZF09Zi52YWx1ZSl9OwpmdW5jdGlvbiBVYihiLGQpe2lmKGQpe3ZhciBmPXdiO2I9Yi5zcGxpdCgiLiIpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGgtMTtoKyspe3ZhciBrPWJbaF07ayBpbiBmfHwoZltrXT17fSk7Zj1mW2tdfWI9YltiLmxlbmd0aC0xXTtoPWZbYl07ZD1kKGgpO2QhPWgmJm51bGwhPWQmJlJiKGYsYix7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmR9KX19ClViKCJQcm9taXNlIixmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHApe3RoaXMuc3RhdGVfPTA7dGhpcy5yZXN1bHRfPXZvaWQgMDt0aGlzLm9uU2V0dGxlZENhbGxiYWNrc189W107dmFyIG09dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtwKG0ucmVzb2x2ZSxtLnJlamVjdCl9Y2F0Y2gobil7bS5yZWplY3Qobil9fWZ1bmN0aW9uIGYoKXt0aGlzLmJhdGNoXz1udWxsfWZ1bmN0aW9uIGgocCl7c3dpdGNoKHR5cGVvZiBwKXtjYXNlICJvYmplY3QiOnJldHVybiBudWxsIT1wO2Nhc2UgImZ1bmN0aW9uIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBrKHApe3JldHVybiBwIGluc3RhbmNlb2YgZD9wOm5ldyBkKGZ1bmN0aW9uKG0pe20ocCl9KX1pZihiKXJldHVybiBiO2YucHJvdG90eXBlLmFzeW5jRXhlY3V0ZT1mdW5jdGlvbihwKXtpZihudWxsPT10aGlzLmJhdGNoXyl7dGhpcy5iYXRjaF89W107dmFyIG09dGhpczt0aGlzLmFzeW5jRXhlY3V0ZUZ1bmN0aW9uKGZ1bmN0aW9uKCl7bS5leGVjdXRlQmF0Y2hfKCl9KX10aGlzLmJhdGNoXy5wdXNoKHApfTsKdmFyIHQ9d2Iuc2V0VGltZW91dDtmLnByb3RvdHlwZS5hc3luY0V4ZWN1dGVGdW5jdGlvbj1mdW5jdGlvbihwKXt0KHAsMCl9O2YucHJvdG90eXBlLmV4ZWN1dGVCYXRjaF89ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYmF0Y2hfJiZ0aGlzLmJhdGNoXy5sZW5ndGg7KXt2YXIgcD10aGlzLmJhdGNoXzt0aGlzLmJhdGNoXz1bXTtmb3IodmFyIG09MDttPHAubGVuZ3RoOysrbSl7dmFyIG49cFttXTtwW21dPW51bGw7dHJ5e24oKX1jYXRjaChxKXt0aGlzLmFzeW5jVGhyb3dfKHEpfX19dGhpcy5iYXRjaF89bnVsbH07Zi5wcm90b3R5cGUuYXN5bmNUaHJvd189ZnVuY3Rpb24ocCl7dGhpcy5hc3luY0V4ZWN1dGVGdW5jdGlvbihmdW5jdGlvbigpe3Rocm93IHA7fSl9O2QucHJvdG90eXBlLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChxKXtyZXR1cm4gZnVuY3Rpb24odSl7bnx8KG49ITAscS5jYWxsKG0sdSkpfX12YXIgbT10aGlzLG49ITE7cmV0dXJue3Jlc29sdmU6cCh0aGlzLnJlc29sdmVUb18pLApyZWplY3Q6cCh0aGlzLnJlamVjdF8pfX07ZC5wcm90b3R5cGUucmVzb2x2ZVRvXz1mdW5jdGlvbihwKXtwPT09dGhpcz90aGlzLnJlamVjdF8obmV3IFR5cGVFcnJvcigiQSBQcm9taXNlIGNhbm5vdCByZXNvbHZlIHRvIGl0c2VsZiIpKTpwIGluc3RhbmNlb2YgZD90aGlzLnNldHRsZVNhbWVBc1Byb21pc2VfKHApOmgocCk/dGhpcy5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXyhwKTp0aGlzLmZ1bGZpbGxfKHApfTtkLnByb3RvdHlwZS5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXz1mdW5jdGlvbihwKXt2YXIgbT12b2lkIDA7dHJ5e209cC50aGVufWNhdGNoKG4pe3RoaXMucmVqZWN0XyhuKTtyZXR1cm59ImZ1bmN0aW9uIj09dHlwZW9mIG0/dGhpcy5zZXR0bGVTYW1lQXNUaGVuYWJsZV8obSxwKTp0aGlzLmZ1bGZpbGxfKHApfTtkLnByb3RvdHlwZS5yZWplY3RfPWZ1bmN0aW9uKHApe3RoaXMuc2V0dGxlXygyLHApfTtkLnByb3RvdHlwZS5mdWxmaWxsXz1mdW5jdGlvbihwKXt0aGlzLnNldHRsZV8oMSwKcCl9O2QucHJvdG90eXBlLnNldHRsZV89ZnVuY3Rpb24ocCxtKXtpZigwIT10aGlzLnN0YXRlXyl0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiK3ArIiwgIittKyIpOiBQcm9taXNlIGFscmVhZHkgc2V0dGxlZCBpbiBzdGF0ZSIrdGhpcy5zdGF0ZV8pO3RoaXMuc3RhdGVfPXA7dGhpcy5yZXN1bHRfPW07dGhpcy5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXygpfTtkLnByb3RvdHlwZS5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXz1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXyl7Zm9yKHZhciBwPTA7cDx0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ubGVuZ3RoOysrcClsLmFzeW5jRXhlY3V0ZSh0aGlzLm9uU2V0dGxlZENhbGxiYWNrc19bcF0pO3RoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz1udWxsfX07dmFyIGw9bmV3IGY7ZC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzUHJvbWlzZV89ZnVuY3Rpb24ocCl7dmFyIG09dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpOwpwLmNhbGxXaGVuU2V0dGxlZF8obS5yZXNvbHZlLG0ucmVqZWN0KX07ZC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzVGhlbmFibGVfPWZ1bmN0aW9uKHAsbSl7dmFyIG49dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtwLmNhbGwobSxuLnJlc29sdmUsbi5yZWplY3QpfWNhdGNoKHEpe24ucmVqZWN0KHEpfX07ZC5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oQSx5KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgQT9mdW5jdGlvbih3KXt0cnl7cShBKHcpKX1jYXRjaChDKXt1KEMpfX06eX12YXIgcSx1LHg9bmV3IGQoZnVuY3Rpb24oQSx5KXtxPUE7dT15fSk7dGhpcy5jYWxsV2hlblNldHRsZWRfKG4ocCxxKSxuKG0sdSkpO3JldHVybiB4fTtkLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCxwKX07ZC5wcm90b3R5cGUuY2FsbFdoZW5TZXR0bGVkXz1mdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXtzd2l0Y2gocS5zdGF0ZV8pe2Nhc2UgMTpwKHEucmVzdWx0Xyk7CmJyZWFrO2Nhc2UgMjptKHEucmVzdWx0Xyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBzdGF0ZTogIitxLnN0YXRlXyk7fX12YXIgcT10aGlzO251bGw9PXRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz9sLmFzeW5jRXhlY3V0ZShuKTp0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ucHVzaChuKX07ZC5yZXNvbHZlPWs7ZC5yZWplY3Q9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBkKGZ1bmN0aW9uKG0sbil7bihwKX0pfTtkLnJhY2U9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBkKGZ1bmN0aW9uKG0sbil7Zm9yKHZhciBxPWxiKHApLHU9cS5uZXh0KCk7IXUuZG9uZTt1PXEubmV4dCgpKWsodS52YWx1ZSkuY2FsbFdoZW5TZXR0bGVkXyhtLG4pfSl9O2QuYWxsPWZ1bmN0aW9uKHApe3ZhciBtPWxiKHApLG49bS5uZXh0KCk7cmV0dXJuIG4uZG9uZT9rKFtdKTpuZXcgZChmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgodyl7cmV0dXJuIGZ1bmN0aW9uKEMpe0Fbd109Qzt5LS07MD09CnkmJnEoQSl9fXZhciBBPVtdLHk9MDtkbyBBLnB1c2godm9pZCAwKSx5KyssayhuLnZhbHVlKS5jYWxsV2hlblNldHRsZWRfKHgoQS5sZW5ndGgtMSksdSksbj1tLm5leHQoKTt3aGlsZSghbi5kb25lKX0pfTtyZXR1cm4gZH0pO2Z1bmN0aW9uIGFjKGIpe2Z1bmN0aW9uIGQoaCl7cmV0dXJuIGIubmV4dChoKX1mdW5jdGlvbiBmKGgpe3JldHVybiBiLnRocm93KGgpfXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihoLGspe2Z1bmN0aW9uIHQobCl7bC5kb25lP2gobC52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGwudmFsdWUpLnRoZW4oZCxmKS50aGVuKHQsayl9dChiLm5leHQoKSl9KX1mdW5jdGlvbiBoYyhiKXtyZXR1cm4gYWMoYigpKX07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RlcHMuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovL2FuYWx5dGljcy5odG1sLmpzCndpbmRvdy5nYT1mdW5jdGlvbigpe307CgovLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiFmdW5jdGlvbihhLGIpe3ZhciBjPXt9LGQ9e30sZT17fSxmPW51bGw7IWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGE7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifWZ1bmN0aW9uIGQoKXt0aGlzLl9kZWxheT0wLHRoaXMuX2VuZERlbGF5PTAsdGhpcy5fZmlsbD0ibm9uZSIsdGhpcy5faXRlcmF0aW9uU3RhcnQ9MCx0aGlzLl9pdGVyYXRpb25zPTEsdGhpcy5fZHVyYXRpb249MCx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9kaXJlY3Rpb249Im5vcm1hbCIsdGhpcy5fZWFzaW5nPSJsaW5lYXIiLHRoaXMuX2Vhc2luZ0Z1bmN0aW9uPXd9ZnVuY3Rpb24gZSgpe3JldHVybiBhLmlzRGVwcmVjYXRlZCgiSW52YWxpZCB0aW1pbmcgaW5wdXRzIiwiMjAxNi0wMy0wMiIsIlR5cGVFcnJvciBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGluc3RlYWQuIiwhMCl9ZnVuY3Rpb24gZihiLGMsZSl7dmFyIGY9bmV3IGQ7cmV0dXJuIGMmJihmLmZpbGw9ImJvdGgiLGYuZHVyYXRpb249ImF1dG8iKSwibnVtYmVyIiE9dHlwZW9mIGJ8fGlzTmFOKGIpP3ZvaWQgMCE9PWImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoImF1dG8iIT1iW2NdKXtpZigoIm51bWJlciI9PXR5cGVvZiBmW2NdfHwiZHVyYXRpb24iPT1jKSYmKCJudW1iZXIiIT10eXBlb2YgYltjXXx8aXNOYU4oYltjXSkpKXJldHVybjtpZigiZmlsbCI9PWMmJi0xPT11LmluZGV4T2YoYltjXSkpcmV0dXJuO2lmKCJkaXJlY3Rpb24iPT1jJiYtMT09di5pbmRleE9mKGJbY10pKXJldHVybjtpZigicGxheWJhY2tSYXRlIj09YyYmMSE9PWJbY10mJmEuaXNEZXByZWNhdGVkKCJBbmltYXRpb25FZmZlY3RUaW1pbmcucGxheWJhY2tSYXRlIiwiMjAxNC0xMS0yOCIsIlVzZSBBbmltYXRpb24ucGxheWJhY2tSYXRlIGluc3RlYWQuIikpcmV0dXJuO2ZbY109YltjXX19KTpmLmR1cmF0aW9uPWIsZn1mdW5jdGlvbiBnKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYSYmKGE9aXNOYU4oYSk/e2R1cmF0aW9uOjB9OntkdXJhdGlvbjphfSksYX1mdW5jdGlvbiBoKGIsYyl7cmV0dXJuIGI9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYiksZihiLGMpfWZ1bmN0aW9uIGkoYSxiLGMsZCl7cmV0dXJuIDA+YXx8YT4xfHwwPmN8fGM+MT93OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGYoYSxiLGMpe3JldHVybiAzKmEqKDEtYykqKDEtYykqYyszKmIqKDEtYykqYypjK2MqYypjfWlmKDA9PWV8fDE9PWUpcmV0dXJuIGU7Zm9yKHZhciBnPTAsaD0xOzspe3ZhciBpPShnK2gpLzIsaj1mKGEsYyxpKTtpZihNYXRoLmFicyhlLWopPDFlLTQpcmV0dXJuIGYoYixkLGkpO2U+aj9nPWk6aD1pfX19ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjPj0xKXJldHVybiAxO3ZhciBkPTEvYTtyZXR1cm4gYys9YipkLGMtYyVkfX1mdW5jdGlvbiBrKGEpe0J8fChCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlKSxCLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uPSIiLEIuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249YTt2YXIgYj1CLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uO2lmKCIiPT1iJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcihhKyIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIGVhc2luZyIpO3ZhciBjPUQuZXhlYyhiKTtpZihjKXJldHVybiBpLmFwcGx5KHRoaXMsYy5zbGljZSgxKS5tYXAoTnVtYmVyKSk7dmFyIGQ9RS5leGVjKGIpO2lmKGQpcmV0dXJuIGooTnVtYmVyKGRbMV0pLHtzdGFydDp4LG1pZGRsZTp5LGVuZDp6fVtkWzJdXSk7dmFyIGY9QVtiXTtyZXR1cm4gZj9mOnd9ZnVuY3Rpb24gbChhKXtyZXR1cm4gTWF0aC5hYnMobShhKS9hLnBsYXliYWNrUmF0ZSl9ZnVuY3Rpb24gbShhKXtyZXR1cm4gYS5kdXJhdGlvbiphLml0ZXJhdGlvbnN9ZnVuY3Rpb24gbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/RjpiPGMuZGVsYXk/RzpiPj1jLmRlbGF5K2E/SDpJfWZ1bmN0aW9uIG8oYSxiLGMsZCxlKXtzd2l0Y2goZCl7Y2FzZSBHOnJldHVybiJiYWNrd2FyZHMiPT1ifHwiYm90aCI9PWI/MDpudWxsO2Nhc2UgSTpyZXR1cm4gYy1lO2Nhc2UgSDpyZXR1cm4iZm9yd2FyZHMiPT1ifHwiYm90aCI9PWI/YTpudWxsO2Nhc2UgRjpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gcChhLGIsYyxkKXtyZXR1cm4oZC5wbGF5YmFja1JhdGU8MD9iLWE6YikqZC5wbGF5YmFja1JhdGUrY31mdW5jdGlvbiBxKGEsYixjLGQsZSl7cmV0dXJuIGM9PT0xLzB8fGM9PT0tKDEvMCl8fGMtZD09YiYmZS5pdGVyYXRpb25zJiYoZS5pdGVyYXRpb25zK2UuaXRlcmF0aW9uU3RhcnQpJTE9PTA/YTpjJWF9ZnVuY3Rpb24gcihhLGIsYyxkKXtyZXR1cm4gMD09PWM/MDpiPT1hP2QuaXRlcmF0aW9uU3RhcnQrZC5pdGVyYXRpb25zLTE6TWF0aC5mbG9vcihjL2EpfWZ1bmN0aW9uIHMoYSxiLGMsZCl7dmFyIGU9YSUyPj0xLGY9Im5vcm1hbCI9PWQuZGlyZWN0aW9ufHxkLmRpcmVjdGlvbj09KGU/ImFsdGVybmF0ZS1yZXZlcnNlIjoiYWx0ZXJuYXRlIiksZz1mP2M6Yi1jLGg9Zy9iO3JldHVybiBiKmQuX2Vhc2luZ0Z1bmN0aW9uKGgpfWZ1bmN0aW9uIHQoYSxiLGMpe3ZhciBkPW4oYSxiLGMpLGU9byhhLGMuZmlsbCxiLGQsYy5kZWxheSk7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7aWYoMD09PWEpcmV0dXJuIGQ9PT1HPzA6MTt2YXIgZj1jLml0ZXJhdGlvblN0YXJ0KmMuZHVyYXRpb24sZz1wKGEsZSxmLGMpLGg9cShjLmR1cmF0aW9uLG0oYyksZyxmLGMpLGk9cihjLmR1cmF0aW9uLGgsZyxjKTtyZXR1cm4gcyhpLGMuZHVyYXRpb24saCxjKS9jLmR1cmF0aW9ufXZhciB1PSJiYWNrd2FyZHN8Zm9yd2FyZHN8Ym90aHxub25lIi5zcGxpdCgifCIpLHY9InJldmVyc2V8YWx0ZXJuYXRlfGFsdGVybmF0ZS1yZXZlcnNlIi5zcGxpdCgifCIpLHc9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2QucHJvdG90eXBlPXtfc2V0TWVtYmVyOmZ1bmN0aW9uKGIsYyl7dGhpc1siXyIrYl09Yyx0aGlzLl9lZmZlY3QmJih0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0W2JdPWMsdGhpcy5fZWZmZWN0Ll90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dCh0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0KSx0aGlzLl9lZmZlY3QuYWN0aXZlRHVyYXRpb249YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbih0aGlzLl9lZmZlY3QuX3RpbWluZyksdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24mJnRoaXMuX2VmZmVjdC5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBkZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImRlbGF5IixhKX0sZ2V0IGRlbGF5KCl7cmV0dXJuIHRoaXMuX2RlbGF5fSxzZXQgZW5kRGVsYXkoYSl7dGhpcy5fc2V0TWVtYmVyKCJlbmREZWxheSIsYSl9LGdldCBlbmREZWxheSgpe3JldHVybiB0aGlzLl9lbmREZWxheX0sc2V0IGZpbGwoYSl7dGhpcy5fc2V0TWVtYmVyKCJmaWxsIixhKX0sZ2V0IGZpbGwoKXtyZXR1cm4gdGhpcy5fZmlsbH0sc2V0IGl0ZXJhdGlvblN0YXJ0KGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvblN0YXJ0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLCByZWNlaXZlZDogIit0aW1pbmcuaXRlcmF0aW9uU3RhcnQpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9uU3RhcnQiLGEpfSxnZXQgaXRlcmF0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy5faXRlcmF0aW9uU3RhcnR9LHNldCBkdXJhdGlvbihhKXtpZigiYXV0byIhPWEmJihpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoImR1cmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZlIG9yIGF1dG8sIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiZHVyYXRpb24iLGEpfSxnZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb259LHNldCBkaXJlY3Rpb24oYSl7dGhpcy5fc2V0TWVtYmVyKCJkaXJlY3Rpb24iLGEpfSxnZXQgZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0IGVhc2luZyhhKXt0aGlzLl9lYXNpbmdGdW5jdGlvbj1rKGEpLHRoaXMuX3NldE1lbWJlcigiZWFzaW5nIixhKX0sZ2V0IGVhc2luZygpe3JldHVybiB0aGlzLl9lYXNpbmd9LHNldCBpdGVyYXRpb25zKGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvbnMgbXVzdCBiZSBub24tbmVnYXRpdmUsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9ucyIsYSl9LGdldCBpdGVyYXRpb25zKCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvbnN9fTt2YXIgeD0xLHk9LjUsej0wLEE9e2Vhc2U6aSguMjUsLjEsLjI1LDEpLCJlYXNlLWluIjppKC40MiwwLDEsMSksImVhc2Utb3V0IjppKDAsMCwuNTgsMSksImVhc2UtaW4tb3V0IjppKC40MiwwLC41OCwxKSwic3RlcC1zdGFydCI6aigxLHgpLCJzdGVwLW1pZGRsZSI6aigxLHkpLCJzdGVwLWVuZCI6aigxLHopfSxCPW51bGwsQz0iXFxzKigtP1xcZCtcXC4/XFxkKnwtP1xcLlxcZCspXFxzKiIsRD1uZXcgUmVnRXhwKCJjdWJpYy1iZXppZXJcXCgiK0MrIiwiK0MrIiwiK0MrIiwiK0MrIlxcKSIpLEU9L3N0ZXBzXChccyooXGQrKVxzKixccyooc3RhcnR8bWlkZGxlfGVuZClccypcKS8sRj0wLEc9MSxIPTIsST0zO2EuY2xvbmVUaW1pbmdJbnB1dD1jLGEubWFrZVRpbWluZz1mLGEubnVtZXJpY1RpbWluZ1RvT2JqZWN0PWcsYS5ub3JtYWxpemVUaW1pbmdJbnB1dD1oLGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb249bCxhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbj10LGEuY2FsY3VsYXRlUGhhc2U9bixhLnRvVGltaW5nRnVuY3Rpb249a30oYyxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYSBpbiBqP2pbYV1bYl18fGI6Yn1mdW5jdGlvbiBkKGEsYixkKXt2YXIgZT1nW2FdO2lmKGUpe2guc3R5bGVbYV09Yjtmb3IodmFyIGYgaW4gZSl7dmFyIGk9ZVtmXSxqPWguc3R5bGVbaV07ZFtpXT1jKGksail9fWVsc2UgZFthXT1jKGEsYil9ZnVuY3Rpb24gZShhKXt2YXIgYj1bXTtmb3IodmFyIGMgaW4gYSlpZighKGMgaW5bImVhc2luZyIsIm9mZnNldCIsImNvbXBvc2l0ZSJdKSl7dmFyIGQ9YVtjXTtBcnJheS5pc0FycmF5KGQpfHwoZD1bZF0pO2Zvcih2YXIgZSxmPWQubGVuZ3RoLGc9MDtmPmc7ZysrKWU9e30sIm9mZnNldCJpbiBhP2Uub2Zmc2V0PWEub2Zmc2V0OjE9PWY/ZS5vZmZzZXQ9MTplLm9mZnNldD1nLyhmLTEpLCJlYXNpbmciaW4gYSYmKGUuZWFzaW5nPWEuZWFzaW5nKSwiY29tcG9zaXRlImluIGEmJihlLmNvbXBvc2l0ZT1hLmNvbXBvc2l0ZSksZVtjXT1kW2ddLGIucHVzaChlKX1yZXR1cm4gYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEub2Zmc2V0LWIub2Zmc2V0fSksYn1mdW5jdGlvbiBmKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYT1jLmxlbmd0aDtudWxsPT1jW2EtMV0ub2Zmc2V0JiYoY1thLTFdLm9mZnNldD0xKSxhPjEmJm51bGw9PWNbMF0ub2Zmc2V0JiYoY1swXS5vZmZzZXQ9MCk7Zm9yKHZhciBiPTAsZD1jWzBdLm9mZnNldCxlPTE7YT5lO2UrKyl7dmFyIGY9Y1tlXS5vZmZzZXQ7aWYobnVsbCE9Zil7Zm9yKHZhciBnPTE7ZS1iPmc7ZysrKWNbYitnXS5vZmZzZXQ9ZCsoZi1kKSpnLyhlLWIpO2I9ZSxkPWZ9fX1pZihudWxsPT1hKXJldHVybltdO3dpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmFbU3ltYm9sLml0ZXJhdG9yXSYmKGE9QXJyYXkuZnJvbShhKSksQXJyYXkuaXNBcnJheShhKXx8KGE9ZShhKSk7Zm9yKHZhciBjPWEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKXt2YXIgZT1hW2NdO2lmKCJvZmZzZXQiPT1jKXtpZihudWxsIT1lJiYoZT1OdW1iZXIoZSksIWlzRmluaXRlKGUpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJrZXlmcmFtZSBvZmZzZXRzIG11c3QgYmUgbnVtYmVycy4iKX1lbHNle2lmKCJjb21wb3NpdGUiPT1jKXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLG5hbWU6Ik5vdFN1cHBvcnRlZEVycm9yIixtZXNzYWdlOiJhZGQgY29tcG9zaXRpbmcgaXMgbm90IHN1cHBvcnRlZCJ9O2U9IiIrZX1kKGMsZSxiKX1yZXR1cm4gdm9pZCAwPT1iLm9mZnNldCYmKGIub2Zmc2V0PW51bGwpLGJ9KSxmPSEwLGc9LSgxLzApLGg9MDtoPGMubGVuZ3RoO2grKyl7dmFyIGk9Y1toXS5vZmZzZXQ7aWYobnVsbCE9aSl7aWYoZz5pKXRocm93e2NvZGU6RE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUixuYW1lOiJJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3IiLG1lc3NhZ2U6IktleWZyYW1lcyBhcmUgbm90IGxvb3NlbHkgc29ydGVkIGJ5IG9mZnNldC4gU29ydCBvciBzcGVjaWZ5IG9mZnNldHMuIn07Zz1pfWVsc2UgZj0hMX1yZXR1cm4gYz1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXQ+PTAmJmEub2Zmc2V0PD0xfSksZnx8YigpLGN9dmFyIGc9e2JhY2tncm91bmQ6WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kQXR0YWNobWVudCIsImJhY2tncm91bmRPcmlnaW4iLCJiYWNrZ3JvdW5kQ2xpcCIsImJhY2tncm91bmRDb2xvciJdLGJvcmRlcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRXaWR0aCJdLGJvcmRlckJvdHRvbTpbImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21Db2xvciJdLGJvcmRlckNvbG9yOlsiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiXSxib3JkZXJMZWZ0OlsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyUmFkaXVzOlsiYm9yZGVyVG9wTGVmdFJhZGl1cyIsImJvcmRlclRvcFJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIl0sYm9yZGVyUmlnaHQ6WyJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0Q29sb3IiXSxib3JkZXJUb3A6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wQ29sb3IiXSxib3JkZXJXaWR0aDpbImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIl0sZmxleDpbImZsZXhHcm93IiwiZmxleFNocmluayIsImZsZXhCYXNpcyJdLGZvbnQ6WyJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250U3R5bGUiLCJmb250VmFyaWFudCIsImZvbnRXZWlnaHQiLCJsaW5lSGVpZ2h0Il0sbWFyZ2luOlsibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5MZWZ0Il0sb3V0bGluZTpbIm91dGxpbmVDb2xvciIsIm91dGxpbmVTdHlsZSIsIm91dGxpbmVXaWR0aCJdLHBhZGRpbmc6WyJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0Il19LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IiksaT17dGhpbjoiMXB4IixtZWRpdW06IjNweCIsdGhpY2s6IjVweCJ9LGo9e2JvcmRlckJvdHRvbVdpZHRoOmksYm9yZGVyTGVmdFdpZHRoOmksYm9yZGVyUmlnaHRXaWR0aDppLGJvcmRlclRvcFdpZHRoOmksZm9udFNpemU6eyJ4eC1zbWFsbCI6IjYwJSIsIngtc21hbGwiOiI3NSUiLHNtYWxsOiI4OSUiLG1lZGl1bToiMTAwJSIsbGFyZ2U6IjEyMCUiLCJ4LWxhcmdlIjoiMTUwJSIsInh4LWxhcmdlIjoiMjAwJSJ9LGZvbnRXZWlnaHQ6e25vcm1hbDoiNDAwIixib2xkOiI3MDAifSxvdXRsaW5lV2lkdGg6aSx0ZXh0U2hhZG93Ontub25lOiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9LGJveFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggMHB4IHRyYW5zcGFyZW50In19O2EuY29udmVydFRvQXJyYXlGb3JtPWUsYS5ub3JtYWxpemVLZXlmcmFtZXM9Zn0oYyxmKSxmdW5jdGlvbihhKXt2YXIgYj17fTthLmlzRGVwcmVjYXRlZD1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyIsZz1uZXcgRGF0ZSxoPW5ldyBEYXRlKGMpO3JldHVybiBoLnNldE1vbnRoKGguZ2V0TW9udGgoKSszKSxoPmc/KGEgaW4gYnx8Y29uc29sZS53YXJuKCJXZWIgQW5pbWF0aW9uczogIithKyIgIitmKyIgZGVwcmVjYXRlZCBhbmQgd2lsbCBzdG9wIHdvcmtpbmcgb24gIitoLnRvRGF0ZVN0cmluZygpKyIuICIrZCksYlthXT0hMCwhMSk6ITB9LGEuZGVwcmVjYXRlZD1mdW5jdGlvbihiLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyI7aWYoYS5pc0RlcHJlY2F0ZWQoYixjLGQsZSkpdGhyb3cgbmV3IEVycm9yKGIrIiAiK2YrIiBubyBsb25nZXIgc3VwcG9ydGVkLiAiK2QpfX0oYyksZnVuY3Rpb24oKXtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYW5pbWF0ZSl7dmFyIGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUoW10sMCksYj0hMDtpZihhJiYoYj0hMSwicGxheXxjdXJyZW50VGltZXxwYXVzZXxyZXZlcnNlfHBsYXliYWNrUmF0ZXxjYW5jZWx8ZmluaXNofHN0YXJ0VGltZXxwbGF5U3RhdGUiLnNwbGl0KCJ8IikuZm9yRWFjaChmdW5jdGlvbihjKXt2b2lkIDA9PT1hW2NdJiYoYj0hMCl9KSksIWIpcmV0dXJufSFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBhW2NdKWlmKCJvZmZzZXQiIT1kJiYiZWFzaW5nIiE9ZCYmImNvbXBvc2l0ZSIhPWQpe3ZhciBlPXtvZmZzZXQ6YVtjXS5vZmZzZXQsZWFzaW5nOmFbY10uZWFzaW5nLHZhbHVlOmFbY11bZF19O2JbZF09YltkXXx8W10sYltkXS5wdXNoKGUpfWZvcih2YXIgZiBpbiBiKXt2YXIgZz1iW2ZdO2lmKDAhPWdbMF0ub2Zmc2V0fHwxIT1nW2cubGVuZ3RoLTFdLm9mZnNldCl0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiUGFydGlhbCBrZXlmcmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQifX1yZXR1cm4gYn1mdW5jdGlvbiBlKGMpe3ZhciBkPVtdO2Zvcih2YXIgZSBpbiBjKWZvcih2YXIgZj1jW2VdLGc9MDtnPGYubGVuZ3RoLTE7ZysrKXt2YXIgaD1mW2ddLm9mZnNldCxpPWZbZysxXS5vZmZzZXQsaj1mW2ddLnZhbHVlLGs9ZltnKzFdLnZhbHVlLGw9ZltnXS5lYXNpbmc7aD09aSYmKDE9PWk/aj1rOms9aiksZC5wdXNoKHtzdGFydFRpbWU6aCxlbmRUaW1lOmksZWFzaW5nOmEudG9UaW1pbmdGdW5jdGlvbihsP2w6ImxpbmVhciIpLHByb3BlcnR5OmUsaW50ZXJwb2xhdGlvbjpiLnByb3BlcnR5SW50ZXJwb2xhdGlvbihlLGosayl9KX1yZXR1cm4gZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3RhcnRUaW1lLWIuc3RhcnRUaW1lfSksZH1iLmNvbnZlcnRFZmZlY3RJbnB1dD1mdW5jdGlvbihjKXt2YXIgZj1hLm5vcm1hbGl6ZUtleWZyYW1lcyhjKSxnPWQoZiksaD1lKGcpO3JldHVybiBmdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpaC5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIDA+PWMmJjA9PWEuc3RhcnRUaW1lfHxjPj0xJiYxPT1hLmVuZFRpbWV8fGM+PWEuc3RhcnRUaW1lJiZjPD1hLmVuZFRpbWV9KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWMtZC5zdGFydFRpbWUsZj1kLmVuZFRpbWUtZC5zdGFydFRpbWUsZz0wPT1mPzA6ZC5lYXNpbmcoZS9mKTtiLmFwcGx5KGEsZC5wcm9wZXJ0eSxkLmludGVycG9sYXRpb24oZykpfSk7ZWxzZSBmb3IodmFyIGQgaW4gZykib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kJiZiLmNsZWFyKGEsZCl9fX0oYyxkLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KX1mdW5jdGlvbiBlKGEsYixjKXtoW2NdPWhbY118fFtdLGhbY10ucHVzaChbYSxiXSl9ZnVuY3Rpb24gZihhLGIsYyl7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe3ZhciBnPWNbZl07ZShhLGIsZChnKSl9fWZ1bmN0aW9uIGcoYyxlLGYpe3ZhciBnPWM7Ly0vLnRlc3QoYykmJiFhLmlzRGVwcmVjYXRlZCgiSHlwaGVuYXRlZCBwcm9wZXJ0eSBuYW1lcyIsIjIwMTYtMDMtMjIiLCJVc2UgY2FtZWxDYXNlIGluc3RlYWQuIiwhMCkmJihnPWQoYykpLCJpbml0aWFsIiE9ZSYmImluaXRpYWwiIT1mfHwoImluaXRpYWwiPT1lJiYoZT1pW2ddKSwiaW5pdGlhbCI9PWYmJihmPWlbZ10pKTtmb3IodmFyIGo9ZT09Zj9bXTpoW2ddLGs9MDtqJiZrPGoubGVuZ3RoO2srKyl7dmFyIGw9altrXVswXShlKSxtPWpba11bMF0oZik7aWYodm9pZCAwIT09bCYmdm9pZCAwIT09bSl7dmFyIG49altrXVsxXShsLG0pO2lmKG4pe3ZhciBvPWIuSW50ZXJwb2xhdGlvbi5hcHBseShudWxsLG4pO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gMD09YT9lOjE9PWE/ZjpvKGEpfX19fXJldHVybiBiLkludGVycG9sYXRpb24oITEsITAsZnVuY3Rpb24oYSl7cmV0dXJuIGE/ZjplfSl9dmFyIGg9e307Yi5hZGRQcm9wZXJ0aWVzSGFuZGxlcj1mO3ZhciBpPXtiYWNrZ3JvdW5kQ29sb3I6InRyYW5zcGFyZW50IixiYWNrZ3JvdW5kUG9zaXRpb246IjAlIDAlIixib3JkZXJCb3R0b21Db2xvcjoiY3VycmVudENvbG9yIixib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIzcHgiLGJvcmRlckxlZnRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJMZWZ0V2lkdGg6IjNweCIsYm9yZGVyUmlnaHRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJSaWdodFdpZHRoOiIzcHgiLGJvcmRlclNwYWNpbmc6IjJweCIsYm9yZGVyVG9wQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyVG9wTGVmdFJhZGl1czoiMHB4Iixib3JkZXJUb3BSaWdodFJhZGl1czoiMHB4Iixib3JkZXJUb3BXaWR0aDoiM3B4Iixib3R0b206ImF1dG8iLGNsaXA6InJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KSIsY29sb3I6ImJsYWNrIixmb250U2l6ZToiMTAwJSIsZm9udFdlaWdodDoiNDAwIixoZWlnaHQ6ImF1dG8iLGxlZnQ6ImF1dG8iLGxldHRlclNwYWNpbmc6Im5vcm1hbCIsbGluZUhlaWdodDoiMTIwJSIsbWFyZ2luQm90dG9tOiIwcHgiLG1hcmdpbkxlZnQ6IjBweCIsbWFyZ2luUmlnaHQ6IjBweCIsbWFyZ2luVG9wOiIwcHgiLG1heEhlaWdodDoibm9uZSIsbWF4V2lkdGg6Im5vbmUiLG1pbkhlaWdodDoiMHB4IixtaW5XaWR0aDoiMHB4IixvcGFjaXR5OiIxLjAiLG91dGxpbmVDb2xvcjoiaW52ZXJ0IixvdXRsaW5lT2Zmc2V0OiIwcHgiLG91dGxpbmVXaWR0aDoiM3B4IixwYWRkaW5nQm90dG9tOiIwcHgiLHBhZGRpbmdMZWZ0OiIwcHgiLHBhZGRpbmdSaWdodDoiMHB4IixwYWRkaW5nVG9wOiIwcHgiLHJpZ2h0OiJhdXRvIix0ZXh0SW5kZW50OiIwcHgiLHRleHRTaGFkb3c6IjBweCAwcHggMHB4IHRyYW5zcGFyZW50Iix0b3A6ImF1dG8iLHRyYW5zZm9ybToiIix2ZXJ0aWNhbEFsaWduOiIwcHgiLHZpc2liaWxpdHk6InZpc2libGUiLHdpZHRoOiJhdXRvIix3b3JkU3BhY2luZzoibm9ybWFsIix6SW5kZXg6ImF1dG8ifTtiLnByb3BlcnR5SW50ZXJwb2xhdGlvbj1nfShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dmFyIGM9YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihiKSxkPWZ1bmN0aW9uKGQpe3JldHVybiBhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihjLGQsYil9O3JldHVybiBkLl90b3RhbER1cmF0aW9uPWIuZGVsYXkrYytiLmVuZERlbGF5LGQuX2lzQ3VycmVudD1mdW5jdGlvbihkKXt2YXIgZT1hLmNhbGN1bGF0ZVBoYXNlKGMsZCxiKTtyZXR1cm4gZT09PVBoYXNlQWN0aXZlfHxlPT09UGhhc2VCZWZvcmV9LGR9Yi5LZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihjLGUsZixnKXt2YXIgaCxpPWQoYS5ub3JtYWxpemVUaW1pbmdJbnB1dChmKSksaj1iLmNvbnZlcnRFZmZlY3RJbnB1dChlKSxrPWZ1bmN0aW9uKCl7aihjLGgpfTtyZXR1cm4gay5fdXBkYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBoPWkoYSksbnVsbCE9PWh9LGsuX2NsZWFyPWZ1bmN0aW9uKCl7aihjLG51bGwpfSxrLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBjPT09YX0say5faXNDdXJyZW50PWkuX2lzQ3VycmVudCxrLl90b3RhbER1cmF0aW9uPWkuX3RvdGFsRHVyYXRpb24say5faWQ9ZyxrfSxiLk51bGxFZmZlY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oKXthJiYoYSgpLGE9bnVsbCl9O3JldHVybiBiLl91cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sYi5fdG90YWxEdXJhdGlvbj0wLGIuX2lzQ3VycmVudD1mdW5jdGlvbigpe3JldHVybiExfSxiLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LGJ9fShjLGQsZiksZnVuY3Rpb24oYSxiKXthLmFwcGx5PWZ1bmN0aW9uKGIsYyxkKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT1kfSxhLmNsZWFyPWZ1bmN0aW9uKGIsYyl7Yi5zdHlsZVthLnByb3BlcnR5TmFtZShjKV09IiJ9fShkLGYpLGZ1bmN0aW9uKGEpe3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGEudGltZWxpbmUuX3BsYXkoYS5LZXlmcmFtZUVmZmVjdCh0aGlzLGIsYyxkKSl9fShkKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGQpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmIm51bWJlciI9PXR5cGVvZiBiKXJldHVybiBhKigxLWQpK2IqZDtpZigiYm9vbGVhbiI9PXR5cGVvZiBhJiYiYm9vbGVhbiI9PXR5cGVvZiBiKXJldHVybi41PmQ/YTpiO2lmKGEubGVuZ3RoPT1iLmxlbmd0aCl7Zm9yKHZhciBlPVtdLGY9MDtmPGEubGVuZ3RoO2YrKyllLnB1c2goYyhhW2ZdLGJbZl0sZCkpO3JldHVybiBlfXRocm93Ik1pc21hdGNoZWQgaW50ZXJwb2xhdGlvbiBhcmd1bWVudHMgIithKyI6IitifWEuSW50ZXJwb2xhdGlvbj1mdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBkKGMoYSxiLGUpKX19fShkLGYpLGZ1bmN0aW9uKGEsYixjKXthLnNlcXVlbmNlTnVtYmVyPTA7dmFyIGQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJmaW5pc2giLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX07Yi5BbmltYXRpb249ZnVuY3Rpb24oYil7dGhpcy5pZD0iIixiJiZiLl9pZCYmKHRoaXMuaWQ9Yi5faWQpLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9jdXJyZW50VGltZT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9pblRpbWVsaW5lPSEwLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMCx0aGlzLm9uZmluaXNoPW51bGwsdGhpcy5fZmluaXNoSGFuZGxlcnM9W10sdGhpcy5fZWZmZWN0PWIsdGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoMCksdGhpcy5faWRsZT0hMCx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITF9LGIuQW5pbWF0aW9uLnByb3RvdHlwZT17X2Vuc3VyZUFsaXZlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGU8MCYmMD09PXRoaXMuY3VycmVudFRpbWU/dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoLTEpOnRoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKHRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2luVGltZWxpbmV8fCF0aGlzLl9pbkVmZmVjdCYmdGhpcy5fZmluaXNoZWRGbGFnfHwodGhpcy5faW5UaW1lbGluZT0hMCxiLnRpbWVsaW5lLl9hbmltYXRpb25zLnB1c2godGhpcykpfSxfdGlja0N1cnJlbnRUaW1lOmZ1bmN0aW9uKGEsYil7YSE9dGhpcy5fY3VycmVudFRpbWUmJih0aGlzLl9jdXJyZW50VGltZT1hLHRoaXMuX2lzRmluaXNoZWQmJiFiJiYodGhpcy5fY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowKSx0aGlzLl9lbnN1cmVBbGl2ZSgpKX0sZ2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX2lkbGV8fHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz9udWxsOnRoaXMuX2N1cnJlbnRUaW1lfSxzZXQgY3VycmVudFRpbWUoYSl7YT0rYSxpc05hTihhKXx8KGIucmVzdGFydCgpLHRoaXMuX3BhdXNlZHx8bnVsbD09dGhpcy5fc3RhcnRUaW1lfHwodGhpcy5fc3RhcnRUaW1lPXRoaXMuX3RpbWVsaW5lLmN1cnJlbnRUaW1lLWEvdGhpcy5fcGxheWJhY2tSYXRlKSx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fY3VycmVudFRpbWUhPWEmJih0aGlzLl90aWNrQ3VycmVudFRpbWUoYSwhMCksYi5pbnZhbGlkYXRlRWZmZWN0cygpKSl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX3N0YXJ0VGltZT1hLHRoaXMuX3RpY2tDdXJyZW50VGltZSgodGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSksYi5pbnZhbGlkYXRlRWZmZWN0cygpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7aWYoYSE9dGhpcy5fcGxheWJhY2tSYXRlKXt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX3BsYXliYWNrUmF0ZT1hLHRoaXMuX3N0YXJ0VGltZT1udWxsLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9YiYmKHRoaXMuY3VycmVudFRpbWU9Yil9fSxnZXQgX2lzRmluaXNoZWQoKXtyZXR1cm4hdGhpcy5faWRsZSYmKHRoaXMuX3BsYXliYWNrUmF0ZT4wJiZ0aGlzLl9jdXJyZW50VGltZT49dGhpcy5fdG90YWxEdXJhdGlvbnx8dGhpcy5fcGxheWJhY2tSYXRlPDAmJnRoaXMuX2N1cnJlbnRUaW1lPD0wKX0sZ2V0IF90b3RhbER1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdC5fdG90YWxEdXJhdGlvbn0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9pZGxlPyJpZGxlIjpudWxsPT10aGlzLl9zdGFydFRpbWUmJiF0aGlzLl9wYXVzZWQmJjAhPXRoaXMucGxheWJhY2tSYXRlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/InBlbmRpbmciOnRoaXMuX3BhdXNlZD8icGF1c2VkIjp0aGlzLl9pc0ZpbmlzaGVkPyJmaW5pc2hlZCI6InJ1bm5pbmcifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSExLCh0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9pZGxlKSYmKHRoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wPzA6dGhpcy5fdG90YWxEdXJhdGlvbix0aGlzLl9zdGFydFRpbWU9bnVsbCksdGhpcy5fZmluaXNoZWRGbGFnPSExLHRoaXMuX2lkbGU9ITEsdGhpcy5fZW5zdXJlQWxpdmUoKSxiLmludmFsaWRhdGVFZmZlY3RzKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fcGF1c2VkfHx0aGlzLl9pZGxlfHwodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSEwKSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9wYXVzZWQ9ITB9LGZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX2lkbGV8fCh0aGlzLmN1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wP3RoaXMuX3RvdGFsRHVyYXRpb246MCx0aGlzLl9zdGFydFRpbWU9dGhpcy5fdG90YWxEdXJhdGlvbi10aGlzLmN1cnJlbnRUaW1lLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLl9pbkVmZmVjdCYmKHRoaXMuX2luRWZmZWN0PSExLHRoaXMuX2lkbGU9ITAsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMuY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9lZmZlY3QuX3VwZGF0ZShudWxsKSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGUqPS0xLHRoaXMucGxheSgpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJmaW5pc2giPT1hJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5wdXNoKGIpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7aWYoImZpbmlzaCI9PWEpe3ZhciBjPXRoaXMuX2ZpbmlzaEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fZmluaXNoSGFuZGxlcnMuc3BsaWNlKGMsMSl9fSxfZmlyZUV2ZW50czpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0ZpbmlzaGVkKXtpZighdGhpcy5fZmluaXNoZWRGbGFnKXt2YXIgYj1uZXcgZCh0aGlzLHRoaXMuX2N1cnJlbnRUaW1lLGEpLGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuY29uY2F0KHRoaXMub25maW5pc2g/W3RoaXMub25maW5pc2hdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChiLnRhcmdldCxiKX0pfSwwKSx0aGlzLl9maW5pc2hlZEZsYWc9ITB9fWVsc2UgdGhpcy5fZmluaXNoZWRGbGFnPSExfSxfdGljazpmdW5jdGlvbihhLGIpe3RoaXMuX2lkbGV8fHRoaXMuX3BhdXNlZHx8KG51bGw9PXRoaXMuX3N0YXJ0VGltZT9iJiYodGhpcy5zdGFydFRpbWU9YS10aGlzLl9jdXJyZW50VGltZS90aGlzLnBsYXliYWNrUmF0ZSk6dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fdGlja0N1cnJlbnRUaW1lKChhLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5wbGF5YmFja1JhdGUpKSxiJiYodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLHRoaXMuX2ZpcmVFdmVudHMoYSkpfSxnZXQgX25lZWRzVGljaygpe3JldHVybiB0aGlzLnBsYXlTdGF0ZSBpbntwZW5kaW5nOjEscnVubmluZzoxfXx8IXRoaXMuX2ZpbmlzaGVkRmxhZ319fShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9ajtqPVtdLGE8cC5jdXJyZW50VGltZSYmKGE9cC5jdXJyZW50VGltZSksaChhLCEwKSxiLmZvckVhY2goZnVuY3Rpb24oYil7YlsxXShhKX0pLGcoKSxsPXZvaWQgMH1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGEuX3NlcXVlbmNlTnVtYmVyLWIuX3NlcXVlbmNlTnVtYmVyfWZ1bmN0aW9uIGYoKXt0aGlzLl9hbmltYXRpb25zPVtdLHRoaXMuY3VycmVudFRpbWU9d2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCk6MH1mdW5jdGlvbiBnKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EoKX0pLG8ubGVuZ3RoPTB9ZnVuY3Rpb24gaChhLGMpe249ITE7dmFyIGQ9Yi50aW1lbGluZTtkLmN1cnJlbnRUaW1lPWEsZC5fYW5pbWF0aW9ucy5zb3J0KGUpLG09ITE7dmFyIGY9ZC5fYW5pbWF0aW9ucztkLl9hbmltYXRpb25zPVtdO3ZhciBnPVtdLGg9W107Zj1mLmZpbHRlcihmdW5jdGlvbihiKXtiLl90aWNrKGEsYyksYi5faW5FZmZlY3Q/aC5wdXNoKGIuX2VmZmVjdCk6Zy5wdXNoKGIuX2VmZmVjdCksYi5fbmVlZHNUaWNrJiYobT0hMCk7dmFyIGQ9Yi5faW5FZmZlY3R8fGIuX25lZWRzVGljaztyZXR1cm4gYi5faW5UaW1lbGluZT1kLGR9KSxvLnB1c2guYXBwbHkobyxnKSxvLnB1c2guYXBwbHkobyxoKSxkLl9hbmltYXRpb25zLnB1c2guYXBwbHkoZC5fYW5pbWF0aW9ucyxmKSxtJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt9KX12YXIgaT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLGo9W10saz0wO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7dmFyIGI9aysrO3JldHVybiAwPT1qLmxlbmd0aCYmaShkKSxqLnB1c2goW2IsYV0pLGJ9LHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZT1mdW5jdGlvbihhKXtqLmZvckVhY2goZnVuY3Rpb24oYil7YlswXT09YSYmKGJbMV09ZnVuY3Rpb24oKXt9KX0pfSxmLnByb3RvdHlwZT17X3BsYXk6ZnVuY3Rpb24oYyl7Yy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy50aW1pbmcpO3ZhciBkPW5ldyBiLkFuaW1hdGlvbihjKTtyZXR1cm4gZC5faWRsZT0hMSxkLl90aW1lbGluZT10aGlzLHRoaXMuX2FuaW1hdGlvbnMucHVzaChkKSxiLnJlc3RhcnQoKSxiLmludmFsaWRhdGVFZmZlY3RzKCksZH19O3ZhciBsPXZvaWQgMCxtPSExLG49ITE7Yi5yZXN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG18fChtPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLG49ITApLG59LGIuaW52YWxpZGF0ZUVmZmVjdHM9ZnVuY3Rpb24oKXtoKGIudGltZWxpbmUuY3VycmVudFRpbWUsITEpLGcoKX07dmFyIG89W10scD1uZXcgZjtiLnRpbWVsaW5lPXB9KGMsZCxmKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9YS5leGVjKGIpO3JldHVybiBjPyhjPWEuaWdub3JlQ2FzZT9jWzBdLnRvTG93ZXJDYXNlKCk6Y1swXSxbYyxiLnN1YnN0cihjLmxlbmd0aCldKTp2b2lkIDB9ZnVuY3Rpb24gYyhhLGIpe2I9Yi5yZXBsYWNlKC9eXHMqLywiIik7dmFyIGM9YShiKTtyZXR1cm4gYz9bY1swXSxjWzFdLnJlcGxhY2UoL15ccyovLCIiKV06dm9pZCAwfWZ1bmN0aW9uIGQoYSxkLGUpe2E9Yy5iaW5kKG51bGwsYSk7Zm9yKHZhciBmPVtdOzspe3ZhciBnPWEoZSk7aWYoIWcpcmV0dXJuW2YsZV07aWYoZi5wdXNoKGdbMF0pLGU9Z1sxXSxnPWIoZCxlKSwhZ3x8IiI9PWdbMV0pcmV0dXJuW2YsZV07ZT1nWzFdfX1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGgmJighL1xzfCwvLnRlc3QoYltkXSl8fDAhPWMpO2QrKylpZigiKCI9PWJbZF0pYysrO2Vsc2UgaWYoIikiPT1iW2RdJiYoYy0tLDA9PWMmJmQrKywwPj1jKSlicmVhazt2YXIgZT1hKGIuc3Vic3RyKDAsZCkpO3JldHVybiB2b2lkIDA9PWU/dm9pZCAwOltlLGIuc3Vic3RyKGQpXX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPWEsZD1iO2MmJmQ7KWM+ZD9jJT1kOmQlPWM7cmV0dXJuIGM9YSpiLyhjK2QpfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWEoYik7cmV0dXJuIGMmJihjWzBdPXZvaWQgMCksY319ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD1hKGMpO3JldHVybiBkP2Q6W2IsY119fWZ1bmN0aW9uIGkoYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8Yi5sZW5ndGg7ZSsrKXt2YXIgZj1hLmNvbnN1bWVUcmltbWVkKGJbZV0sYyk7aWYoIWZ8fCIiPT1mWzBdKXJldHVybjt2b2lkIDAhPT1mWzBdJiZkLnB1c2goZlswXSksYz1mWzFdfXJldHVybiIiPT1jP2Q6dm9pZCAwfWZ1bmN0aW9uIGooYSxiLGMsZCxlKXtmb3IodmFyIGc9W10saD1bXSxpPVtdLGo9ZihkLmxlbmd0aCxlLmxlbmd0aCksaz0wO2o+aztrKyspe3ZhciBsPWIoZFtrJWQubGVuZ3RoXSxlW2slZS5sZW5ndGhdKTtpZighbClyZXR1cm47Zy5wdXNoKGxbMF0pLGgucHVzaChsWzFdKSxpLnB1c2gobFsyXSl9cmV0dXJuW2csaCxmdW5jdGlvbihiKXt2YXIgZD1iLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiBpW2JdKGEpfSkuam9pbihjKTtyZXR1cm4gYT9hKGQpOmR9XX1mdW5jdGlvbiBrKGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPVtdLGc9MCxoPTA7aDxjLmxlbmd0aDtoKyspaWYoImZ1bmN0aW9uIj09dHlwZW9mIGNbaF0pe3ZhciBpPWNbaF0oYVtnXSxiW2crK10pO2QucHVzaChpWzBdKSxlLnB1c2goaVsxXSksZi5wdXNoKGlbMl0pfWVsc2UhZnVuY3Rpb24oYSl7ZC5wdXNoKCExKSxlLnB1c2goITEpLGYucHVzaChmdW5jdGlvbigpe3JldHVybiBjW2FdfSl9KGgpO3JldHVybltkLGUsZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1mW2NdKGFbY10pO3JldHVybiBifV19YS5jb25zdW1lVG9rZW49YixhLmNvbnN1bWVUcmltbWVkPWMsYS5jb25zdW1lUmVwZWF0ZWQ9ZCxhLmNvbnN1bWVQYXJlbnRoZXNpc2VkPWUsYS5pZ25vcmU9ZyxhLm9wdGlvbmFsPWgsYS5jb25zdW1lTGlzdD1pLGEubWVyZ2VOZXN0ZWRSZXBlYXRlZD1qLmJpbmQobnVsbCxudWxsKSxhLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkPWosYS5tZXJnZUxpc3Q9a30oZCksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmdW5jdGlvbiBjKGIpe3ZhciBjPWEuY29uc3VtZVRva2VuKC9eaW5zZXQvaSxiKTtpZihjKXJldHVybiBkLmluc2V0PSEwLGM7dmFyIGM9YS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50KGIpO2lmKGMpcmV0dXJuIGQubGVuZ3Rocy5wdXNoKGNbMF0pLGM7dmFyIGM9YS5jb25zdW1lQ29sb3IoYik7cmV0dXJuIGM/KGQuY29sb3I9Y1swXSxjKTp2b2lkIDB9dmFyIGQ9e2luc2V0OiExLGxlbmd0aHM6W10sY29sb3I6bnVsbH0sZT1hLmNvbnN1bWVSZXBlYXRlZChjLC9eLyxiKTtyZXR1cm4gZSYmZVswXS5sZW5ndGg/W2QsZVsxXV06dm9pZCAwfWZ1bmN0aW9uIGMoYyl7dmFyIGQ9YS5jb25zdW1lUmVwZWF0ZWQoYiwvXiwvLGMpO3JldHVybiBkJiYiIj09ZFsxXT9kWzBdOnZvaWQgMH1mdW5jdGlvbiBkKGIsYyl7Zm9yKDtiLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWIubGVuZ3Rocy5wdXNoKHtweDowfSk7Zm9yKDtjLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWMubGVuZ3Rocy5wdXNoKHtweDowfSk7aWYoYi5pbnNldD09Yy5pbnNldCYmISFiLmNvbG9yPT0hIWMuY29sb3Ipe2Zvcih2YXIgZCxlPVtdLGY9W1tdLDBdLGc9W1tdLDBdLGg9MDtoPGIubGVuZ3Rocy5sZW5ndGg7aCsrKXt2YXIgaT1hLm1lcmdlRGltZW5zaW9ucyhiLmxlbmd0aHNbaF0sYy5sZW5ndGhzW2hdLDI9PWgpO2ZbMF0ucHVzaChpWzBdKSxnWzBdLnB1c2goaVsxXSksZS5wdXNoKGlbMl0pfWlmKGIuY29sb3ImJmMuY29sb3Ipe3ZhciBqPWEubWVyZ2VDb2xvcnMoYi5jb2xvcixjLmNvbG9yKTtmWzFdPWpbMF0sZ1sxXT1qWzFdLGQ9alsyXX1yZXR1cm5bZixnLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1iLmluc2V0PyJpbnNldCAiOiIgIixmPTA7ZjxlLmxlbmd0aDtmKyspYys9ZVtmXShhWzBdW2ZdKSsiICI7cmV0dXJuIGQmJihjKz1kKGFbMV0pKSxjfV19fWZ1bmN0aW9uIGUoYixjLGQsZSl7ZnVuY3Rpb24gZihhKXtyZXR1cm57aW5zZXQ6YSxjb2xvcjpbMCwwLDAsMF0sbGVuZ3Roczpbe3B4OjB9LHtweDowfSx7cHg6MH0se3B4OjB9XX19Zm9yKHZhciBnPVtdLGg9W10saT0wO2k8ZC5sZW5ndGh8fGk8ZS5sZW5ndGg7aSsrKXt2YXIgaj1kW2ldfHxmKGVbaV0uaW5zZXQpLGs9ZVtpXXx8ZihkW2ldLmluc2V0KTtnLnB1c2goaiksaC5wdXNoKGspfXJldHVybiBhLm1lcmdlTmVzdGVkUmVwZWF0ZWQoYixjLGcsaCl9dmFyIGY9ZS5iaW5kKG51bGwsZCwiLCAiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZixbImJveC1zaGFkb3ciLCJ0ZXh0LXNoYWRvdyJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBhLnRvRml4ZWQoMykucmVwbGFjZSgiLjAwMCIsIiIpfWZ1bmN0aW9uIGQoYSxiLGMpe3JldHVybiBNYXRoLm1pbihiLE1hdGgubWF4KGEsYykpfWZ1bmN0aW9uIGUoYSl7cmV0dXJuL15ccypbLStdPyhcZCpcLik/XGQrXHMqJC8udGVzdChhKT9OdW1iZXIoYSk6dm9pZCAwfWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm5bYSxiLGNdfWZ1bmN0aW9uIGcoYSxiKXtyZXR1cm4gMCE9YT9pKDAsMS8wKShhLGIpOnZvaWQgMH1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChkKDEsMS8wLGEpKX1dfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm5bZSxmLGZ1bmN0aW9uKGUpe3JldHVybiBjKGQoYSxiLGUpKX1dfX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuW2EsYixNYXRoLnJvdW5kXX1hLmNsYW1wPWQsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxLzApLFsiYm9yZGVyLWltYWdlLXdpZHRoIiwibGluZS1oZWlnaHQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxKSxbIm9wYWNpdHkiLCJzaGFwZS1pbWFnZS10aHJlc2hvbGQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGcsWyJmbGV4LWdyb3ciLCJmbGV4LXNocmluayJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaCxbIm9ycGhhbnMiLCJ3aWRvd3MiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ6LWluZGV4Il0pLGEucGFyc2VOdW1iZXI9ZSxhLm1lcmdlTnVtYmVycz1mLGEubnVtYmVyVG9TdHJpbmc9Y30oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4idmlzaWJsZSI9PWF8fCJ2aXNpYmxlIj09Yj9bMCwxLGZ1bmN0aW9uKGMpe3JldHVybiAwPj1jP2E6Yz49MT9iOiJ2aXNpYmxlIn1dOnZvaWQgMH1hLmFkZFByb3BlcnRpZXNIYW5kbGVyKFN0cmluZyxjLFsidmlzaWJpbGl0eSJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2E9YS50cmltKCksZi5maWxsU3R5bGU9IiMwMDAiLGYuZmlsbFN0eWxlPWE7dmFyIGI9Zi5maWxsU3R5bGU7aWYoZi5maWxsU3R5bGU9IiNmZmYiLGYuZmlsbFN0eWxlPWEsYj09Zi5maWxsU3R5bGUpe2YuZmlsbFJlY3QoMCwwLDEsMSk7dmFyIGM9Zi5nZXRJbWFnZURhdGEoMCwwLDEsMSkuZGF0YTtmLmNsZWFyUmVjdCgwLDAsMSwxKTt2YXIgZD1jWzNdLzI1NTtyZXR1cm5bY1swXSpkLGNbMV0qZCxjWzJdKmQsZF19fWZ1bmN0aW9uIGQoYixjKXtyZXR1cm5bYixjLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LGEpKX1pZihiWzNdKWZvcih2YXIgZD0wOzM+ZDtkKyspYltkXT1NYXRoLnJvdW5kKGMoYltkXS9iWzNdKSk7cmV0dXJuIGJbM109YS5udW1iZXJUb1N0cmluZyhhLmNsYW1wKDAsMSxiWzNdKSksInJnYmEoIitiLmpvaW4oIiwiKSsiKSJ9XX12YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKTtlLndpZHRoPWUuaGVpZ2h0PTE7dmFyIGY9ZS5nZXRDb250ZXh0KCIyZCIpO2EuYWRkUHJvcGVydGllc0hhbmRsZXIoYyxkLFsiYmFja2dyb3VuZC1jb2xvciIsImJvcmRlci1ib3R0b20tY29sb3IiLCJib3JkZXItbGVmdC1jb2xvciIsImJvcmRlci1yaWdodC1jb2xvciIsImJvcmRlci10b3AtY29sb3IiLCJjb2xvciIsIm91dGxpbmUtY29sb3IiLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiXSksYS5jb25zdW1lQ29sb3I9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsYyksYS5tZXJnZUNvbG9ycz1kfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGI9Yi50cmltKCkudG9Mb3dlckNhc2UoKSwiMCI9PWImJiJweCIuc2VhcmNoKGEpPj0wKXJldHVybntweDowfTtpZigvXlteKF0qJHxeY2FsYy8udGVzdChiKSl7Yj1iLnJlcGxhY2UoL2NhbGNcKC9nLCIoIik7dmFyIGM9e307Yj1iLnJlcGxhY2UoYSxmdW5jdGlvbihhKXtyZXR1cm4gY1thXT1udWxsLCJVIithfSk7Zm9yKHZhciBkPSJVKCIrYS5zb3VyY2UrIikiLGU9Yi5yZXBsYWNlKC9bLStdPyhcZCpcLik/XGQrL2csIk4iKS5yZXBsYWNlKG5ldyBSZWdFeHAoIk4iK2QsImciKSwiRCIpLnJlcGxhY2UoL1xzWystXVxzL2csIk8iKS5yZXBsYWNlKC9ccy9nLCIiKSxmPVsvTlwqKEQpL2csLyhOfEQpWypcL11OL2csLyhOfEQpT1wxL2csL1woKE58RClcKS9nXSxnPTA7ZzxmLmxlbmd0aDspZltnXS50ZXN0KGUpPyhlPWUucmVwbGFjZShmW2ddLCIkMSIpLGc9MCk6ZysrO2lmKCJEIj09ZSl7Zm9yKHZhciBoIGluIGMpe3ZhciBpPWV2YWwoYi5yZXBsYWNlKG5ldyBSZWdFeHAoIlUiK2gsImciKSwiIikucmVwbGFjZShuZXcgUmVnRXhwKGQsImciKSwiKjAiKSk7aWYoIWlzRmluaXRlKGkpKXJldHVybjtjW2hdPWl9cmV0dXJuIGN9fX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGUoYSxiLCEwKX1mdW5jdGlvbiBlKGIsYyxkKXt2YXIgZSxmPVtdO2ZvcihlIGluIGIpZi5wdXNoKGUpO2ZvcihlIGluIGMpZi5pbmRleE9mKGUpPDAmJmYucHVzaChlKTtyZXR1cm4gYj1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYlthXXx8MH0pLGM9Zi5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV18fDB9KSxbYixjLGZ1bmN0aW9uKGIpe3ZhciBjPWIubWFwKGZ1bmN0aW9uKGMsZSl7cmV0dXJuIDE9PWIubGVuZ3RoJiZkJiYoYz1NYXRoLm1heChjLDApKSxhLm51bWJlclRvU3RyaW5nKGMpK2ZbZV19KS5qb2luKCIgKyAiKTtyZXR1cm4gYi5sZW5ndGg+MT8iY2FsYygiK2MrIikiOmN9XX12YXIgZj0icHh8ZW18ZXh8Y2h8cmVtfHZ3fHZofHZtaW58dm1heHxjbXxtbXxpbnxwdHxwYyIsZz1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYsImciKSksaD1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYrInwlIiwiZyIpKSxpPWMuYmluZChudWxsLC9kZWd8cmFkfGdyYWR8dHVybi9nKTthLnBhcnNlTGVuZ3RoPWcsYS5wYXJzZUxlbmd0aE9yUGVyY2VudD1oLGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudD1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxoKSxhLnBhcnNlQW5nbGU9aSxhLm1lcmdlRGltZW5zaW9ucz1lO3ZhciBqPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGcpLGs9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaiwvXi8pLGw9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaywvXiwvKTthLmNvbnN1bWVTaXplUGFpckxpc3Q9bDt2YXIgbT1mdW5jdGlvbihhKXt2YXIgYj1sKGEpO3JldHVybiBiJiYiIj09YlsxXT9iWzBdOnZvaWQgMH0sbj1hLm1lcmdlTmVzdGVkUmVwZWF0ZWQuYmluZCh2b2lkIDAsZCwiICIpLG89YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLG4sIiwiKTthLm1lcmdlTm9uTmVnYXRpdmVTaXplUGFpcj1uLGEuYWRkUHJvcGVydGllc0hhbmRsZXIobSxvLFsiYmFja2dyb3VuZC1zaXplIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaCxkLFsiYm9yZGVyLWJvdHRvbS13aWR0aCIsImJvcmRlci1pbWFnZS13aWR0aCIsImJvcmRlci1sZWZ0LXdpZHRoIiwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwiYm9yZGVyLXRvcC13aWR0aCIsImZsZXgtYmFzaXMiLCJmb250LXNpemUiLCJoZWlnaHQiLCJsaW5lLWhlaWdodCIsIm1heC1oZWlnaHQiLCJtYXgtd2lkdGgiLCJvdXRsaW5lLXdpZHRoIiwid2lkdGgiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihoLGUsWyJib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIiwiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLCJib3JkZXItdG9wLWxlZnQtcmFkaXVzIiwiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMiLCJib3R0b20iLCJsZWZ0IiwibGV0dGVyLXNwYWNpbmciLCJtYXJnaW4tYm90dG9tIiwibWFyZ2luLWxlZnQiLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW4tdG9wIiwibWluLWhlaWdodCIsIm1pbi13aWR0aCIsIm91dGxpbmUtb2Zmc2V0IiwicGFkZGluZy1ib3R0b20iLCJwYWRkaW5nLWxlZnQiLCJwYWRkaW5nLXJpZ2h0IiwicGFkZGluZy10b3AiLCJwZXJzcGVjdGl2ZSIsInJpZ2h0Iiwic2hhcGUtbWFyZ2luIiwidGV4dC1pbmRlbnQiLCJ0b3AiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndvcmQtc3BhY2luZyJdKX0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYil7cmV0dXJuIGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudChiKXx8YS5jb25zdW1lVG9rZW4oL15hdXRvLyxiKX1mdW5jdGlvbiBkKGIpe3ZhciBkPWEuY29uc3VtZUxpc3QoW2EuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXnJlY3QvKSksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCgvKSksYS5jb25zdW1lUmVwZWF0ZWQuYmluZChudWxsLGMsL14sLyksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCkvKSldLGIpO3JldHVybiBkJiY0PT1kWzBdLmxlbmd0aD9kWzBdOnZvaWQgMH1mdW5jdGlvbiBlKGIsYyl7cmV0dXJuImF1dG8iPT1ifHwiYXV0byI9PWM/WyEwLCExLGZ1bmN0aW9uKGQpe3ZhciBlPWQ/YjpjO2lmKCJhdXRvIj09ZSlyZXR1cm4iYXV0byI7dmFyIGY9YS5tZXJnZURpbWVuc2lvbnMoZSxlKTtyZXR1cm4gZlsyXShmWzBdKX1dOmEubWVyZ2VEaW1lbnNpb25zKGIsYyl9ZnVuY3Rpb24gZihhKXtyZXR1cm4icmVjdCgiK2ErIikifXZhciBnPWEubWVyZ2VXcmFwcGVkTmVzdGVkUmVwZWF0ZWQuYmluZChudWxsLGYsZSwiLCAiKTthLnBhcnNlQm94PWQsYS5tZXJnZUJveGVzPWcsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihkLGcsWyJjbGlwIl0pfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9MDtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1rP2JbYysrXTphfSl9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gZShiKXtpZihiPWIudG9Mb3dlckNhc2UoKS50cmltKCksIm5vbmUiPT1iKXJldHVybltdO2Zvcih2YXIgYyxkPS9ccyooXHcrKVwoKFteKV0qKVwpL2csZT1bXSxmPTA7Yz1kLmV4ZWMoYik7KXtpZihjLmluZGV4IT1mKXJldHVybjtmPWMuaW5kZXgrY1swXS5sZW5ndGg7dmFyIGc9Y1sxXSxoPW5bZ107aWYoIWgpcmV0dXJuO3ZhciBpPWNbMl0uc3BsaXQoIiwiKSxqPWhbMF07aWYoai5sZW5ndGg8aS5sZW5ndGgpcmV0dXJuO2Zvcih2YXIgaz1bXSxvPTA7bzxqLmxlbmd0aDtvKyspe3ZhciBwLHE9aVtvXSxyPWpbb107aWYocD1xP3tBOmZ1bmN0aW9uKGIpe3JldHVybiIwIj09Yi50cmltKCk/bTphLnBhcnNlQW5nbGUoYil9LE46YS5wYXJzZU51bWJlcixUOmEucGFyc2VMZW5ndGhPclBlcmNlbnQsTDphLnBhcnNlTGVuZ3RofVtyLnRvVXBwZXJDYXNlKCldKHEpOnthOm0sbjprWzBdLHQ6bH1bcl0sdm9pZCAwPT09cClyZXR1cm47ay5wdXNoKHApfWlmKGUucHVzaCh7dDpnLGQ6a30pLGQubGFzdEluZGV4PT1iLmxlbmd0aClyZXR1cm4gZX19ZnVuY3Rpb24gZihhKXtyZXR1cm4gYS50b0ZpeGVkKDYpLnJlcGxhY2UoIi4wMDAwMDAiLCIiKX1mdW5jdGlvbiBnKGIsYyl7aWYoYi5kZWNvbXBvc2l0aW9uUGFpciE9PWMpe2IuZGVjb21wb3NpdGlvblBhaXI9Yzt2YXIgZD1hLm1ha2VNYXRyaXhEZWNvbXBvc2l0aW9uKGIpfWlmKGMuZGVjb21wb3NpdGlvblBhaXIhPT1iKXtjLmRlY29tcG9zaXRpb25QYWlyPWI7dmFyIGU9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihjKX1yZXR1cm4gbnVsbD09ZFswXXx8bnVsbD09ZVswXT9bWyExXSxbITBdLGZ1bmN0aW9uKGEpe3JldHVybiBhP2NbMF0uZDpiWzBdLmR9XTooZFswXS5wdXNoKDApLGVbMF0ucHVzaCgxKSxbZCxlLGZ1bmN0aW9uKGIpe3ZhciBjPWEucXVhdChkWzBdWzNdLGVbMF1bM10sYls1XSksZz1hLmNvbXBvc2VNYXRyaXgoYlswXSxiWzFdLGJbMl0sYyxiWzRdKSxoPWcubWFwKGYpLmpvaW4oIiwiKTtyZXR1cm4gaH1dKX1mdW5jdGlvbiBoKGEpe3JldHVybiBhLnJlcGxhY2UoL1t4eV0vLCIiKX1mdW5jdGlvbiBpKGEpe3JldHVybiBhLnJlcGxhY2UoLyh4fHl8enwzZCk/JC8sIjNkIil9ZnVuY3Rpb24gaihiLGMpe3ZhciBkPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24mJiEwLGU9ITE7aWYoIWIubGVuZ3RofHwhYy5sZW5ndGgpe2IubGVuZ3RofHwoZT0hMCxiPWMsYz1bXSk7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqPWJbZl0udCxrPWJbZl0uZCxsPSJzY2FsZSI9PWouc3Vic3RyKDAsNSk/MTowO2MucHVzaCh7dDpqLGQ6ay5tYXAoZnVuY3Rpb24oYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiBsO3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109bDtyZXR1cm4gYn0pfSl9fXZhciBtPWZ1bmN0aW9uKGEsYil7cmV0dXJuInBlcnNwZWN0aXZlIj09YSYmInBlcnNwZWN0aXZlIj09Ynx8KCJtYXRyaXgiPT1hfHwibWF0cml4M2QiPT1hKSYmKCJtYXRyaXgiPT1ifHwibWF0cml4M2QiPT1iKX0sbz1bXSxwPVtdLHE9W107aWYoYi5sZW5ndGghPWMubGVuZ3RoKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXX1lbHNlIGZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKXt2YXIgaixzPWJbZl0udCx0PWNbZl0udCx1PWJbZl0uZCx2PWNbZl0uZCx3PW5bc10seD1uW3RdO2lmKG0ocyx0KSl7aWYoIWQpcmV0dXJuO3ZhciByPWcoW2JbZl1dLFtjW2ZdXSk7by5wdXNoKHJbMF0pLHAucHVzaChyWzFdKSxxLnB1c2goWyJtYXRyaXgiLFtyWzJdXV0pfWVsc2V7aWYocz09dClqPXM7ZWxzZSBpZih3WzJdJiZ4WzJdJiZoKHMpPT1oKHQpKWo9aChzKSx1PXdbMl0odSksdj14WzJdKHYpO2Vsc2V7aWYoIXdbMV18fCF4WzFdfHxpKHMpIT1pKHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXTticmVha31qPWkocyksdT13WzFdKHUpLHY9eFsxXSh2KX1mb3IodmFyIHk9W10sej1bXSxBPVtdLEI9MDtCPHUubGVuZ3RoO0IrKyl7dmFyIEM9Im51bWJlciI9PXR5cGVvZiB1W0JdP2EubWVyZ2VOdW1iZXJzOmEubWVyZ2VEaW1lbnNpb25zLHI9Qyh1W0JdLHZbQl0pO3lbQl09clswXSx6W0JdPXJbMV0sQS5wdXNoKHJbMl0pfW8ucHVzaCh5KSxwLnB1c2goeikscS5wdXNoKFtqLEFdKX19aWYoZSl7dmFyIEQ9bztvPXAscD1EfXJldHVybltvLHAsZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS5tYXAoZnVuY3Rpb24oYSxjKXtyZXR1cm4gcVtiXVsxXVtjXShhKX0pLmpvaW4oIiwiKTtyZXR1cm4ibWF0cml4Ij09cVtiXVswXSYmMTY9PWMuc3BsaXQoIiwiKS5sZW5ndGgmJihxW2JdWzBdPSJtYXRyaXgzZCIpLHFbYl1bMF0rIigiK2MrIikifSkuam9pbigiICIpfV19dmFyIGs9bnVsbCxsPXtweDowfSxtPXtkZWc6MH0sbj17bWF0cml4OlsiTk5OTk5OIixbayxrLDAsMCxrLGssMCwwLDAsMCwxLDAsayxrLDAsMV0sZF0sbWF0cml4M2Q6WyJOTk5OTk5OTk5OTk5OTk5OIixkXSxyb3RhdGU6WyJBIl0scm90YXRleDpbIkEiXSxyb3RhdGV5OlsiQSJdLHJvdGF0ZXo6WyJBIl0scm90YXRlM2Q6WyJOTk5BIl0scGVyc3BlY3RpdmU6WyJMIl0sc2NhbGU6WyJObiIsYyhbayxrLDFdKSxkXSxzY2FsZXg6WyJOIixjKFtrLDEsMV0pLGMoW2ssMV0pXSxzY2FsZXk6WyJOIixjKFsxLGssMV0pLGMoWzEsa10pXSxzY2FsZXo6WyJOIixjKFsxLDEsa10pXSxzY2FsZTNkOlsiTk5OIixkXSxza2V3OlsiQWEiLG51bGwsZF0sc2tld3g6WyJBIixudWxsLGMoW2ssbV0pXSxza2V3eTpbIkEiLG51bGwsYyhbbSxrXSldLHRyYW5zbGF0ZTpbIlR0IixjKFtrLGssbF0pLGRdLHRyYW5zbGF0ZXg6WyJUIixjKFtrLGwsbF0pLGMoW2ssbF0pXSx0cmFuc2xhdGV5OlsiVCIsYyhbbCxrLGxdKSxjKFtsLGtdKV0sdHJhbnNsYXRlejpbIkwiLGMoW2wsbCxrXSldLHRyYW5zbGF0ZTNkOlsiVFRMIixkXX07YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ0cmFuc2Zvcm0iXSl9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5jb25jYXQoW2FdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiYoZFthXT1iKX0pfXZhciBkPXt9O2MoInRyYW5zZm9ybSIsWyJ3ZWJraXRUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxjKCJ0cmFuc2Zvcm1PcmlnaW4iLFsid2Via2l0VHJhbnNmb3JtT3JpZ2luIl0pLGMoInBlcnNwZWN0aXZlIixbIndlYmtpdFBlcnNwZWN0aXZlIl0pLGMoInBlcnNwZWN0aXZlT3JpZ2luIixbIndlYmtpdFBlcnNwZWN0aXZlT3JpZ2luIl0pLGEucHJvcGVydHlOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBkW2FdfHxhfX0oZCxmKX0oKSwhZnVuY3Rpb24oKXtpZih2b2lkIDA9PT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5hbmltYXRlKFtdKS5vbmNhbmNlbCl7dmFyIGE7aWYod2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3cpdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCl9O2Vsc2UgdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX07dmFyIGI9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJjYW5jZWwiLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX0sYz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihkLGUpe3ZhciBmPWMuY2FsbCh0aGlzLGQsZSk7Zi5fY2FuY2VsSGFuZGxlcnM9W10sZi5vbmNhbmNlbD1udWxsO3ZhciBnPWYuY2FuY2VsO2YuY2FuY2VsPWZ1bmN0aW9uKCl7Zy5jYWxsKHRoaXMpO3ZhciBjPW5ldyBiKHRoaXMsbnVsbCxhKCkpLGQ9dGhpcy5fY2FuY2VsSGFuZGxlcnMuY29uY2F0KHRoaXMub25jYW5jZWw/W3RoaXMub25jYW5jZWxdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChjLnRhcmdldCxjKX0pfSwwKX07dmFyIGg9Zi5hZGRFdmVudExpc3RlbmVyO2YuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiYiY2FuY2VsIj09YT90aGlzLl9jYW5jZWxIYW5kbGVycy5wdXNoKGIpOmguY2FsbCh0aGlzLGEsYil9O3ZhciBpPWYucmVtb3ZlRXZlbnRMaXN0ZW5lcjtyZXR1cm4gZi5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7aWYoImNhbmNlbCI9PWEpe3ZhciBjPXRoaXMuX2NhbmNlbEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fY2FuY2VsSGFuZGxlcnMuc3BsaWNlKGMsMSl9ZWxzZSBpLmNhbGwodGhpcyxhLGIpfSxmfX19KCksZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGM9bnVsbCxkPSExO3RyeXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKGIpLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKSxmPSIwIj09ZT8iMSI6IjAiO2M9Yi5hbmltYXRlKHtvcGFjaXR5OltmLGZdfSx7ZHVyYXRpb246MX0pLGMuY3VycmVudFRpbWU9MCxkPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpPT1mfWNhdGNoKGcpe31maW5hbGx5e2MmJmMuY2FuY2VsKCl9aWYoIWQpe3ZhciBoPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHdpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmJbU3ltYm9sLml0ZXJhdG9yXSYmKGI9QXJyYXkuZnJvbShiKSksQXJyYXkuaXNBcnJheShiKXx8bnVsbD09PWJ8fChiPWEuY29udmVydFRvQXJyYXlGb3JtKGIpKSxoLmNhbGwodGhpcyxiLGMpfX19KGMpLCFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj13aW5kb3cuZG9jdW1lbnQudGltZWxpbmU7Yi5jdXJyZW50VGltZT1hLGIuX2Rpc2NhcmRBbmltYXRpb25zKCksMD09Yi5fYW5pbWF0aW9ucy5sZW5ndGg/Zj0hMTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCk7Cn12YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoZnVuY3Rpb24oYil7d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSxhKGIpLHdpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCl9KX0sYi5BbmltYXRpb25UaW1lbGluZT1mdW5jdGlvbigpe3RoaXMuX2FuaW1hdGlvbnM9W10sdGhpcy5jdXJyZW50VGltZT12b2lkIDB9LGIuQW5pbWF0aW9uVGltZWxpbmUucHJvdG90eXBlPXtnZXRBbmltYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc2NhcmRBbmltYXRpb25zKCksdGhpcy5fYW5pbWF0aW9ucy5zbGljZSgpfSxfdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzOmZ1bmN0aW9uKCl7Yi5hbmltYXRpb25zV2l0aFByb21pc2VzPWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuX3VwZGF0ZVByb21pc2VzKCl9KX0sX2Rpc2NhcmRBbmltYXRpb25zOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksdGhpcy5fYW5pbWF0aW9ucz10aGlzLl9hbmltYXRpb25zLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZmluaXNoZWQiIT1hLnBsYXlTdGF0ZSYmImlkbGUiIT1hLnBsYXlTdGF0ZX0pfSxfcGxheTpmdW5jdGlvbihhKXt2YXIgYz1uZXcgYi5BbmltYXRpb24oYSx0aGlzKTtyZXR1cm4gdGhpcy5fYW5pbWF0aW9ucy5wdXNoKGMpLGIucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaygpLGMuX3VwZGF0ZVByb21pc2VzKCksYy5fYW5pbWF0aW9uLnBsYXkoKSxjLl91cGRhdGVQcm9taXNlcygpLGN9LHBsYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEucmVtb3ZlKCksdGhpcy5fcGxheShhKX19O3ZhciBmPSExO2IucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaz1mdW5jdGlvbigpe2Z8fChmPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShkKSl9O3ZhciBnPW5ldyBiLkFuaW1hdGlvblRpbWVsaW5lO2IudGltZWxpbmU9Zzt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5kb2N1bWVudCwidGltZWxpbmUiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGd9fSl9Y2F0Y2goaCl7fXRyeXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmU9Z31jYXRjaChoKXt9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1bXSxiLkFuaW1hdGlvbj1mdW5jdGlvbihiLGMpe2lmKHRoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLmVmZmVjdD1iLGImJihiLl9hbmltYXRpb249dGhpcyksIWMpdGhyb3cgbmV3IEVycm9yKCJBbmltYXRpb24gd2l0aCBudWxsIHRpbWVsaW5lIGlzIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLl90aW1lbGluZT1jLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9ob2xkVGltZT0wLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9pc0dyb3VwPSExLHRoaXMuX2FuaW1hdGlvbj1udWxsLHRoaXMuX2NoaWxkQW5pbWF0aW9ucz1bXSx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX29sZFBsYXlTdGF0ZT0iaWRsZSIsdGhpcy5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfdXBkYXRlUHJvbWlzZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vbGRQbGF5U3RhdGUsYj10aGlzLnBsYXlTdGF0ZTtyZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlKCksdGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCk6InBlbmRpbmciPT1hP3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKToicGVuZGluZyI9PWImJih0aGlzLl9yZWFkeVByb21pc2U9dm9pZCAwKSksdGhpcy5fZmluaXNoZWRQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlKCksdGhpcy5fZmluaXNoZWRQcm9taXNlPXZvaWQgMCk6ImZpbmlzaGVkIj09Yj90aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk6ImZpbmlzaGVkIj09YSYmKHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApKSx0aGlzLl9vbGRQbGF5U3RhdGU9dGhpcy5wbGF5U3RhdGUsdGhpcy5fcmVhZHlQcm9taXNlfHx0aGlzLl9maW5pc2hlZFByb21pc2V9LF9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGEsYyxkLGUsZj0hIXRoaXMuX2FuaW1hdGlvbjtmJiYoYT10aGlzLnBsYXliYWNrUmF0ZSxjPXRoaXMuX3BhdXNlZCxkPXRoaXMuc3RhcnRUaW1lLGU9dGhpcy5jdXJyZW50VGltZSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uLl93cmFwcGVyPW51bGwsdGhpcy5fYW5pbWF0aW9uPW51bGwpLCghdGhpcy5lZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LktleWZyYW1lRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcykpLCh0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8dGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuR3JvdXBFZmZlY3QpJiYodGhpcy5fYW5pbWF0aW9uPWIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvckdyb3VwKHRoaXMuZWZmZWN0KSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cCh0aGlzKSksdGhpcy5lZmZlY3QmJnRoaXMuZWZmZWN0Ll9vbnNhbXBsZSYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KHRoaXMpLGYmJigxIT1hJiYodGhpcy5wbGF5YmFja1JhdGU9YSksbnVsbCE9PWQ/dGhpcy5zdGFydFRpbWU9ZDpudWxsIT09ZT90aGlzLmN1cnJlbnRUaW1lPWU6bnVsbCE9PXRoaXMuX2hvbGRUaW1lJiYodGhpcy5jdXJyZW50VGltZT10aGlzLl9ob2xkVGltZSksYyYmdGhpcy5wYXVzZSgpKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxfdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihjKXt0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oYyxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMuZWZmZWN0KSl9LmJpbmQodGhpcykpfX0sX3NldEV4dGVybmFsQW5pbWF0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKWZvcih2YXIgYj0wO2I8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoO2IrKyl0aGlzLmVmZmVjdC5jaGlsZHJlbltiXS5fYW5pbWF0aW9uPWEsdGhpcy5fY2hpbGRBbmltYXRpb25zW2JdLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKXt2YXIgYT10aGlzLmVmZmVjdC5fdGltaW5nLmRlbGF5O3RoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuZWZmZWN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl9wbGF5KGMpO3RoaXMuX2NoaWxkQW5pbWF0aW9ucy5wdXNoKGQpLGQucGxheWJhY2tSYXRlPXRoaXMucGxheWJhY2tSYXRlLHRoaXMuX3BhdXNlZCYmZC5wYXVzZSgpLGMuX2FuaW1hdGlvbj10aGlzLmVmZmVjdC5fYW5pbWF0aW9uLHRoaXMuX2FycmFuZ2VDaGlsZHJlbihkLGEpLHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0JiYoYSs9Yi5ncm91cENoaWxkRHVyYXRpb24oYykpfS5iaW5kKHRoaXMpKX19LF9hcnJhbmdlQ2hpbGRyZW46ZnVuY3Rpb24oYSxiKXtudWxsPT09dGhpcy5zdGFydFRpbWU/YS5jdXJyZW50VGltZT10aGlzLmN1cnJlbnRUaW1lLWIvdGhpcy5wbGF5YmFja1JhdGU6YS5zdGFydFRpbWUhPT10aGlzLnN0YXJ0VGltZStiL3RoaXMucGxheWJhY2tSYXRlJiYoYS5zdGFydFRpbWU9dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSl9LGdldCB0aW1lbGluZSgpe3JldHVybiB0aGlzLl90aW1lbGluZX0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb24/dGhpcy5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSJ9LGdldCBmaW5pc2hlZCgpe3JldHVybiB3aW5kb3cuUHJvbWlzZT8odGhpcy5fZmluaXNoZWRQcm9taXNlfHwoLTE9PWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5pbmRleE9mKHRoaXMpJiZiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMucHVzaCh0aGlzKSx0aGlzLl9maW5pc2hlZFByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXt0aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7YSh0aGlzKX0sdGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7Yih7dHlwZTpET01FeGNlcHRpb24uQUJPUlRfRVJSLG5hbWU6IkFib3J0RXJyb3IifSl9fS5iaW5kKHRoaXMpKSwiZmluaXNoZWQiPT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpKSx0aGlzLl9maW5pc2hlZFByb21pc2UpOihjb25zb2xlLndhcm4oIkFuaW1hdGlvbiBQcm9taXNlcyByZXF1aXJlIEphdmFTY3JpcHQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpLG51bGwpfSxnZXQgcmVhZHkoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX3JlYWR5UHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fcmVhZHlQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZVJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdFJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksInBlbmRpbmciIT09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKSksdGhpcy5fcmVhZHlQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IG9uZmluaXNoKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaH0sc2V0IG9uZmluaXNoKGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBhP3RoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1mdW5jdGlvbihiKXtiLnRhcmdldD10aGlzLGEuY2FsbCh0aGlzLGIpfS5iaW5kKHRoaXMpOnRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1hfSxnZXQgb25jYW5jZWwoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsfSxzZXQgb25jYW5jZWwoYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGE/dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWZ1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWF9LGdldCBjdXJyZW50VGltZSgpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lO3JldHVybiB0aGlzLl91cGRhdGVQcm9taXNlcygpLGF9LHNldCBjdXJyZW50VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5jdXJyZW50VGltZT1pc0Zpbml0ZShhKT9hOk1hdGguc2lnbihhKSpOdW1iZXIuTUFYX1ZBTFVFLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIsYyl7Yi5jdXJyZW50VGltZT1hLWN9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWV9LHNldCBzdGFydFRpbWUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uc3RhcnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLnN0YXJ0VGltZT1hK2N9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGU9YSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYil7Yi5wbGF5YmFja1JhdGU9YX0pLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9PWImJih0aGlzLmN1cnJlbnRUaW1lPWIpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9hbmltYXRpb24ucGxheSgpLC0xPT10aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5pbmRleE9mKHRoaXMpJiZ0aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpLHRoaXMuX3JlZ2lzdGVyKCksYi5hd2FpdFN0YXJ0VGltZSh0aGlzKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50VGltZTthLnBsYXkoKSxhLmN1cnJlbnRUaW1lPWJ9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5jdXJyZW50VGltZSYmKHRoaXMuX2hvbGRUaW1lPXRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2FuaW1hdGlvbi5wYXVzZSgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5maW5pc2goKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucmV2ZXJzZSgpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnJldmVyc2UoKX0pLG51bGwhPT1hJiYodGhpcy5jdXJyZW50VGltZT1hKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YjsiZnVuY3Rpb24iPT10eXBlb2YgYiYmKGM9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9dGhpcyxiLmNhbGwodGhpcyxhKX0uYmluZCh0aGlzKSxiLl93cmFwcGVyPWMpLHRoaXMuX2FuaW1hdGlvbi5hZGRFdmVudExpc3RlbmVyKGEsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLl9hbmltYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGImJmIuX3dyYXBwZXJ8fGIpfSxfcmVtb3ZlQ2hpbGRBbmltYXRpb25zOmZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9jaGlsZEFuaW1hdGlvbnMubGVuZ3RoOyl0aGlzLl9jaGlsZEFuaW1hdGlvbnMucG9wKCkuY2FuY2VsKCl9LF9mb3JFYWNoQ2hpbGQ6ZnVuY3Rpb24oYil7dmFyIGM9MDtpZih0aGlzLmVmZmVjdC5jaGlsZHJlbiYmdGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDx0aGlzLmVmZmVjdC5jaGlsZHJlbi5sZW5ndGgmJnRoaXMuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLHRoaXMuX2NoaWxkQW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2IuY2FsbCh0aGlzLGEsYyksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihjKz1hLmVmZmVjdC5hY3RpdmVEdXJhdGlvbil9LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBkPXRoaXMuZWZmZWN0Ll90aW1pbmcsZT10aGlzLmN1cnJlbnRUaW1lO251bGwhPT1lJiYoZT1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGQpLGUsZCkpLChudWxsPT1lfHxpc05hTihlKSkmJnRoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpfX19LHdpbmRvdy5BbmltYXRpb249Yi5BbmltYXRpb259KGMsZSxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChiKXt0aGlzLl9mcmFtZXM9YS5ub3JtYWxpemVLZXlmcmFtZXMoYil9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgYT0hMTtpLmxlbmd0aDspe3ZhciBiPWkuc2hpZnQoKTtiLl91cGRhdGVDaGlsZHJlbigpLGE9ITB9cmV0dXJuIGF9dmFyIGY9ZnVuY3Rpb24oYSl7aWYoYS5fYW5pbWF0aW9uPXZvaWQgMCxhIGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0fHxhIGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KWZvcih2YXIgYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7YisrKWYoYS5jaGlsZHJlbltiXSl9O2IucmVtb3ZlTXVsdGk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtkLl9wYXJlbnQ/KC0xPT1iLmluZGV4T2YoZC5fcGFyZW50KSYmYi5wdXNoKGQuX3BhcmVudCksZC5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShkLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihkKSwxKSxkLl9wYXJlbnQ9bnVsbCxmKGQpKTpkLl9hbmltYXRpb24mJmQuX2FuaW1hdGlvbi5lZmZlY3Q9PWQmJihkLl9hbmltYXRpb24uY2FuY2VsKCksZC5fYW5pbWF0aW9uLmVmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSksZC5fYW5pbWF0aW9uLl9jYWxsYmFjayYmKGQuX2FuaW1hdGlvbi5fY2FsbGJhY2suX2FuaW1hdGlvbj1udWxsKSxkLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksZihkKSl9Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLl9yZWJ1aWxkKCl9LGIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYixjLGUsZil7cmV0dXJuIHRoaXMudGFyZ2V0PWIsdGhpcy5fcGFyZW50PW51bGwsZT1hLm51bWVyaWNUaW1pbmdUb09iamVjdChlKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoZSksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoZSksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGUsITEsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBjPyhhLmRlcHJlY2F0ZWQoIkN1c3RvbSBLZXlmcmFtZUVmZmVjdCIsIjIwMTUtMDYtMjIiLCJVc2UgS2V5ZnJhbWVFZmZlY3Qub25zYW1wbGUgaW5zdGVhZC4iKSx0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPWMpOnRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM9bmV3IGQoYyksdGhpcy5fa2V5ZnJhbWVzPWMsdGhpcy5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX3RpbWluZyksdGhpcy5faWQ9Zix0aGlzfSxiLktleWZyYW1lRWZmZWN0LnByb3RvdHlwZT17Z2V0RnJhbWVzOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM/dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lczp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLl9mcmFtZXN9LHNldCBvbnNhbXBsZShhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgb25zYW1wbGUgb24gY3VzdG9tIGVmZmVjdCBLZXlmcmFtZUVmZmVjdCBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuX29uc2FtcGxlPWEsdGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxjbG9uZTpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmdldEZyYW1lcygpKXRocm93IG5ldyBFcnJvcigiQ2xvbmluZyBjdXN0b20gZWZmZWN0cyBpcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciBiPW5ldyBLZXlmcmFtZUVmZmVjdCh0aGlzLnRhcmdldCxbXSxhLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLHRoaXMuX2lkKTtyZXR1cm4gYi5fbm9ybWFsaXplZEtleWZyYW1lcz10aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLGIuX2tleWZyYW1lcz10aGlzLl9rZXlmcmFtZXMsYn0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX07dmFyIGc9RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTtFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGIudGltZWxpbmUuX3BsYXkobmV3IGIuS2V5ZnJhbWVFZmZlY3QodGhpcyxhLGMsZCkpfTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKTtiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1hLnRhcmdldHx8aCxjPWEuX2tleWZyYW1lczsiZnVuY3Rpb24iPT10eXBlb2YgYyYmKGM9W10pO3ZhciBkPWEuX3RpbWluZ0lucHV0O2QuaWQ9YS5faWR9ZWxzZSB2YXIgYj1oLGM9W10sZD0wO3JldHVybiBnLmFwcGx5KGIsW2MsZF0pfSxiLmJpbmRBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXthLmVmZmVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZWZmZWN0Ll9ub3JtYWxpemVkS2V5ZnJhbWVzJiZiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3QoYSl9O3ZhciBpPVtdO2IuYXdhaXRTdGFydFRpbWU9ZnVuY3Rpb24oYSl7bnVsbD09PWEuc3RhcnRUaW1lJiZhLl9pc0dyb3VwJiYoMD09aS5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZShlKSxpLnB1c2goYSkpfTt2YXIgaj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJnZXRDb21wdXRlZFN0eWxlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpO3ZhciBhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBlKCkmJihhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpKSx3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLGF9fSksd2luZG93LktleWZyYW1lRWZmZWN0PWIuS2V5ZnJhbWVFZmZlY3Qsd2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEFuaW1hdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQudGltZWxpbmUuZ2V0QW5pbWF0aW9ucygpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEuZWZmZWN0JiZhLmVmZmVjdC50YXJnZXQ9PXRoaXN9LmJpbmQodGhpcykpfX0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2EuX3JlZ2lzdGVyZWR8fChhLl9yZWdpc3RlcmVkPSEwLGcucHVzaChhKSxofHwoaD0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSkpKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWc7Zz1bXSxiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9KSxiPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe2EoKTt2YXIgYj1hLl9hbmltYXRpb24/YS5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSI7cmV0dXJuInJ1bm5pbmciIT1iJiYicGVuZGluZyIhPWImJihhLl9yZWdpc3RlcmVkPSExKSxhLl9yZWdpc3RlcmVkfSksZy5wdXNoLmFwcGx5KGcsYiksZy5sZW5ndGg/KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKTpoPSExfXZhciBmPShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKSwwKTtiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3Q9ZnVuY3Rpb24oYil7dmFyIGMsZT1iLmVmZmVjdC50YXJnZXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgYi5lZmZlY3QuZ2V0RnJhbWVzKCk7Yz1nP2IuZWZmZWN0LmdldEZyYW1lcygpOmIuZWZmZWN0Ll9vbnNhbXBsZTt2YXIgaD1iLmVmZmVjdC50aW1pbmcsaT1udWxsO2g9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChoKTt2YXIgaj1mdW5jdGlvbigpe3ZhciBkPWouX2FuaW1hdGlvbj9qLl9hbmltYXRpb24uY3VycmVudFRpbWU6bnVsbDtudWxsIT09ZCYmKGQ9YS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihoKSxkLGgpLGlzTmFOKGQpJiYoZD1udWxsKSksZCE9PWkmJihnP2MoZCxlLGIuZWZmZWN0KTpjKGQsYi5lZmZlY3QsYi5lZmZlY3QuX2FuaW1hdGlvbikpLGk9ZH07ai5fYW5pbWF0aW9uPWIsai5fcmVnaXN0ZXJlZD0hMSxqLl9zZXF1ZW5jZU51bWJlcj1mKyssYi5fY2FsbGJhY2s9aixkKGopfTt2YXIgZz1bXSxoPSExO2IuQW5pbWF0aW9uLnByb3RvdHlwZS5fcmVnaXN0ZXI9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFjayYmZCh0aGlzLl9jYWxsYmFjayl9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEuX3RpbWluZy5kZWxheSthLmFjdGl2ZUR1cmF0aW9uK2EuX3RpbWluZy5lbmREZWxheX1mdW5jdGlvbiBlKGIsYyxkKXt0aGlzLl9pZD1kLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49Ynx8W10sdGhpcy5fcmVwYXJlbnQodGhpcy5jaGlsZHJlbiksYz1hLm51bWVyaWNUaW1pbmdUb09iamVjdChjKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoYyksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYywhMCksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGMsITAsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJhdXRvIj09PXRoaXMuX3RpbWluZy5kdXJhdGlvbiYmKHRoaXMuX3RpbWluZy5kdXJhdGlvbj10aGlzLmFjdGl2ZUR1cmF0aW9uKX13aW5kb3cuU2VxdWVuY2VFZmZlY3Q9ZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2luZG93Lkdyb3VwRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlPXtfaXNBbmNlc3RvcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9wYXJlbnR9cmV0dXJuITF9LF9yZWJ1aWxkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXM7YTspImF1dG8iPT09YS50aW1pbmcuZHVyYXRpb24mJihhLl90aW1pbmcuZHVyYXRpb249YS5hY3RpdmVEdXJhdGlvbiksYT1hLl9wYXJlbnQ7dGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LF9yZXBhcmVudDpmdW5jdGlvbihhKXtiLnJlbW92ZU11bHRpKGEpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX3BhcmVudD10aGlzfSxfcHV0Q2hpbGQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yj8iQ2Fubm90IGFwcGVuZCBhbiBhbmNlc3RvciBvciBzZWxmIjoiQ2Fubm90IHByZXBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuX2lzQW5jZXN0b3IoYVtkXSkpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLG5hbWU6IkhpZXJhcmNoeVJlcXVlc3RFcnJvciIsbWVzc2FnZTpjfTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyliP3RoaXMuY2hpbGRyZW4ucHVzaChhW2RdKTp0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYVtkXSk7dGhpcy5fcmVwYXJlbnQoYSksdGhpcy5fcmVidWlsZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wdXRDaGlsZChhcmd1bWVudHMsITApfSxwcmVwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCExKX0sZ2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnR9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY2hpbGRyZW5bMF06bnVsbH0sZ2V0IGxhc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdOm51bGx9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWEuY2xvbmVUaW1pbmdJbnB1dCh0aGlzLl90aW1pbmdJbnB1dCksYz1bXSxkPTA7ZDx0aGlzLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5wdXNoKHRoaXMuY2hpbGRyZW5bZF0uY2xvbmUoKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBHcm91cEVmZmVjdD9uZXcgR3JvdXBFZmZlY3QoYyxiKTpuZXcgU2VxdWVuY2VFZmZlY3QoYyxiKX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX0sd2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YSs9ZChiKX0pLE1hdGgubWF4KGEsMCl9fSksd2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YT1NYXRoLm1heChhLGQoYikpfSksYX19KSxiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihjKXt2YXIgZCxlPW51bGwsZj1mdW5jdGlvbihiKXt2YXIgYz1kLl93cmFwcGVyO3JldHVybiBjJiYicGVuZGluZyIhPWMucGxheVN0YXRlJiZjLmVmZmVjdD9udWxsPT1iP3ZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCk6MD09YiYmYy5wbGF5YmFja1JhdGU8MCYmKGV8fChlPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy5lZmZlY3QudGltaW5nKSksYj1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGUpLC0xLGUpLGlzTmFOKGIpfHxudWxsPT1iKT8oYy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EuY3VycmVudFRpbWU9LTF9KSx2b2lkIGMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpKTp2b2lkIDA6dm9pZCAwfSxnPW5ldyBLZXlmcmFtZUVmZmVjdChudWxsLFtdLGMuX3RpbWluZyxjLl9pZCk7cmV0dXJuIGcub25zYW1wbGU9ZixkPWIudGltZWxpbmUuX3BsYXkoZyl9LGIuYmluZEFuaW1hdGlvbkZvckdyb3VwPWZ1bmN0aW9uKGEpe2EuX2FuaW1hdGlvbi5fd3JhcHBlcj1hLGEuX2lzR3JvdXA9ITAsYi5hd2FpdFN0YXJ0VGltZShhKSxhLl9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnMoKSxhLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sYi5ncm91cENoaWxkRHVyYXRpb249ZH0oYyxlLGYpLGJbInRydWUiXT1hfSh7fSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpKTsKCi8qKgpAbGljZW5zZSBAbm9jb21waWxlCkNvcHlyaWdodCAoYykgMjAxOCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCihmdW5jdGlvbigpey8qCgogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwondXNlIHN0cmljdCc7dmFyIG4scD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09dGhpcz90aGlzOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOnRoaXMsYWE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7YSE9QXJyYXkucHJvdG90eXBlJiZhIT1PYmplY3QucHJvdG90eXBlJiYoYVtiXT1jLnZhbHVlKX07ZnVuY3Rpb24gYmEoKXtiYT1mdW5jdGlvbigpe307cC5TeW1ib2x8fChwLlN5bWJvbD1jYSl9dmFyIGNhPWZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImpzY29tcF9zeW1ib2xfIisoYnx8IiIpK2ErK319KCk7CmZ1bmN0aW9uIGRhKCl7YmEoKTt2YXIgYT1wLlN5bWJvbC5pdGVyYXRvcjthfHwoYT1wLlN5bWJvbC5pdGVyYXRvcj1wLlN5bWJvbCgiaXRlcmF0b3IiKSk7ImZ1bmN0aW9uIiE9dHlwZW9mIEFycmF5LnByb3RvdHlwZVthXSYmYWEoQXJyYXkucHJvdG90eXBlLGEse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlYSh0aGlzKX19KTtkYT1mdW5jdGlvbigpe319ZnVuY3Rpb24gZWEoYSl7dmFyIGI9MDtyZXR1cm4gZmEoZnVuY3Rpb24oKXtyZXR1cm4gYjxhLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTphW2IrK119Ontkb25lOiEwfX0pfWZ1bmN0aW9uIGZhKGEpe2RhKCk7YT17bmV4dDphfTthW3AuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4gYX1mdW5jdGlvbiBpYShhKXtkYSgpO3ZhciBiPWFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYj9iLmNhbGwoYSk6ZWEoYSl9CmZ1bmN0aW9uIGphKGEpe2Zvcih2YXIgYixjPVtdOyEoYj1hLm5leHQoKSkuZG9uZTspYy5wdXNoKGIudmFsdWUpO3JldHVybiBjfQooZnVuY3Rpb24oKXtpZighZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTthLmluaXRFdmVudCgiZm9vIiwhMCwhMCk7YS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBhLmRlZmF1bHRQcmV2ZW50ZWR9KCkpe3ZhciBhPUV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdDtFdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGFibGUmJihhLmNhbGwodGhpcyksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRlZmF1bHRQcmV2ZW50ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29uZmlndXJhYmxlOiEwfSkpfX12YXIgYj0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZighd2luZG93LkN1c3RvbUV2ZW50fHxiJiYiZnVuY3Rpb24iIT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCl3aW5kb3cuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpOwpjLmluaXRDdXN0b21FdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIuZGV0YWlsKTtyZXR1cm4gY30sd2luZG93LkN1c3RvbUV2ZW50LnByb3RvdHlwZT13aW5kb3cuRXZlbnQucHJvdG90eXBlO2lmKCF3aW5kb3cuRXZlbnR8fGImJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LkV2ZW50KXt2YXIgYz13aW5kb3cuRXZlbnQ7d2luZG93LkV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtjLmluaXRFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlKTtyZXR1cm4gY307aWYoYylmb3IodmFyIGQgaW4gYyl3aW5kb3cuRXZlbnRbZF09Y1tkXTt3aW5kb3cuRXZlbnQucHJvdG90eXBlPWMucHJvdG90eXBlfWlmKCF3aW5kb3cuTW91c2VFdmVudHx8YiYmImZ1bmN0aW9uIiE9PXR5cGVvZiB3aW5kb3cuTW91c2VFdmVudCl7Yj13aW5kb3cuTW91c2VFdmVudDt3aW5kb3cuTW91c2VFdmVudD1mdW5jdGlvbihhLApiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7Yy5pbml0TW91c2VFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIudmlld3x8d2luZG93LGIuZGV0YWlsLGIuc2NyZWVuWCxiLnNjcmVlblksYi5jbGllbnRYLGIuY2xpZW50WSxiLmN0cmxLZXksYi5hbHRLZXksYi5zaGlmdEtleSxiLm1ldGFLZXksYi5idXR0b24sYi5yZWxhdGVkVGFyZ2V0KTtyZXR1cm4gY307aWYoYilmb3IoZCBpbiBiKXdpbmRvdy5Nb3VzZUV2ZW50W2RdPWJbZF07d2luZG93Lk1vdXNlRXZlbnQucHJvdG90eXBlPWIucHJvdG90eXBlfUFycmF5LmZyb218fChBcnJheS5mcm9tPWZ1bmN0aW9uKGEpe3JldHVybltdLnNsaWNlLmNhbGwoYSl9KTtPYmplY3QuYXNzaWdufHwoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxkPTAsZTtkPGMubGVuZ3RoO2QrKylpZihlPWNbZF0pZm9yKHZhciBmPQphLG09ZSxxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG0pLHg9MDt4PHEubGVuZ3RoO3grKyllPXFbeF0sZltlXT1tW2VdO3JldHVybiBhfSl9KSh3aW5kb3cuV2ViQ29tcG9uZW50cyk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31mdW5jdGlvbiBiKGEsYil7aWYoIWEuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuW107c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOnJldHVybiB1YS5jYWxsKGEsYik7Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6cmV0dXJuIGxiLmNhbGwoYSxiKTtkZWZhdWx0OnJldHVybiBVLmNhbGwoYSxiKX19dmFyIGM9InVuZGVmaW5lZCI9PT10eXBlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCxkPSEoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmNsb25lTm9kZSgpaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSxlPSExOy9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3IodmFyIGQ7ZD1hLmZpcnN0Q2hpbGQ7KWMuY2FsbCh0aGlzLGQsYik7ZWxzZSBjLmNhbGwodGhpcywKYSxiKTtyZXR1cm4gYX1lPSEwO3ZhciBiPU5vZGUucHJvdG90eXBlLmNsb25lTm9kZTtOb2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9ZnVuY3Rpb24oYSl7YT1iLmNhbGwodGhpcyxhKTt0aGlzIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGEuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYX07RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbD1IVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbDtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yPUhUTUxFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHtub2RlVHlwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERX0sY29uZmlndXJhYmxlOiEwfSxsb2NhbE5hbWU6e2dldDpmdW5jdGlvbigpe30sCmNvbmZpZ3VyYWJsZTohMH0sbm9kZU5hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiIjZG9jdW1lbnQtZnJhZ21lbnQifSxjb25maWd1cmFibGU6ITB9fSk7dmFyIGM9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlO05vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZT1hO3ZhciBkPU5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkO05vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGIpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P2EuY2FsbCh0aGlzLGIsbnVsbCk6ZC5jYWxsKHRoaXMsYik7cmV0dXJuIGJ9O3ZhciBmPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGc9Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkO05vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZD1mdW5jdGlvbihiLGMpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50PyhhLmNhbGwodGhpcyxiLGMpLGYuY2FsbCh0aGlzLGMpKTpnLmNhbGwodGhpcyxiLGMpO3JldHVybiBjfTtEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD0KZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNyZWF0ZUVsZW1lbnQoImRmIik7YS5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGU7cmV0dXJuIGF9O3ZhciBoPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlO0RvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7Yj1oLmNhbGwodGhpcyxhLGJ8fCExKTthIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGIuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYn19KCk7dmFyIGY9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlLGc9RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsaD1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZSxrPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGw9Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsbT1Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQscT1ET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZywKeD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpfHx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5pbm5lckhUTUw9YX19LE09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsImNoaWxkTm9kZXMiKXx8e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9fSxVPUVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsdWE9RG9jdW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsbGI9RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxtYj1mdW5jdGlvbigpe2lmKCFjKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtiLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwphLmNvbnRlbnQuYXBwZW5kQ2hpbGQoYik7YT1hLmNsb25lTm9kZSghMCk7cmV0dXJuIDA9PT1hLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fDA9PT1hLmNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50LmNoaWxkTm9kZXMubGVuZ3RofHxkfX0oKTtpZihjKXt2YXIgUz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoInRlbXBsYXRlIiksQz0hMCxWPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Vi50ZXh0Q29udGVudD0idGVtcGxhdGV7ZGlzcGxheTpub25lO30iO3ZhciBoYT1kb2N1bWVudC5oZWFkO2hhLmluc2VydEJlZm9yZShWLGhhLmZpcnN0RWxlbWVudENoaWxkKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSk7dmFyIHZhPSFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5oYXNPd25Qcm9wZXJ0eSgiaW5uZXJIVE1MIik7YS5HPWZ1bmN0aW9uKGIpe2lmKCFiLmNvbnRlbnQmJmIubmFtZXNwYWNlVVJJPT09CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkpe2IuY29udGVudD1TLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IodmFyIGM7Yz1iLmZpcnN0Q2hpbGQ7KWwuY2FsbChiLmNvbnRlbnQsYyk7aWYodmEpYi5fX3Byb3RvX189YS5wcm90b3R5cGU7ZWxzZSBpZihiLmNsb25lTm9kZT1mdW5jdGlvbihiKXtyZXR1cm4gYS5hKHRoaXMsYil9LEMpdHJ5e1AoYiksVyhiKX1jYXRjaChUZyl7Qz0hMX1hLkMoYi5jb250ZW50KX19O3ZhciBYPXtvcHRpb246WyJzZWxlY3QiXSx0aGVhZDpbInRhYmxlIl0sY29sOlsiY29sZ3JvdXAiLCJ0YWJsZSJdLHRyOlsidGJvZHkiLCJ0YWJsZSJdLHRoOlsidHIiLCJ0Ym9keSIsInRhYmxlIl0sdGQ6WyJ0ciIsInRib2R5IiwidGFibGUiXX0sUD1mdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiaW5uZXJIVE1MIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5iKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYil7dmFyIGM9WFsoLzwoW2Etel1bXi9cMD5ceDIwXHRcclxuXGZdKykvaS5leGVjKGIpfHwKWyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV07aWYoYylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyliPSI8IitjW2RdKyI+IitiKyI8LyIrY1tkXSsiPiI7Uy5ib2R5LmlubmVySFRNTD1iO2ZvcihhLkMoUyk7dGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7KWsuY2FsbCh0aGlzLmNvbnRlbnQsdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQpO2I9Uy5ib2R5O2lmKGMpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyliPWIubGFzdENoaWxkO2Zvcig7Yi5maXJzdENoaWxkOylsLmNhbGwodGhpcy5jb250ZW50LGIuZmlyc3RDaGlsZCl9LGNvbmZpZ3VyYWJsZTohMH0pfSxXPWZ1bmN0aW9uKGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJvdXRlckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iPHRlbXBsYXRlPiIrdGhpcy5pbm5lckhUTUwrIjwvdGVtcGxhdGU+In0sc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMucGFyZW50Tm9kZSl7Uy5ib2R5LmlubmVySFRNTD1hO2ZvcihhPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Uy5ib2R5LmZpcnN0Q2hpbGQ7KWwuY2FsbChhLApTLmJvZHkuZmlyc3RDaGlsZCk7bS5jYWxsKHRoaXMucGFyZW50Tm9kZSxhLHRoaXMpfWVsc2UgdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBzZXQgdGhlICdvdXRlckhUTUwnIHByb3BlcnR5IG9uICdFbGVtZW50JzogVGhpcyBlbGVtZW50IGhhcyBubyBwYXJlbnQgbm9kZS4iKTt9LGNvbmZpZ3VyYWJsZTohMH0pfTtQKGEucHJvdG90eXBlKTtXKGEucHJvdG90eXBlKTthLkM9ZnVuY3Rpb24oYyl7Yz1iKGMsInRlbXBsYXRlIik7Zm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmO2Q8ZSYmKGY9Y1tkXSk7ZCsrKWEuRyhmKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXthLkMoZG9jdW1lbnQpfSk7RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYj1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsidGVtcGxhdGUiPT09Yi5sb2NhbE5hbWUmJmEuRyhiKTtyZXR1cm4gYn07RE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmc9CmZ1bmN0aW9uKCl7dmFyIGI9cS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YS5DKGIpO3JldHVybiBifTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmIodGhpcyl9LHNldDpmdW5jdGlvbihiKXt4LnNldC5jYWxsKHRoaXMsYik7YS5DKHRoaXMpfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO3ZhciBWZT0vWyZcdTAwQTAiXS9nLHljPS9bJlx1MDBBMDw+XS9nLHpjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICImIjpyZXR1cm4iJmFtcDsiO2Nhc2UgIjwiOnJldHVybiImbHQ7IjtjYXNlICI+IjpyZXR1cm4iJmd0OyI7Y2FzZSAnIic6cmV0dXJuIiZxdW90OyI7Y2FzZSAiXHUwMGEwIjpyZXR1cm4iJm5ic3A7In19O1Y9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKyliW2FbY11dPSEwO3JldHVybiBifTt2YXIgV2U9VigiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnIiLnNwbGl0KCIgIikpLApYZT1WKCJzdHlsZSBzY3JpcHQgeG1wIGlmcmFtZSBub2VtYmVkIG5vZnJhbWVzIHBsYWludGV4dCBub3NjcmlwdCIuc3BsaXQoIiAiKSksbmI9ZnVuY3Rpb24oYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOk0uZ2V0LmNhbGwoYSksZT0wLGY9ZC5sZW5ndGgsZztlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hO3ZhciBsPWI7c3dpdGNoKGgubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Zm9yKHZhciBQPWgubG9jYWxOYW1lLG09IjwiK1AsVz1oLmF0dHJpYnV0ZXMscT0wO2s9V1txXTtxKyspbSs9IiAiK2submFtZSsnPSInK2sudmFsdWUucmVwbGFjZShWZSx6YykrJyInO20rPSI+IjtoPVdlW1BdP206bStuYihoLGwpKyI8LyIrUCsiPiI7YnJlYWsgYTtjYXNlIE5vZGUuVEVYVF9OT0RFOmg9aC5kYXRhO2g9ayYmWGVbay5sb2NhbE5hbWVdP2g6aC5yZXBsYWNlKHljLHpjKTticmVhayBhOwpjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO319Yys9aH1yZXR1cm4gY319aWYoY3x8bWIpe2EuYT1mdW5jdGlvbihhLGIpe3ZhciBjPWYuY2FsbChhLCExKTt0aGlzLkcmJnRoaXMuRyhjKTtiJiYobC5jYWxsKGMuY29udGVudCxmLmNhbGwoYS5jb250ZW50LCEwKSksb2IoYy5jb250ZW50LGEuY29udGVudCkpO3JldHVybiBjfTt2YXIgb2I9ZnVuY3Rpb24oYyxkKXtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwmJihkPWIoZCwidGVtcGxhdGUiKSwwIT09ZC5sZW5ndGgpKXtjPWIoYywidGVtcGxhdGUiKTtmb3IodmFyIGU9MCxmPWMubGVuZ3RoLGcsaDtlPGY7ZSsrKWg9ZFtlXSxnPWNbZV0sYSYmYS5HJiZhLkcoaCksbS5jYWxsKGcucGFyZW50Tm9kZSxZZS5jYWxsKGgsITApLGcpfX0sWWU9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPQpmdW5jdGlvbihiKXtpZighZSYmZCYmdGhpcyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpaWYoYil2YXIgYz1aZS5jYWxsKHRoaXMub3duZXJEb2N1bWVudCx0aGlzLCEwKTtlbHNlIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Vsc2UgdGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiYidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUmJnRoaXMubmFtZXNwYWNlVVJJPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJP2M9YS5hKHRoaXMsYik6Yz1mLmNhbGwodGhpcyxiKTtiJiZvYihjLHRoaXMpO3JldHVybiBjfSxaZT1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZT1mdW5jdGlvbihjLGQpe2Q9ZHx8ITE7aWYoInRlbXBsYXRlIj09PWMubG9jYWxOYW1lKXJldHVybiBhLmEoYyxkKTt2YXIgZT1oLmNhbGwodGhpcyxjLGQpO2lmKGQpe29iKGUsYyk7Yz1iKGUsJ3NjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXScpOwpmb3IodmFyIGYsaz0wO2s8Yy5sZW5ndGg7aysrKXtmPWNba107ZD1nLmNhbGwoZG9jdW1lbnQsInNjcmlwdCIpO2QudGV4dENvbnRlbnQ9Zi50ZXh0Q29udGVudDtmb3IodmFyIGw9Zi5hdHRyaWJ1dGVzLFA9MCxXO1A8bC5sZW5ndGg7UCsrKVc9bFtQXSxkLnNldEF0dHJpYnV0ZShXLm5hbWUsVy52YWx1ZSk7bS5jYWxsKGYucGFyZW50Tm9kZSxkLGYpfX1yZXR1cm4gZX19YyYmKHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50PWEpfSkoKTt2YXIga2E9c2V0VGltZW91dDtmdW5jdGlvbiBsYSgpe31mdW5jdGlvbiBtYShhLGIpe3JldHVybiBmdW5jdGlvbigpe2EuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiByKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldyIpO2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSBmdW5jdGlvbiIpO3RoaXMudT0wO3RoaXMubWE9ITE7dGhpcy5oPXZvaWQgMDt0aGlzLkk9W107bmEoYSx0aGlzKX0KZnVuY3Rpb24gb2EoYSxiKXtmb3IoOzM9PT1hLnU7KWE9YS5oOzA9PT1hLnU/YS5JLnB1c2goYik6KGEubWE9ITAscGEoZnVuY3Rpb24oKXt2YXIgYz0xPT09YS51P2IuTmE6Yi5PYTtpZihudWxsPT09YykoMT09PWEudT9xYTpyYSkoYi5nYSxhLmgpO2Vsc2V7dHJ5e3ZhciBkPWMoYS5oKX1jYXRjaChlKXtyYShiLmdhLGUpO3JldHVybn1xYShiLmdhLGQpfX0pKX1mdW5jdGlvbiBxYShhLGIpe3RyeXtpZihiPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLiIpO2lmKGImJigib2JqZWN0Ij09PXR5cGVvZiBifHwiZnVuY3Rpb24iPT09dHlwZW9mIGIpKXt2YXIgYz1iLnRoZW47aWYoYiBpbnN0YW5jZW9mIHIpe2EudT0zO2EuaD1iO3NhKGEpO3JldHVybn1pZigiZnVuY3Rpb24iPT09dHlwZW9mIGMpe25hKG1hKGMsYiksYSk7cmV0dXJufX1hLnU9MTthLmg9YjtzYShhKX1jYXRjaChkKXtyYShhLGQpfX0KZnVuY3Rpb24gcmEoYSxiKXthLnU9MjthLmg9YjtzYShhKX1mdW5jdGlvbiBzYShhKXsyPT09YS51JiYwPT09YS5JLmxlbmd0aCYmcGEoZnVuY3Rpb24oKXthLm1hfHwidW5kZWZpbmVkIiE9PXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLGEuaCl9KTtmb3IodmFyIGI9MCxjPWEuSS5sZW5ndGg7YjxjO2IrKylvYShhLGEuSVtiXSk7YS5JPW51bGx9ZnVuY3Rpb24gdGEoYSxiLGMpe3RoaXMuTmE9ImZ1bmN0aW9uIj09PXR5cGVvZiBhP2E6bnVsbDt0aGlzLk9hPSJmdW5jdGlvbiI9PT10eXBlb2YgYj9iOm51bGw7dGhpcy5nYT1jfWZ1bmN0aW9uIG5hKGEsYil7dmFyIGM9ITE7dHJ5e2EoZnVuY3Rpb24oYSl7Y3x8KGM9ITAscWEoYixhKSl9LGZ1bmN0aW9uKGEpe2N8fChjPSEwLHJhKGIsYSkpfSl9Y2F0Y2goZCl7Y3x8KGM9ITAscmEoYixkKSl9fQpyLnByb3RvdHlwZVsiY2F0Y2giXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9O3IucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihsYSk7b2EodGhpcyxuZXcgdGEoYSxiLGMpKTtyZXR1cm4gY307ci5wcm90b3R5cGVbImZpbmFsbHkiXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGIucmVzb2x2ZShhKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY30pfSxmdW5jdGlvbihjKXtyZXR1cm4gYi5yZXNvbHZlKGEoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBiLnJlamVjdChjKX0pfSl9OwpmdW5jdGlvbiB3YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtmdW5jdGlvbiBkKGEsZyl7dHJ5e2lmKGcmJigib2JqZWN0Ij09PXR5cGVvZiBnfHwiZnVuY3Rpb24iPT09dHlwZW9mIGcpKXt2YXIgaD1nLnRoZW47aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBoKXtoLmNhbGwoZyxmdW5jdGlvbihiKXtkKGEsYil9LGMpO3JldHVybn19ZVthXT1nOzA9PT0tLWYmJmIoZSl9Y2F0Y2gobSl7YyhtKX19aWYoIWF8fCJ1bmRlZmluZWQiPT09dHlwZW9mIGEubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2UuYWxsIGFjY2VwdHMgYW4gYXJyYXkiKTt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGIoW10pO2Zvcih2YXIgZj1lLmxlbmd0aCxnPTA7ZzxlLmxlbmd0aDtnKyspZChnLGVbZ10pfSl9CmZ1bmN0aW9uIHhhKGEpe3JldHVybiBhJiYib2JqZWN0Ij09PXR5cGVvZiBhJiZhLmNvbnN0cnVjdG9yPT09cj9hOm5ldyByKGZ1bmN0aW9uKGIpe2IoYSl9KX1mdW5jdGlvbiB5YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtjKGEpfSl9ZnVuY3Rpb24gemEoYSl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWFbZF0udGhlbihiLGMpfSl9dmFyIHBhPSJmdW5jdGlvbiI9PT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZmdW5jdGlvbihhKXtzZXRJbW1lZGlhdGUoYSl9fHxmdW5jdGlvbihhKXtrYShhLDApfTsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KaWYoIXdpbmRvdy5Qcm9taXNlKXt3aW5kb3cuUHJvbWlzZT1yO3IucHJvdG90eXBlLnRoZW49ci5wcm90b3R5cGUudGhlbjtyLmFsbD13YTtyLnJhY2U9emE7ci5yZXNvbHZlPXhhO3IucmVqZWN0PXlhO3ZhciBBYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksQmE9W107KG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPUJhLmxlbmd0aCxiPTA7YjxhO2IrKylCYVtiXSgpO0JhLnNwbGljZSgwLGEpfSkpLm9ic2VydmUoQWEse2NoYXJhY3RlckRhdGE6ITB9KTtwYT1mdW5jdGlvbihhKXtCYS5wdXNoKGEpO0FhLnRleHRDb250ZW50PTA8QWEudGV4dENvbnRlbnQubGVuZ3RoPyIiOiJhIn19OyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQpcmV0dXJuIG5ldyBDdXN0b21FdmVudChhLGIpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpO2MuaW5pdEN1c3RvbUV2ZW50KGEsISFiLmJ1YmJsZXMsISFiLmNhbmNlbGFibGUsYi5kZXRhaWwpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSl7aWYoTSlyZXR1cm4gYS5vd25lckRvY3VtZW50IT09ZG9jdW1lbnQ/YS5vd25lckRvY3VtZW50Om51bGw7dmFyIGI9YS5fX2ltcG9ydERvYztpZighYiYmYS5wYXJlbnROb2RlKXtiPWEucGFyZW50Tm9kZTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGIuY2xvc2VzdCliPWIuY2xvc2VzdCgibGlua1tyZWw9aW1wb3J0XSIpO2Vsc2UgZm9yKDshaChiKSYmKGI9Yi5wYXJlbnROb2RlKTspO2EuX19pbXBvcnREb2M9Yn1yZXR1cm4gYn1mdW5jdGlvbiBkKGEpe3ZhciBiPW0oZG9jdW1lbnQsImxpbmtbcmVsPWltcG9ydF06bm90KFtpbXBvcnQtZGVwZW5kZW5jeV0pIiksCmM9Yi5sZW5ndGg7Yz9xKGIsZnVuY3Rpb24oYil7cmV0dXJuIGcoYixmdW5jdGlvbigpezA9PT0tLWMmJmEoKX0pfSk6YSgpfWZ1bmN0aW9uIGUoYSl7ZnVuY3Rpb24gYigpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGUmJmRvY3VtZW50LmJvZHkmJihkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixiKSxhKCkpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGIpO2IoKX1mdW5jdGlvbiBmKGEpe2UoZnVuY3Rpb24oKXtyZXR1cm4gZChmdW5jdGlvbigpe3JldHVybiBhJiZhKCl9KX0pfWZ1bmN0aW9uIGcoYSxiKXtpZihhLl9fbG9hZGVkKWImJmIoKTtlbHNlIGlmKCJzY3JpcHQiPT09YS5sb2NhbE5hbWUmJiFhLnNyY3x8InN0eWxlIj09PWEubG9jYWxOYW1lJiYhYS5maXJzdENoaWxkKWEuX19sb2FkZWQ9ITAsYiYmYigpO2Vsc2V7dmFyIGM9ZnVuY3Rpb24oZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKGQudHlwZSwKYyk7YS5fX2xvYWRlZD0hMDtiJiZiKCl9O2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYyk7aGEmJiJzdHlsZSI9PT1hLmxvY2FsTmFtZXx8YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmImxpbmsiPT09YS5sb2NhbE5hbWUmJiJpbXBvcnQiPT09YS5yZWx9ZnVuY3Rpb24gaygpe3ZhciBhPXRoaXM7dGhpcy5hPXt9O3RoaXMuYj0wO3RoaXMuYz1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtyZXR1cm4gYS5KYShiKX0pO3RoaXMuYy5vYnNlcnZlKGRvY3VtZW50LmhlYWQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7dGhpcy5sb2FkSW1wb3J0cyhkb2N1bWVudCl9ZnVuY3Rpb24gbChhKXtxKG0oYSwidGVtcGxhdGUiKSxmdW5jdGlvbihhKXtxKG0oYS5jb250ZW50LCdzY3JpcHQ6bm90KFt0eXBlXSksc2NyaXB0W3R5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0idGV4dC9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9Im1vZHVsZSJdJyksCmZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3EoYS5hdHRyaWJ1dGVzLGZ1bmN0aW9uKGEpe3JldHVybiBiLnNldEF0dHJpYnV0ZShhLm5hbWUsYS52YWx1ZSl9KTtiLnRleHRDb250ZW50PWEudGV4dENvbnRlbnQ7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLGEpfSk7bChhLmNvbnRlbnQpfSl9ZnVuY3Rpb24gbShhLGIpe3JldHVybiBhLmNoaWxkTm9kZXMubGVuZ3RoP2EucXVlcnlTZWxlY3RvckFsbChiKTpVfWZ1bmN0aW9uIHEoYSxiLGMpe3ZhciBkPWE/YS5sZW5ndGg6MCxlPWM/LTE6MTtmb3IoYz1jP2QtMTowO2M8ZCYmMDw9YztjKz1lKWIoYVtjXSxjKX12YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIiksTT0iaW1wb3J0ImluIHgsVT14LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSx1YT1udWxsOyExPT09ImN1cnJlbnRTY3JpcHQiaW4gZG9jdW1lbnQmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwiY3VycmVudFNjcmlwdCIsCntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdWF8fCgiY29tcGxldGUiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9kb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoLTFdOm51bGwpfSxjb25maWd1cmFibGU6ITB9KTt2YXIgbGI9Lyh1cmxcKCkoW14pXSopKFwpKS9nLG1iPS8oQGltcG9ydFtcc10rKD8hdXJsXCgpKShbXjtdKikoOykvZyxTPS8oPGxpbmtbXj5dKikocmVsPVsnfCJdP3N0eWxlc2hlZXRbJ3wiXT9bXj5dKj4pL2csQz17RWE6ZnVuY3Rpb24oYSxiKXthLmhyZWYmJmEuc2V0QXR0cmlidXRlKCJocmVmIixDLlgoYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSk7YS5zcmMmJmEuc2V0QXR0cmlidXRlKCJzcmMiLEMuWChhLmdldEF0dHJpYnV0ZSgic3JjIiksYikpO2lmKCJzdHlsZSI9PT1hLmxvY2FsTmFtZSl7dmFyIGM9Qy5xYShhLnRleHRDb250ZW50LGIsbGIpO2EudGV4dENvbnRlbnQ9Qy5xYShjLGIsbWIpfX0scWE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlcGxhY2UoYywKZnVuY3Rpb24oYSxjLGQsZSl7YT1kLnJlcGxhY2UoL1siJ10vZywiIik7YiYmKGE9Qy5YKGEsYikpO3JldHVybiBjKyInIithKyInIitlfSl9LFg6ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1DLmFhKXtDLmFhPSExO3RyeXt2YXIgYz1uZXcgVVJMKCJiIiwiaHR0cDovL2EiKTtjLnBhdGhuYW1lPSJjJTIwZCI7Qy5hYT0iaHR0cDovL2EvYyUyMGQiPT09Yy5ocmVmfWNhdGNoKHljKXt9fWlmKEMuYWEpcmV0dXJuKG5ldyBVUkwoYSxiKSkuaHJlZjtjPUMueGE7Y3x8KGM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJ0ZW1wIiksQy54YT1jLGMuamE9Yy5jcmVhdGVFbGVtZW50KCJiYXNlIiksYy5oZWFkLmFwcGVuZENoaWxkKGMuamEpLGMuaWE9Yy5jcmVhdGVFbGVtZW50KCJhIikpO2MuamEuaHJlZj1iO2MuaWEuaHJlZj1hO3JldHVybiBjLmlhLmhyZWZ8fGF9fSxWPXthc3luYzohMCxsb2FkOmZ1bmN0aW9uKGEsYixjKXtpZihhKWlmKGEubWF0Y2goL15kYXRhOi8pKXthPQphLnNwbGl0KCIsIik7dmFyIGQ9YVsxXTtkPS0xPGFbMF0uaW5kZXhPZigiO2Jhc2U2NCIpP2F0b2IoZCk6ZGVjb2RlVVJJQ29tcG9uZW50KGQpO2IoZCl9ZWxzZXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vcGVuKCJHRVQiLGEsVi5hc3luYyk7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1lLnJlc3BvbnNlVVJMfHxlLmdldFJlc3BvbnNlSGVhZGVyKCJMb2NhdGlvbiIpO2EmJjA9PT1hLmluZGV4T2YoIi8iKSYmKGE9KGxvY2F0aW9uLm9yaWdpbnx8bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KSthKTt2YXIgZD1lLnJlc3BvbnNlfHxlLnJlc3BvbnNlVGV4dDszMDQ9PT1lLnN0YXR1c3x8MD09PWUuc3RhdHVzfHwyMDA8PWUuc3RhdHVzJiYzMDA+ZS5zdGF0dXM/YihkLGEpOmMoZCl9O2Uuc2VuZCgpfWVsc2UgYygiZXJyb3I6IGhyZWYgbXVzdCBiZSBzcGVjaWZpZWQiKX19LGhhPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwvRWRnZVwvXGQuL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKay5wcm90b3R5cGUubG9hZEltcG9ydHM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthPW0oYSwibGlua1tyZWw9aW1wb3J0XSIpO3EoYSxmdW5jdGlvbihhKXtyZXR1cm4gYi5nKGEpfSl9O2sucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEuaHJlZjtpZih2b2lkIDAhPT10aGlzLmFbY10pe3ZhciBkPXRoaXMuYVtjXTtkJiZkLl9fbG9hZGVkJiYoYS5fX2ltcG9ydD1kLHRoaXMuZihhKSl9ZWxzZSB0aGlzLmIrKyx0aGlzLmFbY109InBlbmRpbmciLFYubG9hZChjLGZ1bmN0aW9uKGEsZCl7YT1iLkthKGEsZHx8Yyk7Yi5hW2NdPWE7Yi5iLS07Yi5sb2FkSW1wb3J0cyhhKTtiLmwoKX0sZnVuY3Rpb24oKXtiLmFbY109bnVsbDtiLmItLTtiLmwoKX0pfTtrLnByb3RvdHlwZS5LYT1mdW5jdGlvbihhLGIpe2lmKCFhKXJldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aGEmJihhPWEucmVwbGFjZShTLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4tMT09PQphLmluZGV4T2YoInR5cGU9Iik/YisiIHR5cGU9aW1wb3J0LWRpc2FibGUgIitjOmF9KSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtjLmlubmVySFRNTD1hO2lmKGMuY29udGVudClhPWMuY29udGVudCxsKGEpO2Vsc2UgZm9yKGE9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2MuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChjLmZpcnN0Q2hpbGQpO2lmKGM9YS5xdWVyeVNlbGVjdG9yKCJiYXNlIikpYj1DLlgoYy5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSxjLnJlbW92ZUF0dHJpYnV0ZSgiaHJlZiIpO2M9bShhLCdsaW5rW3JlbD1pbXBvcnRdLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdW3R5cGU9aW1wb3J0LWRpc2FibGVdLHN0eWxlOm5vdChbdHlwZV0pLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdOm5vdChbdHlwZV0pLHNjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0ibW9kdWxlIl0nKTsKdmFyIGQ9MDtxKGMsZnVuY3Rpb24oYSl7ZyhhKTtDLkVhKGEsYik7YS5zZXRBdHRyaWJ1dGUoImltcG9ydC1kZXBlbmRlbmN5IiwiIik7aWYoInNjcmlwdCI9PT1hLmxvY2FsTmFtZSYmIWEuc3JjJiZhLnRleHRDb250ZW50KXtpZigibW9kdWxlIj09PWEudHlwZSl0aHJvdyBFcnJvcigiSW5saW5lIG1vZHVsZSBzY3JpcHRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEhUTUwgSW1wb3J0cy4iKTthLnNldEF0dHJpYnV0ZSgic3JjIiwiZGF0YTp0ZXh0L2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChhLnRleHRDb250ZW50KygiXG4vLyMgc291cmNlVVJMPSIrYisoZD8iLSIrZDoiIikrIi5qc1xuIikpKTthLnRleHRDb250ZW50PSIiO2QrK319KTtyZXR1cm4gYX07ay5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYoIXRoaXMuYil7dGhpcy5jLmRpc2Nvbm5lY3QoKTt0aGlzLmZsYXR0ZW4oZG9jdW1lbnQpO3ZhciBiPSExLGM9ITEsZD1mdW5jdGlvbigpe2MmJgpiJiYoYS5sb2FkSW1wb3J0cyhkb2N1bWVudCksYS5ifHwoYS5jLm9ic2VydmUoZG9jdW1lbnQuaGVhZCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxhLmRhKCkpKX07dGhpcy5NYShmdW5jdGlvbigpe2M9ITA7ZCgpfSk7dGhpcy5MYShmdW5jdGlvbigpe2I9ITA7ZCgpfSl9fTtrLnByb3RvdHlwZS5mbGF0dGVuPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT1tKGEsImxpbmtbcmVsPWltcG9ydF0iKTtxKGEsZnVuY3Rpb24oYSl7dmFyIGM9Yi5hW2EuaHJlZl07KGEuX19pbXBvcnQ9YykmJmMubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihiLmFbYS5ocmVmXT1hLGEucmVhZHlTdGF0ZT0ibG9hZGluZyIsYS5fX2ltcG9ydD1hLGIuZmxhdHRlbihjKSxhLmFwcGVuZENoaWxkKGMpKX0pfTtrLnByb3RvdHlwZS5MYT1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGUpe2lmKGU8ZCl7dmFyIGY9Y1tlXSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2YucmVtb3ZlQXR0cmlidXRlKCJpbXBvcnQtZGVwZW5kZW5jeSIpOwpxKGYuYXR0cmlidXRlcyxmdW5jdGlvbihhKXtyZXR1cm4gaC5zZXRBdHRyaWJ1dGUoYS5uYW1lLGEudmFsdWUpfSk7dWE9aDtmLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsZik7ZyhoLGZ1bmN0aW9uKCl7dWE9bnVsbDtiKGUrMSl9KX1lbHNlIGEoKX12YXIgYz1tKGRvY3VtZW50LCJzY3JpcHRbaW1wb3J0LWRlcGVuZGVuY3ldIiksZD1jLmxlbmd0aDtiKDApfTtrLnByb3RvdHlwZS5NYT1mdW5jdGlvbihhKXt2YXIgYj1tKGRvY3VtZW50LCJzdHlsZVtpbXBvcnQtZGVwZW5kZW5jeV0sbGlua1tyZWw9c3R5bGVzaGVldF1baW1wb3J0LWRlcGVuZGVuY3ldIiksZD1iLmxlbmd0aDtpZihkKXt2YXIgZT1oYSYmISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJsaW5rW3JlbD1zdHlsZXNoZWV0XVtocmVmXVt0eXBlPWltcG9ydC1kaXNhYmxlXSIpO3EoYixmdW5jdGlvbihiKXtnKGIsZnVuY3Rpb24oKXtiLnJlbW92ZUF0dHJpYnV0ZSgiaW1wb3J0LWRlcGVuZGVuY3kiKTswPT09LS1kJiYKYSgpfSk7aWYoZSYmYi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChiLmxvY2FsTmFtZSk7Zi5fX2FwcGxpZWRFbGVtZW50PWI7Zi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJpbXBvcnQtcGxhY2Vob2xkZXIiKTtiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7Zm9yKGY9YyhiKTtmJiZjKGYpOylmPWMoZik7Zi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCYmKGY9bnVsbCk7ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYixmKTtiLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpfX0pfWVsc2UgYSgpfTtrLnByb3RvdHlwZS5kYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIik7cShiLGZ1bmN0aW9uKGIpe3JldHVybiBhLmYoYil9LCEwKX07ay5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXthLl9fbG9hZGVkfHwoYS5fX2xvYWRlZD0hMCxhLmltcG9ydCYmKGEuaW1wb3J0LnJlYWR5U3RhdGU9CiJjb21wbGV0ZSIpLGEuZGlzcGF0Y2hFdmVudChiKGEuaW1wb3J0PyJsb2FkIjoiZXJyb3IiLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITEsZGV0YWlsOnZvaWQgMH0pKSl9O2sucHJvdG90eXBlLkphPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7cShhLGZ1bmN0aW9uKGEpe3JldHVybiBxKGEuYWRkZWROb2RlcyxmdW5jdGlvbihhKXthJiZhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJihoKGEpP2IuZyhhKTpiLmxvYWRJbXBvcnRzKGEpKX0pfSl9O3ZhciB2YT1udWxsO2lmKE0peD1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIikscSh4LGZ1bmN0aW9uKGEpe2EuaW1wb3J0JiYibG9hZGluZyI9PT1hLmltcG9ydC5yZWFkeVN0YXRlfHwoYS5fX2xvYWRlZD0hMCl9KSx4PWZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7aChhKSYmKGEuX19sb2FkZWQ9ITApfSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix4LCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCngsITApO2Vsc2V7dmFyIFg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwiYmFzZVVSSSIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgoIVh8fFguY29uZmlndXJhYmxlP05vZGU6RWxlbWVudCkucHJvdG90eXBlLCJiYXNlVVJJIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9aCh0aGlzKT90aGlzOmModGhpcyk7cmV0dXJuIGE/YS5ocmVmOlgmJlguZ2V0P1guZ2V0LmNhbGwodGhpcyk6KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJhc2UiKXx8d2luZG93LmxvY2F0aW9uKS5ocmVmfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MTGlua0VsZW1lbnQucHJvdG90eXBlLCJpbXBvcnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ltcG9ydHx8bnVsbH0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KTtlKGZ1bmN0aW9uKCl7dmE9bmV3IGt9KX1mKGZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYigiSFRNTEltcG9ydHNMb2FkZWQiLAp7Y2FuY2VsYWJsZTohMCxidWJibGVzOiEwLGRldGFpbDp2b2lkIDB9KSl9KTthLnVzZU5hdGl2ZT1NO2Eud2hlblJlYWR5PWY7YS5pbXBvcnRGb3JFbGVtZW50PWM7YS5sb2FkSW1wb3J0cz1mdW5jdGlvbihhKXt2YSYmdmEubG9hZEltcG9ydHMoYSl9fSkod2luZG93LkhUTUxJbXBvcnRzPXdpbmRvdy5IVE1MSW1wb3J0c3x8e30pOy8qCgogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwp3aW5kb3cuV2ViQ29tcG9uZW50cz13aW5kb3cuV2ViQ29tcG9uZW50c3x8e2ZsYWdzOnt9fTt2YXIgQ2E9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9IndlYmNvbXBvbmVudHMtbGl0ZS5qcyJdJyksRGE9L3djLSguKykvLHQ9e307aWYoIXQubm9PcHRzKXtsb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2E9YS5zcGxpdCgiPSIpO3ZhciBiO2FbMF0mJihiPWFbMF0ubWF0Y2goRGEpKSYmKHRbYlsxXV09YVsxXXx8ITApfSk7aWYoQ2EpZm9yKHZhciBFYT0wLEZhPXZvaWQgMDtGYT1DYS5hdHRyaWJ1dGVzW0VhXTtFYSsrKSJzcmMiIT09RmEubmFtZSYmKHRbRmEubmFtZV09RmEudmFsdWV8fCEwKTtpZih0LmxvZyYmdC5sb2cuc3BsaXQpe3ZhciBHYT10LmxvZy5zcGxpdCgiLCIpO3QubG9nPXt9O0dhLmZvckVhY2goZnVuY3Rpb24oYSl7dC5sb2dbYV09ITB9KX1lbHNlIHQubG9nPXt9fQp3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncz10O3ZhciBIYT10LnNoYWR5ZG9tO0hhJiYod2luZG93LlNoYWR5RE9NPXdpbmRvdy5TaGFkeURPTXx8e30sd2luZG93LlNoYWR5RE9NLmZvcmNlPUhhKTt2YXIgSWE9dC5yZWdpc3Rlcnx8dC5jZTtJYSYmd2luZG93LmN1c3RvbUVsZW1lbnRzJiYod2luZG93LmN1c3RvbUVsZW1lbnRzLmZvcmNlUG9seWZpbGw9SWEpOy8qCgpDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dApDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwpzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwpmdW5jdGlvbiBKYSgpe3RoaXMucGE9dGhpcy5yb290PW51bGw7dGhpcy5UPSExO3RoaXMuRD10aGlzLlA9dGhpcy5jYT10aGlzLmFzc2lnbmVkU2xvdD10aGlzLmFzc2lnbmVkTm9kZXM9dGhpcy5IPW51bGw7dGhpcy5jaGlsZE5vZGVzPXRoaXMubmV4dFNpYmxpbmc9dGhpcy5wcmV2aW91c1NpYmxpbmc9dGhpcy5sYXN0Q2hpbGQ9dGhpcy5maXJzdENoaWxkPXRoaXMucGFyZW50Tm9kZT10aGlzLks9dm9pZCAwO3RoaXMua2E9dGhpcy5sYT0hMTt0aGlzLk89e319SmEucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt9fTtmdW5jdGlvbiB1KGEpe2EuX19zaGFkeXx8KGEuX19zaGFkeT1uZXcgSmEpO3JldHVybiBhLl9fc2hhZHl9ZnVuY3Rpb24gdihhKXtyZXR1cm4gYSYmYS5fX3NoYWR5fTt2YXIgdz13aW5kb3cuU2hhZHlET018fHt9O3cuR2E9ISghRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93fHwhTm9kZS5wcm90b3R5cGUuZ2V0Um9vdE5vZGUpO3ZhciBLYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJmaXJzdENoaWxkIik7dy5tPSEhKEthJiZLYS5jb25maWd1cmFibGUmJkthLmdldCk7dy5lYT13LmZvcmNlfHwhdy5HYTt3Lko9dy5ub1BhdGNofHwhMTt3Lm9hPXcucHJlZmVyUGVyZm9ybWFuY2U7ZnVuY3Rpb24geShhKXtyZXR1cm4oYT12KGEpKSYmdm9pZCAwIT09YS5maXJzdENoaWxkfWZ1bmN0aW9uIHooYSl7cmV0dXJuIlNoYWR5Um9vdCI9PT1hLnphfWZ1bmN0aW9uIExhKGEpe3JldHVybihhPShhPXYoYSkpJiZhLnJvb3QpJiZNYShhKX0KdmFyIE5hPUVsZW1lbnQucHJvdG90eXBlLE9hPU5hLm1hdGNoZXN8fE5hLm1hdGNoZXNTZWxlY3Rvcnx8TmEubW96TWF0Y2hlc1NlbGVjdG9yfHxOYS5tc01hdGNoZXNTZWxlY3Rvcnx8TmEub01hdGNoZXNTZWxlY3Rvcnx8TmEud2Via2l0TWF0Y2hlc1NlbGVjdG9yLFBhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxRYT0wLFJhPVtdOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe2Zvcig7UmEubGVuZ3RoOyl0cnl7UmEuc2hpZnQoKSgpfWNhdGNoKGEpe3Rocm93IFBhLnRleHRDb250ZW50PVFhKyssYTt9fSkpLm9ic2VydmUoUGEse2NoYXJhY3RlckRhdGE6ITB9KTtmdW5jdGlvbiBTYShhKXtSYS5wdXNoKGEpO1BhLnRleHRDb250ZW50PVFhKyt9dmFyIFRhPSEhZG9jdW1lbnQuY29udGFpbnM7ZnVuY3Rpb24gVWEoYSxiKXtmb3IoO2I7KXtpZihiPT1hKXJldHVybiEwO2I9Yi5fX3NoYWR5X3BhcmVudE5vZGV9cmV0dXJuITF9CmZ1bmN0aW9uIFZhKGEpe2Zvcih2YXIgYj1hLmxlbmd0aC0xOzA8PWI7Yi0tKXt2YXIgYz1hW2JdLGQ9Yy5nZXRBdHRyaWJ1dGUoImlkIil8fGMuZ2V0QXR0cmlidXRlKCJuYW1lIik7ZCYmImxlbmd0aCIhPT1kJiZpc05hTihkKSYmKGFbZF09Yyl9YS5pdGVtPWZ1bmN0aW9uKGIpe3JldHVybiBhW2JdfTthLm5hbWVkSXRlbT1mdW5jdGlvbihiKXtpZigibGVuZ3RoIiE9PWImJmlzTmFOKGIpJiZhW2JdKXJldHVybiBhW2JdO2Zvcih2YXIgYz1pYShhKSxkPWMubmV4dCgpOyFkLmRvbmU7ZD1jLm5leHQoKSlpZihkPWQudmFsdWUsKGQuZ2V0QXR0cmlidXRlKCJpZCIpfHxkLmdldEF0dHJpYnV0ZSgibmFtZSIpKT09YilyZXR1cm4gZDtyZXR1cm4gbnVsbH07cmV0dXJuIGF9CmZ1bmN0aW9uIEEoYSxiLGMsZCl7Yz12b2lkIDA9PT1jPyIiOmM7Zm9yKHZhciBlIGluIGIpe3ZhciBmPWJbZV07aWYoIShkJiYwPD1kLmluZGV4T2YoZSkpKXtmLmNvbmZpZ3VyYWJsZT0hMDt2YXIgZz1jK2U7aWYoZi52YWx1ZSlhW2ddPWYudmFsdWU7ZWxzZSB0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZyxmKX1jYXRjaChoKXt9fX19ZnVuY3Rpb24gQihhKXt2YXIgYj17fTtPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2JbY109T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLGMpfSk7cmV0dXJuIGJ9O3ZhciBXYT1bXSxYYTtmdW5jdGlvbiBZYShhKXtYYXx8KFhhPSEwLFNhKFphKSk7V2EucHVzaChhKX1mdW5jdGlvbiBaYSgpe1hhPSExO2Zvcih2YXIgYT0hIVdhLmxlbmd0aDtXYS5sZW5ndGg7KVdhLnNoaWZ0KCkoKTtyZXR1cm4gYX1aYS5saXN0PVdhO2Z1bmN0aW9uICRhKCl7dGhpcy5hPSExO3RoaXMuYWRkZWROb2Rlcz1bXTt0aGlzLnJlbW92ZWROb2Rlcz1bXTt0aGlzLlM9bmV3IFNldH1mdW5jdGlvbiBhYihhKXthLmF8fChhLmE9ITAsU2EoZnVuY3Rpb24oKXthLmZsdXNoKCl9KSl9JGEucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5hKXt0aGlzLmE9ITE7dmFyIGE9dGhpcy50YWtlUmVjb3JkcygpO2EubGVuZ3RoJiZ0aGlzLlMuZm9yRWFjaChmdW5jdGlvbihiKXtiKGEpfSl9fTskYS5wcm90b3R5cGUudGFrZVJlY29yZHM9ZnVuY3Rpb24oKXtpZih0aGlzLmFkZGVkTm9kZXMubGVuZ3RofHx0aGlzLnJlbW92ZWROb2Rlcy5sZW5ndGgpe3ZhciBhPVt7YWRkZWROb2Rlczp0aGlzLmFkZGVkTm9kZXMscmVtb3ZlZE5vZGVzOnRoaXMucmVtb3ZlZE5vZGVzfV07dGhpcy5hZGRlZE5vZGVzPVtdO3RoaXMucmVtb3ZlZE5vZGVzPVtdO3JldHVybiBhfXJldHVybltdfTsKZnVuY3Rpb24gYmIoYSxiKXt2YXIgYz11KGEpO2MuSHx8KGMuSD1uZXcgJGEpO2MuSC5TLmFkZChiKTt2YXIgZD1jLkg7cmV0dXJue3lhOmIsRjpkLEFhOmEsdGFrZVJlY29yZHM6ZnVuY3Rpb24oKXtyZXR1cm4gZC50YWtlUmVjb3JkcygpfX19ZnVuY3Rpb24gY2IoYSl7dmFyIGI9YSYmYS5GO2ImJihiLlMuZGVsZXRlKGEueWEpLGIuUy5zaXplfHwodShhLkFhKS5IPW51bGwpKX0KZnVuY3Rpb24gZGIoYSxiKXt2YXIgYz1iLmdldFJvb3ROb2RlKCk7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPWM9PT1hLnRhcmdldC5nZXRSb290Tm9kZSgpO2lmKGImJmEuYWRkZWROb2Rlcyl7aWYoYj1BcnJheS5mcm9tKGEuYWRkZWROb2RlcykuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBjPT09YS5nZXRSb290Tm9kZSgpfSksYi5sZW5ndGgpcmV0dXJuIGE9T2JqZWN0LmNyZWF0ZShhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiYWRkZWROb2RlcyIse3ZhbHVlOmIsY29uZmlndXJhYmxlOiEwfSksYX1lbHNlIGlmKGIpcmV0dXJuIGF9KS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KX07dmFyIGViPS9bJlx1MDBBMCJdL2csZmI9L1smXHUwMEEwPD5dL2c7ZnVuY3Rpb24gZ2IoYSl7c3dpdGNoKGEpe2Nhc2UgIiYiOnJldHVybiImYW1wOyI7Y2FzZSAiPCI6cmV0dXJuIiZsdDsiO2Nhc2UgIj4iOnJldHVybiImZ3Q7IjtjYXNlICciJzpyZXR1cm4iJnF1b3Q7IjtjYXNlICJcdTAwYTAiOnJldHVybiImbmJzcDsifX1mdW5jdGlvbiBoYihhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIGliPWhiKCJhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdiciIuc3BsaXQoIiAiKSksamI9aGIoInN0eWxlIHNjcmlwdCB4bXAgaWZyYW1lIG5vZW1iZWQgbm9mcmFtZXMgcGxhaW50ZXh0IG5vc2NyaXB0Ii5zcGxpdCgiICIpKTsKZnVuY3Rpb24ga2IoYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOmEuY2hpbGROb2RlcyxlPTAsZj1kLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hLGw9Yjtzd2l0Y2goaC5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTprPWgubG9jYWxOYW1lO2Zvcih2YXIgbT0iPCIrayxxPWguYXR0cmlidXRlcyx4PTAsTTtNPXFbeF07eCsrKW0rPSIgIitNLm5hbWUrJz0iJytNLnZhbHVlLnJlcGxhY2UoZWIsZ2IpKyciJzttKz0iPiI7aD1pYltrXT9tOm0ra2IoaCxsKSsiPC8iK2srIj4iO2JyZWFrIGE7Y2FzZSBOb2RlLlRFWFRfTk9ERTpoPWguZGF0YTtoPWsmJmpiW2subG9jYWxOYW1lXT9oOmgucmVwbGFjZShmYixnYik7YnJlYWsgYTtjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksCkVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTt9fWMrPWh9cmV0dXJuIGN9O3ZhciBwYj13Lm0scWI9e3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvcihhKX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9xdWVyeVNlbGVjdG9yQWxsKGEpfX0scmI9e307ZnVuY3Rpb24gc2IoYSl7cmJbYV09ZnVuY3Rpb24oYil7cmV0dXJuIGJbIl9fc2hhZHlfbmF0aXZlXyIrYV19fWZ1bmN0aW9uIHRiKGEsYil7QShhLGIsIl9fc2hhZHlfbmF0aXZlXyIpO2Zvcih2YXIgYyBpbiBiKXNiKGMpfWZ1bmN0aW9uIEQoYSxiKXtiPXZvaWQgMD09PWI/W106Yjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXSxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSxkKTtlJiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fc2hhZHlfbmF0aXZlXyIrZCxlKSxlLnZhbHVlP3FiW2RdfHwocWJbZF09ZS52YWx1ZSk6c2IoZCkpfX0KdmFyIEU9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfQUxMLG51bGwsITEpLEY9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxudWxsLCExKSx1Yj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0Iik7ZnVuY3Rpb24gdmIoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkOylhLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGIpfXZhciB3Yj1bImZpcnN0RWxlbWVudENoaWxkIiwibGFzdEVsZW1lbnRDaGlsZCIsImNoaWxkcmVuIiwiY2hpbGRFbGVtZW50Q291bnQiXSx4Yj1bInF1ZXJ5U2VsZWN0b3IiLCJxdWVyeVNlbGVjdG9yQWxsIl07CmZ1bmN0aW9uIHliKCl7dmFyIGE9WyJkaXNwYXRjaEV2ZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiXTt3aW5kb3cuRXZlbnRUYXJnZXQ/RCh3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlLGEpOihEKE5vZGUucHJvdG90eXBlLGEpLEQoV2luZG93LnByb3RvdHlwZSxhKSk7cGI/RChOb2RlLnByb3RvdHlwZSwicGFyZW50Tm9kZSBmaXJzdENoaWxkIGxhc3RDaGlsZCBwcmV2aW91c1NpYmxpbmcgbmV4dFNpYmxpbmcgY2hpbGROb2RlcyBwYXJlbnRFbGVtZW50IHRleHRDb250ZW50Ii5zcGxpdCgiICIpKTp0YihOb2RlLnByb3RvdHlwZSx7cGFyZW50Tm9kZTp7Z2V0OmZ1bmN0aW9uKCl7RS5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBFLnBhcmVudE5vZGUoKX19LGZpcnN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5maXJzdENoaWxkKCl9fSxsYXN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9CnRoaXM7cmV0dXJuIEUubGFzdENoaWxkKCl9fSxwcmV2aW91c1NpYmxpbmc6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5wcmV2aW91c1NpYmxpbmcoKX19LG5leHRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtFLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEUubmV4dFNpYmxpbmcoKX19LGNoaWxkTm9kZXM6e2dldDpmdW5jdGlvbigpe3ZhciBhPVtdO0UuY3VycmVudE5vZGU9dGhpcztmb3IodmFyIGM9RS5maXJzdENoaWxkKCk7YzspYS5wdXNoKGMpLGM9RS5uZXh0U2libGluZygpO3JldHVybiBhfX0scGFyZW50RWxlbWVudDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnBhcmVudE5vZGUoKX19LHRleHRDb250ZW50OntnZXQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpmb3IodmFyIGE9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLApOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLCExKSxjPSIiLGQ7ZD1hLm5leHROb2RlKCk7KWMrPWQubm9kZVZhbHVlO3JldHVybiBjO2RlZmF1bHQ6cmV0dXJuIHRoaXMubm9kZVZhbHVlfX0sc2V0OmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGF8fG51bGw9PT1hKWE9IiI7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6dmIodGhpcyk7KDA8YS5sZW5ndGh8fHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJnRoaXMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX19fSk7RChOb2RlLnByb3RvdHlwZSwiYXBwZW5kQ2hpbGQgaW5zZXJ0QmVmb3JlIHJlbW92ZUNoaWxkIHJlcGxhY2VDaGlsZCBjbG9uZU5vZGUgY29udGFpbnMiLnNwbGl0KCIgIikpOwphPXtmaXJzdEVsZW1lbnRDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLmZpcnN0Q2hpbGQoKX19LGxhc3RFbGVtZW50Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0YuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRi5sYXN0Q2hpbGQoKX19LGNoaWxkcmVuOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtGLmN1cnJlbnROb2RlPXRoaXM7Zm9yKHZhciBjPUYuZmlyc3RDaGlsZCgpO2M7KWEucHVzaChjKSxjPUYubmV4dFNpYmxpbmcoKTtyZXR1cm4gVmEoYSl9fSxjaGlsZEVsZW1lbnRDb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4/dGhpcy5jaGlsZHJlbi5sZW5ndGg6MH19fTtwYj8oRChFbGVtZW50LnByb3RvdHlwZSx3YiksRChFbGVtZW50LnByb3RvdHlwZSxbInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLCJpbm5lckhUTUwiXSksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsCiJjaGlsZHJlbiIpJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImNoaWxkcmVuIl0pLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSYmRChIVE1MRWxlbWVudC5wcm90b3R5cGUsWyJpbm5lckhUTUwiXSkpOih0YihFbGVtZW50LnByb3RvdHlwZSxhKSx0YihFbGVtZW50LnByb3RvdHlwZSx7cHJldmlvdXNFbGVtZW50U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnByZXZpb3VzU2libGluZygpfX0sbmV4dEVsZW1lbnRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtGLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEYubmV4dFNpYmxpbmcoKX19LGlubmVySFRNTDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGtiKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuX19zaGFkeV9uYXRpdmVfY2hpbGROb2Rlc30pfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lPwp0aGlzLmNvbnRlbnQ6dGhpczt2YihiKTt2YXIgZD10aGlzLmxvY2FsTmFtZXx8ImRpdiI7ZD10aGlzLm5hbWVzcGFjZVVSSSYmdGhpcy5uYW1lc3BhY2VVUkkhPT11Yi5uYW1lc3BhY2VVUkk/dWIuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLGQpOnViLmNyZWF0ZUVsZW1lbnQoZCk7ZC5pbm5lckhUTUw9YTtmb3IoYT0idGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWU/ZC5jb250ZW50OmQ7ZD1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGQsdm9pZCAwKX19fSkpO0QoRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUgaGFzQXR0cmlidXRlIHJlbW92ZUF0dHJpYnV0ZSBmb2N1cyBibHVyIi5zcGxpdCgiICIpKTtEKEVsZW1lbnQucHJvdG90eXBlLHhiKTtEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImZvY3VzIiwiYmx1ciIsImNvbnRhaW5zIl0pO3BiJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKWyJwYXJlbnRFbGVtZW50IiwiY2hpbGRyZW4iLCJpbm5lckhUTUwiXSk7d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQmJkQod2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQucHJvdG90eXBlLFsiaW5uZXJIVE1MIl0pO3BiP0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUsd2IpOnRiKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLGEpO0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUseGIpO3BiPyhEKERvY3VtZW50LnByb3RvdHlwZSx3YiksRChEb2N1bWVudC5wcm90b3R5cGUsWyJhY3RpdmVFbGVtZW50Il0pKTp0YihEb2N1bWVudC5wcm90b3R5cGUsYSk7RChEb2N1bWVudC5wcm90b3R5cGUsWyJpbXBvcnROb2RlIiwiZ2V0RWxlbWVudEJ5SWQiXSk7RChEb2N1bWVudC5wcm90b3R5cGUseGIpfTt2YXIgemI9Qih7Z2V0IGNoaWxkTm9kZXMoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NoaWxkTm9kZXN9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdENoaWxkfSxnZXQgbGFzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9sYXN0Q2hpbGR9LGdldCB0ZXh0Q29udGVudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXt0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnQ9YX0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZEVsZW1lbnRDb3VudH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZHJlbn0sZ2V0IGZpcnN0RWxlbWVudENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdEVsZW1lbnRDaGlsZH0sZ2V0IGxhc3RFbGVtZW50Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2xhc3RFbGVtZW50Q2hpbGR9LGdldCBpbm5lckhUTUwoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2lubmVySFRNTH0sCnNldCBpbm5lckhUTUwoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9pbm5lckhUTUw9YX0sZ2V0IHNoYWRvd1Jvb3QoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3NoYWRvd1Jvb3R9fSksQWI9Qih7Z2V0IHBhcmVudEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3BhcmVudEVsZW1lbnR9LGdldCBwYXJlbnROb2RlKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wYXJlbnROb2RlfSxnZXQgbmV4dFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRTaWJsaW5nfSxnZXQgcHJldmlvdXNTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9LGdldCBuZXh0RWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ30sZ2V0IHByZXZpb3VzRWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3ByZXZpb3VzRWxlbWVudFNpYmxpbmd9LGdldCBjbGFzc05hbWUoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NsYXNzTmFtZX0sCnNldCBjbGFzc05hbWUoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9jbGFzc05hbWU9YX19KSxCYjtmb3IoQmIgaW4gemIpemJbQmJdLmVudW1lcmFibGU9ITE7Zm9yKHZhciBDYiBpbiBBYilBYltDYl0uZW51bWVyYWJsZT0hMTt2YXIgRGI9dy5tfHx3LkosRWI9RGI/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKGEpe3ZhciBiPXUoYSk7Yi5sYXx8KGIubGE9ITAsQShhLEFiKSl9LEZiPURiP2Z1bmN0aW9uKCl7fTpmdW5jdGlvbihhKXt2YXIgYj11KGEpO2Iua2F8fChiLmthPSEwLEEoYSx6YikpfTt2YXIgR2I9Il9fZXZlbnRXcmFwcGVycyIrRGF0ZS5ub3coKSxIYj1mdW5jdGlvbigpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXZlbnQucHJvdG90eXBlLCJjb21wb3NlZCIpO3JldHVybiBhP2Z1bmN0aW9uKGIpe3JldHVybiBhLmdldC5jYWxsKGIpfTpudWxsfSgpLEliPXtibHVyOiEwLGZvY3VzOiEwLGZvY3VzaW46ITAsZm9jdXNvdXQ6ITAsY2xpY2s6ITAsZGJsY2xpY2s6ITAsbW91c2Vkb3duOiEwLG1vdXNlZW50ZXI6ITAsbW91c2VsZWF2ZTohMCxtb3VzZW1vdmU6ITAsbW91c2VvdXQ6ITAsbW91c2VvdmVyOiEwLG1vdXNldXA6ITAsd2hlZWw6ITAsYmVmb3JlaW5wdXQ6ITAsaW5wdXQ6ITAsa2V5ZG93bjohMCxrZXl1cDohMCxjb21wb3NpdGlvbnN0YXJ0OiEwLGNvbXBvc2l0aW9udXBkYXRlOiEwLGNvbXBvc2l0aW9uZW5kOiEwLHRvdWNoc3RhcnQ6ITAsdG91Y2hlbmQ6ITAsdG91Y2htb3ZlOiEwLHRvdWNoY2FuY2VsOiEwLHBvaW50ZXJvdmVyOiEwLApwb2ludGVyZW50ZXI6ITAscG9pbnRlcmRvd246ITAscG9pbnRlcm1vdmU6ITAscG9pbnRlcnVwOiEwLHBvaW50ZXJjYW5jZWw6ITAscG9pbnRlcm91dDohMCxwb2ludGVybGVhdmU6ITAsZ290cG9pbnRlcmNhcHR1cmU6ITAsbG9zdHBvaW50ZXJjYXB0dXJlOiEwLGRyYWdzdGFydDohMCxkcmFnOiEwLGRyYWdlbnRlcjohMCxkcmFnbGVhdmU6ITAsZHJhZ292ZXI6ITAsZHJvcDohMCxkcmFnZW5kOiEwLERPTUFjdGl2YXRlOiEwLERPTUZvY3VzSW46ITAsRE9NRm9jdXNPdXQ6ITAsa2V5cHJlc3M6ITB9LEpiPXtET01BdHRyTW9kaWZpZWQ6ITAsRE9NQXR0cmlidXRlTmFtZUNoYW5nZWQ6ITAsRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkOiEwLERPTUVsZW1lbnROYW1lQ2hhbmdlZDohMCxET01Ob2RlSW5zZXJ0ZWQ6ITAsRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50OiEwLERPTU5vZGVSZW1vdmVkOiEwLERPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50OiEwLERPTVN1YnRyZWVNb2RpZmllZDohMH07CmZ1bmN0aW9uIEtiKGEpe3JldHVybiBhIGluc3RhbmNlb2YgTm9kZT9hLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTphfWZ1bmN0aW9uIExiKGEsYil7dmFyIGM9W10sZD1hO2ZvcihhPUtiKGEpO2Q7KWMucHVzaChkKSxkLl9fc2hhZHlfYXNzaWduZWRTbG90P2Q9ZC5fX3NoYWR5X2Fzc2lnbmVkU2xvdDpkLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZkLmhvc3QmJihifHxkIT09YSk/ZD1kLmhvc3Q6ZD1kLl9fc2hhZHlfcGFyZW50Tm9kZTtjW2MubGVuZ3RoLTFdPT09ZG9jdW1lbnQmJmMucHVzaCh3aW5kb3cpO3JldHVybiBjfWZ1bmN0aW9uIE1iKGEpe2EuX19jb21wb3NlZFBhdGh8fChhLl9fY29tcG9zZWRQYXRoPUxiKGEudGFyZ2V0LCEwKSk7cmV0dXJuIGEuX19jb21wb3NlZFBhdGh9CmZ1bmN0aW9uIE5iKGEsYil7aWYoIXopcmV0dXJuIGE7YT1MYihhLCEwKTtmb3IodmFyIGM9MCxkLGU9dm9pZCAwLGYsZz12b2lkIDA7YzxiLmxlbmd0aDtjKyspaWYoZD1iW2NdLGY9S2IoZCksZiE9PWUmJihnPWEuaW5kZXhPZihmKSxlPWYpLCF6KGYpfHwtMTxnKXJldHVybiBkfWZ1bmN0aW9uIE9iKGEpe2Z1bmN0aW9uIGIoYixkKXtiPW5ldyBhKGIsZCk7Yi5fX2NvbXBvc2VkPWQmJiEhZC5jb21wb3NlZDtyZXR1cm4gYn1iLl9fcHJvdG9fXz1hO2IucHJvdG90eXBlPWEucHJvdG90eXBlO3JldHVybiBifXZhciBQYj17Zm9jdXM6ITAsYmx1cjohMH07ZnVuY3Rpb24gUWIoYSl7cmV0dXJuIGEuX190YXJnZXQhPT1hLnRhcmdldHx8YS5fX3JlbGF0ZWRUYXJnZXQhPT1hLnJlbGF0ZWRUYXJnZXR9CmZ1bmN0aW9uIFJiKGEsYixjKXtpZihjPWIuX19oYW5kbGVycyYmYi5fX2hhbmRsZXJzW2EudHlwZV0mJmIuX19oYW5kbGVyc1thLnR5cGVdW2NdKWZvcih2YXIgZD0wLGU7KGU9Y1tkXSkmJighUWIoYSl8fGEudGFyZ2V0IT09YS5yZWxhdGVkVGFyZ2V0KSYmKGUuY2FsbChiLGEpLCFhLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKTtkKyspO30KZnVuY3Rpb24gU2IoYSl7dmFyIGI9YS5jb21wb3NlZFBhdGgoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiY3VycmVudFRhcmdldCIse2dldDpmdW5jdGlvbigpe3JldHVybiBkfSxjb25maWd1cmFibGU6ITB9KTtmb3IodmFyIGM9Yi5sZW5ndGgtMTswPD1jO2MtLSl7dmFyIGQ9YltjXTtSYihhLGQsImNhcHR1cmUiKTtpZihhLlopcmV0dXJufU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJldmVudFBoYXNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEV2ZW50LkFUX1RBUkdFVH19KTt2YXIgZTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXtkPWJbY107dmFyIGY9dihkKTtmPWYmJmYucm9vdDtpZigwPT09Y3x8ZiYmZj09PWUpaWYoUmIoYSxkLCJidWJibGUiKSxkIT09d2luZG93JiYoZT1kLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKSksYS5aKWJyZWFrfX0KZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgaD1hW2ddLGs9aC50eXBlLGw9aC5jYXB0dXJlLG09aC5vbmNlLHE9aC5wYXNzaXZlO2lmKGI9PT1oLm5vZGUmJmM9PT1rJiZkPT09bCYmZT09PW0mJmY9PT1xKXJldHVybiBnfXJldHVybi0xfQpmdW5jdGlvbiBVYihhLGIsYyl7aWYoYil7dmFyIGQ9dHlwZW9mIGI7aWYoImZ1bmN0aW9uIj09PWR8fCJvYmplY3QiPT09ZClpZigib2JqZWN0IiE9PWR8fGIuaGFuZGxlRXZlbnQmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5oYW5kbGVFdmVudCl7aWYoSmJbYV0pcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyk7aWYoYyYmIm9iamVjdCI9PT10eXBlb2YgYyl7dmFyIGU9ISFjLmNhcHR1cmU7dmFyIGY9ISFjLm9uY2U7dmFyIGc9ISFjLnBhc3NpdmV9ZWxzZSBlPSEhYyxnPWY9ITE7dmFyIGg9YyYmYy4kfHx0aGlzLGs9YltHYl07aWYoayl7aWYoLTE8VGIoayxoLGEsZSxmLGcpKXJldHVybn1lbHNlIGJbR2JdPVtdO2s9ZnVuY3Rpb24oZSl7ZiYmdGhpcy5fX3NoYWR5X3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2UuX190YXJnZXR8fFZiKGUpO2lmKGghPT10aGlzKXt2YXIgZz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsImN1cnJlbnRUYXJnZXQiKTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImN1cnJlbnRUYXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaH0sY29uZmlndXJhYmxlOiEwfSl9ZS5fX3ByZXZpb3VzQ3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQ7aWYoIXooaCl8fC0xIT1lLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YoaCkpaWYoZS5jb21wb3NlZHx8LTE8ZS5jb21wb3NlZFBhdGgoKS5pbmRleE9mKGgpKWlmKFFiKGUpJiZlLnRhcmdldD09PWUucmVsYXRlZFRhcmdldCllLmV2ZW50UGhhc2U9PT1FdmVudC5CVUJCTElOR19QSEFTRSYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtlbHNlIGlmKGUuZXZlbnRQaGFzZT09PUV2ZW50LkNBUFRVUklOR19QSEFTRXx8ZS5idWJibGVzfHxlLnRhcmdldD09PWh8fGggaW5zdGFuY2VvZiBXaW5kb3cpe3ZhciBrPSJmdW5jdGlvbiI9PT1kP2IuY2FsbChoLGUpOmIuaGFuZGxlRXZlbnQmJmIuaGFuZGxlRXZlbnQoZSk7aCE9PXRoaXMmJihnPyhPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwKImN1cnJlbnRUYXJnZXQiLGcpLGc9bnVsbCk6ZGVsZXRlIGUuY3VycmVudFRhcmdldCk7cmV0dXJuIGt9fTtiW0diXS5wdXNoKHtub2RlOmgsdHlwZTphLGNhcHR1cmU6ZSxvbmNlOmYscGFzc2l2ZTpnLFlhOmt9KTtQYlthXT8odGhpcy5fX2hhbmRsZXJzPXRoaXMuX19oYW5kbGVyc3x8e30sdGhpcy5fX2hhbmRsZXJzW2FdPXRoaXMuX19oYW5kbGVyc1thXXx8e2NhcHR1cmU6W10sYnViYmxlOltdfSx0aGlzLl9faGFuZGxlcnNbYV1bZT8iY2FwdHVyZSI6ImJ1YmJsZSJdLnB1c2goaykpOnRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGssYyl9fX0KZnVuY3Rpb24gV2IoYSxiLGMpe2lmKGIpe2lmKEpiW2FdKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2lmKGMmJiJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBkPSEhYy5jYXB0dXJlO3ZhciBlPSEhYy5vbmNlO3ZhciBmPSEhYy5wYXNzaXZlfWVsc2UgZD0hIWMsZj1lPSExO3ZhciBnPWMmJmMuJHx8dGhpcyxoPXZvaWQgMDt2YXIgaz1udWxsO3RyeXtrPWJbR2JdfWNhdGNoKGwpe31rJiYoZT1UYihrLGcsYSxkLGUsZiksLTE8ZSYmKGg9ay5zcGxpY2UoZSwxKVswXS5ZYSxrLmxlbmd0aHx8KGJbR2JdPXZvaWQgMCkpKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxofHxiLGMpO2gmJlBiW2FdJiZ0aGlzLl9faGFuZGxlcnMmJnRoaXMuX19oYW5kbGVyc1thXSYmKGE9dGhpcy5fX2hhbmRsZXJzW2FdW2Q/ImNhcHR1cmUiOiJidWJibGUiXSxoPWEuaW5kZXhPZihoKSwtMTxoJiZhLnNwbGljZShoLDEpKX19CmZ1bmN0aW9uIFhiKCl7Zm9yKHZhciBhIGluIFBiKXdpbmRvdy5fX3NoYWR5X25hdGl2ZV9hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7YS5fX3RhcmdldHx8KFZiKGEpLFNiKGEpKX0sITApfQp2YXIgWWI9Qih7Z2V0IGNvbXBvc2VkKCl7dm9pZCAwPT09dGhpcy5fX2NvbXBvc2VkJiYoSGI/dGhpcy5fX2NvbXBvc2VkPSJmb2N1c2luIj09PXRoaXMudHlwZXx8ImZvY3Vzb3V0Ij09PXRoaXMudHlwZXx8SGIodGhpcyk6ITEhPT10aGlzLmlzVHJ1c3RlZCYmKHRoaXMuX19jb21wb3NlZD1JYlt0aGlzLnR5cGVdKSk7cmV0dXJuIHRoaXMuX19jb21wb3NlZHx8ITF9LGNvbXBvc2VkUGF0aDpmdW5jdGlvbigpe3RoaXMuX19jb21wb3NlZFBhdGh8fCh0aGlzLl9fY29tcG9zZWRQYXRoPUxiKHRoaXMuX190YXJnZXQsdGhpcy5jb21wb3NlZCkpO3JldHVybiB0aGlzLl9fY29tcG9zZWRQYXRofSxnZXQgdGFyZ2V0KCl7cmV0dXJuIE5iKHRoaXMuY3VycmVudFRhcmdldHx8dGhpcy5fX3ByZXZpb3VzQ3VycmVudFRhcmdldCx0aGlzLmNvbXBvc2VkUGF0aCgpKX0sZ2V0IHJlbGF0ZWRUYXJnZXQoKXtpZighdGhpcy5fX3JlbGF0ZWRUYXJnZXQpcmV0dXJuIG51bGw7dGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGh8fAoodGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGg9TGIodGhpcy5fX3JlbGF0ZWRUYXJnZXQsITApKTtyZXR1cm4gTmIodGhpcy5jdXJyZW50VGFyZ2V0fHx0aGlzLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0LHRoaXMuX19yZWxhdGVkVGFyZ2V0Q29tcG9zZWRQYXRoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj0hMH0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj10aGlzLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPSEwfX0pOwpmdW5jdGlvbiBWYihhKXthLl9fdGFyZ2V0PWEudGFyZ2V0O2EuX19yZWxhdGVkVGFyZ2V0PWEucmVsYXRlZFRhcmdldDtpZih3Lm0pe3ZhciBiPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtpZighT2JqZWN0Lmhhc093blByb3BlcnR5KGIsIl9fc2hhZHlfcGF0Y2hlZFByb3RvIikpe3ZhciBjPU9iamVjdC5jcmVhdGUoYik7Yy5fX3NoYWR5X3NvdXJjZVByb3RvPWI7QShjLFliKTtiLl9fc2hhZHlfcGF0Y2hlZFByb3RvPWN9YS5fX3Byb3RvX189Yi5fX3NoYWR5X3BhdGNoZWRQcm90b31lbHNlIEEoYSxZYil9dmFyIFpiPU9iKEV2ZW50KSwkYj1PYihDdXN0b21FdmVudCksYWM9T2IoTW91c2VFdmVudCk7CmZ1bmN0aW9uIGJjKCl7aWYoIUhiJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV2ZW50LnByb3RvdHlwZSwiaXNUcnVzdGVkIikpe3ZhciBhPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IE1vdXNlRXZlbnQoImNsaWNrIix7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNvbXBvc2VkOiEwfSk7dGhpcy5fX3NoYWR5X2Rpc3BhdGNoRXZlbnQoYSl9O0VsZW1lbnQucHJvdG90eXBlLmNsaWNrP0VsZW1lbnQucHJvdG90eXBlLmNsaWNrPWE6SFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrJiYoSFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrPWEpfX12YXIgY2M9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRG9jdW1lbnQucHJvdG90eXBlKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIm9uIj09PWEuc3Vic3RyaW5nKDAsMil9KTtmdW5jdGlvbiBkYyhhLGIpe3JldHVybntpbmRleDphLEw6W10sUjpifX0KZnVuY3Rpb24gZWMoYSxiLGMsZCl7dmFyIGU9MCxmPTAsZz0wLGg9MCxrPU1hdGgubWluKGItZSxkLWYpO2lmKDA9PWUmJjA9PWYpYTp7Zm9yKGc9MDtnPGs7ZysrKWlmKGFbZ10hPT1jW2ddKWJyZWFrIGE7Zz1rfWlmKGI9PWEubGVuZ3RoJiZkPT1jLmxlbmd0aCl7aD1hLmxlbmd0aDtmb3IodmFyIGw9Yy5sZW5ndGgsbT0wO208ay1nJiZmYyhhWy0taF0sY1stLWxdKTspbSsrO2g9bX1lKz1nO2YrPWc7Yi09aDtkLT1oO2lmKDA9PWItZSYmMD09ZC1mKXJldHVybltdO2lmKGU9PWIpe2ZvcihiPWRjKGUsMCk7ZjxkOyliLkwucHVzaChjW2YrK10pO3JldHVybltiXX1pZihmPT1kKXJldHVybltkYyhlLGItZSldO2s9ZTtnPWY7ZD1kLWcrMTtoPWItaysxO2I9QXJyYXkoZCk7Zm9yKGw9MDtsPGQ7bCsrKWJbbF09QXJyYXkoaCksYltsXVswXT1sO2ZvcihsPTA7bDxoO2wrKyliWzBdW2xdPWw7Zm9yKGw9MTtsPGQ7bCsrKWZvcihtPTE7bTxoO20rKylpZihhW2srbS0xXT09PWNbZytsLTFdKWJbbF1bbV09CmJbbC0xXVttLTFdO2Vsc2V7dmFyIHE9YltsLTFdW21dKzEseD1iW2xdW20tMV0rMTtiW2xdW21dPXE8eD9xOnh9az1iLmxlbmd0aC0xO2c9YlswXS5sZW5ndGgtMTtkPWJba11bZ107Zm9yKGE9W107MDxrfHwwPGc7KTA9PWs/KGEucHVzaCgyKSxnLS0pOjA9PWc/KGEucHVzaCgzKSxrLS0pOihoPWJbay0xXVtnLTFdLGw9YltrLTFdW2ddLG09YltrXVtnLTFdLHE9bDxtP2w8aD9sOmg6bTxoP206aCxxPT1oPyhoPT1kP2EucHVzaCgwKTooYS5wdXNoKDEpLGQ9aCksay0tLGctLSk6cT09bD8oYS5wdXNoKDMpLGstLSxkPWwpOihhLnB1c2goMiksZy0tLGQ9bSkpO2EucmV2ZXJzZSgpO2I9dm9pZCAwO2s9W107Zm9yKGc9MDtnPGEubGVuZ3RoO2crKylzd2l0Y2goYVtnXSl7Y2FzZSAwOmImJihrLnB1c2goYiksYj12b2lkIDApO2UrKztmKys7YnJlYWs7Y2FzZSAxOmJ8fChiPWRjKGUsMCkpO2IuUisrO2UrKztiLkwucHVzaChjW2ZdKTtmKys7YnJlYWs7Y2FzZSAyOmJ8fChiPWRjKGUsMCkpOwpiLlIrKztlKys7YnJlYWs7Y2FzZSAzOmJ8fChiPWRjKGUsMCkpLGIuTC5wdXNoKGNbZl0pLGYrK31iJiZrLnB1c2goYik7cmV0dXJuIGt9ZnVuY3Rpb24gZmMoYSxiKXtyZXR1cm4gYT09PWJ9O2Z1bmN0aW9uIGdjKGEsYixjKXtFYihhKTtjPWN8fG51bGw7dmFyIGQ9dShhKSxlPXUoYiksZj1jP3UoYyk6bnVsbDtkLnByZXZpb3VzU2libGluZz1jP2YucHJldmlvdXNTaWJsaW5nOmIuX19zaGFkeV9sYXN0Q2hpbGQ7aWYoZj12KGQucHJldmlvdXNTaWJsaW5nKSlmLm5leHRTaWJsaW5nPWE7aWYoZj12KGQubmV4dFNpYmxpbmc9YykpZi5wcmV2aW91c1NpYmxpbmc9YTtkLnBhcmVudE5vZGU9YjtjP2M9PT1lLmZpcnN0Q2hpbGQmJihlLmZpcnN0Q2hpbGQ9YSk6KGUubGFzdENoaWxkPWEsZS5maXJzdENoaWxkfHwoZS5maXJzdENoaWxkPWEpKTtlLmNoaWxkTm9kZXM9bnVsbH0KZnVuY3Rpb24gaGMoYSxiLGMpe0ZiKGIpO3ZhciBkPXUoYik7dm9pZCAwIT09ZC5maXJzdENoaWxkJiYoZC5jaGlsZE5vZGVzPW51bGwpO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2Q9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspZ2MoZFtlXSxiLGMpO2E9dShhKTtiPXZvaWQgMCE9PWEuZmlyc3RDaGlsZD9udWxsOnZvaWQgMDthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YjthLmNoaWxkTm9kZXM9Yn1lbHNlIGdjKGEsYixjKX0KZnVuY3Rpb24gaWMoYSxiKXt2YXIgYz11KGEpO2I9dShiKTthPT09Yi5maXJzdENoaWxkJiYoYi5maXJzdENoaWxkPWMubmV4dFNpYmxpbmcpO2E9PT1iLmxhc3RDaGlsZCYmKGIubGFzdENoaWxkPWMucHJldmlvdXNTaWJsaW5nKTthPWMucHJldmlvdXNTaWJsaW5nO3ZhciBkPWMubmV4dFNpYmxpbmc7YSYmKHUoYSkubmV4dFNpYmxpbmc9ZCk7ZCYmKHUoZCkucHJldmlvdXNTaWJsaW5nPWEpO2MucGFyZW50Tm9kZT1jLnByZXZpb3VzU2libGluZz1jLm5leHRTaWJsaW5nPXZvaWQgMDt2b2lkIDAhPT1iLmNoaWxkTm9kZXMmJihiLmNoaWxkTm9kZXM9bnVsbCl9CmZ1bmN0aW9uIGpjKGEpe3ZhciBiPXUoYSk7aWYodm9pZCAwPT09Yi5maXJzdENoaWxkKXtiLmNoaWxkTm9kZXM9bnVsbDt2YXIgYz1iLmZpcnN0Q2hpbGQ9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkfHxudWxsO2IubGFzdENoaWxkPWEuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfHxudWxsO0ZiKGEpO2I9Yztmb3IoYz12b2lkIDA7YjtiPWIuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmcpe3ZhciBkPXUoYik7ZC5wYXJlbnROb2RlPWE7ZC5uZXh0U2libGluZz1iLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nfHxudWxsO2QucHJldmlvdXNTaWJsaW5nPWN8fG51bGw7Yz1iO0ViKGIpfX19O3ZhciBrYz1udWxsO2Z1bmN0aW9uIEcoKXtrY3x8KGtjPXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKTtyZXR1cm4ga2N8fG51bGx9ZnVuY3Rpb24gbGMoYSxiKXt2YXIgYz1HKCk7YyYmYy51bnNjb3BlTm9kZShhLGIpfWZ1bmN0aW9uIG1jKGEsYil7dmFyIGM9RygpO2lmKCFjKXJldHVybiEwO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2M9ITA7YT1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGQ9MDtjJiZkPGEubGVuZ3RoO2QrKyljPWMmJm1jKGFbZF0sYik7cmV0dXJuIGN9cmV0dXJuIGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERT8hMDpjLmN1cnJlbnRTY29wZUZvck5vZGUoYSk9PT1ifWZ1bmN0aW9uIG5jKGEpe2lmKGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4iIjt2YXIgYj1HKCk7cmV0dXJuIGI/Yi5jdXJyZW50U2NvcGVGb3JOb2RlKGEpOiIifQpmdW5jdGlvbiBvYyhhLGIpe2lmKGEpe2Eubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYihhKTthPWEuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgYz0wLGQ7YzxhLmxlbmd0aDtjKyspZD1hW2NdLGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmb2MoZCxiKX19O3ZhciBwYz13aW5kb3cuZG9jdW1lbnQscWM9dy5vYSxyYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJpc0Nvbm5lY3RlZCIpLHNjPXJjJiZyYy5nZXQ7ZnVuY3Rpb24gdGMoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KWEuX19zaGFkeV9yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiB1YyhhKXt2YXIgYj12KGEpO2lmKGImJnZvaWQgMCE9PWIuSyl7Yj1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkPWIubGVuZ3RoLGU9dm9pZCAwO2M8ZCYmKGU9YltjXSk7YysrKXVjKGUpfWlmKGE9dihhKSlhLks9dm9pZCAwfWZ1bmN0aW9uIHZjKGEpe3ZhciBiPWE7YSYmInNsb3QiPT09YS5sb2NhbE5hbWUmJihiPShiPShiPXYoYSkpJiZiLkQpJiZiLmxlbmd0aD9iWzBdOnZjKGEuX19zaGFkeV9uZXh0U2libGluZykpO3JldHVybiBifQpmdW5jdGlvbiB3YyhhLGIsYyl7aWYoYT0oYT12KGEpKSYmYS5IKWImJmEuYWRkZWROb2Rlcy5wdXNoKGIpLGMmJmEucmVtb3ZlZE5vZGVzLnB1c2goYyksYWIoYSl9CnZhciBDYz1CKHtnZXQgcGFyZW50Tm9kZSgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLnBhcmVudE5vZGU7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGV9LGdldCBmaXJzdENoaWxkKCl7dmFyIGE9dih0aGlzKTthPWEmJmEuZmlyc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZH0sZ2V0IGxhc3RDaGlsZCgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLmxhc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfSxnZXQgbmV4dFNpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5uZXh0U2libGluZztyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmd9LGdldCBwcmV2aW91c1NpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5wcmV2aW91c1NpYmxpbmc7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3ByZXZpb3VzU2libGluZ30sCmdldCBjaGlsZE5vZGVzKCl7aWYoeSh0aGlzKSl7dmFyIGE9dih0aGlzKTtpZighYS5jaGlsZE5vZGVzKXthLmNoaWxkTm9kZXM9W107Zm9yKHZhciBiPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2I7Yj1iLl9fc2hhZHlfbmV4dFNpYmxpbmcpYS5jaGlsZE5vZGVzLnB1c2goYil9dmFyIGM9YS5jaGlsZE5vZGVzfWVsc2UgYz10aGlzLl9fc2hhZHlfbmF0aXZlX2NoaWxkTm9kZXM7Yy5pdGVtPWZ1bmN0aW9uKGEpe3JldHVybiBjW2FdfTtyZXR1cm4gY30sZ2V0IHBhcmVudEVsZW1lbnQoKXt2YXIgYT12KHRoaXMpOyhhPWEmJmEucGFyZW50Tm9kZSkmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGE9bnVsbCk7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudEVsZW1lbnR9LGdldCBpc0Nvbm5lY3RlZCgpe2lmKHNjJiZzYy5jYWxsKHRoaXMpKXJldHVybiEwO2lmKHRoaXMubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlyZXR1cm4hMTsKdmFyIGE9dGhpcy5vd25lckRvY3VtZW50O2lmKFRhKXtpZihhLl9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwfWVsc2UgaWYoYS5kb2N1bWVudEVsZW1lbnQmJmEuZG9jdW1lbnRFbGVtZW50Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwO2ZvcihhPXRoaXM7YSYmIShhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEuX19zaGFkeV9wYXJlbnROb2RlfHwoeihhKT9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hIShhJiZhIGluc3RhbmNlb2YgRG9jdW1lbnQpfSxnZXQgdGV4dENvbnRlbnQoKXtpZih5KHRoaXMpKXtmb3IodmFyIGE9W10sYj0wLGM9dGhpcy5fX3NoYWR5X2NoaWxkTm9kZXMsZDtkPWNbYl07YisrKWQubm9kZVR5cGUhPT1Ob2RlLkNPTU1FTlRfTk9ERSYmYS5wdXNoKGQuX19zaGFkeV90ZXh0Q29udGVudCk7cmV0dXJuIGEuam9pbigiIil9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXtpZigidW5kZWZpbmVkIj09PQp0eXBlb2YgYXx8bnVsbD09PWEpYT0iIjtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTppZigheSh0aGlzKSYmdy5tKXt2YXIgYj10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDsoYiE9dGhpcy5fX3NoYWR5X2xhc3RDaGlsZHx8YiYmYi5ub2RlVHlwZSE9Tm9kZS5URVhUX05PREUpJiZ0Yyh0aGlzKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3RleHRDb250ZW50PWF9ZWxzZSB0Yyh0aGlzKSwoMDxhLmxlbmd0aHx8dGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKSYmdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vd25lckRvY3VtZW50IT09cGMmJmEub3duZXJEb2N1bWVudCE9PXBjKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShhLApiKSxhO2lmKGE9PT10aGlzKXRocm93IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXBwZW5kQ2hpbGQnIG9uICdOb2RlJzogVGhlIG5ldyBjaGlsZCBlbGVtZW50IGNvbnRhaW5zIHRoZSBwYXJlbnQuIik7aWYoYil7dmFyIGM9dihiKTtjPWMmJmMucGFyZW50Tm9kZTtpZih2b2lkIDAhPT1jJiZjIT09dGhpc3x8dm9pZCAwPT09YyYmYi5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2luc2VydEJlZm9yZScgb24gJ05vZGUnOiBUaGUgbm9kZSBiZWZvcmUgd2hpY2ggdGhlIG5ldyBub2RlIGlzIHRvIGJlIGluc2VydGVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4iKTt9aWYoYj09PWEpcmV0dXJuIGE7dmFyIGQ9W10sZT0oYz14Yyh0aGlzKSk/Yy5ob3N0LmxvY2FsTmFtZTpuYyh0aGlzKSxmPWEuX19zaGFkeV9wYXJlbnROb2RlO2lmKGYpe3ZhciBnPW5jKGEpO2YuX19zaGFkeV9yZW1vdmVDaGlsZChhLCEhY3x8CiF4YyhhKSl9Zj0hMDt2YXIgaD0oIXFjfHx2b2lkIDA9PT1hLl9fbm9JbnNlcnRpb25Qb2ludCkmJiFtYyhhLGUpLGs9YyYmIWEuX19ub0luc2VydGlvblBvaW50JiYoIXFjfHxhLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKTtpZihrfHxoKWgmJihnPWd8fG5jKGEpKSxvYyhhLGZ1bmN0aW9uKGEpe2smJiJzbG90Ij09PWEubG9jYWxOYW1lJiZkLnB1c2goYSk7aWYoaCl7dmFyIGI9ZztHKCkmJihiJiZsYyhhLGIpLChiPUcoKSkmJmIuc2NvcGVOb2RlKGEsZSkpfX0pO2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lfHxkLmxlbmd0aClkLmxlbmd0aCYmKGMuYz1jLmN8fFtdLGMuYT1jLmF8fFtdLGMuYj1jLmJ8fHt9LGMuYy5wdXNoLmFwcGx5KGMuYyxkIGluc3RhbmNlb2YgQXJyYXk/ZDpqYShpYShkKSkpKSxjJiZBYyhjKTt5KHRoaXMpJiYoaGMoYSx0aGlzLGIpLGM9dih0aGlzKSxMYSh0aGlzKT8oQWMoYy5yb290KSxmPSExKTpjLnJvb3QmJihmPSExKSk7Zj8KKGM9eih0aGlzKT90aGlzLmhvc3Q6dGhpcyxiPyhiPXZjKGIpLGMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGEsYikpOmMuX19zaGFkeV9uYXRpdmVfYXBwZW5kQ2hpbGQoYSkpOmEub3duZXJEb2N1bWVudCE9PXRoaXMub3duZXJEb2N1bWVudCYmdGhpcy5vd25lckRvY3VtZW50LmFkb3B0Tm9kZShhKTt3Yyh0aGlzLGEpO3JldHVybiBhfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/ITE6YjtpZih0aGlzLm93bmVyRG9jdW1lbnQhPT1wYylyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChhKTtpZihhLl9fc2hhZHlfcGFyZW50Tm9kZSE9PXRoaXMpdGhyb3cgRXJyb3IoIlRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlOiAiK2EpO3ZhciBjPXhjKGEpLGQ9YyYmQmMoYyxhKSxlPXYodGhpcyk7CmlmKHkodGhpcykmJihpYyhhLHRoaXMpLExhKHRoaXMpKSl7QWMoZS5yb290KTt2YXIgZj0hMH1pZihHKCkmJiFiJiZjKXt2YXIgZz1uYyhhKTtvYyhhLGZ1bmN0aW9uKGEpe2xjKGEsZyl9KX11YyhhKTtjJiYoKGI9dGhpcyYmInNsb3QiPT09dGhpcy5sb2NhbE5hbWUpJiYoZj0hMCksKGR8fGIpJiZBYyhjKSk7Znx8KGY9eih0aGlzKT90aGlzLmhvc3Q6dGhpcywoIWUucm9vdCYmInNsb3QiIT09YS5sb2NhbE5hbWV8fGY9PT1hLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUpJiZmLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGEpKTt3Yyh0aGlzLG51bGwsYSk7cmV0dXJuIGF9LHJlcGxhY2VDaGlsZDpmdW5jdGlvbihhLGIpe3RoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSxiKTt0aGlzLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGF9LGNsb25lTm9kZTpmdW5jdGlvbihhKXtpZigidGVtcGxhdGUiPT10aGlzLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9jbG9uZU5vZGUoYSk7CnZhciBiPXRoaXMuX19zaGFkeV9uYXRpdmVfY2xvbmVOb2RlKCExKTtpZihhJiZiLm5vZGVUeXBlIT09Tm9kZS5BVFRSSUJVVEVfTk9ERSl7YT10aGlzLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkO2M8YS5sZW5ndGg7YysrKWQ9YVtjXS5fX3NoYWR5X2Nsb25lTm9kZSghMCksYi5fX3NoYWR5X2FwcGVuZENoaWxkKGQpfXJldHVybiBifSxnZXRSb290Tm9kZTpmdW5jdGlvbihhKXtpZih0aGlzJiZ0aGlzLm5vZGVUeXBlKXt2YXIgYj11KHRoaXMpLGM9Yi5LO3ZvaWQgMD09PWMmJih6KHRoaXMpPyhjPXRoaXMsYi5LPWMpOihjPShjPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlKT9jLl9fc2hhZHlfZ2V0Um9vdE5vZGUoYSk6dGhpcyxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuX19zaGFkeV9uYXRpdmVfY29udGFpbnModGhpcykmJihiLks9YykpKTtyZXR1cm4gY319LGNvbnRhaW5zOmZ1bmN0aW9uKGEpe3JldHVybiBVYSh0aGlzLGEpfX0pO2Z1bmN0aW9uIERjKGEsYixjKXt2YXIgZD1bXTtFYyhhLl9fc2hhZHlfY2hpbGROb2RlcyxiLGMsZCk7cmV0dXJuIGR9ZnVuY3Rpb24gRWMoYSxiLGMsZCl7Zm9yKHZhciBlPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWFbZV0pO2UrKyl7dmFyIGg7aWYoaD1nLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe2g9Zzt2YXIgaz1iLGw9YyxtPWQscT1rKGgpO3EmJm0ucHVzaChoKTtsJiZsKHEpP2g9cTooRWMoaC5fX3NoYWR5X2NoaWxkTm9kZXMsayxsLG0pLGg9dm9pZCAwKX1pZihoKWJyZWFrfX0KdmFyIEZjPUIoe2dldCBmaXJzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5maXJzdENoaWxkKXtmb3IoYT10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X25leHRTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2ZpcnN0RWxlbWVudENoaWxkfSxnZXQgbGFzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5sYXN0Q2hpbGQpe2ZvcihhPXRoaXMuX19zaGFkeV9sYXN0Q2hpbGQ7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9wcmV2aW91c1NpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdEVsZW1lbnRDaGlsZH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHkodGhpcyk/VmEoQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHRoaXMuX19zaGFkeV9jaGlsZE5vZGVzLApmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfSkpOnRoaXMuX19zaGFkeV9uYXRpdmVfY2hpbGRyZW59LGdldCBjaGlsZEVsZW1lbnRDb3VudCgpe3ZhciBhPXRoaXMuX19zaGFkeV9jaGlsZHJlbjtyZXR1cm4gYT9hLmxlbmd0aDowfX0pLEdjPUIoe3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIERjKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIE9hLmNhbGwoYixhKX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oYSxiKXtpZihiKXtiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvckFsbChhKSk7dmFyIGM9dGhpcy5fX3NoYWR5X2dldFJvb3ROb2RlKCk7cmV0dXJuIGIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKT09Y30pfXJldHVybiBEYyh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBPYS5jYWxsKGIsCmEpfSl9fSksSGM9dy5vYT9PYmplY3QuYXNzaWduKHt9LEZjKTpGYztPYmplY3QuYXNzaWduKEZjLEdjKTt2YXIgSWM9Qih7Z2V0RWxlbWVudEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIiI9PT1hP251bGw6RGModGhpcyxmdW5jdGlvbihiKXtyZXR1cm4gYi5pZD09YX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9fSk7dmFyIEpjPUIoe2dldCBhY3RpdmVFbGVtZW50KCl7dmFyIGE9dy5tP2RvY3VtZW50Ll9fc2hhZHlfbmF0aXZlX2FjdGl2ZUVsZW1lbnQ6ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighYXx8IWEubm9kZVR5cGUpcmV0dXJuIG51bGw7dmFyIGI9ISF6KHRoaXMpO2lmKCEodGhpcz09PWRvY3VtZW50fHxiJiZ0aGlzLmhvc3QhPT1hJiZ0aGlzLmhvc3QuX19zaGFkeV9uYXRpdmVfY29udGFpbnMoYSkpKXJldHVybiBudWxsO2ZvcihiPXhjKGEpO2ImJmIhPT10aGlzOylhPWIuaG9zdCxiPXhjKGEpO3JldHVybiB0aGlzPT09ZG9jdW1lbnQ/Yj9udWxsOmE6Yj09PXRoaXM/YTpudWxsfX0pO3ZhciBLYz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0IiksTGM9Qih7Z2V0IGlubmVySFRNTCgpe3JldHVybiB5KHRoaXMpP2tiKCJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZT90aGlzLmNvbnRlbnQ6dGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3NoYWR5X2NoaWxkTm9kZXN9KTp0aGlzLl9fc2hhZHlfbmF0aXZlX2lubmVySFRNTH0sc2V0IGlubmVySFRNTChhKXtpZigidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUpdGhpcy5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUw9YTtlbHNle3RjKHRoaXMpO3ZhciBiPXRoaXMubG9jYWxOYW1lfHwiZGl2IjtiPXRoaXMubmFtZXNwYWNlVVJJJiZ0aGlzLm5hbWVzcGFjZVVSSSE9PUtjLm5hbWVzcGFjZVVSST9LYy5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksYik6S2MuY3JlYXRlRWxlbWVudChiKTtmb3Iody5tP2IuX19zaGFkeV9uYXRpdmVfaW5uZXJIVE1MPWE6Yi5pbm5lckhUTUw9CmE7YT1iLl9fc2hhZHlfZmlyc3RDaGlsZDspdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX19fSk7dmFyIE1jPUIoe2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpeyJvYmplY3QiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO2MuJD10aGlzO3RoaXMuaG9zdC5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYixjKXsib2JqZWN0IiE9PXR5cGVvZiBjJiYoYz17Y2FwdHVyZTohIWN9KTtjLiQ9dGhpczt0aGlzLmhvc3QuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX19KTtmdW5jdGlvbiBOYyhhLGIpe0EoYSxNYyxiKTtBKGEsSmMsYik7QShhLExjLGIpO0EoYSxGYyxiKTt3LkomJiFiPyhBKGEsQ2MsYiksQShhLEljLGIpKTp3Lm18fChBKGEsQWIpLEEoYSx6YikpfTt2YXIgT2M9e30sUGM9dy5kZWZlckNvbm5lY3Rpb25DYWxsYmFja3MmJiJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUsUWM7ZnVuY3Rpb24gUmMoYSl7dmFyIGI9W107ZG8gYi51bnNoaWZ0KGEpO3doaWxlKGE9YS5fX3NoYWR5X3BhcmVudE5vZGUpO3JldHVybiBifQpmdW5jdGlvbiBTYyhhLGIsYyl7aWYoYSE9PU9jKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt0aGlzLnphPSJTaGFkeVJvb3QiO3RoaXMuaG9zdD1iO3RoaXMubW9kZT1jJiZjLm1vZGU7amMoYik7YT11KGIpO2Eucm9vdD10aGlzO2EucGE9ImNsb3NlZCIhPT10aGlzLm1vZGU/dGhpczpudWxsO2E9dSh0aGlzKTthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YS5wYXJlbnROb2RlPWEubmV4dFNpYmxpbmc9YS5wcmV2aW91c1NpYmxpbmc9bnVsbDthLmNoaWxkTm9kZXM9W107dGhpcy5iYT10aGlzLkI9ITE7dGhpcy5jPXRoaXMuYj10aGlzLmE9bnVsbDtpZih3LnByZWZlclBlcmZvcm1hbmNlKWZvcig7YT1iLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYSk7ZWxzZSBBYyh0aGlzKX1mdW5jdGlvbiBBYyhhKXthLkJ8fChhLkI9ITAsWWEoZnVuY3Rpb24oKXtyZXR1cm4gVGMoYSl9KSl9CmZ1bmN0aW9uIFRjKGEpe3ZhciBiO2lmKGI9YS5CKXtmb3IodmFyIGM7YTspYTp7YS5CJiYoYz1hKSxiPWE7YT1iLmhvc3QuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkmJihiPXYoYi5ob3N0KSkmJjA8Yi5OKWJyZWFrIGE7YT12b2lkIDB9Yj1jfShjPWIpJiZjLl9yZW5kZXJTZWxmKCl9ClNjLnByb3RvdHlwZS5fcmVuZGVyU2VsZj1mdW5jdGlvbigpe3ZhciBhPVBjO1BjPSEwO3RoaXMuQj0hMTtpZih0aGlzLmEpe1VjKHRoaXMpO2Zvcih2YXIgYj0wLGM7Yjx0aGlzLmEubGVuZ3RoO2IrKyl7Yz10aGlzLmFbYl07dmFyIGQ9dihjKSxlPWQuYXNzaWduZWROb2RlcztkLmFzc2lnbmVkTm9kZXM9W107ZC5EPVtdO2lmKGQuY2E9ZSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj12KGVbZF0pO2YuUD1mLmFzc2lnbmVkU2xvdDtmLmFzc2lnbmVkU2xvdD09PWMmJihmLmFzc2lnbmVkU2xvdD1udWxsKX19Zm9yKGI9dGhpcy5ob3N0Ll9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKVZjKHRoaXMsYik7Zm9yKGI9MDtiPHRoaXMuYS5sZW5ndGg7YisrKXtjPXRoaXMuYVtiXTtlPXYoYyk7aWYoIWUuYXNzaWduZWROb2Rlcy5sZW5ndGgpZm9yKGQ9Yy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7ZDtkPWQuX19zaGFkeV9uZXh0U2libGluZylWYyh0aGlzLApkLGMpOyhkPShkPXYoYy5fX3NoYWR5X3BhcmVudE5vZGUpKSYmZC5yb290KSYmKE1hKGQpfHxkLkIpJiZkLl9yZW5kZXJTZWxmKCk7V2ModGhpcyxlLkQsZS5hc3NpZ25lZE5vZGVzKTtpZihkPWUuY2Epe2ZvcihmPTA7ZjxkLmxlbmd0aDtmKyspdihkW2ZdKS5QPW51bGw7ZS5jYT1udWxsO2QubGVuZ3RoPmUuYXNzaWduZWROb2Rlcy5sZW5ndGgmJihlLlQ9ITApfWUuVCYmKGUuVD0hMSxYYyh0aGlzLGMpKX1jPXRoaXMuYTtiPVtdO2ZvcihlPTA7ZTxjLmxlbmd0aDtlKyspZD1jW2VdLl9fc2hhZHlfcGFyZW50Tm9kZSwoZj12KGQpKSYmZi5yb290fHwhKDA+Yi5pbmRleE9mKGQpKXx8Yi5wdXNoKGQpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2Y9YltjXTtlPWY9PT10aGlzP3RoaXMuaG9zdDpmO2Q9W107Zj1mLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIGg9ZltnXTtpZigic2xvdCI9PWgubG9jYWxOYW1lKXtoPXYoaCkuRDtmb3IodmFyIGs9CjA7azxoLmxlbmd0aDtrKyspZC5wdXNoKGhba10pfWVsc2UgZC5wdXNoKGgpfWY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5fX3NoYWR5X25hdGl2ZV9jaGlsZE5vZGVzKTtnPWVjKGQsZC5sZW5ndGgsZixmLmxlbmd0aCk7az1oPTA7Zm9yKHZhciBsPXZvaWQgMDtoPGcubGVuZ3RoJiYobD1nW2hdKTtoKyspe2Zvcih2YXIgbT0wLHE9dm9pZCAwO208bC5MLmxlbmd0aCYmKHE9bC5MW21dKTttKyspcS5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlPT09ZSYmZS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChxKSxmLnNwbGljZShsLmluZGV4K2ssMSk7ay09bC5SfWs9MDtmb3IobD12b2lkIDA7azxnLmxlbmd0aCYmKGw9Z1trXSk7aysrKWZvcihoPWZbbC5pbmRleF0sbT1sLmluZGV4O208bC5pbmRleCtsLlI7bSsrKXE9ZFttXSxlLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShxLGgpLGYuc3BsaWNlKG0sMCxxKX19aWYoIXcucHJlZmVyUGVyZm9ybWFuY2UmJiF0aGlzLmJhKWZvcihiPQp0aGlzLmhvc3QuX19zaGFkeV9jaGlsZE5vZGVzLGM9MCxlPWIubGVuZ3RoO2M8ZTtjKyspZD1iW2NdLGY9dihkKSxkLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUhPT10aGlzLmhvc3R8fCJzbG90IiE9PWQubG9jYWxOYW1lJiZmLmFzc2lnbmVkU2xvdHx8dGhpcy5ob3N0Ll9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGQpO3RoaXMuYmE9ITA7UGM9YTtRYyYmUWMoKX07ZnVuY3Rpb24gVmMoYSxiLGMpe3ZhciBkPXUoYiksZT1kLlA7ZC5QPW51bGw7Y3x8KGM9KGE9YS5iW2IuX19zaGFkeV9zbG90fHwiX19jYXRjaGFsbCJdKSYmYVswXSk7Yz8odShjKS5hc3NpZ25lZE5vZGVzLnB1c2goYiksZC5hc3NpZ25lZFNsb3Q9Yyk6ZC5hc3NpZ25lZFNsb3Q9dm9pZCAwO2UhPT1kLmFzc2lnbmVkU2xvdCYmZC5hc3NpZ25lZFNsb3QmJih1KGQuYXNzaWduZWRTbG90KS5UPSEwKX0KZnVuY3Rpb24gV2MoYSxiLGMpe2Zvcih2YXIgZD0wLGU9dm9pZCAwO2Q8Yy5sZW5ndGgmJihlPWNbZF0pO2QrKylpZigic2xvdCI9PWUubG9jYWxOYW1lKXt2YXIgZj12KGUpLmFzc2lnbmVkTm9kZXM7ZiYmZi5sZW5ndGgmJldjKGEsYixmKX1lbHNlIGIucHVzaChjW2RdKX1mdW5jdGlvbiBYYyhhLGIpe2IuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInNsb3RjaGFuZ2UiKSk7Yj12KGIpO2IuYXNzaWduZWRTbG90JiZYYyhhLGIuYXNzaWduZWRTbG90KX0KZnVuY3Rpb24gVWMoYSl7aWYoYS5jJiZhLmMubGVuZ3RoKXtmb3IodmFyIGI9YS5jLGMsZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgZT1iW2RdO2pjKGUpO3ZhciBmPWUuX19zaGFkeV9wYXJlbnROb2RlO2pjKGYpO2Y9dihmKTtmLk49KGYuTnx8MCkrMTtmPVljKGUpO2EuYltmXT8oYz1jfHx7fSxjW2ZdPSEwLGEuYltmXS5wdXNoKGUpKTphLmJbZl09W2VdO2EuYS5wdXNoKGUpfWlmKGMpZm9yKHZhciBnIGluIGMpYS5iW2ddPVpjKGEuYltnXSk7YS5jPVtdfX1mdW5jdGlvbiBZYyhhKXt2YXIgYj1hLm5hbWV8fGEuZ2V0QXR0cmlidXRlKCJuYW1lIil8fCJfX2NhdGNoYWxsIjtyZXR1cm4gYS53YT1ifQpmdW5jdGlvbiBaYyhhKXtyZXR1cm4gYS5zb3J0KGZ1bmN0aW9uKGEsYyl7YT1SYyhhKTtmb3IodmFyIGI9UmMoYyksZT0wO2U8YS5sZW5ndGg7ZSsrKXtjPWFbZV07dmFyIGY9YltlXTtpZihjIT09ZilyZXR1cm4gYT1BcnJheS5mcm9tKGMuX19zaGFkeV9wYXJlbnROb2RlLl9fc2hhZHlfY2hpbGROb2RlcyksYS5pbmRleE9mKGMpLWEuaW5kZXhPZihmKX19KX0KZnVuY3Rpb24gQmMoYSxiKXtpZihhLmEpe1VjKGEpO3ZhciBjPWEuYixkO2ZvcihkIGluIGMpZm9yKHZhciBlPWNbZF0sZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdO2lmKFVhKGIsZykpe2Uuc3BsaWNlKGYsMSk7dmFyIGg9YS5hLmluZGV4T2YoZyk7MDw9aCYmKGEuYS5zcGxpY2UoaCwxKSwoaD12KGcuX19zaGFkeV9wYXJlbnROb2RlKSkmJmguTiYmaC5OLS0pO2YtLTtnPXYoZyk7aWYoaD1nLkQpZm9yKHZhciBrPTA7azxoLmxlbmd0aDtrKyspe3ZhciBsPWhba10sbT1sLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGU7bSYmbS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChsKX1nLkQ9W107Zy5hc3NpZ25lZE5vZGVzPVtdO2g9ITB9fXJldHVybiBofX1mdW5jdGlvbiBNYShhKXtVYyhhKTtyZXR1cm4hKCFhLmF8fCFhLmEubGVuZ3RoKX0KKGZ1bmN0aW9uKGEpe2EuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO05jKGEsIl9fc2hhZHlfIik7TmMoYSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSx7bm9kZVR5cGU6e3ZhbHVlOk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSxjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOnt2YWx1ZToiI2RvY3VtZW50LWZyYWdtZW50Iixjb25maWd1cmFibGU6ITB9LG5vZGVWYWx1ZTp7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9fSk7WyJsb2NhbE5hbWUiLCJuYW1lc3BhY2VVUkkiLCJwcmVmaXgiXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOnZvaWQgMCxjb25maWd1cmFibGU6ITB9KX0pO1sib3duZXJEb2N1bWVudCIsImJhc2VVUkkiLCJpc0Nvbm5lY3RlZCJdLmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFtiXX0sCmNvbmZpZ3VyYWJsZTohMH0pfSl9KShTYy5wcm90b3R5cGUpOwppZih3aW5kb3cuY3VzdG9tRWxlbWVudHMmJncuZWEmJiF3LnByZWZlclBlcmZvcm1hbmNlKXt2YXIgJGM9bmV3IE1hcDtRYz1mdW5jdGlvbigpe3ZhciBhPVtdOyRjLmZvckVhY2goZnVuY3Rpb24oYixjKXthLnB1c2goW2MsYl0pfSk7JGMuY2xlYXIoKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXVswXTthW2JdWzFdP2MudWEoKTpjLnZhKCl9fTtQYyYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24oKXtQYz0hMTtRYygpfSx7b25jZTohMH0pO3ZhciBhZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9MCxlPSJfX2lzQ29ubmVjdGVkIitkKys7aWYoYnx8YylhLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1hLnByb3RvdHlwZS51YT1mdW5jdGlvbigpe1BjPyRjLnNldCh0aGlzLCEwKTp0aGlzW2VdfHwodGhpc1tlXT0hMCxiJiZiLmNhbGwodGhpcykpfSxhLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaz0KYS5wcm90b3R5cGUudmE9ZnVuY3Rpb24oKXtQYz90aGlzLmlzQ29ubmVjdGVkfHwkYy5zZXQodGhpcywhMSk6dGhpc1tlXSYmKHRoaXNbZV09ITEsYyYmYy5jYWxsKHRoaXMpKX07cmV0dXJuIGF9LGJkPXdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnkucHJvdG90eXBlLCJkZWZpbmUiLHt2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWIucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrLGQ9Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s7YmQuY2FsbCh3aW5kb3cuY3VzdG9tRWxlbWVudHMsYSxhZChiLGMsZCkpO2IucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWM7Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZH19KX1mdW5jdGlvbiB4YyhhKXthPWEuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkpcmV0dXJuIGF9O2Z1bmN0aW9uIGNkKGEpe3RoaXMubm9kZT1hfW49Y2QucHJvdG90eXBlO24uYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfTtuLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX07bi5hcHBlbmRDaGlsZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXBwZW5kQ2hpbGQoYSl9O24uaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2luc2VydEJlZm9yZShhLGIpfTtuLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVDaGlsZChhKX07bi5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVwbGFjZUNoaWxkKGEsYil9OwpuLmNsb25lTm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2xvbmVOb2RlKGEpfTtuLmdldFJvb3ROb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRSb290Tm9kZShhKX07bi5jb250YWlucz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY29udGFpbnMoYSl9O24uZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZGlzcGF0Y2hFdmVudChhKX07bi5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiKXt0aGlzLm5vZGUuX19zaGFkeV9zZXRBdHRyaWJ1dGUoYSxiKX07bi5nZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25hdGl2ZV9nZXRBdHRyaWJ1dGUoYSl9O24uaGFzQXR0cmlidXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uYXRpdmVfaGFzQXR0cmlidXRlKGEpfTtuLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVBdHRyaWJ1dGUoYSl9OwpuLmF0dGFjaFNoYWRvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXR0YWNoU2hhZG93KGEpfTtuLmZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2ZvY3VzKCl9O24uYmx1cj1mdW5jdGlvbigpe3RoaXMubm9kZS5fX3NoYWR5X2JsdXIoKX07bi5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbXBvcnROb2RlKGEsYil9O24uZ2V0RWxlbWVudEJ5SWQ9ZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRFbGVtZW50QnlJZChhKX07bi5xdWVyeVNlbGVjdG9yPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9xdWVyeVNlbGVjdG9yKGEpfTsKbi5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3F1ZXJ5U2VsZWN0b3JBbGwoYSxiKX07bi5hc3NpZ25lZE5vZGVzPWZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubm9kZS5sb2NhbE5hbWUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Fzc2lnbmVkTm9kZXMoYSl9OwpwLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNkLnByb3RvdHlwZSx7YWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoeih0aGlzLm5vZGUpfHx0aGlzLm5vZGUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX05PREUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FjdGl2ZUVsZW1lbnR9fSxfYWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlRWxlbWVudH19LGhvc3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHoodGhpcy5ub2RlKSlyZXR1cm4gdGhpcy5ub2RlLmhvc3R9fSxwYXJlbnROb2RlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50Tm9kZX19LGZpcnN0Q2hpbGQ6e2NvbmZpZ3VyYWJsZTohMCwKZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RDaGlsZH19LGxhc3RDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2xhc3RDaGlsZH19LG5leHRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmV4dFNpYmxpbmd9fSxwcmV2aW91c1NpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9fSxjaGlsZE5vZGVzOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGROb2Rlc319LHBhcmVudEVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLApnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50RWxlbWVudH19LGZpcnN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RFbGVtZW50Q2hpbGR9fSxsYXN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbGFzdEVsZW1lbnRDaGlsZH19LG5leHRFbGVtZW50U2libGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ319LHByZXZpb3VzRWxlbWVudFNpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfX0sCmNoaWxkcmVuOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGRyZW59fSxjaGlsZEVsZW1lbnRDb3VudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NoaWxkRWxlbWVudENvdW50fX0sc2hhZG93Um9vdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3NoYWRvd1Jvb3R9fSxhc3NpZ25lZFNsb3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hc3NpZ25lZFNsb3R9fSxpc0Nvbm5lY3RlZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lzQ29ubmVjdGVkfX0saW5uZXJIVE1MOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTD1hfX0sdGV4dENvbnRlbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV90ZXh0Q29udGVudH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3RleHRDb250ZW50PWF9fSxzbG90Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfc2xvdH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3Nsb3Q9YX19fSk7CmNjLmZvckVhY2goZnVuY3Rpb24oYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLnByb3RvdHlwZSxhLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlWyJfX3NoYWR5XyIrYV19LHNldDpmdW5jdGlvbihiKXt0aGlzLm5vZGVbIl9fc2hhZHlfIithXT1ifSxjb25maWd1cmFibGU6ITB9KX0pO3ZhciBkZD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlZChhKXtpZih6KGEpfHxhIGluc3RhbmNlb2YgY2QpcmV0dXJuIGE7dmFyIGI9ZGQuZ2V0KGEpO2J8fChiPW5ldyBjZChhKSxkZC5zZXQoYSxiKSk7cmV0dXJuIGJ9O3ZhciBmZD1CKHtkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGEpe1phKCk7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChhKX0sYWRkRXZlbnRMaXN0ZW5lcjpVYixyZW1vdmVFdmVudExpc3RlbmVyOldifSk7dmFyIGdkPUIoe2dldCBhc3NpZ25lZFNsb3QoKXt2YXIgYT10aGlzLl9fc2hhZHlfcGFyZW50Tm9kZTsoYT1hJiZhLl9fc2hhZHlfc2hhZG93Um9vdCkmJlRjKGEpO3JldHVybihhPXYodGhpcykpJiZhLmFzc2lnbmVkU2xvdHx8bnVsbH19KTt2YXIgaGQ9d2luZG93LmRvY3VtZW50O2Z1bmN0aW9uIGlkKGEsYil7aWYoInNsb3QiPT09YilhPWEuX19zaGFkeV9wYXJlbnROb2RlLExhKGEpJiZBYyh2KGEpLnJvb3QpO2Vsc2UgaWYoInNsb3QiPT09YS5sb2NhbE5hbWUmJiJuYW1lIj09PWImJihiPXhjKGEpKSl7aWYoYi5hKXtVYyhiKTt2YXIgYz1hLndhLGQ9WWMoYSk7aWYoZCE9PWMpe2M9Yi5iW2NdO3ZhciBlPWMuaW5kZXhPZihhKTswPD1lJiZjLnNwbGljZShlLDEpO2M9Yi5iW2RdfHwoYi5iW2RdPVtdKTtjLnB1c2goYSk7MTxjLmxlbmd0aCYmKGIuYltkXT1aYyhjKSl9fUFjKGIpfX0KdmFyIGpkPUIoe2dldCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLnByZXZpb3VzU2libGluZyl7Zm9yKGE9dGhpcy5fX3NoYWR5X3ByZXZpb3VzU2libGluZzthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X3ByZXZpb3VzU2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfSxnZXQgbmV4dEVsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLm5leHRTaWJsaW5nKXtmb3IoYT10aGlzLl9fc2hhZHlfbmV4dFNpYmxpbmc7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9uZXh0U2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9uZXh0RWxlbWVudFNpYmxpbmd9LGdldCBzbG90KCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJzbG90Iil9LApzZXQgc2xvdChhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJzbG90IixhKX0sZ2V0IHNoYWRvd1Jvb3QoKXt2YXIgYT12KHRoaXMpO3JldHVybiBhJiZhLnBhfHxudWxsfSxnZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sc2V0IGNsYXNzTmFtZShhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJjbGFzcyIsYSl9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMub3duZXJEb2N1bWVudCE9PWhkKXRoaXMuX19zaGFkeV9uYXRpdmVfc2V0QXR0cmlidXRlKGEsYik7ZWxzZXt2YXIgYzsoYz1HKCkpJiYiY2xhc3MiPT09YT8oYy5zZXRFbGVtZW50Q2xhc3ModGhpcyxiKSxjPSEwKTpjPSExO2N8fCh0aGlzLl9fc2hhZHlfbmF0aXZlX3NldEF0dHJpYnV0ZShhLGIpLGlkKHRoaXMsYSkpfX0scmVtb3ZlQXR0cmlidXRlOmZ1bmN0aW9uKGEpe3RoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQXR0cmlidXRlKGEpO2lkKHRoaXMsCmEpfSxhdHRhY2hTaGFkb3c6ZnVuY3Rpb24oYSl7aWYoIXRoaXMpdGhyb3cgRXJyb3IoIk11c3QgcHJvdmlkZSBhIGhvc3QuIik7aWYoIWEpdGhyb3cgRXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzLiIpO3JldHVybiBuZXcgU2MoT2MsdGhpcyxhKX19KTt2YXIga2Q9Qih7Ymx1cjpmdW5jdGlvbigpe3ZhciBhPXYodGhpcyk7KGE9KGE9YSYmYS5yb290KSYmYS5hY3RpdmVFbGVtZW50KT9hLl9fc2hhZHlfYmx1cigpOnRoaXMuX19zaGFkeV9uYXRpdmVfYmx1cigpfX0pO2NjLmZvckVhY2goZnVuY3Rpb24oYSl7a2RbYV09e3NldDpmdW5jdGlvbihiKXt2YXIgYz11KHRoaXMpLGQ9YS5zdWJzdHJpbmcoMik7Yy5PW2FdJiZ0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCxjLk9bYV0pO3RoaXMuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGQsYik7Yy5PW2FdPWJ9LGdldDpmdW5jdGlvbigpe3ZhciBiPXYodGhpcyk7cmV0dXJuIGImJmIuT1thXX0sY29uZmlndXJhYmxlOiEwfX0pO3ZhciBsZD1CKHthc3NpZ25lZE5vZGVzOmZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lKXt2YXIgYj10aGlzLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtiJiZ6KGIpJiZUYyhiKTtyZXR1cm4oYj12KHRoaXMpKT8oYSYmYS5mbGF0dGVuP2IuRDpiLmFzc2lnbmVkTm9kZXMpfHxbXTpbXX19fSk7dmFyIG1kPXdpbmRvdy5kb2N1bWVudCxuZD1CKHtpbXBvcnROb2RlOmZ1bmN0aW9uKGEsYil7aWYoYS5vd25lckRvY3VtZW50IT09bWR8fCJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsYik7dmFyIGM9dGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsITEpO2lmKGIpe2E9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Yj0wO2Zvcih2YXIgZDtiPGEubGVuZ3RoO2IrKylkPXRoaXMuX19zaGFkeV9pbXBvcnROb2RlKGFbYl0sITApLGMuX19zaGFkeV9hcHBlbmRDaGlsZChkKX1yZXR1cm4gY319KTt2YXIgb2Q9Qih7YWRkRXZlbnRMaXN0ZW5lcjpVYi5iaW5kKHdpbmRvdykscmVtb3ZlRXZlbnRMaXN0ZW5lcjpXYi5iaW5kKHdpbmRvdyl9KTt2YXIgcGQ9e307T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsInBhcmVudEVsZW1lbnQiKSYmKHBkLnBhcmVudEVsZW1lbnQ9Q2MucGFyZW50RWxlbWVudCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNvbnRhaW5zIikmJihwZC5jb250YWlucz1DYy5jb250YWlucyk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNoaWxkcmVuIikmJihwZC5jaGlsZHJlbj1GYy5jaGlsZHJlbik7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpJiYocGQuaW5uZXJIVE1MPUxjLmlubmVySFRNTCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNsYXNzTmFtZSIpJiYocGQuY2xhc3NOYW1lPWpkLmNsYXNzTmFtZSk7CnZhciBxZD17RXZlbnRUYXJnZXQ6W2ZkXSxOb2RlOltDYyx3aW5kb3cuRXZlbnRUYXJnZXQ/bnVsbDpmZF0sVGV4dDpbZ2RdLEVsZW1lbnQ6W2pkLEZjLGdkLCF3Lm18fCJpbm5lckhUTUwiaW4gRWxlbWVudC5wcm90b3R5cGU/TGM6bnVsbCx3aW5kb3cuSFRNTFNsb3RFbGVtZW50P251bGw6bGRdLEhUTUxFbGVtZW50OltrZCxwZF0sSFRNTFNsb3RFbGVtZW50OltsZF0sRG9jdW1lbnRGcmFnbWVudDpbSGMsSWNdLERvY3VtZW50OltuZCxIYyxJYyxKY10sV2luZG93OltvZF19LHJkPXcubT9udWxsOlsiaW5uZXJIVE1MIiwidGV4dENvbnRlbnQiXTtmdW5jdGlvbiBzZChhKXt2YXIgYj1hP251bGw6cmQsYz17fSxkO2ZvcihkIGluIHFkKWMuVz13aW5kb3dbZF0mJndpbmRvd1tkXS5wcm90b3R5cGUscWRbZF0uZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGMuVyYmZCYmQShjLlcsZCxhLGIpfX0oYykpLGM9e1c6Yy5XfX07aWYody5lYSl7dmFyIFNoYWR5RE9NPXtpblVzZTp3LmVhLHBhdGNoOmZ1bmN0aW9uKGEpe0ZiKGEpO0ViKGEpO3JldHVybiBhfSxpc1NoYWR5Um9vdDp6LGVucXVldWU6WWEsZmx1c2g6WmEsZmx1c2hJbml0aWFsOmZ1bmN0aW9uKGEpeyFhLmJhJiZhLkImJlRjKGEpfSxzZXR0aW5nczp3LGZpbHRlck11dGF0aW9uczpkYixvYnNlcnZlQ2hpbGRyZW46YmIsdW5vYnNlcnZlQ2hpbGRyZW46Y2IsZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzOncuZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzLHByZWZlclBlcmZvcm1hbmNlOncucHJlZmVyUGVyZm9ybWFuY2UsaGFuZGxlc0R5bmFtaWNTY29waW5nOiEwLHdyYXA6dy5KP2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxXcmFwcGVyOmNkLGNvbXBvc2VkUGF0aDpNYixub1BhdGNoOncuSixuYXRpdmVNZXRob2RzOnFiLG5hdGl2ZVRyZWU6cmJ9O3dpbmRvdy5TaGFkeURPTT1TaGFkeURPTTt5YigpO3NkKCJfX3NoYWR5XyIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwKIl9hY3RpdmVFbGVtZW50IixKYy5hY3RpdmVFbGVtZW50KTtBKFdpbmRvdy5wcm90b3R5cGUsb2QsIl9fc2hhZHlfIik7dy5KfHwoc2QoKSxiYygpKTtYYigpO3dpbmRvdy5FdmVudD1aYjt3aW5kb3cuQ3VzdG9tRXZlbnQ9JGI7d2luZG93Lk1vdXNlRXZlbnQ9YWM7d2luZG93LlNoYWRvd1Jvb3Q9U2N9O3ZhciB0ZD1uZXcgU2V0KCJhbm5vdGF0aW9uLXhtbCBjb2xvci1wcm9maWxlIGZvbnQtZmFjZSBmb250LWZhY2Utc3JjIGZvbnQtZmFjZS11cmkgZm9udC1mYWNlLWZvcm1hdCBmb250LWZhY2UtbmFtZSBtaXNzaW5nLWdseXBoIi5zcGxpdCgiICIpKTtmdW5jdGlvbiB1ZChhKXt2YXIgYj10ZC5oYXMoYSk7YT0vXlthLXpdWy4wLTlfYS16XSotW1wtLjAtOV9hLXpdKiQvLnRlc3QoYSk7cmV0dXJuIWImJmF9ZnVuY3Rpb24gSChhKXt2YXIgYj1hLmlzQ29ubmVjdGVkO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7Zm9yKDthJiYhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEucGFyZW50Tm9kZXx8KHdpbmRvdy5TaGFkb3dSb290JiZhIGluc3RhbmNlb2YgU2hhZG93Um9vdD9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hKCFhfHwhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpKX0KZnVuY3Rpb24gdmQoYSxiKXtmb3IoO2ImJmIhPT1hJiYhYi5uZXh0U2libGluZzspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGImJmIhPT1hP2IubmV4dFNpYmxpbmc6bnVsbH0KZnVuY3Rpb24gd2QoYSxiLGMpe2M9dm9pZCAwPT09Yz9uZXcgU2V0OmM7Zm9yKHZhciBkPWE7ZDspe2lmKGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGU9ZDtiKGUpO3ZhciBmPWUubG9jYWxOYW1lO2lmKCJsaW5rIj09PWYmJiJpbXBvcnQiPT09ZS5nZXRBdHRyaWJ1dGUoInJlbCIpKXtkPWUuaW1wb3J0O2lmKGQgaW5zdGFuY2VvZiBOb2RlJiYhYy5oYXMoZCkpZm9yKGMuYWRkKGQpLGQ9ZC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKXdkKGQsYixjKTtkPXZkKGEsZSk7Y29udGludWV9ZWxzZSBpZigidGVtcGxhdGUiPT09Zil7ZD12ZChhLGUpO2NvbnRpbnVlfWlmKGU9ZS5fX0NFX3NoYWRvd1Jvb3QpZm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKXdkKGUsYixjKX1kPWQuZmlyc3RDaGlsZD9kLmZpcnN0Q2hpbGQ6dmQoYSxkKX19ZnVuY3Rpb24gSShhLGIsYyl7YVtiXT1jfTtmdW5jdGlvbiB4ZCgpe3RoaXMuYT1uZXcgTWFwO3RoaXMuZz1uZXcgTWFwO3RoaXMuZj1bXTt0aGlzLmM9ITF9ZnVuY3Rpb24geWQoYSxiLGMpe2EuYS5zZXQoYixjKTthLmcuc2V0KGMuY29uc3RydWN0b3JGdW5jdGlvbixjKX1mdW5jdGlvbiB6ZChhLGIpe2EuYz0hMDthLmYucHVzaChiKX1mdW5jdGlvbiBBZChhLGIpe2EuYyYmd2QoYixmdW5jdGlvbihiKXtyZXR1cm4gYS5iKGIpfSl9eGQucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7aWYodGhpcy5jJiYhYS5fX0NFX3BhdGNoZWQpe2EuX19DRV9wYXRjaGVkPSEwO2Zvcih2YXIgYj0wO2I8dGhpcy5mLmxlbmd0aDtiKyspdGhpcy5mW2JdKGEpfX07ZnVuY3Rpb24gSihhLGIpe3ZhciBjPVtdO3dkKGIsZnVuY3Rpb24oYSl7cmV0dXJuIGMucHVzaChhKX0pO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07MT09PWQuX19DRV9zdGF0ZT9hLmNvbm5lY3RlZENhbGxiYWNrKGQpOkJkKGEsZCl9fQpmdW5jdGlvbiBLKGEsYil7dmFyIGM9W107d2QoYixmdW5jdGlvbihhKXtyZXR1cm4gYy5wdXNoKGEpfSk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTsxPT09ZC5fX0NFX3N0YXRlJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrKGQpfX0KZnVuY3Rpb24gTChhLGIsYyl7Yz12b2lkIDA9PT1jP3t9OmM7dmFyIGQ9Yy5YYXx8bmV3IFNldCxlPWMuWXx8ZnVuY3Rpb24oYil7cmV0dXJuIEJkKGEsYil9LGY9W107d2QoYixmdW5jdGlvbihiKXtpZigibGluayI9PT1iLmxvY2FsTmFtZSYmImltcG9ydCI9PT1iLmdldEF0dHJpYnV0ZSgicmVsIikpe3ZhciBjPWIuaW1wb3J0O2MgaW5zdGFuY2VvZiBOb2RlJiYoYy5fX0NFX2lzSW1wb3J0RG9jdW1lbnQ9ITAsYy5fX0NFX2hhc1JlZ2lzdHJ5PSEwKTtjJiYiY29tcGxldGUiPT09Yy5yZWFkeVN0YXRlP2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwOmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXt2YXIgYz1iLmltcG9ydDtpZighYy5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQpe2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwO3ZhciBmPW5ldyBTZXQoZCk7Zi5kZWxldGUoYyk7TChhLGMse1hhOmYsWTplfSl9fSl9ZWxzZSBmLnB1c2goYil9LGQpO2lmKGEuYylmb3IoYj0KMDtiPGYubGVuZ3RoO2IrKylhLmIoZltiXSk7Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyllKGZbYl0pfQpmdW5jdGlvbiBCZChhLGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGM9Yi5vd25lckRvY3VtZW50O2lmKGMuZGVmYXVsdFZpZXd8fGMuX19DRV9pc0ltcG9ydERvY3VtZW50JiZjLl9fQ0VfaGFzUmVnaXN0cnkpaWYoYz1hLmEuZ2V0KGIubG9jYWxOYW1lKSl7Yy5jb25zdHJ1Y3Rpb25TdGFjay5wdXNoKGIpO3ZhciBkPWMuY29uc3RydWN0b3JGdW5jdGlvbjt0cnl7dHJ5e2lmKG5ldyBkIT09Yil0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yIGRpZCBub3QgcHJvZHVjZSB0aGUgZWxlbWVudCBiZWluZyB1cGdyYWRlZC4iKTt9ZmluYWxseXtjLmNvbnN0cnVjdGlvblN0YWNrLnBvcCgpfX1jYXRjaChnKXt0aHJvdyBiLl9fQ0Vfc3RhdGU9MixnO31iLl9fQ0Vfc3RhdGU9MTtiLl9fQ0VfZGVmaW5pdGlvbj1jO2lmKGMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKWZvcihjPWMub2JzZXJ2ZWRBdHRyaWJ1dGVzLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9CmNbZF0sZj1iLmdldEF0dHJpYnV0ZShlKTtudWxsIT09ZiYmYS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYixlLG51bGwsZixudWxsKX1IKGIpJiZhLmNvbm5lY3RlZENhbGxiYWNrKGIpfX19eGQucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuY29ubmVjdGVkQ2FsbGJhY2smJmIuY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07eGQucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuZGlzY29ubmVjdGVkQ2FsbGJhY2smJmIuZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07CnhkLnByb3RvdHlwZS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLl9fQ0VfZGVmaW5pdGlvbjtmLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmLTE8Zi5vYnNlcnZlZEF0dHJpYnV0ZXMuaW5kZXhPZihiKSYmZi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2suY2FsbChhLGIsYyxkLGUpfTtmdW5jdGlvbiBDZChhKXt2YXIgYj1kb2N1bWVudDt0aGlzLmI9YTt0aGlzLmE9Yjt0aGlzLkY9dm9pZCAwO0wodGhpcy5iLHRoaXMuYSk7ImxvYWRpbmciPT09dGhpcy5hLnJlYWR5U3RhdGUmJih0aGlzLkY9bmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5jLmJpbmQodGhpcykpLHRoaXMuRi5vYnNlcnZlKHRoaXMuYSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSl9ZnVuY3Rpb24gRGQoYSl7YS5GJiZhLkYuZGlzY29ubmVjdCgpfUNkLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYS5yZWFkeVN0YXRlOyJpbnRlcmFjdGl2ZSIhPT1iJiYiY29tcGxldGUiIT09Ynx8RGQodGhpcyk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IodmFyIGM9YVtiXS5hZGRlZE5vZGVzLGQ9MDtkPGMubGVuZ3RoO2QrKylMKHRoaXMuYixjW2RdKX07ZnVuY3Rpb24gRWQoKXt2YXIgYT10aGlzO3RoaXMuYT10aGlzLmg9dm9pZCAwO3RoaXMuYj1uZXcgUHJvbWlzZShmdW5jdGlvbihiKXthLmE9YjthLmgmJmIoYS5oKX0pfUVkLnByb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuaCl0aHJvdyBFcnJvcigiQWxyZWFkeSByZXNvbHZlZC4iKTt0aGlzLmg9YTt0aGlzLmEmJnRoaXMuYShhKX07ZnVuY3Rpb24gTihhKXt0aGlzLmM9ITE7dGhpcy5hPWE7dGhpcy5sPW5ldyBNYXA7dGhpcy5mPWZ1bmN0aW9uKGEpe3JldHVybiBhKCl9O3RoaXMuYj0hMTt0aGlzLmc9W107dGhpcy5kYT1uZXcgQ2QoYSl9bj1OLnByb3RvdHlwZTsKbi5zYT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7aWYoIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoIkN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9ycyBtdXN0IGJlIGZ1bmN0aW9ucy4iKTtpZighdWQoYSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJUaGUgZWxlbWVudCBuYW1lICciK2ErIicgaXMgbm90IHZhbGlkLiIpO2lmKHRoaXMuYS5hLmdldChhKSl0aHJvdyBFcnJvcigiQSBjdXN0b20gZWxlbWVudCB3aXRoIG5hbWUgJyIrYSsiJyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIik7aWYodGhpcy5jKXRocm93IEVycm9yKCJBIGN1c3RvbSBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgZGVmaW5lZC4iKTt0aGlzLmM9ITA7dHJ5e3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWVbYV07aWYodm9pZCAwIT09YiYmIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IEVycm9yKCJUaGUgJyIrYSsiJyBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24uIik7CnJldHVybiBifSxlPWIucHJvdG90eXBlO2lmKCEoZSBpbnN0YW5jZW9mIE9iamVjdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIGlzIG5vdCBhbiBvYmplY3QuIik7dmFyIGY9ZCgiY29ubmVjdGVkQ2FsbGJhY2siKTt2YXIgZz1kKCJkaXNjb25uZWN0ZWRDYWxsYmFjayIpO3ZhciBoPWQoImFkb3B0ZWRDYWxsYmFjayIpO3ZhciBrPWQoImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayIpO3ZhciBsPWIub2JzZXJ2ZWRBdHRyaWJ1dGVzfHxbXX1jYXRjaChtKXtyZXR1cm59ZmluYWxseXt0aGlzLmM9ITF9Yj17bG9jYWxOYW1lOmEsY29uc3RydWN0b3JGdW5jdGlvbjpiLGNvbm5lY3RlZENhbGxiYWNrOmYsZGlzY29ubmVjdGVkQ2FsbGJhY2s6ZyxhZG9wdGVkQ2FsbGJhY2s6aCxhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s6ayxvYnNlcnZlZEF0dHJpYnV0ZXM6bCxjb25zdHJ1Y3Rpb25TdGFjazpbXX07eWQodGhpcy5hLAphLGIpO3RoaXMuZy5wdXNoKGIpO3RoaXMuYnx8KHRoaXMuYj0hMCx0aGlzLmYoZnVuY3Rpb24oKXtyZXR1cm4gRmQoYyl9KSl9O24uWT1mdW5jdGlvbihhKXtMKHRoaXMuYSxhKX07CmZ1bmN0aW9uIEZkKGEpe2lmKCExIT09YS5iKXthLmI9ITE7Zm9yKHZhciBiPWEuZyxjPVtdLGQ9bmV3IE1hcCxlPTA7ZTxiLmxlbmd0aDtlKyspZC5zZXQoYltlXS5sb2NhbE5hbWUsW10pO0woYS5hLGRvY3VtZW50LHtZOmZ1bmN0aW9uKGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGU9Yi5sb2NhbE5hbWUsZj1kLmdldChlKTtmP2YucHVzaChiKTphLmEuYS5nZXQoZSkmJmMucHVzaChiKX19fSk7Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKylCZChhLmEsY1tlXSk7Zm9yKDswPGIubGVuZ3RoOyl7dmFyIGY9Yi5zaGlmdCgpO2U9Zi5sb2NhbE5hbWU7Zj1kLmdldChmLmxvY2FsTmFtZSk7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspQmQoYS5hLGZbZ10pOyhlPWEubC5nZXQoZSkpJiZlLnJlc29sdmUodm9pZCAwKX19fW4uZ2V0PWZ1bmN0aW9uKGEpe2lmKGE9dGhpcy5hLmEuZ2V0KGEpKXJldHVybiBhLmNvbnN0cnVjdG9yRnVuY3Rpb259OwpuLnRhPWZ1bmN0aW9uKGEpe2lmKCF1ZChhKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN5bnRheEVycm9yKCInIithKyInIGlzIG5vdCBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUuIikpO3ZhciBiPXRoaXMubC5nZXQoYSk7aWYoYilyZXR1cm4gYi5iO2I9bmV3IEVkO3RoaXMubC5zZXQoYSxiKTt0aGlzLmEuYS5nZXQoYSkmJiF0aGlzLmcuc29tZShmdW5jdGlvbihiKXtyZXR1cm4gYi5sb2NhbE5hbWU9PT1hfSkmJmIucmVzb2x2ZSh2b2lkIDApO3JldHVybiBiLmJ9O24uUGE9ZnVuY3Rpb24oYSl7RGQodGhpcy5kYSk7dmFyIGI9dGhpcy5mO3RoaXMuZj1mdW5jdGlvbihjKXtyZXR1cm4gYShmdW5jdGlvbigpe3JldHVybiBiKGMpfSl9fTt3aW5kb3cuQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5PU47Ti5wcm90b3R5cGUuZGVmaW5lPU4ucHJvdG90eXBlLnNhO04ucHJvdG90eXBlLnVwZ3JhZGU9Ti5wcm90b3R5cGUuWTtOLnByb3RvdHlwZS5nZXQ9Ti5wcm90b3R5cGUuZ2V0OwpOLnByb3RvdHlwZS53aGVuRGVmaW5lZD1OLnByb3RvdHlwZS50YTtOLnByb3RvdHlwZS5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrPU4ucHJvdG90eXBlLlBhO3ZhciBHZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsSGQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50TlMsSWQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlLEpkPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUucHJlcGVuZCxLZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmFwcGVuZCxMZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucHJlcGVuZCxNZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuYXBwZW5kLE5kPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGUsT2Q9d2luZG93Lk5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkLFBkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsUWQ9d2luZG93Lk5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLFJkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQsU2Q9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsCiJ0ZXh0Q29udGVudCIpLFRkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3csVWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpLFZkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUsV2Q9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSxYZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLFlkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVOUyxaZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMsJGQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TLGFlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQsYmU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTCxjZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucHJlcGVuZCwKZGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFwcGVuZCxlZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYmVmb3JlLGZlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hZnRlcixnZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVwbGFjZVdpdGgsaGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSxpZT13aW5kb3cuSFRNTEVsZW1lbnQsamU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSxrZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxsZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTDt2YXIgbWU9bmV3IGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBuZSgpe3ZhciBhPW9lO3dpbmRvdy5IVE1MRWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yLGQ9YS5nLmdldChiKTtpZighZCl0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGJlaW5nIGNvbnN0cnVjdGVkIHdhcyBub3QgcmVnaXN0ZXJlZCB3aXRoIGBjdXN0b21FbGVtZW50c2AuIik7dmFyIGU9ZC5jb25zdHJ1Y3Rpb25TdGFjaztpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGU9R2QuY2FsbChkb2N1bWVudCxkLmxvY2FsTmFtZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsYi5wcm90b3R5cGUpLGUuX19DRV9zdGF0ZT0xLGUuX19DRV9kZWZpbml0aW9uPWQsYS5iKGUpLGU7ZD1lLmxlbmd0aC0xO3ZhciBmPWVbZF07aWYoZj09PW1lKXRocm93IEVycm9yKCJUaGUgSFRNTEVsZW1lbnQgY29uc3RydWN0b3Igd2FzIGVpdGhlciBjYWxsZWQgcmVlbnRyYW50bHkgZm9yIHRoaXMgY29uc3RydWN0b3Igb3IgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiIpOwplW2RdPW1lO09iamVjdC5zZXRQcm90b3R5cGVPZihmLGIucHJvdG90eXBlKTthLmIoZik7cmV0dXJuIGZ9Yi5wcm90b3R5cGU9aWUucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSwiY29uc3RydWN0b3IiLHt3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpifSk7cmV0dXJuIGJ9KCl9O2Z1bmN0aW9uIHBlKGEsYixjKXtmdW5jdGlvbiBkKGIpe3JldHVybiBmdW5jdGlvbihjKXtmb3IodmFyIGQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDsrK2UpZFtlXT1hcmd1bWVudHNbZV07ZT1bXTtmb3IodmFyIGY9W10sbD0wO2w8ZC5sZW5ndGg7bCsrKXt2YXIgbT1kW2xdO20gaW5zdGFuY2VvZiBFbGVtZW50JiZIKG0pJiZmLnB1c2gobSk7aWYobSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKG09bS5maXJzdENoaWxkO207bT1tLm5leHRTaWJsaW5nKWUucHVzaChtKTtlbHNlIGUucHVzaChtKX1iLmFwcGx5KHRoaXMsZCk7Zm9yKGQ9MDtkPGYubGVuZ3RoO2QrKylLKGEsZltkXSk7aWYoSCh0aGlzKSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKWY9ZVtkXSxmIGluc3RhbmNlb2YgRWxlbWVudCYmSihhLGYpfX12b2lkIDAhPT1jLlYmJihiLnByZXBlbmQ9ZChjLlYpKTt2b2lkIDAhPT1jLmFwcGVuZCYmKGIuYXBwZW5kPWQoYy5hcHBlbmQpKX07ZnVuY3Rpb24gcWUoKXt2YXIgYT1vZTtJKERvY3VtZW50LnByb3RvdHlwZSwiY3JlYXRlRWxlbWVudCIsZnVuY3Rpb24oYil7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5KXt2YXIgYz1hLmEuZ2V0KGIpO2lmKGMpcmV0dXJuIG5ldyBjLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1HZC5jYWxsKHRoaXMsYik7YS5iKGIpO3JldHVybiBifSk7SShEb2N1bWVudC5wcm90b3R5cGUsImltcG9ydE5vZGUiLGZ1bmN0aW9uKGIsYyl7Yj1JZC5jYWxsKHRoaXMsYiwhIWMpO3RoaXMuX19DRV9oYXNSZWdpc3RyeT9MKGEsYik6QWQoYSxiKTtyZXR1cm4gYn0pO0koRG9jdW1lbnQucHJvdG90eXBlLCJjcmVhdGVFbGVtZW50TlMiLGZ1bmN0aW9uKGIsYyl7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5JiYobnVsbD09PWJ8fCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PWIpKXt2YXIgZD1hLmEuZ2V0KGMpO2lmKGQpcmV0dXJuIG5ldyBkLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1IZC5jYWxsKHRoaXMsCmIsYyk7YS5iKGIpO3JldHVybiBifSk7cGUoYSxEb2N1bWVudC5wcm90b3R5cGUse1Y6SmQsYXBwZW5kOktkfSl9O2Z1bmN0aW9uIHJlKCl7ZnVuY3Rpb24gYShhLGQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJ0ZXh0Q29udGVudCIse2VudW1lcmFibGU6ZC5lbnVtZXJhYmxlLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZC5nZXQsc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSlkLnNldC5jYWxsKHRoaXMsYSk7ZWxzZXt2YXIgYz12b2lkIDA7aWYodGhpcy5maXJzdENoaWxkKXt2YXIgZT10aGlzLmNoaWxkTm9kZXMsaD1lLmxlbmd0aDtpZigwPGgmJkgodGhpcykpe2M9QXJyYXkoaCk7Zm9yKHZhciBrPTA7azxoO2srKyljW2tdPWVba119fWQuc2V0LmNhbGwodGhpcyxhKTtpZihjKWZvcihhPTA7YTxjLmxlbmd0aDthKyspSyhiLGNbYV0pfX19KX12YXIgYj1vZTtJKE5vZGUucHJvdG90eXBlLCJpbnNlcnRCZWZvcmUiLGZ1bmN0aW9uKGEsZCl7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhLmNoaWxkTm9kZXMpOwphPVBkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylKKGIsY1tkXSk7cmV0dXJuIGF9Yz1IKGEpO2Q9UGQuY2FsbCh0aGlzLGEsZCk7YyYmSyhiLGEpO0godGhpcykmJkooYixhKTtyZXR1cm4gZH0pO0koTm9kZS5wcm90b3R5cGUsImFwcGVuZENoaWxkIixmdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGEuY2hpbGROb2Rlcyk7YT1PZC5jYWxsKHRoaXMsYSk7aWYoSCh0aGlzKSlmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKylKKGIsY1tlXSk7cmV0dXJuIGF9Yz1IKGEpO2U9T2QuY2FsbCh0aGlzLGEpO2MmJksoYixhKTtIKHRoaXMpJiZKKGIsYSk7cmV0dXJuIGV9KTtJKE5vZGUucHJvdG90eXBlLCJjbG9uZU5vZGUiLGZ1bmN0aW9uKGEpe2E9TmQuY2FsbCh0aGlzLCEhYSk7dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk/TChiLGEpOgpBZChiLGEpO3JldHVybiBhfSk7SShOb2RlLnByb3RvdHlwZSwicmVtb3ZlQ2hpbGQiLGZ1bmN0aW9uKGEpe3ZhciBjPUgoYSksZT1RZC5jYWxsKHRoaXMsYSk7YyYmSyhiLGEpO3JldHVybiBlfSk7SShOb2RlLnByb3RvdHlwZSwicmVwbGFjZUNoaWxkIixmdW5jdGlvbihhLGQpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTthPVJkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKEsoYixkKSxkPTA7ZDxjLmxlbmd0aDtkKyspSihiLGNbZF0pO3JldHVybiBhfWM9SChhKTt2YXIgZj1SZC5jYWxsKHRoaXMsYSxkKSxnPUgodGhpcyk7ZyYmSyhiLGQpO2MmJksoYixhKTtnJiZKKGIsYSk7cmV0dXJuIGZ9KTtTZCYmU2QuZ2V0P2EoTm9kZS5wcm90b3R5cGUsU2QpOnpkKGIsZnVuY3Rpb24oYil7YShiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9MDtiPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7YisrKWEucHVzaCh0aGlzLmNoaWxkTm9kZXNbYl0udGV4dENvbnRlbnQpO3JldHVybiBhLmpvaW4oIiIpfSxzZXQ6ZnVuY3Rpb24oYSl7Zm9yKDt0aGlzLmZpcnN0Q2hpbGQ7KVFkLmNhbGwodGhpcyx0aGlzLmZpcnN0Q2hpbGQpO09kLmNhbGwodGhpcyxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSl9fSl9KX07ZnVuY3Rpb24gc2UoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gZnVuY3Rpb24oYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7KytlKWRbZV09YXJndW1lbnRzW2VdO2U9W107Zm9yKHZhciBoPVtdLGs9MDtrPGQubGVuZ3RoO2srKyl7dmFyIGw9ZFtrXTtsIGluc3RhbmNlb2YgRWxlbWVudCYmSChsKSYmaC5wdXNoKGwpO2lmKGwgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihsPWwuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZyllLnB1c2gobCk7ZWxzZSBlLnB1c2gobCl9Yi5hcHBseSh0aGlzLGQpO2ZvcihkPTA7ZDxoLmxlbmd0aDtkKyspSyhhLGhbZF0pO2lmKEgodGhpcykpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyloPWVbZF0saCBpbnN0YW5jZW9mIEVsZW1lbnQmJkooYSxoKX19dmFyIGM9RWxlbWVudC5wcm90b3R5cGU7dm9pZCAwIT09ZWUmJihjLmJlZm9yZT1iKGVlKSk7dm9pZCAwIT09ZWUmJihjLmFmdGVyPWIoZmUpKTt2b2lkIDAhPT1nZSYmCkkoYywicmVwbGFjZVdpdGgiLGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2RdPWFyZ3VtZW50c1tkXTtkPVtdO2Zvcih2YXIgZz1bXSxoPTA7aDxjLmxlbmd0aDtoKyspe3ZhciBrPWNbaF07ayBpbnN0YW5jZW9mIEVsZW1lbnQmJkgoaykmJmcucHVzaChrKTtpZihrIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3Ioaz1rLmZpcnN0Q2hpbGQ7aztrPWsubmV4dFNpYmxpbmcpZC5wdXNoKGspO2Vsc2UgZC5wdXNoKGspfWg9SCh0aGlzKTtnZS5hcHBseSh0aGlzLGMpO2ZvcihjPTA7YzxnLmxlbmd0aDtjKyspSyhhLGdbY10pO2lmKGgpZm9yKEsoYSx0aGlzKSxjPTA7YzxkLmxlbmd0aDtjKyspZz1kW2NdLGcgaW5zdGFuY2VvZiBFbGVtZW50JiZKKGEsZyl9KTt2b2lkIDAhPT1oZSYmSShjLCJyZW1vdmUiLGZ1bmN0aW9uKCl7dmFyIGI9SCh0aGlzKTtoZS5jYWxsKHRoaXMpO2ImJksoYSx0aGlzKX0pfTtmdW5jdGlvbiB0ZSgpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiaW5uZXJIVE1MIix7ZW51bWVyYWJsZTpiLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpiLmdldCxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxlPXZvaWQgMDtIKHRoaXMpJiYoZT1bXSx3ZCh0aGlzLGZ1bmN0aW9uKGEpe2EhPT1jJiZlLnB1c2goYSl9KSk7Yi5zZXQuY2FsbCh0aGlzLGEpO2lmKGUpZm9yKHZhciBmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl07MT09PWcuX19DRV9zdGF0ZSYmZC5kaXNjb25uZWN0ZWRDYWxsYmFjayhnKX10aGlzLm93bmVyRG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT9MKGQsdGhpcyk6QWQoZCx0aGlzKTtyZXR1cm4gYX19KX1mdW5jdGlvbiBiKGEsYil7SShhLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLGZ1bmN0aW9uKGEsYyl7dmFyIGU9SChjKTthPWIuY2FsbCh0aGlzLGEsYyk7ZSYmSyhkLGMpO0goYSkmJkooZCxjKTtyZXR1cm4gYX0pfQpmdW5jdGlvbiBjKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2Zvcih2YXIgYz1bXTthIT09YjthPWEubmV4dFNpYmxpbmcpYy5wdXNoKGEpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspTChkLGNbYl0pfUkoYSwiaW5zZXJ0QWRqYWNlbnRIVE1MIixmdW5jdGlvbihhLGQpe2E9YS50b0xvd2VyQ2FzZSgpO2lmKCJiZWZvcmViZWdpbiI9PT1hKXt2YXIgZT10aGlzLnByZXZpb3VzU2libGluZztiLmNhbGwodGhpcyxhLGQpO2MoZXx8dGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsdGhpcyl9ZWxzZSBpZigiYWZ0ZXJiZWdpbiI9PT1hKWU9dGhpcy5maXJzdENoaWxkLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLmZpcnN0Q2hpbGQsZSk7ZWxzZSBpZigiYmVmb3JlZW5kIj09PWEpZT10aGlzLmxhc3RDaGlsZCxiLmNhbGwodGhpcyxhLGQpLGMoZXx8dGhpcy5maXJzdENoaWxkLG51bGwpO2Vsc2UgaWYoImFmdGVyZW5kIj09PWEpZT10aGlzLm5leHRTaWJsaW5nLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLm5leHRTaWJsaW5nLAplKTtlbHNlIHRocm93IG5ldyBTeW50YXhFcnJvcigiVGhlIHZhbHVlIHByb3ZpZGVkICgiK1N0cmluZyhhKSsiKSBpcyBub3Qgb25lIG9mICdiZWZvcmViZWdpbicsICdhZnRlcmJlZ2luJywgJ2JlZm9yZWVuZCcsIG9yICdhZnRlcmVuZCcuIik7fSl9dmFyIGQ9b2U7VGQmJkkoRWxlbWVudC5wcm90b3R5cGUsImF0dGFjaFNoYWRvdyIsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19DRV9zaGFkb3dSb290PWE9VGQuY2FsbCh0aGlzLGEpfSk7VWQmJlVkLmdldD9hKEVsZW1lbnQucHJvdG90eXBlLFVkKTpqZSYmamUuZ2V0P2EoSFRNTEVsZW1lbnQucHJvdG90eXBlLGplKTp6ZChkLGZ1bmN0aW9uKGIpe2EoYix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5kLmNhbGwodGhpcywhMCkuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lLGM9Yj90aGlzLmNvbnRlbnQ6dGhpcyxkPUhkLmNhbGwoZG9jdW1lbnQsCnRoaXMubmFtZXNwYWNlVVJJLHRoaXMubG9jYWxOYW1lKTtmb3IoZC5pbm5lckhUTUw9YTswPGMuY2hpbGROb2Rlcy5sZW5ndGg7KVFkLmNhbGwoYyxjLmNoaWxkTm9kZXNbMF0pO2ZvcihhPWI/ZC5jb250ZW50OmQ7MDxhLmNoaWxkTm9kZXMubGVuZ3RoOylPZC5jYWxsKGMsYS5jaGlsZE5vZGVzWzBdKX19KX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSIsZnVuY3Rpb24oYSxiKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBXZC5jYWxsKHRoaXMsYSxiKTt2YXIgYz1WZC5jYWxsKHRoaXMsYSk7V2QuY2FsbCh0aGlzLGEsYik7Yj1WZC5jYWxsKHRoaXMsYSk7ZC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGMsYixudWxsKX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZU5TIixmdW5jdGlvbihhLGIsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gWmQuY2FsbCh0aGlzLGEsYixjKTt2YXIgZT1ZZC5jYWxsKHRoaXMsYSwKYik7WmQuY2FsbCh0aGlzLGEsYixjKTtjPVlkLmNhbGwodGhpcyxhLGIpO2QuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixlLGMsYSl9KTtJKEVsZW1lbnQucHJvdG90eXBlLCJyZW1vdmVBdHRyaWJ1dGUiLGZ1bmN0aW9uKGEpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIFhkLmNhbGwodGhpcyxhKTt2YXIgYj1WZC5jYWxsKHRoaXMsYSk7WGQuY2FsbCh0aGlzLGEpO251bGwhPT1iJiZkLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGEsYixudWxsLG51bGwpfSk7SShFbGVtZW50LnByb3RvdHlwZSwicmVtb3ZlQXR0cmlidXRlTlMiLGZ1bmN0aW9uKGEsYil7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gJGQuY2FsbCh0aGlzLGEsYik7dmFyIGM9WWQuY2FsbCh0aGlzLGEsYik7JGQuY2FsbCh0aGlzLGEsYik7dmFyIGU9WWQuY2FsbCh0aGlzLGEsYik7YyE9PWUmJmQuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixjLGUsYSl9KTtrZT9iKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKa2UpOmFlP2IoRWxlbWVudC5wcm90b3R5cGUsYWUpOmNvbnNvbGUud2FybigiQ3VzdG9tIEVsZW1lbnRzOiBgRWxlbWVudCNpbnNlcnRBZGphY2VudEVsZW1lbnRgIHdhcyBub3QgcGF0Y2hlZC4iKTtsZT9jKEhUTUxFbGVtZW50LnByb3RvdHlwZSxsZSk6YmU/YyhFbGVtZW50LnByb3RvdHlwZSxiZSk6Y29uc29sZS53YXJuKCJDdXN0b20gRWxlbWVudHM6IGBFbGVtZW50I2luc2VydEFkamFjZW50SFRNTGAgd2FzIG5vdCBwYXRjaGVkLiIpO3BlKGQsRWxlbWVudC5wcm90b3R5cGUse1Y6Y2UsYXBwZW5kOmRlfSk7c2UoZCl9O3ZhciB1ZT13aW5kb3cuY3VzdG9tRWxlbWVudHM7aWYoIXVlfHx1ZS5mb3JjZVBvbHlmaWxsfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZGVmaW5lfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZ2V0KXt2YXIgb2U9bmV3IHhkO25lKCk7cWUoKTtwZShvZSxEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx7VjpMZCxhcHBlbmQ6TWR9KTtyZSgpO3RlKCk7ZG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT0hMDt2YXIgY3VzdG9tRWxlbWVudHM9bmV3IE4ob2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImN1c3RvbUVsZW1lbnRzIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y3VzdG9tRWxlbWVudHN9KX07ZnVuY3Rpb24gdmUoKXt0aGlzLmVuZD10aGlzLnN0YXJ0PTA7dGhpcy5ydWxlcz10aGlzLnBhcmVudD10aGlzLnByZXZpb3VzPW51bGw7dGhpcy5jc3NUZXh0PXRoaXMucGFyc2VkQ3NzVGV4dD0iIjt0aGlzLmF0UnVsZT0hMTt0aGlzLnR5cGU9MDt0aGlzLnBhcnNlZFNlbGVjdG9yPXRoaXMuc2VsZWN0b3I9dGhpcy5rZXlmcmFtZXNOYW1lPSIifQpmdW5jdGlvbiB3ZShhKXthPWEucmVwbGFjZSh4ZSwiIikucmVwbGFjZSh5ZSwiIik7dmFyIGI9emUsYz1hLGQ9bmV3IHZlO2Quc3RhcnQ9MDtkLmVuZD1jLmxlbmd0aDtmb3IodmFyIGU9ZCxmPTAsZz1jLmxlbmd0aDtmPGc7ZisrKWlmKCJ7Ij09PWNbZl0pe2UucnVsZXN8fChlLnJ1bGVzPVtdKTt2YXIgaD1lLGs9aC5ydWxlc1toLnJ1bGVzLmxlbmd0aC0xXXx8bnVsbDtlPW5ldyB2ZTtlLnN0YXJ0PWYrMTtlLnBhcmVudD1oO2UucHJldmlvdXM9aztoLnJ1bGVzLnB1c2goZSl9ZWxzZSJ9Ij09PWNbZl0mJihlLmVuZD1mKzEsZT1lLnBhcmVudHx8ZCk7cmV0dXJuIGIoZCxhKX0KZnVuY3Rpb24gemUoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPUFlKGMpLGM9Yy5yZXBsYWNlKEJlLCIgIiksYz1jLnN1YnN0cmluZyhjLmxhc3RJbmRleE9mKCI7IikrMSksYz1hLnBhcnNlZFNlbGVjdG9yPWEuc2VsZWN0b3I9Yy50cmltKCksYS5hdFJ1bGU9MD09PWMuaW5kZXhPZigiQCIpLGEuYXRSdWxlPzA9PT1jLmluZGV4T2YoIkBtZWRpYSIpP2EudHlwZT1DZTpjLm1hdGNoKERlKSYmKGEudHlwZT1FZSxhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdChCZSkucG9wKCkpOmEudHlwZT0wPT09Yy5pbmRleE9mKCItLSIpP0ZlOkdlKTtpZihjPWEucnVsZXMpZm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmPXZvaWQgMDtkPGUmJihmPWNbZF0pO2QrKyl6ZShmLApiKTtyZXR1cm4gYX1mdW5jdGlvbiBBZShhKXtyZXR1cm4gYS5yZXBsYWNlKC9cXChbMC05YS1mXXsxLDZ9KVxzL2dpLGZ1bmN0aW9uKGEsYyl7YT1jO2ZvcihjPTYtYS5sZW5ndGg7Yy0tOylhPSIwIithO3JldHVybiJcXCIrYX0pfQpmdW5jdGlvbiBIZShhLGIsYyl7Yz12b2lkIDA9PT1jPyIiOmM7dmFyIGQ9IiI7aWYoYS5jc3NUZXh0fHxhLnJ1bGVzKXt2YXIgZT1hLnJ1bGVzLGY7aWYoZj1lKWY9ZVswXSxmPSEoZiYmZi5zZWxlY3RvciYmMD09PWYuc2VsZWN0b3IuaW5kZXhPZigiLS0iKSk7aWYoZil7Zj0wO2Zvcih2YXIgZz1lLmxlbmd0aCxoPXZvaWQgMDtmPGcmJihoPWVbZl0pO2YrKylkPUhlKGgsYixkKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKEllLCIiKS5yZXBsYWNlKEplLCIiKSxiPWIucmVwbGFjZShLZSwiIikucmVwbGFjZShMZSwiIikpLChkPWIudHJpbSgpKSYmKGQ9IiAgIitkKyJcbiIpfWQmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWQsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEdlPTEsRWU9NyxDZT00LEZlPTFFMyx4ZT0vXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvL2dpbSx5ZT0vQGltcG9ydFteO10qOy9naW0sSWU9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/KD86Wztcbl18JCkvZ2ltLEplPS8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qP3tbXn1dKj99KD86Wztcbl18JCk/L2dpbSxLZT0vQGFwcGx5XHMqXCg/W14pO10qXCk/XHMqKD86Wztcbl18JCk/L2dpbSxMZT0vW147Ol0qPzpbXjtdKj92YXJcKFteO10qXCkoPzpbO1xuXXwkKT8vZ2ltLERlPS9eQFteXHNdKmtleWZyYW1lcy8sQmU9L1xzKy9nO3ZhciBPPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLE1lO2Z1bmN0aW9uIE5lKGEpe01lPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6T3x8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgT2U7d2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQmJihPZT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciBQZT0hKCF3aW5kb3cuU2hhZHlDU1N8fCF3aW5kb3cuU2hhZHlDU1MuZGlzYWJsZVJ1bnRpbWUpOwp3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M/TWU9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KE5lKHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6TmUod2luZG93LldlYkNvbXBvbmVudHMmJndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzKTt2YXIgUT1NZSxRZT1PZTt2YXIgUmU9Lyg/Ol58Wztcc3tdXHMqKSgtLVtcdy1dKj8pXHMqOlxzKig/OigoPzonKD86XFwnfC4pKj8nfCIoPzpcXCJ8LikqPyJ8XChbXildKj9cKXxbXn07e10pKyl8XHsoW159XSopXH0oPzooPz1bO1xzfV0pfCQpKS9naSxTZT0vKD86XnxcVyspQGFwcGx5XHMqXCg/KFteKTtcbl0qKVwpPy9naSxUZT0vKC0tW1x3LV0rKVxzKihbOiw7KV18JCkvZ2ksVWU9LyhhbmltYXRpb25ccyo6KXwoYW5pbWF0aW9uLW5hbWVccyo6KS8sJGU9L0BtZWRpYVxzKC4qKS8sYWY9L1x7W159XSpcfS9nO3ZhciBiZj1uZXcgU2V0O2Z1bmN0aW9uIGNmKGEsYil7aWYoIWEpcmV0dXJuIiI7InN0cmluZyI9PT10eXBlb2YgYSYmKGE9d2UoYSkpO2ImJmRmKGEsYik7cmV0dXJuIEhlKGEsUSl9ZnVuY3Rpb24gZWYoYSl7IWEuX19jc3NSdWxlcyYmYS50ZXh0Q29udGVudCYmKGEuX19jc3NSdWxlcz13ZShhLnRleHRDb250ZW50KSk7cmV0dXJuIGEuX19jc3NSdWxlc3x8bnVsbH1mdW5jdGlvbiBmZihhKXtyZXR1cm4hIWEucGFyZW50JiZhLnBhcmVudC50eXBlPT09RWV9ZnVuY3Rpb24gZGYoYSxiLGMsZCl7aWYoYSl7dmFyIGU9ITEsZj1hLnR5cGU7aWYoZCYmZj09PUNlKXt2YXIgZz1hLnNlbGVjdG9yLm1hdGNoKCRlKTtnJiYod2luZG93Lm1hdGNoTWVkaWEoZ1sxXSkubWF0Y2hlc3x8KGU9ITApKX1mPT09R2U/YihhKTpjJiZmPT09RWU/YyhhKTpmPT09RmUmJihlPSEwKTtpZigoYT1hLnJ1bGVzKSYmIWUpZm9yKGU9MCxmPWEubGVuZ3RoLGc9dm9pZCAwO2U8ZiYmKGc9YVtlXSk7ZSsrKWRmKGcsYixjLGQpfX0KZnVuY3Rpb24gZ2YoYSxiLGMsZCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiJiZlLnNldEF0dHJpYnV0ZSgic2NvcGUiLGIpO2UudGV4dENvbnRlbnQ9YTtoZihlLGMsZCk7cmV0dXJuIGV9dmFyIGpmPW51bGw7ZnVuY3Rpb24ga2YoYSl7YT1kb2N1bWVudC5jcmVhdGVDb21tZW50KCIgU2hhZHkgRE9NIHN0eWxlcyBmb3IgIithKyIgIik7dmFyIGI9ZG9jdW1lbnQuaGVhZDtiLmluc2VydEJlZm9yZShhLChqZj9qZi5uZXh0U2libGluZzpudWxsKXx8Yi5maXJzdENoaWxkKTtyZXR1cm4gamY9YX1mdW5jdGlvbiBoZihhLGIsYyl7Yj1ifHxkb2N1bWVudC5oZWFkO2IuaW5zZXJ0QmVmb3JlKGEsYyYmYy5uZXh0U2libGluZ3x8Yi5maXJzdENoaWxkKTtqZj9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGpmKT09PU5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HJiYoamY9YSk6amY9YX0KZnVuY3Rpb24gbGYoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2I8ZDtiKyspaWYoIigiPT09YVtiXSljKys7ZWxzZSBpZigiKSI9PT1hW2JdJiYwPT09LS1jKXJldHVybiBiO3JldHVybi0xfWZ1bmN0aW9uIG1mKGEsYil7dmFyIGM9YS5pbmRleE9mKCJ2YXIoIik7aWYoLTE9PT1jKXJldHVybiBiKGEsIiIsIiIsIiIpO3ZhciBkPWxmKGEsYyszKSxlPWEuc3Vic3RyaW5nKGMrNCxkKTtjPWEuc3Vic3RyaW5nKDAsYyk7YT1tZihhLnN1YnN0cmluZyhkKzEpLGIpO2Q9ZS5pbmRleE9mKCIsIik7cmV0dXJuLTE9PT1kP2IoYyxlLnRyaW0oKSwiIixhKTpiKGMsZS5zdWJzdHJpbmcoMCxkKS50cmltKCksZS5zdWJzdHJpbmcoZCsxKS50cmltKCksYSl9ZnVuY3Rpb24gbmYoYSxiKXtPP2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsYik6d2luZG93LlNoYWR5RE9NLm5hdGl2ZU1ldGhvZHMuc2V0QXR0cmlidXRlLmNhbGwoYSwiY2xhc3MiLGIpfQp2YXIgb2Y9d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00ud3JhcHx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2Z1bmN0aW9uIHBmKGEpe3ZhciBiPWEubG9jYWxOYW1lLGM9IiI7Yj8tMTxiLmluZGV4T2YoIi0iKXx8KGM9YixiPWEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZSgiaXMiKXx8IiIpOihiPWEuaXMsYz1hLmV4dGVuZHMpO3JldHVybntpczpiLE06Y319ZnVuY3Rpb24gcWYoYSl7Zm9yKHZhciBiPVtdLGM9IiIsZD0wOzA8PWQmJmQ8YS5sZW5ndGg7ZCsrKWlmKCIoIj09PWFbZF0pe3ZhciBlPWxmKGEsZCk7Yys9YS5zbGljZShkLGUrMSk7ZD1lfWVsc2UiLCI9PT1hW2RdPyhiLnB1c2goYyksYz0iIik6Yys9YVtkXTtjJiZiLnB1c2goYyk7cmV0dXJuIGJ9CmZ1bmN0aW9uIHJmKGEpe2lmKHZvaWQgMCE9PVFlKXJldHVybiBRZTtpZih2b2lkIDA9PT1hLl9fY3NzQnVpbGQpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJjc3MtYnVpbGQiKTtpZihiKWEuX19jc3NCdWlsZD1iO2Vsc2V7YTp7Yj0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2lmKGIgaW5zdGFuY2VvZiBDb21tZW50JiYoYj1iLnRleHRDb250ZW50LnRyaW0oKS5zcGxpdCgiOiIpLCJjc3MtYnVpbGQiPT09YlswXSkpe2I9YlsxXTticmVhayBhfWI9IiJ9aWYoIiIhPT1iKXt2YXIgYz0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKX1hLl9fY3NzQnVpbGQ9Yn19cmV0dXJuIGEuX19jc3NCdWlsZHx8IiJ9CmZ1bmN0aW9uIHNmKGEpe2E9dm9pZCAwPT09YT8iIjphO3JldHVybiIiIT09YSYmUT9PPyJzaGFkb3ciPT09YToic2hhZHkiPT09YTohMX07ZnVuY3Rpb24gdGYoKXt9ZnVuY3Rpb24gdWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIil9KX1mdW5jdGlvbiB2ZihhLGIsYyl7Yi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZjKGIpO3ZhciBkOyJ0ZW1wbGF0ZSI9PT1iLmxvY2FsTmFtZT9kPShiLmNvbnRlbnR8fGIuX2NvbnRlbnR8fGIpLmNoaWxkTm9kZXM6ZD1iLmNoaWxkcmVufHxiLmNoaWxkTm9kZXM7aWYoZClmb3IoYj0wO2I8ZC5sZW5ndGg7YisrKXZmKGEsZFtiXSxjKX0KZnVuY3Rpb24gd2YoYSxiLGMpe2lmKGIpaWYoYS5jbGFzc0xpc3QpYz8oYS5jbGFzc0xpc3QucmVtb3ZlKCJzdHlsZS1zY29wZSIpLGEuY2xhc3NMaXN0LnJlbW92ZShiKSk6KGEuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSxhLmNsYXNzTGlzdC5hZGQoYikpO2Vsc2UgaWYoYS5nZXRBdHRyaWJ1dGUpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpO2M/ZCYmKGI9ZC5yZXBsYWNlKCJzdHlsZS1zY29wZSIsIiIpLnJlcGxhY2UoYiwiIiksbmYoYSxiKSk6bmYoYSwoZD9kKyIgIjoiIikrInN0eWxlLXNjb3BlICIrYil9fWZ1bmN0aW9uIHhmKGEsYixjKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxiLCEwKTt3ZihhLGMpfSl9ZnVuY3Rpb24geWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIiwhMCl9KX0KZnVuY3Rpb24gemYoYSxiLGMsZCxlKXt2YXIgZj1SO2U9dm9pZCAwPT09ZT8iIjplOyIiPT09ZSYmKE98fCJzaGFkeSI9PT0odm9pZCAwPT09ZD8iIjpkKT9lPWNmKGIsYyk6KGE9cGYoYSksZT1BZihmLGIsYS5pcyxhLk0sYykrIlxuXG4iKSk7cmV0dXJuIGUudHJpbSgpfWZ1bmN0aW9uIEFmKGEsYixjLGQsZSl7dmFyIGY9QmYoYyxkKTtjPWM/Ii4iK2M6IiI7cmV0dXJuIGNmKGIsZnVuY3Rpb24oYil7Yi5jfHwoYi5zZWxlY3Rvcj1iLmo9Q2YoYSxiLGEuYixjLGYpLGIuYz0hMCk7ZSYmZShiLGMsZil9KX1mdW5jdGlvbiBCZihhLGIpe3JldHVybiBiPyJbaXM9IithKyJdIjphfQpmdW5jdGlvbiBDZihhLGIsYyxkLGUpe3ZhciBmPXFmKGIuc2VsZWN0b3IpO2lmKCFmZihiKSl7Yj0wO2Zvcih2YXIgZz1mLmxlbmd0aCxoPXZvaWQgMDtiPGcmJihoPWZbYl0pO2IrKylmW2JdPWMuY2FsbChhLGgsZCxlKX1yZXR1cm4gZi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuISFhfSkuam9pbigiLCIpfWZ1bmN0aW9uIERmKGEpe3JldHVybiBhLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxjLGQpey0xPGQuaW5kZXhPZigiKyIpP2Q9ZC5yZXBsYWNlKC9cKy9nLCJfX18iKTotMTxkLmluZGV4T2YoIl9fXyIpJiYoZD1kLnJlcGxhY2UoL19fXy9nLCIrIikpO3JldHVybiI6IitjKyIoIitkKyIpIn0pfQpmdW5jdGlvbiBGZihhKXtmb3IodmFyIGI9W10sYztjPWEubWF0Y2goR2YpOyl7dmFyIGQ9Yy5pbmRleCxlPWxmKGEsZCk7aWYoLTE9PT1lKXRocm93IEVycm9yKGMuaW5wdXQrIiBzZWxlY3RvciBtaXNzaW5nICcpJyIpO2M9YS5zbGljZShkLGUrMSk7YT1hLnJlcGxhY2UoYywiXHVlMDAwIik7Yi5wdXNoKGMpfXJldHVybntoYTphLG1hdGNoZXM6Yn19ZnVuY3Rpb24gSGYoYSxiKXt2YXIgYz1hLnNwbGl0KCJcdWUwMDAiKTtyZXR1cm4gYi5yZWR1Y2UoZnVuY3Rpb24oYSxiLGYpe3JldHVybiBhK2IrY1tmKzFdfSxjWzBdKX0KdGYucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSExO2E9YS50cmltKCk7dmFyIGU9RWYudGVzdChhKTtlJiYoYT1hLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxiLGMpe3JldHVybiI6IitiKyIoIitjLnJlcGxhY2UoL1xzL2csIiIpKyIpIn0pLGE9RGYoYSkpO3ZhciBmPUdmLnRlc3QoYSk7aWYoZil7dmFyIGc9RmYoYSk7YT1nLmhhO2c9Zy5tYXRjaGVzfWE9YS5yZXBsYWNlKElmLCI6aG9zdCAkMSIpO2E9YS5yZXBsYWNlKEpmLGZ1bmN0aW9uKGEsZSxmKXtkfHwoYT1LZihmLGUsYixjKSxkPWR8fGEuc3RvcCxlPWEuQ2EsZj1hLnZhbHVlKTtyZXR1cm4gZStmfSk7ZiYmKGE9SGYoYSxnKSk7ZSYmKGE9RGYoYSkpO3JldHVybiBhfTsKZnVuY3Rpb24gS2YoYSxiLGMsZCl7dmFyIGU9YS5pbmRleE9mKCI6OnNsb3R0ZWQiKTswPD1hLmluZGV4T2YoIjpob3N0Iik/YT1MZihhLGQpOjAhPT1lJiYoYT1jP01mKGEsYyk6YSk7Yz0hMTswPD1lJiYoYj0iIixjPSEwKTtpZihjKXt2YXIgZj0hMDtjJiYoYT1hLnJlcGxhY2UoTmYsZnVuY3Rpb24oYSxiKXtyZXR1cm4iID4gIitifSkpfWE9YS5yZXBsYWNlKE9mLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4nW2Rpcj0iJytjKyciXSAnK2IrIiwgIitiKydbZGlyPSInK2MrJyJdJ30pO3JldHVybnt2YWx1ZTphLENhOmIsc3RvcDpmfX0KZnVuY3Rpb24gTWYoYSxiKXthPWEuc3BsaXQoLyhcWy4rP1xdKS8pO2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspaWYoMT09PWQlMiljLnB1c2goYVtkXSk7ZWxzZXt2YXIgZT1hW2RdO2lmKCIiIT09ZXx8ZCE9PWEubGVuZ3RoLTEpZT1lLnNwbGl0KCI6IiksZVswXSs9YixjLnB1c2goZS5qb2luKCI6IikpfXJldHVybiBjLmpvaW4oIiIpfWZ1bmN0aW9uIExmKGEsYil7dmFyIGM9YS5tYXRjaChQZik7cmV0dXJuKGM9YyYmY1syXS50cmltKCl8fCIiKT9jWzBdLm1hdGNoKFFmKT9hLnJlcGxhY2UoUGYsZnVuY3Rpb24oYSxjLGYpe3JldHVybiBiK2Z9KTpjLnNwbGl0KFFmKVswXT09PWI/Yzoic2hvdWxkX25vdF9tYXRjaCI6YS5yZXBsYWNlKCI6aG9zdCIsYil9ZnVuY3Rpb24gUmYoYSl7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSJodG1sIil9CnRmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLm1hdGNoKCI6aG9zdCIpPyIiOmEubWF0Y2goIjo6c2xvdHRlZCIpP3RoaXMuYihhLCI6bm90KC5zdHlsZS1zY29wZSkiKTpNZihhLnRyaW0oKSwiOm5vdCguc3R5bGUtc2NvcGUpIil9O3AuT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGYucHJvdG90eXBlLHthOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ic3R5bGUtc2NvcGUifX19KTsKdmFyIEVmPS86KG50aFstXHddKylcKChbXildKylcKS8sSmY9LyhefFtccz4rfl0rKSgoPzpcWy4rP1xdfFteXHM+K349W10pKykvZyxRZj0vW1suOiMqXS8sSWY9L14oOjpzbG90dGVkKS8sUGY9Lyg6aG9zdCkoPzpcKCgoPzpcKFteKShdKlwpfFteKShdKikrPylcKSkvLE5mPS8oPzo6OnNsb3R0ZWQpKD86XCgoKD86XChbXikoXSpcKXxbXikoXSopKz8pXCkpLyxPZj0vKC4qKTpkaXJcKCg/OihsdHJ8cnRsKSlcKS8sR2Y9LzooPzptYXRjaGVzfGFueXwtKD86d2Via2l0fG1veiktYW55KS8sUj1uZXcgdGY7ZnVuY3Rpb24gU2YoYSxiLGMsZCxlKXt0aGlzLkE9YXx8bnVsbDt0aGlzLmI9Ynx8bnVsbDt0aGlzLmZhPWN8fFtdO3RoaXMubz1udWxsO3RoaXMuY3NzQnVpbGQ9ZXx8IiI7dGhpcy5NPWR8fCIiO3RoaXMuYT10aGlzLnM9dGhpcy53PW51bGx9ZnVuY3Rpb24gVChhKXtyZXR1cm4gYT9hLl9fc3R5bGVJbmZvOm51bGx9ZnVuY3Rpb24gVGYoYSxiKXtyZXR1cm4gYS5fX3N0eWxlSW5mbz1ifVNmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX07U2YucHJvdG90eXBlLl9nZXRTdHlsZVJ1bGVzPVNmLnByb3RvdHlwZS5jO2Z1bmN0aW9uIFVmKGEpe3ZhciBiPXRoaXMubWF0Y2hlc3x8dGhpcy5tYXRjaGVzU2VsZWN0b3J8fHRoaXMubW96TWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm1zTWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm9NYXRjaGVzU2VsZWN0b3J8fHRoaXMud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBiJiZiLmNhbGwodGhpcyxhKX12YXIgVmY9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiVHJpZGVudCIpO2Z1bmN0aW9uIFdmKCl7fWZ1bmN0aW9uIFhmKGEpe3ZhciBiPXt9LGM9W10sZD0wO2RmKGEsZnVuY3Rpb24oYSl7WWYoYSk7YS5pbmRleD1kKys7YT1hLmkuY3NzVGV4dDtmb3IodmFyIGM7Yz1UZS5leGVjKGEpOyl7dmFyIGU9Y1sxXTsiOiIhPT1jWzJdJiYoYltlXT0hMCl9fSxmdW5jdGlvbihhKXtjLnB1c2goYSl9KTthLmI9YzthPVtdO2Zvcih2YXIgZSBpbiBiKWEucHVzaChlKTtyZXR1cm4gYX0KZnVuY3Rpb24gWWYoYSl7aWYoIWEuaSl7dmFyIGI9e30sYz17fTtaZihhLGMpJiYoYi52PWMsYS5ydWxlcz1udWxsKTtiLmNzc1RleHQ9YS5wYXJzZWRDc3NUZXh0LnJlcGxhY2UoYWYsIiIpLnJlcGxhY2UoUmUsIiIpO2EuaT1ifX1mdW5jdGlvbiBaZihhLGIpe3ZhciBjPWEuaTtpZihjKXtpZihjLnYpcmV0dXJuIE9iamVjdC5hc3NpZ24oYixjLnYpLCEwfWVsc2V7Yz1hLnBhcnNlZENzc1RleHQ7Zm9yKHZhciBkO2E9UmUuZXhlYyhjKTspe2Q9KGFbMl18fGFbM10pLnRyaW0oKTtpZigiaW5oZXJpdCIhPT1kfHwidW5zZXQiIT09ZCliW2FbMV0udHJpbSgpXT1kO2Q9ITB9cmV0dXJuIGR9fQpmdW5jdGlvbiAkZihhLGIsYyl7YiYmKGI9MDw9Yi5pbmRleE9mKCI7Iik/YWcoYSxiLGMpOm1mKGIsZnVuY3Rpb24oYixlLGYsZyl7aWYoIWUpcmV0dXJuIGIrZzsoZT0kZihhLGNbZV0sYykpJiYiaW5pdGlhbCIhPT1lPyJhcHBseS1zaGltLWluaGVyaXQiPT09ZSYmKGU9ImluaGVyaXQiKTplPSRmKGEsY1tmXXx8ZixjKXx8ZjtyZXR1cm4gYisoZXx8IiIpK2d9KSk7cmV0dXJuIGImJmIudHJpbSgpfHwiIn0KZnVuY3Rpb24gYWcoYSxiLGMpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgZD0wLGUsZjtkPGIubGVuZ3RoO2QrKylpZihlPWJbZF0pe1NlLmxhc3RJbmRleD0wO2lmKGY9U2UuZXhlYyhlKSllPSRmKGEsY1tmWzFdXSxjKTtlbHNlIGlmKGY9ZS5pbmRleE9mKCI6IiksLTEhPT1mKXt2YXIgZz1lLnN1YnN0cmluZyhmKTtnPWcudHJpbSgpO2c9JGYoYSxnLGMpfHxnO2U9ZS5zdWJzdHJpbmcoMCxmKStnfWJbZF09ZSYmZS5sYXN0SW5kZXhPZigiOyIpPT09ZS5sZW5ndGgtMT9lLnNsaWNlKDAsLTEpOmV8fCIifXJldHVybiBiLmpvaW4oIjsiKX0KZnVuY3Rpb24gYmcoYSxiKXt2YXIgYz17fSxkPVtdO2RmKGEsZnVuY3Rpb24oYSl7YS5pfHxZZihhKTt2YXIgZT1hLmp8fGEucGFyc2VkU2VsZWN0b3I7YiYmYS5pLnYmJmUmJlVmLmNhbGwoYixlKSYmKFpmKGEsYyksYT1hLmluZGV4LGU9cGFyc2VJbnQoYS8zMiwxMCksZFtlXT0oZFtlXXx8MCl8MTw8YSUzMil9LG51bGwsITApO3JldHVybnt2OmMsa2V5OmR9fQpmdW5jdGlvbiBjZyhhLGIsYyxkKXtiLml8fFlmKGIpO2lmKGIuaS52KXt2YXIgZT1wZihhKTthPWUuaXM7ZT1lLk07ZT1hP0JmKGEsZSk6Imh0bWwiO3ZhciBmPWIucGFyc2VkU2VsZWN0b3IsZz0iOmhvc3QgPiAqIj09PWZ8fCJodG1sIj09PWYsaD0wPT09Zi5pbmRleE9mKCI6aG9zdCIpJiYhZzsic2hhZHkiPT09YyYmKGc9Zj09PWUrIiA+ICouIitlfHwtMSE9PWYuaW5kZXhPZigiaHRtbCIpLGg9IWcmJjA9PT1mLmluZGV4T2YoZSkpO2lmKGd8fGgpYz1lLGgmJihiLmp8fChiLmo9Q2YoUixiLFIuYixhPyIuIithOiIiLGUpKSxjPWIuanx8ZSksZCh7aGE6YyxJYTpoLFphOmd9KX19ZnVuY3Rpb24gZGcoYSxiLGMpe3ZhciBkPXt9LGU9e307ZGYoYixmdW5jdGlvbihiKXtjZyhhLGIsYyxmdW5jdGlvbihjKXtVZi5jYWxsKGEuX2VsZW1lbnR8fGEsYy5oYSkmJihjLklhP1pmKGIsZCk6WmYoYixlKSl9KX0sbnVsbCwhMCk7cmV0dXJue1JhOmUsSGE6ZH19CmZ1bmN0aW9uIGVnKGEsYixjLGQpe3ZhciBlPXBmKGIpLGY9QmYoZS5pcyxlLk0pLGc9bmV3IFJlZ0V4cCgiKD86XnxbXi4jWzpdKSIrKGIuZXh0ZW5kcz8iXFwiK2Yuc2xpY2UoMCwtMSkrIlxcXSI6ZikrIigkfFsuOltcXHM+K35dKSIpLGg9VChiKTtlPWguQTtoPWguY3NzQnVpbGQ7dmFyIGs9ZmcoZSxkKTtyZXR1cm4gemYoYixlLGZ1bmN0aW9uKGIpe3ZhciBlPSIiO2IuaXx8WWYoYik7Yi5pLmNzc1RleHQmJihlPWFnKGEsYi5pLmNzc1RleHQsYykpO2IuY3NzVGV4dD1lO2lmKCFPJiYhZmYoYikmJmIuY3NzVGV4dCl7dmFyIGg9ZT1iLmNzc1RleHQ7bnVsbD09Yi5uYSYmKGIubmE9VWUudGVzdChlKSk7aWYoYi5uYSlpZihudWxsPT1iLlUpe2IuVT1bXTtmb3IodmFyIGwgaW4gayloPWtbbF0saD1oKGUpLGUhPT1oJiYoZT1oLGIuVS5wdXNoKGwpKX1lbHNle2ZvcihsPTA7bDxiLlUubGVuZ3RoOysrbCloPWtbYi5VW2xdXSxlPWgoZSk7aD1lfWIuY3NzVGV4dD1oO2Iuaj1iLmp8fApiLnNlbGVjdG9yO2U9Ii4iK2Q7bD1xZihiLmopO2g9MDtmb3IodmFyIE09bC5sZW5ndGgsVT12b2lkIDA7aDxNJiYoVT1sW2hdKTtoKyspbFtoXT1VLm1hdGNoKGcpP1UucmVwbGFjZShmLGUpOmUrIiAiK1U7Yi5zZWxlY3Rvcj1sLmpvaW4oIiwiKX19LGgpfWZ1bmN0aW9uIGZnKGEsYil7YT1hLmI7dmFyIGM9e307aWYoIU8mJmEpZm9yKHZhciBkPTAsZT1hW2RdO2Q8YS5sZW5ndGg7ZT1hWysrZF0pe3ZhciBmPWUsZz1iO2YuZj1uZXcgUmVnRXhwKCJcXGIiK2Yua2V5ZnJhbWVzTmFtZSsiKD8hXFxCfC0pIiwiZyIpO2YuYT1mLmtleWZyYW1lc05hbWUrIi0iK2c7Zi5qPWYuanx8Zi5zZWxlY3RvcjtmLnNlbGVjdG9yPWYuai5yZXBsYWNlKGYua2V5ZnJhbWVzTmFtZSxmLmEpO2NbZS5rZXlmcmFtZXNOYW1lXT1nZyhlKX1yZXR1cm4gY31mdW5jdGlvbiBnZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIucmVwbGFjZShhLmYsYS5hKX19CmZ1bmN0aW9uIGhnKGEsYil7dmFyIGM9aWcsZD1lZihhKTthLnRleHRDb250ZW50PWNmKGQsZnVuY3Rpb24oYSl7dmFyIGQ9YS5jc3NUZXh0PWEucGFyc2VkQ3NzVGV4dDthLmkmJmEuaS5jc3NUZXh0JiYoZD1kLnJlcGxhY2UoSWUsIiIpLnJlcGxhY2UoSmUsIiIpLGEuY3NzVGV4dD1hZyhjLGQsYikpfSl9cC5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZi5wcm90b3R5cGUse2E6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJ4LXNjb3BlIn19fSk7dmFyIGlnPW5ldyBXZjt2YXIgamc9e30sa2c9d2luZG93LmN1c3RvbUVsZW1lbnRzO2lmKGtnJiYhTyYmIVBlKXt2YXIgbGc9a2cuZGVmaW5lO2tnLmRlZmluZT1mdW5jdGlvbihhLGIsYyl7amdbYV18fChqZ1thXT1rZihhKSk7bGcuY2FsbChrZyxhLGIsYyl9fTtmdW5jdGlvbiBtZygpe3RoaXMuY2FjaGU9e319bWcucHJvdG90eXBlLnN0b3JlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuY2FjaGVbYV18fFtdO2UucHVzaCh7djpiLHN0eWxlRWxlbWVudDpjLHM6ZH0pOzEwMDxlLmxlbmd0aCYmZS5zaGlmdCgpO3RoaXMuY2FjaGVbYV09ZX07ZnVuY3Rpb24gbmcoKXt9dmFyIG9nPW5ldyBSZWdFeHAoUi5hKyJcXHMqKFteXFxzXSopIik7ZnVuY3Rpb24gcGcoYSl7cmV0dXJuKGE9KGEuY2xhc3NMaXN0JiZhLmNsYXNzTGlzdC52YWx1ZT9hLmNsYXNzTGlzdC52YWx1ZTphLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpLm1hdGNoKG9nKSk/YVsxXToiIn1mdW5jdGlvbiBxZyhhKXt2YXIgYj1vZihhKS5nZXRSb290Tm9kZSgpO3JldHVybiBiPT09YXx8Yj09PWEub3duZXJEb2N1bWVudD8iIjooYT1iLmhvc3QpP3BmKGEpLmlzOiIifQpmdW5jdGlvbiByZyhhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXTtpZihjLnRhcmdldCE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmYy50YXJnZXQhPT1kb2N1bWVudC5oZWFkKWZvcih2YXIgZD0wO2Q8Yy5hZGRlZE5vZGVzLmxlbmd0aDtkKyspe3ZhciBlPWMuYWRkZWROb2Rlc1tkXTtpZihlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBmPWUuZ2V0Um9vdE5vZGUoKSxnPXBnKGUpO2lmKGcmJmY9PT1lLm93bmVyRG9jdW1lbnQmJigic3R5bGUiIT09ZS5sb2NhbE5hbWUmJiJ0ZW1wbGF0ZSIhPT1lLmxvY2FsTmFtZXx8IiI9PT1yZihlKSkpeWYoZSxnKTtlbHNlIGlmKGYgaW5zdGFuY2VvZiBTaGFkb3dSb290KWZvcihmPXFnKGUpLGYhPT1nJiZ4ZihlLGcsZiksZT13aW5kb3cuU2hhZHlET00ubmF0aXZlTWV0aG9kcy5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZSwiOm5vdCguIitSLmErIikiKSxnPTA7ZzxlLmxlbmd0aDtnKyspe2Y9ZVtnXTsKdmFyIGg9cWcoZik7aCYmd2YoZixoKX19fX19CmlmKCEoT3x8d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaGFuZGxlc0R5bmFtaWNTY29waW5nKSl7dmFyIHNnPW5ldyBNdXRhdGlvbk9ic2VydmVyKHJnKSx0Zz1mdW5jdGlvbihhKXtzZy5vYnNlcnZlKGEse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9O2lmKHdpbmRvdy5jdXN0b21FbGVtZW50cyYmIXdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXRnKGRvY3VtZW50KTtlbHNle3ZhciB1Zz1mdW5jdGlvbigpe3RnKGRvY3VtZW50LmJvZHkpfTt3aW5kb3cuSFRNTEltcG9ydHM/d2luZG93LkhUTUxJbXBvcnRzLndoZW5SZWFkeSh1Zyk6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7aWYoImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSl7dmFyIGE9ZnVuY3Rpb24oKXt1ZygpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGEpfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwKYSl9ZWxzZSB1ZygpfSl9bmc9ZnVuY3Rpb24oKXtyZyhzZy50YWtlUmVjb3JkcygpKX19dmFyIHZnPW5nO3ZhciB3Zz17fTt2YXIgeGc9UHJvbWlzZS5yZXNvbHZlKCk7ZnVuY3Rpb24geWcoYSl7aWYoYT13Z1thXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gemcoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gQWcoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAseGcudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBCZz17fSxDZz1uZXcgbWc7ZnVuY3Rpb24gWSgpe3RoaXMubD17fTt0aGlzLmM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBhPW5ldyB2ZTthLnJ1bGVzPVtdO3RoaXMuZj1UZih0aGlzLmMsbmV3IFNmKGEpKTt0aGlzLmc9ITE7dGhpcy5iPXRoaXMuYT1udWxsfW49WS5wcm90b3R5cGU7bi5mbHVzaD1mdW5jdGlvbigpe3ZnKCl9O24uRmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGVmKGEpfTtuLlZhPWZ1bmN0aW9uKGEpe3JldHVybiBjZihhKX07bi5wcmVwYXJlVGVtcGxhdGU9ZnVuY3Rpb24oYSxiLGMpe3RoaXMucHJlcGFyZVRlbXBsYXRlRG9tKGEsYik7dGhpcy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfTsKbi5wcmVwYXJlVGVtcGxhdGVTdHlsZXM9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhLl9wcmVwYXJlZCYmIVBlKXtPfHxqZ1tiXXx8KGpnW2JdPWtmKGIpKTthLl9wcmVwYXJlZD0hMDthLm5hbWU9YjthLmV4dGVuZHM9Yzt3Z1tiXT1hO3ZhciBkPXJmKGEpLGU9c2YoZCk7Yz17aXM6YixleHRlbmRzOmN9O2Zvcih2YXIgZj1bXSxnPWEuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpLGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihrLmhhc0F0dHJpYnV0ZSgic2hhZHktdW5zY29wZWQiKSl7aWYoIU8pe3ZhciBsPWsudGV4dENvbnRlbnQ7YmYuaGFzKGwpfHwoYmYuYWRkKGwpLGw9ay5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCkpO2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKX19ZWxzZSBmLnB1c2goay50ZXh0Q29udGVudCksay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGspfWY9Zi5qb2luKCIiKS50cmltKCkrKEJnW2JdfHwiIik7CkRnKHRoaXMpO2lmKCFlKXtpZihnPSFkKWc9U2UudGVzdChmKXx8UmUudGVzdChmKSxTZS5sYXN0SW5kZXg9MCxSZS5sYXN0SW5kZXg9MDtoPXdlKGYpO2cmJlEmJnRoaXMuYSYmdGhpcy5hLnRyYW5zZm9ybVJ1bGVzKGgsYik7YS5fc3R5bGVBc3Q9aH1nPVtdO1F8fChnPVhmKGEuX3N0eWxlQXN0KSk7aWYoIWcubGVuZ3RofHxRKWg9Tz9hLmNvbnRlbnQ6bnVsbCxiPWpnW2JdfHxudWxsLGQ9emYoYyxhLl9zdHlsZUFzdCxudWxsLGQsZT9mOiIiKSxkPWQubGVuZ3RoP2dmKGQsYy5pcyxoLGIpOm51bGwsYS5fc3R5bGU9ZDthLmE9Z319O24uUWE9ZnVuY3Rpb24oYSxiKXtCZ1tiXT1hLmpvaW4oIiAiKX07bi5wcmVwYXJlVGVtcGxhdGVEb209ZnVuY3Rpb24oYSxiKXtpZighUGUpe3ZhciBjPXJmKGEpO098fCJzaGFkeSI9PT1jfHxhLl9kb21QcmVwYXJlZHx8KGEuX2RvbVByZXBhcmVkPSEwLHVmKGEuY29udGVudCxiKSl9fTsKZnVuY3Rpb24gRWcoYSl7dmFyIGI9cGYoYSksYz1iLmlzO2I9Yi5NO3ZhciBkPWpnW2NdfHxudWxsLGU9d2dbY107aWYoZSl7Yz1lLl9zdHlsZUFzdDt2YXIgZj1lLmE7ZT1yZihlKTtiPW5ldyBTZihjLGQsZixiLGUpO1RmKGEsYik7cmV0dXJuIGJ9fWZ1bmN0aW9uIEZnKGEpeyFhLmImJndpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlJiYoYS5iPXdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSxhLmIudHJhbnNmb3JtQ2FsbGJhY2s9ZnVuY3Rpb24oYil7YS5yYShiKX0sYS5iLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXsoYS5iLmVucXVldWVkfHxhLmcpJiZhLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX0pfQpmdW5jdGlvbiBEZyhhKXshYS5hJiZ3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0mJihhLmE9d2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbSxhLmEuaW52YWxpZENhbGxiYWNrPXlnKTtGZyhhKX0Kbi5mbHVzaEN1c3RvbVN0eWxlcz1mdW5jdGlvbigpe2lmKCFQZSYmKERnKHRoaXMpLHRoaXMuYikpe3ZhciBhPXRoaXMuYi5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5iLmVucXVldWVkJiYhc2YodGhpcy5mLmNzc0J1aWxkKSl7aWYoUSl7aWYoIXRoaXMuZi5jc3NCdWlsZClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5iLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7aWYoYyYmUSYmdGhpcy5hKXt2YXIgZD1lZihjKTtEZyh0aGlzKTt0aGlzLmEudHJhbnNmb3JtUnVsZXMoZCk7Yy50ZXh0Q29udGVudD1jZihkKX19fWVsc2V7R2codGhpcyx0aGlzLmMsdGhpcy5mKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKShjPXRoaXMuYi5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKGFbYl0pKSYmaGcoYyx0aGlzLmYudyk7dGhpcy5nJiZ0aGlzLnN0eWxlRG9jdW1lbnQoKX10aGlzLmIuZW5xdWV1ZWQ9ITF9fX07Cm4uc3R5bGVFbGVtZW50PWZ1bmN0aW9uKGEsYil7aWYoUGUpe2lmKGIpe1QoYSl8fFRmKGEsbmV3IFNmKG51bGwpKTt2YXIgYz1UKGEpO2Mubz1jLm98fHt9O09iamVjdC5hc3NpZ24oYy5vLGIpO0hnKHRoaXMsYSxjKX19ZWxzZSBpZihjPVQoYSl8fEVnKGEpKWlmKGEhPT10aGlzLmMmJih0aGlzLmc9ITApLGImJihjLm89Yy5vfHx7fSxPYmplY3QuYXNzaWduKGMubyxiKSksUSlIZyh0aGlzLGEsYyk7ZWxzZSBpZih0aGlzLmZsdXNoKCksR2codGhpcyxhLGMpLGMuZmEmJmMuZmEubGVuZ3RoKXtiPXBmKGEpLmlzO3ZhciBkO2E6e2lmKGQ9Q2cuY2FjaGVbYl0pZm9yKHZhciBlPWQubGVuZ3RoLTE7MDw9ZTtlLS0pe3ZhciBmPWRbZV07Yjp7dmFyIGc9Yy5mYTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihmLnZba10hPT1jLndba10pe2c9ITE7YnJlYWsgYn19Zz0hMH1pZihnKXtkPWY7YnJlYWsgYX19ZD12b2lkIDB9Zz1kP2Quc3R5bGVFbGVtZW50Om51bGw7CmU9Yy5zOyhmPWQmJmQucyl8fChmPXRoaXMubFtiXT0odGhpcy5sW2JdfHwwKSsxLGY9YisiLSIrZik7Yy5zPWY7Zj1jLnM7aD1pZztoPWc/Zy50ZXh0Q29udGVudHx8IiI6ZWcoaCxhLGMudyxmKTtrPVQoYSk7dmFyIGw9ay5hO2wmJiFPJiZsIT09ZyYmKGwuX3VzZUNvdW50LS0sMD49bC5fdXNlQ291bnQmJmwucGFyZW50Tm9kZSYmbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGwpKTtPP2suYT8oay5hLnRleHRDb250ZW50PWgsZz1rLmEpOmgmJihnPWdmKGgsZixhLnNoYWRvd1Jvb3Qsay5iKSk6Zz9nLnBhcmVudE5vZGV8fChWZiYmLTE8aC5pbmRleE9mKCJAbWVkaWEiKSYmKGcudGV4dENvbnRlbnQ9aCksaGYoZyxudWxsLGsuYikpOmgmJihnPWdmKGgsZixudWxsLGsuYikpO2cmJihnLl91c2VDb3VudD1nLl91c2VDb3VudHx8MCxrLmEhPWcmJmcuX3VzZUNvdW50Kyssay5hPWcpO2Y9ZztPfHwoZz1jLnMsaz1oPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIixlJiYoaz1oLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFxzKngtc2NvcGVcXHMqIisKZSsiXFxzKiIsImciKSwiICIpKSxrKz0oaz8iICI6IiIpKyJ4LXNjb3BlICIrZyxoIT09ayYmbmYoYSxrKSk7ZHx8Q2cuc3RvcmUoYixjLncsZixjLnMpfX07CmZ1bmN0aW9uIEhnKGEsYixjKXt2YXIgZD1wZihiKS5pcztpZihjLm8pe3ZhciBlPWMubyxmO2ZvcihmIGluIGUpbnVsbD09PWY/Yi5zdHlsZS5yZW1vdmVQcm9wZXJ0eShmKTpiLnN0eWxlLnNldFByb3BlcnR5KGYsZVtmXSl9ZT13Z1tkXTtpZighKCFlJiZiIT09YS5jfHxlJiYiIiE9PXJmKGUpKSYmZSYmZS5fc3R5bGUmJiF6ZyhlKSl7aWYoemcoZSl8fGUuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uIT09ZS5fYXBwbHlTaGltTmV4dFZlcnNpb24pRGcoYSksYS5hJiZhLmEudHJhbnNmb3JtUnVsZXMoZS5fc3R5bGVBc3QsZCksZS5fc3R5bGUudGV4dENvbnRlbnQ9emYoYixjLkEpLEFnKGUpO08mJihhPWIuc2hhZG93Um9vdCkmJihhPWEucXVlcnlTZWxlY3Rvcigic3R5bGUiKSkmJihhLnRleHRDb250ZW50PXpmKGIsYy5BKSk7Yy5BPWUuX3N0eWxlQXN0fX0KZnVuY3Rpb24gSWcoYSxiKXtyZXR1cm4oYj1vZihiKS5nZXRSb290Tm9kZSgpLmhvc3QpP1QoYil8fEVnKGIpP2I6SWcoYSxiKTphLmN9ZnVuY3Rpb24gR2coYSxiLGMpe3ZhciBkPUlnKGEsYiksZT1UKGQpLGY9ZS53O2Q9PT1hLmN8fGZ8fChHZyhhLGQsZSksZj1lLncpO2E9T2JqZWN0LmNyZWF0ZShmfHxudWxsKTtkPWRnKGIsYy5BLGMuY3NzQnVpbGQpO2I9YmcoZS5BLGIpLnY7T2JqZWN0LmFzc2lnbihhLGQuSGEsYixkLlJhKTtiPWMubztmb3IodmFyIGcgaW4gYilpZigoZT1iW2ddKXx8MD09PWUpYVtnXT1lO2c9aWc7Yj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKTtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWQ9YltlXSxhW2RdPSRmKGcsYVtkXSxhKTtjLnc9YX1uLnN0eWxlRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dGhpcy5zdHlsZVN1YnRyZWUodGhpcy5jLGEpfTsKbi5zdHlsZVN1YnRyZWU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKSxkPWMuc2hhZG93Um9vdDsoZHx8YT09PXRoaXMuYykmJnRoaXMuc3R5bGVFbGVtZW50KGEsYik7aWYoYT1kJiYoZC5jaGlsZHJlbnx8ZC5jaGlsZE5vZGVzKSlmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuc3R5bGVTdWJ0cmVlKGFbY10pO2Vsc2UgaWYoYz1jLmNoaWxkcmVufHxjLmNoaWxkTm9kZXMpZm9yKGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLnN0eWxlU3VidHJlZShjW2FdKX07Cm4ucmE9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPXJmKGEpO2MhPT10aGlzLmYuY3NzQnVpbGQmJih0aGlzLmYuY3NzQnVpbGQ9Yyk7aWYoIXNmKGMpKXt2YXIgZD1lZihhKTtkZihkLGZ1bmN0aW9uKGEpe2lmKE8pUmYoYSk7ZWxzZXt2YXIgZD1SO2Euc2VsZWN0b3I9YS5wYXJzZWRTZWxlY3RvcjtSZihhKTthLnNlbGVjdG9yPWEuaj1DZihkLGEsZC5jLHZvaWQgMCx2b2lkIDApfVEmJiIiPT09YyYmKERnKGIpLGIuYSYmYi5hLnRyYW5zZm9ybVJ1bGUoYSkpfSk7UT9hLnRleHRDb250ZW50PWNmKGQpOnRoaXMuZi5BLnJ1bGVzLnB1c2goZCl9fTtuLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1mdW5jdGlvbihhLGIpe3ZhciBjO1F8fChjPShUKGEpfHxUKElnKHRoaXMsYSkpKS53W2JdKTtyZXR1cm4oYz1jfHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9jLnRyaW0oKToiIn07Cm4uVWE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKS5nZXRSb290Tm9kZSgpO2I9Yj9iLnNwbGl0KC9ccy8pOltdO2M9Yy5ob3N0JiZjLmhvc3QubG9jYWxOYW1lO2lmKCFjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTtpZihkKXtkPWQuc3BsaXQoL1xzLyk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspaWYoZFtlXT09PVIuYSl7Yz1kW2UrMV07YnJlYWt9fX1jJiZiLnB1c2goUi5hLGMpO1F8fChjPVQoYSkpJiZjLnMmJmIucHVzaChpZy5hLGMucyk7bmYoYSxiLmpvaW4oIiAiKSl9O24uQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIFQoYSl9O24uVGE9ZnVuY3Rpb24oYSxiKXt3ZihhLGIpfTtuLldhPWZ1bmN0aW9uKGEsYil7d2YoYSxiLCEwKX07bi5TYT1mdW5jdGlvbihhKXtyZXR1cm4gcWcoYSl9O24uRGE9ZnVuY3Rpb24oYSl7cmV0dXJuIHBnKGEpfTtZLnByb3RvdHlwZS5mbHVzaD1ZLnByb3RvdHlwZS5mbHVzaDtZLnByb3RvdHlwZS5wcmVwYXJlVGVtcGxhdGU9WS5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlOwpZLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVFbGVtZW50O1kucHJvdG90eXBlLnN0eWxlRG9jdW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVEb2N1bWVudDtZLnByb3RvdHlwZS5zdHlsZVN1YnRyZWU9WS5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlO1kucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1ZLnByb3RvdHlwZS5nZXRDb21wdXRlZFN0eWxlVmFsdWU7WS5wcm90b3R5cGUuc2V0RWxlbWVudENsYXNzPVkucHJvdG90eXBlLlVhO1kucHJvdG90eXBlLl9zdHlsZUluZm9Gb3JOb2RlPVkucHJvdG90eXBlLkJhO1kucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlRm9yRG9jdW1lbnQ9WS5wcm90b3R5cGUucmE7WS5wcm90b3R5cGUuZ2V0U3R5bGVBc3Q9WS5wcm90b3R5cGUuRmE7WS5wcm90b3R5cGUuc3R5bGVBc3RUb1N0cmluZz1ZLnByb3RvdHlwZS5WYTtZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlcz1ZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlczsKWS5wcm90b3R5cGUuc2NvcGVOb2RlPVkucHJvdG90eXBlLlRhO1kucHJvdG90eXBlLnVuc2NvcGVOb2RlPVkucHJvdG90eXBlLldhO1kucHJvdG90eXBlLnNjb3BlRm9yTm9kZT1ZLnByb3RvdHlwZS5TYTtZLnByb3RvdHlwZS5jdXJyZW50U2NvcGVGb3JOb2RlPVkucHJvdG90eXBlLkRhO1kucHJvdG90eXBlLnByZXBhcmVBZG9wdGVkQ3NzVGV4dD1ZLnByb3RvdHlwZS5RYTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhZLnByb3RvdHlwZSx7bmF0aXZlU2hhZG93OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gT319LG5hdGl2ZUNzczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9fX0pO3ZhciBaPW5ldyBZLEpnLEtnO3dpbmRvdy5TaGFkeUNTUyYmKEpnPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0sS2c9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlKTsKd2luZG93LlNoYWR5Q1NTPXtTY29waW5nU2hpbTpaLHByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIsYyl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1oucHJlcGFyZVRlbXBsYXRlKGEsYixjKX0scHJlcGFyZVRlbXBsYXRlRG9tOmZ1bmN0aW9uKGEsYil7Wi5wcmVwYXJlVGVtcGxhdGVEb20oYSxiKX0scHJlcGFyZVRlbXBsYXRlU3R5bGVzOmZ1bmN0aW9uKGEsYixjKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfSxzdHlsZVN1YnRyZWU6ZnVuY3Rpb24oYSxiKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZVN1YnRyZWUoYSxiKX0sc3R5bGVFbGVtZW50OmZ1bmN0aW9uKGEpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnN0eWxlRWxlbWVudChhKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZURvY3VtZW50KGEpfSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe1ouZmx1c2hDdXN0b21TdHlsZXMoKX0sCmdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBaLmdldENvbXB1dGVkU3R5bGVWYWx1ZShhLGIpfSxuYXRpdmVDc3M6USxuYXRpdmVTaGFkb3c6Tyxjc3NCdWlsZDpRZSxkaXNhYmxlUnVudGltZTpQZX07SmcmJih3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPUpnKTtLZyYmKHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT1LZyk7dmFyIExnPXdpbmRvdy5jdXN0b21FbGVtZW50cyxNZz13aW5kb3cuSFRNTEltcG9ydHMsTmc9d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQ7d2luZG93LldlYkNvbXBvbmVudHM9d2luZG93LldlYkNvbXBvbmVudHN8fHt9O2lmKExnJiZMZy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXt2YXIgT2csUGc9ZnVuY3Rpb24oKXtpZihPZyl7TmcuQyYmTmcuQyh3aW5kb3cuZG9jdW1lbnQpO3ZhciBhPU9nO09nPW51bGw7YSgpO3JldHVybiEwfX0sUWc9TWcud2hlblJlYWR5O0xnLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2soZnVuY3Rpb24oYSl7T2c9YTtRZyhQZyl9KTtNZy53aGVuUmVhZHk9ZnVuY3Rpb24oYSl7UWcoZnVuY3Rpb24oKXtQZygpP01nLndoZW5SZWFkeShhKTphKCl9KX19Ck1nLndoZW5SZWFkeShmdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3dpbmRvdy5XZWJDb21wb25lbnRzLnJlYWR5PSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJXZWJDb21wb25lbnRzUmVhZHkiLHtidWJibGVzOiEwfSkpfSl9KTt2YXIgUmc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtSZy50ZXh0Q29udGVudD0iYm9keSB7dHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluIDAuMnM7IH0gXG5ib2R5W3VucmVzb2x2ZWRdIHtvcGFjaXR5OiAwOyBkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB9IFxuIjt2YXIgU2c9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO1NnLmluc2VydEJlZm9yZShSZyxTZy5maXJzdENoaWxkKTt9KS5jYWxsKHRoaXMpOwoKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBsPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLHA7ZnVuY3Rpb24gcihhKXtwPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6bHx8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgdDt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKHQ9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgYWE9ISghd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTsKd2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP3A9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KHIod2luZG93LlNoYWR5Q1NTKSx3aW5kb3cuU2hhZHlDU1M9dm9pZCAwKTpyKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIHU9cCx2PXQ7ZnVuY3Rpb24gdygpe3RoaXMuZW5kPXRoaXMuc3RhcnQ9MDt0aGlzLnJ1bGVzPXRoaXMucGFyZW50PXRoaXMucHJldmlvdXM9bnVsbDt0aGlzLmNzc1RleHQ9dGhpcy5wYXJzZWRDc3NUZXh0PSIiO3RoaXMuYXRSdWxlPSExO3RoaXMudHlwZT0wO3RoaXMucGFyc2VkU2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj10aGlzLmtleWZyYW1lc05hbWU9IiJ9CmZ1bmN0aW9uIHgoYSl7YT1hLnJlcGxhY2UoYmEsIiIpLnJlcGxhY2UoY2EsIiIpO3ZhciBiPXksYz1hLGU9bmV3IHc7ZS5zdGFydD0wO2UuZW5kPWMubGVuZ3RoO2Zvcih2YXIgZD1lLGY9MCxnPWMubGVuZ3RoO2Y8ZztmKyspaWYoInsiPT09Y1tmXSl7ZC5ydWxlc3x8KGQucnVsZXM9W10pO3ZhciBoPWQsaz1oLnJ1bGVzW2gucnVsZXMubGVuZ3RoLTFdfHxudWxsO2Q9bmV3IHc7ZC5zdGFydD1mKzE7ZC5wYXJlbnQ9aDtkLnByZXZpb3VzPWs7aC5ydWxlcy5wdXNoKGQpfWVsc2UifSI9PT1jW2ZdJiYoZC5lbmQ9ZisxLGQ9ZC5wYXJlbnR8fGUpO3JldHVybiBiKGUsYSl9CmZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPWRhKGMpLGM9Yy5yZXBsYWNlKHosIiAiKSxjPWMuc3Vic3RyaW5nKGMubGFzdEluZGV4T2YoIjsiKSsxKSxjPWEucGFyc2VkU2VsZWN0b3I9YS5zZWxlY3Rvcj1jLnRyaW0oKSxhLmF0UnVsZT0wPT09Yy5pbmRleE9mKCJAIiksYS5hdFJ1bGU/MD09PWMuaW5kZXhPZigiQG1lZGlhIik/YS50eXBlPUE6Yy5tYXRjaChlYSkmJihhLnR5cGU9QixhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdCh6KS5wb3AoKSk6YS50eXBlPTA9PT1jLmluZGV4T2YoIi0tIik/QzpEKTtpZihjPWEucnVsZXMpZm9yKHZhciBlPTAsZD1jLmxlbmd0aCxmPXZvaWQgMDtlPGQmJihmPWNbZV0pO2UrKyl5KGYsYik7CnJldHVybiBhfWZ1bmN0aW9uIGRhKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcKFswLTlhLWZdezEsNn0pXHMvZ2ksZnVuY3Rpb24oYSxjKXthPWM7Zm9yKGM9Ni1hLmxlbmd0aDtjLS07KWE9IjAiK2E7cmV0dXJuIlxcIithfSl9CmZ1bmN0aW9uIEUoYSxiLGMpe2M9dm9pZCAwPT09Yz8iIjpjO3ZhciBlPSIiO2lmKGEuY3NzVGV4dHx8YS5ydWxlcyl7dmFyIGQ9YS5ydWxlcyxmO2lmKGY9ZClmPWRbMF0sZj0hKGYmJmYuc2VsZWN0b3ImJjA9PT1mLnNlbGVjdG9yLmluZGV4T2YoIi0tIikpO2lmKGYpe2Y9MDtmb3IodmFyIGc9ZC5sZW5ndGgsaD12b2lkIDA7ZjxnJiYoaD1kW2ZdKTtmKyspZT1FKGgsYixlKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKGZhLCIiKS5yZXBsYWNlKGhhLCIiKSxiPWIucmVwbGFjZShpYSwiIikucmVwbGFjZShqYSwiIikpLChlPWIudHJpbSgpKSYmKGU9IiAgIitlKyJcbiIpfWUmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWUsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEQ9MSxCPTcsQT00LEM9MUUzLGJhPS9cL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8vZ2ltLGNhPS9AaW1wb3J0W147XSo7L2dpbSxmYT0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj8oPzpbO1xuXXwkKS9naW0saGE9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/e1tefV0qP30oPzpbO1xuXXwkKT8vZ2ltLGlhPS9AYXBwbHlccypcKD9bXik7XSpcKT9ccyooPzpbO1xuXXwkKT8vZ2ltLGphPS9bXjs6XSo/OlteO10qP3ZhclwoW147XSpcKSg/Ols7XG5dfCQpPy9naW0sZWE9L15AW15cc10qa2V5ZnJhbWVzLyx6PS9ccysvZzt2YXIgRz0vKD86XnxbO1xze11ccyopKC0tW1x3LV0qPylccyo6XHMqKD86KCg/OicoPzpcXCd8LikqPyd8Iig/OlxcInwuKSo/InxcKFteKV0qP1wpfFtefTt7XSkrKXxceyhbXn1dKilcfSg/Oig/PVs7XHN9XSl8JCkpL2dpLEg9Lyg/Ol58XFcrKUBhcHBseVxzKlwoPyhbXik7XG5dKilcKT8vZ2ksa2E9L0BtZWRpYVxzKC4qKS87dmFyIEk9bmV3IFNldDtmdW5jdGlvbiBKKGEpe2lmKCFhKXJldHVybiIiOyJzdHJpbmciPT09dHlwZW9mIGEmJihhPXgoYSkpO3JldHVybiBFKGEsdSl9ZnVuY3Rpb24gSyhhKXshYS5fX2Nzc1J1bGVzJiZhLnRleHRDb250ZW50JiYoYS5fX2Nzc1J1bGVzPXgoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gTChhLGIsYyxlKXtpZihhKXt2YXIgZD0hMSxmPWEudHlwZTtpZihlJiZmPT09QSl7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaChrYSk7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChkPSEwKSl9Zj09PUQ/YihhKTpjJiZmPT09Qj9jKGEpOmY9PT1DJiYoZD0hMCk7aWYoKGE9YS5ydWxlcykmJiFkKWZvcihkPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtkPGYmJihnPWFbZF0pO2QrKylMKGcsYixjLGUpfX0KZnVuY3Rpb24gTShhLGIpe3ZhciBjPWEuaW5kZXhPZigidmFyKCIpO2lmKC0xPT09YylyZXR1cm4gYihhLCIiLCIiLCIiKTthOnt2YXIgZT0wO3ZhciBkPWMrMztmb3IodmFyIGY9YS5sZW5ndGg7ZDxmO2QrKylpZigiKCI9PT1hW2RdKWUrKztlbHNlIGlmKCIpIj09PWFbZF0mJjA9PT0tLWUpYnJlYWsgYTtkPS0xfWU9YS5zdWJzdHJpbmcoYys0LGQpO2M9YS5zdWJzdHJpbmcoMCxjKTthPU0oYS5zdWJzdHJpbmcoZCsxKSxiKTtkPWUuaW5kZXhPZigiLCIpO3JldHVybi0xPT09ZD9iKGMsZS50cmltKCksIiIsYSk6YihjLGUuc3Vic3RyaW5nKDAsZCkudHJpbSgpLGUuc3Vic3RyaW5nKGQrMSkudHJpbSgpLGEpfQpmdW5jdGlvbiBOKGEpe2lmKHZvaWQgMCE9PXYpcmV0dXJuIHY7aWYodm9pZCAwPT09YS5fX2Nzc0J1aWxkKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgiY3NzLWJ1aWxkIik7aWYoYilhLl9fY3NzQnVpbGQ9YjtlbHNle2E6e2I9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtpZihiIGluc3RhbmNlb2YgQ29tbWVudCYmKGI9Yi50ZXh0Q29udGVudC50cmltKCkuc3BsaXQoIjoiKSwiY3NzLWJ1aWxkIj09PWJbMF0pKXtiPWJbMV07YnJlYWsgYX1iPSIifWlmKCIiIT09Yil7dmFyIGM9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9YS5fX2Nzc0J1aWxkPWJ9fXJldHVybiBhLl9fY3NzQnVpbGR8fCIifTt2YXIgbGE9LztccyovbSxtYT0vXlxzKihpbml0aWFsKXwoaW5oZXJpdClccyokLyxPPS9ccyohaW1wb3J0YW50LztmdW5jdGlvbiBQKCl7dGhpcy5hPXt9fVAucHJvdG90eXBlLnNldD1mdW5jdGlvbihhLGIpe2E9YS50cmltKCk7dGhpcy5hW2FdPXtoOmIsaTp7fX19O1AucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXthPWEudHJpbSgpO3JldHVybiB0aGlzLmFbYV18fG51bGx9O3ZhciBRPW51bGw7ZnVuY3Rpb24gUigpe3RoaXMuYj10aGlzLmM9bnVsbDt0aGlzLmE9bmV3IFB9Ui5wcm90b3R5cGUubz1mdW5jdGlvbihhKXthPUgudGVzdChhKXx8Ry50ZXN0KGEpO0gubGFzdEluZGV4PTA7Ry5sYXN0SW5kZXg9MDtyZXR1cm4gYX07ClIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1hLl9nYXRoZXJlZFN0eWxlKXt2YXIgYz1bXTtmb3IodmFyIGU9YS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIiksZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj1lW2RdO2lmKGYuaGFzQXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIpKXtpZighbCl7dmFyIGc9Zi50ZXh0Q29udGVudDtJLmhhcyhnKXx8KEkuYWRkKGcpLGc9Zi5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZykpO2YucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmKX19ZWxzZSBjLnB1c2goZi50ZXh0Q29udGVudCksZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfShjPWMuam9pbigiIikudHJpbSgpKT8oZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGUudGV4dENvbnRlbnQ9YyxhLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGUsYS5jb250ZW50LmZpcnN0Q2hpbGQpLGM9ZSk6Yz1udWxsO2EuX2dhdGhlcmVkU3R5bGU9CmN9cmV0dXJuKGE9YS5fZ2F0aGVyZWRTdHlsZSk/dGhpcy5qKGEsYik6bnVsbH07Ui5wcm90b3R5cGUuaj1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8iIjpiO3ZhciBjPUsoYSk7dGhpcy5sKGMsYik7YS50ZXh0Q29udGVudD1KKGMpO3JldHVybiBjfTtSLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1LKGEpO0woYyxmdW5jdGlvbihhKXsiOnJvb3QiPT09YS5zZWxlY3RvciYmKGEuc2VsZWN0b3I9Imh0bWwiKTtiLmcoYSl9KTthLnRleHRDb250ZW50PUooYyk7cmV0dXJuIGN9O1IucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuYz1iO0woYSxmdW5jdGlvbihhKXtjLmcoYSl9KTt0aGlzLmM9bnVsbH07Ui5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthLmNzc1RleHQ9bmEodGhpcyxhLnBhcnNlZENzc1RleHQsYSk7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSI6aG9zdCA+ICoiKX07CmZ1bmN0aW9uIG5hKGEsYixjKXtiPWIucmVwbGFjZShHLGZ1bmN0aW9uKGIsZCxmLGcpe3JldHVybiBvYShhLGIsZCxmLGcsYyl9KTtyZXR1cm4gUyhhLGIsYyl9ZnVuY3Rpb24gcGEoYSxiKXtmb3IodmFyIGM9YjtjLnBhcmVudDspYz1jLnBhcmVudDt2YXIgZT17fSxkPSExO0woYyxmdW5jdGlvbihjKXsoZD1kfHxjPT09Yil8fGMuc2VsZWN0b3I9PT1iLnNlbGVjdG9yJiZPYmplY3QuYXNzaWduKGUsVChhLGMucGFyc2VkQ3NzVGV4dCkpfSk7cmV0dXJuIGV9CmZ1bmN0aW9uIFMoYSxiLGMpe2Zvcih2YXIgZTtlPUguZXhlYyhiKTspe3ZhciBkPWVbMF0sZj1lWzFdO2U9ZS5pbmRleDt2YXIgZz1iLnNsaWNlKDAsZStkLmluZGV4T2YoIkBhcHBseSIpKTtiPWIuc2xpY2UoZStkLmxlbmd0aCk7dmFyIGg9Yz9wYShhLGMpOnt9O09iamVjdC5hc3NpZ24oaCxUKGEsZykpO2Q9dm9pZCAwO3ZhciBrPWE7Zj1mLnJlcGxhY2UobGEsIiIpO3ZhciBuPVtdO3ZhciBtPWsuYS5nZXQoZik7bXx8KGsuYS5zZXQoZix7fSksbT1rLmEuZ2V0KGYpKTtpZihtKXtrLmMmJihtLmlbay5jXT0hMCk7dmFyIHE9bS5oO2ZvcihkIGluIHEpaz1oJiZoW2RdLG09W2QsIjogdmFyKCIsZiwiXy1fIixkXSxrJiZtLnB1c2goIiwiLGsucmVwbGFjZShPLCIiKSksbS5wdXNoKCIpIiksTy50ZXN0KHFbZF0pJiZtLnB1c2goIiAhaW1wb3J0YW50Iiksbi5wdXNoKG0uam9pbigiIikpfWQ9bi5qb2luKCI7ICIpO2I9ZytkK2I7SC5sYXN0SW5kZXg9ZStkLmxlbmd0aH1yZXR1cm4gYn0KZnVuY3Rpb24gVChhLGIsYyl7Yz12b2lkIDA9PT1jPyExOmM7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBlLGQsZj17fSxnPTAsaDtnPGIubGVuZ3RoO2crKylpZihlPWJbZ10paWYoaD1lLnNwbGl0KCI6IiksMTxoLmxlbmd0aCl7ZT1oWzBdLnRyaW0oKTtkPWguc2xpY2UoMSkuam9pbigiOiIpO2lmKGMpe3ZhciBrPWE7aD1lO3ZhciBuPW1hLmV4ZWMoZCk7biYmKG5bMV0/KGsuYnx8KGsuYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhIiksay5iLnNldEF0dHJpYnV0ZSgiYXBwbHktc2hpbS1tZWFzdXJlIiwiIiksay5iLnN0eWxlLmFsbD0iaW5pdGlhbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrLmIpKSxoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGsuYikuZ2V0UHJvcGVydHlWYWx1ZShoKSk6aD0iYXBwbHktc2hpbS1pbmhlcml0IixkPWgpfWZbZV09ZH1yZXR1cm4gZn1mdW5jdGlvbiBxYShhLGIpe2lmKFEpZm9yKHZhciBjIGluIGIuaSljIT09YS5jJiZRKGMpfQpmdW5jdGlvbiBvYShhLGIsYyxlLGQsZil7ZSYmTShlLGZ1bmN0aW9uKGIsYyl7YyYmYS5hLmdldChjKSYmKGQ9IkBhcHBseSAiK2MrIjsiKX0pO2lmKCFkKXJldHVybiBiO3ZhciBnPVMoYSwiIitkLGYpO2Y9Yi5zbGljZSgwLGIuaW5kZXhPZigiLS0iKSk7dmFyIGg9Zz1UKGEsZywhMCksaz1hLmEuZ2V0KGMpLG49ayYmay5oO24/aD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobiksZyk6YS5hLnNldChjLGgpO3ZhciBtPVtdLHEsWj0hMTtmb3IocSBpbiBoKXt2YXIgRj1nW3FdO3ZvaWQgMD09PUYmJihGPSJpbml0aWFsIik7IW58fHEgaW4gbnx8KFo9ITApO20ucHVzaChjKyJfLV8iK3ErIjogIitGKX1aJiZxYShhLGspO2smJihrLmg9aCk7ZSYmKGY9YisiOyIrZik7cmV0dXJuIGYrbS5qb2luKCI7ICIpKyI7In1SLnByb3RvdHlwZS5kZXRlY3RNaXhpbj1SLnByb3RvdHlwZS5vO1IucHJvdG90eXBlLnRyYW5zZm9ybVN0eWxlPVIucHJvdG90eXBlLmo7ClIucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlPVIucHJvdG90eXBlLmY7Ui5wcm90b3R5cGUudHJhbnNmb3JtUnVsZXM9Ui5wcm90b3R5cGUubDtSLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlPVIucHJvdG90eXBlLmc7Ui5wcm90b3R5cGUudHJhbnNmb3JtVGVtcGxhdGU9Ui5wcm90b3R5cGUubTtSLnByb3RvdHlwZS5fc2VwYXJhdG9yPSJfLV8iO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSLnByb3RvdHlwZSwiaW52YWxpZENhbGxiYWNrIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9LHNldDpmdW5jdGlvbihhKXtRPWF9fSk7dmFyIFU9e307dmFyIHJhPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIHNhKGEpe2lmKGE9VVthXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gdWEoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAscmEudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBWPW5ldyBSO2Z1bmN0aW9uIFcoKXt0aGlzLmE9bnVsbDtWLmludmFsaWRDYWxsYmFjaz1zYX1mdW5jdGlvbiBYKGEpeyFhLmEmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSYmKGEuYT13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UsYS5hLnRyYW5zZm9ybUNhbGxiYWNrPWZ1bmN0aW9uKGEpe1YuZihhKX0sYS5hLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXthLmEuZW5xdWV1ZWQmJmEuZmx1c2hDdXN0b21TdHlsZXMoKX0pfSl9Vy5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTsiIj09PU4oYSkmJihVW2JdPWEsYj1WLm0oYSxiKSxhLl9zdHlsZUFzdD1iKX07ClcucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzPWZ1bmN0aW9uKCl7WCh0aGlzKTtpZih0aGlzLmEpe3ZhciBhPXRoaXMuYS5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5hLmVucXVldWVkKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5hLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7YyYmVi5mKGMpfXRoaXMuYS5lbnF1ZXVlZD0hMX19fTsKVy5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTtpZihiKWZvcih2YXIgYyBpbiBiKW51bGw9PT1jP2Euc3R5bGUucmVtb3ZlUHJvcGVydHkoYyk6YS5zdHlsZS5zZXRQcm9wZXJ0eShjLGJbY10pO2lmKGEuc2hhZG93Um9vdClmb3IodGhpcy5zdHlsZUVsZW1lbnQoYSksYT1hLnNoYWRvd1Jvb3QuY2hpbGRyZW58fGEuc2hhZG93Um9vdC5jaGlsZE5vZGVzLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLnN0eWxlU3VidHJlZShhW2JdKTtlbHNlIGZvcihhPWEuY2hpbGRyZW58fGEuY2hpbGROb2RlcyxiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5zdHlsZVN1YnRyZWUoYVtiXSl9OwpXLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7WCh0aGlzKTt2YXIgYj1hLmxvY2FsTmFtZSxjO2I/LTE8Yi5pbmRleE9mKCItIik/Yz1iOmM9YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJpcyIpfHwiIjpjPWEuaXM7Yj1VW2NdO2lmKCEoYiYmIiIhPT1OKGIpfHwhYnx8dGEoYikpKXtpZih0YShiKXx8Yi5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb24hPT1iLl9hcHBseVNoaW1OZXh0VmVyc2lvbil0aGlzLnByZXBhcmVUZW1wbGF0ZShiLGMpLHVhKGIpO2lmKGE9YS5zaGFkb3dSb290KWlmKGE9YS5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpKWEuX19jc3NSdWxlcz1iLl9zdHlsZUFzdCxhLnRleHRDb250ZW50PUooYi5fc3R5bGVBc3QpfX07Vy5wcm90b3R5cGUuc3R5bGVEb2N1bWVudD1mdW5jdGlvbihhKXtYKHRoaXMpO3RoaXMuc3R5bGVTdWJ0cmVlKGRvY3VtZW50LmJvZHksYSl9OwppZighd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKXt2YXIgWT1uZXcgVyx2YT13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTt3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnByZXBhcmVUZW1wbGF0ZShhLGIpfSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oYSxiLGMpe3dpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUoYSxiLGMpfSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnN0eWxlU3VidHJlZShhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7WS5mbHVzaEN1c3RvbVN0eWxlcygpO1kuc3R5bGVFbGVtZW50KGEpfSxzdHlsZURvY3VtZW50OmZ1bmN0aW9uKGEpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTsKWS5zdHlsZURvY3VtZW50KGEpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9hLnRyaW0oKToiIn0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCl9LG5hdGl2ZUNzczp1LG5hdGl2ZVNoYWRvdzpsLGNzc0J1aWxkOnYsZGlzYWJsZVJ1bnRpbWU6YWF9O3ZhJiYod2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXZhKX13aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPVY7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IHVzZXJQb2x5bWVyID0gd2luZG93LlBvbHltZXI7CgogIC8qKgogICAqIEBuYW1lc3BhY2UgUG9seW1lcgogICAqIEBzdW1tYXJ5IFBvbHltZXIgaXMgYSBsaWdodHdlaWdodCBsaWJyYXJ5IGJ1aWx0IG9uIHRvcCBvZiB0aGUgd2ViCiAgICogICBzdGFuZGFyZHMtYmFzZWQgV2ViIENvbXBvbmVudHMgQVBJJ3MsIGFuZCBtYWtlcyBpdCBlYXN5IHRvIGJ1aWxkIHlvdXIKICAgKiAgIG93biBjdXN0b20gSFRNTCBlbGVtZW50cy4KICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBQcm90b3R5cGUgZm9yIHRoZSBjdXN0b20gZWxlbWVudC4gSXQgbXVzdCBjb250YWluCiAgICogICBhbiBgaXNgIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIGVsZW1lbnQgbmFtZS4gT3RoZXIgcHJvcGVydGllcyBwb3B1bGF0ZQogICAqICAgdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGUgYHByb3BlcnRpZXNgLCBgb2JzZXJ2ZXJzYCwgYGhvc3RBdHRyaWJ1dGVzYCwKICAgKiAgIGFuZCBgbGlzdGVuZXJzYCBwcm9wZXJ0aWVzIGFyZSBwcm9jZXNzZWQgdG8gY3JlYXRlIGVsZW1lbnQgZmVhdHVyZXMuCiAgICogQHJldHVybiB7IU9iamVjdH0gUmV0dXJucyBhIGN1c3RvbSBlbGVtZW50IGNsYXNzIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZWQKICAgKiAgIHByb3RvdHlwZSBgaW5mb2Agb2JqZWN0LiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpZiBnaXZlbiBieSBgaW5mby5pc2AuCiAgICovCiAgd2luZG93LlBvbHltZXIgPSBmdW5jdGlvbihpbmZvKSB7CiAgICByZXR1cm4gd2luZG93LlBvbHltZXIuX3BvbHltZXJGbihpbmZvKTsKICB9OwoKICAvLyBzdXBwb3J0IHVzZXIgc2V0dGluZ3Mgb24gdGhlIFBvbHltZXIgb2JqZWN0CiAgaWYgKHVzZXJQb2x5bWVyKSB7CiAgICBPYmplY3QuYXNzaWduKFBvbHltZXIsIHVzZXJQb2x5bWVyKTsKICB9CgogIC8vIFRvIGJlIHBsdWdnZWQgYnkgbGVnYWN5IGltcGxlbWVudGF0aW9uIGlmIGxvYWRlZAogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUHJvdG90eXBlIGZvciB0aGUgY3VzdG9tIGVsZW1lbnQuIEl0IG11c3QgY29udGFpbgogICAqICAgYW4gYGlzYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBlbGVtZW50IG5hbWUuIE90aGVyIHByb3BlcnRpZXMgcG9wdWxhdGUKICAgKiAgIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhlIGBwcm9wZXJ0aWVzYCwgYG9ic2VydmVyc2AsIGBob3N0QXR0cmlidXRlc2AsCiAgICogICBhbmQgYGxpc3RlbmVyc2AgcHJvcGVydGllcyBhcmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBlbGVtZW50IGZlYXR1cmVzLgogICAqIEByZXR1cm4geyFPYmplY3R9IFJldHVybnMgYSBjdXN0b20gZWxlbWVudCBjbGFzcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVkCiAgICogICBwcm90b3R5cGUgYGluZm9gIG9iamVjdC4gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaWYgZ2l2ZW4gYnkgYGluZm8uaXNgLgogICAqLwogIHdpbmRvdy5Qb2x5bWVyLl9wb2x5bWVyRm4gPSBmdW5jdGlvbihpbmZvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgIHRocm93IG5ldyBFcnJvcignTG9hZCBwb2x5bWVyLmh0bWwgdG8gdXNlIHRoZSBQb2x5bWVyKCkgZnVuY3Rpb24uJyk7CiAgfTsKICAvKiBlc2xpbnQtZW5hYmxlICovCgogIHdpbmRvdy5Qb2x5bWVyLnZlcnNpb24gPSAnMi43LjAnOwoKICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogIC8qCiAgV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzIHJlcGxhY2VkIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XQogIFdlIGNhbm5vdCBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWUgYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLgogICovCiAgd2luZG93LkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSBmdW5jdGlvbihwcm9wLCBvYmopIHsKICAgIHJldHVybiBwcm9wOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSAqLwoKfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IENTU19VUkxfUlggPSAvKHVybFwoKShbXildKikoXCkpL2c7CiAgICBsZXQgQUJTX1VSTCA9IC8oXlwvKXwoXiMpfCheW1x3LVxkXSo6KS87CiAgICBsZXQgd29ya2luZ1VSTDsKICAgIGxldCByZXNvbHZlRG9jOwogICAgLyoqCiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJMIGFnYWluc3QgdGhlIHByb3ZpZGVkIGBiYXNlVXJpJy4KICAgICAqIAogICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgKiB3aXRoIGAvYCAoYWJzb2x1dGUgVVJMcykgb3IgYCNgIChoYXNoIGlkZW50aWZpZXJzKS4gIEZvciBnZW5lcmFsIHB1cnBvc2UKICAgICAqIFVSTCByZXNvbHV0aW9uLCB1c2UgYHdpbmRvdy5VUkxgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHJlc29sdmUKICAgICAqIEBwYXJhbSB7P3N0cmluZz19IGJhc2VVUkkgQmFzZSBVUkkgdG8gcmVzb2x2ZSB0aGUgVVJMIGFnYWluc3QKICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmVzb2x2ZWQgVVJMCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVVcmwodXJsLCBiYXNlVVJJKSB7CiAgICAgIGlmICh1cmwgJiYgQUJTX1VSTC50ZXN0KHVybCkpIHsKICAgICAgICByZXR1cm4gdXJsOwogICAgICB9CiAgICAgIC8vIExhenkgZmVhdHVyZSBkZXRlY3Rpb24uCiAgICAgIGlmICh3b3JraW5nVVJMID09PSB1bmRlZmluZWQpIHsKICAgICAgICB3b3JraW5nVVJMID0gZmFsc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKCdiJywgJ2h0dHA6Ly9hJyk7CiAgICAgICAgICB1LnBhdGhuYW1lID0gJ2MlMjBkJzsKICAgICAgICAgIHdvcmtpbmdVUkwgPSAodS5ocmVmID09PSAnaHR0cDovL2EvYyUyMGQnKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAvLyBzaWxlbnRseSBmYWlsCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghYmFzZVVSSSkgewogICAgICAgIGJhc2VVUkkgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICB9CiAgICAgIGlmICh3b3JraW5nVVJMKSB7CiAgICAgICAgcmV0dXJuIChuZXcgVVJMKHVybCwgYmFzZVVSSSkpLmhyZWY7CiAgICAgIH0KICAgICAgLy8gRmFsbGJhY2sgdG8gY3JlYXRpbmcgYW4gYW5jaG9yIGludG8gYSBkaXNjb25uZWN0ZWQgZG9jdW1lbnQuCiAgICAgIGlmICghcmVzb2x2ZURvYykgewogICAgICAgIHJlc29sdmVEb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ3RlbXAnKTsKICAgICAgICByZXNvbHZlRG9jLmJhc2UgPSByZXNvbHZlRG9jLmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKTsKICAgICAgICByZXNvbHZlRG9jLmhlYWQuYXBwZW5kQ2hpbGQocmVzb2x2ZURvYy5iYXNlKTsKICAgICAgICByZXNvbHZlRG9jLmFuY2hvciA9IHJlc29sdmVEb2MuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgIHJlc29sdmVEb2MuYm9keS5hcHBlbmRDaGlsZChyZXNvbHZlRG9jLmFuY2hvcik7CiAgICAgIH0KICAgICAgcmVzb2x2ZURvYy5iYXNlLmhyZWYgPSBiYXNlVVJJOwogICAgICByZXNvbHZlRG9jLmFuY2hvci5ocmVmID0gdXJsOwogICAgICByZXR1cm4gcmVzb2x2ZURvYy5hbmNob3IuaHJlZiB8fCB1cmw7CgogICAgfQoKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYW55IHJlbGF0aXZlIFVSTCdzIGluIHRoZSBnaXZlbiBDU1MgdGV4dCBhZ2FpbnN0IHRoZSBwcm92aWRlZAogICAgICogYG93bmVyRG9jdW1lbnRgJ3MgYGJhc2VVUklgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0IENTUyB0ZXh0IHRvIHByb2Nlc3MKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFByb2Nlc3NlZCBDU1MgdGV4dCB3aXRoIHJlc29sdmVkIFVSTCdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICByZXR1cm4gY3NzVGV4dC5yZXBsYWNlKENTU19VUkxfUlgsIGZ1bmN0aW9uKG0sIHByZSwgdXJsLCBwb3N0KSB7CiAgICAgICAgcmV0dXJuIHByZSArICdcJycgKwogICAgICAgICAgcmVzb2x2ZVVybCh1cmwucmVwbGFjZSgvWyInXS9nLCAnJyksIGJhc2VVUkkpICsKICAgICAgICAgICdcJycgKyBwb3N0OwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBwYXRoIGZyb20gYSBnaXZlbiBgdXJsYC4gVGhlIHBhdGggaW5jbHVkZXMgdGhlIHRyYWlsaW5nCiAgICAgKiBgL2AgZnJvbSB0aGUgdXJsLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHRyYW5zZm9ybQogICAgICogQHJldHVybiB7c3RyaW5nfSByZXNvbHZlZCBwYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhdGhGcm9tVXJsKHVybCkgewogICAgICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgfQoKICAgIC8qKgogICAgICogTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgVVJMJ3MuCiAgICAgKgogICAgICogQG5hbWVzcGFjZQogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdW1tYXJ5IE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSTCdzLgogICAgICovCiAgICBQb2x5bWVyLlJlc29sdmVVcmwgPSB7CiAgICAgIHJlc29sdmVDc3M6IHJlc29sdmVDc3MsCiAgICAgIHJlc29sdmVVcmw6IHJlc29sdmVVcmwsCiAgICAgIHBhdGhGcm9tVXJsOiBwYXRoRnJvbVVybAogICAgfTsKCiAgfSkoKTsKCgoKLyoqIEBzdXBwcmVzcyB7ZGVwcmVjYXRlZH0gKi8KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsLCBsZWdhY3kgc2V0dGluZ3MuCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIFBvbHltZXIuU2V0dGluZ3MgPSBQb2x5bWVyLlNldHRpbmdzIHx8IHt9OwoKICBQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyA9ICEod2luZG93LlNoYWR5RE9NKTsKICBQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZUNTU1Byb3BlcnRpZXMgPQogICAgQm9vbGVhbighd2luZG93LlNoYWR5Q1NTIHx8IHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3MpOwogIFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlQ3VzdG9tRWxlbWVudHMgPQogICAgISh3aW5kb3cuY3VzdG9tRWxlbWVudHMucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayk7CgoKICAvKioKICAgKiBHbG9iYWxseSBzZXR0YWJsZSBwcm9wZXJ0eSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8KICAgKiBgUG9seW1lci5FbGVtZW50TWl4aW5gIGluc3RhbmNlcywgdXNlZnVsIGZvciBiaW5kaW5nIGluIHRlbXBsYXRlcyB0bwogICAqIG1ha2UgVVJMJ3MgcmVsYXRpdmUgdG8gYW4gYXBwbGljYXRpb24ncyByb290LiAgRGVmYXVsdHMgdG8gdGhlIG1haW4KICAgKiBkb2N1bWVudCBVUkwsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1c2Vycy4gIEl0IG1heSBiZSB1c2VmdWwgdG8gc2V0CiAgICogYFBvbHltZXIucm9vdFBhdGhgIHRvIHByb3ZpZGUgYSBzdGFibGUgYXBwbGljYXRpb24gbW91bnQgcGF0aCB3aGVuCiAgICogdXNpbmcgY2xpZW50IHNpZGUgcm91dGluZy4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5yb290UGF0aCA9IFBvbHltZXIucm9vdFBhdGggfHwKICAgIFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsIHJvb3RQYXRoIHByb3BlcnR5IHVzZWQgYnkgYFBvbHltZXIuRWxlbWVudE1peGluYCBhbmQKICAgKiBhdmFpbGFibGUgdmlhIGBQb2x5bWVyLnJvb3RQYXRoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIG5ldyByb290IHBhdGgKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuc2V0Um9vdFBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICBQb2x5bWVyLnJvb3RQYXRoID0gcGF0aDsKICB9OwoKICAvKioKICAgKiBBIGdsb2JhbCBjYWxsYmFjayB1c2VkIHRvIHNhbml0aXplIGFueSB2YWx1ZSBiZWZvcmUgaW5zZXJ0aW5nIGl0IGludG8gdGhlIERPTS4gVGhlIGNhbGxiYWNrIHNpZ25hdHVyZSBpczoKICAgKgogICAqICAgICBQb2x5bWVyID0gewogICAqICAgICAgIHNhbml0aXplRE9NVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBuYW1lLCB0eXBlLCBub2RlKSB7IC4uLiB9CiAgICogICAgIH0KICAgKgogICAqIFdoZXJlOgogICAqCiAgICogYHZhbHVlYCBpcyB0aGUgdmFsdWUgdG8gc2FuaXRpemUuCiAgICogYG5hbWVgIGlzIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBvciBwcm9wZXJ0eSAoZm9yIGV4YW1wbGUsIGhyZWYpLgogICAqIGB0eXBlYCBpbmRpY2F0ZXMgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkOiBvbmUgb2YgcHJvcGVydHksIGF0dHJpYnV0ZSwgb3IgdGV4dC4KICAgKiBgbm9kZWAgaXMgdGhlIG5vZGUgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkLgogICAqCiAgICogQHR5cGUgeyhmdW5jdGlvbigqLHN0cmluZyxzdHJpbmcsTm9kZSk6Kil8dW5kZWZpbmVkfQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlIHx8IG51bGw7CgogIC8qKgogICAqIFNldHMgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGF2YWlsYWJsZSB2aWEgYFBvbHltZXIuc2FuaXRpemVET01WYWx1ZWAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KGZ1bmN0aW9uKCosc3RyaW5nLHN0cmluZyxOb2RlKToqKXx1bmRlZmluZWR9IG5ld1Nhbml0aXplRE9NVmFsdWUgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGNhbGxiYWNrCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFNhbml0aXplRE9NVmFsdWUgPSBmdW5jdGlvbihuZXdTYW5pdGl6ZURPTVZhbHVlKSB7CiAgICBQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUgPSBuZXdTYW5pdGl6ZURPTVZhbHVlOwogIH07CgogIC8qKgogICAqIEdsb2JhbGx5IHNldHRhYmxlIHByb3BlcnR5IHRvIG1ha2UgUG9seW1lciBHZXN0dXJlcyB1c2UgcGFzc2l2ZSBUb3VjaEV2ZW50IGxpc3RlbmVycyB3aGVuIHJlY29nbml6aW5nIGdlc3R1cmVzLgogICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgZ2VzdHVyZXMgbWFkZSBmcm9tIHRvdWNoIHdpbGwgbm90IGJlIGFibGUgdG8gcHJldmVudCBzY3JvbGxpbmcsIGFsbG93aW5nIGZvciBzbW9vdGhlcgogICAqIHNjcm9sbGluZyBwZXJmb3JtYW5jZS4KICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IFBvbHltZXIucGFzc2l2ZVRvdWNoR2VzdHVyZXMgfHwgZmFsc2U7CgogIC8qKgogICAqIFNldHMgYHBhc3NpdmVUb3VjaEdlc3R1cmVzYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzIHVzaW5nIFBvbHltZXIgR2VzdHVyZXMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlUGFzc2l2ZSBlbmFibGUgb3IgZGlzYWJsZSBwYXNzaXZlIHRvdWNoIGdlc3R1cmVzIGdsb2JhbGx5CiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFBhc3NpdmVUb3VjaEdlc3R1cmVzID0gZnVuY3Rpb24odXNlUGFzc2l2ZSkgewogICAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IHVzZVBhc3NpdmU7CiAgfTsKCiAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zIHx8CiAgICAgIHdpbmRvdy5Qb2x5bWVyU2V0dGluZ3MgJiYgd2luZG93LlBvbHltZXJTZXR0aW5ncy5sZWdhY3lPcHRpbWl6YXRpb25zIHx8IGZhbHNlOwoKICAvKioKICAgKiBTZXRzIGBsZWdhY3lPcHRpbWl6YXRpb25zYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzLiBFbmFibGVzCiAgICogb3B0aW1pemF0aW9ucyB3aGVuIG9ubHkgbGVnYWN5IFBvbHltZXIoKSBzdHlsZSBlbGVtZW50cyBhcmUgdXNlZC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtib29sZWFufSB1c2VMZWdhY3lPcHRpbWl6YXRpb25zIGVuYWJsZSBvciBkaXNhYmxlIGxlZ2FjeSBvcHRpbWl6YXRpb25zIGdsb2JhbGx5LgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5zZXRMZWdhY3lPcHRpbWl6YXRpb25zID0gZnVuY3Rpb24odXNlTGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gdXNlTGVnYWN5T3B0aW1pemF0aW9uczsKICB9Owp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5pcXVlIGdsb2JhbCBpZCBmb3IgZGVkdXBpbmcgbWl4aW5zLgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtGdW5jdGlvbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIE1peGluRnVuY3Rpb24oKXt9CiAgLyoqIEB0eXBlIHsoV2Vha01hcCB8IHVuZGVmaW5lZCl9ICovCiAgTWl4aW5GdW5jdGlvbi5wcm90b3R5cGUuX19taXhpbkFwcGxpY2F0aW9uczsKICAvKiogQHR5cGUgeyhPYmplY3QgfCB1bmRlZmluZWQpfSAqLwogIE1peGluRnVuY3Rpb24ucHJvdG90eXBlLl9fbWl4aW5TZXQ7CgogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogV3JhcHMgYW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gc3VjaCB0aGF0IHRoZSBtaXhpbiBpcyBvbmx5IGFwcGxpZWQKICAgKiBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhcHBsaWVkIGl0cyBiYXNlIGFyZ3VtZW50LiBBbHNvIG1lbW9pemVzIG1peGluCiAgICogYXBwbGljYXRpb25zLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAdGVtcGxhdGUgVAogICAqIEBwYXJhbSB7VH0gbWl4aW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gdG8gd3JhcAogICAqIEByZXR1cm4ge1R9CiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgUG9seW1lci5kZWR1cGluZ01peGluID0gZnVuY3Rpb24obWl4aW4pIHsKICAgIGxldCBtaXhpbkFwcGxpY2F0aW9ucyA9IC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zOwogICAgaWYgKCFtaXhpbkFwcGxpY2F0aW9ucykgewogICAgICBtaXhpbkFwcGxpY2F0aW9ucyA9IG5ldyBXZWFrTWFwKCk7CiAgICAgIC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zID0gbWl4aW5BcHBsaWNhdGlvbnM7CiAgICB9CiAgICAvLyBtYWludGFpbiBhIHVuaXF1ZSBpZCBmb3IgZWFjaCBtaXhpbgogICAgbGV0IG1peGluRGVkdXBlSWQgPSBkZWR1cGVJZCsrOwogICAgZnVuY3Rpb24gZGVkdXBpbmdNaXhpbihiYXNlKSB7CiAgICAgIGxldCBiYXNlU2V0ID0gLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oYmFzZSkuX19taXhpblNldDsKICAgICAgaWYgKGJhc2VTZXQgJiYgYmFzZVNldFttaXhpbkRlZHVwZUlkXSkgewogICAgICAgIHJldHVybiBiYXNlOwogICAgICB9CiAgICAgIGxldCBtYXAgPSBtaXhpbkFwcGxpY2F0aW9uczsKICAgICAgbGV0IGV4dGVuZGVkID0gbWFwLmdldChiYXNlKTsKICAgICAgaWYgKCFleHRlbmRlZCkgewogICAgICAgIGV4dGVuZGVkID0gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovKG1peGluKShiYXNlKTsKICAgICAgICBtYXAuc2V0KGJhc2UsIGV4dGVuZGVkKTsKICAgICAgfQogICAgICAvLyBjb3B5IGluaGVyaXRlZCBtaXhpbiBzZXQgZnJvbSB0aGUgZXh0ZW5kZWQgY2xhc3MsIG9yIHRoZSBiYXNlIGNsYXNzCiAgICAgIC8vIE5PVEU6IHdlIGF2b2lkIHVzZSBvZiBTZXQgaGVyZSBiZWNhdXNlIHNvbWUgYnJvd3NlciAoSUUxMSkKICAgICAgLy8gY2Fubm90IGV4dGVuZCBhIGJhc2UgU2V0IHZpYSB0aGUgY29uc3RydWN0b3IuCiAgICAgIGxldCBtaXhpblNldCA9IE9iamVjdC5jcmVhdGUoLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oZXh0ZW5kZWQpLl9fbWl4aW5TZXQgfHwgYmFzZVNldCB8fCBudWxsKTsKICAgICAgbWl4aW5TZXRbbWl4aW5EZWR1cGVJZF0gPSB0cnVlOwogICAgICAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhleHRlbmRlZCkuX19taXhpblNldCA9IG1peGluU2V0OwogICAgICByZXR1cm4gZXh0ZW5kZWQ7CiAgICB9CgogICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGRlZHVwaW5nTWl4aW4pOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgTU9EVUxFX1NUWUxFX0xJTktfU0VMRUNUT1IgPSAnbGlua1tyZWw9aW1wb3J0XVt0eXBlfj1jc3NdJzsKICBjb25zdCBJTkNMVURFX0FUVFIgPSAnaW5jbHVkZSc7CiAgY29uc3QgU0hBRFlfVU5TQ09QRURfQVRUUiA9ICdzaGFkeS11bnNjb3BlZCc7CgogIGZ1bmN0aW9uIGltcG9ydE1vZHVsZShtb2R1bGVJZCkgewogICAgY29uc3QgLyoqIFBvbHltZXIuRG9tTW9kdWxlICovIFBvbHltZXJEb21Nb2R1bGUgPSBjdXN0b21FbGVtZW50cy5nZXQoJ2RvbS1tb2R1bGUnKTsKICAgIGlmICghUG9seW1lckRvbU1vZHVsZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBQb2x5bWVyRG9tTW9kdWxlLmltcG9ydChtb2R1bGVJZCk7CiAgfQoKICBmdW5jdGlvbiBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpIHsKICAgIC8vIE5PVEU6IHBvbHlmaWxsIGFmZm9yZGFuY2UuCiAgICAvLyB1bmRlciB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwsIHRoZXJlIHdpbGwgYmUgbm8gJ2JvZHknLAogICAgLy8gYnV0IHRoZSBpbXBvcnQgcHNldWRvLWRvYyBjYW4gYmUgdXNlZCBkaXJlY3RseS4KICAgIGxldCBjb250YWluZXIgPSBpbXBvcnREb2MuYm9keSA/IGltcG9ydERvYy5ib2R5IDogaW1wb3J0RG9jOwogICAgY29uc3QgaW1wb3J0Q3NzID0gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY29udGFpbmVyLnRleHRDb250ZW50LAogICAgICBpbXBvcnREb2MuYmFzZVVSSSk7CiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGltcG9ydENzczsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIC8qKiBAdHlwZWRlZiB7e2Fzc2V0cGF0aDogc3RyaW5nfX0gKi8KICBsZXQgdGVtcGxhdGVXaXRoQXNzZXRQYXRoOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29sbGVjdGlvbiBDU1MgdGV4dCBmcm9tIGA8dGVtcGxhdGVzPmAsIGV4dGVybmFsCiAgICogc3R5bGVzaGVldHMsIGFuZCBgZG9tLW1vZHVsZWBzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciBjb2xsZWN0aW9uIENTUyB0ZXh0IGZyb20gdmFyaW91cyBzb3VyY2VzLgogICAqLwogIGNvbnN0IFN0eWxlR2F0aGVyID0gewoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZHMgTGlzdCBvZiBkb20tbW9kdWxlIGlkJ3Mgd2l0aGluIHdoaWNoIHRvCiAgICAgKiBzZWFyY2ggZm9yIGNzcy4KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCA8c3R5bGU+IGVsZW1lbnRzCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlcyhtb2R1bGVJZHMpIHsKICAgICAgY29uc3QgbW9kdWxlcyA9IG1vZHVsZUlkcy50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICBjb25zdCBzdHlsZXMgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuc3R5bGVzRnJvbU1vZHVsZShtb2R1bGVzW2ldKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlczsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiA8c3R5bGU+IGVsZW1lbnRzIGluIGEgZ2l2ZW4gYGRvbS1tb2R1bGVgLgogICAgICogU3R5bGVzIGluIGEgYGRvbS1tb2R1bGVgIGNhbiBjb21lIGVpdGhlciBmcm9tIGA8c3R5bGU+YHMgd2l0aGluIHRoZQogICAgICogZmlyc3QgYDx0ZW1wbGF0ZT5gLCBvciBlbHNlIGZyb20gb25lIG9yIG1vcmUKICAgICAqIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIG91dHNpZGUgdGhlIHRlbXBsYXRlLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgZG9tLW1vZHVsZSBpZCB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIHN0eWxlc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgY29uc3QgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CgogICAgICBpZiAoIW0pIHsKICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmaW5kIHN0eWxlIGRhdGEgaW4gbW9kdWxlIG5hbWVkJywgbW9kdWxlSWQpOwogICAgICAgIHJldHVybiBbXTsKICAgICAgfQoKICAgICAgaWYgKG0uX3N0eWxlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3Qgc3R5bGVzID0gW107CiAgICAgICAgLy8gbW9kdWxlIGltcG9ydHM6IDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPgogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuX3N0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG0pKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgICBzdHlsZXMucHVzaCguLi50aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCkpOwogICAgICAgIH0KCiAgICAgICAgbS5fc3R5bGVzID0gc3R5bGVzOwogICAgICB9CgogICAgICByZXR1cm4gbS5fc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGA8c3R5bGU+YCBlbGVtZW50cyB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gZ2F0aGVyIHN0eWxlcyBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBiYXNlVVJJIGZvciBzdHlsZSBjb250ZW50CiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBzdHlsZXMKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKSB7CiAgICAgIGlmICghdGVtcGxhdGUuX3N0eWxlcykgewogICAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgICBjb25zdCBlJCA9IHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKTsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBlJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGUgPSBlJFtpXTsKICAgICAgICAgIC8vIHN1cHBvcnQgc3R5bGUgc2hhcmluZyBieSBhbGxvd2luZyBzdHlsZXMgdG8gImluY2x1ZGUiCiAgICAgICAgICAvLyBvdGhlciBkb20tbW9kdWxlcyB0aGF0IGNvbnRhaW4gc3R5bGluZwogICAgICAgICAgbGV0IGluY2x1ZGUgPSBlLmdldEF0dHJpYnV0ZShJTkNMVURFX0FUVFIpOwogICAgICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICAgICAgc3R5bGVzLnB1c2goLi4udGhpcy5zdHlsZXNGcm9tTW9kdWxlcyhpbmNsdWRlKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgaW5kZXgsIHNlbGYpIHsKICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbmRleE9mKGl0ZW0pID09PSBpbmRleDsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJhc2VVUkkpIHsKICAgICAgICAgICAgZS50ZXh0Q29udGVudCA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlQ3NzKGUudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGVzLnB1c2goZSk7CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlLl9zdHlsZXMgPSBzdHlsZXM7CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXBsYXRlLl9zdHlsZXM7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyAgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIElkIG9mIGBkb20tbW9kdWxlYCB0byBnYXRoZXIgQ1NTIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtb2R1bGVJZCkgewogICAgICBsZXQgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CiAgICAgIHJldHVybiBtID8gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobSkgOiBbXTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIHN0eWxlcwogICAgICovCiAgICBfc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKSB7CiAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICBjb25zdCBwJCA9IG1vZHVsZS5xdWVyeVNlbGVjdG9yQWxsKE1PRFVMRV9TVFlMRV9MSU5LX1NFTEVDVE9SKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcCQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgcCA9IHAkW2ldOwogICAgICAgIGlmIChwLmltcG9ydCkgewogICAgICAgICAgY29uc3QgaW1wb3J0RG9jID0gcC5pbXBvcnQ7CiAgICAgICAgICBjb25zdCB1bnNjb3BlZCA9IHAuaGFzQXR0cmlidXRlKFNIQURZX1VOU0NPUEVEX0FUVFIpOwogICAgICAgICAgaWYgKHVuc2NvcGVkICYmICFpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUpIHsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpOwogICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoU0hBRFlfVU5TQ09QRURfQVRUUiwgJycpOwogICAgICAgICAgICBpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUgPSBzdHlsZTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWltcG9ydERvYy5fc3R5bGUpIHsKICAgICAgICAgICAgaW1wb3J0RG9jLl9zdHlsZSA9IHN0eWxlRm9ySW1wb3J0KGltcG9ydERvYyk7CiAgICAgICAgICB9CiAgICAgICAgICBzdHlsZXMucHVzaCh1bnNjb3BlZCA/IGltcG9ydERvYy5fdW5zY29wZWRTdHlsZSA6IGltcG9ydERvYy5fc3R5bGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlc0Zyb21Nb2R1bGVzYCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkcyBMaXN0IG9mIGRvbS1tb2R1bGUgaWQncyB3aXRoaW4gd2hpY2ggdG8KICAgICAqIHNlYXJjaCBmb3IgY3NzLgogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgcwogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICAgY3NzRnJvbU1vZHVsZXMobW9kdWxlSWRzKSB7CiAgICAgIGxldCBtb2R1bGVzID0gbW9kdWxlSWRzLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgIGxldCBjc3NUZXh0ID0gJyc7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjc3NUZXh0ICs9IHRoaXMuY3NzRnJvbU1vZHVsZShtb2R1bGVzW2ldKTsKICAgICAgfQogICAgICByZXR1cm4gY3NzVGV4dDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIGdpdmVuIGBkb20tbW9kdWxlYC4gIENTUyBpbiBhIGBkb20tbW9kdWxlYAogICAgICogY2FuIGNvbWUgZWl0aGVyIGZyb20gYDxzdHlsZT5gcyB3aXRoaW4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCwgb3IgZWxzZQogICAgICogZnJvbSBvbmUgb3IgbW9yZSBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBsaW5rcyBvdXRzaWRlIHRoZQogICAgICogdGVtcGxhdGUuCiAgICAgKgogICAgICogQW55IGA8c3R5bGVzPmAgcHJvY2Vzc2VkIGFyZSByZW1vdmVkIGZyb20gdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24uCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlRnJvbU1vZHVsZWAgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCBkb20tbW9kdWxlIGlkIHRvIGdhdGhlciBzdHlsZXMgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgbGV0IG0gPSBpbXBvcnRNb2R1bGUobW9kdWxlSWQpOwogICAgICBpZiAobSAmJiBtLl9jc3NUZXh0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBtb2R1bGUgaW1wb3J0czogPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+CiAgICAgICAgbGV0IGNzc1RleHQgPSB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgbGV0IHQgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHQpIHsKICAgICAgICAgIGNzc1RleHQgKz0gdGhpcy5jc3NGcm9tVGVtcGxhdGUodCwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCk7CiAgICAgICAgfQogICAgICAgIG0uX2Nzc1RleHQgPSBjc3NUZXh0IHx8IG51bGw7CiAgICAgIH0KICAgICAgaWYgKCFtKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCcsIG1vZHVsZUlkKTsKICAgICAgfQogICAgICByZXR1cm4gbSAmJiBtLl9jc3NUZXh0IHx8ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgb2YgYDxzdHlsZXM+YCB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBBbnkgYDxzdHlsZXM+YCBwcm9jZXNzZWQgYXJlIHJlbW92ZWQgZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbi4KICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZSBgc3R5bGVGcm9tVGVtcGxhdGVgIGluc3RlYWQuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIHNwZWNpZmllZCB0ZW1wbGF0ZQogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICBjc3NGcm9tVGVtcGxhdGUodGVtcGxhdGUsIGJhc2VVUkkpIHsKICAgICAgbGV0IGNzc1RleHQgPSAnJzsKICAgICAgY29uc3QgZSQgPSB0aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgYmFzZVVSSSk7CiAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZSQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZSA9IGUkW2ldOwogICAgICAgIGlmIChlLnBhcmVudE5vZGUpIHsKICAgICAgICAgIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTsKICAgICAgICB9CiAgICAgICAgY3NzVGV4dCArPSBlLnRleHRDb250ZW50OwogICAgICB9CiAgICAgIHJldHVybiBjc3NUZXh0OwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gCiAgICAgKiBsaW5rcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBgZG9tLW1vZHVsZWAuCiAgICAgKgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0c2AgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgSWQgb2YgYGRvbS1tb2R1bGVgIHRvIGdhdGhlciBDU1MgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZUlkKSB7CiAgICAgIGxldCBtID0gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKTsKICAgICAgcmV0dXJuIG0gPyB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKSA6ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiB0aGUgZG9tLW1vZHVsZQogICAgICovCiAgICAgX2Nzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZSkgewogICAgICBsZXQgY3NzVGV4dCA9ICcnOwogICAgICBsZXQgc3R5bGVzID0gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY3NzVGV4dCArPSBzdHlsZXNbaV0udGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICB9CiAgfTsKCiAgUG9seW1lci5TdHlsZUdhdGhlciA9IFN0eWxlR2F0aGVyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBtb2R1bGVzID0ge307CiAgbGV0IGxjTW9kdWxlcyA9IHt9OwogIGZ1bmN0aW9uIHNldE1vZHVsZShpZCwgbW9kdWxlKSB7CiAgICAvLyBzdG9yZSBpZCBzZXBhcmF0ZSBmcm9tIGxvd2VyY2FzZWQgaWQgc28gdGhhdAogICAgLy8gaW4gYWxsIGNhc2VzIG1peGVkQ2FzZSBpZCB3aWxsIHN0b3JlZCBkaXN0aW5jdGx5CiAgICAvLyBhbmQgbG93ZXJjYXNlIHZlcnNpb24gaXMgYSBmYWxsYmFjawogICAgbW9kdWxlc1tpZF0gPSBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV0gPSBtb2R1bGU7CiAgfQogIGZ1bmN0aW9uIGZpbmRNb2R1bGUoaWQpIHsKICAgIHJldHVybiBtb2R1bGVzW2lkXSB8fCBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV07CiAgfQoKICBmdW5jdGlvbiBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKGluc3QpIHsKICAgIGlmIChpbnN0LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpIHsKICAgICAgY29uc29sZS53YXJuKCdkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlJywgaW5zdC5pZCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGUgYGRvbS1tb2R1bGVgIGVsZW1lbnQgcmVnaXN0ZXJzIHRoZSBkb20gaXQgY29udGFpbnMgdG8gdGhlIG5hbWUgZ2l2ZW4KICAgKiBieSB0aGUgbW9kdWxlJ3MgaWQgYXR0cmlidXRlLiBJdCBwcm92aWRlcyBhIHVuaWZpZWQgZGF0YWJhc2Ugb2YgZG9tCiAgICogYWNjZXNzaWJsZSB2aWEgaXRzIHN0YXRpYyBgaW1wb3J0YCBBUEkuCiAgICoKICAgKiBBIGtleSB1c2UgY2FzZSBvZiBgZG9tLW1vZHVsZWAgaXMgZm9yIHByb3ZpZGluZyBjdXN0b20gZWxlbWVudCBgPHRlbXBsYXRlPmBzCiAgICogdmlhIEhUTUwgaW1wb3J0cyB0aGF0IGFyZSBwYXJzZWQgYnkgdGhlIG5hdGl2ZSBIVE1MIHBhcnNlciwgdGhhdCBjYW4gYmUKICAgKiByZWxvY2F0ZWQgZHVyaW5nIGEgYnVuZGxpbmcgcGFzcyBhbmQgc3RpbGwgbG9va2VkIHVwIGJ5IGBpZGAuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIDxkb20tbW9kdWxlIGlkPSJmb28iPgogICAqICAgICAgIDxpbWcgc3JjPSJzdHVmZi5wbmciPgogICAqICAgICA8L2RvbS1tb2R1bGU+CiAgICoKICAgKiBUaGVuIGluIGNvZGUgaW4gc29tZSBvdGhlciBsb2NhdGlvbiB0aGF0IGNhbm5vdCBhY2Nlc3MgdGhlIGRvbS1tb2R1bGUgYWJvdmUKICAgKgogICAqICAgICBsZXQgaW1nID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdkb20tbW9kdWxlJykuaW1wb3J0KCdmb28nLCAnaW1nJyk7CiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IHByb3ZpZGVzIGEgcmVnaXN0cnkgb2YgcmVsb2NhdGFibGUgRE9NIGNvbnRlbnQKICAgKiAgIGJ5IGBpZGAgdGhhdCBpcyBhZ25vc3RpYyB0byBidW5kbGluZy4KICAgKiBAdW5yZXN0cmljdGVkCiAgICovCiAgY2xhc3MgRG9tTW9kdWxlIGV4dGVuZHMgSFRNTEVsZW1lbnQgewoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydpZCddOyB9CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBjc3MgYHNlbGVjdG9yYCBpbiB0aGUgbW9kdWxlCiAgICAgKiByZWdpc3RlcmVkIGJ5IGBpZGAuIEZvciBleGFtcGxlLCB0aGlzLmltcG9ydCgnZm9vJywgJ2ltZycpOwogICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgZG9tLW1vZHVsZSBpbiB3aGljaCB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yIFRoZSBjc3Mgc2VsZWN0b3IgYnkgd2hpY2ggdG8gZmluZCB0aGUgZWxlbWVudC4KICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IFJldHVybnMgdGhlIGVsZW1lbnQgd2hpY2ggbWF0Y2hlcyBgc2VsZWN0b3JgIGluIHRoZQogICAgICogbW9kdWxlIHJlZ2lzdGVyZWQgYXQgdGhlIHNwZWNpZmllZCBgaWRgLgogICAgICovCiAgICBzdGF0aWMgaW1wb3J0KGlkLCBzZWxlY3RvcikgewogICAgICBpZiAoaWQpIHsKICAgICAgICBsZXQgbSA9IGZpbmRNb2R1bGUoaWQpOwogICAgICAgIGlmIChtICYmIHNlbGVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gbS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBDdXJyZW50IHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgIGlmIChvbGQgIT09IHZhbHVlKSB7CiAgICAgICAgdGhpcy5yZWdpc3RlcigpOwogICAgICB9CiAgICB9CiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1hcmdzICovCgogICAgLyoqCiAgICAgKiBUaGUgYWJzb2x1dGUgVVJMIG9mIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiBvZiB0aGlzIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBUaGlzIHZhbHVlIHdpbGwgZGlmZmVyIGZyb20gdGhpcyBlbGVtZW50J3MgYG93bmVyRG9jdW1lbnRgIGluIHRoZQogICAgICogZm9sbG93aW5nIHdheXM6CiAgICAgKiAtIFRha2VzIGludG8gYWNjb3VudCBhbnkgYGFzc2V0cGF0aGAgYXR0cmlidXRlIGFkZGVkIGR1cmluZyBidW5kbGluZwogICAgICogICB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYWwgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGJ1bmRsZWQgbG9jYXRpb24KICAgICAqIC0gVXNlcyB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwncyBgaW1wb3J0Rm9yRWxlbWVudGAgQVBJIHRvIGVuc3VyZQogICAgICogICB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgaW1wb3J0IGRvY3VtZW50J3MgbG9jYXRpb24gc2luY2UKICAgICAqICAgYG93bmVyRG9jdW1lbnRgIGlzIG5vdCBjdXJyZW50bHkgcG9seWZpbGxlZAogICAgICovCiAgICBnZXQgYXNzZXRwYXRoKCkgewogICAgICAvLyBEb24ndCBvdmVycmlkZSBleGlzdGluZyBhc3NldHBhdGguCiAgICAgIGlmICghdGhpcy5fX2Fzc2V0cGF0aCkgewogICAgICAgIC8vIG5vdGU6IGFzc2V0cGF0aCBzZXQgdmlhIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoaXMKICAgICAgICAvLyBlbGVtZW50J3MgbG9jYXRpb247IGFjY29tb2RhdGUgcG9seWZpbGxlZCBIVE1MSW1wb3J0cwogICAgICAgIGNvbnN0IG93bmVyID0gd2luZG93LkhUTUxJbXBvcnRzICYmIEhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQgPwogICAgICAgICAgSFRNTEltcG9ydHMuaW1wb3J0Rm9yRWxlbWVudCh0aGlzKSB8fCBkb2N1bWVudCA6IHRoaXMub3duZXJEb2N1bWVudDsKICAgICAgICBjb25zdCB1cmwgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCgKICAgICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdhc3NldHBhdGgnKSB8fCAnJywgb3duZXIuYmFzZVVSSSk7CiAgICAgICAgdGhpcy5fX2Fzc2V0cGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybCh1cmwpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9fYXNzZXRwYXRoOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIHRoZSBkb20tbW9kdWxlIGF0IGEgZ2l2ZW4gaWQuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAogICAgICogd2hlbiBhIGRvbS1tb2R1bGUgaXMgaW1wZXJhdGl2ZWx5IGNyZWF0ZWQuIEZvcgogICAgICogZXhhbXBsZSwgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RvbS1tb2R1bGUnKS5yZWdpc3RlcignZm9vJylgLgogICAgICogQHBhcmFtIHtzdHJpbmc9fSBpZCBUaGUgaWQgYXQgd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGRvbS1tb2R1bGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZWdpc3RlcihpZCkgewogICAgICBpZCA9IGlkIHx8IHRoaXMuaWQ7CiAgICAgIGlmIChpZCkgewogICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCByZWplY3QgYW5kIG51bGwgb3V0IGFueSByZS1yZWdpc3RlcmVkCiAgICAgICAgLy8gZG9tLW1vZHVsZSBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMgd2hldGhlciBmaXJzdC1pbiBvciBsYXN0LWluIGlzIHRydXN0ZWQgCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgZmluZE1vZHVsZShpZCkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgc2V0TW9kdWxlKGlkLCBudWxsKTsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGRvbS1tb2R1bGUgJHtpZH0gcmUtcmVnaXN0ZXJlZGApOwogICAgICAgIH0KICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgc2V0TW9kdWxlKGlkLCB0aGlzKTsKICAgICAgICBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICBEb21Nb2R1bGUucHJvdG90eXBlWydtb2R1bGVzJ10gPSBtb2R1bGVzOwoKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ2RvbS1tb2R1bGUnLCBEb21Nb2R1bGUpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5Eb21Nb2R1bGUgPSBEb21Nb2R1bGU7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIHN0cnVjdHVyZWQgZGF0YSBwYXRoIHN0cmluZ3MuCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCBzdHJpbmdzLgogICAqLwogIGNvbnN0IFBhdGggPSB7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHN0cnVjdHVyZWQgZGF0YSBwYXRoIChoYXMgZG90cykuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc1BhdGgoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzUGF0aCgnZm9vJykgICAgICAgICAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBjb250YWluZWQgb25lIG9yIG1vcmUgZG90cwogICAgICovCiAgICBpc1BhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZignLicpID49IDA7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcm9vdCBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gcGF0aC4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLnJvb3QoJ2Zvby5iYXIuYmF6JykgLy8gJ2ZvbycKICAgICAqIFBvbHltZXIuUGF0aC5yb290KCdmb28nKSAgICAgICAgIC8vICdmb28nCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5QYXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZwogICAgICogQHJldHVybiB7c3RyaW5nfSBSb290IHByb3BlcnR5IG5hbWUKICAgICAqLwogICAgcm9vdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBsZXQgZG90SW5kZXggPSBwYXRoLmluZGV4T2YoJy4nKTsKICAgICAgaWYgKGRvdEluZGV4ID09PSAtMSkgewogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGRvdEluZGV4KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBHaXZlbiBgYmFzZWAgaXMgYGZvby5iYXJgLCBgZm9vYCBpcyBhbiBhbmNlc3RvciwgYGZvby5iYXJgIGlzIG5vdAogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwYXRoIGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBiYXNlIHBhdGguCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhcicpICAgICAvLyBmYWxzZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhci5iYXonKSAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgUGF0aCBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdC4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYHBhdGhgIGlzIGFuIGFuY2VzdG9yIG9mIGBiYXNlYC4KICAgICAqLwogICAgaXNBbmNlc3RvcjogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICAvLyAgICAgYmFzZS5zdGFydHNXaXRoKHBhdGggKyAnLicpOwogICAgICByZXR1cm4gYmFzZS5pbmRleE9mKHBhdGggKyAnLicpID09PSAwOwogICAgfSwKCiAgICAvKioKICAgICAqIEdpdmVuIGBiYXNlYCBpcyBgZm9vLmJhcmAsIGBmb28uYmFyLmJhemAgaXMgYW4gZGVzY2VuZGFudAogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28uYmFyJykgICAgIC8vIGZhbHNlCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nIHRvIHRlc3QuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBwYXRoYCBpcyBhIGRlc2NlbmRhbnQgb2YgYGJhc2VgLgogICAgICovCiAgICBpc0Rlc2NlbmRhbnQ6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsKICAgICAgLy8gICAgIHBhdGguc3RhcnRzV2l0aChiYXNlICsgJy4nKTsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZihiYXNlICsgJy4nKSA9PT0gMDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBhIHByZXZpb3VzIGJhc2UgcGF0aCB3aXRoIGEgbmV3IGJhc2UgcGF0aCwgcHJlc2VydmluZyB0aGUKICAgICAqIHJlbWFpbmRlciBvZiB0aGUgcGF0aC4KICAgICAqCiAgICAgKiBVc2VyIG11c3QgZW5zdXJlIGBwYXRoYCBoYXMgYSBwcmVmaXggb2YgYGJhc2VgLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGgudHJhbnNsYXRlKCdmb28uYmFyJywgJ3pvdCcsICdmb28uYmFyLmJheicpIC8vICd6b3QuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgQ3VycmVudCBiYXNlIHN0cmluZyB0byByZW1vdmUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdCYXNlIE5ldyBiYXNlIHN0cmluZyB0byByZXBsYWNlIHdpdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdHJhbnNsYXRlCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRyYW5zbGF0ZWQgc3RyaW5nCiAgICAgKi8KICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24oYmFzZSwgbmV3QmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gbmV3QmFzZSArIHBhdGguc2xpY2UoYmFzZS5sZW5ndGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdAogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgcGF0aGAgaXMgZXF1YWwgdG8gYGJhc2VgCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgbWF0Y2hlczogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gKGJhc2UgPT09IHBhdGgpIHx8CiAgICAgICAgICAgICB0aGlzLmlzQW5jZXN0b3IoYmFzZSwgcGF0aCkgfHwKICAgICAgICAgICAgIHRoaXMuaXNEZXNjZW5kYW50KGJhc2UsIHBhdGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGFycmF5LWJhc2VkIHBhdGhzIHRvIGZsYXR0ZW5lZCBwYXRoLiAgU3RyaW5nLWJhc2VkIHBhdGhzCiAgICAgKiBhcmUgcmV0dXJuZWQgYXMtaXMuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5ub3JtYWxpemUoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gJ2Zvby5iYXIuMC5iYXonCiAgICAgKiBQb2x5bWVyLlBhdGgubm9ybWFsaXplKCdmb28uYmFyLjAuYmF6JykgICAgICAgIC8vICdmb28uYmFyLjAuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7c3RyaW5nfSBGbGF0dGVuZWQgcGF0aAogICAgICovCiAgICBub3JtYWxpemU6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGFyZ3MgPSBwYXRoW2ldLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgICAgICAgIGZvciAobGV0IGo9MDsgajxhcmdzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHBhcnRzLnB1c2goYXJnc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBTcGxpdHMgYSBwYXRoIGludG8gYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuIEFjY2VwdHMgZWl0aGVyIGFycmF5cwogICAgICogb2YgcGF0aCBwYXJ0cyBvciBzdHJpbmdzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguc3BsaXQoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gWydmb28nLCAnYmFyJywgJzAnLCAnYmF6J10KICAgICAqIFBvbHltZXIuUGF0aC5zcGxpdCgnZm9vLmJhci4wLmJheicpICAgICAgICAvLyBbJ2ZvbycsICdiYXInLCAnMCcsICdiYXonXQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7IUFycmF5PHN0cmluZz59IEFycmF5IG9mIHBhdGggcGFydHMKICAgICAqIEB0aGlzIHtQYXRofQogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzfQogICAgICovCiAgICBzcGxpdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZShwYXRoKS5zcGxpdCgnLicpOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gYSBwYXRoLiAgSWYgYW55IHN1Yi1wcm9wZXJ0eSBpbiB0aGUgcGF0aCBpcyBgdW5kZWZpbmVkYCwKICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAgKHdpbGwgbmV2ZXIgdGhyb3cuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtPYmplY3R9IHJvb3QgT2JqZWN0IGZyb20gd2hpY2ggdG8gZGVyZWZlcmVuY2UgcGF0aCBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIHJlYWQKICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaW5mbyBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgdG8gYGluZm9gLCB0aGUgbm9ybWFsaXplZAogICAgICogIChmbGF0dGVuZWQpIHBhdGggd2lsbCBiZSBzZXQgdG8gYGluZm8ucGF0aGAuCiAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSBhdCBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcGF0aCBjb3VsZCBub3QgYmUKICAgICAqICBmdWxseSBkZXJlZmVyZW5jZWQuCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgZ2V0OiBmdW5jdGlvbihyb290LCBwYXRoLCBpbmZvKSB7CiAgICAgIGxldCBwcm9wID0gcm9vdDsKICAgICAgbGV0IHBhcnRzID0gdGhpcy5zcGxpdChwYXRoKTsKICAgICAgLy8gTG9vcCBvdmVyIHBhdGggcGFydHNbMC4ubi0xXSBhbmQgZGVyZWZlcmVuY2UKICAgICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKCFwcm9wKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBwYXJ0ID0gcGFydHNbaV07CiAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgIH0KICAgICAgaWYgKGluZm8pIHsKICAgICAgICBpbmZvLnBhdGggPSBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHByb3A7CiAgICB9LAoKICAgIC8qKgogICAgICogU2V0cyBhIHZhbHVlIHRvIGEgcGF0aC4gIElmIGFueSBzdWItcHJvcGVydHkgaW4gdGhlIHBhdGggaXMgYHVuZGVmaW5lZGAsCiAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIG5vLW9wLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290IE9iamVjdCBmcm9tIHdoaWNoIHRvIGRlcmVmZXJlbmNlIHBhdGggZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBzZXQKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IHRvIHBhdGgKICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQgcGF0aAogICAgICogQHRoaXMge1BhdGh9CiAgICAgKi8KICAgIHNldDogZnVuY3Rpb24ocm9vdCwgcGF0aCwgdmFsdWUpIHsKICAgICAgbGV0IHByb3AgPSByb290OwogICAgICBsZXQgcGFydHMgPSB0aGlzLnNwbGl0KHBhdGgpOwogICAgICBsZXQgbGFzdCA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTsKICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAvLyBMb29wIG92ZXIgcGF0aCBwYXJ0c1swLi5uLTJdIGFuZCBkZXJlZmVyZW5jZQogICAgICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGgtMTsgaSsrKSB7CiAgICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldOwogICAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgICAgICBpZiAoIXByb3ApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBTZXQgdmFsdWUgdG8gb2JqZWN0IGF0IGVuZCBvZiBwYXRoCiAgICAgICAgcHJvcFtsYXN0XSA9IHZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNpbXBsZSBwcm9wZXJ0eSBzZXQKICAgICAgICBwcm9wW3BhdGhdID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJy4nKTsKICAgIH0KCiAgfTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCAoaGFzIGRvdHMpLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiAgVXNlIGBQb2x5bWVyLlBhdGguaXNQYXRoYCBpbnN0ZWFkLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYAogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgKiBgYGAKICAgKgogICAqIEBkZXByZWNhdGVkCiAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5lZCBvbmUgb3IgbW9yZSBkb3RzCiAgICovCiAgUGF0aC5pc0RlZXAgPSBQYXRoLmlzUGF0aDsKCiAgUG9seW1lci5QYXRoID0gUGF0aDsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgY2FzZU1hcCA9IHt9OwogIGNvbnN0IERBU0hfVE9fQ0FNRUwgPSAvLVthLXpdL2c7CiAgY29uc3QgQ0FNRUxfVE9fREFTSCA9IC8oW0EtWl0pL2c7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29udmVydGluZyBiZXR3ZWVuICJkYXNoLWNhc2UiIGFuZCAiY2FtZWxDYXNlIgogICAqIGlkZW50aWZpZXJzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHRoYXQgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gImRhc2gtY2FzZSIKICAgKiAgIGFuZCAiY2FtZWxDYXNlIi4KICAgKi8KICBjb25zdCBDYXNlTWFwID0gewoKICAgIC8qKgogICAgICogQ29udmVydHMgImRhc2gtY2FzZSIgaWRlbnRpZmllciAoZS5nLiBgZm9vLWJhci1iYXpgKSB0byAiY2FtZWxDYXNlIgogICAgICogKGUuZy4gYGZvb0JhckJhemApLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkNhc2VNYXAKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXNoIERhc2gtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENhbWVsLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlkZW50aWZpZXIKICAgICAqLwogICAgZGFzaFRvQ2FtZWxDYXNlKGRhc2gpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbZGFzaF0gfHwgKAogICAgICAgIGNhc2VNYXBbZGFzaF0gPSBkYXNoLmluZGV4T2YoJy0nKSA8IDAgPyBkYXNoIDogZGFzaC5yZXBsYWNlKERBU0hfVE9fQ0FNRUwsCiAgICAgICAgICAobSkgPT4gbVsxXS50b1VwcGVyQ2FzZSgpCiAgICAgICAgKQogICAgICApOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzICJjYW1lbENhc2UiIGlkZW50aWZpZXIgKGUuZy4gYGZvb0JhckJhemApIHRvICJkYXNoLWNhc2UiCiAgICAgKiAoZS5nLiBgZm9vLWJhci1iYXpgKS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5DYXNlTWFwCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FtZWwgQ2FtZWwtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IERhc2gtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWRlbnRpZmllcgogICAgICovCiAgICBjYW1lbFRvRGFzaENhc2UoY2FtZWwpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbY2FtZWxdIHx8ICgKICAgICAgICBjYXNlTWFwW2NhbWVsXSA9IGNhbWVsLnJlcGxhY2UoQ0FNRUxfVE9fREFTSCwgJy0kMScpLnRvTG93ZXJDYXNlKCkKICAgICAgKTsKICAgIH0KCiAgfTsKCiAgUG9seW1lci5DYXNlTWFwID0gQ2FzZU1hcDsKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gTWljcm90YXNrIGltcGxlbWVudGVkIHVzaW5nIE11dGF0aW9uIE9ic2VydmVyCiAgbGV0IG1pY3JvdGFza0N1cnJIYW5kbGUgPSAwOwogIGxldCBtaWNyb3Rhc2tMYXN0SGFuZGxlID0gMDsKICBsZXQgbWljcm90YXNrQ2FsbGJhY2tzID0gW107CiAgbGV0IG1pY3JvdGFza05vZGVDb250ZW50ID0gMDsKICBsZXQgbWljcm90YXNrTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICBuZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIobWljcm90YXNrRmx1c2gpLm9ic2VydmUobWljcm90YXNrTm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsKCiAgZnVuY3Rpb24gbWljcm90YXNrRmx1c2goKSB7CiAgICBjb25zdCBsZW4gPSBtaWNyb3Rhc2tDYWxsYmFja3MubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBsZXQgY2IgPSBtaWNyb3Rhc2tDYWxsYmFja3NbaV07CiAgICAgIGlmIChjYikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYigpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlOyB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1pY3JvdGFza0NhbGxiYWNrcy5zcGxpY2UoMCwgbGVuKTsKICAgIG1pY3JvdGFza0xhc3RIYW5kbGUgKz0gbGVuOwogIH0KCiAgLyoqCiAgICogTW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc3RyYXRlZ2llcyBmb3IgZW5xdWV1aW5nIGFzeW5jaHJvbm91cwogICAqIHRhc2tzLiAgRWFjaCBzdWItbW9kdWxlIHByb3ZpZGVzIGEgc3RhbmRhcmQgYHJ1bihmbilgIGludGVyZmFjZSB0aGF0IHJldHVybnMgYQogICAqIGhhbmRsZSwgYW5kIGEgYGNhbmNlbChoYW5kbGUpYCBpbnRlcmZhY2UgZm9yIGNhbmNlbGluZyBhc3luYyB0YXNrcyBiZWZvcmUKICAgKiB0aGV5IHJ1bi4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSB0aGF0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0cmF0ZWdpZXMgZm9yIGVucXVldWluZyBhc3luY2hyb25vdXMKICAgKiB0YXNrcy4KICAgKi8KICBQb2x5bWVyLkFzeW5jID0gewoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqLwogICAgdGltZU91dDogewogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIHN1Yi1tb2R1bGUgd2l0aCB0aGUgYXN5bmMgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgcHJvdmlkZWQKICAgICAgICogZGVsYXkuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLnRpbWVPdXQKICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgY2FsbGJhY2tzIGluIG1zCiAgICAgICAqIEByZXR1cm4geyFBc3luY0ludGVyZmFjZX0gQW4gYXN5bmMgdGltZW91dCBpbnRlcmZhY2UKICAgICAgICovCiAgICAgIGFmdGVyKGRlbGF5KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJ1bihmbikgeyByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsgfSwKICAgICAgICAgIGNhbmNlbChoYW5kbGUpIHsKICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyBhIGZ1bmN0aW9uIGNhbGxlZCBpbiB0aGUgbmV4dCB0YXNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy50aW1lT3V0CiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBmbiBDYWxsYmFjayB0byBydW4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBEZWxheSBpbiBtaWxsaXNlY29uZHMKICAgICAgICogQHJldHVybiB7bnVtYmVyfSBIYW5kbGUgdXNlZCBmb3IgY2FuY2VsaW5nIHRhc2sKICAgICAgICovCiAgICAgIHJ1bihmbiwgZGVsYXkpIHsKICAgICAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGVucXVldWVkIGB0aW1lT3V0YCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMudGltZU91dAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICovCiAgICBhbmltYXRpb25GcmFtZTogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgdGltaW5nLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6dm9pZH0gZm4gQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oZm4pIHsKICAgICAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgYW5pbWF0aW9uRnJhbWVgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4gIEZhbGxzIGJhY2sgdG8KICAgICAqIGBzZXRUaW1lb3V0YCBvbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqLwogICAgaWRsZVBlcmlvZDogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMuaWRsZVBlcmlvZAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFJZGxlRGVhZGxpbmUpOnZvaWR9IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrID8KICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuKSA6CiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmbiwgMTYpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYGlkbGVQZXJpb2RgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5pZGxlUGVyaW9kCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgd2luZG93LmNhbmNlbElkbGVDYWxsYmFjayA/CiAgICAgICAgICB3aW5kb3cuY2FuY2VsSWRsZUNhbGxiYWNrKGhhbmRsZSkgOgogICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIGZvciBlbnF1ZXVpbmcgY2FsbGJhY2tzIHRoYXQgcnVuIGF0IG1pY3JvdGFzayB0aW1pbmcuCiAgICAgKgogICAgICogTm90ZSB0aGF0IG1pY3JvdGFzayB0aW1pbmcgaXMgYWNoaWV2ZWQgdmlhIGEgc2luZ2xlIGBNdXRhdGlvbk9ic2VydmVyYCwKICAgICAqIGFuZCB0aHVzIGNhbGxiYWNrcyBlbnF1ZXVlZCB3aXRoIHRoaXMgQVBJIHdpbGwgYWxsIHJ1biBpbiBhIHNpbmdsZQogICAgICogYmF0Y2gsIGFuZCBub3QgaW50ZXJsZWF2ZWQgd2l0aCBvdGhlciBtaWNyb3Rhc2tzIHN1Y2ggYXMgcHJvbWlzZXMuCiAgICAgKiBQcm9taXNlcyBhcmUgYXZvaWRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBjaG9pY2UgZm9yIHRoZSB0aW1lIGJlaW5nCiAgICAgKiBkdWUgdG8gU2FmYXJpIGJ1Z3MgdGhhdCBjYXVzZSBQcm9taXNlcyB0byBsYWNrIG1pY3JvdGFzayBndWFyYW50ZWVzLgogICAgICoKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jCiAgICAgKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2UgZm9yIGVucXVldWluZyBjYWxsYmFja3MgdGhhdCBydW4gYXQgbWljcm90YXNrCiAgICAgKiAgIHRpbWluZy4KICAgICAqLwogICAgbWljcm9UYXNrOiB7CgogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgbWljcm90YXNrIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9uPX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oY2FsbGJhY2spIHsKICAgICAgICBtaWNyb3Rhc2tOb2RlLnRleHRDb250ZW50ID0gbWljcm90YXNrTm9kZUNvbnRlbnQrKzsKICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIG1pY3JvdGFza0N1cnJIYW5kbGUrKzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgbWljcm9UYXNrYCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgY29uc3QgaWR4ID0gaGFuZGxlIC0gbWljcm90YXNrTGFzdEhhbmRsZTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgIGlmICghbWljcm90YXNrQ2FsbGJhY2tzW2lkeF0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFzeW5jIGhhbmRsZTogJyArIGhhbmRsZSk7CiAgICAgICAgICB9CiAgICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3NbaWR4XSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgfQogIH07Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uICgpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqIEBjb25zdCB7IUFzeW5jSW50ZXJmYWNlfSAqLwogICAgY29uc3QgbWljcm90YXNrID0gUG9seW1lci5Bc3luYy5taWNyb1Rhc2s7CgogICAgLyoqCiAgICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgbWV0YS1wcm9ncmFtbWluZyBmb3IgY3JlYXRpbmcgb25lCiAgICAgKiBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycyAoZ2V0dGVyL3NldHRlciBwYWlyKSB0aGF0IGVucXVldWUgYW4gYXN5bmMKICAgICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAqCiAgICAgKiBGb3IgYmFzaWMgdXNhZ2Ugb2YgdGhpcyBtaXhpbiwgY2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzKHByb3BzKWAKICAgICAqIG9uY2UgYXQgY2xhc3MgZGVmaW5pdGlvbiB0aW1lIHRvIGNyZWF0ZSBwcm9wZXJ0eSBhY2Nlc3NvcnMgZm9yIHByb3BlcnRpZXMKICAgICAqIG5hbWVkIGluIHByb3BzLCBpbXBsZW1lbnQgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgdG8gcmVhY3QgYXMgZGVzaXJlZCB0bwogICAgICogcHJvcGVydHkgY2hhbmdlcywgYW5kIGltcGxlbWVudCBgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKWAgYW5kCiAgICAgKiBpbmNsdWRlIGxvd2VyY2FzZSB2ZXJzaW9ucyBvZiBhbnkgcHJvcGVydHkgbmFtZXMgdGhhdCBzaG91bGQgYmUgc2V0IGZyb20KICAgICAqIGF0dHJpYnV0ZXMuIExhc3QsIGNhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncwogICAgICogYGNvbm5lY3RlZENhbGxiYWNrYCB0byBlbmFibGUgdGhlIGFjY2Vzc29ycy4KICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIGZvciByZWFjdGluZyB0byBwcm9wZXJ0eSBjaGFuZ2VzIGZyb20KICAgICAqICAgZ2VuZXJhdGVkIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAqLwogICAgUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAgIC8qKgogICAgICAgKiBAcG9seW1lcgogICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAgKiBAZXh0ZW5kcyB7c3VwZXJDbGFzc30KICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAgICovCiAgICAgIGNsYXNzIFByb3BlcnRpZXNDaGFuZ2VkIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgcHJvcGVydHkgYWNjZXNzb3JzIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBwcm9wcyBPYmplY3Qgd2hvc2Uga2V5cyBhcmUgbmFtZXMgb2YgYWNjZXNzb3JzLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcykgewogICAgICAgICAgICAvLyBkb24ndCBzdG9tcCBhbiBleGlzdGluZyBhY2Nlc3NvcgogICAgICAgICAgICBpZiAoIShwcm9wIGluIHByb3RvKSkgewogICAgICAgICAgICAgIHByb3RvLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyB0aGUgbG93ZXJjYXNlZCBwcm9wZXJ0eSBuYW1lLiBPdmVycmlkZSB0bwogICAgICAgICAqIGN1c3RvbWl6ZSB0aGlzIG1hcHBpbmcuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRvIGNvbnZlcnQKICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBhdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGUgcG9pbnQgdG8gcHJvdmlkZSBhIHR5cGUgdG8gd2hpY2ggdG8gZGVzZXJpYWxpemUgYSB2YWx1ZSB0bwogICAgICAgICAqIGEgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyB0eXBlRm9yUHJvcGVydHkobmFtZSkgeyB9IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2V0dGVyL2dldHRlciBwYWlyIGZvciB0aGUgbmFtZWQgcHJvcGVydHkgd2l0aCBpdHMgb3duCiAgICAgICAgICogbG9jYWwgc3RvcmFnZS4gIFRoZSBnZXR0ZXIgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGxvY2FsIHN0b3JhZ2UsCiAgICAgICAgICogYW5kIHRoZSBzZXR0ZXIgY2FsbHMgYF9zZXRQcm9wZXJ0eWAsIHdoaWNoIHVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UKICAgICAgICAgKiBmb3IgdGhlIHByb3BlcnR5IGFuZCBlbnF1ZXVlcyBhIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBvbiBhIHByb3RvdHlwZSBvciBhbiBpbnN0YW5jZS4gIENhbGxpbmcKICAgICAgICAgKiB0aGlzIG1ldGhvZCBtYXkgb3ZlcndyaXRlIGEgcHJvcGVydHkgdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbgogICAgICAgICAqIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgYnkgY3JlYXRpbmcgdGhlIGFjY2Vzc29yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZDsgdGhlCiAgICAgICAgICogICBwcm90ZWN0ZWQgYF9zZXRQcm9wZXJ0eWAgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIHNldCB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpOwogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFIYXNBY2Nlc3NvcicpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0pIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0gPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIHRoZSBnaXZlbiBgcHJvcGVydHlgIHRvIGEgbWFwIG1hdGNoaW5nIGF0dHJpYnV0ZSBuYW1lcwogICAgICAgICAqIHRvIHByb3BlcnR5IG5hbWVzLCB1c2luZyBgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5YC4gVGhpcyBtYXAgaXMKICAgICAgICAgKiB1c2VkIHdoZW4gZGVzZXJpYWxpemluZyBhdHRyaWJ1dGUgdmFsdWVzIHRvIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKi8KICAgICAgICBfYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChwcm9wZXJ0eSkgewogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFBdHRyaWJ1dGVzJykpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW3Byb3BlcnR5XSkgewogICAgICAgICAgICBjb25zdCBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgICAgICB0aGlzLl9fZGF0YUF0dHJpYnV0ZXNbYXR0cl0gPSBwcm9wZXJ0eTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmluZXMgYSBwcm9wZXJ0eSBhY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlYWRPbmx5IFdoZW4gdHJ1ZSwgbm8gc2V0dGVyIGlzIGNyZWF0ZWQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgICBfZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwgewogICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICAgICAgICAvKiogQHRoaXMge1Byb3BlcnRpZXNDaGFuZ2VkfSAqLwogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoqIEB0aGlzIHtQcm9wZXJ0aWVzQ2hhbmdlZH0gKi8KICAgICAgICAgICAgc2V0OiByZWFkT25seSA/IGZ1bmN0aW9uICgpIHt9IDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgIHRoaXMuX19kYXRhRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7CiAgICAgICAgICB0aGlzLl9fZGF0YSA9IHt9OwogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gcHJvcGVydGllcyBhcmUgZW5hYmxlZCB2aWEKICAgICAgICAgKiBgX2VuYWJsZVByb3BlcnRpZXNgLgogICAgICAgICAqCiAgICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50IGJlaGF2aW9yIHRoYXQgaXMKICAgICAgICAgKiBkZXBlbmRlbnQgb24gdGhlIGVsZW1lbnQgaGF2aW5nIGl0cyBwcm9wZXJ0eSBkYXRhIGluaXRpYWxpemVkLCBlLmcuCiAgICAgICAgICogZnJvbSBkZWZhdWx0cyAoaW5pdGlhbGl6ZWQgZnJvbSBgY29uc3RydWN0b3JgLCBgX2luaXRpYWxpemVQcm9wZXJ0aWVzYCksCiAgICAgICAgICogYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AsIG9yIHZhbHVlcyBwcm9wYWdhdGVkIGZyb20gaG9zdCBlLmcuIHZpYQogICAgICAgICAqIGJpbmRpbmdzLiAgYHN1cGVyLnJlYWR5KClgIG11c3QgYmUgY2FsbGVkIHRvIGVuc3VyZSB0aGUgZGF0YSBzeXN0ZW0KICAgICAgICAgKiBiZWNvbWVzIGVuYWJsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSB0cnVlOwogICAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsaXplcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgICAqCiAgICAgICAgICogUHJvdmlkZWQgYXMgYW4gb3ZlcnJpZGUgcG9pbnQgZm9yIHBlcmZvcm1pbmcgYW55IHNldHVwIHdvcmsgcHJpb3IKICAgICAgICAgKiB0byBpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5IGFjY2Vzc29yIHN5c3RlbS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgIC8vIENhcHR1cmUgaW5zdGFuY2UgcHJvcGVydGllczsgdGhlc2Ugd2lsbCBiZSBzZXQgaW50byBhY2Nlc3NvcnMKICAgICAgICAgIC8vIGR1cmluZyBmaXJzdCBmbHVzaC4gRG9uJ3Qgc2V0IHRoZW0gaGVyZSwgc2luY2Ugd2Ugd2FudAogICAgICAgICAgLy8gdGhlc2UgdG8gb3ZlcndyaXRlIGRlZmF1bHRzL2NvbnN0cnVjdG9yIGFzc2lnbm1lbnRzCiAgICAgICAgICBmb3IgKGxldCBwIGluIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgfHwge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzW3BdID0gdGhpc1twXTsKICAgICAgICAgICAgICBkZWxldGUgdGhpc1twXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIGF0IHJlYWR5IHRpbWUgd2l0aCBiYWcgb2YgaW5zdGFuY2UgcHJvcGVydGllcyB0aGF0IG92ZXJ3cm90ZQogICAgICAgICAqIGFjY2Vzc29ycyB3aGVuIHRoZSBlbGVtZW50IHVwZ3JhZGVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICAgKiBzZXR0ZXIgYXQgcmVhZHkgdGltZS4gIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlCiAgICAgICAgICogcG9pbnQgZm9yIGN1c3RvbWl6aW5nIG9yIHByb3ZpZGluZyBtb3JlIGVmZmljaWVudCBpbml0aWFsaXphdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgcHJvcGVydHkgdmFsdWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbgogICAgICAgICAqICAgd2hlbiBjcmVhdGluZyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcHMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgYSBwcm9wZXJ0eSAodmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YCkKICAgICAgICAgKiBhbmQgZW5xdWV1ZXMgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpKSB7CiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICAgICAgICogQHJldHVybiB7Kn0gVmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgfQoKICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHksIHJlY29yZHMgdGhlIHByZXZpb3VzIHZhbHVlLAogICAgICAgICAqIGFuZCBhZGRzIGl0IHRvIHRoZSBzZXQgb2YgInBlbmRpbmcgY2hhbmdlcyIgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4gIFRoaXMgbWV0aG9kIGRvZXMgbm90IGVucXVldWUgdGhlCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGV4dCBOb3QgdXNlZCBoZXJlOyBhZmZvcmRhbmNlIGZvciBjbG9zdXJlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlLCBleHQpIHsKICAgICAgICAgIGxldCBvbGQgPSB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKTsKICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFQZW5kaW5nKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0ge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFbnN1cmUgb2xkIGlzIGNhcHR1cmVkIGZyb20gdGhlIGxhc3QgdHVybgogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFPbGQgJiYgIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YU9sZFtwcm9wZXJ0eV0gPSBvbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgICAgIH0KICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCgogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBwcm9wZXJ0aWVzIGFzIGludmFsaWQsIGFuZCBlbnF1ZXVlcyBhbiBhc3luYwogICAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUludmFsaWQgJiYgdGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSB0cnVlOwogICAgICAgICAgICBtaWNyb3Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnZhbGlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsIHRvIGVuYWJsZSBwcm9wZXJ0eSBhY2Nlc3NvciBwcm9jZXNzaW5nLiBCZWZvcmUgdGhpcyBtZXRob2QgaXMKICAgICAgICAgKiBjYWxsZWQgYWNjZXNzb3IgdmFsdWVzIHdpbGwgYmUgc2V0IGJ1dCBzaWRlIGVmZmVjdHMgYXJlCiAgICAgICAgICogcXVldWVkLiBXaGVuIGNhbGxlZCwgYW55IHBlbmRpbmcgc2lkZSBlZmZlY3RzIG9jY3VyIGltbWVkaWF0ZWx5LgogICAgICAgICAqIEZvciBlbGVtZW50cywgZ2VuZXJhbGx5IGBjb25uZWN0ZWRDYWxsYmFja2AgaXMgYSBub3JtYWwgc3BvdCB0byBkbyBzby4KICAgICAgICAgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seSB0dXJucyBvbgogICAgICAgICAqIHByb3BlcnR5IGFjY2Vzc29ycyBvbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2VuYWJsZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhRW5hYmxlZCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKSB7CiAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyh0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMpOwogICAgICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZWFkeSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbHMgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mCiAgICAgICAgICogcGVuZGluZyBjaGFuZ2VzIChhbmQgb2xkIHZhbHVlcyByZWNvcmRlZCB3aGVuIHBlbmRpbmcgY2hhbmdlcyB3ZXJlCiAgICAgICAgICogc2V0KSwgYW5kIHJlc2V0cyB0aGUgcGVuZGluZyBzZXQgb2YgY2hhbmdlcy4gR2VuZXJhbGx5LCB0aGlzIG1ldGhvZAogICAgICAgICAqIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHVzZXIgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuX19kYXRhOwogICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BzID0gdGhpcy5fX2RhdGFQZW5kaW5nOwogICAgICAgICAgY29uc3Qgb2xkID0gdGhpcy5fX2RhdGFPbGQ7CiAgICAgICAgICBpZiAodGhpcy5fc2hvdWxkUHJvcGVydGllc0NoYW5nZShwcm9wcywgY2hhbmdlZFByb3BzLCBvbGQpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBpbiBgX2ZsdXNoUHJvcGVydGllc2AgdG8gZGV0ZXJtaW5lIGlmIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogc2hvdWxkIGJlIGNhbGxlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmCiAgICAgICAgICogcHJvcGVydGllcyBhcmUgcGVuZGluZy4gT3ZlcnJpZGUgdG8gY3VzdG9taXplIHdoZW4KICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBpcyBjYWxsZWQuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50UHJvcHMgQmFnIG9mIGFsbCBjdXJyZW50IGFjY2Vzc29yIHZhbHVlcwogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICAgKiAgIGNhbGwgdG8gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBjaGFuZ2VkUHJvcHMgaXMgdHJ1dGh5CiAgICAgICAgICovCiAgICAgICAgX3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICAgIHJldHVybiBCb29sZWFuKGNoYW5nZWRQcm9wcyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiBhbnkgcHJvcGVydGllcyB3aXRoIGFjY2Vzc29ycyBjcmVhdGVkIHZpYQogICAgICAgICAqIGBfY3JlYXRlUHJvcGVydHlBY2Nlc3NvcmAgaGF2ZSBiZWVuIHNldC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY3VycmVudFByb3BzIEJhZyBvZiBhbGwgY3VycmVudCBhY2Nlc3NvciB2YWx1ZXMKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0aWVzQ2hhbmdlZChjdXJyZW50UHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTWV0aG9kIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZQogICAgICAgICAqIGNvbnNpZGVyZWQgYXMgYSBjaGFuZ2UgYW5kIGNhdXNlIHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIHRvIGJlIGVucXVldWVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBgdHJ1ZWAgaWYgYSBzdHJpY3QgZXF1YWxpdHkKICAgICAgICAgKiBjaGVjayBmYWlscy4gVGhlIG1ldGhvZCBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgYE5hTmAuCiAgICAgICAgICoKICAgICAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBlLmcuIHByb3ZpZGUgc3RyaWN0ZXIgY2hlY2tpbmcgZm9yCiAgICAgICAgICogT2JqZWN0cy9BcnJheXMgd2hlbiB1c2luZyBpbW11dGFibGUgcGF0dGVybnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHsqfSBvbGQgUHJldmlvdXMgcHJvcGVydHkgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgICAqICAgYW5kIGVucXVldWUgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjawogICAgICAgICAgICAob2xkICE9PSB2YWx1ZSAmJgogICAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyAob2xkPT1OYU4sIHZhbHVlPT1OYU4pIGFsd2F5cyByZXR1cm5zIGZhbHNlCiAgICAgICAgICAgICAgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpCiAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSkgewogICAgICAgICAgaWYgKG9sZCAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKSB7CiAgICAgICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzZXJpYWxpemVzIGFuIGF0dHJpYnV0ZSB0byBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBgX2Rlc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBzdHJpbmcgdG8KICAgICAgICAgKiBhIHR5cGVkIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBOYW1lIG9mIGF0dHJpYnV0ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAgICogQHBhcmFtIHsqPX0gdHlwZSB0eXBlIHRvIGRlc2VyaWFsaXplIHRvLCBkZWZhdWx0cyB0byB0aGUgdmFsdWUKICAgICAgICAgKiByZXR1cm5lZCBmcm9tIGB0eXBlRm9yUHJvcGVydHlgCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfYXR0cmlidXRlVG9Qcm9wZXJ0eShhdHRyaWJ1dGUsIHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19zZXJpYWxpemluZykgewogICAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9fZGF0YUF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gbWFwICYmIG1hcFthdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTsKICAgICAgICAgICAgdGhpc1twcm9wZXJ0eV0gPSB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlIHx8CiAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci50eXBlRm9yUHJvcGVydHkocHJvcGVydHkpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAgICoKICAgICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gQ2xvc3VyZSBjYW4ndCBmaWd1cmUgb3V0IGB0aGlzYCBpcyBhbiBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0IHRvLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHJlZmVjdC4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSB0cnVlOwogICAgICAgICAgdmFsdWUgPSAoYXJndW1lbnRzLmxlbmd0aCA8IDMpID8gdGhpc1twcm9wZXJ0eV0gOiB2YWx1ZTsKICAgICAgICAgIHRoaXMuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKSwgdmFsdWUsCiAgICAgICAgICAgIGF0dHJpYnV0ZSB8fCB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSkpOwogICAgICAgICAgdGhpcy5fX3NlcmlhbGl6aW5nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGEgdHlwZWQgdmFsdWUgdG8gYW4gSFRNTCBhdHRyaWJ1dGUgb24gYSBub2RlLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSB0eXBlZAogICAgICAgICAqIHZhbHVlIHRvIGEgc3RyaW5nLiAgSWYgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLAogICAgICAgICAqIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBib29sZWFuCiAgICAgICAgICogdHlwZSBgZmFsc2VgKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfdmFsdWVUb05vZGVBdHRyaWJ1dGUobm9kZSwgdmFsdWUsIGF0dHJpYnV0ZSkgewogICAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHN0cik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBzZXR0aW5nIEpTIHByb3BlcnR5IHZhbHVlcyB0bwogICAgICAgICAqIEhUTUwgYXR0cmlidXRlcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogc2VyaWFsaXphdGlvbiBmb3IgY3VzdG9tIHR5cGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZAogICAgICAgICAqIHByb3BlcnR5ICB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBfc2VyaWFsaXplVmFsdWUodmFsdWUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/ICcnIDogdW5kZWZpbmVkOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHJlYWRpbmcgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzIHRvCiAgICAgICAgICogSlMgcHJvcGVydGllcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gVHlwZXMgZm9yIGBCb29sZWFuYCwgYFN0cmluZ2AsCiAgICAgICAgICogYW5kIGBOdW1iZXJgIGNvbnZlcnQgYXR0cmlidXRlcyB0byB0aGUgZXhwZWN0ZWQgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgICAqIEByZXR1cm4geyp9IFR5cGVkIHZhbHVlIGRlc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlIEJvb2xlYW46CiAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAhPT0gbnVsbCk7CiAgICAgICAgICAgIGNhc2UgTnVtYmVyOgogICAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gUHJvcGVydGllc0NoYW5nZWQ7CiAgICB9KTsKCgogIH0pKCk7CgoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgY2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gU2F2ZSBtYXAgb2YgbmF0aXZlIHByb3BlcnRpZXM7IHRoaXMgZm9ybXMgYSBibGFja2xpc3Qgb3IgcHJvcGVydGllcwogIC8vIHRoYXQgd29uJ3QgaGF2ZSB0aGVpciB2YWx1ZXMgInNhdmVkIiBieSBgc2F2ZUFjY2Vzc29yVmFsdWVgLCBzaW5jZQogIC8vIHJlYWRpbmcgZnJvbSBhbiBIVE1MRWxlbWVudCBhY2Nlc3NvciBmcm9tIHRoZSBjb250ZXh0IG9mIGEgcHJvdG90eXBlIHRocm93cwogIGNvbnN0IG5hdGl2ZVByb3BlcnRpZXMgPSB7fTsKICBsZXQgcHJvdG8gPSBIVE1MRWxlbWVudC5wcm90b3R5cGU7CiAgd2hpbGUgKHByb3RvKSB7CiAgICBsZXQgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90byk7CiAgICBmb3IgKGxldCBpPTA7IGk8cHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgbmF0aXZlUHJvcGVydGllc1twcm9wc1tpXV0gPSB0cnVlOwogICAgfQogICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogIH0KCiAgLyoqCiAgICogVXNlZCB0byBzYXZlIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGgKICAgKiBhbiBhY2Nlc3Nvci4gSWYgdGhlIGBtb2RlbGAgaXMgYSBwcm90b3R5cGUsIHRoZSB2YWx1ZXMgd2lsbCBiZSBzYXZlZAogICAqIGluIGBfX2RhdGFQcm90b2AsIGFuZCBpdCdzIHVwIHRvIHRoZSB1c2VyIChvciBkb3duc3RyZWFtIG1peGluKSB0bwogICAqIGRlY2lkZSBob3cvd2hlbiB0byBzZXQgdGhlc2UgdmFsdWVzIGJhY2sgaW50byB0aGUgYWNjZXNzb3JzLgogICAqIElmIGBtb2RlbGAgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSAoaXQgaGFzIGEgYF9fZGF0YWAgcHJvcGVydHkpLCB0aGVuCiAgICogdGhlIHZhbHVlIHdpbGwgYmUgc2V0IGFzIGEgcGVuZGluZyBwcm9wZXJ0eSwgbWVhbmluZyB0aGUgdXNlciBzaG91bGQKICAgKiBjYWxsIGBfaW52YWxpZGF0ZVByb3BlcnRpZXNgIG9yIGBfZmx1c2hQcm9wZXJ0aWVzYCB0byB0YWtlIGVmZmVjdAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIFByb3RvdHlwZSBvciBpbnN0YW5jZQogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNhdmVBY2Nlc3NvclZhbHVlKG1vZGVsLCBwcm9wZXJ0eSkgewogICAgLy8gRG9uJ3QgcmVhZC9zdG9yZSB2YWx1ZSBmb3IgYW55IG5hdGl2ZSBwcm9wZXJ0aWVzIHNpbmNlIHRoZXkgY291bGQgdGhyb3cKICAgIGlmICghbmF0aXZlUHJvcGVydGllc1twcm9wZXJ0eV0pIHsKICAgICAgbGV0IHZhbHVlID0gbW9kZWxbcHJvcGVydHldOwogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChtb2RlbC5fX2RhdGEpIHsKICAgICAgICAgIC8vIEFkZGluZyBhY2Nlc3NvciB0byBpbnN0YW5jZTsgdXBkYXRlIHRoZSBwcm9wZXJ0eQogICAgICAgICAgLy8gSXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsIF9mbHVzaFByb3BlcnRpZXMKICAgICAgICAgIG1vZGVsLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQWRkaW5nIGFjY2Vzc29yIHRvIHByb3RvOyBzYXZlIHByb3RvJ3MgdmFsdWUgZm9yIGluc3RhbmNlLXRpbWUgdXNlCiAgICAgICAgICBpZiAoIW1vZGVsLl9fZGF0YVByb3RvKSB7CiAgICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvID0ge307CiAgICAgICAgICB9IGVsc2UgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX2RhdGFQcm90bycsIG1vZGVsKSkpIHsKICAgICAgICAgICAgbW9kZWwuX19kYXRhUHJvdG8gPSBPYmplY3QuY3JlYXRlKG1vZGVsLl9fZGF0YVByb3RvKTsKICAgICAgICAgIH0KICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIGJhc2ljIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIGNyZWF0aW5nIG9uZQogICAqIG9yIG1vcmUgcHJvcGVydHkgYWNjZXNzb3JzIChnZXR0ZXIvc2V0dGVyIHBhaXIpIHRoYXQgZW5xdWV1ZSBhbiBhc3luYwogICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgKgogICAqIEZvciBiYXNpYyB1c2FnZSBvZiB0aGlzIG1peGluOgogICAqIAogICAqIC0gICBEZWNsYXJlIGF0dHJpYnV0ZXMgdG8gb2JzZXJ2ZSB2aWEgdGhlIHN0YW5kYXJkIGBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpYC4gVXNlCiAgICogICAgIGBkYXNoLWNhc2VgIGF0dHJpYnV0ZSBuYW1lcyB0byByZXByZXNlbnQgYGNhbWVsQ2FzZWAgcHJvcGVydHkgbmFtZXMuIAogICAqIC0gICBJbXBsZW1lbnQgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIG9uIHRoZSBjbGFzcy4KICAgKiAtICAgQ2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpYCAqKm9uY2UqKiBvbiB0aGUgY2xhc3MgdG8gZ2VuZXJhdGUgCiAgICogICAgIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgZWFjaCBvYnNlcnZlZCBhdHRyaWJ1dGUuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCAKICAgKiAgICAgaW5zdGFuY2UgaXMgY3JlYXRlZCwgZm9yIGV4YW1wbGUsIGJ5IGNhbGxpbmcgaXQgYmVmb3JlIGNhbGxpbmcgYGN1c3RvbUVsZW1lbnRzLmRlZmluZWAuCiAgICogICAgIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBsYXppbHkgZnJvbSB0aGUgZWxlbWVudCdzIGBjb25zdHJ1Y3RvcmAsIGFzIGxvbmcgYXMgaXQncyBndWFyZGVkIHNvCiAgICogICAgIHRoYXQgdGhlIGNhbGwgaXMgb25seSBtYWRlIG9uY2UsIHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIGlzIGNyZWF0ZWQuCiAgICogLSAgIENhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncyBgY29ubmVjdGVkQ2FsbGJhY2tgIHRvIGVuYWJsZSAKICAgKiAgICAgdGhlIGFjY2Vzc29ycy4KICAgKgogICAqIEFueSBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKICAgKiBkZXNlcmlhbGl6ZWQgdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIGFuZCBzZXQgdG8gdGhlIGFzc29jaWF0ZWQKICAgKiBwcm9wZXJ0eSB1c2luZyBgZGFzaC1jYXNlYC10by1gY2FtZWxDYXNlYCBjb252ZW50aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiBmb3IgcmVhY3RpbmcgdG8gcHJvcGVydHkgY2hhbmdlcyBmcm9tCiAgICogICBnZW5lcmF0ZWQgcHJvcGVydHkgYWNjZXNzb3JzLgogICAqLwogIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtzdXBlckNsYXNzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICAgY29uc3QgYmFzZSA9IFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQoc3VwZXJDbGFzcyk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnR5QWNjZXNzb3JzIGV4dGVuZHMgYmFzZSB7CgogICAgICAvKioKICAgICAgICogR2VuZXJhdGVzIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIHN0YW5kYXJkCiAgICAgICAqIHN0YXRpYyBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBhcnJheS4KICAgICAgICoKICAgICAgICogQXR0cmlidXRlIG5hbWVzIGFyZSBtYXBwZWQgdG8gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIGBkYXNoLWNhc2VgIHRvCiAgICAgICAqIGBjYW1lbENhc2VgIGNvbnZlbnRpb24KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpIHsKICAgICAgICBsZXQgYSQgPSB0aGlzLm9ic2VydmVkQXR0cmlidXRlczsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBhJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IoY2FzZU1hcC5kYXNoVG9DYW1lbENhc2UoYSRbaV0pKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKiBCeSBkZWZhdWx0LCBjb252ZXJ0cyBjYW1lbCB0byBkYXNoIGNhc2UsIGUuZy4gYGZvb0JhcmAgdG8gYGZvby1iYXJgLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gY29udmVydAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIGNhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBQcm9wZXJ0aWVzQ2hhbmdlZCBpbXBsZW1lbnRhdGlvbiB0byBpbml0aWFsaXplIHZhbHVlcyBmb3IKICAgICAgICogYWNjZXNzb3JzIGNyZWF0ZWQgZm9yIHZhbHVlcyB0aGF0IGFscmVhZHkgZXhpc3RlZCBvbiB0aGUgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGUuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBpZiAodGhpcy5fX2RhdGFQcm90bykgewogICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyh0aGlzLl9fZGF0YVByb3RvKTsKICAgICAgICAgIHRoaXMuX19kYXRhUHJvdG8gPSBudWxsOwogICAgICAgIH0KICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCBhdCBpbnN0YW5jZSB0aW1lIHdpdGggYmFnIG9mIHByb3BlcnRpZXMgdGhhdCB3ZXJlIG92ZXJ3cml0dGVuCiAgICAgICAqIGJ5IGFjY2Vzc29ycyBvbiB0aGUgcHJvdG90eXBlIHdoZW4gYWNjZXNzb3JzIHdlcmUgY3JlYXRlZC4KICAgICAgICoKICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICogc2V0dGVyIGF0IGluc3RhbmNlIHRpbWUuICBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhbiBvdmVycmlkZQogICAgICAgKiBwb2ludCBmb3IgY3VzdG9taXppbmcgb3IgcHJvdmlkaW5nIG1vcmUgZWZmaWNpZW50IGluaXRpYWxpemF0aW9uLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIHByb3BlcnR5IHZhbHVlcyB0aGF0IHdlcmUgb3ZlcndyaXR0ZW4KICAgICAgICogICB3aGVuIGNyZWF0aW5nIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwLCBwcm9wc1twXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5zdXJlcyB0aGUgZWxlbWVudCBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4gSWYgaXQgZG9lcyBub3QsCiAgICAgICAqIGFzc2lnbnMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGNhbid0IGZpZ3VyZSBvdXQgYHRoaXNgIGlzIGluZmFjdCBhbiBlbGVtZW50CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgTmFtZSBvZiBhdHRyaWJ1dGUgdG8gZW5zdXJlIGlzIHNldC4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZW5zdXJlQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICBjb25zdCBlbCA9IC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKTsKICAgICAgICBpZiAoIWVsLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7CiAgICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZShlbCwgdmFsdWUsIGF0dHJpYnV0ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIFByb3BlcnRpZXNDaGFuZ2VkIGltcGxlbWVudGlvbiB0byBzZXJpYWxpemUgb2JqZWN0cyBhcyBKU09OLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSB2YWx1ZS4KICAgICAgICovCiAgICAgIF9zZXJpYWxpemVWYWx1ZSh2YWx1ZSkgewogICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWZhbGx0aHJvdWdoICovCiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKICAgICAgICAgIGNhc2UgJ29iamVjdCc6CiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpOwogICAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBzdXBlci5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFBvbHltZXIgd2hlbiByZWFkaW5nIEhUTUwgYXR0cmlidXRlIHZhbHVlcyB0bwogICAgICAgKiBKUyBwcm9wZXJ0aWVzLiAgVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9uIFBvbHltZXIgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGVzIHRvIHByb3ZpZGUgZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gIE5vdGUsCiAgICAgICAqIHRoZSBgdHlwZWAgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBgdHlwZWAgZmllbGQgcHJvdmlkZWQgaW4gdGhlCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgYSBnaXZlbiBwcm9wZXJ0eSwgYW5kIGlzCiAgICAgICAqIGJ5IGNvbnZlbnRpb24gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICoKICAgICAgICoKICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUgdG8gZGVzZXJpYWxpemUuCiAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlZCB2YWx1ZSBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nLgogICAgICAgKi8KICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAdHlwZSB7Kn0KICAgICAgICAgKi8KICAgICAgICBsZXQgb3V0VmFsdWU7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlIE9iamVjdDoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IEpTT04ucGFyc2UoLyoqIEB0eXBlIHtzdHJpbmd9ICovKHZhbHVlKSk7CiAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgIC8vIGFsbG93IG5vbi1KU09OIGxpdGVyYWxzIGxpa2UgU3RyaW5ncyBhbmQgTnVtYmVycwogICAgICAgICAgICAgIG91dFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIEFycmF5OgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIG91dFZhbHVlID0gSlNPTi5wYXJzZSgvKiogQHR5cGUge3N0cmluZ30gKi8odmFsdWUpKTsKICAgICAgICAgICAgfSBjYXRjaCh4KSB7CiAgICAgICAgICAgICAgb3V0VmFsdWUgPSBudWxsOwogICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUG9seW1lcjo6QXR0cmlidXRlczogY291bGRuJ3QgZGVjb2RlIEFycmF5IGFzIEpTT046ICR7dmFsdWV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIERhdGU6CiAgICAgICAgICAgIG91dFZhbHVlID0gaXNOYU4odmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIG91dFZhbHVlID0gbmV3IERhdGUob3V0VmFsdWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG91dFZhbHVlID0gc3VwZXIuX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dFZhbHVlOwogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tZmFsbHRocm91Z2ggKi8KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgUHJvcGVydGllc0NoYW5nZWQgaW1wbGVtZW50YXRpb24gdG8gc2F2ZSBleGlzdGluZyBwcm90b3R5cGUKICAgICAgICogcHJvcGVydHkgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgcmVzZXQuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZWFkT25seSBXaGVuIHRydWUsIG5vIHNldHRlciBpcyBjcmVhdGVkCiAgICAgICAqCiAgICAgICAqIFdoZW4gY2FsbGluZyBvbiBhIHByb3RvdHlwZSwgYW55IG92ZXJ3cml0dGVuIHZhbHVlcyBhcmUgc2F2ZWQgaW4KICAgICAgICogYF9fZGF0YVByb3RvYCwgYW5kIGl0IGlzIHVwIHRvIHRoZSBzdWJjbGFzc2VyIHRvIGRlY2lkZSBob3cvd2hlbgogICAgICAgKiB0byBzZXQgdGhvc2UgcHJvcGVydGllcyBiYWNrIGludG8gdGhlIGFjY2Vzc29yLiAgV2hlbiBjYWxsaW5nIG9uIGFuCiAgICAgICAqIGluc3RhbmNlLCB0aGUgb3ZlcndyaXR0ZW4gdmFsdWUgaXMgc2V0IHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWAsCiAgICAgICAqIGFuZCB0aGUgdXNlciBzaG91bGQgY2FsbCBgX2ludmFsaWRhdGVQcm9wZXJ0aWVzYCBvciBgX2ZsdXNoUHJvcGVydGllc2AKICAgICAgICogZm9yIHRoZSB2YWx1ZXMgdG8gdGFrZSBlZmZlY3QuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSkgewogICAgICAgIHNhdmVBY2Nlc3NvclZhbHVlKHRoaXMsIHByb3BlcnR5KTsKICAgICAgICBzdXBlci5fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlicmFyeSBjcmVhdGVkIGFuIGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW4gYWNjZXNzb3Igd2FzIGNyZWF0ZWQKICAgICAgICovCiAgICAgIF9oYXNBY2Nlc3Nvcihwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yICYmIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcHJvcGVydHldOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGEgcGVuZGluZyBjaGFuZ2UuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBwcm9wZXJ0eSBoYXMgYSBwZW5kaW5nIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaXNQcm9wZXJ0eVBlbmRpbmcocHJvcCkgewogICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX19kYXRhUGVuZGluZyAmJiAocHJvcCBpbiB0aGlzLl9fZGF0YVBlbmRpbmcpKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gUHJvcGVydHlBY2Nlc3NvcnM7CgogIH0pOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCwgTm9kZUZpbHRlci5TSE9XX0FMTCwKICAgICAgbnVsbCwgZmFsc2UpOwoKICAvLyAxLnggYmFja3dhcmRzLWNvbXBhdGlibGUgYXV0by13cmFwcGVyIGZvciB0ZW1wbGF0ZSB0eXBlIGV4dGVuc2lvbnMKICAvLyBUaGlzIGlzIGEgY2xlYXIgbGF5ZXJpbmcgdmlvbGF0aW9uIGFuZCBnaXZlcyBmYXZvcmVkLW5hdGlvbiBzdGF0dXMgdG8KICAvLyBkb20taWYgYW5kIGRvbS1yZXBlYXQgdGVtcGxhdGVzLiAgVGhpcyBpcyBhIGNvbmNlaXQgd2UncmUgY2hvb3NpbmcgdG8ga2VlcAogIC8vIGEuKSB0byBlYXNlIDEueCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBkdWUgdG8gbG9zcyBvZiBgaXNgLCBhbmQKICAvLyBiLikgdG8gbWFpbnRhaW4gaWYvcmVwZWF0IGNhcGFiaWxpdHkgaW4gcGFyc2VyLWNvbnN0cmFpbmVkIGVsZW1lbnRzCiAgLy8gICAgIChlLmcuIHRhYmxlLCBzZWxlY3QpIGluIGxpZXUgb2YgbmF0aXZlIENFIHR5cGUgZXh0ZW5zaW9ucyB3aXRob3V0CiAgLy8gICAgIG1hc3NpdmUgbmV3IGludmVudGlvbiBpbiB0aGlzIHNwYWNlIChlLmcuIGRpcmVjdGl2ZSBzeXN0ZW0pCiAgY29uc3QgdGVtcGxhdGVFeHRlbnNpb25zID0gewogICAgJ2RvbS1pZic6IHRydWUsCiAgICAnZG9tLXJlcGVhdCc6IHRydWUKICB9OwogIGZ1bmN0aW9uIHdyYXBUZW1wbGF0ZUV4dGVuc2lvbihub2RlKSB7CiAgICBsZXQgaXMgPSBub2RlLmdldEF0dHJpYnV0ZSgnaXMnKTsKICAgIGlmIChpcyAmJiB0ZW1wbGF0ZUV4dGVuc2lvbnNbaXNdKSB7CiAgICAgIGxldCB0ID0gbm9kZTsKICAgICAgdC5yZW1vdmVBdHRyaWJ1dGUoJ2lzJyk7CiAgICAgIG5vZGUgPSB0Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChpcyk7CiAgICAgIHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgdCk7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodCk7CiAgICAgIHdoaWxlKHQuYXR0cmlidXRlcy5sZW5ndGgpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSwgdC5hdHRyaWJ1dGVzWzBdLnZhbHVlKTsKICAgICAgICB0LnJlbW92ZUF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gZmluZFRlbXBsYXRlTm9kZShyb290LCBub2RlSW5mbykgewogICAgLy8gcmVjdXJzaXZlbHkgYXNjZW5kIHRyZWUgdW50aWwgd2UgaGl0IHJvb3QKICAgIGxldCBwYXJlbnQgPSBub2RlSW5mby5wYXJlbnRJbmZvICYmIGZpbmRUZW1wbGF0ZU5vZGUocm9vdCwgbm9kZUluZm8ucGFyZW50SW5mbyk7CiAgICAvLyB1bndpbmQgdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIGluZGV4ZWQgbm9kZSBhdCBlYWNoIGxldmVsCiAgICBpZiAocGFyZW50KSB7CiAgICAgIC8vIG5vdGU6IG1hcmdpbmFsbHkgZmFzdGVyIHRoYW4gaW5kZXhpbmcgdmlhIGNoaWxkTm9kZXMKICAgICAgLy8gKGh0dHA6Ly9qc3BlcmYuY29tL2NoaWxkbm9kZXMtbG9va3VwKQogICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBwYXJlbnQ7CiAgICAgIGZvciAobGV0IG49d2Fsa2VyLmZpcnN0Q2hpbGQoKSwgaT0wOyBuOyBuPXdhbGtlci5uZXh0U2libGluZygpKSB7CiAgICAgICAgaWYgKG5vZGVJbmZvLnBhcmVudEluZGV4ID09PSBpKyspIHsKICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgfQoKICAvLyBjb25zdHJ1Y3QgYCRgIG1hcCAoZnJvbSBpZCBhbm5vdGF0aW9ucykKICBmdW5jdGlvbiBhcHBseUlkVG9NYXAoaW5zdCwgbWFwLCBub2RlLCBub2RlSW5mbykgewogICAgaWYgKG5vZGVJbmZvLmlkKSB7CiAgICAgIG1hcFtub2RlSW5mby5pZF0gPSBub2RlOwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBldmVudCBsaXN0ZW5lcnMgKGZyb20gZXZlbnQgYW5ub3RhdGlvbnMpCiAgZnVuY3Rpb24gYXBwbHlFdmVudExpc3RlbmVyKGluc3QsIG5vZGUsIG5vZGVJbmZvKSB7CiAgICBpZiAobm9kZUluZm8uZXZlbnRzICYmIG5vZGVJbmZvLmV2ZW50cy5sZW5ndGgpIHsKICAgICAgZm9yIChsZXQgaj0wLCBlJD1ub2RlSW5mby5ldmVudHMsIGU7IChqPGUkLmxlbmd0aCkgJiYgKGU9ZSRbal0pOyBqKyspIHsKICAgICAgICBpbnN0Ll9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGUubmFtZSwgZS52YWx1ZSwgaW5zdCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIHB1c2ggY29uZmlndXJhdGlvbiByZWZlcmVuY2VzIGF0IGNvbmZpZ3VyZSB0aW1lCiAgZnVuY3Rpb24gYXBwbHlUZW1wbGF0ZUNvbnRlbnQoaW5zdCwgbm9kZSwgbm9kZUluZm8pIHsKICAgIGlmIChub2RlSW5mby50ZW1wbGF0ZUluZm8pIHsKICAgICAgbm9kZS5fdGVtcGxhdGVJbmZvID0gbm9kZUluZm8udGVtcGxhdGVJbmZvOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlTm9kZUV2ZW50SGFuZGxlcihjb250ZXh0LCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgIC8vIEluc3RhbmNlcyBjYW4gb3B0aW9uYWxseSBoYXZlIGEgX21ldGhvZEhvc3Qgd2hpY2ggYWxsb3dzIHJlZGlyZWN0aW5nIHdoZXJlCiAgICAvLyB0byBmaW5kIG1ldGhvZHMuIEN1cnJlbnRseSB1c2VkIGJ5IGB0ZW1wbGF0aXplYC4KICAgIGNvbnRleHQgPSBjb250ZXh0Ll9tZXRob2RIb3N0IHx8IGNvbnRleHQ7CiAgICBsZXQgaGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGNvbnRleHRbbWV0aG9kTmFtZV0pIHsKICAgICAgICBjb250ZXh0W21ldGhvZE5hbWVdKGUsIGUuZGV0YWlsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2xpc3RlbmVyIG1ldGhvZCBgJyArIG1ldGhvZE5hbWUgKyAnYCBub3QgZGVmaW5lZCcpOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGhhbmRsZXI7CiAgfQoKICAvKioKICAgKiBFbGVtZW50IG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgdGVtcGxhdGUgcGFyc2luZyBhbmQgc3RhbXBpbmcsIGluY2x1ZGluZwogICAqIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUtcmVsYXRlZCBmZWF0dXJlcyBmb3Igc3RhbXBlZCB0ZW1wbGF0ZXM6CiAgICoKICAgKiAtIERlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyAoYG9uLWV2ZW50bmFtZT0ibGlzdGVuZXIiYCkKICAgKiAtIE1hcCBvZiBub2RlIGlkJ3MgdG8gc3RhbXBlZCBub2RlIGluc3RhbmNlcyAoYHRoaXMuJC5pZGApCiAgICogLSBOZXN0ZWQgdGVtcGxhdGUgY29udGVudCBjYWNoaW5nL3JlbW92YWwgYW5kIHJlLWluc3RhbGxhdGlvbiAocGVyZm9ybWFuY2UKICAgKiAgIG9wdGltaXphdGlvbikKICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBiYXNpYyB0ZW1wbGF0ZSBwYXJzaW5nIGFuZCBzdGFtcGluZwogICAqLwogIFBvbHltZXIuVGVtcGxhdGVTdGFtcCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfVGVtcGxhdGVTdGFtcH0KICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVTdGFtcCBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgLyoqCiAgICAgICAqIFNjYW5zIGEgdGVtcGxhdGUgdG8gcHJvZHVjZSB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGUtc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHJldHVybmVkLCBhbmQgbm9kZS0KICAgICAgICogc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiBvYmplY3RzIGluIGl0cyBmbGF0dGVuZWQgYG5vZGVJbmZvTGlzdGAKICAgICAgICogYXJyYXkuICBPbmx5IG5vZGVzIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IHdlcmUgcGFyc2VkIGFzIG5vZGVzIG9mCiAgICAgICAqIGludGVyZXN0IGNvbnRhaW4gYW4gb2JqZWN0IGluIGBub2RlSW5mb0xpc3RgLiAgRWFjaCBgbm9kZUluZm9gIG9iamVjdAogICAgICAgKiBjb250YWlucyBhbiBgaW5kZXhgIChgY2hpbGROb2Rlc2AgaW5kZXggaW4gcGFyZW50KSBhbmQgb3B0aW9uYWxseQogICAgICAgKiBgcGFyZW50YCwgd2hpY2ggcG9pbnRzIHRvIG5vZGUgaW5mbyBvZiBpdHMgcGFyZW50IChpbmNsdWRpbmcgaXRzIGluZGV4KS4KICAgICAgICoKICAgICAgICogVGhlIHRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGhhcyB0aGUgZm9sbG93aW5nCiAgICAgICAqIHN0cnVjdHVyZSAobWFueSBmaWVsZHMgb3B0aW9uYWwpOgogICAgICAgKgogICAgICAgKiBgYGBqcwogICAgICAgKiAgIHsKICAgICAgICogICAgIC8vIEZsYXR0ZW5lZCBsaXN0IG9mIG5vZGUgbWV0YWRhdGEgKGZvciBub2RlcyB0aGF0IGdlbmVyYXRlZCBtZXRhZGF0YSkKICAgICAgICogICAgIG5vZGVJbmZvTGlzdDogWwogICAgICAgKiAgICAgICB7CiAgICAgICAqICAgICAgICAgLy8gYGlkYCBhdHRyaWJ1dGUgZm9yIGFueSBub2RlcyB3aXRoIGlkJ3MgZm9yIGdlbmVyYXRpbmcgYCRgIG1hcAogICAgICAgKiAgICAgICAgIGlkOiB7c3RyaW5nfSwKICAgICAgICogICAgICAgICAvLyBgb24tZXZlbnQ9ImhhbmRsZXIiYCBtZXRhZGF0YQogICAgICAgKiAgICAgICAgIGV2ZW50czogWwogICAgICAgKiAgICAgICAgICAgewogICAgICAgKiAgICAgICAgICAgICBuYW1lOiB7c3RyaW5nfSwgICAvLyBldmVudCBuYW1lCiAgICAgICAqICAgICAgICAgICAgIHZhbHVlOiB7c3RyaW5nfSwgIC8vIGhhbmRsZXIgbWV0aG9kIG5hbWUKICAgICAgICogICAgICAgICAgIH0sIC4uLgogICAgICAgKiAgICAgICAgIF0sCiAgICAgICAqICAgICAgICAgLy8gTm90ZXMgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbmVkIGEgYDxzbG90PmAgZm9yIHNoYWR5IERPTQogICAgICAgKiAgICAgICAgIC8vIG9wdGltaXphdGlvbiBwdXJwb3NlcwogICAgICAgKiAgICAgICAgIGhhc0luc2VydGlvblBvaW50OiB7Ym9vbGVhbn0sCiAgICAgICAqICAgICAgICAgLy8gRm9yIG5lc3RlZCBgPHRlbXBsYXRlPmBgIG5vZGVzLCBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICB0ZW1wbGF0ZUluZm86IHtvYmplY3R9LCAvLyBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICAvLyBNZXRhZGF0YSB0byBhbGxvdyBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGluc3RhbmNlZCBub2RlCiAgICAgICAqICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGlzIG1ldGFkYXRhCiAgICAgICAqICAgICAgICAgcGFyZW50SW5mbzoge251bWJlcn0sICAgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBub2RlSW5mbz4KICAgICAgICogICAgICAgICBwYXJlbnRJbmRleDoge251bWJlcn0sICAvLyBpbmRleCBpbiBwYXJlbnQncyBgY2hpbGROb2Rlc2AgY29sbGVjdGlvbgogICAgICAgKiAgICAgICAgIGluZm9JbmRleDoge251bWJlcn0sICAgIC8vIGluZGV4IG9mIHRoaXMgYG5vZGVJbmZvYCBpbiBgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdGAKICAgICAgICogICAgICAgfSwKICAgICAgICogICAgICAgLi4uCiAgICAgICAqICAgICBdLAogICAgICAgKiAgICAgLy8gV2hlbiB0cnVlLCB0aGUgdGVtcGxhdGUgaGFkIHRoZSBgc3RyaXAtd2hpdGVzcGFjZWAgYXR0cmlidXRlCiAgICAgICAqICAgICAvLyBvciB3YXMgbmVzdGVkIGluIGEgdGVtcGxhdGUgd2l0aCB0aGF0IHNldHRpbmcKICAgICAgICogICAgIHN0cmlwV2hpdGVzcGFjZToge2Jvb2xlYW59LAogICAgICAgKiAgICAgLy8gRm9yIG5lc3RlZCB0ZW1wbGF0ZXMsIG5lc3RlZCB0ZW1wbGF0ZSBjb250ZW50IGlzIG1vdmVkIGludG8KICAgICAgICogICAgIC8vIGEgZG9jdW1lbnQgZnJhZ21lbnQgc3RvcmVkIGhlcmU7IHRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRvCiAgICAgICAqICAgICAvLyBhdm9pZCB0aGUgY29zdCBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xvbmluZwogICAgICAgKiAgICAgY29udGVudDoge0RvY3VtZW50RnJhZ21lbnR9CiAgICAgICAqICAgfQogICAgICAgKiBgYGAKICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qga2lja3Mgb2ZmIGEgcmVjdXJzaXZlIHRyZWV3YWxrIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKiAgICBfcGFyc2VUZW1wbGF0ZSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgKiAgICAgIF9wYXJzZVRlbXBsYXRlQ29udGVudCAgICAgICAgICAgICAgfAogICAgICAgKiAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlICA8LS0tLS0tLS0tLS0tfC0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlIC0tKyAgfAogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMgLS0tLS0tLS0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzCiAgICAgICAqICAgICAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlCiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiBUaGVzZSBtZXRob2RzIG1heSBiZSBvdmVycmlkZGVuIHRvIGFkZCBjdXN0b20gbWV0YWRhdGEgYWJvdXQgdGVtcGxhdGVzCiAgICAgICAqIHRvIGVpdGhlciBgdGVtcGxhdGVJbmZvYCBvciBgbm9kZUluZm9gLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGRlc3RydWN0aXZlIHRvIHRoZSB0ZW1wbGF0ZSwgaW4gdGhhdAogICAgICAgKiBlLmcuIGV2ZW50IGFubm90YXRpb25zIG1heSBiZSByZW1vdmVkIGFmdGVyIGJlaW5nIG5vdGVkIGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm89fSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmcm9tIHRoZSBvdXRlcgogICAgICAgKiAgIHRlbXBsYXRlLCBmb3IgcGFyc2luZyBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFBhcnNlZCB0ZW1wbGF0ZSBtZXRhZGF0YQogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlKHRlbXBsYXRlLCBvdXRlclRlbXBsYXRlSW5mbykgewogICAgICAgIC8vIHNpbmNlIGEgdGVtcGxhdGUgbWF5IGJlIHJlLXVzZWQsIG1lbW8taXplIG1ldGFkYXRhCiAgICAgICAgaWYgKCF0ZW1wbGF0ZS5fdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGUuX3RlbXBsYXRlSW5mbyA9IHt9OwogICAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdCA9IFtdOwogICAgICAgICAgdGVtcGxhdGVJbmZvLnN0cmlwV2hpdGVTcGFjZSA9IFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyB8fAogICAgICAgICAgICAob3V0ZXJUZW1wbGF0ZUluZm8gJiYgb3V0ZXJUZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlKSB8fAogICAgICAgICAgICB0ZW1wbGF0ZS5oYXNBdHRyaWJ1dGUoJ3N0cmlwLXdoaXRlc3BhY2UnKTsKICAgICAgICAgIHRoaXMuX3BhcnNlVGVtcGxhdGVDb250ZW50KHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIHtwYXJlbnQ6IG51bGx9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLl90ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGUodGVtcGxhdGUuY29udGVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgbm9kZSBhbmQgYWRkcyB0ZW1wbGF0ZSBhbmQgbm9kZSBtZXRhZGF0YSBiYXNlZCBvbgogICAgICAgKiB0aGUgY3VycmVudCBub2RlLCBhbmQgaXRzIGBjaGlsZE5vZGVzYCBhbmQgYGF0dHJpYnV0ZXNgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhZGQgY3VzdG9tIG5vZGUgb3IgdGVtcGxhdGUgc3BlY2lmaWMKICAgICAgICogbWV0YWRhdGEgYmFzZWQgb24gdGhpcyBub2RlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZDsKICAgICAgICBsZXQgZWxlbWVudCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSk7CiAgICAgICAgaWYgKGVsZW1lbnQubG9jYWxOYW1lID09ICd0ZW1wbGF0ZScgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdwcmVzZXJ2ZS1jb250ZW50JykpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT09ICdzbG90JykgewogICAgICAgICAgLy8gRm9yIFNoYWR5RG9tIG9wdGltaXphdGlvbiwgaW5kaWNhdGluZyB0aGVyZSBpcyBhbiBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgIHRlbXBsYXRlSW5mby5oYXNJbnNlcnRpb25Qb2ludCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGVsZW1lbnQ7CiAgICAgICAgaWYgKHdhbGtlci5maXJzdENoaWxkKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMoZWxlbWVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZXMgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgY2hpbGQgbm9kZXMgZm9yIHRoZSBnaXZlbiByb290IG5vZGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGFsc28gd3JhcHMgd2hpdGVsaXN0ZWQgbGVnYWN5IHRlbXBsYXRlIGV4dGVuc2lvbnMKICAgICAgICogKGBpcz0iZG9tLWlmImAgYW5kIGBpcz0iZG9tLXJlcGVhdCJgKSB3aXRoIHRoZWlyIGVxdWl2YWxlbnQgZWxlbWVudAogICAgICAgKiB3cmFwcGVycywgY29sbGFwc2VzIHRleHQgbm9kZXMsIGFuZCBzdHJpcHMgd2hpdGVzcGFjZSBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBpZiB0aGUgYHRlbXBsYXRlSW5mby5zdHJpcFdoaXRlc3BhY2VgIHNldHRpbmcgd2FzIHByb3ZpZGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IHJvb3QgUm9vdCBub2RlIHdob3NlIGBjaGlsZE5vZGVzYCB3aWxsIGJlIHBhcnNlZAogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMocm9vdCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGlmIChyb290LmxvY2FsTmFtZSA9PT0gJ3NjcmlwdCcgfHwgcm9vdC5sb2NhbE5hbWUgPT09ICdzdHlsZScpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gcm9vdDsKICAgICAgICBmb3IgKGxldCBub2RlPXdhbGtlci5maXJzdENoaWxkKCksIHBhcmVudEluZGV4PTAsIG5leHQ7IG5vZGU7IG5vZGU9bmV4dCkgewogICAgICAgICAgLy8gV3JhcCB0ZW1wbGF0ZXMKICAgICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PSAndGVtcGxhdGUnKSB7CiAgICAgICAgICAgIG5vZGUgPSB3cmFwVGVtcGxhdGVFeHRlbnNpb24obm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBjb2xsYXBzZSBhZGphY2VudCB0ZXh0Tm9kZXM6IGZpeGVzIGFuIElFIGlzc3VlIHRoYXQgY2FuIGNhdXNlCiAgICAgICAgICAvLyB0ZXh0IG5vZGVzIHRvIGJlIGluZXhwbGljYWJseSBzcGxpdCA9KAogICAgICAgICAgLy8gbm90ZSB0aGF0IHJvb3Qubm9ybWFsaXplKCkgc2hvdWxkIHdvcmsgYnV0IGRvZXMgbm90IHNvIHdlIGRvIHRoaXMKICAgICAgICAgIC8vIG1hbnVhbGx5LgogICAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gbm9kZTsKICAgICAgICAgIG5leHQgPSB3YWxrZXIubmV4dFNpYmxpbmcoKTsKICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICBsZXQgLyoqIE5vZGUgKi8gbiA9IG5leHQ7CiAgICAgICAgICAgIHdoaWxlIChuICYmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkpIHsKICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ICs9IG4udGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgbmV4dCA9IHdhbGtlci5uZXh0U2libGluZygpOwogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobik7CiAgICAgICAgICAgICAgbiA9IG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBzdHJpcCB3aGl0ZXNwYWNlCiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlICYmICFub2RlLnRleHRDb250ZW50LnRyaW0oKSkgewogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCBjaGlsZEluZm8gPSB7IHBhcmVudEluZGV4LCBwYXJlbnRJbmZvOiBub2RlSW5mbyB9OwogICAgICAgICAgaWYgKHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgY2hpbGRJbmZvKSkgewogICAgICAgICAgICBjaGlsZEluZm8uaW5mb0luZGV4ID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdC5wdXNoKC8qKiBAdHlwZSB7IU5vZGVJbmZvfSAqLyhjaGlsZEluZm8pKSAtIDE7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbmNyZW1lbnQgaWYgbm90IHJlbW92ZWQKICAgICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IG5vZGU7CiAgICAgICAgICBpZiAod2Fsa2VyLnBhcmVudE5vZGUoKSkgewogICAgICAgICAgICBwYXJlbnRJbmRleCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBjb250ZW50IGZvciB0aGUgZ2l2ZW4gbmVzdGVkIGA8dGVtcGxhdGU+YC4KICAgICAgICoKICAgICAgICogTmVzdGVkIHRlbXBsYXRlIGluZm8gaXMgc3RvcmVkIGFzIGB0ZW1wbGF0ZUluZm9gIGluIHRoZSBjdXJyZW50IG5vZGUncwogICAgICAgKiBgbm9kZUluZm9gLiBgdGVtcGxhdGUuY29udGVudGAgaXMgcmVtb3ZlZCBhbmQgc3RvcmVkIGluIGB0ZW1wbGF0ZUluZm9gLgogICAgICAgKiBJdCB3aWxsIHRoZW4gYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBob3N0IHRvIHNldCBpdCBiYWNrIHRvIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBhbmQgZm9yIHVzZXJzIHN0YW1waW5nIG5lc3RlZCB0ZW1wbGF0ZXMgdG8gdXNlIHRoZQogICAgICAgKiBgX2NvbnRlbnRGb3JUZW1wbGF0ZWAgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IGZvciB0aGlzIHRlbXBsYXRlCiAgICAgICAqIChhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQgdGhlIGNvc3Qgb2YgY2xvbmluZyBuZXN0ZWQgdGVtcGxhdGUgY29udGVudCkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlIChhIDx0ZW1wbGF0ZT4pCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiAgIHRoYXQgaW5jbHVkZXMgdGhlIHRlbXBsYXRlIGBub2RlYAogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCB0ZW1wbGF0ZUluZm8gPSB0aGlzLl9wYXJzZVRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvKTsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50ID0KICAgICAgICAgIG5vZGUuY29udGVudC5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKG5vZGUuY29udGVudCk7CiAgICAgICAgbm9kZUluZm8udGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRlbXBsYXRlIG5vZGUgYXR0cmlidXRlcyBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogZm9yIG5vZGVzIG9mIGludGVyZXN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcyhub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgLy8gTWFrZSBjb3B5IG9mIG9yaWdpbmFsIGF0dHJpYnV0ZSBsaXN0LCBzaW5jZSB0aGUgb3JkZXIgbWF5IGNoYW5nZQogICAgICAgIC8vIGFzIGF0dHJpYnV0ZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkCiAgICAgICAgbGV0IG5vdGVkID0gZmFsc2U7CiAgICAgICAgbGV0IGF0dHJzID0gQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpOwogICAgICAgIGZvciAobGV0IGk9YXR0cnMubGVuZ3RoLTEsIGE7IChhPWF0dHJzW2ldKTsgaS0tKSB7CiAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGEubmFtZSwgYS52YWx1ZSkgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RlZDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyBhIHNpbmdsZSB0ZW1wbGF0ZSBub2RlIGF0dHJpYnV0ZSBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvCiAgICAgICAqIGBub2RlSW5mb2AgZm9yIGF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QuCiAgICAgICAqCiAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWRkcyBtZXRhZGF0YSBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiBhbmQgYGlkYCBhdHRyaWJ1dGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBuYW1lLCB2YWx1ZSkgewogICAgICAgIC8vIGV2ZW50cyAob24tKikKICAgICAgICBpZiAobmFtZS5zbGljZSgwLCAzKSA9PT0gJ29uLScpIHsKICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzID0gbm9kZUluZm8uZXZlbnRzIHx8IFtdOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzLnB1c2goewogICAgICAgICAgICBuYW1lOiBuYW1lLnNsaWNlKDMpLAogICAgICAgICAgICB2YWx1ZQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gc3RhdGljIGlkCiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2lkJykgewogICAgICAgICAgbm9kZUluZm8uaWQgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBgY29udGVudGAgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEZvciBuZXN0ZWQgdGVtcGxhdGVzLCBQb2x5bWVyIHBlcmZvcm1zIGFuIG9wdGltaXphdGlvbiB0byBjYWNoZSBuZXN0ZWQKICAgICAgICogdGVtcGxhdGUgY29udGVudCB0byBhdm9pZCB0aGUgY29zdCBvZiBjbG9uaW5nIGRlZXBseSBuZXN0ZWQgdGVtcGxhdGVzLgogICAgICAgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgdGhlIGNhY2hlZCBjb250ZW50IGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHJldHJpZXZlIGBjb250ZW50YCBmb3IKICAgICAgICogQHJldHVybiB7RG9jdW1lbnRGcmFnbWVudH0gQ29udGVudCBmcmFnbWVudAogICAgICAgKi8KICAgICAgc3RhdGljIF9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50V2l0aEluZm99ICovICh0ZW1wbGF0ZSkuX3RlbXBsYXRlSW5mbzsKICAgICAgICByZXR1cm4gKHRlbXBsYXRlSW5mbyAmJiB0ZW1wbGF0ZUluZm8uY29udGVudCkgfHwgdGVtcGxhdGUuY29udGVudDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsb25lcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgY29udGVudCBhbmQgcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAqIGNvbnRhaW5pbmcgdGhlIGNsb25lZCBkb20uCiAgICAgICAqCiAgICAgICAqIFRoZSB0ZW1wbGF0ZSBpcyBwYXJzZWQgKG9uY2UgYW5kIG1lbW9pemVkKSB1c2luZyB0aGlzIGxpYnJhcnkncwogICAgICAgKiB0ZW1wbGF0ZSBwYXJzaW5nIGZlYXR1cmVzLCBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS1hZGRlZAogICAgICAgKiBmZWF0dXJlczoKICAgICAgICogKiBBZGRzIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiAqIEdlbmVyYXRlcyBhbiAiaWQgbWFwIiBmb3IgYWxsIG5vZGVzIHdpdGggaWQncyB1bmRlciBgJGAgb24gcmV0dXJuZWQKICAgICAgICogICBkb2N1bWVudCBmcmFnbWVudAogICAgICAgKiAqIFBhc3NlcyB0ZW1wbGF0ZSBpbmZvIGluY2x1ZGluZyBgY29udGVudGAgYmFjayB0byB0ZW1wbGF0ZXMgYXMKICAgICAgICogICBgX3RlbXBsYXRlSW5mb2AgKGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIGF2b2lkIGRlZXAgdGVtcGxhdGUKICAgICAgICogICBjbG9uaW5nKQogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhlIG1lbW9pemVkIHRlbXBsYXRlIHBhcnNpbmcgcHJvY2VzcyBpcyBkZXN0cnVjdGl2ZSB0byB0aGUKICAgICAgICogdGVtcGxhdGU6IGF0dHJpYnV0ZXMgZm9yIGJpbmRpbmdzIGFuZCBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgYXJlCiAgICAgICAqIHJlbW92ZWQgYWZ0ZXIgYmVpbmcgbm90ZWQgaW4gbm90ZXMsIGFuZCBhbnkgbmVzdGVkIGA8dGVtcGxhdGU+LmNvbnRlbnRgCiAgICAgICAqIGlzIHJlbW92ZWQgYW5kIHN0b3JlZCBpbiBub3RlcyBhcyB3ZWxsLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBQb2x5ZmlsbCBzdXBwb3J0OiBib290c3RyYXAgdGhlIHRlbXBsYXRlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuCiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5jb250ZW50ICYmCiAgICAgICAgICAgIHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50ICYmIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUpIHsKICAgICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUodGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IG5vZGVJbmZvID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdDsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50IHx8IHRlbXBsYXRlLmNvbnRlbnQ7CiAgICAgICAgbGV0IGRvbSA9IC8qKiBAdHlwZSB7RG9jdW1lbnRGcmFnbWVudH0gKi8gKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIC8vIE5PVEU6IFNoYWR5RG9tIG9wdGltaXphdGlvbiBpbmRpY2F0aW5nIHRoZXJlIGlzIGFuIGluc2VydGlvbiBwb2ludAogICAgICAgIGRvbS5fX25vSW5zZXJ0aW9uUG9pbnQgPSAhdGVtcGxhdGVJbmZvLmhhc0luc2VydGlvblBvaW50OwogICAgICAgIGxldCBub2RlcyA9IGRvbS5ub2RlTGlzdCA9IG5ldyBBcnJheShub2RlSW5mby5sZW5ndGgpOwogICAgICAgIGRvbS4kID0ge307CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPW5vZGVJbmZvLmxlbmd0aCwgaW5mbzsgKGk8bCkgJiYgKGluZm89bm9kZUluZm9baV0pOyBpKyspIHsKICAgICAgICAgIGxldCBub2RlID0gbm9kZXNbaV0gPSBmaW5kVGVtcGxhdGVOb2RlKGRvbSwgaW5mbyk7CiAgICAgICAgICBhcHBseUlkVG9NYXAodGhpcywgZG9tLiQsIG5vZGUsIGluZm8pOwogICAgICAgICAgYXBwbHlUZW1wbGF0ZUNvbnRlbnQodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgICBhcHBseUV2ZW50TGlzdGVuZXIodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgfQogICAgICAgIGRvbSA9IC8qKiBAdHlwZSB7IVN0YW1wZWRUZW1wbGF0ZX0gKi8oZG9tKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IG1ldGhvZCBuYW1lIGZvciB0aGUgZXZlbnQgcHJvdmlkZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBhIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBsb29rcyB1cCB0aGUgbWV0aG9kCiAgICAgICAqIG5hbWUgYXQgaGFuZGxpbmcgdGltZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBtZXRob2QKICAgICAgICogQHBhcmFtIHsqPX0gY29udGV4dCBDb250ZXh0IHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gKGRlZmF1bHRzCiAgICAgICAqICAgdG8gYG5vZGVgKQogICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gR2VuZXJhdGVkIGhhbmRsZXIgZnVuY3Rpb24KICAgICAgICovCiAgICAgIF9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSwgY29udGV4dCkgewogICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IG5vZGU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBjcmVhdGVOb2RlRXZlbnRIYW5kbGVyKGNvbnRleHQsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSk7CiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIHJldHVybiBoYW5kbGVyOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIHJlbW92ZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gVGVtcGxhdGVTdGFtcDsKCiAgfSk7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKiogQGNvbnN0IHtPYmplY3R9ICovCiAgY29uc3QgQ2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHVuaXF1ZSBJRCB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cyB0cmlnZ2VyZWQKICAvLyBmcm9tIG11bHRpcGxlIHByb3BlcnRpZXMgaW4gdGhlIHNhbWUgdHVybgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIFByb3BlcnR5IGVmZmVjdCB0eXBlczsgZWZmZWN0cyBhcmUgc3RvcmVkIG9uIHRoZSBwcm90b3R5cGUgdXNpbmcgdGhlc2Uga2V5cwogICAqIEBlbnVtIHtzdHJpbmd9CiAgICovCiAgY29uc3QgVFlQRVMgPSB7CiAgICBDT01QVVRFOiAnX19jb21wdXRlRWZmZWN0cycsCiAgICBSRUZMRUNUOiAnX19yZWZsZWN0RWZmZWN0cycsCiAgICBOT1RJRlk6ICdfX25vdGlmeUVmZmVjdHMnLAogICAgUFJPUEFHQVRFOiAnX19wcm9wYWdhdGVFZmZlY3RzJywKICAgIE9CU0VSVkU6ICdfX29ic2VydmVFZmZlY3RzJywKICAgIFJFQURfT05MWTogJ19fcmVhZE9ubHknCiAgfTsKCiAgLyoqIEBjb25zdCB7UmVnRXhwfSAqLwogIGNvbnN0IGNhcGl0YWxBdHRyaWJ1dGVSZWdleCA9IC9bQS1aXS87CgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogbmFtZTogKHN0cmluZyB8IHVuZGVmaW5lZCksCiAgICogc3RydWN0dXJlZDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLAogICAqIHdpbGRjYXJkOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhVHJpZ2dlcjsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogaW5mbzogPywKICAgKiB0cmlnZ2VyOiAoIURhdGFUcmlnZ2VyIHwgdW5kZWZpbmVkKSwKICAgKiBmbjogKCFGdW5jdGlvbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhRWZmZWN0OyAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgbGV0IFByb3BlcnR5RWZmZWN0c1R5cGU7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAvKioKICAgKiBFbnN1cmVzIHRoYXQgdGhlIG1vZGVsIGhhcyBhbiBvd24tcHJvcGVydHkgbWFwIG9mIGVmZmVjdHMgZm9yIHRoZSBnaXZlbiB0eXBlLgogICAqIFRoZSBtb2RlbCBtYXkgYmUgYSBwcm90b3R5cGUgb3IgYW4gaW5zdGFuY2UuCiAgICoKICAgKiBQcm9wZXJ0eSBlZmZlY3RzIGFyZSBzdG9yZWQgYXMgYXJyYXlzIG9mIGVmZmVjdHMgYnkgcHJvcGVydHkgaW4gYSBtYXAsCiAgICogYnkgbmFtZWQgdHlwZSBvbiB0aGUgbW9kZWwuIGUuZy4KICAgKgogICAqICAgX19jb21wdXRlRWZmZWN0czogewogICAqICAgICBmb286IFsgLi4uIF0sCiAgICogICAgIGJhcjogWyAuLi4gXQogICAqICAgfQogICAqCiAgICogSWYgdGhlIG1vZGVsIGRvZXMgbm90IHlldCBoYXZlIGFuIGVmZmVjdCBtYXAgZm9yIHRoZSB0eXBlLCBvbmUgaXMgY3JlYXRlZAogICAqIGFuZCByZXR1cm5lZC4gIElmIGl0IGRvZXMsIGJ1dCBpdCBpcyBub3QgYW4gb3duIHByb3BlcnR5IChpLmUuIHRoZQogICAqIHByb3RvdHlwZSBoYWQgZWZmZWN0cyksIHRoZSB0aGUgbWFwIGlzIGRlZXBseSBjbG9uZWQgYW5kIHRoZSBjb3B5IGlzCiAgICogc2V0IG9uIHRoZSBtb2RlbCBhbmQgcmV0dXJuZWQsIHJlYWR5IGZvciBuZXcgZWZmZWN0cyB0byBiZSBhZGRlZC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBQcm9wZXJ0eSBlZmZlY3QgdHlwZQogICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG93bi1wcm9wZXJ0eSBtYXAgb2YgZWZmZWN0cyBmb3IgdGhlIGdpdmVuIHR5cGUKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGVuc3VyZU93bkVmZmVjdE1hcChtb2RlbCwgdHlwZSkgewogICAgbGV0IGVmZmVjdHMgPSBtb2RlbFt0eXBlXTsKICAgIGlmICghZWZmZWN0cykgewogICAgICBlZmZlY3RzID0gbW9kZWxbdHlwZV0gPSB7fTsKICAgIH0gZWxzZSBpZiAoIW1vZGVsLmhhc093blByb3BlcnR5KHR5cGUpKSB7CiAgICAgIGVmZmVjdHMgPSBtb2RlbFt0eXBlXSA9IE9iamVjdC5jcmVhdGUobW9kZWxbdHlwZV0pOwogICAgICBmb3IgKGxldCBwIGluIGVmZmVjdHMpIHsKICAgICAgICBsZXQgcHJvdG9GeCA9IGVmZmVjdHNbcF07CiAgICAgICAgbGV0IGluc3RGeCA9IGVmZmVjdHNbcF0gPSBBcnJheShwcm90b0Z4Lmxlbmd0aCk7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHByb3RvRngubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGluc3RGeFtpXSA9IHByb3RvRnhbaV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWZmZWN0czsKICB9CgogIC8vIC0tIGVmZmVjdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBSdW5zIGFsbCBlZmZlY3RzIG9mIGEgZ2l2ZW4gdHlwZSBmb3IgdGhlIGdpdmVuIHNldCBvZiBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogb24gYW4gaW5zdGFuY2UuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB3aXRoIGVmZmVjdHMgdG8gcnVuCiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdHMgT2JqZWN0IG1hcCBvZiBwcm9wZXJ0eS10by1BcnJheSBvZiBlZmZlY3RzCiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdD19IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHMoaW5zdCwgZWZmZWN0cywgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBpZiAoZWZmZWN0cykgewogICAgICBsZXQgcmFuID0gZmFsc2U7CiAgICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICBpZiAocnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGVmZmVjdHMsIGlkLCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzLCBleHRyYUFyZ3MpKSB7CiAgICAgICAgICByYW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmFuOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogUnVucyBhIGxpc3Qgb2YgZWZmZWN0cyBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHdpdGggZWZmZWN0cyB0byBydW4KICAgKiBAcGFyYW0ge09iamVjdH0gZWZmZWN0cyBPYmplY3QgbWFwIG9mIHByb3BlcnR5LXRvLUFycmF5IG9mIGVmZmVjdHMKICAgKiBAcGFyYW0ge251bWJlcn0gZGVkdXBlSWQgQ291bnRlciB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cwogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE5hbWUgb2YgY2hhbmdlZCBwcm9wZXJ0eQogICAqIEBwYXJhbSB7Kn0gcHJvcHMgQ2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHsqfSBvbGRQcm9wcyBPbGQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHNGb3JQcm9wZXJ0eShpbnN0LCBlZmZlY3RzLCBkZWR1cGVJZCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBsZXQgcmFuID0gZmFsc2U7CiAgICBsZXQgcm9vdFByb3BlcnR5ID0gaGFzUGF0aHMgPyBQb2x5bWVyLlBhdGgucm9vdChwcm9wKSA6IHByb3A7CiAgICBsZXQgZnhzID0gZWZmZWN0c1tyb290UHJvcGVydHldOwogICAgaWYgKGZ4cykgewogICAgICBmb3IgKGxldCBpPTAsIGw9ZnhzLmxlbmd0aCwgZng7IChpPGwpICYmIChmeD1meHNbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKCFmeC5pbmZvIHx8IGZ4LmluZm8ubGFzdFJ1biAhPT0gZGVkdXBlSWQpICYmCiAgICAgICAgICAgICghaGFzUGF0aHMgfHwgcGF0aE1hdGNoZXNUcmlnZ2VyKHByb3AsIGZ4LnRyaWdnZXIpKSkgewogICAgICAgICAgaWYgKGZ4LmluZm8pIHsKICAgICAgICAgICAgZnguaW5mby5sYXN0UnVuID0gZGVkdXBlSWQ7CiAgICAgICAgICB9CiAgICAgICAgICBmeC5mbihpbnN0LCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGZ4LmluZm8sIGhhc1BhdGhzLCBleHRyYUFyZ3MpOwogICAgICAgICAgcmFuID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByYW47CiAgfQoKICAvKioKICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwcm9wZXJ0eS9wYXRoIHRoYXQgaGFzIGNoYW5nZWQgbWF0Y2hlcyB0aGUgdHJpZ2dlcgogICAqIGNyaXRlcmlhIGZvciBhbiBlZmZlY3QuICBBIHRyaWdnZXIgaXMgYSBkZXNjcmlwdG9yIHdpdGggdGhlIGZvbGxvd2luZwogICAqIHN0cnVjdHVyZSwgd2hpY2ggbWF0Y2hlcyB0aGUgZGVzY3JpcHRvcnMgcmV0dXJuZWQgZnJvbSBgcGFyc2VBcmdgLgogICAqIGUuZy4gZm9yIGBmb28uYmFyLipgOgogICAqIGBgYAogICAqIHRyaWdnZXI6IHsKICAgKiAgIG5hbWU6ICdhLmInLAogICAqICAgc3RydWN0dXJlZDogdHJ1ZSwKICAgKiAgIHdpbGRjYXJkOiB0cnVlCiAgICogfQogICAqIGBgYAogICAqIElmIG5vIHRyaWdnZXIgaXMgZ2l2ZW4sIHRoZSBwYXRoIGlzIGRlZW1lZCB0byBtYXRjaC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggb3IgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCiAgICogQHBhcmFtIHtEYXRhVHJpZ2dlcn0gdHJpZ2dlciBEZXNjcmlwdG9yCiAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcGF0aCBtYXRjaGVkIHRoZSB0cmlnZ2VyCiAgICovCiAgZnVuY3Rpb24gcGF0aE1hdGNoZXNUcmlnZ2VyKHBhdGgsIHRyaWdnZXIpIHsKICAgIGlmICh0cmlnZ2VyKSB7CiAgICAgIGxldCB0cmlnZ2VyUGF0aCA9IHRyaWdnZXIubmFtZTsKICAgICAgcmV0dXJuICh0cmlnZ2VyUGF0aCA9PSBwYXRoKSB8fAogICAgICAgICh0cmlnZ2VyLnN0cnVjdHVyZWQgJiYgUG9seW1lci5QYXRoLmlzQW5jZXN0b3IodHJpZ2dlclBhdGgsIHBhdGgpKSB8fAogICAgICAgICh0cmlnZ2VyLndpbGRjYXJkICYmIFBvbHltZXIuUGF0aC5pc0Rlc2NlbmRhbnQodHJpZ2dlclBhdGgsIHBhdGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgIm9ic2VydmVyIiBlZmZlY3QuCiAgICoKICAgKiBDYWxscyB0aGUgbWV0aG9kIHdpdGggYGluZm8ubWV0aG9kTmFtZWAgb24gdGhlIGluc3RhbmNlLCBwYXNzaW5nIHRoZQogICAqIG5ldyBhbmQgb2xkIHZhbHVlcy4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuT2JzZXJ2ZXJFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgbGV0IGZuID0gdHlwZW9mIGluZm8ubWV0aG9kID09PSAic3RyaW5nIiA/IGluc3RbaW5mby5tZXRob2RdIDogaW5mby5tZXRob2Q7CiAgICBsZXQgY2hhbmdlZFByb3AgPSBpbmZvLnByb3BlcnR5OwogICAgaWYgKGZuKSB7CiAgICAgIGZuLmNhbGwoaW5zdCwgaW5zdC5fX2RhdGFbY2hhbmdlZFByb3BdLCBvbGRQcm9wc1tjaGFuZ2VkUHJvcF0pOwogICAgfSBlbHNlIGlmICghaW5mby5keW5hbWljRm4pIHsKICAgICAgY29uc29sZS53YXJuKCdvYnNlcnZlciBtZXRob2QgYCcgKyBpbmZvLm1ldGhvZCArICdgIG5vdCBkZWZpbmVkJyk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSdW5zICJub3RpZnkiIGVmZmVjdHMgZm9yIGEgc2V0IG9mIGNoYW5nZWQgcHJvcGVydGllcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSB0aGUgZ2VuZXJpYyBgcnVuRWZmZWN0c2AgbWV0aG9kIGluIHRoYXQgaXQKICAgKiB3aWxsIGRpc3BhdGNoIHBhdGggbm90aWZpY2F0aW9uIGV2ZW50cyBpbiB0aGUgY2FzZSB0aGF0IHRoZSBwcm9wZXJ0eQogICAqIGNoYW5nZWQgd2FzIGEgcGF0aCBhbmQgdGhlIHJvb3QgcHJvcGVydHkgZm9yIHRoYXQgcGF0aCBkaWRuJ3QgaGF2ZSBhCiAgICogIm5vdGlmeSIgZWZmZWN0LiAgVGhpcyBpcyB0byBtYWludGFpbiAxLjAgYmVoYXZpb3IgdGhhdCBkaWQgbm90IHJlcXVpcmUKICAgKiBgbm90aWZ5OiB0cnVlYCB0byBlbnN1cmUgb2JqZWN0IHN1Yi1wcm9wZXJ0eSBub3RpZmljYXRpb25zIHdlcmUKICAgKiBzZW50LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2l0aCBlZmZlY3RzIHRvIHJ1bgogICAqIEBwYXJhbSB7T2JqZWN0fSBub3RpZnlQcm9wcyBCYWcgb2YgcHJvcGVydGllcyB0byBub3RpZnkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bk5vdGlmeUVmZmVjdHMoaW5zdCwgbm90aWZ5UHJvcHMsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgIC8vIE5vdGlmeQogICAgbGV0IGZ4cyA9IGluc3RbVFlQRVMuTk9USUZZXTsKICAgIGxldCBub3RpZmllZDsKICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAvLyBUcnkgbm9ybWFsIG5vdGlmeSBlZmZlY3RzOyBpZiBub25lLCBmYWxsIGJhY2sgdG8gdHJ5IHBhdGggbm90aWZpY2F0aW9uCiAgICBmb3IgKGxldCBwcm9wIGluIG5vdGlmeVByb3BzKSB7CiAgICAgIGlmIChub3RpZnlQcm9wc1twcm9wXSkgewogICAgICAgIGlmIChmeHMgJiYgcnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGZ4cywgaWQsIHByb3AsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpKSB7CiAgICAgICAgICBub3RpZmllZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChoYXNQYXRocyAmJiBub3RpZnlQYXRoKGluc3QsIHByb3AsIHByb3BzKSkgewogICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gRmx1c2ggaG9zdCBpZiB3ZSBhY3R1YWxseSBub3RpZmllZCBhbmQgaG9zdCB3YXMgYmF0Y2hpbmcKICAgIC8vIEFuZCB0aGUgaG9zdCBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBjbGllbnRzOyB0aGlzIHByZXZlbnRzCiAgICAvLyBhbiBpc3N1ZSB3aXRoIGEgaG9zdCBvYnNlcnZpbmcgZGF0YSBjaGFuZ2VzIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgIGxldCBob3N0OwogICAgaWYgKG5vdGlmaWVkICYmIChob3N0ID0gaW5zdC5fX2RhdGFIb3N0KSAmJiBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcykgewogICAgICBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgfQogIH0KCiAgLyoqCiAgICogRGlzcGF0Y2hlcyB7cHJvcGVydHl9LWNoYW5nZWQgZXZlbnRzIHdpdGggcGF0aCBpbmZvcm1hdGlvbiBpbiB0aGUgZGV0YWlsCiAgICogb2JqZWN0IHRvIGluZGljYXRlIGEgc3ViLXBhdGggb2YgdGhlIHByb3BlcnR5IHdhcyBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdGhhdCB3YXMgY2hhbmdlZAogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIHdhcyBub3RpZmllZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5UGF0aChpbnN0LCBwYXRoLCBwcm9wcykgewogICAgbGV0IHJvb3RQcm9wZXJ0eSA9IFBvbHltZXIuUGF0aC5yb290KHBhdGgpOwogICAgaWYgKHJvb3RQcm9wZXJ0eSAhPT0gcGF0aCkgewogICAgICBsZXQgZXZlbnROYW1lID0gUG9seW1lci5DYXNlTWFwLmNhbWVsVG9EYXNoQ2FzZShyb290UHJvcGVydHkpICsgJy1jaGFuZ2VkJzsKICAgICAgZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHByb3BzW3BhdGhdLCBwYXRoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKioKICAgKiBEaXNwYXRjaGVzIHtwcm9wZXJ0eX0tY2hhbmdlZCBldmVudHMgdG8gaW5kaWNhdGUgYSBwcm9wZXJ0eSAob3IgcGF0aCkKICAgKiBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZCAoJ3twcm9wZXJ0eX0tY2hhbmdlZCcpCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGNoYW5nZWQgcHJvcGVydHkKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHBhdGggSWYgYSBzdWItcGF0aCBvZiB0aGlzIHByb3BlcnR5IGNoYW5nZWQsIHRoZSBwYXRoCiAgICogICB0aGF0IGNoYW5nZWQgKG9wdGlvbmFsKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgZnVuY3Rpb24gZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHZhbHVlLCBwYXRoKSB7CiAgICBsZXQgZGV0YWlsID0gewogICAgICB2YWx1ZTogdmFsdWUsCiAgICAgIHF1ZXVlUHJvcGVydHk6IHRydWUKICAgIH07CiAgICBpZiAocGF0aCkgewogICAgICBkZXRhaWwucGF0aCA9IHBhdGg7CiAgICB9CiAgICAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdCkuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGRldGFpbCB9KSk7CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAibm90aWZ5IiBlZmZlY3QuCiAgICoKICAgKiBEaXNwYXRjaGVzIGEgbm9uLWJ1YmJsaW5nIGV2ZW50IG5hbWVkIGBpbmZvLmV2ZW50TmFtZWAgb24gdGhlIGluc3RhbmNlCiAgICogd2l0aCBhIGRldGFpbCBvYmplY3QgY29udGFpbmluZyB0aGUgbmV3IGB2YWx1ZWAuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Ob3RpZnlFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMpIHsKICAgIGxldCByb290UHJvcGVydHkgPSBoYXNQYXRocyA/IFBvbHltZXIuUGF0aC5yb290KHByb3BlcnR5KSA6IHByb3BlcnR5OwogICAgbGV0IHBhdGggPSByb290UHJvcGVydHkgIT0gcHJvcGVydHkgPyBwcm9wZXJ0eSA6IG51bGw7CiAgICBsZXQgdmFsdWUgPSBwYXRoID8gUG9seW1lci5QYXRoLmdldChpbnN0LCBwYXRoKSA6IGluc3QuX19kYXRhW3Byb3BlcnR5XTsKICAgIGlmIChwYXRoICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFsdWUgPSBwcm9wc1twcm9wZXJ0eV07ICAvLyBzcGVjaWZpY2FsbHkgZm9yIC5zcGxpY2VzCiAgICB9CiAgICBkaXNwYXRjaE5vdGlmeUV2ZW50KGluc3QsIGluZm8uZXZlbnROYW1lLCB2YWx1ZSwgcGF0aCk7CiAgfQoKICAvKioKICAgKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciAyLXdheSBub3RpZmljYXRpb24gZXZlbnRzLiBSZWNlaXZlcyBjb250ZXh0CiAgICogaW5mb3JtYXRpb24gY2FwdHVyZWQgaW4gdGhlIGBhZGROb3RpZnlMaXN0ZW5lcmAgY2xvc3VyZSBmcm9tIHRoZQogICAqIGBfX25vdGlmeUxpc3RlbmVyc2AgbWV0YWRhdGEuCiAgICoKICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbm90aWZpZWQgcHJvcGVydHkgdG8gdGhlIGhvc3QgcHJvcGVydHkgb3IgcGF0aC4gIElmCiAgICogdGhlIGV2ZW50IGNvbnRhaW5lZCBwYXRoIGluZm9ybWF0aW9uLCB0cmFuc2xhdGUgdGhhdCBwYXRoIHRvIHRoZSBob3N0CiAgICogc2NvcGUncyBuYW1lIGZvciB0aGF0IHBhdGggZmlyc3QuCiAgICoKICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBOb3RpZmljYXRpb24gZXZlbnQgKGUuZy4gJzxwcm9wZXJ0eT4tY2hhbmdlZCcpCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBIb3N0IGVsZW1lbnQgaW5zdGFuY2UgaGFuZGxpbmcgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tUHJvcCBDaGlsZCBlbGVtZW50IHByb3BlcnR5IHRoYXQgd2FzIGJvdW5kCiAgICogQHBhcmFtIHtzdHJpbmd9IHRvUGF0aCBIb3N0IHByb3BlcnR5L3BhdGggdGhhdCB3YXMgYm91bmQKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZ2F0ZSBXaGV0aGVyIHRoZSBiaW5kaW5nIHdhcyBuZWdhdGVkCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGhhbmRsZU5vdGlmaWNhdGlvbihldmVudCwgaW5zdCwgZnJvbVByb3AsIHRvUGF0aCwgbmVnYXRlKSB7CiAgICBsZXQgdmFsdWU7CiAgICBsZXQgZGV0YWlsID0gLyoqIEB0eXBlIHtPYmplY3R9ICovKGV2ZW50LmRldGFpbCk7CiAgICBsZXQgZnJvbVBhdGggPSBkZXRhaWwgJiYgZGV0YWlsLnBhdGg7CiAgICBpZiAoZnJvbVBhdGgpIHsKICAgICAgdG9QYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShmcm9tUHJvcCwgdG9QYXRoLCBmcm9tUGF0aCk7CiAgICAgIHZhbHVlID0gZGV0YWlsICYmIGRldGFpbC52YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlID0gZXZlbnQuY3VycmVudFRhcmdldFtmcm9tUHJvcF07CiAgICB9CiAgICB2YWx1ZSA9IG5lZ2F0ZSA/ICF2YWx1ZSA6IHZhbHVlOwogICAgaWYgKCFpbnN0W1RZUEVTLlJFQURfT05MWV0gfHwgIWluc3RbVFlQRVMuUkVBRF9PTkxZXVt0b1BhdGhdKSB7CiAgICAgIGlmIChpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodG9QYXRoLCB2YWx1ZSwgdHJ1ZSwgQm9vbGVhbihmcm9tUGF0aCkpCiAgICAgICAgJiYgKCFkZXRhaWwgfHwgIWRldGFpbC5xdWV1ZVByb3BlcnR5KSkgewogICAgICAgIGluc3QuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIEltcGxlbWVudHMgdGhlICJyZWZsZWN0IiBlZmZlY3QuCiAgICoKICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYGluZm8uYXR0ck5hbWVgIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuUmVmbGVjdEVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvKSB7CiAgICBsZXQgdmFsdWUgPSBpbnN0Ll9fZGF0YVtwcm9wZXJ0eV07CiAgICBpZiAoUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKSB7CiAgICAgIHZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKHZhbHVlLCBpbmZvLmF0dHJOYW1lLCAnYXR0cmlidXRlJywgLyoqIEB0eXBlIHtOb2RlfSAqLyhpbnN0KSk7CiAgICB9CiAgICBpbnN0Ll9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBpbmZvLmF0dHJOYW1lLCB2YWx1ZSk7CiAgfQoKICAvKioKICAgKiBSdW5zICJjb21wdXRlZCIgZWZmZWN0cyBmb3IgYSBzZXQgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzLgogICAqCiAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIHRoZSBnZW5lcmljIGBydW5FZmZlY3RzYCBtZXRob2QgaW4gdGhhdCBpdAogICAqIGNvbnRpbnVlcyB0byBydW4gY29tcHV0ZWQgZWZmZWN0cyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIGVhY2ggcGFzcyB1bnRpbAogICAqIHRoZXJlIGFyZSBubyBtb3JlIG5ld2x5IGNvbXB1dGVkIHByb3BlcnRpZXMuICBUaGlzIGVuc3VyZXMgdGhhdCBhbGwKICAgKiBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSBjb21wdXRlZCBieSB0aGUgaW5pdGlhbCBzZXQgb2YgY2hhbmdlcyBhcmUKICAgKiBjb21wdXRlZCBiZWZvcmUgb3RoZXIgZWZmZWN0cyAoYmluZGluZyBwcm9wYWdhdGlvbiwgb2JzZXJ2ZXJzLCBhbmQgbm90aWZ5KQogICAqIHJ1bi4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0cyhpbnN0LCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykgewogICAgbGV0IGNvbXB1dGVFZmZlY3RzID0gaW5zdFtUWVBFUy5DT01QVVRFXTsKICAgIGlmIChjb21wdXRlRWZmZWN0cykgewogICAgICBsZXQgaW5wdXRQcm9wcyA9IGNoYW5nZWRQcm9wczsKICAgICAgd2hpbGUgKHJ1bkVmZmVjdHMoaW5zdCwgY29tcHV0ZUVmZmVjdHMsIGlucHV0UHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykpIHsKICAgICAgICBPYmplY3QuYXNzaWduKG9sZFByb3BzLCBpbnN0Ll9fZGF0YU9sZCk7CiAgICAgICAgT2JqZWN0LmFzc2lnbihjaGFuZ2VkUHJvcHMsIGluc3QuX19kYXRhUGVuZGluZyk7CiAgICAgICAgaW5wdXRQcm9wcyA9IGluc3QuX19kYXRhUGVuZGluZzsKICAgICAgICBpbnN0Ll9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiY29tcHV0ZWQgcHJvcGVydHkiIGVmZmVjdCBieSBydW5uaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUKICAgKiB2YWx1ZXMgb2YgdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gdGhlIGBpbmZvYCBvYmplY3QgYW5kIHNldHRpbmcgdGhlCiAgICogcmV0dXJuIHZhbHVlIHRvIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBzcGVjaWZpZWQuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgIGxldCByZXN1bHQgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbyk7CiAgICBsZXQgY29tcHV0ZWRQcm9wID0gaW5mby5tZXRob2RJbmZvOwogICAgaWYgKGluc3QuX19kYXRhSGFzQWNjZXNzb3IgJiYgaW5zdC5fX2RhdGFIYXNBY2Nlc3Nvcltjb21wdXRlZFByb3BdKSB7CiAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eShjb21wdXRlZFByb3AsIHJlc3VsdCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpbnN0W2NvbXB1dGVkUHJvcF0gPSByZXN1bHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBDb21wdXRlcyBwYXRoIGNoYW5nZXMgYmFzZWQgb24gcGF0aCBsaW5rcyBzZXQgdXAgdXNpbmcgdGhlIGBsaW5rUGF0aHNgCiAgICogQVBJLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2hvc2UgcHJvcHMgYXJlIGNoYW5naW5nCiAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8KHN0cmluZ3xudW1iZXIpPn0gcGF0aCBQYXRoIHRoYXQgaGFzIGNoYW5nZWQKICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIGNoYW5nZWQgcGF0aAogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBjb21wdXRlTGlua2VkUGF0aHMoaW5zdCwgcGF0aCwgdmFsdWUpIHsKICAgIGxldCBsaW5rcyA9IGluc3QuX19kYXRhTGlua2VkUGF0aHM7CiAgICBpZiAobGlua3MpIHsKICAgICAgbGV0IGxpbms7CiAgICAgIGZvciAobGV0IGEgaW4gbGlua3MpIHsKICAgICAgICBsZXQgYiA9IGxpbmtzW2FdOwogICAgICAgIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGEsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShhLCBiLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGIsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShiLCBhLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLSBiaW5kaW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICAqIEFkZHMgYmluZGluZyBtZXRhZGF0YSB0byB0aGUgY3VycmVudCBgbm9kZUluZm9gLCBhbmQgYmluZGluZyBlZmZlY3RzCiAgICogZm9yIGFsbCBwYXJ0IGRlcGVuZGVuY2llcyB0byBgdGVtcGxhdGVJbmZvYC4KICAgKgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIENsYXNzIHRoYXQgYF9wYXJzZVRlbXBsYXRlYCBpcyBjdXJyZW50bHkKICAgKiAgIHJ1bm5pbmcgb24KICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICogQHBhcmFtIHtzdHJpbmd9IGtpbmQgQmluZGluZyBraW5kLCBlaXRoZXIgJ3Byb3BlcnR5JywgJ2F0dHJpYnV0ZScsIG9yICd0ZXh0JwogICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgVGFyZ2V0IHByb3BlcnR5IG5hbWUKICAgKiBAcGFyYW0geyFBcnJheTwhQmluZGluZ1BhcnQ+fSBwYXJ0cyBBcnJheSBvZiBiaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge3N0cmluZz19IGxpdGVyYWwgTGl0ZXJhbCB0ZXh0IHN1cnJvdW5kaW5nIGJpbmRpbmcgcGFydHMgKHNwZWNpZmllZAogICAqICAgb25seSBmb3IgJ3Byb3BlcnR5JyBiaW5kaW5ncywgc2luY2UgdGhlc2UgbXVzdCBiZSBpbml0aWFsaXplZCBhcyBwYXJ0CiAgICogICBvZiBib290LXVwKQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGRCaW5kaW5nKGNvbnN0cnVjdG9yLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBraW5kLCB0YXJnZXQsIHBhcnRzLCBsaXRlcmFsKSB7CiAgICAvLyBDcmVhdGUgYmluZGluZyBtZXRhZGF0YSBhbmQgYWRkIHRvIG5vZGVJbmZvCiAgICBub2RlSW5mby5iaW5kaW5ncyA9IG5vZGVJbmZvLmJpbmRpbmdzIHx8IFtdOwogICAgbGV0IC8qKiBCaW5kaW5nICovIGJpbmRpbmcgPSB7IGtpbmQsIHRhcmdldCwgcGFydHMsIGxpdGVyYWwsIGlzQ29tcG91bmQ6IChwYXJ0cy5sZW5ndGggIT09IDEpIH07CiAgICBub2RlSW5mby5iaW5kaW5ncy5wdXNoKGJpbmRpbmcpOwogICAgLy8gQWRkIGxpc3RlbmVyIGluZm8gdG8gYmluZGluZyBtZXRhZGF0YQogICAgaWYgKHNob3VsZEFkZExpc3RlbmVyKGJpbmRpbmcpKSB7CiAgICAgIGxldCB7ZXZlbnQsIG5lZ2F0ZX0gPSBiaW5kaW5nLnBhcnRzWzBdOwogICAgICBiaW5kaW5nLmxpc3RlbmVyRXZlbnQgPSBldmVudCB8fCAoQ2FzZU1hcC5jYW1lbFRvRGFzaENhc2UodGFyZ2V0KSArICctY2hhbmdlZCcpOwogICAgICBiaW5kaW5nLmxpc3RlbmVyTmVnYXRlID0gbmVnYXRlOwogICAgfQogICAgLy8gQWRkICJwcm9wYWdhdGUiIHByb3BlcnR5IGVmZmVjdHMgdG8gdGVtcGxhdGVJbmZvCiAgICBsZXQgaW5kZXggPSB0ZW1wbGF0ZUluZm8ubm9kZUluZm9MaXN0Lmxlbmd0aDsKICAgIGZvciAobGV0IGk9MDsgaTxiaW5kaW5nLnBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1tpXTsKICAgICAgcGFydC5jb21wb3VuZEluZGV4ID0gaTsKICAgICAgYWRkRWZmZWN0Rm9yQmluZGluZ1BhcnQoY29uc3RydWN0b3IsIHRlbXBsYXRlSW5mbywgYmluZGluZywgcGFydCwgaW5kZXgpOwogICAgfQogIH0KCiAgLyoqCiAgICogQWRkcyBwcm9wZXJ0eSBlZmZlY3RzIHRvIHRoZSBnaXZlbiBgdGVtcGxhdGVJbmZvYCBmb3IgdGhlIGdpdmVuIGJpbmRpbmcKICAgKiBwYXJ0LgogICAqCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQ2xhc3MgdGhhdCBgX3BhcnNlVGVtcGxhdGVgIGlzIGN1cnJlbnRseQogICAqICAgcnVubmluZyBvbgogICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggaW50byBgbm9kZUluZm9MaXN0YCBmb3IgdGhpcyBub2RlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBmdW5jdGlvbiBhZGRFZmZlY3RGb3JCaW5kaW5nUGFydChjb25zdHJ1Y3RvciwgdGVtcGxhdGVJbmZvLCBiaW5kaW5nLCBwYXJ0LCBpbmRleCkgewogICAgaWYgKCFwYXJ0LmxpdGVyYWwpIHsKICAgICAgaWYgKGJpbmRpbmcua2luZCA9PT0gJ2F0dHJpYnV0ZScgJiYgYmluZGluZy50YXJnZXRbMF0gPT09ICctJykgewogICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNldCBhdHRyaWJ1dGUgJyArIGJpbmRpbmcudGFyZ2V0ICsKICAgICAgICAgICcgYmVjYXVzZSAiLSIgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlIHN0YXJ0aW5nIGNoYXJhY3RlcicpOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBkZXBlbmRlbmNpZXMgPSBwYXJ0LmRlcGVuZGVuY2llczsKICAgICAgICBsZXQgaW5mbyA9IHsgaW5kZXgsIGJpbmRpbmcsIHBhcnQsIGV2YWx1YXRvcjogY29uc3RydWN0b3IgfTsKICAgICAgICBmb3IgKGxldCBqPTA7IGo8ZGVwZW5kZW5jaWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBsZXQgdHJpZ2dlciA9IGRlcGVuZGVuY2llc1tqXTsKICAgICAgICAgIGlmICh0eXBlb2YgdHJpZ2dlciA9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0cmlnZ2VyID0gcGFyc2VBcmcodHJpZ2dlcik7CiAgICAgICAgICAgIHRyaWdnZXIud2lsZGNhcmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3RydWN0b3IuX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCB0cmlnZ2VyLnJvb3RQcm9wZXJ0eSwgewogICAgICAgICAgICBmbjogcnVuQmluZGluZ0VmZmVjdCwKICAgICAgICAgICAgaW5mbywgdHJpZ2dlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiYmluZGluZyIgKHByb3BlcnR5L3BhdGggYmluZGluZykgZWZmZWN0LgogICAqCiAgICogTm90ZSB0aGF0IGJpbmRpbmcgc3ludGF4IGlzIG92ZXJyaWRhYmxlIHZpYSBgX3BhcnNlQmluZGluZ3NgIGFuZAogICAqIGBfZXZhbHVhdGVCaW5kaW5nYC4gIFRoaXMgbWV0aG9kIHdpbGwgY2FsbCBgX2V2YWx1YXRlQmluZGluZ2AgZm9yIGFueQogICAqIG5vbi1saXRlcmFsIHBhcnRzIHJldHVybmVkIGZyb20gYF9wYXJzZUJpbmRpbmdzYC4gIEhvd2V2ZXIsCiAgICogdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgX3BhdGhfIGJpbmRpbmdzIHZpYSBjdXN0b20gYmluZGluZyBwYXJ0cywKICAgKiBhcyB0aGlzIGlzIHNwZWNpZmljIHRvIFBvbHltZXIncyBwYXRoIGJpbmRpbmcgc3ludGF4LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEBwYXJhbSB7QXJyYXl9IG5vZGVMaXN0IExpc3Qgb2Ygbm9kZXMgYXNzb2NpYXRlZCB3aXRoIGBub2RlSW5mb0xpc3RgIHRlbXBsYXRlCiAgICogICBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5CaW5kaW5nRWZmZWN0KGluc3QsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMsIG5vZGVMaXN0KSB7CiAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2luZm8uaW5kZXhdOwogICAgbGV0IGJpbmRpbmcgPSBpbmZvLmJpbmRpbmc7CiAgICBsZXQgcGFydCA9IGluZm8ucGFydDsKICAgIC8vIFN1YnBhdGggbm90aWZpY2F0aW9uOiB0cmFuc2Zvcm0gcGF0aCBhbmQgc2V0IHRvIGNsaWVudAogICAgLy8gZS5nLjogZm9vPSJ7e29iai5zdWJ9fSIsIHBhdGg6ICdvYmouc3ViLnByb3AnLCBzZXQgJ2Zvby5wcm9wJz1vYmouc3ViLnByb3AKICAgIGlmIChoYXNQYXRocyAmJiBwYXJ0LnNvdXJjZSAmJiAocGF0aC5sZW5ndGggPiBwYXJ0LnNvdXJjZS5sZW5ndGgpICYmCiAgICAgICAgKGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSAmJiAhYmluZGluZy5pc0NvbXBvdW5kICYmCiAgICAgICAgbm9kZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ICYmCiAgICAgICAgbm9kZS5fX2RhdGFIYXNBY2Nlc3NvciAmJiBub2RlLl9fZGF0YUhhc0FjY2Vzc29yW2JpbmRpbmcudGFyZ2V0XSkgewogICAgICBsZXQgdmFsdWUgPSBwcm9wc1twYXRoXTsKICAgICAgcGF0aCA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUocGFydC5zb3VyY2UsIGJpbmRpbmcudGFyZ2V0LCBwYXRoKTsKICAgICAgaWYgKG5vZGUuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCB2YWx1ZSwgZmFsc2UsIHRydWUpKSB7CiAgICAgICAgaW5zdC5fZW5xdWV1ZUNsaWVudChub2RlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGV0IHZhbHVlID0gaW5mby5ldmFsdWF0b3IuX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgLy8gUHJvcGFnYXRlIHZhbHVlIHRvIGNoaWxkCiAgICAgIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKTsKICAgIH0KICB9CgogIC8qKgogICAqIFNldHMgdGhlIHZhbHVlIGZvciBhbiAiYmluZGluZyIgKGJpbmRpbmcpIGVmZmVjdCB0byBhIG5vZGUsCiAgICogZWl0aGVyIGFzIGEgcHJvcGVydHkgb3IgYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugb3duaW5nIHRoZSBiaW5kaW5nIGVmZmVjdAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUYXJnZXQgbm9kZSBmb3IgYmluZGluZwogICAqIEBwYXJhbSB7IUJpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEBwYXJhbSB7IUJpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKSB7CiAgICB2YWx1ZSA9IGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpOwogICAgaWYgKFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSkgewogICAgICB2YWx1ZSA9IFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSh2YWx1ZSwgYmluZGluZy50YXJnZXQsIGJpbmRpbmcua2luZCwgbm9kZSk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kID09ICdhdHRyaWJ1dGUnKSB7CiAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5nCiAgICAgIGluc3QuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSksIHZhbHVlLCBiaW5kaW5nLnRhcmdldCk7CiAgICB9IGVsc2UgewogICAgICAvLyBQcm9wZXJ0eSBiaW5kaW5nCiAgICAgIGxldCBwcm9wID0gYmluZGluZy50YXJnZXQ7CiAgICAgIGlmIChub2RlLl9faXNQcm9wZXJ0eUVmZmVjdHNDbGllbnQgJiYKICAgICAgICAgIG5vZGUuX19kYXRhSGFzQWNjZXNzb3IgJiYgbm9kZS5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wXSkgewogICAgICAgIGlmICghbm9kZVtUWVBFUy5SRUFEX09OTFldIHx8ICFub2RlW1RZUEVTLlJFQURfT05MWV1bcHJvcF0pIHsKICAgICAgICAgIGlmIChub2RlLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcCwgdmFsdWUpKSB7CiAgICAgICAgICAgIGluc3QuX2VucXVldWVDbGllbnQobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgIHsKICAgICAgICBpbnN0Ll9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIFRyYW5zZm9ybXMgYW4gImJpbmRpbmciIGVmZmVjdCB2YWx1ZSBiYXNlZCBvbiBjb21wb3VuZCAmIG5lZ2F0aW9uCiAgICogZWZmZWN0IG1ldGFkYXRhLCBhcyB3ZWxsIGFzIGhhbmRsaW5nIGZvciBzcGVjaWFsLWNhc2UgcHJvcGVydGllcwogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHsqfSBUcmFuc2Zvcm1lZCB2YWx1ZSB0byBzZXQKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgbGV0IHN0b3JhZ2UgPSBub2RlLl9fZGF0YUNvbXBvdW5kU3RvcmFnZVtiaW5kaW5nLnRhcmdldF07CiAgICAgIHN0b3JhZ2VbcGFydC5jb21wb3VuZEluZGV4XSA9IHZhbHVlOwogICAgICB2YWx1ZSA9IHN0b3JhZ2Uuam9pbignJyk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kICE9PSAnYXR0cmlidXRlJykgewogICAgICAvLyBTb21lIGJyb3dzZXJzIHNlcmlhbGl6ZSBgdW5kZWZpbmVkYCB0byBgInVuZGVmaW5lZCJgCiAgICAgIGlmIChiaW5kaW5nLnRhcmdldCA9PT0gJ3RleHRDb250ZW50JyB8fAogICAgICAgICAgKGJpbmRpbmcudGFyZ2V0ID09PSAndmFsdWUnICYmCiAgICAgICAgICAgIChub2RlLmxvY2FsTmFtZSA9PT0gJ2lucHV0JyB8fCBub2RlLmxvY2FsTmFtZSA9PT0gJ3RleHRhcmVhJykpKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PSB1bmRlZmluZWQgPyAnJyA6IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgYSBiaW5kaW5nJ3MgbWV0YWRhdGEgbWVldHMgYWxsIHRoZSByZXF1aXJlbWVudHMgdG8gYWxsb3cKICAgKiAyLXdheSBiaW5kaW5nLCBhbmQgdGhlcmVmb3JlIGEgYDxwcm9wZXJ0eT4tY2hhbmdlZGAgZXZlbnQgbGlzdGVuZXIgc2hvdWxkIGJlCiAgICogYWRkZWQ6CiAgICogLSB1c2VkIGN1cmx5IGJyYWNlcwogICAqIC0gaXMgYSBwcm9wZXJ0eSAobm90IGF0dHJpYnV0ZSkgYmluZGluZwogICAqIC0gaXMgbm90IGEgdGV4dENvbnRlbnQgYmluZGluZwogICAqIC0gaXMgbm90IGNvbXBvdW5kCiAgICoKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIDItd2F5IGxpc3RlbmVyIHNob3VsZCBiZSBhZGRlZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gc2hvdWxkQWRkTGlzdGVuZXIoYmluZGluZykgewogICAgcmV0dXJuIEJvb2xlYW4oYmluZGluZy50YXJnZXQpICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICdhdHRyaWJ1dGUnICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICd0ZXh0JyAmJgogICAgICAgICAgICFiaW5kaW5nLmlzQ29tcG91bmQgJiYKICAgICAgICAgICBiaW5kaW5nLnBhcnRzWzBdLm1vZGUgPT09ICd7JzsKICB9CgogIC8qKgogICAqIFNldHVwIGNvbXBvdW5kIGJpbmRpbmcgc3RvcmFnZSBzdHJ1Y3R1cmVzLCBub3RpZnkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QKICAgKiByZWZlcmVuY2VzIG9udG8gdGhlIGJvdW5kIG5vZGVMaXN0LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBJbnN0YW5jZSB0aGF0IGJhcyBiZWVuIHByZXZpb3VzbHkgYm91bmQKICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQmluZGluZ3MoaW5zdCwgdGVtcGxhdGVJbmZvKSB7CiAgICAvLyBTZXR1cCBjb21wb3VuZCBzdG9yYWdlLCBkYXRhSG9zdCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnMKICAgIGxldCB7bm9kZUxpc3QsIG5vZGVJbmZvTGlzdH0gPSB0ZW1wbGF0ZUluZm87CiAgICBpZiAobm9kZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICBmb3IgKGxldCBpPTA7IGkgPCBub2RlSW5mb0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgaW5mbyA9IG5vZGVJbmZvTGlzdFtpXTsKICAgICAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2ldOwogICAgICAgIGxldCBiaW5kaW5ncyA9IGluZm8uYmluZGluZ3M7CiAgICAgICAgaWYgKGJpbmRpbmdzKSB7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8YmluZGluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGJpbmRpbmcgPSBiaW5kaW5nc1tpXTsKICAgICAgICAgICAgc2V0dXBDb21wb3VuZFN0b3JhZ2Uobm9kZSwgYmluZGluZyk7CiAgICAgICAgICAgIGFkZE5vdGlmeUxpc3RlbmVyKG5vZGUsIGluc3QsIGJpbmRpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub2RlLl9fZGF0YUhvc3QgPSBpbnN0OwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbml0aWFsaXplcyBgX19kYXRhQ29tcG91bmRTdG9yYWdlYCBsb2NhbCBzdG9yYWdlIG9uIGEgYm91bmQgbm9kZSB3aXRoCiAgICogaW5pdGlhbCBsaXRlcmFsIGRhdGEgZm9yIGNvbXBvdW5kIGJpbmRpbmdzLCBhbmQgc2V0cyB0aGUgam9pbmVkCiAgICogbGl0ZXJhbCBwYXJ0cyB0byB0aGUgYm91bmQgcHJvcGVydHkuCiAgICoKICAgKiBXaGVuIGNoYW5nZXMgdG8gY29tcG91bmQgcGFydHMgb2NjdXIsIHRoZXkgYXJlIGZpcnN0IHNldCBpbnRvIHRoZSBjb21wb3VuZAogICAqIHN0b3JhZ2UgYXJyYXkgZm9yIHRoYXQgcHJvcGVydHksIGFuZCB0aGVuIHRoZSBhcnJheSBpcyBqb2luZWQgdG8gcmVzdWx0IGluCiAgICogdGhlIGZpbmFsIHZhbHVlIHNldCB0byB0aGUgcHJvcGVydHkvYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIEJvdW5kIG5vZGUgdG8gaW5pdGlhbGl6ZQogICAqIEBwYXJhbSB7QmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQ29tcG91bmRTdG9yYWdlKG5vZGUsIGJpbmRpbmcpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgLy8gQ3JlYXRlIGNvbXBvdW5kIHN0b3JhZ2UgbWFwCiAgICAgIGxldCBzdG9yYWdlID0gbm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgfHwKICAgICAgICAobm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB7fSk7CiAgICAgIGxldCBwYXJ0cyA9IGJpbmRpbmcucGFydHM7CiAgICAgIC8vIENvcHkgbGl0ZXJhbHMgZnJvbSBwYXJ0cyBpbnRvIHN0b3JhZ2UgZm9yIHRoaXMgYmluZGluZwogICAgICBsZXQgbGl0ZXJhbHMgPSBuZXcgQXJyYXkocGFydHMubGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaj0wOyBqPHBhcnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgbGl0ZXJhbHNbal0gPSBwYXJ0c1tqXS5saXRlcmFsOwogICAgICB9CiAgICAgIGxldCB0YXJnZXQgPSBiaW5kaW5nLnRhcmdldDsKICAgICAgc3RvcmFnZVt0YXJnZXRdID0gbGl0ZXJhbHM7CiAgICAgIC8vIENvbmZpZ3VyZSBwcm9wZXJ0aWVzIHdpdGggdGhlaXIgbGl0ZXJhbCBwYXJ0cwogICAgICBpZiAoYmluZGluZy5saXRlcmFsICYmIGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSB7CiAgICAgICAgbm9kZVt0YXJnZXRdID0gYmluZGluZy5saXRlcmFsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBBZGRzIGEgMi13YXkgYmluZGluZyBub3RpZmljYXRpb24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgc3BlY2lmaWVkCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gbm9kZSBDaGlsZCBlbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0bwogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSG9zdCBlbGVtZW50IGluc3RhbmNlIHRvIGhhbmRsZSBub3RpZmljYXRpb24gZXZlbnQKICAgKiBAcGFyYW0ge0JpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGROb3RpZnlMaXN0ZW5lcihub2RlLCBpbnN0LCBiaW5kaW5nKSB7CiAgICBpZiAoYmluZGluZy5saXN0ZW5lckV2ZW50KSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1swXTsKICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGJpbmRpbmcubGlzdGVuZXJFdmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihlLCBpbnN0LCBiaW5kaW5nLnRhcmdldCwgcGFydC5zb3VyY2UsIHBhcnQubmVnYXRlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICAvLyAtLSBmb3IgbWV0aG9kLWJhc2VkIGVmZmVjdHMgKGNvbXBsZXhPYnNlcnZlciAmIGNvbXB1dGVkKSAtLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBBZGRzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGVhY2ggYXJndW1lbnQgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUgKGFuZAogICAqIG9wdGlvbmFsbHksIGZvciB0aGUgbWV0aG9kIG5hbWUgaWYgYGR5bmFtaWNgIGlzIHRydWUpIHRoYXQgY2FsbHMgdGhlCiAgICogcHJvdmlkZWQgZWZmZWN0IGZ1bmN0aW9uLgogICAqCiAgICogQHBhcmFtIHtFbGVtZW50IHwgT2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0geyFNZXRob2RTaWduYXR1cmV9IHNpZyBNZXRob2Qgc2lnbmF0dXJlIG1ldGFkYXRhCiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVHlwZSBvZiBwcm9wZXJ0eSBlZmZlY3QgdG8gYWRkCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWZmZWN0Rm4gRnVuY3Rpb24gdG8gcnVuIHdoZW4gYXJndW1lbnRzIGNoYW5nZQogICAqIEBwYXJhbSB7Kj19IG1ldGhvZEluZm8gRWZmZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGJlIGluY2x1ZGVkIGluCiAgICogICBtZXRob2QgZWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICogICBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LiBOb3RlLAogICAqICAgZGVmYXVsdHMgdG8gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIGlzIHN0YXRpYyAoc2lnLnN0YXRpYyBpcyB0cnVlKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRWZmZWN0KG1vZGVsLCBzaWcsIHR5cGUsIGVmZmVjdEZuLCBtZXRob2RJbmZvLCBkeW5hbWljRm4pIHsKICAgIGR5bmFtaWNGbiA9IHNpZy5zdGF0aWMgfHwgKGR5bmFtaWNGbiAmJgogICAgICAodHlwZW9mIGR5bmFtaWNGbiAhPT0gJ29iamVjdCcgfHwgZHluYW1pY0ZuW3NpZy5tZXRob2ROYW1lXSkpOwogICAgbGV0IGluZm8gPSB7CiAgICAgIG1ldGhvZE5hbWU6IHNpZy5tZXRob2ROYW1lLAogICAgICBhcmdzOiBzaWcuYXJncywKICAgICAgbWV0aG9kSW5mbywKICAgICAgZHluYW1pY0ZuCiAgICB9OwogICAgZm9yIChsZXQgaT0wLCBhcmc7IChpPHNpZy5hcmdzLmxlbmd0aCkgJiYgKGFyZz1zaWcuYXJnc1tpXSk7IGkrKykgewogICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KGFyZy5yb290UHJvcGVydHksIHR5cGUsIHsKICAgICAgICAgIGZuOiBlZmZlY3RGbiwgaW5mbzogaW5mbywgdHJpZ2dlcjogYXJnCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChkeW5hbWljRm4pIHsKICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KHNpZy5tZXRob2ROYW1lLCB0eXBlLCB7CiAgICAgICAgZm46IGVmZmVjdEZuLCBpbmZvOiBpbmZvCiAgICAgIH0pOwogICAgfQogIH0KCiAgLyoqCiAgICogQ2FsbHMgYSBtZXRob2Qgd2l0aCBhcmd1bWVudHMgbWFyc2hhbGVkIGZyb20gcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UKICAgKiBiYXNlZCBvbiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBjb250YWluZWQgaW4gdGhlIGVmZmVjdCBtZXRhZGF0YS4KICAgKgogICAqIE11bHRpLXByb3BlcnR5IG9ic2VydmVycywgY29tcHV0ZWQgcHJvcGVydGllcywgYW5kIGlubGluZSBjb21wdXRpbmcKICAgKiBmdW5jdGlvbnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGludm9rZSB0aGUgbWV0aG9kLCB0aGVuIHVzZSB0aGUgcmV0dXJuCiAgICogdmFsdWUgYWNjb3JkaW5nbHkuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIG1ldGhvZCBpbnZvY2F0aW9uCiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgLy8gSW5zdGFuY2VzIGNhbiBvcHRpb25hbGx5IGhhdmUgYSBfbWV0aG9kSG9zdCB3aGljaCBhbGxvd3MgcmVkaXJlY3Rpbmcgd2hlcmUKICAgIC8vIHRvIGZpbmQgbWV0aG9kcy4gQ3VycmVudGx5IHVzZWQgYnkgYHRlbXBsYXRpemVgLgogICAgbGV0IGNvbnRleHQgPSBpbnN0Ll9tZXRob2RIb3N0IHx8IGluc3Q7CiAgICBsZXQgZm4gPSBjb250ZXh0W2luZm8ubWV0aG9kTmFtZV07CiAgICBpZiAoZm4pIHsKICAgICAgbGV0IGFyZ3MgPSBpbnN0Ll9tYXJzaGFsQXJncyhpbmZvLmFyZ3MsIHByb3BlcnR5LCBwcm9wcyk7CiAgICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgIH0gZWxzZSBpZiAoIWluZm8uZHluYW1pY0ZuKSB7CiAgICAgIGNvbnNvbGUud2FybignbWV0aG9kIGAnICsgaW5mby5tZXRob2ROYW1lICsgJ2Agbm90IGRlZmluZWQnKTsKICAgIH0KICB9CgogIGNvbnN0IGVtcHR5QXJyYXkgPSBbXTsKCiAgLy8gUmVndWxhciBleHByZXNzaW9ucyB1c2VkIGZvciBiaW5kaW5nCiAgY29uc3QgSURFTlQgID0gJyg/OicgKyAnW2EtekEtWl8kXVtcXHcuOiRcXC0qXSonICsgJyknOwogIGNvbnN0IE5VTUJFUiA9ICcoPzonICsgJ1stK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/JyArICcpJzsKICBjb25zdCBTUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnXCcoPzpbXlwnXFxcXF18XFxcXC4pKlwnJyArICcpJzsKICBjb25zdCBEUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnIig/OlteIlxcXFxdfFxcXFwuKSoiJyArICcpJzsKICBjb25zdCBTVFJJTkcgPSAnKD86JyArIFNRVU9URV9TVFJJTkcgKyAnfCcgKyBEUVVPVEVfU1RSSU5HICsgJyknOwogIGNvbnN0IEFSR1VNRU5UID0gJyg/OignICsgSURFTlQgKyAnfCcgKyBOVU1CRVIgKyAnfCcgKyAgU1RSSU5HICsgJylcXHMqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVFMgPSAnKD86JyArIEFSR1VNRU5UICsgJyg/OixcXHMqJyArIEFSR1VNRU5UICsgJykqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVF9MSVNUID0gJyg/OicgKyAnXFwoXFxzKicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoPzonICsgQVJHVU1FTlRTICsgJz8nICsgJyknICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcKVxccyonICsgJyknOwogIGNvbnN0IEJJTkRJTkcgPSAnKCcgKyBJREVOVCArICdcXHMqJyArIEFSR1VNRU5UX0xJU1QgKyAnPycgKyAnKSc7IC8vIEdyb3VwIDMKICBjb25zdCBPUEVOX0JSQUNLRVQgPSAnKFxcW1xcW3x7eyknICsgJ1xccyonOwogIGNvbnN0IENMT1NFX0JSQUNLRVQgPSAnKD86XV18fX0pJzsKICBjb25zdCBORUdBVEUgPSAnKD86KCEpXFxzKik/JzsgLy8gR3JvdXAgMgogIGNvbnN0IEVYUFJFU1NJT04gPSBPUEVOX0JSQUNLRVQgKyBORUdBVEUgKyBCSU5ESU5HICsgQ0xPU0VfQlJBQ0tFVDsKICBjb25zdCBiaW5kaW5nUmVnZXggPSBuZXcgUmVnRXhwKEVYUFJFU1NJT04sICJnIik7CgogIC8qKgogICAqIENyZWF0ZSBhIHN0cmluZyBmcm9tIGJpbmRpbmcgcGFydHMgb2YgYWxsIHRoZSBsaXRlcmFsIHBhcnRzCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxCaW5kaW5nUGFydD59IHBhcnRzIEFsbCBwYXJ0cyB0byBzdHJpbmdpZnkKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFN0cmluZyBtYWRlIGZyb20gdGhlIGxpdGVyYWwgcGFydHMKICAgKi8KICBmdW5jdGlvbiBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKSB7CiAgICBsZXQgcyA9ICcnOwogICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBsaXRlcmFsID0gcGFydHNbaV0ubGl0ZXJhbDsKICAgICAgcyArPSBsaXRlcmFsIHx8ICcnOwogICAgfQogICAgcmV0dXJuIHM7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYW4gZXhwcmVzc2lvbiBzdHJpbmcgZm9yIGEgbWV0aG9kIHNpZ25hdHVyZSwgYW5kIHJldHVybnMgYSBtZXRhZGF0YQogICAqIGRlc2NyaWJpbmcgdGhlIG1ldGhvZCBpbiB0ZXJtcyBvZiBgbWV0aG9kTmFtZWAsIGBzdGF0aWNgICh3aGV0aGVyIGFsbCB0aGUKICAgKiBhcmd1bWVudHMgYXJlIGxpdGVyYWxzKSwgYW5kIGFuIGFycmF5IG9mIGBhcmdzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gcGFyc2UKICAgKiBAcmV0dXJuIHs/TWV0aG9kU2lnbmF0dXJlfSBUaGUgbWV0aG9kIG1ldGFkYXRhIG9iamVjdCBpZiBhIG1ldGhvZCBleHByZXNzaW9uIHdhcwogICAqICAgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VNZXRob2QoZXhwcmVzc2lvbikgewogICAgLy8gdHJpZXMgdG8gbWF0Y2ggdmFsaWQgamF2YXNjcmlwdCBwcm9wZXJ0eSBuYW1lcwogICAgbGV0IG0gPSBleHByZXNzaW9uLm1hdGNoKC8oW15cc10rPylcKChbXHNcU10qKVwpLyk7CiAgICBpZiAobSkgewogICAgICBsZXQgbWV0aG9kTmFtZSA9IG1bMV07CiAgICAgIGxldCBzaWcgPSB7IG1ldGhvZE5hbWUsIHN0YXRpYzogdHJ1ZSwgYXJnczogZW1wdHlBcnJheSB9OwogICAgICBpZiAobVsyXS50cmltKCkpIHsKICAgICAgICAvLyByZXBsYWNlIGVzY2FwZWQgY29tbWFzIHdpdGggY29tbWEgZW50aXR5LCBzcGxpdCBvbiB1bi1lc2NhcGVkIGNvbW1hcwogICAgICAgIGxldCBhcmdzID0gbVsyXS5yZXBsYWNlKC9cXCwvZywgJyZjb21tYTsnKS5zcGxpdCgnLCcpOwogICAgICAgIHJldHVybiBwYXJzZUFyZ3MoYXJncywgc2lnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc2lnOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBhcnJheSBvZiBhcmd1bWVudHMgYW5kIHNldHMgdGhlIGBhcmdzYCBwcm9wZXJ0eSBvZiB0aGUgc3VwcGxpZWQKICAgKiBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0LiBTZXRzIHRoZSBgc3RhdGljYCBwcm9wZXJ0eSB0byBmYWxzZSBpZiBhbnkKICAgKiBhcmd1bWVudCBpcyBhIG5vbi1saXRlcmFsLgogICAqCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gYXJnTGlzdCBBcnJheSBvZiBhcmd1bWVudCBuYW1lcwogICAqIEBwYXJhbSB7IU1ldGhvZFNpZ25hdHVyZX0gc2lnIE1ldGhvZCBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0CiAgICogQHJldHVybiB7IU1ldGhvZFNpZ25hdHVyZX0gVGhlIHVwZGF0ZWQgc2lnbmF0dXJlIG1ldGFkYXRhIG9iamVjdAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ0xpc3QsIHNpZykgewogICAgc2lnLmFyZ3MgPSBhcmdMaXN0Lm1hcChmdW5jdGlvbihyYXdBcmcpIHsKICAgICAgbGV0IGFyZyA9IHBhcnNlQXJnKHJhd0FyZyk7CiAgICAgIGlmICghYXJnLmxpdGVyYWwpIHsKICAgICAgICBzaWcuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIGFyZzsKICAgIH0sIHRoaXMpOwogICAgcmV0dXJuIHNpZzsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBpbmRpdmlkdWFsIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBhcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOgogICAqCiAgICogICB7CiAgICogICAgIHZhbHVlOiAncHJvcCcsICAgICAgICAvLyBwcm9wZXJ0eS9wYXRoIG9yIGxpdGVyYWwgdmFsdWUKICAgKiAgICAgbGl0ZXJhbDogZmFsc2UsICAgICAgIC8vIHdoZXRoZXIgYXJndW1lbnQgaXMgYSBsaXRlcmFsCiAgICogICAgIHN0cnVjdHVyZWQ6IGZhbHNlLCAgICAvLyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBhIHBhdGgKICAgKiAgICAgcm9vdFByb3BlcnR5OiAncHJvcCcsIC8vIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoCiAgICogICAgIHdpbGRjYXJkOiBmYWxzZSAgICAgICAvLyB3aGV0aGVyIHRoZSBhcmd1bWVudCB3YXMgYSB3aWxkY2FyZCAnLionIHBhdGgKICAgKiAgIH0KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSByYXdBcmcgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXJndW1lbnQKICAgKiBAcmV0dXJuIHshTWV0aG9kQXJnfSBBcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHBhcnNlQXJnKHJhd0FyZykgewogICAgLy8gY2xlYW4gdXAgd2hpdGVzcGFjZQogICAgbGV0IGFyZyA9IHJhd0FyZy50cmltKCkKICAgICAgLy8gcmVwbGFjZSBjb21tYSBlbnRpdHkgd2l0aCBjb21tYQogICAgICAucmVwbGFjZSgvJmNvbW1hOy9nLCAnLCcpCiAgICAgIC8vIHJlcGFpciBleHRyYSBlc2NhcGUgc2VxdWVuY2VzOyBub3RlIG9ubHkgY29tbWFzIHN0cmljdGx5IG5lZWQKICAgICAgLy8gZXNjYXBpbmcsIGJ1dCB3ZSBhbGxvdyBhbnkgb3RoZXIgY2hhciB0byBiZSBlc2NhcGVkIHNpbmNlIGl0cwogICAgICAvLyBsaWtlbHkgdXNlcnMgd2lsbCBkbyB0aGlzCiAgICAgIC5yZXBsYWNlKC9cXCguKS9nLCAnXCQxJykKICAgICAgOwogICAgLy8gYmFzaWMgYXJndW1lbnQgZGVzY3JpcHRvcgogICAgbGV0IGEgPSB7CiAgICAgIG5hbWU6IGFyZywKICAgICAgdmFsdWU6ICcnLAogICAgICBsaXRlcmFsOiBmYWxzZQogICAgfTsKICAgIC8vIGRldGVjdCBsaXRlcmFsIHZhbHVlIChtdXN0IGJlIFN0cmluZyBvciBOdW1iZXIpCiAgICBsZXQgZmMgPSBhcmdbMF07CiAgICBpZiAoZmMgPT09ICctJykgewogICAgICBmYyA9IGFyZ1sxXTsKICAgIH0KICAgIGlmIChmYyA+PSAnMCcgJiYgZmMgPD0gJzknKSB7CiAgICAgIGZjID0gJyMnOwogICAgfQogICAgc3dpdGNoKGZjKSB7CiAgICAgIGNhc2UgIiciOgogICAgICBjYXNlICciJzoKICAgICAgICBhLnZhbHVlID0gYXJnLnNsaWNlKDEsIC0xKTsKICAgICAgICBhLmxpdGVyYWwgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcjJzoKICAgICAgICBhLnZhbHVlID0gTnVtYmVyKGFyZyk7CiAgICAgICAgYS5saXRlcmFsID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgIH0KICAgIC8vIGlmIG5vdCBsaXRlcmFsLCBsb29rIGZvciBzdHJ1Y3R1cmVkIHBhdGgKICAgIGlmICghYS5saXRlcmFsKSB7CiAgICAgIGEucm9vdFByb3BlcnR5ID0gUG9seW1lci5QYXRoLnJvb3QoYXJnKTsKICAgICAgLy8gZGV0ZWN0IHN0cnVjdHVyZWQgcGF0aCAoaGFzIGRvdHMpCiAgICAgIGEuc3RydWN0dXJlZCA9IFBvbHltZXIuUGF0aC5pc1BhdGgoYXJnKTsKICAgICAgaWYgKGEuc3RydWN0dXJlZCkgewogICAgICAgIGEud2lsZGNhcmQgPSAoYXJnLnNsaWNlKC0yKSA9PSAnLionKTsKICAgICAgICBpZiAoYS53aWxkY2FyZCkgewogICAgICAgICAgYS5uYW1lID0gYXJnLnNsaWNlKDAsIC0yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhOwogIH0KCiAgLy8gZGF0YSBhcGkKCiAgLyoqCiAgICogU2VuZHMgYXJyYXkgc3BsaWNlIG5vdGlmaWNhdGlvbnMgKGAuc3BsaWNlc2AgYW5kIGAubGVuZ3RoYCkKICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7QXJyYXl9IHNwbGljZXMgQXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgc3BsaWNlcykgewogICAgbGV0IHNwbGljZXNQYXRoID0gcGF0aCArICcuc3BsaWNlcyc7CiAgICBpbnN0Lm5vdGlmeVBhdGgoc3BsaWNlc1BhdGgsIHsgaW5kZXhTcGxpY2VzOiBzcGxpY2VzIH0pOwogICAgaW5zdC5ub3RpZnlQYXRoKHBhdGggKyAnLmxlbmd0aCcsIGFycmF5Lmxlbmd0aCk7CiAgICAvLyBOdWxsIGhlcmUgdG8gYWxsb3cgcG90ZW50aWFsbHkgbGFyZ2Ugc3BsaWNlIHJlY29yZHMgdG8gYmUgR0MnZWQuCiAgICBpbnN0Ll9fZGF0YVtzcGxpY2VzUGF0aF0gPSB7aW5kZXhTcGxpY2VzOiBudWxsfTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzcGxpY2UgcmVjb3JkIGFuZCBzZW5kcyBhbiBhcnJheSBzcGxpY2Ugbm90aWZpY2F0aW9uIGZvcgogICAqIHRoZSBkZXNjcmliZWQgbXV0YXRpb24KICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBhdCB3aGljaCB0aGUgYXJyYXkgbXV0YXRpb24gb2NjdXJyZWQKICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZWRDb3VudCBOdW1iZXIgb2YgYWRkZWQgaXRlbXMKICAgKiBAcGFyYW0ge0FycmF5fSByZW1vdmVkIEFycmF5IG9mIHJlbW92ZWQgaXRlbXMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlKGluc3QsIGFycmF5LCBwYXRoLCBpbmRleCwgYWRkZWRDb3VudCwgcmVtb3ZlZCkgewogICAgbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgW3sKICAgICAgaW5kZXg6IGluZGV4LAogICAgICBhZGRlZENvdW50OiBhZGRlZENvdW50LAogICAgICByZW1vdmVkOiByZW1vdmVkLAogICAgICBvYmplY3Q6IGFycmF5LAogICAgICB0eXBlOiAnc3BsaWNlJwogICAgfV0pOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhbiB1cHBlci1jYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBTdHJpbmcgdG8gdXBwZXJjYXNlCiAgICogQHJldHVybiB7c3RyaW5nfSBVcHBlcmNhc2VkIHN0cmluZwogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gdXBwZXIobmFtZSkgewogICAgcmV0dXJuIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIFBvbHltZXIncyB0ZW1wbGF0ZQogICAqIGJpbmRpbmcgYW5kIGRhdGEgb2JzZXJ2YXRpb24gKGNvbGxlY3RpdmVseSwgInByb3BlcnR5IGVmZmVjdHMiKSBzeXN0ZW0uCiAgICoKICAgKiBUaGlzIG1peGluIHVzZXMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBrZXkgc3RhdGljIG1ldGhvZHMgZm9yIGFkZGluZwogICAqIHByb3BlcnR5IGVmZmVjdHMgdG8gYW4gZWxlbWVudCBjbGFzczoKICAgKiAtIGBhZGRQcm9wZXJ0eUVmZmVjdGAKICAgKiAtIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU1ldGhvZE9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5YAogICAqIC0gYGNyZWF0ZVJlYWRPbmx5UHJvcGVydHlgCiAgICogLSBgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHlgCiAgICogLSBgY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eWAKICAgKiAtIGBiaW5kVGVtcGxhdGVgCiAgICoKICAgKiBFYWNoIG1ldGhvZCBjcmVhdGVzIG9uZSBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycywgYWxvbmcgd2l0aCBtZXRhZGF0YQogICAqIHVzZWQgYnkgdGhpcyBtaXhpbidzIGltcGxlbWVudGF0aW9uIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHRvIHBlcmZvcm0KICAgKiB0aGUgcHJvcGVydHkgZWZmZWN0cy4KICAgKgogICAqIFVuZGVyc2NvcmVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBtZXRob2RzIGFsc28gZXhpc3Qgb24gdGhlIGVsZW1lbnQKICAgKiBwcm90b3R5cGUgZm9yIGFkZGluZyBwcm9wZXJ0eSBlZmZlY3RzIG9uIGluc3RhbmNlcyBhdCBydW50aW1lLgogICAqCiAgICogTm90ZSB0aGF0IHRoaXMgbWl4aW4gb3ZlcnJpZGVzIHNldmVyYWwgYFByb3BlcnR5QWNjZXNzb3JzYCBtZXRob2RzLCBpbgogICAqIG1hbnkgY2FzZXMgdG8gbWFpbnRhaW4gZ3VhcmFudGVlcyBwcm92aWRlZCBieSB0aGUgUG9seW1lciAxLnggZmVhdHVyZXM7CiAgICogbm90YWJseSBpdCBjaGFuZ2VzIHByb3BlcnR5IGFjY2Vzc29ycyB0byBiZSBzeW5jaHJvbm91cyBieSBkZWZhdWx0CiAgICogd2hlcmVhcyB0aGUgZGVmYXVsdCB3aGVuIHVzaW5nIGBQcm9wZXJ0eUFjY2Vzc29yc2Agc3RhbmRhbG9uZSBpcyB0byBiZQogICAqIGFzeW5jIGJ5IGRlZmF1bHQuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlRlbXBsYXRlU3RhbXAKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBtZXRhLXByb2dyYW1taW5nIGZvciBQb2x5bWVyJ3MKICAgKiB0ZW1wbGF0ZSBiaW5kaW5nIGFuZCBkYXRhIG9ic2VydmF0aW9uIHN5c3RlbS4KICAgKi8KICBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUFjY2Vzc29yc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1RlbXBsYXRlU3RhbXB9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBwcm9wZXJ0eUVmZmVjdHNCYXNlID0gUG9seW1lci5UZW1wbGF0ZVN0YW1wKFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMoc3VwZXJDbGFzcykpOwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7cHJvcGVydHlFZmZlY3RzQmFzZX0KICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgUHJvcGVydHlFZmZlY3RzIGV4dGVuZHMgcHJvcGVydHlFZmZlY3RzQmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICAvLyBVc2VkIHRvIGlkZW50aWZ5IHVzZXJzIG9mIHRoaXMgbWl4aW4sIGFsYSBpbnN0YW5jZW9mCiAgICAgICAgdGhpcy5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ID0gdHJ1ZTsKICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8KICAgICAgICAvLyBOT1RFOiB1c2VkIHRvIHRyYWNrIHJlLWVudHJhbnQgY2FsbHMgdG8gYF9mbHVzaFByb3BlcnRpZXNgCiAgICAgICAgLy8gcGF0aCBjaGFuZ2VzIGRpcnR5IGNoZWNrIGFnYWluc3QgYF9fZGF0YVRlbXBgIG9ubHkgZHVyaW5nIG9uZSAidHVybiIKICAgICAgICAvLyBhbmQgYXJlIGNsZWFyZWQgd2hlbiBgX19kYXRhQ291bnRlcmAgcmV0dXJucyB0byAwLgogICAgICAgIHRoaXMuX19kYXRhQ291bnRlciA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5OwogICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovCiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2U7CiAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gKi8KICAgICAgICB0aGlzLl9fZGF0YUhvc3Q7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhVGVtcDsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzSW5pdGlhbGl6ZWQ7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmc7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhT2xkOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19jb21wdXRlRWZmZWN0czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fcmVmbGVjdEVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX25vdGlmeUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX3Byb3BhZ2F0ZUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX29ic2VydmVFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19yZWFkT25seTsKICAgICAgICAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovCiAgICAgICAgdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgZ2V0IFBST1BFUlRZX0VGRkVDVF9UWVBFUygpIHsKICAgICAgICByZXR1cm4gVFlQRVM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIGhvc3RTdGFjay5yZWdpc3Rlckhvc3QodGhpcyk7CiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkgPSBmYWxzZTsKICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gZmFsc2U7CiAgICAgICAgLy8gTWF5IGJlIHNldCBvbiBpbnN0YW5jZSBwcmlvciB0byB1cGdyYWRlCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB0aGlzLl9fZGF0YUNvbXBvdW5kU3RvcmFnZSB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhSG9zdCA9IHRoaXMuX19kYXRhSG9zdCB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYQogICAgICAgKiBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBpbml0aWFsaXppbmcgcHJvcGVydGllcyBmcm9tCiAgICAgICAqIHRoZSBwcm90b3R5cGUgb24gdGhlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIHRoaXMuX19kYXRhID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29yc2AgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgc2V0dGluZwogICAgICAgKiBgX3NldFByb3BlcnR5YCdzIGBzaG91bGROb3RpZnk6IHRydWVgLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgaW5zdGFuY2UKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplSW5zdGFuY2VQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgbGV0IHJlYWRPbmx5ID0gdGhpc1tUWVBFUy5SRUFEX09OTFldOwogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIGlmICghcmVhZE9ubHkgfHwgIXJlYWRPbmx5W3Byb3BdKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IHRoaXMuX19kYXRhUGVuZGluZyB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB0aGlzLl9fZGF0YU9sZCB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcF0gPSB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcF0gPSBwcm9wc1twcm9wXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFByb3RvdHlwZSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGFkZFByb3BlcnR5RWZmZWN0YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgdHlwZSA9PSBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIC8vIGVmZmVjdHMgYXJlIGFjY3VtdWxhdGVkIGludG8gYXJyYXlzIHBlciBwcm9wZXJ0eSBiYXNlZCBvbiB0eXBlCiAgICAgICAgbGV0IGVmZmVjdHMgPSBlbnN1cmVPd25FZmZlY3RNYXAodGhpcywgdHlwZSlbcHJvcGVydHldOwogICAgICAgIGlmICghZWZmZWN0cykgewogICAgICAgICAgZWZmZWN0cyA9IHRoaXNbdHlwZV1bcHJvcGVydHldID0gW107CiAgICAgICAgfQogICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcHJvcGVydHkgZWZmZWN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdGhlIGVmZmVjdCB3YXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVmZmVjdCB0eXBlLCBmcm9tIHRoaXMuUFJPUEVSVFlfRUZGRUNUX1RZUEVTCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QgdG8gcmVtb3ZlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVtb3ZlUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgIGxldCBlZmZlY3RzID0gZW5zdXJlT3duRWZmZWN0TWFwKHRoaXMsIHR5cGUpW3Byb3BlcnR5XTsKICAgICAgICBsZXQgaWR4ID0gZWZmZWN0cy5pbmRleE9mKGVmZmVjdCk7CiAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICBlZmZlY3RzLnNwbGljZShpZHgsIDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgcHJvcGVydHkgZWZmZWN0CiAgICAgICAqIG9mIGEgY2VydGFpbiB0eXBlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IHR5cGUgRWZmZWN0IHR5cGUsIGZyb20gdGhpcy5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSkgewogICAgICAgIGxldCBlZmZlY3RzID0gdGhpc1t0eXBlXTsKICAgICAgICByZXR1cm4gQm9vbGVhbihlZmZlY3RzICYmIGVmZmVjdHNbcHJvcGVydHldKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgInJlYWQgb25seSIKICAgICAgICogYWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNSZWFkT25seUVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgIm5vdGlmeSIKICAgICAgICogcHJvcGVydHkgZWZmZWN0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMgdHlwZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaGFzTm90aWZ5RWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5OT1RJRlkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAicmVmbGVjdCB0byBhdHRyaWJ1dGUiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc1JlZmxlY3RFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLlJFRkxFQ1QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAiY29tcHV0ZWQiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc0NvbXB1dGVkRWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5DT01QVVRFKTsKICAgICAgfQoKICAgICAgLy8gUnVudGltZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogU2V0cyBhIHBlbmRpbmcgcHJvcGVydHkgb3IgcGF0aC4gIElmIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoIGluCiAgICAgICAqIHF1ZXN0aW9uIGhhZCBubyBhY2Nlc3NvciwgdGhlIHBhdGggaXMgc2V0LCBvdGhlcndpc2UgaXQgaXMgZW5xdWV1ZWQKICAgICAgICogdmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YC4KICAgICAgICoKICAgICAgICogVGhpcyBmdW5jdGlvbiBpc29sYXRlcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZSBmdW5jdGlvbmFsaXR5IG5lY2Vzc2FyeQogICAgICAgKiBmb3IgdGhlIHB1YmxpYyBBUEkgKGBzZXRgLCBgc2V0UHJvcGVydGllc2AsIGBub3RpZnlQYXRoYCwgYW5kIHByb3BlcnR5CiAgICAgICAqIGNoYW5nZSBsaXN0ZW5lcnMgdmlhIHt7Li4ufX0gYmluZGluZ3MpLCBzdWNoIHRoYXQgaXQgaXMgb25seSBkb25lCiAgICAgICAqIHdoZW4gcGF0aHMgZW50ZXIgdGhlIHN5c3RlbSwgYW5kIG5vdCBhdCBldmVyeSBwcm9wYWdhdGlvbiBzdGVwLiAgSXQKICAgICAgICogYWxzbyBzZXRzIGEgYF9fZGF0YUhhc1BhdGhzYCBmbGFnIG9uIHRoZSBpbnN0YW5jZSB3aGljaCBpcyB1c2VkIHRvCiAgICAgICAqIGZhc3QtcGF0aCBzbG93ZXIgcGF0aC1tYXRjaGluZyBjb2RlIGluIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIGhvc3QgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIGBwYXRoYCBjYW4gYmUgYSBwYXRoIHN0cmluZyBvciBhcnJheSBvZiBwYXRoIHBhcnRzIGFzIGFjY2VwdGVkIGJ5IHRoZQogICAgICAgKiBwdWJsaWMgQVBJLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxudW1iZXJ8c3RyaW5nPn0gcGF0aCBQYXRoIHRvIHNldAogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGROb3RpZnkgU2V0IHRvIHRydWUgaWYgdGhpcyBjaGFuZ2Ugc2hvdWxkCiAgICAgICAqICBjYXVzZSBhIHByb3BlcnR5IG5vdGlmaWNhdGlvbiBldmVudCBkaXNwYXRjaAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBpc1BhdGhOb3RpZmljYXRpb24gSWYgdGhlIHBhdGggYmVpbmcgc2V0IGlzIGEgcGF0aAogICAgICAgKiAgIG5vdGlmaWNhdGlvbiBvZiBhbiBhbHJlYWR5IGNoYW5nZWQgdmFsdWUsIGFzIG9wcG9zZWQgdG8gYSByZXF1ZXN0CiAgICAgICAqICAgdG8gc2V0IGFuZCBub3RpZnkgdGhlIGNoYW5nZS4gIEluIHRoZSBsYXR0ZXIgYGZhbHNlYCBjYXNlLCBhIGRpcnR5CiAgICAgICAqICAgY2hlY2sgaXMgcGVyZm9ybWVkIGFuZCB0aGVuIHRoZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHBhdGggYmVmb3JlCiAgICAgICAqICAgZW5xdWV1aW5nIHRoZSBwZW5kaW5nIHByb3BlcnR5IGNoYW5nZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eS9wYXRoIHdhcyBlbnF1ZXVlZCBpbgogICAgICAgKiAgIHRoZSBwZW5kaW5nIGNoYW5nZXMgYmFnLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCBzaG91bGROb3RpZnksIGlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgIGlmIChpc1BhdGhOb3RpZmljYXRpb24gfHwKICAgICAgICAgICAgUG9seW1lci5QYXRoLnJvb3QoQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGhbMF0gOiBwYXRoKSAhPT0gcGF0aCkgewogICAgICAgICAgLy8gRGlydHkgY2hlY2sgY2hhbmdlcyBiZWluZyBzZXQgdG8gYSBwYXRoIGFnYWluc3QgdGhlIGFjdHVhbCBvYmplY3QsCiAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgcGF0aHMgaW50byB0aGUgc3lzdGVtOyBmcm9tIGhlcmUKICAgICAgICAgIC8vIHRoZSBvbmx5IGRpcnR5IGNoZWNrcyBhcmUgYWdhaW5zdCB0aGUgYF9fZGF0YVRlbXBgIGNhY2hlIHRvIHByZXZlbnQKICAgICAgICAgIC8vIGR1cGxpY2F0ZSB3b3JrIGluIHRoZSBzYW1lIHR1cm4gb25seS4gTm90ZSwgaWYgdGhpcyB3YXMgYSBub3RpZmljYXRpb24KICAgICAgICAgIC8vIG9mIGEgY2hhbmdlIGFscmVhZHkgc2V0IHRvIGEgcGF0aCAoaXNQYXRoTm90aWZpY2F0aW9uOiB0cnVlKSwKICAgICAgICAgIC8vIHdlIGFsd2F5cyBsZXQgdGhlIGNoYW5nZSB0aHJvdWdoIGFuZCBza2lwIHRoZSBgc2V0YCBzaW5jZSBpdCB3YXMKICAgICAgICAgIC8vIGFscmVhZHkgZGlydHkgY2hlY2tlZCBhdCB0aGUgcG9pbnQgb2YgZW50cnkgYW5kIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAvLyBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCiAgICAgICAgICBpZiAoIWlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgICAgICBsZXQgb2xkID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoKTsKICAgICAgICAgICAgcGF0aCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoUG9seW1lci5QYXRoLnNldCh0aGlzLCBwYXRoLCB2YWx1ZSkpOwogICAgICAgICAgICAvLyBVc2UgcHJvcGVydHktYWNjZXNzb3IncyBzaW1wbGVyIGRpcnR5IGNoZWNrCiAgICAgICAgICAgIGlmICghcGF0aCB8fCAhc3VwZXIuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHBhdGgsIHZhbHVlLCBvbGQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gdHJ1ZTsKICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoLyoqQHR5cGV7c3RyaW5nfSovKHBhdGgpLCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSkgewogICAgICAgICAgICBjb21wdXRlTGlua2VkUGF0aHModGhpcywgcGF0aCwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgJiYgdGhpcy5fX2RhdGFIYXNBY2Nlc3NvcltwYXRoXSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KC8qKkB0eXBle3N0cmluZ30qLyhwYXRoKSwgdmFsdWUsIHNob3VsZE5vdGlmeSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzW3BhdGhdID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFwcGxpZXMgYSB2YWx1ZSB0byBhIG5vbi1Qb2x5bWVyIGVsZW1lbnQvbm9kZSdzIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMgYSBiZXN0LWVmZm9ydCBhdCBiaW5kaW5nIGludGVyb3A6CiAgICAgICAqIFNvbWUgbmF0aXZlIGVsZW1lbnQgcHJvcGVydGllcyBoYXZlIHNpZGUtZWZmZWN0cyB3aGVuCiAgICAgICAqIHJlLXNldHRpbmcgdGhlIHNhbWUgdmFsdWUgKGUuZy4gc2V0dGluZyBgPGlucHV0Pi52YWx1ZWAgcmVzZXRzIHRoZQogICAgICAgKiBjdXJzb3IgcG9zaXRpb24pLCBzbyB3ZSBkbyBhIGRpcnR5LWNoZWNrIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZS4KICAgICAgICogSG93ZXZlciwgZm9yIGJldHRlciBpbnRlcm9wIHdpdGggbm9uLVBvbHltZXIgY3VzdG9tIGVsZW1lbnRzIHRoYXQKICAgICAgICogYWNjZXB0IG9iamVjdHMsIHdlIGV4cGxpY2l0bHkgcmUtc2V0IG9iamVjdCBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQogICAgICAgKiBQb2x5bWVyIHdvcmxkICh3aGljaCBtYXkgaW5jbHVkZSBkZWVwIG9iamVjdCBjaGFuZ2VzIHdpdGhvdXQgdGhlCiAgICAgICAqIHRvcCByZWZlcmVuY2UgY2hhbmdpbmcpLCBlcnJpbmcgb24gdGhlIHNpZGUgb2YgcHJvdmlkaW5nIG1vcmUKICAgICAgICogaW5mb3JtYXRpb24uCiAgICAgICAqCiAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFsdGVybmF0ZSBhcHByb2FjaGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIFRoZSBub2RlIHRvIHNldCBhIHByb3BlcnR5IG9uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSkgewogICAgICAgIC8vIEl0IGlzIGEganVkZ21lbnQgY2FsbCB0aGF0IHJlc2V0dGluZyBwcmltaXRpdmVzIGlzCiAgICAgICAgLy8gImJhZCIgYW5kIHJlc2V0dGluZ3Mgb2JqZWN0cyBpcyBhbHNvICJnb29kIjsgYWx0ZXJuYXRpdmVseSB3ZSBjb3VsZAogICAgICAgIC8vIGltcGxlbWVudCBhIHdoaXRlbGlzdCBvZiB0YWcgJiBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBzaG91bGQgbmV2ZXIKICAgICAgICAvLyBiZSByZXNldCAoZS5nLiA8aW5wdXQ+LnZhbHVlICYmIDxzZWxlY3Q+LnZhbHVlKQogICAgICAgIGlmICh2YWx1ZSAhPT0gbm9kZVtwcm9wXSB8fCB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHsKICAgICAgICAgIG5vZGVbcHJvcF0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgaW1wbGVtZW50YXRpb24gdG8gaW50cm9kdWNlIHNwZWNpYWwKICAgICAgICogZGlydHkgY2hlY2sgbG9naWMgZGVwZW5kaW5nIG9uIHRoZSBwcm9wZXJ0eSAmIHZhbHVlIGJlaW5nIHNldDoKICAgICAgICoKICAgICAgICogMS4gQW55IHZhbHVlIHNldCB0byBhIHBhdGggKGUuZy4gJ29iai5wcm9wJzogNDIgb3IgJ29iai5wcm9wJzogey4uLn0pCiAgICAgICAqICAgIFN0b3JlZCBpbiBgX19kYXRhVGVtcGAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhVGVtcGAKICAgICAgICogMi4gT2JqZWN0IHNldCB0byBzaW1wbGUgcHJvcGVydHkgKGUuZy4gJ3Byb3AnOiB7Li4ufSkKICAgICAgICogICAgU3RvcmVkIGluIGBfX2RhdGFUZW1wYCBhbmQgYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdAogICAgICAgKiAgICBgX19kYXRhVGVtcGAgYnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgX3Nob3VsZFByb3BlcnR5Q2hhbmdlYAogICAgICAgKiAzLiBQcmltaXRpdmUgdmFsdWUgc2V0IHRvIHNpbXBsZSBwcm9wZXJ0eSAoZS5nLiAncHJvcCc6IDQyKQogICAgICAgKiAgICBTdG9yZWQgaW4gYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhYAogICAgICAgKgogICAgICAgKiBUaGUgZGlydHktY2hlY2sgaXMgaW1wb3J0YW50IHRvIHByZXZlbnQgY3ljbGVzIGR1ZSB0byB0d28td2F5CiAgICAgICAqIG5vdGlmaWNhdGlvbiwgYnV0IHBhdGhzIGFuZCBvYmplY3RzIGFyZSBvbmx5IGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBhbnkKICAgICAgICogcHJldmlvdXMgdmFsdWUgc2V0IGR1cmluZyB0aGlzIHR1cm4gdmlhIGEgInRlbXBvcmFyeSBjYWNoZSIgdGhhdCBpcwogICAgICAgKiBjbGVhcmVkIHdoZW4gdGhlIGxhc3QgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgZXhpdHMuIFRoaXMgaXMgc286CiAgICAgICAqIGEuIGFueSBjYWNoZWQgYXJyYXkgcGF0aHMgKGUuZy4gJ2FycmF5LjMucHJvcCcpIG1heSBiZSBpbnZhbGlkYXRlZAogICAgICAgKiAgICBkdWUgdG8gYXJyYXkgbXV0YXRpb25zIGxpa2Ugc2hpZnQvdW5zaGlmdC9zcGxpY2U7IHRoaXMgaXMgZmluZQogICAgICAgKiAgICBzaW5jZSBwYXRoIGNoYW5nZXMgYXJlIGRpcnR5LWNoZWNrZWQgYXQgdXNlciBlbnRyeSBwb2ludHMgbGlrZSBgc2V0YAogICAgICAgKiBiLiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBvbmx5IGxhc3RzIG9uZSB0dXJuIHRvIGFsbG93IHRoZSB1c2VyCiAgICAgICAqICAgIHRvIG11dGF0ZSB0aGUgb2JqZWN0IGluLXBsYWNlIGFuZCByZS1zZXQgaXQgd2l0aCB0aGUgc2FtZSBpZGVudGl0eQogICAgICAgKiAgICBhbmQgaGF2ZSBhbGwgc3ViLXByb3BlcnRpZXMgcmUtcHJvcGFnYXRlZCBpbiBhIHN1YnNlcXVlbnQgdHVybi4KICAgICAgICoKICAgICAgICogVGhlIHRlbXAgY2FjaGUgaXMgbm90IG5lY2Vzc2FyaWx5IHN1ZmZpY2llbnQgdG8gcHJldmVudCBpbnZhbGlkIGFycmF5CiAgICAgICAqIHBhdGhzLCBzaW5jZSBhIHNwbGljZSBjYW4gaGFwcGVuIGR1cmluZyB0aGUgc2FtZSB0dXJuICh3aXRoIHBhdGhvbG9naWNhbAogICAgICAgKiB1c2VyIGNvZGUpOyB3ZSBjb3VsZCBpbnRyb2R1Y2UgYSAiZml4dXAiIGZvciB0ZW1wb3JhcmlseSBjYWNoZWQgYXJyYXkKICAgICAgICogcGF0aHMgaWYgbmVlZGVkOiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9wb2x5bWVyL2lzc3Vlcy80MjI3CiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkTm90aWZ5IFRydWUgaWYgcHJvcGVydHkgc2hvdWxkIGZpcmUgbm90aWZpY2F0aW9uCiAgICAgICAqICAgZXZlbnQgKGFwcGxpZXMgb25seSBmb3IgYG5vdGlmeTogdHJ1ZWAgcHJvcGVydGllcykKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSB7CiAgICAgICAgbGV0IGlzUGF0aCA9IHRoaXMuX19kYXRhSGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwcm9wZXJ0eSk7CiAgICAgICAgbGV0IHByZXZQcm9wcyA9IGlzUGF0aCA/IHRoaXMuX19kYXRhVGVtcCA6IHRoaXMuX19kYXRhOwogICAgICAgIGlmICh0aGlzLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIHByZXZQcm9wc1twcm9wZXJ0eV0pKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEVuc3VyZSBvbGQgaXMgY2FwdHVyZWQgZnJvbSB0aGUgbGFzdCB0dXJuCiAgICAgICAgICBpZiAoIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGRbcHJvcGVydHldID0gdGhpcy5fX2RhdGFbcHJvcGVydHldOwogICAgICAgICAgfQogICAgICAgICAgLy8gUGF0aHMgYXJlIHN0b3JlZCBpbiB0ZW1wb3JhcnkgY2FjaGUgKGNsZWFyZWQgYXQgZW5kIG9mIHR1cm4pLAogICAgICAgICAgLy8gd2hpY2ggaXMgdXNlZCBmb3IgZGlydHktY2hlY2tpbmcsIGFsbCBvdGhlcnMgc3RvcmVkIGluIF9fZGF0YQogICAgICAgICAgaWYgKGlzUGF0aCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9fZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFsbCBjaGFuZ2VzIGdvIGludG8gcGVuZGluZyBwcm9wZXJ0eSBiYWcsIHBhc3NlZCB0byBfcHJvcGVydGllc0NoYW5nZWQKICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIC8vIFRyYWNrIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgbm90aWZ5IHNlcGFyYXRlbHkKICAgICAgICAgIGlmIChpc1BhdGggfHwgKHRoaXNbVFlQRVMuTk9USUZZXSAmJiB0aGlzW1RZUEVTLk5PVElGWV1bcHJvcGVydHldKSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gdGhpcy5fX2RhdGFUb05vdGlmeSB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeVtwcm9wZXJ0eV0gPSBzaG91bGROb3RpZnk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gZW5zdXJlIGFsbCBhY2Nlc3NvcnMgc2V0IGBzaG91bGROb3RpZnlgCiAgICAgICAqIHRvIHRydWUsIGZvciBwZXItcHJvcGVydHkgbm90aWZpY2F0aW9uIHRyYWNraW5nLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHRydWUpKSB7CiAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcmAncyBkZWZhdWx0IGFzeW5jIHF1ZXVpbmcgb2YKICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGA6IGlmIGBfX2RhdGFSZWFkeWAgaXMgZmFsc2UgKGhhcyBub3QgeWV0IGJlZW4KICAgICAgICogbWFudWFsbHkgZmx1c2hlZCksIHRoZSBmdW5jdGlvbiBuby1vcHM7IG90aGVyd2lzZSBmbHVzaGVzCiAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIHN5bmNocm9ub3VzbHkuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyB0aGUgZ2l2ZW4gY2xpZW50IG9uIGEgbGlzdCBvZiBwZW5kaW5nIGNsaWVudHMsIHdob3NlCiAgICAgICAqIHBlbmRpbmcgcHJvcGVydHkgY2hhbmdlcyBjYW4gbGF0ZXIgYmUgZmx1c2hlZCB2aWEgYSBjYWxsIHRvCiAgICAgICAqIGBfZmx1c2hDbGllbnRzYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNsaWVudCBQcm9wZXJ0eUVmZmVjdHMgY2xpZW50IHRvIGVucXVldWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2VucXVldWVDbGllbnQoY2xpZW50KSB7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMgfHwgW107CiAgICAgICAgaWYgKGNsaWVudCAhPT0gdGhpcykgewogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cy5wdXNoKGNsaWVudCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24uCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgdGhpcy5fX2RhdGFDb3VudGVyKys7CiAgICAgICAgc3VwZXIuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIHRoaXMuX19kYXRhQ291bnRlci0tOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmx1c2hlcyBhbnkgY2xpZW50cyBwcmV2aW91c2x5IGVucXVldWVkIHZpYSBgX2VucXVldWVDbGllbnRgLCBjYXVzaW5nCiAgICAgICAqIHRoZWlyIGBfZmx1c2hQcm9wZXJ0aWVzYCBtZXRob2QgdG8gcnVuLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfZmx1c2hDbGllbnRzKCkgewogICAgICAgIGlmICghdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkpIHsKICAgICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5ID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX3JlYWR5Q2xpZW50cygpOwogICAgICAgICAgLy8gT3ZlcnJpZGUgcG9pbnQgd2hlcmUgYWNjZXNzb3JzIGFyZSB0dXJuZWQgb247IGltcG9ydGFudGx5LAogICAgICAgICAgLy8gdGhpcyBpcyBhZnRlciBjbGllbnRzIGhhdmUgZnVsbHkgcmVhZGllZCwgcHJvdmlkaW5nIGEgZ3VhcmFudGVlCiAgICAgICAgICAvLyB0aGF0IGFueSBwcm9wZXJ0eSBlZmZlY3RzIG9jY3VyIG9ubHkgYWZ0ZXIgYWxsIGNsaWVudHMgYXJlIHJlYWR5LgogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gTk9URTogV2UgZW5zdXJlIGNsaWVudHMgZWl0aGVyIGVuYWJsZSBvciBmbHVzaCBhcyBhcHByb3ByaWF0ZS4gVGhpcwogICAgICAvLyBoYW5kbGVzIHR3byBjb3JuZXIgY2FzZXM6CiAgICAgIC8vICgxKSBjbGllbnRzIGZsdXNoIHByb3Blcmx5IHdoZW4gY29ubmVjdGVkL2VuYWJsZWQgYmVmb3JlIHRoZSBob3N0CiAgICAgIC8vIGVuYWJsZXM7IGUuZy4KICAgICAgLy8gICAoYSkgVGVtcGxhdGl6ZSBzdGFtcHMgd2l0aCBubyBwcm9wZXJ0aWVzIGFuZCBkb2VzIG5vdCBmbHVzaCBhbmQKICAgICAgLy8gICAoYikgdGhlIGluc3RhbmNlIGlzIGluc2VydGVkIGludG8gZG9tIGFuZAogICAgICAvLyAgIChjKSB0aGVuIHRoZSBpbnN0YW5jZSBmbHVzaGVzLgogICAgICAvLyAoMikgY2xpZW50cyBlbmFibGUgcHJvcGVybHkgd2hlbiBub3QgY29ubmVjdGVkL2VuYWJsZWQgd2hlbiB0aGUgaG9zdAogICAgICAvLyBmbHVzaGVzOyBlLmcuCiAgICAgIC8vICAgKGEpIGEgdGVtcGxhdGUgaXMgcnVudGltZSBzdGFtcGVkIGFuZCBub3QgeWV0IGNvbm5lY3RlZC9lbmFibGVkCiAgICAgIC8vICAgKGIpIGEgaG9zdCBzZXRzIGEgcHJvcGVydHksIGNhdXNpbmcgc3RhbXBlZCBkb20gdG8gZmx1c2gKICAgICAgLy8gICAoYykgdGhlIHN0YW1wZWQgZG9tIGVuYWJsZXMuCiAgICAgIF9fZW5hYmxlT3JGbHVzaENsaWVudHMoKSB7CiAgICAgICAgbGV0IGNsaWVudHMgPSB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzOwogICAgICAgIGlmIChjbGllbnRzKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGNsaWVudCA9IGNsaWVudHNbaV07CiAgICAgICAgICAgIGlmICghY2xpZW50Ll9fZGF0YUVuYWJsZWQpIHsKICAgICAgICAgICAgICBjbGllbnQuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICAgIGNsaWVudC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQZXJmb3JtIGFueSBpbml0aWFsIHNldHVwIG9uIGNsaWVudCBkb20uIENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0CiAgICAgICAqIGBfZmx1c2hQcm9wZXJ0aWVzYCBjYWxsIG9uIGNsaWVudCBkb20gYW5kIGJlZm9yZSBhbnkgZWxlbWVudAogICAgICAgKiBvYnNlcnZlcnMgYXJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICB0aGlzLl9fZW5hYmxlT3JGbHVzaENsaWVudHMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSBiYWcgb2YgcHJvcGVydHkgY2hhbmdlcyB0byB0aGlzIGluc3RhbmNlLCBhbmQKICAgICAgICogc3luY2hyb25vdXNseSBwcm9jZXNzZXMgYWxsIGVmZmVjdHMgb2YgdGhlIHByb3BlcnRpZXMgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBzaW1wbGUgcHJvcGVydGllcywgbm90IHBhdGhzLiAgQmF0Y2hlZAogICAgICAgKiBwYXRoIHByb3BhZ2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2Ygb25lIG9yIG1vcmUga2V5LXZhbHVlIHBhaXJzIHdob3NlIGtleSBpcwogICAgICAgKiAgIGEgcHJvcGVydHkgYW5kIHZhbHVlIGlzIHRoZSBuZXcgdmFsdWUgdG8gc2V0IGZvciB0aGF0IHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXRSZWFkT25seSBXaGVuIHRydWUsIGFueSBwcml2YXRlIHZhbHVlcyBzZXQgaW4KICAgICAgICogICBgcHJvcHNgIHdpbGwgYmUgc2V0LiBCeSBkZWZhdWx0LCBgc2V0UHJvcGVydGllc2Agd2lsbCBub3Qgc2V0CiAgICAgICAqICAgYHJlYWRPbmx5OiB0cnVlYCByb290IHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNldFByb3BlcnRpZXMocHJvcHMsIHNldFJlYWRPbmx5KSB7CiAgICAgICAgZm9yIChsZXQgcGF0aCBpbiBwcm9wcykgewogICAgICAgICAgaWYgKHNldFJlYWRPbmx5IHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV0gfHwgIXRoaXNbVFlQRVMuUkVBRF9PTkxZXVtwYXRoXSkgewogICAgICAgICAgICAvL1RPRE8oa3NjaGFhZik6IGV4cGxpY2l0bHkgZGlzYWxsb3cgcGF0aHMgaW4gc2V0UHJvcGVydHk/CiAgICAgICAgICAgIC8vIHdpbGRjYXJkIG9ic2VydmVycyBjdXJyZW50bHkgb25seSBwYXNzIHRoZSBmaXJzdCBjaGFuZ2VkIHBhdGgKICAgICAgICAgICAgLy8gaW4gdGhlIGBpbmZvYCBvYmplY3QsIGFuZCB5b3UgY291bGQgZG8gc29tZSBvZGQgdGhpbmdzIGJhdGNoaW5nCiAgICAgICAgICAgIC8vIHBhdGhzLCBlLmcuIHsnZm9vLmJhcic6IHsuLi59LCAnZm9vJzogbnVsbH0KICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHByb3BzW3BhdGhdLCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcnNgIHNvIHRoYXQgcHJvcGVydHkgYWNjZXNzb3IKICAgICAgICogc2lkZSBlZmZlY3RzIGFyZSBub3QgZW5hYmxlZCB1bnRpbCBhZnRlciBjbGllbnQgZG9tIGlzIGZ1bGx5IHJlYWR5LgogICAgICAgKiBBbHNvIGNhbGxzIGBfZmx1c2hDbGllbnRzYCBjYWxsYmFjayB0byBlbnN1cmUgY2xpZW50IGRvbSBpcyBlbmFibGVkCiAgICAgICAqIHRoYXQgd2FzIG5vdCBlbmFibGVkIGFzIGEgcmVzdWx0IG9mIGZsdXNoaW5nIHByb3BlcnRpZXMuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgYHN1cGVyLnJlYWR5KClgIGlzIG5vdCBjYWxsZWQgaGVyZSBhcyBpdAogICAgICAgIC8vIGltbWVkaWF0ZWx5IHR1cm5zIG9uIGFjY2Vzc29ycy4gSW5zdGVhZCwgd2Ugd2FpdCB1bnRpbCBgcmVhZHlDbGllbnRzYAogICAgICAgIC8vIHRvIGVuYWJsZSBhY2Nlc3NvcnMgdG8gcHJvdmlkZSBhIGd1YXJhbnRlZSB0aGF0IGNsaWVudHMgYXJlIHJlYWR5CiAgICAgICAgLy8gYmVmb3JlIHByb2Nlc3NpbmcgYW55IGFjY2Vzc29ycyBzaWRlIGVmZmVjdHMuCiAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gSWYgbm8gZGF0YSB3YXMgcGVuZGluZywgYF9mbHVzaFByb3BlcnRpZXNgIHdpbGwgbm90IGBmbHVzaENsaWVudHNgCiAgICAgICAgLy8gc28gZW5zdXJlIHRoaXMgaXMgZG9uZS4KICAgICAgICBpZiAoIXRoaXMuX19kYXRhQ2xpZW50c1JlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICB9CiAgICAgICAgLy8gQmVmb3JlIHJlYWR5LCBjbGllbnQgbm90aWZpY2F0aW9ucyBkbyBub3QgdHJpZ2dlciBfZmx1c2hQcm9wZXJ0aWVzLgogICAgICAgIC8vIFRoZXJlZm9yZSBhIGZsdXNoIGlzIG5lY2Vzc2FyeSBoZXJlIGlmIGRhdGEgaGFzIGJlZW4gc2V0LgogICAgICAgIGlmICh0aGlzLl9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5QWNjZXNzb3JzYCdzIHByb3BlcnRpZXMgY2hhbmdlZCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogUnVucyBlYWNoIGNsYXNzIG9mIGVmZmVjdHMgZm9yIHRoZSBiYXRjaCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgaW4KICAgICAgICogYSBzcGVjaWZpYyBvcmRlciAoY29tcHV0ZSwgcHJvcGFnYXRlLCByZWZsZWN0LCBvYnNlcnZlLCBub3RpZnkpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGN1cnJlbnRQcm9wcyBCYWcgb2YgYWxsIGN1cnJlbnQgYWNjZXNzb3IgdmFsdWVzCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgZWFjaCBwcm9wZXJ0eQogICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcHJvcGVydGllc0NoYW5nZWQoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vIGxldCBjID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY2hhbmdlZFByb3BzIHx8IHt9KTsKICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gaWYgKHdpbmRvdy5kZWJ1ZykgeyBkZWJ1Z2dlcjsgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBsZXQgaGFzUGF0aHMgPSB0aGlzLl9fZGF0YUhhc1BhdGhzOwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHMgPSBmYWxzZTsKICAgICAgICAvLyBDb21wdXRlIHByb3BlcnRpZXMKICAgICAgICBydW5Db21wdXRlZEVmZmVjdHModGhpcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIENsZWFyIG5vdGlmeSBwcm9wZXJ0aWVzIHByaW9yIHRvIHBvc3NpYmxlIHJlZW50cnkgKHByb3BhZ2F0ZSwgb2JzZXJ2ZSksCiAgICAgICAgLy8gYnV0IGFmdGVyIGNvbXB1dGluZyBlZmZlY3RzIGhhdmUgYSBjaGFuY2UgdG8gYWRkIHRvIHRoZW0KICAgICAgICBsZXQgbm90aWZ5UHJvcHMgPSB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnkgPSBudWxsOwogICAgICAgIC8vIFByb3BhZ2F0ZSBwcm9wZXJ0aWVzIHRvIGNsaWVudHMKICAgICAgICB0aGlzLl9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIEZsdXNoIGNsaWVudHMKICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICAvLyBSZWZsZWN0IHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUkVGTEVDVF0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBPYnNlcnZlIHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuT0JTRVJWRV0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBOb3RpZnkgcHJvcGVydGllcyB0byBob3N0CiAgICAgICAgaWYgKG5vdGlmeVByb3BzKSB7CiAgICAgICAgICBydW5Ob3RpZnlFZmZlY3RzKHRoaXMsIG5vdGlmeVByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIHRlbXBvcmFyeSBjYWNoZSBhdCBlbmQgb2YgdHVybgogICAgICAgIGlmICh0aGlzLl9fZGF0YUNvdW50ZXIgPT0gMSkgewogICAgICAgICAgdGhpcy5fX2RhdGFUZW1wID0ge307CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cEVuZCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHByb3BhZ2F0ZSBhbnkgcHJvcGVydHkgY2hhbmdlcyB0byBzdGFtcGVkIHRlbXBsYXRlIG5vZGVzCiAgICAgICAqIG1hbmFnZWQgYnkgdGhpcyBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgICAgICBpZiAodGhpc1tUWVBFUy5QUk9QQUdBVEVdKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUFJPUEFHQVRFXSwgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgICB3aGlsZSAodGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsCiAgICAgICAgICAgIGhhc1BhdGhzLCB0ZW1wbGF0ZUluZm8ubm9kZUxpc3QpOwogICAgICAgICAgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm87CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQWxpYXNlcyBvbmUgZGF0YSBwYXRoIGFzIGFub3RoZXIsIHN1Y2ggdGhhdCBwYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSBvbmUKICAgICAgICogYXJlIHJvdXRlZCB0byB0aGUgb3RoZXIuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSB0byBUYXJnZXQgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gZnJvbSBTb3VyY2UgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBsaW5rUGF0aHModG8sIGZyb20pIHsKICAgICAgICB0byA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUodG8pOwogICAgICAgIGZyb20gPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKGZyb20pOwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzIHx8IHt9OwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHNbdG9dID0gZnJvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYSBkYXRhIHBhdGggYWxpYXMgcHJldmlvdXNseSBlc3RhYmxpc2hlZCB3aXRoIGBfbGlua1BhdGhzYC4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhlIHBhdGggdG8gdW5saW5rIHNob3VsZCBiZSB0aGUgdGFyZ2V0IChgdG9gKSB1c2VkIHdoZW4KICAgICAgICogbGlua2luZyB0aGUgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFRhcmdldCBwYXRoIHRvIHVubGluay4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgdW5saW5rUGF0aHMocGF0aCkgewogICAgICAgIHBhdGggPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKHBhdGgpOwogICAgICAgIGlmICh0aGlzLl9fZGF0YUxpbmtlZFBhdGhzKSB7CiAgICAgICAgICBkZWxldGUgdGhpcy5fX2RhdGFMaW5rZWRQYXRoc1twYXRoXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOb3RpZnkgdGhhdCBhbiBhcnJheSBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbXMgPSBbIHtuYW1lOiAnSmltJ30sIHtuYW1lOiAnVG9kZCd9LCB7bmFtZTogJ0JpbGwnfSBdOwogICAgICAgKiAgICAgLi4uCiAgICAgICAqICAgICB0aGlzLml0ZW1zLnNwbGljZSgxLCAxLCB7bmFtZTogJ1NhbSd9KTsKICAgICAgICogICAgIHRoaXMuaXRlbXMucHVzaCh7bmFtZTogJ0JvYid9KTsKICAgICAgICogICAgIHRoaXMubm90aWZ5U3BsaWNlcygnaXRlbXMnLCBbCiAgICAgICAqICAgICAgIHsgaW5kZXg6IDEsIHJlbW92ZWQ6IFt7bmFtZTogJ1RvZGQnfV0sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZScgfSwKICAgICAgICogICAgICAgeyBpbmRleDogMywgcmVtb3ZlZDogW10sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZSd9CiAgICAgICAqICAgICBdKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHtBcnJheX0gc3BsaWNlcyBBcnJheSBvZiBzcGxpY2UgcmVjb3JkcyBpbmRpY2F0aW5nIG9yZGVyZWQKICAgICAgICogICBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQgdG8gdGhlIGFycmF5LiBFYWNoIHJlY29yZCBzaG91bGQgaGF2ZSB0aGUKICAgICAgICogICBmb2xsb3dpbmcgZmllbGRzOgogICAgICAgKiAgICAqIGluZGV4OiBpbmRleCBhdCB3aGljaCB0aGUgY2hhbmdlIG9jY3VycmVkCiAgICAgICAqICAgICogcmVtb3ZlZDogYXJyYXkgb2YgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGlzIGluZGV4CiAgICAgICAqICAgICogYWRkZWRDb3VudDogbnVtYmVyIG9mIG5ldyBpdGVtcyBhZGRlZCBhdCB0aGlzIGluZGV4CiAgICAgICAqICAgICogb2JqZWN0OiBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgaW4gcXVlc3Rpb24KICAgICAgICogICAgKiB0eXBlOiB0aGUgc3RyaW5nIGxpdGVyYWwgJ3NwbGljZScKICAgICAgICoKICAgICAgICogICBOb3RlIHRoYXQgc3BsaWNlIHJlY29yZHMgX211c3RfIGJlIG5vcm1hbGl6ZWQgc3VjaCB0aGF0IHRoZXkgYXJlCiAgICAgICAqICAgcmVwb3J0ZWQgaW4gaW5kZXggb3JkZXIgKHJhdyByZXN1bHRzIGZyb20gYE9iamVjdC5vYnNlcnZlYCBhcmUgbm90CiAgICAgICAqICAgb3JkZXJlZCBhbmQgbXVzdCBiZSBub3JtYWxpemVkL21lcmdlZCBiZWZvcmUgbm90aWZ5aW5nKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlTcGxpY2VzKHBhdGgsIHNwbGljZXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbm90aWZ5U3BsaWNlcyh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzcGxpY2VzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgcmVhZGluZyBhIHZhbHVlIGZyb20gYSBwYXRoLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiBhbnkgcGFydCBpbiB0aGUgcGF0aCBpcyB1bmRlZmluZWQsIHRoaXMgbWV0aG9kIHJldHVybnMKICAgICAgICogYHVuZGVmaW5lZGAgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4gZGVyZWZlcmVuY2luZyB1bmRlZmluZWQKICAgICAgICogcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gcmVhZC4gIFRoZSBwYXRoIG1heSBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKGUuZy4gYGZvby5iYXIuYmF6YCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgdXNlcnMuMTIubmFtZWAgb3IgYFsndXNlcnMnLCAxMiwgJ25hbWUnXWApLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHJvb3QgUm9vdCBvYmplY3QgZnJvbSB3aGljaCB0aGUgcGF0aCBpcyBldmFsdWF0ZWQuCiAgICAgICAqIEByZXR1cm4geyp9IFZhbHVlIGF0IHRoZSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aAogICAgICAgKiAgIGlzIHVuZGVmaW5lZC4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgZ2V0KHBhdGgsIHJvb3QpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5QYXRoLmdldChyb290IHx8IHRoaXMsIHBhdGgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgdmFsdWUgdG8gYSBwYXRoIGFuZCBub3RpZnlpbmcgYW55CiAgICAgICAqIGVsZW1lbnRzIGJvdW5kIHRvIHRoZSBzYW1lIHBhdGguCiAgICAgICAqCiAgICAgICAqIE5vdGUsIGlmIGFueSBwYXJ0IGluIHRoZSBwYXRoIGV4Y2VwdCBmb3IgdGhlIGxhc3QgaXMgdW5kZWZpbmVkLAogICAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4KICAgICAgICogZGVyZWZlcmVuY2luZyB1bmRlZmluZWQgcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gd3JpdGUuICBUaGUgcGF0aCBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChlLmcuIGAnZm9vLmJhci5iYXonYCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgJ3VzZXJzLjEyLm5hbWUnYCBvciBgWyd1c2VycycsIDEyLCAnbmFtZSddYCkuCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSByb290IFJvb3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHBhdGggaXMgZXZhbHVhdGVkLgogICAgICAgKiAgIFdoZW4gc3BlY2lmaWVkLCBubyBub3RpZmljYXRpb24gd2lsbCBvY2N1ci4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBzZXQocGF0aCwgdmFsdWUsIHJvb3QpIHsKICAgICAgICBpZiAocm9vdCkgewogICAgICAgICAgUG9seW1lci5QYXRoLnNldChyb290LCBwYXRoLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghdGhpc1tUWVBFUy5SRUFEX09OTFldIHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV1bLyoqIEB0eXBlIHtzdHJpbmd9ICovKHBhdGgpXSkgewogICAgICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCB0cnVlKSkgewogICAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGl0ZW1zIG9udG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wdXNoYC4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgb3RoZXIgcGF0aHMgdG8gdGhlIHNhbWUgYXJyYXkgdGhhdCBhCiAgICAgICAqIHNwbGljZSBvY2N1cnJlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gYXJyYXkuCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gaXRlbXMgSXRlbXMgdG8gcHVzaCBvbnRvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHB1c2gocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0qLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgbGVuID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wdXNoKC4uLml0ZW1zKTsKICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgbGVuLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wb3BgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHJldHVybiB7Kn0gSXRlbSB0aGF0IHdhcyByZW1vdmVkLgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBwb3AocGF0aCkgewogICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICBsZXQgYXJyYXkgPSAvKiogQHR5cGUge0FycmF5fSAqLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgaGFkTGVuZ3RoID0gQm9vbGVhbihhcnJheS5sZW5ndGgpOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wb3AoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgYXJyYXkubGVuZ3RoLCAwLCBbcmV0XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdGFydGluZyBmcm9tIHRoZSBzdGFydCBpbmRleCBzcGVjaWZpZWQsIHJlbW92ZXMgMCBvciBtb3JlIGl0ZW1zCiAgICAgICAqIGZyb20gdGhlIGFycmF5IGFuZCBpbnNlcnRzIDAgb3IgbW9yZSBuZXcgaXRlbXMgaW4gdGhlaXIgcGxhY2UuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgSW5kZXggZnJvbSB3aGljaCB0byBzdGFydCByZW1vdmluZy9pbnNlcnRpbmcuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxldGVDb3VudCBOdW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlLgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbnRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgcmVtb3ZlZCBpdGVtcy4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgc3BsaWNlKHBhdGgsIHN0YXJ0LCBkZWxldGVDb3VudCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoIDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIC8vIE5vcm1hbGl6ZSBmYW5jeSBuYXRpdmUgc3BsaWNlIGhhbmRsaW5nIG9mIGNyYXp5IHN0YXJ0IHZhbHVlcwogICAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICAgIHN0YXJ0ID0gYXJyYXkubGVuZ3RoIC0gTWF0aC5mbG9vcigtc3RhcnQpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhcnQpIHsKICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCk7CiAgICAgICAgfQogICAgICAgIC8vIGFycmF5LnNwbGljZSBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKICAgICAgICAvLyB5b3UgcGFzcyBpbi4gVGhlcmVmb3JlLCBhcnJheS5zcGxpY2UoMCkgYW5kIGFycmF5LnNwbGljZSgwLCB1bmRlZmluZWQpCiAgICAgICAgLy8gZG8gZGlmZmVyZW50IHRoaW5ncy4gSW4gdGhlIGZvcm1lciwgdGhlIHdob2xlIGFycmF5IGlzIGNsZWFyZWQuIEluIHRoZQogICAgICAgIC8vIGxhdHRlciwgbm8gaXRlbXMgYXJlIHJlbW92ZWQuCiAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZGV0ZWN0IHdoZXRoZXIgMS4gb25lIG9mIHRoZSBhcmd1bWVudHMKICAgICAgICAvLyBpcyBhY3R1YWxseSBwYXNzZWQgaW4gYW5kIHRoZW4gMi4gZGV0ZXJtaW5lIGhvdyBtYW55IGFyZ3VtZW50cwogICAgICAgIC8vIHdlIHNob3VsZCBwYXNzIG9uIHRvIHRoZSBuYXRpdmUgYXJyYXkuc3BsaWNlCiAgICAgICAgLy8KICAgICAgICBsZXQgcmV0OwogICAgICAgIC8vIE9taXQgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGlmIHRoZXkgd2VyZSBub3QgcGFzc2VkIGluCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIHJldCA9IGFycmF5LnNwbGljZShzdGFydCk7CiAgICAgICAgLy8gRWl0aGVyIHN0YXJ0IHdhcyB1bmRlZmluZWQgYW5kIHRoZSBvdGhlcnMgd2VyZSBkZWZpbmVkLCBidXQgaW4gdGhpcwogICAgICAgIC8vIGNhc2Ugd2UgY2FuIHNhZmVseSBwYXNzIG9uIGFsbCBhcmd1bWVudHMKICAgICAgICAvLwogICAgICAgIC8vIE5vdGU6IHRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbm9uZSBvZiB0aGUgYXJndW1lbnRzIHdlcmUgcGFzc2VkIGluLAogICAgICAgIC8vIGUuZy4gdGhpcy5zcGxpY2UoJ2FycmF5JykuIEhvd2V2ZXIsIGlmIGJvdGggc3RhcnQgYW5kIGRlbGV0ZUNvdW50CiAgICAgICAgLy8gYXJlIHVuZGVmaW5lZCwgYXJyYXkuc3BsaWNlIHdpbGwgbm90IG1vZGlmeSB0aGUgYXJyYXkgKGFzIGV4cGVjdGVkKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5pdGVtcyk7CiAgICAgICAgfQogICAgICAgIC8vIEF0IHRoZSBlbmQsIGNoZWNrIHdoZXRoZXIgYW55IGl0ZW1zIHdlcmUgcGFzc2VkIGluIChlLmcuIGluc2VydGlvbnMpCiAgICAgICAgLy8gb3IgaWYgdGhlIHJldHVybiBhcnJheSBjb250YWlucyBpdGVtcyAoZS5nLiBkZWxldGlvbnMpLgogICAgICAgIC8vIE9ubHkgbm90aWZ5IGlmIGl0ZW1zIHdlcmUgYWRkZWQgb3IgZGVsZXRlZC4KICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIHx8IHJldC5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzdGFydCwgaXRlbXMubGVuZ3RoLCByZXQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSBhdCB0aGUgcGF0aCBzcGVjaWZpZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnBvcGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIHRoYXQgd2FzIHJlbW92ZWQuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNoaWZ0KHBhdGgpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IGhhZExlbmd0aCA9IEJvb2xlYW4oYXJyYXkubGVuZ3RoKTsKICAgICAgICBsZXQgcmV0ID0gYXJyYXkuc2hpZnQoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgMCwgMCwgW3JldF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQWRkcyBpdGVtcyBvbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICoKICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucHVzaGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbmZvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHVuc2hpZnQocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IHJldCA9IGFycmF5LnVuc2hpZnQoLi4uaXRlbXMpOwogICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCAwLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5vdGlmeSB0aGF0IGEgcGF0aCBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbS51c2VyLm5hbWUgPSAnQm9iJzsKICAgICAgICogICAgIHRoaXMubm90aWZ5UGF0aCgnaXRlbS51c2VyLm5hbWUnKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHsqPX0gdmFsdWUgVmFsdWUgYXQgdGhlIHBhdGggKG9wdGlvbmFsKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlQYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgbGV0IHByb3BQYXRoOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIEdldCB2YWx1ZSBpZiBub3Qgc3VwcGxpZWQKICAgICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICAgIHZhbHVlID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKTsKICAgICAgICAgIHByb3BQYXRoID0gaW5mby5wYXRoOwogICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggaWYgbmVlZGVkCiAgICAgICAgICBwcm9wUGF0aCA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUocGF0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByb3BQYXRoID0gLyoqIEB0eXBle3N0cmluZ30gKi8ocGF0aCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcFBhdGgsIHZhbHVlLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eWAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHByb3RlY3RlZFNldHRlciBDcmVhdGVzIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIKICAgICAgICogICB3aGVuIGB0cnVlYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcikgewogICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIGlmIChwcm90ZWN0ZWRTZXR0ZXIpIHsKICAgICAgICAgIHRoaXNbJ19zZXQnICsgdXBwZXIocHJvcGVydHkpXSA9IC8qKiBAdGhpcyB7UHJvcGVydHlFZmZlY3RzfSAqL2Z1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oKiwqKX0gbWV0aG9kIEZ1bmN0aW9uIG9yIG5hbWUgb2Ygb2JzZXJ2ZXIgbWV0aG9kIHRvIGNhbGwKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZHluYW1pY0ZuIFdoZXRoZXIgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBhcwogICAgICAgKiAgIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pIHsKICAgICAgICBsZXQgaW5mbyA9IHsgcHJvcGVydHksIG1ldGhvZCwgZHluYW1pY0ZuOiBCb29sZWFuKGR5bmFtaWNGbikgfTsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuT0JTRVJWRSwgewogICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogcHJvcGVydHl9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGR5bmFtaWNGbikgewogICAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QoLyoqIEB0eXBlIHtzdHJpbmd9ICovKG1ldGhvZCksIFRZUEVTLk9CU0VSVkUsIHsKICAgICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogbWV0aG9kfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZU1ldGhvZE9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgb2JzZXJ2ZXIgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5PQlNFUlZFLCBydW5NZXRob2RFZmZlY3QsIG51bGwsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlTm90aWZ5aW5nUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuTk9USUZZLCB7CiAgICAgICAgICBmbjogcnVuTm90aWZ5RWZmZWN0LAogICAgICAgICAgaW5mbzogewogICAgICAgICAgICBldmVudE5hbWU6IENhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KSArICctY2hhbmdlZCcsCiAgICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgbGV0IGF0dHIgPSB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgaWYgKGF0dHJbMF0gPT09ICctJykgewogICAgICAgICAgY29uc29sZS53YXJuKCdQcm9wZXJ0eSAnICsgcHJvcGVydHkgKyAnIGNhbm5vdCBiZSByZWZsZWN0ZWQgdG8gYXR0cmlidXRlICcgKwogICAgICAgICAgICBhdHRyICsgJyBiZWNhdXNlICItIiBpcyBub3QgYSB2YWxpZCBzdGFydGluZyBhdHRyaWJ1dGUgbmFtZS4gVXNlIGEgbG93ZXJjYXNlIGZpcnN0IGxldHRlciBmb3IgdGhlIHByb3BlcnR5IGluc3RlYWQuJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUZMRUNULCB7CiAgICAgICAgICAgIGZuOiBydW5SZWZsZWN0RWZmZWN0LAogICAgICAgICAgICBpbmZvOiB7CiAgICAgICAgICAgICAgYXR0ck5hbWU6IGF0dHIKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZUNvbXB1dGVkUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgY29tcHV0ZWQgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5DT01QVVRFLCBydW5Db21wdXRlZEVmZmVjdCwgcHJvcGVydHksIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBHYXRoZXIgdGhlIGFyZ3VtZW50IHZhbHVlcyBmb3IgYSBtZXRob2Qgc3BlY2lmaWVkIGluIHRoZSBwcm92aWRlZCBhcnJheQogICAgICAgKiBvZiBhcmd1bWVudCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGhlIGBwYXRoYCBhbmQgYHZhbHVlYCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gZmlsbCBpbiB3aWxkY2FyZCBkZXNjcmlwdG9yCiAgICAgICAqIHdoZW4gdGhlIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYXMgYSByZXN1bHQgb2YgYSBwYXRoIG5vdGlmaWNhdGlvbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshQXJyYXk8IU1ldGhvZEFyZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgbWV0YWRhdGEKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUHJvcGVydHkvcGF0aCBuYW1lIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXRob2QgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEByZXR1cm4ge0FycmF5PCo+fSBBcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9tYXJzaGFsQXJncyhhcmdzLCBwYXRoLCBwcm9wcykgewogICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9fZGF0YTsKICAgICAgICBsZXQgdmFsdWVzID0gW107CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPWFyZ3MubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgbGV0IGFyZyA9IGFyZ3NbaV07CiAgICAgICAgICBsZXQgbmFtZSA9IGFyZy5uYW1lOwogICAgICAgICAgbGV0IHY7CiAgICAgICAgICBpZiAoYXJnLmxpdGVyYWwpIHsKICAgICAgICAgICAgdiA9IGFyZy52YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhcmcuc3RydWN0dXJlZCkgewogICAgICAgICAgICAgIHYgPSBQb2x5bWVyLlBhdGguZ2V0KGRhdGEsIG5hbWUpOwogICAgICAgICAgICAgIC8vIHdoZW4gZGF0YSBpcyBub3Qgc3RvcmVkIGUuZy4gYHNwbGljZXNgCiAgICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdiA9IHByb3BzW25hbWVdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2ID0gZGF0YVtuYW1lXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGFyZy53aWxkY2FyZCkgewogICAgICAgICAgICAvLyBPbmx5IHNlbmQgdGhlIGFjdHVhbCBwYXRoIGNoYW5nZWQgaW5mbyBpZiB0aGUgY2hhbmdlIHRoYXQKICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSBvYnNlcnZlciB0byBydW4gbWF0Y2hlZCB0aGUgd2lsZGNhcmQKICAgICAgICAgICAgbGV0IGJhc2VDaGFuZ2VkID0gKG5hbWUuaW5kZXhPZihwYXRoICsgJy4nKSA9PT0gMCk7CiAgICAgICAgICAgIGxldCBtYXRjaGVzID0gKHBhdGguaW5kZXhPZihuYW1lKSA9PT0gMCAmJiAhYmFzZUNoYW5nZWQpOwogICAgICAgICAgICB2YWx1ZXNbaV0gPSB7CiAgICAgICAgICAgICAgcGF0aDogbWF0Y2hlcyA/IHBhdGggOiBuYW1lLAogICAgICAgICAgICAgIHZhbHVlOiBtYXRjaGVzID8gcHJvcHNbcGF0aF0gOiB2LAogICAgICAgICAgICAgIGJhc2U6IHYKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgIH0KCiAgICAgIC8vIC0tIHN0YXRpYyBjbGFzcyBtZXRob2RzIC0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVuc3VyZXMgYW4gYWNjZXNzb3IgZXhpc3RzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LCBhbmQgYWRkcwogICAgICAgKiB0byBhIGxpc3Qgb2YgInByb3BlcnR5IGVmZmVjdHMiIHRoYXQgd2lsbCBydW4gd2hlbiB0aGUgYWNjZXNzb3IgZm9yCiAgICAgICAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgc2V0LiAgRWZmZWN0cyBhcmUgZ3JvdXBlZCBieSAidHlwZSIsIHdoaWNoCiAgICAgICAqIHJvdWdobHkgY29ycmVzcG9uZHMgdG8gYSBwaGFzZSBpbiBlZmZlY3QgcHJvY2Vzc2luZy4gIFRoZSBlZmZlY3QKICAgICAgICogbWV0YWRhdGEgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybToKICAgICAgICoKICAgICAgICogICAgIHsKICAgICAgICogICAgICAgZm46IGVmZmVjdEZ1bmN0aW9uLCAvLyBSZWZlcmVuY2UgdG8gZnVuY3Rpb24gdG8gY2FsbCB0byBwZXJmb3JtIGVmZmVjdAogICAgICAgKiAgICAgICBpbmZvOiB7IC4uLiB9ICAgICAgIC8vIEVmZmVjdCBtZXRhZGF0YSBwYXNzZWQgdG8gZnVuY3Rpb24KICAgICAgICogICAgICAgdHJpZ2dlcjogeyAgICAgICAgICAvLyBPcHRpb25hbCB0cmlnZ2VyaW5nIG1ldGFkYXRhOyBpZiBub3QgcHJvdmlkZWQKICAgICAgICogICAgICAgICBuYW1lOiBzdHJpbmcgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgdHJlYXRlZCBhcyBhIHdpbGRjYXJkCiAgICAgICAqICAgICAgICAgc3RydWN0dXJlZDogYm9vbGVhbgogICAgICAgKiAgICAgICAgIHdpbGRjYXJkOiBib29sZWFuCiAgICAgICAqICAgICAgIH0KICAgICAgICogICAgIH0KICAgICAgICoKICAgICAgICogRWZmZWN0cyBhcmUgY2FsbGVkIGZyb20gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBieQogICAgICAgKiB0eXBlOgogICAgICAgKgogICAgICAgKiAxLiBDT01QVVRFCiAgICAgICAqIDIuIFBST1BBR0FURQogICAgICAgKiAzLiBSRUZMRUNUCiAgICAgICAqIDQuIE9CU0VSVkUKICAgICAgICogNS4gTk9USUZZCiAgICAgICAqCiAgICAgICAqIEVmZmVjdCBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgogICAgICAgKgogICAgICAgKiAgICAgZWZmZWN0RnVuY3Rpb24oaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBpbmZvLCBoYXNQYXRocykKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBhZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCB0eXBlLCBlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIHNpbmdsZS1wcm9wZXJ0eSBvYnNlcnZlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbigqLCopfSBtZXRob2QgRnVuY3Rpb24gb3IgbmFtZSBvZiBvYnNlcnZlciBtZXRob2QgdG8gY2FsbAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBkeW5hbWljRm4gV2hldGhlciB0aGUgbWV0aG9kIG5hbWUgc2hvdWxkIGJlIGluY2x1ZGVkIGFzCiAgICAgICAqICAgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgbXVsdGktcHJvcGVydHkgIm1ldGhvZCBvYnNlcnZlciIgYmFzZWQgb24gdGhlIHByb3ZpZGVkCiAgICAgICAqIGV4cHJlc3Npb24sIHdoaWNoIHNob3VsZCBiZSBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiBhIG5vcm1hbCBKYXZhU2NyaXB0CiAgICAgICAqIGZ1bmN0aW9uIHNpZ25hdHVyZTogYCdtZXRob2ROYW1lKGFyZzEsIFsuLi4sIGFyZ25dKSdgLiAgRWFjaCBhcmd1bWVudAogICAgICAgKiBzaG91bGQgY29ycmVzcG9uZCB0byBhIHByb3BlcnR5IG9yIHBhdGggaW4gdGhlIGNvbnRleHQgb2YgdGhpcwogICAgICAgKiBwcm90b3R5cGUgKG9yIGluc3RhbmNlKSwgb3IgbWF5IGJlIGEgbGl0ZXJhbCBzdHJpbmcgb3IgbnVtYmVyLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBNZXRob2QgZXhwcmVzc2lvbgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW58T2JqZWN0PX0gZHluYW1pY0ZuIEJvb2xlYW4gb3Igb2JqZWN0IG1hcCBpbmRpY2F0aW5nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqICAgd2hldGhlciBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlTWV0aG9kT2JzZXJ2ZXIoZXhwcmVzc2lvbiwgZHluYW1pY0ZuKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIGRpc3BhdGNoIGA8cHJvcGVydHk+LWNoYW5nZWRgCiAgICAgICAqIGV2ZW50cyB0byBub3RpZnkgb2YgY2hhbmdlcyB0byB0aGUgcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIFRvIHNldCB0aGUgcHJvcGVydHksIHVzZSB0aGUgcHJvdGVjdGVkIGBfc2V0UHJvcGVydHlgIEFQSS4KICAgICAgICogVG8gY3JlYXRlIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIgKGUuZy4gYF9zZXRNeVByb3AoKWAgZm9yCiAgICAgICAqIHByb3BlcnR5IGBteVByb3BgKSwgcGFzcyBgdHJ1ZWAgZm9yIGBwcm90ZWN0ZWRTZXR0ZXJgLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiB0aGUgcHJvcGVydHkgd2lsbCBoYXZlIG90aGVyIHByb3BlcnR5IGVmZmVjdHMsIHRoaXMgbWV0aG9kCiAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhZGRpbmcgb3RoZXIgZWZmZWN0cy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcHJvdGVjdGVkU2V0dGVyIENyZWF0ZXMgYSBjdXN0b20gcHJvdGVjdGVkIHNldHRlcgogICAgICAgKiAgIHdoZW4gYHRydWVgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShwcm9wZXJ0eSwgcHJvdGVjdGVkU2V0dGVyKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIHJlZmxlY3QgdGhlIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIHRvIGEgKGRhc2gtY2FzZWQpIGF0dHJpYnV0ZSBvZiB0aGUgc2FtZSBuYW1lLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIHNldCB0byB0aGUgcmVzdWx0IG9mIHRoZQogICAgICAgKiBtZXRob2QgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBgZXhwcmVzc2lvbmAgZWFjaCB0aW1lIG9uZSBvciBtb3JlCiAgICAgICAqIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kIGNoYW5nZXMuICBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgYSBzdHJpbmcKICAgICAgICogaW4gdGhlIGZvcm0gb2YgYSBub3JtYWwgSmF2YVNjcmlwdCBmdW5jdGlvbiBzaWduYXR1cmU6CiAgICAgICAqIGAnbWV0aG9kTmFtZShhcmcxLCBbLi4uLCBhcmduXSknYAogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICAgICAqICAgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KHByb3BlcnR5LCBleHByZXNzaW9uLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSB0byBlbnN1cmUgYmluZGluZyBlZmZlY3RzIGFyZSBjcmVhdGVkCiAgICAgICAqIGZvciB0aGVtLCBhbmQgdGhlbiBlbnN1cmVzIHByb3BlcnR5IGFjY2Vzc29ycyBhcmUgY3JlYXRlZCBmb3IgYW55CiAgICAgICAqIGRlcGVuZGVudCBwcm9wZXJ0aWVzIGluIHRoZSB0ZW1wbGF0ZS4gIEJpbmRpbmcgZWZmZWN0cyBmb3IgYm91bmQKICAgICAgICogdGVtcGxhdGVzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBvbiB0aGUgaW5zdGFuY2Ugc28gdGhhdAogICAgICAgKiB0ZW1wbGF0ZXMgY2FuIGJlIGVmZmljaWVudGx5IHN0YW1wZWQgYW5kIHVuc3RhbXBlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgY29udGFpbmluZyBiaW5kaW5nCiAgICAgICAqICAgYmluZGluZ3MKICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBiaW5kVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgIH0KCiAgICAgIC8vIC0tIGJpbmRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBiaW5kVGVtcGxhdGVgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG9uIHRoZSBwcm90b3R5cGUgKGZvciBwcm90b3R5cGljYWwgdGVtcGxhdGUKICAgICAgICogYmluZGluZywgdG8gYXZvaWQgY3JlYXRpbmcgYWNjZXNzb3JzIGV2ZXJ5IGluc3RhbmNlKSBvbmNlIHBlciBwcm90b3R5cGUsCiAgICAgICAqIGFuZCB3aWxsIGJlIGNhbGxlZCB3aXRoIGBydW50aW1lQmluZGluZzogdHJ1ZWAgYnkgYF9zdGFtcFRlbXBsYXRlYCB0bwogICAgICAgKiBjcmVhdGUgYW5kIGxpbmsgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhCiAgICAgICAqIHBhcnRpY3VsYXIgc3RhbXBpbmcuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIGNvbnRhaW5pbmcgYmluZGluZwogICAgICAgKiAgIGJpbmRpbmdzCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGluc3RhbmNlQmluZGluZyBXaGVuIGZhbHNlIChkZWZhdWx0KSwgcGVyZm9ybXMKICAgICAgICogICAicHJvdG90eXBpY2FsIiBiaW5kaW5nIG9mIHRoZSB0ZW1wbGF0ZSBhbmQgb3ZlcndyaXRlcyBhbnkgcHJldmlvdXNseQogICAgICAgKiAgIGJvdW5kIHRlbXBsYXRlIGZvciB0aGUgY2xhc3MuIFdoZW4gdHJ1ZSAoYXMgcGFzc2VkIGZyb20KICAgICAgICogICBgX3N0YW1wVGVtcGxhdGVgKSwgdGhlIHRlbXBsYXRlIGluZm8gaXMgaW5zdGFuY2VkIGFuZCBsaW5rZWQgaW50bwogICAgICAgKiAgIHRoZSBsaXN0IG9mIGJvdW5kIHRlbXBsYXRlcy4KICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0OyBmb3IgYHJ1bnRpbWVCaW5kaW5nYCwKICAgICAgICogICB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBwcm90b3R5cGljYWwgdGVtcGxhdGUgaW5mbwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfYmluZFRlbXBsYXRlKHRlbXBsYXRlLCBpbnN0YW5jZUJpbmRpbmcpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IHdhc1ByZUJvdW5kID0gdGhpcy5fX3RlbXBsYXRlSW5mbyA9PSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBzaW5jZSB0aGlzIGlzIGNhbGxlZCB0d2ljZSBmb3IgcHJvdG8tYm91bmQgdGVtcGxhdGVzLAogICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gcmVjcmVhdGUgYWNjZXNzb3JzIGlmIHRoaXMgdGVtcGxhdGUgd2FzIHByZS1ib3VuZAogICAgICAgIGlmICghd2FzUHJlQm91bmQpIHsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gdGVtcGxhdGVJbmZvLnByb3BlcnR5RWZmZWN0cykgewogICAgICAgICAgICB0aGlzLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaW5zdGFuY2VCaW5kaW5nKSB7CiAgICAgICAgICAvLyBGb3IgaW5zdGFuY2UtdGltZSBiaW5kaW5nLCBjcmVhdGUgaW5zdGFuY2Ugb2YgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICAgIC8vIGFuZCBsaW5rIGludG8gbGlzdCBvZiB0ZW1wbGF0ZXMgaWYgbmVjZXNzYXJ5CiAgICAgICAgICB0ZW1wbGF0ZUluZm8gPSAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovKE9iamVjdC5jcmVhdGUodGVtcGxhdGVJbmZvKSk7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ud2FzUHJlQm91bmQgPSB3YXNQcmVCb3VuZDsKICAgICAgICAgIGlmICghd2FzUHJlQm91bmQgJiYgdGhpcy5fX3RlbXBsYXRlSW5mbykgewogICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0IHx8IHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgICAgICAgIHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0ID0gbGFzdC5uZXh0VGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8gPSBsYXN0OwogICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVJbmZvOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX3RlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgYSBwcm9wZXJ0eSBlZmZlY3QgdG8gdGhlIGdpdmVuIHRlbXBsYXRlIG1ldGFkYXRhLCB3aGljaCBpcyBydW4KICAgICAgICogYXQgdGhlICJwcm9wYWdhdGUiIHN0YWdlIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHdoZW4gdGhlIHRlbXBsYXRlCiAgICAgICAqIGhhcyBiZWVuIGJvdW5kIHRvIHRoZSBlbGVtZW50IHZpYSBgX2JpbmRUZW1wbGF0ZWAuCiAgICAgICAqCiAgICAgICAqIFRoZSBgZWZmZWN0YCBvYmplY3Qgc2hvdWxkIG1hdGNoIHRoZSBmb3JtYXQgaW4gYF9hZGRQcm9wZXJ0eUVmZmVjdGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgdG8gYWRkIGVmZmVjdCB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCBwcm9wLCBlZmZlY3QpIHsKICAgICAgICBsZXQgaG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgfHwge307CiAgICAgICAgaG9zdFByb3BzW3Byb3BdID0gdHJ1ZTsKICAgICAgICBsZXQgZWZmZWN0cyA9IHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMgPSB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzIHx8IHt9OwogICAgICAgIGxldCBwcm9wRWZmZWN0cyA9IGVmZmVjdHNbcHJvcF0gPSBlZmZlY3RzW3Byb3BdIHx8IFtdOwogICAgICAgIHByb3BFZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFN0YW1wcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgYW5kIHBlcmZvcm1zIGluc3RhbmNlLXRpbWUgc2V0dXAgZm9yCiAgICAgICAqIFBvbHltZXIgdGVtcGxhdGUgZmVhdHVyZXMsIGluY2x1ZGluZyBkYXRhIGJpbmRpbmdzLCBkZWNsYXJhdGl2ZSBldmVudAogICAgICAgKiBsaXN0ZW5lcnMsIGFuZCB0aGUgYHRoaXMuJGAgbWFwIG9mIGBpZGAncyB0byBub2Rlcy4gIEEgZG9jdW1lbnQgZnJhZ21lbnQKICAgICAgICogaXMgcmV0dXJuZWQgY29udGFpbmluZyB0aGUgc3RhbXBlZCBET00sIHJlYWR5IGZvciBpbnNlcnRpb24gaW50byB0aGUKICAgICAgICogRE9NLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlOyBob3dldmVyIG5vdGUgdGhhdCBkdWUgdG8KICAgICAgICogYHNoYWR5Y3NzYCBwb2x5ZmlsbCBsaW1pdGF0aW9ucywgb25seSBzdHlsZXMgZnJvbSB0ZW1wbGF0ZXMgcHJlcGFyZWQKICAgICAgICogdXNpbmcgYFNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZWAgd2lsbCBiZSBjb3JyZWN0bHkgcG9seWZpbGxlZCAoc2NvcGVkCiAgICAgICAqIHRvIHRoZSBzaGFkb3cgcm9vdCBhbmQgc3VwcG9ydCBDU1MgY3VzdG9tIHByb3BlcnRpZXMpLCBhbmQgbm90ZSB0aGF0CiAgICAgICAqIGBTaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVgIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBlbGVtZW50LiBBcyBzdWNoLAogICAgICAgKiBhbnkgc3R5bGVzIHJlcXVpcmVkIGJ5IGluIHJ1bnRpbWUtc3RhbXBlZCB0ZW1wbGF0ZXMgbXVzdCBiZSBpbmNsdWRlZAogICAgICAgKiBpbiB0aGUgbWFpbiBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBFbnN1cmVzIHRoYXQgY3JlYXRlZCBkb20gaXMgYF9lbnF1ZXVlQ2xpZW50YCdkIHRvIHRoaXMgZWxlbWVudCBzbwogICAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIGZsdXNoZWQgb24gbmV4dCBjYWxsIHRvIGBfZmx1c2hQcm9wZXJ0aWVzYAogICAgICAgIGhvc3RTdGFjay5iZWdpbkhvc3RpbmcodGhpcyk7CiAgICAgICAgbGV0IGRvbSA9IHN1cGVyLl9zdGFtcFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICBob3N0U3RhY2suZW5kSG9zdGluZyh0aGlzKTsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLyh0aGlzLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUsIHRydWUpKTsKICAgICAgICAvLyBBZGQgdGVtcGxhdGUtaW5zdGFuY2Utc3BlY2lmaWMgZGF0YSB0byBpbnN0YW5jZWQgdGVtcGxhdGVJbmZvCiAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVMaXN0ID0gZG9tLm5vZGVMaXN0OwogICAgICAgIC8vIENhcHR1cmUgY2hpbGQgbm9kZXMgdG8gYWxsb3cgdW5zdGFtcGluZyBvZiBub24tcHJvdG90eXBpY2FsIHRlbXBsYXRlcwogICAgICAgIGlmICghdGVtcGxhdGVJbmZvLndhc1ByZUJvdW5kKSB7CiAgICAgICAgICBsZXQgbm9kZXMgPSB0ZW1wbGF0ZUluZm8uY2hpbGROb2RlcyA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj1kb20uZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIG5vZGVzLnB1c2gobik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRvbS50ZW1wbGF0ZUluZm8gPSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gU2V0dXAgY29tcG91bmQgc3RvcmFnZSwgMi13YXkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QgZm9yIGJpbmRpbmdzCiAgICAgICAgc2V0dXBCaW5kaW5ncyh0aGlzLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIC8vIEZsdXNoIHByb3BlcnRpZXMgaW50byB0ZW1wbGF0ZSBub2RlcyBpZiBhbHJlYWR5IGJvb3RlZAogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIHRoaXMuX19kYXRhLCBudWxsLAogICAgICAgICAgICBmYWxzZSwgdGVtcGxhdGVJbmZvLm5vZGVMaXN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW5kIHVuYmluZHMgdGhlIG5vZGVzIHByZXZpb3VzbHkgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZAogICAgICAgKiBEb2N1bWVudEZyYWdtZW50IHJldHVybmVkIGZyb20gYF9zdGFtcFRlbXBsYXRlYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshU3RhbXBlZFRlbXBsYXRlfSBkb20gRG9jdW1lbnRGcmFnbWVudCBwcmV2aW91c2x5IHJldHVybmVkCiAgICAgICAqICAgZnJvbSBgX3N0YW1wVGVtcGxhdGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfcmVtb3ZlQm91bmREb20oZG9tKSB7CiAgICAgICAgLy8gVW5saW5rIHRlbXBsYXRlIGluZm8KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gZG9tLnRlbXBsYXRlSW5mbzsKICAgICAgICBpZiAodGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8ubmV4dFRlbXBsYXRlSW5mbyA9CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8pIHsKICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0KICAgICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRlSW5mb0xhc3QgPT0gdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0aGlzLl9fdGVtcGxhdGVJbmZvTGFzdCA9IHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbzsKICAgICAgICB9CiAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8gPSBudWxsOwogICAgICAgIC8vIFJlbW92ZSBzdGFtcGVkIG5vZGVzCiAgICAgICAgbGV0IG5vZGVzID0gdGVtcGxhdGVJbmZvLmNoaWxkTm9kZXM7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogcGFyc2luZyBiaW5kaW5ncyBmcm9tIGBUZXh0Tm9kZWAncycgYHRleHRDb250ZW50YC4gIEEgYGJpbmRpbmdzYAogICAgICAgKiBhcnJheSBpcyBhZGRlZCB0byBgbm9kZUluZm9gIGFuZCBwb3B1bGF0ZWQgd2l0aCBiaW5kaW5nIG1ldGFkYXRhCiAgICAgICAqIHdpdGggaW5mb3JtYXRpb24gY2FwdHVyaW5nIHRoZSBiaW5kaW5nIHRhcmdldCwgYW5kIGEgYHBhcnRzYCBhcnJheQogICAgICAgKiB3aXRoIG9uZSBvciBtb3JlIG1ldGFkYXRhIG9iamVjdHMgY2FwdHVyaW5nIHRoZSBzb3VyY2Uocykgb2YgdGhlCiAgICAgICAqIGJpbmRpbmcuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgbGV0IHBhcnRzID0gdGhpcy5fcGFyc2VCaW5kaW5ncyhub2RlLnRleHRDb250ZW50LCB0ZW1wbGF0ZUluZm8pOwogICAgICAgICAgaWYgKHBhcnRzKSB7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHRDb250ZW50IHdpdGggYW55IGxpdGVyYWwgcGFydHMKICAgICAgICAgICAgLy8gTk9URTogZGVmYXVsdCB0byBhIHNwYWNlIGhlcmUgc28gdGhlIHRleHROb2RlIHJlbWFpbnM7IHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgLy8gKElFKSBvbWl0IGFuIGVtcHR5IHRleHROb2RlIGZvbGxvd2luZyBjbG9uZU5vZGUvaW1wb3J0Tm9kZS4KICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpIHx8ICcgJzsKICAgICAgICAgICAgYWRkQmluZGluZyh0aGlzLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCAndGV4dCcsICd0ZXh0Q29udGVudCcsIHBhcnRzKTsKICAgICAgICAgICAgbm90ZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAqIHBhcnNpbmcgYmluZGluZ3MgZnJvbSBhdHRyaWJ1dGVzLiAgQSBgYmluZGluZ3NgCiAgICAgICAqIGFycmF5IGlzIGFkZGVkIHRvIGBub2RlSW5mb2AgYW5kIHBvcHVsYXRlZCB3aXRoIGJpbmRpbmcgbWV0YWRhdGEKICAgICAgICogd2l0aCBpbmZvcm1hdGlvbiBjYXB0dXJpbmcgdGhlIGJpbmRpbmcgdGFyZ2V0LCBhbmQgYSBgcGFydHNgIGFycmF5CiAgICAgICAqIHdpdGggb25lIG9yIG1vcmUgbWV0YWRhdGEgb2JqZWN0cyBjYXB0dXJpbmcgdGhlIHNvdXJjZShzKSBvZiB0aGUKICAgICAgICogYmluZGluZy4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEF0dHJpYnV0ZSBuYW1lCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpIHsKICAgICAgICBsZXQgcGFydHMgPSB0aGlzLl9wYXJzZUJpbmRpbmdzKHZhbHVlLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIGlmIChwYXJ0cykgewogICAgICAgICAgLy8gQXR0cmlidXRlIG9yIHByb3BlcnR5CiAgICAgICAgICBsZXQgb3JpZ05hbWUgPSBuYW1lOwogICAgICAgICAgbGV0IGtpbmQgPSAncHJvcGVydHknOwogICAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHdlIHNlZSBhIGNhcGl0YWwgbGV0dGVyIGhlcmUgaXMgaWYgdGhlIGF0dHIgaGFzCiAgICAgICAgICAvLyBhIGNhcGl0YWwgbGV0dGVyIGluIGl0IHBlciBzcGVjLiBJbiB0aGlzIGNhc2UsIHRvIG1ha2Ugc3VyZQogICAgICAgICAgLy8gdGhpcyBiaW5kaW5nIHdvcmtzLCB3ZSBnbyBhaGVhZCBhbmQgbWFrZSB0aGUgYmluZGluZyB0byB0aGUgYXR0cmlidXRlLgogICAgICAgICAgaWYgKGNhcGl0YWxBdHRyaWJ1dGVSZWdleC50ZXN0KG5hbWUpKSB7CiAgICAgICAgICAgIGtpbmQgPSAnYXR0cmlidXRlJzsKICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVtuYW1lLmxlbmd0aC0xXSA9PSAnJCcpIHsKICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgLTEpOwogICAgICAgICAgICBraW5kID0gJ2F0dHJpYnV0ZSc7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbml0aWFsaXplIGF0dHJpYnV0ZSBiaW5kaW5ncyB3aXRoIGFueSBsaXRlcmFsIHBhcnRzCiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpOwogICAgICAgICAgaWYgKGxpdGVyYWwgJiYga2luZCA9PSAnYXR0cmlidXRlJykgewogICAgICAgICAgICAvLyBFbnN1cmUgYSBTaGFkeUNTUyB0ZW1wbGF0ZSBzY29wZWQgc3R5bGUgaXMgbm90IHJlbW92ZWQKICAgICAgICAgICAgLy8gd2hlbiBhIGNsYXNzJCBiaW5kaW5nJ3MgaW5pdGlhbCBsaXRlcmFsIHZhbHVlIGlzIHNldC4KICAgICAgICAgICAgaWYgKG5hbWUgPT0gJ2NsYXNzJyAmJiBub2RlLmhhc0F0dHJpYnV0ZSgnY2xhc3MnKSkgewogICAgICAgICAgICAgIGxpdGVyYWwgKz0gJyAnICsgbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgbGl0ZXJhbCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDbGVhciBhdHRyaWJ1dGUgYmVmb3JlIHJlbW92aW5nLCBzaW5jZSBJRSB3b24ndCBhbGxvdyByZW1vdmluZwogICAgICAgICAgLy8gYHZhbHVlYCBhdHRyaWJ1dGUgaWYgaXQgcHJldmlvdXNseSBoYWQgYSB2YWx1ZSAoY2FuJ3QKICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSBzZXQgJycgYmVmb3JlIHJlbW92aW5nIHNpbmNlIGF0dHJpYnV0ZXMgd2l0aCBgJGAKICAgICAgICAgIC8vIGNhbid0IGJlIHNldCB1c2luZyBzZXRBdHRyaWJ1dGUpCiAgICAgICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT09ICdpbnB1dCcgJiYgb3JpZ05hbWUgPT09ICd2YWx1ZScpIHsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUob3JpZ05hbWUsICcnKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFJlbW92ZSBhbm5vdGF0aW9uCiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShvcmlnTmFtZSk7CiAgICAgICAgICAvLyBDYXNlIGhhY2tlcnk6IGF0dHJpYnV0ZXMgYXJlIGxvd2VyLWNhc2UsIGJ1dCBiaW5kIHRhcmdldHMKICAgICAgICAgIC8vIChwcm9wZXJ0aWVzKSBhcmUgY2FzZSBzZW5zaXRpdmUuIEdhbWJpdCBpcyB0byBtYXAgZGFzaC1jYXNlIHRvCiAgICAgICAgICAvLyBjYW1lbC1jYXNlOiBgZm9vLWJhcmAgYmVjb21lcyBgZm9vQmFyYC4KICAgICAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5ncyBhcmUgZXhjZXB0ZWQuCiAgICAgICAgICBpZiAoa2luZCA9PT0gJ3Byb3BlcnR5JykgewogICAgICAgICAgICBuYW1lID0gUG9seW1lci5DYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywga2luZCwgbmFtZSwgcGFydHMsIGxpdGVyYWwpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBzdXBlci5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogYmluZGluZyB0aGUgcHJvcGVydGllcyB0aGF0IGEgbmVzdGVkIHRlbXBsYXRlIGRlcGVuZHMgb24gdG8gdGhlIHRlbXBsYXRlCiAgICAgICAqIGFzIGBfaG9zdF88cHJvcGVydHk+YC4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKTsKICAgICAgICAvLyBNZXJnZSBob3N0IHByb3BzIGludG8gb3V0ZXIgdGVtcGxhdGUgYW5kIGFkZCBiaW5kaW5ncwogICAgICAgIGxldCBob3N0UHJvcHMgPSBub2RlSW5mby50ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgIGxldCBtb2RlID0gJ3snOwogICAgICAgIGZvciAobGV0IHNvdXJjZSBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgIGxldCBwYXJ0cyA9IFt7IG1vZGUsIHNvdXJjZSwgZGVwZW5kZW5jaWVzOiBbc291cmNlXSB9XTsKICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgJ3Byb3BlcnR5JywgJ19ob3N0XycgKyBzb3VyY2UsIHBhcnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHBhcnNlIHRleHQgaW4gYSB0ZW1wbGF0ZSAoZWl0aGVyIGF0dHJpYnV0ZSB2YWx1ZXMgb3IKICAgICAgICogdGV4dENvbnRlbnQpIGludG8gYmluZGluZyBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQW55IG92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIGJpbmRpbmcgcGFydAogICAgICAgKiBtZXRhZGF0YSAgcmVwcmVzZW50aW5nIG9uZSBvciBtb3JlIGJpbmRpbmdzIGZvdW5kIGluIHRoZSBwcm92aWRlZCB0ZXh0CiAgICAgICAqIGFuZCBhbnkgImxpdGVyYWwiIHRleHQgaW4gYmV0d2Vlbi4gIEFueSBub24tbGl0ZXJhbCBwYXJ0cyB3aWxsIGJlIHBhc3NlZAogICAgICAgKiB0byBgX2V2YWx1YXRlQmluZGluZ2Agd2hlbiBhbnkgZGVwZW5kZW5jaWVzIGNoYW5nZS4gIFRoZSBvbmx5IHJlcXVpcmVkCiAgICAgICAqIGZpZWxkcyBvZiBlYWNoICJwYXJ0IiBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgYXJlIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIC0gYGRlcGVuZGVuY2llc2AgLSBBcnJheSBjb250YWluaW5nIHRyaWdnZXIgbWV0YWRhdGEgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICogICB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBiaW5kaW5nIHRvIHVwZGF0ZQogICAgICAgKiAtIGBsaXRlcmFsYCAtIFN0cmluZyBjb250YWluaW5nIHRleHQgaWYgdGhlIHBhcnQgcmVwcmVzZW50cyBhIGxpdGVyYWw7CiAgICAgICAqICAgaW4gdGhpcyBjYXNlIG5vIGBkZXBlbmRlbmNpZXNgIGFyZSBuZWVkZWQKICAgICAgICoKICAgICAgICogQWRkaXRpb25hbCBtZXRhZGF0YSBmb3IgdXNlIGJ5IGBfZXZhbHVhdGVCaW5kaW5nYCBtYXkgYmUgcHJvdmlkZWQgaW4KICAgICAgICogZWFjaCBwYXJ0IG9iamVjdCBhcyBuZWVkZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRsZXMgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBiaW5kaW5ncwogICAgICAgKiAob25lIG9yIG1vcmUgbWF5IGJlIGludGVybWl4ZWQgd2l0aCBsaXRlcmFsIHN0cmluZ3MpOgogICAgICAgKiAtIFByb3BlcnR5IGJpbmRpbmc6IGBbW3Byb3BdXWAKICAgICAgICogLSBQYXRoIGJpbmRpbmc6IGBbW29iamVjdC5wcm9wXV1gCiAgICAgICAqIC0gTmVnYXRlZCBwcm9wZXJ0eSBvciBwYXRoIGJpbmRpbmdzOiBgW1shcHJvcF1dYCBvciBgW1shb2JqZWN0LnByb3BdXWAKICAgICAgICogLSBUd28td2F5IHByb3BlcnR5IG9yIHBhdGggYmluZGluZ3MgKHN1cHBvcnRzIG5lZ2F0aW9uKToKICAgICAgICogICBge3twcm9wfX1gLCBge3tvYmplY3QucHJvcH19YCwgYHt7IXByb3B9fWAgb3IgYHt7IW9iamVjdC5wcm9wfX1gCiAgICAgICAqIC0gSW5saW5lIGNvbXB1dGVkIG1ldGhvZCAoc3VwcG9ydHMgbmVnYXRpb24pOgogICAgICAgKiAgIGBbW2NvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYCwgYFtbIWNvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYAogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBiZXN0CiAgICAgICAqIHBlcmZvcm1hbmNlLiBIb3dldmVyLCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZXMgYSB3aGl0ZS1saXN0IG9mCiAgICAgICAqIGFsbG93ZWQgY2hhcmFjdGVycyBpbiBhIGRhdGEtYmluZGluZywgd2hpY2ggY2F1c2VzIHByb2JsZW1zIGZvcgogICAgICAgKiBkYXRhLWJpbmRpbmdzIHRoYXQgZG8gdXNlIGNoYXJhY3RlcnMgbm90IGluIHRoaXMgd2hpdGUtbGlzdC4KICAgICAgICoKICAgICAgICogSW5zdGVhZCBvZiB1cGRhdGluZyB0aGUgd2hpdGUtbGlzdCB3aXRoIGFsbCBhbGxvd2VkIGNoYXJhY3RlcnMsCiAgICAgICAqIHRoZXJlIGlzIGEgU3RyaWN0QmluZGluZ1BhcnNlciAoc2VlIGxpYi9taXhpbnMvc3RyaWN0LWJpbmRpbmctcGFyc2VyKQogICAgICAgKiB0aGF0IHVzZXMgYSBzdGF0ZSBtYWNoaW5lIGluc3RlYWQuIFRoaXMgc3RhdGUgbWFjaGluZSBpcyBhYmxlIHRvIGhhbmRsZQogICAgICAgKiBhbGwgY2hhcmFjdGVycy4gSG93ZXZlciwgaXQgaXMgc2xpZ2h0bHkgbGVzcyBwZXJmb3JtYW50LCB0aGVyZWZvcmUgd2UKICAgICAgICogZXh0cmFjdGVkIGl0IGludG8gYSBzZXBhcmF0ZSBvcHRpb25hbCBtaXhpbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGV4dCB0byBwYXJzZSBmcm9tIGF0dHJpYnV0ZSBvciB0ZXh0Q29udGVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGVJbmZvIEN1cnJlbnQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogQHJldHVybiB7QXJyYXk8IUJpbmRpbmdQYXJ0Pn0gQXJyYXkgb2YgYmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VCaW5kaW5ncyh0ZXh0LCB0ZW1wbGF0ZUluZm8pIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBsZXQgbGFzdEluZGV4ID0gMDsKICAgICAgICBsZXQgbTsKICAgICAgICAvLyBFeGFtcGxlOiAibGl0ZXJhbDF7e3Byb3B9fWxpdGVyYWwyW1shY29tcHV0ZShmb28sYmFyKV1dZmluYWwiCiAgICAgICAgLy8gUmVnZXggbWF0Y2hlczoKICAgICAgICAvLyAgICAgICAgSXRlcmF0aW9uIDE6ICBJdGVyYXRpb24gMjoKICAgICAgICAvLyBtWzFdOiAne3snICAgICAgICAgICdbWycKICAgICAgICAvLyBtWzJdOiAnJyAgICAgICAgICAgICchJwogICAgICAgIC8vIG1bM106ICdwcm9wJyAgICAgICAgJ2NvbXB1dGUoZm9vLGJhciknCiAgICAgICAgd2hpbGUgKChtID0gYmluZGluZ1JlZ2V4LmV4ZWModGV4dCkpICE9PSBudWxsKSB7CiAgICAgICAgICAvLyBBZGQgbGl0ZXJhbCBwYXJ0CiAgICAgICAgICBpZiAobS5pbmRleCA+IGxhc3RJbmRleCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHtsaXRlcmFsOiB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgbS5pbmRleCl9KTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFkZCBiaW5kaW5nIHBhcnQKICAgICAgICAgIGxldCBtb2RlID0gbVsxXVswXTsKICAgICAgICAgIGxldCBuZWdhdGUgPSBCb29sZWFuKG1bMl0pOwogICAgICAgICAgbGV0IHNvdXJjZSA9IG1bM10udHJpbSgpOwogICAgICAgICAgbGV0IGN1c3RvbUV2ZW50ID0gZmFsc2UsIG5vdGlmeUV2ZW50ID0gJycsIGNvbG9uID0gLTE7CiAgICAgICAgICBpZiAobW9kZSA9PSAneycgJiYgKGNvbG9uID0gc291cmNlLmluZGV4T2YoJzo6JykpID4gMCkgewogICAgICAgICAgICBub3RpZnlFdmVudCA9IHNvdXJjZS5zdWJzdHJpbmcoY29sb24gKyAyKTsKICAgICAgICAgICAgc291cmNlID0gc291cmNlLnN1YnN0cmluZygwLCBjb2xvbik7CiAgICAgICAgICAgIGN1c3RvbUV2ZW50ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBzaWduYXR1cmUgPSBwYXJzZU1ldGhvZChzb3VyY2UpOwogICAgICAgICAgbGV0IGRlcGVuZGVuY2llcyA9IFtdOwogICAgICAgICAgaWYgKHNpZ25hdHVyZSkgewogICAgICAgICAgICAvLyBJbmxpbmUgY29tcHV0ZWQgZnVuY3Rpb24KICAgICAgICAgICAgbGV0IHthcmdzLCBtZXRob2ROYW1lfSA9IHNpZ25hdHVyZTsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgYXJnID0gYXJnc1tpXTsKICAgICAgICAgICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChhcmcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zOwogICAgICAgICAgICBpZiAoZHluYW1pY0ZucyAmJiBkeW5hbWljRm5zW21ldGhvZE5hbWVdIHx8IHNpZ25hdHVyZS5zdGF0aWMpIHsKICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChtZXRob2ROYW1lKTsKICAgICAgICAgICAgICBzaWduYXR1cmUuZHluYW1pY0ZuID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUHJvcGVydHkgb3IgcGF0aAogICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChzb3VyY2UpOwogICAgICAgICAgfQogICAgICAgICAgcGFydHMucHVzaCh7CiAgICAgICAgICAgIHNvdXJjZSwgbW9kZSwgbmVnYXRlLCBjdXN0b21FdmVudCwgc2lnbmF0dXJlLCBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIGV2ZW50OiBub3RpZnlFdmVudAogICAgICAgICAgfSk7CiAgICAgICAgICBsYXN0SW5kZXggPSBiaW5kaW5nUmVnZXgubGFzdEluZGV4OwogICAgICAgIH0KICAgICAgICAvLyBBZGQgYSBmaW5hbCBsaXRlcmFsIHBhcnQKICAgICAgICBpZiAobGFzdEluZGV4ICYmIGxhc3RJbmRleCA8IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IHRleHQuc3Vic3RyaW5nKGxhc3RJbmRleCk7CiAgICAgICAgICBpZiAobGl0ZXJhbCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHsKICAgICAgICAgICAgICBsaXRlcmFsOiBsaXRlcmFsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydHMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gcGFydHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB0byBldmFsdWF0ZSBhIHByZXZpb3VzbHkgcGFyc2VkIGJpbmRpbmcgcGFydCBiYXNlZCBvbiBhIHNldCBvZgogICAgICAgKiBvbmUgb3IgbW9yZSBjaGFuZ2VkIGRlcGVuZGVuY2llcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHt0aGlzfSBpbnN0IEVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBzY29wZSBmb3IKICAgICAgICogICBiaW5kaW5nIGRlcGVuZGVuY2llcwogICAgICAgKiBAcGFyYW0ge0JpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQcm9wZXJ0eS9wYXRoIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSB0aGUgYmluZGluZyBwYXJ0IGV2YWx1YXRlZCB0bwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAgICAgbGV0IHZhbHVlOwogICAgICAgIGlmIChwYXJ0LnNpZ25hdHVyZSkgewogICAgICAgICAgdmFsdWUgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBwYXJ0LnNpZ25hdHVyZSk7CiAgICAgICAgfSBlbHNlIGlmIChwYXRoICE9IHBhcnQuc291cmNlKSB7CiAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGFydC5zb3VyY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwYXRoKSkgewogICAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZSA9IGluc3QuX19kYXRhW3BhdGhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydC5uZWdhdGUpIHsKICAgICAgICAgIHZhbHVlID0gIXZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KCiAgICB9CgogICAgLy8gbWFrZSBhIHR5cGluZyBmb3IgY2xvc3VyZSA6UAogICAgUHJvcGVydHlFZmZlY3RzVHlwZSA9IFByb3BlcnR5RWZmZWN0czsKCiAgICByZXR1cm4gUHJvcGVydHlFZmZlY3RzOwogIH0pOwoKICAvKioKICAgKiBIZWxwZXIgYXBpIGZvciBlbnF1ZXVpbmcgY2xpZW50IGRvbSBjcmVhdGVkIGJ5IGEgaG9zdCBlbGVtZW50LgogICAqCiAgICogQnkgZGVmYXVsdCBlbGVtZW50cyBhcmUgZmx1c2hlZCB2aWEgYF9mbHVzaFByb3BlcnRpZXNgIHdoZW4KICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGNhbGxlZC4gRWxlbWVudHMgYXR0YWNoIHRoZWlyIGNsaWVudCBkb20gdG8KICAgKiB0aGVtc2VsdmVzIGF0IGByZWFkeWAgdGltZSB3aGljaCByZXN1bHRzIGZyb20gdGhpcyBmaXJzdCBmbHVzaC4KICAgKiBUaGlzIHByb3ZpZGVzIGFuIG9yZGVyaW5nIGd1YXJhbnRlZSB0aGF0IHRoZSBjbGllbnQgZG9tIGFuIGVsZW1lbnQKICAgKiBjcmVhdGVzIGlzIGZsdXNoZWQgYmVmb3JlIHRoZSBlbGVtZW50IGl0c2VsZiAoaS5lLiBjbGllbnQgYHJlYWR5YAogICAqIGZpcmVzIGJlZm9yZSBob3N0IGByZWFkeWApLgogICAqCiAgICogSG93ZXZlciwgaWYgYF9mbHVzaFByb3BlcnRpZXNgIGlzIGNhbGxlZCAqYmVmb3JlKiBhbiBlbGVtZW50IGlzIGNvbm5lY3RlZCwKICAgKiBhcyBmb3IgZXhhbXBsZSBgVGVtcGxhdGl6ZWAgZG9lcywgdGhpcyBvcmRlcmluZyBndWFyYW50ZWUgY2Fubm90IGJlCiAgICogc2F0aXNmaWVkIGJlY2F1c2Ugbm8gZWxlbWVudHMgYXJlIGNvbm5lY3RlZC4gKE5vdGU6IEJvdW5kIGVsZW1lbnRzIHRoYXQKICAgKiByZWNlaXZlIGRhdGEgZG8gYmVjb21lIGVucXVldWVkIGNsaWVudHMgYW5kIGFyZSBwcm9wZXJseSBvcmRlcmVkIGJ1dAogICAqIHVuYm91bmQgZWxlbWVudHMgYXJlIG5vdC4pCiAgICoKICAgKiBUbyBtYWludGFpbiB0aGUgZGVzaXJlZCAiY2xpZW50IGJlZm9yZSBob3N0IiBvcmRlcmluZyBndWFyYW50ZWUgZm9yIHRoaXMKICAgKiBjYXNlIHdlIHJlbHkgb24gdGhlICJob3N0IHN0YWNrLiBDbGllbnQgbm9kZXMgcmVnaXN0ZXJzIHRoZW1zZWx2ZXMgd2l0aAogICAqIHRoZSBjcmVhdGluZyBob3N0IGVsZW1lbnQgd2hlbiBjcmVhdGVkLiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgY2xpZW50IGRvbQogICAqIGlzIHJlYWRpZWQgaW4gdGhlIHByb3BlciBvcmRlciwgbWFpbnRhaW5pbmcgdGhlIGRlc2lyZWQgZ3VhcmFudGVlLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KICBsZXQgaG9zdFN0YWNrID0gewoKICAgIHN0YWNrOiBbXSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7Kn0gaW5zdCBJbnN0YW5jZSB0byBhZGQgdG8gaG9zdFN0YWNrCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge2hvc3RTdGFja30KICAgICAqLwogICAgcmVnaXN0ZXJIb3N0KGluc3QpIHsKICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB7CiAgICAgICAgbGV0IGhvc3QgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdOwogICAgICAgIGhvc3QuX2VucXVldWVDbGllbnQoaW5zdCk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gYmVnaW4gaG9zdGluZwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtob3N0U3RhY2t9CiAgICAgKi8KICAgIGJlZ2luSG9zdGluZyhpbnN0KSB7CiAgICAgIHRoaXMuc3RhY2sucHVzaChpbnN0KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gZW5kIGhvc3RpbmcKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7aG9zdFN0YWNrfQogICAgICovCiAgICBlbmRIb3N0aW5nKGluc3QpIHsKICAgICAgbGV0IHN0YWNrTGVuID0gdGhpcy5zdGFjay5sZW5ndGg7CiAgICAgIGlmIChzdGFja0xlbiAmJiB0aGlzLnN0YWNrW3N0YWNrTGVuLTFdID09IGluc3QpIHsKICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICB9CiAgICB9CgogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIFByb3ZpZGVzIGJhc2ljIHRyYWNraW5nIG9mIGVsZW1lbnQgZGVmaW5pdGlvbnMgKHJlZ2lzdHJhdGlvbnMpIGFuZAogICAqIGluc3RhbmNlIGNvdW50cy4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAc3VtbWFyeSBQcm92aWRlcyBiYXNpYyB0cmFja2luZyBvZiBlbGVtZW50IGRlZmluaXRpb25zIChyZWdpc3RyYXRpb25zKSBhbmQKICAgKiBpbnN0YW5jZSBjb3VudHMuCiAgICovCiAgUG9seW1lci50ZWxlbWV0cnkgPSB7CiAgICAvKioKICAgICAqIFRvdGFsIG51bWJlciBvZiBQb2x5bWVyIGVsZW1lbnQgaW5zdGFuY2VzIGNyZWF0ZWQuCiAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICovCiAgICBpbnN0YW5jZUNvdW50OiAwLAogICAgLyoqCiAgICAgKiBBcnJheSBvZiBQb2x5bWVyIGVsZW1lbnQgY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBmaW5hbGl6ZWQuCiAgICAgKiBAdHlwZSB7QXJyYXk8UG9seW1lci5FbGVtZW50Pn0KICAgICAqLwogICAgcmVnaXN0cmF0aW9uczogW10sCiAgICAvKioKICAgICAqIEBwYXJhbSB7IVBvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byBsb2cKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3JlZ0xvZzogZnVuY3Rpb24ocHJvdG90eXBlKSB7CiAgICAgIGNvbnNvbGUubG9nKCdbJyArIHByb3RvdHlwZS5pcyArICddOiByZWdpc3RlcmVkJyk7CiAgICB9LAogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBjbGFzcyBwcm90b3R5cGUgZm9yIHRlbGVtZXRyeSBwdXJwb3Nlcy4KICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byByZWdpc3RlcgogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihwcm90b3R5cGUpIHsKICAgICAgdGhpcy5yZWdpc3RyYXRpb25zLnB1c2gocHJvdG90eXBlKTsKICAgICAgUG9seW1lci5sb2cgJiYgdGhpcy5fcmVnTG9nKHByb3RvdHlwZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBMb2dzIGFsbCBlbGVtZW50cyByZWdpc3RlcmVkIHdpdGggYW4gYGlzYCB0byB0aGUgY29uc29sZS4KICAgICAqIEBwdWJsaWMKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICovCiAgICBkdW1wUmVnaXN0cmF0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMucmVnaXN0cmF0aW9ucy5mb3JFYWNoKHRoaXMuX3JlZ0xvZyk7CiAgICB9CiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGNvcHkgb2YgYHByb3BzYCB3aXRoIGVhY2ggcHJvcGVydHkgbm9ybWFsaXplZCBzdWNoIHRoYXQKICAgKiB1cGdyYWRlZCBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBhIHR5cGUgcHJvcGVydHkgeyB0eXBlOiBUeXBlfS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIG5vcm1hbGl6ZQogICAqIEByZXR1cm4ge09iamVjdH0gQ29weSBvZiBpbnB1dCBgcHJvcHNgIHdpdGggbm9ybWFsaXplZCBwcm9wZXJ0aWVzIHRoYXQKICAgKiBhcmUgaW4gdGhlIGZvcm0ge3R5cGU6IFR5cGV9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICBjb25zdCBvdXRwdXQgPSB7fTsKICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgY29uc3QgbyA9IHByb3BzW3BdOwogICAgICBvdXRwdXRbcF0gPSAodHlwZW9mIG8gPT09ICdmdW5jdGlvbicpID8ge3R5cGU6IG99IDogbzsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQoKICAvKioKICAgKiBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCB0byB1c2luZyB0aGUgUHJvcGVydGllc0NoYW5nZWQKICAgKiBtaXhpbiBieSBwcm92aWRpbmcgYSBtZWNoYW5pc20gdG8gZGVjbGFyZSBwcm9wZXJ0aWVzIGluIGEgc3RhdGljCiAgICogZ2V0dGVyIChlLmcuIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsgcmV0dXJuIHsgZm9vOiBTdHJpbmcgfSB9KS4gQ2hhbmdlcwogICAqIGFyZSByZXBvcnRlZCB2aWEgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZC4KICAgKgogICAqIFRoaXMgbWl4aW4gcHJvdmlkZXMgbm8gc3BlY2lmaWMgc3VwcG9ydCBmb3IgcmVuZGVyaW5nLiBVc2VycyBhcmUgZXhwZWN0ZWQKICAgKiB0byBjcmVhdGUgYSBTaGFkb3dSb290IGFuZCBwdXQgY29udGVudCBpbnRvIGl0IGFuZCB1cGRhdGUgaXQgaW4gd2hhdGV2ZXIKICAgKiB3YXkgbWFrZXMgc2Vuc2UuIFRoaXMgY2FuIGJlIGRvbmUgaW4gcmVhY3Rpb24gdG8gcHJvcGVydGllcyBjaGFuZ2luZyBieQogICAqIGltcGxlbWVudGluZyBgX3Byb3BlcnRpZXNDaGFuZ2VkYC4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1peGluIHRoYXQgcHJvdmlkZXMgYSBtaW5pbWFsIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZwogICAqIHRoZSBQcm9wZXJ0aWVzQ2hhbmdlZCBtaXhpbiBieSBwcm92aWRpbmcgYSBkZWNsYXJhdGl2ZSBgcHJvcGVydGllc2Agb2JqZWN0LgogICAqLwogICBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzQ2hhbmdlZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnRpZXNDaGFuZ2VkKHN1cGVyQ2xhc3MpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiBjbGFzcywgaWYgaXQgaXMgYW4KICAgICAqIGluc3RhbmNlIG9mIHRoZSBQcm9wZXJ0aWVzTWl4aW4uCiAgICAgKgogICAgICogQHBhcmFtIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIFByb3BlcnRpZXNNaXhpbiBjb25zdHJ1Y3RvcgogICAgICogQHJldHVybiB7UHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IFN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cGVyUHJvcGVydGllc0NsYXNzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGNvbnN0IHN1cGVyQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvcik7CgogICAgICAvLyBOb3RlLCB0aGUgYFByb3BlcnRpZXNNaXhpbmAgY2xhc3MgYmVsb3cgb25seSByZWZlcnMgdG8gdGhlIGNsYXNzCiAgICAgIC8vIGdlbmVyYXRlZCBieSB0aGlzIGNhbGwgdG8gdGhlIG1peGluOyB0aGUgaW5zdGFuY2VvZiB0ZXN0IG9ubHkgd29ya3MKICAgICAgLy8gYmVjYXVzZSB0aGUgbWl4aW4gaXMgZGVkdXBlZCBhbmQgZ3VhcmFudGVlZCBvbmx5IHRvIGFwcGx5IG9uY2UsIGhlbmNlCiAgICAgIC8vIGFsbCBjb25zdHJ1Y3RvcnMgaW4gYSBwcm90byBjaGFpbiB3aWxsIHNlZSB0aGUgc2FtZSBgUHJvcGVydGllc01peGluYAogICAgICByZXR1cm4gKHN1cGVyQ3Rvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBQcm9wZXJ0aWVzTWl4aW4pID8KICAgICAgICAvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyAoc3VwZXJDdG9yKSA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYHByb3BlcnRpZXNgIG9iamVjdCBmb3IgdGhlCiAgICAgKiBnaXZlbiBjbGFzcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvIGF0CiAgICAgKiBsZWFzdCB7dHlwZX0uCiAgICAgKgogICAgICogQHBhcmFtIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgUHJvcGVydGllc01peGluIGNvbnN0cnVjdG9yCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE1lbW9pemVkIHByb3BlcnRpZXMgb2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG93blByb3BlcnRpZXMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293blByb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgbGV0IHByb3BzID0gbnVsbDsKCiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gY29uc3RydWN0b3IucHJvcGVydGllczsKICAgICAgICAgIAogICAgICAgICAgaWYgKHByb3BlcnRpZXMpIHsKICAgICAgICAgICAgcHJvcHMgPSBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzID0gcHJvcHM7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duUHJvcGVydGllczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnRpZXNNaXhpbiBleHRlbmRzIGJhc2UgewoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgc3RhbmRhcmQgY3VzdG9tIGVsZW1lbnRzIGdldHRlciB0byBvYnNlcnZlcyB0aGUgYXR0cmlidXRlcwogICAgICAgKiBsaXN0ZWQgaW4gYHByb3BlcnRpZXNgLgogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19vYnNlcnZlZEF0dHJpYnV0ZXMnKSkgewogICAgICAgICAgUG9seW1lci50ZWxlbWV0cnkucmVnaXN0ZXIodGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzOwogICAgICAgICAgdGhpcy5fX29ic2VydmVkQXR0cmlidXRlcyA9IHByb3BzID8gT2JqZWN0LmtleXMocHJvcHMpLm1hcChwID0+IHRoaXMuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHApKSA6IFtdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX29ic2VydmVkQXR0cmlidXRlczsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZpbmFsaXplcyBhbiBlbGVtZW50IGRlZmluaXRpb24sIGluY2x1ZGluZyBlbnN1cmluZyBhbnkgc3VwZXIgY2xhc3NlcwogICAgICAgKiBhcmUgYWxzbyBmaW5hbGl6ZWQuIFRoaXMgaW5jbHVkZXMgZW5zdXJpbmcgcHJvcGVydHkKICAgICAgICogYWNjZXNzb3JzIGV4aXN0IG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhpcyBtZXRob2QgY2FsbHMKICAgICAgICogYF9maW5hbGl6ZUNsYXNzYCB0byBmaW5hbGl6ZSBlYWNoIGNvbnN0cnVjdG9yIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZmluYWxpemVkJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICBpZiAoc3VwZXJDdG9yKSB7CiAgICAgICAgICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2ZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICB0aGlzLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRmluYWxpemUgYW4gZWxlbWVudCBjbGFzcy4gVGhpcyBpbmNsdWRlcyBlbnN1cmluZyBwcm9wZXJ0eQogICAgICAgKiBhY2Nlc3NvcnMgZXhpc3Qgb24gdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKICAgICAgICogYGZpbmFsaXplYCBhbmQgZmluYWxpemVzIHRoZSBjbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIGNvbnN0IHByb3BzID0gb3duUHJvcGVydGllcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBtZW1vaXplZCB2ZXJzaW9uIG9mIGFsbCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhvc2UgaW5oZXJpdGVkCiAgICAgICAqIGZyb20gc3VwZXIgY2xhc3Nlcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvCiAgICAgICAqIGF0IGxlYXN0IHt0eXBlfS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgX3Byb3BlcnRpZXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KAogICAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0aWVzJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICB0aGlzLl9fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sCiAgICAgICAgICAgIHN1cGVyQ3RvciAmJiBzdXBlckN0b3IuX3Byb3BlcnRpZXMsCiAgICAgICAgICAgIG93blByb3BlcnRpZXMoLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX19wcm9wZXJ0aWVzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgbWV0aG9kIHRvIHJldHVybiB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICogc3RhdGljIGBwcm9wZXJ0aWVzYCBvYmplY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlIHRvIHdoaWNoIHRvIGRlc2VyaWFsaXplIGF0dHJpYnV0ZQogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHsKICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5fcHJvcGVydGllc1tuYW1lXTsKICAgICAgICByZXR1cm4gaW5mbyAmJiBpbmZvLnR5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnRpZXNDaGFuZ2VkYCBtZXRob2QgYW5kIGFkZHMgYSBjYWxsIHRvCiAgICAgICAqIGBmaW5hbGl6ZWAgd2hpY2ggbGF6aWx5IGNvbmZpZ3VyZXMgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIFBvbHltZXIudGVsZW1ldHJ5Lmluc3RhbmNlQ291bnQrKzsKICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmZpbmFsaXplKCk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhZGRlZCB0byBhIGRvY3VtZW50LgogICAgICAgKiBDYWxscyBgX2VuYWJsZVByb3BlcnRpZXNgIHRvIHR1cm4gb24gcHJvcGVydHkgc3lzdGVtIGZyb20KICAgICAgICogYFByb3BlcnRpZXNDaGFuZ2VkYC4KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gYSBkb2N1bWVudAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBpZiAoc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBQcm9wZXJ0aWVzTWl4aW47CgogIH0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgYnVpbHRDU1MgPSB3aW5kb3cuU2hhZHlDU1MgJiYgd2luZG93LlNoYWR5Q1NTWydjc3NCdWlsZCddOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBTdWJjbGFzc2VycyBtYXkgcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBnZXR0ZXJzIHRvIHJldHVybiBtZXRhZGF0YQogICAqIHVzZWQgdG8gY29uZmlndXJlIFBvbHltZXIncyBmZWF0dXJlcyBmb3IgdGhlIGNsYXNzOgogICAqCiAgICogLSBgc3RhdGljIGdldCBpcygpYDogV2hlbiB0aGUgdGVtcGxhdGUgaXMgcHJvdmlkZWQgdmlhIGEgYGRvbS1tb2R1bGVgLAogICAqICAgdXNlcnMgc2hvdWxkIHJldHVybiB0aGUgYGRvbS1tb2R1bGVgIGlkIGZyb20gYSBzdGF0aWMgYGlzYCBnZXR0ZXIuICBJZgogICAqICAgbm8gdGVtcGxhdGUgaXMgbmVlZGVkIG9yIHRoZSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCBkaXJlY3RseSB2aWEgdGhlCiAgICogICBgdGVtcGxhdGVgIGdldHRlciwgdGhlcmUgaXMgbm8gbmVlZCB0byBkZWZpbmUgYGlzYCBmb3IgdGhlIGVsZW1lbnQuCiAgICoKICAgKiAtIGBzdGF0aWMgZ2V0IHRlbXBsYXRlKClgOiBVc2VycyBtYXkgcHJvdmlkZSB0aGUgdGVtcGxhdGUgZGlyZWN0bHkgKGFzCiAgICogICBvcHBvc2VkIHRvIHZpYSBgZG9tLW1vZHVsZWApIGJ5IGltcGxlbWVudGluZyBhIHN0YXRpYyBgdGVtcGxhdGVgIGdldHRlci4KICAgKiAgIFRoZSBnZXR0ZXIgbWF5IHJldHVybiBhbiBgSFRNTFRlbXBsYXRlRWxlbWVudGAgb3IgYSBzdHJpbmcsIHdoaWNoIHdpbGwKICAgKiAgIGF1dG9tYXRpY2FsbHkgYmUgcGFyc2VkIGludG8gYSB0ZW1wbGF0ZS4KICAgKgogICAqIC0gYHN0YXRpYyBnZXQgcHJvcGVydGllcygpYDogU2hvdWxkIHJldHVybiBhbiBvYmplY3QgZGVzY3JpYmluZwogICAqICAgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIgZmVhdHVyZXMgKGtleTogcHJvcGVydHkgbmFtZQogICAqICAgdmFsdWU6IG9iamVjdCBjb250YWluaW5nIHByb3BlcnR5IG1ldGFkYXRhKS4gVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkKICAgKiAgIG1ldGFkYXRhIGluY2x1ZGU6CiAgICogICAtIGB0eXBlYCAoU3RyaW5nfE51bWJlcnxPYmplY3R8QXJyYXl8Li4uKTogVXNlZCBieQogICAqICAgICBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0byBkZXRlcm1pbmUgaG93IHN0cmluZy1iYXNlZCBhdHRyaWJ1dGVzCiAgICogICAgIGFyZSBkZXNlcmlhbGl6ZWQgdG8gSmF2YVNjcmlwdCBwcm9wZXJ0eSB2YWx1ZXMuCiAgICogICAtIGBub3RpZnlgIChib29sZWFuKTogQ2F1c2VzIGEgY2hhbmdlIGluIHRoZSBwcm9wZXJ0eSB0byBmaXJlIGEKICAgKiAgICAgbm9uLWJ1YmJsaW5nIGV2ZW50IGNhbGxlZCBgPHByb3BlcnR5Pi1jaGFuZ2VkYC4gRWxlbWVudHMgdGhhdCBoYXZlCiAgICogICAgIGVuYWJsZWQgdHdvLXdheSBiaW5kaW5nIHRvIHRoZSBwcm9wZXJ0eSB1c2UgdGhpcyBldmVudCB0byBvYnNlcnZlIGNoYW5nZXMuCiAgICogICAtIGByZWFkT25seWAgKGJvb2xlYW4pOiBDcmVhdGVzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIGJ1dCBubyBzZXR0ZXIuCiAgICogICAgIFRvIHNldCBhIHJlYWQtb25seSBwcm9wZXJ0eSwgdXNlIHRoZSBwcml2YXRlIHNldHRlciBtZXRob2QKICAgKiAgICAgYF9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpYC4KICAgKiAgIC0gYG9ic2VydmVyYCAoc3RyaW5nKTogT2JzZXJ2ZXIgbWV0aG9kIG5hbWUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCiAgICogICAgIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlCiAgICogICAgIGAodmFsdWUsIHByZXZpb3VzVmFsdWUpYC4KICAgKiAgIC0gYGNvbXB1dGVkYCAoc3RyaW5nKTogU3RyaW5nIGRlc2NyaWJpbmcgbWV0aG9kIGFuZCBkZXBlbmRlbnQgcHJvcGVydGllcwogICAqICAgICBmb3IgY29tcHV0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IChlLmcuIGAnY29tcHV0ZUZvbyhiYXIsIHpvdCknYCkuCiAgICogICAgIENvbXB1dGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBieSBkZWZhdWx0IGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkCiAgICogICAgIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjb21wdXRpbmcgbWV0aG9kLgogICAqCiAgICogLSBgc3RhdGljIGdldCBvYnNlcnZlcnMoKWA6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eQogICAqICAgb2JzZXJ2ZXIgbWV0aG9kcyBhbmQgdGhlaXIgZGVwZW5kZW50IHByb3BlcnRpZXMgKGUuZy4KICAgKiAgIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgKgogICAqIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHN0YW5kYXJkCiAgICogY3VzdG9tIGVsZW1lbnQgbGlmZWN5Y2xlIGNhbGxiYWNrczsgdXNlcnMgbWF5IG92ZXJyaWRlIHRoZXNlLCBidXQgc2hvdWxkCiAgICogY2FsbCB0aGUgc3VwZXIgbWV0aG9kIHRvIGVuc3VyZQogICAqIC0gYGNvbnN0cnVjdG9yYDogUnVuIHdoZW4gdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBvciB1cGdyYWRlZAogICAqIC0gYGNvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlCiAgICogICBkb2N1bWVudAogICAqIC0gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQgZnJvbQogICAqICAgdGhlIGRvY3VtZW50CiAgICogLSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSBhbiBhdHRyaWJ1dGUgaW4KICAgKiAgIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGlzIHNldCBvciByZW1vdmVkIChub3RlOiB0aGlzIGVsZW1lbnQncyBkZWZhdWx0CiAgICogICBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBpbXBsZW1lbnRhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0dXJuIGFuIGFycmF5CiAgICogICBvZiBkYXNoLWNhc2VkIGF0dHJpYnV0ZXMgYmFzZWQgb24gYHByb3BlcnRpZXNgKQogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc01peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcHJvcGVydHkgcm9vdFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiBgUG9seW1lci5yb290UGF0aGAsCiAgICogICB3aGljaCBkZWZhdWx0cyB0byB0aGUgbWFpbiBkb2N1bWVudCBwYXRoCiAgICogQHByb3BlcnR5IGltcG9ydFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY2xhc3MncyBzdGF0aWMKICAgKiAgIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSwgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIHBhdGggb2YgdGhpcyBlbGVtZW50J3MKICAgKiAgIGBkb20tbW9kdWxlYCAod2hlbiBgaXNgIGlzIHVzZWQpLCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gZm9yIG90aGVyCiAgICogICBpbXBvcnQgc3RyYXRlZ2llcy4KICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MKICAgKiBtZXRhLXByb2dyYW1taW5nIGZlYXR1cmVzLgogICAqLwogIFBvbHltZXIuRWxlbWVudE1peGluID0gUG9seW1lci5kZWR1cGluZ01peGluKGJhc2UgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNNaXhpbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IHBvbHltZXJFbGVtZW50QmFzZSA9IFBvbHltZXIuUHJvcGVydGllc01peGluKFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKGJhc2UpKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHByb3BlcnRpZXMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KICAgICAqIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGFzIGFuIG9wdGltaXphdGlvbiBzaW5jZSBpdCBpcyBhIHN1YnNldCBvZgogICAgICogdGhlIGxpc3QgcmV0dXJuZWQgZnJvbSBgX3Byb3BlcnRpZXNgLgogICAgICogVGhpcyBsaXN0IGlzIHVzZWQgaW4gYF9pbml0aWFsaXplUHJvcGVydGllc2AgdG8gc2V0IHByb3BlcnR5IGRlZmF1bHRzLgogICAgICoKICAgICAqIEBwYXJhbSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgRWxlbWVudCBjbGFzcwogICAgICogQHJldHVybiB7UG9seW1lckVsZW1lbnRQcm9wZXJ0aWVzfSBGbGF0dGVuZWQgcHJvcGVydGllcyBmb3IgdGhpcyBjbGFzcwogICAgICogICB0aGF0IGhhdmUgZGVmYXVsdCB2YWx1ZXMKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BlcnR5RGVmYXVsdHMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX3Byb3BlcnR5RGVmYXVsdHMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzID0gbnVsbDsKICAgICAgICBsZXQgcHJvcHMgPSBjb25zdHJ1Y3Rvci5fcHJvcGVydGllczsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICBsZXQgaW5mbyA9IHByb3BzW3BdOwogICAgICAgICAgaWYgKCd2YWx1ZScgaW4gaW5mbykgewogICAgICAgICAgICBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgPSBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgfHwge307CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLl9fcHJvcGVydHlEZWZhdWx0c1twXSA9IGluZm87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYG9ic2VydmVyc2AgYXJyYXkuCiAgICAgKiBAcGFyYW0ge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIEVsZW1lbnQgY2xhc3MKICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIG93biBvYnNlcnZlcnMgZm9yIHRoZSBnaXZlbiBjbGFzcwogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBvd25PYnNlcnZlcnMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293bk9ic2VydmVycycsIGNvbnN0cnVjdG9yKSkpIHsKICAgICAgICAgIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzID0KICAgICAgICAgIGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ29ic2VydmVycycsIGNvbnN0cnVjdG9yKSkgPwogICAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAoY29uc3RydWN0b3IpLm9ic2VydmVycyA6IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBlZmZlY3RzIGZvciBhIHByb3BlcnR5LgogICAgICoKICAgICAqIE5vdGUsIG9uY2UgYSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8KICAgICAqIGByZWFkT25seWAsIGBjb21wdXRlZGAsIGByZWZsZWN0VG9BdHRyaWJ1dGVgLCBvciBgbm90aWZ5YAogICAgICogdGhlc2UgdmFsdWVzIG1heSBub3QgYmUgY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGEgc3ViY2xhc3MgY2Fubm90CiAgICAgKiBhbHRlciB0aGVzZSBzZXR0aW5ncy4gSG93ZXZlciwgYWRkaXRpb25hbCBgb2JzZXJ2ZXJzYCBtYXkgYmUgYWRkZWQKICAgICAqIGJ5IHN1YmNsYXNzZXMuCiAgICAgKgogICAgICogVGhlIGluZm8gb2JqZWN0IHNob3VsZCBjb250YWluIHByb3BlcnR5IG1ldGFkYXRhIGFzIGZvbGxvd3M6CiAgICAgKgogICAgICogKiBgdHlwZWA6IHtmdW5jdGlvbn0gdHlwZSB0byB3aGljaCBhbiBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIHByb3BlcnR5CiAgICAgKiBpcyBkZXNlcmlhbGl6ZWQuIE5vdGUgdGhlIHByb3BlcnR5IGlzIGNhbWVsLWNhc2VkIGZyb20gYSBkYXNoLWNhc2VkCiAgICAgKiBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCAnZm9vLWJhcicgYXR0cmlidXRlIGlzIGRlc2VyaWFsaXplZCB0byBhCiAgICAgKiBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJy4KICAgICAqCiAgICAgKiAqIGByZWFkT25seWA6IHtib29sZWFufSBjcmVhdGVzIGEgcmVhZE9ubHkgcHJvcGVydHkgYW5kCiAgICAgKiBtYWtlcyBhIHByaXZhdGUgc2V0dGVyIGZvciB0aGUgcHJpdmF0ZSBvZiB0aGUgZm9ybSAnX3NldEZvbycgZm9yIGEKICAgICAqIHByb3BlcnR5ICdmb28nLAogICAgICoKICAgICAqICogYGNvbXB1dGVkYDoge3N0cmluZ30gY3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5LiBBIGNvbXB1dGVkIHByb3BlcnR5CiAgICAgKiBpcyBhbHNvIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGByZWFkT25seTogdHJ1ZWAuIFRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVkCiAgICAgKiBieSBydW5uaW5nIGEgbWV0aG9kIGFuZCBhcmd1bWVudHMgcGFyc2VkIGZyb20gdGhlIGdpdmVuIHN0cmluZy4gRm9yCiAgICAgKiBleGFtcGxlICdjb21wdXRlKGZvbyknIHdpbGwgY29tcHV0ZSBhIGdpdmVuIHByb3BlcnR5IHdoZW4gdGhlCiAgICAgKiAnZm9vJyBwcm9wZXJ0eSBjaGFuZ2VzIGJ5IGV4ZWN1dGluZyB0aGUgJ2NvbXB1dGUnIG1ldGhvZC4gVGhpcyBtZXRob2QKICAgICAqIG11c3QgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZS4KICAgICAqCiAgICAgKiAqIGByZWZsZWN0VG9BdHRyaWJ1dGVgOiB7Ym9vbGVhbn0gSWYgdHJ1ZSwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJlZmxlY3RlZAogICAgICogdG8gYW4gYXR0cmlidXRlIG9mIHRoZSBzYW1lIG5hbWUuIE5vdGUsIHRoZSBhdHRyaWJ1dGUgaXMgZGFzaC1jYXNlZAogICAgICogc28gYSBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJyBpcyByZWZsZWN0ZWQgYXMgJ2Zvby1iYXInLgogICAgICoKICAgICAqICogYG5vdGlmeWA6IHtib29sZWFufSBzZW5kcyBhIG5vbi1idWJibGluZyBub3RpZmljYXRpb24gZXZlbnQgd2hlbgogICAgICogdGhlIHByb3BlcnR5IGNoYW5nZXMuIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWVkICdmb28nIHNlbmRzIGFuCiAgICAgKiBldmVudCBuYW1lZCAnZm9vLWNoYW5nZWQnIHdpdGggYGV2ZW50LmRldGFpbGAgc2V0IHRvIHRoZSB2YWx1ZSBvZgogICAgICogdGhlIHByb3BlcnR5LgogICAgICoKICAgICAqICogb2JzZXJ2ZXI6IHtzdHJpbmd9IG5hbWUgb2YgYSBtZXRob2QgdGhhdCBydW5zIHdoZW4gdGhlIHByb3BlcnR5CiAgICAgKiBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlICh2YWx1ZSwgcHJldmlvdXNWYWx1ZSkuCiAgICAgKgogICAgICogTm90ZTogVXNlcnMgbWF5IHdhbnQgY29udHJvbCBvdmVyIG1vZGlmeWluZyBwcm9wZXJ0eQogICAgICogZWZmZWN0cyB2aWEgc3ViY2xhc3NpbmcuIEZvciBleGFtcGxlLCBhIHVzZXIgbWlnaHQgd2FudCB0byBtYWtlIGEKICAgICAqIHJlZmxlY3RUb0F0dHJpYnV0ZSBwcm9wZXJ0eSBub3QgZG8gc28gaW4gYSBzdWJjbGFzcy4gV2UndmUgY2hvc2VuIHRvCiAgICAgKiBkaXNhYmxlIHRoaXMgYmVjYXVzZSBpdCBsZWFkcyB0byBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbi4KICAgICAqIEZvciBleGFtcGxlLCBhIHJlYWRPbmx5IGVmZmVjdCBnZW5lcmF0ZXMgYSBzcGVjaWFsIHNldHRlci4gSWYgYSBzdWJjbGFzcwogICAgICogZGlzYWJsZXMgdGhlIGVmZmVjdCwgdGhlIHNldHRlciB3b3VsZCBmYWlsIHVuZXhwZWN0ZWRseS4KICAgICAqIEJhc2VkIG9uIGZlZWRiYWNrLCB3ZSBtYXkgd2FudCB0byB0cnkgdG8gbWFrZSBlZmZlY3RzIG1vcmUgbWFsbGVhYmxlCiAgICAgKiBhbmQvb3IgcHJvdmlkZSBhbiBhZHZhbmNlZCBhcGkgZm9yIG1hbmlwdWxhdGluZyB0aGVtLgogICAgICogQWxzbyBjb25zaWRlciBhZGRpbmcgd2FybmluZ3Mgd2hlbiBhbiBlZmZlY3QgY2Fubm90IGJlIGNoYW5nZWQuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckVsZW1lbnR9IHByb3RvIEVsZW1lbnQgY2xhc3MgcHJvdG90eXBlIHRvIGFkZCBhY2Nlc3NvcnMKICAgICAqICAgYW5kIGVmZmVjdHMgdG8KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5LgogICAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gSW5mbyBvYmplY3QgZnJvbSB3aGljaCB0byBjcmVhdGUgcHJvcGVydHkgZWZmZWN0cy4KICAgICAqIFN1cHBvcnRlZCBrZXlzOgogICAgICogQHBhcmFtIHtPYmplY3R9IGFsbFByb3BzIEZsYXR0ZW5lZCBtYXAgb2YgYWxsIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzCiAgICAgKiAgIGVsZW1lbnQgKGluY2x1ZGluZyBpbmhlcml0ZWQgcHJvcGVydGllcykKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUZyb21Db25maWcocHJvdG8sIG5hbWUsIGluZm8sIGFsbFByb3BzKSB7CiAgICAgIC8vIGNvbXB1dGVkIGZvcmNlcyByZWFkT25seS4uLgogICAgICBpZiAoaW5mby5jb21wdXRlZCkgewogICAgICAgIGluZm8ucmVhZE9ubHkgPSB0cnVlOwogICAgICB9CiAgICAgIC8vIE5vdGUsIHNpbmNlIGFsbCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSByZWFkT25seSwgdGhpcyBwcmV2ZW50cwogICAgICAvLyBhZGRpbmcgYWRkaXRpb25hbCBjb21wdXRlZCBwcm9wZXJ0eSBlZmZlY3RzICh3aGljaCBsZWFkcyB0byBhIGNvbmZ1c2luZwogICAgICAvLyBzZXR1cCB3aGVyZSBtdWx0aXBsZSB0cmlnZ2VycyBmb3Igc2V0dGluZyBhIHByb3BlcnR5KQogICAgICAvLyBXaGlsZSB3ZSBkbyBoYXZlIGBoYXNDb21wdXRlZEVmZmVjdGAgdGhpcyBpcyBzZXQgb24gdGhlIHByb3BlcnR5J3MKICAgICAgLy8gZGVwZW5kZW5jaWVzIHJhdGhlciB0aGFuIGl0c2VsZi4KICAgICAgaWYgKGluZm8uY29tcHV0ZWQgJiYgIXByb3RvLl9oYXNSZWFkT25seUVmZmVjdChuYW1lKSkgewogICAgICAgIHByb3RvLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KG5hbWUsIGluZm8uY29tcHV0ZWQsIGFsbFByb3BzKTsKICAgICAgfQogICAgICBpZiAoaW5mby5yZWFkT25seSAmJiAhcHJvdG8uX2hhc1JlYWRPbmx5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkobmFtZSwgIWluZm8uY29tcHV0ZWQpOwogICAgICB9CiAgICAgIGlmIChpbmZvLnJlZmxlY3RUb0F0dHJpYnV0ZSAmJiAhcHJvdG8uX2hhc1JlZmxlY3RFZmZlY3QobmFtZSkpIHsKICAgICAgICBwcm90by5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkobmFtZSk7CiAgICAgIH0KICAgICAgaWYgKGluZm8ubm90aWZ5ICYmICFwcm90by5faGFzTm90aWZ5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KG5hbWUpOwogICAgICB9CiAgICAgIC8vIGFsd2F5cyBhZGQgb2JzZXJ2ZXIKICAgICAgaWYgKGluZm8ub2JzZXJ2ZXIpIHsKICAgICAgICBwcm90by5fY3JlYXRlUHJvcGVydHlPYnNlcnZlcihuYW1lLCBpbmZvLm9ic2VydmVyLCBhbGxQcm9wc1tpbmZvLm9ic2VydmVyXSk7CiAgICAgIH0KICAgICAgLy8gYWx3YXlzIGNyZWF0ZSB0aGUgbWFwcGluZyBmcm9tIGF0dHJpYnV0ZSBiYWNrIHRvIHByb3BlcnR5IGZvciBkZXNlcmlhbGl6YXRpb24uCiAgICAgIHByb3RvLl9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogUHJvY2VzcyBhbGwgc3R5bGUgZWxlbWVudHMgaW4gdGhlIGVsZW1lbnQgdGVtcGxhdGUuIFN0eWxlcyB3aXRoIHRoZQogICAgICogYGluY2x1ZGVgIGF0dHJpYnV0ZSBhcmUgcHJvY2Vzc2VkIHN1Y2ggdGhhdCBhbnkgc3R5bGVzIGluCiAgICAgKiB0aGUgYXNzb2NpYXRlZCAic3R5bGUgbW9kdWxlcyIgYXJlIGluY2x1ZGVkIGluIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICogQHBhcmFtIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSBrbGFzcyBFbGVtZW50IGNsYXNzCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBwcm9jZXNzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaXMgTmFtZSBvZiBlbGVtZW50CiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSBmb3IgZWxlbWVudAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcHJvY2Vzc0VsZW1lbnRTdHlsZXMoa2xhc3MsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSkgewogICAgICBpZiAoIWJ1aWx0Q1NTKSB7CiAgICAgICAgY29uc3QgdGVtcGxhdGVTdHlsZXMgPSB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7CiAgICAgICAgY29uc3Qgc3R5bGVzV2l0aEltcG9ydHMgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgLy8gaW5zZXJ0IHN0eWxlcyBmcm9tIDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPiBhdCB0aGUgdG9wIG9mIHRoZSB0ZW1wbGF0ZQogICAgICAgIGNvbnN0IGxpbmtlZFN0eWxlcyA9IFBvbHltZXIuU3R5bGVHYXRoZXIuc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMoaXMpOwogICAgICAgIGNvbnN0IGZpcnN0VGVtcGxhdGVDaGlsZCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7CiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgbGlua2VkU3R5bGVzLmxlbmd0aDsgaWR4KyspIHsKICAgICAgICAgIGxldCBzID0gbGlua2VkU3R5bGVzW2lkeF07CiAgICAgICAgICBzLnRleHRDb250ZW50ID0ga2xhc3MuX3Byb2Nlc3NTdHlsZVRleHQocy50ZXh0Q29udGVudCwgYmFzZVVSSSk7CiAgICAgICAgICB0ZW1wbGF0ZS5jb250ZW50Lmluc2VydEJlZm9yZShzLCBmaXJzdFRlbXBsYXRlQ2hpbGQpOwogICAgICAgIH0KICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0ICJjb25jcmV0ZSIgc3R5bGUgaW4gdGhlIHRlbXBsYXRlIHdlIGhhdmUgZW5jb3VudGVyZWQKICAgICAgICBsZXQgdGVtcGxhdGVTdHlsZUluZGV4ID0gMDsKICAgICAgICAvLyBlbnN1cmUgYWxsIGdhdGhlcmVkIHN0eWxlcyBhcmUgYWN0dWFsbHkgaW4gdGhpcyB0ZW1wbGF0ZS4KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlc1dpdGhJbXBvcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHN0eWxlc1dpdGhJbXBvcnRzW2ldOwogICAgICAgICAgbGV0IHRlbXBsYXRlU3R5bGUgPSB0ZW1wbGF0ZVN0eWxlc1t0ZW1wbGF0ZVN0eWxlSW5kZXhdOwogICAgICAgICAgLy8gaWYgdGhlIHN0eWxlIGlzIG5vdCBpbiB0aGlzIHRlbXBsYXRlLCBpdCdzIGJlZW4gImluY2x1ZGVkIiBhbmQKICAgICAgICAgIC8vIHdlIHB1dCBhIGNsb25lIG9mIGl0IGluIHRoZSB0ZW1wbGF0ZSBiZWZvcmUgdGhlIHN0eWxlIHRoYXQgaW5jbHVkZWQgaXQKICAgICAgICAgIGlmICh0ZW1wbGF0ZVN0eWxlICE9PSBzKSB7CiAgICAgICAgICAgIHMgPSBzLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgdGVtcGxhdGVTdHlsZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzLCB0ZW1wbGF0ZVN0eWxlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRlbXBsYXRlU3R5bGVJbmRleCsrOwogICAgICAgICAgfQogICAgICAgICAgcy50ZXh0Q29udGVudCA9IGtsYXNzLl9wcm9jZXNzU3R5bGVUZXh0KHMudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgICAgd2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgaXMpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBMb29rIHVwIHRlbXBsYXRlIGZyb20gZG9tLW1vZHVsZSBmb3IgZWxlbWVudAogICAgICoKICAgICAqIEBwYXJhbSB7IXN0cmluZ30gaXMgRWxlbWVudCBuYW1lIHRvIGxvb2sgdXAKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBUZW1wbGF0ZSBmb3VuZCBpbiBkb20gbW9kdWxlLCBvcgogICAgICogICB1bmRlZmluZWQgaWYgbm90IGZvdW5kCiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRlbXBsYXRlRnJvbURvbU1vZHVsZShpcykgewogICAgICBsZXQgdGVtcGxhdGUgPSBudWxsOwogICAgICBpZiAoaXMgJiYgUG9seW1lci5Eb21Nb2R1bGUpIHsKICAgICAgICB0ZW1wbGF0ZSA9IFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydChpcywgJ3RlbXBsYXRlJyk7CiAgICAgICAgLy8gVW5kZXIgc3RyaWN0VGVtcGxhdGVQb2xpY3ksIHJlcXVpcmUgYW55IGVsZW1lbnQgd2l0aCBhbiBgaXNgCiAgICAgICAgLy8gc3BlY2lmaWVkIHRvIGhhdmUgYSBkb20tbW9kdWxlCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0cmljdFRlbXBsYXRlUG9saWN5OiBleHBlY3RpbmcgZG9tLW1vZHVsZSBvciBudWxsIHRlbXBsYXRlIGZvciAke2lzfWApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICB9CgogIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKi8KICAgIGNsYXNzIFBvbHltZXJFbGVtZW50IGV4dGVuZHMgcG9seW1lckVsZW1lbnRCYXNlIHsKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZSBvZiBQcm9wZXJ0aWVzTWl4aW4gX2ZpbmFsaXplQ2xhc3MgdG8gY3JlYXRlIG9ic2VydmVycyBhbmQKICAgICAgICogZmluZCB0aGUgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgY29uc3Qgb2JzZXJ2ZXJzID0gb3duT2JzZXJ2ZXJzKHRoaXMpOwogICAgICAgIGlmIChvYnNlcnZlcnMpIHsKICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKG9ic2VydmVycywgdGhpcy5fcHJvcGVydGllcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICB9CgogICAgICBzdGF0aWMgX3ByZXBhcmVUZW1wbGF0ZSgpIHsKICAgICAgICAvLyBub3RlOiBjcmVhdGUgIndvcmtpbmciIHRlbXBsYXRlIHRoYXQgaXMgZmluYWxpemVkIGF0IGluc3RhbmNlIHRpbWUKICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9ICovICh0aGlzKS50ZW1wbGF0ZTsKICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGxldCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgdGVtcGxhdGUgPSB0OwogICAgICAgICAgfSBlbHNlIGlmICghUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgb2YgUHJvcGVydGllc0NoYW5nZWQgY3JlYXRlUHJvcGVydGllcyB0byBjcmVhdGUgYWNjZXNzb3JzCiAgICAgICAqIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIGZvciBhbGwgb2YgdGhlIHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgICAgIGNyZWF0ZVByb3BlcnR5RnJvbUNvbmZpZyh0aGlzLnByb3RvdHlwZSwgcCwgcHJvcHNbcF0sIHByb3BzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIG9ic2VydmVycyBmb3IgdGhlIGdpdmVuIGBvYnNlcnZlcnNgIGFycmF5LgogICAgICAgKiBMZXZlcmFnZXMgYFByb3BlcnR5RWZmZWN0c2AgdG8gY3JlYXRlIG9ic2VydmVycy4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVycyBBcnJheSBvZiBvYnNlcnZlciBkZXNjcmlwdG9ycyBmb3IKICAgICAgICogICB0aGlzIGNsYXNzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkeW5hbWljRm5zIE9iamVjdCBjb250YWluaW5nIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzCiAgICAgICAqICAgdGhhdCBhcmUgZnVuY3Rpb25zIGFuZCBzaG91bGQgdHJpZ2dlciB0aGUgZWZmZWN0IHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAqICAgcmVmZXJlbmNlIGlzIGNoYW5nZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZU9ic2VydmVycyhvYnNlcnZlcnMsIGR5bmFtaWNGbnMpIHsKICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG9ic2VydmVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcHJvdG8uX2NyZWF0ZU1ldGhvZE9ic2VydmVyKG9ic2VydmVyc1tpXSwgZHluYW1pY0Zucyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGlzIGVsZW1lbnQncyBzaGFkb3cgcm9vdC4KICAgICAgICoKICAgICAgICogSWYgYSBgc3RhdGljIGdldCBpcygpYCBnZXR0ZXIgaXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICogd2lsbCByZXR1cm4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCBpbiBhIGBkb20tbW9kdWxlYCB3aG9zZSBgaWRgCiAgICAgICAqIG1hdGNoZXMgdGhpcyBlbGVtZW50J3MgYGlzYC4KICAgICAgICoKICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZ2V0dGVyIHRvIHJldHVybiBhbiBhcmJpdHJhcnkgdGVtcGxhdGUKICAgICAgICogKGluIHdoaWNoIGNhc2UgdGhlIGBpc2AgZ2V0dGVyIGlzIHVubmVjZXNzYXJ5KS4gVGhlIHRlbXBsYXRlIHJldHVybmVkCiAgICAgICAqIG1heSBiZSBlaXRoZXIgYW4gYEhUTUxUZW1wbGF0ZUVsZW1lbnRgIG9yIGEgc3RyaW5nIHRoYXQgd2lsbCBiZQogICAgICAgKiBhdXRvbWF0aWNhbGx5IHBhcnNlZCBpbnRvIGEgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhhdCB3aGVuIHN1YmNsYXNzaW5nLCBpZiB0aGUgc3VwZXIgY2xhc3Mgb3ZlcnJvZGUgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzdWJjbGFzcyB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRlCiAgICAgICAqIHRlbXBsYXRlIHZpYSBhIGBkb20tbW9kdWxlYCwgaXQgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZ2V0dGVyIGFuZAogICAgICAgKiByZXR1cm4gYFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCh0aGlzLmlzLCAndGVtcGxhdGUnKWAuCiAgICAgICAqCiAgICAgICAqIElmIGEgc3ViY2xhc3Mgd291bGQgbGlrZSB0byBtb2RpZnkgdGhlIHN1cGVyIGNsYXNzIHRlbXBsYXRlLCBpdCBzaG91bGQKICAgICAgICogY2xvbmUgaXQgcmF0aGVyIHRoYW4gbW9kaWZ5IGl0IGluIHBsYWNlLiAgSWYgdGhlIGdldHRlciBkb2VzIGV4cGVuc2l2ZQogICAgICAgKiB3b3JrIHN1Y2ggYXMgY2xvbmluZy9tb2RpZnlpbmcgYSB0ZW1wbGF0ZSwgaXQgc2hvdWxkIG1lbW9pemUgdGhlCiAgICAgICAqIHRlbXBsYXRlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlOgogICAgICAgKgogICAgICAgKiAgIGxldCBtZW1vaXplZFRlbXBsYXRlOwogICAgICAgKiAgIGNsYXNzIE15U3ViQ2xhc3MgZXh0ZW5kcyBNeVN1cGVyQ2xhc3MgewogICAgICAgKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsKICAgICAgICogICAgICAgaWYgKCFtZW1vaXplZFRlbXBsYXRlKSB7CiAgICAgICAqICAgICAgICAgbWVtb2l6ZWRUZW1wbGF0ZSA9IE15U3VwZXJDbGFzcy50ZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAqICAgICAgICAgbGV0IHN1YkNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICogICAgICAgICBzdWJDb250ZW50LnRleHRDb250ZW50ID0gJ1RoaXMgY2FtZSBmcm9tIE15U3ViQ2xhc3MnOwogICAgICAgKiAgICAgICAgIG1lbW9pemVkVGVtcGxhdGUuY29udGVudC5hcHBlbmRDaGlsZChzdWJDb250ZW50KTsKICAgICAgICogICAgICAgfQogICAgICAgKiAgICAgICByZXR1cm4gbWVtb2l6ZWRUZW1wbGF0ZTsKICAgICAgICogICAgIH0KICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge0hUTUxUZW1wbGF0ZUVsZW1lbnR8c3RyaW5nfSBUZW1wbGF0ZSB0byBiZSBzdGFtcGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgIC8vIEV4cGxhbmF0aW9uIG9mIHRlbXBsYXRlLXJlbGF0ZWQgcHJvcGVydGllczoKICAgICAgICAvLyAtIGNvbnN0cnVjdG9yLnRlbXBsYXRlICh0aGlzIGdldHRlcik6IHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGNsYXNzLgogICAgICAgIC8vICAgICBUaGlzIGNhbiBjb21lIGZyb20gdGhlIHByb3RvdHlwZSAoZm9yIGxlZ2FjeSBlbGVtZW50cyksIGZyb20gYQogICAgICAgIC8vICAgICBkb20tbW9kdWxlLCBvciBmcm9tIHRoZSBzdXBlciBjbGFzcydzIHRlbXBsYXRlIChvciBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgIC8vICAgICBhbHRvZ2V0aGVyIGJ5IHRoZSB1c2VyKQogICAgICAgIC8vIC0gY29uc3RydWN0b3IuX3RlbXBsYXRlOiBtZW1vaXplZCB2ZXJzaW9uIG9mIGNvbnN0cnVjdG9yLnRlbXBsYXRlCiAgICAgICAgLy8gLSBwcm90b3R5cGUuX3RlbXBsYXRlOiB3b3JraW5nIHRlbXBsYXRlIGZvciB0aGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZQogICAgICAgIC8vICAgICBwYXJzZWQgYW5kIG1vZGlmaWVkIGluIHBsYWNlLiBJdCBpcyBhIGNsb25lZCB2ZXJzaW9uIG9mCiAgICAgICAgLy8gICAgIGNvbnN0cnVjdG9yLnRlbXBsYXRlLCBzYXZlZCBpbiBfZmluYWxpemVDbGFzcygpLiBOb3RlIHRoYXQgYmVmb3JlCiAgICAgICAgLy8gICAgIHRoaXMgZ2V0dGVyIGlzIGNhbGxlZCwgZm9yIGxlZ2FjeSBlbGVtZW50cyB0aGlzIGNvdWxkIGJlIGZyb20gYQogICAgICAgIC8vICAgICBfdGVtcGxhdGUgZmllbGQgb24gdGhlIGluZm8gb2JqZWN0IHBhc3NlZCB0byBQb2x5bWVyKCksIGEgYmVoYXZpb3IsCiAgICAgICAgLy8gICAgIG9yIHNldCBpbiByZWdpc3RlcmVkKCk7IG9uY2UgdGhlIHN0YXRpYyBnZXR0ZXIgcnVucywgYSBjbG9uZSBvZiBpdAogICAgICAgIC8vICAgICB3aWxsIG92ZXJ3cml0ZSBpdCBvbiB0aGUgcHJvdG90eXBlIGFzIHRoZSB3b3JraW5nIHRlbXBsYXRlLgogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzKSkpIHsKICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0KICAgICAgICAgICAgLy8gSWYgdXNlciBoYXMgcHV0IHRlbXBsYXRlIG9uIHByb3RvdHlwZSAoZS5nLiBpbiBsZWdhY3kgdmlhIHJlZ2lzdGVyZWQKICAgICAgICAgICAgLy8gY2FsbGJhY2sgb3IgaW5mbyBvYmplY3QpLCBwcmVmZXIgdGhhdCBmaXJzdAogICAgICAgICAgICB0aGlzLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzLnByb3RvdHlwZSkpID8KICAgICAgICAgICAgdGhpcy5wcm90b3R5cGUuX3RlbXBsYXRlIDoKICAgICAgICAgICAgLy8gTG9vayBpbiBkb20tbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQncyBpcwogICAgICAgICAgICAoZ2V0VGVtcGxhdGVGcm9tRG9tTW9kdWxlKC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0qLyAodGhpcykuaXMpIHx8CiAgICAgICAgICAgIC8vIE5leHQgbG9vayBmb3Igc3VwZXJjbGFzcyB0ZW1wbGF0ZSAoY2FsbCB0aGUgc3VwZXIgaW1wbCB0aGlzCiAgICAgICAgICAgIC8vIHdheSBzbyB0aGF0IGB0aGlzYCBwb2ludHMgdG8gdGhlIHN1cGVyY2xhc3MpCiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IudGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXQgdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fHN0cmluZ30gdmFsdWUgVGVtcGxhdGUgdG8gc2V0LgogICAgICAgKi8KICAgICAgc3RhdGljIHNldCB0ZW1wbGF0ZSh2YWx1ZSkgewogICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXRoIG1hdGNoaW5nIHRoZSB1cmwgZnJvbSB3aGljaCB0aGUgZWxlbWVudCB3YXMgaW1wb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgcGF0aCBpcyB1c2VkIHRvIHJlc29sdmUgdXJsJ3MgaW4gdGVtcGxhdGUgc3R5bGUgY3NzVGV4dC4KICAgICAgICogVGhlIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSBpcyBhbHNvIHNldCBvbiBlbGVtZW50IGluc3RhbmNlcyBhbmQgY2FuIGJlCiAgICAgICAqIHVzZWQgdG8gY3JlYXRlIGJpbmRpbmdzIHJlbGF0aXZlIHRvIHRoZSBpbXBvcnQgcGF0aC4KICAgICAgICoKICAgICAgICogRm9yIGVsZW1lbnRzIGRlZmluZWQgaW4gRVMgbW9kdWxlcywgdXNlcnMgc2hvdWxkIGltcGxlbWVudAogICAgICAgKiBgc3RhdGljIGdldCBpbXBvcnRNZXRhKCkgeyByZXR1cm4gaW1wb3J0Lm1ldGE7IH1gLCBhbmQgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gb2YgYGltcG9ydFBhdGhgIHdpbGwgIHJldHVybiBgaW1wb3J0Lm1ldGEudXJsYCdzIHBhdGguCiAgICAgICAqIEZvciBlbGVtZW50cyBkZWZpbmVkIGluIEhUTUwgaW1wb3J0cywgdGhpcyBnZXR0ZXIgd2lsbCByZXR1cm4gdGhlIHBhdGgKICAgICAgICogdG8gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBgZG9tLW1vZHVsZWAgZWxlbWVudCBtYXRjaGluZyB0aGlzCiAgICAgICAqIGVsZW1lbnQncyBzdGF0aWMgYGlzYCBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhpcyBwYXRoIHNob3VsZCBjb250YWluIGEgdHJhaWxpbmcgYC9gLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbXBvcnQgcGF0aCBmb3IgdGhpcyBlbGVtZW50IGNsYXNzCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9CiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydFBhdGgoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19pbXBvcnRQYXRoJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5pbXBvcnRNZXRhOwogICAgICAgICAgaWYgKG1ldGEpIHsKICAgICAgICAgICAgdGhpcy5faW1wb3J0UGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChtZXRhLnVybCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBQb2x5bWVyLkRvbU1vZHVsZSAmJiBQb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAodGhpcykuaXMpOwogICAgICAgICAgICB0aGlzLl9pbXBvcnRQYXRoID0gKG1vZHVsZSAmJiBtb2R1bGUuYXNzZXRwYXRoKSB8fAogICAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IuaW1wb3J0UGF0aDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgIH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLwogICAgICAgIHRoaXMuX3RlbXBsYXRlOwogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgdGhpcy5yb290UGF0aDsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLmltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtTdGFtcGVkVGVtcGxhdGUgfCBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3R9ICovCiAgICAgICAgdGhpcy5yb290OwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdDxzdHJpbmcsICFFbGVtZW50Pn0gKi8KICAgICAgICB0aGlzLiQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIHRvIGVuc3VyZSBjbGFzcwogICAgICAgKiBtZXRhcHJvZ3JhbW1pbmcgcmVsYXRlZCB0byBwcm9wZXJ0eSBhY2Nlc3NvcnMgYW5kIGVmZmVjdHMgaGFzCiAgICAgICAqIGNvbXBsZXRlZCAoY2FsbHMgYGZpbmFsaXplYCkuCiAgICAgICAqCiAgICAgICAqIEl0IGFsc28gaW5pdGlhbGl6ZXMgYW55IHByb3BlcnR5IGRlZmF1bHRzIHByb3ZpZGVkIHZpYSBgdmFsdWVgIGluCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHRoaXMuY29uc3RydWN0b3IuZmluYWxpemUoKTsKICAgICAgICAvLyBub3RlOiBmaW5hbGl6ZSB0ZW1wbGF0ZSB3aGVuIHdlIGhhdmUgYWNjZXNzIHRvIGBsb2NhbE5hbWVgIHRvCiAgICAgICAgLy8gYXZvaWQgZGVwZW5kZW5jZSBvbiBgaXNgIGZvciBwb2x5ZmlsbGluZyBzdHlsaW5nLgogICAgICAgIHRoaXMuY29uc3RydWN0b3IuX2ZpbmFsaXplVGVtcGxhdGUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLmxvY2FsTmFtZSk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gc2V0IHBhdGggZGVmYXVsdHMKICAgICAgICB0aGlzLnJvb3RQYXRoID0gUG9seW1lci5yb290UGF0aDsKICAgICAgICB0aGlzLmltcG9ydFBhdGggPSB0aGlzLmNvbnN0cnVjdG9yLmltcG9ydFBhdGg7CiAgICAgICAgLy8gYXBwbHkgcHJvcGVydHkgZGVmYXVsdHMuLi4KICAgICAgICBsZXQgcCQgPSBwcm9wZXJ0eURlZmF1bHRzKHRoaXMuY29uc3RydWN0b3IpOwogICAgICAgIGlmICghcCQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgcCBpbiBwJCkgewogICAgICAgICAgbGV0IGluZm8gPSBwJFtwXTsKICAgICAgICAgIC8vIERvbid0IHNldCBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb3duIHByb3BlcnR5LCB3aGljaAogICAgICAgICAgLy8gaGFwcGVucyB3aGVuIGEgYHByb3BlcnRpZXNgIHByb3BlcnR5IHdpdGggZGVmYXVsdCBidXQgbm8gZWZmZWN0cyBoYWQKICAgICAgICAgIC8vIGEgcHJvcGVydHkgc2V0IChlLmcuIGJvdW5kKSBieSBpdHMgaG9zdCBiZWZvcmUgdXBncmFkZQogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHApKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHR5cGVvZiBpbmZvLnZhbHVlID09ICdmdW5jdGlvbicgPwogICAgICAgICAgICAgIGluZm8udmFsdWUuY2FsbCh0aGlzKSA6CiAgICAgICAgICAgICAgaW5mby52YWx1ZTsKICAgICAgICAgICAgLy8gU2V0IHZpYSBgX3NldFByb3BlcnR5YCBpZiB0aGVyZSBpcyBhbiBhY2Nlc3NvciwgdG8gZW5hYmxlCiAgICAgICAgICAgIC8vIGluaXRpYWxpemluZyByZWFkT25seSBwcm9wZXJ0eSBkZWZhdWx0cwogICAgICAgICAgICBpZiAodGhpcy5faGFzQWNjZXNzb3IocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocCwgdmFsdWUsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXNbcF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEdhdGhlciBzdHlsZSB0ZXh0IGZvciBhIHN0eWxlIGVsZW1lbnQgaW4gdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3NzVGV4dCBUZXh0IGNvbnRhaW5pbmcgc3R5bGluZyB0byBwcm9jZXNzCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlYmFzZSBDU1MgcGF0aHMgYWdhaW5zdAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9jZXNzZWQgQ1NTIHRleHQKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAqIENvbmZpZ3VyZXMgYW4gZWxlbWVudCBgcHJvdG9gIHRvIGZ1bmN0aW9uIHdpdGggYSBnaXZlbiBgdGVtcGxhdGVgLgogICAgICAqIFRoZSBlbGVtZW50IG5hbWUgYGlzYCBhbmQgZXh0ZW5kcyBgZXh0YCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgU2hhZHlDU1MKICAgICAgKiBzdHlsZSBzY29waW5nLgogICAgICAqCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlzIFRhZyBuYW1lIChvciB0eXBlIGV4dGVuc2lvbiBuYW1lKSBmb3IgdGhpcyBlbGVtZW50CiAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICovCiAgICAgIHN0YXRpYyBfZmluYWxpemVUZW1wbGF0ZShpcykgewogICAgICAgIC8qKiBAY29uc3Qge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGU7CiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5fX3BvbHltZXJGaW5hbGl6ZWQpIHsKICAgICAgICAgIHRlbXBsYXRlLl9fcG9seW1lckZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGhpcy5pbXBvcnRQYXRoOwogICAgICAgICAgY29uc3QgYmFzZVVSSSA9IGltcG9ydFBhdGggPyBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybChpbXBvcnRQYXRoKSA6ICcnOwogICAgICAgICAgLy8gZS5nLiBzdXBwb3J0IGBpbmNsdWRlPSJtb2R1bGUtbmFtZSJgLCBhbmQgU2hhZHlDU1MKICAgICAgICAgIHByb2Nlc3NFbGVtZW50U3R5bGVzKHRoaXMsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSk7CiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0YW5kYXJkIEN1c3RvbSBFbGVtZW50cwogICAgICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgLgogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBlbmFibGVzIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIHN5c3RlbSBhbmQKICAgICAgICogZmx1c2hlcyBhbnkgcGVuZGluZyBwcm9wZXJ0aWVzLCBhbmQgdXBkYXRlcyBzaGltbWVkIENTUyBwcm9wZXJ0aWVzCiAgICAgICAqIHdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcvY3VzdG9tIHByb3BlcnRpZXMgcG9seWZpbGwuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXMsIGludmFsaWRDYXN0c30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudCgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykpOwogICAgICAgIH0KICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3RhbXBzIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0aGlzLl90ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICB9CiAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5RWZmZWN0c2AncyBgX3JlYWR5Q2xpZW50c2AgY2FsbC4gQXR0YWNoZXMKICAgICAgICogZWxlbWVudCBkb20gYnkgY2FsbGluZyBgX2F0dGFjaERvbWAgd2l0aCB0aGUgZG9tIHN0YW1wZWQgZnJvbSB0aGUKICAgICAgICogZWxlbWVudCdzIHRlbXBsYXRlIHZpYSBgX3N0YW1wVGVtcGxhdGVgLiBOb3RlIHRoYXQgdGhpcyBhbGxvd3MKICAgICAgICogY2xpZW50IGRvbSB0byBiZSBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCBwcmlvciB0byBhbnkgb2JzZXJ2ZXJzCiAgICAgICAqIHJ1bm5pbmcuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX2F0dGFjaERvbSgvKiogQHR5cGUge1N0YW1wZWRUZW1wbGF0ZX0gKi8odGhpcy5yb290KSk7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSBzdXBlci5fcmVhZHlDbGllbnRzIGhlcmUgc2V0cyB0aGUgY2xpZW50cyBpbml0aWFsaXplZCBmbGFnLgogICAgICAgIC8vIFdlIG11c3Qgd2FpdCB0byBkbyB0aGlzIHVudGlsIGFmdGVyIGNsaWVudCBkb20gaXMgY3JlYXRlZC9hdHRhY2hlZAogICAgICAgIC8vIHNvIHRoYXQgdGhpcyBmbGFnIGNhbiBiZSBjaGVja2VkIHRvIHByZXZlbnQgbm90aWZpY2F0aW9ucyBmaXJlZAogICAgICAgIC8vIGR1cmluZyB0aGlzIHByb2Nlc3MgZnJvbSBiZWluZyBoYW5kbGVkIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgICAgICBzdXBlci5fcmVhZHlDbGllbnRzKCk7CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogQXR0YWNoZXMgYW4gZWxlbWVudCdzIHN0YW1wZWQgZG9tIHRvIGl0c2VsZi4gQnkgZGVmYXVsdCwKICAgICAgICogdGhpcyBtZXRob2QgY3JlYXRlcyBhIGBzaGFkb3dSb290YCBhbmQgYWRkcyB0aGUgZG9tIHRvIGl0LgogICAgICAgKiBIb3dldmVyLCB0aGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhbGxvdyBhbiBlbGVtZW50CiAgICAgICAqIHRvIHB1dCBpdHMgZG9tIGluIGFub3RoZXIgbG9jYXRpb24uCiAgICAgICAqCiAgICAgICAqIEB0aHJvd3Mge0Vycm9yfQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdSZXR1cm59CiAgICAgICAqIEBwYXJhbSB7U3RhbXBlZFRlbXBsYXRlfSBkb20gdG8gYXR0YWNoIHRvIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtTaGFkb3dSb290fSBub2RlIHRvIHdoaWNoIHRoZSBkb20gaGFzIGJlZW4gYXR0YWNoZWQuCiAgICAgICAqLwogICAgICBfYXR0YWNoRG9tKGRvbSkgewogICAgICAgIGlmICh0aGlzLmF0dGFjaFNoYWRvdykgewogICAgICAgICAgaWYgKGRvbSkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCkgewogICAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHttb2RlOiAnb3Blbid9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoZG9tKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRvd0RPTSBub3QgYXZhaWxhYmxlLiAnICsKICAgICAgICAgICAgLy8gVE9ETyhzb3J2ZWxsKTogbW92ZSB0byBjb21waWxlLXRpbWUgY29uZGl0aW9uYWwgd2hlbiBzdXBwb3J0ZWQKICAgICAgICAgICdQb2x5bWVyLkVsZW1lbnQgY2FuIGNyZWF0ZSBkb20gYXMgY2hpbGRyZW4gaW5zdGVhZCBvZiBpbiAnICsKICAgICAgICAgICdTaGFkb3dET00gYnkgc2V0dGluZyBgdGhpcy5yb290ID0gdGhpcztcYCBiZWZvcmUgXGByZWFkeVxgLicpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcgYW5kIGN1c3RvbSBwcm9wZXJ0eSBzaGltLCBjYXVzZXMgYWxsCiAgICAgICAqIHNoaW1tZWQgc3R5bGVzIGluIHRoaXMgZWxlbWVudCAoYW5kIGl0cyBzdWJ0cmVlKSB0byBiZSB1cGRhdGVkCiAgICAgICAqIGJhc2VkIG9uIGN1cnJlbnQgY3VzdG9tIHByb3BlcnR5IHZhbHVlcy4KICAgICAgICoKICAgICAgICogVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvdmVycmlkZXMgaW5saW5lIGN1c3RvbSBwcm9wZXJ0eSBzdHlsZXMgd2l0aCBhbgogICAgICAgKiBvYmplY3Qgb2YgcHJvcGVydGllcyB3aGVyZSB0aGUga2V5cyBhcmUgQ1NTIHByb3BlcnRpZXMsIGFuZCB0aGUgdmFsdWVzCiAgICAgICAqIGFyZSBzdHJpbmdzLgogICAgICAgKgogICAgICAgKiBFeGFtcGxlOiBgdGhpcy51cGRhdGVTdHlsZXMoeyctLWNvbG9yJzogJ2JsdWUnfSlgCiAgICAgICAqCiAgICAgICAqIFRoZXNlIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkIHVubGVzcyBhIHZhbHVlIG9mIGBudWxsYCBpcyBzZXQuCiAgICAgICAqCiAgICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCB1cGRhdGluZyBDU1MgbWl4aW5zLgogICAgICAgKiBZb3UgY2FuIG5vdCBkeW5hbWljYWxseSBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFuIGBAYXBwbHlgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICAgICAqICAgYXBwbHkgdG8gdGhpcyBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIHVwZGF0ZVN0eWxlcyhwcm9wZXJ0aWVzKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnRpZXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJld3JpdGVzIGEgZ2l2ZW4gVVJMIHJlbGF0aXZlIHRvIGEgYmFzZSBVUkwuIFRoZSBiYXNlIFVSTCBkZWZhdWx0cyB0bwogICAgICAgKiB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIGBkb20tbW9kdWxlYCBmb3IKICAgICAgICogdGhpcyBlbGVtZW50LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2FtZSBVUkwgYmVmb3JlIGFuZCBhZnRlcgogICAgICAgKiBidW5kbGluZy4KICAgICAgICoKICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgICAqIHdpdGggYC9gIChhYnNvbHV0ZSBVUkxzKSBvciBgI2AgKGhhc2ggaWRlbnRpZmllcnMpLiAgRm9yIGdlbmVyYWwgcHVycG9zZQogICAgICAgKiBVUkwgcmVzb2x1dGlvbiwgdXNlIGB3aW5kb3cuVVJMYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgdG8gcmVzb2x2ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBiYXNlIE9wdGlvbmFsIGJhc2UgVVJMIHRvIHJlc29sdmUgYWdhaW5zdCwgZGVmYXVsdHMKICAgICAgICogdG8gdGhlIGVsZW1lbnQncyBgaW1wb3J0UGF0aGAKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBSZXdyaXR0ZW4gVVJMIHJlbGF0aXZlIHRvIGJhc2UKICAgICAgICovCiAgICAgIHJlc29sdmVVcmwodXJsLCBiYXNlKSB7CiAgICAgICAgaWYgKCFiYXNlICYmIHRoaXMuaW1wb3J0UGF0aCkgewogICAgICAgICAgYmFzZSA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlVXJsKHRoaXMuaW1wb3J0UGF0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCh1cmwsIGJhc2UpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0eUFjY2Vzc29yc2AgdG8gYWRkIG1hcCBvZiBkeW5hbWljIGZ1bmN0aW9ucyBvbgogICAgICAgKiB0ZW1wbGF0ZSBpbmZvLCBmb3IgY29uc3VtcHRpb24gYnkgYFByb3BlcnR5RWZmZWN0c2AgdGVtcGxhdGUgYmluZGluZwogICAgICAgKiBjb2RlLiBUaGlzIG1hcCBkZXRlcm1pbmVzIHdoaWNoIG1ldGhvZCB0ZW1wbGF0ZXMgc2hvdWxkIGhhdmUgYWNjZXNzb3JzCiAgICAgICAqIGNyZWF0ZWQgZm9yIHRoZW0uCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zIHx8IHRoaXMuX3Byb3BlcnRpZXM7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9wYXJzZVRlbXBsYXRlQ29udGVudCh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIFBvbHltZXJFbGVtZW50OwogIH0pOwoKICAvKioKICAgKiBXaGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydHkgc2hpbSwgY2F1c2VzIGFsbAogICAqIHNoaW1tZWQgYHN0eWxlc2AgKHZpYSBgY3VzdG9tLXN0eWxlYCkgaW4gdGhlIGRvY3VtZW50IChhbmQgaXRzIHN1YnRyZWUpCiAgICogdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBjdXJyZW50IGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIG92ZXJyaWRlcyBpbmxpbmUgY3VzdG9tIHByb3BlcnR5IHN0eWxlcyB3aXRoIGFuCiAgICogb2JqZWN0IG9mIHByb3BlcnRpZXMgd2hlcmUgdGhlIGtleXMgYXJlIENTUyBwcm9wZXJ0aWVzLCBhbmQgdGhlIHZhbHVlcwogICAqIGFyZSBzdHJpbmdzLgogICAqCiAgICogRXhhbXBsZTogYFBvbHltZXIudXBkYXRlU3R5bGVzKHsnLS1jb2xvcic6ICdibHVlJ30pYAogICAqCiAgICogVGhlc2UgcHJvcGVydGllcyBhcmUgcmV0YWluZWQgdW5sZXNzIGEgdmFsdWUgb2YgYG51bGxgIGlzIHNldC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0PX0gcHJvcHMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICogICBhcHBseSB0byB0aGUgZG9jdW1lbnQuCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnVwZGF0ZVN0eWxlcyA9IGZ1bmN0aW9uKHByb3BzKSB7CiAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZURvY3VtZW50KHByb3BzKTsKICAgIH0KICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAc3VtbWFyeSBDb2xsYXBzZSBtdWx0aXBsZSBjYWxsYmFja3MgaW50byBvbmUgaW52b2NhdGlvbiBhZnRlciBhIHRpbWVyLgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgY2xhc3MgRGVib3VuY2VyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLl9hc3luY01vZHVsZSA9IG51bGw7CiAgICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbDsKICAgICAgdGhpcy5fdGltZXIgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzY2hlZHVsZXI7IHRoYXQgaXMsIGEgbW9kdWxlIHdpdGggdGhlIEFzeW5jIGludGVyZmFjZSwKICAgICAqIGEgY2FsbGJhY2sgYW5kIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHJ1biBmdW5jdGlvbgogICAgICogZnJvbSB0aGUgYXN5bmMgbW9kdWxlLgogICAgICoKICAgICAqIEBwYXJhbSB7IUFzeW5jSW50ZXJmYWNlfSBhc3luY01vZHVsZSBPYmplY3Qgd2l0aCBBc3luYyBpbnRlcmZhY2UuCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgdGhpcy5fYXN5bmNNb2R1bGUgPSBhc3luY01vZHVsZTsKICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgdGhpcy5fdGltZXIgPSB0aGlzLl9hc3luY01vZHVsZS5ydW4oKCkgPT4gewogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ2FuY2VscyBhbiBhY3RpdmUgZGVib3VuY2VyIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjYW5jZWwoKSB7CiAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHsKICAgICAgICB0aGlzLl9hc3luY01vZHVsZS5jYW5jZWwodGhpcy5fdGltZXIpOwogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFuIGFjdGl2ZSBkZWJvdW5jZXIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgogICAgICoKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFjdGl2ZS4KICAgICAqLwogICAgaXNBY3RpdmUoKSB7CiAgICAgIHJldHVybiB0aGlzLl90aW1lciAhPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VyIGlmIG5vIGRlYm91bmNlciBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIKICAgICAqIG9yIGl0IGNhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlciBvdGhlcndpc2UuIFRoZSBmb2xsb3dpbmcKICAgICAqIGV4YW1wbGUgc2hvd3MgaG93IGEgZGVib3VuY2VyIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEKICAgICAqIG1pY3JvdGFzayBhbmQgImRlYm91bmNlZCIgc3VjaCB0aGF0IHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcwogICAgICogY2FsbGVkIG9uY2UuIEFkZCB0aGlzIG1ldGhvZCB0byBhIGN1c3RvbSBlbGVtZW50OgogICAgICoKICAgICAqIF9kZWJvdW5jZVdvcmsoKSB7CiAgICAgKiAgIHRoaXMuX2RlYm91bmNlSm9iID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UodGhpcy5fZGVib3VuY2VKb2IsCiAgICAgKiAgICAgICBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzaywgKCkgPT4gewogICAgICogICAgIHRoaXMuX2RvV29yaygpOwogICAgICogICB9KTsKICAgICAqIH0KICAgICAqCiAgICAgKiBJZiB0aGUgYF9kZWJvdW5jZVdvcmtgIG1ldGhvZCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lCiAgICAgKiBtaWNyb3Rhc2ssIHRoZSBgX2RvV29ya2AgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIGF0IHRoZSBuZXh0CiAgICAgKiBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBOb3RlOiBJbiB0ZXN0aW5nIGl0IGlzIG9mdGVuIGNvbnZlbmllbnQgdG8gYXZvaWQgYXN5bmNocm9ueS4gVG8gYWNjb21wbGlzaAogICAgICogdGhpcyB3aXRoIGEgZGVib3VuY2VyLCB5b3UgY2FuIHVzZSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYCBhbmQKICAgICAqIGBQb2x5bWVyLmZsdXNoYC4gRm9yIGV4YW1wbGUsIGV4dGVuZCB0aGUgYWJvdmUgZXhhbXBsZSBieSBhZGRpbmcKICAgICAqIGBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIodGhpcy5fZGVib3VuY2VKb2IpYCBhdCB0aGUgZW5kIG9mIHRoZQogICAgICogYF9kZWJvdW5jZVdvcmtgIG1ldGhvZC4gVGhlbiBpbiBhIHRlc3QsIGNhbGwgYFBvbHltZXIuZmx1c2hgIHRvIGVuc3VyZQogICAgICogdGhlIGRlYm91bmNlciBoYXMgY29tcGxldGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7RGVib3VuY2VyP30gZGVib3VuY2VyIERlYm91bmNlciBvYmplY3QuCiAgICAgKiBAcGFyYW0geyFBc3luY0ludGVyZmFjZX0gYXN5bmNNb2R1bGUgT2JqZWN0IHdpdGggQXN5bmMgaW50ZXJmYWNlCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4geyFEZWJvdW5jZXJ9IFJldHVybnMgYSBkZWJvdW5jZXIgb2JqZWN0LgogICAgICovCiAgICBzdGF0aWMgZGVib3VuY2UoZGVib3VuY2VyLCBhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgaWYgKGRlYm91bmNlciBpbnN0YW5jZW9mIERlYm91bmNlcikgewogICAgICAgIGRlYm91bmNlci5jYW5jZWwoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWJvdW5jZXIgPSBuZXcgRGVib3VuY2VyKCk7CiAgICAgIH0KICAgICAgZGVib3VuY2VyLnNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spOwogICAgICByZXR1cm4gZGVib3VuY2VyOwogICAgfQogIH0KCiAgLyoqIEBjb25zdCAqLwogIFBvbHltZXIuRGVib3VuY2VyID0gRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBkZXRlY3QgbmF0aXZlIHRvdWNoIGFjdGlvbiBzdXBwb3J0CiAgbGV0IEhBU19OQVRJVkVfVEEgPSB0eXBlb2YgZG9jdW1lbnQuaGVhZC5zdHlsZS50b3VjaEFjdGlvbiA9PT0gJ3N0cmluZyc7CiAgbGV0IEdFU1RVUkVfS0VZID0gJ19fcG9seW1lckdlc3R1cmVzJzsKICBsZXQgSEFORExFRF9PQkogPSAnX19wb2x5bWVyR2VzdHVyZXNIYW5kbGVkJzsKICBsZXQgVE9VQ0hfQUNUSU9OID0gJ19fcG9seW1lckdlc3R1cmVzVG91Y2hBY3Rpb24nOwogIC8vIHJhZGl1cyBmb3IgdGFwIGFuZCB0cmFjawogIGxldCBUQVBfRElTVEFOQ0UgPSAyNTsKICBsZXQgVFJBQ0tfRElTVEFOQ0UgPSA1OwogIC8vIG51bWJlciBvZiBsYXN0IE4gdHJhY2sgcG9zaXRpb25zIHRvIGtlZXAKICBsZXQgVFJBQ0tfTEVOR1RIID0gMjsKCiAgLy8gRGlzYWJsaW5nICJtb3VzZSIgaGFuZGxlcnMgZm9yIDI1MDBtcyBpcyBlbm91Z2gKICBsZXQgTU9VU0VfVElNRU9VVCA9IDI1MDA7CiAgbGV0IE1PVVNFX0VWRU5UUyA9IFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ2NsaWNrJ107CiAgLy8gYW4gYXJyYXkgb2YgYml0bWFzayB2YWx1ZXMgZm9yIG1hcHBpbmcgTW91c2VFdmVudC53aGljaCB0byBNb3VzZUV2ZW50LmJ1dHRvbnMKICBsZXQgTU9VU0VfV0hJQ0hfVE9fQlVUVE9OUyA9IFswLCAxLCA0LCAyXTsKICBsZXQgTU9VU0VfSEFTX0JVVFRPTlMgPSAoZnVuY3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gbmV3IE1vdXNlRXZlbnQoJ3Rlc3QnLCB7YnV0dG9uczogMX0pLmJ1dHRvbnMgPT09IDE7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9KSgpOwoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQb3NzaWJsZSBtb3VzZSBldmVudCBuYW1lCiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBtb3VzZSBldmVudCwgZmFsc2UgaWYgbm90CiAgICovCiAgZnVuY3Rpb24gaXNNb3VzZUV2ZW50KG5hbWUpIHsKICAgIHJldHVybiBNT1VTRV9FVkVOVFMuaW5kZXhPZihuYW1lKSA+IC0xOwogIH0KCiAgLyogZXNsaW50IG5vLWVtcHR5OiBbImVycm9yIiwgeyAiYWxsb3dFbXB0eUNhdGNoIjogdHJ1ZSB9XSAqLwogIC8vIGNoZWNrIGZvciBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycwogIGxldCBTVVBQT1JUU19QQVNTSVZFID0gZmFsc2U7CiAgKGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgbGV0IG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge2dldCgpIHtTVVBQT1JUU19QQVNTSVZFID0gdHJ1ZTt9fSk7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICB9IGNhdGNoKGUpIHt9CiAgfSkoKTsKCiAgLyoqCiAgICogR2VuZXJhdGUgc2V0dGluZ3MgZm9yIGV2ZW50IGxpc3RlbmVycywgZGVwZW5kYW50IG9uIGBQb2x5bWVyLnBhc3NpdmVUb3VjaEdlc3R1cmVzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBFdmVudCBuYW1lIHRvIGRldGVybWluZSBpZiBge3Bhc3NpdmV9YCBvcHRpb24gaXMgbmVlZGVkCiAgICogQHJldHVybiB7e3Bhc3NpdmU6IGJvb2xlYW59IHwgdW5kZWZpbmVkfSBPcHRpb25zIHRvIHVzZSBmb3IgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAqLwogIGZ1bmN0aW9uIFBBU1NJVkVfVE9VQ0goZXZlbnROYW1lKSB7CiAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50TmFtZSkgfHwgZXZlbnROYW1lID09PSAndG91Y2hlbmQnKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChIQVNfTkFUSVZFX1RBICYmIFNVUFBPUlRTX1BBU1NJVkUgJiYgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcykgewogICAgICByZXR1cm4ge3Bhc3NpdmU6IHRydWV9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KCiAgLy8gQ2hlY2sgZm9yIHRvdWNoLW9ubHkgZGV2aWNlcwogIGxldCBJU19UT1VDSF9PTkxZID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKXxBbmRyb2lkLyk7CgogIGxldCBHZXN0dXJlUmVjb2duaXplciA9IGZ1bmN0aW9uKCl7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTogdm9pZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUucmVzZXQ7CiAgLyoqIEB0eXBlIHtmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vkb3duOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vtb3ZlOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2V1cDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihUb3VjaEV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLnRvdWNoc3RhcnQ7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaG1vdmU7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaGVuZDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLmNsaWNrOwoKICAvLyBrZWVwIHRyYWNrIG9mIGFueSBsYWJlbHMgaGl0IGJ5IHRoZSBtb3VzZUNhbmNlbGxlcgogIC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gKi8KICBjb25zdCBjbGlja2VkTGFiZWxzID0gW107CgogIC8qKiBAdHlwZSB7IU9iamVjdDxib29sZWFuPn0gKi8KICBjb25zdCBsYWJlbGxhYmxlID0gewogICAgJ2J1dHRvbic6IHRydWUsCiAgICAnaW5wdXQnOiB0cnVlLAogICAgJ2tleWdlbic6IHRydWUsCiAgICAnbWV0ZXInOiB0cnVlLAogICAgJ291dHB1dCc6IHRydWUsCiAgICAndGV4dGFyZWEnOiB0cnVlLAogICAgJ3Byb2dyZXNzJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlCiAgfTsKCiAgLy8gRGVmaW5lZCBhdCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNlbmFibGluZy1hbmQtZGlzYWJsaW5nLWZvcm0tY29udHJvbHM6LXRoZS1kaXNhYmxlZC1hdHRyaWJ1dGUKICAvKiogQHR5cGUgeyFPYmplY3Q8Ym9vbGVhbj59ICovCiAgY29uc3QgY2FuQmVEaXNhYmxlZCA9IHsKICAgICdidXR0b24nOiB0cnVlLAogICAgJ2NvbW1hbmQnOiB0cnVlLAogICAgJ2ZpZWxkc2V0JzogdHJ1ZSwKICAgICdpbnB1dCc6IHRydWUsCiAgICAna2V5Z2VuJzogdHJ1ZSwKICAgICdvcHRncm91cCc6IHRydWUsCiAgICAnb3B0aW9uJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlLAogICAgJ3RleHRhcmVhJzogdHJ1ZQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdG8gY2hlY2sgbGFiZWxsaW5nIHN0YXR1cwogICAqIEByZXR1cm4ge2Jvb2xlYW59IGVsZW1lbnQgY2FuIGhhdmUgbGFiZWxzCiAgICovCiAgZnVuY3Rpb24gY2FuQmVMYWJlbGxlZChlbCkgewogICAgcmV0dXJuIGxhYmVsbGFibGVbZWwubG9jYWxOYW1lXSB8fCBmYWxzZTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdGhhdCBtYXkgYmUgbGFiZWxsZWQuCiAgICogQHJldHVybiB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gUmVsZXZhbnQgbGFiZWwgZm9yIGBlbGAKICAgKi8KICBmdW5jdGlvbiBtYXRjaGluZ0xhYmVscyhlbCkgewogICAgbGV0IGxhYmVscyA9IEFycmF5LmZyb20oLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyhlbCkubGFiZWxzIHx8IFtdKTsKICAgIC8vIElFIGRvZXNuJ3QgaGF2ZSBgbGFiZWxzYCBhbmQgU2FmYXJpIGRvZXNuJ3QgcG9wdWxhdGUgYGxhYmVsc2AKICAgIC8vIGlmIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3dyb290LgogICAgLy8gSW4gdGhpcyBpbnN0YW5jZSwgZmluZGluZyB0aGUgbm9uLWFuY2VzdG9yIGxhYmVscyBpcyBlbm91Z2gsCiAgICAvLyBhcyB0aGUgbW91c2VDYW5jZWxsb3IgY29kZSB3aWxsIGhhbmRsZSBhbmNzdG9yIGxhYmVscwogICAgaWYgKCFsYWJlbHMubGVuZ3RoKSB7CiAgICAgIGxhYmVscyA9IFtdOwogICAgICBsZXQgcm9vdCA9IGVsLmdldFJvb3ROb2RlKCk7CiAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlkIG9uIGBlbGAsIGNoZWNrIGZvciBhbGwgbGFiZWxzIHdpdGggYSBtYXRjaGluZyBgZm9yYCBhdHRyaWJ1dGUKICAgICAgaWYgKGVsLmlkKSB7CiAgICAgICAgbGV0IG1hdGNoaW5nID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKGBsYWJlbFtmb3IgPSAke2VsLmlkfV1gKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsYWJlbHMucHVzaCgvKiogQHR5cGUgeyFIVE1MTGFiZWxFbGVtZW50fSAqLyhtYXRjaGluZ1tpXSkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGxhYmVsczsKICB9CgogIC8vIHRvdWNoIHdpbGwgbWFrZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgLy8gYHByZXZlbnREZWZhdWx0YCBvbiB0b3VjaGVuZCB3aWxsIGNhbmNlbCB0aGVtLAogIC8vIGJ1dCB0aGlzIGJyZWFrcyBgPGlucHV0PmAgZm9jdXMgYW5kIGxpbmsgY2xpY2tzCiAgLy8gZGlzYWJsZSBtb3VzZSBoYW5kbGVycyBmb3IgTU9VU0VfVElNRU9VVCBtcyBhZnRlcgogIC8vIGEgdG91Y2hlbmQgdG8gaWdub3JlIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICBsZXQgbW91c2VDYW5jZWxsZXIgPSBmdW5jdGlvbihtb3VzZUV2ZW50KSB7CiAgICAvLyBDaGVjayBmb3Igc291cmNlQ2FwYWJpbGl0aWVzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIHN5bnRoZXRpYyBldmVudHMKICAgIC8vIGlmIG1vdXNlRXZlbnQgZGlkIG5vdCBjb21lIGZyb20gYSBkZXZpY2UgdGhhdCBmaXJlcyB0b3VjaCBldmVudHMsCiAgICAvLyBpdCB3YXMgbWFkZSBieSBhIHJlYWwgbW91c2UgYW5kIHNob3VsZCBiZSBjb3VudGVkCiAgICAvLyBodHRwOi8vd2ljZy5naXRodWIuaW8vSW5wdXREZXZpY2VDYXBhYmlsaXRpZXMvI2RvbS1pbnB1dGRldmljZWNhcGFiaWxpdGllcy1maXJlc3RvdWNoZXZlbnRzCiAgICBsZXQgc2MgPSBtb3VzZUV2ZW50LnNvdXJjZUNhcGFiaWxpdGllczsKICAgIGlmIChzYyAmJiAhc2MuZmlyZXNUb3VjaEV2ZW50cykgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBza2lwIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICAgIG1vdXNlRXZlbnRbSEFORExFRF9PQkpdID0ge3NraXA6IHRydWV9OwogICAgLy8gZGlzYWJsZSAiZ2hvc3QgY2xpY2tzIgogICAgaWYgKG1vdXNlRXZlbnQudHlwZSA9PT0gJ2NsaWNrJykgewogICAgICBsZXQgY2xpY2tGcm9tTGFiZWwgPSBmYWxzZTsKICAgICAgbGV0IHBhdGggPSBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCAmJiBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICBpZiAocGF0aCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHBhdGhbaV0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIGlmIChwYXRoW2ldLmxvY2FsTmFtZSA9PT0gJ2xhYmVsJykgewogICAgICAgICAgICAgIGNsaWNrZWRMYWJlbHMucHVzaChwYXRoW2ldKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5CZUxhYmVsbGVkKHBhdGhbaV0pKSB7CiAgICAgICAgICAgICAgbGV0IG93bmVyTGFiZWxzID0gbWF0Y2hpbmdMYWJlbHMocGF0aFtpXSk7CiAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9mIHRoZSBjbGlja2VkIGxhYmVscyBpcyBsYWJlbGxpbmcgdGhpcyBlbGVtZW50CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25lckxhYmVscy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgY2xpY2tGcm9tTGFiZWwgPSBjbGlja0Zyb21MYWJlbCB8fCBjbGlja2VkTGFiZWxzLmluZGV4T2Yob3duZXJMYWJlbHNbal0pID4gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGF0aFtpXSA9PT0gUE9JTlRFUlNUQVRFLm1vdXNlLnRhcmdldCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGlmIG9uZSBvZiB0aGUgY2xpY2tlZCBsYWJlbHMgd2FzIGxhYmVsbGluZyB0aGUgdGFyZ2V0IGVsZW1lbnQsCiAgICAgIC8vIHRoaXMgaXMgbm90IGEgZ2hvc3QgY2xpY2sKICAgICAgaWYgKGNsaWNrRnJvbUxhYmVsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgbW91c2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXR1cCBUcnVlIHRvIGFkZCwgZmFsc2UgdG8gcmVtb3ZlLgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgZnVuY3Rpb24gc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHNldHVwKSB7CiAgICBsZXQgZXZlbnRzID0gSVNfVE9VQ0hfT05MWSA/IFsnY2xpY2snXSA6IE1PVVNFX0VWRU5UUzsKICAgIGZvciAobGV0IGkgPSAwLCBlbjsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewogICAgICBlbiA9IGV2ZW50c1tpXTsKICAgICAgaWYgKHNldHVwKSB7CiAgICAgICAgLy8gcmVzZXQgY2xpY2tMYWJlbHMgYXJyYXkKICAgICAgICBjbGlja2VkTGFiZWxzLmxlbmd0aCA9IDA7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlbiwgbW91c2VDYW5jZWxsZXIsIHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZW4sIG1vdXNlQ2FuY2VsbGVyLCB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaWdub3JlTW91c2UoZSkgewogICAgaWYgKCFQT0lOVEVSU1RBVEUubW91c2UubW91c2VJZ25vcmVKb2IpIHsKICAgICAgc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHRydWUpOwogICAgfQogICAgbGV0IHVuc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcigpOwogICAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gbnVsbDsKICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iID0gbnVsbDsKICAgIH07CiAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gZS5jb21wb3NlZFBhdGgoKVswXTsKICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYiA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iCiAgICAgICAgLCBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuYWZ0ZXIoTU9VU0VfVElNRU9VVCkKICAgICAgICAsIHVuc2V0KTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXYgZXZlbnQgdG8gdGVzdCBmb3IgbGVmdCBtb3VzZSBidXR0b24gZG93bgogICAqIEByZXR1cm4ge2Jvb2xlYW59IGhhcyBsZWZ0IG1vdXNlIGJ1dHRvbiBkb3duCiAgICovCiAgZnVuY3Rpb24gaGFzTGVmdE1vdXNlQnV0dG9uKGV2KSB7CiAgICBsZXQgdHlwZSA9IGV2LnR5cGU7CiAgICAvLyBleGl0IGVhcmx5IGlmIHRoZSBldmVudCBpcyBub3QgYSBtb3VzZSBldmVudAogICAgaWYgKCFpc01vdXNlRXZlbnQodHlwZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gZXYuYnV0dG9uIGlzIG5vdCByZWxpYWJsZSBmb3IgbW91c2Vtb3ZlICgwIGlzIG92ZXJsb2FkZWQgYXMgYm90aCBsZWZ0IGJ1dHRvbiBhbmQgbm8gYnV0dG9ucykKICAgIC8vIGluc3RlYWQgd2UgdXNlIGV2LmJ1dHRvbnMgKGJpdG1hc2sgb2YgYnV0dG9ucykgb3IgZmFsbCBiYWNrIHRvIGV2LndoaWNoIChkZXByZWNhdGVkLCAwIGZvciBubyBidXR0b25zLCAxIGZvciBsZWZ0IGJ1dHRvbikKICAgIGlmICh0eXBlID09PSAnbW91c2Vtb3ZlJykgewogICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZm9yIHRlc3RpbmcgZXZlbnRzCiAgICAgIGxldCBidXR0b25zID0gZXYuYnV0dG9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IGV2LmJ1dHRvbnM7CiAgICAgIGlmICgoZXYgaW5zdGFuY2VvZiB3aW5kb3cuTW91c2VFdmVudCkgJiYgIU1PVVNFX0hBU19CVVRUT05TKSB7CiAgICAgICAgYnV0dG9ucyA9IE1PVVNFX1dISUNIX1RPX0JVVFRPTlNbZXYud2hpY2hdIHx8IDA7CiAgICAgIH0KICAgICAgLy8gYnV0dG9ucyBpcyBhIGJpdG1hc2ssIGNoZWNrIHRoYXQgdGhlIGxlZnQgYnV0dG9uIGJpdCBpcyBzZXQgKDEpCiAgICAgIHJldHVybiBCb29sZWFuKGJ1dHRvbnMgJiAxKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGFsbG93IHVuZGVmaW5lZCBmb3IgdGVzdGluZyBldmVudHMKICAgICAgbGV0IGJ1dHRvbiA9IGV2LmJ1dHRvbiA9PT0gdW5kZWZpbmVkID8gMCA6IGV2LmJ1dHRvbjsKICAgICAgLy8gZXYuYnV0dG9uIGlzIDAgaW4gbW91c2Vkb3duL21vdXNldXAvY2xpY2sgZm9yIGxlZnQgYnV0dG9uIGFjdGl2YXRpb24KICAgICAgcmV0dXJuIGJ1dHRvbiA9PT0gMDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzU3ludGhldGljQ2xpY2soZXYpIHsKICAgIGlmIChldi50eXBlID09PSAnY2xpY2snKSB7CiAgICAgIC8vIGV2LmRldGFpbCBpcyAwIGZvciBIVE1MRWxlbWVudC5jbGljayBpbiBtb3N0IGJyb3dzZXJzCiAgICAgIGlmIChldi5kZXRhaWwgPT09IDApIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICAvLyBpbiB0aGUgd29yc3QgY2FzZSwgY2hlY2sgdGhhdCB0aGUgeC95IHBvc2l0aW9uIG9mIHRoZSBjbGljayBpcyB3aXRoaW4KICAgICAgLy8gdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudAogICAgICAvLyBUaGFua3MgSUUgMTAgPjooCiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChldik7CiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBpcyBhbiBlbGVtZW50IHNvIHdlIGNhbiB1c2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0LAogICAgICAvLyBpZiBub3QsIGp1c3QgYXNzdW1lIGl0IGlzIGEgc3ludGhldGljIGNsaWNrCiAgICAgIGlmICghdC5ub2RlVHlwZSB8fCAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCBiY3IgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAvLyB1c2UgcGFnZSB4L3kgdG8gYWNjb3VudCBmb3Igc2Nyb2xsaW5nCiAgICAgIGxldCB4ID0gZXYucGFnZVgsIHkgPSBldi5wYWdlWTsKICAgICAgLy8gZXYgaXMgYSBzeW50aGV0aWMgY2xpY2sgaWYgdGhlIHBvc2l0aW9uIGlzIG91dHNpZGUgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0CiAgICAgIHJldHVybiAhKCh4ID49IGJjci5sZWZ0ICYmIHggPD0gYmNyLnJpZ2h0KSAmJiAoeSA+PSBiY3IudG9wICYmIHkgPD0gYmNyLmJvdHRvbSkpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgbGV0IFBPSU5URVJTVEFURSA9IHsKICAgIG1vdXNlOiB7CiAgICAgIHRhcmdldDogbnVsbCwKICAgICAgbW91c2VJZ25vcmVKb2I6IG51bGwKICAgIH0sCiAgICB0b3VjaDogewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICBpZDogLTEsCiAgICAgIHNjcm9sbERlY2lkZWQ6IGZhbHNlCiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gZmlyc3RUb3VjaEFjdGlvbihldikgewogICAgbGV0IHRhID0gJ2F1dG8nOwogICAgbGV0IHBhdGggPSBldi5jb21wb3NlZFBhdGggJiYgZXYuY29tcG9zZWRQYXRoKCk7CiAgICBpZiAocGF0aCkgewogICAgICBmb3IgKGxldCBpID0gMCwgbjsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICBuID0gcGF0aFtpXTsKICAgICAgICBpZiAobltUT1VDSF9BQ1RJT05dKSB7CiAgICAgICAgICB0YSA9IG5bVE9VQ0hfQUNUSU9OXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhOwogIH0KCiAgZnVuY3Rpb24gdHJhY2tEb2N1bWVudChzdGF0ZU9iaiwgbW92ZWZuLCB1cGZuKSB7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBtb3ZlZm47CiAgICBzdGF0ZU9iai51cGZuID0gdXBmbjsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdmVmbik7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdXBmbik7CiAgfQoKICBmdW5jdGlvbiB1bnRyYWNrRG9jdW1lbnQoc3RhdGVPYmopIHsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0YXRlT2JqLm1vdmVmbik7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc3RhdGVPYmoudXBmbik7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBudWxsOwogICAgc3RhdGVPYmoudXBmbiA9IG51bGw7CiAgfQoKICAvLyB1c2UgYSBkb2N1bWVudC13aWRlIHRvdWNoZW5kIGxpc3RlbmVyIHRvIHN0YXJ0IHRoZSBnaG9zdC1jbGljayBwcmV2ZW50aW9uIG1lY2hhbmlzbQogIC8vIFVzZSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycywgaWYgc3VwcG9ydGVkLCB0byBub3QgYWZmZWN0IHNjcm9sbGluZyBwZXJmb3JtYW5jZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaWdub3JlTW91c2UsIFNVUFBPUlRTX1BBU1NJVkUgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZSk7CgogIC8qKgogICAqIE1vZHVsZSBmb3IgYWRkaW5nIGxpc3RlbmVycyB0byBhIG5vZGUgZm9yIHRoZSBmb2xsb3dpbmcgbm9ybWFsaXplZAogICAqIGNyb3NzLXBsYXRmb3JtICJnZXN0dXJlIiBldmVudHM6CiAgICogLSBgZG93bmAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IGRvd24KICAgKiAtIGB1cGAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IHVwCiAgICogLSBgdGFwYCAtIG1vdXNlIGNsaWNrIG9yIGZpbmdlciB0YXAKICAgKiAtIGB0cmFja2AgLSBtb3VzZSBkcmFnIG9yIHRvdWNoIG1vdmUKICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSBmb3IgYWRkaW5nIGNyb3NzLXBsYXRmb3JtIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJzLgogICAqLwogIGNvbnN0IEdlc3R1cmVzID0gewogICAgZ2VzdHVyZXM6IHt9LAogICAgcmVjb2duaXplcnM6IFtdLAoKICAgIC8qKgogICAgICogRmluZHMgdGhlIGVsZW1lbnQgcmVuZGVyZWQgb24gdGhlIHNjcmVlbiBhdCB0aGUgcHJvdmlkZWQgY29vcmRpbmF0ZXMuCiAgICAgKgogICAgICogU2ltaWxhciB0byBgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludGAsIGJ1dCBwaWVyY2VzIHRocm91Z2gKICAgICAqIHNoYWRvdyByb290cy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHtudW1iZXJ9IHggSG9yaXpvbnRhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBWZXJ0aWNhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBkZWVwZXN0IHNoYWRvd1Jvb3QgaW5jbHVzaXZlIGVsZW1lbnQKICAgICAqIGZvdW5kIGF0IHRoZSBzY3JlZW4gcG9zaXRpb24gZ2l2ZW4uCiAgICAgKi8KICAgIGRlZXBUYXJnZXRGaW5kOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKICAgICAgbGV0IG5leHQgPSBub2RlOwogICAgICAvLyB0aGlzIGNvZGUgcGF0aCBpcyBvbmx5IHRha2VuIHdoZW4gbmF0aXZlIFNoYWRvd0RPTSBpcyB1c2VkCiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgc2hhZG93cm9vdCwgaXQgbWF5IGhhdmUgYSBub2RlIGF0IHgveQogICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYSBzaGFkb3dyb290LCBleGl0IHRoZSBsb29wCiAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQuc2hhZG93Um9vdCAmJiAhd2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBub2RlIGF0IHgveSBpbiB0aGUgc2hhZG93cm9vdCwgbG9vayBkZWVwZXIKICAgICAgICBsZXQgb2xkTmV4dCA9IG5leHQ7CiAgICAgICAgbmV4dCA9IG5leHQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgICAgIC8vIG9uIFNhZmFyaSwgZWxlbWVudEZyb21Qb2ludCBtYXkgcmV0dXJuIHRoZSBzaGFkb3dSb290IGhvc3QKICAgICAgICBpZiAob2xkTmV4dCA9PT0gbmV4dCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICBub2RlID0gbmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LAogICAgLyoqCiAgICAgKiBhIGNoZWFwZXIgY2hlY2sgdGhhbiBldi5jb21wb3NlZFBhdGgoKVswXTsKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHtFdmVudFRhcmdldH0gUmV0dXJucyB0aGUgZXZlbnQgdGFyZ2V0LgogICAgICovCiAgICBfZmluZE9yaWdpbmFsVGFyZ2V0OiBmdW5jdGlvbihldikgewogICAgICAvLyBzaGFkb3dkb20KICAgICAgaWYgKGV2LmNvbXBvc2VkUGF0aCkgewogICAgICAgIGNvbnN0IHRhcmdldHMgPSAvKiogQHR5cGUgeyFBcnJheTwhRXZlbnRUYXJnZXQ+fSAqLyhldi5jb21wb3NlZFBhdGgoKSk7CiAgICAgICAgLy8gSXQgc2hvdWxkbid0IGJlLCBidXQgc29tZXRpbWVzIHRhcmdldHMgaXMgZW1wdHkgKHdpbmRvdyBvbiBTYWZhcmkpLgogICAgICAgIHJldHVybiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzWzBdIDogZXYudGFyZ2V0OwogICAgICB9CiAgICAgIC8vIHNoYWR5ZG9tCiAgICAgIHJldHVybiBldi50YXJnZXQ7CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2hhbmRsZU5hdGl2ZTogZnVuY3Rpb24oZXYpIHsKICAgICAgbGV0IGhhbmRsZWQ7CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgbGV0IG5vZGUgPSBldi5jdXJyZW50VGFyZ2V0OwogICAgICBsZXQgZ29iaiA9IG5vZGVbR0VTVFVSRV9LRVldOwogICAgICBpZiAoIWdvYmopIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGdzID0gZ29ialt0eXBlXTsKICAgICAgaWYgKCFncykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWV2W0hBTkRMRURfT0JKXSkgewogICAgICAgIGV2W0hBTkRMRURfT0JKXSA9IHt9OwogICAgICAgIGlmICh0eXBlLnNsaWNlKDAsIDUpID09PSAndG91Y2gnKSB7CiAgICAgICAgICBldiA9IC8qKiBAdHlwZSB7VG91Y2hFdmVudH0gKi8oZXYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICBsZXQgdCA9IGV2LmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgICAgICAvLyBvbmx5IGhhbmRsZSB0aGUgZmlyc3QgZmluZ2VyCiAgICAgICAgICAgIGlmIChldi50b3VjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5pZCA9IHQuaWRlbnRpZmllcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKFBPSU5URVJTVEFURS50b3VjaC5pZCAhPT0gdC5pZGVudGlmaWVyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghSEFTX05BVElWRV9UQSkgewogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IHR5cGUgPT09ICd0b3VjaG1vdmUnKSB7CiAgICAgICAgICAgICAgR2VzdHVyZXMuX2hhbmRsZVRvdWNoQWN0aW9uKGV2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBoYW5kbGVkID0gZXZbSEFORExFRF9PQkpdOwogICAgICAvLyB1c2VkIHRvIGlnbm9yZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgICAgIGlmIChoYW5kbGVkLnNraXApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gcmVzZXQgcmVjb2duaXplciBzdGF0ZQogICAgICBmb3IgKGxldCBpID0gMCwgcjsgaSA8IEdlc3R1cmVzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IEdlc3R1cmVzLnJlY29nbml6ZXJzW2ldOwogICAgICAgIGlmIChnc1tyLm5hbWVdICYmICFoYW5kbGVkW3IubmFtZV0pIHsKICAgICAgICAgIGlmIChyLmZsb3cgJiYgci5mbG93LnN0YXJ0LmluZGV4T2YoZXYudHlwZSkgPiAtMSAmJiByLnJlc2V0KSB7CiAgICAgICAgICAgIHIucmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gZW5mb3JjZSBnZXN0dXJlIHJlY29nbml6ZXIgb3JkZXIKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCBHZXN0dXJlcy5yZWNvZ25pemVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHIgPSBHZXN0dXJlcy5yZWNvZ25pemVyc1tpXTsKICAgICAgICBpZiAoZ3Nbci5uYW1lXSAmJiAhaGFuZGxlZFtyLm5hbWVdKSB7CiAgICAgICAgICBoYW5kbGVkW3IubmFtZV0gPSB0cnVlOwogICAgICAgICAgclt0eXBlXShldik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfaGFuZGxlVG91Y2hBY3Rpb246IGZ1bmN0aW9uKGV2KSB7CiAgICAgIGxldCB0ID0gZXYuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC54ID0gdC5jbGllbnRYOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC55ID0gdC5jbGllbnRZOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5zY3JvbGxEZWNpZGVkID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RvdWNobW92ZScpIHsKICAgICAgICBpZiAoUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQgPSB0cnVlOwogICAgICAgIGxldCB0YSA9IGZpcnN0VG91Y2hBY3Rpb24oZXYpOwogICAgICAgIGxldCBwcmV2ZW50ID0gZmFsc2U7CiAgICAgICAgbGV0IGR4ID0gTWF0aC5hYnMoUE9JTlRFUlNUQVRFLnRvdWNoLnggLSB0LmNsaWVudFgpOwogICAgICAgIGxldCBkeSA9IE1hdGguYWJzKFBPSU5URVJTVEFURS50b3VjaC55IC0gdC5jbGllbnRZKTsKICAgICAgICBpZiAoIWV2LmNhbmNlbGFibGUpIHsKICAgICAgICAgIC8vIHNjcm9sbGluZyBpcyBoYXBwZW5pbmcKICAgICAgICB9IGVsc2UgaWYgKHRhID09PSAnbm9uZScpIHsKICAgICAgICAgIHByZXZlbnQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teCcpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeSA+IGR4OwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teScpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeCA+IGR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJldmVudCkgewogICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndHJhY2snKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgbm9kZSBmb3IgdGhlIGdpdmVuIGdlc3R1cmUgdHlwZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiB0byBjYWxsCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyBhZGRlZC4KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKG5vZGUsIGV2VHlwZSwgaGFuZGxlcikgewogICAgICBpZiAodGhpcy5nZXN0dXJlc1tldlR5cGVdKSB7CiAgICAgICAgdGhpcy5fYWRkKG5vZGUsIGV2VHlwZSwgaGFuZGxlcik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhIG5vZGUgZm9yIHRoZSBnaXZlbiBnZXN0dXJlIHR5cGUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byByZW1vdmUgbGlzdGVuZXIgZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiBwcmV2aW91c2x5IHBhc3NlZCB0bwogICAgICogIGBhZGRMaXN0ZW5lcmAuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGlmICh0aGlzLmdlc3R1cmVzW2V2VHlwZV0pIHsKICAgICAgICB0aGlzLl9yZW1vdmUobm9kZSwgZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgdGhlIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG5hdGl2ZSBldmVudHMKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG5vZGUgTm9kZSBvbiB3aGljaCB0byBhZGQgdGhlIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBFdmVudCB0eXBlIHRvIGFkZC4KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KX0gaGFuZGxlciBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgX2FkZDogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGxldCByZWNvZ25pemVyID0gdGhpcy5nZXN0dXJlc1tldlR5cGVdOwogICAgICBsZXQgZGVwcyA9IHJlY29nbml6ZXIuZGVwczsKICAgICAgbGV0IG5hbWUgPSByZWNvZ25pemVyLm5hbWU7CiAgICAgIGxldCBnb2JqID0gbm9kZVtHRVNUVVJFX0tFWV07CiAgICAgIGlmICghZ29iaikgewogICAgICAgIG5vZGVbR0VTVFVSRV9LRVldID0gZ29iaiA9IHt9OwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBkZXAsIGdkOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykgewogICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgLy8gZG9uJ3QgYWRkIG1vdXNlIGhhbmRsZXJzIG9uIGlPUyBiZWNhdXNlIHRoZXkgY2F1c2UgZ3JheSBzZWxlY3Rpb24gb3ZlcmxheXMKICAgICAgICBpZiAoSVNfVE9VQ0hfT05MWSAmJiBpc01vdXNlRXZlbnQoZGVwKSAmJiBkZXAgIT09ICdjbGljaycpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICBpZiAoIWdkKSB7CiAgICAgICAgICBnb2JqW2RlcF0gPSBnZCA9IHtfY291bnQ6IDB9OwogICAgICAgIH0KICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZGVwLCB0aGlzLl9oYW5kbGVOYXRpdmUsIFBBU1NJVkVfVE9VQ0goZGVwKSk7CiAgICAgICAgfQogICAgICAgIGdkW25hbWVdID0gKGdkW25hbWVdIHx8IDApICsgMTsKICAgICAgICBnZC5fY291bnQgPSAoZ2QuX2NvdW50IHx8IDApICsgMTsKICAgICAgfQogICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgaWYgKHJlY29nbml6ZXIudG91Y2hBY3Rpb24pIHsKICAgICAgICB0aGlzLnNldFRvdWNoQWN0aW9uKG5vZGUsIHJlY29nbml6ZXIudG91Y2hBY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgZXZlbnQgbGlzdGVuZXIgcmVtb3ZhbCBmb3IgbmF0aXZlIGV2ZW50cwogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gbm9kZSBOb2RlIG9uIHdoaWNoIHRvIHJlbW92ZSB0aGUgZXZlbnQuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZUeXBlIEV2ZW50IHR5cGUgdG8gcmVtb3ZlLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihFdmVudD8pfSBoYW5kbGVyIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfcmVtb3ZlOiBmdW5jdGlvbihub2RlLCBldlR5cGUsIGhhbmRsZXIpIHsKICAgICAgbGV0IHJlY29nbml6ZXIgPSB0aGlzLmdlc3R1cmVzW2V2VHlwZV07CiAgICAgIGxldCBkZXBzID0gcmVjb2duaXplci5kZXBzOwogICAgICBsZXQgbmFtZSA9IHJlY29nbml6ZXIubmFtZTsKICAgICAgbGV0IGdvYmogPSBub2RlW0dFU1RVUkVfS0VZXTsKICAgICAgaWYgKGdvYmopIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgZGVwLCBnZDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICAgIGlmIChnZCAmJiBnZFtuYW1lXSkgewogICAgICAgICAgICBnZFtuYW1lXSA9IChnZFtuYW1lXSB8fCAxKSAtIDE7CiAgICAgICAgICAgIGdkLl9jb3VudCA9IChnZC5fY291bnQgfHwgMSkgLSAxOwogICAgICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGRlcCwgdGhpcy5faGFuZGxlTmF0aXZlLCBQQVNTSVZFX1RPVUNIKGRlcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldlR5cGUsIGhhbmRsZXIpOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIG5ldyBnZXN0dXJlIGV2ZW50IHJlY29nbml6ZXIgZm9yIGFkZGluZyBuZXcgY3VzdG9tCiAgICAgKiBnZXN0dXJlIGV2ZW50IHR5cGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcGFyYW0geyFHZXN0dXJlUmVjb2duaXplcn0gcmVjb2cgR2VzdHVyZSByZWNvZ25pemVyIGRlc2NyaXB0b3IKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihyZWNvZykgewogICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2cpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29nLmVtaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXN0dXJlc1tyZWNvZy5lbWl0c1tpXV0gPSByZWNvZzsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZOYW1lIEV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdlc3R1cmUgZm9yIHRoZSBnaXZlbiBldmVudCBuYW1lLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfZmluZFJlY29nbml6ZXJCeUV2ZW50OiBmdW5jdGlvbihldk5hbWUpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCB0aGlzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IHRoaXMucmVjb2duaXplcnNbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIG47IGogPCByLmVtaXRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBuID0gci5lbWl0c1tqXTsKICAgICAgICAgIGlmIChuID09PSBldk5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICAvKioKICAgICAqIFNldHMgc2Nyb2xsaW5nIGRpcmVjdGlvbiBvbiBub2RlLgogICAgICoKICAgICAqIFRoaXMgdmFsdWUgaXMgY2hlY2tlZCBvbiBmaXJzdCBtb3ZlLCB0aHVzIGl0IHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8KICAgICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG5vZGUgTm9kZSB0byBzZXQgdG91Y2ggYWN0aW9uIHNldHRpbmcgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUb3VjaCBhY3Rpb24gdmFsdWUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldFRvdWNoQWN0aW9uOiBmdW5jdGlvbihub2RlLCB2YWx1ZSkgewogICAgICBpZiAoSEFTX05BVElWRV9UQSkgewogICAgICAgIC8vIE5PVEU6IGFkZCB0b3VjaEFjdGlvbiBhc3luYyBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQgaW4KICAgICAgICAvLyBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcnMuIE90aGVyd2lzZSB3ZSBydW4gYWZvdWwgb2YgY3VzdG9tCiAgICAgICAgLy8gZWxlbWVudHMgcmVzdHJpY3Rpb24gYWdhaW5zdCBzZXR0aW5ncyBhdHRyaWJ1dGVzIChzdHlsZSkgaW4gdGhlCiAgICAgICAgLy8gY29uc3RydWN0b3IuCiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgIG5vZGUuc3R5bGUudG91Y2hBY3Rpb24gPSB2YWx1ZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBub2RlW1RPVUNIX0FDVElPTl0gPSB2YWx1ZTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9uIHRoZSBgdGFyZ2V0YCBlbGVtZW50IG9mIGB0eXBlYCB3aXRoIHRoZSBnaXZlbgogICAgICogYGRldGFpbGAuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IHRhcmdldCBUaGUgZWxlbWVudCBvbiB3aGljaCB0byBmaXJlIGFuIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gZmlyZS4KICAgICAqIEBwYXJhbSB7IU9iamVjdD19IGRldGFpbCBUaGUgZGV0YWlsIG9iamVjdCB0byBwb3B1bGF0ZSBvbiB0aGUgZXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odGFyZ2V0LCB0eXBlLCBkZXRhaWwpIHsKICAgICAgbGV0IGV2ID0gbmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSk7CiAgICAgIGV2LmRldGFpbCA9IGRldGFpbDsKICAgICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXYpOwogICAgICAvLyBmb3J3YXJkIGBwcmV2ZW50RGVmYXVsdGAgaW4gYSBjbGVhbiB3YXkKICAgICAgaWYgKGV2LmRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICBsZXQgcHJldmVudGVyID0gZGV0YWlsLnByZXZlbnRlciB8fCBkZXRhaWwuc291cmNlRXZlbnQ7CiAgICAgICAgaWYgKHByZXZlbnRlciAmJiBwcmV2ZW50ZXIucHJldmVudERlZmF1bHQpIHsKICAgICAgICAgIHByZXZlbnRlci5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFByZXZlbnRzIHRoZSBkaXNwYXRjaCBhbmQgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGdpdmVuIGV2ZW50IG5hbWUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldk5hbWUgRXZlbnQgbmFtZS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHByZXZlbnQ6IGZ1bmN0aW9uKGV2TmFtZSkgewogICAgICBsZXQgcmVjb2duaXplciA9IHRoaXMuX2ZpbmRSZWNvZ25pemVyQnlFdmVudChldk5hbWUpOwogICAgICBpZiAocmVjb2duaXplci5pbmZvKSB7CiAgICAgICAgcmVjb2duaXplci5pbmZvLnByZXZlbnQgPSB0cnVlOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogUmVzZXQgdGhlIDI1MDBtcyB0aW1lb3V0IG9uIHByb2Nlc3NpbmcgbW91c2UgaW5wdXQgYWZ0ZXIgZGV0ZWN0aW5nIHRvdWNoIGlucHV0LgogICAgICoKICAgICAqIFRvdWNoIGlucHV0cyBjcmVhdGUgc3ludGhlc2l6ZWQgbW91c2UgaW5wdXRzIGFueXdoZXJlIGZyb20gMCB0byAyMDAwbXMgYWZ0ZXIgdGhlIHRvdWNoLgogICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0ZXN0aW5nIHdpdGggc2ltdWxhdGVkIHRvdWNoIGlucHV0cy4KICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaW4gcHJvZHVjdGlvbiBtYXkgY2F1c2UgZHVwbGljYXRlIHRhcHMgb3Igb3RoZXIgR2VzdHVyZXMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0TW91c2VDYW5jZWxsZXI6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iKSB7CiAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iLmZsdXNoKCk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAnZG93bnVwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ21vdXNldXAnLCAndG91Y2hlbmQnXQogICAgfSwKICAgIGVtaXRzOiBbJ2Rvd24nLCAndXAnXSwKCiAgICBpbmZvOiB7CiAgICAgIG1vdmVmbjogbnVsbCwKICAgICAgdXBmbjogbnVsbAogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdW50cmFja0RvY3VtZW50KHRoaXMuaW5mbyk7CiAgICB9LAoKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBtb3VzZWRvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgc2VsZiA9IHRoaXM7CiAgICAgIGxldCBtb3ZlZm4gPSBmdW5jdGlvbiBtb3ZlZm4oZSkgewogICAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICBzZWxmLl9maXJlKCd1cCcsIHQsIGUpOwogICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgIHNlbGYuX2ZpcmUoJ3VwJywgdCwgZSk7CiAgICAgICAgfQogICAgICAgIHVudHJhY2tEb2N1bWVudChzZWxmLmluZm8pOwogICAgICB9OwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5fZmlyZSgnZG93bicsIHQsIGUpOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuX2ZpcmUoJ2Rvd24nLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hlbmQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgdGhpcy5fZmlyZSgndXAnLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudAogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJldmVudGVyCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odHlwZSwgdGFyZ2V0LCBldmVudCwgcHJldmVudGVyKSB7CiAgICAgIEdlc3R1cmVzLl9maXJlKHRhcmdldCwgdHlwZSwgewogICAgICAgIHg6IGV2ZW50LmNsaWVudFgsCiAgICAgICAgeTogZXZlbnQuY2xpZW50WSwKICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsCiAgICAgICAgcHJldmVudGVyOiBwcmV2ZW50ZXIsCiAgICAgICAgcHJldmVudDogZnVuY3Rpb24oZSkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLnByZXZlbnQoZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKCiAgR2VzdHVyZXMucmVnaXN0ZXIoewogICAgbmFtZTogJ3RyYWNrJywKICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsCiAgICBkZXBzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCddLAogICAgZmxvdzogewogICAgICBzdGFydDogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLAogICAgICBlbmQ6IFsnbW91c2V1cCcsICd0b3VjaGVuZCddCiAgICB9LAogICAgZW1pdHM6IFsndHJhY2snXSwKCiAgICBpbmZvOiB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHN0YXRlOiAnc3RhcnQnLAogICAgICBzdGFydGVkOiBmYWxzZSwKICAgICAgbW92ZXM6IFtdLAogICAgICAvKiogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfSAqLwogICAgICBhZGRNb3ZlOiBmdW5jdGlvbihtb3ZlKSB7CiAgICAgICAgaWYgKHRoaXMubW92ZXMubGVuZ3RoID4gVFJBQ0tfTEVOR1RIKSB7CiAgICAgICAgICB0aGlzLm1vdmVzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubW92ZXMucHVzaChtb3ZlKTsKICAgICAgfSwKICAgICAgbW92ZWZuOiBudWxsLAogICAgICB1cGZuOiBudWxsLAogICAgICBwcmV2ZW50OiBmYWxzZQogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5pbmZvLnN0YXRlID0gJ3N0YXJ0JzsKICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pbmZvLm1vdmVzID0gW107CiAgICAgIHRoaXMuaW5mby54ID0gMDsKICAgICAgdGhpcy5pbmZvLnkgPSAwOwogICAgICB0aGlzLmluZm8ucHJldmVudCA9IGZhbHNlOwogICAgICB1bnRyYWNrRG9jdW1lbnQodGhpcy5pbmZvKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge251bWJlcn0geAogICAgICogQHBhcmFtIHtudW1iZXJ9IHkKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGhhc01vdmVkRW5vdWdoOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGlmICh0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodGhpcy5pbmZvLnN0YXJ0ZWQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgZHggPSBNYXRoLmFicyh0aGlzLmluZm8ueCAtIHgpOwogICAgICBsZXQgZHkgPSBNYXRoLmFicyh0aGlzLmluZm8ueSAtIHkpOwogICAgICByZXR1cm4gKGR4ID49IFRSQUNLX0RJU1RBTkNFIHx8IGR5ID49IFRSQUNLX0RJU1RBTkNFKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbW91c2Vkb3duOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IHNlbGYgPSB0aGlzOwogICAgICBsZXQgbW92ZWZuID0gZnVuY3Rpb24gbW92ZWZuKGUpIHsKICAgICAgICBsZXQgeCA9IGUuY2xpZW50WCwgeSA9IGUuY2xpZW50WTsKICAgICAgICBpZiAoc2VsZi5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgICAgLy8gZmlyc3QgbW92ZSBpcyAnc3RhcnQnLCBzdWJzZXF1ZW50IG1vdmVzIGFyZSAnbW92ZScsIG1vdXNldXAgaXMgJ2VuZCcKICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9IHNlbGYuaW5mby5zdGFydGVkID8gKGUudHlwZSA9PT0gJ21vdXNldXAnID8gJ2VuZCcgOiAndHJhY2snKSA6ICdzdGFydCc7CiAgICAgICAgICBpZiAoc2VsZi5pbmZvLnN0YXRlID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndGFwJyk7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxmLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgICAgLy8gYWx3YXlzIF9maXJlICJlbmQiCiAgICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgICAgICB1bnRyYWNrRG9jdW1lbnQoc2VsZi5pbmZvKTsKICAgICAgICAgIH0KICAgICAgICAgIHNlbGYuX2ZpcmUodCwgZSk7CiAgICAgICAgICBzZWxmLmluZm8uc3RhcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChzZWxmLmluZm8uc3RhcnRlZCkgewogICAgICAgICAgbW92ZWZuKGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgbGlzdGVuZXJzCiAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgIH07CiAgICAgIC8vIGFkZCB0ZW1wb3JhcnkgZG9jdW1lbnQgbGlzdGVuZXJzIGFzIG1vdXNlIHJldGFyZ2V0cwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5pbmZvLnggPSBlLmNsaWVudFg7CiAgICAgIHRoaXMuaW5mby55ID0gZS5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCBjdCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIHRoaXMuaW5mby54ID0gY3QuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBjdC5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaG1vdmU6IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgY3QgPSBlLmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICBsZXQgeCA9IGN0LmNsaWVudFgsIHkgPSBjdC5jbGllbnRZOwogICAgICBpZiAodGhpcy5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgIGlmICh0aGlzLmluZm8uc3RhdGUgPT09ICdzdGFydCcpIHsKICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgIEdlc3R1cmVzLnByZXZlbnQoJ3RhcCcpOwogICAgICAgIH0KICAgICAgICB0aGlzLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgIHRoaXMuX2ZpcmUodCwgY3QpOwogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICd0cmFjayc7CiAgICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSB0cnVlOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IGN0ID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgLy8gb25seSB0cmFja2VuZCBpZiB0cmFjayB3YXMgc3RhcnRlZCBhbmQgbm90IGFib3J0ZWQKICAgICAgaWYgKHRoaXMuaW5mby5zdGFydGVkKSB7CiAgICAgICAgLy8gcmVzZXQgc3RhcnRlZCBzdGF0ZSBvbiB1cAogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgIHRoaXMuaW5mby5hZGRNb3ZlKHt4OiBjdC5jbGllbnRYLCB5OiBjdC5jbGllbnRZfSk7CiAgICAgICAgdGhpcy5fZmlyZSh0LCBjdCwgZSk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2ZpcmU6IGZ1bmN0aW9uKHRhcmdldCwgdG91Y2gpIHsKICAgICAgbGV0IHNlY29uZGxhc3QgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDJdOwogICAgICBsZXQgbGFzdG1vdmUgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDFdOwogICAgICBsZXQgZHggPSBsYXN0bW92ZS54IC0gdGhpcy5pbmZvLng7CiAgICAgIGxldCBkeSA9IGxhc3Rtb3ZlLnkgLSB0aGlzLmluZm8ueTsKICAgICAgbGV0IGRkeCwgZGR5ID0gMDsKICAgICAgaWYgKHNlY29uZGxhc3QpIHsKICAgICAgICBkZHggPSBsYXN0bW92ZS54IC0gc2Vjb25kbGFzdC54OwogICAgICAgIGRkeSA9IGxhc3Rtb3ZlLnkgLSBzZWNvbmRsYXN0Lnk7CiAgICAgIH0KICAgICAgR2VzdHVyZXMuX2ZpcmUodGFyZ2V0LCAndHJhY2snLCB7CiAgICAgICAgc3RhdGU6IHRoaXMuaW5mby5zdGF0ZSwKICAgICAgICB4OiB0b3VjaC5jbGllbnRYLAogICAgICAgIHk6IHRvdWNoLmNsaWVudFksCiAgICAgICAgZHg6IGR4LAogICAgICAgIGR5OiBkeSwKICAgICAgICBkZHg6IGRkeCwKICAgICAgICBkZHk6IGRkeSwKICAgICAgICBzb3VyY2VFdmVudDogdG91Y2gsCiAgICAgICAgaG92ZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLmRlZXBUYXJnZXRGaW5kKHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogIH0pOwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAndGFwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ2NsaWNrJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ2NsaWNrJywgJ3RvdWNoZW5kJ10KICAgIH0sCiAgICBlbWl0czogWyd0YXAnXSwKICAgIGluZm86IHsKICAgICAgeDogTmFOLAogICAgICB5OiBOYU4sCiAgICAgIHByZXZlbnQ6IGZhbHNlCiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaW5mby54ID0gTmFOOwogICAgICB0aGlzLmluZm8ueSA9IE5hTjsKICAgICAgdGhpcy5pbmZvLnByZXZlbnQgPSBmYWxzZTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgc2F2ZTogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLmluZm8ueCA9IGUuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBlLmNsaWVudFk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIG1vdXNlZG93bjogZnVuY3Rpb24oZSkgewogICAgICBpZiAoaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgdGhpcy5zYXZlKGUpOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICB0aGlzLmZvcndhcmQoZSk7CiAgICAgIH0KICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLnNhdmUoZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuZm9yd2FyZChlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7RXZlbnQgfCBUb3VjaH0gZQogICAgICogQHBhcmFtIHtFdmVudD19IHByZXZlbnRlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZm9yd2FyZDogZnVuY3Rpb24oZSwgcHJldmVudGVyKSB7CiAgICAgIGxldCBkeCA9IE1hdGguYWJzKGUuY2xpZW50WCAtIHRoaXMuaW5mby54KTsKICAgICAgbGV0IGR5ID0gTWF0aC5hYnMoZS5jbGllbnRZIC0gdGhpcy5pbmZvLnkpOwogICAgICAvLyBmaW5kIG9yaWdpbmFsIHRhcmdldCBmcm9tIGBwcmV2ZW50ZXJgIGZvciBUb3VjaEV2ZW50cywgb3IgYGVgIGZvciBNb3VzZUV2ZW50cwogICAgICBsZXQgdCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQoLyoqIEB0eXBlIHtFdmVudH0gKi8ocHJldmVudGVyIHx8IGUpKTsKICAgICAgaWYgKCF0IHx8IChjYW5CZURpc2FibGVkWy8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0KS5sb2NhbE5hbWVdICYmIHQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBkeCxkeSBjYW4gYmUgTmFOIGlmIGBjbGlja2AgaGFzIGJlZW4gc2ltdWxhdGVkIGFuZCB0aGVyZSB3YXMgbm8gYGRvd25gIGZvciBgc3RhcnRgCiAgICAgIGlmIChpc05hTihkeCkgfHwgaXNOYU4oZHkpIHx8IChkeCA8PSBUQVBfRElTVEFOQ0UgJiYgZHkgPD0gVEFQX0RJU1RBTkNFKSB8fCBpc1N5bnRoZXRpY0NsaWNrKGUpKSB7CiAgICAgICAgLy8gcHJldmVudCB0YXBzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGlmIGFuIGV2ZW50IGhhcyBjYW5jZWxlZCB0aGVtCiAgICAgICAgaWYgKCF0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgICAgR2VzdHVyZXMuX2ZpcmUodCwgJ3RhcCcsIHsKICAgICAgICAgICAgeDogZS5jbGllbnRYLAogICAgICAgICAgICB5OiBlLmNsaWVudFksCiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBlLAogICAgICAgICAgICBwcmV2ZW50ZXI6IHByZXZlbnRlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSk7CgogIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldDsKCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuYWRkID0gR2VzdHVyZXMuYWRkTGlzdGVuZXI7CgogIC8qKiBAZGVwcmVjYXRlZCAqLwogIEdlc3R1cmVzLnJlbW92ZSA9IEdlc3R1cmVzLnJlbW92ZUxpc3RlbmVyOwoKICBQb2x5bWVyLkdlc3R1cmVzID0gR2VzdHVyZXM7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAY29uc3Qge1BvbHltZXIuR2VzdHVyZXN9CiAgICovCiAgY29uc3QgZ2VzdHVyZXMgPSBQb2x5bWVyLkdlc3R1cmVzOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMuCiAgICoKICAgKiBUaGUgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdmVycmlkZSBwb2ludHMgaW1wbGVtZW50ZWQKICAgKiBpbiBgUG9seW1lci5UZW1wbGF0ZVN0YW1wYCBzdWNoIHRoYXQgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzIGluCiAgICogdGVtcGxhdGVzIHdpbGwgc3VwcG9ydCBnZXN0dXJlIGV2ZW50cyB3aGVuIHRoaXMgbWl4aW4gaXMgYXBwbGllZCBhbG9uZyB3aXRoCiAgICogYFBvbHltZXIuVGVtcGxhdGVTdGFtcGAuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMKICAgKi8KICBQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfR2VzdHVyZUV2ZW50TGlzdGVuZXJzfQogICAgICovCiAgICBjbGFzcyBHZXN0dXJlRXZlbnRMaXN0ZW5lcnMgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIC8qKgogICAgICAgKiBBZGQgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIGlmIGl0IGlzIGEgZ2VzdHVyZXMgZXZlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIGFkZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5hZGRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSB0aGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgaWYgaXQgaXMgYSBnZXN0dXJlcyBldmVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5yZW1vdmVMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBHZXN0dXJlRXZlbnRMaXN0ZW5lcnM7CgogIH0pOwoKfSkoKTsKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBjb25zdCBIT1NUX0RJUiA9IC86aG9zdFwoOmRpclwoKGx0cnxydGwpXClcKS9nOwogICAgY29uc3QgSE9TVF9ESVJfUkVQTEFDTUVOVCA9ICc6aG9zdChbZGlyPSIkMSJdKSc7CgogICAgY29uc3QgRUxfRElSID0gLyhbXHNcdy0jXC5cW1xdXCpdKik6ZGlyXCgobHRyfHJ0bClcKS9nOwogICAgY29uc3QgRUxfRElSX1JFUExBQ01FTlQgPSAnOmhvc3QoW2Rpcj0iJDIiXSkgJDEnOwoKICAgIGNvbnN0IERJUl9DSEVDSyA9IC86ZGlyXCgoPzpsdHJ8cnRsKVwpLzsKICAgIAogICAgY29uc3QgU0hJTV9TSEFET1cgPSBCb29sZWFuKHdpbmRvd1snU2hhZHlET00nXSAmJiB3aW5kb3dbJ1NoYWR5RE9NJ11bJ2luVXNlJ10pOwoKICAgIC8qKgogICAgICogQHR5cGUgeyFBcnJheTwhUG9seW1lcl9EaXJNaXhpbj59CiAgICAgKi8KICAgIGNvbnN0IERJUl9JTlNUQU5DRVMgPSBbXTsKCiAgICAvKiogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9ICovCiAgICBsZXQgb2JzZXJ2ZXIgPSBudWxsOwoKICAgIGxldCBET0NVTUVOVF9ESVIgPSAnJzsKCiAgICBmdW5jdGlvbiBnZXRSVEwoKSB7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lcl9EaXJNaXhpbn0gaW5zdGFuY2UgSW5zdGFuY2UgdG8gc2V0IFJUTCBzdGF0dXMgb24KICAgICAqLwogICAgZnVuY3Rpb24gc2V0UlRMKGluc3RhbmNlKSB7CiAgICAgIGlmICghaW5zdGFuY2UuX19hdXRvRGlyT3B0T3V0KSB7CiAgICAgICAgY29uc3QgZWwgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdGFuY2UpOwogICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGlyJywgRE9DVU1FTlRfRElSKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURpcmVjdGlvbigpIHsKICAgICAgZ2V0UlRMKCk7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERJUl9JTlNUQU5DRVMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzZXRSVEwoRElSX0lOU1RBTkNFU1tpXSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0YWtlUmVjb3JkcygpIHsKICAgICAgaWYgKG9ic2VydmVyICYmIG9ic2VydmVyLnRha2VSZWNvcmRzKCkubGVuZ3RoKSB7CiAgICAgICAgdXBkYXRlRGlyZWN0aW9uKCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBhbGxvd3MgZWxlbWVudHMgdG8gdXNlIHRoZSBgOmRpcmAgQ1NTIFNlbGVjdG9yIHRvIGhhdmUKICAgICAqIHRleHQgZGlyZWN0aW9uIHNwZWNpZmljIHN0eWxpbmcuCiAgICAgKgogICAgICogV2l0aCB0aGlzIG1peGluLCBhbnkgc3R5bGVzaGVldCBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCB0cmFuc2Zvcm0gYDpkaXJgIGludG8KICAgICAqIGA6aG9zdChbZGlyXSlgIGFuZCBzeW5jIGRpcmVjdGlvbiB3aXRoIHRoZSBwYWdlIHZpYSB0aGUgZWxlbWVudCdzIGBkaXJgIGF0dHJpYnV0ZS4KICAgICAqCiAgICAgKiBFbGVtZW50cyBjYW4gb3B0IG91dCBvZiB0aGUgZ2xvYmFsIHBhZ2UgdGV4dCBkaXJlY3Rpb24gYnkgc2V0dGluZyB0aGUgYGRpcmAgYXR0cmlidXRlCiAgICAgKiBkaXJlY3RseSBpbiBgcmVhZHkoKWAgb3IgaW4gSFRNTC4KICAgICAqCiAgICAgKiBDYXZlYXRzOgogICAgICogLSBBcHBsaWNhdGlvbnMgbXVzdCBzZXQgYDxodG1sIGRpcj0ibHRyIj5gIG9yIGA8aHRtbCBkaXI9InJ0bCI+YCB0byBzeW5jIGRpcmVjdGlvbgogICAgICogLSBBdXRvbWF0aWMgbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0IHN0eWxpbmcgaXMgc3luYydkIHdpdGggdGhlIGA8aHRtbD5gIGVsZW1lbnQgb25seS4KICAgICAqIC0gQ2hhbmdpbmcgYGRpcmAgYXQgcnVudGltZSBpcyBzdXBwb3J0ZWQuCiAgICAgKiAtIE9wdGluZyBvdXQgb2YgdGhlIGdsb2JhbCBkaXJlY3Rpb24gc3R5bGluZyBpcyBwZXJtYW5lbnQKICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29ycwogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqLwogICAgUG9seW1lci5EaXJNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgICAgaWYgKCFTSElNX1NIQURPVykgewogICAgICAgIGlmICghb2JzZXJ2ZXIpIHsKICAgICAgICAgIGdldFJUTCgpOwogICAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVEaXJlY3Rpb24pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHthdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnZGlyJ119KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgY29uc3QgZWxlbWVudEJhc2UgPSBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzKGJhc2UpOwoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICAgKi8KICAgICAgY2xhc3MgRGlyIGV4dGVuZHMgZWxlbWVudEJhc2UgewoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3Byb2Nlc3NTdHlsZVRleHQoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICAgICAgY3NzVGV4dCA9IHN1cGVyLl9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpOwogICAgICAgICAgaWYgKCFTSElNX1NIQURPVyAmJiBESVJfQ0hFQ0sudGVzdChjc3NUZXh0KSkgewogICAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5fcmVwbGFjZURpckluQ3NzVGV4dChjc3NUZXh0KTsKICAgICAgICAgICAgdGhpcy5fX2FjdGl2YXRlRGlyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjc3NUZXh0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZSBgOmRpcmAgaW4gdGhlIGdpdmVuIENTUyB0ZXh0CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBDU1MgdGV4dCB0byByZXBsYWNlIERJUgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTW9kaWZpZWQgQ1NTCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIF9yZXBsYWNlRGlySW5Dc3NUZXh0KHRleHQpIHsKICAgICAgICAgIGxldCByZXBsYWNlZFRleHQgPSB0ZXh0OwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoSE9TVF9ESVIsIEhPU1RfRElSX1JFUExBQ01FTlQpOwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoRUxfRElSLCBFTF9ESVJfUkVQTEFDTUVOVCk7CiAgICAgICAgICByZXR1cm4gcmVwbGFjZWRUZXh0OwogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IGB0aGlzYCBpcyBhbiBIVE1MRWxlbWVudAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykuaGFzQXR0cmlidXRlKCdkaXInKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICB0YWtlUmVjb3JkcygpOwogICAgICAgICAgICBESVJfSU5TVEFOQ0VTLnB1c2godGhpcyk7CiAgICAgICAgICAgIHNldFJUTCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICBjb25zdCBpZHggPSBESVJfSU5TVEFOQ0VTLmluZGV4T2YodGhpcyk7CiAgICAgICAgICAgIGlmIChpZHggPiAtMSkgewogICAgICAgICAgICAgIERJUl9JTlNUQU5DRVMuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIERpci5fX2FjdGl2YXRlRGlyID0gZmFsc2U7CgogICAgICByZXR1cm4gRGlyOwogICAgfSk7CiAgfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIC8vIHJ1biBhIGNhbGxiYWNrIHdoZW4gSFRNTEltcG9ydHMgYXJlIHJlYWR5IG9yIGltbWVkaWF0ZWx5IGlmCiAgLy8gdGhpcyBhcGkgaXMgbm90IGF2YWlsYWJsZS4KICBmdW5jdGlvbiB3aGVuSW1wb3J0c1JlYWR5KGNiKSB7CiAgICBpZiAod2luZG93LkhUTUxJbXBvcnRzKSB7CiAgICAgIEhUTUxJbXBvcnRzLndoZW5SZWFkeShjYik7CiAgICB9IGVsc2UgewogICAgICBjYigpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbXBvcnRpbmcgYW4gSFRNTCBkb2N1bWVudCBpbXBlcmF0aXZlbHkuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IGA8bGluayByZWw9ImltcG9ydCI+YCBlbGVtZW50IHdpdGgKICAgKiB0aGUgcHJvdmlkZWQgVVJMIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCB0byBzdGFydCBsb2FkaW5nLgogICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgKiBlbGVtZW50IHdpbGwgY29udGFpbiB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQgY29udGVudHMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIFVSTCB0byBkb2N1bWVudCB0byBsb2FkLgogICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFdmVudCk6dm9pZD19IG9ubG9hZCBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQgc3VjY2Vzc2Z1bGx5CiAgICogICBsb2FkZWQuCiAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUVycm9yRXZlbnQpOnZvaWQ9fSBvbmVycm9yIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydAogICAqICAgdW5zdWNjZXNzZnVsbHkgbG9hZGVkLgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICogICBEZWZhdWx0cyB0byBgZmFsc2VgLgogICAqIEByZXR1cm4geyFIVE1MTGlua0VsZW1lbnR9IFRoZSBsaW5rIGVsZW1lbnQgZm9yIHRoZSBVUkwgdG8gYmUgbG9hZGVkLgogICAqLwogIFBvbHltZXIuaW1wb3J0SHJlZiA9IGZ1bmN0aW9uKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsKICAgIGxldCBsaW5rID0gLyoqIEB0eXBlIHtIVE1MTGlua0VsZW1lbnR9ICovCiAgICAgIChkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj0iJyArIGhyZWYgKyAnIl1baW1wb3J0LWhyZWZdJykpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIGxpbmsgPSAvKiogQHR5cGUge0hUTUxMaW5rRWxlbWVudH0gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKSk7CiAgICAgIGxpbmsucmVsID0gJ2ltcG9ydCc7CiAgICAgIGxpbmsuaHJlZiA9IGhyZWY7CiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdpbXBvcnQtaHJlZicsICcnKTsKICAgIH0KICAgIC8vIGFsd2F5cyBlbnN1cmUgbGluayBoYXMgYGFzeW5jYCBhdHRyaWJ1dGUgaWYgdXNlciBzcGVjaWZpZWQgb25lLAogICAgLy8gZXZlbiBpZiBpdCB3YXMgcHJldmlvdXNseSBub3QgYXN5bmMuIFRoaXMgaXMgY29uc2lkZXJlZCBsZXNzIGNvbmZ1c2luZy4KICAgIGlmIChvcHRBc3luYykgewogICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnYXN5bmMnLCAnJyk7CiAgICB9CiAgICAvLyBOT1RFOiB0aGUgbGluayBtYXkgbm93IGJlIGluIDMgc3RhdGVzOiAoMSkgcGVuZGluZyBpbnNlcnRpb24sCiAgICAvLyAoMikgaW5mbGlnaHQsICgzKSBhbHJlYWR5IGxvYWRlZC4gSW4gZWFjaCBjYXNlLCB3ZSBuZWVkIHRvIGFkZAogICAgLy8gZXZlbnQgbGlzdGVuZXJzIHRvIHByb2Nlc3MgY2FsbGJhY2tzLgogICAgbGV0IGNsZWFudXAgPSBmdW5jdGlvbigpIHsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgbG9hZExpc3RlbmVyKTsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgfTsKICAgIGxldCBsb2FkTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYSBzdWNjZXNzZnVsIGxvYWQsIGNhY2hlIHRoZSBsb2FkIGV2ZW50IG9uIHRoZSBsaW5rIHNvCiAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gc2hvcnQtY2lyY3VpdCB0aGlzIG1ldGhvZCBpbiB0aGUgZnV0dXJlIHdoZW4KICAgICAgLy8gaXQgaXMgY2FsbGVkIHdpdGggdGhlIHNhbWUgaHJlZiBwYXJhbS4KICAgICAgbGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQgPSB0cnVlOwogICAgICBpZiAob25sb2FkKSB7CiAgICAgICAgd2hlbkltcG9ydHNSZWFkeSgoKSA9PiB7CiAgICAgICAgICBvbmxvYWQoZXZlbnQpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgbGV0IGVycm9yTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHJlbW92ZSB0aGUgbGluayBmcm9tIHRoZSBkb2N1bWVudCBzbyB0aGF0IGl0CiAgICAgIC8vIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgYGltcG9ydEhyZWZgIGlzCiAgICAgIC8vIGNhbGxlZC4KICAgICAgaWYgKGxpbmsucGFyZW50Tm9kZSkgewogICAgICAgIGxpbmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5rKTsKICAgICAgfQogICAgICBpZiAob25lcnJvcikgewogICAgICAgIHdoZW5JbXBvcnRzUmVhZHkoKCkgPT4gewogICAgICAgICAgb25lcnJvcihldmVudCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkTGlzdGVuZXIpOwogICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgaWYgKGxpbmsucGFyZW50Tm9kZSA9PSBudWxsKSB7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7CiAgICAvLyBpZiB0aGUgbGluayBhbHJlYWR5IGxvYWRlZCwgZGlzcGF0Y2ggYSBmYWtlIGxvYWQgZXZlbnQKICAgIC8vIHNvIHRoYXQgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYW5kIGdldCBhIHByb3BlciBldmVudCBhcmd1bWVudC4KICAgIH0gZWxzZSBpZiAobGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQpIHsKICAgICAgbGluay5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZCcpKTsKICAgIH0KICAgIHJldHVybiBsaW5rOwogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IGJlZm9yZVJlbmRlclF1ZXVlID0gW107CiAgbGV0IGFmdGVyUmVuZGVyUXVldWUgPSBbXTsKCiAgZnVuY3Rpb24gc2NoZWR1bGUoKSB7CiAgICBzY2hlZHVsZWQgPSB0cnVlOwogICAgLy8gYmVmb3JlIG5leHQgcmVuZGVyCiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7CiAgICAgIHNjaGVkdWxlZCA9IGZhbHNlOwogICAgICBmbHVzaFF1ZXVlKGJlZm9yZVJlbmRlclF1ZXVlKTsKICAgICAgLy8gYWZ0ZXIgdGhlIHJlbmRlcgogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHJ1blF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hRdWV1ZShxdWV1ZSkgewogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewogICAgICBjYWxsTWV0aG9kKHF1ZXVlLnNoaWZ0KCkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcnVuUXVldWUocXVldWUpIHsKICAgIGZvciAobGV0IGk9MCwgbD1xdWV1ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgY2FsbE1ldGhvZChxdWV1ZS5zaGlmdCgpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhbGxNZXRob2QoaW5mbykgewogICAgY29uc3QgY29udGV4dCA9IGluZm9bMF07CiAgICBjb25zdCBjYWxsYmFjayA9IGluZm9bMV07CiAgICBjb25zdCBhcmdzID0gaW5mb1syXTsKICAgIHRyeSB7CiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwogICAgfSBjYXRjaChlKSB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRocm93IGU7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmx1c2goKSB7CiAgICB3aGlsZSAoYmVmb3JlUmVuZGVyUXVldWUubGVuZ3RoIHx8IGFmdGVyUmVuZGVyUXVldWUubGVuZ3RoKSB7CiAgICAgIGZsdXNoUXVldWUoYmVmb3JlUmVuZGVyUXVldWUpOwogICAgICBmbHVzaFF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgfQogICAgc2NoZWR1bGVkID0gZmFsc2U7CiAgfQoKICAvKioKICAgKiBNb2R1bGUgZm9yIHNjaGVkdWxpbmcgZmx1c2hhYmxlIHByZS1yZW5kZXIgYW5kIHBvc3QtcmVuZGVyIHRhc2tzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBzY2hlZHVsaW5nIGZsdXNoYWJsZSBwcmUtcmVuZGVyIGFuZCBwb3N0LXJlbmRlciB0YXNrcy4KICAgKi8KICBQb2x5bWVyLlJlbmRlclN0YXR1cyA9IHsKCiAgICAvKioKICAgICAqIEVucXVldWVzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBuZXh0IHJlbmRlciwgYXQKICAgICAqIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRpbWluZy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGVucXVldWluZyB3b3JrIHRoYXQgcmVxdWlyZXMgRE9NIG1lYXN1cmVtZW50LAogICAgICogc2luY2UgbWVhc3VyZW1lbnQgbWF5IG5vdCBiZSByZWxpYWJsZSBpbiBjdXN0b20gZWxlbWVudCBjYWxsYmFja3MgYmVmb3JlCiAgICAgKiB0aGUgZmlyc3QgcmVuZGVyLCBhcyB3ZWxsIGFzIGZvciBiYXRjaGluZyBtZWFzdXJlbWVudCB0YXNrcyBpbiBnZW5lcmFsLgogICAgICoKICAgICAqIFRhc2tzIGluIHRoaXMgcXVldWUgbWF5IGJlIGZsdXNoZWQgYnkgY2FsbGluZyBgUG9seW1lci5SZW5kZXJTdGF0dXMuZmx1c2goKWAuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBvYmplY3QgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgYm91bmQgdG8KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oLi4uKik6dm9pZH0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7IUFycmF5PX0gYXJncyBBbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgYmVmb3JlTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGJlZm9yZVJlbmRlclF1ZXVlLnB1c2goW2NvbnRleHQsIGNhbGxiYWNrLCBhcmdzXSk7CiAgICB9LAoKICAgIC8qKgogICAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB3aGljaCB3aWxsIGJlIHJ1biBhZnRlciB0aGUgbmV4dCByZW5kZXIsIGVxdWl2YWxlbnQKICAgICAqIHRvIG9uZSB0YXNrIChgc2V0VGltZW91dGApIGFmdGVyIHRoZSBuZXh0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgdHVuaW5nIHRoZSBmaXJzdC1yZW5kZXIgcGVyZm9ybWFuY2Ugb2YgYW4KICAgICAqIGVsZW1lbnQgb3IgYXBwbGljYXRpb24gYnkgZGVmZXJyaW5nIG5vbi1jcml0aWNhbCB3b3JrIHVudGlsIGFmdGVyIHRoZQogICAgICogZmlyc3QgcGFpbnQuICBUeXBpY2FsIG5vbi1yZW5kZXItY3JpdGljYWwgd29yayBtYXkgaW5jbHVkZSBhZGRpbmcgVUkKICAgICAqIGV2ZW50IGxpc3RlbmVycyBhbmQgYXJpYSBhdHRyaWJ1dGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlbmRlclN0YXR1cwogICAgICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGJvdW5kIHRvCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLiopOnZvaWR9IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0geyFBcnJheT19IGFyZ3MgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGgKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGFmdGVyTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGFmdGVyUmVuZGVyUXVldWUucHVzaChbY29udGV4dCwgY2FsbGJhY2ssIGFyZ3NdKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFsbCBgYmVmb3JlTmV4dFJlbmRlcmAgdGFza3MsIGZvbGxvd2VkIGJ5IGFsbCBgYWZ0ZXJOZXh0UmVuZGVyYAogICAgICogdGFza3MuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmbHVzaDogZmx1c2gKCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5yZXNvbHZlZAoKICBmdW5jdGlvbiByZXNvbHZlKCkgewogICAgZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoJ3VucmVzb2x2ZWQnKTsKICB9CgogIGlmICh3aW5kb3cuV2ViQ29tcG9uZW50cykgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ1dlYkNvbXBvbmVudHNSZWFkeScsIHJlc29sdmUpOwogIH0gZWxzZSB7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICAgIHJlc29sdmUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcmVzb2x2ZSk7CiAgICB9CiAgfQoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gbmV3U3BsaWNlKGluZGV4LCByZW1vdmVkLCBhZGRlZENvdW50KSB7CiAgICByZXR1cm4gewogICAgICBpbmRleDogaW5kZXgsCiAgICAgIHJlbW92ZWQ6IHJlbW92ZWQsCiAgICAgIGFkZGVkQ291bnQ6IGFkZGVkQ291bnQKICAgIH07CiAgfQoKICBjb25zdCBFRElUX0xFQVZFID0gMDsKICBjb25zdCBFRElUX1VQREFURSA9IDE7CiAgY29uc3QgRURJVF9BREQgPSAyOwogIGNvbnN0IEVESVRfREVMRVRFID0gMzsKCiAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBpcyAqYmFzZWQqIG9uIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgTGV2ZW5zaHRlaW4KICAvLyAiZWRpdCIgZGlzdGFuY2UuIFRoZSBvbmUgY2hhbmdlIGlzIHRoYXQgInVwZGF0ZXMiIGFyZSB0cmVhdGVkIGFzIHR3bwogIC8vIGVkaXRzIC0gbm90IG9uZS4gV2l0aCBBcnJheSBzcGxpY2VzLCBhbiB1cGRhdGUgaXMgcmVhbGx5IGEgZGVsZXRlCiAgLy8gZm9sbG93ZWQgYnkgYW4gYWRkLiBCeSByZXRhaW5pbmcgdGhpcywgd2Ugb3B0aW1pemUgZm9yICJrZWVwaW5nIiB0aGUKICAvLyBtYXhpbXVtIGFycmF5IGl0ZW1zIGluIHRoZSBvcmlnaW5hbCBhcnJheS4gRm9yIGV4YW1wbGU6CiAgLy8KICAvLyAgICd4eHh4MTIzJyAtPiAnMTIzeXl5eScKICAvLwogIC8vIFdpdGggMS1lZGl0IHVwZGF0ZXMsIHRoZSBzaG9ydGVzdCBwYXRoIHdvdWxkIGJlIGp1c3QgdG8gdXBkYXRlIGFsbCBzZXZlbgogIC8vIGNoYXJhY3RlcnMuIFdpdGggMi1lZGl0IHVwZGF0ZXMsIHdlIGRlbGV0ZSA0LCBsZWF2ZSAzLCBhbmQgYWRkIDQuIFRoaXMKICAvLyBsZWF2ZXMgdGhlIHN1YnN0cmluZyAnMTIzJyBpbnRhY3QuCiAgZnVuY3Rpb24gY2FsY0VkaXREaXN0YW5jZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpIHsKICAgIC8vICJEZWxldGlvbiIgY29sdW1ucwogICAgbGV0IHJvd0NvdW50ID0gb2xkRW5kIC0gb2xkU3RhcnQgKyAxOwogICAgbGV0IGNvbHVtbkNvdW50ID0gY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCArIDE7CiAgICBsZXQgZGlzdGFuY2VzID0gbmV3IEFycmF5KHJvd0NvdW50KTsKCiAgICAvLyAiQWRkaXRpb24iIHJvd3MuIEluaXRpYWxpemUgbnVsbCBjb2x1bW4uCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKICAgICAgZGlzdGFuY2VzW2ldID0gbmV3IEFycmF5KGNvbHVtbkNvdW50KTsKICAgICAgZGlzdGFuY2VzW2ldWzBdID0gaTsKICAgIH0KCiAgICAvLyBJbml0aWFsaXplIG51bGwgcm93CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspCiAgICAgIGRpc3RhbmNlc1swXVtqXSA9IGo7CgogICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dDb3VudDsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewogICAgICAgIGlmIChlcXVhbHMoY3VycmVudFtjdXJyZW50U3RhcnQgKyBqIC0gMV0sIG9sZFtvbGRTdGFydCArIGkgLSAxXSkpCiAgICAgICAgICBkaXN0YW5jZXNbaV1bal0gPSBkaXN0YW5jZXNbaSAtIDFdW2ogLSAxXTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGxldCBub3J0aCA9IGRpc3RhbmNlc1tpIC0gMV1bal0gKyAxOwogICAgICAgICAgbGV0IHdlc3QgPSBkaXN0YW5jZXNbaV1baiAtIDFdICsgMTsKICAgICAgICAgIGRpc3RhbmNlc1tpXVtqXSA9IG5vcnRoIDwgd2VzdCA/IG5vcnRoIDogd2VzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZGlzdGFuY2VzOwogIH0KCiAgLy8gVGhpcyBzdGFydHMgYXQgdGhlIGZpbmFsIHdlaWdodCwgYW5kIHdhbGtzICJiYWNrd2FyZCIgYnkgZmluZGluZwogIC8vIHRoZSBtaW5pbXVtIHByZXZpb3VzIHdlaWdodCByZWN1cnNpdmVseSB1bnRpbCB0aGUgb3JpZ2luIG9mIHRoZSB3ZWlnaHQKICAvLyBtYXRyaXguCiAgZnVuY3Rpb24gc3BsaWNlT3BlcmF0aW9uc0Zyb21FZGl0RGlzdGFuY2VzKGRpc3RhbmNlcykgewogICAgbGV0IGkgPSBkaXN0YW5jZXMubGVuZ3RoIC0gMTsKICAgIGxldCBqID0gZGlzdGFuY2VzWzBdLmxlbmd0aCAtIDE7CiAgICBsZXQgY3VycmVudCA9IGRpc3RhbmNlc1tpXVtqXTsKICAgIGxldCBlZGl0cyA9IFtdOwogICAgd2hpbGUgKGkgPiAwIHx8IGogPiAwKSB7CiAgICAgIGlmIChpID09IDApIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGogPT0gMCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgbm9ydGhXZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07CiAgICAgIGxldCB3ZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqXTsKICAgICAgbGV0IG5vcnRoID0gZGlzdGFuY2VzW2ldW2ogLSAxXTsKCiAgICAgIGxldCBtaW47CiAgICAgIGlmICh3ZXN0IDwgbm9ydGgpCiAgICAgICAgbWluID0gd2VzdCA8IG5vcnRoV2VzdCA/IHdlc3QgOiBub3J0aFdlc3Q7CiAgICAgIGVsc2UKICAgICAgICBtaW4gPSBub3J0aCA8IG5vcnRoV2VzdCA/IG5vcnRoIDogbm9ydGhXZXN0OwoKICAgICAgaWYgKG1pbiA9PSBub3J0aFdlc3QpIHsKICAgICAgICBpZiAobm9ydGhXZXN0ID09IGN1cnJlbnQpIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9MRUFWRSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9VUERBVEUpOwogICAgICAgICAgY3VycmVudCA9IG5vcnRoV2VzdDsKICAgICAgICB9CiAgICAgICAgaS0tOwogICAgICAgIGotLTsKICAgICAgfSBlbHNlIGlmIChtaW4gPT0gd2VzdCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjdXJyZW50ID0gd2VzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY3VycmVudCA9IG5vcnRoOwogICAgICB9CiAgICB9CgogICAgZWRpdHMucmV2ZXJzZSgpOwogICAgcmV0dXJuIGVkaXRzOwogIH0KCiAgLyoqCiAgICogU3BsaWNlIFByb2plY3Rpb24gZnVuY3Rpb25zOgogICAqCiAgICogQSBzcGxpY2UgbWFwIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgaG93IGEgcHJldmlvdXMgYXJyYXkgb2YgaXRlbXMKICAgKiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIG5ldyBhcnJheSBvZiBpdGVtcy4gQ29uY2VwdHVhbGx5IGl0IGlzIGEgbGlzdCBvZgogICAqIHR1cGxlcyBvZgogICAqCiAgICogICA8aW5kZXgsIHJlbW92ZWQsIGFkZGVkQ291bnQ+CiAgICoKICAgKiB3aGljaCBhcmUga2VwdCBpbiBhc2NlbmRpbmcgaW5kZXggb3JkZXIgb2YuIFRoZSB0dXBsZSByZXByZXNlbnRzIHRoYXQgYXQKICAgKiB0aGUgfGluZGV4fCwgfHJlbW92ZWR8IHNlcXVlbmNlIG9mIGl0ZW1zIHdlcmUgcmVtb3ZlZCwgYW5kIGNvdW50aW5nIGZvcndhcmQKICAgKiBmcm9tIHxpbmRleHwsIHxhZGRlZENvdW50fCBpdGVtcyB3ZXJlIGFkZGVkLgogICAqLwoKICAvKioKICAgKiBMYWNraW5nIGluZGl2aWR1YWwgc3BsaWNlIG11dGF0aW9uIGluZm9ybWF0aW9uLCB0aGUgbWluaW1hbCBzZXQgb2YKICAgKiBzcGxpY2VzIGNhbiBiZSBzeW50aGVzaXplZCBnaXZlbiB0aGUgcHJldmlvdXMgc3RhdGUgYW5kIGZpbmFsIHN0YXRlIG9mIGFuCiAgICogYXJyYXkuIFRoZSBiYXNpYyBhcHByb2FjaCBpcyB0byBjYWxjdWxhdGUgdGhlIGVkaXQgZGlzdGFuY2UgbWF0cml4IGFuZAogICAqIGNob29zZSB0aGUgc2hvcnRlc3QgcGF0aCB0aHJvdWdoIGl0LgogICAqCiAgICogQ29tcGxleGl0eTogTyhsICogcCkKICAgKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXkKICAgKiAgIHA6IFRoZSBsZW5ndGggb2YgdGhlIG9sZCBhcnJheQogICAqCiAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlIGN1cnJlbnQgImNoYW5nZWQiIGFycmF5IGZvciB3aGljaCB0bwogICAqIGNhbGN1bGF0ZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RhcnQgU3RhcnRpbmcgaW5kZXggaW4gdGhlIGBjdXJyZW50YCBhcnJheSBmb3IKICAgKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50RW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYGN1cnJlbnRgIGFycmF5IGZvcgogICAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuCiAgICogQHBhcmFtIHshQXJyYXl9IG9sZCBUaGUgb3JpZ2luYWwgInVuY2hhbmdlZCIgYXJyYXkgdG8gY29tcGFyZSBgY3VycmVudGAKICAgKiBhZ2FpbnN0IHRvIGRldGVybWluZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBvbGRTdGFydCBTdGFydGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcGFyYW0ge251bWJlcn0gb2xkRW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICogY29udGFpbnM6IGBpbmRleGAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzcGxpY2Ugb2NjdXJyZWQ7IGByZW1vdmVkYAogICAqIHRoZSBhcnJheSBvZiByZW1vdmVkIGl0ZW1zIGZyb20gdGhpcyBsb2NhdGlvbjsgYGFkZGVkQ291bnRgIHRoZSBudW1iZXIKICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAqLwogIGZ1bmN0aW9uIGNhbGNTcGxpY2VzKGN1cnJlbnQsIGN1cnJlbnRTdGFydCwgY3VycmVudEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSB7CiAgICBsZXQgcHJlZml4Q291bnQgPSAwOwogICAgbGV0IHN1ZmZpeENvdW50ID0gMDsKICAgIGxldCBzcGxpY2U7CgogICAgbGV0IG1pbkxlbmd0aCA9IE1hdGgubWluKGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQsIG9sZEVuZCAtIG9sZFN0YXJ0KTsKICAgIGlmIChjdXJyZW50U3RhcnQgPT0gMCAmJiBvbGRTdGFydCA9PSAwKQogICAgICBwcmVmaXhDb3VudCA9IHNoYXJlZFByZWZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCk7CgogICAgaWYgKGN1cnJlbnRFbmQgPT0gY3VycmVudC5sZW5ndGggJiYgb2xkRW5kID09IG9sZC5sZW5ndGgpCiAgICAgIHN1ZmZpeENvdW50ID0gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgbWluTGVuZ3RoIC0gcHJlZml4Q291bnQpOwoKICAgIGN1cnJlbnRTdGFydCArPSBwcmVmaXhDb3VudDsKICAgIG9sZFN0YXJ0ICs9IHByZWZpeENvdW50OwogICAgY3VycmVudEVuZCAtPSBzdWZmaXhDb3VudDsKICAgIG9sZEVuZCAtPSBzdWZmaXhDb3VudDsKCiAgICBpZiAoY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCA9PSAwICYmIG9sZEVuZCAtIG9sZFN0YXJ0ID09IDApCiAgICAgIHJldHVybiBbXTsKCiAgICBpZiAoY3VycmVudFN0YXJ0ID09IGN1cnJlbnRFbmQpIHsKICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIDApOwogICAgICB3aGlsZSAob2xkU3RhcnQgPCBvbGRFbmQpCiAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkU3RhcnQrK10pOwoKICAgICAgcmV0dXJuIFsgc3BsaWNlIF07CiAgICB9IGVsc2UgaWYgKG9sZFN0YXJ0ID09IG9sZEVuZCkKICAgICAgcmV0dXJuIFsgbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQpIF07CgogICAgbGV0IG9wcyA9IHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcygKICAgICAgICBjYWxjRWRpdERpc3RhbmNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpKTsKCiAgICBzcGxpY2UgPSB1bmRlZmluZWQ7CiAgICBsZXQgc3BsaWNlcyA9IFtdOwogICAgbGV0IGluZGV4ID0gY3VycmVudFN0YXJ0OwogICAgbGV0IG9sZEluZGV4ID0gb2xkU3RhcnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewogICAgICBzd2l0Y2gob3BzW2ldKSB7CiAgICAgICAgY2FzZSBFRElUX0xFQVZFOgogICAgICAgICAgaWYgKHNwbGljZSkgewogICAgICAgICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTsKICAgICAgICAgICAgc3BsaWNlID0gdW5kZWZpbmVkOwogICAgICAgICAgfQoKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFRElUX1VQREFURToKICAgICAgICAgIGlmICghc3BsaWNlKQogICAgICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoaW5kZXgsIFtdLCAwKTsKCiAgICAgICAgICBzcGxpY2UuYWRkZWRDb3VudCsrOwogICAgICAgICAgaW5kZXgrKzsKCiAgICAgICAgICBzcGxpY2UucmVtb3ZlZC5wdXNoKG9sZFtvbGRJbmRleF0pOwogICAgICAgICAgb2xkSW5kZXgrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRURJVF9BREQ6CiAgICAgICAgICBpZiAoIXNwbGljZSkKICAgICAgICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGluZGV4LCBbXSwgMCk7CgogICAgICAgICAgc3BsaWNlLmFkZGVkQ291bnQrKzsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVESVRfREVMRVRFOgogICAgICAgICAgaWYgKCFzcGxpY2UpCiAgICAgICAgICAgIHNwbGljZSA9IG5ld1NwbGljZShpbmRleCwgW10sIDApOwoKICAgICAgICAgIHNwbGljZS5yZW1vdmVkLnB1c2gob2xkW29sZEluZGV4XSk7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3BsaWNlKSB7CiAgICAgIHNwbGljZXMucHVzaChzcGxpY2UpOwogICAgfQogICAgcmV0dXJuIHNwbGljZXM7CiAgfQoKICBmdW5jdGlvbiBzaGFyZWRQcmVmaXgoY3VycmVudCwgb2xkLCBzZWFyY2hMZW5ndGgpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoTGVuZ3RoOyBpKyspCiAgICAgIGlmICghZXF1YWxzKGN1cnJlbnRbaV0sIG9sZFtpXSkpCiAgICAgICAgcmV0dXJuIGk7CiAgICByZXR1cm4gc2VhcmNoTGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgc2VhcmNoTGVuZ3RoKSB7CiAgICBsZXQgaW5kZXgxID0gY3VycmVudC5sZW5ndGg7CiAgICBsZXQgaW5kZXgyID0gb2xkLmxlbmd0aDsKICAgIGxldCBjb3VudCA9IDA7CiAgICB3aGlsZSAoY291bnQgPCBzZWFyY2hMZW5ndGggJiYgZXF1YWxzKGN1cnJlbnRbLS1pbmRleDFdLCBvbGRbLS1pbmRleDJdKSkKICAgICAgY291bnQrKzsKCiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBmdW5jdGlvbiBjYWxjdWxhdGVTcGxpY2VzKGN1cnJlbnQsIHByZXZpb3VzKSB7CiAgICByZXR1cm4gY2FsY1NwbGljZXMoY3VycmVudCwgMCwgY3VycmVudC5sZW5ndGgsIHByZXZpb3VzLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubGVuZ3RoKTsKICB9CgogIGZ1bmN0aW9uIGVxdWFscyhjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpIHsKICAgIHJldHVybiBjdXJyZW50VmFsdWUgPT09IHByZXZpb3VzVmFsdWU7CiAgfQoKICAvKioKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgdGhhdCBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGRpZmZpbmcgYXJyYXlzLgogICAqLwogIFBvbHltZXIuQXJyYXlTcGxpY2UgPSB7CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMgaW5kaWNhdGluZyB0aGUgbWluaW11bSBlZGl0cyByZXF1aXJlZAogICAgICogdG8gdHJhbnNmb3JtIHRoZSBgcHJldmlvdXNgIGFycmF5IGludG8gdGhlIGBjdXJyZW50YCBhcnJheS4KICAgICAqCiAgICAgKiBTcGxpY2UgcmVjb3JkcyBhcmUgb3JkZXJlZCBieSBpbmRleCBhbmQgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKICAgICAqIC0gYGluZGV4YDogaW5kZXggd2hlcmUgZWRpdCBzdGFydGVkCiAgICAgKiAtIGByZW1vdmVkYDogYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgaW5kZXgKICAgICAqIC0gYGFkZGVkQ291bnRgOiBudW1iZXIgb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBpbmRleAogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gdGhlIExldmVuc2h0ZWluICJtaW5pbXVtIGVkaXQgZGlzdGFuY2UiCiAgICAgKiBhbGdvcml0aG0uIE5vdGUgdGhhdCB1cGRhdGVzIGFyZSB0cmVhdGVkIGFzIHJlbW92YWwgZm9sbG93ZWQgYnkgYWRkaXRpb24uCiAgICAgKgogICAgICogVGhlIHdvcnN0LWNhc2UgdGltZSBjb21wbGV4aXR5IG9mIHRoaXMgYWxnb3JpdGhtIGlzIGBPKGwgKiBwKWAKICAgICAqICAgbDogVGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBhcnJheQogICAgICogICBwOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmV2aW91cyBhcnJheQogICAgICoKICAgICAqIEhvd2V2ZXIsIHRoZSB3b3JzdC1jYXNlIGNvbXBsZXhpdHkgaXMgcmVkdWNlZCBieSBhbiBgTyhuKWAgb3B0aW1pemF0aW9uCiAgICAgKiB0byBkZXRlY3QgYW55IHNoYXJlZCBwcmVmaXggJiBzdWZmaXggYmV0d2VlbiB0aGUgdHdvIGFycmF5cyBhbmQgb25seQogICAgICogcGVyZm9ybSB0aGUgbW9yZSBleHBlbnNpdmUgbWluaW11bSBlZGl0IGRpc3RhbmNlIGNhbGN1bGF0aW9uIG92ZXIgdGhlCiAgICAgKiBub24tc2hhcmVkIHBvcnRpb25zIG9mIHRoZSBhcnJheXMuCiAgICAgKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5BcnJheVNwbGljZQogICAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlICJjaGFuZ2VkIiBhcnJheSBmb3Igd2hpY2ggc3BsaWNlcyB3aWxsIGJlCiAgICAgKiBjYWxjdWxhdGVkLgogICAgICogQHBhcmFtIHshQXJyYXl9IHByZXZpb3VzIFRoZSAidW5jaGFuZ2VkIiBvcmlnaW5hbCBhcnJheSB0byBjb21wYXJlCiAgICAgKiBgY3VycmVudGAgYWdhaW5zdCB0byBkZXRlcm1pbmUgdGhlIHNwbGljZXMuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICAgKiBjb250YWluczogYGluZGV4YCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHNwbGljZSBvY2N1cnJlZDsgYHJlbW92ZWRgCiAgICAgKiB0aGUgYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgbG9jYXRpb247IGBhZGRlZENvdW50YCB0aGUgbnVtYmVyCiAgICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAgICovCiAgICBjYWxjdWxhdGVTcGxpY2VzCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIGBub2RlYCBpcyBhIHNsb3QgZWxlbWVudAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHRlc3QuCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgbm9kZWAgaXMgYSBzbG90CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBpc1Nsb3Qobm9kZSkgewogICAgcmV0dXJuIChub2RlLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKTsKICB9CgogIC8qKgogICAqIENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLiBUaGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgY29uc2lzdHMKICAgKiBvZiBhIG5vZGUncyBjaGlsZHJlbiBhbmQsIGZvciBhbnkgY2hpbGRyZW4gdGhhdCBhcmUgYDxzbG90PmAgZWxlbWVudHMsCiAgICogdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9ic2VydmVkIG5vZGUgaGFzIGNoaWxkcmVuIGA8YT48L2E+PHNsb3Q+PC9zbG90PjxiPjwvYj5gCiAgICogYW5kIHRoZSBgPHNsb3Q+YCBoYXMgb25lIGA8ZGl2PmAgYXNzaWduZWQgdG8gaXQsIHRoZW4gdGhlIGZsYXR0ZW5lZAogICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICogYDxzbG90PmAgZWxlbWVudHMgYXNzaWduZWQgdG8gaXQsIHRoZXNlIGFyZSBmbGF0dGVuZWQgYXMgd2VsbC4KICAgKgogICAqIFRoZSBwcm92aWRlZCBgY2FsbGJhY2tgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgY2hhbmdlIHRvIHRoaXMgbGlzdAogICAqIG9mIGZsYXR0ZW5lZCBub2RlcyBvY2N1cnMsIHdoZXJlIGFuIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYSBub2RlIGlzCiAgICogY29uc2lkZXJlZCBhIGNoYW5nZS4gVGhlIGBjYWxsYmFja2AgaXMgY2FsbGVkIHdpdGggb25lIGFyZ3VtZW50LCBhbiBvYmplY3QKICAgKiBjb250YWluaW5nIGFuIGFycmF5IG9mIGFueSBgYWRkZWROb2Rlc2AgYW5kIGByZW1vdmVkTm9kZXNgLgogICAqCiAgICogTm90ZTogdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBhc3luY2hyb25vdXMgdG8gYW55IGNoYW5nZXMKICAgKiBhdCBhIG1pY3JvdGFzayBjaGVja3BvaW50LiBUaGlzIGlzIGJlY2F1c2Ugb2JzZXJ2YXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nCiAgICogYE11dGF0aW9uT2JzZXJ2ZXJgIGFuZCB0aGUgYDxzbG90PmAgZWxlbWVudCdzIGBzbG90Y2hhbmdlYCBldmVudCB3aGljaAogICAqIGFyZSBhc3luY2hyb25vdXMuCiAgICoKICAgKiBBbiBleGFtcGxlOgogICAqIGBgYGpzCiAgICogY2xhc3MgVGVzdFNlbGZPYnNlcnZlIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAndGVzdC1zZWxmLW9ic2VydmUnO30KICAgKiAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcywgKGluZm8pID0+IHsKICAgKiAgICAgICB0aGlzLmluZm8gPSBpbmZvOwogICAqICAgICB9KTsKICAgKiAgIH0KICAgKiAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICogICB9CiAgICogfQogICAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZShUZXN0U2VsZk9ic2VydmUuaXMsIFRlc3RTZWxmT2JzZXJ2ZSk7CiAgICogYGBgCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLgogICAqLwogIGNsYXNzIEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIgewoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgZm9yIHRoZSBnaXZlbiBgbm9kZWAuCiAgICAgKiBUaGlzIGxpc3QgY29uc2lzdHMgb2YgYSBub2RlJ3MgY2hpbGRyZW4gYW5kLCBmb3IgYW55IGNoaWxkcmVuCiAgICAgKiB0aGF0IGFyZSBgPHNsb3Q+YCBlbGVtZW50cywgdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2ZWQgbm9kZSBoYXMgY2hpbGRyZW4gYDxhPjwvYT48c2xvdD48L3Nsb3Q+PGI+PC9iPmAKICAgICAqIGFuZCB0aGUgYDxzbG90PmAgaGFzIG9uZSBgPGRpdj5gIGFzc2lnbmVkIHRvIGl0LCB0aGVuIHRoZSBmbGF0dGVuZWQKICAgICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICAgKiBgPHNsb3Q+YCBlbGVtZW50cyBhc3NpZ25lZCB0byBpdCwgdGhlc2UgYXJlIGZsYXR0ZW5lZCBhcyB3ZWxsLgogICAgICoKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8SFRNTFNsb3RFbGVtZW50fSBub2RlIFRoZSBub2RlIGZvciB3aGljaCB0byByZXR1cm4gdGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzLgogICAgICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2RlcyBmb3IgdGhlIGdpdmVuIGBub2RlYC4KICAgICovCiAgICBzdGF0aWMgZ2V0RmxhdHRlbmVkTm9kZXMobm9kZSkgewogICAgICBpZiAoaXNTbG90KG5vZGUpKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7SFRNTFNsb3RFbGVtZW50fSAqLyhub2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLm1hcCgobm9kZSkgPT4gewogICAgICAgICAgaWYgKGlzU2xvdChub2RlKSkgewogICAgICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtIVE1MU2xvdEVsZW1lbnR9ICovKG5vZGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBbbm9kZV07CiAgICAgICAgICB9CiAgICAgICAgfSkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBOb2RlIG9uIHdoaWNoIHRvIGxpc3RlbiBmb3IgY2hhbmdlcy4KICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgYWRkaXRpb25zCiAgICAgKiBvciByZW1vdmFscyBmcm9tIHRoZSB0YXJnZXQncyBsaXN0IG9mIGZsYXR0ZW5lZCBub2Rlcy4KICAgICovCiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIGNhbGxiYWNrKSB7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciA9IG51bGw7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgLyoqCiAgICAgICAqIEB0eXBlIHtFbGVtZW50fQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gW107CiAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDsKICAgICAgdGhpcy5fc2NoZWR1bGVkID0gZmFsc2U7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX2JvdW5kU2NoZWR1bGUgPSAoKSA9PiB7CiAgICAgICAgdGhpcy5fc2NoZWR1bGUoKTsKICAgICAgfTsKICAgICAgdGhpcy5jb25uZWN0KCk7CiAgICAgIHRoaXMuX3NjaGVkdWxlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBY3RpdmF0ZXMgYW4gb2JzZXJ2ZXIuIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4KICAgICAqIGEgYEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJgIGlzIGNyZWF0ZWQuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0bwogICAgICogcmUtYWN0aXZhdGUgYW4gb2JzZXJ2ZXIgdGhhdCBoYXMgYmVlbiBkZWFjdGl2YXRlZCB2aWEgdGhlIGBkaXNjb25uZWN0YCBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdCgpIHsKICAgICAgaWYgKGlzU2xvdCh0aGlzLl90YXJnZXQpKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOwogICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhcmdldC5jaGlsZHJlbikgewogICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSkgewogICAgICAgICAgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyID0KICAgICAgICAgICAgU2hhZHlET00ub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3RhcmdldCwgKG11dGF0aW9ucykgPT4gewogICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPQogICAgICAgICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl90YXJnZXQsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIERlYWN0aXZhdGVzIHRoZSBmbGF0dGVuZWQgbm9kZXMgb2JzZXJ2ZXIuIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QKICAgICAqIHRoZSBvYnNlcnZlciBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiBjaGFuZ2VzIHRvIGZsYXR0ZW5lZCBub2RlcwogICAgICogb2NjdXIuIFRoZSBgY29ubmVjdGAgbWV0aG9kIG1heSBiZSBzdWJzZXF1ZW50bHkgY2FsbGVkIHRvIHJlYWN0aXZhdGUKICAgICAqIHRoZSBvYnNlcnZlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBkaXNjb25uZWN0KCkgewogICAgICBpZiAoaXNTbG90KHRoaXMuX3RhcmdldCkpIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKFt0aGlzLl90YXJnZXRdKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXJnZXQuY2hpbGRyZW4pIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICAgIFNoYWR5RE9NLnVub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcik7CiAgICAgICAgICB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3NjaGVkdWxlKCkgewogICAgICBpZiAoIXRoaXMuX3NjaGVkdWxlZCkgewogICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHRoaXMuZmx1c2goKSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXk8TXV0YXRpb25SZWNvcmQ+fSBtdXRhdGlvbnMgTXV0YXRpb25zIHNpZ25hbGVkIGJ5IHRoZSBtdXRhdGlvbiBvYnNlcnZlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF9wcm9jZXNzTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgICB0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICB0aGlzLmZsdXNoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0FycmF5PE11dGF0aW9uUmVjb3JkPn0gbXV0YXRpb25zIE11dGF0aW9ucyBzaWduYWxlZCBieSB0aGUgbXV0YXRpb24gb2JzZXJ2ZXIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfcHJvY2Vzc1Nsb3RNdXRhdGlvbnMobXV0YXRpb25zKSB7CiAgICAgIGlmIChtdXRhdGlvbnMpIHsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTsKICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKG11dGF0aW9uLmFkZGVkTm9kZXMpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2RlcykgewogICAgICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGbHVzaGVzIHRoZSBvYnNlcnZlciBjYXVzaW5nIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gYmUgaW1tZWRpYXRlbHkKICAgICAqIGRlbGl2ZXJlZCB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2suIEJ5IGRlZmF1bHQgdGhlc2UgY2hhbmdlcyBhcmUgZGVsaXZlcmVkCiAgICAgKiBhc3luY2hyb25vdXNseSBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBlbmRpbmcgY2hhbmdlcyBjYXVzZWQgdGhlIG9ic2VydmVyCiAgICAgKiBjYWxsYmFjayB0byBydW4uCiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgU2hhZHlET00uZmx1c2goKTsKICAgICAgfQogICAgICBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgIHRoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpOwogICAgICB9CiAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IGZhbHNlOwogICAgICBsZXQgaW5mbyA9IHsKICAgICAgICB0YXJnZXQ6IHRoaXMuX3RhcmdldCwKICAgICAgICBhZGRlZE5vZGVzOiBbXSwKICAgICAgICByZW1vdmVkTm9kZXM6IFtdCiAgICAgIH07CiAgICAgIGxldCBuZXdOb2RlcyA9IHRoaXMuY29uc3RydWN0b3IuZ2V0RmxhdHRlbmVkTm9kZXModGhpcy5fdGFyZ2V0KTsKICAgICAgbGV0IHNwbGljZXMgPSBQb2x5bWVyLkFycmF5U3BsaWNlLmNhbGN1bGF0ZVNwbGljZXMobmV3Tm9kZXMsCiAgICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMpOwogICAgICAvLyBwcm9jZXNzIHJlbW92YWxzCiAgICAgIGZvciAobGV0IGk9MCwgczsgKGk8c3BsaWNlcy5sZW5ndGgpICYmIChzPXNwbGljZXNbaV0pOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqPTAsIG47IChqIDwgcy5yZW1vdmVkLmxlbmd0aCkgJiYgKG49cy5yZW1vdmVkW2pdKTsgaisrKSB7CiAgICAgICAgICBpbmZvLnJlbW92ZWROb2Rlcy5wdXNoKG4pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBwcm9jZXNzIGFkZHMKICAgICAgZm9yIChsZXQgaT0wLCBzOyAoaTxzcGxpY2VzLmxlbmd0aCkgJiYgKHM9c3BsaWNlc1tpXSk7IGkrKykgewogICAgICAgIGZvciAobGV0IGo9cy5pbmRleDsgaiA8IHMuaW5kZXggKyBzLmFkZGVkQ291bnQ7IGorKykgewogICAgICAgICAgaW5mby5hZGRlZE5vZGVzLnB1c2gobmV3Tm9kZXNbal0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB1cGRhdGUgY2FjaGUKICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMgPSBuZXdOb2RlczsKICAgICAgbGV0IGRpZEZsdXNoID0gZmFsc2U7CiAgICAgIGlmIChpbmZvLmFkZGVkTm9kZXMubGVuZ3RoIHx8IGluZm8ucmVtb3ZlZE5vZGVzLmxlbmd0aCkgewogICAgICAgIGRpZEZsdXNoID0gdHJ1ZTsKICAgICAgICB0aGlzLmNhbGxiYWNrLmNhbGwodGhpcy5fdGFyZ2V0LCBpbmZvKTsKICAgICAgfQogICAgICByZXR1cm4gZGlkRmx1c2g7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFBcnJheTxFbGVtZW50fE5vZGU+fCFOb2RlTGlzdDxOb2RlPn0gbm9kZUxpc3QgTm9kZXMgdGhhdCBjb3VsZCBjaGFuZ2UKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfbGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshQXJyYXk8RWxlbWVudHxOb2RlPnwhTm9kZUxpc3Q8Tm9kZT59IG5vZGVMaXN0IE5vZGVzIHRoYXQgY291bGQgY2hhbmdlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3VubGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICB9CgogIFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlciA9IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXI7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBkZWJvdW5jZXJRdWV1ZSA9IFtdOwoKICAvKioKICAgKiBBZGRzIGEgYFBvbHltZXIuRGVib3VuY2VyYCB0byBhIGxpc3Qgb2YgZ2xvYmFsbHkgZmx1c2hhYmxlIHRhc2tzLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIgPSBmdW5jdGlvbihkZWJvdW5jZXIpIHsKICAgIGRlYm91bmNlclF1ZXVlLnB1c2goZGVib3VuY2VyKTsKICB9OwoKICBmdW5jdGlvbiBmbHVzaERlYm91bmNlcnMoKSB7CiAgICBjb25zdCBkaWRGbHVzaCA9IEJvb2xlYW4oZGVib3VuY2VyUXVldWUubGVuZ3RoKTsKICAgIHdoaWxlIChkZWJvdW5jZXJRdWV1ZS5sZW5ndGgpIHsKICAgICAgdHJ5IHsKICAgICAgICBkZWJvdW5jZXJRdWV1ZS5zaGlmdCgpLmZsdXNoKCk7CiAgICAgIH0gY2F0Y2goZSkgewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRpZEZsdXNoOwogIH0KCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgZW5xdWV1ZURlYm91bmNlcmAKICAgKiAtIFNoYWR5RE9NIGRpc3RyaWJ1dGlvbgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuZmx1c2ggPSBmdW5jdGlvbigpIHsKICAgIGxldCBzaGFkeURPTSwgZGVib3VuY2VyczsKICAgIGRvIHsKICAgICAgc2hhZHlET00gPSB3aW5kb3cuU2hhZHlET00gJiYgU2hhZHlET00uZmx1c2goKTsKICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0pIHsKICAgICAgICB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0uZmx1c2goKTsKICAgICAgfQogICAgICBkZWJvdW5jZXJzID0gZmx1c2hEZWJvdW5jZXJzKCk7CiAgICB9IHdoaWxlIChzaGFkeURPTSB8fCBkZWJvdW5jZXJzKTsKICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBwID0gRWxlbWVudC5wcm90b3R5cGU7CiAgLyoqCiAgICogQGNvbnN0IHtmdW5jdGlvbih0aGlzOk5vZGUsIHN0cmluZyk6IGJvb2xlYW59CiAgICovCiAgY29uc3Qgbm9ybWFsaXplZE1hdGNoZXNTZWxlY3RvciA9IHAubWF0Y2hlcyB8fCBwLm1hdGNoZXNTZWxlY3RvciB8fAogICAgcC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgcC5tc01hdGNoZXNTZWxlY3RvciB8fAogICAgcC5vTWF0Y2hlc1NlbGVjdG9yIHx8IHAud2Via2l0TWF0Y2hlc1NlbGVjdG9yOwoKICAvKioKICAgKiBDcm9zcy1wbGF0Zm9ybSBgZWxlbWVudC5tYXRjaGVzYCBzaGltLgogICAqCiAgICogQGZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBjaGVjayBzZWxlY3RvciBhZ2FpbnN0CiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIG1hdGNoCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBub2RlIG1hdGNoZWQgc2VsZWN0b3IKICAgKi8KICBjb25zdCBtYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbihub2RlLCBzZWxlY3RvcikgewogICAgcmV0dXJuIG5vcm1hbGl6ZWRNYXRjaGVzU2VsZWN0b3IuY2FsbChub2RlLCBzZWxlY3Rvcik7CiAgfTsKCiAgLyoqCiAgICogTm9kZSBBUEkgd3JhcHBlciBjbGFzcyByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmRvbS4odGFyZ2V0KWAgd2hlbgogICAqIGB0YXJnZXRgIGlzIGEgYE5vZGVgLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKi8KICBjbGFzcyBEb21BcGkgewoKICAgIC8qKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIFBvbHltZXIuZG9tIGhlbHBlciBvYmplY3QuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5vZGUpIHsKICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcmAgdGhhdAogICAgICogbGlzdGVucyBmb3Igbm9kZSBjaGFuZ2VzIG9uIHRoaXMgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBDYWxsZWQgd2hlbiBkaXJlY3Qgb3IgZGlzdHJpYnV0ZWQgY2hpbGRyZW4KICAgICAqICAgb2YgdGhpcyBlbGVtZW50IGNoYW5nZXMKICAgICAqIEByZXR1cm4geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IE9ic2VydmVyIGluc3RhbmNlCiAgICAgKi8KICAgIG9ic2VydmVOb2RlcyhjYWxsYmFjaykgewogICAgICByZXR1cm4gbmV3IFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcih0aGlzLm5vZGUsIGNhbGxiYWNrKTsKICAgIH0KCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGFuIG9ic2VydmVyIHByZXZpb3VzbHkgY3JlYXRlZCB2aWEgYG9ic2VydmVOb2Rlc2AKICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IG9ic2VydmVySGFuZGxlIE9ic2VydmVyIGluc3RhbmNlCiAgICAgKiAgIHRvIGRpc2Nvbm5lY3QuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB1bm9ic2VydmVOb2RlcyhvYnNlcnZlckhhbmRsZSkgewogICAgICBvYnNlcnZlckhhbmRsZS5kaXNjb25uZWN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm92aWRlZCBhcyBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIEFQSSBvbmx5LiAgVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbm90aWZ5T2JzZXJ2ZXIoKSB7fQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBub2RlIGlzIGNvbnRhaW5lZCB3aXRoIHRoaXMgZWxlbWVudCdzCiAgICAgKiBsaWdodC1ET00gY2hpbGRyZW4gb3Igc2hhZG93IHJvb3QsIGluY2x1ZGluZyBhbnkgbmVzdGVkIHNoYWRvdyByb290cwogICAgICogb2YgY2hpbGRyZW4gdGhlcmVpbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byB0ZXN0CiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBub2RlYCBpcyBjb250YWluZWQgd2l0aGluCiAgICAgKiAgIHRoaXMgZWxlbWVudCdzIGxpZ2h0IG9yIHNoYWRvdyBET00uCiAgICAgKi8KICAgIGRlZXBDb250YWlucyhub2RlKSB7CiAgICAgIGlmICh0aGlzLm5vZGUuY29udGFpbnMobm9kZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbiA9IG5vZGU7CiAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7CiAgICAgIC8vIHdhbGsgZnJvbSBub2RlIHRvIGB0aGlzYCBvciBgZG9jdW1lbnRgCiAgICAgIHdoaWxlIChuICYmIG4gIT09IGRvYyAmJiBuICE9PSB0aGlzLm5vZGUpIHsKICAgICAgICAvLyB1c2UgbG9naWNhbCBwYXJlbnRub2RlLCBvciBuYXRpdmUgU2hhZG93Um9vdCBob3N0CiAgICAgICAgbiA9IG4ucGFyZW50Tm9kZSB8fCBuLmhvc3Q7CiAgICAgIH0KICAgICAgcmV0dXJuIG4gPT09IHRoaXMubm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIG5vZGUuICBFcXVpdmFsZW50IHRvIGBnZXRSb29kTm9kZSgpYC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtOb2RlfSBUb3AgbW9zdCBlbGVtZW50IGluIHRoZSBkb20gdHJlZSBpbiB3aGljaCB0aGUgbm9kZQogICAgICogZXhpc3RzLiBJZiB0aGUgbm9kZSBpcyBjb25uZWN0ZWQgdG8gYSBkb2N1bWVudCB0aGlzIGlzIGVpdGhlciBhCiAgICAgKiBzaGFkb3dSb290IG9yIHRoZSBkb2N1bWVudDsgb3RoZXJ3aXNlLCBpdCBtYXkgYmUgdGhlIG5vZGUKICAgICAqIGl0c2VsZiBvciBhIG5vZGUgb3IgZG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyBpdC4KICAgICAqLwogICAgZ2V0T3duZXJSb290KCkgewogICAgICByZXR1cm4gdGhpcy5ub2RlLmdldFJvb3ROb2RlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3Igc2xvdCBlbGVtZW50cywgcmV0dXJucyB0aGUgbm9kZXMgYXNzaWduZWQgdG8gdGhlIHNsb3Q7IG90aGVyd2lzZQogICAgICogYW4gZW1wdHkgYXJyYXkuIEl0IGlzIGVxdWl2YWxlbnQgdG8gYDxzbG90Pi5hZGRpZ25lZE5vZGVzKHtmbGF0dGVuOnRydWV9KWAuCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gQXJyYXkgb2YgYXNzaWduZWQgbm9kZXMKICAgICAqLwogICAgZ2V0RGlzdHJpYnV0ZWROb2RlcygpIHsKICAgICAgcmV0dXJuICh0aGlzLm5vZGUubG9jYWxOYW1lID09PSAnc2xvdCcpID8KICAgICAgICB0aGlzLm5vZGUuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjogdHJ1ZX0pIDoKICAgICAgICBbXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHNsb3RzIHRoaXMgZWxlbWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU2xvdEVsZW1lbnQ+fSBEZXNjcmlwdGlvbgogICAgICovCiAgICBnZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cygpIHsKICAgICAgbGV0IGlwJCA9IFtdOwogICAgICBsZXQgbiA9IHRoaXMubm9kZS5hc3NpZ25lZFNsb3Q7CiAgICAgIHdoaWxlIChuKSB7CiAgICAgICAgaXAkLnB1c2gobik7CiAgICAgICAgbiA9IG4uYXNzaWduZWRTbG90OwogICAgICB9CiAgICAgIHJldHVybiBpcCQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxscyBgaW1wb3J0Tm9kZWAgb24gdGhlIGBvd25lckRvY3VtZW50YCBmb3IgdGhpcyBub2RlLgogICAgICoKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBpbXBvcnQKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVlcCBUcnVlIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbG9uZWQgZGVlcGx5IGR1cmluZwogICAgICogICBpbXBvcnQKICAgICAqIEByZXR1cm4ge05vZGV9IENsb25lIG9mIGdpdmVuIG5vZGUgaW1wb3J0ZWQgdG8gdGhpcyBvd25lciBkb2N1bWVudAogICAgICovCiAgICBpbXBvcnROb2RlKG5vZGUsIGRlZXApIHsKICAgICAgbGV0IGRvYyA9IHRoaXMubm9kZSBpbnN0YW5jZW9mIERvY3VtZW50ID8gdGhpcy5ub2RlIDoKICAgICAgICB0aGlzLm5vZGUub3duZXJEb2N1bWVudDsKICAgICAgcmV0dXJuIGRvYy5pbXBvcnROb2RlKG5vZGUsIGRlZXApOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gUmV0dXJucyBhIGZsYXR0ZW5lZCBsaXN0IG9mIGFsbCBjaGlsZCBub2RlcyBhbmQKICAgICAqIG5vZGVzIGFzc2lnbmVkIHRvIGNoaWxkIHNsb3RzLgogICAgICovCiAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICByZXR1cm4gUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMubm9kZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBmbGF0dGVuZWQgY2hpbGQgZWxlbWVudHMgZm9yIHRoaXMgZWxlbWVudCBiYXNlZAogICAgICogb24gdGhlIGdpdmVuIHNlbGVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBmaWx0ZXIgbm9kZXMgYWdhaW5zdAogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MRWxlbWVudD59IExpc3Qgb2YgZmxhdHRlbmVkIGNoaWxkIGVsZW1lbnRzCiAgICAgKi8KICAgIHF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3RvcikgewogICAgICBsZXQgYyQgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgbGV0IGxpc3QgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wLCBsPWMkLmxlbmd0aCwgYzsgKGk8bCkgJiYgKGM9YyRbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKGMubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJgogICAgICAgICAgICBtYXRjaGVzU2VsZWN0b3IoYywgc2VsZWN0b3IpKSB7CiAgICAgICAgICBsaXN0LnB1c2goYyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qKgogICAgICogRm9yIHNoYWRvdyByb290cywgcmV0dXJucyB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCB3aXRoaW4gdGhpcwogICAgICogc2hhZG93IHJvb3QuCiAgICAgKgogICAgICogQHJldHVybiB7Tm9kZXx1bmRlZmluZWR9IEN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnQKICAgICAqLwogICAgZ2V0IGFjdGl2ZUVsZW1lbnQoKSB7CiAgICAgIGxldCBub2RlID0gdGhpcy5ub2RlOwogICAgICByZXR1cm4gbm9kZS5fYWN0aXZlRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gbm9kZS5fYWN0aXZlRWxlbWVudCA6IG5vZGUuYWN0aXZlRWxlbWVudDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRNZXRob2RzKHByb3RvLCBtZXRob2RzKSB7CiAgICBmb3IgKGxldCBpPTA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RzW2ldOwogICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICBwcm90b1ttZXRob2RdID0gLyoqIEB0aGlzIHtEb21BcGl9ICovIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5vZGVbbWV0aG9kXS5hcHBseSh0aGlzLm5vZGUsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICAgIC8qIGVzbGludC1lbmFibGUgKi8KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRSZWFkT25seVByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZm9yd2FyZFByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgLyoqIEB0eXBlIHtEb21BcGl9ICovICh0aGlzKS5ub2RlW25hbWVdID0gdmFsdWU7CiAgICAgICAgfSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfQoKICBmb3J3YXJkTWV0aG9kcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAnY2xvbmVOb2RlJywgJ2FwcGVuZENoaWxkJywgJ2luc2VydEJlZm9yZScsICdyZW1vdmVDaGlsZCcsCiAgICAncmVwbGFjZUNoaWxkJywgJ3NldEF0dHJpYnV0ZScsICdyZW1vdmVBdHRyaWJ1dGUnLAogICAgJ3F1ZXJ5U2VsZWN0b3InLCAncXVlcnlTZWxlY3RvckFsbCcKICBdKTsKCiAgZm9yd2FyZFJlYWRPbmx5UHJvcGVydGllcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAncGFyZW50Tm9kZScsICdmaXJzdENoaWxkJywgJ2xhc3RDaGlsZCcsCiAgICAnbmV4dFNpYmxpbmcnLCAncHJldmlvdXNTaWJsaW5nJywgJ2ZpcnN0RWxlbWVudENoaWxkJywKICAgICdsYXN0RWxlbWVudENoaWxkJywgJ25leHRFbGVtZW50U2libGluZycsICdwcmV2aW91c0VsZW1lbnRTaWJsaW5nJywKICAgICdjaGlsZE5vZGVzJywgJ2NoaWxkcmVuJywgJ2NsYXNzTGlzdCcKICBdKTsKCiAgZm9yd2FyZFByb3BlcnRpZXMoRG9tQXBpLnByb3RvdHlwZSwgWwogICAgJ3RleHRDb250ZW50JywgJ2lubmVySFRNTCcKICBdKTsKCgogIC8qKgogICAqIEV2ZW50IEFQSSB3cmFwcGVyIGNsYXNzIHJldHVybmVkIGZyb20gYFBvbHltZXIuZG9tLih0YXJnZXQpYCB3aGVuCiAgICogYHRhcmdldGAgaXMgYW4gYEV2ZW50YC4KICAgKi8KICBjbGFzcyBFdmVudEFwaSB7CiAgICBjb25zdHJ1Y3RvcihldmVudCkgewogICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9uIHRoZSBgY29tcG9zZWRQYXRoYCBvZiB0aGlzIGV2ZW50LgogICAgICoKICAgICAqIEByZXR1cm4geyFFdmVudFRhcmdldH0gVGhlIG5vZGUgdGhpcyBldmVudCB3YXMgZGlzcGF0Y2hlZCB0bwogICAgICovCiAgICBnZXQgcm9vdFRhcmdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY29tcG9zZWRQYXRoKClbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHshRXZlbnRUYXJnZXR9IFRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqLwogICAgZ2V0IGxvY2FsVGFyZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5ldmVudC50YXJnZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBgY29tcG9zZWRQYXRoYCBmb3IgdGhpcyBldmVudC4KICAgICAqIEByZXR1cm4geyFBcnJheTwhRXZlbnRUYXJnZXQ+fSBUaGUgbm9kZXMgdGhpcyBldmVudCBwcm9wYWdhdGVkIHRocm91Z2gKICAgICAqLwogICAgZ2V0IHBhdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgfQogIH0KCiAgUG9seW1lci5Eb21BcGkgPSBEb21BcGk7CgogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGRlZXAKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuY2xvbmVOb2RlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ7CiAgLyoqCiAgICogQGZ1bmN0aW9uCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcGFyYW0ge05vZGV9IHJlZkNoaWxkCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLmluc2VydEJlZm9yZTsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0geyFOb2RlfSBub2RlCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnJlbW92ZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG9sZENoaWxkCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVwbGFjZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuc2V0QXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4gez9FbGVtZW50fQogICAqLwogIFBvbHltZXIuRG9tQXBpLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4geyFOb2RlTGlzdDwhRWxlbWVudD59CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7CgogIC8qKgogICAqIExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8gYWJzdHJhY3QKICAgKiBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NIiB3aGVuIHBvbHlmaWxsaW5nIG9uCiAgICogb2xkZXIgYnJvd3NlcnMuCiAgICoKICAgKiBOb3RlIHRoYXQgaW4gUG9seW1lciAyLnggdXNlIG9mIGBQb2x5bWVyLmRvbWAgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZAogICAqIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcyBzaW1wbHkgZmFjYWRlcyBkaXJlY3RseSB0byB0aGUgc3RhbmRhcmQgbmF0aXZlCiAgICogQVBJLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBzdW1tYXJ5IExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8KICAgKiBhYnN0cmFjdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NLiIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KE5vZGV8RXZlbnQpPX0gb2JqIE5vZGUgb3IgZXZlbnQgdG8gb3BlcmF0ZSBvbgogICAqIEByZXR1cm4geyFEb21BcGl8IUV2ZW50QXBpfSBXcmFwcGVyIHByb3ZpZGluZyBlaXRoZXIgbm9kZSBBUEkgb3IgZXZlbnQgQVBJCiAgICovCiAgUG9seW1lci5kb20gPSBmdW5jdGlvbihvYmopIHsKICAgIG9iaiA9IG9iaiB8fCBkb2N1bWVudDsKICAgIGlmICghb2JqLl9fZG9tQXBpKSB7CiAgICAgIGxldCBoZWxwZXI7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFdmVudCkgewogICAgICAgIGhlbHBlciA9IG5ldyBFdmVudEFwaShvYmopOwogICAgICB9IGVsc2UgewogICAgICAgIGhlbHBlciA9IG5ldyBEb21BcGkob2JqKTsKICAgICAgfQogICAgICBvYmouX19kb21BcGkgPSBoZWxwZXI7CiAgICB9CiAgICByZXR1cm4gb2JqLl9fZG9tQXBpOwogIH07CgogIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvciA9IG1hdGNoZXNTZWxlY3RvcjsKCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYAogICAqIC0gU2hhZHlET00gZGlzdHJpYnV0aW9uCiAgICoKICAgKiBUaGlzIG1ldGhvZCBmYWNhZGVzIHRvIGBQb2x5bWVyLmZsdXNoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqLwogIFBvbHltZXIuZG9tLmZsdXNoID0gUG9seW1lci5mbHVzaDsKCiAgLyoqCiAgICogQWRkcyBhIGBQb2x5bWVyLkRlYm91bmNlcmAgdG8gYSBsaXN0IG9mIGdsb2JhbGx5IGZsdXNoYWJsZSB0YXNrcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGZhY2FkZXMgdG8gYFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcmAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lci5kb20KICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICovCiAgUG9seW1lci5kb20uYWRkRGVib3VuY2VyID0gUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc3R5bGVJbnRlcmZhY2UgPSB3aW5kb3cuU2hhZHlDU1M7CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBQb2x5bWVyJ3MgImxlZ2FjeSIgQVBJIGludGVuZGVkIHRvIGJlCiAgICogYmFja3dhcmQtY29tcGF0aWJsZSB0byB0aGUgZ3JlYXRlc3QgZXh0ZW50IHBvc3NpYmxlIHdpdGggdGhlIEFQSQogICAqIGZvdW5kIG9uIHRoZSBQb2x5bWVyIDEueCBgUG9seW1lci5CYXNlYCBwcm90b3R5cGUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMKICAgKiBkZWZpbmVkIHVzaW5nIHRoZSBgUG9seW1lcih7Li4ufSlgIGZ1bmN0aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5FbGVtZW50TWl4aW4KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzCiAgICogQHByb3BlcnR5IGlzQXR0YWNoZWQge2Jvb2xlYW59IFNldCB0byBgdHJ1ZWAgaW4gdGhpcyBlbGVtZW50J3MKICAgKiAgIGBjb25uZWN0ZWRDYWxsYmFja2AgYW5kIGBmYWxzZWAgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIFBvbHltZXIncyAibGVnYWN5IiBBUEkKICAgKi8KICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0VsZW1lbnRNaXhpbn0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0dlc3R1cmVFdmVudExpc3RlbmVyc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgbGVnYWN5RWxlbWVudEJhc2UgPSBQb2x5bWVyLkRpck1peGluKFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKFBvbHltZXIuRWxlbWVudE1peGluKGJhc2UpKSk7CgogICAgLyoqCiAgICAgKiBNYXAgb2Ygc2ltcGxlIG5hbWVzIHRvIHRvdWNoIGFjdGlvbiBuYW1lcwogICAgICogQGRpY3QKICAgICAqLwogICAgY29uc3QgRElSRUNUSU9OX01BUCA9IHsKICAgICAgJ3gnOiAncGFuLXgnLAogICAgICAneSc6ICdwYW4teScsCiAgICAgICdub25lJzogJ25vbmUnLAogICAgICAnYWxsJzogJ2F1dG8nCiAgICB9OwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAZXh0ZW5kcyB7bGVnYWN5RWxlbWVudEJhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9MZWdhY3lFbGVtZW50TWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIExlZ2FjeUVsZW1lbnQgZXh0ZW5kcyBsZWdhY3lFbGVtZW50QmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICB0aGlzLmlzQXR0YWNoZWQ7CiAgICAgICAgLyoqIEB0eXBlIHtXZWFrTWFwPCFFbGVtZW50LCAhT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPj59ICovCiAgICAgICAgdGhpcy5fX2JvdW5kTGlzdGVuZXJzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgRnVuY3Rpb24+fSAqLwogICAgICAgIHRoaXMuX2RlYm91bmNlcnM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBgaW1wb3J0TWV0YWAgZnJvbSB0aGUgcHJvdG90eXBlIChpLmUuIGZyb20gdGhlIGluZm8gb2JqZWN0CiAgICAgICAqIHBhc3NlZCB0byBgUG9seW1lcih7Li4ufSlgKSB0byB0aGUgc3RhdGljIEFQSS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IU9iamVjdH0gVGhlIGBpbXBvcnQubWV0YWAgb2JqZWN0IHNldCBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGB0aGlzYCBpcyBhbHdheXMgaW4gdGhlIGluc3RhbmNlIGluCiAgICAgICAqICBjbG9zdXJlIGZvciBzb21lIHJlYXNvbiBldmVuIGluIGEgc3RhdGljIG1ldGhvZCwgcmF0aGVyIHRoYW4gdGhlIGNsYXNzCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydE1ldGEoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmltcG9ydE1ldGE7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyB0aGUgYGNvbnN0cnVjdG9yYCwgZm9yIG92ZXJyaWRpbmcKICAgICAgICogYnkgdGhlIHVzZXIuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjcmVhdGVkKCkge30KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgY29ubmVjdGVkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgUG9seW1lciBsZWdhY3kgQVBJJ3MgYGF0dGFjaGVkYCBtZXRob2QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB0aGlzLmlzQXR0YWNoZWQgPSB0cnVlOwogICAgICAgIHRoaXMuYXR0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgYXR0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAgICogd2hpY2ggYWRkcyBQb2x5bWVyIGxlZ2FjeSBBUEkncyBgZGV0YWNoZWRgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIHRoaXMuaXNBdHRhY2hlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZGV0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGV0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIG92ZXJyaWRlIGltcGxlbWVudGF0aW9uIG9mIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgdGhlIFBvbHltZXIgbGVnYWN5IEFQSSdzIGBhdHRyaWJ1dGVDaGFuZ2VkYCBtZXRob2QuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBBdHRyaWJ1dGUgbmFtZXNwYWNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAob2xkICE9PSB2YWx1ZSkgewogICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWQobmFtZSwgb2xkLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogTGVnYWN5IGNhbGxiYWNrIGNhbGxlZCBkdXJpbmcgYGF0dHJpYnV0ZUNoYW5nZWRDaGFsbGJhY2tgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgQ3VycmVudCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkKG5hbWUsIG9sZCwgdmFsdWUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBpbXBsZW1lbnRhdGlvbiB0bwogICAgICAgKiBhZGQgc3VwcG9ydCBmb3IgY2xhc3MgaW5pdGlhbGl6YXRpb24gdmlhIHRoZSBgX3JlZ2lzdGVyZWRgIGNhbGxiYWNrLgogICAgICAgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBsZXQgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICAgICAgaWYgKCFwcm90by5oYXNPd25Qcm9wZXJ0eSgnX19oYXNSZWdpc3RlckZpbmlzaGVkJykpIHsKICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWQoKTsKICAgICAgICAgIC8vIGJhY2tzdG9wIGluIGNhc2UgdGhlIGBfcmVnaXN0ZXJlZGAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2V0IHRoaXMKICAgICAgICAgIHByb3RvLl9faGFzUmVnaXN0ZXJGaW5pc2hlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIHRoaXMucm9vdCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovKHRoaXMpOwogICAgICAgIHRoaXMuY3JlYXRlZCgpOwogICAgICAgIC8vIEVuc3VyZSBsaXN0ZW5lcnMgYXJlIGFwcGxpZWQgaW1tZWRpYXRlbHkgc28gdGhhdCB0aGV5IGFyZQogICAgICAgIC8vIGFkZGVkIGJlZm9yZSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMuIFRoaXMgYWxsb3dzIGFuIGVsZW1lbnQgdG8KICAgICAgICAvLyBkZWNvcmF0ZSBpdHNlbGYgdmlhIGFuIGV2ZW50IHByaW9yIHRvIGFueSBkZWNsYXJhdGl2ZSBsaXN0ZW5lcnMKICAgICAgICAvLyBzZWVpbmcgdGhlIGV2ZW50LiBOb3RlLCB0aGlzIGVuc3VyZXMgY29tcGF0aWJpbGl0eSB3aXRoIDEueCBvcmRlcmluZy4KICAgICAgICB0aGlzLl9hcHBseUxpc3RlbmVycygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBlbGVtZW50IGlzIGluaXRpYWxpemluZy4KICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gY2xhc3MgcmVnaXN0cmF0aW9uIHRpbWUKICAgICAgICogd29yay4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBlbnN1cmUgdGhlIHdvcmsgaXMgcGVyZm9ybWVkCiAgICAgICAqIG9ubHkgb25jZSBmb3IgdGhlIGNsYXNzLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVnaXN0ZXJlZCgpIHt9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgaW1wbGVtZW50YXRpb24gdG8KICAgICAgICogYWRkIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgYGhvc3RBdHRyaWJ1dGVzYCBhbmQgYGxpc3RlbmVyc2AuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgdGhpcy5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIGFuIGVsZW1lbnQgaGFzIHJlcXVpcmVkIGF0dHJpYnV0ZXMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0byBzZXQgdGhlCiAgICAgICAqIGVsZW1lbnQncyByZXF1aXJlZCBhdHRyaWJ1dGVzLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHN1cmUKICAgICAgICogdG8gY2hlY2sgYW5kIG5vdCBvdmVycmlkZSBleGlzdGluZyBhdHRyaWJ1dGVzIGFkZGVkIGJ5CiAgICAgICAqIHRoZSB1c2VyIG9mIHRoZSBlbGVtZW50LiBUeXBpY2FsbHksIHNldHRpbmcgYXR0cmlidXRlcyBzaG91bGQgYmUgbGVmdAogICAgICAgKiB0byB0aGUgZWxlbWVudCB1c2VyIGFuZCBub3QgZG9uZSBoZXJlOyByZWFzb25hYmxlIGV4Y2VwdGlvbnMgaW5jbHVkZQogICAgICAgKiBzZXR0aW5nIGFyaWEgcm9sZXMgYW5kIGZvY3VzYWJpbGl0eS4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2Vuc3VyZUF0dHJpYnV0ZXMoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgZWxlbWVudCBldmVudCBsaXN0ZW5lcnMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0bwogICAgICAgKiBhZGQgYW55IHJlcXVpcmVkIGVsZW1lbnQgZXZlbnQgbGlzdGVuZXJzLgogICAgICAgKiBJbiBwZXJmb3JtYW5jZSBjcml0aWNhbCBlbGVtZW50cywgdGhlIHdvcmsgZG9uZSBoZXJlIHNob3VsZCBiZSBrZXB0CiAgICAgICAqIHRvIGEgbWluaW11bSBzaW5jZSBpdCBpcyBkb25lIGJlZm9yZSB0aGUgZWxlbWVudCBpcyByZW5kZXJlZC4gSW4KICAgICAgICogdGhlc2UgZWxlbWVudHMsIGNvbnNpZGVyIGFkZGluZyBsaXN0ZW5lcnMgYXN5bmNocm9ub3VzbHkgc28gYXMgbm90IHRvCiAgICAgICAqIGJsb2NrIHJlbmRlci4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FwcGx5TGlzdGVuZXJzKCkge30KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLiBUbyBjdXN0b21pemUKICAgICAgICogaG93IHByb3BlcnRpZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYXR0cmlidXRlcyBmb3IgYXR0cmlidXRlIGJpbmRpbmdzIGFuZAogICAgICAgKiBgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlYCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgdGhpcyBtZXRob2QsIG92ZXJyaWRlCiAgICAgICAqIHRoZSBgX3NlcmlhbGl6ZVZhbHVlYCBtZXRob2QgcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU2VyaWFsaXplZCB2YWx1ZQogICAgICAgKi8KICAgICAgc2VyaWFsaXplKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuICBUbyBjdXN0b21pemUKICAgICAgICogaG93IGF0dHJpYnV0ZXMgYXJlIGRlc2VyaWFsaXplZCB0byBwcm9wZXJ0aWVzIGZvciBpbgogICAgICAgKiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCwgb3ZlcnJpZGUgYF9kZXNlcmlhbGl6ZVZhbHVlYCBtZXRob2QKICAgICAgICogcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgU3RyaW5nIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEBwYXJhbSB7Kn0gdHlwZSBUeXBlIHRvIGRlc2VyaWFsaXplIHRoZSBzdHJpbmcgdG8KICAgICAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgZGVzZXJpYWxpemVkIHZhbHVlIGluIHRoZSBgdHlwZWAgZ2l2ZW4uCiAgICAgICAqLwogICAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgdHlwZSkgewogICAgICAgIHJldHVybiB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0geyo9fSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byByZWZsZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVmbGVjdFByb3BlcnR5VG9BdHRyaWJ1dGUocHJvcGVydHksIGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICB0aGlzLl9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSB0eXBlZCB2YWx1ZSB0byBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBhIG5vZGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzZXJpYWxpemVWYWx1ZVRvQXR0cmlidXRlKHZhbHVlLCBhdHRyaWJ1dGUsIG5vZGUpIHsKICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpLCB2YWx1ZSwgYXR0cmlidXRlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvcGllcyBvd24gcHJvcGVydGllcyAoaW5jbHVkaW5nIGFjY2Vzc29yIGRlc2NyaXB0b3JzKSBmcm9tIGEgc291cmNlCiAgICAgICAqIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcGkgU291cmNlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS4KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBwcm90b3R5cGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudC4KICAgICAgICovCiAgICAgIGV4dGVuZChwcm90b3R5cGUsIGFwaSkgewogICAgICAgIGlmICghKHByb3RvdHlwZSAmJiBhcGkpKSB7CiAgICAgICAgICByZXR1cm4gcHJvdG90eXBlIHx8IGFwaTsKICAgICAgICB9CiAgICAgICAgbGV0IG4kID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXBpKTsKICAgICAgICBmb3IgKGxldCBpPTAsIG47IChpPG4kLmxlbmd0aCkgJiYgKG49biRbaV0pOyBpKyspIHsKICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXBpLCBuKTsKICAgICAgICAgIGlmIChwZCkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBuLCBwZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm90b3R5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb3BpZXMgcHJvcHMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSB0YXJnZXQgb2JqZWN0LgogICAgICAgKgogICAgICAgKiBOb3RlLCB0aGlzIG1ldGhvZCB1c2VzIGEgc2ltcGxlIGBmb3IuLi5pbmAgc3RyYXRlZ3kgZm9yIGVudW1lcmF0aW5nCiAgICAgICAqIHByb3BlcnRpZXMuICBUbyBlbnN1cmUgb25seSBgb3duUHJvcGVydGllc2AgYXJlIGNvcGllZCBmcm9tIHNvdXJjZQogICAgICAgKiB0byB0YXJnZXQgYW5kIHRoYXQgYWNjZXNzb3IgaW1wbGVtZW50YXRpb25zIGFyZSBjb3BpZWQsIHVzZSBgZXh0ZW5kYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshT2JqZWN0fSB0YXJnZXQgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gc291cmNlIFNvdXJjZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uCiAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IFRhcmdldCBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGFzIGZpcnN0IGFyZ3VtZW50LgogICAgICAgKi8KICAgICAgbWl4aW4odGFyZ2V0LCBzb3VyY2UpIHsKICAgICAgICBmb3IgKGxldCBpIGluIHNvdXJjZSkgewogICAgICAgICAgdGFyZ2V0W2ldID0gc291cmNlW2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgcHJvdG90eXBlIG9mIGFuIG9iamVjdC4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCBvbiB3aGljaCB0byBzZXQgdGhlIHByb3RvdHlwZS4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgcHJvdG90eXBlIHRoYXQgd2lsbCBiZSBzZXQgb24gdGhlIGdpdmVuCiAgICAgICAqIGBvYmplY3RgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdpdmVuIGBvYmplY3RgIHdpdGggaXRzIHByb3RvdHlwZSBzZXQKICAgICAgICogdG8gdGhlIGdpdmVuIGBwcm90b3R5cGVgIG9iamVjdC4KICAgICAgICovCiAgICAgIGNoYWluT2JqZWN0KG9iamVjdCwgcHJvdG90eXBlKSB7CiAgICAgICAgaWYgKG9iamVjdCAmJiBwcm90b3R5cGUgJiYgb2JqZWN0ICE9PSBwcm90b3R5cGUpIHsKICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gVGVtcGxhdGUgKioqKiAqLwoKICAgICAgLyoqCiAgICAgICAqIENhbGxzIGBpbXBvcnROb2RlYCBvbiB0aGUgYGNvbnRlbnRgIG9mIHRoZSBgdGVtcGxhdGVgIHNwZWNpZmllZCBhbmQKICAgICAgICogcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkIGNvbnRlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgSFRNTCB0ZW1wbGF0ZSBlbGVtZW50IHRvIGluc3RhbmNlLgogICAgICAgKiBAcmV0dXJuIHshRG9jdW1lbnRGcmFnbWVudH0gRG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyB0aGUgaW1wb3J0ZWQKICAgICAgICogICB0ZW1wbGF0ZSBjb250ZW50LgogICAgICAqLwogICAgICBpbnN0YW5jZVRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLmNvbnN0cnVjdG9yLl9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIGxldCBkb20gPSAvKiogQHR5cGUgeyFEb2N1bWVudEZyYWdtZW50fSAqLwogICAgICAgICAgKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gRXZlbnRzICoqKiogKi8KCgoKICAgICAgLyoqCiAgICAgICAqIERpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWwgdmFsdWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE5hbWUgb2YgZXZlbnQgdHlwZS4KICAgICAgICogQHBhcmFtIHsqPX0gZGV0YWlsIERldGFpbCB2YWx1ZSBjb250YWluaW5nIGV2ZW50LXNwZWNpZmljCiAgICAgICAqICAgcGF5bG9hZC4KICAgICAgICogQHBhcmFtIHt7IGJ1YmJsZXM6IChib29sZWFufHVuZGVmaW5lZCksIGNhbmNlbGFibGU6IChib29sZWFufHVuZGVmaW5lZCksIGNvbXBvc2VkOiAoYm9vbGVhbnx1bmRlZmluZWQpIH09fQogICAgICAgKiAgb3B0aW9ucyBPYmplY3Qgc3BlY2lmeWluZyBvcHRpb25zLiAgVGhlc2UgbWF5IGluY2x1ZGU6CiAgICAgICAqICBgYnViYmxlc2AgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGB0cnVlYCksCiAgICAgICAqICBgY2FuY2VsYWJsZWAgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGZhbHNlKSwgYW5kCiAgICAgICAqICBgbm9kZWAgb24gd2hpY2ggdG8gZmlyZSB0aGUgZXZlbnQgKEhUTUxFbGVtZW50LCBkZWZhdWx0cyB0byBgdGhpc2ApLgogICAgICAgKiBAcmV0dXJuIHshRXZlbnR9IFRoZSBuZXcgZXZlbnQgdGhhdCB3YXMgZmlyZWQuCiAgICAgICAqLwogICAgICBmaXJlKHR5cGUsIGRldGFpbCwgb3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIGRldGFpbCA9IChkZXRhaWwgPT09IG51bGwgfHwgZGV0YWlsID09PSB1bmRlZmluZWQpID8ge30gOiBkZXRhaWw7CiAgICAgICAgbGV0IGV2ZW50ID0gbmV3IEV2ZW50KHR5cGUsIHsKICAgICAgICAgIGJ1YmJsZXM6IG9wdGlvbnMuYnViYmxlcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuYnViYmxlcywKICAgICAgICAgIGNhbmNlbGFibGU6IEJvb2xlYW4ob3B0aW9ucy5jYW5jZWxhYmxlKSwKICAgICAgICAgIGNvbXBvc2VkOiBvcHRpb25zLmNvbXBvc2VkID09PSB1bmRlZmluZWQgPyB0cnVlOiBvcHRpb25zLmNvbXBvc2VkCiAgICAgICAgfSk7CiAgICAgICAgZXZlbnQuZGV0YWlsID0gZGV0YWlsOwogICAgICAgIGxldCBub2RlID0gb3B0aW9ucy5ub2RlIHx8IHRoaXM7CiAgICAgICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICByZXR1cm4gZXZlbnQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIGFuIGV2ZW50IGxpc3RlbmVyIG9uIGEgZ2l2ZW4gZWxlbWVudCwKICAgICAgICogbGF0ZSBib3VuZCB0byBhIG5hbWVkIG1ldGhvZCBvbiB0aGlzIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIGFkZCBldmVudCBsaXN0ZW5lciB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgaGFuZGxlciBtZXRob2Qgb24gYHRoaXNgIHRvIGNhbGwuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBsaXN0ZW4obm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgIGxldCBoYmwgPSB0aGlzLl9fYm91bmRMaXN0ZW5lcnMgfHwKICAgICAgICAgICh0aGlzLl9fYm91bmRMaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpKTsKICAgICAgICBsZXQgYmwgPSBoYmwuZ2V0KG5vZGUpOwogICAgICAgIGlmICghYmwpIHsKICAgICAgICAgIGJsID0ge307CiAgICAgICAgICBoYmwuc2V0KG5vZGUsIGJsKTsKICAgICAgICB9CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgaWYgKCFibFtrZXldKSB7CiAgICAgICAgICBibFtrZXldID0gdGhpcy5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZSgKICAgICAgICAgICAgbm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lLCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYSBnaXZlbiBlbGVtZW50LAogICAgICAgKiBsYXRlIGJvdW5kIHRvIGEgbmFtZWQgbWV0aG9kIG9uIHRoaXMgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIEVsZW1lbnQgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudCB0byBzdG9wIGxpc3RlbmluZyB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBoYW5kbGVyIG1ldGhvZCBvbiBgdGhpc2AgdG8gbm90IGNhbGwKICAgICAgIGFueW1vcmUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB1bmxpc3Rlbihub2RlLCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgbGV0IGJsID0gdGhpcy5fX2JvdW5kTGlzdGVuZXJzICYmIHRoaXMuX19ib3VuZExpc3RlbmVycy5nZXQobm9kZSk7CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBibCAmJiBibFtrZXldOwogICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICB0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIGJsW2tleV0gPSBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHNjcm9sbGluZyBiZWhhdmlvciB0byBhbGwgZGlyZWN0aW9uLCBvbmUgZGlyZWN0aW9uLCBvciBub25lLgogICAgICAgKgogICAgICAgKiBWYWxpZCBzY3JvbGwgZGlyZWN0aW9uczoKICAgICAgICogICAtICdhbGwnOiBzY3JvbGwgaW4gYW55IGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3gnOiBzY3JvbGwgb25seSBpbiB0aGUgJ3gnIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3knOiBzY3JvbGwgb25seSBpbiB0aGUgJ3knIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ25vbmUnOiBkaXNhYmxlIHNjcm9sbGluZyBmb3IgdGhpcyBub2RlCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBhbGxvdyBzY3JvbGxpbmcKICAgICAgICogRGVmYXVsdHMgdG8gYGFsbGAuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSBzY3JvbGwgZGlyZWN0aW9uIHNldHRpbmcuCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNldFNjcm9sbERpcmVjdGlvbihkaXJlY3Rpb24sIG5vZGUpIHsKICAgICAgICBQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyksIERJUkVDVElPTl9NQVBbZGlyZWN0aW9uXSB8fCAnYXV0bycpOwogICAgICB9CiAgICAgIC8qICoqKiogRW5kIEV2ZW50cyAqKioqICovCgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJ1biBgcXVlcnlTZWxlY3RvcmAgb24gdGhpcyBsb2NhbCBET00gc2NvcGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgYFBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcihzbGN0cilgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2xjdHIgU2VsZWN0b3IgdG8gcnVuIG9uIHRoaXMgbG9jYWwgRE9NIHNjb3BlCiAgICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IEVsZW1lbnQgZm91bmQgYnkgdGhlIHNlbGVjdG9yLCBvciBudWxsIGlmIG5vdCBmb3VuZC4KICAgICAgICovCiAgICAgICQkKHNsY3RyKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKHNsY3RyKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybiB0aGUgZWxlbWVudCB3aG9zZSBsb2NhbCBkb20gd2l0aGluIHdoaWNoIHRoaXMgZWxlbWVudAogICAgICAgKiBpcyBjb250YWluZWQuIFRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yCiAgICAgICAqIGB0aGlzLmdldFJvb3ROb2RlKCkuaG9zdGAuCiAgICAgICAqIEB0aGlzIHtFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0IGRvbUhvc3QoKSB7CiAgICAgICAgbGV0IHJvb3QgPSB0aGlzLmdldFJvb3ROb2RlKCk7CiAgICAgICAgcmV0dXJuIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkgPyAvKiogQHR5cGUge1NoYWRvd1Jvb3R9ICovIChyb290KS5ob3N0IDogcm9vdDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcmNlIHRoaXMgZWxlbWVudCB0byBkaXN0cmlidXRlIGl0cyBjaGlsZHJlbiB0byBpdHMgbG9jYWwgZG9tLgogICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGFzIG9mIFBvbHltZXIgMi4wLjIgYW5kIGlzIHByb3ZpZGVkIG9ubHkKICAgICAgICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGlzdHJpYnV0ZUNvbnRlbnQoKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLnNoYWRvd1Jvb3QpIHsKICAgICAgICAgIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZE5vZGVzLiBUaGUgZWZmZWN0aXZlCiAgICAgICAqIGNoaWxkTm9kZXMgbGlzdCBpcyB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCdzIGNoaWxkTm9kZXMgZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIG5vZGVzIGRpc3RyaWJ1dGVkCiAgICAgICAqIHRvIHRoZSBgPGNvbnRlbnQ+YCwgdGhlIHJlc3VsdCBvZiBpdHMgYGdldERpc3RyaWJ1dGVkTm9kZXNgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGQgbm9kZXMuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuIEhUTUxFbGVtZW50CiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICAgIGNvbnN0IHRoaXNFbCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKHRoaXMpOwogICAgICAgIGNvbnN0IGRvbUFwaSA9IC8qKiBAdHlwZSB7UG9seW1lci5Eb21BcGl9ICovKFBvbHltZXIuZG9tKHRoaXNFbCkpOwogICAgICAgIHJldHVybiBkb21BcGkuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgZGlzdHJpYnV0ZWQgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0IG1hdGNoCiAgICAgICAqIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGRyZW4gb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQgdG8KICAgICAgICogY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBkaXN0cmlidXRlZCBlbGVtZW50cyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gTGVnYWN5RWxlbWVudE1peGluIG11c3QgYmUgYXBwbGllZCB0byBhbiBIVE1MRWxlbWVudAogICAgICAgKi8KICAgICAgcXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKSB7CiAgICAgICAgY29uc3QgdGhpc0VsID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAodGhpcyk7CiAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20odGhpc0VsKSk7CiAgICAgICAgcmV0dXJuIGRvbUFwaS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZHJlbi4gVGhlIGVmZmVjdGl2ZQogICAgICAgKiBjaGlsZHJlbiBsaXN0IGlzIHRoZSBzYW1lIGFzIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4gZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIGVsZW1lbnRzCiAgICAgICAqIGRpc3RyaWJ1dGVkIHRvIHRoZSBgPGNvbnRlbnQ+YC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGRyZW4uCiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZHJlbigpIHsKICAgICAgICBsZXQgbGlzdCA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbigvKiogQHR5cGUgeyFOb2RlfSAqLyBuKSB7CiAgICAgICAgICByZXR1cm4gKG4ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgb2YgdGV4dCBjb250ZW50IHRoYXQgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlCiAgICAgICAqIHRleHQgY29udGVudCdzIG9mIHRoZSBlbGVtZW50J3MgZWZmZWN0aXZlIGNoaWxkTm9kZXMgKHRoZSBlbGVtZW50cwogICAgICAgKiByZXR1cm5lZCBieSA8YSBocmVmPSIjZ2V0RWZmZWN0aXZlQ2hpbGROb2Rlcz5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzPC9hPi4KICAgICAgICoKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZHJlbi4KICAgICAgICovCiAgICAgIGdldEVmZmVjdGl2ZVRleHRDb250ZW50KCkgewogICAgICAgIGxldCBjbiA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIGxldCB0YyA9IFtdOwogICAgICAgIGZvciAobGV0IGk9MCwgYzsgKGMgPSBjbltpXSk7IGkrKykgewogICAgICAgICAgaWYgKGMubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIHRjLnB1c2goYy50ZXh0Q29udGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0Yy5qb2luKCcnKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVmZmVjdGl2ZSBjaGlsZE5vZGUgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0CiAgICAgICAqIG1hdGNoIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGQgbm9kZXMgb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQKICAgICAgICogdG8gY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7Tm9kZX0gRmlyc3QgZWZmZWN0aXZlIGNoaWxkIG5vZGUgdGhhdCBtYXRjaGVzIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIGxldCBlJCA9IHRoaXMucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKTsKICAgICAgICByZXR1cm4gZSQgJiYgZSRbMF07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBlZmZlY3RpdmUgY2hpbGROb2RlcyB3aXRoaW4gdGhpcyBlbGVtZW50IHRoYXQKICAgICAgICogbWF0Y2ggYHNlbGVjdG9yYC4gVGhlc2UgY2FuIGJlIGRvbSBjaGlsZCBub2RlcyBvciBlbGVtZW50cyBkaXN0cmlidXRlZAogICAgICAgKiB0byBjaGlsZHJlbiB0aGF0IGFyZSBpbnNlcnRpb24gcG9pbnRzLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gcnVuLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZCBub2RlcyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlBbGxFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3Rvcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBub2RlcyBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzIGxvY2FsIERPTSwKICAgICAgICogYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQgY29udGVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBzbGN0ciBDU1Mgc2VsZWN0b3IgdG8gY2hvb3NlIHRoZSBkZXNpcmVkCiAgICAgICAqICAgYDxzbG90PmAuICBEZWZhdWx0cyB0byBgY29udGVudGAuCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZGlzdHJpYnV0ZWQgbm9kZXMgZm9yIHRoZSBgPHNsb3Q+YC4KICAgICAgICovCiAgICAgIGdldENvbnRlbnRDaGlsZE5vZGVzKHNsY3RyKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcihzbGN0ciB8fCAnc2xvdCcpOwogICAgICAgIHJldHVybiBjb250ZW50ID8gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20oY29udGVudCkpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSA6IFtdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudCBjaGlsZHJlbiBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncwogICAgICAgKiBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzCiAgICAgICAqIGxvY2FsIERPTSwgYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQKICAgICAgICogY29udGVudC4gIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgZ2V0Q29udGVudENoaWxkTm9kZXNgIGluIHRoYXQgb25seQogICAgICAgKiBlbGVtZW50cyBhcmUgcmV0dXJuZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2xjdHIgQ1NTIHNlbGVjdG9yIHRvIGNob29zZSB0aGUgZGVzaXJlZAogICAgICAgKiAgIGA8Y29udGVudD5gLiAgRGVmYXVsdHMgdG8gYGNvbnRlbnRgLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gTGlzdCBvZiBkaXN0cmlidXRlZCBub2RlcyBmb3IgdGhlCiAgICAgICAqICAgYDxzbG90PmAuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgZ2V0Q29udGVudENoaWxkcmVuKHNsY3RyKSB7CiAgICAgICAgbGV0IGNoaWxkcmVuID0gLyoqIEB0eXBlIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gKi8odGhpcy5nZXRDb250ZW50Q2hpbGROb2RlcyhzbGN0cikuZmlsdGVyKGZ1bmN0aW9uKG4pIHsKICAgICAgICAgIHJldHVybiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gY2hpbGRyZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IGlzIGluIHRoaXMgZWxlbWVudCdzIGxpZ2h0IERPTSB0cmVlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0gez9Ob2RlfSBub2RlIFRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbm9kZSBpcyBpbiB0aGlzIGVsZW1lbnQncyBsaWdodCBET00gdHJlZS4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGlzTGlnaHREZXNjZW5kYW50KG5vZGUpIHsKICAgICAgICBjb25zdCB0aGlzTm9kZSA9IC8qKiBAdHlwZSB7Tm9kZX0gKi8gKHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzTm9kZSAhPT0gbm9kZSAmJiB0aGlzTm9kZS5jb250YWlucyhub2RlKSAmJgogICAgICAgICAgdGhpc05vZGUuZ2V0Um9vdE5vZGUoKSA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBpbiB0aGlzIGVsZW1lbnQncyBsb2NhbCBET00gdHJlZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gbm9kZSBUaGUgZWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG5vZGUgaXMgaW4gdGhpcyBlbGVtZW50J3MgbG9jYWwgRE9NIHRyZWUuCiAgICAgICAqLwogICAgICBpc0xvY2FsRGVzY2VuZGFudChub2RlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdCA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTm8tb3AgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHNob3VsZCBub3cgYmUgaGFuZGxlZCBieQogICAgICAgKiBTaGFkeUNzcyBsaWJyYXJ5LgogICAgICAgKiBAcGFyYW0gIHsqfSBjb250YWluZXIgVW51c2VkCiAgICAgICAqIEBwYXJhbSAgeyp9IHNob3VsZE9ic2VydmUgVW51c2VkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzY29wZVN1YnRyZWUoY29udGFpbmVyLCBzaG91bGRPYnNlcnZlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGNvbXB1dGVkIHN0eWxlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgY3NzIHByb3BlcnR5IG5hbWUuCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgY29tcHV0ZWQgY3NzIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZ2l2ZW4KICAgICAgICogYHByb3BlcnR5YC4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGdldENvbXB1dGVkU3R5bGVWYWx1ZShwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiBzdHlsZUludGVyZmFjZS5nZXRDb21wdXRlZFN0eWxlVmFsdWUoLyoqIEB0eXBlIHshRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLy8gZGVib3VuY2UKCiAgICAgIC8qKgogICAgICAgKiBDYWxsIGBkZWJvdW5jZWAgdG8gY29sbGFwc2UgbXVsdGlwbGUgcmVxdWVzdHMgZm9yIGEgbmFtZWQgdGFzayBpbnRvCiAgICAgICAqIG9uZSBpbnZvY2F0aW9uIHdoaWNoIGlzIG1hZGUgYWZ0ZXIgdGhlIHdhaXQgdGltZSBoYXMgZWxhcHNlZCB3aXRoCiAgICAgICAqIG5vIG5ldyByZXF1ZXN0LiAgSWYgbm8gd2FpdCB0aW1lIGlzIGdpdmVuLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQKICAgICAgICogYXQgbWljcm90YXNrIHRpbWluZyAoZ3VhcmFudGVlZCBiZWZvcmUgcGFpbnQpLgogICAgICAgKgogICAgICAgKiAgICAgZGVib3VuY2VkQ2xpY2tBY3Rpb24oZSkgewogICAgICAgKiAgICAgICAvLyB3aWxsIG5vdCBjYWxsIGBwcm9jZXNzQ2xpY2tgIG1vcmUgdGhhbiBvbmNlIHBlciAxMDBtcwogICAgICAgKiAgICAgICB0aGlzLmRlYm91bmNlKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgKiAgICAgICAgdGhpcy5wcm9jZXNzQ2xpY2soKTsKICAgICAgICogICAgICAgfSAxMDApOwogICAgICAgKiAgICAgfQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBTdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGRlYm91bmNlIGpvYi4KICAgICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkICh3aXRoIGB0aGlzYAogICAgICAgKiAgIGNvbnRleHQpIHdoZW4gdGhlIHdhaXQgdGltZSBlbGFwc2VzLgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBPcHRpb25hbCB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzIChtcykgYWZ0ZXIgdGhlCiAgICAgICAqICAgbGFzdCBzaWduYWwgdGhhdCBtdXN0IGVsYXBzZSBiZWZvcmUgaW52b2tpbmcgYGNhbGxiYWNrYAogICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBSZXR1cm5zIGEgZGVib3VuY2VyIG9iamVjdCBvbiB3aGljaCBleGlzdHMgdGhlCiAgICAgICAqIGZvbGxvd2luZyBtZXRob2RzOiBgaXNBY3RpdmUoKWAgcmV0dXJucyB0cnVlIGlmIHRoZSBkZWJvdW5jZXIgaXMKICAgICAgICogYWN0aXZlOyBgY2FuY2VsKClgIGNhbmNlbHMgdGhlIGRlYm91bmNlciBpZiBpdCBpcyBhY3RpdmU7CiAgICAgICAqIGBmbHVzaCgpYCBpbW1lZGlhdGVseSBpbnZva2VzIHRoZSBkZWJvdW5jZWQgY2FsbGJhY2sgaWYgdGhlIGRlYm91bmNlcgogICAgICAgKiBpcyBhY3RpdmUuCiAgICAgICAqLwogICAgICBkZWJvdW5jZShqb2JOYW1lLCBjYWxsYmFjaywgd2FpdCkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgICAgdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXQogICAgICAgICAgICAsIHdhaXQgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LmFmdGVyKHdhaXQpIDogUG9seW1lci5Bc3luYy5taWNyb1Rhc2sKICAgICAgICAgICAgLCBjYWxsYmFjay5iaW5kKHRoaXMpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciBhIG5hbWVkIGRlYm91bmNlciBpcyBhY3RpdmUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZSAoaGFzIG5vdCB5ZXQgZmlyZWQpLgogICAgICAgKi8KICAgICAgaXNEZWJvdW5jZXJBY3RpdmUoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIHJldHVybiAhIShkZWJvdW5jZXIgJiYgZGVib3VuY2VyLmlzQWN0aXZlKCkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSW1tZWRpYXRlbHkgY2FsbHMgdGhlIGRlYm91bmNlciBgY2FsbGJhY2tgIGFuZCBpbmFjdGl2YXRlcyBpdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZmx1c2hEZWJvdW5jZXIoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIGlmIChkZWJvdW5jZXIpIHsKICAgICAgICAgIGRlYm91bmNlci5mbHVzaCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlci4gIFRoZSBgY2FsbGJhY2tgIHdpbGwgbm90IGJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsRGVib3VuY2VyKGpvYk5hbWUpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICBsZXQgZGVib3VuY2VyID0gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXTsKICAgICAgICBpZiAoZGVib3VuY2VyKSB7CiAgICAgICAgICBkZWJvdW5jZXIuY2FuY2VsKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUnVucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LgogICAgICAgKgogICAgICAgKiBCeSBkZWZhdWx0IChpZiBubyB3YWl0VGltZSBpcyBzcGVjaWZpZWQpLCBhc3luYyBjYWxsYmFja3MgYXJlIHJ1biBhdAogICAgICAgKiBtaWNyb3Rhc2sgdGltaW5nLCB3aGljaCB3aWxsIG9jY3VyIGJlZm9yZSBwYWludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4sIGJvdW5kIHRvIGB0aGlzYC4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSB3YWl0VGltZSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgdGhlCiAgICAgICAqICAgYGNhbGxiYWNrYC4gIElmIHVuc3BlY2lmaWVkIG9yIDAsIHRoZSBjYWxsYmFjayB3aWxsIGJlIHJ1biBhdCBtaWNyb3Rhc2sKICAgICAgICogICB0aW1pbmcgKGJlZm9yZSBwYWludCkuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHRoYXQgbWF5IGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBhc3luYyBqb2IuCiAgICAgICAqLwogICAgICBhc3luYyhjYWxsYmFjaywgd2FpdFRpbWUpIHsKICAgICAgICByZXR1cm4gd2FpdFRpbWUgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LnJ1bihjYWxsYmFjay5iaW5kKHRoaXMpLCB3YWl0VGltZSkgOgogICAgICAgICAgICB+UG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKGNhbGxiYWNrLmJpbmQodGhpcykpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhbiBhc3luYyBvcGVyYXRpb24gc3RhcnRlZCB3aXRoIGBhc3luY2AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gb3JpZ2luYWwgYGFzeW5jYCBjYWxsIHRvCiAgICAgICAqICAgY2FuY2VsLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsQXN5bmMoaGFuZGxlKSB7CiAgICAgICAgaGFuZGxlIDwgMCA/IFBvbHltZXIuQXN5bmMubWljcm9UYXNrLmNhbmNlbCh+aGFuZGxlKSA6CiAgICAgICAgICAgIFBvbHltZXIuQXN5bmMudGltZU91dC5jYW5jZWwoaGFuZGxlKTsKICAgICAgfQoKICAgICAgLy8gb3RoZXIKCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGVsZW1lbnQgYW5kIGNvbmZpZ3VyaW5nIGl0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIEhUTUwgZWxlbWVudCB0YWcgdG8gY3JlYXRlLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BzIE9iamVjdCBvZiBwcm9wZXJ0aWVzIHRvIGNvbmZpZ3VyZSBvbiB0aGUKICAgICAgICogICAgaW5zdGFuY2UuCiAgICAgICAqIEByZXR1cm4geyFFbGVtZW50fSBOZXdseSBjcmVhdGVkIGFuZCBjb25maWd1cmVkIGVsZW1lbnQuCiAgICAgICAqLwogICAgICBjcmVhdGUodGFnLCBwcm9wcykgewogICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICBpZiAoZWx0LnNldFByb3BlcnRpZXMpIHsKICAgICAgICAgICAgZWx0LnNldFByb3BlcnRpZXMocHJvcHMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgbiBpbiBwcm9wcykgewogICAgICAgICAgICAgIGVsdFtuXSA9IHByb3BzW25dOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGltcG9ydGluZyBhbiBIVE1MIGRvY3VtZW50IGltcGVyYXRpdmVseS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBgPGxpbmsgcmVsPSJpbXBvcnQiPmAgZWxlbWVudCB3aXRoCiAgICAgICAqIHRoZSBwcm92aWRlZCBVUkwgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGRvY3VtZW50IHRvIHN0YXJ0IGxvYWRpbmcuCiAgICAgICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgICAgICogZWxlbWVudCB3aWxsIGNvbnRhaW4gdGhlIGltcG9ydGVkIGRvY3VtZW50IGNvbnRlbnRzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBVUkwgdG8gZG9jdW1lbnQgdG8gbG9hZC4KICAgICAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUV2ZW50KTp2b2lkPX0gb25sb2FkIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydCBzdWNjZXNzZnVsbHkKICAgICAgICogICBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFcnJvckV2ZW50KTp2b2lkPX0gb25lcnJvciBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQKICAgICAgICogICB1bnN1Y2Nlc3NmdWxseSBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICAgICAqICAgRGVmYXVsdHMgdG8gYGZhbHNlYC4KICAgICAgICogQHJldHVybiB7IUhUTUxMaW5rRWxlbWVudH0gVGhlIGxpbmsgZWxlbWVudCBmb3IgdGhlIFVSTCB0byBiZSBsb2FkZWQuCiAgICAgICAqLwogICAgICBpbXBvcnRIcmVmKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIGxldCBsb2FkRm4gPSBvbmxvYWQgPyBvbmxvYWQuYmluZCh0aGlzKSA6IG51bGw7CiAgICAgICAgbGV0IGVycm9yRm4gPSBvbmVycm9yID8gb25lcnJvci5iaW5kKHRoaXMpIDogbnVsbDsKICAgICAgICByZXR1cm4gUG9seW1lci5pbXBvcnRIcmVmKGhyZWYsIGxvYWRGbiwgZXJyb3JGbiwgb3B0QXN5bmMpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUG9seWZpbGwgZm9yIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMsIHdoaWNoIGlzIHNvbWV0aW1lcyBzdGlsbAogICAgICAgKiBwcmVmaXhlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHRlc3QuCiAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnQ9fSBub2RlIEVsZW1lbnQgdG8gdGVzdCB0aGUgc2VsZWN0b3IgYWdhaW5zdC4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4KICAgICAgICovCiAgICAgIGVsZW1lbnRNYXRjaGVzKHNlbGVjdG9yLCBub2RlKSB7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvcigvKiogQHR5cGUgeyFFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKSwgc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEhUTUwgYXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gYm9vbCBCb29sZWFuIHRvIGZvcmNlIHRoZSBhdHRyaWJ1dGUgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHJldmVyc2VkLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIE5vZGUgdG8gdGFyZ2V0LiAgRGVmYXVsdHMgdG8gYHRoaXNgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdG9nZ2xlQXR0cmlidXRlKG5hbWUsIGJvb2wsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBib29sID0gIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpOwogICAgICAgIH0KICAgICAgICBpZiAoYm9vbCkgewogICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICB9CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhIENTUyBjbGFzcyBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBjbGFzcyBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGJvb2wgQm9vbGVhbiB0byBmb3JjZSB0aGUgY2xhc3Mgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgcmV2ZXJzZWQuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgTm9kZSB0byB0YXJnZXQuICBEZWZhdWx0cyB0byBgdGhpc2AuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0b2dnbGVDbGFzcyhuYW1lLCBib29sLCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgICAgYm9vbCA9ICFub2RlLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJvb2wpIHsKICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKG5hbWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3Igc2V0dGluZyBhbiBlbGVtZW50J3MgQ1NTIGB0cmFuc2Zvcm1gIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNmb3JtVGV4dCBUcmFuc2Zvcm0gc2V0dGluZy4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdHJhbnNmb3JtKHRyYW5zZm9ybVRleHQsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBub2RlLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybVRleHQ7CiAgICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZXh0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBzZXR0aW5nIGFuIGVsZW1lbnQncyBDU1MgYHRyYW5zbGF0ZTNkYAogICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHggWCBvZmZzZXQuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFkgb2Zmc2V0LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0geiBaIG9mZnNldC4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRyYW5zbGF0ZTNkKHgsIHksIHosIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICB0aGlzLnRyYW5zZm9ybSgndHJhbnNsYXRlM2QoJyArIHggKyAnLCcgKyB5ICsgJywnICsgeiArICcpJywgbm9kZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSBhbiBhcnJheSwgaWYgaXQgZXhpc3RzLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgc3BlY2lmaWVkIGJ5IHBhdGgsIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcwogICAgICAgKiBnZW5lcmF0ZWQsIHNvIHRoYXQgb2JzZXJ2ZXJzLCBkYXRhIGJpbmRpbmdzIGFuZCBjb21wdXRlZAogICAgICAgKiBwcm9wZXJ0aWVzIHdhdGNoaW5nIHRoYXQgcGF0aCBjYW4gdXBkYXRlLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgcGFzc2VkIGRpcmVjdGx5LCAqKm5vIGNoYW5nZQogICAgICAgKiBub3RpZmljYXRpb24gaXMgZ2VuZXJhdGVkKiouCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PG51bWJlcnxzdHJpbmc+fSBhcnJheU9yUGF0aCBQYXRoIHRvIGFycmF5IGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBpdGVtCiAgICAgICAqICAgKG9yIHRoZSBhcnJheSBpdHNlbGYpLgogICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSB0byByZW1vdmUuCiAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIGl0ZW0gcmVtb3ZlZC4KICAgICAgICovCiAgICAgIGFycmF5RGVsZXRlKGFycmF5T3JQYXRoLCBpdGVtKSB7CiAgICAgICAgbGV0IGluZGV4OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5T3JQYXRoKSkgewogICAgICAgICAgaW5kZXggPSBhcnJheU9yUGF0aC5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5T3JQYXRoLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxldCBhcnIgPSBQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIGFycmF5T3JQYXRoKTsKICAgICAgICAgIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpY2UoYXJyYXlPclBhdGgsIGluZGV4LCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIC8vIGxvZ2dpbmcKCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLmxvZ2AvYHdhcm5gL2BlcnJvcmAgYXMgb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbCBPbmUgb2YgJ2xvZycsICd3YXJuJywgJ2Vycm9yJwogICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2dnZXIobGV2ZWwsIGFyZ3MpIHsKICAgICAgICAvLyBhY2NlcHQgWydmb28nLCAnYmFyJ10gYW5kIFtbJ2ZvbycsICdiYXInXV0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7CiAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoKGxldmVsKSB7CiAgICAgICAgICBjYXNlICdsb2cnOgogICAgICAgICAgY2FzZSAnd2Fybic6CiAgICAgICAgICBjYXNlICdlcnJvcic6CiAgICAgICAgICAgIGNvbnNvbGVbbGV2ZWxdKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZhY2FkZXMgYGNvbnNvbGUubG9nYCBhcyBhbiBvdmVycmlkZSBwb2ludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2coLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignbG9nJywgYXJncyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLndhcm5gIGFzIGFuIG92ZXJyaWRlIHBvaW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3dhcm4oLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignd2FybicsIGFyZ3MpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmFjYWRlcyBgY29uc29sZS5lcnJvcmAgYXMgYW4gb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZXJyb3IoLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignZXJyb3InLCBhcmdzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcm1hdHMgYSBtZXNzYWdlIHVzaW5nIHRoZSBlbGVtZW50IHR5cGUgYW4gYSBtZXRob2QgbmFtZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gYXNzb2NpYXRlIHdpdGggbWVzc2FnZQogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgd2l0aCBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGZvciBgY29uc29sZWAKICAgICAgICogICBsb2dnaW5nLgogICAgICAgKi8KICAgICAgX2xvZ2YobWV0aG9kTmFtZSwgLi4uYXJncykgewogICAgICAgIHJldHVybiBbJ1slczo6JXNdJywgdGhpcy5pcywgbWV0aG9kTmFtZSwgLi4uYXJnc107CiAgICAgIH0KCiAgICB9CgogICAgTGVnYWN5RWxlbWVudC5wcm90b3R5cGUuaXMgPSAnJzsKCiAgICByZXR1cm4gTGVnYWN5RWxlbWVudDsKCiAgfSk7Cgp9KSgpOwoKCgogIChmdW5jdGlvbigpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgY29uc3QgbGlmZWN5Y2xlUHJvcHMgPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBsaXN0ZW5lcnM6IHRydWUsCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB0cnVlCiAgICB9OwoKICAgIGNvbnN0IGV4Y2x1ZGVPbkluZm8gPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBiZWhhdmlvcnM6IHRydWUsCiAgICAgIF9ub0FjY2Vzc29yczogdHJ1ZQogICAgfTsKCiAgICBjb25zdCBleGNsdWRlT25CZWhhdmlvcnMgPSBPYmplY3QuYXNzaWduKHsKICAgICAgbGlzdGVuZXJzOiB0cnVlLAogICAgICBob3N0QXR0cmlidXRlczogdHJ1ZSwKICAgICAgcHJvcGVydGllczogdHJ1ZSwKICAgICAgb2JzZXJ2ZXJzOiB0cnVlLAogICAgfSwgZXhjbHVkZU9uSW5mbyk7CgogICAgZnVuY3Rpb24gY29weVByb3BlcnRpZXMoc291cmNlLCB0YXJnZXQsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb25zdCBub0FjY2Vzc29ycyA9IHNvdXJjZS5fbm9BY2Nlc3NvcnM7CiAgICAgIGZvciAobGV0IHAgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKCEocCBpbiBleGNsdWRlUHJvcHMpKSB7CiAgICAgICAgICBpZiAobm9BY2Nlc3NvcnMpIHsKICAgICAgICAgICAgdGFyZ2V0W3BdID0gc291cmNlW3BdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHApOwogICAgICAgICAgICBpZiAocGQpIHsKICAgICAgICAgICAgICAvLyBlbnN1cmUgcHJvcGVydHkgaXMgY29uZmlndXJhYmxlIHNvIHRoYXQgYSBsYXRlciBiZWhhdmlvciBjYW4KICAgICAgICAgICAgICAvLyByZS1jb25maWd1cmUgaXQuCiAgICAgICAgICAgICAgcGQuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwLCBwZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFwcGxpZXMgYSAibGVnYWN5IiBiZWhhdmlvciBvciBhcnJheSBvZiBiZWhhdmlvcnMgdG8gdGhlIHByb3ZpZGVkIGNsYXNzLgogICAgICoKICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBhbHNvIGFwcGx5IHRoZSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gCiAgICAgKiB0byBlbnN1cmUgdGhhdCBhbnkgbGVnYWN5IGJlaGF2aW9ycyBjYW4gcmVseSBvbiBsZWdhY3kgUG9seW1lciBBUEkgb24KICAgICAqIHRoZSB1bmRlcmx5aW5nIGVsZW1lbnQuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7IU9iamVjdHwhQXJyYXk8IU9iamVjdD59IGJlaGF2aW9ycyBCZWhhdmlvciBvYmplY3Qgb3IgYXJyYXkgb2YgYmVoYXZpb3JzLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IGtsYXNzIEVsZW1lbnQgY2xhc3MuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IFJldHVybnMgYSBuZXcgRWxlbWVudCBjbGFzcyBleHRlbmRlZCBieSB0aGUKICAgICAqIHBhc3NlZCBpbiBgYmVoYXZpb3JzYCBhbmQgYWxzbyBieSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gLgogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICBmdW5jdGlvbiBtaXhpbkJlaGF2aW9ycyhiZWhhdmlvcnMsIGtsYXNzKSB7CiAgICAgIHJldHVybiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oe30sIFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKGtsYXNzKSwgYmVoYXZpb3JzKTsKICAgIH0KCiAgICAvLyBOT1RFOgogICAgLy8gMS54CiAgICAvLyBCZWhhdmlvcnMgd2VyZSBtaXhlZCBpbiAqaW4gcmV2ZXJzZSBvcmRlciogYW5kIGRlLWR1cGVkIG9uIHRoZSBmbHkuCiAgICAvLyBUaGUgcnVsZSB3YXMgdGhhdCBiZWhhdmlvciBwcm9wZXJ0aWVzIHdlcmUgY29waWVkIG9udG8gdGhlIGVsZW1lbnQKICAgIC8vIHByb3RvdHlwZSBpZiBhbmQgb25seSBpZiB0aGUgcHJvcGVydHkgZGlkIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgLy8gR2l2ZW46IFBvbHltZXJ7IGJlaGF2aW9yczogW0EsIEIsIEMsIEEsIEJdfSwgcHJvcGVydHkgY29weSBvcmRlciB3YXM6CiAgICAvLyAoMSksIEIsICgyKSwgQSwgKDMpIEMuIFRoaXMgbWVhbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgd2luIG92ZXIKICAgIC8vIEIgcHJvcGVydGllcyB3aW4gb3ZlciBBIHdpbiBvdmVyIEMuIFRoaXMgbWlycm9ycyB3aGF0IHdvdWxkIGhhcHBlbgogICAgLy8gd2l0aCBpbmhlcml0YW5jZSBpZiBlbGVtZW50IGV4dGVuZGVkIEIgZXh0ZW5kZWQgQSBleHRlbmRlZCBDLgogICAgLy8KICAgIC8vIEFnYWluIGdpdmVuLCBQb2x5bWVyeyBiZWhhdmlvcnM6IFtBLCBCLCBDLCBBLCBCXX0sIHRoZSByZXN1bHRpbmcKICAgIC8vIGBiZWhhdmlvcnNgIGFycmF5IHdhcyBbQywgQSwgQl0uCiAgICAvLyBCZWhhdmlvciBsaWZlY3ljbGUgbWV0aG9kcyB3ZXJlIGNhbGxlZCBpbiBiZWhhdmlvciBhcnJheSBvcmRlcgogICAgLy8gZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnQsIGUuZy4gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwKICAgIC8vICgzKSBCLmNyZWF0ZWQsICg0KSBlbGVtZW50LmNyZWF0ZWQuIFRoZXJlIHdhcyBubyBzdXBwb3J0IGZvcgogICAgLy8gc3VwZXIsIGFuZCAic3VwZXItYmVoYXZpb3IiIG1ldGhvZHMgd2VyZSBjYWxsYWJsZSBvbmx5IGJ5IG5hbWUpLgogICAgLy8KICAgIC8vIDIueAogICAgLy8gQmVoYXZpb3JzIGFyZSBtYWRlIGludG8gcHJvcGVyIG1peGlucyB3aGljaCBsaXZlIGluIHRoZQogICAgLy8gZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi4gQmVoYXZpb3JzIGFyZSBwbGFjZWQgaW4gdGhlIGVsZW1lbnQgcHJvdG90eXBlCiAgICAvLyBlbGRlc3QgdG8geW91bmdlc3QgYW5kIGRlLWR1cGVkIHlvdW5nZXN0IHRvIG9sZGVzdDoKICAgIC8vIFNvLCBmaXJzdCBbQSwgQiwgQywgQSwgQl0gYmVjb21lcyBbQywgQSwgQl0gdGhlbiwKICAgIC8vIHRoZSBlbGVtZW50IHByb3RvdHlwZSBiZWNvbWVzIChvbGRlc3QpICgxKSBQb2x5bWVyLkVsZW1lbnQsICgyKSBjbGFzcyhDKSwKICAgIC8vICgzKSBjbGFzcyhBKSwgKDQpIGNsYXNzKEIpLCAoNSkgY2xhc3MoUG9seW1lcih7Li4ufSkpLgogICAgLy8gUmVzdWx0OgogICAgLy8gVGhpcyBtZWFucyBlbGVtZW50IHByb3BlcnRpZXMgd2luIG92ZXIgQiBwcm9wZXJ0aWVzIHdpbiBvdmVyIEEgd2luCiAgICAvLyBvdmVyIEMuIChzYW1lIGFzIDEueCkKICAgIC8vIElmIGxpZmVjeWNsZSBpcyBjYWxsZWQgKHN1cGVyIHRoZW4gbWUpLCBvcmRlciBpcwogICAgLy8gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwgKDMpIEIuY3JlYXRlZCwgKDQpIGVsZW1lbnQuY3JlYXRlZAogICAgLy8gKGFnYWluIHNhbWUgYXMgMS54KQogICAgZnVuY3Rpb24gYXBwbHlCZWhhdmlvcnMocHJvdG8sIGJlaGF2aW9ycywgbGlmZWN5Y2xlKSB7CiAgICAgIGZvciAobGV0IGk9MDsgaTxiZWhhdmlvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcHBseUluZm8ocHJvdG8sIGJlaGF2aW9yc1tpXSwgbGlmZWN5Y2xlLCBleGNsdWRlT25CZWhhdmlvcnMpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlJbmZvKHByb3RvLCBpbmZvLCBsaWZlY3ljbGUsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb3B5UHJvcGVydGllcyhpbmZvLCBwcm90bywgZXhjbHVkZVByb3BzKTsKICAgICAgZm9yIChsZXQgcCBpbiBsaWZlY3ljbGVQcm9wcykgewogICAgICAgIGlmIChpbmZvW3BdKSB7CiAgICAgICAgICBsaWZlY3ljbGVbcF0gPSBsaWZlY3ljbGVbcF0gfHwgW107CiAgICAgICAgICBsaWZlY3ljbGVbcF0ucHVzaChpbmZvW3BdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXl9IGJlaGF2aW9ycyBMaXN0IG9mIGJlaGF2aW9ycyB0byBmbGF0dGVuLgogICAgICogQHBhcmFtIHtBcnJheT19IGxpc3QgVGFyZ2V0IGxpc3QgdG8gZmxhdHRlbiBiZWhhdmlvcnMgaW50by4KICAgICAqIEBwYXJhbSB7QXJyYXk9fSBleGNsdWRlIExpc3Qgb2YgYmVoYXZpb3JzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgbGlzdC4KICAgICAqIEByZXR1cm4geyFBcnJheX0gUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgYmVoYXZpb3JzLgogICAgICovCiAgICBmdW5jdGlvbiBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbGlzdCwgZXhjbHVkZSkgewogICAgICBsaXN0ID0gbGlzdCB8fCBbXTsKICAgICAgZm9yIChsZXQgaT1iZWhhdmlvcnMubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgbGV0IGIgPSBiZWhhdmlvcnNbaV07CiAgICAgICAgaWYgKGIpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGIpKSB7CiAgICAgICAgICAgIGZsYXR0ZW5CZWhhdmlvcnMoYiwgbGlzdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBkZWR1cAogICAgICAgICAgICBpZiAobGlzdC5pbmRleE9mKGIpIDwgMCAmJiAoIWV4Y2x1ZGUgfHwgZXhjbHVkZS5pbmRleE9mKGIpIDwgMCkpIHsKICAgICAgICAgICAgICBsaXN0LnVuc2hpZnQoYik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS53YXJuKCdiZWhhdmlvciBpcyBudWxsLCBjaGVjayBmb3IgbWlzc2luZyBvciA0MDQgaW1wb3J0Jyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qIE5vdGUgYWJvdXQgY29uc3RydWN0aW9uIGFuZCBleHRlbnNpb24gb2YgbGVnYWN5IGNsYXNzZXMuCiAgICAgIFtDaGFuZ2VkIGluIFE0IDIwMTggdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuXQoKICAgICAgV2hlbiBjYWxsaW5nIGBQb2x5bWVyYCBvciBgbWl4aW5CZWhhdmlvcnNgLCB0aGUgZ2VuZXJhdGVkIGNsYXNzIGJlbG93IGlzCiAgICAgIG1hZGUuIFRoZSBsaXN0IG9mIGJlaGF2aW9ycyB3YXMgcHJldmlvdXNseSBtYWRlIGludG8gb25lIGdlbmVyYXRlZCBjbGFzcyBwZXIKICAgICAgYmVoYXZpb3IsIGJ1dCB0aGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZSBhcyBiZWhhdmlvcnMgYXJlIG5vdyBjYWxsZWQKICAgICAgbWFudWFsbHkuIE5vdGUsIHRoZXJlIG1heSAqc3RpbGwqIGJlIG11bHRpcGxlIGdlbmVyYXRlZCBjbGFzc2VzIGluIHRoZQogICAgICBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluIGlmIGV4dGVuc2lvbiBpcyB1c2VkIHdpdGggYG1peGluQmVoYXZpb3JzYC4KCiAgICAgIFRoZSBnZW5lcmF0ZWQgY2xhc3MgaXMgZGlyZWN0bHkgdGllZCB0byB0aGUgaW5mbyBvYmplY3QgYW5kIGJlaGF2aW9ycwogICAgICB1c2VkIHRvIGNyZWF0ZSBpdC4gVGhhdCBsaXN0IG9mIGJlaGF2aW9ycyBpcyBmaWx0ZXJlZCBzbyBpdCdzIG9ubHkgdGhlCiAgICAgIGJlaGF2aW9ycyBub3QgYWN0aXZlIG9uIHRoZSBzdXBlcmNsYXNzLiBJbiBvcmRlciB0byBjYWxsIHRocm91Z2ggdG8gdGhlCiAgICAgIGVudGlyZSBsaXN0IG9mIGxpZmVjeWNsZSBtZXRob2RzLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlcmAuCgogICAgICBUaGUgZWxlbWVudCdzIGBwcm9wZXJ0aWVzYCBhbmQgYG9ic2VydmVyc2AgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZSBmaW5hbGl6YXRpb24KICAgICAgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5IGBQcm9wZXJ0aWVzTWl4aW5gLiBgUHJvcGVydGllc2AgYW5kIGBvYnNlcnZlcnNgIGFyZQogICAgICBjb2xsZWN0ZWQgYnkgbWFudWFsbHkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluIGFuZCBtZXJnaW5nLgoKICAgICAgVG8gbGltaXQgY2hhbmdlcywgdGhlIGBfcmVnaXN0ZXJlZGAgbWV0aG9kIGlzIGNhbGxlZCB2aWEgYF9pbml0aWFsaXplUHJvcGVydGllc2AKICAgICAgYW5kIG5vdCBgX2ZpbmFsaXplQ2xhc3NgLgogICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUG9seW1lciBpbmZvIG9iamVjdAogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6SFRNTEVsZW1lbnQpfSBCYXNlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kIHdpdGggaW5mbyBvYmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBiZWhhdmlvcnMgYmVoYXZpb3JzIHRvIGNvcHkgaW50byB0aGUgZWxlbWVudAogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oaW5mbywgQmFzZSwgYmVoYXZpb3JzKSB7CgogICAgICAvLyBtYW5hZ2VzIGJlaGF2aW9yIGFuZCBsaWZlY3ljbGUgcHJvY2Vzc2luZyAoZmlsbGVkIGluIGFmdGVyIGNsYXNzIGRlZmluaXRpb24pCiAgICAgIGxldCBiZWhhdmlvckxpc3Q7CiAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IHt9OwoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGNsYXNzIFBvbHltZXJHZW5lcmF0ZWQgZXh0ZW5kcyBCYXNlIHsKCiAgICAgICAgLy8gZXhwbGljaXRseSBub3QgY2FsbGluZyBzdXBlci5fZmluYWxpemVDbGFzcwogICAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICAgIC8vIGlmIGNhbGxpbmcgdmlhIGEgc3ViY2xhc3MgdGhhdCBoYXNuJ3QgYmVlbiBnZW5lcmF0ZWQsIHBhc3MgdGhyb3VnaCB0byBzdXBlcgogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHdpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdnZW5lcmF0ZWRGcm9tJywgdGhpcykpKSB7CiAgICAgICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBpbnRlcmxlYXZlIHByb3BlcnRpZXMgYW5kIG9ic2VydmVycyBwZXIgYmVoYXZpb3IgYW5kIGBpbmZvYAogICAgICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBiID0gYmVoYXZpb3JMaXN0W2ldOwogICAgICAgICAgICAgICAgaWYgKGIucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMoYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChiLm9ic2VydmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9ic2VydmVycyhiLm9ic2VydmVycywgYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluZm8ucHJvcGVydGllcykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydGllcyhpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmZvLm9ic2VydmVycykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKGluZm8ub2JzZXJ2ZXJzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBwcmVwYXJlIHRoZSBlbGVtZW50IHRlbXBsYXRlCiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogICAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBiZWhhdmlvckxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIGJlaGF2aW9yTGlzdFtpXS5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgICAgIGxldCBvYnNlcnZlcnMgPSBbXTsKICAgICAgICAgIGlmIChiZWhhdmlvckxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgYiA9IGJlaGF2aW9yTGlzdFtpXTsKICAgICAgICAgICAgICBpZiAoYi5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoYi5vYnNlcnZlcnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGluZm8ub2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoaW5mby5vYnNlcnZlcnMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9ic2VydmVyczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlZCgpIHsKICAgICAgICAgIHN1cGVyLmNyZWF0ZWQoKTsKICAgICAgICAgIGNvbnN0IGxpc3QgPSBsaWZlY3ljbGUuY3JlYXRlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX3JlZ2lzdGVyZWQoKSB7CiAgICAgICAgICAvKiBOT1RFOiBgYmVmb3JlUmVnaXN0ZXJgIGlzIGNhbGxlZCBoZXJlIGZvciBiYywgYnV0IHRoZSBiZWhhdmlvcgogICAgICAgICAgICBpcyBkaWZmZXJlbnQgdGhhbiBpbiAxLnguIEluIDEuMCwgdGhlIG1ldGhvZCB3YXMgY2FsbGVkICphZnRlcioKICAgICAgICAgICAgbWl4aW5nIHByb3RvdHlwZXMgdG9nZXRoZXIgYnV0ICpiZWZvcmUqIHByb2Nlc3Npbmcgb2YgbWV0YS1vYmplY3RzLgogICAgICAgICAgICBIb3dldmVyLCBkeW5hbWljIGVmZmVjdHMgY2FuIHN0aWxsIGJlIHNldCBoZXJlIGFuZCBjYW4gYmUgZG9uZSBlaXRoZXIKICAgICAgICAgICAgaW4gYGJlZm9yZVJlZ2lzdGVyYCBvciBgcmVnaXN0ZXJlZGAuIEl0IGlzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBzZXQKICAgICAgICAgICAgYGlzYCBpbiBgYmVmb3JlUmVnaXN0ZXJgIGFzIHlvdSBjb3VsZCBpbiAxLnguCiAgICAgICAgICAqLwogICAgICAgICAgLy8gb25seSBwcm9jZWVkIGlmIHRoZSBnZW5lcmF0ZWQgY2xhc3MnIHByb3RvdHlwZSBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZC4KICAgICAgICAgIGNvbnN0IGdlbmVyYXRlZFByb3RvID0gUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGU7CiAgICAgICAgICBpZiAoIWdlbmVyYXRlZFByb3RvLmhhc093blByb3BlcnR5KCdfX2hhc1JlZ2lzdGVyRmluaXNoZWQnKSkgewogICAgICAgICAgICBnZW5lcmF0ZWRQcm90by5fX2hhc1JlZ2lzdGVyRmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAvLyBlbnN1cmUgc3VwZXJjbGFzcyBpcyByZWdpc3RlcmVkIGZpcnN0LgogICAgICAgICAgICBzdXBlci5fcmVnaXN0ZXJlZCgpOwogICAgICAgICAgICAvLyBjb3B5IHByb3BlcnRpZXMgb250byB0aGUgZ2VuZXJhdGVkIGNsYXNzIGxhemlseSBpZiB3ZSdyZSBvcHRpbWl6aW5nLAogICAgICAgICAgICBpZiAoUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICAgY29weVByb3BlcnRpZXNUb1Byb3RvKGdlbmVyYXRlZFByb3RvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBtYWtlIHN1cmUgbGVnYWN5IGxpZmVjeWNsZSBpcyBjYWxsZWQgb24gdGhlICplbGVtZW50KidzIHByb3RvdHlwZQogICAgICAgICAgICAvLyBhbmQgbm90IHRoZSBnZW5lcmF0ZWQgY2xhc3MgcHJvdG90eXBlOyBpZiB0aGUgZWxlbWVudCBoYXMgYmVlbgogICAgICAgICAgICAvLyBleHRlbmRlZCwgdGhlc2UgYXJlICpub3QqIHRoZSBzYW1lLgogICAgICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTsKICAgICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYmVmb3JlUmVnaXN0ZXI7CiAgICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHByb3RvKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdCA9IGxpZmVjeWNsZS5yZWdpc3RlcmVkOwogICAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGxpc3RbaV0uY2FsbChwcm90byk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9hcHBseUxpc3RlbmVycygpIHsKICAgICAgICAgIHN1cGVyLl9hcHBseUxpc3RlbmVycygpOwogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5saXN0ZW5lcnM7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdFtpXTsKICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBsIGluIGxpc3RlbmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLl9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsIGwsIGxpc3RlbmVyc1tsXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3RlOiBleGNlcHRpb24gdG8gInN1cGVyIHRoZW4gbWUiIHJ1bGU7CiAgICAgICAgLy8gZG8gd29yayBiZWZvcmUgY2FsbGluZyBzdXBlciBzbyB0aGF0IHN1cGVyIGF0dHJpYnV0ZXMKICAgICAgICAvLyBvbmx5IGFwcGx5IGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9lbnN1cmVBdHRyaWJ1dGVzKCkgewogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5ob3N0QXR0cmlidXRlczsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9bGlzdC5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBjb25zdCBob3N0QXR0cmlidXRlcyA9IGxpc3RbaV07CiAgICAgICAgICAgICAgZm9yIChsZXQgYSBpbiBob3N0QXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgICB0aGlzLl9lbnN1cmVBdHRyaWJ1dGUoYSwgaG9zdEF0dHJpYnV0ZXNbYV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzdXBlci5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5yZWFkeTsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICBzdXBlci5hdHRhY2hlZCgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYXR0YWNoZWQ7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRldGFjaGVkKCkgewogICAgICAgICAgc3VwZXIuZGV0YWNoZWQoKTsKICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmRldGFjaGVkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGQsIHZhbHVlKSB7CiAgICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkKCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5hdHRyaWJ1dGVDaGFuZ2VkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzLCBuYW1lLCBvbGQsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gYXBwbHkgYmVoYXZpb3JzLCBub3RlIGFjdHVhbCBjb3B5aW5nIGlzIGRvbmUgbGF6aWx5IGF0IGZpcnN0IGluc3RhbmNlIGNyZWF0aW9uCiAgICAgIGlmIChiZWhhdmlvcnMpIHsKICAgICAgICAvLyBOT1RFOiBlbnN1cmUgdGhlIGJlaGF2aW9yIGlzIGV4dGVuZGluZyBhIGNsYXNzIHdpdGgKICAgICAgICAvLyBsZWdhY3kgZWxlbWVudCBhcGkuIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIGJlaGF2aW9ycyBleHBlY3QgdG8gYmUgYWJsZQogICAgICAgIC8vIHRvIGFjY2VzcyAxLnggbGVnYWN5IGFwaS4KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYmVoYXZpb3JzKSkgewogICAgICAgICAgYmVoYXZpb3JzID0gW2JlaGF2aW9yc107CiAgICAgICAgfQogICAgICAgIGxldCBzdXBlckJlaGF2aW9ycyA9IEJhc2UucHJvdG90eXBlLmJlaGF2aW9yczsKICAgICAgICAvLyBnZXQgZmxhdHRlbmVkLCBkZWR1cGVkIGxpc3Qgb2YgYmVoYXZpb3JzICpub3QqIGFscmVhZHkgb24gc3VwZXIgY2xhc3MKICAgICAgICBiZWhhdmlvckxpc3QgPSBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbnVsbCwgc3VwZXJCZWhhdmlvcnMpOwogICAgICAgIFBvbHltZXJHZW5lcmF0ZWQucHJvdG90eXBlLmJlaGF2aW9ycyA9IHN1cGVyQmVoYXZpb3JzID8KICAgICAgICAgIHN1cGVyQmVoYXZpb3JzLmNvbmNhdChiZWhhdmlvcnMpIDogYmVoYXZpb3JMaXN0OwogICAgICB9CgogICAgICBjb25zdCBjb3B5UHJvcGVydGllc1RvUHJvdG8gPSAocHJvdG8pID0+IHsKICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICBhcHBseUJlaGF2aW9ycyhwcm90bywgYmVoYXZpb3JMaXN0LCBsaWZlY3ljbGUpOwogICAgICAgIH0KICAgICAgICBhcHBseUluZm8ocHJvdG8sIGluZm8sIGxpZmVjeWNsZSwgZXhjbHVkZU9uSW5mbyk7CiAgICAgIH07CgogICAgICAvLyBjb3B5IHByb3BlcnRpZXMgaWYgd2UncmUgbm90IG9wdGltaXppbmcKICAgICAgaWYgKCFQb2x5bWVyLmxlZ2FjeU9wdGltaXphdGlvbnMpIHsKICAgICAgICBjb3B5UHJvcGVydGllc1RvUHJvdG8oUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGUpOwogICAgICB9CgogICAgICBQb2x5bWVyR2VuZXJhdGVkLmdlbmVyYXRlZEZyb20gPSBpbmZvOwoKICAgICAgcmV0dXJuIFBvbHltZXJHZW5lcmF0ZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGV4dGVuZHMgYFBvbHltZXIuTGVnYWN5RWxlbWVudGAgYmFzZWQgb24gdGhlCiAgICAgKiBwcm92aWRlZCBpbmZvIG9iamVjdC4gIE1ldGFkYXRhIG9iamVjdHMgb24gdGhlIGBpbmZvYCBvYmplY3QKICAgICAqIChgcHJvcGVydGllc2AsIGBvYnNlcnZlcnNgLCBgbGlzdGVuZXJzYCwgYGJlaGF2aW9yc2AsIGBpc2ApIGFyZSB1c2VkCiAgICAgKiBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcgc3lzdGVtcywgYW5kIGFueSBmdW5jdGlvbnMgYXJlIGNvcGllZAogICAgICogdG8gdGhlIGdlbmVyYXRlZCBjbGFzcy4KICAgICAqCiAgICAgKiBWYWxpZCAibWV0YWRhdGEiIHZhbHVlcyBhcmUgYXMgZm9sbG93czoKICAgICAqCiAgICAgKiBgaXNgOiBTdHJpbmcgcHJvdmlkaW5nIHRoZSB0YWcgbmFtZSB0byByZWdpc3RlciB0aGUgZWxlbWVudCB1bmRlci4gSW4KICAgICAqIGFkZGl0aW9uLCBpZiBhIGBkb20tbW9kdWxlYCB3aXRoIHRoZSBzYW1lIGlkIGV4aXN0cywgdGhlIGZpcnN0IHRlbXBsYXRlCiAgICAgKiBpbiB0aGF0IGBkb20tbW9kdWxlYCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGUgc2hhZG93IHJvb3Qgb2YgdGhpcyBlbGVtZW50LAogICAgICogd2l0aCBzdXBwb3J0IGZvciBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgKGBvbi0uLi5gKSwgUG9seW1lciBkYXRhCiAgICAgKiBiaW5kaW5ncyAoYFtbLi4uXV1gIGFuZCBge3suLi59fWApLCBhbmQgaWQtYmFzZWQgbm9kZSBmaW5kaW5nIGludG8KICAgICAqIGB0aGlzLiRgLgogICAgICoKICAgICAqIGBwcm9wZXJ0aWVzYDogT2JqZWN0IGRlc2NyaWJpbmcgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIKICAgICAqIGZlYXR1cmVzIChrZXk6IHByb3BlcnR5IG5hbWVzLCB2YWx1ZTogb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydHkgbWV0YWRhdGEpLgogICAgICogVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkgbWV0YWRhdGEgaW5jbHVkZToKICAgICAqIC0gYHR5cGVgIChTdHJpbmd8TnVtYmVyfE9iamVjdHxBcnJheXwuLi4pOiBVc2VkIGJ5CiAgICAgKiAgIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvIGRldGVybWluZSBob3cgc3RyaW5nLWJhc2VkIGF0dHJpYnV0ZXMKICAgICAqICAgYXJlIGRlc2VyaWFsaXplZCB0byBKYXZhU2NyaXB0IHByb3BlcnR5IHZhbHVlcy4KICAgICAqIC0gYG5vdGlmeWAgKGJvb2xlYW4pOiBDYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHByb3BlcnR5IHRvIGZpcmUgYQogICAgICogICBub24tYnViYmxpbmcgZXZlbnQgY2FsbGVkIGA8cHJvcGVydHk+LWNoYW5nZWRgLiBFbGVtZW50cyB0aGF0IGhhdmUKICAgICAqICAgZW5hYmxlZCB0d28td2F5IGJpbmRpbmcgdG8gdGhlIHByb3BlcnR5IHVzZSB0aGlzIGV2ZW50IHRvIG9ic2VydmUgY2hhbmdlcy4KICAgICAqIC0gYHJlYWRPbmx5YCAoYm9vbGVhbik6IENyZWF0ZXMgYSBnZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgYnV0IG5vIHNldHRlci4KICAgICAqICAgVG8gc2V0IGEgcmVhZC1vbmx5IHByb3BlcnR5LCB1c2UgdGhlIHByaXZhdGUgc2V0dGVyIG1ldGhvZAogICAgICogICBgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSlgLgogICAgICogLSBgb2JzZXJ2ZXJgIChzdHJpbmcpOiBPYnNlcnZlciBtZXRob2QgbmFtZSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KICAgICAqICAgdGhlIHByb3BlcnR5IGNoYW5nZXMuIFRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZCBhcmUKICAgICAqICAgYCh2YWx1ZSwgcHJldmlvdXNWYWx1ZSlgLgogICAgICogLSBgY29tcHV0ZWRgIChzdHJpbmcpOiBTdHJpbmcgZGVzY3JpYmluZyBtZXRob2QgYW5kIGRlcGVuZGVudCBwcm9wZXJ0aWVzCiAgICAgKiAgIGZvciBjb21wdXRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgKGUuZy4gYCdjb21wdXRlRm9vKGJhciwgem90KSdgKS4KICAgICAqICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGJ5IGRlZmF1bHQgYW5kIGNhbiBvbmx5IGJlIGNoYW5nZWQKICAgICAqICAgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNvbXB1dGluZyBtZXRob2QuCiAgICAgKgogICAgICogYG9ic2VydmVyc2A6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eSBvYnNlcnZlciBtZXRob2RzCiAgICAgKiAgYW5kIHRoZWlyIGRlcGVuZGVudCBwcm9wZXJ0aWVzIChlLmcuIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgICAqCiAgICAgKiBgbGlzdGVuZXJzYDogT2JqZWN0IGRlc2NyaWJpbmcgZXZlbnQgbGlzdGVuZXJzIHRvIGJlIGFkZGVkIHRvIGVhY2gKICAgICAqICBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQgKGtleTogZXZlbnQgbmFtZSwgdmFsdWU6IG1ldGhvZCBuYW1lKS4KICAgICAqCiAgICAgKiBgYmVoYXZpb3JzYDogQXJyYXkgb2YgYWRkaXRpb25hbCBgaW5mb2Agb2JqZWN0cyBjb250YWluaW5nIG1ldGFkYXRhCiAgICAgKiBhbmQgY2FsbGJhY2tzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgYGluZm9gIG9iamVjdCBoZXJlIHdoaWNoIGFyZQogICAgICogbWVyZ2VkIGludG8gdGhpcyBlbGVtZW50LgogICAgICoKICAgICAqIGBob3N0QXR0cmlidXRlc2A6IE9iamVjdCBsaXN0aW5nIGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZCB0byB0aGUgaG9zdAogICAgICogIG9uY2UgY3JlYXRlZCAoa2V5OiBhdHRyaWJ1dGUgbmFtZSwgdmFsdWU6IGF0dHJpYnV0ZSB2YWx1ZSkuICBWYWx1ZXMKICAgICAqICBhcmUgc2VyaWFsaXplZCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuICBIb3N0IGF0dHJpYnV0ZXMgc2hvdWxkCiAgICAgKiAgZ2VuZXJhbGx5IGJlIGxpbWl0ZWQgdG8gYXR0cmlidXRlcyBzdWNoIGFzIGB0YWJJbmRleGAgYW5kIGBhcmlhLS4uLmAuCiAgICAgKiAgQXR0cmlidXRlcyBpbiBgaG9zdEF0dHJpYnV0ZXNgIGFyZSBvbmx5IGFwcGxpZWQgaWYgYSB1c2VyLXN1cHBsaWVkCiAgICAgKiAgYXR0cmlidXRlIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgKGF0dHJpYnV0ZXMgaW4gbWFya3VwIG92ZXJyaWRlCiAgICAgKiAgYGhvc3RBdHRyaWJ1dGVzYCkuCiAgICAgKgogICAgICogSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgUG9seW1lci1zcGVjaWZpYyBjYWxsYmFja3MgbWF5IGJlIHByb3ZpZGVkOgogICAgICogLSBgcmVnaXN0ZXJlZGA6IGNhbGxlZCBhZnRlciBmaXJzdCBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQsCiAgICAgKiAtIGBjcmVhdGVkYDogY2FsbGVkIGR1cmluZyBgY29uc3RydWN0b3JgCiAgICAgKiAtIGBhdHRhY2hlZGA6IGNhbGxlZCBkdXJpbmcgYGNvbm5lY3RlZENhbGxiYWNrYAogICAgICogLSBgZGV0YWNoZWRgOiBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAqIC0gYHJlYWR5YDogY2FsbGVkIGJlZm9yZSBmaXJzdCBgYXR0YWNoZWRgLCBhZnRlciBhbGwgcHJvcGVydGllcyBvZgogICAgICogICB0aGlzIGVsZW1lbnQgaGF2ZSBiZWVuIHByb3BhZ2F0ZWQgdG8gaXRzIHRlbXBsYXRlIGFuZCBhbGwgb2JzZXJ2ZXJzCiAgICAgKiAgIGhhdmUgcnVuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gT2JqZWN0IGNvbnRhaW5pbmcgUG9seW1lciBtZXRhZGF0YSBhbmQgZnVuY3Rpb25zCiAgICAgKiAgIHRvIGJlY29tZSBjbGFzcyBtZXRob2RzLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oVCk6VH0gbWl4aW4gT3B0aW9uYWwgbWl4aW4gdG8gYXBwbHkgdG8gbGVnYWN5IGJhc2UgY2xhc3MKICAgICAqICAgYmVmb3JlIGV4dGVuZGluZyB3aXRoIFBvbHltZXIgbWV0YXByb2dyYW1taW5nLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICovCiAgICBQb2x5bWVyLkNsYXNzID0gZnVuY3Rpb24oaW5mbywgbWl4aW4pIHsKICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdQb2x5bWVyLkNsYXNzIHJlcXVpcmVzIGBpbmZvYCBhcmd1bWVudCcpOwogICAgICB9CiAgICAgIGxldCBrbGFzcyA9IG1peGluID8gbWl4aW4oUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW4oSFRNTEVsZW1lbnQpKSA6CiAgICAgICAgICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CiAgICAgIGtsYXNzID0gR2VuZXJhdGVDbGFzc0Zyb21JbmZvKGluZm8sIGtsYXNzLCBpbmZvLmJlaGF2aW9ycyk7CiAgICAgIGlmIChpbmZvLl9lbmFibGVEaXNhYmxlVXBncmFkZSkgewogICAgICAgIGtsYXNzID0gUG9seW1lci5EaXNhYmxlVXBncmFkZU1peGluKGtsYXNzKTsKICAgICAgfQogICAgICAvLyBkZWNvcmF0ZSBrbGFzcyB3aXRoIHJlZ2lzdHJhdGlvbiBpbmZvCiAgICAgIGtsYXNzLmlzID0ga2xhc3MucHJvdG90eXBlLmlzID0gaW5mby5pczsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICBQb2x5bWVyLm1peGluQmVoYXZpb3JzID0gbWl4aW5CZWhhdmlvcnM7CgogIH0pKCk7CgoKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvKioKICAgICAqIExlZ2FjeSBjbGFzcyBmYWN0b3J5IGFuZCByZWdpc3RyYXRpb24gaGVscGVyIGZvciBkZWZpbmluZyBQb2x5bWVyCiAgICAgKiBlbGVtZW50cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAgICAgKiBgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGluZm8uaXMsIFBvbHltZXIuQ2xhc3MoaW5mbykpO2AKICAgICAqCiAgICAgKiBTZWUgYFBvbHltZXIuQ2xhc3NgIGZvciBkZXRhaWxzIG9uIHZhbGlkIGxlZ2FjeSBtZXRhZGF0YSBmb3JtYXQgZm9yIGBpbmZvYC4KICAgICAqCiAgICAgKiBAZ2xvYmFsCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBmdW5jdGlvbiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBPYmplY3QgY29udGFpbmluZyBQb2x5bWVyIG1ldGFkYXRhIGFuZCBmdW5jdGlvbnMKICAgICAqICAgdG8gYmVjb21lIGNsYXNzIG1ldGhvZHMuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6IEhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2R1cGxpY2F0ZSwgaW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICB3aW5kb3cuUG9seW1lci5fcG9seW1lckZuID0gZnVuY3Rpb24oaW5mbykgewogICAgICAvLyBpZiBpbnB1dCBpcyBhIGBjbGFzc2AgKGFrYSBhIGZ1bmN0aW9uIHdpdGggYSBwcm90b3R5cGUpLCB1c2UgdGhlIHByb3RvdHlwZQogICAgICAvLyByZW1lbWJlciB0aGF0IHRoZSBgY29uc3RydWN0b3JgIHdpbGwgbmV2ZXIgYmUgY2FsbGVkCiAgICAgIGxldCBrbGFzczsKICAgICAgaWYgKHR5cGVvZiBpbmZvID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAga2xhc3MgPSBpbmZvOwogICAgICB9IGVsc2UgewogICAgICAgIGtsYXNzID0gUG9seW1lci5DbGFzcyhpbmZvKTsKICAgICAgfQogICAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoa2xhc3MuaXMsIC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyhrbGFzcykpOwogICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICB9KSgpOwoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBDb21tb24gaW1wbGVtZW50YXRpb24gZm9yIG1peGluICYgYmVoYXZpb3IKICBmdW5jdGlvbiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UoaW5zdCwgcHJvcGVydHksIHZhbHVlLCBvbGQsIG11dGFibGVEYXRhKSB7CiAgICBsZXQgaXNPYmplY3Q7CiAgICBpZiAobXV0YWJsZURhdGEpIHsKICAgICAgaXNPYmplY3QgPSAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCk7CiAgICAgIC8vIFB1bGwgYG9sZGAgZm9yIE9iamVjdHMgZnJvbSB0ZW1wIGNhY2hlLCBidXQgdHJlYXQgYG51bGxgIGFzIGEgcHJpbWl0aXZlCiAgICAgIGlmIChpc09iamVjdCkgewogICAgICAgIG9sZCA9IGluc3QuX19kYXRhVGVtcFtwcm9wZXJ0eV07CiAgICAgIH0KICAgIH0KICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjaywgYnV0IHJldHVybiBmYWxzZSBmb3IgTmFOPT09TmFOCiAgICBsZXQgc2hvdWxkQ2hhbmdlID0gKG9sZCAhPT0gdmFsdWUgJiYgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpOwogICAgLy8gT2JqZWN0cyBhcmUgc3RvcmVkIGluIHRlbXBvcmFyeSBjYWNoZSAoY2xlYXJlZCBhdCBlbmQgb2YKICAgIC8vIHR1cm4pLCB3aGljaCBpcyB1c2VkIGZvciBkaXJ0eS1jaGVja2luZwogICAgaWYgKGlzT2JqZWN0ICYmIHNob3VsZENoYW5nZSkgewogICAgICBpbnN0Ll9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gc2hvdWxkQ2hhbmdlOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLCBmb3IgdXNlIG9uIGVsZW1lbnRzIHV0aWxpemluZwogICAqIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AKICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgY2F1c2UgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGFwcGx5IHRoaXMgbWl4aW4gb3IgZW5hYmxlIHRoZQogICAqIGBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFgIG1peGluLgogICAqCiAgICogSW4gb3JkZXIgdG8gbWFrZSB0aGUgZGlydHkgY2hlY2sgc3RyYXRlZ3kgY29uZmlndXJhYmxlLCBzZWUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cwogICAqICAgYW5kIGFycmF5cwogICAqLwogIFBvbHltZXIuTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICovCiAgICBjbGFzcyBNdXRhYmxlRGF0YSBleHRlbmRzIHN1cGVyQ2xhc3MgewogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBwdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAKICAgICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAgICogY2FjaGUgaXMgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIGEgdHVybiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MKICAgICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAgICogY3ljbGVzIGR1ZSB0byAyLXdheSBub3RpZmljYXRpb24pLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0cnVlKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gTXV0YWJsZURhdGE7CgogIH0pOwoKCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBhZGQgdGhlIG9wdGlvbmFsIGFiaWxpdHkgdG8gc2tpcCBzdHJpY3QKICAgKiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZQogICAqICJkaXJ0eSIpIGJ5IHNldHRpbmcgYSBgbXV0YWJsZS1kYXRhYCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCBpbnN0YW5jZS4KICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgYWxsb3cgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGVuYWJsZSB0aGlzIG1peGluIG9yIGFwcGx5IHRoZQogICAqIGBQb2x5bWVyLk11dGFibGVEYXRhYCBtaXhpbi4KICAgKgogICAqIFdoaWxlIHRoaXMgbWl4aW4gYWRkcyB0aGUgYWJpbGl0eSB0byBmb3JnbyBPYmplY3QvQXJyYXkgZGlydHkgY2hlY2tpbmcsCiAgICogdGhlIGBtdXRhYmxlRGF0YWAgZmxhZyBkZWZhdWx0cyB0byBmYWxzZSBhbmQgbXVzdCBiZSBzZXQgb24gdGhlIGluc3RhbmNlLgogICAqCiAgICogTm90ZSwgdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBwcm9wYWdhdGluZyBsYXJnZSBvYmplY3QgZ3JhcGhzCiAgICogd2lsbCBiZSB3b3JzZSBieSByZWx5aW5nIG9uIGBtdXRhYmxlRGF0YTogdHJ1ZWAgYXMgb3Bwb3NlZCB0byB1c2luZwogICAqIHN0cmljdCBkaXJ0eSBjaGVja2luZyB3aXRoIGltbXV0YWJsZSBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24KICAgKiBBUEkuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcKICAgKiAgIGZvciBvYmplY3RzIGFuZCBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQHBvbHltZXIKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKi8KICAgIGNsYXNzIE9wdGlvbmFsTXV0YWJsZURhdGEgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICAgICAqIGZvciB0aGlzIGVsZW1lbnQuICBXaGVuIHRydWUsIE9iamVjdHMgYW5kIEFycmF5cyB3aWxsIHNraXAgZGlydHkKICAgICAgICAgICAqIGNoZWNraW5nLCBvdGhlcndpc2Ugc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nIHdpbGwgYmUgdXNlZC4KICAgICAgICAgICAqLwogICAgICAgICAgbXV0YWJsZURhdGE6IEJvb2xlYW4KICAgICAgICB9OwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBXaGVuIGB0aGlzLm11dGFibGVEYXRhYCBpcyB0cnVlIG9uIHRoaXMgaW5zdGFuY2UsIHRoaXMgbWV0aG9kCiAgICAgICAqIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICAgKiAocmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBgX19kYXRhYCBjYWNoZSkgZm9yIE9iamVjdHMuICBTaW5jZSB0aGUgdGVtcAogICAgICAgKiBjYWNoZSBpcyBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgYSB0dXJuLCB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cwogICAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAgICogc2FtZSBvYmplY3QgKHVzaW5nIHRoZSB0ZW1wIGNhY2hlIGFzIGFuIGluLXR1cm4gYmFja3N0b3AgdG8gcHJldmVudAogICAgICAgKiBjeWNsZXMgZHVlIHRvIDItd2F5IG5vdGlmaWNhdGlvbikuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgY2hhbmdlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICAgIHJldHVybiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UodGhpcywgcHJvcGVydHksIHZhbHVlLCBvbGQsIHRoaXMubXV0YWJsZURhdGEpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIE9wdGlvbmFsTXV0YWJsZURhdGE7CgogIH0pOwoKICAvLyBFeHBvcnQgZm9yIHVzZSBieSBsZWdhY3kgYmVoYXZpb3IKICBQb2x5bWVyLk11dGFibGVEYXRhLl9tdXRhYmxlUHJvcGVydHlDaGFuZ2UgPSBtdXRhYmxlUHJvcGVydHlDaGFuZ2U7Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEJhc2UgY2xhc3MgZm9yIEhUTUxUZW1wbGF0ZUVsZW1lbnQgZXh0ZW5zaW9uIHRoYXQgaGFzIHByb3BlcnR5IGVmZmVjdHMKICAgIC8vIG1hY2hpbmVyeSBmb3IgcHJvcGFnYXRpbmcgaG9zdCBwcm9wZXJ0aWVzIHRvIGNoaWxkcmVuLiBUaGlzIGlzIGFuIEVTNQogICAgLy8gY2xhc3Mgb25seSBiZWNhdXNlIEJhYmVsIChpbmNvcnJlY3RseSkgcmVxdWlyZXMgc3VwZXIoKSBpbiB0aGUgY2xhc3MKICAgIC8vIGNvbnN0cnVjdG9yIGV2ZW4gdGhvdWdoIG5vIGB0aGlzYCBpcyB1c2VkIGFuZCBpdCByZXR1cm5zIGFuIGluc3RhbmNlLgogICAgbGV0IG5ld0luc3RhbmNlID0gbnVsbDsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge0hUTUxUZW1wbGF0ZUVsZW1lbnR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uKCkgeyByZXR1cm4gbmV3SW5zdGFuY2U7IH0KICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShIVE1MVGVtcGxhdGVFbGVtZW50LnByb3RvdHlwZSwgewogICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgIHZhbHVlOiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uLAogICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7SFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IERhdGFUZW1wbGF0ZSA9IFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9NdXRhYmxlRGF0YX0KICAgICAqIEBleHRlbmRzIHtEYXRhVGVtcGxhdGV9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBNdXRhYmxlRGF0YVRlbXBsYXRlID0gUG9seW1lci5NdXRhYmxlRGF0YShEYXRhVGVtcGxhdGUpOwoKICAgIC8vIEFwcGxpZXMgYSBEYXRhVGVtcGxhdGUgc3ViY2xhc3MgdG8gYSA8dGVtcGxhdGU+IGluc3RhbmNlCiAgICBmdW5jdGlvbiB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGNvbnN0cnVjdG9yKSB7CiAgICAgIG5ld0luc3RhbmNlID0gdGVtcGxhdGU7CiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0ZW1wbGF0ZSwgY29uc3RydWN0b3IucHJvdG90eXBlKTsKICAgICAgbmV3IGNvbnN0cnVjdG9yKCk7CiAgICAgIG5ld0luc3RhbmNlID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEJhc2UgY2xhc3MgZm9yIFRlbXBsYXRlSW5zdGFuY2UuCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhjbGFzcyB7fSk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQGN1c3RvbUVsZW1lbnQKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVJbnN0YW5jZUJhc2UgZXh0ZW5kcyBiYXNlIHsKICAgICAgY29uc3RydWN0b3IocHJvcHMpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX2NvbmZpZ3VyZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUodGhpcy5fX2RhdGFIb3N0KTsKICAgICAgICAvLyBTYXZlIGxpc3Qgb2Ygc3RhbXBlZCBjaGlsZHJlbgogICAgICAgIGxldCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgICAgICBmb3IgKGxldCBuID0gdGhpcy5yb290LmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgY2hpbGRyZW4ucHVzaChuKTsKICAgICAgICAgIG4uX190ZW1wbGF0aXplSW5zdGFuY2UgPSB0aGlzOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRpemVPd25lciAmJgogICAgICAgICAgdGhpcy5fX3RlbXBsYXRpemVPd25lci5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pIHsKICAgICAgICAgIHRoaXMuX3Nob3dIaWRlQ2hpbGRyZW4odHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8vIEZsdXNoIHByb3BzIG9ubHkgd2hlbiBwcm9wcyBhcmUgcGFzc2VkIGlmIGluc3RhbmNlIHByb3BzIGV4aXN0CiAgICAgICAgLy8gb3Igd2hlbiB0aGVyZSBpc24ndCBpbnN0YW5jZSBwcm9wcy4KICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMuX190ZW1wbGF0aXplT3B0aW9uczsKICAgICAgICBpZiAoKHByb3BzICYmIG9wdGlvbnMuaW5zdGFuY2VQcm9wcykgfHwgIW9wdGlvbnMuaW5zdGFuY2VQcm9wcykgewogICAgICAgICAgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ29uZmlndXJlIHRoZSBnaXZlbiBgcHJvcHNgIGJ5IGNhbGxpbmcgYF9zZXRQZW5kaW5nUHJvcGVydHlgLiBBbHNvCiAgICAgICAqIHNldHMgYW55IHByb3BlcnRpZXMgc3RvcmVkIGluIGBfX2hvc3RQcm9wc2AuCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBPYmplY3Qgb2YgcHJvcGVydHkgbmFtZS12YWx1ZSBwYWlycyB0byBzZXQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfY29uZmlndXJlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCkgewogICAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gdGhpcy5fX2hvc3RQcm9wcykgewogICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaHByb3AsIHRoaXMuX19kYXRhSG9zdFsnX2hvc3RfJyArIGhwcm9wXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEFueSBpbnN0YW5jZSBwcm9wcyBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHdpbGwgb3ZlcndyaXRlIGhvc3QgcHJvcHM7CiAgICAgICAgLy8gbm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBhIHVzZXIgZXJyb3IgYnV0IHdlIGRvbid0IHNwZWNpZmljYWxseSBmaWx0ZXIgdGhlbQogICAgICAgIGZvciAobGV0IGlwcm9wIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaXByb3AsIHByb3BzW2lwcm9wXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBhIGhvc3QgcHJvcGVydHkgdG8gdGhpcyBpbnN0YW5jZS4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZQogICAgICAgKiBjYWxsZWQgb24gaW5zdGFuY2VzIGZyb20gdGhlIGBvcHRpb25zLmZvcndhcmRIb3N0UHJvcGAgY2FsbGJhY2sKICAgICAgICogdG8gcHJvcGFnYXRlIGNoYW5nZXMgb2YgaG9zdCBwcm9wZXJ0aWVzIHRvIGVhY2ggaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgZW5xdWV1ZXMgdGhlIGNoYW5nZSwgd2hpY2ggYXJlIGZsdXNoZWQgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgb3IgcGF0aCBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGZvcndhcmQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGZvcndhcmRIb3N0UHJvcChwcm9wLCB2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcCwgdmFsdWUsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5fX2RhdGFIb3N0Ll9lbnF1ZXVlQ2xpZW50KHRoaXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHBvaW50IGZvciBhZGRpbmcgY3VzdG9tIG9yIHNpbXVsYXRlZCBldmVudCBoYW5kbGluZy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBldmVudCBsaXN0ZW5lciB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYWRkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBpZiAodGhpcy5fbWV0aG9kSG9zdCAmJiB0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnMucGFyZW50TW9kZWwpIHsKICAgICAgICAgIC8vIElmIHRoaXMgaW5zdGFuY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwYXJlbnQgbW9kZWwsIGRlY29yYXRlCiAgICAgICAgICAvLyBldmVudHMgdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZSBhcyBgbW9kZWxgCiAgICAgICAgICB0aGlzLl9tZXRob2RIb3N0Ll9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgKGUpID0+IHsKICAgICAgICAgICAgZS5tb2RlbCA9IHRoaXM7CiAgICAgICAgICAgIGhhbmRsZXIoZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gT3RoZXJ3aXNlIGRlbGVnYXRlIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QgKHdoaWNoIGNvdWxkIGJlKQogICAgICAgICAgLy8gYW5vdGhlciB0ZW1wbGF0ZSBpbnN0YW5jZQogICAgICAgICAgbGV0IHRlbXBsYXRlSG9zdCA9IHRoaXMuX19kYXRhSG9zdC5fX2RhdGFIb3N0OwogICAgICAgICAgaWYgKHRlbXBsYXRlSG9zdCkgewogICAgICAgICAgICB0ZW1wbGF0ZUhvc3QuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICAgKiB0ZXh0IG5vZGVzLCBgdGV4dENvbnRlbnRgIGlzIHJlbW92ZWQgd2hpbGUgImhpZGRlbiIgYW5kIHJlcGxhY2VkIHdoZW4KICAgICAgICogInNob3duLiIKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoaWRlIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICAgKiBzZXQgdG8gZmFsc2UgdG8gc2hvdyB0aGVtLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvd0hpZGVDaGlsZHJlbihoaWRlKSB7CiAgICAgICAgbGV0IGMgPSB0aGlzLmNoaWxkcmVuOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxjLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbiA9IGNbaV07CiAgICAgICAgICAvLyBJZ25vcmUgbm9uLWNoYW5nZXMKICAgICAgICAgIGlmIChCb29sZWFuKGhpZGUpICE9IEJvb2xlYW4obi5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pKSB7CiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lclRleHRDb250ZW50X18gPSBuLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgbi50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gbi5fX3BvbHltZXJUZXh0Q29udGVudF9fOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVtb3ZlIGFuZCByZXBsYWNlIHNsb3QKICAgICAgICAgICAgfSBlbHNlIGlmIChuLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKSB7CiAgICAgICAgICAgICAgaWYgKGhpZGUpIHsKICAgICAgICAgICAgICAgIG4uX19wb2x5bWVyUmVwbGFjZWRfXyA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ2hpZGRlbi1zbG90Jyk7CiAgICAgICAgICAgICAgICBuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4uX19wb2x5bWVyUmVwbGFjZWRfXywgbik7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2UgPSBuLl9fcG9seW1lclJlcGxhY2VkX187CiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgewogICAgICAgICAgICAgICAgICByZXBsYWNlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4sIHJlcGxhY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSBpZiAobi5zdHlsZSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lckRpc3BsYXlfXyA9IG4uc3R5bGUuZGlzcGxheTsKICAgICAgICAgICAgICAgIG4uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbi5zdHlsZS5kaXNwbGF5ID0gbi5fX3BvbHltZXJEaXNwbGF5X187CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBuLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyA9IGhpZGU7CiAgICAgICAgICBpZiAobi5fc2hvd0hpZGVDaGlsZHJlbikgewogICAgICAgICAgICBuLl9zaG93SGlkZUNoaWxkcmVuKGhpZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgcHJvcGVydHktZWZmZWN0cyBpbXBsZW1lbnRhdGlvbiB0byBpbnRlcmNlcHQKICAgICAgICogdGV4dENvbnRlbnQgYmluZGluZ3Mgd2hpbGUgY2hpbGRyZW4gYXJlICJoaWRkZW4iIGFuZCBjYWNoZSBpbgogICAgICAgKiBwcml2YXRlIHN0b3JhZ2UgZm9yIGxhdGVyIHJldHJpZXZhbC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBUaGUgbm9kZSB0byBzZXQgYSBwcm9wZXJ0eSBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgICAgICBpZiAobm9kZS5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18gJiYKICAgICAgICAgICAgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBwcm9wID09ICd0ZXh0Q29udGVudCcpIHsKICAgICAgICAgIG5vZGUuX19wb2x5bWVyVGV4dENvbnRlbnRfXyA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdXBlci5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuICBUaGUgcGFyZW50IG1vZGVsCiAgICAgICAqIGlzIGVpdGhlciBhbm90aGVyIHRlbXBsYXRpemUgaW5zdGFuY2UgdGhhdCBoYWQgb3B0aW9uIGBwYXJlbnRNb2RlbDogdHJ1ZWAsCiAgICAgICAqIG9yIGVsc2UgdGhlIGhvc3QgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBUaGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgaW5zdGFuY2UKICAgICAgICovCiAgICAgIGdldCBwYXJlbnRNb2RlbCgpIHsKICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLl9fcGFyZW50TW9kZWw7CiAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgbGV0IG9wdGlvbnM7CiAgICAgICAgICBtb2RlbCA9IHRoaXM7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIC8vIEEgdGVtcGxhdGUgaW5zdGFuY2UncyBgX19kYXRhSG9zdGAgaXMgYSA8dGVtcGxhdGU+CiAgICAgICAgICAgIC8vIGBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3RgIGlzIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICAgICAgbW9kZWwgPSBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3Q7CiAgICAgICAgICB9IHdoaWxlICgob3B0aW9ucyA9IG1vZGVsLl9fdGVtcGxhdGl6ZU9wdGlvbnMpICYmICFvcHRpb25zLnBhcmVudE1vZGVsKTsKICAgICAgICAgIHRoaXMuX19wYXJlbnRNb2RlbCA9IG1vZGVsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdHViIG9mIEhUTUxFbGVtZW50J3MgYGRpc3BhdGNoRXZlbnRgLCBzbyB0aGF0IGVmZmVjdHMgdGhhdCBtYXkKICAgICAgICogZGlzcGF0Y2ggZXZlbnRzIHNhZmVseSBuby1vcC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgRXZlbnQgdG8gZGlzcGF0Y2gKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gQWx3YXlzIHRydWUuCiAgICAgICAqLwogICAgICAgZGlzcGF0Y2hFdmVudChldmVudCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgLyoqIEB0eXBlIHshRGF0YVRlbXBsYXRlfSAqLwogICAgVGVtcGxhdGVJbnN0YW5jZUJhc2UucHJvdG90eXBlLl9fZGF0YUhvc3Q7CiAgICAvKiogQHR5cGUgeyFUZW1wbGF0aXplT3B0aW9uc30gKi8KICAgIFRlbXBsYXRlSW5zdGFuY2VCYXNlLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgLyoqIEB0eXBlIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX21ldGhvZEhvc3Q7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXI7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX19ob3N0UHJvcHM7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5NdXRhYmxlRGF0YShUZW1wbGF0ZUluc3RhbmNlQmFzZSk7CgogICAgZnVuY3Rpb24gZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICBsZXQgdGVtcGxhdGVIb3N0ID0gdGVtcGxhdGUuX19kYXRhSG9zdDsKICAgICAgcmV0dXJuIHRlbXBsYXRlSG9zdCAmJiB0ZW1wbGF0ZUhvc3QuX21ldGhvZEhvc3QgfHwgdGVtcGxhdGVIb3N0OwogICAgfQoKICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgICAvKioKICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGNsYXNzLnByb3RvdHlwZSBpcyBub3QgZGVmaW5lZCBmb3Igc29tZSByZWFzb24KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIC8vIEFub255bW91cyBjbGFzcyBjcmVhdGVkIGJ5IHRoZSB0ZW1wbGF0aXplCiAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/CiAgICAgICAgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgIC8vIEFmZm9yZGFuY2UgZm9yIGdsb2JhbCBtaXhpbnMgb250byBUZW1wbGF0aXplSW5zdGFuY2UKICAgICAgaWYgKFBvbHltZXIuVGVtcGxhdGl6ZS5taXhpbikgewogICAgICAgIGJhc2UgPSBQb2x5bWVyLlRlbXBsYXRpemUubWl4aW4oYmFzZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGxldCBrbGFzcyA9IGNsYXNzIGV4dGVuZHMgYmFzZSB7IH07CiAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zID0gb3B0aW9uczsKICAgICAga2xhc3MucHJvdG90eXBlLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gY2xhc3MucHJvdG90eXBlIGlzIG5vdCBkZWZpbmVkIGZvciBzb21lIHJlYXNvbgogICAgICovCiAgICBmdW5jdGlvbiBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpIHsKICAgICAgbGV0IHVzZXJGb3J3YXJkSG9zdFByb3AgPSBvcHRpb25zLmZvcndhcmRIb3N0UHJvcDsKICAgICAgaWYgKHVzZXJGb3J3YXJkSG9zdFByb3ApIHsKICAgICAgICAvLyBQcm92aWRlIGRhdGEgQVBJIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIG9uIG1lbW9pemVkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgbGV0IGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzOwogICAgICAgIGlmICgha2xhc3MpIHsKICAgICAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/IE11dGFibGVEYXRhVGVtcGxhdGUgOiBEYXRhVGVtcGxhdGU7CiAgICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICAgIGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzID0KICAgICAgICAgICAgY2xhc3MgVGVtcGxhdGl6ZWRUZW1wbGF0ZSBleHRlbmRzIGJhc2Uge307CiAgICAgICAgICAvLyBBZGQgdGVtcGxhdGUgLSA+aW5zdGFuY2VzIGVmZmVjdHMKICAgICAgICAgIC8vIGFuZCBob3N0IDwtIHRlbXBsYXRlIGVmZmVjdHMKICAgICAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdCgnX2hvc3RfJyArIHByb3AsCiAgICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLlBST1BFUlRZX0VGRkVDVF9UWVBFUy5QUk9QQUdBVEUsCiAgICAgICAgICAgICAge2ZuOiBjcmVhdGVGb3J3YXJkSG9zdFByb3BFZmZlY3QocHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCl9KTsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eSgnX2hvc3RfJyArIHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGtsYXNzKTsKICAgICAgICAvLyBNaXggYW55IHByZS1ib3VuZCBkYXRhIGludG8gX19kYXRhOyBubyBuZWVkIHRvIGZsdXNoIHRoaXMgdG8KICAgICAgICAvLyBpbnN0YW5jZXMgc2luY2UgdGhleSBwdWxsIGZyb20gdGhlIHRlbXBsYXRlIGF0IGluc3RhbmNlLXRpbWUKICAgICAgICBpZiAodGVtcGxhdGUuX19kYXRhUHJvdG8pIHsKICAgICAgICAgIC8vIE5vdGUsIGdlbmVyYWxseSBgX19kYXRhUHJvdG9gIGNvdWxkIGJlIGNoYWluZWQsIGJ1dCBpdCdzIGd1YXJhbnRlZWQKICAgICAgICAgIC8vIHRvIG5vdCBiZSBzaW5jZSB0aGlzIGlzIGEgdmFuaWxsYSB0ZW1wbGF0ZSB3ZSBqdXN0IGFkZGVkIGVmZmVjdHMgdG8KICAgICAgICAgIE9iamVjdC5hc3NpZ24odGVtcGxhdGUuX19kYXRhLCB0ZW1wbGF0ZS5fX2RhdGFQcm90byk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIGFueSBwZW5kaW5nIGRhdGEgZm9yIHBlcmZvcm1hbmNlCiAgICAgICAgdGVtcGxhdGUuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRlbXBsYXRlLl9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICAgIHRlbXBsYXRlLl9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgdGVtcGxhdGUuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgfQogICAgfQogICAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKICAgIGZ1bmN0aW9uIGNyZWF0ZUZvcndhcmRIb3N0UHJvcEVmZmVjdChob3N0UHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gZm9yd2FyZEhvc3RQcm9wKHRlbXBsYXRlLCBwcm9wLCBwcm9wcykgewogICAgICAgIHVzZXJGb3J3YXJkSG9zdFByb3AuY2FsbCh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIHByb3Auc3Vic3RyaW5nKCdfaG9zdF8nLmxlbmd0aCksIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9OwogICAgICBmb3IgKGxldCBpcHJvcCBpbiBvcHRpb25zLmluc3RhbmNlUHJvcHMpIHsKICAgICAgICBkZWxldGUgaG9zdFByb3BzW2lwcm9wXTsKICAgICAgICBsZXQgdXNlck5vdGlmeUluc3RhbmNlUHJvcCA9IG9wdGlvbnMubm90aWZ5SW5zdGFuY2VQcm9wOwogICAgICAgIGlmICh1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGlwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlJbnN0YW5jZVByb3BFZmZlY3QoaXByb3AsIHVzZXJOb3RpZnlJbnN0YW5jZVByb3ApfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCAmJiB0ZW1wbGF0ZS5fX2RhdGFIb3N0KSB7CiAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGhwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTm90aWZ5SW5zdGFuY2VQcm9wRWZmZWN0KGluc3RQcm9wLCB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBub3RpZnlJbnN0YW5jZVByb3AoaW5zdCwgcHJvcCwgcHJvcHMpIHsKICAgICAgICB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wLmNhbGwoaW5zdC5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIGluc3QsIHByb3AsIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5vdGlmeUhvc3RQcm9wKGluc3QsIHByb3AsIHByb3BzKSB7CiAgICAgICAgaW5zdC5fX2RhdGFIb3N0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoJ19ob3N0XycgKyBwcm9wLCBwcm9wc1twcm9wXSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBNb2R1bGUgZm9yIHByZXBhcmluZyBhbmQgc3RhbXBpbmcgaW5zdGFuY2VzIG9mIHRlbXBsYXRlcyB0aGF0IHV0aWxpemUKICAgICAqIFBvbHltZXIncyBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVyIGZlYXR1cmVzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIC8vIEdldCBhIHRlbXBsYXRlIGZyb20gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKTsKICAgICAqICAgICAvLyBQcmVwYXJlIHRoZSB0ZW1wbGF0ZQogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUpOwogICAgICogICAgIC8vIEluc3RhbmNlIHRoZSB0ZW1wbGF0ZSB3aXRoIGFuIGluaXRpYWwgZGF0YSBtb2RlbAogICAgICogICAgIGxldCBpbnN0YW5jZSA9IG5ldyBUZW1wbGF0ZUNsYXNzKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGVsZW1lbnQncyBzaGFkb3cgRE9NCiAgICAgKiAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVGhlIGBvcHRpb25zYCBkaWN0aW9uYXJ5IHBhc3NlZCB0byBgdGVtcGxhdGl6ZWAgYWxsb3dzIGZvciBjdXN0b21pemluZwogICAgICogZmVhdHVyZXMgb2YgdGhlIGdlbmVyYXRlZCB0ZW1wbGF0ZSBjbGFzcywgaW5jbHVkaW5nIGhvdyBvdXRlci1zY29wZSBob3N0CiAgICAgKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBmb3J3YXJkZWQgaW50byB0ZW1wbGF0ZSBpbnN0YW5jZXMsIGhvdyBhbnkgaW5zdGFuY2UKICAgICAqIHByb3BlcnRpZXMgYWRkZWQgaW50byB0aGUgdGVtcGxhdGUncyBzY29wZSBzaG91bGQgYmUgbm90aWZpZWQgb3V0IHRvCiAgICAgKiB0aGUgaG9zdCwgYW5kIHdoZXRoZXIgdGhlIGluc3RhbmNlIHNob3VsZCBiZSBkZWNvcmF0ZWQgYXMgYSAicGFyZW50IG1vZGVsIgogICAgICogb2YgYW55IGV2ZW50IGhhbmRsZXJzLgogICAgICoKICAgICAqICAgICAvLyBDdXN0b21pemUgcHJvcGVydHkgZm9yd2FyZGluZyBhbmQgZXZlbnQgbW9kZWwgZGVjb3JhdGlvbgogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAqICAgICAgIHBhcmVudE1vZGVsOiB0cnVlLAogICAgICogICAgICAgZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSkgey4uLn0sCiAgICAgKiAgICAgICBpbnN0YW5jZVByb3BzOiB7Li4ufSwKICAgICAqICAgICAgIG5vdGlmeUluc3RhbmNlUHJvcChpbnN0YW5jZSwgcHJvcGVydHksIHZhbHVlKSB7Li4ufSwKICAgICAqICAgICB9KTsKICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBwcmVwYXJpbmcgYW5kIHN0YW1waW5nIGluc3RhbmNlcyBvZiB0ZW1wbGF0ZXMKICAgICAqICAgdXRpbGl6aW5nIFBvbHltZXIgdGVtcGxhdGluZyBmZWF0dXJlcy4KICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplID0gewoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYW4gYW5vbnltb3VzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgY2xhc3MgYm91bmQgdG8gdGhlCiAgICAgICAqIGA8dGVtcGxhdGU+YCBwcm92aWRlZC4gIEluc3RhbmNpbmcgdGhlIGNsYXNzIHdpbGwgcmVzdWx0IGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBiZWluZyBzdGFtcGVkIGludG8gYSBkb2N1bWVudCBmcmFnbWVudCBzdG9yZWQgYXMgdGhlIGluc3RhbmNlJ3MKICAgICAgICogYHJvb3RgIHByb3BlcnR5LCBhZnRlciB3aGljaCBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIERPTS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGVzIG1heSB1dGlsaXplIGFsbCBQb2x5bWVyIGRhdGEtYmluZGluZyBmZWF0dXJlcyBhcyB3ZWxsIGFzCiAgICAgICAqIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycy4gIEV2ZW50IGxpc3RlbmVycyBhbmQgaW5saW5lIGNvbXB1dGluZwogICAgICAgKiBmdW5jdGlvbnMgaW4gdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBob3N0IG9mIHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogVGhlIGNvbnN0cnVjdG9yIHJldHVybmVkIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IGRpY3Rpb25hcnkgb2YgaW5pdGlhbAogICAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMgdG8gcHJvcGFnYXRlIGludG8gdGVtcGxhdGUgYmluZGluZ3MuICBBZGRpdGlvbmFsbHkKICAgICAgICogaG9zdCBwcm9wZXJ0aWVzIGNhbiBiZSBmb3J3YXJkZWQgaW4sIGFuZCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGNhbiBiZQogICAgICAgKiBub3RpZmllZCBvdXQgYnkgcHJvdmlkaW5nIG9wdGlvbmFsIGNhbGxiYWNrcyBpbiB0aGUgYG9wdGlvbnNgIGRpY3Rpb25hcnkuCiAgICAgICAqCiAgICAgICAqIFZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gYG9wdGlvbnNgIGFyZSBhcyBmb2xsb3dzOgogICAgICAgKgogICAgICAgKiAtIGBmb3J3YXJkSG9zdFByb3AocHJvcGVydHksIHZhbHVlKWA6IENhbGxlZCB3aGVuIGEgcHJvcGVydHkgcmVmZXJlbmNlZAogICAgICAgKiAgIGluIHRoZSB0ZW1wbGF0ZSBjaGFuZ2VkIG9uIHRoZSB0ZW1wbGF0ZSdzIGhvc3QuIEFzIHRoaXMgbGlicmFyeSBkb2VzCiAgICAgICAqICAgbm90IHJldGFpbiByZWZlcmVuY2VzIHRvIHRlbXBsYXRlcyBpbnN0YW5jZWQgYnkgdGhlIHVzZXIsIGl0IGlzIHRoZQogICAgICAgKiAgIHRlbXBsYXRpemUgb3duZXIncyByZXNwb25zaWJpbGl0eSB0byBmb3J3YXJkIGhvc3QgcHJvcGVydHkgY2hhbmdlcyBpbnRvCiAgICAgICAqICAgdXNlci1zdGFtcGVkIGluc3RhbmNlcy4gIFRoZSBgaW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSlgCiAgICAgICAqICAgIG1ldGhvZCBvbiB0aGUgZ2VuZXJhdGVkIGNsYXNzIHNob3VsZCBiZSBjYWxsZWQgdG8gZm9yd2FyZCBob3N0CiAgICAgICAqICAgcHJvcGVydGllcyBpbnRvIHRoZSB0ZW1wbGF0ZSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHByb3BlcnR5LWNoYW5nZWQKICAgICAgICogICBub3RpZmljYXRpb25zLiBBbnkgcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGFyZSBub3QKICAgICAgICogICBkZWZpbmVkIGluIGBpbnN0YW5jZVByb3BzYCB3aWxsIGJlIG5vdGlmaWVkIHVwIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICogICBhdXRvbWF0aWNhbGx5LgogICAgICAgKiAtIGBpbnN0YW5jZVByb3BzYDogRGljdGlvbmFyeSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdpbGwgYmUgYWRkZWQKICAgICAgICogICB0byB0aGUgaW5zdGFuY2UgYnkgdGhlIHRlbXBsYXRpemUgb3duZXIuICBUaGVzZSBwcm9wZXJ0aWVzIHNoYWRvdyBhbnkKICAgICAgICogICBob3N0IHByb3BlcnRpZXMsIGFuZCBjaGFuZ2VzIHdpdGhpbiB0aGUgdGVtcGxhdGUgdG8gdGhlc2UgcHJvcGVydGllcwogICAgICAgKiAgIHdpbGwgcmVzdWx0IGluIGBub3RpZnlJbnN0YW5jZVByb3BgIGJlaW5nIGNhbGxlZC4KICAgICAgICogLSBgbXV0YWJsZURhdGFgOiBXaGVuIGB0cnVlYCwgdGhlIGdlbmVyYXRlZCBjbGFzcyB3aWxsIHNraXAgc3RyaWN0CiAgICAgICAqICAgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgICAgICogICAiZGlydHkiKS4KICAgICAgICogLSBgbm90aWZ5SW5zdGFuY2VQcm9wKGluc3RhbmNlLCBwcm9wZXJ0eSwgdmFsdWUpYDogQ2FsbGVkIHdoZW4KICAgICAgICogICBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBjaGFuZ2VzLiAgVXNlcnMgbWF5IGNob29zZSB0byBjYWxsIGBub3RpZnlQYXRoYAogICAgICAgKiAgIG9uIGUuZy4gdGhlIG93bmVyIHRvIG5vdGlmeSB0aGUgY2hhbmdlLgogICAgICAgKiAtIGBwYXJlbnRNb2RlbGA6IFdoZW4gYHRydWVgLCBldmVudHMgaGFuZGxlZCBieSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMKICAgICAgICogICAoYG9uLWV2ZW50PSJoYW5kbGVyImApIHdpbGwgYmUgZGVjb3JhdGVkIHdpdGggYSBgbW9kZWxgIHByb3BlcnR5IHBvaW50aW5nCiAgICAgICAqICAgdG8gdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRoYXQgc3RhbXBlZCBpdC4gIEl0IHdpbGwgYWxzbyBiZSByZXR1cm5lZAogICAgICAgKiAgIGZyb20gYGluc3RhbmNlLnBhcmVudE1vZGVsYCBpbiBjYXNlcyB3aGVyZSB0ZW1wbGF0ZSBpbnN0YW5jZSBuZXN0aW5nCiAgICAgICAqICAgY2F1c2VzIGFuIGlubmVyIG1vZGVsIHRvIHNoYWRvdyBhbiBvdXRlciBtb2RlbC4KICAgICAgICoKICAgICAgICogQWxsIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGJvdW5kIHRvIHRoZSBgb3duZXJgLiBBbnkgY29udGV4dAogICAgICAgKiBuZWVkZWQgZm9yIHRoZSBjYWxsYmFja3MgKHN1Y2ggYXMgcmVmZXJlbmNlcyB0byBgaW5zdGFuY2VzYCBzdGFtcGVkKQogICAgICAgKiBzaG91bGQgYmUgc3RvcmVkIG9uIHRoZSBgb3duZXJgIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgdmlhCiAgICAgICAqIGB0aGlzYC4KICAgICAgICoKICAgICAgICogV2hlbiBgb3B0aW9ucy5mb3J3YXJkSG9zdFByb3BgIGlzIGRlY2xhcmVkIGFzIGFuIG9wdGlvbiwgYW55IHByb3BlcnRpZXMKICAgICAgICogcmVmZXJlbmNlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCBmcm9tIHRoZSBob3N0IG9mCiAgICAgICAqIHRoZSBgPHRlbXBsYXRlPmAgdG8gaW5zdGFuY2VzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYW55IHByb3BlcnRpZXMgbGlzdGVkIGluCiAgICAgICAqIHRoZSBgb3B0aW9ucy5pbnN0YW5jZVByb3BzYCBvYmplY3QuICBgaW5zdGFuY2VQcm9wc2AgYXJlIGFzc3VtZWQgdG8gYmUKICAgICAgICogbWFuYWdlZCBieSB0aGUgb3duZXIgb2YgdGhlIGluc3RhbmNlcywgZWl0aGVyIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvcgogICAgICAgKiBvciBzZXQgYWZ0ZXIgdGhlIGZhY3QuICBOb3RlLCBhbnkgcHJvcGVydGllcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2lsbAogICAgICAgKiBhbHdheXMgYmUgc2V0IHRvIHRoZSBpbnN0YW5jZSAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd291bGQgbm9ybWFsbHkKICAgICAgICogYmUgZm9yd2FyZGVkIGZyb20gdGhlIGhvc3QpLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgYHRlbXBsYXRpemUoKWAgY2FuIGJlIHJ1biBvbmx5IG9uY2UgZm9yIGEgZ2l2ZW4gYDx0ZW1wbGF0ZT5gLgogICAgICAgKiBGdXJ0aGVyIGNhbGxzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiBBbHNvLCB0aGVyZSBpcyBhIHNwZWNpYWwKICAgICAgICogYmVoYXZpb3IgaWYgdGhlIHRlbXBsYXRlIHdhcyBkdXBsaWNhdGVkIHRocm91Z2ggYSBtZWNoYW5pc20gc3VjaCBhcwogICAgICAgKiBgPGRvbS1yZXBlYXQ+YCBvciBgPHRlc3QtZml4dHVyZT5gLiBJbiB0aGlzIGNhc2UsIGFsbCBjYWxscyB0bwogICAgICAgKiBgdGVtcGxhdGl6ZSgpYCByZXR1cm4gdGhlIHNhbWUgY2xhc3MgZm9yIGFsbCBkdXBsaWNhdGVzIG9mIGEgdGVtcGxhdGUuCiAgICAgICAqIFRoZSBjbGFzcyByZXR1cm5lZCBmcm9tIGB0ZW1wbGF0aXplKClgIGlzIGdlbmVyYXRlZCBvbmx5IG9uY2UgdXNpbmcKICAgICAgICogdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBmaXJzdCBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgYW55IGBvcHRpb25zYAogICAgICAgKiBwcm92aWRlZCB0byBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgYmUgaWdub3JlZC4gVGhlcmVmb3JlLCBpdCBpcyB2ZXJ5CiAgICAgICAqIGltcG9ydGFudCBub3QgdG8gY2xvc2Ugb3ZlciBhbnkgdmFyaWFibGVzIGluc2lkZSB0aGUgY2FsbGJhY2tzLiBBbHNvLAogICAgICAgKiBhcnJvdyBmdW5jdGlvbnMgbXVzdCBiZSBhdm9pZGVkIGJlY2F1c2UgdGhleSBiaW5kIHRoZSBvdXRlciBgdGhpc2AuCiAgICAgICAqIEluc2lkZSB0aGUgY2FsbGJhY2tzLCBhbnkgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBjYW4gYmUgYWNjZXNzZWQKICAgICAgICogdGhyb3VnaCBgdGhpc2AsIHdoaWNoIHBvaW50cyB0byB0aGUgYG93bmVyYC4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuVGVtcGxhdGl6ZQogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byB0ZW1wbGF0aXplCiAgICAgICAqIEBwYXJhbSB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHM9fSBvd25lciBPd25lciBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2VzOwogICAgICAgKiAgIGFueSBvcHRpb25hbCBjYWxsYmFja3Mgd2lsbCBiZSBib3VuZCB0byB0aGlzIG93bmVyLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBkaWN0aW9uYXJ5IChzZWUgc3VtbWFyeSBmb3IgZGV0YWlscykKICAgICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlRlbXBsYXRlSW5zdGFuY2VCYXNlKX0gR2VuZXJhdGVkIGNsYXNzIGJvdW5kIHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgKiAgIHByb3ZpZGVkCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgb3duZXIsIG9wdGlvbnMpIHsKICAgICAgICAvLyBVbmRlciBzdHJpY3RUZW1wbGF0ZVBvbGljeSwgdGhlIHRlbXBsYXRpemVkIGVsZW1lbnQgbXVzdCBiZSBvd25lZAogICAgICAgIC8vIGJ5IGEgKHRydXN0ZWQpIFBvbHltZXIgZWxlbWVudCwgaW5kaWNhdGVkIGJ5IGV4aXN0ZW5jZSBvZiBfbWV0aG9kSG9zdDsKICAgICAgICAvLyBlLmcuIGZvciBkb20taWYgJiBkb20tcmVwZWF0IGluIG1haW4gZG9jdW1lbnQsIF9tZXRob2RIb3N0IGlzIG51bGwKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSAmJiAhZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmljdFRlbXBsYXRlUG9saWN5OiB0ZW1wbGF0ZSBvd25lciBub3QgdHJ1c3RlZCcpOwogICAgICAgIH0KICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshVGVtcGxhdGl6ZU9wdGlvbnN9ICovKG9wdGlvbnMgfHwge30pOwogICAgICAgIGlmICh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lcikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIDx0ZW1wbGF0ZT4gY2FuIG9ubHkgYmUgdGVtcGxhdGl6ZWQgb25jZScpOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGNvbnN0IGN0b3IgPSBvd25lciA/IG93bmVyLmNvbnN0cnVjdG9yIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IGN0b3IuX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIC8vIEdldCBtZW1vaXplZCBiYXNlIGNsYXNzIGZvciB0aGUgcHJvdG90eXBpY2FsIHRlbXBsYXRlLCB3aGljaAogICAgICAgIC8vIGluY2x1ZGVzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGJpbmRpbmcgdGVtcGxhdGUgJiBmb3J3YXJkaW5nCiAgICAgICAgbGV0IGJhc2VDbGFzcyA9IHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzczsKICAgICAgICBpZiAoIWJhc2VDbGFzcykgewogICAgICAgICAgYmFzZUNsYXNzID0gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgICAgIHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzcyA9IGJhc2VDbGFzczsKICAgICAgICB9CiAgICAgICAgLy8gSG9zdCBwcm9wZXJ0eSBmb3J3YXJkaW5nIG11c3QgYmUgaW5zdGFsbGVkIG9udG8gdGVtcGxhdGUgaW5zdGFuY2UKICAgICAgICBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpOwogICAgICAgIC8vIFN1YmNsYXNzIGJhc2UgY2xhc3MgYW5kIGFkZCByZWZlcmVuY2UgZm9yIHRoaXMgc3BlY2lmaWMgdGVtcGxhdGUKICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICBsZXQga2xhc3MgPSBjbGFzcyBUZW1wbGF0ZUluc3RhbmNlIGV4dGVuZHMgYmFzZUNsYXNzIHt9OwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fbWV0aG9kSG9zdCA9IGZpbmRNZXRob2RIb3N0KHRlbXBsYXRlKTsKICAgICAgICBrbGFzcy5wcm90b3R5cGUuX19kYXRhSG9zdCA9IHRlbXBsYXRlOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX2hvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHM7CiAgICAgICAga2xhc3MgPSAvKiogQHR5cGUge2Z1bmN0aW9uKG5ldzpUZW1wbGF0ZUluc3RhbmNlQmFzZSl9ICovKGtsYXNzKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlICJtb2RlbCIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCwgd2hpY2gKICAgICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAgICogY29udGFpbmVkIGluLiBBIHRlbXBsYXRlIG1vZGVsIGlzIGFuIGluc3RhbmNlIG9mCiAgICAgICAqIGBUZW1wbGF0ZUluc3RhbmNlQmFzZWAsIGFuZCBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEKICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIEV4YW1wbGU6CiAgICAgICAqCiAgICAgICAqICAgbGV0IG1vZGVsID0gbW9kZWxGb3JFbGVtZW50KGVsKTsKICAgICAgICogICBpZiAobW9kZWwuaW5kZXggPCAxMCkgewogICAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlRlbXBsYXRpemUKICAgICAgICogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUaGUgbW9kZWwgd2lsbCBiZSByZXR1cm5lZCBmb3IKICAgICAgICogICBlbGVtZW50cyBzdGFtcGVkIGZyb20gdGhpcyB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0ge05vZGU9fSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIHJldHVybiBhIHRlbXBsYXRlIG1vZGVsLgogICAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0gVGVtcGxhdGUgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZQogICAgICAgKiAgIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBlbGVtZW50CiAgICAgICAqLwogICAgICBtb2RlbEZvckVsZW1lbnQodGVtcGxhdGUsIG5vZGUpIHsKICAgICAgICBsZXQgbW9kZWw7CiAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgIC8vIEFuIGVsZW1lbnQgd2l0aCBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIG1hcmtzIHRoZSB0b3AgYm91bmRhcnkKICAgICAgICAgIC8vIG9mIGEgc2NvcGU7IHdhbGsgdXAgdW50aWwgd2UgZmluZCBvbmUsIGFuZCB0aGVuIGVuc3VyZSB0aGF0CiAgICAgICAgICAvLyBpdHMgX19kYXRhSG9zdCBtYXRjaGVzIGB0aGlzYCwgbWVhbmluZyB0aGlzIGRvbS1yZXBlYXQgc3RhbXBlZCBpdAogICAgICAgICAgaWYgKChtb2RlbCA9IG5vZGUuX190ZW1wbGF0aXplSW5zdGFuY2UpKSB7CiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGVsZW1lbnQgc3RhbXBlZCBieSBhbm90aGVyIHRlbXBsYXRlOyBrZWVwIHdhbGtpbmcgdXAKICAgICAgICAgICAgLy8gZnJvbSBpdHMgX19kYXRhSG9zdAogICAgICAgICAgICBpZiAobW9kZWwuX19kYXRhSG9zdCAhPSB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgIG5vZGUgPSBtb2RlbC5fX2RhdGFIb3N0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU3RpbGwgaW4gYSB0ZW1wbGF0ZSBzY29wZSwga2VlcCBnb2luZyB1cCB1bnRpbAogICAgICAgICAgICAvLyBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIGlzIGZvdW5kCiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwoKICAgIFBvbHltZXIuVGVtcGxhdGVJbnN0YW5jZUJhc2UgPSBUZW1wbGF0ZUluc3RhbmNlQmFzZTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAgIC8qKgogICAgICogQHR5cGVkZWYge3sKICAgICAqICAgX3RlbXBsYXRpemVyVGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQsCiAgICAgKiAgIF9wYXJlbnRNb2RlbDogYm9vbGVhbiwKICAgICAqICAgX2luc3RhbmNlUHJvcHM6IE9iamVjdCwKICAgICAqICAgX2ZvcndhcmRIb3N0UHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgX25vdGlmeUluc3RhbmNlUHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgY3RvcjogVGVtcGxhdGVJbnN0YW5jZUJhc2UKICAgICAqIH19CiAgICAgKi8KICAgIGxldCBUZW1wbGF0aXplclVzZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKCiAgICAvKioKICAgICAqIFRoZSBgUG9seW1lci5UZW1wbGF0aXplcmAgYmVoYXZpb3IgYWRkcyBtZXRob2RzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZgogICAgICogdGVtcGxhdGVzIHRoYXQgYXJlIGVhY2ggbWFuYWdlZCBieSBhbiBhbm9ueW1vdXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYAogICAgICogaW5zdGFuY2Ugd2hlcmUgZGF0YS1iaW5kaW5ncyBpbiB0aGUgc3RhbXBlZCB0ZW1wbGF0ZSBjb250ZW50IGFyZSBib3VuZCB0bwogICAgICogYWNjZXNzb3JzIG9uIGl0c2VsZi4KICAgICAqCiAgICAgKiBUaGlzIGJlaGF2aW9yIGlzIHByb3ZpZGVkIGluIFBvbHltZXIgMi54IGFzIGEgaHlicmlkLWVsZW1lbnQgY29udmVuaWVuY2UKICAgICAqIG9ubHkuICBGb3Igbm9uLWh5YnJpZCB1c2FnZSwgdGhlIGBQb2x5bWVyLlRlbXBsYXRpemVgIGxpYnJhcnkKICAgICAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgLy8gR2V0IGEgdGVtcGxhdGUgZnJvbSBzb21ld2hlcmUsIGUuZy4gbGlnaHQgRE9NCiAgICAgKiAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICogICAgIC8vIFByZXBhcmUgdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgdGhpcy50ZW1wbGF0aXplKHRlbXBsYXRlKTsKICAgICAqICAgICAvLyBJbnN0YW5jZSB0aGUgdGVtcGxhdGUgd2l0aCBhbiBpbml0aWFsIGRhdGEgbW9kZWwKICAgICAqICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLnN0YW1wKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVXNlcnMgb2YgYFRlbXBsYXRpemVyYCBtYXkgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBhYnN0cmFjdAogICAgICogQVBJJ3MgdG8gZGV0ZXJtaW5lIGhvdyBwcm9wZXJ0aWVzIGFuZCBwYXRocyBmcm9tIHRoZSBob3N0IHNob3VsZCBiZQogICAgICogZm9yd2FyZGVkIGludG8gdG8gaW5zdGFuY2VzOgogICAgICoKICAgICAqICAgICBfZm9yd2FyZEhvc3RQcm9wVjI6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKQogICAgICoKICAgICAqIExpa2V3aXNlLCB1c2VycyBtYXkgaW1wbGVtZW50IHRoZXNlIGFkZGl0aW9uYWwgYWJzdHJhY3QgQVBJJ3MgdG8gZGV0ZXJtaW5lCiAgICAgKiBob3cgaW5zdGFuY2Utc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNoYW5nZSBvbiB0aGUgaW5zdGFuY2Ugc2hvdWxkIGJlCiAgICAgKiBmb3J3YXJkZWQgb3V0IHRvIHRoZSBob3N0LCBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogICAgIF9ub3RpZnlJbnN0YW5jZVByb3BWMjogZnVuY3Rpb24oaW5zdCwgcHJvcCwgdmFsdWUpCiAgICAgKgogICAgICogSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluc3RhbmNlLXNwZWNpZmljIGFuZCByZXF1aXJlCiAgICAgKiBjdXN0b20gbm90aWZpY2F0aW9uIHZpYSBgX25vdGlmeUluc3RhbmNlUHJvcGAsIGRlZmluZSBhbiBgX2luc3RhbmNlUHJvcHNgCiAgICAgKiBvYmplY3QgY29udGFpbmluZyBrZXlzIGZvciBlYWNoIGluc3RhbmNlIHByb3AsIGZvciBleGFtcGxlOgogICAgICoKICAgICAqICAgICBfaW5zdGFuY2VQcm9wczogewogICAgICogICAgICAgaXRlbTogdHJ1ZSwKICAgICAqICAgICAgIGluZGV4OiB0cnVlCiAgICAgKiAgICAgfQogICAgICoKICAgICAqIEFueSBwcm9wZXJ0aWVzIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIF9pbnN0YW5jZVByb3AKICAgICAqIHdpbGwgYmUgZm9yd2FyZGVkIG91dCB0byB0aGUgVGVtcGxhdGl6ZSBgb3duZXJgIGF1dG9tYXRpY2FsbHkuCiAgICAgKgogICAgICogVXNlcnMgbWF5IGFsc28gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgYWJzdHJhY3QgZnVuY3Rpb24gdG8gc2hvdyBvcgogICAgICogaGlkZSBhbnkgRE9NIGdlbmVyYXRlZCB1c2luZyBgc3RhbXBgOgogICAgICoKICAgICAqICAgICBfc2hvd0hpZGVDaGlsZHJlbjogZnVuY3Rpb24oc2hvdWxkSGlkZSkKICAgICAqCiAgICAgKiBOb3RlIHRoYXQgc29tZSBjYWxsYmFja3MgYXJlIHN1ZmZpeGVkIHdpdGggYFYyYCBpbiB0aGUgUG9seW1lciAyLnggYmVoYXZpb3IKICAgICAqIGFzIHRoZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIGRpZmZlciBmcm9tIHRoZSBjYWxsYmFja3MgcmVxdWlyZWQKICAgICAqIGJ5IHRoZSAxLnggVGVtcGxhdGl6ZXIgQVBJIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBgVGVtcGxhdGVJbnN0YW5jZWAgQVBJCiAgICAgKiBiZXR3ZWVuIHZlcnNpb25zIDEueCBhbmQgMi54LgogICAgICoKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplciA9IHsKCiAgICAgIC8qKgogICAgICAgKiBHZW5lcmF0ZXMgYW4gYW5vbnltb3VzIGBUZW1wbGF0ZUluc3RhbmNlYCBjbGFzcyAoc3RvcmVkIGFzIGB0aGlzLmN0b3JgKQogICAgICAgKiBmb3IgdGhlIHByb3ZpZGVkIHRlbXBsYXRlLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlcgogICAgICAgKiB0ZW1wbGF0ZSB0byBwcmVwYXJlIGFuIGVsZW1lbnQgZm9yIHN0YW1waW5nIHRoZSB0ZW1wbGF0ZSwgZm9sbG93ZWQKICAgICAgICogYnkgYHN0YW1wYCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGUgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHByZXBhcmUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gbXV0YWJsZURhdGEgV2hlbiBgdHJ1ZWAsIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBza2lwCiAgICAgICAqICAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvCiAgICAgICAqICAgYmUgImRpcnR5IikuIERlZmF1bHRzIHRvIGZhbHNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAdGhpcyB7VGVtcGxhdGl6ZXJVc2VyfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgbXV0YWJsZURhdGEpIHsKICAgICAgICB0aGlzLl90ZW1wbGF0aXplclRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgdGhpcy5jdG9yID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgIG11dGFibGVEYXRhOiBCb29sZWFuKG11dGFibGVEYXRhKSwKICAgICAgICAgIHBhcmVudE1vZGVsOiB0aGlzLl9wYXJlbnRNb2RlbCwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IHRoaXMuX2luc3RhbmNlUHJvcHMsCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IHRoaXMuX2ZvcndhcmRIb3N0UHJvcFYyLAogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiB0aGlzLl9ub3RpZnlJbnN0YW5jZVByb3BWMgogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIHByZXBhcmVkIGJ5IGB0ZW1wbGF0aXplYC4gIFRoZSBvYmplY3QKICAgICAgICogcmV0dXJuZWQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFub255bW91cyBjbGFzcyBnZW5lcmF0ZWQgYnkgYHRlbXBsYXRpemVgCiAgICAgICAqIHdob3NlIGByb290YCBwcm9wZXJ0eSBpcyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgbmV3bHkgY2xvbmVkCiAgICAgICAqIHRlbXBsYXRlIGNvbnRlbnQsIGFuZCB3aGljaCBoYXMgcHJvcGVydHkgYWNjZXNzb3JzIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgICogcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRlbXBsYXRlIGJpbmRpbmdzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG1vZGVsIE9iamVjdCBjb250YWluaW5nIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzIHRvCiAgICAgICAqICAgcG9wdWxhdGUgaW50byB0aGUgdGVtcGxhdGUgYmluZGluZ3MuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBSZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlIG9mCiAgICAgICAqIHRoZSB0ZW1wbGF0ZSBwcmVwYXJlZCBieSBgdGVtcGxhdGl6ZWAuCiAgICAgICAqIEB0aGlzIHtUZW1wbGF0aXplclVzZXJ9CiAgICAgICAqLwogICAgICBzdGFtcChtb2RlbCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jdG9yKG1vZGVsKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSAibW9kZWwiIChgVGVtcGxhdGVJbnN0YW5jZWApIGFzc29jaWF0ZWQgd2l0aAogICAgICAgKiBhIGdpdmVuIGVsZW1lbnQsIHdoaWNoIHNlcnZlcyBhcyB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIHRlbXBsYXRlCiAgICAgICAqIGluc3RhbmNlIHRoZSBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbi4gIEEgdGVtcGxhdGUgbW9kZWwgc2hvdWxkIGJlIHVzZWQKICAgICAgICogdG8gbWFuaXB1bGF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAgICogQHJldHVybiB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9IE1vZGVsIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBzY29wZSBmb3IKICAgICAgICogICB0aGUgZWxlbWVudC4KICAgICAgICogQHRoaXMge1RlbXBsYXRpemVyVXNlcn0KICAgICAgICovCiAgICAgIG1vZGVsRm9yRWxlbWVudChlbCkgewogICAgICAgIHJldHVybiBQb2x5bWVyLlRlbXBsYXRpemUubW9kZWxGb3JFbGVtZW50KHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsIGVsKTsKICAgICAgfQogICAgfTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9HZXN0dXJlRXZlbnRMaXN0ZW5lcnN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBkb21CaW5kQmFzZSA9CiAgICAgIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKAogICAgICAgIFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YSgKICAgICAgICAgIFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxFbGVtZW50KSkpOwoKICAgIC8qKgogICAgICogQ3VzdG9tIGVsZW1lbnQgdG8gYWxsb3cgdXNpbmcgUG9seW1lcidzIHRlbXBsYXRlIGZlYXR1cmVzIChkYXRhIGJpbmRpbmcsCiAgICAgKiBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMsIGV0Yy4pIGluIHRoZSBtYWluIGRvY3VtZW50IHdpdGhvdXQgZGVmaW5pbmcKICAgICAqIGEgbmV3IGN1c3RvbSBlbGVtZW50LgogICAgICoKICAgICAqIGA8dGVtcGxhdGU+YCB0YWdzIHV0aWxpemluZyBiaW5kaW5ncyBtYXkgYmUgd3JhcHBlZCB3aXRoIHRoZSBgPGRvbS1iaW5kPmAKICAgICAqIGVsZW1lbnQsIHdoaWNoIHdpbGwgaW1tZWRpYXRlbHkgc3RhbXAgdGhlIHdyYXBwZWQgdGVtcGxhdGUgaW50byB0aGUgbWFpbgogICAgICogZG9jdW1lbnQgYW5kIGJpbmQgZWxlbWVudHMgdG8gdGhlIGBkb20tYmluZGAgZWxlbWVudCBpdHNlbGYgYXMgdGhlCiAgICAgKiBiaW5kaW5nIHNjb3BlLgogICAgICoKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAY3VzdG9tRWxlbWVudAogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cwogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5HZXN0dXJlRXZlbnRMaXN0ZW5lcnMKICAgICAqIEBleHRlbmRzIHtkb21CaW5kQmFzZX0KICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0byBhbGxvdyB1c2luZyBQb2x5bWVyJ3MgdGVtcGxhdGUgZmVhdHVyZXMgKGRhdGEKICAgICAqICAgYmluZGluZywgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLCBldGMuKSBpbiB0aGUgbWFpbiBkb2N1bWVudC4KICAgICAqLwogICAgY2xhc3MgRG9tQmluZCBleHRlbmRzIGRvbUJpbmRCYXNlIHsKCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydtdXRhYmxlLWRhdGEnXTsgfQoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLWJpbmQgbm90IGFsbG93ZWRgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yb290ID0gbnVsbDsKICAgICAgICB0aGlzLiQgPSBudWxsOwogICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IG51bGw7CiAgICAgIH0KCiAgICAgIC8qKiBAcmV0dXJuIHt2b2lkfSAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soKSB7CiAgICAgICAgLy8gYXNzdW1lcyBvbmx5IG9uZSBvYnNlcnZlZCBhdHRyaWJ1dGUKICAgICAgICB0aGlzLm11dGFibGVEYXRhID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLyoqIEByZXR1cm4ge3ZvaWR9ICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICB9CgogICAgICAvKiogQHJldHVybiB7dm9pZH0gKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgdGhpcy5fX3JlbW92ZUNoaWxkcmVuKCk7CiAgICAgIH0KCiAgICAgIF9faW5zZXJ0Q2hpbGRyZW4oKSB7CiAgICAgICAgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnJvb3QsIHRoaXMpOwogICAgICB9CgogICAgICBfX3JlbW92ZUNoaWxkcmVuKCkgewogICAgICAgIGlmICh0aGlzLl9fY2hpbGRyZW4pIHsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuX19jaGlsZHJlbltpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gVGhpcyBpcyB0eXBpY2FsbHkgb25seQogICAgICAgKiBuZWNlc3NhcnkgdG8gY2FsbCBpZiBIVE1MSW1wb3J0cyB3aXRoIHRoZSBhc3luYyBhdHRyaWJ1dGUgYXJlIHVzZWQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZW5kZXIoKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlOwogICAgICAgIGlmICghdGhpcy5fX2NoaWxkcmVuKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGVtcGxhdGUgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICAgIGlmICghdGVtcGxhdGUpIHsKICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBjaGlsZExpc3QgY2hhbmdlcyBhbmQgdGVtcGxhdGUgc2hvdWxkIGJlIHRoZXJlIGJ5IHRoZW4KICAgICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICAgIHRlbXBsYXRlID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykpOwogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb20tYmluZCByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj10aGlzLnJvb3QuZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIHRoaXMuX19jaGlsZHJlblt0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoXSA9IG47CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnNlcnRDaGlsZHJlbigpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KCiAgICB9CgogICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkb20tYmluZCcsIERvbUJpbmQpOwoKICAgIC8qKiBAY29uc3QgKi8KICAgIFBvbHltZXIuRG9tQmluZCA9IERvbUJpbmQ7CgogIH0pKCk7CgoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qKgogICAgICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc3RhdGljIHN0cmluZyB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIKICAgICAqIHN0cmluZ3MgYnkgYXNzZXRpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIHZpYSB0aGlzIGNsYXNzLiBUaGUKICAgICAqIGB2YWx1ZWAgcHJvcGVydHkgcmV0dXJucyB0aGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgKi8KICAgIGNsYXNzIExpdGVyYWxTdHJpbmcgewogICAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLnZhbHVlID0gc3RyaW5nLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTGl0ZXJhbFN0cmluZyBzdHJpbmcgdmFsdWUKICAgICAgICovCiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE9iamVjdCB0byBzdHJpbmdpZnkgaW50byBIVE1MCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5naWZpZWQgZm9ybSBvZiBgb2JqYAogICAgICovCiAgICBmdW5jdGlvbiBsaXRlcmFsVmFsdWUodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGl0ZXJhbFN0cmluZykgewogICAgICAgIHJldHVybiAvKiogQHR5cGUgeyFMaXRlcmFsU3RyaW5nfSAqLyh2YWx1ZSkudmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tbGl0ZXJhbCB2YWx1ZSBwYXNzZWQgdG8gUG9seW1lci5odG1sTGl0ZXJhbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTAogICAgICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamAKICAgICAqLwogICAgZnVuY3Rpb24gaHRtbFZhbHVlKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudCB9ICovKHZhbHVlKS5pbm5lckhUTUw7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXRlcmFsU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIGxpdGVyYWxWYWx1ZSh2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tdGVtcGxhdGUgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIuaHRtbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0aGF0IGNyZWF0ZXMgYW4gSFRNTCA8dGVtcGxhdGU+IGVsZW1lbnQgZnJvbSB0aGUKICAgICAqIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcuCiAgICAgKgogICAgICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIGEgUG9seW1lciBUZW1wbGF0ZSBpbiBKYXZhU2NyaXB0LgogICAgICoKICAgICAqIFRlbXBsYXRlcyBjYW4gYmUgY29tcG9zZWQgYnkgaW50ZXJwb2xhdGluZyBgSFRNTFRlbXBsYXRlRWxlbWVudGBzIGluCiAgICAgKiBleHByZXNzaW9ucyBpbiB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLiBUaGUgbmVzdGVkIHRlbXBsYXRlJ3MKICAgICAqIGBpbm5lckhUTUxgIGlzIGluY2x1ZGVkIGluIHRoZSBjb250YWluaW5nIHRlbXBsYXRlLiAgVGhlIG9ubHkgb3RoZXIKICAgICAqIHZhbHVlcyBhbGxvd2VkIGluIGV4cHJlc3Npb25zIGFyZSB0aG9zZSByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmh0bWxMaXRlcmFsYAogICAgICogd2hpY2ggZW5zdXJlcyBvbmx5IGxpdGVyYWwgdmFsdWVzIGZyb20gSlMgc291cmNlIGV2ZXIgcmVhY2ggdGhlIEhUTUwsIHRvCiAgICAgKiBndWFyZCBhZ2FpbnN0IFhTUyByaXNrcy4KICAgICAqCiAgICAgKiBBbGwgb3RoZXIgdmFsdWVzIGFyZSBkaXNhbGxvd2VkIGluIGV4cHJlc3Npb25zIHRvIGhlbHAgcHJldmVudCBYU1MKICAgICAqIGF0dGFja3M7IGhvd2V2ZXIsIGBQb2x5bWVyLmh0bWxMaXRlcmFsYCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIHN0YXRpYwogICAgICogc3RyaW5nIHZhbHVlcyBpbnRvIHRlbXBsYXRlcy4gVGhpcyBpcyB1c2VmdWwgdG8gY29tcG9zZSBzdHJpbmdzIGludG8KICAgICAqIHBsYWNlcyB0aGF0IGRvIG5vdCBhY2NlcHQgaHRtbCwgbGlrZSB0aGUgY3NzIHRleHQgb2YgYSBgc3R5bGVgCiAgICAgKiBlbGVtZW50LgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgKiAgICAgICByZXR1cm4gUG9seW1lci5odG1sYAogICAgICogICAgICAgICA8c3R5bGU+Omhvc3R7IGNvbnRlbnQ6Ii4uLiIgfTwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3RoaXMucGFydGlhbFRlbXBsYXRlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBwYXJ0aWFsVGVtcGxhdGUoKSB7IHJldHVybiBQb2x5bWVyLmh0bWxgPHNwYW4+UGFydGlhbCE8L3NwYW4+YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBDb25zdHJ1Y3RlZCBIVE1MVGVtcGxhdGVFbGVtZW50CiAgICAgKi8KICAgIFBvbHltZXIuaHRtbCA9IGZ1bmN0aW9uIGh0bWwoc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIGNvbnN0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8oZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKSk7CiAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PgogICAgICAgICAgYWNjICsgaHRtbFZhbHVlKHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSk7CiAgICAgIHJldHVybiB0ZW1wbGF0ZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBBbiBodG1sIGxpdGVyYWwgdGFnIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBgUG9seW1lci5odG1sYCB0byBjb21wb3NlLgogICAgICogYSBsaXRlcmFsIHN0cmluZy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICogICAgICAgcmV0dXJuIFBvbHltZXIuaHRtbGAKICAgICAqICAgICAgICAgPHN0eWxlPgogICAgICogICAgICAgICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0KICAgICAqICAgICAgICAgICAke3N0eWxlVGVtcGxhdGV9CiAgICAgKiAgICAgICAgIDwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3N0YXRpY1ZhbHVlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBzdHlsZVRlbXBsYXRlKCkgeyByZXR1cm4gUG9seW1lci5odG1sTGl0ZXJhbGAuc2hhZG93ZWQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFMaXRlcmFsU3RyaW5nfSBDb25zdHJ1Y3RlZCBsaXRlcmFsIHN0cmluZwogICAgICovCiAgICBQb2x5bWVyLmh0bWxMaXRlcmFsID0gZnVuY3Rpb24oc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZyh2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT4KICAgICAgICAgIGFjYyArIGxpdGVyYWxWYWx1ZSh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pKTsKICAgIH07CiAgfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBCYXNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzCiAgICogICBrZXkgbWV0YS1wcm9ncmFtbWluZyBmZWF0dXJlcyBpbmNsdWRpbmcgdGVtcGxhdGUgc3RhbXBpbmcsIGRhdGEtYmluZGluZywKICAgKiAgIGF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24sIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24KICAgKi8KICBQb2x5bWVyLkVsZW1lbnQgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAqIEBleHRlbmRzIHtQb2x5bWVyLkVsZW1lbnR9CiAgICogQHByaXZhdGUKICAgKi8KICBjb25zdCBkb21SZXBlYXRCYXNlID0gUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhKFBvbHltZXIuRWxlbWVudCk7CgogIC8qKgogICAqIFRoZSBgPGRvbS1yZXBlYXQ+YCBlbGVtZW50IHdpbGwgYXV0b21hdGljYWxseSBzdGFtcCBhbmQgYmluZHMgb25lIGluc3RhbmNlCiAgICogb2YgdGVtcGxhdGUgY29udGVudCB0byBlYWNoIG9iamVjdCBpbiBhIHVzZXItcHJvdmlkZWQgYXJyYXkuCiAgICogYGRvbS1yZXBlYXRgIGFjY2VwdHMgYW4gYGl0ZW1zYCBwcm9wZXJ0eSwgYW5kIG9uZSBpbnN0YW5jZSBvZiB0aGUgdGVtcGxhdGUKICAgKiBpcyBzdGFtcGVkIGZvciBlYWNoIGl0ZW0gaW50byB0aGUgRE9NIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgYGRvbS1yZXBlYXRgCiAgICogZWxlbWVudC4gIFRoZSBgaXRlbWAgcHJvcGVydHkgd2lsbCBiZSBzZXQgb24gZWFjaCBpbnN0YW5jZSdzIGJpbmRpbmcKICAgKiBzY29wZSwgdGh1cyB0ZW1wbGF0ZXMgc2hvdWxkIGJpbmQgdG8gc3ViLXByb3BlcnRpZXMgb2YgYGl0ZW1gLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYGh0bWwKICAgKiA8ZG9tLW1vZHVsZSBpZD0iZW1wbG95ZWUtbGlzdCI+CiAgICoKICAgKiAgIDx0ZW1wbGF0ZT4KICAgKgogICAqICAgICA8ZGl2PiBFbXBsb3llZSBsaXN0OiA8L2Rpdj4KICAgKiAgICAgPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBXaXRoIHRoZSBmb2xsb3dpbmcgY3VzdG9tIGVsZW1lbnQgZGVmaW5pdGlvbjoKICAgKgogICAqIGBgYGpzCiAgICogY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZW1wbG95ZWUtbGlzdCc7IH0KICAgKiAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgKiAgICAgcmV0dXJuIHsKICAgKiAgICAgICBlbXBsb3llZXM6IHsKICAgKiAgICAgICAgIHZhbHVlKCkgewogICAqICAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAgIHtmaXJzdDogJ0JvYicsIGxhc3Q6ICdTbWl0aCd9LAogICAqICAgICAgICAgICAgIHtmaXJzdDogJ1NhbGx5JywgbGFzdDogJ0pvaG5zb24nfSwKICAgKiAgICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICAgXTsKICAgKiAgICAgICAgIH0KICAgKiAgICAgICB9CiAgICogICAgIH07CiAgICogICB9CiAgICogfQogICAqIGBgYAogICAqCiAgICogTm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlcyB0byBpdGVtcyBzdWItcHJvcGVydGllcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0ZW1wbGF0ZQogICAqIGluc3RhbmNlcywgd2hpY2ggd2lsbCB1cGRhdGUgdmlhIHRoZSBub3JtYWwgc3RydWN0dXJlZCBkYXRhIG5vdGlmaWNhdGlvbiBzeXN0ZW0uCiAgICoKICAgKiBNdXRhdGlvbnMgdG8gdGhlIGBpdGVtc2AgYXJyYXkgaXRzZWxmIHNob3VsZCBiZSBtYWRlIHVzaW5nIHRoZSBBcnJheQogICAqIG11dGF0aW9uIEFQSSdzIG9uIGBQb2x5bWVyLkJhc2VgIChgcHVzaGAsIGBwb3BgLCBgc3BsaWNlYCwgYHNoaWZ0YCwKICAgKiBgdW5zaGlmdGApLCBhbmQgdGVtcGxhdGUgaW5zdGFuY2VzIHdpbGwgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGRhdGEgaW4gdGhlCiAgICogYXJyYXkuCiAgICoKICAgKiBFdmVudHMgY2F1Z2h0IGJ5IGV2ZW50IGhhbmRsZXJzIHdpdGhpbiB0aGUgYGRvbS1yZXBlYXRgIHRlbXBsYXRlIHdpbGwgYmUKICAgKiBkZWNvcmF0ZWQgd2l0aCBhIGBtb2RlbGAgcHJvcGVydHksIHdoaWNoIHJlcHJlc2VudHMgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICogZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZS4gIFRoZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBQb2x5bWVyLkJhc2UsIGFuZCBzaG91bGQKICAgKiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgZGF0YSBvbiB0aGUgaW5zdGFuY2UsIGZvciBleGFtcGxlCiAgICogYGV2ZW50Lm1vZGVsLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7YC4KICAgKgogICAqIEFsdGVybmF0aXZlbHksIHRoZSBtb2RlbCBmb3IgYSB0ZW1wbGF0ZSBpbnN0YW5jZSBmb3IgYW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICogYSBgZG9tLXJlcGVhdGAgY2FuIGJlIG9idGFpbmVkIHVzaW5nIHRoZSBgbW9kZWxGb3JFbGVtZW50YCBBUEkgb24gdGhlCiAgICogYGRvbS1yZXBlYXRgIHRoYXQgc3RhbXBlZCBpdCwgZm9yIGV4YW1wbGUKICAgKiBgdGhpcy4kLmRvbVJlcGVhdC5tb2RlbEZvckVsZW1lbnQoZXZlbnQudGFyZ2V0KS5zZXQoJ2l0ZW0uY2hlY2tlZCcsIHRydWUpO2AuCiAgICogVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBtYW5pcHVsYXRpbmcgaW5zdGFuY2UgZGF0YSBvZiBldmVudCB0YXJnZXRzIG9idGFpbmVkCiAgICogYnkgZXZlbnQgaGFuZGxlcnMgb24gcGFyZW50cyBvZiB0aGUgYGRvbS1yZXBlYXRgIChldmVudCBkZWxlZ2F0aW9uKS4KICAgKgogICAqIEEgdmlldy1zcGVjaWZpYyBmaWx0ZXIvc29ydCBtYXkgYmUgYXBwbGllZCB0byBlYWNoIGBkb20tcmVwZWF0YCBieSBzdXBwbHlpbmcgYQogICAqIGBmaWx0ZXJgIGFuZC9vciBgc29ydGAgcHJvcGVydHkuICBUaGlzIG1heSBiZSBhIHN0cmluZyB0aGF0IG5hbWVzIGEgZnVuY3Rpb24gb24KICAgKiB0aGUgaG9zdCwgb3IgYSBmdW5jdGlvbiBtYXkgYmUgYXNzaWduZWQgdG8gdGhlIHByb3BlcnR5IGRpcmVjdGx5LiAgVGhlIGZ1bmN0aW9ucwogICAqIHNob3VsZCBpbXBsZW1lbnRlZCBmb2xsb3dpbmcgdGhlIHN0YW5kYXJkIGBBcnJheWAgZmlsdGVyL3NvcnQgQVBJLgogICAqCiAgICogSW4gb3JkZXIgdG8gcmUtcnVuIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbnMgYmFzZWQgb24gY2hhbmdlcyB0byBzdWItZmllbGRzCiAgICogb2YgYGl0ZW1zYCwgdGhlIGBvYnNlcnZlYCBwcm9wZXJ0eSBtYXkgYmUgc2V0IGFzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YKICAgKiBgaXRlbWAgc3ViLWZpZWxkcyB0aGF0IHNob3VsZCBjYXVzZSBhIHJlLWZpbHRlci9zb3J0IHdoZW4gbW9kaWZpZWQuICBJZgogICAqIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbiBkZXBlbmRzIG9uIHByb3BlcnRpZXMgbm90IGNvbnRhaW5lZCBpbiBgaXRlbXNgLAogICAqIHRoZSB1c2VyIHNob3VsZCBvYnNlcnZlIGNoYW5nZXMgdG8gdGhvc2UgcHJvcGVydGllcyBhbmQgY2FsbCBgcmVuZGVyYCB0byB1cGRhdGUKICAgKiB0aGUgdmlldyBiYXNlZCBvbiB0aGUgZGVwZW5kZW5jeSBjaGFuZ2UuCiAgICoKICAgKiBGb3IgZXhhbXBsZSwgZm9yIGFuIGBkb20tcmVwZWF0YCB3aXRoIGEgZmlsdGVyIG9mIHRoZSBmb2xsb3dpbmc6CiAgICoKICAgKiBgYGBqcwogICAqIGlzRW5naW5lZXIoaXRlbSkgewogICAqICAgcmV0dXJuIGl0ZW0udHlwZSA9PSAnZW5naW5lZXInIHx8IGl0ZW0ubWFuYWdlci50eXBlID09ICdlbmdpbmVlcic7CiAgICogfQogICAqIGBgYAogICAqCiAgICogVGhlbiB0aGUgYG9ic2VydmVgIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmVkIGFzIGZvbGxvd3M6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIGZpbHRlcj0iaXNFbmdpbmVlciIgb2JzZXJ2ZT0idHlwZSBtYW5hZ2VyLnR5cGUiPgogICAqIGBgYAogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGV4dGVuZHMge2RvbVJlcGVhdEJhc2V9CiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3Igc3RhbXBpbmcgaW5zdGFuY2Ugb2YgYSB0ZW1wbGF0ZSBib3VuZCB0bwogICAqICAgaXRlbXMgaW4gYW4gYXJyYXkuCiAgICovCiAgY2xhc3MgRG9tUmVwZWF0IGV4dGVuZHMgZG9tUmVwZWF0QmFzZSB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLXJlcGVhdCc7IH0KCiAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgeyByZXR1cm4gbnVsbDsgfQoKICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuZXZlciBET00gaXMgYWRkZWQgb3IgcmVtb3ZlZCBieSB0aGlzIHRlbXBsYXRlIChieQogICAgICAgKiBkZWZhdWx0LCByZW5kZXJpbmcgb2NjdXJzIGxhemlseSkuICBUbyBmb3JjZSBpbW1lZGlhdGUgcmVuZGVyaW5nLCBjYWxsCiAgICAgICAqIGByZW5kZXJgLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgZG9tLWNoYW5nZQogICAgICAgKi8KICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyBpdGVtcyBkZXRlcm1pbmluZyBob3cgbWFueSBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlCiAgICAgICAgICogdG8gc3RhbXAgYW5kIHRoYXQgdGhhdCBlYWNoIHRlbXBsYXRlIGluc3RhbmNlIHNob3VsZCBiaW5kIHRvLgogICAgICAgICAqLwogICAgICAgIGl0ZW1zOiB7CiAgICAgICAgICB0eXBlOiBBcnJheQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBhZGQgdG8gdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBhcnJheQogICAgICAgICAqIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgYXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbScKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIHdpdGggdGhlIGluZGV4CiAgICAgICAgICogb2YgdGhlIGluc3RhbmNlIGluIHRoZSBzb3J0ZWQgYW5kIGZpbHRlcmVkIGxpc3Qgb2YgcmVuZGVyZWQgaXRlbXMuCiAgICAgICAgICogTm90ZSwgZm9yIHRoZSBpbmRleCBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LCB1c2UgdGhlIHZhbHVlIG9mIHRoZQogICAgICAgICAqIGBpdGVtc0luZGV4QXNgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIGluZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaW5kZXgnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGFkZCB0byB0aGUgYmluZGluZyBzY29wZSB3aXRoIHRoZSBpbmRleAogICAgICAgICAqIG9mIHRoZSBpbnN0YW5jZSBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LiBOb3RlLCBmb3IgdGhlIGluZGV4IG9mCiAgICAgICAgICogdGhpcyBpbnN0YW5jZSBpbiB0aGUgc29ydGVkIGFuZCBmaWx0ZXJlZCBsaXN0IG9mIHJlbmRlcmVkIGl0ZW1zLAogICAgICAgICAqIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGBpbmRleEFzYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBpdGVtc0luZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbXNJbmRleCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGRldGVybWluZSB0aGUgc29ydCBvcmRlciBvZiB0aGUgaXRlbXMuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LnNvcnRgLgogICAgICAgICAqIFVzaW5nIGEgc29ydCBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSB1bmRlcmx5aW5nIGBpdGVtc2AgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgc29ydDogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fc29ydENoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBpdGVtcyBvdXQgb2YgdGhlIHZpZXcuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LmZpbHRlcmAuCiAgICAgICAgICogVXNpbmcgYSBmaWx0ZXIgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgdW5kZXJseWluZyBgaXRlbXNgIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGZpbHRlcjogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fZmlsdGVyQ2hhbmdlZCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHVzaW5nIGEgYGZpbHRlcmAgb3IgYHNvcnRgIGZ1bmN0aW9uLCB0aGUgYG9ic2VydmVgIHByb3BlcnR5CiAgICAgICAgICogc2hvdWxkIGJlIHNldCB0byBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiBpdGVtCiAgICAgICAgICogc3ViLWZpZWxkcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgcmUtc29ydCBvciByZS1maWx0ZXIgd2hlbiBjaGFuZ2VkLgogICAgICAgICAqIFRoZXNlIHNob3VsZCBnZW5lcmFsbHkgYmUgZmllbGRzIG9mIGBpdGVtYCB0aGF0IHRoZSBzb3J0IG9yIGZpbHRlcgogICAgICAgICAqIGZ1bmN0aW9uIGRlcGVuZHMgb24uCiAgICAgICAgICovCiAgICAgICAgb2JzZXJ2ZTogewogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX29ic2VydmVDaGFuZ2VkJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gdXNpbmcgYSBgZmlsdGVyYCBvciBgc29ydGAgZnVuY3Rpb24sIHRoZSBgZGVsYXlgIHByb3BlcnR5CiAgICAgICAgICogZGV0ZXJtaW5lcyBhIGRlYm91bmNlIHRpbWUgaW4gbXMgYWZ0ZXIgYSBjaGFuZ2UgdG8gb2JzZXJ2ZWQgaXRlbQogICAgICAgICAqIHByb3BlcnRpZXMgdGhhdCBtdXN0IHBhc3MgYmVmb3JlIHRoZSBmaWx0ZXIgb3Igc29ydCBpcyByZS1ydW4uCiAgICAgICAgICogVGhpcyBpcyB1c2VmdWwgaW4gcmF0ZS1saW1pdGluZyBzaHVmZmxpbmcgb2YgdGhlIHZpZXcgd2hlbgogICAgICAgICAqIGl0ZW0gY2hhbmdlcyBtYXkgYmUgZnJlcXVlbnQuCiAgICAgICAgICovCiAgICAgICAgZGVsYXk6IE51bWJlciwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnQgb2YgY3VycmVudGx5IHJlbmRlcmVkIGl0ZW1zIGFmdGVyIGBmaWx0ZXJgIChpZiBhbnkpIGhhcyBiZWVuIGFwcGxpZWQuCiAgICAgICAgICogSWYgImNodW5raW5nIG1vZGUiIGlzIGVuYWJsZWQsIGByZW5kZXJlZEl0ZW1Db3VudGAgaXMgdXBkYXRlZCBlYWNoIHRpbWUgYQogICAgICAgICAqIHNldCBvZiB0ZW1wbGF0ZSBpbnN0YW5jZXMgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICByZW5kZXJlZEl0ZW1Db3VudDogewogICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgcmVhZE9ubHk6IHRydWUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGFuIGluaXRpYWwgY291bnQgb2YgdGVtcGxhdGUgaW5zdGFuY2VzIHRvIHJlbmRlciBhZnRlciBzZXR0aW5nCiAgICAgICAgICogdGhlIGBpdGVtc2AgYXJyYXksIGJlZm9yZSB0aGUgbmV4dCBwYWludCwgYW5kIHB1dHMgdGhlIGBkb20tcmVwZWF0YAogICAgICAgICAqIGludG8gImNodW5raW5nIG1vZGUiLiAgVGhlIHJlbWFpbmluZyBpdGVtcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJlbmRlcmVkCiAgICAgICAgICogaW5jcmVtZW50YWxseSBhdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSB0aGVyb2YgdW50aWwgYWxsIGluc3RhbmNlcyBoYXZlCiAgICAgICAgICogYmVlbiByZW5kZXJlZC4KICAgICAgICAgKi8KICAgICAgICBpbml0aWFsQ291bnQ6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIG9ic2VydmVyOiAnX19pbml0aWFsaXplQ2h1bmtpbmcnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBgaW5pdGlhbENvdW50YCBpcyB1c2VkLCB0aGlzIHByb3BlcnR5IGRlZmluZXMgYSBmcmFtZSByYXRlIChpbgogICAgICAgICAqIGZwcykgdG8gdGFyZ2V0IGJ5IHRocm90dGxpbmcgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgcmVuZGVyZWQgZWFjaAogICAgICAgICAqIGZyYW1lIHRvIG5vdCBleGNlZWQgdGhlIGJ1ZGdldCBmb3IgdGhlIHRhcmdldCBmcmFtZSByYXRlLiAgVGhlCiAgICAgICAgICogZnJhbWVyYXRlIGlzIGVmZmVjdGl2ZWx5IHRoZSBudW1iZXIgb2YgYHJlcXVlc3RBbmltYXRpb25GcmFtZWBzIHRoYXQKICAgICAgICAgKiBpdCB0cmllcyB0byBhbGxvdyB0byBhY3R1YWxseSBmaXJlIGluIGEgZ2l2ZW4gc2Vjb25kLiBJdCBkb2VzIHRoaXMKICAgICAgICAgKiBieSBtZWFzdXJpbmcgdGhlIHRpbWUgYmV0d2VlbiBgckFGYHMgYW5kIGNvbnRpbnVvdXNseSBhZGp1c3RpbmcgdGhlCiAgICAgICAgICogbnVtYmVyIG9mIGl0ZW1zIGNyZWF0ZWQgZWFjaCBgckFGYCB0byBtYWludGFpbiB0aGUgdGFyZ2V0IGZyYW1lcmF0ZS4KICAgICAgICAgKiBTZXR0aW5nIHRoaXMgdG8gYSBoaWdoZXIgbnVtYmVyIGFsbG93cyBsb3dlciBsYXRlbmN5IGFuZCBoaWdoZXIKICAgICAgICAgKiB0aHJvdWdocHV0IGZvciBldmVudCBoYW5kbGVycyBhbmQgb3RoZXIgdGFza3MsIGJ1dCByZXN1bHRzIGluIGEKICAgICAgICAgKiBsb25nZXIgdGltZSBmb3IgdGhlIHJlbWFpbmluZyBpdGVtcyB0byBjb21wbGV0ZSByZW5kZXJpbmcuCiAgICAgICAgICovCiAgICAgICAgdGFyZ2V0RnJhbWVyYXRlOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICB2YWx1ZTogMjAKICAgICAgICB9LAoKICAgICAgICBfdGFyZ2V0RnJhbWVUaW1lOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICBjb21wdXRlZDogJ19fY29tcHV0ZUZyYW1lVGltZSh0YXJnZXRGcmFtZXJhdGUpJwogICAgICAgIH0KCiAgICAgIH07CgogICAgfQoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICByZXR1cm4gWyAnX19pdGVtc0NoYW5nZWQoaXRlbXMuKiknIF07CiAgICB9CgogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuX19pbnN0YW5jZXMgPSBbXTsKICAgICAgdGhpcy5fX2xpbWl0ID0gSW5maW5pdHk7CiAgICAgIHRoaXMuX19wb29sID0gW107CiAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBudWxsOwogICAgICB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHggPSB7fTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBudWxsOwogICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IG51bGw7CiAgICAgIHRoaXMuX19zb3J0Rm4gPSBudWxsOwogICAgICB0aGlzLl9fZmlsdGVyRm4gPSBudWxsOwogICAgICB0aGlzLl9fb2JzZXJ2ZVBhdGhzID0gbnVsbDsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IHRydWU7CiAgICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuX19pc0RldGFjaGVkID0gdHJ1ZTsKICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzLl9fZGV0YWNoSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIC8vIG9ubHkgcGVyZm9ybSBhdHRhY2htZW50IGlmIHRoZSBlbGVtZW50IHdhcyBwcmV2aW91c2x5IGRldGFjaGVkLgogICAgICBpZiAodGhpcy5fX2lzRGV0YWNoZWQpIHsKICAgICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IGZhbHNlOwogICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuX19hdHRhY2hJbnN0YW5jZShpLCBwYXJlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlVGVtcGxhdGl6ZWQoKSB7CiAgICAgIC8vIFRlbXBsYXRpemluZyAoZ2VuZXJhdGluZyB0aGUgaW5zdGFuY2UgY29uc3RydWN0b3IpIG5lZWRzIHRvIHdhaXQKICAgICAgLy8gdW50aWwgcmVhZHksIHNpbmNlIHdvbid0IGhhdmUgaXRzIHRlbXBsYXRlIGNvbnRlbnQgaGFuZGVkIGJhY2sgdG8KICAgICAgLy8gaXQgdW50aWwgdGhlbgogICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAvLyAvLyBXYWl0IHVudGlsIGNoaWxkTGlzdCBjaGFuZ2VzIGFuZCB0ZW1wbGF0ZSBzaG91bGQgYmUgdGhlcmUgYnkgdGhlbgogICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgIHRoaXMuX19yZW5kZXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RvbS1yZXBlYXQgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIFRlbXBsYXRlIGluc3RhbmNlIHByb3BzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gZm9yd2FyZGluZwogICAgICAgIGxldCBpbnN0YW5jZVByb3BzID0ge307CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmFzXSA9IHRydWU7CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmluZGV4QXNdID0gdHJ1ZTsKICAgICAgICBpbnN0YW5jZVByb3BzW3RoaXMuaXRlbXNJbmRleEFzXSA9IHRydWU7CiAgICAgICAgdGhpcy5fX2N0b3IgPSBQb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgdGhpcywgewogICAgICAgICAgbXV0YWJsZURhdGE6IHRoaXMubXV0YWJsZURhdGEsCiAgICAgICAgICBwYXJlbnRNb2RlbDogdHJ1ZSwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IGluc3RhbmNlUHJvcHMsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gc2V0CiAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCBwcm9wZXJ0eSB0bwogICAgICAgICAgICovCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7CiAgICAgICAgICAgIGxldCBpJCA9IHRoaXMuX19pbnN0YW5jZXM7CiAgICAgICAgICAgIGZvciAobGV0IGk9MCwgaW5zdDsgKGk8aSQubGVuZ3RoKSAmJiAoaW5zdD1pJFtpXSk7IGkrKykgewogICAgICAgICAgICAgIGluc3QuZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8qKgogICAgICAgICAgICogQHRoaXMge3RoaXN9CiAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5zdCBJbnN0YW5jZSB0byBub3RpZnkKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IHRvIG5vdGlmeQogICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBub3RpZnkKICAgICAgICAgICAqLwogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiBmdW5jdGlvbihpbnN0LCBwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICBpZiAoUG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcywgcHJvcCkpIHsKICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5zdFt0aGlzLml0ZW1zSW5kZXhBc107CiAgICAgICAgICAgICAgaWYgKHByb3AgPT0gdGhpcy5hcykgewogICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpZHhdID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxldCBwYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZSh0aGlzLmFzLCAnaXRlbXMuJyArIGlkeCwgcHJvcCk7CiAgICAgICAgICAgICAgdGhpcy5ub3RpZnlQYXRoKHBhdGgsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIF9fZ2V0TWV0aG9kSG9zdCgpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICByZXR1cm4gdGhpcy5fX2RhdGFIb3N0Ll9tZXRob2RIb3N0IHx8IHRoaXMuX19kYXRhSG9zdDsKICAgIH0KCiAgICBfX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUoZnVuY3Rpb25Pck1ldGhvZE5hbWUpIHsKICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbk9yTWV0aG9kTmFtZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICBsZXQgbWV0aG9kTmFtZSA9IGZ1bmN0aW9uT3JNZXRob2ROYW1lOwogICAgICAgIGxldCBvYmogPSB0aGlzLl9fZ2V0TWV0aG9kSG9zdCgpOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIG9ialttZXRob2ROYW1lXS5hcHBseShvYmosIGFyZ3VtZW50cyk7IH07CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbk9yTWV0aG9kTmFtZTsKICAgIH0KCiAgICBfX3NvcnRDaGFuZ2VkKHNvcnQpIHsKICAgICAgdGhpcy5fX3NvcnRGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKHNvcnQpOwogICAgICBpZiAodGhpcy5pdGVtcykgeyB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7IH0KICAgIH0KCiAgICBfX2ZpbHRlckNoYW5nZWQoZmlsdGVyKSB7CiAgICAgIHRoaXMuX19maWx0ZXJGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKGZpbHRlcik7CiAgICAgIGlmICh0aGlzLml0ZW1zKSB7IHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsgfQogICAgfQoKICAgIF9fY29tcHV0ZUZyYW1lVGltZShyYXRlKSB7CiAgICAgIHJldHVybiBNYXRoLmNlaWwoMTAwMC9yYXRlKTsKICAgIH0KCiAgICBfX2luaXRpYWxpemVDaHVua2luZygpIHsKICAgICAgaWYgKHRoaXMuaW5pdGlhbENvdW50KSB7CiAgICAgICAgdGhpcy5fX2xpbWl0ID0gdGhpcy5pbml0aWFsQ291bnQ7CiAgICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSB0aGlzLmluaXRpYWxDb3VudDsKICAgICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICB9CgogICAgX190cnlSZW5kZXJDaHVuaygpIHsKICAgICAgLy8gRGVib3VuY2VkIHNvIHRoYXQgbXVsdGlwbGUgY2FsbHMgdGhyb3VnaCBgX3JlbmRlcmAgYmV0d2VlbiBhbmltYXRpb24KICAgICAgLy8gZnJhbWVzIG9ubHkgcXVldWUgb25lIG5ldyByQUYgKGUuZy4gYXJyYXkgbXV0YXRpb24gJiBjaHVua2VkIHJlbmRlcikKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5fX2xpbWl0IDwgdGhpcy5pdGVtcy5sZW5ndGgpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlcXVlc3RSZW5kZXJDaHVuayk7CiAgICAgIH0KICAgIH0KCiAgICBfX3JlcXVlc3RSZW5kZXJDaHVuaygpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9fcmVuZGVyQ2h1bmsoKSk7CiAgICB9CgogICAgX19yZW5kZXJDaHVuaygpIHsKICAgICAgLy8gU2ltcGxlIGF1dG8gY2h1bmtTaXplIHRocm90dGxpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIGZlZWRiYWNrIGxvb3A6CiAgICAgIC8vIG1lYXN1cmUgYWN0dWFsIHRpbWUgYmV0d2VlbiBmcmFtZXMgYW5kIHNjYWxlIGNodW5rIGNvdW50IGJ5IHJhdGlvCiAgICAgIC8vIG9mIHRhcmdldC9hY3R1YWwgZnJhbWUgdGltZQogICAgICBsZXQgY3VyckNodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICBsZXQgcmF0aW8gPSB0aGlzLl90YXJnZXRGcmFtZVRpbWUgLyAoY3VyckNodW5rVGltZSAtIHRoaXMuX19sYXN0Q2h1bmtUaW1lKTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBNYXRoLnJvdW5kKHRoaXMuX19jaHVua0NvdW50ICogcmF0aW8pIHx8IDE7CiAgICAgIHRoaXMuX19saW1pdCArPSB0aGlzLl9fY2h1bmtDb3VudDsKICAgICAgdGhpcy5fX2xhc3RDaHVua1RpbWUgPSBjdXJyQ2h1bmtUaW1lOwogICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7CiAgICB9CgogICAgX19vYnNlcnZlQ2hhbmdlZCgpIHsKICAgICAgdGhpcy5fX29ic2VydmVQYXRocyA9IHRoaXMub2JzZXJ2ZSAmJgogICAgICAgIHRoaXMub2JzZXJ2ZS5yZXBsYWNlKCcuKicsICcuJykuc3BsaXQoJyAnKTsKICAgIH0KCiAgICBfX2l0ZW1zQ2hhbmdlZChjaGFuZ2UpIHsKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5pdGVtcykpIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2RvbS1yZXBlYXQgZXhwZWN0ZWQgYXJyYXkgZm9yIGBpdGVtc2AsIGZvdW5kJywgdGhpcy5pdGVtcyk7CiAgICAgIH0KICAgICAgLy8gSWYgcGF0aCB3YXMgdG8gYW4gaXRlbSAoZS5nLiAnaXRlbXMuMycgb3IgJ2l0ZW1zLjMuZm9vJyksIGZvcndhcmQgdGhlCiAgICAgIC8vIHBhdGggdG8gdGhhdCBpbnN0YW5jZSBzeW5jaHJvbm91c2x5IChyZXR1cm5zIGZhbHNlIGZvciBub24taXRlbSBwYXRocykKICAgICAgaWYgKCF0aGlzLl9faGFuZGxlSXRlbVBhdGgoY2hhbmdlLnBhdGgsIGNoYW5nZS52YWx1ZSkpIHsKICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBhcnJheSB3YXMgcmVzZXQgKCdpdGVtcycpIG9yIHNwbGljZWQgKCdpdGVtcy5zcGxpY2VzJyksCiAgICAgICAgLy8gc28gcXVldWUgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZUNodW5raW5nKCk7CiAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOwogICAgICB9CiAgICB9CgogICAgX19oYW5kbGVPYnNlcnZlZFBhdGhzKHBhdGgpIHsKICAgICAgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIHBhdGggY2hhbmdlcyBzaG91bGQgY2F1c2UgYSByZS1zb3J0L2ZpbHRlcgogICAgICBpZiAodGhpcy5fX3NvcnRGbiB8fCB0aGlzLl9fZmlsdGVyRm4pIHsKICAgICAgICBpZiAoIXBhdGgpIHsKICAgICAgICAgIC8vIEFsd2F5cyByZS1yZW5kZXIgaWYgdGhlIGl0ZW0gaXRzZWxmIGNoYW5nZWQKICAgICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLCB0aGlzLmRlbGF5KTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYnNlcnZlUGF0aHMpIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmUtcmVuZGVyIGlmIHRoZSBwYXRoIGNoYW5nZWQgbWF0Y2hlcyBhbiBvYnNlcnZlZCBwYXRoCiAgICAgICAgICBsZXQgcGF0aHMgPSB0aGlzLl9fb2JzZXJ2ZVBhdGhzOwogICAgICAgICAgZm9yIChsZXQgaT0wOyBpPHBhdGhzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YocGF0aHNbaV0pID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIsIHRoaXMuZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHRoaXM6RG9tUmVwZWF0KX0gZm4gRnVuY3Rpb24gdG8gZGVib3VuY2UuCiAgICAgKiBAcGFyYW0ge251bWJlcj19IGRlbGF5IERlbGF5IGluIG1zIHRvIGRlYm91bmNlIGJ5LgogICAgICovCiAgICBfX2RlYm91bmNlUmVuZGVyKGZuLCBkZWxheSA9IDApIHsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIGRlbGF5ID4gMCA/IFBvbHltZXIuQXN5bmMudGltZU91dC5hZnRlcihkZWxheSkgOiBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzawogICAgICAgICAgLCBmbi5iaW5kKHRoaXMpKTsKICAgICAgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIpOwogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIC8vIFF1ZXVlIHRoaXMgcmVwZWF0ZXIsIHRoZW4gZmx1c2ggYWxsIGluIG9yZGVyCiAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsKICAgICAgUG9seW1lci5mbHVzaCgpOwogICAgfQoKICAgIF9fcmVuZGVyKCkgewogICAgICBpZiAoIXRoaXMuX19lbnN1cmVUZW1wbGF0aXplZCgpKSB7CiAgICAgICAgLy8gTm8gdGVtcGxhdGUgZm91bmQgeWV0CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX19hcHBseUZ1bGxSZWZyZXNoKCk7CiAgICAgIC8vIFJlc2V0IHRoZSBwb29sCiAgICAgIC8vIFRPRE8oa3NjaGFhZik6IFJldXNlIHBvb2wgYWNyb3NzIHR1cm5zIGFuZCBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgIC8vIE5vdyB0aGF0IG9iamVjdHMvYXJyYXlzIGFyZSByZS1ldmFsdWF0ZWQgd2hlbiBzZXQsIHdlIGNhbiBzYWZlbHkKICAgICAgLy8gcmV1c2UgcG9vbGVkIGluc3RhbmNlcyBhY3Jvc3MgdHVybnMsIGhvd2V2ZXIgd2Ugc3RpbGwgbmVlZCB0byBkZWNpZGUKICAgICAgLy8gc2VtYW50aWNzIHJlZ2FyZGluZyBob3cgbG9uZyB0byBob2xkLCBob3cgbWFueSB0byBob2xkLCBldGMuCiAgICAgIHRoaXMuX19wb29sLmxlbmd0aCA9IDA7CiAgICAgIC8vIFNldCByZW5kZXJlZCBpdGVtIGNvdW50CiAgICAgIHRoaXMuX3NldFJlbmRlcmVkSXRlbUNvdW50KHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoKTsKICAgICAgLy8gTm90aWZ5IHVzZXJzCiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmRlciBtb3JlIGl0ZW1zCiAgICAgIHRoaXMuX190cnlSZW5kZXJDaHVuaygpOwogICAgfQoKICAgIF9fYXBwbHlGdWxsUmVmcmVzaCgpIHsKICAgICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcyB8fCBbXTsKICAgICAgbGV0IGlzbnRJZHhUb0l0ZW1zSWR4ID0gbmV3IEFycmF5KGl0ZW1zLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlzbnRJZHhUb0l0ZW1zSWR4W2ldID0gaTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIGZpbHRlcgogICAgICBpZiAodGhpcy5fX2ZpbHRlckZuKSB7CiAgICAgICAgaXNudElkeFRvSXRlbXNJZHggPSBpc250SWR4VG9JdGVtc0lkeC5maWx0ZXIoKGksIGlkeCwgYXJyYXkpID0+CiAgICAgICAgICB0aGlzLl9fZmlsdGVyRm4oaXRlbXNbaV0sIGlkeCwgYXJyYXkpKTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIHNvcnQKICAgICAgaWYgKHRoaXMuX19zb3J0Rm4pIHsKICAgICAgICBpc250SWR4VG9JdGVtc0lkeC5zb3J0KChhLCBiKSA9PiB0aGlzLl9fc29ydEZuKGl0ZW1zW2FdLCBpdGVtc1tiXSkpOwogICAgICB9CiAgICAgIC8vIGl0ZW1zLT5pbnN0IG1hcCBrZXB0IGZvciBpdGVtIHBhdGggZm9yd2FyZGluZwogICAgICBjb25zdCBpdGVtc0lkeFRvSW5zdElkeCA9IHRoaXMuX19pdGVtc0lkeFRvSW5zdElkeCA9IHt9OwogICAgICBsZXQgaW5zdElkeCA9IDA7CiAgICAgIC8vIEdlbmVyYXRlIGluc3RhbmNlcyBhbmQgYXNzaWduIGl0ZW1zCiAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oaXNudElkeFRvSXRlbXNJZHgubGVuZ3RoLCB0aGlzLl9fbGltaXQpOwogICAgICBmb3IgKDsgaW5zdElkeDxsaW1pdDsgaW5zdElkeCsrKSB7CiAgICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2luc3RJZHhdOwogICAgICAgIGxldCBpdGVtSWR4ID0gaXNudElkeFRvSXRlbXNJZHhbaW5zdElkeF07CiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpdGVtSWR4XTsKICAgICAgICBpdGVtc0lkeFRvSW5zdElkeFtpdGVtSWR4XSA9IGluc3RJZHg7CiAgICAgICAgaWYgKGluc3QpIHsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmFzLCBpdGVtKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmluZGV4QXMsIGluc3RJZHgpOwogICAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICAgIGluc3QuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9faW5zZXJ0SW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgaW5zdGFuY2VzIGZyb20gcHJldmlvdXMgc3RhdGUKICAgICAgZm9yIChsZXQgaT10aGlzLl9faW5zdGFuY2VzLmxlbmd0aC0xOyBpPj1pbnN0SWR4OyBpLS0pIHsKICAgICAgICB0aGlzLl9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICBfX2RldGFjaEluc3RhbmNlKGlkeCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgZm9yIChsZXQgaT0wOyBpPGluc3QuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZWwgPSBpbnN0LmNoaWxkcmVuW2ldOwogICAgICAgIGluc3Qucm9vdC5hcHBlbmRDaGlsZChlbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluc3Q7CiAgICB9CgogICAgX19hdHRhY2hJbnN0YW5jZShpZHgsIHBhcmVudCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShpbnN0LnJvb3QsIHRoaXMpOwogICAgfQoKICAgIF9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaWR4KSB7CiAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2RldGFjaEluc3RhbmNlKGlkeCk7CiAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgdGhpcy5fX3Bvb2wucHVzaChpbnN0KTsKICAgICAgfQogICAgICB0aGlzLl9faW5zdGFuY2VzLnNwbGljZShpZHgsIDEpOwogICAgfQoKICAgIF9fc3RhbXBJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KSB7CiAgICAgIGxldCBtb2RlbCA9IHt9OwogICAgICBtb2RlbFt0aGlzLmFzXSA9IGl0ZW07CiAgICAgIG1vZGVsW3RoaXMuaW5kZXhBc10gPSBpbnN0SWR4OwogICAgICBtb2RlbFt0aGlzLml0ZW1zSW5kZXhBc10gPSBpdGVtSWR4OwogICAgICByZXR1cm4gbmV3IHRoaXMuX19jdG9yKG1vZGVsKTsKICAgIH0KCiAgICBfX2luc2VydEluc3RhbmNlKGl0ZW0sIGluc3RJZHgsIGl0ZW1JZHgpIHsKICAgICAgbGV0IGluc3QgPSB0aGlzLl9fcG9vbC5wb3AoKTsKICAgICAgaWYgKGluc3QpIHsKICAgICAgICAvLyBUT0RPKGtzY2hhYWYpOiBJZiB0aGUgcG9vbCBpcyBzaGFyZWQgYWNyb3NzIHR1cm5zLCBob3N0UHJvcHMKICAgICAgICAvLyBuZWVkIHRvIGJlIHJlLXNldCB0byByZXVzZWQgaW5zdGFuY2VzIGluIGFkZGl0aW9uIHRvIGl0ZW0KICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5hcywgaXRlbSk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaW5kZXhBcywgaW5zdElkeCk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnN0ID0gdGhpcy5fX3N0YW1wSW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgIH0KICAgICAgbGV0IGJlZm9yZVJvdyA9IHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeCArIDFdOwogICAgICBsZXQgYmVmb3JlTm9kZSA9IGJlZm9yZVJvdyA/IGJlZm9yZVJvdy5jaGlsZHJlblswXSA6IHRoaXM7CiAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaW5zdC5yb290LCBiZWZvcmVOb2RlKTsKICAgICAgdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XSA9IGluc3Q7CiAgICAgIHJldHVybiBpbnN0OwogICAgfQoKICAgIC8vIEltcGxlbWVudHMgZXh0ZW5zaW9uIHBvaW50IGZyb20gVGVtcGxhdGl6ZSBtaXhpbgogICAgLyoqCiAgICAgKiBTaG93cyBvciBoaWRlcyB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdG9wIGxldmVsIGNoaWxkIGVsZW1lbnRzLiBGb3IKICAgICAqIHRleHQgbm9kZXMsIGB0ZXh0Q29udGVudGAgaXMgcmVtb3ZlZCB3aGlsZSAiaGlkZGVuIiBhbmQgcmVwbGFjZWQgd2hlbgogICAgICogInNob3duLiIKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGlkZGVuIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICogc2V0IHRvIGZhbHNlIHRvIHNob3cgdGhlbS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG93SGlkZUNoaWxkcmVuKGhpZGRlbikgewogICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHRoaXMuX19pbnN0YW5jZXNbaV0uX3Nob3dIaWRlQ2hpbGRyZW4oaGlkZGVuKTsKICAgICAgfQogICAgfQoKICAgIC8vIENhbGxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgaG9zdCBpdGVtcy48a2V5Pi48cGF0aD4gcGF0aCBjaGFuZ2UsCiAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90aWZ5aW5nIGl0ZW0uPHBhdGg+IGNoYW5nZXMgdG8gaW5zdCBmb3Iga2V5CiAgICBfX2hhbmRsZUl0ZW1QYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgIGxldCBpdGVtc1BhdGggPSBwYXRoLnNsaWNlKDYpOyAvLyAnaXRlbXMuJy5sZW5ndGggPT0gNgogICAgICBsZXQgZG90ID0gaXRlbXNQYXRoLmluZGV4T2YoJy4nKTsKICAgICAgbGV0IGl0ZW1zSWR4ID0gZG90IDwgMCA/IGl0ZW1zUGF0aCA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoMCwgZG90KTsKICAgICAgLy8gSWYgcGF0aCB3YXMgaW5kZXggaW50byBhcnJheS4uLgogICAgICBpZiAoaXRlbXNJZHggPT0gcGFyc2VJbnQoaXRlbXNJZHgsIDEwKSkgewogICAgICAgIGxldCBpdGVtU3ViUGF0aCA9IGRvdCA8IDAgPyAnJyA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoZG90KzEpOwogICAgICAgIC8vIElmIHRoZSBwYXRoIGlzIG9ic2VydmVkLCBpdCB3aWxsIHRyaWdnZXIgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faGFuZGxlT2JzZXJ2ZWRQYXRocyhpdGVtU3ViUGF0aCk7CiAgICAgICAgLy8gTm90ZSwgZXZlbiBpZiBhIHJ1bGwgcmVmcmVzaCBpcyB0cmlnZ2VyZWQsIGFsd2F5cyBkbyB0aGUgcGF0aAogICAgICAgIC8vIG5vdGlmaWNhdGlvbiBiZWNhdXNlIHVubGVzcyBtdXRhYmxlRGF0YSBpcyB1c2VkIGZvciBkb20tcmVwZWF0CiAgICAgICAgLy8gYW5kIGFsbCBlbGVtZW50cyBpbiB0aGUgaW5zdGFuY2Ugc3VidHJlZSwgYSBmdWxsIHJlZnJlc2ggbWF5CiAgICAgICAgLy8gbm90IHRyaWdnZXIgdGhlIHByb3BlciB1cGRhdGUuCiAgICAgICAgbGV0IGluc3RJZHggPSB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHhbaXRlbXNJZHhdOwogICAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XTsKICAgICAgICBpZiAoaW5zdCkgewogICAgICAgICAgbGV0IGl0ZW1QYXRoID0gdGhpcy5hcyArIChpdGVtU3ViUGF0aCA/ICcuJyArIGl0ZW1TdWJQYXRoIDogJycpOwogICAgICAgICAgLy8gVGhpcyBpcyBlZmZlY3RpdmVseSBgbm90aWZ5UGF0aGAsIGJ1dCBhdm9pZHMgc29tZSBvZiB0aGUgb3ZlcmhlYWQKICAgICAgICAgIC8vIG9mIHRoZSBwdWJsaWMgQVBJCiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoaXRlbVBhdGgsIHZhbHVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICAgKiB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqCiAgICAgKiBOb3RlLCB0byBtb2RpZnkgc3ViLXByb3BlcnRpZXMgb2YgdGhlIGl0ZW0sCiAgICAgKiBgbW9kZWxGb3JFbGVtZW50KGVsKS5zZXQoJ2l0ZW0uPHN1Yi1wcm9wPicsIHZhbHVlKWAKICAgICAqIHNob3VsZCBiZSB1c2VkLgogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gdGhlIGl0ZW0uCiAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudC4KICAgICAqLwogICAgaXRlbUZvckVsZW1lbnQoZWwpIHsKICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5tb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2VbdGhpcy5hc107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnN0IGluZGV4IGZvciBhIGdpdmVuIGVsZW1lbnQgc3RhbXBlZCBieSB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqIElmIGBzb3J0YCBpcyBwcm92aWRlZCwgdGhlIGluZGV4IHdpbGwgcmVmbGVjdCB0aGUgc29ydGVkIG9yZGVyIChyYXRoZXIKICAgICAqIHRoYW4gdGhlIG9yaWdpbmFsIGFycmF5IG9yZGVyKS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBpbmRleC4KICAgICAqIEByZXR1cm4gez9udW1iZXJ9IFJvdyBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgKG5vdGUgdGhpcyBtYXkKICAgICAqICAgbm90IGNvcnJlc3BvbmQgdG8gdGhlIGFycmF5IGluZGV4IGlmIGEgdXNlciBgc29ydGAgaXMgYXBwbGllZCkuCiAgICAgKi8KICAgIGluZGV4Rm9yRWxlbWVudChlbCkgewogICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLm1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVt0aGlzLmluZGV4QXNdOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBlbGVtZW50LCB3aGljaAogICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAqIGNvbnRhaW5lZCBpbi4gQSB0ZW1wbGF0ZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBgUG9seW1lci5CYXNlYCwgYW5kCiAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgIGxldCBtb2RlbCA9IG1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgKiAgIGlmIChtb2RlbC5pbmRleCA8IDEwKSB7CiAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAqICAgfQogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBNb2RlbCByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICAgKiAgIHRoZSBlbGVtZW50LgogICAgICovCiAgICBtb2RlbEZvckVsZW1lbnQoZWwpIHsKICAgICAgcmV0dXJuIFBvbHltZXIuVGVtcGxhdGl6ZS5tb2RlbEZvckVsZW1lbnQodGhpcy50ZW1wbGF0ZSwgZWwpOwogICAgfQoKICB9CgogIGN1c3RvbUVsZW1lbnRzLmRlZmluZShEb21SZXBlYXQuaXMsIERvbVJlcGVhdCk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbVJlcGVhdCA9IERvbVJlcGVhdDsKCn0pKCk7CgoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBUaGUgYDxkb20taWY+YCBlbGVtZW50IHdpbGwgc3RhbXAgYSBsaWdodC1kb20gYDx0ZW1wbGF0ZT5gIGNoaWxkIHdoZW4KICAgKiB0aGUgYGlmYCBwcm9wZXJ0eSBiZWNvbWVzIHRydXRoeSwgYW5kIHRoZSB0ZW1wbGF0ZSBjYW4gdXNlIFBvbHltZXIKICAgKiBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGZlYXR1cmVzIHdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZgogICAqIGEgUG9seW1lciBlbGVtZW50J3MgdGVtcGxhdGUuCiAgICoKICAgKiBXaGVuIGBpZmAgYmVjb21lcyBmYWxzeSwgdGhlIHN0YW1wZWQgY29udGVudCBpcyBoaWRkZW4gYnV0IG5vdAogICAqIHJlbW92ZWQgZnJvbSBkb20uIFdoZW4gYGlmYCBzdWJzZXF1ZW50bHkgYmVjb21lcyB0cnV0aHkgYWdhaW4sIHRoZSBjb250ZW50CiAgICogaXMgc2ltcGx5IHJlLXNob3duLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZHVlIHRvIGl0cyBmYXZvcmFibGUgcGVyZm9ybWFuY2UKICAgKiBjaGFyYWN0ZXJpc3RpY3M6IHRoZSBleHBlbnNlIG9mIGNyZWF0aW5nIHRlbXBsYXRlIGNvbnRlbnQgaXMgcGFpZCBvbmx5CiAgICogb25jZSBhbmQgbGF6aWx5LgogICAqCiAgICogU2V0IHRoZSBgcmVzdGFtcGAgcHJvcGVydHkgdG8gdHJ1ZSB0byBmb3JjZSB0aGUgc3RhbXBlZCBjb250ZW50IHRvIGJlCiAgICogY3JlYXRlZCAvIGRlc3Ryb3llZCB3aGVuIHRoZSBgaWZgIGNvbmRpdGlvbiBjaGFuZ2VzLgogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBleHRlbmRzIFBvbHltZXIuRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBjb25kaXRpb25hbGx5IHN0YW1wcyBhbmQgaGlkZXMgb3IgcmVtb3ZlcwogICAqICAgdGVtcGxhdGUgY29udGVudCBiYXNlZCBvbiBhIGJvb2xlYW4gZmxhZy4KICAgKi8KICBjbGFzcyBEb21JZiBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLWlmJzsgfQoKICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7IHJldHVybiBudWxsOyB9CgogICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewoKICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbmV2ZXIgRE9NIGlzIGFkZGVkIG9yIHJlbW92ZWQvaGlkZGVuIGJ5IHRoaXMgdGVtcGxhdGUgKGJ5CiAgICAgICAgICogZGVmYXVsdCwgcmVuZGVyaW5nIG9jY3VycyBsYXppbHkpLiAgVG8gZm9yY2UgaW1tZWRpYXRlIHJlbmRlcmluZywgY2FsbAogICAgICAgICAqIGByZW5kZXJgLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IGRvbS1jaGFuZ2UKICAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHRlbXBsYXRlIHNob3VsZCBzdGFtcC4KICAgICAgICAgKi8KICAgICAgICBpZjogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHRydWUsIGVsZW1lbnRzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIERPTSBhbmQgZGlzY2FyZGVkIHdoZW4gYGlmYAogICAgICAgICAqIGJlY29tZXMgZmFsc2UgYW5kIHJlLWNyZWF0ZWQgYW5kIGFkZGVkIGJhY2sgdG8gdGhlIERPTSB3aGVuIGBpZmAKICAgICAgICAgKiBiZWNvbWVzIHRydWUuICBCeSBkZWZhdWx0LCBzdGFtcGVkIGVsZW1lbnRzIHdpbGwgYmUgaGlkZGVuIGJ1dCBsZWZ0CiAgICAgICAgICogaW4gdGhlIERPTSB3aGVuIGBpZmAgYmVjb21lcyBmYWxzZSwgd2hpY2ggaXMgZ2VuZXJhbGx5IHJlc3VsdHMKICAgICAgICAgKiBpbiBiZXR0ZXIgcGVyZm9ybWFuY2UuCiAgICAgICAgICovCiAgICAgICAgcmVzdGFtcDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9CgogICAgICB9OwoKICAgIH0KCiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IG51bGw7CiAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICB0aGlzLl9faW5zdGFuY2UgPSBudWxsOwogICAgICB0aGlzLl9sYXN0SWYgPSBmYWxzZTsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgfQoKICAgIF9fZGVib3VuY2VSZW5kZXIoKSB7CiAgICAgIC8vIFJlbmRlciBpcyBhc3luYyBmb3IgMiByZWFzb25zOgogICAgICAvLyAxLiBUbyBlbGltaW5hdGUgZG9tIGNyZWF0aW9uIHRyYXNoaW5nIGlmIHVzZXIgY29kZSB0aHJhc2hlcyBgaWZgIGluIHRoZQogICAgICAvLyAgICBzYW1lIHR1cm4uIFRoaXMgd2FzIG1vcmUgY29tbW9uIGluIDEueCB3aGVyZSBhIGNvbXBvdW5kIGNvbXB1dGVkCiAgICAgIC8vICAgIHByb3BlcnR5IGNvdWxkIHJlc3VsdCBpbiB0aGUgcmVzdWx0IGNoYW5naW5nIG11bHRpcGxlIHRpbWVzLCBidXQgaXMKICAgICAgLy8gICAgbWl0aWdhdGVkIHRvIGEgbGFyZ2UgZXh0ZW50IGJ5IGJhdGNoZWQgcHJvcGVydHkgcHJvY2Vzc2luZyBpbiAyLnguCiAgICAgIC8vIDIuIFRvIGF2b2lkIGRvdWJsZSBvYmplY3QgcHJvcGFnYXRpb24gd2hlbiBhIGJhZyBpbmNsdWRpbmcgdmFsdWVzIGJvdW5kCiAgICAgIC8vICAgIHRvIHRoZSBgaWZgIHByb3BlcnR5IGFzIHdlbGwgYXMgb25lIG9yIG1vcmUgaG9zdFByb3BzIGNvdWxkIGVucXVldWUKICAgICAgLy8gICAgdGhlIDxkb20taWY+IHRvIGZsdXNoIGJlZm9yZSB0aGUgPHRlbXBsYXRlPidzIGhvc3QgcHJvcGVydHkKICAgICAgLy8gICAgZm9yd2FyZGluZy4gSW4gdGhhdCBzY2VuYXJpbyBjcmVhdGluZyBhbiBpbnN0YW5jZSB3b3VsZCByZXN1bHQgaW4KICAgICAgLy8gICAgdGhlIGhvc3QgcHJvcHMgYmVpbmcgc2V0IG9uY2UsIGFuZCB0aGVuIHRoZSBlbnF1ZXVlZCBjaGFuZ2VzIG9uIHRoZQogICAgICAvLyAgICB0ZW1wbGF0ZSB3b3VsZCBzZXQgcHJvcGVydGllcyBhIHNlY29uZCB0aW1lLCBwb3RlbnRpYWxseSBjYXVzaW5nIGFuCiAgICAgIC8vICAgIG9iamVjdCB0byBiZSBzZXQgdG8gYW4gaW5zdGFuY2UgbW9yZSB0aGFuIG9uY2UuICBDcmVhdGluZyB0aGUKICAgICAgLy8gICAgaW5zdGFuY2UgYXN5bmMgZnJvbSBmbHVzaGluZyBkYXRhIGVuc3VyZXMgdGhpcyBkb2Vzbid0IGhhcHBlbi4gSWYKICAgICAgLy8gICAgd2Ugd2FudGVkIGEgc3luYyBvcHRpb24gaW4gdGhlIGZ1dHVyZSwgc2ltcGx5IGhhdmluZyA8ZG9tLWlmPiBmbHVzaAogICAgICAvLyAgICAob3IgY2xlYXIpIGl0cyB0ZW1wbGF0ZSdzIHBlbmRpbmcgaG9zdCBwcm9wZXJ0aWVzIGJlZm9yZSBjcmVhdGluZwogICAgICAvLyAgICB0aGUgaW5zdGFuY2Ugd291bGQgYWxzbyBhdm9pZCB0aGUgcHJvYmxlbS4KICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAgICAsICgpID0+IHRoaXMuX19yZW5kZXIoKSk7CiAgICAgIFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9fcmVuZGVyRGVib3VuY2VyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAoIXRoaXMucGFyZW50Tm9kZSB8fAogICAgICAgICAgKHRoaXMucGFyZW50Tm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgJiYKICAgICAgICAgICAhdGhpcy5wYXJlbnROb2RlLmhvc3QpKSB7CiAgICAgICAgdGhpcy5fX3RlYXJkb3duSW5zdGFuY2UoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIFBvbHltZXIuZmx1c2goKTsKICAgIH0KCiAgICBfX3JlbmRlcigpIHsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICBpZiAoIXRoaXMuX19lbnN1cmVJbnN0YW5jZSgpKSB7CiAgICAgICAgICAvLyBObyB0ZW1wbGF0ZSBmb3VuZCB5ZXQKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdGFtcCkgewogICAgICAgIHRoaXMuX190ZWFyZG93bkluc3RhbmNlKCk7CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLnJlc3RhbXAgJiYgdGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlmICE9IHRoaXMuX2xhc3RJZikgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fbGFzdElmID0gdGhpcy5pZjsKICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlSW5zdGFuY2UoKSB7CiAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5wYXJlbnROb2RlOwogICAgICAvLyBHdWFyZCBhZ2FpbnN0IGVsZW1lbnQgYmVpbmcgZGV0YWNoZWQgd2hpbGUgcmVuZGVyIHdhcyBxdWV1ZWQKICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgY2hpbGRMaXN0IGNoYW5nZXMgYW5kIHRlbXBsYXRlIHNob3VsZCBiZSB0aGVyZSBieSB0aGVuCiAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9fcmVuZGVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9tLWlmIHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywge2NoaWxkTGlzdDogdHJ1ZX0pOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fY3RvciA9IFBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRlbXBsYXRlLCB0aGlzLCB7CiAgICAgICAgICAgIC8vIGRvbS1pZiB0ZW1wbGF0aXplciBpbnN0YW5jZXMgcmVxdWlyZSBgbXV0YWJsZTogdHJ1ZWAsIGFzCiAgICAgICAgICAgIC8vIGBfX3N5bmNIb3N0UHJvcGVydGllc2AgcmVsaWVzIG9uIHRoYXQgYmVoYXZpb3IgdG8gc3luYyBvYmplY3RzCiAgICAgICAgICAgIG11dGFibGVEYXRhOiB0cnVlLAogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gZm9yd2FyZAogICAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIHByb3BlcnR5CiAgICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm9yd2FyZEhvc3RQcm9wOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlmKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5mb3J3YXJkSG9zdFByb3AocHJvcCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbnN0YW5jZSBidXQgYXJlIHNxdWVsY2hpbmcgaG9zdCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkaW5nIGR1ZSB0byBpZiBiZWluZyBmYWxzZSwgbm90ZSB0aGUgaW52YWxpZGF0ZWQKICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBzbyBgX19zeW5jSG9zdFByb3BlcnRpZXNgIGNhbiBzeW5jIHRoZW0gdGhlIG5leHQKICAgICAgICAgICAgICAgICAgLy8gdGltZSBgaWZgIGJlY29tZXMgdHJ1ZQogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzID0gdGhpcy5fX2ludmFsaWRQcm9wcyB8fCBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzW1BvbHltZXIuUGF0aC5yb290KHByb3ApXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyB0aGlzLl9fY3RvcigpOwogICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fX2luc3RhbmNlLnJvb3QsIHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9fc3luY0hvc3RQcm9wZXJ0aWVzKCk7CiAgICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgICBpZiAoYyQgJiYgYyQubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIERldGVjdCBjYXNlIHdoZXJlIGRvbS1pZiB3YXMgcmUtYXR0YWNoZWQgaW4gbmV3IHBvc2l0aW9uCiAgICAgICAgICAgIGxldCBsYXN0Q2hpbGQgPSB0aGlzLnByZXZpb3VzU2libGluZzsKICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAhPT0gYyRbYyQubGVuZ3RoLTFdKSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCB0aGlzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgX19zeW5jSG9zdFByb3BlcnRpZXMoKSB7CiAgICAgIGxldCBwcm9wcyA9IHRoaXMuX19pbnZhbGlkUHJvcHM7CiAgICAgIGlmIChwcm9wcykgewogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3AsIHRoaXMuX19kYXRhSG9zdFtwcm9wXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KCiAgICBfX3RlYXJkb3duSW5zdGFuY2UoKSB7CiAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgaWYgKGMkICYmIGMkLmxlbmd0aCkgewogICAgICAgICAgLy8gdXNlIGZpcnN0IGNoaWxkIHBhcmVudCwgZm9yIGNhc2Ugd2hlbiBkb20taWYgbWF5IGhhdmUgYmVlbiBkZXRhY2hlZAogICAgICAgICAgbGV0IHBhcmVudCA9IGMkWzBdLnBhcmVudE5vZGU7CiAgICAgICAgICAvLyBJbnN0YW5jZSBjaGlsZHJlbiBtYXkgYmUgZGlzY29ubmVjdGVkIGZyb20gcGFyZW50cyB3aGVuIGRvbS1pZgogICAgICAgICAgLy8gZGV0YWNoZXMgaWYgYSB0cmVlIHdhcyBpbm5lckhUTUwnZWQKICAgICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG4pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG51bGw7CiAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICogdGV4dCBub2RlcywgYHRleHRDb250ZW50YCBpcyByZW1vdmVkIHdoaWxlICJoaWRkZW4iIGFuZCByZXBsYWNlZCB3aGVuCiAgICAgKiAic2hvd24uIgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqLwogICAgX3Nob3dIaWRlQ2hpbGRyZW4oKSB7CiAgICAgIGxldCBoaWRkZW4gPSB0aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyB8fCAhdGhpcy5pZjsKICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZSkgewogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2hvd0hpZGVDaGlsZHJlbihoaWRkZW4pOwogICAgICB9CiAgICB9CgogIH0KCiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKERvbUlmLmlzLCBEb21JZik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbUlmID0gRG9tSWY7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIEVsZW1lbnQgbWl4aW4gZm9yIHJlY29yZGluZyBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYQogICAqIG1hc3RlciBgaXRlbXNgIGFycmF5IGFuZCBhIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUKICAgKiBtYXN0ZXIgYXJyYXkgKGF0IHRoZSBob3N0KSBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUKICAgKiBjb3JyZWN0bHkgcHJvcGFnYXRlZCB0byBpdGVtcyBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEBwb2x5bWVyCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IG1peGluIGZvciByZWNvcmRpbmcgZHluYW1pYyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBpdGVtIHBhdGhzIGluIGEKICAgKiBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYSBgc2VsZWN0ZWRgIGFycmF5CiAgICovCiAgbGV0IEFycmF5U2VsZWN0b3JNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBsZXQgZWxlbWVudEJhc2UgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihzdXBlckNsYXNzKTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfQXJyYXlTZWxlY3Rvck1peGlufQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBBcnJheVNlbGVjdG9yTWl4aW4gZXh0ZW5kcyBlbGVtZW50QmFzZSB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICAgIHJldHVybiB7CgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIGl0ZW1zIGZyb20gd2hpY2ggc2VsZWN0aW9uIHdpbGwgYmUgbWFkZS4KICAgICAgICAgICAqLwogICAgICAgICAgaXRlbXM6IHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgdHJ1ZWAsIG11bHRpcGxlIGl0ZW1zIG1heSBiZSBzZWxlY3RlZCBhdCBvbmNlIChpbiB0aGlzIGNhc2UsCiAgICAgICAgICAgKiBgc2VsZWN0ZWRgIGlzIGFuIGFycmF5IG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcykuICBXaGVuIGBmYWxzZWAsCiAgICAgICAgICAgKiBvbmx5IG9uZSBpdGVtIG1heSBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCiAgICAgICAgICAgKi8KICAgICAgICAgIG11bHRpOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGBtdWx0aWAgaXMgdHJ1ZSwgdGhpcyBpcyBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGFueSBzZWxlY3RlZC4KICAgICAgICAgICAqIFdoZW4gYG11bHRpYCBpcyBmYWxzZSwgdGhpcyBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIG9yIGBudWxsYAogICAgICAgICAgICogaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KICAgICAgICAgICAqIEB0eXBlIHs/KE9iamVjdHxBcnJheTwhT2JqZWN0Pil9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgb3IgYG51bGxgCiAgICAgICAgICAgKiBpZiBubyBpdGVtIGlzIHNlbGVjdGVkLgogICAgICAgICAgICogQHR5cGUgez9PYmplY3R9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkSXRlbTogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gYHRydWVgLCBjYWxsaW5nIGBzZWxlY3RgIG9uIGFuIGl0ZW0gdGhhdCBpcyBhbHJlYWR5IHNlbGVjdGVkCiAgICAgICAgICAgKiB3aWxsIGRlc2VsZWN0IHRoZSBpdGVtLgogICAgICAgICAgICovCiAgICAgICAgICB0b2dnbGU6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9CgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbJ19fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtcy4qKSddOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBudWxsOwogICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBudWxsOwogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG51bGw7CiAgICAgIH0KCiAgICAgIF9fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtc0luZm8pIHsKICAgICAgICBsZXQgcGF0aCA9IGl0ZW1zSW5mby5wYXRoOwogICAgICAgIGlmIChwYXRoID09ICdpdGVtcycpIHsKICAgICAgICAgIC8vIENhc2UgMSAtIGl0ZW1zIGFycmF5IGNoYW5nZWQsIHNvIGRpZmYgYWdhaW5zdCBwcmV2aW91cyBhcnJheSBhbmQKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgbGV0IG5ld0l0ZW1zID0gaXRlbXNJbmZvLmJhc2UgfHwgW107CiAgICAgICAgICBsZXQgbGFzdEl0ZW1zID0gdGhpcy5fX2xhc3RJdGVtczsKICAgICAgICAgIGxldCBsYXN0TXVsdGkgPSB0aGlzLl9fbGFzdE11bHRpOwogICAgICAgICAgaWYgKG11bHRpICE9PSBsYXN0TXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxhc3RJdGVtcykgewogICAgICAgICAgICBsZXQgc3BsaWNlcyA9IFBvbHltZXIuQXJyYXlTcGxpY2UuY2FsY3VsYXRlU3BsaWNlcyhuZXdJdGVtcywgbGFzdEl0ZW1zKTsKICAgICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhzcGxpY2VzKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBuZXdJdGVtczsKICAgICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBtdWx0aTsKICAgICAgICB9IGVsc2UgaWYgKGl0ZW1zSW5mby5wYXRoID09ICdpdGVtcy5zcGxpY2VzJykgewogICAgICAgICAgLy8gQ2FzZSAyIC0gZ290IHNwZWNpZmljIHNwbGljZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBhcnJheSBtdXRhdGlvbjoKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhpdGVtc0luZm8udmFsdWUuaW5kZXhTcGxpY2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQ2FzZSAzIC0gYW4gYXJyYXkgZWxlbWVudCB3YXMgY2hhbmdlZCwgc28gZGVzZWxlY3QgdGhlIHByZXZpb3VzCiAgICAgICAgICAvLyBpdGVtIGZvciB0aGF0IGluZGV4IGlmIGl0IHdhcyBwcmV2aW91c2x5IHNlbGVjdGVkCiAgICAgICAgICBsZXQgcGFydCA9IHBhdGguc2xpY2UoJ2l0ZW1zLicubGVuZ3RoKTsKICAgICAgICAgIGxldCBpZHggPSBwYXJzZUludChwYXJ0LCAxMCk7CiAgICAgICAgICBpZiAoKHBhcnQuaW5kZXhPZignLicpIDwgMCkgJiYgcGFydCA9PSBpZHgpIHsKICAgICAgICAgICAgdGhpcy5fX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19hcHBseVNwbGljZXMoc3BsaWNlcykgewogICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuX19zZWxlY3RlZE1hcDsKICAgICAgICAvLyBBZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcyBhbmQgbWFyayByZW1vdmFscwogICAgICAgIGZvciAobGV0IGk9MDsgaTxzcGxpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHNwbGljZXNbaV07CiAgICAgICAgICBzZWxlY3RlZC5mb3JFYWNoKChpZHgsIGl0ZW0pID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA8IHMuaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UKICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPj0gcy5pbmRleCArIHMucmVtb3ZlZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAvLyBhZGp1c3QgaW5kZXgKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQoaXRlbSwgaWR4ICsgcy5hZGRlZENvdW50IC0gcy5yZW1vdmVkLmxlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluZGV4CiAgICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KGl0ZW0sIC0xKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8cy5hZGRlZENvdW50OyBqKyspIHsKICAgICAgICAgICAgbGV0IGlkeCA9IHMuaW5kZXggKyBqOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQuaGFzKHRoaXMuaXRlbXNbaWR4XSkpIHsKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQodGhpcy5pdGVtc1tpZHhdLCBpZHgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgcGF0aHMKICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgaXRlbXMgYXJyYXkKICAgICAgICBsZXQgc2lkeCA9IDA7CiAgICAgICAgc2VsZWN0ZWQuZm9yRWFjaCgoaWR4LCBpdGVtKSA9PiB7CiAgICAgICAgICBpZiAoaWR4IDwgMCkgewogICAgICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZWN0ZWQuZGVsZXRlKGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2lkeCsrOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBfX3VwZGF0ZUxpbmtzKCkgewogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgbGV0IHNpZHggPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goaWR4ID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ2l0ZW1zLicgKyBpZHgsICdzZWxlY3RlZC4nICsgc2lkeCsrKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKGlkeCA9PiB7CiAgICAgICAgICAgIHRoaXMubGlua1BhdGhzKCdzZWxlY3RlZCcsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ3NlbGVjdGVkSXRlbScsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsZWFycyB0aGUgc2VsZWN0aW9uIHN0YXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7CiAgICAgICAgLy8gVW5iaW5kIHByZXZpb3VzIHNlbGVjdGlvbgogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICAvLyBUaGUgc2VsZWN0ZWQgbWFwIHN0b3JlcyAzIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKICAgICAgICAvLyBrZXk6IGl0ZW1zIGFycmF5IG9iamVjdAogICAgICAgIC8vIHZhbHVlOiBpdGVtcyBhcnJheSBpbmRleAogICAgICAgIC8vIG9yZGVyOiBzZWxlY3RlZCBhcnJheSBpbmRleAogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbgogICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLm11bHRpID8gW10gOiBudWxsOwogICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byB0ZXN0CiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQKICAgICAgICovCiAgICAgIGlzU2VsZWN0ZWQoaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLl9fc2VsZWN0ZWRNYXAuaGFzKGl0ZW0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeCBJbmRleCBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gdGVzdAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGlzIHNlbGVjdGVkCiAgICAgICAqLwogICAgICBpc0luZGV4U2VsZWN0ZWQoaWR4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2lkeF0pOwogICAgICB9CgogICAgICBfX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpIHsKICAgICAgICBsZXQgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgaWYgKHNpZHggPj0gMCkgewogICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgICBpZiAoc2lkeCA9PSBpKyspIHsKICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0KGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleChpZHgpIHsKICAgICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzWydpdGVtcy4nICsgaWR4XTsKICAgICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChzZWxlY3RlZC5zbGljZSgnc2VsZWN0ZWQuJy5sZW5ndGgpLCAxMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRGVzZWxlY3RzIHRoZSBnaXZlbiBpdGVtIGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBkZXNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGVzZWxlY3QoaXRlbSkgewogICAgICAgIGxldCBpZHggPSB0aGlzLl9fc2VsZWN0ZWRNYXAuZ2V0KGl0ZW0pOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmRlbGV0ZShpdGVtKTsKICAgICAgICAgIGxldCBzaWR4OwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBEZXNlbGVjdHMgdGhlIGdpdmVuIGluZGV4IGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIGRlc2VsZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkZXNlbGVjdEluZGV4KGlkeCkgewogICAgICAgIHRoaXMuZGVzZWxlY3QodGhpcy5pdGVtc1tpZHhdKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGVjdHMgdGhlIGdpdmVuIGl0ZW0uICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBzZWxlY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNlbGVjdChpdGVtKSB7CiAgICAgICAgdGhpcy5zZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gaW5kZXguICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIHNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2VsZWN0SW5kZXgoaWR4KSB7CiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLml0ZW1zW2lkeF07CiAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWQoaXRlbSkpIHsKICAgICAgICAgIGlmICghdGhpcy5tdWx0aSkgewogICAgICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAuY2xlYXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5zZXQoaXRlbSwgaWR4KTsKICAgICAgICAgIHRoaXMuX191cGRhdGVMaW5rcygpOwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5wdXNoKCdzZWxlY3RlZCcsIGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMudG9nZ2xlKSB7CiAgICAgICAgICB0aGlzLmRlc2VsZWN0SW5kZXgoaWR4KTsKICAgICAgICB9CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIEFycmF5U2VsZWN0b3JNaXhpbjsKCiAgfSk7CgogIC8vIGV4cG9ydCBtaXhpbgogIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluID0gQXJyYXlTZWxlY3Rvck1peGluOwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7UG9seW1lci5FbGVtZW50fQogICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0FycmF5U2VsZWN0b3JNaXhpbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGxldCBiYXNlQXJyYXlTZWxlY3RvciA9IEFycmF5U2VsZWN0b3JNaXhpbihQb2x5bWVyLkVsZW1lbnQpOwoKICAvKioKICAgKiBFbGVtZW50IGltcGxlbWVudGluZyB0aGUgYFBvbHltZXIuQXJyYXlTZWxlY3RvcmAgbWl4aW4sIHdoaWNoIHJlY29yZHMKICAgKiBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYSBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYQogICAqIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUgbWFzdGVyIGFycmF5IChhdCB0aGUgaG9zdCkKICAgKiBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUgY29ycmVjdGx5IHByb3BhZ2F0ZWQgdG8gaXRlbXMKICAgKiBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1tb2R1bGUgaWQ9ImVtcGxveWVlLWxpc3QiPgogICAqCiAgICogICA8dGVtcGxhdGU+CiAgICoKICAgKiAgICAgPGRpdj4gRW1wbG95ZWUgbGlzdDogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGlkPSJlbXBsb3llZUxpc3QiIGl0ZW1zPSJ7e2VtcGxveWVlc319Ij4KICAgKiAgICAgICA8dGVtcGxhdGU+CiAgICogICAgICAgICA8ZGl2PkZpcnN0IG5hbWU6IDxzcGFuPnt7aXRlbS5maXJzdH19PC9zcGFuPjwvZGl2PgogICAqICAgICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICAgICAgPGJ1dHRvbiBvbi1jbGljaz0idG9nZ2xlU2VsZWN0aW9uIj5TZWxlY3Q8L2J1dHRvbj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgICAgPGFycmF5LXNlbGVjdG9yIGlkPSJzZWxlY3RvciIgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkfX0iIG11bHRpIHRvZ2dsZT48L2FycmF5LXNlbGVjdG9yPgogICAqCiAgICogICAgIDxkaXY+IFNlbGVjdGVkIGVtcGxveWVlczogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e3NlbGVjdGVkfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBgYGBqcwogICAqY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdlbXBsb3llZS1saXN0JzsgfQogICAqICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICogICAgcmV0dXJuIHsKICAgKiAgICAgIGVtcGxveWVlczogewogICAqICAgICAgICB2YWx1ZSgpIHsKICAgKiAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAge2ZpcnN0OiAnQm9iJywgbGFzdDogJ1NtaXRoJ30sCiAgICogICAgICAgICAgICB7Zmlyc3Q6ICdTYWxseScsIGxhc3Q6ICdKb2huc29uJ30sCiAgICogICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICBdOwogICAqICAgICAgICB9CiAgICogICAgICB9CiAgICogICAgfTsKICAgKiAgfQogICAqICB0b2dnbGVTZWxlY3Rpb24oZSkgewogICAqICAgIGxldCBpdGVtID0gdGhpcy4kLmVtcGxveWVlTGlzdC5pdGVtRm9yRWxlbWVudChlLnRhcmdldCk7CiAgICogICAgdGhpcy4kLnNlbGVjdG9yLnNlbGVjdChpdGVtKTsKICAgKiAgfQogICAqfQogICAqIGBgYAogICAqCiAgICogQHBvbHltZXIKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIHtiYXNlQXJyYXlTZWxlY3Rvcn0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IGxpbmtzIHBhdGhzIGJldHdlZW4gYW4gaW5wdXQgYGl0ZW1zYCBhcnJheSBhbmQKICAgKiAgIGFuIG91dHB1dCBgc2VsZWN0ZWRgIGl0ZW0gb3IgYXJyYXkgYmFzZWQgb24gY2FsbHMgdG8gaXRzIHNlbGVjdGlvbiBBUEkuCiAgICovCiAgY2xhc3MgQXJyYXlTZWxlY3RvciBleHRlbmRzIGJhc2VBcnJheVNlbGVjdG9yIHsKICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2FycmF5LXNlbGVjdG9yJzsgfQogIH0KICBjdXN0b21FbGVtZW50cy5kZWZpbmUoQXJyYXlTZWxlY3Rvci5pcywgQXJyYXlTZWxlY3Rvcik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkFycmF5U2VsZWN0b3IgPSBBcnJheVNlbGVjdG9yOwoKfSkoKTsKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBjPW51bGwsZj13aW5kb3cuSFRNTEltcG9ydHMmJndpbmRvdy5IVE1MSW1wb3J0cy53aGVuUmVhZHl8fG51bGwsZztmdW5jdGlvbiBoKGEpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2Y/ZihhKTooY3x8KGM9bmV3IFByb21pc2UoZnVuY3Rpb24oYSl7Zz1hfSksImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/ZygpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKCl7ImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJmcoKX0pKSxjLnRoZW4oZnVuY3Rpb24oKXthJiZhKCl9KSl9KX07dmFyIGs9bnVsbCxsPW51bGw7ZnVuY3Rpb24gbSgpe3RoaXMuY3VzdG9tU3R5bGVzPVtdO3RoaXMuZW5xdWV1ZWQ9ITE7aChmdW5jdGlvbigpe3dpbmRvdy5TaGFkeUNTUy5mbHVzaEN1c3RvbVN0eWxlcyYmd2luZG93LlNoYWR5Q1NTLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX1mdW5jdGlvbiBuKGEpeyFhLmVucXVldWVkJiZsJiYoYS5lbnF1ZXVlZD0hMCxoKGwpKX1tLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2EuX19zZWVuQnlTaGFkeUNTU3x8KGEuX19zZWVuQnlTaGFkeUNTUz0hMCx0aGlzLmN1c3RvbVN0eWxlcy5wdXNoKGEpLG4odGhpcykpfTttLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe2lmKGEuX19zaGFkeUNTU0NhY2hlZFN0eWxlKXJldHVybiBhLl9fc2hhZHlDU1NDYWNoZWRTdHlsZTt2YXIgYjthLmdldFN0eWxlP2I9YS5nZXRTdHlsZSgpOmI9YTtyZXR1cm4gYn07Cm0ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5jdXN0b21TdHlsZXMsYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdO2lmKCFkLl9fc2hhZHlDU1NDYWNoZWRTdHlsZSl7dmFyIGU9dGhpcy5iKGQpO2UmJihlPWUuX19hcHBsaWVkRWxlbWVudHx8ZSxrJiZrKGUpLGQuX19zaGFkeUNTU0NhY2hlZFN0eWxlPWUpfX1yZXR1cm4gYX07bS5wcm90b3R5cGUuYWRkQ3VzdG9tU3R5bGU9bS5wcm90b3R5cGUuYzttLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlPW0ucHJvdG90eXBlLmI7bS5wcm90b3R5cGUucHJvY2Vzc1N0eWxlcz1tLnByb3RvdHlwZS5hOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhtLnByb3RvdHlwZSx7dHJhbnNmb3JtQ2FsbGJhY2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBrfSxzZXQ6ZnVuY3Rpb24oYSl7az1hfX0sdmFsaWRhdGVDYWxsYmFjazp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGx9LHNldDpmdW5jdGlvbihhKXt2YXIgYj0hMTtsfHwoYj0hMCk7bD1hO2ImJm4odGhpcyl9fX0pO2Z1bmN0aW9uIHAoYSxiKXtmb3IodmFyIGQgaW4gYiludWxsPT09ZD9hLnN0eWxlLnJlbW92ZVByb3BlcnR5KGQpOmEuc3R5bGUuc2V0UHJvcGVydHkoZCxiW2RdKX07dmFyIHE9ISh3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSkscjtmdW5jdGlvbiB0KGEpe3I9YSYmYS5zaGltY3NzcHJvcGVydGllcz8hMTpxfHwhKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC82MDF8RWRnZVwvMTUvKXx8IXdpbmRvdy5DU1N8fCFDU1Muc3VwcG9ydHN8fCFDU1Muc3VwcG9ydHMoImJveC1zaGFkb3ciLCIwIDAgMCB2YXIoLS1mb28pIikpfXZhciB1O3dpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkJiYodT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciB2PSEoIXdpbmRvdy5TaGFkeUNTU3x8IXdpbmRvdy5TaGFkeUNTUy5kaXNhYmxlUnVudGltZSk7CndpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzcz9yPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyh0KHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6dCh3aW5kb3cuV2ViQ29tcG9uZW50cyYmd2luZG93LldlYkNvbXBvbmVudHMuZmxhZ3MpO3ZhciB3PXIseD11O3ZhciB5PW5ldyBtO3dpbmRvdy5TaGFkeUNTU3x8KHdpbmRvdy5TaGFkeUNTUz17cHJlcGFyZVRlbXBsYXRlOmZ1bmN0aW9uKCl7fSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHByZXBhcmVUZW1wbGF0ZVN0eWxlczpmdW5jdGlvbigpe30sc3R5bGVTdWJ0cmVlOmZ1bmN0aW9uKGEsYil7eS5hKCk7cChhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oKXt5LmEoKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXt5LmEoKTtwKGRvY3VtZW50LmJvZHksYSl9LGdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybihhPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLmdldFByb3BlcnR5VmFsdWUoYikpP2EudHJpbSgpOiIifSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe30sbmF0aXZlQ3NzOncsbmF0aXZlU2hhZG93OnEsY3NzQnVpbGQ6eCxkaXNhYmxlUnVudGltZTp2fSk7d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXk7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IGF0dHIgPSAnaW5jbHVkZSc7CgogIGNvbnN0IEN1c3RvbVN0eWxlSW50ZXJmYWNlID0gd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlOwoKICAvKioKICAgKiBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuIHRha2UKICAgKiBhZHZhbnRhZ2Ugb2YgW3NoYWR5IERPTV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MpIHNoaW1zCiAgICogZm9yIHN0eWxlIGVuY2Fwc3VsYXRpb24sIGN1c3RvbSBwcm9wZXJ0aWVzLCBhbmQgY3VzdG9tIG1peGlucy4KICAgKgogICAqIC0gRG9jdW1lbnQgc3R5bGVzIGRlZmluZWQgaW4gYSBgPGN1c3RvbS1zdHlsZT5gIGFyZSBzaGltbWVkIHRvIGVuc3VyZSB0aGV5CiAgICogICBkbyBub3QgbGVhayBpbnRvIGxvY2FsIERPTSB3aGVuIHJ1bm5pbmcgb24gYnJvd3NlcnMgd2l0aG91dCBuYXRpdmUKICAgKiAgIFNoYWRvdyBET00uCiAgICogLSBDdXN0b20gcHJvcGVydGllcyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAuIFVzZSB0aGUgYGh0bWxgIHNlbGVjdG9yCiAgICogICB0byBkZWZpbmUgY3VzdG9tIHByb3BlcnRpZXMgdGhhdCBhcHBseSB0byBhbGwgY3VzdG9tIGVsZW1lbnRzLgogICAqIC0gQ3VzdG9tIG1peGlucyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAsIGlmIHlvdSBpbXBvcnQgdGhlIG9wdGlvbmFsCiAgICogICBbYXBwbHkgc2hpbV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MjYWJvdXQtYXBwbHlzaGltKQogICAqICAgKGBzaGFkeWNzcy9hcHBseS1zaGltLmh0bWxgKS4KICAgKgogICAqIFRvIHVzZToKICAgKgogICAqIC0gSW1wb3J0IGBjdXN0b20tc3R5bGUuaHRtbGAuCiAgICogLSBQbGFjZSBhIGA8Y3VzdG9tLXN0eWxlPmAgZWxlbWVudCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgd3JhcHBpbmcgYW4gaW5saW5lIGA8c3R5bGU+YCB0YWcgdGhhdAogICAqICAgY29udGFpbnMgdGhlIENTUyBydWxlcyB5b3Ugd2FudCB0byBzaGltLgogICAqCiAgICogRm9yIGV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPCEtLSBpbXBvcnQgYXBwbHkgc2hpbS0tb25seSByZXF1aXJlZCBpZiB1c2luZyBtaXhpbnMgLS0+CiAgICogPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvc2hhZHljc3MvYXBwbHktc2hpbS5odG1sIj4KICAgKiA8IS0tIGltcG9ydCBjdXN0b20tc3R5bGUgZWxlbWVudCAtLT4KICAgKiA8bGluayByZWw9ImltcG9ydCIgaHJlZj0iYm93ZXJfY29tcG9uZW50cy9wb2x5bWVyL2xpYi9lbGVtZW50cy9jdXN0b20tc3R5bGUuaHRtbCI+CiAgICoKICAgKiA8Y3VzdG9tLXN0eWxlPgogICAqICAgPHN0eWxlPgogICAqICAgICBodG1sIHsKICAgKiAgICAgICAtLWN1c3RvbS1jb2xvcjogYmx1ZTsKICAgKiAgICAgICAtLWN1c3RvbS1taXhpbjogewogICAqICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICogICAgICAgICBjb2xvcjogcmVkOwogICAqICAgICAgIH07CiAgICogICAgIH0KICAgKiAgIDwvc3R5bGU+CiAgICogPC9jdXN0b20tc3R5bGU+CiAgICogYGBgCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuCiAgICogICB0YWtlIGFkdmFudGFnZSBvZiBQb2x5bWVyJ3Mgc3R5bGUgc2NvcGluZyBhbmQgY3VzdG9tIHByb3BlcnRpZXMgc2hpbXMuCiAgICovCiAgY2xhc3MgQ3VzdG9tU3R5bGUgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fc3R5bGUgPSBudWxsOwogICAgICBDdXN0b21TdHlsZUludGVyZmFjZS5hZGRDdXN0b21TdHlsZSh0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlnaHQtRE9NIGA8c3R5bGU+YCBjaGlsZCB0aGlzIGVsZW1lbnQgd3JhcHMuICBVcG9uIGZpcnN0CiAgICAgKiBjYWxsIGFueSBzdHlsZSBtb2R1bGVzIHJlZmVyZW5jZWQgdmlhIHRoZSBgaW5jbHVkZWAgYXR0cmlidXRlIHdpbGwgYmUKICAgICAqIGNvbmNhdGVuYXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHN0eWxlPmAuCiAgICAgKgogICAgICogQHJldHVybiB7SFRNTFN0eWxlRWxlbWVudH0gVGhpcyBlbGVtZW50J3MgbGlnaHQtRE9NIGA8c3R5bGU+YAogICAgICovCiAgICBnZXRTdHlsZSgpIHsKICAgICAgaWYgKHRoaXMuX3N0eWxlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlOwogICAgICB9CiAgICAgIGNvbnN0IHN0eWxlID0gLyoqIEB0eXBlIHtIVE1MU3R5bGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpOwogICAgICBpZiAoIXN0eWxlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5fc3R5bGUgPSBzdHlsZTsKICAgICAgY29uc3QgaW5jbHVkZSA9IHN0eWxlLmdldEF0dHJpYnV0ZShhdHRyKTsKICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLmNzc0Zyb21Nb2R1bGVzKGluY2x1ZGUpICsgc3R5bGUudGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgLyoKICAgICAgSFRNTCBJbXBvcnRzIHN0eWxpbmcgdGhlIG1haW4gZG9jdW1lbnQgYXJlIGRlcHJlY2F0ZWQgaW4gQ2hyb21lCiAgICAgIGh0dHBzOi8vY3JidWcuY29tLzUyMzk1MgoKICAgICAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgdGhlbiBpdCBtdXN0IGJlIGluIGFuIEhUTUwgSW1wb3J0IGRvY3VtZW50LgogICAgICBJbiB0aGF0IGNhc2UsIG1vdmUgdGhlIGN1c3RvbSBzdHlsZSB0byB0aGUgbWFpbiBkb2N1bWVudC4KCiAgICAgIFRoZSBvcmRlcmluZyBvZiBgPGN1c3RvbS1zdHlsZT5gIHNob3VsZCBzdGF5IHRoZSBzYW1lIGFzIHdoZW4gbG9hZGVkIGJ5IEhUTUwgSW1wb3J0cywgYnV0IHRoZXJlIG1heSBiZSBvZGQKICAgICAgY2FzZXMgb2Ygb3JkZXJpbmcgdy5yLnQgdGhlIG1haW4gZG9jdW1lbnQgc3R5bGVzLgogICAgICAqLwogICAgICBpZiAodGhpcy5vd25lckRvY3VtZW50ICE9PSB3aW5kb3cuZG9jdW1lbnQpIHsKICAgICAgICB3aW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fc3R5bGU7CiAgICB9CiAgfQoKICB3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjdXN0b20tc3R5bGUnLCBDdXN0b21TdHlsZSk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkN1c3RvbVN0eWxlID0gQ3VzdG9tU3R5bGU7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IG11dGFibGVQcm9wZXJ0eUNoYW5nZTsKICAvKiogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gKi8KICAoKCkgPT4gewogICAgbXV0YWJsZVByb3BlcnR5Q2hhbmdlID0gUG9seW1lci5NdXRhYmxlRGF0YS5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlOwogIH0pKCk7CgogIC8qKgogICAqIExlZ2FjeSBlbGVtZW50IGJlaGF2aW9yIHRvIHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMsCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpIGZvciB1c2Ugb24gbGVnYWN5IEFQSSBQb2x5bWVyIGVsZW1lbnRzLgogICAqCiAgICogQnkgZGVmYXVsdCwgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBwZXJmb3JtcyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgb24KICAgKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGFueSBkZWVwIG1vZGlmaWNhdGlvbnMgdG8gYW4gb2JqZWN0IG9yIGFycmF5IHdpbGwKICAgKiBub3QgYmUgcHJvcGFnYXRlZCB1bmxlc3MgImltbXV0YWJsZSIgZGF0YSBwYXR0ZXJucyBhcmUgdXNlZCAoaS5lLiBhbGwgb2JqZWN0CiAgICogcmVmZXJlbmNlcyBmcm9tIHRoZSByb290IHRvIHRoZSBtdXRhdGlvbiB3ZXJlIGNoYW5nZWQpLgogICAqCiAgICogUG9seW1lciBhbHNvIHByb3ZpZGVzIGEgcHJvcHJpZXRhcnkgZGF0YSBtdXRhdGlvbiBhbmQgcGF0aCBub3RpZmljYXRpb24gQVBJCiAgICogKGUuZy4gYG5vdGlmeVBhdGhgLCBgc2V0YCwgYW5kIGFycmF5IG11dGF0aW9uIEFQSSdzKSB0aGF0IGFsbG93IGVmZmljaWVudAogICAqIG11dGF0aW9uIGFuZCBub3RpZmljYXRpb24gb2YgZGVlcCBjaGFuZ2VzIGluIGFuIG9iamVjdCBncmFwaCB0byBhbGwgZWxlbWVudHMKICAgKiBib3VuZCB0byB0aGUgc2FtZSBvYmplY3QgZ3JhcGguCiAgICoKICAgKiBJbiBjYXNlcyB3aGVyZSBuZWl0aGVyIGltbXV0YWJsZSBwYXR0ZXJucyBub3IgdGhlIGRhdGEgbXV0YXRpb24gQVBJIGNhbiBiZQogICAqIHVzZWQsIGFwcGx5aW5nIHRoaXMgbWl4aW4gd2lsbCBjYXVzZSBQb2x5bWVyIHRvIHNraXAgZGlydHkgY2hlY2tpbmcgZm9yCiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKS4gIFRoaXMgYWxsb3dzIGEKICAgKiB1c2VyIHRvIG1ha2UgYSBkZWVwIG1vZGlmaWNhdGlvbiB0byBhIGJvdW5kIG9iamVjdCBncmFwaCwgYW5kIHRoZW4gZWl0aGVyCiAgICogc2ltcGx5IHJlLXNldCB0aGUgb2JqZWN0IChlLmcuIGB0aGlzLml0ZW1zID0gdGhpcy5pdGVtc2ApIG9yIGNhbGwgYG5vdGlmeVBhdGhgCiAgICogKGUuZy4gYHRoaXMubm90aWZ5UGF0aCgnaXRlbXMnKWApIHRvIHVwZGF0ZSB0aGUgdHJlZS4gIE5vdGUgdGhhdCBhbGwKICAgKiBlbGVtZW50cyB0aGF0IHdpc2ggdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBkZWVwIG11dGF0aW9ucyBtdXN0IGFwcGx5IHRoaXMKICAgKiBtaXhpbiBvciBvdGhlcndpc2Ugc2tpcCBzdHJpY3QgZGlydHkgY2hlY2tpbmcgZm9yIG9iamVjdHMvYXJyYXlzLgogICAqIFNwZWNpZmljYWxseSwgYW55IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIHRyZWUgYmV0d2VlbiB0aGUgc291cmNlIG9mIGEKICAgKiBtdXRhdGlvbiBhbmQgdGhlIGNvbnN1bXB0aW9uIG9mIGl0IG11c3QgYXBwbHkgdGhpcyBiZWhhdmlvciBvciBlbmFibGUgdGhlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIGRpcnR5IGNoZWNrIHN0cmF0ZWd5IGNvbmZpZ3VyYWJsZSwgc2VlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQHBvbHltZXJCZWhhdmlvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQmVoYXZpb3IgdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk11dGFibGVEYXRhQmVoYXZpb3IgPSB7CgogICAgLyoqCiAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCB0byBwcm92aWRlIG9wdGlvbiBmb3Igc2tpcHBpbmcKICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYAogICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdHJ1ZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogTGVnYWN5IGVsZW1lbnQgYmVoYXZpb3IgdG8gYWRkIHRoZSBvcHRpb25hbCBhYmlsaXR5IHRvIHNraXAgc3RyaWN0CiAgICogZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgKiAiZGlydHkiKSBieSBzZXR0aW5nIGEgYG11dGFibGUtZGF0YWAgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgaW5zdGFuY2UuCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBlbmFibGUgdGhpcyBiZWhhdmlvciBvciBhcHBseSB0aGUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JgLgogICAqCiAgICogV2hpbGUgdGhpcyBiZWhhdmlvciBhZGRzIHRoZSBhYmlsaXR5IHRvIGZvcmdvIE9iamVjdC9BcnJheSBkaXJ0eSBjaGVja2luZywKICAgKiB0aGUgYG11dGFibGVEYXRhYCBmbGFnIGRlZmF1bHRzIHRvIGZhbHNlIGFuZCBtdXN0IGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCiAgICoKICAgKiBOb3RlLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIHByb3BhZ2F0aW5nIGxhcmdlIG9iamVjdCBncmFwaHMKICAgKiB3aWxsIGJlIHdvcnNlIGJ5IHJlbHlpbmcgb24gYG11dGFibGVEYXRhOiB0cnVlYCBhcyBvcHBvc2VkIHRvIHVzaW5nCiAgICogc3RyaWN0IGRpcnR5IGNoZWNraW5nIHdpdGggaW1tdXRhYmxlIHBhdHRlcm5zIG9yIFBvbHltZXIncyBwYXRoIG5vdGlmaWNhdGlvbgogICAqIEFQSS4KICAgKgogICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEJlaGF2aW9yIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvciA9IHsKCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIC8qKgogICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICogZm9yIHRoaXMgZWxlbWVudC4gIFdoZW4gdHJ1ZSwgT2JqZWN0cyBhbmQgQXJyYXlzIHdpbGwgc2tpcCBkaXJ0eQogICAgICAgKiBjaGVja2luZywgb3RoZXJ3aXNlIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyB3aWxsIGJlIHVzZWQuCiAgICAgICAqLwogICAgICBtdXRhYmxlRGF0YTogQm9vbGVhbgogICAgfSwKCiAgICAvKioKICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHNraXAgc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nCiAgICAgKiBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICogKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0aGlzLm11dGFibGVEYXRhKTsKICAgIH0KICB9OwoKfSkoKTsKCgoKICAvLyBiYwogIFBvbHltZXIuQmFzZSA9IFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKEhUTUxFbGVtZW50KS5wcm90b3R5cGU7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1mbGV4LWxheW91dC9pcm9uLWZsZXgtbGF5b3V0Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiLnRleHRDb250ZW50PSJbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChiKX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IvaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKHcsQyl7dmFyIEc9IiI7aWYodylpZih3PXcudG9Mb3dlckNhc2UoKSwiICI9PT13fHxBLnRlc3QodykpRz0ic3BhY2UiO2Vsc2UgaWYoeS50ZXN0KHcpKUc9ImVzYyI7ZWxzZSBpZigxPT13Lmxlbmd0aCl7aWYoIUN8fHEudGVzdCh3KSlHPXd9ZWxzZSBHPXgudGVzdCh3KT93LnJlcGxhY2UoImFycm93IiwiIik6Im11bHRpcGx5Ij09dz8iKiI6dztyZXR1cm4gR31mdW5jdGlvbiBkKHcpe3ZhciBDPSIiO3cmJih3IGluIHA/Qz1wW3ddOnUudGVzdCh3KT8odz1wYXJzZUludCh3LnJlcGxhY2UoIlUrIiwiMHgiKSwxNiksQz1TdHJpbmcuZnJvbUNoYXJDb2RlKHcpLnRvTG93ZXJDYXNlKCkpOkM9dy50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gQ31mdW5jdGlvbiBmKHcpe3ZhciBDPSIiO051bWJlcih3KSYmKEM9NjU8PXcmJjkwPj13P1N0cmluZy5mcm9tQ2hhckNvZGUoMzIrdyk6MTEyPD13JiYxMjM+PXc/ImYiKyh3LTExMisxKTo0ODw9dyYmNTc+PXc/ClN0cmluZyh3LTQ4KTo5Njw9dyYmMTA1Pj13P1N0cmluZyh3LTk2KTptW3ddKTtyZXR1cm4gQ31mdW5jdGlvbiBoKHcsQyl7cmV0dXJuIHcua2V5P2Iody5rZXksQyk6dy5kZXRhaWwmJncuZGV0YWlsLmtleT9iKHcuZGV0YWlsLmtleSxDKTpkKHcua2V5SWRlbnRpZmllcil8fGYody5rZXlDb2RlKXx8IiJ9ZnVuY3Rpb24gayh3LEMpe3JldHVybiBoKEMsdy5oYXNNb2RpZmllcnMpPT09dy5rZXkmJighdy5oYXNNb2RpZmllcnN8fCEhQy5zaGlmdEtleT09PSEhdy5zaGlmdEtleSYmISFDLmN0cmxLZXk9PT0hIXcuY3RybEtleSYmISFDLmFsdEtleT09PSEhdy5hbHRLZXkmJiEhQy5tZXRhS2V5PT09ISF3Lm1ldGFLZXkpfWZ1bmN0aW9uIHQodyl7cmV0dXJuIDE9PT13Lmxlbmd0aD97Y29tYm86dyxrZXk6dyxldmVudDoia2V5ZG93biJ9Oncuc3BsaXQoIisiKS5yZWR1Y2UoZnVuY3Rpb24oQyxHKXt2YXIgRD1HLnNwbGl0KCI6Iik7Rz1EWzBdO0Q9RFsxXTtHIGluIG4/KENbbltHXV09ITAsCkMuaGFzTW9kaWZpZXJzPSEwKTooQy5rZXk9RyxDLmV2ZW50PUR8fCJrZXlkb3duIik7cmV0dXJuIEN9LHtjb21ibzp3LnNwbGl0KCI6Iikuc2hpZnQoKX0pfWZ1bmN0aW9uIGwodyl7cmV0dXJuIHcudHJpbSgpLnNwbGl0KCIgIikubWFwKGZ1bmN0aW9uKEMpe3JldHVybiB0KEMpfSl9dmFyIHA9eyJVKzAwMDgiOiJiYWNrc3BhY2UiLCJVKzAwMDkiOiJ0YWIiLCJVKzAwMUIiOiJlc2MiLCJVKzAwMjAiOiJzcGFjZSIsIlUrMDA3RiI6ImRlbCJ9LG09ezg6ImJhY2tzcGFjZSIsOToidGFiIiwxMzoiZW50ZXIiLDI3OiJlc2MiLDMzOiJwYWdldXAiLDM0OiJwYWdlZG93biIsMzU6ImVuZCIsMzY6ImhvbWUiLDMyOiJzcGFjZSIsMzc6ImxlZnQiLDM4OiJ1cCIsMzk6InJpZ2h0Iiw0MDoiZG93biIsNDY6ImRlbCIsMTA2OiIqIn0sbj17c2hpZnQ6InNoaWZ0S2V5IixjdHJsOiJjdHJsS2V5IixhbHQ6ImFsdEtleSIsbWV0YToibWV0YUtleSJ9LHE9L1thLXowLTkqXS8sdT0vVVwrLyx4PS9eYXJyb3cvLApBPS9ec3BhY2UoYmFyKT8vLHk9L15lc2NhcGUkLztQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntrZXlFdmVudFRhcmdldDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LHN0b3BLZXlib2FyZEV2ZW50UHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kS2V5SGFuZGxlcnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9pbXBlcmF0aXZlS2V5QmluZGluZ3M6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoa2V5RXZlbnRUYXJnZXQsIF9ib3VuZEtleUhhbmRsZXJzKSJdLGtleUJpbmRpbmdzOnt9LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sCmFkZE93bktleUJpbmRpbmc6ZnVuY3Rpb24odyxDKXt0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3Nbd109Qzt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKTt0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCl9LHJlbW92ZU93bktleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzPXt9O3RoaXMuX3ByZXBLZXlCaW5kaW5ncygpO3RoaXMuX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoKX0sa2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzOmZ1bmN0aW9uKHcsQyl7Qz1sKEMpO2Zvcih2YXIgRz0wO0c8Qy5sZW5ndGg7KytHKWlmKGsoQ1tHXSx3KSlyZXR1cm4hMDtyZXR1cm4hMX0sX2NvbGxlY3RLZXlCaW5kaW5nczpmdW5jdGlvbigpe3ZhciB3PXRoaXMuYmVoYXZpb3JzLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gQy5rZXlCaW5kaW5nc30pOy0xPT09dy5pbmRleE9mKHRoaXMua2V5QmluZGluZ3MpJiZ3LnB1c2godGhpcy5rZXlCaW5kaW5ncyk7cmV0dXJuIHd9LApfcHJlcEtleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5fa2V5QmluZGluZ3M9e307dGhpcy5fY29sbGVjdEtleUJpbmRpbmdzKCkuZm9yRWFjaChmdW5jdGlvbihHKXtmb3IodmFyIEQgaW4gRyl0aGlzLl9hZGRLZXlCaW5kaW5nKEQsR1tEXSl9LHRoaXMpO2Zvcih2YXIgdyBpbiB0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3MpdGhpcy5fYWRkS2V5QmluZGluZyh3LHRoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5nc1t3XSk7Zm9yKHZhciBDIGluIHRoaXMuX2tleUJpbmRpbmdzKXRoaXMuX2tleUJpbmRpbmdzW0NdLnNvcnQoZnVuY3Rpb24oRyxEKXtHPUdbMF0uaGFzTW9kaWZpZXJzO3JldHVybiBHPT09RFswXS5oYXNNb2RpZmllcnM/MDpHPy0xOjF9KX0sX2FkZEtleUJpbmRpbmc6ZnVuY3Rpb24odyxDKXtsKHcpLmZvckVhY2goZnVuY3Rpb24oRyl7dGhpcy5fa2V5QmluZGluZ3NbRy5ldmVudF09dGhpcy5fa2V5QmluZGluZ3NbRy5ldmVudF18fFtdO3RoaXMuX2tleUJpbmRpbmdzW0cuZXZlbnRdLnB1c2goW0csCkNdKX0sdGhpcyl9LF9yZXNldEtleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdW5saXN0ZW5LZXlFdmVudExpc3RlbmVycygpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5rZXlFdmVudFRhcmdldCYmT2JqZWN0LmtleXModGhpcy5fa2V5QmluZGluZ3MpLmZvckVhY2goZnVuY3Rpb24odyl7dmFyIEM9dGhpcy5fb25LZXlCaW5kaW5nRXZlbnQuYmluZCh0aGlzLHRoaXMuX2tleUJpbmRpbmdzW3ddKTt0aGlzLl9ib3VuZEtleUhhbmRsZXJzLnB1c2goW3RoaXMua2V5RXZlbnRUYXJnZXQsdyxDXSk7dGhpcy5rZXlFdmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHcsQyl9LHRoaXMpfSxfdW5saXN0ZW5LZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe2Zvcih2YXIgdyxDLEc7dGhpcy5fYm91bmRLZXlIYW5kbGVycy5sZW5ndGg7KXc9dGhpcy5fYm91bmRLZXlIYW5kbGVycy5wb3AoKSwKQz13WzBdLEc9d1sxXSx3PXdbMl0sQy5yZW1vdmVFdmVudExpc3RlbmVyKEcsdyl9LF9vbktleUJpbmRpbmdFdmVudDpmdW5jdGlvbih3LEMpe3RoaXMuc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbiYmQy5zdG9wUHJvcGFnYXRpb24oKTtpZighQy5kZWZhdWx0UHJldmVudGVkKWZvcih2YXIgRz0wO0c8dy5sZW5ndGg7RysrKXt2YXIgRD13W0ddWzBdLEI9d1tHXVsxXTtpZihrKEQsQykmJih0aGlzLl90cmlnZ2VyS2V5SGFuZGxlcihELEIsQyksQy5kZWZhdWx0UHJldmVudGVkKSlicmVha319LF90cmlnZ2VyS2V5SGFuZGxlcjpmdW5jdGlvbih3LEMsRyl7dmFyIEQ9T2JqZWN0LmNyZWF0ZSh3KTtELmtleWJvYXJkRXZlbnQ9Rzt3PW5ldyBDdXN0b21FdmVudCh3LmV2ZW50LHtkZXRhaWw6RCxjYW5jZWxhYmxlOiEwfSk7dGhpc1tDXS5jYWxsKHRoaXMsdyk7dy5kZWZhdWx0UHJldmVudGVkJiZHLnByZXZlbnREZWZhdWx0KCl9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1jb250cm9sLXN0YXRlLmh0bWwuanMKUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlPXtwcm9wZXJ0aWVzOntmb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX29sZFRhYkluZGV4Ont0eXBlOlN0cmluZ30sX2JvdW5kRm9jdXNCbHVySGFuZGxlcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb2N1c0JsdXJIYW5kbGVyLmJpbmQodGhpcyl9fSxfX2hhbmRsZUV2ZW50UmV0YXJnZXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLnNoYWRvd1Jvb3QmJiFQb2x5bWVyLkVsZW1lbnR9fX0sb2JzZXJ2ZXJzOlsiX2NoYW5nZWRDb250cm9sU3RhdGUoZm9jdXNlZCwgZGlzYWJsZWQpIl0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwKdGhpcy5fYm91bmRGb2N1c0JsdXJIYW5kbGVyLCEwKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwhMCl9LF9mb2N1c0JsdXJIYW5kbGVyOmZ1bmN0aW9uKGIpe2lmKFBvbHltZXIuRWxlbWVudCl0aGlzLl9zZXRGb2N1c2VkKCJmb2N1cyI9PT1iLnR5cGUpO2Vsc2UgaWYoYi50YXJnZXQ9PT10aGlzKXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWIudHlwZSk7ZWxzZSBpZih0aGlzLl9faGFuZGxlRXZlbnRSZXRhcmdldGluZyl7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8dGhpcy5maXJlKGIudHlwZSx7c291cmNlRXZlbnQ6Yn0se25vZGU6dGhpcyxidWJibGVzOmIuYnViYmxlcyxjYW5jZWxhYmxlOmIuY2FuY2VsYWJsZX0pfX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsYj8idHJ1ZSI6ImZhbHNlIik7CnRoaXMuc3R5bGUucG9pbnRlckV2ZW50cz1iPyJub25lIjoiIjtiPyh0aGlzLl9vbGRUYWJJbmRleD10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLnRhYkluZGV4PS0xLHRoaXMuYmx1cigpKTp2b2lkIDAhPT10aGlzLl9vbGRUYWJJbmRleCYmKG51bGw9PT10aGlzLl9vbGRUYWJJbmRleD90aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKTp0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLHRoaXMuX29sZFRhYkluZGV4KSl9LF9jaGFuZ2VkQ29udHJvbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1idXR0b24tc3RhdGUuaHRtbC5qcwpQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGw9e3Byb3BlcnRpZXM6e3ByZXNzZWQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9wcmVzc2VkQ2hhbmdlZCJ9LHRvZ2dsZXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHBvaW50ZXJEb3duOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITF9LHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMH0sYXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtcHJlc3NlZCIsb2JzZXJ2ZXI6Il9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZCJ9fSxsaXN0ZW5lcnM6e2Rvd246Il9kb3duSGFuZGxlciIsdXA6Il91cEhhbmRsZXIiLHRhcDoiX3RhcEhhbmRsZXIifSwKb2JzZXJ2ZXJzOlsiX2ZvY3VzQ2hhbmdlZChmb2N1c2VkKSIsIl9hY3RpdmVDaGFuZ2VkKGFjdGl2ZSwgYXJpYUFjdGl2ZUF0dHJpYnV0ZSkiXSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfYXN5bmNDbGljayIsInNwYWNlOmtleWRvd24iOiJfc3BhY2VLZXlEb3duSGFuZGxlciIsInNwYWNlOmtleXVwIjoiX3NwYWNlS2V5VXBIYW5kbGVyIn0sX21vdXNlRXZlbnRSZTovXm1vdXNlLyxfdGFwSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMudG9nZ2xlcz90aGlzLl91c2VyQWN0aXZhdGUoIXRoaXMuYWN0aXZlKTp0aGlzLmFjdGl2ZT0hMX0sX2ZvY3VzQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9kZXRlY3RLZXlib2FyZEZvY3VzKGIpO2J8fHRoaXMuX3NldFByZXNzZWQoITEpfSxfZGV0ZWN0S2V5Ym9hcmRGb2N1czpmdW5jdGlvbihiKXt0aGlzLl9zZXRSZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKCF0aGlzLnBvaW50ZXJEb3duJiZiKX0sX3VzZXJBY3RpdmF0ZTpmdW5jdGlvbihiKXt0aGlzLmFjdGl2ZSE9PQpiJiYodGhpcy5hY3RpdmU9Yix0aGlzLmZpcmUoImNoYW5nZSIpKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITApO3RoaXMuX3NldFByZXNzZWQoITApO3RoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoITEpfSxfdXBIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITEpO3RoaXMuX3NldFByZXNzZWQoITEpfSxfc3BhY2VLZXlEb3duSGFuZGxlcjpmdW5jdGlvbihiKXtiPWIuZGV0YWlsLmtleWJvYXJkRXZlbnQ7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8KGIucHJldmVudERlZmF1bHQoKSxiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuX3NldFByZXNzZWQoITApKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGIpe2I9UG9seW1lci5kb20oYi5kZXRhaWwua2V5Ym9hcmRFdmVudCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChiKXx8Cih0aGlzLnByZXNzZWQmJnRoaXMuX2FzeW5jQ2xpY2soKSx0aGlzLl9zZXRQcmVzc2VkKCExKSl9LF9hc3luY0NsaWNrOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuY2xpY2soKX0sMSl9LF9wcmVzc2VkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYW5nZWRCdXR0b25TdGF0ZSgpfSxfYXJpYUFjdGl2ZUF0dHJpYnV0ZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiZkIT1iJiZ0aGlzLmhhc0F0dHJpYnV0ZShkKSYmdGhpcy5yZW1vdmVBdHRyaWJ1dGUoZCl9LF9hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMudG9nZ2xlcz90aGlzLnNldEF0dHJpYnV0ZSh0aGlzLmFyaWFBY3RpdmVBdHRyaWJ1dGUsYj8idHJ1ZSI6ImZhbHNlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlKTt0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NvbnRyb2xTdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkP3RoaXMuX3NldFByZXNzZWQoITEpOgp0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NoYW5nZWRCdXR0b25TdGF0ZTpmdW5jdGlvbigpe3RoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCYmdGhpcy5fYnV0dG9uU3RhdGVDaGFuZ2VkKCl9fTtQb2x5bWVyLklyb25CdXR0b25TdGF0ZT1bUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJpcHBsZS9wYXBlci1yaXBwbGUuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGgpe3RoaXMuZWxlbWVudD1oO3RoaXMud2lkdGg9dGhpcy5ib3VuZGluZ1JlY3Qud2lkdGg7dGhpcy5oZWlnaHQ9dGhpcy5ib3VuZGluZ1JlY3QuaGVpZ2h0O3RoaXMuc2l6ZT1NYXRoLm1heCh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX1mdW5jdGlvbiBkKGgpe3RoaXMuZWxlbWVudD1oO3RoaXMuY29sb3I9d2luZG93LmdldENvbXB1dGVkU3R5bGUoaCkuY29sb3I7dGhpcy53YXZlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMud2F2ZUNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLndhdmUuc3R5bGUuYmFja2dyb3VuZENvbG9yPXRoaXMuY29sb3I7dGhpcy53YXZlLmNsYXNzTGlzdC5hZGQoIndhdmUiKTt0aGlzLndhdmVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgid2F2ZS1jb250YWluZXIiKTtQb2x5bWVyLmRvbSh0aGlzLndhdmVDb250YWluZXIpLmFwcGVuZENoaWxkKHRoaXMud2F2ZSk7dGhpcy5yZXNldEludGVyYWN0aW9uU3RhdGUoKX0KdmFyIGY9e2Rpc3RhbmNlOmZ1bmN0aW9uKGgsayx0LGwpe2gtPXQ7ay09bDtyZXR1cm4gTWF0aC5zcXJ0KGgqaCtrKmspfSxub3c6d2luZG93LnBlcmZvcm1hbmNlJiZ3aW5kb3cucGVyZm9ybWFuY2Uubm93P3dpbmRvdy5wZXJmb3JtYW5jZS5ub3cuYmluZCh3aW5kb3cucGVyZm9ybWFuY2UpOkRhdGUubm93fTtiLnByb3RvdHlwZT17Z2V0IGJvdW5kaW5nUmVjdCgpe3JldHVybiB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9LGZ1cnRoZXN0Q29ybmVyRGlzdGFuY2VGcm9tOmZ1bmN0aW9uKGgsayl7dmFyIHQ9Zi5kaXN0YW5jZShoLGssMCwwKSxsPWYuZGlzdGFuY2UoaCxrLHRoaXMud2lkdGgsMCkscD1mLmRpc3RhbmNlKGgsaywwLHRoaXMuaGVpZ2h0KTtoPWYuZGlzdGFuY2UoaCxrLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO3JldHVybiBNYXRoLm1heCh0LGwscCxoKX19O2QuTUFYX1JBRElVUz0zMDA7ZC5wcm90b3R5cGU9e2dldCByZWNlbnRlcnMoKXtyZXR1cm4gdGhpcy5lbGVtZW50LnJlY2VudGVyc30sCmdldCBjZW50ZXIoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmNlbnRlcn0sZ2V0IG1vdXNlRG93bkVsYXBzZWQoKXtpZighdGhpcy5tb3VzZURvd25TdGFydClyZXR1cm4gMDt2YXIgaD1mLm5vdygpLXRoaXMubW91c2VEb3duU3RhcnQ7dGhpcy5tb3VzZVVwU3RhcnQmJihoLT10aGlzLm1vdXNlVXBFbGFwc2VkKTtyZXR1cm4gaH0sZ2V0IG1vdXNlVXBFbGFwc2VkKCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P2Yubm93KCktdGhpcy5tb3VzZVVwU3RhcnQ6MH0sZ2V0IG1vdXNlRG93bkVsYXBzZWRTZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VEb3duRWxhcHNlZC8xRTN9LGdldCBtb3VzZVVwRWxhcHNlZFNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZVVwRWxhcHNlZC8xRTN9LGdldCBtb3VzZUludGVyYWN0aW9uU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlRG93bkVsYXBzZWRTZWNvbmRzK3RoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzfSxnZXQgaW5pdGlhbE9wYWNpdHkoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmluaXRpYWxPcGFjaXR5fSwKZ2V0IG9wYWNpdHlEZWNheVZlbG9jaXR5KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5vcGFjaXR5RGVjYXlWZWxvY2l0eX0sZ2V0IHJhZGl1cygpe3ZhciBoPTEuMSpNYXRoLm1pbihNYXRoLnNxcnQodGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoKnRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCt0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KnRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQpLGQuTUFYX1JBRElVUykrNTtyZXR1cm4gTWF0aC5hYnMoaCooMS1NYXRoLnBvdyg4MCwtKHRoaXMubW91c2VJbnRlcmFjdGlvblNlY29uZHMvKDEuMS1oL2QuTUFYX1JBRElVUyouMikpKSkpfSxnZXQgb3BhY2l0eSgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD9NYXRoLm1heCgwLHRoaXMuaW5pdGlhbE9wYWNpdHktdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHMqdGhpcy5vcGFjaXR5RGVjYXlWZWxvY2l0eSk6dGhpcy5pbml0aWFsT3BhY2l0eX0sZ2V0IG91dGVyT3BhY2l0eSgpe3JldHVybiBNYXRoLm1heCgwLApNYXRoLm1pbiguMyp0aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kcyx0aGlzLm9wYWNpdHkpKX0sZ2V0IGlzT3BhY2l0eUZ1bGx5RGVjYXllZCgpe3JldHVybi4wMT50aGlzLm9wYWNpdHkmJnRoaXMucmFkaXVzPj1NYXRoLm1pbih0aGlzLm1heFJhZGl1cyxkLk1BWF9SQURJVVMpfSxnZXQgaXNSZXN0aW5nQXRNYXhSYWRpdXMoKXtyZXR1cm4gdGhpcy5vcGFjaXR5Pj10aGlzLmluaXRpYWxPcGFjaXR5JiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsZC5NQVhfUkFESVVTKX0sZ2V0IGlzQW5pbWF0aW9uQ29tcGxldGUoKXtyZXR1cm4gdGhpcy5tb3VzZVVwU3RhcnQ/dGhpcy5pc09wYWNpdHlGdWxseURlY2F5ZWQ6dGhpcy5pc1Jlc3RpbmdBdE1heFJhZGl1c30sZ2V0IHRyYW5zbGF0aW9uRnJhY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4oMSx0aGlzLnJhZGl1cy90aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSoyL01hdGguc3FydCgyKSl9LGdldCB4Tm93KCl7cmV0dXJuIHRoaXMueEVuZD8KdGhpcy54U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnhFbmQtdGhpcy54U3RhcnQpOnRoaXMueFN0YXJ0fSxnZXQgeU5vdygpe3JldHVybiB0aGlzLnlFbmQ/dGhpcy55U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnlFbmQtdGhpcy55U3RhcnQpOnRoaXMueVN0YXJ0fSxnZXQgaXNNb3VzZURvd24oKXtyZXR1cm4gdGhpcy5tb3VzZURvd25TdGFydCYmIXRoaXMubW91c2VVcFN0YXJ0fSxyZXNldEludGVyYWN0aW9uU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLnNsaWRlRGlzdGFuY2U9dGhpcy55RW5kPXRoaXMueEVuZD10aGlzLnlTdGFydD10aGlzLnhTdGFydD10aGlzLm1vdXNlVXBTdGFydD10aGlzLm1vdXNlRG93blN0YXJ0PXRoaXMubWF4UmFkaXVzPTA7dGhpcy5jb250YWluZXJNZXRyaWNzPW5ldyBiKHRoaXMuZWxlbWVudCl9LGRyYXc6ZnVuY3Rpb24oKXt0aGlzLndhdmUuc3R5bGUub3BhY2l0eT10aGlzLm9wYWNpdHk7dmFyIGg9dGhpcy5yYWRpdXMvCih0aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZS8yKTt2YXIgaz10aGlzLnhOb3ctdGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzI7dmFyIHQ9dGhpcy55Tm93LXRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMjt0aGlzLndhdmVDb250YWluZXIuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJ0cmFuc2xhdGUoIitrKyJweCwgIit0KyJweCkiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIraysicHgsICIrdCsicHgsIDApIjt0aGlzLndhdmUuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZSgiK2grIiwiK2grIikiO3RoaXMud2F2ZS5zdHlsZS50cmFuc2Zvcm09InNjYWxlM2QoIitoKyIsIitoKyIsMSkifSxkb3duQWN0aW9uOmZ1bmN0aW9uKGgpe3ZhciBrPXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yLHQ9dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yO3RoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCk7dGhpcy5tb3VzZURvd25TdGFydD0KZi5ub3coKTt0aGlzLmNlbnRlcj8odGhpcy54U3RhcnQ9ayx0aGlzLnlTdGFydD10LHRoaXMuc2xpZGVEaXN0YW5jZT1mLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKToodGhpcy54U3RhcnQ9aD9oLmRldGFpbC54LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QubGVmdDp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMix0aGlzLnlTdGFydD1oP2guZGV0YWlsLnktdGhpcy5jb250YWluZXJNZXRyaWNzLmJvdW5kaW5nUmVjdC50b3A6dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yKTt0aGlzLnJlY2VudGVycyYmKHRoaXMueEVuZD1rLHRoaXMueUVuZD10LHRoaXMuc2xpZGVEaXN0YW5jZT1mLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKTt0aGlzLm1heFJhZGl1cz10aGlzLmNvbnRhaW5lck1ldHJpY3MuZnVydGhlc3RDb3JuZXJEaXN0YW5jZUZyb20odGhpcy54U3RhcnQsCnRoaXMueVN0YXJ0KTt0aGlzLndhdmVDb250YWluZXIuc3R5bGUudG9wPSh0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKS8yKyJweCI7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLmxlZnQ9KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSsicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4In0sdXBBY3Rpb246ZnVuY3Rpb24oKXt0aGlzLmlzTW91c2VEb3duJiYodGhpcy5tb3VzZVVwU3RhcnQ9Zi5ub3coKSl9LHJlbW92ZTpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMud2F2ZUNvbnRhaW5lci5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZCh0aGlzLndhdmVDb250YWluZXIpfX07UG9seW1lcih7aXM6InBhcGVyLXJpcHBsZSIsCmJlaGF2aW9yczpbUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl0scHJvcGVydGllczp7aW5pdGlhbE9wYWNpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi4yNX0sb3BhY2l0eURlY2F5VmVsb2NpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi44fSxyZWNlbnRlcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJpcHBsZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LGFuaW1hdGluZzp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0saG9sZERvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hvbGREb3duQ2hhbmdlZCJ9LG5vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hbmltYXRpbmc6e3R5cGU6Qm9vbGVhbn0sX2JvdW5kQW5pbWF0ZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFuaW1hdGUuYmluZCh0aGlzKX19fSwKZ2V0IHRhcmdldCgpe3JldHVybiB0aGlzLmtleUV2ZW50VGFyZ2V0fSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfb25FbnRlcktleWRvd24iLCJzcGFjZTprZXlkb3duIjoiX29uU3BhY2VLZXlkb3duIiwic3BhY2U6a2V5dXAiOiJfb25TcGFjZUtleXVwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgaD10aGlzLmtleUV2ZW50VGFyZ2V0PTExPT10aGlzLnBhcmVudE5vZGUubm9kZVR5cGU/UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCkuaG9zdDp0aGlzLnBhcmVudE5vZGU7dGhpcy5saXN0ZW4oaCwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy5saXN0ZW4oaCwiZG93biIsInVpRG93bkFjdGlvbiIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5rZXlFdmVudFRhcmdldCwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy51bmxpc3Rlbih0aGlzLmtleUV2ZW50VGFyZ2V0LCJkb3duIiwidWlEb3duQWN0aW9uIik7dGhpcy5rZXlFdmVudFRhcmdldD0KbnVsbH0sZ2V0IHNob3VsZEtlZXBBbmltYXRpbmcoKXtmb3IodmFyIGg9MDtoPHRoaXMucmlwcGxlcy5sZW5ndGg7KytoKWlmKCF0aGlzLnJpcHBsZXNbaF0uaXNBbmltYXRpb25Db21wbGV0ZSlyZXR1cm4hMDtyZXR1cm4hMX0sc2ltdWxhdGVkUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5kb3duQWN0aW9uKG51bGwpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLnVwQWN0aW9uKCl9LDEpfSx1aURvd25BY3Rpb246ZnVuY3Rpb24oaCl7dGhpcy5ub2lua3x8dGhpcy5kb3duQWN0aW9uKGgpfSxkb3duQWN0aW9uOmZ1bmN0aW9uKGgpe3RoaXMuaG9sZERvd24mJjA8dGhpcy5yaXBwbGVzLmxlbmd0aHx8KHRoaXMuYWRkUmlwcGxlKCkuZG93bkFjdGlvbihoKSx0aGlzLl9hbmltYXRpbmd8fCh0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpKX0sdWlVcEFjdGlvbjpmdW5jdGlvbihoKXt0aGlzLm5vaW5rfHx0aGlzLnVwQWN0aW9uKGgpfSx1cEFjdGlvbjpmdW5jdGlvbihoKXt0aGlzLmhvbGREb3dufHwKKHRoaXMucmlwcGxlcy5mb3JFYWNoKGZ1bmN0aW9uKGspe2sudXBBY3Rpb24oaCl9KSx0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpfSxvbkFuaW1hdGlvbkNvbXBsZXRlOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW5nPSExO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj1udWxsO3RoaXMuZmlyZSgidHJhbnNpdGlvbmVuZCIpfSxhZGRSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgaD1uZXcgZCh0aGlzKTtQb2x5bWVyLmRvbSh0aGlzLiQud2F2ZXMpLmFwcGVuZENoaWxkKGgud2F2ZUNvbnRhaW5lcik7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZENvbG9yPWguY29sb3I7dGhpcy5yaXBwbGVzLnB1c2goaCk7dGhpcy5fc2V0QW5pbWF0aW5nKCEwKTtyZXR1cm4gaH0scmVtb3ZlUmlwcGxlOmZ1bmN0aW9uKGgpe3ZhciBrPXRoaXMucmlwcGxlcy5pbmRleE9mKGgpOzA+a3x8KHRoaXMucmlwcGxlcy5zcGxpY2UoaywxKSxoLnJlbW92ZSgpLAp0aGlzLnJpcHBsZXMubGVuZ3RofHx0aGlzLl9zZXRBbmltYXRpbmcoITEpKX0sYW5pbWF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX2FuaW1hdGluZyl7dmFyIGg7Zm9yKGg9MDtoPHRoaXMucmlwcGxlcy5sZW5ndGg7KytoKXt2YXIgaz10aGlzLnJpcHBsZXNbaF07ay5kcmF3KCk7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUub3BhY2l0eT1rLm91dGVyT3BhY2l0eTtrLmlzT3BhY2l0eUZ1bGx5RGVjYXllZCYmIWsuaXNSZXN0aW5nQXRNYXhSYWRpdXMmJnRoaXMucmVtb3ZlUmlwcGxlKGspfWlmKHRoaXMuc2hvdWxkS2VlcEFuaW1hdGluZ3x8MCE9PXRoaXMucmlwcGxlcy5sZW5ndGgpd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9ib3VuZEFuaW1hdGUpO2Vsc2UgdGhpcy5vbkFuaW1hdGlvbkNvbXBsZXRlKCl9fSxfb25FbnRlcktleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpO3RoaXMuYXN5bmModGhpcy51aVVwQWN0aW9uLDEpfSxfb25TcGFjZUtleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpfSwKX29uU3BhY2VLZXl1cDpmdW5jdGlvbigpe3RoaXMudWlVcEFjdGlvbigpfSxfaG9sZERvd25DaGFuZ2VkOmZ1bmN0aW9uKGgsayl7dm9pZCAwIT09ayYmKGg/dGhpcy5kb3duQWN0aW9uKCk6dGhpcy51cEFjdGlvbigpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLXJpcHBsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcj17cHJvcGVydGllczp7bm9pbms6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX25vaW5rQ2hhbmdlZCJ9LF9yaXBwbGVDb250YWluZXI6e3R5cGU6T2JqZWN0fX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZm9jdXNlZCYmdGhpcy5lbnN1cmVSaXBwbGUoKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fZG93bkhhbmRsZXIuY2FsbCh0aGlzLGIpO3RoaXMucHJlc3NlZCYmdGhpcy5lbnN1cmVSaXBwbGUoYil9LGVuc3VyZVJpcHBsZTpmdW5jdGlvbihiKXtpZighdGhpcy5oYXNSaXBwbGUoKSl7dGhpcy5fcmlwcGxlPXRoaXMuX2NyZWF0ZVJpcHBsZSgpO3RoaXMuX3JpcHBsZS5ub2luaz10aGlzLm5vaW5rO3ZhciBkPXRoaXMuX3JpcHBsZUNvbnRhaW5lcnx8dGhpcy5yb290O2QmJlBvbHltZXIuZG9tKGQpLmFwcGVuZENoaWxkKHRoaXMuX3JpcHBsZSk7aWYoYil7ZD0KUG9seW1lci5kb20odGhpcy5fcmlwcGxlQ29udGFpbmVyfHx0aGlzKTt2YXIgZj1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0O2QuZGVlcENvbnRhaW5zKGYpJiZ0aGlzLl9yaXBwbGUudWlEb3duQWN0aW9uKGIpfX19LGdldFJpcHBsZTpmdW5jdGlvbigpe3RoaXMuZW5zdXJlUmlwcGxlKCk7cmV0dXJuIHRoaXMuX3JpcHBsZX0saGFzUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9yaXBwbGV9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItcmlwcGxlIil9LF9ub2lua0NoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5ub2luaz1iKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJlaGF2aW9ycy9wYXBlci1idXR0b24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxyZWFkT25seTohMH19LG9ic2VydmVyczpbIl9jYWxjdWxhdGVFbGV2YXRpb24oZm9jdXNlZCwgZGlzYWJsZWQsIGFjdGl2ZSwgcHJlc3NlZCwgcmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiLCJfY29tcHV0ZUtleWJvYXJkQ2xhc3MocmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiXSxob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIix0YWJpbmRleDoiMCIsYW5pbWF0ZWQ6ITB9LF9jYWxjdWxhdGVFbGV2YXRpb246ZnVuY3Rpb24oKXt2YXIgYj0xO3RoaXMuZGlzYWJsZWQ/Yj0wOnRoaXMuYWN0aXZlfHx0aGlzLnByZXNzZWQ/Yj00OnRoaXMucmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCYmKGI9Myk7dGhpcy5fc2V0RWxldmF0aW9uKGIpfSxfY29tcHV0ZUtleWJvYXJkQ2xhc3M6ZnVuY3Rpb24oYil7dGhpcy50b2dnbGVDbGFzcygia2V5Ym9hcmQtZm9jdXMiLApiKX0sX3NwYWNlS2V5RG93bkhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uQnV0dG9uU3RhdGVJbXBsLl9zcGFjZUtleURvd25IYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLmhhc1JpcHBsZSgpJiYxPnRoaXMuZ2V0UmlwcGxlKCkucmlwcGxlcy5sZW5ndGgmJnRoaXMuX3JpcHBsZS51aURvd25BY3Rpb24oKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fc3BhY2VLZXlVcEhhbmRsZXIuY2FsbCh0aGlzLGIpO3RoaXMuaGFzUmlwcGxlKCkmJnRoaXMuX3JpcHBsZS51aVVwQWN0aW9uKCl9fTtQb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IsUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYnV0dG9uL3BhcGVyLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1idXR0b24iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntyYWlzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jYWxjdWxhdGVFbGV2YXRpb24ifX0sX2NhbGN1bGF0ZUVsZXZhdGlvbjpmdW5jdGlvbigpe3RoaXMucmFpc2VkP1BvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvckltcGwuX2NhbGN1bGF0ZUVsZXZhdGlvbi5hcHBseSh0aGlzKTp0aGlzLl9zZXRFbGV2YXRpb24oMCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1tZXRhL2lyb24tbWV0YS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbk1ldGE9ZnVuY3Rpb24oZCl7UG9seW1lci5Jcm9uTWV0YVsiICJdKGQpO3RoaXMudHlwZT1kJiZkLnR5cGV8fCJkZWZhdWx0Ijt0aGlzLmtleT1kJiZkLmtleTtkJiYidmFsdWUiaW4gZCYmKHRoaXMudmFsdWU9ZC52YWx1ZSl9O1BvbHltZXIuSXJvbk1ldGFbIiAiXT1mdW5jdGlvbigpe307UG9seW1lci5Jcm9uTWV0YS50eXBlcz17fTtQb2x5bWVyLklyb25NZXRhLnByb3RvdHlwZT17Z2V0IHZhbHVlKCl7dmFyIGQ9dGhpcy50eXBlLGY9dGhpcy5rZXk7aWYoZCYmZilyZXR1cm4gUG9seW1lci5Jcm9uTWV0YS50eXBlc1tkXSYmUG9seW1lci5Jcm9uTWV0YS50eXBlc1tkXVtmXX0sc2V0IHZhbHVlKGQpe3ZhciBmPXRoaXMudHlwZSxoPXRoaXMua2V5O2YmJmgmJihmPVBvbHltZXIuSXJvbk1ldGEudHlwZXNbZl09UG9seW1lci5Jcm9uTWV0YS50eXBlc1tmXXx8e30sbnVsbD09ZD9kZWxldGUgZltoXTpmW2hdPWQpfSxnZXQgbGlzdCgpe2lmKHRoaXMudHlwZSl7dmFyIGQ9ClBvbHltZXIuSXJvbk1ldGEudHlwZXNbdGhpcy50eXBlXTtyZXR1cm4gZD9PYmplY3Qua2V5cyhkKS5tYXAoZnVuY3Rpb24oZil7cmV0dXJuIGJbdGhpcy50eXBlXVtmXX0sdGhpcyk6W119fSxieUtleTpmdW5jdGlvbihkKXt0aGlzLmtleT1kO3JldHVybiB0aGlzLnZhbHVlfX07dmFyIGI9UG9seW1lci5Jcm9uTWV0YS50eXBlcztQb2x5bWVyKHtpczoiaXJvbi1tZXRhIixwcm9wZXJ0aWVzOnt0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiZGVmYXVsdCJ9LGtleTp7dHlwZTpTdHJpbmd9LHZhbHVlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGY6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX3NlbGZDaGFuZ2VkIn0sX19tZXRhOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9fY29tcHV0ZU1ldGEodHlwZSwga2V5LCB2YWx1ZSkifX0saG9zdEF0dHJpYnV0ZXM6e2hpZGRlbjohMH0sX19jb21wdXRlTWV0YTpmdW5jdGlvbihkLGYsaCl7ZD1uZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZTpkLAprZXk6Zn0pO3ZvaWQgMCE9PWgmJmghPT1kLnZhbHVlP2QudmFsdWU9aDp0aGlzLnZhbHVlIT09ZC52YWx1ZSYmKHRoaXMudmFsdWU9ZC52YWx1ZSk7cmV0dXJuIGR9LGdldCBsaXN0KCl7cmV0dXJuIHRoaXMuX19tZXRhJiZ0aGlzLl9fbWV0YS5saXN0fSxfc2VsZkNoYW5nZWQ6ZnVuY3Rpb24oZCl7ZCYmKHRoaXMudmFsdWU9dGhpcyl9LGJ5S2V5OmZ1bmN0aW9uKGQpe3JldHVybihuZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZTp0aGlzLnR5cGUsa2V5OmR9KSkudmFsdWV9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tdmFsaWRhdGFibGUtYmVoYXZpb3IvaXJvbi12YWxpZGF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhPW51bGw7ClBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3ZhbGlkYXRvcjp7dHlwZTpTdHJpbmd9LGludmFsaWQ6e25vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaW52YWxpZENoYW5nZWQifX0scmVnaXN0ZXJlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJ2YWxpZGF0b3IifSl9LF9pbnZhbGlkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuaW52YWxpZD90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWludmFsaWQiKX0sZ2V0IF92YWxpZGF0b3IoKXtyZXR1cm4gUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvck1ldGEmJlBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhLmJ5S2V5KHRoaXMudmFsaWRhdG9yKX0saGFzVmFsaWRhdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPQp0aGlzLl92YWxpZGF0b3J9LHZhbGlkYXRlOmZ1bmN0aW9uKGIpe3RoaXMuaW52YWxpZD12b2lkIDA9PT1iJiZ2b2lkIDAhPT10aGlzLnZhbHVlPyF0aGlzLl9nZXRWYWxpZGl0eSh0aGlzLnZhbHVlKTohdGhpcy5fZ2V0VmFsaWRpdHkoYik7cmV0dXJuIXRoaXMuaW52YWxpZH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmhhc1ZhbGlkYXRvcigpP3RoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZShiKTohMH19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZm9ybS1lbGVtZW50LWJlaGF2aW9yL2lyb24tZm9ybS1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcj17cHJvcGVydGllczp7bmFtZTp7dHlwZTpTdHJpbmd9LHZhbHVlOntub3RpZnk6ITAsdHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wYXJlbnRGb3JtOnt0eXBlOk9iamVjdH19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5FbGVtZW50fHx0aGlzLmZpcmUoImlyb24tZm9ybS1lbGVtZW50LXJlZ2lzdGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7IVBvbHltZXIuRWxlbWVudCYmdGhpcy5fcGFyZW50Rm9ybSYmdGhpcy5fcGFyZW50Rm9ybS5maXJlKCJpcm9uLWZvcm0tZWxlbWVudC11bnJlZ2lzdGVyIix7dGFyZ2V0OnRoaXN9KX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e2NoZWNrZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsbm90aWZ5OiEwLG9ic2VydmVyOiJfY2hlY2tlZENoYW5nZWQifSx0b2dnbGVzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9uIixvYnNlcnZlcjoiX3ZhbHVlQ2hhbmdlZCJ9fSxvYnNlcnZlcnM6WyJfcmVxdWlyZWRDaGFuZ2VkKHJlcXVpcmVkKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNJcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj0hMH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCF0aGlzLnJlcXVpcmVkfHx0aGlzLmNoZWNrZWR9LF9yZXF1aXJlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlcXVpcmVkP3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXJlcXVpcmVkIiwKInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIpfSxfY2hlY2tlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZT10aGlzLmNoZWNrZWQ7dGhpcy5maXJlKCJpcm9uLWNoYW5nZSIpfSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpcy52YWx1ZXx8bnVsbD09PXRoaXMudmFsdWUpdGhpcy52YWx1ZT0ib24ifX07UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj1bUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1iZWhhdmlvcnMvcGFwZXItaW5reS1mb2N1cy1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvckltcGw9e29ic2VydmVyczpbIl9mb2N1c2VkQ2hhbmdlZChyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSJdLF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbihiKXtiJiZ0aGlzLmVuc3VyZVJpcHBsZSgpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuaG9sZERvd249Yil9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2NyZWF0ZVJpcHBsZSgpO2IuaWQ9ImluayI7Yi5zZXRBdHRyaWJ1dGUoImNlbnRlciIsIiIpO2IuY2xhc3NMaXN0LmFkZCgiY2lyY2xlIik7cmV0dXJuIGJ9fTtQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IsUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLWNoZWNrZWQtZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbD17X2NoZWNrZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGwuX2NoZWNrZWRDaGFuZ2VkLmNhbGwodGhpcyk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuY2hlY2tlZD90aGlzLl9yaXBwbGUuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiIik6dGhpcy5fcmlwcGxlLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpKX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe1BvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvci5fYnV0dG9uU3RhdGVDaGFuZ2VkLmNhbGwodGhpcyk7IXRoaXMuZGlzYWJsZWQmJnRoaXMuaXNBdHRhY2hlZCYmKHRoaXMuY2hlY2tlZD10aGlzLmFjdGl2ZSl9fTsKUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3I9W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcixQb2x5bWVyLklyb25DaGVja2VkRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItY2hlY2tib3gvcGFwZXItY2hlY2tib3guaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItY2hlY2tib3giLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJjaGVja2JveCIsImFyaWEtY2hlY2tlZCI6ITEsdGFiaW5kZXg6MH0scHJvcGVydGllczp7YXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtY2hlY2tlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSIpLnRyaW0oKSl7dmFyIGI9dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplIikudHJpbSgpLGQ9InB4IixmPWIubWF0Y2goL1tBLVphLXpdKyQvKTtudWxsIT09ZiYmKGQ9ZlswXSk7Yj1wYXJzZUZsb2F0KGIpOwpmPTgvMypiOyJweCI9PT1kJiYoZj1NYXRoLmZsb29yKGYpLGYlMiE9PWIlMiYmZisrKTt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUiOmYrZH0pfX0pfSxfY29tcHV0ZUNoZWNrYm94Q2xhc3M6ZnVuY3Rpb24oYixkKXt2YXIgZj0iIjtiJiYoZis9ImNoZWNrZWQgIik7ZCYmKGYrPSJpbnZhbGlkIik7cmV0dXJuIGZ9LF9jb21wdXRlQ2hlY2ttYXJrQ2xhc3M6ZnVuY3Rpb24oYil7cmV0dXJuIGI/IiI6ImhpZGRlbiJ9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLmNoZWNrYm94Q29udGFpbmVyO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWljb24vaXJvbi1pY29uLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24taWNvbiIscHJvcGVydGllczp7aWNvbjp7dHlwZTpTdHJpbmd9LHRoZW1lOnt0eXBlOlN0cmluZ30sc3JjOnt0eXBlOlN0cmluZ30sX21ldGE6e3ZhbHVlOlBvbHltZXIuQmFzZS5jcmVhdGUoImlyb24tbWV0YSIse3R5cGU6Imljb25zZXQifSl9fSxvYnNlcnZlcnM6WyJfdXBkYXRlSWNvbihfbWV0YSwgaXNBdHRhY2hlZCkiLCJfdXBkYXRlSWNvbih0aGVtZSwgaXNBdHRhY2hlZCkiLCJfc3JjQ2hhbmdlZChzcmMsIGlzQXR0YWNoZWQpIiwiX2ljb25DaGFuZ2VkKGljb24sIGlzQXR0YWNoZWQpIl0sX0RFRkFVTFRfSUNPTlNFVDoiaWNvbnMiLF9pY29uQ2hhbmdlZDpmdW5jdGlvbihiKXtiPShifHwiIikuc3BsaXQoIjoiKTt0aGlzLl9pY29uTmFtZT1iLnBvcCgpO3RoaXMuX2ljb25zZXROYW1lPWIucG9wKCl8fHRoaXMuX0RFRkFVTFRfSUNPTlNFVDt0aGlzLl91cGRhdGVJY29uKCl9LF9zcmNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWNvbigpfSwKX3VzZXNJY29uc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWNvbnx8IXRoaXMuc3JjfSxfdXBkYXRlSWNvbjpmdW5jdGlvbigpe3RoaXMuX3VzZXNJY29uc2V0KCk/KHRoaXMuX2ltZyYmdGhpcy5faW1nLnBhcmVudE5vZGUmJlBvbHltZXIuZG9tKHRoaXMucm9vdCkucmVtb3ZlQ2hpbGQodGhpcy5faW1nKSwiIj09PXRoaXMuX2ljb25OYW1lP3RoaXMuX2ljb25zZXQmJnRoaXMuX2ljb25zZXQucmVtb3ZlSWNvbih0aGlzKTp0aGlzLl9pY29uc2V0TmFtZSYmdGhpcy5fbWV0YSYmKCh0aGlzLl9pY29uc2V0PXRoaXMuX21ldGEuYnlLZXkodGhpcy5faWNvbnNldE5hbWUpKT8odGhpcy5faWNvbnNldC5hcHBseUljb24odGhpcyx0aGlzLl9pY29uTmFtZSx0aGlzLnRoZW1lKSx0aGlzLnVubGlzdGVuKHdpbmRvdywiaXJvbi1pY29uc2V0LWFkZGVkIiwiX3VwZGF0ZUljb24iKSk6dGhpcy5saXN0ZW4od2luZG93LCJpcm9uLWljb25zZXQtYWRkZWQiLCJfdXBkYXRlSWNvbiIpKSk6KHRoaXMuX2ljb25zZXQmJgp0aGlzLl9pY29uc2V0LnJlbW92ZUljb24odGhpcyksdGhpcy5faW1nfHwodGhpcy5faW1nPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLHRoaXMuX2ltZy5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5faW1nLnN0eWxlLmhlaWdodD0iMTAwJSIsdGhpcy5faW1nLmRyYWdnYWJsZT0hMSksdGhpcy5faW1nLnNyYz10aGlzLnNyYyxQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLmFwcGVuZENoaWxkKHRoaXMuX2ltZykpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYTExeS1hbm5vdW5jZXIvaXJvbi1hMTF5LWFubm91bmNlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXI9ZnVuY3Rpb24oKXt9O1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXI9UG9seW1lcih7aXM6Imlyb24tYTExeS1hbm5vdW5jZXIiLHByb3BlcnRpZXM6e21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwb2xpdGUifSxfdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZXx8KFBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9dGhpcyk7ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJpcm9uLWFubm91bmNlIix0aGlzLl9vbklyb25Bbm5vdW5jZS5iaW5kKHRoaXMpKX0sYW5ub3VuY2U6ZnVuY3Rpb24oYil7dGhpcy5fdGV4dD0iIjt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fdGV4dD1ifSwxMDApfSxfb25Jcm9uQW5ub3VuY2U6ZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLnRleHQmJnRoaXMuYW5ub3VuY2UoYi5kZXRhaWwudGV4dCl9fSk7ClBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9bnVsbDtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHk9ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlfHwoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLWExMXktYW5ub3VuY2VyIikpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZSl9fSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWlucHV0L2lyb24taW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1pbnB1dCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntiaW5kVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSx2YWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVmFsdWUoYmluZFZhbHVlKSJ9LGFsbG93ZWRQYXR0ZXJuOnt0eXBlOlN0cmluZ30sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbnB1dEVsZW1lbnQ6T2JqZWN0fSxvYnNlcnZlcnM6WyJfYmluZFZhbHVlQ2hhbmdlZChiaW5kVmFsdWUsIF9pbnB1dEVsZW1lbnQpIl0sbGlzdGVuZXJzOntpbnB1dDoiX29uSW5wdXQiLGtleXByZXNzOiJfb25LZXlwcmVzcyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKTt0aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ9IiI7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPQpQb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoZnVuY3Rpb24oKXt0aGlzLl9pbml0U2xvdHRlZElucHV0KCl9LmJpbmQodGhpcykpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiYoUG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpLHRoaXMuX29ic2VydmVyPW51bGwpfSxnZXQgaW5wdXRFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudH0sX2luaXRTbG90dGVkSW5wdXQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEVsZW1lbnQ9dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpWzBdO3RoaXMuaW5wdXRFbGVtZW50JiZ0aGlzLmlucHV0RWxlbWVudC52YWx1ZSYmKHRoaXMuYmluZFZhbHVlPXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlKTt0aGlzLmZpcmUoImlyb24taW5wdXQtcmVhZHkiKX0sZ2V0IF9wYXR0ZXJuUmVnRXhwKCl7aWYodGhpcy5hbGxvd2VkUGF0dGVybil2YXIgYj1uZXcgUmVnRXhwKHRoaXMuYWxsb3dlZFBhdHRlcm4pOwplbHNlIHN3aXRjaCh0aGlzLmlucHV0RWxlbWVudC50eXBlKXtjYXNlICJudW1iZXIiOmI9L1swLTkuLGUtXS99cmV0dXJuIGJ9LF9iaW5kVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmKHZvaWQgMD09PWI/ZC52YWx1ZT1udWxsOmIhPT1kLnZhbHVlJiYodGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9YiksdGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOmJ9KSl9LF9vbklucHV0OmZ1bmN0aW9uKCl7IXRoaXMuYWxsb3dlZFBhdHRlcm58fHRoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZHx8dGhpcy5fY2hlY2tQYXR0ZXJuVmFsaWRpdHkoKXx8KHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBzdHJpbmcgb2YgY2hhcmFjdGVycyBub3QgZW50ZXJlZC4iKSx0aGlzLmlucHV0RWxlbWVudC52YWx1ZT10aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQpO3RoaXMuYmluZFZhbHVlPXRoaXMuX3ByZXZpb3VzVmFsaWRJbnB1dD0KdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxfaXNQcmludGFibGU6ZnVuY3Rpb24oYil7dmFyIGQ9MTk9PWIua2V5Q29kZXx8MjA9PWIua2V5Q29kZXx8NDU9PWIua2V5Q29kZXx8NDY9PWIua2V5Q29kZXx8MTQ0PT1iLmtleUNvZGV8fDE0NT09Yi5rZXlDb2RlfHwzMjxiLmtleUNvZGUmJjQxPmIua2V5Q29kZXx8MTExPGIua2V5Q29kZSYmMTI0PmIua2V5Q29kZTtyZXR1cm4hKDg9PWIua2V5Q29kZXx8OT09Yi5rZXlDb2RlfHwxMz09Yi5rZXlDb2RlfHwyNz09Yi5rZXlDb2RlKSYmISgwPT1iLmNoYXJDb2RlJiZkKX0sX29uS2V5cHJlc3M6ZnVuY3Rpb24oYil7aWYodGhpcy5hbGxvd2VkUGF0dGVybnx8Im51bWJlciI9PT10aGlzLmlucHV0RWxlbWVudC50eXBlKXt2YXIgZD10aGlzLl9wYXR0ZXJuUmVnRXhwO2lmKGQmJiEoYi5tZXRhS2V5fHxiLmN0cmxLZXl8fGIuYWx0S2V5KSl7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPQohMDt2YXIgZj1TdHJpbmcuZnJvbUNoYXJDb2RlKGIuY2hhckNvZGUpO3RoaXMuX2lzUHJpbnRhYmxlKGIpJiYhZC50ZXN0KGYpJiYoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBjaGFyYWN0ZXIgIitmKyIgbm90IGVudGVyZWQuIikpfX19LF9jaGVja1BhdHRlcm5WYWxpZGl0eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX3BhdHRlcm5SZWdFeHA7aWYoIWIpcmV0dXJuITA7Zm9yKHZhciBkPTA7ZDx0aGlzLmlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGg7ZCsrKWlmKCFiLnRlc3QodGhpcy5pbnB1dEVsZW1lbnQudmFsdWVbZF0pKXJldHVybiExO3JldHVybiEwfSx2YWxpZGF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmlucHV0RWxlbWVudClyZXR1cm4gdGhpcy5pbnZhbGlkPSExLCEwO3ZhciBiPXRoaXMuaW5wdXRFbGVtZW50LmNoZWNrVmFsaWRpdHkoKTtiJiYodGhpcy5yZXF1aXJlZCYmIiI9PT10aGlzLmJpbmRWYWx1ZT9iPSExOgp0aGlzLmhhc1ZhbGlkYXRvcigpJiYoYj1Qb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLmJpbmRWYWx1ZSkpKTt0aGlzLmludmFsaWQ9IWI7dGhpcy5maXJlKCJpcm9uLWlucHV0LXZhbGlkYXRlIik7cmV0dXJuIGJ9LF9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXI6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDpifSl9LF9jb21wdXRlVmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIGJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXI9e307UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRMYWJlbElEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRBZGRvbklEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRJbnB1dElEPTE7ClBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7bGFiZWw6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LHR5cGU6e3R5cGU6U3RyaW5nfSxsaXN0Ont0eXBlOlN0cmluZ30scGF0dGVybjp7dHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGVycm9yTWVzc2FnZTp7dHlwZTpTdHJpbmd9LGNoYXJDb3VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vTGFiZWxGbG9hdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxhdXRvY29tcGxldGU6e3R5cGU6U3RyaW5nLAp2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9hdXRvZm9jdXNDaGFuZ2VkIn0saW5wdXRtb2RlOnt0eXBlOlN0cmluZ30sbWlubGVuZ3RoOnt0eXBlOk51bWJlcn0sbWF4bGVuZ3RoOnt0eXBlOk51bWJlcn0sbWluOnt0eXBlOlN0cmluZ30sbWF4Ont0eXBlOlN0cmluZ30sc3RlcDp7dHlwZTpTdHJpbmd9LG5hbWU6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHJlYWRvbmx5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNpemU6e3R5cGU6TnVtYmVyfSxhdXRvY2FwaXRhbGl6ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im5vbmUifSxhdXRvY29ycmVjdDp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZiJ9LGF1dG9zYXZlOnt0eXBlOlN0cmluZ30scmVzdWx0czp7dHlwZTpOdW1iZXJ9LGFjY2VwdDp7dHlwZTpTdHJpbmd9LG11bHRpcGxlOnt0eXBlOkJvb2xlYW59LF9hcmlhRGVzY3JpYmVkQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSwKX2FyaWFMYWJlbGxlZEJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2lucHV0SWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sbGlzdGVuZXJzOnsiYWRkb24tYXR0YWNoZWQiOiJfb25BZGRvbkF0dGFjaGVkIn0sa2V5QmluZGluZ3M6eyJzaGlmdCt0YWI6a2V5ZG93biI6Il9vblNoaWZ0VGFiRG93biJ9LGhvc3RBdHRyaWJ1dGVzOnt0YWJpbmRleDowfSxnZXQgaW5wdXRFbGVtZW50KCl7dGhpcy4kfHwodGhpcy4kPXt9KTt0aGlzLiQuaW5wdXR8fCh0aGlzLl9nZW5lcmF0ZUlucHV0SWQoKSx0aGlzLiQuaW5wdXQ9dGhpcy4kJCgiIyIrdGhpcy5faW5wdXRJZCkpO3JldHVybiB0aGlzLiQuaW5wdXR9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudH0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3R5cGVzVGhhdEhhdmVUZXh0PSJkYXRlIGRhdGV0aW1lIGRhdGV0aW1lLWxvY2FsIG1vbnRoIHRpbWUgd2VlayBmaWxlIi5zcGxpdCgiICIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCk7CiFQb2x5bWVyLkVsZW1lbnQmJnRoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy5pbnB1dEVsZW1lbnQudHlwZSkmJih0aGlzLmFsd2F5c0Zsb2F0TGFiZWw9ITApfSxfYXBwZW5kU3RyaW5nV2l0aFNwYWNlOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/YisiICIrZDpkfSxfb25BZGRvbkF0dGFjaGVkOmZ1bmN0aW9uKGIpe2I9UG9seW1lci5kb20oYikucm9vdFRhcmdldDtpZihiLmlkKXRoaXMuX2FyaWFEZXNjcmliZWRCeT10aGlzLl9hcHBlbmRTdHJpbmdXaXRoU3BhY2UodGhpcy5fYXJpYURlc2NyaWJlZEJ5LGIuaWQpO2Vsc2V7dmFyIGQ9InBhcGVyLWlucHV0LWFkZC1vbi0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0QWRkb25JRCsrO2IuaWQ9ZDt0aGlzLl9hcmlhRGVzY3JpYmVkQnk9dGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSxkKX19LHZhbGlkYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnZhbGlkYXRlKCl9LApfZm9jdXNCbHVySGFuZGxlcjpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25Db250cm9sU3RhdGUuX2ZvY3VzQmx1ckhhbmRsZXIuY2FsbCh0aGlzLGIpO3RoaXMuZm9jdXNlZCYmIXRoaXMuX3NoaWZ0VGFiUHJlc3NlZCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfSxfb25TaGlmdFRhYkRvd246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITA7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixiKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfaGFuZGxlQXV0b1ZhbGlkYXRlOmZ1bmN0aW9uKCl7dGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKX0sdXBkYXRlVmFsdWVBbmRQcmVzZXJ2ZUNhcmV0OmZ1bmN0aW9uKGIpe3RyeXt2YXIgZD0KdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7dGhpcy52YWx1ZT1iO3RoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0PWQ7dGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kPWR9Y2F0Y2goZil7dGhpcy52YWx1ZT1ifX0sX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGR8fGJ9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigibGFiZWwiKTtpZihiKXtpZihiLmlkKXZhciBkPWIuaWQ7ZWxzZSBkPSJwYXBlci1pbnB1dC1sYWJlbC0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0TGFiZWxJRCsrLGIuaWQ9ZDt0aGlzLl9hcmlhTGFiZWxsZWRCeT1kfWVsc2UgdGhpcy5fYXJpYUxhYmVsbGVkQnk9IiJ9LF9nZW5lcmF0ZUlucHV0SWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dElkJiYiIiE9PXRoaXMuX2lucHV0SWR8fCh0aGlzLl9pbnB1dElkPQoiaW5wdXQtIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dElucHV0SUQrKyl9LF9vbkNoYW5nZTpmdW5jdGlvbihiKXt0aGlzLnNoYWRvd1Jvb3QmJnRoaXMuZmlyZShiLnR5cGUse3NvdXJjZUV2ZW50OmJ9LHtub2RlOnRoaXMsYnViYmxlczpiLmJ1YmJsZXMsY2FuY2VsYWJsZTpiLmNhbmNlbGFibGV9KX0sX2F1dG9mb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLmF1dG9mb2N1cyYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCl7dmFyIGI9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtiIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmIhPT1kb2N1bWVudC5ib2R5JiZiIT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx0aGlzLl9mb2N1c2FibGVFbGVtZW50LmZvY3VzKCl9fX07UG9seW1lci5QYXBlcklucHV0QmVoYXZpb3I9W1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYWRkb24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yPXthdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiYWRkb24tYXR0YWNoZWQiKX0sdXBkYXRlOmZ1bmN0aW9uKCl7fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWNoYXItY291bnRlciIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntfY2hhckNvdW50ZXJTdHI6e3R5cGU6U3RyaW5nLHZhbHVlOiIwIn19LHVwZGF0ZTpmdW5jdGlvbihiKXtpZihiLmlucHV0RWxlbWVudCl7Yi52YWx1ZT1iLnZhbHVlfHwiIjt2YXIgZD1iLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoLnRvU3RyaW5nKCk7Yi5pbnB1dEVsZW1lbnQuaGFzQXR0cmlidXRlKCJtYXhsZW5ndGgiKSYmKGQrPSIvIitiLmlucHV0RWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1heGxlbmd0aCIpKTt0aGlzLl9jaGFyQ291bnRlclN0cj1kfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pbnB1dC9wYXBlci1pbnB1dC1jb250YWluZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtY29udGFpbmVyIixwcm9wZXJ0aWVzOntub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhdHRyRm9yVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJiaW5kLXZhbHVlIn0sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGludmFsaWQ6e29ic2VydmVyOiJfaW52YWxpZENoYW5nZWQiLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZm9jdXNlZDp7cmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sX2FkZG9uczp7dHlwZTpBcnJheX0sX2lucHV0SGFzQ29udGVudDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5wdXRTZWxlY3Rvcjp7dHlwZTpTdHJpbmcsdmFsdWU6ImlucHV0LGlyb24taW5wdXQsdGV4dGFyZWEsLnBhcGVyLWlucHV0LWlucHV0In0sX2JvdW5kT25Gb2N1czp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbkZvY3VzLmJpbmQodGhpcyl9fSwKX2JvdW5kT25CbHVyOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uQmx1ci5iaW5kKHRoaXMpfX0sX2JvdW5kT25JbnB1dDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbklucHV0LmJpbmQodGhpcyl9fSxfYm91bmRWYWx1ZUNoYW5nZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25WYWx1ZUNoYW5nZWQuYmluZCh0aGlzKX19fSxsaXN0ZW5lcnM6eyJhZGRvbi1hdHRhY2hlZCI6Il9vbkFkZG9uQXR0YWNoZWQiLCJpcm9uLWlucHV0LXZhbGlkYXRlIjoiX29uSXJvbklucHV0VmFsaWRhdGUifSxnZXQgX3ZhbHVlQ2hhbmdlZEV2ZW50KCl7cmV0dXJuIHRoaXMuYXR0ckZvclZhbHVlKyItY2hhbmdlZCJ9LGdldCBfcHJvcGVydHlGb3JWYWx1ZSgpe3JldHVybiBQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclZhbHVlKX0sZ2V0IF9pbnB1dEVsZW1lbnQoKXtyZXR1cm4gUG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3Rvcih0aGlzLl9pbnB1dFNlbGVjdG9yKX0sCmdldCBfaW5wdXRFbGVtZW50VmFsdWUoKXtyZXR1cm4gdGhpcy5faW5wdXRFbGVtZW50W3RoaXMuX3Byb3BlcnR5Rm9yVmFsdWVdfHx0aGlzLl9pbnB1dEVsZW1lbnQudmFsdWV9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZT0hMDt0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2JvdW5kT25Gb2N1cywhMCk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9ib3VuZE9uQmx1ciwhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5hdHRyRm9yVmFsdWU/dGhpcy5faW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5fdmFsdWVDaGFuZ2VkRXZlbnQsdGhpcy5fYm91bmRWYWx1ZUNoYW5nZWQpOnRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHRoaXMuX29uSW5wdXQpO3RoaXMuX2lucHV0RWxlbWVudFZhbHVlJiYiIiE9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU/CnRoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudCk6dGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KX0sX29uQWRkb25BdHRhY2hlZDpmdW5jdGlvbihiKXt0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pO2I9Yi50YXJnZXQ7LTE9PT10aGlzLl9hZGRvbnMuaW5kZXhPZihiKSYmKHRoaXMuX2FkZG9ucy5wdXNoKGIpLHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KSl9LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Rm9jdXNlZCghMCl9LF9vbkJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRGb2N1c2VkKCExKTt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnQpfSxfb25JbnB1dDpmdW5jdGlvbihiKXt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZShiLnRhcmdldCl9LF9vblZhbHVlQ2hhbmdlZDpmdW5jdGlvbihiKXt2YXIgZD0KYi50YXJnZXQ7aWYodGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZSYmKHRoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGU9ITEsdm9pZCAwPT09ZC52YWx1ZXx8IiI9PT1kLnZhbHVlKSlyZXR1cm47dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUoYi50YXJnZXQpfSxfaGFuZGxlVmFsdWU6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU7ZHx8MD09PWR8fCJudW1iZXIiPT09Yi50eXBlJiYhYi5jaGVja1ZhbGlkaXR5KCk/dGhpcy5faW5wdXRIYXNDb250ZW50PSEwOnRoaXMuX2lucHV0SGFzQ29udGVudD0hMTt0aGlzLnVwZGF0ZUFkZG9ucyh7aW5wdXRFbGVtZW50OmIsdmFsdWU6ZCxpbnZhbGlkOnRoaXMuaW52YWxpZH0pfSxfaGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGU6ZnVuY3Rpb24oYil7dGhpcy5hdXRvVmFsaWRhdGUmJmImJih0aGlzLmludmFsaWQ9IShiLnZhbGlkYXRlP2IudmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50VmFsdWUpOmIuY2hlY2tWYWxpZGl0eSgpKSk7CnRoaXMuX2hhbmRsZVZhbHVlKGIpfSxfb25Jcm9uSW5wdXRWYWxpZGF0ZTpmdW5jdGlvbigpe3RoaXMuaW52YWxpZD10aGlzLl9pbnB1dEVsZW1lbnQuaW52YWxpZH0sX2ludmFsaWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fYWRkb25zJiZ0aGlzLnVwZGF0ZUFkZG9ucyh7aW52YWxpZDp0aGlzLmludmFsaWR9KX0sdXBkYXRlQWRkb25zOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZCxmPTA7ZD10aGlzLl9hZGRvbnNbZl07ZisrKWQudXBkYXRlKGIpfSxfY29tcHV0ZUlucHV0Q29udGVudENsYXNzOmZ1bmN0aW9uKGIsZCxmLGgsayl7dmFyIHQ9ImlucHV0LWNvbnRlbnQiO2I/KGsmJih0Kz0iIGxhYmVsLWlzLWhpZGRlbiIpLGgmJih0Kz0iIGlzLWludmFsaWQiKSk6KGI9dGhpcy5xdWVyeVNlbGVjdG9yKCJsYWJlbCIpLGR8fGs/KHQrPSIgbGFiZWwtaXMtZmxvYXRpbmciLHRoaXMuJC5sYWJlbEFuZElucHV0Q29udGFpbmVyLnN0eWxlLnBvc2l0aW9uPSJzdGF0aWMiLGg/dCs9IiBpcy1pbnZhbGlkIjoKZiYmKHQrPSIgbGFiZWwtaXMtaGlnaGxpZ2h0ZWQiKSk6KGImJih0aGlzLiQubGFiZWxBbmRJbnB1dENvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoJiYodCs9IiBpcy1pbnZhbGlkIikpKTtmJiYodCs9IiBmb2N1c2VkIik7cmV0dXJuIHR9LF9jb21wdXRlVW5kZXJsaW5lQ2xhc3M6ZnVuY3Rpb24oYixkKXt2YXIgZj0idW5kZXJsaW5lIjtkP2YrPSIgaXMtaW52YWxpZCI6YiYmKGYrPSIgaXMtaGlnaGxpZ2h0ZWQiKTtyZXR1cm4gZn0sX2NvbXB1dGVBZGRPbkNvbnRlbnRDbGFzczpmdW5jdGlvbihiLGQpe3ZhciBmPSJhZGQtb24tY29udGVudCI7ZD9mKz0iIGlzLWludmFsaWQiOmImJihmKz0iIGlzLWhpZ2hsaWdodGVkIik7cmV0dXJuIGZ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtZXJyb3IuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtZXJyb3IiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcl0scHJvcGVydGllczp7aW52YWxpZDp7cmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbn19LHVwZGF0ZTpmdW5jdGlvbihiKXt0aGlzLl9zZXRJbnZhbGlkKGIuaW52YWxpZCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QmVoYXZpb3IsUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcl0scHJvcGVydGllczp7dmFsdWU6e3R5cGU6U3RyaW5nfX0sYmVmb3JlUmVnaXN0ZXI6ZnVuY3Rpb24oKXt2YXIgYj0iZnVuY3Rpb24iPT10eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1pbnB1dCIpLl9pbml0U2xvdHRlZElucHV0PyJ2MSI6InYwIixkPVBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCgicGFwZXItaW5wdXQiLCJ0ZW1wbGF0ZSIpO2I9UG9seW1lci5Eb21Nb2R1bGUuaW1wb3J0KCJwYXBlci1pbnB1dCIsInRlbXBsYXRlIyIrYik7KGQ9ZC5jb250ZW50LnF1ZXJ5U2VsZWN0b3IoIiN0ZW1wbGF0ZS1wbGFjZWhvbGRlciIpKSYmZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLmNvbnRlbnQsZCl9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiBQb2x5bWVyLkVsZW1lbnQ/dGhpcy5pbnB1dEVsZW1lbnQuX2lucHV0RWxlbWVudDoKdGhpcy5pbnB1dEVsZW1lbnR9LGxpc3RlbmVyczp7Imlyb24taW5wdXQtcmVhZHkiOiJfb25Jcm9uSW5wdXRSZWFkeSJ9LF9vbklyb25JbnB1dFJlYWR5OmZ1bmN0aW9uKCl7dGhpcy4kLm5hdGl2ZUlucHV0fHwodGhpcy4kLm5hdGl2ZUlucHV0PXRoaXMuJCQoImlucHV0IikpO3RoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy4kLm5hdGl2ZUlucHV0LnR5cGUpJiYodGhpcy5hbHdheXNGbG9hdExhYmVsPSEwKTt0aGlzLmlucHV0RWxlbWVudC5iaW5kVmFsdWUmJnRoaXMuJC5jb250YWluZXIuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuaW5wdXRFbGVtZW50KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWZpdC1iZWhhdmlvci9pcm9uLWZpdC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkZpdEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzaXppbmdUYXJnZXQ6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSxmaXRJbnRvOnt0eXBlOk9iamVjdCx2YWx1ZTp3aW5kb3d9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxwb3NpdGlvblRhcmdldDp7dHlwZTpFbGVtZW50fSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nfSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZ30sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGF1dG9GaXRPbkF0dGFjaDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZml0SW5mbzp7dHlwZTpPYmplY3R9fSxnZXQgX2ZpdFdpZHRoKCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz90aGlzLmZpdEludG8uaW5uZXJXaWR0aDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGh9LApnZXQgX2ZpdEhlaWdodCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/dGhpcy5maXRJbnRvLmlubmVySGVpZ2h0OnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHR9LGdldCBfZml0TGVmdCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/MDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0sZ2V0IF9maXRUb3AoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93PzA6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH0sZ2V0IF9kZWZhdWx0UG9zaXRpb25UYXJnZXQoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO2ImJmIubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihiPWIuaG9zdCk7cmV0dXJuIGJ9LGdldCBfbG9jYWxlSG9yaXpvbnRhbEFsaWduKCl7aWYodGhpcy5faXNSVEwpe2lmKCJyaWdodCI9PT10aGlzLmhvcml6b250YWxBbGlnbilyZXR1cm4ibGVmdCI7CmlmKCJsZWZ0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduKXJldHVybiJyaWdodCJ9cmV0dXJuIHRoaXMuaG9yaXpvbnRhbEFsaWdufSxnZXQgX19zaG91bGRQb3NpdGlvbigpe3JldHVybih0aGlzLmhvcml6b250YWxBbGlnbnx8dGhpcy52ZXJ0aWNhbEFsaWduKSYmdGhpcy5wb3NpdGlvblRhcmdldH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXsidW5kZWZpbmVkIj09PXR5cGVvZiB0aGlzLl9pc1JUTCYmKHRoaXMuX2lzUlRMPSJydGwiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb24pO3RoaXMucG9zaXRpb25UYXJnZXQ9dGhpcy5wb3NpdGlvblRhcmdldHx8dGhpcy5fZGVmYXVsdFBvc2l0aW9uVGFyZ2V0O3RoaXMuYXV0b0ZpdE9uQXR0YWNoJiYoIm5vbmUiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlzcGxheT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5maXQoKX0uYmluZCh0aGlzKSk6KHdpbmRvdy5TaGFkeURPTSYmU2hhZHlET00uZmx1c2goKSwKdGhpcy5maXQoKSkpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX19kZWZlcnJlZEZpdCYmKGNsZWFyVGltZW91dCh0aGlzLl9fZGVmZXJyZWRGaXQpLHRoaXMuX19kZWZlcnJlZEZpdD1udWxsKX0sZml0OmZ1bmN0aW9uKCl7dGhpcy5wb3NpdGlvbigpO3RoaXMuY29uc3RyYWluKCk7dGhpcy5jZW50ZXIoKX0sX2Rpc2NvdmVySW5mbzpmdW5jdGlvbigpe2lmKCF0aGlzLl9maXRJbmZvKXt2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKSxkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuc2l6aW5nVGFyZ2V0KTt0aGlzLl9maXRJbmZvPXtpbmxpbmVTdHlsZTp7dG9wOnRoaXMuc3R5bGUudG9wfHwiIixsZWZ0OnRoaXMuc3R5bGUubGVmdHx8IiIscG9zaXRpb246dGhpcy5zdHlsZS5wb3NpdGlvbnx8IiJ9LHNpemVySW5saW5lU3R5bGU6e21heFdpZHRoOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heFdpZHRofHwiIixtYXhIZWlnaHQ6dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4SGVpZ2h0fHwKIiIsYm94U2l6aW5nOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZ3x8IiJ9LHBvc2l0aW9uZWRCeTp7dmVydGljYWxseToiYXV0byIhPT1iLnRvcD8idG9wIjoiYXV0byIhPT1iLmJvdHRvbT8iYm90dG9tIjpudWxsLGhvcml6b250YWxseToiYXV0byIhPT1iLmxlZnQ/ImxlZnQiOiJhdXRvIiE9PWIucmlnaHQ/InJpZ2h0IjpudWxsfSxzaXplZEJ5OntoZWlnaHQ6Im5vbmUiIT09ZC5tYXhIZWlnaHQsd2lkdGg6Im5vbmUiIT09ZC5tYXhXaWR0aCxtaW5XaWR0aDpwYXJzZUludChkLm1pbldpZHRoLDEwKXx8MCxtaW5IZWlnaHQ6cGFyc2VJbnQoZC5taW5IZWlnaHQsMTApfHwwfSxtYXJnaW46e3RvcDpwYXJzZUludChiLm1hcmdpblRvcCwxMCl8fDAscmlnaHQ6cGFyc2VJbnQoYi5tYXJnaW5SaWdodCwxMCl8fDAsYm90dG9tOnBhcnNlSW50KGIubWFyZ2luQm90dG9tLDEwKXx8MCxsZWZ0OnBhcnNlSW50KGIubWFyZ2luTGVmdCwxMCl8fDB9fX19LHJlc2V0Rml0OmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuX2ZpdEluZm98fHt9LGQ7Zm9yKGQgaW4gYi5zaXplcklubGluZVN0eWxlKXRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlW2RdPWIuc2l6ZXJJbmxpbmVTdHlsZVtkXTtmb3IoZCBpbiBiLmlubGluZVN0eWxlKXRoaXMuc3R5bGVbZF09Yi5pbmxpbmVTdHlsZVtkXTt0aGlzLl9maXRJbmZvPW51bGx9LHJlZml0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsTGVmdCxkPXRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbFRvcDt0aGlzLnJlc2V0Rml0KCk7dGhpcy5maXQoKTt0aGlzLnNpemluZ1RhcmdldC5zY3JvbGxMZWZ0PWI7dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsVG9wPWR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fX3Nob3VsZFBvc2l0aW9uKXt0aGlzLl9kaXNjb3ZlckluZm8oKTt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Ijt0aGlzLnN0eWxlLmxlZnQ9IjBweCI7CnRoaXMuc3R5bGUudG9wPSIwcHgiO3ZhciBiPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5wb3NpdGlvblRhcmdldCksZj10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKSxoPXRoaXMuX2ZpdEluZm8ubWFyZ2luLGs9dGhpcy5fX2dldFBvc2l0aW9uKHRoaXMuX2xvY2FsZUhvcml6b250YWxBbGlnbix0aGlzLnZlcnRpY2FsQWxpZ24se3dpZHRoOmIud2lkdGgraC5sZWZ0K2gucmlnaHQsaGVpZ2h0OmIuaGVpZ2h0K2gudG9wK2guYm90dG9tfSxiLGQsZik7ZD1rLmxlZnQraC5sZWZ0O2s9ay50b3AraC50b3A7dmFyIHQ9TWF0aC5taW4oZi5yaWdodC1oLnJpZ2h0LGQrYi53aWR0aCksbD1NYXRoLm1pbihmLmJvdHRvbS1oLmJvdHRvbSxrK2IuaGVpZ2h0KTtkPU1hdGgubWF4KGYubGVmdCtoLmxlZnQsTWF0aC5taW4oZCx0LXRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkpO2s9TWF0aC5tYXgoZi50b3ArCmgudG9wLE1hdGgubWluKGssbC10aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KSk7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4V2lkdGg9TWF0aC5tYXgodC1kLHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkrInB4Ijt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhIZWlnaHQ9TWF0aC5tYXgobC1rLHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5IZWlnaHQpKyJweCI7dGhpcy5zdHlsZS5sZWZ0PWQtYi5sZWZ0KyJweCI7dGhpcy5zdHlsZS50b3A9ay1iLnRvcCsicHgifX0sY29uc3RyYWluOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIGI9dGhpcy5fZml0SW5mbztiLnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLHRoaXMuc3R5bGUudG9wPSIwcHgiKTtiLnBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHl8fCh0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsCnRoaXMuc3R5bGUubGVmdD0iMHB4Iik7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Ijt2YXIgZD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Iuc2l6ZWRCeS5oZWlnaHR8fHRoaXMuX19zaXplRGltZW5zaW9uKGQsYi5wb3NpdGlvbmVkQnkudmVydGljYWxseSwidG9wIiwiYm90dG9tIiwiSGVpZ2h0Iik7Yi5zaXplZEJ5LndpZHRofHx0aGlzLl9fc2l6ZURpbWVuc2lvbihkLGIucG9zaXRpb25lZEJ5Lmhvcml6b250YWxseSwibGVmdCIsInJpZ2h0IiwiV2lkdGgiKX19LF9zaXplRGltZW5zaW9uOmZ1bmN0aW9uKGIsZCxmLGgsayl7dGhpcy5fX3NpemVEaW1lbnNpb24oYixkLGYsaCxrKX0sX19zaXplRGltZW5zaW9uOmZ1bmN0aW9uKGIsZCxmLGgsayl7dmFyIHQ9dGhpcy5fZml0SW5mbyxsPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pO2w9IldpZHRoIj09PWs/bC53aWR0aDpsLmhlaWdodDtkPWQ9PT1oO3ZhciBwPQoib2Zmc2V0IitrO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlWyJtYXgiK2tdPWwtdC5tYXJnaW5bZD9mOmhdLShkP2wtYltoXTpiW2ZdKS0odGhpc1twXS10aGlzLnNpemluZ1RhcmdldFtwXSkrInB4In0sY2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIGI9dGhpcy5fZml0SW5mby5wb3NpdGlvbmVkQnk7aWYoIWIudmVydGljYWxseXx8IWIuaG9yaXpvbnRhbGx5KXt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Yi52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9IjBweCIpO2IuaG9yaXpvbnRhbGx5fHwodGhpcy5zdHlsZS5sZWZ0PSIwcHgiKTt2YXIgZD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byk7Yi52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9Zi50b3AtZC50b3ArKGYuaGVpZ2h0LWQuaGVpZ2h0KS8yKyJweCIpO2IuaG9yaXpvbnRhbGx5fHwKKHRoaXMuc3R5bGUubGVmdD1mLmxlZnQtZC5sZWZ0KyhmLndpZHRoLWQud2lkdGgpLzIrInB4Iil9fX0sX19nZXROb3JtYWxpemVkUmVjdDpmdW5jdGlvbihiKXtyZXR1cm4gYj09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8Yj09PXdpbmRvdz97dG9wOjAsbGVmdDowLHdpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHQscmlnaHQ6d2luZG93LmlubmVyV2lkdGgsYm90dG9tOndpbmRvdy5pbm5lckhlaWdodH06Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0sX19nZXRPZmZzY3JlZW5BcmVhOmZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4gTWF0aC5hYnMoTWF0aC5taW4oMCxiLnRvcCkrTWF0aC5taW4oMCxmLmJvdHRvbS0oYi50b3ArZC5oZWlnaHQpKSkqZC53aWR0aCtNYXRoLmFicyhNYXRoLm1pbigwLGIubGVmdCkrTWF0aC5taW4oMCxmLnJpZ2h0LShiLmxlZnQrZC53aWR0aCkpKSpkLmhlaWdodH0sX19nZXRQb3NpdGlvbjpmdW5jdGlvbihiLGQsCmYsaCxrLHQpe3ZhciBsPVt7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDprLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmsudG9wK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLnJpZ2h0LWYud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSx7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDprLmJvdHRvbS1mLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmsuYm90dG9tLWYuaGVpZ2h0LXRoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLnJpZ2h0LWYud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fV07CmlmKHRoaXMubm9PdmVybGFwKXtmb3IodmFyIHA9MCxtPWwubGVuZ3RoO3A8bTtwKyspe3ZhciBuPXt9LHE7Zm9yKHEgaW4gbFtwXSluW3FdPWxbcF1bcV07bC5wdXNoKG4pfWxbMF0udG9wPWxbMV0udG9wKz1rLmhlaWdodDtsWzJdLnRvcD1sWzNdLnRvcC09ay5oZWlnaHQ7bFs0XS5sZWZ0PWxbNl0ubGVmdCs9ay53aWR0aDtsWzVdLmxlZnQ9bFs3XS5sZWZ0LT1rLndpZHRofWQ9ImF1dG8iPT09ZD9udWxsOmQ7Yj0iYXV0byI9PT1iP251bGw6YjtiJiYiY2VudGVyIiE9PWJ8fChsLnB1c2goe3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDprLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0Kyh0aGlzLm5vT3ZlcmxhcD9rLmhlaWdodDowKSxsZWZ0OmsubGVmdC1oLndpZHRoLzIray53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pLGwucHVzaCh7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOmsuYm90dG9tLQpmLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LSh0aGlzLm5vT3ZlcmxhcD9rLmhlaWdodDowKSxsZWZ0OmsubGVmdC1oLndpZHRoLzIray53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pKTtkJiYibWlkZGxlIiE9PWR8fChsLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJsZWZ0Iix0b3A6ay50b3AtaC5oZWlnaHQvMitrLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLmxlZnQrdGhpcy5ob3Jpem9udGFsT2Zmc2V0Kyh0aGlzLm5vT3ZlcmxhcD9rLndpZHRoOjApfSksbC5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoicmlnaHQiLHRvcDprLnRvcC1oLmhlaWdodC8yK2suaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsucmlnaHQtZi53aWR0aC10aGlzLmhvcml6b250YWxPZmZzZXQtKHRoaXMubm9PdmVybGFwP2sud2lkdGg6MCl9KSk7Im1pZGRsZSI9PT1kJiYiY2VudGVyIj09PQpiJiZsLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDprLnRvcC1oLmhlaWdodC8yK2suaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsubGVmdC1oLndpZHRoLzIray53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pO2ZvcihwPTA7cDxsLmxlbmd0aDtwKyspe2g9bFtwXTtrPWgudmVydGljYWxBbGlnbj09PWQ7bT1oLmhvcml6b250YWxBbGlnbj09PWI7aWYoIXRoaXMuZHluYW1pY0FsaWduJiYhdGhpcy5ub092ZXJsYXAmJmsmJm0pe3ZhciB1PWg7YnJlYWt9bj0oIWR8fGspJiYoIWJ8fG0pO2lmKHRoaXMuZHluYW1pY0FsaWdufHxuKXtoLm9mZnNjcmVlbkFyZWE9dGhpcy5fX2dldE9mZnNjcmVlbkFyZWEoaCxmLHQpO2lmKDA9PT1oLm9mZnNjcmVlbkFyZWEmJm4pe3U9aDticmVha311PXV8fGg7bj1oLm9mZnNjcmVlbkFyZWEtdS5vZmZzY3JlZW5BcmVhO2lmKDA+bnx8MD09PW4mJihrfHxtKSl1PWh9fXJldHVybiB1fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1yZXNpemFibGUtYmVoYXZpb3IvaXJvbi1yZXNpemFibGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcj17cHJvcGVydGllczp7X3BhcmVudFJlc2l6YWJsZTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9wYXJlbnRSZXNpemFibGVDaGFuZ2VkIn0sX25vdGlmeWluZ0Rlc2NlbmRhbnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGxpc3RlbmVyczp7Imlyb24tcmVxdWVzdC1yZXNpemUtbm90aWZpY2F0aW9ucyI6Il9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcz1bXTt0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZT10aGlzLm5vdGlmeVJlc2l6ZS5iaW5kKHRoaXMpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50UmVzaXphYmxlP3RoaXMuX3BhcmVudFJlc2l6YWJsZS5zdG9wUmVzaXplTm90aWZpY2F0aW9uc0Zvcih0aGlzKTp3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwKdGhpcy5fYm91bmROb3RpZnlSZXNpemUpO3RoaXMuX3BhcmVudFJlc2l6YWJsZT1udWxsfSxub3RpZnlSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3RoaXMucmVzaXplclNob3VsZE5vdGlmeShiKSYmdGhpcy5fbm90aWZ5RGVzY2VuZGFudChiKX0sdGhpcyksdGhpcy5fZmlyZVJlc2l6ZSgpKX0sYXNzaWduUGFyZW50UmVzaXphYmxlOmZ1bmN0aW9uKGIpe3RoaXMuX3BhcmVudFJlc2l6YWJsZT1ifSxzdG9wUmVzaXplTm90aWZpY2F0aW9uc0ZvcjpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKGIpOy0xPGQmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5zcGxpY2UoZCwxKSx0aGlzLnVubGlzdGVuKGIsImlyb24tcmVzaXplIiwiX29uRGVzY2VuZGFudElyb25SZXNpemUiKSl9LHJlc2l6ZXJTaG91bGROb3RpZnk6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplOmZ1bmN0aW9uKGIpe3RoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ/Yi5zdG9wUHJvcGFnYXRpb24oKTpQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvd3x8dGhpcy5fZmlyZVJlc2l6ZSgpfSxfZmlyZVJlc2l6ZTpmdW5jdGlvbigpe3RoaXMuZmlyZSgiaXJvbi1yZXNpemUiLG51bGwse25vZGU6dGhpcyxidWJibGVzOiExfSl9LF9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9uczpmdW5jdGlvbihiKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0O2QhPT10aGlzJiYoLTE9PT10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKGQpJiYodGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMucHVzaChkKSx0aGlzLmxpc3RlbihkLCJpcm9uLXJlc2l6ZSIsIl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplIikpLGQuYXNzaWduUGFyZW50UmVzaXphYmxlKHRoaXMpLHRoaXMuX25vdGlmeURlc2NlbmRhbnQoZCksYi5zdG9wUHJvcGFnYXRpb24oKSl9LApfcGFyZW50UmVzaXphYmxlQ2hhbmdlZDpmdW5jdGlvbihiKXtiJiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSl9LF9ub3RpZnlEZXNjZW5kYW50OmZ1bmN0aW9uKGIpe3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ9ITAsYi5ub3RpZnlSZXNpemUoKSx0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50PSExKX0sX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkKWlmKCJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpe3ZhciBiPXRoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zLmJpbmQodGhpcyk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24gZigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGYpO2IoKX0pfWVsc2UgdGhpcy5maXJlKCJpcm9uLXJlcXVlc3QtcmVzaXplLW5vdGlmaWNhdGlvbnMiLApudWxsLHtub2RlOnRoaXMsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSksdGhpcy5fcGFyZW50UmVzaXphYmxlfHwod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5fYm91bmROb3RpZnlSZXNpemUpLHRoaXMubm90aWZ5UmVzaXplKCkpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iYWNrZHJvcC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJpcm9uLW92ZXJsYXktYmFja2Ryb3AiLHByb3BlcnRpZXM6e29wZW5lZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uZW5kIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCl9LHByZXBhcmU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMucGFyZW50Tm9kZSYmUG9seW1lci5kb20oZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcyl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sY29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZHx8dGhpcy5wYXJlbnROb2RlIT09CmRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcyl9LF9vblRyYW5zaXRpb25lbmQ6ZnVuY3Rpb24oYil7YiYmYi50YXJnZXQ9PT10aGlzJiZ0aGlzLmNvbXBsZXRlKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2I/dGhpcy5wcmVwYXJlKCk6KGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyksIjBzIiE9PWIudHJhbnNpdGlvbkR1cmF0aW9uJiYwIT1iLm9wYWNpdHl8fHRoaXMuY29tcGxldGUoKSk7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fX29wZW5lZFJhZiYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fb3BlbmVkUmFmKSx0aGlzLl9fb3BlbmVkUmFmPW51bGwpLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX19vcGVuZWRSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbDt0aGlzLnRvZ2dsZUNsYXNzKCJvcGVuZWQiLAp0aGlzLm9wZW5lZCl9LmJpbmQodGhpcykpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1tYW5hZ2VyLmh0bWwuanMKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcz1mdW5jdGlvbigpe3RoaXMuX292ZXJsYXlzPVtdO3RoaXMuX21pbmltdW1aPTEwMTt0aGlzLl9iYWNrZHJvcEVsZW1lbnQ9bnVsbDtQb2x5bWVyLkdlc3R1cmVzLmFkZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsInRhcCIsZnVuY3Rpb24oKXt9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLHRoaXMuX29uQ2FwdHVyZUNsaWNrLmJpbmQodGhpcyksITApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9vbkNhcHR1cmVGb2N1cy5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLl9vbkNhcHR1cmVLZXlEb3duLmJpbmQodGhpcyksITApfTsKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlBvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyQ2xhc3MsZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3RoaXMuX2JhY2tkcm9wRWxlbWVudHx8KHRoaXMuX2JhY2tkcm9wRWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLW92ZXJsYXktYmFja2Ryb3AiKSk7cmV0dXJuIHRoaXMuX2JhY2tkcm9wRWxlbWVudH0sZ2V0IGRlZXBBY3RpdmVFbGVtZW50KCl7dmFyIGI9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtiJiYhMSE9PWIgaW5zdGFuY2VvZiBFbGVtZW50fHwoYj1kb2N1bWVudC5ib2R5KTtmb3IoO2Iucm9vdCYmUG9seW1lci5kb20oYi5yb290KS5hY3RpdmVFbGVtZW50OyliPVBvbHltZXIuZG9tKGIucm9vdCkuYWN0aXZlRWxlbWVudDtyZXR1cm4gYn0sX2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250OmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX292ZXJsYXlzW2JdO2lmKGQpe3ZhciBmPQp0aGlzLl9vdmVybGF5cy5sZW5ndGgtMSxoPXRoaXMuX292ZXJsYXlzW2ZdO2gmJnRoaXMuX3Nob3VsZEJlQmVoaW5kT3ZlcmxheShkLGgpJiZmLS07aWYoIShiPj1mKSl7aD1NYXRoLm1heCh0aGlzLmN1cnJlbnRPdmVybGF5WigpLHRoaXMuX21pbmltdW1aKTtmb3IodGhpcy5fZ2V0WihkKTw9aCYmdGhpcy5fYXBwbHlPdmVybGF5WihkLGgpO2I8ZjspdGhpcy5fb3ZlcmxheXNbYl09dGhpcy5fb3ZlcmxheXNbYisxXSxiKys7dGhpcy5fb3ZlcmxheXNbZl09ZH19fSxhZGRPclJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYil7Yi5vcGVuZWQ/dGhpcy5hZGRPdmVybGF5KGIpOnRoaXMucmVtb3ZlT3ZlcmxheShiKX0sYWRkT3ZlcmxheTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9vdmVybGF5cy5pbmRleE9mKGIpO2lmKDA8PWQpdGhpcy5fYnJpbmdPdmVybGF5QXRJbmRleFRvRnJvbnQoZCk7ZWxzZXtkPXRoaXMuX292ZXJsYXlzLmxlbmd0aDt2YXIgZj10aGlzLl9vdmVybGF5c1tkLTFdLGg9Ck1hdGgubWF4KHRoaXMuX2dldFooZiksdGhpcy5fbWluaW11bVopLGs9dGhpcy5fZ2V0WihiKTtmJiZ0aGlzLl9zaG91bGRCZUJlaGluZE92ZXJsYXkoYixmKSYmKHRoaXMuX2FwcGx5T3ZlcmxheVooZixoKSxkLS0saD1NYXRoLm1heCh0aGlzLl9nZXRaKHRoaXMuX292ZXJsYXlzW2QtMV0pLHRoaXMuX21pbmltdW1aKSk7azw9aCYmdGhpcy5fYXBwbHlPdmVybGF5WihiLGgpO3RoaXMuX292ZXJsYXlzLnNwbGljZShkLDAsYil9dGhpcy50cmFja0JhY2tkcm9wKCl9LHJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYil7Yj10aGlzLl9vdmVybGF5cy5pbmRleE9mKGIpOy0xIT09YiYmKHRoaXMuX292ZXJsYXlzLnNwbGljZShiLDEpLHRoaXMudHJhY2tCYWNrZHJvcCgpKX0sY3VycmVudE92ZXJsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3ZlcmxheXNbdGhpcy5fb3ZlcmxheXMubGVuZ3RoLTFdfSxjdXJyZW50T3ZlcmxheVo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0Wih0aGlzLmN1cnJlbnRPdmVybGF5KCkpfSwKZW5zdXJlTWluaW11bVo6ZnVuY3Rpb24oYil7dGhpcy5fbWluaW11bVo9TWF0aC5tYXgodGhpcy5fbWluaW11bVosYil9LGZvY3VzT3ZlcmxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuY3VycmVudE92ZXJsYXkoKTtiJiZiLl9hcHBseUZvY3VzKCl9LHRyYWNrQmFja2Ryb3A6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9vdmVybGF5V2l0aEJhY2tkcm9wKCk7aWYoYnx8dGhpcy5fYmFja2Ryb3BFbGVtZW50KXRoaXMuYmFja2Ryb3BFbGVtZW50LnN0eWxlLnpJbmRleD10aGlzLl9nZXRaKGIpLTEsdGhpcy5iYWNrZHJvcEVsZW1lbnQub3BlbmVkPSEhYix0aGlzLmJhY2tkcm9wRWxlbWVudC5wcmVwYXJlKCl9LGdldEJhY2tkcm9wczpmdW5jdGlvbigpe2Zvcih2YXIgYj1bXSxkPTA7ZDx0aGlzLl9vdmVybGF5cy5sZW5ndGg7ZCsrKXRoaXMuX292ZXJsYXlzW2RdLndpdGhCYWNrZHJvcCYmYi5wdXNoKHRoaXMuX292ZXJsYXlzW2RdKTtyZXR1cm4gYn0sYmFja2Ryb3BaOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFoodGhpcy5fb3ZlcmxheVdpdGhCYWNrZHJvcCgpKS0KMX0sX292ZXJsYXlXaXRoQmFja2Ryb3A6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5fb3ZlcmxheXMubGVuZ3RoLTE7MDw9YjtiLS0paWYodGhpcy5fb3ZlcmxheXNbYl0ud2l0aEJhY2tkcm9wKXJldHVybiB0aGlzLl9vdmVybGF5c1tiXX0sX2dldFo6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fbWluaW11bVo7YiYmKGI9TnVtYmVyKGIuc3R5bGUuekluZGV4fHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiKS56SW5kZXgpLGI9PT1iJiYoZD1iKSk7cmV0dXJuIGR9LF9zZXRaOmZ1bmN0aW9uKGIsZCl7Yi5zdHlsZS56SW5kZXg9ZH0sX2FwcGx5T3ZlcmxheVo6ZnVuY3Rpb24oYixkKXt0aGlzLl9zZXRaKGIsZCsyKX0sX292ZXJsYXlJblBhdGg6ZnVuY3Rpb24oYil7Yj1ifHxbXTtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKylpZihiW2RdLl9tYW5hZ2VyPT09dGhpcylyZXR1cm4gYltkXX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX292ZXJsYXlzLmxlbmd0aC0KMTtpZigtMSE9PWQpZm9yKHZhciBmPVBvbHltZXIuZG9tKGIpLnBhdGgsaDsoaD10aGlzLl9vdmVybGF5c1tkXSkmJnRoaXMuX292ZXJsYXlJblBhdGgoZikhPT1oOylpZihoLl9vbkNhcHR1cmVDbGljayhiKSxoLmFsbG93Q2xpY2tUaHJvdWdoKWQtLTtlbHNlIGJyZWFrfSxfb25DYXB0dXJlRm9jdXM6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2QmJmQuX29uQ2FwdHVyZUZvY3VzKGIpfSxfb25DYXB0dXJlS2V5RG93bjpmdW5jdGlvbihiKXt2YXIgZD10aGlzLmN1cnJlbnRPdmVybGF5KCk7ZCYmKFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3Iua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGIsImVzYyIpP2QuX29uQ2FwdHVyZUVzYyhiKTpQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ0YWIiKSYmZC5fb25DYXB0dXJlVGFiKGIpKX0sX3Nob3VsZEJlQmVoaW5kT3ZlcmxheTpmdW5jdGlvbihiLGQpe3JldHVybiFiLmFsd2F5c09uVG9wJiYKZC5hbHdheXNPblRvcH19O1BvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyPW5ldyBQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlckNsYXNzOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tb3ZlcmxheS1iZWhhdmlvci9pcm9uLXNjcm9sbC1tYW5hZ2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9MCxkPTAsZj1udWxsLGg9W10saz1bIndoZWVsIiwibW91c2V3aGVlbCIsIkRPTU1vdXNlU2Nyb2xsIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSJdO1BvbHltZXIuSXJvblNjcm9sbE1hbmFnZXI9e2dldCBjdXJyZW50TG9ja2luZ0VsZW1lbnQoKXtyZXR1cm4gdGhpcy5fbG9ja2luZ0VsZW1lbnRzW3RoaXMuX2xvY2tpbmdFbGVtZW50cy5sZW5ndGgtMV19LGVsZW1lbnRJc1Njcm9sbExvY2tlZDpmdW5jdGlvbih0KXt2YXIgbD10aGlzLmN1cnJlbnRMb2NraW5nRWxlbWVudDtpZih2b2lkIDA9PT1sKXJldHVybiExO2lmKHRoaXMuX2hhc0NhY2hlZExvY2tlZEVsZW1lbnQodCkpcmV0dXJuITA7aWYodGhpcy5faGFzQ2FjaGVkVW5sb2NrZWRFbGVtZW50KHQpKXJldHVybiExOyhsPSEhbCYmbCE9PXQmJiF0aGlzLl9jb21wb3NlZFRyZWVDb250YWlucyhsLHQpKT90aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUucHVzaCh0KTp0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5wdXNoKHQpOwpyZXR1cm4gbH0scHVzaFNjcm9sbExvY2s6ZnVuY3Rpb24odCl7MDw9dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmluZGV4T2YodCl8fCgwPT09dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmxlbmd0aCYmdGhpcy5fbG9ja1Njcm9sbEludGVyYWN0aW9ucygpLHRoaXMuX2xvY2tpbmdFbGVtZW50cy5wdXNoKHQpLHRoaXMuX2xvY2tlZEVsZW1lbnRDYWNoZT1bXSx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZT1bXSl9LHJlbW92ZVNjcm9sbExvY2s6ZnVuY3Rpb24odCl7dD10aGlzLl9sb2NraW5nRWxlbWVudHMuaW5kZXhPZih0KTstMSE9PXQmJih0aGlzLl9sb2NraW5nRWxlbWVudHMuc3BsaWNlKHQsMSksdGhpcy5fbG9ja2VkRWxlbWVudENhY2hlPVtdLHRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlPVtdLDA9PT10aGlzLl9sb2NraW5nRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl91bmxvY2tTY3JvbGxJbnRlcmFjdGlvbnMoKSl9LF9sb2NraW5nRWxlbWVudHM6W10sX2xvY2tlZEVsZW1lbnRDYWNoZTpudWxsLApfdW5sb2NrZWRFbGVtZW50Q2FjaGU6bnVsbCxfaGFzQ2FjaGVkTG9ja2VkRWxlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4tMTx0aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUuaW5kZXhPZih0KX0sX2hhc0NhY2hlZFVubG9ja2VkRWxlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4tMTx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5pbmRleE9mKHQpfSxfY29tcG9zZWRUcmVlQ29udGFpbnM6ZnVuY3Rpb24odCxsKXt2YXIgcCxtO2lmKHQuY29udGFpbnMobCkpcmV0dXJuITA7dD1Qb2x5bWVyLmRvbSh0KS5xdWVyeVNlbGVjdG9yQWxsKCJjb250ZW50LHNsb3QiKTtmb3IocD0wO3A8dC5sZW5ndGg7KytwKXt2YXIgbj1Qb2x5bWVyLmRvbSh0W3BdKS5nZXREaXN0cmlidXRlZE5vZGVzKCk7Zm9yKG09MDttPG4ubGVuZ3RoOysrbSlpZihuW21dLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJnRoaXMuX2NvbXBvc2VkVHJlZUNvbnRhaW5zKG5bbV0sbCkpcmV0dXJuITB9cmV0dXJuITF9LF9zY3JvbGxJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dC5jYW5jZWxhYmxlJiYKdGhpcy5fc2hvdWxkUHJldmVudFNjcm9sbGluZyh0KSYmdC5wcmV2ZW50RGVmYXVsdCgpO3QudGFyZ2V0VG91Y2hlcyYmKHQ9dC50YXJnZXRUb3VjaGVzWzBdLGI9dC5wYWdlWCxkPXQucGFnZVkpfSxfbG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe3RoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj10aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fHRoaXMuX3Njcm9sbEludGVyYWN0aW9uSGFuZGxlci5iaW5kKHRoaXMpO2Zvcih2YXIgdD0wLGw9ay5sZW5ndGg7dDxsO3QrKylkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGtbdF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sX3VubG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGw9ay5sZW5ndGg7dDxsO3QrKylkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGtbdF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sCl9zaG91bGRQcmV2ZW50U2Nyb2xsaW5nOmZ1bmN0aW9uKHQpe3ZhciBsPVBvbHltZXIuZG9tKHQpLnJvb3RUYXJnZXQ7InRvdWNobW92ZSIhPT10LnR5cGUmJmYhPT1sJiYoZj1sLGg9dGhpcy5fZ2V0U2Nyb2xsYWJsZU5vZGVzKFBvbHltZXIuZG9tKHQpLnBhdGgpKTtpZighaC5sZW5ndGgpcmV0dXJuITA7aWYoInRvdWNoc3RhcnQiPT09dC50eXBlKXJldHVybiExO3Q9dGhpcy5fZ2V0U2Nyb2xsSW5mbyh0KTtyZXR1cm4hdGhpcy5fZ2V0U2Nyb2xsaW5nTm9kZShoLHQuZGVsdGFYLHQuZGVsdGFZKX0sX2dldFNjcm9sbGFibGVOb2RlczpmdW5jdGlvbih0KXtmb3IodmFyIGw9W10scD10LmluZGV4T2YodGhpcy5jdXJyZW50TG9ja2luZ0VsZW1lbnQpLG09MDttPD1wO20rKylpZih0W21dLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBuPXRbbV0scT1uLnN0eWxlOyJzY3JvbGwiIT09cS5vdmVyZmxvdyYmImF1dG8iIT09cS5vdmVyZmxvdyYmKHE9d2luZG93LmdldENvbXB1dGVkU3R5bGUobikpOwoic2Nyb2xsIiE9PXEub3ZlcmZsb3cmJiJhdXRvIiE9PXEub3ZlcmZsb3d8fGwucHVzaChuKX1yZXR1cm4gbH0sX2dldFNjcm9sbGluZ05vZGU6ZnVuY3Rpb24odCxsLHApe2lmKGx8fHApZm9yKHZhciBtPU1hdGguYWJzKHApPj1NYXRoLmFicyhsKSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBxPXRbbl07aWYobT8wPnA/MDxxLnNjcm9sbFRvcDpxLnNjcm9sbFRvcDxxLnNjcm9sbEhlaWdodC1xLmNsaWVudEhlaWdodDowPmw/MDxxLnNjcm9sbExlZnQ6cS5zY3JvbGxMZWZ0PHEuc2Nyb2xsV2lkdGgtcS5jbGllbnRXaWR0aClyZXR1cm4gcX19LF9nZXRTY3JvbGxJbmZvOmZ1bmN0aW9uKHQpe3ZhciBsPXtkZWx0YVg6dC5kZWx0YVgsZGVsdGFZOnQuZGVsdGFZfTsiZGVsdGFYImluIHR8fCgid2hlZWxEZWx0YVgiaW4gdCYmIndoZWVsRGVsdGFZImluIHQ/KGwuZGVsdGFYPS10LndoZWVsRGVsdGFYLGwuZGVsdGFZPS10LndoZWVsRGVsdGFZKToid2hlZWxEZWx0YSJpbiB0PyhsLmRlbHRhWD0KMCxsLmRlbHRhWT0tdC53aGVlbERlbHRhKToiYXhpcyJpbiB0PyhsLmRlbHRhWD0xPT09dC5heGlzP3QuZGV0YWlsOjAsbC5kZWx0YVk9Mj09PXQuYXhpcz90LmRldGFpbDowKTp0LnRhcmdldFRvdWNoZXMmJih0PXQudGFyZ2V0VG91Y2hlc1swXSxsLmRlbHRhWD1iLXQucGFnZVgsbC5kZWx0YVk9ZC10LnBhZ2VZKSk7cmV0dXJuIGx9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tZm9jdXNhYmxlcy1oZWxwZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj1FbGVtZW50LnByb3RvdHlwZSxkPWIubWF0Y2hlc3x8Yi5tYXRjaGVzU2VsZWN0b3J8fGIubW96TWF0Y2hlc1NlbGVjdG9yfHxiLm1zTWF0Y2hlc1NlbGVjdG9yfHxiLm9NYXRjaGVzU2VsZWN0b3J8fGIud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1BvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXI9e2dldFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZil7dmFyIGg9W107cmV0dXJuIHRoaXMuX2NvbGxlY3RUYWJiYWJsZU5vZGVzKGYsaCk/dGhpcy5fc29ydEJ5VGFiSW5kZXgoaCk6aH0saXNGb2N1c2FibGU6ZnVuY3Rpb24oZil7cmV0dXJuIGQuY2FsbChmLCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBvYmplY3QiKT9kLmNhbGwoZiwiOm5vdChbZGlzYWJsZWRdKSIpOmQuY2FsbChmLCJhW2hyZWZdLCBhcmVhW2hyZWZdLCBpZnJhbWUsIFt0YWJpbmRleF0sIFtjb250ZW50RWRpdGFibGVdIil9LGlzVGFiYmFibGU6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuaXNGb2N1c2FibGUoZikmJgpkLmNhbGwoZiwnOm5vdChbdGFiaW5kZXhceDNkIi0xIl0pJykmJnRoaXMuX2lzVmlzaWJsZShmKX0sX25vcm1hbGl6ZWRUYWJJbmRleDpmdW5jdGlvbihmKXtyZXR1cm4gdGhpcy5pc0ZvY3VzYWJsZShmKT8oZj1mLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKXx8MCxOdW1iZXIoZikpOi0xfSxfY29sbGVjdFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZixoKXtpZihmLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREV8fCF0aGlzLl9pc1Zpc2libGUoZikpcmV0dXJuITE7dmFyIGs9dGhpcy5fbm9ybWFsaXplZFRhYkluZGV4KGYpLHQ9MDxrOzA8PWsmJmgucHVzaChmKTtmPSJjb250ZW50Ij09PWYubG9jYWxOYW1lfHwic2xvdCI9PT1mLmxvY2FsTmFtZT9Qb2x5bWVyLmRvbShmKS5nZXREaXN0cmlidXRlZE5vZGVzKCk6UG9seW1lci5kb20oZi5yb290fHxmKS5jaGlsZHJlbjtmb3Ioaz0wO2s8Zi5sZW5ndGg7aysrKXQ9dGhpcy5fY29sbGVjdFRhYmJhYmxlTm9kZXMoZltrXSxoKXx8dDsKcmV0dXJuIHR9LF9pc1Zpc2libGU6ZnVuY3Rpb24oZil7dmFyIGg9Zi5zdHlsZTtyZXR1cm4iaGlkZGVuIiE9PWgudmlzaWJpbGl0eSYmIm5vbmUiIT09aC5kaXNwbGF5PyhoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYpLCJoaWRkZW4iIT09aC52aXNpYmlsaXR5JiYibm9uZSIhPT1oLmRpc3BsYXkpOiExfSxfc29ydEJ5VGFiSW5kZXg6ZnVuY3Rpb24oZil7dmFyIGg9Zi5sZW5ndGg7aWYoMj5oKXJldHVybiBmO3ZhciBrPU1hdGguY2VpbChoLzIpO2g9dGhpcy5fc29ydEJ5VGFiSW5kZXgoZi5zbGljZSgwLGspKTtmPXRoaXMuX3NvcnRCeVRhYkluZGV4KGYuc2xpY2UoaykpO3JldHVybiB0aGlzLl9tZXJnZVNvcnRCeVRhYkluZGV4KGgsZil9LF9tZXJnZVNvcnRCeVRhYkluZGV4OmZ1bmN0aW9uKGYsaCl7Zm9yKHZhciBrPVtdOzA8Zi5sZW5ndGgmJjA8aC5sZW5ndGg7KXRoaXMuX2hhc0xvd2VyVGFiT3JkZXIoZlswXSxoWzBdKT9rLnB1c2goaC5zaGlmdCgpKTprLnB1c2goZi5zaGlmdCgpKTsKcmV0dXJuIGsuY29uY2F0KGYsaCl9LF9oYXNMb3dlclRhYk9yZGVyOmZ1bmN0aW9uKGYsaCl7Zj1NYXRoLm1heChmLnRhYkluZGV4LDApO2g9TWF0aC5tYXgoaC50YWJJbmRleCwwKTtyZXR1cm4gMD09PWZ8fDA9PT1oP2g+ZjpmPmh9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iZWhhdmlvci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e29wZW5lZDp7b2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIix0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxjYW5jZWxlZDp7b2JzZXJ2ZXI6Il9jYW5jZWxlZENoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sd2l0aEJhY2tkcm9wOntvYnNlcnZlcjoiX3dpdGhCYWNrZHJvcENoYW5nZWQiLHR5cGU6Qm9vbGVhbn0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9DYW5jZWxPbkVzY0tleTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0NhbmNlbE9uT3V0c2lkZUNsaWNrOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNsb3NpbmdSZWFzb246e3R5cGU6T2JqZWN0fSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsbG93Q2xpY2tUaHJvdWdoOnt0eXBlOkJvb2xlYW59LGFsd2F5c09uVG9wOnt0eXBlOkJvb2xlYW59LApzY3JvbGxBY3Rpb246e3R5cGU6U3RyaW5nfSxfbWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6UG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJ9LF9mb2N1c2VkQ2hpbGQ6e3R5cGU6T2JqZWN0fX0sbGlzdGVuZXJzOnsiaXJvbi1yZXNpemUiOiJfb25Jcm9uUmVzaXplIn0sb2JzZXJ2ZXJzOlsiX191cGRhdGVTY3JvbGxPYnNlcnZlcnMoaXNBdHRhY2hlZCwgb3BlbmVkLCBzY3JvbGxBY3Rpb24pIl0sZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3JldHVybiB0aGlzLl9tYW5hZ2VyLmJhY2tkcm9wRWxlbWVudH0sZ2V0IF9mb2N1c05vZGUoKXtyZXR1cm4gdGhpcy5fZm9jdXNlZENoaWxkfHxQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJbYXV0b2ZvY3VzXSIpfHx0aGlzfSxnZXQgX2ZvY3VzYWJsZU5vZGVzKCl7cmV0dXJuIFBvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXIuZ2V0VGFiYmFibGVOb2Rlcyh0aGlzKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9CnRoaXMuX19pc0FuaW1hdGluZz0hMTt0aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlPXRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZT1udWxsO3RoaXMuX19yYWZzPXt9O3RoaXMuX19zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbExlZnQ9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbDt0aGlzLl9fb25DYXB0dXJlU2Nyb2xsPXRoaXMuX19vbkNhcHR1cmVTY3JvbGwuYmluZCh0aGlzKTt0aGlzLl9fcm9vdE5vZGVzPW51bGw7dGhpcy5fZW5zdXJlU2V0dXAoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCk7dGhpcy5fb2JzZXJ2ZXI9UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX29uTm9kZXNDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKTt0aGlzLl9vYnNlcnZlcj1udWxsO2Zvcih2YXIgYiBpbiB0aGlzLl9fcmFmcyludWxsIT09CnRoaXMuX19yYWZzW2JdJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fcmFmc1tiXSk7dGhpcy5fX3JhZnM9e307dGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpO3RoaXMuX19pc0FuaW1hdGluZyYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOih0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCkpKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpO3RoaXMub3BlbmVkPSF0aGlzLm9wZW5lZH0sb3BlbjpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKTt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSk7dGhpcy5vcGVuZWQ9ITF9LGNhbmNlbDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1jYW5jZWxlZCIsYix7Y2FuY2VsYWJsZTohMH0pLmRlZmF1bHRQcmV2ZW50ZWR8fCh0aGlzLl9zZXRDYW5jZWxlZCghMCksdGhpcy5vcGVuZWQ9CiExKX0saW52YWxpZGF0ZVRhYmJhYmxlczpmdW5jdGlvbigpe3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlPW51bGx9LF9lbnN1cmVTZXR1cDpmdW5jdGlvbigpe3RoaXMuX292ZXJsYXlTZXR1cHx8KHRoaXMuX292ZXJsYXlTZXR1cD0hMCx0aGlzLnN0eWxlLm91dGxpbmU9Im5vbmUiLHRoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihiKXtiP3RoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpOnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKTt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9faXNBbmltYXRpbmc9ITAsdGhpcy5fX2RlcmFmKCJfX29wZW5lZENoYW5nZWQiLHRoaXMuX19vcGVuZWRDaGFuZ2VkKSl9LF9jYW5jZWxlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsb3NpbmdSZWFzb249dGhpcy5jbG9zaW5nUmVhc29ufHx7fTt0aGlzLmNsb3NpbmdSZWFzb24uY2FuY2VsZWQ9CnRoaXMuY2FuY2VsZWR9LF93aXRoQmFja2Ryb3BDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy53aXRoQmFja2Ryb3AmJiF0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT8odGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKSx0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9ITApOnRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleCYmKHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpLHRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0hMSk7dGhpcy5vcGVuZWQmJnRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbWFuYWdlci50cmFja0JhY2tkcm9wKCl9LF9wcmVwYXJlUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDt0aGlzLl9wcmVwYXJlUG9zaXRpb25pbmcoKTt0aGlzLnJlZml0KCk7dGhpcy5fZmluaXNoUG9zaXRpb25pbmcoKTt0aGlzLm5vQXV0b0ZvY3VzJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09CnRoaXMuX2ZvY3VzTm9kZSYmKHRoaXMuX2ZvY3VzTm9kZS5ibHVyKCksdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGUuZm9jdXMoKSl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfZmluaXNoUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5ub3RpZnlSZXNpemUoKTt0aGlzLl9faXNBbmltYXRpbmc9ITE7dGhpcy5maXJlKCJpcm9uLW92ZXJsYXktb3BlbmVkIil9LF9maW5pc2hSZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuc3R5bGUuekluZGV4PSIiO3RoaXMubm90aWZ5UmVzaXplKCk7dGhpcy5fX2lzQW5pbWF0aW5nPSExO3RoaXMuZmlyZSgiaXJvbi1vdmVybGF5LWNsb3NlZCIsdGhpcy5jbG9zaW5nUmVhc29uKX0sX3ByZXBhcmVQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvbj0KdGhpcy5zdHlsZS53ZWJraXRUcmFuc2l0aW9uPSJub25lIjt0aGlzLnN0eWxlLnRyYW5zZm9ybT10aGlzLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0ibm9uZSI7dGhpcy5zdHlsZS5kaXNwbGF5PSIifSxfZmluaXNoUG9zaXRpb25pbmc6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wO3RoaXMuc3R5bGUudHJhbnNpdGlvbj10aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb249IiI7dGhpcy5zdHlsZS50cmFuc2Zvcm09dGhpcy5zdHlsZS53ZWJraXRUcmFuc2Zvcm09IiI7dGhpcy5zdHlsZS5kaXNwbGF5PSIiO3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wfSxfYXBwbHlGb2N1czpmdW5jdGlvbigpe2lmKHRoaXMub3BlbmVkKXRoaXMubm9BdXRvRm9jdXN8fHRoaXMuX2ZvY3VzTm9kZS5mb2N1cygpO2Vsc2V7dGhpcy5fZm9jdXNOb2RlLmJsdXIoKTt0aGlzLl9mb2N1c2VkQ2hpbGQ9bnVsbDtpZih0aGlzLnJlc3RvcmVGb2N1c09uQ2xvc2UmJgp0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZSl7dmFyIGI9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDsoYj09PWRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMpLmRlZXBDb250YWlucyhiKSkmJnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlLmZvY3VzKCl9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbDsoYj10aGlzLl9tYW5hZ2VyLmN1cnJlbnRPdmVybGF5KCkpJiZ0aGlzIT09YiYmYi5fYXBwbHlGb2N1cygpfX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGIpe3RoaXMubm9DYW5jZWxPbk91dHNpZGVDbGlja3x8dGhpcy5jYW5jZWwoYil9LF9vbkNhcHR1cmVGb2N1czpmdW5jdGlvbihiKXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dmFyIGQ9UG9seW1lci5kb20oYikucGF0aDstMT09PWQuaW5kZXhPZih0aGlzKT8oYi5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9hcHBseUZvY3VzKCkpOnRoaXMuX2ZvY3VzZWRDaGlsZD1kWzBdfX0sX29uQ2FwdHVyZUVzYzpmdW5jdGlvbihiKXt0aGlzLm5vQ2FuY2VsT25Fc2NLZXl8fAp0aGlzLmNhbmNlbChiKX0sX29uQ2FwdHVyZVRhYjpmdW5jdGlvbihiKXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dGhpcy5fX2Vuc3VyZUZpcnN0TGFzdEZvY3VzYWJsZXMoKTt2YXIgZD1iLnNoaWZ0S2V5LGY9ZD90aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlOnRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZTtkPWQ/dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlOnRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU7aWYoZj09PWQpZj0hMDtlbHNle3ZhciBoPXRoaXMuX21hbmFnZXIuZGVlcEFjdGl2ZUVsZW1lbnQ7Zj1oPT09Znx8aD09PXRoaXN9ZiYmKGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9mb2N1c2VkQ2hpbGQ9ZCx0aGlzLl9hcHBseUZvY3VzKCkpfX0sX29uSXJvblJlc2l6ZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiYhdGhpcy5fX2lzQW5pbWF0aW5nJiZ0aGlzLl9fZGVyYWYoInJlZml0Iix0aGlzLnJlZml0KX0sX29uTm9kZXNDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMuX19pc0FuaW1hdGluZyYmCih0aGlzLmludmFsaWRhdGVUYWJiYWJsZXMoKSx0aGlzLm5vdGlmeVJlc2l6ZSgpKX0sX19lbnN1cmVGaXJzdExhc3RGb2N1c2FibGVzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGV8fCF0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGUpe3ZhciBiPXRoaXMuX2ZvY3VzYWJsZU5vZGVzO3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9YlswXTt0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9YltiLmxlbmd0aC0xXX19LF9fb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMub3BlbmVkPyh0aGlzLl9wcmVwYXJlUmVuZGVyT3BlbmVkKCksdGhpcy5fbWFuYWdlci5hZGRPdmVybGF5KHRoaXMpLHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9yZW5kZXJPcGVuZWQoKSk6KHRoaXMuX21hbmFnZXIucmVtb3ZlT3ZlcmxheSh0aGlzKSx0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fcmVuZGVyQ2xvc2VkKCkpfSxfX2RlcmFmOmZ1bmN0aW9uKGIsZCl7dmFyIGY9dGhpcy5fX3JhZnM7Cm51bGwhPT1mW2JdJiZjYW5jZWxBbmltYXRpb25GcmFtZShmW2JdKTtmW2JdPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2ZbYl09bnVsbDtkLmNhbGwodGhpcyl9LmJpbmQodGhpcykpfSxfX3VwZGF0ZVNjcm9sbE9ic2VydmVyczpmdW5jdGlvbihiLGQsZil7YiYmZCYmdGhpcy5fX2lzVmFsaWRTY3JvbGxBY3Rpb24oZik/KCJsb2NrIj09PWYmJih0aGlzLl9fc2F2ZVNjcm9sbFBvc2l0aW9uKCksUG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlci5wdXNoU2Nyb2xsTG9jayh0aGlzKSksdGhpcy5fX2FkZFNjcm9sbExpc3RlbmVycygpKTooUG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlci5yZW1vdmVTY3JvbGxMb2NrKHRoaXMpLHRoaXMuX19yZW1vdmVTY3JvbGxMaXN0ZW5lcnMoKSl9LF9fYWRkU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19yb290Tm9kZXMpe3RoaXMuX19yb290Tm9kZXM9W107aWYoUG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpZm9yKHZhciBiPQp0aGlzO2I7KWIubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJmIuaG9zdCYmdGhpcy5fX3Jvb3ROb2Rlcy5wdXNoKGIpLGI9Yi5ob3N0fHxiLmFzc2lnbmVkU2xvdHx8Yi5wYXJlbnROb2RlO3RoaXMuX19yb290Tm9kZXMucHVzaChkb2N1bWVudCl9dGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0sdGhpcyl9LF9fcmVtb3ZlU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fX3Jvb3ROb2RlcyYmdGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0sdGhpcyk7dGhpcy5pc0F0dGFjaGVkfHwodGhpcy5fX3Jvb3ROb2Rlcz1udWxsKX0sX19pc1ZhbGlkU2Nyb2xsQWN0aW9uOmZ1bmN0aW9uKGIpe3JldHVybiJsb2NrIj09PQpifHwicmVmaXQiPT09Ynx8ImNhbmNlbCI9PT1ifSxfX29uQ2FwdHVyZVNjcm9sbDpmdW5jdGlvbihiKXtpZighKHRoaXMuX19pc0FuaW1hdGluZ3x8MDw9UG9seW1lci5kb20oYikucGF0aC5pbmRleE9mKHRoaXMpKSlzd2l0Y2godGhpcy5zY3JvbGxBY3Rpb24pe2Nhc2UgImxvY2siOnRoaXMuX19yZXN0b3JlU2Nyb2xsUG9zaXRpb24oKTticmVhaztjYXNlICJyZWZpdCI6dGhpcy5fX2RlcmFmKCJyZWZpdCIsdGhpcy5yZWZpdCk7YnJlYWs7Y2FzZSAiY2FuY2VsIjp0aGlzLmNhbmNlbChiKX19LF9fc2F2ZVNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudD8odGhpcy5fX3Njcm9sbFRvcD1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcCx0aGlzLl9fc2Nyb2xsTGVmdD1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbExlZnQpOih0aGlzLl9fc2Nyb2xsVG9wPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsCmRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSx0aGlzLl9fc2Nyb2xsTGVmdD1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpKX0sX19yZXN0b3JlU2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50Pyhkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcD10aGlzLl9fc2Nyb2xsVG9wLGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdD10aGlzLl9fc2Nyb2xsTGVmdCk6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbFRvcCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdD1kb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ9dGhpcy5fX3Njcm9sbExlZnQpfX07UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yPVtQb2x5bWVyLklyb25GaXRCZWhhdmlvcixQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvciwKUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbF19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL25lb24tYW5pbWF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcj17cHJvcGVydGllczp7YW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sZW50cnlBbmltYXRpb246e29ic2VydmVyOiJfZW50cnlBbmltYXRpb25DaGFuZ2VkIix0eXBlOlN0cmluZ30sZXhpdEFuaW1hdGlvbjp7b2JzZXJ2ZXI6Il9leGl0QW5pbWF0aW9uQ2hhbmdlZCIsdHlwZTpTdHJpbmd9fSxfZW50cnlBbmltYXRpb25DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25Db25maWc9dGhpcy5hbmltYXRpb25Db25maWd8fHt9O3RoaXMuYW5pbWF0aW9uQ29uZmlnLmVudHJ5PVt7bmFtZTp0aGlzLmVudHJ5QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfZXhpdEFuaW1hdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkNvbmZpZz10aGlzLmFuaW1hdGlvbkNvbmZpZ3x8e307dGhpcy5hbmltYXRpb25Db25maWcuZXhpdD1be25hbWU6dGhpcy5leGl0QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfY29weVByb3BlcnRpZXM6ZnVuY3Rpb24oYiwKZCl7Zm9yKHZhciBmIGluIGQpYltmXT1kW2ZdfSxfY2xvbmVDb25maWc6ZnVuY3Rpb24oYil7dmFyIGQ9e2lzQ2xvbmU6ITB9O3RoaXMuX2NvcHlQcm9wZXJ0aWVzKGQsYik7cmV0dXJuIGR9LF9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmU6ZnVuY3Rpb24oYixkLGYpe2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnKWlmKHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlKXRoaXMuX3dhcm4odGhpcy5fbG9nZigicGxheUFuaW1hdGlvbiIsIlBsZWFzZSBwdXQgJ2FuaW1hdGlvbkNvbmZpZycgaW5zaWRlIG9mIHlvdXIgY29tcG9uZW50cyAncHJvcGVydGllcycgb2JqZWN0IGluc3RlYWQgb2Ygb3V0c2lkZSBvZiBpdC4iKSk7ZWxzZXt2YXIgaD1iP3RoaXMuYW5pbWF0aW9uQ29uZmlnW2JdOnRoaXMuYW5pbWF0aW9uQ29uZmlnO0FycmF5LmlzQXJyYXkoaCl8fChoPVtoXSk7aWYoaClmb3IodmFyIGssdD0wO2s9CmhbdF07dCsrKWlmKGsuYW5pbWF0YWJsZSlrLmFuaW1hdGFibGUuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShrLnR5cGV8fGIsZCxmKTtlbHNlIGlmKGsuaWQpe3ZhciBsPWRbay5pZF07bD8obC5pc0Nsb25lfHwoZFtrLmlkXT10aGlzLl9jbG9uZUNvbmZpZyhsKSxsPWRbay5pZF0pLHRoaXMuX2NvcHlQcm9wZXJ0aWVzKGwsaykpOmRbay5pZF09a31lbHNlIGYucHVzaChrKX19LGdldEFuaW1hdGlvbkNvbmZpZzpmdW5jdGlvbihiKXt2YXIgZD17fSxmPVtdO3RoaXMuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShiLGQsZik7Zm9yKHZhciBoIGluIGQpZi5wdXNoKGRbaF0pO3JldHVybiBmfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbmVvbi1hbmltYXRpb24vbmVvbi1hbmltYXRpb24tcnVubmVyLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JJbXBsPXtfY29uZmlndXJlQW5pbWF0aW9uczpmdW5jdGlvbihiKXt2YXIgZD1bXSxmPVtdO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBoLGs9MDtoPWJba107aysrKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGgubmFtZSk7aWYodC5pc05lb25BbmltYXRpb24pe3ZhciBsPW51bGw7dC5jb25maWd1cmV8fCh0LmNvbmZpZ3VyZT1mdW5jdGlvbigpe3JldHVybiBudWxsfSk7bD10LmNvbmZpZ3VyZShoKTtmLnB1c2goe3Jlc3VsdDpsLGNvbmZpZzpofSl9ZWxzZSBjb25zb2xlLndhcm4odGhpcy5pcysiOiIsaC5uYW1lLCJub3QgZm91bmQhIil9Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyl7bD1mW2JdLnJlc3VsdDtoPWZbYl0uY29uZmlnO3RyeXsiZnVuY3Rpb24iIT10eXBlb2YgbC5jYW5jZWwmJihsPWRvY3VtZW50LnRpbWVsaW5lLnBsYXkobCkpfWNhdGNoKHApe2w9bnVsbCxjb25zb2xlLndhcm4oIkNvdWxkbnQgcGxheSIsCiIoIixoLm5hbWUsIikuIixwKX1sJiZkLnB1c2goe25lb25BbmltYXRpb246dCxjb25maWc6aCxhbmltYXRpb246bH0pfXJldHVybiBkfSxfc2hvdWxkQ29tcGxldGU6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPSEwLGY9MDtmPGIubGVuZ3RoO2YrKylpZigiZmluaXNoZWQiIT1iW2ZdLmFuaW1hdGlvbi5wbGF5U3RhdGUpe2Q9ITE7YnJlYWt9cmV0dXJuIGR9LF9jb21wbGV0ZTpmdW5jdGlvbihiKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdLm5lb25BbmltYXRpb24uY29tcGxldGUoYltkXS5jb25maWcpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYltkXS5hbmltYXRpb24uY2FuY2VsKCl9LHBsYXlBbmltYXRpb246ZnVuY3Rpb24oYixkKXt2YXIgZj10aGlzLmdldEFuaW1hdGlvbkNvbmZpZyhiKTtpZihmKXt0aGlzLl9hY3RpdmU9dGhpcy5fYWN0aXZlfHx7fTt0aGlzLl9hY3RpdmVbYl0mJih0aGlzLl9jb21wbGV0ZSh0aGlzLl9hY3RpdmVbYl0pLGRlbGV0ZSB0aGlzLl9hY3RpdmVbYl0pOwp2YXIgaD10aGlzLl9jb25maWd1cmVBbmltYXRpb25zKGYpO2lmKDA9PWgubGVuZ3RoKXRoaXMuZmlyZSgibmVvbi1hbmltYXRpb24tZmluaXNoIixkLHtidWJibGVzOiExfSk7ZWxzZSBmb3IodGhpcy5fYWN0aXZlW2JdPWgsZj0wO2Y8aC5sZW5ndGg7ZisrKWhbZl0uYW5pbWF0aW9uLm9uZmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5fc2hvdWxkQ29tcGxldGUoaCkmJih0aGlzLl9jb21wbGV0ZShoKSxkZWxldGUgdGhpcy5fYWN0aXZlW2JdLHRoaXMuZmlyZSgibmVvbi1hbmltYXRpb24tZmluaXNoIixkLHtidWJibGVzOiExfSkpfS5iaW5kKHRoaXMpfX0sY2FuY2VsQW5pbWF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBiIGluIHRoaXMuX2FjdGl2ZSl7dmFyIGQ9dGhpcy5fYWN0aXZlW2JdLGY7Zm9yKGYgaW4gZClkW2ZdLmFuaW1hdGlvbi5jYW5jZWwoKX10aGlzLl9hY3RpdmU9e319fTsKUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3I9W1BvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZHJvcGRvd24vaXJvbi1kcm9wZG93bi1zY3JvbGwtbWFuYWdlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkRyb3Bkb3duU2Nyb2xsTWFuYWdlcj1Qb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWRyb3Bkb3duL2lyb24tZHJvcGRvd24uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoiaXJvbi1kcm9wZG93biIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3IsUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JdLHByb3BlcnRpZXM6e2hvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxmb2N1c1RhcmdldDp7dHlwZTpPYmplY3R9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbGxvd091dHNpZGVTY3JvbGw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2FsbG93T3V0c2lkZVNjcm9sbENoYW5nZWQifX0sCmxpc3RlbmVyczp7Im5lb24tYW5pbWF0aW9uLWZpbmlzaCI6Il9vbk5lb25BbmltYXRpb25GaW5pc2gifSxvYnNlcnZlcnM6WyJfdXBkYXRlT3ZlcmxheVBvc2l0aW9uKHBvc2l0aW9uVGFyZ2V0LCB2ZXJ0aWNhbEFsaWduLCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsT2Zmc2V0LCBob3Jpem9udGFsT2Zmc2V0KSJdLGdldCBjb250YWluZWRFbGVtZW50KCl7Zm9yKHZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZD0wLGY9Yi5sZW5ndGg7ZDxmO2QrKylpZihiW2RdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGJbZF19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxBY3Rpb258fCh0aGlzLnNjcm9sbEFjdGlvbj10aGlzLmFsbG93T3V0c2lkZVNjcm9sbD8icmVmaXQiOiJsb2NrIik7dGhpcy5fcmVhZGllZD0hMH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNpemluZ1RhcmdldCYmdGhpcy5zaXppbmdUYXJnZXQhPT0KdGhpc3x8KHRoaXMuc2l6aW5nVGFyZ2V0PXRoaXMuY29udGFpbmVkRWxlbWVudHx8dGhpcyl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxBbmltYXRpb24oKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5kaXNhYmxlZD90aGlzLmNhbmNlbCgpOih0aGlzLmNhbmNlbEFuaW1hdGlvbigpLHRoaXMuX3VwZGF0ZUFuaW1hdGlvbkNvbmZpZygpLFBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcub3Blbj8odGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoImFuaW1hdGluZyIpLHRoaXMucGxheUFuaW1hdGlvbigib3BlbiIpKTpQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9yZW5kZXJPcGVuZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSwKX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcuY2xvc2U/KHRoaXMuJC5jb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKCJhbmltYXRpbmciKSx0aGlzLnBsYXlBbmltYXRpb24oImNsb3NlIikpOlBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX3JlbmRlckNsb3NlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgiYW5pbWF0aW5nIik7dGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9LF91cGRhdGVBbmltYXRpb25Db25maWc6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5jb250YWluZWRFbGVtZW50LGQ9W10uY29uY2F0KHRoaXMub3BlbkFuaW1hdGlvbkNvbmZpZ3x8W10pLmNvbmNhdCh0aGlzLmNsb3NlQW5pbWF0aW9uQ29uZmlnfHwKW10pLGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLm5vZGU9Yjt0aGlzLmFuaW1hdGlvbkNvbmZpZz17b3Blbjp0aGlzLm9wZW5BbmltYXRpb25Db25maWcsY2xvc2U6dGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZ319LF91cGRhdGVPdmVybGF5UG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJnRoaXMubm90aWZ5UmVzaXplKCl9LF9hbGxvd091dHNpZGVTY3JvbGxDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX3JlYWRpZWQmJihiP3RoaXMuc2Nyb2xsQWN0aW9uJiYibG9jayIhPT10aGlzLnNjcm9sbEFjdGlvbnx8KHRoaXMuc2Nyb2xsQWN0aW9uPSJyZWZpdCIpOnRoaXMuc2Nyb2xsQWN0aW9uPSJsb2NrIil9LF9hcHBseUZvY3VzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5mb2N1c1RhcmdldHx8dGhpcy5jb250YWluZWRFbGVtZW50O2ImJnRoaXMub3BlbmVkJiYhdGhpcy5ub0F1dG9Gb2N1cz9iLmZvY3VzKCk6UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fYXBwbHlGb2N1cy5hcHBseSh0aGlzLAphcmd1bWVudHMpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9uZW9uLWFuaW1hdGlvbi1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthbmltYXRpb25UaW1pbmc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2R1cmF0aW9uOjUwMCxlYXNpbmc6ImN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSkiLGZpbGw6ImJvdGgifX19fSxpc05lb25BbmltYXRpb246ITAsY3JlYXRlZDpmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYW5pbWF0ZXx8Y29uc29sZS53YXJuKCJObyB3ZWIgYW5pbWF0aW9ucyBkZXRlY3RlZC4gVGhpcyBlbGVtZW50IHdpbGwgbm90IGZ1bmN0aW9uIHdpdGhvdXQgYSB3ZWIgYW5pbWF0aW9ucyBwb2x5ZmlsbC4iKX0sdGltaW5nRnJvbUNvbmZpZzpmdW5jdGlvbihiKXtpZihiLnRpbWluZylmb3IodmFyIGQgaW4gYi50aW1pbmcpdGhpcy5hbmltYXRpb25UaW1pbmdbZF09Yi50aW1pbmdbZF07cmV0dXJuIHRoaXMuYW5pbWF0aW9uVGltaW5nfSxzZXRQcmVmaXhlZFByb3BlcnR5OmZ1bmN0aW9uKGIsZCxmKXtmb3IodmFyIGg9Cnt0cmFuc2Zvcm06WyJ3ZWJraXRUcmFuc2Zvcm0iXSx0cmFuc2Zvcm1PcmlnaW46WyJtb3pUcmFuc2Zvcm1PcmlnaW4iLCJ3ZWJraXRUcmFuc2Zvcm1PcmlnaW4iXX1bZF0sayx0PTA7az1oW3RdO3QrKyliLnN0eWxlW2tdPWY7Yi5zdHlsZVtkXT1mfSxjb21wbGV0ZTpmdW5jdGlvbigpe319OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL2FuaW1hdGlvbnMvZmFkZS1pbi1hbmltYXRpb24uaHRtbC5qcwpQb2x5bWVyKHtpczoiZmFkZS1pbi1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChiLm5vZGUsW3tvcGFjaXR5OiIwIn0se29wYWNpdHk6IjEifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9hbmltYXRpb25zL2ZhZGUtb3V0LWFuaW1hdGlvbi5odG1sLmpzClBvbHltZXIoe2lzOiJmYWRlLW91dC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChiLm5vZGUsW3tvcGFjaXR5OiIxIn0se29wYWNpdHk6IjAifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tZW51LWJ1dHRvbi9wYXBlci1tZW51LWJ1dHRvbi1hbmltYXRpb25zLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLW1lbnUtZ3Jvdy1oZWlnaHQtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoZCxbe2hlaWdodDpmLzIrInB4In0se2hlaWdodDpmKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pO1BvbHltZXIoe2lzOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7d2lkdGg6Zi8yKyJweCJ9LHt3aWR0aDpmKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7d2lkdGg6ZisicHgifSx7d2lkdGg6Zi1mLzIwKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGIpe3ZhciBkPWIubm9kZSxmPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3RoaXMuc2V0UHJlZml4ZWRQcm9wZXJ0eShkLCJ0cmFuc2Zvcm1PcmlnaW4iLCIwIDAiKTtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7aGVpZ2h0OmYrInB4Iix0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSx7aGVpZ2h0OmYvMisicHgiLHRyYW5zZm9ybToidHJhbnNsYXRlWSgtMjBweCkifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tZW51LWJ1dHRvbi9wYXBlci1tZW51LWJ1dHRvbi5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtBTklNQVRJT05fQ1VCSUNfQkVaSUVSOiJjdWJpYy1iZXppZXIoLjMsLjk1LC41LDEpIixNQVhfQU5JTUFUSU9OX1RJTUVfTVM6NDAwfTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbj1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLnJlZ2lzdGVyZWQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5hZGRPd25LZXlCaW5kaW5nPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUucmVtb3ZlT3duS2V5QmluZGluZ3M9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXM9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fY29sbGVjdEtleUJpbmRpbmdzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3ByZXBLZXlCaW5kaW5ncz0KZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fYWRkS2V5QmluZGluZz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fb25LZXlCaW5kaW5nRXZlbnQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fdHJpZ2dlcktleUhhbmRsZXI9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fZm9jdXNCbHVySGFuZGxlcj1mdW5jdGlvbihkKXtpZihQb2x5bWVyLkVsZW1lbnQpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09CmQudHlwZSk7ZWxzZSBpZihkLnRhcmdldD09PXRoaXMpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09ZC50eXBlKTtlbHNlIGlmKHRoaXMuX19oYW5kbGVFdmVudFJldGFyZ2V0aW5nKXt2YXIgZj1Qb2x5bWVyLmRvbShkKS5sb2NhbFRhcmdldDt0aGlzLmlzTGlnaHREZXNjZW5kYW50KGYpfHx0aGlzLmZpcmUoZC50eXBlLHtzb3VyY2VFdmVudDpkfSx7bm9kZTp0aGlzLGJ1YmJsZXM6ZC5idWJibGVzLGNhbmNlbGFibGU6ZC5jYW5jZWxhYmxlfSl9fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2NoYW5nZWRDb250cm9sU3RhdGU9ZnVuY3Rpb24oKXt0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkJiZ0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkKCl9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fc2V0Rm9jdXNlZD1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b249UG9seW1lcih7aXM6InBhcGVyLW1lbnUtYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsClBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZV0scHJvcGVydGllczp7b3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxkeW5hbWljQWxpZ246e3R5cGU6Qm9vbGVhbn0saG9yaXpvbnRhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHZlcnRpY2FsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbm9PdmVybGFwOnt0eXBlOkJvb2xlYW59LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpZ25vcmVTZWxlY3Q6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2VPbkFjdGl2YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG9wZW5BbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LAp2YWx1ZTpmdW5jdGlvbigpe3JldHVyblt7bmFtZToiZmFkZS1pbi1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjIwMH19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjoxNTAsZWFzaW5nOmIuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246Mjc1LGVhc2luZzpiLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fV19fSxjbG9zZUFuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5be25hbWU6ImZhZGUtb3V0LWFuaW1hdGlvbiIsdGltaW5nOntkdXJhdGlvbjoxNTB9fSx7bmFtZToicGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjo1MCxlYXNpbmc6Yi5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX0sCntuYW1lOiJwYXBlci1tZW51LXNocmluay1oZWlnaHQtYW5pbWF0aW9uIix0aW1pbmc6e2R1cmF0aW9uOjIwMCxlYXNpbmc6ImVhc2UtaW4ifX1dfX0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2Ryb3Bkb3duQ29udGVudDp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9LGxpc3RlbmVyczp7Imlyb24tYWN0aXZhdGUiOiJfb25Jcm9uQWN0aXZhdGUiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QifSxnZXQgY29udGVudEVsZW1lbnQoKXtmb3IodmFyIGQ9UG9seW1lci5kb20odGhpcy4kLmNvbnRlbnQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSxmPTAsaD1kLmxlbmd0aDtmPGg7ZisrKWlmKGRbZl0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gZFtmXX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/CnRoaXMuY2xvc2UoKTp0aGlzLm9wZW4oKX0sb3BlbjpmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWR8fHRoaXMuJC5kcm9wZG93bi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLmRyb3Bkb3duLmNsb3NlKCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZVNlbGVjdHx8dGhpcy5jbG9zZSgpfSxfb25Jcm9uQWN0aXZhdGU6ZnVuY3Rpb24oKXt0aGlzLmNsb3NlT25BY3RpdmF0ZSYmdGhpcy5jbG9zZSgpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihkLGYpe2Q/KHRoaXMuX2Ryb3Bkb3duQ29udGVudD10aGlzLmNvbnRlbnRFbGVtZW50LHRoaXMuZmlyZSgicGFwZXItZHJvcGRvd24tb3BlbiIpKTpudWxsIT1mJiZ0aGlzLmZpcmUoInBhcGVyLWRyb3Bkb3duLWNsb3NlIil9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oZCl7UG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLl9kaXNhYmxlZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2QmJnRoaXMub3BlbmVkJiYKdGhpcy5jbG9zZSgpfSxfX29uSXJvbk92ZXJsYXlDYW5jZWxlZDpmdW5jdGlvbihkKXt2YXIgZj10aGlzLiQudHJpZ2dlcjstMTxQb2x5bWVyLmRvbShkLmRldGFpbCkucGF0aC5pbmRleE9mKGYpJiZkLnByZXZlbnREZWZhdWx0KCl9fSk7T2JqZWN0LmtleXMoYikuZm9yRWFjaChmdW5jdGlvbihkKXtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbltkXT1iW2RdfSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24taWNvbnNldC1zdmcvaXJvbi1pY29uc2V0LXN2Zy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWljb25zZXQtc3ZnIixwcm9wZXJ0aWVzOntuYW1lOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX25hbWVDaGFuZ2VkIn0sc2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MjR9LHJ0bE1pcnJvcmluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx1c2VHbG9iYWxSdGxBdHRyaWJ1dGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJpY29uc2V0IixrZXk6bnVsbCx2YWx1ZTpudWxsfSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZ2V0SWNvbk5hbWVzOmZ1bmN0aW9uKCl7dGhpcy5faWNvbnM9dGhpcy5fY3JlYXRlSWNvbk1hcCgpO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9pY29ucykubWFwKGZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm5hbWUrIjoiK2J9LHRoaXMpfSxhcHBseUljb246ZnVuY3Rpb24oYixkKXt0aGlzLnJlbW92ZUljb24oYik7CmlmKGQ9dGhpcy5fY2xvbmVJY29uKGQsdGhpcy5ydGxNaXJyb3JpbmcmJnRoaXMuX3RhcmdldElzUlRMKGIpKSl7dmFyIGY9UG9seW1lci5kb20oYi5yb290fHxiKTtmLmluc2VydEJlZm9yZShkLGYuY2hpbGROb2Rlc1swXSk7cmV0dXJuIGIuX3N2Z0ljb249ZH1yZXR1cm4gbnVsbH0scmVtb3ZlSWNvbjpmdW5jdGlvbihiKXtiLl9zdmdJY29uJiYoUG9seW1lci5kb20oYi5yb290fHxiKS5yZW1vdmVDaGlsZChiLl9zdmdJY29uKSxiLl9zdmdJY29uPW51bGwpfSxfdGFyZ2V0SXNSVEw6ZnVuY3Rpb24oYil7bnVsbD09dGhpcy5fX3RhcmdldElzUlRMJiYodGhpcy51c2VHbG9iYWxSdGxBdHRyaWJ1dGU/dGhpcy5fX3RhcmdldElzUlRMPSJydGwiPT09KGRvY3VtZW50LmJvZHkmJmRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkaXIiKT9kb2N1bWVudC5ib2R5OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0QXR0cmlidXRlKCJkaXIiKTooYiYmYi5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFJiYKKGI9Yi5ob3N0KSx0aGlzLl9fdGFyZ2V0SXNSVEw9YiYmInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiKS5kaXJlY3Rpb24pKTtyZXR1cm4gdGhpcy5fX3RhcmdldElzUlRMfSxfbmFtZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhLnZhbHVlPW51bGw7dGhpcy5fbWV0YS5rZXk9dGhpcy5uYW1lO3RoaXMuX21ldGEudmFsdWU9dGhpczt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5maXJlKCJpcm9uLWljb25zZXQtYWRkZWQiLHRoaXMse25vZGU6d2luZG93fSl9KX0sX2NyZWF0ZUljb25NYXA6ZnVuY3Rpb24oKXt2YXIgYj1PYmplY3QuY3JlYXRlKG51bGwpO1BvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2JbZC5pZF09ZH0pO3JldHVybiBifSxfY2xvbmVJY29uOmZ1bmN0aW9uKGIsZCl7dGhpcy5faWNvbnM9dGhpcy5faWNvbnN8fHRoaXMuX2NyZWF0ZUljb25NYXAoKTtyZXR1cm4gdGhpcy5fcHJlcGFyZVN2Z0Nsb25lKHRoaXMuX2ljb25zW2JdLAp0aGlzLnNpemUsZCl9LF9wcmVwYXJlU3ZnQ2xvbmU6ZnVuY3Rpb24oYixkLGYpe2lmKGIpe2I9Yi5jbG9uZU5vZGUoITApO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJzdmciKTtkPWIuZ2V0QXR0cmlidXRlKCJ2aWV3Qm94Iil8fCIwIDAgIitkKyIgIitkO3ZhciBrPSJwb2ludGVyLWV2ZW50czogbm9uZTsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IjtmJiZiLmhhc0F0dHJpYnV0ZSgibWlycm9yLWluLXJ0bCIpJiYoays9Ii13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC0xLDEpO3RyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjsiKTtoLnNldEF0dHJpYnV0ZSgidmlld0JveCIsZCk7aC5zZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0Iik7aC5zZXRBdHRyaWJ1dGUoImZvY3VzYWJsZSIsImZhbHNlIik7aC5zdHlsZS5jc3NUZXh0PQprO2guYXBwZW5kQ2hpbGQoYikucmVtb3ZlQXR0cmlidXRlKCJpZCIpO3JldHVybiBofXJldHVybiBudWxsfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRyb3Bkb3duLW1lbnUvcGFwZXItZHJvcGRvd24tbWVudS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJwYXBlci1kcm9wZG93bi1tZW51IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlbGVjdGVkSXRlbUxhYmVsOnt0eXBlOlN0cmluZyxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxsYWJlbDp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30sZXJyb3JNZXNzYWdlOnt0eXBlOlN0cmluZ30sb3BlbmVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJyaWdodCJ9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AifSx2ZXJ0aWNhbE9mZnNldDpOdW1iZXIsZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dGFwOiJfb25UYXAifSxrZXlCaW5kaW5nczp7InVwIGRvd24iOiJvcGVuIixlc2M6ImNsb3NlIn0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImNvbWJvYm94IiwiYXJpYS1hdXRvY29tcGxldGUiOiJub25lIiwiYXJpYS1oYXNwb3B1cCI6InRydWUifSxvYnNlcnZlcnM6WyJfc2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0pIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5jb250ZW50RWxlbWVudDtiJiZiLnNlbGVjdGVkSXRlbSYmdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIuc2VsZWN0ZWRJdGVtKX0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZD0wLGY9Yi5sZW5ndGg7ZDxmO2QrKylpZihiW2RdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGJbZF19LG9wZW46ZnVuY3Rpb24oKXt0aGlzLiQubWVudUJ1dHRvbi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24uY2xvc2UoKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbihiKXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0oYi5kZXRhaWwuaXRlbSl9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKX0sX29uVGFwOmZ1bmN0aW9uKGIpe1BvbHltZXIuR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0KGIpPT09dGhpcyYmCnRoaXMub3BlbigpfSxfc2VsZWN0ZWRJdGVtQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnZhbHVlPWI9Yj9iLmxhYmVsfHxiLmdldEF0dHJpYnV0ZSgibGFiZWwiKXx8Yi50ZXh0Q29udGVudC50cmltKCk6IiI7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtTGFiZWwoYil9LF9jb21wdXRlTWVudVZlcnRpY2FsT2Zmc2V0OmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGQ/ZDpiPy00Ojh9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5yZXF1aXJlZHx8dGhpcy5yZXF1aXJlZCYmISF0aGlzLnZhbHVlfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3BlbmVkPyJ0cnVlIjoiZmFsc2UiLGQ9dGhpcy5jb250ZW50RWxlbWVudDtkJiZkLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3Rpb24uaHRtbC5qcwpQb2x5bWVyLklyb25TZWxlY3Rpb249ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3Rpb249W107dGhpcy5zZWxlY3RDYWxsYmFjaz1ifTsKUG9seW1lci5Jcm9uU2VsZWN0aW9uLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGk/dGhpcy5zZWxlY3Rpb24uc2xpY2UoKTp0aGlzLnNlbGVjdGlvblswXX0sY2xlYXI6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3Rpb24uc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGQpeyghYnx8MD5iLmluZGV4T2YoZCkpJiZ0aGlzLnNldEl0ZW1TZWxlY3RlZChkLCExKX0sdGhpcyl9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYil9LHNldEl0ZW1TZWxlY3RlZDpmdW5jdGlvbihiLGQpe2lmKG51bGwhPWImJmQhPT10aGlzLmlzU2VsZWN0ZWQoYikpe2lmKGQpdGhpcy5zZWxlY3Rpb24ucHVzaChiKTtlbHNle3ZhciBmPXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYik7MDw9ZiYmdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGYsMSl9dGhpcy5zZWxlY3RDYWxsYmFjayYmdGhpcy5zZWxlY3RDYWxsYmFjayhiLGQpfX0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMubXVsdGk/CnRoaXMudG9nZ2xlKGIpOnRoaXMuZ2V0KCkhPT1iJiYodGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwhMSksdGhpcy5zZXRJdGVtU2VsZWN0ZWQoYiwhMCkpfSx0b2dnbGU6ZnVuY3Rpb24oYil7dGhpcy5zZXRJdGVtU2VsZWN0ZWQoYiwhdGhpcy5pc1NlbGVjdGVkKGIpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHNlbGVjdGVkOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxhY3RpdmF0ZUV2ZW50Ont0eXBlOlN0cmluZyx2YWx1ZToidGFwIixvYnNlcnZlcjoiX2FjdGl2YXRlRXZlbnRDaGFuZ2VkIn0sc2VsZWN0YWJsZTpTdHJpbmcsc2VsZWN0ZWRDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6Imlyb24tc2VsZWN0ZWQifSxzZWxlY3RlZEF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZmFsbGJhY2tTZWxlY3Rpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX2V4Y2x1ZGVkTG9jYWxOYW1lczp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dGVtcGxhdGU6MSwKImRvbS1iaW5kIjoxLCJkb20taWYiOjEsImRvbS1yZXBlYXQiOjF9fX19LG9ic2VydmVyczpbIl91cGRhdGVBdHRyRm9yU2VsZWN0ZWQoYXR0ckZvclNlbGVjdGVkKSIsIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZCkiLCJfY2hlY2tGYWxsYmFjayhmYWxsYmFja1NlbGVjdGlvbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYmluZEZpbHRlckl0ZW09dGhpcy5fZmlsdGVySXRlbS5iaW5kKHRoaXMpO3RoaXMuX3NlbGVjdGlvbj1uZXcgUG9seW1lci5Jcm9uU2VsZWN0aW9uKHRoaXMuX2FwcGx5U2VsZWN0aW9uLmJpbmQodGhpcykpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmVJdGVtcyh0aGlzKTt0aGlzLl9hZGRMaXN0ZW5lcih0aGlzLmFjdGl2YXRlRXZlbnQpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZQb2x5bWVyLmRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlcik7dGhpcy5fcmVtb3ZlTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KX0sCmluZGV4T2Y6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuaXRlbXM/dGhpcy5pdGVtcy5pbmRleE9mKGIpOi0xfSxzZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZD1ifSxzZWxlY3RQcmV2aW91czpmdW5jdGlvbigpe3ZhciBiPXRoaXMuaXRlbXMubGVuZ3RoO2I9KE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpLTErYiklYjt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShiKX0sc2VsZWN0TmV4dDpmdW5jdGlvbigpe3ZhciBiPShOdW1iZXIodGhpcy5fdmFsdWVUb0luZGV4KHRoaXMuc2VsZWN0ZWQpKSsxKSV0aGlzLml0ZW1zLmxlbmd0aDt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShiKX0sc2VsZWN0SW5kZXg6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3QodGhpcy5faW5kZXhUb1ZhbHVlKGIpKX0sZm9yY2VTeW5jaHJvbm91c0l0ZW1VcGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLl9vYnNlcnZlci5mbHVzaD8KdGhpcy5fb2JzZXJ2ZXIuZmx1c2goKTp0aGlzLl91cGRhdGVJdGVtcygpfSxnZXQgX3Nob3VsZFVwZGF0ZVNlbGVjdGlvbigpe3JldHVybiBudWxsIT10aGlzLnNlbGVjdGVkfSxfY2hlY2tGYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLmxpc3Rlbih0aGlzLGIsIl9hY3RpdmF0ZUhhbmRsZXIiKX0sX3JlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGIpe3RoaXMudW5saXN0ZW4odGhpcyxiLCJfYWN0aXZhdGVIYW5kbGVyIil9LF9hY3RpdmF0ZUV2ZW50Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuX3JlbW92ZUxpc3RlbmVyKGQpO3RoaXMuX2FkZExpc3RlbmVyKGIpfSxfdXBkYXRlSXRlbXM6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModGhpcy5zZWxlY3RhYmxlfHwiKiIpO2I9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGIsdGhpcy5fYmluZEZpbHRlckl0ZW0pOwp0aGlzLl9zZXRJdGVtcyhiKX0sX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWRJdGVtJiYodGhpcy5zZWxlY3RlZD10aGlzLl92YWx1ZUZvckl0ZW0odGhpcy5zZWxlY3RlZEl0ZW0pKX0sX3VwZGF0ZVNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5fc2VsZWN0U2VsZWN0ZWQodGhpcy5zZWxlY3RlZCl9LF9zZWxlY3RTZWxlY3RlZDpmdW5jdGlvbigpe2lmKHRoaXMuaXRlbXMpe3ZhciBiPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2I/dGhpcy5fc2VsZWN0aW9uLnNlbGVjdChiKTp0aGlzLl9zZWxlY3Rpb24uY2xlYXIoKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiZ0aGlzLml0ZW1zLmxlbmd0aCYmdm9pZCAwPT09dGhpcy5fc2VsZWN0aW9uLmdldCgpJiYodGhpcy5zZWxlY3RlZD10aGlzLmZhbGxiYWNrU2VsZWN0aW9uKX19LF9maWx0ZXJJdGVtOmZ1bmN0aW9uKGIpe3JldHVybiF0aGlzLl9leGNsdWRlZExvY2FsTmFtZXNbYi5sb2NhbE5hbWVdfSwKX3ZhbHVlVG9JdGVtOmZ1bmN0aW9uKGIpe3JldHVybiBudWxsPT1iP251bGw6dGhpcy5pdGVtc1t0aGlzLl92YWx1ZVRvSW5kZXgoYildfSxfdmFsdWVUb0luZGV4OmZ1bmN0aW9uKGIpe2lmKHRoaXMuYXR0ckZvclNlbGVjdGVkKWZvcih2YXIgZD0wLGY7Zj10aGlzLml0ZW1zW2RdO2QrKyl7aWYodGhpcy5fdmFsdWVGb3JJdGVtKGYpPT1iKXJldHVybiBkfWVsc2UgcmV0dXJuIE51bWJlcihiKX0sX2luZGV4VG9WYWx1ZTpmdW5jdGlvbihiKXtpZih0aGlzLmF0dHJGb3JTZWxlY3RlZCl7aWYoYj10aGlzLml0ZW1zW2JdKXJldHVybiB0aGlzLl92YWx1ZUZvckl0ZW0oYil9ZWxzZSByZXR1cm4gYn0sX3ZhbHVlRm9ySXRlbTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4gbnVsbDtpZighdGhpcy5hdHRyRm9yU2VsZWN0ZWQpcmV0dXJuIGI9dGhpcy5pbmRleE9mKGIpLC0xPT09Yj9udWxsOmI7dmFyIGQ9YltQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclNlbGVjdGVkKV07CnJldHVybiB2b2lkIDAhPWQ/ZDpiLmdldEF0dHJpYnV0ZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCl9LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbihiLGQpe3RoaXMuc2VsZWN0ZWRDbGFzcyYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MsZCxiKTt0aGlzLnNlbGVjdGVkQXR0cmlidXRlJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkQXR0cmlidXRlLGQsYik7dGhpcy5fc2VsZWN0aW9uQ2hhbmdlKCk7dGhpcy5maXJlKCJpcm9uLSIrKGQ/InNlbGVjdCI6ImRlc2VsZWN0Iikse2l0ZW06Yn0pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHRoaXMuX3NlbGVjdGlvbi5nZXQoKSl9LF9vYnNlcnZlSXRlbXM6ZnVuY3Rpb24oYil7cmV0dXJuIFBvbHltZXIuZG9tKGIpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihkKXt0aGlzLl91cGRhdGVJdGVtcygpO3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCk7dGhpcy5maXJlKCJpcm9uLWl0ZW1zLWNoYW5nZWQiLApkLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KX0pfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKGIpe2I9Yi50YXJnZXQ7Zm9yKHZhciBkPXRoaXMuaXRlbXM7YiYmYiE9dGhpczspe3ZhciBmPWQuaW5kZXhPZihiKTtpZigwPD1mKXtkPXRoaXMuX2luZGV4VG9WYWx1ZShmKTt0aGlzLl9pdGVtQWN0aXZhdGUoZCxiKTticmVha31iPWIucGFyZW50Tm9kZX19LF9pdGVtQWN0aXZhdGU6ZnVuY3Rpb24oYixkKXt0aGlzLmZpcmUoImlyb24tYWN0aXZhdGUiLHtzZWxlY3RlZDpiLGl0ZW06ZH0se2NhbmNlbGFibGU6ITB9KS5kZWZhdWx0UHJldmVudGVkfHx0aGlzLnNlbGVjdChiKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1tdWx0aS1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOnttdWx0aTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJtdWx0aUNoYW5nZWQifSxzZWxlY3RlZFZhbHVlczp7dHlwZTpBcnJheSxub3RpZnk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNlbGVjdGVkSXRlbXM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVNlbGVjdGVkKHNlbGVjdGVkVmFsdWVzLnNwbGljZXMpIl0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMubXVsdGk/dGhpcy5fdG9nZ2xlU2VsZWN0ZWQoYik6dGhpcy5zZWxlY3RlZD1ifSxtdWx0aUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fc2VsZWN0aW9uLm11bHRpPWI7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKX0sZ2V0IF9zaG91bGRVcGRhdGVTZWxlY3Rpb24oKXtyZXR1cm4gbnVsbCE9dGhpcy5zZWxlY3RlZHx8Cm51bGwhPXRoaXMuc2VsZWN0ZWRWYWx1ZXMmJnRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSxfdXBkYXRlQXR0ckZvclNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJjA8dGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCYmKHRoaXMuc2VsZWN0ZWRWYWx1ZXM9dGhpcy5zZWxlY3RlZEl0ZW1zLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5faW5kZXhUb1ZhbHVlKHRoaXMuaW5kZXhPZihiKSl9LHRoaXMpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gbnVsbCE9Yn0sdGhpcykpOlBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fdXBkYXRlQXR0ckZvclNlbGVjdGVkLmFwcGx5KHRoaXMpfSxfdXBkYXRlU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLm11bHRpP3RoaXMuX3NlbGVjdE11bHRpKHRoaXMuc2VsZWN0ZWRWYWx1ZXMpOnRoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0TXVsdGk6ZnVuY3Rpb24oYil7Yj0KYnx8W107Yj0odGhpcy5fdmFsdWVzVG9JdGVtcyhiKXx8W10pLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4gbnVsbCE9PWYmJnZvaWQgMCE9PWZ9KTt0aGlzLl9zZWxlY3Rpb24uY2xlYXIoYik7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspdGhpcy5fc2VsZWN0aW9uLnNldEl0ZW1TZWxlY3RlZChiW2RdLCEwKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiYhdGhpcy5fc2VsZWN0aW9uLmdldCgpLmxlbmd0aCYmdGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5mYWxsYmFja1NlbGVjdGlvbikmJnRoaXMuc2VsZWN0KHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fc2VsZWN0aW9uLmdldCgpO3RoaXMubXVsdGk/KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoYiksdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIubGVuZ3RoP2JbMF06bnVsbCkpOm51bGwhPT1iJiZ2b2lkIDAhPT1iPyh0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKFtiXSksCnRoaXMuX3NldFNlbGVjdGVkSXRlbShiKSk6KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoW10pLHRoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKSl9LF90b2dnbGVTZWxlY3RlZDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLnNlbGVjdGVkVmFsdWVzLmluZGV4T2YoYik7MD5kP3RoaXMucHVzaCgic2VsZWN0ZWRWYWx1ZXMiLGIpOnRoaXMuc3BsaWNlKCJzZWxlY3RlZFZhbHVlcyIsZCwxKX0sX3ZhbHVlc1RvSXRlbXM6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PWI/bnVsbDpiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5fdmFsdWVUb0l0ZW0oZCl9LHRoaXMpfX07UG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3I9W1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntmb2N1c2VkSXRlbTp7b2JzZXJ2ZXI6Il9mb2N1c2VkSXRlbUNoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6T2JqZWN0fSxhdHRyRm9ySXRlbVRpdGxlOnt0eXBlOlN0cmluZ30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxfTU9ESUZJRVJfS0VZUzoiQWx0IEFsdEdyYXBoIENhcHNMb2NrIENvbnRyb2wgRm4gRm5Mb2NrIEh5cGVyIE1ldGEgTnVtTG9jayBPUyBTY3JvbGxMb2NrIFNoaWZ0IFN1cGVyIFN5bWJvbCBTeW1ib2xMb2NrIi5zcGxpdCgiICIpLF9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUzoxRTMsX3ByZXZpb3VzVGFiSW5kZXg6MCxob3N0QXR0cmlidXRlczp7cm9sZToibWVudSJ9LG9ic2VydmVyczpbIl91cGRhdGVNdWx0aXNlbGVjdGFibGUobXVsdGkpIl0sbGlzdGVuZXJzOntmb2N1czoiX29uRm9jdXMiLGtleWRvd246Il9vbktleWRvd24iLAoiaXJvbi1pdGVtcy1jaGFuZ2VkIjoiX29uSXJvbkl0ZW1zQ2hhbmdlZCJ9LGtleUJpbmRpbmdzOnt1cDoiX29uVXBLZXkiLGRvd246Il9vbkRvd25LZXkiLGVzYzoiX29uRXNjS2V5Iiwic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0VGFiaW5kaWNlcygpfSxzZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKTt2YXIgZD10aGlzLl92YWx1ZVRvSXRlbShiKTtkJiZkLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8KHRoaXMuX3NldEZvY3VzZWRJdGVtKGQpLFBvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9ySW1wbC5zZWxlY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3Jlc2V0VGFiaW5kaWNlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubXVsdGk/CnRoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGQ9PT1iPyIwIjoiLTEiKX0sdGhpcyl9LF91cGRhdGVNdWx0aXNlbGVjdGFibGU6ZnVuY3Rpb24oYil7Yj90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbXVsdGlzZWxlY3RhYmxlIil9LF9mb2N1c1dpdGhLZXlib2FyZEV2ZW50OmZ1bmN0aW9uKGIpe2lmKC0xPT09dGhpcy5fTU9ESUZJRVJfS0VZUy5pbmRleE9mKGIua2V5KSl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoIl9jbGVhclNlYXJjaFRleHQiKTt2YXIgZD10aGlzLl9zZWFyY2hUZXh0fHwiIjtkKz0oYi5rZXkmJjE9PWIua2V5Lmxlbmd0aD9iLmtleTpTdHJpbmcuZnJvbUNoYXJDb2RlKGIua2V5Q29kZSkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7CmI9ZC5sZW5ndGg7Zm9yKHZhciBmPTAsaDtoPXRoaXMuaXRlbXNbZl07ZisrKWlmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9dGhpcy5hdHRyRm9ySXRlbVRpdGxlfHwidGV4dENvbnRlbnQiO2s9KGhba118fGguZ2V0QXR0cmlidXRlKGspfHwiIikudHJpbSgpO2lmKCEoay5sZW5ndGg8YikmJmsuc2xpY2UoMCxiKS50b0xvY2FsZUxvd2VyQ2FzZSgpPT1kKXt0aGlzLl9zZXRGb2N1c2VkSXRlbShoKTticmVha319dGhpcy5fc2VhcmNoVGV4dD1kO3RoaXMuZGVib3VuY2UoIl9jbGVhclNlYXJjaFRleHQiLHRoaXMuX2NsZWFyU2VhcmNoVGV4dCx0aGlzLl9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUyl9fSxfY2xlYXJTZWFyY2hUZXh0OmZ1bmN0aW9uKCl7dGhpcy5fc2VhcmNoVGV4dD0iIn0sX2ZvY3VzUHJldmlvdXM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5pdGVtcy5sZW5ndGgsZD1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxmPTE7ZjwKYisxO2YrKyl7dmFyIGg9dGhpcy5pdGVtc1soZC1mK2IpJWJdO2lmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9UG9seW1lci5kb20oaCkuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O3RoaXMuX3NldEZvY3VzZWRJdGVtKGgpO2lmKFBvbHltZXIuZG9tKGspLmFjdGl2ZUVsZW1lbnQ9PWgpYnJlYWt9fX0sX2ZvY3VzTmV4dDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aCxkPU51bWJlcih0aGlzLmluZGV4T2YodGhpcy5mb2N1c2VkSXRlbSkpLGY9MTtmPGIrMTtmKyspe3ZhciBoPXRoaXMuaXRlbXNbKGQrZiklYl07aWYoIWguaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXt2YXIgaz1Qb2x5bWVyLmRvbShoKS5nZXRPd25lclJvb3QoKXx8ZG9jdW1lbnQ7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oaCk7aWYoUG9seW1lci5kb20oaykuYWN0aXZlRWxlbWVudD09aClicmVha319fSxfYXBwbHlTZWxlY3Rpb246ZnVuY3Rpb24oYixkKXtkP2Iuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwKInRydWUiKTpiLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIpO1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fYXBwbHlTZWxlY3Rpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfZm9jdXNlZEl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmZC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTshYnx8Yi5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fHRoaXMuZGlzYWJsZWR8fChiLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIiksYi5mb2N1cygpKX0sX29uSXJvbkl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihiKXtiLmRldGFpbC5hZGRlZE5vZGVzLmxlbmd0aCYmdGhpcy5fcmVzZXRUYWJpbmRpY2VzKCl9LF9vblNoaWZ0VGFiRG93bjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMDt0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKTt0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLAoiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixiKTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfb25Gb2N1czpmdW5jdGlvbihiKXshUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkJiYoYj1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0LGI9PT10aGlzfHwidW5kZWZpbmVkIj09PXR5cGVvZiBiLnRhYkluZGV4fHx0aGlzLmlzTGlnaHREZXNjZW5kYW50KGIpKSYmKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt2YXIgZD10aGlzLm11bHRpP3RoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuX3NldEZvY3VzZWRJdGVtKG51bGwpO2Q/dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oZCk6dGhpcy5pdGVtc1swXSYmdGhpcy5fZm9jdXNOZXh0KCl9KSl9LF9vblVwS2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzUHJldmlvdXMoKTsKYi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzTmV4dCgpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRXNjS2V5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5mb2N1c2VkSXRlbTtiJiZiLmJsdXIoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihiKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ1cCBkb3duIGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KGIpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yLl9hY3RpdmF0ZUhhbmRsZXIuY2FsbCh0aGlzLGIpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7Yj8odGhpcy5fcHJldmlvdXNUYWJJbmRleD10aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT90aGlzLnRhYkluZGV4OgowLHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpKTp0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4Iix0aGlzLl9wcmV2aW91c1RhYkluZGV4KX19O1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3I9W1BvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItbGlzdGJveC9wYXBlci1saXN0Ym94Lmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InBhcGVyLWxpc3Rib3giLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uTWVudUJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToibGlzdGJveCJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToib3B0aW9uIix0YWJpbmRleDoiMCJ9fTtQb2x5bWVyLlBhcGVySXRlbUJlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlckl0ZW1CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pdGVtIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JdfSk7CgovKgoKIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz4KIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanMuZm91bmRhdGlvbi8+CiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPgogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCiovCihmdW5jdGlvbigpe3ZhciB1bmRlZmluZWQ7dmFyIFZFUlNJT049IjQuMTcuNSI7dmFyIExBUkdFX0FSUkFZX1NJWkU9MjAwO3ZhciBDT1JFX0VSUk9SX1RFWFQ9IlVuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xXHgzZHBvbnlmaWxsLiIsRlVOQ19FUlJPUl9URVhUPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjt2YXIgSEFTSF9VTkRFRklORUQ9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO3ZhciBNQVhfTUVNT0laRV9TSVpFPTUwMDt2YXIgUExBQ0VIT0xERVI9Il9fbG9kYXNoX3BsYWNlaG9sZGVyX18iO3ZhciBDTE9ORV9ERUVQX0ZMQUc9MSxDTE9ORV9GTEFUX0ZMQUc9MixDTE9ORV9TWU1CT0xTX0ZMQUc9NDt2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUc9MSxDT01QQVJFX1VOT1JERVJFRF9GTEFHPTI7dmFyIFdSQVBfQklORF9GTEFHPTEsV1JBUF9CSU5EX0tFWV9GTEFHPTIsV1JBUF9DVVJSWV9CT1VORF9GTEFHPTQsV1JBUF9DVVJSWV9GTEFHPQo4LFdSQVBfQ1VSUllfUklHSFRfRkxBRz0xNixXUkFQX1BBUlRJQUxfRkxBRz0zMixXUkFQX1BBUlRJQUxfUklHSFRfRkxBRz02NCxXUkFQX0FSWV9GTEFHPTEyOCxXUkFQX1JFQVJHX0ZMQUc9MjU2LFdSQVBfRkxJUF9GTEFHPTUxMjt2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEg9MzAsREVGQVVMVF9UUlVOQ19PTUlTU0lPTj0iLi4uIjt2YXIgSE9UX0NPVU5UPTgwMCxIT1RfU1BBTj0xNjt2YXIgTEFaWV9GSUxURVJfRkxBRz0xLExBWllfTUFQX0ZMQUc9MixMQVpZX1dISUxFX0ZMQUc9Mzt2YXIgSU5GSU5JVFk9MS8wLE1BWF9TQUZFX0lOVEVHRVI9OTAwNzE5OTI1NDc0MDk5MSxNQVhfSU5URUdFUj0xLjc5NzY5MzEzNDg2MjMxNTdFMzA4LE5BTj0wLzA7dmFyIE1BWF9BUlJBWV9MRU5HVEg9NDI5NDk2NzI5NSxNQVhfQVJSQVlfSU5ERVg9TUFYX0FSUkFZX0xFTkdUSC0xLEhBTEZfTUFYX0FSUkFZX0xFTkdUSD1NQVhfQVJSQVlfTEVOR1RIPj4+MTt2YXIgd3JhcEZsYWdzPVtbImFyeSIsCldSQVBfQVJZX0ZMQUddLFsiYmluZCIsV1JBUF9CSU5EX0ZMQUddLFsiYmluZEtleSIsV1JBUF9CSU5EX0tFWV9GTEFHXSxbImN1cnJ5IixXUkFQX0NVUlJZX0ZMQUddLFsiY3VycnlSaWdodCIsV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxbImZsaXAiLFdSQVBfRkxJUF9GTEFHXSxbInBhcnRpYWwiLFdSQVBfUEFSVElBTF9GTEFHXSxbInBhcnRpYWxSaWdodCIsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFsicmVhcmciLFdSQVBfUkVBUkdfRkxBR11dO3ZhciBhcmdzVGFnPSJbb2JqZWN0IEFyZ3VtZW50c10iLGFycmF5VGFnPSJbb2JqZWN0IEFycmF5XSIsYXN5bmNUYWc9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLGJvb2xUYWc9IltvYmplY3QgQm9vbGVhbl0iLGRhdGVUYWc9IltvYmplY3QgRGF0ZV0iLGRvbUV4Y1RhZz0iW29iamVjdCBET01FeGNlcHRpb25dIixlcnJvclRhZz0iW29iamVjdCBFcnJvcl0iLGZ1bmNUYWc9IltvYmplY3QgRnVuY3Rpb25dIixnZW5UYWc9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIiwKbWFwVGFnPSJbb2JqZWN0IE1hcF0iLG51bWJlclRhZz0iW29iamVjdCBOdW1iZXJdIixudWxsVGFnPSJbb2JqZWN0IE51bGxdIixvYmplY3RUYWc9IltvYmplY3QgT2JqZWN0XSIscHJvbWlzZVRhZz0iW29iamVjdCBQcm9taXNlXSIscHJveHlUYWc9IltvYmplY3QgUHJveHldIixyZWdleHBUYWc9IltvYmplY3QgUmVnRXhwXSIsc2V0VGFnPSJbb2JqZWN0IFNldF0iLHN0cmluZ1RhZz0iW29iamVjdCBTdHJpbmddIixzeW1ib2xUYWc9IltvYmplY3QgU3ltYm9sXSIsdW5kZWZpbmVkVGFnPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHdlYWtNYXBUYWc9IltvYmplY3QgV2Vha01hcF0iLHdlYWtTZXRUYWc9IltvYmplY3QgV2Vha1NldF0iO3ZhciBhcnJheUJ1ZmZlclRhZz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGRhdGFWaWV3VGFnPSJbb2JqZWN0IERhdGFWaWV3XSIsZmxvYXQzMlRhZz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixmbG9hdDY0VGFnPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLAppbnQ4VGFnPSJbb2JqZWN0IEludDhBcnJheV0iLGludDE2VGFnPSJbb2JqZWN0IEludDE2QXJyYXldIixpbnQzMlRhZz0iW29iamVjdCBJbnQzMkFycmF5XSIsdWludDhUYWc9IltvYmplY3QgVWludDhBcnJheV0iLHVpbnQ4Q2xhbXBlZFRhZz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLHVpbnQxNlRhZz0iW29iamVjdCBVaW50MTZBcnJheV0iLHVpbnQzMlRhZz0iW29iamVjdCBVaW50MzJBcnJheV0iO3ZhciByZUVtcHR5U3RyaW5nTGVhZGluZz0vXGJfX3AgXCs9ICcnOy9nLHJlRW1wdHlTdHJpbmdNaWRkbGU9L1xiKF9fcCBcKz0pICcnIFwrL2cscmVFbXB0eVN0cmluZ1RyYWlsaW5nPS8oX19lXCguKj9cKXxcYl9fdFwpKSBcK1xuJyc7L2c7dmFyIHJlRXNjYXBlZEh0bWw9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLHJlVW5lc2NhcGVkSHRtbD0vWyY8PiInXS9nLHJlSGFzRXNjYXBlZEh0bWw9UmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxyZUhhc1VuZXNjYXBlZEh0bWw9ClJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTt2YXIgcmVFc2NhcGU9LzwlLShbXHNcU10rPyklPi9nLHJlRXZhbHVhdGU9LzwlKFtcc1xTXSs/KSU+L2cscmVJbnRlcnBvbGF0ZT0vPCU9KFtcc1xTXSs/KSU+L2c7dmFyIHJlSXNEZWVwUHJvcD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxyZUlzUGxhaW5Qcm9wPS9eXHcqJC8scmVQcm9wTmFtZT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZzt2YXIgcmVSZWdFeHBDaGFyPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxyZUhhc1JlZ0V4cENoYXI9UmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO3ZhciByZVRyaW09L15ccyt8XHMrJC9nLHJlVHJpbVN0YXJ0PS9eXHMrLyxyZVRyaW1FbmQ9L1xzKyQvO3ZhciByZVdyYXBDb21tZW50PS9ceyg/OlxuXC9cKiBcW3dyYXBwZWQgd2l0aCAuK1xdIFwqXC8pP1xuPy8sCnJlV3JhcERldGFpbHM9L1x7XG5cL1wqIFxbd3JhcHBlZCB3aXRoICguKylcXSBcKi8scmVTcGxpdERldGFpbHM9Lyw/ICYgLzt2YXIgcmVBc2NpaVdvcmQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZzt2YXIgcmVFc2NhcGVDaGFyPS9cXChcXCk/L2c7dmFyIHJlRXNUZW1wbGF0ZT0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2c7dmFyIHJlRmxhZ3M9L1x3KiQvO3ZhciByZUlzQmFkSGV4PS9eWy0rXTB4WzAtOWEtZl0rJC9pO3ZhciByZUlzQmluYXJ5PS9eMGJbMDFdKyQvaTt2YXIgcmVJc0hvc3RDdG9yPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvO3ZhciByZUlzT2N0YWw9L14wb1swLTddKyQvaTt2YXIgcmVJc1VpbnQ9L14oPzowfFsxLTldXGQqKSQvO3ZhciByZUxhdGluPS9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZzt2YXIgcmVOb01hdGNoPS8oJF4pLzt2YXIgcmVVbmVzY2FwZWRTdHJpbmc9Ci9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZzt2YXIgcnNBc3RyYWxSYW5nZT0iXFx1ZDgwMC1cXHVkZmZmIixyc0NvbWJvTWFya3NSYW5nZT0iXFx1MDMwMC1cXHUwMzZmIixyZUNvbWJvSGFsZk1hcmtzUmFuZ2U9IlxcdWZlMjAtXFx1ZmUyZiIscnNDb21ib1N5bWJvbHNSYW5nZT0iXFx1MjBkMC1cXHUyMGZmIixyc0NvbWJvUmFuZ2U9cnNDb21ib01hcmtzUmFuZ2UrcmVDb21ib0hhbGZNYXJrc1JhbmdlK3JzQ29tYm9TeW1ib2xzUmFuZ2UscnNEaW5nYmF0UmFuZ2U9IlxcdTI3MDAtXFx1MjdiZiIscnNMb3dlclJhbmdlPSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixyc01hdGhPcFJhbmdlPSJcXHhhY1xceGIxXFx4ZDdcXHhmNyIscnNOb25DaGFyUmFuZ2U9IlxceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmIixyc1B1bmN0dWF0aW9uUmFuZ2U9IlxcdTIwMDAtXFx1MjA2ZiIscnNTcGFjZVJhbmdlPSIgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLApyc1VwcGVyUmFuZ2U9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLHJzVmFyUmFuZ2U9IlxcdWZlMGVcXHVmZTBmIixyc0JyZWFrUmFuZ2U9cnNNYXRoT3BSYW5nZStyc05vbkNoYXJSYW5nZStyc1B1bmN0dWF0aW9uUmFuZ2UrcnNTcGFjZVJhbmdlO3ZhciByc0Fwb3M9IlsnXHUyMDE5XSIscnNBc3RyYWw9IlsiK3JzQXN0cmFsUmFuZ2UrIl0iLHJzQnJlYWs9IlsiK3JzQnJlYWtSYW5nZSsiXSIscnNDb21ibz0iWyIrcnNDb21ib1JhbmdlKyJdIixyc0RpZ2l0cz0iXFxkKyIscnNEaW5nYmF0PSJbIityc0RpbmdiYXRSYW5nZSsiXSIscnNMb3dlcj0iWyIrcnNMb3dlclJhbmdlKyJdIixyc01pc2M9IlteIityc0FzdHJhbFJhbmdlK3JzQnJlYWtSYW5nZStyc0RpZ2l0cytyc0RpbmdiYXRSYW5nZStyc0xvd2VyUmFuZ2UrcnNVcHBlclJhbmdlKyJdIixyc0ZpdHo9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIscnNNb2RpZmllcj0iKD86Iityc0NvbWJvKyJ8Iityc0ZpdHorIikiLHJzTm9uQXN0cmFsPQoiW14iK3JzQXN0cmFsUmFuZ2UrIl0iLHJzUmVnaW9uYWw9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHJzU3VyclBhaXI9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLHJzVXBwZXI9IlsiK3JzVXBwZXJSYW5nZSsiXSIscnNaV0o9IlxcdTIwMGQiO3ZhciByc01pc2NMb3dlcj0iKD86Iityc0xvd2VyKyJ8Iityc01pc2MrIikiLHJzTWlzY1VwcGVyPSIoPzoiK3JzVXBwZXIrInwiK3JzTWlzYysiKSIscnNPcHRDb250ckxvd2VyPSIoPzoiK3JzQXBvcysiKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIscnNPcHRDb250clVwcGVyPSIoPzoiK3JzQXBvcysiKD86RHxMTHxNfFJFfFN8VHxWRSkpPyIscmVPcHRNb2Q9cnNNb2RpZmllcisiPyIscnNPcHRWYXI9IlsiK3JzVmFyUmFuZ2UrIl0/Iixyc09wdEpvaW49Iig/OiIrcnNaV0orIig/OiIrW3JzTm9uQXN0cmFsLHJzUmVnaW9uYWwscnNTdXJyUGFpcl0uam9pbigifCIpKyIpIityc09wdFZhcityZU9wdE1vZCsKIikqIixyc09yZExvd2VyPSJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD9ceDNkXFxifFtBLVpfXSkiLHJzT3JkVXBwZXI9IlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoP1x4M2RcXGJ8W2Etel9dKSIscnNTZXE9cnNPcHRWYXIrcmVPcHRNb2QrcnNPcHRKb2luLHJzRW1vamk9Iig/OiIrW3JzRGluZ2JhdCxyc1JlZ2lvbmFsLHJzU3VyclBhaXJdLmpvaW4oInwiKSsiKSIrcnNTZXEscnNTeW1ib2w9Iig/OiIrW3JzTm9uQXN0cmFsK3JzQ29tYm8rIj8iLHJzQ29tYm8scnNSZWdpb25hbCxyc1N1cnJQYWlyLHJzQXN0cmFsXS5qb2luKCJ8IikrIikiO3ZhciByZUFwb3M9UmVnRXhwKHJzQXBvcywiZyIpO3ZhciByZUNvbWJvTWFyaz1SZWdFeHAocnNDb21ibywiZyIpO3ZhciByZVVuaWNvZGU9UmVnRXhwKHJzRml0eisiKD9ceDNkIityc0ZpdHorIil8Iityc1N5bWJvbCtyc1NlcSwiZyIpO3ZhciByZVVuaWNvZGVXb3JkPVJlZ0V4cChbcnNVcHBlcisiPyIrCnJzTG93ZXIrIisiK3JzT3B0Q29udHJMb3dlcisiKD9ceDNkIitbcnNCcmVhayxyc1VwcGVyLCIkIl0uam9pbigifCIpKyIpIixyc01pc2NVcHBlcisiKyIrcnNPcHRDb250clVwcGVyKyIoP1x4M2QiK1tyc0JyZWFrLHJzVXBwZXIrcnNNaXNjTG93ZXIsIiQiXS5qb2luKCJ8IikrIikiLHJzVXBwZXIrIj8iK3JzTWlzY0xvd2VyKyIrIityc09wdENvbnRyTG93ZXIscnNVcHBlcisiKyIrcnNPcHRDb250clVwcGVyLHJzT3JkVXBwZXIscnNPcmRMb3dlcixyc0RpZ2l0cyxyc0Vtb2ppXS5qb2luKCJ8IiksImciKTt2YXIgcmVIYXNVbmljb2RlPVJlZ0V4cCgiWyIrcnNaV0orcnNBc3RyYWxSYW5nZStyc0NvbWJvUmFuZ2UrcnNWYXJSYW5nZSsiXSIpO3ZhciByZUhhc1VuaWNvZGVXb3JkPS9bYS16XVtBLVpdfFtBLVpdezIsfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLzt2YXIgY29udGV4dFByb3BzPVsiQXJyYXkiLCJCdWZmZXIiLCJEYXRhVmlldyIsCiJEYXRlIiwiRXJyb3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJGdW5jdGlvbiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiTWFwIiwiTWF0aCIsIk9iamVjdCIsIlByb21pc2UiLCJSZWdFeHAiLCJTZXQiLCJTdHJpbmciLCJTeW1ib2wiLCJUeXBlRXJyb3IiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiV2Vha01hcCIsIl8iLCJjbGVhclRpbWVvdXQiLCJpc0Zpbml0ZSIsInBhcnNlSW50Iiwic2V0VGltZW91dCJdO3ZhciB0ZW1wbGF0ZUNvdW50ZXI9LTE7dmFyIHR5cGVkQXJyYXlUYWdzPXt9O3R5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddPXR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddPXR5cGVkQXJyYXlUYWdzW2ludDhUYWddPXR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXT10eXBlZEFycmF5VGFnc1tpbnQzMlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDhUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ109CnR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXT10cnVlO3R5cGVkQXJyYXlUYWdzW2FyZ3NUYWddPXR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXT10eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ109dHlwZWRBcnJheVRhZ3NbYm9vbFRhZ109dHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddPXR5cGVkQXJyYXlUYWdzW2RhdGVUYWddPXR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXT10eXBlZEFycmF5VGFnc1tmdW5jVGFnXT10eXBlZEFycmF5VGFnc1ttYXBUYWddPXR5cGVkQXJyYXlUYWdzW251bWJlclRhZ109dHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXT10eXBlZEFycmF5VGFnc1tyZWdleHBUYWddPXR5cGVkQXJyYXlUYWdzW3NldFRhZ109dHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXT10eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgY2xvbmVhYmxlVGFncz17fTtjbG9uZWFibGVUYWdzW2FyZ3NUYWddPWNsb25lYWJsZVRhZ3NbYXJyYXlUYWddPQpjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXT1jbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXT1jbG9uZWFibGVUYWdzW2Jvb2xUYWddPWNsb25lYWJsZVRhZ3NbZGF0ZVRhZ109Y2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXT1jbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddPWNsb25lYWJsZVRhZ3NbaW50OFRhZ109Y2xvbmVhYmxlVGFnc1tpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1tpbnQzMlRhZ109Y2xvbmVhYmxlVGFnc1ttYXBUYWddPWNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXT1jbG9uZWFibGVUYWdzW29iamVjdFRhZ109Y2xvbmVhYmxlVGFnc1tyZWdleHBUYWddPWNsb25lYWJsZVRhZ3Nbc2V0VGFnXT1jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ109Y2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddPWNsb25lYWJsZVRhZ3NbdWludDhUYWddPWNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXT1jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1t1aW50MzJUYWddPXRydWU7CmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddPWNsb25lYWJsZVRhZ3NbZnVuY1RhZ109Y2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgZGVidXJyZWRMZXR0ZXJzPXsiXHUwMGMwIjoiQSIsIlx1MDBjMSI6IkEiLCJcdTAwYzIiOiJBIiwiXHUwMGMzIjoiQSIsIlx1MDBjNCI6IkEiLCJcdTAwYzUiOiJBIiwiXHUwMGUwIjoiYSIsIlx1MDBlMSI6ImEiLCJcdTAwZTIiOiJhIiwiXHUwMGUzIjoiYSIsIlx1MDBlNCI6ImEiLCJcdTAwZTUiOiJhIiwiXHUwMGM3IjoiQyIsIlx1MDBlNyI6ImMiLCJcdTAwZDAiOiJEIiwiXHUwMGYwIjoiZCIsIlx1MDBjOCI6IkUiLCJcdTAwYzkiOiJFIiwiXHUwMGNhIjoiRSIsIlx1MDBjYiI6IkUiLCJcdTAwZTgiOiJlIiwiXHUwMGU5IjoiZSIsIlx1MDBlYSI6ImUiLCJcdTAwZWIiOiJlIiwiXHUwMGNjIjoiSSIsIlx1MDBjZCI6IkkiLCJcdTAwY2UiOiJJIiwiXHUwMGNmIjoiSSIsIlx1MDBlYyI6ImkiLCJcdTAwZWQiOiJpIiwiXHUwMGVlIjoiaSIsCiJcdTAwZWYiOiJpIiwiXHUwMGQxIjoiTiIsIlx1MDBmMSI6Im4iLCJcdTAwZDIiOiJPIiwiXHUwMGQzIjoiTyIsIlx1MDBkNCI6Ik8iLCJcdTAwZDUiOiJPIiwiXHUwMGQ2IjoiTyIsIlx1MDBkOCI6Ik8iLCJcdTAwZjIiOiJvIiwiXHUwMGYzIjoibyIsIlx1MDBmNCI6Im8iLCJcdTAwZjUiOiJvIiwiXHUwMGY2IjoibyIsIlx1MDBmOCI6Im8iLCJcdTAwZDkiOiJVIiwiXHUwMGRhIjoiVSIsIlx1MDBkYiI6IlUiLCJcdTAwZGMiOiJVIiwiXHUwMGY5IjoidSIsIlx1MDBmYSI6InUiLCJcdTAwZmIiOiJ1IiwiXHUwMGZjIjoidSIsIlx1MDBkZCI6IlkiLCJcdTAwZmQiOiJ5IiwiXHUwMGZmIjoieSIsIlx1MDBjNiI6IkFlIiwiXHUwMGU2IjoiYWUiLCJcdTAwZGUiOiJUaCIsIlx1MDBmZSI6InRoIiwiXHUwMGRmIjoic3MiLCJcdTAxMDAiOiJBIiwiXHUwMTAyIjoiQSIsIlx1MDEwNCI6IkEiLCJcdTAxMDEiOiJhIiwiXHUwMTAzIjoiYSIsIlx1MDEwNSI6ImEiLCJcdTAxMDYiOiJDIiwiXHUwMTA4IjoiQyIsCiJcdTAxMGEiOiJDIiwiXHUwMTBjIjoiQyIsIlx1MDEwNyI6ImMiLCJcdTAxMDkiOiJjIiwiXHUwMTBiIjoiYyIsIlx1MDEwZCI6ImMiLCJcdTAxMGUiOiJEIiwiXHUwMTEwIjoiRCIsIlx1MDEwZiI6ImQiLCJcdTAxMTEiOiJkIiwiXHUwMTEyIjoiRSIsIlx1MDExNCI6IkUiLCJcdTAxMTYiOiJFIiwiXHUwMTE4IjoiRSIsIlx1MDExYSI6IkUiLCJcdTAxMTMiOiJlIiwiXHUwMTE1IjoiZSIsIlx1MDExNyI6ImUiLCJcdTAxMTkiOiJlIiwiXHUwMTFiIjoiZSIsIlx1MDExYyI6IkciLCJcdTAxMWUiOiJHIiwiXHUwMTIwIjoiRyIsIlx1MDEyMiI6IkciLCJcdTAxMWQiOiJnIiwiXHUwMTFmIjoiZyIsIlx1MDEyMSI6ImciLCJcdTAxMjMiOiJnIiwiXHUwMTI0IjoiSCIsIlx1MDEyNiI6IkgiLCJcdTAxMjUiOiJoIiwiXHUwMTI3IjoiaCIsIlx1MDEyOCI6IkkiLCJcdTAxMmEiOiJJIiwiXHUwMTJjIjoiSSIsIlx1MDEyZSI6IkkiLCJcdTAxMzAiOiJJIiwiXHUwMTI5IjoiaSIsIlx1MDEyYiI6ImkiLAoiXHUwMTJkIjoiaSIsIlx1MDEyZiI6ImkiLCJcdTAxMzEiOiJpIiwiXHUwMTM0IjoiSiIsIlx1MDEzNSI6ImoiLCJcdTAxMzYiOiJLIiwiXHUwMTM3IjoiayIsIlx1MDEzOCI6ImsiLCJcdTAxMzkiOiJMIiwiXHUwMTNiIjoiTCIsIlx1MDEzZCI6IkwiLCJcdTAxM2YiOiJMIiwiXHUwMTQxIjoiTCIsIlx1MDEzYSI6ImwiLCJcdTAxM2MiOiJsIiwiXHUwMTNlIjoibCIsIlx1MDE0MCI6ImwiLCJcdTAxNDIiOiJsIiwiXHUwMTQzIjoiTiIsIlx1MDE0NSI6Ik4iLCJcdTAxNDciOiJOIiwiXHUwMTRhIjoiTiIsIlx1MDE0NCI6Im4iLCJcdTAxNDYiOiJuIiwiXHUwMTQ4IjoibiIsIlx1MDE0YiI6Im4iLCJcdTAxNGMiOiJPIiwiXHUwMTRlIjoiTyIsIlx1MDE1MCI6Ik8iLCJcdTAxNGQiOiJvIiwiXHUwMTRmIjoibyIsIlx1MDE1MSI6Im8iLCJcdTAxNTQiOiJSIiwiXHUwMTU2IjoiUiIsIlx1MDE1OCI6IlIiLCJcdTAxNTUiOiJyIiwiXHUwMTU3IjoiciIsIlx1MDE1OSI6InIiLCJcdTAxNWEiOiJTIiwKIlx1MDE1YyI6IlMiLCJcdTAxNWUiOiJTIiwiXHUwMTYwIjoiUyIsIlx1MDE1YiI6InMiLCJcdTAxNWQiOiJzIiwiXHUwMTVmIjoicyIsIlx1MDE2MSI6InMiLCJcdTAxNjIiOiJUIiwiXHUwMTY0IjoiVCIsIlx1MDE2NiI6IlQiLCJcdTAxNjMiOiJ0IiwiXHUwMTY1IjoidCIsIlx1MDE2NyI6InQiLCJcdTAxNjgiOiJVIiwiXHUwMTZhIjoiVSIsIlx1MDE2YyI6IlUiLCJcdTAxNmUiOiJVIiwiXHUwMTcwIjoiVSIsIlx1MDE3MiI6IlUiLCJcdTAxNjkiOiJ1IiwiXHUwMTZiIjoidSIsIlx1MDE2ZCI6InUiLCJcdTAxNmYiOiJ1IiwiXHUwMTcxIjoidSIsIlx1MDE3MyI6InUiLCJcdTAxNzQiOiJXIiwiXHUwMTc1IjoidyIsIlx1MDE3NiI6IlkiLCJcdTAxNzciOiJ5IiwiXHUwMTc4IjoiWSIsIlx1MDE3OSI6IloiLCJcdTAxN2IiOiJaIiwiXHUwMTdkIjoiWiIsIlx1MDE3YSI6InoiLCJcdTAxN2MiOiJ6IiwiXHUwMTdlIjoieiIsIlx1MDEzMiI6IklKIiwiXHUwMTMzIjoiaWoiLCJcdTAxNTIiOiJPZSIsCiJcdTAxNTMiOiJvZSIsIlx1MDE0OSI6IiduIiwiXHUwMTdmIjoicyJ9O3ZhciBodG1sRXNjYXBlcz17Ilx4MjYiOiJceDI2YW1wOyIsIlx4M2MiOiJceDI2bHQ7IiwiXHgzZSI6Ilx4MjZndDsiLCciJzoiXHgyNnF1b3Q7IiwiJyI6Ilx4MjYjMzk7In07dmFyIGh0bWxVbmVzY2FwZXM9eyJceDI2YW1wOyI6Ilx4MjYiLCJceDI2bHQ7IjoiXHgzYyIsIlx4MjZndDsiOiJceDNlIiwiXHgyNnF1b3Q7IjonIicsIlx4MjYjMzk7IjoiJyJ9O3ZhciBzdHJpbmdFc2NhcGVzPXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9O3ZhciBmcmVlUGFyc2VGbG9hdD1wYXJzZUZsb2F0LGZyZWVQYXJzZUludD1wYXJzZUludDt2YXIgZnJlZUdsb2JhbD10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWw7dmFyIGZyZWVTZWxmPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmCnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmO3ZhciByb290PWZyZWVHbG9iYWx8fGZyZWVTZWxmfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO3ZhciBmcmVlRXhwb3J0cz10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzO3ZhciBmcmVlTW9kdWxlPWZyZWVFeHBvcnRzJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGU7dmFyIG1vZHVsZUV4cG9ydHM9ZnJlZU1vZHVsZSYmZnJlZU1vZHVsZS5leHBvcnRzPT09ZnJlZUV4cG9ydHM7dmFyIGZyZWVQcm9jZXNzPW1vZHVsZUV4cG9ydHMmJmZyZWVHbG9iYWwucHJvY2Vzczt2YXIgbm9kZVV0aWw9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGZyZWVQcm9jZXNzJiZmcmVlUHJvY2Vzcy5iaW5kaW5nJiZmcmVlUHJvY2Vzcy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2goZSl7fX0oKTt2YXIgbm9kZUlzQXJyYXlCdWZmZXI9bm9kZVV0aWwmJgpub2RlVXRpbC5pc0FycmF5QnVmZmVyLG5vZGVJc0RhdGU9bm9kZVV0aWwmJm5vZGVVdGlsLmlzRGF0ZSxub2RlSXNNYXA9bm9kZVV0aWwmJm5vZGVVdGlsLmlzTWFwLG5vZGVJc1JlZ0V4cD1ub2RlVXRpbCYmbm9kZVV0aWwuaXNSZWdFeHAsbm9kZUlzU2V0PW5vZGVVdGlsJiZub2RlVXRpbC5pc1NldCxub2RlSXNUeXBlZEFycmF5PW5vZGVVdGlsJiZub2RlVXRpbC5pc1R5cGVkQXJyYXk7ZnVuY3Rpb24gYXBwbHkoZnVuYyx0aGlzQXJnLGFyZ3Mpe3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7Y2FzZSAxOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdKTtjYXNlIDI6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSl9cmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZyxhcmdzKX1mdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksCnNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtzZXR0ZXIoYWNjdW11bGF0b3IsdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGFycmF5KX1yZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk9PT1mYWxzZSlicmVhaztyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSxsZW5ndGgsYXJyYXkpPT09ZmFsc2UpYnJlYWs7CnJldHVybiBhcnJheX1mdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZighcHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsYXJyYXkpKXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmJhc2VJbmRleE9mKGFycmF5LAp2YWx1ZSwwKT4tMX1mdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSx2YWx1ZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGNvbXBhcmF0b3IodmFsdWUsYXJyYXlbaW5kZXhdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1pdGVyYXRlZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXMubGVuZ3RoLG9mZnNldD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJyYXlbb2Zmc2V0K2luZGV4XT0KdmFsdWVzW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5WysraW5kZXhdO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFjY3VtdWxhdG9yPWl0ZXJhdGVlKGFjY3VtdWxhdG9yLGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5Wy0tbGVuZ3RoXTt3aGlsZShsZW5ndGgtLSlhY2N1bXVsYXRvcj1pdGVyYXRlZShhY2N1bXVsYXRvcixhcnJheVtsZW5ndGhdLGxlbmd0aCxhcnJheSk7CnJldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKHByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX12YXIgYXNjaWlTaXplPWJhc2VQcm9wZXJ0eSgibGVuZ3RoIik7ZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZyl7cmV0dXJuIHN0cmluZy5zcGxpdCgiIil9ZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpfHxbXX1mdW5jdGlvbiBiYXNlRmluZEtleShjb2xsZWN0aW9uLHByZWRpY2F0ZSxlYWNoRnVuYyl7dmFyIHJlc3VsdDtlYWNoRnVuYyhjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsa2V5LGNvbGxlY3Rpb24pKXtyZXN1bHQ9a2V5OwpyZXR1cm4gZmFsc2V9fSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tSW5kZXgrKGZyb21SaWdodD8xOi0xKTt3aGlsZShmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aClpZihwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXtyZXR1cm4gdmFsdWU9PT12YWx1ZT9zdHJpY3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCk6YmFzZUZpbmRJbmRleChhcnJheSxiYXNlSXNOYU4sZnJvbUluZGV4KX1mdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksdmFsdWUsZnJvbUluZGV4LGNvbXBhcmF0b3Ipe3ZhciBpbmRleD1mcm9tSW5kZXgtMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8Cmxlbmd0aClpZihjb21wYXJhdG9yKGFycmF5W2luZGV4XSx2YWx1ZSkpcmV0dXJuIGluZGV4O3JldHVybi0xfWZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSl7cmV0dXJuIHZhbHVlIT09dmFsdWV9ZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU3VtKGFycmF5LGl0ZXJhdGVlKS9sZW5ndGg6TkFOfWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtLGVhY2hGdW5jKXtlYWNoRnVuYyhjb2xsZWN0aW9uLApmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXthY2N1bXVsYXRvcj1pbml0QWNjdW0/KGluaXRBY2N1bT1mYWxzZSx2YWx1ZSk6aXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsY29sbGVjdGlvbil9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSxjb21wYXJlcil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7YXJyYXkuc29ydChjb21wYXJlcik7d2hpbGUobGVuZ3RoLS0pYXJyYXlbbGVuZ3RoXT1hcnJheVtsZW5ndGhdLnZhbHVlO3JldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlU3VtKGFycmF5LGl0ZXJhdGVlKXt2YXIgcmVzdWx0LGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBjdXJyZW50PWl0ZXJhdGVlKGFycmF5W2luZGV4XSk7aWYoY3VycmVudCE9PXVuZGVmaW5lZClyZXN1bHQ9cmVzdWx0PT09dW5kZWZpbmVkP2N1cnJlbnQ6cmVzdWx0K2N1cnJlbnR9cmV0dXJuIHJlc3VsdH0KZnVuY3Rpb24gYmFzZVRpbWVzKG4saXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobik7d2hpbGUoKytpbmRleDxuKXJlc3VsdFtpbmRleF09aXRlcmF0ZWUoaW5kZXgpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlNYXAocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm5ba2V5LG9iamVjdFtrZXldXX0pfWZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jKHZhbHVlKX19ZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheU1hcChwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Rba2V5XX0pfWZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLGtleSl7cmV0dXJuIGNhY2hlLmhhcyhrZXkpfWZ1bmN0aW9uIGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9c3RyU3ltYm9scy5sZW5ndGg7CndoaWxlKCsraW5kZXg8bGVuZ3RoJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD1zdHJTeW1ib2xzLmxlbmd0aDt3aGlsZShpbmRleC0tJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LHBsYWNlaG9sZGVyKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9MDt3aGlsZShsZW5ndGgtLSlpZihhcnJheVtsZW5ndGhdPT09cGxhY2Vob2xkZXIpKytyZXN1bHQ7cmV0dXJuIHJlc3VsdH12YXIgZGVidXJyTGV0dGVyPWJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7dmFyIGVzY2FwZUh0bWxDaGFyPWJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocil7cmV0dXJuIlxcIisKc3RyaW5nRXNjYXBlc1tjaHJdfWZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfWZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKXtyZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpe3JldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3Ipe3ZhciBkYXRhLHJlc3VsdD1bXTt3aGlsZSghKGRhdGE9aXRlcmF0b3IubmV4dCgpKS5kb25lKXJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWFwVG9BcnJheShtYXApe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobWFwLnNpemUpO21hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLGtleSl7cmVzdWx0WysraW5kZXhdPVtrZXksdmFsdWVdfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsCnRyYW5zZm9ybSl7cmV0dXJuIGZ1bmN0aW9uKGFyZyl7cmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpfX1mdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSxwbGFjZWhvbGRlcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYodmFsdWU9PT1wbGFjZWhvbGRlcnx8dmFsdWU9PT1QTEFDRUhPTERFUil7YXJyYXlbaW5kZXhdPVBMQUNFSE9MREVSO3Jlc3VsdFtyZXNJbmRleCsrXT1pbmRleH19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCxrZXkpe3JldHVybiBrZXk9PSJfX3Byb3RvX18iP3VuZGVmaW5lZDpvYmplY3Rba2V5XX1mdW5jdGlvbiBzZXRUb0FycmF5KHNldCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShzZXQuc2l6ZSk7c2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpe3Jlc3VsdFsrK2luZGV4XT12YWx1ZX0pOwpyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KHNldC5zaXplKTtzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPVt2YWx1ZSx2YWx1ZV19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4KzE7d2hpbGUoaW5kZXgtLSlpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuIGluZGV4fWZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVTaXplKHN0cmluZyk6CmFzY2lpU2l6ZShzdHJpbmcpfWZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVUb0FycmF5KHN0cmluZyk6YXNjaWlUb0FycmF5KHN0cmluZyl9dmFyIHVuZXNjYXBlSHRtbENoYXI9YmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7ZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKXt2YXIgcmVzdWx0PXJlVW5pY29kZS5sYXN0SW5kZXg9MDt3aGlsZShyZVVuaWNvZGUudGVzdChzdHJpbmcpKSsrcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSl8fFtdfWZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCl8fFtdfXZhciBydW5JbkNvbnRleHQ9ZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpe2NvbnRleHQ9Y29udGV4dD09bnVsbD9yb290Ol8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwKY29udGV4dCxfLnBpY2socm9vdCxjb250ZXh0UHJvcHMpKTt2YXIgQXJyYXk9Y29udGV4dC5BcnJheSxEYXRlPWNvbnRleHQuRGF0ZSxFcnJvcj1jb250ZXh0LkVycm9yLEZ1bmN0aW9uPWNvbnRleHQuRnVuY3Rpb24sTWF0aD1jb250ZXh0Lk1hdGgsT2JqZWN0PWNvbnRleHQuT2JqZWN0LFJlZ0V4cD1jb250ZXh0LlJlZ0V4cCxTdHJpbmc9Y29udGV4dC5TdHJpbmcsVHlwZUVycm9yPWNvbnRleHQuVHlwZUVycm9yO3ZhciBhcnJheVByb3RvPUFycmF5LnByb3RvdHlwZSxmdW5jUHJvdG89RnVuY3Rpb24ucHJvdG90eXBlLG9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGU7dmFyIGNvcmVKc0RhdGE9Y29udGV4dFsiX19jb3JlLWpzX3NoYXJlZF9fIl07dmFyIGZ1bmNUb1N0cmluZz1mdW5jUHJvdG8udG9TdHJpbmc7dmFyIGhhc093blByb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5O3ZhciBpZENvdW50ZXI9MDt2YXIgbWFza1NyY0tleT1mdW5jdGlvbigpe3ZhciB1aWQ9Ci9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSYmY29yZUpzRGF0YS5rZXlzJiZjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdWlkPyJTeW1ib2woc3JjKV8xLiIrdWlkOiIifSgpO3ZhciBuYXRpdmVPYmplY3RUb1N0cmluZz1vYmplY3RQcm90by50b1N0cmluZzt2YXIgb2JqZWN0Q3RvclN0cmluZz1mdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO3ZhciBvbGREYXNoPXJvb3QuXzt2YXIgcmVJc05hdGl2ZT1SZWdFeHAoIl4iK2Z1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgQnVmZmVyPW1vZHVsZUV4cG9ydHM/Y29udGV4dC5CdWZmZXI6dW5kZWZpbmVkLFN5bWJvbD1jb250ZXh0LlN5bWJvbCxVaW50OEFycmF5PWNvbnRleHQuVWludDhBcnJheSxhbGxvY1Vuc2FmZT0KQnVmZmVyP0J1ZmZlci5hbGxvY1Vuc2FmZTp1bmRlZmluZWQsZ2V0UHJvdG90eXBlPW92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksb2JqZWN0Q3JlYXRlPU9iamVjdC5jcmVhdGUscHJvcGVydHlJc0VudW1lcmFibGU9b2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsc3BsaWNlPWFycmF5UHJvdG8uc3BsaWNlLHNwcmVhZGFibGVTeW1ib2w9U3ltYm9sP1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGU6dW5kZWZpbmVkLHN5bUl0ZXJhdG9yPVN5bWJvbD9TeW1ib2wuaXRlcmF0b3I6dW5kZWZpbmVkLHN5bVRvU3RyaW5nVGFnPVN5bWJvbD9TeW1ib2wudG9TdHJpbmdUYWc6dW5kZWZpbmVkO3ZhciBkZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbigpe3RyeXt2YXIgZnVuYz1nZXROYXRpdmUoT2JqZWN0LCJkZWZpbmVQcm9wZXJ0eSIpO2Z1bmMoe30sIiIse30pO3JldHVybiBmdW5jfWNhdGNoKGUpe319KCk7dmFyIGN0eENsZWFyVGltZW91dD1jb250ZXh0LmNsZWFyVGltZW91dCE9PQpyb290LmNsZWFyVGltZW91dCYmY29udGV4dC5jbGVhclRpbWVvdXQsY3R4Tm93PURhdGUmJkRhdGUubm93IT09cm9vdC5EYXRlLm5vdyYmRGF0ZS5ub3csY3R4U2V0VGltZW91dD1jb250ZXh0LnNldFRpbWVvdXQhPT1yb290LnNldFRpbWVvdXQmJmNvbnRleHQuc2V0VGltZW91dDt2YXIgbmF0aXZlQ2VpbD1NYXRoLmNlaWwsbmF0aXZlRmxvb3I9TWF0aC5mbG9vcixuYXRpdmVHZXRTeW1ib2xzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsbmF0aXZlSXNCdWZmZXI9QnVmZmVyP0J1ZmZlci5pc0J1ZmZlcjp1bmRlZmluZWQsbmF0aXZlSXNGaW5pdGU9Y29udGV4dC5pc0Zpbml0ZSxuYXRpdmVKb2luPWFycmF5UHJvdG8uam9pbixuYXRpdmVLZXlzPW92ZXJBcmcoT2JqZWN0LmtleXMsT2JqZWN0KSxuYXRpdmVNYXg9TWF0aC5tYXgsbmF0aXZlTWluPU1hdGgubWluLG5hdGl2ZU5vdz1EYXRlLm5vdyxuYXRpdmVQYXJzZUludD1jb250ZXh0LnBhcnNlSW50LG5hdGl2ZVJhbmRvbT0KTWF0aC5yYW5kb20sbmF0aXZlUmV2ZXJzZT1hcnJheVByb3RvLnJldmVyc2U7dmFyIERhdGFWaWV3PWdldE5hdGl2ZShjb250ZXh0LCJEYXRhVmlldyIpLE1hcD1nZXROYXRpdmUoY29udGV4dCwiTWFwIiksUHJvbWlzZT1nZXROYXRpdmUoY29udGV4dCwiUHJvbWlzZSIpLFNldD1nZXROYXRpdmUoY29udGV4dCwiU2V0IiksV2Vha01hcD1nZXROYXRpdmUoY29udGV4dCwiV2Vha01hcCIpLG5hdGl2ZUNyZWF0ZT1nZXROYXRpdmUoT2JqZWN0LCJjcmVhdGUiKTt2YXIgbWV0YU1hcD1XZWFrTWFwJiZuZXcgV2Vha01hcDt2YXIgcmVhbE5hbWVzPXt9O3ZhciBkYXRhVmlld0N0b3JTdHJpbmc9dG9Tb3VyY2UoRGF0YVZpZXcpLG1hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoTWFwKSxwcm9taXNlQ3RvclN0cmluZz10b1NvdXJjZShQcm9taXNlKSxzZXRDdG9yU3RyaW5nPXRvU291cmNlKFNldCksd2Vha01hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoV2Vha01hcCk7dmFyIHN5bWJvbFByb3RvPVN5bWJvbD8KU3ltYm9sLnByb3RvdHlwZTp1bmRlZmluZWQsc3ltYm9sVmFsdWVPZj1zeW1ib2xQcm90bz9zeW1ib2xQcm90by52YWx1ZU9mOnVuZGVmaW5lZCxzeW1ib2xUb1N0cmluZz1zeW1ib2xQcm90bz9zeW1ib2xQcm90by50b1N0cmluZzp1bmRlZmluZWQ7ZnVuY3Rpb24gbG9kYXNoKHZhbHVlKXtpZihpc09iamVjdExpa2UodmFsdWUpJiYhaXNBcnJheSh2YWx1ZSkmJiEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpe2lmKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcilyZXR1cm4gdmFsdWU7aWYoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwiX193cmFwcGVkX18iKSlyZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKX1yZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUpfXZhciBiYXNlQ3JlYXRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb2JqZWN0KCl7fXJldHVybiBmdW5jdGlvbihwcm90byl7aWYoIWlzT2JqZWN0KHByb3RvKSlyZXR1cm57fTtpZihvYmplY3RDcmVhdGUpcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7Cm9iamVjdC5wcm90b3R5cGU9cHJvdG87dmFyIHJlc3VsdD1uZXcgb2JqZWN0O29iamVjdC5wcm90b3R5cGU9dW5kZWZpbmVkO3JldHVybiByZXN1bHR9fSgpO2Z1bmN0aW9uIGJhc2VMb2Rhc2goKXt9ZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSxjaGFpbkFsbCl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19jaGFpbl9fPSEhY2hhaW5BbGw7dGhpcy5fX2luZGV4X189MDt0aGlzLl9fdmFsdWVzX189dW5kZWZpbmVkfWxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzPXsiZXNjYXBlIjpyZUVzY2FwZSwiZXZhbHVhdGUiOnJlRXZhbHVhdGUsImludGVycG9sYXRlIjpyZUludGVycG9sYXRlLCJ2YXJpYWJsZSI6IiIsImltcG9ydHMiOnsiXyI6bG9kYXNofX07bG9kYXNoLnByb3RvdHlwZT1iYXNlTG9kYXNoLnByb3RvdHlwZTtsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPWxvZGFzaDtMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZT1iYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTsKTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3I9TG9kYXNoV3JhcHBlcjtmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19kaXJfXz0xO3RoaXMuX19maWx0ZXJlZF9fPWZhbHNlO3RoaXMuX19pdGVyYXRlZXNfXz1bXTt0aGlzLl9fdGFrZUNvdW50X189TUFYX0FSUkFZX0xFTkdUSDt0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBsYXp5Q2xvbmUoKXt2YXIgcmVzdWx0PW5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO3Jlc3VsdC5fX2Rpcl9fPXRoaXMuX19kaXJfXztyZXN1bHQuX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fO3Jlc3VsdC5fX2l0ZXJhdGVlc19fPWNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO3Jlc3VsdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXzsKcmVzdWx0Ll9fdmlld3NfXz1jb3B5QXJyYXkodGhpcy5fX3ZpZXdzX18pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbGF6eVJldmVyc2UoKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHJlc3VsdD1uZXcgTGF6eVdyYXBwZXIodGhpcyk7cmVzdWx0Ll9fZGlyX189LTE7cmVzdWx0Ll9fZmlsdGVyZWRfXz10cnVlfWVsc2V7cmVzdWx0PXRoaXMuY2xvbmUoKTtyZXN1bHQuX19kaXJfXyo9LTF9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsYXp5VmFsdWUoKXt2YXIgYXJyYXk9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGRpcj10aGlzLl9fZGlyX18saXNBcnI9aXNBcnJheShhcnJheSksaXNSaWdodD1kaXI8MCxhcnJMZW5ndGg9aXNBcnI/YXJyYXkubGVuZ3RoOjAsdmlldz1nZXRWaWV3KDAsYXJyTGVuZ3RoLHRoaXMuX192aWV3c19fKSxzdGFydD12aWV3LnN0YXJ0LGVuZD12aWV3LmVuZCxsZW5ndGg9ZW5kLXN0YXJ0LGluZGV4PWlzUmlnaHQ/ZW5kOnN0YXJ0LTEsaXRlcmF0ZWVzPXRoaXMuX19pdGVyYXRlZXNfXywKaXRlckxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoLHJlc0luZGV4PTAsdGFrZUNvdW50PW5hdGl2ZU1pbihsZW5ndGgsdGhpcy5fX3Rha2VDb3VudF9fKTtpZighaXNBcnJ8fCFpc1JpZ2h0JiZhcnJMZW5ndGg9PWxlbmd0aCYmdGFrZUNvdW50PT1sZW5ndGgpcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUoYXJyYXksdGhpcy5fX2FjdGlvbnNfXyk7dmFyIHJlc3VsdD1bXTtvdXRlcjp3aGlsZShsZW5ndGgtLSYmcmVzSW5kZXg8dGFrZUNvdW50KXtpbmRleCs9ZGlyO3ZhciBpdGVySW5kZXg9LTEsdmFsdWU9YXJyYXlbaW5kZXhdO3doaWxlKCsraXRlckluZGV4PGl0ZXJMZW5ndGgpe3ZhciBkYXRhPWl0ZXJhdGVlc1tpdGVySW5kZXhdLGl0ZXJhdGVlPWRhdGEuaXRlcmF0ZWUsdHlwZT1kYXRhLnR5cGUsY29tcHV0ZWQ9aXRlcmF0ZWUodmFsdWUpO2lmKHR5cGU9PUxBWllfTUFQX0ZMQUcpdmFsdWU9Y29tcHV0ZWQ7ZWxzZSBpZighY29tcHV0ZWQpaWYodHlwZT09TEFaWV9GSUxURVJfRkxBRyljb250aW51ZSBvdXRlcjsKZWxzZSBicmVhayBvdXRlcn1yZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1MYXp5V3JhcHBlci5wcm90b3R5cGU9YmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxhenlXcmFwcGVyO2Z1bmN0aW9uIEhhc2goZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBoYXNoQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPW5hdGl2ZUNyZWF0ZT9uYXRpdmVDcmVhdGUobnVsbCk6e307dGhpcy5zaXplPTB9ZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpe3ZhciByZXN1bHQ9dGhpcy5oYXMoa2V5KSYmZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7CnJldHVybiByZXN1bHR9ZnVuY3Rpb24gaGFzaEdldChrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYobmF0aXZlQ3JlYXRlKXt2YXIgcmVzdWx0PWRhdGFba2V5XTtyZXR1cm4gcmVzdWx0PT09SEFTSF9VTkRFRklORUQ/dW5kZWZpbmVkOnJlc3VsdH1yZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLGtleSk/ZGF0YVtrZXldOnVuZGVmaW5lZH1mdW5jdGlvbiBoYXNoSGFzKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztyZXR1cm4gbmF0aXZlQ3JlYXRlP2RhdGFba2V5XSE9PXVuZGVmaW5lZDpoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsa2V5KX1mdW5jdGlvbiBoYXNoU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXzt0aGlzLnNpemUrPXRoaXMuaGFzKGtleSk/MDoxO2RhdGFba2V5XT1uYXRpdmVDcmVhdGUmJnZhbHVlPT09dW5kZWZpbmVkP0hBU0hfVU5ERUZJTkVEOnZhbHVlO3JldHVybiB0aGlzfUhhc2gucHJvdG90eXBlLmNsZWFyPWhhc2hDbGVhcjsKSGFzaC5wcm90b3R5cGVbImRlbGV0ZSJdPWhhc2hEZWxldGU7SGFzaC5wcm90b3R5cGUuZ2V0PWhhc2hHZXQ7SGFzaC5wcm90b3R5cGUuaGFzPWhhc2hIYXM7SGFzaC5wcm90b3R5cGUuc2V0PWhhc2hTZXQ7ZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPVtdO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtpZihpbmRleDwwKXJldHVybiBmYWxzZTt2YXIgbGFzdEluZGV4PWRhdGEubGVuZ3RoLTE7aWYoaW5kZXg9PWxhc3RJbmRleClkYXRhLnBvcCgpOwplbHNlIHNwbGljZS5jYWxsKGRhdGEsaW5kZXgsMSk7LS10aGlzLnNpemU7cmV0dXJuIHRydWV9ZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO3JldHVybiBpbmRleDwwP3VuZGVmaW5lZDpkYXRhW2luZGV4XVsxXX1mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KXtyZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sa2V5KT4tMX1mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7aWYoaW5kZXg8MCl7Kyt0aGlzLnNpemU7ZGF0YS5wdXNoKFtrZXksdmFsdWVdKX1lbHNlIGRhdGFbaW5kZXhdWzFdPXZhbHVlO3JldHVybiB0aGlzfUxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXI9bGlzdENhY2hlQ2xlYXI7TGlzdENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl09bGlzdENhY2hlRGVsZXRlO0xpc3RDYWNoZS5wcm90b3R5cGUuZ2V0PQpsaXN0Q2FjaGVHZXQ7TGlzdENhY2hlLnByb3RvdHlwZS5oYXM9bGlzdENhY2hlSGFzO0xpc3RDYWNoZS5wcm90b3R5cGUuc2V0PWxpc3RDYWNoZVNldDtmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM9PW51bGw/MDplbnRyaWVzLmxlbmd0aDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKXt0aGlzLnNpemU9MDt0aGlzLl9fZGF0YV9fPXsiaGFzaCI6bmV3IEhhc2gsIm1hcCI6bmV3IChNYXB8fExpc3RDYWNoZSksInN0cmluZyI6bmV3IEhhc2h9fWZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSl7dmFyIHJlc3VsdD1nZXRNYXBEYXRhKHRoaXMsa2V5KVsiZGVsZXRlIl0oa2V5KTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpe3JldHVybiBnZXRNYXBEYXRhKHRoaXMsCmtleSkuZ2V0KGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSkuaGFzKGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT1nZXRNYXBEYXRhKHRoaXMsa2V5KSxzaXplPWRhdGEuc2l6ZTtkYXRhLnNldChrZXksdmFsdWUpO3RoaXMuc2l6ZSs9ZGF0YS5zaXplPT1zaXplPzA6MTtyZXR1cm4gdGhpc31NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXI9bWFwQ2FjaGVDbGVhcjtNYXBDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdPW1hcENhY2hlRGVsZXRlO01hcENhY2hlLnByb3RvdHlwZS5nZXQ9bWFwQ2FjaGVHZXQ7TWFwQ2FjaGUucHJvdG90eXBlLmhhcz1tYXBDYWNoZUhhcztNYXBDYWNoZS5wcm90b3R5cGUuc2V0PW1hcENhY2hlU2V0O2Z1bmN0aW9uIFNldENhY2hlKHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXM9PW51bGw/MDp2YWx1ZXMubGVuZ3RoO3RoaXMuX19kYXRhX189bmV3IE1hcENhY2hlOwp3aGlsZSgrK2luZGV4PGxlbmd0aCl0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKX1mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSl7dGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsSEFTSF9VTkRFRklORUQpO3JldHVybiB0aGlzfWZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpfVNldENhY2hlLnByb3RvdHlwZS5hZGQ9U2V0Q2FjaGUucHJvdG90eXBlLnB1c2g9c2V0Q2FjaGVBZGQ7U2V0Q2FjaGUucHJvdG90eXBlLmhhcz1zZXRDYWNoZUhhcztmdW5jdGlvbiBTdGFjayhlbnRyaWVzKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fPW5ldyBMaXN0Q2FjaGUoZW50cmllcyk7dGhpcy5zaXplPWRhdGEuc2l6ZX1mdW5jdGlvbiBzdGFja0NsZWFyKCl7dGhpcy5fX2RhdGFfXz1uZXcgTGlzdENhY2hlO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxyZXN1bHQ9ZGF0YVsiZGVsZXRlIl0oa2V5KTsKdGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0YWNrR2V0KGtleSl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSl9ZnVuY3Rpb24gc3RhY2tIYXMoa2V5KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KX1mdW5jdGlvbiBzdGFja1NldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSl7dmFyIHBhaXJzPWRhdGEuX19kYXRhX187aWYoIU1hcHx8cGFpcnMubGVuZ3RoPExBUkdFX0FSUkFZX1NJWkUtMSl7cGFpcnMucHVzaChba2V5LHZhbHVlXSk7dGhpcy5zaXplPSsrZGF0YS5zaXplO3JldHVybiB0aGlzfWRhdGE9dGhpcy5fX2RhdGFfXz1uZXcgTWFwQ2FjaGUocGFpcnMpfWRhdGEuc2V0KGtleSx2YWx1ZSk7dGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gdGhpc31TdGFjay5wcm90b3R5cGUuY2xlYXI9c3RhY2tDbGVhcjtTdGFjay5wcm90b3R5cGVbImRlbGV0ZSJdPXN0YWNrRGVsZXRlOwpTdGFjay5wcm90b3R5cGUuZ2V0PXN0YWNrR2V0O1N0YWNrLnByb3RvdHlwZS5oYXM9c3RhY2tIYXM7U3RhY2sucHJvdG90eXBlLnNldD1zdGFja1NldDtmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLGluaGVyaXRlZCl7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpLGlzQXJnPSFpc0FyciYmaXNBcmd1bWVudHModmFsdWUpLGlzQnVmZj0haXNBcnImJiFpc0FyZyYmaXNCdWZmZXIodmFsdWUpLGlzVHlwZT0haXNBcnImJiFpc0FyZyYmIWlzQnVmZiYmaXNUeXBlZEFycmF5KHZhbHVlKSxza2lwSW5kZXhlcz1pc0Fycnx8aXNBcmd8fGlzQnVmZnx8aXNUeXBlLHJlc3VsdD1za2lwSW5kZXhlcz9iYXNlVGltZXModmFsdWUubGVuZ3RoLFN0cmluZyk6W10sbGVuZ3RoPXJlc3VsdC5sZW5ndGg7Zm9yKHZhciBrZXkgaW4gdmFsdWUpaWYoKGluaGVyaXRlZHx8aGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxrZXkpKSYmIShza2lwSW5kZXhlcyYmKGtleT09Imxlbmd0aCJ8fGlzQnVmZiYmKGtleT09CiJvZmZzZXQifHxrZXk9PSJwYXJlbnQiKXx8aXNUeXBlJiYoa2V5PT0iYnVmZmVyInx8a2V5PT0iYnl0ZUxlbmd0aCJ8fGtleT09ImJ5dGVPZmZzZXQiKXx8aXNJbmRleChrZXksbGVuZ3RoKSkpKXJlc3VsdC5wdXNoKGtleSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9hcnJheVtiYXNlUmFuZG9tKDAsbGVuZ3RoLTEpXTp1bmRlZmluZWR9ZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LG4pe3JldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9ZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KXtyZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSl9ZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXtpZih2YWx1ZSE9PXVuZGVmaW5lZCYmIWVxKG9iamVjdFtrZXldLHZhbHVlKXx8CnZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKWJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKX1mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXt2YXIgb2JqVmFsdWU9b2JqZWN0W2tleV07aWYoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZlcShvYmpWYWx1ZSx2YWx1ZSkpfHx2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KSliYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl9ZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LGtleSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoZXEoYXJyYXlbbGVuZ3RoXVswXSxrZXkpKXJldHVybiBsZW5ndGg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbixzZXR0ZXIsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe3NldHRlcihhY2N1bXVsYXRvciwKdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGNvbGxlY3Rpb24pfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdCYmY29weU9iamVjdChzb3VyY2Usa2V5cyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3QmJmNvcHlPYmplY3Qoc291cmNlLGtleXNJbihzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpe2lmKGtleT09Il9fcHJvdG9fXyImJmRlZmluZVByb3BlcnR5KWRlZmluZVByb3BlcnR5KG9iamVjdCxrZXkseyJjb25maWd1cmFibGUiOnRydWUsImVudW1lcmFibGUiOnRydWUsInZhbHVlIjp2YWx1ZSwid3JpdGFibGUiOnRydWV9KTtlbHNlIG9iamVjdFtrZXldPXZhbHVlfWZ1bmN0aW9uIGJhc2VBdChvYmplY3QscGF0aHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aHMubGVuZ3RoLHJlc3VsdD0KQXJyYXkobGVuZ3RoKSxza2lwPW9iamVjdD09bnVsbDt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHRbaW5kZXhdPXNraXA/dW5kZWZpbmVkOmdldChvYmplY3QscGF0aHNbaW5kZXhdKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsbG93ZXIsdXBwZXIpe2lmKG51bWJlcj09PW51bWJlcil7aWYodXBwZXIhPT11bmRlZmluZWQpbnVtYmVyPW51bWJlcjw9dXBwZXI/bnVtYmVyOnVwcGVyO2lmKGxvd2VyIT09dW5kZWZpbmVkKW51bWJlcj1udW1iZXI+PWxvd2VyP251bWJlcjpsb3dlcn1yZXR1cm4gbnVtYmVyfWZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsa2V5LG9iamVjdCxzdGFjayl7dmFyIHJlc3VsdCxpc0RlZXA9Yml0bWFzayZDTE9ORV9ERUVQX0ZMQUcsaXNGbGF0PWJpdG1hc2smQ0xPTkVfRkxBVF9GTEFHLGlzRnVsbD1iaXRtYXNrJkNMT05FX1NZTUJPTFNfRkxBRztpZihjdXN0b21pemVyKXJlc3VsdD1vYmplY3Q/CmN1c3RvbWl6ZXIodmFsdWUsa2V5LG9iamVjdCxzdGFjayk6Y3VzdG9taXplcih2YWx1ZSk7aWYocmVzdWx0IT09dW5kZWZpbmVkKXJldHVybiByZXN1bHQ7aWYoIWlzT2JqZWN0KHZhbHVlKSlyZXR1cm4gdmFsdWU7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpO2lmKGlzQXJyKXtyZXN1bHQ9aW5pdENsb25lQXJyYXkodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSxyZXN1bHQpfWVsc2V7dmFyIHRhZz1nZXRUYWcodmFsdWUpLGlzRnVuYz10YWc9PWZ1bmNUYWd8fHRhZz09Z2VuVGFnO2lmKGlzQnVmZmVyKHZhbHVlKSlyZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsaXNEZWVwKTtpZih0YWc9PW9iamVjdFRhZ3x8dGFnPT1hcmdzVGFnfHxpc0Z1bmMmJiFvYmplY3Qpe3Jlc3VsdD1pc0ZsYXR8fGlzRnVuYz97fTppbml0Q2xvbmVPYmplY3QodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGlzRmxhdD9jb3B5U3ltYm9sc0luKHZhbHVlLGJhc2VBc3NpZ25JbihyZXN1bHQsCnZhbHVlKSk6Y29weVN5bWJvbHModmFsdWUsYmFzZUFzc2lnbihyZXN1bHQsdmFsdWUpKX1lbHNle2lmKCFjbG9uZWFibGVUYWdzW3RhZ10pcmV0dXJuIG9iamVjdD92YWx1ZTp7fTtyZXN1bHQ9aW5pdENsb25lQnlUYWcodmFsdWUsdGFnLGlzRGVlcCl9fXN0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTt2YXIgc3RhY2tlZD1zdGFjay5nZXQodmFsdWUpO2lmKHN0YWNrZWQpcmV0dXJuIHN0YWNrZWQ7c3RhY2suc2V0KHZhbHVlLHJlc3VsdCk7aWYoaXNTZXQodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKXtyZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3ViVmFsdWUsdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9aWYoaXNNYXAodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7cmVzdWx0LnNldChrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsCnN0YWNrKSl9KTtyZXR1cm4gcmVzdWx0fXZhciBrZXlzRnVuYz1pc0Z1bGw/aXNGbGF0P2dldEFsbEtleXNJbjpnZXRBbGxLZXlzOmlzRmxhdD9rZXlzSW46a2V5czt2YXIgcHJvcHM9aXNBcnI/dW5kZWZpbmVkOmtleXNGdW5jKHZhbHVlKTthcnJheUVhY2gocHJvcHN8fHZhbHVlLGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7aWYocHJvcHMpe2tleT1zdWJWYWx1ZTtzdWJWYWx1ZT12YWx1ZVtrZXldfWFzc2lnblZhbHVlKHJlc3VsdCxrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUNvbmZvcm1zKHNvdXJjZSl7dmFyIHByb3BzPWtleXMoc291cmNlKTtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSxwcm9wcyl9fWZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2UscHJvcHMpe3ZhciBsZW5ndGg9cHJvcHMubGVuZ3RoOwppZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cHJvcHNbbGVuZ3RoXSxwcmVkaWNhdGU9c291cmNlW2tleV0sdmFsdWU9b2JqZWN0W2tleV07aWYodmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCl8fCFwcmVkaWNhdGUodmFsdWUpKXJldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBiYXNlRGVsYXkoZnVuYyx3YWl0LGFyZ3Mpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2Z1bmMuYXBwbHkodW5kZWZpbmVkLGFyZ3MpfSx3YWl0KX1mdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGluY2x1ZGVzPWFycmF5SW5jbHVkZXMsaXNDb21tb249dHJ1ZSxsZW5ndGg9YXJyYXkubGVuZ3RoLApyZXN1bHQ9W10sdmFsdWVzTGVuZ3RoPXZhbHVlcy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4gcmVzdWx0O2lmKGl0ZXJhdGVlKXZhbHVlcz1hcnJheU1hcCh2YWx1ZXMsYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7aWYoY29tcGFyYXRvcil7aW5jbHVkZXM9YXJyYXlJbmNsdWRlc1dpdGg7aXNDb21tb249ZmFsc2V9ZWxzZSBpZih2YWx1ZXMubGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXtpbmNsdWRlcz1jYWNoZUhhcztpc0NvbW1vbj1mYWxzZTt2YWx1ZXM9bmV3IFNldENhY2hlKHZhbHVlcyl9b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU9PW51bGw/dmFsdWU6aXRlcmF0ZWUodmFsdWUpO3ZhbHVlPWNvbXBhcmF0b3J8fHZhbHVlIT09MD92YWx1ZTowO2lmKGlzQ29tbW9uJiZjb21wdXRlZD09PWNvbXB1dGVkKXt2YXIgdmFsdWVzSW5kZXg9dmFsdWVzTGVuZ3RoO3doaWxlKHZhbHVlc0luZGV4LS0paWYodmFsdWVzW3ZhbHVlc0luZGV4XT09PQpjb21wdXRlZCljb250aW51ZSBvdXRlcjtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXModmFsdWVzLGNvbXB1dGVkLGNvbXBhcmF0b3IpKXJlc3VsdC5wdXNoKHZhbHVlKX1yZXR1cm4gcmVzdWx0fXZhciBiYXNlRWFjaD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTt2YXIgYmFzZUVhY2hSaWdodD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsdHJ1ZSk7ZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgcmVzdWx0PXRydWU7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtyZXN1bHQ9ISFwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIHJlc3VsdH0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9CmFycmF5W2luZGV4XSxjdXJyZW50PWl0ZXJhdGVlKHZhbHVlKTtpZihjdXJyZW50IT1udWxsJiYoY29tcHV0ZWQ9PT11bmRlZmluZWQ/Y3VycmVudD09PWN1cnJlbnQmJiFpc1N5bWJvbChjdXJyZW50KTpjb21wYXJhdG9yKGN1cnJlbnQsY29tcHV0ZWQpKSl2YXIgY29tcHV0ZWQ9Y3VycmVudCxyZXN1bHQ9dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3N0YXJ0PXRvSW50ZWdlcihzdGFydCk7aWYoc3RhcnQ8MClzdGFydD0tc3RhcnQ+bGVuZ3RoPzA6bGVuZ3RoK3N0YXJ0O2VuZD1lbmQ9PT11bmRlZmluZWR8fGVuZD5sZW5ndGg/bGVuZ3RoOnRvSW50ZWdlcihlbmQpO2lmKGVuZDwwKWVuZCs9bGVuZ3RoO2VuZD1zdGFydD5lbmQ/MDp0b0xlbmd0aChlbmQpO3doaWxlKHN0YXJ0PGVuZClhcnJheVtzdGFydCsrXT12YWx1ZTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLApwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbikpcmVzdWx0LnB1c2godmFsdWUpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSxkZXB0aCxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtwcmVkaWNhdGV8fChwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZSk7cmVzdWx0fHwocmVzdWx0PVtdKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihkZXB0aD4wJiZwcmVkaWNhdGUodmFsdWUpKWlmKGRlcHRoPjEpYmFzZUZsYXR0ZW4odmFsdWUsZGVwdGgtMSxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KTtlbHNlIGFycmF5UHVzaChyZXN1bHQsdmFsdWUpO2Vsc2UgaWYoIWlzU3RyaWN0KXJlc3VsdFtyZXN1bHQubGVuZ3RoXT0KdmFsdWV9cmV0dXJuIHJlc3VsdH12YXIgYmFzZUZvcj1jcmVhdGVCYXNlRm9yKCk7dmFyIGJhc2VGb3JSaWdodD1jcmVhdGVCYXNlRm9yKHRydWUpO2Z1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yKG9iamVjdCxpdGVyYXRlZSxrZXlzKX1mdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yUmlnaHQob2JqZWN0LGl0ZXJhdGVlLGtleXMpfWZ1bmN0aW9uIGJhc2VGdW5jdGlvbnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSl9KX1mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9MCxsZW5ndGg9cGF0aC5sZW5ndGg7d2hpbGUob2JqZWN0IT1udWxsJiZpbmRleDxsZW5ndGgpb2JqZWN0PW9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07CnJldHVybiBpbmRleCYmaW5kZXg9PWxlbmd0aD9vYmplY3Q6dW5kZWZpbmVkfWZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzRnVuYyxzeW1ib2xzRnVuYyl7dmFyIHJlc3VsdD1rZXlzRnVuYyhvYmplY3QpO3JldHVybiBpc0FycmF5KG9iamVjdCk/cmVzdWx0OmFycmF5UHVzaChyZXN1bHQsc3ltYm9sc0Z1bmMob2JqZWN0KSl9ZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSl7aWYodmFsdWU9PW51bGwpcmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkP3VuZGVmaW5lZFRhZzpudWxsVGFnO3JldHVybiBzeW1Ub1N0cmluZ1RhZyYmc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKT9nZXRSYXdUYWcodmFsdWUpOm9iamVjdFRvU3RyaW5nKHZhbHVlKX1mdW5jdGlvbiBiYXNlR3QodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT5vdGhlcn1mdW5jdGlvbiBiYXNlSGFzKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LAprZXkpfWZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3Qsa2V5KXtyZXR1cm4gb2JqZWN0IT1udWxsJiZrZXkgaW4gT2JqZWN0KG9iamVjdCl9ZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7cmV0dXJuIG51bWJlcj49bmF0aXZlTWluKHN0YXJ0LGVuZCkmJm51bWJlcjxuYXRpdmVNYXgoc3RhcnQsZW5kKX1mdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5jbHVkZXM9Y29tcGFyYXRvcj9hcnJheUluY2x1ZGVzV2l0aDphcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheXNbMF0ubGVuZ3RoLG90aExlbmd0aD1hcnJheXMubGVuZ3RoLG90aEluZGV4PW90aExlbmd0aCxjYWNoZXM9QXJyYXkob3RoTGVuZ3RoKSxtYXhMZW5ndGg9SW5maW5pdHkscmVzdWx0PVtdO3doaWxlKG90aEluZGV4LS0pe3ZhciBhcnJheT1hcnJheXNbb3RoSW5kZXhdO2lmKG90aEluZGV4JiZpdGVyYXRlZSlhcnJheT1hcnJheU1hcChhcnJheSwKYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7bWF4TGVuZ3RoPW5hdGl2ZU1pbihhcnJheS5sZW5ndGgsbWF4TGVuZ3RoKTtjYWNoZXNbb3RoSW5kZXhdPSFjb21wYXJhdG9yJiYoaXRlcmF0ZWV8fGxlbmd0aD49MTIwJiZhcnJheS5sZW5ndGg+PTEyMCk/bmV3IFNldENhY2hlKG90aEluZGV4JiZhcnJheSk6dW5kZWZpbmVkfWFycmF5PWFycmF5c1swXTt2YXIgaW5kZXg9LTEsc2Vlbj1jYWNoZXNbMF07b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgmJnJlc3VsdC5sZW5ndGg8bWF4TGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZighKHNlZW4/Y2FjaGVIYXMoc2Vlbixjb21wdXRlZCk6aW5jbHVkZXMocmVzdWx0LGNvbXB1dGVkLGNvbXBhcmF0b3IpKSl7b3RoSW5kZXg9b3RoTGVuZ3RoO3doaWxlKC0tb3RoSW5kZXgpe3ZhciBjYWNoZT1jYWNoZXNbb3RoSW5kZXhdOwppZighKGNhY2hlP2NhY2hlSGFzKGNhY2hlLGNvbXB1dGVkKTppbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLGNvbXB1dGVkLGNvbXBhcmF0b3IpKSljb250aW51ZSBvdXRlcn1pZihzZWVuKXNlZW4ucHVzaChjb21wdXRlZCk7cmVzdWx0LnB1c2godmFsdWUpfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXtiYXNlRm9yT3duKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxrZXksb2JqZWN0KXtzZXR0ZXIoYWNjdW11bGF0b3IsaXRlcmF0ZWUodmFsdWUpLGtleSxvYmplY3QpfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7b2JqZWN0PXBhcmVudChvYmplY3QscGF0aCk7dmFyIGZ1bmM9b2JqZWN0PT1udWxsP29iamVjdDpvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO3JldHVybiBmdW5jPT1udWxsP3VuZGVmaW5lZDoKYXBwbHkoZnVuYyxvYmplY3QsYXJncyl9ZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWFyZ3NUYWd9ZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09YXJyYXlCdWZmZXJUYWd9ZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1kYXRlVGFnfWZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl7aWYodmFsdWU9PT1vdGhlcilyZXR1cm4gdHJ1ZTtpZih2YWx1ZT09bnVsbHx8b3RoZXI9PW51bGx8fCFpc09iamVjdExpa2UodmFsdWUpJiYhaXNPYmplY3RMaWtlKG90aGVyKSlyZXR1cm4gdmFsdWUhPT12YWx1ZSYmb3RoZXIhPT1vdGhlcjtyZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLApvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsYmFzZUlzRXF1YWwsc3RhY2spfWZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIG9iaklzQXJyPWlzQXJyYXkob2JqZWN0KSxvdGhJc0Fycj1pc0FycmF5KG90aGVyKSxvYmpUYWc9b2JqSXNBcnI/YXJyYXlUYWc6Z2V0VGFnKG9iamVjdCksb3RoVGFnPW90aElzQXJyP2FycmF5VGFnOmdldFRhZyhvdGhlcik7b2JqVGFnPW9ialRhZz09YXJnc1RhZz9vYmplY3RUYWc6b2JqVGFnO290aFRhZz1vdGhUYWc9PWFyZ3NUYWc/b2JqZWN0VGFnOm90aFRhZzt2YXIgb2JqSXNPYmo9b2JqVGFnPT1vYmplY3RUYWcsb3RoSXNPYmo9b3RoVGFnPT1vYmplY3RUYWcsaXNTYW1lVGFnPW9ialRhZz09b3RoVGFnO2lmKGlzU2FtZVRhZyYmaXNCdWZmZXIob2JqZWN0KSl7aWYoIWlzQnVmZmVyKG90aGVyKSlyZXR1cm4gZmFsc2U7b2JqSXNBcnI9dHJ1ZTtvYmpJc09iaj0KZmFsc2V9aWYoaXNTYW1lVGFnJiYhb2JqSXNPYmope3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gb2JqSXNBcnJ8fGlzVHlwZWRBcnJheShvYmplY3QpP2VxdWFsQXJyYXlzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTplcXVhbEJ5VGFnKG9iamVjdCxvdGhlcixvYmpUYWcsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl9aWYoIShiaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHKSl7dmFyIG9iaklzV3JhcHBlZD1vYmpJc09iaiYmaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIl9fd3JhcHBlZF9fIiksb3RoSXNXcmFwcGVkPW90aElzT2JqJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCJfX3dyYXBwZWRfXyIpO2lmKG9iaklzV3JhcHBlZHx8b3RoSXNXcmFwcGVkKXt2YXIgb2JqVW53cmFwcGVkPW9iaklzV3JhcHBlZD9vYmplY3QudmFsdWUoKTpvYmplY3Qsb3RoVW53cmFwcGVkPW90aElzV3JhcHBlZD9vdGhlci52YWx1ZSgpOgpvdGhlcjtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7cmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsb3RoVW53cmFwcGVkLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl9fWlmKCFpc1NhbWVUYWcpcmV0dXJuIGZhbHNlO3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKX1mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZnZXRUYWcodmFsdWUpPT1tYXBUYWd9ZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxtYXRjaERhdGEsY3VzdG9taXplcil7dmFyIGluZGV4PW1hdGNoRGF0YS5sZW5ndGgsbGVuZ3RoPWluZGV4LG5vQ3VzdG9taXplcj0hY3VzdG9taXplcjtpZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUoaW5kZXgtLSl7dmFyIGRhdGE9bWF0Y2hEYXRhW2luZGV4XTsKaWYobm9DdXN0b21pemVyJiZkYXRhWzJdP2RhdGFbMV0hPT1vYmplY3RbZGF0YVswXV06IShkYXRhWzBdaW4gb2JqZWN0KSlyZXR1cm4gZmFsc2V9d2hpbGUoKytpbmRleDxsZW5ndGgpe2RhdGE9bWF0Y2hEYXRhW2luZGV4XTt2YXIga2V5PWRhdGFbMF0sb2JqVmFsdWU9b2JqZWN0W2tleV0sc3JjVmFsdWU9ZGF0YVsxXTtpZihub0N1c3RvbWl6ZXImJmRhdGFbMl0pe2lmKG9ialZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKXJldHVybiBmYWxzZX1lbHNle3ZhciBzdGFjaz1uZXcgU3RhY2s7aWYoY3VzdG9taXplcil2YXIgcmVzdWx0PWN1c3RvbWl6ZXIob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCxzb3VyY2Usc3RhY2spO2lmKCEocmVzdWx0PT09dW5kZWZpbmVkP2Jhc2VJc0VxdWFsKHNyY1ZhbHVlLG9ialZhbHVlLENPTVBBUkVfUEFSVElBTF9GTEFHfENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsY3VzdG9taXplcixzdGFjayk6cmVzdWx0KSlyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfQpmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpe2lmKCFpc09iamVjdCh2YWx1ZSl8fGlzTWFza2VkKHZhbHVlKSlyZXR1cm4gZmFsc2U7dmFyIHBhdHRlcm49aXNGdW5jdGlvbih2YWx1ZSk/cmVJc05hdGl2ZTpyZUlzSG9zdEN0b3I7cmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpfWZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1yZWdleHBUYWd9ZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmZ2V0VGFnKHZhbHVlKT09c2V0VGFnfWZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpJiYhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXX1mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09ImZ1bmN0aW9uIilyZXR1cm4gdmFsdWU7CmlmKHZhbHVlPT1udWxsKXJldHVybiBpZGVudGl0eTtpZih0eXBlb2YgdmFsdWU9PSJvYmplY3QiKXJldHVybiBpc0FycmF5KHZhbHVlKT9iYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLHZhbHVlWzFdKTpiYXNlTWF0Y2hlcyh2YWx1ZSk7cmV0dXJuIHByb3BlcnR5KHZhbHVlKX1mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3Qpe2lmKCFpc1Byb3RvdHlwZShvYmplY3QpKXJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7dmFyIHJlc3VsdD1bXTtmb3IodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSlpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZrZXkhPSJjb25zdHJ1Y3RvciIpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KXtpZighaXNPYmplY3Qob2JqZWN0KSlyZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7dmFyIGlzUHJvdG89aXNQcm90b3R5cGUob2JqZWN0KSxyZXN1bHQ9W107Zm9yKHZhciBrZXkgaW4gb2JqZWN0KWlmKCEoa2V5PT0KImNvbnN0cnVjdG9yIiYmKGlzUHJvdG98fCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpKSkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPG90aGVyfWZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGluZGV4PS0xLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7cmVzdWx0WysraW5kZXhdPWl0ZXJhdGVlKHZhbHVlLGtleSxjb2xsZWN0aW9uKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKXt2YXIgbWF0Y2hEYXRhPWdldE1hdGNoRGF0YShzb3VyY2UpO2lmKG1hdGNoRGF0YS5sZW5ndGg9PTEmJm1hdGNoRGF0YVswXVsyXSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLAptYXRjaERhdGFbMF1bMV0pO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PT1zb3VyY2V8fGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsbWF0Y2hEYXRhKX19ZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLHNyY1ZhbHVlKXtpZihpc0tleShwYXRoKSYmaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksc3JjVmFsdWUpO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3ZhciBvYmpWYWx1ZT1nZXQob2JqZWN0LHBhdGgpO3JldHVybiBvYmpWYWx1ZT09PXVuZGVmaW5lZCYmb2JqVmFsdWU9PT1zcmNWYWx1ZT9oYXNJbihvYmplY3QscGF0aCk6YmFzZUlzRXF1YWwoc3JjVmFsdWUsb2JqVmFsdWUsQ09NUEFSRV9QQVJUSUFMX0ZMQUd8Q09NUEFSRV9VTk9SREVSRURfRkxBRyl9fWZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIsc3RhY2spe2lmKG9iamVjdD09PQpzb3VyY2UpcmV0dXJuO2Jhc2VGb3Ioc291cmNlLGZ1bmN0aW9uKHNyY1ZhbHVlLGtleSl7aWYoaXNPYmplY3Qoc3JjVmFsdWUpKXtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7YmFzZU1lcmdlRGVlcChvYmplY3Qsc291cmNlLGtleSxzcmNJbmRleCxiYXNlTWVyZ2UsY3VzdG9taXplcixzdGFjayl9ZWxzZXt2YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LGtleSksc3JjVmFsdWUsa2V5KyIiLG9iamVjdCxzb3VyY2Usc3RhY2spOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCluZXdWYWx1ZT1zcmNWYWx1ZTthc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpfX0sa2V5c0luKX1mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCxzb3VyY2Usa2V5LHNyY0luZGV4LG1lcmdlRnVuYyxjdXN0b21pemVyLHN0YWNrKXt2YXIgb2JqVmFsdWU9c2FmZUdldChvYmplY3Qsa2V5KSxzcmNWYWx1ZT1zYWZlR2V0KHNvdXJjZSwKa2V5KSxzdGFja2VkPXN0YWNrLmdldChzcmNWYWx1ZSk7aWYoc3RhY2tlZCl7YXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHN0YWNrZWQpO3JldHVybn12YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKG9ialZhbHVlLHNyY1ZhbHVlLGtleSsiIixvYmplY3Qsc291cmNlLHN0YWNrKTp1bmRlZmluZWQ7dmFyIGlzQ29tbW9uPW5ld1ZhbHVlPT09dW5kZWZpbmVkO2lmKGlzQ29tbW9uKXt2YXIgaXNBcnI9aXNBcnJheShzcmNWYWx1ZSksaXNCdWZmPSFpc0FyciYmaXNCdWZmZXIoc3JjVmFsdWUpLGlzVHlwZWQ9IWlzQXJyJiYhaXNCdWZmJiZpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO25ld1ZhbHVlPXNyY1ZhbHVlO2lmKGlzQXJyfHxpc0J1ZmZ8fGlzVHlwZWQpaWYoaXNBcnJheShvYmpWYWx1ZSkpbmV3VmFsdWU9b2JqVmFsdWU7ZWxzZSBpZihpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpbmV3VmFsdWU9Y29weUFycmF5KG9ialZhbHVlKTtlbHNlIGlmKGlzQnVmZil7aXNDb21tb249CmZhbHNlO25ld1ZhbHVlPWNsb25lQnVmZmVyKHNyY1ZhbHVlLHRydWUpfWVsc2UgaWYoaXNUeXBlZCl7aXNDb21tb249ZmFsc2U7bmV3VmFsdWU9Y2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLHRydWUpfWVsc2UgbmV3VmFsdWU9W107ZWxzZSBpZihpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKXx8aXNBcmd1bWVudHMoc3JjVmFsdWUpKXtuZXdWYWx1ZT1vYmpWYWx1ZTtpZihpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpbmV3VmFsdWU9dG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7ZWxzZSBpZighaXNPYmplY3Qob2JqVmFsdWUpfHxzcmNJbmRleCYmaXNGdW5jdGlvbihvYmpWYWx1ZSkpbmV3VmFsdWU9aW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKX1lbHNlIGlzQ29tbW9uPWZhbHNlfWlmKGlzQ29tbW9uKXtzdGFjay5zZXQoc3JjVmFsdWUsbmV3VmFsdWUpO21lcmdlRnVuYyhuZXdWYWx1ZSxzcmNWYWx1ZSxzcmNJbmRleCxjdXN0b21pemVyLHN0YWNrKTtzdGFja1siZGVsZXRlIl0oc3JjVmFsdWUpfWFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LAprZXksbmV3VmFsdWUpfWZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksbil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm47bis9bjwwP2xlbmd0aDowO3JldHVybiBpc0luZGV4KG4sbGVuZ3RoKT9hcnJheVtuXTp1bmRlZmluZWR9ZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbixpdGVyYXRlZXMsb3JkZXJzKXt2YXIgaW5kZXg9LTE7aXRlcmF0ZWVzPWFycmF5TWFwKGl0ZXJhdGVlcy5sZW5ndGg/aXRlcmF0ZWVzOltpZGVudGl0eV0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTt2YXIgcmVzdWx0PWJhc2VNYXAoY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7dmFyIGNyaXRlcmlhPWFycmF5TWFwKGl0ZXJhdGVlcyxmdW5jdGlvbihpdGVyYXRlZSl7cmV0dXJuIGl0ZXJhdGVlKHZhbHVlKX0pO3JldHVybnsiY3JpdGVyaWEiOmNyaXRlcmlhLCJpbmRleCI6KytpbmRleCwidmFsdWUiOnZhbHVlfX0pO3JldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwKZnVuY3Rpb24ob2JqZWN0LG90aGVyKXtyZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCxvdGhlcixvcmRlcnMpfSl9ZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LHBhdGhzKXtyZXR1cm4gYmFzZVBpY2tCeShvYmplY3QscGF0aHMsZnVuY3Rpb24odmFsdWUscGF0aCl7cmV0dXJuIGhhc0luKG9iamVjdCxwYXRoKX0pfWZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LHBhdGhzLHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRocy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGF0aD1wYXRoc1tpbmRleF0sdmFsdWU9YmFzZUdldChvYmplY3QscGF0aCk7aWYocHJlZGljYXRlKHZhbHVlLHBhdGgpKWJhc2VTZXQocmVzdWx0LGNhc3RQYXRoKHBhdGgsb2JqZWN0KSx2YWx1ZSl9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlR2V0KG9iamVjdCxwYXRoKX19CmZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LHZhbHVlcyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXhPZj1jb21wYXJhdG9yP2Jhc2VJbmRleE9mV2l0aDpiYXNlSW5kZXhPZixpbmRleD0tMSxsZW5ndGg9dmFsdWVzLmxlbmd0aCxzZWVuPWFycmF5O2lmKGFycmF5PT09dmFsdWVzKXZhbHVlcz1jb3B5QXJyYXkodmFsdWVzKTtpZihpdGVyYXRlZSlzZWVuPWFycmF5TWFwKGFycmF5LGJhc2VVbmFyeShpdGVyYXRlZSkpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZnJvbUluZGV4PTAsdmFsdWU9dmFsdWVzW2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7d2hpbGUoKGZyb21JbmRleD1pbmRleE9mKHNlZW4sY29tcHV0ZWQsZnJvbUluZGV4LGNvbXBhcmF0b3IpKT4tMSl7aWYoc2VlbiE9PWFycmF5KXNwbGljZS5jYWxsKHNlZW4sZnJvbUluZGV4LDEpO3NwbGljZS5jYWxsKGFycmF5LGZyb21JbmRleCwxKX19cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VQdWxsQXQoYXJyYXksCmluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk/aW5kZXhlcy5sZW5ndGg6MCxsYXN0SW5kZXg9bGVuZ3RoLTE7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07aWYobGVuZ3RoPT1sYXN0SW5kZXh8fGluZGV4IT09cHJldmlvdXMpe3ZhciBwcmV2aW91cz1pbmRleDtpZihpc0luZGV4KGluZGV4KSlzcGxpY2UuY2FsbChhcnJheSxpbmRleCwxKTtlbHNlIGJhc2VVbnNldChhcnJheSxpbmRleCl9fXJldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKXtyZXR1cm4gbG93ZXIrbmF0aXZlRmxvb3IobmF0aXZlUmFuZG9tKCkqKHVwcGVyLWxvd2VyKzEpKX1mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQtc3RhcnQpLyhzdGVwfHwxKSksMCkscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUobGVuZ3RoLS0pe3Jlc3VsdFtmcm9tUmlnaHQ/Cmxlbmd0aDorK2luZGV4XT1zdGFydDtzdGFydCs9c3RlcH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VSZXBlYXQoc3RyaW5nLG4pe3ZhciByZXN1bHQ9IiI7aWYoIXN0cmluZ3x8bjwxfHxuPk1BWF9TQUZFX0lOVEVHRVIpcmV0dXJuIHJlc3VsdDtkb3tpZihuJTIpcmVzdWx0Kz1zdHJpbmc7bj1uYXRpdmVGbG9vcihuLzIpO2lmKG4pc3RyaW5nKz1zdHJpbmd9d2hpbGUobik7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUmVzdChmdW5jLHN0YXJ0KXtyZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYyxzdGFydCxpZGVudGl0eSksZnVuYysiIil9ZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKXtyZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4pe3ZhciBhcnJheT12YWx1ZXMoY29sbGVjdGlvbik7cmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9CmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIG9iamVjdDtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLGxhc3RJbmRleD1sZW5ndGgtMSxuZXN0ZWQ9b2JqZWN0O3doaWxlKG5lc3RlZCE9bnVsbCYmKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9dG9LZXkocGF0aFtpbmRleF0pLG5ld1ZhbHVlPXZhbHVlO2lmKGluZGV4IT1sYXN0SW5kZXgpe3ZhciBvYmpWYWx1ZT1uZXN0ZWRba2V5XTtuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqVmFsdWUsa2V5LG5lc3RlZCk6dW5kZWZpbmVkO2lmKG5ld1ZhbHVlPT09dW5kZWZpbmVkKW5ld1ZhbHVlPWlzT2JqZWN0KG9ialZhbHVlKT9vYmpWYWx1ZTppc0luZGV4KHBhdGhbaW5kZXgrMV0pP1tdOnt9fWFzc2lnblZhbHVlKG5lc3RlZCxrZXksbmV3VmFsdWUpO25lc3RlZD1uZXN0ZWRba2V5XX1yZXR1cm4gb2JqZWN0fQp2YXIgYmFzZVNldERhdGE9IW1ldGFNYXA/aWRlbnRpdHk6ZnVuY3Rpb24oZnVuYyxkYXRhKXttZXRhTWFwLnNldChmdW5jLGRhdGEpO3JldHVybiBmdW5jfTt2YXIgYmFzZVNldFRvU3RyaW5nPSFkZWZpbmVQcm9wZXJ0eT9pZGVudGl0eTpmdW5jdGlvbihmdW5jLHN0cmluZyl7cmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsInRvU3RyaW5nIix7ImNvbmZpZ3VyYWJsZSI6dHJ1ZSwiZW51bWVyYWJsZSI6ZmFsc2UsInZhbHVlIjpjb25zdGFudChzdHJpbmcpLCJ3cml0YWJsZSI6dHJ1ZX0pfTtmdW5jdGlvbiBiYXNlU2h1ZmZsZShjb2xsZWN0aW9uKXtyZXR1cm4gc2h1ZmZsZVNlbGYodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksc3RhcnQsZW5kKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtpZihzdGFydDwwKXN0YXJ0PS1zdGFydD5sZW5ndGg/MDpsZW5ndGgrc3RhcnQ7ZW5kPWVuZD5sZW5ndGg/bGVuZ3RoOmVuZDtpZihlbmQ8MCllbmQrPQpsZW5ndGg7bGVuZ3RoPXN0YXJ0PmVuZD8wOmVuZC1zdGFydD4+PjA7c3RhcnQ+Pj49MDt2YXIgcmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1hcnJheVtpbmRleCtzdGFydF07cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLHByZWRpY2F0ZSl7dmFyIHJlc3VsdDtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe3Jlc3VsdD1wcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIXJlc3VsdH0pO3JldHVybiEhcmVzdWx0fWZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSxyZXRIaWdoZXN0KXt2YXIgbG93PTAsaGlnaD1hcnJheT09bnVsbD9sb3c6YXJyYXkubGVuZ3RoO2lmKHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPT09dmFsdWUmJmhpZ2g8PUhBTEZfTUFYX0FSUkFZX0xFTkdUSCl7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9CmxvdytoaWdoPj4+MSxjb21wdXRlZD1hcnJheVttaWRdO2lmKGNvbXB1dGVkIT09bnVsbCYmIWlzU3ltYm9sKGNvbXB1dGVkKSYmKHJldEhpZ2hlc3Q/Y29tcHV0ZWQ8PXZhbHVlOmNvbXB1dGVkPHZhbHVlKSlsb3c9bWlkKzE7ZWxzZSBoaWdoPW1pZH1yZXR1cm4gaGlnaH1yZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaWRlbnRpdHkscmV0SGlnaGVzdCl9ZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUscmV0SGlnaGVzdCl7dmFsdWU9aXRlcmF0ZWUodmFsdWUpO3ZhciBsb3c9MCxoaWdoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHZhbElzTmFOPXZhbHVlIT09dmFsdWUsdmFsSXNOdWxsPXZhbHVlPT09bnVsbCx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSksdmFsSXNVbmRlZmluZWQ9dmFsdWU9PT11bmRlZmluZWQ7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9bmF0aXZlRmxvb3IoKGxvdytoaWdoKS8yKSxjb21wdXRlZD0KaXRlcmF0ZWUoYXJyYXlbbWlkXSksb3RoSXNEZWZpbmVkPWNvbXB1dGVkIT09dW5kZWZpbmVkLG90aElzTnVsbD1jb21wdXRlZD09PW51bGwsb3RoSXNSZWZsZXhpdmU9Y29tcHV0ZWQ9PT1jb21wdXRlZCxvdGhJc1N5bWJvbD1pc1N5bWJvbChjb21wdXRlZCk7aWYodmFsSXNOYU4pdmFyIHNldExvdz1yZXRIaWdoZXN0fHxvdGhJc1JlZmxleGl2ZTtlbHNlIGlmKHZhbElzVW5kZWZpbmVkKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmKHJldEhpZ2hlc3R8fG90aElzRGVmaW5lZCk7ZWxzZSBpZih2YWxJc051bGwpc2V0TG93PW90aElzUmVmbGV4aXZlJiZvdGhJc0RlZmluZWQmJihyZXRIaWdoZXN0fHwhb3RoSXNOdWxsKTtlbHNlIGlmKHZhbElzU3ltYm9sKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmb3RoSXNEZWZpbmVkJiYhb3RoSXNOdWxsJiYocmV0SGlnaGVzdHx8IW90aElzU3ltYm9sKTtlbHNlIGlmKG90aElzTnVsbHx8b3RoSXNTeW1ib2wpc2V0TG93PWZhbHNlO2Vsc2Ugc2V0TG93PQpyZXRIaWdoZXN0P2NvbXB1dGVkPD12YWx1ZTpjb21wdXRlZDx2YWx1ZTtpZihzZXRMb3cpbG93PW1pZCsxO2Vsc2UgaGlnaD1taWR9cmV0dXJuIG5hdGl2ZU1pbihoaWdoLE1BWF9BUlJBWV9JTkRFWCl9ZnVuY3Rpb24gYmFzZVNvcnRlZFVuaXEoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTtpZighaW5kZXh8fCFlcShjb21wdXRlZCxzZWVuKSl7dmFyIHNlZW49Y29tcHV0ZWQ7cmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlPT09MD8wOnZhbHVlfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VUb051bWJlcih2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ibnVtYmVyIilyZXR1cm4gdmFsdWU7aWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47cmV0dXJuK3ZhbHVlfQpmdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyIpcmV0dXJuIHZhbHVlO2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBhcnJheU1hcCh2YWx1ZSxiYXNlVG9TdHJpbmcpKyIiO2lmKGlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gc3ltYm9sVG9TdHJpbmc/c3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSk6IiI7dmFyIHJlc3VsdD12YWx1ZSsiIjtyZXR1cm4gcmVzdWx0PT0iMCImJjEvdmFsdWU9PS1JTkZJTklUWT8iLTAiOnJlc3VsdH1mdW5jdGlvbiBiYXNlVW5pcShhcnJheSxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsaW5jbHVkZXM9YXJyYXlJbmNsdWRlcyxsZW5ndGg9YXJyYXkubGVuZ3RoLGlzQ29tbW9uPXRydWUscmVzdWx0PVtdLHNlZW49cmVzdWx0O2lmKGNvbXBhcmF0b3Ipe2lzQ29tbW9uPWZhbHNlO2luY2x1ZGVzPWFycmF5SW5jbHVkZXNXaXRofWVsc2UgaWYobGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXt2YXIgc2V0PQppdGVyYXRlZT9udWxsOmNyZWF0ZVNldChhcnJheSk7aWYoc2V0KXJldHVybiBzZXRUb0FycmF5KHNldCk7aXNDb21tb249ZmFsc2U7aW5jbHVkZXM9Y2FjaGVIYXM7c2Vlbj1uZXcgU2V0Q2FjaGV9ZWxzZSBzZWVuPWl0ZXJhdGVlP1tdOnJlc3VsdDtvdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7dmFsdWU9Y29tcGFyYXRvcnx8dmFsdWUhPT0wP3ZhbHVlOjA7aWYoaXNDb21tb24mJmNvbXB1dGVkPT09Y29tcHV0ZWQpe3ZhciBzZWVuSW5kZXg9c2Vlbi5sZW5ndGg7d2hpbGUoc2VlbkluZGV4LS0paWYoc2VlbltzZWVuSW5kZXhdPT09Y29tcHV0ZWQpY29udGludWUgb3V0ZXI7aWYoaXRlcmF0ZWUpc2Vlbi5wdXNoKGNvbXB1dGVkKTtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXMoc2Vlbixjb21wdXRlZCxjb21wYXJhdG9yKSl7aWYoc2VlbiE9PXJlc3VsdClzZWVuLnB1c2goY29tcHV0ZWQpOwpyZXN1bHQucHVzaCh2YWx1ZSl9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTtvYmplY3Q9cGFyZW50KG9iamVjdCxwYXRoKTtyZXR1cm4gb2JqZWN0PT1udWxsfHxkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXX1mdW5jdGlvbiBiYXNlVXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIsY3VzdG9taXplcil7cmV0dXJuIGJhc2VTZXQob2JqZWN0LHBhdGgsdXBkYXRlcihiYXNlR2V0KG9iamVjdCxwYXRoKSksY3VzdG9taXplcil9ZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LHByZWRpY2F0ZSxpc0Ryb3AsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tUmlnaHQ/bGVuZ3RoOi0xO3doaWxlKChmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aCkmJnByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKTtyZXR1cm4gaXNEcm9wP2Jhc2VTbGljZShhcnJheSwKZnJvbVJpZ2h0PzA6aW5kZXgsZnJvbVJpZ2h0P2luZGV4KzE6bGVuZ3RoKTpiYXNlU2xpY2UoYXJyYXksZnJvbVJpZ2h0P2luZGV4KzE6MCxmcm9tUmlnaHQ/bGVuZ3RoOmluZGV4KX1mdW5jdGlvbiBiYXNlV3JhcHBlclZhbHVlKHZhbHVlLGFjdGlvbnMpe3ZhciByZXN1bHQ9dmFsdWU7aWYocmVzdWx0IGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpcmVzdWx0PXJlc3VsdC52YWx1ZSgpO3JldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLGZ1bmN0aW9uKHJlc3VsdCxhY3Rpb24pe3JldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZyxhcnJheVB1c2goW3Jlc3VsdF0sYWN0aW9uLmFyZ3MpKX0scmVzdWx0KX1mdW5jdGlvbiBiYXNlWG9yKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgbGVuZ3RoPWFycmF5cy5sZW5ndGg7aWYobGVuZ3RoPDIpcmV0dXJuIGxlbmd0aD9iYXNlVW5pcShhcnJheXNbMF0pOltdO3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobGVuZ3RoKTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBhcnJheT1hcnJheXNbaW5kZXhdLG90aEluZGV4PS0xO3doaWxlKCsrb3RoSW5kZXg8bGVuZ3RoKWlmKG90aEluZGV4IT1pbmRleClyZXN1bHRbaW5kZXhdPWJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF18fGFycmF5LGFycmF5c1tvdGhJbmRleF0saXRlcmF0ZWUsY29tcGFyYXRvcil9cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwxKSxpdGVyYXRlZSxjb21wYXJhdG9yKX1mdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLHZhbHVlcyxhc3NpZ25GdW5jKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXByb3BzLmxlbmd0aCx2YWxzTGVuZ3RoPXZhbHVlcy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9aW5kZXg8dmFsc0xlbmd0aD92YWx1ZXNbaW5kZXhdOnVuZGVmaW5lZDthc3NpZ25GdW5jKHJlc3VsdCxwcm9wc1tpbmRleF0sdmFsdWUpfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY2FzdEFycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKT8KdmFsdWU6W119ZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0iZnVuY3Rpb24iP3ZhbHVlOmlkZW50aXR5fWZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLG9iamVjdCl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIHZhbHVlO3JldHVybiBpc0tleSh2YWx1ZSxvYmplY3QpP1t2YWx1ZV06c3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSl9dmFyIGNhc3RSZXN0PWJhc2VSZXN0O2Z1bmN0aW9uIGNhc3RTbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO2VuZD1lbmQ9PT11bmRlZmluZWQ/bGVuZ3RoOmVuZDtyZXR1cm4hc3RhcnQmJmVuZD49bGVuZ3RoP2FycmF5OmJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfXZhciBjbGVhclRpbWVvdXQ9Y3R4Q2xlYXJUaW1lb3V0fHxmdW5jdGlvbihpZCl7cmV0dXJuIHJvb3QuY2xlYXJUaW1lb3V0KGlkKX07ZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLGlzRGVlcCl7aWYoaXNEZWVwKXJldHVybiBidWZmZXIuc2xpY2UoKTsKdmFyIGxlbmd0aD1idWZmZXIubGVuZ3RoLHJlc3VsdD1hbGxvY1Vuc2FmZT9hbGxvY1Vuc2FmZShsZW5ndGgpOm5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtidWZmZXIuY29weShyZXN1bHQpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcil7dmFyIHJlc3VsdD1uZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7KG5ldyBVaW50OEFycmF5KHJlc3VsdCkpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldyxpc0RlZXApe3ZhciBidWZmZXI9aXNEZWVwP2Nsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKTpkYXRhVmlldy5idWZmZXI7cmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsZGF0YVZpZXcuYnl0ZU9mZnNldCxkYXRhVmlldy5ieXRlTGVuZ3RoKX1mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApe3ZhciByZXN1bHQ9Cm5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSxyZUZsYWdzLmV4ZWMocmVnZXhwKSk7cmVzdWx0Lmxhc3RJbmRleD1yZWdleHAubGFzdEluZGV4O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKXtyZXR1cm4gc3ltYm9sVmFsdWVPZj9PYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpOnt9fWZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LGlzRGVlcCl7dmFyIGJ1ZmZlcj1pc0RlZXA/Y2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcik6dHlwZWRBcnJheS5idWZmZXI7cmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlcix0eXBlZEFycmF5LmJ5dGVPZmZzZXQsdHlwZWRBcnJheS5sZW5ndGgpfWZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsb3RoZXIpe2lmKHZhbHVlIT09b3RoZXIpe3ZhciB2YWxJc0RlZmluZWQ9dmFsdWUhPT11bmRlZmluZWQsdmFsSXNOdWxsPXZhbHVlPT09Cm51bGwsdmFsSXNSZWZsZXhpdmU9dmFsdWU9PT12YWx1ZSx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSk7dmFyIG90aElzRGVmaW5lZD1vdGhlciE9PXVuZGVmaW5lZCxvdGhJc051bGw9b3RoZXI9PT1udWxsLG90aElzUmVmbGV4aXZlPW90aGVyPT09b3RoZXIsb3RoSXNTeW1ib2w9aXNTeW1ib2wob3RoZXIpO2lmKCFvdGhJc051bGwmJiFvdGhJc1N5bWJvbCYmIXZhbElzU3ltYm9sJiZ2YWx1ZT5vdGhlcnx8dmFsSXNTeW1ib2wmJm90aElzRGVmaW5lZCYmb3RoSXNSZWZsZXhpdmUmJiFvdGhJc051bGwmJiFvdGhJc1N5bWJvbHx8dmFsSXNOdWxsJiZvdGhJc0RlZmluZWQmJm90aElzUmVmbGV4aXZlfHwhdmFsSXNEZWZpbmVkJiZvdGhJc1JlZmxleGl2ZXx8IXZhbElzUmVmbGV4aXZlKXJldHVybiAxO2lmKCF2YWxJc051bGwmJiF2YWxJc1N5bWJvbCYmIW90aElzU3ltYm9sJiZ2YWx1ZTxvdGhlcnx8b3RoSXNTeW1ib2wmJnZhbElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmUmJiF2YWxJc051bGwmJgohdmFsSXNTeW1ib2x8fG90aElzTnVsbCYmdmFsSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZXx8IW90aElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmV8fCFvdGhJc1JlZmxleGl2ZSlyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LG90aGVyLG9yZGVycyl7dmFyIGluZGV4PS0xLG9iakNyaXRlcmlhPW9iamVjdC5jcml0ZXJpYSxvdGhDcml0ZXJpYT1vdGhlci5jcml0ZXJpYSxsZW5ndGg9b2JqQ3JpdGVyaWEubGVuZ3RoLG9yZGVyc0xlbmd0aD1vcmRlcnMubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcmVzdWx0PWNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLG90aENyaXRlcmlhW2luZGV4XSk7aWYocmVzdWx0KXtpZihpbmRleD49b3JkZXJzTGVuZ3RoKXJldHVybiByZXN1bHQ7dmFyIG9yZGVyPW9yZGVyc1tpbmRleF07cmV0dXJuIHJlc3VsdCoob3JkZXI9PSJkZXNjIj8tMToxKX19cmV0dXJuIG9iamVjdC5pbmRleC0Kb3RoZXIuaW5kZXh9ZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPWFyZ3MubGVuZ3RoLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgsbGVmdEluZGV4PS0xLGxlZnRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLHJhbmdlTGVuZ3RoPW5hdGl2ZU1heChhcmdzTGVuZ3RoLWhvbGRlcnNMZW5ndGgsMCkscmVzdWx0PUFycmF5KGxlZnRMZW5ndGgrcmFuZ2VMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKytsZWZ0SW5kZXg8bGVmdExlbmd0aClyZXN1bHRbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKCsrYXJnc0luZGV4PGhvbGRlcnNMZW5ndGgpaWYoaXNVbmN1cnJpZWR8fGFyZ3NJbmRleDxhcmdzTGVuZ3RoKXJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dPWFyZ3NbYXJnc0luZGV4XTt3aGlsZShyYW5nZUxlbmd0aC0tKXJlc3VsdFtsZWZ0SW5kZXgrK109CmFyZ3NbYXJnc0luZGV4KytdO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLHBhcnRpYWxzLGhvbGRlcnMsaXNDdXJyaWVkKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9YXJncy5sZW5ndGgsaG9sZGVyc0luZGV4PS0xLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgscmlnaHRJbmRleD0tMSxyaWdodExlbmd0aD1wYXJ0aWFscy5sZW5ndGgscmFuZ2VMZW5ndGg9bmF0aXZlTWF4KGFyZ3NMZW5ndGgtaG9sZGVyc0xlbmd0aCwwKSxyZXN1bHQ9QXJyYXkocmFuZ2VMZW5ndGgrcmlnaHRMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKythcmdzSW5kZXg8cmFuZ2VMZW5ndGgpcmVzdWx0W2FyZ3NJbmRleF09YXJnc1thcmdzSW5kZXhdO3ZhciBvZmZzZXQ9YXJnc0luZGV4O3doaWxlKCsrcmlnaHRJbmRleDxyaWdodExlbmd0aClyZXN1bHRbb2Zmc2V0K3JpZ2h0SW5kZXhdPXBhcnRpYWxzW3JpZ2h0SW5kZXhdO3doaWxlKCsraG9sZGVyc0luZGV4PApob2xkZXJzTGVuZ3RoKWlmKGlzVW5jdXJyaWVkfHxhcmdzSW5kZXg8YXJnc0xlbmd0aClyZXN1bHRbb2Zmc2V0K2hvbGRlcnNbaG9sZGVyc0luZGV4XV09YXJnc1thcmdzSW5kZXgrK107cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXNvdXJjZS5sZW5ndGg7YXJyYXl8fChhcnJheT1BcnJheShsZW5ndGgpKTt3aGlsZSgrK2luZGV4PGxlbmd0aClhcnJheVtpbmRleF09c291cmNlW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UscHJvcHMsb2JqZWN0LGN1c3RvbWl6ZXIpe3ZhciBpc05ldz0hb2JqZWN0O29iamVjdHx8KG9iamVjdD17fSk7dmFyIGluZGV4PS0xLGxlbmd0aD1wcm9wcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9cHJvcHNbaW5kZXhdO3ZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqZWN0W2tleV0sc291cmNlW2tleV0sCmtleSxvYmplY3Qsc291cmNlKTp1bmRlZmluZWQ7aWYobmV3VmFsdWU9PT11bmRlZmluZWQpbmV3VmFsdWU9c291cmNlW2tleV07aWYoaXNOZXcpYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpO2Vsc2UgYXNzaWduVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSl9cmV0dXJuIG9iamVjdH1mdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9scyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9sc0luKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcixpbml0aWFsaXplcil7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlBZ2dyZWdhdG9yOmJhc2VBZ2dyZWdhdG9yLGFjY3VtdWxhdG9yPQppbml0aWFsaXplcj9pbml0aWFsaXplcigpOnt9O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sc2V0dGVyLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLGFjY3VtdWxhdG9yKX19ZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpe3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3Qsc291cmNlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1zb3VyY2VzLmxlbmd0aCxjdXN0b21pemVyPWxlbmd0aD4xP3NvdXJjZXNbbGVuZ3RoLTFdOnVuZGVmaW5lZCxndWFyZD1sZW5ndGg+Mj9zb3VyY2VzWzJdOnVuZGVmaW5lZDtjdXN0b21pemVyPWFzc2lnbmVyLmxlbmd0aD4zJiZ0eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj8obGVuZ3RoLS0sY3VzdG9taXplcik6dW5kZWZpbmVkO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLHNvdXJjZXNbMV0sZ3VhcmQpKXtjdXN0b21pemVyPWxlbmd0aDwzP3VuZGVmaW5lZDpjdXN0b21pemVyO2xlbmd0aD0xfW9iamVjdD1PYmplY3Qob2JqZWN0KTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBzb3VyY2U9c291cmNlc1tpbmRleF07aWYoc291cmNlKWFzc2lnbmVyKG9iamVjdCxzb3VyY2UsaW5kZXgsY3VzdG9taXplcil9cmV0dXJuIG9iamVjdH0pfWZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuIGNvbGxlY3Rpb247aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLGl0ZXJhdGVlKTt2YXIgbGVuZ3RoPWNvbGxlY3Rpb24ubGVuZ3RoLGluZGV4PWZyb21SaWdodD9sZW5ndGg6LTEsaXRlcmFibGU9T2JqZWN0KGNvbGxlY3Rpb24pO3doaWxlKGZyb21SaWdodD9pbmRleC0tOisraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSxpbmRleCxpdGVyYWJsZSk9PT1mYWxzZSlicmVhaztyZXR1cm4gY29sbGVjdGlvbn19ZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpe3JldHVybiBmdW5jdGlvbihvYmplY3QsCml0ZXJhdGVlLGtleXNGdW5jKXt2YXIgaW5kZXg9LTEsaXRlcmFibGU9T2JqZWN0KG9iamVjdCkscHJvcHM9a2V5c0Z1bmMob2JqZWN0KSxsZW5ndGg9cHJvcHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXt2YXIga2V5PXByb3BzW2Zyb21SaWdodD9sZW5ndGg6KytpbmRleF07aWYoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpPT09ZmFsc2UpYnJlYWt9cmV0dXJuIG9iamVjdH19ZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLGJpdG1hc2ssdGhpc0FyZyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGZuPXRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcj9DdG9yOmZ1bmM7cmV0dXJuIGZuLmFwcGx5KGlzQmluZD90aGlzQXJnOnRoaXMsYXJndW1lbnRzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7c3RyaW5nPQp0b1N0cmluZyhzdHJpbmcpO3ZhciBzdHJTeW1ib2xzPWhhc1VuaWNvZGUoc3RyaW5nKT9zdHJpbmdUb0FycmF5KHN0cmluZyk6dW5kZWZpbmVkO3ZhciBjaHI9c3RyU3ltYm9scz9zdHJTeW1ib2xzWzBdOnN0cmluZy5jaGFyQXQoMCk7dmFyIHRyYWlsaW5nPXN0clN5bWJvbHM/Y2FzdFNsaWNlKHN0clN5bWJvbHMsMSkuam9pbigiIik6c3RyaW5nLnNsaWNlKDEpO3JldHVybiBjaHJbbWV0aG9kTmFtZV0oKSt0cmFpbGluZ319ZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjayl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCIiKSksY2FsbGJhY2ssIiIpfX1mdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3Ipe3JldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cztzd2l0Y2goYXJncy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IEN0b3I7Y2FzZSAxOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTsKY2FzZSAyOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7Y2FzZSA1OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pO2Nhc2UgNjpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pO2Nhc2UgNzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSl9dmFyIHRoaXNCaW5kaW5nPWJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLHJlc3VsdD1DdG9yLmFwcGx5KHRoaXNCaW5kaW5nLGFyZ3MpO3JldHVybiBpc09iamVjdChyZXN1bHQpP3Jlc3VsdDp0aGlzQmluZGluZ319ZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywKYml0bWFzayxhcml0eSl7dmFyIEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVuZ3RoKSxpbmRleD1sZW5ndGgscGxhY2Vob2xkZXI9Z2V0SG9sZGVyKHdyYXBwZXIpO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTt2YXIgaG9sZGVycz1sZW5ndGg8MyYmYXJnc1swXSE9PXBsYWNlaG9sZGVyJiZhcmdzW2xlbmd0aC0xXSE9PXBsYWNlaG9sZGVyP1tdOnJlcGxhY2VIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpO2xlbmd0aC09aG9sZGVycy5sZW5ndGg7aWYobGVuZ3RoPGFyaXR5KXJldHVybiBjcmVhdGVSZWN1cnJ5KGZ1bmMsYml0bWFzayxjcmVhdGVIeWJyaWQsd3JhcHBlci5wbGFjZWhvbGRlcix1bmRlZmluZWQsYXJncyxob2xkZXJzLHVuZGVmaW5lZCx1bmRlZmluZWQsYXJpdHktbGVuZ3RoKTt2YXIgZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZgp3cmFwcGVyP0N0b3I6ZnVuYztyZXR1cm4gYXBwbHkoZm4sdGhpcyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpe3JldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBpdGVyYWJsZT1PYmplY3QoY29sbGVjdGlvbik7aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXt2YXIgaXRlcmF0ZWU9Z2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpO2NvbGxlY3Rpb249a2V5cyhjb2xsZWN0aW9uKTtwcmVkaWNhdGU9ZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpfX12YXIgaW5kZXg9ZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpO3JldHVybiBpbmRleD4tMT9pdGVyYWJsZVtpdGVyYXRlZT9jb2xsZWN0aW9uW2luZGV4XTppbmRleF06dW5kZWZpbmVkfX1mdW5jdGlvbiBjcmVhdGVGbG93KGZyb21SaWdodCl7cmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmNzKXt2YXIgbGVuZ3RoPQpmdW5jcy5sZW5ndGgsaW5kZXg9bGVuZ3RoLHByZXJlcT1Mb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O2lmKGZyb21SaWdodClmdW5jcy5yZXZlcnNlKCk7d2hpbGUoaW5kZXgtLSl7dmFyIGZ1bmM9ZnVuY3NbaW5kZXhdO2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtpZihwcmVyZXEmJiF3cmFwcGVyJiZnZXRGdW5jTmFtZShmdW5jKT09IndyYXBwZXIiKXZhciB3cmFwcGVyPW5ldyBMb2Rhc2hXcmFwcGVyKFtdLHRydWUpfWluZGV4PXdyYXBwZXI/aW5kZXg6bGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtmdW5jPWZ1bmNzW2luZGV4XTt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksZGF0YT1mdW5jTmFtZT09IndyYXBwZXIiP2dldERhdGEoZnVuYyk6dW5kZWZpbmVkO2lmKGRhdGEmJmlzTGF6aWFibGUoZGF0YVswXSkmJmRhdGFbMV09PShXUkFQX0FSWV9GTEFHfFdSQVBfQ1VSUllfRkxBR3xXUkFQX1BBUlRJQUxfRkxBR3wKV1JBUF9SRUFSR19GTEFHKSYmIWRhdGFbNF0ubGVuZ3RoJiZkYXRhWzldPT0xKXdyYXBwZXI9d3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlcixkYXRhWzNdKTtlbHNlIHdyYXBwZXI9ZnVuYy5sZW5ndGg9PTEmJmlzTGF6aWFibGUoZnVuYyk/d3JhcHBlcltmdW5jTmFtZV0oKTp3cmFwcGVyLnRocnUoZnVuYyl9cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHZhbHVlPWFyZ3NbMF07aWYod3JhcHBlciYmYXJncy5sZW5ndGg9PTEmJmlzQXJyYXkodmFsdWUpKXJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO3ZhciBpbmRleD0wLHJlc3VsdD1sZW5ndGg/ZnVuY3NbaW5kZXhdLmFwcGx5KHRoaXMsYXJncyk6dmFsdWU7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0PWZ1bmNzW2luZGV4XS5jYWxsKHRoaXMscmVzdWx0KTtyZXR1cm4gcmVzdWx0fX0pfWZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLGJpdG1hc2ssdGhpc0FyZywKcGFydGlhbHMsaG9sZGVycyxwYXJ0aWFsc1JpZ2h0LGhvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNBcnk9Yml0bWFzayZXUkFQX0FSWV9GTEFHLGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRyxpc0N1cnJpZWQ9Yml0bWFzayYoV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRyksaXNGbGlwPWJpdG1hc2smV1JBUF9GTElQX0ZMQUcsQ3Rvcj1pc0JpbmRLZXk/dW5kZWZpbmVkOmNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBsZW5ndGg9YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KGxlbmd0aCksaW5kZXg9bGVuZ3RoO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTtpZihpc0N1cnJpZWQpdmFyIHBsYWNlaG9sZGVyPWdldEhvbGRlcih3cmFwcGVyKSxob2xkZXJzQ291bnQ9Y291bnRIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpOwppZihwYXJ0aWFscylhcmdzPWNvbXBvc2VBcmdzKGFyZ3MscGFydGlhbHMsaG9sZGVycyxpc0N1cnJpZWQpO2lmKHBhcnRpYWxzUmlnaHQpYXJncz1jb21wb3NlQXJnc1JpZ2h0KGFyZ3MscGFydGlhbHNSaWdodCxob2xkZXJzUmlnaHQsaXNDdXJyaWVkKTtsZW5ndGgtPWhvbGRlcnNDb3VudDtpZihpc0N1cnJpZWQmJmxlbmd0aDxhcml0eSl7dmFyIG5ld0hvbGRlcnM9cmVwbGFjZUhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7cmV0dXJuIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLGNyZWF0ZUh5YnJpZCx3cmFwcGVyLnBsYWNlaG9sZGVyLHRoaXNBcmcsYXJncyxuZXdIb2xkZXJzLGFyZ1BvcyxhcnksYXJpdHktbGVuZ3RoKX12YXIgdGhpc0JpbmRpbmc9aXNCaW5kP3RoaXNBcmc6dGhpcyxmbj1pc0JpbmRLZXk/dGhpc0JpbmRpbmdbZnVuY106ZnVuYztsZW5ndGg9YXJncy5sZW5ndGg7aWYoYXJnUG9zKWFyZ3M9cmVvcmRlcihhcmdzLGFyZ1Bvcyk7ZWxzZSBpZihpc0ZsaXAmJmxlbmd0aD4KMSlhcmdzLnJldmVyc2UoKTtpZihpc0FyeSYmYXJ5PGxlbmd0aClhcmdzLmxlbmd0aD1hcnk7aWYodGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKWZuPUN0b3J8fGNyZWF0ZUN0b3IoZm4pO3JldHVybiBmbi5hcHBseSh0aGlzQmluZGluZyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsdG9JdGVyYXRlZSl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLHt9KX19ZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvcixkZWZhdWx0VmFsdWUpe3JldHVybiBmdW5jdGlvbih2YWx1ZSxvdGhlcil7dmFyIHJlc3VsdDtpZih2YWx1ZT09PXVuZGVmaW5lZCYmb3RoZXI9PT11bmRlZmluZWQpcmV0dXJuIGRlZmF1bHRWYWx1ZTtpZih2YWx1ZSE9PXVuZGVmaW5lZClyZXN1bHQ9dmFsdWU7aWYob3RoZXIhPT0KdW5kZWZpbmVkKXtpZihyZXN1bHQ9PT11bmRlZmluZWQpcmV0dXJuIG90aGVyO2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyJ8fHR5cGVvZiBvdGhlcj09InN0cmluZyIpe3ZhbHVlPWJhc2VUb1N0cmluZyh2YWx1ZSk7b3RoZXI9YmFzZVRvU3RyaW5nKG90aGVyKX1lbHNle3ZhbHVlPWJhc2VUb051bWJlcih2YWx1ZSk7b3RoZXI9YmFzZVRvTnVtYmVyKG90aGVyKX1yZXN1bHQ9b3BlcmF0b3IodmFsdWUsb3RoZXIpfXJldHVybiByZXN1bHR9fWZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKXtyZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKXtpdGVyYXRlZXM9YXJyYXlNYXAoaXRlcmF0ZWVzLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciB0aGlzQXJnPXRoaXM7cmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsZnVuY3Rpb24oaXRlcmF0ZWUpe3JldHVybiBhcHBseShpdGVyYXRlZSx0aGlzQXJnLGFyZ3MpfSl9KX0pfQpmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCxjaGFycyl7Y2hhcnM9Y2hhcnM9PT11bmRlZmluZWQ/IiAiOmJhc2VUb1N0cmluZyhjaGFycyk7dmFyIGNoYXJzTGVuZ3RoPWNoYXJzLmxlbmd0aDtpZihjaGFyc0xlbmd0aDwyKXJldHVybiBjaGFyc0xlbmd0aD9iYXNlUmVwZWF0KGNoYXJzLGxlbmd0aCk6Y2hhcnM7dmFyIHJlc3VsdD1iYXNlUmVwZWF0KGNoYXJzLG5hdGl2ZUNlaWwobGVuZ3RoL3N0cmluZ1NpemUoY2hhcnMpKSk7cmV0dXJuIGhhc1VuaWNvZGUoY2hhcnMpP2Nhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksMCxsZW5ndGgpLmpvaW4oIiIpOnJlc3VsdC5zbGljZSgwLGxlbmd0aCl9ZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPQphcmd1bWVudHMubGVuZ3RoLGxlZnRJbmRleD0tMSxsZWZ0TGVuZ3RoPXBhcnRpYWxzLmxlbmd0aCxhcmdzPUFycmF5KGxlZnRMZW5ndGgrYXJnc0xlbmd0aCksZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyP0N0b3I6ZnVuYzt3aGlsZSgrK2xlZnRJbmRleDxsZWZ0TGVuZ3RoKWFyZ3NbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKGFyZ3NMZW5ndGgtLSlhcmdzW2xlZnRJbmRleCsrXT1hcmd1bWVudHNbKythcmdzSW5kZXhdO3JldHVybiBhcHBseShmbixpc0JpbmQ/dGhpc0FyZzp0aGlzLGFyZ3MpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LGVuZCxzdGVwKXtpZihzdGVwJiZ0eXBlb2Ygc3RlcCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0YXJ0LGVuZCxzdGVwKSllbmQ9c3RlcD11bmRlZmluZWQ7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PQp1bmRlZmluZWQpe2VuZD1zdGFydDtzdGFydD0wfWVsc2UgZW5kPXRvRmluaXRlKGVuZCk7c3RlcD1zdGVwPT09dW5kZWZpbmVkP3N0YXJ0PGVuZD8xOi0xOnRvRmluaXRlKHN0ZXApO3JldHVybiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KX19ZnVuY3Rpb24gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihvcGVyYXRvcil7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtpZighKHR5cGVvZiB2YWx1ZT09InN0cmluZyImJnR5cGVvZiBvdGhlcj09InN0cmluZyIpKXt2YWx1ZT10b051bWJlcih2YWx1ZSk7b3RoZXI9dG9OdW1iZXIob3RoZXIpfXJldHVybiBvcGVyYXRvcih2YWx1ZSxvdGhlcil9fWZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLHdyYXBGdW5jLHBsYWNlaG9sZGVyLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNDdXJyeT1iaXRtYXNrJldSQVBfQ1VSUllfRkxBRyxuZXdIb2xkZXJzPWlzQ3Vycnk/CmhvbGRlcnM6dW5kZWZpbmVkLG5ld0hvbGRlcnNSaWdodD1pc0N1cnJ5P3VuZGVmaW5lZDpob2xkZXJzLG5ld1BhcnRpYWxzPWlzQ3Vycnk/cGFydGlhbHM6dW5kZWZpbmVkLG5ld1BhcnRpYWxzUmlnaHQ9aXNDdXJyeT91bmRlZmluZWQ6cGFydGlhbHM7Yml0bWFza3w9aXNDdXJyeT9XUkFQX1BBUlRJQUxfRkxBRzpXUkFQX1BBUlRJQUxfUklHSFRfRkxBRztiaXRtYXNrJj1+KGlzQ3Vycnk/V1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUc6V1JBUF9QQVJUSUFMX0ZMQUcpO2lmKCEoYml0bWFzayZXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKWJpdG1hc2smPX4oV1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHKTt2YXIgbmV3RGF0YT1bZnVuYyxiaXRtYXNrLHRoaXNBcmcsbmV3UGFydGlhbHMsbmV3SG9sZGVycyxuZXdQYXJ0aWFsc1JpZ2h0LG5ld0hvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5XTt2YXIgcmVzdWx0PXdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCxuZXdEYXRhKTtpZihpc0xhemlhYmxlKGZ1bmMpKXNldERhdGEocmVzdWx0LApuZXdEYXRhKTtyZXN1bHQucGxhY2Vob2xkZXI9cGxhY2Vob2xkZXI7cmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsZnVuYyxiaXRtYXNrKX1mdW5jdGlvbiBjcmVhdGVSb3VuZChtZXRob2ROYW1lKXt2YXIgZnVuYz1NYXRoW21ldGhvZE5hbWVdO3JldHVybiBmdW5jdGlvbihudW1iZXIscHJlY2lzaW9uKXtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtwcmVjaXNpb249cHJlY2lzaW9uPT1udWxsPzA6bmF0aXZlTWluKHRvSW50ZWdlcihwcmVjaXNpb24pLDI5Mik7aWYocHJlY2lzaW9uKXt2YXIgcGFpcj0odG9TdHJpbmcobnVtYmVyKSsiZSIpLnNwbGl0KCJlIiksdmFsdWU9ZnVuYyhwYWlyWzBdKyJlIisoK3BhaXJbMV0rcHJlY2lzaW9uKSk7cGFpcj0odG9TdHJpbmcodmFsdWUpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKHBhaXJbMF0rImUiKygrcGFpclsxXS1wcmVjaXNpb24pKX1yZXR1cm4gZnVuYyhudW1iZXIpfX12YXIgY3JlYXRlU2V0PSEoU2V0JiYxL3NldFRvQXJyYXkobmV3IFNldChbLAotMF0pKVsxXT09SU5GSU5JVFkpP25vb3A6ZnVuY3Rpb24odmFsdWVzKXtyZXR1cm4gbmV3IFNldCh2YWx1ZXMpfTtmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXt2YXIgdGFnPWdldFRhZyhvYmplY3QpO2lmKHRhZz09bWFwVGFnKXJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7aWYodGFnPT1zZXRUYWcpcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtyZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LGtleXNGdW5jKG9iamVjdCkpfX1mdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMsYXJnUG9zLGFyeSxhcml0eSl7dmFyIGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRztpZighaXNCaW5kS2V5JiZ0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7dmFyIGxlbmd0aD1wYXJ0aWFscz9wYXJ0aWFscy5sZW5ndGg6CjA7aWYoIWxlbmd0aCl7Yml0bWFzayY9fihXUkFQX1BBUlRJQUxfRkxBR3xXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9YXJ5PWFyeT09PXVuZGVmaW5lZD9hcnk6bmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLDApO2FyaXR5PWFyaXR5PT09dW5kZWZpbmVkP2FyaXR5OnRvSW50ZWdlcihhcml0eSk7bGVuZ3RoLT1ob2xkZXJzP2hvbGRlcnMubGVuZ3RoOjA7aWYoYml0bWFzayZXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyl7dmFyIHBhcnRpYWxzUmlnaHQ9cGFydGlhbHMsaG9sZGVyc1JpZ2h0PWhvbGRlcnM7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9dmFyIGRhdGE9aXNCaW5kS2V5P3VuZGVmaW5lZDpnZXREYXRhKGZ1bmMpO3ZhciBuZXdEYXRhPVtmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzLHBhcnRpYWxzUmlnaHQsaG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHldO2lmKGRhdGEpbWVyZ2VEYXRhKG5ld0RhdGEsCmRhdGEpO2Z1bmM9bmV3RGF0YVswXTtiaXRtYXNrPW5ld0RhdGFbMV07dGhpc0FyZz1uZXdEYXRhWzJdO3BhcnRpYWxzPW5ld0RhdGFbM107aG9sZGVycz1uZXdEYXRhWzRdO2FyaXR5PW5ld0RhdGFbOV09bmV3RGF0YVs5XT09PXVuZGVmaW5lZD9pc0JpbmRLZXk/MDpmdW5jLmxlbmd0aDpuYXRpdmVNYXgobmV3RGF0YVs5XS1sZW5ndGgsMCk7aWYoIWFyaXR5JiZiaXRtYXNrJihXUkFQX0NVUlJZX0ZMQUd8V1JBUF9DVVJSWV9SSUdIVF9GTEFHKSliaXRtYXNrJj1+KFdSQVBfQ1VSUllfRkxBR3xXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpO2lmKCFiaXRtYXNrfHxiaXRtYXNrPT1XUkFQX0JJTkRfRkxBRyl2YXIgcmVzdWx0PWNyZWF0ZUJpbmQoZnVuYyxiaXRtYXNrLHRoaXNBcmcpO2Vsc2UgaWYoYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxiaXRtYXNrPT1XUkFQX0NVUlJZX1JJR0hUX0ZMQUcpcmVzdWx0PWNyZWF0ZUN1cnJ5KGZ1bmMsYml0bWFzayxhcml0eSk7ZWxzZSBpZigoYml0bWFzaz09CldSQVBfUEFSVElBTF9GTEFHfHxiaXRtYXNrPT0oV1JBUF9CSU5EX0ZMQUd8V1JBUF9QQVJUSUFMX0ZMQUcpKSYmIWhvbGRlcnMubGVuZ3RoKXJlc3VsdD1jcmVhdGVQYXJ0aWFsKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzKTtlbHNlIHJlc3VsdD1jcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLG5ld0RhdGEpO3ZhciBzZXR0ZXI9ZGF0YT9iYXNlU2V0RGF0YTpzZXREYXRhO3JldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCxuZXdEYXRhKSxmdW5jLGJpdG1hc2spfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzQXNzaWduSW4ob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCl7aWYob2JqVmFsdWU9PT11bmRlZmluZWR8fGVxKG9ialZhbHVlLG9iamVjdFByb3RvW2tleV0pJiYhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSlyZXR1cm4gc3JjVmFsdWU7cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsCmtleSxvYmplY3Qsc291cmNlLHN0YWNrKXtpZihpc09iamVjdChvYmpWYWx1ZSkmJmlzT2JqZWN0KHNyY1ZhbHVlKSl7c3RhY2suc2V0KHNyY1ZhbHVlLG9ialZhbHVlKTtiYXNlTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsdW5kZWZpbmVkLGN1c3RvbURlZmF1bHRzTWVyZ2Usc3RhY2spO3N0YWNrWyJkZWxldGUiXShzcmNWYWx1ZSl9cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSl7cmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpP3VuZGVmaW5lZDp2YWx1ZX1mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXt2YXIgaXNQYXJ0aWFsPWJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsYXJyTGVuZ3RoPWFycmF5Lmxlbmd0aCxvdGhMZW5ndGg9b3RoZXIubGVuZ3RoO2lmKGFyckxlbmd0aCE9b3RoTGVuZ3RoJiYhKGlzUGFydGlhbCYmb3RoTGVuZ3RoPmFyckxlbmd0aCkpcmV0dXJuIGZhbHNlOwp2YXIgc3RhY2tlZD1zdGFjay5nZXQoYXJyYXkpO2lmKHN0YWNrZWQmJnN0YWNrLmdldChvdGhlcikpcmV0dXJuIHN0YWNrZWQ9PW90aGVyO3ZhciBpbmRleD0tMSxyZXN1bHQ9dHJ1ZSxzZWVuPWJpdG1hc2smQ09NUEFSRV9VTk9SREVSRURfRkxBRz9uZXcgU2V0Q2FjaGU6dW5kZWZpbmVkO3N0YWNrLnNldChhcnJheSxvdGhlcik7c3RhY2suc2V0KG90aGVyLGFycmF5KTt3aGlsZSgrK2luZGV4PGFyckxlbmd0aCl7dmFyIGFyclZhbHVlPWFycmF5W2luZGV4XSxvdGhWYWx1ZT1vdGhlcltpbmRleF07aWYoY3VzdG9taXplcil2YXIgY29tcGFyZWQ9aXNQYXJ0aWFsP2N1c3RvbWl6ZXIob3RoVmFsdWUsYXJyVmFsdWUsaW5kZXgsb3RoZXIsYXJyYXksc3RhY2spOmN1c3RvbWl6ZXIoYXJyVmFsdWUsb3RoVmFsdWUsaW5kZXgsYXJyYXksb3RoZXIsc3RhY2spO2lmKGNvbXBhcmVkIT09dW5kZWZpbmVkKXtpZihjb21wYXJlZCljb250aW51ZTtyZXN1bHQ9ZmFsc2U7YnJlYWt9aWYoc2Vlbil7aWYoIWFycmF5U29tZShvdGhlciwKZnVuY3Rpb24ob3RoVmFsdWUsb3RoSW5kZXgpe2lmKCFjYWNoZUhhcyhzZWVuLG90aEluZGV4KSYmKGFyclZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhhcnJWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spKSlyZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KX0pKXtyZXN1bHQ9ZmFsc2U7YnJlYWt9fWVsc2UgaWYoIShhcnJWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMoYXJyVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKSkpe3Jlc3VsdD1mYWxzZTticmVha319c3RhY2tbImRlbGV0ZSJdKGFycmF5KTtzdGFja1siZGVsZXRlIl0ob3RoZXIpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3Qsb3RoZXIsdGFnLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3N3aXRjaCh0YWcpe2Nhc2UgZGF0YVZpZXdUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fG9iamVjdC5ieXRlT2Zmc2V0IT0Kb3RoZXIuYnl0ZU9mZnNldClyZXR1cm4gZmFsc2U7b2JqZWN0PW9iamVjdC5idWZmZXI7b3RoZXI9b3RoZXIuYnVmZmVyO2Nhc2UgYXJyYXlCdWZmZXJUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fCFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSxuZXcgVWludDhBcnJheShvdGhlcikpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOmNhc2UgbnVtYmVyVGFnOnJldHVybiBlcSgrb2JqZWN0LCtvdGhlcik7Y2FzZSBlcnJvclRhZzpyZXR1cm4gb2JqZWN0Lm5hbWU9PW90aGVyLm5hbWUmJm9iamVjdC5tZXNzYWdlPT1vdGhlci5tZXNzYWdlO2Nhc2UgcmVnZXhwVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBvYmplY3Q9PW90aGVyKyIiO2Nhc2UgbWFwVGFnOnZhciBjb252ZXJ0PW1hcFRvQXJyYXk7Y2FzZSBzZXRUYWc6dmFyIGlzUGFydGlhbD1iaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHO2NvbnZlcnR8fAooY29udmVydD1zZXRUb0FycmF5KTtpZihvYmplY3Quc2l6ZSE9b3RoZXIuc2l6ZSYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZClyZXR1cm4gc3RhY2tlZD09b3RoZXI7Yml0bWFza3w9Q09NUEFSRV9VTk9SREVSRURfRkxBRztzdGFjay5zZXQob2JqZWN0LG90aGVyKTt2YXIgcmVzdWx0PWVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSxjb252ZXJ0KG90aGVyKSxiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTtzdGFja1siZGVsZXRlIl0ob2JqZWN0KTtyZXR1cm4gcmVzdWx0O2Nhc2Ugc3ltYm9sVGFnOmlmKHN5bWJvbFZhbHVlT2YpcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpPT1zeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpfXJldHVybiBmYWxzZX1mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3ZhciBpc1BhcnRpYWw9CmJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsb2JqUHJvcHM9Z2V0QWxsS2V5cyhvYmplY3QpLG9iakxlbmd0aD1vYmpQcm9wcy5sZW5ndGgsb3RoUHJvcHM9Z2V0QWxsS2V5cyhvdGhlciksb3RoTGVuZ3RoPW90aFByb3BzLmxlbmd0aDtpZihvYmpMZW5ndGghPW90aExlbmd0aCYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIGluZGV4PW9iakxlbmd0aDt3aGlsZShpbmRleC0tKXt2YXIga2V5PW9ialByb3BzW2luZGV4XTtpZighKGlzUGFydGlhbD9rZXkgaW4gb3RoZXI6aGFzT3duUHJvcGVydHkuY2FsbChvdGhlcixrZXkpKSlyZXR1cm4gZmFsc2V9dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZCYmc3RhY2suZ2V0KG90aGVyKSlyZXR1cm4gc3RhY2tlZD09b3RoZXI7dmFyIHJlc3VsdD10cnVlO3N0YWNrLnNldChvYmplY3Qsb3RoZXIpO3N0YWNrLnNldChvdGhlcixvYmplY3QpO3ZhciBza2lwQ3Rvcj1pc1BhcnRpYWw7d2hpbGUoKytpbmRleDxvYmpMZW5ndGgpe2tleT0Kb2JqUHJvcHNbaW5kZXhdO3ZhciBvYmpWYWx1ZT1vYmplY3Rba2V5XSxvdGhWYWx1ZT1vdGhlcltrZXldO2lmKGN1c3RvbWl6ZXIpdmFyIGNvbXBhcmVkPWlzUGFydGlhbD9jdXN0b21pemVyKG90aFZhbHVlLG9ialZhbHVlLGtleSxvdGhlcixvYmplY3Qsc3RhY2spOmN1c3RvbWl6ZXIob2JqVmFsdWUsb3RoVmFsdWUsa2V5LG9iamVjdCxvdGhlcixzdGFjayk7aWYoIShjb21wYXJlZD09PXVuZGVmaW5lZD9vYmpWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMob2JqVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKTpjb21wYXJlZCkpe3Jlc3VsdD1mYWxzZTticmVha31za2lwQ3Rvcnx8KHNraXBDdG9yPWtleT09ImNvbnN0cnVjdG9yIil9aWYocmVzdWx0JiYhc2tpcEN0b3Ipe3ZhciBvYmpDdG9yPW9iamVjdC5jb25zdHJ1Y3RvcixvdGhDdG9yPW90aGVyLmNvbnN0cnVjdG9yO2lmKG9iakN0b3IhPW90aEN0b3ImJigiY29uc3RydWN0b3IiaW4gb2JqZWN0JiYiY29uc3RydWN0b3IiaW4Kb3RoZXIpJiYhKHR5cGVvZiBvYmpDdG9yPT0iZnVuY3Rpb24iJiZvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciYmdHlwZW9mIG90aEN0b3I9PSJmdW5jdGlvbiImJm90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSlyZXN1bHQ9ZmFsc2V9c3RhY2tbImRlbGV0ZSJdKG9iamVjdCk7c3RhY2tbImRlbGV0ZSJdKG90aGVyKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpe3JldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLHVuZGVmaW5lZCxmbGF0dGVuKSxmdW5jKyIiKX1mdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCl7cmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzLGdldFN5bWJvbHMpfWZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3Qpe3JldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3Qsa2V5c0luLGdldFN5bWJvbHNJbil9dmFyIGdldERhdGE9IW1ldGFNYXA/bm9vcDpmdW5jdGlvbihmdW5jKXtyZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyl9OwpmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKXt2YXIgcmVzdWx0PWZ1bmMubmFtZSsiIixhcnJheT1yZWFsTmFtZXNbcmVzdWx0XSxsZW5ndGg9aGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMscmVzdWx0KT9hcnJheS5sZW5ndGg6MDt3aGlsZShsZW5ndGgtLSl7dmFyIGRhdGE9YXJyYXlbbGVuZ3RoXSxvdGhlckZ1bmM9ZGF0YS5mdW5jO2lmKG90aGVyRnVuYz09bnVsbHx8b3RoZXJGdW5jPT1mdW5jKXJldHVybiBkYXRhLm5hbWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBnZXRIb2xkZXIoZnVuYyl7dmFyIG9iamVjdD1oYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaCwicGxhY2Vob2xkZXIiKT9sb2Rhc2g6ZnVuYztyZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyfWZ1bmN0aW9uIGdldEl0ZXJhdGVlKCl7dmFyIHJlc3VsdD1sb2Rhc2guaXRlcmF0ZWV8fGl0ZXJhdGVlO3Jlc3VsdD1yZXN1bHQ9PT1pdGVyYXRlZT9iYXNlSXRlcmF0ZWU6cmVzdWx0O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPwpyZXN1bHQoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6cmVzdWx0fWZ1bmN0aW9uIGdldE1hcERhdGEobWFwLGtleSl7dmFyIGRhdGE9bWFwLl9fZGF0YV9fO3JldHVybiBpc0tleWFibGUoa2V5KT9kYXRhW3R5cGVvZiBrZXk9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06ZGF0YS5tYXB9ZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCl7dmFyIHJlc3VsdD1rZXlzKG9iamVjdCksbGVuZ3RoPXJlc3VsdC5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cmVzdWx0W2xlbmd0aF0sdmFsdWU9b2JqZWN0W2tleV07cmVzdWx0W2xlbmd0aF09W2tleSx2YWx1ZSxpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3Qsa2V5KXt2YXIgdmFsdWU9Z2V0VmFsdWUob2JqZWN0LGtleSk7cmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk/dmFsdWU6dW5kZWZpbmVkfWZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSl7dmFyIGlzT3duPQpoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLHN5bVRvU3RyaW5nVGFnKSx0YWc9dmFsdWVbc3ltVG9TdHJpbmdUYWddO3RyeXt2YWx1ZVtzeW1Ub1N0cmluZ1RhZ109dW5kZWZpbmVkO3ZhciB1bm1hc2tlZD10cnVlfWNhdGNoKGUpe312YXIgcmVzdWx0PW5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO2lmKHVubWFza2VkKWlmKGlzT3duKXZhbHVlW3N5bVRvU3RyaW5nVGFnXT10YWc7ZWxzZSBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO3JldHVybiByZXN1bHR9dmFyIGdldFN5bWJvbHM9IW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7aWYob2JqZWN0PT1udWxsKXJldHVybltdO29iamVjdD1PYmplY3Qob2JqZWN0KTtyZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLGZ1bmN0aW9uKHN5bWJvbCl7cmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LHN5bWJvbCl9KX07dmFyIGdldFN5bWJvbHNJbj0KIW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7dmFyIHJlc3VsdD1bXTt3aGlsZShvYmplY3Qpe2FycmF5UHVzaChyZXN1bHQsZ2V0U3ltYm9scyhvYmplY3QpKTtvYmplY3Q9Z2V0UHJvdG90eXBlKG9iamVjdCl9cmV0dXJuIHJlc3VsdH07dmFyIGdldFRhZz1iYXNlR2V0VGFnO2lmKERhdGFWaWV3JiZnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1kYXRhVmlld1RhZ3x8TWFwJiZnZXRUYWcobmV3IE1hcCkhPW1hcFRhZ3x8UHJvbWlzZSYmZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSE9cHJvbWlzZVRhZ3x8U2V0JiZnZXRUYWcobmV3IFNldCkhPXNldFRhZ3x8V2Vha01hcCYmZ2V0VGFnKG5ldyBXZWFrTWFwKSE9d2Vha01hcFRhZylnZXRUYWc9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9YmFzZUdldFRhZyh2YWx1ZSksQ3Rvcj1yZXN1bHQ9PW9iamVjdFRhZz92YWx1ZS5jb25zdHJ1Y3Rvcjp1bmRlZmluZWQsY3RvclN0cmluZz0KQ3Rvcj90b1NvdXJjZShDdG9yKToiIjtpZihjdG9yU3RyaW5nKXN3aXRjaChjdG9yU3RyaW5nKXtjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzpyZXR1cm4gZGF0YVZpZXdUYWc7Y2FzZSBtYXBDdG9yU3RyaW5nOnJldHVybiBtYXBUYWc7Y2FzZSBwcm9taXNlQ3RvclN0cmluZzpyZXR1cm4gcHJvbWlzZVRhZztjYXNlIHNldEN0b3JTdHJpbmc6cmV0dXJuIHNldFRhZztjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOnJldHVybiB3ZWFrTWFwVGFnfXJldHVybiByZXN1bHR9O2Z1bmN0aW9uIGdldFZpZXcoc3RhcnQsZW5kLHRyYW5zZm9ybXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dHJhbnNmb3Jtcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBkYXRhPXRyYW5zZm9ybXNbaW5kZXhdLHNpemU9ZGF0YS5zaXplO3N3aXRjaChkYXRhLnR5cGUpe2Nhc2UgImRyb3AiOnN0YXJ0Kz1zaXplO2JyZWFrO2Nhc2UgImRyb3BSaWdodCI6ZW5kLT1zaXplO2JyZWFrO2Nhc2UgInRha2UiOmVuZD1uYXRpdmVNaW4oZW5kLApzdGFydCtzaXplKTticmVhaztjYXNlICJ0YWtlUmlnaHQiOnN0YXJ0PW5hdGl2ZU1heChzdGFydCxlbmQtc2l6ZSk7YnJlYWt9fXJldHVybnsic3RhcnQiOnN0YXJ0LCJlbmQiOmVuZH19ZnVuY3Rpb24gZ2V0V3JhcERldGFpbHMoc291cmNlKXt2YXIgbWF0Y2g9c291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO3JldHVybiBtYXRjaD9tYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscyk6W119ZnVuY3Rpb24gaGFzUGF0aChvYmplY3QscGF0aCxoYXNGdW5jKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLHJlc3VsdD1mYWxzZTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGtleT10b0tleShwYXRoW2luZGV4XSk7aWYoIShyZXN1bHQ9b2JqZWN0IT1udWxsJiZoYXNGdW5jKG9iamVjdCxrZXkpKSlicmVhaztvYmplY3Q9b2JqZWN0W2tleV19aWYocmVzdWx0fHwrK2luZGV4IT1sZW5ndGgpcmV0dXJuIHJlc3VsdDtsZW5ndGg9Cm9iamVjdD09bnVsbD8wOm9iamVjdC5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmlzTGVuZ3RoKGxlbmd0aCkmJmlzSW5kZXgoa2V5LGxlbmd0aCkmJihpc0FycmF5KG9iamVjdCl8fGlzQXJndW1lbnRzKG9iamVjdCkpfWZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9bmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7aWYobGVuZ3RoJiZ0eXBlb2YgYXJyYXlbMF09PSJzdHJpbmciJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCJpbmRleCIpKXtyZXN1bHQuaW5kZXg9YXJyYXkuaW5kZXg7cmVzdWx0LmlucHV0PWFycmF5LmlucHV0fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCl7cmV0dXJuIHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFpc1Byb3RvdHlwZShvYmplY3QpP2Jhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpOnt9fWZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwKdGFnLGlzRGVlcCl7dmFyIEN0b3I9b2JqZWN0LmNvbnN0cnVjdG9yO3N3aXRjaCh0YWcpe2Nhc2UgYXJyYXlCdWZmZXJUYWc6cmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOnJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtjYXNlIGRhdGFWaWV3VGFnOnJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCxpc0RlZXApO2Nhc2UgZmxvYXQzMlRhZzpjYXNlIGZsb2F0NjRUYWc6Y2FzZSBpbnQ4VGFnOmNhc2UgaW50MTZUYWc6Y2FzZSBpbnQzMlRhZzpjYXNlIHVpbnQ4VGFnOmNhc2UgdWludDhDbGFtcGVkVGFnOmNhc2UgdWludDE2VGFnOmNhc2UgdWludDMyVGFnOnJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LGlzRGVlcCk7Y2FzZSBtYXBUYWc6cmV0dXJuIG5ldyBDdG9yO2Nhc2UgbnVtYmVyVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBuZXcgQ3RvcihvYmplY3QpO2Nhc2UgcmVnZXhwVGFnOnJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpOwpjYXNlIHNldFRhZzpyZXR1cm4gbmV3IEN0b3I7Y2FzZSBzeW1ib2xUYWc6cmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCl9fWZ1bmN0aW9uIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSxkZXRhaWxzKXt2YXIgbGVuZ3RoPWRldGFpbHMubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuIHNvdXJjZTt2YXIgbGFzdEluZGV4PWxlbmd0aC0xO2RldGFpbHNbbGFzdEluZGV4XT0obGVuZ3RoPjE/Ilx4MjYgIjoiIikrZGV0YWlsc1tsYXN0SW5kZXhdO2RldGFpbHM9ZGV0YWlscy5qb2luKGxlbmd0aD4yPyIsICI6IiAiKTtyZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwie1xuLyogW3dyYXBwZWQgd2l0aCAiK2RldGFpbHMrIl0gKi9cbiIpfWZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpe3JldHVybiBpc0FycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpfHwhIShzcHJlYWRhYmxlU3ltYm9sJiZ2YWx1ZSYmdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pfWZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsCmxlbmd0aCl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO2xlbmd0aD1sZW5ndGg9PW51bGw/TUFYX1NBRkVfSU5URUdFUjpsZW5ndGg7cmV0dXJuISFsZW5ndGgmJih0eXBlPT0ibnVtYmVyInx8dHlwZSE9InN5bWJvbCImJnJlSXNVaW50LnRlc3QodmFsdWUpKSYmKHZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTxsZW5ndGgpfWZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLGluZGV4LG9iamVjdCl7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIGZhbHNlO3ZhciB0eXBlPXR5cGVvZiBpbmRleDtpZih0eXBlPT0ibnVtYmVyIj9pc0FycmF5TGlrZShvYmplY3QpJiZpc0luZGV4KGluZGV4LG9iamVjdC5sZW5ndGgpOnR5cGU9PSJzdHJpbmciJiZpbmRleCBpbiBvYmplY3QpcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sdmFsdWUpO3JldHVybiBmYWxzZX1mdW5jdGlvbiBpc0tleSh2YWx1ZSxvYmplY3Qpe2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdHlwZT10eXBlb2YgdmFsdWU7CmlmKHR5cGU9PSJudW1iZXIifHx0eXBlPT0ic3ltYm9sInx8dHlwZT09ImJvb2xlYW4ifHx2YWx1ZT09bnVsbHx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB0cnVlO3JldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpfHwhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpfHxvYmplY3QhPW51bGwmJnZhbHVlIGluIE9iamVjdChvYmplY3QpfWZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB0eXBlPT0ic3RyaW5nInx8dHlwZT09Im51bWJlciJ8fHR5cGU9PSJzeW1ib2wifHx0eXBlPT0iYm9vbGVhbiI/dmFsdWUhPT0iX19wcm90b19fIjp2YWx1ZT09PW51bGx9ZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKXt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksb3RoZXI9bG9kYXNoW2Z1bmNOYW1lXTtpZih0eXBlb2Ygb3RoZXIhPSJmdW5jdGlvbiJ8fCEoZnVuY05hbWUgaW4gTGF6eVdyYXBwZXIucHJvdG90eXBlKSlyZXR1cm4gZmFsc2U7CmlmKGZ1bmM9PT1vdGhlcilyZXR1cm4gdHJ1ZTt2YXIgZGF0YT1nZXREYXRhKG90aGVyKTtyZXR1cm4hIWRhdGEmJmZ1bmM9PT1kYXRhWzBdfWZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpe3JldHVybiEhbWFza1NyY0tleSYmbWFza1NyY0tleSBpbiBmdW5jfXZhciBpc01hc2thYmxlPWNvcmVKc0RhdGE/aXNGdW5jdGlvbjpzdHViRmFsc2U7ZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpe3ZhciBDdG9yPXZhbHVlJiZ2YWx1ZS5jb25zdHJ1Y3Rvcixwcm90bz10eXBlb2YgQ3Rvcj09ImZ1bmN0aW9uIiYmQ3Rvci5wcm90b3R5cGV8fG9iamVjdFByb3RvO3JldHVybiB2YWx1ZT09PXByb3RvfWZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dmFsdWUmJiFpc09iamVjdCh2YWx1ZSl9ZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LHNyY1ZhbHVlKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtpZihvYmplY3Q9PW51bGwpcmV0dXJuIGZhbHNlOwpyZXR1cm4gb2JqZWN0W2tleV09PT1zcmNWYWx1ZSYmKHNyY1ZhbHVlIT09dW5kZWZpbmVkfHxrZXkgaW4gT2JqZWN0KG9iamVjdCkpfX1mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpe3ZhciByZXN1bHQ9bWVtb2l6ZShmdW5jLGZ1bmN0aW9uKGtleSl7aWYoY2FjaGUuc2l6ZT09PU1BWF9NRU1PSVpFX1NJWkUpY2FjaGUuY2xlYXIoKTtyZXR1cm4ga2V5fSk7dmFyIGNhY2hlPXJlc3VsdC5jYWNoZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLHNvdXJjZSl7dmFyIGJpdG1hc2s9ZGF0YVsxXSxzcmNCaXRtYXNrPXNvdXJjZVsxXSxuZXdCaXRtYXNrPWJpdG1hc2t8c3JjQml0bWFzayxpc0NvbW1vbj1uZXdCaXRtYXNrPChXUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUd8V1JBUF9BUllfRkxBRyk7dmFyIGlzQ29tYm89c3JjQml0bWFzaz09V1JBUF9BUllfRkxBRyYmYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxzcmNCaXRtYXNrPT1XUkFQX0FSWV9GTEFHJiYKYml0bWFzaz09V1JBUF9SRUFSR19GTEFHJiZkYXRhWzddLmxlbmd0aDw9c291cmNlWzhdfHxzcmNCaXRtYXNrPT0oV1JBUF9BUllfRkxBR3xXUkFQX1JFQVJHX0ZMQUcpJiZzb3VyY2VbN10ubGVuZ3RoPD1zb3VyY2VbOF0mJmJpdG1hc2s9PVdSQVBfQ1VSUllfRkxBRztpZighKGlzQ29tbW9ufHxpc0NvbWJvKSlyZXR1cm4gZGF0YTtpZihzcmNCaXRtYXNrJldSQVBfQklORF9GTEFHKXtkYXRhWzJdPXNvdXJjZVsyXTtuZXdCaXRtYXNrfD1iaXRtYXNrJldSQVBfQklORF9GTEFHPzA6V1JBUF9DVVJSWV9CT1VORF9GTEFHfXZhciB2YWx1ZT1zb3VyY2VbM107aWYodmFsdWUpe3ZhciBwYXJ0aWFscz1kYXRhWzNdO2RhdGFbM109cGFydGlhbHM/Y29tcG9zZUFyZ3MocGFydGlhbHMsdmFsdWUsc291cmNlWzRdKTp2YWx1ZTtkYXRhWzRdPXBhcnRpYWxzP3JlcGxhY2VIb2xkZXJzKGRhdGFbM10sUExBQ0VIT0xERVIpOnNvdXJjZVs0XX12YWx1ZT1zb3VyY2VbNV07aWYodmFsdWUpe3BhcnRpYWxzPQpkYXRhWzVdO2RhdGFbNV09cGFydGlhbHM/Y29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscyx2YWx1ZSxzb3VyY2VbNl0pOnZhbHVlO2RhdGFbNl09cGFydGlhbHM/cmVwbGFjZUhvbGRlcnMoZGF0YVs1XSxQTEFDRUhPTERFUik6c291cmNlWzZdfXZhbHVlPXNvdXJjZVs3XTtpZih2YWx1ZSlkYXRhWzddPXZhbHVlO2lmKHNyY0JpdG1hc2smV1JBUF9BUllfRkxBRylkYXRhWzhdPWRhdGFbOF09PW51bGw/c291cmNlWzhdOm5hdGl2ZU1pbihkYXRhWzhdLHNvdXJjZVs4XSk7aWYoZGF0YVs5XT09bnVsbClkYXRhWzldPXNvdXJjZVs5XTtkYXRhWzBdPXNvdXJjZVswXTtkYXRhWzFdPW5ld0JpdG1hc2s7cmV0dXJuIGRhdGF9ZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCl7dmFyIHJlc3VsdD1bXTtpZihvYmplY3QhPW51bGwpZm9yKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKXtyZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSl9CmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsc3RhcnQsdHJhbnNmb3JtKXtzdGFydD1uYXRpdmVNYXgoc3RhcnQ9PT11bmRlZmluZWQ/ZnVuYy5sZW5ndGgtMTpzdGFydCwwKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChhcmdzLmxlbmd0aC1zdGFydCwwKSxhcnJheT1BcnJheShsZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFycmF5W2luZGV4XT1hcmdzW3N0YXJ0K2luZGV4XTtpbmRleD0tMTt2YXIgb3RoZXJBcmdzPUFycmF5KHN0YXJ0KzEpO3doaWxlKCsraW5kZXg8c3RhcnQpb3RoZXJBcmdzW2luZGV4XT1hcmdzW2luZGV4XTtvdGhlckFyZ3Nbc3RhcnRdPXRyYW5zZm9ybShhcnJheSk7cmV0dXJuIGFwcGx5KGZ1bmMsdGhpcyxvdGhlckFyZ3MpfX1mdW5jdGlvbiBwYXJlbnQob2JqZWN0LHBhdGgpe3JldHVybiBwYXRoLmxlbmd0aDwyP29iamVjdDpiYXNlR2V0KG9iamVjdCxiYXNlU2xpY2UocGF0aCwwLC0xKSl9CmZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksaW5kZXhlcyl7dmFyIGFyckxlbmd0aD1hcnJheS5sZW5ndGgsbGVuZ3RoPW5hdGl2ZU1pbihpbmRleGVzLmxlbmd0aCxhcnJMZW5ndGgpLG9sZEFycmF5PWNvcHlBcnJheShhcnJheSk7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07YXJyYXlbbGVuZ3RoXT1pc0luZGV4KGluZGV4LGFyckxlbmd0aCk/b2xkQXJyYXlbaW5kZXhdOnVuZGVmaW5lZH1yZXR1cm4gYXJyYXl9dmFyIHNldERhdGE9c2hvcnRPdXQoYmFzZVNldERhdGEpO3ZhciBzZXRUaW1lb3V0PWN0eFNldFRpbWVvdXR8fGZ1bmN0aW9uKGZ1bmMsd2FpdCl7cmV0dXJuIHJvb3Quc2V0VGltZW91dChmdW5jLHdhaXQpfTt2YXIgc2V0VG9TdHJpbmc9c2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlcixyZWZlcmVuY2UsYml0bWFzayl7dmFyIHNvdXJjZT1yZWZlcmVuY2UrIiI7cmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsCmluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSx1cGRhdGVXcmFwRGV0YWlscyhnZXRXcmFwRGV0YWlscyhzb3VyY2UpLGJpdG1hc2spKSl9ZnVuY3Rpb24gc2hvcnRPdXQoZnVuYyl7dmFyIGNvdW50PTAsbGFzdENhbGxlZD0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBzdGFtcD1uYXRpdmVOb3coKSxyZW1haW5pbmc9SE9UX1NQQU4tKHN0YW1wLWxhc3RDYWxsZWQpO2xhc3RDYWxsZWQ9c3RhbXA7aWYocmVtYWluaW5nPjApe2lmKCsrY291bnQ+PUhPVF9DT1VOVClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgY291bnQ9MDtyZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsYXJndW1lbnRzKX19ZnVuY3Rpb24gc2h1ZmZsZVNlbGYoYXJyYXksc2l6ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgsbGFzdEluZGV4PWxlbmd0aC0xO3NpemU9c2l6ZT09PXVuZGVmaW5lZD9sZW5ndGg6c2l6ZTt3aGlsZSgrK2luZGV4PHNpemUpe3ZhciByYW5kPWJhc2VSYW5kb20oaW5kZXgsbGFzdEluZGV4KSwKdmFsdWU9YXJyYXlbcmFuZF07YXJyYXlbcmFuZF09YXJyYXlbaW5kZXhdO2FycmF5W2luZGV4XT12YWx1ZX1hcnJheS5sZW5ndGg9c2l6ZTtyZXR1cm4gYXJyYXl9dmFyIHN0cmluZ1RvUGF0aD1tZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZyl7dmFyIHJlc3VsdD1bXTtpZihzdHJpbmcuY2hhckNvZGVBdCgwKT09PTQ2KXJlc3VsdC5wdXNoKCIiKTtzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLGZ1bmN0aW9uKG1hdGNoLG51bWJlcixxdW90ZSxzdWJTdHJpbmcpe3Jlc3VsdC5wdXNoKHF1b3RlP3N1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwiJDEiKTpudW1iZXJ8fG1hdGNoKX0pO3JldHVybiByZXN1bHR9KTtmdW5jdGlvbiB0b0tleSh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nInx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTt2YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZPyItMCI6cmVzdWx0fQpmdW5jdGlvbiB0b1NvdXJjZShmdW5jKXtpZihmdW5jIT1udWxsKXt0cnl7cmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpfWNhdGNoKGUpe310cnl7cmV0dXJuIGZ1bmMrIiJ9Y2F0Y2goZSQwKXt9fXJldHVybiIifWZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsYml0bWFzayl7YXJyYXlFYWNoKHdyYXBGbGFncyxmdW5jdGlvbihwYWlyKXt2YXIgdmFsdWU9Il8uIitwYWlyWzBdO2lmKGJpdG1hc2smcGFpclsxXSYmIWFycmF5SW5jbHVkZXMoZGV0YWlscyx2YWx1ZSkpZGV0YWlscy5wdXNoKHZhbHVlKX0pO3JldHVybiBkZXRhaWxzLnNvcnQoKX1mdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcil7aWYod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKXJldHVybiB3cmFwcGVyLmNsb25lKCk7dmFyIHJlc3VsdD1uZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLHdyYXBwZXIuX19jaGFpbl9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pOwpyZXN1bHQuX19pbmRleF9fPXdyYXBwZXIuX19pbmRleF9fO3Jlc3VsdC5fX3ZhbHVlc19fPXdyYXBwZXIuX192YWx1ZXNfXztyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNodW5rKGFycmF5LHNpemUsZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGFycmF5LHNpemUsZ3VhcmQpOnNpemU9PT11bmRlZmluZWQpc2l6ZT0xO2Vsc2Ugc2l6ZT1uYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLDApO3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aHx8c2l6ZTwxKXJldHVybltdO3ZhciBpbmRleD0wLHJlc0luZGV4PTAscmVzdWx0PUFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoL3NpemUpKTt3aGlsZShpbmRleDxsZW5ndGgpcmVzdWx0W3Jlc0luZGV4KytdPWJhc2VTbGljZShhcnJheSxpbmRleCxpbmRleCs9c2l6ZSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb21wYWN0KGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLApyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZSlyZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb25jYXQoKXt2YXIgbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTt2YXIgYXJncz1BcnJheShsZW5ndGgtMSksYXJyYXk9YXJndW1lbnRzWzBdLGluZGV4PWxlbmd0aDt3aGlsZShpbmRleC0tKWFyZ3NbaW5kZXgtMV09YXJndW1lbnRzW2luZGV4XTtyZXR1cm4gYXJyYXlQdXNoKGlzQXJyYXkoYXJyYXkpP2NvcHlBcnJheShhcnJheSk6W2FycmF5XSxiYXNlRmxhdHRlbihhcmdzLDEpKX12YXIgZGlmZmVyZW5jZT1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSk/YmFzZURpZmZlcmVuY2UoYXJyYXksYmFzZUZsYXR0ZW4odmFsdWVzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpOgpbXX0pO3ZhciBkaWZmZXJlbmNlQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgaXRlcmF0ZWU9bGFzdCh2YWx1ZXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgZGlmZmVyZW5jZVdpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgY29tcGFyYXRvcj1sYXN0KHZhbHVlcyk7aWYoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpY29tcGFyYXRvcj11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gZHJvcChhcnJheSxuLGd1YXJkKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LG48MD8wOm4sbGVuZ3RoKX1mdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksbixndWFyZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO249Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7bj1sZW5ndGgtbjtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLHRydWUsdHJ1ZSk6W119ZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiYKYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksdHJ1ZSk6W119ZnVuY3Rpb24gZmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihzdGFydCYmdHlwZW9mIHN0YXJ0IT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoYXJyYXksdmFsdWUsc3RhcnQpKXtzdGFydD0wO2VuZD1sZW5ndGh9cmV0dXJuIGJhc2VGaWxsKGFycmF5LHZhbHVlLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9ZnJvbUluZGV4PT1udWxsPzA6dG9JbnRlZ2VyKGZyb21JbmRleCk7aWYoaW5kZXg8MClpbmRleD1uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApO3JldHVybiBiYXNlRmluZEluZGV4KGFycmF5LApnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgpfWZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1sZW5ndGgtMTtpZihmcm9tSW5kZXghPT11bmRlZmluZWQpe2luZGV4PXRvSW50ZWdlcihmcm9tSW5kZXgpO2luZGV4PWZyb21JbmRleDwwP25hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk6bmF0aXZlTWluKGluZGV4LGxlbmd0aC0xKX1yZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgsdHJ1ZSl9ZnVuY3Rpb24gZmxhdHRlbihhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LDEpOltdfWZ1bmN0aW9uIGZsYXR0ZW5EZWVwKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoOwpyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LElORklOSVRZKTpbXX1mdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksZGVwdGgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtkZXB0aD1kZXB0aD09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihkZXB0aCk7cmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LGRlcHRoKX1mdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGFpcj1wYWlyc1tpbmRleF07cmVzdWx0W3BhaXJbMF1dPXBhaXJbMV19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBoZWFkKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9hcnJheVswXTp1bmRlZmluZWR9ZnVuY3Rpb24gaW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PQpudWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuLTE7dmFyIGluZGV4PWZyb21JbmRleD09bnVsbD8wOnRvSW50ZWdlcihmcm9tSW5kZXgpO2lmKGluZGV4PDApaW5kZXg9bmF0aXZlTWF4KGxlbmd0aCtpbmRleCwwKTtyZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpfWZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMCwtMSk6W119dmFyIGludGVyc2VjdGlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO3JldHVybiBtYXBwZWQubGVuZ3RoJiZtYXBwZWRbMF09PT1hcnJheXNbMF0/YmFzZUludGVyc2VjdGlvbihtYXBwZWQpOltdfSk7dmFyIGludGVyc2VjdGlvbkJ5PWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGl0ZXJhdGVlPWxhc3QoYXJyYXlzKSwKbWFwcGVkPWFycmF5TWFwKGFycmF5cyxjYXN0QXJyYXlMaWtlT2JqZWN0KTtpZihpdGVyYXRlZT09PWxhc3QobWFwcGVkKSlpdGVyYXRlZT11bmRlZmluZWQ7ZWxzZSBtYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgaW50ZXJzZWN0aW9uV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKSxtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PSJmdW5jdGlvbiI/Y29tcGFyYXRvcjp1bmRlZmluZWQ7aWYoY29tcGFyYXRvciltYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gam9pbihhcnJheSxzZXBhcmF0b3Ipe3JldHVybiBhcnJheT09bnVsbD8iIjpuYXRpdmVKb2luLmNhbGwoYXJyYXksc2VwYXJhdG9yKX1mdW5jdGlvbiBsYXN0KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YXJyYXlbbGVuZ3RoLTFdOnVuZGVmaW5lZH1mdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9bGVuZ3RoO2lmKGZyb21JbmRleCE9PXVuZGVmaW5lZCl7aW5kZXg9dG9JbnRlZ2VyKGZyb21JbmRleCk7aW5kZXg9aW5kZXg8MD9uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApOm5hdGl2ZU1pbihpbmRleCxsZW5ndGgtMSl9cmV0dXJuIHZhbHVlPT09dmFsdWU/c3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpOmJhc2VGaW5kSW5kZXgoYXJyYXksCmJhc2VJc05hTixpbmRleCx0cnVlKX1mdW5jdGlvbiBudGgoYXJyYXksbil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZU50aChhcnJheSx0b0ludGVnZXIobikpOnVuZGVmaW5lZH12YXIgcHVsbD1iYXNlUmVzdChwdWxsQWxsKTtmdW5jdGlvbiBwdWxsQWxsKGFycmF5LHZhbHVlcyl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMpOmFycmF5fWZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoJiZ2YWx1ZXMmJnZhbHVlcy5sZW5ndGg/YmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTphcnJheX1mdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSx2YWx1ZXMsY29tcGFyYXRvcil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSwKdmFsdWVzLHVuZGVmaW5lZCxjb21wYXJhdG9yKTphcnJheX12YXIgcHVsbEF0PWZsYXRSZXN0KGZ1bmN0aW9uKGFycmF5LGluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PWJhc2VBdChhcnJheSxpbmRleGVzKTtiYXNlUHVsbEF0KGFycmF5LGFycmF5TWFwKGluZGV4ZXMsZnVuY3Rpb24oaW5kZXgpe3JldHVybiBpc0luZGV4KGluZGV4LGxlbmd0aCk/K2luZGV4OmluZGV4fSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIHJlbW92ZShhcnJheSxwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm4gcmVzdWx0O3ZhciBpbmRleD0tMSxpbmRleGVzPVtdLGxlbmd0aD1hcnJheS5sZW5ndGg7cHJlZGljYXRlPWdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsCmluZGV4LGFycmF5KSl7cmVzdWx0LnB1c2godmFsdWUpO2luZGV4ZXMucHVzaChpbmRleCl9fWJhc2VQdWxsQXQoYXJyYXksaW5kZXhlcyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiByZXZlcnNlKGFycmF5KXtyZXR1cm4gYXJyYXk9PW51bGw/YXJyYXk6bmF0aXZlUmV2ZXJzZS5jYWxsKGFycmF5KX1mdW5jdGlvbiBzbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihlbmQmJnR5cGVvZiBlbmQhPSJudW1iZXIiJiZpc0l0ZXJhdGVlQ2FsbChhcnJheSxzdGFydCxlbmQpKXtzdGFydD0wO2VuZD1sZW5ndGh9ZWxzZXtzdGFydD1zdGFydD09bnVsbD8wOnRvSW50ZWdlcihzdGFydCk7ZW5kPWVuZD09PXVuZGVmaW5lZD9sZW5ndGg6dG9JbnRlZ2VyKGVuZCl9cmV0dXJuIGJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfWZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LHZhbHVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LAp2YWx1ZSl9ZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX1mdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LHZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGxlbmd0aCl7dmFyIGluZGV4PWJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSk7aWYoaW5kZXg8bGVuZ3RoJiZlcShhcnJheVtpbmRleF0sdmFsdWUpKXJldHVybiBpbmRleH1yZXR1cm4tMX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksdmFsdWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUsdHJ1ZSl9ZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSx0cnVlKX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwKdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYobGVuZ3RoKXt2YXIgaW5kZXg9YmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlLHRydWUpLTE7aWYoZXEoYXJyYXlbaW5kZXhdLHZhbHVlKSlyZXR1cm4gaW5kZXh9cmV0dXJuLTF9ZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXkpOltdfWZ1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdfWZ1bmN0aW9uIHRhaWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMSxsZW5ndGgpOltdfWZ1bmN0aW9uIHRha2UoYXJyYXksbixndWFyZCl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTsKbj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gdGFrZVJpZ2h0KGFycmF5LG4sZ3VhcmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO249bGVuZ3RoLW47cmV0dXJuIGJhc2VTbGljZShhcnJheSxuPDA/MDpuLGxlbmd0aCl9ZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGZhbHNlLHRydWUpOltdfWZ1bmN0aW9uIHRha2VXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpOltdfXZhciB1bmlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3JldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsCjEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpfSk7dmFyIHVuaW9uQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX0pO3ZhciB1bmlvbldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSksdW5kZWZpbmVkLGNvbXBhcmF0b3IpfSk7ZnVuY3Rpb24gdW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVVuaXEoYXJyYXkpOgpbXX1mdW5jdGlvbiB1bmlxQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX1mdW5jdGlvbiB1bmlxV2l0aChhcnJheSxjb21wYXJhdG9yKXtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LHVuZGVmaW5lZCxjb21wYXJhdG9yKTpbXX1mdW5jdGlvbiB1bnppcChhcnJheSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgbGVuZ3RoPTA7YXJyYXk9YXJyYXlGaWx0ZXIoYXJyYXksZnVuY3Rpb24oZ3JvdXApe2lmKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSl7bGVuZ3RoPW5hdGl2ZU1heChncm91cC5sZW5ndGgsbGVuZ3RoKTtyZXR1cm4gdHJ1ZX19KTtyZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCxmdW5jdGlvbihpbmRleCl7cmV0dXJuIGFycmF5TWFwKGFycmF5LApiYXNlUHJvcGVydHkoaW5kZXgpKX0pfWZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSxpdGVyYXRlZSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgcmVzdWx0PXVuemlwKGFycmF5KTtpZihpdGVyYXRlZT09bnVsbClyZXR1cm4gcmVzdWx0O3JldHVybiBhcnJheU1hcChyZXN1bHQsZnVuY3Rpb24oZ3JvdXApe3JldHVybiBhcHBseShpdGVyYXRlZSx1bmRlZmluZWQsZ3JvdXApfSl9dmFyIHdpdGhvdXQ9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LHZhbHVlcyk6W119KTt2YXIgeG9yPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7cmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLGlzQXJyYXlMaWtlT2JqZWN0KSl9KTt2YXIgeG9yQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT0KdW5kZWZpbmVkO3JldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cyxpc0FycmF5TGlrZU9iamVjdCksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfSk7dmFyIHhvcldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsaXNBcnJheUxpa2VPYmplY3QpLHVuZGVmaW5lZCxjb21wYXJhdG9yKX0pO3ZhciB6aXA9YmFzZVJlc3QodW56aXApO2Z1bmN0aW9uIHppcE9iamVjdChwcm9wcyx2YWx1ZXMpe3JldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzfHxbXSx2YWx1ZXN8fFtdLGFzc2lnblZhbHVlKX1mdW5jdGlvbiB6aXBPYmplY3REZWVwKHByb3BzLHZhbHVlcyl7cmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHN8fFtdLHZhbHVlc3x8W10sYmFzZVNldCl9dmFyIHppcFdpdGg9CmJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGxlbmd0aD1hcnJheXMubGVuZ3RoLGl0ZXJhdGVlPWxlbmd0aD4xP2FycmF5c1tsZW5ndGgtMV06dW5kZWZpbmVkO2l0ZXJhdGVlPXR5cGVvZiBpdGVyYXRlZT09ImZ1bmN0aW9uIj8oYXJyYXlzLnBvcCgpLGl0ZXJhdGVlKTp1bmRlZmluZWQ7cmV0dXJuIHVuemlwV2l0aChhcnJheXMsaXRlcmF0ZWUpfSk7ZnVuY3Rpb24gY2hhaW4odmFsdWUpe3ZhciByZXN1bHQ9bG9kYXNoKHZhbHVlKTtyZXN1bHQuX19jaGFpbl9fPXRydWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0YXAodmFsdWUsaW50ZXJjZXB0b3Ipe2ludGVyY2VwdG9yKHZhbHVlKTtyZXR1cm4gdmFsdWV9ZnVuY3Rpb24gdGhydSh2YWx1ZSxpbnRlcmNlcHRvcil7cmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKX12YXIgd3JhcHBlckF0PWZsYXRSZXN0KGZ1bmN0aW9uKHBhdGhzKXt2YXIgbGVuZ3RoPXBhdGhzLmxlbmd0aCxzdGFydD1sZW5ndGg/cGF0aHNbMF06MCx2YWx1ZT0KdGhpcy5fX3dyYXBwZWRfXyxpbnRlcmNlcHRvcj1mdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlQXQob2JqZWN0LHBhdGhzKX07aWYobGVuZ3RoPjF8fHRoaXMuX19hY3Rpb25zX18ubGVuZ3RofHwhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpfHwhaXNJbmRleChzdGFydCkpcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7dmFsdWU9dmFsdWUuc2xpY2Uoc3RhcnQsK3N0YXJ0KyhsZW5ndGg/MTowKSk7dmFsdWUuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybihuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSx0aGlzLl9fY2hhaW5fXykpLnRocnUoZnVuY3Rpb24oYXJyYXkpe2lmKGxlbmd0aCYmIWFycmF5Lmxlbmd0aClhcnJheS5wdXNoKHVuZGVmaW5lZCk7cmV0dXJuIGFycmF5fSl9KTtmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKXtyZXR1cm4gY2hhaW4odGhpcyl9ZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpe3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksCnRoaXMuX19jaGFpbl9fKX1mdW5jdGlvbiB3cmFwcGVyTmV4dCgpe2lmKHRoaXMuX192YWx1ZXNfXz09PXVuZGVmaW5lZCl0aGlzLl9fdmFsdWVzX189dG9BcnJheSh0aGlzLnZhbHVlKCkpO3ZhciBkb25lPXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoLHZhbHVlPWRvbmU/dW5kZWZpbmVkOnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXTtyZXR1cm57ImRvbmUiOmRvbmUsInZhbHVlIjp2YWx1ZX19ZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKXtyZXR1cm4gdGhpc31mdW5jdGlvbiB3cmFwcGVyUGxhbnQodmFsdWUpe3ZhciByZXN1bHQscGFyZW50PXRoaXM7d2hpbGUocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCl7dmFyIGNsb25lPXdyYXBwZXJDbG9uZShwYXJlbnQpO2Nsb25lLl9faW5kZXhfXz0wO2Nsb25lLl9fdmFsdWVzX189dW5kZWZpbmVkO2lmKHJlc3VsdClwcmV2aW91cy5fX3dyYXBwZWRfXz1jbG9uZTtlbHNlIHJlc3VsdD1jbG9uZTsKdmFyIHByZXZpb3VzPWNsb25lO3BhcmVudD1wYXJlbnQuX193cmFwcGVkX199cHJldmlvdXMuX193cmFwcGVkX189dmFsdWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpe3ZhciB2YWx1ZT10aGlzLl9fd3JhcHBlZF9fO2lmKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpe3ZhciB3cmFwcGVkPXZhbHVlO2lmKHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKXdyYXBwZWQ9bmV3IExhenlXcmFwcGVyKHRoaXMpO3dyYXBwZWQ9d3JhcHBlZC5yZXZlcnNlKCk7d3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHsiZnVuYyI6dGhydSwiYXJncyI6W3JldmVyc2VdLCJ0aGlzQXJnIjp1bmRlZmluZWR9KTtyZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlZCx0aGlzLl9fY2hhaW5fXyl9cmV0dXJuIHRoaXMudGhydShyZXZlcnNlKX1mdW5jdGlvbiB3cmFwcGVyVmFsdWUoKXtyZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfQp2YXIgY291bnRCeT1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LGtleSkpKytyZXN1bHRba2V5XTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LDEpfSk7ZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFdmVyeTpiYXNlRXZlcnk7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKSlwcmVkaWNhdGU9dW5kZWZpbmVkO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKX1mdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlGaWx0ZXI6YmFzZUZpbHRlcjtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSl9dmFyIGZpbmQ9CmNyZWF0ZUZpbmQoZmluZEluZGV4KTt2YXIgZmluZExhc3Q9Y3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3JldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbixpdGVyYXRlZSksMSl9ZnVuY3Rpb24gZmxhdE1hcERlZXAoY29sbGVjdGlvbixpdGVyYXRlZSl7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSxJTkZJTklUWSl9ZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24saXRlcmF0ZWUsZGVwdGgpe2RlcHRoPWRlcHRoPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKGRlcHRoKTtyZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpLGRlcHRoKX1mdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFYWNoOmJhc2VFYWNoO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpKX1mdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUVhY2hSaWdodDpiYXNlRWFjaFJpZ2h0O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfXZhciBncm91cEJ5PWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsa2V5KSlyZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LFt2YWx1ZV0pfSk7ZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbix2YWx1ZSxmcm9tSW5kZXgsZ3VhcmQpe2NvbGxlY3Rpb249aXNBcnJheUxpa2UoY29sbGVjdGlvbik/Y29sbGVjdGlvbjp2YWx1ZXMoY29sbGVjdGlvbik7ZnJvbUluZGV4PWZyb21JbmRleCYmIWd1YXJkP3RvSW50ZWdlcihmcm9tSW5kZXgpOjA7dmFyIGxlbmd0aD1jb2xsZWN0aW9uLmxlbmd0aDsKaWYoZnJvbUluZGV4PDApZnJvbUluZGV4PW5hdGl2ZU1heChsZW5ndGgrZnJvbUluZGV4LDApO3JldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKT9mcm9tSW5kZXg8PWxlbmd0aCYmY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLGZyb21JbmRleCk+LTE6ISFsZW5ndGgmJmJhc2VJbmRleE9mKGNvbGxlY3Rpb24sdmFsdWUsZnJvbUluZGV4KT4tMX12YXIgaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24scGF0aCxhcmdzKXt2YXIgaW5kZXg9LTEsaXNGdW5jPXR5cGVvZiBwYXRoPT0iZnVuY3Rpb24iLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPWlzRnVuYz9hcHBseShwYXRoLHZhbHVlLGFyZ3MpOmJhc2VJbnZva2UodmFsdWUscGF0aCxhcmdzKX0pO3JldHVybiByZXN1bHR9KTt2YXIga2V5Qnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsCnZhbHVlLGtleSl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksdmFsdWUpfSk7ZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlNYXA6YmFzZU1hcDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBvcmRlckJ5KGNvbGxlY3Rpb24saXRlcmF0ZWVzLG9yZGVycyxndWFyZCl7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm5bXTtpZighaXNBcnJheShpdGVyYXRlZXMpKWl0ZXJhdGVlcz1pdGVyYXRlZXM9PW51bGw/W106W2l0ZXJhdGVlc107b3JkZXJzPWd1YXJkP3VuZGVmaW5lZDpvcmRlcnM7aWYoIWlzQXJyYXkob3JkZXJzKSlvcmRlcnM9b3JkZXJzPT1udWxsP1tdOltvcmRlcnNdO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMpfXZhciBwYXJ0aXRpb249Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsCmtleSl7cmVzdWx0W2tleT8wOjFdLnB1c2godmFsdWUpfSxmdW5jdGlvbigpe3JldHVybltbXSxbXV19KTtmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVJlZHVjZTpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2gpfWZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlSZWR1Y2VSaWdodDpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2hSaWdodCl9ZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sCnByZWRpY2F0ZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUZpbHRlcjpiYXNlRmlsdGVyO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSkpfWZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlOmJhc2VTYW1wbGU7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbil9ZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4sZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sbixndWFyZCk6bj09PXVuZGVmaW5lZCluPTE7ZWxzZSBuPXRvSW50ZWdlcihuKTt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlU2l6ZTpiYXNlU2FtcGxlU2l6ZTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLG4pfWZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNodWZmbGU6CmJhc2VTaHVmZmxlO3JldHVybiBmdW5jKGNvbGxlY3Rpb24pfWZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbil7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm4gMDtpZihpc0FycmF5TGlrZShjb2xsZWN0aW9uKSlyZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbik/c3RyaW5nU2l6ZShjb2xsZWN0aW9uKTpjb2xsZWN0aW9uLmxlbmd0aDt2YXIgdGFnPWdldFRhZyhjb2xsZWN0aW9uKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtyZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RofWZ1bmN0aW9uIHNvbWUoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTb21lOmJhc2VTb21lO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCkpcHJlZGljYXRlPXVuZGVmaW5lZDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwKMykpfXZhciBzb3J0Qnk9YmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZXMpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuW107dmFyIGxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoO2lmKGxlbmd0aD4xJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLGl0ZXJhdGVlc1swXSxpdGVyYXRlZXNbMV0pKWl0ZXJhdGVlcz1bXTtlbHNlIGlmKGxlbmd0aD4yJiZpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0saXRlcmF0ZWVzWzFdLGl0ZXJhdGVlc1syXSkpaXRlcmF0ZWVzPVtpdGVyYXRlZXNbMF1dO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywxKSxbXSl9KTt2YXIgbm93PWN0eE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4gcm9vdC5EYXRlLm5vdygpfTtmdW5jdGlvbiBhZnRlcihuLGZ1bmMpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtuPXRvSW50ZWdlcihuKTsKcmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPDEpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBhcnkoZnVuYyxuLGd1YXJkKXtuPWd1YXJkP3VuZGVmaW5lZDpuO249ZnVuYyYmbj09bnVsbD9mdW5jLmxlbmd0aDpuO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9BUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsbil9ZnVuY3Rpb24gYmVmb3JlKG4sZnVuYyl7dmFyIHJlc3VsdDtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7bj10b0ludGVnZXIobik7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPjApcmVzdWx0PWZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG48PTEpZnVuYz11bmRlZmluZWQ7cmV0dXJuIHJlc3VsdH19dmFyIGJpbmQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyx0aGlzQXJnLHBhcnRpYWxzKXt2YXIgYml0bWFzaz1XUkFQX0JJTkRfRkxBRzsKaWYocGFydGlhbHMubGVuZ3RoKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIoYmluZCkpO2JpdG1hc2t8PVdSQVBfUEFSVElBTF9GTEFHfXJldHVybiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIGJpbmRLZXk9YmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LGtleSxwYXJ0aWFscyl7dmFyIGJpdG1hc2s9V1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHO2lmKHBhcnRpYWxzLmxlbmd0aCl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKGJpbmRLZXkpKTtiaXRtYXNrfD1XUkFQX1BBUlRJQUxfRkxBR31yZXR1cm4gY3JlYXRlV3JhcChrZXksYml0bWFzayxvYmplY3QscGFydGlhbHMsaG9sZGVycyl9KTtmdW5jdGlvbiBjdXJyeShmdW5jLGFyaXR5LGd1YXJkKXthcml0eT1ndWFyZD91bmRlZmluZWQ6YXJpdHk7dmFyIHJlc3VsdD1jcmVhdGVXcmFwKGZ1bmMsCldSQVBfQ1VSUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGFyaXR5KTtyZXN1bHQucGxhY2Vob2xkZXI9Y3VycnkucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsYXJpdHksZ3VhcmQpe2FyaXR5PWd1YXJkP3VuZGVmaW5lZDphcml0eTt2YXIgcmVzdWx0PWNyZWF0ZVdyYXAoZnVuYyxXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxhcml0eSk7cmVzdWx0LnBsYWNlaG9sZGVyPWN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBkZWJvdW5jZShmdW5jLHdhaXQsb3B0aW9ucyl7dmFyIGxhc3RBcmdzLGxhc3RUaGlzLG1heFdhaXQscmVzdWx0LHRpbWVySWQsbGFzdENhbGxUaW1lLGxhc3RJbnZva2VUaW1lPTAsbGVhZGluZz1mYWxzZSxtYXhpbmc9ZmFsc2UsdHJhaWxpbmc9dHJ1ZTsKaWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3dhaXQ9dG9OdW1iZXIod2FpdCl8fDA7aWYoaXNPYmplY3Qob3B0aW9ucykpe2xlYWRpbmc9ISFvcHRpb25zLmxlYWRpbmc7bWF4aW5nPSJtYXhXYWl0ImluIG9wdGlvbnM7bWF4V2FpdD1tYXhpbmc/bmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCl8fDAsd2FpdCk6bWF4V2FpdDt0cmFpbGluZz0idHJhaWxpbmciaW4gb3B0aW9ucz8hIW9wdGlvbnMudHJhaWxpbmc6dHJhaWxpbmd9ZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKXt2YXIgYXJncz1sYXN0QXJncyx0aGlzQXJnPWxhc3RUaGlzO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtsYXN0SW52b2tlVGltZT10aW1lO3Jlc3VsdD1mdW5jLmFwcGx5KHRoaXNBcmcsYXJncyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKXtsYXN0SW52b2tlVGltZT10aW1lO3RpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsCndhaXQpO3JldHVybiBsZWFkaW5nP2ludm9rZUZ1bmModGltZSk6cmVzdWx0fWZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSl7dmFyIHRpbWVTaW5jZUxhc3RDYWxsPXRpbWUtbGFzdENhbGxUaW1lLHRpbWVTaW5jZUxhc3RJbnZva2U9dGltZS1sYXN0SW52b2tlVGltZSx0aW1lV2FpdGluZz13YWl0LXRpbWVTaW5jZUxhc3RDYWxsO3JldHVybiBtYXhpbmc/bmF0aXZlTWluKHRpbWVXYWl0aW5nLG1heFdhaXQtdGltZVNpbmNlTGFzdEludm9rZSk6dGltZVdhaXRpbmd9ZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpe3ZhciB0aW1lU2luY2VMYXN0Q2FsbD10aW1lLWxhc3RDYWxsVGltZSx0aW1lU2luY2VMYXN0SW52b2tlPXRpbWUtbGFzdEludm9rZVRpbWU7cmV0dXJuIGxhc3RDYWxsVGltZT09PXVuZGVmaW5lZHx8dGltZVNpbmNlTGFzdENhbGw+PXdhaXR8fHRpbWVTaW5jZUxhc3RDYWxsPDB8fG1heGluZyYmdGltZVNpbmNlTGFzdEludm9rZT49bWF4V2FpdH1mdW5jdGlvbiB0aW1lckV4cGlyZWQoKXt2YXIgdGltZT0Kbm93KCk7aWYoc2hvdWxkSW52b2tlKHRpbWUpKXJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7dGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCxyZW1haW5pbmdXYWl0KHRpbWUpKX1mdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSl7dGltZXJJZD11bmRlZmluZWQ7aWYodHJhaWxpbmcmJmxhc3RBcmdzKXJldHVybiBpbnZva2VGdW5jKHRpbWUpO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNhbmNlbCgpe2lmKHRpbWVySWQhPT11bmRlZmluZWQpY2xlYXJUaW1lb3V0KHRpbWVySWQpO2xhc3RJbnZva2VUaW1lPTA7bGFzdEFyZ3M9bGFzdENhbGxUaW1lPWxhc3RUaGlzPXRpbWVySWQ9dW5kZWZpbmVkfWZ1bmN0aW9uIGZsdXNoKCl7cmV0dXJuIHRpbWVySWQ9PT11bmRlZmluZWQ/cmVzdWx0OnRyYWlsaW5nRWRnZShub3coKSl9ZnVuY3Rpb24gZGVib3VuY2VkKCl7dmFyIHRpbWU9bm93KCksaXNJbnZva2luZz1zaG91bGRJbnZva2UodGltZSk7Cmxhc3RBcmdzPWFyZ3VtZW50cztsYXN0VGhpcz10aGlzO2xhc3RDYWxsVGltZT10aW1lO2lmKGlzSW52b2tpbmcpe2lmKHRpbWVySWQ9PT11bmRlZmluZWQpcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7aWYobWF4aW5nKXt0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHdhaXQpO3JldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSl9fWlmKHRpbWVySWQ9PT11bmRlZmluZWQpdGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCx3YWl0KTtyZXR1cm4gcmVzdWx0fWRlYm91bmNlZC5jYW5jZWw9Y2FuY2VsO2RlYm91bmNlZC5mbHVzaD1mbHVzaDtyZXR1cm4gZGVib3VuY2VkfXZhciBkZWZlcj1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3JldHVybiBiYXNlRGVsYXkoZnVuYywxLGFyZ3MpfSk7dmFyIGRlbGF5PWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsd2FpdCxhcmdzKXtyZXR1cm4gYmFzZURlbGF5KGZ1bmMsdG9OdW1iZXIod2FpdCl8fDAsYXJncyl9KTsKZnVuY3Rpb24gZmxpcChmdW5jKXtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfRkxJUF9GTEFHKX1mdW5jdGlvbiBtZW1vaXplKGZ1bmMscmVzb2x2ZXIpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24ifHxyZXNvbHZlciE9bnVsbCYmdHlwZW9mIHJlc29sdmVyIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt2YXIgbWVtb2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsa2V5PXJlc29sdmVyP3Jlc29sdmVyLmFwcGx5KHRoaXMsYXJncyk6YXJnc1swXSxjYWNoZT1tZW1vaXplZC5jYWNoZTtpZihjYWNoZS5oYXMoa2V5KSlyZXR1cm4gY2FjaGUuZ2V0KGtleSk7dmFyIHJlc3VsdD1mdW5jLmFwcGx5KHRoaXMsYXJncyk7bWVtb2l6ZWQuY2FjaGU9Y2FjaGUuc2V0KGtleSxyZXN1bHQpfHxjYWNoZTtyZXR1cm4gcmVzdWx0fTttZW1vaXplZC5jYWNoZT1uZXcgKG1lbW9pemUuQ2FjaGV8fE1hcENhY2hlKTtyZXR1cm4gbWVtb2l6ZWR9Cm1lbW9pemUuQ2FjaGU9TWFwQ2FjaGU7ZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSl7aWYodHlwZW9mIHByZWRpY2F0ZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzO3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSk7Y2FzZSAyOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKX1yZXR1cm4hcHJlZGljYXRlLmFwcGx5KHRoaXMsYXJncyl9fWZ1bmN0aW9uIG9uY2UoZnVuYyl7cmV0dXJuIGJlZm9yZSgyLGZ1bmMpfXZhciBvdmVyQXJncz1jYXN0UmVzdChmdW5jdGlvbihmdW5jLHRyYW5zZm9ybXMpe3RyYW5zZm9ybXM9dHJhbnNmb3Jtcy5sZW5ndGg9PQoxJiZpc0FycmF5KHRyYW5zZm9ybXNbMF0pP2FycmF5TWFwKHRyYW5zZm9ybXNbMF0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTphcnJheU1hcChiYXNlRmxhdHRlbih0cmFuc2Zvcm1zLDEpLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7dmFyIGZ1bmNzTGVuZ3RoPXRyYW5zZm9ybXMubGVuZ3RoO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1pbihhcmdzLmxlbmd0aCxmdW5jc0xlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJnc1tpbmRleF09dHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLGFyZ3NbaW5kZXhdKTtyZXR1cm4gYXBwbHkoZnVuYyx0aGlzLGFyZ3MpfSl9KTt2YXIgcGFydGlhbD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHBhcnRpYWxzKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIocGFydGlhbCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX0ZMQUcsCnVuZGVmaW5lZCxwYXJ0aWFscyxob2xkZXJzKX0pO3ZhciBwYXJ0aWFsUmlnaHQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyxwYXJ0aWFscyl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIHJlYXJnPWZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsaW5kZXhlcyl7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1JFQVJHX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsaW5kZXhlcyl9KTtmdW5jdGlvbiByZXN0KGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09PXVuZGVmaW5lZD9zdGFydDp0b0ludGVnZXIoc3RhcnQpO3JldHVybiBiYXNlUmVzdChmdW5jLHN0YXJ0KX0KZnVuY3Rpb24gc3ByZWFkKGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09bnVsbD8wOm5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLDApO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgYXJyYXk9YXJnc1tzdGFydF0sb3RoZXJBcmdzPWNhc3RTbGljZShhcmdzLDAsc3RhcnQpO2lmKGFycmF5KWFycmF5UHVzaChvdGhlckFyZ3MsYXJyYXkpO3JldHVybiBhcHBseShmdW5jLHRoaXMsb3RoZXJBcmdzKX0pfWZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsd2FpdCxvcHRpb25zKXt2YXIgbGVhZGluZz10cnVlLHRyYWlsaW5nPXRydWU7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO2lmKGlzT2JqZWN0KG9wdGlvbnMpKXtsZWFkaW5nPSJsZWFkaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLmxlYWRpbmc6CmxlYWRpbmc7dHJhaWxpbmc9InRyYWlsaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLnRyYWlsaW5nOnRyYWlsaW5nfXJldHVybiBkZWJvdW5jZShmdW5jLHdhaXQseyJsZWFkaW5nIjpsZWFkaW5nLCJtYXhXYWl0Ijp3YWl0LCJ0cmFpbGluZyI6dHJhaWxpbmd9KX1mdW5jdGlvbiB1bmFyeShmdW5jKXtyZXR1cm4gYXJ5KGZ1bmMsMSl9ZnVuY3Rpb24gd3JhcCh2YWx1ZSx3cmFwcGVyKXtyZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksdmFsdWUpfWZ1bmN0aW9uIGNhc3RBcnJheSgpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltdO3ZhciB2YWx1ZT1hcmd1bWVudHNbMF07cmV0dXJuIGlzQXJyYXkodmFsdWUpP3ZhbHVlOlt2YWx1ZV19ZnVuY3Rpb24gY2xvbmUodmFsdWUpe3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfU1lNQk9MU19GTEFHKX1mdW5jdGlvbiBjbG9uZVdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09CiJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKXtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcpfWZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY29uZm9ybXNUbyhvYmplY3Qsc291cmNlKXtyZXR1cm4gc291cmNlPT1udWxsfHxiYXNlQ29uZm9ybXNUbyhvYmplY3Qsc291cmNlLGtleXMoc291cmNlKSl9ZnVuY3Rpb24gZXEodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT09PW90aGVyfHx2YWx1ZSE9PXZhbHVlJiYKb3RoZXIhPT1vdGhlcn12YXIgZ3Q9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlR3QpO3ZhciBndGU9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPj1vdGhlcn0pO3ZhciBpc0FyZ3VtZW50cz1iYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9iYXNlSXNBcmd1bWVudHM6ZnVuY3Rpb24odmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCJjYWxsZWUiKSYmIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsImNhbGxlZSIpfTt2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5O3ZhciBpc0FycmF5QnVmZmVyPW5vZGVJc0FycmF5QnVmZmVyP2Jhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcik6YmFzZUlzQXJyYXlCdWZmZXI7ZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmaXNMZW5ndGgodmFsdWUubGVuZ3RoKSYmCiFpc0Z1bmN0aW9uKHZhbHVlKX1mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmlzQXJyYXlMaWtlKHZhbHVlKX1mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpe3JldHVybiB2YWx1ZT09PXRydWV8fHZhbHVlPT09ZmFsc2V8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1ib29sVGFnfXZhciBpc0J1ZmZlcj1uYXRpdmVJc0J1ZmZlcnx8c3R1YkZhbHNlO3ZhciBpc0RhdGU9bm9kZUlzRGF0ZT9iYXNlVW5hcnkobm9kZUlzRGF0ZSk6YmFzZUlzRGF0ZTtmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZ2YWx1ZS5ub2RlVHlwZT09PTEmJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKXtpZih2YWx1ZT09bnVsbClyZXR1cm4gdHJ1ZTtpZihpc0FycmF5TGlrZSh2YWx1ZSkmJihpc0FycmF5KHZhbHVlKXx8dHlwZW9mIHZhbHVlPT0KInN0cmluZyJ8fHR5cGVvZiB2YWx1ZS5zcGxpY2U9PSJmdW5jdGlvbiJ8fGlzQnVmZmVyKHZhbHVlKXx8aXNUeXBlZEFycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpKSlyZXR1cm4hdmFsdWUubGVuZ3RoO3ZhciB0YWc9Z2V0VGFnKHZhbHVlKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIXZhbHVlLnNpemU7aWYoaXNQcm90b3R5cGUodmFsdWUpKXJldHVybiFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO2Zvcih2YXIga2V5IGluIHZhbHVlKWlmKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsa2V5KSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9ZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSxvdGhlcil7cmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyKX1mdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSxvdGhlcixjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3ZhciByZXN1bHQ9CmN1c3RvbWl6ZXI/Y3VzdG9taXplcih2YWx1ZSxvdGhlcik6dW5kZWZpbmVkO3JldHVybiByZXN1bHQ9PT11bmRlZmluZWQ/YmFzZUlzRXF1YWwodmFsdWUsb3RoZXIsdW5kZWZpbmVkLGN1c3RvbWl6ZXIpOiEhcmVzdWx0fWZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpe2lmKCFpc09iamVjdExpa2UodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PWVycm9yVGFnfHx0YWc9PWRvbUV4Y1RhZ3x8dHlwZW9mIHZhbHVlLm1lc3NhZ2U9PSJzdHJpbmciJiZ0eXBlb2YgdmFsdWUubmFtZT09InN0cmluZyImJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJm5hdGl2ZUlzRmluaXRlKHZhbHVlKX1mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKXtpZighaXNPYmplY3QodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PQpmdW5jVGFnfHx0YWc9PWdlblRhZ3x8dGFnPT1hc3luY1RhZ3x8dGFnPT1wcm94eVRhZ31mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJudW1iZXIiJiZ2YWx1ZT09dG9JbnRlZ2VyKHZhbHVlKX1mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTw9TUFYX1NBRkVfSU5URUdFUn1mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB2YWx1ZSE9bnVsbCYmKHR5cGU9PSJvYmplY3QifHx0eXBlPT0iZnVuY3Rpb24iKX1mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmdHlwZW9mIHZhbHVlPT0ib2JqZWN0In12YXIgaXNNYXA9bm9kZUlzTWFwP2Jhc2VVbmFyeShub2RlSXNNYXApOmJhc2VJc01hcDtmdW5jdGlvbiBpc01hdGNoKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3Q9PT0Kc291cmNlfHxiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLGdldE1hdGNoRGF0YShzb3VyY2UpKX1mdW5jdGlvbiBpc01hdGNoV2l0aChvYmplY3Qsc291cmNlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsZ2V0TWF0Y2hEYXRhKHNvdXJjZSksY3VzdG9taXplcil9ZnVuY3Rpb24gaXNOYU4odmFsdWUpe3JldHVybiBpc051bWJlcih2YWx1ZSkmJnZhbHVlIT0rdmFsdWV9ZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpe2lmKGlzTWFza2FibGUodmFsdWUpKXRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO3JldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpfWZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09bnVsbH1mdW5jdGlvbiBpc05pbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsfWZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0KIm51bWJlciJ8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1udW1iZXJUYWd9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSl7aWYoIWlzT2JqZWN0TGlrZSh2YWx1ZSl8fGJhc2VHZXRUYWcodmFsdWUpIT1vYmplY3RUYWcpcmV0dXJuIGZhbHNlO3ZhciBwcm90bz1nZXRQcm90b3R5cGUodmFsdWUpO2lmKHByb3RvPT09bnVsbClyZXR1cm4gdHJ1ZTt2YXIgQ3Rvcj1oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCJjb25zdHJ1Y3RvciIpJiZwcm90by5jb25zdHJ1Y3RvcjtyZXR1cm4gdHlwZW9mIEN0b3I9PSJmdW5jdGlvbiImJkN0b3IgaW5zdGFuY2VvZiBDdG9yJiZmdW5jVG9TdHJpbmcuY2FsbChDdG9yKT09b2JqZWN0Q3RvclN0cmluZ312YXIgaXNSZWdFeHA9bm9kZUlzUmVnRXhwP2Jhc2VVbmFyeShub2RlSXNSZWdFeHApOmJhc2VJc1JlZ0V4cDtmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSYmdmFsdWU+PQotTUFYX1NBRkVfSU5URUdFUiYmdmFsdWU8PU1BWF9TQUZFX0lOVEVHRVJ9dmFyIGlzU2V0PW5vZGVJc1NldD9iYXNlVW5hcnkobm9kZUlzU2V0KTpiYXNlSXNTZXQ7ZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzdHJpbmcifHwhaXNBcnJheSh2YWx1ZSkmJmlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1zdHJpbmdUYWd9ZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzeW1ib2wifHxpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09c3ltYm9sVGFnfXZhciBpc1R5cGVkQXJyYXk9bm9kZUlzVHlwZWRBcnJheT9iYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSk6YmFzZUlzVHlwZWRBcnJheTtmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkfWZ1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJgpnZXRUYWcodmFsdWUpPT13ZWFrTWFwVGFnfWZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT13ZWFrU2V0VGFnfXZhciBsdD1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7dmFyIGx0ZT1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU8PW90aGVyfSk7ZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSl7aWYoIXZhbHVlKXJldHVybltdO2lmKGlzQXJyYXlMaWtlKHZhbHVlKSlyZXR1cm4gaXNTdHJpbmcodmFsdWUpP3N0cmluZ1RvQXJyYXkodmFsdWUpOmNvcHlBcnJheSh2YWx1ZSk7aWYoc3ltSXRlcmF0b3ImJnZhbHVlW3N5bUl0ZXJhdG9yXSlyZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTt2YXIgdGFnPWdldFRhZyh2YWx1ZSksZnVuYz10YWc9PW1hcFRhZz9tYXBUb0FycmF5OnRhZz09c2V0VGFnP3NldFRvQXJyYXk6CnZhbHVlcztyZXR1cm4gZnVuYyh2YWx1ZSl9ZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpe2lmKCF2YWx1ZSlyZXR1cm4gdmFsdWU9PT0wP3ZhbHVlOjA7dmFsdWU9dG9OdW1iZXIodmFsdWUpO2lmKHZhbHVlPT09SU5GSU5JVFl8fHZhbHVlPT09LUlORklOSVRZKXt2YXIgc2lnbj12YWx1ZTwwPy0xOjE7cmV0dXJuIHNpZ24qTUFYX0lOVEVHRVJ9cmV0dXJuIHZhbHVlPT09dmFsdWU/dmFsdWU6MH1mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpe3ZhciByZXN1bHQ9dG9GaW5pdGUodmFsdWUpLHJlbWFpbmRlcj1yZXN1bHQlMTtyZXR1cm4gcmVzdWx0PT09cmVzdWx0P3JlbWFpbmRlcj9yZXN1bHQtcmVtYWluZGVyOnJlc3VsdDowfWZ1bmN0aW9uIHRvTGVuZ3RoKHZhbHVlKXtyZXR1cm4gdmFsdWU/YmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksMCxNQVhfQVJSQVlfTEVOR1RIKTowfWZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJudW1iZXIiKXJldHVybiB2YWx1ZTsKaWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47aWYoaXNPYmplY3QodmFsdWUpKXt2YXIgb3RoZXI9dHlwZW9mIHZhbHVlLnZhbHVlT2Y9PSJmdW5jdGlvbiI/dmFsdWUudmFsdWVPZigpOnZhbHVlO3ZhbHVlPWlzT2JqZWN0KG90aGVyKT9vdGhlcisiIjpvdGhlcn1pZih0eXBlb2YgdmFsdWUhPSJzdHJpbmciKXJldHVybiB2YWx1ZT09PTA/dmFsdWU6K3ZhbHVlO3ZhbHVlPXZhbHVlLnJlcGxhY2UocmVUcmltLCIiKTt2YXIgaXNCaW5hcnk9cmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtyZXR1cm4gaXNCaW5hcnl8fHJlSXNPY3RhbC50ZXN0KHZhbHVlKT9mcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksaXNCaW5hcnk/Mjo4KTpyZUlzQmFkSGV4LnRlc3QodmFsdWUpP05BTjordmFsdWV9ZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSl7cmV0dXJuIGNvcHlPYmplY3QodmFsdWUsa2V5c0luKHZhbHVlKSl9ZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSl7cmV0dXJuIHZhbHVlPwpiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwtTUFYX1NBRkVfSU5URUdFUixNQVhfU0FGRV9JTlRFR0VSKTp2YWx1ZT09PTA/dmFsdWU6MH1mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsPyIiOmJhc2VUb1N0cmluZyh2YWx1ZSl9dmFyIGFzc2lnbj1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlKXtpZihpc1Byb3RvdHlwZShzb3VyY2UpfHxpc0FycmF5TGlrZShzb3VyY2UpKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0KTtyZXR1cm59Zm9yKHZhciBrZXkgaW4gc291cmNlKWlmKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpYXNzaWduVmFsdWUob2JqZWN0LGtleSxzb3VyY2Vba2V5XSl9KTt2YXIgYXNzaWduSW49Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSl7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0KX0pO3ZhciBhc3NpZ25JbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LApzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcil7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGFzc2lnbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGF0PWZsYXRSZXN0KGJhc2VBdCk7ZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSxwcm9wZXJ0aWVzKXt2YXIgcmVzdWx0PWJhc2VDcmVhdGUocHJvdG90eXBlKTtyZXR1cm4gcHJvcGVydGllcz09bnVsbD9yZXN1bHQ6YmFzZUFzc2lnbihyZXN1bHQscHJvcGVydGllcyl9dmFyIGRlZmF1bHRzPWJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxzb3VyY2VzKXtvYmplY3Q9T2JqZWN0KG9iamVjdCk7dmFyIGluZGV4PS0xO3ZhciBsZW5ndGg9c291cmNlcy5sZW5ndGg7dmFyIGd1YXJkPWxlbmd0aD4yP3NvdXJjZXNbMl06CnVuZGVmaW5lZDtpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSxzb3VyY2VzWzFdLGd1YXJkKSlsZW5ndGg9MTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHNvdXJjZT1zb3VyY2VzW2luZGV4XTt2YXIgcHJvcHM9a2V5c0luKHNvdXJjZSk7dmFyIHByb3BzSW5kZXg9LTE7dmFyIHByb3BzTGVuZ3RoPXByb3BzLmxlbmd0aDt3aGlsZSgrK3Byb3BzSW5kZXg8cHJvcHNMZW5ndGgpe3ZhciBrZXk9cHJvcHNbcHJvcHNJbmRleF07dmFyIHZhbHVlPW9iamVjdFtrZXldO2lmKHZhbHVlPT09dW5kZWZpbmVkfHxlcSh2YWx1ZSxvYmplY3RQcm90b1trZXldKSYmIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpb2JqZWN0W2tleV09c291cmNlW2tleV19fXJldHVybiBvYmplY3R9KTt2YXIgZGVmYXVsdHNEZWVwPWJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe2FyZ3MucHVzaCh1bmRlZmluZWQsY3VzdG9tRGVmYXVsdHNNZXJnZSk7cmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwKdW5kZWZpbmVkLGFyZ3MpfSk7ZnVuY3Rpb24gZmluZEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duKX1mdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duUmlnaHQpfWZ1bmN0aW9uIGZvckluKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvcihvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksa2V5c0luKX1mdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvclJpZ2h0KG9iamVjdCxnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSxrZXlzSW4pfWZ1bmN0aW9uIGZvck93bihvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JPd24ob2JqZWN0LApnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSl9ZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yT3duUmlnaHQob2JqZWN0LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXMob2JqZWN0KSl9ZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXNJbihvYmplY3QpKX1mdW5jdGlvbiBnZXQob2JqZWN0LHBhdGgsZGVmYXVsdFZhbHVlKXt2YXIgcmVzdWx0PW9iamVjdD09bnVsbD91bmRlZmluZWQ6YmFzZUdldChvYmplY3QscGF0aCk7cmV0dXJuIHJlc3VsdD09PXVuZGVmaW5lZD9kZWZhdWx0VmFsdWU6cmVzdWx0fWZ1bmN0aW9uIGhhcyhvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdCE9bnVsbCYmaGFzUGF0aChvYmplY3QsCnBhdGgsYmFzZUhhcyl9ZnVuY3Rpb24gaGFzSW4ob2JqZWN0LHBhdGgpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc1BhdGgob2JqZWN0LHBhdGgsYmFzZUhhc0luKX12YXIgaW52ZXJ0PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7cmVzdWx0W3ZhbHVlXT1rZXl9LGNvbnN0YW50KGlkZW50aXR5KSk7dmFyIGludmVydEJ5PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsdmFsdWUpKXJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO2Vsc2UgcmVzdWx0W3ZhbHVlXT1ba2V5XX0sCmdldEl0ZXJhdGVlKTt2YXIgaW52b2tlPWJhc2VSZXN0KGJhc2VJbnZva2UpO2Z1bmN0aW9uIGtleXMob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCk6YmFzZUtleXMob2JqZWN0KX1mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCx0cnVlKTpiYXNlS2V5c0luKG9iamVjdCl9ZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyk7YmFzZUZvck93bihvYmplY3QsZnVuY3Rpb24odmFsdWUsa2V5LG9iamVjdCl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxpdGVyYXRlZSh2YWx1ZSxrZXksb2JqZWN0KSx2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpO2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe2Jhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LGl0ZXJhdGVlKHZhbHVlLGtleSxvYmplY3QpKX0pO3JldHVybiByZXN1bHR9dmFyIG1lcmdlPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgpe2Jhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4KX0pO3ZhciBtZXJnZVdpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtiYXNlTWVyZ2Uob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKX0pO3ZhciBvbWl0PWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7dmFyIHJlc3VsdD17fTtpZihvYmplY3Q9PW51bGwpcmV0dXJuIHJlc3VsdDt2YXIgaXNEZWVwPWZhbHNlO3BhdGhzPWFycmF5TWFwKHBhdGhzLGZ1bmN0aW9uKHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO2lzRGVlcHx8Cihpc0RlZXA9cGF0aC5sZW5ndGg+MSk7cmV0dXJuIHBhdGh9KTtjb3B5T2JqZWN0KG9iamVjdCxnZXRBbGxLZXlzSW4ob2JqZWN0KSxyZXN1bHQpO2lmKGlzRGVlcClyZXN1bHQ9YmFzZUNsb25lKHJlc3VsdCxDTE9ORV9ERUVQX0ZMQUd8Q0xPTkVfRkxBVF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21PbWl0Q2xvbmUpO3ZhciBsZW5ndGg9cGF0aHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKWJhc2VVbnNldChyZXN1bHQscGF0aHNbbGVuZ3RoXSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIG9taXRCeShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gcGlja0J5KG9iamVjdCxuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpfXZhciBwaWNrPWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7cmV0dXJuIG9iamVjdD09bnVsbD97fTpiYXNlUGljayhvYmplY3QscGF0aHMpfSk7ZnVuY3Rpb24gcGlja0J5KG9iamVjdCxwcmVkaWNhdGUpe2lmKG9iamVjdD09bnVsbClyZXR1cm57fTsKdmFyIHByb3BzPWFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLGZ1bmN0aW9uKHByb3Ape3JldHVybltwcm9wXX0pO3ByZWRpY2F0ZT1nZXRJdGVyYXRlZShwcmVkaWNhdGUpO3JldHVybiBiYXNlUGlja0J5KG9iamVjdCxwcm9wcyxmdW5jdGlvbih2YWx1ZSxwYXRoKXtyZXR1cm4gcHJlZGljYXRlKHZhbHVlLHBhdGhbMF0pfSl9ZnVuY3Rpb24gcmVzdWx0KG9iamVjdCxwYXRoLGRlZmF1bHRWYWx1ZSl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRoLmxlbmd0aDtpZighbGVuZ3RoKXtsZW5ndGg9MTtvYmplY3Q9dW5kZWZpbmVkfXdoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9b2JqZWN0PT1udWxsP3VuZGVmaW5lZDpvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtpZih2YWx1ZT09PXVuZGVmaW5lZCl7aW5kZXg9bGVuZ3RoO3ZhbHVlPWRlZmF1bHRWYWx1ZX1vYmplY3Q9aXNGdW5jdGlvbih2YWx1ZSk/dmFsdWUuY2FsbChvYmplY3QpOgp2YWx1ZX1yZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIHNldChvYmplY3QscGF0aCx2YWx1ZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSl9ZnVuY3Rpb24gc2V0V2l0aChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil9dmFyIHRvUGFpcnM9Y3JlYXRlVG9QYWlycyhrZXlzKTt2YXIgdG9QYWlyc0luPWNyZWF0ZVRvUGFpcnMoa2V5c0luKTtmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgaXNBcnI9aXNBcnJheShvYmplY3QpLGlzQXJyTGlrZT1pc0Fycnx8aXNCdWZmZXIob2JqZWN0KXx8aXNUeXBlZEFycmF5KG9iamVjdCk7aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjQpO2lmKGFjY3VtdWxhdG9yPT1udWxsKXt2YXIgQ3Rvcj1vYmplY3QmJm9iamVjdC5jb25zdHJ1Y3RvcjtpZihpc0Fyckxpa2UpYWNjdW11bGF0b3I9aXNBcnI/bmV3IEN0b3I6W107ZWxzZSBpZihpc09iamVjdChvYmplY3QpKWFjY3VtdWxhdG9yPWlzRnVuY3Rpb24oQ3Rvcik/YmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSk6e307ZWxzZSBhY2N1bXVsYXRvcj17fX0oaXNBcnJMaWtlP2FycmF5RWFjaDpiYXNlRm9yT3duKShvYmplY3QsZnVuY3Rpb24odmFsdWUsaW5kZXgsb2JqZWN0KXtyZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsb2JqZWN0KX0pO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiB1bnNldChvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdD09bnVsbD90cnVlOmJhc2VVbnNldChvYmplY3QscGF0aCl9ZnVuY3Rpb24gdXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VVcGRhdGUob2JqZWN0LApwYXRoLGNhc3RGdW5jdGlvbih1cGRhdGVyKSl9ZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QscGF0aCx1cGRhdGVyLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVVwZGF0ZShvYmplY3QscGF0aCxjYXN0RnVuY3Rpb24odXBkYXRlciksY3VzdG9taXplcil9ZnVuY3Rpb24gdmFsdWVzKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzKG9iamVjdCkpfWZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzSW4ob2JqZWN0KSl9ZnVuY3Rpb24gY2xhbXAobnVtYmVyLGxvd2VyLHVwcGVyKXtpZih1cHBlcj09PXVuZGVmaW5lZCl7dXBwZXI9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKHVwcGVyIT09dW5kZWZpbmVkKXt1cHBlcj0KdG9OdW1iZXIodXBwZXIpO3VwcGVyPXVwcGVyPT09dXBwZXI/dXBwZXI6MH1pZihsb3dlciE9PXVuZGVmaW5lZCl7bG93ZXI9dG9OdW1iZXIobG93ZXIpO2xvd2VyPWxvd2VyPT09bG93ZXI/bG93ZXI6MH1yZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksbG93ZXIsdXBwZXIpfWZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PXVuZGVmaW5lZCl7ZW5kPXN0YXJ0O3N0YXJ0PTB9ZWxzZSBlbmQ9dG9GaW5pdGUoZW5kKTtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtyZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gcmFuZG9tKGxvd2VyLHVwcGVyLGZsb2F0aW5nKXtpZihmbG9hdGluZyYmdHlwZW9mIGZsb2F0aW5nIT0iYm9vbGVhbiImJmlzSXRlcmF0ZWVDYWxsKGxvd2VyLHVwcGVyLGZsb2F0aW5nKSl1cHBlcj1mbG9hdGluZz11bmRlZmluZWQ7aWYoZmxvYXRpbmc9PT11bmRlZmluZWQpaWYodHlwZW9mIHVwcGVyPT0KImJvb2xlYW4iKXtmbG9hdGluZz11cHBlcjt1cHBlcj11bmRlZmluZWR9ZWxzZSBpZih0eXBlb2YgbG93ZXI9PSJib29sZWFuIil7ZmxvYXRpbmc9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKGxvd2VyPT09dW5kZWZpbmVkJiZ1cHBlcj09PXVuZGVmaW5lZCl7bG93ZXI9MDt1cHBlcj0xfWVsc2V7bG93ZXI9dG9GaW5pdGUobG93ZXIpO2lmKHVwcGVyPT09dW5kZWZpbmVkKXt1cHBlcj1sb3dlcjtsb3dlcj0wfWVsc2UgdXBwZXI9dG9GaW5pdGUodXBwZXIpfWlmKGxvd2VyPnVwcGVyKXt2YXIgdGVtcD1sb3dlcjtsb3dlcj11cHBlcjt1cHBlcj10ZW1wfWlmKGZsb2F0aW5nfHxsb3dlciUxfHx1cHBlciUxKXt2YXIgcmFuZD1uYXRpdmVSYW5kb20oKTtyZXR1cm4gbmF0aXZlTWluKGxvd2VyK3JhbmQqKHVwcGVyLWxvd2VyK2ZyZWVQYXJzZUZsb2F0KCIxZS0iKygocmFuZCsiIikubGVuZ3RoLTEpKSksdXBwZXIpfXJldHVybiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKX12YXIgY2FtZWxDYXNlPQpjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXt3b3JkPXdvcmQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcmVzdWx0KyhpbmRleD9jYXBpdGFsaXplKHdvcmQpOndvcmQpfSk7ZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpe3JldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gZGVidXJyKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmc3RyaW5nLnJlcGxhY2UocmVMYXRpbixkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssIiIpfWZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZyx0YXJnZXQscG9zaXRpb24pe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTt2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGg7cG9zaXRpb249cG9zaXRpb249PT11bmRlZmluZWQ/bGVuZ3RoOmJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLAowLGxlbmd0aCk7dmFyIGVuZD1wb3NpdGlvbjtwb3NpdGlvbi09dGFyZ2V0Lmxlbmd0aDtyZXR1cm4gcG9zaXRpb24+PTAmJnN0cmluZy5zbGljZShwb3NpdGlvbixlbmQpPT10YXJnZXR9ZnVuY3Rpb24gZXNjYXBlKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsZXNjYXBlSHRtbENoYXIpOnN0cmluZ31mdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc1JlZ0V4cENoYXIudGVzdChzdHJpbmcpP3N0cmluZy5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpOnN0cmluZ312YXIga2ViYWJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyItIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7CnZhciBsb3dlckNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt3b3JkLnRvTG93ZXJDYXNlKCl9KTt2YXIgbG93ZXJGaXJzdD1jcmVhdGVDYXNlRmlyc3QoInRvTG93ZXJDYXNlIik7ZnVuY3Rpb24gcGFkKHN0cmluZyxsZW5ndGgsY2hhcnMpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2xlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtpZighbGVuZ3RofHxzdHJMZW5ndGg+PWxlbmd0aClyZXR1cm4gc3RyaW5nO3ZhciBtaWQ9KGxlbmd0aC1zdHJMZW5ndGgpLzI7cmV0dXJuIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSxjaGFycykrc3RyaW5nK2NyZWF0ZVBhZGRpbmcobmF0aXZlQ2VpbChtaWQpLGNoYXJzKX1mdW5jdGlvbiBwYWRFbmQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7Cmxlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtyZXR1cm4gbGVuZ3RoJiZzdHJMZW5ndGg8bGVuZ3RoP3N0cmluZytjcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpOnN0cmluZ31mdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsbGVuZ3RoLGNoYXJzKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtsZW5ndGg9dG9JbnRlZ2VyKGxlbmd0aCk7dmFyIHN0ckxlbmd0aD1sZW5ndGg/c3RyaW5nU2l6ZShzdHJpbmcpOjA7cmV0dXJuIGxlbmd0aCYmc3RyTGVuZ3RoPGxlbmd0aD9jcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpK3N0cmluZzpzdHJpbmd9ZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLHJhZGl4LGd1YXJkKXtpZihndWFyZHx8cmFkaXg9PW51bGwpcmFkaXg9MDtlbHNlIGlmKHJhZGl4KXJhZGl4PStyYWRpeDtyZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LAoiIikscmFkaXh8fDApfWZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsbixndWFyZCl7aWYoZ3VhcmQ/aXNJdGVyYXRlZUNhbGwoc3RyaW5nLG4sZ3VhcmQpOm49PT11bmRlZmluZWQpbj0xO2Vsc2Ugbj10b0ludGVnZXIobik7cmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSxuKX1mdW5jdGlvbiByZXBsYWNlKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHN0cmluZz10b1N0cmluZyhhcmdzWzBdKTtyZXR1cm4gYXJncy5sZW5ndGg8Mz9zdHJpbmc6c3RyaW5nLnJlcGxhY2UoYXJnc1sxXSxhcmdzWzJdKX12YXIgc25ha2VDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyJfIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gc3BsaXQoc3RyaW5nLHNlcGFyYXRvcixsaW1pdCl7aWYobGltaXQmJnR5cGVvZiBsaW1pdCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0cmluZyxzZXBhcmF0b3IsbGltaXQpKXNlcGFyYXRvcj0KbGltaXQ9dW5kZWZpbmVkO2xpbWl0PWxpbWl0PT09dW5kZWZpbmVkP01BWF9BUlJBWV9MRU5HVEg6bGltaXQ+Pj4wO2lmKCFsaW1pdClyZXR1cm5bXTtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJih0eXBlb2Ygc2VwYXJhdG9yPT0ic3RyaW5nInx8c2VwYXJhdG9yIT1udWxsJiYhaXNSZWdFeHAoc2VwYXJhdG9yKSkpe3NlcGFyYXRvcj1iYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtpZighc2VwYXJhdG9yJiZoYXNVbmljb2RlKHN0cmluZykpcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksMCxsaW1pdCl9cmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsbGltaXQpfXZhciBzdGFydENhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt1cHBlckZpcnN0KHdvcmQpfSk7ZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsdGFyZ2V0LHBvc2l0aW9uKXtzdHJpbmc9CnRvU3RyaW5nKHN0cmluZyk7cG9zaXRpb249cG9zaXRpb249PW51bGw/MDpiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwwLHN0cmluZy5sZW5ndGgpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTtyZXR1cm4gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLHBvc2l0aW9uK3RhcmdldC5sZW5ndGgpPT10YXJnZXR9ZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpe3ZhciBzZXR0aW5ncz1sb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpKW9wdGlvbnM9dW5kZWZpbmVkO3N0cmluZz10b1N0cmluZyhzdHJpbmcpO29wdGlvbnM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMsc2V0dGluZ3MsY3VzdG9tRGVmYXVsdHNBc3NpZ25Jbik7dmFyIGltcG9ydHM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMuaW1wb3J0cyxzZXR0aW5ncy5pbXBvcnRzLGN1c3RvbURlZmF1bHRzQXNzaWduSW4pLGltcG9ydHNLZXlzPQprZXlzKGltcG9ydHMpLGltcG9ydHNWYWx1ZXM9YmFzZVZhbHVlcyhpbXBvcnRzLGltcG9ydHNLZXlzKTt2YXIgaXNFc2NhcGluZyxpc0V2YWx1YXRpbmcsaW5kZXg9MCxpbnRlcnBvbGF0ZT1vcHRpb25zLmludGVycG9sYXRlfHxyZU5vTWF0Y2gsc291cmNlPSJfX3AgK1x4M2QgJyI7dmFyIHJlRGVsaW1pdGVycz1SZWdFeHAoKG9wdGlvbnMuZXNjYXBlfHxyZU5vTWF0Y2gpLnNvdXJjZSsifCIraW50ZXJwb2xhdGUuc291cmNlKyJ8IisoaW50ZXJwb2xhdGU9PT1yZUludGVycG9sYXRlP3JlRXNUZW1wbGF0ZTpyZU5vTWF0Y2gpLnNvdXJjZSsifCIrKG9wdGlvbnMuZXZhbHVhdGV8fHJlTm9NYXRjaCkuc291cmNlKyJ8JCIsImciKTt2YXIgc291cmNlVVJMPSIvLyMgc291cmNlVVJMXHgzZCIrKCJzb3VyY2VVUkwiaW4gb3B0aW9ucz9vcHRpb25zLnNvdXJjZVVSTDoibG9kYXNoLnRlbXBsYXRlU291cmNlc1siKyArK3RlbXBsYXRlQ291bnRlcisiXSIpKyJcbiI7c3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLApmdW5jdGlvbihtYXRjaCxlc2NhcGVWYWx1ZSxpbnRlcnBvbGF0ZVZhbHVlLGVzVGVtcGxhdGVWYWx1ZSxldmFsdWF0ZVZhbHVlLG9mZnNldCl7aW50ZXJwb2xhdGVWYWx1ZXx8KGludGVycG9sYXRlVmFsdWU9ZXNUZW1wbGF0ZVZhbHVlKTtzb3VyY2UrPXN0cmluZy5zbGljZShpbmRleCxvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsZXNjYXBlU3RyaW5nQ2hhcik7aWYoZXNjYXBlVmFsdWUpe2lzRXNjYXBpbmc9dHJ1ZTtzb3VyY2UrPSInICtcbl9fZSgiK2VzY2FwZVZhbHVlKyIpICtcbicifWlmKGV2YWx1YXRlVmFsdWUpe2lzRXZhbHVhdGluZz10cnVlO3NvdXJjZSs9Iic7XG4iK2V2YWx1YXRlVmFsdWUrIjtcbl9fcCArXHgzZCAnIn1pZihpbnRlcnBvbGF0ZVZhbHVlKXNvdXJjZSs9IicgK1xuKChfX3QgXHgzZCAoIitpbnRlcnBvbGF0ZVZhbHVlKyIpKSBceDNkXHgzZCBudWxsID8gJycgOiBfX3QpICtcbiciO2luZGV4PW9mZnNldCttYXRjaC5sZW5ndGg7cmV0dXJuIG1hdGNofSk7CnNvdXJjZSs9Iic7XG4iO3ZhciB2YXJpYWJsZT1vcHRpb25zLnZhcmlhYmxlO2lmKCF2YXJpYWJsZSlzb3VyY2U9IndpdGggKG9iaikge1xuIitzb3VyY2UrIlxufVxuIjtzb3VyY2U9KGlzRXZhbHVhdGluZz9zb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywiIik6c291cmNlKS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsIiQxIikucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsIiQxOyIpO3NvdXJjZT0iZnVuY3Rpb24oIisodmFyaWFibGV8fCJvYmoiKSsiKSB7XG4iKyh2YXJpYWJsZT8iIjoib2JqIHx8IChvYmogXHgzZCB7fSk7XG4iKSsidmFyIF9fdCwgX19wIFx4M2QgJyciKyhpc0VzY2FwaW5nPyIsIF9fZSBceDNkIF8uZXNjYXBlIjoiIikrKGlzRXZhbHVhdGluZz8iLCBfX2ogXHgzZCBBcnJheS5wcm90b3R5cGUuam9pbjtcbiIrImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgK1x4M2QgX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrc291cmNlKwoicmV0dXJuIF9fcFxufSI7dmFyIHJlc3VsdD1hdHRlbXB0KGZ1bmN0aW9uKCl7cmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLHNvdXJjZVVSTCsicmV0dXJuICIrc291cmNlKS5hcHBseSh1bmRlZmluZWQsaW1wb3J0c1ZhbHVlcyl9KTtyZXN1bHQuc291cmNlPXNvdXJjZTtpZihpc0Vycm9yKHJlc3VsdCkpdGhyb3cgcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSl7cmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpe3JldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiB0cmltKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7CnZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxjaHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoY2hhcnMpLHN0YXJ0PWNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scykrMTtyZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsc3RhcnQsZW5kKS5qb2luKCIiKX1mdW5jdGlvbiB0cmltRW5kKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7dmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpKzE7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLAowLGVuZCkuam9pbigiIil9ZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsIiIpO2lmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpcmV0dXJuIHN0cmluZzt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyksc3RhcnQ9Y2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpO3JldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scyxzdGFydCkuam9pbigiIil9ZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLG9wdGlvbnMpe3ZhciBsZW5ndGg9REVGQVVMVF9UUlVOQ19MRU5HVEgsb21pc3Npb249REVGQVVMVF9UUlVOQ19PTUlTU0lPTjtpZihpc09iamVjdChvcHRpb25zKSl7dmFyIHNlcGFyYXRvcj0ic2VwYXJhdG9yImluIG9wdGlvbnM/Cm9wdGlvbnMuc2VwYXJhdG9yOnNlcGFyYXRvcjtsZW5ndGg9Imxlbmd0aCJpbiBvcHRpb25zP3RvSW50ZWdlcihvcHRpb25zLmxlbmd0aCk6bGVuZ3RoO29taXNzaW9uPSJvbWlzc2lvbiJpbiBvcHRpb25zP2Jhc2VUb1N0cmluZyhvcHRpb25zLm9taXNzaW9uKTpvbWlzc2lvbn1zdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTt2YXIgc3RyTGVuZ3RoPXN0cmluZy5sZW5ndGg7aWYoaGFzVW5pY29kZShzdHJpbmcpKXt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyk7c3RyTGVuZ3RoPXN0clN5bWJvbHMubGVuZ3RofWlmKGxlbmd0aD49c3RyTGVuZ3RoKXJldHVybiBzdHJpbmc7dmFyIGVuZD1sZW5ndGgtc3RyaW5nU2l6ZShvbWlzc2lvbik7aWYoZW5kPDEpcmV0dXJuIG9taXNzaW9uO3ZhciByZXN1bHQ9c3RyU3ltYm9scz9jYXN0U2xpY2Uoc3RyU3ltYm9scywwLGVuZCkuam9pbigiIik6c3RyaW5nLnNsaWNlKDAsZW5kKTtpZihzZXBhcmF0b3I9PT11bmRlZmluZWQpcmV0dXJuIHJlc3VsdCsKb21pc3Npb247aWYoc3RyU3ltYm9scyllbmQrPXJlc3VsdC5sZW5ndGgtZW5kO2lmKGlzUmVnRXhwKHNlcGFyYXRvcikpe2lmKHN0cmluZy5zbGljZShlbmQpLnNlYXJjaChzZXBhcmF0b3IpKXt2YXIgbWF0Y2gsc3Vic3RyaW5nPXJlc3VsdDtpZighc2VwYXJhdG9yLmdsb2JhbClzZXBhcmF0b3I9UmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpKyJnIik7c2VwYXJhdG9yLmxhc3RJbmRleD0wO3doaWxlKG1hdGNoPXNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpdmFyIG5ld0VuZD1tYXRjaC5pbmRleDtyZXN1bHQ9cmVzdWx0LnNsaWNlKDAsbmV3RW5kPT09dW5kZWZpbmVkP2VuZDpuZXdFbmQpfX1lbHNlIGlmKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLGVuZCkhPWVuZCl7dmFyIGluZGV4PXJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO2lmKGluZGV4Pi0xKXJlc3VsdD1yZXN1bHQuc2xpY2UoMCxpbmRleCl9cmV0dXJuIHJlc3VsdCsKb21pc3Npb259ZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLHVuZXNjYXBlSHRtbENoYXIpOnN0cmluZ312YXIgdXBwZXJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyIgIjoiIikrd29yZC50b1VwcGVyQ2FzZSgpfSk7dmFyIHVwcGVyRmlyc3Q9Y3JlYXRlQ2FzZUZpcnN0KCJ0b1VwcGVyQ2FzZSIpO2Z1bmN0aW9uIHdvcmRzKHN0cmluZyxwYXR0ZXJuLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtwYXR0ZXJuPWd1YXJkP3VuZGVmaW5lZDpwYXR0ZXJuO2lmKHBhdHRlcm49PT11bmRlZmluZWQpcmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZyk/dW5pY29kZVdvcmRzKHN0cmluZyk6YXNjaWlXb3JkcyhzdHJpbmcpO3JldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybil8fApbXX12YXIgYXR0ZW1wdD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3RyeXtyZXR1cm4gYXBwbHkoZnVuYyx1bmRlZmluZWQsYXJncyl9Y2F0Y2goZSl7cmV0dXJuIGlzRXJyb3IoZSk/ZTpuZXcgRXJyb3IoZSl9fSk7dmFyIGJpbmRBbGw9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LG1ldGhvZE5hbWVzKXthcnJheUVhY2gobWV0aG9kTmFtZXMsZnVuY3Rpb24oa2V5KXtrZXk9dG9LZXkoa2V5KTtiYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSxiaW5kKG9iamVjdFtrZXldLG9iamVjdCkpfSk7cmV0dXJuIG9iamVjdH0pO2Z1bmN0aW9uIGNvbmQocGFpcnMpe3ZhciBsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgsdG9JdGVyYXRlZT1nZXRJdGVyYXRlZSgpO3BhaXJzPSFsZW5ndGg/W106YXJyYXlNYXAocGFpcnMsZnVuY3Rpb24ocGFpcil7aWYodHlwZW9mIHBhaXJbMV0hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3JldHVyblt0b0l0ZXJhdGVlKHBhaXJbMF0pLApwYWlyWzFdXX0pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTE7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYWlyPXBhaXJzW2luZGV4XTtpZihhcHBseShwYWlyWzBdLHRoaXMsYXJncykpcmV0dXJuIGFwcGx5KHBhaXJbMV0sdGhpcyxhcmdzKX19KX1mdW5jdGlvbiBjb25mb3Jtcyhzb3VyY2Upe3JldHVybiBiYXNlQ29uZm9ybXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHZhbHVlfX1mdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsZGVmYXVsdFZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGx8fHZhbHVlIT09dmFsdWU/ZGVmYXVsdFZhbHVlOnZhbHVlfXZhciBmbG93PWNyZWF0ZUZsb3coKTt2YXIgZmxvd1JpZ2h0PWNyZWF0ZUZsb3codHJ1ZSk7ZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpe3JldHVybiB2YWx1ZX1mdW5jdGlvbiBpdGVyYXRlZShmdW5jKXtyZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jPT0KImZ1bmN0aW9uIj9mdW5jOmJhc2VDbG9uZShmdW5jLENMT05FX0RFRVBfRkxBRykpfWZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKXtyZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCxzcmNWYWx1ZSl7cmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCxiYXNlQ2xvbmUoc3JjVmFsdWUsQ0xPTkVfREVFUF9GTEFHKSl9dmFyIG1ldGhvZD1iYXNlUmVzdChmdW5jdGlvbihwYXRoLGFyZ3Mpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO3ZhciBtZXRob2RPZj1iYXNlUmVzdChmdW5jdGlvbihvYmplY3QsYXJncyl7cmV0dXJuIGZ1bmN0aW9uKHBhdGgpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO2Z1bmN0aW9uIG1peGluKG9iamVjdCxzb3VyY2Usb3B0aW9ucyl7dmFyIHByb3BzPWtleXMoc291cmNlKSwKbWV0aG9kTmFtZXM9YmFzZUZ1bmN0aW9ucyhzb3VyY2UscHJvcHMpO2lmKG9wdGlvbnM9PW51bGwmJiEoaXNPYmplY3Qoc291cmNlKSYmKG1ldGhvZE5hbWVzLmxlbmd0aHx8IXByb3BzLmxlbmd0aCkpKXtvcHRpb25zPXNvdXJjZTtzb3VyY2U9b2JqZWN0O29iamVjdD10aGlzO21ldGhvZE5hbWVzPWJhc2VGdW5jdGlvbnMoc291cmNlLGtleXMoc291cmNlKSl9dmFyIGNoYWluPSEoaXNPYmplY3Qob3B0aW9ucykmJiJjaGFpbiJpbiBvcHRpb25zKXx8ISFvcHRpb25zLmNoYWluLGlzRnVuYz1pc0Z1bmN0aW9uKG9iamVjdCk7YXJyYXlFYWNoKG1ldGhvZE5hbWVzLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe3ZhciBmdW5jPXNvdXJjZVttZXRob2ROYW1lXTtvYmplY3RbbWV0aG9kTmFtZV09ZnVuYztpZihpc0Z1bmMpb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciBjaGFpbkFsbD10aGlzLl9fY2hhaW5fXztpZihjaGFpbnx8Y2hhaW5BbGwpe3ZhciByZXN1bHQ9Cm9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxhY3Rpb25zPXJlc3VsdC5fX2FjdGlvbnNfXz1jb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7YWN0aW9ucy5wdXNoKHsiZnVuYyI6ZnVuYywiYXJncyI6YXJndW1lbnRzLCJ0aGlzQXJnIjpvYmplY3R9KTtyZXN1bHQuX19jaGFpbl9fPWNoYWluQWxsO3JldHVybiByZXN1bHR9cmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSxhcmd1bWVudHMpKX19KTtyZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIG5vQ29uZmxpY3QoKXtpZihyb290Ll89PT10aGlzKXJvb3QuXz1vbGREYXNoO3JldHVybiB0aGlzfWZ1bmN0aW9uIG5vb3AoKXt9ZnVuY3Rpb24gbnRoQXJnKG4pe249dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXtyZXR1cm4gYmFzZU50aChhcmdzLG4pfSl9dmFyIG92ZXI9Y3JlYXRlT3ZlcihhcnJheU1hcCk7dmFyIG92ZXJFdmVyeT1jcmVhdGVPdmVyKGFycmF5RXZlcnkpOwp2YXIgb3ZlclNvbWU9Y3JlYXRlT3ZlcihhcnJheVNvbWUpO2Z1bmN0aW9uIHByb3BlcnR5KHBhdGgpe3JldHVybiBpc0tleShwYXRoKT9iYXNlUHJvcGVydHkodG9LZXkocGF0aCkpOmJhc2VQcm9wZXJ0eURlZXAocGF0aCl9ZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihwYXRoKXtyZXR1cm4gb2JqZWN0PT1udWxsP3VuZGVmaW5lZDpiYXNlR2V0KG9iamVjdCxwYXRoKX19dmFyIHJhbmdlPWNyZWF0ZVJhbmdlKCk7dmFyIHJhbmdlUmlnaHQ9Y3JlYXRlUmFuZ2UodHJ1ZSk7ZnVuY3Rpb24gc3R1YkFycmF5KCl7cmV0dXJuW119ZnVuY3Rpb24gc3R1YkZhbHNlKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHN0dWJPYmplY3QoKXtyZXR1cm57fX1mdW5jdGlvbiBzdHViU3RyaW5nKCl7cmV0dXJuIiJ9ZnVuY3Rpb24gc3R1YlRydWUoKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiB0aW1lcyhuLGl0ZXJhdGVlKXtuPXRvSW50ZWdlcihuKTtpZihuPDF8fG4+TUFYX1NBRkVfSU5URUdFUilyZXR1cm5bXTsKdmFyIGluZGV4PU1BWF9BUlJBWV9MRU5HVEgsbGVuZ3RoPW5hdGl2ZU1pbihuLE1BWF9BUlJBWV9MRU5HVEgpO2l0ZXJhdGVlPWdldEl0ZXJhdGVlKGl0ZXJhdGVlKTtuLT1NQVhfQVJSQVlfTEVOR1RIO3ZhciByZXN1bHQ9YmFzZVRpbWVzKGxlbmd0aCxpdGVyYXRlZSk7d2hpbGUoKytpbmRleDxuKWl0ZXJhdGVlKGluZGV4KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGFycmF5TWFwKHZhbHVlLHRvS2V5KTtyZXR1cm4gaXNTeW1ib2wodmFsdWUpP1t2YWx1ZV06Y29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKX1mdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpe3ZhciBpZD0rK2lkQ291bnRlcjtyZXR1cm4gdG9TdHJpbmcocHJlZml4KStpZH12YXIgYWRkPWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLGFkZGVuZCl7cmV0dXJuIGF1Z2VuZCthZGRlbmR9LDApO3ZhciBjZWlsPWNyZWF0ZVJvdW5kKCJjZWlsIik7CnZhciBkaXZpZGU9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihkaXZpZGVuZCxkaXZpc29yKXtyZXR1cm4gZGl2aWRlbmQvZGl2aXNvcn0sMSk7dmFyIGZsb29yPWNyZWF0ZVJvdW5kKCJmbG9vciIpO2Z1bmN0aW9uIG1heChhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VHdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1heEJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUd0KTp1bmRlZmluZWR9ZnVuY3Rpb24gbWVhbihhcnJheSl7cmV0dXJuIGJhc2VNZWFuKGFycmF5LGlkZW50aXR5KX1mdW5jdGlvbiBtZWFuQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBiYXNlTWVhbihhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSl9ZnVuY3Rpb24gbWluKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD8KYmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VMdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1pbkJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUx0KTp1bmRlZmluZWR9dmFyIG11bHRpcGx5PWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obXVsdGlwbGllcixtdWx0aXBsaWNhbmQpe3JldHVybiBtdWx0aXBsaWVyKm11bHRpcGxpY2FuZH0sMSk7dmFyIHJvdW5kPWNyZWF0ZVJvdW5kKCJyb3VuZCIpO3ZhciBzdWJ0cmFjdD1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsc3VidHJhaGVuZCl7cmV0dXJuIG1pbnVlbmQtc3VidHJhaGVuZH0sMCk7ZnVuY3Rpb24gc3VtKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU3VtKGFycmF5LGlkZW50aXR5KTowfWZ1bmN0aW9uIHN1bUJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJgphcnJheS5sZW5ndGg/YmFzZVN1bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6MH1sb2Rhc2guYWZ0ZXI9YWZ0ZXI7bG9kYXNoLmFyeT1hcnk7bG9kYXNoLmFzc2lnbj1hc3NpZ247bG9kYXNoLmFzc2lnbkluPWFzc2lnbkluO2xvZGFzaC5hc3NpZ25JbldpdGg9YXNzaWduSW5XaXRoO2xvZGFzaC5hc3NpZ25XaXRoPWFzc2lnbldpdGg7bG9kYXNoLmF0PWF0O2xvZGFzaC5iZWZvcmU9YmVmb3JlO2xvZGFzaC5iaW5kPWJpbmQ7bG9kYXNoLmJpbmRBbGw9YmluZEFsbDtsb2Rhc2guYmluZEtleT1iaW5kS2V5O2xvZGFzaC5jYXN0QXJyYXk9Y2FzdEFycmF5O2xvZGFzaC5jaGFpbj1jaGFpbjtsb2Rhc2guY2h1bms9Y2h1bms7bG9kYXNoLmNvbXBhY3Q9Y29tcGFjdDtsb2Rhc2guY29uY2F0PWNvbmNhdDtsb2Rhc2guY29uZD1jb25kO2xvZGFzaC5jb25mb3Jtcz1jb25mb3Jtcztsb2Rhc2guY29uc3RhbnQ9Y29uc3RhbnQ7bG9kYXNoLmNvdW50Qnk9Y291bnRCeTtsb2Rhc2guY3JlYXRlPQpjcmVhdGU7bG9kYXNoLmN1cnJ5PWN1cnJ5O2xvZGFzaC5jdXJyeVJpZ2h0PWN1cnJ5UmlnaHQ7bG9kYXNoLmRlYm91bmNlPWRlYm91bmNlO2xvZGFzaC5kZWZhdWx0cz1kZWZhdWx0cztsb2Rhc2guZGVmYXVsdHNEZWVwPWRlZmF1bHRzRGVlcDtsb2Rhc2guZGVmZXI9ZGVmZXI7bG9kYXNoLmRlbGF5PWRlbGF5O2xvZGFzaC5kaWZmZXJlbmNlPWRpZmZlcmVuY2U7bG9kYXNoLmRpZmZlcmVuY2VCeT1kaWZmZXJlbmNlQnk7bG9kYXNoLmRpZmZlcmVuY2VXaXRoPWRpZmZlcmVuY2VXaXRoO2xvZGFzaC5kcm9wPWRyb3A7bG9kYXNoLmRyb3BSaWdodD1kcm9wUmlnaHQ7bG9kYXNoLmRyb3BSaWdodFdoaWxlPWRyb3BSaWdodFdoaWxlO2xvZGFzaC5kcm9wV2hpbGU9ZHJvcFdoaWxlO2xvZGFzaC5maWxsPWZpbGw7bG9kYXNoLmZpbHRlcj1maWx0ZXI7bG9kYXNoLmZsYXRNYXA9ZmxhdE1hcDtsb2Rhc2guZmxhdE1hcERlZXA9ZmxhdE1hcERlZXA7bG9kYXNoLmZsYXRNYXBEZXB0aD1mbGF0TWFwRGVwdGg7CmxvZGFzaC5mbGF0dGVuPWZsYXR0ZW47bG9kYXNoLmZsYXR0ZW5EZWVwPWZsYXR0ZW5EZWVwO2xvZGFzaC5mbGF0dGVuRGVwdGg9ZmxhdHRlbkRlcHRoO2xvZGFzaC5mbGlwPWZsaXA7bG9kYXNoLmZsb3c9Zmxvdztsb2Rhc2guZmxvd1JpZ2h0PWZsb3dSaWdodDtsb2Rhc2guZnJvbVBhaXJzPWZyb21QYWlycztsb2Rhc2guZnVuY3Rpb25zPWZ1bmN0aW9ucztsb2Rhc2guZnVuY3Rpb25zSW49ZnVuY3Rpb25zSW47bG9kYXNoLmdyb3VwQnk9Z3JvdXBCeTtsb2Rhc2guaW5pdGlhbD1pbml0aWFsO2xvZGFzaC5pbnRlcnNlY3Rpb249aW50ZXJzZWN0aW9uO2xvZGFzaC5pbnRlcnNlY3Rpb25CeT1pbnRlcnNlY3Rpb25CeTtsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aD1pbnRlcnNlY3Rpb25XaXRoO2xvZGFzaC5pbnZlcnQ9aW52ZXJ0O2xvZGFzaC5pbnZlcnRCeT1pbnZlcnRCeTtsb2Rhc2guaW52b2tlTWFwPWludm9rZU1hcDtsb2Rhc2guaXRlcmF0ZWU9aXRlcmF0ZWU7bG9kYXNoLmtleUJ5PQprZXlCeTtsb2Rhc2gua2V5cz1rZXlzO2xvZGFzaC5rZXlzSW49a2V5c0luO2xvZGFzaC5tYXA9bWFwO2xvZGFzaC5tYXBLZXlzPW1hcEtleXM7bG9kYXNoLm1hcFZhbHVlcz1tYXBWYWx1ZXM7bG9kYXNoLm1hdGNoZXM9bWF0Y2hlcztsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5PW1hdGNoZXNQcm9wZXJ0eTtsb2Rhc2gubWVtb2l6ZT1tZW1vaXplO2xvZGFzaC5tZXJnZT1tZXJnZTtsb2Rhc2gubWVyZ2VXaXRoPW1lcmdlV2l0aDtsb2Rhc2gubWV0aG9kPW1ldGhvZDtsb2Rhc2gubWV0aG9kT2Y9bWV0aG9kT2Y7bG9kYXNoLm1peGluPW1peGluO2xvZGFzaC5uZWdhdGU9bmVnYXRlO2xvZGFzaC5udGhBcmc9bnRoQXJnO2xvZGFzaC5vbWl0PW9taXQ7bG9kYXNoLm9taXRCeT1vbWl0Qnk7bG9kYXNoLm9uY2U9b25jZTtsb2Rhc2gub3JkZXJCeT1vcmRlckJ5O2xvZGFzaC5vdmVyPW92ZXI7bG9kYXNoLm92ZXJBcmdzPW92ZXJBcmdzO2xvZGFzaC5vdmVyRXZlcnk9b3ZlckV2ZXJ5O2xvZGFzaC5vdmVyU29tZT0Kb3ZlclNvbWU7bG9kYXNoLnBhcnRpYWw9cGFydGlhbDtsb2Rhc2gucGFydGlhbFJpZ2h0PXBhcnRpYWxSaWdodDtsb2Rhc2gucGFydGl0aW9uPXBhcnRpdGlvbjtsb2Rhc2gucGljaz1waWNrO2xvZGFzaC5waWNrQnk9cGlja0J5O2xvZGFzaC5wcm9wZXJ0eT1wcm9wZXJ0eTtsb2Rhc2gucHJvcGVydHlPZj1wcm9wZXJ0eU9mO2xvZGFzaC5wdWxsPXB1bGw7bG9kYXNoLnB1bGxBbGw9cHVsbEFsbDtsb2Rhc2gucHVsbEFsbEJ5PXB1bGxBbGxCeTtsb2Rhc2gucHVsbEFsbFdpdGg9cHVsbEFsbFdpdGg7bG9kYXNoLnB1bGxBdD1wdWxsQXQ7bG9kYXNoLnJhbmdlPXJhbmdlO2xvZGFzaC5yYW5nZVJpZ2h0PXJhbmdlUmlnaHQ7bG9kYXNoLnJlYXJnPXJlYXJnO2xvZGFzaC5yZWplY3Q9cmVqZWN0O2xvZGFzaC5yZW1vdmU9cmVtb3ZlO2xvZGFzaC5yZXN0PXJlc3Q7bG9kYXNoLnJldmVyc2U9cmV2ZXJzZTtsb2Rhc2guc2FtcGxlU2l6ZT1zYW1wbGVTaXplO2xvZGFzaC5zZXQ9c2V0O2xvZGFzaC5zZXRXaXRoPQpzZXRXaXRoO2xvZGFzaC5zaHVmZmxlPXNodWZmbGU7bG9kYXNoLnNsaWNlPXNsaWNlO2xvZGFzaC5zb3J0Qnk9c29ydEJ5O2xvZGFzaC5zb3J0ZWRVbmlxPXNvcnRlZFVuaXE7bG9kYXNoLnNvcnRlZFVuaXFCeT1zb3J0ZWRVbmlxQnk7bG9kYXNoLnNwbGl0PXNwbGl0O2xvZGFzaC5zcHJlYWQ9c3ByZWFkO2xvZGFzaC50YWlsPXRhaWw7bG9kYXNoLnRha2U9dGFrZTtsb2Rhc2gudGFrZVJpZ2h0PXRha2VSaWdodDtsb2Rhc2gudGFrZVJpZ2h0V2hpbGU9dGFrZVJpZ2h0V2hpbGU7bG9kYXNoLnRha2VXaGlsZT10YWtlV2hpbGU7bG9kYXNoLnRhcD10YXA7bG9kYXNoLnRocm90dGxlPXRocm90dGxlO2xvZGFzaC50aHJ1PXRocnU7bG9kYXNoLnRvQXJyYXk9dG9BcnJheTtsb2Rhc2gudG9QYWlycz10b1BhaXJzO2xvZGFzaC50b1BhaXJzSW49dG9QYWlyc0luO2xvZGFzaC50b1BhdGg9dG9QYXRoO2xvZGFzaC50b1BsYWluT2JqZWN0PXRvUGxhaW5PYmplY3Q7bG9kYXNoLnRyYW5zZm9ybT0KdHJhbnNmb3JtO2xvZGFzaC51bmFyeT11bmFyeTtsb2Rhc2gudW5pb249dW5pb247bG9kYXNoLnVuaW9uQnk9dW5pb25CeTtsb2Rhc2gudW5pb25XaXRoPXVuaW9uV2l0aDtsb2Rhc2gudW5pcT11bmlxO2xvZGFzaC51bmlxQnk9dW5pcUJ5O2xvZGFzaC51bmlxV2l0aD11bmlxV2l0aDtsb2Rhc2gudW5zZXQ9dW5zZXQ7bG9kYXNoLnVuemlwPXVuemlwO2xvZGFzaC51bnppcFdpdGg9dW56aXBXaXRoO2xvZGFzaC51cGRhdGU9dXBkYXRlO2xvZGFzaC51cGRhdGVXaXRoPXVwZGF0ZVdpdGg7bG9kYXNoLnZhbHVlcz12YWx1ZXM7bG9kYXNoLnZhbHVlc0luPXZhbHVlc0luO2xvZGFzaC53aXRob3V0PXdpdGhvdXQ7bG9kYXNoLndvcmRzPXdvcmRzO2xvZGFzaC53cmFwPXdyYXA7bG9kYXNoLnhvcj14b3I7bG9kYXNoLnhvckJ5PXhvckJ5O2xvZGFzaC54b3JXaXRoPXhvcldpdGg7bG9kYXNoLnppcD16aXA7bG9kYXNoLnppcE9iamVjdD16aXBPYmplY3Q7bG9kYXNoLnppcE9iamVjdERlZXA9CnppcE9iamVjdERlZXA7bG9kYXNoLnppcFdpdGg9emlwV2l0aDtsb2Rhc2guZW50cmllcz10b1BhaXJzO2xvZGFzaC5lbnRyaWVzSW49dG9QYWlyc0luO2xvZGFzaC5leHRlbmQ9YXNzaWduSW47bG9kYXNoLmV4dGVuZFdpdGg9YXNzaWduSW5XaXRoO21peGluKGxvZGFzaCxsb2Rhc2gpO2xvZGFzaC5hZGQ9YWRkO2xvZGFzaC5hdHRlbXB0PWF0dGVtcHQ7bG9kYXNoLmNhbWVsQ2FzZT1jYW1lbENhc2U7bG9kYXNoLmNhcGl0YWxpemU9Y2FwaXRhbGl6ZTtsb2Rhc2guY2VpbD1jZWlsO2xvZGFzaC5jbGFtcD1jbGFtcDtsb2Rhc2guY2xvbmU9Y2xvbmU7bG9kYXNoLmNsb25lRGVlcD1jbG9uZURlZXA7bG9kYXNoLmNsb25lRGVlcFdpdGg9Y2xvbmVEZWVwV2l0aDtsb2Rhc2guY2xvbmVXaXRoPWNsb25lV2l0aDtsb2Rhc2guY29uZm9ybXNUbz1jb25mb3Jtc1RvO2xvZGFzaC5kZWJ1cnI9ZGVidXJyO2xvZGFzaC5kZWZhdWx0VG89ZGVmYXVsdFRvO2xvZGFzaC5kaXZpZGU9ZGl2aWRlO2xvZGFzaC5lbmRzV2l0aD0KZW5kc1dpdGg7bG9kYXNoLmVxPWVxO2xvZGFzaC5lc2NhcGU9ZXNjYXBlO2xvZGFzaC5lc2NhcGVSZWdFeHA9ZXNjYXBlUmVnRXhwO2xvZGFzaC5ldmVyeT1ldmVyeTtsb2Rhc2guZmluZD1maW5kO2xvZGFzaC5maW5kSW5kZXg9ZmluZEluZGV4O2xvZGFzaC5maW5kS2V5PWZpbmRLZXk7bG9kYXNoLmZpbmRMYXN0PWZpbmRMYXN0O2xvZGFzaC5maW5kTGFzdEluZGV4PWZpbmRMYXN0SW5kZXg7bG9kYXNoLmZpbmRMYXN0S2V5PWZpbmRMYXN0S2V5O2xvZGFzaC5mbG9vcj1mbG9vcjtsb2Rhc2guZm9yRWFjaD1mb3JFYWNoO2xvZGFzaC5mb3JFYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5mb3JJbj1mb3JJbjtsb2Rhc2guZm9ySW5SaWdodD1mb3JJblJpZ2h0O2xvZGFzaC5mb3JPd249Zm9yT3duO2xvZGFzaC5mb3JPd25SaWdodD1mb3JPd25SaWdodDtsb2Rhc2guZ2V0PWdldDtsb2Rhc2guZ3Q9Z3Q7bG9kYXNoLmd0ZT1ndGU7bG9kYXNoLmhhcz1oYXM7bG9kYXNoLmhhc0luPWhhc0luOwpsb2Rhc2guaGVhZD1oZWFkO2xvZGFzaC5pZGVudGl0eT1pZGVudGl0eTtsb2Rhc2guaW5jbHVkZXM9aW5jbHVkZXM7bG9kYXNoLmluZGV4T2Y9aW5kZXhPZjtsb2Rhc2guaW5SYW5nZT1pblJhbmdlO2xvZGFzaC5pbnZva2U9aW52b2tlO2xvZGFzaC5pc0FyZ3VtZW50cz1pc0FyZ3VtZW50cztsb2Rhc2guaXNBcnJheT1pc0FycmF5O2xvZGFzaC5pc0FycmF5QnVmZmVyPWlzQXJyYXlCdWZmZXI7bG9kYXNoLmlzQXJyYXlMaWtlPWlzQXJyYXlMaWtlO2xvZGFzaC5pc0FycmF5TGlrZU9iamVjdD1pc0FycmF5TGlrZU9iamVjdDtsb2Rhc2guaXNCb29sZWFuPWlzQm9vbGVhbjtsb2Rhc2guaXNCdWZmZXI9aXNCdWZmZXI7bG9kYXNoLmlzRGF0ZT1pc0RhdGU7bG9kYXNoLmlzRWxlbWVudD1pc0VsZW1lbnQ7bG9kYXNoLmlzRW1wdHk9aXNFbXB0eTtsb2Rhc2guaXNFcXVhbD1pc0VxdWFsO2xvZGFzaC5pc0VxdWFsV2l0aD1pc0VxdWFsV2l0aDtsb2Rhc2guaXNFcnJvcj1pc0Vycm9yO2xvZGFzaC5pc0Zpbml0ZT0KaXNGaW5pdGU7bG9kYXNoLmlzRnVuY3Rpb249aXNGdW5jdGlvbjtsb2Rhc2guaXNJbnRlZ2VyPWlzSW50ZWdlcjtsb2Rhc2guaXNMZW5ndGg9aXNMZW5ndGg7bG9kYXNoLmlzTWFwPWlzTWFwO2xvZGFzaC5pc01hdGNoPWlzTWF0Y2g7bG9kYXNoLmlzTWF0Y2hXaXRoPWlzTWF0Y2hXaXRoO2xvZGFzaC5pc05hTj1pc05hTjtsb2Rhc2guaXNOYXRpdmU9aXNOYXRpdmU7bG9kYXNoLmlzTmlsPWlzTmlsO2xvZGFzaC5pc051bGw9aXNOdWxsO2xvZGFzaC5pc051bWJlcj1pc051bWJlcjtsb2Rhc2guaXNPYmplY3Q9aXNPYmplY3Q7bG9kYXNoLmlzT2JqZWN0TGlrZT1pc09iamVjdExpa2U7bG9kYXNoLmlzUGxhaW5PYmplY3Q9aXNQbGFpbk9iamVjdDtsb2Rhc2guaXNSZWdFeHA9aXNSZWdFeHA7bG9kYXNoLmlzU2FmZUludGVnZXI9aXNTYWZlSW50ZWdlcjtsb2Rhc2guaXNTZXQ9aXNTZXQ7bG9kYXNoLmlzU3RyaW5nPWlzU3RyaW5nO2xvZGFzaC5pc1N5bWJvbD1pc1N5bWJvbDtsb2Rhc2guaXNUeXBlZEFycmF5PQppc1R5cGVkQXJyYXk7bG9kYXNoLmlzVW5kZWZpbmVkPWlzVW5kZWZpbmVkO2xvZGFzaC5pc1dlYWtNYXA9aXNXZWFrTWFwO2xvZGFzaC5pc1dlYWtTZXQ9aXNXZWFrU2V0O2xvZGFzaC5qb2luPWpvaW47bG9kYXNoLmtlYmFiQ2FzZT1rZWJhYkNhc2U7bG9kYXNoLmxhc3Q9bGFzdDtsb2Rhc2gubGFzdEluZGV4T2Y9bGFzdEluZGV4T2Y7bG9kYXNoLmxvd2VyQ2FzZT1sb3dlckNhc2U7bG9kYXNoLmxvd2VyRmlyc3Q9bG93ZXJGaXJzdDtsb2Rhc2gubHQ9bHQ7bG9kYXNoLmx0ZT1sdGU7bG9kYXNoLm1heD1tYXg7bG9kYXNoLm1heEJ5PW1heEJ5O2xvZGFzaC5tZWFuPW1lYW47bG9kYXNoLm1lYW5CeT1tZWFuQnk7bG9kYXNoLm1pbj1taW47bG9kYXNoLm1pbkJ5PW1pbkJ5O2xvZGFzaC5zdHViQXJyYXk9c3R1YkFycmF5O2xvZGFzaC5zdHViRmFsc2U9c3R1YkZhbHNlO2xvZGFzaC5zdHViT2JqZWN0PXN0dWJPYmplY3Q7bG9kYXNoLnN0dWJTdHJpbmc9c3R1YlN0cmluZztsb2Rhc2guc3R1YlRydWU9CnN0dWJUcnVlO2xvZGFzaC5tdWx0aXBseT1tdWx0aXBseTtsb2Rhc2gubnRoPW50aDtsb2Rhc2gubm9Db25mbGljdD1ub0NvbmZsaWN0O2xvZGFzaC5ub29wPW5vb3A7bG9kYXNoLm5vdz1ub3c7bG9kYXNoLnBhZD1wYWQ7bG9kYXNoLnBhZEVuZD1wYWRFbmQ7bG9kYXNoLnBhZFN0YXJ0PXBhZFN0YXJ0O2xvZGFzaC5wYXJzZUludD1wYXJzZUludDtsb2Rhc2gucmFuZG9tPXJhbmRvbTtsb2Rhc2gucmVkdWNlPXJlZHVjZTtsb2Rhc2gucmVkdWNlUmlnaHQ9cmVkdWNlUmlnaHQ7bG9kYXNoLnJlcGVhdD1yZXBlYXQ7bG9kYXNoLnJlcGxhY2U9cmVwbGFjZTtsb2Rhc2gucmVzdWx0PXJlc3VsdDtsb2Rhc2gucm91bmQ9cm91bmQ7bG9kYXNoLnJ1bkluQ29udGV4dD1ydW5JbkNvbnRleHQ7bG9kYXNoLnNhbXBsZT1zYW1wbGU7bG9kYXNoLnNpemU9c2l6ZTtsb2Rhc2guc25ha2VDYXNlPXNuYWtlQ2FzZTtsb2Rhc2guc29tZT1zb21lO2xvZGFzaC5zb3J0ZWRJbmRleD1zb3J0ZWRJbmRleDtsb2Rhc2guc29ydGVkSW5kZXhCeT0Kc29ydGVkSW5kZXhCeTtsb2Rhc2guc29ydGVkSW5kZXhPZj1zb3J0ZWRJbmRleE9mO2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXg9c29ydGVkTGFzdEluZGV4O2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXhCeT1zb3J0ZWRMYXN0SW5kZXhCeTtsb2Rhc2guc29ydGVkTGFzdEluZGV4T2Y9c29ydGVkTGFzdEluZGV4T2Y7bG9kYXNoLnN0YXJ0Q2FzZT1zdGFydENhc2U7bG9kYXNoLnN0YXJ0c1dpdGg9c3RhcnRzV2l0aDtsb2Rhc2guc3VidHJhY3Q9c3VidHJhY3Q7bG9kYXNoLnN1bT1zdW07bG9kYXNoLnN1bUJ5PXN1bUJ5O2xvZGFzaC50ZW1wbGF0ZT10ZW1wbGF0ZTtsb2Rhc2gudGltZXM9dGltZXM7bG9kYXNoLnRvRmluaXRlPXRvRmluaXRlO2xvZGFzaC50b0ludGVnZXI9dG9JbnRlZ2VyO2xvZGFzaC50b0xlbmd0aD10b0xlbmd0aDtsb2Rhc2gudG9Mb3dlcj10b0xvd2VyO2xvZGFzaC50b051bWJlcj10b051bWJlcjtsb2Rhc2gudG9TYWZlSW50ZWdlcj10b1NhZmVJbnRlZ2VyO2xvZGFzaC50b1N0cmluZz0KdG9TdHJpbmc7bG9kYXNoLnRvVXBwZXI9dG9VcHBlcjtsb2Rhc2gudHJpbT10cmltO2xvZGFzaC50cmltRW5kPXRyaW1FbmQ7bG9kYXNoLnRyaW1TdGFydD10cmltU3RhcnQ7bG9kYXNoLnRydW5jYXRlPXRydW5jYXRlO2xvZGFzaC51bmVzY2FwZT11bmVzY2FwZTtsb2Rhc2gudW5pcXVlSWQ9dW5pcXVlSWQ7bG9kYXNoLnVwcGVyQ2FzZT11cHBlckNhc2U7bG9kYXNoLnVwcGVyRmlyc3Q9dXBwZXJGaXJzdDtsb2Rhc2guZWFjaD1mb3JFYWNoO2xvZGFzaC5lYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5maXJzdD1oZWFkO21peGluKGxvZGFzaCxmdW5jdGlvbigpe3ZhciBzb3VyY2U9e307YmFzZUZvck93bihsb2Rhc2gsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXtpZighaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLG1ldGhvZE5hbWUpKXNvdXJjZVttZXRob2ROYW1lXT1mdW5jfSk7cmV0dXJuIHNvdXJjZX0oKSx7ImNoYWluIjpmYWxzZX0pO2xvZGFzaC5WRVJTSU9OPQpWRVJTSU9OO2FycmF5RWFjaChbImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe2xvZGFzaFttZXRob2ROYW1lXS5wbGFjZWhvbGRlcj1sb2Rhc2h9KTthcnJheUVhY2goWyJkcm9wIiwidGFrZSJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbihuKXtuPW49PT11bmRlZmluZWQ/MTpuYXRpdmVNYXgodG9JbnRlZ2VyKG4pLDApO3ZhciByZXN1bHQ9dGhpcy5fX2ZpbHRlcmVkX18mJiFpbmRleD9uZXcgTGF6eVdyYXBwZXIodGhpcyk6dGhpcy5jbG9uZSgpO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18pcmVzdWx0Ll9fdGFrZUNvdW50X189bmF0aXZlTWluKG4scmVzdWx0Ll9fdGFrZUNvdW50X18pO2Vsc2UgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHsic2l6ZSI6bmF0aXZlTWluKG4sTUFYX0FSUkFZX0xFTkdUSCksCiJ0eXBlIjptZXRob2ROYW1lKyhyZXN1bHQuX19kaXJfXzwwPyJSaWdodCI6IiIpfSk7cmV0dXJuIHJlc3VsdH07TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUrIlJpZ2h0Il09ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKX19KTthcnJheUVhY2goWyJmaWx0ZXIiLCJtYXAiLCJ0YWtlV2hpbGUiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgdHlwZT1pbmRleCsxLGlzRmlsdGVyPXR5cGU9PUxBWllfRklMVEVSX0ZMQUd8fHR5cGU9PUxBWllfV0hJTEVfRkxBRztMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oaXRlcmF0ZWUpe3ZhciByZXN1bHQ9dGhpcy5jbG9uZSgpO3Jlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goeyJpdGVyYXRlZSI6Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksInR5cGUiOnR5cGV9KTtyZXN1bHQuX19maWx0ZXJlZF9fPXJlc3VsdC5fX2ZpbHRlcmVkX198fAppc0ZpbHRlcjtyZXR1cm4gcmVzdWx0fX0pO2FycmF5RWFjaChbImhlYWQiLCJsYXN0Il0sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7dmFyIHRha2VOYW1lPSJ0YWtlIisoaW5kZXg/IlJpZ2h0IjoiIik7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF19fSk7YXJyYXlFYWNoKFsiaW5pdGlhbCIsInRhaWwiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgZHJvcE5hbWU9ImRyb3AiKyhpbmRleD8iIjoiUmlnaHQiKTtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IExhenlXcmFwcGVyKHRoaXMpOnRoaXNbZHJvcE5hbWVdKDEpfX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKGlkZW50aXR5KX07TGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmQ9CmZ1bmN0aW9uKHByZWRpY2F0ZSl7cmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsYXJncyl7aWYodHlwZW9mIHBhdGg9PSJmdW5jdGlvbiIpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcih0aGlzKTtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpe3JldHVybiBiYXNlSW52b2tlKHZhbHVlLHBhdGgsYXJncyl9KX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKX07TGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHN0YXJ0LGVuZCl7c3RhcnQ9dG9JbnRlZ2VyKHN0YXJ0KTsKdmFyIHJlc3VsdD10aGlzO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18mJihzdGFydD4wfHxlbmQ8MCkpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO2lmKHN0YXJ0PDApcmVzdWx0PXJlc3VsdC50YWtlUmlnaHQoLXN0YXJ0KTtlbHNlIGlmKHN0YXJ0KXJlc3VsdD1yZXN1bHQuZHJvcChzdGFydCk7aWYoZW5kIT09dW5kZWZpbmVkKXtlbmQ9dG9JbnRlZ2VyKGVuZCk7cmVzdWx0PWVuZDwwP3Jlc3VsdC5kcm9wUmlnaHQoLWVuZCk6cmVzdWx0LnRha2UoZW5kLXN0YXJ0KX1yZXR1cm4gcmVzdWx0fTtMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoTUFYX0FSUkFZX0xFTkdUSCl9O2Jhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLApmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe3ZhciBjaGVja0l0ZXJhdGVlPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG1ldGhvZE5hbWUpLGlzVGFrZXI9L14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxsb2Rhc2hGdW5jPWxvZGFzaFtpc1Rha2VyPyJ0YWtlIisobWV0aG9kTmFtZT09Imxhc3QiPyJSaWdodCI6IiIpOm1ldGhvZE5hbWVdLHJldFVud3JhcHBlZD1pc1Rha2VyfHwvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7aWYoIWxvZGFzaEZ1bmMpcmV0dXJuO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgdmFsdWU9dGhpcy5fX3dyYXBwZWRfXyxhcmdzPWlzVGFrZXI/WzFdOmFyZ3VtZW50cyxpc0xhenk9dmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixpdGVyYXRlZT1hcmdzWzBdLHVzZUxhenk9aXNMYXp5fHxpc0FycmF5KHZhbHVlKTt2YXIgaW50ZXJjZXB0b3I9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9CmxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLGFycmF5UHVzaChbdmFsdWVdLGFyZ3MpKTtyZXR1cm4gaXNUYWtlciYmY2hhaW5BbGw/cmVzdWx0WzBdOnJlc3VsdH07aWYodXNlTGF6eSYmY2hlY2tJdGVyYXRlZSYmdHlwZW9mIGl0ZXJhdGVlPT0iZnVuY3Rpb24iJiZpdGVyYXRlZS5sZW5ndGghPTEpaXNMYXp5PXVzZUxhenk9ZmFsc2U7dmFyIGNoYWluQWxsPXRoaXMuX19jaGFpbl9fLGlzSHlicmlkPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsaXNVbndyYXBwZWQ9cmV0VW53cmFwcGVkJiYhY2hhaW5BbGwsb25seUxhenk9aXNMYXp5JiYhaXNIeWJyaWQ7aWYoIXJldFVud3JhcHBlZCYmdXNlTGF6eSl7dmFsdWU9b25seUxhenk/dmFsdWU6bmV3IExhenlXcmFwcGVyKHRoaXMpO3ZhciByZXN1bHQ9ZnVuYy5hcHBseSh2YWx1ZSxhcmdzKTtyZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsCmNoYWluQWxsKX1pZihpc1Vud3JhcHBlZCYmb25seUxhenkpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmdzKTtyZXN1bHQ9dGhpcy50aHJ1KGludGVyY2VwdG9yKTtyZXR1cm4gaXNVbndyYXBwZWQ/aXNUYWtlcj9yZXN1bHQudmFsdWUoKVswXTpyZXN1bHQudmFsdWUoKTpyZXN1bHR9fSk7YXJyYXlFYWNoKFsicG9wIiwicHVzaCIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSxmdW5jdGlvbihtZXRob2ROYW1lKXt2YXIgZnVuYz1hcnJheVByb3RvW21ldGhvZE5hbWVdLGNoYWluTmFtZT0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk/InRhcCI6InRocnUiLHJldFVud3JhcHBlZD0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7aWYocmV0VW53cmFwcGVkJiYhdGhpcy5fX2NoYWluX18pe3ZhciB2YWx1ZT10aGlzLnZhbHVlKCk7CnJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfXJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfSl9fSk7YmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXt2YXIgbG9kYXNoRnVuYz1sb2Rhc2hbbWV0aG9kTmFtZV07aWYobG9kYXNoRnVuYyl7dmFyIGtleT1sb2Rhc2hGdW5jLm5hbWUrIiIsbmFtZXM9cmVhbE5hbWVzW2tleV18fChyZWFsTmFtZXNba2V5XT1bXSk7bmFtZXMucHVzaCh7Im5hbWUiOm1ldGhvZE5hbWUsImZ1bmMiOmxvZGFzaEZ1bmN9KX19KTtyZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCxXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdPVt7Im5hbWUiOiJ3cmFwcGVyIiwiZnVuYyI6dW5kZWZpbmVkfV07TGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lPWxhenlDbG9uZTsKTGF6eVdyYXBwZXIucHJvdG90eXBlLnJldmVyc2U9bGF6eVJldmVyc2U7TGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlPWxhenlWYWx1ZTtsb2Rhc2gucHJvdG90eXBlLmF0PXdyYXBwZXJBdDtsb2Rhc2gucHJvdG90eXBlLmNoYWluPXdyYXBwZXJDaGFpbjtsb2Rhc2gucHJvdG90eXBlLmNvbW1pdD13cmFwcGVyQ29tbWl0O2xvZGFzaC5wcm90b3R5cGUubmV4dD13cmFwcGVyTmV4dDtsb2Rhc2gucHJvdG90eXBlLnBsYW50PXdyYXBwZXJQbGFudDtsb2Rhc2gucHJvdG90eXBlLnJldmVyc2U9d3JhcHBlclJldmVyc2U7bG9kYXNoLnByb3RvdHlwZS50b0pTT049bG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mPWxvZGFzaC5wcm90b3R5cGUudmFsdWU9d3JhcHBlclZhbHVlO2xvZGFzaC5wcm90b3R5cGUuZmlyc3Q9bG9kYXNoLnByb3RvdHlwZS5oZWFkO2lmKHN5bUl0ZXJhdG9yKWxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdPXdyYXBwZXJUb0l0ZXJhdG9yO3JldHVybiBsb2Rhc2h9Owp2YXIgXz1ydW5JbkNvbnRleHQoKTtpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZGVmaW5lLmFtZD09Im9iamVjdCImJmRlZmluZS5hbWQpe3Jvb3QuXz1fO2RlZmluZShmdW5jdGlvbigpe3JldHVybiBffSl9ZWxzZSBpZihmcmVlTW9kdWxlKXsoZnJlZU1vZHVsZS5leHBvcnRzPV8pLl89XztmcmVlRXhwb3J0cy5fPV99ZWxzZSByb290Ll89X30pLmNhbGwodGhpcyk7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1zb3J0aW5nL3NvcnRpbmcuanMKdmFyIHJjOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChrLHQpe2xldCBsOyhmdW5jdGlvbihtKXttW20uTkFUVVJBTD0wXT0iTkFUVVJBTCI7bVttLlJFQUw9MV09IlJFQUwiO21bbS5FWFBPTkVOVF9TSUdOPTJdPSJFWFBPTkVOVF9TSUdOIjttW20uRVhQT05FTlQ9M109IkVYUE9ORU5UIn0pKGx8fChsPXt9KSk7bGV0IHA9bC5OQVRVUkFMO2Zvcig7dDxrLmxlbmd0aDt0KyspaWYocD09PWwuTkFUVVJBTClpZigiLiI9PT1rW3RdKXA9bC5SRUFMO2Vsc2UgaWYoImUiPT09a1t0XXx8IkUiPT09a1t0XSlwPWwuRVhQT05FTlRfU0lHTjtlbHNle2lmKCFmKGtbdF0pKWJyZWFrfWVsc2UgaWYocD09PWwuUkVBTClpZigiZSI9PT1rW3RdfHwiRSI9PT1rW3RdKXA9bC5FWFBPTkVOVF9TSUdOO2Vsc2V7aWYoIWYoa1t0XSkpYnJlYWt9ZWxzZSBpZihwPT09bC5FWFBPTkVOVF9TSUdOKWlmKGYoa1t0XSl8fCIrIj09PWtbdF18fCItIj09PWtbdF0pcD1sLkVYUE9ORU5UO2Vsc2UgYnJlYWs7ZWxzZSBpZihwPT09bC5FWFBPTkVOVCYmCiFmKGtbdF0pKWJyZWFrO3JldHVybiB0fWZ1bmN0aW9uIGYoayl7cmV0dXJuIjAiPD1rJiYiOSI+PWt9ZnVuY3Rpb24gaChrKXtyZXR1cm4iLyI9PT1rfHwiXyI9PT1rfHxmKGspfWIuY29tcGFyZVRhZ05hbWVzPWZ1bmN0aW9uKGssdCl7bGV0IGw9MCxwPTA7Zm9yKDs7KXtpZihsPT09ay5sZW5ndGgpcmV0dXJuIHA9PT10Lmxlbmd0aD8wOi0xO2lmKHA9PT10Lmxlbmd0aClyZXR1cm4gMTtpZihmKGtbbF0pJiZmKHRbcF0pKXt2YXIgbT1sLG49cDtsPWQoayxsKzEpO3A9ZCh0LHArMSk7bT1wYXJzZUZsb2F0KGsuc2xpY2UobSxsKSk7bj1wYXJzZUZsb2F0KHQuc2xpY2UobixwKSk7aWYobTxuKXJldHVybi0xO2lmKG0+bilyZXR1cm4gMX1lbHNle2lmKGgoa1tsXSkpe2lmKCFoKHRbcF0pKXJldHVybi0xfWVsc2V7aWYoaCh0W3BdKSlyZXR1cm4gMTtpZihrW2xdPHRbcF0pcmV0dXJuLTE7aWYoa1tsXT50W3BdKXJldHVybiAxfWwrKztwKyt9fX19KShyY3x8KHJjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9yZXF1ZXN0TWFuYWdlci5qcwp2YXIgdmM7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHEsdSx4LEEpe2NvbnN0IHk9bmV3IFhNTEh0dHBSZXF1ZXN0O3kub3BlbihxLHUpO3gmJih5LndpdGhDcmVkZW50aWFscz14KTtBJiZ5LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsQSk7cmV0dXJuIHl9ZnVuY3Rpb24gZihxKXtjb25zdCB1PW5ldyBtO2lmKCFxKXJldHVybiB1Lm1ldGhvZFR5cGU9cC5HRVQsdTt1Lm1ldGhvZFR5cGU9cC5QT1NUO3UuYm9keT1oKHEpO3JldHVybiB1fWZ1bmN0aW9uIGgocSl7Y29uc3QgdT1uZXcgRm9ybURhdGE7Zm9yKGxldCB4IGluIHEpeCYmdS5hcHBlbmQoeCxxW3hdKTtyZXR1cm4gdX1jbGFzcyBrIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMubmFtZT0iUmVxdWVzdENhbmNlbGxhdGlvbkVycm9yIn19Yi5SZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3I9aztjbGFzcyB0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IocSl7c3VwZXIocSk7dGhpcy5uYW1lPQoiSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3IiO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQucHJvdG90eXBlKX19Yi5JbnZhbGlkUmVxdWVzdE9wdGlvbnNFcnJvcj10O2NsYXNzIGwgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihxLHUpe3N1cGVyKCk7dGhpcy5tZXNzYWdlPWBSZXF1ZXN0TmV0d29ya0Vycm9yOiAke3Euc3RhdHVzfSBhdCAke3V9YDt0aGlzLm5hbWU9IlJlcXVlc3ROZXR3b3JrRXJyb3IiO3RoaXMucmVxPXE7dGhpcy51cmw9dX19Yi5SZXF1ZXN0TmV0d29ya0Vycm9yPWw7bGV0IHA7KGZ1bmN0aW9uKHEpe3EuR0VUPSJHRVQiO3EuUE9TVD0iUE9TVCJ9KShwPWIuSHR0cE1ldGhvZFR5cGV8fChiLkh0dHBNZXRob2RUeXBlPXt9KSk7Y2xhc3MgbXt2YWxpZGF0ZSgpe2lmKHRoaXMubWV0aG9kVHlwZT09PXAuR0VUJiZ0aGlzLmJvZHkpdGhyb3cgbmV3IHQoImJvZHkgbXVzdCBiZSBtaXNzaW5nIGZvciBhIEdFVCByZXF1ZXN0LiIpO319Yi5SZXF1ZXN0T3B0aW9ucz0KbTtjbGFzcyBue2NvbnN0cnVjdG9yKHE9MUUzLHU9Myl7dGhpcy5fcXVldWU9W107dGhpcy5fbkFjdGl2ZVJlcXVlc3RzPTA7dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzPXE7dGhpcy5fbWF4UmV0cmllcz11fXJlcXVlc3QocSx1KXt1PWYodSk7cmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKHEsdSl9cmVxdWVzdFdpdGhPcHRpb25zKHEsdSl7dS52YWxpZGF0ZSgpO3JldHVybihuZXcgUHJvbWlzZSgoeCxBKT0+e3RoaXMuX3F1ZXVlLnB1c2goe3Jlc29sdmU6eCxyZWplY3Q6QX0pO3RoaXMubGF1bmNoUmVxdWVzdHMoKX0pKS50aGVuKCgpPT50aGlzLnByb21pc2VXaXRoUmV0cmllcyhxLHRoaXMuX21heFJldHJpZXMsdSkpLnRoZW4oeD0+e3RoaXMuX25BY3RpdmVSZXF1ZXN0cy0tO3RoaXMubGF1bmNoUmVxdWVzdHMoKTtyZXR1cm4geH0seD0+eyJSZXF1ZXN0TmV0d29ya0Vycm9yIj09PXgubmFtZSYmKHRoaXMuX25BY3RpdmVSZXF1ZXN0cy0tLHRoaXMubGF1bmNoUmVxdWVzdHMoKSk7CnJldHVybiBQcm9taXNlLnJlamVjdCh4KX0pfWZldGNoKHEsdSl7cmV0dXJuKG5ldyBQcm9taXNlKCh4LEEpPT57dGhpcy5fcXVldWUucHVzaCh7cmVzb2x2ZTp4LHJlamVjdDpBfSk7dGhpcy5sYXVuY2hSZXF1ZXN0cygpfSkpLnRoZW4oKCk9PntsZXQgeD0xO3JldHVybiBuZXcgUHJvbWlzZShBPT57Y29uc3QgeT0oKT0+e2ZldGNoKHEsdSkudGhlbih3PT57IXcub2smJnRoaXMuX21heFJldHJpZXM+eD8oeCsrLHkoKSk6KEEodyksdGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS0sdGhpcy5sYXVuY2hSZXF1ZXN0cygpKX0pfTt5KCl9KX0pfWNsZWFyUXVldWUoKXtmb3IoOzA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9xdWV1ZS5wb3AoKS5yZWplY3QobmV3IGsoIlJlcXVlc3QgY2FuY2VsbGVkIGJ5IGNsZWFyUXVldWUiKSl9YWN0aXZlUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzfW91dHN0YW5kaW5nUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKwp0aGlzLl9xdWV1ZS5sZW5ndGh9bGF1bmNoUmVxdWVzdHMoKXtmb3IoO3RoaXMuX25BY3RpdmVSZXF1ZXN0czx0aGlzLl9uU2ltdWx0YW5lb3VzUmVxdWVzdHMmJjA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9uQWN0aXZlUmVxdWVzdHMrKyx0aGlzLl9xdWV1ZS5wb3AoKS5yZXNvbHZlKCl9cHJvbWlzZVdpdGhSZXRyaWVzKHEsdSx4KXtyZXR1cm4gdGhpcy5fcHJvbWlzZUZyb21VcmwocSx4KS50aGVuKEE9PkEsQT0+MDx1P3RoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHEsdS0xLHgpOlByb21pc2UucmVqZWN0KEEpKX1fcHJvbWlzZUZyb21VcmwocSx1KXtyZXR1cm4gbmV3IFByb21pc2UoKHgsQSk9Pntjb25zdCB5PWQodS5tZXRob2RUeXBlLHEsdS53aXRoQ3JlZGVudGlhbHMsdS5jb250ZW50VHlwZSk7eS5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PT15LnN0YXR1cz94KEpTT04ucGFyc2UoeS5yZXNwb25zZVRleHQpKTpBKG5ldyBsKHkscSkpfTt5Lm9uZXJyb3I9ZnVuY3Rpb24oKXtBKG5ldyBsKHksCnEpKX07dS5ib2R5P3kuc2VuZCh1LmJvZHkpOnkuc2VuZCgpfSl9fWIuUmVxdWVzdE1hbmFnZXI9bn0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3VybFBhdGhIZWxwZXJzLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZikucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5Iil9Yi5hZGRQYXJhbXM9ZnVuY3Rpb24oZixoKXt2YXIgaz1PYmplY3Qua2V5cyhoKS5zb3J0KCkuZmlsdGVyKGw9PnZvaWQgMCE9PWhbbF0pO2lmKCFrLmxlbmd0aClyZXR1cm4gZjtjb25zdCB0PS0xIT09Zi5pbmRleE9mKCI/Iik/Ilx4MjYiOiI/IjtrPVtdLmNvbmNhdCguLi5rLm1hcChsPT57Y29uc3QgcD1oW2xdO3JldHVybihBcnJheS5pc0FycmF5KHApP3A6W3BdKS5tYXAobT0+YCR7bH09JHtkKG0pfWApfSkpLmpvaW4oIlx4MjYiKTtyZXR1cm4gZit0K2t9fSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcm91dGVyLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHQ9ImRhdGEiLGw9bmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSl7Ii8iPT09dFt0Lmxlbmd0aC0xXSYmKHQ9dC5zbGljZSgwLHQubGVuZ3RoLTEpKTtyZXR1cm57ZW52aXJvbm1lbnQ6KCk9PmYodCwiL2Vudmlyb25tZW50IiksZXhwZXJpbWVudHM6KCk9PmYodCwiL2V4cGVyaW1lbnRzIikscGx1Z2luUm91dGU6KHAsbSxuKT0+Zih0KyIvcGx1Z2luIixgLyR7cH0ke219YCxuKSxwbHVnaW5zTGlzdGluZzooKT0+Zih0LCIvcGx1Z2luc19saXN0aW5nIixoKHtbImV4cGVyaW1lbnRhbFBsdWdpbiJdOmwuZ2V0QWxsKCJleHBlcmltZW50YWxQbHVnaW4iKX0pKSxydW5zOigpPT5mKHQsIi9ydW5zIikscnVuc0ZvckV4cGVyaW1lbnQ6cD0+Zih0LCIvZXhwZXJpbWVudF9ydW5zIixoKHtleHBlcmltZW50OlN0cmluZyhwKX0pKX19ZnVuY3Rpb24gZih0LGwscD1uZXcgVVJMU2VhcmNoUGFyYW1zKXt0Kz1sO1N0cmluZyhwKSYmCihsPWwuaW5jbHVkZXMoIj8iKT8iXHgyNiI6Ij8iLHQrPWwrU3RyaW5nKHApKTtyZXR1cm4gdH1mdW5jdGlvbiBoKHQ9e30pe2NvbnN0IGw9T2JqZWN0LmtleXModCkuc29ydCgpLmZpbHRlcihtPT50W21dKSxwPW5ldyBVUkxTZWFyY2hQYXJhbXM7bC5mb3JFYWNoKG09Pntjb25zdCBuPXRbbV07KEFycmF5LmlzQXJyYXkobik/bjpbbl0pLmZvckVhY2gocT0+cC5hcHBlbmQobSxxKSl9KTtyZXR1cm4gcH1sZXQgaz1kKCk7Yi5jcmVhdGVSb3V0ZXI9ZDtiLmdldFJvdXRlcj1mdW5jdGlvbigpe3JldHVybiBrfTtiLnNldFJvdXRlcj1mdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IEVycm9yKCJSb3V0ZXIgcmVxdWlyZWQsIGJ1dCBnb3Q6ICIrdCk7az10fTtiLmNyZWF0ZVNlYXJjaFBhcmFtPWh9KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9iYXNlU3RvcmUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3IoaCl7dGhpcy5saXN0ZW5lcj1ofX1iLkxpc3RlbktleT1kO2NsYXNzIGZ7Y29uc3RydWN0b3IoKXt0aGlzLnJlcXVlc3RNYW5hZ2VyPW5ldyBiLlJlcXVlc3RNYW5hZ2VyKDEpO3RoaXMuX2xpc3RlbmVycz1uZXcgU2V0O3RoaXMuaW5pdGlhbGl6ZWQ9ITF9cmVmcmVzaCgpe3JldHVybiB0aGlzLmxvYWQoKS50aGVuKCgpPT57dGhpcy5pbml0aWFsaXplZD0hMH0pfWFkZExpc3RlbmVyKGgpe2g9bmV3IGQoaCk7dGhpcy5fbGlzdGVuZXJzLmFkZChoKTtyZXR1cm4gaH1yZW1vdmVMaXN0ZW5lckJ5S2V5KGgpe3RoaXMuX2xpc3RlbmVycy5kZWxldGUoaCl9ZW1pdENoYW5nZSgpe3RoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGg9Pnt0cnl7aC5saXN0ZW5lcigpfWNhdGNoKGspe319KX19Yi5CYXNlU3RvcmU9Zn0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2Vudmlyb25tZW50U3RvcmUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBiLkJhc2VTdG9yZXtsb2FkKCl7Y29uc3QgZj1iLmdldFJvdXRlcigpLmVudmlyb25tZW50KCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9Pntjb25zdCBrPXtkYXRhTG9jYXRpb246aC5kYXRhX2xvY2F0aW9uLHdpbmRvd1RpdGxlOmgud2luZG93X3RpdGxlfTt2b2lkIDAhPT1oLmV4cGVyaW1lbnRfbmFtZSYmKGsuZXhwZXJpbWVudE5hbWU9aC5leHBlcmltZW50X25hbWUpO3ZvaWQgMCE9PWguZXhwZXJpbWVudF9kZXNjcmlwdGlvbiYmKGsuZXhwZXJpbWVudERlc2NyaXB0aW9uPWguZXhwZXJpbWVudF9kZXNjcmlwdGlvbik7dm9pZCAwIT09aC5jcmVhdGlvbl90aW1lJiYoay5jcmVhdGlvblRpbWU9aC5jcmVhdGlvbl90aW1lKTtfLmlzRXF1YWwodGhpcy5lbnZpcm9ubWVudCxrKXx8KHRoaXMuZW52aXJvbm1lbnQ9ayx0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXREYXRhTG9jYXRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD8KdGhpcy5lbnZpcm9ubWVudC5kYXRhTG9jYXRpb246IiJ9Z2V0V2luZG93VGl0bGUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LndpbmRvd1RpdGxlOiIifWdldEV4cGVyaW1lbnROYW1lKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5leHBlcmltZW50TmFtZToiIn1nZXRFeHBlcmltZW50RGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmV4cGVyaW1lbnREZXNjcmlwdGlvbjoiIn1nZXRDcmVhdGlvblRpbWUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmNyZWF0aW9uVGltZTpudWxsfX1iLkVudmlyb25tZW50U3RvcmU9ZDtiLmVudmlyb25tZW50U3RvcmU9bmV3IGR9KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9leHBlcmltZW50c1N0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX2V4cGVyaW1lbnRzPVtdfWxvYWQoKXtjb25zdCBmPWIuZ2V0Um91dGVyKCkuZXhwZXJpbWVudHMoKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGYpLnRoZW4oaD0+e18uaXNFcXVhbCh0aGlzLl9leHBlcmltZW50cyxoKXx8KHRoaXMuX2V4cGVyaW1lbnRzPWgsdGhpcy5lbWl0Q2hhbmdlKCkpfSl9Z2V0RXhwZXJpbWVudHMoKXtyZXR1cm4gdGhpcy5fZXhwZXJpbWVudHMuc2xpY2UoKX19Yi5FeHBlcmltZW50c1N0b3JlPWQ7Yi5leHBlcmltZW50c1N0b3JlPW5ldyBkfSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcnVuc1N0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX3J1bnM9W119bG9hZCgpe2NvbnN0IGY9Yi5nZXRSb3V0ZXIoKS5ydW5zKCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9PntfLmlzRXF1YWwodGhpcy5fcnVucyxoKXx8KHRoaXMuX3J1bnM9aCx0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXRSdW5zKCl7cmV0dXJuIHRoaXMuX3J1bnMuc2xpY2UoKX19Yi5SdW5zU3RvcmU9ZDtiLnJ1bnNTdG9yZT1uZXcgZH0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2JhY2tlbmQuanMKKGZ1bmN0aW9uKGIpe2IuVFlQRVM9W107Yi5nZXRSdW5zTmFtZWQ9ZnVuY3Rpb24oZCl7cmV0dXJuIF8ua2V5cyhkKS5zb3J0KHJjLmNvbXBhcmVUYWdOYW1lcyl9O2IuZ2V0VGFncz1mdW5jdGlvbihkKXtyZXR1cm4gXy51bmlvbi5hcHBseShudWxsLF8udmFsdWVzKGQpKS5zb3J0KHJjLmNvbXBhcmVUYWdOYW1lcyl9O2IuZmlsdGVyVGFncz1mdW5jdGlvbihkLGYpe2xldCBoPVtdO2YuZm9yRWFjaChrPT5oPWguY29uY2F0KGRba10pKTtyZXR1cm4gXy51bmlxKGgpLnNvcnQocmMuY29tcGFyZVRhZ05hbWVzKX19KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9jYW5jZWxsZXIuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLmNhbmNlbGxhdGlvbkNvdW50PTB9Y2FuY2VsbGFibGUoZil7Y29uc3QgaD10aGlzLmNhbmNlbGxhdGlvbkNvdW50O3JldHVybiBrPT5mKHt2YWx1ZTprLGNhbmNlbGxlZDp0aGlzLmNhbmNlbGxhdGlvbkNvdW50IT09aH0pfWNhbmNlbEFsbCgpe3RoaXMuY2FuY2VsbGF0aW9uQ291bnQrK319Yi5DYW5jZWxsZXI9ZH0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3RmLWJhY2tlbmQtcG9seW1lci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLWJhY2tlbmQiLF90ZW1wbGF0ZTpudWxsLHRmX2JhY2tlbmQ6Yn0pfSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNhdGVnb3JpemF0aW9uLXV0aWxzL2NhdGVnb3JpemF0aW9uVXRpbHMuanMKdmFyICRjOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChtLG4pe2NvbnN0IHE9KCgpPT57dHJ5e3JldHVybiBuZXcgUmVnRXhwKG4pfWNhdGNoKHUpe3JldHVybiBudWxsfX0pKCk7cmV0dXJue25hbWU6bixtZXRhZGF0YTp7dHlwZTpwLlNFQVJDSF9SRVNVTFRTLHZhbGlkUmVnZXg6ISFxLHVuaXZlcnNhbFJlZ2V4OiIuKiI9PT1ufSxpdGVtczpxP20uZmlsdGVyKHU9PnUubWF0Y2gocSkpOltdfX1mdW5jdGlvbiBmKG0sbj0iLyIpe2NvbnN0IHE9W10sdT17fTttLmZvckVhY2goeD0+e3ZhciBBPXguaW5kZXhPZihuKTtBPTA8PUE/eC5zbGljZSgwLEEpOng7aWYoIXVbQV0pe2NvbnN0IHk9e25hbWU6QSxtZXRhZGF0YTp7dHlwZTpwLlBSRUZJWF9HUk9VUH0saXRlbXM6W119O3VbQV09eTtxLnB1c2goeSl9dVtBXS5pdGVtcy5wdXNoKHgpfSk7cmV0dXJuIHF9ZnVuY3Rpb24gaChtLG49IiIpe249W2QobSxuKV07bT1mKG0pO3JldHVybltdLmNvbmNhdChuLG0pfWZ1bmN0aW9uIGsobSxuLHEpe2NvbnN0IHU9CnZjLmdldFRhZ3MobSk7cT1oKHUscSk7Y29uc3QgeD10KF8ucGljayhtLG4pKTtyZXR1cm4gcS5tYXAoKHtuYW1lOkEsbWV0YWRhdGE6eSxpdGVtczp3fSk9Pih7bmFtZTpBLG1ldGFkYXRhOnksaXRlbXM6dy5tYXAoQz0+KHt0YWc6QyxydW5zOih4LmdldChDKXx8W10pLnNsaWNlKCl9KSl9KSl9ZnVuY3Rpb24gdChtKXtjb25zdCBuPW5ldyBNYXA7T2JqZWN0LmtleXMobSkuZm9yRWFjaChxPT57bVtxXS5mb3JFYWNoKHU9Pntjb25zdCB4PW4uZ2V0KHUpfHxbXTt4LnB1c2gocSk7bi5zZXQodSx4KX0pfSk7cmV0dXJuIG59ZnVuY3Rpb24gbChtLG4pe2NvbnN0IHE9cmMuY29tcGFyZVRhZ05hbWVzKG0udGFnLG4udGFnKTtyZXR1cm4gMCE9cT9xOnJjLmNvbXBhcmVUYWdOYW1lcyhtLnJ1bixuLnJ1bil9bGV0IHA7KGZ1bmN0aW9uKG0pe21bbS5TRUFSQ0hfUkVTVUxUUz0wXT0iU0VBUkNIX1JFU1VMVFMiO21bbS5QUkVGSVhfR1JPVVA9MV09IlBSRUZJWF9HUk9VUCJ9KShwPWIuQ2F0ZWdvcnlUeXBlfHwKKGIuQ2F0ZWdvcnlUeXBlPXt9KSk7Yi5jYXRlZ29yaXplQnlTZWFyY2hRdWVyeT1kO2IuY2F0ZWdvcml6ZUJ5UHJlZml4PWY7Yi5jYXRlZ29yaXplPWg7Yi5jYXRlZ29yaXplVGFncz1rO2IuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucz1mdW5jdGlvbihtLG4scSl7cmV0dXJuIGsobSxuLHEpLm1hcChmdW5jdGlvbih1KXtjb25zdCB4PV8uZmxhdHRlbih1Lml0ZW1zLm1hcCgoe3RhZzpBLHJ1bnM6eX0pPT55Lm1hcCh3PT4oe3RhZzpBLHJ1bjp3fSkpKSk7eC5zb3J0KGwpO3JldHVybntuYW1lOnUubmFtZSxtZXRhZGF0YTp1Lm1ldGFkYXRhLGl0ZW1zOnh9fSl9fSkoJGN8fCgkYz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdsb2JhbHMvZ2xvYmFscy5qcwp2YXIgYWQ7KGZ1bmN0aW9uKGIpe2xldCBkPSExO2Iuc2V0VXNlSGFzaD1mdW5jdGlvbihoKXtkPWh9O2IudXNlSGFzaD1mdW5jdGlvbigpe3JldHVybiBkfTtsZXQgZj0iIjtiLnNldEZha2VIYXNoPWZ1bmN0aW9uKGgpe2Y9aH07Yi5nZXRGYWtlSGFzaD1mdW5jdGlvbigpe3JldHVybiBmfX0pKGFkfHwoYWQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1nbG9iYWxzL2dsb2JhbHMtcG9seW1lci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLWdsb2JhbHMiLF90ZW1wbGF0ZTpudWxsLHRmX2dsb2JhbHM6Yn0pfSkoYWR8fChhZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXN0b3JhZ2UvbGlzdGVuZXJzLmpzCnZhciBwZDsKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3Ioayl7dGhpcy5saXN0ZW5lcj1rfX1iLkxpc3RlbktleT1kO2NvbnN0IGY9bmV3IFNldCxoPW5ldyBTZXQ7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCgpPT57Zi5mb3JFYWNoKGs9PmsubGlzdGVuZXIoKSl9KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic3RvcmFnZSIsKCk9PntoLmZvckVhY2goaz0+ay5saXN0ZW5lcigpKX0pO2IuYWRkSGFzaExpc3RlbmVyPWZ1bmN0aW9uKGspe2s9bmV3IGQoayk7Zi5hZGQoayk7cmV0dXJuIGt9O2IuYWRkU3RvcmFnZUxpc3RlbmVyPWZ1bmN0aW9uKGspe2s9bmV3IGQoayk7aC5hZGQoayk7cmV0dXJuIGt9O2IuZmlyZVN0b3JhZ2VDaGFuZ2VkPWZ1bmN0aW9uKCl7aC5mb3JFYWNoKGs9PmsubGlzdGVuZXIoKSl9O2IucmVtb3ZlSGFzaExpc3RlbmVyQnlLZXk9ZnVuY3Rpb24oayl7Zi5kZWxldGUoayl9O2IucmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXk9ZnVuY3Rpb24oayl7aC5kZWxldGUoayl9fSkocGR8fAoocGQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zdG9yYWdlL3N0b3JhZ2UuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobixxKXtmdW5jdGlvbiB1KHcsQz17fSl7Y29uc3Qge2RlZmF1bHRWYWx1ZTpHLHVzZUxvY2FsU3RvcmFnZTpEPSExfT1DO3c9RD93aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odyk6bChoKCkpW3ddO3JldHVybiB2b2lkIDA9PXc/Xy5jbG9uZURlZXAoRyk6bih3KX1mdW5jdGlvbiB4KHcsQyxHPXt9KXtjb25zdCB7ZGVmYXVsdFZhbHVlOkQsdXNlTG9jYWxTdG9yYWdlOkI9ITEsdXNlTG9jYXRpb25SZXBsYWNlOkk9ITF9PUc7Rz1xKEMpO0I/KHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh3LEcpLGIuZmlyZVN0b3JhZ2VDaGFuZ2VkKCkpOl8uaXNFcXVhbChDLHUodyx7dXNlTG9jYWxTdG9yYWdlOkJ9KSl8fChfLmlzRXF1YWwoQyxEKT9wKHcpOihDPWwoaCgpKSxDW3ddPUcsayh0KEMpLEkpKSl9Y29uc3QgQT1bXSx5PVtdO3JldHVybntnZXQ6dSxzZXQ6eCxnZXRJbml0aWFsaXplcjpmdW5jdGlvbih3LEMpe2NvbnN0IEc9T2JqZWN0LmFzc2lnbih7ZGVmYXVsdFZhbHVlOkMuZGVmYXVsdFZhbHVlLApwb2x5bWVyUHJvcGVydHk6dyx1c2VMb2NhbFN0b3JhZ2U6ITF9LEMpO3JldHVybiBmdW5jdGlvbigpe2NvbnN0IEQ9Zih0aGlzLHcpLEI9KCk9Pntjb25zdCBOPXUoRCxHKTtfLmlzRXF1YWwoTix0aGlzW0cucG9seW1lclByb3BlcnR5XSl8fCh0aGlzW0cucG9seW1lclByb3BlcnR5XT1OKX0sST0oRy51c2VMb2NhbFN0b3JhZ2U/Yi5hZGRTdG9yYWdlTGlzdGVuZXI6Yi5hZGRIYXNoTGlzdGVuZXIpKCgpPT5CKCkpO0cudXNlTG9jYWxTdG9yYWdlP3kucHVzaChJKTpBLnB1c2goSSk7QigpO3JldHVybiB0aGlzW0cucG9seW1lclByb3BlcnR5XX19LGdldE9ic2VydmVyOmZ1bmN0aW9uKHcsQyl7Y29uc3QgRz1PYmplY3QuYXNzaWduKHtkZWZhdWx0VmFsdWU6Qy5kZWZhdWx0VmFsdWUscG9seW1lclByb3BlcnR5OncsdXNlTG9jYWxTdG9yYWdlOiExfSxDKTtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBEPWYodGhpcyx3KTt4KEQsdGhpc1tHLnBvbHltZXJQcm9wZXJ0eV0sRyl9fSxkaXNwb3NlQmluZGluZzpmdW5jdGlvbigpe0EuZm9yRWFjaCh3PT4KYi5yZW1vdmVIYXNoTGlzdGVuZXJCeUtleSh3KSk7eS5mb3JFYWNoKHc9PmIucmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXkodykpfX19ZnVuY3Rpb24gZihuLHEpe249bltiLkRJU0FNQklHVUFUT1JdO3JldHVybihudWxsPT1uP1txXTpbbixxXSkuam9pbigiLiIpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gYWQudXNlSGFzaCgpP3dpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpOmFkLmdldEZha2VIYXNoKCl9ZnVuY3Rpb24gayhuLHE9ITEpe2FkLnVzZUhhc2goKT9xP3dpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCIjIituKTp3aW5kb3cubG9jYXRpb24uaGFzaD1uOmFkLnNldEZha2VIYXNoKG4pfWZ1bmN0aW9uIHQobil7bGV0IHE9IiI7dm9pZCAwIT09bltiLlRBQl0mJihxKz1uW2IuVEFCXSk7Y29uc3QgdT1PYmplY3Qua2V5cyhuKS5tYXAoeD0+W3gsblt4XV0pLmZpbHRlcih4PT54WzBdIT09Yi5UQUIpLm1hcCh4PT5lbmNvZGVVUklDb21wb25lbnQoeFswXSkrIlx4M2QiK2VuY29kZVVSSUNvbXBvbmVudCh4WzFdKSkuam9pbigiXHgyNiIpOwpyZXR1cm4gMDx1Lmxlbmd0aD9xKyJceDI2Iit1OnF9ZnVuY3Rpb24gbChuKXtjb25zdCBxPXt9O24uc3BsaXQoIlx4MjYiKS5mb3JFYWNoKHU9Pnt1PXUuc3BsaXQoIlx4M2QiKTsxPT09dS5sZW5ndGg/cVtiLlRBQl09dVswXToyPT09dS5sZW5ndGgmJihxW2RlY29kZVVSSUNvbXBvbmVudCh1WzBdKV09ZGVjb2RlVVJJQ29tcG9uZW50KHVbMV0pKX0pO3JldHVybiBxfWZ1bmN0aW9uIHAobil7Y29uc3QgcT1sKGgoKSk7ZGVsZXRlIHFbbl07ayh0KHEpKX1iLlRBQj0iX190YWJfXyI7Yi5ESVNBTUJJR1VBVE9SPSJkaXNhbWJpZ3VhdG9yIjtiLnVybERpY3Q9bChoKCkpO2IuYWRkSGFzaExpc3RlbmVyKCgpPT57Yi51cmxEaWN0PWwoaCgpKX0pO3ZhciBtPWQobj0+bixuPT5uKTtiLmdldFN0cmluZz1tLmdldDtiLnNldFN0cmluZz1tLnNldDtiLmdldFN0cmluZ0luaXRpYWxpemVyPW0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXRTdHJpbmdPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZVN0cmluZ0JpbmRpbmc9Cm0uZGlzcG9zZUJpbmRpbmc7bT1kKG49PiJ0cnVlIj09PW4/ITA6ImZhbHNlIj09PW4/ITE6dm9pZCAwLG49Pm4udG9TdHJpbmcoKSk7Yi5nZXRCb29sZWFuPW0uZ2V0O2Iuc2V0Qm9vbGVhbj1tLnNldDtiLmdldEJvb2xlYW5Jbml0aWFsaXplcj1tLmdldEluaXRpYWxpemVyO2IuZ2V0Qm9vbGVhbk9ic2VydmVyPW0uZ2V0T2JzZXJ2ZXI7Yi5kaXNwb3NlQm9vbGVhbkJpbmRpbmc9bS5kaXNwb3NlQmluZGluZzttPWQobj0+K24sbj0+bi50b1N0cmluZygpKTtiLmdldE51bWJlcj1tLmdldDtiLnNldE51bWJlcj1tLnNldDtiLmdldE51bWJlckluaXRpYWxpemVyPW0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXROdW1iZXJPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZU51bWJlckJpbmRpbmc9bS5kaXNwb3NlQmluZGluZzttPWQobj0+SlNPTi5wYXJzZShhdG9iKG4pKSxuPT5idG9hKEpTT04uc3RyaW5naWZ5KG4pKSk7Yi5nZXRPYmplY3Q9bS5nZXQ7Yi5zZXRPYmplY3Q9bS5zZXQ7Yi5nZXRPYmplY3RJbml0aWFsaXplcj0KbS5nZXRJbml0aWFsaXplcjtiLmdldE9iamVjdE9ic2VydmVyPW0uZ2V0T2JzZXJ2ZXI7Yi5kaXNwb3NlT2JqZWN0QmluZGluZz1tLmRpc3Bvc2VCaW5kaW5nO2IubWFrZUJpbmRpbmdzPWQ7Yi5taWdyYXRlTGVnYWN5VVJMU2NoZW1lPWZ1bmN0aW9uKCl7Y29uc3Qgbj1uZXcgU2V0KCJleGFtcGxlc1BhdGggaGlkZU1vZGVsUGFuZTIgbW9kZWxOYW1lMSBtb2RlbE5hbWUyIGluZmVyZW5jZUFkZHJlc3MxIGluZmVyZW5jZUFkZHJlc3MyIG1vZGVsVHlwZSBtb2RlbFZlcnNpb24xIG1vZGVsVmVyc2lvbjIgbW9kZWxTaWduYXR1cmUxIG1vZGVsU2lnbmF0dXJlMiBtYXhFeGFtcGxlcyBsYWJlbFZvY2FiUGF0aCBtdWx0aUNsYXNzIHNlcXVlbmNlRXhhbXBsZXMgbWF4Q2xhc3Nlc1RvRGlzcGxheSBzYW1wbGluZ09kZHMgdXNlUHJlZGljdEFwaSBwcmVkaWN0SW5wdXRUZW5zb3IgcHJlZGljdE91dHB1dFRlbnNvciIuc3BsaXQoIiAiKSkscT1sKGgoKSk7aWYoIndoYXRpZiI9PT1xW2IuVEFCXSlmb3IobGV0IHUgb2Ygbil1IGluCnEmJihxW2BwLndoYXRpZi4ke3V9YF09cVt1XSk7ayh0KHEpKTt0aGlzLnVybERpY3Q9cX19KShwZHx8KHBkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc3RvcmFnZS90Zi1zdG9yYWdlLXBvbHltZXIuanMKKGZ1bmN0aW9uKGIpe1BvbHltZXIoe2lzOiJ0Zi1zdG9yYWdlIixfdGVtcGxhdGU6bnVsbCx0Zl9zdG9yYWdlOmJ9KX0pKHBkfHwocGQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXRlZ29yaXphdGlvbi11dGlscy90Zi10YWctZmlsdGVyZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGFnLWZpbHRlcmVyIixwcm9wZXJ0aWVzOnt0YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLG5vdGlmeTohMCxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIoX3RhZ0ZpbHRlcikifSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZTpwZC5nZXRTdHJpbmdJbml0aWFsaXplcigidGFnRmlsdGVyIix7ZGVmYXVsdFZhbHVlOiIiLHVzZUxvY2FsU3RvcmFnZTohMSxwb2x5bWVyUHJvcGVydHk6Il90YWdGaWx0ZXIifSksb2JzZXJ2ZXI6Il90YWdGaWx0ZXJPYnNlcnZlciJ9fSxfdGFnRmlsdGVyT2JzZXJ2ZXI6cGQuZ2V0U3RyaW5nT2JzZXJ2ZXIoInRhZ0ZpbHRlciIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITEscG9seW1lclByb3BlcnR5OiJfdGFnRmlsdGVyIn0pLF9jb21wdXRlVGFnRmlsdGVyKCl7cmV0dXJuIHRoaXMuX3RhZ0ZpbHRlcn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kYXNoYm9hcmQtY29tbW9uL2FycmF5LXVwZGF0ZS1oZWxwZXIuanMKdmFyIHFkOyhmdW5jdGlvbihiKXtiLkFycmF5VXBkYXRlSGVscGVyPXt1cGRhdGVBcnJheVByb3AoZCxmLGgpe2xldCBrPXRoaXMuZ2V0KGQpO2lmKCFBcnJheS5pc0FycmF5KGYpKXRocm93IFJhbmdlRXJyb3IoYEV4cGVjdGVkIG5ldyB2YWx1ZSB0byAnJHtkfScgdG8gYmUgYW4gYXJyYXkuYCk7QXJyYXkuaXNBcnJheShrKXx8KGs9W10sdGhpcy5zZXQoZCxrKSk7Y29uc3QgdD1uZXcgU2V0KGYubWFwKChtLG4pPT5oKG0sbikpKTtsZXQgbD0wLHA9MDtmb3IoO2w8ay5sZW5ndGgmJnA8Zi5sZW5ndGg7KXQuaGFzKGgoa1tsXSxsKSk/KGgoa1tsXSxsKT09aChmW3BdLHApP3RoaXMuc2V0KGAke2R9LiR7bH1gLGZbcF0pOnRoaXMuc3BsaWNlKGQsbCwwLGZbcF0pLHArKyxsKyspOnRoaXMuc3BsaWNlKGQsbCwxKTtsPGsubGVuZ3RoJiZ0aGlzLnNwbGljZShkLGwpO3A8Zi5sZW5ndGgmJnRoaXMucHVzaChkLC4uLmYuc2xpY2UocCkpfX19KShxZHx8KHFkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1kYXNoYm9hcmQtbGF5b3V0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRhc2hib2FyZC1sYXlvdXQifSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1vcHRpb24tc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtb3B0aW9uLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntuYW1lOlN0cmluZyxzZWxlY3RlZElkOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWxlY3RlZElkQ2hhbmdlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLmxpc3RlbihiLCJ0YXAiLCJfc2VsZWN0VGFyZ2V0Iil9LmJpbmQodGhpcykpfSl9LF9zZWxlY3RUYXJnZXQ6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZElkPWIuY3VycmVudFRhcmdldC5pZH0sX3NlbGVjdGVkSWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCIjIit0aGlzLnNlbGVjdGVkSWQpO2ImJih0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihkKXtkLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIil9KSxiLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tY29sbGFwc2UvaXJvbi1jb2xsYXBzZS5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWNvbGxhcHNlIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ob3Jpem9udGFsQ2hhbmdlZCJ9LG9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSx0cmFuc2l0aW9uaW5nOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxub0FuaW1hdGlvbjp7dHlwZTpCb29sZWFufSxfZGVzaXJlZFNpemU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sZ2V0IGRpbWVuc2lvbigpe3JldHVybiB0aGlzLmhvcml6b250YWw/IndpZHRoIjoiaGVpZ2h0In0sZ2V0IF9kaW1lbnNpb25NYXgoKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJtYXhXaWR0aCI6Im1heEhlaWdodCJ9LGdldCBfZGltZW5zaW9uTWF4Q3NzKCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8ibWF4LXdpZHRoIjoKIm1heC1oZWlnaHQifSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhpZGRlbiI6InRydWUifSxsaXN0ZW5lcnM6e3RyYW5zaXRpb25lbmQ6Il9vblRyYW5zaXRpb25FbmQifSx0b2dnbGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hdGhpcy5vcGVuZWR9LHNob3c6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0saGlkZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPSExfSx1cGRhdGVTaXplOmZ1bmN0aW9uKGIsZCl7Yj0iYXV0byI9PT1iPyIiOmI7ZD1kJiYhdGhpcy5ub0FuaW1hdGlvbiYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9kZXNpcmVkU2l6ZSE9PWI7dGhpcy5fZGVzaXJlZFNpemU9Yjt0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKTtkJiYoZD10aGlzLl9jYWxjU2l6ZSgpLCIiPT09YiYmKHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT0iIixiPXRoaXMuX2NhbGNTaXplKCkpLHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT1kLHRoaXMuc2Nyb2xsVG9wPQp0aGlzLnNjcm9sbFRvcCx0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCEwKSxkPWIhPT1kKTt0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09YjtkfHx0aGlzLl90cmFuc2l0aW9uRW5kKCl9LGVuYWJsZVRyYW5zaXRpb246ZnVuY3Rpb24oYil7UG9seW1lci5CYXNlLl93YXJuKCJgZW5hYmxlVHJhbnNpdGlvbigpYCBpcyBkZXByZWNhdGVkLCB1c2UgYG5vQW5pbWF0aW9uYCBpbnN0ZWFkLiIpO3RoaXMubm9BbmltYXRpb249IWJ9LF91cGRhdGVUcmFuc2l0aW9uOmZ1bmN0aW9uKGIpe3RoaXMuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWImJiF0aGlzLm5vQW5pbWF0aW9uPyIiOiIwcyJ9LF9ob3Jpem9udGFsQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5PXRoaXMuX2RpbWVuc2lvbk1heENzczt0aGlzLnN0eWxlWyJtYXhXaWR0aCI9PT10aGlzLl9kaW1lbnNpb25NYXg/Im1heEhlaWdodCI6Im1heFdpZHRoIl09IiI7dGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPwoiYXV0byI6IjBweCIsITEpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsIXRoaXMub3BlbmVkKTt0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCEwKTt0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLWNsb3NlZCIsITEpO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2Utb3BlbmVkIiwhMSk7dGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPyJhdXRvIjoiMHB4IiwhMCk7dGhpcy5vcGVuZWQmJnRoaXMuZm9jdXMoKX0sX3RyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09dGhpcy5fZGVzaXJlZFNpemU7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1jbG9zZWQiLCF0aGlzLm9wZW5lZCk7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1vcGVuZWQiLHRoaXMub3BlbmVkKTt0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKTt0aGlzLm5vdGlmeVJlc2l6ZSgpOwp0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCExKX0sX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihiKXtQb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0PT09dGhpcyYmdGhpcy5fdHJhbnNpdGlvbkVuZCgpfSxfY2FsY1NpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0aGlzLmRpbWVuc2lvbl0rInB4In19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wYWdpbmF0ZWQtdmlldy90Zi1kb20tcmVwZWF0Lmh0bWwuanMKdmFyIEpkOwooZnVuY3Rpb24oYil7Yi5UZkRvbVJlcGVhdEJlaGF2aW9yPVtxZC5BcnJheVVwZGF0ZUhlbHBlcix7cHJvcGVydGllczp7YXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0sX2NvbnRlbnRBY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2RvbUJvb3RzdHJhcHBlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY3Rvcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+bnVsbH0sX3JlbmRlcmVkSXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfcmVuZGVyZWRUZW1wbGF0ZUluc3Q6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfbHJ1Q2FjaGVkSXRlbXM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfY2FjaGVTaXplOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2dldEl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmQ9PkpTT04uc3RyaW5naWZ5KGQpfX0sb2JzZXJ2ZXJzOlsiX2Jvb3RzdHJhcERvbShfaXRlbXNSZW5kZXJlZCwgaXNBdHRhY2hlZCkiLCJfdXBkYXRlRG9tKF9yZW5kZXJlZEl0ZW1zLiosIF9kb21Cb290c3RyYXBwZWQpIiwKIl91cGRhdGVBY3RpdmUoX2NvbnRlbnRBY3RpdmUpIiwiX3RyaW1DYWNoZShfY2FjaGVTaXplKSJdLHNldENhY2hlU2l6ZShkKXt0aGlzLl9jYWNoZVNpemU9ZH0sc2V0R2V0SXRlbUtleShkKXt0aGlzLl9nZXRJdGVtS2V5PWR9LHVwZGF0ZURvbShkKXt0aGlzLnVwZGF0ZUFycmF5UHJvcCgiX3JlbmRlcmVkSXRlbXMiLGQsdGhpcy5fZ2V0SXRlbUtleSl9LF9lbnN1cmVUZW1wbGF0aXplZCgpe2lmKCF0aGlzLmlzQXR0YWNoZWQpcmV0dXJuITE7dGhpcy5fY3Rvcnx8KHRoaXMuX2N0b3I9UG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGhpcy5xdWVyeVNlbGVjdG9yKCJ0ZW1wbGF0ZSIpLHRoaXMse3BhcmVudE1vZGVsOiEwLGluc3RhbmNlUHJvcHM6e1t0aGlzLmFzXTohMCxhY3RpdmU6dGhpcy5fY29udGVudEFjdGl2ZX0sZm9yd2FyZEhvc3RQcm9wOmZ1bmN0aW9uKGQsZil7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZm9yRWFjaChoPT57aC5mb3J3YXJkSG9zdFByb3AoZCwKZil9KX19KSk7cmV0dXJuITB9LF9ib290c3RyYXBEb20oKXt0aGlzLl9pdGVtc1JlbmRlcmVkJiZ0aGlzLl9lbnN1cmVUZW1wbGF0aXplZCgpJiYhdGhpcy5fZG9tQm9vdHN0cmFwcGVkJiYoQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKS5mb3JFYWNoKGQ9PntQb2x5bWVyLmRvbSh0aGlzKS5yZW1vdmVDaGlsZChkKX0pLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmNsZWFyKCksdGhpcy5fcmVuZGVyZWRJdGVtcy5mb3JFYWNoKChkLGYpPT50aGlzLl9pbnNlcnRJdGVtKGQsZikpLHRoaXMuX2RvbUJvb3RzdHJhcHBlZD0hMCl9LF91cGRhdGVBY3RpdmUoKXt0aGlzLl9kb21Cb290c3RyYXBwZWQmJkFycmF5LmZyb20odGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QudmFsdWVzKCkpLmZvckVhY2goZD0+e2Qubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKX0pfSxfdXBkYXRlRG9tKGQpe2lmKHRoaXMuX2RvbUJvb3RzdHJhcHBlZCYmIl9yZW5kZXJlZEl0ZW1zIiE9ZC5wYXRoJiYKIl9yZW5kZXJlZEl0ZW1zLmxlbmd0aCIhPWQucGF0aClpZigiX3JlbmRlcmVkSXRlbXMuc3BsaWNlcyI9PT1kLnBhdGgpZC52YWx1ZS5pbmRleFNwbGljZXMuZm9yRWFjaChmPT57Y29uc3QgaD1mLmluZGV4LGs9Zi5hZGRlZENvdW50LHQ9Zi5vYmplY3Q7Zi5yZW1vdmVkLmZvckVhY2gobD0+e3RoaXMuX3JlbW92ZUl0ZW0obCx0aGlzLmNoaWxkcmVuW2hdKX0pO3Quc2xpY2UoaCxoK2spLmZvckVhY2goKGwscCk9PnRoaXMuX2luc2VydEl0ZW0obCxoK3ApKTt0aGlzLl90cmltQ2FjaGUoKX0pO2Vsc2V7Y29uc3QgZj10aGlzLl9nZXRJdGVtS2V5KGQudmFsdWUpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmhhcyhmKT90aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoZikubm90aWZ5UGF0aCh0aGlzLmFzLGQudmFsdWUpOmNvbnNvbGUud2FybihgRXhwZWN0ZWQgJyR7Zn0nIHRvIGV4aXN0IGluIHRoZSBET00gYnV0IGArImNvdWxkIG5vdCBmaW5kIG9uZS4iKX19LF9pbnNlcnRJdGVtKGQsCmYpe2lmKCF0aGlzLl9lbnN1cmVUZW1wbGF0aXplZCgpKXRocm93IEVycm9yKCJFeHBlY3RlZCB0ZW1wbGF0aXplZCBiZWZvcmUgaW5zZXJ0aW5nIGFuIGl0ZW0iKTtjb25zdCBoPXRoaXMuX2dldEl0ZW1LZXkoZCk7aWYodGhpcy5fbHJ1Q2FjaGVkSXRlbXMuaGFzKGgpKWQ9dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZ2V0KGgpLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmRlbGV0ZShoKSx0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoaCkubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKTtlbHNle2NvbnN0IGs9bmV3IHRoaXMuX2N0b3Ioe1t0aGlzLmFzXTpkLGFjdGl2ZTp0aGlzLl9jb250ZW50QWN0aXZlfSk7ZD1rLnJvb3Q7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3Quc2V0KGgsayl9dGhpcy5jaGlsZHJlbltmXT9Qb2x5bWVyLmRvbSh0aGlzKS5pbnNlcnRCZWZvcmUoZCx0aGlzLmNoaWxkcmVuW2ZdKTooKGQubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERT8KQXJyYXkuZnJvbShkLmNoaWxkcmVuKTpbZF0pLmZvckVhY2goaz0+ay5zZXRBdHRyaWJ1dGUoInNsb3QiLCJpdGVtcyIpKSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChkKSl9LF9yZW1vdmVJdGVtKGQsZil7UG9seW1lci5kb20oZi5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZChmKTtkPXRoaXMuX2dldEl0ZW1LZXkoZCk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuc2V0KGQsZik7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KGQpLm5vdGlmeVBhdGgoImFjdGl2ZSIsITEpfSxfdHJpbUNhY2hlKCl7Zm9yKDt0aGlzLl9scnVDYWNoZWRJdGVtcy5zaXplPnRoaXMuX2NhY2hlU2l6ZTspe2NvbnN0IFtkXT10aGlzLl9scnVDYWNoZWRJdGVtcy5rZXlzKCk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZGVsZXRlKGQpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmRlbGV0ZShkKX19fV19KShKZHx8KEpkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGFnaW5hdGVkLXZpZXcvcGFnaW5hdGVkVmlld1N0b3JlLmpzCnZhciBuZTsKKGZ1bmN0aW9uKGIpe2xldCBkPW51bGw7Y29uc3QgZj1uZXcgU2V0O2IuYWRkTGltaXRMaXN0ZW5lcj1mdW5jdGlvbihoKXtmLmFkZChoKX07Yi5yZW1vdmVMaW1pdExpc3RlbmVyPWZ1bmN0aW9uKGgpe2YuZGVsZXRlKGgpfTtiLmdldExpbWl0PWZ1bmN0aW9uKCl7bnVsbD09ZCYmKGQ9cGQuZ2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0Iix7dXNlTG9jYWxTdG9yYWdlOiEwfSksbnVsbD09ZHx8IWlzRmluaXRlKGQpfHwwPj1kKSYmKGQ9MTIpO3JldHVybiBkfTtiLnNldExpbWl0PWZ1bmN0aW9uKGgpe2lmKGghPT1NYXRoLmZsb29yKGgpKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBnb3Q6ICR7aH1gKTtpZigwPj1oKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlLCBidXQgZ290OiAke2h9YCk7aCE9PWQmJihkPWgscGQuc2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0IixkLAp7dXNlTG9jYWxTdG9yYWdlOiEwfSksZi5mb3JFYWNoKGs9PntrKCl9KSl9fSkobmV8fChuZT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3RmLXBhZ2luYXRlZC12aWV3LXN0b3JlLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXBhZ2luYXRlZC12aWV3LXN0b3JlIixfdGVtcGxhdGU6bnVsbCx0Zl9wYWdpbmF0ZWRfdmlldzpuZX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Iixwcm9wZXJ0aWVzOntjYXRlZ29yeTpPYmplY3QsaW5pdGlhbE9wZW5lZDpCb29sZWFuLG9wZW5lZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMH0sX2NvbnRlbnRBY3RpdmU6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVDb250ZW50QWN0aXZlKG9wZW5lZCkifSxkaXNhYmxlUGFnaW5hdGlvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY291bnQ6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUNvdW50KGNhdGVnb3J5Lml0ZW1zLiopIn0sX2hhc011bHRpcGxlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzTXVsdGlwbGUoX2NvdW50KSJ9LF9wYW5lUmVuZGVyZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVQYW5lUmVuZGVyZWQoY2F0ZWdvcnkpIixvYnNlcnZlcjoiX29uUGFuZVJlbmRlcmVkQ2hhbmdlZCJ9LF9pdGVtc1JlbmRlcmVkOnt0eXBlOkJvb2xlYW4sCmNvbXB1dGVkOiJfY29tcHV0ZUl0ZW1zUmVuZGVyZWQob3BlbmVkLCBfcGFuZVJlbmRlcmVkKSJ9LF9pc1NlYXJjaFJlc3VsdHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEudHlwZSkifSxfaXNJbnZhbGlkU2VhcmNoUmVzdWx0czp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUlzSW52YWxpZFNlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEpIn0sX2lzVW5pdmVyc2FsU2VhcmNoUXVlcnk6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5KGNhdGVnb3J5Lm1ldGFkYXRhKSJ9LGdldENhdGVnb3J5SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Yj0+SlNPTi5zdHJpbmdpZnkoYiksb2JzZXJ2ZXI6Il9nZXRDYXRlZ29yeUl0ZW1LZXlDaGFuZ2VkIn0sX2xpbWl0Ont0eXBlOk51bWJlcix2YWx1ZToxMixvYnNlcnZlcjoiX2xpbWl0Q2hhbmdlZCJ9LApfYWN0aXZlSW5kZXg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9jdXJyZW50UGFnZTp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFBhZ2UoX2xpbWl0LCBfYWN0aXZlSW5kZXgpIn0sX3BhZ2VDb3VudDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlUGFnZUNvdW50KGNhdGVnb3J5Lml0ZW1zLiosIF9saW1pdCkifSxfbXVsdGlwbGVQYWdlc0V4aXN0Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlTXVsdGlwbGVQYWdlc0V4aXN0KF9wYWdlQ291bnQsIGRpc2FibGVQYWdpbmF0aW9uKSJ9LF9oYXNQcmV2aW91c1BhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNQcmV2aW91c1BhZ2UoX2N1cnJlbnRQYWdlKSJ9LF9oYXNOZXh0UGFnZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc05leHRQYWdlKF9jdXJyZW50UGFnZSwgX3BhZ2VDb3VudCkifSxfaW5wdXRXaWR0aDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlSW5wdXRXaWR0aChfcGFnZUNvdW50KSIsCm9ic2VydmVyOiJfdXBkYXRlSW5wdXRXaWR0aCJ9LF9wYWdlSW5wdXRWYWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUGFnZUlucHV0VmFsdWUoX3BhZ2VJbnB1dEZvY3VzZWQsIF9wYWdlSW5wdXRSYXdWYWx1ZSwgX2N1cnJlbnRQYWdlKSIsb2JzZXJ2ZXI6Il91cGRhdGVQYWdlSW5wdXRWYWx1ZSJ9LF9wYWdlSW5wdXRSYXdWYWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9wYWdlSW5wdXRGb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfY2xhbXBBY3RpdmVJbmRleChjYXRlZ29yeS5pdGVtcy4qKSIsIl91cGRhdGVSZW5kZXJlZEl0ZW1zKF9pdGVtc1JlbmRlcmVkLCBjYXRlZ29yeS5pdGVtcy4qLCBfbGltaXQsIF9hY3RpdmVJbmRleCwgX3BhZ2VDb3VudCwgZGlzYWJsZVBhZ2luYXRpb24pIl0sYmVoYXZpb3JzOltKZC5UZkRvbVJlcGVhdEJlaGF2aW9yXSxfY29tcHV0ZUNvdW50KCl7cmV0dXJuIHRoaXMuY2F0ZWdvcnkuaXRlbXMubGVuZ3RofSwKX2NvbXB1dGVIYXNNdWx0aXBsZSgpe3JldHVybiAxPHRoaXMuX2NvdW50fSxfdG9nZ2xlUGFuZSgpe3RoaXMuX3NldE9wZW5lZCghdGhpcy5vcGVuZWQpfSxfY29tcHV0ZUNvbnRlbnRBY3RpdmUoKXtyZXR1cm4gdGhpcy5vcGVuZWR9LF9vblBhbmVSZW5kZXJlZENoYW5nZWQoYixkKXtiJiZiIT09ZCYmdGhpcy4kLmlmUmVuZGVyZWQucmVuZGVyKCl9LF9jb21wdXRlUGFuZVJlbmRlcmVkKGIpe3JldHVybiEoYi5tZXRhZGF0YS50eXBlPT09JGMuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTJiYiIj09PWIubmFtZSl9LF9jb21wdXRlSXRlbXNSZW5kZXJlZCgpe3JldHVybiB0aGlzLl9wYW5lUmVuZGVyZWQmJnRoaXMub3BlbmVkfSxfY29tcHV0ZUlzU2VhcmNoUmVzdWx0cyhiKXtyZXR1cm4gYj09PSRjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUU30sX2NvbXB1dGVJc0ludmFsaWRTZWFyY2hSZXN1bHRzKGIpe3JldHVybiBiLnR5cGU9PT0kYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFMmJgohYi52YWxpZFJlZ2V4fSxfY29tcHV0ZUlzVW5pdmVyc2FsU2VhcmNoUXVlcnkoYil7cmV0dXJuIGIudHlwZT09PSRjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUyYmYi51bml2ZXJzYWxSZWdleH0sX2lzQ29tcG9zaXRlU2VhcmNoKCl7Y29uc3QgYj10aGlzLmNhdGVnb3J5Lm1ldGFkYXRhLnR5cGU7cmV0dXJuIHRoaXMuY2F0ZWdvcnkubWV0YWRhdGEuY29tcG9zaXRlU2VhcmNoJiZiPT09JGMuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTfSxyZWFkeSgpe3RoaXMuX3NldE9wZW5lZChudWxsPT10aGlzLmluaXRpYWxPcGVuZWQ/ITA6dGhpcy5pbml0aWFsT3BlbmVkKTt0aGlzLl9saW1pdExpc3RlbmVyPSgpPT57dGhpcy5zZXQoIl9saW1pdCIsbmUuZ2V0TGltaXQoKSl9O25lLmFkZExpbWl0TGlzdGVuZXIodGhpcy5fbGltaXRMaXN0ZW5lcik7dGhpcy5fbGltaXRMaXN0ZW5lcigpfSxkZXRhY2hlZCgpe25lLnJlbW92ZUxpbWl0TGlzdGVuZXIodGhpcy5fbGltaXRMaXN0ZW5lcil9LApfdXBkYXRlUmVuZGVyZWRJdGVtcyhiLGQsZixoLGssdCl7YiYmKGI9TWF0aC5mbG9vcihoL2YpLGQ9dGhpcy5jYXRlZ29yeS5pdGVtc3x8W10sdGhpcy51cGRhdGVEb20odD9kOmQuc2xpY2UoYipmLChiKzEpKmYpLHRoaXMuZ2V0Q2F0ZWdvcnlJdGVtS2V5KSl9LF9saW1pdENoYW5nZWQoYil7dGhpcy5zZXRDYWNoZVNpemUoMipiKX0sX2dldENhdGVnb3J5SXRlbUtleUNoYW5nZWQoKXt0aGlzLnNldEdldEl0ZW1LZXkodGhpcy5nZXRDYXRlZ29yeUl0ZW1LZXkpfSxfY29tcHV0ZUN1cnJlbnRQYWdlKGIsZCl7cmV0dXJuIE1hdGguZmxvb3IoZC9iKSsxfSxfY29tcHV0ZVBhZ2VDb3VudChiLGQpe3JldHVybiB0aGlzLmNhdGVnb3J5P01hdGguY2VpbCh0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aC9kKTowfSxfY29tcHV0ZU11bHRpcGxlUGFnZXNFeGlzdChiLGQpe3JldHVybiFkJiYxPGJ9LF9jb21wdXRlSGFzUHJldmlvdXNQYWdlKGIpe3JldHVybiAxPGJ9LF9jb21wdXRlSGFzTmV4dFBhZ2UoYiwKZCl7cmV0dXJuIGI8ZH0sX2NvbXB1dGVJbnB1dFdpZHRoKGIpe3JldHVybmBjYWxjKCR7Yi50b1N0cmluZygpLmxlbmd0aH1lbSArIDIwcHgpYH0sX3NldEFjdGl2ZUluZGV4KGIpe2NvbnN0IGQ9KHRoaXMuY2F0ZWdvcnkuaXRlbXN8fFtdKS5sZW5ndGgtMTtiPmQmJihiPWQpOzA+YiYmKGI9MCk7dGhpcy5zZXQoIl9hY3RpdmVJbmRleCIsYil9LF9jbGFtcEFjdGl2ZUluZGV4KCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgpfSxfcGVyZm9ybVByZXZpb3VzUGFnZSgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4LXRoaXMuX2xpbWl0KX0sX3BlcmZvcm1OZXh0UGFnZSgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4K3RoaXMuX2xpbWl0KX0sX2NvbXB1dGVQYWdlSW5wdXRWYWx1ZShiLGQsZil7cmV0dXJuIGI/ZDpmLnRvU3RyaW5nKCl9LF9oYW5kbGVQYWdlSW5wdXRFdmVudChiKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIiwKYi50YXJnZXQudmFsdWUpO2I9TnVtYmVyKGIudGFyZ2V0LnZhbHVlfHxOYU4pO2lzTmFOKGIpfHx0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9saW1pdCooTWF0aC5tYXgoMSxNYXRoLm1pbihiLHRoaXMuX3BhZ2VDb3VudCkpLTEpKX0sX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLHRoaXMuX2N1cnJlbnRQYWdlLnRvU3RyaW5nKCkpfSxfaGFuZGxlUGFnZUZvY3VzRXZlbnQoKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIix0aGlzLl9wYWdlSW5wdXRWYWx1ZSk7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMCl9LF9oYW5kbGVQYWdlQmx1ckV2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMSl9LF91cGRhdGVQYWdlSW5wdXRWYWx1ZShiKXtjb25zdCBkPXRoaXMuJCQoIiNwYWdlLWlucHV0IGlucHV0Iik7ZCYmKGQudmFsdWU9Yil9LF91cGRhdGVJbnB1dFdpZHRoKCl7dGhpcy51cGRhdGVTdHlsZXMoeyItLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgiOnRoaXMuX2lucHV0V2lkdGh9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1kaWFsb2ctYmVoYXZpb3IvcGFwZXItZGlhbG9nLWJlaGF2aW9yLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbD17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImRpYWxvZyIsdGFiaW5kZXg6Ii0xIn0scHJvcGVydGllczp7bW9kYWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX19yZWFkaWVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfbW9kYWxDaGFuZ2VkKG1vZGFsLCBfX3JlYWRpZWQpIl0sbGlzdGVuZXJzOnt0YXA6Il9vbkRpYWxvZ0NsaWNrIn0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrO3RoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXk7dGhpcy5fX3ByZXZXaXRoQmFja2Ryb3A9dGhpcy53aXRoQmFja2Ryb3A7dGhpcy5fX3JlYWRpZWQ9ITB9LF9tb2RhbENoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiYoYj8odGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrPQp0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2ssdGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleSx0aGlzLl9fcHJldldpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCx0aGlzLndpdGhCYWNrZHJvcD10aGlzLm5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPSEwKToodGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayYmdGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrLHRoaXMubm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXkmJnRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleSx0aGlzLndpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCYmdGhpcy5fX3ByZXZXaXRoQmFja2Ryb3ApKX0sX3VwZGF0ZUNsb3NpbmdSZWFzb25Db25maXJtZWQ6ZnVuY3Rpb24oYil7dGhpcy5jbG9zaW5nUmVhc29uPXRoaXMuY2xvc2luZ1JlYXNvbnx8Cnt9O3RoaXMuY2xvc2luZ1JlYXNvbi5jb25maXJtZWQ9Yn0sX29uRGlhbG9nQ2xpY2s6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPVBvbHltZXIuZG9tKGIpLnBhdGgsZj0wLGg9ZC5pbmRleE9mKHRoaXMpO2Y8aDtmKyspe3ZhciBrPWRbZl07aWYoay5oYXNBdHRyaWJ1dGUmJihrLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWRpc21pc3MiKXx8ay5oYXNBdHRyaWJ1dGUoImRpYWxvZy1jb25maXJtIikpKXt0aGlzLl91cGRhdGVDbG9zaW5nUmVhc29uQ29uZmlybWVkKGsuaGFzQXR0cmlidXRlKCJkaWFsb2ctY29uZmlybSIpKTt0aGlzLmNsb3NlKCk7Yi5zdG9wUHJvcGFnYXRpb24oKTticmVha319fX07UG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9yPVtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3IsUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbF19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRpYWxvZy9wYXBlci1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItZGlhbG9nIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvcl0sbGlzdGVuZXJzOnsibmVvbi1hbmltYXRpb24tZmluaXNoIjoiX29uTmVvbkFuaW1hdGlvbkZpbmlzaCJ9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEFuaW1hdGlvbigpO3RoaXMucGxheUFuaW1hdGlvbigiZW50cnkiKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCk7dGhpcy5wbGF5QW5pbWF0aW9uKCJleGl0Iil9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKTp0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKX19KTsKCi8vIGh0dHBzOi8vZDNqcy5vcmcgdjUuNy4wIENvcHlyaWdodCAyMDE4IE1pa2UgQm9zdG9jawohZnVuY3Rpb24odCxuKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sbik6bih0LmQzPXQuZDN8fHt9KX0odGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBlKHQpe3ZhciBlO3JldHVybiAxPT09dC5sZW5ndGgmJihlPXQsdD1mdW5jdGlvbih0LHIpe3JldHVybiBuKGUodCkscil9KSx7bGVmdDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPDA/cj1vKzE6aT1vfXJldHVybiByfSxyaWdodDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPjA/aT1vOnI9bysxfXJldHVybiByfX19dmFyIHI9ZShuKSxpPXIucmlnaHQsbz1yLmxlZnQ7ZnVuY3Rpb24gYSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIHUodCl7cmV0dXJuIG51bGw9PT10P05hTjordH1mdW5jdGlvbiBmKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89MCxhPS0xLGY9MCxjPTA7aWYobnVsbD09bilmb3IoOysrYTxpOylpc05hTihlPXUodFthXSkpfHwoYys9KHI9ZS1mKSooZS0oZis9ci8rK28pKSk7ZWxzZSBmb3IoOysrYTxpOylpc05hTihlPXUobih0W2FdLGEsdCkpKXx8KGMrPShyPWUtZikqKGUtKGYrPXIvKytvKSkpO2lmKG8+MSlyZXR1cm4gYy8oby0xKX1mdW5jdGlvbiBjKHQsbil7dmFyIGU9Zih0LG4pO3JldHVybiBlP01hdGguc3FydChlKTplfWZ1bmN0aW9uIHModCxuKXt2YXIgZSxyLGksbz10Lmxlbmd0aCxhPS0xO2lmKG51bGw9PW4pe2Zvcig7KythPG87KWlmKG51bGwhPShlPXRbYV0pJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9dFthXSkmJihyPmUmJihyPWUpLGk8ZSYmKGk9ZSkpfWVsc2UgZm9yKDsrK2E8bzspaWYobnVsbCE9KGU9bih0W2FdLGEsdCkpJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9bih0W2FdLGEsdCkpJiYocj5lJiYocj1lKSxpPGUmJihpPWUpKTtyZXR1cm5bcixpXX12YXIgbD1BcnJheS5wcm90b3R5cGUsaD1sLnNsaWNlLGQ9bC5tYXA7ZnVuY3Rpb24gcCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdih0KXtyZXR1cm4gdH1mdW5jdGlvbiBnKHQsbixlKXt0PSt0LG49K24sZT0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhuPXQsdD0wLDEpOmk8Mz8xOitlO2Zvcih2YXIgcj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKG4tdCkvZSkpLG89bmV3IEFycmF5KGkpOysrcjxpOylvW3JdPXQrciplO3JldHVybiBvfXZhciB5PU1hdGguc3FydCg1MCksXz1NYXRoLnNxcnQoMTApLGI9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIG0odCxuLGUpe3ZhciByLGksbyxhLHU9LTE7aWYoZT0rZSwodD0rdCk9PT0obj0rbikmJmU+MClyZXR1cm5bdF07aWYoKHI9bjx0KSYmKGk9dCx0PW4sbj1pKSwwPT09KGE9eCh0LG4sZSkpfHwhaXNGaW5pdGUoYSkpcmV0dXJuW107aWYoYT4wKWZvcih0PU1hdGguY2VpbCh0L2EpLG49TWF0aC5mbG9vcihuL2EpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKG4tdCsxKSk7Kyt1PGk7KW9bdV09KHQrdSkqYTtlbHNlIGZvcih0PU1hdGguZmxvb3IodCphKSxuPU1hdGguY2VpbChuKmEpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKHQtbisxKSk7Kyt1PGk7KW9bdV09KHQtdSkvYTtyZXR1cm4gciYmby5yZXZlcnNlKCksb31mdW5jdGlvbiB4KHQsbixlKXt2YXIgcj0obi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApLG89ci9NYXRoLnBvdygxMCxpKTtyZXR1cm4gaT49MD8obz49eT8xMDpvPj1fPzU6bz49Yj8yOjEpKk1hdGgucG93KDEwLGkpOi1NYXRoLnBvdygxMCwtaSkvKG8+PXk/MTA6bz49Xz81Om8+PWI/MjoxKX1mdW5jdGlvbiB3KHQsbixlKXt2YXIgcj1NYXRoLmFicyhuLXQpL01hdGgubWF4KDAsZSksaT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4xMCkpLG89ci9pO3JldHVybiBvPj15P2kqPTEwOm8+PV8/aSo9NTpvPj1iJiYoaSo9Miksbjx0Py1pOml9ZnVuY3Rpb24gTSh0KXtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMikrMX1mdW5jdGlvbiBBKHQsbixlKXtpZihudWxsPT1lJiYoZT11KSxyPXQubGVuZ3RoKXtpZigobj0rbik8PTB8fHI8MilyZXR1cm4rZSh0WzBdLDAsdCk7aWYobj49MSlyZXR1cm4rZSh0W3ItMV0sci0xLHQpO3ZhciByLGk9KHItMSkqbixvPU1hdGguZmxvb3IoaSksYT0rZSh0W29dLG8sdCk7cmV0dXJuIGErKCtlKHRbbysxXSxvKzEsdCktYSkqKGktbyl9fWZ1bmN0aW9uIFQodCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmZT5yJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+ciYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTih0KXtmb3IodmFyIG4sZSxyLGk9dC5sZW5ndGgsbz0tMSxhPTA7KytvPGk7KWErPXRbb10ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKTstLWk+PTA7KWZvcihuPShyPXRbaV0pLmxlbmd0aDstLW4+PTA7KWVbLS1hXT1yW25dO3JldHVybiBlfWZ1bmN0aW9uIFModCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmcj5lJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJnI+ZSYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gRSh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgbj0tMSxlPVModCxrKSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBpLG89LTEsYT1yW25dPW5ldyBBcnJheShpKTsrK288aTspYVtvXT10W29dW25dO3JldHVybiByfWZ1bmN0aW9uIGsodCl7cmV0dXJuIHQubGVuZ3RofXZhciBDPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBQKHQpe3JldHVybiB0fXZhciB6PTEsUj0yLEw9MyxEPTQsVT0xZS02O2Z1bmN0aW9uIHEodCl7cmV0dXJuInRyYW5zbGF0ZSgiKyh0Ky41KSsiLDApIn1mdW5jdGlvbiBPKHQpe3JldHVybiJ0cmFuc2xhdGUoMCwiKyh0Ky41KSsiKSJ9ZnVuY3Rpb24gWSgpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiBCKHQsbil7dmFyIGU9W10scj1udWxsLGk9bnVsbCxvPTYsYT02LHU9MyxmPXQ9PT16fHx0PT09RD8tMToxLGM9dD09PUR8fHQ9PT1SPyJ4IjoieSIscz10PT09enx8dD09PUw/cTpPO2Z1bmN0aW9uIGwobCl7dmFyIGg9bnVsbD09cj9uLnRpY2tzP24udGlja3MuYXBwbHkobixlKTpuLmRvbWFpbigpOnIsZD1udWxsPT1pP24udGlja0Zvcm1hdD9uLnRpY2tGb3JtYXQuYXBwbHkobixlKTpQOmkscD1NYXRoLm1heChvLDApK3Usdj1uLnJhbmdlKCksZz0rdlswXSsuNSx5PSt2W3YubGVuZ3RoLTFdKy41LF89KG4uYmFuZHdpZHRoP2Z1bmN0aW9uKHQpe3ZhciBuPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihuPU1hdGgucm91bmQobikpLGZ1bmN0aW9uKGUpe3JldHVybit0KGUpK259fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuK3Qobil9fSkobi5jb3B5KCkpLGI9bC5zZWxlY3Rpb24/bC5zZWxlY3Rpb24oKTpsLG09Yi5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSkseD1iLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsbikub3JkZXIoKSx3PXguZXhpdCgpLE09eC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwidGljayIpLEE9eC5zZWxlY3QoImxpbmUiKSxUPXguc2VsZWN0KCJ0ZXh0Iik7bT1tLm1lcmdlKG0uZW50ZXIoKS5pbnNlcnQoInBhdGgiLCIudGljayIpLmF0dHIoImNsYXNzIiwiZG9tYWluIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikpLHg9eC5tZXJnZShNKSxBPUEubWVyZ2UoTS5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMrIjIiLGYqbykpLFQ9VC5tZXJnZShNLmFwcGVuZCgidGV4dCIpLmF0dHIoImZpbGwiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMsZipwKS5hdHRyKCJkeSIsdD09PXo/IjBlbSI6dD09PUw/IjAuNzFlbSI6IjAuMzJlbSIpKSxsIT09YiYmKG09bS50cmFuc2l0aW9uKGwpLHg9eC50cmFuc2l0aW9uKGwpLEE9QS50cmFuc2l0aW9uKGwpLFQ9VC50cmFuc2l0aW9uKGwpLHc9dy50cmFuc2l0aW9uKGwpLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9Xyh0KSk/cyh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSxNLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7dmFyIG49dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gcyhuJiZpc0Zpbml0ZShuPW4odCkpP246Xyh0KSl9KSksdy5yZW1vdmUoKSxtLmF0dHIoImQiLHQ9PT1EfHx0PT1SP2E/Ik0iK2YqYSsiLCIrZysiSDAuNVYiK3krIkgiK2YqYToiTTAuNSwiK2crIlYiK3k6YT8iTSIrZysiLCIrZiphKyJWMC41SCIreSsiViIrZiphOiJNIitnKyIsMC41SCIreSkseC5hdHRyKCJvcGFjaXR5IiwxKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBzKF8odCkpfSksQS5hdHRyKGMrIjIiLGYqbyksVC5hdHRyKGMsZipwKS50ZXh0KGQpLGIuZmlsdGVyKFkpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigiZm9udC1zaXplIiwxMCkuYXR0cigiZm9udC1mYW1pbHkiLCJzYW5zLXNlcmlmIikuYXR0cigidGV4dC1hbmNob3IiLHQ9PT1SPyJzdGFydCI6dD09PUQ/ImVuZCI6Im1pZGRsZSIpLGIuZWFjaChmdW5jdGlvbigpe3RoaXMuX19heGlzPV99KX1yZXR1cm4gbC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGwpOm59LGwudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gZT1DLmNhbGwoYXJndW1lbnRzKSxsfSxsLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9bXTpDLmNhbGwodCksbCk6ZS5zbGljZSgpfSxsLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOkMuY2FsbCh0KSxsKTpyJiZyLnNsaWNlKCl9LGwudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGwpOml9LGwudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89YT0rdCxsKTpvfSxsLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsbCk6b30sbC50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LGwpOmF9LGwudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3QsbCk6dX0sbH12YXIgRj17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBJKCl7Zm9yKHZhciB0LG49MCxlPWFyZ3VtZW50cy5sZW5ndGgscj17fTtuPGU7KytuKXtpZighKHQ9YXJndW1lbnRzW25dKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBIKHIpfWZ1bmN0aW9uIEgodCl7dGhpcy5fPXR9ZnVuY3Rpb24gaih0LG4pe2Zvcih2YXIgZSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChlPXRbcl0pLm5hbWU9PT1uKXJldHVybiBlLnZhbHVlfWZ1bmN0aW9uIFgodCxuLGUpe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZih0W3JdLm5hbWU9PT1uKXt0W3JdPUYsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPWUmJnQucHVzaCh7bmFtZTpuLHZhbHVlOmV9KSx0fUgucHJvdG90eXBlPUkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXRoaXMuXyxvPShyPWksKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtpZihlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHQmJiFyLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKSxhPS0xLHU9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK2E8dTspaWYoZT0odD1vW2FdKS50eXBlKWlbZV09WChpW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gaSlpW2VdPVgoaVtlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK2E8dTspaWYoKGU9KHQ9b1thXSkudHlwZSkmJihlPWooaVtlXSx0Lm5hbWUpKSlyZXR1cm4gZX0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LG49dGhpcy5fO2Zvcih2YXIgZSBpbiBuKXRbZV09bltlXS5zbGljZSgpO3JldHVybiBuZXcgSCh0KX0sY2FsbDpmdW5jdGlvbih0LG4pe2lmKChlPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIGUscixpPW5ldyBBcnJheShlKSxvPTA7bzxlOysrbylpW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxlPShyPXRoaXMuX1t0XSkubGVuZ3RoO288ZTsrK28pcltvXS52YWx1ZS5hcHBseShuLGkpfSxhcHBseTpmdW5jdGlvbih0LG4sZSl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIHI9dGhpcy5fW3RdLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpcltpXS52YWx1ZS5hcHBseShuLGUpfX07dmFyIEc9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLFY9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkcseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiAkKHQpe3ZhciBuPXQrPSIiLGU9bi5pbmRleE9mKCI6Iik7cmV0dXJuIGU+PTAmJiJ4bWxucyIhPT0obj10LnNsaWNlKDAsZSkpJiYodD10LnNsaWNlKGUrMSkpLFYuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOlZbbl0sbG9jYWw6dH06dH1mdW5jdGlvbiBXKHQpe3ZhciBuPSQodCk7cmV0dXJuKG4ubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09RyYmbi5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09Rz9uLmNyZWF0ZUVsZW1lbnQodCk6bi5jcmVhdGVFbGVtZW50TlMoZSx0KX19KShuKX1mdW5jdGlvbiBaKCl7fWZ1bmN0aW9uIFEodCl7cmV0dXJuIG51bGw9PXQ/WjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIEooKXtyZXR1cm5bXX1mdW5jdGlvbiBLKHQpe3JldHVybiBudWxsPT10P0o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX12YXIgdHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBudD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7aWYoIW50Lm1hdGNoZXMpe3ZhciBldD1udC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG50Lm1zTWF0Y2hlc1NlbGVjdG9yfHxudC5tb3pNYXRjaGVzU2VsZWN0b3J8fG50Lm9NYXRjaGVzU2VsZWN0b3I7dHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV0LmNhbGwodGhpcyx0KX19fX12YXIgcnQ9dHQ7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gb3QodCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59b3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvdCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LG4pfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fTt2YXIgYXQ9IiQiO2Z1bmN0aW9uIHV0KHQsbixlLHIsaSxvKXtmb3IodmFyIGEsdT0wLGY9bi5sZW5ndGgsYz1vLmxlbmd0aDt1PGM7Kyt1KShhPW5bdV0pPyhhLl9fZGF0YV9fPW9bdV0sclt1XT1hKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcig7dTxmOysrdSkoYT1uW3VdKSYmKGlbdV09YSl9ZnVuY3Rpb24gZnQodCxuLGUscixpLG8sYSl7dmFyIHUsZixjLHM9e30sbD1uLmxlbmd0aCxoPW8ubGVuZ3RoLGQ9bmV3IEFycmF5KGwpO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmKGRbdV09Yz1hdCthLmNhbGwoZixmLl9fZGF0YV9fLHUsbiksYyBpbiBzP2lbdV09ZjpzW2NdPWYpO2Zvcih1PTA7dTxoOysrdSkoZj1zW2M9YXQrYS5jYWxsKHQsb1t1XSx1LG8pXSk/KHJbdV09ZixmLl9fZGF0YV9fPW9bdV0sc1tjXT1udWxsKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmc1tkW3VdXT09PWYmJihpW3VdPWYpfWZ1bmN0aW9uIGN0KHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfWZ1bmN0aW9uIHN0KHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBsdCh0LG4pe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobil8fHN0KHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfWZ1bmN0aW9uIGh0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBwdCh0KX1mdW5jdGlvbiBwdCh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9aHQodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiB2dCh0LG4pe2Zvcih2YXIgZT1kdCh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUuYWRkKG5bcl0pfWZ1bmN0aW9uIGd0KHQsbil7Zm9yKHZhciBlPWR0KHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24geXQoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIF90KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gYnQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gbXQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiB4dCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIHd0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gTXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMSksdGhpcy5uZXh0U2libGluZyl9ZnVuY3Rpb24gQXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMCksdGhpcy5uZXh0U2libGluZyl9cHQucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgVHQ9e307KHQuZXZlbnQ9bnVsbCwidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KSYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoVHQ9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO2Z1bmN0aW9uIE50KHQsbixlKXtyZXR1cm4gdD1TdCh0LG4sZSksZnVuY3Rpb24obil7dmFyIGU9bi5yZWxhdGVkVGFyZ2V0O2UmJihlPT09dGhpc3x8OCZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIFN0KG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG89dC5ldmVudDt0LmV2ZW50PWk7dHJ5e24uY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxyKX1maW5hbGx5e3QuZXZlbnQ9b319fWZ1bmN0aW9uIEV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMuX19vbjtpZihuKXtmb3IodmFyIGUscj0wLGk9LTEsbz1uLmxlbmd0aDtyPG87KytyKWU9bltyXSx0LnR5cGUmJmUudHlwZSE9PXQudHlwZXx8ZS5uYW1lIT09dC5uYW1lP25bKytpXT1lOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsZS5saXN0ZW5lcixlLmNhcHR1cmUpOysraT9uLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBrdCh0LG4sZSl7dmFyIHI9VHQuaGFzT3duUHJvcGVydHkodC50eXBlKT9OdDpTdDtyZXR1cm4gZnVuY3Rpb24oaSxvLGEpe3ZhciB1LGY9dGhpcy5fX29uLGM9cihuLG8sYSk7aWYoZilmb3IodmFyIHM9MCxsPWYubGVuZ3RoO3M8bDsrK3MpaWYoKHU9ZltzXSkudHlwZT09PXQudHlwZSYmdS5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXIsdS5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXI9Yyx1LmNhcHR1cmU9ZSksdm9pZCh1LnZhbHVlPW4pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxlKSx1PXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTpuLGxpc3RlbmVyOmMsY2FwdHVyZTplfSxmP2YucHVzaCh1KTp0aGlzLl9fb249W3VdfX1mdW5jdGlvbiBDdChuLGUscixpKXt2YXIgbz10LmV2ZW50O24uc291cmNlRXZlbnQ9dC5ldmVudCx0LmV2ZW50PW47dHJ5e3JldHVybiBlLmFwcGx5KHIsaSl9ZmluYWxseXt0LmV2ZW50PW99fWZ1bmN0aW9uIFB0KHQsbixlKXt2YXIgcj1zdCh0KSxpPXIuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aT1uZXcgaShuLGUpOihpPXIuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZT8oaS5pbml0RXZlbnQobixlLmJ1YmJsZXMsZS5jYW5jZWxhYmxlKSxpLmRldGFpbD1lLmRldGFpbCk6aS5pbml0RXZlbnQobiwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChpKX12YXIgenQ9W251bGxdO2Z1bmN0aW9uIFJ0KHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIEx0KCl7cmV0dXJuIG5ldyBSdChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLHp0KX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgUnQoW1t0XV0senQpfVJ0LnByb3RvdHlwZT1MdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlJ0LHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9USh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhLHU9bltpXSxmPXUubGVuZ3RoLGM9cltpXT1uZXcgQXJyYXkoZikscz0wO3M8ZjsrK3MpKG89dVtzXSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18scyx1KSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1tzXT1hKTtyZXR1cm4gbmV3IFJ0KHIsdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Syh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9W10saT1bXSxvPTA7bzxlOysrbylmb3IodmFyIGEsdT1uW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpKGE9dVtjXSkmJihyLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHUpKSxpLnB1c2goYSkpO3JldHVybiBuZXcgUnQocixpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ydCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxmPXJbaV09W10sYz0wO2M8dTsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmZi5wdXNoKG8pO3JldHVybiBuZXcgUnQocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlLHI9bj9mdDp1dCxpPXRoaXMuX3BhcmVudHMsbz10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihlPXQsdD1mdW5jdGlvbigpe3JldHVybiBlfSk7Zm9yKHZhciBhPW8ubGVuZ3RoLHU9bmV3IEFycmF5KGEpLGY9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHM9MDtzPGE7KytzKXt2YXIgbD1pW3NdLGg9b1tzXSxkPWgubGVuZ3RoLHA9dC5jYWxsKGwsbCYmbC5fX2RhdGFfXyxzLGkpLHY9cC5sZW5ndGgsZz1mW3NdPW5ldyBBcnJheSh2KSx5PXVbc109bmV3IEFycmF5KHYpO3IobCxoLGcseSxjW3NdPW5ldyBBcnJheShkKSxwLG4pO2Zvcih2YXIgXyxiLG09MCx4PTA7bTx2OysrbSlpZihfPWdbbV0pe2ZvcihtPj14JiYoeD1tKzEpOyEoYj15W3hdKSYmKyt4PHY7KTtfLl9uZXh0PWJ8fG51bGx9fXJldHVybih1PW5ldyBSdCh1LGkpKS5fZW50ZXI9Zix1Ll9leGl0PWMsdX0sZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJ0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKGl0KSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbigpe3JldHVybiBuZXcgUnQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChpdCksdGhpcy5fcGFyZW50cyl9LG1lcmdlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBSdChhLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSxhPWlbb107LS1vPj0wOykocj1pW29dKSYmKGEmJmEhPT1yLm5leHRTaWJsaW5nJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsYSksYT1yKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4sZSl7cmV0dXJuIG4mJmU/dChuLl9fZGF0YV9fLGUuX19kYXRhX18pOiFuLSFlfXR8fCh0PWN0KTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkociksbz0wO288cjsrK28pe2Zvcih2YXIgYSx1PWVbb10sZj11Lmxlbmd0aCxjPWlbb109bmV3IEFycmF5KGYpLHM9MDtzPGY7KytzKShhPXVbc10pJiYoY1tzXT1hKTtjLnNvcnQobil9cmV0dXJuIG5ldyBSdChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxuPS0xO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0Wysrbl09dGhpc30pLHR9LG5vZGU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByPXRbbl0saT0wLG89ci5sZW5ndGg7aTxvOysraSl7dmFyIGE9cltpXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Kyt0fSksdH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPTAscj1uLmxlbmd0aDtlPHI7KytlKWZvcih2YXIgaSxvPW5bZV0sYT0wLHU9by5sZW5ndGg7YTx1OysrYSkoaT1vW2FdKSYmdC5jYWxsKGksaS5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9JCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciByPXRoaXMubm9kZSgpO3JldHVybiBlLmxvY2FsP3IuZ2V0QXR0cmlidXRlTlMoZS5zcGFjZSxlLmxvY2FsKTpyLmdldEF0dHJpYnV0ZShlKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2UubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19OmUubG9jYWw/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19KShlLG4pKX0sc3R5bGU6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1uP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxyLGUpfX06ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxuLGUpfX0pKHQsbixudWxsPT1lPyIiOmUpKTpsdCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19OiJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09bn19KSh0LG4pKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbih0LG4pe3ZhciBlPWh0KHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByPWR0KHRoaXMubm9kZSgpKSxpPS0xLG89ZS5sZW5ndGg7KytpPG87KWlmKCFyLmNvbnRhaW5zKGVbaV0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7KG4uYXBwbHkodGhpcyxhcmd1bWVudHMpP3Z0Omd0KSh0aGlzLHQpfX06bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2dCh0aGlzLHQpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Z3QodGhpcyx0KX19KShlLG4pKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD95dDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fSkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P190OigiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX0pKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChidCl9LGxvd2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChtdCl9LGFwcGVuZDpmdW5jdGlvbih0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlcodCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Vyh0KSxyPW51bGw9PW4/eHQ6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRKG4pO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaCh3dCl9LGNsb25lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P0F0Ok10KX0sZGF0dW06ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx7dHlwZTp0LG5hbWU6bn19KX0odCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2Zvcih1PW4/a3Q6RXQsbnVsbD09ZSYmKGU9ITEpLHI9MDtyPGE7KytyKXRoaXMuZWFjaCh1KG9bcl0sbixlKSk7cmV0dXJuIHRoaXN9dmFyIHU9dGhpcy5ub2RlKCkuX19vbjtpZih1KWZvcih2YXIgZixjPTAscz11Lmxlbmd0aDtjPHM7KytjKWZvcihyPTAsZj11W2NdO3I8YTsrK3IpaWYoKGk9b1tyXSkudHlwZT09PWYudHlwZSYmaS5uYW1lPT09Zi5uYW1lKXJldHVybiBmLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMsdCxuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQsbil9fSkodCxuKSl9fTt2YXIgVXQ9MDtmdW5jdGlvbiBxdCgpe3JldHVybiBuZXcgT3R9ZnVuY3Rpb24gT3QoKXt0aGlzLl89IkAiKygrK1V0KS50b1N0cmluZygzNil9ZnVuY3Rpb24gWXQoKXtmb3IodmFyIG4sZT10LmV2ZW50O249ZS5zb3VyY2VFdmVudDspZT1uO3JldHVybiBlfWZ1bmN0aW9uIEJ0KHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFksWyhyPXIubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24gRnQodCl7dmFyIG49WXQoKTtyZXR1cm4gbi5jaGFuZ2VkVG91Y2hlcyYmKG49bi5jaGFuZ2VkVG91Y2hlc1swXSksQnQodCxuKX1mdW5jdGlvbiBJdCh0LG4sZSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoZT1uLG49WXQoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciByLGk9MCxvPW4/bi5sZW5ndGg6MDtpPG87KytpKWlmKChyPW5baV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBCdCh0LHIpO3JldHVybiBudWxsfWZ1bmN0aW9uIEh0KCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBqdCgpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIFh0KHQpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9RHQodCkub24oImRyYWdzdGFydC5kcmFnIixqdCwhMCk7Im9uc2VsZWN0c3RhcnQiaW4gbj9lLm9uKCJzZWxlY3RzdGFydC5kcmFnIixqdCwhMCk6KG4uX19ub3NlbGVjdD1uLnN0eWxlLk1velVzZXJTZWxlY3Qsbi5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gR3QodCxuKXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPUR0KHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7biYmKHIub24oImNsaWNrLmRyYWciLGp0LCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5vbigiY2xpY2suZHJhZyIsbnVsbCl9LDApKSwib25zZWxlY3RzdGFydCJpbiBlP3Iub24oInNlbGVjdHN0YXJ0LmRyYWciLG51bGwpOihlLnN0eWxlLk1velVzZXJTZWxlY3Q9ZS5fX25vc2VsZWN0LGRlbGV0ZSBlLl9fbm9zZWxlY3QpfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiAkdCh0LG4sZSxyLGksbyxhLHUsZixjKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc3ViamVjdD1lLHRoaXMuaWRlbnRpZmllcj1yLHRoaXMuYWN0aXZlPWksdGhpcy54PW8sdGhpcy55PWEsdGhpcy5keD11LHRoaXMuZHk9Zix0aGlzLl89Y31mdW5jdGlvbiBXdCgpe3JldHVybiF0LmV2ZW50LmJ1dHRvbn1mdW5jdGlvbiBadCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gUXQobil7cmV0dXJuIG51bGw9PW4/e3g6dC5ldmVudC54LHk6dC5ldmVudC55fTpufWZ1bmN0aW9uIEp0KCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIEt0KHQsbixlKXt0LnByb3RvdHlwZT1uLnByb3RvdHlwZT1lLGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiB0bih0LG4pe3ZhciBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgciBpbiBuKWVbcl09bltyXTtyZXR1cm4gZX1mdW5jdGlvbiBubigpe31PdC5wcm90b3R5cGU9cXQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPdCxnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuXzshKG4gaW4gdCk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdFtuXX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbdGhpcy5fXT1ufSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuXyBpbiB0JiZkZWxldGUgdFt0aGlzLl9dfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fSwkdC5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl8ub24uYXBwbHkodGhpcy5fLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT10aGlzLl8/dGhpczp0fTt2YXIgZW49IlxccyooWystXT9cXGQrKVxccyoiLHJuPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLG9uPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixhbj0vXiMoWzAtOWEtZl17M30pJC8sdW49L14jKFswLTlhLWZdezZ9KSQvLGZuPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tlbixlbixlbl0rIlxcKSQiKSxjbj1uZXcgUmVnRXhwKCJecmdiXFwoIitbb24sb24sb25dKyJcXCkkIiksc249bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tlbixlbixlbixybl0rIlxcKSQiKSxsbj1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW29uLG9uLG9uLHJuXSsiXFwpJCIpLGhuPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tybixvbixvbl0rIlxcKSQiKSxkbj1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW3JuLG9uLG9uLHJuXSsiXFwpJCIpLHBuPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIHZuKHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1hbi5leGVjKHQpKT9uZXcgbW4oKG49cGFyc2VJbnQoblsxXSwxNikpPj44JjE1fG4+PjQmMjQwLG4+PjQmMTV8MjQwJm4sKDE1Jm4pPDw0fDE1Jm4sMSk6KG49dW4uZXhlYyh0KSk/Z24ocGFyc2VJbnQoblsxXSwxNikpOihuPWZuLmV4ZWModCkpP25ldyBtbihuWzFdLG5bMl0sblszXSwxKToobj1jbi5leGVjKHQpKT9uZXcgbW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsMSk6KG49c24uZXhlYyh0KSk/eW4oblsxXSxuWzJdLG5bM10sbls0XSk6KG49bG4uZXhlYyh0KSk/eW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsbls0XSk6KG49aG4uZXhlYyh0KSk/d24oblsxXSxuWzJdLzEwMCxuWzNdLzEwMCwxKToobj1kbi5leGVjKHQpKT93bihuWzFdLG5bMl0vMTAwLG5bM10vMTAwLG5bNF0pOnBuLmhhc093blByb3BlcnR5KHQpP2duKHBuW3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgbW4oTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBnbih0KXtyZXR1cm4gbmV3IG1uKHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiB5bih0LG4sZSxyKXtyZXR1cm4gcjw9MCYmKHQ9bj1lPU5hTiksbmV3IG1uKHQsbixlLHIpfWZ1bmN0aW9uIF9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSx0P25ldyBtbigodD10LnJnYigpKS5yLHQuZyx0LmIsdC5vcGFjaXR5KTpuZXcgbW59ZnVuY3Rpb24gYm4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP19uKHQpOm5ldyBtbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gbW4odCxuLGUscil7dGhpcy5yPSt0LHRoaXMuZz0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIHhuKHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24gd24odCxuLGUscil7cmV0dXJuIHI8PTA/dD1uPWU9TmFOOmU8PTB8fGU+PTE/dD1uPU5hTjpuPD0wJiYodD1OYU4pLG5ldyBBbih0LG4sZSxyKX1mdW5jdGlvbiBNbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEFuKXJldHVybiBuZXcgQW4odC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSwhdClyZXR1cm4gbmV3IEFuO2lmKHQgaW5zdGFuY2VvZiBBbilyZXR1cm4gdDt2YXIgbj0odD10LnJnYigpKS5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9TWF0aC5taW4obixlLHIpLG89TWF0aC5tYXgobixlLHIpLGE9TmFOLHU9by1pLGY9KG8raSkvMjtyZXR1cm4gdT8oYT1uPT09bz8oZS1yKS91KzYqKGU8cik6ZT09PW8/KHItbikvdSsyOihuLWUpL3UrNCx1Lz1mPC41P28raToyLW8taSxhKj02MCk6dT1mPjAmJmY8MT8wOmEsbmV3IEFuKGEsdSxmLHQub3BhY2l0eSl9KHQpOm5ldyBBbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gQW4odCxuLGUscil7dGhpcy5oPSt0LHRoaXMucz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIFRuKHQsbixlKXtyZXR1cm4gMjU1Kih0PDYwP24rKGUtbikqdC82MDp0PDE4MD9lOnQ8MjQwP24rKGUtbikqKDI0MC10KS82MDpuKX1LdChubix2bix7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5oZXgoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn19KSxLdChtbixibix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IG1uKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBtbih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9dGhpcy5yJiZ0aGlzLnI8PTI1NSYmMDw9dGhpcy5nJiZ0aGlzLmc8PTI1NSYmMDw9dGhpcy5iJiZ0aGlzLmI8PTI1NSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpmdW5jdGlvbigpe3JldHVybiIjIit4bih0aGlzLnIpK3huKHRoaXMuZykreG4odGhpcy5iKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksS3QoQW4sTW4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksbj1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxyPWUrKGU8LjU/ZToxLWUpKm4saT0yKmUtcjtyZXR1cm4gbmV3IG1uKFRuKHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLFRuKHQsaSxyKSxUbih0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgTm49TWF0aC5QSS8xODAsU249MTgwL01hdGguUEksRW49Ljk2NDIyLGtuPTEsQ249LjgyNTIxLFBuPTQvMjksem49Ni8yOSxSbj0zKnpuKnpuLExuPXpuKnpuKnpuO2Z1bmN0aW9uIERuKHQpe2lmKHQgaW5zdGFuY2VvZiBxbilyZXR1cm4gbmV3IHFuKHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGpuKXtpZihpc05hTih0LmgpKXJldHVybiBuZXcgcW4odC5sLDAsMCx0Lm9wYWNpdHkpO3ZhciBuPXQuaCpObjtyZXR1cm4gbmV3IHFuKHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIG1ufHwodD1fbih0KSk7dmFyIGUscixpPUZuKHQuciksbz1Gbih0LmcpLGE9Rm4odC5iKSx1PU9uKCguMjIyNTA0NSppKy43MTY4Nzg2Km8rLjA2MDYxNjkqYSkva24pO3JldHVybiBpPT09byYmbz09PWE/ZT1yPXU6KGU9T24oKC40MzYwNzQ3KmkrLjM4NTA2NDkqbysuMTQzMDgwNCphKS9Fbikscj1PbigoLjAxMzkzMjIqaSsuMDk3MTA0NSpvKy43MTQxNzMzKmEpL0NuKSksbmV3IHFuKDExNip1LTE2LDUwMCooZS11KSwyMDAqKHUtciksdC5vcGFjaXR5KX1mdW5jdGlvbiBVbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/RG4odCk6bmV3IHFuKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBxbih0LG4sZSxyKXt0aGlzLmw9K3QsdGhpcy5hPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gT24odCl7cmV0dXJuIHQ+TG4/TWF0aC5wb3codCwxLzMpOnQvUm4rUG59ZnVuY3Rpb24gWW4odCl7cmV0dXJuIHQ+em4/dCp0KnQ6Um4qKHQtUG4pfWZ1bmN0aW9uIEJuKHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gRm4odCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gSW4odCl7aWYodCBpbnN0YW5jZW9mIGpuKXJldHVybiBuZXcgam4odC5oLHQuYyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgcW58fCh0PURuKHQpKSwwPT09dC5hJiYwPT09dC5iKXJldHVybiBuZXcgam4oTmFOLDAsdC5sLHQub3BhY2l0eSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpTbjtyZXR1cm4gbmV3IGpuKG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIEhuKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGpuKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1LdChxbixVbix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBxbih0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHFuKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LG49aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxlPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBtbihCbigzLjEzMzg1NjEqKG49RW4qWW4obikpLTEuNjE2ODY2NyoodD1rbipZbih0KSktLjQ5MDYxNDYqKGU9Q24qWW4oZSkpKSxCbigtLjk3ODc2ODQqbisxLjkxNjE0MTUqdCsuMDMzNDU0KmUpLEJuKC4wNzE5NDUzKm4tLjIyODk5MTQqdCsxLjQwNTI0MjcqZSksdGhpcy5vcGFjaXR5KX19KSksS3Qoam4sSG4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgam4odGhpcy5oLHRoaXMuYyx0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBqbih0aGlzLmgsdGhpcy5jLHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzKS5yZ2IoKX19KSk7dmFyIFhuPS0uMTQ4NjEsR249MS43ODI3NyxWbj0tLjI5MjI3LCRuPS0uOTA2NDksV249MS45NzI5NCxabj1XbiokbixRbj1XbipHbixKbj1HbipWbi0kbipYbjtmdW5jdGlvbiBLbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIHRlKXJldHVybiBuZXcgdGUodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgbW58fCh0PV9uKHQpKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT0oSm4qcitabipuLVFuKmUpLyhKbitabi1Rbiksbz1yLWksYT0oV24qKGUtaSktVm4qbykvJG4sdT1NYXRoLnNxcnQoYSphK28qbykvKFduKmkqKDEtaSkpLGY9dT9NYXRoLmF0YW4yKGEsbykqU24tMTIwOk5hTjtyZXR1cm4gbmV3IHRlKGY8MD9mKzM2MDpmLHUsaSx0Lm9wYWNpdHkpfSh0KTpuZXcgdGUodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIHRlKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBuZSh0LG4sZSxyLGkpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSpuKyg0LTYqbyszKmEpKmUrKDErMyp0KzMqby0zKmEpKnIrYSppKS82fWZ1bmN0aW9uIGVlKHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sYT1yPjA/dFtyLTFdOjIqaS1vLHU9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBuZSgoZS1yL24pKm4sYSxpLG8sdSl9fWZ1bmN0aW9uIHJlKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1NYXRoLmZsb29yKCgoZSU9MSk8MD8rK2U6ZSkqbiksaT10WyhyK24tMSklbl0sbz10W3Ilbl0sYT10WyhyKzEpJW5dLHU9dFsocisyKSVuXTtyZXR1cm4gbmUoKGUtci9uKSpuLGksbyxhLHUpfX1mdW5jdGlvbiBpZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gb2UodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiBhZSh0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9vZSh0LGU+MTgwfHxlPC0xODA/ZS0zNjAqTWF0aC5yb3VuZChlLzM2MCk6ZSk6aWUoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiB1ZSh0KXtyZXR1cm4gMT09KHQ9K3QpP2ZlOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGUtbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9TWF0aC5wb3codCxlKSxuPU1hdGgucG93KG4sZSktdCxlPTEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5wb3codCtyKm4sZSl9fShuLGUsdCk6aWUoaXNOYU4obik/ZTpuKX19ZnVuY3Rpb24gZmUodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/b2UodCxlKTppZShpc05hTih0KT9uOnQpfUt0KHRlLEtuLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKk5uLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBtbigyNTUqKG4rZSooWG4qcitHbippKSksMjU1KihuK2UqKFZuKnIrJG4qaSkpLDI1NSoobitlKihXbipyKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIGNlPWZ1bmN0aW9uIHQobil7dmFyIGU9dWUobik7ZnVuY3Rpb24gcih0LG4pe3ZhciByPWUoKHQ9Ym4odCkpLnIsKG49Ym4obikpLnIpLGk9ZSh0Lmcsbi5nKSxvPWUodC5iLG4uYiksYT1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1yKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT1hKG4pLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0oMSk7ZnVuY3Rpb24gc2UodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlLHIsaT1uLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKTtmb3IoZT0wO2U8aTsrK2Upcj1ibihuW2VdKSxvW2VdPXIucnx8MCxhW2VdPXIuZ3x8MCx1W2VdPXIuYnx8MDtyZXR1cm4gbz10KG8pLGE9dChhKSx1PXQodSksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz1hKHQpLHIuYj11KHQpLHIrIiJ9fX12YXIgbGU9c2UoZWUpLGhlPXNlKHJlKTtmdW5jdGlvbiBkZSh0LG4pe3ZhciBlLHI9bj9uLmxlbmd0aDowLGk9dD9NYXRoLm1pbihyLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxpOysrZSlvW2VdPW1lKHRbZV0sbltlXSk7Zm9yKDtlPHI7KytlKWFbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGU9MDtlPGk7KytlKWFbZV09b1tlXSh0KTtyZXR1cm4gYX19ZnVuY3Rpb24gcGUodCxuKXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gbi09dD0rdCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX1mdW5jdGlvbiB2ZSh0LG4pe3JldHVybiBuLT10PSt0LGZ1bmN0aW9uKGUpe3JldHVybiB0K24qZX19ZnVuY3Rpb24gZ2UodCxuKXt2YXIgZSxyPXt9LGk9e307Zm9yKGUgaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1uJiYib2JqZWN0Ij09dHlwZW9mIG58fChuPXt9KSxuKWUgaW4gdD9yW2VdPW1lKHRbZV0sbltlXSk6aVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZSBpbiByKWlbZV09cltlXSh0KTtyZXR1cm4gaX19dmFyIHllPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxfZT1uZXcgUmVnRXhwKHllLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGJlKHQsbil7dmFyIGUscixpLG89eWUubGFzdEluZGV4PV9lLmxhc3RJbmRleD0wLGE9LTEsdT1bXSxmPVtdO2Zvcih0Kz0iIixuKz0iIjsoZT15ZS5leGVjKHQpKSYmKHI9X2UuZXhlYyhuKSk7KShpPXIuaW5kZXgpPm8mJihpPW4uc2xpY2UobyxpKSx1W2FdP3VbYV0rPWk6dVsrK2FdPWkpLChlPWVbMF0pPT09KHI9clswXSk/dVthXT91W2FdKz1yOnVbKythXT1yOih1WysrYV09bnVsbCxmLnB1c2goe2k6YSx4OnZlKGUscil9KSksbz1fZS5sYXN0SW5kZXg7cmV0dXJuIG88bi5sZW5ndGgmJihpPW4uc2xpY2UobyksdVthXT91W2FdKz1pOnVbKythXT1pKSx1Lmxlbmd0aDwyP2ZbMF0/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifX0oZlswXS54KTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KG4pOihuPWYubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPTA7cjxuOysrcil1WyhlPWZbcl0pLmldPWUueCh0KTtyZXR1cm4gdS5qb2luKCIiKX0pfWZ1bmN0aW9uIG1lKHQsbil7dmFyIGUscj10eXBlb2YgbjtyZXR1cm4gbnVsbD09bnx8ImJvb2xlYW4iPT09cj9pZShuKTooIm51bWJlciI9PT1yP3ZlOiJzdHJpbmciPT09cj8oZT12bihuKSk/KG49ZSxjZSk6YmU6biBpbnN0YW5jZW9mIHZuP2NlOm4gaW5zdGFuY2VvZiBEYXRlP3BlOkFycmF5LmlzQXJyYXkobik/ZGU6ImZ1bmN0aW9uIiE9dHlwZW9mIG4udmFsdWVPZiYmImZ1bmN0aW9uIiE9dHlwZW9mIG4udG9TdHJpbmd8fGlzTmFOKG4pP2dlOnZlKSh0LG4pfWZ1bmN0aW9uIHhlKHQsbil7cmV0dXJuIG4tPXQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQodCtuKmUpfX12YXIgd2UsTWUsQWUsVGUsTmU9MTgwL01hdGguUEksU2U9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX07ZnVuY3Rpb24gRWUodCxuLGUscixpLG8pe3ZhciBhLHUsZjtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K24qbikpJiYodC89YSxuLz1hKSwoZj10KmUrbipyKSYmKGUtPXQqZixyLT1uKmYpLCh1PU1hdGguc3FydChlKmUrcipyKSkmJihlLz11LHIvPXUsZi89dSksdCpyPG4qZSYmKHQ9LXQsbj0tbixmPS1mLGE9LWEpLHt0cmFuc2xhdGVYOmksdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKG4sdCkqTmUsc2tld1g6TWF0aC5hdGFuKGYpKk5lLHNjYWxlWDphLHNjYWxlWTp1fX1mdW5jdGlvbiBrZSh0LG4sZSxyKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgdT1bXSxmPVtdO3JldHVybiBvPXQobyksYT10KGEpLGZ1bmN0aW9uKHQscixpLG8sYSx1KXtpZih0IT09aXx8ciE9PW8pe3ZhciBmPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxuLG51bGwsZSk7dS5wdXNoKHtpOmYtNCx4OnZlKHQsaSl9LHtpOmYtMix4OnZlKHIsbyl9KX1lbHNlKGl8fG8pJiZhLnB1c2goInRyYW5zbGF0ZSgiK2krbitvK2UpfShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVksdSxmKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj8odC1uPjE4MD9uKz0zNjA6bi10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOmUucHVzaChpKGUpKyJyb3RhdGUoIixudWxsLHIpLTIseDp2ZSh0LG4pfSkpOm4mJmUucHVzaChpKGUpKyJyb3RhdGUoIituK3IpfShvLnJvdGF0ZSxhLnJvdGF0ZSx1LGYpLGZ1bmN0aW9uKHQsbixlLG8pe3QhPT1uP28ucHVzaCh7aTplLnB1c2goaShlKSsic2tld1goIixudWxsLHIpLTIseDp2ZSh0LG4pfSk6biYmZS5wdXNoKGkoZSkrInNrZXdYKCIrbityKX0oby5za2V3WCxhLnNrZXdYLHUsZiksZnVuY3Rpb24odCxuLGUscixvLGEpe2lmKHQhPT1lfHxuIT09cil7dmFyIHU9by5wdXNoKGkobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO2EucHVzaCh7aTp1LTQseDp2ZSh0LGUpfSx7aTp1LTIseDp2ZShuLHIpfSl9ZWxzZSAxPT09ZSYmMT09PXJ8fG8ucHVzaChpKG8pKyJzY2FsZSgiK2UrIiwiK3IrIikiKX0oby5zY2FsZVgsby5zY2FsZVksYS5zY2FsZVgsYS5zY2FsZVksdSxmKSxvPWE9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPWYubGVuZ3RoOysrZTxyOyl1WyhuPWZbZV0pLmldPW4ueCh0KTtyZXR1cm4gdS5qb2luKCIiKX19fXZhciBDZT1rZShmdW5jdGlvbih0KXtyZXR1cm4ibm9uZSI9PT10P1NlOih3ZXx8KHdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLE1lPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxBZT1kb2N1bWVudC5kZWZhdWx0Vmlldyksd2Uuc3R5bGUudHJhbnNmb3JtPXQsdD1BZS5nZXRDb21wdXRlZFN0eWxlKE1lLmFwcGVuZENoaWxkKHdlKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxNZS5yZW1vdmVDaGlsZCh3ZSksRWUoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0sInB4LCAiLCJweCkiLCJkZWcpIiksUGU9a2UoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/U2U6KFRlfHwoVGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksVGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PVRlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP0VlKCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOlNlKX0sIiwgIiwiKSIsIikiKSx6ZT1NYXRoLlNRUlQyLFJlPTIsTGU9NCxEZT0xZS0xMjtmdW5jdGlvbiBVZSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBxZSh0LG4pe3ZhciBlLHIsaT10WzBdLG89dFsxXSxhPXRbMl0sdT1uWzBdLGY9blsxXSxjPW5bMl0scz11LWksbD1mLW8saD1zKnMrbCpsO2lmKGg8RGUpcj1NYXRoLmxvZyhjL2EpL3plLGU9ZnVuY3Rpb24odCl7cmV0dXJuW2krdCpzLG8rdCpsLGEqTWF0aC5leHAoemUqdCpyKV19O2Vsc2V7dmFyIGQ9TWF0aC5zcXJ0KGgpLHA9KGMqYy1hKmErTGUqaCkvKDIqYSpSZSpkKSx2PShjKmMtYSphLUxlKmgpLygyKmMqUmUqZCksZz1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLHk9TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KTtyPSh5LWcpL3plLGU9ZnVuY3Rpb24odCl7dmFyIG4sZT10KnIsdT1VZShnKSxmPWEvKFJlKmQpKih1KihuPXplKmUrZywoKG49TWF0aC5leHAoMipuKSktMSkvKG4rMSkpLWZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfShnKSk7cmV0dXJuW2krZipzLG8rZipsLGEqdS9VZSh6ZSplK2cpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPU1uKG4pKS5oLChlPU1uKGUpKS5oKSxpPWZlKG4ucyxlLnMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgWWU9T2UoYWUpLEJlPU9lKGZlKTtmdW5jdGlvbiBGZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPUhuKG4pKS5oLChlPUhuKGUpKS5oKSxpPWZlKG4uYyxlLmMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgSWU9RmUoYWUpLEhlPUZlKGZlKTtmdW5jdGlvbiBqZSh0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj1LbihuKSkuaCwocj1LbihyKSkuaCksbz1mZShuLnMsci5zKSxhPWZlKG4ubCxyLmwpLHU9ZmUobi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9YShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9dSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9dmFyIFhlPWplKGFlKSxHZT1qZShmZSk7dmFyIFZlLCRlLFdlPTAsWmU9MCxRZT0wLEplPTFlMyxLZT0wLHRyPTAsbnI9MCxlcj0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxycj0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBpcigpe3JldHVybiB0cnx8KHJyKG9yKSx0cj1lci5ub3coKStucil9ZnVuY3Rpb24gb3IoKXt0cj0wfWZ1bmN0aW9uIGFyKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiB1cih0LG4sZSl7dmFyIHI9bmV3IGFyO3JldHVybiByLnJlc3RhcnQodCxuLGUpLHJ9ZnVuY3Rpb24gZnIoKXtpcigpLCsrV2U7Zm9yKHZhciB0LG49VmU7bjspKHQ9dHItbi5fdGltZSk+PTAmJm4uX2NhbGwuY2FsbChudWxsLHQpLG49bi5fbmV4dDstLVdlfWZ1bmN0aW9uIGNyKCl7dHI9KEtlPWVyLm5vdygpKStucixXZT1aZT0wO3RyeXtmcigpfWZpbmFsbHl7V2U9MCxmdW5jdGlvbigpe3ZhciB0LG4sZT1WZSxyPTEvMDtmb3IoO2U7KWUuX2NhbGw/KHI+ZS5fdGltZSYmKHI9ZS5fdGltZSksdD1lLGU9ZS5fbmV4dCk6KG49ZS5fbmV4dCxlLl9uZXh0PW51bGwsZT10P3QuX25leHQ9bjpWZT1uKTskZT10LGxyKHIpfSgpLHRyPTB9fWZ1bmN0aW9uIHNyKCl7dmFyIHQ9ZXIubm93KCksbj10LUtlO24+SmUmJihuci09bixLZT10KX1mdW5jdGlvbiBscih0KXtXZXx8KFplJiYoWmU9Y2xlYXJUaW1lb3V0KFplKSksdC10cj4yND8odDwxLzAmJihaZT1zZXRUaW1lb3V0KGNyLHQtZXIubm93KCktbnIpKSxRZSYmKFFlPWNsZWFySW50ZXJ2YWwoUWUpKSk6KFFlfHwoS2U9ZXIubm93KCksUWU9c2V0SW50ZXJ2YWwoc3IsSmUpKSxXZT0xLHJyKGNyKSkpfWZ1bmN0aW9uIGhyKHQsbixlKXt2YXIgcj1uZXcgYXI7cmV0dXJuIG49bnVsbD09bj8wOituLHIucmVzdGFydChmdW5jdGlvbihlKXtyLnN0b3AoKSx0KGUrbil9LG4sZSkscn1hci5wcm90b3R5cGU9dXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphcixyZXN0YXJ0OmZ1bmN0aW9uKHQsbixlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO2U9KG51bGw9PWU/aXIoKTorZSkrKG51bGw9PW4/MDorbiksdGhpcy5fbmV4dHx8JGU9PT10aGlzfHwoJGU/JGUuX25leHQ9dGhpczpWZT10aGlzLCRlPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPWUsbHIoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsbHIoKSl9fTt2YXIgZHI9SSgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSxwcj1bXSx2cj0wLGdyPTEseXI9Mixfcj0zLGJyPTQsbXI9NSx4cj02O2Z1bmN0aW9uIHdyKHQsbixlLHIsaSxvKXt2YXIgYT10Ll9fdHJhbnNpdGlvbjtpZihhKXtpZihlIGluIGEpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307IWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpPXQuX190cmFuc2l0aW9uO2Z1bmN0aW9uIG8oZil7dmFyIGMscyxsLGg7aWYoZS5zdGF0ZSE9PWdyKXJldHVybiB1KCk7Zm9yKGMgaW4gaSlpZigoaD1pW2NdKS5uYW1lPT09ZS5uYW1lKXtpZihoLnN0YXRlPT09X3IpcmV0dXJuIGhyKG8pO2guc3RhdGU9PT1icj8oaC5zdGF0ZT14cixoLnRpbWVyLnN0b3AoKSxoLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGguaW5kZXgsaC5ncm91cCksZGVsZXRlIGlbY10pOitjPG4mJihoLnN0YXRlPXhyLGgudGltZXIuc3RvcCgpLGRlbGV0ZSBpW2NdKX1pZihocihmdW5jdGlvbigpe2Uuc3RhdGU9PT1fciYmKGUuc3RhdGU9YnIsZS50aW1lci5yZXN0YXJ0KGEsZS5kZWxheSxlLnRpbWUpLGEoZikpfSksZS5zdGF0ZT15cixlLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxlLnN0YXRlPT09eXIpe2ZvcihlLnN0YXRlPV9yLHI9bmV3IEFycmF5KGw9ZS50d2Vlbi5sZW5ndGgpLGM9MCxzPS0xO2M8bDsrK2MpKGg9ZS50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApKSYmKHJbKytzXT1oKTtyLmxlbmd0aD1zKzF9fWZ1bmN0aW9uIGEobil7Zm9yKHZhciBpPW48ZS5kdXJhdGlvbj9lLmVhc2UuY2FsbChudWxsLG4vZS5kdXJhdGlvbik6KGUudGltZXIucmVzdGFydCh1KSxlLnN0YXRlPW1yLDEpLG89LTEsYT1yLmxlbmd0aDsrK288YTspcltvXS5jYWxsKG51bGwsaSk7ZS5zdGF0ZT09PW1yJiYoZS5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLHUoKSl9ZnVuY3Rpb24gdSgpe2Zvcih2YXIgciBpbiBlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLGRlbGV0ZSBpW25dLGkpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1pW25dPWUsZS50aW1lcj11cihmdW5jdGlvbih0KXtlLnN0YXRlPWdyLGUudGltZXIucmVzdGFydChvLGUuZGVsYXksZS50aW1lKSxlLmRlbGF5PD10JiZvKHQtZS5kZWxheSl9LDAsZS50aW1lKX0odCxlLHtuYW1lOm4saW5kZXg6cixncm91cDppLG9uOmRyLHR3ZWVuOnByLHRpbWU6by50aW1lLGRlbGF5Om8uZGVsYXksZHVyYXRpb246by5kdXJhdGlvbixlYXNlOm8uZWFzZSx0aW1lcjpudWxsLHN0YXRlOnZyfSl9ZnVuY3Rpb24gTXIodCxuKXt2YXIgZT1Ucih0LG4pO2lmKGUuc3RhdGU+dnIpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBBcih0LG4pe3ZhciBlPVRyKHQsbik7aWYoZS5zdGF0ZT55cil0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBUcih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBlfWZ1bmN0aW9uIE5yKHQsbil7dmFyIGUscixpLG89dC5fX3RyYW5zaXRpb24sYT0hMDtpZihvKXtmb3IoaSBpbiBuPW51bGw9PW4/bnVsbDpuKyIiLG8pKGU9b1tpXSkubmFtZT09PW4/KHI9ZS5zdGF0ZT55ciYmZS5zdGF0ZTxtcixlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLHImJmUub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxkZWxldGUgb1tpXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIFNyKHQsbixlKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9QXIodGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiBUcih0LHIpLnZhbHVlW25dfX1mdW5jdGlvbiBFcih0LG4pe3ZhciBlO3JldHVybigibnVtYmVyIj09dHlwZW9mIG4/dmU6biBpbnN0YW5jZW9mIHZuP2NlOihlPXZuKG4pKT8obj1lLGNlKTpiZSkodCxuKX12YXIga3I9THQucHJvdG90eXBlLmNvbnN0cnVjdG9yO3ZhciBDcj0wO2Z1bmN0aW9uIFByKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiB6cih0KXtyZXR1cm4gTHQoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIFJyKCl7cmV0dXJuKytDcn12YXIgTHI9THQucHJvdG90eXBlO2Z1bmN0aW9uIERyKHQpe3JldHVybigodCo9Mik8PTE/dCp0Oi0tdCooMi10KSsxKS8yfWZ1bmN0aW9uIFVyKHQpe3JldHVybigodCo9Mik8PTE/dCp0KnQ6KHQtPTIpKnQqdCsyKS8yfVByLnByb3RvdHlwZT16ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlByLHNlbGVjdDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVEodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPTA7YTxpOysrYSlmb3IodmFyIHUsZixjPXJbYV0scz1jLmxlbmd0aCxsPW9bYV09bmV3IEFycmF5KHMpLGg9MDtoPHM7KytoKSh1PWNbaF0pJiYoZj10LmNhbGwodSx1Ll9fZGF0YV9fLGgsYykpJiYoIl9fZGF0YV9fImluIHUmJihmLl9fZGF0YV9fPXUuX19kYXRhX18pLGxbaF09Zix3cihsW2hdLG4sZSxoLGwsVHIodSxlKSkpO3JldHVybiBuZXcgUHIobyx0aGlzLl9wYXJlbnRzLG4sZSl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUsodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPVtdLGE9W10sdT0wO3U8aTsrK3UpZm9yKHZhciBmLGM9clt1XSxzPWMubGVuZ3RoLGw9MDtsPHM7KytsKWlmKGY9Y1tsXSl7Zm9yKHZhciBoLGQ9dC5jYWxsKGYsZi5fX2RhdGFfXyxsLGMpLHA9VHIoZixlKSx2PTAsZz1kLmxlbmd0aDt2PGc7Kyt2KShoPWRbdl0pJiZ3cihoLG4sZSx2LGQscCk7by5wdXNoKGQpLGEucHVzaChmKX1yZXR1cm4gbmV3IFByKG8sYSxuLGUpfSxmaWx0ZXI6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXJ0KHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLGE9bltpXSx1PWEubGVuZ3RoLGY9cltpXT1bXSxjPTA7Yzx1OysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZmLnB1c2gobyk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uKHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBQcihhLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiBuZXcga3IodGhpcy5fZ3JvdXBzLHRoaXMuX3BhcmVudHMpfSx0cmFuc2l0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsbj10aGlzLl9pZCxlPVJyKCkscj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIGEsdT1yW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpaWYoYT11W2NdKXt2YXIgcz1UcihhLG4pO3dyKGEsdCxlLGMsdSx7dGltZTpzLnRpbWUrcy5kZWxheStzLmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246cy5kdXJhdGlvbixlYXNlOnMuZWFzZX0pfXJldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHQsZSl9LGNhbGw6THIuY2FsbCxub2RlczpMci5ub2Rlcyxub2RlOkxyLm5vZGUsc2l6ZTpMci5zaXplLGVtcHR5OkxyLmVtcHR5LGVhY2g6THIuZWFjaCxvbjpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/VHIodGhpcy5ub2RlKCksZSkub24ub24odCk6dGhpcy5lYWNoKGZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG89ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KXt2YXIgbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKHQ9dC5zbGljZSgwLG4pKSwhdHx8InN0YXJ0Ij09PXR9KX0obik/TXI6QXI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9byh0aGlzLHQpLHU9YS5vbjt1IT09ciYmKGk9KHI9dSkuY29weSgpKS5vbihuLGUpLGEub249aX19KGUsdCxuKSl9LGF0dHI6ZnVuY3Rpb24odCxuKXt2YXIgZT0kKHQpLHI9InRyYW5zZm9ybSI9PT1lP1BlOkVyO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuPyhlLmxvY2FsP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdT1lKHRoaXMpO2lmKG51bGwhPXUpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpKT09PXU/bnVsbDphPT09ciYmdT09PWk/bzpvPW4ocj1hLGk9dSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSx1PWUodGhpcyk7aWYobnVsbCE9dSlyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT11P251bGw6YT09PXImJnU9PT1pP286bz1uKHI9YSxpPXUpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX0pKGUscixTcih0aGlzLCJhdHRyLiIrdCxuKSk6bnVsbD09bj8oZS5sb2NhbD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19KShlKTooZS5sb2NhbD9mdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0pKGUscixuKyIiKSl9LGF0dHJUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9JCh0KTtyZXR1cm4gdGhpcy50d2VlbihlLChyLmxvY2FsP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9OmZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGUodCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX0pKHIsbikpfSxzdHlsZTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9InRyYW5zZm9ybSI9PSh0Kz0iIik/Q2U6RXI7cmV0dXJuIG51bGw9PW4/dGhpcy5zdHlsZVR3ZWVuKHQsZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89bHQodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGx0KHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1lJiZhPT09cj9pOmk9bihlPW8scj1hKX19KHQscikpLm9uKCJlbmQuc3R5bGUuIit0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1sdCh0aGlzLHQpLHU9ZSh0aGlzKTtyZXR1cm4gbnVsbD09dSYmKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksdT1sdCh0aGlzLHQpKSxhPT09dT9udWxsOmE9PT1yJiZ1PT09aT9vOm89bihyPWEsaT11KX19KHQscixTcih0aGlzLCJzdHlsZS4iK3QsbikpOmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWx0KHRoaXMsdCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0odCxyLG4rIiIpLGUpfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLGZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn0odCxuLG51bGw9PWU/IiI6ZSkpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX0oU3IodGhpcywidGV4dCIsdCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KG51bGw9PXQ/IiI6dCsiIikpfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsKHQ9dGhpcy5faWQsZnVuY3Rpb24oKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBlIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtlIT09dClyZXR1cm47biYmbi5yZW1vdmVDaGlsZCh0aGlzKX0pKTt2YXIgdH0sdHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcixpPVRyKHRoaXMubm9kZSgpLGUpLnR3ZWVuLG89MCxhPWkubGVuZ3RoO288YTsrK28paWYoKHI9aVtvXSkubmFtZT09PXQpcmV0dXJuIHIudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0LG4pe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9QXIodGhpcyx0KSxvPWkudHdlZW47aWYobyE9PWUpZm9yKHZhciBhPTAsdT0ocj1lPW8pLmxlbmd0aDthPHU7KythKWlmKHJbYV0ubmFtZT09PW4peyhyPXIuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9aS50d2Vlbj1yfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPUFyKHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1yKXtpPShyPWEpLnNsaWNlKCk7Zm9yKHZhciB1PXtuYW1lOm4sdmFsdWU6ZX0sZj0wLGM9aS5sZW5ndGg7ZjxjOysrZilpZihpW2ZdLm5hbWU9PT1uKXtpW2ZdPXU7YnJlYWt9Zj09PWMmJmkucHVzaCh1KX1vLnR3ZWVuPWl9fSkoZSx0LG4pKX0sZGVsYXk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kdXJhdGlvbn0sZWFzZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7QXIodGhpcyx0KS5lYXNlPW59fShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5lYXNlfX07dmFyIHFyPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5wb3codCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksT3I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksWXI9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3codCxuKToyLU1hdGgucG93KDItdCxuKSkvMn1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksQnI9TWF0aC5QSSxGcj1Cci8yO2Z1bmN0aW9uIElyKHQpe3JldHVybigxLU1hdGguY29zKEJyKnQpKS8yfWZ1bmN0aW9uIEhyKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3coMiwxMCp0LTEwKToyLU1hdGgucG93KDIsMTAtMTAqdCkpLzJ9ZnVuY3Rpb24ganIodCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9dmFyIFhyPTQvMTEsR3I9Ni8xMSxWcj04LzExLCRyPS43NSxXcj05LzExLFpyPTEwLzExLFFyPS45Mzc1LEpyPTIxLzIyLEtyPTYzLzY0LHRpPTEvWHIvWHI7ZnVuY3Rpb24gbmkodCl7cmV0dXJuKHQ9K3QpPFhyP3RpKnQqdDp0PFZyP3RpKih0LT1HcikqdCskcjp0PFpyP3RpKih0LT1XcikqdCtRcjp0aSoodC09SnIpKnQrS3J9dmFyIGVpPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCkscmk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybi0tdCp0KigobisxKSp0K24pKzF9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSgxLjcwMTU4KSxpaT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKG4rMSkqdC1uKToodC09MikqdCooKG4rMSkqdCtuKSsyKS8yfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksb2k9MipNYXRoLlBJLGFpPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9pKTtmdW5jdGlvbiBpKHQpe3JldHVybiBuKk1hdGgucG93KDIsMTAqLS10KSpNYXRoLnNpbigoci10KS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksdWk9ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89b2kpO2Z1bmN0aW9uIGkodCl7cmV0dXJuIDEtbipNYXRoLnBvdygyLC0xMCoodD0rdCkpKk1hdGguc2luKCh0K3IpL2UpfXJldHVybiBpLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqb2kpfSxpLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxpfSgxLC4zKSxmaT1mdW5jdGlvbiB0KG4sZSl7dmFyIHI9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1vaSk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4oKHQ9Mip0LTEpPDA/bipNYXRoLnBvdygyLDEwKnQpKk1hdGguc2luKChyLXQpL2UpOjItbipNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigocit0KS9lKSkvMn1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksY2k9e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOlVyfTtmdW5jdGlvbiBzaSh0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBjaS50aW1lPWlyKCksY2k7cmV0dXJuIGV9THQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TnIodGhpcyx0KX0pfSxMdC5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBQcj8obj10Ll9pZCx0PXQuX25hbWUpOihuPVJyKCksKGU9Y2kpLnRpbWU9aXIoKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKShhPXVbY10pJiZ3cihhLHQsbixjLHUsZXx8c2koYSxuKSk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdCxuKX07dmFyIGxpPVtudWxsXTtmdW5jdGlvbiBoaSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gZGkodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zZWxlY3Rpb249ZX1mdW5jdGlvbiBwaSgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gdmkoKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX12YXIgZ2k9e25hbWU6ImRyYWcifSx5aT17bmFtZToic3BhY2UifSxfaT17bmFtZToiaGFuZGxlIn0sYmk9e25hbWU6ImNlbnRlciJ9LG1pPXtuYW1lOiJ4IixoYW5kbGVzOlsiZSIsInciXS5tYXAoRWkpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbdFswXSxuWzBdWzFdXSxbdFsxXSxuWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSx4aT17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW25bMF1bMF0sdFswXV0sW25bMV1bMF0sdFsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzFdLHRbMV1bMV1dfX0sd2k9e25hbWU6Inh5IixoYW5kbGVzOlsibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sTWk9e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LEFpPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxUaT17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0sTmk9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sU2k9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX07ZnVuY3Rpb24gRWkodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24ga2koKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gQ2koKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gUGkodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiB6aSh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIFJpKG4pe3ZhciBlLHI9Q2ksaT1raSxvPUkodSwic3RhcnQiLCJicnVzaCIsImVuZCIpLGE9NjtmdW5jdGlvbiB1KHQpe3ZhciBlPXQucHJvcGVydHkoIl9fYnJ1c2giLGgpLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFtFaSgib3ZlcmxheSIpXSk7ZS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KS5tZXJnZShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UGkodGhpcykuZXh0ZW50O0R0KHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pLHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbRWkoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsTWkuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIHI9dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKG4uaGFuZGxlcyxmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSk7ci5leGl0KCkucmVtb3ZlKCksci5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KS5hdHRyKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiBNaVt0LnR5cGVdfSksdC5lYWNoKGYpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsbCl9ZnVuY3Rpb24gZigpe3ZhciB0PUR0KHRoaXMpLG49UGkodGhpcykuc2VsZWN0aW9uO24/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLG5bMF1bMF0pLmF0dHIoInkiLG5bMF1bMV0pLmF0dHIoIndpZHRoIixuWzFdWzBdLW5bMF1bMF0pLmF0dHIoImhlaWdodCIsblsxXVsxXS1uWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLWEvMjpuWzBdWzBdLWEvMn0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9uWzFdWzFdLWEvMjpuWzBdWzFdLWEvMn0pLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4ibiI9PT10LnR5cGV8fCJzIj09PXQudHlwZT9uWzFdWzBdLW5bMF1bMF0rYTphfSkuYXR0cigiaGVpZ2h0IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0rYTphfSkpOnQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJ4IixudWxsKS5hdHRyKCJ5IixudWxsKS5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKX1mdW5jdGlvbiBjKHQsbil7cmV0dXJuIHQuX19icnVzaC5lbWl0dGVyfHxuZXcgcyh0LG4pfWZ1bmN0aW9uIHModCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLnN0YXRlPXQuX19icnVzaCx0aGlzLmFjdGl2ZT0wfWZ1bmN0aW9uIGwoKXtpZih0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuIHZpKCl9ZWxzZSBpZihlKXJldHVybjtpZihpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHIsbyxhLHUscyxsLGgsZCxwLHYsZyx5LF8sYj10aGlzLG09dC5ldmVudC50YXJnZXQuX19kYXRhX18udHlwZSx4PSJzZWxlY3Rpb24iPT09KHQuZXZlbnQubWV0YUtleT9tPSJvdmVybGF5IjptKT9naTp0LmV2ZW50LmFsdEtleT9iaTpfaSx3PW49PT14aT9udWxsOk5pW21dLE09bj09PW1pP251bGw6U2lbbV0sQT1QaShiKSxUPUEuZXh0ZW50LE49QS5zZWxlY3Rpb24sUz1UWzBdWzBdLEU9VFswXVsxXSxrPVRbMV1bMF0sQz1UWzFdWzFdLFA9dyYmTSYmdC5ldmVudC5zaGlmdEtleSx6PUZ0KGIpLFI9eixMPWMoYixhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09bT9BLnNlbGVjdGlvbj1OPVtbcj1uPT09eGk/Uzp6WzBdLGE9bj09PW1pP0U6elsxXV0sW3M9bj09PXhpP2s6cixoPW49PT1taT9DOmFdXToocj1OWzBdWzBdLGE9TlswXVsxXSxzPU5bMV1bMF0saD1OWzFdWzFdKSxvPXIsdT1hLGw9cyxkPWg7dmFyIEQ9RHQoYikuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksVT1ELnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLE1pW21dKTtpZih0LmV2ZW50LnRvdWNoZXMpRC5vbigidG91Y2htb3ZlLmJydXNoIixPLCEwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLEIsITApO2Vsc2V7dmFyIHE9RHQodC5ldmVudC52aWV3KS5vbigia2V5ZG93bi5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlA9dyYmTTticmVhaztjYXNlIDE4Ong9PT1faSYmKHcmJihzPWwtcCp3LHI9bytwKncpLE0mJihoPWQtdipNLGE9dSt2Kk0pLHg9YmksWSgpKTticmVhaztjYXNlIDMyOnghPT1faSYmeCE9PWJpfHwodzwwP3M9bC1wOnc+MCYmKHI9by1wKSxNPDA/aD1kLXY6TT4wJiYoYT11LXYpLHg9eWksVS5hdHRyKCJjdXJzb3IiLE1pLnNlbGVjdGlvbiksWSgpKTticmVhaztkZWZhdWx0OnJldHVybn12aSgpfSwhMCkub24oImtleXVwLmJydXNoIixmdW5jdGlvbigpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6UCYmKHk9Xz1QPSExLFkoKSk7YnJlYWs7Y2FzZSAxODp4PT09YmkmJih3PDA/cz1sOnc+MCYmKHI9byksTTwwP2g9ZDpNPjAmJihhPXUpLHg9X2ksWSgpKTticmVhaztjYXNlIDMyOng9PT15aSYmKHQuZXZlbnQuYWx0S2V5Pyh3JiYocz1sLXAqdyxyPW8rcCp3KSxNJiYoaD1kLXYqTSxhPXUrdipNKSx4PWJpKToodzwwP3M9bDp3PjAmJihyPW8pLE08MD9oPWQ6TT4wJiYoYT11KSx4PV9pKSxVLmF0dHIoImN1cnNvciIsTWlbbV0pLFkoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dmkoKX0sITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLE8sITApLm9uKCJtb3VzZXVwLmJydXNoIixCLCEwKTtYdCh0LmV2ZW50LnZpZXcpfXBpKCksTnIoYiksZi5jYWxsKGIpLEwuc3RhcnQoKX1mdW5jdGlvbiBPKCl7dmFyIHQ9RnQoYik7IVB8fHl8fF98fChNYXRoLmFicyh0WzBdLVJbMF0pPk1hdGguYWJzKHRbMV0tUlsxXSk/Xz0hMDp5PSEwKSxSPXQsZz0hMCx2aSgpLFkoKX1mdW5jdGlvbiBZKCl7dmFyIHQ7c3dpdGNoKHA9UlswXS16WzBdLHY9UlsxXS16WzFdLHgpe2Nhc2UgeWk6Y2FzZSBnaTp3JiYocD1NYXRoLm1heChTLXIsTWF0aC5taW4oay1zLHApKSxvPXIrcCxsPXMrcCksTSYmKHY9TWF0aC5tYXgoRS1hLE1hdGgubWluKEMtaCx2KSksdT1hK3YsZD1oK3YpO2JyZWFrO2Nhc2UgX2k6dzwwPyhwPU1hdGgubWF4KFMtcixNYXRoLm1pbihrLXIscCkpLG89citwLGw9cyk6dz4wJiYocD1NYXRoLm1heChTLXMsTWF0aC5taW4oay1zLHApKSxvPXIsbD1zK3ApLE08MD8odj1NYXRoLm1heChFLWEsTWF0aC5taW4oQy1hLHYpKSx1PWErdixkPWgpOk0+MCYmKHY9TWF0aC5tYXgoRS1oLE1hdGgubWluKEMtaCx2KSksdT1hLGQ9aCt2KTticmVhaztjYXNlIGJpOncmJihvPU1hdGgubWF4KFMsTWF0aC5taW4oayxyLXAqdykpLGw9TWF0aC5tYXgoUyxNYXRoLm1pbihrLHMrcCp3KSkpLE0mJih1PU1hdGgubWF4KEUsTWF0aC5taW4oQyxhLXYqTSkpLGQ9TWF0aC5tYXgoRSxNYXRoLm1pbihDLGgrdipNKSkpfWw8byYmKHcqPS0xLHQ9cixyPXMscz10LHQ9byxvPWwsbD10LG0gaW4gQWkmJlUuYXR0cigiY3Vyc29yIixNaVttPUFpW21dXSkpLGQ8dSYmKE0qPS0xLHQ9YSxhPWgsaD10LHQ9dSx1PWQsZD10LG0gaW4gVGkmJlUuYXR0cigiY3Vyc29yIixNaVttPVRpW21dXSkpLEEuc2VsZWN0aW9uJiYoTj1BLnNlbGVjdGlvbikseSYmKG89TlswXVswXSxsPU5bMV1bMF0pLF8mJih1PU5bMF1bMV0sZD1OWzFdWzFdKSxOWzBdWzBdPT09byYmTlswXVsxXT09PXUmJk5bMV1bMF09PT1sJiZOWzFdWzFdPT09ZHx8KEEuc2VsZWN0aW9uPVtbbyx1XSxbbCxkXV0sZi5jYWxsKGIpLEwuYnJ1c2goKSl9ZnVuY3Rpb24gQigpe2lmKHBpKCksdC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSw1MDApLEQub24oInRvdWNobW92ZS5icnVzaCB0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsbnVsbCl9ZWxzZSBHdCh0LmV2ZW50LnZpZXcsZykscS5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7RC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLFUuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KSxBLnNlbGVjdGlvbiYmKE49QS5zZWxlY3Rpb24pLHppKE4pJiYoQS5zZWxlY3Rpb249bnVsbCxmLmNhbGwoYikpLEwuZW5kKCl9fWZ1bmN0aW9uIGgoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZGltPW4sdH1yZXR1cm4gdS5tb3ZlPWZ1bmN0aW9uKHQsZSl7dC5zZWxlY3Rpb24/dC5vbigic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuZW5kKCl9KS50d2VlbigiYnJ1c2giLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPXQuX19icnVzaCxpPWModCxhcmd1bWVudHMpLG89ci5zZWxlY3Rpb24sYT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsci5leHRlbnQpLHU9bWUobyxhKTtmdW5jdGlvbiBzKG4pe3Iuc2VsZWN0aW9uPTE9PT1uJiZ6aShhKT9udWxsOnUobiksZi5jYWxsKHQpLGkuYnJ1c2goKX1yZXR1cm4gbyYmYT9zOnMoMSl9KTp0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMscj10aGlzLl9fYnJ1c2gsaT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyx0KTplLHIuZXh0ZW50KSxvPWModGhpcyx0KS5iZWZvcmVzdGFydCgpO05yKHRoaXMpLHIuc2VsZWN0aW9uPW51bGw9PWl8fHppKGkpP251bGw6aSxmLmNhbGwodGhpcyksby5zdGFydCgpLmJydXNoKCkuZW5kKCl9KX0scy5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nJiYodGhpcy5zdGFydGluZz0hMSx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtDdChuZXcgZGkodSx0LG4ub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksby5hcHBseSxvLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHUuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHUpOnJ9LHUuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoISF0KSx1KTppfSx1LmhhbmRsZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsdSk6YX0sdS5vbj1mdW5jdGlvbigpe3ZhciB0PW8ub24uYXBwbHkobyxhcmd1bWVudHMpO3JldHVybiB0PT09bz91OnR9LHV9dmFyIExpPU1hdGguY29zLERpPU1hdGguc2luLFVpPU1hdGguUEkscWk9VWkvMixPaT0yKlVpLFlpPU1hdGgubWF4O3ZhciBCaT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gRmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBJaT1NYXRoLlBJLEhpPTIqSWksamk9SGktMWUtNjtmdW5jdGlvbiBYaSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIEdpKCl7cmV0dXJuIG5ldyBYaX1mdW5jdGlvbiBWaSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gJGkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIFdpKHQpe3JldHVybiB0LnJhZGl1c31mdW5jdGlvbiBaaSh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIFFpKHQpe3JldHVybiB0LmVuZEFuZ2xlfVhpLnByb3RvdHlwZT1HaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlhpLG1vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbil9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStuKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArbisiLCIrKHRoaXMuX3gxPStlKSsiLCIrKHRoaXMuX3kxPStyKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK24rIiwiKyArZSsiLCIrICtyKyIsIisodGhpcy5feDE9K2kpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LG4sZSxyLGkpe3Q9K3Qsbj0rbixlPStlLHI9K3IsaT0raTt2YXIgbz10aGlzLl94MSxhPXRoaXMuX3kxLHU9ZS10LGY9ci1uLGM9by10LHM9YS1uLGw9YypjK3MqcztpZihpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIraSk7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2UgaWYobD4xZS02KWlmKE1hdGguYWJzKHMqdS1mKmMpPjFlLTYmJmkpe3ZhciBoPWUtbyxkPXItYSxwPXUqdStmKmYsdj1oKmgrZCpkLGc9TWF0aC5zcXJ0KHApLHk9TWF0aC5zcXJ0KGwpLF89aSpNYXRoLnRhbigoSWktTWF0aC5hY29zKChwK2wtdikvKDIqZyp5KSkpLzIpLGI9Xy95LG09Xy9nO01hdGguYWJzKGItMSk+MWUtNiYmKHRoaXMuXys9IkwiKyh0K2IqYykrIiwiKyhuK2IqcykpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhzKmg+YypkKSsiLCIrKHRoaXMuX3gxPXQrbSp1KSsiLCIrKHRoaXMuX3kxPW4rbSpmKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2U7fSxhcmM6ZnVuY3Rpb24odCxuLGUscixpLG8pe3Q9K3Qsbj0rbjt2YXIgYT0oZT0rZSkqTWF0aC5jb3MociksdT1lKk1hdGguc2luKHIpLGY9dCthLGM9bit1LHM9MV5vLGw9bz9yLWk6aS1yO2lmKGU8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitlKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrZisiLCIrYzooTWF0aC5hYnModGhpcy5feDEtZik+MWUtNnx8TWF0aC5hYnModGhpcy5feTEtYyk+MWUtNikmJih0aGlzLl8rPSJMIitmKyIsIitjKSxlJiYobDwwJiYobD1sJUhpK0hpKSxsPmppP3RoaXMuXys9IkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodC1hKSsiLCIrKG4tdSkrIkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodGhpcy5feDE9ZikrIiwiKyh0aGlzLl95MT1jKTpsPjFlLTYmJih0aGlzLl8rPSJBIitlKyIsIitlKyIsMCwiKyArKGw+PUlpKSsiLCIrcysiLCIrKHRoaXMuX3gxPXQrZSpNYXRoLmNvcyhpKSkrIiwiKyh0aGlzLl95MT1uK2UqTWF0aC5zaW4oaSkpKSl9LHJlY3Q6ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKSsiaCIrICtlKyJ2IisgK3IrImgiKy1lKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07ZnVuY3Rpb24gSmkoKXt9ZnVuY3Rpb24gS2kodCxuKXt2YXIgZT1uZXcgSmk7aWYodCBpbnN0YW5jZW9mIEppKXQuZWFjaChmdW5jdGlvbih0LG4pe2Uuc2V0KG4sdCl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciByLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytpPG87KWUuc2V0KGksdFtpXSk7ZWxzZSBmb3IoOysraTxvOyllLnNldChuKHI9dFtpXSxpLHQpLHIpfWVsc2UgaWYodClmb3IodmFyIGEgaW4gdCllLnNldChhLHRbYV0pO3JldHVybiBlfWZ1bmN0aW9uIHRvKCl7cmV0dXJue319ZnVuY3Rpb24gbm8odCxuLGUpe3Rbbl09ZX1mdW5jdGlvbiBlbygpe3JldHVybiBLaSgpfWZ1bmN0aW9uIHJvKHQsbixlKXt0LnNldChuLGUpfWZ1bmN0aW9uIGlvKCl7fUppLnByb3RvdHlwZT1LaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkppLGhhczpmdW5jdGlvbih0KXtyZXR1cm4iJCIrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbIiQiK3RdfSxzZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpc1siJCIrdF09bix0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49IiQiK3Q7cmV0dXJuIG4gaW4gdGhpcyYmZGVsZXRlIHRoaXNbbl19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpIiQiPT09dFswXSYmZGVsZXRlIHRoaXNbdF19LGtleXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2gobi5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh0aGlzW25dKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh7a2V5Om4uc2xpY2UoMSksdmFsdWU6dGhpc1tuXX0pO3JldHVybiB0fSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYoIiQiPT09dFswXSlyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0KHRoaXNbbl0sbi5zbGljZSgxKSx0aGlzKX19O3ZhciBvbz1LaS5wcm90b3R5cGU7ZnVuY3Rpb24gYW8odCxuKXt2YXIgZT1uZXcgaW87aWYodCBpbnN0YW5jZW9mIGlvKXQuZWFjaChmdW5jdGlvbih0KXtlLmFkZCh0KX0pO2Vsc2UgaWYodCl7dmFyIHI9LTEsaT10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytyPGk7KWUuYWRkKHRbcl0pO2Vsc2UgZm9yKDsrK3I8aTspZS5hZGQobih0W3JdLHIsdCkpfXJldHVybiBlfWlvLnByb3RvdHlwZT1hby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmlvLGhhczpvby5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIisodCs9IiIpXT10LHRoaXN9LHJlbW92ZTpvby5yZW1vdmUsY2xlYXI6b28uY2xlYXIsdmFsdWVzOm9vLmtleXMsc2l6ZTpvby5zaXplLGVtcHR5Om9vLmVtcHR5LGVhY2g6b28uZWFjaH07dmFyIHVvPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBmbyh0LG4pe3JldHVybiB0LW59ZnVuY3Rpb24gY28odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHNvKHQsbil7Zm9yKHZhciBlLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspaWYoZT1sbyh0LG5bcl0pKXJldHVybiBlO3JldHVybiAwfWZ1bmN0aW9uIGxvKHQsbil7Zm9yKHZhciBlPW5bMF0scj1uWzFdLGk9LTEsbz0wLGE9dC5sZW5ndGgsdT1hLTE7bzxhO3U9bysrKXt2YXIgZj10W29dLGM9ZlswXSxzPWZbMV0sbD10W3VdLGg9bFswXSxkPWxbMV07aWYoaG8oZixsLG4pKXJldHVybiAwO3M+ciE9ZD5yJiZlPChoLWMpKihyLXMpLyhkLXMpK2MmJihpPS1pKX1yZXR1cm4gaX1mdW5jdGlvbiBobyh0LG4sZSl7dmFyIHIsaSxvLGE7cmV0dXJuIGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKT09KGVbMF0tdFswXSkqKG5bMV0tdFsxXSl9KHQsbixlKSYmKGk9dFtyPSsodFswXT09PW5bMF0pXSxvPWVbcl0sYT1uW3JdLGk8PW8mJm88PWF8fGE8PW8mJm88PWkpfWZ1bmN0aW9uIHBvKCl7fXZhciB2bz1bW10sW1tbMSwxLjVdLFsuNSwxXV1dLFtbWzEuNSwxXSxbMSwxLjVdXV0sW1tbMS41LDFdLFsuNSwxXV1dLFtbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLDEuNV0sWy41LDFdXSxbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLC41XSxbMSwxLjVdXV0sW1tbMSwuNV0sWy41LDFdXV0sW1tbLjUsMV0sWzEsLjVdXV0sW1tbMSwxLjVdLFsxLC41XV1dLFtbWy41LDFdLFsxLC41XV0sW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbMSwuNV1dXSxbW1suNSwxXSxbMS41LDFdXV0sW1tbMSwxLjVdLFsxLjUsMV1dXSxbW1suNSwxXSxbMSwxLjVdXV0sW11dO2Z1bmN0aW9uIGdvKCl7dmFyIHQ9MSxuPTEsZT1NLHI9dTtmdW5jdGlvbiBpKHQpe3ZhciBuPWUodCk7aWYoQXJyYXkuaXNBcnJheShuKSluPW4uc2xpY2UoKS5zb3J0KGZvKTtlbHNle3ZhciByPXModCksaT1yWzBdLGE9clsxXTtuPXcoaSxhLG4pLG49ZyhNYXRoLmZsb29yKGkvbikqbixNYXRoLmZsb29yKGEvbikqbixuKX1yZXR1cm4gbi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG8odCxuKX0pfWZ1bmN0aW9uIG8oZSxpKXt2YXIgbz1bXSx1PVtdO3JldHVybiBmdW5jdGlvbihlLHIsaSl7dmFyIG8sdSxmLGMscyxsLGg9bmV3IEFycmF5LGQ9bmV3IEFycmF5O289dT0tMSxjPWVbMF0+PXIsdm9bYzw8MV0uZm9yRWFjaChwKTtmb3IoOysrbzx0LTE7KWY9YyxjPWVbbysxXT49cix2b1tmfGM8PDFdLmZvckVhY2gocCk7dm9bYzw8MF0uZm9yRWFjaChwKTtmb3IoOysrdTxuLTE7KXtmb3Iobz0tMSxjPWVbdSp0K3RdPj1yLHM9ZVt1KnRdPj1yLHZvW2M8PDF8czw8Ml0uZm9yRWFjaChwKTsrK288dC0xOylmPWMsYz1lW3UqdCt0K28rMV0+PXIsbD1zLHM9ZVt1KnQrbysxXT49cix2b1tmfGM8PDF8czw8MnxsPDwzXS5mb3JFYWNoKHApO3ZvW2N8czw8M10uZm9yRWFjaChwKX1vPS0xLHM9ZVt1KnRdPj1yLHZvW3M8PDJdLmZvckVhY2gocCk7Zm9yKDsrK288dC0xOylsPXMscz1lW3UqdCtvKzFdPj1yLHZvW3M8PDJ8bDw8M10uZm9yRWFjaChwKTtmdW5jdGlvbiBwKHQpe3ZhciBuLGUscj1bdFswXVswXStvLHRbMF1bMV0rdV0sZj1bdFsxXVswXStvLHRbMV1bMV0rdV0sYz1hKHIpLHM9YShmKTsobj1kW2NdKT8oZT1oW3NdKT8oZGVsZXRlIGRbbi5lbmRdLGRlbGV0ZSBoW2Uuc3RhcnRdLG49PT1lPyhuLnJpbmcucHVzaChmKSxpKG4ucmluZykpOmhbbi5zdGFydF09ZFtlLmVuZF09e3N0YXJ0Om4uc3RhcnQsZW5kOmUuZW5kLHJpbmc6bi5yaW5nLmNvbmNhdChlLnJpbmcpfSk6KGRlbGV0ZSBkW24uZW5kXSxuLnJpbmcucHVzaChmKSxkW24uZW5kPXNdPW4pOihuPWhbc10pPyhlPWRbY10pPyhkZWxldGUgaFtuLnN0YXJ0XSxkZWxldGUgZFtlLmVuZF0sbj09PWU/KG4ucmluZy5wdXNoKGYpLGkobi5yaW5nKSk6aFtlLnN0YXJ0XT1kW24uZW5kXT17c3RhcnQ6ZS5zdGFydCxlbmQ6bi5lbmQscmluZzplLnJpbmcuY29uY2F0KG4ucmluZyl9KTooZGVsZXRlIGhbbi5zdGFydF0sbi5yaW5nLnVuc2hpZnQociksaFtuLnN0YXJ0PWNdPW4pOmhbY109ZFtzXT17c3RhcnQ6YyxlbmQ6cyxyaW5nOltyLGZdfX12b1tzPDwzXS5mb3JFYWNoKHApfShlLGksZnVuY3Rpb24odCl7cih0LGUsaSksZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aCxyPXRbZS0xXVsxXSp0WzBdWzBdLXRbZS0xXVswXSp0WzBdWzFdOysrbjxlOylyKz10W24tMV1bMV0qdFtuXVswXS10W24tMV1bMF0qdFtuXVsxXTtyZXR1cm4gcn0odCk+MD9vLnB1c2goW3RdKTp1LnB1c2godCl9KSx1LmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPW8ubGVuZ3RoO2U8cjsrK2UpaWYoLTEhPT1zbygobj1vW2VdKVswXSx0KSlyZXR1cm4gdm9pZCBuLnB1c2godCl9KSx7dHlwZToiTXVsdGlQb2x5Z29uIix2YWx1ZTppLGNvb3JkaW5hdGVzOm99fWZ1bmN0aW9uIGEobil7cmV0dXJuIDIqblswXStuWzFdKih0KzEpKjR9ZnVuY3Rpb24gdShlLHIsaSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBvLGE9ZVswXSx1PWVbMV0sZj0wfGEsYz0wfHUscz1yW2MqdCtmXTthPjAmJmE8dCYmZj09PWEmJihvPXJbYyp0K2YtMV0sZVswXT1hKyhpLW8pLyhzLW8pLS41KSx1PjAmJnU8biYmYz09PXUmJihvPXJbKGMtMSkqdCtmXSxlWzFdPXUrKGktbykvKHMtbyktLjUpfSl9cmV0dXJuIGkuY29udG91cj1vLGkuc2l6ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bdCxuXTt2YXIgcj1NYXRoLmNlaWwoZVswXSksbz1NYXRoLmNlaWwoZVsxXSk7aWYoIShyPjAmJm8+MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gdD1yLG49byxpfSxpLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP2NvKHVvLmNhbGwodCkpOmNvKHQpLGkpOmV9LGkuc21vb3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQ/dTpwbyxpKTpyPT09dX0saX1mdW5jdGlvbiB5byh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPGk7KythKWZvcih2YXIgdT0wLGY9MDt1PHIrZTsrK3UpdTxyJiYoZis9dC5kYXRhW3UrYSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbdS1vK2Eqcl0pLG4uZGF0YVt1LWUrYSpyXT1mL01hdGgubWluKHUrMSxyLTErby11LG8pKX1mdW5jdGlvbiBfbyh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPHI7KythKWZvcih2YXIgdT0wLGY9MDt1PGkrZTsrK3UpdTxpJiYoZis9dC5kYXRhW2ErdSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbYSsodS1vKSpyXSksbi5kYXRhW2ErKHUtZSkqcl09Zi9NYXRoLm1pbih1KzEsaS0xK28tdSxvKSl9ZnVuY3Rpb24gYm8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gbW8odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24geG8oKXtyZXR1cm4gMX12YXIgd289e30sTW89e30sQW89MzQsVG89MTAsTm89MTM7ZnVuY3Rpb24gU28odCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisiXSJ9KS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiBFbyh0KXt2YXIgbj1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxlPXQuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiByKHQsbil7dmFyIHIsaT1bXSxvPXQubGVuZ3RoLGE9MCx1PTAsZj1vPD0wLGM9ITE7ZnVuY3Rpb24gcygpe2lmKGYpcmV0dXJuIE1vO2lmKGMpcmV0dXJuIGM9ITEsd287dmFyIG4scixpPWE7aWYodC5jaGFyQ29kZUF0KGkpPT09QW8pe2Zvcig7YSsrPG8mJnQuY2hhckNvZGVBdChhKSE9PUFvfHx0LmNoYXJDb2RlQXQoKythKT09PUFvOyk7cmV0dXJuKG49YSk+PW8/Zj0hMDoocj10LmNoYXJDb2RlQXQoYSsrKSk9PT1Ubz9jPSEwOnI9PT1ObyYmKGM9ITAsdC5jaGFyQ29kZUF0KGEpPT09VG8mJisrYSksdC5zbGljZShpKzEsbi0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPG87KXtpZigocj10LmNoYXJDb2RlQXQobj1hKyspKT09PVRvKWM9ITA7ZWxzZSBpZihyPT09Tm8pYz0hMCx0LmNoYXJDb2RlQXQoYSk9PT1UbyYmKythO2Vsc2UgaWYociE9PWUpY29udGludWU7cmV0dXJuIHQuc2xpY2UoaSxuKX1yZXR1cm4gZj0hMCx0LnNsaWNlKGksbyl9Zm9yKHQuY2hhckNvZGVBdChvLTEpPT09VG8mJi0tbyx0LmNoYXJDb2RlQXQoby0xKT09PU5vJiYtLW87KHI9cygpKSE9PU1vOyl7Zm9yKHZhciBsPVtdO3IhPT13byYmciE9PU1vOylsLnB1c2gocikscj1zKCk7biYmbnVsbD09KGw9bihsLHUrKykpfHxpLnB1c2gobCl9cmV0dXJuIGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbi5tYXAobykuam9pbih0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsPT10PyIiOm4udGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvIi9nLCciIicpKyciJzp0fXJldHVybntwYXJzZTpmdW5jdGlvbih0LG4pe3ZhciBlLGksbz1yKHQsZnVuY3Rpb24odCxyKXtpZihlKXJldHVybiBlKHQsci0xKTtpPXQsZT1uP2Z1bmN0aW9uKHQsbil7dmFyIGU9U28odCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIG4oZShyKSxpLHQpfX0odCxuKTpTbyh0KX0pO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOnIsZm9ybWF0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIG51bGw9PWUmJihlPWZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfShuKSksW2UubWFwKG8pLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG8oblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGkpLmpvaW4oIlxuIil9fX12YXIga289RW8oIiwiKSxDbz1rby5wYXJzZSxQbz1rby5wYXJzZVJvd3Msem89a28uZm9ybWF0LFJvPWtvLmZvcm1hdFJvd3MsTG89RW8oIlx0IiksRG89TG8ucGFyc2UsVW89TG8ucGFyc2VSb3dzLHFvPUxvLmZvcm1hdCxPbz1Mby5mb3JtYXRSb3dzO2Z1bmN0aW9uIFlvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5ibG9iKCl9ZnVuY3Rpb24gQm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmFycmF5QnVmZmVyKCl9ZnVuY3Rpb24gRm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LnRleHQoKX1mdW5jdGlvbiBJbyh0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oRm8pfWZ1bmN0aW9uIEhvKHQpe3JldHVybiBmdW5jdGlvbihuLGUscil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPXZvaWQgMCksSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiB0KG4scil9KX19dmFyIGpvPUhvKENvKSxYbz1IbyhEbyk7ZnVuY3Rpb24gR28odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0Lmpzb24oKX1mdW5jdGlvbiBWbyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybihuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcobix0KX0pfX12YXIgJG89Vm8oImFwcGxpY2F0aW9uL3htbCIpLFdvPVZvKCJ0ZXh0L2h0bWwiKSxabz1WbygiaW1hZ2Uvc3ZnK3htbCIpO2Z1bmN0aW9uIFFvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBKbygpe3JldHVybiAxZS02KihNYXRoLnJhbmRvbSgpLS41KX1mdW5jdGlvbiBLbyh0LG4sZSxyKXtpZihpc05hTihuKXx8aXNOYU4oZSkpcmV0dXJuIHQ7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQ9dC5fcm9vdCxwPXtkYXRhOnJ9LHY9dC5feDAsZz10Ll95MCx5PXQuX3gxLF89dC5feTE7aWYoIWQpcmV0dXJuIHQuX3Jvb3Q9cCx0O2Zvcig7ZC5sZW5ndGg7KWlmKChjPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChzPWU+PShhPShnK18pLzIpKT9nPWE6Xz1hLGk9ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiBpW2xdPXAsdDtpZih1PSt0Ll94LmNhbGwobnVsbCxkLmRhdGEpLGY9K3QuX3kuY2FsbChudWxsLGQuZGF0YSksbj09PXUmJmU9PT1mKXJldHVybiBwLm5leHQ9ZCxpP2lbbF09cDp0Ll9yb290PXAsdDtkb3tpPWk/aVtsXT1uZXcgQXJyYXkoNCk6dC5fcm9vdD1uZXcgQXJyYXkoNCksKGM9bj49KG89KHYreSkvMikpP3Y9bzp5PW8sKHM9ZT49KGE9KGcrXykvMikpP2c9YTpfPWF9d2hpbGUoKGw9czw8MXxjKT09KGg9KGY+PWEpPDwxfHU+PW8pKTtyZXR1cm4gaVtoXT1kLGlbbF09cCx0fWZ1bmN0aW9uIHRhKHQsbixlLHIsaSl7dGhpcy5ub2RlPXQsdGhpcy54MD1uLHRoaXMueTA9ZSx0aGlzLngxPXIsdGhpcy55MT1pfWZ1bmN0aW9uIG5hKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGVhKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHJhKHQsbixlKXt2YXIgcj1uZXcgaWEobnVsbD09bj9uYTpuLG51bGw9PWU/ZWE6ZSxOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P3I6ci5hZGRBbGwodCl9ZnVuY3Rpb24gaWEodCxuLGUscixpLG8pe3RoaXMuX3g9dCx0aGlzLl95PW4sdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBvYSh0KXtmb3IodmFyIG49e2RhdGE6dC5kYXRhfSxlPW47dD10Lm5leHQ7KWU9ZS5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIG59dmFyIGFhPXJhLnByb3RvdHlwZT1pYS5wcm90b3R5cGU7ZnVuY3Rpb24gdWEodCl7cmV0dXJuIHQueCt0LnZ4fWZ1bmN0aW9uIGZhKHQpe3JldHVybiB0LnkrdC52eX1mdW5jdGlvbiBjYSh0KXtyZXR1cm4gdC5pbmRleH1mdW5jdGlvbiBzYSh0LG4pe3ZhciBlPXQuZ2V0KG4pO2lmKCFlKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIituKTtyZXR1cm4gZX1mdW5jdGlvbiBsYSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIGhhKHQpe3JldHVybiB0Lnl9YWEuY29weT1mdW5jdGlvbigpe3ZhciB0LG4sZT1uZXcgaWEodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxyPXRoaXMuX3Jvb3Q7aWYoIXIpcmV0dXJuIGU7aWYoIXIubGVuZ3RoKXJldHVybiBlLl9yb290PW9hKHIpLGU7Zm9yKHQ9W3tzb3VyY2U6cix0YXJnZXQ6ZS5fcm9vdD1uZXcgQXJyYXkoNCl9XTtyPXQucG9wKCk7KWZvcih2YXIgaT0wO2k8NDsrK2kpKG49ci5zb3VyY2VbaV0pJiYobi5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6bix0YXJnZXQ6ci50YXJnZXRbaV09bmV3IEFycmF5KDQpfSk6ci50YXJnZXRbaV09b2EobikpO3JldHVybiBlfSxhYS5hZGQ9ZnVuY3Rpb24odCl7dmFyIG49K3RoaXMuX3guY2FsbChudWxsLHQpLGU9K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBLbyh0aGlzLmNvdmVyKG4sZSksbixlLHQpfSxhYS5hZGRBbGw9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSx1PW5ldyBBcnJheShvKSxmPTEvMCxjPTEvMCxzPS0xLzAsbD0tMS8wO2ZvcihlPTA7ZTxvOysrZSlpc05hTihyPSt0aGlzLl94LmNhbGwobnVsbCxuPXRbZV0pKXx8aXNOYU4oaT0rdGhpcy5feS5jYWxsKG51bGwsbikpfHwoYVtlXT1yLHVbZV09aSxyPGYmJihmPXIpLHI+cyYmKHM9ciksaTxjJiYoYz1pKSxpPmwmJihsPWkpKTtmb3IoczxmJiYoZj10aGlzLl94MCxzPXRoaXMuX3gxKSxsPGMmJihjPXRoaXMuX3kwLGw9dGhpcy5feTEpLHRoaXMuY292ZXIoZixjKS5jb3ZlcihzLGwpLGU9MDtlPG87KytlKUtvKHRoaXMsYVtlXSx1W2VdLHRbZV0pO3JldHVybiB0aGlzfSxhYS5jb3Zlcj1mdW5jdGlvbih0LG4pe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihuPStuKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLl94MCxyPXRoaXMuX3kwLGk9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihlKSlpPShlPU1hdGguZmxvb3IodCkpKzEsbz0ocj1NYXRoLmZsb29yKG4pKSsxO2Vsc2V7aWYoIShlPnR8fHQ+aXx8cj5ufHxuPm8pKXJldHVybiB0aGlzO3ZhciBhLHUsZj1pLWUsYz10aGlzLl9yb290O3N3aXRjaCh1PShuPChyK28pLzIpPDwxfHQ8KGUraSkvMil7Y2FzZSAwOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSx0PihpPWUrZil8fG4+byk7YnJlYWs7Y2FzZSAxOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSwoZT1pLWYpPnR8fG4+byk7YnJlYWs7Y2FzZSAyOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSx0PihpPWUrZil8fHI+bik7YnJlYWs7Y2FzZSAzOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSwoZT1pLWYpPnR8fHI+bil9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1lLHRoaXMuX3kwPXIsdGhpcy5feDE9aSx0aGlzLl95MT1vLHRoaXN9LGFhLmRhdGE9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97dC5wdXNoKG4uZGF0YSl9d2hpbGUobj1uLm5leHQpfSksdH0sYWEuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK3RbMF1bMF0sK3RbMF1bMV0pLmNvdmVyKCt0WzFdWzBdLCt0WzFdWzFdKTppc05hTih0aGlzLl94MCk/dm9pZCAwOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfSxhYS5maW5kPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYSx1LGYsYyxzPXRoaXMuX3gwLGw9dGhpcy5feTAsaD10aGlzLl94MSxkPXRoaXMuX3kxLHA9W10sdj10aGlzLl9yb290O2Zvcih2JiZwLnB1c2gobmV3IHRhKHYscyxsLGgsZCkpLG51bGw9PWU/ZT0xLzA6KHM9dC1lLGw9bi1lLGg9dCtlLGQ9bitlLGUqPWUpO2Y9cC5wb3AoKTspaWYoISghKHY9Zi5ub2RlKXx8KGk9Zi54MCk+aHx8KG89Zi55MCk+ZHx8KGE9Zi54MSk8c3x8KHU9Zi55MSk8bCkpaWYodi5sZW5ndGgpe3ZhciBnPShpK2EpLzIseT0obyt1KS8yO3AucHVzaChuZXcgdGEodlszXSxnLHksYSx1KSxuZXcgdGEodlsyXSxpLHksZyx1KSxuZXcgdGEodlsxXSxnLG8sYSx5KSxuZXcgdGEodlswXSxpLG8sZyx5KSksKGM9KG4+PXkpPDwxfHQ+PWcpJiYoZj1wW3AubGVuZ3RoLTFdLHBbcC5sZW5ndGgtMV09cFtwLmxlbmd0aC0xLWNdLHBbcC5sZW5ndGgtMS1jXT1mKX1lbHNle3ZhciBfPXQtK3RoaXMuX3guY2FsbChudWxsLHYuZGF0YSksYj1uLSt0aGlzLl95LmNhbGwobnVsbCx2LmRhdGEpLG09XypfK2IqYjtpZihtPGUpe3ZhciB4PU1hdGguc3FydChlPW0pO3M9dC14LGw9bi14LGg9dCt4LGQ9bit4LHI9di5kYXRhfX1yZXR1cm4gcn0sYWEucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKG89K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4oYT0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBuLGUscixpLG8sYSx1LGYsYyxzLGwsaCxkPXRoaXMuX3Jvb3QscD10aGlzLl94MCx2PXRoaXMuX3kwLGc9dGhpcy5feDEseT10aGlzLl95MTtpZighZClyZXR1cm4gdGhpcztpZihkLmxlbmd0aClmb3IoOzspe2lmKChjPW8+PSh1PShwK2cpLzIpKT9wPXU6Zz11LChzPWE+PShmPSh2K3kpLzIpKT92PWY6eT1mLG49ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiB0aGlzO2lmKCFkLmxlbmd0aClicmVhazsobltsKzEmM118fG5bbCsyJjNdfHxuW2wrMyYzXSkmJihlPW4saD1sKX1mb3IoO2QuZGF0YSE9PXQ7KWlmKHI9ZCwhKGQ9ZC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4oaT1kLm5leHQpJiZkZWxldGUgZC5uZXh0LHI/KGk/ci5uZXh0PWk6ZGVsZXRlIHIubmV4dCx0aGlzKTpuPyhpP25bbF09aTpkZWxldGUgbltsXSwoZD1uWzBdfHxuWzFdfHxuWzJdfHxuWzNdKSYmZD09PShuWzNdfHxuWzJdfHxuWzFdfHxuWzBdKSYmIWQubGVuZ3RoJiYoZT9lW2hdPWQ6dGhpcy5fcm9vdD1kKSx0aGlzKToodGhpcy5fcm9vdD1pLHRoaXMpfSxhYS5yZW1vdmVBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKXRoaXMucmVtb3ZlKHRbbl0pO3JldHVybiB0aGlzfSxhYS5yb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LGFhLnNpemU9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKG4pe2lmKCFuLmxlbmd0aClkb3srK3R9d2hpbGUobj1uLm5leHQpfSksdH0sYWEudmlzaXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU9W10sZj10aGlzLl9yb290O2ZvcihmJiZ1LnB1c2gobmV3IHRhKGYsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPXUucG9wKCk7KWlmKCF0KGY9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLGE9bi55MSkmJmYubGVuZ3RoKXt2YXIgYz0ocitvKS8yLHM9KGkrYSkvMjsoZT1mWzNdKSYmdS5wdXNoKG5ldyB0YShlLGMscyxvLGEpKSwoZT1mWzJdKSYmdS5wdXNoKG5ldyB0YShlLHIscyxjLGEpKSwoZT1mWzFdKSYmdS5wdXNoKG5ldyB0YShlLGMsaSxvLHMpKSwoZT1mWzBdKSYmdS5wdXNoKG5ldyB0YShlLHIsaSxjLHMpKX1yZXR1cm4gdGhpc30sYWEudmlzaXRBZnRlcj1mdW5jdGlvbih0KXt2YXIgbixlPVtdLHI9W107Zm9yKHRoaXMuX3Jvb3QmJmUucHVzaChuZXcgdGEodGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249ZS5wb3AoKTspe3ZhciBpPW4ubm9kZTtpZihpLmxlbmd0aCl7dmFyIG8sYT1uLngwLHU9bi55MCxmPW4ueDEsYz1uLnkxLHM9KGErZikvMixsPSh1K2MpLzI7KG89aVswXSkmJmUucHVzaChuZXcgdGEobyxhLHUscyxsKSksKG89aVsxXSkmJmUucHVzaChuZXcgdGEobyxzLHUsZixsKSksKG89aVsyXSkmJmUucHVzaChuZXcgdGEobyxhLGwscyxjKSksKG89aVszXSkmJmUucHVzaChuZXcgdGEobyxzLGwsZixjKSl9ci5wdXNoKG4pfWZvcig7bj1yLnBvcCgpOyl0KG4ubm9kZSxuLngwLG4ueTAsbi54MSxuLnkxKTtyZXR1cm4gdGhpc30sYWEueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feD10LHRoaXMpOnRoaXMuX3h9LGFhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fTt2YXIgZGE9MTAscGE9TWF0aC5QSSooMy1NYXRoLnNxcnQoNSkpO2Z1bmN0aW9uIHZhKHQsbil7aWYoKGU9KHQ9bj90LnRvRXhwb25lbnRpYWwobi0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLHI9dC5zbGljZSgwLGUpO3JldHVybltyLmxlbmd0aD4xP3JbMF0rci5zbGljZSgyKTpyLCt0LnNsaWNlKGUrMSldfWZ1bmN0aW9uIGdhKHQpe3JldHVybih0PXZhKE1hdGguYWJzKHQpKSk/dFsxXTpOYU59dmFyIHlhLF9hPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIGJhKHQpe3JldHVybiBuZXcgbWEodCl9ZnVuY3Rpb24gbWEodCl7aWYoIShuPV9hLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIG47dGhpcy5maWxsPW5bMV18fCIgIix0aGlzLmFsaWduPW5bMl18fCI+Iix0aGlzLnNpZ249blszXXx8Ii0iLHRoaXMuc3ltYm9sPW5bNF18fCIiLHRoaXMuemVybz0hIW5bNV0sdGhpcy53aWR0aD1uWzZdJiYrbls2XSx0aGlzLmNvbW1hPSEhbls3XSx0aGlzLnByZWNpc2lvbj1uWzhdJiYrbls4XS5zbGljZSgxKSx0aGlzLnRyaW09ISFuWzldLHRoaXMudHlwZT1uWzEwXXx8IiJ9ZnVuY3Rpb24geGEodCxuKXt2YXIgZT12YSh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfWJhLnByb3RvdHlwZT1tYS5wcm90b3R5cGUsbWEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKG51bGw9PXRoaXMud2lkdGg/IiI6TWF0aC5tYXgoMSwwfHRoaXMud2lkdGgpKSsodGhpcy5jb21tYT8iLCI6IiIpKyhudWxsPT10aGlzLnByZWNpc2lvbj8iIjoiLiIrTWF0aC5tYXgoMCwwfHRoaXMucHJlY2lzaW9uKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07dmFyIHdhPXsiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiB4YSgxMDAqdCxuKX0scjp4YSxzOmZ1bmN0aW9uKHQsbil7dmFyIGU9dmEodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXSxvPWktKHlhPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGkvMykpKSkrMSxhPXIubGVuZ3RoO3JldHVybiBvPT09YT9yOm8+YT9yK25ldyBBcnJheShvLWErMSkuam9pbigiMCIpOm8+MD9yLnNsaWNlKDAsbykrIi4iK3Iuc2xpY2Uobyk6IjAuIituZXcgQXJyYXkoMS1vKS5qb2luKCIwIikrdmEodCxNYXRoLm1heCgwLG4rby0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX07ZnVuY3Rpb24gTWEodCl7cmV0dXJuIHR9dmFyIEFhLFRhPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBOYSh0KXt2YXIgbixlLHI9dC5ncm91cGluZyYmdC50aG91c2FuZHM/KG49dC5ncm91cGluZyxlPXQudGhvdXNhbmRzLGZ1bmN0aW9uKHQscil7Zm9yKHZhciBpPXQubGVuZ3RoLG89W10sYT0wLHU9blswXSxmPTA7aT4wJiZ1PjAmJihmK3UrMT5yJiYodT1NYXRoLm1heCgxLHItZikpLG8ucHVzaCh0LnN1YnN0cmluZyhpLT11LGkrdSkpLCEoKGYrPXUrMSk+cikpOyl1PW5bYT0oYSsxKSVuLmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oZSl9KTpNYSxpPXQuY3VycmVuY3ksbz10LmRlY2ltYWwsYT10Lm51bWVyYWxzP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0WytuXX0pfX0odC5udW1lcmFscyk6TWEsdT10LnBlcmNlbnR8fCIlIjtmdW5jdGlvbiBmKHQpe3ZhciBuPSh0PWJhKHQpKS5maWxsLGU9dC5hbGlnbixmPXQuc2lnbixjPXQuc3ltYm9sLHM9dC56ZXJvLGw9dC53aWR0aCxoPXQuY29tbWEsZD10LnByZWNpc2lvbixwPXQudHJpbSx2PXQudHlwZTsibiI9PT12PyhoPSEwLHY9ImciKTp3YVt2XXx8KG51bGw9PWQmJihkPTEyKSxwPSEwLHY9ImciKSwoc3x8IjAiPT09biYmIj0iPT09ZSkmJihzPSEwLG49IjAiLGU9Ij0iKTt2YXIgZz0iJCI9PT1jP2lbMF06IiMiPT09YyYmL1tib3hYXS8udGVzdCh2KT8iMCIrdi50b0xvd2VyQ2FzZSgpOiIiLHk9IiQiPT09Yz9pWzFdOi9bJXBdLy50ZXN0KHYpP3U6IiIsXz13YVt2XSxiPS9bZGVmZ3BycyVdLy50ZXN0KHYpO2Z1bmN0aW9uIG0odCl7dmFyIGksdSxjLG09Zyx4PXk7aWYoImMiPT09dil4PV8odCkreCx0PSIiO2Vsc2V7dmFyIHc9KHQ9K3QpPDA7aWYodD1fKE1hdGguYWJzKHQpLGQpLHAmJih0PWZ1bmN0aW9uKHQpe3Q6Zm9yKHZhciBuLGU9dC5sZW5ndGgscj0xLGk9LTE7cjxlOysrcilzd2l0Y2godFtyXSl7Y2FzZSIuIjppPW49cjticmVhaztjYXNlIjAiOjA9PT1pJiYoaT1yKSxuPXI7YnJlYWs7ZGVmYXVsdDppZihpPjApe2lmKCErdFtyXSlicmVhayB0O2k9MH19cmV0dXJuIGk+MD90LnNsaWNlKDAsaSkrdC5zbGljZShuKzEpOnR9KHQpKSx3JiYwPT0rdCYmKHc9ITEpLG09KHc/IigiPT09Zj9mOiItIjoiLSI9PT1mfHwiKCI9PT1mPyIiOmYpK20seD0oInMiPT09dj9UYVs4K3lhLzNdOiIiKSt4Kyh3JiYiKCI9PT1mPyIpIjoiIiksYilmb3IoaT0tMSx1PXQubGVuZ3RoOysraTx1OylpZig0OD4oYz10LmNoYXJDb2RlQXQoaSkpfHxjPjU3KXt4PSg0Nj09PWM/byt0LnNsaWNlKGkrMSk6dC5zbGljZShpKSkreCx0PXQuc2xpY2UoMCxpKTticmVha319aCYmIXMmJih0PXIodCwxLzApKTt2YXIgTT1tLmxlbmd0aCt0Lmxlbmd0aCt4Lmxlbmd0aCxBPU08bD9uZXcgQXJyYXkobC1NKzEpLmpvaW4obik6IiI7c3dpdGNoKGgmJnMmJih0PXIoQSt0LEEubGVuZ3RoP2wteC5sZW5ndGg6MS8wKSxBPSIiKSxlKXtjYXNlIjwiOnQ9bSt0K3grQTticmVhaztjYXNlIj0iOnQ9bStBK3QreDticmVhaztjYXNlIl4iOnQ9QS5zbGljZSgwLE09QS5sZW5ndGg+PjEpK20rdCt4K0Euc2xpY2UoTSk7YnJlYWs7ZGVmYXVsdDp0PUErbSt0K3h9cmV0dXJuIGEodCl9cmV0dXJuIGQ9bnVsbD09ZD82Oi9bZ3Byc10vLnRlc3Qodik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxkKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxkKSksbS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxtfXJldHVybntmb3JtYXQ6Zixmb3JtYXRQcmVmaXg6ZnVuY3Rpb24odCxuKXt2YXIgZT1mKCgodD1iYSh0KSkudHlwZT0iZiIsdCkpLHI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKSxpPU1hdGgucG93KDEwLC1yKSxvPVRhWzgrci8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUoaSp0KStvfX19fWZ1bmN0aW9uIFNhKG4pe3JldHVybiBBYT1OYShuKSx0LmZvcm1hdD1BYS5mb3JtYXQsdC5mb3JtYXRQcmVmaXg9QWEuZm9ybWF0UHJlZml4LEFhfWZ1bmN0aW9uIEVhKHQpe3JldHVybiBNYXRoLm1heCgwLC1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKS1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIENhKHQsbil7cmV0dXJuIHQ9TWF0aC5hYnModCksbj1NYXRoLmFicyhuKS10LE1hdGgubWF4KDAsZ2EobiktZ2EodCkpKzF9ZnVuY3Rpb24gUGEoKXtyZXR1cm4gbmV3IHphfWZ1bmN0aW9uIHphKCl7dGhpcy5yZXNldCgpfVNhKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pLHphLnByb3RvdHlwZT17Y29uc3RydWN0b3I6emEscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXtMYShSYSx0LHRoaXMudCksTGEodGhpcyxSYS5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9UmEudDp0aGlzLnM9UmEudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgUmE9bmV3IHphO2Z1bmN0aW9uIExhKHQsbixlKXt2YXIgcj10LnM9bitlLGk9ci1uLG89ci1pO3QudD1uLW8rKGUtaSl9dmFyIERhPTFlLTYsVWE9MWUtMTIscWE9TWF0aC5QSSxPYT1xYS8yLFlhPXFhLzQsQmE9MipxYSxGYT0xODAvcWEsSWE9cWEvMTgwLEhhPU1hdGguYWJzLGphPU1hdGguYXRhbixYYT1NYXRoLmF0YW4yLEdhPU1hdGguY29zLFZhPU1hdGguY2VpbCwkYT1NYXRoLmV4cCxXYT1NYXRoLmxvZyxaYT1NYXRoLnBvdyxRYT1NYXRoLnNpbixKYT1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sS2E9TWF0aC5zcXJ0LHR1PU1hdGgudGFuO2Z1bmN0aW9uIG51KHQpe3JldHVybiB0PjE/MDp0PC0xP3FhOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBldSh0KXtyZXR1cm4gdD4xP09hOnQ8LTE/LU9hOk1hdGguYXNpbih0KX1mdW5jdGlvbiBydSh0KXtyZXR1cm4odD1RYSh0LzIpKSp0fWZ1bmN0aW9uIGl1KCl7fWZ1bmN0aW9uIG91KHQsbil7dCYmdXUuaGFzT3duUHJvcGVydHkodC50eXBlKSYmdXVbdC50eXBlXSh0LG4pfXZhciBhdT17RmVhdHVyZTpmdW5jdGlvbih0LG4pe291KHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylvdShlW3JdLmdlb21ldHJ5LG4pfX0sdXU9e1NwaGVyZTpmdW5jdGlvbih0LG4pe24uc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsbil7dD10LmNvb3JkaW5hdGVzLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl0PWVbcl0sbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmdSh0LmNvb3JkaW5hdGVzLG4sMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspZnUoZVtyXSxuLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Y3UodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyljdShlW3JdLG4pfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspb3UoZVtyXSxuKX19O2Z1bmN0aW9uIGZ1KHQsbixlKXt2YXIgcixpPS0xLG89dC5sZW5ndGgtZTtmb3Iobi5saW5lU3RhcnQoKTsrK2k8bzspcj10W2ldLG4ucG9pbnQoclswXSxyWzFdLHJbMl0pO24ubGluZUVuZCgpfWZ1bmN0aW9uIGN1KHQsbil7dmFyIGU9LTEscj10Lmxlbmd0aDtmb3Iobi5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZnUodFtlXSxuLDEpO24ucG9seWdvbkVuZCgpfWZ1bmN0aW9uIHN1KHQsbil7dCYmYXUuaGFzT3duUHJvcGVydHkodC50eXBlKT9hdVt0LnR5cGVdKHQsbik6b3UodCxuKX12YXIgbHUsaHUsZHUscHUsdnUsZ3U9UGEoKSx5dT1QYSgpLF91PXtwb2ludDppdSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtndS5yZXNldCgpLF91LmxpbmVTdGFydD1idSxfdS5saW5lRW5kPW11fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K2d1O3l1LmFkZCh0PDA/QmErdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1pdX0sc3BoZXJlOmZ1bmN0aW9uKCl7eXUuYWRkKEJhKX19O2Z1bmN0aW9uIGJ1KCl7X3UucG9pbnQ9eHV9ZnVuY3Rpb24gbXUoKXt3dShsdSxodSl9ZnVuY3Rpb24geHUodCxuKXtfdS5wb2ludD13dSxsdT10LGh1PW4sZHU9dCo9SWEscHU9R2Eobj0obio9SWEpLzIrWWEpLHZ1PVFhKG4pfWZ1bmN0aW9uIHd1KHQsbil7dmFyIGU9KHQqPUlhKS1kdSxyPWU+PTA/MTotMSxpPXIqZSxvPUdhKG49KG4qPUlhKS8yK1lhKSxhPVFhKG4pLHU9dnUqYSxmPXB1Km8rdSpHYShpKSxjPXUqcipRYShpKTtndS5hZGQoWGEoYyxmKSksZHU9dCxwdT1vLHZ1PWF9ZnVuY3Rpb24gTXUodCl7cmV0dXJuW1hhKHRbMV0sdFswXSksZXUodFsyXSldfWZ1bmN0aW9uIEF1KHQpe3ZhciBuPXRbMF0sZT10WzFdLHI9R2EoZSk7cmV0dXJuW3IqR2EobikscipRYShuKSxRYShlKV19ZnVuY3Rpb24gVHUodCxuKXtyZXR1cm4gdFswXSpuWzBdK3RbMV0qblsxXSt0WzJdKm5bMl19ZnVuY3Rpb24gTnUodCxuKXtyZXR1cm5bdFsxXSpuWzJdLXRbMl0qblsxXSx0WzJdKm5bMF0tdFswXSpuWzJdLHRbMF0qblsxXS10WzFdKm5bMF1dfWZ1bmN0aW9uIFN1KHQsbil7dFswXSs9blswXSx0WzFdKz1uWzFdLHRbMl0rPW5bMl19ZnVuY3Rpb24gRXUodCxuKXtyZXR1cm5bdFswXSpuLHRbMV0qbix0WzJdKm5dfWZ1bmN0aW9uIGt1KHQpe3ZhciBuPUthKHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1uLHRbMV0vPW4sdFsyXS89bn12YXIgQ3UsUHUsenUsUnUsTHUsRHUsVXUscXUsT3UsWXUsQnUsRnUsSXUsSHUsanUsWHUsR3UsVnUsJHUsV3UsWnUsUXUsSnUsS3UsdGYsbmYsZWY9UGEoKSxyZj17cG9pbnQ6b2YsbGluZVN0YXJ0OnVmLGxpbmVFbmQ6ZmYscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7cmYucG9pbnQ9Y2YscmYubGluZVN0YXJ0PXNmLHJmLmxpbmVFbmQ9bGYsZWYucmVzZXQoKSxfdS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe191LnBvbHlnb25FbmQoKSxyZi5wb2ludD1vZixyZi5saW5lU3RhcnQ9dWYscmYubGluZUVuZD1mZixndTwwPyhDdT0tKHp1PTE4MCksUHU9LShSdT05MCkpOmVmPkRhP1J1PTkwOmVmPC1EYSYmKFB1PS05MCksWXVbMF09Q3UsWXVbMV09enV9fTtmdW5jdGlvbiBvZih0LG4pe091LnB1c2goWXU9W0N1PXQsenU9dF0pLG48UHUmJihQdT1uKSxuPlJ1JiYoUnU9bil9ZnVuY3Rpb24gYWYodCxuKXt2YXIgZT1BdShbdCpJYSxuKklhXSk7aWYocXUpe3ZhciByPU51KHF1LGUpLGk9TnUoW3JbMV0sLXJbMF0sMF0scik7a3UoaSksaT1NdShpKTt2YXIgbyxhPXQtTHUsdT1hPjA/MTotMSxmPWlbMF0qRmEqdSxjPUhhKGEpPjE4MDtjXih1Kkx1PGYmJmY8dSp0KT8obz1pWzFdKkZhKT5SdSYmKFJ1PW8pOmNeKHUqTHU8KGY9KGYrMzYwKSUzNjAtMTgwKSYmZjx1KnQpPyhvPS1pWzFdKkZhKTxQdSYmKFB1PW8pOihuPFB1JiYoUHU9biksbj5SdSYmKFJ1PW4pKSxjP3Q8THU/aGYoQ3UsdCk+aGYoQ3UsenUpJiYoenU9dCk6aGYodCx6dSk+aGYoQ3UsenUpJiYoQ3U9dCk6enU+PUN1Pyh0PEN1JiYoQ3U9dCksdD56dSYmKHp1PXQpKTp0Pkx1P2hmKEN1LHQpPmhmKEN1LHp1KSYmKHp1PXQpOmhmKHQsenUpPmhmKEN1LHp1KSYmKEN1PXQpfWVsc2UgT3UucHVzaChZdT1bQ3U9dCx6dT10XSk7bjxQdSYmKFB1PW4pLG4+UnUmJihSdT1uKSxxdT1lLEx1PXR9ZnVuY3Rpb24gdWYoKXtyZi5wb2ludD1hZn1mdW5jdGlvbiBmZigpe1l1WzBdPUN1LFl1WzFdPXp1LHJmLnBvaW50PW9mLHF1PW51bGx9ZnVuY3Rpb24gY2YodCxuKXtpZihxdSl7dmFyIGU9dC1MdTtlZi5hZGQoSGEoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBEdT10LFV1PW47X3UucG9pbnQodCxuKSxhZih0LG4pfWZ1bmN0aW9uIHNmKCl7X3UubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbGYoKXtjZihEdSxVdSksX3UubGluZUVuZCgpLEhhKGVmKT5EYSYmKEN1PS0oenU9MTgwKSksWXVbMF09Q3UsWXVbMV09enUscXU9bnVsbH1mdW5jdGlvbiBoZih0LG4pe3JldHVybihuLT10KTwwP24rMzYwOm59ZnVuY3Rpb24gZGYodCxuKXtyZXR1cm4gdFswXS1uWzBdfWZ1bmN0aW9uIHBmKHQsbil7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgdmY9e3NwaGVyZTppdSxwb2ludDpnZixsaW5lU3RhcnQ6X2YsbGluZUVuZDp4Zixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt2Zi5saW5lU3RhcnQ9d2YsdmYubGluZUVuZD1NZn0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZmLmxpbmVTdGFydD1fZix2Zi5saW5lRW5kPXhmfX07ZnVuY3Rpb24gZ2YodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSk7eWYoZSpHYSh0KSxlKlFhKHQpLFFhKG4pKX1mdW5jdGlvbiB5Zih0LG4sZSl7SXUrPSh0LUl1KS8rK0J1LEh1Kz0obi1IdSkvQnUsanUrPShlLWp1KS9CdX1mdW5jdGlvbiBfZigpe3ZmLnBvaW50PWJmfWZ1bmN0aW9uIGJmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx2Zi5wb2ludD1tZix5ZihLdSx0ZixuZil9ZnVuY3Rpb24gbWYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9WGEoS2EoKGE9dGYqby1uZippKSphKyhhPW5mKnItS3UqbykqYSsoYT1LdSppLXRmKnIpKmEpLEt1KnIrdGYqaStuZipvKTtGdSs9YSxYdSs9YSooS3UrKEt1PXIpKSxHdSs9YSoodGYrKHRmPWkpKSxWdSs9YSoobmYrKG5mPW8pKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24geGYoKXt2Zi5wb2ludD1nZn1mdW5jdGlvbiB3Zigpe3ZmLnBvaW50PUFmfWZ1bmN0aW9uIE1mKCl7VGYoUXUsSnUpLHZmLnBvaW50PWdmfWZ1bmN0aW9uIEFmKHQsbil7UXU9dCxKdT1uLHQqPUlhLG4qPUlhLHZmLnBvaW50PVRmO3ZhciBlPUdhKG4pO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24gVGYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9dGYqby1uZippLHU9bmYqci1LdSpvLGY9S3UqaS10ZipyLGM9S2EoYSphK3UqdStmKmYpLHM9ZXUoYyksbD1jJiYtcy9jOyR1Kz1sKmEsV3UrPWwqdSxadSs9bCpmLEZ1Kz1zLFh1Kz1zKihLdSsoS3U9cikpLEd1Kz1zKih0ZisodGY9aSkpLFZ1Kz1zKihuZisobmY9bykpLHlmKEt1LHRmLG5mKX1mdW5jdGlvbiBOZih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gU2YodCxuKXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9dChlLHIpLG4oZVswXSxlWzFdKX1yZXR1cm4gdC5pbnZlcnQmJm4uaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4oZT1uLmludmVydChlLHIpKSYmdC5pbnZlcnQoZVswXSxlWzFdKX0pLGV9ZnVuY3Rpb24gRWYodCxuKXtyZXR1cm5bdD5xYT90LUJhOnQ8LXFhP3QrQmE6dCxuXX1mdW5jdGlvbiBrZih0LG4sZSl7cmV0dXJuKHQlPUJhKT9ufHxlP1NmKFBmKHQpLHpmKG4sZSkpOlBmKHQpOm58fGU/emYobixlKTpFZn1mdW5jdGlvbiBDZih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm5bKG4rPXQpPnFhP24tQmE6bjwtcWE/bitCYTpuLGVdfX1mdW5jdGlvbiBQZih0KXt2YXIgbj1DZih0KTtyZXR1cm4gbi5pbnZlcnQ9Q2YoLXQpLG59ZnVuY3Rpb24gemYodCxuKXt2YXIgZT1HYSh0KSxyPVFhKHQpLGk9R2Eobiksbz1RYShuKTtmdW5jdGlvbiBhKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyplK3UqcjtyZXR1cm5bWGEoZippLXMqbyx1KmUtYypyKSxldShzKmkrZipvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyppLWYqbztyZXR1cm5bWGEoZippK2Mqbyx1KmUrcypyKSxldShzKmUtdSpyKV19LGF9ZnVuY3Rpb24gUmYodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4obj10KG5bMF0qSWEsblsxXSpJYSkpWzBdKj1GYSxuWzFdKj1GYSxufXJldHVybiB0PWtmKHRbMF0qSWEsdFsxXSpJYSx0Lmxlbmd0aD4yP3RbMl0qSWE6MCksbi5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuKG49dC5pbnZlcnQoblswXSpJYSxuWzFdKklhKSlbMF0qPUZhLG5bMV0qPUZhLG59LG59ZnVuY3Rpb24gTGYodCxuLGUscixpLG8pe2lmKGUpe3ZhciBhPUdhKG4pLHU9UWEobiksZj1yKmU7bnVsbD09aT8oaT1uK3IqQmEsbz1uLWYvMik6KGk9RGYoYSxpKSxvPURmKGEsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqQmEpKTtmb3IodmFyIGMscz1pO3I+MD9zPm86czxvO3MtPWYpYz1NdShbYSwtdSpHYShzKSwtdSpRYShzKV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gRGYodCxuKXsobj1BdShuKSlbMF0tPXQsa3Uobik7dmFyIGU9bnUoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStCYS1EYSklQmF9ZnVuY3Rpb24gVWYoKXt2YXIgdCxuPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihuLGUpe3QucHVzaChbbixlXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ucHVzaCh0PVtdKX0sbGluZUVuZDppdSxyZWpvaW46ZnVuY3Rpb24oKXtuLmxlbmd0aD4xJiZuLnB1c2gobi5wb3AoKS5jb25jYXQobi5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPW47cmV0dXJuIG49W10sdD1udWxsLGV9fX1mdW5jdGlvbiBxZih0LG4pe3JldHVybiBIYSh0WzBdLW5bMF0pPERhJiZIYSh0WzFdLW5bMV0pPERhfWZ1bmN0aW9uIE9mKHQsbixlLHIpe3RoaXMueD10LHRoaXMuej1uLHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gWWYodCxuLGUscixpKXt2YXIgbyxhLHU9W10sZj1bXTtpZih0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoISgobj10Lmxlbmd0aC0xKTw9MCkpe3ZhciBuLGUscj10WzBdLGE9dFtuXTtpZihxZihyLGEpKXtmb3IoaS5saW5lU3RhcnQoKSxvPTA7bzxuOysrbylpLnBvaW50KChyPXRbb10pWzBdLHJbMV0pO2kubGluZUVuZCgpfWVsc2UgdS5wdXNoKGU9bmV3IE9mKHIsdCxudWxsLCEwKSksZi5wdXNoKGUubz1uZXcgT2YocixudWxsLGUsITEpKSx1LnB1c2goZT1uZXcgT2YoYSx0LG51bGwsITEpKSxmLnB1c2goZS5vPW5ldyBPZihhLG51bGwsZSwhMCkpfX0pLHUubGVuZ3RoKXtmb3IoZi5zb3J0KG4pLEJmKHUpLEJmKGYpLG89MCxhPWYubGVuZ3RoO288YTsrK28pZltvXS5lPWU9IWU7Zm9yKHZhciBjLHMsbD11WzBdOzspe2Zvcih2YXIgaD1sLGQ9ITA7aC52OylpZigoaD1oLm4pPT09bClyZXR1cm47Yz1oLnosaS5saW5lU3RhcnQoKTtkb3tpZihoLnY9aC5vLnY9ITAsaC5lKXtpZihkKWZvcihvPTAsYT1jLmxlbmd0aDtvPGE7KytvKWkucG9pbnQoKHM9Y1tvXSlbMF0sc1sxXSk7ZWxzZSByKGgueCxoLm4ueCwxLGkpO2g9aC5ufWVsc2V7aWYoZClmb3IoYz1oLnAueixvPWMubGVuZ3RoLTE7bz49MDstLW8paS5wb2ludCgocz1jW29dKVswXSxzWzFdKTtlbHNlIHIoaC54LGgucC54LC0xLGkpO2g9aC5wfWM9KGg9aC5vKS56LGQ9IWR9d2hpbGUoIWgudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBCZih0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1FZi5pbnZlcnQ9RWY7dmFyIEZmPVBhKCk7ZnVuY3Rpb24gSWYodCxuKXt2YXIgZT1uWzBdLHI9blsxXSxpPVFhKHIpLG89W1FhKGUpLC1HYShlKSwwXSxhPTAsdT0wO0ZmLnJlc2V0KCksMT09PWk/cj1PYStEYTotMT09PWkmJihyPS1PYS1EYSk7Zm9yKHZhciBmPTAsYz10Lmxlbmd0aDtmPGM7KytmKWlmKGw9KHM9dFtmXSkubGVuZ3RoKWZvcih2YXIgcyxsLGg9c1tsLTFdLGQ9aFswXSxwPWhbMV0vMitZYSx2PVFhKHApLGc9R2EocCkseT0wO3k8bDsrK3ksZD1iLHY9eCxnPXcsaD1fKXt2YXIgXz1zW3ldLGI9X1swXSxtPV9bMV0vMitZYSx4PVFhKG0pLHc9R2EobSksTT1iLWQsQT1NPj0wPzE6LTEsVD1BKk0sTj1UPnFhLFM9dip4O2lmKEZmLmFkZChYYShTKkEqUWEoVCksZyp3K1MqR2EoVCkpKSxhKz1OP00rQSpCYTpNLE5eZD49ZV5iPj1lKXt2YXIgRT1OdShBdShoKSxBdShfKSk7a3UoRSk7dmFyIGs9TnUobyxFKTtrdShrKTt2YXIgQz0oTl5NPj0wPy0xOjEpKmV1KGtbMl0pOyhyPkN8fHI9PT1DJiYoRVswXXx8RVsxXSkpJiYodSs9Tl5NPj0wPzE6LTEpfX1yZXR1cm4oYTwtRGF8fGE8RGEmJkZmPC1EYSleMSZ1fWZ1bmN0aW9uIEhmKHQsbixlLHIpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgbyxhLHUsZj1uKGkpLGM9VWYoKSxzPW4oYyksbD0hMSxoPXtwb2ludDpkLGxpbmVTdGFydDp2LGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtoLnBvaW50PXksaC5saW5lU3RhcnQ9XyxoLmxpbmVFbmQ9YixhPVtdLG89W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtoLnBvaW50PWQsaC5saW5lU3RhcnQ9dixoLmxpbmVFbmQ9ZyxhPU4oYSk7dmFyIHQ9SWYobyxyKTthLmxlbmd0aD8obHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksWWYoYSxYZix0LGUsaSkpOnQmJihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGwmJihpLnBvbHlnb25FbmQoKSxsPSExKSxhPW89bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKG4sZSl7dChuLGUpJiZpLnBvaW50KG4sZSl9ZnVuY3Rpb24gcCh0LG4pe2YucG9pbnQodCxuKX1mdW5jdGlvbiB2KCl7aC5wb2ludD1wLGYubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2gucG9pbnQ9ZCxmLmxpbmVFbmQoKX1mdW5jdGlvbiB5KHQsbil7dS5wdXNoKFt0LG5dKSxzLnBvaW50KHQsbil9ZnVuY3Rpb24gXygpe3MubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiBiKCl7eSh1WzBdWzBdLHVbMF1bMV0pLHMubGluZUVuZCgpO3ZhciB0LG4sZSxyLGY9cy5jbGVhbigpLGg9Yy5yZXN1bHQoKSxkPWgubGVuZ3RoO2lmKHUucG9wKCksby5wdXNoKHUpLHU9bnVsbCxkKWlmKDEmZil7aWYoKG49KGU9aFswXSkubGVuZ3RoLTEpPjApe2ZvcihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLHQ9MDt0PG47Kyt0KWkucG9pbnQoKHI9ZVt0XSlbMF0sclsxXSk7aS5saW5lRW5kKCl9fWVsc2UgZD4xJiYyJmYmJmgucHVzaChoLnBvcCgpLmNvbmNhdChoLnNoaWZ0KCkpKSxhLnB1c2goaC5maWx0ZXIoamYpKX1yZXR1cm4gaH19ZnVuY3Rpb24gamYodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gWGYodCxuKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tT2EtRGE6T2EtdFsxXSktKChuPW4ueClbMF08MD9uWzFdLU9hLURhOk9hLW5bMV0pfXZhciBHZj1IZihmdW5jdGlvbigpe3JldHVybiEwfSxmdW5jdGlvbih0KXt2YXIgbixlPU5hTixyPU5hTixpPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxuPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHU9bz4wP3FhOi1xYSxmPUhhKG8tZSk7SGEoZi1xYSk8RGE/KHQucG9pbnQoZSxyPShyK2EpLzI+MD9PYTotT2EpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQodSxyKSx0LnBvaW50KG8sciksbj0wKTppIT09dSYmZj49cWEmJihIYShlLWkpPERhJiYoZS09aSpEYSksSGEoby11KTxEYSYmKG8tPXUqRGEpLHI9ZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhPVFhKHQtZSk7cmV0dXJuIEhhKGEpPkRhP2phKChRYShuKSoobz1HYShyKSkqUWEoZSktUWEocikqKGk9R2EobikpKlFhKHQpKS8oaSpvKmEpKToobityKS8yfShlLHIsbyxhKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksbj0wKSx0LnBvaW50KGU9byxyPWEpLGk9dX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fSxmdW5jdGlvbih0LG4sZSxyKXt2YXIgaTtpZihudWxsPT10KWk9ZSpPYSxyLnBvaW50KC1xYSxpKSxyLnBvaW50KDAsaSksci5wb2ludChxYSxpKSxyLnBvaW50KHFhLDApLHIucG9pbnQocWEsLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtcWEsLWkpLHIucG9pbnQoLXFhLDApLHIucG9pbnQoLXFhLGkpO2Vsc2UgaWYoSGEodFswXS1uWzBdKT5EYSl7dmFyIG89dFswXTxuWzBdP3FhOi1xYTtpPWUqby8yLHIucG9pbnQoLW8saSksci5wb2ludCgwLGkpLHIucG9pbnQobyxpKX1lbHNlIHIucG9pbnQoblswXSxuWzFdKX0sWy1xYSwtT2FdKTtmdW5jdGlvbiBWZih0KXt2YXIgbj1HYSh0KSxlPTYqSWEscj1uPjAsaT1IYShuKT5EYTtmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIEdhKHQpKkdhKGUpPm59ZnVuY3Rpb24gYSh0LGUscil7dmFyIGk9WzEsMCwwXSxvPU51KEF1KHQpLEF1KGUpKSxhPVR1KG8sbyksdT1vWzBdLGY9YS11KnU7aWYoIWYpcmV0dXJuIXImJnQ7dmFyIGM9biphL2Yscz0tbip1L2YsbD1OdShpLG8pLGg9RXUoaSxjKTtTdShoLEV1KG8scykpO3ZhciBkPWwscD1UdShoLGQpLHY9VHUoZCxkKSxnPXAqcC12KihUdShoLGgpLTEpO2lmKCEoZzwwKSl7dmFyIHk9S2EoZyksXz1FdShkLCgtcC15KS92KTtpZihTdShfLGgpLF89TXUoXyksIXIpcmV0dXJuIF87dmFyIGIsbT10WzBdLHg9ZVswXSx3PXRbMV0sTT1lWzFdO3g8bSYmKGI9bSxtPXgseD1iKTt2YXIgQT14LW0sVD1IYShBLXFhKTxEYTtpZighVCYmTTx3JiYoYj13LHc9TSxNPWIpLFR8fEE8RGE/VD93K00+MF5fWzFdPChIYShfWzBdLW0pPERhP3c6TSk6dzw9X1sxXSYmX1sxXTw9TTpBPnFhXihtPD1fWzBdJiZfWzBdPD14KSl7dmFyIE49RXUoZCwoLXAreSkvdik7cmV0dXJuIFN1KE4saCksW18sTXUoTildfX19ZnVuY3Rpb24gdShuLGUpe3ZhciBpPXI/dDpxYS10LG89MDtyZXR1cm4gbjwtaT9vfD0xOm4+aSYmKG98PTIpLGU8LWk/b3w9NDplPmkmJihvfD04KSxvfXJldHVybiBIZihvLGZ1bmN0aW9uKHQpe3ZhciBuLGUsZixjLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9Zj0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGwsaCl7dmFyIGQscD1bbCxoXSx2PW8obCxoKSxnPXI/dj8wOnUobCxoKTp2P3UobCsobDwwP3FhOi1xYSksaCk6MDtpZighbiYmKGM9Zj12KSYmdC5saW5lU3RhcnQoKSx2IT09ZiYmKCEoZD1hKG4scCkpfHxxZihuLGQpfHxxZihwLGQpKSYmKHBbMF0rPURhLHBbMV0rPURhLHY9byhwWzBdLHBbMV0pKSx2IT09ZilzPTAsdj8odC5saW5lU3RhcnQoKSxkPWEocCxuKSx0LnBvaW50KGRbMF0sZFsxXSkpOihkPWEobixwKSx0LnBvaW50KGRbMF0sZFsxXSksdC5saW5lRW5kKCkpLG49ZDtlbHNlIGlmKGkmJm4mJnJedil7dmFyIHk7ZyZlfHwhKHk9YShwLG4sITApKXx8KHM9MCxyPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoeVswXVswXSx5WzBdWzFdKSx0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSkpKX0hdnx8biYmcWYobixwKXx8dC5wb2ludChwWzBdLHBbMV0pLG49cCxmPXYsZT1nfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZiYmdC5saW5lRW5kKCksbj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChjJiZmKTw8MX19fSxmdW5jdGlvbihuLHIsaSxvKXtMZihvLHQsZSxpLG4scil9LHI/WzAsLXRdOlstcWEsdC1xYV0pfXZhciAkZj0xZTksV2Y9LSRmO2Z1bmN0aW9uIFpmKHQsbixlLHIpe2Z1bmN0aW9uIGkoaSxvKXtyZXR1cm4gdDw9aSYmaTw9ZSYmbjw9byYmbzw9cn1mdW5jdGlvbiBvKGksbyx1LGMpe3ZhciBzPTAsbD0wO2lmKG51bGw9PWl8fChzPWEoaSx1KSkhPT0obD1hKG8sdSkpfHxmKGksbyk8MF51PjApZG97Yy5wb2ludCgwPT09c3x8Mz09PXM/dDplLHM+MT9yOm4pfXdoaWxlKChzPShzK3UrNCklNCkhPT1sKTtlbHNlIGMucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiBhKHIsaSl7cmV0dXJuIEhhKHJbMF0tdCk8RGE/aT4wPzA6MzpIYShyWzBdLWUpPERhP2k+MD8yOjE6SGEoclsxXS1uKTxEYT9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gdSh0LG4pe3JldHVybiBmKHQueCxuLngpfWZ1bmN0aW9uIGYodCxuKXt2YXIgZT1hKHQsMSkscj1hKG4sMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT9uWzFdLXRbMV06MT09PWU/dFswXS1uWzBdOjI9PT1lP3RbMV0tblsxXTpuWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBmLGMscyxsLGgsZCxwLHYsZyx5LF8sYj1hLG09VWYoKSx4PXtwb2ludDp3LGxpbmVTdGFydDpmdW5jdGlvbigpe3gucG9pbnQ9TSxjJiZjLnB1c2gocz1bXSk7eT0hMCxnPSExLHA9dj1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmJiYoTShsLGgpLGQmJmcmJm0ucmVqb2luKCksZi5wdXNoKG0ucmVzdWx0KCkpKTt4LnBvaW50PXcsZyYmYi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2I9bSxmPVtdLGM9W10sXz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsZT0wLGk9Yy5sZW5ndGg7ZTxpOysrZSlmb3IodmFyIG8sYSx1PWNbZV0sZj0xLHM9dS5sZW5ndGgsbD11WzBdLGg9bFswXSxkPWxbMV07ZjxzOysrZilvPWgsYT1kLGw9dVtmXSxoPWxbMF0sZD1sWzFdLGE8PXI/ZD5yJiYoaC1vKSooci1hKT4oZC1hKSoodC1vKSYmKytuOmQ8PXImJihoLW8pKihyLWEpPChkLWEpKih0LW8pJiYtLW47cmV0dXJuIG59KCksZT1fJiZuLGk9KGY9TihmKSkubGVuZ3RoOyhlfHxpKSYmKGEucG9seWdvblN0YXJ0KCksZSYmKGEubGluZVN0YXJ0KCksbyhudWxsLG51bGwsMSxhKSxhLmxpbmVFbmQoKSksaSYmWWYoZix1LG4sbyxhKSxhLnBvbHlnb25FbmQoKSk7Yj1hLGY9Yz1zPW51bGx9fTtmdW5jdGlvbiB3KHQsbil7aSh0LG4pJiZiLnBvaW50KHQsbil9ZnVuY3Rpb24gTShvLGEpe3ZhciB1PWkobyxhKTtpZihjJiZzLnB1c2goW28sYV0pLHkpbD1vLGg9YSxkPXUseT0hMSx1JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSkpO2Vsc2UgaWYodSYmZyliLnBvaW50KG8sYSk7ZWxzZXt2YXIgZj1bcD1NYXRoLm1heChXZixNYXRoLm1pbigkZixwKSksdj1NYXRoLm1heChXZixNYXRoLm1pbigkZix2KSldLG09W289TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsbykpLGE9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsYSkpXTshZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciBhLHU9dFswXSxmPXRbMV0sYz0wLHM9MSxsPW5bMF0tdSxoPW5bMV0tZjtpZihhPWUtdSxsfHwhKGE+MCkpe2lmKGEvPWwsbDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihsPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPWktdSxsfHwhKGE8MCkpe2lmKGEvPWwsbDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihsPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1pZihhPXItZixofHwhKGE+MCkpe2lmKGEvPWgsaDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihoPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPW8tZixofHwhKGE8MCkpe2lmKGEvPWgsaDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihoPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1yZXR1cm4gYz4wJiYodFswXT11K2MqbCx0WzFdPWYrYypoKSxzPDEmJihuWzBdPXUrcypsLG5bMV09ZitzKmgpLCEwfX19fX0oZixtLHQsbixlLHIpP3UmJihiLmxpbmVTdGFydCgpLGIucG9pbnQobyxhKSxfPSExKTooZ3x8KGIubGluZVN0YXJ0KCksYi5wb2ludChmWzBdLGZbMV0pKSxiLnBvaW50KG1bMF0sbVsxXSksdXx8Yi5saW5lRW5kKCksXz0hMSl9cD1vLHY9YSxnPXV9cmV0dXJuIHh9fXZhciBRZixKZixLZix0Yz1QYSgpLG5jPXtzcGhlcmU6aXUscG9pbnQ6aXUsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bmMucG9pbnQ9cmMsbmMubGluZUVuZD1lY30sbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6aXUscG9seWdvbkVuZDppdX07ZnVuY3Rpb24gZWMoKXtuYy5wb2ludD1uYy5saW5lRW5kPWl1fWZ1bmN0aW9uIHJjKHQsbil7UWY9dCo9SWEsSmY9UWEobio9SWEpLEtmPUdhKG4pLG5jLnBvaW50PWljfWZ1bmN0aW9uIGljKHQsbil7dCo9SWE7dmFyIGU9UWEobio9SWEpLHI9R2EobiksaT1IYSh0LVFmKSxvPUdhKGkpLGE9cipRYShpKSx1PUtmKmUtSmYqcipvLGY9SmYqZStLZipyKm87dGMuYWRkKFhhKEthKGEqYSt1KnUpLGYpKSxRZj10LEpmPWUsS2Y9cn1mdW5jdGlvbiBvYyh0KXtyZXR1cm4gdGMucmVzZXQoKSxzdSh0LG5jKSwrdGN9dmFyIGFjPVtudWxsLG51bGxdLHVjPXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczphY307ZnVuY3Rpb24gZmModCxuKXtyZXR1cm4gYWNbMF09dCxhY1sxXT1uLG9jKHVjKX12YXIgY2M9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbGModC5nZW9tZXRyeSxuKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0uZ2VvbWV0cnksbikpcmV0dXJuITA7cmV0dXJuITF9fSxzYz17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGhjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGhjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZGModC5jb29yZGluYXRlcyxuKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihkYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHBjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYocGMoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBsYyh0LG4pe3JldHVybiEoIXR8fCFzYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmc2NbdC50eXBlXSh0LG4pfWZ1bmN0aW9uIGhjKHQsbil7cmV0dXJuIDA9PT1mYyh0LG4pfWZ1bmN0aW9uIGRjKHQsbil7dmFyIGU9ZmModFswXSx0WzFdKTtyZXR1cm4gZmModFswXSxuKStmYyhuLHRbMV0pPD1lK0RhfWZ1bmN0aW9uIHBjKHQsbil7cmV0dXJuISFJZih0Lm1hcCh2YyksZ2MobikpfWZ1bmN0aW9uIHZjKHQpe3JldHVybih0PXQubWFwKGdjKSkucG9wKCksdH1mdW5jdGlvbiBnYyh0KXtyZXR1cm5bdFswXSpJYSx0WzFdKklhXX1mdW5jdGlvbiB5Yyh0LG4sZSl7dmFyIHI9Zyh0LG4tRGEsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gX2ModCxuLGUpe3ZhciByPWcodCxuLURhLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGJjKCl7dmFyIHQsbixlLHIsaSxvLGEsdSxmLGMscyxsLGg9MTAsZD1oLHA9OTAsdj0zNjAseT0yLjU7ZnVuY3Rpb24gXygpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmIoKX19ZnVuY3Rpb24gYigpe3JldHVybiBnKFZhKHIvcCkqcCxlLHApLm1hcChzKS5jb25jYXQoZyhWYSh1L3YpKnYsYSx2KS5tYXAobCkpLmNvbmNhdChnKFZhKG4vaCkqaCx0LGgpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gSGEodCVwKT5EYX0pLm1hcChmKSkuY29uY2F0KGcoVmEoby9kKSpkLGksZCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBIYSh0JXYpPkRhfSkubWFwKGMpKX1yZXR1cm4gXy5saW5lcz1mdW5jdGlvbigpe3JldHVybiBiKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fX0pfSxfLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3MocikuY29uY2F0KGwoYSkuc2xpY2UoMSkscyhlKS5yZXZlcnNlKCkuc2xpY2UoMSksbCh1KS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LF8uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6Xy5leHRlbnRNaW5vcigpfSxfLmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sdT0rdFswXVsxXSxhPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSx1PmEmJih0PXUsdT1hLGE9dCksXy5wcmVjaXNpb24oeSkpOltbcix1XSxbZSxhXV19LF8uZXh0ZW50TWlub3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF1bMF0sdD0rZVsxXVswXSxvPStlWzBdWzFdLGk9K2VbMV1bMV0sbj50JiYoZT1uLG49dCx0PWUpLG8+aSYmKGU9byxvPWksaT1lKSxfLnByZWNpc2lvbih5KSk6W1tuLG9dLFt0LGldXX0sXy5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTpfLnN0ZXBNaW5vcigpfSxfLnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSx2PSt0WzFdLF8pOltwLHZdfSxfLnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLF8pOltoLGRdfSxfLnByZWNpc2lvbj1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0raCxmPXljKG8saSw5MCksYz1fYyhuLHQseSkscz15Yyh1LGEsOTApLGw9X2MocixlLHkpLF8pOnl9LF8uZXh0ZW50TWFqb3IoW1stMTgwLC05MCtEYV0sWzE4MCw5MC1EYV1dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLURhXSxbMTgwLDgwK0RhXV0pfWZ1bmN0aW9uIG1jKHQpe3JldHVybiB0fXZhciB4Yyx3YyxNYyxBYyxUYz1QYSgpLE5jPVBhKCksU2M9e3BvaW50Oml1LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1NjLmxpbmVTdGFydD1FYyxTYy5saW5lRW5kPVBjfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7U2MubGluZVN0YXJ0PVNjLmxpbmVFbmQ9U2MucG9pbnQ9aXUsVGMuYWRkKEhhKE5jKSksTmMucmVzZXQoKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9VGMvMjtyZXR1cm4gVGMucmVzZXQoKSx0fX07ZnVuY3Rpb24gRWMoKXtTYy5wb2ludD1rY31mdW5jdGlvbiBrYyh0LG4pe1NjLnBvaW50PUNjLHhjPU1jPXQsd2M9QWM9bn1mdW5jdGlvbiBDYyh0LG4pe05jLmFkZChBYyp0LU1jKm4pLE1jPXQsQWM9bn1mdW5jdGlvbiBQYygpe0NjKHhjLHdjKX12YXIgemM9MS8wLFJjPXpjLExjPS16YyxEYz1MYyxVYz17cG9pbnQ6ZnVuY3Rpb24odCxuKXt0PHpjJiYoemM9dCk7dD5MYyYmKExjPXQpO248UmMmJihSYz1uKTtuPkRjJiYoRGM9bil9LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDppdSxwb2x5Z29uRW5kOml1LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbemMsUmNdLFtMYyxEY11dO3JldHVybiBMYz1EYz0tKFJjPXpjPTEvMCksdH19O3ZhciBxYyxPYyxZYyxCYyxGYz0wLEljPTAsSGM9MCxqYz0wLFhjPTAsR2M9MCxWYz0wLCRjPTAsV2M9MCxaYz17cG9pbnQ6UWMsbGluZVN0YXJ0OkpjLGxpbmVFbmQ6bnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WmMubGluZVN0YXJ0PWVzLFpjLmxpbmVFbmQ9cnN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtaYy5wb2ludD1RYyxaYy5saW5lU3RhcnQ9SmMsWmMubGluZUVuZD1uc30scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9V2M/W1ZjL1djLCRjL1djXTpHYz9bamMvR2MsWGMvR2NdOkhjP1tGYy9IYyxJYy9IY106W05hTixOYU5dO3JldHVybiBGYz1JYz1IYz1qYz1YYz1HYz1WYz0kYz1XYz0wLHR9fTtmdW5jdGlvbiBRYyh0LG4pe0ZjKz10LEljKz1uLCsrSGN9ZnVuY3Rpb24gSmMoKXtaYy5wb2ludD1LY31mdW5jdGlvbiBLYyh0LG4pe1pjLnBvaW50PXRzLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gdHModCxuKXt2YXIgZT10LVljLHI9bi1CYyxpPUthKGUqZStyKnIpO2pjKz1pKihZYyt0KS8yLFhjKz1pKihCYytuKS8yLEdjKz1pLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gbnMoKXtaYy5wb2ludD1RY31mdW5jdGlvbiBlcygpe1pjLnBvaW50PWlzfWZ1bmN0aW9uIHJzKCl7b3MocWMsT2MpfWZ1bmN0aW9uIGlzKHQsbil7WmMucG9pbnQ9b3MsUWMocWM9WWM9dCxPYz1CYz1uKX1mdW5jdGlvbiBvcyh0LG4pe3ZhciBlPXQtWWMscj1uLUJjLGk9S2EoZSplK3Iqcik7amMrPWkqKFljK3QpLzIsWGMrPWkqKEJjK24pLzIsR2MrPWksVmMrPShpPUJjKnQtWWMqbikqKFljK3QpLCRjKz1pKihCYytuKSxXYys9MyppLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gYXModCl7dGhpcy5fY29udGV4dD10fWFzLnByb3RvdHlwZT17X3JhZGl1czo0LjUscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhZGl1cz10LHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTticmVhaztkZWZhdWx0OnRoaXMuX2NvbnRleHQubW92ZVRvKHQrdGhpcy5fcmFkaXVzLG4pLHRoaXMuX2NvbnRleHQuYXJjKHQsbix0aGlzLl9yYWRpdXMsMCxCYSl9fSxyZXN1bHQ6aXV9O3ZhciB1cyxmcyxjcyxzcyxscyxocz1QYSgpLGRzPXtwb2ludDppdSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtkcy5wb2ludD1wc30sbGluZUVuZDpmdW5jdGlvbigpe3VzJiZ2cyhmcyxjcyksZHMucG9pbnQ9aXV9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3VzPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dXM9bnVsbH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9K2hzO3JldHVybiBocy5yZXNldCgpLHR9fTtmdW5jdGlvbiBwcyh0LG4pe2RzLnBvaW50PXZzLGZzPXNzPXQsY3M9bHM9bn1mdW5jdGlvbiB2cyh0LG4pe3NzLT10LGxzLT1uLGhzLmFkZChLYShzcypzcytscypscykpLHNzPXQsbHM9bn1mdW5jdGlvbiBncygpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiB5cyh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBfcyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bmV3IGJzO2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXTtyZXR1cm4gZS5zdHJlYW09bixlfX1mdW5jdGlvbiBicygpe31mdW5jdGlvbiBtcyh0LG4sZSl7dmFyIHI9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9ciYmdC5jbGlwRXh0ZW50KG51bGwpLHN1KGUsdC5zdHJlYW0oVWMpKSxuKFVjLnJlc3VsdCgpKSxudWxsIT1yJiZ0LmNsaXBFeHRlbnQociksdH1mdW5jdGlvbiB4cyh0LG4sZSl7cmV0dXJuIG1zKHQsZnVuY3Rpb24oZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89TWF0aC5taW4oci8oZVsxXVswXS1lWzBdWzBdKSxpLyhlWzFdWzFdLWVbMF1bMV0pKSxhPStuWzBdWzBdKyhyLW8qKGVbMV1bMF0rZVswXVswXSkpLzIsdT0rblswXVsxXSsoaS1vKihlWzFdWzFdK2VbMF1bMV0pKS8yO3Quc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSx1XSl9LGUpfWZ1bmN0aW9uIHdzKHQsbixlKXtyZXR1cm4geHModCxbWzAsMF0sbl0sZSl9ZnVuY3Rpb24gTXModCxuLGUpe3JldHVybiBtcyh0LGZ1bmN0aW9uKGUpe3ZhciByPStuLGk9ci8oZVsxXVswXS1lWzBdWzBdKSxvPShyLWkqKGVbMV1bMF0rZVswXVswXSkpLzIsYT0taSplWzBdWzFdO3Quc2NhbGUoMTUwKmkpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIEFzKHQsbixlKXtyZXR1cm4gbXModCxmdW5jdGlvbihlKXt2YXIgcj0rbixpPXIvKGVbMV1bMV0tZVswXVsxXSksbz0taSplWzBdWzBdLGE9KHItaSooZVsxXVsxXStlWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCppKS50cmFuc2xhdGUoW28sYV0pfSxlKX1ncy5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6eXMoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixuKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT15cyh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbix0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LGJzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YnMscG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIFRzPTE2LE5zPUdhKDMwKklhKTtmdW5jdGlvbiBTcyh0LG4pe3JldHVybituP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShyLGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGcpe3ZhciB5PWMtcixfPXMtaSxiPXkqeStfKl87aWYoYj40Km4mJnYtLSl7dmFyIG09YStoLHg9dStkLHc9ZitwLE09S2EobSptK3gqeCt3KncpLEE9ZXUody89TSksVD1IYShIYSh3KS0xKTxEYXx8SGEoby1sKTxEYT8obytsKS8yOlhhKHgsbSksTj10KFQsQSksUz1OWzBdLEU9TlsxXSxrPVMtcixDPUUtaSxQPV8qay15KkM7KFAqUC9iPm58fEhhKCh5KmsrXypDKS9iLS41KT4uM3x8YSpoK3UqZCtmKnA8TnMpJiYoZShyLGksbyxhLHUsZixTLEUsVCxtLz1NLHgvPU0sdyx2LGcpLGcucG9pbnQoUyxFKSxlKFMsRSxULG0seCx3LGMscyxsLGgsZCxwLHYsZykpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsaSxvLGEsdSxmLGMscyxsLGgsZCxwLHY9e3BvaW50OmcsbGluZVN0YXJ0OnksbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksdi5saW5lU3RhcnQ9bX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLHYubGluZVN0YXJ0PXl9fTtmdW5jdGlvbiBnKGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHkoKXtzPU5hTix2LnBvaW50PV8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKHIsaSl7dmFyIG89QXUoW3IsaV0pLGE9dChyLGkpO2UocyxsLGMsaCxkLHAscz1hWzBdLGw9YVsxXSxjPXIsaD1vWzBdLGQ9b1sxXSxwPW9bMl0sVHMsbiksbi5wb2ludChzLGwpfWZ1bmN0aW9uIGIoKXt2LnBvaW50PWcsbi5saW5lRW5kKCl9ZnVuY3Rpb24gbSgpe3koKSx2LnBvaW50PXgsdi5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LG4pe18ocj10LG4pLGk9cyxvPWwsYT1oLHU9ZCxmPXAsdi5wb2ludD1ffWZ1bmN0aW9uIHcoKXtlKHMsbCxjLGgsZCxwLGksbyxyLGEsdSxmLFRzLG4pLHYubGluZUVuZD1iLGIoKX1yZXR1cm4gdn19KHQsbik6ZnVuY3Rpb24odCl7cmV0dXJuIF9zKHtwb2ludDpmdW5jdGlvbihuLGUpe249dChuLGUpLHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9KHQpfXZhciBFcz1fcyh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KklhLG4qSWEpfX0pO2Z1bmN0aW9uIGtzKHQsbixlLHIpe3ZhciBpPUdhKHIpLG89UWEociksYT1pKnQsdT1vKnQsZj1pL3QsYz1vL3Qscz0obyplLWkqbikvdCxsPShvKm4raSplKS90O2Z1bmN0aW9uIGgodCxyKXtyZXR1cm5bYSp0LXUqcituLGUtdSp0LWEqcl19cmV0dXJuIGguaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW2YqdC1jKm4rcyxsLWMqdC1mKm5dfSxofWZ1bmN0aW9uIENzKHQpe3JldHVybiBQcyhmdW5jdGlvbigpe3JldHVybiB0fSkoKX1mdW5jdGlvbiBQcyh0KXt2YXIgbixlLHIsaSxvLGEsdSxmLGMscyxsPTE1MCxoPTQ4MCxkPTI1MCxwPTAsdj0wLGc9MCx5PTAsXz0wLGI9MCxtPW51bGwseD1HZix3PW51bGwsTT1tYyxBPS41O2Z1bmN0aW9uIFQodCl7cmV0dXJuIGYodFswXSpJYSx0WzFdKklhKX1mdW5jdGlvbiBOKHQpe3JldHVybih0PWYuaW52ZXJ0KHRbMF0sdFsxXSkpJiZbdFswXSpGYSx0WzFdKkZhXX1mdW5jdGlvbiBTKCl7dmFyIHQ9a3MobCwwLDAsYikuYXBwbHkobnVsbCxuKHAsdikpLHI9KGI/a3M6ZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHIocixpKXtyZXR1cm5bbit0KnIsZS10KmldfXJldHVybiByLmludmVydD1mdW5jdGlvbihyLGkpe3JldHVyblsoci1uKS90LChlLWkpL3RdfSxyfSkobCxoLXRbMF0sZC10WzFdLGIpO3JldHVybiBlPWtmKGcseSxfKSx1PVNmKG4sciksZj1TZihlLHUpLGE9U3ModSxBKSxFKCl9ZnVuY3Rpb24gRSgpe3JldHVybiBjPXM9bnVsbCxUfXJldHVybiBULnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gYyYmcz09PXQ/YzpjPUVzKGZ1bmN0aW9uKHQpe3JldHVybiBfcyh7cG9pbnQ6ZnVuY3Rpb24obixlKXt2YXIgcj10KG4sZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sclsxXSl9fSl9KGUpKHgoYShNKHM9dCkpKSkpfSxULnByZWNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9dCxtPXZvaWQgMCxFKCkpOnh9LFQucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09dCx3PXI9aT1vPW51bGwsRSgpKTpNfSxULmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD0rdD9WZihtPXQqSWEpOihtPW51bGwsR2YpLEUoKSk6bSpGYX0sVC5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPW51bGw9PXQ/KHc9cj1pPW89bnVsbCxtYyk6WmYodz0rdFswXVswXSxyPSt0WzBdWzFdLGk9K3RbMV1bMF0sbz0rdFsxXVsxXSksRSgpKTpudWxsPT13P251bGw6W1t3LHJdLFtpLG9dXX0sVC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0rdCxTKCkpOmx9LFQudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0WzBdLGQ9K3RbMV0sUygpKTpbaCxkXX0sVC5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9dFswXSUzNjAqSWEsdj10WzFdJTM2MCpJYSxTKCkpOltwKkZhLHYqRmFdfSxULnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz10WzBdJTM2MCpJYSx5PXRbMV0lMzYwKklhLF89dC5sZW5ndGg+Mj90WzJdJTM2MCpJYTowLFMoKSk6W2cqRmEseSpGYSxfKkZhXX0sVC5hbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10JTM2MCpJYSxTKCkpOmIqRmF9LFQucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPVNzKHUsQT10KnQpLEUoKSk6S2EoQSl9LFQuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKFQsdCxuKX0sVC5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKFQsdCxuKX0sVC5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhULHQsbil9LFQuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKFQsdCxuKX0sZnVuY3Rpb24oKXtyZXR1cm4gbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxULmludmVydD1uLmludmVydCYmTixTKCl9fWZ1bmN0aW9uIHpzKHQpe3ZhciBuPTAsZT1xYS8zLHI9UHModCksaT1yKG4sZSk7cmV0dXJuIGkucGFyYWxsZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Iobj10WzBdKklhLGU9dFsxXSpJYSk6W24qRmEsZSpGYV19LGl9ZnVuY3Rpb24gUnModCxuKXt2YXIgZT1RYSh0KSxyPShlK1FhKG4pKS8yO2lmKEhhKHIpPERhKXJldHVybiBmdW5jdGlvbih0KXt2YXIgbj1HYSh0KTtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuW3QqbixRYShlKS9uXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdC9uLGV1KGUqbildfSxlfSh0KTt2YXIgaT0xK2UqKDIqci1lKSxvPUthKGkpL3I7ZnVuY3Rpb24gYSh0LG4pe3ZhciBlPUthKGktMipyKlFhKG4pKS9yO3JldHVybltlKlFhKHQqPXIpLG8tZSpHYSh0KV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uO3JldHVybltYYSh0LEhhKGUpKS9yKkphKGUpLGV1KChpLSh0KnQrZSplKSpyKnIpLygyKnIpKV19LGF9ZnVuY3Rpb24gTHMoKXtyZXR1cm4genMoUnMpLnNjYWxlKDE1NS40MjQpLmNlbnRlcihbMCwzMy42NDQyXSl9ZnVuY3Rpb24gRHMoKXtyZXR1cm4gTHMoKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApLnRyYW5zbGF0ZShbNDgwLDI1MF0pLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKX1mdW5jdGlvbiBVcyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1HYShuKSxpPUdhKGUpLG89dChyKmkpO3JldHVybltvKmkqUWEobiksbypRYShlKV19fWZ1bmN0aW9uIHFzKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPUthKG4qbitlKmUpLGk9dChyKSxvPVFhKGkpLGE9R2EoaSk7cmV0dXJuW1hhKG4qbyxyKmEpLGV1KHImJmUqby9yKV19fXZhciBPcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4gS2EoMi8oMSt0KSl9KTtPcy5pbnZlcnQ9cXMoZnVuY3Rpb24odCl7cmV0dXJuIDIqZXUodC8yKX0pO3ZhciBZcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4odD1udSh0KSkmJnQvUWEodCl9KTtmdW5jdGlvbiBCcyh0LG4pe3JldHVyblt0LFdhKHR1KChPYStuKS8yKSldfWZ1bmN0aW9uIEZzKHQpe3ZhciBuLGUscixpPUNzKHQpLG89aS5jZW50ZXIsYT1pLnNjYWxlLHU9aS50cmFuc2xhdGUsZj1pLmNsaXBFeHRlbnQsYz1udWxsO2Z1bmN0aW9uIHMoKXt2YXIgbz1xYSphKCksdT1pKFJmKGkucm90YXRlKCkpLmludmVydChbMCwwXSkpO3JldHVybiBmKG51bGw9PWM/W1t1WzBdLW8sdVsxXS1vXSxbdVswXStvLHVbMV0rb11dOnQ9PT1Ccz9bW01hdGgubWF4KHVbMF0tbyxjKSxuXSxbTWF0aC5taW4odVswXStvLGUpLHJdXTpbW2MsTWF0aC5tYXgodVsxXS1vLG4pXSxbZSxNYXRoLm1pbih1WzFdK28scildXSl9cmV0dXJuIGkuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEodCkscygpKTphKCl9LGkudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1KHQpLHMoKSk6dSgpfSxpLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obyh0KSxzKCkpOm8oKX0saS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2M9bj1lPXI9bnVsbDooYz0rdFswXVswXSxuPSt0WzBdWzFdLGU9K3RbMV1bMF0scj0rdFsxXVsxXSkscygpKTpudWxsPT1jP251bGw6W1tjLG5dLFtlLHJdXX0scygpfWZ1bmN0aW9uIElzKHQpe3JldHVybiB0dSgoT2ErdCkvMil9ZnVuY3Rpb24gSHModCxuKXt2YXIgZT1HYSh0KSxyPXQ9PT1uP1FhKHQpOldhKGUvR2EobikpL1dhKElzKG4pL0lzKHQpKSxpPWUqWmEoSXModCkscikvcjtpZighcilyZXR1cm4gQnM7ZnVuY3Rpb24gbyh0LG4pe2k+MD9uPC1PYStEYSYmKG49LU9hK0RhKTpuPk9hLURhJiYobj1PYS1EYSk7dmFyIGU9aS9aYShJcyhuKSxyKTtyZXR1cm5bZSpRYShyKnQpLGktZSpHYShyKnQpXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW4sbz1KYShyKSpLYSh0KnQrZSplKTtyZXR1cm5bWGEodCxIYShlKSkvcipKYShlKSwyKmphKFphKGkvbywxL3IpKS1PYV19LG99ZnVuY3Rpb24ganModCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBYcyh0LG4pe3ZhciBlPUdhKHQpLHI9dD09PW4/UWEodCk6KGUtR2EobikpLyhuLXQpLGk9ZS9yK3Q7aWYoSGEocik8RGEpcmV0dXJuIGpzO2Z1bmN0aW9uIG8odCxuKXt2YXIgZT1pLW4sbz1yKnQ7cmV0dXJuW2UqUWEobyksaS1lKkdhKG8pXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW47cmV0dXJuW1hhKHQsSGEoZSkpL3IqSmEoZSksaS1KYShyKSpLYSh0KnQrZSplKV19LG99WXMuaW52ZXJ0PXFzKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksQnMuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QsMipqYSgkYShuKSktT2FdfSxqcy5pbnZlcnQ9anM7dmFyIEdzPTEuMzQwMjY0LFZzPS0uMDgxMTA2LCRzPTg5M2UtNixXcz0uMDAzNzk2LFpzPUthKDMpLzI7ZnVuY3Rpb24gUXModCxuKXt2YXIgZT1ldShacypRYShuKSkscj1lKmUsaT1yKnIqcjtyZXR1cm5bdCpHYShlKS8oWnMqKEdzKzMqVnMqcitpKig3KiRzKzkqV3MqcikpKSxlKihHcytWcypyK2kqKCRzK1dzKnIpKV19ZnVuY3Rpb24gSnModCxuKXt2YXIgZT1HYShuKSxyPUdhKHQpKmU7cmV0dXJuW2UqUWEodCkvcixRYShuKS9yXX1mdW5jdGlvbiBLcyh0LG4sZSxyKXtyZXR1cm4gMT09PXQmJjE9PT1uJiYwPT09ZSYmMD09PXI/bWM6X3Moe3BvaW50OmZ1bmN0aW9uKGksbyl7dGhpcy5zdHJlYW0ucG9pbnQoaSp0K2UsbypuK3IpfX0pfWZ1bmN0aW9uIHRsKHQsbil7dmFyIGU9bipuLHI9ZSplO3JldHVyblt0KiguODcwNy0uMTMxOTc5KmUrcioociooLjAwMzk3MSplLS4wMDE1MjkqciktLjAxMzc5MSkpLG4qKDEuMDA3MjI2K2UqKC4wMTUwODUrciooLjAyODg3NCplLS4wNDQ0NzUtLjAwNTkxNipyKSkpXX1mdW5jdGlvbiBubCh0LG4pe3JldHVybltHYShuKSpRYSh0KSxRYShuKV19ZnVuY3Rpb24gZWwodCxuKXt2YXIgZT1HYShuKSxyPTErR2EodCkqZTtyZXR1cm5bZSpRYSh0KS9yLFFhKG4pL3JdfWZ1bmN0aW9uIHJsKHQsbil7cmV0dXJuW1dhKHR1KChPYStuKS8yKSksLXRdfWZ1bmN0aW9uIGlsKHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIG9sKHQsbil7cmV0dXJuIHQrbi54fWZ1bmN0aW9uIGFsKHQsbil7cmV0dXJuIE1hdGgubWF4KHQsbi55KX1mdW5jdGlvbiB1bCh0KXt2YXIgbj0wLGU9dC5jaGlsZHJlbixyPWUmJmUubGVuZ3RoO2lmKHIpZm9yKDstLXI+PTA7KW4rPWVbcl0udmFsdWU7ZWxzZSBuPTE7dC52YWx1ZT1ufWZ1bmN0aW9uIGZsKHQsbil7dmFyIGUscixpLG8sYSx1PW5ldyBobCh0KSxmPSt0LnZhbHVlJiYodS52YWx1ZT10LnZhbHVlKSxjPVt1XTtmb3IobnVsbD09biYmKG49Y2wpO2U9Yy5wb3AoKTspaWYoZiYmKGUudmFsdWU9K2UuZGF0YS52YWx1ZSksKGk9bihlLmRhdGEpKSYmKGE9aS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheShhKSxvPWEtMTtvPj0wOy0tbyljLnB1c2gocj1lLmNoaWxkcmVuW29dPW5ldyBobChpW29dKSksci5wYXJlbnQ9ZSxyLmRlcHRoPWUuZGVwdGgrMTtyZXR1cm4gdS5lYWNoQmVmb3JlKGxsKX1mdW5jdGlvbiBjbCh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBzbCh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gbGwodCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiBobCh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1Rcy5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscj1uLGk9cipyLG89aSppKmksYT0wO2E8MTImJihvPShpPShyLT1lPShyKihHcytWcyppK28qKCRzK1dzKmkpKS1uKS8oR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkpKnIpKmkqaSwhKEhhKGUpPFVhKSk7KythKTtyZXR1cm5bWnMqdCooR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkvR2EociksZXUoUWEocikvWnMpXX0sSnMuaW52ZXJ0PXFzKGphKSx0bC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPW4saT0yNTtkb3t2YXIgbz1yKnIsYT1vKm87ci09ZT0ociooMS4wMDcyMjYrbyooLjAxNTA4NSthKiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KmEpKSktbikvKDEuMDA3MjI2K28qKC4wNDUyNTUrYSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSphKSkpfXdoaWxlKEhhKGUpPkRhJiYtLWk+MCk7cmV0dXJuW3QvKC44NzA3KyhvPXIqcikqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLHJdfSxubC5pbnZlcnQ9cXMoZXUpLGVsLmludmVydD1xcyhmdW5jdGlvbih0KXtyZXR1cm4gMipqYSh0KX0pLHJsLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblstbiwyKmphKCRhKHQpKS1PYV19LGhsLnByb3RvdHlwZT1mbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmhsLGNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKHVsKX0sZWFjaDpmdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsYT1bb107ZG97Zm9yKG49YS5yZXZlcnNlKCksYT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKWEucHVzaChlW3JdKX13aGlsZShhLmxlbmd0aCk7cmV0dXJuIHRoaXN9LGVhY2hBZnRlcjpmdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSxhPVtdO2k9by5wb3AoKTspaWYoYS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPWEucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LGVhY2hCZWZvcmU6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj10aGlzLGk9W3JdO3I9aS5wb3AoKTspaWYodChyKSxuPXIuY2hpbGRyZW4pZm9yKGU9bi5sZW5ndGgtMTtlPj0wOy0tZSlpLnB1c2gobltlXSk7cmV0dXJuIHRoaXN9LHN1bTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obil7Zm9yKHZhciBlPSt0KG4uZGF0YSl8fDAscj1uLmNoaWxkcmVuLGk9ciYmci5sZW5ndGg7LS1pPj0wOyllKz1yW2ldLnZhbHVlO24udmFsdWU9ZX0pfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LHBhdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMsZT1mdW5jdGlvbih0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9KG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3QucHVzaChuKX0pLHR9LGxlYXZlczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gZmwodGhpcykuZWFjaEJlZm9yZShzbCl9fTt2YXIgZGw9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIHBsKHQpe2Zvcih2YXIgbixlLHI9MCxpPSh0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dC5sZW5ndGg7cjspZT1NYXRoLnJhbmRvbSgpKnItLXwwLG49dFtyXSx0W3JdPXRbZV0sdFtlXT1uO3JldHVybiB0fShkbC5jYWxsKHQpKSkubGVuZ3RoLG89W107cjxpOyluPXRbcl0sZSYmeWwoZSxuKT8rK3I6KGU9Ymwobz12bChvLG4pKSxyPTApO3JldHVybiBlfWZ1bmN0aW9uIHZsKHQsbil7dmFyIGUscjtpZihfbChuLHQpKXJldHVybltuXTtmb3IoZT0wO2U8dC5sZW5ndGg7KytlKWlmKGdsKG4sdFtlXSkmJl9sKG1sKHRbZV0sbiksdCkpcmV0dXJuW3RbZV0sbl07Zm9yKGU9MDtlPHQubGVuZ3RoLTE7KytlKWZvcihyPWUrMTtyPHQubGVuZ3RoOysrcilpZihnbChtbCh0W2VdLHRbcl0pLG4pJiZnbChtbCh0W2VdLG4pLHRbcl0pJiZnbChtbCh0W3JdLG4pLHRbZV0pJiZfbCh4bCh0W2VdLHRbcl0sbiksdCkpcmV0dXJuW3RbZV0sdFtyXSxuXTt0aHJvdyBuZXcgRXJyb3J9ZnVuY3Rpb24gZ2wodCxuKXt2YXIgZT10LnItbi5yLHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU8MHx8ZSplPHIqcitpKml9ZnVuY3Rpb24geWwodCxuKXt2YXIgZT10LnItbi5yKzFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBfbCh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCF5bCh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGJsKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybnt4OihuPXRbMF0pLngseTpuLnkscjpuLnJ9O2Nhc2UgMjpyZXR1cm4gbWwodFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIHhsKHRbMF0sdFsxXSx0WzJdKX12YXIgbn1mdW5jdGlvbiBtbCh0LG4pe3ZhciBlPXQueCxyPXQueSxpPXQucixvPW4ueCxhPW4ueSx1PW4ucixmPW8tZSxjPWEtcixzPXUtaSxsPU1hdGguc3FydChmKmYrYypjKTtyZXR1cm57eDooZStvK2YvbCpzKS8yLHk6KHIrYStjL2wqcykvMixyOihsK2krdSkvMn19ZnVuY3Rpb24geGwodCxuLGUpe3ZhciByPXQueCxpPXQueSxvPXQucixhPW4ueCx1PW4ueSxmPW4ucixjPWUueCxzPWUueSxsPWUucixoPXItYSxkPXItYyxwPWktdSx2PWktcyxnPWYtbyx5PWwtbyxfPXIqcitpKmktbypvLGI9Xy1hKmEtdSp1K2YqZixtPV8tYypjLXMqcytsKmwseD1kKnAtaCp2LHc9KHAqbS12KmIpLygyKngpLXIsTT0odipnLXAqeSkveCxBPShkKmItaCptKS8oMip4KS1pLFQ9KGgqeS1kKmcpL3gsTj1NKk0rVCpULTEsUz0yKihvK3cqTStBKlQpLEU9dyp3K0EqQS1vKm8saz0tKE4/KFMrTWF0aC5zcXJ0KFMqUy00Kk4qRSkpLygyKk4pOkUvUyk7cmV0dXJue3g6cit3K00qayx5OmkrQStUKmsscjprfX1mdW5jdGlvbiB3bCh0LG4sZSl7dmFyIHIsaSxvLGEsdT10Lngtbi54LGY9dC55LW4ueSxjPXUqdStmKmY7Yz8oaT1uLnIrZS5yLGkqPWksYT10LnIrZS5yLGk+KGEqPWEpPyhyPShjK2EtaSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxhL2MtcipyKSksZS54PXQueC1yKnUtbypmLGUueT10LnktcipmK28qdSk6KHI9KGMraS1hKS8oMipjKSxvPU1hdGguc3FydChNYXRoLm1heCgwLGkvYy1yKnIpKSxlLng9bi54K3IqdS1vKmYsZS55PW4ueStyKmYrbyp1KSk6KGUueD1uLngrZS5yLGUueT1uLnkpfWZ1bmN0aW9uIE1sKHQsbil7dmFyIGU9dC5yK24uci0xZS02LHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU+MCYmZSplPnIqcitpKml9ZnVuY3Rpb24gQWwodCl7dmFyIG49dC5fLGU9dC5uZXh0Ll8scj1uLnIrZS5yLGk9KG4ueCplLnIrZS54Km4ucikvcixvPShuLnkqZS5yK2UueSpuLnIpL3I7cmV0dXJuIGkqaStvKm99ZnVuY3Rpb24gVGwodCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIE5sKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIG4sZSxyLGksbyxhLHUsZixjLHMsbDtpZigobj10WzBdKS54PTAsbi55PTAsIShpPjEpKXJldHVybiBuLnI7aWYoZT10WzFdLG4ueD0tZS5yLGUueD1uLnIsZS55PTAsIShpPjIpKXJldHVybiBuLnIrZS5yO3dsKGUsbixyPXRbMl0pLG49bmV3IFRsKG4pLGU9bmV3IFRsKGUpLHI9bmV3IFRsKHIpLG4ubmV4dD1yLnByZXZpb3VzPWUsZS5uZXh0PW4ucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1uO3Q6Zm9yKHU9Mzt1PGk7Kyt1KXt3bChuLl8sZS5fLHI9dFt1XSkscj1uZXcgVGwociksZj1lLm5leHQsYz1uLnByZXZpb3VzLHM9ZS5fLnIsbD1uLl8ucjtkb3tpZihzPD1sKXtpZihNbChmLl8sci5fKSl7ZT1mLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLXU7Y29udGludWUgdH1zKz1mLl8ucixmPWYubmV4dH1lbHNle2lmKE1sKGMuXyxyLl8pKXsobj1jKS5uZXh0PWUsZS5wcmV2aW91cz1uLC0tdTtjb250aW51ZSB0fWwrPWMuXy5yLGM9Yy5wcmV2aW91c319d2hpbGUoZiE9PWMubmV4dCk7Zm9yKHIucHJldmlvdXM9bixyLm5leHQ9ZSxuLm5leHQ9ZS5wcmV2aW91cz1lPXIsbz1BbChuKTsocj1yLm5leHQpIT09ZTspKGE9QWwocikpPG8mJihuPXIsbz1hKTtlPW4ubmV4dH1mb3Iobj1bZS5fXSxyPWU7KHI9ci5uZXh0KSE9PWU7KW4ucHVzaChyLl8pO2ZvcihyPXBsKG4pLHU9MDt1PGk7Kyt1KShuPXRbdV0pLngtPXIueCxuLnktPXIueTtyZXR1cm4gci5yfWZ1bmN0aW9uIFNsKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBFbCgpe3JldHVybiAwfWZ1bmN0aW9uIGtsKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBDbCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIFBsKHQpe3JldHVybiBmdW5jdGlvbihuKXtuLmNoaWxkcmVufHwobi5yPU1hdGgubWF4KDAsK3Qobil8fDApKX19ZnVuY3Rpb24gemwodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYocj1lLmNoaWxkcmVuKXt2YXIgcixpLG8sYT1yLmxlbmd0aCx1PXQoZSkqbnx8MDtpZih1KWZvcihpPTA7aTxhOysraSlyW2ldLnIrPXU7aWYobz1ObChyKSx1KWZvcihpPTA7aTxhOysraSlyW2ldLnItPXU7ZS5yPW8rdX19fWZ1bmN0aW9uIFJsKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uLnBhcmVudDtuLnIqPXQsZSYmKG4ueD1lLngrdCpuLngsbi55PWUueSt0Km4ueSl9fWZ1bmN0aW9uIExsKHQpe3QueDA9TWF0aC5yb3VuZCh0LngwKSx0LnkwPU1hdGgucm91bmQodC55MCksdC54MT1NYXRoLnJvdW5kKHQueDEpLHQueTE9TWF0aC5yb3VuZCh0LnkxKX1mdW5jdGlvbiBEbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKHItbikvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueTA9ZSxvLnkxPWksby54MD1uLG8ueDE9bis9by52YWx1ZSpjfXZhciBVbD0iJCIscWw9e2RlcHRoOi0xfSxPbD17fTtmdW5jdGlvbiBZbCh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBCbCh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBGbCh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBJbCh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bMF06dC50fWZ1bmN0aW9uIEhsKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/bltuLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gamwodCxuLGUpe3ZhciByPWUvKG4uaS10LmkpO24uYy09cixuLnMrPWUsdC5jKz1yLG4ueis9ZSxuLm0rPWV9ZnVuY3Rpb24gWGwodCxuLGUpe3JldHVybiB0LmEucGFyZW50PT09bi5wYXJlbnQ/dC5hOmV9ZnVuY3Rpb24gR2wodCxuKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9bn1mdW5jdGlvbiBWbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueDA9bixvLngxPXIsby55MD1lLG8ueTE9ZSs9by52YWx1ZSpjfUdsLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGhsLnByb3RvdHlwZSk7dmFyICRsPSgxK01hdGguc3FydCg1KSkvMjtmdW5jdGlvbiBXbCh0LG4sZSxyLGksbyl7Zm9yKHZhciBhLHUsZixjLHMsbCxoLGQscCx2LGcseT1bXSxfPW4uY2hpbGRyZW4sYj0wLG09MCx4PV8ubGVuZ3RoLHc9bi52YWx1ZTtiPHg7KXtmPWktZSxjPW8tcjtkb3tzPV9bbSsrXS52YWx1ZX13aGlsZSghcyYmbTx4KTtmb3IobD1oPXMsZz1zKnMqKHY9TWF0aC5tYXgoYy9mLGYvYykvKHcqdCkpLHA9TWF0aC5tYXgoaC9nLGcvbCk7bTx4OysrbSl7aWYocys9dT1fW21dLnZhbHVlLHU8bCYmKGw9dSksdT5oJiYoaD11KSxnPXMqcyp2LChkPU1hdGgubWF4KGgvZyxnL2wpKT5wKXtzLT11O2JyZWFrfXA9ZH15LnB1c2goYT17dmFsdWU6cyxkaWNlOmY8YyxjaGlsZHJlbjpfLnNsaWNlKGIsbSl9KSxhLmRpY2U/RGwoYSxlLHIsaSx3P3IrPWMqcy93Om8pOlZsKGEsZSxyLHc/ZSs9ZipzL3c6aSxvKSx3LT1zLGI9bX1yZXR1cm4geX12YXIgWmw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7V2wobix0LGUscixpLG8pfXJldHVybiBlLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiB0KChuPStuKT4xP246MSl9LGV9KCRsKTt2YXIgUWw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7aWYoKGE9dC5fc3F1YXJpZnkpJiZhLnJhdGlvPT09bilmb3IodmFyIGEsdSxmLGMscyxsPS0xLGg9YS5sZW5ndGgsZD10LnZhbHVlOysrbDxoOyl7Zm9yKGY9KHU9YVtsXSkuY2hpbGRyZW4sYz11LnZhbHVlPTAscz1mLmxlbmd0aDtjPHM7KytjKXUudmFsdWUrPWZbY10udmFsdWU7dS5kaWNlP0RsKHUsZSxyLGkscis9KG8tcikqdS52YWx1ZS9kKTpWbCh1LGUscixlKz0oaS1lKSp1LnZhbHVlL2QsbyksZC09dS52YWx1ZX1lbHNlIHQuX3NxdWFyaWZ5PWE9V2wobix0LGUscixpLG8pLGEucmF0aW89bn1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfSgkbCk7ZnVuY3Rpb24gSmwodCxuKXtyZXR1cm4gdFswXS1uWzBdfHx0WzFdLW5bMV19ZnVuY3Rpb24gS2wodCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89WzAsMV0sYT0yLHU9Mjt1PGk7Kyt1KXtmb3IoO2E+MSYmKG49dFtvW2EtMl1dLGU9dFtvW2EtMV1dLHI9dFt1XSwoZVswXS1uWzBdKSooclsxXS1uWzFdKS0oZVsxXS1uWzFdKSooclswXS1uWzBdKTw9MCk7KS0tYTtvW2ErK109dX1yZXR1cm4gby5zbGljZSgwLGEpfWZ1bmN0aW9uIHRoKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9dmFyIG5oPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiB0PW51bGw9PXQ/MDordCxlPW51bGw9PWU/MTorZSwxPT09YXJndW1lbnRzLmxlbmd0aD8oZT10LHQ9MCk6ZS09dCxmdW5jdGlvbigpe3JldHVybiBuKCkqZSt0fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksZWg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7dmFyIHIsaTtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1yKW89cixyPW51bGw7ZWxzZSBkb3tyPTIqbigpLTEsbz0yKm4oKS0xLGk9cipyK28qb313aGlsZSghaXx8aT4xKTtyZXR1cm4gdCtlKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKGkpL2kpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCkscmg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKCl7dmFyIHQ9ZWguc291cmNlKG4pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGloPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPTA7cjx0OysrcillKz1uKCk7cmV0dXJuIGV9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxvaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7dmFyIGU9aWguc291cmNlKG4pKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKCkvdH19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGFoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1uKCkpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSx1aD1BcnJheS5wcm90b3R5cGUsZmg9dWgubWFwLGNoPXVoLnNsaWNlLHNoPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIGxoKHQpe3ZhciBuPUtpKCksZT1bXSxyPXNoO2Z1bmN0aW9uIGkoaSl7dmFyIG89aSsiIixhPW4uZ2V0KG8pO2lmKCFhKXtpZihyIT09c2gpcmV0dXJuIHI7bi5zZXQobyxhPWUucHVzaChpKSl9cmV0dXJuIHRbKGEtMSkldC5sZW5ndGhdfXJldHVybiB0PW51bGw9PXQ/W106Y2guY2FsbCh0KSxpLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W10sbj1LaSgpO2Zvcih2YXIgcixvLGE9LTEsdT10Lmxlbmd0aDsrK2E8dTspbi5oYXMobz0ocj10W2FdKSsiIil8fG4uc2V0KG8sZS5wdXNoKHIpKTtyZXR1cm4gaX0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1jaC5jYWxsKG4pLGkpOnQuc2xpY2UoKX0saS51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSk6cn0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGxoKCkuZG9tYWluKGUpLnJhbmdlKHQpLnVua25vd24ocil9LGl9ZnVuY3Rpb24gaGgoKXt2YXIgdCxuLGU9bGgoKS51bmtub3duKHZvaWQgMCkscj1lLmRvbWFpbixpPWUucmFuZ2Usbz1bMCwxXSxhPSExLHU9MCxmPTAsYz0uNTtmdW5jdGlvbiBzKCl7dmFyIGU9cigpLmxlbmd0aCxzPW9bMV08b1swXSxsPW9bcy0wXSxoPW9bMS1zXTt0PShoLWwpL01hdGgubWF4KDEsZS11KzIqZiksYSYmKHQ9TWF0aC5mbG9vcih0KSksbCs9KGgtbC10KihlLXUpKSpjLG49dCooMS11KSxhJiYobD1NYXRoLnJvdW5kKGwpLG49TWF0aC5yb3VuZChuKSk7dmFyIGQ9ZyhlKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGwrdCpufSk7cmV0dXJuIGkocz9kLnJldmVyc2UoKTpkKX1yZXR1cm4gZGVsZXRlIGUudW5rbm93bixlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSxzKCkpOnIoKX0sZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1bK3RbMF0sK3RbMV1dLHMoKSk6by5zbGljZSgpfSxlLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG89Wyt0WzBdLCt0WzFdXSxhPSEwLHMoKX0sZS5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gbn0sZS5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGUucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ISF0LHMoKSk6YX0sZS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOnV9LGUucGFkZGluZ0lubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkscygpKTp1fSxlLnBhZGRpbmdPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Zn0sZS5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Y30sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhoKCkuZG9tYWluKHIoKSkucmFuZ2Uobykucm91bmQoYSkucGFkZGluZ0lubmVyKHUpLnBhZGRpbmdPdXRlcihmKS5hbGlnbihjKX0scygpfWZ1bmN0aW9uIGRoKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBwaCh0KXtyZXR1cm4rdH12YXIgdmg9WzAsMV07ZnVuY3Rpb24gZ2godCxuKXtyZXR1cm4obi09dD0rdCk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtdCkvbn06ZGgobil9ZnVuY3Rpb24geWgodCxuLGUscil7dmFyIGk9dFswXSxvPXRbMV0sYT1uWzBdLHU9blsxXTtyZXR1cm4gbzxpPyhpPWUobyxpKSxhPXIodSxhKSk6KGk9ZShpLG8pLGE9cihhLHUpKSxmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19ZnVuY3Rpb24gX2godCxuLGUscil7dmFyIG89TWF0aC5taW4odC5sZW5ndGgsbi5sZW5ndGgpLTEsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksZj0tMTtmb3IodFtvXTx0WzBdJiYodD10LnNsaWNlKCkucmV2ZXJzZSgpLG49bi5zbGljZSgpLnJldmVyc2UoKSk7KytmPG87KWFbZl09ZSh0W2ZdLHRbZisxXSksdVtmXT1yKG5bZl0sbltmKzFdKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9aSh0LG4sMSxvKS0xO3JldHVybiB1W2VdKGFbZV0obikpfX1mdW5jdGlvbiBiaCh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKX1mdW5jdGlvbiBtaCh0LG4pe3ZhciBlLHIsaSxvPXZoLGE9dmgsdT1tZSxmPSExO2Z1bmN0aW9uIGMoKXtyZXR1cm4gZT1NYXRoLm1pbihvLmxlbmd0aCxhLmxlbmd0aCk+Mj9faDp5aCxyPWk9bnVsbCxzfWZ1bmN0aW9uIHMobil7cmV0dXJuKHJ8fChyPWUobyxhLGY/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuPStuLGU9K2UpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDw9bj8wOnQ+PWU/MTpyKHQpfX19KHQpOnQsdSkpKSgrbil9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybihpfHwoaT1lKGEsbyxnaCxmP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/bjp0Pj0xP2U6cih0KX19fShuKTpuKSkpKCt0KX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZmguY2FsbCh0LHBoKSxjKCkpOm8uc2xpY2UoKX0scy5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1jaC5jYWxsKHQpLGMoKSk6YS5zbGljZSgpfSxzLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGE9Y2guY2FsbCh0KSx1PXhlLGMoKX0scy5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXQsYygpKTpmfSxzLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsYygpKTp1fSxjKCl9ZnVuY3Rpb24geGgobil7dmFyIGU9bi5kb21haW47cmV0dXJuIG4udGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiBtKG5bMF0sbltuLmxlbmd0aC0xXSxudWxsPT10PzEwOnQpfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gZnVuY3Rpb24obixlLHIpe3ZhciBpLG89blswXSxhPW5bbi5sZW5ndGgtMV0sdT13KG8sYSxudWxsPT1lPzEwOmUpO3N3aXRjaCgocj1iYShudWxsPT1yPyIsZiI6cikpLnR5cGUpe2Nhc2UicyI6dmFyIGY9TWF0aC5tYXgoTWF0aC5hYnMobyksTWF0aC5hYnMoYSkpO3JldHVybiBudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1rYSh1LGYpKXx8KHIucHJlY2lzaW9uPWkpLHQuZm9ybWF0UHJlZml4KHIsZik7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9Q2EodSxNYXRoLm1heChNYXRoLmFicyhvKSxNYXRoLmFicyhhKSkpKXx8KHIucHJlY2lzaW9uPWktKCJlIj09PXIudHlwZSkpO2JyZWFrO2Nhc2UiZiI6Y2FzZSIlIjpudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1FYSh1KSl8fChyLnByZWNpc2lvbj1pLTIqKCIlIj09PXIudHlwZSkpfXJldHVybiB0LmZvcm1hdChyKX0oZSgpLG4scil9LG4ubmljZT1mdW5jdGlvbih0KXtudWxsPT10JiYodD0xMCk7dmFyIHIsaT1lKCksbz0wLGE9aS5sZW5ndGgtMSx1PWlbb10sZj1pW2FdO3JldHVybiBmPHUmJihyPXUsdT1mLGY9cixyPW8sbz1hLGE9ciksKHI9eCh1LGYsdCkpPjA/cj14KHU9TWF0aC5mbG9vcih1L3IpKnIsZj1NYXRoLmNlaWwoZi9yKSpyLHQpOnI8MCYmKHI9eCh1PU1hdGguY2VpbCh1KnIpL3IsZj1NYXRoLmZsb29yKGYqcikvcix0KSkscj4wPyhpW29dPU1hdGguZmxvb3IodS9yKSpyLGlbYV09TWF0aC5jZWlsKGYvcikqcixlKGkpKTpyPDAmJihpW29dPU1hdGguY2VpbCh1KnIpL3IsaVthXT1NYXRoLmZsb29yKGYqcikvcixlKGkpKSxufSxufWZ1bmN0aW9uIHdoKHQsbil7dmFyIGUscj0wLGk9KHQ9dC5zbGljZSgpKS5sZW5ndGgtMSxvPXRbcl0sYT10W2ldO3JldHVybiBhPG8mJihlPXIscj1pLGk9ZSxlPW8sbz1hLGE9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKGEpLHR9ZnVuY3Rpb24gTWgodCxuKXtyZXR1cm4obj1NYXRoLmxvZyhuL3QpKT9mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5sb2coZS90KS9ufTpkaChuKX1mdW5jdGlvbiBBaCh0LG4pe3JldHVybiB0PDA/ZnVuY3Rpb24oZSl7cmV0dXJuLU1hdGgucG93KC1uLGUpKk1hdGgucG93KC10LDEtZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnBvdyhuLGUpKk1hdGgucG93KHQsMS1lKX19ZnVuY3Rpb24gVGgodCl7cmV0dXJuIGlzRmluaXRlKHQpPysoIjFlIit0KTp0PDA/MDp0fWZ1bmN0aW9uIE5oKHQpe3JldHVybiAxMD09PXQ/VGg6dD09PU1hdGguRT9NYXRoLmV4cDpmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gU2godCl7cmV0dXJuIHQ9PT1NYXRoLkU/TWF0aC5sb2c6MTA9PT10JiZNYXRoLmxvZzEwfHwyPT09dCYmTWF0aC5sb2cyfHwodD1NYXRoLmxvZyh0KSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5sb2cobikvdH0pfWZ1bmN0aW9uIEVoKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4tdCgtbil9fWZ1bmN0aW9uIGtoKHQsbil7cmV0dXJuIHQ8MD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX1mdW5jdGlvbiBDaCgpe3ZhciB0PTEsbj1taChmdW5jdGlvbihuLGUpe3JldHVybihlPWtoKGUsdCktKG49a2gobix0KSkpP2Z1bmN0aW9uKHIpe3JldHVybihraChyLHQpLW4pL2V9OmRoKGUpfSxmdW5jdGlvbihuLGUpe3JldHVybiBlPWtoKGUsdCktKG49a2gobix0KSksZnVuY3Rpb24ocil7cmV0dXJuIGtoKG4rZSpyLDEvdCl9fSksZT1uLmRvbWFpbjtyZXR1cm4gbi5leHBvbmVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixlKGUoKSkpOnR9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBiaChuLENoKCkuZXhwb25lbnQodCkpfSx4aChuKX12YXIgUGg9bmV3IERhdGUsemg9bmV3IERhdGU7ZnVuY3Rpb24gUmgodCxuLGUscil7ZnVuY3Rpb24gaShuKXtyZXR1cm4gdChuPW5ldyBEYXRlKCtuKSksbn1yZXR1cm4gaS5mbG9vcj1pLGkuY2VpbD1mdW5jdGlvbihlKXtyZXR1cm4gdChlPW5ldyBEYXRlKGUtMSkpLG4oZSwxKSx0KGUpLGV9LGkucm91bmQ9ZnVuY3Rpb24odCl7dmFyIG49aSh0KSxlPWkuY2VpbCh0KTtyZXR1cm4gdC1uPGUtdD9uOmV9LGkub2Zmc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odD1uZXcgRGF0ZSgrdCksbnVsbD09ZT8xOk1hdGguZmxvb3IoZSkpLHR9LGkucmFuZ2U9ZnVuY3Rpb24oZSxyLG8pe3ZhciBhLHU9W107aWYoZT1pLmNlaWwoZSksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKGU8ciYmbz4wKSlyZXR1cm4gdTtkb3t1LnB1c2goYT1uZXcgRGF0ZSgrZSkpLG4oZSxvKSx0KGUpfXdoaWxlKGE8ZSYmZTxyKTtyZXR1cm4gdX0saS5maWx0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIFJoKGZ1bmN0aW9uKG4pe2lmKG4+PW4pZm9yKDt0KG4pLCFlKG4pOyluLnNldFRpbWUobi0xKX0sZnVuY3Rpb24odCxyKXtpZih0Pj10KWlmKHI8MClmb3IoOysrcjw9MDspZm9yKDtuKHQsLTEpLCFlKHQpOyk7ZWxzZSBmb3IoOy0tcj49MDspZm9yKDtuKHQsMSksIWUodCk7KTt9KX0sZSYmKGkuY291bnQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gUGguc2V0VGltZSgrbiksemguc2V0VGltZSgrciksdChQaCksdCh6aCksTWF0aC5mbG9vcihlKFBoLHpoKSl9LGkuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9pLmZpbHRlcihyP2Z1bmN0aW9uKG4pe3JldHVybiByKG4pJXQ9PTB9OmZ1bmN0aW9uKG4pe3JldHVybiBpLmNvdW50KDAsbikldD09MH0pOmk6bnVsbH0pLGl9dmFyIExoPVJoKGZ1bmN0aW9uKCl7fSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi10fSk7TGguZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9SaChmdW5jdGlvbihuKXtuLnNldFRpbWUoTWF0aC5mbG9vcihuL3QpKnQpfSxmdW5jdGlvbihuLGUpe24uc2V0VGltZSgrbitlKnQpfSxmdW5jdGlvbihuLGUpe3JldHVybihlLW4pL3R9KTpMaDpudWxsfTt2YXIgRGg9TGgucmFuZ2UsVWg9NmU0LHFoPTYwNDhlNSxPaD1SaChmdW5jdGlvbih0KXt0LnNldFRpbWUoMWUzKk1hdGguZmxvb3IodC8xZTMpKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrMWUzKm4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzFlM30sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDU2Vjb25kcygpfSksWWg9T2gucmFuZ2UsQmg9UmgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKE1hdGguZmxvb3IodC9VaCkqVWgpfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKlVoKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9VaH0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSksRmg9QmgucmFuZ2UsSWg9UmgoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpKlVoJTM2ZTU7bjwwJiYobis9MzZlNSksdC5zZXRUaW1lKDM2ZTUqTWF0aC5mbG9vcigoK3QtbikvMzZlNSkrbil9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pLEhoPUloLnJhbmdlLGpoPVJoKGZ1bmN0aW9uKHQpe3Quc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQtKG4uZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKlVoKS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSxYaD1qaC5yYW5nZTtmdW5jdGlvbiBHaCh0KXtyZXR1cm4gUmgoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpVaCkvcWh9KX12YXIgVmg9R2goMCksJGg9R2goMSksV2g9R2goMiksWmg9R2goMyksUWg9R2goNCksSmg9R2goNSksS2g9R2goNiksdGQ9VmgucmFuZ2UsbmQ9JGgucmFuZ2UsZWQ9V2gucmFuZ2UscmQ9WmgucmFuZ2UsaWQ9UWgucmFuZ2Usb2Q9SmgucmFuZ2UsYWQ9S2gucmFuZ2UsdWQ9UmgoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksZmQ9dWQucmFuZ2UsY2Q9UmgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KTtjZC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1JoKGZ1bmN0aW9uKG4pe24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBzZD1jZC5yYW5nZSxsZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipVaCl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVWh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pLGhkPWxkLnJhbmdlLGRkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTWludXRlcygwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pLHBkPWRkLnJhbmdlLHZkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzg2NGU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pLGdkPXZkLnJhbmdlO2Z1bmN0aW9uIHlkKHQpe3JldHVybiBSaChmdW5jdGlvbihuKXtuLnNldFVUQ0RhdGUobi5nZXRVVENEYXRlKCktKG4uZ2V0VVRDRGF5KCkrNy10KSU3KSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKSs3Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL3FofSl9dmFyIF9kPXlkKDApLGJkPXlkKDEpLG1kPXlkKDIpLHhkPXlkKDMpLHdkPXlkKDQpLE1kPXlkKDUpLEFkPXlkKDYpLFRkPV9kLnJhbmdlLE5kPWJkLnJhbmdlLFNkPW1kLnJhbmdlLEVkPXhkLnJhbmdlLGtkPXdkLnJhbmdlLENkPU1kLnJhbmdlLFBkPUFkLnJhbmdlLHpkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLFJkPXpkLnJhbmdlLExkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSk7TGQuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9SaChmdW5jdGlvbihuKXtuLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRVVENGdWxsWWVhcigpL3QpKnQpLG4uc2V0VVRDTW9udGgoMCwxKSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgRGQ9TGQucmFuZ2U7ZnVuY3Rpb24gVWQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIG4uc2V0RnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIHFkKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gbi5zZXRVVENGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIE9kKHQpe3JldHVybnt5OnQsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjB9fWZ1bmN0aW9uIFlkKHQpe3ZhciBuPXQuZGF0ZVRpbWUsZT10LmRhdGUscj10LnRpbWUsaT10LnBlcmlvZHMsbz10LmRheXMsYT10LnNob3J0RGF5cyx1PXQubW9udGhzLGY9dC5zaG9ydE1vbnRocyxjPVZkKGkpLHM9JGQoaSksbD1WZChvKSxoPSRkKG8pLGQ9VmQoYSkscD0kZChhKSx2PVZkKHUpLGc9JGQodSkseT1WZChmKSxfPSRkKGYpLGI9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gdVt0LmdldE1vbnRoKCldfSxjOm51bGwsZDpwcCxlOnBwLGY6YnAsSDp2cCxJOmdwLGo6eXAsTDpfcCxtOm1wLE06eHAscDpmdW5jdGlvbih0KXtyZXR1cm4gaVsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpXcCxzOlpwLFM6d3AsdTpNcCxVOkFwLFY6VHAsdzpOcCxXOlNwLHg6bnVsbCxYOm51bGwseTpFcCxZOmtwLFo6Q3AsIiUiOiRwfSxtPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBmW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6UHAsZTpQcCxmOlVwLEg6enAsSTpScCxqOkxwLEw6RHAsbTpxcCxNOk9wLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGlbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LFE6V3AsczpacCxTOllwLHU6QnAsVTpGcCxWOklwLHc6SHAsVzpqcCx4Om51bGwsWDpudWxsLHk6WHAsWTpHcCxaOlZwLCIlIjokcH0seD17YTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9ZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9cFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1sLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1oW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXkuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPV9bclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9di5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09Z1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQSh0LG4sZSxyKX0sZDppcCxlOmlwLGY6c3AsSDphcCxJOmFwLGo6b3AsTDpjcCxtOnJwLE06dXAscDpmdW5jdGlvbih0LG4sZSl7dmFyIHI9Yy5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9c1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxROmhwLHM6ZHAsUzpmcCx1OlpkLFU6UWQsVjpKZCx3OldkLFc6S2QseDpmdW5jdGlvbih0LG4scil7cmV0dXJuIEEodCxlLG4scil9LFg6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBBKHQscixuLGUpfSx5Om5wLFk6dHAsWjplcCwiJSI6bHB9O2Z1bmN0aW9uIHcodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvLGE9W10sdT0tMSxmPTAsYz10Lmxlbmd0aDtmb3IoZSBpbnN0YW5jZW9mIERhdGV8fChlPW5ldyBEYXRlKCtlKSk7Kyt1PGM7KTM3PT09dC5jaGFyQ29kZUF0KHUpJiYoYS5wdXNoKHQuc2xpY2UoZix1KSksbnVsbCE9KGk9RmRbcj10LmNoYXJBdCgrK3UpXSk/cj10LmNoYXJBdCgrK3UpOmk9ImUiPT09cj8iICI6IjAiLChvPW5bcl0pJiYocj1vKGUsaSkpLGEucHVzaChyKSxmPXUrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGYsdSkpLGEuam9pbigiIil9fWZ1bmN0aW9uIE0odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvPU9kKDE5MDApO2lmKEEobyx0LGUrPSIiLDApIT1lLmxlbmd0aClyZXR1cm4gbnVsbDtpZigiUSJpbiBvKXJldHVybiBuZXcgRGF0ZShvLlEpO2lmKCJwImluIG8mJihvLkg9by5IJTEyKzEyKm8ucCksIlYiaW4gbyl7aWYoby5WPDF8fG8uVj41MylyZXR1cm4gbnVsbDsidyJpbiBvfHwoby53PTEpLCJaImluIG8/KGk9KHI9cWQoT2Qoby55KSkpLmdldFVUQ0RheSgpLHI9aT40fHwwPT09aT9iZC5jZWlsKHIpOmJkKHIpLHI9dmQub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRVVENGdWxsWWVhcigpLG8ubT1yLmdldFVUQ01vbnRoKCksby5kPXIuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KGk9KHI9bihPZChvLnkpKSkuZ2V0RGF5KCkscj1pPjR8fDA9PT1pPyRoLmNlaWwocik6JGgocikscj1qaC5vZmZzZXQociw3KihvLlYtMSkpLG8ueT1yLmdldEZ1bGxZZWFyKCksby5tPXIuZ2V0TW9udGgoKSxvLmQ9ci5nZXREYXRlKCkrKG8udys2KSU3KX1lbHNlKCJXImluIG98fCJVImluIG8pJiYoInciaW4gb3x8KG8udz0idSJpbiBvP28udSU3OiJXImluIG8/MTowKSxpPSJaImluIG8/cWQoT2Qoby55KSkuZ2V0VVRDRGF5KCk6bihPZChvLnkpKS5nZXREYXkoKSxvLm09MCxvLmQ9IlciaW4gbz8oby53KzYpJTcrNypvLlctKGkrNSklNzpvLncrNypvLlUtKGkrNiklNyk7cmV0dXJuIloiaW4gbz8oby5IKz1vLlovMTAwfDAsby5NKz1vLlolMTAwLHFkKG8pKTpuKG8pfX1mdW5jdGlvbiBBKHQsbixlLHIpe2Zvcih2YXIgaSxvLGE9MCx1PW4ubGVuZ3RoLGY9ZS5sZW5ndGg7YTx1Oyl7aWYocj49ZilyZXR1cm4tMTtpZigzNz09PShpPW4uY2hhckNvZGVBdChhKyspKSl7aWYoaT1uLmNoYXJBdChhKyspLCEobz14W2kgaW4gRmQ/bi5jaGFyQXQoYSsrKTppXSl8fChyPW8odCxlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9cmV0dXJuIGIueD13KGUsYiksYi5YPXcocixiKSxiLmM9dyhuLGIpLG0ueD13KGUsbSksbS5YPXcocixtKSxtLmM9dyhuLG0pLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixiKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQrPSIiLFVkKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixtKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQscWQpO3JldHVybiBuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG59fX12YXIgQmQsRmQ9eyItIjoiIixfOiIgIiwwOiIwIn0sSWQ9L15ccypcZCsvLEhkPS9eJS8samQ9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIFhkKHQsbixlKXt2YXIgcj10PDA/Ii0iOiIiLGk9KHI/LXQ6dCkrIiIsbz1pLmxlbmd0aDtyZXR1cm4gcisobzxlP25ldyBBcnJheShlLW8rMSkuam9pbihuKStpOmkpfWZ1bmN0aW9uIEdkKHQpe3JldHVybiB0LnJlcGxhY2UoamQsIlxcJCYiKX1mdW5jdGlvbiBWZCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoR2QpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiAkZCh0KXtmb3IodmFyIG49e30sZT0tMSxyPXQubGVuZ3RoOysrZTxyOyluW3RbZV0udG9Mb3dlckNhc2UoKV09ZTtyZXR1cm4gbn1mdW5jdGlvbiBXZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBaZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBLZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0cCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KHQueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBucCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQueT0rclswXSsoK3JbMF0+Njg/MTkwMDoyZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVwKHQsbixlKXt2YXIgcj0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuWj1yWzFdPzA6LShyWzJdKyhyWzNdfHwiMDAiKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcnAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGlwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9wKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5tPTAsdC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGZwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5MPU1hdGguZmxvb3IoclswXS8xZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxwKHQsbixlKXt2YXIgcj1IZC5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGhwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlE9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZHAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuUT0xZTMqK3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcHAodCxuKXtyZXR1cm4gWGQodC5nZXREYXRlKCksbiwyKX1mdW5jdGlvbiB2cCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCksbiwyKX1mdW5jdGlvbiBncCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24geXAodCxuKXtyZXR1cm4gWGQoMStqaC5jb3VudChjZCh0KSx0KSxuLDMpfWZ1bmN0aW9uIF9wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBicCh0LG4pe3JldHVybiBfcCh0LG4pKyIwMDAifWZ1bmN0aW9uIG1wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TW9udGgoKSsxLG4sMil9ZnVuY3Rpb24geHAodCxuKXtyZXR1cm4gWGQodC5nZXRNaW51dGVzKCksbiwyKX1mdW5jdGlvbiB3cCh0LG4pe3JldHVybiBYZCh0LmdldFNlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIE1wKHQpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBBcCh0LG4pe3JldHVybiBYZChWaC5jb3VudChjZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFRwKHQsbil7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gdD1lPj00fHwwPT09ZT9RaCh0KTpRaC5jZWlsKHQpLFhkKFFoLmNvdW50KGNkKHQpLHQpKyg0PT09Y2QodCkuZ2V0RGF5KCkpLG4sMil9ZnVuY3Rpb24gTnAodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gU3AodCxuKXtyZXR1cm4gWGQoJGguY291bnQoY2QodCksdCksbiwyKX1mdW5jdGlvbiBFcCh0LG4pe3JldHVybiBYZCh0LmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24ga3AodCxuKXtyZXR1cm4gWGQodC5nZXRGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIENwKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4obj4wPyItIjoobio9LTEsIisiKSkrWGQobi82MHwwLCIwIiwyKStYZChuJTYwLCIwIiwyKX1mdW5jdGlvbiBQcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0RhdGUoKSxuLDIpfWZ1bmN0aW9uIHpwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSxuLDIpfWZ1bmN0aW9uIFJwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBMcCh0LG4pe3JldHVybiBYZCgxK3ZkLmNvdW50KExkKHQpLHQpLG4sMyl9ZnVuY3Rpb24gRHAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIFVwKHQsbil7cmV0dXJuIERwKHQsbikrIjAwMCJ9ZnVuY3Rpb24gcXAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBPcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ01pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIFlwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDU2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gQnAodCl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gMD09PW4/NzpufWZ1bmN0aW9uIEZwKHQsbil7cmV0dXJuIFhkKF9kLmNvdW50KExkKHQpLHQpLG4sMil9ZnVuY3Rpb24gSXAodCxuKXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiB0PWU+PTR8fDA9PT1lP3dkKHQpOndkLmNlaWwodCksWGQod2QuY291bnQoTGQodCksdCkrKDQ9PT1MZCh0KS5nZXRVVENEYXkoKSksbiwyKX1mdW5jdGlvbiBIcCh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiBqcCh0LG4pe3JldHVybiBYZChiZC5jb3VudChMZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFhwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBHcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gVnAoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uICRwKCl7cmV0dXJuIiUifWZ1bmN0aW9uIFdwKHQpe3JldHVybit0fWZ1bmN0aW9uIFpwKHQpe3JldHVybiBNYXRoLmZsb29yKCt0LzFlMyl9ZnVuY3Rpb24gUXAobil7cmV0dXJuIEJkPVlkKG4pLHQudGltZUZvcm1hdD1CZC5mb3JtYXQsdC50aW1lUGFyc2U9QmQucGFyc2UsdC51dGNGb3JtYXQ9QmQudXRjRm9ybWF0LHQudXRjUGFyc2U9QmQudXRjUGFyc2UsQmR9UXAoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgSnA9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX06dC51dGNGb3JtYXQoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpO3ZhciBLcD0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59OnQudXRjUGFyc2UoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpLHR2PTFlMyxudj02MCp0dixldj02MCpudixydj0yNCpldixpdj03KnJ2LG92PTMwKnJ2LGF2PTM2NSpydjtmdW5jdGlvbiB1dih0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gZnYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gY3YodCxuLHIsaSxvLGEsdSxmLGMpe3ZhciBzPW1oKGdoLHZlKSxsPXMuaW52ZXJ0LGg9cy5kb21haW4sZD1jKCIuJUwiKSxwPWMoIjolUyIpLHY9YygiJUk6JU0iKSxnPWMoIiVJICVwIikseT1jKCIlYSAlZCIpLF89YygiJWIgJWQiKSxiPWMoIiVCIiksbT1jKCIlWSIpLHg9W1t1LDEsdHZdLFt1LDUsNSp0dl0sW3UsMTUsMTUqdHZdLFt1LDMwLDMwKnR2XSxbYSwxLG52XSxbYSw1LDUqbnZdLFthLDE1LDE1Km52XSxbYSwzMCwzMCpudl0sW28sMSxldl0sW28sMywzKmV2XSxbbyw2LDYqZXZdLFtvLDEyLDEyKmV2XSxbaSwxLHJ2XSxbaSwyLDIqcnZdLFtyLDEsaXZdLFtuLDEsb3ZdLFtuLDMsMypvdl0sW3QsMSxhdl1dO2Z1bmN0aW9uIE0oZSl7cmV0dXJuKHUoZSk8ZT9kOmEoZSk8ZT9wOm8oZSk8ZT92OmkoZSk8ZT9nOm4oZSk8ZT9yKGUpPGU/eTpfOnQoZSk8ZT9iOm0pKGUpfWZ1bmN0aW9uIEEobixyLGksbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIGE9TWF0aC5hYnMoaS1yKS9uLHU9ZShmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pLnJpZ2h0KHgsYSk7dT09PXgubGVuZ3RoPyhvPXcoci9hdixpL2F2LG4pLG49dCk6dT8obz0odT14W2EveFt1LTFdWzJdPHhbdV1bMl0vYT91LTE6dV0pWzFdLG49dVswXSk6KG89TWF0aC5tYXgodyhyLGksbiksMSksbj1mKX1yZXR1cm4gbnVsbD09bz9uOm4uZXZlcnkobyl9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZShsKHQpKX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChmaC5jYWxsKHQsZnYpKTpoKCkubWFwKHV2KX0scy50aWNrcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9aCgpLGk9clswXSxvPXJbci5sZW5ndGgtMV0sYT1vPGk7cmV0dXJuIGEmJihlPWksaT1vLG89ZSksZT0oZT1BKHQsaSxvLG4pKT9lLnJhbmdlKGksbysxKTpbXSxhP2UucmV2ZXJzZSgpOmV9LHMudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uP006YyhuKX0scy5uaWNlPWZ1bmN0aW9uKHQsbil7dmFyIGU9aCgpO3JldHVybih0PUEodCxlWzBdLGVbZS5sZW5ndGgtMV0sbikpP2god2goZSx0KSk6c30scy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKHMsY3YodCxuLHIsaSxvLGEsdSxmLGMpKX0sc31mdW5jdGlvbiBzdih0KXtmb3IodmFyIG49dC5sZW5ndGgvNnwwLGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KWVbcl09IiMiK3Quc2xpY2UoNipyLDYqKytyKTtyZXR1cm4gZX12YXIgbHY9c3YoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLGh2PXN2KCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKSxkdj1zdigiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2IikscHY9c3YoImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpLHZ2PXN2KCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKSxndj1zdigiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIikseXY9c3YoImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpLF92PXN2KCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKSxidj1zdigiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIik7ZnVuY3Rpb24gbXYodCl7cmV0dXJuIGxlKHRbdC5sZW5ndGgtMV0pfXZhciB4dj1uZXcgQXJyYXkoMykuY29uY2F0KCJkOGIzNjVmNWY1ZjU1YWI0YWMiLCJhNjYxMWFkZmMyN2Q4MGNkYzEwMTg1NzEiLCJhNjYxMWFkZmMyN2RmNWY1ZjU4MGNkYzEwMTg1NzEiLCI4YzUxMGFkOGIzNjVmNmU4YzNjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFkOGIzNjVmNmU4YzNmNWY1ZjVjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiKS5tYXAoc3YpLHd2PW12KHh2KSxNdj1uZXcgQXJyYXkoMykuY29uY2F0KCJhZjhkYzNmN2Y3Zjc3ZmJmN2IiLCI3YjMyOTRjMmE1Y2ZhNmRiYTAwMDg4MzciLCI3YjMyOTRjMmE1Y2ZmN2Y3ZjdhNmRiYTAwMDg4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThmN2Y3ZjdkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiKS5tYXAoc3YpLEF2PW12KE12KSxUdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlOWEzYzlmN2Y3ZjdhMWQ3NmEiLCJkMDFjOGJmMWI2ZGFiOGUxODY0ZGFjMjYiLCJkMDFjOGJmMWI2ZGFmN2Y3ZjdiOGUxODY0ZGFjMjYiLCJjNTFiN2RlOWEzYzlmZGUwZWZlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RlOWEzYzlmZGUwZWZmN2Y3ZjdlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiKS5tYXAoc3YpLE52PW12KFR2KSxTdj1uZXcgQXJyYXkoMykuY29uY2F0KCI5OThlYzNmN2Y3ZjdmMWEzNDAiLCI1ZTNjOTliMmFiZDJmZGI4NjNlNjYxMDEiLCI1ZTNjOTliMmFiZDJmN2Y3ZjdmZGI4NjNlNjYxMDEiLCI1NDI3ODg5OThlYzNkOGRhZWJmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg5OThlYzNkOGRhZWJmN2Y3ZjdmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiKS5tYXAoc3YpLEV2PW12KFN2KSxrdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmN2Y3Zjc2N2E5Y2YiLCJjYTAwMjBmNGE1ODI5MmM1ZGUwNTcxYjAiLCJjYTAwMjBmNGE1ODJmN2Y3Zjc5MmM1ZGUwNTcxYjAiLCJiMjE4MmJlZjhhNjJmZGRiYzdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJlZjhhNjJmZGRiYzdmN2Y3ZjdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiKS5tYXAoc3YpLEN2PW12KGt2KSxQdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmZmZmZmY5OTk5OTkiLCJjYTAwMjBmNGE1ODJiYWJhYmE0MDQwNDAiLCJjYTAwMjBmNGE1ODJmZmZmZmZiYWJhYmE0MDQwNDAiLCJiMjE4MmJlZjhhNjJmZGRiYzdlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJlZjhhNjJmZGRiYzdmZmZmZmZlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiKS5tYXAoc3YpLHp2PW12KFB2KSxSdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWJmZGIiLCJkNzE5MWNmZGFlNjFhYmQ5ZTkyYzdiYjYiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmQ5ZTkyYzdiYjYiLCJkNzMwMjdmYzhkNTlmZWUwOTBlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmYzhkNTlmZWUwOTBmZmZmYmZlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiKS5tYXAoc3YpLEx2PW12KFJ2KSxEdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWNmNjAiLCJkNzE5MWNmZGFlNjFhNmQ5NmExYTk2NDEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhNmQ5NmExYTk2NDEiLCJkNzMwMjdmYzhkNTlmZWUwOGJkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmYzhkNTlmZWUwOGJmZmZmYmZkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciKS5tYXAoc3YpLFV2PW12KER2KSxxdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5OWQ1OTQiLCJkNzE5MWNmZGFlNjFhYmRkYTQyYjgzYmEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmRkYTQyYjgzYmEiLCJkNTNlNGZmYzhkNTlmZWUwOGJlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmYzhkNTlmZWUwOGJmZmZmYmZlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiKS5tYXAoc3YpLE92PW12KHF2KSxZdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1Zjk5OWQ4YzkyY2EyNWYiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyMzhiNDUiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLEJ2PW12KFl2KSxGdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGVjZjQ5ZWJjZGE4ODU2YTciLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODQxOWQiLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ4MTBmN2M0ZDAwNGIiKS5tYXAoc3YpLEl2PW12KEZ2KSxIdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGYzZGJhOGRkYjU0M2EyY2EiLCJmMGY5ZThiYWU0YmM3YmNjYzQyYjhjYmUiLCJmMGY5ZThiYWU0YmM3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODY4YWMwODQwODEiKS5tYXAoc3YpLGp2PW12KEh2KSxYdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU4YzhmZGJiODRlMzRhMzMiLCJmZWYwZDlmZGNjOGFmYzhkNTlkNzMwMWYiLCJmZWYwZDlmZGNjOGFmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWZiMzAwMDA3ZjAwMDAiKS5tYXAoc3YpLEd2PW12KFh2KSxWdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2UyZjBhNmJkZGIxYzkwOTkiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YwMjgxOGEiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTZjNTkwMTQ2MzYiKS5tYXAoc3YpLCR2PW12KFZ2KSxXdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2U3ZjJhNmJkZGIyYjhjYmUiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YwNTcwYjAiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwNDVhOGQwMjM4NTgiKS5tYXAoc3YpLFp2PW12KFd2KSxRdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlN2UxZWZjOTk0YzdkZDFjNzciLCJmMWVlZjZkN2I1ZDhkZjY1YjBjZTEyNTYiLCJmMWVlZjZkN2I1ZDhkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5ODAwNDM2NzAwMWYiKS5tYXAoc3YpLEp2PW12KFF2KSxLdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZGUwZGRmYTlmYjVjNTFiOGEiLCJmZWViZTJmYmI0YjlmNzY4YTFhZTAxN2UiLCJmZWViZTJmYmI0YjlmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzc0OTAwNmEiKS5tYXAoc3YpLHRnPW12KEt2KSxuZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZGY4YjE3ZmNkYmIyYzdmYjgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyMjVlYTgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgyNTM0OTQwODFkNTgiKS5tYXAoc3YpLGVnPW12KG5nKSxyZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmN2ZjYjlhZGRkOGUzMWEzNTQiLCJmZmZmY2NjMmU2OTk3OGM2NzkyMzg0NDMiLCJmZmZmY2NjMmU2OTk3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDY4MzcwMDQ1MjkiKS5tYXAoc3YpLGlnPW12KHJnKSxvZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmY3YmNmZWM0NGZkOTVmMGUiLCJmZmZmZDRmZWQ5OGVmZTk5MjljYzRjMDIiLCJmZmZmZDRmZWQ5OGVmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI5OTM0MDQ2NjI1MDYiKS5tYXAoc3YpLGFnPW12KG9nKSx1Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmVkYTBmZWIyNGNmMDNiMjAiLCJmZmZmYjJmZWNjNWNmZDhkM2NlMzFhMWMiLCJmZmZmYjJmZWNjNWNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiZDAwMjY4MDAwMjYiKS5tYXAoc3YpLGZnPW12KHVnKSxjZz1uZXcgQXJyYXkoMykuY29uY2F0KCJkZWViZjc5ZWNhZTEzMTgyYmQiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYyMTcxYjUiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODUxOWMwODMwNmIiKS5tYXAoc3YpLHNnPW12KGNnKSxsZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1ZTBhMWQ5OWIzMWEzNTQiLCJlZGY4ZTliYWU0YjM3NGM0NzYyMzhiNDUiLCJlZGY4ZTliYWU0YjM3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLGhnPW12KGxnKSxkZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmMGYwZjBiZGJkYmQ2MzYzNjMiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY1MjUyNTIiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUwMDAwMDAiKS5tYXAoc3YpLHBnPW12KGRnKSx2Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZmVkZjViY2JkZGM3NTZiYjEiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg2YTUxYTMiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM1NDI3OGYzZjAwN2QiKS5tYXAoc3YpLGdnPW12KHZnKSx5Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWUwZDJmYzkyNzJkZTJkMjYiLCJmZWU1ZDlmY2FlOTFmYjZhNGFjYjE4MWQiLCJmZWU1ZDlmY2FlOTFmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWRhNTBmMTU2NzAwMGQiKS5tYXAoc3YpLF9nPW12KHlnKSxiZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU2Y2VmZGFlNmJlNjU1MGQiLCJmZWVkZGVmZGJlODVmZDhkM2NkOTQ3MDEiLCJmZWVkZGVmZGJlODVmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDFhNjM2MDM3ZjI3MDQiKS5tYXAoc3YpLG1nPW12KGJnKSx4Zz1HZShLbigzMDAsLjUsMCksS24oLTI0MCwuNSwxKSksd2c9R2UoS24oLTEwMCwuNzUsLjM1KSxLbig4MCwxLjUsLjgpKSxNZz1HZShLbigyNjAsLjc1LC4zNSksS24oODAsMS41LC44KSksQWc9S24oKTt2YXIgVGc9Ym4oKSxOZz1NYXRoLlBJLzMsU2c9MipNYXRoLlBJLzM7ZnVuY3Rpb24gRWcodCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19dmFyIGtnPUVnKHN2KCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksQ2c9RWcoc3YoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxQZz1FZyhzdigiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLHpnPUVnKHN2KCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7ZnVuY3Rpb24gUmcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBMZz1NYXRoLmFicyxEZz1NYXRoLmF0YW4yLFVnPU1hdGguY29zLHFnPU1hdGgubWF4LE9nPU1hdGgubWluLFlnPU1hdGguc2luLEJnPU1hdGguc3FydCxGZz0xZS0xMixJZz1NYXRoLlBJLEhnPUlnLzIsamc9MipJZztmdW5jdGlvbiBYZyh0KXtyZXR1cm4gdD49MT9IZzp0PD0tMT8tSGc6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIEdnKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIFZnKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uICRnKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gV2codCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gWmcodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gUWcodCxuLGUscixpLG8sYSl7dmFyIHU9dC1lLGY9bi1yLGM9KGE/bzotbykvQmcodSp1K2YqZikscz1jKmYsbD0tYyp1LGg9dCtzLGQ9bitsLHA9ZStzLHY9citsLGc9KGgrcCkvMix5PShkK3YpLzIsXz1wLWgsYj12LWQsbT1fKl8rYipiLHg9aS1vLHc9aCp2LXAqZCxNPShiPDA/LTE6MSkqQmcocWcoMCx4KngqbS13KncpKSxBPSh3KmItXypNKS9tLFQ9KC13Kl8tYipNKS9tLE49KHcqYitfKk0pL20sUz0oLXcqXytiKk0pL20sRT1BLWcsaz1ULXksQz1OLWcsUD1TLXk7cmV0dXJuIEUqRStrKms+QypDK1AqUCYmKEE9TixUPVMpLHtjeDpBLGN5OlQseDAxOi1zLHkwMTotbCx4MTE6QSooaS94LTEpLHkxMTpUKihpL3gtMSl9fWZ1bmN0aW9uIEpnKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBLZyh0KXtyZXR1cm4gbmV3IEpnKHQpfWZ1bmN0aW9uIHR5KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG55KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGV5KCl7dmFyIHQ9dHksbj1ueSxlPVJnKCEwKSxyPW51bGwsaT1LZyxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscz1hLmxlbmd0aCxsPSExO2ZvcihudWxsPT1yJiYobz1pKGM9R2koKSkpLHU9MDt1PD1zOysrdSkhKHU8cyYmZShmPWFbdV0sdSxhKSk9PT1sJiYoKGw9IWwpP28ubGluZVN0YXJ0KCk6by5saW5lRW5kKCkpLGwmJm8ucG9pbnQoK3QoZix1LGEpLCtuKGYsdSxhKSk7aWYoYylyZXR1cm4gbz1udWxsLGMrIiJ8fG51bGx9cmV0dXJuIGEueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6bn0sYS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoISF0KSxhKTplfSxhLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbnVsbCE9ciYmKG89aShyKSksYSk6aX0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P3I9bz1udWxsOm89aShyPXQpLGEpOnJ9LGF9ZnVuY3Rpb24gcnkoKXt2YXIgdD10eSxuPW51bGwsZT1SZygwKSxyPW55LGk9UmcoITApLG89bnVsbCxhPUtnLHU9bnVsbDtmdW5jdGlvbiBmKGYpe3ZhciBjLHMsbCxoLGQscD1mLmxlbmd0aCx2PSExLGc9bmV3IEFycmF5KHApLHk9bmV3IEFycmF5KHApO2ZvcihudWxsPT1vJiYodT1hKGQ9R2koKSkpLGM9MDtjPD1wOysrYyl7aWYoIShjPHAmJmkoaD1mW2NdLGMsZikpPT09dilpZih2PSF2KXM9Yyx1LmFyZWFTdGFydCgpLHUubGluZVN0YXJ0KCk7ZWxzZXtmb3IodS5saW5lRW5kKCksdS5saW5lU3RhcnQoKSxsPWMtMTtsPj1zOy0tbCl1LnBvaW50KGdbbF0seVtsXSk7dS5saW5lRW5kKCksdS5hcmVhRW5kKCl9diYmKGdbY109K3QoaCxjLGYpLHlbY109K2UoaCxjLGYpLHUucG9pbnQobj8rbihoLGMsZik6Z1tjXSxyPytyKGgsYyxmKTp5W2NdKSl9aWYoZClyZXR1cm4gdT1udWxsLGQrIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiBleSgpLmRlZmluZWQoaSkuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gZi54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6UmcoK2UpLG49bnVsbCxmKTp0fSxmLngwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm59LGYueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxyPW51bGwsZik6ZX0sZi55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTplfSxmLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpyfSxmLmxpbmVYMD1mLmxpbmVZMD1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KGUpfSxmLmxpbmVZMT1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KHIpfSxmLmxpbmVYMT1mdW5jdGlvbigpe3JldHVybiBjKCkueChuKS55KGUpfSxmLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZyghIXQpLGYpOml9LGYuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxudWxsIT1vJiYodT1hKG8pKSxmKTphfSxmLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz11PW51bGw6dT1hKG89dCksZik6b30sZn1mdW5jdGlvbiBpeSh0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn1mdW5jdGlvbiBveSh0KXtyZXR1cm4gdH1KZy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKX19fTt2YXIgYXk9ZnkoS2cpO2Z1bmN0aW9uIHV5KHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZnkodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IHV5KHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24gY3kodCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oZnkodCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gc3koKXtyZXR1cm4gY3koZXkoKS5jdXJ2ZShheSkpfWZ1bmN0aW9uIGx5KCl7dmFyIHQ9cnkoKS5jdXJ2ZShheSksbj10LmN1cnZlLGU9dC5saW5lWDAscj10LmxpbmVYMSxpPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBjeShlKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gY3kocigpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGN5KGkoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBjeShvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGZ5KHQpKTpuKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIGh5KHQsbil7cmV0dXJuWyhuPStuKSpNYXRoLmNvcyh0LT1NYXRoLlBJLzIpLG4qTWF0aC5zaW4odCldfXV5LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIGR5PUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBweSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gdnkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIGd5KHQpe3ZhciBuPXB5LGU9dnkscj10eSxpPW55LG89bnVsbDtmdW5jdGlvbiBhKCl7dmFyIGEsdT1keS5jYWxsKGFyZ3VtZW50cyksZj1uLmFwcGx5KHRoaXMsdSksYz1lLmFwcGx5KHRoaXMsdSk7aWYob3x8KG89YT1HaSgpKSx0KG8sK3IuYXBwbHkodGhpcywodVswXT1mLHUpKSwraS5hcHBseSh0aGlzLHUpLCtyLmFwcGx5KHRoaXMsKHVbMF09Yyx1KSksK2kuYXBwbHkodGhpcyx1KSksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEuc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsYSk6bn0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6cn0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6dCxhKTpvfSxhfWZ1bmN0aW9uIHl5KHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obj0obityKS8yLGUsbixpLHIsaSl9ZnVuY3Rpb24gX3kodCxuLGUscixpKXt0Lm1vdmVUbyhuLGUpLHQuYmV6aWVyQ3VydmVUbyhuLGU9KGUraSkvMixyLGUscixpKX1mdW5jdGlvbiBieSh0LG4sZSxyLGkpe3ZhciBvPWh5KG4sZSksYT1oeShuLGU9KGUraSkvMiksdT1oeShyLGUpLGY9aHkocixpKTt0Lm1vdmVUbyhvWzBdLG9bMV0pLHQuYmV6aWVyQ3VydmVUbyhhWzBdLGFbMV0sdVswXSx1WzFdLGZbMF0sZlsxXSl9dmFyIG15PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vSWcpO3QubW92ZVRvKGUsMCksdC5hcmMoMCwwLGUsMCxqZyl9fSx4eT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fSx3eT1NYXRoLnNxcnQoMS8zKSxNeT0yKnd5LEF5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTXkpLHI9ZSp3eTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLDApLHQubGluZVRvKDAsZSksdC5saW5lVG8oLXIsMCksdC5jbG9zZVBhdGgoKX19LFR5PU1hdGguc2luKElnLzEwKS9NYXRoLnNpbig3KklnLzEwKSxOeT1NYXRoLnNpbihqZy8xMCkqVHksU3k9LU1hdGguY29zKGpnLzEwKSpUeSxFeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydCguODkwODEzMDkxNTI5Mjg1MipuKSxyPU55KmUsaT1TeSplO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKHIsaSk7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIGE9amcqby81LHU9TWF0aC5jb3MoYSksZj1NYXRoLnNpbihhKTt0LmxpbmVUbyhmKmUsLXUqZSksdC5saW5lVG8odSpyLWYqaSxmKnIrdSppKX10LmNsb3NlUGF0aCgpfX0sa3k9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobikscj0tZS8yO3QucmVjdChyLHIsZSxlKX19LEN5PU1hdGguc3FydCgzKSxQeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPS1NYXRoLnNxcnQobi8oMypDeSkpO3QubW92ZVRvKDAsMiplKSx0LmxpbmVUbygtQ3kqZSwtZSksdC5saW5lVG8oQ3kqZSwtZSksdC5jbG9zZVBhdGgoKX19LHp5PU1hdGguc3FydCgzKS8yLFJ5PTEvTWF0aC5zcXJ0KDEyKSxMeT0zKihSeS8yKzEpLER5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTHkpLHI9ZS8yLGk9ZSpSeSxvPXIsYT1lKlJ5K2UsdT0tbyxmPWE7dC5tb3ZlVG8ocixpKSx0LmxpbmVUbyhvLGEpLHQubGluZVRvKHUsZiksdC5saW5lVG8oLS41KnItenkqaSx6eSpyKy0uNSppKSx0LmxpbmVUbygtLjUqby16eSphLHp5Km8rLS41KmEpLHQubGluZVRvKC0uNSp1LXp5KmYsenkqdSstLjUqZiksdC5saW5lVG8oLS41KnIrenkqaSwtLjUqaS16eSpyKSx0LmxpbmVUbygtLjUqbyt6eSphLC0uNSphLXp5Km8pLHQubGluZVRvKC0uNSp1K3p5KmYsLS41KmYtenkqdSksdC5jbG9zZVBhdGgoKX19LFV5PVtteSx4eSxBeSxreSxFeSxQeSxEeV07ZnVuY3Rpb24gcXkoKXt9ZnVuY3Rpb24gT3kodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIFl5KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBCeSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRnkodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEl5KHQsbil7dGhpcy5fYmFzaXM9bmV3IFl5KHQpLHRoaXMuX2JldGE9bn1ZeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOk95KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0Ok95KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxCeS5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sRnkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sSXkucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoLTE7aWYoZT4wKWZvcih2YXIgcixpPXRbMF0sbz1uWzBdLGE9dFtlXS1pLHU9bltlXS1vLGY9LTE7KytmPD1lOylyPWYvZSx0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbZl0rKDEtdGhpcy5fYmV0YSkqKGkrciphKSx0aGlzLl9iZXRhKm5bZl0rKDEtdGhpcy5fYmV0YSkqKG8rcip1KSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O3ZhciBIeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT1uP25ldyBZeSh0KTpuZXcgSXkodCxuKX1yZXR1cm4gZS5iZXRhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjg1KTtmdW5jdGlvbiBqeSh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIFh5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1YeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6ankodGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0Omp5KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgR3k9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgWHkodCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7ZnVuY3Rpb24gVnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fVZ5LnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyICR5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFZ5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFd5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1XeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFp5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFd5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFF5KHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5GZyl7dmFyIHU9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsZj0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ocip1LXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2YsaT0oaSp1LXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2Z9aWYodC5fbDIzX2E+Rmcpe3ZhciBjPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLHM9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qYyt0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL3MsYT0oYSpjK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvc310Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gSnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1KeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEt5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgSnkodCxuKTpuZXcgWHkodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiB0Xyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufXRfLnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6UXkodGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgbl89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyB0Xyh0LG4pOm5ldyBWeSh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO2Z1bmN0aW9uIGVfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIHJfPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgZV8odCxuKTpuZXcgV3kodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBpXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gb18odCl7cmV0dXJuIHQ8MD8tMToxfWZ1bmN0aW9uIGFfKHQsbixlKXt2YXIgcj10Ll94MS10Ll94MCxpPW4tdC5feDEsbz0odC5feTEtdC5feTApLyhyfHxpPDAmJi0wKSxhPShlLXQuX3kxKS8oaXx8cjwwJiYtMCksdT0obyppK2EqcikvKHIraSk7cmV0dXJuKG9fKG8pK29fKGEpKSpNYXRoLm1pbihNYXRoLmFicyhvKSxNYXRoLmFicyhhKSwuNSpNYXRoLmFicyh1KSl8fDB9ZnVuY3Rpb24gdV8odCxuKXt2YXIgZT10Ll94MS10Ll94MDtyZXR1cm4gZT8oMyoodC5feTEtdC5feTApL2UtbikvMjpufWZ1bmN0aW9uIGZfKHQsbixlKXt2YXIgcj10Ll94MCxpPXQuX3kwLG89dC5feDEsYT10Ll95MSx1PShvLXIpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIrdSxpK3UqbixvLXUsYS11KmUsbyxhKX1mdW5jdGlvbiBjXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gc18odCl7dGhpcy5fY29udGV4dD1uZXcgbF8odCl9ZnVuY3Rpb24gbF8odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGhfKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBkXyh0KXt2YXIgbixlLHI9dC5sZW5ndGgtMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoaVswXT0wLG9bMF09MixhWzBdPXRbMF0rMip0WzFdLG49MTtuPHItMTsrK24paVtuXT0xLG9bbl09NCxhW25dPTQqdFtuXSsyKnRbbisxXTtmb3IoaVtyLTFdPTIsb1tyLTFdPTcsYVtyLTFdPTgqdFtyLTFdK3Rbcl0sbj0xO248cjsrK24pZT1pW25dL29bbi0xXSxvW25dLT1lLGFbbl0tPWUqYVtuLTFdO2ZvcihpW3ItMV09YVtyLTFdL29bci0xXSxuPXItMjtuPj0wOy0tbilpW25dPShhW25dLWlbbisxXSkvb1tuXTtmb3Iob1tyLTFdPSh0W3JdK2lbci0xXSkvMixuPTA7bjxyLTE7KytuKW9bbl09Mip0W24rMV0taVtuKzFdO3JldHVybltpLG9dfWZ1bmN0aW9uIHBfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX3Q9bn1mdW5jdGlvbiB2Xyh0LG4pe2lmKChpPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbz0xLGE9dFtuWzBdXSx1PWEubGVuZ3RoO288aTsrK28pZm9yKHI9YSxhPXRbbltvXV0sZT0wO2U8dTsrK2UpYVtlXVsxXSs9YVtlXVswXT1pc05hTihyW2VdWzFdKT9yW2VdWzBdOnJbZV1bMV19ZnVuY3Rpb24gZ18odCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9bmV3IEFycmF5KG4pOy0tbj49MDspZVtuXT1uO3JldHVybiBlfWZ1bmN0aW9uIHlfKHQsbil7cmV0dXJuIHRbbl19ZnVuY3Rpb24gX18odCl7dmFyIG49dC5tYXAoYl8pO3JldHVybiBnXyh0KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pfWZ1bmN0aW9uIGJfKHQpe2Zvcih2YXIgbixlPTAscj0tMSxpPXQubGVuZ3RoOysrcjxpOykobj0rdFtyXVsxXSkmJihlKz1uKTtyZXR1cm4gZX1mdW5jdGlvbiBtXyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24geF8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gd18odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gTV8oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBBXyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIFRfKHQsbil7dmFyIGU9bixyPW4uUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBOXyh0LG4pe3ZhciBlPW4scj1uLkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gU18odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIEVfKHQsbixlLHIpe3ZhciBpPVtudWxsLG51bGxdLG89Sl8ucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PW4sZSYmQ18oaSx0LG4sZSksciYmQ18oaSxuLHQsciksWl9bdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksWl9bbi5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBrXyh0LG4sZSl7dmFyIHI9W24sZV07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gQ18odCxuLGUscil7dFswXXx8dFsxXT90LmxlZnQ9PT1lP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9bix0LnJpZ2h0PWUpfWZ1bmN0aW9uIFBfKHQsbixlLHIsaSl7dmFyIG8sYT10WzBdLHU9dFsxXSxmPWFbMF0sYz1hWzFdLHM9MCxsPTEsaD11WzBdLWYsZD11WzFdLWM7aWYobz1uLWYsaHx8IShvPjApKXtpZihvLz1oLGg8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoaD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1yLWYsaHx8IShvPDApKXtpZihvLz1oLGg8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoaD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9aWYobz1lLWMsZHx8IShvPjApKXtpZihvLz1kLGQ8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoZD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1pLWMsZHx8IShvPDApKXtpZihvLz1kLGQ8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoZD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9cmV0dXJuIShzPjB8fGw8MSl8fChzPjAmJih0WzBdPVtmK3MqaCxjK3MqZF0pLGw8MSYmKHRbMV09W2YrbCpoLGMrbCpkXSksITApfX19fX1mdW5jdGlvbiB6Xyh0LG4sZSxyLGkpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgYSx1LGY9dFswXSxjPXQubGVmdCxzPXQucmlnaHQsbD1jWzBdLGg9Y1sxXSxkPXNbMF0scD1zWzFdLHY9KGwrZCkvMixnPShoK3ApLzI7aWYocD09PWgpe2lmKHY8bnx8dj49cilyZXR1cm47aWYobD5kKXtpZihmKXtpZihmWzFdPj1pKXJldHVybn1lbHNlIGY9W3YsZV07bz1bdixpXX1lbHNle2lmKGYpe2lmKGZbMV08ZSlyZXR1cm59ZWxzZSBmPVt2LGldO289W3YsZV19fWVsc2UgaWYodT1nLShhPShsLWQpLyhwLWgpKSp2LGE8LTF8fGE+MSlpZihsPmQpe2lmKGYpe2lmKGZbMV0+PWkpcmV0dXJufWVsc2UgZj1bKGUtdSkvYSxlXTtvPVsoaS11KS9hLGldfWVsc2V7aWYoZil7aWYoZlsxXTxlKXJldHVybn1lbHNlIGY9WyhpLXUpL2EsaV07bz1bKGUtdSkvYSxlXX1lbHNlIGlmKGg8cCl7aWYoZil7aWYoZlswXT49cilyZXR1cm59ZWxzZSBmPVtuLGEqbit1XTtvPVtyLGEqcit1XX1lbHNle2lmKGYpe2lmKGZbMF08bilyZXR1cm59ZWxzZSBmPVtyLGEqcit1XTtvPVtuLGEqbit1XX1yZXR1cm4gdFswXT1mLHRbMV09bywhMH1mdW5jdGlvbiBSXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPW4ubGVmdCxpPW4ucmlnaHQ7cmV0dXJuIGU9PT1pJiYoaT1yLHI9ZSksaT9NYXRoLmF0YW4yKGlbMV0tclsxXSxpWzBdLXJbMF0pOihlPT09cj8ocj1uWzFdLGk9blswXSk6KHI9blswXSxpPW5bMV0pLE1hdGguYXRhbjIoclswXS1pWzBdLGlbMV0tclsxXSkpfWZ1bmN0aW9uIExfKHQsbil7cmV0dXJuIG5bKyhuLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBEXyh0LG4pe3JldHVybiBuWysobi5sZWZ0PT09dC5zaXRlKV19aV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6cXksYXJlYUVuZDpxeSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dD0rdCxuPStuLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSl9fSxjXy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6Zl8odGhpcyx0aGlzLl90MCx1Xyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZihuPStuLCh0PSt0KSE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsZl8odGhpcyx1Xyh0aGlzLGU9YV8odGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0OmZfKHRoaXMsdGhpcy5fdDAsZT1hXyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LChzXy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjXy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe2NfLnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sbF8ucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0saF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9ZF8odCksaT1kXyhuKSxvPTAsYT0xO2E8ZTsrK28sKythKXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbYV0sblthXSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX0scF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX0sTV8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNXyxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7aWYodCl7aWYobi5QPXQsbi5OPXQuTix0Lk4mJih0Lk4uUD1uKSx0Lk49bix0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1ufWVsc2UgdC5SPW47ZT10fWVsc2UgdGhpcy5fPyh0PVNfKHRoaXMuXyksbi5QPW51bGwsbi5OPXQsdC5QPXQuTD1uLGU9dCk6KG4uUD1uLk49bnVsbCx0aGlzLl89bixlPW51bGwpO2ZvcihuLkw9bi5SPW51bGwsbi5VPWUsbi5DPSEwLHQ9bjtlJiZlLkM7KWU9PT0ocj1lLlUpLkw/KGk9ci5SKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5SJiYoVF8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsTl8odGhpcyxyKSk6KGk9ci5MKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5MJiYoTl8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsVF8odGhpcyxyKSksZT10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBuLGUscixpPXQuVSxvPXQuTCxhPXQuUjtpZihlPW8/YT9TXyhhKTpvOmEsaT9pLkw9PT10P2kuTD1lOmkuUj1lOnRoaXMuXz1lLG8mJmE/KHI9ZS5DLGUuQz10LkMsZS5MPW8sby5VPWUsZSE9PWE/KGk9ZS5VLGUuVT10LlUsdD1lLlIsaS5MPXQsZS5SPWEsYS5VPWUpOihlLlU9aSxpPWUsdD1lLlIpKToocj10LkMsdD1lKSx0JiYodC5VPWkpLCFyKWlmKHQmJnQuQyl0LkM9ITE7ZWxzZXtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChuPWkuUikuQyYmKG4uQz0hMSxpLkM9ITAsVF8odGhpcyxpKSxuPWkuUiksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5SJiZuLlIuQ3x8KG4uTC5DPSExLG4uQz0hMCxOXyh0aGlzLG4pLG49aS5SKSxuLkM9aS5DLGkuQz1uLlIuQz0hMSxUXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChuPWkuTCkuQyYmKG4uQz0hMSxpLkM9ITAsTl8odGhpcyxpKSxuPWkuTCksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5MJiZuLkwuQ3x8KG4uUi5DPSExLG4uQz0hMCxUXyh0aGlzLG4pLG49aS5MKSxuLkM9aS5DLGkuQz1uLkwuQz0hMSxOXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfW4uQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIFVfLHFfPVtdO2Z1bmN0aW9uIE9fKCl7QV8odGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFlfKHQpe3ZhciBuPXQuUCxlPXQuTjtpZihuJiZlKXt2YXIgcj1uLnNpdGUsaT10LnNpdGUsbz1lLnNpdGU7aWYociE9PW8pe3ZhciBhPWlbMF0sdT1pWzFdLGY9clswXS1hLGM9clsxXS11LHM9b1swXS1hLGw9b1sxXS11LGg9MiooZipsLWMqcyk7aWYoIShoPj0tdGIpKXt2YXIgZD1mKmYrYypjLHA9cypzK2wqbCx2PShsKmQtYypwKS9oLGc9KGYqcC1zKmQpL2gseT1xXy5wb3AoKXx8bmV3IE9fO3kuYXJjPXQseS5zaXRlPWkseS54PXYrYSx5Lnk9KHkuY3k9Zyt1KStNYXRoLnNxcnQodip2K2cqZyksdC5jaXJjbGU9eTtmb3IodmFyIF89bnVsbCxiPVFfLl87YjspaWYoeS55PGIueXx8eS55PT09Yi55JiZ5Lng8PWIueCl7aWYoIWIuTCl7Xz1iLlA7YnJlYWt9Yj1iLkx9ZWxzZXtpZighYi5SKXtfPWI7YnJlYWt9Yj1iLlJ9UV8uaW5zZXJ0KF8seSksX3x8KFVfPXkpfX19fWZ1bmN0aW9uIEJfKHQpe3ZhciBuPXQuY2lyY2xlO24mJihuLlB8fChVXz1uLk4pLFFfLnJlbW92ZShuKSxxXy5wdXNoKG4pLEFfKG4pLHQuY2lyY2xlPW51bGwpfXZhciBGXz1bXTtmdW5jdGlvbiBJXygpe0FfKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBIXyh0KXt2YXIgbj1GXy5wb3AoKXx8bmV3IElfO3JldHVybiBuLnNpdGU9dCxufWZ1bmN0aW9uIGpfKHQpe0JfKHQpLFdfLnJlbW92ZSh0KSxGXy5wdXNoKHQpLEFfKHQpfWZ1bmN0aW9uIFhfKHQpe3ZhciBuPXQuY2lyY2xlLGU9bi54LHI9bi5jeSxpPVtlLHJdLG89dC5QLGE9dC5OLHU9W3RdO2pfKHQpO2Zvcih2YXIgZj1vO2YuY2lyY2xlJiZNYXRoLmFicyhlLWYuY2lyY2xlLngpPEtfJiZNYXRoLmFicyhyLWYuY2lyY2xlLmN5KTxLXzspbz1mLlAsdS51bnNoaWZ0KGYpLGpfKGYpLGY9bzt1LnVuc2hpZnQoZiksQl8oZik7Zm9yKHZhciBjPWE7Yy5jaXJjbGUmJk1hdGguYWJzKGUtYy5jaXJjbGUueCk8S18mJk1hdGguYWJzKHItYy5jaXJjbGUuY3kpPEtfOylhPWMuTix1LnB1c2goYyksal8oYyksYz1hO3UucHVzaChjKSxCXyhjKTt2YXIgcyxsPXUubGVuZ3RoO2ZvcihzPTE7czxsOysrcyljPXVbc10sZj11W3MtMV0sQ18oYy5lZGdlLGYuc2l0ZSxjLnNpdGUsaSk7Zj11WzBdLChjPXVbbC0xXSkuZWRnZT1FXyhmLnNpdGUsYy5zaXRlLG51bGwsaSksWV8oZiksWV8oYyl9ZnVuY3Rpb24gR18odCl7Zm9yKHZhciBuLGUscixpLG89dFswXSxhPXRbMV0sdT1XXy5fO3U7KWlmKChyPVZfKHUsYSktbyk+S18pdT11Lkw7ZWxzZXtpZighKChpPW8tJF8odSxhKSk+S18pKXtyPi1LXz8obj11LlAsZT11KTppPi1LXz8obj11LGU9dS5OKTpuPWU9dTticmVha31pZighdS5SKXtuPXU7YnJlYWt9dT11LlJ9IWZ1bmN0aW9uKHQpe1pfW3QuaW5kZXhdPXtzaXRlOnQsaGFsZmVkZ2VzOltdfX0odCk7dmFyIGY9SF8odCk7aWYoV18uaW5zZXJ0KG4sZiksbnx8ZSl7aWYobj09PWUpcmV0dXJuIEJfKG4pLGU9SF8obi5zaXRlKSxXXy5pbnNlcnQoZixlKSxmLmVkZ2U9ZS5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpLFlfKG4pLHZvaWQgWV8oZSk7aWYoZSl7Ql8obiksQl8oZSk7dmFyIGM9bi5zaXRlLHM9Y1swXSxsPWNbMV0saD10WzBdLXMsZD10WzFdLWwscD1lLnNpdGUsdj1wWzBdLXMsZz1wWzFdLWwseT0yKihoKmctZCp2KSxfPWgqaCtkKmQsYj12KnYrZypnLG09WyhnKl8tZCpiKS95K3MsKGgqYi12Kl8pL3krbF07Q18oZS5lZGdlLGMscCxtKSxmLmVkZ2U9RV8oYyx0LG51bGwsbSksZS5lZGdlPUVfKHQscCxudWxsLG0pLFlfKG4pLFlfKGUpfWVsc2UgZi5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpfX1mdW5jdGlvbiBWXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPWVbMF0saT1lWzFdLG89aS1uO2lmKCFvKXJldHVybiByO3ZhciBhPXQuUDtpZighYSlyZXR1cm4tMS8wO3ZhciB1PShlPWEuc2l0ZSlbMF0sZj1lWzFdLGM9Zi1uO2lmKCFjKXJldHVybiB1O3ZhciBzPXUtcixsPTEvby0xL2MsaD1zL2M7cmV0dXJuIGw/KC1oK01hdGguc3FydChoKmgtMipsKihzKnMvKC0yKmMpLWYrYy8yK2ktby8yKSkpL2wrcjoocit1KS8yfWZ1bmN0aW9uICRfKHQsbil7dmFyIGU9dC5OO2lmKGUpcmV0dXJuIFZfKGUsbik7dmFyIHI9dC5zaXRlO3JldHVybiByWzFdPT09bj9yWzBdOjEvMH12YXIgV18sWl8sUV8sSl8sS189MWUtNix0Yj0xZS0xMjtmdW5jdGlvbiBuYih0LG4pe3JldHVybiBuWzFdLXRbMV18fG5bMF0tdFswXX1mdW5jdGlvbiBlYih0LG4pe3ZhciBlLHIsaSxvPXQuc29ydChuYikucG9wKCk7Zm9yKEpfPVtdLFpfPW5ldyBBcnJheSh0Lmxlbmd0aCksV189bmV3IE1fLFFfPW5ldyBNXzs7KWlmKGk9VV8sbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKW9bMF09PT1lJiZvWzFdPT09cnx8KEdfKG8pLGU9b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO1hfKGkuYXJjKX1pZihmdW5jdGlvbigpe2Zvcih2YXIgdCxuLGUscixpPTAsbz1aXy5sZW5ndGg7aTxvOysraSlpZigodD1aX1tpXSkmJihyPShuPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgYT1uZXcgQXJyYXkociksdT1uZXcgQXJyYXkocik7Zm9yKGU9MDtlPHI7KytlKWFbZV09ZSx1W2VdPVJfKHQsSl9bbltlXV0pO2ZvcihhLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gdVtuXS11W3RdfSksZT0wO2U8cjsrK2UpdVtlXT1uW2FbZV1dO2ZvcihlPTA7ZTxyOysrZSluW2VdPXVbZV19fSgpLG4pe3ZhciBhPStuWzBdWzBdLHU9K25bMF1bMV0sZj0rblsxXVswXSxjPStuWzFdWzFdOyFmdW5jdGlvbih0LG4sZSxyKXtmb3IodmFyIGksbz1KXy5sZW5ndGg7by0tOyl6XyhpPUpfW29dLHQsbixlLHIpJiZQXyhpLHQsbixlLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5LX3x8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5LXyl8fGRlbGV0ZSBKX1tvXX0oYSx1LGYsYyksZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGc9Wl8ubGVuZ3RoLHk9ITA7Zm9yKGk9MDtpPGc7KytpKWlmKG89Wl9baV0pe2ZvcihhPW8uc2l0ZSx1PShmPW8uaGFsZmVkZ2VzKS5sZW5ndGg7dS0tOylKX1tmW3VdXXx8Zi5zcGxpY2UodSwxKTtmb3IodT0wLGM9Zi5sZW5ndGg7dTxjOylwPShkPURfKG8sSl9bZlt1XV0pKVswXSx2PWRbMV0sbD0ocz1MXyhvLEpfW2ZbKyt1JWNdXSkpWzBdLGg9c1sxXSwoTWF0aC5hYnMocC1sKT5LX3x8TWF0aC5hYnModi1oKT5LXykmJihmLnNwbGljZSh1LDAsSl8ucHVzaChrXyhhLGQsTWF0aC5hYnMocC10KTxLXyYmci12PktfP1t0LE1hdGguYWJzKGwtdCk8S18/aDpyXTpNYXRoLmFicyh2LXIpPEtfJiZlLXA+S18/W01hdGguYWJzKGgtcik8S18/bDplLHJdOk1hdGguYWJzKHAtZSk8S18mJnYtbj5LXz9bZSxNYXRoLmFicyhsLWUpPEtfP2g6bl06TWF0aC5hYnModi1uKTxLXyYmcC10PktfP1tNYXRoLmFicyhoLW4pPEtfP2w6dCxuXTpudWxsKSktMSksKytjKTtjJiYoeT0hMSl9aWYoeSl7dmFyIF8sYixtLHg9MS8wO2ZvcihpPTAseT1udWxsO2k8ZzsrK2kpKG89Wl9baV0pJiYobT0oXz0oYT1vLnNpdGUpWzBdLXQpKl8rKGI9YVsxXS1uKSpiKTx4JiYoeD1tLHk9byk7aWYoeSl7dmFyIHc9W3Qsbl0sTT1bdCxyXSxBPVtlLHJdLFQ9W2Usbl07eS5oYWxmZWRnZXMucHVzaChKXy5wdXNoKGtfKGE9eS5zaXRlLHcsTSkpLTEsSl8ucHVzaChrXyhhLE0sQSkpLTEsSl8ucHVzaChrXyhhLEEsVCkpLTEsSl8ucHVzaChrXyhhLFQsdykpLTEpfX1mb3IoaT0wO2k8ZzsrK2kpKG89Wl9baV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgWl9baV0pfShhLHUsZixjKX10aGlzLmVkZ2VzPUpfLHRoaXMuY2VsbHM9Wl8sV189UV89Sl89Wl89bnVsbH1mdW5jdGlvbiByYih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gaWIodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy50cmFuc2Zvcm09ZX1mdW5jdGlvbiBvYih0LG4sZSl7dGhpcy5rPXQsdGhpcy54PW4sdGhpcy55PWV9ZWIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplYixwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKG4pe3ZhciBlPW4uaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTF8obix0W2VdKX0pO3JldHVybiBlLmRhdGE9bi5zaXRlLmRhdGEsZX0pfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxuPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2lmKG89KGk9ZS5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyxhLHUsZixjLHM9ZS5zaXRlLGw9LTEsaD1uW2lbby0xXV0sZD1oLmxlZnQ9PT1zP2gucmlnaHQ6aC5sZWZ0OysrbDxvOylhPWQsZD0oaD1uW2lbbF1dKS5sZWZ0PT09cz9oLnJpZ2h0OmgubGVmdCxhJiZkJiZyPGEuaW5kZXgmJnI8ZC5pbmRleCYmKGY9YSxjPWQsKCh1PXMpWzBdLWNbMF0pKihmWzFdLXVbMV0pLSh1WzBdLWZbMF0pKihjWzFdLXVbMV0pPDApJiZ0LnB1c2goW3MuZGF0YSxhLmRhdGEsZC5kYXRhXSl9KSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSl9LGZpbmQ6ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHU9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbYV0pOylpZigrK2E+PXUpcmV0dXJuIG51bGw7dmFyIGY9dC1pLnNpdGVbMF0sYz1uLWkuc2l0ZVsxXSxzPWYqZitjKmM7ZG97aT1vLmNlbGxzW3I9YV0sYT1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9by5lZGdlc1tlXSx1PXIubGVmdDtpZih1IT09aS5zaXRlJiZ1fHwodT1yLnJpZ2h0KSl7dmFyIGY9dC11WzBdLGM9bi11WzFdLGw9ZipmK2MqYztsPHMmJihzPWwsYT11LmluZGV4KX19KX13aGlsZShudWxsIT09YSk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09ZXx8czw9ZSplP2kuc2l0ZTpudWxsfX0sb2IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvYixzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgb2IodGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LG4pe3JldHVybiAwPT09dCYwPT09bj90aGlzOm5ldyBvYih0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqbil9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciBhYj1uZXcgb2IoMSwwLDApO2Z1bmN0aW9uIHViKHQpe3JldHVybiB0Ll9fem9vbXx8YWJ9ZnVuY3Rpb24gZmIoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGNiKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gc2IoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gbGIoKXt2YXIgdCxuLGU9dGhpcztyZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KGU9ZS5vd25lclNWR0VsZW1lbnR8fGUpLndpZHRoLmJhc2VWYWwudmFsdWUsbj1lLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1lLmNsaWVudFdpZHRoLG49ZS5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxuXV19ZnVuY3Rpb24gaGIoKXtyZXR1cm4gdGhpcy5fX3pvb218fGFifWZ1bmN0aW9uIGRiKCl7cmV0dXJuLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwfWZ1bmN0aW9uIHBiKCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIHZiKHQsbixlKXt2YXIgcj10LmludmVydFgoblswXVswXSktZVswXVswXSxpPXQuaW52ZXJ0WChuWzFdWzBdKS1lWzFdWzBdLG89dC5pbnZlcnRZKG5bMF1bMV0pLWVbMF1bMV0sYT10LmludmVydFkoblsxXVsxXSktZVsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUoaT5yPyhyK2kpLzI6TWF0aC5taW4oMCxyKXx8TWF0aC5tYXgoMCxpKSxhPm8/KG8rYSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLGEpKX11Yi5wcm90b3R5cGU9b2IucHJvdG90eXBlLHQudmVyc2lvbj0iNS43LjAiLHQuYmlzZWN0PWksdC5iaXNlY3RSaWdodD1pLHQuYmlzZWN0TGVmdD1vLHQuYXNjZW5kaW5nPW4sdC5iaXNlY3Rvcj1lLHQuY3Jvc3M9ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbyx1LGY9dC5sZW5ndGgsYz1uLmxlbmd0aCxzPW5ldyBBcnJheShmKmMpO2ZvcihudWxsPT1lJiYoZT1hKSxyPW89MDtyPGY7KytyKWZvcih1PXRbcl0saT0wO2k8YzsrK2ksKytvKXNbb109ZSh1LG5baV0pO3JldHVybiBzfSx0LmRlc2NlbmRpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59LHQuZGV2aWF0aW9uPWMsdC5leHRlbnQ9cyx0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe3ZhciB0PXYsbj1zLGU9TTtmdW5jdGlvbiByKHIpe3ZhciBvLGEsdT1yLmxlbmd0aCxmPW5ldyBBcnJheSh1KTtmb3Iobz0wO288dTsrK28pZltvXT10KHJbb10sbyxyKTt2YXIgYz1uKGYpLHM9Y1swXSxsPWNbMV0saD1lKGYscyxsKTtBcnJheS5pc0FycmF5KGgpfHwoaD13KHMsbCxoKSxoPWcoTWF0aC5jZWlsKHMvaCkqaCxsLGgpKTtmb3IodmFyIGQ9aC5sZW5ndGg7aFswXTw9czspaC5zaGlmdCgpLC0tZDtmb3IoO2hbZC0xXT5sOyloLnBvcCgpLC0tZDt2YXIgcCx2PW5ldyBBcnJheShkKzEpO2ZvcihvPTA7bzw9ZDsrK28pKHA9dltvXT1bXSkueDA9bz4wP2hbby0xXTpzLHAueDE9bzxkP2hbb106bDtmb3Iobz0wO288dTsrK28pczw9KGE9ZltvXSkmJmE8PWwmJnZbaShoLGEsMCxkKV0ucHVzaChyW29dKTtyZXR1cm4gdn1yZXR1cm4gci52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnAobikscik6dH0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpwKFt0WzBdLHRbMV1dKSxyKTpufSxyLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP3AoaC5jYWxsKHQpKTpwKHQpLHIpOmV9LHJ9LHQudGhyZXNob2xkRnJlZWRtYW5EaWFjb25pcz1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9ZC5jYWxsKHQsdSkuc29ydChuKSxNYXRoLmNlaWwoKHItZSkvKDIqKEEodCwuNzUpLUEodCwuMjUpKSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFNjb3R0PWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqYyh0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFN0dXJnZXM9TSx0Lm1heD1ULHQubWVhbj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT1yLG89LTEsYT0wO2lmKG51bGw9PW4pZm9yKDsrK288cjspaXNOYU4oZT11KHRbb10pKT8tLWk6YSs9ZTtlbHNlIGZvcig7KytvPHI7KWlzTmFOKGU9dShuKHRbb10sbyx0KSkpPy0taTphKz1lO2lmKGkpcmV0dXJuIGEvaX0sdC5tZWRpYW49ZnVuY3Rpb24odCxlKXt2YXIgcixpPXQubGVuZ3RoLG89LTEsYT1bXTtpZihudWxsPT1lKWZvcig7KytvPGk7KWlzTmFOKHI9dSh0W29dKSl8fGEucHVzaChyKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKHI9dShlKHRbb10sbyx0KSkpfHxhLnB1c2gocik7cmV0dXJuIEEoYS5zb3J0KG4pLC41KX0sdC5tZXJnZT1OLHQubWluPVMsdC5wYWlycz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPWEpO2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgtMSxpPXRbMF0sbz1uZXcgQXJyYXkocjwwPzA6cik7ZTxyOylvW2VdPW4oaSxpPXRbKytlXSk7cmV0dXJuIG99LHQucGVybXV0ZT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtuW2VdXTtyZXR1cm4gcn0sdC5xdWFudGlsZT1BLHQucmFuZ2U9Zyx0LnNjYW49ZnVuY3Rpb24odCxlKXtpZihyPXQubGVuZ3RoKXt2YXIgcixpLG89MCxhPTAsdT10W2FdO2ZvcihudWxsPT1lJiYoZT1uKTsrK288cjspKGUoaT10W29dLHUpPDB8fDAhPT1lKHUsdSkpJiYodT1pLGE9byk7cmV0dXJuIDA9PT1lKHUsdSk/YTp2b2lkIDB9fSx0LnNodWZmbGU9ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89KG51bGw9PWU/dC5sZW5ndGg6ZSktKG49bnVsbD09bj8wOituKTtvOylpPU1hdGgucmFuZG9tKCkqby0tfDAscj10W28rbl0sdFtvK25dPXRbaStuXSx0W2krbl09cjtyZXR1cm4gdH0sdC5zdW09ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9LTEsbz0wO2lmKG51bGw9PW4pZm9yKDsrK2k8cjspKGU9K3RbaV0pJiYobys9ZSk7ZWxzZSBmb3IoOysraTxyOykoZT0rbih0W2ldLGksdCkpJiYobys9ZSk7cmV0dXJuIG99LHQudGlja3M9bSx0LnRpY2tJbmNyZW1lbnQ9eCx0LnRpY2tTdGVwPXcsdC50cmFuc3Bvc2U9RSx0LnZhcmlhbmNlPWYsdC56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gRShhcmd1bWVudHMpfSx0LmF4aXNUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIEIoeix0KX0sdC5heGlzUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoUix0KX0sdC5heGlzQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBCKEwsdCl9LHQuYXhpc0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoRCx0KX0sdC5icnVzaD1mdW5jdGlvbigpe3JldHVybiBSaSh3aSl9LHQuYnJ1c2hYPWZ1bmN0aW9uKCl7cmV0dXJuIFJpKG1pKX0sdC5icnVzaFk9ZnVuY3Rpb24oKXtyZXR1cm4gUmkoeGkpfSx0LmJydXNoU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9LHQuY2hvcmQ9ZnVuY3Rpb24oKXt2YXIgdD0wLG49bnVsbCxlPW51bGwscj1udWxsO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1LGYsYyxzLGw9aS5sZW5ndGgsaD1bXSxkPWcobCkscD1bXSx2PVtdLHk9di5ncm91cHM9bmV3IEFycmF5KGwpLF89bmV3IEFycmF5KGwqbCk7Zm9yKG89MCxjPS0xOysrYzxsOyl7Zm9yKGE9MCxzPS0xOysrczxsOylhKz1pW2NdW3NdO2gucHVzaChhKSxwLnB1c2goZyhsKSksbys9YX1mb3IobiYmZC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oaFt0XSxoW2VdKX0pLGUmJnAuZm9yRWFjaChmdW5jdGlvbih0LG4pe3Quc29ydChmdW5jdGlvbih0LHIpe3JldHVybiBlKGlbbl1bdF0saVtuXVtyXSl9KX0pLGY9KG89WWkoMCxPaS10KmwpL28pP3Q6T2kvbCxhPTAsYz0tMTsrK2M8bDspe2Zvcih1PWEscz0tMTsrK3M8bDspe3ZhciBiPWRbY10sbT1wW2JdW3NdLHg9aVtiXVttXSx3PWEsTT1hKz14Km87X1ttKmwrYl09e2luZGV4OmIsc3ViaW5kZXg6bSxzdGFydEFuZ2xlOncsZW5kQW5nbGU6TSx2YWx1ZTp4fX15W2JdPXtpbmRleDpiLHN0YXJ0QW5nbGU6dSxlbmRBbmdsZTphLHZhbHVlOmhbYl19LGErPWZ9Zm9yKGM9LTE7KytjPGw7KWZvcihzPWMtMTsrK3M8bDspe3ZhciBBPV9bcypsK2NdLFQ9X1tjKmwrc107KEEudmFsdWV8fFQudmFsdWUpJiZ2LnB1c2goQS52YWx1ZTxULnZhbHVlP3tzb3VyY2U6VCx0YXJnZXQ6QX06e3NvdXJjZTpBLHRhcmdldDpUfSl9cmV0dXJuIHI/di5zb3J0KHIpOnZ9cmV0dXJuIGkucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9WWkoMCxuKSxpKTp0fSxpLnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxpKTpufSxpLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxpKTplfSxpLnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/cj1udWxsOihuPXQscj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX0pLl89dCxpKTpyJiZyLl87dmFyIG59LGl9LHQucmliYm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Vmksbj0kaSxlPVdpLHI9WmksaT1RaSxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHU9QmkuY2FsbChhcmd1bWVudHMpLGY9dC5hcHBseSh0aGlzLHUpLGM9bi5hcHBseSh0aGlzLHUpLHM9K2UuYXBwbHkodGhpcywodVswXT1mLHUpKSxsPXIuYXBwbHkodGhpcyx1KS1xaSxoPWkuYXBwbHkodGhpcyx1KS1xaSxkPXMqTGkobCkscD1zKkRpKGwpLHY9K2UuYXBwbHkodGhpcywodVswXT1jLHUpKSxnPXIuYXBwbHkodGhpcyx1KS1xaSx5PWkuYXBwbHkodGhpcyx1KS1xaTtpZihvfHwobz1hPUdpKCkpLG8ubW92ZVRvKGQscCksby5hcmMoMCwwLHMsbCxoKSxsPT09ZyYmaD09PXl8fChvLnF1YWRyYXRpY0N1cnZlVG8oMCwwLHYqTGkoZyksdipEaShnKSksby5hcmMoMCwwLHYsZyx5KSksby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxkLHApLG8uY2xvc2VQYXRoKCksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOml9LGEuc291cmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sYSk6dH0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX0sdC5uZXN0PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9W10saT1bXTtmdW5jdGlvbiBvKGUsaSxhLHUpe2lmKGk+PXIubGVuZ3RoKXJldHVybiBudWxsIT10JiZlLnNvcnQodCksbnVsbCE9bj9uKGUpOmU7Zm9yKHZhciBmLGMscyxsPS0xLGg9ZS5sZW5ndGgsZD1yW2krK10scD1LaSgpLHY9YSgpOysrbDxoOykocz1wLmdldChmPWQoYz1lW2xdKSsiIikpP3MucHVzaChjKTpwLnNldChmLFtjXSk7cmV0dXJuIHAuZWFjaChmdW5jdGlvbih0LG4pe3UodixuLG8odCxpLGEsdSkpfSksdn1yZXR1cm4gZT17b2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCx0byxubyl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsZW8scm8pfSxlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiB0KGUsbyl7aWYoKytvPnIubGVuZ3RoKXJldHVybiBlO3ZhciBhLHU9aVtvLTFdO3JldHVybiBudWxsIT1uJiZvPj1yLmxlbmd0aD9hPWUuZW50cmllcygpOihhPVtdLGUuZWFjaChmdW5jdGlvbihuLGUpe2EucHVzaCh7a2V5OmUsdmFsdWVzOnQobixvKX0pfSkpLG51bGwhPXU/YS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHUodC5rZXksbi5rZXkpfSk6YX0obyh0LDAsZW8scm8pLDApfSxrZXk6ZnVuY3Rpb24odCl7cmV0dXJuIHIucHVzaCh0KSxlfSxzb3J0S2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaVtyLmxlbmd0aC0xXT10LGV9LHNvcnRWYWx1ZXM6ZnVuY3Rpb24obil7cmV0dXJuIHQ9bixlfSxyb2xsdXA6ZnVuY3Rpb24odCl7cmV0dXJuIG49dCxlfX19LHQuc2V0PWFvLHQubWFwPUtpLHQua2V5cz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goZSk7cmV0dXJuIG59LHQudmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh0W2VdKTtyZXR1cm4gbn0sdC5lbnRyaWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh7a2V5OmUsdmFsdWU6dFtlXX0pO3JldHVybiBufSx0LmNvbG9yPXZuLHQucmdiPWJuLHQuaHNsPU1uLHQubGFiPVVuLHQuaGNsPUhuLHQubGNoPWZ1bmN0aW9uKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4oZSxuLHQsbnVsbD09cj8xOnIpfSx0LmdyYXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IHFuKHQsMCwwLG51bGw9PW4/MTpuKX0sdC5jdWJlaGVsaXg9S24sdC5jb250b3Vycz1nbyx0LmNvbnRvdXJEZW5zaXR5PWZ1bmN0aW9uKCl7dmFyIHQ9Ym8sbj1tbyxlPXhvLHI9OTYwLGk9NTAwLG89MjAsYT0yLHU9MypvLGY9cisyKnU+PmEsYz1pKzIqdT4+YSxzPWNvKDIwKTtmdW5jdGlvbiBsKHIpe3ZhciBpPW5ldyBGbG9hdDMyQXJyYXkoZipjKSxsPW5ldyBGbG9hdDMyQXJyYXkoZipjKTtyLmZvckVhY2goZnVuY3Rpb24ocixvLHMpe3ZhciBsPSt0KHIsbyxzKSt1Pj5hLGg9K24ocixvLHMpK3U+PmEsZD0rZShyLG8scyk7bD49MCYmbDxmJiZoPj0wJiZoPGMmJihpW2wraCpmXSs9ZCl9KSx5byh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0sbz4+YSksX28oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LG8+PmEpLHlvKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSxvPj5hKSxfbyh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0sbz4+YSkseW8oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LG8+PmEpLF9vKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSxvPj5hKTt2YXIgZD1zKGkpO2lmKCFBcnJheS5pc0FycmF5KGQpKXt2YXIgcD1UKGkpO2Q9dygwLHAsZCksKGQ9ZygwLE1hdGguZmxvb3IocC9kKSpkLGQpKS5zaGlmdCgpfXJldHVybiBnbygpLnRocmVzaG9sZHMoZCkuc2l6ZShbZixjXSkoaSkubWFwKGgpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQudmFsdWUqPU1hdGgucG93KDIsLTIqYSksdC5jb29yZGluYXRlcy5mb3JFYWNoKGQpLHR9ZnVuY3Rpb24gZCh0KXt0LmZvckVhY2gocCl9ZnVuY3Rpb24gcCh0KXt0LmZvckVhY2godil9ZnVuY3Rpb24gdih0KXt0WzBdPXRbMF0qTWF0aC5wb3coMixhKS11LHRbMV09dFsxXSpNYXRoLnBvdygyLGEpLXV9ZnVuY3Rpb24geSgpe3JldHVybiBmPXIrMioodT0zKm8pPj5hLGM9aSsyKnU+PmEsbH1yZXR1cm4gbC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y28oK24pLGwpOnR9LGwueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTpufSxsLndlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTplfSxsLnNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3IsaV07dmFyIG49TWF0aC5jZWlsKHRbMF0pLGU9TWF0aC5jZWlsKHRbMV0pO2lmKCEobj49MHx8bj49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gcj1uLGk9ZSx5KCl9LGwuY2VsbFNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIDE8PGE7aWYoISgodD0rdCk+PTEpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjZWxsIHNpemUiKTtyZXR1cm4gYT1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx5KCl9LGwudGhyZXNob2xkcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkFycmF5LmlzQXJyYXkodCk/Y28odW8uY2FsbCh0KSk6Y28odCksbCk6c30sbC5iYW5kd2lkdGg9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIE1hdGguc3FydChvKihvKzEpKTtpZighKCh0PSt0KT49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJhbmR3aWR0aCIpO3JldHVybiBvPU1hdGgucm91bmQoKE1hdGguc3FydCg0KnQqdCsxKS0xKS8yKSx5KCl9LGx9LHQuZGlzcGF0Y2g9SSx0LmRyYWc9ZnVuY3Rpb24oKXt2YXIgbixlLHIsaSxvPVd0LGE9WnQsdT1RdCxmPUp0LGM9e30scz1JKCJzdGFydCIsImRyYWciLCJlbmQiKSxsPTAsaD0wO2Z1bmN0aW9uIGQodCl7dC5vbigibW91c2Vkb3duLmRyYWciLHApLmZpbHRlcihmKS5vbigidG91Y2hzdGFydC5kcmFnIix5KS5vbigidG91Y2htb3ZlLmRyYWciLF8pLm9uKCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWciLGIpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBwKCl7aWYoIWkmJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdT1tKCJtb3VzZSIsYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksRnQsdGhpcyxhcmd1bWVudHMpO3UmJihEdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsdiwhMCkub24oIm1vdXNldXAuZHJhZyIsZywhMCksWHQodC5ldmVudC52aWV3KSxIdCgpLHI9ITEsbj10LmV2ZW50LmNsaWVudFgsZT10LmV2ZW50LmNsaWVudFksdSgic3RhcnQiKSl9fWZ1bmN0aW9uIHYoKXtpZihqdCgpLCFyKXt2YXIgaT10LmV2ZW50LmNsaWVudFgtbixvPXQuZXZlbnQuY2xpZW50WS1lO3I9aSppK28qbz5ofWMubW91c2UoImRyYWciKX1mdW5jdGlvbiBnKCl7RHQodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsciksanQoKSxjLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiB5KCl7aWYoby5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmxlbmd0aDtmb3Iobj0wO248dTsrK24pKGU9bShyW25dLmlkZW50aWZpZXIsaSxJdCx0aGlzLGFyZ3VtZW50cykpJiYoSHQoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gXygpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPWNbcltuXS5pZGVudGlmaWVyXSkmJihqdCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYigpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLG89ci5sZW5ndGg7Zm9yKGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPW51bGx9LDUwMCksbj0wO248bzsrK24pKGU9Y1tyW25dLmlkZW50aWZpZXJdKSYmKEh0KCksZSgiZW5kIikpfWZ1bmN0aW9uIG0obixlLHIsaSxvKXt2YXIgYSxmLGgscD1yKGUsbiksdj1zLmNvcHkoKTtpZihDdChuZXcgJHQoZCwiYmVmb3Jlc3RhcnQiLGEsbixsLHBbMF0scFsxXSwwLDAsdiksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPXUuYXBwbHkoaSxvKSkmJihmPWEueC1wWzBdfHwwLGg9YS55LXBbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQodSl7dmFyIHMsZz1wO3N3aXRjaCh1KXtjYXNlInN0YXJ0IjpjW25dPXQscz1sKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBjW25dLC0tbDtjYXNlImRyYWciOnA9cihlLG4pLHM9bH1DdChuZXcgJHQoZCx1LGEsbixzLHBbMF0rZixwWzFdK2gscFswXS1nWzBdLHBbMV0tZ1sxXSx2KSx2LmFwcGx5LHYsW3UsaSxvXSl9fXJldHVybiBkLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6b30sZC5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTphfSxkLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTp1fSxkLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6Zn0sZC5vbj1mdW5jdGlvbigpe3ZhciB0PXMub24uYXBwbHkocyxhcmd1bWVudHMpO3JldHVybiB0PT09cz9kOnR9LGQuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0odD0rdCkqdCxkKTpNYXRoLnNxcnQoaCl9LGR9LHQuZHJhZ0Rpc2FibGU9WHQsdC5kcmFnRW5hYmxlPUd0LHQuZHN2Rm9ybWF0PUVvLHQuY3N2UGFyc2U9Q28sdC5jc3ZQYXJzZVJvd3M9UG8sdC5jc3ZGb3JtYXQ9em8sdC5jc3ZGb3JtYXRSb3dzPVJvLHQudHN2UGFyc2U9RG8sdC50c3ZQYXJzZVJvd3M9VW8sdC50c3ZGb3JtYXQ9cW8sdC50c3ZGb3JtYXRSb3dzPU9vLHQuZWFzZUxpbmVhcj1mdW5jdGlvbih0KXtyZXR1cm4rdH0sdC5lYXNlUXVhZD1Ecix0LmVhc2VRdWFkSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdH0sdC5lYXNlUXVhZE91dD1mdW5jdGlvbih0KXtyZXR1cm4gdCooMi10KX0sdC5lYXNlUXVhZEluT3V0PURyLHQuZWFzZUN1YmljPVVyLHQuZWFzZUN1YmljSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0fSx0LmVhc2VDdWJpY091dD1mdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LHQuZWFzZUN1YmljSW5PdXQ9VXIsdC5lYXNlUG9seT1Zcix0LmVhc2VQb2x5SW49cXIsdC5lYXNlUG9seU91dD1Pcix0LmVhc2VQb2x5SW5PdXQ9WXIsdC5lYXNlU2luPUlyLHQuZWFzZVNpbkluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguY29zKHQqRnIpfSx0LmVhc2VTaW5PdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqRnIpfSx0LmVhc2VTaW5Jbk91dD1Jcix0LmVhc2VFeHA9SHIsdC5lYXNlRXhwSW49ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqdC0xMCl9LHQuZWFzZUV4cE91dD1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnBvdygyLC0xMCp0KX0sdC5lYXNlRXhwSW5PdXQ9SHIsdC5lYXNlQ2lyY2xlPWpyLHQuZWFzZUNpcmNsZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9LHQuZWFzZUNpcmNsZU91dD1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX0sdC5lYXNlQ2lyY2xlSW5PdXQ9anIsdC5lYXNlQm91bmNlPW5pLHQuZWFzZUJvdW5jZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLW5pKDEtdCl9LHQuZWFzZUJvdW5jZU91dD1uaSx0LmVhc2VCb3VuY2VJbk91dD1mdW5jdGlvbih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtbmkoMS10KTpuaSh0LTEpKzEpLzJ9LHQuZWFzZUJhY2s9aWksdC5lYXNlQmFja0luPWVpLHQuZWFzZUJhY2tPdXQ9cmksdC5lYXNlQmFja0luT3V0PWlpLHQuZWFzZUVsYXN0aWM9dWksdC5lYXNlRWxhc3RpY0luPWFpLHQuZWFzZUVsYXN0aWNPdXQ9dWksdC5lYXNlRWxhc3RpY0luT3V0PWZpLHQuYmxvYj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oWW8pfSx0LmJ1ZmZlcj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oQm8pfSx0LmRzdj1mdW5jdGlvbih0LG4sZSxyKXszPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApO3ZhciBpPUVvKHQpO3JldHVybiBJbyhuLGUpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGkucGFyc2UodCxyKX0pfSx0LmNzdj1qbyx0LnRzdj1Ybyx0LmltYWdlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscil7dmFyIGk9bmV3IEltYWdlO2Zvcih2YXIgbyBpbiBuKWlbb109bltvXTtpLm9uZXJyb3I9cixpLm9ubG9hZD1mdW5jdGlvbigpe2UoaSl9LGkuc3JjPXR9KX0sdC5qc29uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZldGNoKHQsbikudGhlbihHbyl9LHQudGV4dD1Jbyx0LnhtbD0kbyx0Lmh0bWw9V28sdC5zdmc9Wm8sdC5mb3JjZUNlbnRlcj1mdW5jdGlvbih0LG4pe3ZhciBlO2Z1bmN0aW9uIHIoKXt2YXIgcixpLG89ZS5sZW5ndGgsYT0wLHU9MDtmb3Iocj0wO3I8bzsrK3IpYSs9KGk9ZVtyXSkueCx1Kz1pLnk7Zm9yKGE9YS9vLXQsdT11L28tbixyPTA7cjxvOysrcikoaT1lW3JdKS54LT1hLGkueS09dX1yZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09biYmKG49MCksci5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dH0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxyKTpufSxyfSx0LmZvcmNlQ29sbGlkZT1mdW5jdGlvbih0KXt2YXIgbixlLHI9MSxpPTE7ZnVuY3Rpb24gbygpe2Zvcih2YXIgdCxvLHUsZixjLHMsbCxoPW4ubGVuZ3RoLGQ9MDtkPGk7KytkKWZvcihvPXJhKG4sdWEsZmEpLnZpc2l0QWZ0ZXIoYSksdD0wO3Q8aDsrK3QpdT1uW3RdLHM9ZVt1LmluZGV4XSxsPXMqcyxmPXUueCt1LnZ4LGM9dS55K3Uudnksby52aXNpdChwKTtmdW5jdGlvbiBwKHQsbixlLGksbyl7dmFyIGE9dC5kYXRhLGg9dC5yLGQ9cytoO2lmKCFhKXJldHVybiBuPmYrZHx8aTxmLWR8fGU+YytkfHxvPGMtZDtpZihhLmluZGV4PnUuaW5kZXgpe3ZhciBwPWYtYS54LWEudngsdj1jLWEueS1hLnZ5LGc9cCpwK3YqdjtnPGQqZCYmKDA9PT1wJiYoZys9KHA9Sm8oKSkqcCksMD09PXYmJihnKz0odj1KbygpKSp2KSxnPShkLShnPU1hdGguc3FydChnKSkpL2cqcix1LnZ4Kz0ocCo9ZykqKGQ9KGgqPWgpLyhsK2gpKSx1LnZ5Kz0odio9ZykqZCxhLnZ4LT1wKihkPTEtZCksYS52eS09dipkKX19fWZ1bmN0aW9uIGEodCl7aWYodC5kYXRhKXJldHVybiB0LnI9ZVt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgbj10LnI9MDtuPDQ7KytuKXRbbl0mJnRbbl0ucj50LnImJih0LnI9dFtuXS5yKX1mdW5jdGlvbiB1KCl7aWYobil7dmFyIHIsaSxvPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShvKSxyPTA7cjxvOysrcilpPW5bcl0sZVtpLmluZGV4XT0rdChpLHIsbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzE6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LHUoKX0sby5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG8pOml9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbyk6cn0sby5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksdSgpLG8pOnR9LG99LHQuZm9yY2VMaW5rPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sYT1jYSx1PWZ1bmN0aW9uKHQpe3JldHVybiAxL01hdGgubWluKGlbdC5zb3VyY2UuaW5kZXhdLGlbdC50YXJnZXQuaW5kZXhdKX0sZj1RbygzMCksYz0xO2Z1bmN0aW9uIHMocil7Zm9yKHZhciBpPTAsYT10Lmxlbmd0aDtpPGM7KytpKWZvcih2YXIgdSxmLHMsbCxoLGQscCx2PTA7djxhOysrdilmPSh1PXRbdl0pLnNvdXJjZSxsPShzPXUudGFyZ2V0KS54K3MudngtZi54LWYudnh8fEpvKCksaD1zLnkrcy52eS1mLnktZi52eXx8Sm8oKSxsKj1kPSgoZD1NYXRoLnNxcnQobCpsK2gqaCkpLWVbdl0pL2QqcipuW3ZdLGgqPWQscy52eC09bCoocD1vW3ZdKSxzLnZ5LT1oKnAsZi52eCs9bCoocD0xLXApLGYudnkrPWgqcH1mdW5jdGlvbiBsKCl7aWYocil7dmFyIHUsZixjPXIubGVuZ3RoLHM9dC5sZW5ndGgsbD1LaShyLGEpO2Zvcih1PTAsaT1uZXcgQXJyYXkoYyk7dTxzOysrdSkoZj10W3VdKS5pbmRleD11LCJvYmplY3QiIT10eXBlb2YgZi5zb3VyY2UmJihmLnNvdXJjZT1zYShsLGYuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBmLnRhcmdldCYmKGYudGFyZ2V0PXNhKGwsZi50YXJnZXQpKSxpW2Yuc291cmNlLmluZGV4XT0oaVtmLnNvdXJjZS5pbmRleF18fDApKzEsaVtmLnRhcmdldC5pbmRleF09KGlbZi50YXJnZXQuaW5kZXhdfHwwKSsxO2Zvcih1PTAsbz1uZXcgQXJyYXkocyk7dTxzOysrdSlmPXRbdV0sb1t1XT1pW2Yuc291cmNlLmluZGV4XS8oaVtmLnNvdXJjZS5pbmRleF0raVtmLnRhcmdldC5pbmRleF0pO249bmV3IEFycmF5KHMpLGgoKSxlPW5ldyBBcnJheShzKSxkKCl9fWZ1bmN0aW9uIGgoKXtpZihyKWZvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpOysrZSluW2VdPSt1KHRbZV0sZSx0KX1mdW5jdGlvbiBkKCl7aWYocilmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTsrK24pZVtuXT0rZih0W25dLG4sdCl9cmV0dXJuIG51bGw9PXQmJih0PVtdKSxzLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGwoKX0scy5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGwoKSxzKTp0fSxzLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQscyk6YX0scy5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LHMpOmN9LHMuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksaCgpLHMpOnV9LHMuZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksZCgpLHMpOmZ9LHN9LHQuZm9yY2VNYW55Qm9keT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGk9UW8oLTMwKSxvPTEsYT0xLzAsdT0uODE7ZnVuY3Rpb24gZihyKXt2YXIgaSxvPXQubGVuZ3RoLGE9cmEodCxsYSxoYSkudmlzaXRBZnRlcihzKTtmb3IoZT1yLGk9MDtpPG87KytpKW49dFtpXSxhLnZpc2l0KGwpfWZ1bmN0aW9uIGMoKXtpZih0KXt2YXIgbixlLG89dC5sZW5ndGg7Zm9yKHI9bmV3IEFycmF5KG8pLG49MDtuPG87KytuKWU9dFtuXSxyW2UuaW5kZXhdPStpKGUsbix0KX19ZnVuY3Rpb24gcyh0KXt2YXIgbixlLGksbyxhLHU9MCxmPTA7aWYodC5sZW5ndGgpe2ZvcihpPW89YT0wO2E8NDsrK2EpKG49dFthXSkmJihlPU1hdGguYWJzKG4udmFsdWUpKSYmKHUrPW4udmFsdWUsZis9ZSxpKz1lKm4ueCxvKz1lKm4ueSk7dC54PWkvZix0Lnk9by9mfWVsc2V7KG49dCkueD1uLmRhdGEueCxuLnk9bi5kYXRhLnk7ZG97dSs9cltuLmRhdGEuaW5kZXhdfXdoaWxlKG49bi5uZXh0KX10LnZhbHVlPXV9ZnVuY3Rpb24gbCh0LGksZixjKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgcz10Lngtbi54LGw9dC55LW4ueSxoPWMtaSxkPXMqcytsKmw7aWYoaCpoL3U8ZClyZXR1cm4gZDxhJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpLG4udngrPXMqdC52YWx1ZSplL2Qsbi52eSs9bCp0LnZhbHVlKmUvZCksITA7aWYoISh0Lmxlbmd0aHx8ZD49YSkpeyh0LmRhdGEhPT1ufHx0Lm5leHQpJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpKTtkb3t0LmRhdGEhPT1uJiYoaD1yW3QuZGF0YS5pbmRleF0qZS9kLG4udngrPXMqaCxuLnZ5Kz1sKmgpfXdoaWxlKHQ9dC5uZXh0KX19cmV0dXJuIGYuaW5pdGlhbGl6ZT1mdW5jdGlvbihuKXt0PW4sYygpfSxmLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGMoKSxmKTppfSxmLmRpc3RhbmNlTWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQqdCxmKTpNYXRoLnNxcnQobyl9LGYuZGlzdGFuY2VNYXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGYpOk1hdGguc3FydChhKX0sZi50aGV0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10KnQsZik6TWF0aC5zcXJ0KHUpfSxmfSx0LmZvcmNlUmFkaWFsPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYT1RbyguMSk7ZnVuY3Rpb24gdSh0KXtmb3IodmFyIGE9MCx1PXIubGVuZ3RoO2E8dTsrK2Epe3ZhciBmPXJbYV0sYz1mLngtbnx8MWUtNixzPWYueS1lfHwxZS02LGw9TWF0aC5zcXJ0KGMqYytzKnMpLGg9KG9bYV0tbCkqaVthXSp0L2w7Zi52eCs9YypoLGYudnkrPXMqaH19ZnVuY3Rpb24gZigpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKW9bbl09K3QocltuXSxuLHIpLGlbbl09aXNOYU4ob1tuXSk/MDorYShyW25dLG4scil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbygrdCkpLG51bGw9PW4mJihuPTApLG51bGw9PWUmJihlPTApLHUuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZigpfSx1LnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGYoKSx1KTphfSx1LnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlFvKCtuKSxmKCksdSk6dH0sdS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHUpOm59LHUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCx1KTplfSx1fSx0LmZvcmNlU2ltdWxhdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlPTEscj0uMDAxLGk9MS1NYXRoLnBvdyhyLDEvMzAwKSxvPTAsYT0uNix1PUtpKCksZj11cihzKSxjPUkoInRpY2siLCJlbmQiKTtmdW5jdGlvbiBzKCl7bCgpLGMuY2FsbCgidGljayIsbiksZTxyJiYoZi5zdG9wKCksYy5jYWxsKCJlbmQiLG4pKX1mdW5jdGlvbiBsKCl7dmFyIG4scixmPXQubGVuZ3RoO2ZvcihlKz0oby1lKSppLHUuZWFjaChmdW5jdGlvbih0KXt0KGUpfSksbj0wO248ZjsrK24pbnVsbD09KHI9dFtuXSkuZng/ci54Kz1yLnZ4Kj1hOihyLng9ci5meCxyLnZ4PTApLG51bGw9PXIuZnk/ci55Kz1yLnZ5Kj1hOihyLnk9ci5meSxyLnZ5PTApfWZ1bmN0aW9uIGgoKXtmb3IodmFyIG4sZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl7aWYoKG49dFtlXSkuaW5kZXg9ZSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT1kYSpNYXRoLnNxcnQoZSksbz1lKnBhO24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBkKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0KSxufXJldHVybiBudWxsPT10JiYodD1bXSksaCgpLG49e3RpY2s6bCxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIGYucmVzdGFydChzKSxufSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGYuc3RvcCgpLG59LG5vZGVzOmZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsaCgpLHUuZWFjaChkKSxuKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxuKTplfSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOitpfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxuKTpvfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPTEtdCxuKToxLWF9LGZvcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09ZT91LnJlbW92ZSh0KTp1LnNldCh0LGQoZSkpLG4pOnUuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLGEsdSxmLGM9MCxzPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIsYz0wO2M8czsrK2MpKGE9KGk9bi0odT10W2NdKS54KSppKyhvPWUtdS55KSpvKTxyJiYoZj11LHI9YSk7cmV0dXJuIGZ9LG9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oYy5vbih0LGUpLG4pOmMub24odCl9fX0sdC5mb3JjZVg9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGk9UW8oLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciBpLG89MCxhPW4ubGVuZ3RoO288YTsrK28pKGk9bltvXSkudngrPShyW29dLWkueCkqZVtvXSp0fWZ1bmN0aW9uIGEoKXtpZihuKXt2YXIgbyxhPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKSxyPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyllW29dPWlzTmFOKHJbb109K3QobltvXSxvLG4pKT8wOitpKG5bb10sbyxuKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVFvKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGEoKSxvKTppfSxvLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksYSgpLG8pOnR9LG99LHQuZm9yY2VZPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVFvKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ5Kz0ocltvXS1pLnkpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxhKCksbyk6aX0sby55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLGEoKSxvKTp0fSxvfSx0LmZvcm1hdERlZmF1bHRMb2NhbGU9U2EsdC5mb3JtYXRMb2NhbGU9TmEsdC5mb3JtYXRTcGVjaWZpZXI9YmEsdC5wcmVjaXNpb25GaXhlZD1FYSx0LnByZWNpc2lvblByZWZpeD1rYSx0LnByZWNpc2lvblJvdW5kPUNhLHQuZ2VvQXJlYT1mdW5jdGlvbih0KXtyZXR1cm4geXUucmVzZXQoKSxzdSh0LF91KSwyKnl1fSx0Lmdlb0JvdW5kcz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGEsdTtpZihSdT16dT0tKEN1PVB1PTEvMCksT3U9W10sc3UodCxyZiksZT1PdS5sZW5ndGgpe2ZvcihPdS5zb3J0KGRmKSxuPTEsbz1bcj1PdVswXV07bjxlOysrbilwZihyLChpPU91W25dKVswXSl8fHBmKHIsaVsxXSk/KGhmKHJbMF0saVsxXSk+aGYoclswXSxyWzFdKSYmKHJbMV09aVsxXSksaGYoaVswXSxyWzFdKT5oZihyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKGE9LTEvMCxuPTAscj1vW2U9by5sZW5ndGgtMV07bjw9ZTtyPWksKytuKWk9b1tuXSwodT1oZihyWzFdLGlbMF0pKT5hJiYoYT11LEN1PWlbMF0senU9clsxXSl9cmV0dXJuIE91PVl1PW51bGwsQ3U9PT0xLzB8fFB1PT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW0N1LFB1XSxbenUsUnVdXX0sdC5nZW9DZW50cm9pZD1mdW5jdGlvbih0KXtCdT1GdT1JdT1IdT1qdT1YdT1HdT1WdT0kdT1XdT1adT0wLHN1KHQsdmYpO3ZhciBuPSR1LGU9V3Uscj1adSxpPW4qbitlKmUrcipyO3JldHVybiBpPFVhJiYobj1YdSxlPUd1LHI9VnUsRnU8RGEmJihuPUl1LGU9SHUscj1qdSksKGk9bipuK2UqZStyKnIpPFVhKT9bTmFOLE5hTl06W1hhKGUsbikqRmEsZXUoci9LYShpKSkqRmFdfSx0Lmdlb0NpcmNsZT1mdW5jdGlvbigpe3ZhciB0LG4sZT1OZihbMCwwXSkscj1OZig5MCksaT1OZig2KSxvPXtwb2ludDpmdW5jdGlvbihlLHIpe3QucHVzaChlPW4oZSxyKSksZVswXSo9RmEsZVsxXSo9RmF9fTtmdW5jdGlvbiBhKCl7dmFyIGE9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpJYSxmPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKklhO3JldHVybiB0PVtdLG49a2YoLWFbMF0qSWEsLWFbMV0qSWEsMCkuaW52ZXJ0LExmKG8sdSxmLDEpLGE9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOlt0XX0sdD1uPW51bGwsYX1yZXR1cm4gYS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZihbK3RbMF0sK3RbMV1dKSxhKTplfSxhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTpyfSxhLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTppfSxhfSx0Lmdlb0NsaXBBbnRpbWVyaWRpYW49R2YsdC5nZW9DbGlwQ2lyY2xlPVZmLHQuZ2VvQ2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPTAsaT0wLG89OTYwLGE9NTAwO3JldHVybiBlPXtzdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIHQmJm49PT1lP3Q6dD1aZihyLGksbyxhKShuPWUpfSxleHRlbnQ6ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3VbMF1bMF0saT0rdVswXVsxXSxvPSt1WzFdWzBdLGE9K3VbMV1bMV0sdD1uPW51bGwsZSk6W1tyLGldLFtvLGFdXX19fSx0Lmdlb0NsaXBSZWN0YW5nbGU9WmYsdC5nZW9Db250YWlucz1mdW5jdGlvbih0LG4pe3JldHVybih0JiZjYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP2NjW3QudHlwZV06bGMpKHQsbil9LHQuZ2VvRGlzdGFuY2U9ZmMsdC5nZW9HcmF0aWN1bGU9YmMsdC5nZW9HcmF0aWN1bGUxMD1mdW5jdGlvbigpe3JldHVybiBiYygpKCl9LHQuZ2VvSW50ZXJwb2xhdGU9ZnVuY3Rpb24odCxuKXt2YXIgZT10WzBdKklhLHI9dFsxXSpJYSxpPW5bMF0qSWEsbz1uWzFdKklhLGE9R2EociksdT1RYShyKSxmPUdhKG8pLGM9UWEobykscz1hKkdhKGUpLGw9YSpRYShlKSxoPWYqR2EoaSksZD1mKlFhKGkpLHA9MipldShLYShydShvLXIpK2EqZipydShpLWUpKSksdj1RYShwKSxnPXA/ZnVuY3Rpb24odCl7dmFyIG49UWEodCo9cCkvdixlPVFhKHAtdCkvdixyPWUqcytuKmgsaT1lKmwrbipkLG89ZSp1K24qYztyZXR1cm5bWGEoaSxyKSpGYSxYYShvLEthKHIqcitpKmkpKSpGYV19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqRmEscipGYV19O3JldHVybiBnLmRpc3RhbmNlPXAsZ30sdC5nZW9MZW5ndGg9b2MsdC5nZW9QYXRoPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPTQuNTtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJnIucG9pbnRSYWRpdXMoK2kuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxzdSh0LGUocikpKSxyLnJlc3VsdCgpfXJldHVybiBvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShTYykpLFNjLnJlc3VsdCgpfSxvLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShkcykpLGRzLnJlc3VsdCgpfSxvLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gc3UodCxlKFVjKSksVWMucmVzdWx0KCl9LG8uY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShaYykpLFpjLnJlc3VsdCgpfSxvLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09bj8odD1udWxsLG1jKToodD1uKS5zdHJlYW0sbyk6dH0sby5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/KG49bnVsbCxuZXcgZ3MpOm5ldyBhcyhuPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiBpJiZyLnBvaW50UmFkaXVzKGkpLG8pOm59LG8ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooci5wb2ludFJhZGl1cygrdCksK3QpLG8pOml9LG8ucHJvamVjdGlvbih0KS5jb250ZXh0KG4pfSx0Lmdlb0FsYmVycz1Ecyx0Lmdlb0FsYmVyc1VzYT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksbyxhPURzKCksdT1McygpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksZj1McygpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbih0LG4pe289W3Qsbl19fTtmdW5jdGlvbiBzKHQpe3ZhciBuPXRbMF0sYT10WzFdO3JldHVybiBvPW51bGwsZS5wb2ludChuLGEpLG98fChyLnBvaW50KG4sYSksbyl8fChpLnBvaW50KG4sYSksbyl9ZnVuY3Rpb24gbCgpe3JldHVybiB0PW49bnVsbCxzfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1hLnNjYWxlKCksZT1hLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND91Omk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/ZjphKS5pbnZlcnQodCl9LHMuc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OihyPVthLnN0cmVhbShuPWUpLHUuc3RyZWFtKGUpLGYuc3RyZWFtKGUpXSxpPXIubGVuZ3RoLHQ9e3BvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPS0xOysrZTxpOylyW2VdLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25FbmQoKX19KTt2YXIgcixpfSxzLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCksdS5wcmVjaXNpb24odCksZi5wcmVjaXNpb24odCksbCgpKTphLnByZWNpc2lvbigpfSxzLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHUuc2NhbGUoLjM1KnQpLGYuc2NhbGUodCkscy50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0scy50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIG49YS5zY2FsZSgpLG89K3RbMF0scz0rdFsxXTtyZXR1cm4gZT1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1Km4scy0uMjM4Km5dLFtvKy40NTUqbixzKy4yMzgqbl1dKS5zdHJlYW0oYykscj11LnRyYW5zbGF0ZShbby0uMzA3Km4scysuMjAxKm5dKS5jbGlwRXh0ZW50KFtbby0uNDI1Km4rRGEscysuMTIqbitEYV0sW28tLjIxNCpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxpPWYudHJhbnNsYXRlKFtvLS4yMDUqbixzKy4yMTIqbl0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqbitEYSxzKy4xNjYqbitEYV0sW28tLjExNSpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxsKCl9LHMuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKHMsdCxuKX0scy5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKHMsdCxuKX0scy5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhzLHQsbil9LHMuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKHMsdCxuKX0scy5zY2FsZSgxMDcwKX0sdC5nZW9BemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoT3MpLnNjYWxlKDEyNC43NSkuY2xpcEFuZ2xlKDE3OS45OTkpfSx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdz1Pcyx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIENzKFlzKS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnRSYXc9WXMsdC5nZW9Db25pY0NvbmZvcm1hbD1mdW5jdGlvbigpe3JldHVybiB6cyhIcykuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX0sdC5nZW9Db25pY0NvbmZvcm1hbFJhdz1Icyx0Lmdlb0NvbmljRXF1YWxBcmVhPUxzLHQuZ2VvQ29uaWNFcXVhbEFyZWFSYXc9UnMsdC5nZW9Db25pY0VxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHpzKFhzKS5zY2FsZSgxMzEuMTU0KS5jZW50ZXIoWzAsMTMuOTM4OV0pfSx0Lmdlb0NvbmljRXF1aWRpc3RhbnRSYXc9WHMsdC5nZW9FcXVhbEVhcnRoPWZ1bmN0aW9uKCl7cmV0dXJuIENzKFFzKS5zY2FsZSgxNzcuMTU4KX0sdC5nZW9FcXVhbEVhcnRoUmF3PVFzLHQuZ2VvRXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIENzKGpzKS5zY2FsZSgxNTIuNjMpfSx0Lmdlb0VxdWlyZWN0YW5ndWxhclJhdz1qcyx0Lmdlb0dub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKEpzKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSx0Lmdlb0dub21vbmljUmF3PUpzLHQuZ2VvSWRlbnRpdHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpLG8sYT0xLHU9MCxmPTAsYz0xLHM9MSxsPW1jLGg9bnVsbCxkPW1jO2Z1bmN0aW9uIHAoKXtyZXR1cm4gcj1pPW51bGwsb31yZXR1cm4gbz17c3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiByJiZpPT09dD9yOnI9bChkKGk9dCkpfSxwb3N0Y2xpcDpmdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1yLGg9dD1uPWU9bnVsbCxwKCkpOmR9LGNsaXBFeHRlbnQ6ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9bnVsbD09cj8oaD10PW49ZT1udWxsLG1jKTpaZihoPStyWzBdWzBdLHQ9K3JbMF1bMV0sbj0rclsxXVswXSxlPStyWzFdWzFdKSxwKCkpOm51bGw9PWg/bnVsbDpbW2gsdF0sW24sZV1dfSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcygoYT0rdCkqYyxhKnMsdSxmKSxwKCkpOmF9LHRyYW5zbGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSpzLHU9K3RbMF0sZj0rdFsxXSkscCgpKTpbdSxmXX0scmVmbGVjdFg6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSooYz10Py0xOjEpLGEqcyx1LGYpLHAoKSk6YzwwfSxyZWZsZWN0WTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSoocz10Py0xOjEpLHUsZikscCgpKTpzPDB9LGZpdEV4dGVudDpmdW5jdGlvbih0LG4pe3JldHVybiB4cyhvLHQsbil9LGZpdFNpemU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gd3Mobyx0LG4pfSxmaXRXaWR0aDpmdW5jdGlvbih0LG4pe3JldHVybiBNcyhvLHQsbil9LGZpdEhlaWdodDpmdW5jdGlvbih0LG4pe3JldHVybiBBcyhvLHQsbil9fX0sdC5nZW9Qcm9qZWN0aW9uPUNzLHQuZ2VvUHJvamVjdGlvbk11dGF0b3I9UHMsdC5nZW9NZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBGcyhCcykuc2NhbGUoOTYxL0JhKX0sdC5nZW9NZXJjYXRvclJhdz1Ccyx0Lmdlb05hdHVyYWxFYXJ0aDE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3ModGwpLnNjYWxlKDE3NS4yOTUpfSx0Lmdlb05hdHVyYWxFYXJ0aDFSYXc9dGwsdC5nZW9PcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MobmwpLnNjYWxlKDI0OS41KS5jbGlwQW5nbGUoOTArRGEpfSx0Lmdlb09ydGhvZ3JhcGhpY1Jhdz1ubCx0Lmdlb1N0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoZWwpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LHQuZ2VvU3RlcmVvZ3JhcGhpY1Jhdz1lbCx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3ZhciB0PUZzKHJsKSxuPXQuY2VudGVyLGU9dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oWy10WzFdLHRbMF1dKTpbKHQ9bigpKVsxXSwtdFswXV19LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKTpbKHQ9ZSgpKVswXSx0WzFdLHRbMl0tOTBdfSxlKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc9cmwsdC5nZW9Sb3RhdGlvbj1SZix0Lmdlb1N0cmVhbT1zdSx0Lmdlb1RyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOl9zKHQpfX0sdC5jbHVzdGVyPWZ1bmN0aW9uKCl7dmFyIHQ9aWwsbj0xLGU9MSxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYT0wO2kuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe3ZhciBlPW4uY2hpbGRyZW47ZT8obi54PWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZShvbCwwKS90Lmxlbmd0aH0oZSksbi55PWZ1bmN0aW9uKHQpe3JldHVybiAxK3QucmVkdWNlKGFsLDApfShlKSk6KG4ueD1vP2ErPXQobixvKTowLG4ueT0wLG89bil9KTt2YXIgdT1mdW5jdGlvbih0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bMF07cmV0dXJuIHR9KGkpLGY9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uW24ubGVuZ3RoLTFdO3JldHVybiB0fShpKSxjPXUueC10KHUsZikvMixzPWYueCt0KGYsdSkvMjtyZXR1cm4gaS5lYWNoQWZ0ZXIocj9mdW5jdGlvbih0KXt0Lng9KHQueC1pLngpKm4sdC55PShpLnktdC55KSplfTpmdW5jdGlvbih0KXt0Lng9KHQueC1jKS8ocy1jKSpuLHQueT0oMS0oaS55P3QueS9pLnk6MSkpKmV9KX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC5oaWVyYXJjaHk9ZmwsdC5wYWNrPWZ1bmN0aW9uKCl7dmFyIHQ9bnVsbCxuPTEsZT0xLHI9RWw7ZnVuY3Rpb24gaShpKXtyZXR1cm4gaS54PW4vMixpLnk9ZS8yLHQ/aS5lYWNoQmVmb3JlKFBsKHQpKS5lYWNoQWZ0ZXIoemwociwuNSkpLmVhY2hCZWZvcmUoUmwoMSkpOmkuZWFjaEJlZm9yZShQbChDbCkpLmVhY2hBZnRlcih6bChFbCwxKSkuZWFjaEFmdGVyKHpsKHIsaS5yL01hdGgubWluKG4sZSkpKS5lYWNoQmVmb3JlKFJsKE1hdGgubWluKG4sZSkvKDIqaS5yKSkpLGl9cmV0dXJuIGkucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PShlPW4pP251bGw6U2woZSksaSk6dDt2YXIgZX0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0WzBdLGU9K3RbMV0saSk6W24sZV19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtsKCt0KSxpKTpyfSxpfSx0LnBhY2tTaWJsaW5ncz1mdW5jdGlvbih0KXtyZXR1cm4gTmwodCksdH0sdC5wYWNrRW5jbG9zZT1wbCx0LnBhcnRpdGlvbj1mdW5jdGlvbigpe3ZhciB0PTEsbj0xLGU9MCxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG89aS5oZWlnaHQrMTtyZXR1cm4gaS54MD1pLnkwPWUsaS54MT10LGkueTE9bi9vLGkuZWFjaEJlZm9yZShmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihyKXtyLmNoaWxkcmVuJiZEbChyLHIueDAsdCooci5kZXB0aCsxKS9uLHIueDEsdCooci5kZXB0aCsyKS9uKTt2YXIgaT1yLngwLG89ci55MCxhPXIueDEtZSx1PXIueTEtZTthPGkmJihpPWE9KGkrYSkvMiksdTxvJiYobz11PShvK3UpLzIpLHIueDA9aSxyLnkwPW8sci54MT1hLHIueTE9dX19KG4sbykpLHImJmkuZWFjaEJlZm9yZShMbCksaX1yZXR1cm4gaS5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIXQsaSk6cn0saS5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlWzBdLG49K2VbMV0saSk6W3Qsbl19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxpKTplfSxpfSx0LnN0cmF0aWZ5PWZ1bmN0aW9uKCl7dmFyIHQ9WWwsbj1CbDtmdW5jdGlvbiBlKGUpe3ZhciByLGksbyxhLHUsZixjLHM9ZS5sZW5ndGgsbD1uZXcgQXJyYXkocyksaD17fTtmb3IoaT0wO2k8czsrK2kpcj1lW2ldLHU9bFtpXT1uZXcgaGwociksbnVsbCE9KGY9dChyLGksZSkpJiYoZis9IiIpJiYoaFtjPVVsKyh1LmlkPWYpXT1jIGluIGg/T2w6dSk7Zm9yKGk9MDtpPHM7KytpKWlmKHU9bFtpXSxudWxsIT0oZj1uKGVbaV0saSxlKSkmJihmKz0iIikpe2lmKCEoYT1oW1VsK2ZdKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrZik7aWYoYT09PU9sKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2YpO2EuY2hpbGRyZW4/YS5jaGlsZHJlbi5wdXNoKHUpOmEuY2hpbGRyZW49W3VdLHUucGFyZW50PWF9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPXV9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9cWwsby5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLXN9KS5lYWNoQmVmb3JlKGxsKSxvLnBhcmVudD1udWxsLHM+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99cmV0dXJuIGUuaWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9U2wobiksZSk6dH0sZS5wYXJlbnRJZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1TbCh0KSxlKTpufSxlfSx0LnRyZWU9ZnVuY3Rpb24oKXt2YXIgdD1GbCxuPTEsZT0xLHI9bnVsbDtmdW5jdGlvbiBpKGkpe3ZhciBmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHIsaSxvLGE9bmV3IEdsKHQsMCksdT1bYV07bj11LnBvcCgpOylpZihyPW4uXy5jaGlsZHJlbilmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkobz1yLmxlbmd0aCksaT1vLTE7aT49MDstLWkpdS5wdXNoKGU9bi5jaGlsZHJlbltpXT1uZXcgR2wocltpXSxpKSksZS5wYXJlbnQ9bjtyZXR1cm4oYS5wYXJlbnQ9bmV3IEdsKG51bGwsMCkpLmNoaWxkcmVuPVthXSxhfShpKTtpZihmLmVhY2hBZnRlcihvKSxmLnBhcmVudC5tPS1mLnosZi5lYWNoQmVmb3JlKGEpLHIpaS5lYWNoQmVmb3JlKHUpO2Vsc2V7dmFyIGM9aSxzPWksbD1pO2kuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8Yy54JiYoYz10KSx0Lng+cy54JiYocz10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9Yz09PXM/MTp0KGMscykvMixkPWgtYy54LHA9bi8ocy54K2grZCksdj1lLyhsLmRlcHRofHwxKTtpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrZCkqcCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIGl9ZnVuY3Rpb24gbyhuKXt2YXIgZT1uLmNoaWxkcmVuLHI9bi5wYXJlbnQuY2hpbGRyZW4saT1uLmk/cltuLmktMV06bnVsbDtpZihlKXshZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9KG4pO3ZhciBvPShlWzBdLnorZVtlLmxlbmd0aC0xXS56KS8yO2k/KG4uej1pLnordChuLl8saS5fKSxuLm09bi56LW8pOm4uej1vfWVsc2UgaSYmKG4uej1pLnordChuLl8saS5fKSk7bi5wYXJlbnQuQT1mdW5jdGlvbihuLGUscil7aWYoZSl7Zm9yKHZhciBpLG89bixhPW4sdT1lLGY9by5wYXJlbnQuY2hpbGRyZW5bMF0sYz1vLm0scz1hLm0sbD11Lm0saD1mLm07dT1IbCh1KSxvPUlsKG8pLHUmJm87KWY9SWwoZiksKGE9SGwoYSkpLmE9biwoaT11LnorbC1vLnotYyt0KHUuXyxvLl8pKT4wJiYoamwoWGwodSxuLHIpLG4saSksYys9aSxzKz1pKSxsKz11Lm0sYys9by5tLGgrPWYubSxzKz1hLm07dSYmIUhsKGEpJiYoYS50PXUsYS5tKz1sLXMpLG8mJiFJbChmKSYmKGYudD1vLGYubSs9Yy1oLHI9bil9cmV0dXJuIHJ9KG4saSxuLnBhcmVudC5BfHxyWzBdKX1mdW5jdGlvbiBhKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiB1KHQpe3QueCo9bix0Lnk9dC5kZXB0aCplfXJldHVybiBpLnNlcGFyYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITEsbj0rdFswXSxlPSt0WzFdLGkpOnI/bnVsbDpbbixlXX0saS5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMCxuPSt0WzBdLGU9K3RbMV0saSk6cj9bbixlXTpudWxsfSxpfSx0LnRyZWVtYXA9ZnVuY3Rpb24oKXt2YXIgdD1abCxuPSExLGU9MSxyPTEsaT1bMF0sbz1FbCxhPUVsLHU9RWwsZj1FbCxjPUVsO2Z1bmN0aW9uIHModCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9ZSx0LnkxPXIsdC5lYWNoQmVmb3JlKGwpLGk9WzBdLG4mJnQuZWFjaEJlZm9yZShMbCksdH1mdW5jdGlvbiBsKG4pe3ZhciBlPWlbbi5kZXB0aF0scj1uLngwK2Uscz1uLnkwK2UsbD1uLngxLWUsaD1uLnkxLWU7bDxyJiYocj1sPShyK2wpLzIpLGg8cyYmKHM9aD0ocytoKS8yKSxuLngwPXIsbi55MD1zLG4ueDE9bCxuLnkxPWgsbi5jaGlsZHJlbiYmKGU9aVtuLmRlcHRoKzFdPW8obikvMixyKz1jKG4pLWUscys9YShuKS1lLChsLT11KG4pLWUpPHImJihyPWw9KHIrbCkvMiksKGgtPWYobiktZSk8cyYmKHM9aD0ocytoKS8yKSx0KG4scixzLGwsaCkpfXJldHVybiBzLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSEhdCxzKTpufSxzLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxzKTpbZSxyXX0scy50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVNsKG4pLHMpOnR9LHMucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9zLnBhZGRpbmdJbm5lcih0KS5wYWRkaW5nT3V0ZXIodCk6cy5wYWRkaW5nSW5uZXIoKX0scy5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6b30scy5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nVG9wKHQpLnBhZGRpbmdSaWdodCh0KS5wYWRkaW5nQm90dG9tKHQpLnBhZGRpbmdMZWZ0KHQpOnMucGFkZGluZ1RvcCgpfSxzLnBhZGRpbmdUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6YX0scy5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6dX0scy5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmZ9LHMucGFkZGluZ0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6Y30sc30sdC50cmVlbWFwQmluYXJ5PWZ1bmN0aW9uKHQsbixlLHIsaSl7dmFyIG8sYSx1PXQuY2hpbGRyZW4sZj11Lmxlbmd0aCxjPW5ldyBBcnJheShmKzEpO2ZvcihjWzBdPWE9bz0wO288ZjsrK28pY1tvKzFdPWErPXVbb10udmFsdWU7IWZ1bmN0aW9uIHQobixlLHIsaSxvLGEsZil7aWYobj49ZS0xKXt2YXIgcz11W25dO3JldHVybiBzLngwPWkscy55MD1vLHMueDE9YSx2b2lkKHMueTE9Zil9Zm9yKHZhciBsPWNbbl0saD1yLzIrbCxkPW4rMSxwPWUtMTtkPHA7KXt2YXIgdj1kK3A+Pj4xO2Nbdl08aD9kPXYrMTpwPXZ9aC1jW2QtMV08Y1tkXS1oJiZuKzE8ZCYmLS1kO3ZhciBnPWNbZF0tbCx5PXItZztpZihhLWk+Zi1vKXt2YXIgXz0oaSp5K2EqZykvcjt0KG4sZCxnLGksbyxfLGYpLHQoZCxlLHksXyxvLGEsZil9ZWxzZXt2YXIgYj0obyp5K2YqZykvcjt0KG4sZCxnLGksbyxhLGIpLHQoZCxlLHksaSxiLGEsZil9fSgwLGYsdC52YWx1ZSxuLGUscixpKX0sdC50cmVlbWFwRGljZT1EbCx0LnRyZWVtYXBTbGljZT1WbCx0LnRyZWVtYXBTbGljZURpY2U9ZnVuY3Rpb24odCxuLGUscixpKXsoMSZ0LmRlcHRoP1ZsOkRsKSh0LG4sZSxyLGkpfSx0LnRyZWVtYXBTcXVhcmlmeT1abCx0LnRyZWVtYXBSZXNxdWFyaWZ5PVFsLHQuaW50ZXJwb2xhdGU9bWUsdC5pbnRlcnBvbGF0ZUFycmF5PWRlLHQuaW50ZXJwb2xhdGVCYXNpcz1lZSx0LmludGVycG9sYXRlQmFzaXNDbG9zZWQ9cmUsdC5pbnRlcnBvbGF0ZURhdGU9cGUsdC5pbnRlcnBvbGF0ZURpc2NyZXRlPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fSx0LmludGVycG9sYXRlSHVlPWZ1bmN0aW9uKHQsbil7dmFyIGU9YWUoK3QsK24pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1lKHQpO3JldHVybiBuLTM2MCpNYXRoLmZsb29yKG4vMzYwKX19LHQuaW50ZXJwb2xhdGVOdW1iZXI9dmUsdC5pbnRlcnBvbGF0ZU9iamVjdD1nZSx0LmludGVycG9sYXRlUm91bmQ9eGUsdC5pbnRlcnBvbGF0ZVN0cmluZz1iZSx0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPUNlLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9UGUsdC5pbnRlcnBvbGF0ZVpvb209cWUsdC5pbnRlcnBvbGF0ZVJnYj1jZSx0LmludGVycG9sYXRlUmdiQmFzaXM9bGUsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzQ2xvc2VkPWhlLHQuaW50ZXJwb2xhdGVIc2w9WWUsdC5pbnRlcnBvbGF0ZUhzbExvbmc9QmUsdC5pbnRlcnBvbGF0ZUxhYj1mdW5jdGlvbih0LG4pe3ZhciBlPWZlKCh0PVVuKHQpKS5sLChuPVVuKG4pKS5sKSxyPWZlKHQuYSxuLmEpLGk9ZmUodC5iLG4uYiksbz1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fSx0LmludGVycG9sYXRlSGNsPUllLHQuaW50ZXJwb2xhdGVIY2xMb25nPUhlLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXg9WGUsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc9R2UsdC5waWVjZXdpc2U9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoLTEsaT1uWzBdLG89bmV3IEFycmF5KHI8MD8wOnIpO2U8cjspb1tlXT10KGksaT1uWysrZV0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1NYXRoLm1heCgwLE1hdGgubWluKHItMSxNYXRoLmZsb29yKHQqPXIpKSk7cmV0dXJuIG9bbl0odC1uKX19LHQucXVhbnRpemU9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWVbcl09dChyLyhuLTEpKTtyZXR1cm4gZX0sdC5wYXRoPUdpLHQucG9seWdvbkFyZWE9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj10Lmxlbmd0aCxpPXRbci0xXSxvPTA7KytlPHI7KW49aSxpPXRbZV0sbys9blsxXSppWzBdLW5bMF0qaVsxXTtyZXR1cm4gby8yfSx0LnBvbHlnb25DZW50cm9pZD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz0wLGE9MCx1PXRbaS0xXSxmPTA7KytyPGk7KW49dSx1PXRbcl0sZis9ZT1uWzBdKnVbMV0tdVswXSpuWzFdLG8rPShuWzBdK3VbMF0pKmUsYSs9KG5bMV0rdVsxXSkqZTtyZXR1cm5bby8oZio9MyksYS9mXX0sdC5wb2x5Z29uSHVsbD1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KEpsKSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1LbChyKSxhPUtsKGkpLHU9YVswXT09PW9bMF0sZj1hW2EubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxjPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pYy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSt1O248YS5sZW5ndGgtZjsrK24pYy5wdXNoKHRbclthW25dXVsyXV0pO3JldHVybiBjfSx0LnBvbHlnb25Db250YWlucz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1uWzBdLHU9blsxXSxmPW9bMF0sYz1vWzFdLHM9ITEsbD0wO2w8aTsrK2wpZT0obz10W2xdKVswXSwocj1vWzFdKT51IT1jPnUmJmE8KGYtZSkqKHUtcikvKGMtcikrZSYmKHM9IXMpLGY9ZSxjPXI7cmV0dXJuIHN9LHQucG9seWdvbkxlbmd0aD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1vWzBdLHU9b1sxXSxmPTA7KytyPGk7KW49YSxlPXUsbi09YT0obz10W3JdKVswXSxlLT11PW9bMV0sZis9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBmfSx0LnF1YWR0cmVlPXJhLHQucmFuZG9tVW5pZm9ybT1uaCx0LnJhbmRvbU5vcm1hbD1laCx0LnJhbmRvbUxvZ05vcm1hbD1yaCx0LnJhbmRvbUJhdGVzPW9oLHQucmFuZG9tSXJ3aW5IYWxsPWloLHQucmFuZG9tRXhwb25lbnRpYWw9YWgsdC5zY2FsZUJhbmQ9aGgsdC5zY2FsZVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQobil7dmFyIGU9bi5jb3B5O3JldHVybiBuLnBhZGRpbmc9bi5wYWRkaW5nT3V0ZXIsZGVsZXRlIG4ucGFkZGluZ0lubmVyLGRlbGV0ZSBuLnBhZGRpbmdPdXRlcixuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlKCkpfSxufShoaCgpLnBhZGRpbmdJbm5lcigxKSl9LHQuc2NhbGVJZGVudGl0eT1mdW5jdGlvbiB0KCl7dmFyIG49WzAsMV07ZnVuY3Rpb24gZSh0KXtyZXR1cm4rdH1yZXR1cm4gZS5pbnZlcnQ9ZSxlLmRvbWFpbj1lLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWZoLmNhbGwodCxwaCksZSk6bi5zbGljZSgpfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKX0seGgoZSl9LHQuc2NhbGVMaW5lYXI9ZnVuY3Rpb24gdCgpe3ZhciBuPW1oKGdoLHZlKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKG4sdCgpKX0seGgobil9LHQuc2NhbGVMb2c9ZnVuY3Rpb24gbigpe3ZhciBlPW1oKE1oLEFoKS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz1TaCgxMCksYT1OaCgxMCk7ZnVuY3Rpb24gdSgpe3JldHVybiBvPVNoKGkpLGE9TmgoaSkscigpWzBdPDAmJihvPUVoKG8pLGE9RWgoYSkpLGV9cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCx1KCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLHUoKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLHU9ZVswXSxmPWVbZS5sZW5ndGgtMV07KG49Zjx1KSYmKGg9dSx1PWYsZj1oKTt2YXIgYyxzLGwsaD1vKHUpLGQ9byhmKSxwPW51bGw9PXQ/MTA6K3Qsdj1bXTtpZighKGklMSkmJmQtaDxwKXtpZihoPU1hdGgucm91bmQoaCktMSxkPU1hdGgucm91bmQoZCkrMSx1PjApe2Zvcig7aDxkOysraClmb3Iocz0xLGM9YShoKTtzPGk7KytzKWlmKCEoKGw9YypzKTx1KSl7aWYobD5mKWJyZWFrO3YucHVzaChsKX19ZWxzZSBmb3IoO2g8ZDsrK2gpZm9yKHM9aS0xLGM9YShoKTtzPj0xOy0tcylpZighKChsPWMqcyk8dSkpe2lmKGw+ZilicmVhazt2LnB1c2gobCl9fWVsc2Ugdj1tKGgsZCxNYXRoLm1pbihkLWgscCkpLm1hcChhKTtyZXR1cm4gbj92LnJldmVyc2UoKTp2fSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtpZihudWxsPT1yJiYocj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7bnVsbD09biYmKG49MTApO3ZhciB1PU1hdGgubWF4KDEsaSpuL2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10L2EoTWF0aC5yb3VuZChvKHQpKSk7cmV0dXJuIG4qaTxpLS41JiYobio9aSksbjw9dT9yKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHIod2gocigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmZsb29yKG8odCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmNlaWwobyh0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKGUsbigpLmJhc2UoaSkpfSxlfSx0LnNjYWxlT3JkaW5hbD1saCx0LnNjYWxlSW1wbGljaXQ9c2gsdC5zY2FsZVBvdz1DaCx0LnNjYWxlU3FydD1mdW5jdGlvbigpe3JldHVybiBDaCgpLmV4cG9uZW50KC41KX0sdC5zY2FsZVF1YW50aWxlPWZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxyPVtdLG89W107ZnVuY3Rpb24gYSgpe3ZhciB0PTAsbj1NYXRoLm1heCgxLHIubGVuZ3RoKTtmb3Iobz1uZXcgQXJyYXkobi0xKTsrK3Q8bjspb1t0LTFdPUEoZSx0L24pO3JldHVybiB1fWZ1bmN0aW9uIHUodCl7aWYoIWlzTmFOKHQ9K3QpKXJldHVybiByW2kobyx0KV19cmV0dXJuIHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpbbj4wP29bbi0xXTplWzBdLG48by5sZW5ndGg/b1tuXTplW2UubGVuZ3RoLTFdXX0sdS5kb21haW49ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdO2Zvcih2YXIgcixpPTAsbz10Lmxlbmd0aDtpPG87KytpKW51bGw9PShyPXRbaV0pfHxpc05hTihyPStyKXx8ZS5wdXNoKHIpO3JldHVybiBlLnNvcnQobiksYSgpfSx1LnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWNoLmNhbGwodCksYSgpKTpyLnNsaWNlKCl9LHUucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG8uc2xpY2UoKX0sdS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uocil9LHV9LHQuc2NhbGVRdWFudGl6ZT1mdW5jdGlvbiB0KCl7dmFyIG49MCxlPTEscj0xLG89Wy41XSxhPVswLDFdO2Z1bmN0aW9uIHUodCl7aWYodDw9dClyZXR1cm4gYVtpKG8sdCwwLHIpXX1mdW5jdGlvbiBmKCl7dmFyIHQ9LTE7Zm9yKG89bmV3IEFycmF5KHIpOysrdDxyOylvW3RdPSgodCsxKSplLSh0LXIpKm4pLyhyKzEpO3JldHVybiB1fXJldHVybiB1LmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxlPSt0WzFdLGYoKSk6W24sZV19LHUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9KGE9Y2guY2FsbCh0KSkubGVuZ3RoLTEsZigpKTphLnNsaWNlKCl9LHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBpPWEuaW5kZXhPZih0KTtyZXR1cm4gaTwwP1tOYU4sTmFOXTppPDE/W24sb1swXV06aT49cj9bb1tyLTFdLGVdOltvW2ktMV0sb1tpXV19LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKFtuLGVdKS5yYW5nZShhKX0seGgodSl9LHQuc2NhbGVUaHJlc2hvbGQ9ZnVuY3Rpb24gdCgpe3ZhciBuPVsuNV0sZT1bMCwxXSxyPTE7ZnVuY3Rpb24gbyh0KXtpZih0PD10KXJldHVybiBlW2kobix0LDAscildfXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1jaC5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksbyk6bi5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWNoLmNhbGwodCkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSxvKTplLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciByPWUuaW5kZXhPZih0KTtyZXR1cm5bbltyLTFdLG5bcl1dfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKS5yYW5nZShlKX0sb30sdC5zY2FsZVRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoY2QsdWQsVmgsamgsSWgsQmgsT2gsTGgsdC50aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDJlMywwLDEpLG5ldyBEYXRlKDJlMywwLDIpXSl9LHQuc2NhbGVVdGM9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoTGQsemQsX2QsdmQsZGQsbGQsT2gsTGgsdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMmUzLDAsMSksRGF0ZS5VVEMoMmUzLDAsMildKX0sdC5zY2FsZVNlcXVlbnRpYWw9ZnVuY3Rpb24gdChuKXt2YXIgZT0wLHI9MSxpPTEsbz0hMTtmdW5jdGlvbiBhKHQpe3ZhciByPSh0LWUpKmk7cmV0dXJuIG4obz9NYXRoLm1heCgwLE1hdGgubWluKDEscikpOnIpfXJldHVybiBhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLGk9ZT09PXI/MDoxLyhyLWUpLGEpOltlLHJdfSxhLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhdCxhKTpvfSxhLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihbZSxyXSkuY2xhbXAobyl9LHhoKGEpfSx0LnNjYWxlRGl2ZXJnaW5nPWZ1bmN0aW9uIHQobil7dmFyIGU9MCxyPS41LGk9MSxvPTEsYT0xLHU9ITE7ZnVuY3Rpb24gZih0KXt2YXIgZT0uNSsoKHQ9K3QpLXIpKih0PHI/bzphKTtyZXR1cm4gbih1P01hdGgubWF4KDAsTWF0aC5taW4oMSxlKSk6ZSl9cmV0dXJuIGYuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0saT0rdFsyXSxvPWU9PT1yPzA6LjUvKHItZSksYT1yPT09aT8wOi41LyhpLXIpLGYpOltlLHIsaV19LGYuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ISF0LGYpOnV9LGYuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZik6bn0sZi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQobikuZG9tYWluKFtlLHIsaV0pLmNsYW1wKHUpfSx4aChmKX0sdC5zY2hlbWVDYXRlZ29yeTEwPWx2LHQuc2NoZW1lQWNjZW50PWh2LHQuc2NoZW1lRGFyazI9ZHYsdC5zY2hlbWVQYWlyZWQ9cHYsdC5zY2hlbWVQYXN0ZWwxPXZ2LHQuc2NoZW1lUGFzdGVsMj1ndix0LnNjaGVtZVNldDE9eXYsdC5zY2hlbWVTZXQyPV92LHQuc2NoZW1lU2V0Mz1idix0LmludGVycG9sYXRlQnJCRz13dix0LnNjaGVtZUJyQkc9eHYsdC5pbnRlcnBvbGF0ZVBSR249QXYsdC5zY2hlbWVQUkduPU12LHQuaW50ZXJwb2xhdGVQaVlHPU52LHQuc2NoZW1lUGlZRz1Udix0LmludGVycG9sYXRlUHVPcj1Fdix0LnNjaGVtZVB1T3I9U3YsdC5pbnRlcnBvbGF0ZVJkQnU9Q3YsdC5zY2hlbWVSZEJ1PWt2LHQuaW50ZXJwb2xhdGVSZEd5PXp2LHQuc2NoZW1lUmRHeT1Qdix0LmludGVycG9sYXRlUmRZbEJ1PUx2LHQuc2NoZW1lUmRZbEJ1PVJ2LHQuaW50ZXJwb2xhdGVSZFlsR249VXYsdC5zY2hlbWVSZFlsR249RHYsdC5pbnRlcnBvbGF0ZVNwZWN0cmFsPU92LHQuc2NoZW1lU3BlY3RyYWw9cXYsdC5pbnRlcnBvbGF0ZUJ1R249QnYsdC5zY2hlbWVCdUduPVl2LHQuaW50ZXJwb2xhdGVCdVB1PUl2LHQuc2NoZW1lQnVQdT1Gdix0LmludGVycG9sYXRlR25CdT1qdix0LnNjaGVtZUduQnU9SHYsdC5pbnRlcnBvbGF0ZU9yUmQ9R3YsdC5zY2hlbWVPclJkPVh2LHQuaW50ZXJwb2xhdGVQdUJ1R249JHYsdC5zY2hlbWVQdUJ1R249VnYsdC5pbnRlcnBvbGF0ZVB1QnU9WnYsdC5zY2hlbWVQdUJ1PVd2LHQuaW50ZXJwb2xhdGVQdVJkPUp2LHQuc2NoZW1lUHVSZD1Rdix0LmludGVycG9sYXRlUmRQdT10Zyx0LnNjaGVtZVJkUHU9S3YsdC5pbnRlcnBvbGF0ZVlsR25CdT1lZyx0LnNjaGVtZVlsR25CdT1uZyx0LmludGVycG9sYXRlWWxHbj1pZyx0LnNjaGVtZVlsR249cmcsdC5pbnRlcnBvbGF0ZVlsT3JCcj1hZyx0LnNjaGVtZVlsT3JCcj1vZyx0LmludGVycG9sYXRlWWxPclJkPWZnLHQuc2NoZW1lWWxPclJkPXVnLHQuaW50ZXJwb2xhdGVCbHVlcz1zZyx0LnNjaGVtZUJsdWVzPWNnLHQuaW50ZXJwb2xhdGVHcmVlbnM9aGcsdC5zY2hlbWVHcmVlbnM9bGcsdC5pbnRlcnBvbGF0ZUdyZXlzPXBnLHQuc2NoZW1lR3JleXM9ZGcsdC5pbnRlcnBvbGF0ZVB1cnBsZXM9Z2csdC5zY2hlbWVQdXJwbGVzPXZnLHQuaW50ZXJwb2xhdGVSZWRzPV9nLHQuc2NoZW1lUmVkcz15Zyx0LmludGVycG9sYXRlT3Jhbmdlcz1tZyx0LnNjaGVtZU9yYW5nZXM9YmcsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ9eGcsdC5pbnRlcnBvbGF0ZVJhaW5ib3c9ZnVuY3Rpb24odCl7KHQ8MHx8dD4xKSYmKHQtPU1hdGguZmxvb3IodCkpO3ZhciBuPU1hdGguYWJzKHQtLjUpO3JldHVybiBBZy5oPTM2MCp0LTEwMCxBZy5zPTEuNS0xLjUqbixBZy5sPS44LS45Km4sQWcrIiJ9LHQuaW50ZXJwb2xhdGVXYXJtPXdnLHQuaW50ZXJwb2xhdGVDb29sPU1nLHQuaW50ZXJwb2xhdGVTaW5lYm93PWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0PSguNS10KSpNYXRoLlBJLFRnLnI9MjU1KihuPU1hdGguc2luKHQpKSpuLFRnLmc9MjU1KihuPU1hdGguc2luKHQrTmcpKSpuLFRnLmI9MjU1KihuPU1hdGguc2luKHQrU2cpKSpuLFRnKyIifSx0LmludGVycG9sYXRlVmlyaWRpcz1rZyx0LmludGVycG9sYXRlTWFnbWE9Q2csdC5pbnRlcnBvbGF0ZUluZmVybm89UGcsdC5pbnRlcnBvbGF0ZVBsYXNtYT16Zyx0LmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gRHQoVyh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSx0LmNyZWF0b3I9Vyx0LmxvY2FsPXF0LHQubWF0Y2hlcj1ydCx0Lm1vdXNlPUZ0LHQubmFtZXNwYWNlPSQsdC5uYW1lc3BhY2VzPVYsdC5jbGllbnRQb2ludD1CdCx0LnNlbGVjdD1EdCx0LnNlbGVjdEFsbD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFJ0KFtudWxsPT10P1tdOnRdLHp0KX0sdC5zZWxlY3Rpb249THQsdC5zZWxlY3Rvcj1RLHQuc2VsZWN0b3JBbGw9Syx0LnN0eWxlPWx0LHQudG91Y2g9SXQsdC50b3VjaGVzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49WXQoKS50b3VjaGVzKTtmb3IodmFyIGU9MCxyPW4/bi5sZW5ndGg6MCxpPW5ldyBBcnJheShyKTtlPHI7KytlKWlbZV09QnQodCxuW2VdKTtyZXR1cm4gaX0sdC53aW5kb3c9c3QsdC5jdXN0b21FdmVudD1DdCx0LmFyYz1mdW5jdGlvbigpe3ZhciB0PUdnLG49VmcsZT1SZygwKSxyPW51bGwsaT0kZyxvPVdnLGE9WmcsdT1udWxsO2Z1bmN0aW9uIGYoKXt2YXIgZixjLHMsbD0rdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1IZyxwPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLUhnLHY9TGcocC1kKSxnPXA+ZDtpZih1fHwodT1mPUdpKCkpLGg8bCYmKGM9aCxoPWwsbD1jKSxoPkZnKWlmKHY+amctRmcpdS5tb3ZlVG8oaCpVZyhkKSxoKllnKGQpKSx1LmFyYygwLDAsaCxkLHAsIWcpLGw+RmcmJih1Lm1vdmVUbyhsKlVnKHApLGwqWWcocCkpLHUuYXJjKDAsMCxsLHAsZCxnKSk7ZWxzZXt2YXIgeSxfLGI9ZCxtPXAseD1kLHc9cCxNPXYsQT12LFQ9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixOPVQ+RmcmJihyPytyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpCZyhsKmwraCpoKSksUz1PZyhMZyhoLWwpLzIsK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxFPVMsaz1TO2lmKE4+Rmcpe3ZhciBDPVhnKE4vbCpZZyhUKSksUD1YZyhOL2gqWWcoVCkpOyhNLT0yKkMpPkZnPyh4Kz1DKj1nPzE6LTEsdy09Qyk6KE09MCx4PXc9KGQrcCkvMiksKEEtPTIqUCk+Rmc/KGIrPVAqPWc/MTotMSxtLT1QKTooQT0wLGI9bT0oZCtwKS8yKX12YXIgej1oKlVnKGIpLFI9aCpZZyhiKSxMPWwqVWcodyksRD1sKllnKHcpO2lmKFM+Rmcpe3ZhciBVPWgqVWcobSkscT1oKllnKG0pLE89bCpVZyh4KSxZPWwqWWcoeCk7aWYodjxJZyl7dmFyIEI9TT5GZz9mdW5jdGlvbih0LG4sZSxyLGksbyxhLHUpe3ZhciBmPWUtdCxjPXItbixzPWEtaSxsPXUtbyxoPShzKihuLW8pLWwqKHQtaSkpLyhsKmYtcypjKTtyZXR1cm5bdCtoKmYsbitoKmNdfSh6LFIsTyxZLFUscSxMLEQpOltMLERdLEY9ei1CWzBdLEk9Ui1CWzFdLEg9VS1CWzBdLGo9cS1CWzFdLFg9MS9ZZygoKHM9KEYqSCtJKmopLyhCZyhGKkYrSSpJKSpCZyhIKkgraipqKSkpPjE/MDpzPC0xP0lnOk1hdGguYWNvcyhzKSkvMiksRz1CZyhCWzBdKkJbMF0rQlsxXSpCWzFdKTtFPU9nKFMsKGwtRykvKFgtMSkpLGs9T2coUywoaC1HKS8oWCsxKSl9fUE+Rmc/az5GZz8oeT1RZyhPLFkseixSLGgsayxnKSxfPVFnKFUscSxMLEQsaCxrLGcpLHUubW92ZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksazxTP3UuYXJjKHkuY3gseS5jeSxrLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksayxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsaCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksIWcpLHUuYXJjKF8uY3gsXy5jeSxrLERnKF8ueTExLF8ueDExKSxEZyhfLnkwMSxfLngwMSksIWcpKSk6KHUubW92ZVRvKHosUiksdS5hcmMoMCwwLGgsYixtLCFnKSk6dS5tb3ZlVG8oeixSKSxsPkZnJiZNPkZnP0U+Rmc/KHk9UWcoTCxELFUscSxsLC1FLGcpLF89UWcoeixSLE8sWSxsLC1FLGcpLHUubGluZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksRTxTP3UuYXJjKHkuY3gseS5jeSxFLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksRSxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsbCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksZyksdS5hcmMoXy5jeCxfLmN5LEUsRGcoXy55MTEsXy54MTEpLERnKF8ueTAxLF8ueDAxKSwhZykpKTp1LmFyYygwLDAsbCx3LHgsZyk6dS5saW5lVG8oTCxEKX1lbHNlIHUubW92ZVRvKDAsMCk7aWYodS5jbG9zZVBhdGgoKSxmKXJldHVybiB1PW51bGwsZisiInx8bnVsbH1yZXR1cm4gZi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBlPSgrdC5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgraS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1JZy8yO3JldHVybltVZyhyKSplLFlnKHIpKmVdfSxmLmlubmVyUmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6bn0sZi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6ZX0sZi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOnJ9LGYuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTppfSxmLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm99LGYucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6YX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PXQ/bnVsbDp0LGYpOnV9LGZ9LHQuYXJlYT1yeSx0LmxpbmU9ZXksdC5waWU9ZnVuY3Rpb24oKXt2YXIgdD1veSxuPWl5LGU9bnVsbCxyPVJnKDApLGk9UmcoamcpLG89UmcoMCk7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscyxsLGg9YS5sZW5ndGgsZD0wLHA9bmV3IEFycmF5KGgpLHY9bmV3IEFycmF5KGgpLGc9K3IuYXBwbHkodGhpcyxhcmd1bWVudHMpLHk9TWF0aC5taW4oamcsTWF0aC5tYXgoLWpnLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLWcpKSxfPU1hdGgubWluKE1hdGguYWJzKHkpL2gsby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGI9XyooeTwwPy0xOjEpO2Zvcih1PTA7dTxoOysrdSkobD12W3BbdV09dV09K3QoYVt1XSx1LGEpKT4wJiYoZCs9bCk7Zm9yKG51bGwhPW4/cC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odlt0XSx2W2VdKX0pOm51bGwhPWUmJnAuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBlKGFbdF0sYVtuXSl9KSx1PTAsYz1kPyh5LWgqYikvZDowO3U8aDsrK3UsZz1zKWY9cFt1XSxzPWcrKChsPXZbZl0pPjA/bCpjOjApK2IsdltmXT17ZGF0YTphW2ZdLGluZGV4OnUsdmFsdWU6bCxzdGFydEFuZ2xlOmcsZW5kQW5nbGU6cyxwYWRBbmdsZTpffTtyZXR1cm4gdn1yZXR1cm4gYS52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnNvcnRWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlPW51bGwsYSk6bn0sYS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbj1udWxsLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6b30sYX0sdC5hcmVhUmFkaWFsPWx5LHQucmFkaWFsQXJlYT1seSx0LmxpbmVSYWRpYWw9c3ksdC5yYWRpYWxMaW5lPXN5LHQucG9pbnRSYWRpYWw9aHksdC5saW5rSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiBneSh5eSl9LHQubGlua1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIGd5KF95KX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9Z3koYnkpO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHR9LHQuc3ltYm9sPWZ1bmN0aW9uKCl7dmFyIHQ9UmcobXkpLG49UmcoNjQpLGU9bnVsbDtmdW5jdGlvbiByKCl7dmFyIHI7aWYoZXx8KGU9cj1HaSgpKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKS5kcmF3KGUsK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxyKXJldHVybiBlPW51bGwscisiInx8bnVsbH1yZXR1cm4gci50eXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Umcobikscik6dH0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLHIpOm59LHIuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6dCxyKTplfSxyfSx0LnN5bWJvbHM9VXksdC5zeW1ib2xDaXJjbGU9bXksdC5zeW1ib2xDcm9zcz14eSx0LnN5bWJvbERpYW1vbmQ9QXksdC5zeW1ib2xTcXVhcmU9a3ksdC5zeW1ib2xTdGFyPUV5LHQuc3ltYm9sVHJpYW5nbGU9UHksdC5zeW1ib2xXeWU9RHksdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQnkodCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGeSh0KX0sdC5jdXJ2ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWXkodCl9LHQuY3VydmVCdW5kbGU9SHksdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPSR5LHQuY3VydmVDYXJkaW5hbE9wZW49WnksdC5jdXJ2ZUNhcmRpbmFsPUd5LHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPW5fLHQuY3VydmVDYXRtdWxsUm9tT3Blbj1yXyx0LmN1cnZlQ2F0bXVsbFJvbT1LeSx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaV8odCl9LHQuY3VydmVMaW5lYXI9S2csdC5jdXJ2ZU1vbm90b25lWD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGNfKHQpfSx0LmN1cnZlTW9ub3RvbmVZPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgc18odCl9LHQuY3VydmVOYXR1cmFsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaF8odCl9LHQuY3VydmVTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcF8odCwuNSl9LHQuY3VydmVTdGVwQWZ0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwXyh0LDEpfSx0LmN1cnZlU3RlcEJlZm9yZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBfKHQsMCl9LHQuc3RhY2s9ZnVuY3Rpb24oKXt2YXIgdD1SZyhbXSksbj1nXyxlPXZfLHI9eV87ZnVuY3Rpb24gaShpKXt2YXIgbyxhLHU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZj1pLmxlbmd0aCxjPXUubGVuZ3RoLHM9bmV3IEFycmF5KGMpO2ZvcihvPTA7bzxjOysrbyl7Zm9yKHZhciBsLGg9dVtvXSxkPXNbb109bmV3IEFycmF5KGYpLHA9MDtwPGY7KytwKWRbcF09bD1bMCwrcihpW3BdLGgscCxpKV0sbC5kYXRhPWlbcF07ZC5rZXk9aH1mb3Iobz0wLGE9bihzKTtvPGM7KytvKXNbYVtvXV0uaW5kZXg9bztyZXR1cm4gZShzLGEpLHN9cmV0dXJuIGkua2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKGR5LmNhbGwobikpLGkpOnR9LGkudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksaSk6cn0saS5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P2dfOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoZHkuY2FsbCh0KSksaSk6bn0saS5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD92Xzp0LGkpOmV9LGl9LHQuc3RhY2tPZmZzZXRFeHBhbmQ9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsYT10WzBdLmxlbmd0aDtvPGE7KytvKXtmb3IoaT1lPTA7ZTxyOysrZSlpKz10W2VdW29dWzFdfHwwO2lmKGkpZm9yKGU9MDtlPHI7KytlKXRbZV1bb11bMV0vPWl9dl8odCxuKX19LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigodT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG8sYSx1LGY9MCxjPXRbblswXV0ubGVuZ3RoO2Y8YzsrK2YpZm9yKG89YT0wLGU9MDtlPHU7KytlKShpPShyPXRbbltlXV1bZl0pWzFdLXJbMF0pPj0wPyhyWzBdPW8sclsxXT1vKz1pKTppPDA/KHJbMV09YSxyWzBdPWErPWkpOnJbMF09b30sdC5zdGFja09mZnNldE5vbmU9dl8sdC5zdGFja09mZnNldFNpbGhvdWV0dGU9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIGE9MCx1PTA7YTxlOysrYSl1Kz10W2FdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LXUvMn12Xyh0LG4pfX0sdC5zdGFja09mZnNldFdpZ2dsZT1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4wJiYocj0oZT10W25bMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9MTthPHI7KythKXtmb3IodmFyIHU9MCxmPTAsYz0wO3U8aTsrK3Upe2Zvcih2YXIgcz10W25bdV1dLGw9c1thXVsxXXx8MCxoPShsLShzW2EtMV1bMV18fDApKS8yLGQ9MDtkPHU7KytkKXt2YXIgcD10W25bZF1dO2grPShwW2FdWzFdfHwwKS0ocFthLTFdWzFdfHwwKX1mKz1sLGMrPWgqbH1lW2EtMV1bMV0rPWVbYS0xXVswXT1vLGYmJihvLT1jL2YpfWVbYS0xXVsxXSs9ZVthLTFdWzBdPW8sdl8odCxuKX19LHQuc3RhY2tPcmRlckFzY2VuZGluZz1fXyx0LnN0YWNrT3JkZXJEZXNjZW5kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBfXyh0KS5yZXZlcnNlKCl9LHQuc3RhY2tPcmRlckluc2lkZU91dD1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChiXyksbz1nXyh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLGE9MCx1PTAsZj1bXSxjPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sYTx1PyhhKz1pW2VdLGYucHVzaChlKSk6KHUrPWlbZV0sYy5wdXNoKGUpKTtyZXR1cm4gYy5yZXZlcnNlKCkuY29uY2F0KGYpfSx0LnN0YWNrT3JkZXJOb25lPWdfLHQuc3RhY2tPcmRlclJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGdfKHQpLnJldmVyc2UoKX0sdC50aW1lSW50ZXJ2YWw9UmgsdC50aW1lTWlsbGlzZWNvbmQ9TGgsdC50aW1lTWlsbGlzZWNvbmRzPURoLHQudXRjTWlsbGlzZWNvbmQ9TGgsdC51dGNNaWxsaXNlY29uZHM9RGgsdC50aW1lU2Vjb25kPU9oLHQudGltZVNlY29uZHM9WWgsdC51dGNTZWNvbmQ9T2gsdC51dGNTZWNvbmRzPVloLHQudGltZU1pbnV0ZT1CaCx0LnRpbWVNaW51dGVzPUZoLHQudGltZUhvdXI9SWgsdC50aW1lSG91cnM9SGgsdC50aW1lRGF5PWpoLHQudGltZURheXM9WGgsdC50aW1lV2Vlaz1WaCx0LnRpbWVXZWVrcz10ZCx0LnRpbWVTdW5kYXk9VmgsdC50aW1lU3VuZGF5cz10ZCx0LnRpbWVNb25kYXk9JGgsdC50aW1lTW9uZGF5cz1uZCx0LnRpbWVUdWVzZGF5PVdoLHQudGltZVR1ZXNkYXlzPWVkLHQudGltZVdlZG5lc2RheT1aaCx0LnRpbWVXZWRuZXNkYXlzPXJkLHQudGltZVRodXJzZGF5PVFoLHQudGltZVRodXJzZGF5cz1pZCx0LnRpbWVGcmlkYXk9SmgsdC50aW1lRnJpZGF5cz1vZCx0LnRpbWVTYXR1cmRheT1LaCx0LnRpbWVTYXR1cmRheXM9YWQsdC50aW1lTW9udGg9dWQsdC50aW1lTW9udGhzPWZkLHQudGltZVllYXI9Y2QsdC50aW1lWWVhcnM9c2QsdC51dGNNaW51dGU9bGQsdC51dGNNaW51dGVzPWhkLHQudXRjSG91cj1kZCx0LnV0Y0hvdXJzPXBkLHQudXRjRGF5PXZkLHQudXRjRGF5cz1nZCx0LnV0Y1dlZWs9X2QsdC51dGNXZWVrcz1UZCx0LnV0Y1N1bmRheT1fZCx0LnV0Y1N1bmRheXM9VGQsdC51dGNNb25kYXk9YmQsdC51dGNNb25kYXlzPU5kLHQudXRjVHVlc2RheT1tZCx0LnV0Y1R1ZXNkYXlzPVNkLHQudXRjV2VkbmVzZGF5PXhkLHQudXRjV2VkbmVzZGF5cz1FZCx0LnV0Y1RodXJzZGF5PXdkLHQudXRjVGh1cnNkYXlzPWtkLHQudXRjRnJpZGF5PU1kLHQudXRjRnJpZGF5cz1DZCx0LnV0Y1NhdHVyZGF5PUFkLHQudXRjU2F0dXJkYXlzPVBkLHQudXRjTW9udGg9emQsdC51dGNNb250aHM9UmQsdC51dGNZZWFyPUxkLHQudXRjWWVhcnM9RGQsdC50aW1lRm9ybWF0RGVmYXVsdExvY2FsZT1RcCx0LnRpbWVGb3JtYXRMb2NhbGU9WWQsdC5pc29Gb3JtYXQ9SnAsdC5pc29QYXJzZT1LcCx0Lm5vdz1pcix0LnRpbWVyPXVyLHQudGltZXJGbHVzaD1mcix0LnRpbWVvdXQ9aHIsdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IGFyLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/aXIoKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyhhKXthKz1pLHIucmVzdGFydChvLGkrPW4sZSksdChhKX0sbixlKSxyKX0sdC50cmFuc2l0aW9uPXpyLHQuYWN0aXZlPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpZm9yKHIgaW4gbj1udWxsPT1uP251bGw6bisiIixpKWlmKChlPWlbcl0pLnN0YXRlPmdyJiZlLm5hbWU9PT1uKXJldHVybiBuZXcgUHIoW1t0XV0sbGksbiwrcik7cmV0dXJuIG51bGx9LHQuaW50ZXJydXB0PU5yLHQudm9yb25vaT1mdW5jdGlvbigpe3ZhciB0PXhfLG49d18sZT1udWxsO2Z1bmN0aW9uIHIocil7cmV0dXJuIG5ldyBlYihyLm1hcChmdW5jdGlvbihlLGkpe3ZhciBvPVtNYXRoLnJvdW5kKHQoZSxpLHIpL0tfKSpLXyxNYXRoLnJvdW5kKG4oZSxpLHIpL0tfKSpLX107cmV0dXJuIG8uaW5kZXg9aSxvLmRhdGE9ZSxvfSksZSl9cmV0dXJuIHIucG9seWdvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkucG9seWdvbnMoKX0sci5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS5saW5rcygpfSxyLnRyaWFuZ2xlcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS50cmlhbmdsZXMoKX0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246bV8oK24pLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om1fKCt0KSxyKTpufSxyLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6W1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0scik6ZSYmW1tlWzBdWzBdLGVbMF1bMV1dLFtlWzFdWzBdLGVbMV1bMV1dXX0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDpbWzAsMF0sWyt0WzBdLCt0WzFdXV0scik6ZSYmW2VbMV1bMF0tZVswXVswXSxlWzFdWzFdLWVbMF1bMV1dfSxyfSx0Lnpvb209ZnVuY3Rpb24oKXt2YXIgbixlLHI9c2IsaT1sYixvPXZiLGE9ZGIsdT1wYixmPVswLDEvMF0sYz1bWy0xLzAsLTEvMF0sWzEvMCwxLzBdXSxzPTI1MCxsPXFlLGg9W10sZD1JKCJzdGFydCIsInpvb20iLCJlbmQiKSxwPTUwMCx2PTE1MCxnPTA7ZnVuY3Rpb24geSh0KXt0LnByb3BlcnR5KCJfX3pvb20iLGhiKS5vbigid2hlZWwuem9vbSIsQSkub24oIm1vdXNlZG93bi56b29tIixUKS5vbigiZGJsY2xpY2suem9vbSIsTikuZmlsdGVyKHUpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLFMpLm9uKCJ0b3VjaG1vdmUuem9vbSIsRSkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIsaykuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIF8odCxuKXtyZXR1cm4obj1NYXRoLm1heChmWzBdLE1hdGgubWluKGZbMV0sbikpKT09PXQuaz90Om5ldyBvYihuLHQueCx0LnkpfWZ1bmN0aW9uIGIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IG9iKHQuayxyLGkpfWZ1bmN0aW9uIG0odCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24geCh0LG4sZSl7dC5vbigic3RhcnQuem9vbSIsZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIixmdW5jdGlvbigpe3codGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oInpvb20iLGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dyh0aGlzLHQpLG89aS5hcHBseSh0aGlzLHQpLGE9ZXx8bShvKSx1PU1hdGgubWF4KG9bMV1bMF0tb1swXVswXSxvWzFdWzFdLW9bMF1bMV0pLGY9dGhpcy5fX3pvb20sYz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsdCk6bixzPWwoZi5pbnZlcnQoYSkuY29uY2F0KHUvZi5rKSxjLmludmVydChhKS5jb25jYXQodS9jLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1jO2Vsc2V7dmFyIG49cyh0KSxlPXUvblsyXTt0PW5ldyBvYihlLGFbMF0tblswXSplLGFbMV0tblsxXSplKX1yLnpvb20obnVsbCx0KX19KX1mdW5jdGlvbiB3KHQsbil7Zm9yKHZhciBlLHI9MCxpPWgubGVuZ3RoO3I8aTsrK3IpaWYoKGU9aFtyXSkudGhhdD09PXQpcmV0dXJuIGU7cmV0dXJuIG5ldyBNKHQsbil9ZnVuY3Rpb24gTSh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1pLmFwcGx5KHQsbil9ZnVuY3Rpb24gQSgpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD13KHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLGU9TWF0aC5tYXgoZlswXSxNYXRoLm1pbihmWzFdLG4uaypNYXRoLnBvdygyLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLGk9RnQodGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09aVswXSYmdC5tb3VzZVswXVsxXT09PWlbMV18fCh0Lm1vdXNlWzFdPW4uaW52ZXJ0KHQubW91c2VbMF09aSkpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKG4uaz09PWUpcmV0dXJuO3QubW91c2U9W2ksbi5pbnZlcnQoaSldLE5yKHRoaXMpLHQuc3RhcnQoKX1jYigpLHQud2hlZWw9c2V0VGltZW91dChmdW5jdGlvbigpe3Qud2hlZWw9bnVsbCx0LmVuZCgpfSx2KSx0Lnpvb20oIm1vdXNlIixvKGIoXyhuLGUpLHQubW91c2VbMF0sdC5tb3VzZVsxXSksdC5leHRlbnQsYykpfX1mdW5jdGlvbiBUKCl7aWYoIWUmJnIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj13KHRoaXMsYXJndW1lbnRzKSxpPUR0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS56b29tIixmdW5jdGlvbigpe2lmKGNiKCksIW4ubW92ZWQpe3ZhciBlPXQuZXZlbnQuY2xpZW50WC11LHI9dC5ldmVudC5jbGllbnRZLWY7bi5tb3ZlZD1lKmUrcipyPmd9bi56b29tKCJtb3VzZSIsbyhiKG4udGhhdC5fX3pvb20sbi5tb3VzZVswXT1GdChuLnRoYXQpLG4ubW91c2VbMV0pLG4uZXh0ZW50LGMpKX0sITApLm9uKCJtb3VzZXVwLnpvb20iLGZ1bmN0aW9uKCl7aS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsbi5tb3ZlZCksY2IoKSxuLmVuZCgpfSwhMCksYT1GdCh0aGlzKSx1PXQuZXZlbnQuY2xpZW50WCxmPXQuZXZlbnQuY2xpZW50WTtYdCh0LmV2ZW50LnZpZXcpLGZiKCksbi5tb3VzZT1bYSx0aGlzLl9fem9vbS5pbnZlcnQoYSldLE5yKHRoaXMpLG4uc3RhcnQoKX19ZnVuY3Rpb24gTigpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj10aGlzLl9fem9vbSxlPUZ0KHRoaXMpLGE9bi5pbnZlcnQoZSksdT1uLmsqKHQuZXZlbnQuc2hpZnRLZXk/LjU6MiksZj1vKGIoXyhuLHUpLGUsYSksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYyk7Y2IoKSxzPjA/RHQodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKHMpLmNhbGwoeCxmLGUpOkR0KHRoaXMpLmNhbGwoeS50cmFuc2Zvcm0sZil9fWZ1bmN0aW9uIFMoKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGUsaSxvLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYz1mLmxlbmd0aDtmb3IoZmIoKSxpPTA7aTxjOysraSlhPVthPUl0KHRoaXMsZiwobz1mW2ldKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQoYSksby5pZGVudGlmaWVyXSx1LnRvdWNoMD91LnRvdWNoMXx8KHUudG91Y2gxPWEpOih1LnRvdWNoMD1hLGU9ITApO2lmKG4mJihuPWNsZWFyVGltZW91dChuKSwhdS50b3VjaDEpKXJldHVybiB1LmVuZCgpLHZvaWQoKGE9RHQodGhpcykub24oImRibGNsaWNrLnpvb20iKSkmJmEuYXBwbHkodGhpcyxhcmd1bWVudHMpKTtlJiYobj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bj1udWxsfSxwKSxOcih0aGlzKSx1LnN0YXJ0KCkpfX1mdW5jdGlvbiBFKCl7dmFyIGUscixpLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMscz1mLmxlbmd0aDtmb3IoY2IoKSxuJiYobj1jbGVhclRpbWVvdXQobikpLGU9MDtlPHM7KytlKWk9SXQodGhpcyxmLChyPWZbZV0pLmlkZW50aWZpZXIpLHUudG91Y2gwJiZ1LnRvdWNoMFsyXT09PXIuaWRlbnRpZmllcj91LnRvdWNoMFswXT1pOnUudG91Y2gxJiZ1LnRvdWNoMVsyXT09PXIuaWRlbnRpZmllciYmKHUudG91Y2gxWzBdPWkpO2lmKHI9dS50aGF0Ll9fem9vbSx1LnRvdWNoMSl7dmFyIGw9dS50b3VjaDBbMF0saD11LnRvdWNoMFsxXSxkPXUudG91Y2gxWzBdLHA9dS50b3VjaDFbMV0sdj0odj1kWzBdLWxbMF0pKnYrKHY9ZFsxXS1sWzFdKSp2LGc9KGc9cFswXS1oWzBdKSpnKyhnPXBbMV0taFsxXSkqZztyPV8ocixNYXRoLnNxcnQodi9nKSksaT1bKGxbMF0rZFswXSkvMiwobFsxXStkWzFdKS8yXSxhPVsoaFswXStwWzBdKS8yLChoWzFdK3BbMV0pLzJdfWVsc2V7aWYoIXUudG91Y2gwKXJldHVybjtpPXUudG91Y2gwWzBdLGE9dS50b3VjaDBbMV19dS56b29tKCJ0b3VjaCIsbyhiKHIsaSxhKSx1LmV4dGVudCxjKSl9ZnVuY3Rpb24gaygpe3ZhciBuLHIsaT13KHRoaXMsYXJndW1lbnRzKSxvPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYT1vLmxlbmd0aDtmb3IoZmIoKSxlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSxwKSxuPTA7bjxhOysrbilyPW9bbl0saS50b3VjaDAmJmkudG91Y2gwWzJdPT09ci5pZGVudGlmaWVyP2RlbGV0ZSBpLnRvdWNoMDppLnRvdWNoMSYmaS50b3VjaDFbMl09PT1yLmlkZW50aWZpZXImJmRlbGV0ZSBpLnRvdWNoMTtpLnRvdWNoMSYmIWkudG91Y2gwJiYoaS50b3VjaDA9aS50b3VjaDEsZGVsZXRlIGkudG91Y2gxKSxpLnRvdWNoMD9pLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoaS50b3VjaDBbMF0pOmkuZW5kKCl9cmV0dXJuIHkudHJhbnNmb3JtPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O2UucHJvcGVydHkoIl9fem9vbSIsaGIpLHQhPT1lP3godCxuKTplLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKS5lbmQoKX0pfSx5LnNjYWxlQnk9ZnVuY3Rpb24odCxuKXt5LnNjYWxlVG8odCxmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fem9vbS5rKigiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKX0pfSx5LnNjYWxlVG89ZnVuY3Rpb24odCxuKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10aGlzLl9fem9vbSxyPW0odCksYT1lLmludmVydChyKSx1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm47cmV0dXJuIG8oYihfKGUsdSkscixhKSx0LGMpfSl9LHkudHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxuLGUpe3kudHJhbnNmb3JtKHQsZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6biwiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjKX0pfSx5LnRyYW5zbGF0ZVRvPWZ1bmN0aW9uKHQsbixlKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykscj10aGlzLl9fem9vbSxhPW0odCk7cmV0dXJuIG8oYWIudHJhbnNsYXRlKGFbMF0sYVsxXSkuc2NhbGUoci5rKS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/LW4uYXBwbHkodGhpcyxhcmd1bWVudHMpOi1uLCJmdW5jdGlvbiI9PXR5cGVvZiBlPy1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotZSksdCxjKX0pfSxNLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuaW5kZXg9aC5wdXNoKHRoaXMpLTEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGguc3BsaWNlKHRoaXMuaW5kZXgsMSksdGhpcy5pbmRleD0tMSx0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe0N0KG5ldyBpYih5LHQsdGhpcy50aGF0Ll9fem9vbSksZC5hcHBseSxkLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHkud2hlZWxEZWx0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCt0KSx5KTphfSx5LmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCEhdCkseSk6cn0seS50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYighIXQpLHkpOnV9LHkuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cmIoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHkpOml9LHkuc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGZbMF09K3RbMF0sZlsxXT0rdFsxXSx5KTpbZlswXSxmWzFdXX0seS50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGNbMF1bMF09K3RbMF1bMF0sY1sxXVswXT0rdFsxXVswXSxjWzBdWzFdPSt0WzBdWzFdLGNbMV1bMV09K3RbMV1bMV0seSk6W1tjWzBdWzBdLGNbMF1bMV1dLFtjWzFdWzBdLGNbMV1bMV1dXX0seS5jb25zdHJhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCx5KTpvfSx5LmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LHkpOnN9LHkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCx5KTpsfSx5Lm9uPWZ1bmN0aW9uKCl7dmFyIHQ9ZC5vbi5hcHBseShkLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1kP3k6dH0seS5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSh0PSt0KSp0LHkpOk1hdGguc3FydChnKX0seX0sdC56b29tVHJhbnNmb3JtPXViLHQuem9vbUlkZW50aXR5PWFiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL3BhbGV0dGVzLmpzCnZhciBwZjsKKGZ1bmN0aW9uKGIpe2IucGFsZXR0ZXM9e2dvb2dsZVN0YW5kYXJkOiIjZGI0NDM3ICNmZjcwNDMgI2Y0YjQwMCAjMGY5ZDU4ICMwMDc5NmIgIzAwYWNjMSAjNDI4NWY0ICM1YzZiYzAgI2FiNDdiYyIuc3BsaXQoIiAiKSxnb29nbGVDb29sOiIjOWU5ZDI0ICMwZjlkNTggIzAwNzk2YiAjMDBhY2MxICM0Mjg1ZjQgIzVjNmJjMCAjNjA3ZDhiIi5zcGxpdCgiICIpLGdvb2dsZVdhcm06IiM3OTU1NDggI2FiNDdiYyAjZjA2MjkyICNjMjE4NWIgI2RiNDQzNyAjZmY3MDQzICNmNGI0MDAiLnNwbGl0KCIgIiksZ29vZ2xlQ29sb3JCbGluZEFzc2lzdDoiI2ZmNzA0MyAjMDBBQ0MxICNBQjQ3QkMgIzJBNTZDNiAjMGI4MDQzICNGN0NCNEQgI2MwY2EzMyAjNWUzNWIxICNBNTI3MTQiLnNwbGl0KCIgIiksdGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0OiIjZmY3MDQzICMwMDc3YmIgI2NjMzMxMSAjMzNiYmVlICNlZTMzNzcgIzAwOTk4OCAjYmJiYmJiIi5zcGxpdCgiICIpLGNvbG9yQmxpbmRBc3Npc3QxOiIjNDQ3N2FhICM0NGFhYWEgI2FhYWE0NCAjYWE3NzQ0ICNhYTQ0NTUgI2FhNDQ4OCIuc3BsaXQoIiAiKSxjb2xvckJsaW5kQXNzaXN0MjoiIzg4Y2NlZSAjNDRhYTk5ICMxMTc3MzMgIzk5OTkzMyAjZGRjYzc3ICNjYzY2NzcgIzg4MjI1NSAjYWE0NDk5Ii5zcGxpdCgiICIpLApjb2xvckJsaW5kQXNzaXN0MzoiIzMzMjI4OCAjNjY5OWNjICM4OGNjZWUgIzQ0YWE5OSAjMTE3NzMzICM5OTk5MzMgI2RkY2M3NyAjY2M2Njc3ICNhYTQ0NjYgIzg4MjI1NSAjNjYxMTAwICNhYTQ0OTkiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDQ6IiM0NDc3YWEgIzY2Y2NlZSAjMjI4ODMzICNjY2JiNDQgI2VlNjY3NyAjYWEzMzc3ICNiYmJiYmIiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDU6IiNGRjZEQjYgIzkyMDAwMCAjOTI0OTAwICNEQkQxMDAgIzI0RkYyNCAjMDA2RERCICM0OTAwOTIiLnNwbGl0KCIgIiksbWxkYXNoOiIjRTQ3RUFEICNGNDY0MEQgI0ZBQTMwMCAjRjVFNjM2ICMwMEEwNzcgIzAwNzdCOCAjMDBCN0VEIi5zcGxpdCgiICIpfTtiLnN0YW5kYXJkPWIucGFsZXR0ZXMudGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0fSkocGZ8fChwZj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL2NvbG9yU2NhbGUuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoaCxrKXtmdW5jdGlvbiB0KCl7bC5zZXREb21haW4oaygpKX1jb25zdCBsPW5ldyBmO2guYWRkTGlzdGVuZXIodCk7dCgpO3JldHVybiBwPT5sLmdldENvbG9yKHApfWNsYXNzIGZ7Y29uc3RydWN0b3IoaD1iLnN0YW5kYXJkKXt0aGlzLnBhbGV0dGU9aDt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpfXNldERvbWFpbihoKXt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpO2guZm9yRWFjaCgoayx0KT0+e3RoaXMuaWRlbnRpZmllcnMuc2V0KGssdGhpcy5wYWxldHRlW3QldGhpcy5wYWxldHRlLmxlbmd0aF0pfSl9Z2V0Q29sb3IoaCl7aWYoIXRoaXMuaWRlbnRpZmllcnMuaGFzKGgpKXRocm93IEVycm9yKGBTdHJpbmcgJHtofSB3YXMgbm90IGluIHRoZSBkb21haW4uYCk7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnMuZ2V0KGgpfX1iLkNvbG9yU2NhbGU9ZjtiLnJ1bnNDb2xvclNjYWxlPWQodmMucnVuc1N0b3JlLCgpPT52Yy5ydW5zU3RvcmUuZ2V0UnVucygpKTsKYi5leHBlcmltZW50c0NvbG9yU2NhbGU9ZCh2Yy5leHBlcmltZW50c1N0b3JlLCgpPT52Yy5leHBlcmltZW50c1N0b3JlLmdldEV4cGVyaW1lbnRzKCkubWFwKCh7bmFtZTpofSk9PmgpKX0pKHBmfHwocGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pY29uLWJ1dHRvbi9wYXBlci1pY29uLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pY29uLWJ1dHRvbiIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAifSxiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcl0scHJvcGVydGllczp7c3JjOnt0eXBlOlN0cmluZ30saWNvbjp7dHlwZTpTdHJpbmd9LGFsdDp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9hbHRDaGFuZ2VkIn19LF9hbHRDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dmFyIGY9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKTtmJiZkIT1mfHx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1tdWx0aS1jaGVja2JveC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbXVsdGktY2hlY2tib3giLHByb3BlcnRpZXM6e25hbWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sY29sb3Jpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOntnZXRDb2xvcjooKT0+IiJ9fSxyZWdleDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiIifSxfcmVnZXg6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfbWFrZVJlZ2V4KHJlZ2V4KSJ9LG5hbWVzTWF0Y2hpbmdSZWdleDp7dHlwZTpBcnJheSxjb21wdXRlZDoiY29tcHV0ZU5hbWVzTWF0Y2hpbmdSZWdleChuYW1lcy4qLCBfcmVnZXgpIn0sc2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTooKT0+KHt9KX0sb3V0U2VsZWN0ZWQ6e3R5cGU6QXJyYXksbm90aWZ5OiEwLGNvbXB1dGVkOiJjb21wdXRlT3V0U2VsZWN0ZWQobmFtZXNNYXRjaGluZ1JlZ2V4LiosIHNlbGVjdGlvblN0YXRlLiopIn0sbWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDp7dHlwZTpOdW1iZXIsCnZhbHVlOjQwfSxfZGVib3VuY2VkUmVnZXhDaGFuZ2U6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9Xy5kZWJvdW5jZShkPT57dGhpcy5yZWdleD1kfSwxNTAse2xlYWRpbmc6ITF9KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLiQkKCIjbmFtZXMtcmVnZXgiKS52YWx1ZTsiIj09ZD90aGlzLmFzeW5jKCgpPT57dGhpcy5yZWdleD1kfSwzMCk6YihkKX19fX0sb2JzZXJ2ZXJzOlsiX3NldElzb2xhdG9ySWNvbihzZWxlY3Rpb25TdGF0ZSwgbmFtZXMpIl0sX21ha2VSZWdleDpmdW5jdGlvbihiKXt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoYil9Y2F0Y2goZCl7cmV0dXJuIG51bGx9fSxfc2V0SXNvbGF0b3JJY29uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zZWxlY3Rpb25TdGF0ZSxkPV8uZmlsdGVyKF8udmFsdWVzKGIpKS5sZW5ndGg7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pc29sYXRvciIpKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuaWNvbj0KMT09PWQmJmJbZi5uYW1lXT8icmFkaW8tYnV0dG9uLWNoZWNrZWQiOiJyYWRpby1idXR0b24tdW5jaGVja2VkIn0pfSxjb21wdXRlTmFtZXNNYXRjaGluZ1JlZ2V4OmZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLl9yZWdleDtyZXR1cm4gYj90aGlzLm5hbWVzLmZpbHRlcihkPT5iLnRlc3QoZCkpOnRoaXMubmFtZXN9LGNvbXB1dGVPdXRTZWxlY3RlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuc2VsZWN0aW9uU3RhdGUsZD10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5sZW5ndGg8PXRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDtyZXR1cm4gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguZmlsdGVyKGY9Pm51bGw9PWJbZl0/ZDpiW2ZdKX0sc3luY2hyb25pemVDb2xvcnM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRJc29sYXRvckljb24oKTt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgicGFwZXItY2hlY2tib3giKS5mb3JFYWNoKGI9Pntjb25zdCBkPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYi5uYW1lKTsKYi51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IiOmQsIi0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IiOmQsIi0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yIjpkLCItLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IiOmR9KX0pO3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuaXNvbGF0b3IiKS5mb3JFYWNoKGI9Pntjb25zdCBkPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYi5uYW1lKTtiLnN0eWxlLmNvbG9yPWR9KTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy51cGRhdGVTdHlsZXMoKX0pfSxfaXNvbGF0ZU5hbWU6ZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQubmFtZSxmPXt9O3RoaXMubmFtZXMuZm9yRWFjaChmdW5jdGlvbihoKXtmW2hdPWg9PWR9KTt0aGlzLnNlbGVjdGlvblN0YXRlPWZ9LF9jaGVja2JveENoYW5nZTpmdW5jdGlvbihiKXtiPQpQb2x5bWVyLmRvbShiKS5sb2NhbFRhcmdldDtjb25zdCBkPV8uY2xvbmUodGhpcy5zZWxlY3Rpb25TdGF0ZSk7ZFtiLm5hbWVdPWIuY2hlY2tlZDt0aGlzLnNlbGVjdGlvblN0YXRlPWR9LF9pc0NoZWNrZWQ6ZnVuY3Rpb24oYil7cmV0dXJuLTEhPXRoaXMub3V0U2VsZWN0ZWQuaW5kZXhPZihiKX0sdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5zb21lKGY9PnRoaXMub3V0U2VsZWN0ZWQuaW5jbHVkZXMoZikpLGQ9e307dGhpcy5uYW1lcy5mb3JFYWNoKGY9PntkW2ZdPSFifSk7dGhpcy5zZWxlY3Rpb25TdGF0ZT1kfX0pfSkocWR8fChxZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXJ1bnMtc2VsZWN0b3IvdGYtd2JyLXN0cmluZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi13YnItc3RyaW5nIixwcm9wZXJ0aWVzOnt2YWx1ZTpTdHJpbmcsX3BhcnRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVBhcnRzKHZhbHVlKSJ9fSxfY29tcHV0ZVBhcnRzKGIpe2NvbnN0IGQ9W10sZj0vWy89XywtXS87Zm9yKG51bGw9PWImJihiPSIiKTs7KXtjb25zdCBoPWIuc2VhcmNoKGYpO2lmKC0xPT09aCl7ZC5wdXNoKGIpO2JyZWFrfWVsc2UgZC5wdXNoKGIuc2xpY2UoMCxoKzEpKSxiPWIuc2xpY2UoaCsxKX1yZXR1cm4gZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ydW5zLXNlbGVjdG9yL3RmLXJ1bnMtc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcnVucy1zZWxlY3RvciIscHJvcGVydGllczp7cnVuU2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZSIsdmFsdWU6cGQuZ2V0T2JqZWN0SW5pdGlhbGl6ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSl9LHJlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOnBkLmdldFN0cmluZ0luaXRpYWxpemVyKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Il9yZWdleE9ic2VydmVyIn0sc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LG5vdGlmeTohMH0scnVuczpBcnJheSxkYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2NsaXBwZWREYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0Q2xpcHBlZERhdGFMb2NhdGlvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKSJ9LF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoOnt0eXBlOk51bWJlciwKdmFsdWU6MjUwLHJlYWRPbmx5OiEwfSxjb2xvcmluZzp7dHlwZTpPYmplY3QsdmFsdWU6e2dldENvbG9yOnBmLnJ1bnNDb2xvclNjYWxlfX19LGF0dGFjaGVkKCl7dGhpcy5fcnVuU3RvcmVMaXN0ZW5lcj12Yy5ydW5zU3RvcmUuYWRkTGlzdGVuZXIoKCk9Pnt0aGlzLnNldCgicnVucyIsdmMucnVuc1N0b3JlLmdldFJ1bnMoKSl9KTt0aGlzLnNldCgicnVucyIsdmMucnVuc1N0b3JlLmdldFJ1bnMoKSk7dGhpcy5fZW52U3RvcmVMaXN0ZW5lcj12Yy5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsdmMuZW52aXJvbm1lbnRTdG9yZS5nZXREYXRhTG9jYXRpb24oKSl9KTt0aGlzLnNldCgiZGF0YUxvY2F0aW9uIix2Yy5lbnZpcm9ubWVudFN0b3JlLmdldERhdGFMb2NhdGlvbigpKX0sZGV0YWNoZWQoKXt2Yy5ydW5zU3RvcmUucmVtb3ZlTGlzdGVuZXJCeUtleSh0aGlzLl9ydW5TdG9yZUxpc3RlbmVyKTt2Yy5lbnZpcm9ubWVudFN0b3JlLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fZW52U3RvcmVMaXN0ZW5lcil9LApfdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7dGhpcy4kLm11bHRpQ2hlY2tib3gudG9nZ2xlQWxsKCl9LF9nZXRDbGlwcGVkRGF0YUxvY2F0aW9uOmZ1bmN0aW9uKGIsZCl7aWYodm9pZCAwIT09YiYmIShiLmxlbmd0aD5kKSlyZXR1cm4gYn0sX29wZW5EYXRhTG9jYXRpb25EaWFsb2c6ZnVuY3Rpb24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuJCQoIiNkYXRhLWxvY2F0aW9uLWRpYWxvZyIpLm9wZW4oKX0sX3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24oYixkKXtyZXR1cm4gYiYmYi5sZW5ndGg+ZH0sX3N0b3JlUnVuU2VsZWN0aW9uU3RhdGU6cGQuZ2V0T2JqZWN0T2JzZXJ2ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSksX3JlZ2V4T2JzZXJ2ZXI6cGQuZ2V0U3RyaW5nT2JzZXJ2ZXIoInJlZ2V4SW5wdXQiLHtkZWZhdWx0VmFsdWU6IiJ9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3JlZ2lzdHJ5LmpzCnZhciBxZjsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtkLk5PVF9MT0FERUQ9Ik5PVF9MT0FERUQiO2QuTE9BREVEPSJMT0FERUQiO2QuRkFJTEVEPSJGQUlMRUQifSkoYi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlfHwoYi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPXt9KSk7Yi5kYXNoYm9hcmRSZWdpc3RyeT17fTtiLnJlZ2lzdGVyRGFzaGJvYXJkPWZ1bmN0aW9uKCl7dmFyIGQ9e3BsdWdpbjoiYmVob2xkZXIiLGVsZW1lbnROYW1lOiJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiLHNob3VsZFJlbW92ZURvbTohMH07aWYoIWQucGx1Z2luKXRocm93IEVycm9yKCJEYXNoYm9hcmQucGx1Z2luIG11c3QgYmUgcHJlc2VudCIpO2lmKCFkLmVsZW1lbnROYW1lKXRocm93IEVycm9yKCJEYXNoYm9hcmQuZWxlbWVudE5hbWUgbXVzdCBiZSBwcmVzZW50Iik7aWYoZC5wbHVnaW4gaW4gYi5kYXNoYm9hcmRSZWdpc3RyeSl0aHJvdyBFcnJvcihgUGx1Z2luIGFscmVhZHkgcmVnaXN0ZXJlZDogJHtkLnBsdWdpbn1gKTtkLnRhYk5hbWV8fAooZC50YWJOYW1lPWQucGx1Z2luKTtiLmRhc2hib2FyZFJlZ2lzdHJ5W2QucGx1Z2luXT1kfX0pKHFmfHwocWY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi11dGlscy91dGlscy5qcwp2YXIgcmY7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYsaCxrKXtyZXR1cm4gMT09PWY/aDprfWIuYWdncmVnYXRlVGFnSW5mbz1mdW5jdGlvbihmLGgpe2xldCBrPXZvaWQgMDtjb25zdCB0PXt9O09iamVjdC5rZXlzKGYpLmZvckVhY2gocD0+e2NvbnN0IG09ZltwXTt2b2lkIDA9PT1rJiYoaz1tLmRpc3BsYXlOYW1lKTtrIT09bS5kaXNwbGF5TmFtZSYmKGs9bnVsbCk7dm9pZCAwPT09dFttLmRlc2NyaXB0aW9uXSYmKHRbbS5kZXNjcmlwdGlvbl09W10pO3RbbS5kZXNjcmlwdGlvbl0ucHVzaChwKX0pO2g9bnVsbCE9az9rOmg7Y29uc3QgbD0oKCk9Pntjb25zdCBwPU9iamVjdC5rZXlzKHQpO3JldHVybiAwPT09cC5sZW5ndGg/IiI6MT09PXAubGVuZ3RoP3BbMF06YCR7Ilx4M2NwXHgzZVx4M2NzdHJvbmdceDNlTXVsdGlwbGUgZGVzY3JpcHRpb25zOlx4M2Mvc3Ryb25nXHgzZVx4M2MvcFx4M2UifTx1bD4ke3AubWFwKG09Pntjb25zdCBuPXRbbV0ubWFwKHU9PmA8Y29kZT4ke3UucmVwbGFjZSgvPC9nLCJceDI2bHQ7IikucmVwbGFjZSgvPi9nLAoiXHgyNmd0OyIpLnJlcGxhY2UoLyYvZywiXHgyNmFtcDsiKX08L2NvZGU+YCkscT0yPG4ubGVuZ3RoP24uc2xpY2UoMCxuLmxlbmd0aC0xKS5qb2luKCIsICIpKyIsIGFuZCAiK25bbi5sZW5ndGgtMV06bi5qb2luKCIgYW5kICIpO3JldHVybmA8bGk+PHA+Rm9yICR7ZChuLmxlbmd0aCwicnVuIiwicnVucyIpfSAke3F9OjwvcD4ke219PC9saT5gfSkuam9pbigiIil9PC91bD5gfSkoKTtyZXR1cm57ZGlzcGxheU5hbWU6aCxkZXNjcmlwdGlvbjpsfX19KShyZnx8KHJmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItc3Bpbm5lci9wYXBlci1zcGlubmVyLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlclNwaW5uZXJCZWhhdmlvcj17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfX2FjdGl2ZUNoYW5nZWQifSxhbHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJsb2FkaW5nIixvYnNlcnZlcjoiX19hbHRDaGFuZ2VkIn0sX19jb29saW5nRG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sX19jb21wdXRlQ29udGFpbmVyQ2xhc3NlczpmdW5jdGlvbihiLGQpe3JldHVybltifHxkPyJhY3RpdmUiOiIiLGQ/ImNvb2xkb3duIjoiIl0uam9pbigiICIpfSxfX2FjdGl2ZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXt0aGlzLl9fc2V0QXJpYUhpZGRlbighYik7dGhpcy5fX2Nvb2xpbmdEb3duPSFiJiZkfSxfX2FsdENoYW5nZWQ6ZnVuY3Rpb24oYil7ImxvYWRpbmciPT09Yj90aGlzLmFsdD10aGlzLmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpfHxiOih0aGlzLl9fc2V0QXJpYUhpZGRlbigiIj09PQpiKSx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYikpfSxfX3NldEFyaWFIaWRkZW46ZnVuY3Rpb24oYil7Yj90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIil9LF9fcmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9fY29vbGluZ0Rvd249dGhpcy5hY3RpdmU9ITF9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1zcGlubmVyL3BhcGVyLXNwaW5uZXItbGl0ZS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1zcGlubmVyLWxpdGUiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlclNwaW5uZXJCZWhhdmlvcl19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kYXNoYm9hcmQtY29tbW9uL2RhdGEtbG9hZGVyLWJlaGF2aW9yLmpzCihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oZil7ZltmLkxPQURJTkc9MF09IkxPQURJTkciO2ZbZi5MT0FERUQ9MV09IkxPQURFRCJ9KShkfHwoZD17fSkpO2IuRGF0YUxvYWRlckJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthY3RpdmU6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2xvYWREYXRhSWZBY3RpdmUifSxsb2FkS2V5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sZGF0YVRvTG9hZDp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LGdldERhdGFMb2FkTmFtZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Zj0+U3RyaW5nKGYpfSxsb2FkRGF0YUNhbGxiYWNrOkZ1bmN0aW9uLHJlcXVlc3REYXRhOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGY9PnRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0aGlzLmdldERhdGFMb2FkVXJsKGYpKX19LGdldERhdGFMb2FkVXJsOkZ1bmN0aW9uLGRhdGFMb2FkaW5nOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLAp2YWx1ZTohMX0sX2RhdGFMb2FkU3RhdGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX2xvYWREYXRhQXN5bmM6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfZGF0YVRvTG9hZENoYW5nZWQoaXNBdHRhY2hlZCwgZGF0YVRvTG9hZC4qKSJdLG9uTG9hZEZpbmlzaCgpe30scmVsb2FkKCl7dGhpcy5fZGF0YUxvYWRTdGF0ZS5jbGVhcigpO3RoaXMuX2xvYWREYXRhKCl9LHJlc2V0KCl7bnVsbCE9dGhpcy5fbG9hZERhdGFBc3luYyYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz1udWxsKTt0aGlzLl9jYW5jZWxsZXImJnRoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTt0aGlzLl9kYXRhTG9hZFN0YXRlJiZ0aGlzLl9kYXRhTG9hZFN0YXRlLmNsZWFyKCk7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9sb2FkRGF0YSgpfSwKX2RhdGFUb0xvYWRDaGFuZ2VkKCl7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9sb2FkRGF0YSgpfSxjcmVhdGVkKCl7dGhpcy5fbG9hZERhdGE9Xy50aHJvdHRsZSh0aGlzLl9sb2FkRGF0YUltcGwsMTAwLHtsZWFkaW5nOiEwLHRyYWlsaW5nOiEwfSl9LGRldGFjaGVkKCl7bnVsbCE9dGhpcy5fbG9hZERhdGFBc3luYyYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz1udWxsKX0sX2xvYWREYXRhSWZBY3RpdmUoKXt0aGlzLmFjdGl2ZSYmdGhpcy5fbG9hZERhdGEoKX0sX2xvYWREYXRhSW1wbCgpe3RoaXMuYWN0aXZlJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9sb2FkRGF0YUFzeW5jKSx0aGlzLl9sb2FkRGF0YUFzeW5jPXRoaXMuYXN5bmModGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGY9PntpZighZi5jYW5jZWxsZWQpcmV0dXJuIHRoaXMuX3NldERhdGFMb2FkaW5nKCEwKSxmPXRoaXMuZGF0YVRvTG9hZC5maWx0ZXIoaD0+CntoPXRoaXMuZ2V0RGF0YUxvYWROYW1lKGgpO3JldHVybiF0aGlzLl9kYXRhTG9hZFN0YXRlLmhhcyhoKX0pLm1hcChoPT57Y29uc3Qgaz10aGlzLmdldERhdGFMb2FkTmFtZShoKTt0aGlzLl9kYXRhTG9hZFN0YXRlLnNldChrLGQuTE9BRElORyk7cmV0dXJuIHRoaXMucmVxdWVzdERhdGEoaCkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUodD0+e3QuY2FuY2VsbGVkfHwodGhpcy5fZGF0YUxvYWRTdGF0ZS5zZXQoayxkLkxPQURFRCksdGhpcy5sb2FkRGF0YUNhbGxiYWNrKHRoaXMsaCx0LnZhbHVlKSk7cmV0dXJuIGt9KSl9KSxQcm9taXNlLmFsbChmKS50aGVuKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShoPT57aWYoIWguY2FuY2VsbGVkKXtjb25zdCBrPW5ldyBTZXQoaC52YWx1ZSk7aWYodGhpcy5kYXRhVG9Mb2FkLnNvbWUodD0+ay5oYXModGhpcy5nZXREYXRhTG9hZE5hbWUodCkpKSl0aGlzLm9uTG9hZEZpbmlzaCgpfUFycmF5LmZyb20odGhpcy5fZGF0YUxvYWRTdGF0ZS52YWx1ZXMoKSkuc29tZShrPT4Kaz09PWQuTE9BRElORyl8fHRoaXMuX3NldERhdGFMb2FkaW5nKCExKX0pLCgpPT57fSkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHtjYW5jZWxsZWQ6aH0pPT57aHx8KHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCl9KSl9KSkpfX19KShxZHx8KHFkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9wbG90dGFibGUuanMKLyoKIE1JVAogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgdGhlIFNpZ25hdHVyZSBBUEkgdG8gaGVscCBpbiBjb21wYXJpbmcgd2hlbiB0d28KIFBsb3R0YWJsZSBvYmplY3RzIGhhdmUgImNoYW5nZWQiLgoKIE1lbW9pemF0aW9uIGluIFBsb3R0YWJsZSBpcyBjb21wbGljYXRlZCBieSBtdXRhYmxlIHNjYWxlcyBhbmQgZGF0YXNldHMuIFdlIGNhbm5vdCBzaW1wbHkKIHJlZmVyZW5jZSBjb21wYXJlIHR3byBlLmcuIHNjYWxlcyBzaW5jZSBpdCBtYXkgaGF2ZSBpbnRlcm5hbGx5IG11dGF0ZWQuIFRvIHJlc29sdmUgdGhpcywKIHdlIHdyaXRlIGEgcmVjdXJzaXZlIFNpZ25hdHVyZSBpbnRlcmZhY2UgdGhhdCBob2xkcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2Ygd2hhdGV2ZXIKIHN0YXRlIHRoZSBzY2FsZS9kYXRhIHdhcyBpbiBhdCB0aGUgdGltZS4gVGhlbiBvbiBtZW1vaXplZCBmdW5jdGlvbiBpbnZvY2F0aW9uIHdlIHNpZ24gdGhlCiBuZXcgaW5wdXRzIGFuZCBjb21wYXJlIHRoZSBzaWduYXR1cmVzIHRvIGRlY2lkZSBpZiB3ZSBzaG91bGQgcmVjb21wdXRlLgoKIFdlIG11c3QgaGFuZC13cml0ZSBhIHNpZ25hdHVyZSBmb3IgZWFjaCBjdXN0b20gY2xhc3Mgd2Ugd2lzaCB0byBzdXBwb3J0LgogTUlUCgogQGZpbGVvdmVydmlldyBtYW51YWxseSBhZGQgZDMtc2VsZWN0aW9uLW11bHRpIHRvIGQzIGRlZmF1bHQgYnVuZGxlLiBNb3N0IG9mIHRoaXMgY29kZSBpcwogY29waWVkIGZyb20gZDMtc2VsZWN0aW9uLW11bHRpQDEuMC4wLgogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1zZWxlY3Rpb24tbXVsdGkvaXNzdWVzLzExIGZvciB3aHkgd2UgaGF2ZSB0byBkbyB0aGlzCiBNSVQKIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyBhIGNvbnZlbmllbnQgdGh1bmsgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBjb21tb24gY2FzZQogb2YgY3JlYXRpbmcgYSBtZW1vaXplZCBmdW5jdGlvbiB0aGF0IHRha2VzIGl0cyBpbnB1dHMgZnJvbSBtdXRhYmxlIGNsYXNzIHByb3BlcnRpZXMuCiBNSVQKIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyBhIGZ1bmN0aW9uIG1lbW9pemVyIHVzaW5nIHRoZSBTaWduYXR1cmUgQVBJLgogUGxvdHRhYmxlIDMuNy4wIChodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvcGxvdHRhYmxlKQogQ29weXJpZ2h0IDIwMTQtMjAxNyBQYWxhbnRpciBUZWNobm9sb2dpZXMKIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3Bsb3R0YWJsZS9ibG9iL21hc3Rlci9MSUNFTlNFKQogaXMtcGxhaW4tb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1wbGFpbi1vYmplY3Q+CgogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0LgogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogaXNvYmplY3QgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzb2JqZWN0PgoKIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC4KIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KKi8KKGZ1bmN0aW9uKGIsZCl7Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cyYmIm9iamVjdCI9PT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWQocmVxdWlyZSgiZDMiKSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZDMiXSxkKToib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuUGxvdHRhYmxlPWQocmVxdWlyZSgiZDMiKSk6Yi5QbG90dGFibGU9ZChiLmQzKX0pKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYoayl7aWYoaFtrXSlyZXR1cm4gaFtrXS5leHBvcnRzO3ZhciB0PWhba109e2k6ayxsOiExLGV4cG9ydHM6e319O2Rba10uY2FsbCh0LmV4cG9ydHMsdCx0LmV4cG9ydHMsZik7dC5sPSEwO3JldHVybiB0LmV4cG9ydHN9dmFyIGg9e307Zi5tPWQ7Zi5jPWg7Zi5pPWZ1bmN0aW9uKGspe3JldHVybiBrfTtmLmQ9ZnVuY3Rpb24oayx0LGwpe2YubyhrLHQpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywKdCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0Omx9KX07Zi5uPWZ1bmN0aW9uKGspe3ZhciB0PWsmJmsuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBrWyJkZWZhdWx0Il19OmZ1bmN0aW9uKCl7cmV0dXJuIGt9O2YuZCh0LCJhIix0KTtyZXR1cm4gdH07Zi5vPWZ1bmN0aW9uKGssdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChrLHQpfTtmLnA9IiI7cmV0dXJuIGYoZi5zPTE0MCl9KFtmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1kPWgoMTA3KTtmLkFycmF5PWQ7ZD1oKDExMCk7Zi5Db2xvcj1kO2Q9aCg1NSk7Zi5ET009ZDtkPWgoNTYpO2YuTWF0aD1kO2Q9aCgxMTMpO2YuT2JqZWN0PWQ7ZD1oKDU3KTtmLlJUcmVlPWQ7ZD1oKDExNSk7Zi5TdGFja2luZz1kO2Q9aCgzNSk7Zi5XaW5kb3c9ZDtrKGgoMTA4KSk7ayhoKDEwOSkpO2soaCgxMikpOwprKGgoMTExKSk7ayhoKDExMikpO2soaCg1OCkpO2soaCgxMTYpKX0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPWJ9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKEcsRCxCKXt2YXIgST1ELmFjY2Vzc29yO0Q9RC5zY2FsZTtpZihudWxsPT1EKXJldHVybltdO3ZhciBOPUcuZGF0YSgpO251bGwhPUImJihOPU4uZmlsdGVyKGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEIoTyxILEcpfSkpO049Ti5tYXAoZnVuY3Rpb24oTyxIKXtyZXR1cm4gSShPLEgsRyl9KTtyZXR1cm4gRC5leHRlbnRPZlZhbHVlcyhOKX12YXIgdD10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oRyxEKXtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1HfWZvcih2YXIgSSBpbiBEKUQuaGFzT3duUHJvcGVydHkoSSkmJihHW0ldPURbSV0pO0cucHJvdG90eXBlPW51bGw9PT1EP09iamVjdC5jcmVhdGUoRCk6KEIucHJvdG90eXBlPUQucHJvdG90eXBlLG5ldyBCKX0sbD1oKDEpLHA9aCg3KTtkPWgoNCk7dmFyIG09CmgoMTgpLG49aCg2KSxxPWgoOSksdT1oKDIwKSx4PWgoMCksQT1oKDEyKSx5PWgoMTApLHc9aCg1MSksQz1oKDUyKTtmLlJlbmRlcmVyPXkubWFrZUVudW0oWyJzdmciLCJjYW52YXMiXSk7aD1mdW5jdGlvbihHKXtmdW5jdGlvbiBEKCl7dmFyIEI9Ry5jYWxsKHRoaXMpfHx0aGlzO0IuX2RhdGFDaGFuZ2VkPSExO0IuX2F0dHJFeHRlbnRzPXt9O0IuX2FuaW1hdGU9ITE7Qi5fYW5pbWF0b3JzPXt9O0IuX3Byb3BlcnR5RXh0ZW50cz17fTtCLl9yZXNldEVudGl0eVN0b3JlPWZ1bmN0aW9uKCl7Qi5fY2FjaGVkRW50aXR5U3RvcmU9dm9pZCAwfTtCLl9vdmVyZmxvd0hpZGRlbj0hMDtCLmFkZENsYXNzKCJwbG90Iik7Qi5fZGF0YXNldFRvRHJhd2VyPW5ldyB4Lk1hcDtCLl9hdHRyQmluZGluZ3M9bC5tYXAoKTtCLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKE4sTyl7cmV0dXJuIEIuX2luY2x1ZGVkVmFsdWVzRm9yU2NhbGUoTixPKX07Qi5fcmVuZGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gQi5yZW5kZXIoKX07CkIuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEIuX29uRGF0YXNldFVwZGF0ZSgpfTtCLl9wcm9wZXJ0eUJpbmRpbmdzPWwubWFwKCk7dmFyIEk9KG5ldyBwLkVhc2luZykubWF4VG90YWxEdXJhdGlvbihELl9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtCLmFuaW1hdG9yKHcuQW5pbWF0b3IuTUFJTixJKTtCLmFuaW1hdG9yKHcuQW5pbWF0b3IuUkVTRVQsbmV3IHAuTnVsbCk7Qi5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlPXguV2luZG93LmRlYm91bmNlKEMuRGVmZXJyZWRSZW5kZXJlci5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVksQi5fcmVzZXRFbnRpdHlTdG9yZSk7cmV0dXJuIEJ9dChELEcpO0QuZ2V0VG90YWxEcmF3VGltZT1mdW5jdGlvbihCLEkpe3JldHVybiBJLnJlZHVjZShmdW5jdGlvbihOLE8pe3JldHVybiBOK08uYW5pbWF0b3IudG90YWxUaW1lKEIubGVuZ3RoKX0sMCl9O0QuYXBwbHlEcmF3U3RlcHM9ZnVuY3Rpb24oQixJKXtyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTil7dmFyIE89Ck4uYXR0clRvUHJvamVjdG9yLEg9e307T2JqZWN0LmtleXMoTykuZm9yRWFjaChmdW5jdGlvbihLKXtIW0tdPWZ1bmN0aW9uKE0sTCl7cmV0dXJuIE9bS10oTSxMLEkpfX0pO3JldHVybnthdHRyVG9BcHBsaWVkUHJvamVjdG9yOkgsYW5pbWF0b3I6Ti5hbmltYXRvcn19KX07RC5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKEIpe0I9QS5jb2VyY2VFeHRlcm5hbEQzKEIpO0cucHJvdG90eXBlLmFuY2hvci5jYWxsKHRoaXMsQik7dGhpcy5fZGF0YUNoYW5nZWQ9ITA7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMuX3VwZGF0ZUV4dGVudHMoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dmFyIEI9dGhpczt0aGlzLl9pc1NldHVwfHwoRy5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksbnVsbCE9dGhpcy5fY2FudmFzJiZ0aGlzLl9hcHBlbmRDYW52YXNOb2RlKCksdGhpcy5fcmVuZGVyQXJlYT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJyZW5kZXItYXJlYSIsCiEwKSx0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihJKXtyZXR1cm4gQi5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0KEkpfSkpfTtELnByb3RvdHlwZS5fYXBwZW5kQ2FudmFzTm9kZT1mdW5jdGlvbigpe3ZhciBCPXRoaXMuZWxlbWVudCgpLnNlbGVjdCgiLnBsb3QtY2FudmFzLWNvbnRhaW5lciIpO0IuZW1wdHkoKSYmKEI9dGhpcy5lbGVtZW50KCkuYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJwbG90LWNhbnZhcy1jb250YWluZXIiLCEwKSxCLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMubm9kZSgpKSl9O0QucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihCLEksTixPKXtHLnByb3RvdHlwZS5zZXRCb3VuZHMuY2FsbCh0aGlzLEIsSSxOLE8pO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTtudWxsIT10aGlzLl9jYW52YXMmJih0aGlzLl9idWZmZXJDYW52YXMmJiF0aGlzLl9idWZmZXJDYW52YXNWYWxpZCYmKHRoaXMuX2J1ZmZlckNhbnZhcy5hdHRyKCJ3aWR0aCIsCnRoaXMuX2NhbnZhcy5hdHRyKCJ3aWR0aCIpKSx0aGlzLl9idWZmZXJDYW52YXMuYXR0cigiaGVpZ2h0Iix0aGlzLl9jYW52YXMuYXR0cigiaGVpZ2h0IikpLChOPXRoaXMuX2J1ZmZlckNhbnZhcy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSkmJk4uZHJhd0ltYWdlKHRoaXMuX2NhbnZhcy5ub2RlKCksMCwwKSx0aGlzLl9idWZmZXJDYW52YXNWYWxpZD0hMCksTj1udWxsIT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbz93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzoxLHRoaXMuX2NhbnZhcy5hdHRyKCJ3aWR0aCIsQipOKSx0aGlzLl9jYW52YXMuYXR0cigiaGVpZ2h0IixJKk4pLE89dGhpcy5fY2FudmFzLm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpKSYmKE8uc2V0VHJhbnNmb3JtKE4sMCwwLE4sMCwwKSx0aGlzLl9idWZmZXJDYW52YXMmJk8uZHJhd0ltYWdlKHRoaXMuX2J1ZmZlckNhbnZhcy5ub2RlKCksMCwwLEIsSSkpfTtELnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIEI9dGhpczsKRy5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEkub2ZmVXBkYXRlKEIuX3JlbmRlckNhbGxiYWNrKX0pO3RoaXMuZGF0YXNldHMoW10pfTtELnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKEIpe0I9dGhpcy5fZGF0YXNldFRvRHJhd2VyLmdldChCKTsic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9CLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTpCLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpO3JldHVybiBCfTtELnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxLlNWR0RyYXdlcigicGF0aCIsIiIpfSxmdW5jdGlvbihCKXtyZXR1cm4gbmV3IG0uQ2FudmFzRHJhd2VyKEIsZnVuY3Rpb24oKXt9KX0pfTtELnByb3RvdHlwZS5fZ2V0QW5pbWF0b3I9ZnVuY3Rpb24oQil7cmV0dXJuIHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKT8KdGhpcy5fYW5pbWF0b3JzW0JdfHxuZXcgcC5OdWxsOm5ldyBwLk51bGx9O0QucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVFeHRlbnRzKCk7dGhpcy5fZGF0YUNoYW5nZWQ9ITA7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMucmVuZGVyTG93UHJpb3JpdHkoKX07RC5wcm90b3R5cGUuYXR0cj1mdW5jdGlvbihCLEksTil7aWYobnVsbD09SSlyZXR1cm4gdGhpcy5fYXR0ckJpbmRpbmdzLmdldChCKTt0aGlzLl9iaW5kQXR0cihCLEksTik7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX2JpbmRQcm9wZXJ0eT1mdW5jdGlvbihCLEksTixPKXt2YXIgSD10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChCKTtIPW51bGwhPUg/SC5zY2FsZTpudWxsO3RoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KEIse2FjY2Vzc29yOiJmdW5jdGlvbiI9PT10eXBlb2YgST9JOmZ1bmN0aW9uKCl7cmV0dXJuIEl9LHNjYWxlOk4scG9zdFNjYWxlOk99KTsKbnVsbCE9SCYmdGhpcy5fdW5pbnN0YWxsU2NhbGVGb3JLZXkoSCxCKTtudWxsIT1OJiZ0aGlzLl9pbnN0YWxsU2NhbGVGb3JLZXkoTixCKTt0aGlzLl9jbGVhckF0dHJUb1Byb2plY3RvckNhY2hlKCl9O0QucHJvdG90eXBlLl9iaW5kQXR0cj1mdW5jdGlvbihCLEksTil7dmFyIE89dGhpcy5fYXR0ckJpbmRpbmdzLmdldChCKTtPPW51bGwhPU8/Ty5zY2FsZTpudWxsO3RoaXMuX2F0dHJCaW5kaW5ncy5zZXQoQix7YWNjZXNzb3I6ImZ1bmN0aW9uIj09PXR5cGVvZiBJP0k6ZnVuY3Rpb24oKXtyZXR1cm4gSX0sc2NhbGU6Tn0pO251bGwhPU8mJnRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KE8sQik7bnVsbCE9TiYmdGhpcy5faW5zdGFsbFNjYWxlRm9yS2V5KE4sQik7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpfTtELnByb3RvdHlwZS5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZT1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3J9O0QucHJvdG90eXBlLl9nZXRBdHRyVG9Qcm9qZWN0b3I9CmZ1bmN0aW9uKCl7bnVsbD09dGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yJiYodGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yPXRoaXMuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yKCkpO3JldHVybiB4Lk9iamVjdC5hc3NpZ24oe30sdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yKX07RC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIEI9e307dGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goZnVuY3Rpb24oTixPKXtCW09dPUQuX3NjYWxlZEFjY2Vzc29yKE4pfSk7dmFyIEk9dGhpcy5fcHJvcGVydHlQcm9qZWN0b3JzKCk7T2JqZWN0LmtleXMoSSkuZm9yRWFjaChmdW5jdGlvbihOKXtudWxsPT1CW05dJiYoQltOXT1JW05dKX0pO3JldHVybiBCfTtELnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe0cucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5faXNBbmNob3JlZCYmKHRoaXMuX3BhaW50KCksCnRoaXMuX2RhdGFDaGFuZ2VkPSExKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUucmVuZGVyTG93UHJpb3JpdHk9ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJDYWxsYmFjaygpfTtELnByb3RvdHlwZS5hbmltYXRlZD1mdW5jdGlvbihCKXtpZihudWxsPT1CKXJldHVybiB0aGlzLl9hbmltYXRlO3RoaXMuX2FuaW1hdGU9QjtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7Ry5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyk7dGhpcy5fdXBkYXRlRXh0ZW50cygpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5fc2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEI9W107dGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSSl7ST1JLnNjYWxlO251bGwhPUkmJi0xPT09Qi5pbmRleE9mKEkpJiZCLnB1c2goSSl9KTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSSl7ST1JLnNjYWxlO251bGwhPUkmJi0xPT09Qi5pbmRleE9mKEkpJiZCLnB1c2goSSl9KTsKcmV0dXJuIEJ9O0QucHJvdG90eXBlLl91cGRhdGVFeHRlbnRzPWZ1bmN0aW9uKCl7dmFyIEI9dGhpczt0aGlzLl9yZXNldEVudGl0eVN0b3JlKCk7dGhpcy5fc2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihJKXtyZXR1cm4gSS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKEIuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfSl9O0QucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT1mdW5jdGlvbigpe3JldHVybiBudWxsfTtELnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yQXR0cj1mdW5jdGlvbihCKXt2YXIgST10aGlzO251bGw9PXRoaXMuX2F0dHJFeHRlbnRzW0JdJiYodGhpcy5fYXR0ckV4dGVudHNbQl09dS5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiBJLmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIEkuX2F0dHJCaW5kaW5ncy5nZXQoQil9LGZ1bmN0aW9uKE4sTyl7cmV0dXJuIG51bGw9PU98fG51bGw9PU8uYWNjZXNzb3I/bnVsbDpOLm1hcChmdW5jdGlvbihIKXtyZXR1cm4gayhILApPLG51bGwpfSl9KSk7cmV0dXJuIHRoaXMuX2F0dHJFeHRlbnRzW0JdKCl9O0QucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihCKXt2YXIgST10aGlzO251bGw9PXRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXSYmKHRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXT11Lm1lbVRodW5rKGZ1bmN0aW9uKCl7cmV0dXJuIEkuZGF0YXNldHMoKX0sZnVuY3Rpb24oKXtyZXR1cm4gSS5fcHJvcGVydHlCaW5kaW5ncy5nZXQoQil9LGZ1bmN0aW9uKCl7cmV0dXJuIEkuX2ZpbHRlckZvclByb3BlcnR5KEIpfSxmdW5jdGlvbihOLE8sSCl7cmV0dXJuIG51bGw9PU98fG51bGw9PU8uYWNjZXNzb3I/bnVsbDpOLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gayhLLE8sSCl9KX0pKTtyZXR1cm4gdGhpcy5fcHJvcGVydHlFeHRlbnRzW0JdKCl9O0QucHJvdG90eXBlLl9pbmNsdWRlZFZhbHVlc0ZvclNjYWxlPWZ1bmN0aW9uKEIsSSl7dmFyIE49dGhpcztpZighdGhpcy5faXNBbmNob3JlZCYmCiFJKXJldHVybltdO3ZhciBPPVtdO3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEgsSyl7SC5zY2FsZT09PUImJihIPU4uZ2V0RXh0ZW50c0ZvckF0dHIoSyksbnVsbCE9SCYmKE89Ty5jb25jYXQobC5tZXJnZShIKSkpKX0pO3RoaXMuX3Byb3BlcnR5QmluZGluZ3MuZWFjaChmdW5jdGlvbihILEspe0guc2NhbGU9PT1CJiYoSD1OLmdldEV4dGVudHNGb3JQcm9wZXJ0eShLKSxudWxsIT1IJiYoTz1PLmNvbmNhdChsLm1lcmdlKEgpKSkpfSk7cmV0dXJuIE99O0QucHJvdG90eXBlLmFuaW1hdG9yPWZ1bmN0aW9uKEIsSSl7aWYodm9pZCAwPT09SSlyZXR1cm4gdGhpcy5fYW5pbWF0b3JzW0JdO3RoaXMuX2FuaW1hdG9yc1tCXT1JO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5yZW5kZXJlcj1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLl9jYW52YXM/InN2ZyI6ImNhbnZhcyJ9O0QucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oQil7dGhpcy5fYWRkRGF0YXNldChCKTsKdGhpcy5fb25EYXRhc2V0VXBkYXRlKCl9O0QucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX3JlbW92ZURhdGFzZXQoQik7dmFyIEk9dGhpcy5fY3JlYXRlRHJhd2VyKEIpO3RoaXMuX2RhdGFzZXRUb0RyYXdlci5zZXQoQixJKTt0aGlzLl9pc1NldHVwJiZ0aGlzLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQoQik7Qi5vblVwZGF0ZSh0aGlzLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjayk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oQil7dGhpcy5fcmVtb3ZlRGF0YXNldChCKTt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKX07RC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oQil7aWYoLTE9PT10aGlzLmRhdGFzZXRzKCkuaW5kZXhPZihCKSlyZXR1cm4gdGhpczt0aGlzLl9yZW1vdmVEYXRhc2V0Tm9kZXMoQik7Qi5vZmZVcGRhdGUodGhpcy5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2spO3RoaXMuX2RhdGFzZXRUb0RyYXdlci5kZWxldGUoQik7CnJldHVybiB0aGlzfTtELnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEIpe3RoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQoQikucmVtb3ZlKCl9O0QucHJvdG90eXBlLmRhdGFzZXRzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXMsTj1bXTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaChmdW5jdGlvbihPLEgpe3JldHVybiBOLnB1c2goSCl9KTtpZihudWxsPT1CKXJldHVybiBOO04uZm9yRWFjaChmdW5jdGlvbihPKXtyZXR1cm4gSS5fcmVtb3ZlRGF0YXNldChPKX0pO0IuZm9yRWFjaChmdW5jdGlvbihPKXtyZXR1cm4gSS5fYWRkRGF0YXNldChPKX0pO3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgcC5OdWxsfV19O0QucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9CmZ1bmN0aW9uKCl7fTtELnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcz1mdW5jdGlvbihCKXt2YXIgST10aGlzLE49W107Qi5mb3JFYWNoKGZ1bmN0aW9uKE8sSCl7dmFyIEs9SS5fZGF0YXNldFRvRHJhd2VyLmdldChPKSxNPTA7Ty5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbihMLFEpe3ZhciBUPUkuX3BpeGVsUG9pbnQoTCxRLE8pO3guTWF0aC5pc05hTihULngpfHx4Lk1hdGguaXNOYU4oVC55KXx8KE4ucHVzaCh7ZGF0dW06TCxnZXQgcG9zaXRpb24oKXtyZXR1cm4gSS5fcGl4ZWxQb2ludC5jYWxsKEksTCxRLE8pfSxpbmRleDpRLGRhdGFzZXQ6TyxkYXRhc2V0SW5kZXg6SCxjb21wb25lbnQ6SSxkcmF3ZXI6Syx2YWxpZERhdHVtSW5kZXg6TX0pLE0rKyl9KX0pO3JldHVybiBOfTtELnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBCPW5ldyB4Lk1hcDt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihJKXtyZXR1cm4gQi5zZXQoSSwKSS5kYXRhKCkpfSk7cmV0dXJuIEJ9O0QucHJvdG90eXBlLl9wYWludD1mdW5jdGlvbigpe3ZhciBCPXRoaXM7ZGVsZXRlIHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcjt2YXIgST10aGlzLl9nZW5lcmF0ZURyYXdTdGVwcygpLE49dGhpcy5fZ2V0RGF0YVRvRHJhdygpLE89dGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gQi5fZGF0YXNldFRvRHJhd2VyLmdldChLKX0pO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXt2YXIgSD10aGlzLl9jYW52YXMubm9kZSgpO0guZ2V0Q29udGV4dCgiMmQiKS5jbGVhclJlY3QoMCwwLEguY2xpZW50V2lkdGgsSC5jbGllbnRIZWlnaHQpO3RoaXMuX2J1ZmZlckNhbnZhc1ZhbGlkPSExfXRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEssTSl7dmFyIEw9RC5hcHBseURyYXdTdGVwcyhJLEspO09bTV0uZHJhdyhOLmdldChLKSxMKX0pO0g9dGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gRC5nZXRUb3RhbERyYXdUaW1lKE4uZ2V0KEspLApJKX0pO0g9eC5NYXRoLm1heChILDApO3RoaXMuX2FkZGl0aW9uYWxQYWludChIKX07RC5wcm90b3R5cGUuc2VsZWN0aW9ucz1mdW5jdGlvbihCKXt2YXIgST10aGlzO3ZvaWQgMD09PUImJihCPXRoaXMuZGF0YXNldHMoKSk7aWYoImNhbnZhcyI9PT10aGlzLnJlbmRlcmVyKCkpcmV0dXJuIGwuc2VsZWN0QWxsKCk7dmFyIE49W107Qi5mb3JFYWNoKGZ1bmN0aW9uKE8pe089SS5fZGF0YXNldFRvRHJhd2VyLmdldChPKTtudWxsIT1PJiYoTz1PLmdldFZpc3VhbFByaW1pdGl2ZXMoKSxOLnB1c2guYXBwbHkoTixPKSl9KTtyZXR1cm4gbC5zZWxlY3RBbGwoTil9O0QucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7cmV0dXJuIHRoaXMuX2dldEVudGl0eVN0b3JlKEIpLmVudGl0aWVzKCkubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBJLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoTil9KX07RC5wcm90b3R5cGUuX2dldEVudGl0eVN0b3JlPWZ1bmN0aW9uKEIpe2Z1bmN0aW9uIEkoSCl7cmV0dXJuIE4uX2VudGl0eUJvdW5kcyhIKX0KdmFyIE49dGhpcztpZih2b2lkIDAhPT1CKXt2YXIgTz1uZXcgeC5FbnRpdHlTdG9yZTtPLmFkZEFsbCh0aGlzLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzKEIpLEksdGhpcy5fbG9jYWxPcmlnaW5Cb3VuZHMoKSk7cmV0dXJuIE99dm9pZCAwPT09dGhpcy5fY2FjaGVkRW50aXR5U3RvcmUmJihPPW5ldyB4LkVudGl0eVN0b3JlLE8uYWRkQWxsKHRoaXMuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXModGhpcy5kYXRhc2V0cygpKSxJLHRoaXMuX2xvY2FsT3JpZ2luQm91bmRzKCkpLHRoaXMuX2NhY2hlZEVudGl0eVN0b3JlPU8pO3JldHVybiB0aGlzLl9jYWNoZWRFbnRpdHlTdG9yZX07RC5wcm90b3R5cGUuX2xvY2FsT3JpZ2luQm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJue3RvcExlZnQ6e3g6MCx5OjB9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OnRoaXMuaGVpZ2h0KCl9fX07RC5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbihCKXtCPXRoaXMuX3BpeGVsUG9pbnQoQi5kYXR1bSwKQi5pbmRleCxCLmRhdGFzZXQpO3JldHVybnt4OkIueCx5OkIueSx3aWR0aDowLGhlaWdodDowfX07RC5wcm90b3R5cGUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eT1mdW5jdGlvbihCKXtyZXR1cm57Ym91bmRzOnRoaXMuX2VudGl0eUJvdW5kcyhCKSxjb21wb25lbnQ6Qi5jb21wb25lbnQsZGF0YXNldDpCLmRhdGFzZXQsZGF0YXNldEluZGV4OkIuZGF0YXNldEluZGV4LGRhdHVtOkIuZGF0dW0saW5kZXg6Qi5pbmRleCxwb3NpdGlvbjpCLnBvc2l0aW9uLHNlbGVjdGlvbjpsLnNlbGVjdChCLmRyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVzKClbQi52YWxpZERhdHVtSW5kZXhdKX19O0QucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigicGxvdHMgbXVzdCBpbXBsZW1lbnQgZW50aXRpZXNBdCIpO307RC5wcm90b3R5cGUuZW50aXR5TmVhcmVzdD1mdW5jdGlvbihCKXtCPXRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXR5TmVhcmVzdChCKTsKcmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOnRoaXMuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShCKX07RC5wcm90b3R5cGUuZW50aXRpZXNJbj1mdW5jdGlvbihCLEkpe3JldHVybiB0aGlzLmVudGl0aWVzSW5Cb3VuZHMobnVsbD09ST97eDpCLnRvcExlZnQueCx5OkIudG9wTGVmdC55LHdpZHRoOkIuYm90dG9tUmlnaHQueC1CLnRvcExlZnQueCxoZWlnaHQ6Qi5ib3R0b21SaWdodC55LUIudG9wTGVmdC55fTp7eDpCLm1pbix5OkkubWluLHdpZHRoOkIubWF4LUIubWluLGhlaWdodDpJLm1heC1JLm1pbn0pfTtELnByb3RvdHlwZS5lbnRpdGllc0luQm91bmRzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7aWYoQj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5Cb3VuZHMoQikpcmV0dXJuIEIubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBJLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoTil9KX07RC5wcm90b3R5cGUuZW50aXRpZXNJblhCb3VuZHM9CmZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7aWYoQj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5YQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE4pfSl9O0QucHJvdG90eXBlLmVudGl0aWVzSW5ZQm91bmRzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7aWYoQj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5ZQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE4pfSl9O0QucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihCKXtCLm9mZlVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayk7Qi5vZmZVcGRhdGUodGhpcy5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlKTtCLnJlbW92ZUluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcil9OwpELnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKEIpe0Iub25VcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO0Iub25VcGRhdGUodGhpcy5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlKTtCLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcil9O0QucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm57fX07RC5fc2NhbGVkQWNjZXNzb3I9ZnVuY3Rpb24oQil7dmFyIEk9Qi5zY2FsZSxOPUIuYWNjZXNzb3IsTz1CLnBvc3RTY2FsZSxIPW51bGw9PUk/TjpmdW5jdGlvbihLLE0sTCl7cmV0dXJuIEkuc2NhbGUoTihLLE0sTCkpfTtyZXR1cm4gbnVsbD09Tz9IOmZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTyhIKEssTSxMKSxLLE0sTCl9fTtELnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbigpe3JldHVybnt4OjAseTowfX07RC5wcm90b3R5cGUuX2FuaW1hdGVPbk5leHRSZW5kZXI9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGUmJnRoaXMuX2RhdGFDaGFuZ2VkfTtyZXR1cm4gRH0oZC5Db21wb25lbnQpO2guX0FOSU1BVElPTl9NQVhfRFVSQVRJT049NjAwO2YuUGxvdD1ofSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhwKXtmb3IodmFyIG0gaW4gcClmLmhhc093blByb3BlcnR5KG0pfHwoZlttXT1wW21dKX1kPWgoMTA1KTtmLlRpY2tHZW5lcmF0b3JzPWQ7ayhoKDU0KSk7ayhoKDEwMSkpO2soaCgxMDIpKTtrKGgoMTAzKSk7ayhoKDEwNCkpO2soaCgxMDYpKTt2YXIgdD1oKDU0KSxsPWgoMTEpO2YuaXNUcmFuc2Zvcm1hYmxlPWZ1bmN0aW9uKHApe3JldHVybiBwIGluc3RhbmNlb2YgbC5RdWFudGl0YXRpdmVTY2FsZXx8cCBpbnN0YW5jZW9mIHQuQ2F0ZWdvcnl9fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSx0PWgoMzApLGw9aCgwKSxwPWgoMTIpO2Q9aCgxMCk7Zi5YQWxpZ25tZW50PWQubWFrZUVudW0oWyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiXSk7CmYuWUFsaWdubWVudD1kLm1ha2VFbnVtKFsidG9wIiwiY2VudGVyIiwiYm90dG9tIl0pO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBtKCl7dGhpcy5fb3ZlcmZsb3dIaWRkZW49ITE7dGhpcy5fb3JpZ2luPXt4OjAseTowfTt0aGlzLl94QWxpZ25tZW50PSJsZWZ0Ijt0aGlzLl95QWxpZ25tZW50PSJ0b3AiO3RoaXMuX2lzQW5jaG9yZWQ9dGhpcy5faXNTZXR1cD0hMTt0aGlzLl9jc3NDbGFzc2VzPW5ldyBsLlNldDt0aGlzLl9kZXN0cm95ZWQ9ITE7dGhpcy5fb25BbmNob3JDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dGhpcy5fb25EZXRhY2hDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dGhpcy5fY3NzQ2xhc3Nlcy5hZGQoImNvbXBvbmVudCIpfW0ucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihuKXtuPXAuY29lcmNlRXh0ZXJuYWxEMyhuKTtpZih0aGlzLl9kZXN0cm95ZWQpdGhyb3cgRXJyb3IoIkNhbid0IHJldXNlIGRlc3Ryb3koKS1lZCBDb21wb25lbnRzISIpO3RoaXMuaXNSb290KCkmJgoodGhpcy5fcm9vdEVsZW1lbnQ9bix0aGlzLl9yb290RWxlbWVudC5jbGFzc2VkKCJwbG90dGFibGUiLCEwKSk7bnVsbCE9dGhpcy5fZWxlbWVudD9uLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50Lm5vZGUoKSk6KHRoaXMuX2VsZW1lbnQ9bi5hcHBlbmQoImRpdiIpLHRoaXMuX3NldHVwKCkpO3RoaXMuX2lzQW5jaG9yZWQ9ITA7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25BbmNob3I9ZnVuY3Rpb24obil7dGhpcy5faXNBbmNob3JlZCYmbih0aGlzKTt0aGlzLl9vbkFuY2hvckNhbGxiYWNrcy5hZGQobil9O20ucHJvdG90eXBlLm9mZkFuY2hvcj1mdW5jdGlvbihuKXt0aGlzLl9vbkFuY2hvckNhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7dGhpcy5faXNTZXR1cHx8KHRoaXMuX2Nzc0NsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihxKXtuLl9lbGVtZW50LmNsYXNzZWQocSwKITApfSksdGhpcy5fY3NzQ2xhc3Nlcz1uZXcgbC5TZXQsdGhpcy5fYmFja2dyb3VuZENvbnRhaW5lcj10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiYmFja2dyb3VuZC1jb250YWluZXIiLCEwKSx0aGlzLl9jb250ZW50PXRoaXMuX2VsZW1lbnQuYXBwZW5kKCJzdmciKS5jbGFzc2VkKCJjb250ZW50IiwhMCksdGhpcy5fZm9yZWdyb3VuZENvbnRhaW5lcj10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiZm9yZWdyb3VuZC1jb250YWluZXIiLCEwKSx0aGlzLl9vdmVyZmxvd0hpZGRlbj90aGlzLl9jb250ZW50LmNsYXNzZWQoImNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4iLCEwKTp0aGlzLl9jb250ZW50LmNsYXNzZWQoImNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIiwhMCksdGhpcy5faXNTZXR1cD0hMCl9O20ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7cmV0dXJue21pbldpZHRoOjAsbWluSGVpZ2h0OjB9fTttLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbihuLHEsdSl7aWYobnVsbD09bnx8bnVsbD09cXx8bnVsbD09dSl7aWYobnVsbD09dGhpcy5fZWxlbWVudCl0aHJvdyBFcnJvcigiYW5jaG9yKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNvbXB1dGVMYXlvdXQoKSIpO2lmKG51bGwhPXRoaXMuX3Jvb3RFbGVtZW50KW49e3g6MCx5OjB9LHU9dGhpcy5fcm9vdEVsZW1lbnQubm9kZSgpLHE9bC5ET00uZWxlbWVudFdpZHRoKHUpLHU9bC5ET00uZWxlbWVudEhlaWdodCh1KTtlbHNlIHRocm93IEVycm9yKCJudWxsIGFyZ3VtZW50cyBjYW5ub3QgYmUgcGFzc2VkIHRvIGNvbXB1dGVMYXlvdXQoKSBvbiBhIG5vbi1yb290LCB1bmFuY2hvcmVkIG5vZGUiKTt9dmFyIHg9dGhpcy5fc2l6ZUZyb21PZmZlcihxLHUpLEE9eC5oZWlnaHQ7eD14LndpZHRoO3RoaXMuc2V0Qm91bmRzKHgsQSxuLngrKHEteCkqbS5feEFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3hBbGlnbm1lbnRdLG4ueSsodS1BKSptLl95QWxpZ25Ub1Byb3BvcnRpb25bdGhpcy5feUFsaWdubWVudF0pOwpyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuc2V0Qm91bmRzPWZ1bmN0aW9uKG4scSx1LHgpe3ZvaWQgMD09PXUmJih1PTApO3ZvaWQgMD09PXgmJih4PTApO3RoaXMuX3dpZHRoPW47dGhpcy5faGVpZ2h0PXE7dGhpcy5fb3JpZ2luPXt4OnUseTp4fTtudWxsIT10aGlzLl9lbGVtZW50JiZ0aGlzLl9lbGVtZW50LnN0eWxlcyh7bGVmdDp1KyJweCIsaGVpZ2h0OnErInB4Iix0b3A6eCsicHgiLHdpZHRoOm4rInB4In0pO251bGwhPXRoaXMuX3Jlc2l6ZUhhbmRsZXImJnRoaXMuX3Jlc2l6ZUhhbmRsZXIoe3dpZHRoOm4saGVpZ2h0OnF9KX07bS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24obixxKXt2YXIgdT10aGlzLnJlcXVlc3RlZFNwYWNlKG4scSk7cmV0dXJue3dpZHRoOnRoaXMuZml4ZWRXaWR0aCgpP01hdGgubWluKG4sdS5taW5XaWR0aCk6bixoZWlnaHQ6dGhpcy5maXhlZEhlaWdodCgpP01hdGgubWluKHEsdS5taW5IZWlnaHQpOnF9fTttLnByb3RvdHlwZS5yZW5kZXI9CmZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmMDw9dGhpcy53aWR0aCgpJiYwPD10aGlzLmhlaWdodCgpJiZ0LnJlZ2lzdGVyVG9SZW5kZXIodGhpcyk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJlbmRlckxvd1ByaW9yaXR5PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXIoKX07bS5wcm90b3R5cGUuX3NjaGVkdWxlQ29tcHV0ZUxheW91dD1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJnQucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIodGhpcyl9O20ucHJvdG90eXBlLm9uUmVzaXplPWZ1bmN0aW9uKG4pe3RoaXMuX3Jlc2l6ZUhhbmRsZXI9bjtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmKHRoaXMuaXNSb290KCk/dGhpcy5fc2NoZWR1bGVDb21wdXRlTGF5b3V0KCk6CnRoaXMucGFyZW50KCkucmVkcmF3KCkpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt9O20ucHJvdG90eXBlLnJlbmRlclRvPWZ1bmN0aW9uKG4pe3RoaXMuZGV0YWNoKCk7aWYobnVsbCE9bil7bj0ic3RyaW5nIj09PXR5cGVvZiBuP2suc2VsZWN0KG4pOm4gaW5zdGFuY2VvZiBFbGVtZW50P2suc2VsZWN0KG4pOnAuY29lcmNlRXh0ZXJuYWxEMyhuKTtpZighbi5ub2RlKCl8fG51bGw9PW4ubm9kZSgpLm5vZGVOYW1lKXRocm93IEVycm9yKCJQbG90dGFibGUgcmVxdWlyZXMgYSB2YWxpZCBFbGVtZW50IHRvIHJlbmRlclRvIik7aWYoInN2ZyI9PT1uLm5vZGUoKS5ub2RlTmFtZSl0aHJvdyBFcnJvcigiUGxvdHRhYmxlIDMueCBhbmQgbGF0ZXIgY2FuIG9ubHkgcmVuZGVyVG8gYW4gSFRNTCBjb21wb25lbnQ7IHBhc3MgYSBkaXYgaW5zdGVhZCEiKTt0aGlzLmFuY2hvcihuKX1pZihudWxsPT10aGlzLl9lbGVtZW50KXRocm93IEVycm9yKCJJZiBhIENvbXBvbmVudCBoYXMgbmV2ZXIgYmVlbiByZW5kZXJlZCBiZWZvcmUsIHRoZW4gcmVuZGVyVG8gbXVzdCBiZSBnaXZlbiBhIG5vZGUgdG8gcmVuZGVyIHRvLCBvciBhIGQzLlNlbGVjdGlvbiwgb3IgYSBzZWxlY3RvciBzdHJpbmciKTsKdC5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcih0aGlzKTt0LmZsdXNoKCl9O20ucHJvdG90eXBlLnhBbGlnbm1lbnQ9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5feEFsaWdubWVudDtuPW4udG9Mb3dlckNhc2UoKTtpZihudWxsPT1tLl94QWxpZ25Ub1Byb3BvcnRpb25bbl0pdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIituKTt0aGlzLl94QWxpZ25tZW50PW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUueUFsaWdubWVudD1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl95QWxpZ25tZW50O249bi50b0xvd2VyQ2FzZSgpO2lmKG51bGw9PW0uX3lBbGlnblRvUHJvcG9ydGlvbltuXSl0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgYWxpZ25tZW50OiAiK24pO3RoaXMuX3lBbGlnbm1lbnQ9bjt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5oYXNDbGFzcz1mdW5jdGlvbihuKXtyZXR1cm4gbnVsbD09Cm4/ITE6bnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmhhcyhuKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQobil9O20ucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKG4pe251bGwhPW4mJihudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuYWRkKG4pOnRoaXMuX2VsZW1lbnQuY2xhc3NlZChuLCEwKSl9O20ucHJvdG90eXBlLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKG4pe251bGwhPW4mJihudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuZGVsZXRlKG4pOnRoaXMuX2VsZW1lbnQuY2xhc3NlZChuLCExKSl9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMX07bS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX07bS5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQobnVsbCk7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fZWxlbWVudC5yZW1vdmUoKTt0aGlzLl9pc0FuY2hvcmVkPQohMTt0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vbkRldGFjaD1mdW5jdGlvbihuKXt0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5hZGQobil9O20ucHJvdG90eXBlLm9mZkRldGFjaD1mdW5jdGlvbihuKXt0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLnBhcmVudD1mdW5jdGlvbihuKXtpZih2b2lkIDA9PT1uKXJldHVybiB0aGlzLl9wYXJlbnQ7aWYobnVsbCE9PW4mJiFuLmhhcyh0aGlzKSl0aHJvdyBFcnJvcigiUGFzc2VkIGludmFsaWQgcGFyZW50Iik7dGhpcy5fcGFyZW50PW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmJvdW5kcz1mdW5jdGlvbigpe3ZhciBuPXRoaXMub3JpZ2luKCk7cmV0dXJue3RvcExlZnQ6bixib3R0b21SaWdodDp7eDpuLngrdGhpcy53aWR0aCgpLHk6bi55K3RoaXMuaGVpZ2h0KCl9fX07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2Rlc3Ryb3llZD0KITA7dGhpcy5kZXRhY2goKX07bS5wcm90b3R5cGUud2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd2lkdGh9O20ucHJvdG90eXBlLmhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oZWlnaHR9O20ucHJvdG90eXBlLm9yaWdpbj1mdW5jdGlvbigpe3JldHVybnt4OnRoaXMuX29yaWdpbi54LHk6dGhpcy5fb3JpZ2luLnl9fTttLnByb3RvdHlwZS5vcmlnaW5Ub1Jvb3Q9ZnVuY3Rpb24oKXtmb3IodmFyIG49dGhpcy5vcmlnaW4oKSxxPXRoaXMucGFyZW50KCk7bnVsbCE9cTspe3ZhciB1PXEub3JpZ2luKCk7bi54Kz11Lng7bi55Kz11Lnk7cT1xLnBhcmVudCgpfXJldHVybiBufTttLnByb3RvdHlwZS5yb290PWZ1bmN0aW9uKCl7Zm9yKHZhciBuPXRoaXM7IW4uaXNSb290KCk7KW49bi5wYXJlbnQoKTtyZXR1cm4gbn07bS5wcm90b3R5cGUuaXNSb290PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMucGFyZW50KCl9O20ucHJvdG90eXBlLmZvcmVncm91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZm9yZWdyb3VuZENvbnRhaW5lcn07Cm0ucHJvdG90eXBlLmNvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGVudH07bS5wcm90b3R5cGUuZWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGVtZW50fTttLnByb3RvdHlwZS5yb290RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvb3QoKS5fcm9vdEVsZW1lbnR9O20ucHJvdG90eXBlLmJhY2tncm91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbnRhaW5lcn07cmV0dXJuIG19KCk7ZC5feEFsaWduVG9Qcm9wb3J0aW9uPXtsZWZ0OjAsY2VudGVyOi41LHJpZ2h0OjF9O2QuX3lBbGlnblRvUHJvcG9ydGlvbj17dG9wOjAsY2VudGVyOi41LGJvdHRvbToxfTtmLkNvbXBvbmVudD1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoNTkpKTtrKGgoNjIpKTtrKGgoMTMzKSk7ayhoKDIxKSk7ayhoKDY0KSk7ayhoKDY2KSl9LApmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGssdCl7dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeT1rO3RoaXMuX2NhbnZhc0RyYXdlckZhY3Rvcnk9dH1oLnByb3RvdHlwZS51c2VTVkc9ZnVuY3Rpb24oayl7bnVsbCE9dGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKTt2YXIgdD10aGlzLl9zdmdEcmF3ZXJGYWN0b3J5KCk7dC5hdHRhY2hUbyhrKTt0aGlzLl9jdXJyZW50RHJhd2VyPXR9O2gucHJvdG90eXBlLnVzZUNhbnZhcz1mdW5jdGlvbihrKXtudWxsIT10aGlzLl9jdXJyZW50RHJhd2VyJiZ0aGlzLl9jdXJyZW50RHJhd2VyLnJlbW92ZSgpO3RoaXMuX2N1cnJlbnREcmF3ZXI9dGhpcy5fY2FudmFzRHJhd2VyRmFjdG9yeShrLm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpKX07aC5wcm90b3R5cGUuZ2V0RHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXJ9O2gucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe251bGwhPQp0aGlzLl9jdXJyZW50RHJhd2VyJiZ0aGlzLl9jdXJyZW50RHJhd2VyLnJlbW92ZSgpfTtoLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKGssdCl7dGhpcy5fY3VycmVudERyYXdlci5kcmF3KGssdCl9O2gucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudERyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVzKCl9O2gucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleChrKX07cmV0dXJuIGh9KCk7Zi5Qcm94eURyYXdlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoNzApKTtrKGgoNzEpKX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocCl7dm9pZCAwPT09cCYmKHA9Myk7dChwKTtyZXR1cm4gZnVuY3Rpb24obSl7cmV0dXJuIG0udG9GaXhlZChwKX19CmZ1bmN0aW9uIHQocCl7aWYoMD5wfHwyMDxwKXRocm93IG5ldyBSYW5nZUVycm9yKCJGb3JtYXR0ZXIgcHJlY2lzaW9uIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyMCIpO2lmKHAhPT1NYXRoLmZsb29yKHApKXRocm93IG5ldyBSYW5nZUVycm9yKCJGb3JtYXR0ZXIgcHJlY2lzaW9uIG11c3QgYmUgYW4gaW50ZWdlciIpO312YXIgbD1oKDEpO2YuY3VycmVuY3k9ZnVuY3Rpb24ocCxtLG4pe3ZvaWQgMD09PXAmJihwPTIpO3ZvaWQgMD09PW0mJihtPSIkIik7dm9pZCAwPT09biYmKG49ITApO3ZhciBxPWsocCk7cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciB4PXEoTWF0aC5hYnModSkpOyIiIT09eCYmKHg9bj9tK3g6eCttLDA+dSYmKHg9Ii0iK3gpKTtyZXR1cm4geH19O2YuZml4ZWQ9aztmLmdlbmVyYWw9ZnVuY3Rpb24oKXt2YXIgcDt2b2lkIDA9PT1wJiYocD0zKTt0KHApO3JldHVybiBmdW5jdGlvbihtKXtpZigibnVtYmVyIj09PXR5cGVvZiBtKXt2YXIgbj1NYXRoLnBvdygxMCxwKTtyZXR1cm4gU3RyaW5nKE1hdGgucm91bmQobSoKbikvbil9cmV0dXJuIFN0cmluZyhtKX19O2YuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24ocCl7cmV0dXJuIFN0cmluZyhwKX19O2YucGVyY2VudGFnZT1mdW5jdGlvbihwKXt2b2lkIDA9PT1wJiYocD0wKTt2YXIgbT1rKHApO3JldHVybiBmdW5jdGlvbihuKXt2YXIgcT1uLnRvU3RyaW5nKCk7cT1NYXRoLnBvdygxMCxxLmxlbmd0aC0ocS5pbmRleE9mKCIuIikrMSkpO3JldHVybiBtKHBhcnNlSW50KCgxMDAqbipxKS50b1N0cmluZygpLDEwKS9xKSsiJSJ9fTtmLnNpU3VmZml4PWZ1bmN0aW9uKHApe3ZvaWQgMD09PXAmJihwPTMpO3QocCk7cmV0dXJuIGZ1bmN0aW9uKG0pe3JldHVybiBsLmZvcm1hdCgiLiIrcCsicyIpKG0pfX07Zi5zaG9ydFNjYWxlPWZ1bmN0aW9uKHApe3ZvaWQgMD09PXAmJihwPTMpO3QocCk7dmFyIG09bC5mb3JtYXQoIi4iK3ArImUiKSxuPWwuZm9ybWF0KCIuIitwKyJmIikscT1NYXRoLnBvdygxMCwxOCksdT1NYXRoLnBvdygxMCwtcCk7CnJldHVybiBmdW5jdGlvbih4KXt2YXIgQT1NYXRoLmFicyh4KTtpZigoQTx1fHxBPj1xKSYmMCE9PUEpcmV0dXJuIG0oeCk7Zm9yKHZhciB5PS0xO0E+PU1hdGgucG93KDFFMyx5KzIpJiY0Pnk7KXkrKztBPS0xPT09eT9uKHgpOm4oeC9NYXRoLnBvdygxRTMseSsxKSkrIktNQlRRIlt5XTtpZigwPHgmJiIxMDAwIj09PUEuc3Vic3RyKDAsNCl8fDA+eCYmIi0xMDAwIj09PUEuc3Vic3RyKDAsNSkpND55Pyh5KyssQT1uKHgvTWF0aC5wb3coMUUzLHkrMSkpKyJLTUJUUSJbeV0pOkE9bSh4KTtyZXR1cm4gQX19O2YubXVsdGlUaW1lPWZ1bmN0aW9uKCl7dmFyIHA9W3tzcGVjaWZpZXI6Ii4lTCIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXRNaWxsaXNlY29uZHMoKX19LHtzcGVjaWZpZXI6IjolUyIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXRTZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiIlSTolTSIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09Cm0uZ2V0TWludXRlcygpfX0se3NwZWNpZmllcjoiJUkgJXAiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0SG91cnMoKX19LHtzcGVjaWZpZXI6IiVhICVkIixwcmVkaWNhdGU6ZnVuY3Rpb24obSl7cmV0dXJuIDAhPT1tLmdldERheSgpJiYxIT09bS5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiAlZCIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAxIT09bS5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXRNb250aCgpfX1dO3JldHVybiBmdW5jdGlvbihtKXt2YXIgbj1wLmZpbHRlcihmdW5jdGlvbihxKXtyZXR1cm4gcS5wcmVkaWNhdGUobSl9KTtyZXR1cm4gbC50aW1lRm9ybWF0KDA8bi5sZW5ndGg/blswXS5zcGVjaWZpZXI6IiVZIikobSl9fTtmLnRpbWU9ZnVuY3Rpb24ocCl7cmV0dXJuIGwudGltZUZvcm1hdChwKX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpLHQ9aCgwKTsKZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwocCxtKXt0aGlzLl9yb290PWsuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpO3RoaXMuX2NsYXNzTmFtZT1tO3RoaXMuX3N2Z0VsZW1lbnROYW1lPXB9bC5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihwLG0pe3ZhciBuPXRoaXM7dGhpcy5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzKHApO3ZhciBxPTA7bS5mb3JFYWNoKGZ1bmN0aW9uKHUpe3QuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gbi5fZHJhd1N0ZXAodSl9LHEpO3ErPXUuYW5pbWF0b3IudG90YWxUaW1lKHAubGVuZ3RoKX0pfTtsLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzJiYodGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPXRoaXMuX3NlbGVjdGlvbi5ub2RlcygpKTtyZXR1cm4gdGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzfTsKbC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5nZXRWaXN1YWxQcmltaXRpdmVzKClbcF19O2wucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX3Jvb3QucmVtb3ZlKCl9O2wucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKHApe3Aubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX3Jvb3Qubm9kZSgpKX07bC5wcm90b3R5cGUuZ2V0Um9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fTtsLnByb3RvdHlwZS5zZWxlY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdmdFbGVtZW50TmFtZX07bC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXt9O2wucHJvdG90eXBlLl9jcmVhdGVBbmREZXN0cm95RE9NRWxlbWVudHM9ZnVuY3Rpb24ocCl7cD1wLmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4gbnVsbCE9bX0pO3A9dGhpcy5fcm9vdC5zZWxlY3RBbGwodGhpcy5zZWxlY3RvcigpKS5kYXRhKHApOwp0aGlzLl9zZWxlY3Rpb249cC5lbnRlcigpLmFwcGVuZCh0aGlzLl9zdmdFbGVtZW50TmFtZSkubWVyZ2UocCk7cC5leGl0KCkucmVtb3ZlKCk7dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPW51bGw7bnVsbCE9dGhpcy5fY2xhc3NOYW1lJiZ0aGlzLl9zZWxlY3Rpb24uY2xhc3NlZCh0aGlzLl9jbGFzc05hbWUsITApO3RoaXMuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXModGhpcy5fc2VsZWN0aW9uKX07bC5wcm90b3R5cGUuX2RyYXdTdGVwPWZ1bmN0aW9uKHApe3ZhciBtPXRoaXM7WyJmaWxsIiwic3Ryb2tlIl0uZm9yRWFjaChmdW5jdGlvbihuKXtudWxsIT1wLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3Jbbl0mJm0uX3NlbGVjdGlvbi5hdHRyKG4scC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yW25dKX0pO3AuYW5pbWF0b3IuYW5pbWF0ZSh0aGlzLl9zZWxlY3Rpb24scC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yKTtudWxsIT10aGlzLl9jbGFzc05hbWUmJnRoaXMuX3NlbGVjdGlvbi5jbGFzc2VkKHRoaXMuX2NsYXNzTmFtZSwKITApfTtyZXR1cm4gbH0oKTtmLlNWR0RyYXdlcj1kfSxmdW5jdGlvbihkLGYpe2YubWFrZUVudW09ZnVuY3Rpb24oaCl7cmV0dXJuIGgucmVkdWNlKGZ1bmN0aW9uKGssdCl7a1t0XT10O3JldHVybiBrfSx7fSl9fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG0sbil7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bX1mb3IodmFyIHUgaW4gbiluLmhhc093blByb3BlcnR5KHUpJiYobVt1XT1uW3VdKTttLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihxLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcSl9LHQ9aCgxKSxsPWgoMjYpLHA9aCgwKTtkPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIG4oKXt2YXIgcT1tLmNhbGwodGhpcyl8fHRoaXM7cS5fdGlja0dlbmVyYXRvcj1mdW5jdGlvbih1KXtyZXR1cm4gdS5kZWZhdWx0VGlja3MoKX07cS5fcGFkUHJvcG9ydGlvbj0uMDU7cS5fc25hcHBpbmdEb21haW5FbmFibGVkPQohMDtxLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycz1uZXcgcC5TZXQ7cmV0dXJuIHF9ayhuLG0pO24ucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt0aGlzLl9kb21haW5NYXg9dGhpcy5fZG9tYWluTWluPW51bGw7bS5wcm90b3R5cGUuYXV0b0RvbWFpbi5jYWxsKHRoaXMpfTtuLnByb3RvdHlwZS5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuX2RvbWFpbk1pbiYmbnVsbCE9dGhpcy5fZG9tYWluTWF4KXRoaXMuX3NldERvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1heF0pO2Vsc2V7dmFyIHE9dGhpcy5fZ2V0RXh0ZW50KCk7bnVsbCE9dGhpcy5fZG9tYWluTWluPyhxPXFbMV0sdGhpcy5fZG9tYWluTWluPj1xJiYocT10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1pbl0pWzFdKSx0aGlzLl9zZXREb21haW4oW3RoaXMuX2RvbWFpbk1pbixxXSkpOgpudWxsIT10aGlzLl9kb21haW5NYXg/KHE9cVswXSx0aGlzLl9kb21haW5NYXg8PXEmJihxPXRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKFt0aGlzLl9kb21haW5NYXgsdGhpcy5fZG9tYWluTWF4XSlbMF0pLHRoaXMuX3NldERvbWFpbihbcSx0aGlzLl9kb21haW5NYXhdKSk6bS5wcm90b3R5cGUuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUuY2FsbCh0aGlzKX19O24ucHJvdG90eXBlLl9nZXRVbmJvdW5kZWRFeHRlbnQ9ZnVuY3Rpb24ocSl7dm9pZCAwPT09cSYmKHE9ITEpO3E9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMocSk7dmFyIHU9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1xLmxlbmd0aCYmKHE9W3AuTWF0aC5taW4ocSx1WzBdKSxwLk1hdGgubWF4KHEsdVsxXSldLHU9dGhpcy5fcGFkRG9tYWluKHEpKTtyZXR1cm4gdX07bi5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3ZhciBxPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCgpO251bGwhPXRoaXMuX2RvbWFpbk1pbiYmCihxWzBdPXRoaXMuX2RvbWFpbk1pbik7bnVsbCE9dGhpcy5fZG9tYWluTWF4JiYocVsxXT10aGlzLl9kb21haW5NYXgpO3JldHVybiBxfTtuLnByb3RvdHlwZS5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyPWZ1bmN0aW9uKHEpe3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmFkZChxKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCl9O24ucHJvdG90eXBlLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXI9ZnVuY3Rpb24ocSl7dGhpcy5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnMuZGVsZXRlKHEpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKX07bi5wcm90b3R5cGUucGFkUHJvcG9ydGlvbj1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9wYWRQcm9wb3J0aW9uO2lmKDA+cSl0aHJvdyBFcnJvcigicGFkUHJvcG9ydGlvbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpO3RoaXMuX3BhZFByb3BvcnRpb249cTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7CnJldHVybiB0aGlzfTtuLnByb3RvdHlwZS5fcGFkRG9tYWluPWZ1bmN0aW9uKHEpe3ZhciB1PXRoaXM7aWYocVswXS52YWx1ZU9mKCk9PT1xWzFdLnZhbHVlT2YoKSlyZXR1cm4gdGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4ocSk7aWYoMD09PXRoaXMuX3BhZFByb3BvcnRpb24pcmV0dXJuIHE7dmFyIHg9dGhpcy5fcGFkUHJvcG9ydGlvbi8yLEE9cVswXSx5PXFbMV0sdz0hMSxDPSExO3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24oRCl7RCh1KS5mb3JFYWNoKGZ1bmN0aW9uKEIpe0IudmFsdWVPZigpPT09QS52YWx1ZU9mKCkmJih3PSEwKTtCLnZhbHVlT2YoKT09PXkudmFsdWVPZigpJiYoQz0hMCl9KX0pO3ZhciBHPXRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihxKTtxPXc/QTp0aGlzLmludmVydCh0aGlzLnNjYWxlKEEpLSh0aGlzLnNjYWxlKHkpLXRoaXMuc2NhbGUoQSkpKngpO3g9Qz8KeTp0aGlzLmludmVydCh0aGlzLnNjYWxlKHkpKyh0aGlzLnNjYWxlKHkpLXRoaXMuc2NhbGUoQSkpKngpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihHKTtyZXR1cm4gdGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkP3RoaXMuX25pY2VEb21haW4oW3EseF0pOltxLHhdfTtuLnByb3RvdHlwZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9ZnVuY3Rpb24ocSl7bnVsbCE9cSYmKHRoaXMuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD1xLHRoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSl9O24ucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbihxKXtyZXR1cm4gcX07bi5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydCIpO307bi5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKHEpe251bGwhPXEmJih0aGlzLl9kb21haW5NaW49cVswXSx0aGlzLl9kb21haW5NYXg9cVsxXSk7CnJldHVybiBtLnByb3RvdHlwZS5kb21haW4uY2FsbCh0aGlzLHEpfTtuLnByb3RvdHlwZS5kb21haW5NaW49ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5kb21haW4oKVswXTt0aGlzLl9kb21haW5NaW49cTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmRvbWFpbk1heD1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLmRvbWFpbigpWzFdO3RoaXMuX2RvbWFpbk1heD1xO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24ocSl7cT10LmV4dGVudChxLmZpbHRlcihmdW5jdGlvbih1KXtyZXR1cm4gcC5NYXRoLmlzVmFsaWROdW1iZXIoK3UpfSkpO3JldHVybiBudWxsPT1xWzBdfHxudWxsPT1xWzFdP1tdOnF9O24ucHJvdG90eXBlLnpvb209ZnVuY3Rpb24ocSx1KXt2YXIgeD10aGlzO3RoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAoZnVuY3Rpb24oQSl7cmV0dXJuIHguaW52ZXJ0KGwuem9vbU91dChBLApxLHUpKX0pKX07bi5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHEpe3ZhciB1PXRoaXM7dGhpcy5kb21haW4odGhpcy5yYW5nZSgpLm1hcChmdW5jdGlvbih4KXtyZXR1cm4gdS5pbnZlcnQoeCtxKX0pKX07bi5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZVRyYW5zZm9ybWF0aW9uIik7fTtuLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydGVkVHJhbnNmb3JtYXRpb24iKTt9O24ucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGdldFRyYW5zZm9ybWF0aW9uRXh0ZW50Iik7fTtuLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBnZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiIpOwp9O24ucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHNldFRyYW5zZm9ybWF0aW9uRG9tYWluIik7fTtuLnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHUoeCl7cmV0dXJuIHAuTWF0aC5pc05hTih4KXx8SW5maW5pdHk9PT14fHwtSW5maW5pdHk9PT14fXUocVswXSl8fHUocVsxXSk/cC5XaW5kb3cud2FybigiV2FybmluZzogUXVhbnRpdGF0aXZlU2NhbGVzIGNhbm5vdCB0YWtlIE5hTiBvciBJbmZpbml0eSBhcyBhIGRvbWFpbiB2YWx1ZS4gSWdub3JpbmcuIik6bS5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMscSl9O24ucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0RGVmYXVsdFRpY2tzIik7fTtuLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90aWNrR2VuZXJhdG9yKHRoaXMpfTsKbi5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX25pY2VEb21haW4iKTt9O24ucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9kZWZhdWx0RXh0ZW50Iik7fTtuLnByb3RvdHlwZS50aWNrR2VuZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIHE9UGxvdHRhYmxlLlNjYWxlcy5UaWNrR2VuZXJhdG9ycy5pbnRlZ2VyVGlja0dlbmVyYXRvcigpO251bGwhPXEmJih0aGlzLl90aWNrR2VuZXJhdG9yPXEpfTtyZXR1cm4gbn0oaCgxNykuU2NhbGUpO2QuX0RFRkFVTFRfTlVNX1RJQ0tTPTEwO2YuUXVhbnRpdGF0aXZlU2NhbGU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMSk7Zi5jb2VyY2VFeHRlcm5hbEQzPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQuYXR0cnMpe2lmKG51bGw9PXQubm9kZXMpe3ZhciBsPVtdO3QuZWFjaChmdW5jdGlvbigpe2wucHVzaCh0aGlzKX0pOwpyZXR1cm4gay5zZWxlY3RBbGwobCl9cmV0dXJuIGsuc2VsZWN0QWxsKHQubm9kZXMoKSl9cmV0dXJuIHR9fSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoODMpKTtrKGgoODQpKTtrKGgoODUpKX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDQ0KSk7ayhoKDQ1KSk7ayhoKDQ2KSk7ayhoKDE4KSk7ayhoKDYpKTtrKGgoMzMpKTtrKGgoMzQpKTtrKGgoNDcpKTtrKGgoOSkpO2soaCg0OCkpfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKCl7dmFyIGs9dGhpczt0aGlzLl9hbmNob3JDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gay5fYW5jaG9yKHQpfTt0aGlzLl9lbmFibGVkPSEwfWgucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKGspe3RoaXMuX2Rpc2Nvbm5lY3QoKTsKdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbz1rO3RoaXMuX2Nvbm5lY3QoKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuZGV0YWNoRnJvbT1mdW5jdGlvbigpe3RoaXMuZGV0YWNoKCl9O2gucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuX2Rpc2Nvbm5lY3QoKTt0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvPW51bGw7cmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmVuYWJsZWQ9ZnVuY3Rpb24oayl7aWYobnVsbD09aylyZXR1cm4gdGhpcy5fZW5hYmxlZDsodGhpcy5fZW5hYmxlZD1rKT90aGlzLl9jb25uZWN0KCk6dGhpcy5fZGlzY29ubmVjdCgpO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZD0hMH07aC5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZD0hMX07aC5wcm90b3R5cGUuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2U9ZnVuY3Rpb24oayl7dmFyIHQ9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vcmlnaW5Ub1Jvb3QoKTsKcmV0dXJue3g6ay54LXQueCx5OmsueS10Lnl9fTtoLnByb3RvdHlwZS5faXNJbnNpZGVDb21wb25lbnQ9ZnVuY3Rpb24oayl7cmV0dXJuIDA8PWsueCYmMDw9ay55JiZrLng8PXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ud2lkdGgoKSYmay55PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtoLnByb3RvdHlwZS5fY29ubmVjdD1mdW5jdGlvbigpe2lmKHRoaXMuZW5hYmxlZCgpJiZudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiYhdGhpcy5faXNBbmNob3JlZCl0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9uQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKX07aC5wcm90b3R5cGUuX2Rpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl91bmFuY2hvcigpO251bGwhPXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8mJnRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub2ZmQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKX07cmV0dXJuIGh9KCk7CmYuSW50ZXJhY3Rpb249ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMyksbD1oKDApLHA9aCg1MiksbT1oKDIpO2Q9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSgpe3ZhciB1PW4uY2FsbCh0aGlzKXx8dGhpczt1Ll9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSExO3UuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITE7dS5fZGVmZXJyZWRSZW5kZXJpbmc9ITE7dS5fYXBwbHlEZWZlcnJlZFJlbmRlcmluZ1RyYW5zZm9ybT1mdW5jdGlvbih4LEEseSx3KXt1Ll9pc0FuY2hvcmVkJiYobnVsbCE9dS5fcmVuZGVyQXJlYSYmdS5fcmVuZGVyQXJlYS5hdHRyKCJ0cmFuc2Zvcm0iLAoidHJhbnNsYXRlKCIreCsiLCAiK0ErIikgc2NhbGUoIit5KyIsICIrdysiKSIpLG51bGwhPXUuX2NhbnZhcyYmdS5fY2FudmFzLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit4KyJweCwgIitBKyJweCkgc2NhbGUoIit5KyIsICIrdysiKSIpKX07dS5hZGRDbGFzcygieHktcGxvdCIpO3UuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdS5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVgoKX07dS5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiB1Ll9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpfTt1Ll9yZW5kZXJDYWxsYmFjaz1mdW5jdGlvbigpe2lmKHUuZGVmZXJyZWRSZW5kZXJpbmcoKSl7dmFyIHg9dS54KCkmJnUueCgpLnNjYWxlLEE9dS55KCkmJnUueSgpLnNjYWxlO3UuX2RlZmVycmVkUmVuZGVyZXIudXBkYXRlRG9tYWlucyh4LEEpfWVsc2UgdS5yZW5kZXIoKX07CnUuX2RlZmVycmVkUmVuZGVyZXI9bmV3IHAuRGVmZXJyZWRSZW5kZXJlcihmdW5jdGlvbigpe3JldHVybiB1LnJlbmRlcigpfSx1Ll9hcHBseURlZmVycmVkUmVuZGVyaW5nVHJhbnNmb3JtKTtyZXR1cm4gdX1rKHEsbik7cS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5kZWZlcnJlZFJlbmRlcmluZygpJiZ0aGlzLl9kZWZlcnJlZFJlbmRlcmVyLnJlc2V0VHJhbnNmb3JtcygpO3JldHVybiBuLnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKX07cS5wcm90b3R5cGUuZGVmZXJyZWRSZW5kZXJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmZXJyZWRSZW5kZXJpbmd9O3EucHJvdG90eXBlLng9ZnVuY3Rpb24odSx4LEEpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHEuX1hfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkocS5fWF9LRVksdSx4LEEpO3U9dGhpcy53aWR0aCgpO251bGwhPXgmJm51bGwhPXUmJngucmFuZ2UoWzAsdV0pOwp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS55PWZ1bmN0aW9uKHUseCxBKXtpZihudWxsPT11KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChxLl9ZX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHEuX1lfS0VZLHUseCxBKTt1PXRoaXMuaGVpZ2h0KCk7bnVsbCE9eCYmbnVsbCE9dSYmKHggaW5zdGFuY2VvZiB0LkNhdGVnb3J5P3gucmFuZ2UoWzAsdV0pOngucmFuZ2UoW3UsMF0pKTt0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24odSl7cmV0dXJuIngiPT09dSYmdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj90aGlzLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSgieSIpOgoieSI9PT11JiZ0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluP3RoaXMuX21ha2VGaWx0ZXJCeVByb3BlcnR5KCJ4Iik6bnVsbH07cS5wcm90b3R5cGUuX21ha2VGaWx0ZXJCeVByb3BlcnR5PWZ1bmN0aW9uKHUpe3U9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQodSk7aWYobnVsbCE9dSl7dmFyIHg9dS5hY2Nlc3NvcixBPXUuc2NhbGU7aWYobnVsbCE9QSlyZXR1cm4gZnVuY3Rpb24oeSx3LEMpe3ZhciBHPUEucmFuZ2UoKTtyZXR1cm4gbC5NYXRoLmluUmFuZ2UoQS5zY2FsZSh4KHksdyxDKSksR1swXSxHWzFdKX19cmV0dXJuIG51bGx9O3EucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbih1LHgpe24ucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsdSx4KTt1Lm9mZlVwZGF0ZSh4PT09cS5fWF9LRVk/dGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjazp0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKX07CnEucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24odSx4KXtuLnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5LmNhbGwodGhpcyx1LHgpO3Uub25VcGRhdGUoeD09PXEuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9O3EucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy54KCkuc2NhbGUmJnRoaXMueCgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrKTt0aGlzLnkoKS5zY2FsZSYmdGhpcy55KCkuc2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2spO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4/CiJ4Ijp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPyJ5Ijoibm9uZSI7c3dpdGNoKHUpe2Nhc2UgIngiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITA7dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMTt0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpO2JyZWFrO2Nhc2UgInkiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITE7dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMDt0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWCgpO2JyZWFrO2Nhc2UgIm5vbmUiOnRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJJbnZhbGlkIHNjYWxlIG5hbWUgJyIrdSsiJywgbXVzdCBiZSAneCcsICd5JyBvciAnbm9uZSciKTt9cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24odSx4LEEpe24ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLAp1LHgsQSk7dT0odT10aGlzLngoKSkmJnUuc2NhbGU7bnVsbCE9dSYmdS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTt1PSh1PXRoaXMueSgpKSYmdS5zY2FsZTtudWxsIT11JiYodSBpbnN0YW5jZW9mIHQuQ2F0ZWdvcnk/dS5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSk6dS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSkpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy54KCkuc2NhbGU7bnVsbCE9dSYmdS5hdXRvRG9tYWluKCl9O3EucHJvdG90eXBlLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW49ZnVuY3Rpb24oKXt2YXIgdT10aGlzLnkoKS5zY2FsZTtudWxsIT11JiZ1LmF1dG9Eb21haW4oKX07cS5wcm90b3R5cGUuc2hvd0FsbERhdGE9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKTtyZXR1cm4gdGhpc307CnEucHJvdG90eXBlLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWD1mdW5jdGlvbigpe3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpJiZ0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKX07cS5wcm90b3R5cGUuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZPWZ1bmN0aW9uKCl7dGhpcy5fcHJvamVjdG9yc1JlYWR5KCkmJnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4mJnRoaXMuX3VwZGF0ZVhFeHRlbnRzQW5kQXV0b2RvbWFpbigpfTtxLnByb3RvdHlwZS5fcHJvamVjdG9yc1JlYWR5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy54KCkseD10aGlzLnkoKTtyZXR1cm4gbnVsbCE9dSYmbnVsbCE9dS5hY2Nlc3NvciYmbnVsbCE9eCYmbnVsbCE9eC5hY2Nlc3Nvcn07cS5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24odSx4LEEpe3ZhciB5PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHc9bS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7CnJldHVybnt4OnkodSx4LEEpLHk6dyh1LHgsQSl9fTtxLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHUoeSx3LEMpe3ZhciBHPW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC54KCkpKHksdyxDKTt5PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC55KCkpKHksdyxDKTtyZXR1cm4gbC5NYXRoLmlzVmFsaWROdW1iZXIoRykmJmwuTWF0aC5pc1ZhbGlkTnVtYmVyKHkpfXZhciB4PXRoaXMsQT1uLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdy5jYWxsKHRoaXMpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKHkpe0Euc2V0KHksQS5nZXQoeSkuZmlsdGVyKGZ1bmN0aW9uKHcsQyl7cmV0dXJuIHUodyxDLHkpfSkpfSk7cmV0dXJuIEF9O3JldHVybiBxfShtLlBsb3QpO2QuX1hfS0VZPSJ4IjtkLl9ZX0tFWT0ieSI7Zi5YWVBsb3Q9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0KITA7dGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMTt0aGlzLl91cGRhdGVJZD0wO3RoaXMuX2NhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycz1uZXcgay5TZXR9dC5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX07dC5wcm90b3R5cGUuX2dldEFsbEluY2x1ZGVkVmFsdWVzPWZ1bmN0aW9uKGwpe3ZhciBwPXRoaXM7dm9pZCAwPT09bCYmKGw9ITEpO3ZhciBtPVtdO3RoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24obil7bj1uKHAsbCk7bT1tLmNvbmNhdChuKX0pO3JldHVybiBtfTt0LnByb3RvdHlwZS5fZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuW119O3QucHJvdG90eXBlLm9uVXBkYXRlPWZ1bmN0aW9uKGwpe3RoaXMuX2NhbGxiYWNrcy5hZGQobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLm9mZlVwZGF0ZT1mdW5jdGlvbihsKXt0aGlzLl9jYWxsYmFja3MuZGVsZXRlKGwpOwpyZXR1cm4gdGhpc307dC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQrKzt0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX07dC5wcm90b3R5cGUuYXV0b0RvbWFpbj1mdW5jdGlvbigpe3RoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5PSEwO3RoaXMuX3NldERvbWFpbih0aGlzLl9nZXRFeHRlbnQoKSl9O3QucHJvdG90eXBlLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlPWZ1bmN0aW9uKCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHkmJnRoaXMuYXV0b0RvbWFpbigpfTt0LnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZSIpO307dC5wcm90b3R5cGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07dC5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX2dldERvbWFpbigpOwp0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0hMTt0aGlzLl9zZXREb21haW4obCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERvbWFpbiIpO307dC5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihsKXt0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzfHwodGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMCx0aGlzLl9iYWNraW5nU2NhbGVEb21haW4obCksdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKSx0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzPSExKX07dC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfYmFja2luZ0RvbWFpbiIpO307dC5wcm90b3R5cGUucmFuZ2U9ZnVuY3Rpb24obCl7aWYobnVsbD09bClyZXR1cm4gdGhpcy5fZ2V0UmFuZ2UoKTsKdGhpcy5fc2V0UmFuZ2UobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0UmFuZ2UiKTt9O3QucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfc2V0UmFuZ2UiKTt9O3QucHJvdG90eXBlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24obCl7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuYWRkKGwpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUucmVtb3ZlSW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbihsKXt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5kZWxldGUobCk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpfTt0LnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH07CnJldHVybiB0fSgpO2YuU2NhbGU9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocSx1LHgsQSl7Zm9yKHZhciB5PXt9LHc9MDt3PHUubGVuZ3RoO3crKyl7dmFyIEM9dVt3XTtxLmhhc093blByb3BlcnR5KEMpJiYoeVtDXT1xW0NdKHgsQSkpfXJldHVybiB5fWZ1bmN0aW9uIHQocSl7cmV0dXJuKG51bGwhPXFbInN0cm9rZS1vcGFjaXR5Il0/cGFyc2VGbG9hdChxWyJzdHJva2Utb3BhY2l0eSJdKToxKSoobnVsbCE9cS5vcGFjaXR5P3BhcnNlRmxvYXQocS5vcGFjaXR5KToxKX1mdW5jdGlvbiBsKHEpe3JldHVybihudWxsIT1xWyJmaWxsLW9wYWNpdHkiXT9wYXJzZUZsb2F0KHFbImZpbGwtb3BhY2l0eSJdKToxKSoobnVsbCE9cS5vcGFjaXR5P3BhcnNlRmxvYXQocS5vcGFjaXR5KToxKX1mdW5jdGlvbiBwKHEpe3JldHVybiBudWxsIT1xWyJzdHJva2Utd2lkdGgiXT9wYXJzZUZsb2F0KHFbInN0cm9rZS13aWR0aCJdKToxfWZ1bmN0aW9uIG0ocSx1KXtpZih1LnN0cm9rZSl7cS5saW5lV2lkdGg9CnAodSk7dmFyIHg9bi5jb2xvcih1LnN0cm9rZSk7eC5vcGFjaXR5Kj10KHUpO3Euc3Ryb2tlU3R5bGU9eC50b1N0cmluZygpO3Euc3Ryb2tlKCl9dS5maWxsJiYoeD1uLmNvbG9yKHUuZmlsbCkseC5vcGFjaXR5Kj1sKHUpLHEuZmlsbFN0eWxlPXgudG9TdHJpbmcoKSxxLmZpbGwoKSl9dmFyIG49aCgxKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcSh1LHgpe3RoaXMuX2NvbnRleHQ9dTt0aGlzLl9kcmF3U3RlcD14fXEucHJvdG90eXBlLmdldERyYXdTdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYXdTdGVwfTtxLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHUseCl7eD14W3gubGVuZ3RoLTFdLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3I7dGhpcy5fY29udGV4dC5zYXZlKCk7dGhpcy5fZHJhd1N0ZXAodGhpcy5fY29udGV4dCx1LHgpO3RoaXMuX2NvbnRleHQucmVzdG9yZSgpfTtxLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3EucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9CmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9O3EucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe307cmV0dXJuIHF9KCk7Zi5DYW52YXNEcmF3ZXI9ZDtmLkNvbnRleHRTdHlsZUF0dHJzPSJmaWxsLW9wYWNpdHkgZmlsbCBvcGFjaXR5IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCBzdHJva2UiLnNwbGl0KCIgIik7Zi5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXM9ZnVuY3Rpb24ocSx1LHgsQSl7cmV0dXJuIGsocSxmLkNvbnRleHRTdHlsZUF0dHJzLmNvbmNhdCh1KSx4LEEpfTtmLnJlc29sdmVBdHRyaWJ1dGVzPWs7Zi5nZXRTdHJva2VXaWR0aD1wO2YucmVuZGVyQXJlYT1mdW5jdGlvbihxLHUseCxBKXtxLnNhdmUoKTtxLmJlZ2luUGF0aCgpO3UuY29udGV4dChxKTt1KHgpO3EubGluZUpvaW49InJvdW5kIjttKHEsQSk7cS5yZXN0b3JlKCl9O2YucmVuZGVyTGluZT1mdW5jdGlvbihxLHUseCxBKXtxLnNhdmUoKTtxLmJlZ2luUGF0aCgpO3UuY29udGV4dChxKTt1KHgpOwpxLmxpbmVKb2luPSJyb3VuZCI7bShxLEEpO3EucmVzdG9yZSgpfTtmLnJlbmRlclBhdGhXaXRoU3R5bGU9bX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDUwKSk7ayhoKDI3KSk7ayhoKDUxKSk7ayhoKDkzKSk7ayhoKDUzKSk7ayhoKDk0KSk7ayhoKDk1KSk7ayhoKDk2KSk7ayhoKDk3KSk7ayhoKDk4KSk7ayhoKDk5KSk7ayhoKDEwMCkpfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoOTIpKTtrKGgoOTEpKTtkPWgoNDkpO2Yuc2lnbj1kLnNpZ259LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgxMzQpKTtrKGgoMTM1KSk7ayhoKDEzNikpO2soaCgxMzcpKX0sZnVuY3Rpb24oZCwKZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgeCBpbiBxKXEuaGFzT3duUHJvcGVydHkoeCkmJihuW3hdPXFbeF0pO24ucHJvdG90eXBlPW51bGw9PT1xP09iamVjdC5jcmVhdGUocSk6KHUucHJvdG90eXBlPXEucHJvdG90eXBlLG5ldyB1KX0sdD1oKDEpLGw9aCg1KTtkPWgoNCk7dmFyIHA9aCg4KSxtPWgoMCk7aD1oKDEwKTtmLkF4aXNPcmllbnRhdGlvbj1oLm1ha2VFbnVtKFsiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwidG9wIl0pO2g9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSh1LHgpe3ZhciBBPW4uY2FsbCh0aGlzKXx8dGhpcztBLl9lbmRUaWNrTGVuZ3RoPTU7QS5faW5uZXJUaWNrTGVuZ3RoPTU7QS5fdGlja0xhYmVsUGFkZGluZz0xMDtBLl9tYXJnaW49MTU7QS5fc2hvd0VuZFRpY2tMYWJlbHM9ITE7QS5fYW5ub3RhdGlvbnNFbmFibGVkPSExO0EuX2Fubm90YXRpb25UaWVyQ291bnQ9CjE7aWYobnVsbD09dXx8bnVsbD09eCl0aHJvdyBFcnJvcigiQXhpcyByZXF1aXJlcyBhIHNjYWxlIGFuZCBvcmllbnRhdGlvbiIpO0EuX3NjYWxlPXU7QS5vcmllbnRhdGlvbih4KTtBLl9zZXREZWZhdWx0QWxpZ25tZW50KCk7QS5hZGRDbGFzcygiYXhpcyIpO0EuaXNIb3Jpem9udGFsKCk/QS5hZGRDbGFzcygieC1heGlzIik6QS5hZGRDbGFzcygieS1heGlzIik7QS5mb3JtYXR0ZXIocC5pZGVudGl0eSgpKTtBLl9yZXNjYWxlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gQS5fcmVzY2FsZSgpfTtBLl9zY2FsZS5vblVwZGF0ZShBLl9yZXNjYWxlQ2FsbGJhY2spO0EuX2Fubm90YXRlZFRpY2tzPVtdO0EuX2Fubm90YXRpb25Gb3JtYXR0ZXI9cC5pZGVudGl0eSgpO3JldHVybiBBfWsocSxuKTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZXNjYWxlQ2FsbGJhY2spfTsKcS5wcm90b3R5cGUudGlja0xhYmVsRGF0YU9uRWxlbWVudD1mdW5jdGlvbih1KXtpZihudWxsIT11KXtmb3IodmFyIHg7bnVsbCE9dSYmdS5jbGFzc0xpc3QmJnZvaWQgMD09PXg7KXUuY2xhc3NMaXN0LmNvbnRhaW5zKHEuVElDS19MQUJFTF9DTEFTUyk/eD11OnU9dS5wYXJlbnROb2RlO3JldHVybiB2b2lkIDA9PT11P3ZvaWQgMDp0LnNlbGVjdCh1KS5kYXR1bSgpfX07cS5wcm90b3R5cGUuX2NvbXB1dGVXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKX07cS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCl9O3EucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7dmFyIHU9MCx4PTA7aWYodGhpcy5pc0hvcml6b250YWwoKSl7aWYoeD10aGlzLl9jb21wdXRlSGVpZ2h0KCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciBBPQp0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKnEuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORzt4Kz1BKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpfX1lbHNlIHU9dGhpcy5fY29tcHV0ZVdpZHRoKCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkmJihBPXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqcS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HLHUrPUEqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCkpO3JldHVybnttaW5XaWR0aDp1LG1pbkhlaWdodDp4fX07cS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKX07cS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzSG9yaXpvbnRhbCgpfTtxLnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9O3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHUseCxBKXtuLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyx1LHgsQSk7dGhpcy5pc0hvcml6b250YWwoKT90aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLl9zY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHUseCl7dmFyIEE9dGhpcy5yZXF1ZXN0ZWRTcGFjZSh1LHgpO3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbCgpP3t3aWR0aDp1LGhlaWdodDpBLm1pbkhlaWdodH06e2hlaWdodDp4LHdpZHRoOkEubWluV2lkdGh9fTtxLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90aWNrTWFya0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuVElDS19NQVJLX0NMQVNTKyItY29udGFpbmVyIiwhMCk7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyPQp0aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuVElDS19MQUJFTF9DTEFTUysiLWNvbnRhaW5lciIsITApO3RoaXMuX2Jhc2VsaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiwhMCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiwhMCk7dmFyIHU9dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWxhYmVsLWNvbnRhaW5lciIsCiEwKTt1PW5ldyBsLlN2Z0NvbnRleHQodS5ub2RlKCkpO3RoaXMuX2Fubm90YXRpb25NZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHUpO3RoaXMuX2Fubm90YXRpb25Xcml0ZXI9bmV3IGwuV3JpdGVyKHRoaXMuX2Fubm90YXRpb25NZWFzdXJlcix1KX07cS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX07cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdT10aGlzLl9nZXRUaWNrVmFsdWVzKCkseD10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19NQVJLX0NMQVNTKS5kYXRhKHUpLEE9eC5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQocS5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKHgpO0EuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCkpO3Quc2VsZWN0KEEubm9kZXMoKVswXSkuY2xhc3NlZChxLkVORF9USUNLX01BUktfQ0xBU1MsITApLmF0dHJzKHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCghMCkpOwp0LnNlbGVjdChBLm5vZGVzKClbdS5sZW5ndGgtMV0pLmNsYXNzZWQocS5FTkRfVElDS19NQVJLX0NMQVNTLCEwKS5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goITApKTt4LmV4aXQoKS5yZW1vdmUoKTt0aGlzLl9iYXNlbGluZS5hdHRycyh0aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKSk7dGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTp0aGlzLl9yZW1vdmVBbm5vdGF0aW9ucygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hbm5vdGF0ZWRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0ZWRUaWNrc307cS5wcm90b3R5cGUuYW5ub3RhdGlvbkZvcm1hdHRlcj1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9hbm5vdGF0aW9uRm9ybWF0dGVyO3RoaXMuX2Fubm90YXRpb25Gb3JtYXR0ZXI9dTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hbm5vdGF0aW9uc0VuYWJsZWQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25zRW5hYmxlZH07cS5wcm90b3R5cGUuYW5ub3RhdGlvblRpZXJDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uVGllckNvdW50fTtxLnByb3RvdHlwZS5fZHJhd0Fubm90YXRpb25zPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdShhYSl7c3dpdGNoKEMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpjYXNlICJyaWdodCI6cmV0dXJuIHkoYWEpO2Nhc2UgInRvcCI6Y2FzZSAibGVmdCI6cmV0dXJuIHkoYWEpLUQuZ2V0KGFhKS5oZWlnaHR9fWZ1bmN0aW9uIHgoYWEpe3JldHVybiBPLmhhcyhhYSk/ImhpZGRlbiI6InZpc2libGUifWZ1bmN0aW9uIEEoYWEpe3JldHVybiBDLl9zY2FsZS5zY2FsZShhYSl9ZnVuY3Rpb24geShhYSl7c3dpdGNoKEMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpjYXNlICJyaWdodCI6cmV0dXJuIE4uZ2V0KGFhKSpJK0s7Y2FzZSAidG9wIjpjYXNlICJsZWZ0IjpyZXR1cm4gSC0KSy1OLmdldChhYSkqSX19ZnVuY3Rpb24gdyhhYSxsYSxaKXthYT1hYS5zZWxlY3RBbGwoIi4iK1opLmRhdGEoQik7bGE9YWEuZW50ZXIoKS5hcHBlbmQobGEpLmNsYXNzZWQoWiwhMCkubWVyZ2UoYWEpO2FhLmV4aXQoKS5yZW1vdmUoKTtyZXR1cm4gbGF9dmFyIEM9dGhpcyxHPXEuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyxEPW5ldyBtLk1hcCxCPXRoaXMuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXIoKTtCLmZvckVhY2goZnVuY3Rpb24oYWEpe3ZhciBsYT1DLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZShDLmFubm90YXRpb25Gb3JtYXR0ZXIoKShhYSkpO0Quc2V0KGFhLHt3aWR0aDpsYS53aWR0aCsyKkcsaGVpZ2h0OmxhLmhlaWdodCsyKkd9KX0pO3ZhciBJPXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqRyxOPXRoaXMuX2Fubm90YXRpb25Ub1RpZXIoRCksTz1uZXcgbS5TZXQsSD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6CnRoaXMud2lkdGgoKSxLPXRoaXMuX2NvcmVTaXplKCksTT1NYXRoLm1pbih0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSxNYXRoLmZsb29yKChILUspL0kpKTtOLmZvckVhY2goZnVuY3Rpb24oYWEsbGEpeygtMT09PWFhfHxhYT49TSkmJk8uYWRkKGxhKX0pO3N3aXRjaCh0aGlzLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnZhciBMPTA7YnJlYWs7Y2FzZSAidG9wIjpMPXRoaXMuaGVpZ2h0KCk7YnJlYWs7Y2FzZSAibGVmdCI6TD10aGlzLndpZHRoKCl9dmFyIFE9dGhpcy5pc0hvcml6b250YWwoKTt3KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIpLCJsaW5lIixxLkFOTk9UQVRJT05fTElORV9DTEFTUykuYXR0cnMoe3gxOlE/QTpMLHgyOlE/QTp5LHkxOlE/TDpBLHkyOlE/eTpBLHZpc2liaWxpdHk6eH0pO3codGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLWNpcmNsZS1jb250YWluZXIiKSwKImNpcmNsZSIscS5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUykuYXR0cnMoe2N4OlE/QTpMLGN5OlE/TDpBLHI6M30pO3codGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiksInJlY3QiLHEuQU5OT1RBVElPTl9SRUNUX0NMQVNTKS5hdHRycyh7eDpRP0E6dSx5OlE/dTpBLHdpZHRoOlE/ZnVuY3Rpb24oYWEpe3JldHVybiBELmdldChhYSkud2lkdGh9OmZ1bmN0aW9uKGFhKXtyZXR1cm4gRC5nZXQoYWEpLmhlaWdodH0saGVpZ2h0OlE/ZnVuY3Rpb24oYWEpe3JldHVybiBELmdldChhYSkuaGVpZ2h0fTpmdW5jdGlvbihhYSl7cmV0dXJuIEQuZ2V0KGFhKS53aWR0aH0sdmlzaWJpbGl0eTp4fSk7dmFyIFQ9dGhpcy5fYW5ub3RhdGlvbldyaXRlcixYPXRoaXMuYW5ub3RhdGlvbkZvcm1hdHRlcigpO0w9dyh0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdCgiLmFubm90YXRpb24tbGFiZWwtY29udGFpbmVyIiksImciLHEuQU5OT1RBVElPTl9MQUJFTF9DTEFTUyk7Ckwuc2VsZWN0QWxsKCIudGV4dC1jb250YWluZXIiKS5yZW1vdmUoKTtMLmF0dHJzKHt0cmFuc2Zvcm06ZnVuY3Rpb24oYWEpe3ZhciBsYT1RP0EoYWEpOnUoYWEpO2FhPVE/dShhYSk6QShhYSk7cmV0dXJuInRyYW5zbGF0ZSgiK2xhKyIsIithYSsiKSJ9LHZpc2liaWxpdHk6eH0pLmVhY2goZnVuY3Rpb24oYWEpe1Qud3JpdGUoWChhYSksUT9ELmdldChhYSkud2lkdGg6RC5nZXQoYWEpLmhlaWdodCxRP0QuZ2V0KGFhKS5oZWlnaHQ6RC5nZXQoYWEpLndpZHRoLHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIiLHRleHRSb3RhdGlvbjpRPzA6OTB9LHQuc2VsZWN0KHRoaXMpLm5vZGUoKSl9KX07cS5wcm90b3R5cGUuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdT10aGlzLHg9dGhpcy5fc2NhbGUucmFuZ2UoKTtyZXR1cm4gbS5BcnJheS51bmlxKHRoaXMuYW5ub3RhdGVkVGlja3MoKS5maWx0ZXIoZnVuY3Rpb24oQSl7cmV0dXJuIG51bGw9PUE/ITE6bS5NYXRoLmluUmFuZ2UodS5fc2NhbGUuc2NhbGUoQSksCnhbMF0seFsxXSl9KSl9O3EucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB1PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCkseD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX2NvbXB1dGVIZWlnaHQoKTp0aGlzLl9jb21wdXRlV2lkdGgoKTtyZXR1cm4gTWF0aC5taW4oeCx1KX07cS5wcm90b3R5cGUuX2Fubm90YXRpb25UaWVySGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqcS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HfTtxLnByb3RvdHlwZS5fYW5ub3RhdGlvblRvVGllcj1mdW5jdGlvbih1KXt2YXIgeD10aGlzLEE9W1tdXSx5PW5ldyBtLk1hcCx3PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCk7dGhpcy5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcigpLmZvckVhY2goZnVuY3Rpb24oQyl7dmFyIEc9eC5fc2NhbGUuc2NhbGUoQyksCkQ9dS5nZXQoQykud2lkdGg7aWYoMD5HfHxHK0Q+dyl5LnNldChDLC0xKTtlbHNle2Zvcih2YXIgQj1mdW5jdGlvbihOKXtyZXR1cm4gQVtOXS5zb21lKGZ1bmN0aW9uKE8pe3ZhciBIPXguX3NjYWxlLnNjYWxlKE8pO089dS5nZXQoTykud2lkdGg7cmV0dXJuIEcrRD49SCYmRzw9SCtPfSl9LEk9MDtCKEkpOylJKyssQS5sZW5ndGg9PT1JJiZBLnB1c2goW10pO0FbSV0ucHVzaChDKTt5LnNldChDLEkpfX0pO3JldHVybiB5fTtxLnByb3RvdHlwZS5fcmVtb3ZlQW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGluZSIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1jaXJjbGUiKS5yZW1vdmUoKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tcmVjdCIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1sYWJlbCIpLnJlbW92ZSgpfTsKcS5wcm90b3R5cGUuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaD1mdW5jdGlvbigpe3ZhciB1PXt4MTowLHkxOjAseDI6MCx5MjowfTtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dS54Mj10aGlzLndpZHRoKCk7YnJlYWs7Y2FzZSAidG9wIjp1LngyPXRoaXMud2lkdGgoKTt1LnkxPXRoaXMuaGVpZ2h0KCk7dS55Mj10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UgImxlZnQiOnUueDE9dGhpcy53aWR0aCgpO3UueDI9dGhpcy53aWR0aCgpO3UueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlICJyaWdodCI6dS55Mj10aGlzLmhlaWdodCgpfXJldHVybiB1fTtxLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHgodyl7cmV0dXJuIEEuX3NjYWxlLnNjYWxlKHcpfXZhciBBPXRoaXM7dm9pZCAwPT09dSYmKHU9ITEpO3ZhciB5PXt4MTowLHkxOjAseDI6MCx5MjowfTt0aGlzLmlzSG9yaXpvbnRhbCgpPyh5LngxPQp4LHkueDI9eCk6KHkueTE9eCx5LnkyPXgpO3U9dT90aGlzLl9lbmRUaWNrTGVuZ3RoOnRoaXMuX2lubmVyVGlja0xlbmd0aDtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6eS55Mj11O2JyZWFrO2Nhc2UgInRvcCI6eS55MT10aGlzLmhlaWdodCgpO3kueTI9dGhpcy5oZWlnaHQoKS11O2JyZWFrO2Nhc2UgImxlZnQiOnkueDE9dGhpcy53aWR0aCgpO3kueDI9dGhpcy53aWR0aCgpLXU7YnJlYWs7Y2FzZSAicmlnaHQiOnkueDI9dX1yZXR1cm4geX07cS5wcm90b3R5cGUuX3NldERlZmF1bHRBbGlnbm1lbnQ9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dGhpcy55QWxpZ25tZW50KCJ0b3AiKTticmVhaztjYXNlICJ0b3AiOnRoaXMueUFsaWdubWVudCgiYm90dG9tIik7YnJlYWs7Y2FzZSAibGVmdCI6dGhpcy54QWxpZ25tZW50KCJyaWdodCIpO2JyZWFrO2Nhc2UgInJpZ2h0Ijp0aGlzLnhBbGlnbm1lbnQoImxlZnQiKX19OwpxLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4idG9wIj09PXRoaXMuX29yaWVudGF0aW9ufHwiYm90dG9tIj09PXRoaXMuX29yaWVudGF0aW9ufTtxLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX07cS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2Zvcm1hdHRlcjt0aGlzLl9mb3JtYXR0ZXI9dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5pbm5lclRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5uZXJUaWNrTGVuZ3RofTtxLnByb3RvdHlwZS5lbmRUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZFRpY2tMZW5ndGh9O3EucHJvdG90eXBlLl9tYXhMYWJlbFRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaG93RW5kVGlja0xhYmVscygpP01hdGgubWF4KHRoaXMuaW5uZXJUaWNrTGVuZ3RoKCksCnRoaXMuZW5kVGlja0xlbmd0aCgpKTp0aGlzLmlubmVyVGlja0xlbmd0aCgpfTtxLnByb3RvdHlwZS50aWNrTGFiZWxQYWRkaW5nPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBhZGRpbmc7aWYoMD51KXRocm93IEVycm9yKCJ0aWNrIGxhYmVsIHBhZGRpbmcgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX3RpY2tMYWJlbFBhZGRpbmc9dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5tYXJnaW49ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fbWFyZ2luO2lmKDA+dSl0aHJvdyBFcnJvcigibWFyZ2luIHNpemUgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX21hcmdpbj11O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uO3U9dS50b0xvd2VyQ2FzZSgpO2lmKCJ0b3AiIT09dSYmImJvdHRvbSIhPT0KdSYmImxlZnQiIT09dSYmInJpZ2h0IiE9PXUpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIG9yaWVudGF0aW9uIik7dGhpcy5fb3JpZW50YXRpb249dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5zaG93RW5kVGlja0xhYmVscz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93RW5kVGlja0xhYmVsc307cS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTWFya3M9ZnVuY3Rpb24oKXt0aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19NQVJLX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07cS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07CnEucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHg9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKTt4LmVtcHR5KCl8fHguZWFjaChmdW5jdGlvbigpe20uRE9NLmNsaWVudFJlY3RJbnNpZGUodGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx1KXx8dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtxLnByb3RvdHlwZS5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbD1mdW5jdGlvbigpe3ZhciB1PXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX01BUktfQ0xBU1MpLHg9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgQT10LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpOwpyZXR1cm4iaW5oZXJpdCI9PT1BfHwidmlzaWJsZSI9PT1BfSkuZGF0YSgpO3UuZWFjaChmdW5jdGlvbihBKXstMT09PXguaW5kZXhPZihBKSYmdC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHF9KGQuQ29tcG9uZW50KTtoLkVORF9USUNLX01BUktfQ0xBU1M9ImVuZC10aWNrLW1hcmsiO2guVElDS19NQVJLX0NMQVNTPSJ0aWNrLW1hcmsiO2guVElDS19MQUJFTF9DTEFTUz0idGljay1sYWJlbCI7aC5BTk5PVEFUSU9OX0xJTkVfQ0xBU1M9ImFubm90YXRpb24tbGluZSI7aC5BTk5PVEFUSU9OX1JFQ1RfQ0xBU1M9ImFubm90YXRpb24tcmVjdCI7aC5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUz0iYW5ub3RhdGlvbi1jaXJjbGUiO2guQU5OT1RBVElPTl9MQUJFTF9DTEFTUz0KImFubm90YXRpb24tbGFiZWwiO2guX0FOTk9UQVRJT05fTEFCRUxfUEFERElORz00O2YuQXhpcz1ofSxmdW5jdGlvbihkLGYpe2YuU0hPV19XQVJOSU5HUz0hMDtmLkFERF9USVRMRV9FTEVNRU5UUz0hMH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uPXt9O3RoaXMuX2V2ZW50VGFyZ2V0PWRvY3VtZW50O3RoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXQ9e307dGhpcy5fY29ubmVjdGVkPSExfXQucHJvdG90eXBlLl9oYXNOb0NhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgbD1PYmplY3Qua2V5cyh0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0KSxwPTA7cDxsLmxlbmd0aDtwKyspaWYoMCE9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbbFtwXV0uc2l6ZSlyZXR1cm4hMTtyZXR1cm4hMH07dC5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXt2YXIgbD10aGlzOwp0aGlzLl9jb25uZWN0ZWR8fChPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2wuX2V2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIocCxsLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3BdKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMCl9O3QucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLl9jb25uZWN0ZWQmJnRoaXMuX2hhc05vQ2FsbGJhY2tzKCkmJihPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2wuX2V2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIocCxsLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3BdKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMSl9O3QucHJvdG90eXBlLl9hZGRDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGwscCl7bnVsbD09dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXSYmCih0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xdPW5ldyBrLkNhbGxiYWNrU2V0KTt0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xdLmFkZChwKTt0aGlzLl9jb25uZWN0KCl9O3QucHJvdG90eXBlLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGwscCl7bnVsbCE9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXSYmdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXS5kZWxldGUocCk7dGhpcy5fZGlzY29ubmVjdCgpfTt0LnByb3RvdHlwZS5fY2FsbENhbGxiYWNrc0ZvckV2ZW50PWZ1bmN0aW9uKGwpe2Zvcih2YXIgcD1bXSxtPTE7bTxhcmd1bWVudHMubGVuZ3RoO20rKylwW20tMV09YXJndW1lbnRzW21dO209dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXTtudWxsIT1tJiZtLmNhbGxDYWxsYmFja3MuYXBwbHkobSxwKX07cmV0dXJuIHR9KCk7Zi5EaXNwYXRjaGVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fAooZltsXT10W2xdKX1rKGgoODcpKTtrKGgoODgpKTtrKGgoNDApKTtrKGgoODkpKTtrKGgoOTApKTtkPWgoMjYpO2Yuem9vbU91dD1kLnpvb21PdXR9LGZ1bmN0aW9uKGQsZil7ZnVuY3Rpb24gaChuLHEsdSl7cmV0dXJuIHUtKHUtbikqcX1mdW5jdGlvbiBrKG4scSx1KXtyZXR1cm4obipxLXUpLyhxLTEpfWZ1bmN0aW9uIHQobixxLHUseCl7dmFyIEE9MTxxO3U9QT94OnU7aWYobnVsbD09dSlyZXR1cm4gcTtuPW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtyZXR1cm4oQT9NYXRoLm1pbjpNYXRoLm1heCkocSx1L01hdGguYWJzKG5bMV0tblswXSkpfWZ1bmN0aW9uIGwobixxLHUseCxBKXtpZigxPj1xKXJldHVybntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX07aWYobnVsbD09eCYmbnVsbD09QSlyZXR1cm57Y2VudGVyUG9pbnQ6dSx6b29tQW1vdW50OnF9O3ZhciB5PXAobiksdz1tKG4pLEM9dz9JbmZpbml0eTotSW5maW5pdHk7dz13Py1JbmZpbml0eTpJbmZpbml0eTt4PW51bGw9PQp4P0M6eDtBPW51bGw9PUE/dzpBO3c9bi5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpO0M9d1swXTt3PXdbMV07QT1uLnNjYWxlVHJhbnNmb3JtYXRpb24oQSk7dz1uLnNjYWxlVHJhbnNmb3JtYXRpb24odyk7dmFyIEc9aCh3LHEsdSk7eD1uLnNjYWxlVHJhbnNmb3JtYXRpb24oeCk7bj1uLnNjYWxlVHJhbnNmb3JtYXRpb24oQyk7Qz1oKG4scSx1KTtyZXR1cm4gTWF0aC5hYnMoRy1DKT5NYXRoLmFicyhBLXgpPyhxPShBLXgpLyh3LW4pLDEhPT1xP3tjZW50ZXJQb2ludDprKHcscSxBKSx6b29tQW1vdW50OnF9OntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX0pOkc+QSE9eT97Y2VudGVyUG9pbnQ6ayh3LHEsQSksem9vbUFtb3VudDpxfTpDPHghPXk/e2NlbnRlclBvaW50OmsobixxLHgpLHpvb21BbW91bnQ6cX06e2NlbnRlclBvaW50OnUsem9vbUFtb3VudDpxfX1mdW5jdGlvbiBwKG4pe249bi5yYW5nZSgpO3JldHVybiBuWzFdPG5bMF19ZnVuY3Rpb24gbShuKXtuPW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTsKcmV0dXJuIG5bMV08blswXX1mLnpvb21PdXQ9aDtmLmNvbnN0cmFpbmVkWm9vbT1mdW5jdGlvbihuLHEsdSx4LEEseSx3KXtxPXQobixxLHgsQSk7cmV0dXJuIGwobixxLHUseSx3KX07Zi5jb25zdHJhaW5ab29tRXh0ZW50cz10O2YuY29uc3RyYWluWm9vbVZhbHVlcz1sO2YuY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbihuLHEsdSx4KXt2YXIgQT1uLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCkseT1BWzBdLHc9QVsxXTtBPXAobik7MDxxIT09QT8odT14LG51bGwhPXUmJih5PW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih3KSxuPW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxxPShBP01hdGgubWF4Ok1hdGgubWluKSh5K3EsbikteSkpOm51bGwhPXUmJih5PW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih5KSxuPW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxxPShBP01hdGgubWluOk1hdGgubWF4KSh5K3EsbikteSk7cmV0dXJuIHF9fSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhJLApOLE8pe3ZhciBIPUkuc2NhbGU7aWYoSCBpbnN0YW5jZW9mIHkuQ2F0ZWdvcnkpTz1ILnJhbmdlQmFuZCgpO2Vsc2V7dmFyIEs9SS5hY2Nlc3NvcjtJPWwuc2V0KEMuQXJyYXkuZmxhdHRlbihOLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gTS5kYXRhKCkubWFwKGZ1bmN0aW9uKEwsUSl7cmV0dXJuIEsoTCxRLE0pfSkuZmlsdGVyKGZ1bmN0aW9uKEwpe3JldHVybiBudWxsIT1MfSkubWFwKGZ1bmN0aW9uKEwpe3JldHVybiBMLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oTSl7cmV0dXJuK019KTtJLnNvcnQoZnVuY3Rpb24oTSxMKXtyZXR1cm4gTS1MfSk7ST1JLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gSC5zY2FsZShNKX0pO0k9bC5wYWlycyhJKTtPPUMuTWF0aC5taW4oSSxmdW5jdGlvbihNKXtyZXR1cm4gTWF0aC5hYnMoTVsxXS1NWzBdKX0sTypCLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTyk7Tyo9Qi5fQkFSX1RISUNLTkVTU19SQVRJT31yZXR1cm4gT30KdmFyIHQ9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEksTil7ZnVuY3Rpb24gTygpe3RoaXMuY29uc3RydWN0b3I9SX1mb3IodmFyIEggaW4gTilOLmhhc093blByb3BlcnR5KEgpJiYoSVtIXT1OW0hdKTtJLnByb3RvdHlwZT1udWxsPT09Tj9PYmplY3QuY3JlYXRlKE4pOihPLnByb3RvdHlwZT1OLnByb3RvdHlwZSxuZXcgTyl9LGw9aCgxKSxwPWgoNSksbT1oKDcpLG49aCg4KSxxPWgoMTQpLHU9aCg2KSx4PWgoMzQpLEE9aCgyMCkseT1oKDMpLHc9aCgxMSksQz1oKDApO2Q9aCgxMCk7dmFyIEc9aCgxOSksRD1oKDIpO2g9aCgxNik7Zi5CYXJPcmllbnRhdGlvbj1kLm1ha2VFbnVtKFsidmVydGljYWwiLCJob3Jpem9udGFsIl0pO2YuTGFiZWxzUG9zaXRpb249ZC5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIiwib3V0c2lkZSJdKTtmLkJhckFsaWdubWVudD1kLm1ha2VFbnVtKFsic3RhcnQiLCJtaWRkbGUiLCJlbmQiXSk7dmFyIEI9ZnVuY3Rpb24oSSl7ZnVuY3Rpb24gTihPKXt2b2lkIDA9PT0KTyYmKE89InZlcnRpY2FsIik7dmFyIEg9SS5jYWxsKHRoaXMpfHx0aGlzO0guX2xhYmVsRm9ybWF0dGVyPW4uaWRlbnRpdHkoKTtILl9sYWJlbHNFbmFibGVkPSExO0guX2xhYmVsc1Bvc2l0aW9uPWYuTGFiZWxzUG9zaXRpb24uZW5kO0guX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlPSEwO0guX2JhckFsaWdubWVudD0ibWlkZGxlIjtILl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3M9QS5tZW1vaXplKGspO0guX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITA7SC5hZGRDbGFzcygiYmFyLXBsb3QiKTtpZigidmVydGljYWwiIT09TyYmImhvcml6b250YWwiIT09Tyl0aHJvdyBFcnJvcihPKyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIFBsb3RzLkJhciIpO0guX2lzVmVydGljYWw9InZlcnRpY2FsIj09PU87SC5hbmltYXRvcigiYmFzZWxpbmUiLG5ldyBtLk51bGwpO0guYXR0cigiZmlsbCIsKG5ldyB5LkNvbG9yKS5yYW5nZSgpWzBdKTtILmF0dHIoTi5fQkFSX1RISUNLTkVTU19LRVksCmZ1bmN0aW9uKCl7cmV0dXJuIEguX2JhclBpeGVsVGhpY2tuZXNzKCl9KTtILl9sYWJlbENvbmZpZz1uZXcgQy5NYXA7SC5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW0guYmFzZWxpbmVWYWx1ZSgpXX07cmV0dXJuIEh9dChOLEkpO04ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oTyxILEspe0kucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLE8sSCxLKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLng9ZnVuY3Rpb24oTyxIKXtpZihudWxsPT1PKXJldHVybiBJLnByb3RvdHlwZS54LmNhbGwodGhpcyk7bnVsbD09SD9JLnByb3RvdHlwZS54LmNhbGwodGhpcyxPKTpJLnByb3RvdHlwZS54LmNhbGwodGhpcyxPLEgpO3RoaXMuX3VwZGF0ZVRoaWNrbmVzc0F0dHIoKTt0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS55PWZ1bmN0aW9uKE8sSCl7aWYobnVsbD09Ck8pcmV0dXJuIEkucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1IP0kucHJvdG90eXBlLnkuY2FsbCh0aGlzLE8pOkkucHJvdG90eXBlLnkuY2FsbCh0aGlzLE8sSCk7dGhpcy5fdXBkYXRlTGVuZ3RoU2NhbGUoKTtyZXR1cm4gdGhpc307Ti5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCk6dGhpcy54KCl9O04ucHJvdG90eXBlLnBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy54KCk6dGhpcy55KCl9O04ucHJvdG90eXBlLmJhckVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChOLl9CQVJfRU5EX0tFWSl9O04ucHJvdG90eXBlLmJhckFsaWdubWVudD1mdW5jdGlvbihPKXtpZihudWxsPT1PKXJldHVybiB0aGlzLl9iYXJBbGlnbm1lbnQ7dGhpcy5fYmFyQWxpZ25tZW50PU87dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7CnJldHVybiB0aGlzfTtOLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifTtOLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB4LlJlY3RhbmdsZVNWR0RyYXdlcihOLl9CQVJfQVJFQV9DTEFTUyl9LGZ1bmN0aW9uKE8pe3JldHVybiBuZXcgcS5SZWN0YW5nbGVDYW52YXNEcmF3ZXIoTyl9KX07Ti5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7SS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfTtOLnByb3RvdHlwZS5iYXNlbGluZVZhbHVlPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5fYmFzZWxpbmVWYWx1ZSlyZXR1cm4gdGhpcy5fYmFzZWxpbmVWYWx1ZTtpZighdGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpcmV0dXJuIDA7CnZhciBPPXRoaXMubGVuZ3RoKCkuc2NhbGU7cmV0dXJuIE8/TyBpbnN0YW5jZW9mIHkuVGltZT9uZXcgRGF0ZSgwKTowOjB9O04ucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oTyl7SS5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsTyl9O04ucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKE8pe0kucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxPKTtyZXR1cm4gdGhpc307Ti5wcm90b3R5cGUucmVtb3ZlRGF0YXNldD1mdW5jdGlvbihPKXtJLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxPKX07Ti5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oTyl7SS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQuY2FsbCh0aGlzLE8pO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihPKXtpZihudWxsPT1PKXJldHVybiBJLnByb3RvdHlwZS5kYXRhc2V0cy5jYWxsKHRoaXMpO0kucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcywKTyk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oTyxIKXtpZihudWxsPT1PKXJldHVybiB0aGlzLl9sYWJlbHNFbmFibGVkO3RoaXMuX2xhYmVsc0VuYWJsZWQ9TztudWxsIT1IJiYodGhpcy5fbGFiZWxzUG9zaXRpb249SCk7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLmxhYmVsRm9ybWF0dGVyPWZ1bmN0aW9uKE8pe2lmKG51bGw9PU8pcmV0dXJuIHRoaXMuX2xhYmVsRm9ybWF0dGVyO3RoaXMuX2xhYmVsRm9ybWF0dGVyPU87dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24oTyl7dmFyIEg9SS5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsTyksSz10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoTi5fTEFCRUxfQVJFQV9DTEFTUywKITApLE09bmV3IHAuU3ZnQ29udGV4dChLLm5vZGUoKSksTD1uZXcgcC5DYWNoZU1lYXN1cmVyKE0pO009bmV3IHAuV3JpdGVyKEwsTSk7dGhpcy5fbGFiZWxDb25maWcuc2V0KE8se2xhYmVsQXJlYTpLLG1lYXN1cmVyOkwsd3JpdGVyOk19KTtyZXR1cm4gSH07Ti5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihPKXtJLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyxPKTt2YXIgSD10aGlzLl9sYWJlbENvbmZpZy5nZXQoTyk7bnVsbCE9SCYmKEgubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZShPKSl9O04ucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oTyl7dmFyIEg9dGhpcztyZXR1cm4gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gSyhjYSxrYSxZLEVhKXtyZXR1cm4gSC5fcGl4ZWxQb2ludEJhcihhYShjYSxrYSxZKSxsYSxFYSl9CnZhciBNPUguX2lzVmVydGljYWw/Ty54Ok8ueSxMPUguX2lzVmVydGljYWw/Ty55Ok8ueCxRPUguYm91bmRzKCksVD17bWluOjAsbWF4OlEuYm90dG9tUmlnaHQueC1RLnRvcExlZnQueH0sWD17bWluOjAsbWF4OlEuYm90dG9tUmlnaHQueS1RLnRvcExlZnQueX0sYWE9RC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihILmxlbmd0aCgpKSxsYT1ILmxlbmd0aCgpLnNjYWxlLnNjYWxlKEguYmFzZWxpbmVWYWx1ZSgpKSxaPUluZmluaXR5LGJhPUluZmluaXR5LGVhO0guX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGNhKXt2YXIga2E9SC5fZW50aXR5Qm91bmRzKGNhKTtpZihDLkRPTS5pbnRlcnNlY3RzQkJveChULFgsa2EpKXt2YXIgWT0wLEVhPTA7aWYoIUMuRE9NLmludGVyc2VjdHNCQm94KE8ueCxPLnksa2EsLjUpKXtFYT1LKGNhLmRhdHVtLGNhLmluZGV4LGNhLmRhdGFzZXQsa2EpO1k9TWF0aC5hYnMoTS0oSC5faXNWZXJ0aWNhbD9FYS54OkVhLnkpKTsKdmFyIHZhPUguX2lzVmVydGljYWw/a2EueTprYS54O2thPXZhKyhILl9pc1ZlcnRpY2FsP2thLmhlaWdodDprYS53aWR0aCk7RWE9TD49dmEtLjUmJkw8PWthKy41PzA6TWF0aC5hYnMoTC0oSC5faXNWZXJ0aWNhbD9FYS55OkVhLngpKX1pZihZPFp8fFk9PT1aJiZFYTxiYSllYT1jYSxaPVksYmE9RWF9fSk7aWYodm9pZCAwIT09ZWEpcmV0dXJuIEguX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShlYSl9KX07Ti5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbihPKXtyZXR1cm4gdGhpcy5fZW50aXRpZXNJbnRlcnNlY3RpbmcoTy54LE8ueSl9O04ucHJvdG90eXBlLl9lbnRpdGllc0ludGVyc2VjdGluZz1mdW5jdGlvbihPLEgpe3ZhciBLPXRoaXMsTT1bXTt0aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihMKXtDLkRPTS5pbnRlcnNlY3RzQkJveChPLEgsSy5fZW50aXR5Qm91bmRzKEwpKSYmTS5wdXNoKEsuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShMKSl9KTsKcmV0dXJuIE19O04ucHJvdG90eXBlLl91cGRhdGVMZW5ndGhTY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXt2YXIgTz10aGlzLmxlbmd0aCgpLnNjYWxlO08gaW5zdGFuY2VvZiB3LlF1YW50aXRhdGl2ZVNjYWxlJiYoTy5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlciksTy5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcikpfX07Ti5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgTz10aGlzO3RoaXMuX2JhclBpeGVsVGhpY2tuZXNzKCk7cmV0dXJuIHRoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZChmdW5jdGlvbigpe3JldHVybiBJLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKE8pfSl9O04ucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oTyl7dmFyIEg9dGhpcyxLPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpOwpLPXt4MTp0aGlzLl9pc1ZlcnRpY2FsPzA6Syx5MTp0aGlzLl9pc1ZlcnRpY2FsP0s6MCx4Mjp0aGlzLl9pc1ZlcnRpY2FsP3RoaXMud2lkdGgoKTpLLHkyOnRoaXMuX2lzVmVydGljYWw/Szp0aGlzLmhlaWdodCgpfTt0aGlzLl9nZXRBbmltYXRvcigiYmFzZWxpbmUiKS5hbmltYXRlKHRoaXMuX2Jhc2VsaW5lLEspO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKE0pe3JldHVybiBILl9sYWJlbENvbmZpZy5nZXQoTSkubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfSk7dGhpcy5fbGFiZWxzRW5hYmxlZCYmQy5XaW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBILl9kcmF3TGFiZWxzKCl9LE8pfTtOLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oTyl7dmFyIEg9dGhpcyxLPUkucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsTyk7aWYoIngiPT09TyYmdGhpcy5faXNWZXJ0aWNhbClPPXRoaXMueCgpOwplbHNle2lmKCJ5IiE9PU98fHRoaXMuX2lzVmVydGljYWwpcmV0dXJuIEs7Tz10aGlzLnkoKX1pZighKE8mJk8uc2NhbGUmJk8uc2NhbGUgaW5zdGFuY2VvZiB3LlF1YW50aXRhdGl2ZVNjYWxlKSlyZXR1cm4gSzt2YXIgTT1PLnNjYWxlLEw9dGhpcy5fYmFyUGl4ZWxUaGlja25lc3MoKTtyZXR1cm4gSz1LLm1hcChmdW5jdGlvbihRKXtyZXR1cm4gbC5leHRlbnQoW00uaW52ZXJ0KEguX2dldFBvc2l0aW9uQXR0cihNLnNjYWxlKFFbMF0pLEwpKSxNLmludmVydChILl9nZXRQb3NpdGlvbkF0dHIoTS5zY2FsZShRWzBdKSxMKStMKSxNLmludmVydChILl9nZXRQb3NpdGlvbkF0dHIoTS5zY2FsZShRWzFdKSxMKSksTS5pbnZlcnQoSC5fZ2V0UG9zaXRpb25BdHRyKE0uc2NhbGUoUVsxXSksTCkrTCldKX0pfTtOLnByb3RvdHlwZS5fZ2V0UG9zaXRpb25BdHRyPWZ1bmN0aW9uKE8sSCl7dGhpcy5faXNWZXJ0aWNhbHx8KE8tPUgsSCo9LTEpO3N3aXRjaCh0aGlzLl9iYXJBbGlnbm1lbnQpe2Nhc2UgInN0YXJ0IjpyZXR1cm4gTzsKY2FzZSAiZW5kIjpyZXR1cm4gTy1IO2RlZmF1bHQ6cmV0dXJuIE8tSC8yfX07Ti5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgTz10aGlzLEg9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLEs9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTT10aGlzLmRhdGFzZXRzKCkuc29tZShmdW5jdGlvbihMKXtyZXR1cm4gSC5nZXQoTCkuc29tZShmdW5jdGlvbihRLFQpe3JldHVybiBudWxsPT1RPyExOk8uX2RyYXdMYWJlbChRLFQsTCxLKX0pfSk7dGhpcy5faGlkZUJhcnNJZkFueUFyZVRvb1dpZGUmJk0mJnRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe3JldHVybiBPLl9sYWJlbENvbmZpZy5nZXQoTCkubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfSl9O04ucHJvdG90eXBlLl9kcmF3TGFiZWw9ZnVuY3Rpb24oTyxILEssTSl7dmFyIEw9dGhpcy5fbGFiZWxDb25maWcuZ2V0KEspLFE9TC5sYWJlbEFyZWEsVD1MLm1lYXN1cmVyO0w9TC53cml0ZXI7CnZhciBYPXRoaXMubGVuZ3RoKCkuYWNjZXNzb3IsYWE9WChPLEgsSyk7WD10aGlzLmxlbmd0aCgpLnNjYWxlO3ZhciBsYT1udWxsIT1YP1guc2NhbGUoYWEpOmFhLFo9bnVsbCE9WD9YLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTp0aGlzLmJhc2VsaW5lVmFsdWUoKSxiYT17eDpNLngoTyxILEspLHk6TS55KE8sSCxLKX07WD17d2lkdGg6TS53aWR0aChPLEgsSyksaGVpZ2h0Ok0uaGVpZ2h0KE8sSCxLKX07YWE9dGhpcy5fbGFiZWxGb3JtYXR0ZXIoYWEsTyxILEspO1Q9VC5tZWFzdXJlKGFhKTt2YXIgZWE9dGhpcy5fc2hvdWxkU2hvd0xhYmVsT25CYXIoYmEsWCxUKTtiYT10aGlzLl9jYWxjdWxhdGVMYWJlbFByb3BlcnRpZXMoYmEsWCxULGVhLHRoaXMuX2lzVmVydGljYWw/bGE8PVo6bGE8Wik7bGE9YmEuY29udGFpbmVyRGltZW5zaW9ucztaPWJhLmxhYmVsQ29udGFpbmVyT3JpZ2luO2JhPWJhLmFsaWdubWVudDtPPU0uZmlsbChPLEgsSyk7UT10aGlzLl9jcmVhdGVMYWJlbENvbnRhaW5lcihRLApaLGVhLE8pO0wud3JpdGUoYWEsbGEud2lkdGgsbGEuaGVpZ2h0LHt4QWxpZ246YmEueCx5QWxpZ246YmEueX0sUS5ub2RlKCkpO3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP1gud2lkdGg8VC53aWR0aDpYLmhlaWdodDxULmhlaWdodH07Ti5wcm90b3R5cGUuX3Nob3VsZFNob3dMYWJlbE9uQmFyPWZ1bmN0aW9uKE8sSCxLKXtpZih0aGlzLl9sYWJlbHNQb3NpdGlvbj09PWYuTGFiZWxzUG9zaXRpb24ub3V0c2lkZSlyZXR1cm4hMTtPPXRoaXMuX2lzVmVydGljYWw/Ty55Ok8ueDt2YXIgTT10aGlzLl9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGg7SD10aGlzLl9pc1ZlcnRpY2FsP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpO0s9dGhpcy5faXNWZXJ0aWNhbD9LLmhlaWdodDpLLndpZHRoO3ZhciBMPU8rTTtMPkg/TT1ILU86MD5PJiYoTT1MKTtyZXR1cm4gSytOLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjw9TX07Ti5wcm90b3R5cGUuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcz0KZnVuY3Rpb24oTyxILEssTSxMKXtmdW5jdGlvbiBRKGthKXtzd2l0Y2goa2Epe2Nhc2UgInRvcExlZnQiOlo9VC5faXNWZXJ0aWNhbD8idG9wIjoibGVmdCI7ZWErPU4uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSO2NhKz1OLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjticmVhaztjYXNlICJjZW50ZXIiOmNhKz0oYWErbGEpLzI7YnJlYWs7Y2FzZSAiYm90dG9tUmlnaHQiOlo9VC5faXNWZXJ0aWNhbD8iYm90dG9tIjoicmlnaHQiLGVhLT1OLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUixjYSs9YmEtTi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVItbGF9fXZhciBUPXRoaXMsWD10aGlzLl9pc1ZlcnRpY2FsP08ueTpPLngsYWE9dGhpcy5faXNWZXJ0aWNhbD9ILmhlaWdodDpILndpZHRoLGxhPXRoaXMuX2lzVmVydGljYWw/Sy5oZWlnaHQ6Sy53aWR0aCxaPSJjZW50ZXIiLGJhPWFhLGVhPVgsY2E9WDtpZihNKXN3aXRjaCh0aGlzLl9sYWJlbHNQb3NpdGlvbil7Y2FzZSBmLkxhYmVsc1Bvc2l0aW9uLnN0YXJ0Okw/ClEoImJvdHRvbVJpZ2h0Iik6USgidG9wTGVmdCIpO2JyZWFrO2Nhc2UgZi5MYWJlbHNQb3NpdGlvbi5taWRkbGU6USgiY2VudGVyIik7YnJlYWs7Y2FzZSBmLkxhYmVsc1Bvc2l0aW9uLmVuZDpMP1EoInRvcExlZnQiKTpRKCJib3R0b21SaWdodCIpfWVsc2UgTD8oWj10aGlzLl9pc1ZlcnRpY2FsPyJ0b3AiOiJsZWZ0IixiYT1hYStOLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitsYSxlYS09Ti5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrbGEsY2EtPU4uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK2xhKTooWj10aGlzLl9pc1ZlcnRpY2FsPyJib3R0b20iOiJyaWdodCIsYmE9YWErTi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrbGEsY2ErPWFhK04uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSKTtyZXR1cm57Y29udGFpbmVyRGltZW5zaW9uczp7d2lkdGg6dGhpcy5faXNWZXJ0aWNhbD9ILndpZHRoOmJhLGhlaWdodDp0aGlzLl9pc1ZlcnRpY2FsP2JhOkguaGVpZ2h0fSxsYWJlbENvbnRhaW5lck9yaWdpbjp7eDp0aGlzLl9pc1ZlcnRpY2FsPwpPLng6ZWEseTp0aGlzLl9pc1ZlcnRpY2FsP2VhOk8ueX0sbGFiZWxPcmlnaW46e3g6dGhpcy5faXNWZXJ0aWNhbD9PLngrSC53aWR0aC8yLUsud2lkdGgvMjpjYSx5OnRoaXMuX2lzVmVydGljYWw/Y2E6Ty55K0guaGVpZ2h0LzItSy5oZWlnaHQvMn0sYWxpZ25tZW50Ont4OnRoaXMuX2lzVmVydGljYWw/ImNlbnRlciI6Wix5OnRoaXMuX2lzVmVydGljYWw/WjoiY2VudGVyIn19fTtOLnByb3RvdHlwZS5fY3JlYXRlTGFiZWxDb250YWluZXI9ZnVuY3Rpb24oTyxILEssTSl7Tz1PLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0gueCsiLCAiK0gueSsiKSIpO0s/KE8uY2xhc3NlZCgib24tYmFyLWxhYmVsIiwhMCksSz0xLjYqQy5Db2xvci5jb250cmFzdCgid2hpdGUiLE0pPEMuQ29sb3IuY29udHJhc3QoImJsYWNrIixNKSxPLmNsYXNzZWQoSz8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCkpOk8uY2xhc3NlZCgib2ZmLWJhci1sYWJlbCIsITApO3JldHVybiBPfTsKTi5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIE89W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgSD10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxLPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpLE09dGhpcy5faXNWZXJ0aWNhbD8iaGVpZ2h0Ijoid2lkdGgiO0hbdGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiXT1mdW5jdGlvbigpe3JldHVybiBLfTtIW01dPWZ1bmN0aW9uKCl7cmV0dXJuIDB9O08ucHVzaCh7YXR0clRvUHJvamVjdG9yOkgsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoRy5BbmltYXRvci5SRVNFVCl9KX1PLnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihHLkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIE99O04ucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIE8oYmEsCmVhLGNhKXtyZXR1cm4gTWF0aC5hYnMoTS1YKGJhLGVhLGNhKSl9dmFyIEg9dGhpcyxLPUkucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLE09dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksTD10aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIsUT10aGlzLl9pc1ZlcnRpY2FsPyJ4IjoieSIsVD1ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMucG9zaXRpb24oKSksWD1ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMubGVuZ3RoKCkpLGFhPUtbTi5fQkFSX1RISUNLTkVTU19LRVldLGxhPUsuZ2FwLFo9bnVsbD09bGE/YWE6ZnVuY3Rpb24oYmEsZWEsY2Epe3JldHVybiBhYShiYSxlYSxjYSktbGEoYmEsZWEsY2EpfTtLLndpZHRoPXRoaXMuX2lzVmVydGljYWw/WjpPO0suaGVpZ2h0PXRoaXMuX2lzVmVydGljYWw/TzpaO0tbTF09ZnVuY3Rpb24oYmEsZWEsY2Epe2JhPVgoYmEsZWEsY2EpO3JldHVybiBiYT5NP006YmF9OwpLW1FdPWZ1bmN0aW9uKGJhLGVhLGNhKXtyZXR1cm4gSC5fZ2V0UG9zaXRpb25BdHRyKFQoYmEsZWEsY2EpLGFhKGJhLGVhLGNhKSl9O3JldHVybiBLfTtOLnByb3RvdHlwZS5fdXBkYXRlVGhpY2tuZXNzQXR0cj1mdW5jdGlvbigpe3ZhciBPPXRoaXMsSD10aGlzLnBvc2l0aW9uKCksSz10aGlzLmJhckVuZCgpO251bGwhPUgmJm51bGwhPUs/KHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITEsdGhpcy5hdHRyKE4uX0JBUl9USElDS05FU1NfS0VZLGZ1bmN0aW9uKE0sTCxRKXt2YXIgVD1ILmFjY2Vzc29yKE0sTCxRKTtNPUsuYWNjZXNzb3IoTSxMLFEpO1Q9SC5zY2FsZT9ILnNjYWxlLnNjYWxlKFQpOlQ7TT1LLnNjYWxlP0suc2NhbGUuc2NhbGUoTSk6TTtyZXR1cm4gTWF0aC5hYnMoTS1UKX0pKToodGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz0hMCx0aGlzLmF0dHIoTi5fQkFSX1RISUNLTkVTU19LRVksZnVuY3Rpb24oKXtyZXR1cm4gTy5fYmFyUGl4ZWxUaGlja25lc3MoKX0pKX07Ck4ucHJvdG90eXBlLl9iYXJQaXhlbFRoaWNrbmVzcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzP3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpP3RoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcyh0aGlzLnBvc2l0aW9uKCksdGhpcy5kYXRhc2V0cygpLHRoaXMuX2lzVmVydGljYWw/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCkpOjA6MH07Ti5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oTyl7dm9pZCAwPT09TyYmKE89dGhpcy5kYXRhc2V0cygpKTtyZXR1cm4gdGhpcy5fcHJvamVjdG9yc1JlYWR5KCk/SS5wcm90b3R5cGUuZW50aXRpZXMuY2FsbCh0aGlzLE8pOltdfTtOLnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKE8pe3JldHVybiB0aGlzLl9waXhlbEJvdW5kcyhPLmRhdHVtLE8uaW5kZXgsTy5kYXRhc2V0KX07Ti5wcm90b3R5cGUuX3BpeGVsQm91bmRzPWZ1bmN0aW9uKE8sSCxLKXt2YXIgTT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTsKcmV0dXJue3g6TS54KE8sSCxLKSx5Ok0ueShPLEgsSyksd2lkdGg6TS53aWR0aChPLEgsSyksaGVpZ2h0Ok0uaGVpZ2h0KE8sSCxLKX19O04ucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKE8sSCxLKXt2YXIgTT10aGlzLl9waXhlbEJvdW5kcyhPLEgsSyk7Tz0odGhpcy5faXNWZXJ0aWNhbD9ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTpELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSkoTyxILEspO0g9KHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCkuc2NhbGU6dGhpcy54KCkuc2NhbGUpLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTtyZXR1cm4gdGhpcy5fcGl4ZWxQb2ludEJhcihPLEgsTSl9O04ucHJvdG90eXBlLl9waXhlbFBvaW50QmFyPWZ1bmN0aW9uKE8sSCxLKXtpZih0aGlzLl9pc1ZlcnRpY2FsKXt2YXIgTT1LLngrSy53aWR0aC8yO089Tzw9SD9LLnk6Sy55K0suaGVpZ2h0fWVsc2UgTT1PPj1IP0sueCtLLndpZHRoOksueCxPPUsueStLLmhlaWdodC8KMjtyZXR1cm57eDpNLHk6T319O04ucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihPLEgpe0kucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsTyxIKX07Ti5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgTz10aGlzLEg9bmV3IEMuTWFwLEs9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTT10aGlzLndpZHRoKCksTD10aGlzLmhlaWdodCgpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKFEpe3ZhciBUPVEuZGF0YSgpLm1hcChmdW5jdGlvbihYLGFhKXtyZXR1cm4gTy5faXNEYXR1bU9uU2NyZWVuKEssTSxMLFgsYWEsUSk/WDpudWxsfSk7SC5zZXQoUSxUKX0pO3JldHVybiBIfTtOLnByb3RvdHlwZS5faXNEYXR1bU9uU2NyZWVuPWZ1bmN0aW9uKE8sSCxLLE0sTCxRKXt2YXIgVD1PLngoTSxMLFEpLFg9Ty55KE0sTCxRKSxhYT1PLndpZHRoKE0sTCxRKTtPPU8uaGVpZ2h0KE0sTCxRKTtyZXR1cm4gQy5NYXRoLmlzVmFsaWROdW1iZXIoVCkmJgpDLk1hdGguaXNWYWxpZE51bWJlcihYKSYmQy5NYXRoLmlzVmFsaWROdW1iZXIoYWEpJiZDLk1hdGguaXNWYWxpZE51bWJlcihPKT9DLk1hdGguYm91bmRzSW50ZXJzZWN0cyhULFgsYWEsTyxILEspOiExfTtyZXR1cm4gTn0oaC5YWVBsb3QpO0IuX0JBUl9USElDS05FU1NfUkFUSU89Ljk1O0IuX1NJTkdMRV9CQVJfRElNRU5TSU9OX1JBVElPPS40O0IuX0JBUl9BUkVBX0NMQVNTPSJiYXItYXJlYSI7Qi5fQkFSX0VORF9LRVk9ImJhckVuZCI7Qi5fQkFSX1RISUNLTkVTU19LRVk9IndpZHRoIjtCLl9MQUJFTF9BUkVBX0NMQVNTPSJiYXItbGFiZWwtdGV4dC1hcmVhIjtCLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUj0xMDtmLkJhcj1CfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHgsQSl7ZnVuY3Rpb24geSgpe3RoaXMuY29uc3RydWN0b3I9eH1mb3IodmFyIHcgaW4gQSlBLmhhc093blByb3BlcnR5KHcpJiYoeFt3XT1BW3ddKTt4LnByb3RvdHlwZT0KbnVsbD09PUE/T2JqZWN0LmNyZWF0ZShBKTooeS5wcm90b3R5cGU9QS5wcm90b3R5cGUsbmV3IHkpfSx0PWgoMSksbD1oKDUpLHA9aCg4KSxtPWgoMyksbj1oKDApO2Q9aCgxMCk7dmFyIHE9aCgyMik7Zi5UaW1lSW50ZXJ2YWw9ZC5tYWtlRW51bSgic2Vjb25kIG1pbnV0ZSBob3VyIGRheSB3ZWVrIG1vbnRoIHllYXIiLnNwbGl0KCIgIikpO2YuVGltZUF4aXNPcmllbnRhdGlvbj1kLm1ha2VFbnVtKFsidG9wIiwiYm90dG9tIl0pO2YuVGllckxhYmVsUG9zaXRpb249ZC5tYWtlRW51bShbImJldHdlZW4iLCJjZW50ZXIiXSk7aD1mdW5jdGlvbih4KXtmdW5jdGlvbiBBKHksdyl7eT14LmNhbGwodGhpcyx5LHcpfHx0aGlzO3kuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbj1udWxsO3kuX3RpZXJMYWJlbFBvc2l0aW9ucz1bXTt5LmFkZENsYXNzKCJ0aW1lLWF4aXMiKTt5LnRpY2tMYWJlbFBhZGRpbmcoNSk7eS5heGlzQ29uZmlndXJhdGlvbnMoQS5fREVGQVVMVF9USU1FX0FYSVNfQ09ORklHVVJBVElPTlMpOwp5LmFubm90YXRpb25Gb3JtYXR0ZXIocC50aW1lKCIlYSAlYiAlZCwgJVkiKSk7cmV0dXJuIHl9ayhBLHgpO0EucHJvdG90eXBlLnRpZXJMYWJlbFBvc2l0aW9ucz1mdW5jdGlvbih5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnM7aWYoIXkuZXZlcnkoZnVuY3Rpb24odyl7cmV0dXJuImJldHdlZW4iPT09dy50b0xvd2VyQ2FzZSgpfHwiY2VudGVyIj09PXcudG9Mb3dlckNhc2UoKX0pKXRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBwb3NpdGlvbiBmb3IgdGllciBsYWJlbHMiKTt0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnM9eTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtBLnByb3RvdHlwZS5tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb249ZnVuY3Rpb24oeSl7aWYobnVsbD09eSlyZXR1cm4gdGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uO3RoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbj15O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O0EucHJvdG90eXBlLmN1cnJlbnRBeGlzQ29uZmlndXJhdGlvbj0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdfTtBLnByb3RvdHlwZS5heGlzQ29uZmlndXJhdGlvbnM9ZnVuY3Rpb24oeSl7aWYobnVsbCE9eSl7dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zPXk7dGhpcy5fbnVtVGllcnM9bi5NYXRoLm1heCh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubWFwKGZ1bmN0aW9uKEcpe3JldHVybiBHLmxlbmd0aH0pLDApO3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX3NldHVwRG9tRWxlbWVudHMoKTt5PXRoaXMudGllckxhYmVsUG9zaXRpb25zKCk7Zm9yKHZhciB3PVtdLEM9MDtDPHRoaXMuX251bVRpZXJzO0MrKyl3LnB1c2goeVtDXXx8ImJldHdlZW4iKTt0aGlzLnRpZXJMYWJlbFBvc2l0aW9ucyh3KTt0aGlzLnJlZHJhdygpfX07QS5wcm90b3R5cGUuX2dldE1vc3RQcmVjaXNlQ29uZmlndXJhdGlvbkluZGV4PQpmdW5jdGlvbigpe3ZhciB5PXRoaXMsdz10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubGVuZ3RoO3RoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKEMsRyl7Rzx3JiZDLmV2ZXJ5KGZ1bmN0aW9uKEQpe3JldHVybiB5Ll9jaGVja1RpbWVBeGlzVGllckNvbmZpZ3VyYXRpb24oRCl9KSYmKHc9Ryl9KTt3PT09dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmxlbmd0aCYmKG4uV2luZG93Lndhcm4oInpvb21lZCBvdXQgdG9vIGZhcjogY291bGQgbm90IGZpbmQgc3VpdGFibGUgaW50ZXJ2YWwgdG8gZGlzcGxheSBsYWJlbHMiKSwtLXcpO3JldHVybiB3fTtBLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih5KXtpZih5JiYoInJpZ2h0Ij09PXkudG9Mb3dlckNhc2UoKXx8ImxlZnQiPT09eS50b0xvd2VyQ2FzZSgpKSl0aHJvdyBFcnJvcih5KyIgaXMgbm90IGEgc3VwcG9ydGVkIG9yaWVudGF0aW9uIGZvciBUaW1lQXhpcyAtIG9ubHkgaG9yaXpvbnRhbCBvcmllbnRhdGlvbnMgYXJlIHN1cHBvcnRlZCIpOwpyZXR1cm4geC5wcm90b3R5cGUub3JpZW50YXRpb24uY2FsbCh0aGlzLHkpfTtBLnByb3RvdHlwZS5fY29tcHV0ZUhlaWdodD1mdW5jdGlvbigpe3ZhciB5PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQ7dGhpcy5fdGllckhlaWdodHM9W107Zm9yKHZhciB3PTA7dzx0aGlzLl9udW1UaWVyczt3KyspdGhpcy5fdGllckhlaWdodHMucHVzaCh5K3RoaXMudGlja0xhYmVsUGFkZGluZygpKygiYmV0d2VlbiI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbd10/MDp0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSkpO3JldHVybiB0LnN1bSh0aGlzLl90aWVySGVpZ2h0cyl9O0EucHJvdG90eXBlLl9nZXRJbnRlcnZhbExlbmd0aD1mdW5jdGlvbih5KXt2YXIgdz10aGlzLl9zY2FsZS5kb21haW4oKVswXTt5PW0uVGltZS50aW1lSW50ZXJ2YWxUb0QzVGltZSh5LmludGVydmFsKS5vZmZzZXQodyx5LnN0ZXApO3JldHVybiB5PnRoaXMuX3NjYWxlLmRvbWFpbigpWzFdP3RoaXMud2lkdGgoKToKTWF0aC5hYnModGhpcy5fc2NhbGUuc2NhbGUoeSktdGhpcy5fc2NhbGUuc2NhbGUodykpfTtBLnByb3RvdHlwZS5fbWF4V2lkdGhGb3JJbnRlcnZhbD1mdW5jdGlvbih5KXtyZXR1cm4gdGhpcy5fbWVhc3VyZXIubWVhc3VyZSh5LmZvcm1hdHRlcihBLl9MT05HX0RBVEUpKS53aWR0aH07QS5wcm90b3R5cGUuX2NoZWNrVGltZUF4aXNUaWVyQ29uZmlndXJhdGlvbj1mdW5jdGlvbih5KXtpZihudWxsIT10aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb24pe3ZhciB3PUEuX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYW3RoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbl0sQz1BLl9TT1JURURfVElNRV9JTlRFUlZBTF9JTkRFWFt5LmludGVydmFsXTtpZihudWxsIT13JiZudWxsIT1DJiZDPHcpcmV0dXJuITF9dz10aGlzLl9tYXhXaWR0aEZvckludGVydmFsKHkpKzIqdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7cmV0dXJuIE1hdGgubWluKHRoaXMuX2dldEludGVydmFsTGVuZ3RoKHkpLAp0aGlzLndpZHRoKCkpPj13fTtBLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbih5LHcpe3ZhciBDPXgucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyLmNhbGwodGhpcyx5LHcpO3k9dGhpcy5fdGllckhlaWdodHMucmVkdWNlKGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEcrRD5DLmhlaWdodD9HOkcrRH0pO3c9dGhpcy5tYXJnaW4oKSsodGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSp0aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpOjApO0MuaGVpZ2h0PU1hdGgubWluKEMuaGVpZ2h0LHkrdyk7cmV0dXJuIEN9O0EucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3gucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3NldHVwRG9tRWxlbWVudHMoKX07QS5wcm90b3R5cGUuX3NldHVwRG9tRWxlbWVudHM9ZnVuY3Rpb24oKXt0aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoIi4iK0EuVElNRV9BWElTX1RJRVJfQ0xBU1MpLnJlbW92ZSgpOwp0aGlzLl90aWVyTGFiZWxDb250YWluZXJzPVtdO3RoaXMuX3RpZXJNYXJrQ29udGFpbmVycz1bXTt0aGlzLl90aWVyQmFzZWxpbmVzPVtdO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5yZW1vdmUoKTt0aGlzLl9iYXNlbGluZS5yZW1vdmUoKTtmb3IodmFyIHk9MDt5PHRoaXMuX251bVRpZXJzOysreSl7dmFyIHc9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChBLlRJTUVfQVhJU19USUVSX0NMQVNTLCEwKTt0aGlzLl90aWVyTGFiZWxDb250YWluZXJzLnB1c2gody5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX0xBQkVMX0NMQVNTKyItY29udGFpbmVyIiwhMCkpO3RoaXMuX3RpZXJNYXJrQ29udGFpbmVycy5wdXNoKHcuYXBwZW5kKCJnIikuY2xhc3NlZChxLkF4aXMuVElDS19NQVJLX0NMQVNTKyItY29udGFpbmVyIiwhMCkpO3RoaXMuX3RpZXJCYXNlbGluZXMucHVzaCh3LmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCkpfXk9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl90aWVyTGFiZWxDb250YWluZXJzWzBdLm5vZGUoKSk7CnRoaXMuX21lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIoeSl9O0EucHJvdG90eXBlLl9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXM9ZnVuY3Rpb24oeSl7cmV0dXJuIHRoaXMuX3NjYWxlLnRpY2tJbnRlcnZhbCh5LmludGVydmFsLHkuc3RlcCl9O0EucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHk9dGhpcztyZXR1cm4gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdLnJlZHVjZShmdW5jdGlvbih3LEMpe3JldHVybiB3LmNvbmNhdCh5Ll9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXMoQykpfSxbXSl9O0EucHJvdG90eXBlLl9jbGVhblRpZXJzPWZ1bmN0aW9uKCl7Zm9yKHZhciB5PTA7eTx0aGlzLl90aWVyTGFiZWxDb250YWluZXJzLmxlbmd0aDt5KyspdGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbeV0uc2VsZWN0QWxsKCIuIisKcS5BeGlzLlRJQ0tfTUFSS19DTEFTUykucmVtb3ZlKCksdGhpcy5fdGllckJhc2VsaW5lc1t5XS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfTtBLnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb249ZnVuY3Rpb24oeSl7eT10aGlzLl9zY2FsZS50aWNrSW50ZXJ2YWwoeS5pbnRlcnZhbCx5LnN0ZXApO3ZhciB3PXRoaXMuX3NjYWxlLmRvbWFpbigpLEM9eS5tYXAoZnVuY3Rpb24oRyl7cmV0dXJuIEcudmFsdWVPZigpfSk7LTE9PT1DLmluZGV4T2Yod1swXS52YWx1ZU9mKCkpJiZ5LnVuc2hpZnQod1swXSk7LTE9PT1DLmluZGV4T2Yod1sxXS52YWx1ZU9mKCkpJiZ5LnB1c2god1sxXSk7cmV0dXJuIHl9O0EucHJvdG90eXBlLl9yZW5kZXJUaWVyTGFiZWxzPWZ1bmN0aW9uKHksdyxDKXt2YXIgRz10aGlzLEQ9dGhpcy5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb24odyksQj1bXTsiYmV0d2VlbiI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ10mJgoxPT09dy5zdGVwP0QubWFwKGZ1bmN0aW9uKEssTSl7TSsxPj1ELmxlbmd0aHx8Qi5wdXNoKG5ldyBEYXRlKChEW00rMV0udmFsdWVPZigpLURbTV0udmFsdWVPZigpKS8yK0RbTV0udmFsdWVPZigpKSl9KTpCPUQ7eT15LnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEoQixmdW5jdGlvbihLKXtyZXR1cm4gU3RyaW5nKEsudmFsdWVPZigpKX0pO3ZhciBJPXkuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX0xBQkVMX0NMQVNTLCEwKTtJLmFwcGVuZCgidGV4dCIpO3ZhciBOPSJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdfHwxPT09dy5zdGVwPzA6dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7dmFyIE89ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/dC5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxDKzEpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKToiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXT8KdGhpcy5oZWlnaHQoKS10LnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLEMpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKS10aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKTp0aGlzLmhlaWdodCgpLXQuc3VtKHRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsQykpLXRoaXMudGlja0xhYmVsUGFkZGluZygpO0k9eS5tZXJnZShJKTt2YXIgSD1JLnNlbGVjdEFsbCgidGV4dCIpOzA8SC5zaXplKCkmJkguYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTisiLCIrTysiKSIpO3kuZXhpdCgpLnJlbW92ZSgpO0kuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihLKXtyZXR1cm4idHJhbnNsYXRlKCIrRy5fc2NhbGUuc2NhbGUoSykrIiwwKSJ9KTtDPSJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdfHwxPT09dy5zdGVwPyJtaWRkbGUiOiJzdGFydCI7SS5zZWxlY3RBbGwoInRleHQiKS50ZXh0KHcuZm9ybWF0dGVyKS5zdHlsZSgidGV4dC1hbmNob3IiLEMpfTtBLnByb3RvdHlwZS5fcmVuZGVyVGlja01hcmtzPQpmdW5jdGlvbih5LHcpe3k9dGhpcy5fdGllck1hcmtDb250YWluZXJzW3ddLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh5KTt2YXIgQz15LmVudGVyKCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChxLkF4aXMuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZSh5KSxHPXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpLEQ9dGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCx3KS5yZWR1Y2UoZnVuY3Rpb24oQixJKXtyZXR1cm4gQitJfSwwKTsiYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT8oRy55MT1ELEcueTI9RCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbd10/dGhpcy5pbm5lclRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1t3XSkpOihHLnkxPXRoaXMuaGVpZ2h0KCktRCxHLnkyPXRoaXMuaGVpZ2h0KCktKEQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3ddP3RoaXMuaW5uZXJUaWNrTGVuZ3RoKCk6CnRoaXMuX3RpZXJIZWlnaHRzW3ddKSkpO0MuYXR0cnMoRyk7ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/KEcueTE9RCxHLnkyPUQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3ddP3RoaXMuZW5kVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW3ddKSk6KEcueTE9dGhpcy5oZWlnaHQoKS1ELEcueTI9dGhpcy5oZWlnaHQoKS0oRCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbd10/dGhpcy5lbmRUaWNrTGVuZ3RoKCk6dGhpcy5fdGllckhlaWdodHNbd10pKSk7dC5zZWxlY3QoQy5ub2RlcygpWzBdKS5hdHRycyhHKTt0LnNlbGVjdChDLm5vZGVzKClbQy5zaXplKCktMV0pLmF0dHJzKEcpO3Quc2VsZWN0KEMubm9kZXMoKVswXSkuY2xhc3NlZChxLkF4aXMuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCk7dC5zZWxlY3QoQy5ub2RlcygpW0Muc2l6ZSgpLTFdKS5jbGFzc2VkKHEuQXhpcy5FTkRfVElDS19NQVJLX0NMQVNTLCEwKTt5LmV4aXQoKS5yZW1vdmUoKX07CkEucHJvdG90eXBlLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3M9ZnVuY3Rpb24oeSl7eT10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX01BUktfQ0xBU1MpLmRhdGEoeSk7dmFyIHc9eS5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTUFSS19DTEFTUywhMCkubWVyZ2UoeSksQz10aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKTtDLnkyPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMudGlja0xhYmVsUGFkZGluZygpOnRoaXMuaGVpZ2h0KCktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7dy5hdHRycyhDKTt5LmV4aXQoKS5yZW1vdmUoKX07QS5wcm90b3R5cGUuX2dlbmVyYXRlTGFiZWxsZXNzVGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gMT50aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4P1tdOnRoaXMuX2dldFRpY2tJbnRlcnZhbFZhbHVlcyh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleC0KMV1bMF0pfTtBLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB5PXRoaXM7dGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleD10aGlzLl9nZXRNb3N0UHJlY2lzZUNvbmZpZ3VyYXRpb25JbmRleCgpO3ZhciB3PXRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XTt0aGlzLl9jbGVhblRpZXJzKCk7dy5mb3JFYWNoKGZ1bmN0aW9uKEksTil7cmV0dXJuIHkuX3JlbmRlclRpZXJMYWJlbHMoeS5fdGllckxhYmVsQ29udGFpbmVyc1tOXSxJLE4pfSk7Zm9yKHZhciBDPXcubWFwKGZ1bmN0aW9uKEkpe3JldHVybiB5Ll9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbihJKX0pLEc9MCxEPTA7RDxNYXRoLm1heCh3Lmxlbmd0aCwxKTsrK0Qpe3ZhciBCPXRoaXMuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaCgpO0IueTErPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP0c6LUc7Qi55Mj1CLnkxOwp0aGlzLl90aWVyQmFzZWxpbmVzW0RdLmF0dHJzKEIpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpO0crPXRoaXMuX3RpZXJIZWlnaHRzW0RdfUc9W107RD10aGlzLl9zY2FsZS5kb21haW4oKTtEPXRoaXMuX3NjYWxlLnNjYWxlKERbMV0pLXRoaXMuX3NjYWxlLnNjYWxlKERbMF0pOzEuNSp0aGlzLl9nZXRJbnRlcnZhbExlbmd0aCh3WzBdKT49RCYmKEc9dGhpcy5fZ2VuZXJhdGVMYWJlbGxlc3NUaWNrcygpKTt0aGlzLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3MoRyk7dGhpcy5faGlkZU92ZXJmbG93aW5nVGllcnMoKTtmb3IoRD0wO0Q8dy5sZW5ndGg7KytEKXRoaXMuX3JlbmRlclRpY2tNYXJrcyhDW0RdLEQpLHRoaXMuX2hpZGVPdmVybGFwcGluZ0FuZEN1dE9mZkxhYmVscyhEKTt0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpP3RoaXMuX2RyYXdBbm5vdGF0aW9ucygpOnRoaXMuX3JlbW92ZUFubm90YXRpb25zKCk7cmV0dXJuIHRoaXN9O0EucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWVycz0KZnVuY3Rpb24oKXt2YXIgeT10aGlzLHc9dGhpcy5oZWlnaHQoKSxDPTA7dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIitBLlRJTUVfQVhJU19USUVSX0NMQVNTKS5hdHRyKCJ2aXNpYmlsaXR5IixmdW5jdGlvbihHLEQpe0MrPXkuX3RpZXJIZWlnaHRzW0RdO3JldHVybiBDPD13PyJpbmhlcml0IjoiaGlkZGVuIn0pfTtBLnByb3RvdHlwZS5faGlkZU92ZXJsYXBwaW5nQW5kQ3V0T2ZmTGFiZWxzPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHcoSSl7cmV0dXJuIE1hdGguZmxvb3IoRy5sZWZ0KTw9TWF0aC5jZWlsKEkubGVmdCkmJk1hdGguZmxvb3IoRy50b3ApPD1NYXRoLmNlaWwoSS50b3ApJiZNYXRoLmZsb29yKEkucmlnaHQpPD1NYXRoLmNlaWwoRy5sZWZ0K0Mud2lkdGgoKSkmJk1hdGguZmxvb3IoSS5ib3R0b20pPD1NYXRoLmNlaWwoRy50b3ArQy5oZWlnaHQoKSl9dmFyIEM9dGhpcyxHPXRoaXMuZWxlbWVudCgpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxEPXRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iKwpxLkF4aXMuVElDS19NQVJLX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgST10LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpO3JldHVybiJ2aXNpYmxlIj09PUl8fCJpbmhlcml0Ij09PUl9KS5ub2RlcygpLm1hcChmdW5jdGlvbihJKXtyZXR1cm4gSS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pLEI7dGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgST10LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpO3JldHVybiJ2aXNpYmxlIj09PUl8fCJpbmhlcml0Ij09PUl9KS5lYWNoKGZ1bmN0aW9uKEksTil7ST10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBPPXQuc2VsZWN0KHRoaXMpLEg9RFtOXSxLPURbTisxXTtOPW51bGwhPUImJm4uRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChJLEIpO0g9bnVsbCE9SCYmbi5ET00uY2xpZW50UmVjdHNPdmVybGFwKEksCkgpO0s9bnVsbCE9SyYmbi5ET00uY2xpZW50UmVjdHNPdmVybGFwKEksSyk7IXcoSSl8fE58fEh8fEs/Ty5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpOihCPUksTy5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKSl9KX07QS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7eC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIEF9KHEuQXhpcyk7aC5USU1FX0FYSVNfVElFUl9DTEFTUz0idGltZS1heGlzLXRpZXIiO2guX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYPSh1PXt9LHVbZi5UaW1lSW50ZXJ2YWwuc2Vjb25kXT0wLHVbZi5UaW1lSW50ZXJ2YWwubWludXRlXT0xLHVbZi5UaW1lSW50ZXJ2YWwuaG91cl09Mix1W2YuVGltZUludGVydmFsLmRheV09Myx1W2YuVGltZUludGVydmFsLndlZWtdPTQsdVtmLlRpbWVJbnRlcnZhbC5tb250aF09NSx1W2YuVGltZUludGVydmFsLnllYXJdPQo2LHUpO2guX0RFRkFVTFRfVElNRV9BWElTX0NPTkZJR1VSQVRJT05TPVtbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjUsZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjEwLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxNSwKZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjMwLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDo1LGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sClt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MTAsZm9ybWF0dGVyOnAudGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjE1LGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDozMCxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUkgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSwKc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6Myxmb3JtYXR0ZXI6cC50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjYsZm9ybWF0dGVyOnAudGltZSgiJUkgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLmhvdXIsc3RlcDoxMixmb3JtYXR0ZXI6cC50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlYSAlZSIpfSwKe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVlIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJWIiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6Myxmb3JtYXR0ZXI6cC50aW1lKCIlYiIpfSwKe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6Nixmb3JtYXR0ZXI6cC50aW1lKCIlYiIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJXkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjUsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjI1LGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDo1MCxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sClt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEwMCxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MjAwLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDo1MDAsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjFFMyxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV1dO2guX0xPTkdfREFURT1uZXcgRGF0ZSg5OTk5LDgsMjksMTIsNTksOTk5OSk7Zi5UaW1lPWg7dmFyIHV9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPQpwLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgxMik7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKCl7dmFyIG09bC5jYWxsKHRoaXMpfHx0aGlzO20uX2RldGFjaENhbGxiYWNrPWZ1bmN0aW9uKG4pe3JldHVybiBtLnJlbW92ZShuKX07cmV0dXJuIG19ayhwLGwpO3AucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihtKXt2YXIgbj10aGlzO209dC5jb2VyY2VFeHRlcm5hbEQzKG0pO2wucHJvdG90eXBlLmFuY2hvci5jYWxsKHRoaXMsbSk7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gcS5hbmNob3Iobi5lbGVtZW50KCkpfSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RoaXMuX2ZvckVhY2goZnVuY3Rpb24obSl7cmV0dXJuIG0ucmVuZGVyKCl9KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoImhhcygpIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBDb21wb25lbnRDb250YWluZXIiKTt9O3AucHJvdG90eXBlLl9hZG9wdEFuZEFuY2hvcj0KZnVuY3Rpb24obSl7bS5wYXJlbnQodGhpcyk7bS5vbkRldGFjaCh0aGlzLl9kZXRhY2hDYWxsYmFjayk7dGhpcy5faXNBbmNob3JlZCYmbS5hbmNob3IodGhpcy5lbGVtZW50KCkpfTtwLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24obSl7dGhpcy5oYXMobSkmJihtLm9mZkRldGFjaCh0aGlzLl9kZXRhY2hDYWxsYmFjayksdGhpcy5fcmVtb3ZlKG0pLG0uZGV0YWNoKCksdGhpcy5yZWRyYXcoKSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24oKXt9O3AucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIl9mb3JFYWNoKCkgaXMgbm90IGltcGxlbWVudGVkIG9uIENvbXBvbmVudENvbnRhaW5lciIpO307cC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2wucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKG0pe3JldHVybiBtLmRlc3Ryb3koKX0pfTtwLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9CmZ1bmN0aW9uKCl7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihtKXtyZXR1cm4gbS5pbnZhbGlkYXRlQ2FjaGUoKX0pfTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuQ29tcG9uZW50Q29udGFpbmVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKEEpe24uYWRkKEEpO20uYWRkKEEpO3QoKX1mdW5jdGlvbiB0KCl7cXx8KHE9ITAseC5yZW5kZXIoKSl9dmFyIGw9aCgwKTtkPWgoMTApO3ZhciBwPWgoMzkpLG09bmV3IGwuU2V0LG49bmV3IGwuU2V0LHE9ITEsdT0hMTtmLlBvbGljeT1kLm1ha2VFbnVtKFsiaW1tZWRpYXRlIiwiYW5pbWF0aW9uRnJhbWUiLCJ0aW1lb3V0Il0pO3ZhciB4PW5ldyBwLkFuaW1hdGlvbkZyYW1lO2YucmVuZGVyUG9saWN5PWZ1bmN0aW9uKEEpe2lmKG51bGw9PUEpcmV0dXJuIHg7c3dpdGNoKEEpe2Nhc2UgZi5Qb2xpY3kuaW1tZWRpYXRlOng9bmV3IHAuSW1tZWRpYXRlO2JyZWFrO2Nhc2UgZi5Qb2xpY3kuYW5pbWF0aW9uRnJhbWU6eD1uZXcgcC5BbmltYXRpb25GcmFtZTsKYnJlYWs7Y2FzZSBmLlBvbGljeS50aW1lb3V0Ong9bmV3IHAuVGltZW91dDticmVhaztkZWZhdWx0OmwuV2luZG93Lndhcm4oIlVucmVjb2duaXplZCByZW5kZXJQb2xpY3k6ICIrQSl9fTtmLnJlZ2lzdGVyVG9SZW5kZXI9ZnVuY3Rpb24oQSl7dSYmbC5XaW5kb3cud2FybigiUmVnaXN0ZXJlZCB0byByZW5kZXIgd2hpbGUgb3RoZXIgY29tcG9uZW50cyBhcmUgZmx1c2hpbmc6IHJlcXVlc3QgbWF5IGJlIGlnbm9yZWQiKTttLmFkZChBKTt0KCl9O2YucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXI9aztmLnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0PWZ1bmN0aW9uKEEpe2soQSl9O2YuZmx1c2g9ZnVuY3Rpb24oKXtpZihxKXtuLmZvckVhY2goZnVuY3Rpb24oeSl7cmV0dXJuIHkuY29tcHV0ZUxheW91dCgpfSk7bS5mb3JFYWNoKGZ1bmN0aW9uKHkpe3JldHVybiB5LnJlbmRlcigpfSk7dT0hMDt2YXIgQT1uZXcgbC5TZXQ7bS5mb3JFYWNoKGZ1bmN0aW9uKHkpe3RyeXt5LnJlbmRlckltbWVkaWF0ZWx5KCl9Y2F0Y2godyl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB3Owp9LDApLEEuYWRkKHkpfX0pO249bmV3IGwuU2V0O209QTt1PXE9ITF9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMSk7Zi5jaXJjbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbENpcmNsZSkuc2l6ZShNYXRoLlBJKk1hdGgucG93KGwvMiwyKSl9fTtmLnNxdWFyZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sU3F1YXJlKS5zaXplKE1hdGgucG93KGwsMikpfX07Zi5jcm9zcz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sQ3Jvc3MpLnNpemUoNS85Kk1hdGgucG93KGwsMikpfX07Zi5kaWFtb25kPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xEaWFtb25kKS5zaXplKE1hdGgudGFuKE1hdGguUEkvNikqTWF0aC5wb3cobCwyKS8KMil9fTtmLnRyaWFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xUcmlhbmdsZSkuc2l6ZShNYXRoLnNxcnQoMykqTWF0aC5wb3cobC8yLDIpKX19O2Yuc3Rhcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sU3Rhcikuc2l6ZSguODkwODEzMDkxNTI5Mjg1MipNYXRoLnBvdyhsLzIsMikpfX07dmFyIHQ9MyooMS9NYXRoLnNxcnQoMTIpLzIrMSk7Zi53eWU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbFd5ZSkuc2l6ZSh0Kk1hdGgucG93KGwvMi40LDIpKX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHggaW4gcSlxLmhhc093blByb3BlcnR5KHgpJiYoblt4XT0KcVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMjUpLGw9aCgwKSxwPWgoMTIpLG09aCgzNyk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKCl7dmFyIHU9bi5jYWxsKHRoaXMpfHx0aGlzO3UuX2RldGVjdGlvblJhZGl1cz0zO3UuX3Jlc2l6YWJsZT0hMTt1Ll9tb3ZhYmxlPSExO3UuX2hhc0Nvcm5lcnM9ITA7dS5hZGRDbGFzcygiZHJhZy1ib3gtbGF5ZXIiKTt1Ll9kcmFnSW50ZXJhY3Rpb249bmV3IHQuRHJhZzt1Ll9zZXRVcENhbGxiYWNrcygpO3UuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh1KTt1Ll9kcmFnU3RhcnRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dS5fZHJhZ0NhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDt1Ll9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3JldHVybiB1fWsocSxuKTtxLnByb3RvdHlwZS5fc2V0VXBDYWxsYmFja3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB1KEksCk4pezA9PT1CJiZJLng9PT1OLngmJkkueT09PU4ueSYmeS5ib3hWaXNpYmxlKCExKTt5Ll9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeS5ib3VuZHMoKSl9ZnVuY3Rpb24geChJLE4pe3N3aXRjaChCKXtjYXNlIDA6Ry54PU4ueDtHLnk9Ti55O2JyZWFrO2Nhc2UgMTp3LmJvdHRvbT9HLnk9Ti55OncudG9wJiYoQy55PU4ueSk7dy5yaWdodD9HLng9Ti54OncubGVmdCYmKEMueD1OLngpO2JyZWFrO2Nhc2UgMjpJPU4ueC1ELng7dmFyIE89Ti55LUQueTtDLngrPUk7Qy55Kz1PO0cueCs9STtHLnkrPU87RD1OfXkuX3NldEJvdW5kcyh7dG9wTGVmdDpDLGJvdHRvbVJpZ2h0Okd9KTt5Ll94Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnhTY2FsZSgpJiZ5Ll9zZXRYRXh0ZW50KFt5LnhTY2FsZSgpLmludmVydChDLngpLHkueFNjYWxlKCkuaW52ZXJ0KEcueCldKTt5Ll95Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnlTY2FsZSgpJiYKeS5fc2V0WUV4dGVudChbeS55U2NhbGUoKS5pbnZlcnQoQy55KSx5LnlTY2FsZSgpLmludmVydChHLnkpXSk7eS5yZW5kZXIoKTt5Ll9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeS5ib3VuZHMoKSl9ZnVuY3Rpb24gQShJKXt3PXkuX2dldFJlc2l6aW5nRWRnZXMoSSk7dmFyIE49eS5ib3VuZHMoKTtOPU4udG9wTGVmdC54PD1JLngmJkkueDw9Ti5ib3R0b21SaWdodC54JiZOLnRvcExlZnQueTw9SS55JiZJLnk8PU4uYm90dG9tUmlnaHQueTt5LmJveFZpc2libGUoKSYmKHcudG9wfHx3LmJvdHRvbXx8dy5sZWZ0fHx3LnJpZ2h0KT9CPTE6eS5ib3hWaXNpYmxlKCkmJnkubW92YWJsZSgpJiZOP0I9MjooQj0wLHkuX3NldEJvdW5kcyh7dG9wTGVmdDpJLGJvdHRvbVJpZ2h0Okl9KSx5Ll94Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnhTY2FsZSgpJiZ5Ll9zZXRYRXh0ZW50KFt5LnhTY2FsZSgpLmludmVydChJLngpLHkueFNjYWxlKCkuaW52ZXJ0KEkueCldKSwKeS5feUJvdW5kc01vZGU9PT1tLlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9eS55U2NhbGUoKSYmeS5fc2V0WUV4dGVudChbeS55U2NhbGUoKS5pbnZlcnQoSS55KSx5LnlTY2FsZSgpLmludmVydChJLnkpXSkseS5yZW5kZXIoKSk7eS5ib3hWaXNpYmxlKCEwKTtOPXkuYm91bmRzKCk7Qz17eDpOLnRvcExlZnQueCx5Ok4udG9wTGVmdC55fTtHPXt4Ok4uYm90dG9tUmlnaHQueCx5Ok4uYm90dG9tUmlnaHQueX07RD1JO3kuX2RyYWdTdGFydENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKE4pfXZhciB5PXRoaXMsdyxDLEcsRCxCPTA7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KEEpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcoeCk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZCh1KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KEEpO3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHgpOwp5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ0VuZCh1KTt5Ll9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCl9fTtxLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB1KCl7cmV0dXJuIHguX2JveC5hcHBlbmQoImxpbmUiKS5zdHlsZXMoe29wYWNpdHk6MCxzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSl9dmFyIHg9dGhpcztuLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlVD11KCkuY2xhc3NlZCgiZHJhZy1lZGdlLXRiIiwhMCk7dGhpcy5fZGV0ZWN0aW9uRWRnZUI9dSgpLmNsYXNzZWQoImRyYWctZWRnZS10YiIsITApO3RoaXMuX2RldGVjdGlvbkVkZ2VMPXUoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtbHIiLCEwKTt0aGlzLl9kZXRlY3Rpb25FZGdlUj11KCkuY2xhc3NlZCgiZHJhZy1lZGdlLWxyIiwhMCk7aWYodGhpcy5faGFzQ29ybmVycyl7dmFyIEE9ZnVuY3Rpb24oKXtyZXR1cm4geC5fYm94LmFwcGVuZCgiY2lyY2xlIikuc3R5bGVzKHtvcGFjaXR5OjAsCmZpbGw6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVGaWxsIn0pfTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUTD1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdGwiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUj1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdHIiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJCTD1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYmwiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJCUj1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYnIiLCEwKX19O3EucHJvdG90eXBlLl9nZXRSZXNpemluZ0VkZ2VzPWZ1bmN0aW9uKHUpe3ZhciB4PXt0b3A6ITEsYm90dG9tOiExLGxlZnQ6ITEscmlnaHQ6ITF9O2lmKCF0aGlzLnJlc2l6YWJsZSgpKXJldHVybiB4O3ZhciBBPXRoaXMuYm91bmRzKCkseT1BLnRvcExlZnQueSx3PUEuYm90dG9tUmlnaHQueSxDPUEudG9wTGVmdC54O0E9QS5ib3R0b21SaWdodC54O3ZhciBHPXRoaXMuX2RldGVjdGlvblJhZGl1czsKQy1HPD11LngmJnUueDw9QStHJiYoeC50b3A9eS1HPD11LnkmJnUueTw9eStHLHguYm90dG9tPXctRzw9dS55JiZ1Lnk8PXcrRyk7eS1HPD11LnkmJnUueTw9dytHJiYoeC5sZWZ0PUMtRzw9dS54JiZ1Lng8PUMrRyx4LnJpZ2h0PUEtRzw9dS54JiZ1Lng8PUErRyk7cmV0dXJuIHh9O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTtpZih0aGlzLmJveFZpc2libGUoKSl7dmFyIHU9dGhpcy5ib3VuZHMoKSx4PXUudG9wTGVmdC55LEE9dS5ib3R0b21SaWdodC55LHk9dS50b3BMZWZ0Lng7dT11LmJvdHRvbVJpZ2h0Lng7dGhpcy5fZGV0ZWN0aW9uRWRnZVQuYXR0cnMoe3gxOnkseTE6eCx4Mjp1LHkyOngsInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9kZXRlY3Rpb25FZGdlQi5hdHRycyh7eDE6eSx5MTpBLHgyOnUseTI6QSwic3Ryb2tlLXdpZHRoIjoyKgp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9kZXRlY3Rpb25FZGdlTC5hdHRycyh7eDE6eSx5MTp4LHgyOnkseTI6QSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3RoaXMuX2RldGVjdGlvbkVkZ2VSLmF0dHJzKHt4MTp1LHkxOngseDI6dSx5MjpBLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7dGhpcy5faGFzQ29ybmVycyYmKHRoaXMuX2RldGVjdGlvbkNvcm5lclRMLmF0dHJzKHtjeDp5LGN5Ongscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUi5hdHRycyh7Y3g6dSxjeTp4LHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uQ29ybmVyQkwuYXR0cnMoe2N4OnksY3k6QSxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lckJSLmF0dHJzKHtjeDp1LGN5OkEscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSl9cmV0dXJuIHRoaXN9OwpxLnByb3RvdHlwZS5kZXRlY3Rpb25SYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfTtxLnByb3RvdHlwZS5yZXNpemFibGU9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fcmVzaXphYmxlO3RoaXMuX3Jlc2l6YWJsZT11O3RoaXMuX3NldFJlc2l6YWJsZUNsYXNzZXModSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLl9zZXRSZXNpemFibGVDbGFzc2VzPWZ1bmN0aW9uKHUpe3UmJnRoaXMuZW5hYmxlZCgpPyh0aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpLHRoaXMuYWRkQ2xhc3MoInktcmVzaXphYmxlIikpOih0aGlzLnJlbW92ZUNsYXNzKCJ4LXJlc2l6YWJsZSIpLHRoaXMucmVtb3ZlQ2xhc3MoInktcmVzaXphYmxlIikpfTtxLnByb3RvdHlwZS5tb3ZhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vdmFibGV9O3EucHJvdG90eXBlLl9zZXRNb3ZhYmxlQ2xhc3M9ZnVuY3Rpb24oKXt0aGlzLm1vdmFibGUoKSYmdGhpcy5lbmFibGVkKCk/CnRoaXMuYWRkQ2xhc3MoIm1vdmFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJtb3ZhYmxlIil9O3EucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHUpe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5hZGQodSl9O3EucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHUpfTtxLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQodSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodSl9O3EucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZCh1KX07cS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh1KX07cS5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn07CnEucHJvdG90eXBlLmVuYWJsZWQ9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCh1KTt0aGlzLl9zZXRSZXNpemFibGVDbGFzc2VzKHRoaXMucmVzaXphYmxlKCkpO3RoaXMuX3NldE1vdmFibGVDbGFzcygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcztuLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24oeCl7cmV0dXJuIHUuX2RyYWdDYWxsYmFja3MuZGVsZXRlKHgpfSk7dGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHgpe3JldHVybiB1Ll9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh4KX0pO3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbih4KXtyZXR1cm4gdS5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUoeCl9KTsKdGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCl9O3EucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuX3Jlc2V0U3RhdGUoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCk7bi5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbih1KXt1PXAuY29lcmNlRXh0ZXJuYWxEMyh1KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyk7bi5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcyx1KTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX3Jlc2V0U3RhdGU9ZnVuY3Rpb24oKXt0aGlzLmJvdW5kcyh7dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fSl9O3JldHVybiBxfShoKDQzKS5TZWxlY3Rpb25Cb3hMYXllcik7Zi5EcmFnQm94TGF5ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPQpwfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDE4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXtyZXR1cm4gcC5jYWxsKHRoaXMsInBhdGgiLCJsaW5lIil8fHRoaXN9ayhtLHApO20ucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKG4pe24uc3R5bGUoImZpbGwiLCJub25lIil9O20ucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsMCl9O3JldHVybiBtfShoKDkpLlNWR0RyYXdlcik7Zi5MaW5lU1ZHRHJhd2VyPWQ7dmFyIGw9WyJvcGFjaXR5Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2Utd2lkdGgiLCJzdHJva2UiXTtmLm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXA9CmZ1bmN0aW9uKHApe3JldHVybiBmdW5jdGlvbihtLG4scSl7cT10LnJlc29sdmVBdHRyaWJ1dGVzKHEsbCxuWzBdLDApO3QucmVuZGVyTGluZShtLHAoKSxuWzBdLHEpfX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDE4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7dm9pZCAwPT09biYmKG49IiIpO3ZhciBxPXAuY2FsbCh0aGlzLCJyZWN0IiwiIil8fHRoaXM7cS5fcm9vdENsYXNzTmFtZT1uO3EuX3Jvb3QuY2xhc3NlZChxLl9yb290Q2xhc3NOYW1lLCEwKTtyZXR1cm4gcX1rKG0scCk7cmV0dXJuIG19KGgoOSkuU1ZHRHJhd2VyKTtmLlJlY3RhbmdsZVNWR0RyYXdlcj0KZDt2YXIgbD1bIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiXTtmLlJlY3RhbmdsZUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKHAsbSxuKXtwLnNhdmUoKTttLmZvckVhY2goZnVuY3Rpb24ocSx1KXtudWxsIT1xJiYocT10LnJlc29sdmVBdHRyaWJ1dGVzU3Vic2V0V2l0aFN0eWxlcyhuLGwscSx1KSxwLmJlZ2luUGF0aCgpLHAucmVjdChxLngscS55LHEud2lkdGgscS5oZWlnaHQpLHQucmVuZGVyUGF0aFdpdGhTdHlsZShwLHEpKX0pO3AucmVzdG9yZSgpfTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7cmV0dXJuIHAuY2FsbCh0aGlzLG4sZi5SZWN0YW5nbGVDYW52YXNEcmF3U3RlcCl8fHRoaXN9ayhtLHApO3JldHVybiBtfSh0LkNhbnZhc0RyYXdlcik7Zi5SZWN0YW5nbGVDYW52YXNEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocCl7bC5TSE9XX1dBUk5JTkdTJiZjb25zb2xlLndhcm4ocCl9ZnVuY3Rpb24gdChwLG0pe2Zvcih2YXIgbj1bXSxxPTI7cTxhcmd1bWVudHMubGVuZ3RoO3ErKyluW3EtCjJdPWFyZ3VtZW50c1txXTtyZXR1cm4gMD09PW0/KHAobiksLTEpOndpbmRvdy5zZXRUaW1lb3V0KHAsbSxuKX12YXIgbD1oKDIzKTtmLndhcm49aztmLnNldFRpbWVvdXQ9dDtmLmRlYm91bmNlPWZ1bmN0aW9uKHAsbSxuKXtmdW5jdGlvbiBxKCl7bS5hcHBseShuLHgpfXZhciB1PW51bGwseD1bXTtyZXR1cm4gZnVuY3Rpb24oKXt4PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7Y2xlYXJUaW1lb3V0KHUpO3U9dChxLHApfX07Zi5kZXByZWNhdGVkPWZ1bmN0aW9uKHAsbSxuKXt2b2lkIDA9PT1uJiYobj0iIik7aygiTWV0aG9kICIrcCsiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAiK20rIi4gUGxlYXNlIHJlZmVyIHRvIHRoZSByZWxlYXNlIG5vdGVzLiAiK24pfX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrKXt0aGlzLnJ1bGVyPW51bGwhPWsuY3JlYXRlUnVsZXI/ay5jcmVhdGVSdWxlcigpOmt9aC5wcm90b3R5cGUubWVhc3VyZT0KZnVuY3Rpb24oayl7dm9pZCAwPT09ayYmKGs9aC5IRUlHSFRfVEVYVCk7cmV0dXJuIHRoaXMucnVsZXIoayl9O3JldHVybiBofSgpO2QuSEVJR0hUX1RFWFQ9ImJkcHFsIjtmLkFic3RyYWN0TWVhc3VyZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDMyKSk7ayhoKDc0KSk7ayhoKDc1KSk7ayhoKDQxKSk7ayhoKDQyKSk7ayhoKDc2KSk7ayhoKDc3KSk7ayhoKDc4KSk7ayhoKDc5KSk7ayhoKDQzKSk7ayhoKDgwKSk7ayhoKDgxKSk7ayhoKDgyKSl9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGwscCl7dm9pZCAwPT09bCYmKGw9W10pO3ZvaWQgMD09PXAmJihwPXt9KTt0aGlzLl91cGRhdGVJZD0wO3RoaXMuX2RhdGE9bDt0aGlzLl9tZXRhZGF0YT1wO3RoaXMuX2NhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldH10LnByb3RvdHlwZS5vblVwZGF0ZT0KZnVuY3Rpb24obCl7dGhpcy5fY2FsbGJhY2tzLmFkZChsKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUub2ZmVXBkYXRlPWZ1bmN0aW9uKGwpe3RoaXMuX2NhbGxiYWNrcy5kZWxldGUobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmRhdGE9ZnVuY3Rpb24obCl7aWYobnVsbD09bClyZXR1cm4gdGhpcy5fZGF0YTt0aGlzLl9kYXRhPWw7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUubWV0YWRhdGE9ZnVuY3Rpb24obCl7aWYobnVsbD09bClyZXR1cm4gdGhpcy5fbWV0YWRhdGE7dGhpcy5fbWV0YWRhdGE9bDt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH07dC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQrKzt0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX07cmV0dXJuIHR9KCk7CmYuRGF0YXNldD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgwKSx0PWgoMzApO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7fWwucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QuZmx1c2goKX07cmV0dXJuIGx9KCk7Zi5JbW1lZGlhdGU9ZDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe31sLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtrLkRPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCh0LmZsdXNoKX07cmV0dXJuIGx9KCk7Zi5BbmltYXRpb25GcmFtZT1kO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7dGhpcy5fdGltZW91dE1zZWM9ay5ET00uU0NSRUVOX1JFRlJFU0hfUkFURV9NSUxMSVNFQ09ORFN9bC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7c2V0VGltZW91dCh0LmZsdXNoLHRoaXMuX3RpbWVvdXRNc2VjKX07cmV0dXJuIGx9KCk7Zi5UaW1lb3V0PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCwKbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxMyksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPW51bGwhPT1wJiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztuLl9rZXlQcmVzc0NhbGxiYWNrcz17fTtuLl9rZXlSZWxlYXNlQ2FsbGJhY2tzPXt9O24uX21vdXNlTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuITF9O24uX2Rvd25lZEtleXM9bmV3IGwuU2V0O24uX2tleURvd25DYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVLZXlEb3duRXZlbnQocSx1KX07bi5fa2V5VXBDYWxsYmFjaz1mdW5jdGlvbihxKXtyZXR1cm4gbi5faGFuZGxlS2V5VXBFdmVudChxKX07cmV0dXJuIG59ayhtLHApOwptLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKG4pe3AucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLG4pO3RoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlcj10Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl9rZXlEaXNwYXRjaGVyPXQuS2V5LmdldERpc3BhdGNoZXIoKTt0aGlzLl9rZXlEaXNwYXRjaGVyLm9uS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXIub25LZXlVcCh0aGlzLl9rZXlVcENhbGxiYWNrKX07bS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyPW51bGw7CnRoaXMuX2tleURpc3BhdGNoZXIub2ZmS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXIub2ZmS2V5VXAodGhpcy5fa2V5VXBDYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlcj1udWxsfTttLnByb3RvdHlwZS5faGFuZGxlS2V5RG93bkV2ZW50PWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZSh0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIubGFzdE1vdXNlUG9zaXRpb24oKSk7dGhpcy5faXNJbnNpZGVDb21wb25lbnQodSkmJiFxLnJlcGVhdCYmKHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dJiZ0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5jYWxsQ2FsbGJhY2tzKG4pLHRoaXMuX2Rvd25lZEtleXMuYWRkKG4pKX07bS5wcm90b3R5cGUuX2hhbmRsZUtleVVwRXZlbnQ9ZnVuY3Rpb24obil7dGhpcy5fZG93bmVkS2V5cy5oYXMobikmJnRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0mJnRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0uY2FsbENhbGxiYWNrcyhuKTsKdGhpcy5fZG93bmVkS2V5cy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uS2V5UHJlc3M9ZnVuY3Rpb24obixxKXt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXXx8KHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dPW5ldyBsLkNhbGxiYWNrU2V0KTt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5hZGQocSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9mZktleVByZXNzPWZ1bmN0aW9uKG4scSl7dGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl0uZGVsZXRlKHEpOzA9PT10aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5zaXplJiZkZWxldGUgdGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl07cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uS2V5UmVsZWFzZT1mdW5jdGlvbihuLHEpe3RoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl18fCh0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dPW5ldyBsLkNhbGxiYWNrU2V0KTt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dLmFkZChxKTtyZXR1cm4gdGhpc307Cm0ucHJvdG90eXBlLm9mZktleVJlbGVhc2U9ZnVuY3Rpb24obixxKXt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dLmRlbGV0ZShxKTswPT09dGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXS5zaXplJiZkZWxldGUgdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXTtyZXR1cm4gdGhpc307cmV0dXJuIG19KGgoMTUpLkludGVyYWN0aW9uKTtmLktleT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgwKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSl7dm9pZCAwPT09bSYmKG09W10pO3ZhciBuPWwuY2FsbCh0aGlzKXx8dGhpcztuLl9jb21wb25lbnRzPQpbXTtuLmFkZENsYXNzKCJjb21wb25lbnQtZ3JvdXAiKTttLmZvckVhY2goZnVuY3Rpb24ocSl7cmV0dXJuIG4uYXBwZW5kKHEpfSk7cmV0dXJuIG59ayhwLGwpO3AucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKG0pe3RoaXMuY29tcG9uZW50cygpLmZvckVhY2gobSl9O3AucHJvdG90eXBlLmhhcz1mdW5jdGlvbihtKXtyZXR1cm4gMDw9dGhpcy5fY29tcG9uZW50cy5pbmRleE9mKG0pfTtwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbihtLG4pe3ZhciBxPXRoaXMuX2NvbXBvbmVudHMubWFwKGZ1bmN0aW9uKHUpe3JldHVybiB1LnJlcXVlc3RlZFNwYWNlKG0sbil9KTtyZXR1cm57bWluV2lkdGg6dC5NYXRoLm1heChxLGZ1bmN0aW9uKHUpe3JldHVybiB1Lm1pbldpZHRofSwwKSxtaW5IZWlnaHQ6dC5NYXRoLm1heChxLGZ1bmN0aW9uKHUpe3JldHVybiB1Lm1pbkhlaWdodH0sMCl9fTtwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKG0sbixxKXt2YXIgdT0KdGhpcztsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxtLG4scSk7dGhpcy5fZm9yRWFjaChmdW5jdGlvbih4KXt4LmNvbXB1dGVMYXlvdXQoe3g6MCx5OjB9LHUud2lkdGgoKSx1LmhlaWdodCgpKX0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbihtLG4pe3JldHVybnt3aWR0aDptLGhlaWdodDpufX07cC5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uKG0pe3JldHVybiBtLmZpeGVkV2lkdGgoKX0pfTtwLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uKG0pe3JldHVybiBtLmZpeGVkSGVpZ2h0KCl9KX07cC5wcm90b3R5cGUuY29tcG9uZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLnNsaWNlKCl9O3AucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihtKXtudWxsPT0KbXx8dGhpcy5oYXMobSl8fChtLmRldGFjaCgpLHRoaXMuX2NvbXBvbmVudHMucHVzaChtKSx0aGlzLl9hZG9wdEFuZEFuY2hvcihtKSx0aGlzLnJlZHJhdygpKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbihtKXttPXRoaXMuX2NvbXBvbmVudHMuaW5kZXhPZihtKTswPD1tJiZ0aGlzLl9jb21wb25lbnRzLnNwbGljZShtLDEpfTtyZXR1cm4gcH0oaCgyOSkuQ29tcG9uZW50Q29udGFpbmVyKTtmLkdyb3VwPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX07aCgwKTtkPWgoNCk7dmFyIHQ7KGZ1bmN0aW9uKGwpe2xbbC5WQUxVRT0wXT0KIlZBTFVFIjtsW2wuUElYRUw9MV09IlBJWEVMIn0pKHR8fCh0PXt9KSk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0pe3ZhciBuPWwuY2FsbCh0aGlzKXx8dGhpcztuLl9tb2RlPXQuVkFMVUU7aWYobSE9PXAuT1JJRU5UQVRJT05fVkVSVElDQUwmJm0hPT1wLk9SSUVOVEFUSU9OX0hPUklaT05UQUwpdGhyb3cgRXJyb3IobSsiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBHdWlkZUxpbmVMYXllciIpO24uX29yaWVudGF0aW9uPW07bi5fb3ZlcmZsb3dIaWRkZW49ITA7bi5hZGRDbGFzcygiZ3VpZGUtbGluZS1sYXllciIpO24uX2lzVmVydGljYWwoKT9uLmFkZENsYXNzKCJ2ZXJ0aWNhbCIpOm4uYWRkQ2xhc3MoImhvcml6b250YWwiKTtuLl9zY2FsZVVwZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7bi5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO24ucmVuZGVyKCl9O3JldHVybiBufWsocCxsKTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5fZ3VpZGVMaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImd1aWRlLWxpbmUiLCEwKX07cC5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24obSxuKXtyZXR1cm57d2lkdGg6bSxoZWlnaHQ6bn19O3AucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uPT09cC5PUklFTlRBVElPTl9WRVJUSUNBTH07cC5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfTtwLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfTtwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKG0sbixxKXtsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxtLG4scSk7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMuc2NhbGUoKS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLnNjYWxlKCkucmFuZ2UoW3RoaXMuaGVpZ2h0KCksCjBdKSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5fZ3VpZGVMaW5lLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpfSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlPWZ1bmN0aW9uKCl7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fbW9kZT09PXQuVkFMVUUmJm51bGwhPXRoaXMudmFsdWUoKT90aGlzLl9waXhlbFBvc2l0aW9uPQp0aGlzLnNjYWxlKCkuc2NhbGUodGhpcy52YWx1ZSgpKTp0aGlzLl9tb2RlPT09dC5QSVhFTCYmbnVsbCE9dGhpcy5waXhlbFBvc2l0aW9uKCkmJih0aGlzLl92YWx1ZT10aGlzLnNjYWxlKCkuaW52ZXJ0KHRoaXMucGl4ZWxQb3NpdGlvbigpKSkpfTtwLnByb3RvdHlwZS5fc2V0UGl4ZWxQb3NpdGlvbldpdGhvdXRDaGFuZ2luZ01vZGU9ZnVuY3Rpb24obSl7dGhpcy5fcGl4ZWxQb3NpdGlvbj1tO251bGwhPXRoaXMuc2NhbGUoKSYmKHRoaXMuX3ZhbHVlPXRoaXMuc2NhbGUoKS5pbnZlcnQodGhpcy5waXhlbFBvc2l0aW9uKCkpKTt0aGlzLnJlbmRlcigpfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9zY2FsZTt2YXIgbj10aGlzLl9zY2FsZTtudWxsIT1uJiZuLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKTt0aGlzLl9zY2FsZT1tO3RoaXMuX3NjYWxlLm9uVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spOwp0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fdmFsdWU7dGhpcy5fdmFsdWU9bTt0aGlzLl9tb2RlPXQuVkFMVUU7dGhpcy5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnBpeGVsUG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGl4ZWxQb3NpdGlvbn07cC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2wucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtudWxsIT10aGlzLnNjYWxlKCkmJnRoaXMuc2NhbGUoKS5vZmZVcGRhdGUodGhpcy5fc2NhbGVVcGRhdGVDYWxsYmFjayl9O3JldHVybiBwfShkLkNvbXBvbmVudCk7ZC5PUklFTlRBVElPTl9WRVJUSUNBTD0idmVydGljYWwiO2QuT1JJRU5UQVRJT05fSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCI7CmYuR3VpZGVMaW5lTGF5ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMCk7ZD1oKDQpO3ZhciBsOyhmdW5jdGlvbihwKXtwW3AuVkFMVUU9MF09IlZBTFVFIjtwW3AuUElYRUw9MV09IlBJWEVMIn0pKGw9Zi5Qcm9wZXJ0eU1vZGV8fChmLlByb3BlcnR5TW9kZT17fSkpO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPXAuY2FsbCh0aGlzKXx8dGhpcztuLl9ib3hWaXNpYmxlPSExO24uX2JveEJvdW5kcz17dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fTtuLl94Qm91bmRzTW9kZT1sLlBJWEVMO24uX3lCb3VuZHNNb2RlPQpsLlBJWEVMO24uYWRkQ2xhc3MoInNlbGVjdGlvbi1ib3gtbGF5ZXIiKTtuLl9hZGp1c3RCb3VuZHNDYWxsYmFjaz1mdW5jdGlvbigpe24ucmVuZGVyKCl9O24uX292ZXJmbG93SGlkZGVuPSEwO24uX3hFeHRlbnQ9W3ZvaWQgMCx2b2lkIDBdO24uX3lFeHRlbnQ9W3ZvaWQgMCx2b2lkIDBdO3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9ib3g9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic2VsZWN0aW9uLWJveCIsITApLnJlbW92ZSgpO3RoaXMuX2JveEFyZWE9dGhpcy5fYm94LmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInNlbGVjdGlvbi1hcmVhIiwhMCl9O20ucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKG4scSl7cmV0dXJue3dpZHRoOm4saGVpZ2h0OnF9fTttLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fZ2V0Qm91bmRzKCk7CnRoaXMuX3NldEJvdW5kcyhuKTt0aGlzLl95Qm91bmRzTW9kZT10aGlzLl94Qm91bmRzTW9kZT1sLlBJWEVMO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24obil7dGhpcy5fYm94Qm91bmRzPXt0b3BMZWZ0Ont4Ok1hdGgubWluKG4udG9wTGVmdC54LG4uYm90dG9tUmlnaHQueCkseTpNYXRoLm1pbihuLnRvcExlZnQueSxuLmJvdHRvbVJpZ2h0LnkpfSxib3R0b21SaWdodDp7eDpNYXRoLm1heChuLnRvcExlZnQueCxuLmJvdHRvbVJpZ2h0LngpLHk6TWF0aC5tYXgobi50b3BMZWZ0Lnksbi5ib3R0b21SaWdodC55KX19fTttLnByb3RvdHlwZS5fZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJue3RvcExlZnQ6e3g6dGhpcy5feEJvdW5kc01vZGU9PT1sLlBJWEVMP3RoaXMuX2JveEJvdW5kcy50b3BMZWZ0Lng6bnVsbD09dGhpcy5feFNjYWxlPzA6TWF0aC5taW4odGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVswXSksCnRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMV0pKSx5OnRoaXMuX3lCb3VuZHNNb2RlPT09bC5QSVhFTD90aGlzLl9ib3hCb3VuZHMudG9wTGVmdC55Om51bGw9PXRoaXMuX3lTY2FsZT8wOk1hdGgubWluKHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMF0pLHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMV0pKX0sYm90dG9tUmlnaHQ6e3g6dGhpcy5feEJvdW5kc01vZGU9PT1sLlBJWEVMP3RoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC54Om51bGw9PXRoaXMuX3hTY2FsZT8wOk1hdGgubWF4KHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMF0pLHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMV0pKSx5OnRoaXMuX3lCb3VuZHNNb2RlPT09bC5QSVhFTD90aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueTpudWxsPT10aGlzLl95U2NhbGU/MDpNYXRoLm1heCh0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzBdKSwKdGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVsxXSkpfX19O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTtpZih0aGlzLl9ib3hWaXNpYmxlKXt2YXIgbj10aGlzLmJvdW5kcygpLHE9bi50b3BMZWZ0LnksdT1uLmJvdHRvbVJpZ2h0LnkseD1uLnRvcExlZnQueDtuPW4uYm90dG9tUmlnaHQueDtpZighKHQuTWF0aC5pc1ZhbGlkTnVtYmVyKHEpJiZ0Lk1hdGguaXNWYWxpZE51bWJlcih1KSYmdC5NYXRoLmlzVmFsaWROdW1iZXIoeCkmJnQuTWF0aC5pc1ZhbGlkTnVtYmVyKG4pKSl0aHJvdyBFcnJvcigiYm91bmRzIGhhdmUgbm90IGJlZW4gcHJvcGVybHkgc2V0Iik7dGhpcy5fYm94QXJlYS5hdHRycyh7eCx5OnEsd2lkdGg6bi14LGhlaWdodDp1LXF9KTt0aGlzLmNvbnRlbnQoKS5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fYm94Lm5vZGUoKSl9ZWxzZSB0aGlzLl9ib3gucmVtb3ZlKCk7CnJldHVybiB0aGlzfTttLnByb3RvdHlwZS5ib3hWaXNpYmxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2JveFZpc2libGU7dGhpcy5fYm94VmlzaWJsZT1uO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07bS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07bS5wcm90b3R5cGUueFNjYWxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3hTY2FsZTtudWxsIT10aGlzLl94U2NhbGUmJnRoaXMuX3hTY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO3RoaXMuX3hTY2FsZT1uO3RoaXMuX3hCb3VuZHNNb2RlPWwuVkFMVUU7dGhpcy5feFNjYWxlLm9uVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS55U2NhbGU9ZnVuY3Rpb24obil7aWYobnVsbD09Cm4pcmV0dXJuIHRoaXMuX3lTY2FsZTtudWxsIT10aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO3RoaXMuX3lTY2FsZT1uO3RoaXMuX3lCb3VuZHNNb2RlPWwuVkFMVUU7dGhpcy5feVNjYWxlLm9uVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS54RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFhFeHRlbnQoKX07bS5wcm90b3R5cGUuX2dldFhFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feEJvdW5kc01vZGU9PT1sLlZBTFVFP3RoaXMuX3hFeHRlbnQ6bnVsbD09dGhpcy5feFNjYWxlP1t2b2lkIDAsdm9pZCAwXTpbdGhpcy5feFNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMudG9wTGVmdC54KSx0aGlzLl94U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC54KV19O20ucHJvdG90eXBlLl9zZXRYRXh0ZW50PQpmdW5jdGlvbihuKXt0aGlzLl94RXh0ZW50PW59O20ucHJvdG90eXBlLnlFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0WUV4dGVudCgpfTttLnByb3RvdHlwZS5fZ2V0WUV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl95Qm91bmRzTW9kZT09PWwuVkFMVUU/dGhpcy5feUV4dGVudDpudWxsPT10aGlzLl95U2NhbGU/W3ZvaWQgMCx2b2lkIDBdOlt0aGlzLl95U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy50b3BMZWZ0LnkpLHRoaXMuX3lTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0LnkpXX07bS5wcm90b3R5cGUuX3NldFlFeHRlbnQ9ZnVuY3Rpb24obil7dGhpcy5feUV4dGVudD1ufTttLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO251bGwhPXRoaXMuX3hTY2FsZSYmdGhpcy54U2NhbGUoKS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO251bGwhPXRoaXMuX3lTY2FsZSYmCnRoaXMueVNjYWxlKCkub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKX07cmV0dXJuIG19KGQuQ29tcG9uZW50KTtmLlNlbGVjdGlvbkJveExheWVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJwYXRoIiwiYXJjIGZpbGwiKXx8dGhpc31rKGwsdCk7bC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24ocCl7cC5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfTtyZXR1cm4gbH0oaCg5KS5TVkdEcmF3ZXIpO2YuQXJjU1ZHRHJhd2VyPQpkfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3JldHVybiB0LmNhbGwodGhpcywicGF0aCIsImFyYyBvdXRsaW5lIil8fHRoaXN9ayhsLHQpO2wucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHApe3Auc3R5bGUoImZpbGwiLCJub25lIil9O3JldHVybiBsfShoKDkpLlNWR0RyYXdlcik7Zi5BcmNPdXRsaW5lU1ZHRHJhd2VyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxOCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7cmV0dXJuIHAuY2FsbCh0aGlzLCJwYXRoIiwiYXJlYSIpfHx0aGlzfWsobSxwKTttLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbihuKXtuLnN0eWxlKCJzdHJva2UiLCJub25lIil9O20ucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsMCl9O3JldHVybiBtfShoKDkpLlNWR0RyYXdlcik7Zi5BcmVhU1ZHRHJhd2VyPWQ7dmFyIGw9WyJmaWxsIiwib3BhY2l0eSIsImZpbGwtb3BhY2l0eSJdO2YubWFrZUFyZWFDYW52YXNEcmF3U3RlcD1mdW5jdGlvbihwKXtyZXR1cm4gZnVuY3Rpb24obSwKbixxKXtxPXQucmVzb2x2ZUF0dHJpYnV0ZXMocSxsLG5bMF0sMCk7dC5yZW5kZXJBcmVhKG0scCgpLG5bMF0scSl9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHRbbV09bFttXSk7dC5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gdC5jYWxsKHRoaXMsImxpbmUiLCIiKXx8dGhpc31rKGwsdCk7cmV0dXJuIGx9KGgoOSkuU1ZHRHJhd2VyKTtmLlNlZ21lbnRTVkdEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsobixxLHUseCxBKXtyZXR1cm4gMDw9dStBJiZ1LUE8PW4mJjA8PXgrQSYmeC1BPD1xfWZ1bmN0aW9uIHQobixxLHUpe2lmKG51bGw9PW4pcmV0dXJuITE7CmZvcih2YXIgeD0wO3g8dS5sZW5ndGg7eCsrKXt2YXIgQT11W3hdO2lmKG5bQV0hPXFbQV0pcmV0dXJuITF9cmV0dXJuITB9dmFyIGw9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHggaW4gcSlxLmhhc093blByb3BlcnR5KHgpJiYoblt4XT1xW3hdKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHA9aCg4NiksbT1oKDE4KTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXtyZXR1cm4gbi5jYWxsKHRoaXMsInBhdGgiLCJzeW1ib2wiKXx8dGhpc31sKHEsbik7cmV0dXJuIHF9KGgoOSkuU1ZHRHJhd2VyKTtmLlN5bWJvbFNWR0RyYXdlcj1kO2YubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKG4scSx1KXt2YXIgeD10aGlzO3JldHVybiBmdW5jdGlvbihBLHksdyl7dmFyIEM9QS5jYW52YXMsRz1DLmNsaWVudFdpZHRoOwpDPUMuY2xpZW50SGVpZ2h0O2Zvcih2YXIgRD1uZXcgcC5DYW52YXNCdWZmZXIoMCwwKSxCPXEoKSxJPXUoKSxOPW51bGwsTz1udWxsLEg9bnVsbCxLPTA7Szx5Lmxlbmd0aDtLKyspe3ZhciBNPXlbS107aWYobnVsbCE9TSl7dmFyIEw9bS5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXModyxbIngiLCJ5Il0sTSxLKSxRPUkoTSxLLG4pO2lmKGsoRyxDLEwueCxMLnksUSkpe3ZhciBUPXQoTixMLG0uQ29udGV4dFN0eWxlQXR0cnMpO009QihNLEsseC5fZGF0YXNldCk7VCYmSD09USYmTz09TXx8KE49bS5nZXRTdHJva2VXaWR0aChMKSxOPVErTisxLChOPkQuc2NyZWVuV2lkdGh8fE4+RC5zY3JlZW5IZWlnaHQpJiZELnJlc2l6ZShOLE4sITApLEQuY2xlYXIoKSxOPUQuY3R4LE4uYmVnaW5QYXRoKCksTShRKS5jb250ZXh0KE4pKG51bGwpLE4uY2xvc2VQYXRoKCksbS5yZW5kZXJQYXRoV2l0aFN0eWxlKE4sTCksTz1NLEg9USxOPUwpO0QuYmxpdENlbnRlcihBLEwueCxMLnkpfX19fX19LApmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhEKXtyZXR1cm4gRCBpbnN0YW5jZW9mIHk/RDpEIGluc3RhbmNlb2YgRGF0ZT9wKEQudmFsdWVPZigpKTpEIGluc3RhbmNlb2YgQS5TY2FsZT90KEQpOkQgaW5zdGFuY2VvZiB4LkRhdGFzZXQ/bChEKTp1KEQpP24oRCk6QXJyYXkuaXNBcnJheShEKT9tKEQpOnAoRCl9ZnVuY3Rpb24gdChEKXtEPXtkb21haW46RC5kb21haW4oKSxyYW5nZTpELnJhbmdlKCksdXBkYXRlSWQ6RC51cGRhdGVJZCgpLHJlZjpwKEQpfTtyZXR1cm4gbihEKX1mdW5jdGlvbiBsKEQpe0Q9e3JlZjpwKEQpLHVwZGF0ZUlkOkQudXBkYXRlSWQoKX07cmV0dXJuIG4oRCl9ZnVuY3Rpb24gcChEKXtyZXR1cm4gbmV3IEMoRCl9ZnVuY3Rpb24gbShEKXtyZXR1cm4gbmV3IHcoRC5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIGsoQil9KSl9ZnVuY3Rpb24gbihEKXt2YXIgQj17fSxJO2ZvcihJIGluIEQpRC5oYXNPd25Qcm9wZXJ0eShJKSYmKEJbSV09ayhEW0ldKSk7cmV0dXJuIG5ldyBHKEIpfQp2YXIgcT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBJKCl7dGhpcy5jb25zdHJ1Y3Rvcj1EfWZvcih2YXIgTiBpbiBCKUIuaGFzT3duUHJvcGVydHkoTikmJihEW05dPUJbTl0pO0QucHJvdG90eXBlPW51bGw9PT1CP09iamVjdC5jcmVhdGUoQik6KEkucHJvdG90eXBlPUIucHJvdG90eXBlLG5ldyBJKX0sdT1oKDEyOCkseD1oKDM4KSxBPWgoMTcpO2Yuc2lnbj1rO2Yuc2lnblNjYWxlPXQ7Zi5zaWduRGF0YXNldD1sO2Yuc2lnblJlZj1wO2Yuc2lnbkFycmF5PW07Zi5zaWduT2JqPW47dmFyIHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBEKCl7fUQucHJvdG90eXBlLmlzRGlmZmVyZW50PWZ1bmN0aW9uKEIpe3JldHVybiBCIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj90aGlzLmlzU2lnbmF0dXJlRGlmZmVyZW50KEIpOiEwfTtyZXR1cm4gRH0oKTtmLlNpZ25hdHVyZT15O3ZhciB3PWZ1bmN0aW9uKEQpe2Z1bmN0aW9uIEIoSSl7dmFyIE49RC5jYWxsKHRoaXMpfHwKdGhpcztOLmFycmF5PUk7cmV0dXJuIE59cShCLEQpO0IucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50PWZ1bmN0aW9uKEkpe2lmKEkuYXJyYXkubGVuZ3RoIT09dGhpcy5hcnJheS5sZW5ndGgpcmV0dXJuITA7Zm9yKHZhciBOPTA7Tjx0aGlzLmFycmF5Lmxlbmd0aDtOKyspaWYodGhpcy5hcnJheVtOXS5pc0RpZmZlcmVudChJLmFycmF5W05dKSlyZXR1cm4hMDtyZXR1cm4hMX07cmV0dXJuIEJ9KHkpO2YuQXJyYXlTaWduYXR1cmU9dzt2YXIgQz1mdW5jdGlvbihEKXtmdW5jdGlvbiBCKEkpe3ZhciBOPUQuY2FsbCh0aGlzKXx8dGhpcztOLnJlZj1JO3JldHVybiBOfXEoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihJKXtyZXR1cm4gdGhpcy5yZWYhPT1JLnJlZn07cmV0dXJuIEJ9KHkpO2YuUmVmZXJlbmNlU2lnbmF0dXJlPUM7dmFyIEc9ZnVuY3Rpb24oRCl7ZnVuY3Rpb24gQihJKXt2YXIgTj1ELmNhbGwodGhpcyl8fHRoaXM7Ti5vYmo9Ckk7cmV0dXJuIE59cShCLEQpO0IucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50PWZ1bmN0aW9uKEkpe3ZhciBOPU9iamVjdC5rZXlzKHRoaXMub2JqKSxPPU9iamVjdC5rZXlzKEkub2JqKTtpZihOLmxlbmd0aCE9PU8ubGVuZ3RoKXJldHVybiEwO2ZvcihPPTA7TzxOLmxlbmd0aDtPKyspe3ZhciBIPU5bT107aWYoIUkub2JqLmhhc093blByb3BlcnR5KEgpfHx0aGlzLm9ialtIXS5pc0RpZmZlcmVudChJLm9ialtIXSkpcmV0dXJuITB9cmV0dXJuITF9O3JldHVybiBCfSh5KTtmLk9iamVjdFNpZ25hdHVyZT1HfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHksdyl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9eX1mb3IodmFyIEcgaW4gdyl3Lmhhc093blByb3BlcnR5KEcpJiYoeVtHXT13W0ddKTt5LnByb3RvdHlwZT1udWxsPT09dz9PYmplY3QuY3JlYXRlKHcpOihDLnByb3RvdHlwZT13LnByb3RvdHlwZSxuZXcgQyl9LAp0PWgoMSksbD1oKDMpLHA9aCgwKSxtPWgoMTQpLG49aCg0NikscT1oKDYpLHU9aCgzMykseD1oKDE5KTtkPWgoNTMpO3ZhciBBPWgoMik7aD1mdW5jdGlvbih5KXtmdW5jdGlvbiB3KCl7dmFyIEM9eS5jYWxsKHRoaXMpfHx0aGlzO0MuYWRkQ2xhc3MoImFyZWEtcGxvdCIpO0MueTAoMCk7Qy5hdHRyKCJmaWxsLW9wYWNpdHkiLC4yNSk7Qy5hdHRyKCJmaWxsIiwobmV3IGwuQ29sb3IpLnJhbmdlKClbMF0pO0MuX2xpbmVEcmF3ZXJzPW5ldyBwLk1hcDtyZXR1cm4gQ31rKHcseSk7dy5wcm90b3R5cGUueT1mdW5jdGlvbihDLEcpe2lmKG51bGw9PUMpcmV0dXJuIHkucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1HP3kucHJvdG90eXBlLnkuY2FsbCh0aGlzLEMpOnkucHJvdG90eXBlLnkuY2FsbCh0aGlzLEMsRyk7bnVsbCE9RyYmKEM9dGhpcy55MCgpLmFjY2Vzc29yLG51bGwhPUMmJnRoaXMuX2JpbmRQcm9wZXJ0eSh3Ll9ZMF9LRVksQyxHKSx0aGlzLl91cGRhdGVZU2NhbGUoKSk7CnJldHVybiB0aGlzfTt3LnByb3RvdHlwZS55MD1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9ZMF9LRVkpO3ZhciBHPXRoaXMueSgpO3RoaXMuX2JpbmRQcm9wZXJ0eSh3Ll9ZMF9LRVksQyxHJiZHLnNjYWxlKTt0aGlzLl91cGRhdGVZU2NhbGUoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7eS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpO3RoaXMuX3VwZGF0ZVlTY2FsZSgpfTt3LnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihDKXt2YXIgRz10aGlzO3RoaXMuX2xpbmVEcmF3ZXJzLnNldChDLG5ldyBtLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LkxpbmVTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEQpe3JldHVybiBuZXcgbS5DYW52YXNEcmF3ZXIoRCx1Lm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoZnVuY3Rpb24oKXt2YXIgQj0KQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLngoKSksST1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcueSgpKTtyZXR1cm4gRy5fZDNMaW5lRmFjdG9yeShDLEIsSSl9KSl9KSk7eS5wcm90b3R5cGUuX2FkZERhdGFzZXQuY2FsbCh0aGlzLEMpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKEMpe3kucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLEMpO0M9dGhpcy5fbGluZURyYXdlcnMuZ2V0KEMpOyJzdmciPT09dGhpcy5yZW5kZXJlcigpP0MudXNlU1ZHKHRoaXMuX3JlbmRlckFyZWEpOkMudXNlQ2FudmFzKHRoaXMuX2NhbnZhcyk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oQyl7eS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsQyk7dGhpcy5fbGluZURyYXdlcnMuZ2V0KEMpLnJlbW92ZSgpfTt3LnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PQpmdW5jdGlvbigpe3ZhciBDPXRoaXMsRz10aGlzLl9nZW5lcmF0ZUxpbmVEcmF3U3RlcHMoKSxEPXRoaXMuX2dldERhdGFUb0RyYXcoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgST1BLlBsb3QuYXBwbHlEcmF3U3RlcHMoRyxCKTtDLl9saW5lRHJhd2Vycy5nZXQoQikuZHJhdyhELmdldChCKSxJKX0pfTt3LnByb3RvdHlwZS5fZ2VuZXJhdGVMaW5lRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIEM9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgRz10aGlzLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3IoKTtHLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpKTtDLnB1c2goe2F0dHJUb1Byb2plY3RvcjpHLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHguQW5pbWF0b3IuUkVTRVQpfSl9Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yKCksCmFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHguQW5pbWF0b3IuTUFJTil9KTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX2dlbmVyYXRlTGluZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBDPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0MuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbihDKXt2YXIgRz10aGlzO3JldHVybiBuZXcgcS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgbi5BcmVhU1ZHRHJhd2VyfSxmdW5jdGlvbihEKXtyZXR1cm4gbmV3IG0uQ2FudmFzRHJhd2VyKEQsbi5tYWtlQXJlYUNhbnZhc0RyYXdTdGVwKGZ1bmN0aW9uKCl7dmFyIEI9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLngoKSksST1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcueSgpKSwKTj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcueTAoKSk7cmV0dXJuIEcuX2NyZWF0ZUFyZWFHZW5lcmF0b3IoQixJLE4sRy5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihCLEkpLEMpfSkpfSl9O3cucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBDPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7Ry5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3IoQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksdGhpcy5fZ2V0UmVzZXRZRnVuY3Rpb24oKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSkpO0MucHVzaCh7YXR0clRvUHJvamVjdG9yOkcsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoeC5BbmltYXRvci5SRVNFVCl9KX1DLnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLk1BSU4pfSk7CnJldHVybiBDfTt3LnByb3RvdHlwZS5fdXBkYXRlWVNjYWxlPWZ1bmN0aW9uKCl7dmFyIEM9dGhpcy5nZXRFeHRlbnRzRm9yUHJvcGVydHkoInkwIik7Qz1wLkFycmF5LnVuaXEocC5BcnJheS5mbGF0dGVuKEMpKTt2YXIgRz0xPT09Qy5sZW5ndGg/Q1swXTpudWxsO0M9KEM9dGhpcy55KCkpJiZDLnNjYWxlO251bGwhPUMmJihudWxsIT10aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlciYmKEMucmVtb3ZlUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlciksdGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXI9bnVsbCksbnVsbCE9RyYmKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW0ddfSxDLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXIpKSl9O3cucHJvdG90eXBlLl9nZXRSZXNldFlGdW5jdGlvbj0KZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkwKCkpfTt3LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEM9eS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpO0MuZD10aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MCgpKSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpczt2b2lkIDA9PT1DJiYoQz10aGlzLmRhdGFzZXRzKCkpO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiB0LnNlbGVjdEFsbCgpO3ZhciBEPXkucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLEMpLm5vZGVzKCk7Qy5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIEcuX2xpbmVEcmF3ZXJzLmdldChCKX0pLmZpbHRlcihmdW5jdGlvbihCKXtyZXR1cm4gbnVsbCE9CkJ9KS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3JldHVybiBELnB1c2guYXBwbHkoRCxCLmdldFZpc3VhbFByaW1pdGl2ZXMoKSl9KTtyZXR1cm4gdC5zZWxlY3RBbGwoRCl9O3cucHJvdG90eXBlLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yPWZ1bmN0aW9uKEMsRyxEKXt2YXIgQj10aGlzLEk9dGhpcy5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIGZ1bmN0aW9uKE4sTyxIKXtyZXR1cm4gQi5fY3JlYXRlQXJlYUdlbmVyYXRvcihDLEcsRCxJLEgpKE4pfX07dy5wcm90b3R5cGUuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3I9ZnVuY3Rpb24oQyxHKXtyZXR1cm4gZnVuY3Rpb24oRCxCLEkpe3ZhciBOPUMoRCxCLEkpO0Q9RyhELEIsSSk7cmV0dXJuIHAuTWF0aC5pc1ZhbGlkTnVtYmVyKE4pJiZwLk1hdGguaXNWYWxpZE51bWJlcihEKX19O3cucHJvdG90eXBlLl9jcmVhdGVBcmVhR2VuZXJhdG9yPQpmdW5jdGlvbihDLEcsRCxCLEkpe3ZhciBOPXRoaXMuX2dldEN1cnZlRmFjdG9yeSgpO3JldHVybiB0LmFyZWEoKS54KGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEMoTyxILEkpfSkueTEoZnVuY3Rpb24oTyxIKXtyZXR1cm4gRyhPLEgsSSl9KS55MChmdW5jdGlvbihPLEgpe3JldHVybiBEKE8sSCxJKX0pLmN1cnZlKE4pLmRlZmluZWQoZnVuY3Rpb24oTyxIKXtyZXR1cm4gQihPLEgsSSl9KX07cmV0dXJuIHd9KGQuTGluZSk7aC5fWTBfS0VZPSJ5MCI7Zi5BcmVhPWh9LGZ1bmN0aW9uKGQsZil7KGZ1bmN0aW9uKGgpe2guTUFJTj0ibWFpbiI7aC5SRVNFVD0icmVzZXQifSkoZi5BbmltYXRvcnx8KGYuQW5pbWF0b3I9e30pKX0sZnVuY3Rpb24oZCxmKXt2YXIgaD1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt2YXIgdD10aGlzO3RoaXMudHJhbnNsYXRlPXRoaXMuc2NhbGU9MDt0aGlzLmNhY2hlZERvbWFpbj1bbnVsbCxudWxsXTt0aGlzLmxhc3RTZWVuRG9tYWluPVtudWxsLG51bGxdO3RoaXMudXBkYXRlRG9tYWluPQpmdW5jdGlvbihsKXt0Lmxhc3RTZWVuRG9tYWluPWwuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTt2YXIgcD1sLnNjYWxlVHJhbnNmb3JtYXRpb24odC5jYWNoZWREb21haW5bMV0pLWwuc2NhbGVUcmFuc2Zvcm1hdGlvbih0LmNhY2hlZERvbWFpblswXSksbT1sLnNjYWxlVHJhbnNmb3JtYXRpb24odC5sYXN0U2VlbkRvbWFpblsxXSktbC5zY2FsZVRyYW5zZm9ybWF0aW9uKHQubGFzdFNlZW5Eb21haW5bMF0pO3Quc2NhbGU9cC9tfHwxO3QudHJhbnNsYXRlPWwuc2NhbGVUcmFuc2Zvcm1hdGlvbih0LmNhY2hlZERvbWFpblswXSktbC5zY2FsZVRyYW5zZm9ybWF0aW9uKHQubGFzdFNlZW5Eb21haW5bMF0pKnQuc2NhbGV8fDB9fWsucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zY2FsZT0xO3RoaXMudHJhbnNsYXRlPTA7dGhpcy5jYWNoZWREb21haW49dGhpcy5sYXN0U2VlbkRvbWFpbn07ay5wcm90b3R5cGUuc2V0RG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuY2FjaGVkRG9tYWluPQp0LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCl9O3JldHVybiBrfSgpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKHQsbCl7dmFyIHA9dGhpczt0aGlzLnJlbmRlckNhbGxiYWNrPXQ7dGhpcy5hcHBseVRyYW5zZm9ybUNhbGxiYWNrPWw7dGhpcy5kb21haW5UcmFuc2Zvcm1YPW5ldyBoO3RoaXMuZG9tYWluVHJhbnNmb3JtWT1uZXcgaDt0aGlzLnJlbmRlckRlZmVycmVkPWZ1bmN0aW9uKCl7cC5hcHBseVRyYW5zZm9ybSgpO2NsZWFyVGltZW91dChwLnRpbWVvdXRUb2tlbik7cC50aW1lb3V0VG9rZW49c2V0VGltZW91dChmdW5jdGlvbigpe3AucmVuZGVyQ2FsbGJhY2soKX0say5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVkpfX1rLnByb3RvdHlwZS5zZXREb21haW5zPWZ1bmN0aW9uKHQsbCl7dCYmdGhpcy5kb21haW5UcmFuc2Zvcm1YLnNldERvbWFpbih0KTtsJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVkuc2V0RG9tYWluKGwpO3RoaXMucmVuZGVyRGVmZXJyZWQoKX07ay5wcm90b3R5cGUudXBkYXRlRG9tYWlucz0KZnVuY3Rpb24odCxsKXt0JiZ0aGlzLmRvbWFpblRyYW5zZm9ybVgudXBkYXRlRG9tYWluKHQpO2wmJnRoaXMuZG9tYWluVHJhbnNmb3JtWS51cGRhdGVEb21haW4obCk7dGhpcy5yZW5kZXJEZWZlcnJlZCgpfTtrLnByb3RvdHlwZS5yZXNldFRyYW5zZm9ybXM9ZnVuY3Rpb24oKXt0aGlzLmRvbWFpblRyYW5zZm9ybVgucmVzZXQoKTt0aGlzLmRvbWFpblRyYW5zZm9ybVkucmVzZXQoKTt0aGlzLmFwcGx5VHJhbnNmb3JtKCl9O2sucHJvdG90eXBlLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKCl7dGhpcy5hcHBseVRyYW5zZm9ybUNhbGxiYWNrKHRoaXMuZG9tYWluVHJhbnNmb3JtWC50cmFuc2xhdGUsdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnRyYW5zbGF0ZSx0aGlzLmRvbWFpblRyYW5zZm9ybVguc2NhbGUsdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnNjYWxlKX07cmV0dXJuIGt9KCk7ZC5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVk9MjAwO2YuRGVmZXJyZWRSZW5kZXJlcj1kfSxmdW5jdGlvbihkLApmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihDLEcpe2Z1bmN0aW9uIEQoKXt0aGlzLmNvbnN0cnVjdG9yPUN9Zm9yKHZhciBCIGluIEcpRy5oYXNPd25Qcm9wZXJ0eShCKSYmKENbQl09R1tCXSk7Qy5wcm90b3R5cGU9bnVsbD09PUc/T2JqZWN0LmNyZWF0ZShHKTooRC5wcm90b3R5cGU9Ry5wcm90b3R5cGUsbmV3IEQpfSx0PWgoMSksbD1oKDcpLHA9aCgxNCksbT1oKDYpLG49aCgzMykscT1oKDMpLHU9aCgxMSkseD1oKDApO2Q9aCgxMCk7dmFyIEE9aCgxOSkseT1oKDIpO2g9aCgxNik7dmFyIHc9e2xpbmVhcjp0LmN1cnZlTGluZWFyLGxpbmVhckNsb3NlZDp0LmN1cnZlTGluZWFyQ2xvc2VkLHN0ZXA6dC5jdXJ2ZVN0ZXAsc3RlcEJlZm9yZTp0LmN1cnZlU3RlcEJlZm9yZSxzdGVwQWZ0ZXI6dC5jdXJ2ZVN0ZXBBZnRlcixiYXNpczp0LmN1cnZlQmFzaXMsYmFzaXNPcGVuOnQuY3VydmVCYXNpc09wZW4sYmFzaXNDbG9zZWQ6dC5jdXJ2ZUJhc2lzQ2xvc2VkLApidW5kbGU6dC5jdXJ2ZUJ1bmRsZSxjYXJkaW5hbDp0LmN1cnZlQ2FyZGluYWwsY2FyZGluYWxPcGVuOnQuY3VydmVDYXJkaW5hbE9wZW4sY2FyZGluYWxDbG9zZWQ6dC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkLG1vbm90b25lOnQuY3VydmVNb25vdG9uZVh9O2YuQ3VydmVOYW1lPWQubWFrZUVudW0oImxpbmVhciBsaW5lYXJDbG9zZWQgc3RlcCBzdGVwQmVmb3JlIHN0ZXBBZnRlciBiYXNpcyBiYXNpc09wZW4gYmFzaXNDbG9zZWQgYnVuZGxlIGNhcmRpbmFsIGNhcmRpbmFsT3BlbiBjYXJkaW5hbENsb3NlZCBtb25vdG9uZSIuc3BsaXQoIiAiKSk7aD1mdW5jdGlvbihDKXtmdW5jdGlvbiBHKCl7dmFyIEQ9Qy5jYWxsKHRoaXMpfHx0aGlzO0QuX2N1cnZlPSJsaW5lYXIiO0QuX2F1dG9yYW5nZVNtb290aD0hMTtELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD0hMDtELl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQ9ITE7RC5fZG93bnNhbXBsaW5nRW5hYmxlZD0hMTtELmFkZENsYXNzKCJsaW5lLXBsb3QiKTsKdmFyIEI9bmV3IGwuRWFzaW5nO0Iuc3RlcER1cmF0aW9uKHkuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7Qi5lYXNpbmdNb2RlKCJleHBJbk91dCIpO0IubWF4VG90YWxEdXJhdGlvbih5LlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0QuYW5pbWF0b3IoQS5BbmltYXRvci5NQUlOLEIpO0QuYXR0cigic3Ryb2tlIiwobmV3IHEuQ29sb3IpLnJhbmdlKClbMF0pO0QuYXR0cigic3Ryb2tlLXdpZHRoIiwiMnB4Iik7cmV0dXJuIER9ayhHLEMpO0cucHJvdG90eXBlLng9ZnVuY3Rpb24oRCxCLEkpe2lmKG51bGw9PUQpcmV0dXJuIEMucHJvdG90eXBlLnguY2FsbCh0aGlzKTtDLnByb3RvdHlwZS54LmNhbGwodGhpcyxELEIsSSk7dGhpcy5fc2V0U2NhbGVTbmFwcGluZygpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS55PWZ1bmN0aW9uKEQsQixJKXtpZihudWxsPT1EKXJldHVybiBDLnByb3RvdHlwZS55LmNhbGwodGhpcyk7Qy5wcm90b3R5cGUueS5jYWxsKHRoaXMsRCxCLApJKTt0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmF1dG9yYW5nZU1vZGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gQy5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZS5jYWxsKHRoaXMpO0MucHJvdG90eXBlLmF1dG9yYW5nZU1vZGUuY2FsbCh0aGlzLEQpO3RoaXMuX3NldFNjYWxlU25hcHBpbmcoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuYXV0b3JhbmdlU21vb3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F1dG9yYW5nZVNtb290aH07Ry5wcm90b3R5cGUuX3NldFNjYWxlU25hcHBpbmc9ZnVuY3Rpb24oKXsieCI9PT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmdGhpcy54KCkmJnRoaXMueCgpLnNjYWxlJiZ0aGlzLngoKS5zY2FsZSBpbnN0YW5jZW9mIHUuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueCgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSk7InkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJgp0aGlzLnkoKSYmdGhpcy55KCkuc2NhbGUmJnRoaXMueSgpLnNjYWxlIGluc3RhbmNlb2YgdS5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy55KCkuc2NhbGUuc25hcHBpbmdEb21haW5FbmFibGVkKCF0aGlzLmF1dG9yYW5nZVNtb290aCgpKX07Ry5wcm90b3R5cGUuY3VydmU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fY3VydmU7dGhpcy5fY3VydmU9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd25zYW1wbGluZ0VuYWJsZWR9O0cucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkO3RoaXMuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuY29sbGFwc2VEZW5zZUxpbmVzRW5hYmxlZD0KZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkO3RoaXMuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZD1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpcztyZXR1cm4gbmV3IG0uUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uTGluZVNWR0RyYXdlcn0sZnVuY3Rpb24oSSl7cmV0dXJuIG5ldyBwLkNhbnZhc0RyYXdlcihJLG4ubWFrZUxpbmVDYW52YXNEcmF3U3RlcChmdW5jdGlvbigpe3JldHVybiBCLl9kM0xpbmVGYWN0b3J5KEQpfSkpfSl9O0cucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihEKXt2YXIgQj1DLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLEQpO2lmKCF0aGlzLl9hdXRvcmFuZ2VTbW9vdGh8fHRoaXMuYXV0b3JhbmdlTW9kZSgpIT09CkR8fCJ4IiE9PXRoaXMuYXV0b3JhbmdlTW9kZSgpJiYieSIhPT10aGlzLmF1dG9yYW5nZU1vZGUoKSlyZXR1cm4gQjtEPXRoaXMuX2dldEVkZ2VJbnRlcnNlY3Rpb25Qb2ludHMoKTt2YXIgST0ieSI9PT10aGlzLmF1dG9yYW5nZU1vZGUoKT9ELmxlZnQuY29uY2F0KEQucmlnaHQpLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTi55fSk6RC50b3AuY29uY2F0KEQuYm90dG9tKS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4ueH0pO3JldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gdC5leHRlbnQodC5tZXJnZShbTixJXSkpfSl9O0cucHJvdG90eXBlLl9nZXRFZGdlSW50ZXJzZWN0aW9uUG9pbnRzPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcztpZighKHRoaXMueSgpLnNjYWxlIGluc3RhbmNlb2YgdS5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiB1LlF1YW50aXRhdGl2ZVNjYWxlKSlyZXR1cm57bGVmdDpbXSxyaWdodDpbXSx0b3A6W10sYm90dG9tOltdfTsKdmFyIEI9dGhpcy55KCkuc2NhbGUsST10aGlzLngoKS5zY2FsZSxOPXtsZWZ0OltdLHJpZ2h0OltdLHRvcDpbXSxib3R0b206W119LE89SS5zY2FsZShJLmRvbWFpbigpWzBdKSxIPUkuc2NhbGUoSS5kb21haW4oKVsxXSksSz1CLnNjYWxlKEIuZG9tYWluKClbMF0pLE09Qi5zY2FsZShCLmRvbWFpbigpWzFdKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihMKXtmb3IodmFyIFE9TC5kYXRhKCksVCxYLGFhLGxhLFosYmEsZWEsY2E9MTtjYTxRLmxlbmd0aDtjYSsrKWxhPWJhfHxJLnNjYWxlKEQueCgpLmFjY2Vzc29yKFFbY2EtMV0sY2EtMSxMKSksWj1lYXx8Qi5zY2FsZShELnkoKS5hY2Nlc3NvcihRW2NhLTFdLGNhLTEsTCkpLGJhPUkuc2NhbGUoRC54KCkuYWNjZXNzb3IoUVtjYV0sY2EsTCkpLGVhPUIuc2NhbGUoRC55KCkuYWNjZXNzb3IoUVtjYV0sY2EsTCkpLGxhPE89PT1PPD1iYSYmKFQ9Ty1sYSxYPWJhLWxhLGFhPWVhLVosVD1UKmFhL1gsTi5sZWZ0LnB1c2goe3g6TywKeTpCLmludmVydChaK1QpfSkpLGxhPEg9PT1IPD1iYSYmKFQ9SC1sYSxYPWJhLWxhLGFhPWVhLVosVD1UKmFhL1gsTi5yaWdodC5wdXNoKHt4OkgseTpCLmludmVydChaK1QpfSkpLFo8TT09PU08PWVhJiYoWD1iYS1sYSxUPU0tWixhYT1lYS1aLFQ9VCpYL2FhLE4udG9wLnB1c2goe3g6SS5pbnZlcnQobGErVCkseTpNfSkpLFo8Sz09PUs8PWVhJiYoWD1iYS1sYSxUPUstWixhYT1lYS1aLFQ9VCpYL2FhLE4uYm90dG9tLnB1c2goe3g6SS5pbnZlcnQobGErVCkseTpLfSkpfSk7cmV0dXJuIE59O0cucHJvdG90eXBlLl9nZXRSZXNldFlGdW5jdGlvbj1mdW5jdGlvbigpe3ZhciBEPXRoaXMueSgpLnNjYWxlLmRvbWFpbigpLEI9TWF0aC5tYXgoRFswXSxEWzFdKTtEPU1hdGgubWluKERbMF0sRFsxXSk7Qj0wPkImJkJ8fDA8RCYmRHx8MDt2YXIgST10aGlzLnkoKS5zY2FsZS5zY2FsZShCKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gSX19O0cucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz0KZnVuY3Rpb24oKXt2YXIgRD1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBCPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0IuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkpO0QucHVzaCh7YXR0clRvUHJvamVjdG9yOkIsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoQS5BbmltYXRvci5SRVNFVCl9KX1ELnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihBLkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIER9O0cucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBEPUMucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpO09iamVjdC5rZXlzKEQpLmZvckVhY2goZnVuY3Rpb24oQil7aWYoImQiIT09CkIpe3ZhciBJPURbQl07RFtCXT1mdW5jdGlvbihOLE8sSCl7cmV0dXJuIDA8Ti5sZW5ndGg/SShOWzBdLE8sSCk6bnVsbH19fSk7cmV0dXJuIER9O0cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oRCl7RD10aGlzLmVudGl0eU5lYXJlc3RCeVhUaGVuWShEKTtyZXR1cm4gbnVsbCE9RD9bRF06W119O0cucHJvdG90eXBlLmVudGl0eU5lYXJlc3RCeVhUaGVuWT1mdW5jdGlvbihEKXt2YXIgQj1JbmZpbml0eSxJPUluZmluaXR5LE4sTz10aGlzLmJvdW5kcygpO3RoaXMuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEgpe2lmKHguTWF0aC53aXRoaW4oSC5wb3NpdGlvbixPKSl7dmFyIEs9TWF0aC5hYnMoRC54LUgucG9zaXRpb24ueCksTT1NYXRoLmFicyhELnktSC5wb3NpdGlvbi55KTtpZihLPEJ8fEs9PT1CJiZNPEkpTj1ILEI9SyxJPU19fSk7cmV0dXJuIE59O0cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgRD1DLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7CkQuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gRH07Ry5wcm90b3R5cGUuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3I9ZnVuY3Rpb24oRCxCKXt2YXIgST10aGlzO3JldHVybiBmdW5jdGlvbihOLE8sSCl7cmV0dXJuIEkuX2QzTGluZUZhY3RvcnkoSCxELEIpKE4pfX07Ry5wcm90b3R5cGUuX2QzTGluZUZhY3Rvcnk9ZnVuY3Rpb24oRCxCLEkpe2Z1bmN0aW9uIE4oTyxILEspe3ZhciBNPUIoTyxILEspO089SShPLEgsSyk7cmV0dXJuIHguTWF0aC5pc1ZhbGlkTnVtYmVyKE0pJiZ4Lk1hdGguaXNWYWxpZE51bWJlcihPKX12b2lkIDA9PT1CJiYoQj15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSk7dm9pZCAwPT09SSYmKEk9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiB0LmxpbmUoKS54KGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEIoTywKSCxEKX0pLnkoZnVuY3Rpb24oTyxIKXtyZXR1cm4gSShPLEgsRCl9KS5jdXJ2ZSh0aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKSkuZGVmaW5lZChmdW5jdGlvbihPLEgpe3JldHVybiBOKE8sSCxEKX0pfTtHLnByb3RvdHlwZS5fZ2V0Q3VydmVGYWN0b3J5PWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcy5jdXJ2ZSgpO3JldHVybiJzdHJpbmciPT09dHlwZW9mIEQ/KEQ9d1tEXSxudWxsPT1EP3cubGluZWFyOkQpOkR9O0cucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcyxCPW5ldyB4Lk1hcDt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihJKXt2YXIgTj1JLmRhdGEoKTtpZihELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZHx8RC5fZG93bnNhbXBsaW5nRW5hYmxlZCl7dmFyIE89Ti5tYXAoZnVuY3Rpb24oSCxLKXtyZXR1cm4gS30pO0QuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkJiYoTz1ELl9maWx0ZXJDcm9wcGVkUmVuZGVyaW5nKEksTykpO0QuX2Rvd25zYW1wbGluZ0VuYWJsZWQmJgooTz1ELl9maWx0ZXJEb3duc2FtcGxpbmcoSSxPKSk7RC5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkJiYoTz1ELl9maWx0ZXJEZW5zZUxpbmVzKEksTykpO0Iuc2V0KEksW08ubWFwKGZ1bmN0aW9uKEgpe3JldHVybiBOW0hdfSldKX1lbHNlIEIuc2V0KEksW05dKX0pO3JldHVybiBCfTtHLnByb3RvdHlwZS5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZz1mdW5jdGlvbihELEIpe2Z1bmN0aW9uIEkoYWEsbGEpe3JldHVybiB4Lk1hdGguaW5SYW5nZShhYSwwLE4ud2lkdGgoKSkmJnguTWF0aC5pblJhbmdlKGxhLDAsTi5oZWlnaHQoKSl9Zm9yKHZhciBOPXRoaXMsTz15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxIPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEs9RC5kYXRhKCksTT1bXSxMPTA7TDxCLmxlbmd0aDtMKyspe3ZhciBRPU8oS1tCW0xdXSxCW0xdLEQpLFQ9SChLW0JbTF1dLEJbTF0sRCk7UT1JKFEsVCk7aWYoIVEmJm51bGwhPUJbTC0KMV0mJm51bGwhPUtbQltMLTFdXSl7VD1PKEtbQltMLTFdXSxCW0wtMV0sRCk7dmFyIFg9SChLW0JbTC0xXV0sQltMLTFdLEQpO1E9UXx8SShULFgpfVF8fG51bGw9PUJbTCsxXXx8bnVsbD09S1tCW0wrMV1dfHwoVD1PKEtbQltMKzFdXSxCW0wrMV0sRCksWD1IKEtbQltMKzFdXSxCW0wrMV0sRCksUT1RfHxJKFQsWCkpO1EmJk0ucHVzaChCW0xdKX1yZXR1cm4gTX07Ry5wcm90b3R5cGUuX2ZpbHRlckRvd25zYW1wbGluZz1mdW5jdGlvbihELEIpe2Z1bmN0aW9uIEkoZWEsY2Epe3ZhciBrYT1PKE5bQltlYV1dLEJbZWFdLEQpLFk9SChOW0JbZWFdXSxCW2VhXSxEKSxFYT1PKE5bQltlYSsxXV0sQltlYSsxXSxEKTtlYT1IKE5bQltlYSsxXV0sQltlYSsxXSxEKTtyZXR1cm4gSW5maW5pdHk9PT1jYT9NYXRoLmZsb29yKGthKT09PU1hdGguZmxvb3IoRWEpOk1hdGguZmxvb3IoZWEpPT09TWF0aC5mbG9vcihZKyhFYS1rYSkqY2EpfWlmKDA9PT1CLmxlbmd0aClyZXR1cm5bXTtmb3IodmFyIE49CkQuZGF0YSgpLE89eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksSD15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxLPVtCWzBdXSxNPTA7TTxCLmxlbmd0aC0xOyl7dmFyIEw9QltNXSxRPU8oTltCW01dXSxCW01dLEQpLFQ9SChOW0JbTV1dLEJbTV0sRCksWD1PKE5bQltNKzFdXSxCW00rMV0sRCksYWE9SChOW0JbTSsxXV0sQltNKzFdLEQpO2FhPU1hdGguZmxvb3IoUSk9PT1NYXRoLmZsb29yKFgpP0luZmluaXR5OihhYS1UKS8oWC1RKTtYPUJbTV07VD1JbmZpbml0eT09PWFhP1Q6UTtRPVg7Zm9yKHZhciBsYT1ULFo9ITA7TTxCLmxlbmd0aC0xJiYoWnx8SShNLGFhKSk7KXtNKys7Wj0hMTt2YXIgYmE9SW5maW5pdHk9PT1hYT9IKE5bQltNXV0sQltNXSxEKTpPKE5bQltNXV0sQltNXSxEKTtiYT5sYSYmKGxhPWJhLFE9QltNXSk7YmE8VCYmKFQ9YmEsWD1CW01dKX1hYT1CW01dO1ghPT1MJiZLLnB1c2goWCk7USE9PVgmJlEhPT1MJiZLLnB1c2goUSk7YWEhPT0KTCYmYWEhPT1YJiZhYSE9PVEmJksucHVzaChhYSl9cmV0dXJuIEt9O0cucHJvdG90eXBlLl9maWx0ZXJEZW5zZUxpbmVzPWZ1bmN0aW9uKEQsQil7aWYoMD09PUIubGVuZ3RoKXJldHVybltdO3ZhciBJPUQuZGF0YSgpLE49eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksTz15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTtyZXR1cm4gdGhpcy5fYnVja2V0QnlYKEQsQixmdW5jdGlvbihIKXtyZXR1cm4gTihJW0hdLEgsRCl9LGZ1bmN0aW9uKEgpe3JldHVybiBPKElbSF0sSCxEKX0pfTtHLnByb3RvdHlwZS5fYnVja2V0QnlYPWZ1bmN0aW9uKEQsQixJLE4pe3ZhciBPPVtdO0Q9RC5kYXRhKCk7Zm9yKHZhciBIPW51bGwsSz0wO0s8PUIubGVuZ3RoOysrSyl7dmFyIE09QltLXTtpZihudWxsIT1EW01dKXt2YXIgTD1NYXRoLmZsb29yKEkoTSkpLFE9TihNKTtudWxsPT1IP0g9bmV3IHguQnVja2V0KE0sTCxRKTpILmlzSW5CdWNrZXQoTCk/SC5hZGRUb0J1Y2tldChRLApNKTooTy5wdXNoLmFwcGx5KE8sSC5nZXRVbmlxdWVJbmRpY2VzKCkpLEg9bmV3IHguQnVja2V0KE0sTCxRKSl9fW51bGwhPUgmJk8ucHVzaC5hcHBseShPLEguZ2V0VW5pcXVlSW5kaWNlcygpKTtyZXR1cm4gT307cmV0dXJuIEd9KGguWFlQbG90KTtmLkxpbmU9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMSksbD1oKDI2KSxwPWgoMCksbT1bMCwxXTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXt2YXIgdT1uLmNhbGwodGhpcyl8fHRoaXM7dS5fcmFuZ2U9WzAsMV07dS5fZDNTY2FsZT10LnNjYWxlQmFuZCgpO3UuX2QzU2NhbGUucmFuZ2UobSk7CnUuX2QzVHJhbnNmb3JtYXRpb25TY2FsZT10LnNjYWxlTGluZWFyKCk7dS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbihtKTt1Ll9pbm5lclBhZGRpbmc9cS5fY29udmVydFRvUGxvdHRhYmxlSW5uZXJQYWRkaW5nKCk7dS5fb3V0ZXJQYWRkaW5nPXEuX2NvbnZlcnRUb1Bsb3R0YWJsZU91dGVyUGFkZGluZygpO3JldHVybiB1fWsocSxuKTtxLnByb3RvdHlwZS5jbG9uZVdpdGhvdXRQcm92aWRlcnM9ZnVuY3Rpb24oKXt2YXIgdT0obmV3IHEpLmRvbWFpbih0aGlzLmRvbWFpbigpKS5yYW5nZSh0aGlzLnJhbmdlKCkpLmlubmVyUGFkZGluZyh0aGlzLmlubmVyUGFkZGluZygpKS5vdXRlclBhZGRpbmcodGhpcy5vdXRlclBhZGRpbmcoKSk7dS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKCkpO3JldHVybiB1fTtxLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbih1KXtyZXR1cm4gcC5BcnJheS51bmlxKHUpfTsKcS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBwLkFycmF5LnVuaXEodGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKSl9O3EucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbih1KXtyZXR1cm4gbi5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyx1KX07cS5wcm90b3R5cGUuaW52ZXJ0UmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdSx4PXRoaXM7dm9pZCAwPT09dSYmKHU9dGhpcy5yYW5nZSgpKTt2YXIgQT10aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpLHk9dGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHVbMF0pLHc9dGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHVbMV0pO3U9dGhpcy5fZDNTY2FsZS5kb21haW4oKTt2YXIgQz11Lm1hcChmdW5jdGlvbihHKXtyZXR1cm4geC5fZDNTY2FsZShHKStBLzJ9KTt5PXQuYmlzZWN0KEMseSk7dz10LmJpc2VjdChDLHcpO3JldHVybiB1LnNsaWNlKHksdyl9O3EucHJvdG90eXBlLnJhbmdlPWZ1bmN0aW9uKHUpe3JldHVybiBuLnByb3RvdHlwZS5yYW5nZS5jYWxsKHRoaXMsCnUpfTtxLl9jb252ZXJ0VG9QbG90dGFibGVJbm5lclBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMS8uNy0xfTtxLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4uNS8uN307cS5wcm90b3R5cGUuX3NldEJhbmRzPWZ1bmN0aW9uKCl7dmFyIHU9MS0xLygxK3RoaXMuaW5uZXJQYWRkaW5nKCkpLHg9dGhpcy5vdXRlclBhZGRpbmcoKS8oMSt0aGlzLmlubmVyUGFkZGluZygpKTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdJbm5lcih1KTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdPdXRlcih4KX07cS5wcm90b3R5cGUucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkpfTtxLnByb3RvdHlwZS5zdGVwV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzY2FsZUJhbmQodGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSooMSt0aGlzLmlubmVyUGFkZGluZygpKSl9O3EucHJvdG90eXBlLnRpY2tzPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtxLnByb3RvdHlwZS5pbm5lclBhZGRpbmc9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5faW5uZXJQYWRkaW5nO3RoaXMuX2lubmVyUGFkZGluZz11O3RoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5vdXRlclBhZGRpbmc9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fb3V0ZXJQYWRkaW5nO3RoaXMuX291dGVyUGFkZGluZz11O3RoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih1KXt1PXRoaXMuX2QzU2NhbGUodSkrdGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKS8yO3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodSl9O3EucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odSx4KXt2YXIgQT10aGlzOwp0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcChmdW5jdGlvbih5KXtyZXR1cm4gQS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChsLnpvb21PdXQoeSx1LHgpKX0pKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5wYW49ZnVuY3Rpb24odSl7dmFyIHg9dGhpczt0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcChmdW5jdGlvbihBKXtyZXR1cm4geC5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChBK3UpfSkpO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9O3EucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odSl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSh1KX07cS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih1KXtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydCh1KX07CnEucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG19O3EucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4oKX07cS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24odSl7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih1KTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTtxLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4odSk7dGhpcy5fc2V0QmFuZHMoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhbmdlfTsKcS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHUpe3RoaXMuX3JhbmdlPXU7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLnJhbmdlKHUpO3RoaXMuX3NldEJhbmRzKCl9O3EucHJvdG90eXBlLl9yZXNjYWxlQmFuZD1mdW5jdGlvbih1KXtyZXR1cm4gTWF0aC5hYnModGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHUpLXRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSgwKSl9O3JldHVybiBxfShoKDE3KS5TY2FsZSk7Zi5DYXRlZ29yeT1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh3KXt0cnl7dmFyIEM9dy5ub2RlKCkuZ2V0QkJveCgpfWNhdGNoKEcpe0M9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH19cmV0dXJuIEN9ZnVuY3Rpb24gdCh3KXtpZigibnVtYmVyIj09PXR5cGVvZiB3KXJldHVybnttaW46dyxtYXg6d307aWYodyBpbnN0YW5jZW9mIE9iamVjdCYmIm1pbiJpbiB3JiYibWF4ImluIHcpcmV0dXJuIHc7dGhyb3cgRXJyb3IoImlucHV0ICciK3crIicgY2FuJ3QgYmUgcGFyc2VkIGFzIGFuIFJhbmdlIik7Cn1mdW5jdGlvbiBsKHcsQyl7dz13LmdldFByb3BlcnR5VmFsdWUoQyk7cmV0dXJuIHBhcnNlRmxvYXQodyl8fDB9ZnVuY3Rpb24gcCh3KXtpZihudWxsPT13fHwibm9uZSI9PT13KXJldHVybiBudWxsO3c9dy5tYXRjaChBKTtpZihudWxsPT13fHwyPncubGVuZ3RoKXJldHVybiBudWxsO3c9d1sxXS5zcGxpdCh5KS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIHBhcnNlRmxvYXQoQyl9KTtyZXR1cm4gNiE9dy5sZW5ndGg/bnVsbDp3fXZhciBtPWgoMSksbj1NYXRoO2YuY29udGFpbnM9ZnVuY3Rpb24odyxDKXtmb3IoO251bGwhPUMmJkMhPT13OylDPUMucGFyZW50Tm9kZTtyZXR1cm4gQz09PXd9O2YuZWxlbWVudEJCb3g9aztmLmVudGl0eUJvdW5kcz1mdW5jdGlvbih3KXtyZXR1cm4gdyBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/ayhtLnNlbGVjdCh3KSk6dyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50Pyh3PXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse3g6dy5sZWZ0LHk6dy50b3Asd2lkdGg6dy53aWR0aCwKaGVpZ2h0OncuaGVpZ2h0fSk6e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH19O2YuU0NSRUVOX1JFRlJFU0hfUkFURV9NSUxMSVNFQ09ORFM9MUUzLzYwO2YucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGw9ZnVuY3Rpb24odyl7bnVsbCE9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHcpOnNldFRpbWVvdXQodyxmLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTKX07Zi5lbGVtZW50V2lkdGg9ZnVuY3Rpb24odyl7dz13IGluc3RhbmNlb2YgbS5zZWxlY3Rpb24/dy5ub2RlKCk6dzt3PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHcpO3JldHVybiBsKHcsIndpZHRoIikrbCh3LCJwYWRkaW5nLWxlZnQiKStsKHcsInBhZGRpbmctcmlnaHQiKStsKHcsImJvcmRlci1sZWZ0LXdpZHRoIikrbCh3LCJib3JkZXItcmlnaHQtd2lkdGgiKX07Zi5lbGVtZW50SGVpZ2h0PWZ1bmN0aW9uKHcpe3c9dyBpbnN0YW5jZW9mIG0uc2VsZWN0aW9uPwp3Lm5vZGUoKTp3O3c9d2luZG93LmdldENvbXB1dGVkU3R5bGUodyk7cmV0dXJuIGwodywiaGVpZ2h0IikrbCh3LCJwYWRkaW5nLXRvcCIpK2wodywicGFkZGluZy1ib3R0b20iKStsKHcsImJvcmRlci10b3Atd2lkdGgiKStsKHcsImJvcmRlci1ib3R0b20td2lkdGgiKX07dmFyIHE9L3RyYW5zbGF0ZVxzKlwoXHMqKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkoPzooPzooPzpccyssP1xzKil8KD86LFxzKikpKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkpP1xzKlwpLyx1PS9yb3RhdGVccypcKFxzKigoPzpbLStdP1swLTldKlwuP1swLTldKykpXHMqXCkvLHg9L3NjYWxlXHMqXChccyooKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKSg/Oig/Oig/OlxzKyw/XHMqKXwoPzosXHMqKSkoKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKSk/XHMqXCkvO2YuZ2V0VHJhbnNsYXRlVmFsdWVzPWZ1bmN0aW9uKHcpe3c9cS5leGVjKHcuYXR0cigidHJhbnNmb3JtIikpO2lmKG51bGwhPXcpe3ZhciBDPQp3WzJdO3JldHVyblsrd1sxXSwrKHZvaWQgMD09PUM/MDpDKV19cmV0dXJuWzAsMF19O2YuZ2V0Um90YXRlPWZ1bmN0aW9uKHcpe3c9dS5leGVjKHcuYXR0cigidHJhbnNmb3JtIikpO3JldHVybiBudWxsIT13Pyt3WzFdOjB9O2YuZ2V0U2NhbGVWYWx1ZXM9ZnVuY3Rpb24odyl7dmFyIEM9eC5leGVjKHcuYXR0cigidHJhbnNmb3JtIikpO3JldHVybiBudWxsIT1DPyh3PUNbMV0sQz1DWzJdLFsrdyxudWxsPT1DPyt3OitDXSk6WzAsMF19O2YuY2xpZW50UmVjdHNPdmVybGFwPWZ1bmN0aW9uKHcsQyl7cmV0dXJuIG4uZmxvb3Iody5yaWdodCk8PW4uY2VpbChDLmxlZnQpfHxuLmNlaWwody5sZWZ0KT49bi5mbG9vcihDLnJpZ2h0KXx8bi5mbG9vcih3LmJvdHRvbSk8PW4uY2VpbChDLnRvcCl8fG4uY2VpbCh3LnRvcCk+PW4uZmxvb3IoQy5ib3R0b20pPyExOiEwfTtmLmV4cGFuZFJlY3Q9ZnVuY3Rpb24odyxDKXtyZXR1cm57bGVmdDp3LmxlZnQtQyx0b3A6dy50b3AtQyxyaWdodDp3LnJpZ2h0KwpDLGJvdHRvbTp3LmJvdHRvbStDLHdpZHRoOncud2lkdGgrMipDLGhlaWdodDp3LmhlaWdodCsyKkN9fTtmLmNsaWVudFJlY3RJbnNpZGU9ZnVuY3Rpb24odyxDKXtyZXR1cm4gbi5mbG9vcihDLmxlZnQpPD1uLmNlaWwody5sZWZ0KSYmbi5mbG9vcihDLnRvcCk8PW4uY2VpbCh3LnRvcCkmJm4uZmxvb3Iody5yaWdodCk8PW4uY2VpbChDLnJpZ2h0KSYmbi5mbG9vcih3LmJvdHRvbSk8PW4uY2VpbChDLmJvdHRvbSl9O2YuaW50ZXJzZWN0c0JCb3g9ZnVuY3Rpb24odyxDLEcsRCl7dm9pZCAwPT09RCYmKEQ9LjUpO3c9dCh3KTtDPXQoQyk7cmV0dXJuIEcueCtHLndpZHRoPj13Lm1pbi1EJiZHLng8PXcubWF4K0QmJkcueStHLmhlaWdodD49Qy5taW4tRCYmRy55PD1DLm1heCtEfTtmLmdldEh0bWxFbGVtZW50QW5jZXN0b3JzPWZ1bmN0aW9uKHcpe2Zvcih2YXIgQz1bXTt3JiZ3IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7KUMucHVzaCh3KSx3PXcucGFyZW50RWxlbWVudDtyZXR1cm4gQ307CmYuZ2V0RWxlbWVudFRyYW5zZm9ybT1mdW5jdGlvbih3KXt3PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHcsbnVsbCk7dz13LmdldFByb3BlcnR5VmFsdWUoIi13ZWJraXQtdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgiLW1vei10cmFuc2Zvcm0iKXx8dy5nZXRQcm9wZXJ0eVZhbHVlKCItbXMtdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgiLW8tdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIik7cmV0dXJuIHAodyl9O3ZhciBBPS9ebWF0cml4XCgoW14pXSspXCkkLyx5PS9bLCBdKy99LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHUseCl7cmV0dXJuW3VbMF0qeFswXSt1WzJdKnhbMV0sdVsxXSp4WzBdK3VbM10qeFsxXSx1WzBdKnhbMl0rdVsyXSp4WzNdLHVbMV0qeFsyXSt1WzNdKnhbM10sdVswXSp4WzRdK3VbMl0qeFs1XSt1WzRdLHVbMV0qeFs0XSt1WzNdKnhbNV0rdVs1XV19ZnVuY3Rpb24gdCh1LHgpe3JldHVyblt1WzBdLAp1WzFdLHVbMl0sdVszXSx1WzBdKnhbMF0rdVsyXSp4WzFdK3VbNF0sdVsxXSp4WzBdK3VbM10qeFsxXSt1WzVdXX1mdW5jdGlvbiBsKHUpe3ZhciB4PXVbMF0qdVszXS11WzFdKnVbMl07aWYoMD09PXgpdGhyb3cgRXJyb3IoInNpbmd1bGFyIG1hdHJpeCIpO3g9MS94O3JldHVyblt4KnVbM10seCotdVsxXSx4Ki11WzJdLHgqdVswXSx4KigtdVszXSp1WzRdK3VbMl0qdVs1XSkseCoodVsxXSp1WzRdKy11WzBdKnVbNV0pXX12YXIgcD1oKDEpLG09aCg1NSksbj1NYXRoLHE9WzEsMCwwLDEsMCwwXTtmLmluUmFuZ2U9ZnVuY3Rpb24odSx4LEEpe3JldHVybiBuLm1pbih4LEEpPD11JiZ1PD1uLm1heCh4LEEpfTtmLmNsYW1wPWZ1bmN0aW9uKHUseCxBKXtyZXR1cm4gbi5taW4obi5tYXgoeCx1KSxBKX07Zi5tYXg9ZnVuY3Rpb24odSx4LEEpe3ZhciB5PSJmdW5jdGlvbiI9PT10eXBlb2YgeD94Om51bGw7eD1udWxsPT15P3g6QTt1PW51bGw9PXk/cC5tYXgodSk6cC5tYXgodSx5KTtyZXR1cm4gdm9pZCAwIT09CnU/dTp4fTtmLm1pbj1mdW5jdGlvbih1LHgsQSl7dmFyIHk9ImZ1bmN0aW9uIj09PXR5cGVvZiB4P3g6bnVsbDt4PW51bGw9PXk/eDpBO3U9bnVsbD09eT9wLm1pbih1KTpwLm1pbih1LHkpO3JldHVybiB2b2lkIDAhPT11P3U6eH07Zi5pc05hTj1mdW5jdGlvbih1KXtyZXR1cm4gdSE9PXV9O2YuaXNWYWxpZE51bWJlcj1mdW5jdGlvbih1KXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiB1JiYxPnUtdX07Zi5yYW5nZT1mdW5jdGlvbih1LHgsQSl7dm9pZCAwPT09QSYmKEE9MSk7aWYoMD09PUEpdGhyb3cgRXJyb3IoInN0ZXAgY2Fubm90IGJlIDAiKTt4PW4ubWF4KG4uY2VpbCgoeC11KS9BKSwwKTtmb3IodmFyIHk9W10sdz0wO3c8eDsrK3cpeVt3XT11K0EqdztyZXR1cm4geX07Zi5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odSx4KXtyZXR1cm4gbi5wb3coeC55LXUueSwyKStuLnBvdyh4LngtdS54LDIpfTtmLmRlZ3JlZXNUb1JhZGlhbnM9ZnVuY3Rpb24odSl7cmV0dXJuIHUvMzYwKgpuLlBJKjJ9O2Yud2l0aGluPWZ1bmN0aW9uKHUseCl7cmV0dXJuIHgudG9wTGVmdC54PD11LngmJnguYm90dG9tUmlnaHQueD49dS54JiZ4LnRvcExlZnQueTw9dS55JiZ4LmJvdHRvbVJpZ2h0Lnk+PXUueX07Zi5ib3VuZHNJbnRlcnNlY3RzPWZ1bmN0aW9uKHUseCxBLHksdyxDKXtyZXR1cm4gdTw9MCt3JiYwPD11K0EmJng8PTArQyYmMDw9eCt5fTtmLmdldEN1bXVsYXRpdmVUcmFuc2Zvcm09ZnVuY3Rpb24odSl7dT1tLmdldEh0bWxFbGVtZW50QW5jZXN0b3JzKHUpO2Zvcih2YXIgeD1xLEE9bnVsbCx5PTA7eTx1Lmxlbmd0aDt5Kyspe3ZhciB3PXVbeV0sQz1tLmdldEVsZW1lbnRUcmFuc2Zvcm0odyk7aWYobnVsbCE9Qyl7dmFyIEc9dy5jbGllbnRXaWR0aC8yLEQ9dy5jbGllbnRIZWlnaHQvMjt4PXQoeCxbRyxEXSk7eD1rKHgsbChDKSk7eD10KHgsWy1HLC1EXSl9Qz13LnNjcm9sbExlZnQ7Rz13LnNjcm9sbFRvcDtpZihudWxsPT09QXx8dz09PUEpQy09dy5vZmZzZXRMZWZ0K3cuY2xpZW50TGVmdCwKRy09dy5vZmZzZXRUb3Ardy5jbGllbnRUb3AsQT13Lm9mZnNldFBhcmVudDt4PXQoeCxbQyxHXSl9cmV0dXJuIHh9O2YubXVsdGlwbHlNYXRyaXg9aztmLnByZW11bHRpcGx5VHJhbnNsYXRlPWZ1bmN0aW9uKHUseCl7cmV0dXJuW3hbMF0seFsxXSx4WzJdLHhbM10seFs0XSt1WzBdLHhbNV0rdVsxXV19O2YubXVsdGlwbHlUcmFuc2xhdGU9dDtmLmludmVydE1hdHJpeD1sO2YuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24odSx4KXtyZXR1cm57eDp1WzBdKngueCt1WzJdKngueSt1WzRdLHk6dVsxXSp4LngrdVszXSp4LnkrdVs1XX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9bmV3IChoKDExNCkuU3BsaXRTdHJhdGVneUxpbmVhcik7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHAobSxuKXt2b2lkIDA9PT1tJiYobT01KTt2b2lkIDA9PT1uJiYobj1rKTt0aGlzLm1heE5vZGVDaGlsZHJlbj1tO3RoaXMuc3BsaXRTdHJhdGVneT1uO3RoaXMucm9vdD1uZXcgdCghMCk7dGhpcy5zaXplPTB9cC5wcm90b3R5cGUuZ2V0Um9vdD0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290fTtwLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMucm9vdD1uZXcgdCghMCk7dGhpcy5zaXplPTB9O3AucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihtLG4pe2Zvcih2YXIgcT10aGlzLnJvb3Q7IXEubGVhZjspcT1xLnN1YnRyZWUobSk7bT10LnZhbHVlTm9kZShtLG4pO3EuaW5zZXJ0KG0pO2Zvcih0aGlzLnNpemUrPTE7cS5vdmVyZmxvdyh0aGlzLm1heE5vZGVDaGlsZHJlbik7KXE9cS5zcGxpdCh0aGlzLnNwbGl0U3RyYXRlZ3kpLG51bGw9PXEucGFyZW50JiYodGhpcy5yb290PXEpfTtwLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMucXVlcnkoZnVuY3Rpb24obil7cmV0dXJuIG4uY29udGFpbnMobSl9KX07cC5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyhuLG0pfSl9O3AucHJvdG90eXBlLmludGVyc2VjdFg9CmZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcFgobixtKX0pfTtwLnByb3RvdHlwZS5pbnRlcnNlY3RZPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcFkobixtKX0pfTtwLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbihtKXt2YXIgbj1bXTtpZihudWxsIT10aGlzLnJvb3QuYm91bmRzJiYhbSh0aGlzLnJvb3QuYm91bmRzKSlyZXR1cm4gbjtmb3IodmFyIHE9W3RoaXMucm9vdF07MDxxLmxlbmd0aDspZm9yKHZhciB1PXEuc2hpZnQoKSx4PTA7eDx1LmVudHJpZXMubGVuZ3RoO3grKyl7dmFyIEE9dS5lbnRyaWVzW3hdO20oQS5ib3VuZHMpJiYodS5sZWFmP24ucHVzaChBLnZhbHVlKTpxLnB1c2goQSkpfXJldHVybiBufTtyZXR1cm4gcH0oKTtmLlJUcmVlPWQ7dmFyIHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBwKG0pe3RoaXMubGVhZj1tO3RoaXMuYm91bmRzPQpudWxsO3RoaXMuZW50cmllcz1bXTt0aGlzLnZhbHVlPXRoaXMucGFyZW50PW51bGx9cC52YWx1ZU5vZGU9ZnVuY3Rpb24obSxuKXt2YXIgcT1uZXcgcCghMCk7cS5ib3VuZHM9bTtxLnZhbHVlPW47cmV0dXJuIHF9O3AucHJvdG90eXBlLm92ZXJmbG93PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoPm19O3AucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihtKXt0aGlzLmVudHJpZXMucHVzaChtKTttLnBhcmVudD10aGlzO2Zvcih2YXIgbj10aGlzO251bGwhPW47KW4uYm91bmRzPWwudW5pb25BbGwoW24uYm91bmRzLG0uYm91bmRzXSksbj1uLnBhcmVudH07cC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKG0pe209dGhpcy5lbnRyaWVzLmluZGV4T2YobSk7aWYoMDw9bSlmb3IodGhpcy5lbnRyaWVzLnNwbGljZShtLDEpLG09dGhpcztudWxsIT1tOyltLmJvdW5kcz1sLnVuaW9uQWxsKG0uZW50cmllcy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4uYm91bmRzfSkpLAptPW0ucGFyZW50O3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5zdWJ0cmVlPWZ1bmN0aW9uKG0pe2Zvcih2YXIgbj1udWxsLHE9MDtxPHRoaXMuZW50cmllcy5sZW5ndGg7cSsrKXt2YXIgdT10aGlzLmVudHJpZXNbcV0seD11LnVuaW9uQXJlYURpZmZlcmVuY2UobSk7aWYoSW5maW5pdHk+eHx8SW5maW5pdHk9PT14JiZudWxsIT1uJiZ1LmVudHJpZXMubGVuZ3RoPG4uZW50cmllcy5sZW5ndGgpbj11fXJldHVybiBufTtwLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihtKXtudWxsIT10aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpO3ZhciBuPVtuZXcgcCh0aGlzLmxlYWYpLG5ldyBwKHRoaXMubGVhZildO20uc3BsaXQodGhpcy5lbnRyaWVzLG4pO209bnVsbCE9dGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQ6bmV3IHAoITEpO20uaW5zZXJ0KG5bMF0pO20uaW5zZXJ0KG5bMV0pO3JldHVybiBtfTtwLnByb3RvdHlwZS51bmlvbkFyZWFEaWZmZXJlbmNlPWZ1bmN0aW9uKG0pe3JldHVybiBNYXRoLmFicyhsLnVuaW9uKHRoaXMuYm91bmRzLAptKS5hcmVhKCktdGhpcy5ib3VuZHMuYXJlYSgpKX07cC5wcm90b3R5cGUubWF4RGVwdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZWFmPzE6MSt0aGlzLmVudHJpZXMubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBtLm1heERlcHRoKCl9KS5yZWR1Y2UoZnVuY3Rpb24obSxuKXtyZXR1cm4gTWF0aC5tYXgobSxuKX0pfTtyZXR1cm4gcH0oKTtmLlJUcmVlTm9kZT10O3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChtLG4scSx1KXt0aGlzLnhsPW07dGhpcy55bD1uO3RoaXMueGg9cTt0aGlzLnloPXU7dGhpcy53aWR0aD10aGlzLnhoLXRoaXMueGw7dGhpcy5oZWlnaHQ9dGhpcy55aC10aGlzLnlsfXAueHl3aD1mdW5jdGlvbihtLG4scSx1KXtyZXR1cm4gbmV3IHAobSxuLG0rcSxuK3UpfTtwLmVudGl0eUJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gbmV3IHAobS54LG0ueSxtLngrbS53aWR0aCxtLnkrbS5oZWlnaHQpfTtwLmJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gcC5wb2ludFBhaXIobS50b3BMZWZ0LAptLmJvdHRvbVJpZ2h0KX07cC5wb2ludFBhaXI9ZnVuY3Rpb24obSxuKXtyZXR1cm4gbmV3IHAoTWF0aC5taW4obS54LG4ueCksTWF0aC5taW4obS55LG4ueSksTWF0aC5tYXgobS54LG4ueCksTWF0aC5tYXgobS55LG4ueSkpfTtwLnBvaW50cz1mdW5jdGlvbihtKXtpZigyPm0ubGVuZ3RoKXRocm93IEVycm9yKCJuZWVkIGF0IGxlYXN0IDIgcG9pbnRzIHRvIGNyZWF0ZSBib3VuZHMiKTt2YXIgbj1tLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS54fSk7bT1tLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS55fSk7cmV0dXJuIG5ldyBwKG4ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWluKHEsdSl9KSxtLnJlZHVjZShmdW5jdGlvbihxLHUpe3JldHVybiBNYXRoLm1pbihxLHUpfSksbi5yZWR1Y2UoZnVuY3Rpb24ocSx1KXtyZXR1cm4gTWF0aC5tYXgocSx1KX0pLG0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdSl9KSl9O3AudW5pb249ZnVuY3Rpb24obSwKbil7cmV0dXJuIG5ldyBwKE1hdGgubWluKG0ueGwsbi54bCksTWF0aC5taW4obS55bCxuLnlsKSxNYXRoLm1heChtLnhoLG4ueGgpLE1hdGgubWF4KG0ueWgsbi55aCkpfTtwLnVuaW9uQWxsPWZ1bmN0aW9uKG0pe209bS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPW59KTtyZXR1cm4gMD09PW0ubGVuZ3RoP251bGw6bS5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gcC51bmlvbihuLHEpfSl9O3AuaXNCb3VuZHNPdmVybGFwQm91bmRzPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHAuaXNCb3VuZHNPdmVybGFwWChtLG4pJiZwLmlzQm91bmRzT3ZlcmxhcFkobSxuKX07cC5pc0JvdW5kc092ZXJsYXBYPWZ1bmN0aW9uKG0sbil7cmV0dXJuIShtLnhoPG4ueGwpJiYhKG0ueGw+bi54aCl9O3AuaXNCb3VuZHNPdmVybGFwWT1mdW5jdGlvbihtLG4pe3JldHVybiEobS55aDxuLnlsKSYmIShtLnlsPm4ueWgpfTtwLnByb3RvdHlwZS5hcmVhPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5hcmVhQ2FjaGVkJiYKKHRoaXMuYXJlYUNhY2hlZD0odGhpcy54aC10aGlzLnhsKSoodGhpcy55aC10aGlzLnlsKSk7cmV0dXJuIHRoaXMuYXJlYUNhY2hlZH07cC5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMueGw8PW0ueCYmdGhpcy54aD49bS54JiZ0aGlzLnlsPD1tLnkmJnRoaXMueWg+PW0ueX07cmV0dXJuIHB9KCk7Zi5SVHJlZUJvdW5kcz1sfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuU2V0P3RoaXMuX2VzNlNldD1uZXcgd2luZG93LlNldDp0aGlzLl92YWx1ZXM9W107dGhpcy5zaXplPTB9aC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGspe2lmKG51bGwhPXRoaXMuX2VzNlNldClyZXR1cm4gdGhpcy5fZXM2U2V0LmFkZChrKSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsdGhpczt0aGlzLmhhcyhrKXx8KHRoaXMuX3ZhbHVlcy5wdXNoKGspLHRoaXMuc2l6ZT10aGlzLl92YWx1ZXMubGVuZ3RoKTsKcmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihrKXtpZihudWxsIT10aGlzLl9lczZTZXQpcmV0dXJuIGs9dGhpcy5fZXM2U2V0LmRlbGV0ZShrKSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsaztrPXRoaXMuX3ZhbHVlcy5pbmRleE9mKGspO3JldHVybi0xIT09az8odGhpcy5fdmFsdWVzLnNwbGljZShrLDEpLHRoaXMuc2l6ZT10aGlzLl92YWx1ZXMubGVuZ3RoLCEwKTohMX07aC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGspe3JldHVybiBudWxsIT10aGlzLl9lczZTZXQ/dGhpcy5fZXM2U2V0LmhhcyhrKTotMSE9PXRoaXMuX3ZhbHVlcy5pbmRleE9mKGspfTtoLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGssdCl7dmFyIGw9dGhpcztudWxsIT10aGlzLl9lczZTZXQ/dGhpcy5fZXM2U2V0LmZvckVhY2goZnVuY3Rpb24ocCxtKXtyZXR1cm4gay5jYWxsKHQscCxtLGwpfSx0KTp0aGlzLl92YWx1ZXMuZm9yRWFjaChmdW5jdGlvbihwKXtrLmNhbGwodCwKcCxwLGwpfSl9O3JldHVybiBofSgpO2YuU2V0PWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgxMzEpKTtrKGgoMTMwKSl9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0sdD1oKDIxKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2YXIgcT1sLmNhbGwodGhpcyxtLG4pfHx0aGlzO3EuY2FjaGU9bmV3IHQuQ2FjaGUoZnVuY3Rpb24odSl7cmV0dXJuIHEuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGUodSl9KTtyZXR1cm4gcX1rKHAsbCk7cC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGU9CmZ1bmN0aW9uKG0pe3JldHVybiBsLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlci5jYWxsKHRoaXMsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLmNhY2hlLmdldChtKX07cC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlLmNsZWFyKCl9O3JldHVybiBwfShoKDYxKS5DaGFyYWN0ZXJNZWFzdXJlcik7Zi5DYWNoZUNoYXJhY3Rlck1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwKdGhpc31rKGwsdCk7bC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXI9ZnVuY3Rpb24ocCl7cmV0dXJuIHQucHJvdG90eXBlLl9tZWFzdXJlTGluZS5jYWxsKHRoaXMscCl9O2wucHJvdG90eXBlLl9tZWFzdXJlTGluZT1mdW5jdGlvbihwKXt2YXIgbT10aGlzO3A9cC5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBtLl9tZWFzdXJlQ2hhcmFjdGVyKG4pfSk7cmV0dXJue2hlaWdodDpwLnJlZHVjZShmdW5jdGlvbihuLHEpe3JldHVybiBNYXRoLm1heChuLHEuaGVpZ2h0KX0sMCksd2lkdGg6cC5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gbitxLndpZHRofSwwKX19O3JldHVybiBsfShoKDYzKS5NZWFzdXJlcik7Zi5DaGFyYWN0ZXJNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoMzYpKTtrKGgoNjApKTtrKGgoMTMyKSk7ayhoKDYxKSk7ayhoKDYzKSl9LApmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgzNik7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7dm9pZCAwPT09biYmKG49ITEpO209bC5jYWxsKHRoaXMsbSl8fHRoaXM7bS51c2VHdWFyZHM9bjtyZXR1cm4gbX1rKHAsbCk7cC5wcm90b3R5cGUuX2FkZEd1YXJkcz1mdW5jdGlvbihtKXtyZXR1cm4gdC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUK20rdC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUfTtwLnByb3RvdHlwZS5fbWVhc3VyZUxpbmU9ZnVuY3Rpb24obSl7dmFyIG47dm9pZCAwPT09biYmKG49ITEpO249dGhpcy51c2VHdWFyZHN8fApufHwvXltcdCBdJC8udGVzdChtKTttPWwucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLG4/dGhpcy5fYWRkR3VhcmRzKG0pOm0pO20ud2lkdGgtPW4/Mip0aGlzLmdldEd1YXJkV2lkdGgoKTowO3JldHVybiBtfTtwLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKG0pe3ZhciBuPXRoaXM7dm9pZCAwPT09bSYmKG09dC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUKTtpZigiIj09PW0udHJpbSgpKXJldHVybnt3aWR0aDowLGhlaWdodDowfTttPW0udHJpbSgpLnNwbGl0KCJcbiIpLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUxpbmUocSl9KTtyZXR1cm57aGVpZ2h0Om0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIHErdS5oZWlnaHR9LDApLHdpZHRoOm0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdS53aWR0aCl9LDApfX07cC5wcm90b3R5cGUuZ2V0R3VhcmRXaWR0aD1mdW5jdGlvbigpe251bGw9PXRoaXMuZ3VhcmRXaWR0aCYmCih0aGlzLmd1YXJkV2lkdGg9bC5wcm90b3R5cGUubWVhc3VyZS5jYWxsKHRoaXMpLndpZHRoKTtyZXR1cm4gdGhpcy5ndWFyZFdpZHRofTtyZXR1cm4gcH0odC5BYnN0cmFjdE1lYXN1cmVyKTtmLk1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgxMzgpKTtrKGgoNjUpKX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMjEpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5tYXhMaW5lcyhJbmZpbml0eSk7dGhpcy50ZXh0VHJpbW1pbmcoKTt0aGlzLmFsbG93QnJlYWtpbmdXb3JkcygpO3RoaXMuX3Rva2VuaXplcj1uZXcgay5Ub2tlbml6ZXI7dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI9Ii0ifXQucHJvdG90eXBlLm1heExpbmVzPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX21heExpbmVzO3RoaXMuX21heExpbmVzPWw7cmV0dXJuIHRoaXN9Owp0LnByb3RvdHlwZS50ZXh0VHJpbW1pbmc9ZnVuY3Rpb24oKXt0aGlzLl90ZXh0VHJpbW1pbmc9ImVsbGlwc2lzIn07dC5wcm90b3R5cGUuYWxsb3dCcmVha2luZ1dvcmRzPWZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dCcmVha2luZ1dvcmRzPSEwfTt0LnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKGwscCxtLG4pe3ZhciBxPXRoaXM7dm9pZCAwPT09biYmKG49SW5maW5pdHkpO3ZhciB1PXtub0Jyb2tlV29yZHM6MCxub0xpbmVzOjAsb3JpZ2luYWxUZXh0OmwsdHJ1bmNhdGVkVGV4dDoiIix3cmFwcGVkVGV4dDoiIn07bT17YXZhaWxhYmxlTGluZXM6TWF0aC5taW4oTWF0aC5mbG9vcihuL3AubWVhc3VyZSgpLmhlaWdodCksdGhpcy5fbWF4TGluZXMpLGF2YWlsYWJsZVdpZHRoOm0sY2FuRml0VGV4dDohMCxjdXJyZW50TGluZToiIix3cmFwcGluZzp1fTt2YXIgeD1sLnNwbGl0KCJcbiIpO3JldHVybiB4LnJlZHVjZShmdW5jdGlvbihBLHksdyl7cmV0dXJuIHEuYnJlYWtMaW5lVG9GaXRXaWR0aChBLAp5LHchPT14Lmxlbmd0aC0xLHApfSxtKS53cmFwcGluZ307dC5wcm90b3R5cGUuYnJlYWtMaW5lVG9GaXRXaWR0aD1mdW5jdGlvbihsLHAsbSxuKXt2YXIgcT10aGlzO2wuY2FuRml0VGV4dHx8IiI9PT1sLndyYXBwaW5nLnRydW5jYXRlZFRleHR8fChsLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPSJcbiIpO2w9dGhpcy5fdG9rZW5pemVyLnRva2VuaXplKHApLnJlZHVjZShmdW5jdGlvbih1LHgpe3JldHVybiBxLndyYXBOZXh0VG9rZW4oeCx1LG4pfSxsKTtwPWsuU3RyaW5nTWV0aG9kcy50cmltRW5kKGwuY3VycmVudExpbmUpO2wud3JhcHBpbmcubm9MaW5lcys9KygiIiE9PXApO2wud3JhcHBpbmcubm9MaW5lcz09PWwuYXZhaWxhYmxlTGluZXMmJiJub25lIiE9PXRoaXMuX3RleHRUcmltbWluZyYmbT9sLmNhbkZpdFRleHQ9ITE6bC53cmFwcGluZy53cmFwcGVkVGV4dCs9cDtsLmN1cnJlbnRMaW5lPSJcbiI7cmV0dXJuIGx9O3QucHJvdG90eXBlLmNhbkZpdFRva2VuPWZ1bmN0aW9uKGwsCnAsbSl7dmFyIG49dGhpcyxxPXRoaXMuX2FsbG93QnJlYWtpbmdXb3Jkcz9sLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24odSx4KXtyZXR1cm4geCE9PWwubGVuZ3RoLTE/dStuLl9icmVha2luZ0NoYXJhY3Rlcjp1fSk6W2xdO3JldHVybiBtLm1lYXN1cmUobCkud2lkdGg8PXB8fHEuZXZlcnkoZnVuY3Rpb24odSl7cmV0dXJuIG0ubWVhc3VyZSh1KS53aWR0aDw9cH0pfTt0LnByb3RvdHlwZS5hZGRFbGxpcHNpcz1mdW5jdGlvbihsLHAsbSl7aWYoIm5vbmUiPT09dGhpcy5fdGV4dFRyaW1taW5nKXJldHVybntyZW1haW5pbmdUb2tlbjoiIix3cmFwcGVkVG9rZW46bH07dmFyIG49bC5zdWJzdHJpbmcoMCkudHJpbSgpLHE9bS5tZWFzdXJlKG4pLndpZHRoLHU9bS5tZWFzdXJlKCIuLi4iKS53aWR0aCx4PTA8bC5sZW5ndGgmJiJcbiI9PT1sWzBdPyJcbiI6IiI7aWYocDw9dSlyZXR1cm57cmVtYWluaW5nVG9rZW46bCx3cmFwcGVkVG9rZW46eCsiLi4uIi5zdWJzdHIoMCxNYXRoLmZsb29yKHAvCih1LzMpKSl9O2Zvcig7cSt1PnA7KW49ay5TdHJpbmdNZXRob2RzLnRyaW1FbmQobi5zdWJzdHIoMCxuLmxlbmd0aC0xKSkscT1tLm1lYXN1cmUobikud2lkdGg7cmV0dXJue3JlbWFpbmluZ1Rva2VuOmsuU3RyaW5nTWV0aG9kcy50cmltRW5kKGwuc3Vic3RyaW5nKG4ubGVuZ3RoKSwiLSIpLnRyaW0oKSx3cmFwcGVkVG9rZW46eCtuKyIuLi4ifX07dC5wcm90b3R5cGUud3JhcE5leHRUb2tlbj1mdW5jdGlvbihsLHAsbSl7aWYoIXAuY2FuRml0VGV4dHx8cC5hdmFpbGFibGVMaW5lcz09PXAud3JhcHBpbmcubm9MaW5lc3x8IXRoaXMuY2FuRml0VG9rZW4obCxwLmF2YWlsYWJsZVdpZHRoLG0pKXJldHVybiB0aGlzLmZpbmlzaFdyYXBwaW5nKGwscCxtKTtmb3IoO2w7KXt2YXIgbj10aGlzLmJyZWFrVG9rZW5Ub0ZpdEluV2lkdGgobCxwLmN1cnJlbnRMaW5lLHAuYXZhaWxhYmxlV2lkdGgsbSk7cC5jdXJyZW50TGluZT1uLmxpbmU7bD1uLnJlbWFpbmluZ1Rva2VuO2lmKG51bGwhPWwpaWYocC53cmFwcGluZy5ub0Jyb2tlV29yZHMrPQorbi5icmVha1dvcmQsKytwLndyYXBwaW5nLm5vTGluZXMscC5hdmFpbGFibGVMaW5lcz09PXAud3JhcHBpbmcubm9MaW5lcyl7bT10aGlzLmFkZEVsbGlwc2lzKHAuY3VycmVudExpbmUscC5hdmFpbGFibGVXaWR0aCxtKTtwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1tLndyYXBwZWRUb2tlbjtwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPW0ucmVtYWluaW5nVG9rZW4rbDtwLmN1cnJlbnRMaW5lPSJcbiI7YnJlYWt9ZWxzZSBwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1rLlN0cmluZ01ldGhvZHMudHJpbUVuZChwLmN1cnJlbnRMaW5lKSxwLmN1cnJlbnRMaW5lPSJcbiJ9cmV0dXJuIHB9O3QucHJvdG90eXBlLmZpbmlzaFdyYXBwaW5nPWZ1bmN0aW9uKGwscCxtKXtwLmNhbkZpdFRleHQmJnAuYXZhaWxhYmxlTGluZXMhPT1wLndyYXBwaW5nLm5vTGluZXMmJnRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcyYmIm5vbmUiIT09dGhpcy5fdGV4dFRyaW1taW5nPyhtPXRoaXMuYWRkRWxsaXBzaXMocC5jdXJyZW50TGluZSsKbCxwLmF2YWlsYWJsZVdpZHRoLG0pLHAud3JhcHBpbmcud3JhcHBlZFRleHQrPW0ud3JhcHBlZFRva2VuLHAud3JhcHBpbmcudHJ1bmNhdGVkVGV4dCs9bS5yZW1haW5pbmdUb2tlbixwLndyYXBwaW5nLm5vQnJva2VXb3Jkcys9KyhtLnJlbWFpbmluZ1Rva2VuLmxlbmd0aDxsLmxlbmd0aCkscC53cmFwcGluZy5ub0xpbmVzKz0rKDA8bS53cmFwcGVkVG9rZW4ubGVuZ3RoKSxwLmN1cnJlbnRMaW5lPSIiKTpwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPWw7cC5jYW5GaXRUZXh0PSExO3JldHVybiBwfTt0LnByb3RvdHlwZS5icmVha1Rva2VuVG9GaXRJbldpZHRoPWZ1bmN0aW9uKGwscCxtLG4pe2lmKHZvaWQgMD09PXEpdmFyIHE9dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI7aWYobi5tZWFzdXJlKHArbCkud2lkdGg8PW0pcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOnArbCxyZW1haW5pbmdUb2tlbjpudWxsfTtpZigiIj09PWwudHJpbSgpKXJldHVybnticmVha1dvcmQ6ITEsbGluZTpwLApyZW1haW5pbmdUb2tlbjoiIn07aWYoIXRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcylyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6cCxyZW1haW5pbmdUb2tlbjpsfTtmb3IodmFyIHU9MDt1PGwubGVuZ3RoOylpZihuLm1lYXN1cmUocCtsLnN1YnN0cmluZygwLHUrMSkrcSkud2lkdGg8PW0pKyt1O2Vsc2UgYnJlYWs7bT0iIjswPHUmJihtPXEpO3JldHVybnticmVha1dvcmQ6MDx1LGxpbmU6cCtsLnN1YnN0cmluZygwLHUpK20scmVtYWluaW5nVG9rZW46bC5zdWJzdHJpbmcodSl9fTtyZXR1cm4gdH0oKTtmLldyYXBwZXI9ZH0sZnVuY3Rpb24oZCxmLGgpeyhmdW5jdGlvbihrKXtmb3IodmFyIHQgaW4gaylmLmhhc093blByb3BlcnR5KHQpfHwoZlt0XT1rW3RdKX0pKGgoMTM5KSl9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCg3MikpO2soaCg3MykpO2soaCgyOCkpfSxmdW5jdGlvbihkLApmKXtmLnZlcnNpb249IjMuNy4wIn0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodyxDKXtyZXR1cm4gdy5lYWNoKGZ1bmN0aW9uKCl7dmFyIEc9Qy5hcHBseSh0aGlzLGFyZ3VtZW50cyksRD15LnNlbGVjdCh0aGlzKSxCO2ZvcihCIGluIEcpRC5hdHRyKEIsR1tCXSl9KX1mdW5jdGlvbiB0KHcsQyl7Zm9yKHZhciBHIGluIEMpdy5hdHRyKEcsQ1tHXSk7cmV0dXJuIHd9ZnVuY3Rpb24gbCh3LEMsRyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBEPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEI9eS5zZWxlY3QodGhpcyksSTtmb3IoSSBpbiBEKUIuc3R5bGUoSSxEW0ldLEcpfSl9ZnVuY3Rpb24gcCh3LEMsRyl7Zm9yKHZhciBEIGluIEMpdy5zdHlsZShELENbRF0sRyk7cmV0dXJuIHd9ZnVuY3Rpb24gbSh3LEMpe3JldHVybiB3LmVhY2goZnVuY3Rpb24oKXt2YXIgRz1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxEPXkuc2VsZWN0KHRoaXMpLEI7Zm9yKEIgaW4gRylELnByb3BlcnR5KEIsCkdbQl0pfSl9ZnVuY3Rpb24gbih3LEMpe2Zvcih2YXIgRyBpbiBDKXcucHJvcGVydHkoRyxDW0ddKTtyZXR1cm4gd31mdW5jdGlvbiBxKHcsQyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBHPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEQ9eS5zZWxlY3QodGhpcykudHJhbnNpdGlvbih3KSxCO2ZvcihCIGluIEcpRC5hdHRyKEIsR1tCXSl9KX1mdW5jdGlvbiB1KHcsQyl7Zm9yKHZhciBHIGluIEMpdy5hdHRyKEcsQ1tHXSk7cmV0dXJuIHd9ZnVuY3Rpb24geCh3LEMsRyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBEPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEI9eS5zZWxlY3QodGhpcykudHJhbnNpdGlvbih3KSxJO2ZvcihJIGluIEQpQi5zdHlsZShJLERbSV0sRyl9KX1mdW5jdGlvbiBBKHcsQyxHKXtmb3IodmFyIEQgaW4gQyl3LnN0eWxlKEQsQ1tEXSxHKTtyZXR1cm4gd312YXIgeT1kPWgoMSk7eS5zZWxlY3Rpb24ucHJvdG90eXBlLmF0dHJzPWZ1bmN0aW9uKHcpe3JldHVybigiZnVuY3Rpb24iPT09CnR5cGVvZiB3P2s6dCkodGhpcyx3KX07eS5zZWxlY3Rpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbih3KXtyZXR1cm4oImZ1bmN0aW9uIj09PXR5cGVvZiB3P2w6cCkodGhpcyx3LCIiKX07eS5zZWxlY3Rpb24ucHJvdG90eXBlLnByb3BlcnRpZXM9ZnVuY3Rpb24odyl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2Ygdz9tOm4pKHRoaXMsdyl9O2QudHJhbnNpdGlvbi5wcm90b3R5cGUuYXR0cnM9ZnVuY3Rpb24odyl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2Ygdz9xOnUpKHRoaXMsdyl9O2QudHJhbnNpdGlvbi5wcm90b3R5cGUuc3R5bGVzPWZ1bmN0aW9uKHcpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHc/eDpBKSh0aGlzLHcsIiIpfX0sZnVuY3Rpb24oZCxmLGgpe2Q9aCgxMTcpO3ZhciBrPWgoMTIpO2g9aCgxMCk7dmFyIHQ9e2xpbmVhcjpkLmVhc2VMaW5lYXIscXVhZDpkLmVhc2VRdWFkLHF1YWRJbjpkLmVhc2VRdWFkSW4scXVhZE91dDpkLmVhc2VRdWFkT3V0LApxdWFkSW5PdXQ6ZC5lYXNlUXVhZEluT3V0LGN1YmljOmQuZWFzZUN1YmljLGN1YmljSW46ZC5lYXNlQ3ViaWNJbixjdWJpY091dDpkLmVhc2VDdWJpY091dCxjdWJpY0luT3V0OmQuZWFzZUN1YmljSW5PdXQscG9seTpkLmVhc2VQb2x5LHBvbHlJbjpkLmVhc2VQb2x5SW4scG9seU91dDpkLmVhc2VQb2x5T3V0LHBvbHlJbk91dDpkLmVhc2VQb2x5SW5PdXQsc2luOmQuZWFzZVNpbixzaW5JbjpkLmVhc2VTaW5JbixzaW5PdXQ6ZC5lYXNlU2luT3V0LHNpbkluT3V0OmQuZWFzZVNpbkluT3V0LGV4cDpkLmVhc2VFeHAsZXhwSW46ZC5lYXNlRXhwSW4sZXhwT3V0OmQuZWFzZUV4cE91dCxleHBJbk91dDpkLmVhc2VFeHBJbk91dCxjaXJjbGU6ZC5lYXNlQ2lyY2xlLGNpcmNsZUluOmQuZWFzZUNpcmNsZUluLGNpcmNsZU91dDpkLmVhc2VDaXJjbGVPdXQsY2lyY2xlSW5PdXQ6ZC5lYXNlQ2lyY2xlSW5PdXQsYm91bmNlOmQuZWFzZUJvdW5jZSxib3VuY2VJbjpkLmVhc2VCb3VuY2VJbixib3VuY2VPdXQ6ZC5lYXNlQm91bmNlT3V0LApib3VuY2VJbk91dDpkLmVhc2VCb3VuY2VJbk91dCxiYWNrOmQuZWFzZUJhY2ssYmFja0luOmQuZWFzZUJhY2tJbixiYWNrT3V0OmQuZWFzZUJhY2tPdXQsYmFja0luT3V0OmQuZWFzZUJhY2tJbk91dCxlbGFzdGljOmQuZWFzZUVsYXN0aWMsZWxhc3RpY0luOmQuZWFzZUVsYXN0aWNJbixlbGFzdGljT3V0OmQuZWFzZUVsYXN0aWNPdXQsZWxhc3RpY0luT3V0OmQuZWFzZUVsYXN0aWNJbk91dH07Zi5FYXNlTmFtZT1oLm1ha2VFbnVtKCJsaW5lYXIgcXVhZCBxdWFkSW4gcXVhZE91dCBxdWFkSW5PdXQgY3ViaWMgY3ViaWNJbiBjdWJpY091dCBjdWJpY0luT3V0IHBvbHkgcG9seUluIHBvbHlPdXQgcG9seUluT3V0IHNpbiBzaW5JbiBzaW5PdXQgc2luSW5PdXQgZXhwIGV4cEluIGV4cE91dCBleHBJbk91dCBjaXJjbGUgY2lyY2xlSW4gY2lyY2xlT3V0IGNpcmNsZUluT3V0IGJvdW5jZSBib3VuY2VJbiBib3VuY2VPdXQgYm91bmNlSW5PdXQgYmFjayBiYWNrSW4gYmFja091dCBiYWNrSW5PdXQgZWxhc3RpYyBlbGFzdGljSW4gZWxhc3RpY091dCBlbGFzdGljSW5PdXQiLnNwbGl0KCIgIikpOwpoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe3RoaXMuX3N0YXJ0RGVsYXk9bC5fREVGQVVMVF9TVEFSVF9ERUxBWV9NSUxMSVNFQ09ORFM7dGhpcy5fc3RlcER1cmF0aW9uPWwuX0RFRkFVTFRfU1RFUF9EVVJBVElPTl9NSUxMSVNFQ09ORFM7dGhpcy5fc3RlcERlbGF5PWwuX0RFRkFVTFRfSVRFUkFUSVZFX0RFTEFZX01JTExJU0VDT05EUzt0aGlzLl9tYXhUb3RhbER1cmF0aW9uPWwuX0RFRkFVTFRfTUFYX1RPVEFMX0RVUkFUSU9OX01JTExJU0VDT05EUzt0aGlzLl9lYXNpbmdNb2RlPWwuX0RFRkFVTFRfRUFTSU5HX01PREV9bC5wcm90b3R5cGUudG90YWxUaW1lPWZ1bmN0aW9uKHApe3ZhciBtPXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkocCk7cmV0dXJuIHRoaXMuc3RhcnREZWxheSgpK20qTWF0aC5tYXgocC0xLDApK3RoaXMuc3RlcER1cmF0aW9uKCl9O2wucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24ocCxtKXt2YXIgbj10aGlzO3A9ay5jb2VyY2VFeHRlcm5hbEQzKHApOwp2YXIgcT1wLnNpemUoKSx1PXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkocSk7cmV0dXJuIHAudHJhbnNpdGlvbigpLmVhc2UodGhpcy5fZ2V0RWFzZUZhY3RvcnkoKSkuZHVyYXRpb24odGhpcy5zdGVwRHVyYXRpb24oKSkuZGVsYXkoZnVuY3Rpb24oeCxBKXtyZXR1cm4gbi5zdGFydERlbGF5KCkrdSpBfSkuYXR0cnMobSl9O2wucHJvdG90eXBlLnN0YXJ0RGVsYXk9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdGhpcy5fc3RhcnREZWxheTt0aGlzLl9zdGFydERlbGF5PXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnN0ZXBEdXJhdGlvbj1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiBNYXRoLm1pbih0aGlzLl9zdGVwRHVyYXRpb24sdGhpcy5fbWF4VG90YWxEdXJhdGlvbik7dGhpcy5fc3RlcER1cmF0aW9uPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnN0ZXBEZWxheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGVwRGVsYXl9O2wucHJvdG90eXBlLm1heFRvdGFsRHVyYXRpb249CmZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX21heFRvdGFsRHVyYXRpb247dGhpcy5fbWF4VG90YWxEdXJhdGlvbj1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5lYXNpbmdNb2RlPWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX2Vhc2luZ01vZGU7dGhpcy5fZWFzaW5nTW9kZT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5fZ2V0RWFzZUZhY3Rvcnk9ZnVuY3Rpb24oKXt2YXIgcD10aGlzLmVhc2luZ01vZGUoKTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBwPyhwPXRbcF0sbnVsbD09cD90LmxpbmVhcjpwKTpwfTtsLnByb3RvdHlwZS5fZ2V0QWRqdXN0ZWRJdGVyYXRpdmVEZWxheT1mdW5jdGlvbihwKXt2YXIgbT10aGlzLm1heFRvdGFsRHVyYXRpb24oKS10aGlzLnN0ZXBEdXJhdGlvbigpO209TWF0aC5tYXgobSwwKTtwPW0vTWF0aC5tYXgocC0xLDEpO3JldHVybiBNYXRoLm1pbih0aGlzLnN0ZXBEZWxheSgpLHApfTtyZXR1cm4gbH0oKTtoLl9ERUZBVUxUX1NUQVJUX0RFTEFZX01JTExJU0VDT05EUz0KMDtoLl9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTPTMwMDtoLl9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFM9MTU7aC5fREVGQVVMVF9NQVhfVE9UQUxfRFVSQVRJT05fTUlMTElTRUNPTkRTPUluZmluaXR5O2guX0RFRkFVTFRfRUFTSU5HX01PREU9ImV4cE91dCI7Zi5FYXNpbmc9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMTIpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXQucHJvdG90eXBlLnRvdGFsVGltZT1mdW5jdGlvbigpe3JldHVybiAwfTt0LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGwscCl7bD1rLmNvZXJjZUV4dGVybmFsRDMobCk7cmV0dXJuIGwuYXR0cnMocCl9O3JldHVybiB0fSgpO2YuTnVsbD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEsdSl7ZnVuY3Rpb24geCgpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIEEgaW4gdSl1Lmhhc093blByb3BlcnR5KEEpJiYKKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KTooeC5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHgpfSx0PWgoMSksbD1oKDUpLHA9aCg0KSxtPWgoMCksbj1oKDIyKTtkPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHUoeCxBKXt2b2lkIDA9PT1BJiYoQT0iYm90dG9tIik7eD1xLmNhbGwodGhpcyx4LEEpfHx0aGlzO3guX3RpY2tMYWJlbEFuZ2xlPTA7eC5fdGlja0xhYmVsU2hlYXJBbmdsZT0wO3guYWRkQ2xhc3MoImNhdGVnb3J5LWF4aXMiKTtyZXR1cm4geH1rKHUscSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHUucHJvdG90eXBlLCJfd3JhcHBlciIse2dldDpmdW5jdGlvbigpe3ZhciB4PW5ldyBsLldyYXBwZXI7bnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4TGluZXMmJngubWF4TGluZXModGhpcy5fdGlja0xhYmVsTWF4TGluZXMpO3JldHVybiB4fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LnByb3RvdHlwZSwKIl93cml0ZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHRoaXMuX3R5cGVzZXR0ZXJDb250ZXh0LHRoaXMuX3dyYXBwZXIpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO3UucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3EucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3R5cGVzZXR0ZXJDb250ZXh0PW5ldyBsLlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih0aGlzLl90eXBlc2V0dGVyQ29udGV4dCl9O3UucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVkcmF3KCl9O3UucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHgsQSl7dmFyIHk9dGhpcy5pc0hvcml6b250YWwoKT8wOnRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKSx3PXRoaXMuaXNIb3Jpem9udGFsKCk/CnRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKTowO2lmKDA9PT10aGlzLl9zY2FsZS5kb21haW4oKS5sZW5ndGgpcmV0dXJue21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O2lmKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciBDPXRoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCkqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCk7dGhpcy5pc0hvcml6b250YWwoKT93Kz1DOnkrPUN9eD10aGlzLl9tZWFzdXJlVGlja0xhYmVscyh4LEEpO3JldHVybnttaW5XaWR0aDp4LnVzZWRXaWR0aCt5LG1pbkhlaWdodDp4LnVzZWRIZWlnaHQrd319O3UucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB4PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCksQT10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMucmVxdWVzdGVkU3BhY2UodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpLm1pbkhlaWdodDp0aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSwKdGhpcy5oZWlnaHQoKSkubWluV2lkdGgseT10aGlzLm1hcmdpbigpK3RoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCk7cmV0dXJuIE1hdGgubWluKEEteSx4KX07dS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXREb3duc2FtcGxlSW5mbygpLmRvbWFpbn07dS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24oeCxBKXtyZXR1cm4gcC5Db21wb25lbnQucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyLmNhbGwodGhpcyx4LEEpfTt1LnByb3RvdHlwZS5nZXREb3duc2FtcGxlSW5mbz1mdW5jdGlvbih4KXt2YXIgQTt2b2lkIDA9PT14JiYoeD10aGlzLl9zY2FsZSk7dm9pZCAwPT09QSYmKEE9eC5pbnZlcnRSYW5nZSgpKTt2YXIgeT1NYXRoLmNlaWwodS5fTUlOSU1VTV9XSURUSF9QRVJfTEFCRUxfUFgqKDA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT8xOjEvTWF0aC5jb3ModGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZS8xODAqTWF0aC5QSSkpLwp4LnN0ZXBXaWR0aCgpKTtyZXR1cm57ZG9tYWluOkEuZmlsdGVyKGZ1bmN0aW9uKHcsQyl7cmV0dXJuIDA9PT1DJXl9KSxzdGVwV2lkdGg6eSp4LnN0ZXBXaWR0aCgpfX07dS5wcm90b3R5cGUudGlja0xhYmVsQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0xhYmVsQW5nbGU7dGhyb3cgRXJyb3IoIkFuZ2xlIHVuZGVmaW5lZCBub3Qgc3VwcG9ydGVkOyBvbmx5IDAsIDkwLCBhbmQgLTkwIGFyZSB2YWxpZCB2YWx1ZXMiKTt9O3UucHJvdG90eXBlLnRpY2tMYWJlbFNoZWFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZX07dS5wcm90b3R5cGUudGlja0xhYmVsTWF4V2lkdGg9ZnVuY3Rpb24oeCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoO3RoaXMuX3RpY2tMYWJlbE1heFdpZHRoPXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUudGlja0xhYmVsTWF4TGluZXM9CmZ1bmN0aW9uKHgpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90aWNrTGFiZWxNYXhMaW5lczt0aGlzLl90aWNrTGFiZWxNYXhMaW5lcz14O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLl90aWNrU3BhY2VSZXF1aXJlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKX07dS5wcm90b3R5cGUuX2RyYXdUaWNrcz1mdW5jdGlvbih4LEEpe3ZhciB5PXRoaXM7c3dpdGNoKHRoaXMudGlja0xhYmVsQW5nbGUoKSl7Y2FzZSAwOnZhciB3PXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9O3ZhciBDPXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoiYm90dG9tIixib3R0b206InRvcCJ9O2JyZWFrO2Nhc2UgOTA6dz17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6InJpZ2h0Iixib3R0b206ImxlZnQifTsKQz17bGVmdDoidG9wIixyaWdodDoiYm90dG9tIix0b3A6ImNlbnRlciIsYm90dG9tOiJjZW50ZXIifTticmVhaztjYXNlIC05MDp3PXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoibGVmdCIsYm90dG9tOiJyaWdodCJ9LEM9e2xlZnQ6ImJvdHRvbSIscmlnaHQ6InRvcCIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn19QS5lYWNoKGZ1bmN0aW9uKEcpe3ZhciBEPXQuc2VsZWN0KHRoaXMpLEI9eS5pc0hvcml6b250YWwoKT94Onkud2lkdGgoKS15Ll90aWNrU3BhY2VSZXF1aXJlZCgpLEk9eS5pc0hvcml6b250YWwoKT95LmhlaWdodCgpLXkuX3RpY2tTcGFjZVJlcXVpcmVkKCk6eCxOPXt4QWxpZ246d1t5Lm9yaWVudGF0aW9uKCldLHlBbGlnbjpDW3kub3JpZW50YXRpb24oKV0sdGV4dFJvdGF0aW9uOnkudGlja0xhYmVsQW5nbGUoKSx0ZXh0U2hlYXI6eS50aWNrTGFiZWxTaGVhckFuZ2xlKCl9O2lmKG51bGwhPXkuX3RpY2tMYWJlbE1heFdpZHRoKXtpZigibGVmdCI9PT0KeS5vcmllbnRhdGlvbigpJiZCPnkuX3RpY2tMYWJlbE1heFdpZHRoKXt2YXIgTz1CLXkuX3RpY2tMYWJlbE1heFdpZHRoO089RC5hdHRyKCJ0cmFuc2Zvcm0iKSsiIHRyYW5zbGF0ZSgiK08rIiwgMCkiO0QuYXR0cigidHJhbnNmb3JtIixPKX1CPU1hdGgubWluKEIseS5fdGlja0xhYmVsTWF4V2lkdGgpfXkuX3dyaXRlci53cml0ZSh5LmZvcm1hdHRlcigpKEcpLEIsSSxOLEQubm9kZSgpKX0pfTt1LnByb3RvdHlwZS5fbWVhc3VyZVRpY2tMYWJlbHM9ZnVuY3Rpb24oeCxBKXt2YXIgeT10aGlzLHc9dGhpcy5fc2NhbGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzKCkucmFuZ2UoWzAsdGhpcy5pc0hvcml6b250YWwoKT94OkFdKSxDPXRoaXMuZ2V0RG93bnNhbXBsZUluZm8odyk7dz1DLmRvbWFpbjtDPUMuc3RlcFdpZHRoO3ZhciBHPXgtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKTt0aGlzLmlzSG9yaXpvbnRhbCgpJiYoRz1DLDAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKEc9QS10aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpKSwKRz1NYXRoLm1heChHLDApKTt2YXIgRD1DO3RoaXMuaXNIb3Jpem9udGFsKCkmJihEPUEtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSwwIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihEPXgtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSksRD1NYXRoLm1heChELDApKTtudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKEc9TWF0aC5taW4oRyx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO0E9dy5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIHkuX3dyYXBwZXIud3JhcCh5LmZvcm1hdHRlcigpKEIpLHkuX21lYXN1cmVyLEcsRCl9KTt4PXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT90LnN1bTptLk1hdGgubWF4O3c9dGhpcy5pc0hvcml6b250YWwoKSYmMD09PXRoaXMuX3RpY2tMYWJlbEFuZ2xlP20uTWF0aC5tYXg6dC5zdW07eD14KEEsZnVuY3Rpb24oQil7cmV0dXJuIHkuX21lYXN1cmVyLm1lYXN1cmUoQi53cmFwcGVkVGV4dCkud2lkdGh9LDApOwpBPXcoQSxmdW5jdGlvbihCKXtyZXR1cm4geS5fbWVhc3VyZXIubWVhc3VyZShCLndyYXBwZWRUZXh0KS5oZWlnaHR9LDApOzAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKEE9W0EseF0seD1BWzBdLEE9QVsxXSk7cmV0dXJue3VzZWRXaWR0aDp4LHVzZWRIZWlnaHQ6QX19O3UucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHg9dGhpcztxLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciBBPXRoaXMuX3NjYWxlLHk9dGhpcy5nZXREb3duc2FtcGxlSW5mbyhBKSx3PXkuZG9tYWluLEM9eT15LnN0ZXBXaWR0aDt0aGlzLmlzSG9yaXpvbnRhbCgpJiZudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKEM9TWF0aC5taW4oQyx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO3c9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEodyk7dmFyIEc9dy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQobi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsCiEwKS5tZXJnZSh3KTt3LmV4aXQoKS5yZW1vdmUoKTtHLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oRCl7dmFyIEI9QS5zY2FsZShEKS1DLzI7RD14LmlzSG9yaXpvbnRhbCgpP0I6MDtCPXguaXNIb3Jpem9udGFsKCk/MDpCO3JldHVybiJ0cmFuc2xhdGUoIitEKyIsIitCKyIpIn0pO0cudGV4dCgiIik7dGhpcy5fZHJhd1RpY2tzKHksRyk7eT0icmlnaHQiPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDt3PSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDt0aGlzLl90aWNrTGFiZWxDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIreSsiLCIrdysiKSIpO3RoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTt0aGlzLl9zaG93QWxsVGlja0xhYmVscygpO3RoaXMuX2hpZGVUaWNrTWFya3NXaXRob3V0TGFiZWwoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD0KZnVuY3Rpb24oeCxBLHkpe3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHgsQSx5KTt0aGlzLmlzSG9yaXpvbnRhbCgpfHx0aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3EucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiB1fShuLkF4aXMpO2QuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYPTE1O2YuQ2F0ZWdvcnk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciBBIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShBKSYmKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KTooeC5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHgpfSwKdD1oKDEpLGw9aCg1KSxwPWgoOCksbT1oKDApLG49aCgyMik7ZD1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KHgsQSl7eD1xLmNhbGwodGhpcyx4LEEpfHx0aGlzO3guX3RpY2tMYWJlbFBvc2l0aW9uaW5nPSJjZW50ZXIiO3guX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSExO3guZm9ybWF0dGVyKHAuZ2VuZXJhbCgpKTtyZXR1cm4geH1rKHUscSk7dS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHg9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl90aWNrTGFiZWxDb250YWluZXIubm9kZSgpLG4uQXhpcy5USUNLX0xBQkVMX0NMQVNTKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHgpO3RoaXMuX3dyYXBwZXI9KG5ldyBsLldyYXBwZXIpLm1heExpbmVzKDEpfTt1LnByb3RvdHlwZS5fY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24/dGhpcy5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoKCk6CnRoaXMuX2NvbXB1dGVFeGFjdFRleHRXaWR0aCgpO3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkreDpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt4KX07dS5wcm90b3R5cGUuX2NvbXB1dGVFeGFjdFRleHRXaWR0aD1mdW5jdGlvbigpe3ZhciB4PXRoaXMsQT10aGlzLl9nZXRUaWNrVmFsdWVzKCkubWFwKGZ1bmN0aW9uKHkpe3k9eC5mb3JtYXR0ZXIoKSh5KTtyZXR1cm4geC5fbWVhc3VyZXIubWVhc3VyZSh5KS53aWR0aH0pO3JldHVybiBtLk1hdGgubWF4KEEsMCl9O3UucHJvdG90eXBlLl9jb21wdXRlQXBwcm94aW1hdGVUZXh0V2lkdGg9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLEE9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLHk9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgiTSIpLndpZHRoO0E9QS5tYXAoZnVuY3Rpb24odyl7cmV0dXJuIHguZm9ybWF0dGVyKCkodykubGVuZ3RoKgp5fSk7cmV0dXJuIG0uTWF0aC5tYXgoQSwwKX07dS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0O3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkreDpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt4KX07dS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLl9zY2FsZSxBPXguZG9tYWluKCkseT1BWzBdPD1BWzFdP0FbMF06QVsxXSx3PUFbMF0+PUFbMV0/QVswXTpBWzFdO3JldHVybiB4LnRpY2tzKCkuZmlsdGVyKGZ1bmN0aW9uKEMpe3JldHVybiBDPj15JiZDPD13fSl9O3UucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNTZXR1cCl7aWYoIXRoaXMuaXNIb3Jpem9udGFsKCkpe3ZhciB4PQp0aGlzLl9jb21wdXRlV2lkdGgoKTtpZih4PnRoaXMud2lkdGgoKXx8eDx0aGlzLndpZHRoKCktdGhpcy5tYXJnaW4oKSl7dGhpcy5yZWRyYXcoKTtyZXR1cm59fXRoaXMucmVuZGVyKCl9fTt1LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB4PXRoaXM7cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgQT17eDowLHk6MCxkeDoiMGVtIixkeToiMC4zZW0ifSx5PXRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpLHc9dGhpcy50aWNrTGFiZWxQYWRkaW5nKCksQz0ibWlkZGxlIixHPTAsRD0wLEI9MCxJPTA7aWYodGhpcy5pc0hvcml6b250YWwoKSlzd2l0Y2godGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmcpe2Nhc2UgImxlZnQiOkM9ImVuZCI7Rz0tdztJPXc7YnJlYWs7Y2FzZSAiY2VudGVyIjpJPXkrdzticmVhaztjYXNlICJyaWdodCI6Qz0ic3RhcnQiLEk9Rz13fWVsc2Ugc3dpdGNoKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nKXtjYXNlICJ0b3AiOkEuZHk9CiItMC4zZW0iO0I9dztEPS13O2JyZWFrO2Nhc2UgImNlbnRlciI6Qj15K3c7YnJlYWs7Y2FzZSAiYm90dG9tIjpBLmR5PSIxZW0iLEQ9Qj13fXk9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCk7c3dpdGNoKHRoaXMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpBLng9eS54MTtBLmR5PSIwLjk1ZW0iO0Q9eS55MStJO2JyZWFrO2Nhc2UgInRvcCI6QS54PXkueDE7QS5keT0iLS4yNWVtIjtEPXkueTEtSTticmVhaztjYXNlICJsZWZ0IjpDPSJlbmQiO0c9eS54MS1CO0EueT15LnkxO2JyZWFrO2Nhc2UgInJpZ2h0IjpDPSJzdGFydCIsRz15LngxK0IsQS55PXkueTF9Qj10aGlzLl9nZXRUaWNrVmFsdWVzKCk7Qj10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIituLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZGF0YShCKTtCLmV4aXQoKS5yZW1vdmUoKTtCLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuY2xhc3NlZChuLkF4aXMuVElDS19MQUJFTF9DTEFTUywKITApLm1lcmdlKEIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsQykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0IikuYXR0cnMoQSkudGV4dChmdW5jdGlvbihOKXtyZXR1cm4geC5mb3JtYXR0ZXIoKShOKX0pO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitHKyIsICIrRCsiKSIpO3RoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTt0aGlzLnNob3dFbmRUaWNrTGFiZWxzKCl8fHRoaXMuX2hpZGVFbmRUaWNrTGFiZWxzKCk7dGhpcy5faGlkZU92ZXJmbG93aW5nVGlja0xhYmVscygpO3RoaXMuX2hpZGVPdmVybGFwcGluZ1RpY2tMYWJlbHMoKTsiY2VudGVyIiE9PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nJiZ0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnRpY2tMYWJlbFBvc2l0aW9uPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nOwp4PXgudG9Mb3dlckNhc2UoKTtpZih0aGlzLmlzSG9yaXpvbnRhbCgpKXtpZigibGVmdCIhPT14JiYiY2VudGVyIiE9PXgmJiJyaWdodCIhPT14KXRocm93IEVycm9yKHgrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIGhvcml6b250YWwgTnVtZXJpY0F4aXMiKTt9ZWxzZSBpZigidG9wIiE9PXgmJiJjZW50ZXIiIT09eCYmImJvdHRvbSIhPT14KXRocm93IEVycm9yKHgrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIHZlcnRpY2FsIE51bWVyaWNBeGlzIik7dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc9eDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj1mdW5jdGlvbigpe3RoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSEwfTt1LnByb3RvdHlwZS5faGlkZUVuZFRpY2tMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLmVsZW1lbnQoKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCkE9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpO2lmKDAhPT1BLnNpemUoKSl7dmFyIHk9QS5ub2RlcygpWzBdO20uRE9NLmNsaWVudFJlY3RJbnNpZGUoeS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx4KXx8dC5zZWxlY3QoeSkuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTtBPUEubm9kZXMoKVtBLnNpemUoKS0xXTttLkRPTS5jbGllbnRSZWN0SW5zaWRlKEEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseCl8fHQuc2VsZWN0KEEpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9fTt1LnByb3RvdHlwZS5faGlkZU92ZXJsYXBwaW5nVGlja0xhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgeD10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIituLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHc9dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4iaW5oZXJpdCI9PT0Kd3x8InZpc2libGUiPT09d30pLEE9eC5ub2RlcygpLm1hcChmdW5jdGlvbih3KXtyZXR1cm4gdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pLHk9MTshdGhpcy5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbCh5LEEpJiZ5PEEubGVuZ3RoOyl5Kz0xO3guZWFjaChmdW5jdGlvbih3LEMpe3c9dC5zZWxlY3QodGhpcyk7MCE9PUMleSYmdy5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfSl9O3UucHJvdG90eXBlLl9oYXNPdmVybGFwV2l0aEludGVydmFsPWZ1bmN0aW9uKHgsQSl7dmFyIHk9ImNlbnRlciI9PT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZz90aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTozKnRoaXMudGlja0xhYmVsUGFkZGluZygpO0E9QS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIG0uRE9NLmV4cGFuZFJlY3QoQyx5KX0pO2Zvcih2YXIgdz0wO3c8QS5sZW5ndGgteDt3Kz14KWlmKG0uRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChBW3ddLEFbdyt4XSkpcmV0dXJuITE7cmV0dXJuITB9Owp1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gdX0obi5BeGlzKTtmLk51bWVyaWM9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfTtkPWgoNDIpO3ZhciB0PWgoMjUpLGw9aCgwKTtoPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7ZnVuY3Rpb24gcSgpe3cmJih3PSExLHkuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gdShDLEcpe3cmJih5Ll9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZSh5Ll9pc1ZlcnRpY2FsKCk/CkcueDpHLnkpLHkuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24geChDKXtBKEMpJiYodz0hMCx5Ll9kcmFnU3RhcnRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gQShDKXtyZXR1cm4geS5faXNWZXJ0aWNhbCgpJiZ5LnBpeGVsUG9zaXRpb24oKS15LmRldGVjdGlvblJhZGl1cygpPD1DLngmJkMueDw9eS5waXhlbFBvc2l0aW9uKCkreS5kZXRlY3Rpb25SYWRpdXMoKXx8IXkuX2lzVmVydGljYWwoKSYmeS5waXhlbFBvc2l0aW9uKCkteS5kZXRlY3Rpb25SYWRpdXMoKTw9Qy55JiZDLnk8PXkucGl4ZWxQb3NpdGlvbigpK3kuZGV0ZWN0aW9uUmFkaXVzKCl9dmFyIHk9cC5jYWxsKHRoaXMsbil8fHRoaXM7eS5fZGV0ZWN0aW9uUmFkaXVzPTM7eS5fZW5hYmxlZD0hMDt5LmFkZENsYXNzKCJkcmFnLWxpbmUtbGF5ZXIiKTt5LmFkZENsYXNzKCJlbmFibGVkIik7eS5fZHJhZ0ludGVyYWN0aW9uPW5ldyB0LkRyYWc7eS5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHkpOwp2YXIgdz0hMTt5Ll9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoeCk7eS5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyh1KTt5Ll9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKHEpO3kuX2Rpc2Nvbm5lY3RJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnU3RhcnQoeCk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWcodSk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWdFbmQocSk7eS5fZHJhZ0ludGVyYWN0aW9uLmRldGFjaCgpfTt5Ll9kcmFnU3RhcnRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7eS5fZHJhZ0NhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDt5Ll9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3JldHVybiB5fWsobSxwKTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLApzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSkuY2xhc3NlZCgiZHJhZy1lZGdlIiwhMCl9O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXN9OwptLnByb3RvdHlwZS5lbmFibGVkPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2VuYWJsZWQ7KHRoaXMuX2VuYWJsZWQ9bik/dGhpcy5hZGRDbGFzcygiZW5hYmxlZCIpOnRoaXMucmVtb3ZlQ2xhc3MoImVuYWJsZWQiKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZChuKX07bS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKG4pfTsKbS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHEpfSk7dGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShxKX0pO3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gbi5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUocSl9KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX07cmV0dXJuIG19KGQuR3VpZGVMaW5lTGF5ZXIpO2YuRHJhZ0xpbmVMYXllcj1ofSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhsLHAsbSl7dmFyIG49Cnt9O2lmKHZvaWQgMCE9PW0pZm9yKHZhciBxPTA7cTxtLmxlbmd0aDtxKyspblttW3FdXT1tW3EtMV07cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciB4PWwuc2NhbGUodSk7aWYoIXApcmV0dXJuIHg7dmFyIEE7dT12b2lkIDA9PT1uW3VdP3ZvaWQgMDpsLnNjYWxlKG5bdV0pO3ZvaWQgMCE9PXUmJihBPXUrKHgtdSkvMik7cmV0dXJuIEF9fXZhciB0PXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2YXIgcT1sLmNhbGwodGhpcyl8fHRoaXM7cS5hZGRDbGFzcygiZ3JpZGxpbmVzIik7cS5feFNjYWxlPW07cS5feVNjYWxlPW47cS5fcmVuZGVyQ2FsbGJhY2s9CmZ1bmN0aW9uKCl7cmV0dXJuIHEucmVuZGVyKCl9O2lmKHEuX3hTY2FsZSlxLl94U2NhbGUub25VcGRhdGUocS5fcmVuZGVyQ2FsbGJhY2spO2lmKHEuX3lTY2FsZSlxLl95U2NhbGUub25VcGRhdGUocS5fcmVuZGVyQ2FsbGJhY2spO3JldHVybiBxfXQocCxsKTtwLnByb3RvdHlwZS5iZXR3ZWVuWD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iZXR3ZWVuWH07cC5wcm90b3R5cGUuYmV0d2Vlblk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmV0d2Vlbll9O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTt0aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5feExpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtZ3JpZGxpbmVzIiwhMCk7dGhpcy5feUxpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktZ3JpZGxpbmVzIiwhMCl9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9yZWRyYXdYTGluZXMoKTt0aGlzLl9yZWRyYXdZTGluZXMoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihtLG4scSl7bC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsbSxuLHEpO251bGwhPXRoaXMuX3hTY2FsZSYmdGhpcy5feFNjYWxlLnJhbmdlKFswLHRoaXMud2lkdGgoKV0pO251bGwhPXRoaXMuX3lTY2FsZSYmdGhpcy5feVNjYWxlLnJhbmdlKFt0aGlzLmhlaWdodCgpLDBdKTtyZXR1cm4gdGhpc307CnAucHJvdG90eXBlLl9yZWRyYXdYTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLl94U2NhbGUpe3ZhciBtPXRoaXMuYmV0d2VlblgoKSxuPXRoaXMuX3hTY2FsZS50aWNrcygpLnNsaWNlKG0/MTowKTtuPXRoaXMuX3hMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKG4pO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsayh0aGlzLl94U2NhbGUsbSx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkxIiwwKS5hdHRyKCJ4MiIsayh0aGlzLl94U2NhbGUsbSx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkyIix0aGlzLmhlaWdodCgpKS5jbGFzc2VkKCJiZXR3ZWVubGluZSIsbSkuY2xhc3NlZCgiemVyb2xpbmUiLGZ1bmN0aW9uKHEpe3JldHVybiAwPT09cX0pO24uZXhpdCgpLnJlbW92ZSgpfX07cC5wcm90b3R5cGUuX3JlZHJhd1lMaW5lcz1mdW5jdGlvbigpe2lmKHRoaXMuX3lTY2FsZSl7dmFyIG09dGhpcy5iZXR3ZWVuWSgpLApuPXRoaXMuX3lTY2FsZS50aWNrcygpLnNsaWNlKG0/MTowKTtuPXRoaXMuX3lMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKG4pO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsMCkuYXR0cigieTEiLGsodGhpcy5feVNjYWxlLG0sdGhpcy5feVNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ4MiIsdGhpcy53aWR0aCgpKS5hdHRyKCJ5MiIsayh0aGlzLl95U2NhbGUsbSx0aGlzLl95U2NhbGUudGlja3MoKSkpLmNsYXNzZWQoImJldHdlZW5saW5lIixtKS5jbGFzc2VkKCJ6ZXJvbGluZSIsZnVuY3Rpb24ocSl7cmV0dXJuIDA9PT1xfSk7bi5leGl0KCkucmVtb3ZlKCl9fTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuR3JpZGxpbmVzPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgeCBpbiBxKXEuaGFzT3duUHJvcGVydHkoeCkmJgooblt4XT1xW3hdKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHQ9aCg1KSxsPWgoMjMpLHA9aCg4KSxtPWgoMCk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKHUpe3ZhciB4PW4uY2FsbCh0aGlzKXx8dGhpczt4Ll90ZXh0UGFkZGluZz01O2lmKG51bGw9PXUpdGhyb3cgRXJyb3IoIkludGVycG9sYXRlZENvbG9yTGVnZW5kIHJlcXVpcmVzIGEgaW50ZXJwb2xhdGVkQ29sb3JTY2FsZSIpO3guX3NjYWxlPXU7eC5fcmVkcmF3Q2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4geC5yZWRyYXcoKX07eC5fc2NhbGUub25VcGRhdGUoeC5fcmVkcmF3Q2FsbGJhY2spO3guX2Zvcm1hdHRlcj1wLmdlbmVyYWwoKTt4Ll9vcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI7eC5fZXhwYW5kcz0hMTt4LmFkZENsYXNzKCJsZWdlbmQiKTt4LmFkZENsYXNzKCJpbnRlcnBvbGF0ZWQtY29sb3ItbGVnZW5kIik7cmV0dXJuIHh9ayhxLApuKTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayl9O3EucHJvdG90eXBlLmZvcm1hdHRlcj1mdW5jdGlvbih1KXtpZih2b2lkIDA9PT11KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXU7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuZXhwYW5kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHBhbmRzfTtxLl9lbnN1cmVPcmllbnRhdGlvbj1mdW5jdGlvbih1KXt1PXUudG9Mb3dlckNhc2UoKTtpZigiaG9yaXpvbnRhbCI9PT11fHwibGVmdCI9PT11fHwicmlnaHQiPT09dSlyZXR1cm4gdTt0aHJvdyBFcnJvcignIicrdSsnIiBpcyBub3QgYSB2YWxpZCBvcmllbnRhdGlvbiBmb3IgSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQnKTt9O3EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHUpe2lmKG51bGw9PQp1KXJldHVybiB0aGlzLl9vcmllbnRhdGlvbjt0aGlzLl9vcmllbnRhdGlvbj1xLl9lbnN1cmVPcmllbnRhdGlvbih1KTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHx0aGlzLl9pc1ZlcnRpY2FsKCl9O3EucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHwhdGhpcy5faXNWZXJ0aWNhbCgpfTtxLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrcz1mdW5jdGlvbih1KXt2b2lkIDA9PT11JiYodT1xLl9ERUZBVUxUX05VTV9TV0FUQ0hFUyk7dmFyIHg9dGhpcy5fc2NhbGUuZG9tYWluKCk7aWYoMT09PXUpcmV0dXJuW3hbMF1dO2Zvcih2YXIgQT0oeFsxXS14WzBdKS8odS0xKSx5PVtdLHc9MDt3PHU7dysrKXkucHVzaCh4WzBdK0Eqdyk7cmV0dXJuIHl9O3EucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe24ucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwp0aGlzLl9zd2F0Y2hDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic3dhdGNoLWNvbnRhaW5lciIsITApO3RoaXMuX3N3YXRjaEJvdW5kaW5nQm94PXRoaXMuY29udGVudCgpLmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInN3YXRjaC1ib3VuZGluZy1ib3giLCEwKTt0aGlzLl9sb3dlckxhYmVsPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQocS5MRUdFTkRfTEFCRUxfQ0xBU1MsITApO3RoaXMuX3VwcGVyTGFiZWw9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLkxFR0VORF9MQUJFTF9DTEFTUywhMCk7dmFyIHU9bmV3IHQuU3ZnQ29udGV4dCh0aGlzLmNvbnRlbnQoKS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyB0Lk1lYXN1cmVyKHUpO3RoaXMuX3dyYXBwZXI9bmV3IHQuV3JhcHBlcjt0aGlzLl93cml0ZXI9bmV3IHQuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHUsdGhpcy5fd3JhcHBlcil9O3EucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPQpmdW5jdGlvbigpe3ZhciB1PXRoaXMseD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEE9dGhpcy5fc2NhbGUuZG9tYWluKCkubWFwKGZ1bmN0aW9uKEMpe3JldHVybiB1Ll9tZWFzdXJlci5tZWFzdXJlKHUuX2Zvcm1hdHRlcihDKSkud2lkdGh9KSx5PXEuX0RFRkFVTFRfTlVNX1NXQVRDSEVTO2lmKHRoaXMuX2lzVmVydGljYWwoKSl7dmFyIHc9bS5NYXRoLm1heChBLDApO0E9eCt4K3RoaXMuX3RleHRQYWRkaW5nK3crdGhpcy5fdGV4dFBhZGRpbmc7dz15Knh9ZWxzZSB3PXgreCt4LEE9dGhpcy5fdGV4dFBhZGRpbmcrQVswXSt5KngrQVsxXSt0aGlzLl90ZXh0UGFkZGluZztyZXR1cm57bWluV2lkdGg6QSxtaW5IZWlnaHQ6d319O3EucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuImhvcml6b250YWwiIT09dGhpcy5fb3JpZW50YXRpb259O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcztuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpOwp2YXIgeD10aGlzLl9zY2FsZS5kb21haW4oKSxBPXRoaXMuX2Zvcm1hdHRlcih4WzBdKSx5PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoQSkud2lkdGgsdz10aGlzLl9mb3JtYXR0ZXIoeFsxXSk7eD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHcpLndpZHRoO3ZhciBDPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQsRz10aGlzLl90ZXh0UGFkZGluZyxEPTAsQj0wLEk9MCxOPTAsTz17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sSD17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sSz17eDowLHk6MCx3aWR0aDowLGhlaWdodDowfTtpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3ZhciBNPU1hdGguZmxvb3IodGhpcy5oZWlnaHQoKSk7dmFyIEw9TWF0aC5tYXgoeSx4KTt2YXIgUT0odGhpcy53aWR0aCgpLUwtMip0aGlzLl90ZXh0UGFkZGluZykvMjt4PU1hdGgubWF4KHRoaXMud2lkdGgoKS1RLTIqRy1MLDApOwpDPTE7dmFyIFQ9ZnVuY3Rpb24oYWEsbGEpe3JldHVybiB1LmhlaWdodCgpLShsYSsxKX07SC55QWxpZ249InRvcCI7Qj0wO08ueUFsaWduPSJib3R0b20iO049MDtpZigibGVmdCI9PT10aGlzLl9vcmllbnRhdGlvbil7dmFyIFg9ZnVuY3Rpb24oKXtyZXR1cm4gRytMK0d9O0gueEFsaWduPSJyaWdodCI7RD0tKFEreCtHKTtPLnhBbGlnbj0icmlnaHQiO0k9LShRK3grRyl9ZWxzZSBYPWZ1bmN0aW9uKCl7cmV0dXJuIFF9LEgueEFsaWduPSJsZWZ0IixEPVEreCtHLE8ueEFsaWduPSJsZWZ0IixJPVEreCtHO0sud2lkdGg9eDtLLmhlaWdodD1NKkN9ZWxzZSBRPU1hdGgubWF4KEcsKHRoaXMuaGVpZ2h0KCktQykvMiksTT1NYXRoLm1heChNYXRoLmZsb29yKHRoaXMud2lkdGgoKS00KkcteS14KSwwKSx4PTEsQz1NYXRoLm1heCh0aGlzLmhlaWdodCgpLTIqUSwwKSxYPWZ1bmN0aW9uKGFhLGxhKXtyZXR1cm4gTWF0aC5mbG9vcih5KzIqRykrbGF9LFQ9ZnVuY3Rpb24oKXtyZXR1cm4gUX0sCkgueEFsaWduPSJyaWdodCIsRD0tRyxPLnhBbGlnbj0ibGVmdCIsST1HLEsueT1RLEsud2lkdGg9TSp4LEsuaGVpZ2h0PUM7Sy54PVgobnVsbCwwKTt0aGlzLl91cHBlckxhYmVsLnRleHQoIiIpO3RoaXMuX3dyaXRlci53cml0ZSh3LHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLEgsdGhpcy5fdXBwZXJMYWJlbC5ub2RlKCkpO3RoaXMuX3VwcGVyTGFiZWwuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrRCsiLCAiK0IrIikiKTt0aGlzLl9sb3dlckxhYmVsLnRleHQoIiIpO3RoaXMuX3dyaXRlci53cml0ZShBLHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLE8sdGhpcy5fbG93ZXJMYWJlbC5ub2RlKCkpO3RoaXMuX2xvd2VyTGFiZWwuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrSSsiLCAiK04rIikiKTt0aGlzLl9zd2F0Y2hCb3VuZGluZ0JveC5hdHRycyhLKTtBPXRoaXMuX2dlbmVyYXRlVGlja3MoTSk7QT10aGlzLl9zd2F0Y2hDb250YWluZXIuc2VsZWN0QWxsKCJyZWN0LnN3YXRjaCIpLmRhdGEoQSk7Cnc9QS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInN3YXRjaCIsITApO0Q9QS5tZXJnZSh3KTtBLmV4aXQoKS5yZW1vdmUoKTtELmF0dHJzKHtmaWxsOmZ1bmN0aW9uKGFhKXtyZXR1cm4gdS5fc2NhbGUuc2NhbGUoYWEpfSx3aWR0aDp4LGhlaWdodDpDLHg6WCx5OlQsInNoYXBlLXJlbmRlcmluZyI6ImNyaXNwRWRnZXMifSk7bC5BRERfVElUTEVfRUxFTUVOVFMmJncuYXBwZW5kKCJ0aXRsZSIpLnRleHQoZnVuY3Rpb24oYWEpe3JldHVybiB1Ll9mb3JtYXR0ZXIoYWEpfSk7cmV0dXJuIHRoaXN9O3JldHVybiBxfShoKDQpLkNvbXBvbmVudCk7ZC5fREVGQVVMVF9OVU1fU1dBVENIRVM9MTE7ZC5MRUdFTkRfTEFCRUxfQ0xBU1M9ImxlZ2VuZC1sYWJlbCI7Zi5JbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYKKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSx0PWgoNSk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7dm9pZCAwPT09bSYmKG09IiIpO3ZvaWQgMD09PW4mJihuPTApO3ZhciBxPWwuY2FsbCh0aGlzKXx8dGhpcztxLmFkZENsYXNzKCJsYWJlbCIpO3EudGV4dChtKTtxLmFuZ2xlKG4pO3EueEFsaWdubWVudCgiY2VudGVyIikueUFsaWdubWVudCgiY2VudGVyIik7cS5fcGFkZGluZz0wO3JldHVybiBxfWsocCxsKTtwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3ZhciBtPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUodGhpcy5fdGV4dCksbj0oMD09PXRoaXMuYW5nbGUoKT9tLndpZHRoOm0uaGVpZ2h0KSsyKnRoaXMucGFkZGluZygpO209KDA9PT10aGlzLmFuZ2xlKCk/bS5oZWlnaHQ6bS53aWR0aCkrMip0aGlzLnBhZGRpbmcoKTtyZXR1cm57bWluV2lkdGg6biwKbWluSGVpZ2h0Om19fTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90ZXh0Q29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpO3ZhciBtPW5ldyB0LlN2Z0NvbnRleHQodGhpcy5fdGV4dENvbnRhaW5lci5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyB0LkNhY2hlTWVhc3VyZXIobSk7dGhpcy5fd3JhcHBlcj1uZXcgdC5XcmFwcGVyO3RoaXMuX3dyaXRlcj1uZXcgdC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIsbSx0aGlzLl93cmFwcGVyKTt0aGlzLnRleHQodGhpcy5fdGV4dCl9O3AucHJvdG90eXBlLnRleHQ9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fdGV4dDtpZigic3RyaW5nIiE9PXR5cGVvZiBtKXRocm93IEVycm9yKCJMYWJlbC50ZXh0KCkgb25seSB0YWtlcyBzdHJpbmdzIGFzIGlucHV0Iik7dGhpcy5fdGV4dD1tO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLmFuZ2xlPQpmdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9hbmdsZTttJT0zNjA7MTgwPG0/bS09MzYwOi0xODA+bSYmKG0rPTM2MCk7aWYoLTkwPT09bXx8MD09PW18fDkwPT09bSl0aGlzLl9hbmdsZT1tO2Vsc2UgdGhyb3cgRXJyb3IobSsiIGlzIG5vdCBhIHZhbGlkIGFuZ2xlIGZvciBMYWJlbCIpO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnBhZGRpbmc9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fcGFkZGluZzttPSttO2lmKDA+bSl0aHJvdyBFcnJvcihtKyIgaXMgbm90IGEgdmFsaWQgcGFkZGluZyB2YWx1ZS4gQ2Fubm90IGJlIGxlc3MgdGhhbiAwLiIpO3RoaXMuX3BhZGRpbmc9bTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PQpmdW5jdGlvbigpe2wucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fdGV4dENvbnRhaW5lci5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTt2YXIgbT10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHRoaXMuX3RleHQpLG49TWF0aC5tYXgoTWF0aC5taW4oKHRoaXMuaGVpZ2h0KCktbS5oZWlnaHQpLzIsdGhpcy5wYWRkaW5nKCkpLDApO209TWF0aC5tYXgoTWF0aC5taW4oKHRoaXMud2lkdGgoKS1tLndpZHRoKS8yLHRoaXMucGFkZGluZygpKSwwKTt0aGlzLl90ZXh0Q29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK20rIiwiK24rIikiKTttPXRoaXMud2lkdGgoKS0yKm07bj10aGlzLmhlaWdodCgpLTIqbjt2YXIgcT17eEFsaWduOnRoaXMueEFsaWdubWVudCgpLHlBbGlnbjp0aGlzLnlBbGlnbm1lbnQoKSx0ZXh0Um90YXRpb246dGhpcy5hbmdsZSgpfTt0aGlzLl93cml0ZXIud3JpdGUodGhpcy5fdGV4dCxtLG4scSk7cmV0dXJuIHRoaXN9OwpwLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuTGFiZWw9ZDtoPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXttPWwuY2FsbCh0aGlzLG0sbil8fHRoaXM7bS5hZGRDbGFzcyhwLlRJVExFX0xBQkVMX0NMQVNTKTtyZXR1cm4gbX1rKHAsbCk7cmV0dXJuIHB9KGQpO2guVElUTEVfTEFCRUxfQ0xBU1M9InRpdGxlLWxhYmVsIjtmLlRpdGxlTGFiZWw9aDtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXttPWwuY2FsbCh0aGlzLG0sbil8fHRoaXM7bS5hZGRDbGFzcyhwLkFYSVNfTEFCRUxfQ0xBU1MpO3JldHVybiBtfWsocCxsKTtyZXR1cm4gcH0oZCk7ZC5BWElTX0xBQkVMX0NMQVNTPSJheGlzLWxhYmVsIjtmLkF4aXNMYWJlbD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fApmdW5jdGlvbihBLHkpe2Z1bmN0aW9uIHcoKXt0aGlzLmNvbnN0cnVjdG9yPUF9Zm9yKHZhciBDIGluIHkpeS5oYXNPd25Qcm9wZXJ0eShDKSYmKEFbQ109eVtDXSk7QS5wcm90b3R5cGU9bnVsbD09PXk/T2JqZWN0LmNyZWF0ZSh5KToody5wcm90b3R5cGU9eS5wcm90b3R5cGUsbmV3IHcpfSx0PWgoMSksbD1oKDUpLHA9aCgyMyksbT1oKDgpLG49aCgzMSkscT1oKDApO2Q9aCg0KTt2YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoeSx3LEMpe3ZvaWQgMD09PXkmJih5PVtdKTt2b2lkIDA9PT13JiYodz0wKTt2b2lkIDA9PT1DJiYoQz1JbmZpbml0eSk7dGhpcy5jb2x1bW5zPXk7dGhpcy5ib3R0b21QYWRkaW5nPXc7dGhpcy5tYXhXaWR0aD1DfUEucHJvdG90eXBlLmFkZENvbHVtbj1mdW5jdGlvbih5KXt2YXIgdz15LndpZHRoLEM9dGhpcy5nZXRXaWR0aEF2YWlsYWJsZSgpO3kud2lkdGg9TWF0aC5taW4oQyx3KTt0aGlzLmNvbHVtbnMucHVzaCh5KX07QS5wcm90b3R5cGUuZ2V0Qm91bmRzPQpmdW5jdGlvbih5KXtmb3IodmFyIHc9dGhpcy5jb2x1bW5zW3ldLEM9MCxHPTA7Rzx5O0crKylDKz10aGlzLmNvbHVtbnNbR10ud2lkdGg7cmV0dXJue3RvcExlZnQ6e3g6Qyx5OjB9LGJvdHRvbVJpZ2h0Ont4OkMrdy53aWR0aCx5OncuaGVpZ2h0fX19O0EucHJvdG90eXBlLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBxLk1hdGgubWF4KHRoaXMuY29sdW1ucy5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIHkuaGVpZ2h0fSksMCkrdGhpcy5ib3R0b21QYWRkaW5nfTtBLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbih0aGlzLmNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uKHksdyl7cmV0dXJuIHkrdy53aWR0aH0sMCksdGhpcy5tYXhXaWR0aCl9O0EucHJvdG90eXBlLmdldFdpZHRoQXZhaWxhYmxlPWZ1bmN0aW9uKCl7dmFyIHk9dGhpcy5nZXRXaWR0aCgpO3JldHVybiBNYXRoLm1heCh0aGlzLm1heFdpZHRoLXksMCl9O3JldHVybiBBfSgpLHg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBKHksCncsQyxHKXt2b2lkIDA9PT15JiYoeT1JbmZpbml0eSk7dm9pZCAwPT09dyYmKHc9SW5maW5pdHkpO3ZvaWQgMD09PUMmJihDPTApO3ZvaWQgMD09PUcmJihHPVtdKTt0aGlzLm1heFdpZHRoPXk7dGhpcy5tYXhIZWlnaHQ9dzt0aGlzLnBhZGRpbmc9Qzt0aGlzLnJvd3M9R31BLnByb3RvdHlwZS5hZGRSb3c9ZnVuY3Rpb24oeSl7eS5tYXhXaWR0aD10aGlzLm1heFdpZHRoLTIqdGhpcy5wYWRkaW5nO3RoaXMucm93cy5wdXNoKHkpfTtBLnByb3RvdHlwZS5nZXRDb2x1bW5Cb3VuZHM9ZnVuY3Rpb24oeSx3KXt2YXIgQz10aGlzLmdldFJvd0JvdW5kcyh5KTt5PXRoaXMucm93c1t5XS5nZXRCb3VuZHModyk7eS50b3BMZWZ0LngrPUMudG9wTGVmdC54O3kuYm90dG9tUmlnaHQueCs9Qy50b3BMZWZ0Lng7eS50b3BMZWZ0LnkrPUMudG9wTGVmdC55O3kuYm90dG9tUmlnaHQueSs9Qy50b3BMZWZ0Lnk7cmV0dXJuIHl9O0EucHJvdG90eXBlLmdldFJvd0JvdW5kcz1mdW5jdGlvbih5KXtmb3IodmFyIHc9CnRoaXMucGFkZGluZyxDPXRoaXMucGFkZGluZyxHPTA7Rzx5O0crKylDKz10aGlzLnJvd3NbR10uZ2V0SGVpZ2h0KCk7cmV0dXJue3RvcExlZnQ6e3g6dyx5OkN9LGJvdHRvbVJpZ2h0Ont4OncrdGhpcy5yb3dzW3ldLmdldFdpZHRoKCkseTpDK3RoaXMucm93c1t5XS5nZXRIZWlnaHQoKX19fTtBLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5yb3dzLnJlZHVjZShmdW5jdGlvbih5LHcpe3JldHVybiB5K3cuZ2V0SGVpZ2h0KCl9LDApKzIqdGhpcy5wYWRkaW5nLHRoaXMubWF4SGVpZ2h0KX07QS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4ocS5NYXRoLm1heCh0aGlzLnJvd3MubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5LmdldFdpZHRoKCl9KSwwKSsyKnRoaXMucGFkZGluZyx0aGlzLm1heFdpZHRoKX07cmV0dXJuIEF9KCk7ZD1mdW5jdGlvbihBKXtmdW5jdGlvbiB5KHcpe3ZhciBDPUEuY2FsbCh0aGlzKXx8CnRoaXM7Qy5fcGFkZGluZz01O0MuX3Jvd0JvdHRvbVBhZGRpbmc9MztDLmFkZENsYXNzKCJsZWdlbmQiKTtDLm1heEVudHJpZXNQZXJSb3coMSk7aWYobnVsbD09dyl0aHJvdyBFcnJvcigiTGVnZW5kIHJlcXVpcmVzIGEgY29sb3JTY2FsZSIpO0MuX2NvbG9yU2NhbGU9dztDLl9yZWRyYXdDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBDLnJlZHJhdygpfTtDLl9jb2xvclNjYWxlLm9uVXBkYXRlKEMuX3JlZHJhd0NhbGxiYWNrKTtDLl9mb3JtYXR0ZXI9bS5pZGVudGl0eSgpO0MubWF4TGluZXNQZXJFbnRyeSgxKTtDLnhBbGlnbm1lbnQoInJpZ2h0IikueUFsaWdubWVudCgidG9wIik7Qy5jb21wYXJhdG9yKGZ1bmN0aW9uKEcsRCl7dmFyIEI9Qy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLm1hcChmdW5jdGlvbihJKXtyZXR1cm4gQy5fZm9ybWF0dGVyKEkpfSk7cmV0dXJuIEIuaW5kZXhPZihHKS1CLmluZGV4T2YoRCl9KTtDLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gbi5jaXJjbGUoKX07CkMuX3N5bWJvbE9wYWNpdHlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiAxfTtyZXR1cm4gQ31rKHksQSk7eS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7QS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHc9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9ST1dfQ0xBU1MsITApO3cuYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9FTlRSWV9DTEFTUywhMCkuYXBwZW5kKCJ0ZXh0Iik7dz1uZXcgbC5TdmdDb250ZXh0KHcubm9kZSgpLG51bGwscC5BRERfVElUTEVfRUxFTUVOVFMpO3RoaXMuX21lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIodyk7dGhpcy5fd3JhcHBlcj0obmV3IGwuV3JhcHBlcikubWF4TGluZXModGhpcy5tYXhMaW5lc1BlckVudHJ5KCkpO3RoaXMuX3dyaXRlcj1uZXcgbC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIsdyx0aGlzLl93cmFwcGVyKX07eS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHcpe2lmKG51bGw9PQp3KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXc7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUubWF4RW50cmllc1BlclJvdz1mdW5jdGlvbih3KXtpZihudWxsPT13KXJldHVybiB0aGlzLl9tYXhFbnRyaWVzUGVyUm93O3RoaXMuX21heEVudHJpZXNQZXJSb3c9dzt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt5LnByb3RvdHlwZS5tYXhMaW5lc1BlckVudHJ5PWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX21heExpbmVzUGVyRW50cnk7dGhpcy5fbWF4TGluZXNQZXJFbnRyeT13O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3kucHJvdG90eXBlLm1heFdpZHRoPWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX21heFdpZHRoO3RoaXMuX21heFdpZHRoPXc7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuY29tcGFyYXRvcj1mdW5jdGlvbih3KXtudWxsIT13JiYodGhpcy5fY29tcGFyYXRvcj0Kdyx0aGlzLnJlZHJhdygpKX07eS5wcm90b3R5cGUuY29sb3JTY2FsZT1mdW5jdGlvbih3KXtyZXR1cm4gbnVsbCE9dz8odGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spLHRoaXMuX2NvbG9yU2NhbGU9dyx0aGlzLl9jb2xvclNjYWxlLm9uVXBkYXRlKHRoaXMuX3JlZHJhd0NhbGxiYWNrKSx0aGlzLnJlZHJhdygpLHRoaXMpOnRoaXMuX2NvbG9yU2NhbGV9O3kucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfTt5LnByb3RvdHlwZS5fYnVpbGRMZWdlbmRUYWJsZT1mdW5jdGlvbih3LEMpe3ZhciBHPXRoaXMsRD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEI9bmV3IHgodyxDLHRoaXMuX3BhZGRpbmcpO3c9dGhpcy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLnNvcnQoZnVuY3Rpb24oTiwKTyl7cmV0dXJuIEcuX2NvbXBhcmF0b3IoRy5fZm9ybWF0dGVyKE4pLEcuX2Zvcm1hdHRlcihPKSl9KTt2YXIgST1uZXcgdTtCLmFkZFJvdyhJKTtJLmJvdHRvbVBhZGRpbmc9dGhpcy5fcm93Qm90dG9tUGFkZGluZzt3LmZvckVhY2goZnVuY3Rpb24oTil7SS5jb2x1bW5zLmxlbmd0aC8yPT09Ry5tYXhFbnRyaWVzUGVyUm93KCkmJihJPW5ldyB1LEkuYm90dG9tUGFkZGluZz1HLl9yb3dCb3R0b21QYWRkaW5nLEIuYWRkUm93KEkpKTt2YXIgTz1JLmdldFdpZHRoQXZhaWxhYmxlKCksSD1HLl9mb3JtYXR0ZXIoTiksSz1HLl9tZWFzdXJlci5tZWFzdXJlKEgpLndpZHRoOzA+Ty1ELUsmJjE8SS5jb2x1bW5zLmxlbmd0aCYmKEk9bmV3IHUsSS5ib3R0b21QYWRkaW5nPUcuX3Jvd0JvdHRvbVBhZGRpbmcsQi5hZGRSb3coSSkpO0kuYWRkQ29sdW1uKHt3aWR0aDpELGhlaWdodDpELGRhdGE6e25hbWU6Tix0eXBlOiJzeW1ib2wifX0pO089SS5nZXRXaWR0aEF2YWlsYWJsZSgpO089TWF0aC5taW4oTywKSyk7Ry5fd3JhcHBlci5tYXhMaW5lcyhHLm1heExpbmVzUGVyRW50cnkoKSk7SD1HLl93cmFwcGVyLndyYXAoSCxHLl9tZWFzdXJlcixPKS5ub0xpbmVzKkQ7SS5hZGRDb2x1bW4oe3dpZHRoOk8saGVpZ2h0OkgsZGF0YTp7bmFtZTpOLHR5cGU6InRleHQifX0pfSk7cmV0dXJuIEJ9O3kucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHcsQyl7dz10aGlzLl9idWlsZExlZ2VuZFRhYmxlKHEuTWF0aC5taW4oW3RoaXMubWF4V2lkdGgoKSx3XSx3KSxDKTtyZXR1cm57bWluSGVpZ2h0OncuZ2V0SGVpZ2h0KCksbWluV2lkdGg6dy5nZXRXaWR0aCgpfX07eS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih3KXt2YXIgQz10aGlzO2lmKCF0aGlzLl9pc1NldHVwKXJldHVybltdO3ZhciBHPXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3JldHVybiBHLnJvd3MucmVkdWNlKGZ1bmN0aW9uKEQsQixJKXtpZigwIT09RC5sZW5ndGgpcmV0dXJuIEQ7CnZhciBOPUcuZ2V0Um93Qm91bmRzKEkpO3JldHVybiBxLk1hdGgud2l0aGluKHcsTik/Qi5jb2x1bW5zLnJlZHVjZShmdW5jdGlvbihPLEgsSyl7dmFyIE09Ry5nZXRDb2x1bW5Cb3VuZHMoSSxLKTtpZihxLk1hdGgud2l0aGluKHcsTSkpe089Qy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIit5LkxFR0VORF9ST1dfQ0xBU1MpLm5vZGVzKClbSV07Sz10LnNlbGVjdChPKS5zZWxlY3RBbGwoIi4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5ub2RlcygpW01hdGguZmxvb3IoSy8yKV07dmFyIEw9dC5zZWxlY3QoSykuc2VsZWN0KCIuIit5LkxFR0VORF9TWU1CT0xfQ0xBU1MpO009cS5ET00uZ2V0VHJhbnNsYXRlVmFsdWVzKHQuc2VsZWN0KE8pKTtMPXEuRE9NLmdldFRyYW5zbGF0ZVZhbHVlcyhMKTtyZXR1cm5be2JvdW5kczpxLkRPTS5lbGVtZW50QkJveCh0LnNlbGVjdChPKSksZGF0dW06SC5kYXRhLm5hbWUscG9zaXRpb246e3g6TVswXStMWzBdLHk6TVsxXStMWzFdfSxzZWxlY3Rpb246dC5zZWxlY3QoSyksCmNvbXBvbmVudDpDfV19cmV0dXJuIE99LEQpOkR9LFtdKX07eS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciB3PXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3ZhciBDPXRoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX1JPV19DTEFTUykuZGF0YSh3LnJvd3MpLEc9Qy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfUk9XX0NMQVNTLCEwKS5tZXJnZShDKTtDLmV4aXQoKS5yZW1vdmUoKTtHLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oQixJKXtCPXcuZ2V0Um93Qm91bmRzKEkpO3JldHVybiJ0cmFuc2xhdGUoIitCLnRvcExlZnQueCsiLCAiK0IudG9wTGVmdC55KyIpIn0pO3ZhciBEPXRoaXM7Ry5lYWNoKGZ1bmN0aW9uKEIsSSl7Zm9yKHZhciBOPQpbXSxPPTA7TzxCLmNvbHVtbnMubGVuZ3RoO08rPTIpTi5wdXNoKFtCLmNvbHVtbnNbT10sQi5jb2x1bW5zW08rMV1dKTtCPXQuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5kYXRhKE4pO049Qi5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfRU5UUllfQ0xBU1MsITApLm1lcmdlKEIpO04uYXBwZW5kKCJwYXRoIikuYXR0cigiZCIsZnVuY3Rpb24oSCl7SD1IWzBdO3JldHVybiBELnN5bWJvbCgpKEguZGF0YS5uYW1lLEkpKC42KkguaGVpZ2h0KShudWxsKX0pLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oSCl7SD1IWzBdO3JldHVybiJ0cmFuc2xhdGUoIisody5nZXRDb2x1bW5Cb3VuZHMoSSx3LnJvd3NbSV0uY29sdW1ucy5pbmRleE9mKEgpKS50b3BMZWZ0LngrSC53aWR0aC8yKSsiLCAiK0guaGVpZ2h0LzIrIikifSkuYXR0cigiZmlsbCIsZnVuY3Rpb24oSCl7cmV0dXJuIEQuX2NvbG9yU2NhbGUuc2NhbGUoSFswXS5kYXRhLm5hbWUpfSkuYXR0cigib3BhY2l0eSIsCmZ1bmN0aW9uKEgpe3JldHVybiBELnN5bWJvbE9wYWNpdHkoKShIWzBdLmRhdGEubmFtZSxJKX0pLmNsYXNzZWQoeS5MRUdFTkRfU1lNQk9MX0NMQVNTLCEwKTtOLmFwcGVuZCgiZyIpLmNsYXNzZWQoInRleHQtY29udGFpbmVyIiwhMCkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihIKXtyZXR1cm4idHJhbnNsYXRlKCIrdy5nZXRDb2x1bW5Cb3VuZHMoSSx3LnJvd3NbSV0uY29sdW1ucy5pbmRleE9mKEhbMV0pKS50b3BMZWZ0LngrIiwgMCkifSkuZWFjaChmdW5jdGlvbihIKXt2YXIgSz10LnNlbGVjdCh0aGlzKTtIPUhbMV07RC5fd3JpdGVyLndyaXRlKEQuX2Zvcm1hdHRlcihILmRhdGEubmFtZSksSC53aWR0aCxELmhlaWdodCgpLHt4QWxpZ246ImxlZnQiLHlBbGlnbjoidG9wIix0ZXh0Um90YXRpb246MH0sSy5ub2RlKCkpfSk7Qi5leGl0KCkucmVtb3ZlKCl9KTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX3N5bWJvbEZhY3RvcnlBY2Nlc3NvcjsKdGhpcy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yPXc7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sT3BhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zeW1ib2xPcGFjaXR5QWNjZXNzb3J9O3kucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHl9KGQuQ29tcG9uZW50KTtkLkxFR0VORF9ST1dfQ0xBU1M9ImxlZ2VuZC1yb3ciO2QuTEVHRU5EX0VOVFJZX0NMQVNTPSJsZWdlbmQtZW50cnkiO2QuTEVHRU5EX1NZTUJPTF9DTEFTUz0ibGVnZW5kLXN5bWJvbCI7Zi5MZWdlbmQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPQpwfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDIpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXtyZXR1cm4gbnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfWsobSxwKTttLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKG4pe3ZhciBxLHU9SW5maW5pdHk7dGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaChmdW5jdGlvbih4KXt4PXguZW50aXR5TmVhcmVzdChuKTtpZihudWxsIT14KXt2YXIgQT1sLk1hdGguZGlzdGFuY2VTcXVhcmVkKHgucG9zaXRpb24sbik7QTw9dSYmKHU9QSxxPXgpfX0pO3JldHVybiBxfTttLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24obil7aWYobnVsbCE9biYmIShuIGluc3RhbmNlb2YgdC5QbG90KSl0aHJvdyBFcnJvcigiUGxvdCBHcm91cCBvbmx5IGFjY2VwdHMgcGxvdHMiKTsKcC5wcm90b3R5cGUuYXBwZW5kLmNhbGwodGhpcyxuKTtyZXR1cm4gdGhpc307cmV0dXJuIG19KGgoNDEpLkdyb3VwKTtmLlBsb3RHcm91cD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZvaWQgMD09PW4mJihuPVtdKTt2YXIgcT1wLmNhbGwodGhpcyl8fHRoaXM7cS5fcm93UGFkZGluZz0wO3EuX2NvbHVtblBhZGRpbmc9MDtxLl9yb3dzPVtdO3EuX3Jvd1dlaWdodHM9W107cS5fY29sdW1uV2VpZ2h0cz1bXTtxLl9uUm93cz0wO3EuX25Db2xzPTA7cS5fY2FsY3VsYXRlZExheW91dD0KbnVsbDtxLmFkZENsYXNzKCJ0YWJsZSIpO24uZm9yRWFjaChmdW5jdGlvbih1LHgpe3UuZm9yRWFjaChmdW5jdGlvbihBLHkpe251bGwhPUEmJnEuYWRkKEEseCx5KX0pfSk7cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKG4pe2Zvcih2YXIgcT0wO3E8dGhpcy5fblJvd3M7cSsrKWZvcih2YXIgdT0wO3U8dGhpcy5fbkNvbHM7dSsrKW51bGwhPXRoaXMuX3Jvd3NbcV1bdV0mJm4odGhpcy5fcm93c1txXVt1XSl9O20ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKylpZih0aGlzLl9yb3dzW3FdW3VdPT09bilyZXR1cm4hMDtyZXR1cm4hMX07bS5wcm90b3R5cGUuY29tcG9uZW50QXQ9ZnVuY3Rpb24obixxKXtyZXR1cm4gMD5ufHxuPj10aGlzLl9uUm93c3x8MD5xfHxxPj10aGlzLl9uQ29scz9udWxsOnRoaXMuX3Jvd3Nbbl1bcV19O20ucHJvdG90eXBlLmFkZD0KZnVuY3Rpb24obixxLHUpe2lmKG51bGw9PW4pdGhyb3cgRXJyb3IoIkNhbm5vdCBhZGQgbnVsbCB0byBhIHRhYmxlIGNlbGwiKTtpZighdGhpcy5oYXMobikpe2lmKG51bGwhPSh0aGlzLl9yb3dzW3FdJiZ0aGlzLl9yb3dzW3FdW3VdKSl0aHJvdyBFcnJvcigiY2VsbCBpcyBvY2N1cGllZCIpO24uZGV0YWNoKCk7dGhpcy5fblJvd3M9TWF0aC5tYXgocSsxLHRoaXMuX25Sb3dzKTt0aGlzLl9uQ29scz1NYXRoLm1heCh1KzEsdGhpcy5fbkNvbHMpO3RoaXMuX3BhZFRhYmxlVG9TaXplKHRoaXMuX25Sb3dzLHRoaXMuX25Db2xzKTt0aGlzLl9yb3dzW3FdW3VdPW47dGhpcy5fYWRvcHRBbmRBbmNob3Iobik7dGhpcy5yZWRyYXcoKX1yZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKylpZih0aGlzLl9yb3dzW3FdW3VdPT09bil7dGhpcy5fcm93c1txXVt1XT0KbnVsbDtyZXR1cm59fTttLnByb3RvdHlwZS5faXRlcmF0ZUxheW91dD1mdW5jdGlvbihuLHEsdSl7dm9pZCAwPT09dSYmKHU9ITEpO3ZhciB4PXRoaXMuX3Jvd3MsQT10LnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtuLT10aGlzLl9jb2x1bW5QYWRkaW5nKih0aGlzLl9uQ29scy0xKTtxLT10aGlzLl9yb3dQYWRkaW5nKih0aGlzLl9uUm93cy0xKTt4PW0uX2NhbGNDb21wb25lbnRXZWlnaHRzKHRoaXMuX3Jvd1dlaWdodHMseCxmdW5jdGlvbihMKXtyZXR1cm4gbnVsbD09THx8TC5maXhlZEhlaWdodCgpfSk7QT1tLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9jb2x1bW5XZWlnaHRzLEEsZnVuY3Rpb24oTCl7cmV0dXJuIG51bGw9PUx8fEwuZml4ZWRXaWR0aCgpfSk7dmFyIHk9QS5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIDA9PT1MPy41Okx9KSx3PXgubWFwKGZ1bmN0aW9uKEwpe3JldHVybiAwPT09TD8uNTpMfSk7eT1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoeSxuKTt2YXIgQz1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UodywKcSksRz1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fbkNvbHMpLEQ9bC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Sb3dzKTt3PTA7Zm9yKHZhciBCLEksTjs7KXtEPWwuQXJyYXkuYWRkKEQsQyk7eT1sLkFycmF5LmFkZChHLHkpO0I9dGhpcy5fZGV0ZXJtaW5lR3VhcmFudGVlcyh5LEQsdSk7Rz1CLmd1YXJhbnRlZWRXaWR0aHM7RD1CLmd1YXJhbnRlZWRIZWlnaHRzO0k9Qi53YW50c1dpZHRoQXJyLnNvbWUoZnVuY3Rpb24oTCl7cmV0dXJuIEx9KTtOPUIud2FudHNIZWlnaHRBcnIuc29tZShmdW5jdGlvbihMKXtyZXR1cm4gTH0pO3ZhciBPPUssSD1NO3ZhciBLPW4tdC5zdW0oQi5ndWFyYW50ZWVkV2lkdGhzKTt2YXIgTT1xLXQuc3VtKEIuZ3VhcmFudGVlZEhlaWdodHMpO3k9dm9pZCAwO0k/KHk9Qi53YW50c1dpZHRoQXJyLm1hcChmdW5jdGlvbihMKXtyZXR1cm4gTD8uMTowfSkseT1sLkFycmF5LmFkZCh5LEEpKTp5PUE7Qz12b2lkIDA7Tj8oQz1CLndhbnRzSGVpZ2h0QXJyLm1hcChmdW5jdGlvbihMKXtyZXR1cm4gTD8KLjE6MH0pLEM9bC5BcnJheS5hZGQoQyx4KSk6Qz14O3k9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHksSyk7Qz1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoQyxNKTt3Kys7SD0wPE0mJk0hPT1IO2lmKCEoMDxLJiZLIT09T3x8SCkpYnJlYWs7aWYoNTx3KWJyZWFrfUs9bi10LnN1bShCLmd1YXJhbnRlZWRXaWR0aHMpO009cS10LnN1bShCLmd1YXJhbnRlZWRIZWlnaHRzKTt5PW0uX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShBLEspO0M9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHgsTSk7cmV0dXJue2NvbFByb3BvcnRpb25hbFNwYWNlOnkscm93UHJvcG9ydGlvbmFsU3BhY2U6QyxndWFyYW50ZWVkV2lkdGhzOkIuZ3VhcmFudGVlZFdpZHRocyxndWFyYW50ZWVkSGVpZ2h0czpCLmd1YXJhbnRlZWRIZWlnaHRzLHdhbnRzV2lkdGg6SSx3YW50c0hlaWdodDpOfX07bS5wcm90b3R5cGUuX2RldGVybWluZUd1YXJhbnRlZXM9ZnVuY3Rpb24obixxLHUpe3ZvaWQgMD09PXUmJih1PSExKTt2YXIgeD0KbC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Db2xzKSxBPWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uUm93cykseT1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KCExLHRoaXMuX25Db2xzKSx3PWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoITEsdGhpcy5fblJvd3MpO3RoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihDLEcpe0MuZm9yRWFjaChmdW5jdGlvbihELEIpe0Q9bnVsbCE9RD9ELnJlcXVlc3RlZFNwYWNlKG5bQl0scVtHXSk6e21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O3hbQl09TWF0aC5tYXgoeFtCXSx1P01hdGgubWluKEQubWluV2lkdGgsbltCXSk6RC5taW5XaWR0aCk7QVtHXT1NYXRoLm1heChBW0ddLHU/TWF0aC5taW4oRC5taW5IZWlnaHQscVtHXSk6RC5taW5IZWlnaHQpO3ZhciBJPUQubWluV2lkdGg+bltCXTt5W0JdPXlbQl18fEk7Qj1ELm1pbkhlaWdodD5xW0ddO3dbR109d1tHXXx8Qn0pfSk7cmV0dXJue2d1YXJhbnRlZWRXaWR0aHM6eCwKZ3VhcmFudGVlZEhlaWdodHM6QSx3YW50c1dpZHRoQXJyOnksd2FudHNIZWlnaHRBcnI6d319O20ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKG4scSl7dGhpcy5fY2FsY3VsYXRlZExheW91dD10aGlzLl9pdGVyYXRlTGF5b3V0KG4scSk7cmV0dXJue21pbldpZHRoOnQuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZFdpZHRocyksbWluSGVpZ2h0OnQuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpfX07bS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihuLHEsdSl7dmFyIHg9dGhpcztwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxuLHEsdSk7bj10LnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpO3E9dC5zdW0odGhpcy5fY2FsY3VsYXRlZExheW91dC5ndWFyYW50ZWVkSGVpZ2h0cyk7dT10aGlzLl9jYWxjdWxhdGVkTGF5b3V0O2lmKG4+dGhpcy53aWR0aCgpfHwKcT50aGlzLmhlaWdodCgpKXU9dGhpcy5faXRlcmF0ZUxheW91dCh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSwhMCk7dmFyIEE9MCx5PWwuQXJyYXkuYWRkKHUucm93UHJvcG9ydGlvbmFsU3BhY2UsdS5ndWFyYW50ZWVkSGVpZ2h0cyksdz1sLkFycmF5LmFkZCh1LmNvbFByb3BvcnRpb25hbFNwYWNlLHUuZ3VhcmFudGVlZFdpZHRocyk7dGhpcy5fcm93cy5mb3JFYWNoKGZ1bmN0aW9uKEMsRyl7dmFyIEQ9MDtDLmZvckVhY2goZnVuY3Rpb24oQixJKXtudWxsIT1CJiZCLmNvbXB1dGVMYXlvdXQoe3g6RCx5OkF9LHdbSV0seVtHXSk7RCs9d1tJXSt4Ll9jb2x1bW5QYWRkaW5nfSk7QSs9eVtHXSt4Ll9yb3dQYWRkaW5nfSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJvd1BhZGRpbmc9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fcm93UGFkZGluZztpZighbC5NYXRoLmlzVmFsaWROdW1iZXIobil8fDA+bil0aHJvdyBFcnJvcigicm93UGFkZGluZyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpOwp0aGlzLl9yb3dQYWRkaW5nPW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuY29sdW1uUGFkZGluZz1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9jb2x1bW5QYWRkaW5nO2lmKCFsLk1hdGguaXNWYWxpZE51bWJlcihuKXx8MD5uKXRocm93IEVycm9yKCJjb2x1bW5QYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uUGFkZGluZz1uO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJvd1dlaWdodD1mdW5jdGlvbihuLHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX3Jvd1dlaWdodHNbbl07aWYoIWwuTWF0aC5pc1ZhbGlkTnVtYmVyKHEpfHwwPnEpdGhyb3cgRXJyb3IoInJvd1dlaWdodCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3RoaXMuX3Jvd1dlaWdodHNbbl09cTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5jb2x1bW5XZWlnaHQ9CmZ1bmN0aW9uKG4scSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1tuXTtpZighbC5NYXRoLmlzVmFsaWROdW1iZXIocSl8fDA+cSl0aHJvdyBFcnJvcigiY29sdW1uV2VpZ2h0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uV2VpZ2h0c1tuXT1xO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXt2YXIgbj10LnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtyZXR1cm4gbS5fZml4ZWRTcGFjZShuLGZ1bmN0aW9uKHEpe3JldHVybiBudWxsPT1xfHxxLmZpeGVkV2lkdGgoKX0pfTttLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBtLl9maXhlZFNwYWNlKHRoaXMuX3Jvd3MsZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PW58fG4uZml4ZWRIZWlnaHQoKX0pfTttLnByb3RvdHlwZS5fcGFkVGFibGVUb1NpemU9ZnVuY3Rpb24obixxKXtmb3IodmFyIHU9CjA7dTxuO3UrKyl7dm9pZCAwPT09dGhpcy5fcm93c1t1XSYmKHRoaXMuX3Jvd3NbdV09W10sdGhpcy5fcm93V2VpZ2h0c1t1XT1udWxsKTtmb3IodmFyIHg9MDt4PHE7eCsrKXZvaWQgMD09PXRoaXMuX3Jvd3NbdV1beF0mJih0aGlzLl9yb3dzW3VdW3hdPW51bGwpfWZvcih4PTA7eDxxO3grKyl2b2lkIDA9PT10aGlzLl9jb2x1bW5XZWlnaHRzW3hdJiYodGhpcy5fY29sdW1uV2VpZ2h0c1t4XT1udWxsKX07bS5fY2FsY0NvbXBvbmVudFdlaWdodHM9ZnVuY3Rpb24obixxLHUpe3JldHVybiBuLm1hcChmdW5jdGlvbih4LEEpe3JldHVybiBudWxsIT14P3g6cVtBXS5tYXAodSkucmVkdWNlKGZ1bmN0aW9uKHksdyl7cmV0dXJuIHkmJnd9LCEwKT8wOjF9KX07bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlPWZ1bmN0aW9uKG4scSl7dmFyIHU9dC5zdW0obik7cmV0dXJuIDA9PT11P2wuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCxuLmxlbmd0aCk6bi5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHEqCngvdX0pfTttLl9maXhlZFNwYWNlPWZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSh4KXtyZXR1cm4geC5yZWR1Y2UoZnVuY3Rpb24oQSx5KXtyZXR1cm4gQSYmeX0sITApfXJldHVybiB1KG4ubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB1KHgubWFwKHEpKX0pKX07cmV0dXJuIG19KGgoMjkpLkNvbXBvbmVudENvbnRhaW5lcik7Zi5UYWJsZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3ZhciBwPXQuY2FsbCh0aGlzKXx8dGhpcztwLmFkZENsYXNzKCJ4LWRyYWctYm94LWxheWVyIik7cC5faGFzQ29ybmVycz0hMTsKcmV0dXJuIHB9ayhsLHQpO2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24ocCxtLG4pe3QucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHAsbSxuKTt0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24ocCl7dC5wcm90b3R5cGUuX3NldEJvdW5kcy5jYWxsKHRoaXMse3RvcExlZnQ6e3g6cC50b3BMZWZ0LngseTowfSxib3R0b21SaWdodDp7eDpwLmJvdHRvbVJpZ2h0LngseTp0aGlzLmhlaWdodCgpfX0pfTtsLnByb3RvdHlwZS5fc2V0UmVzaXphYmxlQ2xhc3Nlcz1mdW5jdGlvbihwKXtwJiZ0aGlzLmVuYWJsZWQoKT90aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpOnRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIil9O2wucHJvdG90eXBlLnlTY2FsZT1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiB0LnByb3RvdHlwZS55U2NhbGUuY2FsbCh0aGlzKTt0aHJvdyBFcnJvcigieVNjYWxlcyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEcmFnQm94TGF5ZXIiKTsKfTtsLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnlFeHRlbnQuY2FsbCh0aGlzKTt0aHJvdyBFcnJvcigiWERyYWdCb3hMYXllciBoYXMgbm8geUV4dGVudCIpO307cmV0dXJuIGx9KGgoMzIpLkRyYWdCb3hMYXllcik7Zi5YRHJhZ0JveExheWVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7dmFyIHA9dC5jYWxsKHRoaXMpfHx0aGlzO3AuYWRkQ2xhc3MoInktZHJhZy1ib3gtbGF5ZXIiKTtwLl9oYXNDb3JuZXJzPSExO3JldHVybiBwfWsobCx0KTtsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbihwLG0sbil7dC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMscCxtLG4pO3RoaXMuX3NldEJvdW5kcyh0aGlzLmJvdW5kcygpKTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbihwKXt0LnByb3RvdHlwZS5fc2V0Qm91bmRzLmNhbGwodGhpcyx7dG9wTGVmdDp7eDowLHk6cC50b3BMZWZ0Lnl9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OnAuYm90dG9tUmlnaHQueX19KX07bC5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24ocCl7cCYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ5LXJlc2l6YWJsZSIpfTtsLnByb3RvdHlwZS54U2NhbGU9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdC5wcm90b3R5cGUueFNjYWxlLmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoInhTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBZRHJhZ0JveExheWVyIik7Cn07bC5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS54RXh0ZW50LmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoIllEcmFnQm94TGF5ZXIgaGFzIG5vIHhFeHRlbnQiKTt9O3JldHVybiBsfShoKDMyKS5EcmFnQm94TGF5ZXIpO2YuWURyYWdCb3hMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3ZhciBwPXQuY2FsbCh0aGlzKXx8dGhpcztwLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2wuX0tFWURPV05fRVZFTlRfTkFNRV09ZnVuY3Rpb24obSl7cmV0dXJuIHAuX3Byb2Nlc3NLZXlkb3duKG0pfTsKcC5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltsLl9LRVlVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbihtKXtyZXR1cm4gcC5fcHJvY2Vzc0tleXVwKG0pfTtyZXR1cm4gcH1rKGwsdCk7bC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKCl7dmFyIHA9ZG9jdW1lbnRbbC5fRElTUEFUQ0hFUl9LRVldO251bGw9PXAmJihwPW5ldyBsLGRvY3VtZW50W2wuX0RJU1BBVENIRVJfS0VZXT1wKTtyZXR1cm4gcH07bC5wcm90b3R5cGUuX3Byb2Nlc3NLZXlkb3duPWZ1bmN0aW9uKHApe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChsLl9LRVlET1dOX0VWRU5UX05BTUUscC5rZXlDb2RlLHApfTtsLnByb3RvdHlwZS5fcHJvY2Vzc0tleXVwPWZ1bmN0aW9uKHApe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChsLl9LRVlVUF9FVkVOVF9OQU1FLHAua2V5Q29kZSxwKX07bC5wcm90b3R5cGUub25LZXlEb3duPWZ1bmN0aW9uKHApe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQobC5fS0VZRE9XTl9FVkVOVF9OQU1FLApwKX07bC5wcm90b3R5cGUub2ZmS2V5RG93bj1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGwuX0tFWURPV05fRVZFTlRfTkFNRSxwKX07bC5wcm90b3R5cGUub25LZXlVcD1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGwuX0tFWVVQX0VWRU5UX05BTUUscCl9O2wucHJvdG90eXBlLm9mZktleVVwPWZ1bmN0aW9uKHApe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQobC5fS0VZVVBfRVZFTlRfTkFNRSxwKX07cmV0dXJuIGx9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX0tleSI7ZC5fS0VZRE9XTl9FVkVOVF9OQU1FPSJrZXlkb3duIjtkLl9LRVlVUF9FVkVOVF9OQU1FPSJrZXl1cCI7Zi5LZXk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmCihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0sdD1oKDApO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtKXtmdW5jdGlvbiBuKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLCJwYWdlIil9dmFyIHE9bC5jYWxsKHRoaXMpfHx0aGlzO3EuX2xhc3RNb3VzZVBvc2l0aW9uPXt4Oi0xLHk6LTF9O3EuX3RyYW5zbGF0b3I9dC5nZXRUcmFuc2xhdG9yKG0pO3EuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bcC5fTU9VU0VPVkVSX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRU1PVkVfRVZFTlRfTkFNRV09bjtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX01PVVNFT1VUX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRURPV05fRVZFTlRfTkFNRV09CmZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFRE9XTl9FVkVOVF9OQU1FKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRVVQX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFVVBfRVZFTlRfTkFNRSwicGFnZSIpfTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1dIRUVMX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX1dIRUVMX0VWRU5UX05BTUUpfTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX0RCTENMSUNLX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX0RCTENMSUNLX0VWRU5UX05BTUUpfTtyZXR1cm4gcX1rKHAsbCk7cC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKG0pe3ZhciBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCksCnE9bltwLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09cSYmKHE9bmV3IHAobSksbltwLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9O3AucHJvdG90eXBlLm9uTW91c2VNb3ZlPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VNT1ZFX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9mZk1vdXNlTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vbk1vdXNlRG93bj1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFRE9XTl9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZNb3VzZURvd249ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9NT1VTRURPV05fRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25Nb3VzZVVwPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VVUF9FVkVOVF9OQU1FLAptKX07cC5wcm90b3R5cGUub2ZmTW91c2VVcD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFVVBfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25XaGVlbD1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1dIRUVMX0VWRU5UX05BTUUsbSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZldoZWVsPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fV0hFRUxfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25EYmxDbGljaz1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX0RCTENMSUNLX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9mZkRibENsaWNrPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fREJMQ0xJQ0tfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUuX21lYXN1cmVBbmREaXNwYXRjaD1mdW5jdGlvbihtLG4scSwKdSl7dm9pZCAwPT09dSYmKHU9ImVsZW1lbnQiKTtpZigicGFnZSIhPT11JiYiZWxlbWVudCIhPT11KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciK3UrIicsIG11c3QgYmUgJ2VsZW1lbnQnIG9yICdwYWdlJyIpO2lmKCJwYWdlIj09PXV8fHRoaXMuZXZlbnRJbnNpZGUobSxuKSl0aGlzLl9sYXN0TW91c2VQb3NpdGlvbj10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbihuLmNsaWVudFgsbi5jbGllbnRZKSx0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQocSx0aGlzLmxhc3RNb3VzZVBvc2l0aW9uKCksbil9O3AucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHQuVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlKG0sbil9O3AucHJvdG90eXBlLmxhc3RNb3VzZVBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhc3RNb3VzZVBvc2l0aW9ufTtyZXR1cm4gcH0oaCgyNCkuRGlzcGF0Y2hlcik7ZC5fRElTUEFUQ0hFUl9LRVk9Il9fUGxvdHRhYmxlX0Rpc3BhdGNoZXJfTW91c2UiOwpkLl9NT1VTRU9WRVJfRVZFTlRfTkFNRT0ibW91c2VvdmVyIjtkLl9NT1VTRU1PVkVfRVZFTlRfTkFNRT0ibW91c2Vtb3ZlIjtkLl9NT1VTRU9VVF9FVkVOVF9OQU1FPSJtb3VzZW91dCI7ZC5fTU9VU0VET1dOX0VWRU5UX05BTUU9Im1vdXNlZG93biI7ZC5fTU9VU0VVUF9FVkVOVF9OQU1FPSJtb3VzZXVwIjtkLl9XSEVFTF9FVkVOVF9OQU1FPSJ3aGVlbCI7ZC5fREJMQ0xJQ0tfRVZFTlRfTkFNRT0iZGJsY2xpY2siO2YuTW91c2U9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSx0PWgoMCk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0pe3ZhciBuPWwuY2FsbCh0aGlzKXx8CnRoaXM7bi5fdHJhbnNsYXRvcj10LmdldFRyYW5zbGF0b3IobSk7bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSFNUQVJUX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSxxLHAuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSwicGFnZSIpfTtuLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1RPVUNITU9WRV9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0scSxwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfTtuLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1RPVUNIRU5EX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSxxLHAuX1RPVUNIRU5EX0VWRU5UX05BTUUsInBhZ2UiKX07bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0sCnEscC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSwicGFnZSIpfTtyZXR1cm4gbn1rKHAsbCk7cC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKG0pe3ZhciBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCkscT1uW3AuX0RJU1BBVENIRVJfS0VZXTtudWxsPT1xJiYocT1uZXcgcChtKSxuW3AuX0RJU1BBVENIRVJfS0VZXT1xKTtyZXR1cm4gcX07cC5wcm90b3R5cGUub25Ub3VjaFN0YXJ0PWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaFN0YXJ0PWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vblRvdWNoTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNITU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaE1vdmU9ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwKbSl9O3AucHJvdG90eXBlLm9uVG91Y2hFbmQ9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSEVORF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaEVuZD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIRU5EX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9uVG91Y2hDYW5jZWw9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaENhbmNlbD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2g9ZnVuY3Rpb24obSxuLHEsdSl7dm9pZCAwPT09dSYmKHU9ImVsZW1lbnQiKTtpZigicGFnZSIhPT11JiYiZWxlbWVudCIhPT11KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciKwp1KyInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTtpZigiZWxlbWVudCIhPT11fHx0aGlzLmV2ZW50SW5zaWRlKG0sbikpe209bi5jaGFuZ2VkVG91Y2hlczt1PXt9O2Zvcih2YXIgeD1bXSxBPTA7QTxtLmxlbmd0aDtBKyspe3ZhciB5PW1bQV0sdz15LmlkZW50aWZpZXI7eT10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbih5LmNsaWVudFgseS5jbGllbnRZKTtudWxsIT15JiYodVt3XT15LHgucHVzaCh3KSl9MDx4Lmxlbmd0aCYmdGhpcy5fY2FsbENhbGxiYWNrc0ZvckV2ZW50KHEseCx1LG4pfX07cC5wcm90b3R5cGUuZXZlbnRJbnNpZGU9ZnVuY3Rpb24obSxuKXtyZXR1cm4gdC5UcmFuc2xhdG9yLmlzRXZlbnRJbnNpZGUobSxuKX07cmV0dXJuIHB9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX1RvdWNoIjtkLl9UT1VDSFNUQVJUX0VWRU5UX05BTUU9InRvdWNoc3RhcnQiO2QuX1RPVUNITU9WRV9FVkVOVF9OQU1FPQoidG91Y2htb3ZlIjtkLl9UT1VDSEVORF9FVkVOVF9OQU1FPSJ0b3VjaGVuZCI7ZC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRT0idG91Y2hjYW5jZWwiO2YuVG91Y2g9ZH0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQsbCl7dm9pZCAwPT09bCYmKGw9d2luZG93LmRldmljZVBpeGVsUmF0aW8pO3RoaXMuc2NyZWVuV2lkdGg9azt0aGlzLnNjcmVlbkhlaWdodD10O3RoaXMuZGV2aWNlUGl4ZWxSYXRpbz1sO3RoaXMucGl4ZWxXaWR0aD1rKmw7dGhpcy5waXhlbEhlaWdodD10Kmw7dGhpcy5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7dGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTtoLnNpemVQaXhlbHModGhpcy5jdHgsayx0LGwpfWguc2l6ZVBpeGVscz1mdW5jdGlvbihrLHQsbCxwKXt2YXIgbT1rLmNhbnZhczttLndpZHRoPXQqcDttLmhlaWdodD1sKnA7bS5zdHlsZS53aWR0aD10KyJweCI7bS5zdHlsZS5oZWlnaHQ9CmwrInB4IjtrLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7ay5zY2FsZShwLHApfTtoLnByb3RvdHlwZS5ibGl0PWZ1bmN0aW9uKGssdCxsKXt2b2lkIDA9PT10JiYodD0wKTt2b2lkIDA9PT1sJiYobD0wKTtrLmRyYXdJbWFnZSh0aGlzLmNhbnZhcyx0LGwsdGhpcy5zY3JlZW5XaWR0aCx0aGlzLnNjcmVlbkhlaWdodCl9O2gucHJvdG90eXBlLmJsaXRDZW50ZXI9ZnVuY3Rpb24oayx0LGwpe3ZvaWQgMD09PXQmJih0PTApO3ZvaWQgMD09PWwmJihsPTApO3RoaXMuYmxpdChrLE1hdGguZmxvb3IodC10aGlzLnNjcmVlbldpZHRoLzIpLE1hdGguZmxvb3IobC10aGlzLnNjcmVlbkhlaWdodC8yKSl9O2gucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihrLHQsbCl7dm9pZCAwPT09bCYmKGw9ITEpO3ZhciBwPXRoaXMuZGV2aWNlUGl4ZWxSYXRpbzt0aGlzLnNjcmVlbldpZHRoPWs7dGhpcy5zY3JlZW5IZWlnaHQ9dDt0aGlzLnBpeGVsV2lkdGg9aypwO3RoaXMucGl4ZWxIZWlnaHQ9dCpwOwpoLnNpemVQaXhlbHModGhpcy5jdHgsayx0LHApO2wmJnRoaXMuY3R4LnRyYW5zbGF0ZShrLzIsay8yKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oayl7dmFyIHQ9dGhpcy5waXhlbFdpZHRoLGw9dGhpcy5waXhlbEhlaWdodCxwPXRoaXMuY3R4O3Auc2F2ZSgpO3Auc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTtudWxsPT1rP3AuY2xlYXJSZWN0KDAsMCx0LGwpOihwLmZpbGxTdHlsZT1rLHAuZmlsbFJlY3QoMCwwLHQsbCkpO3AucmVzdG9yZSgpO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5nZXRJbWFnZURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnBpeGVsV2lkdGgsdGhpcy5waXhlbEhlaWdodCl9O3JldHVybiBofSgpO2YuQ2FudmFzQnVmZmVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxMyksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPW51bGwhPT1wJiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztuLl9jbGlja2VkRG93bj0hMTtuLl9kb3VibGVDbGlja2luZz0hMTtuLl9vbkNsaWNrQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX29uRG91YmxlQ2xpY2tDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fbW91c2VEb3duQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrRG93bihxKX07bi5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrVXAocSx1KX07bi5fZGJsQ2xpY2tDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVEYmxDbGljayhxLAp1KX07bi5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrRG93bih1W3FbMF1dKX07bi5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrVXAodVtxWzBdXSx4KX07bi5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBuLl9jbGlja2VkRG93bj0hMX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fbW91c2VEaXNwYXRjaGVyPXQuTW91c2UuZ2V0RGlzcGF0Y2hlcihuKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25EYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKTsKdGhpcy5fdG91Y2hEaXNwYXRjaGVyPXQuVG91Y2guZ2V0RGlzcGF0Y2hlcihuKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9O20ucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3AucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZkRibENsaWNrKHRoaXMuX2RibENsaWNrQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O20ucHJvdG90eXBlLl9oYW5kbGVDbGlja0Rvd249ZnVuY3Rpb24obil7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pJiYodGhpcy5fY2xpY2tlZERvd249ITAsdGhpcy5fY2xpY2tlZFBvaW50PW4pfTttLnByb3RvdHlwZS5faGFuZGxlQ2xpY2tVcD1mdW5jdGlvbihuLHEpe3ZhciB1PXRoaXMseD10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2NsaWNrZWREb3duJiZtLl9wb2ludHNFcXVhbCh4LHRoaXMuX2NsaWNrZWRQb2ludCkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXt1Ll9kb3VibGVDbGlja2luZ3x8dS5fb25DbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHgsCnEpfSwwKTt0aGlzLl9jbGlja2VkRG93bj0hMX07bS5wcm90b3R5cGUuX2hhbmRsZURibENsaWNrPWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcztuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2Uobik7dGhpcy5fZG91YmxlQ2xpY2tpbmc9ITA7dGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4scSk7c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB1Ll9kb3VibGVDbGlja2luZz0hMX0sMCl9O20uX3BvaW50c0VxdWFsPWZ1bmN0aW9uKG4scSl7cmV0dXJuIG4ueD09PXEueCYmbi55PT09cS55fTttLnByb3RvdHlwZS5vbkNsaWNrPWZ1bmN0aW9uKG4pe3RoaXMuX29uQ2xpY2tDYWxsYmFja3MuYWRkKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmRlbGV0ZShuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25Eb3VibGVDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzLmFkZChuKX07Cm0ucHJvdG90eXBlLm9mZkRvdWJsZUNsaWNrPWZ1bmN0aW9uKG4pe3RoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuZGVsZXRlKG4pO3JldHVybiB0aGlzfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2YuQ2xpY2s9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMTMpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1udWxsIT09cCYmcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7bi5fZHJhZ2dpbmc9ITE7bi5fY29uc3RyYWluZWRUb0NvbXBvbmVudD0hMDtuLl9tb3VzZUZpbHRlcj1tLl9ERUZBVUxUX01PVVNFX0ZJTFRFUjsKbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX2RyYWdDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fZHJhZ0VuZENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9tb3VzZURvd25DYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9zdGFydERyYWcocSx1KX07bi5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2RvRHJhZyhxKX07bi5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2VuZERyYWcocSx1KX07bi5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHEsdSx4KXtyZXR1cm4gbi5fc3RhcnREcmFnKHVbcVswXV0seCl9O24uX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2RvRHJhZyh1W3FbMF1dKX07bi5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX2VuZERyYWcodVtxWzBdXSx4KX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9CmZ1bmN0aW9uKG4pe3AucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLG4pO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj10Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9dC5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spfTsKbS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbDt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbj0KZnVuY3Rpb24obil7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3JldHVybiB0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50P3t4OmwuTWF0aC5jbGFtcChuLngsMCx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkpLHk6bC5NYXRoLmNsYW1wKG4ueSwwLHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8uaGVpZ2h0KCkpfTpufTttLnByb3RvdHlwZS5fc3RhcnREcmFnPWZ1bmN0aW9uKG4scSl7cSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJiF0aGlzLl9tb3VzZUZpbHRlcihxKXx8KG49dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShuKSx0aGlzLl9pc0luc2lkZUNvbXBvbmVudChuKSYmKHEucHJldmVudERlZmF1bHQoKSx0aGlzLl9kcmFnZ2luZz0hMCx0aGlzLl9kcmFnT3JpZ2luPW4sdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbikpKX07bS5wcm90b3R5cGUuX2RvRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnZ2luZyYmCnRoaXMuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luLHRoaXMuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbihuKSl9O20ucHJvdG90eXBlLl9lbmREcmFnPWZ1bmN0aW9uKG4scSl7cSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJjAhPT1xLmJ1dHRvbnx8IXRoaXMuX2RyYWdnaW5nfHwodGhpcy5fZHJhZ2dpbmc9ITEsdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4sdGhpcy5fdHJhbnNsYXRlQW5kQ29uc3RyYWluKG4pKSl9O20ucHJvdG90eXBlLmNvbnN0cmFpbmVkVG9Db21wb25lbnQ9ZnVuY3Rpb24oKXt0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50PSExfTttLnByb3RvdHlwZS5tb3VzZUZpbHRlcj1mdW5jdGlvbihuKXswIT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX21vdXNlRmlsdGVyPW4pfTttLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuYWRkKG4pfTsKbS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZEcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKG4pfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2QuX0RFRkFVTFRfTU9VU0VfRklMVEVSPWZ1bmN0aW9uKHApe3JldHVybiAwPT09cC5idXR0b259O2YuRHJhZz1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHUseCl7ZnVuY3Rpb24gQSgpe3RoaXMuY29uc3RydWN0b3I9CnV9Zm9yKHZhciB5IGluIHgpeC5oYXNPd25Qcm9wZXJ0eSh5KSYmKHVbeV09eFt5XSk7dS5wcm90b3R5cGU9bnVsbD09PXg/T2JqZWN0LmNyZWF0ZSh4KTooQS5wcm90b3R5cGU9eC5wcm90b3R5cGUsbmV3IEEpfSx0PWgoMSksbD1oKDEzKSxwPWgoMyksbT1oKDApLG49aCgyNSk7ZD1oKDE1KTt2YXIgcT1oKDI2KTtoPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHgoQSx5KXt2YXIgdz11LmNhbGwodGhpcyl8fHRoaXM7dy5fd2hlZWxGaWx0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMH07dy5fd2hlZWxDYWxsYmFjaz1mdW5jdGlvbihDLEcpe3JldHVybiB3Ll9oYW5kbGVXaGVlbEV2ZW50KEMsRyl9O3cuX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihDLEcpe3JldHVybiB3Ll9oYW5kbGVUb3VjaFN0YXJ0KEMsRyl9O3cuX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKEMsRyl7cmV0dXJuIHcuX2hhbmRsZVBpbmNoKEMsRyl9O3cuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24oQyl7cmV0dXJuIHcuX2hhbmRsZVRvdWNoRW5kKEMpfTsKdy5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihDKXtyZXR1cm4gdy5faGFuZGxlVG91Y2hFbmQoQyl9O3cuX3BhbkVuZENhbGxiYWNrcz1uZXcgbS5DYWxsYmFja1NldDt3Ll96b29tRW5kQ2FsbGJhY2tzPW5ldyBtLkNhbGxiYWNrU2V0O3cuX3Bhblpvb21VcGRhdGVDYWxsYmFja3M9bmV3IG0uQ2FsbGJhY2tTZXQ7dy5feFNjYWxlcz1uZXcgbS5TZXQ7dy5feVNjYWxlcz1uZXcgbS5TZXQ7dy5fZHJhZ0ludGVyYWN0aW9uPW5ldyBuLkRyYWc7dy5fc2V0dXBEcmFnSW50ZXJhY3Rpb24oKTt3Ll90b3VjaElkcz10Lm1hcCgpO3cuX21pbkRvbWFpbkV4dGVudHM9bmV3IG0uTWFwO3cuX21heERvbWFpbkV4dGVudHM9bmV3IG0uTWFwO3cuX21pbkRvbWFpblZhbHVlcz1uZXcgbS5NYXA7dy5fbWF4RG9tYWluVmFsdWVzPW5ldyBtLk1hcDtudWxsIT1BJiZ3LmFkZFhTY2FsZShBKTtudWxsIT15JiZ3LmFkZFlTY2FsZSh5KTtyZXR1cm4gd31rKHgsdSk7eC5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259O3gucHJvdG90eXBlLndoZWVsRmlsdGVyPWZ1bmN0aW9uKEEpezAhPT1hcmd1bWVudHMubGVuZ3RoJiYodGhpcy5fd2hlZWxGaWx0ZXI9QSl9O3gucHJvdG90eXBlLnBhbj1mdW5jdGlvbihBKXt2YXIgeT10aGlzO3RoaXMueFNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24odyl7dy5wYW4oeS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbih3LEEueCkpfSk7dGhpcy55U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbih3KXt3LnBhbih5Ll9jb25zdHJhaW5lZFRyYW5zbGF0aW9uKHcsQS55KSl9KTt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKX07eC5wcm90b3R5cGUuem9vbT1mdW5jdGlvbihBLHksdyl7dmFyIEM9dGhpczt2b2lkIDA9PT13JiYodz0hMCk7aWYobnVsbCE9eSl7dmFyIEc9eS54O3ZhciBEPXkueTt3JiYodGhpcy54U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXtCPUMuX2NvbnN0cmFpbmVkWm9vbShCLApBLEcpO0c9Qi5jZW50ZXJQb2ludDtBPUIuem9vbUFtb3VudH0pLHRoaXMueVNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oQil7Qj1DLl9jb25zdHJhaW5lZFpvb20oQixBLEQpO0Q9Qi5jZW50ZXJQb2ludDtBPUIuem9vbUFtb3VudH0pKX10aGlzLnhTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBJPUIucmFuZ2UoKTtCLnpvb20oQSxudWxsPT1HPyhJWzFdK0lbMF0pLzI6Ryl9KTt0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBJPUIucmFuZ2UoKTtCLnpvb20oQSxudWxsPT1EPyhJWzFdK0lbMF0pLzI6RCl9KTt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKTtyZXR1cm57em9vbUFtb3VudDpBLGNlbnRlclZhbHVlOntjZW50ZXJYOkcsY2VudGVyWTpEfX19O3gucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24oQSl7dS5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsQSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKEEpOwp0aGlzLl9tb3VzZURpc3BhdGNoZXI9bC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKHRoaXMuX3doZWVsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1sLlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9O3gucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3UucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKTsKdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1udWxsO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX07eC5wcm90b3R5cGUuX2hhbmRsZVRvdWNoU3RhcnQ9ZnVuY3Rpb24oQSx5KXtmb3IodmFyIHc9MDt3PEEubGVuZ3RoJiYyPnRoaXMuX3RvdWNoSWRzLnNpemUoKTt3Kyspe3ZhciBDPUFbd107dGhpcy5fdG91Y2hJZHMuc2V0KEMudG9TdHJpbmcoKSx0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHlbQ10pKX19Owp4LnByb3RvdHlwZS5faGFuZGxlUGluY2g9ZnVuY3Rpb24oQSx5KXt2YXIgdz10aGlzO2lmKCEoMj50aGlzLl90b3VjaElkcy5zaXplKCkpKXt2YXIgQz10aGlzLl90b3VjaElkcy52YWx1ZXMoKTtpZih0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKENbMF0pKSYmdGhpcy5faXNJbnNpZGVDb21wb25lbnQodGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShDWzFdKSkpe3ZhciBHPXguX3BvaW50RGlzdGFuY2UoQ1swXSxDWzFdKTtpZigwIT09Ryl7QS5mb3JFYWNoKGZ1bmN0aW9uKE8pe3cuX3RvdWNoSWRzLmhhcyhPLnRvU3RyaW5nKCkpJiZ3Ll90b3VjaElkcy5zZXQoTy50b1N0cmluZygpLHcuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoeVtPXSkpfSk7QT10aGlzLl90b3VjaElkcy52YWx1ZXMoKTt2YXIgRD14Ll9wb2ludERpc3RhbmNlKEFbMF0sQVsxXSk7aWYoMCE9PUQpe3ZhciBCPUcvRCxJPUEubWFwKGZ1bmN0aW9uKE8sCkgpe3JldHVybnt4OihPLngtQ1tIXS54KS9CLHk6KE8ueS1DW0hdLnkpL0J9fSk7Rz14LmNlbnRlclBvaW50KENbMF0sQ1sxXSk7Rz10aGlzLnpvb20oQixHKTtBPUcuY2VudGVyVmFsdWU7dmFyIE49Ry56b29tQW1vdW50O0c9QS5jZW50ZXJYO0E9QS5jZW50ZXJZO0Q9Qy5tYXAoZnVuY3Rpb24oTyxIKXtyZXR1cm57eDpJW0hdLngqTitPLngseTpJW0hdLnkqTitPLnl9fSk7dGhpcy5wYW4oe3g6Ry0oRFswXS54K0RbMV0ueCkvMix5OkEtKERbMF0ueStEWzFdLnkpLzJ9KX19fX19O3guY2VudGVyUG9pbnQ9ZnVuY3Rpb24oQSx5KXtyZXR1cm57eDooTWF0aC5taW4oQS54LHkueCkrTWF0aC5tYXgoQS54LHkueCkpLzIseTooTWF0aC5tYXgoQS55LHkueSkrTWF0aC5taW4oQS55LHkueSkpLzJ9fTt4Ll9wb2ludERpc3RhbmNlPWZ1bmN0aW9uKEEseSl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhNYXRoLm1heChBLngseS54KS1NYXRoLm1pbihBLngseS54KSwyKStNYXRoLnBvdyhNYXRoLm1heChBLnksCnkueSktTWF0aC5taW4oQS55LHkueSksMikpfTt4LnByb3RvdHlwZS5faGFuZGxlVG91Y2hFbmQ9ZnVuY3Rpb24oQSl7dmFyIHk9dGhpcztBLmZvckVhY2goZnVuY3Rpb24odyl7eS5fdG91Y2hJZHMucmVtb3ZlKHcudG9TdHJpbmcoKSl9KTswPHRoaXMuX3RvdWNoSWRzLnNpemUoKSYmdGhpcy5fem9vbUVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9O3gucHJvdG90eXBlLl9oYW5kbGVXaGVlbEV2ZW50PWZ1bmN0aW9uKEEseSl7dGhpcy5fd2hlZWxGaWx0ZXIoeSkmJihBPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoQSksdGhpcy5faXNJbnNpZGVDb21wb25lbnQoQSkmJih5LnByZXZlbnREZWZhdWx0KCksdGhpcy56b29tKE1hdGgucG93KDIsKDAhPT15LmRlbHRhWT95LmRlbHRhWTp5LmRlbHRhWCkqKHkuZGVsdGFNb2RlP3guX1BJWEVMU19QRVJfTElORToxKSouMDAyKSxBKSx0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKSkpfTt4LnByb3RvdHlwZS5fY29uc3RyYWluZWRab29tPQpmdW5jdGlvbihBLHksdyl7cmV0dXJuIHEuY29uc3RyYWluZWRab29tKEEseSx3LHRoaXMubWluRG9tYWluRXh0ZW50KEEpLHRoaXMubWF4RG9tYWluRXh0ZW50KEEpLHRoaXMubWluRG9tYWluVmFsdWUoQSksdGhpcy5tYXhEb21haW5WYWx1ZShBKSl9O3gucHJvdG90eXBlLl9jb25zdHJhaW5lZFRyYW5zbGF0aW9uPWZ1bmN0aW9uKEEseSl7cmV0dXJuIHEuY29uc3RyYWluZWRUcmFuc2xhdGlvbihBLHksdGhpcy5taW5Eb21haW5WYWx1ZShBKSx0aGlzLm1heERvbWFpblZhbHVlKEEpKX07eC5wcm90b3R5cGUuX3NldHVwRHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7dmFyIEE9dGhpczt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uY29uc3RyYWluZWRUb0NvbXBvbmVudCgpO3ZhciB5O3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydChmdW5jdGlvbigpe3JldHVybiB5PW51bGx9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKGZ1bmN0aW9uKHcsQyl7Mjw9QS5fdG91Y2hJZHMuc2l6ZSgpfHwKKEEucGFuKHt4OihudWxsPT15P3cueDp5LngpLUMueCx5OihudWxsPT15P3cueTp5LnkpLUMueX0pLHk9Qyl9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKGZ1bmN0aW9uKCl7cmV0dXJuIEEuX3BhbkVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9KX07eC5wcm90b3R5cGUuX25vbkxpbmVhclNjYWxlV2l0aEV4dGVudHM9ZnVuY3Rpb24oQSl7cmV0dXJuIG51bGwhPXRoaXMubWluRG9tYWluRXh0ZW50KEEpJiZudWxsIT10aGlzLm1heERvbWFpbkV4dGVudChBKSYmIShBIGluc3RhbmNlb2YgcC5MaW5lYXIpJiYhKEEgaW5zdGFuY2VvZiBwLlRpbWUpfTt4LnByb3RvdHlwZS54U2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEE9W107dGhpcy5feFNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHkpe0EucHVzaCh5KX0pO3JldHVybiBBfTt4LnByb3RvdHlwZS55U2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEE9W107dGhpcy5feVNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHkpe0EucHVzaCh5KX0pOwpyZXR1cm4gQX07eC5wcm90b3R5cGUuYWRkWFNjYWxlPWZ1bmN0aW9uKEEpe3RoaXMuX3hTY2FsZXMuYWRkKEEpfTt4LnByb3RvdHlwZS5yZW1vdmVYU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feFNjYWxlcy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWF4RG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5hZGRZU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feVNjYWxlcy5hZGQoQSl9O3gucHJvdG90eXBlLnJlbW92ZVlTY2FsZT1mdW5jdGlvbihBKXt0aGlzLl95U2NhbGVzLmRlbGV0ZShBKTt0aGlzLl9taW5Eb21haW5FeHRlbnRzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5FeHRlbnRzLmRlbGV0ZShBKTt0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKEEpO3RoaXMuX21heERvbWFpblZhbHVlcy5kZWxldGUoQSk7CnJldHVybiB0aGlzfTt4LnByb3RvdHlwZS5taW5Eb21haW5FeHRlbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX21pbkRvbWFpbkV4dGVudHMuZ2V0KEEpfTt4LnByb3RvdHlwZS5tYXhEb21haW5FeHRlbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX21heERvbWFpbkV4dGVudHMuZ2V0KEEpfTt4LnByb3RvdHlwZS5taW5Eb21haW5WYWx1ZT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21pbkRvbWFpblZhbHVlcy5nZXQoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLnNldChBLHkpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5tYXhEb21haW5WYWx1ZT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21heERvbWFpblZhbHVlcy5nZXQoQSk7dGhpcy5fbWF4RG9tYWluVmFsdWVzLnNldChBLHkpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5zZXRNaW5NYXhEb21haW5WYWx1ZXNUbz1mdW5jdGlvbihBKXt0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKEEpOwp0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpO3ZhciB5PUEuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSx3PXlbMV07dGhpcy5taW5Eb21haW5WYWx1ZShBLHlbMF0pO3RoaXMubWF4RG9tYWluVmFsdWUoQSx3KTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUub25QYW5FbmQ9ZnVuY3Rpb24oQSl7dGhpcy5fcGFuRW5kQ2FsbGJhY2tzLmFkZChBKX07eC5wcm90b3R5cGUub2ZmUGFuRW5kPWZ1bmN0aW9uKEEpe3RoaXMuX3BhbkVuZENhbGxiYWNrcy5kZWxldGUoQSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLm9uWm9vbUVuZD1mdW5jdGlvbihBKXt0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmFkZChBKX07eC5wcm90b3R5cGUub2ZmWm9vbUVuZD1mdW5jdGlvbihBKXt0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUub25QYW5ab29tVXBkYXRlPWZ1bmN0aW9uKEEpe3RoaXMuX3Bhblpvb21VcGRhdGVDYWxsYmFja3MuYWRkKEEpOwpyZXR1cm4gdGhpc307eC5wcm90b3R5cGUub2ZmUGFuWm9vbVVwZGF0ZT1mdW5jdGlvbihBKXt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307cmV0dXJuIHh9KGQuSW50ZXJhY3Rpb24pO2guX1BJWEVMU19QRVJfTElORT0xMjA7Zi5QYW5ab29tPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDEzKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49bnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO24uX292ZXJDb21wb25lbnQ9ITE7bi5fcG9pbnRlckVudGVyQ2FsbGJhY2tzPQpuZXcgbC5DYWxsYmFja1NldDtuLl9wb2ludGVyTW92ZUNhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9wb2ludGVyRXhpdENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9tb3VzZU1vdmVDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVNb3VzZUV2ZW50KHEsdSl9O24uX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX2hhbmRsZVRvdWNoRXZlbnQodVtxWzBdXSx4KX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fbW91c2VEaXNwYXRjaGVyPXQuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj10LlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX07bS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX2hhbmRsZU1vdXNlRXZlbnQ9ZnVuY3Rpb24obixxKXtxPXRoaXMuX21vdXNlRGlzcGF0Y2hlci5ldmVudEluc2lkZSh0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLHEpO3RoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChuLHEpfTttLnByb3RvdHlwZS5faGFuZGxlVG91Y2hFdmVudD1mdW5jdGlvbihuLHEpe3E9dGhpcy5fdG91Y2hEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sCnEpO3RoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChuLHEpfTttLnByb3RvdHlwZS5faGFuZGxlUG9pbnRlckV2ZW50PWZ1bmN0aW9uKG4scSl7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3ZhciB1PXRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pO3UmJnE/KHRoaXMuX292ZXJDb21wb25lbnR8fHRoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4pLHRoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobikpOnRoaXMuX292ZXJDb21wb25lbnQmJnRoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3Mobik7dGhpcy5fb3ZlckNvbXBvbmVudD11JiZxfTttLnByb3RvdHlwZS5vblBvaW50ZXJFbnRlcj1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuYWRkKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZQb2ludGVyRW50ZXI9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmRlbGV0ZShuKTsKcmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uUG9pbnRlck1vdmU9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZQb2ludGVyTW92ZT1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uUG9pbnRlckV4aXQ9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZQb2ludGVyRXhpdD1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O3JldHVybiBtfShoKDE1KS5JbnRlcmFjdGlvbik7Zi5Qb2ludGVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDIwKTtmLm1lbVRodW5rPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGw9MDtsPGFyZ3VtZW50cy5sZW5ndGg7bCsrKXRbbF09YXJndW1lbnRzW2xdO3ZhciBwPXQuc2xpY2UoMCwKLTEpLG09ay5tZW1vaXplKHRbdC5sZW5ndGgtMV0pO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscT1wLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gdS5hcHBseShuKX0pO3JldHVybiBtLmFwcGx5KHZvaWQgMCxxKX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCg0OSk7Zi5tZW1vaXplPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtmb3IodmFyIHU9W10seD0wO3g8YXJndW1lbnRzLmxlbmd0aDt4KyspdVt4XT1hcmd1bWVudHNbeF07aWYobilyZXR1cm4gbTt4PWsuc2lnbkFycmF5KHUpO3ZvaWQgMD09PXB8fHAuaXNEaWZmZXJlbnQoeCk/KHEmJmNvbnNvbGUubG9nKCJjYWNoZSBtaXNzISBjb21wdXRpbmciKSxwPXgsbT10LmFwcGx5KHRoaXMsdSkpOnEmJmNvbnNvbGUubG9nKCJjYWNoZSBoaXQhIik7cmV0dXJuIG19dmFyIHA9dm9pZCAwLG0sbj0hMSxxPSExO2wuZG9Mb2NrZWQ9ZnVuY3Rpb24odSl7aWYobil0aHJvdyBFcnJvcigiTG9ja2luZyBhbiBhbHJlYWR5IGxvY2tlZCBtZW1vaXplIGZ1bmN0aW9uISIpOwpuPSEwO3U9dS5hcHBseSh0aGlzKTtuPSExO3JldHVybiB1fTtsLmxvZ1BlcmZvcm1hbmNlPWZ1bmN0aW9uKHUpe3ZvaWQgMD09PXUmJih1PSEwKTtxPXU7cmV0dXJuIHRoaXN9O3JldHVybiBsfX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMyksbD1oKDApLHA9aCgyNyksbT1oKDIpO2Q9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSh1KXt2b2lkIDA9PT11JiYodT0idmVydGljYWwiKTt1PW4uY2FsbCh0aGlzLHUpfHx0aGlzO3UuX2NsdXN0ZXJPZmZzZXRzPW5ldyBsLk1hcDtyZXR1cm4gdX1rKHEsbik7cS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPQpmdW5jdGlvbigpe2Z1bmN0aW9uIHUoKXtyZXR1cm4geS5yYW5nZUJhbmQoKX12YXIgeD10aGlzLEE9bi5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcykseT10aGlzLl9tYWtlSW5uZXJTY2FsZSgpO0Eud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD91OkEud2lkdGg7QS5oZWlnaHQ9dGhpcy5faXNWZXJ0aWNhbD9BLmhlaWdodDp1O3ZhciB3PUEueCxDPUEueTtBLng9dGhpcy5faXNWZXJ0aWNhbD9mdW5jdGlvbihHLEQsQil7cmV0dXJuIHcoRyxELEIpK3guX2NsdXN0ZXJPZmZzZXRzLmdldChCKX06ZnVuY3Rpb24oRyxELEIpe3JldHVybiB3KEcsRCxCKX07QS55PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24oRyxELEIpe3JldHVybiBDKEcsRCxCKX06ZnVuY3Rpb24oRyxELEIpe3JldHVybiBDKEcsRCxCKSt4Ll9jbHVzdGVyT2Zmc2V0cy5nZXQoQil9O3JldHVybiBBfTtxLnByb3RvdHlwZS5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHU9CnRoaXMseD10aGlzLl9tYWtlSW5uZXJTY2FsZSgpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEEseSl7cmV0dXJuIHUuX2NsdXN0ZXJPZmZzZXRzLnNldChBLHguc2NhbGUoU3RyaW5nKHkpKS14LnJhbmdlQmFuZCgpLzIpfSl9O3EucHJvdG90eXBlLl9tYWtlSW5uZXJTY2FsZT1mdW5jdGlvbigpe3ZhciB1PW5ldyB0LkNhdGVnb3J5O3UuZG9tYWluKHRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oQSx5KXtyZXR1cm4gU3RyaW5nKHkpfSkpO3ZhciB4PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5hdHRyKHAuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpO3UucmFuZ2UoWzAseChudWxsLDAsbnVsbCldKTtyZXR1cm4gdX07cS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDbHVzdGVyUG9zaXRpb24oKTtyZXR1cm4gbi5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKX07cmV0dXJuIHF9KHAuQmFyKTtmLkNsdXN0ZXJlZEJhcj0KZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihDLEcpe2Z1bmN0aW9uIEQoKXt0aGlzLmNvbnN0cnVjdG9yPUN9Zm9yKHZhciBCIGluIEcpRy5oYXNPd25Qcm9wZXJ0eShCKSYmKENbQl09R1tCXSk7Qy5wcm90b3R5cGU9bnVsbD09PUc/T2JqZWN0LmNyZWF0ZShHKTooRC5wcm90b3R5cGU9Ry5wcm90b3R5cGUsbmV3IEQpfSx0PWgoMSksbD1oKDUpLHA9aCg3KSxtPWgoOCksbj1oKDMpLHE9aCgwKSx1PWgoNDQpLHg9aCg0NSksQT1oKDYpLHk9aCgzNSksdz1oKDIpO2Q9ZnVuY3Rpb24oQyl7ZnVuY3Rpb24gRygpe3ZhciBEPUMuY2FsbCh0aGlzKXx8dGhpcztELl9zdGFydEFuZ2xlPTA7RC5fZW5kQW5nbGU9MipNYXRoLlBJO0QuX2xhYmVsRm9ybWF0dGVyPW0uaWRlbnRpdHkoKTtELl9sYWJlbHNFbmFibGVkPSExO0QuaW5uZXJSYWRpdXMoMCk7RC5vdXRlclJhZGl1cyhmdW5jdGlvbigpe3ZhciBCPUQuX3BpZUNlbnRlcigpO3JldHVybiBNYXRoLm1pbihNYXRoLm1heChELndpZHRoKCktCkIueCxCLngpLE1hdGgubWF4KEQuaGVpZ2h0KCktQi55LEIueSkpfSk7RC5hZGRDbGFzcygicGllLXBsb3QiKTtELmF0dHIoImZpbGwiLGZ1bmN0aW9uKEIsSSl7cmV0dXJuIFN0cmluZyhJKX0sbmV3IG4uQ29sb3IpO0QuX3N0cm9rZURyYXdlcnM9bmV3IHEuTWFwO3JldHVybiBEfWsoRyxDKTtHLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgRD10aGlzO0MucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3N0cm9rZURyYXdlcnMuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gQi5hdHRhY2hUbyhELl9yZW5kZXJBcmVhKX0pfTtHLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKEQsQixJKXtDLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxELEIsSSk7RD10aGlzLl9waWVDZW50ZXIoKTt0aGlzLl9yZW5kZXJBcmVhLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QueCsiLCIrRC55KyIpIik7RD1NYXRoLm1pbihNYXRoLm1heCh0aGlzLndpZHRoKCktCkQueCxELngpLE1hdGgubWF4KHRoaXMuaGVpZ2h0KCktRC55LEQueSkpO251bGwhPXRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZSYmdGhpcy5pbm5lclJhZGl1cygpLnNjYWxlLnJhbmdlKFswLERdKTtudWxsIT10aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUmJnRoaXMub3V0ZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxEXSk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsRCl9O0cucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEQpe2lmKDE9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBxLldpbmRvdy53YXJuKCJPbmx5IG9uZSBkYXRhc2V0IGlzIHN1cHBvcnRlZCBpbiBQaWUgcGxvdHMiKSx0aGlzO3RoaXMuX3VwZGF0ZVBpZUFuZ2xlcygpO3ZhciBCPW5ldyB4LkFyY091dGxpbmVTVkdEcmF3ZXI7dGhpcy5faXNTZXR1cCYmQi5hdHRhY2hUbyh0aGlzLl9yZW5kZXJBcmVhKTsKdGhpcy5fc3Ryb2tlRHJhd2Vycy5zZXQoRCxCKTtDLnByb3RvdHlwZS5fYWRkRGF0YXNldC5jYWxsKHRoaXMsRCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUucmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsRCl9O0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsRCk7dGhpcy5fc3Ryb2tlRHJhd2Vycy5nZXQoRCkucmVtb3ZlKCl9O0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxEKTt0aGlzLl9zdGFydEFuZ2xlcz1bXTt0aGlzLl9lbmRBbmdsZXM9W107cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpczt2b2lkIDA9PT1EJiYoRD10aGlzLmRhdGFzZXRzKCkpO3ZhciBJPUMucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLApEKS5ub2RlcygpO0QuZm9yRWFjaChmdW5jdGlvbihOKXtOPUIuX3N0cm9rZURyYXdlcnMuZ2V0KE4pO251bGwhPU4mJkkucHVzaC5hcHBseShJLE4uZ2V0VmlzdWFsUHJpbWl0aXZlcygpKX0pO3JldHVybiB0LnNlbGVjdEFsbChJKX07Ry5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe0MucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpfTtHLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LkFyY1NWR0RyYXdlcn0sZnVuY3Rpb24oKXt5Lndhcm4oImNhbnZhcyByZW5kZXJlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFBpZSBQbG90ISIpO3JldHVybiBudWxsfSl9O0cucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7dm9pZCAwPT09RCYmKEQ9dGhpcy5kYXRhc2V0cygpKTsKcmV0dXJuIEMucHJvdG90eXBlLmVudGl0aWVzLmNhbGwodGhpcyxEKS5tYXAoZnVuY3Rpb24oSSl7SS5wb3NpdGlvbi54Kz1CLndpZHRoKCkvMjtJLnBvc2l0aW9uLnkrPUIuaGVpZ2h0KCkvMjt2YXIgTj10LnNlbGVjdChCLl9zdHJva2VEcmF3ZXJzLmdldChJLmRhdGFzZXQpLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgoSS5pbmRleCkpO0kuc3Ryb2tlU2VsZWN0aW9uPU47cmV0dXJuIEl9KX07Ry5wcm90b3R5cGUuc2VjdG9yVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRy5fU0VDVE9SX1ZBTFVFX0tFWSl9O0cucHJvdG90eXBlLmlubmVyUmFkaXVzPWZ1bmN0aW9uKEQsQil7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRy5fSU5ORVJfUkFESVVTX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KEcuX0lOTkVSX1JBRElVU19LRVksRCxCKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5vdXRlclJhZGl1cz0KZnVuY3Rpb24oRCxCKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChHLl9PVVRFUl9SQURJVVNfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkoRy5fT1VURVJfUkFESVVTX0tFWSxELEIpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnN0YXJ0QW5nbGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fc3RhcnRBbmdsZTt0aGlzLl9zdGFydEFuZ2xlPUQ7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuZW5kQW5nbGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fZW5kQW5nbGU7dGhpcy5fZW5kQW5nbGU9RDt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5sYWJlbHNFbmFibGVkPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2xhYmVsc0VuYWJsZWQ7CnRoaXMuX2xhYmVsc0VuYWJsZWQ9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5sYWJlbEZvcm1hdHRlcj1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9sYWJlbEZvcm1hdHRlcjt0aGlzLl9sYWJlbEZvcm1hdHRlcj1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpcy53aWR0aCgpLzIsST10aGlzLmhlaWdodCgpLzI7RD10aGlzLl9zbGljZUluZGV4Rm9yUG9pbnQoe3g6RC54LUIseTpELnktSX0pO3JldHVybiBudWxsPT1EP1tdOlt0aGlzLmVudGl0aWVzKClbRF1dfTtHLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcyxCPUMucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKSxJPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKSxOPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5vdXRlclJhZGl1cygpKTsKQi5kPWZ1bmN0aW9uKE8sSCxLKXtyZXR1cm4gdC5hcmMoKS5pbm5lclJhZGl1cyhJKE8sSCxLKSkub3V0ZXJSYWRpdXMoTihPLEgsSykpLnN0YXJ0QW5nbGUoRC5fc3RhcnRBbmdsZXNbSF0pLmVuZEFuZ2xlKEQuX2VuZEFuZ2xlc1tIXSkoTyxIKX07cmV0dXJuIEJ9O0cucHJvdG90eXBlLl91cGRhdGVQaWVBbmdsZXM9ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLnNlY3RvclZhbHVlKCkmJjAhPT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXt2YXIgRD13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSksQj10aGlzLmRhdGFzZXRzKClbMF0sST10aGlzLl9nZXREYXRhVG9EcmF3KCkuZ2V0KEIpO0k9dC5waWUoKS5zb3J0KG51bGwpLnN0YXJ0QW5nbGUodGhpcy5fc3RhcnRBbmdsZSkuZW5kQW5nbGUodGhpcy5fZW5kQW5nbGUpLnZhbHVlKGZ1bmN0aW9uKE4sTyl7cmV0dXJuIEQoTixPLEIpfSkoSSk7dGhpcy5fc3RhcnRBbmdsZXM9SS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4uc3RhcnRBbmdsZX0pOwp0aGlzLl9lbmRBbmdsZXM9SS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4uZW5kQW5nbGV9KX19O0cucHJvdG90eXBlLl9waWVDZW50ZXI9ZnVuY3Rpb24oKXt2YXIgRD10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX3N0YXJ0QW5nbGU6dGhpcy5fZW5kQW5nbGUsQj10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX2VuZEFuZ2xlOnRoaXMuX3N0YXJ0QW5nbGUsST1NYXRoLnNpbihEKTtEPU1hdGguY29zKEQpO3ZhciBOPU1hdGguc2luKEIpO0I9TWF0aC5jb3MoQik7dmFyIE87aWYoMDw9SSYmMDw9TilpZigwPD1EJiYwPD1CKXt2YXIgSD1EO3ZhciBLPU89MDt2YXIgTT1OfWVsc2UgMD5EJiYwPkI/KEg9MCxPPS1CLEs9MCxNPUkpOjA8PUQmJjA+Qj8oSD1ELE89LUIsSz0wLE09SSk6MD5EJiYwPD1CJiYoSz1PPUg9MSxNPU1hdGgubWF4KEksTikpO2Vsc2UgMDw9SSYmMD5OPzA8PUQmJjA8PUI/KEg9TWF0aC5tYXgoRCxCKSxNPUs9Tz0xKTowPkQmJgowPkI/KEg9MCxPPTEsSz0tTixNPUkpOjA8PUQmJjA+Qj8oSD1ELE89MSxLPS1OLE09MSk6MD5EJiYwPD1CJiYoSD1CLEs9Tz0xLE09SSk6MD5JJiYwPD1OPzA8PUQmJjA8PUI/KEg9MSxPPTAsSz0tSSxNPU4pOjA+RCYmMD5CPyhIPTEsTz1NYXRoLm1heCgtRCwtQiksTT1LPTEpOjA8PUQmJjA+Qj8oSD0xLE89LUIsSz0tSSxNPTEpOjA+RCYmMDw9QiYmKEg9MSxPPS1ELEs9MSxNPU4pOjA+SSYmMD5OJiYoMDw9RCYmMDw9Qj8oSD1CLE89MCxLPS1JLE09MCk6MD5EJiYwPkI/KEg9MCxPPS1ELEs9LU4sTT0wKTowPD1EJiYwPkI/KE89SD0xLEs9TWF0aC5tYXgoRCwtQiksTT0xKTowPkQmJjA8PUImJihIPUIsTz0tRCxLPTEsTT0wKSk7cmV0dXJue3g6MD09SytNPzA6Sy8oSytNKSp0aGlzLndpZHRoKCkseTowPT1IK08/MDpILyhIK08pKnRoaXMuaGVpZ2h0KCl9fTtHLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBEPUMucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyk7CmlmKDA9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBEO3ZhciBCPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zZWN0b3JWYWx1ZSgpKSxJPXRoaXMuZGF0YXNldHMoKVswXSxOPUQuZ2V0KEkpLmZpbHRlcihmdW5jdGlvbihPLEgpe3JldHVybiBHLl9pc1ZhbGlkRGF0YShCKE8sSCxJKSl9KTtELnNldChJLE4pO3JldHVybiBEfTtHLl9pc1ZhbGlkRGF0YT1mdW5jdGlvbihEKXtyZXR1cm4gcS5NYXRoLmlzVmFsaWROdW1iZXIoRCkmJjA8PUR9O0cucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKEQsQixJKXt2YXIgTj13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSk7aWYoIUcuX2lzVmFsaWREYXRhKE4oRCxCLEkpKSlyZXR1cm57eDpOYU4seTpOYU59O3ZhciBPPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKShELEIsSSk7RD13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMub3V0ZXJSYWRpdXMoKSkoRCwKQixJKTtPPShPK0QpLzI7RD10LnBpZSgpLnNvcnQobnVsbCkudmFsdWUoZnVuY3Rpb24oSCxLKXtIPU4oSCxLLEkpO3JldHVybiBHLl9pc1ZhbGlkRGF0YShIKT9IOjB9KS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKShJLmRhdGEoKSk7Qj0oRFtCXS5zdGFydEFuZ2xlK0RbQl0uZW5kQW5nbGUpLzI7cmV0dXJue3g6TypNYXRoLnNpbihCKSx5Oi1PKk1hdGguY29zKEIpfX07Ry5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihEKXt2YXIgQj10aGlzO3RoaXMuX3JlbmRlckFyZWEuc2VsZWN0KCIubGFiZWwtYXJlYSIpLnJlbW92ZSgpO3RoaXMuX2xhYmVsc0VuYWJsZWQmJnEuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gQi5fZHJhd0xhYmVscygpfSxEKTt2YXIgST10aGlzLl9nZW5lcmF0ZVN0cm9rZURyYXdTdGVwcygpLE49dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKE8pe3ZhciBIPQp3LlBsb3QuYXBwbHlEcmF3U3RlcHMoSSxPKTtCLl9zdHJva2VEcmF3ZXJzLmdldChPKS5kcmF3KE4uZ2V0KE8pLEgpfSl9O0cucHJvdG90eXBlLl9nZW5lcmF0ZVN0cm9rZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOm5ldyBwLk51bGx9XX07Ry5wcm90b3R5cGUuX3NsaWNlSW5kZXhGb3JQb2ludD1mdW5jdGlvbihEKXt2YXIgQj1NYXRoLnNxcnQoTWF0aC5wb3coRC54LDIpK01hdGgucG93KEQueSwyKSksST1NYXRoLmFjb3MoLUQueS9CKTswPkQueCYmKEk9MipNYXRoLlBJLUkpO2ZvcihEPTA7RDx0aGlzLl9zdGFydEFuZ2xlcy5sZW5ndGg7RCsrKWlmKHRoaXMuX3N0YXJ0QW5nbGVzW0RdPEkmJnRoaXMuX2VuZEFuZ2xlc1tEXT5JKXt2YXIgTj1EO2JyZWFrfWlmKHZvaWQgMCE9PU4pe0Q9dGhpcy5kYXRhc2V0cygpWzBdO3ZhciBPPUQuZGF0YSgpW05dO0k9dGhpcy5pbm5lclJhZGl1cygpLmFjY2Vzc29yKE8sCk4sRCk7RD10aGlzLm91dGVyUmFkaXVzKCkuYWNjZXNzb3IoTyxOLEQpO2lmKEI+SSYmQjxEKXJldHVybiBOfXJldHVybiBudWxsfTtHLnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxJPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLE49bmV3IGwuU3ZnQ29udGV4dChJLm5vZGUoKSksTz1uZXcgbC5DYWNoZU1lYXN1cmVyKE4pLEg9bmV3IGwuV3JpdGVyKE8sTiksSz10aGlzLmRhdGFzZXRzKClbMF07dGhpcy5fZ2V0RGF0YVRvRHJhdygpLmdldChLKS5mb3JFYWNoKGZ1bmN0aW9uKE0sTCl7dmFyIFE9RC5zZWN0b3JWYWx1ZSgpLmFjY2Vzc29yKE0sTCxLKTtpZihxLk1hdGguaXNWYWxpZE51bWJlcihRKSl7UT1ELl9sYWJlbEZvcm1hdHRlcihRLE0sTCxLKTt2YXIgVD1PLm1lYXN1cmUoUSksWD0oRC5fZW5kQW5nbGVzW0xdK0QuX3N0YXJ0QW5nbGVzW0xdKS8KMixhYT1ELm91dGVyUmFkaXVzKCkuYWNjZXNzb3IoTSxMLEspO0Qub3V0ZXJSYWRpdXMoKS5zY2FsZSYmKGFhPUQub3V0ZXJSYWRpdXMoKS5zY2FsZS5zY2FsZShhYSkpO3ZhciBsYT1ELmlubmVyUmFkaXVzKCkuYWNjZXNzb3IoTSxMLEspO0QuaW5uZXJSYWRpdXMoKS5zY2FsZSYmKGxhPUQuaW5uZXJSYWRpdXMoKS5zY2FsZS5zY2FsZShsYSkpO2xhPShhYStsYSkvMjthYT1NYXRoLnNpbihYKSpsYS1ULndpZHRoLzI7bGE9LU1hdGguY29zKFgpKmxhLVQuaGVpZ2h0LzI7dmFyIFo9W3t4OmFhLHk6bGF9LHt4OmFhLHk6bGErVC5oZWlnaHR9LHt4OmFhK1Qud2lkdGgseTpsYX0se3g6YWErVC53aWR0aCx5OmxhK1QuaGVpZ2h0fV07KFg9Wi5ldmVyeShmdW5jdGlvbihiYSl7cmV0dXJuIE1hdGguYWJzKGJhLngpPD1ELndpZHRoKCkvMiYmTWF0aC5hYnMoYmEueSk8PUQuaGVpZ2h0KCkvMn0pKSYmKFg9Wi5tYXAoZnVuY3Rpb24oYmEpe3JldHVybiBELl9zbGljZUluZGV4Rm9yUG9pbnQoYmEpfSkuZXZlcnkoZnVuY3Rpb24oYmEpe3JldHVybiBiYT09PQpMfSkpO009Qi5maWxsKE0sTCxLKTtNPTEuNipxLkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsTSk8cS5Db2xvci5jb250cmFzdCgiYmxhY2siLE0pO2FhPUkuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrYWErIiwiK2xhKyIpIik7YWEuY2xhc3NlZChNPyJkYXJrLWxhYmVsIjoibGlnaHQtbGFiZWwiLCEwKTthYS5zdHlsZSgidmlzaWJpbGl0eSIsWD8iaW5oZXJpdCI6ImhpZGRlbiIpO0gud3JpdGUoUSxULndpZHRoLFQuaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxhYS5ub2RlKCkpfX0pfTtyZXR1cm4gR30ody5QbG90KTtkLl9JTk5FUl9SQURJVVNfS0VZPSJpbm5lci1yYWRpdXMiO2QuX09VVEVSX1JBRElVU19LRVk9Im91dGVyLXJhZGl1cyI7ZC5fU0VDVE9SX1ZBTFVFX0tFWT0ic2VjdG9yLXZhbHVlIjtmLlBpZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHksdyl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9Cnl9Zm9yKHZhciBHIGluIHcpdy5oYXNPd25Qcm9wZXJ0eShHKSYmKHlbR109d1tHXSk7eS5wcm90b3R5cGU9bnVsbD09PXc/T2JqZWN0LmNyZWF0ZSh3KTooQy5wcm90b3R5cGU9dy5wcm90b3R5cGUsbmV3IEMpfSx0PWgoMSksbD1oKDUpLHA9aCg3KSxtPWgoMTQpLG49aCg2KSxxPWgoMzQpLHU9aCgzKSx4PWgoMCksQT1oKDIpO2Q9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24gdygpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLl9sYWJlbHNFbmFibGVkPSExO0MuX2xhYmVsPW51bGw7Qy5hbmltYXRvcigicmVjdGFuZ2xlcyIsbmV3IHAuTnVsbCk7Qy5hZGRDbGFzcygicmVjdGFuZ2xlLXBsb3QiKTtDLmF0dHIoImZpbGwiLChuZXcgdS5Db2xvcikucmFuZ2UoKVswXSk7cmV0dXJuIEN9ayh3LHkpO3cucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHEuUmVjdGFuZ2xlU1ZHRHJhd2VyfSxmdW5jdGlvbihDKXtyZXR1cm4gbmV3IG0uUmVjdGFuZ2xlQ2FudmFzRHJhd2VyKEMpfSl9Owp3LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9eS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxCPUdbdy5fWDJfS0VZXSxJPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLE49R1t3Ll9ZMl9LRVldLE89dGhpcy54KCkuc2NhbGUsSD10aGlzLnkoKS5zY2FsZTtudWxsIT1CPyhHLndpZHRoPWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTWF0aC5hYnMoQihLLE0sTCktRChLLE0sTCkpfSxHLng9ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBNYXRoLm1pbihCKEssTSxMKSxEKEssTSxMKSl9KTooRy53aWR0aD1mdW5jdGlvbigpe3JldHVybiBDLl9yZWN0YW5nbGVXaWR0aChPKX0sRy54PWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gRChLLE0sTCktLjUqRy53aWR0aChLLE0sTCl9KTtudWxsIT1OPyhHLmhlaWdodD1mdW5jdGlvbihLLApNLEwpe3JldHVybiBNYXRoLmFicyhOKEssTSxMKS1JKEssTSxMKSl9LEcueT1mdW5jdGlvbihLLE0sTCl7cmV0dXJuIE1hdGgubWF4KE4oSyxNLEwpLEkoSyxNLEwpKS1HLmhlaWdodChLLE0sTCl9KTooRy5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gQy5fcmVjdGFuZ2xlV2lkdGgoSCl9LEcueT1mdW5jdGlvbihLLE0sTCl7cmV0dXJuIEkoSyxNLEwpLS41KkcuaGVpZ2h0KEssTSxMKX0pO2RlbGV0ZSBHW3cuX1gyX0tFWV07ZGVsZXRlIEdbdy5fWTJfS0VZXTtyZXR1cm4gR307dy5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoInJlY3RhbmdsZXMiKX1dfTt3LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oQyl7cmV0dXJuIngyIj09PUM/eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywKIngiKToieTIiPT09Qz95LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ5Iik6eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcyxDKX07dy5wcm90b3R5cGUueD1mdW5jdGlvbihDLEcsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PUc/eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyxHLEQpO251bGwhPUcmJihEPShDPXRoaXMueDIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHcuX1gyX0tFWSxELEcsQy5wb3N0U2NhbGUpKTtHIGluc3RhbmNlb2YgdS5DYXRlZ29yeSYmRy5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS54Mj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9YMl9LRVkpfTt3LnByb3RvdHlwZS55PWZ1bmN0aW9uKEMsCkcsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PUc/eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyxHLEQpO251bGwhPUcmJihEPShDPXRoaXMueTIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHcuX1kyX0tFWSxELEcsQy5wb3N0U2NhbGUpKTtHIGluc3RhbmNlb2YgdS5DYXRlZ29yeSYmRy5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS55Mj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9ZMl9LRVkpfTt3LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3JldHVybiB0aGlzLmVudGl0aWVzKCkuZmlsdGVyKGZ1bmN0aW9uKEQpe3ZhciBCPUQuZGF0dW0sST1ELmluZGV4LE49RC5kYXRhc2V0O0Q9Ry54KEIsCkksTik7dmFyIE89Ry55KEIsSSxOKSxIPUcud2lkdGgoQixJLE4pO0I9Ry5oZWlnaHQoQixJLE4pO3JldHVybiBEPD1DLngmJkMueDw9RCtIJiZPPD1DLnkmJkMueTw9TytCfSl9O3cucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQyl7cmV0dXJuIHRoaXMuX2VudGl0eUJCb3goQy5kYXR1bSxDLmluZGV4LEMuZGF0YXNldCx0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSl9O3cucHJvdG90eXBlLl9lbnRpdHlCQm94PWZ1bmN0aW9uKEMsRyxELEIpe3JldHVybnt4OkIueChDLEcsRCkseTpCLnkoQyxHLEQpLHdpZHRoOkIud2lkdGgoQyxHLEQpLGhlaWdodDpCLmhlaWdodChDLEcsRCl9fTt3LnByb3RvdHlwZS5sYWJlbD1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9sYWJlbDt0aGlzLl9sYWJlbD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDsKdGhpcy5fbGFiZWxzRW5hYmxlZD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7bnVsbCE9dGhpcy54MigpJiYoQy54Mj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSkpO251bGwhPXRoaXMueTIoKSYmKEMueTI9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpKTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oQyxHLEQpe3ZhciBCPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEk9Qi54KEMsRyxEKSxOPUIueShDLEcsRCksTz1CLndpZHRoKEMsRyxEKTtDPUIuaGVpZ2h0KEMsRyxEKTtyZXR1cm57eDpJK08vMix5Ok4rQy8yfX07dy5wcm90b3R5cGUuX3JlY3RhbmdsZVdpZHRoPWZ1bmN0aW9uKEMpe2lmKEMgaW5zdGFuY2VvZiB1LkNhdGVnb3J5KXJldHVybiBDLnJhbmdlQmFuZCgpOwp2YXIgRz1DPT09dGhpcy54KCkuc2NhbGU/dGhpcy54KCkuYWNjZXNzb3I6dGhpcy55KCkuYWNjZXNzb3IsRD10LnNldCh4LkFycmF5LmZsYXR0ZW4odGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTi5kYXRhKCkubWFwKGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEcoTyxILE4pLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuK059KSxCPXguTWF0aC5taW4oRCwwKTtEPXguTWF0aC5tYXgoRCwwKTt2YXIgST1DLnNjYWxlKEIpO3JldHVybihDLnNjYWxlKEQpLUkpL01hdGguYWJzKEQtQil9O3cucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEM9bmV3IHguTWFwLEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oRCl7dmFyIEI9RC5kYXRhKCkubWFwKGZ1bmN0aW9uKEksTil7cmV0dXJuIHguTWF0aC5pc1ZhbGlkTnVtYmVyKEcueChJLE4sRCkpJiYKeC5NYXRoLmlzVmFsaWROdW1iZXIoRy55KEksTixEKSkmJnguTWF0aC5pc1ZhbGlkTnVtYmVyKEcud2lkdGgoSSxOLEQpKSYmeC5NYXRoLmlzVmFsaWROdW1iZXIoRy5oZWlnaHQoSSxOLEQpKT9JOm51bGx9KTtDLnNldChELEIpfSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdEFsbCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTt0aGlzLl9sYWJlbHNFbmFibGVkJiZudWxsIT10aGlzLmxhYmVsKCkmJnguV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gRy5fZHJhd0xhYmVscygpfSxDKX07dy5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQsQil7cmV0dXJuIEMuX2RyYXdMYWJlbChHLEQsQil9KX07dy5wcm90b3R5cGUuX2RyYXdMYWJlbD0KZnVuY3Rpb24oQyxHLEQpe3ZhciBCPXRoaXMsST10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxOPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLE89bmV3IGwuU3ZnQ29udGV4dChOLm5vZGUoKSksSD1uZXcgbC5DYWNoZU1lYXN1cmVyKE8pLEs9bmV3IGwuV3JpdGVyKEgsTyk7Tz10aGlzLngoKS5zY2FsZS5yYW5nZSgpO3ZhciBNPXRoaXMueSgpLnNjYWxlLnJhbmdlKCksTD1NYXRoLm1pbi5hcHBseShudWxsLE8pLFE9TWF0aC5tYXguYXBwbHkobnVsbCxPKSxUPU1hdGgubWluLmFwcGx5KG51bGwsTSksWD1NYXRoLm1heC5hcHBseShudWxsLE0pO0MuZ2V0KEcpLmZvckVhY2goZnVuY3Rpb24oYWEsbGEpe2lmKG51bGwhPWFhKXt2YXIgWj0iIitCLmxhYmVsKCkoYWEsbGEsRyksYmE9SC5tZWFzdXJlKFopLGVhPUkueChhYSxsYSxHKSxjYT1JLnkoYWEsbGEsRyksa2E9SS53aWR0aChhYSxsYSxHKSxZPUkuaGVpZ2h0KGFhLGxhLEcpOwpiYS5oZWlnaHQ8PVkmJmJhLndpZHRoPD1rYSYmKFk9KFktYmEuaGVpZ2h0KS8yLGVhKz0oa2EtYmEud2lkdGgpLzIsY2ErPVksa2E9e21pbjplYSxtYXg6ZWErYmEud2lkdGh9LFk9e21pbjpjYSxtYXg6Y2ErYmEuaGVpZ2h0fSxrYS5taW48THx8a2EubWF4PlF8fFkubWluPFR8fFkubWF4Plh8fEIuX292ZXJsYXlMYWJlbChrYSxZLGxhLEQsQyl8fChhYT1JLmZpbGwoYWEsbGEsRyksYWE9MS42KnguQ29sb3IuY29udHJhc3QoIndoaXRlIixhYSk8eC5Db2xvci5jb250cmFzdCgiYmxhY2siLGFhKSxlYT1OLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2VhKyIsIitjYSsiKSIpLGVhLmNsYXNzZWQoYWE/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApLEsud3JpdGUoWixiYS53aWR0aCxiYS5oZWlnaHQse3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciJ9LGVhLm5vZGUoKSkpKX19KX07dy5wcm90b3R5cGUuX292ZXJsYXlMYWJlbD1mdW5jdGlvbihDLApHLEQsQixJKXtmb3IodmFyIE49dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTz10aGlzLmRhdGFzZXRzKCksSD1CO0g8Ty5sZW5ndGg7SCsrKWZvcih2YXIgSz1PW0hdLE09SS5nZXQoSyksTD1IPT09Qj9EKzE6MDtMPE0ubGVuZ3RoO0wrKylpZih4LkRPTS5pbnRlcnNlY3RzQkJveChDLEcsdGhpcy5fZW50aXR5QkJveChNW0xdLEwsSyxOKSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiB3fShoKDE2KS5YWVBsb3QpO2QuX1gyX0tFWT0ieDIiO2QuX1kyX0tFWT0ieTIiO2YuUmVjdGFuZ2xlPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oeSx3KXtmdW5jdGlvbiBDKCl7dGhpcy5jb25zdHJ1Y3Rvcj15fWZvcih2YXIgRyBpbiB3KXcuaGFzT3duUHJvcGVydHkoRykmJih5W0ddPXdbR10pO3kucHJvdG90eXBlPW51bGw9PT13P09iamVjdC5jcmVhdGUodyk6KEMucHJvdG90eXBlPXcucHJvdG90eXBlLG5ldyBDKX0sdD1oKDMxKSwKbD1oKDYpLHA9aCg0OCksbT1oKDcpLG49aCgxNCkscT1oKDMpLHU9aCgwKSx4PWgoMTkpLEE9aCgyKTtkPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHcoKXt2YXIgQz15LmNhbGwodGhpcyl8fHRoaXM7Qy5hZGRDbGFzcygic2NhdHRlci1wbG90Iik7dmFyIEc9bmV3IG0uRWFzaW5nO0cuc3RhcnREZWxheSg1KTtHLnN0ZXBEdXJhdGlvbigyNTApO0cubWF4VG90YWxEdXJhdGlvbihBLlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0MuYW5pbWF0b3IoeC5BbmltYXRvci5NQUlOLEcpO0MuYXR0cigib3BhY2l0eSIsLjYpO0MuYXR0cigiZmlsbCIsKG5ldyBxLkNvbG9yKS5yYW5nZSgpWzBdKTtDLnNpemUoNik7dmFyIEQ9dC5jaXJjbGUoKTtDLnN5bWJvbChmdW5jdGlvbigpe3JldHVybiBEfSk7cmV0dXJuIEN9ayh3LHkpO3cucHJvdG90eXBlLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzPWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXM7cmV0dXJuIHkucHJvdG90eXBlLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzLmNhbGwodGhpcywKQykubWFwKGZ1bmN0aW9uKEQpe3ZhciBCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRy5zaXplKCkpKEQuZGF0dW0sRC5pbmRleCxELmRhdGFzZXQpO0QuZGlhbWV0ZXI9QjtyZXR1cm4gRH0pfTt3LnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXM7cmV0dXJuIG5ldyBsLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwLlN5bWJvbFNWR0RyYXdlcn0sZnVuY3Rpb24oRCl7cmV0dXJuIG5ldyBuLkNhbnZhc0RyYXdlcihELHAubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwKEMsZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnN5bWJvbCgpKX0sZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnNpemUoKSl9KSl9KX07dy5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbihDLEcpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHcuX1NJWkVfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkody5fU0laRV9LRVksCkMsRyk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHcuX1NZTUJPTF9LRVkpO3RoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KHcuX1NZTUJPTF9LRVkse2FjY2Vzc29yOkN9KTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgQz1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEQ9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKTtHLmQ9ZnVuY3Rpb24oQixJLE4pe3JldHVybiBEKEIsSSxOKSgwKShudWxsKX07Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6RyxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLlJFU0VUKX0pfUMucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLAphbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksRz1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxEPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpO0MueD1HO0MueT1EO0MudHJhbnNmb3JtPWZ1bmN0aW9uKEIsSSxOKXtyZXR1cm4idHJhbnNsYXRlKCIrRyhCLEksTikrIiwiK0QoQixJLE4pKyIpIn07Qy5kPXRoaXMuX2NvbnN0cnVjdFN5bWJvbEdlbmVyYXRvcigpO3JldHVybiBDfTt3LnByb3RvdHlwZS5fY29uc3RydWN0U3ltYm9sR2VuZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIEM9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKSxHPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpO3JldHVybiBmdW5jdGlvbihELEIsCkkpe3JldHVybiBDKEQsQixJKShHKEQsQixJKSkobnVsbCl9fTt3LnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKEMpe3JldHVybnt4OkMucG9zaXRpb24ueC1DLmRpYW1ldGVyLzIseTpDLnBvc2l0aW9uLnktQy5kaWFtZXRlci8yLHdpZHRoOkMuZGlhbWV0ZXIsaGVpZ2h0OkMuZGlhbWV0ZXJ9fTt3LnByb3RvdHlwZS5fZW50aXR5VmlzaWJsZU9uUGxvdD1mdW5jdGlvbihDLEcpe3ZhciBEPXttaW46Ry50b3BMZWZ0LngsbWF4OkcuYm90dG9tUmlnaHQueH07Rz17bWluOkcudG9wTGVmdC55LG1heDpHLmJvdHRvbVJpZ2h0Lnl9O0M9dGhpcy5fZW50aXR5Qm91bmRzKEMpO3JldHVybiB1LkRPTS5pbnRlcnNlY3RzQkJveChELEcsQyl9O3cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oQyl7dmFyIEc9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpOwpyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcihmdW5jdGlvbihJKXt2YXIgTj1JLmRhdHVtLE89SS5pbmRleCxIPUkuZGF0YXNldDtJPUcoTixPLEgpO3ZhciBLPUQoTixPLEgpO049QihOLE8sSCk7cmV0dXJuIEktTi8yPD1DLngmJkMueDw9SStOLzImJkstTi8yPD1DLnkmJkMueTw9SytOLzJ9KX07cmV0dXJuIHd9KGgoMTYpLlhZUGxvdCk7ZC5fU0laRV9LRVk9InNpemUiO2QuX1NZTUJPTF9LRVk9InN5bWJvbCI7Zi5TY2F0dGVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odSx4KXtmdW5jdGlvbiBBKCl7dGhpcy5jb25zdHJ1Y3Rvcj11fWZvcih2YXIgeSBpbiB4KXguaGFzT3duUHJvcGVydHkoeSkmJih1W3ldPXhbeV0pO3UucHJvdG90eXBlPW51bGw9PT14P09iamVjdC5jcmVhdGUoeCk6KEEucHJvdG90eXBlPXgucHJvdG90eXBlLG5ldyBBKX0sdD1oKDcpLGw9aCg2KSxwPWgoNDcpLG09aCgzKSxuPWgoMzUpLHE9aCgyKTsKZD1mdW5jdGlvbih1KXtmdW5jdGlvbiB4KCl7dmFyIEE9dS5jYWxsKHRoaXMpfHx0aGlzO0EuYWRkQ2xhc3MoInNlZ21lbnQtcGxvdCIpO0EuYXR0cigic3Ryb2tlIiwobmV3IG0uQ29sb3IpLnJhbmdlKClbMF0pO0EuYXR0cigic3Ryb2tlLXdpZHRoIiwiMnB4Iik7cmV0dXJuIEF9ayh4LHUpO3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHAuU2VnbWVudFNWR0RyYXdlcn0sZnVuY3Rpb24oKXtuLndhcm4oImNhbnZhcyByZW5kZXJlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFNlZ21lbnQgUGxvdCEiKTtyZXR1cm4gbnVsbH0pfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgdC5OdWxsfV19O3gucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT0KZnVuY3Rpb24oQSl7cmV0dXJuIngyIj09PUE/dS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieCIpOiJ5MiI9PT1BP3UucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsInkiKTp1LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLEEpfTt4LnByb3RvdHlwZS54PWZ1bmN0aW9uKEEseSl7aWYobnVsbD09QSlyZXR1cm4gdS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PXk/dS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQSk6KHUucHJvdG90eXBlLnguY2FsbCh0aGlzLEEseSksQT0oQT10aGlzLngyKCkpJiZBLmFjY2Vzc29yLG51bGwhPUEmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9YMl9LRVksQSx5KSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLngyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1gyX0tFWSl9O3gucHJvdG90eXBlLnk9ZnVuY3Rpb24oQSx5KXtpZihudWxsPT0KQSlyZXR1cm4gdS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PXk/dS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQSk6KHUucHJvdG90eXBlLnkuY2FsbCh0aGlzLEEseSksQT0oQT10aGlzLnkyKCkpJiZBLmFjY2Vzc29yLG51bGwhPUEmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9ZMl9LRVksQSx5KSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLnkyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1kyX0tFWSl9O3gucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQT11LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7QS54MT1xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTtBLngyPW51bGw9PXRoaXMueDIoKT9xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTpxLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSk7QS55MT1xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTsKQS55Mj1udWxsPT10aGlzLnkyKCk/cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk6cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpO3JldHVybiBBfTt4LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEEpe0E9dGhpcy5lbnRpdHlOZWFyZXN0KEEpO3JldHVybiBudWxsIT1BP1tBXTpbXX07eC5wcm90b3R5cGUuZW50aXRpZXNJbj1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpe3ZhciB3PXttaW46QS50b3BMZWZ0LngsbWF4OkEuYm90dG9tUmlnaHQueH07QT17bWluOkEudG9wTGVmdC55LG1heDpBLmJvdHRvbVJpZ2h0Lnl9fWVsc2Ugdz1BLEE9eTtyZXR1cm4gdGhpcy5fZW50aXRpZXNJbnRlcnNlY3RpbmcodyxBKX07eC5wcm90b3R5cGUuX2VudGl0aWVzSW50ZXJzZWN0aW5nPWZ1bmN0aW9uKEEseSl7dmFyIHc9dGhpcyxDPVtdLEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5lbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24oRCl7dy5fbGluZUludGVyc2VjdHNCb3goRCwKQSx5LEcpJiZDLnB1c2goRCl9KTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzQm94PWZ1bmN0aW9uKEEseSx3LEMpe3ZhciBHPXRoaXMsRD1DLngxKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpLEI9Qy54MihBLmRhdHVtLEEuaW5kZXgsQS5kYXRhc2V0KSxJPUMueTEoQS5kYXR1bSxBLmluZGV4LEEuZGF0YXNldCk7QT1DLnkyKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpO2lmKHkubWluPD1EJiZEPD15Lm1heCYmdy5taW48PUkmJkk8PXcubWF4fHx5Lm1pbjw9QiYmQjw9eS5tYXgmJncubWluPD1BJiZBPD13Lm1heClyZXR1cm4hMDt2YXIgTj17eDpELHk6SX0sTz17eDpCLHk6QX0sSD1be3g6eS5taW4seTp3Lm1pbn0se3g6eS5taW4seTp3Lm1heH0se3g6eS5tYXgseTp3Lm1heH0se3g6eS5tYXgseTp3Lm1pbn1dO3JldHVybiAwPEguZmlsdGVyKGZ1bmN0aW9uKEssTSl7cmV0dXJuIDAhPT1NP0cuX2xpbmVJbnRlcnNlY3RzU2VnbWVudChOLE8sSyxIW00tCjFdKSYmRy5fbGluZUludGVyc2VjdHNTZWdtZW50KEssSFtNLTFdLE4sTyk6ITF9KS5sZW5ndGh9O3gucHJvdG90eXBlLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQ9ZnVuY3Rpb24oQSx5LHcsQyl7ZnVuY3Rpb24gRyhELEIsSSl7cmV0dXJuKEIueC1ELngpKihJLnktQi55KS0oQi55LUQueSkqKEkueC1CLngpfXJldHVybiAwPkcoQSx5LHcpKkcoQSx5LEMpfTtyZXR1cm4geH0oaCgxNikuWFlQbG90KTtkLl9YMl9LRVk9IngyIjtkLl9ZMl9LRVk9InkyIjtmLlNlZ21lbnQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciBBIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShBKSYmKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KTooeC5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHgpfSx0PWgoMSksbD1oKDcpLHA9aCgyMCksbT0KaCgwKTtkPWgoNTApO3ZhciBuPWgoMik7aD1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KCl7dmFyIHg9cS5jYWxsKHRoaXMpfHx0aGlzO3guX3N0YWNraW5nUmVzdWx0PXAubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4geC5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiB4LngoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4geC55KCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHguX3N0YWNraW5nT3JkZXJ9LGZ1bmN0aW9uKEEseSx3LEMpe3JldHVybiBtLlN0YWNraW5nLnN0YWNrKEEseSx3LEMpfSk7eC5fc3RhY2tlZEV4dGVudD1wLm1lbVRodW5rKHguX3N0YWNraW5nUmVzdWx0LGZ1bmN0aW9uKCl7cmV0dXJuIHgueCgpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB4Ll9maWx0ZXJGb3JQcm9wZXJ0eSgieSIpfSxmdW5jdGlvbihBLHksdyl7cmV0dXJuIG0uU3RhY2tpbmcuc3RhY2tlZEV4dGVudChBLHksdyl9KTt4Ll9iYXNlbGluZVZhbHVlPTA7eC5fc3RhY2tpbmdPcmRlcj0KImJvdHRvbXVwIjt4LmFkZENsYXNzKCJzdGFja2VkLWFyZWEtcGxvdCIpO3guYXR0cigiZmlsbC1vcGFjaXR5IiwxKTt4Ll9iYXNlbGluZVZhbHVlUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm5beC5fYmFzZWxpbmVWYWx1ZV19O3guY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQoITEpO3JldHVybiB4fWsodSxxKTt1LnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbih4KXtyZXR1cm4gbnVsbD09eD9xLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMpOng/KG0uV2luZG93Lndhcm4oIldhcm5pbmc6IFN0YWNrZWQgQXJlYSBQbG90IGRvZXMgbm90IHN1cHBvcnQgY3JvcHBlZCByZW5kZXJpbmcuIiksdGhpcyk6cS5wcm90b3R5cGUuY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQuY2FsbCh0aGlzLHgpfTt1LnByb3RvdHlwZS5fZ2V0QW5pbWF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuTnVsbH07dS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CnRoaXMuX2Jhc2VsaW5lPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCEwKX07dS5wcm90b3R5cGUueD1mdW5jdGlvbih4LEEpe2lmKG51bGw9PXgpcmV0dXJuIHEucHJvdG90eXBlLnguY2FsbCh0aGlzKTtudWxsPT1BP3EucHJvdG90eXBlLnguY2FsbCh0aGlzLHgpOnEucHJvdG90eXBlLnguY2FsbCh0aGlzLHgsQSk7dGhpcy5fY2hlY2tTYW1lRG9tYWluKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnk9ZnVuY3Rpb24oeCxBKXtpZihudWxsPT14KXJldHVybiBxLnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09QT9xLnByb3RvdHlwZS55LmNhbGwodGhpcyx4KTpxLnByb3RvdHlwZS55LmNhbGwodGhpcyx4LEEpO3RoaXMuX2NoZWNrU2FtZURvbWFpbigpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS5zdGFja2luZ09yZGVyPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX3N0YWNraW5nT3JkZXI7dGhpcy5fc3RhY2tpbmdPcmRlcj0KeDt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiBxLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkLmNhbGwodGhpcyl9O3UucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLnkoKS5zY2FsZS5zY2FsZSh0aGlzLl9iYXNlbGluZVZhbHVlKTt4PXt4MTowLHkxOngseDI6dGhpcy53aWR0aCgpLHkyOnh9O3RoaXMuX2dldEFuaW1hdG9yKCJiYXNlbGluZSIpLmFuaW1hdGUodGhpcy5fYmFzZWxpbmUseCl9O3UucHJvdG90eXBlLl91cGRhdGVZU2NhbGU9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLnkoKTt4PXgmJnguc2NhbGU7bnVsbCE9eCYmKHguYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpLHguYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpKX07CnUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9jaGVja1NhbWVEb21haW4oKTtxLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbih4KXtyZXR1cm4ieSI9PT14P1t0aGlzLl9zdGFja2VkRXh0ZW50KCldOnEucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMseCl9O3UucHJvdG90eXBlLl9jaGVja1NhbWVEb21haW49ZnVuY3Rpb24oKXtpZih0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSl7dmFyIHg9dGhpcy5kYXRhc2V0cygpLEE9dGhpcy54KCkuYWNjZXNzb3IseT14Lm1hcChmdW5jdGlvbihDKXtyZXR1cm4gdC5zZXQoQy5kYXRhKCkubWFwKGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEEoRyxELEMpLnRvU3RyaW5nKCl9KSkudmFsdWVzKCl9KSx3PXUuX2RvbWFpbktleXMoeCxBKTt5LnNvbWUoZnVuY3Rpb24oQyl7cmV0dXJuIEMubGVuZ3RoIT09CncubGVuZ3RofSkmJm0uV2luZG93Lndhcm4oInRoZSBkb21haW5zIGFjcm9zcyB0aGUgZGF0YXNldHMgYXJlIG5vdCB0aGUgc2FtZS4gUGxvdCBtYXkgcHJvZHVjZSB1bmludGVuZGVkIGJlaGF2aW9yLiIpfX07dS5fZG9tYWluS2V5cz1mdW5jdGlvbih4LEEpe3ZhciB5PXQuc2V0KCk7eC5mb3JFYWNoKGZ1bmN0aW9uKHcpe3cuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oQyxHKXt5LmFkZChBKEMsRyx3KSl9KX0pO3JldHVybiB5LnZhbHVlcygpfTt1LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24geChELEIsSSl7cmV0dXJuIG0uU3RhY2tpbmcubm9ybWFsaXplS2V5KEMoRCxCLEkpKX12YXIgQT10aGlzLHk9cS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLHc9dGhpcy55KCkuYWNjZXNzb3IsQz10aGlzLngoKS5hY2Nlc3NvcixHPXRoaXMuX3N0YWNraW5nUmVzdWx0KCk7eS5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3Iobi5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksCmZ1bmN0aW9uKEQsQixJKXtyZXR1cm4gQS55KCkuc2NhbGUuc2NhbGUoK3coRCxCLEkpK0cuZ2V0KEkpLmdldCh4KEQsQixJKSkub2Zmc2V0KX0sZnVuY3Rpb24oRCxCLEkpe3JldHVybiBBLnkoKS5zY2FsZS5zY2FsZShHLmdldChJKS5nZXQoeChELEIsSSkpLm9mZnNldCl9KTtyZXR1cm4geX07dS5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oeCxBLHkpe3ZhciB3PXEucHJvdG90eXBlLl9waXhlbFBvaW50LmNhbGwodGhpcyx4LEEseSksQz10aGlzLngoKS5hY2Nlc3Nvcih4LEEseSk7eD10aGlzLnkoKS5hY2Nlc3Nvcih4LEEseSk7eT10aGlzLnkoKS5zY2FsZS5zY2FsZSgreCt0aGlzLl9zdGFja2luZ1Jlc3VsdCgpLmdldCh5KS5nZXQobS5TdGFja2luZy5ub3JtYWxpemVLZXkoQykpLm9mZnNldCk7cmV0dXJue3g6dy54LHl9fTtyZXR1cm4gdX0oZC5BcmVhKTtmLlN0YWNrZWRBcmVhPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odSwKeCl7ZnVuY3Rpb24gQSgpe3RoaXMuY29uc3RydWN0b3I9dX1mb3IodmFyIHkgaW4geCl4Lmhhc093blByb3BlcnR5KHkpJiYodVt5XT14W3ldKTt1LnByb3RvdHlwZT1udWxsPT09eD9PYmplY3QuY3JlYXRlKHgpOihBLnByb3RvdHlwZT14LnByb3RvdHlwZSxuZXcgQSl9LHQ9aCg1KSxsPWgoOCkscD1oKDIwKSxtPWgoMCksbj1oKDI3KSxxPWgoMik7ZD1mdW5jdGlvbih1KXtmdW5jdGlvbiB4KEEpe3ZvaWQgMD09PUEmJihBPSJ2ZXJ0aWNhbCIpO3ZhciB5PXUuY2FsbCh0aGlzLEEpfHx0aGlzO3kuX2V4dHJlbWFGb3JtYXR0ZXI9bC5pZGVudGl0eSgpO3kuX3N0YWNraW5nUmVzdWx0PXAubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4geS5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiB5LnBvc2l0aW9uKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkubGVuZ3RoKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuX3N0YWNraW5nT3JkZXJ9LGZ1bmN0aW9uKHcsCkMsRyxEKXtyZXR1cm4gbS5TdGFja2luZy5zdGFjayh3LEMsRyxEKX0pO3kuX3N0YWNrZWRFeHRlbnQ9cC5tZW1UaHVuayh5Ll9zdGFja2luZ1Jlc3VsdCxmdW5jdGlvbigpe3JldHVybiB5LnBvc2l0aW9uKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuX2ZpbHRlckZvclByb3BlcnR5KHkuX2lzVmVydGljYWw/InkiOiJ4Iil9LGZ1bmN0aW9uKHcsQyxHKXtyZXR1cm4gbS5TdGFja2luZy5zdGFja2VkRXh0ZW50KHcsQyxHKX0pO3kuYWRkQ2xhc3MoInN0YWNrZWQtYmFyLXBsb3QiKTt5Ll9zdGFja2luZ09yZGVyPSJib3R0b211cCI7cmV0dXJuIHl9ayh4LHUpO3gucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24oQSl7aWYobnVsbD09QSlyZXR1cm4gdGhpcy5fc3RhY2tpbmdPcmRlcjt0aGlzLl9zdGFja2luZ09yZGVyPUE7dGhpcy5fb25EYXRhc2V0VXBkYXRlKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLmV4dHJlbWFGb3JtYXR0ZXI9ZnVuY3Rpb24oQSl7aWYoMD09PQphcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9leHRyZW1hRm9ybWF0dGVyO3RoaXMuX2V4dHJlbWFGb3JtYXR0ZXI9QTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9sYWJlbEFyZWE9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKG4uQmFyLl9MQUJFTF9BUkVBX0NMQVNTLCEwKTt2YXIgQT1uZXcgdC5TdmdDb250ZXh0KHRoaXMuX2xhYmVsQXJlYS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyB0LkNhY2hlTWVhc3VyZXIoQSk7dGhpcy5fd3JpdGVyPW5ldyB0LldyaXRlcih0aGlzLl9tZWFzdXJlcixBKX07eC5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBKE8sSCl7dmFyIEs9dy5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IoKSxNPXcud2lkdGgoKSxMPXcuaGVpZ2h0KCk7Ty5mb3JFYWNoKGZ1bmN0aW9uKFEpe2lmKFEuZXh0ZW50IT09CkMpe3ZhciBUPXcuZXh0cmVtYUZvcm1hdHRlcigpKFEuZXh0ZW50KSxYPXcuX21lYXN1cmVyLm1lYXN1cmUoVCksYWE9US5zdGFja2VkRGF0dW0sbGE9YWEub3JpZ2luYWxEYXR1bSxaPWFhLm9yaWdpbmFsSW5kZXg7YWE9YWEub3JpZ2luYWxEYXRhc2V0O3cuX2lzRGF0dW1PblNjcmVlbihLLE0sTCxsYSxaLGFhKSYmKGxhPXEuUGxvdC5fc2NhbGVkQWNjZXNzb3Iody5hdHRyKG4uQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKGxhLFosYWEpLFo9RC5zY2FsZShRLmV4dGVudCksUT13Ll9nZXRQb3NpdGlvbkF0dHIoRy5zY2FsZShRLmF4aXNWYWx1ZSksbGEpK2xhLzIsUT1IKHcuX2lzVmVydGljYWw/e3g6USx5Olp9Ont4OloseTpRfSxYLGxhKSxUPXkoVCx7dG9wTGVmdDpRLGJvdHRvbVJpZ2h0Ont4OlEueCtYLndpZHRoLHk6US55K1guaGVpZ2h0fX0sbGEpLE4ucHVzaChUKSl9fSl9ZnVuY3Rpb24geShPLEgsSyl7dmFyIE09SC50b3BMZWZ0LEw9TS54LFE9TS55O009SC5ib3R0b21SaWdodC54LQpILnRvcExlZnQueDtIPUguYm90dG9tUmlnaHQueS1ILnRvcExlZnQueTtLPXcuX2lzVmVydGljYWw/TT5LOkg+SztLfHwoTD13Ll9sYWJlbEFyZWEuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTCsiLCAiK1ErIikiKSxMLmNsYXNzZWQoInN0YWNrZWQtYmFyLWxhYmVsIiwhMCksdy5fd3JpdGVyLndyaXRlKE8sTSxILHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxMLm5vZGUoKSkpO3JldHVybiBLfXZhciB3PXRoaXM7dS5wcm90b3R5cGUuX2RyYXdMYWJlbHMuY2FsbCh0aGlzKTt0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dmFyIEM9K3RoaXMuYmFzZWxpbmVWYWx1ZSgpLEc9dGhpcy5wb3NpdGlvbigpLnNjYWxlLEQ9dGhpcy5sZW5ndGgoKS5zY2FsZSxCPW0uU3RhY2tpbmcuc3RhY2tlZEV4dGVudHModGhpcy5fc3RhY2tpbmdSZXN1bHQoKSksST1CLm1pbmltdW1FeHRlbnRzLE49W107QShCLm1heGltdW1FeHRlbnRzLApmdW5jdGlvbihPLEgpe3ZhciBLPXcuX2lzVmVydGljYWw/SC53aWR0aDpILmhlaWdodDtIPXcuX2lzVmVydGljYWw/SC5oZWlnaHQ6SC53aWR0aDtyZXR1cm57eDp3Ll9pc1ZlcnRpY2FsP08ueC1LLzI6Ty54K3guX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSLHk6dy5faXNWZXJ0aWNhbD9PLnktSDpPLnktSy8yfX0pO0EoSSxmdW5jdGlvbihPLEgpe3ZhciBLPXcuX2lzVmVydGljYWw/SC53aWR0aDpILmhlaWdodDtIPXcuX2lzVmVydGljYWw/SC5oZWlnaHQ6SC53aWR0aDtyZXR1cm57eDp3Ll9pc1ZlcnRpY2FsP08ueC1LLzI6Ty54LUgseTp3Ll9pc1ZlcnRpY2FsP08ueSt4Ll9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUjpPLnktSy8yfX0pO04uc29tZShmdW5jdGlvbihPKXtyZXR1cm4gT30pJiZ0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9O3gucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoTSwKTCxRKXtyZXR1cm4gMD4rTyhNLEwsUSk/QyhNLEwsUSk6dyhNLEwsUSl9ZnVuY3Rpb24geShNLEwsUSl7cmV0dXJuIE1hdGguYWJzKHcoTSxMLFEpLUMoTSxMLFEpKX1mdW5jdGlvbiB3KE0sTCxRKXtyZXR1cm4gTi5zY2FsZSgrTyhNLEwsUSkrSy5nZXQoUSkuZ2V0KEcoTSxMLFEpKS5vZmZzZXQpfWZ1bmN0aW9uIEMoTSxMLFEpe3JldHVybiBOLnNjYWxlKEsuZ2V0KFEpLmdldChHKE0sTCxRKSkub2Zmc2V0KX1mdW5jdGlvbiBHKE0sTCxRKXtyZXR1cm4gbS5TdGFja2luZy5ub3JtYWxpemVLZXkoSChNLEwsUSkpfXZhciBEPXRoaXMsQj11LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSxJPXRoaXMuX2lzVmVydGljYWw/InkiOiJ4IixOPXRoaXMubGVuZ3RoKCkuc2NhbGUsTz10aGlzLmxlbmd0aCgpLmFjY2Vzc29yLEg9dGhpcy5wb3NpdGlvbigpLmFjY2Vzc29yLEs9dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTtCW3RoaXMuX2lzVmVydGljYWw/ImhlaWdodCI6CiJ3aWR0aCJdPXk7QltJXT1mdW5jdGlvbihNLEwsUSl7cmV0dXJuIEQuX2lzVmVydGljYWw/QShNLEwsUSk6QShNLEwsUSkteShNLEwsUSl9O3JldHVybiBCfTt4LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oQSl7cmV0dXJuIEE9PT0odGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiKT9bdGhpcy5fc3RhY2tlZEV4dGVudCgpXTp1LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLEEpfTt4LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4geH0obi5CYXIpO2QuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSPTU7Zi5TdGFja2VkQmFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgwKTtkPWgoMjcpO3ZhciBsPWgoMik7aD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO24uX2Nvbm5lY3RvcnNFbmFibGVkPSExO24uYWRkQ2xhc3MoIndhdGVyZmFsbC1wbG90Iik7cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLmNvbm5lY3RvcnNFbmFibGVkPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2Nvbm5lY3RvcnNFbmFibGVkO3RoaXMuX2Nvbm5lY3RvcnNFbmFibGVkPW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnRvdGFsPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KG0uX1RPVEFMX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KG0uX1RPVEFMX0tFWSwKbixudWxsKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihuKXt2YXIgcT10aGlzO3RoaXMuX2Nvbm5lY3RvckFyZWEuc2VsZWN0QWxsKCJsaW5lIikucmVtb3ZlKCk7dGhpcy5fY29ubmVjdG9yc0VuYWJsZWQmJnQuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gcS5fZHJhd0Nvbm5lY3RvcnMoKX0sbil9O20ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24obil7bj1wLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0LmNhbGwodGhpcyxuKTt0aGlzLl9jb25uZWN0b3JBcmVhPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChtLl9DT05ORUNUT1JfQVJFQV9DTEFTUywhMCk7cmV0dXJuIG59O20ucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihuKXtyZXR1cm4ieSI9PT1uP1t0aGlzLl9leHRlbnRdOnAucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsCm4pfTttLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLHE9cC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksdT10aGlzLnkoKS5zY2FsZSx4PWwuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy50b3RhbCgpKTtudWxsPT10aGlzLmF0dHIoInkiKSYmKHEueT1mdW5jdGlvbihBLHksdyl7dmFyIEM9bi55KCkuYWNjZXNzb3IoQSx5LHcpO2lmKHgoQSx5LHcpKXJldHVybiBNYXRoLm1pbih1LnNjYWxlKEMpLHUuc2NhbGUoMCkpO0E9bi5fc3VidG90YWxzW3ldO2lmKDA9PT15KXJldHVybiAwPkM/dS5zY2FsZShBLUMpOnUuc2NhbGUoQSk7eT1uLl9zdWJ0b3RhbHNbeS0xXTtyZXR1cm4gQT55P3Uuc2NhbGUoQSk6dS5zY2FsZSh5KX0pO251bGw9PXRoaXMuYXR0cigiaGVpZ2h0IikmJihxLmhlaWdodD1mdW5jdGlvbihBLHksdyl7dmFyIEM9eChBLHksdyk7QT1uLnkoKS5hY2Nlc3NvcihBLHksdyk7aWYoQylyZXR1cm4gTWF0aC5hYnModS5zY2FsZShBKS0KdS5zY2FsZSgwKSk7Qz1uLl9zdWJ0b3RhbHNbeV07aWYoMD09PXkpcmV0dXJuIE1hdGguYWJzKHUuc2NhbGUoQyktdS5zY2FsZShDLUEpKTt5PW4uX3N1YnRvdGFsc1t5LTFdO3JldHVybiBNYXRoLmFicyh1LnNjYWxlKEMpLXUuc2NhbGUoeSkpfSk7cVsiY2xhc3MiXT1mdW5jdGlvbihBLHksdyl7dmFyIEM9IiI7bnVsbCE9bi5hdHRyKCJjbGFzcyIpJiYoQz1uLmF0dHIoImNsYXNzIikuYWNjZXNzb3IoQSx5LHcpKyIgIik7aWYoeChBLHksdykpcmV0dXJuIEMrbS5fQkFSX1RPVEFMX0NMQVNTO0E9bi55KCkuYWNjZXNzb3IoQSx5LHcpO3JldHVybiBDKygwPEE/bS5fQkFSX0dST1dUSF9DTEFTUzptLl9CQVJfREVDTElORV9DTEFTUyl9O3JldHVybiBxfTttLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU3VidG90YWxzKCk7cC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50PQpmdW5jdGlvbihuKXt2YXIgcT10aGlzLHU9TnVtYmVyLk1BWF9WQUxVRSx4PU51bWJlci5NSU5fVkFMVUUsQT0wLHk9ITE7bi5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbih3LEMpe3ZhciBHPXEueSgpLmFjY2Vzc29yKHcsQyxuKTsodz1xLnRvdGFsKCkuYWNjZXNzb3IodyxDLG4pKSYmMCE9PUN8fChBKz1HKTtxLl9zdWJ0b3RhbHMucHVzaChBKTtBPHUmJih1PUEpO0E+eCYmKHg9QSk7dyYmKEc8dSYmKHU9RyksRz54JiYoeD1HKSk7aWYoIXkmJncpe0M9Ry1BO2ZvcihHPTA7RzxxLl9zdWJ0b3RhbHMubGVuZ3RoO0crKylxLl9zdWJ0b3RhbHNbR10rPUM7eT0hMDtBKz1DO3UrPUM7eCs9Q319KTt0aGlzLl9leHRlbnQ9W3UseF19O20ucHJvdG90eXBlLl9kcmF3Q29ubmVjdG9ycz1mdW5jdGlvbigpe2Zvcih2YXIgbj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxxPXRoaXMuZGF0YXNldHMoKVswXSx1PTE7dTxxLmRhdGEoKS5sZW5ndGg7dSsrKXt2YXIgeD11LTEsQT1xLmRhdGEoKVt1XSwKeT1xLmRhdGEoKVt4XTt5PW4ueCh5LHgscSk7dmFyIHc9bi54KEEsdSxxKStuLndpZHRoKEEsdSxxKSxDPW4ueShBLHUscSk7aWYoMDx0aGlzLl9zdWJ0b3RhbHNbdV0mJnRoaXMuX3N1YnRvdGFsc1t1XT50aGlzLl9zdWJ0b3RhbHNbeF18fDA+dGhpcy5fc3VidG90YWxzW3VdJiZ0aGlzLl9zdWJ0b3RhbHNbdV0+PXRoaXMuX3N1YnRvdGFsc1t4XSlDPW4ueShBLHUscSkrbi5oZWlnaHQoQSx1LHEpO3RoaXMuX2Nvbm5lY3RvckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChtLl9DT05ORUNUT1JfQ0xBU1MsITApLmF0dHIoIngxIix5KS5hdHRyKCJ4MiIsdykuYXR0cigieTEiLEMpLmF0dHIoInkyIixDKX19O20ucHJvdG90eXBlLl91cGRhdGVTdWJ0b3RhbHM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmRhdGFzZXRzKCk7MDxuLmxlbmd0aCYmKG49bltuLmxlbmd0aC0xXSx0aGlzLl9zdWJ0b3RhbHM9W10sdGhpcy5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50KG4pKX07cmV0dXJuIG19KGQuQmFyKTsKaC5fQkFSX0RFQ0xJTkVfQ0xBU1M9IndhdGVyZmFsbC1kZWNsaW5lIjtoLl9CQVJfR1JPV1RIX0NMQVNTPSJ3YXRlcmZhbGwtZ3Jvd3RoIjtoLl9CQVJfVE9UQUxfQ0xBU1M9IndhdGVyZmFsbC10b3RhbCI7aC5fQ09OTkVDVE9SX0NMQVNTPSJjb25uZWN0b3IiO2guX0NPTk5FQ1RPUl9BUkVBX0NMQVNTPSJjb25uZWN0b3ItYXJlYSI7aC5fVE9UQUxfS0VZPSJ0b3RhbCI7Zi5XYXRlcmZhbGw9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2YXIgcT1wLmNhbGwodGhpcyl8fHRoaXM7CnN3aXRjaChuKXtjYXNlIG51bGw6Y2FzZSB2b2lkIDA6bnVsbD09bS5fcGxvdHRhYmxlQ29sb3JDYWNoZSYmKG0uX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9bS5fZ2V0UGxvdHRhYmxlQ29sb3JzKCkpO249dC5zY2FsZU9yZGluYWwoKS5yYW5nZShtLl9wbG90dGFibGVDb2xvckNhY2hlKTticmVhaztjYXNlICJDYXRlZ29yeTEwIjpjYXNlICJjYXRlZ29yeTEwIjpjYXNlICIxMCI6bj10LnNjYWxlT3JkaW5hbCh0LnNjaGVtZUNhdGVnb3J5MTApO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MjAiOmNhc2UgImNhdGVnb3J5MjAiOmNhc2UgIjIwIjpuPXQuc2NhbGVPcmRpbmFsKHQuc2NoZW1lQ2F0ZWdvcnkyMCk7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMGIiOmNhc2UgImNhdGVnb3J5MjBiIjpjYXNlICIyMGIiOm49dC5zY2FsZU9yZGluYWwodC5zY2hlbWVDYXRlZ29yeTIwYik7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMGMiOmNhc2UgImNhdGVnb3J5MjBjIjpjYXNlICIyMGMiOm49dC5zY2FsZU9yZGluYWwodC5zY2hlbWVDYXRlZ29yeTIwYyk7CmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIENvbG9yU2NhbGUgdHlwZSIpO31xLl9kM1NjYWxlPW47cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBsLkFycmF5LnVuaXEobil9O20ucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbC5BcnJheS51bmlxKHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkpfTttLmludmFsaWRhdGVDb2xvckNhY2hlPWZ1bmN0aW9uKCl7bS5fcGxvdHRhYmxlQ29sb3JDYWNoZT1udWxsfTttLl9nZXRQbG90dGFibGVDb2xvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIG49W10scT10LnNlbGVjdCgiYm9keSIpLmFwcGVuZCgicGxvdHRhYmxlLWNvbG9yLXRlc3RlciIpLHU9bC5Db2xvci5jb2xvclRlc3QocSwiIikseD0wLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0wIik7bnVsbCE9QSYmeDx0aGlzLl9NQVhJTVVNX0NPTE9SU19GUk9NX0NTUyYmCihBIT09dXx8QSE9PW5bbi5sZW5ndGgtMV0pOyluLnB1c2goQSkseCsrLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0iK3gpO3EucmVtb3ZlKCk7cmV0dXJuIG59O20ucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKG4pe3ZhciBxPXRoaXMuX2QzU2NhbGUobik7bj10aGlzLmRvbWFpbigpLmluZGV4T2Yobik7bj1NYXRoLmZsb29yKG4vdGhpcy5yYW5nZSgpLmxlbmd0aCk7cmV0dXJuIGwuQ29sb3IubGlnaHRlbkNvbG9yKHEsTWF0aC5sb2cobiptLl9MT09QX0xJR0hURU5fRkFDVE9SKzEpKX07bS5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07bS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fZ2V0UmFuZ2U9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07bS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKG4pe3RoaXMuX2QzU2NhbGUucmFuZ2Uobil9O3JldHVybiBtfShoKDE3KS5TY2FsZSk7ZC5fTE9PUF9MSUdIVEVOX0ZBQ1RPUj0xLjY7ZC5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1M9MjU2O2YuQ29sb3I9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2b2lkIDA9PT1uJiYobj0ibGluZWFyIik7dmFyIHE9cC5jYWxsKHRoaXMpfHx0aGlzO3N3aXRjaChuKXtjYXNlICJsaW5lYXIiOnEuX2NvbG9yU2NhbGU9CnQuc2NhbGVMaW5lYXIoKTticmVhaztjYXNlICJsb2ciOnEuX2NvbG9yU2NhbGU9dC5zY2FsZUxvZygpO2JyZWFrO2Nhc2UgInNxcnQiOnEuX2NvbG9yU2NhbGU9dC5zY2FsZVNxcnQoKTticmVhaztjYXNlICJwb3ciOnEuX2NvbG9yU2NhbGU9dC5zY2FsZVBvdygpfWlmKG51bGw9PXEuX2NvbG9yU2NhbGUpdGhyb3cgRXJyb3IoInVua25vd24gUXVhbnRpdGF0aXZlU2NhbGUgc2NhbGUgdHlwZSAiK24pO3EucmFuZ2UobS5SRURTKTtyZXR1cm4gcX1rKG0scCk7bS5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24obil7bj10LmV4dGVudChuKTtyZXR1cm4gbnVsbD09blswXXx8bnVsbD09blsxXT9bXTpufTttLnByb3RvdHlwZS5fZDNJbnRlcnBvbGF0ZWRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnJhbmdlKFswLDFdKS5pbnRlcnBvbGF0ZSh0aGlzLl9pbnRlcnBvbGF0ZUNvbG9ycygpKX07bS5wcm90b3R5cGUuX2ludGVycG9sYXRlQ29sb3JzPQpmdW5jdGlvbigpe3ZhciBuPXRoaXMuX2NvbG9yUmFuZ2U7aWYoMj5uLmxlbmd0aCl0aHJvdyBFcnJvcigiQ29sb3Igc2NhbGUgYXJyYXlzIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuIik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHEpe3E9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHEpKTtxKj1uLmxlbmd0aC0xO3ZhciB1PU1hdGguZmxvb3IocSkseD1xLXU7cmV0dXJuIHQuaW50ZXJwb2xhdGVMYWIoblt1XSxuW01hdGguY2VpbChxKV0pKHgpfX19O20ucHJvdG90eXBlLl9yZXNldFNjYWxlPWZ1bmN0aW9uKCl7dGhpcy5fZDNTY2FsZT10aGlzLl9kM0ludGVycG9sYXRlZFNjYWxlKCk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9O20ucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpOzA8bi5sZW5ndGgmJnRoaXMuX3NldERvbWFpbihbbC5NYXRoLm1pbihuLAowKSxsLk1hdGgubWF4KG4sMCldKX07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O20ucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbG9yUmFuZ2V9O20ucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbihuKXt0aGlzLl9jb2xvclJhbmdlPW47dGhpcy5fcmVzZXRTY2FsZSgpfTtyZXR1cm4gbX0oaCgxNykuU2NhbGUpO2QuUkVEUz0iI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7CmQuQkxVRVM9IiNGRkZGRkYgI0NDRkZGRiAjQTVGRkZEICM4NUY3RkIgIzZFRDNFRiAjNTVBN0UwICM0MTdGRDAgIzI1NDVEMyAjMEIwMkUxIi5zcGxpdCgiICIpO2QuUE9TTkVHPSIjMEIwMkUxICMyNTQ1RDMgIzQxN0ZEMCAjNTVBN0UwICM2RUQzRUYgIzg1RjdGQiAjQTVGRkZEICNDQ0ZGRkYgI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7Zi5JbnRlcnBvbGF0ZWRDb2xvcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgxKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAoKXt2YXIgbT0KbC5jYWxsKHRoaXMpfHx0aGlzO20uX2QzU2NhbGU9dC5zY2FsZUxpbmVhcigpO3JldHVybiBtfWsocCxsKTtwLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLDFdfTtwLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24obSl7cmV0dXJuIG1bMF09PT1tWzFdP1ttWzBdLTEsbVsxXSsxXTptfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5fZDNTY2FsZShtKX07cC5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5zY2FsZShtKX07cC5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5pbnZlcnQobSl9O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtwLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbihtKXt0aGlzLmRvbWFpbihtKX07cC5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07cC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtwLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obSl7dGhpcy5fZDNTY2FsZS5yYW5nZShtKX07cC5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydChtKX07cC5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07CnAucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihtKS5uaWNlKG4pLmRvbWFpbigpfTtyZXR1cm4gcH0oaCgxMSkuUXVhbnRpdGF0aXZlU2NhbGUpO2YuTGluZWFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxuKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1tfWZvcih2YXIgdSBpbiBuKW4uaGFzT3duUHJvcGVydHkodSkmJihtW3VdPW5bdV0pO20ucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHEucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBxKX0sdD1oKDEpLGw9aCgwKSxwPWgoMyk7ZD1mdW5jdGlvbihtKXtmdW5jdGlvbiBuKHEpe3ZvaWQgMD09PXEmJihxPTEwKTt2YXIgdT1tLmNhbGwodGhpcyl8fHRoaXM7dS5fZDNTY2FsZT10LnNjYWxlTGluZWFyKCk7dS5fYmFzZT1xO3UuX3Bpdm90PXUuX2Jhc2U7dS5fc2V0RG9tYWluKHUuX2RlZmF1bHRFeHRlbnQoKSk7CmlmKDE+PXEpdGhyb3cgRXJyb3IoIk1vZGlmaWVkTG9nU2NhbGU6IFRoZSBiYXNlIG11c3QgYmUgXHgzZSAxIik7cmV0dXJuIHV9ayhuLG0pO24ucHJvdG90eXBlLl9hZGp1c3RlZExvZz1mdW5jdGlvbihxKXt2YXIgdT0wPnE/LTE6MTtxKj11O3E8dGhpcy5fcGl2b3QmJihxKz0odGhpcy5fcGl2b3QtcSkvdGhpcy5fcGl2b3QpO3E9TWF0aC5sb2cocSkvTWF0aC5sb2codGhpcy5fYmFzZSk7cmV0dXJuIHEqdX07bi5wcm90b3R5cGUuX2ludmVydGVkQWRqdXN0ZWRMb2c9ZnVuY3Rpb24ocSl7dmFyIHU9MD5xPy0xOjE7cT1NYXRoLnBvdyh0aGlzLl9iYXNlLHEqdSk7cTx0aGlzLl9waXZvdCYmKHE9dGhpcy5fcGl2b3QqKHEtMSkvKHRoaXMuX3Bpdm90LTEpKTtyZXR1cm4gcSp1fTtuLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5fZDNTY2FsZSh0aGlzLl9hZGp1c3RlZExvZyhxKSl9O24ucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5faW52ZXJ0ZWRBZGp1c3RlZExvZyh0aGlzLl9kM1NjYWxlLmludmVydChxKSl9OwpuLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLnNjYWxlKHEpfTtuLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLmludmVydChxKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0VW5ib3VuZGVkRXh0ZW50KCEwKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07bi5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24ocSl7dGhpcy5kb21haW4ocSl9O24ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbn07bi5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihxKXt0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluPXE7bS5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMsClt0aGlzLl9hZGp1c3RlZExvZyhxWzBdKSx0aGlzLl9hZGp1c3RlZExvZyhxWzFdKV0pfTtuLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4ocSk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcShHLEQsQil7cmV0dXJuW0csRCxCXS5zb3J0KGZ1bmN0aW9uKEksTil7cmV0dXJuIEktTn0pWzFdfXZhciB1PWwuTWF0aC5taW4odGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSx4PWwuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSxBPXEodSx4LC10aGlzLl9waXZvdCkseT1xKHUseCx0aGlzLl9waXZvdCk7QT10aGlzLl9sb2dUaWNrcygtQSwtdSkubWFwKGZ1bmN0aW9uKEcpe3JldHVybi1HfSkucmV2ZXJzZSgpO3k9dGhpcy5fbG9nVGlja3MoeSx4KTt2YXIgdz1NYXRoLm1heCh1LAotdGhpcy5fcGl2b3QpLEM9TWF0aC5taW4oeCx0aGlzLl9waXZvdCk7dz10LnNjYWxlTGluZWFyKCkuZG9tYWluKFt3LENdKS50aWNrcyh0aGlzLl9ob3dNYW55VGlja3ModyxDKSk7QT1BLmNvbmNhdCh3KS5jb25jYXQoeSk7MT49QS5sZW5ndGgmJihBPXQuc2NhbGVMaW5lYXIoKS5kb21haW4oW3UseF0pLnRpY2tzKCkpO3JldHVybiBBfTtuLnByb3RvdHlwZS5fbG9nVGlja3M9ZnVuY3Rpb24ocSx1KXt2YXIgeD10aGlzLEE9dGhpcy5faG93TWFueVRpY2tzKHEsdSk7aWYoMD09PUEpcmV0dXJuW107dmFyIHk9TWF0aC5mbG9vcihNYXRoLmxvZyhxKS9NYXRoLmxvZyh0aGlzLl9iYXNlKSksdz1NYXRoLmNlaWwoTWF0aC5sb2codSkvTWF0aC5sb2codGhpcy5fYmFzZSkpO0E9dC5yYW5nZSh3LHksLU1hdGguY2VpbCgody15KS9BKSk7eT10LnJhbmdlKHRoaXMuX2Jhc2UsMSwtKHRoaXMuX2Jhc2UtMSkpLm1hcChNYXRoLmZsb29yKTt2YXIgQz1sLkFycmF5LnVuaXEoeSk7QT1BLm1hcChmdW5jdGlvbihHKXtyZXR1cm4gQy5tYXAoZnVuY3Rpb24oRCl7cmV0dXJuIE1hdGgucG93KHguX2Jhc2UsCkctMSkqRH0pfSk7cmV0dXJuIGwuQXJyYXkuZmxhdHRlbihBKS5maWx0ZXIoZnVuY3Rpb24oRyl7cmV0dXJuIHE8PUcmJkc8PXV9KS5zb3J0KGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEctRH0pfTtuLnByb3RvdHlwZS5faG93TWFueVRpY2tzPWZ1bmN0aW9uKHEsdSl7dmFyIHg9dGhpcy5fYWRqdXN0ZWRMb2cobC5NYXRoLm1pbih0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluLDApKSxBPXRoaXMuX2FkanVzdGVkTG9nKGwuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSk7cmV0dXJuIE1hdGguY2VpbCgodGhpcy5fYWRqdXN0ZWRMb2codSktdGhpcy5fYWRqdXN0ZWRMb2cocSkpLyhBLXgpKnAuTW9kaWZpZWRMb2cuX0RFRkFVTFRfTlVNX1RJQ0tTKX07bi5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24ocSl7cmV0dXJuIHF9O24ucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuWzAsdGhpcy5fYmFzZV19O24ucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj0KZnVuY3Rpb24ocSl7cmV0dXJuIHFbMF09PT1xWzFdPyhxPXFbMF0sMDxxP1txL3RoaXMuX2Jhc2UscSp0aGlzLl9iYXNlXTowPT09cT9bLXRoaXMuX2Jhc2UsdGhpcy5fYmFzZV06W3EqdGhpcy5fYmFzZSxxL3RoaXMuX2Jhc2VdKTpxfTtuLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtuLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24ocSl7dGhpcy5fZDNTY2FsZS5yYW5nZShxKX07bi5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07cmV0dXJuIG59KGgoMTEpLlF1YW50aXRhdGl2ZVNjYWxlKTtmLk1vZGlmaWVkTG9nPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2YuaW50ZXJ2YWxUaWNrR2VuZXJhdG9yPWZ1bmN0aW9uKHQpe2lmKDA+PXQpdGhyb3cgRXJyb3IoImludGVydmFsIG11c3QgYmUgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKGwpe2w9CmwuZG9tYWluKCk7dmFyIHA9TWF0aC5taW4obFswXSxsWzFdKTtsPU1hdGgubWF4KGxbMF0sbFsxXSk7dmFyIG09TWF0aC5jZWlsKHAvdCkqdDtwPTA9PT1wJXQ/W106W3BdO3ZhciBuPWsuTWF0aC5yYW5nZSgwLE1hdGguZmxvb3IoKGwtbSkvdCkrMSkubWFwKGZ1bmN0aW9uKHEpe3JldHVybiBtK3EqdH0pO3JldHVybiBwLmNvbmNhdChuKS5jb25jYXQoMD09PWwldD9bXTpbbF0pfX07Zi5pbnRlZ2VyVGlja0dlbmVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbD10LmRlZmF1bHRUaWNrcygpO3JldHVybiBsLmZpbHRlcihmdW5jdGlvbihwLG0pe3JldHVybiAwPT09cCUxfHwwPT09bXx8bT09PWwubGVuZ3RoLTF9KX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTsKcC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDI4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1wLmNhbGwodGhpcyl8fHRoaXM7bi5fZDNTY2FsZT10LnNjYWxlVGltZSgpO24uYXV0b0RvbWFpbigpO3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS50aWNrSW50ZXJ2YWw9ZnVuY3Rpb24obixxKXt2b2lkIDA9PT1xJiYocT0xKTt2YXIgdT10LnNjYWxlVGltZSgpO20udGltZUludGVydmFsVG9EM1RpbWUobikuZXZlcnkocSk7dS5kb21haW4odGhpcy5kb21haW4oKSk7dS5yYW5nZSh0aGlzLnJhbmdlKCkpO3JldHVybiB1LnRpY2tzKCl9O20ucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24obil7aWYoblsxXTxuWzBdKXRocm93IEVycm9yKCJTY2FsZS5UaW1lIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIik7cmV0dXJuIHAucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLApuKX07bS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bbmV3IERhdGUoIjE5NzAtMDEtMDEiKSxuZXcgRGF0ZSgiMTk3MC0wMS0wMiIpXX07bS5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKG4pe3ZhciBxPW5bMF0uZ2V0VGltZSgpLHU9blsxXS5nZXRUaW1lKCk7cmV0dXJuIHE9PT11PyhuPW5ldyBEYXRlKHEpLG4uc2V0RGF0ZShuLmdldERhdGUoKS0xKSx1PW5ldyBEYXRlKHUpLHUuc2V0RGF0ZSh1LmdldERhdGUoKSsxKSxbbix1XSk6bn07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuc2NhbGUobmV3IERhdGUobikpfTttLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmludmVydChuKS5nZXRUaW1lKCl9O20ucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PQpmdW5jdGlvbigpe3ZhciBuPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCk7cmV0dXJuW25bMF0udmFsdWVPZigpLG5bMV0udmFsdWVPZigpXX07bS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmRvbWFpbigpO3JldHVybltuWzBdLnZhbHVlT2YoKSxuWzFdLnZhbHVlT2YoKV19O20ucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKG4pe3RoaXMuZG9tYWluKFtuZXcgRGF0ZShuWzBdKSxuZXcgRGF0ZShuWzFdKV0pfTttLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTttLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4obik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9OwptLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obil7dGhpcy5fZDNTY2FsZS5yYW5nZShuKX07bS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydChuKX07bS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07bS5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihuKS5uaWNlKCkuZG9tYWluKCl9O20udGltZUludGVydmFsVG9EM1RpbWU9ZnVuY3Rpb24obil7c3dpdGNoKG4pe2Nhc2UgbC5UaW1lSW50ZXJ2YWwuc2Vjb25kOnJldHVybiB0LnRpbWVTZWNvbmQ7Y2FzZSBsLlRpbWVJbnRlcnZhbC5taW51dGU6cmV0dXJuIHQudGltZU1pbnV0ZTtjYXNlIGwuVGltZUludGVydmFsLmhvdXI6cmV0dXJuIHQudGltZUhvdXI7Y2FzZSBsLlRpbWVJbnRlcnZhbC5kYXk6cmV0dXJuIHQudGltZURheTsKY2FzZSBsLlRpbWVJbnRlcnZhbC53ZWVrOnJldHVybiB0LnRpbWVXZWVrO2Nhc2UgbC5UaW1lSW50ZXJ2YWwubW9udGg6cmV0dXJuIHQudGltZU1vbnRoO2Nhc2UgbC5UaW1lSW50ZXJ2YWwueWVhcjpyZXR1cm4gdC50aW1lWWVhcjtkZWZhdWx0OnRocm93IEVycm9yKCJUaW1lSW50ZXJ2YWwgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0OiAiK24pO319O3JldHVybiBtfShoKDExKS5RdWFudGl0YXRpdmVTY2FsZSk7Zi5UaW1lPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpLHQ9QXJyYXk7Zi5hZGQ9ZnVuY3Rpb24obCxwKXtpZihsLmxlbmd0aCE9PXAubGVuZ3RoKXRocm93IEVycm9yKCJhdHRlbXB0ZWQgdG8gYWRkIGFycmF5cyBvZiB1bmVxdWFsIGxlbmd0aCIpO3JldHVybiBsLm1hcChmdW5jdGlvbihtLG4pe3JldHVybiBsW25dK3Bbbl19KX07Zi51bmlxPWZ1bmN0aW9uKGwpe3ZhciBwPWsuc2V0KCksbT1bXTtsLmZvckVhY2goZnVuY3Rpb24obil7cC5oYXMoU3RyaW5nKG4pKXx8CihwLmFkZChTdHJpbmcobikpLG0ucHVzaChuKSl9KTtyZXR1cm4gbX07Zi5mbGF0dGVuPWZ1bmN0aW9uKGwpe3JldHVybiB0LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sbCl9O2YuY3JlYXRlRmlsbGVkQXJyYXk9ZnVuY3Rpb24obCxwKXtmb3IodmFyIG09W10sbj0wO248cDtuKyspbVtuXT0iZnVuY3Rpb24iPT09dHlwZW9mIGw/bChuKTpsO3JldHVybiBtfX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQsbCl7dGhpcy5tYXhJbmRleD10aGlzLm1pbkluZGV4PXRoaXMuZXhpdEluZGV4PXRoaXMuZW50cnlJbmRleD1rO3RoaXMuYnVja2V0VmFsdWU9dDt0aGlzLm1heFZhbHVlPXRoaXMubWluVmFsdWU9bH1oLnByb3RvdHlwZS5pc0luQnVja2V0PWZ1bmN0aW9uKGspe3JldHVybiBrPT10aGlzLmJ1Y2tldFZhbHVlfTtoLnByb3RvdHlwZS5hZGRUb0J1Y2tldD1mdW5jdGlvbihrLHQpe2s8dGhpcy5taW5WYWx1ZSYmKHRoaXMubWluVmFsdWU9ayx0aGlzLm1pbkluZGV4PQp0KTtrPnRoaXMubWF4VmFsdWUmJih0aGlzLm1heFZhbHVlPWssdGhpcy5tYXhJbmRleD10KTt0aGlzLmV4aXRJbmRleD10fTtoLnByb3RvdHlwZS5nZXRVbmlxdWVJbmRpY2VzPWZ1bmN0aW9uKCl7dmFyIGs9W3RoaXMuZW50cnlJbmRleCx0aGlzLm1heEluZGV4LHRoaXMubWluSW5kZXgsdGhpcy5leGl0SW5kZXhdO3JldHVybiBrLmZpbHRlcihmdW5jdGlvbih0LGwpe3JldHVybiAwPT1sfHx0IT1rW2wtMV19KX07cmV0dXJuIGh9KCk7Zi5CdWNrZXQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHRbbV09bFttXSk7dC5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gbnVsbCE9PQp0JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKGwsdCk7bC5wcm90b3R5cGUuY2FsbENhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgcD10aGlzLG09W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspbVtuXT1hcmd1bWVudHNbbl07dGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3EuYXBwbHkocCxtKX0pO3JldHVybiB0aGlzfTtyZXR1cm4gbH0oaCg1OCkuU2V0KTtmLkNhbGxiYWNrU2V0PWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHApe2Z1bmN0aW9uIG0odSl7dS89MjU1O3JldHVybi4wMzkyOD49dT91LzEyLjkyOmwucG93KCh1Ky4wNTUpLzEuMDU1LDIuNCl9dmFyIG49dC5yZ2IocCk7cD1tKG4ucik7dmFyIHE9bShuLmcpO249bShuLmIpO3JldHVybi4yMTI2KnArLjcxNTIqcSsuMDcyMipufXZhciB0PWgoMSksbD1NYXRoO2YuY29udHJhc3Q9ZnVuY3Rpb24ocCxtKXtwPWsocCkrLjA1O209ayhtKSsuMDU7cmV0dXJuIHA+bT9wL206bS9wfTtmLmxpZ2h0ZW5Db2xvcj0KZnVuY3Rpb24ocCxtKXtyZXR1cm4gdC5jb2xvcihwKS5icmlnaHRlcihtKS5yZ2IoKS50b1N0cmluZygpfTtmLmNvbG9yVGVzdD1mdW5jdGlvbihwLG0pe3AuY2xhc3NlZChtLCEwKTt2YXIgbj1wLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIik7aWYoInRyYW5zcGFyZW50Ij09PW4pcmV0dXJuIG51bGw7bj0vXCgoLispXCkvLmV4ZWMobik7aWYoIW4pcmV0dXJuIG51bGw7bj1uWzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKHEpe3E9K3E7dmFyIHU9cS50b1N0cmluZygxNik7cmV0dXJuIDE2PnE/IjAiK3U6dX0pO2lmKDQ9PT1uLmxlbmd0aCYmIjAwIj09PW5bM10pcmV0dXJuIG51bGw7bj0iIyIrbi5qb2luKCIiKTtwLmNsYXNzZWQobSwhMSk7cmV0dXJuIG59fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSx0PWgoNTcpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7dGhpcy5fZW50aXRpZXM9W107dGhpcy5fcnRyZWU9bmV3IHQuUlRyZWU7dGhpcy5fdHJlZT1rLnF1YWR0cmVlKCkueChmdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5mbG9vcihwLnBvc2l0aW9uLngpfSkueShmdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5mbG9vcihwLnBvc2l0aW9uLnkpfSl9CmwucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbihwLG0sbil7KHg9dGhpcy5fZW50aXRpZXMpLnB1c2guYXBwbHkoeCxwKTtpZih2b2lkIDAhPT1uKWZvcihuPXQuUlRyZWVCb3VuZHMuYm91bmRzKG4pLHg9MDt4PHAubGVuZ3RoO3grKyl7dmFyIHE9cFt4XSx1PXQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0ocSkpO3QuUlRyZWVCb3VuZHMuaXNCb3VuZHNPdmVybGFwQm91bmRzKG4sdSkmJih0aGlzLl90cmVlLmFkZChxKSx0aGlzLl9ydHJlZS5pbnNlcnQodSxxKSl9ZWxzZSBmb3IodGhpcy5fdHJlZS5hZGRBbGwocCkseD0wO3g8cC5sZW5ndGg7eCsrKXE9cFt4XSx1PXQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0ocSkpLHRoaXMuX3J0cmVlLmluc2VydCh1LHEpO3ZhciB4fTtsLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl90cmVlLmZpbmQocC54LHAueSl9O2wucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuX3J0cmVlLmludGVyc2VjdCh0LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9OwpsLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WCh0LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9O2wucHJvdG90eXBlLmVudGl0aWVzSW5ZQm91bmRzPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3RZKHQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKHApKX07bC5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW50aXRpZXN9O3JldHVybiBsfSgpO2YuRW50aXR5U3RvcmU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoNTYpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuTWFwP3RoaXMuX2VzNk1hcD1uZXcgd2luZG93Lk1hcDp0aGlzLl9rZXlWYWx1ZVBhaXJzPVtdfXQucHJvdG90eXBlLnNldD1mdW5jdGlvbihsLHApe2lmKGsuaXNOYU4obCkpdGhyb3cgRXJyb3IoIk5hTiBtYXkgbm90IGJlIHVzZWQgYXMgYSBrZXkgdG8gdGhlIE1hcCIpOwppZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5zZXQobCxwKSx0aGlzO2Zvcih2YXIgbT0wO208dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7bSsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbbV0ua2V5PT09bClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1ttXS52YWx1ZT1wLHRoaXM7dGhpcy5fa2V5VmFsdWVQYWlycy5wdXNoKHtrZXk6bCx2YWx1ZTpwfSk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmdldD1mdW5jdGlvbihsKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5nZXQobCk7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLnZhbHVlfTt0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24obCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuaGFzKGwpOwpmb3IodmFyIHA9MDtwPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO3ArKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLmtleT09PWwpcmV0dXJuITA7cmV0dXJuITF9O3QucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24obCxwKXt2YXIgbT10aGlzO251bGwhPXRoaXMuX2VzNk1hcD90aGlzLl9lczZNYXAuZm9yRWFjaChmdW5jdGlvbihuLHEpe3JldHVybiBsLmNhbGwocCxuLHEsbSl9LHApOnRoaXMuX2tleVZhbHVlUGFpcnMuZm9yRWFjaChmdW5jdGlvbihuKXtsLmNhbGwocCxuLnZhbHVlLG4ua2V5LG0pfSl9O3QucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihsKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5kZWxldGUobCk7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzLnNwbGljZShwLDEpLCEwO3JldHVybiExfTsKcmV0dXJuIHR9KCk7Zi5NYXA9ZH0sZnVuY3Rpb24oZCxmKXtmLmFzc2lnbj1mdW5jdGlvbigpe2Zvcih2YXIgaD1bXSxrPTA7azxhcmd1bWVudHMubGVuZ3RoO2srKyloW2tdPWFyZ3VtZW50c1trXTtrPXt9O2Zvcih2YXIgdD0wO3Q8aC5sZW5ndGg7dCsrKWZvcih2YXIgbD1oW3RdLHA9MCxtPU9iamVjdC5rZXlzKGwpO3A8bS5sZW5ndGg7cCsrKXt2YXIgbj1tW3BdO2tbbl09bFtuXX1yZXR1cm4ga319LGZ1bmN0aW9uKGQsZil7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oayx0KXtmb3IodmFyIGw9TWF0aC5jZWlsKGsubGVuZ3RoLzIpLHA9MDtwPGw7cCsrKXRbMF0uaW5zZXJ0KGtbcF0pO2ZvcihwPWw7cDxrLmxlbmd0aDtwKyspdFsxXS5pbnNlcnQoa1twXSl9O3JldHVybiBofSgpO2YuU3BsaXRTdHJhdGVneVRyaXZpYWw9ZDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe31oLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihrLHQpe2s9Cmsuc2xpY2UoKTtmb3IodGhpcy5jaG9vc2VGaXJzdFNwbGl0KGssdCk7MDxrLmxlbmd0aDspdGhpcy5hZGROZXh0KGssdCl9O2gucHJvdG90eXBlLmNob29zZUZpcnN0U3BsaXQ9ZnVuY3Rpb24oayx0KXtmb3IodmFyIGw9MCxwPTAsbT1rLmxlbmd0aC0xLG49ay5sZW5ndGgtMSxxPTE7cTxrLmxlbmd0aC0xO3ErKyl7dmFyIHU9a1txXTt1LmJvdW5kcy54bD5rW21dLmJvdW5kcy54bD9tPXE6dS5ib3VuZHMueGg8a1tsXS5ib3VuZHMueGgmJihsPXEpO3UuYm91bmRzLnlsPmtbbl0uYm91bmRzLnlsP249cTp1LmJvdW5kcy55aDxrW3BdLmJvdW5kcy55aCYmKHA9cSl9cD1NYXRoLmFicyhrW2xdLmJvdW5kcy54aC1rW21dLmJvdW5kcy54bCk+TWF0aC5hYnMoa1twXS5ib3VuZHMueWgta1tuXS5ib3VuZHMueWwpP1tsLG1dOltwLG5dO2w9cFswXTtwPXBbMV07bD09PXAmJihsPTAscD1rLmxlbmd0aC0xKTt0WzBdLmluc2VydChrLnNwbGljZShNYXRoLm1heChsLHApLDEpWzBdKTt0WzFdLmluc2VydChrLnNwbGljZShNYXRoLm1pbihsLApwKSwxKVswXSl9O2gucHJvdG90eXBlLmFkZE5leHQ9ZnVuY3Rpb24oayx0KXtmb3IodmFyIGw9bnVsbCxwPW51bGwsbT1udWxsLG49MDtuPGsubGVuZ3RoO24rKyl7dmFyIHE9a1tuXSx1PXRbMF0udW5pb25BcmVhRGlmZmVyZW5jZShxLmJvdW5kcyk7cT10WzFdLnVuaW9uQXJlYURpZmZlcmVuY2UocS5ib3VuZHMpO2lmKHU8cHx8bnVsbD09bClsPW4scD11LG09dFswXTtxPHAmJihsPW4scD1xLG09dFsxXSl9bS5pbnNlcnQoay5zcGxpY2UobCwxKVswXSl9O3JldHVybiBofSgpO2YuU3BsaXRTdHJhdGVneUxpbmVhcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhtKXtyZXR1cm4gU3RyaW5nKG0pfXZhciB0PWgoMSksbD1oKDApO2Q9aCgxMCk7Zi5JU3RhY2tpbmdPcmRlcj1kLm1ha2VFbnVtKFsidG9wZG93biIsImJvdHRvbXVwIl0pO3ZhciBwPU1hdGg7Zi5zdGFjaz1mdW5jdGlvbihtLG4scSx1KXt2b2lkIDA9PT11JiYodT0iYm90dG9tdXAiKTt2YXIgeD10Lm1hcCgpLEE9CnQubWFwKCkseT1uZXcgbC5NYXA7InRvcGRvd24iPT09dSYmKG09bS5zbGljZSgpLG0ucmV2ZXJzZSgpKTttLmZvckVhY2goZnVuY3Rpb24odyl7dmFyIEM9bmV3IGwuTWFwO3cuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oRyxEKXt2YXIgQj1rKG4oRyxELHcpKSxJPStxKEcsRCx3KSxOPTA8PUk/eDpBO2lmKE4uaGFzKEIpKXt2YXIgTz1OLmdldChCKTtOLnNldChCLE8rSSl9ZWxzZSBPPTAsTi5zZXQoQixJKTtDLnNldChCLHtvZmZzZXQ6Tyx2YWx1ZTpJLGF4aXNWYWx1ZTpuKEcsRCx3KSxvcmlnaW5hbERhdHVtOkcsb3JpZ2luYWxEYXRhc2V0Oncsb3JpZ2luYWxJbmRleDpEfSl9KTt5LnNldCh3LEMpfSk7cmV0dXJuIHl9O2Yuc3RhY2tlZEV4dGVudHM9ZnVuY3Rpb24obSl7dmFyIG49bmV3IGwuTWFwLHE9bmV3IGwuTWFwO20uZm9yRWFjaChmdW5jdGlvbih1KXt1LmZvckVhY2goZnVuY3Rpb24oeCxBKXt2YXIgeT1sLk1hdGgubWF4KFt4Lm9mZnNldCt4LnZhbHVlLHgub2Zmc2V0XSwKeC5vZmZzZXQpLHc9bC5NYXRoLm1pbihbeC5vZmZzZXQreC52YWx1ZSx4Lm9mZnNldF0seC5vZmZzZXQpLEM9eC5heGlzVmFsdWU7bi5oYXMoQSk/bi5nZXQoQSkuZXh0ZW50PHkmJm4uc2V0KEEse2V4dGVudDp5LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp4fSk6bi5zZXQoQSx7ZXh0ZW50OnksYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnh9KTtxLmhhcyhBKT9xLmdldChBKS5leHRlbnQ+dyYmcS5zZXQoQSx7ZXh0ZW50OncsYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnh9KTpxLnNldChBLHtleHRlbnQ6dyxheGlzVmFsdWU6QyxzdGFja2VkRGF0dW06eH0pfSl9KTtyZXR1cm57bWF4aW11bUV4dGVudHM6bixtaW5pbXVtRXh0ZW50czpxfX07Zi5zdGFja2VkRXh0ZW50PWZ1bmN0aW9uKG0sbixxKXt2YXIgdT1bXTttLmZvckVhY2goZnVuY3Rpb24oQSx5KXt5LmRhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uKHcsQyl7aWYobnVsbD09cXx8cSh3LEMseSkpdz1BLmdldChrKG4odyxDLHkpKSksCnUucHVzaCh3LnZhbHVlK3cub2Zmc2V0KX0pfSk7bT1sLk1hdGgubWF4KHUsMCk7dmFyIHg9bC5NYXRoLm1pbih1LDApO3JldHVybltwLm1pbih4LDApLHAubWF4KDAsbSldfTtmLm5vcm1hbGl6ZUtleT1rfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgwKTtmLmdldFRyYW5zbGF0b3I9ZnVuY3Rpb24obCl7bD1sLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt2YXIgcD1sLl9fUGxvdHRhYmxlX0NsaWVudFRyYW5zbGF0b3I7bnVsbD09cCYmKHA9bmV3IHQobCksbC5fX1Bsb3R0YWJsZV9DbGllbnRUcmFuc2xhdG9yPXApO3JldHVybiBwfTt2YXIgdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwocCl7dGhpcy5fcm9vdEVsZW1lbnQ9cH1sLnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb249ZnVuY3Rpb24ocCxtKXtwPXt4OnAseTptfTttPWsuTWF0aC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09bT9wOmsuTWF0aC5hcHBseVRyYW5zZm9ybShtLApwKX07bC5pc0V2ZW50SW5zaWRlPWZ1bmN0aW9uKHAsbSl7cmV0dXJuIGsuRE9NLmNvbnRhaW5zKHAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpLG0udGFyZ2V0KX07cmV0dXJuIGx9KCk7Zi5UcmFuc2xhdG9yPXR9LGZ1bmN0aW9uKGQsZixoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGs9aCgxMjQpO2guZChmLCJlYXNlTGluZWFyIixmdW5jdGlvbigpe3JldHVybiBrLmF9KTt2YXIgdD1oKDEyNik7aC5kKGYsImVhc2VRdWFkIixmdW5jdGlvbigpe3JldHVybiB0LmF9KTtoLmQoZiwiZWFzZVF1YWRJbiIsZnVuY3Rpb24oKXtyZXR1cm4gdC5ifSk7aC5kKGYsImVhc2VRdWFkT3V0IixmdW5jdGlvbigpe3JldHVybiB0LmN9KTtoLmQoZiwiZWFzZVF1YWRJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdC5hfSk7dmFyIGw9aCgxMjEpO2guZChmLCJlYXNlQ3ViaWMiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuYX0pO2guZChmLCJlYXNlQ3ViaWNJbiIsCmZ1bmN0aW9uKCl7cmV0dXJuIGwuYn0pO2guZChmLCJlYXNlQ3ViaWNPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuY30pO2guZChmLCJlYXNlQ3ViaWNJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gbC5hfSk7dmFyIHA9aCgxMjUpO2guZChmLCJlYXNlUG9seSIsZnVuY3Rpb24oKXtyZXR1cm4gcC5hfSk7aC5kKGYsImVhc2VQb2x5SW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYn0pO2guZChmLCJlYXNlUG9seU91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcC5jfSk7aC5kKGYsImVhc2VQb2x5SW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYX0pO3ZhciBtPWgoMTI3KTtoLmQoZiwiZWFzZVNpbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5hfSk7aC5kKGYsImVhc2VTaW5JbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5ifSk7aC5kKGYsImVhc2VTaW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uY30pO2guZChmLCJlYXNlU2luSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uYX0pO3ZhciBuPWgoMTIzKTtoLmQoZiwKImVhc2VFeHAiLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYX0pO2guZChmLCJlYXNlRXhwSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYn0pO2guZChmLCJlYXNlRXhwT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmN9KTtoLmQoZiwiZWFzZUV4cEluT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmF9KTt2YXIgcT1oKDEyMCk7aC5kKGYsImVhc2VDaXJjbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYX0pO2guZChmLCJlYXNlQ2lyY2xlSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYn0pO2guZChmLCJlYXNlQ2lyY2xlT3V0IixmdW5jdGlvbigpe3JldHVybiBxLmN9KTtoLmQoZiwiZWFzZUNpcmNsZUluT3V0IixmdW5jdGlvbigpe3JldHVybiBxLmF9KTt2YXIgdT1oKDExOSk7aC5kKGYsImVhc2VCb3VuY2UiLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYX0pO2guZChmLCJlYXNlQm91bmNlSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYn0pO2guZChmLCJlYXNlQm91bmNlT3V0IixmdW5jdGlvbigpe3JldHVybiB1LmF9KTsKaC5kKGYsImVhc2VCb3VuY2VJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdS5jfSk7dmFyIHg9aCgxMTgpO2guZChmLCJlYXNlQmFjayIsZnVuY3Rpb24oKXtyZXR1cm4geC5hfSk7aC5kKGYsImVhc2VCYWNrSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHguYn0pO2guZChmLCJlYXNlQmFja091dCIsZnVuY3Rpb24oKXtyZXR1cm4geC5jfSk7aC5kKGYsImVhc2VCYWNrSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHguYX0pO3ZhciBBPWgoMTIyKTtoLmQoZiwiZWFzZUVsYXN0aWMiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYX0pO2guZChmLCJlYXNlRWxhc3RpY0luIixmdW5jdGlvbigpe3JldHVybiBBLmJ9KTtoLmQoZiwiZWFzZUVsYXN0aWNPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYX0pO2guZChmLCJlYXNlRWxhc3RpY0luT3V0IixmdW5jdGlvbigpe3JldHVybiBBLmN9KX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiBrfSk7aC5kKGYsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KTsKaC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTt2YXIgaz1mdW5jdGlvbiBuKG0pe2Z1bmN0aW9uIHEodSl7cmV0dXJuIHUqdSooKG0rMSkqdS1tKX1tPSttO3Eub3ZlcnNob290PW47cmV0dXJuIHF9KDEuNzAxNTgpLHQ9ZnVuY3Rpb24gcShuKXtmdW5jdGlvbiB1KHgpe3JldHVybi0teCp4KigobisxKSp4K24pKzF9bj0rbjt1Lm92ZXJzaG9vdD1xO3JldHVybiB1fSgxLjcwMTU4KSxsPWZ1bmN0aW9uIHUocSl7ZnVuY3Rpb24geChBKXtyZXR1cm4oMT4oQSo9Mik/QSpBKigocSsxKSpBLXEpOihBLT0yKSpBKigocSsxKSpBK3EpKzIpLzJ9cT0rcTt4Lm92ZXJzaG9vdD11O3JldHVybiB4fSgxLjcwMTU4KX0sZnVuY3Rpb24oZCxmKXtmdW5jdGlvbiBoKHkpe3JldHVybih5PSt5KTxrP0EqeSp5Onk8bD9BKih5LT10KSp5K3A6eTxuP0EqKHktPW0pKnkrcTpBKih5LT11KSp5K3h9Zi5iPWZ1bmN0aW9uKHkpe3JldHVybiAxLWgoMS15KX07Zi5hPWg7Zi5jPWZ1bmN0aW9uKHkpe3JldHVybigxPj0KKHkqPTIpPzEtaCgxLXkpOmgoeS0xKSsxKS8yfTt2YXIgaz00LzExLHQ9Ni8xMSxsPTgvMTEscD0uNzUsbT05LzExLG49MTAvMTEscT0uOTM3NSx1PTIxLzIyLHg9Ljk4NDM3NSxBPTEvay9rfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1oKmgpfTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLWgqaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpPzEtTWF0aC5zcXJ0KDEtaCpoKTpNYXRoLnNxcnQoMS0oaC09MikqaCkrMSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKGgpe3JldHVybiBoKmgqaH07Zi5jPWZ1bmN0aW9uKGgpe3JldHVybi0taCpoKmgrMX07Zi5hPWZ1bmN0aW9uKGgpe3JldHVybigxPj0oaCo9Mik/aCpoKmg6KGgtPTIpKmgqaCsyKS8yfX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiB0fSk7aC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTsKaC5kKGYsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KTt2YXIgaz0yKk1hdGguUEksdD1mdW5jdGlvbiB1KG4scSl7ZnVuY3Rpb24geCh5KXtyZXR1cm4gbipNYXRoLnBvdygyLDEwKi0teSkqTWF0aC5zaW4oKEEteSkvcSl9dmFyIEE9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihxLz1rKTt4LmFtcGxpdHVkZT1mdW5jdGlvbih5KXtyZXR1cm4gdSh5LHEqayl9O3gucGVyaW9kPWZ1bmN0aW9uKHkpe3JldHVybiB1KG4seSl9O3JldHVybiB4fSgxLC4zKSxsPWZ1bmN0aW9uIHgocSx1KXtmdW5jdGlvbiBBKHcpe3JldHVybiAxLXEqTWF0aC5wb3coMiwtMTAqKHc9K3cpKSpNYXRoLnNpbigodyt5KS91KX12YXIgeT1NYXRoLmFzaW4oMS8ocT1NYXRoLm1heCgxLHEpKSkqKHUvPWspO0EuYW1wbGl0dWRlPWZ1bmN0aW9uKHcpe3JldHVybiB4KHcsdSprKX07QS5wZXJpb2Q9ZnVuY3Rpb24odyl7cmV0dXJuIHgocSx3KX07cmV0dXJuIEF9KDEsLjMpLHA9ZnVuY3Rpb24gQSh1LHgpe2Z1bmN0aW9uIHkoQyl7cmV0dXJuKDA+CihDPTIqQy0xKT91Kk1hdGgucG93KDIsMTAqQykqTWF0aC5zaW4oKHctQykveCk6Mi11Kk1hdGgucG93KDIsLTEwKkMpKk1hdGguc2luKCh3K0MpL3gpKS8yfXZhciB3PU1hdGguYXNpbigxLyh1PU1hdGgubWF4KDEsdSkpKSooeC89ayk7eS5hbXBsaXR1ZGU9ZnVuY3Rpb24oQyl7cmV0dXJuIEEoQyx4KmspfTt5LnBlcmlvZD1mdW5jdGlvbihDKXtyZXR1cm4gQSh1LEMpfTtyZXR1cm4geX0oMSwuMyl9LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKGgpe3JldHVybiBNYXRoLnBvdygyLDEwKmgtMTApfTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP01hdGgucG93KDIsMTAqaC0xMCk6Mi1NYXRoLnBvdygyLDEwLTEwKmgpKS8yfX0sZnVuY3Rpb24oZCxmKXtmLmE9ZnVuY3Rpb24oaCl7cmV0dXJuK2h9fSxmdW5jdGlvbihkLGYsaCl7aC5kKGYsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGt9KTtoLmQoZiwKImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KTtoLmQoZiwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pO3ZhciBrPWZ1bmN0aW9uIG4obSl7ZnVuY3Rpb24gcSh1KXtyZXR1cm4gTWF0aC5wb3codSxtKX1tPSttO3EuZXhwb25lbnQ9bjtyZXR1cm4gcX0oMyksdD1mdW5jdGlvbiBxKG4pe2Z1bmN0aW9uIHUoeCl7cmV0dXJuIDEtTWF0aC5wb3coMS14LG4pfW49K247dS5leHBvbmVudD1xO3JldHVybiB1fSgzKSxsPWZ1bmN0aW9uIHUocSl7ZnVuY3Rpb24geChBKXtyZXR1cm4oMT49KEEqPTIpP01hdGgucG93KEEscSk6Mi1NYXRoLnBvdygyLUEscSkpLzJ9cT0rcTt4LmV4cG9uZW50PXU7cmV0dXJuIHh9KDMpfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gaCpofTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIGgqKDItaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP2gqaDotLWgqKDItaCkrMSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKHQpe3JldHVybiAxLQpNYXRoLmNvcyh0KmspfTtmLmM9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqayl9O2YuYT1mdW5jdGlvbih0KXtyZXR1cm4oMS1NYXRoLmNvcyhoKnQpKS8yfTt2YXIgaD1NYXRoLlBJLGs9aC8yfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhsKXtyZXR1cm4hMD09PXQobCkmJiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGwpfXZhciB0PWgoMTI5KTtkLmV4cG9ydHM9ZnVuY3Rpb24obCl7aWYoITE9PT1rKGwpKXJldHVybiExO2w9bC5jb25zdHJ1Y3RvcjtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGwpcmV0dXJuITE7bD1sLnByb3RvdHlwZTtyZXR1cm4hMT09PWsobCl8fCExPT09bC5oYXNPd25Qcm9wZXJ0eSgiaXNQcm90b3R5cGVPZiIpPyExOiEwfX0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPWZ1bmN0aW9uKGYpe3JldHVybiBudWxsIT1mJiYib2JqZWN0Ij09PXR5cGVvZiBmJiYhMT09PUFycmF5LmlzQXJyYXkoZil9fSxmdW5jdGlvbihkLApmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQsbCl7dm9pZCAwPT09dCYmKHQ9MTApO3ZvaWQgMD09PWwmJihsPXt9KTt2YXIgcD10aGlzO3RoaXMuY3R4PWs7dGhpcy5saW5lSGVpZ2h0PXQ7dGhpcy5zdHlsZT1sO3RoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obSl7cC5jdHguZm9udD1wLnN0eWxlLmZvbnQ7cmV0dXJue3dpZHRoOnAuY3R4Lm1lYXN1cmVUZXh0KG0pLndpZHRoLGhlaWdodDpwLmxpbmVIZWlnaHR9fX07dGhpcy5jcmVhdGVQZW49ZnVuY3Rpb24obSxuLHEpe251bGw9PXEmJihxPXAuY3R4KTtxLnNhdmUoKTtxLnRyYW5zbGF0ZShuLnRyYW5zbGF0ZVswXSxuLnRyYW5zbGF0ZVsxXSk7cS5yb3RhdGUobi5yb3RhdGUqTWF0aC5QSS8xODApO3JldHVybiBwLmNyZWF0ZUNhbnZhc1BlbihxKX07dm9pZCAwPT09dGhpcy5zdHlsZS5maWxsJiYodGhpcy5zdHlsZS5maWxsPSIjNDQ0Iil9aC5wcm90b3R5cGUuY3JlYXRlQ2FudmFzUGVuPWZ1bmN0aW9uKGspe3ZhciB0PQp0aGlzO3JldHVybntkZXN0cm95OmZ1bmN0aW9uKCl7ay5yZXN0b3JlKCl9LHdyaXRlOmZ1bmN0aW9uKGwscCxtLG4pe2sudGV4dEFsaWduPXA7bnVsbCE9dC5zdHlsZS5mb250JiYoay5mb250PXQuc3R5bGUuZm9udCk7bnVsbCE9dC5zdHlsZS5maWxsJiYoay5maWxsU3R5bGU9dC5zdHlsZS5maWxsLGsuZmlsbFRleHQobCxtLG4pKTtudWxsIT10LnN0eWxlLnN0cm9rZSYmKGsuc3Ryb2tlU3R5bGU9dC5zdHlsZS5maWxsLGsuc3Ryb2tlVGV4dChsLG0sbikpfX19O3JldHVybiBofSgpO2YuQ2FudmFzQ29udGV4dD1kfSxmdW5jdGlvbihkLGYpe3ZhciBoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaygpe31rLmFwcGVuZD1mdW5jdGlvbih0LGwpe2Zvcih2YXIgcD1bXSxtPTI7bTxhcmd1bWVudHMubGVuZ3RoO20rKylwW20tMl09YXJndW1lbnRzW21dO3A9ay5jcmVhdGUuYXBwbHkoayxbbF0uY29uY2F0KHApKTt0LmFwcGVuZENoaWxkKHApO3JldHVybiBwfTtrLmNyZWF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGw9CltdLHA9MTtwPGFyZ3VtZW50cy5sZW5ndGg7cCsrKWxbcC0xXT1hcmd1bWVudHNbcF07cD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoay5TVkdfTlMsdCk7ay5hZGRDbGFzc2VzLmFwcGx5KGssW3BdLmNvbmNhdChsKSk7cmV0dXJuIHB9O2suYWRkQ2xhc3Nlcz1mdW5jdGlvbih0KXtmb3IodmFyIGw9W10scD0xO3A8YXJndW1lbnRzLmxlbmd0aDtwKyspbFtwLTFdPWFyZ3VtZW50c1twXTtsPWwuZmlsdGVyKGZ1bmN0aW9uKG0pe3JldHVybiBudWxsIT1tfSk7bnVsbCE9dC5jbGFzc0xpc3Q/bC5mb3JFYWNoKGZ1bmN0aW9uKG0pe3QuY2xhc3NMaXN0LmFkZChtKX0pOnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsbC5qb2luKCIgIikpfTtrLmdldERpbWVuc2lvbnM9ZnVuY3Rpb24odCl7aWYodC5nZXRCQm94KXRyeXt2YXIgbD10LmdldEJCb3goKTtyZXR1cm57d2lkdGg6bC53aWR0aCxoZWlnaHQ6bC5oZWlnaHR9fWNhdGNoKHApe31yZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19O3JldHVybiBrfSgpOwpoLlNWR19OUz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2YuU3ZnVXRpbHM9aDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gayh0LGwscCl7dm9pZCAwPT09cCYmKHA9ITEpO3ZhciBtPXRoaXM7dGhpcy5lbGVtZW50PXQ7dGhpcy5jbGFzc05hbWU9bDt0aGlzLmFkZFRpdGxlRWxlbWVudD1wO3RoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXt2YXIgbj1tLmdldFRleHRFbGVtZW50cyhtLmVsZW1lbnQpLHE9bi5wYXJlbnRFbGVtZW50LHU9bi5jb250YWluZXJFbGVtZW50LHg9bi50ZXh0RWxlbWVudDtyZXR1cm4gZnVuY3Rpb24oQSl7cS5hcHBlbmRDaGlsZCh1KTt4LnRleHRDb250ZW50PUE7QT1oLmdldERpbWVuc2lvbnMoeCk7cS5yZW1vdmVDaGlsZCh1KTtyZXR1cm4gQX19O3RoaXMuY3JlYXRlUGVuPWZ1bmN0aW9uKG4scSx1KXtudWxsPT11JiYodT1tLmVsZW1lbnQpO3U9aC5hcHBlbmQodSwiZyIsInRleHQtY29udGFpbmVyIixtLmNsYXNzTmFtZSk7bS5hZGRUaXRsZUVsZW1lbnQmJgooaC5hcHBlbmQodSwidGl0bGUiKS50ZXh0Q29udGVudD1uLHUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsbikpO249aC5hcHBlbmQodSwiZyIsInRleHQtYXJlYSIpO24uc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitxLnRyYW5zbGF0ZVswXSsiLCIrcS50cmFuc2xhdGVbMV0rIilyb3RhdGUoIisocS5yb3RhdGUrIikiKSk7cmV0dXJuIG0uY3JlYXRlU3ZnTGluZVBlbihuKX19ay5wcm90b3R5cGUuc2V0QWRkVGl0bGVFbGVtZW50PWZ1bmN0aW9uKHQpe3RoaXMuYWRkVGl0bGVFbGVtZW50PXR9O2sucHJvdG90eXBlLmNyZWF0ZVN2Z0xpbmVQZW49ZnVuY3Rpb24odCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKGwscCxtLG4pe3ZhciBxPWguYXBwZW5kKHQsInRleHQiLCJ0ZXh0LWxpbmUiKTtxLnRleHRDb250ZW50PWw7cS5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIixwKTtxLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbSsiLCIrbisiKSIpO3Euc2V0QXR0cmlidXRlKCJ5IiwKIi0wLjI1ZW0iKX19fTtrLnByb3RvdHlwZS5nZXRUZXh0RWxlbWVudHM9ZnVuY3Rpb24odCl7aWYoInRleHQiPT09dC50YWdOYW1lKXt2YXIgbD10LnBhcmVudEVsZW1lbnQ7bnVsbD09bCYmKGw9dC5wYXJlbnROb2RlKTtsLnJlbW92ZUNoaWxkKHQpO3JldHVybntjb250YWluZXJFbGVtZW50OnQscGFyZW50RWxlbWVudDpsLHRleHRFbGVtZW50OnR9fXZhciBwPXQucXVlcnlTZWxlY3RvcigidGV4dCIpO2lmKG51bGwhPXApcmV0dXJuIGw9dC5wYXJlbnRFbGVtZW50LG51bGw9PWwmJihsPXQucGFyZW50Tm9kZSksbC5yZW1vdmVDaGlsZCh0KSx7Y29udGFpbmVyRWxlbWVudDp0LHBhcmVudEVsZW1lbnQ6bCx0ZXh0RWxlbWVudDpwfTtsPWguY3JlYXRlKCJ0ZXh0Iix0aGlzLmNsYXNzTmFtZSk7cmV0dXJue2NvbnRhaW5lckVsZW1lbnQ6bCxwYXJlbnRFbGVtZW50OnQsdGV4dEVsZW1lbnQ6bH19O3JldHVybiBrfSgpO2YuU3ZnQ29udGV4dD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9CnRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMjEpLGw9aCgzNik7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZhciBxPXAuY2FsbCh0aGlzLG4pfHx0aGlzO3EuZGltQ2FjaGU9bmV3IHQuQ2FjaGUoZnVuY3Rpb24odSl7cmV0dXJuIHEuX21lYXN1cmVOb3RGcm9tQ2FjaGUodSl9KTtyZXR1cm4gcX1rKG0scCk7bS5wcm90b3R5cGUuX21lYXN1cmVOb3RGcm9tQ2FjaGU9ZnVuY3Rpb24obil7cmV0dXJuIHAucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLG4pfTttLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPWwuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCk7CnJldHVybiB0aGlzLmRpbUNhY2hlLmdldChuKX07bS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmRpbUNhY2hlLmNsZWFyKCk7cC5wcm90b3R5cGUucmVzZXQuY2FsbCh0aGlzKX07cmV0dXJuIG19KGgoNjApLkNhY2hlQ2hhcmFjdGVyTWVhc3VyZXIpO2YuQ2FjaGVNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCg1OSksdD1oKDYyKSxsPWgoNjQpLHA9aCg2Nik7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG0obil7dGhpcy5jb250ZXh0PW47dGhpcy5tZWFzdXJlcj1uZXcgdC5DYWNoZU1lYXN1cmVyKHRoaXMuY29udGV4dCk7dGhpcy53cmFwcGVyPW5ldyBsLldyYXBwZXI7dGhpcy53cml0ZXI9bmV3IHAuV3JpdGVyKHRoaXMubWVhc3VyZXIsdGhpcy5jb250ZXh0LHRoaXMud3JhcHBlcil9bS5zdmc9ZnVuY3Rpb24obixxLHUpe3JldHVybiBuZXcgbShuZXcgay5TdmdDb250ZXh0KG4scSx1KSl9O20uY2FudmFzPWZ1bmN0aW9uKG4scSx1KXtyZXR1cm4gbmV3IG0obmV3IGsuQ2FudmFzQ29udGV4dChuLApxLHUpKX07bS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24obixxLHUseCxBKXt0aGlzLndyaXRlci53cml0ZShuLHEsdSx4LEEpfTttLnByb3RvdHlwZS5jbGVhck1lYXN1cmVyQ2FjaGU9ZnVuY3Rpb24oKXt0aGlzLm1lYXN1cmVyLnJlc2V0KCl9O3JldHVybiBtfSgpO2YuVHlwZXNldHRlcj1kfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGspe3RoaXMuY2FjaGU9e307dGhpcy5jb21wdXRlPWt9aC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGspe3RoaXMuY2FjaGUuaGFzT3duUHJvcGVydHkoayl8fCh0aGlzLmNhY2hlW2tdPXRoaXMuY29tcHV0ZShrKSk7cmV0dXJuIHRoaXMuY2FjaGVba119O2gucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5jYWNoZT17fTtyZXR1cm4gdGhpc307cmV0dXJuIGh9KCk7Zi5DYWNoZT1kfSxmdW5jdGlvbihkLGYpe2YuTWV0aG9kcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5hcnJheUVxPWZ1bmN0aW9uKGssdCl7aWYobnVsbD09Cmt8fG51bGw9PXQpcmV0dXJuIGs9PT10O2lmKGsubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBsPTA7bDxrLmxlbmd0aDtsKyspaWYoa1tsXSE9PXRbbF0pcmV0dXJuITE7cmV0dXJuITB9O2gub2JqRXE9ZnVuY3Rpb24oayx0KXtpZihudWxsPT1rfHxudWxsPT10KXJldHVybiBrPT09dDt2YXIgbD1PYmplY3Qua2V5cyhrKS5zb3J0KCkscD1PYmplY3Qua2V5cyh0KS5zb3J0KCksbT1sLm1hcChmdW5jdGlvbihxKXtyZXR1cm4ga1txXX0pLG49cC5tYXAoZnVuY3Rpb24ocSl7cmV0dXJuIHRbcV19KTtyZXR1cm4gaC5hcnJheUVxKGwscCkmJmguYXJyYXlFcShtLG4pfTtoLnN0cmljdEVxPWZ1bmN0aW9uKGssdCl7cmV0dXJuIGs9PT10fTtoLmRlZmF1bHRzPWZ1bmN0aW9uKGspe2Zvcih2YXIgdD1bXSxsPTE7bDxhcmd1bWVudHMubGVuZ3RoO2wrKyl0W2wtMV09YXJndW1lbnRzW2xdO2lmKG51bGw9PWspdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7CnZhciBwPU9iamVjdChrKTt0LmZvckVhY2goZnVuY3Rpb24obSl7aWYobnVsbCE9bSlmb3IodmFyIG4gaW4gbSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxuKSYmKHBbbl09bVtuXSl9KTtyZXR1cm4gcH07cmV0dXJuIGh9KCl9LGZ1bmN0aW9uKGQsZil7Zi5TdHJpbmdNZXRob2RzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe31oLmNvbWJpbmVXaGl0ZXNwYWNlPWZ1bmN0aW9uKGspe3JldHVybiBrLnJlcGxhY2UoL1sgXHRdKy9nLCIgIil9O2guaXNOb3RFbXB0eVN0cmluZz1mdW5jdGlvbihrKXtyZXR1cm4gayYmIiIhPT1rLnRyaW0oKX07aC50cmltU3RhcnQ9ZnVuY3Rpb24oayx0KXtpZighaylyZXR1cm4gaztrPWsuc3BsaXQoIiIpO3ZhciBsPXQ/ZnVuY3Rpb24ocCl7cmV0dXJuIHAuc3BsaXQodCkuc29tZShoLmlzTm90RW1wdHlTdHJpbmcpfTpoLmlzTm90RW1wdHlTdHJpbmc7cmV0dXJuIGsucmVkdWNlKGZ1bmN0aW9uKHAsbSl7cmV0dXJuIGwocCttKT8KcCttOnB9LCIiKX07aC50cmltRW5kPWZ1bmN0aW9uKGssdCl7aWYoIWspcmV0dXJuIGs7az1rLnNwbGl0KCIiKTtrLnJldmVyc2UoKTtrPWgudHJpbVN0YXJ0KGsuam9pbigiIiksdCkuc3BsaXQoIiIpO2sucmV2ZXJzZSgpO3JldHVybiBrLmpvaW4oIiIpfTtyZXR1cm4gaH0oKX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe3RoaXMuV29yZERpdmlkZXJSZWdFeHA9L1xXLzt0aGlzLldoaXRlc3BhY2VSZWdFeHA9L1xzL31oLnByb3RvdHlwZS50b2tlbml6ZT1mdW5jdGlvbihrKXt2YXIgdD10aGlzO3JldHVybiBrLnNwbGl0KCIiKS5yZWR1Y2UoZnVuY3Rpb24obCxwKXtyZXR1cm4gbC5zbGljZSgwLC0xKS5jb25jYXQodC5zaG91bGRDcmVhdGVOZXdUb2tlbihsW2wubGVuZ3RoLTFdLHApKX0sWyIiXSl9O2gucHJvdG90eXBlLnNob3VsZENyZWF0ZU5ld1Rva2VuPWZ1bmN0aW9uKGssdCl7aWYoIWspcmV0dXJuW3RdO3ZhciBsPWtbay5sZW5ndGgtMV07cmV0dXJuIHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGwpJiYKdGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QodCk/W2srdF06dGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QobCl8fHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KHQpP1trLHRdOnRoaXMuV29yZERpdmlkZXJSZWdFeHAudGVzdChsKXx8dGhpcy5Xb3JkRGl2aWRlclJlZ0V4cC50ZXN0KHQpP2w9PT10P1trK3RdOltrLHRdOltrK3RdfTtyZXR1cm4gaH0oKTtmLlRva2VuaXplcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKGwsdCk7bC5wcm90b3R5cGUud3JhcD0KZnVuY3Rpb24ocCxtLG4scSl7ZnVuY3Rpb24gdShEKXtyZXR1cm4gdC5wcm90b3R5cGUud3JhcC5jYWxsKHgscCxtLEQscSl9dmFyIHg9dGhpczt2b2lkIDA9PT1xJiYocT1JbmZpbml0eSk7aWYoMTxwLnNwbGl0KCJcbiIpLmxlbmd0aCl0aHJvdyBFcnJvcigiU2luZ2xlTGluZVdyYXBwZXIgaXMgZGVzaWduZWQgdG8gd29yayBvbmx5IG9uIHNpbmdsZSBsaW5lIik7dmFyIEE9dShuKTtpZigyPkEubm9MaW5lcylyZXR1cm4gQTtmb3IodmFyIHk9MCx3PTA7dzxsLk5PX1dSQVBfSVRFUkFUSU9OUyYmbj55Oysrdyl7dmFyIEM9KG4reSkvMixHPXUoQyk7dGhpcy5hcmVTYW1lUmVzdWx0cyhBLEcpPyhuPUMsQT1HKTp5PUN9cmV0dXJuIEF9O2wucHJvdG90eXBlLmFyZVNhbWVSZXN1bHRzPWZ1bmN0aW9uKHAsbSl7cmV0dXJuIHAubm9MaW5lcz09PW0ubm9MaW5lcyYmcC50cnVuY2F0ZWRUZXh0PT09bS50cnVuY2F0ZWRUZXh0fTtyZXR1cm4gbH0oaCg2NSkuV3JhcHBlcik7ZC5OT19XUkFQX0lURVJBVElPTlM9CjU7Zi5TaW5nbGVMaW5lV3JhcHBlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgyMSksdD17dGV4dFJvdGF0aW9uOjAsdGV4dFNoZWFyOjAseEFsaWduOiJsZWZ0Iix5QWxpZ246InRvcCJ9O2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKHAsbSxuKXt0aGlzLl9tZWFzdXJlcj1wO3RoaXMuX3BlbkZhY3Rvcnk9bTt0aGlzLl93cmFwcGVyPW59bC5wcm90b3R5cGUubWVhc3VyZXI9ZnVuY3Rpb24ocCl7dGhpcy5fbWVhc3VyZXI9cDtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUud3JhcHBlcj1mdW5jdGlvbihwKXt0aGlzLl93cmFwcGVyPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnBlbkZhY3Rvcnk9ZnVuY3Rpb24ocCl7dGhpcy5fcGVuRmFjdG9yeT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihwLG0sbixxLHUpe3ZvaWQgMD09PXEmJihxPXt9KTtxPWsuTWV0aG9kcy5kZWZhdWx0cyh7fSx0LHEpO2lmKC0xPT09bC5TdXBwb3J0ZWRSb3RhdGlvbi5pbmRleE9mKHEudGV4dFJvdGF0aW9uKSl0aHJvdyBFcnJvcigidW5zdXBwb3J0ZWQgcm90YXRpb24gLSAiKwpxLnRleHRSb3RhdGlvbisiLiBTdXBwb3J0ZWQgcm90YXRpb25zIGFyZSAiK2wuU3VwcG9ydGVkUm90YXRpb24uam9pbigiLCAiKSk7aWYobnVsbCE9cS50ZXh0U2hlYXImJi04MD5xLnRleHRTaGVhcnx8ODA8cS50ZXh0U2hlYXIpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHNoZWFyIGFuZ2xlIC0gIitxLnRleHRTaGVhcisiLiBNdXN0IGJlIGJldHdlZW4gLTgwIGFuZCA4MCIpO3ZhciB4PTQ1PE1hdGguYWJzKE1hdGguYWJzKHEudGV4dFJvdGF0aW9uKS05MCksQT14P206bix5PXg/bjptLHc9cS50ZXh0U2hlYXIsQz13Kk1hdGguUEkvMTgwO3g9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDt2YXIgRz14Kk1hdGgudGFuKEMpO0E9QS9NYXRoLmNvcyhDKS1NYXRoLmFicyhHKTt2YXIgRD15Kk1hdGguY29zKEMpO3k9ay5TdHJpbmdNZXRob2RzLmNvbWJpbmVXaGl0ZXNwYWNlKHApO3k9KHRoaXMuX3dyYXBwZXI/dGhpcy5fd3JhcHBlci53cmFwKHksdGhpcy5fbWVhc3VyZXIsCkEsRCkud3JhcHBlZFRleHQ6eSkuc3BsaXQoIlxuIik7Qz1sLlhPZmZzZXRGYWN0b3JbcS54QWxpZ25dKkEqTWF0aC5zaW4oQyktbC5ZT2Zmc2V0RmFjdG9yW3EueUFsaWduXSooRC15Lmxlbmd0aCp4KTt3PXEudGV4dFJvdGF0aW9uK3c7c3dpdGNoKHEudGV4dFJvdGF0aW9uKXtjYXNlIDkwOm09W20rQywwXTticmVhaztjYXNlIC05MDptPVstQyxuXTticmVhaztjYXNlIDE4MDptPVttLG4rQ107YnJlYWs7ZGVmYXVsdDptPVswLC1DXX1wPXRoaXMuX3BlbkZhY3RvcnkuY3JlYXRlUGVuKHAse3RyYW5zbGF0ZTptLHJvdGF0ZTp3fSx1KTt0aGlzLndyaXRlTGluZXMoeSxwLEEseCxHLHEueEFsaWduKTtudWxsIT1wLmRlc3Ryb3kmJnAuZGVzdHJveSgpfTtsLnByb3RvdHlwZS53cml0ZUxpbmVzPWZ1bmN0aW9uKHAsbSxuLHEsdSx4KXtwLmZvckVhY2goZnVuY3Rpb24oQSx5KXttLndyaXRlKEEsbC5BbmNob3JDb252ZXJ0ZXJbeF0sKDA8dT8oeSsxKSp1OnkqdSkrbipsLlhPZmZzZXRGYWN0b3JbeF0sCih5KzEpKnEpfSl9O3JldHVybiBsfSgpO2QuU3VwcG9ydGVkUm90YXRpb249Wy05MCwwLDE4MCw5MF07ZC5BbmNob3JDb252ZXJ0ZXI9e2NlbnRlcjoibWlkZGxlIixsZWZ0OiJzdGFydCIscmlnaHQ6ImVuZCJ9O2QuWE9mZnNldEZhY3Rvcj17Y2VudGVyOi41LGxlZnQ6MCxyaWdodDoxfTtkLllPZmZzZXRGYWN0b3I9e2JvdHRvbToxLGNlbnRlcjouNSx0b3A6MH07Zi5Xcml0ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9aCg2OSk7ZD1oKDcpO2YuQW5pbWF0b3JzPWQ7ZD1oKDY3KTtmLkF4ZXM9ZDtkPWgoMzcpO2YuQ29tcG9uZW50cz1kO2Q9aCgyMyk7Zi5Db25maWdzPWQ7ZD1oKDgpO2YuRm9ybWF0dGVycz1kO2Q9aCgzMCk7Zi5SZW5kZXJDb250cm9sbGVyPWQ7ZD1oKDM5KTtmLlJlbmRlclBvbGljaWVzPWQ7ZD1oKDMxKTtmLlN5bWJvbEZhY3Rvcmllcz1kO2Q9aCgxMyk7Zi5EaXNwYXRjaGVycz0KZDtkPWgoMTQpO2YuRHJhd2Vycz1kO2Q9aCgyNSk7Zi5JbnRlcmFjdGlvbnM9ZDtkPWgoMTkpO2YuUGxvdHM9ZDtkPWgoMyk7Zi5TY2FsZXM9ZDtkPWgoMCk7Zi5VdGlscz1kO2soaCgyMikpO2Q9aCgyOCk7Zi5UaW1lSW50ZXJ2YWw9ZC5UaW1lSW50ZXJ2YWw7ayhoKDQpKTtrKGgoMjkpKTtrKGgoMzgpKTtkPWgoNjgpO2YudmVyc2lvbj1kLnZlcnNpb247ayhoKDI0KSk7ayhoKDYpKTtrKGgoMTUpKTtrKGgoNDApKTtrKGgoMTYpKTtrKGgoMikpO2soaCgxMSkpO2soaCgxNykpfV0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy9wbG90dGFibGUtaW50ZXJhY3Rpb25zLmpzCnZhciByZzsKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobSl7Y29uc3Qgbj1bXTtmb3IoO20mJm0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudDspaWYobi5wdXNoKG0pLG0uYXNzaWduZWRTbG90KW09bS5hc3NpZ25lZFNsb3Q7ZWxzZSBpZihtLnBhcmVudEVsZW1lbnQpbT1tLnBhcmVudEVsZW1lbnQ7ZWxzZXtjb25zdCBxPW0ucGFyZW50Tm9kZTttPXEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P3EuaG9zdDpxIT09bT9xOm51bGx9cmV0dXJuIG59ZnVuY3Rpb24gZihtKXt2YXIgbj1kKG0pO209aDtsZXQgcT1udWxsO2Zvcihjb25zdCB4IG9mIG4pe249UGxvdHRhYmxlLlV0aWxzLkRPTS5nZXRFbGVtZW50VHJhbnNmb3JtKHgpO2lmKG51bGwhPW4pe3ZhciB1PXguY2xpZW50V2lkdGgvMjtjb25zdCBBPXguY2xpZW50SGVpZ2h0LzI7bT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFt1LEFdKTttPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5TWF0cml4KG0sUGxvdHRhYmxlLlV0aWxzLk1hdGguaW52ZXJ0TWF0cml4KG4pKTsKbT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFstdSwtQV0pfW49eC5zY3JvbGxMZWZ0O3U9eC5zY3JvbGxUb3A7aWYobnVsbD09PXF8fHg9PT1xKW4tPXgub2Zmc2V0TGVmdCt4LmNsaWVudExlZnQsdS09eC5vZmZzZXRUb3AreC5jbGllbnRUb3AscT14Lm9mZnNldFBhcmVudDttPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKG0sW24sdV0pfXJldHVybiBtfWNvbnN0IGg9WzEsMCwwLDEsMCwwXTtjbGFzcyBrIGV4dGVuZHMgUGxvdHRhYmxlLlV0aWxzLlRyYW5zbGF0b3J7Y29tcHV0ZVBvc2l0aW9uKG0sbil7bT17eDptLHk6bn07bj1mKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09bj9tOlBsb3R0YWJsZS5VdGlscy5NYXRoLmFwcGx5VHJhbnNmb3JtKG4sbSl9fWNsYXNzIHQgZXh0ZW5kcyBQbG90dGFibGUuRGlzcGF0Y2hlcnMuTW91c2V7Y29uc3RydWN0b3IobSl7c3VwZXIobSk7dGhpcy5fZXZlbnRUYXJnZXQ9bS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7CnRoaXMuX3RyYW5zbGF0b3I9bmV3IGsobS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKG0pe2NvbnN0IG49bS5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgcT1uW3QuX0RJU1BBVENIRVJfS0VZXTtxfHwocT1uZXcgdChtKSxuW3QuX0RJU1BBVENIRVJfS0VZXT1xKTtyZXR1cm4gcX19Y2xhc3MgbCBleHRlbmRzIFBsb3R0YWJsZS5EaXNwYXRjaGVycy5Ub3VjaHtjb25zdHJ1Y3RvcihtKXtzdXBlcihtKTt0aGlzLl9ldmVudFRhcmdldD1tLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt0aGlzLl90cmFuc2xhdG9yPW5ldyBrKG0ucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKX1zdGF0aWMgZ2V0RGlzcGF0Y2hlcihtKXtjb25zdCBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCk7bGV0IHE9bltsLl9ESVNQQVRDSEVSX0tFWV07cXx8KHE9bmV3IGwobSksbltsLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9fVBsb3R0YWJsZS5JbnRlcmFjdGlvbi5wcm90b3R5cGUuX2lzSW5zaWRlQ29tcG9uZW50PQpmdW5jdGlvbihtKXtyZXR1cm4gMDw9bS54JiYwPD1tLnkmJm0ueDx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJm0ueTx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtjbGFzcyBwIGV4dGVuZHMgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5Qb2ludGVye19hbmNob3IoKXt0aGlzLl9pc0FuY2hvcmVkPSEwO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj10LmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX19Yi5Qb2ludGVySW50ZXJhY3Rpb249cH0pKHJnfHwocmc9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1jaGFydC1oZWxwZXJzL3Z6LWNoYXJ0LWhlbHBlcnMuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoKXtsZXQgdD1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7dC50aWNrR2VuZXJhdG9yKCk7bGV0IGw9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModCwiYm90dG9tIik7bC5mb3JtYXR0ZXIoYi5zdGVwRm9ybWF0dGVyKTtyZXR1cm57c2NhbGU6dCxheGlzOmwsYWNjZXNzb3I6cD0+cC5zdGVwfX1mdW5jdGlvbiBmKCl7bGV0IHQ9bmV3IFBsb3R0YWJsZS5TY2FsZXMuVGltZTtyZXR1cm57c2NhbGU6dCxheGlzOm5ldyBQbG90dGFibGUuQXhlcy5UaW1lKHQsImJvdHRvbSIpLGFjY2Vzc29yOmw9Pmwud2FsbF90aW1lfX1mdW5jdGlvbiBoKCl7bGV0IHQ9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTp0LGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModCwiYm90dG9tIiksYWNjZXNzb3I6Yi5yZWxhdGl2ZUFjY2Vzc29yfX1iLlNZTUJPTFNfTElTVD1be2NoYXJhY3RlcjoiXHUyNWZjIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5zcXVhcmV9LAp7Y2hhcmFjdGVyOiJcdTI1YzYiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLmRpYW1vbmR9LHtjaGFyYWN0ZXI6Ilx1MjViMiIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMudHJpYW5nbGV9LHtjaGFyYWN0ZXI6Ilx1MjYwNSIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuc3Rhcn0se2NoYXJhY3RlcjoiXHUyNzFhIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5jcm9zc31dO2xldCBrOyhmdW5jdGlvbih0KXt0LlNURVA9InN0ZXAiO3QuUkVMQVRJVkU9InJlbGF0aXZlIjt0LldBTExfVElNRT0id2FsbF90aW1lIn0pKGs9Yi5YVHlwZXx8KGIuWFR5cGU9e30pKTtiLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OPTQ7Yi5TVEVQX0ZPUk1BVFRFUl9QUkVDSVNJT049NDtiLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OPTM7Yi5UT09MVElQX1lfUElYRUxfT0ZGU0VUPTIwO2IuVE9PTFRJUF9DSVJDTEVfU0laRT00O2IuTkFOX1NZTUJPTF9TSVpFPQo2O2IubXVsdGlzY2FsZUZvcm1hdHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbD0+e2xldCBwPU1hdGguYWJzKGwpOzFFLTE1PnAmJihwPTApO3JldHVybigxRTQ8PXA/ZDMuZm9ybWF0KCIuIit0KyJ+ZSIpOjA8cCYmLjAxPnA/ZDMuZm9ybWF0KCIuIit0KyJ+ZSIpOmQzLmZvcm1hdCgiLiIrdCsifmciKSkobCl9fTtiLmNvbXB1dGVEb21haW49ZnVuY3Rpb24odCxsKXt0PXQuZmlsdGVyKG49PmlzRmluaXRlKG4pKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuWy0uMSwxLjFdO2w/KHQ9Xy5zb3J0QnkodCksbD1kMy5xdWFudGlsZSh0LC4wNSksdD1kMy5xdWFudGlsZSh0LC45NSkpOihsPWQzLm1pbih0KSx0PWQzLm1heCh0KSk7bGV0IHAsbT10LWw7cD0wPT09bT8xLjEqTWF0aC5hYnMobCkrMS4xOi4yKm07bD1bMDw9bCYmbDxtPy0uMSp0OmwtcCx0K3BdO3JldHVybiBsPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGwpLm5pY2UoKS5kb21haW4oKX07Yi5hY2Nlc3Nvcml6ZT1mdW5jdGlvbih0KXtyZXR1cm4gbD0+CmxbdF19O2Iuc3RlcEZvcm1hdHRlcj1kMy5mb3JtYXQoYC4ke2IuU1RFUF9GT1JNQVRURVJfUFJFQ0lTSU9OfX5zYCk7Yi5zdGVwWD1kO2IudGltZUZvcm1hdHRlcj1QbG90dGFibGUuRm9ybWF0dGVycy50aW1lKCIlYSAlYiAlZSwgJUg6JU06JVMiKTtiLndhbGxYPWY7Yi5yZWxhdGl2ZUFjY2Vzc29yPSh0LGwscCk9PntpZihudWxsIT10LnJlbGF0aXZlKXJldHVybiB0LnJlbGF0aXZlO2w9cC5kYXRhKCk7cmV0dXJuKCt0LndhbGxfdGltZS0oMDxsLmxlbmd0aD8rbFswXS53YWxsX3RpbWU6MCkpLzM2RTV9O2IucmVsYXRpdmVGb3JtYXR0ZXI9dD0+e2xldCBsPSIiLHA9TWF0aC5mbG9vcih0LzI0KTt0LT0yNCpwO3AmJihsKz1wKyJkICIpO2xldCBtPU1hdGguZmxvb3IodCk7dD02MCoodC1tKTtpZihtfHxwKWwrPW0rImggIjtsZXQgbj1NYXRoLmZsb29yKHQpO3Q9NjAqKHQtbik7aWYobnx8bXx8cClsKz1uKyJtICI7cmV0dXJuIGwrTWF0aC5mbG9vcih0KSsicyJ9O2IucmVsYXRpdmVYPQpoO2IuZ2V0WENvbXBvbmVudHM9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2Ugay5TVEVQOnJldHVybiBkKCk7Y2FzZSBrLldBTExfVElNRTpyZXR1cm4gZigpO2Nhc2Ugay5SRUxBVElWRTpyZXR1cm4gaCgpO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImludmFsaWQgeFR5cGU6ICIrdCk7fX19KShyZ3x8KHJnPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy92ei1jaGFydC10b29sdGlwLmpzCnZhciBFaDsKKGZ1bmN0aW9uKGIpe2xldCBkOyhmdW5jdGlvbihoKXtoLkFVVE89ImF1dG8iO2guQk9UVE9NPSJib3R0b20iO2guUklHSFQ9InJpZ2h0In0pKGQ9Yi5Ub29sdGlwUG9zaXRpb258fChiLlRvb2x0aXBQb3NpdGlvbj17fSkpO2NvbnN0IGY9e2JveFNoYWRvdzoiMCAxcHggNHB4IHJnYmEoMCwgMCwgMCwgLjMpIixvcGFjaXR5OjAscG9zaXRpb246ImZpeGVkIix3aWxsQ2hhbmdlOiJ0cmFuc2Zvcm0iLHpJbmRleDo1fTtQb2x5bWVyKHtpczoidnotY2hhcnQtdG9vbHRpcCIsX3RlbXBsYXRlOm51bGwscHJvcGVydGllczp7Y29udGVudENvbXBvbmVudE5hbWU6U3RyaW5nLHBvc2l0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZTpkLkFVVE99LG1pbkRpc3RGcm9tRWRnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTV9fSxyZWFkeSgpe3RoaXMuX3R1bm5lbD10aGlzLl9yYWY9dGhpcy5fc3R5bGVDYWNoZT1udWxsfSxhdHRhY2hlZCgpe3RoaXMuX3R1bm5lbD10aGlzLl9jcmVhdGVUdW5uZWwoKTt0aGlzLl9oaWRlT25CbHVyPQooKT0+e2RvY3VtZW50LmhpZGRlbiYmdGhpcy5oaWRlKCl9O3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9oaWRlT25CbHVyKX0sZGV0YWNoZWQoKXt0aGlzLmhpZGUoKTt0aGlzLl9yZW1vdmVUdW5uZWwodGhpcy5fdHVubmVsKTt0aGlzLl90dW5uZWw9bnVsbDt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdGhpcy5faGlkZU9uQmx1cil9LGNvbnRlbnQoKXtyZXR1cm4gdGhpcy5fdHVubmVsLnNoYWRvd1Jvb3R9LGhpZGUoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmKTt0aGlzLl9zdHlsZUNhY2hlPW51bGw7dGhpcy5fdHVubmVsLnN0eWxlLm9wYWNpdHk9MH0sdXBkYXRlQW5kUG9zaXRpb24oaCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JhZik7dGhpcy5fcmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX3JlcG9zaXRpb25JbXBsKGgpfSl9LApfcmVwb3NpdGlvbkltcGwoaCl7Y29uc3Qgaz10aGlzLl90dW5uZWw7aD1oLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IHQ9ay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxsPXdpbmRvdy5pbm5lckhlaWdodCxwPWRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsbT1oLnRvcCxuPW0raC5oZWlnaHQscT10LmhlaWdodCtyZy5UT09MVElQX1lfUElYRUxfT0ZGU0VUO2xldCB1PW51bGwseD1NYXRoLm1heCh0aGlzLm1pbkRpc3RGcm9tRWRnZSxoLmxlZnQpLEE9bnVsbCx5PW07dGhpcy5wb3NpdGlvbj09ZC5SSUdIVD94PWgucmlnaHQ6KHk9bityZy5UT09MVElQX1lfUElYRUxfT0ZGU0VULHA8eCt0LndpZHRoK3RoaXMubWluRGlzdEZyb21FZGdlJiYoeD1udWxsLEE9dGhpcy5taW5EaXN0RnJvbUVkZ2UpKTt0aGlzLnBvc2l0aW9uPT1kLkFVVE8mJjA8aC50b3AtcSYmbDxoLnRvcCtoLmhlaWdodCtxJiYoeT1udWxsLHU9bC1tK3JnLlRPT0xUSVBfWV9QSVhFTF9PRkZTRVQpO2g9e29wYWNpdHk6MSwKbGVmdDp4P2Ake3h9cHhgOm51bGwscmlnaHQ6QT9gJHtBfXB4YDpudWxsLHRvcDp5P2Ake3l9cHhgOm51bGwsYm90dG9tOnU/YCR7dX1weGA6bnVsbH07Xy5pc0VxdWFsKHRoaXMuX3N0eWxlQ2FjaGUsaCl8fChPYmplY3QuYXNzaWduKGsuc3R5bGUsaCksdGhpcy5fc3R5bGVDYWNoZT1oKX0sX2NyZWF0ZVR1bm5lbCgpe2lmKCF0aGlzLmNvbnRlbnRDb21wb25lbnROYW1lKXRocm93IG5ldyBSYW5nZUVycm9yKCJSZXF1aXJlIGBjb250ZW50Q29tcG9uZW50TmFtZWAgdG8gYmUgYSBuYW1lIG9mIGEgUG9seW1lciBjb21wb25lbnQiKTtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSk7T2JqZWN0LmFzc2lnbihoLnN0eWxlLGYpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7cmV0dXJuIGh9LF9yZW1vdmVUdW5uZWwoaCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChoKX19KX0pKEVofHwoRWg9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0L2RyYWdab29tSW50ZXJhY3Rpb24uanMKdmFyIEZoOwooZnVuY3Rpb24oYil7Y2xhc3MgZCBleHRlbmRzIFBsb3R0YWJsZS5Db21wb25lbnRzLlNlbGVjdGlvbkJveExheWVye2NvbnN0cnVjdG9yKGYsaCxrKXtzdXBlcigpO3RoaXMuZWFzZUZuPWQzLmVhc2VDdWJpY0luT3V0O3RoaXMuX2FuaW1hdGlvblRpbWU9NzUwO3RoaXMueFNjYWxlKGYpO3RoaXMueVNjYWxlKGgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbj1uZXcgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5EcmFnO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb249bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuQ2xpY2s7dGhpcy5zZXR1cENhbGxiYWNrcygpO3RoaXMudW56b29tTWV0aG9kPWs7dGhpcy5vbkRldGFjaCgoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2hGcm9tKCl9KTt0aGlzLm9uQW5jaG9yKCgpPT57dGhpcy5fZG91YmxlQ2xpY2tJbnRlcmFjdGlvbi5hdHRhY2hUbyh0aGlzKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyl9KX1pbnRlcmFjdGlvblN0YXJ0KGYpe3RoaXMub25TdGFydD0KZn1pbnRlcmFjdGlvbkVuZChmKXt0aGlzLm9uRW5kPWZ9ZHJhZ0ludGVyYWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn1zZXR1cENhbGxiYWNrcygpe2xldCBmPSExO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydChoPT57dGhpcy5ib3VuZHMoe3RvcExlZnQ6aCxib3R0b21SaWdodDpofSk7dGhpcy5vblN0YXJ0KCl9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKChoLGspPT57dGhpcy5ib3VuZHMoe3RvcExlZnQ6aCxib3R0b21SaWdodDprfSk7dGhpcy5ib3hWaXNpYmxlKCEwKTtmPSEwfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZCgoaCxrKT0+e3RoaXMuYm94VmlzaWJsZSghMSk7dGhpcy5ib3VuZHMoe3RvcExlZnQ6aCxib3R0b21SaWdodDprfSk7aWYoZil0aGlzLnpvb20oKTtlbHNlIHRoaXMub25FbmQoKTtmPSExfSk7dGhpcy5fZG91YmxlQ2xpY2tJbnRlcmFjdGlvbi5vbkRvdWJsZUNsaWNrKHRoaXMudW56b29tLmJpbmQodGhpcykpfWFuaW1hdGlvblRpbWUoZil7aWYobnVsbD09CmYpcmV0dXJuIHRoaXMuX2FuaW1hdGlvblRpbWU7aWYoMD5mKXRocm93IEVycm9yKCJhbmltYXRpb25UaW1lIGNhbm5vdCBiZSBuZWdhdGl2ZSIpO3RoaXMuX2FuaW1hdGlvblRpbWU9ZjtyZXR1cm4gdGhpc31lYXNlKGYpe2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgZil0aHJvdyBFcnJvcigiZWFzZSBmdW5jdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24iKTswPT09ZigwKSYmMT09PWYoMSl8fFBsb3R0YWJsZS5VdGlscy5XaW5kb3cud2FybigiRWFzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IG1haW50YWluIGludmFyaWFudCBmKDApXHgzZFx4M2QwIFx4MjZceDI2IGYoMSlceDNkXHgzZDEuIEJhZCBiZWhhdmlvciBtYXkgcmVzdWx0LiIpO3RoaXMuZWFzZUZuPWY7cmV0dXJuIHRoaXN9em9vbSgpe2xldCBmPXRoaXMueEV4dGVudCgpWzBdLnZhbHVlT2YoKSxoPXRoaXMueEV4dGVudCgpWzFdLnZhbHVlT2YoKSxrPXRoaXMueUV4dGVudCgpWzFdLnZhbHVlT2YoKSx0PXRoaXMueUV4dGVudCgpWzBdLnZhbHVlT2YoKTsKZiE9PWgmJmshPT10JiZ0aGlzLmludGVycG9sYXRlWm9vbShmLGgsayx0KX11bnpvb20oKXt2YXIgZj10aGlzLnhTY2FsZSgpO2YuX2RvbWFpbk1pbj1udWxsO2YuX2RvbWFpbk1heD1udWxsO2Y9Zi5fZ2V0RXh0ZW50KCk7dGhpcy54U2NhbGUoKS5kb21haW4oZik7dGhpcy51bnpvb21NZXRob2QoKX1pc1pvb21pbmcoZil7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQoIWYpO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uZW5hYmxlZCghZil9aW50ZXJwb2xhdGVab29tKGYsaCxrLHQpe2xldCBsPXRoaXMueFNjYWxlKCkuZG9tYWluKClbMF0udmFsdWVPZigpLHA9dGhpcy54U2NhbGUoKS5kb21haW4oKVsxXS52YWx1ZU9mKCksbT10aGlzLnlTY2FsZSgpLmRvbWFpbigpWzBdLnZhbHVlT2YoKSxuPXRoaXMueVNjYWxlKCkuZG9tYWluKClbMV0udmFsdWVPZigpLHE9dGhpcy5lYXNlRm4sdT0oeSx3LEMpPT5kMy5pbnRlcnBvbGF0ZU51bWJlcih5LHcpKHEoQykpO3RoaXMuaXNab29taW5nKCEwKTsKbGV0IHg9RGF0ZS5ub3coKSxBPSgpPT57dmFyIHk9RGF0ZS5ub3coKS14O3k9MD09PXRoaXMuX2FuaW1hdGlvblRpbWU/MTpNYXRoLm1pbigxLHkvdGhpcy5fYW5pbWF0aW9uVGltZSk7bGV0IHc9dShsLGYseSksQz11KHAsaCx5KSxHPXUobSxrLHkpLEQ9dShuLHQseSk7dGhpcy54U2NhbGUoKS5kb21haW4oW3csQ10pO3RoaXMueVNjYWxlKCkuZG9tYWluKFtHLERdKTsxPnk/UGxvdHRhYmxlLlV0aWxzLkRPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbChBKToodGhpcy5vbkVuZCgpLHRoaXMuaXNab29taW5nKCExKSl9O0EoKX19Yi5EcmFnWm9vbUxheWVyPWR9KShGaHx8KEZoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvcGFuWm9vbURyYWdMYXllci5qcwp2YXIgR2g7CihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oaCl7aFtoLk5PTkU9MF09Ik5PTkUiO2hbaC5EUkFHX1pPT01JTkc9MV09IkRSQUdfWk9PTUlORyI7aFtoLlBBTk5JTkc9Ml09IlBBTk5JTkcifSkoZHx8KGQ9e30pKTtjbGFzcyBmIGV4dGVuZHMgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXB7Y29uc3RydWN0b3IoaCxrLHQpe3N1cGVyKCk7dGhpcy5zdGF0ZT1kLk5PTkU7dGhpcy5wYW5TdGFydENhbGxiYWNrPW5ldyBQbG90dGFibGUuVXRpbHMuQ2FsbGJhY2tTZXQ7dGhpcy5wYW5FbmRDYWxsYmFjaz1uZXcgUGxvdHRhYmxlLlV0aWxzLkNhbGxiYWNrU2V0O3RoaXMucGFuWm9vbT1uZXcgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5QYW5ab29tKGgsayk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm1vdXNlRmlsdGVyKHA9PmYuaXNQYW5LZXkocCkmJjA9PT1wLmJ1dHRvbik7dGhpcy5wYW5ab29tLndoZWVsRmlsdGVyKHRoaXMuY2FuU2Nyb2xsWm9vbSk7dGhpcy5kcmFnWm9vbUxheWVyPW5ldyBGaC5EcmFnWm9vbUxheWVyKGgsCmssdCk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm1vdXNlRmlsdGVyKHA9PiFmLmlzUGFuS2V5KHApJiYwPT09cC5idXR0b24pO3RoaXMuYXBwZW5kKHRoaXMuZHJhZ1pvb21MYXllcik7Y29uc3QgbD10aGlzLm9uV2hlZWwuYmluZCh0aGlzKTt0aGlzLm9uQW5jaG9yKCgpPT57dGhpcy5fbW91c2VEaXNwYXRjaGVyPVBsb3R0YWJsZS5EaXNwYXRjaGVycy5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKGwpO3RoaXMucGFuWm9vbS5hdHRhY2hUbyh0aGlzKX0pO3RoaXMub25EZXRhY2goKCk9Pnt0aGlzLnBhblpvb20uZGV0YWNoRnJvbSgpO3RoaXMuX21vdXNlRGlzcGF0Y2hlciYmKHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbChsKSx0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbCl9KTt0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCk9Pnt0aGlzLnN0YXRlPT1kLk5PTkUmJgp0aGlzLnNldFN0YXRlKGQuUEFOTklORyl9KTt0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnRW5kKCgpPT57dGhpcy5zdGF0ZT09ZC5QQU5OSU5HJiZ0aGlzLnNldFN0YXRlKGQuTk9ORSl9KTt0aGlzLmRyYWdab29tTGF5ZXIuZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCk9Pnt0aGlzLnN0YXRlPT1kLk5PTkUmJnRoaXMuc2V0U3RhdGUoZC5EUkFHX1pPT01JTkcpfSk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ0VuZCgoKT0+e3RoaXMuc3RhdGU9PWQuRFJBR19aT09NSU5HJiZ0aGlzLnNldFN0YXRlKGQuTk9ORSl9KX1vbldoZWVsKGgsayl7aWYoIXRoaXMuY2FuU2Nyb2xsWm9vbShrKSYmKGg9dGhpcy5lbGVtZW50KCksaC5zZWxlY3QoIi5oZWxwIikuZW1wdHkoKSkpe3ZhciB0PWguYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJoZWxwIiwhMCk7dC5hcHBlbmQoInNwYW4iKS50ZXh0KCJBbHQgKyBTY3JvbGwgdG8gWm9vbSIpOwp0Lm9uKCJhbmltYXRpb25lbmQiLCgpPT52b2lkIHQucmVtb3ZlKCkpfX1zdGF0aWMgaXNQYW5LZXkoaCl7cmV0dXJuISFoLmFsdEtleXx8ISFoLnNoaWZ0S2V5fWNhblNjcm9sbFpvb20oaCl7cmV0dXJuIGguYWx0S2V5fXNldFN0YXRlKGgpe2lmKHRoaXMuc3RhdGUhPWgpe3ZhciBrPXRoaXMuc3RhdGU7dGhpcy5zdGF0ZT1oO3RoaXMucm9vdCgpLnJlbW92ZUNsYXNzKHRoaXMuc3RhdGVDbGFzc05hbWUoaykpO3RoaXMucm9vdCgpLmFkZENsYXNzKHRoaXMuc3RhdGVDbGFzc05hbWUoaCkpO2s9PWQuUEFOTklORyYmdGhpcy5wYW5FbmRDYWxsYmFjay5jYWxsQ2FsbGJhY2tzKCk7aD09ZC5QQU5OSU5HJiZ0aGlzLnBhblN0YXJ0Q2FsbGJhY2suY2FsbENhbGxiYWNrcygpfX1zdGF0ZUNsYXNzTmFtZShoKXtzd2l0Y2goaCl7Y2FzZSBkLlBBTk5JTkc6cmV0dXJuInBhbm5pbmciO2Nhc2UgZC5EUkFHX1pPT01JTkc6cmV0dXJuImRyYWctem9vbWluZyI7ZGVmYXVsdDpyZXR1cm4iIn19b25QYW5TdGFydChoKXt0aGlzLnBhblN0YXJ0Q2FsbGJhY2suYWRkKGgpfW9uUGFuRW5kKGgpe3RoaXMucGFuRW5kQ2FsbGJhY2suYWRkKGgpfW9uU2Nyb2xsWm9vbShoKXt0aGlzLnBhblpvb20ub25ab29tRW5kKGgpfW9uRHJhZ1pvb21TdGFydChoKXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25TdGFydChoKX1vbkRyYWdab29tRW5kKGgpe3RoaXMuZHJhZ1pvb21MYXllci5pbnRlcmFjdGlvbkVuZChoKX19CmIuUGFuWm9vbURyYWdMYXllcj1mfSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3RmLXNjYWxlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgUGxvdHRhYmxlLlF1YW50aXRhdGl2ZVNjYWxle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTt0aGlzLl9pZ25vcmVPdXRsaWVyPSExfXNldFZhbHVlUHJvdmlkZXJGb3JEb21haW4oZil7dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj1mfWlnbm9yZU91dGxpZXIoZil7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZj8odGhpcy5faWdub3JlT3V0bGllcj1mLHRoaXMpOnRoaXMuX2lnbm9yZU91dGxpZXJ9X2dldEFsbEluY2x1ZGVkVmFsdWVzKCl7Y29uc3QgZj10aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluP3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4oKTpbXTtyZXR1cm4gdGhpcy5leHRlbnRPZlZhbHVlcyhmKX19Yi5UZlNjYWxlPWR9KShHaHx8KEdoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvbGluZWFyLXNjYWxlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXJ7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX2lnbm9yZU91dGxpZXI9ITE7dGhpcy5wYWRQcm9wb3J0aW9uKC4yKX1zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKGYpe3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW49Zn1fbmljZURvbWFpbihmLGgpe2NvbnN0IFtrLHRdPWYsbD10LWs7Zj0wPT09bD8xLjEqTWF0aC5hYnMoaykrMS4xOmwqdGhpcy5wYWRQcm9wb3J0aW9uKCk7cmV0dXJuIHN1cGVyLl9uaWNlRG9tYWluKFswPD1rJiZrPGw/LS4xKnQ6ay1mLHQrZl0saCl9X2dldFVuYm91bmRlZEV4dGVudChmKXtmPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKGYpO2xldCBoPXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09Zi5sZW5ndGgmJihmPVtQbG90dGFibGUuVXRpbHMuTWF0aC5taW4oZixoWzBdKSxQbG90dGFibGUuVXRpbHMuTWF0aC5tYXgoZixoWzFdKV0saD10aGlzLl9uaWNlRG9tYWluKGYpKTsKcmV0dXJuIGh9X2dldEFsbEluY2x1ZGVkVmFsdWVzKCl7Y29uc3QgZj10aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluP3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4oKTpbXTtyZXR1cm4gdGhpcy5leHRlbnRPZlZhbHVlcyhmKX1leHRlbnRPZlZhbHVlcyhmKXt2YXIgaD1mPWYuZmlsdGVyKGs9PlBsb3R0YWJsZS5VdGlscy5NYXRoLmlzVmFsaWROdW1iZXIoaykpO2lmKHRoaXMuaWdub3JlT3V0bGllcigpKXtoPWYuc29ydCgobCxwKT0+bC1wKTtjb25zdCBrPWQzLnF1YW50aWxlKGgsLjA1KSx0PWQzLnF1YW50aWxlKGgsLjk1KTtoPWYuZmlsdGVyKGw9Pmw+PWsmJmw8PXQpfWY9ZDMuZXh0ZW50KGgpO3JldHVybiBudWxsPT1mWzBdfHxudWxsPT1mWzFdP1tdOmZ9aWdub3JlT3V0bGllcihmKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBmPyh0aGlzLl9pZ25vcmVPdXRsaWVyPWYsdGhpcyk6dGhpcy5faWdub3JlT3V0bGllcn19Yi5MaW5lYXJTY2FsZT1kfSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xvZy1zY2FsZS5qcwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChrKXtyZXR1cm4gTWF0aC5sb2cxMChrKX1mdW5jdGlvbiBmKGspe3JldHVybiBNYXRoLnBvdygxMCxrKX1iLk1JTl9QT1NJVElWRV9WQUxVRT1NYXRoLnBvdygyLC0xMDc0KTtjbGFzcyBoIGV4dGVuZHMgYi5UZlNjYWxle2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9kM0xvZ1NjYWxlPWQzLnNjYWxlTG9nKCk7dGhpcy5wYWRQcm9wb3J0aW9uKC4yKX1zY2FsZShrKXtyZXR1cm4gMD49az9OYU46dGhpcy5fZDNMb2dTY2FsZShrKX1pbnZlcnQoayl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUuaW52ZXJ0KGspfXNjYWxlVHJhbnNmb3JtYXRpb24oayl7cmV0dXJuIHRoaXMuc2NhbGUoayl9aW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbihrKXtyZXR1cm4gdGhpcy5pbnZlcnQoayl9Z2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKXtyZXR1cm4gdGhpcy5kb21haW4oKX1fZ2V0RG9tYWluKCl7cmV0dXJuIHRoaXMuX3VudHJhbnNmb3JtZWREb21haW59X3NldERvbWFpbihrKXt0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluPQprO2NvbnN0IFt0LGxdPWs7c3VwZXIuX3NldERvbWFpbihbTWF0aC5tYXgoYi5NSU5fUE9TSVRJVkVfVkFMVUUsdCksbF0pfV9uaWNlRG9tYWluKGspe2NvbnN0IFt0LGxdPWs7az1NYXRoLm1heChkKGIuTUlOX1BPU0lUSVZFX1ZBTFVFKSxkKHQpKTtjb25zdCBwPWQobCk7dmFyIG09cC1rO209bT9tKnRoaXMucGFkUHJvcG9ydGlvbigpOjE7cmV0dXJuW2YoTWF0aC5tYXgoZChiLk1JTl9QT1NJVElWRV9WQUxVRSksay1tKSksZihwK20pXX1fZ2V0VW5ib3VuZGVkRXh0ZW50KGspe2s9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoayk7bGV0IHQ9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1rLmxlbmd0aCYmKGs9W1Bsb3R0YWJsZS5VdGlscy5NYXRoLm1pbihrLHRbMF0pLFBsb3R0YWJsZS5VdGlscy5NYXRoLm1heChrLHRbMV0pXSx0PXRoaXMuX25pY2VEb21haW4oaykpO3JldHVybiB0fV9nZXRBbGxJbmNsdWRlZFZhbHVlcygpe3JldHVybiBzdXBlci5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKS5tYXAoaz0+CjA8az9rOmIuTUlOX1BPU0lUSVZFX1ZBTFVFKX1fZGVmYXVsdEV4dGVudCgpe3JldHVyblsxLDEwXX1fYmFja2luZ1NjYWxlRG9tYWluKGspe2lmKG51bGw9PWspcmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNMb2dTY2FsZS5kb21haW4oayk7cmV0dXJuIHRoaXN9X2dldFJhbmdlKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUucmFuZ2UoKX1fc2V0UmFuZ2Uoayl7dGhpcy5fZDNMb2dTY2FsZS5yYW5nZShrKX1kZWZhdWx0VGlja3MoKXtyZXR1cm4gdGhpcy5fZDNMb2dTY2FsZS50aWNrcygpfXRpY2tzKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoKX1leHRlbnRPZlZhbHVlcyhrKXtsZXQgdD1rPWsuZmlsdGVyKGw9PlBsb3R0YWJsZS5VdGlscy5NYXRoLmlzVmFsaWROdW1iZXIobCkmJjA8bCk7aWYodGhpcy5pZ25vcmVPdXRsaWVyKCkpe2s9ay5tYXAoZCkuc29ydCgobSxuKT0+bS1uKTtjb25zdCBsPWQzLnF1YW50aWxlKGssLjA1KSxwPWQzLnF1YW50aWxlKGssCi45NSk7dD1rLmZpbHRlcihtPT5tPj1sJiZtPD1wKS5tYXAoZil9az1kMy5leHRlbnQodCk7cmV0dXJuIG51bGw9PWtbMF18fG51bGw9PWtbMV0/W106a319Yi5Mb2dTY2FsZT1ofSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xpbmUtY2hhcnQuanMKKGZ1bmN0aW9uKGIpe2xldCBkOyhmdW5jdGlvbihrKXtrW2suVEVYVD0wXT0iVEVYVCI7a1trLkRPTT0xXT0iRE9NIn0pKGR8fChkPXt9KSk7bGV0IGY7KGZ1bmN0aW9uKGspe2suTE9HPSJsb2ciO2suTElORUFSPSJsaW5lYXIifSkoZnx8KGY9e30pKTtjbGFzcyBoe2NvbnN0cnVjdG9yKGssdCxsLHAsbSxuLHEsdSx4LEEseSl7dGhpcy5zZXJpZXNOYW1lcz1bXTt0aGlzLm5hbWUyZGF0YXNldHM9e307dGhpcy5jb2xvclNjYWxlPXA7dGhpcy50b29sdGlwPW07dGhpcy5kYXRhc2V0cz1bXTt0aGlzLl9pZ25vcmVZT3V0bGllcnM9ITE7dGhpcy5sYXN0UG9pbnRzRGF0YXNldD1uZXcgUGxvdHRhYmxlLkRhdGFzZXQ7dGhpcy5uYW5EYXRhc2V0PW5ldyBQbG90dGFibGUuRGF0YXNldDt0aGlzLnlWYWx1ZUFjY2Vzc29yPXQ7dGhpcy5zeW1ib2xGdW5jdGlvbj1BO3RoaXMub25EYXRhc2V0Q2hhbmdlZD10aGlzLl9vbkRhdGFzZXRDaGFuZ2VkLmJpbmQodGhpcyk7dGhpcy5fZGVmYXVsdFhSYW5nZT0KdTt0aGlzLl9kZWZhdWx0WVJhbmdlPXg7dGhpcy50b29sdGlwQ29sdW1ucz1uO3RoaXMuYnVpbGRDaGFydChrLGwscSx5KX1idWlsZENoYXJ0KGssdCxsLHApe3RoaXMuZGVzdHJveSgpO2s9aygpO3RoaXMueEFjY2Vzc29yPWsuYWNjZXNzb3I7dGhpcy54U2NhbGU9ay5zY2FsZTt0aGlzLnhBeGlzPWsuYXhpczt0aGlzLnhBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDMpO3AmJnRoaXMueEF4aXMuZm9ybWF0dGVyKHApO3RoaXMueVNjYWxlPWguZ2V0WVNjYWxlRnJvbVR5cGUodCk7dGhpcy55U2NhbGUuc2V0VmFsdWVQcm92aWRlckZvckRvbWFpbigoKT0+dGhpcy5nZXRWYWx1ZXNGb3JZQXhpc0RvbWFpbkNvbXB1dGUoKSk7dGhpcy55QXhpcz1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyh0aGlzLnlTY2FsZSwibGVmdCIpO3A9cmcubXVsdGlzY2FsZUZvcm1hdHRlcihyZy5ZX0FYSVNfRk9STUFUVEVSX1BSRUNJU0lPTik7dGhpcy55QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZyg1KS5mb3JtYXR0ZXIocCk7CnRoaXMueUF4aXMudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24oKTt0aGlzLmZpbGxBcmVhPWw7cD1uZXcgYi5QYW5ab29tRHJhZ0xheWVyKHRoaXMueFNjYWxlLHRoaXMueVNjYWxlLCgpPT50aGlzLnJlc2V0RG9tYWluKCkpO3RoaXMudG9vbHRpcEludGVyYWN0aW9uPXRoaXMuY3JlYXRlVG9vbHRpcEludGVyYWN0aW9uKHApO3RoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudD1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudDtsPXRoaXMuYnVpbGRQbG90KHRoaXMueFNjYWxlLHRoaXMueVNjYWxlLGwpO3RoaXMuZ3JpZGxpbmVzPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HcmlkbGluZXModGhpcy54U2NhbGUsdGhpcy55U2NhbGUpO2s9bnVsbDt0IT09Zi5MT0cmJihrPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigiaG9yaXpvbnRhbCIpLGsuc2NhbGUodGhpcy55U2NhbGUpLnZhbHVlKDApKTt0PW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigidmVydGljYWwiKTsKdC5zY2FsZSh0aGlzLnhTY2FsZSkudmFsdWUoMCk7dGhpcy5jZW50ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKFt0aGlzLmdyaWRsaW5lcyxrLHQsbCx0aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQscF0pO3RoaXMuY2VudGVyLmFkZENsYXNzKCJtYWluIik7dGhpcy5vdXRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdChrLHQsbCl7bCYmKHRoaXMubWFyZ2luQXJlYVBsb3Q9bmV3IFBsb3R0YWJsZS5QbG90cy5BcmVhLHRoaXMubWFyZ2luQXJlYVBsb3QueCh0aGlzLnhBY2Nlc3NvcixrKSx0aGlzLm1hcmdpbkFyZWFQbG90LnkobC5oaWdoZXJBY2Nlc3Nvcix0KSx0aGlzLm1hcmdpbkFyZWFQbG90LnkwKGwubG93ZXJBY2Nlc3NvciksdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJmaWxsIiwocSx1LHgpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoeC5tZXRhZGF0YSgpLm5hbWUpKSwKdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoInN0cm9rZS13aWR0aCIsMCkpO3RoaXMuc21vb3RoZWRBY2Nlc3Nvcj1xPT5xLnNtb290aGVkO2w9bmV3IFBsb3R0YWJsZS5QbG90cy5MaW5lO2wueCh0aGlzLnhBY2Nlc3NvcixrKTtsLnkodGhpcy55VmFsdWVBY2Nlc3Nvcix0KTtsLmF0dHIoInN0cm9rZSIsKHEsdSx4KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHgubWV0YWRhdGEoKS5uYW1lKSk7dGhpcy5saW5lUGxvdD1sO3RoaXMuc2V0dXBUb29sdGlwcyhsKTtsZXQgcD1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7cC54KHRoaXMueEFjY2Vzc29yLGspO3AueSh0aGlzLnNtb290aGVkQWNjZXNzb3IsdCk7cC5hdHRyKCJzdHJva2UiLChxLHUseCk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh4Lm1ldGFkYXRhKCkubmFtZSkpO3RoaXMuc21vb3RoTGluZVBsb3Q9cDtpZih0aGlzLnN5bWJvbEZ1bmN0aW9uKXt2YXIgbT0KbmV3IFBsb3R0YWJsZS5QbG90cy5TY2F0dGVyO20ueCh0aGlzLnhBY2Nlc3NvcixrKTttLnkodGhpcy55VmFsdWVBY2Nlc3Nvcix0KTttLmF0dHIoImZpbGwiLChxLHUseCk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh4Lm1ldGFkYXRhKCkubmFtZSkpO20uYXR0cigib3BhY2l0eSIsMSk7bS5zaXplKDIqcmcuVE9PTFRJUF9DSVJDTEVfU0laRSk7bS5zeW1ib2woKHEsdSx4KT0+dGhpcy5zeW1ib2xGdW5jdGlvbih4Lm1ldGFkYXRhKCkubmFtZSkpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90PW19bT1uZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7bS54KHRoaXMueEFjY2Vzc29yLGspO20ueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHQpO20uYXR0cigiZmlsbCIscT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHEubmFtZSkpO20uYXR0cigib3BhY2l0eSIsMSk7bS5zaXplKDIqcmcuVE9PTFRJUF9DSVJDTEVfU0laRSk7bS5kYXRhc2V0cyhbdGhpcy5sYXN0UG9pbnRzRGF0YXNldF0pO3RoaXMuc2NhdHRlclBsb3Q9Cm07bGV0IG49bmV3IFBsb3R0YWJsZS5QbG90cy5TY2F0dGVyO24ueCh0aGlzLnhBY2Nlc3NvcixrKTtuLnkocT0+cS5kaXNwbGF5WSx0KTtuLmF0dHIoImZpbGwiLHE9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShxLm5hbWUpKTtuLmF0dHIoIm9wYWNpdHkiLDEpO24uc2l6ZSgyKnJnLk5BTl9TWU1CT0xfU0laRSk7bi5kYXRhc2V0cyhbdGhpcy5uYW5EYXRhc2V0XSk7bi5zeW1ib2woUGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy50cmlhbmdsZSk7dGhpcy5uYW5EaXNwbGF5PW47az1bbixtLHAsbF07dGhpcy5tYXJnaW5BcmVhUGxvdCYmay5wdXNoKHRoaXMubWFyZ2luQXJlYVBsb3QpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZrLnB1c2godGhpcy5tYXJrZXJzU2NhdHRlclBsb3QpO3JldHVybiBuZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAoayl9X29uRGF0YXNldENoYW5nZWQoayl7dGhpcy5zbW9vdGhpbmdFbmFibGVkJiZ0aGlzLnJlc21vb3RoRGF0YXNldChrKTt0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfWlnbm9yZVlPdXRsaWVycyhrKXtrIT09CnRoaXMuX2lnbm9yZVlPdXRsaWVycyYmKHRoaXMuX2lnbm9yZVlPdXRsaWVycz1rLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCksdGhpcy55U2NhbGUuaWdub3JlT3V0bGllcihrKSx0aGlzLnJlc2V0WURvbWFpbigpKX1nZXRWYWx1ZXNGb3JZQXhpc0RvbWFpbkNvbXB1dGUoKXtjb25zdCBrPXRoaXMuZ2V0QWNjZXNzb3JzRm9yQ29tcHV0aW5nWVJhbmdlKCk7cmV0dXJuIF8uZmxhdHRlbkRlZXAodGhpcy5kYXRhc2V0cy5tYXAodD0+ay5tYXAobD0+dC5kYXRhKCkubWFwKHA9PmwocCwtMSx0KSkpKSkuZmlsdGVyKGlzRmluaXRlKX11cGRhdGVTcGVjaWFsRGF0YXNldHMoKXtjb25zdCBrPXRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpO3ZhciB0PXRoaXMuZGF0YXNldHMubWFwKGw9PntsZXQgcD1udWxsLG09bC5kYXRhKCkuZmlsdGVyKG49PiFpc05hTihrKG4sLTEsbCkpKTswPG0ubGVuZ3RoJiYocD1tW20ubGVuZ3RoLTFdLHAubmFtZT1sLm1ldGFkYXRhKCkubmFtZSxwLnJlbGF0aXZlPQpyZy5yZWxhdGl2ZUFjY2Vzc29yKHAsLTEsbCkpO3JldHVybiBwfSkuZmlsdGVyKGw9Pm51bGwhPWwpO3RoaXMubGFzdFBvaW50c0RhdGFzZXQuZGF0YSh0KTt0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cy5tYXAodGhpcy5jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMpKTt0PV8uZmxhdHRlbih0aGlzLmRhdGFzZXRzLm1hcChsPT57bGV0IHA9bnVsbCxtPWwuZGF0YSgpLG49MDtmb3IoO248bS5sZW5ndGgmJm51bGw9PXA7KWlzTmFOKGsobVtuXSwtMSxsKSl8fChwPWsobVtuXSwtMSxsKSksbisrO251bGw9PXAmJihwPTApO2xldCBxPVtdO2ZvcihuPTA7bjxtLmxlbmd0aDtuKyspaXNOYU4oayhtW25dLC0xLGwpKT8obVtuXS5uYW1lPWwubWV0YWRhdGEoKS5uYW1lLG1bbl0uZGlzcGxheVk9cCxtW25dLnJlbGF0aXZlPXJnLnJlbGF0aXZlQWNjZXNzb3IobVtuXSwtMSxsKSxxLnB1c2gobVtuXSkpOgpwPWsobVtuXSwtMSxsKTtyZXR1cm4gcX0pKTt0aGlzLm5hbkRhdGFzZXQuZGF0YSh0KX1yZXNldERvbWFpbigpe3RoaXMucmVzZXRYRG9tYWluKCk7dGhpcy5yZXNldFlEb21haW4oKX1yZXNldFhEb21haW4oKXtpZihudWxsIT10aGlzLl9kZWZhdWx0WFJhbmdlKXZhciBrPXRoaXMuX2RlZmF1bHRYUmFuZ2U7ZWxzZSBrPXRoaXMueFNjYWxlLGsuX2RvbWFpbk1pbj1udWxsLGsuX2RvbWFpbk1heD1udWxsLGs9ay5fZ2V0RXh0ZW50KCk7dGhpcy54U2NhbGUuZG9tYWluKGspfXJlc2V0WURvbWFpbigpe251bGwhPXRoaXMuX2RlZmF1bHRZUmFuZ2U/dGhpcy55U2NhbGUuZG9tYWluKHRoaXMuX2RlZmF1bHRZUmFuZ2UpOih0aGlzLnlTY2FsZS5hdXRvRG9tYWluKCksdGhpcy55U2NhbGUuZG9tYWluKHRoaXMueVNjYWxlLmRvbWFpbigpKSl9Z2V0QWNjZXNzb3JzRm9yQ29tcHV0aW5nWVJhbmdlKCl7Y29uc3Qgaz1bdGhpcy5nZXRZQXhpc0FjY2Vzc29yKCldO3RoaXMuZmlsbEFyZWEmJmsucHVzaCh0aGlzLmZpbGxBcmVhLmxvd2VyQWNjZXNzb3IsCnRoaXMuZmlsbEFyZWEuaGlnaGVyQWNjZXNzb3IpO3JldHVybiBrfWdldFlBeGlzQWNjZXNzb3IoKXtyZXR1cm4gdGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3Nvcjp0aGlzLnlWYWx1ZUFjY2Vzc29yfWNyZWF0ZVRvb2x0aXBJbnRlcmFjdGlvbihrKXtjb25zdCB0PW5ldyByZy5Qb2ludGVySW50ZXJhY3Rpb24sbD0oKT0+e3QuZW5hYmxlZCghMSk7dGhpcy5oaWRlVG9vbHRpcHMoKX0scD0oKT0+dC5lbmFibGVkKCEwKTtrLm9uUGFuU3RhcnQobCk7ay5vbkRyYWdab29tU3RhcnQobCk7ay5vblBhbkVuZChwKTtrLm9uRHJhZ1pvb21FbmQocCk7ay5vblNjcm9sbFpvb20oKCk9PnRoaXMudXBkYXRlVG9vbHRpcENvbnRlbnQodGhpcy5fbGFzdE1vdXNlUG9zaXRpb24pKTt0Lm9uUG9pbnRlck1vdmUobT0+e3RoaXMuX2xhc3RNb3VzZVBvc2l0aW9uPW07dGhpcy51cGRhdGVUb29sdGlwQ29udGVudChtKX0pO3Qub25Qb2ludGVyRXhpdCgoKT0+dGhpcy5oaWRlVG9vbHRpcHMoKSk7CnJldHVybiB0fXVwZGF0ZVRvb2x0aXBDb250ZW50KGspe3RoaXMubGluZVBsb3QmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKSx0aGlzLl90b29sdGlwVXBkYXRlQW5pbWF0aW9uRnJhbWU9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2xldCB0PXt4OmsueCx5OmsueSxkYXR1bTpudWxsLGRhdGFzZXQ6bnVsbH0sbD10aGlzLmdyaWRsaW5lcy5jb250ZW50KCkubm9kZSgpLmdldEJCb3goKTt2YXIgcD10aGlzLmxpbmVQbG90LmRhdGFzZXRzKCkubWFwKHU9PnRoaXMuZmluZENsb3Nlc3RQb2ludCh0LHUpKS5maWx0ZXIoQm9vbGVhbik7bGV0IG09UGxvdHRhYmxlLlV0aWxzLkRPTS5pbnRlcnNlY3RzQkJveCxuPXAuZmlsdGVyKHU9Pm0odS54LHUueSxsKXx8aXNOYU4odGhpcy55VmFsdWVBY2Nlc3Nvcih1LmRhdHVtLDAsdS5kYXRhc2V0KSkpLHE9bi5maWx0ZXIodT0+IWlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IodS5kYXR1bSwKMCx1LmRhdGFzZXQpKSk7MCE9PXAubGVuZ3RoPyh0aGlzLnNjYXR0ZXJQbG90LmF0dHIoImRpc3BsYXkiLCJub25lIikscD10aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQuY29udGVudCgpLnNlbGVjdEFsbCgiLnBvaW50IikuZGF0YShxLHU9PnUuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpLHAuZW50ZXIoKS5hcHBlbmQoImNpcmNsZSIpLmNsYXNzZWQoInBvaW50IiwhMCkscC5hdHRyKCJyIixyZy5UT09MVElQX0NJUkNMRV9TSVpFKS5hdHRyKCJjeCIsdT0+dS54KS5hdHRyKCJjeSIsdT0+dS55KS5zdHlsZSgic3Ryb2tlIiwibm9uZSIpLmF0dHIoImZpbGwiLHU9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh1LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSkscC5leGl0KCkucmVtb3ZlKCksdGhpcy5kcmF3VG9vbHRpcHMobix0LHRoaXMudG9vbHRpcENvbHVtbnMpKTp0aGlzLmhpZGVUb29sdGlwcygpfSkpfWhpZGVUb29sdGlwcygpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwVXBkYXRlQW5pbWF0aW9uRnJhbWUpOwp0aGlzLnRvb2x0aXAuaGlkZSgpO3RoaXMuc2NhdHRlclBsb3QuYXR0cigiZGlzcGxheSIsImJsb2NrIik7dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LmNvbnRlbnQoKS5zZWxlY3RBbGwoIi5wb2ludCIpLnJlbW92ZSgpfXNldHVwVG9vbHRpcHMoayl7ay5vbkRldGFjaCgoKT0+e3RoaXMudG9vbHRpcEludGVyYWN0aW9uLmRldGFjaEZyb20oKTt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5lbmFibGVkKCExKX0pO2sub25BbmNob3IoKCk9Pnt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5hdHRhY2hUbyhrKTt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5lbmFibGVkKCEwKX0pfWRyYXdUb29sdGlwcyhrLHQsbCl7aWYoay5sZW5ndGgpe3ZhciBwPXRoaXMuY29sb3JTY2FsZTtsPVt7dGl0bGU6IiIsc3RhdGljOiExLGV2YWxUeXBlOmQuRE9NLGV2YWx1YXRlKHkpe2QzLnNlbGVjdCh0aGlzKS5zZWxlY3QoInNwYW4iKS5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsKCk9PnAuc2NhbGUoeS5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpOwpyZXR1cm4iIn0sZW50ZXIoeSl7ZDMuc2VsZWN0KHRoaXMpLmFwcGVuZCgic3BhbiIpLmNsYXNzZWQoInN3YXRjaCIsITApLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIiwoKT0+cC5zY2FsZSh5LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSl9fSwuLi5sXTt2YXIgbT15PT5NYXRoLnBvdyh5LngtdC54LDIpK01hdGgucG93KHkueS10LnksMiksbj1fLm1pbihrLm1hcChtKSkscT10aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5zbW9vdGhlZEFjY2Vzc29yOnRoaXMueVZhbHVlQWNjZXNzb3I7az0iYXNjZW5kaW5nIj09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0Qnkoayx5PT5xKHkuZGF0dW0sLTEseS5kYXRhc2V0KSk6ImRlc2NlbmRpbmciPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9fLnNvcnRCeShrLHk9PnEoeS5kYXR1bSwtMSx5LmRhdGFzZXQpKS5yZXZlcnNlKCk6Im5lYXJlc3QiPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9fLnNvcnRCeShrLG0pOmsuc2xpY2UoMCkucmV2ZXJzZSgpOwp2YXIgdT10aGlzLHg9ZDMuc2VsZWN0KHRoaXMudG9vbHRpcC5jb250ZW50KCkpLnNlbGVjdCgidGFibGUiKSxBPXguc2VsZWN0KCJ0aGVhZCIpLnNlbGVjdEFsbCgidGgiKS5kYXRhKGwseT0+eS50aXRsZSk7QS5lbnRlcigpLmFwcGVuZCgidGgiKS50ZXh0KHk9PnkudGl0bGUpLm5vZGVzKCk7QS5leGl0KCkucmVtb3ZlKCk7az14LnNlbGVjdCgidGJvZHkiKS5zZWxlY3RBbGwoInRyIikuZGF0YShrLHk9PnkuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpO2suY2xhc3NlZCgiZGlzdGFudCIseT0+e3ZhciB3PXkuZGF0YXNldC5kYXRhKClbMF0sQz1fLmxhc3QoeS5kYXRhc2V0LmRhdGEoKSk7dz10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3Nvcih3LDAseS5kYXRhc2V0KSk7Qz10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3NvcihDLDAseS5kYXRhc2V0KSk7eT10aGlzLnNtb290aGluZ0VuYWJsZWQ/eS5kYXR1bS5zbW9vdGhlZDp0aGlzLnlWYWx1ZUFjY2Vzc29yKHkuZGF0dW0sCjAseS5kYXRhc2V0KTtyZXR1cm4gdC54PHd8fHQueD5DfHxpc05hTih5KX0pLmNsYXNzZWQoImNsb3Nlc3QiLHk9Pm0oeSk9PT1uKS5lYWNoKGZ1bmN0aW9uKHkpe3UuZHJhd1Rvb2x0aXBSb3codGhpcyxsLHkpfSkub3JkZXIoKTtrLmV4aXQoKS5yZW1vdmUoKTtrLmVudGVyKCkuYXBwZW5kKCJ0ciIpLmVhY2goZnVuY3Rpb24oeSl7dS5kcmF3VG9vbHRpcFJvdyh0aGlzLGwseSl9KS5ub2RlcygpO3RoaXMudG9vbHRpcC51cGRhdGVBbmRQb3NpdGlvbih0aGlzLnRhcmdldFNWRy5ub2RlKCkpfWVsc2UgdGhpcy50b29sdGlwLmhpZGUoKX1kcmF3VG9vbHRpcFJvdyhrLHQsbCl7Y29uc3QgcD10aGlzO2s9ZDMuc2VsZWN0KGspLnNlbGVjdEFsbCgidGQiKS5kYXRhKHQpO2suZWFjaChmdW5jdGlvbihtKXttLnN0YXRpY3x8cC5kcmF3VG9vbHRpcENvbHVtbi5jYWxsKHAsdGhpcyxtLGwpfSk7ay5lbnRlcigpLmFwcGVuZCgidGQiKS5lYWNoKGZ1bmN0aW9uKG0pe20uZW50ZXImJm0uZW50ZXIuY2FsbCh0aGlzLApsKTtwLmRyYXdUb29sdGlwQ29sdW1uLmNhbGwocCx0aGlzLG0sbCl9KX1kcmF3VG9vbHRpcENvbHVtbihrLHQsbCl7Y29uc3QgcD10aGlzLnNtb290aGluZ0VuYWJsZWQ7dC5ldmFsVHlwZT09ZC5ET00/dC5ldmFsdWF0ZS5jYWxsKGssbCx7c21vb3RoaW5nRW5hYmxlZDpwfSk6ZDMuc2VsZWN0KGspLnRleHQodC5ldmFsdWF0ZS5jYWxsKGssbCx7c21vb3RoaW5nRW5hYmxlZDpwfSkpfWZpbmRDbG9zZXN0UG9pbnQoayx0KXtjb25zdCBsPXQuZGF0YSgpLm1hcCgobixxKT0+dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IobixxLHQpKSk7bGV0IHA9Xy5zb3J0ZWRJbmRleChsLGsueCk7aWYoMD09bC5sZW5ndGgpcmV0dXJuIG51bGw7cD09PWwubGVuZ3RoPy0tcDowIT09cCYmKHA9TWF0aC5hYnMobFtwLTFdLWsueCk8TWF0aC5hYnMobFtwXS1rLngpP3AtMTpwKTtrPXQuZGF0YSgpW3BdO2NvbnN0IG09dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3NvcihrLApwLHQpOnRoaXMueVZhbHVlQWNjZXNzb3IoayxwLHQpO3JldHVybnt4OmxbcF0seTp0aGlzLnlTY2FsZS5zY2FsZShtKSxkYXR1bTprLGRhdGFzZXQ6dH19cmVzbW9vdGhEYXRhc2V0KGspe2xldCB0PWsuZGF0YSgpO2NvbnN0IGw9dGhpcy5zbW9vdGhpbmdXZWlnaHQ7bGV0IHA9MDx0Lmxlbmd0aD8wOk5hTixtPTA7Y29uc3Qgbj10Lm1hcCgodSx4KT0+dGhpcy55VmFsdWVBY2Nlc3Nvcih1LHgsaykpLHE9bi5ldmVyeSh1PT51PT1uWzBdKTt0LmZvckVhY2goKHUseCk9Pnt4PW5beF07cXx8IU51bWJlci5pc0Zpbml0ZSh4KT91LnNtb290aGVkPXg6KHA9cCpsKygxLWwpKngsbSsrLHg9MSwxIT09bCYmKHg9MS1NYXRoLnBvdyhsLG0pKSx1LnNtb290aGVkPXAveCl9KX1nZXREYXRhc2V0KGspe3ZvaWQgMD09PXRoaXMubmFtZTJkYXRhc2V0c1trXSYmKHRoaXMubmFtZTJkYXRhc2V0c1trXT1uZXcgUGxvdHRhYmxlLkRhdGFzZXQoW10se25hbWU6ayxtZXRhOm51bGx9KSk7cmV0dXJuIHRoaXMubmFtZTJkYXRhc2V0c1trXX1zdGF0aWMgZ2V0WVNjYWxlRnJvbVR5cGUoayl7aWYoaz09PQpmLkxPRylyZXR1cm4gbmV3IGIuTG9nU2NhbGU7aWYoaz09PWYuTElORUFSKXJldHVybiBuZXcgYi5MaW5lYXJTY2FsZTt0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIHlTY2FsZSB0eXBlICIrayk7fXNldFZpc2libGVTZXJpZXMoayl7dGhpcy5zZXJpZXNOYW1lcz1rPWsuc29ydCgpO2sucmV2ZXJzZSgpO3RoaXMuZGF0YXNldHMuZm9yRWFjaCh0PT50Lm9mZlVwZGF0ZSh0aGlzLm9uRGF0YXNldENoYW5nZWQpKTt0aGlzLmRhdGFzZXRzPWsubWFwKHQ9PnRoaXMuZ2V0RGF0YXNldCh0KSk7dGhpcy5kYXRhc2V0cy5mb3JFYWNoKHQ9PnQub25VcGRhdGUodGhpcy5vbkRhdGFzZXRDaGFuZ2VkKSk7dGhpcy5saW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTt0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cyk7dGhpcy5tYXJnaW5BcmVhUGxvdCYmdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTsKdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKX1jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMoayl7Y29uc3QgdD1rLmRhdGEoKTtpZigyMD49dC5sZW5ndGgpcmV0dXJuIGs7Y29uc3QgbD1NYXRoLmNlaWwodC5sZW5ndGgvMjApLHA9QXJyYXkoTWF0aC5mbG9vcih0Lmxlbmd0aC9sKSk7Zm9yKGxldCBtPTAsbj0wO208cC5sZW5ndGg7bSsrLG4rPWwpcFttXT10W25dO3JldHVybiBuZXcgUGxvdHRhYmxlLkRhdGFzZXQocCxrLm1ldGFkYXRhKCkpfXNldFNlcmllc0RhdGEoayx0KXt0aGlzLmdldERhdGFzZXQoaykuZGF0YSh0KTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1zZXRTZXJpZXNNZXRhZGF0YShrLHQpe3Q9T2JqZWN0LmFzc2lnbih7fSx0aGlzLmdldERhdGFzZXQoaykubWV0YWRhdGEoKSx7bWV0YTp0fSk7dGhpcy5nZXREYXRhc2V0KGspLm1ldGFkYXRhKHQpfXNtb290aGluZ1VwZGF0ZShrKXt0aGlzLnNtb290aGluZ1dlaWdodD0Kazt0aGlzLmRhdGFzZXRzLmZvckVhY2godD0+dGhpcy5yZXNtb290aERhdGFzZXQodCkpO3RoaXMuc21vb3RoaW5nRW5hYmxlZHx8KHRoaXMubGluZVBsb3QuYWRkQ2xhc3MoImdob3N0IiksdGhpcy5zY2F0dGVyUGxvdC55KHRoaXMuc21vb3RoZWRBY2Nlc3Nvcix0aGlzLnlTY2FsZSksdGhpcy5zbW9vdGhpbmdFbmFibGVkPSEwLHRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cykpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKTt0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfXNtb290aGluZ0Rpc2FibGUoKXt0aGlzLnNtb290aGluZ0VuYWJsZWQmJih0aGlzLmxpbmVQbG90LnJlbW92ZUNsYXNzKCJnaG9zdCIpLHRoaXMuc2NhdHRlclBsb3QueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKFtdKSwKdGhpcy5zbW9vdGhpbmdFbmFibGVkPSExLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCkpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKX1zZXRUb29sdGlwU29ydGluZ01ldGhvZChrKXt0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kPWt9cmVuZGVyVG8oayl7dGhpcy50YXJnZXRTVkc9azt0aGlzLm91dGVyLnJlbmRlclRvKGspO251bGwhPXRoaXMuX2RlZmF1bHRYUmFuZ2UmJnRoaXMucmVzZXRYRG9tYWluKCk7bnVsbCE9dGhpcy5fZGVmYXVsdFlSYW5nZSYmdGhpcy5yZXNldFlEb21haW4oKTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1yZWRyYXcoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTt0aGlzLl9yZWRyYXdSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKTsKdGhpcy5vdXRlci5yZWRyYXcoKX0pfW1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faW52YWxpZGF0ZUxheW91dFJhZik7dGhpcy5faW52YWxpZGF0ZUxheW91dFJhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpfSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKXtpZih0aGlzLl9sYXN0RHJhd0JCb3gpe2NvbnN0IGs9dGhpcy5fbGFzdERyYXdCQm94LndpZHRoLHt3aWR0aDp0fT10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7MD09ayYmazx0JiZ0aGlzLm91dGVyLmludmFsaWRhdGVDYWNoZSgpfXRoaXMuX2xhc3REcmF3QkJveD10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9ZGVzdHJveSgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpOwp3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faW52YWxpZGF0ZUxheW91dFJhZik7dGhpcy5vdXRlciYmdGhpcy5vdXRlci5kZXN0cm95KCl9b25BbmNob3Ioayl7aWYodGhpcy5vdXRlcil0aGlzLm91dGVyLm9uQW5jaG9yKGspfX1iLkxpbmVDaGFydD1ofSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Z6LWxpbmUtY2hhcnQyLmpzCihmdW5jdGlvbihiKXtjb25zdCBkPXJnLm11bHRpc2NhbGVGb3JtYXR0ZXIocmcuWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pLGY9aD0+aXNOYU4oaCk/Ik5hTiI6ZChoKTtiLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TPVt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmg9PmguZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV9LHt0aXRsZToiU21vb3RoZWQiLGV2YWx1YXRlKGgsayl7cmV0dXJuIGYoay5zbW9vdGhpbmdFbmFibGVkP2guZGF0dW0uc21vb3RoZWQ6aC5kYXR1bS5zY2FsYXIpfX0se3RpdGxlOiJWYWx1ZSIsZXZhbHVhdGU6aD0+ZihoLmRhdHVtLnNjYWxhcil9LHt0aXRsZToiU3RlcCIsZXZhbHVhdGU6aD0+cmcuc3RlcEZvcm1hdHRlcihoLmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLGV2YWx1YXRlOmg9PnJnLnRpbWVGb3JtYXR0ZXIoaC5kYXR1bS53YWxsX3RpbWUpfSx7dGl0bGU6IlJlbGF0aXZlIixldmFsdWF0ZTpoPT5yZy5yZWxhdGl2ZUZvcm1hdHRlcihyZy5yZWxhdGl2ZUFjY2Vzc29yKGguZGF0dW0sCi0xLGguZGF0YXNldCkpfV07UG9seW1lcih7aXM6InZ6LWxpbmUtY2hhcnQyIixwcm9wZXJ0aWVzOntjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybihuZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcikucmFuZ2UoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSxzeW1ib2xGdW5jdGlvbjpPYmplY3Qsc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sc21vb3RoaW5nV2VpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTouNn0seFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSx4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0seEF4aXNGb3JtYXR0ZXI6T2JqZWN0LHlWYWx1ZUFjY2Vzc29yOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+aD0+aC5zY2FsYXJ9LHRvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5iLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TfSxmaWxsQXJlYTpPYmplY3QsCmRlZmF1bHRYUmFuZ2U6QXJyYXksZGVmYXVsdFlSYW5nZTpBcnJheSx5U2NhbGVUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToibGluZWFyIn0saWdub3JlWU91dGxpZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHRvb2x0aXBTb3J0aW5nTWV0aG9kOnt0eXBlOlN0cmluZyx2YWx1ZToiZGVmYXVsdCJ9LHRvb2x0aXBQb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6RWguVG9vbHRpcFBvc2l0aW9uLkJPVFRPTX0sX2NoYXJ0Ok9iamVjdCxfdmlzaWJsZVNlcmllc0NhY2hlOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3Nlcmllc0RhdGFDYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9zZXJpZXNNZXRhZGF0YUNhY2hlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZDp7dHlwZTpOdW1iZXIsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9tYWtlQ2hhcnQoeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCwgeFR5cGUsIHlWYWx1ZUFjY2Vzc29yLCB5U2NhbGVUeXBlLCB0b29sdGlwQ29sdW1ucywgY29sb3JTY2FsZSwgaXNBdHRhY2hlZCkiLAoiX3JlbG9hZEZyb21DYWNoZShfY2hhcnQsIF92aXNpYmxlU2VyaWVzQ2FjaGUpIiwiX3Ntb290aGluZ0NoYW5nZWQoc21vb3RoaW5nRW5hYmxlZCwgc21vb3RoaW5nV2VpZ2h0LCBfY2hhcnQpIiwiX3Rvb2x0aXBTb3J0aW5nTWV0aG9kQ2hhbmdlZCh0b29sdGlwU29ydGluZ01ldGhvZCwgX2NoYXJ0KSIsIl9vdXRsaWVyc0NoYW5nZWQoaWdub3JlWU91dGxpZXJzLCBfY2hhcnQpIl0scmVhZHkoKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuY2hhcnRkaXYsITApfSxhdHRhY2hlZCgpe2NvbnN0IGg9e2NhcHR1cmU6ITAscGFzc2l2ZTohMH07dGhpcy5fbGlzdGVuKHRoaXMsIm1vdXNlZG93biIsdGhpcy5fb25Nb3VzZURvd24uYmluZCh0aGlzKSxoKTt0aGlzLl9saXN0ZW4odGhpcywibW91c2V1cCIsdGhpcy5fb25Nb3VzZVVwLmJpbmQodGhpcyksaCk7dGhpcy5fbGlzdGVuKHdpbmRvdywia2V5ZG93biIsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksaCk7dGhpcy5fbGlzdGVuKHdpbmRvdywKImtleXVwIix0aGlzLl9vbktleVVwLmJpbmQodGhpcyksaCl9LGRldGFjaGVkKCl7dGhpcy5jYW5jZWxBc3luYyh0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQpO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5kZXN0cm95KCk7dGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzLmZvckVhY2goKHtub2RlOmgsZXZlbnROYW1lOmssZnVuYzp0LG9wdGlvbjpsfSk9PntoLnJlbW92ZUV2ZW50TGlzdGVuZXIoayx0LGwpfSksdGhpcy5fbGlzdGVuZXJzLmNsZWFyKCkpfSxfbGlzdGVuKGgsayx0LGw9e30pe3RoaXMuX2xpc3RlbmVyc3x8KHRoaXMuX2xpc3RlbmVycz1uZXcgU2V0KTt0aGlzLl9saXN0ZW5lcnMuYWRkKHtub2RlOmgsZXZlbnROYW1lOmssZnVuYzp0LG9wdGlvbjpsfSk7aC5hZGRFdmVudExpc3RlbmVyKGssdCxsKX0sX29uS2V5RG93bihoKXt0aGlzLnRvZ2dsZUNsYXNzKCJwYW5rZXkiLGIuUGFuWm9vbURyYWdMYXllci5pc1BhbktleShoKSl9LF9vbktleVVwKGgpe3RoaXMudG9nZ2xlQ2xhc3MoInBhbmtleSIsCmIuUGFuWm9vbURyYWdMYXllci5pc1BhbktleShoKSl9LF9vbk1vdXNlRG93bigpe3RoaXMudG9nZ2xlQ2xhc3MoIm1vdXNlZG93biIsITApfSxfb25Nb3VzZVVwKCl7dGhpcy50b2dnbGVDbGFzcygibW91c2Vkb3duIiwhMSl9LHNldFZpc2libGVTZXJpZXM6ZnVuY3Rpb24oaCl7Xy5pc0VxdWFsKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSxoKXx8KHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT1oKX0sc2V0U2VyaWVzRGF0YTpmdW5jdGlvbihoLGspe3RoaXMuX3Nlcmllc0RhdGFDYWNoZVtoXT1rO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKGgsayl9LHNldFNlcmllc01ldGFkYXRhKGgsayl7dGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZVtoXT1rO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShoLGspfSxyZXNldERvbWFpbjpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5yZXNldERvbWFpbigpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmCnRoaXMuX2NoYXJ0LnJlZHJhdygpfSxfbWFrZUNoYXJ0OmZ1bmN0aW9uKGgsayx0LGwscCxtKXtrfHxoP2smJihoPSgpPT5yZy5nZXRYQ29tcG9uZW50cyhrKSk6aD1yZy5zdGVwWDtudWxsIT09dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQpLHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsKTt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsO2lmKGgmJnRoaXMueVZhbHVlQWNjZXNzb3ImJnRoaXMudG9vbHRpcENvbHVtbnMpe3ZhciBuPW5ldyBiLkxpbmVDaGFydChoLHRoaXMueVZhbHVlQWNjZXNzb3IsbCxtLHRoaXMuJC50b29sdGlwLHRoaXMudG9vbHRpcENvbHVtbnMsdGhpcy5maWxsQXJlYSx0aGlzLmRlZmF1bHRYUmFuZ2UsdGhpcy5kZWZhdWx0WVJhbmdlLAp0aGlzLnN5bWJvbEZ1bmN0aW9uLHRoaXMueEF4aXNGb3JtYXR0ZXIpLHE9ZDMuc2VsZWN0KHRoaXMuJC5jaGFydGRpdik7bi5yZW5kZXJUbyhxKTt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3RoaXMuX2NoYXJ0PW47dGhpcy5fY2hhcnQub25BbmNob3IoKCk9PnRoaXMuZmlyZSgiY2hhcnQtYXR0YWNoZWQiKSl9fSwzNTApfSxfcmVsb2FkRnJvbUNhY2hlOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUuZm9yRWFjaChoPT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShoLHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtoXXx8W10pfSksdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZpbHRlcihoPT50aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW2hdKS5mb3JFYWNoKGg9Pnt0aGlzLl9jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShoLHRoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbaF0pfSksdGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUpKX0sCl9zbW9vdGhpbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5fY2hhcnQuc21vb3RoaW5nVXBkYXRlKHRoaXMuc21vb3RoaW5nV2VpZ2h0KTp0aGlzLl9jaGFydC5zbW9vdGhpbmdEaXNhYmxlKCkpfSxfb3V0bGllcnNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0Lmlnbm9yZVlPdXRsaWVycyh0aGlzLmlnbm9yZVlPdXRsaWVycyl9LF90b29sdGlwU29ydGluZ01ldGhvZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0VG9vbHRpcFNvcnRpbmdNZXRob2QodGhpcy50b29sdGlwU29ydGluZ01ldGhvZCl9LGdldEV4cG9ydGVyKCl7cmV0dXJuIG5ldyBiLkxpbmVDaGFydEV4cG9ydGVyKHRoaXMuJC5jaGFydGRpdil9fSl9KShHaHx8KEdoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvdnotbGluZS1jaGFydDIuaHRtbC5qcwpQb2x5bWVyKHtpczoidnotbGluZS1jaGFydC10b29sdGlwIn0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xpbmUtY2hhcnQtZXhwb3J0ZXIuanMKKGZ1bmN0aW9uKGIpe2xldCBkOyhmdW5jdGlvbihrKXtrLkdST1VQPSJHIjtrLkRJVj0iRElWIjtrLlNWRz0iU1ZHIjtrLlRFWFQ9IlRFWFQifSkoZHx8KGQ9e30pKTtjbGFzcyBme2NvbnN0cnVjdG9yKGspe3RoaXMudW5pcXVlSWQ9MDt0aGlzLnJvb3Q9a31leHBvcnRBc1N0cmluZygpe2NvbnN0IGs9dGhpcy5jb252ZXJ0KHRoaXMucm9vdCk7aWYoIWspcmV0dXJuIiI7Y29uc3QgdD10aGlzLmNyZWF0ZVJvb3RTdmcoKTt0LmFwcGVuZENoaWxkKGspO3JldHVybiB0Lm91dGVySFRNTH1jcmVhdGVVbmlxdWVJZCgpe3JldHVybmAkeyJjbGlwIn1fJHt0aGlzLnVuaXF1ZUlkKyt9YH1nZXRTaXplKCl7cmV0dXJuIHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jcmVhdGVSb290U3ZnKCl7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdmciKSx0PXRoaXMuZ2V0U2l6ZSgpO2suc2V0QXR0cmlidXRlTlMoInN2ZyIsInZpZXdCb3giLGAwIDAgJHt0LndpZHRofSAke3QuaGVpZ2h0fWApOwprLnNldEF0dHJpYnV0ZSgieG1sbnMiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIpO3JldHVybiBrfWNvbnZlcnQoayl7bGV0IHQ9bnVsbDt2YXIgbD1rLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7aWYoay5ub2RlVHlwZSE9Tm9kZS5FTEVNRU5UX05PREV8fGwhPWQuRElWJiZsIT1kLlNWRyl0PWsuY2xvbmVOb2RlKCk7ZWxzZXt0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZC5HUk9VUCk7dmFyIHA9d2luZG93LmdldENvbXB1dGVkU3R5bGUoayksbT1wYXJzZUludChwLmxlZnQsMTApLG49cGFyc2VJbnQocC50b3AsMTApO2lmKG18fG4pbD10aGlzLmNyZWF0ZVVuaXF1ZUlkKCksdC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke219LCAke259KWApLHQuc2V0QXR0cmlidXRlKCJjbGlwLXBhdGgiLGB1cmwoIyR7bH0pYCksbj1wYXJzZUludChwLmhlaWdodCwxMCksbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJyZWN0IiksbS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKU3RyaW5nKHBhcnNlSW50KHAud2lkdGgsMTApKSksbS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsU3RyaW5nKG4pKSxwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygic3ZnIiwiY2xpcFBhdGgiKSxwLmlkPWwscC5hcHBlbmRDaGlsZChtKSx0LmFwcGVuZENoaWxkKHApfUFycmF5LmZyb20oay5jaGlsZE5vZGVzKS5tYXAocT0+dGhpcy5jb252ZXJ0KHEpKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChxPT50LmFwcGVuZENoaWxkKHEpKTtyZXR1cm4gdC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT1kLkdST1VQJiYhdC5oYXNDaGlsZE5vZGVzKCl8fHRoaXMuc2hvdWxkT21pdE5vZGUoayk/bnVsbDp0aGlzLnN0cmlwQ2xhc3ModGhpcy50cmFuc2ZlclN0eWxlKGssdCkpfXN0cmlwQ2xhc3Moayl7ay5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUmJmsucmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpO3JldHVybiBrfXRyYW5zZmVyU3R5bGUoayx0KXtpZih0Lm5vZGVUeXBlIT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gdDsKY29uc3QgbD10Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7az13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShrKTtsPT1kLlRFWFQmJk9iamVjdC5hc3NpZ24odC5zdHlsZSx7Zm9udEZhbWlseTprLmZvbnRGYW1pbHksZm9udFNpemU6ay5mb250U2l6ZSxmb250V2VpZ2h0OmsuZm9udFdlaWdodH0pO2whPWQuR1JPVVAmJih0LnNldEF0dHJpYnV0ZSgiZmlsbCIsay5maWxsKSx0LnNldEF0dHJpYnV0ZSgic3Ryb2tlIixrLnN0cm9rZSksdC5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsay5zdHJva2VXaWR0aCkpOyIxIiE9ay5vcGFjaXR5JiZ0LnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsay5vcGFjaXR5KTtyZXR1cm4gdH1zaG91bGRPbWl0Tm9kZSgpe3JldHVybiExfX1iLlBsb3R0YWJsZUV4cG9ydGVyPWY7Y2xhc3MgaCBleHRlbmRzIGZ7c2hvdWxkT21pdE5vZGUoayl7cmV0dXJuIGsubm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFP2suY2xhc3NMaXN0LmNvbnRhaW5zKCJzY2F0dGVyLXBsb3QiKToKITF9fWIuTGluZUNoYXJ0RXhwb3J0ZXI9aH0pKEdofHwoR2g9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyL3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIuaHRtbC5qcwooZnVuY3Rpb24oKXtjb25zdCBiPVtdLGQ9ZnVuY3Rpb24oKXtyZXR1cm4gXy50aHJvdHRsZShmdW5jdGlvbiBoKCl7aWYoMCE9Yi5sZW5ndGgpe3ZhciBrPWIuc2hpZnQoKTtrLmFjdGl2ZSYmKGsucmVkcmF3KCksay5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU9ITEpO3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSgwKTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGgpfX0sMTAwKX0oKTtQb2x5bWVyKHtpczoidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIscHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9maXhCYWRTdGF0ZVdoZW5BY3RpdmUifSxkYXRhU2VyaWVzOkFycmF5LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxsb2dTY2FsZUFjdGl2ZTp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfbG9nU2NhbGVDaGFuZ2VkIn0seENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDpPYmplY3QseFR5cGU6U3RyaW5nLHlWYWx1ZUFjY2Vzc29yOk9iamVjdCxmaWxsQXJlYTpPYmplY3QsCnNtb290aGluZ0VuYWJsZWQ6Qm9vbGVhbixzbW9vdGhpbmdXZWlnaHQ6TnVtYmVyLHRvb2x0aXBDb2x1bW5zOkFycmF5LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyx0b29sdGlwUG9zaXRpb246U3RyaW5nLGlnbm9yZVlPdXRsaWVyczpCb29sZWFuLGRlZmF1bHRYUmFuZ2U6QXJyYXksZGVmYXVsdFlSYW5nZTpBcnJheSxzeW1ib2xGdW5jdGlvbjpPYmplY3QsY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NhbGU6cGYucnVuc0NvbG9yU2NhbGV9KX0sX3Jlc2V0RG9tYWluT25OZXh0TG9hZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxiZWhhdmlvcnM6W3FkLkRhdGFMb2FkZXJCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2RhdGFTZXJpZXNDaGFuZ2VkKGRhdGFTZXJpZXMuKikiLCJfbG9hZEtleUNoYW5nZWQobG9hZEtleSkiXSxvbkxvYWRGaW5pc2goKXswPAp0aGlzLmRhdGFUb0xvYWQubGVuZ3RoJiZ0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQmJih0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQ9ITEsdGhpcy4kLmNoYXJ0LnJlc2V0RG9tYWluKCkpO3RoaXMucmVkcmF3KCl9LGRldGFjaGVkKCl7Y2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKX0sZXhwb3J0QXNTdmdTdHJpbmcoKXtyZXR1cm4gdGhpcy4kLmNoYXJ0LmdldEV4cG9ydGVyKCkuZXhwb3J0QXNTdHJpbmcoKX0scmVzZXREb21haW4oKXt0aGlzLiQuY2hhcnQucmVzZXREb21haW4oKX0sc2V0U2VyaWVzRGF0YShmLGgpe3RoaXMuJC5jaGFydC5zZXRTZXJpZXNEYXRhKGYsaCl9LHNldFNlcmllc01ldGFkYXRhKGYsaCl7dGhpcy4kLmNoYXJ0LnNldFNlcmllc01ldGFkYXRhKGYsaCl9LHJlZHJhdygpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZik7dGhpcy5fcmVkcmF3UmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLmFjdGl2ZT8KdGhpcy4kLmNoYXJ0LnJlZHJhdygpOnRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSEwfSl9LF9sb2FkS2V5Q2hhbmdlZCgpe3RoaXMucmVzZXQoKTt0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQ9ITB9LF9kYXRhU2VyaWVzQ2hhbmdlZCgpe3RoaXMuJC5jaGFydC5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuZGF0YVNlcmllcyl9LF9sb2dTY2FsZUNoYW5nZWQoZil7dGhpcy4kLmNoYXJ0LnlTY2FsZVR5cGU9Zj8ibG9nIjoibGluZWFyIjt0aGlzLnJlZHJhdygpfSxfZml4QmFkU3RhdGVXaGVuQWN0aXZlKCl7dGhpcy5hY3RpdmUmJnRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlJiYoYi5wdXNoKHRoaXMpLGQoKSl9LF9vbkNoYXJ0QXR0YWNoZWQoKXt0aGlzLmFjdGl2ZXx8KHRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSEwKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItZGlhbG9nLXNjcm9sbGFibGUvcGFwZXItZGlhbG9nLXNjcm9sbGFibGUuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItZGlhbG9nLXNjcm9sbGFibGUiLHByb3BlcnRpZXM6e2RpYWxvZ0VsZW1lbnQ6e3R5cGU6T2JqZWN0fX0sZ2V0IHNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzLiQuc2Nyb2xsYWJsZX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9lbnN1cmVUYXJnZXQoKTt0aGlzLmNsYXNzTGlzdC5hZGQoIm5vLXBhZGRpbmciKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9lbnN1cmVUYXJnZXQoKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy51cGRhdGVTY3JvbGxTdGF0ZS5iaW5kKHRoaXMpKX0sdXBkYXRlU2Nyb2xsU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNsYXNzKCJpcy1zY3JvbGxlZCIsMDx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3ApO3RoaXMudG9nZ2xlQ2xhc3MoImNhbi1zY3JvbGwiLHRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodDx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxIZWlnaHQpO3RoaXMudG9nZ2xlQ2xhc3MoInNjcm9sbGVkLXRvLWJvdHRvbSIsCnRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCt0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQ+PXRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbEhlaWdodCl9LF9lbnN1cmVUYXJnZXQ6ZnVuY3Rpb24oKXsodGhpcy5kaWFsb2dFbGVtZW50PXRoaXMuZGlhbG9nRWxlbWVudHx8dGhpcy5wYXJlbnRFbGVtZW50KSYmdGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycyYmMDw9dGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycy5pbmRleE9mKFBvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvckltcGwpPyh0aGlzLmRpYWxvZ0VsZW1lbnQuc2l6aW5nVGFyZ2V0PXRoaXMuc2Nyb2xsVGFyZ2V0LHRoaXMuc2Nyb2xsVGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoImZpdCIpKTp0aGlzLmRpYWxvZ0VsZW1lbnQmJnRoaXMuc2Nyb2xsVGFyZ2V0LmNsYXNzTGlzdC5hZGQoImZpdCIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW1hcmtkb3duLXZpZXcvdGYtbWFya2Rvd24tdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1tYXJrZG93bi12aWV3Iixwcm9wZXJ0aWVzOntodG1sOnt0eXBlOlN0cmluZyx2YWx1ZToiIn19LGF0dGFjaGVkKCl7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5tYXJrZG93biwhMCl9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXJkLWhlYWRpbmcvdXRpbC5qcwp2YXIgSGg7KGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoZil7aWYoIWYpcmV0dXJuIG51bGw7bGV0IGg9Zi5tYXRjaCgvXiMoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkkLyk7aWYoIWgpcmV0dXJuIG51bGw7aWYoND09Zi5sZW5ndGgpZm9yKGY9MTszPj1mO2YrKyloW2ZdKz1oW2ZdO3JldHVybltwYXJzZUludChoWzFdLDE2KSxwYXJzZUludChoWzJdLDE2KSxwYXJzZUludChoWzNdLDE2KV19Yi5mb3JtYXREYXRlPWZ1bmN0aW9uKGYpe3JldHVybiBmP2YudG9TdHJpbmcoKS5yZXBsYWNlKC9HTVQtXGQrIFwoKFteKV0rKVwpLywiJDEiKToiIn07Yi5waWNrVGV4dENvbG9yPWZ1bmN0aW9uKGYpe3JldHVybihmPWQoZikpPzEyNTxNYXRoLnJvdW5kKCgyOTkqZlswXSs1ODcqZlsxXSsxMTQqZlsyXSkvMUUzKT8iaW5oZXJpdCI6IiNlZWUiOiJpbmhlcml0In19KShIaHx8KEhoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2FyZC1oZWFkaW5nL3RmLWNhcmQtaGVhZGluZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jYXJkLWhlYWRpbmciLHByb3BlcnRpZXM6e2Rpc3BsYXlOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx0YWc6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHJ1bjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZGVzY3JpcHRpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGNvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfcnVuQmFja2dyb3VuZDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQmFja2dyb3VuZChjb2xvcikiLHJlYWRPbmx5OiEwLG9ic2VydmVyOiJfdXBkYXRlSGVhZGluZ1N0eWxlIn0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihjb2xvcikiLHJlYWRPbmx5OiEwLG9ic2VydmVyOiJfdXBkYXRlSGVhZGluZ1N0eWxlIn0sX25hbWVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlTmFtZUxhYmVsKGRpc3BsYXlOYW1lLCB0YWcpIn0sX3RhZ0xhYmVsOnt0eXBlOlN0cmluZywKY29tcHV0ZWQ6Il9jb21wdXRlVGFnTGFiZWwoZGlzcGxheU5hbWUsIHRhZykifX0sX3VwZGF0ZUhlYWRpbmdTdHlsZSgpe3RoaXMudXBkYXRlU3R5bGVzKHsiLS10Zi1jYXJkLWhlYWRpbmctYmFja2dyb3VuZC1jb2xvciI6dGhpcy5fcnVuQmFja2dyb3VuZCwiLS10Zi1jYXJkLWhlYWRpbmctY29sb3IiOnRoaXMuX3J1bkNvbG9yfSl9LF9jb21wdXRlUnVuQmFja2dyb3VuZChiKXtyZXR1cm4gYnx8Im5vbmUifSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBIaC5waWNrVGV4dENvbG9yKGIpfSxfY29tcHV0ZU5hbWVMYWJlbChiLGQpe3JldHVybiBifHxkfHwiIn0sX2NvbXB1dGVUYWdMYWJlbChiLGQpe3JldHVybiBkJiZkIT09Yj9kOiIifSxfdG9nZ2xlRGVzY3JpcHRpb25EaWFsb2coYil7dGhpcy4kLmRlc2NyaXB0aW9uRGlhbG9nLnBvc2l0aW9uVGFyZ2V0PWIudGFyZ2V0O3RoaXMuJC5kZXNjcmlwdGlvbkRpYWxvZy50b2dnbGUoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kYXNoYm9hcmQtY29tbW9uL3RmLWRvd25sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZG93bmxvYWRlciIscHJvcGVydGllczp7X3J1bjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHJ1bnM6QXJyYXksdGFnOlN0cmluZyx1cmxGbjpGdW5jdGlvbn0sX2NzdlVybChiLGQsZil7cmV0dXJuIGQ/dmMuYWRkUGFyYW1zKGYoYixkKSx7Zm9ybWF0OiJjc3YifSk6IiJ9LF9qc29uVXJsKGIsZCxmKXtyZXR1cm4gZD9mKGIsZCk6IiJ9LF9jc3ZOYW1lKGIsZCl7cmV0dXJuIGQ/YHJ1bi0ke2R9LXRhZy0ke2J9LmNzdmA6IiJ9LF9qc29uTmFtZShiLGQpe3JldHVybiBkP2BydW4tJHtkfS10YWctJHtifS5qc29uYDoiIn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNjYWxhci1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNjYWxhci1jYXJkIixwcm9wZXJ0aWVzOnt0YWc6U3RyaW5nLGRhdGFUb0xvYWQ6QXJyYXkseFR5cGU6U3RyaW5nLGFjdGl2ZTpCb29sZWFuLGlnbm9yZVlPdXRsaWVyczpCb29sZWFuLHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxzaG93RG93bkxpbmtzOkJvb2xlYW4sc21vb3RoaW5nRW5hYmxlZDpCb29sZWFuLHNtb290aGluZ1dlaWdodDpOdW1iZXIsdGFnTWV0YWRhdGE6T2JqZWN0LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyxfbG9hZERhdGFDYWxsYmFjazp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57Zj1mLm1hcChrPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqa1swXSksc3RlcDprWzFdLHNjYWxhcjprWzJdfSkpO2NvbnN0IGg9dGhpcy5fZ2V0U2VyaWVzTmFtZUZyb21EYXR1bShkKTtiLnNldFNlcmllc01ldGFkYXRhKGgsZCk7Yi5zZXRTZXJpZXNEYXRhKGgsCmYpfX0scmVhZE9ubHk6ITB9LGdldERhdGFMb2FkVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKHt0YWc6YixydW46ZH0pPT52Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgic2NhbGFycyIsIi9zY2FsYXJzIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6YixydW46ZH0pKX19LF9kb3dubG9hZFVybEZuOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGIsZCk9PnRoaXMuZ2V0RGF0YUxvYWRVcmwoe3RhZzpiLHJ1bjpkfSl9fSxyZXF1ZXN0RGF0YTpGdW5jdGlvbixfZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGI9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYil9fSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9sb2dTY2FsZUFjdGl2ZTpCb29sZWFuLF90b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe2NvbnN0IGI9CkdoLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TLnNsaWNlKCksZD1iLmZpbmRJbmRleChmPT4iTmFtZSI9PWYudGl0bGUpO2Iuc3BsaWNlKGQsMSx7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmY9PntmPWYuZGF0YXNldC5tZXRhZGF0YSgpLm1ldGE7cmV0dXJuIHRoaXMuX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGYpfX0pO3JldHVybiBifX19LHJlbG9hZCgpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLCF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9LF9yZXNldERvbWFpbigpe2NvbnN0IGI9dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpOwpiJiZiLnJlc2V0RG9tYWluKCl9LF91cGRhdGVEb3dubG9hZExpbmsoKXtjb25zdCBiPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5leHBvcnRBc1N2Z1N0cmluZygpO3RoaXMuJCQoIiNzdmdMaW5rIikuaHJlZj1gZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwke2J0b2EoYil9YH0sX3J1bnNGcm9tRGF0YShiKXtyZXR1cm4gYi5tYXAoZD0+ZC5ydW4pfSxfZ2V0RGF0YVNlcmllcygpe3JldHVybiB0aGlzLmRhdGFUb0xvYWQubWFwKGI9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYikpfSxfZ2V0U2VyaWVzTmFtZUZyb21EYXR1bSh7cnVuOmIsZXhwZXJpbWVudDpkPXtuYW1lOiJfZGVmYXVsdCJ9fSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KFtkLm5hbWUsYl0pfSxfZ2V0U2VyaWVzRGlzcGxheU5hbWVGcm9tRGF0dW0oYil7cmV0dXJuIGIucnVufSxfZ2V0Q29sb3JTY2FsZSgpe3JldHVybiBudWxsIT09dGhpcy5jb2xvclNjYWxlP3RoaXMuY29sb3JTY2FsZToKe3NjYWxlOmI9PntbLGJdPUpTT04ucGFyc2UoYik7cmV0dXJuIHBmLnJ1bnNDb2xvclNjYWxlKGIpfX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1yYW5nZS1iZWhhdmlvci9pcm9uLXJhbmdlLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uUmFuZ2VCZWhhdmlvcj17cHJvcGVydGllczp7dmFsdWU6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sbWluOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbWF4Ont0eXBlOk51bWJlcix2YWx1ZToxMDAsbm90aWZ5OiEwfSxzdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxLG5vdGlmeTohMH0scmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZSh2YWx1ZSwgbWluLCBtYXgsIHN0ZXApIl0sX2NhbGNSYXRpbzpmdW5jdGlvbihiKXtyZXR1cm4odGhpcy5fY2xhbXBWYWx1ZShiKS10aGlzLm1pbikvKHRoaXMubWF4LXRoaXMubWluKX0sX2NsYW1wVmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgubWluKHRoaXMubWF4LE1hdGgubWF4KHRoaXMubWluLHRoaXMuX2NhbGNTdGVwKGIpKSl9LF9jYWxjU3RlcDpmdW5jdGlvbihiKXtiPXBhcnNlRmxvYXQoYik7CmlmKCF0aGlzLnN0ZXApcmV0dXJuIGI7Yj1NYXRoLnJvdW5kKChiLXRoaXMubWluKS90aGlzLnN0ZXApO3JldHVybiAxPnRoaXMuc3RlcD9iLygxL3RoaXMuc3RlcCkrdGhpcy5taW46Yip0aGlzLnN0ZXArdGhpcy5taW59LF92YWxpZGF0ZVZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlKTt0aGlzLnZhbHVlPXRoaXMub2xkVmFsdWU9aXNOYU4oYik/dGhpcy5vbGRWYWx1ZTpiO3JldHVybiB0aGlzLnZhbHVlIT09Yn0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX3ZhbGlkYXRlVmFsdWUoKTt0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMudmFsdWUpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXByb2dyZXNzL3BhcGVyLXByb2dyZXNzLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXByb2dyZXNzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJhbmdlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlY29uZGFyeVByb2dyZXNzOnt0eXBlOk51bWJlcix2YWx1ZTowfSxzZWNvbmRhcnlSYXRpbzp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMH0saW5kZXRlcm1pbmF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfdG9nZ2xlSW5kZXRlcm1pbmF0ZSJ9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfZGlzYWJsZWRDaGFuZ2VkIn19LG9ic2VydmVyczpbIl9wcm9ncmVzc0NoYW5nZWQoc2Vjb25kYXJ5UHJvZ3Jlc3MsIHZhbHVlLCBtaW4sIG1heCwgaW5kZXRlcm1pbmF0ZSkiXSxob3N0QXR0cmlidXRlczp7cm9sZToicHJvZ3Jlc3NiYXIifSxfdG9nZ2xlSW5kZXRlcm1pbmF0ZTpmdW5jdGlvbihiKXt0aGlzLnRvZ2dsZUNsYXNzKCJpbmRldGVybWluYXRlIiwKYix0aGlzLiQucHJpbWFyeVByb2dyZXNzKX0sX3RyYW5zZm9ybVByb2dyZXNzOmZ1bmN0aW9uKGIsZCl7Yi5zdHlsZS50cmFuc2Zvcm09Yi5zdHlsZS53ZWJraXRUcmFuc2Zvcm09InNjYWxlWCgiK2QvMTAwKyIpIn0sX21haW5SYXRpb0NoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnByaW1hcnlQcm9ncmVzcyxiKX0sX3Byb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbihiLGQsZixoLGspe2I9dGhpcy5fY2xhbXBWYWx1ZShiKTtkPXRoaXMuX2NsYW1wVmFsdWUoZCk7dmFyIHQ9MTAwKnRoaXMuX2NhbGNSYXRpbyhiKSxsPTEwMCp0aGlzLl9jYWxjUmF0aW8oZCk7dGhpcy5fc2V0U2Vjb25kYXJ5UmF0aW8odCk7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnNlY29uZGFyeVByb2dyZXNzLHQpO3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsbCk7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz1iO2s/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciKToKdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGQpO3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixmKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsaCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLGI/InRydWUiOiJmYWxzZSIpfSxfaGlkZVNlY29uZGFyeVByb2dyZXNzOmZ1bmN0aW9uKGIpe3JldHVybiAwPT09Yn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1zbGlkZXIvcGFwZXItc2xpZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXNsaWRlciIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3IsUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9yLFBvbHltZXIuSXJvblJhbmdlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NuYXBzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxwaW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LHNlY29uZGFyeVByb2dyZXNzOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMCxvYnNlcnZlcjoiX3NlY29uZGFyeVByb2dyZXNzQ2hhbmdlZCJ9LGVkaXRhYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGltbWVkaWF0ZVZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sbWF4TWFya2Vyczp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGV4cGFuZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfSwKaWdub3JlQmFyVG91Y2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZHJhZ2dpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMCxub3RpZnk6ITB9LHRyYW5zaXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH0sbWFya2Vyczp7dHlwZTpBcnJheSxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl91cGRhdGVLbm9iKHZhbHVlLCBtaW4sIG1heCwgc25hcHMsIHN0ZXApIiwiX3ZhbHVlQ2hhbmdlZCh2YWx1ZSkiLCJfaW1tZWRpYXRlVmFsdWVDaGFuZ2VkKGltbWVkaWF0ZVZhbHVlKSIsIl91cGRhdGVNYXJrZXJzKG1heE1hcmtlcnMsIG1pbiwgbWF4LCBzbmFwcykiXSxob3N0QXR0cmlidXRlczp7cm9sZToic2xpZGVyIix0YWJpbmRleDowfSxrZXlCaW5kaW5nczp7bGVmdDoiX2xlZnRLZXkiLHJpZ2h0OiJfcmlnaHRLZXkiLCJkb3duIHBhZ2Vkb3duIGhvbWUiOiJfZGVjcmVtZW50S2V5IiwidXAgcGFnZXVwIGVuZCI6Il9pbmNyZW1lbnRLZXkifSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZUJhclRvdWNoJiZQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKHRoaXMuJC5zbGlkZXJCYXIsImF1dG8iKX0saW5jcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUrdGhpcy5zdGVwKX0sZGVjcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUtdGhpcy5zdGVwKX0sX3VwZGF0ZUtub2I6ZnVuY3Rpb24oYixkLGYpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixkKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsZik7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGIpO3RoaXMuX3Bvc2l0aW9uS25vYigxMDAqdGhpcy5fY2FsY1JhdGlvKGIpKX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgidmFsdWUtY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2ltbWVkaWF0ZVZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZHJhZ2dpbmc/CnRoaXMuZmlyZSgiaW1tZWRpYXRlLXZhbHVlLWNoYW5nZSIse2NvbXBvc2VkOiEwfSk6dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlfSxfc2Vjb25kYXJ5UHJvZ3Jlc3NDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz10aGlzLl9jbGFtcFZhbHVlKHRoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3MpfSxfZXhwYW5kS25vYjpmdW5jdGlvbigpe3RoaXMuX3NldEV4cGFuZCghMCl9LF9yZXNldEtub2I6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbERlYm91bmNlcigiZXhwYW5kS25vYiIpO3RoaXMuX3NldEV4cGFuZCghMSl9LF9wb3NpdGlvbktub2I6ZnVuY3Rpb24oYil7dGhpcy5fc2V0SW1tZWRpYXRlVmFsdWUodGhpcy5fY2FsY1N0ZXAodGhpcy5fY2FsY0tub2JQb3NpdGlvbihiKSkpO3RoaXMuX3NldFJhdGlvKDEwMCp0aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkpO3RoaXMuJC5zbGlkZXJLbm9iLnN0eWxlLmxlZnQ9dGhpcy5yYXRpbysiJSI7dGhpcy5kcmFnZ2luZyYmCih0aGlzLl9rbm9ic3RhcnR4PXRoaXMucmF0aW8qdGhpcy5fdy8xMDAsdGhpcy50cmFuc2xhdGUzZCgwLDAsMCx0aGlzLiQuc2xpZGVyS25vYikpfSxfY2FsY0tub2JQb3NpdGlvbjpmdW5jdGlvbihiKXtyZXR1cm4odGhpcy5tYXgtdGhpcy5taW4pKmIvMTAwK3RoaXMubWlufSxfb25UcmFjazpmdW5jdGlvbihiKXtiLnN0b3BQcm9wYWdhdGlvbigpO3N3aXRjaChiLmRldGFpbC5zdGF0ZSl7Y2FzZSAic3RhcnQiOnRoaXMuX3RyYWNrU3RhcnQoYik7YnJlYWs7Y2FzZSAidHJhY2siOnRoaXMuX3RyYWNrWChiKTticmVhaztjYXNlICJlbmQiOnRoaXMuX3RyYWNrRW5kKCl9fSxfdHJhY2tTdGFydDpmdW5jdGlvbigpe3RoaXMuX3NldFRyYW5zaXRpbmcoITEpO3RoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDt0aGlzLl9rbm9ic3RhcnR4PXRoaXMuX3N0YXJ0eD10aGlzLl94PXRoaXMucmF0aW8qdGhpcy5fdy8xMDA7dGhpcy5fbWlueD0tdGhpcy5fc3RhcnR4O3RoaXMuX21heHg9CnRoaXMuX3ctdGhpcy5fc3RhcnR4O3RoaXMuJC5zbGlkZXJLbm9iLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIik7dGhpcy5fc2V0RHJhZ2dpbmcoITApfSxfdHJhY2tYOmZ1bmN0aW9uKGIpe3RoaXMuZHJhZ2dpbmd8fHRoaXMuX3RyYWNrU3RhcnQoYik7dGhpcy5feD10aGlzLl9zdGFydHgrTWF0aC5taW4odGhpcy5fbWF4eCxNYXRoLm1heCh0aGlzLl9taW54LGIuZGV0YWlsLmR4Kih0aGlzLl9pc1JUTD8tMToxKSkpO3RoaXMuX3NldEltbWVkaWF0ZVZhbHVlKHRoaXMuX2NhbGNTdGVwKHRoaXMuX2NhbGNLbm9iUG9zaXRpb24odGhpcy5feC90aGlzLl93KjEwMCkpKTt0aGlzLnRyYW5zbGF0ZTNkKHRoaXMuX2NhbGNSYXRpbyh0aGlzLmltbWVkaWF0ZVZhbHVlKSp0aGlzLl93LXRoaXMuX2tub2JzdGFydHgrInB4IiwwLDAsdGhpcy4kLnNsaWRlcktub2IpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuc2xpZGVyS25vYi5zdHlsZTt0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpOwp0aGlzLl9zZXREcmFnZ2luZyghMSk7dGhpcy5fcmVzZXRLbm9iKCk7dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlO2IudHJhbnNmb3JtPWIud2Via2l0VHJhbnNmb3JtPSIiO3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2tub2Jkb3duOmZ1bmN0aW9uKGIpe3RoaXMuX2V4cGFuZEtub2IoKTtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5mb2N1cygpfSxfYmFydHJhY2s6ZnVuY3Rpb24oYil7dGhpcy5fYWxsb3dCYXJFdmVudChiKSYmdGhpcy5fb25UcmFjayhiKX0sX2JhcmNsaWNrOmZ1bmN0aW9uKGIpe3RoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDt2YXIgZD10aGlzLiQuc2xpZGVyQmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Q9KGIuZGV0YWlsLngtZC5sZWZ0KS90aGlzLl93KjEwMDt0aGlzLl9pc1JUTCYmKGQ9MTAwLWQpO3ZhciBmPXRoaXMucmF0aW87dGhpcy5fc2V0VHJhbnNpdGluZyghMCk7dGhpcy5fcG9zaXRpb25Lbm9iKGQpOwpmPT09dGhpcy5yYXRpbyYmdGhpcy5fc2V0VHJhbnNpdGluZyghMSk7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0pO2IucHJldmVudERlZmF1bHQoKTt0aGlzLmZvY3VzKCl9LF9iYXJkb3duOmZ1bmN0aW9uKGIpe3RoaXMuX2FsbG93QmFyRXZlbnQoYikmJih0aGlzLmRlYm91bmNlKCJleHBhbmRLbm9iIix0aGlzLl9leHBhbmRLbm9iLDYwKSx0aGlzLl9iYXJjbGljayhiKSl9LF9rbm9iVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihiKXtiLnRhcmdldD09PXRoaXMuJC5zbGlkZXJLbm9iJiZ0aGlzLl9zZXRUcmFuc2l0aW5nKCExKX0sX3VwZGF0ZU1hcmtlcnM6ZnVuY3Rpb24oYixkLGYsaCl7aHx8dGhpcy5fc2V0TWFya2VycyhbXSk7ZD1NYXRoLnJvdW5kKChmLWQpL3RoaXMuc3RlcCk7ZD5iJiYoZD1iKTtpZigwPmR8fCFpc0Zpbml0ZShkKSlkPTA7dGhpcy5fc2V0TWFya2VycyhBcnJheShkKSl9LF9tZXJnZUNsYXNzZXM6ZnVuY3Rpb24oYil7cmV0dXJuIE9iamVjdC5rZXlzKGIpLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gYltkXX0pLmpvaW4oIiAiKX0sCl9nZXRDbGFzc05hbWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21lcmdlQ2xhc3Nlcyh7ZGlzYWJsZWQ6dGhpcy5kaXNhYmxlZCxwaW46dGhpcy5waW4sc25hcHM6dGhpcy5zbmFwcyxyaW5nOnRoaXMuaW1tZWRpYXRlVmFsdWU8PXRoaXMubWluLGV4cGFuZDp0aGlzLmV4cGFuZCxkcmFnZ2luZzp0aGlzLmRyYWdnaW5nLHRyYW5zaXRpbmc6dGhpcy50cmFuc2l0aW5nLGVkaXRhYmxlOnRoaXMuZWRpdGFibGV9KX0sX2FsbG93QmFyRXZlbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIXRoaXMuaWdub3JlQmFyVG91Y2h8fGIuZGV0YWlsLnNvdXJjZUV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudH0sZ2V0IF9pc1JUTCgpe3ZvaWQgMD09PXRoaXMuX19pc1JUTCYmKHRoaXMuX19pc1JUTD0icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbik7cmV0dXJuIHRoaXMuX19pc1JUTH0sX2xlZnRLZXk6ZnVuY3Rpb24oYil7dGhpcy5faXNSVEw/dGhpcy5faW5jcmVtZW50S2V5KGIpOgp0aGlzLl9kZWNyZW1lbnRLZXkoYil9LF9yaWdodEtleTpmdW5jdGlvbihiKXt0aGlzLl9pc1JUTD90aGlzLl9kZWNyZW1lbnRLZXkoYik6dGhpcy5faW5jcmVtZW50S2V5KGIpfSxfaW5jcmVtZW50S2V5OmZ1bmN0aW9uKGIpe3RoaXMuZGlzYWJsZWR8fCgiZW5kIj09PWIuZGV0YWlsLmtleT90aGlzLnZhbHVlPXRoaXMubWF4OnRoaXMuaW5jcmVtZW50KCksdGhpcy5maXJlKCJjaGFuZ2UiKSxiLnByZXZlbnREZWZhdWx0KCkpfSxfZGVjcmVtZW50S2V5OmZ1bmN0aW9uKGIpe3RoaXMuZGlzYWJsZWR8fCgiaG9tZSI9PT1iLmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1pbjp0aGlzLmRlY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksYi5wcmV2ZW50RGVmYXVsdCgpKX0sX2NoYW5nZVZhbHVlOmZ1bmN0aW9uKGIpe3RoaXMudmFsdWU9Yi50YXJnZXQudmFsdWU7dGhpcy5maXJlKCJjaGFuZ2UiLHtjb21wb3NlZDohMH0pfSxfaW5wdXRLZXlEb3duOmZ1bmN0aW9uKGIpe2Iuc3RvcFByb3BhZ2F0aW9uKCl9LApfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5zbGlkZXJLbm9iO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX0sX2ZvY3VzZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2ImJnRoaXMuZW5zdXJlUmlwcGxlKCk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHRoaXMuX3JpcHBsZS5ob2xkRG93bj1iKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNtb290aGluZy1pbnB1dC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zbW9vdGhpbmctaW5wdXQiLHByb3BlcnRpZXM6e3N0ZXA6TnVtYmVyLG1heDpOdW1iZXIsbWluOk51bWJlcix3ZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOi42LG5vdGlmeTohMH0sX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyOnt0eXBlOk51bWJlcixub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQifSxfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Ont0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkIn19LF91cGRhdGVXZWlnaHQ6Xy5kZWJvdW5jZShmdW5jdGlvbihiKXt0aGlzLndlaWdodD1ifSwyNTApLF9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9dGhpcy5faW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIudG9TdHJpbmcoKTsKdGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyx0aGlzLl9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcil9LF9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkOmZ1bmN0aW9uKCl7MD4rdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0P3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD0iMCI6MTwrdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0JiYodGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PSIxIik7dmFyIGI9K3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dDtpc05hTihiKXx8dGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyxiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNjYWxhci1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc2NhbGFyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3Nob3dEb3dubG9hZExpbmtzOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOnBkLmdldEJvb2xlYW5Jbml0aWFsaXplcigiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLG9ic2VydmVyOiJfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlciJ9LF9zbW9vdGhpbmdXZWlnaHQ6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXROdW1iZXJJbml0aWFsaXplcigiX3Ntb290aGluZ1dlaWdodCIse2RlZmF1bHRWYWx1ZTouNn0pLG9ic2VydmVyOiJfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXIifSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoX3Ntb290aGluZ1dlaWdodCkifSxfaWdub3JlWU91dGxpZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6cGQuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfaWdub3JlWU91dGxpZXJzIiwKe2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyIn0sX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpyZy5YVHlwZS5TVEVQfSxfc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfZ2V0Q2F0ZWdvcnlJdGVtS2V5Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT5iPT5iLnRhZ30sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyKDUwKX19LGJlaGF2aW9yczpbcWQuQXJyYXlVcGRhdGVIZWxwZXJdLG9ic2VydmVyczpbIl91cGRhdGVDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIl0sCl9zaG93RG93bmxvYWRMaW5rc09ic2VydmVyOnBkLmdldEJvb2xlYW5PYnNlcnZlcigiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlcjpwZC5nZXROdW1iZXJPYnNlcnZlcigiX3Ntb290aGluZ1dlaWdodCIse2RlZmF1bHRWYWx1ZTouNn0pLF9pZ25vcmVZT3V0bGllcnNPYnNlcnZlcjpwZC5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKGIpe3JldHVybiAwPGJ9LF9nZXRDYXRlZ29yeUtleShiKXtyZXR1cm4gYi5tZXRhZGF0YS50eXBlPT0kYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFM/IiI6Yi5uYW1lfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT4Ke3RoaXMuX3JlbG9hZENoYXJ0cygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJzY2FsYXJzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5PYmplY3Qua2V5cyhoKSk7Zj12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkQ2hhcnRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXNjYWxhci1jYXJkIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfdXBkYXRlQ2F0ZWdvcmllcyhiLGQsZil7Yj1fLm1hcFZhbHVlcyhiLGg9Pk9iamVjdC5rZXlzKGgpKTsKZD0kYy5jYXRlZ29yaXplVGFncyhiLGQsZik7ZC5mb3JFYWNoKGg9PntoLml0ZW1zPWguaXRlbXMubWFwKGs9Pih7dGFnOmsudGFnLHNlcmllczprLnJ1bnMubWFwKHQ9Pih7cnVuOnQsdGFnOmsudGFnfSkpfSkpfSk7dGhpcy51cGRhdGVBcnJheVByb3AoIl9jYXRlZ29yaWVzIixkLHRoaXMuX2dldENhdGVnb3J5S2V5KX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtjb25zdCBoPWYudGFnLGs9e307Zi5zZXJpZXMuZm9yRWFjaCgoe3J1bjpwfSk9PntrW3BdPWRbcF1baF19KTtmPWgucmVwbGFjZSgvXC9zY2FsYXJfc3VtbWFyeSQvLCIiKTtsZXQge2Rlc2NyaXB0aW9uOnQsZGlzcGxheU5hbWU6bH09cmYuYWdncmVnYXRlVGFnSW5mbyhrLGYpO2IubWV0YWRhdGEudHlwZT09JGMuQ2F0ZWdvcnlUeXBlLlBSRUZJWF9HUk9VUCYmbC5zdGFydHNXaXRoKGIubmFtZSsiLyIpJiYobD1sLnNsaWNlKGIubmFtZS5sZW5ndGgrMSkpO3JldHVybntkZXNjcmlwdGlvbjp0LGRpc3BsYXlOYW1lOmx9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItaGVscGVycy5qcwp2YXIgVGk7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGgsayx0LGwscCl7dGhpcy5ydW49aDt0aGlzLnRhZz1rO3RoaXMubmFtZT10O3RoaXMuc2NhbGFyRGF0YT1sO3RoaXMuc3ltYm9sPXB9Z2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9c2V0RGF0YShoKXt0aGlzLnNjYWxhckRhdGE9aH1nZXREYXRhKCl7cmV0dXJuIHRoaXMuc2NhbGFyRGF0YX1nZXRSdW4oKXtyZXR1cm4gdGhpcy5ydW59Z2V0VGFnKCl7cmV0dXJuIHRoaXMudGFnfWdldFN5bWJvbCgpe3JldHVybiB0aGlzLnN5bWJvbH19Yi5EYXRhU2VyaWVzPWQ7Yi5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lPWZ1bmN0aW9uKGgsayl7cmV0dXJuYCR7a30gKCR7aH0pYH07Y2xhc3MgZntjb25zdHJ1Y3RvcihoKXt0aGlzLnJ1bkJhc2VkQ29sb3JTY2FsZT1ofXNjYWxlKGgpe3JldHVybiB0aGlzLnJ1bkJhc2VkQ29sb3JTY2FsZS5zY2FsZSh0aGlzLnBhcnNlUnVuTmFtZShoKSl9cGFyc2VSdW5OYW1lKGgpe3JldHVybihoPWgubWF0Y2goL1woKC4qKVwpJC8pKT8KaFsxXToiIn19Yi5EYXRhU2VyaWVzQ29sb3JTY2FsZT1mfSkoVGl8fChUaT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCIscHJvcGVydGllczp7cnVuczpBcnJheSx4VHlwZTpTdHJpbmcsYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITB9LHRpdGxlOlN0cmluZyxtYXJnaW5DaGFydFNlcmllczpBcnJheSxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25sb2FkTGlua3M6Qm9vbGVhbix0YWdNZXRhZGF0YTpPYmplY3QsdG9vbHRpcFNvcnRpbmdNZXRob2Q6U3RyaW5nLF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpuZXcgVGkuRGF0YVNlcmllc0NvbG9yU2NhbGUoe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSkscmVhZE9ubHk6ITB9LF90YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRhZ0ZpbHRlcihtYXJnaW5DaGFydFNlcmllcykifSxfdGFnRmlsdGVySW52YWxpZDpCb29sZWFuLF9uYW1lVG9EYXRhU2VyaWVzOnt0eXBlOk9iamVjdCwKdmFsdWU6KCk9Pih7fSl9LF9zZXJpZXNOYW1lczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlU2VyaWVzTmFtZXMoX25hbWVUb0RhdGFTZXJpZXMsIHJ1bnMpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfZGF0YVVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT57Y29uc3QgZD10aGlzLl90YWdGaWx0ZXI7cmV0dXJuIHZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvc2NhbGFycyIpLHt0YWc6ZCxydW46Yn0pfX19LF9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9tYXRjaGVzTGlzdE9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdGl0bGVEaXNwbGF5U3RyaW5nOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcodGl0bGUpIn0sCl9maWxsQXJlYTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6e2xvd2VyQWNjZXNzb3I6Yj0+Yi5sb3dlcixoaWdoZXJBY2Nlc3NvcjpiPT5iLnVwcGVyfX0sX3Rvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7Y29uc3QgYj1yZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKSxkPWY9PmlzTmFOKGYpPyJOYU4iOmIoZik7cmV0dXJuW3t0aXRsZToiTmFtZSIsZXZhbHVhdGU6Zj0+Zi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJWYWx1ZSIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnNjYWxhcil9LHt0aXRsZToiTG93ZXIgTWFyZ2luIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0ubG93ZXIpfSx7dGl0bGU6IlVwcGVyIE1hcmdpbiIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnVwcGVyKX0se3RpdGxlOiJTdGVwIixldmFsdWF0ZTpmPT5yZy5zdGVwRm9ybWF0dGVyKGYuZGF0dW0uc3RlcCl9LHt0aXRsZToiVGltZSIsCmV2YWx1YXRlOmY9PnJnLnRpbWVGb3JtYXR0ZXIoZi5kYXR1bS53YWxsX3RpbWUpfSx7dGl0bGU6IlJlbGF0aXZlIixldmFsdWF0ZTpmPT5yZy5yZWxhdGl2ZUZvcm1hdHRlcihyZy5yZWxhdGl2ZUFjY2Vzc29yKGYuZGF0dW0sLTEsZi5kYXRhc2V0KSl9XX19LF9taXNzaW5nVGFnczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3N0ZXBzTWlzbWF0Y2g6T2JqZWN0fSxvYnNlcnZlcnM6WyJfdXBkYXRlQ2hhcnQoX25hbWVUb0RhdGFTZXJpZXMpIiwiX3JlZnJlc2hEYXRhU2VyaWVzKF90YWdGaWx0ZXIpIl0scmVsb2FkKCl7dGhpcy4kLmxvYWRlci5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kLmxvYWRlci5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwKIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKX0sX3Jlc2V0RG9tYWluKCl7Y29uc3QgYj10aGlzLiQubG9hZGVyO2ImJmIucmVzZXREb21haW4oKX0sX2NzdlVybChiLGQpe2lmKCFkKXJldHVybiIiO2I9dGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCk7cmV0dXJuIHZjLmFkZFBhcmFtcyhiLHtmb3JtYXQ6ImNzdiJ9KX0sX2pzb25VcmwoYixkKXtpZighZClyZXR1cm4iIjtiPXRoaXMuX2Rvd25sb2FkRGF0YVVybChiLGQpO3JldHVybiB2Yy5hZGRQYXJhbXMoYix7Zm9ybWF0OiJqc29uIn0pfSxfZG93bmxvYWREYXRhVXJsKGIsZCl7Yj1iW2RdO2I9e3RhZzpiLmdldFRhZygpLHJ1bjpiLmdldFJ1bigpfTtyZXR1cm4gdmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9kb3dubG9hZF9kYXRhIiksYil9LF9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKGIpe3JldHVybihkLGYsaCk9PntpZihoLnJlZ2V4X3ZhbGlkKXt2YXIgaz1fLmNsb25lKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLAp0PVtdO18uZm9yRWFjaChiLGw9Pnt2YXIgcD0hMSxtPWgudGFnX3RvX2V2ZW50c1tsLnZhbHVlXTtjb25zdCBuPWgudGFnX3RvX2V2ZW50c1tsLmxvd2VyXSxxPWgudGFnX3RvX2V2ZW50c1tsLnVwcGVyXTtfLmlzVW5kZWZpbmVkKG0pJiYodC5wdXNoKGwudmFsdWUpLHA9ITApO18uaXNVbmRlZmluZWQobikmJih0LnB1c2gobC5sb3dlcikscD0hMCk7Xy5pc1VuZGVmaW5lZChxKSYmKHQucHVzaChsLnVwcGVyKSxwPSEwKTtpZighcCl7dmFyIHU9eT0+eVsxXTtpZihwPXRoaXMuX2ZpbmRTdGVwTWlzbWF0Y2gobCxtLm1hcCh1KSxuLm1hcCh1KSxxLm1hcCh1KSkpdGhpcy5zZXQoIl9zdGVwc01pc21hdGNoIixwKTtlbHNle3ZhciB4PXk9PnlbMl07cD1tLm1hcCgoeSx3KT0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKnlbMF0pLHN0ZXA6dSh5KSxzY2FsYXI6eCh5KSxsb3dlcjp4KG5bd10pLHVwcGVyOngocVt3XSl9KSk7bT1UaS5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lKGYsbC52YWx1ZSk7CnZhciBBPWtbbV07QT9BLnNldERhdGEocCk6KGw9dGhpcy5fY3JlYXRlTmV3RGF0YVNlcmllcyhmLGwudmFsdWUsbSxwKSxrW21dPWwpfX19KTt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLGspO2Q9Xy5maW5kSW5kZXgodGhpcy5fbWlzc2luZ1RhZ3MsbD0+bC5ydW49PT1mKTtpZih0Lmxlbmd0aCYmMyE9dC5sZW5ndGgpe2NvbnN0IGw9e3J1bjpmLHRhZ3M6dH07MDw9ZD90aGlzLnNwbGljZSgiX21pc3NpbmdUYWdzIixkLDEsbCk6dGhpcy5wdXNoKCJfbWlzc2luZ1RhZ3MiLGwpfWVsc2UgMDw9ZCYmdGhpcy5zcGxpY2UoIl9taXNzaW5nVGFncyIsZCwxKX1lbHNlIHRoaXMuc2V0KCJfdGFnRmlsdGVySW52YWxpZCIsITApfX0sX2ZpbmRTdGVwTWlzbWF0Y2goYixkLGYsaCl7cmV0dXJuIF8uaXNFcXVhbChmLGQpJiZfLmlzRXF1YWwoaCxkKT9udWxsOntzZXJpZXNPYmplY3Q6Yix2YWx1ZVN0ZXBzOmQsbG93ZXJTdGVwczpmLHVwcGVyU3RlcHM6aH19LF9jcmVhdGVOZXdEYXRhU2VyaWVzKGIsCmQsZixoKXt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtiXXw9MDtkPW5ldyBUaS5EYXRhU2VyaWVzKGIsZCxmLGgscmcuU1lNQk9MU19MSVNUW3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2JdXSk7dGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbYl09KHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2JdKzEpJXJnLlNZTUJPTFNfTElTVC5sZW5ndGg7cmV0dXJuIGR9LF91cGRhdGVDaGFydChiKXtfLmZvck93bihiLGQ9Pnt0aGlzLiQubG9hZGVyLnNldFNlcmllc0RhdGEoZC5nZXROYW1lKCksZC5nZXREYXRhKCkpfSl9LF9jb21wdXRlU2VyaWVzTmFtZXMoKXtjb25zdCBiPW5ldyBTZXQodGhpcy5ydW5zKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5fbmFtZVRvRGF0YVNlcmllcykuZmlsdGVyKChbLGRdKT0+Yi5oYXMoZC5ydW4pKS5tYXAoKFtkXSk9PmQpfSxfZGV0ZXJtaW5lQ29sb3IoYixkKXtyZXR1cm4gYi5zY2FsZShkKX0sCl9yZWZyZXNoRGF0YVNlcmllcygpe3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIse30pfSxfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKXtyZXR1cm4gYj0+dGhpcy5fbmFtZVRvRGF0YVNlcmllc1tiXS5nZXRTeW1ib2woKS5tZXRob2QoKX0sX2RldGVybWluZVN5bWJvbChiLGQpe3JldHVybiBiW2RdLmdldFN5bWJvbCgpLmNoYXJhY3Rlcn0sX2NvbXB1dGVUYWdGaWx0ZXIoYil7cmV0dXJuIF8uZmxhdHRlbihiLm1hcChkPT5bZC52YWx1ZSxkLmxvd2VyLGQudXBwZXJdKSkubWFwKGQ9PiIoIit0aGlzLl9lc2NhcGVSZWdleENoYXJhY3RlcnMoZCkrIikiKS5qb2luKCJ8Iil9LF9lc2NhcGVSZWdleENoYXJhY3RlcnMoYil7cmV0dXJuIGIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csIlxcJFx4MjYiKX0sX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihiKXtyZXR1cm4gYj8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSJ9LF90b2dnbGVNYXRjaGVzT3Blbigpe3RoaXMuc2V0KCJfbWF0Y2hlc0xpc3RPcGVuZWQiLAohdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQpfSxfY29tcHV0ZVRpdGxlRGlzcGxheVN0cmluZyhiKXtyZXR1cm4gYnx8InVudGl0bGVkIn0sX3NlcGFyYXRlV2l0aENvbW1hcyhiKXtyZXR1cm4gYi5qb2luKCIsICIpfSxfdG9nZ2xlTWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW4oKXt0aGlzLnNldCgiX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQiLCF0aGlzLl9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkKX0sX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKCl7Y29uc3QgYj10aGlzLiQkKCIjbWF0Y2gtbGlzdC1yZXBlYXQiKTtiJiZ0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLm1hdGNoLWxpc3QtZW50cnkiKS5mb3JFYWNoKGQ9Pntjb25zdCBmPWIuaXRlbUZvckVsZW1lbnQoZCk7ZC5zdHlsZS5jb2xvcj10aGlzLl9kZXRlcm1pbmVDb2xvcih0aGlzLl9jb2xvclNjYWxlLGYpfSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXkseFR5cGU6U3RyaW5nLGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSx0aXRsZTpTdHJpbmcsdGFnUmVnZXhlczpBcnJheSxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25sb2FkTGlua3M6Qm9vbGVhbixzbW9vdGhpbmdFbmFibGVkOkJvb2xlYW4sc21vb3RoaW5nV2VpZ2h0Ok51bWJlcix0YWdNZXRhZGF0YTpPYmplY3QsdG9vbHRpcFNvcnRpbmdNZXRob2Q6U3RyaW5nLF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpuZXcgVGkuRGF0YVNlcmllc0NvbG9yU2NhbGUoe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSkscmVhZE9ubHk6ITB9LF90YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRhZ0ZpbHRlcih0YWdSZWdleGVzKSJ9LF9uYW1lVG9EYXRhU2VyaWVzOnt0eXBlOk9iamVjdCwKdmFsdWU6KCk9Pih7fSl9LF9zZXJpZXNOYW1lczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlU2VyaWVzTmFtZXMoX25hbWVUb0RhdGFTZXJpZXMsIHJ1bnMpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfZGF0YVVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT57Y29uc3QgZD10aGlzLl90YWdGaWx0ZXI7cmV0dXJuIHZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvc2NhbGFycyIpLHt0YWc6ZCxydW46Yn0pfX19LF9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9tYXRjaGVzTGlzdE9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdGl0bGVEaXNwbGF5U3RyaW5nOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcodGl0bGUpIn19LApvYnNlcnZlcnM6WyJfdXBkYXRlQ2hhcnQoX25hbWVUb0RhdGFTZXJpZXMpIiwiX3JlZnJlc2hEYXRhU2VyaWVzKF90YWdGaWx0ZXIpIl0scmVsb2FkKCl7dGhpcy4kLmxvYWRlci5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kLmxvYWRlci5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwhdGhpcy5fbG9nU2NhbGVBY3RpdmUpfSxfcmVzZXREb21haW4oKXtjb25zdCBiPXRoaXMuJC5sb2FkZXI7YiYmYi5yZXNldERvbWFpbigpfSxfY3N2VXJsKGIsZCl7aWYoIWQpcmV0dXJuIiI7Yj10aGlzLl9kb3dubG9hZERhdGFVcmwoYixkKTtyZXR1cm4gdmMuYWRkUGFyYW1zKGIse2Zvcm1hdDoiY3N2In0pfSxfanNvblVybChiLGQpe2lmKCFkKXJldHVybiIiO2I9dGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCk7cmV0dXJuIHZjLmFkZFBhcmFtcyhiLAp7Zm9ybWF0OiJqc29uIn0pfSxfZG93bmxvYWREYXRhVXJsKGIsZCl7Yj1iW2RdO2I9e3RhZzpiLmdldFRhZygpLHJ1bjpiLmdldFJ1bigpfTtyZXR1cm4gdmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9kb3dubG9hZF9kYXRhIiksYil9LF9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCl7cmV0dXJuKGIsZCxmKT0+e2lmKGYucmVnZXhfdmFsaWQpe2NvbnN0IGg9Xy5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKTtfLmZvck93bihmLnRhZ190b19ldmVudHMsKGssdCk9Pntjb25zdCBsPWsubWFwKG09Pih7d2FsbF90aW1lOm5ldyBEYXRlKDFFMyptWzBdKSxzdGVwOm1bMV0sc2NhbGFyOm1bMl19KSk7az1UaS5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lKGQsdCk7Y29uc3QgcD1oW2tdO3A/cC5zZXREYXRhKGwpOihfLmlzVW5kZWZpbmVkKHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdKSYmKHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdPQowKSx0PW5ldyBUaS5EYXRhU2VyaWVzKGQsdCxrLGwscmcuU1lNQk9MU19MSVNUW3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdXSksaFtrXT10LHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdPSh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtkXSsxKSVyZy5TWU1CT0xTX0xJU1QubGVuZ3RoKX0pO3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIsaCl9fX0sX3VwZGF0ZUNoYXJ0KGIpe09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtkLGZdKT0+e3RoaXMuJC5sb2FkZXIuc2V0U2VyaWVzRGF0YShkLGYuZ2V0RGF0YSgpKX0pfSxfY29tcHV0ZVNlbGVjdGVkUnVuc1NldChiKXtjb25zdCBkPXt9O18uZm9yRWFjaChiLGY9PntkW2ZdPTF9KTtyZXR1cm4gZH0sX2NvbXB1dGVTZXJpZXNOYW1lcygpe2NvbnN0IGI9bmV3IFNldCh0aGlzLnJ1bnMpO3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKS5maWx0ZXIoKFssCmRdKT0+Yi5oYXMoZC5ydW4pKS5tYXAoKFtkXSk9PmQpfSxfZGV0ZXJtaW5lQ29sb3IoYixkKXtyZXR1cm4gYi5zY2FsZShkKX0sX3JlZnJlc2hEYXRhU2VyaWVzKCl7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIix7fSl9LF9jcmVhdGVTeW1ib2xGdW5jdGlvbigpe3JldHVybiBiPT50aGlzLl9uYW1lVG9EYXRhU2VyaWVzW2JdLmdldFN5bWJvbCgpLm1ldGhvZCgpfSxfZGV0ZXJtaW5lU3ltYm9sKGIsZCl7cmV0dXJuIGJbZF0uZ2V0U3ltYm9sKCkuY2hhcmFjdGVyfSxfY29tcHV0ZVRhZ0ZpbHRlcihiKXtyZXR1cm4gMT09PWIubGVuZ3RoP2JbMF06Yi5tYXAoZD0+IigiK2QrIikiKS5qb2luKCJ8Iil9LF9nZXRUb2dnbGVNYXRjaGVzSWNvbihiKXtyZXR1cm4gYj8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSJ9LF90b2dnbGVNYXRjaGVzT3Blbigpe3RoaXMuc2V0KCJfbWF0Y2hlc0xpc3RPcGVuZWQiLCF0aGlzLl9tYXRjaGVzTGlzdE9wZW5lZCl9LF9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKGIpe3JldHVybiBifHwKInVudGl0bGVkIn0sX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKCl7Y29uc3QgYj10aGlzLiQkKCIjbWF0Y2gtbGlzdC1yZXBlYXQiKTtiJiZ0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLm1hdGNoLWxpc3QtZW50cnkiKS5mb3JFYWNoKGQ9Pntjb25zdCBmPWIuaXRlbUZvckVsZW1lbnQoZCk7ZC5zdHlsZS5jb2xvcj10aGlzLl9kZXRlcm1pbmVDb2xvcih0aGlzLl9jb2xvclNjYWxlLGYpfSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQvdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcig1MCl9LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuQ2FuY2VsbGVyfSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9zaG93RG93bmxvYWRMaW5rczp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXIifSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoX3Ntb290aGluZ1dlaWdodCkifSxfc21vb3RoaW5nV2VpZ2h0Ont0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6cGQuZ2V0TnVtYmVySW5pdGlhbGl6ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLAp7ZGVmYXVsdFZhbHVlOi42fSksb2JzZXJ2ZXI6Il9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlciJ9LF9pZ25vcmVZT3V0bGllcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTpwZC5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9pZ25vcmVZT3V0bGllcnNPYnNlcnZlciJ9LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfbGF5b3V0Ok9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfbGF5b3V0KSJ9LF9vcGVuZWRDYXRlZ29yaWVzOnt0eXBlOk9iamVjdH0sX2FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCksZD10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+CntmLmNhbmNlbGxlZHx8KHRoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwhZi52YWx1ZS5jdXN0b21fc2NhbGFycyksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZXRyaWV2ZUxheW91dEFuZERhdGEoKSl9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZCl9LF9yZWxvYWRDaGFydHMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCwgdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9yZXRyaWV2ZUxheW91dEFuZERhdGEoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9sYXlvdXQiKSxkPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT57Zi5jYW5jZWxsZWR8fCh0aGlzLnNldCgiX2xheW91dCIsZi52YWx1ZSksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZWxvYWRDaGFydHMoKSl9KTsKdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfSxfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcjpwZC5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXI6cGQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI6cGQuZ2V0Qm9vbGVhbk9ic2VydmVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChiKXtyZXR1cm4gMDxifSxfbWFrZUNhdGVnb3JpZXMoYil7aWYoIWIuY2F0ZWdvcnkpcmV0dXJuW107bGV0IGQ9ITE7dGhpcy5fb3BlbmVkQ2F0ZWdvcmllc3x8KGQ9ITAsdGhpcy5fb3BlbmVkQ2F0ZWdvcmllcz17fSk7cmV0dXJuIGIuY2F0ZWdvcnkubWFwKGY9Pgp7ZCYmIWYuY2xvc2VkJiYodGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tmLnRpdGxlXT0hMCk7cmV0dXJue25hbWU6Zi50aXRsZSxpdGVtczpmLmNoYXJ0LG1ldGFkYXRhOntvcGVuZWQ6ISF0aGlzLl9vcGVuZWRDYXRlZ29yaWVzW2YudGl0bGVdfX19KX0sX2NhdGVnb3J5T3BlbmVkVG9nZ2xlZChiKXtiPWIudGFyZ2V0O2Iub3BlbmVkP3RoaXMuX29wZW5lZENhdGVnb3JpZXNbYi5jYXRlZ29yeS5uYW1lXT0hMDpkZWxldGUgdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tiLmNhdGVnb3J5Lm5hbWVdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltYWdlLWRhc2hib2FyZC90Zi1pbWFnZS1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaW1hZ2UtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcixvZlNhbXBsZXM6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxhY3R1YWxTaXplOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxicmlnaHRuZXNzQWRqdXN0bWVudDp7dHlwZTpOdW1iZXIsdmFsdWU6LjV9LGNvbnRyYXN0UGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MH0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXRhZGF0YUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9pbWFnZUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LF9zdGVwSW5kZXg6e3R5cGU6TnVtYmVyLApub3RpZnk6ITB9LF9jdXJyZW50U3RlcDp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXAoX3N0ZXBzLCBfc3RlcEluZGV4KSJ9LF9oYXNBdExlYXN0T25lU3RlcDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKF9zdGVwcykifSxfaGFzTXVsdGlwbGVTdGVwczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoX3N0ZXBzKSJ9LF9zdGVwVmFsdWU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVN0ZXBWYWx1ZShfY3VycmVudFN0ZXApIn0sX2N1cnJlbnRXYWxsVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFdhbGxUaW1lKF9jdXJyZW50U3RlcCkifSxfbWF4U3RlcEluZGV4Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhTdGVwSW5kZXgoX3N0ZXBzKSJ9LF9zYW1wbGVUZXh0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTYW1wbGVUZXh0KHNhbXBsZSkifSwKX2hhc011bHRpcGxlU2FtcGxlczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpIn0sX2lzSW1hZ2VMb2FkaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIiwiX3VwZGF0ZUltYWdlVXJsKF9jdXJyZW50U3RlcCwgYnJpZ2h0bmVzc0FkanVzdG1lbnQsIGNvbnRyYXN0UGVyY2VudGFnZSkiXSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChiKXtyZXR1cm4hIWImJjA8Yi5sZW5ndGh9LF9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhiKXtyZXR1cm4hIWImJjE8Yi5sZW5ndGh9LF9jb21wdXRlQ3VycmVudFN0ZXAoYixkKXtyZXR1cm4gYltkXXx8bnVsbH0sX2NvbXB1dGVTdGVwVmFsdWUoYil7cmV0dXJuIGI/Yi5zdGVwOjB9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lKGIpe3JldHVybiBiPwpIaC5mb3JtYXREYXRlKGIud2FsbF90aW1lKToiIn0sX2NvbXB1dGVNYXhTdGVwSW5kZXgoYil7cmV0dXJuIGIubGVuZ3RoLTF9LF9jb21wdXRlU2FtcGxlVGV4dChiKXtyZXR1cm5gJHtiKzF9YH0sX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMoYil7cmV0dXJuIDE8Yn0sX2dldEFyaWFFeHBhbmRlZCgpe3JldHVybiB0aGlzLmFjdHVhbFNpemU/InRydWUiOiJmYWxzZSJ9LGF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITA7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7aWYodGhpcy5fYXR0YWNoZWQpe3RoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBiPXZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL2ltYWdlcyIpLHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVuLHNhbXBsZTp0aGlzLnNhbXBsZX0pLGQ9dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwoZj1mLnZhbHVlLm1hcCh0aGlzLl9jcmVhdGVTdGVwRGF0dW0uYmluZCh0aGlzKSksCnRoaXMuc2V0KCJfc3RlcHMiLGYpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixmLmxlbmd0aC0xKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkKX19LF9jcmVhdGVTdGVwRGF0dW0oYil7bGV0IGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbmRpdmlkdWFsSW1hZ2UiKTtkPXZjLmFkZFBhcmFtcyhkLHt0czpiLndhbGxfdGltZX0pO2QrPSJceDI2IitiLnF1ZXJ5O3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmIud2FsbF90aW1lKSxzdGVwOmIuc3RlcCx1cmw6ZH19LF91cGRhdGVJbWFnZVVybChiLGQsZil7aWYoYil7dmFyIGg9bmV3IEltYWdlO3RoaXMuX2ltYWdlQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO2gub25sb2FkPWgub25lcnJvcj10aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxsYWJsZShrPT57ay5jYW5jZWxsZWR8fChrPXRoaXMuJCQoIiNtYWluLWltYWdlLWNvbnRhaW5lciIpLGsuaW5uZXJIVE1MPSIiLFBvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGgpLAp0aGlzLnNldCgiX2lzSW1hZ2VMb2FkaW5nIiwhMSkpfSkuYmluZCh0aGlzKTtoLnN0eWxlLmZpbHRlcj1gY29udHJhc3QoJHtmfSUpIGA7aC5zdHlsZS5maWx0ZXIrPWBicmlnaHRuZXNzKCR7ZH0pYDt0aGlzLnNldCgiX2lzSW1hZ2VMb2FkaW5nIiwhMCk7aC5zcmM9Yi51cmx9fSxfaGFuZGxlVGFwKCl7dGhpcy5zZXQoImFjdHVhbFNpemUiLCF0aGlzLmFjdHVhbFNpemUpfSxfdG9Mb2NhbGVTdHJpbmcoYil7cmV0dXJuIGIudG9Mb2NhbGVTdHJpbmcoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbWFnZS1kYXNoYm9hcmQvdGYtaW1hZ2UtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWltYWdlLWRhc2hib2FyZCIscHJvcGVydGllczp7X3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX2FjdHVhbFNpemU6Qm9vbGVhbixfZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50Ont0eXBlOk51bWJlcix2YWx1ZToxLHJlYWRPbmx5OiEwfSxfZGVmYXVsdENvbnRyYXN0UGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTAwLHJlYWRPbmx5OiEwfSxfYnJpZ2h0bmVzc0FkanVzdG1lbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9jb250cmFzdFBlcmNlbnRhZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjEwMH0sX3RhZ0ZpbHRlcjpTdHJpbmcsX2JyaWdodG5lc3NJc0RlZmF1bHQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVCcmlnaHRuZXNzSXNEZWZhdWx0KF9icmlnaHRuZXNzQWRqdXN0bWVudCkifSxfY29udHJhc3RJc0RlZmF1bHQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVDb250cmFzdElzRGVmYXVsdChfY29udHJhc3RQZXJjZW50YWdlKSJ9LApfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZEltYWdlcygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJpbWFnZXMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+e2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZj1fLm1hcFZhbHVlcyhkLGg9Pk9iamVjdC5rZXlzKGgpKTtmPXZjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLAowPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkSW1hZ2VzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWltYWdlLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9yZXNldEJyaWdodG5lc3MoKXt0aGlzLl9icmlnaHRuZXNzQWRqdXN0bWVudD10aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnR9LF9yZXNldENvbnRyYXN0KCl7dGhpcy5fY29udHJhc3RQZXJjZW50YWdlPXRoaXMuX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2V9LF9jb21wdXRlQnJpZ2h0bmVzc0lzRGVmYXVsdChiKXtyZXR1cm4gYj09PXRoaXMuX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudH0sX2NvbXB1dGVDb250cmFzdElzRGVmYXVsdChiKXtyZXR1cm4gYj09PXRoaXMuX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2V9LApfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgodCl7Y29uc3QgbD1iW3QucnVuXVt0LnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSx0LHtzYW1wbGU6cCxvZlNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIsdD0+T2JqZWN0LmtleXModCkpO3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaCkpfSkpfSxfdGFnTWV0YWRhdGEoYixkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWF1ZGlvLWRhc2hib2FyZC90Zi1hdWRpby1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtYXVkaW8tbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcix0b3RhbFNhbXBsZXM6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX21ldGFkYXRhQ2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX3N0ZXBzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3N0ZXBJbmRleDpOdW1iZXIsX2hhc0F0TGVhc3RPbmVTdGVwOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKSJ9LF9oYXNNdWx0aXBsZVN0ZXBzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhfc3RlcHMpIn0sX2N1cnJlbnREYXR1bTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudERhdHVtKF9zdGVwcywgX3N0ZXBJbmRleCkifSwKX21heFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4U3RlcEluZGV4KF9zdGVwcykifSxfc2FtcGxlVGV4dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlU2FtcGxlVGV4dChzYW1wbGUpIn0sX2hhc011bHRpcGxlU2FtcGxlczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyh0b3RhbFNhbXBsZXMpIn19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZykiXSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChiKXtyZXR1cm4hIWImJjA8Yi5sZW5ndGh9LF9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhiKXtyZXR1cm4hIWImJjE8Yi5sZW5ndGh9LF9jb21wdXRlTWF4U3RlcEluZGV4KGIpe3JldHVybiBiLmxlbmd0aC0xfSxfY29tcHV0ZUN1cnJlbnREYXR1bShiLGQpe3JldHVybiBiW2RdfSxfY29tcHV0ZVNhbXBsZVRleHQoYil7cmV0dXJuYCR7YisKMX1gfSxfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyhiKXtyZXR1cm4gMTxifSxhdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwO3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2F0dGFjaGVkKXt0aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxBbGwoKTt2YXIgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvYXVkaW8iLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW4sc2FtcGxlOnRoaXMuc2FtcGxlfSkpLGQ9dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwoZj1mLnZhbHVlLm1hcCh0aGlzLl9jcmVhdGVTdGVwRGF0dW0uYmluZCh0aGlzKSksdGhpcy5zZXQoIl9zdGVwcyIsZiksdGhpcy5zZXQoIl9zdGVwSW5kZXgiLGYubGVuZ3RoLTEpKX0pO3RoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfX0sX2NyZWF0ZVN0ZXBEYXR1bShiKXt2YXIgZD0KbmV3IFVSTFNlYXJjaFBhcmFtcyhiLnF1ZXJ5KTtkLmFwcGVuZCgidHMiLGIud2FsbF90aW1lKTtkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJhdWRpbyIsIi9pbmRpdmlkdWFsQXVkaW8iLGQpO3JldHVybnt3YWxsX3RpbWU6SGguZm9ybWF0RGF0ZShuZXcgRGF0ZSgxRTMqYi53YWxsX3RpbWUpKSxzdGVwOmIuc3RlcCxsYWJlbDpiLmxhYmVsLGNvbnRlbnRUeXBlOmIuY29udGVudFR5cGUsdXJsOmR9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWF1ZGlvLWRhc2hib2FyZC90Zi1hdWRpby1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtYXVkaW8tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyKSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZEF1ZGlvKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsCnRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBmPV8ubWFwVmFsdWVzKGQsaD0+T2JqZWN0LmtleXMoaCkpO2Y9dmMuZ2V0VGFncyhmKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCl9fSl9LF9yZWxvYWRBdWRpbygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1hdWRpby1sb2FkZXIiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgodCl7Y29uc3QgbD1iW3QucnVuXVt0LnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSx0LHtzYW1wbGU6cCx0b3RhbFNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIsdD0+T2JqZWN0LmtleXModCkpO3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAodD0+T2JqZWN0LmFzc2lnbih7fSwKdCx7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLHQuaXRlbXMubWFwKGgpKX0pKX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtyZXR1cm4gYltkXVtmXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWF1dG9ncm93LXRleHRhcmVhL2lyb24tYXV0b2dyb3ctdGV4dGFyZWEuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZV0scHJvcGVydGllczp7dmFsdWU6e29ic2VydmVyOiJfdmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LGJpbmRWYWx1ZTp7b2JzZXJ2ZXI6Il9iaW5kVmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjEsb2JzZXJ2ZXI6Il91cGRhdGVDYWNoZWQifSxtYXhSb3dzOnt0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJfdXBkYXRlQ2FjaGVkIn0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyx2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGlucHV0bW9kZTp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30scmVhZG9ubHk6e3R5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFufSwKbWlubGVuZ3RoOnt0eXBlOk51bWJlcn0sbWF4bGVuZ3RoOnt0eXBlOk51bWJlcn0sbGFiZWw6e3R5cGU6U3RyaW5nfX0sbGlzdGVuZXJzOntpbnB1dDoiX29uSW5wdXQifSxnZXQgdGV4dGFyZWEoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhfSxnZXQgc2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0fSxnZXQgc2VsZWN0aW9uRW5kKCl7cmV0dXJuIHRoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25FbmR9LHNldCBzZWxlY3Rpb25TdGFydChiKXt0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQ9Yn0sc2V0IHNlbGVjdGlvbkVuZChiKXt0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uRW5kPWJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKS8pJiYodGhpcy4kLnRleHRhcmVhLnN0eWxlLm1hcmdpbkxlZnQ9Ii0zcHgiKX0sdmFsaWRhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQudGV4dGFyZWEudmFsaWRpdHkudmFsaWQ7CmImJih0aGlzLnJlcXVpcmVkJiYiIj09PXRoaXMudmFsdWU/Yj0hMTp0aGlzLmhhc1ZhbGlkYXRvcigpJiYoYj1Qb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLnZhbHVlKSkpO3RoaXMuaW52YWxpZD0hYjt0aGlzLmZpcmUoImlyb24taW5wdXQtdmFsaWRhdGUiKTtyZXR1cm4gYn0sX2JpbmRWYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy52YWx1ZT1ifSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMudGV4dGFyZWE7ZCYmKGQudmFsdWUhPT1iJiYoZC52YWx1ZT1ifHwwPT09Yj9iOiIiKSx0aGlzLmJpbmRWYWx1ZT1iLHRoaXMuJC5taXJyb3IuaW5uZXJIVE1MPXRoaXMuX3ZhbHVlRm9yTWlycm9yKCksdGhpcy5maXJlKCJiaW5kLXZhbHVlLWNoYW5nZWQiLHt2YWx1ZTp0aGlzLmJpbmRWYWx1ZX0pKX0sX29uSW5wdXQ6ZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20oYikucGF0aDt0aGlzLnZhbHVlPWQ/ZFswXS52YWx1ZToKYi50YXJnZXQudmFsdWV9LF9jb25zdHJhaW46ZnVuY3Rpb24oYil7Yj1ifHxbIiJdO2ZvcihiPTA8dGhpcy5tYXhSb3dzJiZiLmxlbmd0aD50aGlzLm1heFJvd3M/Yi5zbGljZSgwLHRoaXMubWF4Um93cyk6Yi5zbGljZSgwKTswPHRoaXMucm93cyYmYi5sZW5ndGg8dGhpcy5yb3dzOyliLnB1c2goIiIpO3JldHVybiBiLmpvaW4oIlx4M2Nici9ceDNlIikrIlx4MjYjMTYwOyJ9LF92YWx1ZUZvck1pcnJvcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudGV4dGFyZWE7aWYoYilyZXR1cm4gdGhpcy50b2tlbnM9YiYmYi52YWx1ZT9iLnZhbHVlLnJlcGxhY2UoLyYvZ20sIlx4MjZhbXA7IikucmVwbGFjZSgvIi9nbSwiXHgyNnF1b3Q7IikucmVwbGFjZSgvJy9nbSwiXHgyNiMzOTsiKS5yZXBsYWNlKC88L2dtLCJceDI2bHQ7IikucmVwbGFjZSgvPi9nbSwiXHgyNmd0OyIpLnNwbGl0KCJcbiIpOlsiIl0sdGhpcy5fY29uc3RyYWluKHRoaXMudG9rZW5zKX0sX3VwZGF0ZUNhY2hlZDpmdW5jdGlvbigpe3RoaXMuJC5taXJyb3IuaW5uZXJIVE1MPQp0aGlzLl9jb25zdHJhaW4odGhpcy50b2tlbnMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLXRleHRhcmVhLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXRleHRhcmVhIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3JdLHByb3BlcnRpZXM6e19hcmlhTGFiZWxsZWRCeTp7b2JzZXJ2ZXI6Il9hcmlhTGFiZWxsZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSxfYXJpYURlc2NyaWJlZEJ5OntvYnNlcnZlcjoiX2FyaWFEZXNjcmliZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSx2YWx1ZTp7dHlwZTpTdHJpbmd9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LG1heFJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fSxnZXQgc2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0fSxzZXQgc2VsZWN0aW9uU3RhcnQoYil7dGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0PWJ9LGdldCBzZWxlY3Rpb25FbmQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZH0sCnNldCBzZWxlY3Rpb25FbmQoYil7dGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZD1ifSxfYXJpYUxhYmVsbGVkQnlDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLGIpfSxfYXJpYURlc2NyaWJlZEJ5Q2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c2FibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsYil9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudC50ZXh0YXJlYX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b2FzdC9wYXBlci10b2FzdC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPW51bGw7UG9seW1lcih7aXM6InBhcGVyLXRvYXN0IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvcl0scHJvcGVydGllczp7Zml0SW50bzp7dHlwZTpPYmplY3QsdmFsdWU6d2luZG93LG9ic2VydmVyOiJfb25GaXRJbnRvQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQifSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToiYm90dG9tIn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjNFM30sdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dHJhbnNpdGlvbmVuZDoiX19vblRyYW5zaXRpb25FbmQifSxnZXQgdmlzaWJsZSgpe1BvbHltZXIuQmFzZS5fd2FybigiYHZpc2libGVgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgb3BlbmVkYCBpbnN0ZWFkIik7CnJldHVybiB0aGlzLm9wZW5lZH0sZ2V0IF9jYW5BdXRvQ2xvc2UoKXtyZXR1cm4gMDx0aGlzLmR1cmF0aW9uJiZJbmZpbml0eSE9PXRoaXMuZHVyYXRpb259LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdXRvQ2xvc2U9bnVsbDtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKX0sc2hvdzpmdW5jdGlvbihkKXsic3RyaW5nIj09dHlwZW9mIGQmJihkPXt0ZXh0OmR9KTtmb3IodmFyIGYgaW4gZCkwPT09Zi5pbmRleE9mKCJfIik/UG9seW1lci5CYXNlLl93YXJuKCdUaGUgcHJvcGVydHkgIicrZisnIiBpcyBwcml2YXRlIGFuZCB3YXMgbm90IHNldC4nKTpmIGluIHRoaXM/dGhpc1tmXT1kW2ZdOlBvbHltZXIuQmFzZS5fd2FybignVGhlIHByb3BlcnR5ICInK2YrJyIgaXMgbm90IHZhbGlkLicpO3RoaXMub3BlbigpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZSgpfSxfX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihkKXtkJiZkLnRhcmdldD09PQp0aGlzJiYib3BhY2l0eSI9PT1kLnByb3BlcnR5TmFtZSYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOnRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fYXV0b0Nsb3NlJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9hdXRvQ2xvc2UpLHRoaXMuX2F1dG9DbG9zZT1udWxsKTt0aGlzLm9wZW5lZD8oYiYmYiE9PXRoaXMmJmIuY2xvc2UoKSxiPXRoaXMsdGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDp0aGlzLnRleHR9KSx0aGlzLl9jYW5BdXRvQ2xvc2UmJih0aGlzLl9hdXRvQ2xvc2U9dGhpcy5hc3luYyh0aGlzLmNsb3NlLHRoaXMuZHVyYXRpb24pKSk6Yj09PXRoaXMmJihiPW51bGwpO1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJwYXBlci10b2FzdC1vcGVuIil9LApfcmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QucmVtb3ZlKCJwYXBlci10b2FzdC1vcGVuIil9LF9vbkZpdEludG9DaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMucG9zaXRpb25UYXJnZXQ9ZH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItdG9nZ2xlLWJ1dHRvbi9wYXBlci10b2dnbGUtYnV0dG9uLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXRvZ2dsZS1idXR0b24iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJidXR0b24iLCJhcmlhLXByZXNzZWQiOiJmYWxzZSIsdGFiaW5kZXg6MH0scHJvcGVydGllczp7fSxsaXN0ZW5lcnM6e3RyYWNrOiJfb250cmFjayJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5SZW5kZXJTdGF0dXMuYWZ0ZXJOZXh0UmVuZGVyKHRoaXMsZnVuY3Rpb24oKXtQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKHRoaXMsInBhbi15Iil9KX0sX29udHJhY2s6ZnVuY3Rpb24oYil7Yj1iLmRldGFpbDsic3RhcnQiPT09Yi5zdGF0ZT90aGlzLl90cmFja1N0YXJ0KGIpOiJ0cmFjayI9PT1iLnN0YXRlP3RoaXMuX3RyYWNrTW92ZShiKToiZW5kIj09PWIuc3RhdGUmJnRoaXMuX3RyYWNrRW5kKGIpfSxfdHJhY2tTdGFydDpmdW5jdGlvbigpe3RoaXMuX3dpZHRoPXRoaXMuJC50b2dnbGVCYXIub2Zmc2V0V2lkdGgvCjI7dGhpcy5fdHJhY2tDaGVja2VkPXRoaXMuY2hlY2tlZDt0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIil9LF90cmFja01vdmU6ZnVuY3Rpb24oYil7Yj1iLmR4O3RoaXMuX3g9TWF0aC5taW4odGhpcy5fd2lkdGgsTWF0aC5tYXgoMCx0aGlzLl90cmFja0NoZWNrZWQ/dGhpcy5fd2lkdGgrYjpiKSk7dGhpcy50cmFuc2xhdGUzZCh0aGlzLl94KyJweCIsMCwwLHRoaXMuJC50b2dnbGVCdXR0b24pO3RoaXMuX3VzZXJBY3RpdmF0ZSh0aGlzLl94PnRoaXMuX3dpZHRoLzIpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoImRyYWdnaW5nIik7dGhpcy50cmFuc2Zvcm0oIiIsdGhpcy4kLnRvZ2dsZUJ1dHRvbil9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnRvZ2dsZUJ1dHRvbjt2YXIgYj1Qb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2NyZWF0ZVJpcHBsZSgpOwpiLmlkPSJpbmsiO2Iuc2V0QXR0cmlidXRlKCJyZWNlbnRlcnMiLCIiKTtiLmNsYXNzTGlzdC5hZGQoImNpcmNsZSIsInRvZ2dsZS1pbmsiKTtyZXR1cm4gYn19KTsKCihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpbW9kdWxlLmV4cG9ydHM9ZigpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpZGVmaW5lKFtdLGYpO2Vsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiKWc9d2luZG93O2Vsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKWc9Z2xvYmFsO2Vsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIilnPXNlbGY7ZWxzZSBnPXRoaXM7Zy5ncmFwaGxpYj1mKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApOwp2YXIgZj1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixmO312YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgbGliPXJlcXVpcmUoIi4vbGliIik7bW9kdWxlLmV4cG9ydHM9e0dyYXBoOmxpYi5HcmFwaCxqc29uOnJlcXVpcmUoIi4vbGliL2pzb24iKSxhbGc6cmVxdWlyZSgiLi9saWIvYWxnIiksdmVyc2lvbjpsaWIudmVyc2lvbn19LHsiLi9saWIiOjE3LCIuL2xpYi9hbGciOjgsIi4vbGliL2pzb24iOjE4fV0sCjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWNvbXBvbmVudHM7ZnVuY3Rpb24gY29tcG9uZW50cyhnKXt2YXIgdmlzaXRlZD17fSxjbXB0cz1bXSxjbXB0O2Z1bmN0aW9uIGRmcyh2KXtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybjt2aXNpdGVkW3ZdPXRydWU7Y21wdC5wdXNoKHYpO18uZWFjaChnLnN1Y2Nlc3NvcnModiksZGZzKTtfLmVhY2goZy5wcmVkZWNlc3NvcnModiksZGZzKX1fLmVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2NtcHQ9W107ZGZzKHYpO2lmKGNtcHQubGVuZ3RoKWNtcHRzLnB1c2goY21wdCl9KTtyZXR1cm4gY21wdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1kZnM7ZnVuY3Rpb24gZGZzKGcsdnMsb3JkZXIpe2lmKCFfLmlzQXJyYXkodnMpKXZzPQpbdnNdO3ZhciBuYXZpZ2F0aW9uPShnLmlzRGlyZWN0ZWQoKT9nLnN1Y2Nlc3NvcnM6Zy5uZWlnaGJvcnMpLmJpbmQoZyk7dmFyIGFjYz1bXSx2aXNpdGVkPXt9O18uZWFjaCh2cyxmdW5jdGlvbih2KXtpZighZy5oYXNOb2RlKHYpKXRocm93IG5ldyBFcnJvcigiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiAiK3YpO2RvRGZzKGcsdixvcmRlcj09PSJwb3N0Iix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKX0pO3JldHVybiBhY2N9ZnVuY3Rpb24gZG9EZnMoZyx2LHBvc3RvcmRlcix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKXtpZighXy5oYXModmlzaXRlZCx2KSl7dmlzaXRlZFt2XT10cnVlO2lmKCFwb3N0b3JkZXIpYWNjLnB1c2godik7Xy5lYWNoKG5hdmlnYXRpb24odiksZnVuY3Rpb24odyl7ZG9EZnMoZyx3LHBvc3RvcmRlcix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKX0pO2lmKHBvc3RvcmRlcilhY2MucHVzaCh2KX19fSx7Ii4uL2xvZGFzaCI6MTl9XSw0OltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7dmFyIGRpamtzdHJhPXJlcXVpcmUoIi4vZGlqa3N0cmEiKSxfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWRpamtzdHJhQWxsO2Z1bmN0aW9uIGRpamtzdHJhQWxsKGcsd2VpZ2h0RnVuYyxlZGdlRnVuYyl7cmV0dXJuIF8udHJhbnNmb3JtKGcubm9kZXMoKSxmdW5jdGlvbihhY2Msdil7YWNjW3ZdPWRpamtzdHJhKGcsdix3ZWlnaHRGdW5jLGVkZ2VGdW5jKX0se30pfX0seyIuLi9sb2Rhc2giOjE5LCIuL2RpamtzdHJhIjo1fV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksUHJpb3JpdHlRdWV1ZT1yZXF1aXJlKCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIik7bW9kdWxlLmV4cG9ydHM9ZGlqa3N0cmE7dmFyIERFRkFVTFRfV0VJR0hUX0ZVTkM9Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBkaWprc3RyYShnLHNvdXJjZSx3ZWlnaHRGbixlZGdlRm4pe3JldHVybiBydW5EaWprc3RyYShnLApTdHJpbmcoc291cmNlKSx3ZWlnaHRGbnx8REVGQVVMVF9XRUlHSFRfRlVOQyxlZGdlRm58fGZ1bmN0aW9uKHYpe3JldHVybiBnLm91dEVkZ2VzKHYpfSl9ZnVuY3Rpb24gcnVuRGlqa3N0cmEoZyxzb3VyY2Usd2VpZ2h0Rm4sZWRnZUZuKXt2YXIgcmVzdWx0cz17fSxwcT1uZXcgUHJpb3JpdHlRdWV1ZSx2LHZFbnRyeTt2YXIgdXBkYXRlTmVpZ2hib3JzPWZ1bmN0aW9uKGVkZ2Upe3ZhciB3PWVkZ2UudiE9PXY/ZWRnZS52OmVkZ2Uudyx3RW50cnk9cmVzdWx0c1t3XSx3ZWlnaHQ9d2VpZ2h0Rm4oZWRnZSksZGlzdGFuY2U9dkVudHJ5LmRpc3RhbmNlK3dlaWdodDtpZih3ZWlnaHQ8MCl0aHJvdyBuZXcgRXJyb3IoImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gIisiQmFkIGVkZ2U6ICIrZWRnZSsiIFdlaWdodDogIit3ZWlnaHQpO2lmKGRpc3RhbmNlPHdFbnRyeS5kaXN0YW5jZSl7d0VudHJ5LmRpc3RhbmNlPWRpc3RhbmNlO3dFbnRyeS5wcmVkZWNlc3Nvcj0KdjtwcS5kZWNyZWFzZSh3LGRpc3RhbmNlKX19O2cubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpe3ZhciBkaXN0YW5jZT12PT09c291cmNlPzA6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO3Jlc3VsdHNbdl09e2Rpc3RhbmNlOmRpc3RhbmNlfTtwcS5hZGQodixkaXN0YW5jZSl9KTt3aGlsZShwcS5zaXplKCk+MCl7dj1wcS5yZW1vdmVNaW4oKTt2RW50cnk9cmVzdWx0c1t2XTtpZih2RW50cnkuZGlzdGFuY2U9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpYnJlYWs7ZWRnZUZuKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKX1yZXR1cm4gcmVzdWx0c319LHsiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSI6MTUsIi4uL2xvZGFzaCI6MTl9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx0YXJqYW49cmVxdWlyZSgiLi90YXJqYW4iKTttb2R1bGUuZXhwb3J0cz1maW5kQ3ljbGVzO2Z1bmN0aW9uIGZpbmRDeWNsZXMoZyl7cmV0dXJuIF8uZmlsdGVyKHRhcmphbihnKSwKZnVuY3Rpb24oY21wdCl7cmV0dXJuIGNtcHQubGVuZ3RoPjF8fGNtcHQubGVuZ3RoPT09MSYmZy5oYXNFZGdlKGNtcHRbMF0sY21wdFswXSl9KX19LHsiLi4vbG9kYXNoIjoxOSwiLi90YXJqYW4iOjEzfV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9ZmxveWRXYXJzaGFsbDt2YXIgREVGQVVMVF9XRUlHSFRfRlVOQz1fLmNvbnN0YW50KDEpO2Z1bmN0aW9uIGZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbixlZGdlRm4pe3JldHVybiBydW5GbG95ZFdhcnNoYWxsKGcsd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZVTkMsZWRnZUZufHxmdW5jdGlvbih2KXtyZXR1cm4gZy5vdXRFZGdlcyh2KX0pfWZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbixlZGdlRm4pe3ZhciByZXN1bHRzPXt9LG5vZGVzPWcubm9kZXMoKTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHYpe3Jlc3VsdHNbdl09Cnt9O3Jlc3VsdHNbdl1bdl09e2Rpc3RhbmNlOjB9O25vZGVzLmZvckVhY2goZnVuY3Rpb24odyl7aWYodiE9PXcpcmVzdWx0c1t2XVt3XT17ZGlzdGFuY2U6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfX0pO2VkZ2VGbih2KS5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2Upe3ZhciB3PWVkZ2Uudj09PXY/ZWRnZS53OmVkZ2UudixkPXdlaWdodEZuKGVkZ2UpO3Jlc3VsdHNbdl1bd109e2Rpc3RhbmNlOmQscHJlZGVjZXNzb3I6dn19KX0pO25vZGVzLmZvckVhY2goZnVuY3Rpb24oayl7dmFyIHJvd0s9cmVzdWx0c1trXTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciByb3dJPXJlc3VsdHNbaV07bm9kZXMuZm9yRWFjaChmdW5jdGlvbihqKXt2YXIgaWs9cm93SVtrXTt2YXIga2o9cm93S1tqXTt2YXIgaWo9cm93SVtqXTt2YXIgYWx0RGlzdGFuY2U9aWsuZGlzdGFuY2Ura2ouZGlzdGFuY2U7aWYoYWx0RGlzdGFuY2U8aWouZGlzdGFuY2Upe2lqLmRpc3RhbmNlPWFsdERpc3RhbmNlO2lqLnByZWRlY2Vzc29yPQprai5wcmVkZWNlc3Nvcn19KX0pfSk7cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17Y29tcG9uZW50czpyZXF1aXJlKCIuL2NvbXBvbmVudHMiKSxkaWprc3RyYTpyZXF1aXJlKCIuL2RpamtzdHJhIiksZGlqa3N0cmFBbGw6cmVxdWlyZSgiLi9kaWprc3RyYS1hbGwiKSxmaW5kQ3ljbGVzOnJlcXVpcmUoIi4vZmluZC1jeWNsZXMiKSxmbG95ZFdhcnNoYWxsOnJlcXVpcmUoIi4vZmxveWQtd2Fyc2hhbGwiKSxpc0FjeWNsaWM6cmVxdWlyZSgiLi9pcy1hY3ljbGljIikscG9zdG9yZGVyOnJlcXVpcmUoIi4vcG9zdG9yZGVyIikscHJlb3JkZXI6cmVxdWlyZSgiLi9wcmVvcmRlciIpLHByaW06cmVxdWlyZSgiLi9wcmltIiksdGFyamFuOnJlcXVpcmUoIi4vdGFyamFuIiksdG9wc29ydDpyZXF1aXJlKCIuL3RvcHNvcnQiKX19LHsiLi9jb21wb25lbnRzIjoyLCIuL2RpamtzdHJhIjo1LAoiLi9kaWprc3RyYS1hbGwiOjQsIi4vZmluZC1jeWNsZXMiOjYsIi4vZmxveWQtd2Fyc2hhbGwiOjcsIi4vaXMtYWN5Y2xpYyI6OSwiLi9wb3N0b3JkZXIiOjEwLCIuL3ByZW9yZGVyIjoxMSwiLi9wcmltIjoxMiwiLi90YXJqYW4iOjEzLCIuL3RvcHNvcnQiOjE0fV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIHRvcHNvcnQ9cmVxdWlyZSgiLi90b3Bzb3J0Iik7bW9kdWxlLmV4cG9ydHM9aXNBY3ljbGljO2Z1bmN0aW9uIGlzQWN5Y2xpYyhnKXt0cnl7dG9wc29ydChnKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgdG9wc29ydC5DeWNsZUV4Y2VwdGlvbilyZXR1cm4gZmFsc2U7dGhyb3cgZTt9cmV0dXJuIHRydWV9fSx7Ii4vdG9wc29ydCI6MTR9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGRmcz1yZXF1aXJlKCIuL2RmcyIpO21vZHVsZS5leHBvcnRzPXBvc3RvcmRlcjtmdW5jdGlvbiBwb3N0b3JkZXIoZyx2cyl7cmV0dXJuIGRmcyhnLAp2cywicG9zdCIpfX0seyIuL2RmcyI6M31dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZGZzPXJlcXVpcmUoIi4vZGZzIik7bW9kdWxlLmV4cG9ydHM9cHJlb3JkZXI7ZnVuY3Rpb24gcHJlb3JkZXIoZyx2cyl7cmV0dXJuIGRmcyhnLHZzLCJwcmUiKX19LHsiLi9kZnMiOjN9XSwxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGgiKSxQcmlvcml0eVF1ZXVlPXJlcXVpcmUoIi4uL2RhdGEvcHJpb3JpdHktcXVldWUiKTttb2R1bGUuZXhwb3J0cz1wcmltO2Z1bmN0aW9uIHByaW0oZyx3ZWlnaHRGdW5jKXt2YXIgcmVzdWx0PW5ldyBHcmFwaCxwYXJlbnRzPXt9LHBxPW5ldyBQcmlvcml0eVF1ZXVlLHY7ZnVuY3Rpb24gdXBkYXRlTmVpZ2hib3JzKGVkZ2Upe3ZhciB3PWVkZ2Uudj09PXY/ZWRnZS53OmVkZ2Uudixwcmk9cHEucHJpb3JpdHkodyk7aWYocHJpIT09CnVuZGVmaW5lZCl7dmFyIGVkZ2VXZWlnaHQ9d2VpZ2h0RnVuYyhlZGdlKTtpZihlZGdlV2VpZ2h0PHByaSl7cGFyZW50c1t3XT12O3BxLmRlY3JlYXNlKHcsZWRnZVdlaWdodCl9fX1pZihnLm5vZGVDb3VudCgpPT09MClyZXR1cm4gcmVzdWx0O18uZWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7cHEuYWRkKHYsTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtyZXN1bHQuc2V0Tm9kZSh2KX0pO3BxLmRlY3JlYXNlKGcubm9kZXMoKVswXSwwKTt2YXIgaW5pdD1mYWxzZTt3aGlsZShwcS5zaXplKCk+MCl7dj1wcS5yZW1vdmVNaW4oKTtpZihfLmhhcyhwYXJlbnRzLHYpKXJlc3VsdC5zZXRFZGdlKHYscGFyZW50c1t2XSk7ZWxzZSBpZihpbml0KXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogIitnKTtlbHNlIGluaXQ9dHJ1ZTtnLm5vZGVFZGdlcyh2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyl9cmV0dXJuIHJlc3VsdH19LHsiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSI6MTUsCiIuLi9ncmFwaCI6MTYsIi4uL2xvZGFzaCI6MTl9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9dGFyamFuO2Z1bmN0aW9uIHRhcmphbihnKXt2YXIgaW5kZXg9MCxzdGFjaz1bXSx2aXNpdGVkPXt9LHJlc3VsdHM9W107ZnVuY3Rpb24gZGZzKHYpe3ZhciBlbnRyeT12aXNpdGVkW3ZdPXtvblN0YWNrOnRydWUsbG93bGluazppbmRleCxpbmRleDppbmRleCsrfTtzdGFjay5wdXNoKHYpO2cuc3VjY2Vzc29ycyh2KS5mb3JFYWNoKGZ1bmN0aW9uKHcpe2lmKCFfLmhhcyh2aXNpdGVkLHcpKXtkZnModyk7ZW50cnkubG93bGluaz1NYXRoLm1pbihlbnRyeS5sb3dsaW5rLHZpc2l0ZWRbd10ubG93bGluayl9ZWxzZSBpZih2aXNpdGVkW3ddLm9uU3RhY2spZW50cnkubG93bGluaz1NYXRoLm1pbihlbnRyeS5sb3dsaW5rLHZpc2l0ZWRbd10uaW5kZXgpfSk7aWYoZW50cnkubG93bGluaz09PWVudHJ5LmluZGV4KXt2YXIgY21wdD0KW10sdztkb3t3PXN0YWNrLnBvcCgpO3Zpc2l0ZWRbd10ub25TdGFjaz1mYWxzZTtjbXB0LnB1c2godyl9d2hpbGUodiE9PXcpO3Jlc3VsdHMucHVzaChjbXB0KX19Zy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odil7aWYoIV8uaGFzKHZpc2l0ZWQsdikpZGZzKHYpfSk7cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9dG9wc29ydDt0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uPUN5Y2xlRXhjZXB0aW9uO2Z1bmN0aW9uIHRvcHNvcnQoZyl7dmFyIHZpc2l0ZWQ9e30sc3RhY2s9e30scmVzdWx0cz1bXTtmdW5jdGlvbiB2aXNpdChub2RlKXtpZihfLmhhcyhzdGFjayxub2RlKSl0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb247aWYoIV8uaGFzKHZpc2l0ZWQsbm9kZSkpe3N0YWNrW25vZGVdPXRydWU7dmlzaXRlZFtub2RlXT10cnVlO18uZWFjaChnLnByZWRlY2Vzc29ycyhub2RlKSwKdmlzaXQpO2RlbGV0ZSBzdGFja1tub2RlXTtyZXN1bHRzLnB1c2gobm9kZSl9fV8uZWFjaChnLnNpbmtzKCksdmlzaXQpO2lmKF8uc2l6ZSh2aXNpdGVkKSE9PWcubm9kZUNvdW50KCkpdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uO3JldHVybiByZXN1bHRzfWZ1bmN0aW9uIEN5Y2xlRXhjZXB0aW9uKCl7fX0seyIuLi9sb2Rhc2giOjE5fV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPVByaW9yaXR5UXVldWU7ZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpe3RoaXMuX2Fycj1bXTt0aGlzLl9rZXlJbmRpY2VzPXt9fVByaW9yaXR5UXVldWUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXJyLmxlbmd0aH07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB4LmtleX0pfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXM9CmZ1bmN0aW9uKGtleSl7cmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsa2V5KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHk9ZnVuY3Rpb24oa2V5KXt2YXIgaW5kZXg9dGhpcy5fa2V5SW5kaWNlc1trZXldO2lmKGluZGV4IT09dW5kZWZpbmVkKXJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5taW49ZnVuY3Rpb24oKXtpZih0aGlzLnNpemUoKT09PTApdGhyb3cgbmV3IEVycm9yKCJRdWV1ZSB1bmRlcmZsb3ciKTtyZXR1cm4gdGhpcy5fYXJyWzBdLmtleX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGtleSxwcmlvcml0eSl7dmFyIGtleUluZGljZXM9dGhpcy5fa2V5SW5kaWNlcztrZXk9U3RyaW5nKGtleSk7aWYoIV8uaGFzKGtleUluZGljZXMsa2V5KSl7dmFyIGFycj10aGlzLl9hcnI7dmFyIGluZGV4PWFyci5sZW5ndGg7a2V5SW5kaWNlc1trZXldPWluZGV4O2Fyci5wdXNoKHtrZXk6a2V5LApwcmlvcml0eTpwcmlvcml0eX0pO3RoaXMuX2RlY3JlYXNlKGluZGV4KTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLnJlbW92ZU1pbj1mdW5jdGlvbigpe3RoaXMuX3N3YXAoMCx0aGlzLl9hcnIubGVuZ3RoLTEpO3ZhciBtaW49dGhpcy5fYXJyLnBvcCgpO2RlbGV0ZSB0aGlzLl9rZXlJbmRpY2VzW21pbi5rZXldO3RoaXMuX2hlYXBpZnkoMCk7cmV0dXJuIG1pbi5rZXl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmRlY3JlYXNlPWZ1bmN0aW9uKGtleSxwcmlvcml0eSl7dmFyIGluZGV4PXRoaXMuX2tleUluZGljZXNba2V5XTtpZihwcmlvcml0eT50aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5KXRocm93IG5ldyBFcnJvcigiTmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IHByaW9yaXR5LiAiKyJLZXk6ICIra2V5KyIgT2xkOiAiK3RoaXMuX2FycltpbmRleF0ucHJpb3JpdHkrIiBOZXc6ICIrcHJpb3JpdHkpO3RoaXMuX2FycltpbmRleF0ucHJpb3JpdHk9CnByaW9yaXR5O3RoaXMuX2RlY3JlYXNlKGluZGV4KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2hlYXBpZnk9ZnVuY3Rpb24oaSl7dmFyIGFycj10aGlzLl9hcnI7dmFyIGw9MippLHI9bCsxLGxhcmdlc3Q9aTtpZihsPGFyci5sZW5ndGgpe2xhcmdlc3Q9YXJyW2xdLnByaW9yaXR5PGFycltsYXJnZXN0XS5wcmlvcml0eT9sOmxhcmdlc3Q7aWYocjxhcnIubGVuZ3RoKWxhcmdlc3Q9YXJyW3JdLnByaW9yaXR5PGFycltsYXJnZXN0XS5wcmlvcml0eT9yOmxhcmdlc3Q7aWYobGFyZ2VzdCE9PWkpe3RoaXMuX3N3YXAoaSxsYXJnZXN0KTt0aGlzLl9oZWFwaWZ5KGxhcmdlc3QpfX19O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZT1mdW5jdGlvbihpbmRleCl7dmFyIGFycj10aGlzLl9hcnI7dmFyIHByaW9yaXR5PWFycltpbmRleF0ucHJpb3JpdHk7dmFyIHBhcmVudDt3aGlsZShpbmRleCE9PTApe3BhcmVudD1pbmRleD4+MTtpZihhcnJbcGFyZW50XS5wcmlvcml0eTxwcmlvcml0eSlicmVhazsKdGhpcy5fc3dhcChpbmRleCxwYXJlbnQpO2luZGV4PXBhcmVudH19O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9zd2FwPWZ1bmN0aW9uKGksail7dmFyIGFycj10aGlzLl9hcnI7dmFyIGtleUluZGljZXM9dGhpcy5fa2V5SW5kaWNlczt2YXIgb3JpZ0Fyckk9YXJyW2ldO3ZhciBvcmlnQXJySj1hcnJbal07YXJyW2ldPW9yaWdBcnJKO2FycltqXT1vcmlnQXJySTtrZXlJbmRpY2VzW29yaWdBcnJKLmtleV09aTtrZXlJbmRpY2VzW29yaWdBcnJJLmtleV09an19LHsiLi4vbG9kYXNoIjoxOX1dLDE2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPUdyYXBoO3ZhciBERUZBVUxUX0VER0VfTkFNRT0iXHgwMCIsR1JBUEhfTk9ERT0iXHgwMCIsRURHRV9LRVlfREVMSU09Ilx1MDAwMSI7ZnVuY3Rpb24gR3JhcGgob3B0cyl7dGhpcy5faXNEaXJlY3RlZD1fLmhhcyhvcHRzLCJkaXJlY3RlZCIpP29wdHMuZGlyZWN0ZWQ6CnRydWU7dGhpcy5faXNNdWx0aWdyYXBoPV8uaGFzKG9wdHMsIm11bHRpZ3JhcGgiKT9vcHRzLm11bHRpZ3JhcGg6ZmFsc2U7dGhpcy5faXNDb21wb3VuZD1fLmhhcyhvcHRzLCJjb21wb3VuZCIpP29wdHMuY29tcG91bmQ6ZmFsc2U7dGhpcy5fbGFiZWw9dW5kZWZpbmVkO3RoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj1fLmNvbnN0YW50KHVuZGVmaW5lZCk7dGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPV8uY29uc3RhbnQodW5kZWZpbmVkKTt0aGlzLl9ub2Rlcz17fTtpZih0aGlzLl9pc0NvbXBvdW5kKXt0aGlzLl9wYXJlbnQ9e307dGhpcy5fY2hpbGRyZW49e307dGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV09e319dGhpcy5faW49e307dGhpcy5fcHJlZHM9e307dGhpcy5fb3V0PXt9O3RoaXMuX3N1Y3M9e307dGhpcy5fZWRnZU9ianM9e307dGhpcy5fZWRnZUxhYmVscz17fX1HcmFwaC5wcm90b3R5cGUuX25vZGVDb3VudD0wO0dyYXBoLnByb3RvdHlwZS5fZWRnZUNvdW50PTA7R3JhcGgucHJvdG90eXBlLmlzRGlyZWN0ZWQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRGlyZWN0ZWR9O0dyYXBoLnByb3RvdHlwZS5pc011bHRpZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNNdWx0aWdyYXBofTtHcmFwaC5wcm90b3R5cGUuaXNDb21wb3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0NvbXBvdW5kfTtHcmFwaC5wcm90b3R5cGUuc2V0R3JhcGg9ZnVuY3Rpb24obGFiZWwpe3RoaXMuX2xhYmVsPWxhYmVsO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9O0dyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsPWZ1bmN0aW9uKG5ld0RlZmF1bHQpe2lmKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpbmV3RGVmYXVsdD1fLmNvbnN0YW50KG5ld0RlZmF1bHQpO3RoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj1uZXdEZWZhdWx0O3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUubm9kZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVDb3VudH07CkdyYXBoLnByb3RvdHlwZS5ub2Rlcz1mdW5jdGlvbigpe3JldHVybiBfLmtleXModGhpcy5fbm9kZXMpfTtHcmFwaC5wcm90b3R5cGUuc291cmNlcz1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7cmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gXy5pc0VtcHR5KHNlbGYuX2luW3ZdKX0pfTtHcmFwaC5wcm90b3R5cGUuc2lua3M9ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3JldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIF8uaXNFbXB0eShzZWxmLl9vdXRbdl0pfSl9O0dyYXBoLnByb3RvdHlwZS5zZXROb2Rlcz1mdW5jdGlvbih2cyx2YWx1ZSl7dmFyIGFyZ3M9YXJndW1lbnRzO3ZhciBzZWxmPXRoaXM7Xy5lYWNoKHZzLGZ1bmN0aW9uKHYpe2lmKGFyZ3MubGVuZ3RoPjEpc2VsZi5zZXROb2RlKHYsdmFsdWUpO2Vsc2Ugc2VsZi5zZXROb2RlKHYpfSk7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXROb2RlPQpmdW5jdGlvbih2LHZhbHVlKXtpZihfLmhhcyh0aGlzLl9ub2Rlcyx2KSl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXRoaXMuX25vZGVzW3ZdPXZhbHVlO3JldHVybiB0aGlzfXRoaXMuX25vZGVzW3ZdPWFyZ3VtZW50cy5sZW5ndGg+MT92YWx1ZTp0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4odik7aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcGFyZW50W3ZdPUdSQVBIX05PREU7dGhpcy5fY2hpbGRyZW5bdl09e307dGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV1bdl09dHJ1ZX10aGlzLl9pblt2XT17fTt0aGlzLl9wcmVkc1t2XT17fTt0aGlzLl9vdXRbdl09e307dGhpcy5fc3Vjc1t2XT17fTsrK3RoaXMuX25vZGVDb3VudDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLm5vZGU9ZnVuY3Rpb24odil7cmV0dXJuIHRoaXMuX25vZGVzW3ZdfTtHcmFwaC5wcm90b3R5cGUuaGFzTm9kZT1mdW5jdGlvbih2KXtyZXR1cm4gXy5oYXModGhpcy5fbm9kZXMsdil9O0dyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlPQpmdW5jdGlvbih2KXt2YXIgc2VsZj10aGlzO2lmKF8uaGFzKHRoaXMuX25vZGVzLHYpKXt2YXIgcmVtb3ZlRWRnZT1mdW5jdGlvbihlKXtzZWxmLnJlbW92ZUVkZ2Uoc2VsZi5fZWRnZU9ianNbZV0pfTtkZWxldGUgdGhpcy5fbm9kZXNbdl07aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7ZGVsZXRlIHRoaXMuX3BhcmVudFt2XTtfLmVhY2godGhpcy5jaGlsZHJlbih2KSxmdW5jdGlvbihjaGlsZCl7c2VsZi5zZXRQYXJlbnQoY2hpbGQpfSk7ZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3ZdfV8uZWFjaChfLmtleXModGhpcy5faW5bdl0pLHJlbW92ZUVkZ2UpO2RlbGV0ZSB0aGlzLl9pblt2XTtkZWxldGUgdGhpcy5fcHJlZHNbdl07Xy5lYWNoKF8ua2V5cyh0aGlzLl9vdXRbdl0pLHJlbW92ZUVkZ2UpO2RlbGV0ZSB0aGlzLl9vdXRbdl07ZGVsZXRlIHRoaXMuX3N1Y3Nbdl07LS10aGlzLl9ub2RlQ291bnR9cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXRQYXJlbnQ9CmZ1bmN0aW9uKHYscGFyZW50KXtpZighdGhpcy5faXNDb21wb3VuZCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgcGFyZW50IGluIGEgbm9uLWNvbXBvdW5kIGdyYXBoIik7aWYoXy5pc1VuZGVmaW5lZChwYXJlbnQpKXBhcmVudD1HUkFQSF9OT0RFO2Vsc2V7cGFyZW50Kz0iIjtmb3IodmFyIGFuY2VzdG9yPXBhcmVudDshXy5pc1VuZGVmaW5lZChhbmNlc3Rvcik7YW5jZXN0b3I9dGhpcy5wYXJlbnQoYW5jZXN0b3IpKWlmKGFuY2VzdG9yPT09dil0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgIitwYXJlbnQrIiBhcyBwYXJlbnQgb2YgIit2KyIgd291bGQgY3JlYXRlIGEgY3ljbGUiKTt0aGlzLnNldE5vZGUocGFyZW50KX10aGlzLnNldE5vZGUodik7dGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7dGhpcy5fcGFyZW50W3ZdPXBhcmVudDt0aGlzLl9jaGlsZHJlbltwYXJlbnRdW3ZdPXRydWU7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Q9CmZ1bmN0aW9uKHYpe2RlbGV0ZSB0aGlzLl9jaGlsZHJlblt0aGlzLl9wYXJlbnRbdl1dW3ZdfTtHcmFwaC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHYpe2lmKHRoaXMuX2lzQ29tcG91bmQpe3ZhciBwYXJlbnQ9dGhpcy5fcGFyZW50W3ZdO2lmKHBhcmVudCE9PUdSQVBIX05PREUpcmV0dXJuIHBhcmVudH19O0dyYXBoLnByb3RvdHlwZS5jaGlsZHJlbj1mdW5jdGlvbih2KXtpZihfLmlzVW5kZWZpbmVkKHYpKXY9R1JBUEhfTk9ERTtpZih0aGlzLl9pc0NvbXBvdW5kKXt2YXIgY2hpbGRyZW49dGhpcy5fY2hpbGRyZW5bdl07aWYoY2hpbGRyZW4pcmV0dXJuIF8ua2V5cyhjaGlsZHJlbil9ZWxzZSBpZih2PT09R1JBUEhfTk9ERSlyZXR1cm4gdGhpcy5ub2RlcygpO2Vsc2UgaWYodGhpcy5oYXNOb2RlKHYpKXJldHVybltdfTtHcmFwaC5wcm90b3R5cGUucHJlZGVjZXNzb3JzPWZ1bmN0aW9uKHYpe3ZhciBwcmVkc1Y9dGhpcy5fcHJlZHNbdl07aWYocHJlZHNWKXJldHVybiBfLmtleXMocHJlZHNWKX07CkdyYXBoLnByb3RvdHlwZS5zdWNjZXNzb3JzPWZ1bmN0aW9uKHYpe3ZhciBzdWNzVj10aGlzLl9zdWNzW3ZdO2lmKHN1Y3NWKXJldHVybiBfLmtleXMoc3Vjc1YpfTtHcmFwaC5wcm90b3R5cGUubmVpZ2hib3JzPWZ1bmN0aW9uKHYpe3ZhciBwcmVkcz10aGlzLnByZWRlY2Vzc29ycyh2KTtpZihwcmVkcylyZXR1cm4gXy51bmlvbihwcmVkcyx0aGlzLnN1Y2Nlc3NvcnModikpfTtHcmFwaC5wcm90b3R5cGUuaXNMZWFmPWZ1bmN0aW9uKHYpe3ZhciBuZWlnaGJvcnM7aWYodGhpcy5pc0RpcmVjdGVkKCkpbmVpZ2hib3JzPXRoaXMuc3VjY2Vzc29ycyh2KTtlbHNlIG5laWdoYm9ycz10aGlzLm5laWdoYm9ycyh2KTtyZXR1cm4gbmVpZ2hib3JzLmxlbmd0aD09PTB9O0dyYXBoLnByb3RvdHlwZS5maWx0ZXJOb2Rlcz1mdW5jdGlvbihmaWx0ZXIpe3ZhciBjb3B5PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHtkaXJlY3RlZDp0aGlzLl9pc0RpcmVjdGVkLG11bHRpZ3JhcGg6dGhpcy5faXNNdWx0aWdyYXBoLApjb21wb3VuZDp0aGlzLl9pc0NvbXBvdW5kfSk7Y29weS5zZXRHcmFwaCh0aGlzLmdyYXBoKCkpO3ZhciBzZWxmPXRoaXM7Xy5lYWNoKHRoaXMuX25vZGVzLGZ1bmN0aW9uKHZhbHVlLHYpe2lmKGZpbHRlcih2KSljb3B5LnNldE5vZGUodix2YWx1ZSl9KTtfLmVhY2godGhpcy5fZWRnZU9ianMsZnVuY3Rpb24oZSl7aWYoY29weS5oYXNOb2RlKGUudikmJmNvcHkuaGFzTm9kZShlLncpKWNvcHkuc2V0RWRnZShlLHNlbGYuZWRnZShlKSl9KTt2YXIgcGFyZW50cz17fTtmdW5jdGlvbiBmaW5kUGFyZW50KHYpe3ZhciBwYXJlbnQ9c2VsZi5wYXJlbnQodik7aWYocGFyZW50PT09dW5kZWZpbmVkfHxjb3B5Lmhhc05vZGUocGFyZW50KSl7cGFyZW50c1t2XT1wYXJlbnQ7cmV0dXJuIHBhcmVudH1lbHNlIGlmKHBhcmVudCBpbiBwYXJlbnRzKXJldHVybiBwYXJlbnRzW3BhcmVudF07ZWxzZSByZXR1cm4gZmluZFBhcmVudChwYXJlbnQpfWlmKHRoaXMuX2lzQ29tcG91bmQpXy5lYWNoKGNvcHkubm9kZXMoKSwKZnVuY3Rpb24odil7Y29weS5zZXRQYXJlbnQodixmaW5kUGFyZW50KHYpKX0pO3JldHVybiBjb3B5fTtHcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdEVkZ2VMYWJlbD1mdW5jdGlvbihuZXdEZWZhdWx0KXtpZighXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKW5ld0RlZmF1bHQ9Xy5jb25zdGFudChuZXdEZWZhdWx0KTt0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm49bmV3RGVmYXVsdDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmVkZ2VDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlQ291bnR9O0dyYXBoLnByb3RvdHlwZS5lZGdlcz1mdW5jdGlvbigpe3JldHVybiBfLnZhbHVlcyh0aGlzLl9lZGdlT2Jqcyl9O0dyYXBoLnByb3RvdHlwZS5zZXRQYXRoPWZ1bmN0aW9uKHZzLHZhbHVlKXt2YXIgc2VsZj10aGlzLGFyZ3M9YXJndW1lbnRzO18ucmVkdWNlKHZzLGZ1bmN0aW9uKHYsdyl7aWYoYXJncy5sZW5ndGg+MSlzZWxmLnNldEVkZ2Uodix3LHZhbHVlKTtlbHNlIHNlbGYuc2V0RWRnZSh2LAp3KTtyZXR1cm4gd30pO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuc2V0RWRnZT1mdW5jdGlvbigpe3ZhciB2LHcsbmFtZSx2YWx1ZSx2YWx1ZVNwZWNpZmllZD1mYWxzZSxhcmcwPWFyZ3VtZW50c1swXTtpZih0eXBlb2YgYXJnMD09PSJvYmplY3QiJiZhcmcwIT09bnVsbCYmInYiaW4gYXJnMCl7dj1hcmcwLnY7dz1hcmcwLnc7bmFtZT1hcmcwLm5hbWU7aWYoYXJndW1lbnRzLmxlbmd0aD09PTIpe3ZhbHVlPWFyZ3VtZW50c1sxXTt2YWx1ZVNwZWNpZmllZD10cnVlfX1lbHNle3Y9YXJnMDt3PWFyZ3VtZW50c1sxXTtuYW1lPWFyZ3VtZW50c1szXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpe3ZhbHVlPWFyZ3VtZW50c1syXTt2YWx1ZVNwZWNpZmllZD10cnVlfX12PSIiK3Y7dz0iIit3O2lmKCFfLmlzVW5kZWZpbmVkKG5hbWUpKW5hbWU9IiIrbmFtZTt2YXIgZT1lZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7aWYoXy5oYXModGhpcy5fZWRnZUxhYmVscywKZSkpe2lmKHZhbHVlU3BlY2lmaWVkKXRoaXMuX2VkZ2VMYWJlbHNbZV09dmFsdWU7cmV0dXJuIHRoaXN9aWYoIV8uaXNVbmRlZmluZWQobmFtZSkmJiF0aGlzLl9pc011bHRpZ3JhcGgpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IGEgbmFtZWQgZWRnZSB3aGVuIGlzTXVsdGlncmFwaCBceDNkIGZhbHNlIik7dGhpcy5zZXROb2RlKHYpO3RoaXMuc2V0Tm9kZSh3KTt0aGlzLl9lZGdlTGFiZWxzW2VdPXZhbHVlU3BlY2lmaWVkP3ZhbHVlOnRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbih2LHcsbmFtZSk7dmFyIGVkZ2VPYmo9ZWRnZUFyZ3NUb09iaih0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTt2PWVkZ2VPYmoudjt3PWVkZ2VPYmoudztPYmplY3QuZnJlZXplKGVkZ2VPYmopO3RoaXMuX2VkZ2VPYmpzW2VdPWVkZ2VPYmo7aW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fcHJlZHNbd10sdik7aW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fc3Vjc1t2XSx3KTt0aGlzLl9pblt3XVtlXT0KZWRnZU9iajt0aGlzLl9vdXRbdl1bZV09ZWRnZU9iajt0aGlzLl9lZGdlQ291bnQrKztyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmVkZ2U9ZnVuY3Rpb24odix3LG5hbWUpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg9PT0xP2VkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7cmV0dXJuIHRoaXMuX2VkZ2VMYWJlbHNbZV19O0dyYXBoLnByb3RvdHlwZS5oYXNFZGdlPWZ1bmN0aW9uKHYsdyxuYW1lKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPT09MT9lZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO3JldHVybiBfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLGUpfTtHcmFwaC5wcm90b3R5cGUucmVtb3ZlRWRnZT1mdW5jdGlvbih2LHcsbmFtZSl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD09PTE/CmVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSksZWRnZT10aGlzLl9lZGdlT2Jqc1tlXTtpZihlZGdlKXt2PWVkZ2Uudjt3PWVkZ2UudztkZWxldGUgdGhpcy5fZWRnZUxhYmVsc1tlXTtkZWxldGUgdGhpcy5fZWRnZU9ianNbZV07ZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9wcmVkc1t3XSx2KTtkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3N1Y3Nbdl0sdyk7ZGVsZXRlIHRoaXMuX2luW3ddW2VdO2RlbGV0ZSB0aGlzLl9vdXRbdl1bZV07dGhpcy5fZWRnZUNvdW50LS19cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5pbkVkZ2VzPWZ1bmN0aW9uKHYsdSl7dmFyIGluVj10aGlzLl9pblt2XTtpZihpblYpe3ZhciBlZGdlcz1fLnZhbHVlcyhpblYpO2lmKCF1KXJldHVybiBlZGdlcztyZXR1cm4gXy5maWx0ZXIoZWRnZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGVkZ2Uudj09PQp1fSl9fTtHcmFwaC5wcm90b3R5cGUub3V0RWRnZXM9ZnVuY3Rpb24odix3KXt2YXIgb3V0Vj10aGlzLl9vdXRbdl07aWYob3V0Vil7dmFyIGVkZ2VzPV8udmFsdWVzKG91dFYpO2lmKCF3KXJldHVybiBlZGdlcztyZXR1cm4gXy5maWx0ZXIoZWRnZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGVkZ2Uudz09PXd9KX19O0dyYXBoLnByb3RvdHlwZS5ub2RlRWRnZXM9ZnVuY3Rpb24odix3KXt2YXIgaW5FZGdlcz10aGlzLmluRWRnZXModix3KTtpZihpbkVkZ2VzKXJldHVybiBpbkVkZ2VzLmNvbmNhdCh0aGlzLm91dEVkZ2VzKHYsdykpfTtmdW5jdGlvbiBpbmNyZW1lbnRPckluaXRFbnRyeShtYXAsayl7aWYobWFwW2tdKW1hcFtrXSsrO2Vsc2UgbWFwW2tdPTF9ZnVuY3Rpb24gZGVjcmVtZW50T3JSZW1vdmVFbnRyeShtYXAsayl7aWYoIS0tbWFwW2tdKWRlbGV0ZSBtYXBba119ZnVuY3Rpb24gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsdl8sd18sbmFtZSl7dmFyIHY9IiIrdl87dmFyIHc9CiIiK3dfO2lmKCFpc0RpcmVjdGVkJiZ2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9cmV0dXJuIHYrRURHRV9LRVlfREVMSU0rdytFREdFX0tFWV9ERUxJTSsoXy5pc1VuZGVmaW5lZChuYW1lKT9ERUZBVUxUX0VER0VfTkFNRTpuYW1lKX1mdW5jdGlvbiBlZGdlQXJnc1RvT2JqKGlzRGlyZWN0ZWQsdl8sd18sbmFtZSl7dmFyIHY9IiIrdl87dmFyIHc9IiIrd187aWYoIWlzRGlyZWN0ZWQmJnY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH12YXIgZWRnZU9iaj17djp2LHc6d307aWYobmFtZSllZGdlT2JqLm5hbWU9bmFtZTtyZXR1cm4gZWRnZU9ian1mdW5jdGlvbiBlZGdlT2JqVG9JZChpc0RpcmVjdGVkLGVkZ2VPYmope3JldHVybiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCxlZGdlT2JqLnYsZWRnZU9iai53LGVkZ2VPYmoubmFtZSl9fSx7Ii4vbG9kYXNoIjoxOX1dLDE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17R3JhcGg6cmVxdWlyZSgiLi9ncmFwaCIpLAp2ZXJzaW9uOnJlcXVpcmUoIi4vdmVyc2lvbiIpfX0seyIuL2dyYXBoIjoxNiwiLi92ZXJzaW9uIjoyMH1dLDE4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGgiKTttb2R1bGUuZXhwb3J0cz17d3JpdGU6d3JpdGUscmVhZDpyZWFkfTtmdW5jdGlvbiB3cml0ZShnKXt2YXIganNvbj17b3B0aW9uczp7ZGlyZWN0ZWQ6Zy5pc0RpcmVjdGVkKCksbXVsdGlncmFwaDpnLmlzTXVsdGlncmFwaCgpLGNvbXBvdW5kOmcuaXNDb21wb3VuZCgpfSxub2Rlczp3cml0ZU5vZGVzKGcpLGVkZ2VzOndyaXRlRWRnZXMoZyl9O2lmKCFfLmlzVW5kZWZpbmVkKGcuZ3JhcGgoKSkpanNvbi52YWx1ZT1fLmNsb25lKGcuZ3JhcGgoKSk7cmV0dXJuIGpzb259ZnVuY3Rpb24gd3JpdGVOb2RlcyhnKXtyZXR1cm4gXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlVmFsdWU9Zy5ub2RlKHYpLHBhcmVudD0KZy5wYXJlbnQodiksbm9kZT17djp2fTtpZighXy5pc1VuZGVmaW5lZChub2RlVmFsdWUpKW5vZGUudmFsdWU9bm9kZVZhbHVlO2lmKCFfLmlzVW5kZWZpbmVkKHBhcmVudCkpbm9kZS5wYXJlbnQ9cGFyZW50O3JldHVybiBub2RlfSl9ZnVuY3Rpb24gd3JpdGVFZGdlcyhnKXtyZXR1cm4gXy5tYXAoZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlVmFsdWU9Zy5lZGdlKGUpLGVkZ2U9e3Y6ZS52LHc6ZS53fTtpZighXy5pc1VuZGVmaW5lZChlLm5hbWUpKWVkZ2UubmFtZT1lLm5hbWU7aWYoIV8uaXNVbmRlZmluZWQoZWRnZVZhbHVlKSllZGdlLnZhbHVlPWVkZ2VWYWx1ZTtyZXR1cm4gZWRnZX0pfWZ1bmN0aW9uIHJlYWQoanNvbil7dmFyIGc9KG5ldyBHcmFwaChqc29uLm9wdGlvbnMpKS5zZXRHcmFwaChqc29uLnZhbHVlKTtfLmVhY2goanNvbi5ub2RlcyxmdW5jdGlvbihlbnRyeSl7Zy5zZXROb2RlKGVudHJ5LnYsZW50cnkudmFsdWUpO2lmKGVudHJ5LnBhcmVudClnLnNldFBhcmVudChlbnRyeS52LAplbnRyeS5wYXJlbnQpfSk7Xy5lYWNoKGpzb24uZWRnZXMsZnVuY3Rpb24oZW50cnkpe2cuc2V0RWRnZSh7djplbnRyeS52LHc6ZW50cnkudyxuYW1lOmVudHJ5Lm5hbWV9LGVudHJ5LnZhbHVlKX0pO3JldHVybiBnfX0seyIuL2dyYXBoIjoxNiwiLi9sb2Rhc2giOjE5fV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsb2Rhc2g7aWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtsb2Rhc2g9cmVxdWlyZSgibG9kYXNoIil9Y2F0Y2goZSl7fWlmKCFsb2Rhc2gpbG9kYXNoPXdpbmRvdy5fO21vZHVsZS5leHBvcnRzPWxvZGFzaH0seyJsb2Rhc2giOnVuZGVmaW5lZH1dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz0iMi4xLjUifSx7fV19LHt9LFsxXSkoMSl9KTsKKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09Im9iamVjdCImJnR5cGVvZiBtb2R1bGUhPT0idW5kZWZpbmVkIiltb2R1bGUuZXhwb3J0cz1mKCk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZClkZWZpbmUoW10sZik7ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpZz13aW5kb3c7ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09InVuZGVmaW5lZCIpZz1nbG9iYWw7ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiKWc9c2VsZjtlbHNlIGc9dGhpcztnLmRhZ3JlPWYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9Cm5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK28rIiciKTt0aHJvdyBmLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGY7fXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30oezE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXtncmFwaGxpYjpyZXF1aXJlKCIuL2xpYi9ncmFwaGxpYiIpLGxheW91dDpyZXF1aXJlKCIuL2xpYi9sYXlvdXQiKSxkZWJ1ZzpyZXF1aXJlKCIuL2xpYi9kZWJ1ZyIpLHV0aWw6e3RpbWU6cmVxdWlyZSgiLi9saWIvdXRpbCIpLnRpbWUsbm90aW1lOnJlcXVpcmUoIi4vbGliL3V0aWwiKS5ub3RpbWV9LAp2ZXJzaW9uOnJlcXVpcmUoIi4vbGliL3ZlcnNpb24iKX19LHsiLi9saWIvZGVidWciOjYsIi4vbGliL2dyYXBobGliIjo3LCIuL2xpYi9sYXlvdXQiOjksIi4vbGliL3V0aWwiOjI5LCIuL2xpYi92ZXJzaW9uIjozMH1dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksZ3JlZWR5RkFTPXJlcXVpcmUoIi4vZ3JlZWR5LWZhcyIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLHVuZG86dW5kb307ZnVuY3Rpb24gcnVuKGcpe3ZhciBmYXM9Zy5ncmFwaCgpLmFjeWNsaWNlcj09PSJncmVlZHkiP2dyZWVkeUZBUyhnLHdlaWdodEZuKGcpKTpkZnNGQVMoZyk7Xy5mb3JFYWNoKGZhcyxmdW5jdGlvbihlKXt2YXIgbGFiZWw9Zy5lZGdlKGUpO2cucmVtb3ZlRWRnZShlKTtsYWJlbC5mb3J3YXJkTmFtZT1lLm5hbWU7bGFiZWwucmV2ZXJzZWQ9dHJ1ZTtnLnNldEVkZ2UoZS53LGUudixsYWJlbCxfLnVuaXF1ZUlkKCJyZXYiKSl9KTtmdW5jdGlvbiB3ZWlnaHRGbihnKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGcuZWRnZShlKS53ZWlnaHR9fQp9ZnVuY3Rpb24gZGZzRkFTKGcpe3ZhciBmYXM9W10sc3RhY2s9e30sdmlzaXRlZD17fTtmdW5jdGlvbiBkZnModil7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm47dmlzaXRlZFt2XT10cnVlO3N0YWNrW3ZdPXRydWU7Xy5mb3JFYWNoKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7aWYoXy5oYXMoc3RhY2ssZS53KSlmYXMucHVzaChlKTtlbHNlIGRmcyhlLncpfSk7ZGVsZXRlIHN0YWNrW3ZdfV8uZm9yRWFjaChnLm5vZGVzKCksZGZzKTtyZXR1cm4gZmFzfWZ1bmN0aW9uIHVuZG8oZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgbGFiZWw9Zy5lZGdlKGUpO2lmKGxhYmVsLnJldmVyc2VkKXtnLnJlbW92ZUVkZ2UoZSk7dmFyIGZvcndhcmROYW1lPWxhYmVsLmZvcndhcmROYW1lO2RlbGV0ZSBsYWJlbC5yZXZlcnNlZDtkZWxldGUgbGFiZWwuZm9yd2FyZE5hbWU7Zy5zZXRFZGdlKGUudyxlLnYsbGFiZWwsZm9yd2FyZE5hbWUpfX0pfX0seyIuL2dyZWVkeS1mYXMiOjgsCiIuL2xvZGFzaCI6MTB9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9YWRkQm9yZGVyU2VnbWVudHM7ZnVuY3Rpb24gYWRkQm9yZGVyU2VnbWVudHMoZyl7ZnVuY3Rpb24gZGZzKHYpe3ZhciBjaGlsZHJlbj1nLmNoaWxkcmVuKHYpLG5vZGU9Zy5ub2RlKHYpO2lmKGNoaWxkcmVuLmxlbmd0aClfLmZvckVhY2goY2hpbGRyZW4sZGZzKTtpZihfLmhhcyhub2RlLCJtaW5SYW5rIikpe25vZGUuYm9yZGVyTGVmdD1bXTtub2RlLmJvcmRlclJpZ2h0PVtdO2Zvcih2YXIgcmFuaz1ub2RlLm1pblJhbmssbWF4UmFuaz1ub2RlLm1heFJhbmsrMTtyYW5rPG1heFJhbms7KytyYW5rKXthZGRCb3JkZXJOb2RlKGcsImJvcmRlckxlZnQiLCJfYmwiLHYsbm9kZSxyYW5rKTthZGRCb3JkZXJOb2RlKGcsImJvcmRlclJpZ2h0IiwiX2JyIix2LG5vZGUscmFuayl9fX1fLmZvckVhY2goZy5jaGlsZHJlbigpLApkZnMpfWZ1bmN0aW9uIGFkZEJvcmRlck5vZGUoZyxwcm9wLHByZWZpeCxzZyxzZ05vZGUscmFuayl7dmFyIGxhYmVsPXt3aWR0aDowLGhlaWdodDowLHJhbms6cmFuayxib3JkZXJUeXBlOnByb3B9LHByZXY9c2dOb2RlW3Byb3BdW3JhbmstMV0sY3Vycj11dGlsLmFkZER1bW15Tm9kZShnLCJib3JkZXIiLGxhYmVsLHByZWZpeCk7c2dOb2RlW3Byb3BdW3JhbmtdPWN1cnI7Zy5zZXRQYXJlbnQoY3VycixzZyk7aWYocHJldilnLnNldEVkZ2UocHJldixjdXJyLHt3ZWlnaHQ6MX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXthZGp1c3Q6YWRqdXN0LHVuZG86dW5kb307ZnVuY3Rpb24gYWRqdXN0KGcpe3ZhciByYW5rRGlyPWcuZ3JhcGgoKS5yYW5rZGlyLnRvTG93ZXJDYXNlKCk7aWYocmFua0Rpcj09PSJsciJ8fHJhbmtEaXI9PT0icmwiKXN3YXBXaWR0aEhlaWdodChnKX0KZnVuY3Rpb24gdW5kbyhnKXt2YXIgcmFua0Rpcj1nLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO2lmKHJhbmtEaXI9PT0iYnQifHxyYW5rRGlyPT09InJsIilyZXZlcnNlWShnKTtpZihyYW5rRGlyPT09ImxyInx8cmFua0Rpcj09PSJybCIpe3N3YXBYWShnKTtzd2FwV2lkdGhIZWlnaHQoZyl9fWZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodChnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3N3YXBXaWR0aEhlaWdodE9uZShnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtzd2FwV2lkdGhIZWlnaHRPbmUoZy5lZGdlKGUpKX0pfWZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodE9uZShhdHRycyl7dmFyIHc9YXR0cnMud2lkdGg7YXR0cnMud2lkdGg9YXR0cnMuaGVpZ2h0O2F0dHJzLmhlaWdodD13fWZ1bmN0aW9uIHJldmVyc2VZKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7cmV2ZXJzZVlPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksCmZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtfLmZvckVhY2goZWRnZS5wb2ludHMscmV2ZXJzZVlPbmUpO2lmKF8uaGFzKGVkZ2UsInkiKSlyZXZlcnNlWU9uZShlZGdlKX0pfWZ1bmN0aW9uIHJldmVyc2VZT25lKGF0dHJzKXthdHRycy55PS1hdHRycy55fWZ1bmN0aW9uIHN3YXBYWShnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3N3YXBYWU9uZShnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7Xy5mb3JFYWNoKGVkZ2UucG9pbnRzLHN3YXBYWU9uZSk7aWYoXy5oYXMoZWRnZSwieCIpKXN3YXBYWU9uZShlZGdlKX0pfWZ1bmN0aW9uIHN3YXBYWU9uZShhdHRycyl7dmFyIHg9YXR0cnMueDthdHRycy54PWF0dHJzLnk7YXR0cnMueT14fX0seyIuL2xvZGFzaCI6MTB9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1MaXN0O2Z1bmN0aW9uIExpc3QoKXt2YXIgc2VudGluZWw9Cnt9O3NlbnRpbmVsLl9uZXh0PXNlbnRpbmVsLl9wcmV2PXNlbnRpbmVsO3RoaXMuX3NlbnRpbmVsPXNlbnRpbmVsfUxpc3QucHJvdG90eXBlLmRlcXVldWU9ZnVuY3Rpb24oKXt2YXIgc2VudGluZWw9dGhpcy5fc2VudGluZWwsZW50cnk9c2VudGluZWwuX3ByZXY7aWYoZW50cnkhPT1zZW50aW5lbCl7dW5saW5rKGVudHJ5KTtyZXR1cm4gZW50cnl9fTtMaXN0LnByb3RvdHlwZS5lbnF1ZXVlPWZ1bmN0aW9uKGVudHJ5KXt2YXIgc2VudGluZWw9dGhpcy5fc2VudGluZWw7aWYoZW50cnkuX3ByZXYmJmVudHJ5Ll9uZXh0KXVubGluayhlbnRyeSk7ZW50cnkuX25leHQ9c2VudGluZWwuX25leHQ7c2VudGluZWwuX25leHQuX3ByZXY9ZW50cnk7c2VudGluZWwuX25leHQ9ZW50cnk7ZW50cnkuX3ByZXY9c2VudGluZWx9O0xpc3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHN0cnM9W10sc2VudGluZWw9dGhpcy5fc2VudGluZWwsY3Vycj1zZW50aW5lbC5fcHJldjt3aGlsZShjdXJyIT09CnNlbnRpbmVsKXtzdHJzLnB1c2goSlNPTi5zdHJpbmdpZnkoY3VycixmaWx0ZXJPdXRMaW5rcykpO2N1cnI9Y3Vyci5fcHJldn1yZXR1cm4iWyIrc3Rycy5qb2luKCIsICIpKyJdIn07ZnVuY3Rpb24gdW5saW5rKGVudHJ5KXtlbnRyeS5fcHJldi5fbmV4dD1lbnRyeS5fbmV4dDtlbnRyeS5fbmV4dC5fcHJldj1lbnRyeS5fcHJldjtkZWxldGUgZW50cnkuX25leHQ7ZGVsZXRlIGVudHJ5Ll9wcmV2fWZ1bmN0aW9uIGZpbHRlck91dExpbmtzKGssdil7aWYoayE9PSJfbmV4dCImJmshPT0iX3ByZXYiKXJldHVybiB2fX0se31dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9e2RlYnVnT3JkZXJpbmc6ZGVidWdPcmRlcmluZ307ZnVuY3Rpb24gZGVidWdPcmRlcmluZyhnKXt2YXIgbGF5ZXJNYXRyaXg9CnV0aWwuYnVpbGRMYXllck1hdHJpeChnKTt2YXIgaD0obmV3IEdyYXBoKHtjb21wb3VuZDp0cnVlLG11bHRpZ3JhcGg6dHJ1ZX0pKS5zZXRHcmFwaCh7fSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtoLnNldE5vZGUodix7bGFiZWw6dn0pO2guc2V0UGFyZW50KHYsImxheWVyIitnLm5vZGUodikucmFuayl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2guc2V0RWRnZShlLnYsZS53LHt9LGUubmFtZSl9KTtfLmZvckVhY2gobGF5ZXJNYXRyaXgsZnVuY3Rpb24obGF5ZXIsaSl7dmFyIGxheWVyVj0ibGF5ZXIiK2k7aC5zZXROb2RlKGxheWVyVix7cmFuazoic2FtZSJ9KTtfLnJlZHVjZShsYXllcixmdW5jdGlvbih1LHYpe2guc2V0RWRnZSh1LHYse3N0eWxlOiJpbnZpcyJ9KTtyZXR1cm4gdn0pfSk7cmV0dXJuIGh9fSx7Ii4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOX1dLDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBncmFwaGxpYjsKaWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtncmFwaGxpYj1yZXF1aXJlKCJncmFwaGxpYiIpfWNhdGNoKGUpe31pZighZ3JhcGhsaWIpZ3JhcGhsaWI9d2luZG93LmdyYXBobGliO21vZHVsZS5leHBvcnRzPWdyYXBobGlifSx7ImdyYXBobGliIjp1bmRlZmluZWR9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaCxMaXN0PXJlcXVpcmUoIi4vZGF0YS9saXN0Iik7bW9kdWxlLmV4cG9ydHM9Z3JlZWR5RkFTO3ZhciBERUZBVUxUX1dFSUdIVF9GTj1fLmNvbnN0YW50KDEpO2Z1bmN0aW9uIGdyZWVkeUZBUyhnLHdlaWdodEZuKXtpZihnLm5vZGVDb3VudCgpPD0xKXJldHVybltdO3ZhciBzdGF0ZT1idWlsZFN0YXRlKGcsd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZOKTt2YXIgcmVzdWx0cz1kb0dyZWVkeUZBUyhzdGF0ZS5ncmFwaCxzdGF0ZS5idWNrZXRzLApzdGF0ZS56ZXJvSWR4KTtyZXR1cm4gXy5mbGF0dGVuKF8ubWFwKHJlc3VsdHMsZnVuY3Rpb24oZSl7cmV0dXJuIGcub3V0RWRnZXMoZS52LGUudyl9KSx0cnVlKX1mdW5jdGlvbiBkb0dyZWVkeUZBUyhnLGJ1Y2tldHMsemVyb0lkeCl7dmFyIHJlc3VsdHM9W10sc291cmNlcz1idWNrZXRzW2J1Y2tldHMubGVuZ3RoLTFdLHNpbmtzPWJ1Y2tldHNbMF07dmFyIGVudHJ5O3doaWxlKGcubm9kZUNvdW50KCkpe3doaWxlKGVudHJ5PXNpbmtzLmRlcXVldWUoKSlyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5KTt3aGlsZShlbnRyeT1zb3VyY2VzLmRlcXVldWUoKSlyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5KTtpZihnLm5vZGVDb3VudCgpKWZvcih2YXIgaT1idWNrZXRzLmxlbmd0aC0yO2k+MDstLWkpe2VudHJ5PWJ1Y2tldHNbaV0uZGVxdWV1ZSgpO2lmKGVudHJ5KXtyZXN1bHRzPXJlc3VsdHMuY29uY2F0KHJlbW92ZU5vZGUoZyxidWNrZXRzLHplcm9JZHgsCmVudHJ5LHRydWUpKTticmVha319fXJldHVybiByZXN1bHRzfWZ1bmN0aW9uIHJlbW92ZU5vZGUoZyxidWNrZXRzLHplcm9JZHgsZW50cnksY29sbGVjdFByZWRlY2Vzc29ycyl7dmFyIHJlc3VsdHM9Y29sbGVjdFByZWRlY2Vzc29ycz9bXTp1bmRlZmluZWQ7Xy5mb3JFYWNoKGcuaW5FZGdlcyhlbnRyeS52KSxmdW5jdGlvbihlZGdlKXt2YXIgd2VpZ2h0PWcuZWRnZShlZGdlKSx1RW50cnk9Zy5ub2RlKGVkZ2Uudik7aWYoY29sbGVjdFByZWRlY2Vzc29ycylyZXN1bHRzLnB1c2goe3Y6ZWRnZS52LHc6ZWRnZS53fSk7dUVudHJ5Lm91dC09d2VpZ2h0O2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsdUVudHJ5KX0pO18uZm9yRWFjaChnLm91dEVkZ2VzKGVudHJ5LnYpLGZ1bmN0aW9uKGVkZ2Upe3ZhciB3ZWlnaHQ9Zy5lZGdlKGVkZ2UpLHc9ZWRnZS53LHdFbnRyeT1nLm5vZGUodyk7d0VudHJ5WyJpbiJdLT13ZWlnaHQ7YXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCx3RW50cnkpfSk7CmcucmVtb3ZlTm9kZShlbnRyeS52KTtyZXR1cm4gcmVzdWx0c31mdW5jdGlvbiBidWlsZFN0YXRlKGcsd2VpZ2h0Rm4pe3ZhciBmYXNHcmFwaD1uZXcgR3JhcGgsbWF4SW49MCxtYXhPdXQ9MDtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2Zhc0dyYXBoLnNldE5vZGUodix7djp2LCJpbiI6MCxvdXQ6MH0pfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgcHJldldlaWdodD1mYXNHcmFwaC5lZGdlKGUudixlLncpfHwwLHdlaWdodD13ZWlnaHRGbihlKSxlZGdlV2VpZ2h0PXByZXZXZWlnaHQrd2VpZ2h0O2Zhc0dyYXBoLnNldEVkZ2UoZS52LGUudyxlZGdlV2VpZ2h0KTttYXhPdXQ9TWF0aC5tYXgobWF4T3V0LGZhc0dyYXBoLm5vZGUoZS52KS5vdXQrPXdlaWdodCk7bWF4SW49TWF0aC5tYXgobWF4SW4sZmFzR3JhcGgubm9kZShlLncpWyJpbiJdKz13ZWlnaHQpfSk7dmFyIGJ1Y2tldHM9Xy5yYW5nZShtYXhPdXQrbWF4SW4rMykubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMaXN0fSk7CnZhciB6ZXJvSWR4PW1heEluKzE7Xy5mb3JFYWNoKGZhc0dyYXBoLm5vZGVzKCksZnVuY3Rpb24odil7YXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCxmYXNHcmFwaC5ub2RlKHYpKX0pO3JldHVybntncmFwaDpmYXNHcmFwaCxidWNrZXRzOmJ1Y2tldHMsemVyb0lkeDp6ZXJvSWR4fX1mdW5jdGlvbiBhc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LGVudHJ5KXtpZighZW50cnkub3V0KWJ1Y2tldHNbMF0uZW5xdWV1ZShlbnRyeSk7ZWxzZSBpZighZW50cnlbImluIl0pYnVja2V0c1tidWNrZXRzLmxlbmd0aC0xXS5lbnF1ZXVlKGVudHJ5KTtlbHNlIGJ1Y2tldHNbZW50cnkub3V0LWVudHJ5WyJpbiJdK3plcm9JZHhdLmVucXVldWUoZW50cnkpfX0seyIuL2RhdGEvbGlzdCI6NSwiLi9ncmFwaGxpYiI6NywiLi9sb2Rhc2giOjEwfV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxhY3ljbGljPXJlcXVpcmUoIi4vYWN5Y2xpYyIpLApub3JtYWxpemU9cmVxdWlyZSgiLi9ub3JtYWxpemUiKSxyYW5rPXJlcXVpcmUoIi4vcmFuayIpLG5vcm1hbGl6ZVJhbmtzPXJlcXVpcmUoIi4vdXRpbCIpLm5vcm1hbGl6ZVJhbmtzLHBhcmVudER1bW15Q2hhaW5zPXJlcXVpcmUoIi4vcGFyZW50LWR1bW15LWNoYWlucyIpLHJlbW92ZUVtcHR5UmFua3M9cmVxdWlyZSgiLi91dGlsIikucmVtb3ZlRW1wdHlSYW5rcyxuZXN0aW5nR3JhcGg9cmVxdWlyZSgiLi9uZXN0aW5nLWdyYXBoIiksYWRkQm9yZGVyU2VnbWVudHM9cmVxdWlyZSgiLi9hZGQtYm9yZGVyLXNlZ21lbnRzIiksY29vcmRpbmF0ZVN5c3RlbT1yZXF1aXJlKCIuL2Nvb3JkaW5hdGUtc3lzdGVtIiksb3JkZXI9cmVxdWlyZSgiLi9vcmRlciIpLHBvc2l0aW9uPXJlcXVpcmUoIi4vcG9zaXRpb24iKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz1sYXlvdXQ7ZnVuY3Rpb24gbGF5b3V0KGcsb3B0cyl7dmFyIHRpbWU9Cm9wdHMmJm9wdHMuZGVidWdUaW1pbmc/dXRpbC50aW1lOnV0aWwubm90aW1lO3RpbWUoImxheW91dCIsZnVuY3Rpb24oKXt2YXIgbGF5b3V0R3JhcGg9dGltZSgiICBidWlsZExheW91dEdyYXBoIixmdW5jdGlvbigpe3JldHVybiBidWlsZExheW91dEdyYXBoKGcpfSk7dGltZSgiICBydW5MYXlvdXQiLGZ1bmN0aW9uKCl7cnVuTGF5b3V0KGxheW91dEdyYXBoLHRpbWUpfSk7dGltZSgiICB1cGRhdGVJbnB1dEdyYXBoIixmdW5jdGlvbigpe3VwZGF0ZUlucHV0R3JhcGgoZyxsYXlvdXRHcmFwaCl9KX0pfWZ1bmN0aW9uIHJ1bkxheW91dChnLHRpbWUpe3RpbWUoIiAgICBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzIixmdW5jdGlvbigpe21ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZyl9KTt0aW1lKCIgICAgcmVtb3ZlU2VsZkVkZ2VzIixmdW5jdGlvbigpe3JlbW92ZVNlbGZFZGdlcyhnKX0pO3RpbWUoIiAgICBhY3ljbGljIixmdW5jdGlvbigpe2FjeWNsaWMucnVuKGcpfSk7dGltZSgiICAgIG5lc3RpbmdHcmFwaC5ydW4iLApmdW5jdGlvbigpe25lc3RpbmdHcmFwaC5ydW4oZyl9KTt0aW1lKCIgICAgcmFuayIsZnVuY3Rpb24oKXtyYW5rKHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpKX0pO3RpbWUoIiAgICBpbmplY3RFZGdlTGFiZWxQcm94aWVzIixmdW5jdGlvbigpe2luamVjdEVkZ2VMYWJlbFByb3hpZXMoZyl9KTt0aW1lKCIgICAgcmVtb3ZlRW1wdHlSYW5rcyIsZnVuY3Rpb24oKXtyZW1vdmVFbXB0eVJhbmtzKGcpfSk7dGltZSgiICAgIG5lc3RpbmdHcmFwaC5jbGVhbnVwIixmdW5jdGlvbigpe25lc3RpbmdHcmFwaC5jbGVhbnVwKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZVJhbmtzIixmdW5jdGlvbigpe25vcm1hbGl6ZVJhbmtzKGcpfSk7dGltZSgiICAgIGFzc2lnblJhbmtNaW5NYXgiLGZ1bmN0aW9uKCl7YXNzaWduUmFua01pbk1heChnKX0pO3RpbWUoIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzIixmdW5jdGlvbigpe3JlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZyl9KTt0aW1lKCIgICAgbm9ybWFsaXplLnJ1biIsCmZ1bmN0aW9uKCl7bm9ybWFsaXplLnJ1bihnKX0pO3RpbWUoIiAgICBwYXJlbnREdW1teUNoYWlucyIsZnVuY3Rpb24oKXtwYXJlbnREdW1teUNoYWlucyhnKX0pO3RpbWUoIiAgICBhZGRCb3JkZXJTZWdtZW50cyIsZnVuY3Rpb24oKXthZGRCb3JkZXJTZWdtZW50cyhnKX0pO3RpbWUoIiAgICBvcmRlciIsZnVuY3Rpb24oKXtvcmRlcihnKX0pO3RpbWUoIiAgICBpbnNlcnRTZWxmRWRnZXMiLGZ1bmN0aW9uKCl7aW5zZXJ0U2VsZkVkZ2VzKGcpfSk7dGltZSgiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW0iLGZ1bmN0aW9uKCl7Y29vcmRpbmF0ZVN5c3RlbS5hZGp1c3QoZyl9KTt0aW1lKCIgICAgcG9zaXRpb24iLGZ1bmN0aW9uKCl7cG9zaXRpb24oZyl9KTt0aW1lKCIgICAgcG9zaXRpb25TZWxmRWRnZXMiLGZ1bmN0aW9uKCl7cG9zaXRpb25TZWxmRWRnZXMoZyl9KTt0aW1lKCIgICAgcmVtb3ZlQm9yZGVyTm9kZXMiLGZ1bmN0aW9uKCl7cmVtb3ZlQm9yZGVyTm9kZXMoZyl9KTt0aW1lKCIgICAgbm9ybWFsaXplLnVuZG8iLApmdW5jdGlvbigpe25vcm1hbGl6ZS51bmRvKGcpfSk7dGltZSgiICAgIGZpeHVwRWRnZUxhYmVsQ29vcmRzIixmdW5jdGlvbigpe2ZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpfSk7dGltZSgiICAgIHVuZG9Db29yZGluYXRlU3lzdGVtIixmdW5jdGlvbigpe2Nvb3JkaW5hdGVTeXN0ZW0udW5kbyhnKX0pO3RpbWUoIiAgICB0cmFuc2xhdGVHcmFwaCIsZnVuY3Rpb24oKXt0cmFuc2xhdGVHcmFwaChnKX0pO3RpbWUoIiAgICBhc3NpZ25Ob2RlSW50ZXJzZWN0cyIsZnVuY3Rpb24oKXthc3NpZ25Ob2RlSW50ZXJzZWN0cyhnKX0pO3RpbWUoIiAgICByZXZlcnNlUG9pbnRzIixmdW5jdGlvbigpe3JldmVyc2VQb2ludHNGb3JSZXZlcnNlZEVkZ2VzKGcpfSk7dGltZSgiICAgIGFjeWNsaWMudW5kbyIsZnVuY3Rpb24oKXthY3ljbGljLnVuZG8oZyl9KX1mdW5jdGlvbiB1cGRhdGVJbnB1dEdyYXBoKGlucHV0R3JhcGgsbGF5b3V0R3JhcGgpe18uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIGlucHV0TGFiZWw9CmlucHV0R3JhcGgubm9kZSh2KSxsYXlvdXRMYWJlbD1sYXlvdXRHcmFwaC5ub2RlKHYpO2lmKGlucHV0TGFiZWwpe2lucHV0TGFiZWwueD1sYXlvdXRMYWJlbC54O2lucHV0TGFiZWwueT1sYXlvdXRMYWJlbC55O2lmKGxheW91dEdyYXBoLmNoaWxkcmVuKHYpLmxlbmd0aCl7aW5wdXRMYWJlbC53aWR0aD1sYXlvdXRMYWJlbC53aWR0aDtpbnB1dExhYmVsLmhlaWdodD1sYXlvdXRMYWJlbC5oZWlnaHR9fX0pO18uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGlucHV0TGFiZWw9aW5wdXRHcmFwaC5lZGdlKGUpLGxheW91dExhYmVsPWxheW91dEdyYXBoLmVkZ2UoZSk7aW5wdXRMYWJlbC5wb2ludHM9bGF5b3V0TGFiZWwucG9pbnRzO2lmKF8uaGFzKGxheW91dExhYmVsLCJ4Iikpe2lucHV0TGFiZWwueD1sYXlvdXRMYWJlbC54O2lucHV0TGFiZWwueT1sYXlvdXRMYWJlbC55fX0pO2lucHV0R3JhcGguZ3JhcGgoKS53aWR0aD1sYXlvdXRHcmFwaC5ncmFwaCgpLndpZHRoOwppbnB1dEdyYXBoLmdyYXBoKCkuaGVpZ2h0PWxheW91dEdyYXBoLmdyYXBoKCkuaGVpZ2h0fXZhciBncmFwaE51bUF0dHJzPVsibm9kZXNlcCIsImVkZ2VzZXAiLCJyYW5rc2VwIiwibWFyZ2lueCIsIm1hcmdpbnkiXSxncmFwaERlZmF1bHRzPXtyYW5rc2VwOjUwLGVkZ2VzZXA6MjAsbm9kZXNlcDo1MCxyYW5rZGlyOiJ0YiJ9LGdyYXBoQXR0cnM9WyJhY3ljbGljZXIiLCJyYW5rZXIiLCJyYW5rZGlyIiwiYWxpZ24iXSxub2RlTnVtQXR0cnM9WyJ3aWR0aCIsImhlaWdodCJdLG5vZGVEZWZhdWx0cz17d2lkdGg6MCxoZWlnaHQ6MH0sZWRnZU51bUF0dHJzPVsibWlubGVuIiwid2VpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJsYWJlbG9mZnNldCJdLGVkZ2VEZWZhdWx0cz17bWlubGVuOjEsd2VpZ2h0OjEsd2lkdGg6MCxoZWlnaHQ6MCxsYWJlbG9mZnNldDoxMCxsYWJlbHBvczoiciJ9LGVkZ2VBdHRycz1bImxhYmVscG9zIl07ZnVuY3Rpb24gYnVpbGRMYXlvdXRHcmFwaChpbnB1dEdyYXBoKXt2YXIgZz0KbmV3IEdyYXBoKHttdWx0aWdyYXBoOnRydWUsY29tcG91bmQ6dHJ1ZX0pLGdyYXBoPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLmdyYXBoKCkpO2cuc2V0R3JhcGgoXy5tZXJnZSh7fSxncmFwaERlZmF1bHRzLHNlbGVjdE51bWJlckF0dHJzKGdyYXBoLGdyYXBoTnVtQXR0cnMpLF8ucGljayhncmFwaCxncmFwaEF0dHJzKSkpO18uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Y2Fub25pY2FsaXplKGlucHV0R3JhcGgubm9kZSh2KSk7Zy5zZXROb2RlKHYsXy5kZWZhdWx0cyhzZWxlY3ROdW1iZXJBdHRycyhub2RlLG5vZGVOdW1BdHRycyksbm9kZURlZmF1bHRzKSk7Zy5zZXRQYXJlbnQodixpbnB1dEdyYXBoLnBhcmVudCh2KSl9KTtfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLmVkZ2UoZSkpO2cuc2V0RWRnZShlLF8ubWVyZ2Uoe30sZWRnZURlZmF1bHRzLHNlbGVjdE51bWJlckF0dHJzKGVkZ2UsCmVkZ2VOdW1BdHRycyksXy5waWNrKGVkZ2UsZWRnZUF0dHJzKSkpfSk7cmV0dXJuIGd9ZnVuY3Rpb24gbWFrZVNwYWNlRm9yRWRnZUxhYmVscyhnKXt2YXIgZ3JhcGg9Zy5ncmFwaCgpO2dyYXBoLnJhbmtzZXAvPTI7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7ZWRnZS5taW5sZW4qPTI7aWYoZWRnZS5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpIT09ImMiKWlmKGdyYXBoLnJhbmtkaXI9PT0iVEIifHxncmFwaC5yYW5rZGlyPT09IkJUIillZGdlLndpZHRoKz1lZGdlLmxhYmVsb2Zmc2V0O2Vsc2UgZWRnZS5oZWlnaHQrPWVkZ2UubGFiZWxvZmZzZXR9KX1mdW5jdGlvbiBpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2Uud2lkdGgmJmVkZ2UuaGVpZ2h0KXt2YXIgdj1nLm5vZGUoZS52KSx3PWcubm9kZShlLncpLGxhYmVsPXtyYW5rOih3LnJhbmstCnYucmFuaykvMit2LnJhbmssZTplfTt1dGlsLmFkZER1bW15Tm9kZShnLCJlZGdlLXByb3h5IixsYWJlbCwiX2VwIil9fSl9ZnVuY3Rpb24gYXNzaWduUmFua01pbk1heChnKXt2YXIgbWF4UmFuaz0wO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO2lmKG5vZGUuYm9yZGVyVG9wKXtub2RlLm1pblJhbms9Zy5ub2RlKG5vZGUuYm9yZGVyVG9wKS5yYW5rO25vZGUubWF4UmFuaz1nLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLnJhbms7bWF4UmFuaz1fLm1heChtYXhSYW5rLG5vZGUubWF4UmFuayl9fSk7Zy5ncmFwaCgpLm1heFJhbms9bWF4UmFua31mdW5jdGlvbiByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO2lmKG5vZGUuZHVtbXk9PT0iZWRnZS1wcm94eSIpe2cuZWRnZShub2RlLmUpLmxhYmVsUmFuaz1ub2RlLnJhbms7Zy5yZW1vdmVOb2RlKHYpfX0pfQpmdW5jdGlvbiB0cmFuc2xhdGVHcmFwaChnKXt2YXIgbWluWD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbWF4WD0wLG1pblk9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG1heFk9MCxncmFwaExhYmVsPWcuZ3JhcGgoKSxtYXJnaW5YPWdyYXBoTGFiZWwubWFyZ2lueHx8MCxtYXJnaW5ZPWdyYXBoTGFiZWwubWFyZ2lueXx8MDtmdW5jdGlvbiBnZXRFeHRyZW1lcyhhdHRycyl7dmFyIHg9YXR0cnMueCx5PWF0dHJzLnksdz1hdHRycy53aWR0aCxoPWF0dHJzLmhlaWdodDttaW5YPU1hdGgubWluKG1pblgseC13LzIpO21heFg9TWF0aC5tYXgobWF4WCx4K3cvMik7bWluWT1NYXRoLm1pbihtaW5ZLHktaC8yKTttYXhZPU1hdGgubWF4KG1heFkseStoLzIpfV8uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7Z2V0RXh0cmVtZXMoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKF8uaGFzKGVkZ2UsIngiKSlnZXRFeHRyZW1lcyhlZGdlKX0pOwptaW5YLT1tYXJnaW5YO21pblktPW1hcmdpblk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7bm9kZS54LT1taW5YO25vZGUueS09bWluWX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO18uZm9yRWFjaChlZGdlLnBvaW50cyxmdW5jdGlvbihwKXtwLngtPW1pblg7cC55LT1taW5ZfSk7aWYoXy5oYXMoZWRnZSwieCIpKWVkZ2UueC09bWluWDtpZihfLmhhcyhlZGdlLCJ5IikpZWRnZS55LT1taW5ZfSk7Z3JhcGhMYWJlbC53aWR0aD1tYXhYLW1pblgrbWFyZ2luWDtncmFwaExhYmVsLmhlaWdodD1tYXhZLW1pblkrbWFyZ2luWX1mdW5jdGlvbiBhc3NpZ25Ob2RlSW50ZXJzZWN0cyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKSxub2RlVj1nLm5vZGUoZS52KSxub2RlVz1nLm5vZGUoZS53KSxwMSxwMjtpZighZWRnZS5wb2ludHMpe2VkZ2UucG9pbnRzPQpbXTtwMT1ub2RlVztwMj1ub2RlVn1lbHNle3AxPWVkZ2UucG9pbnRzWzBdO3AyPWVkZ2UucG9pbnRzW2VkZ2UucG9pbnRzLmxlbmd0aC0xXX1lZGdlLnBvaW50cy51bnNoaWZ0KHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVixwMSkpO2VkZ2UucG9pbnRzLnB1c2godXRpbC5pbnRlcnNlY3RSZWN0KG5vZGVXLHAyKSl9KX1mdW5jdGlvbiBmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihfLmhhcyhlZGdlLCJ4Iikpe2lmKGVkZ2UubGFiZWxwb3M9PT0ibCJ8fGVkZ2UubGFiZWxwb3M9PT0iciIpZWRnZS53aWR0aC09ZWRnZS5sYWJlbG9mZnNldDtzd2l0Y2goZWRnZS5sYWJlbHBvcyl7Y2FzZSAibCI6ZWRnZS54LT1lZGdlLndpZHRoLzIrZWRnZS5sYWJlbG9mZnNldDticmVhaztjYXNlICJyIjplZGdlLngrPWVkZ2Uud2lkdGgvMitlZGdlLmxhYmVsb2Zmc2V0O2JyZWFrfX19KX1mdW5jdGlvbiByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoZWRnZS5yZXZlcnNlZCllZGdlLnBvaW50cy5yZXZlcnNlKCl9KX1mdW5jdGlvbiByZW1vdmVCb3JkZXJOb2RlcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2lmKGcuY2hpbGRyZW4odikubGVuZ3RoKXt2YXIgbm9kZT1nLm5vZGUodiksdD1nLm5vZGUobm9kZS5ib3JkZXJUb3ApLGI9Zy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKSxsPWcubm9kZShfLmxhc3Qobm9kZS5ib3JkZXJMZWZ0KSkscj1nLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyUmlnaHQpKTtub2RlLndpZHRoPU1hdGguYWJzKHIueC1sLngpO25vZGUuaGVpZ2h0PU1hdGguYWJzKGIueS10LnkpO25vZGUueD1sLngrbm9kZS53aWR0aC8yO25vZGUueT10Lnkrbm9kZS5oZWlnaHQvMn19KTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2lmKGcubm9kZSh2KS5kdW1teT09PSJib3JkZXIiKWcucmVtb3ZlTm9kZSh2KX0pfWZ1bmN0aW9uIHJlbW92ZVNlbGZFZGdlcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXtpZihlLnY9PT1lLncpe3ZhciBub2RlPWcubm9kZShlLnYpO2lmKCFub2RlLnNlbGZFZGdlcylub2RlLnNlbGZFZGdlcz1bXTtub2RlLnNlbGZFZGdlcy5wdXNoKHtlOmUsbGFiZWw6Zy5lZGdlKGUpfSk7Zy5yZW1vdmVFZGdlKGUpfX0pfWZ1bmN0aW9uIGluc2VydFNlbGZFZGdlcyhnKXt2YXIgbGF5ZXJzPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtfLmZvckVhY2gobGF5ZXJzLGZ1bmN0aW9uKGxheWVyKXt2YXIgb3JkZXJTaGlmdD0wO18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LGkpe3ZhciBub2RlPWcubm9kZSh2KTtub2RlLm9yZGVyPWkrb3JkZXJTaGlmdDtfLmZvckVhY2gobm9kZS5zZWxmRWRnZXMsZnVuY3Rpb24oc2VsZkVkZ2Upe3V0aWwuYWRkRHVtbXlOb2RlKGcsInNlbGZlZGdlIix7d2lkdGg6c2VsZkVkZ2UubGFiZWwud2lkdGgsaGVpZ2h0OnNlbGZFZGdlLmxhYmVsLmhlaWdodCxyYW5rOm5vZGUucmFuayxvcmRlcjppKyArK29yZGVyU2hpZnQsCmU6c2VsZkVkZ2UuZSxsYWJlbDpzZWxmRWRnZS5sYWJlbH0sIl9zZSIpfSk7ZGVsZXRlIG5vZGUuc2VsZkVkZ2VzfSl9KX1mdW5jdGlvbiBwb3NpdGlvblNlbGZFZGdlcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmR1bW15PT09InNlbGZlZGdlIil7dmFyIHNlbGZOb2RlPWcubm9kZShub2RlLmUudikseD1zZWxmTm9kZS54K3NlbGZOb2RlLndpZHRoLzIseT1zZWxmTm9kZS55LGR4PW5vZGUueC14LGR5PXNlbGZOb2RlLmhlaWdodC8yO2cuc2V0RWRnZShub2RlLmUsbm9kZS5sYWJlbCk7Zy5yZW1vdmVOb2RlKHYpO25vZGUubGFiZWwucG9pbnRzPVt7eDp4KzIqZHgvMyx5OnktZHl9LHt4OngrNSpkeC82LHk6eS1keX0se3g6eCtkeCx5Onl9LHt4OngrNSpkeC82LHk6eStkeX0se3g6eCsyKmR4LzMseTp5K2R5fV07bm9kZS5sYWJlbC54PW5vZGUueDtub2RlLmxhYmVsLnk9bm9kZS55fX0pfWZ1bmN0aW9uIHNlbGVjdE51bWJlckF0dHJzKG9iaiwKYXR0cnMpe3JldHVybiBfLm1hcFZhbHVlcyhfLnBpY2sob2JqLGF0dHJzKSxOdW1iZXIpfWZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShhdHRycyl7dmFyIG5ld0F0dHJzPXt9O18uZm9yRWFjaChhdHRycyxmdW5jdGlvbih2LGspe25ld0F0dHJzW2sudG9Mb3dlckNhc2UoKV09dn0pO3JldHVybiBuZXdBdHRyc319LHsiLi9hY3ljbGljIjoyLCIuL2FkZC1ib3JkZXItc2VnbWVudHMiOjMsIi4vY29vcmRpbmF0ZS1zeXN0ZW0iOjQsIi4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMCwiLi9uZXN0aW5nLWdyYXBoIjoxMSwiLi9ub3JtYWxpemUiOjEyLCIuL29yZGVyIjoxNywiLi9wYXJlbnQtZHVtbXktY2hhaW5zIjoyMiwiLi9wb3NpdGlvbiI6MjQsIi4vcmFuayI6MjYsIi4vdXRpbCI6Mjl9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGxvZGFzaDtpZih0eXBlb2YgcmVxdWlyZT09PSJmdW5jdGlvbiIpdHJ5e2xvZGFzaD1yZXF1aXJlKCJsb2Rhc2giKX1jYXRjaChlKXt9aWYoIWxvZGFzaClsb2Rhc2g9CndpbmRvdy5fO21vZHVsZS5leHBvcnRzPWxvZGFzaH0seyJsb2Rhc2giOnVuZGVmaW5lZH1dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9e3J1bjpydW4sY2xlYW51cDpjbGVhbnVwfTtmdW5jdGlvbiBydW4oZyl7dmFyIHJvb3Q9dXRpbC5hZGREdW1teU5vZGUoZywicm9vdCIse30sIl9yb290Iik7dmFyIGRlcHRocz10cmVlRGVwdGhzKGcpO3ZhciBoZWlnaHQ9Xy5tYXgoXy52YWx1ZXMoZGVwdGhzKSktMTt2YXIgbm9kZVNlcD0yKmhlaWdodCsxO2cuZ3JhcGgoKS5uZXN0aW5nUm9vdD1yb290O18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7Zy5lZGdlKGUpLm1pbmxlbio9bm9kZVNlcH0pO3ZhciB3ZWlnaHQ9c3VtV2VpZ2h0cyhnKSsxO18uZm9yRWFjaChnLmNoaWxkcmVuKCksZnVuY3Rpb24oY2hpbGQpe2RmcyhnLHJvb3Qsbm9kZVNlcCwKd2VpZ2h0LGhlaWdodCxkZXB0aHMsY2hpbGQpfSk7Zy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yPW5vZGVTZXB9ZnVuY3Rpb24gZGZzKGcscm9vdCxub2RlU2VwLHdlaWdodCxoZWlnaHQsZGVwdGhzLHYpe3ZhciBjaGlsZHJlbj1nLmNoaWxkcmVuKHYpO2lmKCFjaGlsZHJlbi5sZW5ndGgpe2lmKHYhPT1yb290KWcuc2V0RWRnZShyb290LHYse3dlaWdodDowLG1pbmxlbjpub2RlU2VwfSk7cmV0dXJufXZhciB0b3A9dXRpbC5hZGRCb3JkZXJOb2RlKGcsIl9idCIpLGJvdHRvbT11dGlsLmFkZEJvcmRlck5vZGUoZywiX2JiIiksbGFiZWw9Zy5ub2RlKHYpO2cuc2V0UGFyZW50KHRvcCx2KTtsYWJlbC5ib3JkZXJUb3A9dG9wO2cuc2V0UGFyZW50KGJvdHRvbSx2KTtsYWJlbC5ib3JkZXJCb3R0b209Ym90dG9tO18uZm9yRWFjaChjaGlsZHJlbixmdW5jdGlvbihjaGlsZCl7ZGZzKGcscm9vdCxub2RlU2VwLHdlaWdodCxoZWlnaHQsZGVwdGhzLGNoaWxkKTt2YXIgY2hpbGROb2RlPWcubm9kZShjaGlsZCksCmNoaWxkVG9wPWNoaWxkTm9kZS5ib3JkZXJUb3A/Y2hpbGROb2RlLmJvcmRlclRvcDpjaGlsZCxjaGlsZEJvdHRvbT1jaGlsZE5vZGUuYm9yZGVyQm90dG9tP2NoaWxkTm9kZS5ib3JkZXJCb3R0b206Y2hpbGQsdGhpc1dlaWdodD1jaGlsZE5vZGUuYm9yZGVyVG9wP3dlaWdodDoyKndlaWdodCxtaW5sZW49Y2hpbGRUb3AhPT1jaGlsZEJvdHRvbT8xOmhlaWdodC1kZXB0aHNbdl0rMTtnLnNldEVkZ2UodG9wLGNoaWxkVG9wLHt3ZWlnaHQ6dGhpc1dlaWdodCxtaW5sZW46bWlubGVuLG5lc3RpbmdFZGdlOnRydWV9KTtnLnNldEVkZ2UoY2hpbGRCb3R0b20sYm90dG9tLHt3ZWlnaHQ6dGhpc1dlaWdodCxtaW5sZW46bWlubGVuLG5lc3RpbmdFZGdlOnRydWV9KX0pO2lmKCFnLnBhcmVudCh2KSlnLnNldEVkZ2Uocm9vdCx0b3Ase3dlaWdodDowLG1pbmxlbjpoZWlnaHQrZGVwdGhzW3ZdfSl9ZnVuY3Rpb24gdHJlZURlcHRocyhnKXt2YXIgZGVwdGhzPXt9O2Z1bmN0aW9uIGRmcyh2LGRlcHRoKXt2YXIgY2hpbGRyZW49CmcuY2hpbGRyZW4odik7aWYoY2hpbGRyZW4mJmNoaWxkcmVuLmxlbmd0aClfLmZvckVhY2goY2hpbGRyZW4sZnVuY3Rpb24oY2hpbGQpe2RmcyhjaGlsZCxkZXB0aCsxKX0pO2RlcHRoc1t2XT1kZXB0aH1fLmZvckVhY2goZy5jaGlsZHJlbigpLGZ1bmN0aW9uKHYpe2Rmcyh2LDEpfSk7cmV0dXJuIGRlcHRoc31mdW5jdGlvbiBzdW1XZWlnaHRzKGcpe3JldHVybiBfLnJlZHVjZShnLmVkZ2VzKCksZnVuY3Rpb24oYWNjLGUpe3JldHVybiBhY2MrZy5lZGdlKGUpLndlaWdodH0sMCl9ZnVuY3Rpb24gY2xlYW51cChnKXt2YXIgZ3JhcGhMYWJlbD1nLmdyYXBoKCk7Zy5yZW1vdmVOb2RlKGdyYXBoTGFiZWwubmVzdGluZ1Jvb3QpO2RlbGV0ZSBncmFwaExhYmVsLm5lc3RpbmdSb290O18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2UubmVzdGluZ0VkZ2UpZy5yZW1vdmVFZGdlKGUpfSl9fSx7Ii4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOX1dLAoxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLHVuZG86dW5kb307ZnVuY3Rpb24gcnVuKGcpe2cuZ3JhcGgoKS5kdW1teUNoYWlucz1bXTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGVkZ2Upe25vcm1hbGl6ZUVkZ2UoZyxlZGdlKX0pfWZ1bmN0aW9uIG5vcm1hbGl6ZUVkZ2UoZyxlKXt2YXIgdj1lLnYsdlJhbms9Zy5ub2RlKHYpLnJhbmssdz1lLncsd1Jhbms9Zy5ub2RlKHcpLnJhbmssbmFtZT1lLm5hbWUsZWRnZUxhYmVsPWcuZWRnZShlKSxsYWJlbFJhbms9ZWRnZUxhYmVsLmxhYmVsUmFuaztpZih3UmFuaz09PXZSYW5rKzEpcmV0dXJuO2cucmVtb3ZlRWRnZShlKTt2YXIgZHVtbXksYXR0cnMsaTtmb3IoaT0wLCsrdlJhbms7dlJhbms8d1Jhbms7KytpLCsrdlJhbmspe2VkZ2VMYWJlbC5wb2ludHM9W107YXR0cnM9e3dpZHRoOjAsCmhlaWdodDowLGVkZ2VMYWJlbDplZGdlTGFiZWwsZWRnZU9iajplLHJhbms6dlJhbmt9O2R1bW15PXV0aWwuYWRkRHVtbXlOb2RlKGcsImVkZ2UiLGF0dHJzLCJfZCIpO2lmKHZSYW5rPT09bGFiZWxSYW5rKXthdHRycy53aWR0aD1lZGdlTGFiZWwud2lkdGg7YXR0cnMuaGVpZ2h0PWVkZ2VMYWJlbC5oZWlnaHQ7YXR0cnMuZHVtbXk9ImVkZ2UtbGFiZWwiO2F0dHJzLmxhYmVscG9zPWVkZ2VMYWJlbC5sYWJlbHBvc31nLnNldEVkZ2UodixkdW1teSx7d2VpZ2h0OmVkZ2VMYWJlbC53ZWlnaHR9LG5hbWUpO2lmKGk9PT0wKWcuZ3JhcGgoKS5kdW1teUNoYWlucy5wdXNoKGR1bW15KTt2PWR1bW15fWcuc2V0RWRnZSh2LHcse3dlaWdodDplZGdlTGFiZWwud2VpZ2h0fSxuYW1lKX1mdW5jdGlvbiB1bmRvKGcpe18uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLG9yaWdMYWJlbD1ub2RlLmVkZ2VMYWJlbCx3O2cuc2V0RWRnZShub2RlLmVkZ2VPYmosCm9yaWdMYWJlbCk7d2hpbGUobm9kZS5kdW1teSl7dz1nLnN1Y2Nlc3NvcnModilbMF07Zy5yZW1vdmVOb2RlKHYpO29yaWdMYWJlbC5wb2ludHMucHVzaCh7eDpub2RlLngseTpub2RlLnl9KTtpZihub2RlLmR1bW15PT09ImVkZ2UtbGFiZWwiKXtvcmlnTGFiZWwueD1ub2RlLng7b3JpZ0xhYmVsLnk9bm9kZS55O29yaWdMYWJlbC53aWR0aD1ub2RlLndpZHRoO29yaWdMYWJlbC5oZWlnaHQ9bm9kZS5oZWlnaHR9dj13O25vZGU9Zy5ub2RlKHYpfX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9YWRkU3ViZ3JhcGhDb25zdHJhaW50cztmdW5jdGlvbiBhZGRTdWJncmFwaENvbnN0cmFpbnRzKGcsY2csdnMpe3ZhciBwcmV2PXt9LHJvb3RQcmV2O18uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXt2YXIgY2hpbGQ9Zy5wYXJlbnQodikscGFyZW50LApwcmV2Q2hpbGQ7d2hpbGUoY2hpbGQpe3BhcmVudD1nLnBhcmVudChjaGlsZCk7aWYocGFyZW50KXtwcmV2Q2hpbGQ9cHJldltwYXJlbnRdO3ByZXZbcGFyZW50XT1jaGlsZH1lbHNle3ByZXZDaGlsZD1yb290UHJldjtyb290UHJldj1jaGlsZH1pZihwcmV2Q2hpbGQmJnByZXZDaGlsZCE9PWNoaWxkKXtjZy5zZXRFZGdlKHByZXZDaGlsZCxjaGlsZCk7cmV0dXJufWNoaWxkPXBhcmVudH19KX19LHsiLi4vbG9kYXNoIjoxMH1dLDE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1iYXJ5Y2VudGVyO2Z1bmN0aW9uIGJhcnljZW50ZXIoZyxtb3ZhYmxlKXtyZXR1cm4gXy5tYXAobW92YWJsZSxmdW5jdGlvbih2KXt2YXIgaW5WPWcuaW5FZGdlcyh2KTtpZighaW5WLmxlbmd0aClyZXR1cm57djp2fTtlbHNle3ZhciByZXN1bHQ9Xy5yZWR1Y2UoaW5WLGZ1bmN0aW9uKGFjYyxlKXt2YXIgZWRnZT1nLmVkZ2UoZSksCm5vZGVVPWcubm9kZShlLnYpO3JldHVybntzdW06YWNjLnN1bStlZGdlLndlaWdodCpub2RlVS5vcmRlcix3ZWlnaHQ6YWNjLndlaWdodCtlZGdlLndlaWdodH19LHtzdW06MCx3ZWlnaHQ6MH0pO3JldHVybnt2OnYsYmFyeWNlbnRlcjpyZXN1bHQuc3VtL3Jlc3VsdC53ZWlnaHQsd2VpZ2h0OnJlc3VsdC53ZWlnaHR9fX0pfX0seyIuLi9sb2Rhc2giOjEwfV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9YnVpbGRMYXllckdyYXBoO2Z1bmN0aW9uIGJ1aWxkTGF5ZXJHcmFwaChnLHJhbmsscmVsYXRpb25zaGlwKXt2YXIgcm9vdD1jcmVhdGVSb290Tm9kZShnKSxyZXN1bHQ9KG5ldyBHcmFwaCh7Y29tcG91bmQ6dHJ1ZX0pKS5zZXRHcmFwaCh7cm9vdDpyb290fSkuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpfSk7Cl8uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLHBhcmVudD1nLnBhcmVudCh2KTtpZihub2RlLnJhbms9PT1yYW5rfHxub2RlLm1pblJhbms8PXJhbmsmJnJhbms8PW5vZGUubWF4UmFuayl7cmVzdWx0LnNldE5vZGUodik7cmVzdWx0LnNldFBhcmVudCh2LHBhcmVudHx8cm9vdCk7Xy5mb3JFYWNoKGdbcmVsYXRpb25zaGlwXSh2KSxmdW5jdGlvbihlKXt2YXIgdT1lLnY9PT12P2UudzplLnYsZWRnZT1yZXN1bHQuZWRnZSh1LHYpLHdlaWdodD0hXy5pc1VuZGVmaW5lZChlZGdlKT9lZGdlLndlaWdodDowO3Jlc3VsdC5zZXRFZGdlKHUsdix7d2VpZ2h0OmcuZWRnZShlKS53ZWlnaHQrd2VpZ2h0fSl9KTtpZihfLmhhcyhub2RlLCJtaW5SYW5rIikpcmVzdWx0LnNldE5vZGUodix7Ym9yZGVyTGVmdDpub2RlLmJvcmRlckxlZnRbcmFua10sYm9yZGVyUmlnaHQ6bm9kZS5ib3JkZXJSaWdodFtyYW5rXX0pfX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY3JlYXRlUm9vdE5vZGUoZyl7dmFyIHY7CndoaWxlKGcuaGFzTm9kZSh2PV8udW5pcXVlSWQoIl9yb290IikpKTtyZXR1cm4gdn19LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTB9XSwxNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9Y3Jvc3NDb3VudDtmdW5jdGlvbiBjcm9zc0NvdW50KGcsbGF5ZXJpbmcpe3ZhciBjYz0wO2Zvcih2YXIgaT0xO2k8bGF5ZXJpbmcubGVuZ3RoOysraSljYys9dHdvTGF5ZXJDcm9zc0NvdW50KGcsbGF5ZXJpbmdbaS0xXSxsYXllcmluZ1tpXSk7cmV0dXJuIGNjfWZ1bmN0aW9uIHR3b0xheWVyQ3Jvc3NDb3VudChnLG5vcnRoTGF5ZXIsc291dGhMYXllcil7dmFyIHNvdXRoUG9zPV8uemlwT2JqZWN0KHNvdXRoTGF5ZXIsXy5tYXAoc291dGhMYXllcixmdW5jdGlvbih2LGkpe3JldHVybiBpfSkpO3ZhciBzb3V0aEVudHJpZXM9Xy5mbGF0dGVuKF8ubWFwKG5vcnRoTGF5ZXIsZnVuY3Rpb24odil7cmV0dXJuIF8uY2hhaW4oZy5vdXRFZGdlcyh2KSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybntwb3M6c291dGhQb3NbZS53XSwKd2VpZ2h0OmcuZWRnZShlKS53ZWlnaHR9fSkuc29ydEJ5KCJwb3MiKS52YWx1ZSgpfSksdHJ1ZSk7dmFyIGZpcnN0SW5kZXg9MTt3aGlsZShmaXJzdEluZGV4PHNvdXRoTGF5ZXIubGVuZ3RoKWZpcnN0SW5kZXg8PD0xO3ZhciB0cmVlU2l6ZT0yKmZpcnN0SW5kZXgtMTtmaXJzdEluZGV4LT0xO3ZhciB0cmVlPV8ubWFwKG5ldyBBcnJheSh0cmVlU2l6ZSksZnVuY3Rpb24oKXtyZXR1cm4gMH0pO3ZhciBjYz0wO18uZm9yRWFjaChzb3V0aEVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlbnRyeSl7dmFyIGluZGV4PWVudHJ5LnBvcytmaXJzdEluZGV4O3RyZWVbaW5kZXhdKz1lbnRyeS53ZWlnaHQ7dmFyIHdlaWdodFN1bT0wO3doaWxlKGluZGV4PjApe2lmKGluZGV4JTIpd2VpZ2h0U3VtKz10cmVlW2luZGV4KzFdO2luZGV4PWluZGV4LTE+PjE7dHJlZVtpbmRleF0rPWVudHJ5LndlaWdodH1jYys9ZW50cnkud2VpZ2h0KndlaWdodFN1bX0pKTtyZXR1cm4gY2N9fSx7Ii4uL2xvZGFzaCI6MTB9XSwKMTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLGluaXRPcmRlcj1yZXF1aXJlKCIuL2luaXQtb3JkZXIiKSxjcm9zc0NvdW50PXJlcXVpcmUoIi4vY3Jvc3MtY291bnQiKSxzb3J0U3ViZ3JhcGg9cmVxdWlyZSgiLi9zb3J0LXN1YmdyYXBoIiksYnVpbGRMYXllckdyYXBoPXJlcXVpcmUoIi4vYnVpbGQtbGF5ZXItZ3JhcGgiKSxhZGRTdWJncmFwaENvbnN0cmFpbnRzPXJlcXVpcmUoIi4vYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKTttb2R1bGUuZXhwb3J0cz1vcmRlcjtmdW5jdGlvbiBvcmRlcihnKXt2YXIgbWF4UmFuaz11dGlsLm1heFJhbmsoZyksZG93bkxheWVyR3JhcGhzPWJ1aWxkTGF5ZXJHcmFwaHMoZyxfLnJhbmdlKDEsbWF4UmFuaysxKSwiaW5FZGdlcyIpLHVwTGF5ZXJHcmFwaHM9YnVpbGRMYXllckdyYXBocyhnLApfLnJhbmdlKG1heFJhbmstMSwtMSwtMSksIm91dEVkZ2VzIik7dmFyIGxheWVyaW5nPWluaXRPcmRlcihnKTthc3NpZ25PcmRlcihnLGxheWVyaW5nKTt2YXIgYmVzdENDPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxiZXN0O2Zvcih2YXIgaT0wLGxhc3RCZXN0PTA7bGFzdEJlc3Q8NDsrK2ksKytsYXN0QmVzdCl7c3dlZXBMYXllckdyYXBocyhpJTI/ZG93bkxheWVyR3JhcGhzOnVwTGF5ZXJHcmFwaHMsaSU0Pj0yKTtsYXllcmluZz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7dmFyIGNjPWNyb3NzQ291bnQoZyxsYXllcmluZyk7aWYoY2M8YmVzdENDKXtsYXN0QmVzdD0wO2Jlc3Q9Xy5jbG9uZURlZXAobGF5ZXJpbmcpO2Jlc3RDQz1jY319YXNzaWduT3JkZXIoZyxiZXN0KX1mdW5jdGlvbiBidWlsZExheWVyR3JhcGhzKGcscmFua3MscmVsYXRpb25zaGlwKXtyZXR1cm4gXy5tYXAocmFua3MsZnVuY3Rpb24ocmFuayl7cmV0dXJuIGJ1aWxkTGF5ZXJHcmFwaChnLHJhbmsscmVsYXRpb25zaGlwKX0pfQpmdW5jdGlvbiBzd2VlcExheWVyR3JhcGhzKGxheWVyR3JhcGhzLGJpYXNSaWdodCl7dmFyIGNnPW5ldyBHcmFwaDtfLmZvckVhY2gobGF5ZXJHcmFwaHMsZnVuY3Rpb24obGcpe3ZhciByb290PWxnLmdyYXBoKCkucm9vdDt2YXIgc29ydGVkPXNvcnRTdWJncmFwaChsZyxyb290LGNnLGJpYXNSaWdodCk7Xy5mb3JFYWNoKHNvcnRlZC52cyxmdW5jdGlvbih2LGkpe2xnLm5vZGUodikub3JkZXI9aX0pO2FkZFN1YmdyYXBoQ29uc3RyYWludHMobGcsY2csc29ydGVkLnZzKX0pfWZ1bmN0aW9uIGFzc2lnbk9yZGVyKGcsbGF5ZXJpbmcpe18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsaSl7Zy5ub2RlKHYpLm9yZGVyPWl9KX0pfX0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6MjksIi4vYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzIjoxMywiLi9idWlsZC1sYXllci1ncmFwaCI6MTUsIi4vY3Jvc3MtY291bnQiOjE2LAoiLi9pbml0LW9yZGVyIjoxOCwiLi9zb3J0LXN1YmdyYXBoIjoyMH1dLDE4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1pbml0T3JkZXI7ZnVuY3Rpb24gaW5pdE9yZGVyKGcpe3ZhciB2aXNpdGVkPXt9LHNpbXBsZU5vZGVzPV8uZmlsdGVyKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4hZy5jaGlsZHJlbih2KS5sZW5ndGh9KSxtYXhSYW5rPV8ubWF4KF8ubWFwKHNpbXBsZU5vZGVzLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKSxsYXllcnM9Xy5tYXAoXy5yYW5nZShtYXhSYW5rKzEpLGZ1bmN0aW9uKCl7cmV0dXJuW119KTtmdW5jdGlvbiBkZnModil7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm47dmlzaXRlZFt2XT10cnVlO3ZhciBub2RlPWcubm9kZSh2KTtsYXllcnNbbm9kZS5yYW5rXS5wdXNoKHYpO18uZm9yRWFjaChnLnN1Y2Nlc3NvcnModiksZGZzKX12YXIgb3JkZXJlZFZzPQpfLnNvcnRCeShzaW1wbGVOb2RlcyxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KTtfLmZvckVhY2gob3JkZXJlZFZzLGRmcyk7cmV0dXJuIGxheWVyc319LHsiLi4vbG9kYXNoIjoxMH1dLDE5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1yZXNvbHZlQ29uZmxpY3RzO2Z1bmN0aW9uIHJlc29sdmVDb25mbGljdHMoZW50cmllcyxjZyl7dmFyIG1hcHBlZEVudHJpZXM9e307Xy5mb3JFYWNoKGVudHJpZXMsZnVuY3Rpb24oZW50cnksaSl7dmFyIHRtcD1tYXBwZWRFbnRyaWVzW2VudHJ5LnZdPXtpbmRlZ3JlZTowLCJpbiI6W10sb3V0OltdLHZzOltlbnRyeS52XSxpOml9O2lmKCFfLmlzVW5kZWZpbmVkKGVudHJ5LmJhcnljZW50ZXIpKXt0bXAuYmFyeWNlbnRlcj1lbnRyeS5iYXJ5Y2VudGVyO3RtcC53ZWlnaHQ9ZW50cnkud2VpZ2h0fX0pO18uZm9yRWFjaChjZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlbnRyeVY9Cm1hcHBlZEVudHJpZXNbZS52XSxlbnRyeVc9bWFwcGVkRW50cmllc1tlLnddO2lmKCFfLmlzVW5kZWZpbmVkKGVudHJ5VikmJiFfLmlzVW5kZWZpbmVkKGVudHJ5Vykpe2VudHJ5Vy5pbmRlZ3JlZSsrO2VudHJ5Vi5vdXQucHVzaChtYXBwZWRFbnRyaWVzW2Uud10pfX0pO3ZhciBzb3VyY2VTZXQ9Xy5maWx0ZXIobWFwcGVkRW50cmllcyxmdW5jdGlvbihlbnRyeSl7cmV0dXJuIWVudHJ5LmluZGVncmVlfSk7cmV0dXJuIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpfWZ1bmN0aW9uIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpe3ZhciBlbnRyaWVzPVtdO2Z1bmN0aW9uIGhhbmRsZUluKHZFbnRyeSl7cmV0dXJuIGZ1bmN0aW9uKHVFbnRyeSl7aWYodUVudHJ5Lm1lcmdlZClyZXR1cm47aWYoXy5pc1VuZGVmaW5lZCh1RW50cnkuYmFyeWNlbnRlcil8fF8uaXNVbmRlZmluZWQodkVudHJ5LmJhcnljZW50ZXIpfHx1RW50cnkuYmFyeWNlbnRlcj49dkVudHJ5LmJhcnljZW50ZXIpbWVyZ2VFbnRyaWVzKHZFbnRyeSwKdUVudHJ5KX19ZnVuY3Rpb24gaGFuZGxlT3V0KHZFbnRyeSl7cmV0dXJuIGZ1bmN0aW9uKHdFbnRyeSl7d0VudHJ5WyJpbiJdLnB1c2godkVudHJ5KTtpZigtLXdFbnRyeS5pbmRlZ3JlZT09PTApc291cmNlU2V0LnB1c2god0VudHJ5KX19d2hpbGUoc291cmNlU2V0Lmxlbmd0aCl7dmFyIGVudHJ5PXNvdXJjZVNldC5wb3AoKTtlbnRyaWVzLnB1c2goZW50cnkpO18uZm9yRWFjaChlbnRyeVsiaW4iXS5yZXZlcnNlKCksaGFuZGxlSW4oZW50cnkpKTtfLmZvckVhY2goZW50cnkub3V0LGhhbmRsZU91dChlbnRyeSkpfXJldHVybiBfLmNoYWluKGVudHJpZXMpLmZpbHRlcihmdW5jdGlvbihlbnRyeSl7cmV0dXJuIWVudHJ5Lm1lcmdlZH0pLm1hcChmdW5jdGlvbihlbnRyeSl7cmV0dXJuIF8ucGljayhlbnRyeSxbInZzIiwiaSIsImJhcnljZW50ZXIiLCJ3ZWlnaHQiXSl9KS52YWx1ZSgpfWZ1bmN0aW9uIG1lcmdlRW50cmllcyh0YXJnZXQsc291cmNlKXt2YXIgc3VtPTAsd2VpZ2h0PTA7CmlmKHRhcmdldC53ZWlnaHQpe3N1bSs9dGFyZ2V0LmJhcnljZW50ZXIqdGFyZ2V0LndlaWdodDt3ZWlnaHQrPXRhcmdldC53ZWlnaHR9aWYoc291cmNlLndlaWdodCl7c3VtKz1zb3VyY2UuYmFyeWNlbnRlcipzb3VyY2Uud2VpZ2h0O3dlaWdodCs9c291cmNlLndlaWdodH10YXJnZXQudnM9c291cmNlLnZzLmNvbmNhdCh0YXJnZXQudnMpO3RhcmdldC5iYXJ5Y2VudGVyPXN1bS93ZWlnaHQ7dGFyZ2V0LndlaWdodD13ZWlnaHQ7dGFyZ2V0Lmk9TWF0aC5taW4oc291cmNlLmksdGFyZ2V0LmkpO3NvdXJjZS5tZXJnZWQ9dHJ1ZX19LHsiLi4vbG9kYXNoIjoxMH1dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxiYXJ5Y2VudGVyPXJlcXVpcmUoIi4vYmFyeWNlbnRlciIpLHJlc29sdmVDb25mbGljdHM9cmVxdWlyZSgiLi9yZXNvbHZlLWNvbmZsaWN0cyIpLHNvcnQ9cmVxdWlyZSgiLi9zb3J0Iik7bW9kdWxlLmV4cG9ydHM9CnNvcnRTdWJncmFwaDtmdW5jdGlvbiBzb3J0U3ViZ3JhcGgoZyx2LGNnLGJpYXNSaWdodCl7dmFyIG1vdmFibGU9Zy5jaGlsZHJlbih2KSxub2RlPWcubm9kZSh2KSxibD1ub2RlP25vZGUuYm9yZGVyTGVmdDp1bmRlZmluZWQsYnI9bm9kZT9ub2RlLmJvcmRlclJpZ2h0OnVuZGVmaW5lZCxzdWJncmFwaHM9e307aWYoYmwpbW92YWJsZT1fLmZpbHRlcihtb3ZhYmxlLGZ1bmN0aW9uKHcpe3JldHVybiB3IT09YmwmJnchPT1icn0pO3ZhciBiYXJ5Y2VudGVycz1iYXJ5Y2VudGVyKGcsbW92YWJsZSk7Xy5mb3JFYWNoKGJhcnljZW50ZXJzLGZ1bmN0aW9uKGVudHJ5KXtpZihnLmNoaWxkcmVuKGVudHJ5LnYpLmxlbmd0aCl7dmFyIHN1YmdyYXBoUmVzdWx0PXNvcnRTdWJncmFwaChnLGVudHJ5LnYsY2csYmlhc1JpZ2h0KTtzdWJncmFwaHNbZW50cnkudl09c3ViZ3JhcGhSZXN1bHQ7aWYoXy5oYXMoc3ViZ3JhcGhSZXN1bHQsImJhcnljZW50ZXIiKSltZXJnZUJhcnljZW50ZXJzKGVudHJ5LApzdWJncmFwaFJlc3VsdCl9fSk7dmFyIGVudHJpZXM9cmVzb2x2ZUNvbmZsaWN0cyhiYXJ5Y2VudGVycyxjZyk7ZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsc3ViZ3JhcGhzKTt2YXIgcmVzdWx0PXNvcnQoZW50cmllcyxiaWFzUmlnaHQpO2lmKGJsKXtyZXN1bHQudnM9Xy5mbGF0dGVuKFtibCxyZXN1bHQudnMsYnJdLHRydWUpO2lmKGcucHJlZGVjZXNzb3JzKGJsKS5sZW5ndGgpe3ZhciBibFByZWQ9Zy5ub2RlKGcucHJlZGVjZXNzb3JzKGJsKVswXSksYnJQcmVkPWcubm9kZShnLnByZWRlY2Vzc29ycyhicilbMF0pO2lmKCFfLmhhcyhyZXN1bHQsImJhcnljZW50ZXIiKSl7cmVzdWx0LmJhcnljZW50ZXI9MDtyZXN1bHQud2VpZ2h0PTB9cmVzdWx0LmJhcnljZW50ZXI9KHJlc3VsdC5iYXJ5Y2VudGVyKnJlc3VsdC53ZWlnaHQrYmxQcmVkLm9yZGVyK2JyUHJlZC5vcmRlcikvKHJlc3VsdC53ZWlnaHQrMik7cmVzdWx0LndlaWdodCs9Mn19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBleHBhbmRTdWJncmFwaHMoZW50cmllcywKc3ViZ3JhcGhzKXtfLmZvckVhY2goZW50cmllcyxmdW5jdGlvbihlbnRyeSl7ZW50cnkudnM9Xy5mbGF0dGVuKGVudHJ5LnZzLm1hcChmdW5jdGlvbih2KXtpZihzdWJncmFwaHNbdl0pcmV0dXJuIHN1YmdyYXBoc1t2XS52cztyZXR1cm4gdn0pLHRydWUpfSl9ZnVuY3Rpb24gbWVyZ2VCYXJ5Y2VudGVycyh0YXJnZXQsb3RoZXIpe2lmKCFfLmlzVW5kZWZpbmVkKHRhcmdldC5iYXJ5Y2VudGVyKSl7dGFyZ2V0LmJhcnljZW50ZXI9KHRhcmdldC5iYXJ5Y2VudGVyKnRhcmdldC53ZWlnaHQrb3RoZXIuYmFyeWNlbnRlcipvdGhlci53ZWlnaHQpLyh0YXJnZXQud2VpZ2h0K290aGVyLndlaWdodCk7dGFyZ2V0LndlaWdodCs9b3RoZXIud2VpZ2h0fWVsc2V7dGFyZ2V0LmJhcnljZW50ZXI9b3RoZXIuYmFyeWNlbnRlcjt0YXJnZXQud2VpZ2h0PW90aGVyLndlaWdodH19fSx7Ii4uL2xvZGFzaCI6MTAsIi4vYmFyeWNlbnRlciI6MTQsIi4vcmVzb2x2ZS1jb25mbGljdHMiOjE5LCIuL3NvcnQiOjIxfV0sCjIxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKTttb2R1bGUuZXhwb3J0cz1zb3J0O2Z1bmN0aW9uIHNvcnQoZW50cmllcyxiaWFzUmlnaHQpe3ZhciBwYXJ0cz11dGlsLnBhcnRpdGlvbihlbnRyaWVzLGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4gXy5oYXMoZW50cnksImJhcnljZW50ZXIiKX0pO3ZhciBzb3J0YWJsZT1wYXJ0cy5saHMsdW5zb3J0YWJsZT1fLnNvcnRCeShwYXJ0cy5yaHMsZnVuY3Rpb24oZW50cnkpe3JldHVybi1lbnRyeS5pfSksdnM9W10sc3VtPTAsd2VpZ2h0PTAsdnNJbmRleD0wO3NvcnRhYmxlLnNvcnQoY29tcGFyZVdpdGhCaWFzKCEhYmlhc1JpZ2h0KSk7dnNJbmRleD1jb25zdW1lVW5zb3J0YWJsZSh2cyx1bnNvcnRhYmxlLHZzSW5kZXgpO18uZm9yRWFjaChzb3J0YWJsZSxmdW5jdGlvbihlbnRyeSl7dnNJbmRleCs9ZW50cnkudnMubGVuZ3RoO3ZzLnB1c2goZW50cnkudnMpOwpzdW0rPWVudHJ5LmJhcnljZW50ZXIqZW50cnkud2VpZ2h0O3dlaWdodCs9ZW50cnkud2VpZ2h0O3ZzSW5kZXg9Y29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSx2c0luZGV4KX0pO3ZhciByZXN1bHQ9e3ZzOl8uZmxhdHRlbih2cyx0cnVlKX07aWYod2VpZ2h0KXtyZXN1bHQuYmFyeWNlbnRlcj1zdW0vd2VpZ2h0O3Jlc3VsdC53ZWlnaHQ9d2VpZ2h0fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSxpbmRleCl7dmFyIGxhc3Q7d2hpbGUodW5zb3J0YWJsZS5sZW5ndGgmJihsYXN0PV8ubGFzdCh1bnNvcnRhYmxlKSkuaTw9aW5kZXgpe3Vuc29ydGFibGUucG9wKCk7dnMucHVzaChsYXN0LnZzKTtpbmRleCsrfXJldHVybiBpbmRleH1mdW5jdGlvbiBjb21wYXJlV2l0aEJpYXMoYmlhcyl7cmV0dXJuIGZ1bmN0aW9uKGVudHJ5VixlbnRyeVcpe2lmKGVudHJ5Vi5iYXJ5Y2VudGVyPGVudHJ5Vy5iYXJ5Y2VudGVyKXJldHVybi0xO2Vsc2UgaWYoZW50cnlWLmJhcnljZW50ZXI+CmVudHJ5Vy5iYXJ5Y2VudGVyKXJldHVybiAxO3JldHVybiFiaWFzP2VudHJ5Vi5pLWVudHJ5Vy5pOmVudHJ5Vy5pLWVudHJ5Vi5pfX19LHsiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6Mjl9XSwyMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1wYXJlbnREdW1teUNoYWlucztmdW5jdGlvbiBwYXJlbnREdW1teUNoYWlucyhnKXt2YXIgcG9zdG9yZGVyTnVtcz1wb3N0b3JkZXIoZyk7Xy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucyxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodiksZWRnZU9iaj1ub2RlLmVkZ2VPYmoscGF0aERhdGE9ZmluZFBhdGgoZyxwb3N0b3JkZXJOdW1zLGVkZ2VPYmoudixlZGdlT2JqLncpLHBhdGg9cGF0aERhdGEucGF0aCxsY2E9cGF0aERhdGEubGNhLHBhdGhJZHg9MCxwYXRoVj1wYXRoW3BhdGhJZHhdLGFzY2VuZGluZz10cnVlO3doaWxlKHYhPT1lZGdlT2JqLncpe25vZGU9Cmcubm9kZSh2KTtpZihhc2NlbmRpbmcpe3doaWxlKChwYXRoVj1wYXRoW3BhdGhJZHhdKSE9PWxjYSYmZy5ub2RlKHBhdGhWKS5tYXhSYW5rPG5vZGUucmFuaylwYXRoSWR4Kys7aWYocGF0aFY9PT1sY2EpYXNjZW5kaW5nPWZhbHNlfWlmKCFhc2NlbmRpbmcpe3doaWxlKHBhdGhJZHg8cGF0aC5sZW5ndGgtMSYmZy5ub2RlKHBhdGhWPXBhdGhbcGF0aElkeCsxXSkubWluUmFuazw9bm9kZS5yYW5rKXBhdGhJZHgrKztwYXRoVj1wYXRoW3BhdGhJZHhdfWcuc2V0UGFyZW50KHYscGF0aFYpO3Y9Zy5zdWNjZXNzb3JzKHYpWzBdfX0pfWZ1bmN0aW9uIGZpbmRQYXRoKGcscG9zdG9yZGVyTnVtcyx2LHcpe3ZhciB2UGF0aD1bXSx3UGF0aD1bXSxsb3c9TWF0aC5taW4ocG9zdG9yZGVyTnVtc1t2XS5sb3cscG9zdG9yZGVyTnVtc1t3XS5sb3cpLGxpbT1NYXRoLm1heChwb3N0b3JkZXJOdW1zW3ZdLmxpbSxwb3N0b3JkZXJOdW1zW3ddLmxpbSkscGFyZW50LGxjYTtwYXJlbnQ9djtkb3twYXJlbnQ9CmcucGFyZW50KHBhcmVudCk7dlBhdGgucHVzaChwYXJlbnQpfXdoaWxlKHBhcmVudCYmKHBvc3RvcmRlck51bXNbcGFyZW50XS5sb3c+bG93fHxsaW0+cG9zdG9yZGVyTnVtc1twYXJlbnRdLmxpbSkpO2xjYT1wYXJlbnQ7cGFyZW50PXc7d2hpbGUoKHBhcmVudD1nLnBhcmVudChwYXJlbnQpKSE9PWxjYSl3UGF0aC5wdXNoKHBhcmVudCk7cmV0dXJue3BhdGg6dlBhdGguY29uY2F0KHdQYXRoLnJldmVyc2UoKSksbGNhOmxjYX19ZnVuY3Rpb24gcG9zdG9yZGVyKGcpe3ZhciByZXN1bHQ9e30sbGltPTA7ZnVuY3Rpb24gZGZzKHYpe3ZhciBsb3c9bGltO18uZm9yRWFjaChnLmNoaWxkcmVuKHYpLGRmcyk7cmVzdWx0W3ZdPXtsb3c6bG93LGxpbTpsaW0rK319Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSxkZnMpO3JldHVybiByZXN1bHR9fSx7Ii4vbG9kYXNoIjoxMH1dLDIzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD0KcmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKTttb2R1bGUuZXhwb3J0cz17cG9zaXRpb25YOnBvc2l0aW9uWCxmaW5kVHlwZTFDb25mbGljdHM6ZmluZFR5cGUxQ29uZmxpY3RzLGZpbmRUeXBlMkNvbmZsaWN0czpmaW5kVHlwZTJDb25mbGljdHMsYWRkQ29uZmxpY3Q6YWRkQ29uZmxpY3QsaGFzQ29uZmxpY3Q6aGFzQ29uZmxpY3QsdmVydGljYWxBbGlnbm1lbnQ6dmVydGljYWxBbGlnbm1lbnQsaG9yaXpvbnRhbENvbXBhY3Rpb246aG9yaXpvbnRhbENvbXBhY3Rpb24sYWxpZ25Db29yZGluYXRlczphbGlnbkNvb3JkaW5hdGVzLGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50OmZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50LGJhbGFuY2U6YmFsYW5jZX07ZnVuY3Rpb24gZmluZFR5cGUxQ29uZmxpY3RzKGcsbGF5ZXJpbmcpe3ZhciBjb25mbGljdHM9e307ZnVuY3Rpb24gdmlzaXRMYXllcihwcmV2TGF5ZXIsbGF5ZXIpe3ZhciBrMD0wLHNjYW5Qb3M9CjAscHJldkxheWVyTGVuZ3RoPXByZXZMYXllci5sZW5ndGgsbGFzdE5vZGU9Xy5sYXN0KGxheWVyKTtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixpKXt2YXIgdz1maW5kT3RoZXJJbm5lclNlZ21lbnROb2RlKGcsdiksazE9dz9nLm5vZGUodykub3JkZXI6cHJldkxheWVyTGVuZ3RoO2lmKHd8fHY9PT1sYXN0Tm9kZSl7Xy5mb3JFYWNoKGxheWVyLnNsaWNlKHNjYW5Qb3MsaSsxKSxmdW5jdGlvbihzY2FuTm9kZSl7Xy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHNjYW5Ob2RlKSxmdW5jdGlvbih1KXt2YXIgdUxhYmVsPWcubm9kZSh1KSx1UG9zPXVMYWJlbC5vcmRlcjtpZigodVBvczxrMHx8azE8dVBvcykmJiEodUxhYmVsLmR1bW15JiZnLm5vZGUoc2Nhbk5vZGUpLmR1bW15KSlhZGRDb25mbGljdChjb25mbGljdHMsdSxzY2FuTm9kZSl9KX0pO3NjYW5Qb3M9aSsxO2swPWsxfX0pO3JldHVybiBsYXllcn1fLnJlZHVjZShsYXllcmluZyx2aXNpdExheWVyKTtyZXR1cm4gY29uZmxpY3RzfQpmdW5jdGlvbiBmaW5kVHlwZTJDb25mbGljdHMoZyxsYXllcmluZyl7dmFyIGNvbmZsaWN0cz17fTtmdW5jdGlvbiBzY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoRW5kLHByZXZOb3J0aEJvcmRlcixuZXh0Tm9ydGhCb3JkZXIpe3ZhciB2O18uZm9yRWFjaChfLnJhbmdlKHNvdXRoUG9zLHNvdXRoRW5kKSxmdW5jdGlvbihpKXt2PXNvdXRoW2ldO2lmKGcubm9kZSh2KS5kdW1teSlfLmZvckVhY2goZy5wcmVkZWNlc3NvcnModiksZnVuY3Rpb24odSl7dmFyIHVOb2RlPWcubm9kZSh1KTtpZih1Tm9kZS5kdW1teSYmKHVOb2RlLm9yZGVyPHByZXZOb3J0aEJvcmRlcnx8dU5vZGUub3JkZXI+bmV4dE5vcnRoQm9yZGVyKSlhZGRDb25mbGljdChjb25mbGljdHMsdSx2KX0pfSl9ZnVuY3Rpb24gdmlzaXRMYXllcihub3J0aCxzb3V0aCl7dmFyIHByZXZOb3J0aFBvcz0tMSxuZXh0Tm9ydGhQb3Msc291dGhQb3M9MDtfLmZvckVhY2goc291dGgsZnVuY3Rpb24odixzb3V0aExvb2thaGVhZCl7aWYoZy5ub2RlKHYpLmR1bW15PT09CiJib3JkZXIiKXt2YXIgcHJlZGVjZXNzb3JzPWcucHJlZGVjZXNzb3JzKHYpO2lmKHByZWRlY2Vzc29ycy5sZW5ndGgpe25leHROb3J0aFBvcz1nLm5vZGUocHJlZGVjZXNzb3JzWzBdKS5vcmRlcjtzY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoTG9va2FoZWFkLHByZXZOb3J0aFBvcyxuZXh0Tm9ydGhQb3MpO3NvdXRoUG9zPXNvdXRoTG9va2FoZWFkO3ByZXZOb3J0aFBvcz1uZXh0Tm9ydGhQb3N9fXNjYW4oc291dGgsc291dGhQb3Msc291dGgubGVuZ3RoLG5leHROb3J0aFBvcyxub3J0aC5sZW5ndGgpfSk7cmV0dXJuIHNvdXRofV8ucmVkdWNlKGxheWVyaW5nLHZpc2l0TGF5ZXIpO3JldHVybiBjb25mbGljdHN9ZnVuY3Rpb24gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLHYpe2lmKGcubm9kZSh2KS5kdW1teSlyZXR1cm4gXy5maW5kKGcucHJlZGVjZXNzb3JzKHYpLGZ1bmN0aW9uKHUpe3JldHVybiBnLm5vZGUodSkuZHVtbXl9KX1mdW5jdGlvbiBhZGRDb25mbGljdChjb25mbGljdHMsCnYsdyl7aWYodj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXZhciBjb25mbGljdHNWPWNvbmZsaWN0c1t2XTtpZighY29uZmxpY3RzViljb25mbGljdHNbdl09Y29uZmxpY3RzVj17fTtjb25mbGljdHNWW3ddPXRydWV9ZnVuY3Rpb24gaGFzQ29uZmxpY3QoY29uZmxpY3RzLHYsdyl7aWYodj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXJldHVybiBfLmhhcyhjb25mbGljdHNbdl0sdyl9ZnVuY3Rpb24gdmVydGljYWxBbGlnbm1lbnQoZyxsYXllcmluZyxjb25mbGljdHMsbmVpZ2hib3JGbil7dmFyIHJvb3Q9e30sYWxpZ249e30scG9zPXt9O18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsb3JkZXIpe3Jvb3Rbdl09djthbGlnblt2XT12O3Bvc1t2XT1vcmRlcn0pfSk7Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXt2YXIgcHJldklkeD0tMTtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odil7dmFyIHdzPW5laWdoYm9yRm4odik7CmlmKHdzLmxlbmd0aCl7d3M9Xy5zb3J0Qnkod3MsZnVuY3Rpb24odyl7cmV0dXJuIHBvc1t3XX0pO3ZhciBtcD0od3MubGVuZ3RoLTEpLzI7Zm9yKHZhciBpPU1hdGguZmxvb3IobXApLGlsPU1hdGguY2VpbChtcCk7aTw9aWw7KytpKXt2YXIgdz13c1tpXTtpZihhbGlnblt2XT09PXYmJnByZXZJZHg8cG9zW3ddJiYhaGFzQ29uZmxpY3QoY29uZmxpY3RzLHYsdykpe2FsaWduW3ddPXY7YWxpZ25bdl09cm9vdFt2XT1yb290W3ddO3ByZXZJZHg9cG9zW3ddfX19fSl9KTtyZXR1cm57cm9vdDpyb290LGFsaWduOmFsaWdufX1mdW5jdGlvbiBob3Jpem9udGFsQ29tcGFjdGlvbihnLGxheWVyaW5nLHJvb3QsYWxpZ24scmV2ZXJzZVNlcCl7dmFyIHhzPXt9LGJsb2NrRz1idWlsZEJsb2NrR3JhcGgoZyxsYXllcmluZyxyb290LHJldmVyc2VTZXApLGJvcmRlclR5cGU9cmV2ZXJzZVNlcD8iYm9yZGVyTGVmdCI6ImJvcmRlclJpZ2h0IjtmdW5jdGlvbiBpdGVyYXRlKHNldFhzRnVuYyxuZXh0Tm9kZXNGdW5jKXt2YXIgc3RhY2s9CmJsb2NrRy5ub2RlcygpO3ZhciBlbGVtPXN0YWNrLnBvcCgpO3ZhciB2aXNpdGVkPXt9O3doaWxlKGVsZW0pe2lmKHZpc2l0ZWRbZWxlbV0pc2V0WHNGdW5jKGVsZW0pO2Vsc2V7dmlzaXRlZFtlbGVtXT10cnVlO3N0YWNrLnB1c2goZWxlbSk7c3RhY2s9c3RhY2suY29uY2F0KG5leHROb2Rlc0Z1bmMoZWxlbSkpfWVsZW09c3RhY2sucG9wKCl9fWZ1bmN0aW9uIHBhc3MxKGVsZW0pe3hzW2VsZW1dPWJsb2NrRy5pbkVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsZSl7cmV0dXJuIE1hdGgubWF4KGFjYyx4c1tlLnZdK2Jsb2NrRy5lZGdlKGUpKX0sMCl9ZnVuY3Rpb24gcGFzczIoZWxlbSl7dmFyIG1pbj1ibG9ja0cub3V0RWRnZXMoZWxlbSkucmVkdWNlKGZ1bmN0aW9uKGFjYyxlKXtyZXR1cm4gTWF0aC5taW4oYWNjLHhzW2Uud10tYmxvY2tHLmVkZ2UoZSkpfSxOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO3ZhciBub2RlPWcubm9kZShlbGVtKTtpZihtaW4hPT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkmJgpub2RlLmJvcmRlclR5cGUhPT1ib3JkZXJUeXBlKXhzW2VsZW1dPU1hdGgubWF4KHhzW2VsZW1dLG1pbil9aXRlcmF0ZShwYXNzMSxfLmJpbmQoYmxvY2tHLnByZWRlY2Vzc29ycyxibG9ja0cpKTtpdGVyYXRlKHBhc3MyLF8uYmluZChibG9ja0cuc3VjY2Vzc29ycyxibG9ja0cpKTtfLmZvckVhY2goYWxpZ24sZnVuY3Rpb24odil7eHNbdl09eHNbcm9vdFt2XV19KTtyZXR1cm4geHN9ZnVuY3Rpb24gYnVpbGRCbG9ja0dyYXBoKGcsbGF5ZXJpbmcscm9vdCxyZXZlcnNlU2VwKXt2YXIgYmxvY2tHcmFwaD1uZXcgR3JhcGgsZ3JhcGhMYWJlbD1nLmdyYXBoKCksc2VwRm49c2VwKGdyYXBoTGFiZWwubm9kZXNlcCxncmFwaExhYmVsLmVkZ2VzZXAscmV2ZXJzZVNlcCk7Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXt2YXIgdTtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odil7dmFyIHZSb290PXJvb3Rbdl07YmxvY2tHcmFwaC5zZXROb2RlKHZSb290KTtpZih1KXt2YXIgdVJvb3Q9CnJvb3RbdV0scHJldk1heD1ibG9ja0dyYXBoLmVkZ2UodVJvb3QsdlJvb3QpO2Jsb2NrR3JhcGguc2V0RWRnZSh1Um9vdCx2Um9vdCxNYXRoLm1heChzZXBGbihnLHYsdSkscHJldk1heHx8MCkpfXU9dn0pfSk7cmV0dXJuIGJsb2NrR3JhcGh9ZnVuY3Rpb24gZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZyx4c3Mpe3JldHVybiBfLm1pbkJ5KF8udmFsdWVzKHhzcyksZnVuY3Rpb24oeHMpe3ZhciBtYXg9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO3ZhciBtaW49TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO18uZm9ySW4oeHMsZnVuY3Rpb24oeCx2KXt2YXIgaGFsZldpZHRoPXdpZHRoKGcsdikvMjttYXg9TWF0aC5tYXgoeCtoYWxmV2lkdGgsbWF4KTttaW49TWF0aC5taW4oeC1oYWxmV2lkdGgsbWluKX0pO3JldHVybiBtYXgtbWlufSl9ZnVuY3Rpb24gYWxpZ25Db29yZGluYXRlcyh4c3MsYWxpZ25Ubyl7dmFyIGFsaWduVG9WYWxzPV8udmFsdWVzKGFsaWduVG8pLGFsaWduVG9NaW49Cl8ubWluKGFsaWduVG9WYWxzKSxhbGlnblRvTWF4PV8ubWF4KGFsaWduVG9WYWxzKTtfLmZvckVhY2goWyJ1IiwiZCJdLGZ1bmN0aW9uKHZlcnQpe18uZm9yRWFjaChbImwiLCJyIl0sZnVuY3Rpb24oaG9yaXope3ZhciBhbGlnbm1lbnQ9dmVydCtob3Jpeix4cz14c3NbYWxpZ25tZW50XSxkZWx0YTtpZih4cz09PWFsaWduVG8pcmV0dXJuO3ZhciB4c1ZhbHM9Xy52YWx1ZXMoeHMpO2RlbHRhPWhvcml6PT09ImwiP2FsaWduVG9NaW4tXy5taW4oeHNWYWxzKTphbGlnblRvTWF4LV8ubWF4KHhzVmFscyk7aWYoZGVsdGEpeHNzW2FsaWdubWVudF09Xy5tYXBWYWx1ZXMoeHMsZnVuY3Rpb24oeCl7cmV0dXJuIHgrZGVsdGF9KX0pfSl9ZnVuY3Rpb24gYmFsYW5jZSh4c3MsYWxpZ24pe3JldHVybiBfLm1hcFZhbHVlcyh4c3MudWwsZnVuY3Rpb24oaWdub3JlLHYpe2lmKGFsaWduKXJldHVybiB4c3NbYWxpZ24udG9Mb3dlckNhc2UoKV1bdl07ZWxzZXt2YXIgeHM9Xy5zb3J0QnkoXy5tYXAoeHNzLAp2KSk7cmV0dXJuKHhzWzFdK3hzWzJdKS8yfX0pfWZ1bmN0aW9uIHBvc2l0aW9uWChnKXt2YXIgbGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpLGNvbmZsaWN0cz1fLm1lcmdlKGZpbmRUeXBlMUNvbmZsaWN0cyhnLGxheWVyaW5nKSxmaW5kVHlwZTJDb25mbGljdHMoZyxsYXllcmluZykpO3ZhciB4c3M9e30sYWRqdXN0ZWRMYXllcmluZztfLmZvckVhY2goWyJ1IiwiZCJdLGZ1bmN0aW9uKHZlcnQpe2FkanVzdGVkTGF5ZXJpbmc9dmVydD09PSJ1Ij9sYXllcmluZzpfLnZhbHVlcyhsYXllcmluZykucmV2ZXJzZSgpO18uZm9yRWFjaChbImwiLCJyIl0sZnVuY3Rpb24oaG9yaXope2lmKGhvcml6PT09InIiKWFkanVzdGVkTGF5ZXJpbmc9Xy5tYXAoYWRqdXN0ZWRMYXllcmluZyxmdW5jdGlvbihpbm5lcil7cmV0dXJuIF8udmFsdWVzKGlubmVyKS5yZXZlcnNlKCl9KTt2YXIgbmVpZ2hib3JGbj1fLmJpbmQodmVydD09PSJ1Ij9nLnByZWRlY2Vzc29yczpnLnN1Y2Nlc3NvcnMsCmcpO3ZhciBhbGlnbj12ZXJ0aWNhbEFsaWdubWVudChnLGFkanVzdGVkTGF5ZXJpbmcsY29uZmxpY3RzLG5laWdoYm9yRm4pO3ZhciB4cz1ob3Jpem9udGFsQ29tcGFjdGlvbihnLGFkanVzdGVkTGF5ZXJpbmcsYWxpZ24ucm9vdCxhbGlnbi5hbGlnbixob3Jpej09PSJyIik7aWYoaG9yaXo9PT0iciIpeHM9Xy5tYXBWYWx1ZXMoeHMsZnVuY3Rpb24oeCl7cmV0dXJuLXh9KTt4c3NbdmVydCtob3Jpel09eHN9KX0pO3ZhciBzbWFsbGVzdFdpZHRoPWZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcseHNzKTthbGlnbkNvb3JkaW5hdGVzKHhzcyxzbWFsbGVzdFdpZHRoKTtyZXR1cm4gYmFsYW5jZSh4c3MsZy5ncmFwaCgpLmFsaWduKX1mdW5jdGlvbiBzZXAobm9kZVNlcCxlZGdlU2VwLHJldmVyc2VTZXApe3JldHVybiBmdW5jdGlvbihnLHYsdyl7dmFyIHZMYWJlbD1nLm5vZGUodiksd0xhYmVsPWcubm9kZSh3KSxzdW09MCxkZWx0YTtzdW0rPXZMYWJlbC53aWR0aC8yO2lmKF8uaGFzKHZMYWJlbCwKImxhYmVscG9zIikpc3dpdGNoKHZMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKXtjYXNlICJsIjpkZWx0YT0tdkxhYmVsLndpZHRoLzI7YnJlYWs7Y2FzZSAiciI6ZGVsdGE9dkxhYmVsLndpZHRoLzI7YnJlYWt9aWYoZGVsdGEpc3VtKz1yZXZlcnNlU2VwP2RlbHRhOi1kZWx0YTtkZWx0YT0wO3N1bSs9KHZMYWJlbC5kdW1teT9lZGdlU2VwOm5vZGVTZXApLzI7c3VtKz0od0xhYmVsLmR1bW15P2VkZ2VTZXA6bm9kZVNlcCkvMjtzdW0rPXdMYWJlbC53aWR0aC8yO2lmKF8uaGFzKHdMYWJlbCwibGFiZWxwb3MiKSlzd2l0Y2god0xhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpe2Nhc2UgImwiOmRlbHRhPXdMYWJlbC53aWR0aC8yO2JyZWFrO2Nhc2UgInIiOmRlbHRhPS13TGFiZWwud2lkdGgvMjticmVha31pZihkZWx0YSlzdW0rPXJldmVyc2VTZXA/ZGVsdGE6LWRlbHRhO2RlbHRhPTA7cmV0dXJuIHN1bX19ZnVuY3Rpb24gd2lkdGgoZyx2KXtyZXR1cm4gZy5ub2RlKHYpLndpZHRofQp9LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5fV0sMjQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi4vdXRpbCIpLHBvc2l0aW9uWD1yZXF1aXJlKCIuL2JrIikucG9zaXRpb25YO21vZHVsZS5leHBvcnRzPXBvc2l0aW9uO2Z1bmN0aW9uIHBvc2l0aW9uKGcpe2c9dXRpbC5hc05vbkNvbXBvdW5kR3JhcGgoZyk7cG9zaXRpb25ZKGcpO18uZm9yRWFjaChwb3NpdGlvblgoZyksZnVuY3Rpb24oeCx2KXtnLm5vZGUodikueD14fSl9ZnVuY3Rpb24gcG9zaXRpb25ZKGcpe3ZhciBsYXllcmluZz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZykscmFua1NlcD1nLmdyYXBoKCkucmFua3NlcCxwcmV2WT0wO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIG1heEhlaWdodD1fLm1heChfLm1hcChsYXllcixmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLmhlaWdodH0pKTsKXy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS55PXByZXZZK21heEhlaWdodC8yfSk7cHJldlkrPW1heEhlaWdodCtyYW5rU2VwfSl9fSx7Ii4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5LCIuL2JrIjoyM31dLDI1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoLHNsYWNrPXJlcXVpcmUoIi4vdXRpbCIpLnNsYWNrO21vZHVsZS5leHBvcnRzPWZlYXNpYmxlVHJlZTtmdW5jdGlvbiBmZWFzaWJsZVRyZWUoZyl7dmFyIHQ9bmV3IEdyYXBoKHtkaXJlY3RlZDpmYWxzZX0pO3ZhciBzdGFydD1nLm5vZGVzKClbMF0sc2l6ZT1nLm5vZGVDb3VudCgpO3Quc2V0Tm9kZShzdGFydCx7fSk7dmFyIGVkZ2UsZGVsdGE7d2hpbGUodGlnaHRUcmVlKHQsZyk8c2l6ZSl7ZWRnZT1maW5kTWluU2xhY2tFZGdlKHQsZyk7ZGVsdGE9dC5oYXNOb2RlKGVkZ2Uudik/CnNsYWNrKGcsZWRnZSk6LXNsYWNrKGcsZWRnZSk7c2hpZnRSYW5rcyh0LGcsZGVsdGEpfXJldHVybiB0fWZ1bmN0aW9uIHRpZ2h0VHJlZSh0LGcpe2Z1bmN0aW9uIGRmcyh2KXtfLmZvckVhY2goZy5ub2RlRWRnZXModiksZnVuY3Rpb24oZSl7dmFyIGVkZ2VWPWUudix3PXY9PT1lZGdlVj9lLnc6ZWRnZVY7aWYoIXQuaGFzTm9kZSh3KSYmIXNsYWNrKGcsZSkpe3Quc2V0Tm9kZSh3LHt9KTt0LnNldEVkZ2Uodix3LHt9KTtkZnModyl9fSl9Xy5mb3JFYWNoKHQubm9kZXMoKSxkZnMpO3JldHVybiB0Lm5vZGVDb3VudCgpfWZ1bmN0aW9uIGZpbmRNaW5TbGFja0VkZ2UodCxnKXtyZXR1cm4gXy5taW5CeShnLmVkZ2VzKCksZnVuY3Rpb24oZSl7aWYodC5oYXNOb2RlKGUudikhPT10Lmhhc05vZGUoZS53KSlyZXR1cm4gc2xhY2soZyxlKX0pfWZ1bmN0aW9uIHNoaWZ0UmFua3ModCxnLGRlbHRhKXtfLmZvckVhY2godC5ub2RlcygpLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS5yYW5rKz1kZWx0YX0pfQp9LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjh9XSwyNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIHJhbmtVdGlsPXJlcXVpcmUoIi4vdXRpbCIpLGxvbmdlc3RQYXRoPXJhbmtVdGlsLmxvbmdlc3RQYXRoLGZlYXNpYmxlVHJlZT1yZXF1aXJlKCIuL2ZlYXNpYmxlLXRyZWUiKSxuZXR3b3JrU2ltcGxleD1yZXF1aXJlKCIuL25ldHdvcmstc2ltcGxleCIpO21vZHVsZS5leHBvcnRzPXJhbms7ZnVuY3Rpb24gcmFuayhnKXtzd2l0Y2goZy5ncmFwaCgpLnJhbmtlcil7Y2FzZSAibmV0d29yay1zaW1wbGV4IjpuZXR3b3JrU2ltcGxleFJhbmtlcihnKTticmVhaztjYXNlICJ0aWdodC10cmVlIjp0aWdodFRyZWVSYW5rZXIoZyk7YnJlYWs7Y2FzZSAibG9uZ2VzdC1wYXRoIjpsb25nZXN0UGF0aFJhbmtlcihnKTticmVhaztkZWZhdWx0Om5ldHdvcmtTaW1wbGV4UmFua2VyKGcpfX12YXIgbG9uZ2VzdFBhdGhSYW5rZXI9bG9uZ2VzdFBhdGg7CmZ1bmN0aW9uIHRpZ2h0VHJlZVJhbmtlcihnKXtsb25nZXN0UGF0aChnKTtmZWFzaWJsZVRyZWUoZyl9ZnVuY3Rpb24gbmV0d29ya1NpbXBsZXhSYW5rZXIoZyl7bmV0d29ya1NpbXBsZXgoZyl9fSx7Ii4vZmVhc2libGUtdHJlZSI6MjUsIi4vbmV0d29yay1zaW1wbGV4IjoyNywiLi91dGlsIjoyOH1dLDI3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxmZWFzaWJsZVRyZWU9cmVxdWlyZSgiLi9mZWFzaWJsZS10cmVlIiksc2xhY2s9cmVxdWlyZSgiLi91dGlsIikuc2xhY2ssaW5pdFJhbms9cmVxdWlyZSgiLi91dGlsIikubG9uZ2VzdFBhdGgscHJlb3JkZXI9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5hbGcucHJlb3JkZXIscG9zdG9yZGVyPXJlcXVpcmUoIi4uL2dyYXBobGliIikuYWxnLnBvc3RvcmRlcixzaW1wbGlmeT1yZXF1aXJlKCIuLi91dGlsIikuc2ltcGxpZnk7bW9kdWxlLmV4cG9ydHM9bmV0d29ya1NpbXBsZXg7Cm5ldHdvcmtTaW1wbGV4LmluaXRMb3dMaW1WYWx1ZXM9aW5pdExvd0xpbVZhbHVlcztuZXR3b3JrU2ltcGxleC5pbml0Q3V0VmFsdWVzPWluaXRDdXRWYWx1ZXM7bmV0d29ya1NpbXBsZXguY2FsY0N1dFZhbHVlPWNhbGNDdXRWYWx1ZTtuZXR3b3JrU2ltcGxleC5sZWF2ZUVkZ2U9bGVhdmVFZGdlO25ldHdvcmtTaW1wbGV4LmVudGVyRWRnZT1lbnRlckVkZ2U7bmV0d29ya1NpbXBsZXguZXhjaGFuZ2VFZGdlcz1leGNoYW5nZUVkZ2VzO2Z1bmN0aW9uIG5ldHdvcmtTaW1wbGV4KGcpe2c9c2ltcGxpZnkoZyk7aW5pdFJhbmsoZyk7dmFyIHQ9ZmVhc2libGVUcmVlKGcpO2luaXRMb3dMaW1WYWx1ZXModCk7aW5pdEN1dFZhbHVlcyh0LGcpO3ZhciBlLGY7d2hpbGUoZT1sZWF2ZUVkZ2UodCkpe2Y9ZW50ZXJFZGdlKHQsZyxlKTtleGNoYW5nZUVkZ2VzKHQsZyxlLGYpfX1mdW5jdGlvbiBpbml0Q3V0VmFsdWVzKHQsZyl7dmFyIHZzPXBvc3RvcmRlcih0LHQubm9kZXMoKSk7dnM9dnMuc2xpY2UoMCwKdnMubGVuZ3RoLTEpO18uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXthc3NpZ25DdXRWYWx1ZSh0LGcsdil9KX1mdW5jdGlvbiBhc3NpZ25DdXRWYWx1ZSh0LGcsY2hpbGQpe3ZhciBjaGlsZExhYj10Lm5vZGUoY2hpbGQpLHBhcmVudD1jaGlsZExhYi5wYXJlbnQ7dC5lZGdlKGNoaWxkLHBhcmVudCkuY3V0dmFsdWU9Y2FsY0N1dFZhbHVlKHQsZyxjaGlsZCl9ZnVuY3Rpb24gY2FsY0N1dFZhbHVlKHQsZyxjaGlsZCl7dmFyIGNoaWxkTGFiPXQubm9kZShjaGlsZCkscGFyZW50PWNoaWxkTGFiLnBhcmVudCxjaGlsZElzVGFpbD10cnVlLGdyYXBoRWRnZT1nLmVkZ2UoY2hpbGQscGFyZW50KSxjdXRWYWx1ZT0wO2lmKCFncmFwaEVkZ2Upe2NoaWxkSXNUYWlsPWZhbHNlO2dyYXBoRWRnZT1nLmVkZ2UocGFyZW50LGNoaWxkKX1jdXRWYWx1ZT1ncmFwaEVkZ2Uud2VpZ2h0O18uZm9yRWFjaChnLm5vZGVFZGdlcyhjaGlsZCksZnVuY3Rpb24oZSl7dmFyIGlzT3V0RWRnZT1lLnY9PT1jaGlsZCxvdGhlcj0KaXNPdXRFZGdlP2UudzplLnY7aWYob3RoZXIhPT1wYXJlbnQpe3ZhciBwb2ludHNUb0hlYWQ9aXNPdXRFZGdlPT09Y2hpbGRJc1RhaWwsb3RoZXJXZWlnaHQ9Zy5lZGdlKGUpLndlaWdodDtjdXRWYWx1ZSs9cG9pbnRzVG9IZWFkP290aGVyV2VpZ2h0Oi1vdGhlcldlaWdodDtpZihpc1RyZWVFZGdlKHQsY2hpbGQsb3RoZXIpKXt2YXIgb3RoZXJDdXRWYWx1ZT10LmVkZ2UoY2hpbGQsb3RoZXIpLmN1dHZhbHVlO2N1dFZhbHVlKz1wb2ludHNUb0hlYWQ/LW90aGVyQ3V0VmFsdWU6b3RoZXJDdXRWYWx1ZX19fSk7cmV0dXJuIGN1dFZhbHVlfWZ1bmN0aW9uIGluaXRMb3dMaW1WYWx1ZXModHJlZSxyb290KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpcm9vdD10cmVlLm5vZGVzKClbMF07ZGZzQXNzaWduTG93TGltKHRyZWUse30sMSxyb290KX1mdW5jdGlvbiBkZnNBc3NpZ25Mb3dMaW0odHJlZSx2aXNpdGVkLG5leHRMaW0sdixwYXJlbnQpe3ZhciBsb3c9bmV4dExpbSxsYWJlbD10cmVlLm5vZGUodik7CnZpc2l0ZWRbdl09dHJ1ZTtfLmZvckVhY2godHJlZS5uZWlnaGJvcnModiksZnVuY3Rpb24odyl7aWYoIV8uaGFzKHZpc2l0ZWQsdykpbmV4dExpbT1kZnNBc3NpZ25Mb3dMaW0odHJlZSx2aXNpdGVkLG5leHRMaW0sdyx2KX0pO2xhYmVsLmxvdz1sb3c7bGFiZWwubGltPW5leHRMaW0rKztpZihwYXJlbnQpbGFiZWwucGFyZW50PXBhcmVudDtlbHNlIGRlbGV0ZSBsYWJlbC5wYXJlbnQ7cmV0dXJuIG5leHRMaW19ZnVuY3Rpb24gbGVhdmVFZGdlKHRyZWUpe3JldHVybiBfLmZpbmQodHJlZS5lZGdlcygpLGZ1bmN0aW9uKGUpe3JldHVybiB0cmVlLmVkZ2UoZSkuY3V0dmFsdWU8MH0pfWZ1bmN0aW9uIGVudGVyRWRnZSh0LGcsZWRnZSl7dmFyIHY9ZWRnZS52LHc9ZWRnZS53O2lmKCFnLmhhc0VkZ2Uodix3KSl7dj1lZGdlLnc7dz1lZGdlLnZ9dmFyIHZMYWJlbD10Lm5vZGUodiksd0xhYmVsPXQubm9kZSh3KSx0YWlsTGFiZWw9dkxhYmVsLGZsaXA9ZmFsc2U7aWYodkxhYmVsLmxpbT53TGFiZWwubGltKXt0YWlsTGFiZWw9CndMYWJlbDtmbGlwPXRydWV9dmFyIGNhbmRpZGF0ZXM9Xy5maWx0ZXIoZy5lZGdlcygpLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBmbGlwPT09aXNEZXNjZW5kYW50KHQsdC5ub2RlKGVkZ2UudiksdGFpbExhYmVsKSYmZmxpcCE9PWlzRGVzY2VuZGFudCh0LHQubm9kZShlZGdlLncpLHRhaWxMYWJlbCl9KTtyZXR1cm4gXy5taW5CeShjYW5kaWRhdGVzLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBzbGFjayhnLGVkZ2UpfSl9ZnVuY3Rpb24gZXhjaGFuZ2VFZGdlcyh0LGcsZSxmKXt2YXIgdj1lLnYsdz1lLnc7dC5yZW1vdmVFZGdlKHYsdyk7dC5zZXRFZGdlKGYudixmLncse30pO2luaXRMb3dMaW1WYWx1ZXModCk7aW5pdEN1dFZhbHVlcyh0LGcpO3VwZGF0ZVJhbmtzKHQsZyl9ZnVuY3Rpb24gdXBkYXRlUmFua3ModCxnKXt2YXIgcm9vdD1fLmZpbmQodC5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiFnLm5vZGUodikucGFyZW50fSksdnM9cHJlb3JkZXIodCxyb290KTt2cz12cy5zbGljZSgxKTsKXy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe3ZhciBwYXJlbnQ9dC5ub2RlKHYpLnBhcmVudCxlZGdlPWcuZWRnZSh2LHBhcmVudCksZmxpcHBlZD1mYWxzZTtpZighZWRnZSl7ZWRnZT1nLmVkZ2UocGFyZW50LHYpO2ZsaXBwZWQ9dHJ1ZX1nLm5vZGUodikucmFuaz1nLm5vZGUocGFyZW50KS5yYW5rKyhmbGlwcGVkP2VkZ2UubWlubGVuOi1lZGdlLm1pbmxlbil9KX1mdW5jdGlvbiBpc1RyZWVFZGdlKHRyZWUsdSx2KXtyZXR1cm4gdHJlZS5oYXNFZGdlKHUsdil9ZnVuY3Rpb24gaXNEZXNjZW5kYW50KHRyZWUsdkxhYmVsLHJvb3RMYWJlbCl7cmV0dXJuIHJvb3RMYWJlbC5sb3c8PXZMYWJlbC5saW0mJnZMYWJlbC5saW08PXJvb3RMYWJlbC5saW19fSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOSwiLi9mZWFzaWJsZS10cmVlIjoyNSwiLi91dGlsIjoyOH1dLDI4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTsKbW9kdWxlLmV4cG9ydHM9e2xvbmdlc3RQYXRoOmxvbmdlc3RQYXRoLHNsYWNrOnNsYWNrfTtmdW5jdGlvbiBsb25nZXN0UGF0aChnKXt2YXIgdmlzaXRlZD17fTtmdW5jdGlvbiBkZnModil7dmFyIGxhYmVsPWcubm9kZSh2KTtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybiBsYWJlbC5yYW5rO3Zpc2l0ZWRbdl09dHJ1ZTt2YXIgcmFuaz1fLm1pbkJ5KF8ubWFwKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7cmV0dXJuIGRmcyhlLncpLWcuZWRnZShlKS5taW5sZW59KSk7aWYocmFuaz09PU51bWJlci5QT1NJVElWRV9JTkZJTklUWXx8cmFuaz09PXVuZGVmaW5lZHx8cmFuaz09PW51bGwpcmFuaz0wO3JldHVybiBsYWJlbC5yYW5rPXJhbmt9Xy5mb3JFYWNoKGcuc291cmNlcygpLGRmcyl9ZnVuY3Rpb24gc2xhY2soZyxlKXtyZXR1cm4gZy5ub2RlKGUudykucmFuay1nLm5vZGUoZS52KS5yYW5rLWcuZWRnZShlKS5taW5sZW59fSx7Ii4uL2xvZGFzaCI6MTB9XSwyOTpbZnVuY3Rpb24ocmVxdWlyZSwKbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPXthZGREdW1teU5vZGU6YWRkRHVtbXlOb2RlLHNpbXBsaWZ5OnNpbXBsaWZ5LGFzTm9uQ29tcG91bmRHcmFwaDphc05vbkNvbXBvdW5kR3JhcGgsc3VjY2Vzc29yV2VpZ2h0czpzdWNjZXNzb3JXZWlnaHRzLHByZWRlY2Vzc29yV2VpZ2h0czpwcmVkZWNlc3NvcldlaWdodHMsaW50ZXJzZWN0UmVjdDppbnRlcnNlY3RSZWN0LGJ1aWxkTGF5ZXJNYXRyaXg6YnVpbGRMYXllck1hdHJpeCxub3JtYWxpemVSYW5rczpub3JtYWxpemVSYW5rcyxyZW1vdmVFbXB0eVJhbmtzOnJlbW92ZUVtcHR5UmFua3MsYWRkQm9yZGVyTm9kZTphZGRCb3JkZXJOb2RlLG1heFJhbms6bWF4UmFuayxwYXJ0aXRpb246cGFydGl0aW9uLHRpbWU6dGltZSxub3RpbWU6bm90aW1lfTtmdW5jdGlvbiBhZGREdW1teU5vZGUoZyx0eXBlLGF0dHJzLG5hbWUpe3ZhciB2OwpkbyB2PV8udW5pcXVlSWQobmFtZSk7d2hpbGUoZy5oYXNOb2RlKHYpKTthdHRycy5kdW1teT10eXBlO2cuc2V0Tm9kZSh2LGF0dHJzKTtyZXR1cm4gdn1mdW5jdGlvbiBzaW1wbGlmeShnKXt2YXIgc2ltcGxpZmllZD0obmV3IEdyYXBoKS5zZXRHcmFwaChnLmdyYXBoKCkpO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7c2ltcGxpZmllZC5zZXROb2RlKHYsZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIHNpbXBsZUxhYmVsPXNpbXBsaWZpZWQuZWRnZShlLnYsZS53KXx8e3dlaWdodDowLG1pbmxlbjoxfSxsYWJlbD1nLmVkZ2UoZSk7c2ltcGxpZmllZC5zZXRFZGdlKGUudixlLncse3dlaWdodDpzaW1wbGVMYWJlbC53ZWlnaHQrbGFiZWwud2VpZ2h0LG1pbmxlbjpNYXRoLm1heChzaW1wbGVMYWJlbC5taW5sZW4sbGFiZWwubWlubGVuKX0pfSk7cmV0dXJuIHNpbXBsaWZpZWR9ZnVuY3Rpb24gYXNOb25Db21wb3VuZEdyYXBoKGcpe3ZhciBzaW1wbGlmaWVkPQoobmV3IEdyYXBoKHttdWx0aWdyYXBoOmcuaXNNdWx0aWdyYXBoKCl9KSkuc2V0R3JhcGgoZy5ncmFwaCgpKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2lmKCFnLmNoaWxkcmVuKHYpLmxlbmd0aClzaW1wbGlmaWVkLnNldE5vZGUodixnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtzaW1wbGlmaWVkLnNldEVkZ2UoZSxnLmVkZ2UoZSkpfSk7cmV0dXJuIHNpbXBsaWZpZWR9ZnVuY3Rpb24gc3VjY2Vzc29yV2VpZ2h0cyhnKXt2YXIgd2VpZ2h0TWFwPV8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgc3Vjcz17fTtfLmZvckVhY2goZy5vdXRFZGdlcyh2KSxmdW5jdGlvbihlKXtzdWNzW2Uud109KHN1Y3NbZS53XXx8MCkrZy5lZGdlKGUpLndlaWdodH0pO3JldHVybiBzdWNzfSk7cmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSx3ZWlnaHRNYXApfWZ1bmN0aW9uIHByZWRlY2Vzc29yV2VpZ2h0cyhnKXt2YXIgd2VpZ2h0TWFwPV8ubWFwKGcubm9kZXMoKSwKZnVuY3Rpb24odil7dmFyIHByZWRzPXt9O18uZm9yRWFjaChnLmluRWRnZXModiksZnVuY3Rpb24oZSl7cHJlZHNbZS52XT0ocHJlZHNbZS52XXx8MCkrZy5lZGdlKGUpLndlaWdodH0pO3JldHVybiBwcmVkc30pO3JldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksd2VpZ2h0TWFwKX1mdW5jdGlvbiBpbnRlcnNlY3RSZWN0KHJlY3QscG9pbnQpe3ZhciB4PXJlY3QueDt2YXIgeT1yZWN0Lnk7dmFyIGR4PXBvaW50LngteDt2YXIgZHk9cG9pbnQueS15O3ZhciB3PXJlY3Qud2lkdGgvMjt2YXIgaD1yZWN0LmhlaWdodC8yO2lmKCFkeCYmIWR5KXRocm93IG5ldyBFcnJvcigiTm90IHBvc3NpYmxlIHRvIGZpbmQgaW50ZXJzZWN0aW9uIGluc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIik7dmFyIHN4LHN5O2lmKE1hdGguYWJzKGR5KSp3Pk1hdGguYWJzKGR4KSpoKXtpZihkeTwwKWg9LWg7c3g9aCpkeC9keTtzeT1ofWVsc2V7aWYoZHg8MCl3PS13O3N4PXc7c3k9dypkeS9keH1yZXR1cm57eDp4KwpzeCx5Onkrc3l9fWZ1bmN0aW9uIGJ1aWxkTGF5ZXJNYXRyaXgoZyl7dmFyIGxheWVyaW5nPV8ubWFwKF8ucmFuZ2UobWF4UmFuayhnKSsxKSxmdW5jdGlvbigpe3JldHVybltdfSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodikscmFuaz1ub2RlLnJhbms7aWYoIV8uaXNVbmRlZmluZWQocmFuaykpbGF5ZXJpbmdbcmFua11bbm9kZS5vcmRlcl09dn0pO3JldHVybiBsYXllcmluZ31mdW5jdGlvbiBub3JtYWxpemVSYW5rcyhnKXt2YXIgbWluPV8ubWluQnkoXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihfLmhhcyhub2RlLCJyYW5rIikpbm9kZS5yYW5rLT1taW59KX1mdW5jdGlvbiByZW1vdmVFbXB0eVJhbmtzKGcpe3ZhciBvZmZzZXQ9Xy5taW5CeShfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSkpOwp2YXIgbGF5ZXJzPVtdO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHJhbms9Zy5ub2RlKHYpLnJhbmstb2Zmc2V0O2lmKCFsYXllcnNbcmFua10pbGF5ZXJzW3JhbmtdPVtdO2xheWVyc1tyYW5rXS5wdXNoKHYpfSk7dmFyIGRlbHRhPTAsbm9kZVJhbmtGYWN0b3I9Zy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yO18uZm9yRWFjaChsYXllcnMsZnVuY3Rpb24odnMsaSl7aWYoXy5pc1VuZGVmaW5lZCh2cykmJmklbm9kZVJhbmtGYWN0b3IhPT0wKS0tZGVsdGE7ZWxzZSBpZihkZWx0YSlfLmZvckVhY2godnMsZnVuY3Rpb24odil7Zy5ub2RlKHYpLnJhbmsrPWRlbHRhfSl9KX1mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcscHJlZml4LHJhbmssb3JkZXIpe3ZhciBub2RlPXt3aWR0aDowLGhlaWdodDowfTtpZihhcmd1bWVudHMubGVuZ3RoPj00KXtub2RlLnJhbms9cmFuaztub2RlLm9yZGVyPW9yZGVyfXJldHVybiBhZGREdW1teU5vZGUoZywiYm9yZGVyIixub2RlLHByZWZpeCl9CmZ1bmN0aW9uIG1heFJhbmsoZyl7cmV0dXJuIF8ubWF4KF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgcmFuaz1nLm5vZGUodikucmFuaztpZighXy5pc1VuZGVmaW5lZChyYW5rKSlyZXR1cm4gcmFua30pKX1mdW5jdGlvbiBwYXJ0aXRpb24oY29sbGVjdGlvbixmbil7dmFyIHJlc3VsdD17bGhzOltdLHJoczpbXX07Xy5mb3JFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUpe2lmKGZuKHZhbHVlKSlyZXN1bHQubGhzLnB1c2godmFsdWUpO2Vsc2UgcmVzdWx0LnJocy5wdXNoKHZhbHVlKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdGltZShuYW1lLGZuKXt2YXIgc3RhcnQ9Xy5ub3coKTt0cnl7cmV0dXJuIGZuKCl9ZmluYWxseXtjb25zb2xlLmxvZyhuYW1lKyIgdGltZTogIisoXy5ub3coKS1zdGFydCkrIm1zIil9fWZ1bmN0aW9uIG5vdGltZShuYW1lLGZuKXtyZXR1cm4gZm4oKX19LHsiLi9ncmFwaGxpYiI6NywiLi9sb2Rhc2giOjEwfV0sMzA6W2Z1bmN0aW9uKHJlcXVpcmUsCm1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz0iMC44LjIifSx7fV19LHt9LFsxXSkoMSl9KTsKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9hbm5vdGF0aW9uLmpzCnZhciB0ZjsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7KGZ1bmN0aW9uKGgpe2Z1bmN0aW9uIGsocSl7cmV0dXJuKGQucmVuZGVyLkFubm90YXRpb25UeXBlW3FdfHwiIikudG9Mb3dlckNhc2UoKXx8bnVsbH1mdW5jdGlvbiB0KHEsdSl7dS5hbm5vdGF0aW9uVHlwZT09PWQucmVuZGVyLkFubm90YXRpb25UeXBlLlNVTU1BUlk/Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKHEsInVzZSIpLmF0dHIoImNsYXNzIiwic3VtbWFyeSIpLmF0dHIoInhsaW5rOmhyZWYiLCIjc3VtbWFyeS1pY29uIikuYXR0cigiY3Vyc29yIiwicG9pbnRlciIpOihxPWYubm9kZS5idWlsZFNoYXBlKHEsdSxmLkNsYXNzLkFubm90YXRpb24uTk9ERSksZi5zZWxlY3RPckNyZWF0ZUNoaWxkKHEsInRpdGxlIikudGV4dCh1Lm5vZGUubmFtZSkpfWZ1bmN0aW9uIGwocSx1KXtsZXQgeD11Lm5vZGUubmFtZS5zcGxpdCgiLyIpO3JldHVybiBwKHEseFt4Lmxlbmd0aC0xXSx1LG51bGwpfWZ1bmN0aW9uIHAocSx1LAp4LEEpe2xldCB5PWYuQ2xhc3MuQW5ub3RhdGlvbi5MQUJFTDtBJiYoeSs9IiAiK0EpO3E9cS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIseSkuYXR0cigiZHkiLCIuMzVlbSIpLmF0dHIoInRleHQtYW5jaG9yIix4LmlzSW4/ImVuZCI6InN0YXJ0IikudGV4dCh1KTtyZXR1cm4gYi5ncmFwaC5zY2VuZS5ub2RlLmVuZm9yY2VMYWJlbFdpZHRoKHEsLTEpfWZ1bmN0aW9uIG0ocSx1LHgsQSl7cS5vbigibW91c2VvdmVyIix5PT57QS5maXJlKCJhbm5vdGF0aW9uLWhpZ2hsaWdodCIse25hbWU6eS5ub2RlLm5hbWUsaG9zdE5hbWU6dS5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW91dCIseT0+e0EuZmlyZSgiYW5ub3RhdGlvbi11bmhpZ2hsaWdodCIse25hbWU6eS5ub2RlLm5hbWUsaG9zdE5hbWU6dS5ub2RlLm5hbWV9KX0pLm9uKCJjbGljayIseT0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO0EuZmlyZSgiYW5ub3RhdGlvbi1zZWxlY3QiLHtuYW1lOnkubm9kZS5uYW1lLGhvc3ROYW1lOnUubm9kZS5uYW1lfSl9KTsKaWYoeC5hbm5vdGF0aW9uVHlwZSE9PWQucmVuZGVyLkFubm90YXRpb25UeXBlLlNVTU1BUlkmJnguYW5ub3RhdGlvblR5cGUhPT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5DT05TVEFOVClxLm9uKCJjb250ZXh0bWVudSIsZi5jb250ZXh0bWVudS5nZXRNZW51KEEsZi5ub2RlLmdldENvbnRleHRNZW51KHgubm9kZSxBKSkpfWZ1bmN0aW9uIG4ocSx1LHgsQSl7bGV0IHk9ZC5sYXlvdXQuY29tcHV0ZUNYUG9zaXRpb25PZk5vZGVTaGFwZSh1KTt4LnJlbmRlck5vZGVJbmZvJiZ4LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuRUxMSVBTSVMmJmYubm9kZS5zdHlsaXplKHEseC5yZW5kZXJOb2RlSW5mbyxBLGYuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKTt4LmFubm90YXRpb25UeXBlPT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWSYmKHgud2lkdGgrPTEwKTtxLnNlbGVjdCgidGV4dC4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5MQUJFTCkudHJhbnNpdGlvbigpLmF0dHIoIngiLAp5K3guZHgrKHguaXNJbj8tMToxKSooeC53aWR0aC8yK3gubGFiZWxPZmZzZXQpKS5hdHRyKCJ5Iix1LnkreC5keSk7cS5zZWxlY3QoInVzZS5zdW1tYXJ5IikudHJhbnNpdGlvbigpLmF0dHIoIngiLHkreC5keC0zKS5hdHRyKCJ5Iix1LnkreC5keS02KTtmLnBvc2l0aW9uRWxsaXBzZShxLnNlbGVjdCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLk5PREUrIiBlbGxpcHNlIikseSt4LmR4LHUueSt4LmR5LHgud2lkdGgseC5oZWlnaHQpO2YucG9zaXRpb25SZWN0KHEuc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uTk9ERSsiIHJlY3QiKSx5K3guZHgsdS55K3guZHkseC53aWR0aCx4LmhlaWdodCk7Zi5wb3NpdGlvblJlY3QocS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKyIgdXNlIikseSt4LmR4LHUueSt4LmR5LHgud2lkdGgseC5oZWlnaHQpO3Euc2VsZWN0KCJwYXRoLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLkVER0UpLnRyYW5zaXRpb24oKS5hdHRyKCJkIix3PT4Ke3c9dy5wb2ludHMubWFwKEM9Pih7eDpDLmR4K3kseTpDLmR5K3UueX0pKTtyZXR1cm4gZi5lZGdlLmludGVycG9sYXRlKHcpfSl9aC5idWlsZEdyb3VwPWZ1bmN0aW9uKHEsdSx4LEEpe3E9cS5zZWxlY3RBbGwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzfSkuZGF0YSh1Lmxpc3QseT0+eS5ub2RlLm5hbWUpO3EuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJkYXRhLW5hbWUiLHk9Pnkubm9kZS5uYW1lKS5lYWNoKGZ1bmN0aW9uKHkpe2xldCB3PWQzLnNlbGVjdCh0aGlzKTtBLmFkZEFubm90YXRpb25Hcm91cCh5LHgsdyk7bGV0IEM9Zi5DbGFzcy5Bbm5vdGF0aW9uLkVER0UsRz15LnJlbmRlck1ldGFlZGdlSW5mbyYmeS5yZW5kZXJNZXRhZWRnZUluZm8ubWV0YWVkZ2U7RyYmIUcubnVtUmVndWxhckVkZ2VzJiYoQys9IiAiK2YuQ2xhc3MuQW5ub3RhdGlvbi5DT05UUk9MX0VER0UpO0cmJkcubnVtUmVmRWRnZXMmJihDKz0iICIrZi5DbGFzcy5FZGdlLlJFRl9MSU5FKTsKZi5lZGdlLmFwcGVuZEVkZ2Uodyx5LEEsQyk7eS5hbm5vdGF0aW9uVHlwZSE9PWQucmVuZGVyLkFubm90YXRpb25UeXBlLkVMTElQU0lTPyhsKHcseSksdCh3LHkpKTpwKHcseS5ub2RlLm5hbWUseSxmLkNsYXNzLkFubm90YXRpb24uRUxMSVBTSVMpfSkubWVyZ2UocSkuYXR0cigiY2xhc3MiLHk9PmYuQ2xhc3MuQW5ub3RhdGlvbi5HUk9VUCsiICIrayh5LmFubm90YXRpb25UeXBlKSsiICIrZi5ub2RlLm5vZGVDbGFzcyh5KSkuZWFjaChmdW5jdGlvbih5KXtsZXQgdz1kMy5zZWxlY3QodGhpcyk7bih3LHgseSxBKTt5LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuRUxMSVBTSVMmJm0odyx4LHksQSl9KTtxLmV4aXQoKS5lYWNoKGZ1bmN0aW9uKHkpe2xldCB3PWQzLnNlbGVjdCh0aGlzKTtBLnJlbW92ZUFubm90YXRpb25Hcm91cCh5LHgsdyl9KS5yZW1vdmUoKTtyZXR1cm4gcX19KShmLmFubm90YXRpb258fChmLmFubm90YXRpb249e30pKX0pKGQuc2NlbmV8fAooZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vY29sb3JzLmpzCihmdW5jdGlvbihiKXtiLkNPTE9SUz1be25hbWU6Ikdvb2dsZSBCbHVlIixjb2xvcjoiIzQxODRmMyIsYWN0aXZlOiIjM2E1M2M1IixkaXNhYmxlZDoiI2NhZDhmYyJ9LHtuYW1lOiJHb29nbGUgUmVkIixjb2xvcjoiI2RiNDQzNyIsYWN0aXZlOiIjOGYyYTBjIixkaXNhYmxlZDoiI2U4YzZjMSJ9LHtuYW1lOiJHb29nbGUgWWVsbG93Iixjb2xvcjoiI2Y0YjQwMCIsYWN0aXZlOiIjZGI5MjAwIixkaXNhYmxlZDoiI2Y3ZThiMCJ9LHtuYW1lOiJHb29nbGUgR3JlZW4iLGNvbG9yOiIjMGY5ZDU4IixhY3RpdmU6IiM0ODgwNDYiLGRpc2FibGVkOiIjYzJlMWNjIn0se25hbWU6IlB1cnBsZSIsY29sb3I6IiNhYTQ2YmIiLGFjdGl2ZToiIzVjMTM5OCIsZGlzYWJsZWQ6IiNkN2JjZTYifSx7bmFtZToiVGVhbCIsY29sb3I6IiMwMGFiYzAiLGFjdGl2ZToiIzQ3ODI4ZSIsZGlzYWJsZWQ6IiNjMmVhZjIifSx7bmFtZToiRGVlcCBPcmFuZ2UiLGNvbG9yOiIjZmY2ZjQyIixhY3RpdmU6IiNjYTRhMDYiLApkaXNhYmxlZDoiI2YyY2JiYSJ9LHtuYW1lOiJMaW1lIixjb2xvcjoiIzlkOWMyMyIsYWN0aXZlOiIjN2Y3NzFkIixkaXNhYmxlZDoiI2YxZjRjMiJ9LHtuYW1lOiJJbmRpZ28iLGNvbG9yOiIjNWI2YWJmIixhY3RpdmU6IiMzZTQ3YTkiLGRpc2FibGVkOiIjYzVjOGU4In0se25hbWU6IlBpbmsiLGNvbG9yOiIjZWY2MTkxIixhY3RpdmU6IiNjYTFjNjAiLGRpc2FibGVkOiIjZTliOWNlIn0se25hbWU6IkRlZXAgVGVhbCIsY29sb3I6IiMwMDc4NmEiLGFjdGl2ZToiIzJiNGY0MyIsZGlzYWJsZWQ6IiNiZWRlZGEifSx7bmFtZToiRGVlcCBQaW5rIixjb2xvcjoiI2MxMTc1YSIsYWN0aXZlOiIjNzUwODRmIixkaXNhYmxlZDoiI2RlOGNhZSJ9LHtuYW1lOiJHcmF5Iixjb2xvcjoiIzlFOUU5RSIsYWN0aXZlOiIjNDI0MjQyIixkaXNhYmxlZDoiRjVGNUY1In1dLnJlZHVjZSgoZCxmKT0+e2RbZi5uYW1lXT1mO3JldHVybiBkfSx7fSk7Yi5PUF9HUk9VUF9DT0xPUlM9W3tjb2xvcjoiR29vZ2xlIFJlZCIsCmdyb3VwczoiZ2VuX2xlZ2FjeV9vcHMgbGVnYWN5X29wcyBsZWdhY3lfZmxvZ3NfaW5wdXQgbGVnYWN5X2ltYWdlX2lucHV0IGxlZ2FjeV9pbnB1dF9leGFtcGxlX2lucHV0IGxlZ2FjeV9zZXF1ZW5jZV9pbnB1dCBsZWdhY3lfc2V0aV9pbnB1dF9pbnB1dCIuc3BsaXQoIiAiKX0se2NvbG9yOiJEZWVwIE9yYW5nZSIsZ3JvdXBzOlsiY29uc3RhbnRfb3BzIl19LHtjb2xvcjoiSW5kaWdvIixncm91cHM6WyJzdGF0ZV9vcHMiXX0se2NvbG9yOiJQdXJwbGUiLGdyb3VwczpbIm5uX29wcyIsIm5uIl19LHtjb2xvcjoiR29vZ2xlIEdyZWVuIixncm91cHM6WyJtYXRoX29wcyJdfSx7Y29sb3I6IkxpbWUiLGdyb3VwczpbImFycmF5X29wcyJdfSx7Y29sb3I6IlRlYWwiLGdyb3VwczpbImNvbnRyb2xfZmxvd19vcHMiLCJkYXRhX2Zsb3dfb3BzIl19LHtjb2xvcjoiUGluayIsZ3JvdXBzOlsic3VtbWFyeV9vcHMiXX0se2NvbG9yOiJEZWVwIFBpbmsiLGdyb3VwczpbImlvX29wcyJdfV0ucmVkdWNlKChkLApmKT0+e2YuZ3JvdXBzLmZvckVhY2goZnVuY3Rpb24oaCl7ZFtoXT1mLmNvbG9yfSk7cmV0dXJuIGR9LHt9KX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vY29tbW9uLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2YuT1BfR1JBUEg9Im9wX2dyYXBoIjtmLkNPTkNFUFRVQUxfR1JBUEg9ImNvbmNlcHR1YWxfZ3JhcGgiO2YuUFJPRklMRT0icHJvZmlsZSJ9KShkLlNlbGVjdGlvblR5cGV8fChkLlNlbGVjdGlvblR5cGU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2NvbnRleHRtZW51LmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpeyhmdW5jdGlvbihoKXtmdW5jdGlvbiBrKHQpe2xldCBsPTAscD0wO2Zvcig7dCYmMDw9dC5vZmZzZXRMZWZ0JiYwPD10Lm9mZnNldFRvcDspbCs9dC5vZmZzZXRMZWZ0LXQuc2Nyb2xsTGVmdCxwKz10Lm9mZnNldFRvcC10LnNjcm9sbFRvcCx0PXQub2Zmc2V0UGFyZW50O3JldHVybntsZWZ0OmwsdG9wOnB9fWguZ2V0TWVudT1mdW5jdGlvbih0LGwpe2NvbnN0IHA9dC5nZXRDb250ZXh0TWVudSgpLG09ZDMuc2VsZWN0KHQuZ2V0Q29udGV4dE1lbnUoKSk7cmV0dXJuIGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSh5KXt5JiZ5LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKHApfHwobS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKSxkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdSx7Y2FwdHVyZTohMH0pKX1sZXQgeD1kMy5ldmVudDtjb25zdCBBPWsodCk7bS5zdHlsZSgiZGlzcGxheSIsImJsb2NrIikuc3R5bGUoImxlZnQiLAp4LmNsaWVudFgtQS5sZWZ0KzErInB4Iikuc3R5bGUoInRvcCIseC5jbGllbnRZLUEudG9wKzErInB4Iik7eC5wcmV2ZW50RGVmYXVsdCgpO3guc3RvcFByb3BhZ2F0aW9uKCk7ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHUse2NhcHR1cmU6ITB9KTttLmh0bWwoIiIpO20uYXBwZW5kKCJ1bCIpLnNlbGVjdEFsbCgibGkiKS5kYXRhKGwpLmVudGVyKCkuYXBwZW5kKCJsaSIpLm9uKCJjbGljayIseT0+e3kuYWN0aW9uKHRoaXMsbixxKTt1KCl9KS5odG1sKGZ1bmN0aW9uKHkpe3JldHVybiB5LnRpdGxlKG4pfSl9fX0pKGYuY29udGV4dG1lbnV8fChmLmNvbnRleHRtZW51PXt9KSl9KShkLnNjZW5lfHwoZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vZWRnZS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXsoZnVuY3Rpb24oaCl7ZnVuY3Rpb24gayh5KXtyZXR1cm4geS52K2QuRURHRV9LRVlfREVMSU0reS53fWZ1bmN0aW9uIHQoeSx3KXt3PXcuZ2V0Tm9kZUJ5TmFtZSh5LnYpO2lmKG51bGw9PXcub3V0cHV0U2hhcGVzfHxfLmlzRW1wdHkody5vdXRwdXRTaGFwZXMpKXJldHVybiBudWxsO3k9dy5vdXRwdXRTaGFwZXNbeS5vdXRwdXRUZW5zb3JLZXldO3JldHVybiBudWxsPT15P251bGw6MD09PXkubGVuZ3RoPyJzY2FsYXIiOnkubWFwKEM9Pi0xPT09Qz8iPyI6Qykuam9pbigiXHUwMGQ3Iil9ZnVuY3Rpb24gbCh5LHcpe3JldHVybiB3LmVkZ2VMYWJlbEZ1bmN0aW9uP3cuZWRnZUxhYmVsRnVuY3Rpb24oeSx3KToxPHkuYmFzZUVkZ2VMaXN0Lmxlbmd0aD95LmJhc2VFZGdlTGlzdC5sZW5ndGgrIiB0ZW5zb3JzIjp0KHkuYmFzZUVkZ2VMaXN0WzBdLHcpfWZ1bmN0aW9uIHAoeSx3LEMpe2NvbnN0IEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGIuZ3JhcGguc2NlbmUuU1ZHX05BTUVTUEFDRSwKInBhdGgiKTtmb3IobGV0IEQ9MTtEPHkubGVuZ3RoO0QrKylpZihHLnNldEF0dHJpYnV0ZSgiZCIsQyh5LnNsaWNlKDAsRCkpKSxHLmdldFRvdGFsTGVuZ3RoKCk+dylyZXR1cm4gRC0xO3JldHVybiB5Lmxlbmd0aC0xfWZ1bmN0aW9uIG0oeSx3LEMpe3ZhciBHPWQzLmxpbmUoKS54KE49Pk4ueCkueShOPT5OLnkpLEQ9ZDMuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJwYXRoIikpLmF0dHIoImQiLEcoeSkpLEI9K3cuYXR0cigibWFya2VyV2lkdGgiKSxJPXcuYXR0cigidmlld0JveCIpLnNwbGl0KCIgIikubWFwKE51bWJlcik7ST1JWzJdLUlbMF07dz0rdy5hdHRyKCJyZWZYIik7RD1ELm5vZGUoKTtpZihDKXJldHVybiBCKj0xLXcvSSxDPUQuZ2V0UG9pbnRBdExlbmd0aChCKSxHPXAoeSxCLEcpLHlbRy0xXT17eDpDLngseTpDLnl9LHkuc2xpY2UoRy0xKTtDPTEtdy9JO0I9RC5nZXRUb3RhbExlbmd0aCgpLUIqQztDPQpELmdldFBvaW50QXRMZW5ndGgoQik7Rz1wKHksQixHKTt5W0ddPXt4OkMueCx5OkMueX07cmV0dXJuIHkuc2xpY2UoMCxHKzEpfWZ1bmN0aW9uIG4oeSx3LEMsRyl7Rz1HfHxmLkNsYXNzLkVkZ2UuTElORTt3LmxhYmVsJiZ3LmxhYmVsLnN0cnVjdHVyYWwmJihHKz0iICIrZi5DbGFzcy5FZGdlLlNUUlVDVFVSQUwpO3cubGFiZWwmJncubGFiZWwubWV0YWVkZ2UmJncubGFiZWwubWV0YWVkZ2UubnVtUmVmRWRnZXMmJihHKz0iICIrZi5DbGFzcy5FZGdlLlJFRkVSRU5DRV9FREdFKTtDLmhhbmRsZUVkZ2VTZWxlY3RlZCYmKEcrPSIgIitmLkNsYXNzLkVkZ2UuU0VMRUNUQUJMRSk7bGV0IEQ9InBhdGhfIitrKHcpO2lmKEMucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKXZhciBCPUMucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKHcsRyk7ZWxzZSBCPTEsbnVsbCE9dy5sYWJlbCYmbnVsbCE9dy5sYWJlbC5tZXRhZWRnZSYmKEI9dy5sYWJlbC5tZXRhZWRnZS50b3RhbFNpemUpLApCPUMucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZShCKTtHPXkuYXBwZW5kKCJwYXRoIikuYXR0cigiaWQiLEQpLmF0dHIoImNsYXNzIixHKS5zdHlsZSgic3Ryb2tlLXdpZHRoIixCKyJweCIpO3cubGFiZWwmJncubGFiZWwubWV0YWVkZ2UmJih3LmxhYmVsLm1ldGFlZGdlLm51bVJlZkVkZ2VzPyhCPWByZWZlcmVuY2UtYXJyb3doZWFkLSR7QShCKX1gLEcuc3R5bGUoIm1hcmtlci1zdGFydCIsYHVybCgjJHtCfSlgKSx3LmxhYmVsLnN0YXJ0TWFya2VySWQ9Qik6KEI9YGRhdGFmbG93LWFycm93aGVhZC0ke0EoQil9YCxHLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke0J9KWApLHcubGFiZWwuZW5kTWFya2VySWQ9QikpO251bGwhPXcubGFiZWwmJm51bGwhPXcubGFiZWwubWV0YWVkZ2UmJih3PWwody5sYWJlbC5tZXRhZWRnZSxDLnJlbmRlckhpZXJhcmNoeSksbnVsbCE9dyYmeS5hcHBlbmQoInRleHQiKS5hcHBlbmQoInRleHRQYXRoIikuYXR0cigieGxpbms6aHJlZiIsCiIjIitEKS5hdHRyKCJzdGFydE9mZnNldCIsIjUwJSIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigiZG9taW5hbnQtYmFzZWxpbmUiLCJjZW50cmFsIikudGV4dCh3KSl9ZnVuY3Rpb24gcSh5LHcsQyxHLEQpe0c9Qy5sYWJlbDtsZXQgQj1HLmFkam9pbmluZ01ldGFlZGdlLEk9Ry5wb2ludHM7eT15LnNoYWRvd1Jvb3Q7Qy5sYWJlbC5zdGFydE1hcmtlcklkJiYoST1tKEksZDMuc2VsZWN0KHkucXVlcnlTZWxlY3RvcigiIyIrQy5sYWJlbC5zdGFydE1hcmtlcklkKSksITApKTtDLmxhYmVsLmVuZE1hcmtlcklkJiYoST1tKEksZDMuc2VsZWN0KHkucXVlcnlTZWxlY3RvcigiIyIrQy5sYWJlbC5lbmRNYXJrZXJJZCkpLCExKSk7aWYoIUIpcmV0dXJuIGQzLmludGVycG9sYXRlKEQsaC5pbnRlcnBvbGF0ZShJKSk7bGV0IE49Qi5lZGdlR3JvdXAubm9kZSgpLmZpcnN0Q2hpbGQsTz1HLm1ldGFlZGdlLmluYm91bmQ7cmV0dXJuIGZ1bmN0aW9uKCl7bGV0IEg9Ti5nZXRQb2ludEF0TGVuZ3RoKE8/Ck4uZ2V0VG90YWxMZW5ndGgoKTowKS5tYXRyaXhUcmFuc2Zvcm0oTi5nZXRDVE0oKSkubWF0cml4VHJhbnNmb3JtKHcuZ2V0Q1RNKCkuaW52ZXJzZSgpKSxLPU8/MDpJLmxlbmd0aC0xO0lbS10ueD1ILng7SVtLXS55PUgueTtyZXR1cm4gaC5pbnRlcnBvbGF0ZShJKX19ZnVuY3Rpb24gdSh5LHcpe2QzLnNlbGVjdCh3KS5zZWxlY3QoInBhdGguIitmLkNsYXNzLkVkZ2UuTElORSkudHJhbnNpdGlvbigpLmF0dHJUd2VlbigiZCIsZnVuY3Rpb24oQyxHLEQpe3JldHVybiBxKHksdGhpcyxDLEcsRCl9KX1mdW5jdGlvbiB4KHksdyl7eS5jbGFzc2VkKCJmYWRlZCIsdy5sYWJlbC5pc0ZhZGVkT3V0KTt3PXcubGFiZWwubWV0YWVkZ2U7eS5zZWxlY3QoInBhdGguIitmLkNsYXNzLkVkZ2UuTElORSkuY2xhc3NlZCgiY29udHJvbC1kZXAiLHcmJiF3Lm51bVJlZ3VsYXJFZGdlcyl9aC5NSU5fRURHRV9XSURUSD0uNzU7aC5NQVhfRURHRV9XSURUSD0xMjtoLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRT0KZDMuc2NhbGVQb3coKS5leHBvbmVudCguMykuZG9tYWluKFsxLDVFNl0pLnJhbmdlKFtoLk1JTl9FREdFX1dJRFRILGguTUFYX0VER0VfV0lEVEhdKS5jbGFtcCghMCk7bGV0IEE9ZDMuc2NhbGVRdWFudGl6ZSgpLmRvbWFpbihbaC5NSU5fRURHRV9XSURUSCxoLk1BWF9FREdFX1dJRFRIXSkucmFuZ2UoWyJzbWFsbCIsIm1lZGl1bSIsImxhcmdlIiwieGxhcmdlIl0pO2guZ2V0RWRnZUtleT1rO2guYnVpbGRHcm91cD1mdW5jdGlvbih5LHcsQyl7bGV0IEc9W107Rz1fLnJlZHVjZSh3LmVkZ2VzKCksKEQsQik9PntsZXQgST13LmVkZ2UoQik7RC5wdXNoKHt2OkIudix3OkIudyxsYWJlbDpJfSk7cmV0dXJuIER9LEcpO3k9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKHksImciLGYuQ2xhc3MuRWRnZS5DT05UQUlORVIpLnNlbGVjdEFsbChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KS5kYXRhKEcsayk7eS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIixmLkNsYXNzLkVkZ2UuR1JPVVApLmF0dHIoImRhdGEtZWRnZSIsCmspLmVhY2goZnVuY3Rpb24oRCl7bGV0IEI9ZDMuc2VsZWN0KHRoaXMpO0QubGFiZWwuZWRnZUdyb3VwPUI7Qy5fZWRnZUdyb3VwSW5kZXhbayhEKV09QjtpZihDLmhhbmRsZUVkZ2VTZWxlY3RlZClCLm9uKCJjbGljayIsST0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO0MuZmlyZSgiZWRnZS1zZWxlY3QiLHtlZGdlRGF0YTpJLGVkZ2VHcm91cDpCfSl9KTtuKEIsRCxDKX0pLm1lcmdlKHkpLmVhY2goZnVuY3Rpb24oKXt1KEMsdGhpcyl9KS5lYWNoKGZ1bmN0aW9uKEQpe3goZDMuc2VsZWN0KHRoaXMpLEQsQyl9KTt5LmV4aXQoKS5lYWNoKEQ9PntkZWxldGUgQy5fZWRnZUdyb3VwSW5kZXhbayhEKV19KS5yZW1vdmUoKTtyZXR1cm4geX07aC5nZXRMYWJlbEZvckJhc2VFZGdlPXQ7aC5nZXRMYWJlbEZvckVkZ2U9bDtoLmFwcGVuZEVkZ2U9bjtoLmludGVycG9sYXRlPWQzLmxpbmUoKS5jdXJ2ZShkMy5jdXJ2ZUJhc2lzKS54KHk9PnkueCkueSh5PT55LnkpfSkoZi5lZGdlfHwoZi5lZGdlPQp7fSkpfSkoZC5zY2VuZXx8KGQuc2NlbmU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2V4dGVybnMuanMKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vZ3JhcGguanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKEgsSyxNLEwsUSl7cmV0dXJuKE0/TSsiLyI6IiIpKyhIKygidW5kZWZpbmVkIiE9PXR5cGVvZiBMJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBRPyJbIitMKyItIitRKyJdIjoiIyIpK0spfWZ1bmN0aW9uIGgoSCl7aWYoIUgpcmV0dXJuIG51bGw7Zm9yKGxldCBLPTA7SzxILmxlbmd0aDtLKyspe2xldCB7a2V5Ok0sdmFsdWU6TH09SFtLXTtpZigiX291dHB1dF9zaGFwZXMiPT09TSl7aWYoIUwubGlzdC5zaGFwZSlicmVhaztsZXQgUT1MLmxpc3Quc2hhcGUubWFwKFQ9PlQudW5rbm93bl9yYW5rP251bGw6bnVsbD09VC5kaW18fDE9PT1ULmRpbS5sZW5ndGgmJm51bGw9PVQuZGltWzBdLnNpemU/W106VC5kaW0ubWFwKFg9Plguc2l6ZSkpO0guc3BsaWNlKEssMSk7cmV0dXJuIFF9fXJldHVybiBudWxsfWZ1bmN0aW9uIGsoSCl7aWYoIUgpcmV0dXJuIG51bGw7Zm9yKGxldCBLPTA7SzxILmxlbmd0aDtLKyspaWYoIl9YbGFDbHVzdGVyIj09PQpIW0tdLmtleSlyZXR1cm4gSFtLXS52YWx1ZS5zfHxudWxsO3JldHVybiBudWxsfWZ1bmN0aW9uIHQoSCl7bGV0IEs9W107Xy5lYWNoKEgsTT0+e2xldCBMPSJeIj09PU1bMF07TCYmKE09TS5zdWJzdHJpbmcoMSkpO2xldCBRPU0sVD0iMCIsWD1NLm1hdGNoKC8oLiopOihcdys6XGQrKSQvKTtpZihYKVE9WFsxXSxUPVhbMl07ZWxzZSBpZihYPU0ubWF0Y2goLyguKik6KFxkKykkLykpUT1YWzFdLFQ9WFsyXTswIT09Sy5sZW5ndGgmJlE9PT1LW0subGVuZ3RoLTFdLm5hbWV8fEsucHVzaCh7bmFtZTpRLG91dHB1dFRlbnNvcktleTpULGlzQ29udHJvbERlcGVuZGVuY3k6TH0pfSk7cmV0dXJuIEt9ZnVuY3Rpb24gbChILEssTSxMLFEsVCl7SyE9PU0ubmFtZSYmSC5lZGdlcy5wdXNoKHt2OkssdzpNLm5hbWUsb3V0cHV0VGVuc29yS2V5Okwub3V0cHV0VGVuc29yS2V5LGlzQ29udHJvbERlcGVuZGVuY3k6TC5pc0NvbnRyb2xEZXBlbmRlbmN5LGlzUmVmZXJlbmNlRWRnZTohMD09PVEucmVmRWRnZXNbTS5vcCsKIiAiK1RdfSl9ZnVuY3Rpb24gcChILEssTSl7TT1NfHx7fTtsZXQgTD1uZXcgZ3JhcGhsaWIuR3JhcGgoTSk7TC5zZXRHcmFwaCh7bmFtZTpILHJhbmtkaXI6TS5yYW5rZGlyfHwiQlQiLHR5cGU6S30pO3JldHVybiBMfWZ1bmN0aW9uIG0oSCl7cmV0dXJuIGZ1bmN0aW9uKEspe2ZvcihsZXQgTT0wO008SC5sZW5ndGg7TSsrKXtsZXQgTD1uZXcgUmVnRXhwKEhbTV0pO2lmKCJzdHJpbmciPT09dHlwZW9mIEsub3AmJksub3AubWF0Y2goTCkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIG4oSCl7bGV0IEs9SC5zcGxpdChkLk5BTUVTUEFDRV9ERUxJTSk7cmV0dXJuIEgrZC5OQU1FU1BBQ0VfREVMSU0rIigiK0tbSy5sZW5ndGgtMV0rIikifWZ1bmN0aW9uIHEoSCxLKXtsZXQgTT17fSxMPXt9O0guc29ydCgpO2ZvcihsZXQgUT0wO1E8SC5sZW5ndGgtMTsrK1Epe2xldCBUPUhbUV07Xy5lYWNoKHgoVCkuc2xpY2UoMCwtMSksWD0+e0xbWF09ITB9KTtmb3IobGV0IFg9USsxO1g8SC5sZW5ndGg7KytYKXtsZXQgYWE9CkhbWF07aWYoXy5zdGFydHNXaXRoKGFhLFQpKXtpZihhYS5sZW5ndGg+VC5sZW5ndGgmJmFhLmNoYXJBdChULmxlbmd0aCk9PT1kLk5BTUVTUEFDRV9ERUxJTSl7TVtUXT1uKFQpO2JyZWFrfX1lbHNlIGJyZWFrfX1fLmVhY2goSyxRPT57USBpbiBMJiYoTVtRXT1uKFEpKX0pO3JldHVybiBNfWZ1bmN0aW9uIHUoSCl7bGV0IEs9SC5ub2RlcygpLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gSC5uZWlnaGJvcnMoTSkubGVuZ3RofSk7Sy5zb3J0KCk7cmV0dXJuIEt9ZnVuY3Rpb24geChILEspe2xldCBNPVtdLEw9SC5pbmRleE9mKGQuTkFNRVNQQUNFX0RFTElNKTtmb3IoOzA8PUw7KU0ucHVzaChILnN1YnN0cmluZygwLEwpKSxMPUguaW5kZXhPZihkLk5BTUVTUEFDRV9ERUxJTSxMKzEpO0smJihLPUtbSF0pJiZNLnB1c2goSyk7TS5wdXNoKEgpO3JldHVybiBNfWQuTkFNRVNQQUNFX0RFTElNPSIvIjtkLlJPT1RfTkFNRT0iX19yb290X18iO2QuRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWD0KIl9fZnVuY3Rpb25fbGlicmFyeV9fIjtkLkxBUkdFX0FUVFJTX0tFWT0iX3Rvb19sYXJnZV9hdHRycyI7ZC5MSU1JVF9BVFRSX1NJWkU9MTAyNDtkLkVER0VfS0VZX0RFTElNPSItLSI7bGV0IEE7KGZ1bmN0aW9uKEgpe0hbSC5GVUxMPTBdPSJGVUxMIjtIW0guRU1CRURERUQ9MV09IkVNQkVEREVEIjtIW0guTUVUQT0yXT0iTUVUQSI7SFtILlNFUklFUz0zXT0iU0VSSUVTIjtIW0guQ09SRT00XT0iQ09SRSI7SFtILlNIQURPVz01XT0iU0hBRE9XIjtIW0guQlJJREdFPTZdPSJCUklER0UiO0hbSC5FREdFPTddPSJFREdFIn0pKEE9ZC5HcmFwaFR5cGV8fChkLkdyYXBoVHlwZT17fSkpO2xldCB5OyhmdW5jdGlvbihIKXtIW0guTUVUQT0wXT0iTUVUQSI7SFtILk9QPTFdPSJPUCI7SFtILlNFUklFUz0yXT0iU0VSSUVTIjtIW0guQlJJREdFPTNdPSJCUklER0UiO0hbSC5FTExJUFNJUz00XT0iRUxMSVBTSVMifSkoeT1kLk5vZGVUeXBlfHwoZC5Ob2RlVHlwZT17fSkpO2xldCB3OyhmdW5jdGlvbihIKXtIW0guSU5DTFVERT0KMF09IklOQ0xVREUiO0hbSC5FWENMVURFPTFdPSJFWENMVURFIjtIW0guVU5TUEVDSUZJRUQ9Ml09IlVOU1BFQ0lGSUVEIn0pKHc9ZC5JbmNsdXNpb25UeXBlfHwoZC5JbmNsdXNpb25UeXBlPXt9KSk7KGZ1bmN0aW9uKEgpe0hbSC5HUk9VUD0wXT0iR1JPVVAiO0hbSC5VTkdST1VQPTFdPSJVTkdST1VQIn0pKGQuU2VyaWVzR3JvdXBpbmdUeXBlfHwoZC5TZXJpZXNHcm91cGluZ1R5cGU9e30pKTtjbGFzcyBDe2NvbnN0cnVjdG9yKCl7dGhpcy5ub2Rlcz17fTt0aGlzLmVkZ2VzPVtdfX1kLlNsaW1HcmFwaD1DO2NsYXNzIEd7Y29uc3RydWN0b3IoSCl7dGhpcy50eXBlPXkuRUxMSVBTSVM7dGhpcy5pc0dyb3VwTm9kZT0hMTt0aGlzLmNhcmRpbmFsaXR5PTE7dGhpcy5zdGF0cz10aGlzLnBhcmVudE5vZGU9bnVsbDt0aGlzLnNldE51bU1vcmVOb2RlcyhIKTt0aGlzLmluY2x1ZGU9dy5VTlNQRUNJRklFRH1zZXROdW1Nb3JlTm9kZXMoSCl7dGhpcy5udW1Nb3JlTm9kZXM9SDt0aGlzLm5hbWU9CiIuLi4gIitIKyIgbW9yZSJ9fWQuRWxsaXBzaXNOb2RlSW1wbD1HO2NsYXNzIER7Y29uc3RydWN0b3IoSCl7dGhpcy5vcD1ILm9wO3RoaXMubmFtZT1ILm5hbWU7dGhpcy5kZXZpY2U9SC5kZXZpY2U7dGhpcy5hdHRyPUguYXR0cjt0aGlzLmlucHV0cz10KEguaW5wdXQpO3RoaXMub3V0cHV0U2hhcGVzPWgoSC5hdHRyKTt0aGlzLnhsYUNsdXN0ZXI9ayhILmF0dHIpO3RoaXMuY29tcGF0aWJsZT0hMTt0aGlzLnR5cGU9eS5PUDt0aGlzLmlzR3JvdXBOb2RlPSExO3RoaXMuY2FyZGluYWxpdHk9MTt0aGlzLmluRW1iZWRkaW5ncz1bXTt0aGlzLm91dEVtYmVkZGluZ3M9W107dGhpcy5wYXJlbnROb2RlPW51bGw7dGhpcy5pbmNsdWRlPXcuVU5TUEVDSUZJRUQ7dGhpcy5vd25pbmdTZXJpZXM9bnVsbH19ZC5PcE5vZGVJbXBsPUQ7ZC5jcmVhdGVNZXRhbm9kZT1mdW5jdGlvbihILEs9e30pe3JldHVybiBuZXcgSShILEspfTtkLmpvaW5TdGF0c0luZm9XaXRoR3JhcGg9ZnVuY3Rpb24oSCxLLApNKXtfLmVhY2goSC5ub2RlcyxMPT57TC5zdGF0cz1udWxsfSk7Xy5lYWNoKEsuZGV2X3N0YXRzLEw9PntNJiYhTVtMLmRldmljZV18fF8uZWFjaChMLm5vZGVfc3RhdHMsUT0+e2xldCBUPVEubm9kZV9uYW1lIGluIEgubm9kZXM/US5ub2RlX25hbWU6bihRLm5vZGVfbmFtZSk7aWYoVCBpbiBILm5vZGVzKXt2YXIgWD0wO1EubWVtb3J5JiZfLmVhY2goUS5tZW1vcnksbGE9PntsYS50b3RhbF9ieXRlcyYmKDA8bGEudG90YWxfYnl0ZXM/WCs9TnVtYmVyKGxhLnRvdGFsX2J5dGVzKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgbWVtb3J5IGFsbG9jYXRpb24gZm9yICIrVCkpfSk7dmFyIGFhPW51bGw7US5vdXRwdXQmJihhYT1fLm1hcChRLm91dHB1dCxsYT0+Xy5tYXAobGEudGVuc29yX2Rlc2NyaXB0aW9uLnNoYXBlLmRpbSxaPT5OdW1iZXIoWi5zaXplKSkpKTtILm5vZGVzW1RdLmRldmljZT1MLmRldmljZTtudWxsPT1ILm5vZGVzW1RdLnN0YXRzJiYoSC5ub2Rlc1tUXS5zdGF0cz0KbmV3IEIoYWEpKTtILm5vZGVzW1RdLnN0YXRzLmFkZEJ5dGVzQWxsb2NhdGlvbihYKTtRLmFsbF9lbmRfcmVsX21pY3JvcyYmKDA8US5hbGxfZW5kX3JlbF9taWNyb3M/SC5ub2Rlc1tUXS5zdGF0cy5hZGRFeGVjdXRpb25UaW1lKFEuYWxsX3N0YXJ0X21pY3JvcyxRLmFsbF9zdGFydF9taWNyb3MrUS5hbGxfZW5kX3JlbF9taWNyb3MpOmNvbnNvbGUubG9nKCJpZ25vcmluZyBuZWdhdGl2ZSBydW50aW1lIGZvciAiK1QpKX19KX0pfTtjbGFzcyBCe2NvbnN0cnVjdG9yKEgpe3RoaXMudG90YWxCeXRlcz0wO3RoaXMub3V0cHV0U2l6ZT1IfWFkZEV4ZWN1dGlvblRpbWUoSCxLKXt0aGlzLnN0YXJ0VGltZT1udWxsIT10aGlzLnN0YXJ0VGltZT9NYXRoLm1pbih0aGlzLnN0YXJ0VGltZSxIKTpIO3RoaXMuZW5kVGltZT1udWxsIT10aGlzLmVuZFRpbWU/TWF0aC5tYXgodGhpcy5lbmRUaW1lLEspOkt9YWRkQnl0ZXNBbGxvY2F0aW9uKEgpe3RoaXMudG90YWxCeXRlcz1udWxsIT10aGlzLnRvdGFsQnl0ZXM/Ck1hdGgubWF4KHRoaXMudG90YWxCeXRlcyxIKTpIfWNvbWJpbmUoSCl7bnVsbCE9SC50b3RhbEJ5dGVzJiYodGhpcy50b3RhbEJ5dGVzKz1ILnRvdGFsQnl0ZXMpO251bGwhPUguZ2V0VG90YWxNaWNyb3MoKSYmdGhpcy5hZGRFeGVjdXRpb25UaW1lKEguc3RhcnRUaW1lLEguZW5kVGltZSl9Z2V0VG90YWxNaWNyb3MoKXtyZXR1cm4gbnVsbD09dGhpcy5zdGFydFRpbWV8fG51bGw9PXRoaXMuZW5kVGltZT9udWxsOnRoaXMuZW5kVGltZS10aGlzLnN0YXJ0VGltZX19ZC5Ob2RlU3RhdHM9QjtjbGFzcyBJe2NvbnN0cnVjdG9yKEgsSz17fSl7dGhpcy5uYW1lPUg7dGhpcy50eXBlPXkuTUVUQTt0aGlzLmRlcHRoPTE7dGhpcy5pc0dyb3VwTm9kZT0hMDt0aGlzLmNhcmRpbmFsaXR5PTA7dGhpcy5tZXRhZ3JhcGg9cChILEEuTUVUQSxLKTt0aGlzLmJyaWRnZWdyYXBoPW51bGw7dGhpcy5vcEhpc3RvZ3JhbT17fTt0aGlzLmRldmljZUhpc3RvZ3JhbT17fTt0aGlzLnhsYUNsdXN0ZXJIaXN0b2dyYW09Cnt9O3RoaXMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbT17Y29tcGF0aWJsZTowLGluY29tcGF0aWJsZTowfTt0aGlzLnBhcmVudE5vZGU9dGhpcy50ZW1wbGF0ZUlkPW51bGw7dGhpcy5oYXNOb25Db250cm9sRWRnZXM9ITE7dGhpcy5pbmNsdWRlPXcuVU5TUEVDSUZJRUQ7dGhpcy5hc3NvY2lhdGVkRnVuY3Rpb249IiJ9Z2V0Rmlyc3RDaGlsZCgpe3JldHVybiB0aGlzLm1ldGFncmFwaC5ub2RlKHRoaXMubWV0YWdyYXBoLm5vZGVzKClbMF0pfWdldFJvb3RPcCgpe2xldCBIPXRoaXMubmFtZS5zcGxpdCgiLyIpO3JldHVybiB0aGlzLm1ldGFncmFwaC5ub2RlKHRoaXMubmFtZSsiLygiK0hbSC5sZW5ndGgtMV0rIikiKX1sZWF2ZXMoKXtsZXQgSD1bXSxLPVt0aGlzXSxNO2Zvcig7Sy5sZW5ndGg7KXtsZXQgTD1LLnNoaWZ0KCk7TC5pc0dyb3VwTm9kZT8oTT1MLm1ldGFncmFwaCxfLmVhY2goTS5ub2RlcygpLFE9PksucHVzaChNLm5vZGUoUSkpKSk6SC5wdXNoKEwubmFtZSl9cmV0dXJuIEh9fQpkLk1ldGFub2RlSW1wbD1JO2QuY3JlYXRlTWV0YWVkZ2U9ZnVuY3Rpb24oSCxLKXtyZXR1cm4gbmV3IE4oSCxLKX07Y2xhc3MgTntjb25zdHJ1Y3RvcihILEspe3RoaXMudj1IO3RoaXMudz1LO3RoaXMuYmFzZUVkZ2VMaXN0PVtdO3RoaXMuaW5ib3VuZD1udWxsO3RoaXMudG90YWxTaXplPXRoaXMubnVtUmVmRWRnZXM9dGhpcy5udW1Db250cm9sRWRnZXM9dGhpcy5udW1SZWd1bGFyRWRnZXM9MH1hZGRCYXNlRWRnZShILEspe3RoaXMuYmFzZUVkZ2VMaXN0LnB1c2goSCk7SC5pc0NvbnRyb2xEZXBlbmRlbmN5P3RoaXMubnVtQ29udHJvbEVkZ2VzKz0xOnRoaXMubnVtUmVndWxhckVkZ2VzKz0xO0guaXNSZWZlcmVuY2VFZGdlJiYodGhpcy5udW1SZWZFZGdlcys9MSk7dGhpcy50b3RhbFNpemUrPU4uY29tcHV0ZVNpemVPZkVkZ2UoSCxLKTtLLm1heE1ldGFFZGdlU2l6ZT1NYXRoLm1heChLLm1heE1ldGFFZGdlU2l6ZSx0aGlzLnRvdGFsU2l6ZSl9c3RhdGljIGNvbXB1dGVTaXplT2ZFZGdlKEgsCkspe2xldCBNPUsubm9kZShILnYpO2lmKCFNLm91dHB1dFNoYXBlcylyZXR1cm4gMTtLLmhhc1NoYXBlSW5mbz0hMDtIPU9iamVjdC5rZXlzKE0ub3V0cHV0U2hhcGVzKS5tYXAoTD0+TS5vdXRwdXRTaGFwZXNbTF0pLm1hcChMPT5udWxsPT1MPzE6TC5yZWR1Y2UoKFEsVCk9PnstMT09PVQmJihUPTEpO3JldHVybiBRKlR9LDEpKTtyZXR1cm4gXy5zdW0oSCl9fWQuTWV0YWVkZ2VJbXBsPU47ZC5jcmVhdGVTZXJpZXNOb2RlPWZ1bmN0aW9uKEgsSyxNLEwsUSxUKXtyZXR1cm4gbmV3IE8oSCxLLE0sTCxRLFQpfTtkLmdldFNlcmllc05vZGVOYW1lPWY7Y2xhc3MgT3tjb25zdHJ1Y3RvcihILEssTSxMLFEsVCl7dGhpcy5uYW1lPVF8fGYoSCxLLE0pO3RoaXMudHlwZT15LlNFUklFUzt0aGlzLmhhc0xvb3A9ITE7dGhpcy5wcmVmaXg9SDt0aGlzLnN1ZmZpeD1LO3RoaXMuY2x1c3RlcklkPUw7dGhpcy5pZHM9W107dGhpcy5wYXJlbnQ9TTt0aGlzLmlzR3JvdXBOb2RlPSEwO3RoaXMuY2FyZGluYWxpdHk9CjA7dGhpcy5tZXRhZ3JhcGg9cChRLEEuU0VSSUVTLFQpO3RoaXMucGFyZW50Tm9kZT10aGlzLmJyaWRnZWdyYXBoPW51bGw7dGhpcy5kZXZpY2VIaXN0b2dyYW09e307dGhpcy54bGFDbHVzdGVySGlzdG9ncmFtPXt9O3RoaXMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbT17Y29tcGF0aWJsZTowLGluY29tcGF0aWJsZTowfTt0aGlzLmhhc05vbkNvbnRyb2xFZGdlcz0hMTt0aGlzLmluY2x1ZGU9dy5VTlNQRUNJRklFRH19ZC5EZWZhdWx0QnVpbGRQYXJhbXM9e2VuYWJsZUVtYmVkZGluZzohMCxpbkVtYmVkZGluZ1R5cGVzOlsiQ29uc3QiXSxvdXRFbWJlZGRpbmdUeXBlczpbIl5bYS16QS1aXStTdW1tYXJ5JCJdLHJlZkVkZ2VzOnsiQXNzaWduIDAiOiEwLCJBc3NpZ25BZGQgMCI6ITAsIkFzc2lnblN1YiAwIjohMCwiYXNzaWduIDAiOiEwLCJhc3NpZ25fYWRkIDAiOiEwLCJhc3NpZ25fc3ViIDAiOiEwLCJjb3VudF91cF90byAwIjohMCwiU2NhdHRlckFkZCAwIjohMCwiU2NhdHRlclN1YiAwIjohMCwKIlNjYXR0ZXJVcGRhdGUgMCI6ITAsInNjYXR0ZXJfYWRkIDAiOiEwLCJzY2F0dGVyX3N1YiAwIjohMCwic2NhdHRlcl91cGRhdGUgMCI6ITB9fTtkLmJ1aWxkPWZ1bmN0aW9uKEgsSyxNKXtsZXQgTD17fSxRPXt9LFQ9e30sWD1tKEsuaW5FbWJlZGRpbmdUeXBlcyksYWE9bShLLm91dEVtYmVkZGluZ1R5cGVzKSxsYT1bXSxaPUgubm9kZSxiYT1BcnJheShaLmxlbmd0aCk7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIk5vcm1hbGl6aW5nIG5hbWVzIiwzMCwoKT0+e2xldCBlYT1BcnJheShaLmxlbmd0aCksY2E9MDtjb25zdCBrYT1FYT0+e2xldCB2YT1uZXcgRChFYSk7aWYoWCh2YSkpcmV0dXJuIGxhLnB1c2godmEubmFtZSksTFt2YS5uYW1lXT12YTtpZihhYSh2YSkpcmV0dXJuIGxhLnB1c2godmEubmFtZSksUVt2YS5uYW1lXT12YSxfLmVhY2godmEuaW5wdXRzLHhhPT57eGE9eGEubmFtZTtUW3hhXT1UW3hhXXx8W107VFt4YV0ucHVzaCh2YSl9KSx2YTtlYVtjYV09CnZhO2JhW2NhXT12YS5uYW1lO2NhKys7cmV0dXJuIHZhfTtfLmVhY2goWixrYSk7Y29uc3QgWT1FYT0+e2NvbnN0IHZhPWQuRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCtFYS5zaWduYXR1cmUubmFtZTtrYSh7bmFtZTp2YSxpbnB1dDpbXSxkZXZpY2U6IiIsb3A6IiIsYXR0cjpbXX0pO2lmKEVhLnNpZ25hdHVyZS5pbnB1dF9hcmcpe2xldCB5YT0wO3ZhciB4YT1TYT0+e2thKHtuYW1lOnZhK2QuTkFNRVNQQUNFX0RFTElNK1NhLm5hbWUsaW5wdXQ6W10sZGV2aWNlOiIiLG9wOiJpbnB1dF9hcmciLGF0dHI6W3trZXk6IlQiLHZhbHVlOnt0eXBlOlNhLnR5cGV9fV19KS5mdW5jdGlvbklucHV0SW5kZXg9eWE7eWErK307RWEuc2lnbmF0dXJlLmlucHV0X2FyZy5uYW1lP3hhKEVhLnNpZ25hdHVyZS5pbnB1dF9hcmcpOl8uZWFjaChFYS5zaWduYXR1cmUuaW5wdXRfYXJnLHhhKX1sZXQgQWE9MDtjb25zdCBGYT17fTtFYS5zaWduYXR1cmUub3V0cHV0X2FyZyYmKHhhPXlhPT57RmFbdmErCmQuTkFNRVNQQUNFX0RFTElNK3lhLm5hbWVdPUFhO0FhKyt9LEVhLnNpZ25hdHVyZS5vdXRwdXRfYXJnLm5hbWU/eGEoRWEuc2lnbmF0dXJlLm91dHB1dF9hcmcpOl8uZWFjaChFYS5zaWduYXR1cmUub3V0cHV0X2FyZyx4YSkpO18uZWFjaChFYS5ub2RlX2RlZix5YT0+e3lhLm5hbWU9dmErIi8iK3lhLm5hbWU7InN0cmluZyI9PT10eXBlb2YgeWEuaW5wdXQmJih5YS5pbnB1dD1beWEuaW5wdXRdKTtjb25zdCBTYT1rYSh5YSk7Xy5pc051bWJlcihGYVt5YS5uYW1lXSkmJihTYS5mdW5jdGlvbk91dHB1dEluZGV4PUZhW3lhLm5hbWVdKTtfLmVhY2goU2EuaW5wdXRzLFhhPT57WGEubmFtZT12YStkLk5BTUVTUEFDRV9ERUxJTStYYS5uYW1lfSl9KX07SC5saWJyYXJ5JiZILmxpYnJhcnkuZnVuY3Rpb24mJl8uZWFjaChILmxpYnJhcnkuZnVuY3Rpb24sWSk7ZWEuc3BsaWNlKGNhKTtiYS5zcGxpY2UoY2EpO3JldHVybiBlYX0sTSkudGhlbihlYT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiQnVpbGRpbmcgdGhlIGRhdGEgc3RydWN0dXJlIiwKNzAsKCk9PntsZXQgY2E9cShiYSxsYSksa2E9bmV3IEM7Xy5lYWNoKGVhLFk9PntsZXQgRWE9Y2FbWS5uYW1lXXx8WS5uYW1lO2thLm5vZGVzW0VhXT1ZO1kubmFtZSBpbiBUJiYoWS5vdXRFbWJlZGRpbmdzPVRbWS5uYW1lXSxfLmVhY2goWS5vdXRFbWJlZGRpbmdzLHZhPT57dmEubmFtZT1jYVt2YS5uYW1lXXx8dmEubmFtZX0pKTtZLm5hbWU9RWF9KTtfLmVhY2goZWEsWT0+e18uZWFjaChZLmlucHV0cywoRWEsdmEpPT57bGV0IHhhPUVhLm5hbWU7aWYoeGEgaW4gTCl7RWE9TFt4YV07WS5pbkVtYmVkZGluZ3MucHVzaChFYSk7Zm9yKHZhciBBYSBvZiBFYS5pbnB1dHMpbChrYSxjYVtBYS5uYW1lXXx8QWEubmFtZSxZLEFhLEssdmEpfWVsc2UgaWYoeGEgaW4gUSl7QWE9UVt4YV07Zm9yKGxldCBGYSBvZiBBYS5pbnB1dHMpbChrYSxjYVtGYS5uYW1lXXx8RmEubmFtZSxZLEVhLEssdmEpfWVsc2UgbChrYSxjYVt4YV18fHhhLFksRWEsSyx2YSl9KX0pO18uZWFjaChMLFk9PntZLm5hbWU9CmNhW1kubmFtZV18fFkubmFtZX0pO3JldHVybiBrYX0sTSkpfTtkLmNyZWF0ZUdyYXBoPXA7ZC5nZXRTdHJpY3ROYW1lPW47ZC5oYXNTaW1pbGFyRGVncmVlU2VxdWVuY2U9ZnVuY3Rpb24oSCxLKXtIPXUoSCk7Sz11KEspO2ZvcihsZXQgTT0wO008SC5sZW5ndGg7TSsrKWlmKEhbTV0hPT1LW01dKXJldHVybiExO3JldHVybiEwfTtkLmdldEhpZXJhcmNoaWNhbFBhdGg9eDtkLmdldEluY2x1ZGVOb2RlQnV0dG9uU3RyaW5nPWZ1bmN0aW9uKEgpe3JldHVybiBIPT09Yi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU/IkFkZCB0byBtYWluIGdyYXBoIjoiUmVtb3ZlIGZyb20gbWFpbiBncmFwaCJ9O2QuZ2V0R3JvdXBTZXJpZXNOb2RlQnV0dG9uU3RyaW5nPWZ1bmN0aW9uKEgpe3JldHVybiBIPT09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA/IlVuZ3JvdXAgdGhpcyBzZXJpZXMgb2Ygbm9kZXMiOiJHcm91cCB0aGlzIHNlcmllcyBvZiBub2RlcyJ9O2QudG9nZ2xlTm9kZVNlcmllc0dyb3VwPQpmdW5jdGlvbihILEspe0hbS109SyBpbiBIJiZIW0tdIT09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA/Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA6Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUH19KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9oaWVyYXJjaHkuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaCh4LEEseSx3KXtBPXk/eC5pbkVkZ2VzKEEubmFtZSk6eC5vdXRFZGdlcyhBLm5hbWUpO18uZWFjaChBLEM9PntDPXguZWRnZShDKTsoQy5udW1SZWd1bGFyRWRnZXM/dy5yZWd1bGFyOncuY29udHJvbCkucHVzaChDKX0pfWZ1bmN0aW9uIGsoeCxBKXtjb25zdCB5PXt9O18uZWFjaChBLm5vZGVzLHc9PntsZXQgQz1kLmdldEhpZXJhcmNoaWNhbFBhdGgody5uYW1lKSxHPXgucm9vdDtHLmRlcHRoPU1hdGgubWF4KEMubGVuZ3RoLEcuZGVwdGgpO3lbdy5vcF18fCh5W3cub3BdPVtdKTt5W3cub3BdLnB1c2godyk7Zm9yKGxldCBCPTA7QjxDLmxlbmd0aDtCKyspe0cuZGVwdGg9TWF0aC5tYXgoRy5kZXB0aCxDLmxlbmd0aC1CKTtHLmNhcmRpbmFsaXR5Kz13LmNhcmRpbmFsaXR5O0cub3BIaXN0b2dyYW1bdy5vcF09KEcub3BIaXN0b2dyYW1bdy5vcF18fDApKzE7bnVsbCE9dy5kZXZpY2UmJihHLmRldmljZUhpc3RvZ3JhbVt3LmRldmljZV09CihHLmRldmljZUhpc3RvZ3JhbVt3LmRldmljZV18fDApKzEpO251bGwhPXcueGxhQ2x1c3RlciYmKEcueGxhQ2x1c3Rlckhpc3RvZ3JhbVt3LnhsYUNsdXN0ZXJdPShHLnhsYUNsdXN0ZXJIaXN0b2dyYW1bdy54bGFDbHVzdGVyXXx8MCkrMSk7dy5jb21wYXRpYmxlP0cuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxO18uZWFjaCh3LmluRW1iZWRkaW5ncyxOPT57Ti5jb21wYXRpYmxlP0cuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwKMCkrMX0pO18uZWFjaCh3Lm91dEVtYmVkZGluZ3MsTj0+e04uY29tcGF0aWJsZT9HLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Ry5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pO2lmKEI9PT1DLmxlbmd0aC0xKWJyZWFrO3ZhciBEPUNbQl07bGV0IEk9eC5ub2RlKEQpO0l8fChJPWQuY3JlYXRlTWV0YW5vZGUoRCx4LmdyYXBoT3B0aW9ucyksSS5wYXJlbnROb2RlPUcseC5zZXROb2RlKEQsSSksRy5tZXRhZ3JhcGguc2V0Tm9kZShELEkpLDA9PT1ELmluZGV4T2YoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmRy5uYW1lPT09Yi5ncmFwaC5ST09UX05BTUUmJihEPUQuc3Vic3RyaW5nKGIuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWC5sZW5ndGgpLHlbRF18fAooeVtEXT1bXSkseC5saWJyYXJ5RnVuY3Rpb25zW0RdPXtub2RlOkksdXNhZ2VzOnlbRF19LEkuYXNzb2NpYXRlZEZ1bmN0aW9uPUQpKTtHPUl9eC5zZXROb2RlKHcubmFtZSx3KTt3LnBhcmVudE5vZGU9RztHLm1ldGFncmFwaC5zZXROb2RlKHcubmFtZSx3KTtfLmVhY2gody5pbkVtYmVkZGluZ3MsZnVuY3Rpb24oQil7eC5zZXROb2RlKEIubmFtZSxCKTtCLnBhcmVudE5vZGU9d30pO18uZWFjaCh3Lm91dEVtYmVkZGluZ3MsZnVuY3Rpb24oQil7eC5zZXROb2RlKEIubmFtZSxCKTtCLnBhcmVudE5vZGU9d30pfSl9ZnVuY3Rpb24gdCh4LEEpe2xldCB5PXguZ2V0Tm9kZU1hcCgpLHc9W10sQz1bXSxHPShELEIpPT57bGV0IEk9MDtmb3IoO0Q7KUJbSSsrXT1ELm5hbWUsRD1ELnBhcmVudE5vZGU7cmV0dXJuIEktMX07Xy5lYWNoKEEuZWRnZXMsRD0+e3ZhciBCPUcoQS5ub2Rlc1tELnZdLHcpLEk9RyhBLm5vZGVzW0Qud10sQyk7aWYoLTEhPT1CJiYtMSE9PUkpe2Zvcig7d1tCXT09PUNbSV07KWlmKEItLSwKSS0tLDA+Qnx8MD5JKXRocm93IEVycm9yKCJObyBkaWZmZXJlbmNlIGZvdW5kIGJldHdlZW4gYW5jZXN0b3IgcGF0aHMuIik7dmFyIE49eVt3W0IrMV1dO0I9d1tCXTtJPUNbSV07dmFyIE89Ti5tZXRhZ3JhcGguZWRnZShCLEkpO098fChPPWQuY3JlYXRlTWV0YWVkZ2UoQixJKSxOLm1ldGFncmFwaC5zZXRFZGdlKEIsSSxPKSk7Ti5oYXNOb25Db250cm9sRWRnZXN8fEQuaXNDb250cm9sRGVwZW5kZW5jeXx8KE4uaGFzTm9uQ29udHJvbEVkZ2VzPSEwKTtPLmFkZEJhc2VFZGdlKEQseCl9fSl9ZnVuY3Rpb24gbCh4LEEseSx3LEMsRyl7bGV0IEQ9eC5tZXRhZ3JhcGg7Xy5lYWNoKEQubm9kZXMoKSxCPT57Qj1ELm5vZGUoQik7Qi50eXBlPT09Yi5ncmFwaC5Ob2RlVHlwZS5NRVRBJiZsKEIsQSx5LHcsQyxHKX0pO3g9cChEKTt4PShHP246bSkoeCxELEEuZ3JhcGhPcHRpb25zKTtfLmVhY2goeCxmdW5jdGlvbihCLEkpe2xldCBOPUIubWV0YWdyYXBoLm5vZGVzKCk7Xy5lYWNoKE4sTz0+CntPPUQubm9kZShPKTtPLm93bmluZ1Nlcmllc3x8KE8ub3duaW5nU2VyaWVzPUkpfSk7Ti5sZW5ndGg8dyYmIShCLm5hbWUgaW4gQykmJihDW0IubmFtZV09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCk7Qi5uYW1lIGluIEMmJkNbQi5uYW1lXT09PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVB8fChBLnNldE5vZGUoSSxCKSxELnNldE5vZGUoSSxCKSxfLmVhY2goTixPPT57bGV0IEg9RC5ub2RlKE8pO0IubWV0YWdyYXBoLnNldE5vZGUoTyxIKTtCLnBhcmVudE5vZGU9SC5wYXJlbnROb2RlO0IuY2FyZGluYWxpdHkrKztudWxsIT1ILmRldmljZSYmKEIuZGV2aWNlSGlzdG9ncmFtW0guZGV2aWNlXT0oQi5kZXZpY2VIaXN0b2dyYW1bSC5kZXZpY2VdfHwwKSsxKTtudWxsIT1ILnhsYUNsdXN0ZXImJihCLnhsYUNsdXN0ZXJIaXN0b2dyYW1bSC54bGFDbHVzdGVyXT0oQi54bGFDbHVzdGVySGlzdG9ncmFtW0gueGxhQ2x1c3Rlcl18fDApKzEpO0guY29tcGF0aWJsZT8KQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzE7Xy5lYWNoKEguaW5FbWJlZGRpbmdzLEs9PntLLmNvbXBhdGlibGU/Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KTtfLmVhY2goSC5vdXRFbWJlZGRpbmdzLEs9PntLLmNvbXBhdGlibGU/Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9CihCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSk7SC5wYXJlbnROb2RlPUI7eVtPXT1JO0QucmVtb3ZlTm9kZShPKX0pKX0pfWZ1bmN0aW9uIHAoeCl7cmV0dXJuIF8ucmVkdWNlKHgubm9kZXMoKSwoQSx5KT0+e3k9eC5ub2RlKHkpO2lmKHkudHlwZT09PWQuTm9kZVR5cGUuTUVUQSlyZXR1cm4gQTtsZXQgdz15Lm9wO3cmJihBW3ddPUFbd118fFtdLEFbd10ucHVzaCh5Lm5hbWUpKTtyZXR1cm4gQX0se30pfWZ1bmN0aW9uIG0oeCxBLHkpe2xldCB3PXt9O18uZWFjaCh4LGZ1bmN0aW9uKEMsRyl7aWYoISgxPj1DLmxlbmd0aCkpe3ZhciBEPXt9O18uZWFjaChDLGZ1bmN0aW9uKEIpe3ZhciBJPSIqIj09PUIuY2hhckF0KEIubGVuZ3RoLTEpLE49Qi5zcGxpdCgiLyIpLE89TltOLmxlbmd0aC0xXTtOPU4uc2xpY2UoMCxOLmxlbmd0aC0xKS5qb2luKCIvIik7dmFyIEg9Ty5tYXRjaCgvXihcRCopXyhcZCspJC8pO2xldCBLPSIiO0g/KE89SFsxXSxIPUhbMl0pOgooTz1JP08uc3Vic3RyKDAsTy5sZW5ndGgtMSk6TyxIPTAsSz1JPyIqIjoiIik7ST1kLmdldFNlcmllc05vZGVOYW1lKE8sSyxOKTtEW0ldPURbSV18fFtdO0I9ZC5jcmVhdGVTZXJpZXNOb2RlKE8sSyxOLCtILEIseSk7RFtJXS5wdXNoKEIpfSk7Xy5lYWNoKEQsZnVuY3Rpb24oQil7aWYoISgyPkIubGVuZ3RoKSl7Qi5zb3J0KGZ1bmN0aW9uKE4sTyl7cmV0dXJuK04uY2x1c3RlcklkLStPLmNsdXN0ZXJJZH0pO3ZhciBJPVtCWzBdXTtmb3IobGV0IE49MTtOPEIubGVuZ3RoO04rKyl7bGV0IE89QltOXTtPLmNsdXN0ZXJJZD09PUlbSS5sZW5ndGgtMV0uY2x1c3RlcklkKzE/SS5wdXNoKE8pOihxKEksdywrRyxBLHkpLEk9W09dKX1xKEksdywrRyxBLHkpfX0pfX0pO3JldHVybiB3fWZ1bmN0aW9uIG4oeCxBLHkpe2xldCB3PXt9O18uZWFjaCh4LGZ1bmN0aW9uKEMsRyl7aWYoISgxPj1DLmxlbmd0aCkpe3ZhciBEPXt9LEI9e307Xy5lYWNoKEMsZnVuY3Rpb24oTil7bGV0IE89IioiPT09Ck4uY2hhckF0KE4ubGVuZ3RoLTEpO3ZhciBIPU4uc3BsaXQoIi8iKTtsZXQgSz1IW0gubGVuZ3RoLTFdO0g9SC5zbGljZSgwLEgubGVuZ3RoLTEpLmpvaW4oIi8iKTtjb25zdCBNPS8oXGQrKS9nO3ZhciBMO2xldCBRLFQsWCxhYT0wO2Zvcig7TD1NLmV4ZWMoSyk7KSsrYWEsUT1LLnNsaWNlKDAsTC5pbmRleCksVD1MWzBdLEw9Sy5zbGljZShMLmluZGV4K0xbMF0ubGVuZ3RoKSxYPWQuZ2V0U2VyaWVzTm9kZU5hbWUoUSxMLEgpLERbWF09RFtYXSxEW1hdfHwoRFtYXT1kLmNyZWF0ZVNlcmllc05vZGUoUSxMLEgsK1QsTix5KSksRFtYXS5pZHMucHVzaChUKSxCW05dPUJbTl18fFtdLEJbTl0ucHVzaChbWCxUXSk7MT5hYSYmKFE9Tz9LLnN1YnN0cigwLEsubGVuZ3RoLTEpOkssVD0wLEw9Tz8iKiI6IiIsWD1kLmdldFNlcmllc05vZGVOYW1lKFEsTCxIKSxEW1hdPURbWF0sRFtYXXx8KERbWF09ZC5jcmVhdGVTZXJpZXNOb2RlKFEsTCxILCtULE4seSkpLERbWF0uaWRzLnB1c2goVCksQltOXT0KQltOXXx8W10sQltOXS5wdXNoKFtYLFRdKSl9KTt2YXIgST17fTtfLmVhY2goQixmdW5jdGlvbihOLE8pe04uc29ydChmdW5jdGlvbihNLEwpe3JldHVybiBEW0xbMF1dLmlkcy5sZW5ndGgtRFtNWzBdXS5pZHMubGVuZ3RofSk7dmFyIEg9TlswXVswXTtOPU5bMF1bMV07SVtIXT1JW0hdfHxbXTtjb25zdCBLPU8uc3BsaXQoIi8iKTtPPWQuY3JlYXRlU2VyaWVzTm9kZShEW0hdLnByZWZpeCxEW0hdLnN1ZmZpeCxLLnNsaWNlKDAsSy5sZW5ndGgtMSkuam9pbigiLyIpLCtOLE8seSk7SVtIXS5wdXNoKE8pfSk7Xy5lYWNoKEksZnVuY3Rpb24oTil7aWYoISgyPk4ubGVuZ3RoKSl7Ti5zb3J0KGZ1bmN0aW9uKEgsSyl7cmV0dXJuK0guY2x1c3RlcklkLStLLmNsdXN0ZXJJZH0pO3ZhciBPPVtOWzBdXTtmb3IobGV0IEg9MTtIPE4ubGVuZ3RoO0grKyl7bGV0IEs9TltIXTtLLmNsdXN0ZXJJZD09PU9bTy5sZW5ndGgtMV0uY2x1c3RlcklkKzE/Ty5wdXNoKEspOihxKE8sdywrRyxBLHkpLE89CltLXSl9cShPLHcsK0csQSx5KX19KX19KTtyZXR1cm4gd31mdW5jdGlvbiBxKHgsQSx5LHcsQyl7aWYoMTx4Lmxlbmd0aCl7bGV0IEc9ZC5nZXRTZXJpZXNOb2RlTmFtZSh4WzBdLnByZWZpeCx4WzBdLnN1ZmZpeCx4WzBdLnBhcmVudCx4WzBdLmNsdXN0ZXJJZCx4W3gubGVuZ3RoLTFdLmNsdXN0ZXJJZCksRD1kLmNyZWF0ZVNlcmllc05vZGUoeFswXS5wcmVmaXgseFswXS5zdWZmaXgseFswXS5wYXJlbnQseSxHLEMpO18uZWFjaCh4LGZ1bmN0aW9uKEIpe0QuaWRzLnB1c2goQi5jbHVzdGVySWQpO0QubWV0YWdyYXBoLnNldE5vZGUoQi5uYW1lLHcubm9kZShCLm5hbWUpKX0pO0FbR109RH19Y2xhc3MgdXtjb25zdHJ1Y3Rvcih4KXt0aGlzLmhhc1NoYXBlSW5mbz0hMTt0aGlzLm1heE1ldGFFZGdlU2l6ZT0xO3RoaXMuZ3JhcGhPcHRpb25zPXh8fHt9O3RoaXMuZ3JhcGhPcHRpb25zLmNvbXBvdW5kPSEwO3RoaXMucm9vdD1kLmNyZWF0ZU1ldGFub2RlKGQuUk9PVF9OQU1FLHRoaXMuZ3JhcGhPcHRpb25zKTsKdGhpcy5saWJyYXJ5RnVuY3Rpb25zPXt9O3RoaXMueGxhQ2x1c3RlcnM9dGhpcy5kZXZpY2VzPXRoaXMudGVtcGxhdGVzPW51bGw7dGhpcy5pbmRleD17fTt0aGlzLmluZGV4W2QuUk9PVF9OQU1FXT10aGlzLnJvb3Q7dGhpcy5vcmRlcmluZ3M9e319Z2V0Tm9kZU1hcCgpe3JldHVybiB0aGlzLmluZGV4fW5vZGUoeCl7cmV0dXJuIHRoaXMuaW5kZXhbeF19c2V0Tm9kZSh4LEEpe3RoaXMuaW5kZXhbeF09QX1nZXRCcmlkZ2VncmFwaCh4KXt2YXIgQT10aGlzLmluZGV4W3hdO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIGluIGhpZXJhcmNoeTogIit4KTtpZighKCJtZXRhZ3JhcGgiaW4gQSkpcmV0dXJuIG51bGw7aWYoQS5icmlkZ2VncmFwaClyZXR1cm4gQS5icmlkZ2VncmFwaDtsZXQgeT1BLmJyaWRnZWdyYXBoPWQuY3JlYXRlR3JhcGgoIkJSSURHRUdSQVBIIixkLkdyYXBoVHlwZS5CUklER0UsdGhpcy5ncmFwaE9wdGlvbnMpO2lmKCEoQS5wYXJlbnROb2RlJiYKIm1ldGFncmFwaCJpbiBBLnBhcmVudE5vZGUpKXJldHVybiB5O3ZhciB3PUEucGFyZW50Tm9kZTtBPXcubWV0YWdyYXBoO3c9dGhpcy5nZXRCcmlkZ2VncmFwaCh3Lm5hbWUpO18uZWFjaChbQSx3XSxDPT57Qy5lZGdlcygpLmZpbHRlcihHPT5HLnY9PT14fHxHLnc9PT14KS5mb3JFYWNoKEc9PntsZXQgRD1HLnc9PT14LEI9Qy5lZGdlKEcpO18uZWFjaChCLmJhc2VFZGdlTGlzdCxJPT57bGV0IFtOLE9dPUQ/W0kudyxHLnZdOltJLnYsRy53XTt2YXIgSD10aGlzLmdldENoaWxkTmFtZSh4LE4pO0g9e3Y6RD9POkgsdzpEP0g6T307bGV0IEs9eS5lZGdlKEgpO0t8fChLPWQuY3JlYXRlTWV0YWVkZ2UoSC52LEgudyksSy5pbmJvdW5kPUQseS5zZXRFZGdlKEgudixILncsSykpO0suYWRkQmFzZUVkZ2UoSSx0aGlzKX0pfSl9KTtyZXR1cm4geX1nZXRDaGlsZE5hbWUoeCxBKXtsZXQgeT10aGlzLmluZGV4W0FdO2Zvcig7eTspe2lmKHkucGFyZW50Tm9kZSYmeS5wYXJlbnROb2RlLm5hbWU9PT0KeClyZXR1cm4geS5uYW1lO3k9eS5wYXJlbnROb2RlfXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBpbW1lZGlhdGUgY2hpbGQgZm9yIGRlc2NlbmRhbnQ6ICIrQSk7fWdldFByZWRlY2Vzc29ycyh4KXtsZXQgQT10aGlzLmluZGV4W3hdO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit4KTtsZXQgeT10aGlzLmdldE9uZVdheUVkZ2VzKEEsITApO0EuaXNHcm91cE5vZGV8fF8uZWFjaChBLmluRW1iZWRkaW5ncyx3PT57Xy5lYWNoKEEuaW5wdXRzLEM9PntpZihDLm5hbWU9PT13Lm5hbWUpe2xldCBHPW5ldyBkLk1ldGFlZGdlSW1wbCh3Lm5hbWUseCk7Ry5hZGRCYXNlRWRnZSh7aXNDb250cm9sRGVwZW5kZW5jeTpDLmlzQ29udHJvbERlcGVuZGVuY3ksb3V0cHV0VGVuc29yS2V5OkMub3V0cHV0VGVuc29yS2V5LGlzUmVmZXJlbmNlRWRnZTohMSx2OncubmFtZSx3Onh9LHRoaXMpO3kucmVndWxhci5wdXNoKEcpfX0pfSk7cmV0dXJuIHl9Z2V0U3VjY2Vzc29ycyh4KXtsZXQgQT0KdGhpcy5pbmRleFt4XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIreCk7bGV0IHk9dGhpcy5nZXRPbmVXYXlFZGdlcyhBLCExKTtBLmlzR3JvdXBOb2RlfHxfLmVhY2goQS5vdXRFbWJlZGRpbmdzLHc9PntfLmVhY2gody5pbnB1dHMsQz0+e2lmKEMubmFtZT09PXgpe2xldCBHPW5ldyBkLk1ldGFlZGdlSW1wbCh4LHcubmFtZSk7Ry5hZGRCYXNlRWRnZSh7aXNDb250cm9sRGVwZW5kZW5jeTpDLmlzQ29udHJvbERlcGVuZGVuY3ksb3V0cHV0VGVuc29yS2V5OkMub3V0cHV0VGVuc29yS2V5LGlzUmVmZXJlbmNlRWRnZTohMSx2Ongsdzp3Lm5hbWV9LHRoaXMpO3kucmVndWxhci5wdXNoKEcpfX0pfSk7cmV0dXJuIHl9Z2V0T25lV2F5RWRnZXMoeCxBKXtsZXQgeT17Y29udHJvbDpbXSxyZWd1bGFyOltdfTtpZigheC5wYXJlbnROb2RlfHwheC5wYXJlbnROb2RlLmlzR3JvdXBOb2RlKXJldHVybiB5O3ZhciB3PXgucGFyZW50Tm9kZTtsZXQgQz0Kdy5tZXRhZ3JhcGg7dz10aGlzLmdldEJyaWRnZWdyYXBoKHcubmFtZSk7aChDLHgsQSx5KTtoKHcseCxBLHkpO3JldHVybiB5fWdldFRvcG9sb2dpY2FsT3JkZXJpbmcoeCl7dmFyIEE9dGhpcy5pbmRleFt4XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIreCk7aWYoIUEuaXNHcm91cE5vZGUpcmV0dXJuIG51bGw7aWYoeCBpbiB0aGlzLm9yZGVyaW5ncylyZXR1cm4gdGhpcy5vcmRlcmluZ3NbeF07bGV0IHk9e30sdz17fSxDPUEubWV0YWdyYXBoO18uZWFjaChDLmVkZ2VzKCksRD0+e0MuZWRnZShEKS5udW1SZWd1bGFyRWRnZXMmJihELnYgaW4geXx8KHlbRC52XT1bXSkseVtELnZdLnB1c2goRC53KSx3W0Qud109ITApfSk7bGV0IEc9Xy5kaWZmZXJlbmNlKF8ua2V5cyh5KSxfLmtleXModykpO3g9dGhpcy5vcmRlcmluZ3NbeF09e307Zm9yKEE9MDtHLmxlbmd0aDspe2xldCBEPUcuc2hpZnQoKTt4W0RdPUErKztfLmVhY2goeVtEXSxCPT4KRy5wdXNoKEIpKTtkZWxldGUgeVtEXX1yZXR1cm4geH1nZXRUZW1wbGF0ZUluZGV4KCl7bGV0IHg9ZDMua2V5cyh0aGlzLnRlbXBsYXRlcyksQT1kMy5zY2FsZU9yZGluYWwoKS5kb21haW4oeCkucmFuZ2UoZDMucmFuZ2UoMCx4Lmxlbmd0aCkpO3JldHVybiB5PT5BKHkpfX1mLkRlZmF1bHRIaWVyYXJjaHlQYXJhbXM9e3ZlcmlmeVRlbXBsYXRlOiEwLHNlcmllc05vZGVNaW5TaXplOjUsc2VyaWVzTWFwOnt9LHJhbmtEaXJlY3Rpb246IkJUIix1c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zOiExfTtmLmJ1aWxkPWZ1bmN0aW9uKHgsQSx5KXtsZXQgdz1uZXcgdSh7cmFua2RpcjpBLnJhbmtEaXJlY3Rpb259KSxDPXt9O3JldHVybiBiLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJBZGRpbmcgbm9kZXMiLDIwLCgpPT57bGV0IEc9e30sRD17fTtfLmVhY2goeC5ub2RlcyxCPT57Qi5kZXZpY2UmJihHW0IuZGV2aWNlXT0hMCk7Qi54bGFDbHVzdGVyJiYoRFtCLnhsYUNsdXN0ZXJdPSEwKX0pOwp3LmRldmljZXM9Xy5rZXlzKEcpO3cueGxhQ2x1c3RlcnM9Xy5rZXlzKEQpO2sodyx4KX0seSkudGhlbigoKT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiRGV0ZWN0IHNlcmllcyIsMjAsKCk9PnswPEEuc2VyaWVzTm9kZU1pblNpemUmJmwody5yb290LHcsQyxBLnNlcmllc05vZGVNaW5TaXplLEEuc2VyaWVzTWFwLEEudXNlR2VuZXJhbGl6ZWRTZXJpZXNQYXR0ZXJucyl9LHkpKS50aGVuKCgpPT5iLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJBZGRpbmcgZWRnZXMiLDMwLCgpPT57dCh3LHgsQyl9LHkpKS50aGVuKCgpPT5iLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJGaW5kaW5nIHNpbWlsYXIgc3ViZ3JhcGhzIiwzMCwoKT0+e3cudGVtcGxhdGVzPWQudGVtcGxhdGUuZGV0ZWN0KHcsQS52ZXJpZnlUZW1wbGF0ZSl9LHkpKS50aGVuKCgpPT53KX07Zi5qb2luQW5kQWdncmVnYXRlU3RhdHM9ZnVuY3Rpb24oeCl7bGV0IEE9e30seT17fTtfLmVhY2goeC5yb290LmxlYXZlcygpLAp3PT57dz14Lm5vZGUodyk7bnVsbCE9dy5kZXZpY2UmJihBW3cuZGV2aWNlXT0hMCk7bnVsbCE9dy54bGFDbHVzdGVyJiYoeVt3LnhsYUNsdXN0ZXJdPSEwKX0pO3guZGV2aWNlcz1fLmtleXMoQSk7eC54bGFDbHVzdGVycz1fLmtleXMoeSk7Xy5lYWNoKHguZ2V0Tm9kZU1hcCgpLHc9Pnt3LmlzR3JvdXBOb2RlJiYody5zdGF0cz1uZXcgZC5Ob2RlU3RhdHMobnVsbCksdy5kZXZpY2VIaXN0b2dyYW09e30pfSk7Xy5lYWNoKHgucm9vdC5sZWF2ZXMoKSx3PT57bGV0IEM9dz14Lm5vZGUodyk7Zm9yKDtudWxsIT1DLnBhcmVudE5vZGU7KXtpZihudWxsIT13LmRldmljZSl7dmFyIEc9Qy5wYXJlbnROb2RlLmRldmljZUhpc3RvZ3JhbTtHW3cuZGV2aWNlXT0oR1t3LmRldmljZV18fDApKzF9bnVsbCE9dy54bGFDbHVzdGVyJiYoRz1DLnBhcmVudE5vZGUueGxhQ2x1c3Rlckhpc3RvZ3JhbSxHW3cueGxhQ2x1c3Rlcl09KEdbdy54bGFDbHVzdGVyXXx8MCkrMSk7bnVsbCE9dy5zdGF0cyYmQy5wYXJlbnROb2RlLnN0YXRzLmNvbWJpbmUody5zdGF0cyk7CkM9Qy5wYXJlbnROb2RlfX0pfTtmLmdldEluY29tcGF0aWJsZU9wcz1mdW5jdGlvbih4LEEpe2xldCB5PVtdLHc9e307Xy5lYWNoKHgucm9vdC5sZWF2ZXMoKSxDPT57Qz14Lm5vZGUoQyk7aWYoQy50eXBlPT1kLk5vZGVUeXBlLk9QKXtpZighQy5jb21wYXRpYmxlKWlmKEMub3duaW5nU2VyaWVzKWlmKEEmJkEuc2VyaWVzTWFwW0Mub3duaW5nU2VyaWVzXT09PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVApeS5wdXNoKEMpO2Vsc2V7aWYoIXdbQy5vd25pbmdTZXJpZXNdKXtsZXQgRz14Lm5vZGUoQy5vd25pbmdTZXJpZXMpO0cmJih3W0Mub3duaW5nU2VyaWVzXT1HLHkucHVzaChHKSl9fWVsc2UgeS5wdXNoKEMpO18uZWFjaChDLmluRW1iZWRkaW5ncyxHPT57Ry5jb21wYXRpYmxlfHx5LnB1c2goRyl9KTtfLmVhY2goQy5vdXRFbWJlZGRpbmdzLEc9PntHLmNvbXBhdGlibGV8fHkucHVzaChHKX0pfX0pO3JldHVybiB5fX0pKGQuaGllcmFyY2h5fHwoZC5oaWVyYXJjaHk9Cnt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9sYXlvdXQuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaCh3KXt3Lm5vZGUuaXNHcm91cE5vZGUmJnQodyk7dy5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEE/cCh3KTp3Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTJiZtKHcpfWZ1bmN0aW9uIGsodyl7dy5pbmJveFdpZHRoPTA8dy5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoP2YuUEFSQU1TLmFubm90YXRpb25zLmluYm94V2lkdGg6MDt3Lm91dGJveFdpZHRoPTA8dy5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD9mLlBBUkFNUy5hbm5vdGF0aW9ucy5vdXRib3hXaWR0aDowO3cuY29yZUJveC53aWR0aD13LndpZHRoO3cuY29yZUJveC5oZWlnaHQ9dy5oZWlnaHQ7dy53aWR0aD1NYXRoLm1heCh3LmNvcmVCb3gud2lkdGgrdy5pbmJveFdpZHRoK3cub3V0Ym94V2lkdGgsMyp3LmRpc3BsYXlOYW1lLmxlbmd0aCl9ZnVuY3Rpb24gdCh3KXtsZXQgQz13LmNvcmVHcmFwaC5ub2RlcygpLm1hcChHPT4Kdy5jb3JlR3JhcGgubm9kZShHKSkuY29uY2F0KHcuaXNvbGF0ZWRJbkV4dHJhY3Qsdy5pc29sYXRlZE91dEV4dHJhY3Qsdy5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCk7Xy5lYWNoKEMsRz0+e3N3aXRjaChHLm5vZGUudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk9QOl8uZXh0ZW5kKEcsZi5QQVJBTVMubm9kZVNpemUub3ApO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6Xy5leHRlbmQoRyxmLlBBUkFNUy5ub2RlU2l6ZS5icmlkZ2UpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOkcuZXhwYW5kZWQ/aChHKTooXy5leHRlbmQoRyxmLlBBUkFNUy5ub2RlU2l6ZS5tZXRhKSxHLmhlaWdodD1mLlBBUkFNUy5ub2RlU2l6ZS5tZXRhLmhlaWdodChHLm5vZGUuY2FyZGluYWxpdHkpKTticmVhaztjYXNlIGQuTm9kZVR5cGUuU0VSSUVTOkcuZXhwYW5kZWQ/KF8uZXh0ZW5kKEcsZi5QQVJBTVMubm9kZVNpemUuc2VyaWVzLmV4cGFuZGVkKSxoKEcpKTpfLmV4dGVuZChHLEcubm9kZS5oYXNOb25Db250cm9sRWRnZXM/CmYuUEFSQU1TLm5vZGVTaXplLnNlcmllcy52ZXJ0aWNhbDpmLlBBUkFNUy5ub2RlU2l6ZS5zZXJpZXMuaG9yaXpvbnRhbCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitHLm5vZGUudHlwZSk7fUcuZXhwYW5kZWR8fGsoRyk7bihHKX0pfWZ1bmN0aW9uIGwodyxDKXtfLmV4dGVuZCh3LmdyYXBoKCkse25vZGVzZXA6Qy5ub2RlU2VwLHJhbmtzZXA6Qy5yYW5rU2VwLGVkZ2VzZXA6Qy5lZGdlU2VwfSk7bGV0IEc9W10sRD1bXTtfLmVhY2gody5ub2RlcygpLEg9Pnt3Lm5vZGUoSCkubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5CUklER0U/Ry5wdXNoKEgpOkQucHVzaChIKX0pO2lmKCFELmxlbmd0aClyZXR1cm57d2lkdGg6MCxoZWlnaHQ6MH07ZGFncmUubGF5b3V0KHcpO2xldCBCPUluZmluaXR5LEk9SW5maW5pdHksTj0tSW5maW5pdHksTz0tSW5maW5pdHk7Xy5lYWNoKEQsSD0+e0g9dy5ub2RlKEgpO3ZhciBLPS41Kkgud2lkdGgsTT1ILngtCks7Sz1ILngrSztCPU08Qj9NOkI7Tj1LPk4/SzpOO0s9LjUqSC5oZWlnaHQ7TT1ILnktSztIPUgueStLO0k9TTxJP006STtPPUg+Tz9IOk99KTtfLmVhY2gody5lZGdlcygpLEg9PntIPXcuZWRnZShIKTtpZighSC5zdHJ1Y3R1cmFsKXt2YXIgSz13Lm5vZGUoSC5tZXRhZWRnZS52KSxNPXcubm9kZShILm1ldGFlZGdlLncpO2lmKDM9PT1ILnBvaW50cy5sZW5ndGgmJkEoSC5wb2ludHMpKXtpZihudWxsIT1LKXt2YXIgTD1LLmV4cGFuZGVkP0sueDp1KEspO0gucG9pbnRzWzBdLng9TH1udWxsIT1NJiYoTD1NLmV4cGFuZGVkP00ueDp1KE0pLEgucG9pbnRzWzJdLng9TCk7SC5wb2ludHM9W0gucG9pbnRzWzBdLEgucG9pbnRzWzFdXX1MPUgucG9pbnRzW0gucG9pbnRzLmxlbmd0aC0yXTtudWxsIT1NJiYoSC5wb2ludHNbSC5wb2ludHMubGVuZ3RoLTFdPXkoTCxNKSk7TT1ILnBvaW50c1sxXTtudWxsIT1LJiYoSC5wb2ludHNbMF09eShNLEspKTtfLmVhY2goSC5wb2ludHMsUT0+e0I9US54PApCP1EueDpCO049US54Pk4/US54Ok47ST1RLnk8ST9RLnk6STtPPVEueT5PP1EueTpPfSl9fSk7Xy5lYWNoKHcubm9kZXMoKSxIPT57SD13Lm5vZGUoSCk7SC54LT1CO0gueS09SX0pO18uZWFjaCh3LmVkZ2VzKCksSD0+e18uZWFjaCh3LmVkZ2UoSCkucG9pbnRzLEs9PntLLngtPUI7Sy55LT1JfSl9KTtyZXR1cm57d2lkdGg6Ti1CLGhlaWdodDpPLUl9fWZ1bmN0aW9uIHAodyl7bGV0IEM9Zi5QQVJBTVMuc3Vic2NlbmUubWV0YTtfLmV4dGVuZCh3LEMpO18uZXh0ZW5kKHcuY29yZUJveCxsKHcuY29yZUdyYXBoLGYuUEFSQU1TLmdyYXBoLm1ldGEpKTt2YXIgRz13Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aD9fLm1heCh3Lmlzb2xhdGVkSW5FeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7dy5pbkV4dHJhY3RCb3gud2lkdGg9bnVsbCE9Rz9HOjA7dy5pbkV4dHJhY3RCb3guaGVpZ2h0PV8ucmVkdWNlKHcuaXNvbGF0ZWRJbkV4dHJhY3QsKEIsSSxOKT0+e049MDxOP0MuZXh0cmFjdFlPZmZzZXQ6CjA7SS54PTA7SS55PUIrTitJLmhlaWdodC8yO3JldHVybiBCK04rSS5oZWlnaHR9LDApO0c9dy5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoP18ubWF4KHcuaXNvbGF0ZWRPdXRFeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7dy5vdXRFeHRyYWN0Qm94LndpZHRoPW51bGwhPUc/RzowO3cub3V0RXh0cmFjdEJveC5oZWlnaHQ9Xy5yZWR1Y2Uody5pc29sYXRlZE91dEV4dHJhY3QsKEIsSSxOKT0+e049MDxOP0MuZXh0cmFjdFlPZmZzZXQ6MDtJLng9MDtJLnk9QitOK0kuaGVpZ2h0LzI7cmV0dXJuIEIrTitJLmhlaWdodH0sMCk7Rz13LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aD9fLm1heCh3LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7dy5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoPW51bGwhPUc/RzowO3cubGlicmFyeUZ1bmN0aW9uc0JveC5oZWlnaHQ9Xy5yZWR1Y2Uody5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCwoQixJLApOKT0+e049MDxOP0MuZXh0cmFjdFlPZmZzZXQ6MDtJLng9MDtJLnk9QitOK0kuaGVpZ2h0LzI7cmV0dXJuIEIrTitJLmhlaWdodH0sMCk7Rz0wOzA8dy5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGgmJkcrKzswPHcuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aCYmRysrOzA8dy5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgmJkcrKzswPHcuY29yZUdyYXBoLm5vZGVDb3VudCgpJiZHKys7bGV0IEQ9Zi5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldDtHPTE+PUc/MDpHKkQ7dy5jb3JlQm94LndpZHRoKz1NYXRoLm1heChmLk1JTl9BVVhfV0lEVEgsdy5pbkV4dHJhY3RCb3gud2lkdGgrdy5vdXRFeHRyYWN0Qm94LndpZHRoKStHK3cubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aCtHO3cuY29yZUJveC5oZWlnaHQ9Qy5sYWJlbEhlaWdodCtNYXRoLm1heCh3LmluRXh0cmFjdEJveC5oZWlnaHQsdy5jb3JlQm94LmhlaWdodCx3LmxpYnJhcnlGdW5jdGlvbnNCb3guaGVpZ2h0LAp3Lm91dEV4dHJhY3RCb3guaGVpZ2h0KTt3LndpZHRoPXcuY29yZUJveC53aWR0aCtDLnBhZGRpbmdMZWZ0K0MucGFkZGluZ1JpZ2h0O3cuaGVpZ2h0PXcucGFkZGluZ1RvcCt3LmNvcmVCb3guaGVpZ2h0K3cucGFkZGluZ0JvdHRvbX1mdW5jdGlvbiBtKHcpe2xldCBDPXcuY29yZUdyYXBoLEc9Zi5QQVJBTVMuc3Vic2NlbmUuc2VyaWVzO18uZXh0ZW5kKHcsRyk7Xy5leHRlbmQody5jb3JlQm94LGwody5jb3JlR3JhcGgsZi5QQVJBTVMuZ3JhcGguc2VyaWVzKSk7Xy5lYWNoKEMubm9kZXMoKSxEPT57Qy5ub2RlKEQpLmV4Y2x1ZGVkPSExfSk7dy53aWR0aD13LmNvcmVCb3gud2lkdGgrRy5wYWRkaW5nTGVmdCtHLnBhZGRpbmdSaWdodDt3LmhlaWdodD13LmNvcmVCb3guaGVpZ2h0K0cucGFkZGluZ1RvcCtHLnBhZGRpbmdCb3R0b219ZnVuY3Rpb24gbih3KXtpZighdy5leHBhbmRlZCl7dmFyIEM9dy5pbkFubm90YXRpb25zLmxpc3QsRz13Lm91dEFubm90YXRpb25zLmxpc3Q7Xy5lYWNoKEMsCks9PnEoSykpO18uZWFjaChHLEs9PnEoSykpO3ZhciBEPWYuUEFSQU1TLmFubm90YXRpb25zLEI9Xy5yZWR1Y2UoQywoSyxNLEwpPT57TD0wPEw/RC55T2Zmc2V0OjA7TS5keD0tKHcuY29yZUJveC53aWR0aCtNLndpZHRoKS8yLUQueE9mZnNldDtNLmR5PUsrTCtNLmhlaWdodC8yO3JldHVybiBLK0wrTS5oZWlnaHR9LDApO18uZWFjaChDLEs9PntLLmR5LT1CLzI7Sy5sYWJlbE9mZnNldD1ELmxhYmVsT2Zmc2V0fSk7dmFyIEk9Xy5yZWR1Y2UoRywoSyxNLEwpPT57TD0wPEw/RC55T2Zmc2V0OjA7TS5keD0ody5jb3JlQm94LndpZHRoK00ud2lkdGgpLzIrRC54T2Zmc2V0O00uZHk9SytMK00uaGVpZ2h0LzI7cmV0dXJuIEsrTCtNLmhlaWdodH0sMCk7Xy5lYWNoKEcsSz0+e0suZHktPUkvMjtLLmxhYmVsT2Zmc2V0PUQubGFiZWxPZmZzZXR9KTt2YXIgTj1NYXRoLm1pbih3LmhlaWdodC8yLXcucmFkaXVzLEIvMik7Tj0wPk4/MDpOO3ZhciBPPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLApDLmxlbmd0aC0xXSkucmFuZ2UoWy1OLE5dKTtfLmVhY2goQywoSyxNKT0+e0sucG9pbnRzPVt7ZHg6Sy5keCtLLndpZHRoLzIsZHk6Sy5keX0se2R4Oi13LmNvcmVCb3gud2lkdGgvMixkeToxPEMubGVuZ3RoP08oTSk6MH1dfSk7Tj1NYXRoLm1pbih3LmhlaWdodC8yLXcucmFkaXVzLEkvMik7Tj0wPk4/MDpOO3ZhciBIPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLEcubGVuZ3RoLTFdKS5yYW5nZShbLU4sTl0pO18uZWFjaChHLChLLE0pPT57Sy5wb2ludHM9W3tkeDp3LmNvcmVCb3gud2lkdGgvMixkeToxPEcubGVuZ3RoP0goTSk6MH0se2R4OksuZHgtSy53aWR0aC8yLGR5OksuZHl9XX0pO3cuaGVpZ2h0PU1hdGgubWF4KHcuaGVpZ2h0LEIsSSl9fWZ1bmN0aW9uIHEodyl7c3dpdGNoKHcuYW5ub3RhdGlvblR5cGUpe2Nhc2UgZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuQ09OU1RBTlQ6Xy5leHRlbmQodyxmLlBBUkFNUy5jb25zdGFudC5zaXplKTticmVhaztjYXNlIGQucmVuZGVyLkFubm90YXRpb25UeXBlLlNIT1JUQ1VUOmlmKHcubm9kZS50eXBlPT09CmQuTm9kZVR5cGUuT1ApXy5leHRlbmQodyxmLlBBUkFNUy5zaG9ydGN1dFNpemUub3ApO2Vsc2UgaWYody5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEpXy5leHRlbmQodyxmLlBBUkFNUy5zaG9ydGN1dFNpemUubWV0YSk7ZWxzZSBpZih3Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTKV8uZXh0ZW5kKHcsZi5QQVJBTVMuc2hvcnRjdXRTaXplLnNlcmllcyk7ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBub2RlIHR5cGU6ICIrdy5ub2RlLnR5cGUpO2JyZWFrO2Nhc2UgZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWTpfLmV4dGVuZCh3LGYuUEFSQU1TLmNvbnN0YW50LnNpemUpfX1mdW5jdGlvbiB1KHcpe3JldHVybiB3LmV4cGFuZGVkP3cueDp3Lngtdy53aWR0aC8yKyh3LmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg/dy5pbmJveFdpZHRoOjApK3cuY29yZUJveC53aWR0aC8yfWZ1bmN0aW9uIHgodyxDKXtyZXR1cm4gMTgwKk1hdGguYXRhbigoQy55LXcueSkvKEMueC0Kdy54KSkvTWF0aC5QSX1mdW5jdGlvbiBBKHcpe2xldCBDPXgod1swXSx3WzFdKTtmb3IobGV0IEc9MTtHPHcubGVuZ3RoLTE7RysrKXtsZXQgRD14KHdbR10sd1tHKzFdKTtpZigxPE1hdGguYWJzKEQtQykpcmV0dXJuITE7Qz1EfXJldHVybiEwfWZ1bmN0aW9uIHkodyxDKXtsZXQgRz1DLmV4cGFuZGVkP0MueDp1KEMpLEQ9Qy55O3ZhciBCPXcueC1HO3c9dy55LUQ7bGV0IEk9Qy5leHBhbmRlZD9DLndpZHRoOkMuY29yZUJveC53aWR0aCxOPUMuZXhwYW5kZWQ/Qy5oZWlnaHQ6Qy5jb3JlQm94LmhlaWdodDtNYXRoLmFicyh3KSpJLzI+TWF0aC5hYnMoQikqTi8yPygwPncmJihOPS1OKSxDPTA9PT13PzA6Ti8yKkIvdyxCPU4vMik6KDA+QiYmKEk9LUkpLEM9SS8yLEI9MD09PUI/MDpJLzIqdy9CKTtyZXR1cm57eDpHK0MseTpEK0J9fWYuUEFSQU1TPXthbmltYXRpb246e2R1cmF0aW9uOjI1MH0sZ3JhcGg6e21ldGE6e25vZGVTZXA6NSxyYW5rU2VwOjI1LGVkZ2VTZXA6NX0sc2VyaWVzOntub2RlU2VwOjUsCnJhbmtTZXA6MjUsZWRnZVNlcDo1fSxwYWRkaW5nOntwYWRkaW5nVG9wOjQwLHBhZGRpbmdMZWZ0OjIwfX0sc3Vic2NlbmU6e21ldGE6e3BhZGRpbmdUb3A6MTAscGFkZGluZ0JvdHRvbToxMCxwYWRkaW5nTGVmdDoxMCxwYWRkaW5nUmlnaHQ6MTAsbGFiZWxIZWlnaHQ6MjAsZXh0cmFjdFhPZmZzZXQ6MTUsZXh0cmFjdFlPZmZzZXQ6MjB9LHNlcmllczp7cGFkZGluZ1RvcDoxMCxwYWRkaW5nQm90dG9tOjEwLHBhZGRpbmdMZWZ0OjEwLHBhZGRpbmdSaWdodDoxMCxsYWJlbEhlaWdodDoxMH19LG5vZGVTaXplOnttZXRhOntyYWRpdXM6NSx3aWR0aDo2MCxtYXhMYWJlbFdpZHRoOjUyLGhlaWdodDpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSwyMDBdKS5yYW5nZShbMTUsNjBdKS5jbGFtcCghMCksZXhwYW5kQnV0dG9uUmFkaXVzOjN9LG9wOnt3aWR0aDoxNSxoZWlnaHQ6NixyYWRpdXM6MyxsYWJlbE9mZnNldDotOCxtYXhMYWJlbFdpZHRoOjMwfSxzZXJpZXM6e2V4cGFuZGVkOntyYWRpdXM6MTAsCmxhYmVsT2Zmc2V0OjB9LHZlcnRpY2FsOnt3aWR0aDoxNixoZWlnaHQ6MTMsbGFiZWxPZmZzZXQ6LTEzfSxob3Jpem9udGFsOnt3aWR0aDoyNCxoZWlnaHQ6OCxyYWRpdXM6MTAsbGFiZWxPZmZzZXQ6LTEwfX0sYnJpZGdlOnt3aWR0aDoyMCxoZWlnaHQ6MjAscmFkaXVzOjIsbGFiZWxPZmZzZXQ6MH19LHNob3J0Y3V0U2l6ZTp7b3A6e3dpZHRoOjEwLGhlaWdodDo0fSxtZXRhOnt3aWR0aDoxMixoZWlnaHQ6NCxyYWRpdXM6MX0sc2VyaWVzOnt3aWR0aDoxNCxoZWlnaHQ6NH19LGFubm90YXRpb25zOntpbmJveFdpZHRoOjUwLG91dGJveFdpZHRoOjUwLHhPZmZzZXQ6MTAseU9mZnNldDozLGxhYmVsT2Zmc2V0OjIsbWF4TGFiZWxXaWR0aDoxMjB9LGNvbnN0YW50OntzaXplOnt3aWR0aDo0LGhlaWdodDo0fX0sc2VyaWVzOnttYXhTdGFja0NvdW50OjMscGFyYWxsZWxTdGFja09mZnNldFJhdGlvOi4yLHRvd2VyU3RhY2tPZmZzZXRSYXRpbzouNX0sbWluaW1hcDp7c2l6ZToxNTB9fTtmLk1JTl9BVVhfV0lEVEg9CjE0MDtmLmxheW91dFNjZW5lPWg7Zi5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlPXV9KShkLmxheW91dHx8KGQubGF5b3V0PXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9sb2FkZXIuanMKdmFyIFVpPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbihiLGQsZixoKXtyZXR1cm4gbmV3IChmfHwoZj1Qcm9taXNlKSkoZnVuY3Rpb24oayx0KXtmdW5jdGlvbiBsKG4pe3RyeXttKGgubmV4dChuKSl9Y2F0Y2gocSl7dChxKX19ZnVuY3Rpb24gcChuKXt0cnl7bShoWyJ0aHJvdyJdKG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBtKG4pe24uZG9uZT9rKG4udmFsdWUpOihuZXcgZihmdW5jdGlvbihxKXtxKG4udmFsdWUpfSkpLnRoZW4obCxwKX1tKChoPWguYXBwbHkoYixkfHxbXSkpLm5leHQoKSl9KX07CihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2YuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaD1mdW5jdGlvbihoLGssdCxsPW5ldyBkLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcixwPWQuaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXMpe2NvbnN0IG09ZC51dGlsLmdldFN1YnRhc2tUcmFja2VyKGgsMjAsIkdyYXBoIiksbj1kLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoaCw1MCwiTmFtZXNwYWNlIGhpZXJhcmNoeSIpO3JldHVybiBkLnBhcnNlci5mZXRjaEFuZFBhcnNlR3JhcGhEYXRhKGssdCxkLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoaCwzMCwiRGF0YSIpKS50aGVuKGZ1bmN0aW9uKHEpe2lmKCFxLm5vZGUpdGhyb3cgRXJyb3IoIlRoZSBncmFwaCBpcyBlbXB0eS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gVGVuc29yRmxvdyBjb3VsZCBub3QgdHJhY2UgYW55IGdyYXBoLiBQbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5NjEgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7CnJldHVybiBkLmJ1aWxkKHEsZC5EZWZhdWx0QnVpbGRQYXJhbXMsbSl9LCgpPT57dGhyb3cgRXJyb3IoIk1hbGZvcm1lZCBHcmFwaERlZi4gVGhpcyBjYW4gc29tZXRpbWVzIGJlIGNhdXNlZCBieSBhIGJhZCBuZXR3b3JrIGNvbm5lY3Rpb24gb3IgZGlmZmljdWx0eSByZWNvbmNpbGluZyBtdWx0aXBsZSBHcmFwaERlZnM7IGZvciB0aGUgbGF0dGVyIGNhc2UsIHBsZWFzZSByZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTkyOS4iKTt9KS50aGVuKHE9PlVpKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtkLm9wLmNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eShxLGwpO2NvbnN0IHU9eWllbGQgZC5oaWVyYXJjaHkuYnVpbGQocSxwLG4pO3JldHVybntncmFwaDpxLGdyYXBoSGllcmFyY2h5OnV9fSkpLmNhdGNoKHE9PntoLnJlcG9ydEVycm9yKGBHcmFwaCB2aXN1YWxpemF0aW9uIGZhaWxlZC5cblxuJHtxfWAscSk7dGhyb3cgcTsKfSl9fSkoZC5sb2FkZXJ8fChkLmxvYWRlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbm9kZS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXsoZnVuY3Rpb24oaCl7ZnVuY3Rpb24gayhaLGJhLGVhKXtpZihiYS5ub2RlLmlzR3JvdXBOb2RlKXtpZihiYS5leHBhbmRlZClyZXR1cm4gZi5idWlsZEdyb3VwKFosYmEsZWEsZi5DbGFzcy5TdWJzY2VuZS5HUk9VUCk7Zi5zZWxlY3RDaGlsZChaLCJnIixmLkNsYXNzLlN1YnNjZW5lLkdST1VQKS5yZW1vdmUoKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB0KFosYmEpe2xldCBlYT1iYS54LWJhLndpZHRoLzIrYmEucGFkZGluZ0xlZnQ7YmE9YmEueS1iYS5oZWlnaHQvMitiYS5wYWRkaW5nVG9wO1o9Zi5zZWxlY3RDaGlsZChaLCJnIixmLkNsYXNzLlN1YnNjZW5lLkdST1VQKTtmLnRyYW5zbGF0ZShaLGVhLGJhKX1mdW5jdGlvbiBsKFosYmEsZWEpe1o9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImciLGYuQ2xhc3MuTm9kZS5CVVRUT05fQ09OVEFJTkVSKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwiY2lyY2xlIixmLkNsYXNzLk5vZGUuQlVUVE9OX0NJUkNMRSk7CmYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJwYXRoIixmLkNsYXNzLk5vZGUuRVhQQU5EX0JVVFRPTikuYXR0cigiZCIsIk0wLC0yLjIgVjIuMiBNLTIuMiwwIEgyLjIiKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwicGF0aCIsZi5DbGFzcy5Ob2RlLkNPTExBUFNFX0JVVFRPTikuYXR0cigiZCIsIk0tMi4yLDAgSDIuMiIpO1oub24oImNsaWNrIixjYT0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2VhLmZpcmUoIm5vZGUtdG9nZ2xlLWV4cGFuZCIse25hbWU6Y2Eubm9kZS5uYW1lfSl9KTtmLnBvc2l0aW9uQnV0dG9uKFosYmEpfWZ1bmN0aW9uIHAoWixiYSxlYSxjYSl7aWYoY2EpWi5hdHRyKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKTtlbHNle3ZhciBrYT1mLmNvbnRleHRtZW51LmdldE1lbnUoZWEsbShiYS5ub2RlLGVhKSk7Wi5vbigiZGJsY2xpY2siLFk9PntlYS5maXJlKCJub2RlLXRvZ2dsZS1leHBhbmQiLHtuYW1lOlkubm9kZS5uYW1lfSl9KS5vbigibW91c2VvdmVyIiwKWT0+e2VhLmlzTm9kZUV4cGFuZGVkKFkpfHxlYS5maXJlKCJub2RlLWhpZ2hsaWdodCIse25hbWU6WS5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW91dCIsWT0+e2VhLmlzTm9kZUV4cGFuZGVkKFkpfHxlYS5maXJlKCJub2RlLXVuaGlnaGxpZ2h0Iix7bmFtZTpZLm5vZGUubmFtZX0pfSkub24oImNsaWNrIixZPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ZWEuZmlyZSgibm9kZS1zZWxlY3QiLHtuYW1lOlkubm9kZS5uYW1lfSl9KS5vbigiY29udGV4dG1lbnUiLChZLEVhKT0+e2VhLmZpcmUoIm5vZGUtc2VsZWN0Iix7bmFtZTpZLm5vZGUubmFtZX0pO2thLmNhbGwoWSxFYSl9KX19ZnVuY3Rpb24gbShaLGJhKXtsZXQgZWE9W3t0aXRsZTooKT0+ZC5nZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZyhaLmluY2x1ZGUpLGFjdGlvbjooKT0+e2JhLmZpcmUoIm5vZGUtdG9nZ2xlLWV4dHJhY3QiLHtuYW1lOloubmFtZX0pfX1dO2JhLm5vZGVDb250ZXh0TWVudUl0ZW1zJiYoZWE9ZWEuY29uY2F0KGJhLm5vZGVDb250ZXh0TWVudUl0ZW1zKSk7Cm4oWikmJmVhLnB1c2goe3RpdGxlOigpPT54KFopLGFjdGlvbjooKT0+e2JhLmZpcmUoIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIix7bmFtZTpxKFopfSl9fSk7cmV0dXJuIGVhfWZ1bmN0aW9uIG4oWil7cmV0dXJuIG51bGwhPT1xKFopfWZ1bmN0aW9uIHEoWil7cmV0dXJuIFo/Wi50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/Wi5uYW1lOloudHlwZT09PWQuTm9kZVR5cGUuT1A/Wi5vd25pbmdTZXJpZXM6bnVsbDpudWxsfWZ1bmN0aW9uIHUoWil7bGV0IGJhPW51bGw7aWYoIVopcmV0dXJuIG51bGw7Wi50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/YmE9WjpaLnBhcmVudE5vZGUmJloucGFyZW50Tm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMmJihiYT1aLnBhcmVudE5vZGUpO3JldHVybiBiYX1mdW5jdGlvbiB4KFope3JldHVybiBiLmdyYXBoLmdldEdyb3VwU2VyaWVzTm9kZUJ1dHRvblN0cmluZyhudWxsIT09dShaKT9iLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUDoKYi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCl9ZnVuY3Rpb24gQShaLGJhLGVhKXt2YXIgY2E9YmEuZGlzcGxheU5hbWU7bGV0IGthPWJhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQSYmIWJhLmV4cGFuZGVkO1o9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInRleHQiLGYuQ2xhc3MuTm9kZS5MQUJFTCk7bGV0IFk9Wi5ub2RlKCk7WS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKFkpO1ouYXR0cigiZHkiLCIuMzVlbSIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIik7a2EmJihjYS5sZW5ndGg+ZWEubWF4TWV0YW5vZGVMYWJlbExlbmd0aCYmKGNhPWNhLnN1YnN0cigwLGVhLm1heE1ldGFub2RlTGFiZWxMZW5ndGgtMikrIi4uLiIpLGVhPXcoZWEpLFouYXR0cigiZm9udC1zaXplIixlYShjYS5sZW5ndGgpKyJweCIpKTtjYT1aLnRleHQoY2EpO3koY2EsYmEubm9kZS50eXBlLGJhKTtyZXR1cm4gWn1mdW5jdGlvbiB5KFosYmEsZWEpe2xldCBjYT1aLm5vZGUoKTt2YXIga2E9CmNhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO2xldCBZPWNhLnRleHRDb250ZW50LEVhPW51bGw7c3dpdGNoKGJhKXtjYXNlIGQuTm9kZVR5cGUuTUVUQTplYSYmIWVhLmV4cGFuZGVkJiYoRWE9ZC5sYXlvdXQuUEFSQU1TLm5vZGVTaXplLm1ldGEubWF4TGFiZWxXaWR0aCk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLk9QOkVhPWQubGF5b3V0LlBBUkFNUy5ub2RlU2l6ZS5vcC5tYXhMYWJlbFdpZHRoO2JyZWFrO2Nhc2UgLTE6RWE9ZC5sYXlvdXQuUEFSQU1TLmFubm90YXRpb25zLm1heExhYmVsV2lkdGh9aWYoIShudWxsPT09RWF8fGthPD1FYSkpe2ZvcihrYT0xO2NhLmdldFN1YlN0cmluZ0xlbmd0aCgwLGthKTxFYTspa2ErKztiYT1jYS50ZXh0Q29udGVudC5zdWJzdHIoMCxrYSk7ZG8gYmE9YmEuc3Vic3RyKDAsYmEubGVuZ3RoLTEpLGNhLnRleHRDb250ZW50PWJhKyIuLi4iLGthPWNhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO3doaWxlKGthPkVhJiYwPGJhLmxlbmd0aCk7cmV0dXJuIFouYXBwZW5kKCJ0aXRsZSIpLnRleHQoWSl9fQpmdW5jdGlvbiB3KFope2FhfHwoYWE9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW1oubWF4TWV0YW5vZGVMYWJlbExlbmd0aExhcmdlRm9udCxaLm1heE1ldGFub2RlTGFiZWxMZW5ndGhdKS5yYW5nZShbWi5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemUsWi5taW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemVdKS5jbGFtcCghMCkpO3JldHVybiBhYX1mdW5jdGlvbiBDKFosYmEsZWEsY2Epe2Yuc2VsZWN0Q2hpbGQoWiwidGV4dCIsZi5DbGFzcy5Ob2RlLkxBQkVMKS50cmFuc2l0aW9uKCkuYXR0cigieCIsYmEpLmF0dHIoInkiLGVhK2NhKX1mdW5jdGlvbiBHKFosYmEsZWEpe1o9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImciLGVhKTtzd2l0Y2goYmEubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuT1A6YmE9YmEubm9kZTtpZihfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uSW5wdXRJbmRleCl8fF8uaXNOdW1iZXIoYmEuZnVuY3Rpb25PdXRwdXRJbmRleCkpe2Yuc2VsZWN0T3JDcmVhdGVDaGlsZChaLAoicG9seWdvbiIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCk7YnJlYWt9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImVsbGlwc2UiLGYuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6ZWE9ImFubm90YXRpb24iO2JhLmNvcmVHcmFwaCYmKGVhPWJhLm5vZGUuaGFzTm9uQ29udHJvbEVkZ2VzPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiKTtsZXQgY2E9W2YuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVRdO2JhLmlzRmFkZWRPdXQmJmNhLnB1c2goImZhZGVkLWVsbGlwc2UiKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwidXNlIixjYSkuYXR0cigieGxpbms6aHJlZiIsIiNvcC1zZXJpZXMtIitlYSsiLXN0YW1wIik7Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInJlY3QiLGYuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpLmF0dHIoInJ4IixiYS5yYWRpdXMpLmF0dHIoInJ5IixiYS5yYWRpdXMpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosCiJyZWN0IixmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKS5hdHRyKCJyeCIsYmEucmFkaXVzKS5hdHRyKCJyeSIsYmEucmFkaXVzKTticmVhaztjYXNlIGQuTm9kZVR5cGUuTUVUQTpmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwicmVjdCIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLGJhLnJhZGl1cykuYXR0cigicnkiLGJhLnJhZGl1cyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitiYS5ub2RlLnR5cGUpO31yZXR1cm4gWn1mdW5jdGlvbiBEKFope3N3aXRjaChaLm5vZGUudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk9QOnJldHVybiBmLkNsYXNzLk9QTk9ERTtjYXNlIGQuTm9kZVR5cGUuTUVUQTpyZXR1cm4gZi5DbGFzcy5NRVRBTk9ERTtjYXNlIGQuTm9kZVR5cGUuU0VSSUVTOnJldHVybiBmLkNsYXNzLlNFUklFU05PREU7Y2FzZSBkLk5vZGVUeXBlLkJSSURHRTpyZXR1cm4gZi5DbGFzcy5CUklER0VOT0RFO2Nhc2UgZC5Ob2RlVHlwZS5FTExJUFNJUzpyZXR1cm4gZi5DbGFzcy5FTExJUFNJU05PREV9dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrCloubm9kZS50eXBlKTt9ZnVuY3Rpb24gQihaLGJhKXt2YXIgZWE9Zi5zZWxlY3RDaGlsZChaLCJnIixmLkNsYXNzLk5vZGUuU0hBUEUpO2xldCBjYT1kLmxheW91dC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKGJhKTtzd2l0Y2goYmEubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuT1A6e2NvbnN0IGthPWJhLm5vZGU7Xy5pc051bWJlcihrYS5mdW5jdGlvbklucHV0SW5kZXgpfHxfLmlzTnVtYmVyKGthLmZ1bmN0aW9uT3V0cHV0SW5kZXgpPyhlYT1mLnNlbGVjdENoaWxkKGVhLCJwb2x5Z29uIiksZi5wb3NpdGlvblRyaWFuZ2xlKGVhLGJhLngsYmEueSxiYS5jb3JlQm94LndpZHRoLGJhLmNvcmVCb3guaGVpZ2h0KSk6KGVhPWYuc2VsZWN0Q2hpbGQoZWEsImVsbGlwc2UiKSxmLnBvc2l0aW9uRWxsaXBzZShlYSxjYSxiYS55LGJhLmNvcmVCb3gud2lkdGgsYmEuY29yZUJveC5oZWlnaHQpKTtDKFosY2EsYmEueSxiYS5sYWJlbE9mZnNldCk7YnJlYWt9Y2FzZSBkLk5vZGVUeXBlLk1FVEE6ZWE9CmVhLnNlbGVjdEFsbCgicmVjdCIpO2JhLmV4cGFuZGVkPyhmLnBvc2l0aW9uUmVjdChlYSxiYS54LGJhLnksYmEud2lkdGgsYmEuaGVpZ2h0KSx0KFosYmEpLEMoWixjYSxiYS55LC1iYS5oZWlnaHQvMitiYS5sYWJlbEhlaWdodC8yKSk6KGYucG9zaXRpb25SZWN0KGVhLGNhLGJhLnksYmEuY29yZUJveC53aWR0aCxiYS5jb3JlQm94LmhlaWdodCksQyhaLGNhLGJhLnksMCkpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6ZWE9Zi5zZWxlY3RDaGlsZChlYSwidXNlIik7YmEuZXhwYW5kZWQ/KGYucG9zaXRpb25SZWN0KGVhLGJhLngsYmEueSxiYS53aWR0aCxiYS5oZWlnaHQpLHQoWixiYSksQyhaLGNhLGJhLnksLWJhLmhlaWdodC8yK2JhLmxhYmVsSGVpZ2h0LzIpKTooZi5wb3NpdGlvblJlY3QoZWEsY2EsYmEueSxiYS5jb3JlQm94LndpZHRoLGJhLmNvcmVCb3guaGVpZ2h0KSxDKFosY2EsYmEueSxiYS5sYWJlbE9mZnNldCkpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6Wj0KZi5zZWxlY3RDaGlsZChlYSwicmVjdCIpO2YucG9zaXRpb25SZWN0KFosYmEueCxiYS55LGJhLndpZHRoLGJhLmhlaWdodCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitiYS5ub2RlLnR5cGUpO319ZnVuY3Rpb24gSShaLGJhLGVhKXtsZXQgY2E9Yi5ncmFwaC51dGlsLmVzY2FwZVF1ZXJ5U2VsZWN0b3IoWik7aWYoIWVhKXJldHVybmB1cmwoIyR7Y2F9KWA7ZWE9ZDMuc2VsZWN0KGVhKTtsZXQga2E9ZWEuc2VsZWN0KCJkZWZzI19ncmFwaC1ncmFkaWVudHMiKTtrYS5lbXB0eSgpJiYoa2E9ZWEuYXBwZW5kKCJkZWZzIikuYXR0cigiaWQiLCJfZ3JhcGgtZ3JhZGllbnRzIikpO2xldCBZPWthLnNlbGVjdCgibGluZWFyR3JhZGllbnQjIitjYSk7aWYoWS5lbXB0eSgpKXtZPWthLmFwcGVuZCgibGluZWFyR3JhZGllbnQiKS5hdHRyKCJpZCIsWik7WS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtsZXQgRWE9MDtfLmVhY2goYmEsdmE9PntsZXQgeGE9CnZhLmNvbG9yO1kuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixFYSkuYXR0cigic3RvcC1jb2xvciIseGEpO1kuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixFYSt2YS5wcm9wb3J0aW9uKS5hdHRyKCJzdG9wLWNvbG9yIix4YSk7RWErPXZhLnByb3BvcnRpb259KX1yZXR1cm5gdXJsKCMke2NhfSlgfWZ1bmN0aW9uIE4oWixiYSxlYSxjYSxrYSl7bGV0IFk9ZC5yZW5kZXIuTWV0YW5vZGVDb2xvcnM7c3dpdGNoKGJhKXtjYXNlIGxhLlNUUlVDVFVSRTpyZXR1cm4gZWEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBPyhiYT1lYS5ub2RlLnRlbXBsYXRlSWQsbnVsbD09PWJhP1kuVU5LTk9XTjpZLlNUUlVDVFVSRV9QQUxFVFRFKFooYmEpLGNhKSk6ZWEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/Y2E/WS5FWFBBTkRFRF9DT0xPUjoid2hpdGUiOmVhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuQlJJREdFP2VhLnN0cnVjdHVyYWw/IiNmMGUiOmVhLm5vZGUuaW5ib3VuZD8KIiMwZWYiOiIjZmUwIjpfLmlzTnVtYmVyKGVhLm5vZGUuZnVuY3Rpb25JbnB1dEluZGV4KT8iIzc5NTU0OCI6Xy5pc051bWJlcihlYS5ub2RlLmZ1bmN0aW9uT3V0cHV0SW5kZXgpPyIjMDA5Njg4Ijoid2hpdGUiO2Nhc2UgbGEuREVWSUNFOnJldHVybiBudWxsPT1lYS5kZXZpY2VDb2xvcnM/WS5VTktOT1dOOmNhP1kuRVhQQU5ERURfQ09MT1I6SSgiZGV2aWNlLSIrZWEubm9kZS5uYW1lLGVhLmRldmljZUNvbG9ycyxrYSk7Y2FzZSBsYS5YTEFfQ0xVU1RFUjpyZXR1cm4gbnVsbD09ZWEueGxhQ2x1c3RlckNvbG9ycz9ZLlVOS05PV046Y2E/WS5FWFBBTkRFRF9DT0xPUjpJKCJ4bGEtIitlYS5ub2RlLm5hbWUsZWEueGxhQ2x1c3RlckNvbG9ycyxrYSk7Y2FzZSBsYS5DT01QVVRFX1RJTUU6cmV0dXJuIGNhP1kuRVhQQU5ERURfQ09MT1I6ZWEuY29tcHV0ZVRpbWVDb2xvcnx8WS5VTktOT1dOO2Nhc2UgbGEuTUVNT1JZOnJldHVybiBjYT9ZLkVYUEFOREVEX0NPTE9SOmVhLm1lbW9yeUNvbG9yfHwKWS5VTktOT1dOO2Nhc2UgbGEuT1BfQ09NUEFUSUJJTElUWTpyZXR1cm4gbnVsbD09ZWEuY29tcGF0aWJpbGl0eUNvbG9ycz9ZLlVOS05PV046Y2E/WS5FWFBBTkRFRF9DT0xPUjpJKCJvcC1jb21wYXQtIitlYS5ub2RlLm5hbWUsZWEuY29tcGF0aWJpbGl0eUNvbG9ycyxrYSk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5rbm93biBjYXNlIHRvIGNvbG9yIG5vZGVzIGJ5Iik7fX1mdW5jdGlvbiBPKFosYmEsZWEsY2Epe2NhPWNhfHxmLkNsYXNzLk5vZGUuU0hBUEU7bGV0IGthPWVhLmlzTm9kZVNlbGVjdGVkKGJhLm5vZGUubmFtZSksWT1iYS5pc0luRXh0cmFjdHx8YmEuaXNPdXRFeHRyYWN0fHxiYS5pc0xpYnJhcnlGdW5jdGlvbixFYT1iYS5leHBhbmRlZCYmY2EhPT1mLkNsYXNzLkFubm90YXRpb24uTk9ERSx2YT1iYS5pc0ZhZGVkT3V0O1ouY2xhc3NlZCgiaGlnaGxpZ2h0ZWQiLGVhLmlzTm9kZUhpZ2hsaWdodGVkKGJhLm5vZGUubmFtZSkpO1ouY2xhc3NlZCgic2VsZWN0ZWQiLGthKTsKWi5jbGFzc2VkKCJleHRyYWN0IixZKTtaLmNsYXNzZWQoImV4cGFuZGVkIixFYSk7Wi5jbGFzc2VkKCJmYWRlZCIsdmEpO1o9Wi5zZWxlY3QoIi4iK2NhKyIgLiIrZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCk7YmE9TihlYS50ZW1wbGF0ZUluZGV4LGxhW2VhLmNvbG9yQnkudG9VcHBlckNhc2UoKV0sYmEsRWEsZWEuZ2V0R3JhcGhTdmdSb290KCkpO1ouc3R5bGUoImZpbGwiLGJhKTtaLnN0eWxlKCJzdHJva2UiLGthP251bGw6SChiYSkpfWZ1bmN0aW9uIEgoWil7cmV0dXJuInVybCI9PT1aLnN1YnN0cmluZygwLDMpP2QucmVuZGVyLk1ldGFub2RlQ29sb3JzLkdSQURJRU5UX09VVExJTkU6ZDMucmdiKFopLmRhcmtlcigpLnRvU3RyaW5nKCl9ZnVuY3Rpb24gSyhaLGJhKXtsZXQgZWE9W107Wj1iYS5nZXROb2RlQnlOYW1lKFopO2lmKFogaW5zdGFuY2VvZiBiLmdyYXBoLk9wTm9kZUltcGwpcmV0dXJuW1pdLmNvbmNhdChaLmluRW1iZWRkaW5ncyk7Wj1aLm1ldGFncmFwaC5ub2RlcygpOwpfLmVhY2goWixmdW5jdGlvbihjYSl7ZWE9ZWEuY29uY2F0KEsoY2EsYmEpKX0pO3JldHVybiBlYX1mdW5jdGlvbiBNKFosYmEsZWEsY2Epe2lmKGNhW2VhLm5hbWVdKXJldHVybiBjYTtjYVtlYS5uYW1lXT0hMDt2YXIga2E9ZWEuaW5wdXRzO2xldCBZPVgoYmEsZWEpO2QzLnNlbGVjdChaKS5zZWxlY3QoYC5ub2RlW2RhdGEtbmFtZT0iJHtZLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiLCEwKTtsZXQgRWE9e307Xy5lYWNoKGthLGZ1bmN0aW9uKEFhKXtBYT1iYS5nZXROb2RlQnlOYW1lKEFhLm5hbWUpO2lmKHZvaWQgMCE9PUFhKXtBYSBpbnN0YW5jZW9mIGQuTWV0YW5vZGVJbXBsJiYoQWE9Yi5ncmFwaC5nZXRTdHJpY3ROYW1lKEFhLm5hbWUpLEFhPWJhLmdldE5vZGVCeU5hbWUoQWEpKTt2YXIgRmE9WChiYSxBYSkseWE9RWFbRmEubmFtZV07eWE/eWEub3BOb2Rlcy5wdXNoKEFhKTpFYVtGYS5uYW1lXT17dmlzaWJsZVBhcmVudDpGYSxvcE5vZGVzOltBYV19fX0pOwpsZXQgdmE9e30seGE9W1ldO3ZhW1kubmFtZV09e3RyYWNlZDohMSxpbmRleDowLGNvbm5lY3Rpb25FbmRwb2ludHM6W119O2VhPVk7Zm9yKGthPTE7ZWEubmFtZSE9PWIuZ3JhcGguUk9PVF9OQU1FO2thKyspZWE9ZWEucGFyZW50Tm9kZSx2YVtlYS5uYW1lXT17dHJhY2VkOiExLGluZGV4OmthLGNvbm5lY3Rpb25FbmRwb2ludHM6W119LHhhW2thXT1lYTtfLmZvck93bihFYSxmdW5jdGlvbihBYSl7bGV0IEZhPUFhLnZpc2libGVQYXJlbnQ7Xy5lYWNoKEFhLm9wTm9kZXMsZnVuY3Rpb24oeWEpe2NhPU0oWixiYSx5YSxjYSl9KTtGYS5uYW1lIT09WS5uYW1lJiZMKFosRmEsdmEseGEpfSk7cmV0dXJuIGNhfWZ1bmN0aW9uIEwoWixiYSxlYSxjYSl7dmFyIGthPWJhLFk9YmE7Zm9yKGJhPVtdOyFlYVtrYS5uYW1lXTspWS5uYW1lIT09a2EubmFtZSYmYmEucHVzaChbWSxrYV0pLFk9a2Esa2E9a2EucGFyZW50Tm9kZTtlYT1lYVtrYS5uYW1lXS5pbmRleDtsZXQgRWE9Y2FbTWF0aC5tYXgoZWEtCjEsMCldLm5hbWU7WT1rYT1ZLm5hbWU7Y29uc3QgdmE9ZDMuc2VsZWN0KFopO3ZhLnNlbGVjdEFsbChgW2RhdGEtZWRnZT0iJHtZfS0tJHtFYX0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCk7Xy5lYWNoKGJhLGZ1bmN0aW9uKHhhKXt2YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7eGFbMF0ubmFtZX0tLSR7RWF9YCtgfn4ke3hhWzFdLm5hbWV9fn5PVVQiXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9KTtmb3IoWj0xO1o8ZWE7WisrKXZhLnNlbGVjdEFsbChgW2RhdGEtZWRnZT0iJHtrYX1+fiR7Y2FbWl0ubmFtZX1gK2B+fklOLS0ke2NhW1otMV0ubmFtZX0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9ZnVuY3Rpb24gUShaLGJhKXtsZXQgZWE9e307Xy5lYWNoKGJhLGZ1bmN0aW9uKGNhKXtjYT1aLmdldE5vZGVCeU5hbWUoY2EpO2NhPVgoWixjYSk7ZWFbY2EubmFtZV09Y2F9KTtyZXR1cm4gZWF9ZnVuY3Rpb24gVChaLApiYSl7Xy5mb3JPd24oYmEsZnVuY3Rpb24oZWEpe2Zvcig7ZWEubmFtZSE9PWIuZ3JhcGguUk9PVF9OQU1FOyl7Y29uc3QgY2E9ZDMuc2VsZWN0KFopLnNlbGVjdChgLm5vZGVbZGF0YS1uYW1lPSIke2VhLm5hbWV9Il1gKTshY2Eubm9kZXMoKS5sZW5ndGh8fGNhLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIpfHxjYS5jbGFzc2VkKCJzZWxlY3RlZCIpfHxjYS5jbGFzc2VkKCJvcCIpfHxjYS5jbGFzc2VkKCJpbnB1dC1wYXJlbnQiLCEwKTtlYT1lYS5wYXJlbnROb2RlfX0pfWZ1bmN0aW9uIFgoWixiYSl7bGV0IGVhPSExLGNhPWJhO2Zvcig7IWVhOylpZihiYT1jYSxjYT1iYS5wYXJlbnROb2RlLHZvaWQgMD09PWNhKWVhPSEwO2Vsc2V7bGV0IGthPVouZ2V0UmVuZGVyTm9kZUJ5TmFtZShjYS5uYW1lKTtrYSYmKGthLmV4cGFuZGVkfHxjYSBpbnN0YW5jZW9mIGQuT3BOb2RlSW1wbCkmJihlYT0hMCl9cmV0dXJuIGJhfWguYnVpbGRHcm91cD1mdW5jdGlvbihaLGJhLGVhKXtaPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLAoiZyIsZi5DbGFzcy5Ob2RlLkNPTlRBSU5FUikuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEoYmEsY2E9PmNhLm5vZGUubmFtZSsiOiIrY2Eubm9kZS50eXBlKTtaLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIixjYT0+Y2Eubm9kZS5uYW1lKS5lYWNoKGZ1bmN0aW9uKGNhKXtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpO2VhLmFkZE5vZGVHcm91cChjYS5ub2RlLm5hbWUsa2EpfSkubWVyZ2UoWikuYXR0cigiY2xhc3MiLGNhPT5mLkNsYXNzLk5vZGUuR1JPVVArIiAiK0QoY2EpKS5lYWNoKGZ1bmN0aW9uKGNhKXtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpO3ZhciBZPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChrYSwiZyIsZi5DbGFzcy5Bbm5vdGF0aW9uLklOQk9YKTtmLmFubm90YXRpb24uYnVpbGRHcm91cChZLGNhLmluQW5ub3RhdGlvbnMsY2EsZWEpO1k9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKGthLCJnIixmLkNsYXNzLkFubm90YXRpb24uT1VUQk9YKTsKZi5hbm5vdGF0aW9uLmJ1aWxkR3JvdXAoWSxjYS5vdXRBbm5vdGF0aW9ucyxjYSxlYSk7WT1HKGthLGNhLGYuQ2xhc3MuTm9kZS5TSEFQRSk7Y2Eubm9kZS5pc0dyb3VwTm9kZSYmbChZLGNhLGVhKTtwKFksY2EsZWEpO2soa2EsY2EsZWEpO1k9QShrYSxjYSxlYSk7cChZLGNhLGVhLGNhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQSk7TyhrYSxjYSxlYSk7QihrYSxjYSl9KTtaLmV4aXQoKS5lYWNoKGZ1bmN0aW9uKGNhKXtlYS5yZW1vdmVOb2RlR3JvdXAoY2Eubm9kZS5uYW1lKTtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpOzA8Y2EuaW5Bbm5vdGF0aW9ucy5saXN0Lmxlbmd0aCYma2Euc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uSU5CT1gpLnNlbGVjdEFsbCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLkdST1VQKS5lYWNoKFk9PntlYS5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoWSxjYSl9KTswPGNhLm91dEFubm90YXRpb25zLmxpc3QubGVuZ3RoJiZrYS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5PVVRCT1gpLnNlbGVjdEFsbCgiLiIrCmYuQ2xhc3MuQW5ub3RhdGlvbi5HUk9VUCkuZWFjaChZPT57ZWEucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKFksY2EpfSl9KS5yZW1vdmUoKTtyZXR1cm4gWn07aC5nZXRDb250ZXh0TWVudT1tO2guY2FuQmVJblNlcmllcz1uO2guZ2V0U2VyaWVzTmFtZT1xO2guZ2V0R3JvdXBTZXR0aW5nTGFiZWw9eDtoLmVuZm9yY2VMYWJlbFdpZHRoPXk7bGV0IGFhPW51bGw7aC5idWlsZFNoYXBlPUc7aC5ub2RlQ2xhc3M9RDtsZXQgbGE7KGZ1bmN0aW9uKFope1pbWi5TVFJVQ1RVUkU9MF09IlNUUlVDVFVSRSI7WltaLkRFVklDRT0xXT0iREVWSUNFIjtaW1ouWExBX0NMVVNURVI9Ml09IlhMQV9DTFVTVEVSIjtaW1ouQ09NUFVURV9USU1FPTNdPSJDT01QVVRFX1RJTUUiO1pbWi5NRU1PUlk9NF09Ik1FTU9SWSI7WltaLk9QX0NPTVBBVElCSUxJVFk9NV09Ik9QX0NPTVBBVElCSUxJVFkifSkobGE9aC5Db2xvckJ5fHwoaC5Db2xvckJ5PXt9KSk7aC5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zPWZ1bmN0aW9uKFope2QzLnNlbGVjdChaKS5zZWxlY3QoImRlZnMjX2dyYXBoLWdyYWRpZW50cyIpLnJlbW92ZSgpfTsKaC5nZXRGaWxsRm9yTm9kZT1OO2guc3R5bGl6ZT1PO2guZ2V0U3Ryb2tlRm9yRmlsbD1IO2gudXBkYXRlSW5wdXRUcmFjZT1mdW5jdGlvbihaLGJhLGVhLGNhKXtjb25zdCBrYT1kMy5zZWxlY3QoWik7a2Euc2VsZWN0QWxsKCIuaW5wdXQtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0IiwhMSk7a2Euc2VsZWN0QWxsKCIubm9uLWlucHV0IikuY2xhc3NlZCgibm9uLWlucHV0IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtcGFyZW50IikuY2xhc3NlZCgiaW5wdXQtcGFyZW50IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtY2hpbGQiKS5jbGFzc2VkKCJpbnB1dC1jaGlsZCIsITEpO2thLnNlbGVjdEFsbCgiLmlucHV0LWVkZ2UtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKTtrYS5zZWxlY3RBbGwoIi5ub24taW5wdXQtZWRnZS1oaWdobGlnaHQiKS5jbGFzc2VkKCJub24taW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKTtrYS5zZWxlY3RBbGwoIi5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQiKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQiLAohMSk7aWYoYmEmJmNhJiZlYSl7ZWE9SyhlYSxiYSk7dmFyIFk9e307Xy5lYWNoKGVhLGZ1bmN0aW9uKEVhKXtZPU0oWixiYSxFYSxZKX0pO2VhPU9iamVjdC5rZXlzKFkpO2VhPVEoYmEsZWEpO1QoWixlYSk7a2Euc2VsZWN0QWxsKCJnLm5vZGU6bm90KC5zZWxlY3RlZCk6bm90KC5pbnB1dC1oaWdobGlnaHQpOm5vdCguaW5wdXQtcGFyZW50KTpub3QoLmlucHV0LWNoaWxkcmVuKSIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITApLmVhY2goZnVuY3Rpb24oRWEpe2thLnNlbGVjdEFsbChgW2RhdGEtbmFtZT0iJHtFYS5ub2RlLm5hbWV9Il1gKS5jbGFzc2VkKCJub24taW5wdXQiLCEwKX0pO2thLnNlbGVjdEFsbCgiZy5lZGdlOm5vdCguaW5wdXQtZWRnZS1oaWdobGlnaHQpIikuY2xhc3NlZCgibm9uLWlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9fTtoLmdldFZpc2libGVQYXJlbnQ9WH0pKGYubm9kZXx8KGYubm9kZT17fSkpfSkoZC5zY2VuZXx8KGQuc2NlbmU9e30pKX0pKGIuZ3JhcGh8fAooYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9vcC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjbGFzcyBoe2lzTm90VHB1T3Aoayl7cmV0dXJuLTEhPWsudG9Mb3dlckNhc2UoKS5zZWFyY2goImNwdToiKXx8LTEhPWsudG9Mb3dlckNhc2UoKS5zZWFyY2goImdwdToiKT8hMDotMT09ay50b0xvd2VyQ2FzZSgpLnNlYXJjaCgidHB1Iil9b3BWYWxpZChrKXtyZXR1cm4gMD09ay5uYW1lLnNlYXJjaChkLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpfHwhay5vcHx8ay5kZXZpY2UmJnRoaXMuaXNOb3RUcHVPcChrLmRldmljZSl8fGsuZGV2aWNlJiYtMSE9ay5kZXZpY2Uuc2VhcmNoKCJUUFVfU1lTVEVNIik/ITA6Xy5pbmNsdWRlcyhoLldISVRFTElTVCxrLm9wKX19aC5XSElURUxJU1Q9IkFicyBBY29zIEFjb3NoIEFkZCBBZGROIEFkanVzdENvbnRyYXN0djIgQWRqdXN0SHVlIEFkanVzdFNhdHVyYXRpb24gQWxsIEFuZ2xlIEFueSBBcHByb3hpbWF0ZUVxdWFsIEFyZ01heCBBcmdNaW4gQXNpbiBBc2luaCBBc3NlcnQgQXNzaWduQWRkVmFyaWFibGVPcCBBc3NpZ25TdWJWYXJpYWJsZU9wIEFzc2lnblZhcmlhYmxlT3AgQXRhbiBBdGFuMiBBdGFuaCBBdmdQb29sIEF2Z1Bvb2wzRCBBdmdQb29sM0RHcmFkIEF2Z1Bvb2xHcmFkIEJhdGNoTWF0TXVsIEJhdGNoVG9TcGFjZSBCYXRjaFRvU3BhY2VORCBCaWFzQWRkIEJpYXNBZGRHcmFkIEJpYXNBZGRWMSBCaXRjYXN0IEJpdHdpc2VBbmQgQml0d2lzZU9yIEJpdHdpc2VYb3IgQnJvYWRjYXN0QXJncyBCcm9hZGNhc3RHcmFkaWVudEFyZ3MgQnVja2V0aXplIENhc3QgQ2VpbCBDaGVja051bWVyaWNzIENob2xlc2t5IENsaXBCeVZhbHVlIENvbXBsZXggQ29tcGxleEFicyBDb25jYXQgQ29uY2F0T2Zmc2V0IENvbmNhdFYyIENvbmogQ29uanVnYXRlVHJhbnNwb3NlIENvbnN0IENvbnRyb2xUcmlnZ2VyIENvbnYyRCBDb252MkRCYWNrcHJvcEZpbHRlciBDb252MkRCYWNrcHJvcElucHV0IENvbnYzRCBDb252M0RCYWNrcHJvcEZpbHRlclYyIENvbnYzREJhY2twcm9wSW5wdXRWMiBDb3MgQ29zaCBDcm9zcyBDcm9zc1JlcGxpY2FTdW0gQ3VtcHJvZCBDdW1zdW0gRGVwdGhUb1NwYWNlIERlcHRod2lzZUNvbnYyZE5hdGl2ZSBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0IERpYWcgRGlhZ1BhcnQgRGlnYW1tYSBEaXYgRHluYW1pY1N0aXRjaCBFbHUgRWx1R3JhZCBFbXB0eSBFcXVhbCBFcmYgRXJmYyBFeHAgRXhwYW5kRGltcyBFeHBtMSBFeHRyYWN0SW1hZ2VQYXRjaGVzIEZGVCBGRlQyRCBGRlQzRCBGYWtlUXVhbnRXaXRoTWluTWF4QXJncyBGYWtlUXVhbnRXaXRoTWluTWF4QXJnc0dyYWRpZW50IEZha2VRdWFudFdpdGhNaW5NYXhWYXJzIEZha2VRdWFudFdpdGhNaW5NYXhWYXJzR3JhZGllbnQgRmlsbCBGbG9vciBGbG9vckRpdiBGbG9vck1vZCBGdXNlZEJhdGNoTm9ybSBGdXNlZEJhdGNoTm9ybUdyYWQgRnVzZWRCYXRjaE5vcm1HcmFkVjIgRnVzZWRCYXRjaE5vcm1WMiBHYXRoZXIgR2F0aGVyTmQgR2F0aGVyVjIgR2V0SXRlbSBHcmVhdGVyIEdyZWF0ZXJFcXVhbCBIU1ZUb1JHQiBJRkZUIElGRlQyRCBJRkZUM0QgSVJGRlQgSVJGRlQyRCBJUkZGVDNEIElkZW50aXR5IElkZW50aXR5TiBJZiBJbWFnIEluZmVlZERlcXVldWUgSW5mZWVkRGVxdWV1ZVR1cGxlIElucGxhY2VBZGQgSW5wbGFjZVVwZGF0ZSBJbnYgSW52ZXJ0IEludmVydFBlcm11dGF0aW9uIElzRmluaXRlIElzSW5mIElzTmFuIEwyTG9zcyBMUk4gTFJOR3JhZCBMZWZ0U2hpZnQgTGVzcyBMZXNzRXF1YWwgTGdhbW1hIExpblNwYWNlIExpc3REaWZmIExvZyBMb2cxcCBMb2dTb2Z0bWF4IExvZ2ljYWxBbmQgTG9naWNhbE5vdCBMb2dpY2FsT3IgTWF0TXVsIE1hdHJpeEJhbmRQYXJ0IE1hdHJpeERpYWcgTWF0cml4RGlhZ1BhcnQgTWF0cml4U2V0RGlhZyBNYXRyaXhUcmlhbmd1bGFyU29sdmUgTWF4IE1heFBvb2wgTWF4UG9vbDNEIE1heFBvb2wzREdyYWQgTWF4UG9vbDNER3JhZEdyYWQgTWF4UG9vbEdyYWQgTWF4UG9vbEdyYWRHcmFkIE1heFBvb2xHcmFkR3JhZFYyIE1heFBvb2xHcmFkVjIgTWF4UG9vbFYyIE1heGltdW0gTWVhbiBNaW4gTWluaW11bSBNaXJyb3JQYWQgTW9kIE11bCBNdWx0aW5vbWlhbCBOZWcgTm9PcCBOb25NYXhTdXBwcmVzc2lvblY0IE5vdEVxdWFsIE9uZUhvdCBPbmVzTGlrZSBPdXRmZWVkRW5xdWV1ZSBPdXRmZWVkRW5xdWV1ZVR1cGxlIFBhY2sgUGFkIFBhZFYyIFBhcmFsbGVsRHluYW1pY1N0aXRjaCBQbGFjZWhvbGRlcldpdGhEZWZhdWx0IFBvdyBQcmV2ZW50R3JhZGllbnQgUHJvZCBRciBRdWFudGl6ZUFuZERlcXVhbnRpemVWMiBRdWFudGl6ZUFuZERlcXVhbnRpemVWMyBSRkZUIFJGRlQyRCBSRkZUM0QgUkdCVG9IU1YgUmFuZG9tU2h1ZmZsZSBSYW5kb21TdGFuZGFyZE5vcm1hbCBSYW5kb21Vbmlmb3JtIFJhbmRvbVVuaWZvcm1JbnQgUmFuZ2UgUmFuayBSZWFkVmFyaWFibGVPcCBSZWFsIFJlYWxEaXYgUmVjaXByb2NhbCBSZWNpcHJvY2FsR3JhZCBSZWN2VFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMgUmVsdSBSZWx1NiBSZWx1NkdyYWQgUmVsdUdyYWQgUmVzaGFwZSBSZXNpemVCaWxpbmVhciBSZXNpemVCaWxpbmVhckdyYWQgUmVzb3VyY2VBcHBseUFkYU1heCBSZXNvdXJjZUFwcGx5QWRhZGVsdGEgUmVzb3VyY2VBcHBseUFkYWdyYWQgUmVzb3VyY2VBcHBseUFkYWdyYWREQSBSZXNvdXJjZUFwcGx5QWRhbSBSZXNvdXJjZUFwcGx5QWRkU2lnbiBSZXNvdXJjZUFwcGx5Q2VudGVyZWRSTVNQcm9wIFJlc291cmNlQXBwbHlGdHJsIFJlc291cmNlQXBwbHlGdHJsVjIgUmVzb3VyY2VBcHBseUdyYWRpZW50RGVzY2VudCBSZXNvdXJjZUFwcGx5TW9tZW50dW0gUmVzb3VyY2VBcHBseVBvd2VyU2lnbiBSZXNvdXJjZUFwcGx5UHJveGltYWxBZGFncmFkIFJlc291cmNlQXBwbHlQcm94aW1hbEdyYWRpZW50RGVzY2VudCBSZXNvdXJjZUFwcGx5Uk1TUHJvcCBSZXNvdXJjZUdhdGhlciBSZXNvdXJjZVNjYXR0ZXJBZGQgUmVzb3VyY2VTY2F0dGVyRGl2IFJlc291cmNlU2NhdHRlck1heCBSZXNvdXJjZVNjYXR0ZXJNaW4gUmVzb3VyY2VTY2F0dGVyTXVsIFJlc291cmNlU2NhdHRlck5kQWRkIFJlc291cmNlU2NhdHRlck5kVXBkYXRlIFJlc291cmNlU2NhdHRlclN1YiBSZXNvdXJjZVNjYXR0ZXJVcGRhdGUgUmVzb3VyY2VTdHJpZGVkU2xpY2VBc3NpZ24gUmV2ZXJzZSBSZXZlcnNlU2VxdWVuY2UgUmV2ZXJzZVYyIFJpZ2h0U2hpZnQgUmludCBSb3VuZCBSc3FydCBSc3FydEdyYWQgU2NhdHRlck5kIFNlbGVjdCBTZWx1IFNlbHVHcmFkIFNlbmRUUFVFbWJlZGRpbmdHcmFkaWVudHMgU2hhcGUgU2hhcGVOIFNpZ21vaWQgU2lnbW9pZEdyYWQgU2lnbiBTaW4gU2luaCBTaXplIFNsaWNlIFNuYXBzaG90IFNvZnRtYXggU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMgU29mdHBsdXMgU29mdHBsdXNHcmFkIFNvZnRzaWduIFNvZnRzaWduR3JhZCBTcGFjZVRvQmF0Y2ggU3BhY2VUb0JhdGNoTkQgU3BhY2VUb0RlcHRoIFNwYXJzZU1hdE11bCBTcGFyc2VTb2Z0bWF4Q3Jvc3NFbnRyb3B5V2l0aExvZ2l0cyBTcGFyc2VUb0RlbnNlIFNwbGl0IFNwbGl0ViBTcXJ0IFNxcnRHcmFkIFNxdWFyZSBTcXVhcmVkRGlmZmVyZW5jZSBTcXVlZXplIFN0YWNrQ2xvc2VWMiBTdGFja1BvcFYyIFN0YWNrUHVzaFYyIFN0YWNrVjIgU3RhdGVsZXNzSWYgU3RhdGVsZXNzUmFuZG9tTm9ybWFsIFN0YXRlbGVzc1JhbmRvbVVuaWZvcm0gU3RhdGVsZXNzVHJ1bmNhdGVkTm9ybWFsIFN0YXRlbGVzc1doaWxlIFN0b3BHcmFkaWVudCBTdHJpZGVkU2xpY2UgU3RyaWRlZFNsaWNlR3JhZCBTdWIgU3VtIFN5bWJvbGljR3JhZGllbnQgVFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMgVGFuIFRhbmggVGFuaEdyYWQgVGVuc29yQXJyYXlDbG9zZVYzIFRlbnNvckFycmF5Q29uY2F0VjMgVGVuc29yQXJyYXlHYXRoZXJWMyBUZW5zb3JBcnJheUdyYWRWMyBUZW5zb3JBcnJheVJlYWRWMyBUZW5zb3JBcnJheVNjYXR0ZXJWMyBUZW5zb3JBcnJheVNpemVWMyBUZW5zb3JBcnJheVNwbGl0VjMgVGVuc29yQXJyYXlWMyBUZW5zb3JBcnJheVdyaXRlVjMgVGlsZSBUb3BLVjIgVHJhbnNwb3NlIFRydW5jYXRlRGl2IFRydW5jYXRlTW9kIFRydW5jYXRlZE5vcm1hbCBVbnBhY2sgVW5zb3J0ZWRTZWdtZW50TWF4IFVuc29ydGVkU2VnbWVudE1pbiBVbnNvcnRlZFNlZ21lbnRQcm9kIFVuc29ydGVkU2VnbWVudFN1bSBWYXJJc0luaXRpYWxpemVkT3AgVmFyaWFibGVTaGFwZSBXaGlsZSBYbGFEeW5hbWljVXBkYXRlU2xpY2UgWGxhSG9zdENvbXB1dGUgWGxhSWYgWGxhUmVjdiBYbGFSZWR1Y2VXaW5kb3cgWGxhU2VuZCBYbGFTb3J0IFhsYVdoaWxlIFplcm9zTGlrZSBFbnRlciBFeGl0IExvb3BDb25kIE1lcmdlIE5leHRJdGVyYXRpb24gU3dpdGNoIF9BcmcgX1BhcmFsbGVsQ29uY2F0VXBkYXRlIF9SZXR2YWwgX1RQVUNvbXBpbGUgX1RQVUV4ZWN1dGUgVFBVQ29tcGlsYXRpb25SZXN1bHQgVFBVUmVwbGljYXRlZElucHV0IFRQVVJlcGxpY2F0ZWRPdXRwdXQgVFBVUmVwbGljYXRlTWV0YWRhdGEgTWVyZ2VWMkNoZWNrcG9pbnRzIFJlc3RvcmVWMiBTYXZlVjIgQWJvcnQgQXNzZXJ0IEFzc2lnbiBQbGFjZWhvbGRlciBQbGFjZWhvbGRlclYyIFNoYXJkZWRGaWxlbmFtZSBTdHJpbmdKb2luIFZhcmlhYmxlIFZhcmlhYmxlVjIgVmFySGFuZGxlT3AgQXVkaW9TdW1tYXJ5IEF1ZGlvU3VtbWFyeVYyIERlYnVnTnVtZXJpY1N1bW1hcnkgSGlzdG9ncmFtU3VtbWFyeSBJbWFnZVN1bW1hcnkgTWVyZ2VTdW1tYXJ5IFNjYWxhclN1bW1hcnkgU3RhdHNBZ2dyZWdhdG9yU3VtbWFyeSIuc3BsaXQoIiAiKTsKZi5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXI9aDtmLmNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eT1mdW5jdGlvbihrLHQpe2lmKG51bGw9PT10KXRocm93IEVycm9yKCJDb21wYXRpYmlsaXR5IHByb3ZpZGVyIHJlcXVpcmVkLCBidXQgZ290OiAiK3QpO18uZWFjaChrLm5vZGVzLGw9PntsLmNvbXBhdGlibGU9dC5vcFZhbGlkKGwpO18uZWFjaChsLmluRW1iZWRkaW5ncyxwPT57cC5jb21wYXRpYmxlPXQub3BWYWxpZChwKX0pO18uZWFjaChsLm91dEVtYmVkZGluZ3MscD0+e3AuY29tcGF0aWJsZT10Lm9wVmFsaWQocCl9KX0pfX0pKGQub3B8fChkLm9wPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9wYXJzZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaCh1KXtpZigidHJ1ZSI9PT11KXJldHVybiEwO2lmKCJmYWxzZSI9PT11KXJldHVybiExO2lmKCciJz09PXVbMF0pcmV0dXJuIHUuc3Vic3RyaW5nKDEsdS5sZW5ndGgtMSk7bGV0IHg9cGFyc2VGbG9hdCh1KTtyZXR1cm4gaXNOYU4oeCk/dTp4fWZ1bmN0aW9uIGsodSl7cmV0dXJuIG5ldyBQcm9taXNlKCh4LEEpPT57ZmV0Y2godSkudGhlbih5PT57eS5vaz95LmFycmF5QnVmZmVyKCkudGhlbih4LEEpOnkudGV4dCgpLnRoZW4oQSxBKX0pfSl9ZnVuY3Rpb24gdCh1LHgsQT0xRTYseT0iXG4iKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odyxDKXtmdW5jdGlvbiBHKEQsQixJKXt2YXIgTj1JPj11LmJ5dGVMZW5ndGg7Qj1CLnNwbGl0KHkpO0JbMF09RCtCWzBdO2NvbnN0IE89Tj8iIjpCLnBvcCgpO2ZvcihsZXQgSCBvZiBCKXRyeXt4KEgpfWNhdGNoKEspe0MoSyk7cmV0dXJufU4/dyghMCk6CihEPW5ldyBCbG9iKFt1LnNsaWNlKEksSStBKV0pLE49bmV3IEZpbGVSZWFkZXIsTi5vbmxvYWQ9ZnVuY3Rpb24oSCl7RyhPLEgudGFyZ2V0LnJlc3VsdCxJK0EpfSxOLnJlYWRBc1RleHQoRCkpfUcoIiIsIiIsMCl9KX1mdW5jdGlvbiBsKHUpe3JldHVybiBtKHUsbil9ZnVuY3Rpb24gcCh1KXtyZXR1cm4gbSh1LHEpLnRoZW4oeD0+eC5zdGVwX3N0YXRzKX1mdW5jdGlvbiBtKHUseCl7ZnVuY3Rpb24gQShCKXtsZXQgST1CLmluZGV4T2YoIjoiKSxOPUIuc3Vic3RyaW5nKDAsSSkudHJpbSgpO0I9aChCLnN1YnN0cmluZyhJKzIpLnRyaW0oKSk7cmV0dXJue25hbWU6Tix2YWx1ZTpCfX1mdW5jdGlvbiB5KEIsSSxOLE8pe2xldCBIPUJbSV07bnVsbD09SD9CW0ldPU8uam9pbigiLiIpaW4geD9bTl06TjpBcnJheS5pc0FycmF5KEgpP0gucHVzaChOKTpCW0ldPVtILE5dfWxldCB3PXt9LEM9W10sRz1bXSxEPXc7cmV0dXJuIHQodSxmdW5jdGlvbihCKXtpZihCKXN3aXRjaChCPUIudHJpbSgpLApCW0IubGVuZ3RoLTFdKXtjYXNlICJ7IjpCPUIuc3Vic3RyaW5nKDAsQi5sZW5ndGgtMikudHJpbSgpO2xldCBJPXt9O0MucHVzaChEKTtHLnB1c2goQik7eShELEIsSSxHKTtEPUk7YnJlYWs7Y2FzZSAifSI6RD1DLnBvcCgpO0cucG9wKCk7YnJlYWs7ZGVmYXVsdDpCPUEoQikseShELEIubmFtZSxCLnZhbHVlLEcuY29uY2F0KEIubmFtZSkpfX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gd30pfWYuZmV0Y2hQYlR4dD1rO2YuZmV0Y2hBbmRQYXJzZU1ldGFkYXRhPWZ1bmN0aW9uKHUseCl7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5UYXNrKCgpPT5udWxsPT11P1Byb21pc2UucmVzb2x2ZShudWxsKTprKHUpLHgpLnRoZW4oQT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlBhcnNpbmcgbWV0YWRhdGEucGJ0eHQiLDYwLCgpPT5udWxsIT1BP3AoQSk6UHJvbWlzZS5yZXNvbHZlKG51bGwpLHgpKX07Zi5mZXRjaEFuZFBhcnNlR3JhcGhEYXRhPWZ1bmN0aW9uKHUseCxBKXtyZXR1cm4gYi5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlJlYWRpbmcgZ3JhcGggcGJ0eHQiLAo0MCwoKT0+eD9uZXcgUHJvbWlzZShmdW5jdGlvbih5LHcpe2xldCBDPW5ldyBGaWxlUmVhZGVyO0Mub25sb2FkPSgpPT55KEMucmVzdWx0KTtDLm9uZXJyb3I9KCk9PncoQy5lcnJvcik7Qy5yZWFkQXNBcnJheUJ1ZmZlcih4KX0pOmsodSksQSkudGhlbih5PT5iLmdyYXBoLnV0aWwucnVuQXN5bmNQcm9taXNlVGFzaygiUGFyc2luZyBncmFwaC5wYnR4dCIsNjAsKCk9PmwoeSksQSkpfTtmLnN0cmVhbVBhcnNlPXQ7Y29uc3Qgbj17ImxpYnJhcnkuZnVuY3Rpb24iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5pbnB1dCI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ciI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5mIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuZnVuYyI6ITAsCiJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5pIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QucyI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnNoYXBlIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3Quc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QudGVuc29yIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QudHlwZSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUudGVuc29yLnN0cmluZ192YWwiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUudGVuc29yLnRlbnNvcl9zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLnNpZ25hdHVyZS5pbnB1dF9hcmciOiEwLAoibGlicmFyeS5mdW5jdGlvbi5zaWduYXR1cmUub3V0cHV0X2FyZyI6ITAsImxpYnJhcnkudmVyc2lvbnMiOiEwLG5vZGU6ITAsIm5vZGUuaW5wdXQiOiEwLCJub2RlLmF0dHIiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5iIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuZiI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmZ1bmMiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5pIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QucyI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3Quc2hhcGUuZGltIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QudGVuc29yIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QudHlwZSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5zaGFwZS5kaW0iOiEwLCJub2RlLmF0dHIudmFsdWUudGVuc29yLnN0cmluZ192YWwiOiEwLCJub2RlLmF0dHIudmFsdWUudGVuc29yLnRlbnNvcl9zaGFwZS5kaW0iOiEwfSxxPXsic3RlcF9zdGF0cy5kZXZfc3RhdHMiOiEwLAoic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cyI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMub3V0cHV0IjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5tZW1vcnkiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm91dHB1dC50ZW5zb3JfZGVzY3JpcHRpb24uc2hhcGUuZGltIjohMH07Zi5wYXJzZUdyYXBoUGJUeHQ9bDtmLnBhcnNlU3RhdHNQYlR4dD1wfSkoZC5wYXJzZXJ8fChkLnBhcnNlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vcHJvdG8uanMKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vcmVuZGVyLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgoTCxRLFQsWCxhYSl7UT1uZXcgSShRLFQsWCxhYSwhMCk7TC5pbkFubm90YXRpb25zLnB1c2goUSl9ZnVuY3Rpb24gayhMLFEsVCxYLGFhKXtRPW5ldyBJKFEsVCxYLGFhLCExKTtMLm91dEFubm90YXRpb25zLnB1c2goUSl9ZnVuY3Rpb24gdChMLFEpe18uZWFjaChMLm5vZGVzKCksVD0+e1Q9TC5ub2RlKFQpO1QuZXhwYW5kZWQ9MTxRO2lmKDA8USlzd2l0Y2goVC5ub2RlLnR5cGUpe2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOmNhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6bChULFEtMSl9fSl9ZnVuY3Rpb24gbChMLFEpe0wuY29yZUdyYXBoJiZ0KEwuY29yZUdyYXBoLFEpfWZ1bmN0aW9uIHAoTCxRLFQpe2xldCBYPUwubm9kZShRKSxhYT1MLm5vZGUoVCksbGE9TC5lZGdlKFEsVCk7aWYoWC5ub2RlLmluY2x1ZGUhPT1kLkluY2x1c2lvblR5cGUuSU5DTFVERSYmYWEubm9kZS5pbmNsdWRlIT09ZC5JbmNsdXNpb25UeXBlLklOQ0xVREV8fApYLm5vZGUuaW5jbHVkZT09PWQuSW5jbHVzaW9uVHlwZS5FWENMVURFfHxhYS5ub2RlLmluY2x1ZGU9PT1kLkluY2x1c2lvblR5cGUuRVhDTFVERSlrKFgsYWEubm9kZSxhYSxsYSxOLlNIT1JUQ1VUKSxoKGFhLFgubm9kZSxYLGxhLE4uU0hPUlRDVVQpLEwucmVtb3ZlRWRnZShRLFQpfWZ1bmN0aW9uIG0oTCxRLFQpe2xldCBYPUwuY29yZUdyYXBoLGFhPVgubm9kZShRKTthYS5pc091dEV4dHJhY3Q9ITA7Xy5lYWNoKFgucHJlZGVjZXNzb3JzKFEpLGxhPT57cChYLGxhLFEpfSk7KEcuZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlfHxUKSYmXy5lYWNoKFguc3VjY2Vzc29ycyhRKSxsYT0+e3AoWCxRLGxhKX0pOzA9PT1YLm5laWdoYm9ycyhRKS5sZW5ndGgmJihhYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsTC5pc29sYXRlZE91dEV4dHJhY3QucHVzaChhYSksWC5yZW1vdmVOb2RlKFEpKX1mdW5jdGlvbiBuKEwsUSxUKXtsZXQgWD1MLmNvcmVHcmFwaCxhYT0KWC5ub2RlKFEpO2FhLmlzSW5FeHRyYWN0PSEwO18uZWFjaChYLnN1Y2Nlc3NvcnMoUSksbGE9PntwKFgsUSxsYSl9KTsoRy5kZXRhY2hBbGxFZGdlc0ZvckhpZ2hEZWdyZWV8fFQpJiZfLmVhY2goWC5wcmVkZWNlc3NvcnMoUSksbGE9PntwKFgsbGEsUSl9KTswPT09WC5uZWlnaGJvcnMoUSkubGVuZ3RoJiYoYWEubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLEwuaXNvbGF0ZWRJbkV4dHJhY3QucHVzaChhYSksWC5yZW1vdmVOb2RlKFEpKX1mdW5jdGlvbiBxKEwsUSl7aWYoTC50eXBlPT09ZC5Ob2RlVHlwZS5PUClmb3IodmFyIFQ9MDtUPFEubGVuZ3RoO1QrKyl7aWYoTC5vcD09PVFbVF0pcmV0dXJuITB9ZWxzZSBpZihMLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJihMPUwuZ2V0Um9vdE9wKCkpKWZvcihUPTA7VDxRLmxlbmd0aDtUKyspaWYoTC5vcD09PVFbVF0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gdShMKXtsZXQgUT1MLmNvcmVHcmFwaDtfLmVhY2goUS5ub2RlcygpLApUPT57US5ub2RlKFQpLm5vZGUuaW5jbHVkZSE9PWQuSW5jbHVzaW9uVHlwZS5FWENMVURFfHxULnN0YXJ0c1dpdGgoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKXx8KEwuY29yZUdyYXBoLm91dEVkZ2VzKFQpLmxlbmd0aD5MLmNvcmVHcmFwaC5pbkVkZ2VzKFQpLmxlbmd0aD9tKEwsVCwhMCk6bihMLFQsITApKX0pfWZ1bmN0aW9uIHgoTCl7bGV0IFE9TC5jb3JlR3JhcGg7Xy5lYWNoKFEubm9kZXMoKSxUPT57bGV0IFg9US5ub2RlKFQpO1gubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiZxKFgubm9kZSxHLm91dEV4dHJhY3RUeXBlcykmJm0oTCxUKX0pfWZ1bmN0aW9uIEEoTCl7bGV0IFE9TC5jb3JlR3JhcGg7Xy5lYWNoKFEubm9kZXMoKSxUPT57bGV0IFg9US5ub2RlKFQpO1gubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiZxKFgubm9kZSxHLmluRXh0cmFjdFR5cGVzKSYmbihMLFQpfSl9ZnVuY3Rpb24geShMKXtsZXQgUT0KTC5jb3JlR3JhcGgsVD17fSxYPXt9LGFhPTA7Xy5lYWNoKFEubm9kZXMoKSxrYT0+e2lmKFEubm9kZShrYSkubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEKXt2YXIgWT1fLnJlZHVjZShRLnByZWRlY2Vzc29ycyhrYSksKHZhLHhhKT0+e3hhPVEuZWRnZSh4YSxrYSkubWV0YWVkZ2U7cmV0dXJuIHZhKyh4YS5udW1SZWd1bGFyRWRnZXM/MTowKX0sMCk7MD09PVkmJjA8US5wcmVkZWNlc3NvcnMoa2EpLmxlbmd0aCYmKFk9US5wcmVkZWNlc3NvcnMoa2EpLmxlbmd0aCk7dmFyIEVhPV8ucmVkdWNlKFEuc3VjY2Vzc29ycyhrYSksKHZhLHhhKT0+e3hhPVEuZWRnZShrYSx4YSkubWV0YWVkZ2U7cmV0dXJuIHZhKyh4YS5udW1SZWd1bGFyRWRnZXM/MTowKX0sMCk7MD09PUVhJiYwPFEuc3VjY2Vzc29ycyhrYSkubGVuZ3RoJiYoRWE9US5zdWNjZXNzb3JzKGthKS5sZW5ndGgpO1Rba2FdPVk7WFtrYV09RWE7YWErK319KTtpZighKGFhPEcubWluTm9kZUNvdW50Rm9yRXh0cmFjdGlvbikpe3ZhciBsYT0KRy5taW5EZWdyZWVGb3JFeHRyYWN0aW9uLTEsWj1NYXRoLnJvdW5kKC43NSphYSksYmE9TWF0aC5yb3VuZCguMjUqYWEpLGVhPU9iamVjdC5rZXlzKFQpLnNvcnQoKGthLFkpPT5UW2thXS1UW1ldKSxjYT1UW2VhW1pdXTtjYT1jYStjYS1UW2VhW2JhXV07Y2E9TWF0aC5tYXgoY2EsbGEpO2ZvcihsZXQga2E9YWEtMTtUW2VhW2thXV0+Y2E7a2EtLSluKEwsZWFba2FdKTtlYT1PYmplY3Qua2V5cyhYKS5zb3J0KChrYSxZKT0+WFtrYV0tWFtZXSk7Wj1YW2VhW1pdXTtiYT1aKzQqKFotWFtlYVtiYV1dKTtiYT1NYXRoLm1heChiYSxsYSk7Zm9yKGxhPWFhLTE7WFtlYVtsYV1dPmJhO2xhLS0pKFo9US5ub2RlKGVhW2xhXSkpJiYhWi5pc0luRXh0cmFjdCYmbShMLGVhW2xhXSl9fWZ1bmN0aW9uIHcoTCl7bGV0IFE9TC5jb3JlR3JhcGgsVD17fTtfLmVhY2goUS5lZGdlcygpLFg9PntRLmVkZ2UoWCkubWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzfHwoKFRbWC52XT1UW1gudl18fFtdKS5wdXNoKFgpLAooVFtYLnddPVRbWC53XXx8W10pLnB1c2goWCkpfSk7Xy5lYWNoKFQsWD0+e1gubGVuZ3RoPkcubWF4Q29udHJvbERlZ3JlZSYmXy5lYWNoKFgsYWE9PnAoUSxhYS52LGFhLncpKX0pfWZ1bmN0aW9uIEMoTCl7dShMKTtHLm91dEV4dHJhY3RUeXBlcyYmeChMKTtHLmluRXh0cmFjdFR5cGVzJiZBKEwpO3koTCk7Ry5tYXhDb250cm9sRGVncmVlJiZ3KEwpO2xldCBRPUwuY29yZUdyYXBoO18uZWFjaChRLm5vZGVzKCksVD0+e2xldCBYPVEubm9kZShUKTt2YXIgYWE9US5uZWlnaGJvcnMoVCkubGVuZ3RoO2lmKFgubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiYwPT09YWEpe2FhPTA8WC5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aDtsZXQgbGE9MDxYLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg7WC5pc0luRXh0cmFjdD8oTC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSk6ClguaXNPdXRFeHRyYWN0PyhMLmlzb2xhdGVkT3V0RXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSk6Ry5leHRyYWN0SXNvbGF0ZWROb2Rlc1dpdGhBbm5vdGF0aW9uc09uT25lU2lkZSYmKGFhJiYhbGE/KFguaXNJbkV4dHJhY3Q9ITAsTC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSk6bGEmJiFhYSYmKFguaXNPdXRFeHRyYWN0PSEwLEwuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2goWCksWC5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsUS5yZW1vdmVOb2RlKFQpKSl9fSl9Zi5PcE5vZGVDb2xvcnM9e0RFRkFVTFRfRklMTDoiI2ZmZmZmZiIsREVGQVVMVF9TVFJPS0U6IiNiMmIyYjIiLENPTVBBVElCTEU6IiMwZjlkNTgiLElOQ09NUEFUSUJMRToiI2RiNDQzNyJ9O2YuTWV0YW5vZGVDb2xvcnM9CntERUZBVUxUX0ZJTEw6IiNkOWQ5ZDkiLERFRkFVTFRfU1RST0tFOiIjYTZhNmE2IixTQVRVUkFUSU9OOi42LExJR0hUTkVTUzouODUsRVhQQU5ERURfQ09MT1I6IiNmMGYwZjAiLEhVRVM6WzIyMCwxMDAsMTgwLDQwLDIwLDM0MCwyNjAsMzAwLDE0MCw2MF0sU1RSVUNUVVJFX1BBTEVUVEUoTCxRKXt2YXIgVD1mLk1ldGFub2RlQ29sb3JzLkhVRVM7TD1UW0wlVC5sZW5ndGhdO1Q9TWF0aC5zaW4oTCpNYXRoLlBJLzM2MCk7cmV0dXJuIGQzLmhzbChMLC4wMSooUT8zMDo5MC02MCpUKSwuMDEqKFE/OTU6ODApKS50b1N0cmluZygpfSxERVZJQ0VfUEFMRVRURShMKXtyZXR1cm4gZi5NZXRhbm9kZUNvbG9ycy5TVFJVQ1RVUkVfUEFMRVRURShMKX0sWExBX0NMVVNURVJfUEFMRVRURShMKXtyZXR1cm4gZi5NZXRhbm9kZUNvbG9ycy5TVFJVQ1RVUkVfUEFMRVRURShMKX0sVU5LTk9XTjoiI2VlZSIsR1JBRElFTlRfT1VUTElORToiIzg4OCJ9O2YuU2VyaWVzTm9kZUNvbG9ycz17REVGQVVMVF9GSUxMOiJ3aGl0ZSIsCkRFRkFVTFRfU1RST0tFOiIjYjJiMmIyIn07Y29uc3QgRz17ZW5hYmxlRXh0cmFjdGlvbjohMCxtaW5Ob2RlQ291bnRGb3JFeHRyYWN0aW9uOjE1LG1pbkRlZ3JlZUZvckV4dHJhY3Rpb246NSxtYXhDb250cm9sRGVncmVlOjQsbWF4QnJpZGdlUGF0aERlZ3JlZTo0LG91dEV4dHJhY3RUeXBlczpbIk5vT3AiXSxpbkV4dHJhY3RUeXBlczpbXSxkZXRhY2hBbGxFZGdlc0ZvckhpZ2hEZWdyZWU6ITAsZXh0cmFjdElzb2xhdGVkTm9kZXNXaXRoQW5ub3RhdGlvbnNPbk9uZVNpZGU6ITAsZW5hYmxlQnJpZGdlZ3JhcGg6ITAsbWluTWF4Q29sb3JzOlsiI2ZmZjVmMCIsIiNmYjZhNGEiXSxtYXhBbm5vdGF0aW9uczo1fSxEPW5ldyBSZWdFeHAoIl4oPzoiK2IuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCsiKT8oXFx3KylfW2EtejAtOV17OH0oPzpfXFxkKyk/JCIpO2NsYXNzIEJ7Y29uc3RydWN0b3IoTCxRKXt0aGlzLmhpZXJhcmNoeT1MO3RoaXMuZGlzcGxheWluZ1N0YXRzPQpRO3RoaXMuaW5kZXg9e307dGhpcy5yZW5kZXJlZE9wTmFtZXM9W107dGhpcy5jb21wdXRlU2NhbGVzKCk7dGhpcy5oYXNTdWJoaWVyYXJjaHk9e307dGhpcy5yb290PW5ldyBNKEwucm9vdCxMLmdyYXBoT3B0aW9ucyk7dGhpcy5pbmRleFtMLnJvb3QubmFtZV09dGhpcy5yb290O3RoaXMucmVuZGVyZWRPcE5hbWVzLnB1c2goTC5yb290Lm5hbWUpO3RoaXMuYnVpbGRTdWJoaWVyYXJjaHkoTC5yb290Lm5hbWUpO3RoaXMucm9vdC5leHBhbmRlZD0hMDt0aGlzLnRyYWNlSW5wdXRzPSExfWNvbXB1dGVTY2FsZXMoKXt0aGlzLmRldmljZUNvbG9yTWFwPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS5kZXZpY2VzKS5yYW5nZShfLm1hcChkMy5yYW5nZSh0aGlzLmhpZXJhcmNoeS5kZXZpY2VzLmxlbmd0aCksZi5NZXRhbm9kZUNvbG9ycy5ERVZJQ0VfUEFMRVRURSkpO3RoaXMueGxhQ2x1c3RlckNvbG9yTWFwPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS54bGFDbHVzdGVycykucmFuZ2UoXy5tYXAoZDMucmFuZ2UodGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RoKSwKZi5NZXRhbm9kZUNvbG9ycy5YTEFfQ0xVU1RFUl9QQUxFVFRFKSk7bGV0IEw9dGhpcy5oaWVyYXJjaHkucm9vdC5tZXRhZ3JhcGg7dmFyIFE9ZDMubWF4KEwubm9kZXMoKSxUPT57VD1MLm5vZGUoVCk7aWYobnVsbCE9VC5zdGF0cylyZXR1cm4gVC5zdGF0cy50b3RhbEJ5dGVzfSk7dGhpcy5tZW1vcnlVc2FnZVNjYWxlPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLFFdKS5yYW5nZShHLm1pbk1heENvbG9ycyk7UT1kMy5tYXgoTC5ub2RlcygpLFQ9PntUPUwubm9kZShUKTtpZihudWxsIT1ULnN0YXRzKXJldHVybiBULnN0YXRzLmdldFRvdGFsTWljcm9zKCl9KTt0aGlzLmNvbXB1dGVUaW1lU2NhbGU9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsUV0pLnJhbmdlKEcubWluTWF4Q29sb3JzKTt0aGlzLmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZT10aGlzLmhpZXJhcmNoeS5oYXNTaGFwZUluZm8/ZC5zY2VuZS5lZGdlLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRTpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSwKdGhpcy5oaWVyYXJjaHkubWF4TWV0YUVkZ2VTaXplXSkucmFuZ2UoW2Quc2NlbmUuZWRnZS5NSU5fRURHRV9XSURUSCxkLnNjZW5lLmVkZ2UuTUFYX0VER0VfV0lEVEhdKX1nZXRSZW5kZXJOb2RlQnlOYW1lKEwpe3JldHVybiB0aGlzLmluZGV4W0xdfWdldE5vZGVCeU5hbWUoTCl7cmV0dXJuIHRoaXMuaGllcmFyY2h5Lm5vZGUoTCl9Y29sb3JIaXN0b2dyYW0oTCxRKXtpZigwPE9iamVjdC5rZXlzKEwpLmxlbmd0aCl7Y29uc3QgVD1fLnN1bShPYmplY3Qua2V5cyhMKS5tYXAoWD0+TFtYXSkpO3JldHVybiBPYmplY3Qua2V5cyhMKS5tYXAoWD0+KHtjb2xvcjpRKFgpLHByb3BvcnRpb246TFtYXS9UfSkpfWNvbnNvbGUuaW5mbygibm8gcGFpcnMgZm91bmQhIik7cmV0dXJuIG51bGx9Z2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKEwpe2lmKCFMKXJldHVybiBudWxsO2lmKEwgaW4gdGhpcy5pbmRleClyZXR1cm4gdGhpcy5pbmRleFtMXTt2YXIgUT10aGlzLmhpZXJhcmNoeS5ub2RlKEwpOwppZighUSlyZXR1cm4gbnVsbDtsZXQgVD1RLmlzR3JvdXBOb2RlP25ldyBNKFEsdGhpcy5oaWVyYXJjaHkuZ3JhcGhPcHRpb25zKTpuZXcgSChRKTt0aGlzLmluZGV4W0xdPVQ7dGhpcy5yZW5kZXJlZE9wTmFtZXMucHVzaChMKTtRLnN0YXRzJiYoVC5tZW1vcnlDb2xvcj10aGlzLm1lbW9yeVVzYWdlU2NhbGUoUS5zdGF0cy50b3RhbEJ5dGVzKSxULmNvbXB1dGVUaW1lQ29sb3I9dGhpcy5jb21wdXRlVGltZVNjYWxlKFEuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKSkpO1QuaXNGYWRlZE91dD10aGlzLmRpc3BsYXlpbmdTdGF0cyYmIWIuZ3JhcGgudXRpbC5oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cyhRLnN0YXRzKTt2YXIgWD1udWxsLGFhPW51bGwsbGE9bnVsbDtpZihRLmlzR3JvdXBOb2RlKXtYPVEuZGV2aWNlSGlzdG9ncmFtO2FhPVEueGxhQ2x1c3Rlckhpc3RvZ3JhbTt2YXIgWj1RLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZTtRPVEuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7CmlmKDAhPVp8fDAhPVEpbGE9Wi8oWitRKX1lbHNlKFo9VC5ub2RlLmRldmljZSkmJihYPXtbWl06MX0pLChaPVQubm9kZS54bGFDbHVzdGVyKSYmKGFhPXtbWl06MX0pLFQubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5PUCYmKGxhPVQubm9kZS5jb21wYXRpYmxlPzE6MCk7WCYmKFQuZGV2aWNlQ29sb3JzPXRoaXMuY29sb3JIaXN0b2dyYW0oWCx0aGlzLmRldmljZUNvbG9yTWFwKSk7YWEmJihULnhsYUNsdXN0ZXJDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShhYSx0aGlzLnhsYUNsdXN0ZXJDb2xvck1hcCkpO251bGwhPWxhJiYoVC5jb21wYXRpYmlsaXR5Q29sb3JzPVt7Y29sb3I6Yi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEUscHJvcG9ydGlvbjpsYX0se2NvbG9yOmIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5JTkNPTVBBVElCTEUscHJvcG9ydGlvbjoxLWxhfV0pO3JldHVybiB0aGlzLmluZGV4W0xdfWdldE5lYXJlc3RWaXNpYmxlQW5jZXN0b3IoTCl7dmFyIFE9CmQuZ2V0SGllcmFyY2hpY2FsUGF0aChMKTtsZXQgVD0wLFg9bnVsbDtmb3IoO1Q8US5sZW5ndGgmJihMPVFbVF0sWD10aGlzLmdldFJlbmRlck5vZGVCeU5hbWUoTCksWC5leHBhbmRlZCk7VCsrKTtyZXR1cm4gVD09US5sZW5ndGgtMiYmKFE9UVtUKzFdLFguaW5Bbm5vdGF0aW9ucy5ub2RlTmFtZXNbUV18fFgub3V0QW5ub3RhdGlvbnMubm9kZU5hbWVzW1FdKT9ROkx9c2V0RGVwdGgoTCl7bCh0aGlzLnJvb3QsK0wpfWlzTm9kZUF1eGlsaWFyeShMKXtsZXQgUT10aGlzLmdldFJlbmRlck5vZGVCeU5hbWUoTC5ub2RlLnBhcmVudE5vZGUubmFtZSksVD1fLmZpbmQoUS5pc29sYXRlZEluRXh0cmFjdCxYPT5YLm5vZGUubmFtZT09PUwubm9kZS5uYW1lKTtpZihUKXJldHVybiEwO1Q9Xy5maW5kKFEuaXNvbGF0ZWRPdXRFeHRyYWN0LFg9Plgubm9kZS5uYW1lPT09TC5ub2RlLm5hbWUpO3JldHVybiEhVH1nZXROYW1lc09mUmVuZGVyZWRPcHMoKXtyZXR1cm4gdGhpcy5yZW5kZXJlZE9wTmFtZXN9Y2xvbmVBbmRBZGRGdW5jdGlvbk9wTm9kZShMLApRLFQsWCl7dmFyIGFhPVQubmFtZS5yZXBsYWNlKFEsWCk7bGV0IGxhPUwubWV0YWdyYXBoLm5vZGUoYWEpO2lmKGxhKXJldHVybiBsYTtsYT1uZXcgZC5PcE5vZGVJbXBsKHtuYW1lOmFhLGlucHV0OltdLGRldmljZTpULmRldmljZSxvcDpULm9wLGF0dHI6Xy5jbG9uZURlZXAoVC5hdHRyKX0pO2xhLmNhcmRpbmFsaXR5PVQuY2FyZGluYWxpdHk7bGEuaW5jbHVkZT1ULmluY2x1ZGU7bGEub3V0cHV0U2hhcGVzPV8uY2xvbmVEZWVwKFQub3V0cHV0U2hhcGVzKTtsYS54bGFDbHVzdGVyPVQueGxhQ2x1c3RlcjtsYS5mdW5jdGlvbklucHV0SW5kZXg9VC5mdW5jdGlvbklucHV0SW5kZXg7bGEuZnVuY3Rpb25PdXRwdXRJbmRleD1ULmZ1bmN0aW9uT3V0cHV0SW5kZXg7bGEuaW5wdXRzPVQuaW5wdXRzLm1hcChaPT57Y29uc3QgYmE9Xy5jbG9uZShaKTtiYS5uYW1lPVoubmFtZS5yZXBsYWNlKFEsWCk7cmV0dXJuIGJhfSk7bGEucGFyZW50Tm9kZT1MO0wubWV0YWdyYXBoLnNldE5vZGUobGEubmFtZSwKbGEpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUobGEubmFtZSxsYSk7YWE9Wj0+dGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKEwsUSxaLFgpO2xhLmluRW1iZWRkaW5ncz1ULmluRW1iZWRkaW5ncy5tYXAoYWEpO2xhLm91dEVtYmVkZGluZ3M9VC5vdXRFbWJlZGRpbmdzLm1hcChhYSk7cmV0dXJuIGxhfWNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGUoTCxRLFQsWCxhYSl7Y29uc3QgbGE9e307TD10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTCxRLFQsWCxhYSxsYSk7Xy5pc0VtcHR5KGxhKXx8dGhpcy5wYXRjaEVkZ2VzRnJvbUZ1bmN0aW9uT3V0cHV0cyhRLGxhKTtyZXR1cm4gTH1jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKEwsUSxULFgsYWEsbGEpe2NvbnN0IFo9Yi5ncmFwaC5jcmVhdGVNZXRhbm9kZShULm5hbWUucmVwbGFjZShYLGFhKSk7Wi5kZXB0aD1ULmRlcHRoO1ouY2FyZGluYWxpdHk9VC5jYXJkaW5hbGl0eTtaLnRlbXBsYXRlSWQ9ClQudGVtcGxhdGVJZDtaLm9wSGlzdG9ncmFtPV8uY2xvbmUoVC5vcEhpc3RvZ3JhbSk7Wi5kZXZpY2VIaXN0b2dyYW09Xy5jbG9uZShULmRldmljZUhpc3RvZ3JhbSk7Wi54bGFDbHVzdGVySGlzdG9ncmFtPV8uY2xvbmUoVC54bGFDbHVzdGVySGlzdG9ncmFtKTtaLmhhc05vbkNvbnRyb2xFZGdlcz1ULmhhc05vbkNvbnRyb2xFZGdlcztaLmluY2x1ZGU9VC5pbmNsdWRlO1oubm9kZUF0dHJpYnV0ZXM9Xy5jbG9uZShULm5vZGVBdHRyaWJ1dGVzKTtaLmFzc29jaWF0ZWRGdW5jdGlvbj1ULmFzc29jaWF0ZWRGdW5jdGlvbjtfLmVhY2goVC5tZXRhZ3JhcGgubm9kZXMoKSxiYT0+e2JhPVQubWV0YWdyYXBoLm5vZGUoYmEpO3N3aXRjaChiYS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuTUVUQTpiYT10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTCxRLGJhLFgsYWEsbGEpO2JhLnBhcmVudE5vZGU9WjtaLm1ldGFncmFwaC5zZXROb2RlKGJhLm5hbWUsYmEpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUoYmEubmFtZSwKYmEpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5PUDpiYT10aGlzLmNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUoWixYLGJhLGFhKTtfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uSW5wdXRJbmRleCkmJnRoaXMucGF0Y2hFZGdlc0ludG9GdW5jdGlvbklucHV0cyhRLGJhKTtfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uT3V0cHV0SW5kZXgpJiYobGFbYmEuZnVuY3Rpb25PdXRwdXRJbmRleF09YmEpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKGJhLm5hbWUrIiBpcyBvZGRseSBuZWl0aGVyIGEgbWV0YW5vZGUgbm9yIGFuIG9wbm9kZS4iKX19KTt0aGlzLmNsb25lTGlicmFyeU1ldGFub2RlRWRnZXMoVCxaLFgsYWEpO3JldHVybiBafWNsb25lTGlicmFyeU1ldGFub2RlRWRnZXMoTCxRLFQsWCl7Xy5lYWNoKEwubWV0YWdyYXBoLmVkZ2VzKCksYWE9PnthYT1MLm1ldGFncmFwaC5lZGdlKGFhKTtjb25zdCBsYT1hYS52LnJlcGxhY2UoVCxYKSxaPWFhLncucmVwbGFjZShULFgpLGJhPW5ldyBkLk1ldGFlZGdlSW1wbChsYSwKWik7YmEuaW5ib3VuZD1hYS5pbmJvdW5kO2JhLm51bVJlZ3VsYXJFZGdlcz1hYS5udW1SZWd1bGFyRWRnZXM7YmEubnVtQ29udHJvbEVkZ2VzPWFhLm51bUNvbnRyb2xFZGdlcztiYS5udW1SZWZFZGdlcz1hYS5udW1SZWZFZGdlcztiYS50b3RhbFNpemU9YWEudG90YWxTaXplO2FhLmJhc2VFZGdlTGlzdCYmKGJhLmJhc2VFZGdlTGlzdD1hYS5iYXNlRWRnZUxpc3QubWFwKGVhPT57Y29uc3QgY2E9Xy5jbG9uZShlYSk7Y2Eudj1lYS52LnJlcGxhY2UoVCxYKTtjYS53PWVhLncucmVwbGFjZShULFgpO3JldHVybiBjYX0pKTtRLm1ldGFncmFwaC5ub2RlKFopP1EubWV0YWdyYXBoLnNldEVkZ2UobGEsWixiYSk6US5tZXRhZ3JhcGguc2V0RWRnZShaLGxhLGJhKX0pfXBhdGNoRWRnZXNJbnRvRnVuY3Rpb25JbnB1dHMoTCxRKXtsZXQgVD1NYXRoLm1pbihRLmZ1bmN0aW9uSW5wdXRJbmRleCxMLmlucHV0cy5sZW5ndGgtMSk7Zm9yKHZhciBYPV8uY2xvbmUoTC5pbnB1dHNbVF0pO1guaXNDb250cm9sRGVwZW5kZW5jeTspVCsrLApYPUwuaW5wdXRzW1RdO1EuaW5wdXRzLnB1c2goWCk7WD10aGlzLmhpZXJhcmNoeS5nZXRQcmVkZWNlc3NvcnMoTC5uYW1lKTtsZXQgYWEsbGE9MDtfLmVhY2goWC5yZWd1bGFyLFo9PntsYSs9Wi5udW1SZWd1bGFyRWRnZXM7aWYobGE+VClyZXR1cm4gYWE9WiwhMX0pO18uZWFjaChhYS5iYXNlRWRnZUxpc3QsWj0+e1oudz09PUwubmFtZSYmKFoudz1RLm5hbWUpO1oudj09PUwubmFtZSYmKFoudj1RLm5hbWUpfSl9cGF0Y2hFZGdlc0Zyb21GdW5jdGlvbk91dHB1dHMoTCxRKXtjb25zdCBUPXRoaXMuaGllcmFyY2h5LmdldFN1Y2Nlc3NvcnMoTC5uYW1lKTtfLmVhY2goVC5yZWd1bGFyLFg9PntfLmVhY2goWC5iYXNlRWRnZUxpc3QsYWE9Pntjb25zdCBsYT10aGlzLmhpZXJhcmNoeS5ub2RlKGFhLncpO18uZWFjaChsYS5pbnB1dHMsWj0+e1oubmFtZT09PUwubmFtZSYmKFoubmFtZT1RW1oub3V0cHV0VGVuc29yS2V5XS5uYW1lLFoub3V0cHV0VGVuc29yS2V5PWFhLm91dHB1dFRlbnNvcktleSl9KX0pOwpfLmVhY2goWC5iYXNlRWRnZUxpc3QsYWE9PnthYS52PVFbYWEub3V0cHV0VGVuc29yS2V5XS5uYW1lO2FhLm91dHB1dFRlbnNvcktleT0iMCJ9KX0pfWJ1aWxkU3ViaGllcmFyY2h5KEwpe2lmKCEoTCBpbiB0aGlzLmhhc1N1YmhpZXJhcmNoeSkpe3RoaXMuaGFzU3ViaGllcmFyY2h5W0xdPSEwO3ZhciBRPXRoaXMuaW5kZXhbTF07aWYoUS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEF8fFEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMpe3ZhciBUPVEubm9kZS5tZXRhZ3JhcGgsWD1RLmNvcmVHcmFwaCxhYT1bXSxsYT1bXTtfLmlzRW1wdHkodGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucyl8fChfLmVhY2goVC5ub2RlcygpLHhhPT57Y29uc3QgQWE9VC5ub2RlKHhhKSxGYT10aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zW0FhLm9wXTtGYSYmMCE9PXhhLmluZGV4T2YoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmKHhhPXRoaXMuY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZShULApBYSxGYS5ub2RlLEZhLm5vZGUubmFtZSxBYS5uYW1lKSxhYS5wdXNoKEFhKSxsYS5wdXNoKHhhKSl9KSxfLmVhY2gobGEsKHhhLEFhKT0+e0FhPWFhW0FhXTt4YS5wYXJlbnROb2RlPUFhLnBhcmVudE5vZGU7VC5zZXROb2RlKEFhLm5hbWUseGEpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUoQWEubmFtZSx4YSl9KSk7Xy5lYWNoKFQubm9kZXMoKSx4YT0+e2xldCBBYT10aGlzLmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZSh4YSksRmE9QWEubm9kZTtYLnNldE5vZGUoeGEsQWEpO0ZhLmlzR3JvdXBOb2RlfHwoXy5lYWNoKEZhLmluRW1iZWRkaW5ncyx5YT0+e2xldCBTYT1uZXcgSyhudWxsKSxYYT1uZXcgSCh5YSk7aChBYSx5YSxYYSxTYSxOLkNPTlNUQU5UKTt0aGlzLmluZGV4W3lhLm5hbWVdPVhhfSksXy5lYWNoKEZhLm91dEVtYmVkZGluZ3MseWE9PntsZXQgU2E9bmV3IEsobnVsbCksWGE9bmV3IEgoeWEpO2soQWEseWEsWGEsU2EsTi5TVU1NQVJZKTt0aGlzLmluZGV4W3lhLm5hbWVdPQpYYX0pKX0pO18uZWFjaChULmVkZ2VzKCkseGE9Pnt2YXIgQWE9VC5lZGdlKHhhKTtBYT1uZXcgSyhBYSk7QWEuaXNGYWRlZE91dD10aGlzLmluZGV4W3hhLnZdLmlzRmFkZWRPdXR8fHRoaXMuaW5kZXhbeGEud10uaXNGYWRlZE91dDtYLnNldEVkZ2UoeGEudix4YS53LEFhKX0pO0cuZW5hYmxlRXh0cmFjdGlvbiYmUS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJkMoUSk7Xy5pc0VtcHR5KHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMpfHx0aGlzLmJ1aWxkU3ViaGllcmFyY2hpZXNGb3JOZWVkZWRGdW5jdGlvbnMoVCk7TD09PWIuZ3JhcGguUk9PVF9OQU1FJiZfLmZvck93bih0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zLHhhPT57eGE9eGEubm9kZTtjb25zdCBBYT10aGlzLmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZSh4YS5uYW1lKTtRLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LnB1c2goQWEpO0FhLm5vZGUuaW5jbHVkZT1kLkluY2x1c2lvblR5cGUuRVhDTFVERTsKWC5yZW1vdmVOb2RlKHhhLm5hbWUpfSk7dmFyIFo9US5ub2RlLnBhcmVudE5vZGU7aWYoWil7dmFyIGJhPXRoaXMuaW5kZXhbWi5uYW1lXSxlYT0oeGEsLi4uQWEpPT5BYS5jb25jYXQoW3hhPyJJTiI6Ik9VVCJdKS5qb2luKCJ+fiIpLGNhPXRoaXMuaGllcmFyY2h5LmdldEJyaWRnZWdyYXBoKEwpLGthPXt9LFk9e30sRWE9e307Xy5lYWNoKGNhLmVkZ2VzKCkseGE9PntsZXQgQWE9ISFULm5vZGUoeGEudyksRmE9QWE/eGEudjp4YS53O2NhLmVkZ2UoeGEpLm51bVJlZ3VsYXJFZGdlcz9BYT9ZW0ZhXT0oWVtGYV18fDApKzE6a2FbRmFdPShrYVtGYV18fDApKzE6RWFbRmFdPShFYVtGYV18fDApKzF9KTt2YXIgdmE9dGhpcy5oaWVyYXJjaHkuZ2V0Tm9kZU1hcCgpO18uZWFjaChjYS5lZGdlcygpLHhhPT57dmFyIEFhPWNhLmVkZ2UoeGEpO2xldCBGYT0hIVQubm9kZSh4YS53KSxbeWEsU2FdPUZhP1t4YS53LHhhLnZdOlt4YS52LHhhLnddO3ZhciBYYT10aGlzLmluZGV4W3lhXSx1Yj10aGlzLmluZGV4W1NhXSwKQmI9dWI/dWIubm9kZTp2YVtTYV0scWI9IUFhLm51bVJlZ3VsYXJFZGdlcyYmRWFbU2FdPkcubWF4Q29udHJvbERlZ3JlZSxbLHpiXT1GYT9bUS5pbkFubm90YXRpb25zLFhhLmluQW5ub3RhdGlvbnNdOltRLm91dEFubm90YXRpb25zLFhhLm91dEFubm90YXRpb25zXTtsZXQgdmI9KEZhP1k6a2EpW1NhXT5HLm1heEJyaWRnZVBhdGhEZWdyZWU7eGE9bnVsbDt2YXIgR2I9ITE7Ry5lbmFibGVCcmlkZ2VncmFwaCYmIXZiJiYhcWImJlhhLmlzSW5Db3JlKCkmJihHYj1OYj0+YmEuY29yZUdyYXBoLmVkZ2UoRmE/e3Y6TmIsdzpMfTp7djpMLHc6TmJ9KSwoeGE9R2IoU2EpKXx8KHhhPUdiKGVhKEZhLFNhLFoubmFtZSkpKSxHYj0hIXhhKTtYYT0hMTtpZih4YSYmIUFhLm51bVJlZ3VsYXJFZGdlcyl7WGE9eGE7Zm9yKHFiPWJhLm5vZGU7WGEuYWRqb2luaW5nTWV0YWVkZ2U7KVhhPVhhLmFkam9pbmluZ01ldGFlZGdlLHFiPXFiLnBhcmVudE5vZGU7cWI9dGhpcy5oaWVyYXJjaHkuZ2V0VG9wb2xvZ2ljYWxPcmRlcmluZyhxYi5uYW1lKTsKWGE9WGEubWV0YWVkZ2U7WGE9cWJbWGEudl0+cWJbWGEud119R2ImJiFYYT8oQmI9ZWEoRmEsTCksdWI9ZWEoRmEsU2EsTCksemI9WC5ub2RlKHViKSx6Ynx8KEdiPVgubm9kZShCYiksR2J8fChHYj1uZXcgSCh7bmFtZTpCYix0eXBlOmQuTm9kZVR5cGUuQlJJREdFLGlzR3JvdXBOb2RlOiExLGNhcmRpbmFsaXR5OjAscGFyZW50Tm9kZTpudWxsLHN0YXRzOm51bGwsaW5jbHVkZTpkLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQsaW5ib3VuZDpGYSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbQmJdPUdiLFguc2V0Tm9kZShCYixHYikpLHpiPW5ldyBIKHtuYW1lOnViLHR5cGU6ZC5Ob2RlVHlwZS5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOkZhLG5vZGVBdHRyaWJ1dGVzOnt9fSksdGhpcy5pbmRleFt1Yl09emIsWC5zZXROb2RlKHViLAp6YiksWC5zZXRQYXJlbnQodWIsQmIpLEdiLm5vZGUuY2FyZGluYWxpdHkrKyksQWE9bmV3IEsoQWEpLEFhLmFkam9pbmluZ01ldGFlZGdlPXhhLEZhP1guc2V0RWRnZSh1Yix5YSxBYSk6WC5zZXRFZGdlKHlhLHViLEFhKSk6emIucHVzaChuZXcgSShCYix1YixuZXcgSyhBYSksTi5TSE9SVENVVCxGYSkpfSk7Xy5lYWNoKFshMCwhMV0seGE9PntsZXQgQWE9ZWEoeGEsTCksRmE9WC5ub2RlKEFhKTtGYSYmXy5lYWNoKFgubm9kZXMoKSx5YT0+e2lmKFgubm9kZSh5YSkubm9kZS50eXBlIT09ZC5Ob2RlVHlwZS5CUklER0UmJih4YT8hWC5wcmVkZWNlc3NvcnMoeWEpLmxlbmd0aDohWC5zdWNjZXNzb3JzKHlhKS5sZW5ndGgpKXt2YXIgU2E9ZWEoeGEsTCwiU1RSVUNUVVJBTF9UQVJHRVQiKSxYYT1YLm5vZGUoU2EpO1hhfHwoWGE9bmV3IEgoe25hbWU6U2EsdHlwZTpkLk5vZGVUeXBlLkJSSURHRSxpc0dyb3VwTm9kZTohMSxjYXJkaW5hbGl0eToxLHBhcmVudE5vZGU6bnVsbCxzdGF0czpudWxsLAppbmNsdWRlOmQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOnhhLG5vZGVBdHRyaWJ1dGVzOnt9fSksWGEuc3RydWN0dXJhbD0hMCx0aGlzLmluZGV4W1NhXT1YYSxYLnNldE5vZGUoU2EsWGEpLEZhLm5vZGUuY2FyZGluYWxpdHkrKyxYLnNldFBhcmVudChTYSxBYSkpO1hhPW5ldyBLKG51bGwpO1hhLnN0cnVjdHVyYWw9ITA7WGEud2VpZ2h0LS07eGE/WC5zZXRFZGdlKFNhLHlhLFhhKTpYLnNldEVkZ2UoeWEsU2EsWGEpfX0pfSl9fX19YnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyhMKXtfLmVhY2goTC5lZGdlcygpLFE9PntRPUwuZWRnZShRKTtRPW5ldyBLKFEpO18uZm9yRWFjaChRLm1ldGFlZGdlLmJhc2VFZGdlTGlzdCxUPT57dmFyIFg9VC52LnNwbGl0KGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKTtmb3IodmFyIGFhPVgubGVuZ3RoOzA8PWFhO2FhLS0pe1Q9WC5zbGljZSgwLGFhKTtjb25zdCBsYT10aGlzLmhpZXJhcmNoeS5ub2RlKFQuam9pbihiLmdyYXBoLk5BTUVTUEFDRV9ERUxJTSkpOwppZihsYSl7aWYobGEudHlwZT09PWQuTm9kZVR5cGUuT1AmJnRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbbGEub3BdKWZvcihYPTE7WDxULmxlbmd0aDtYKyspKGFhPVQuc2xpY2UoMCxYKS5qb2luKGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSkmJnRoaXMuYnVpbGRTdWJoaWVyYXJjaHkoYWEpO2JyZWFrfX19KX0pfX1mLlJlbmRlckdyYXBoSW5mbz1CO2NsYXNzIEl7Y29uc3RydWN0b3IoTCxRLFQsWCxhYSl7dGhpcy5ub2RlPUw7dGhpcy5yZW5kZXJOb2RlSW5mbz1RO3RoaXMucmVuZGVyTWV0YWVkZ2VJbmZvPVQ7dGhpcy5hbm5vdGF0aW9uVHlwZT1YO3RoaXMuaGVpZ2h0PXRoaXMud2lkdGg9dGhpcy5keT10aGlzLmR4PTA7VCYmVC5tZXRhZWRnZSYmKHRoaXMudj1ULm1ldGFlZGdlLnYsdGhpcy53PVQubWV0YWVkZ2Uudyk7dGhpcy5pc0luPWFhO3RoaXMucG9pbnRzPVtdfX1mLkFubm90YXRpb249STtsZXQgTjsoZnVuY3Rpb24oTCl7TFtMLlNIT1JUQ1VUPTBdPSJTSE9SVENVVCI7CkxbTC5DT05TVEFOVD0xXT0iQ09OU1RBTlQiO0xbTC5TVU1NQVJZPTJdPSJTVU1NQVJZIjtMW0wuRUxMSVBTSVM9M109IkVMTElQU0lTIn0pKE49Zi5Bbm5vdGF0aW9uVHlwZXx8KGYuQW5ub3RhdGlvblR5cGU9e30pKTtjbGFzcyBPe2NvbnN0cnVjdG9yKCl7dGhpcy5saXN0PVtdO3RoaXMubm9kZU5hbWVzPXt9fXB1c2goTCl7aWYoIShMLm5vZGUubmFtZSBpbiB0aGlzLm5vZGVOYW1lcykpaWYodGhpcy5ub2RlTmFtZXNbTC5ub2RlLm5hbWVdPSEwLHRoaXMubGlzdC5sZW5ndGg8Ry5tYXhBbm5vdGF0aW9ucyl0aGlzLmxpc3QucHVzaChMKTtlbHNle3ZhciBRPXRoaXMubGlzdFt0aGlzLmxpc3QubGVuZ3RoLTFdO1EuYW5ub3RhdGlvblR5cGU9PT1OLkVMTElQU0lTPyhMPVEubm9kZSxMLnNldE51bU1vcmVOb2RlcygrK0wubnVtTW9yZU5vZGVzKSk6KFE9bmV3IGIuZ3JhcGguRWxsaXBzaXNOb2RlSW1wbCgxKSx0aGlzLmxpc3QucHVzaChuZXcgSShRLG5ldyBIKFEpLG51bGwsTi5FTExJUFNJUywKTC5pc0luKSkpfX19Zi5Bbm5vdGF0aW9uTGlzdD1PO2NsYXNzIEh7Y29uc3RydWN0b3IoTCl7dGhpcy5ub2RlPUw7dGhpcy5leHBhbmRlZD0hMTt0aGlzLmluQW5ub3RhdGlvbnM9bmV3IE87dGhpcy5vdXRBbm5vdGF0aW9ucz1uZXcgTzt0aGlzLm91dGJveFdpZHRoPXRoaXMuaW5ib3hXaWR0aD10aGlzLmhlaWdodD10aGlzLndpZHRoPXRoaXMueT10aGlzLng9MDt0aGlzLnN0cnVjdHVyYWw9dGhpcy5leGNsdWRlZD0hMTt0aGlzLnBhZGRpbmdCb3R0b209dGhpcy5wYWRkaW5nUmlnaHQ9dGhpcy5wYWRkaW5nTGVmdD10aGlzLnBhZGRpbmdUb3A9dGhpcy5sYWJlbEhlaWdodD10aGlzLnJhZGl1cz10aGlzLmxhYmVsT2Zmc2V0PTA7dGhpcy5pc091dEV4dHJhY3Q9dGhpcy5pc0luRXh0cmFjdD0hMTt0aGlzLmNvcmVCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMuaXNGYWRlZE91dD0hMTt0aGlzLmRpc3BsYXlOYW1lPUwubmFtZS5zdWJzdHJpbmcoTC5uYW1lLmxhc3RJbmRleE9mKGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSsKMSk7TC50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBJiZMLmFzc29jaWF0ZWRGdW5jdGlvbiYmKChMPXRoaXMuZGlzcGxheU5hbWUubWF0Y2goRCkpP3RoaXMuZGlzcGxheU5hbWU9TFsxXTpfLnN0YXJ0c1dpdGgodGhpcy5kaXNwbGF5TmFtZSxiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpJiYodGhpcy5kaXNwbGF5TmFtZT10aGlzLmRpc3BsYXlOYW1lLnN1YnN0cmluZyhiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgubGVuZ3RoKSkpfWlzSW5Db3JlKCl7cmV0dXJuIXRoaXMuaXNJbkV4dHJhY3QmJiF0aGlzLmlzT3V0RXh0cmFjdCYmIXRoaXMuaXNMaWJyYXJ5RnVuY3Rpb259fWYuUmVuZGVyTm9kZUluZm89SDtjbGFzcyBLe2NvbnN0cnVjdG9yKEwpe3RoaXMubWV0YWVkZ2U9TDt0aGlzLmFkam9pbmluZ01ldGFlZGdlPW51bGw7dGhpcy5zdHJ1Y3R1cmFsPSExO3RoaXMud2VpZ2h0PTE7dGhpcy5pc0ZhZGVkT3V0PSExfX1mLlJlbmRlck1ldGFlZGdlSW5mbz0KSztjbGFzcyBNIGV4dGVuZHMgSHtjb25zdHJ1Y3RvcihMLFEpe3N1cGVyKEwpO0w9TC5tZXRhZ3JhcGguZ3JhcGgoKTtRLmNvbXBvdW5kPSEwO3RoaXMuY29yZUdyYXBoPWQuY3JlYXRlR3JhcGgoTC5uYW1lLGQuR3JhcGhUeXBlLkNPUkUsUSk7dGhpcy5pbkV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMub3V0RXh0cmFjdEJveD17d2lkdGg6MCxoZWlnaHQ6MH07dGhpcy5saWJyYXJ5RnVuY3Rpb25zQm94PXt3aWR0aDowLGhlaWdodDowfTt0aGlzLmlzb2xhdGVkSW5FeHRyYWN0PVtdO3RoaXMuaXNvbGF0ZWRPdXRFeHRyYWN0PVtdO3RoaXMubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3Q9W119fWYuUmVuZGVyR3JvdXBOb2RlSW5mbz1NO2YubWFrZUluRXh0cmFjdD1uO2YubWFwSW5kZXhUb0h1ZT1mdW5jdGlvbihMKXtyZXR1cm4gMSs1NzkuMjU2MTY3OTcyNSpMJTM1OH07Zi5leHBhbmRVbnRpbE5vZGVJc1Nob3duPWZ1bmN0aW9uKEwsUSl7dmFyIFQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNjZW5lIik7ClE9US5zcGxpdCgiLyIpO3ZhciBYPVFbUS5sZW5ndGgtMV0ubWF0Y2goLyguKik6XHcrLyk7Mj09PVgubGVuZ3RoJiYoUVtRLmxlbmd0aC0xXT1YWzFdKTtYPVFbMF07bGV0IGFhPUwuZ2V0UmVuZGVyTm9kZUJ5TmFtZShYKTtmb3IobGV0IGxhPTE7bGE8US5sZW5ndGgmJmFhLm5vZGUudHlwZSE9PWIuZ3JhcGguTm9kZVR5cGUuT1A7bGErKylMLmJ1aWxkU3ViaGllcmFyY2h5KFgpLGFhLmV4cGFuZGVkPSEwLFQuc2V0Tm9kZUV4cGFuZGVkKGFhKSxYKz0iLyIrUVtsYV0sYWE9TC5nZXRSZW5kZXJOb2RlQnlOYW1lKFgpO3JldHVybiBhYS5ub2RlLm5hbWV9fSkoZC5yZW5kZXJ8fChkLnJlbmRlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vc2NlbmUuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChxLHUseCxBKXt2YXIgeT1rKHEsdSx4KTtpZigheS5lbXB0eSgpKXJldHVybiB5O3U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdSk7aWYoeCBpbnN0YW5jZW9mIEFycmF5KWZvcih5PTA7eTx4Lmxlbmd0aDt5KyspdS5jbGFzc0xpc3QuYWRkKHhbeV0pO2Vsc2UgdS5jbGFzc0xpc3QuYWRkKHgpO0E/cS5ub2RlKCkuaW5zZXJ0QmVmb3JlKHUsQSk6cS5ub2RlKCkuYXBwZW5kQ2hpbGQodSk7cmV0dXJuIGQzLnNlbGVjdCh1KS5kYXR1bShxLmRhdHVtKCkpfWZ1bmN0aW9uIGsocSx1LHgpe3E9cS5ub2RlKCkuY2hpbGROb2Rlcztmb3IobGV0IEE9MDtBPHEubGVuZ3RoO0ErKyl7bGV0IHk9cVtBXTtpZih5LnRhZ05hbWU9PT11KWlmKHggaW5zdGFuY2VvZiBBcnJheSl7bGV0IHc9ITA7Zm9yKGxldCBDPTA7Qzx4Lmxlbmd0aDtDKyspdz13JiZ5LmNsYXNzTGlzdC5jb250YWlucyh4W0NdKTsKaWYodylyZXR1cm4gZDMuc2VsZWN0KHkpfWVsc2UgaWYoIXh8fHkuY2xhc3NMaXN0LmNvbnRhaW5zKHgpKXJldHVybiBkMy5zZWxlY3QoeSl9cmV0dXJuIGQzLnNlbGVjdChudWxsKX1mdW5jdGlvbiB0KHEsdSl7bGV0IHg9dS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUz8wOmQubGF5b3V0LlBBUkFNUy5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0O2woayhxLCJnIixmLkNsYXNzLlNjZW5lLkNPUkUpLDAseCk7dmFyIEE9MDx1Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCx5PTA8dS5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoO2xldCB3PTA8dS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgsQz1kLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldCxHPTA7QSYmKEcrPXUub3V0RXh0cmFjdEJveC53aWR0aCk7eSYmKEcrPXUub3V0RXh0cmFjdEJveC53aWR0aCk7QSYmKEE9dS5jb3JlQm94LndpZHRoLEE9RzxkLmxheW91dC5NSU5fQVVYX1dJRFRIPwpBLWQubGF5b3V0Lk1JTl9BVVhfV0lEVEgrdS5pbkV4dHJhY3RCb3gud2lkdGgvMjpBLXUuaW5FeHRyYWN0Qm94LndpZHRoLzItdS5vdXRFeHRyYWN0Qm94LndpZHRoLSh5P0M6MCksQT1BLXUubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC0odz9DOjApLGwoayhxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCksQSx4KSk7eSYmKHk9dS5jb3JlQm94LndpZHRoLHk9RzxkLmxheW91dC5NSU5fQVVYX1dJRFRIP3ktZC5sYXlvdXQuTUlOX0FVWF9XSURUSCt1Lm91dEV4dHJhY3RCb3gud2lkdGgvMjp5LXUub3V0RXh0cmFjdEJveC53aWR0aC8yLHk9eS11LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKHc/QzowKSxsKGsocSwiZyIsZi5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKSx5LHgpKTt3JiYodT11LmNvcmVCb3gud2lkdGgtdS5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoLzIsbChrKHEsImciLGYuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksdSx4KSl9ZnVuY3Rpb24gbChxLAp1LHgpe251bGwhPXEuYXR0cigidHJhbnNmb3JtIikmJihxPXEudHJhbnNpdGlvbigicG9zaXRpb24iKSk7cS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit1KyIsIit4KyIpIil9ZnVuY3Rpb24gcChxLHUpe3JldHVybiB1P3EudG9GaXhlZCgwKToxPD1NYXRoLmFicyhxKT9xLnRvRml4ZWQoMSk6cS50b0V4cG9uZW50aWFsKDEpfWZ1bmN0aW9uIG0ocSx1LHgsQSl7bGV0IHk9IkRldmljZTogIitxLmRldmljZV9uYW1lKyJcbiI7eSs9ImR0eXBlOiAiK3EuZHR5cGUrIlxuIjtsZXQgdz0iKHNjYWxhcikiOzA8cS5zaGFwZS5sZW5ndGgmJih3PSIoIitxLnNoYXBlLmpvaW4oIiwiKSsiKSIpO3k9eSsoIlxuc2hhcGU6ICIrdysiXG5cbiMoZWxlbWVudHMpOiAiKSsodSsiXG4iKTtxPVtdO2Zvcih1PTA7dTx4Lmxlbmd0aDt1KyspMDx4W3VdJiZxLnB1c2goIiMoIitmLmhlYWx0aFBpbGxFbnRyaWVzW3VdLmxhYmVsKyIpOiAiK3hbdV0pO3krPXEuam9pbigiLCAiKSsiXG5cbiI7QS5tYXg+PQpBLm1pbiYmKHkrPSJtaW46ICIrQS5taW4rIiwgbWF4OiAiK0EubWF4KyJcbiIseSs9Im1lYW46ICIrQS5tZWFuKyIsIHN0ZGRldjogIitBLnN0ZGRldik7cmV0dXJuIHl9ZnVuY3Rpb24gbihxLHUseCxBLHk9NjAsdz0xMCxDPTAsRyl7ZDMuc2VsZWN0KHEucGFyZW50Tm9kZSkuc2VsZWN0QWxsKCIuaGVhbHRoLXBpbGwiKS5yZW1vdmUoKTtpZih1KXt2YXIgRD11LnZhbHVlLEI9RC5zbGljZSgyLDgpLEk9QlswXSxOPUJbMV0sTz1CWzVdLEg9RFsxXSxLPXttaW46RFs4XSxtYXg6RFs5XSxtZWFuOkRbMTBdLHN0ZGRldjpNYXRoLnNxcnQoRFsxMV0pfTtudWxsPT15JiYoeT02MCk7bnVsbD09dyYmKHc9MTApO251bGw9PUMmJihDPTApO251bGwhPXgmJngubm9kZS50eXBlPT09Yi5ncmFwaC5Ob2RlVHlwZS5PUCYmKHkvPTIsdy89Mik7RD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJnIik7RC5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmLlNWR19OQU1FU1BBQ0UsCiJkZWZzIik7RC5hcHBlbmRDaGlsZChNKTt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJsaW5lYXJHcmFkaWVudCIpO0E9ImhlYWx0aC1waWxsLWdyYWRpZW50LSIrQTtMLnNldEF0dHJpYnV0ZSgiaWQiLEEpO3ZhciBRPTAsVD0iMCUiO2ZvcihsZXQgYWE9MDthYTxCLmxlbmd0aDthYSsrKWlmKEJbYWFdKXtRKz1CW2FhXTt2YXIgWD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJzdG9wIik7WC5zZXRBdHRyaWJ1dGUoIm9mZnNldCIsVCk7WC5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLGYuaGVhbHRoUGlsbEVudHJpZXNbYWFdLmJhY2tncm91bmRfY29sb3IpO0wuYXBwZW5kQ2hpbGQoWCk7VD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJzdG9wIik7WD0xMDAqUS9IKyIlIjtULnNldEF0dHJpYnV0ZSgib2Zmc2V0IixYKTtULnNldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIsZi5oZWFsdGhQaWxsRW50cmllc1thYV0uYmFja2dyb3VuZF9jb2xvcik7CkwuYXBwZW5kQ2hpbGQoVCk7VD1YfU0uYXBwZW5kQ2hpbGQoTCk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJyZWN0Iik7TS5zZXRBdHRyaWJ1dGUoImZpbGwiLCJ1cmwoIyIrQSsiKSIpO00uc2V0QXR0cmlidXRlKCJ3aWR0aCIsU3RyaW5nKHkpKTtNLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixTdHJpbmcodykpO00uc2V0QXR0cmlidXRlKCJ5IixTdHJpbmcoQykpO0QuYXBwZW5kQ2hpbGQoTSk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJ0aXRsZSIpO00udGV4dENvbnRlbnQ9bSh1LEgsQixLKTtELmFwcGVuZENoaWxkKE0pO3U9ITE7aWYobnVsbCE9eCYmKE09eC54LXkvMix3PXgueS13LXguaGVpZ2h0LzItMiwwPngubGFiZWxPZmZzZXQmJih3Kz14LmxhYmVsT2Zmc2V0KSxELnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTSsiLCAiK3crIikiKSwoQlsyXXx8QlszXXx8Qls0XSkmJih4PXgubm9kZS5hdHRyKSYmCngubGVuZ3RoKSlmb3IoQj0wO0I8eC5sZW5ndGg7QisrKWlmKCJUIj09PXhbQl0ua2V5KXt1PSh4PXhbQl0udmFsdWUudHlwZSkmJi9eRFRfKEJPT0x8SU5UfFVJTlQpLy50ZXN0KHgpO2JyZWFrfXg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwidGV4dCIpO2lmKE51bWJlci5pc0Zpbml0ZShLLm1pbikmJk51bWJlci5pc0Zpbml0ZShLLm1heCkpe2lmKEI9cChLLm1pbix1KSxLPXAoSy5tYXgsdSkseC50ZXh0Q29udGVudD0xPEg/QisiIH4gIitLOkIsMDxJfHwwPE58fDA8Tyl4LnRleHRDb250ZW50Kz0iICgiLEg9W10sMDxJJiZILnB1c2goYE5hTlx1MDBkNyR7SX1gKSwwPE4mJkgucHVzaChgLVx1MjIxZVx1MDBkNyR7Tn1gKSwwPE8mJkgucHVzaChgK1x1MjIxZVx1MDBkNyR7T31gKSx4LnRleHRDb250ZW50Kz1ILmpvaW4oIjsgIikrIikifWVsc2UgeC50ZXh0Q29udGVudD0iKE5vIGZpbml0ZSBlbGVtZW50cykiO3guY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwtc3RhdHMiKTsKbnVsbD09RyYmKEc9eS8yKTt4LnNldEF0dHJpYnV0ZSgieCIsU3RyaW5nKEcpKTt4LnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKEMtMikpO0QuYXBwZW5kQ2hpbGQoeCk7UG9seW1lci5kb20ocS5wYXJlbnROb2RlKS5hcHBlbmRDaGlsZChEKX19Zi5TVkdfTkFNRVNQQUNFPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7Zi5DbGFzcz17Tm9kZTp7Q09OVEFJTkVSOiJub2RlcyIsR1JPVVA6Im5vZGUiLFNIQVBFOiJub2Rlc2hhcGUiLENPTE9SX1RBUkdFVDoibm9kZWNvbG9ydGFyZ2V0IixMQUJFTDoibm9kZWxhYmVsIixCVVRUT05fQ09OVEFJTkVSOiJidXR0b25jb250YWluZXIiLEJVVFRPTl9DSVJDTEU6ImJ1dHRvbmNpcmNsZSIsRVhQQU5EX0JVVFRPTjoiZXhwYW5kYnV0dG9uIixDT0xMQVBTRV9CVVRUT046ImNvbGxhcHNlYnV0dG9uIn0sRWRnZTp7Q09OVEFJTkVSOiJlZGdlcyIsR1JPVVA6ImVkZ2UiLExJTkU6ImVkZ2VsaW5lIixSRUZFUkVOQ0VfRURHRToicmVmZXJlbmNlZWRnZSIsClJFRl9MSU5FOiJyZWZsaW5lIixTRUxFQ1RBQkxFOiJzZWxlY3RhYmxlZWRnZSIsU0VMRUNURUQ6InNlbGVjdGVkZWRnZSIsU1RSVUNUVVJBTDoic3RydWN0dXJhbCJ9LEFubm90YXRpb246e09VVEJPWDoib3V0LWFubm90YXRpb25zIixJTkJPWDoiaW4tYW5ub3RhdGlvbnMiLEdST1VQOiJhbm5vdGF0aW9uIixOT0RFOiJhbm5vdGF0aW9uLW5vZGUiLEVER0U6ImFubm90YXRpb24tZWRnZSIsQ09OVFJPTF9FREdFOiJhbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSIsTEFCRUw6ImFubm90YXRpb24tbGFiZWwiLEVMTElQU0lTOiJhbm5vdGF0aW9uLWVsbGlwc2lzIn0sU2NlbmU6e0dST1VQOiJzY2VuZSIsQ09SRToiY29yZSIsRlVOQ1RJT05fTElCUkFSWToiZnVuY3Rpb24tbGlicmFyeSIsSU5FWFRSQUNUOiJpbi1leHRyYWN0IixPVVRFWFRSQUNUOiJvdXQtZXh0cmFjdCJ9LFN1YnNjZW5lOntHUk9VUDoic3Vic2NlbmUifSxPUE5PREU6Im9wIixNRVRBTk9ERToibWV0YSIsU0VSSUVTTk9ERToic2VyaWVzIiwKQlJJREdFTk9ERToiYnJpZGdlIixFTExJUFNJU05PREU6ImVsbGlwc2lzIn07Zi5oZWFsdGhQaWxsRW50cmllcz1be2JhY2tncm91bmRfY29sb3I6IiNDQzJGMkMiLGxhYmVsOiJOYU4ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0ZGOEQwMCIsbGFiZWw6Ii1cdTIyMWUifSx7YmFja2dyb3VuZF9jb2xvcjoiI0VBRUFFQSIsbGFiZWw6Ii0ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0E1QTVBNSIsbGFiZWw6IjAifSx7YmFja2dyb3VuZF9jb2xvcjoiIzI2MjYyNiIsbGFiZWw6IisifSx7YmFja2dyb3VuZF9jb2xvcjoiIzAwM0VENCIsbGFiZWw6IitcdTIyMWUifV07Zi5maXQ9ZnVuY3Rpb24ocSx1LHgsQSl7dmFyIHk9cS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtsZXQgdz1udWxsO3RyeXtpZih3PXUuZ2V0QkJveCgpLDA9PT13LndpZHRoKXJldHVybn1jYXRjaChDKXtyZXR1cm59dT1kLmxheW91dC5QQVJBTVMuZ3JhcGg7eT1kMy56b29tSWRlbnRpdHkuc2NhbGUoLjkqTWF0aC5taW4oeS53aWR0aC8Kdy53aWR0aCx5LmhlaWdodC93LmhlaWdodCwyKSkudHJhbnNsYXRlKHUucGFkZGluZy5wYWRkaW5nTGVmdCx1LnBhZGRpbmcucGFkZGluZ1RvcCk7ZDMuc2VsZWN0KHEpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwoeC50cmFuc2Zvcm0seSkub24oImVuZC5maXR0ZWQiLCgpPT57eC5vbigiZW5kLmZpdHRlZCIsbnVsbCk7QSgpfSl9O2YucGFuVG9Ob2RlPWZ1bmN0aW9uKHEsdSx4LEEpe3g9ZDMuc2VsZWN0KHUpLnNlbGVjdChgW2RhdGEtbmFtZT0iJHtxfSJdYCkubm9kZSgpO2lmKCF4KXJldHVybiBjb25zb2xlLndhcm4oYHBhblRvTm9kZSgpIGZhaWxlZCBmb3Igbm9kZSBuYW1lICIke3F9ImApLCExO3ZhciB5PXguZ2V0QkJveCgpLHc9eC5nZXRTY3JlZW5DVE0oKTtxPXUuY3JlYXRlU1ZHUG9pbnQoKTt4PXUuY3JlYXRlU1ZHUG9pbnQoKTtxLng9eS54O3EueT15Lnk7eC54PXkueCt5LndpZHRoO3gueT15LnkreS5oZWlnaHQ7cT1xLm1hdHJpeFRyYW5zZm9ybSh3KTt4PQp4Lm1hdHJpeFRyYW5zZm9ybSh3KTt3PShHLEQsQixJKT0+IShHPkImJkQ8SSk7eT11LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IEM9eS50b3AreS5oZWlnaHQtMTUwO3JldHVybiB3KHEueCx4LngseS5sZWZ0LHkubGVmdCt5LndpZHRoLTMyMCl8fHcocS55LHgueSx5LnRvcCxDKT8odz15LmxlZnQreS53aWR0aC8yLShxLngreC54KS8yLHE9eS50b3AreS5oZWlnaHQvMi0ocS55K3gueSkvMix4PWQzLnpvb21UcmFuc2Zvcm0odSksZDMuc2VsZWN0KHUpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwoQS50cmFuc2xhdGVCeSx3L3guayxxL3guayksITApOiExfTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQ9aDtmLnNlbGVjdENoaWxkPWs7Zi5idWlsZEdyb3VwPWZ1bmN0aW9uKHEsdSx4LEEpe0E9QXx8Zi5DbGFzcy5TY2VuZS5HUk9VUDtsZXQgeT1rKHEsImciLEEpLmVtcHR5KCk7cT1oKHEsImciLEEpO0E9aChxLCJnIixmLkNsYXNzLlNjZW5lLkNPUkUpO2xldCB3PV8ucmVkdWNlKHUuY29yZUdyYXBoLm5vZGVzKCksCihDLEcpPT57Rz11LmNvcmVHcmFwaC5ub2RlKEcpO0cuZXhjbHVkZWR8fEMucHVzaChHKTtyZXR1cm4gQ30sW10pO3Uubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMmJncucmV2ZXJzZSgpO2YuZWRnZS5idWlsZEdyb3VwKEEsdS5jb3JlR3JhcGgseCk7Zi5ub2RlLmJ1aWxkR3JvdXAoQSx3LHgpOzA8dS5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGg/KEE9aChxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCksZi5ub2RlLmJ1aWxkR3JvdXAoQSx1Lmlzb2xhdGVkSW5FeHRyYWN0LHgpKTprKHEsImciLGYuQ2xhc3MuU2NlbmUuSU5FWFRSQUNUKS5yZW1vdmUoKTswPHUuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aD8oQT1oKHEsImciLGYuQ2xhc3MuU2NlbmUuT1VURVhUUkFDVCksZi5ub2RlLmJ1aWxkR3JvdXAoQSx1Lmlzb2xhdGVkT3V0RXh0cmFjdCx4KSk6ayhxLCJnIixmLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLnJlbW92ZSgpOzA8dS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGg/CihBPWgocSwiZyIsZi5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKSxmLm5vZGUuYnVpbGRHcm91cChBLHUubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QseCkpOmsocSwiZyIsZi5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5yZW1vdmUoKTt0KHEsdSk7eSYmcS5hdHRyKCJvcGFjaXR5IiwwKS50cmFuc2l0aW9uKCkuYXR0cigib3BhY2l0eSIsMSk7cmV0dXJuIHF9O2YuYWRkR3JhcGhDbGlja0xpc3RlbmVyPWZ1bmN0aW9uKHEsdSl7ZDMuc2VsZWN0KHEpLm9uKCJjbGljayIsKCk9Pnt1LmZpcmUoImdyYXBoLXNlbGVjdCIpfSl9O2YudHJhbnNsYXRlPWw7Zi5wb3NpdGlvblJlY3Q9ZnVuY3Rpb24ocSx1LHgsQSx5KXtxLnRyYW5zaXRpb24oKS5hdHRyKCJ4Iix1LUEvMikuYXR0cigieSIseC15LzIpLmF0dHIoIndpZHRoIixBKS5hdHRyKCJoZWlnaHQiLHkpfTtmLnBvc2l0aW9uVHJpYW5nbGU9ZnVuY3Rpb24ocSx1LHgsQSx5KXt5Lz0yO0EvPTI7dT1bW3UseC15XSxbdStBLAp4K3ldLFt1LUEseCt5XV07cS50cmFuc2l0aW9uKCkuYXR0cigicG9pbnRzIix1Lm1hcCh3PT53LmpvaW4oIiwiKSkuam9pbigiICIpKX07Zi5wb3NpdGlvbkJ1dHRvbj1mdW5jdGlvbihxLHUpe2xldCB4PWQubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUodSkrKHUuZXhwYW5kZWQ/dS53aWR0aDp1LmNvcmVCb3gud2lkdGgpLzItNixBPXUueS0odS5leHBhbmRlZD91LmhlaWdodDp1LmNvcmVCb3guaGVpZ2h0KS8yKzY7dS5ub2RlLnR5cGUhPT1kLk5vZGVUeXBlLlNFUklFU3x8dS5leHBhbmRlZHx8KHgrPTEwLEEtPTIpO3U9InRyYW5zbGF0ZSgiK3grIiwiK0ErIikiO3Euc2VsZWN0QWxsKCJwYXRoIikudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsdSk7cS5zZWxlY3QoImNpcmNsZSIpLnRyYW5zaXRpb24oKS5hdHRyKHtjeDp4LGN5OkEscjpkLmxheW91dC5QQVJBTVMubm9kZVNpemUubWV0YS5leHBhbmRCdXR0b25SYWRpdXN9KX07Zi5wb3NpdGlvbkVsbGlwc2U9CmZ1bmN0aW9uKHEsdSx4LEEseSl7cS50cmFuc2l0aW9uKCkuYXR0cigiY3giLHUpLmF0dHIoImN5Iix4KS5hdHRyKCJyeCIsQS8yKS5hdHRyKCJyeSIseS8yKX07Zi5odW1hbml6ZUhlYWx0aFBpbGxTdGF0PXA7Zi5hZGRIZWFsdGhQaWxsPW47Zi5hZGRIZWFsdGhQaWxscz1mdW5jdGlvbihxLHUseCl7aWYodSl7dmFyIEE9MTtkMy5zZWxlY3QocSkuc2VsZWN0QWxsKCJnLm5vZGVzaGFwZSIpLmVhY2goZnVuY3Rpb24oeSl7Y29uc3Qgdz11W3kubm9kZS5uYW1lXTtuKHRoaXMsdz93W3hdOm51bGwseSxBKyspfSl9fX0pKGQuc2NlbmV8fChkLnNjZW5lPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90ZW1wbGF0ZS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKG4pe2xldCBxPV8ubWFwKHtkZXB0aDpuLmRlcHRoLCJ8VnwiOm4ubWV0YWdyYXBoLm5vZGVzKCkubGVuZ3RoLCJ8RXwiOm4ubWV0YWdyYXBoLmVkZ2VzKCkubGVuZ3RofSxmdW5jdGlvbih1LHgpe3JldHVybiB4KyJceDNkIit1fSkuam9pbigiICIpO249Xy5tYXAobi5vcEhpc3RvZ3JhbSxmdW5jdGlvbih1LHgpe3JldHVybiB4KyJceDNkIit1fSkuam9pbigiLCIpO3JldHVybiBxKyIgW29wc10gIitufWZ1bmN0aW9uIGsobil7Y29uc3QgcT1uLmdldE5vZGVNYXAoKTtsZXQgdT1PYmplY3Qua2V5cyhxKS5yZWR1Y2UoKHgsQSk9Pntjb25zdCB5PXFbQV07aWYoeS50eXBlIT09ZC5Ob2RlVHlwZS5NRVRBKXJldHVybiB4O0E9QS5zcGxpdCgiLyIpLmxlbmd0aC0xO2xldCB3PWgoeSksQz14W3ddfHx7bm9kZXM6W10sbGV2ZWw6QX07eFt3XT1DO0Mubm9kZXMucHVzaCh5KTtDLmxldmVsPkEmJihDLmxldmVsPQpBKTtyZXR1cm4geH0se30pO3JldHVybiBPYmplY3Qua2V5cyh1KS5tYXAoeD0+W3gsdVt4XV0pLmZpbHRlcigoWyx4XSk9Pnt4PXgubm9kZXM7aWYoMTx4Lmxlbmd0aClyZXR1cm4hMDt4PXhbMF07cmV0dXJuIHgudHlwZT09PWQuTm9kZVR5cGUuTUVUQSYmeC5hc3NvY2lhdGVkRnVuY3Rpb259KS5zb3J0KChbLHhdKT0+eC5ub2Rlc1swXS5kZXB0aCl9ZnVuY3Rpb24gdChuLHEpe3JldHVybiBfLnJlZHVjZShuLGZ1bmN0aW9uKHUseCl7bGV0IEE9eFswXSx5PVtdO3hbMV0ubm9kZXMuZm9yRWFjaChmdW5jdGlvbih3KXtmb3IobGV0IEM9MDtDPHkubGVuZ3RoO0MrKylpZighcXx8cCh5W0NdLm1ldGFub2RlLm1ldGFncmFwaCx3Lm1ldGFncmFwaCkpe3cudGVtcGxhdGVJZD15W0NdLm1ldGFub2RlLnRlbXBsYXRlSWQ7eVtDXS5tZW1iZXJzLnB1c2gody5uYW1lKTtyZXR1cm59dy50ZW1wbGF0ZUlkPUErIlsiK3kubGVuZ3RoKyJdIjt5LnB1c2goe21ldGFub2RlOncsbWVtYmVyczpbdy5uYW1lXX0pfSk7CnkuZm9yRWFjaChmdW5jdGlvbih3KXt1W3cubWV0YW5vZGUudGVtcGxhdGVJZF09e2xldmVsOnhbMV0ubGV2ZWwsbm9kZXM6dy5tZW1iZXJzfX0pO3JldHVybiB1fSx7fSl9ZnVuY3Rpb24gbChuLHEsdSl7cmV0dXJuIF8uc29ydEJ5KG4sW3g9PnEubm9kZSh4KS5vcCx4PT5xLm5vZGUoeCkudGVtcGxhdGVJZCx4PT5xLm5laWdoYm9ycyh4KS5sZW5ndGgseD0+cS5wcmVkZWNlc3NvcnMoeCkubGVuZ3RoLHg9PnEuc3VjY2Vzc29ycyh4KS5sZW5ndGgseD0+eC5zdWJzdHIodS5sZW5ndGgpXSl9ZnVuY3Rpb24gcChuLHEpe2Z1bmN0aW9uIHUoSSxOKXtsZXQgTz1JLnN1YnN0cih4Lmxlbmd0aCksSD1OLnN1YnN0cihBLmxlbmd0aCk7aWYoeVtPXV53W0hdKXJldHVybiBjb25zb2xlLndhcm4oImRpZmZlcmVudCB2aXNpdCBwYXR0ZXJuIiwiWyIreCsiXSIsTywiWyIrQSsiXSIsSCksITA7eVtPXXx8KHlbT109d1tIXT0hMCxDLnB1c2goe24xOkksbjI6Tn0pKTtyZXR1cm4hMX1pZighYi5ncmFwaC5oYXNTaW1pbGFyRGVncmVlU2VxdWVuY2UobiwKcSkpcmV0dXJuITE7bGV0IHg9bi5ncmFwaCgpLm5hbWUsQT1xLmdyYXBoKCkubmFtZSx5PXt9LHc9e30sQz1bXTt2YXIgRz1uLnNvdXJjZXMoKSxEPXEuc291cmNlcygpO2lmKEcubGVuZ3RoIT09RC5sZW5ndGgpcmV0dXJuIGNvbnNvbGUubG9nKCJkaWZmZXJlbnQgc291cmNlIGxlbmd0aCIpLCExO0c9bChHLG4seCk7RD1sKEQscSxBKTtmb3IodmFyIEI9MDtCPEcubGVuZ3RoO0IrKylpZih1KEdbQl0sRFtCXSkpcmV0dXJuITE7Zm9yKDswPEMubGVuZ3RoOyl7RD1DLnBvcCgpO2lmKCFtKG4ubm9kZShELm4xKSxxLm5vZGUoRC5uMikpKXJldHVybiExO0c9bi5zdWNjZXNzb3JzKEQubjEpO0Q9cS5zdWNjZXNzb3JzKEQubjIpO2lmKEcubGVuZ3RoIT09RC5sZW5ndGgpcmV0dXJuIGNvbnNvbGUubG9nKCIjIG9mIHN1Y2Nlc3NvcnMgbWlzbWF0Y2giLEcsRCksITE7Rz1sKEcsbix4KTtEPWwoRCxxLEEpO2ZvcihCPTA7QjxHLmxlbmd0aDtCKyspaWYodShHW0JdLERbQl0pKXJldHVybiExfXJldHVybiEwfQpmdW5jdGlvbiBtKG4scSl7aWYobi50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBKXJldHVybiBuLnRlbXBsYXRlSWQmJnEudGVtcGxhdGVJZCYmbi50ZW1wbGF0ZUlkPT09cS50ZW1wbGF0ZUlkO2lmKG4udHlwZT09PWQuTm9kZVR5cGUuT1AmJnEudHlwZT09PWQuTm9kZVR5cGUuT1ApcmV0dXJuIG4ub3A9PT1xLm9wO2lmKG4udHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTJiZxLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUyl7bGV0IHU9bi5tZXRhZ3JhcGgubm9kZUNvdW50KCk7cmV0dXJuIHU9PT1xLm1ldGFncmFwaC5ub2RlQ291bnQoKSYmKDA9PT11fHxuLm1ldGFncmFwaC5ub2RlKG4ubWV0YWdyYXBoLm5vZGVzKClbMF0pLm9wPT09cS5tZXRhZ3JhcGgubm9kZShxLm1ldGFncmFwaC5ub2RlcygpWzBdKS5vcCl9cmV0dXJuITF9Zi5kZXRlY3Q9ZnVuY3Rpb24obixxKXtuPWsobik7bGV0IHU9dChuLHEpO3JldHVybiBPYmplY3Qua2V5cyh1KS5zb3J0KHg9PnVbeF0ubGV2ZWwpLnJlZHVjZSgoeCwKQSk9Pnt4W0FdPXVbQV07cmV0dXJuIHh9LHt9KX19KShkLnRlbXBsYXRlfHwoZC50ZW1wbGF0ZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vdXRpbC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmLnRpbWU9ZnVuY3Rpb24oaCxrKXtsZXQgdD1EYXRlLm5vdygpO2s9aygpO2NvbnNvbGUubG9nKGgsIjoiLERhdGUubm93KCktdCwibXMiKTtyZXR1cm4ga307Zi5nZXRUcmFja2VyPWZ1bmN0aW9uKGgpe3JldHVybntzZXRNZXNzYWdlOmZ1bmN0aW9uKGspe2guc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmgucHJvZ3Jlc3MudmFsdWUsbXNnOmt9KX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24oayl7aC5zZXQoInByb2dyZXNzIix7dmFsdWU6aC5wcm9ncmVzcy52YWx1ZStrLG1zZzpoLnByb2dyZXNzLm1zZ30pfSxyZXBvcnRFcnJvcjpmdW5jdGlvbihrLHQpe2NvbnNvbGUuZXJyb3IodC5zdGFjayk7aC5zZXQoInByb2dyZXNzIix7dmFsdWU6aC5wcm9ncmVzcy52YWx1ZSxtc2c6ayxlcnJvcjohMH0pfX19O2YuZ2V0U3VidGFza1RyYWNrZXI9ZnVuY3Rpb24oaCxrLHQpe3JldHVybntzZXRNZXNzYWdlOmZ1bmN0aW9uKGwpe2guc2V0TWVzc2FnZSh0KwoiOiAiK2wpfSx1cGRhdGVQcm9ncmVzczpmdW5jdGlvbihsKXtoLnVwZGF0ZVByb2dyZXNzKGwqay8xMDApfSxyZXBvcnRFcnJvcjpmdW5jdGlvbihsLHApe2gucmVwb3J0RXJyb3IodCsiOiAiK2wscCl9fX07Zi5ydW5UYXNrPWZ1bmN0aW9uKGgsayl7ay5zZXRNZXNzYWdlKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0Iik7dHJ5e2xldCB0PWIuZ3JhcGgudXRpbC50aW1lKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0IixoKTtrLnVwZGF0ZVByb2dyZXNzKDQwKTtyZXR1cm4gdH1jYXRjaCh0KXtrLnJlcG9ydEVycm9yKCJGYWlsZWQgUmVhZGluZyBtZXRhZGF0YSBwYnR4dCIsdCl9fTtmLnJ1bkFzeW5jVGFzaz1mdW5jdGlvbihoLGssdCxsKXtyZXR1cm4gbmV3IFByb21pc2UocD0+e2wuc2V0TWVzc2FnZShoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2xldCBtPWIuZ3JhcGgudXRpbC50aW1lKGgsdCk7bC51cGRhdGVQcm9ncmVzcyhrKTtwKG0pfWNhdGNoKG0pe2wucmVwb3J0RXJyb3IoIkZhaWxlZCAiKwpoLG0pfX0sMjApfSl9O2YucnVuQXN5bmNQcm9taXNlVGFzaz1mdW5jdGlvbihoLGssdCxsKXtyZXR1cm4gbmV3IFByb21pc2UoKHAsbSk9PntmdW5jdGlvbiBuKHEpe2wucmVwb3J0RXJyb3IoIkZhaWxlZCAiK2gscSk7bShxKX1sLnNldE1lc3NhZ2UoaCk7c2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtsZXQgcT1EYXRlLm5vdygpO3QoKS50aGVuKGZ1bmN0aW9uKHUpe2NvbnNvbGUubG9nKGgsIjoiLERhdGUubm93KCktcSwibXMiKTtsLnVwZGF0ZVByb2dyZXNzKGspO3AodSl9KS5jYXRjaChuKX1jYXRjaChxKXtuKHEpfX0sMjApfSl9O2YuZXNjYXBlUXVlcnlTZWxlY3Rvcj1mdW5jdGlvbihoKXtyZXR1cm4gaC5yZXBsYWNlKC8oWzouXFtcXSwvXFxcKFwpXSkvZywiXFwkMSIpfTtmLk1FTU9SWV9VTklUUz1be3N5bWJvbDoiQiJ9LHtzeW1ib2w6IktCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJNQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiR0IiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IlRCIiwKbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiUEIiLG51bVVuaXRzOjEwMjR9XTtmLlRJTUVfVU5JVFM9W3tzeW1ib2w6Ilx1MDBiNXMifSx7c3ltYm9sOiJtcyIsbnVtVW5pdHM6MUUzfSx7c3ltYm9sOiJzIixudW1Vbml0czoxRTN9LHtzeW1ib2w6Im1pbiIsbnVtVW5pdHM6NjB9LHtzeW1ib2w6ImhyIixudW1Vbml0czo2MH0se3N5bWJvbDoiZGF5cyIsbnVtVW5pdHM6MjR9XTtmLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZT1mdW5jdGlvbihoLGssdD0wKXtyZXR1cm4gdCsxPGsubGVuZ3RoJiZoPj1rW3QrMV0ubnVtVW5pdHM/Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShoL2tbdCsxXS5udW1Vbml0cyxrLHQrMSk6TnVtYmVyKGgudG9QcmVjaXNpb24oMykpKyIgIitrW3RdLnN5bWJvbH07Zi5oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cz1mdW5jdGlvbihoKXtyZXR1cm4gaCYmKDA8aC50b3RhbEJ5dGVzfHwwPGguZ2V0VG90YWxNaWNyb3MoKXx8aC5vdXRwdXRTaXplKT8KITA6ITF9O2YucmVtb3ZlQ29tbW9uUHJlZml4PWZ1bmN0aW9uKGgpe2lmKDI+aC5sZW5ndGgpcmV0dXJuIGg7bGV0IGs9MCx0PTAsbD1fLm1pbihfLm1hcChoLHA9PnAubGVuZ3RoKSk7Zm9yKDs7KXtrKys7bGV0IHA9Xy5tYXAoaCxtPT5tLnN1YnN0cmluZygwLGspKTtpZihwLmV2ZXJ5KChtLG4pPT4wPT09bj8hMDptPT09cFtuLTFdKSl7aWYoaz49bClyZXR1cm4gaDt0PWt9ZWxzZSBicmVha31yZXR1cm4gXy5tYXAoaCxwPT5wLnN1YnN0cmluZyh0KSl9O2YuY29tcHV0ZUh1bWFuRnJpZW5kbHlUaW1lPWZ1bmN0aW9uKGgpe2g9K25ldyBEYXRlLStuZXcgRGF0ZShoLzFFMyk7cmV0dXJuIDNFND5oPyJqdXN0IG5vdyI6NkU0Pmg/TWF0aC5mbG9vcihoLzFFMykrIiBzZWNvbmRzIGFnbyI6MTJFND5oPyJhIG1pbnV0ZSBhZ28iOjM2RTU+aD9NYXRoLmZsb29yKGgvNkU0KSsiIG1pbnV0ZXMgYWdvIjoxPT1NYXRoLmZsb29yKGgvMzZFNSk/ImFuIGhvdXIgYWdvIjo4NjRFNT5oP01hdGguZmxvb3IoaC8KMzZFNSkrIiBob3VycyBhZ28iOjE3MjhFNT5oPyJ5ZXN0ZXJkYXkiOk1hdGguZmxvb3IoaC84NjRFNSkrIiBkYXlzIGFnbyJ9fSkoZC51dGlsfHwoZC51dGlsPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9taW5pbWFwLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7Y2xhc3MgZntjb25zdHJ1Y3RvcihoLGssdCxsLHAsbSl7dGhpcy5zdmc9aDt0aGlzLmxhYmVsUGFkZGluZz1tO3RoaXMuem9vbUc9azt0aGlzLm1haW5ab29tPXQ7dGhpcy5tYXhXYW5kSD1wO2g9ZDMuc2VsZWN0KGwuc2hhZG93Um9vdCk7bGV0IG49aC5zZWxlY3QoInN2ZyIpLHE9bi5zZWxlY3QoInJlY3QiKTt0aGlzLnZpZXdwb2ludENvb3JkPXt4OjAseTowfTtrPWQzLmRyYWcoKS5zdWJqZWN0KE9iamVjdCkub24oImRyYWciLCgpPT57dGhpcy52aWV3cG9pbnRDb29yZC54PWQzLmV2ZW50Lng7dGhpcy52aWV3cG9pbnRDb29yZC55PWQzLmV2ZW50Lnk7dGhpcy51cGRhdGVWaWV3cG9pbnQoKX0pO3EuZGF0dW0odGhpcy52aWV3cG9pbnRDb29yZCkuY2FsbChrKTtuLm9uKCJjbGljayIsKCk9PntpZighZDMuZXZlbnQuZGVmYXVsdFByZXZlbnRlZCl7dmFyIHU9TnVtYmVyKHEuYXR0cigid2lkdGgiKSkseD1OdW1iZXIocS5hdHRyKCJoZWlnaHQiKSksCkE9ZDMubW91c2Uobi5ub2RlKCkpO3RoaXMudmlld3BvaW50Q29vcmQueD1BWzBdLXUvMjt0aGlzLnZpZXdwb2ludENvb3JkLnk9QVsxXS14LzI7dGhpcy51cGRhdGVWaWV3cG9pbnQoKX19KTt0aGlzLnZpZXdwb2ludD1xLm5vZGUoKTt0aGlzLm1pbmltYXBTdmc9bi5ub2RlKCk7dGhpcy5taW5pbWFwPWw7dGhpcy5jYW52YXM9aC5zZWxlY3QoImNhbnZhcy5maXJzdCIpLm5vZGUoKTt0aGlzLmNhbnZhc0J1ZmZlcj1oLnNlbGVjdCgiY2FudmFzLnNlY29uZCIpLm5vZGUoKTt0aGlzLmRvd25sb2FkQ2FudmFzPWguc2VsZWN0KCJjYW52YXMuZG93bmxvYWQiKS5ub2RlKCk7ZDMuc2VsZWN0KHRoaXMuZG93bmxvYWRDYW52YXMpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpO3RoaXMudXBkYXRlKCl9dXBkYXRlVmlld3BvaW50KCl7ZDMuc2VsZWN0KHRoaXMudmlld3BvaW50KS5hdHRyKCJ4Iix0aGlzLnZpZXdwb2ludENvb3JkLngpLmF0dHIoInkiLHRoaXMudmlld3BvaW50Q29vcmQueSk7bGV0IGg9Ci10aGlzLnZpZXdwb2ludENvb3JkLngqdGhpcy5zY2FsZU1haW4vdGhpcy5zY2FsZU1pbmltYXAsaz0tdGhpcy52aWV3cG9pbnRDb29yZC55KnRoaXMuc2NhbGVNYWluL3RoaXMuc2NhbGVNaW5pbWFwO2QzLnNlbGVjdCh0aGlzLnN2ZykuY2FsbCh0aGlzLm1haW5ab29tLnRyYW5zZm9ybSxkMy56b29tSWRlbnRpdHkudHJhbnNsYXRlKGgsaykuc2NhbGUodGhpcy5zY2FsZU1haW4pKX11cGRhdGUoKXtsZXQgaD1udWxsO3RyeXtpZihoPXRoaXMuem9vbUcuZ2V0QkJveCgpLDA9PT1oLndpZHRoKXJldHVybn1jYXRjaCh1KXtyZXR1cm59dmFyIGs9ZDMuc2VsZWN0KCIjZ3JhcGhkb3dubG9hZCIpO3RoaXMuZG93bmxvYWQ9ay5ub2RlKCk7ay5vbigiY2xpY2siLCgpPT57VVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLmRvd25sb2FkLmhyZWYpO3ZhciB1PXRoaXMuZG93bmxvYWRDYW52YXMudG9EYXRhVVJMKCJpbWFnZS9wbmciKTtjb25zdCB4PXUuc2xpY2UoMCx1LmluZGV4T2YoIiwiKSk7aWYoeC5lbmRzV2l0aCgiO2Jhc2U2NCIpKXt2YXIgQT0KYXRvYih1LnNsaWNlKHUuaW5kZXhPZigiLCIpKzEpKTt1PShuZXcgVWludDhBcnJheShBLmxlbmd0aCkpLm1hcCgoeSx3KT0+QS5jaGFyQ29kZUF0KHcpKTt0aGlzLmRvd25sb2FkLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdV0se3R5cGU6ImltYWdlL3BuZyJ9KSl9ZWxzZSBjb25zb2xlLndhcm4oYG5vbi1iYXNlNjQgZGF0YSBVUkwgKCR7eH0pOyBjYW5ub3QgdXNlIGJsb2IgZG93bmxvYWRgKSx0aGlzLmRvd25sb2FkLmhyZWY9dX0pO2s9ZDMuc2VsZWN0KHRoaXMuc3ZnKTt2YXIgdD0iIixsPXRoaXMuc3ZnO2w9KGwuZ2V0Um9vdE5vZGU/bC5nZXRSb290Tm9kZSgpOnRoaXMuc3ZnLnBhcmVudE5vZGUpLnN0eWxlU2hlZXRzO2Zvcih2YXIgcD0wO3A8bC5sZW5ndGg7cCsrKXRyeXt2YXIgbT1sW3BdLmNzc1J1bGVzfHxsW3BdLnJ1bGVzO2lmKG51bGwhPW0pZm9yKGxldCB1PTA7dTxtLmxlbmd0aDt1KyspdCs9bVt1XS5jc3NUZXh0LnJlcGxhY2UoLyA/dGYtW1x3LV0rID8vZywKIiIpKyJcbiJ9Y2F0Y2godSl7aWYoIlNlY3VyaXR5RXJyb3IiIT09dS5uYW1lKXRocm93IHU7fW09ay5hcHBlbmQoInN0eWxlIik7bS50ZXh0KHQpO3Q9ZDMuc2VsZWN0KHRoaXMuem9vbUcpO2w9dC5hdHRyKCJ0cmFuc2Zvcm0iKTt0LmF0dHIoInRyYW5zZm9ybSIsbnVsbCk7aC5oZWlnaHQrPWgueTtoLndpZHRoKz1oLng7aC5oZWlnaHQrPTIqdGhpcy5sYWJlbFBhZGRpbmc7aC53aWR0aCs9Mip0aGlzLmxhYmVsUGFkZGluZztrLmF0dHIoIndpZHRoIixoLndpZHRoKS5hdHRyKCJoZWlnaHQiLGguaGVpZ2h0KTt0aGlzLnNjYWxlTWluaW1hcD10aGlzLm1heFdhbmRIL01hdGgubWF4KGgud2lkdGgsaC5oZWlnaHQpO3RoaXMubWluaW1hcFNpemU9e3dpZHRoOmgud2lkdGgqdGhpcy5zY2FsZU1pbmltYXAsaGVpZ2h0OmguaGVpZ2h0KnRoaXMuc2NhbGVNaW5pbWFwfTtkMy5zZWxlY3QodGhpcy5taW5pbWFwU3ZnKS5hdHRyKHRoaXMubWluaW1hcFNpemUpO2QzLnNlbGVjdCh0aGlzLmNhbnZhc0J1ZmZlcikuYXR0cih0aGlzLm1pbmltYXBTaXplKTsKcD1kMy5zZWxlY3QodGhpcy5kb3dubG9hZENhbnZhcyk7cC5zdHlsZSgid2lkdGgiLGgud2lkdGgpO3Auc3R5bGUoImhlaWdodCIsaC5oZWlnaHQpO3AuYXR0cigid2lkdGgiLDMqaC53aWR0aCk7cC5hdHRyKCJoZWlnaHQiLDMqaC5oZWlnaHQpO251bGwhPXRoaXMudHJhbnNsYXRlJiZudWxsIT10aGlzLnpvb20mJnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy56b29tKCkpO2xldCBuPShuZXcgWE1MU2VyaWFsaXplcikuc2VyaWFsaXplVG9TdHJpbmcodGhpcy5zdmcpO20ucmVtb3ZlKCk7ay5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKTt0LmF0dHIoInRyYW5zZm9ybSIsbCk7bGV0IHE9bmV3IEltYWdlO3Eub25sb2FkPSgpPT57dmFyIHU9dGhpcy5jYW52YXNCdWZmZXIuZ2V0Q29udGV4dCgiMmQiKTt1LmNsZWFyUmVjdCgwLDAsdGhpcy5jYW52YXNCdWZmZXIud2lkdGgsdGhpcy5jYW52YXNCdWZmZXIuaGVpZ2h0KTt1LmRyYXdJbWFnZShxLDAsMCx0aGlzLm1pbmltYXBTaXplLndpZHRoLAp0aGlzLm1pbmltYXBTaXplLmhlaWdodCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57ZDMuc2VsZWN0KHRoaXMuY2FudmFzQnVmZmVyKS5zdHlsZSgiZGlzcGxheSIsbnVsbCk7ZDMuc2VsZWN0KHRoaXMuY2FudmFzKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKTtbdGhpcy5jYW52YXMsdGhpcy5jYW52YXNCdWZmZXJdPVt0aGlzLmNhbnZhc0J1ZmZlcix0aGlzLmNhbnZhc119KTt1PXRoaXMuZG93bmxvYWRDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTt1LmNsZWFyUmVjdCgwLDAsdGhpcy5kb3dubG9hZENhbnZhcy53aWR0aCx0aGlzLmRvd25sb2FkQ2FudmFzLmhlaWdodCk7dS5kcmF3SW1hZ2UocSwwLDAsdGhpcy5kb3dubG9hZENhbnZhcy53aWR0aCx0aGlzLmRvd25sb2FkQ2FudmFzLmhlaWdodCl9O3Eub25lcnJvcj0oKT0+e3Euc3JjPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW25dLHt0eXBlOiJpbWFnZS9zdmcreG1sO2NoYXJzZXRceDNkdXRmLTgifSkpfTtxLnNyYz0KImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0XHgzZHV0Zi04LCIrZW5jb2RlVVJJQ29tcG9uZW50KG4pfXpvb20oaCl7aWYobnVsbCE9dGhpcy5zY2FsZU1pbmltYXApe2gmJih0aGlzLnRyYW5zbGF0ZT1baC54LGgueV0sdGhpcy5zY2FsZU1haW49aC5rKTt2YXIgaz10aGlzLnN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0PWQzLnNlbGVjdCh0aGlzLnZpZXdwb2ludCk7dGhpcy52aWV3cG9pbnRDb29yZC54PS10aGlzLnRyYW5zbGF0ZVswXSp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjt0aGlzLnZpZXdwb2ludENvb3JkLnk9LXRoaXMudHJhbnNsYXRlWzFdKnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluO2g9ay53aWR0aCp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtrPWsuaGVpZ2h0KnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluO3QuYXR0cigieCIsdGhpcy52aWV3cG9pbnRDb29yZC54KS5hdHRyKCJ5Iix0aGlzLnZpZXdwb2ludENvb3JkLnkpLmF0dHIoIndpZHRoIiwKaCkuYXR0cigiaGVpZ2h0IixrKTt0PXRoaXMubWluaW1hcFNpemUud2lkdGg7dmFyIGw9dGhpcy5taW5pbWFwU2l6ZS5oZWlnaHQscD10aGlzLnZpZXdwb2ludENvb3JkLngsbT10aGlzLnZpZXdwb2ludENvb3JkLnk7Ljg+KE1hdGgubWluKE1hdGgubWF4KDAscCtoKSx0KS1NYXRoLm1pbihNYXRoLm1heCgwLHApLHQpKSooTWF0aC5taW4oTWF0aC5tYXgoMCxtK2spLGwpLU1hdGgubWluKE1hdGgubWF4KDAsbSksbCkpLyh0KmwpP3RoaXMubWluaW1hcC5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTp0aGlzLm1pbmltYXAuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIil9fX1kLk1pbmltYXA9Zn0pKGIuc2NlbmV8fChiLnNjZW5lPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGgtbWluaW1hcC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1taW5pbWFwIixpbml0OmZ1bmN0aW9uKGIsZCxmLGgsayl7cmV0dXJuIG5ldyB0Zi5zY2VuZS5NaW5pbWFwKGIsZCxmLHRoaXMsaCxrKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC90Zi1ncmFwaC1zY2VuZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1zY2VuZSIscHJvcGVydGllczp7cmVuZGVySGllcmFyY2h5Ok9iamVjdCxuYW1lOlN0cmluZyxjb2xvckJ5OlN0cmluZyx0cmFjZUlucHV0czpCb29sZWFuLF9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZTpCb29sZWFuLF9pc0F0dGFjaGVkOkJvb2xlYW4sX3pvb206T2JqZWN0LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9oaWdobGlnaHRlZE5vZGVDaGFuZ2VkIn0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3NlbGVjdGVkTm9kZUNoYW5nZWQifSxoYW5kbGVFZGdlU2VsZWN0ZWQ6T2JqZWN0LF96b29tZWQ6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX29uWm9vbUNoYW5nZWQiLHZhbHVlOiExfSxfem9vbVN0YXJ0Q29vcmRzOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfem9vbVRyYW5zZm9ybTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX21heFpvb21EaXN0YW5jZUZvckNsaWNrOnt0eXBlOk51bWJlciwKdmFsdWU6MjB9LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb24sbWluaW1hcDpPYmplY3QsX25vZGVHcm91cEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX2Fubm90YXRpb25Hcm91cEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX2VkZ2VHcm91cEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sbWF4TWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo5fSxtaW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjZ9LG1heE1ldGFub2RlTGFiZWxMZW5ndGhMYXJnZUZvbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjExfSxtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoOnt0eXBlOk51bWJlcix2YWx1ZToxOH0scHJvZ3Jlc3M6T2JqZWN0LG5vZGVDb250ZXh0TWVudUl0ZW1zOkFycmF5LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LApoZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcn0sb2JzZXJ2ZXJzOlsiX2NvbG9yQnlDaGFuZ2VkKGNvbG9yQnkpIiwiX3JlbmRlckhpZXJhcmNoeUNoYW5nZWQocmVuZGVySGllcmFyY2h5KSIsIl9hbmltYXRlQW5kRml0KF9pc0F0dGFjaGVkLCByZW5kZXJIaWVyYXJjaHkpIiwiX3VwZGF0ZUhlYWx0aFBpbGxzKG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsIGhlYWx0aFBpbGxTdGVwSW5kZXgpIiwiX3VwZGF0ZUlucHV0VHJhY2UodHJhY2VJbnB1dHMsIHNlbGVjdGVkTm9kZSkiXSxnZXROb2RlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKGIpfSxpc05vZGVFeHBhbmRlZDpmdW5jdGlvbihiKXtyZXR1cm4gYi5leHBhbmRlZH0sc2V0Tm9kZUV4cGFuZGVkOmZ1bmN0aW9uKCl7dGhpcy5fYnVpbGQodGhpcy5yZW5kZXJIaWVyYXJjaHkpO3RoaXMuX3VwZGF0ZUxhYmVscyghdGhpcy5fem9vbWVkKX0scGFuVG9Ob2RlKGIpe3RmLmdyYXBoLnNjZW5lLnBhblRvTm9kZShiLAp0aGlzLiQuc3ZnLHRoaXMuJC5yb290LHRoaXMuX3pvb20pJiYodGhpcy5fem9vbWVkPSEwKX0sZ2V0R3JhcGhTdmdSb290KCl7cmV0dXJuIHRoaXMuJC5zdmd9LGdldENvbnRleHRNZW51KCl7cmV0dXJuIHRoaXMuJC5jb250ZXh0TWVudX0sX3Jlc2V0U3RhdGU6ZnVuY3Rpb24oKXt0aGlzLl9ub2RlR3JvdXBJbmRleD17fTt0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleD17fTt0aGlzLl9lZGdlR3JvdXBJbmRleD17fTt0aGlzLl91cGRhdGVMYWJlbHMoITEpO2QzLnNlbGVjdCh0aGlzLiQuc3ZnKS5zZWxlY3QoIiNyb290Iikuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7dGYuZ3JhcGguc2NlbmUubm9kZS5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zKHRoaXMuJC5zdmcpfSxfYnVpbGQ6ZnVuY3Rpb24oYil7dGhpcy50ZW1wbGF0ZUluZGV4PWIuaGllcmFyY2h5LmdldFRlbXBsYXRlSW5kZXgoKTt0Zi5ncmFwaC51dGlsLnRpbWUoInRmLWdyYXBoLXNjZW5lIChsYXlvdXQpOiIsZnVuY3Rpb24oKXt0Zi5ncmFwaC5sYXlvdXQubGF5b3V0U2NlbmUoYi5yb290LAp0aGlzKX0uYmluZCh0aGlzKSk7dGYuZ3JhcGgudXRpbC50aW1lKCJ0Zi1ncmFwaC1zY2VuZSAoYnVpbGQgc2NlbmUpOiIsZnVuY3Rpb24oKXt0Zi5ncmFwaC5zY2VuZS5idWlsZEdyb3VwKGQzLnNlbGVjdCh0aGlzLiQucm9vdCksYi5yb290LHRoaXMpO3RmLmdyYXBoLnNjZW5lLmFkZEdyYXBoQ2xpY2tMaXN0ZW5lcih0aGlzLiQuc3ZnLHRoaXMpO3RoaXMuX3VwZGF0ZUlucHV0VHJhY2UoKX0uYmluZCh0aGlzKSk7c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWx0aFBpbGxzKHRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxscyx0aGlzLmhlYWx0aFBpbGxTdGVwSW5kZXgpO3RoaXMubWluaW1hcC51cGRhdGUoKX0uYmluZCh0aGlzKSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fem9vbT1kMy56b29tKCkub24oImVuZCIsZnVuY3Rpb24oKXt0aGlzLl96b29tU3RhcnRDb29yZHMmJihNYXRoLnNxcnQoTWF0aC5wb3codGhpcy5fem9vbVN0YXJ0Q29vcmRzLngtCnRoaXMuX3pvb21UcmFuc2Zvcm0ueCwyKStNYXRoLnBvdyh0aGlzLl96b29tU3RhcnRDb29yZHMueS10aGlzLl96b29tVHJhbnNmb3JtLnksMikpPHRoaXMuX21heFpvb21EaXN0YW5jZUZvckNsaWNrP3RoaXMuX2ZpcmVFbmFibGVDbGljaygpOnNldFRpbWVvdXQodGhpcy5fZmlyZUVuYWJsZUNsaWNrLmJpbmQodGhpcyksNTApKTt0aGlzLl96b29tU3RhcnRDb29yZHM9bnVsbH0uYmluZCh0aGlzKSkub24oInpvb20iLGZ1bmN0aW9uKCl7dGhpcy5fem9vbVRyYW5zZm9ybT1kMy5ldmVudC50cmFuc2Zvcm07dGhpcy5fem9vbVN0YXJ0Q29vcmRzfHwodGhpcy5fem9vbVN0YXJ0Q29vcmRzPXRoaXMuX3pvb21UcmFuc2Zvcm0sdGhpcy5maXJlKCJkaXNhYmxlLWNsaWNrIikpO3RoaXMuX3pvb21lZD0hMDtkMy5zZWxlY3QodGhpcy4kLnJvb3QpLmF0dHIoInRyYW5zZm9ybSIsZDMuZXZlbnQudHJhbnNmb3JtKTt0aGlzLm1pbmltYXAuem9vbShkMy5ldmVudC50cmFuc2Zvcm0pfS5iaW5kKHRoaXMpKTsKZDMuc2VsZWN0KHRoaXMuJC5zdmcpLmNhbGwodGhpcy5fem9vbSkub24oImRibGNsaWNrLnpvb20iLG51bGwpO2QzLnNlbGVjdCh3aW5kb3cpLm9uKCJyZXNpemUiLGZ1bmN0aW9uKCl7dGhpcy5taW5pbWFwLnpvb20oKX0uYmluZCh0aGlzKSk7dGhpcy5taW5pbWFwPXRoaXMuJC5taW5pbWFwLmluaXQodGhpcy4kLnN2Zyx0aGlzLiQucm9vdCx0aGlzLl96b29tLHRmLmdyYXBoLmxheW91dC5QQVJBTVMubWluaW1hcC5zaXplLHRmLmdyYXBoLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5sYWJlbEhlaWdodCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMSl9LF9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlPSExO3RoaXMuX3Jlc2V0U3RhdGUoKTt0aGlzLl9idWlsZChiKX0sX2FuaW1hdGVBbmRGaXQ6ZnVuY3Rpb24oYil7IXRoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlJiYKYiYmc2V0VGltZW91dCh0aGlzLmZpdC5iaW5kKHRoaXMpLHRmLmdyYXBoLmxheW91dC5QQVJBTVMuYW5pbWF0aW9uLmR1cmF0aW9uKX0sX3VwZGF0ZUxhYmVsczpmdW5jdGlvbihiKXt2YXIgZD10aGlzLiQkKCIudGl0bGUiKSxmPWQuc3R5bGUsaD10aGlzLiQkKCIuYXV4VGl0bGUiKSxrPWguc3R5bGUsdD10aGlzLiQkKCIuZnVuY3Rpb25MaWJyYXJ5VGl0bGUiKS5zdHlsZTtjb25zdCBsPWQzLnNlbGVjdCh0aGlzLiQuc3ZnKTt2YXIgcD1sLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5DT1JFKS5ub2RlKCk7aWYoYiYmcCYmdGhpcy5wcm9ncmVzcyYmMTAwPT09dGhpcy5wcm9ncmVzcy52YWx1ZSl7Yj1sLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5JTkVYVFJBQ1QpLm5vZGUoKXx8bC5zZWxlY3QoIi4iKwp0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5HUk9VUCsiXHgzZS4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLm5vZGUoKTt2YXIgbT1wLmdldENUTSgpLmU7cD1iP2IuZ2V0Q1RNKCkuZTpudWxsO2YuZGlzcGxheT0iaW5saW5lIjtmLmxlZnQ9bSsicHgiO251bGwhPT1wJiZwIT09bT8oay5kaXNwbGF5PSJpbmxpbmUiLHA9TWF0aC5tYXgobStkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLHApLGsubGVmdD1wKyJweCIpOmsuZGlzcGxheT0ibm9uZSI7ZD0oZD1sLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5ub2RlKCkpP2QuZ2V0Q1RNKCkuZTpudWxsO251bGwhPT1kJiZkIT09cD8odC5kaXNwbGF5PSJpbmxpbmUiLGQ9TWF0aC5tYXgocCtoLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLGQpLHQubGVmdD1kKyJweCIpOgp0LmRpc3BsYXk9Im5vbmUifWVsc2UgZi5kaXNwbGF5PSJub25lIixrLmRpc3BsYXk9Im5vbmUiLHQuZGlzcGxheT0ibm9uZSJ9LF9jb2xvckJ5Q2hhbmdlZDpmdW5jdGlvbigpe251bGwhPXRoaXMucmVuZGVySGllcmFyY2h5JiYoXy5lYWNoKHRoaXMuX25vZGVHcm91cEluZGV4LChiLGQpPT57dGhpcy5fdXBkYXRlTm9kZVN0YXRlKGQpfSksdGhpcy5taW5pbWFwLnVwZGF0ZSgpKX0sZml0OmZ1bmN0aW9uKCl7dGhpcy5faGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2U9ITA7dGYuZ3JhcGguc2NlbmUuZml0KHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSxmdW5jdGlvbigpe3RoaXMuX3pvb21lZD0hMX0uYmluZCh0aGlzKSl9LGlzTm9kZVNlbGVjdGVkOmZ1bmN0aW9uKGIpe3JldHVybiBiPT09dGhpcy5zZWxlY3RlZE5vZGV9LGlzTm9kZUhpZ2hsaWdodGVkOmZ1bmN0aW9uKGIpe3JldHVybiBiPT09dGhpcy5oaWdobGlnaHRlZE5vZGV9LGFkZEFubm90YXRpb25Hcm91cDpmdW5jdGlvbihiLApkLGYpe2I9Yi5ub2RlLm5hbWU7dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYl09dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYl18fHt9O3RoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdW2Qubm9kZS5uYW1lXT1mfSxnZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdfSxyZW1vdmVBbm5vdGF0aW9uR3JvdXA6ZnVuY3Rpb24oYixkKXtkZWxldGUgdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYi5ub2RlLm5hbWVdW2Qubm9kZS5uYW1lXX0sYWRkTm9kZUdyb3VwOmZ1bmN0aW9uKGIsZCl7dGhpcy5fbm9kZUdyb3VwSW5kZXhbYl09ZH0sZ2V0Tm9kZUdyb3VwOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9ub2RlR3JvdXBJbmRleFtiXX0scmVtb3ZlTm9kZUdyb3VwOmZ1bmN0aW9uKGIpe2RlbGV0ZSB0aGlzLl9ub2RlR3JvdXBJbmRleFtiXX0sYWRkRWRnZUdyb3VwOmZ1bmN0aW9uKGIsZCl7dGhpcy5fZWRnZUdyb3VwSW5kZXhbYl09CmR9LGdldEVkZ2VHcm91cDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZWRnZUdyb3VwSW5kZXhbYl19LF91cGRhdGVIZWFsdGhQaWxsczpmdW5jdGlvbihiLGQpe3RmLmdyYXBoLnNjZW5lLmFkZEhlYWx0aFBpbGxzKHRoaXMuJC5zdmcsYixkKX0sX3VwZGF0ZU5vZGVTdGF0ZTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLmdldE5vZGUoYiksZj10aGlzLmdldE5vZGVHcm91cChiKTtmJiZ0Zi5ncmFwaC5zY2VuZS5ub2RlLnN0eWxpemUoZixkLHRoaXMpO2Qubm9kZS50eXBlPT09dGYuZ3JhcGguTm9kZVR5cGUuTUVUQSYmZC5ub2RlLmFzc29jaWF0ZWRGdW5jdGlvbiYmIWQuaXNMaWJyYXJ5RnVuY3Rpb24mJihmPWQzLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKycgZ1tkYXRhLW5hbWVceDNkIicrKHRmLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgrCmQubm9kZS5hc3NvY2lhdGVkRnVuY3Rpb24pKyciXScpLHRmLmdyYXBoLnNjZW5lLm5vZGUuc3R5bGl6ZShmLGQsdGhpcykpO18uZWFjaCh0aGlzLmdldEFubm90YXRpb25Hcm91cHNJbmRleChiKSxoPT57dGYuZ3JhcGguc2NlbmUubm9kZS5zdHlsaXplKGgsZCx0aGlzLHRmLmdyYXBoLnNjZW5lLkNsYXNzLkFubm90YXRpb24uTk9ERSl9KX0sX3NlbGVjdGVkTm9kZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtpZihiIT09ZCYmKGQmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShkKSxiKSl7dGhpcy5taW5pbWFwLnVwZGF0ZSgpO2Q9dGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5Lm5vZGUoYik7Zm9yKHZhciBmPVtdO251bGwhPWQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLm5hbWUhPXRmLmdyYXBoLlJPT1RfTkFNRTspZD1kLnBhcmVudE5vZGUsZi5wdXNoKGQubmFtZSk7dmFyIGg7Xy5mb3JFYWNoUmlnaHQoZixrPT57dGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkoayk7Cms9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShrKTtrLm5vZGUuaXNHcm91cE5vZGUmJiFrLmV4cGFuZGVkJiYoay5leHBhbmRlZD0hMCxofHwoaD1rKSl9KTtoJiYodGhpcy5zZXROb2RlRXhwYW5kZWQoaCksdGhpcy5fem9vbWVkPSEwKTtiJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoYik7c2V0VGltZW91dCgoKT0+e3RoaXMucGFuVG9Ob2RlKGIpfSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9fSxfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2IhPT1kJiYoYiYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKGIpLGQmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShkKSl9LF9vblpvb21DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlTGFiZWxzKCF0aGlzLl96b29tZWQpfSxfZmlyZUVuYWJsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJlbmFibGUtY2xpY2siKX0sX3VwZGF0ZUlucHV0VHJhY2U6ZnVuY3Rpb24oKXt0Zi5ncmFwaC5zY2VuZS5ub2RlLnVwZGF0ZUlucHV0VHJhY2UodGhpcy5nZXRHcmFwaFN2Z1Jvb3QoKSwKdGhpcy5yZW5kZXJIaWVyYXJjaHksdGhpcy5zZWxlY3RlZE5vZGUsdGhpcy50cmFjZUlucHV0cyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGguaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgiLHByb3BlcnRpZXM6e2dyYXBoSGllcmFyY2h5Ont0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9ncmFwaENoYW5nZWQifSxiYXNpY0dyYXBoOk9iamVjdCxzdGF0czpPYmplY3QsZGV2aWNlc0ZvclN0YXRzOk9iamVjdCxoaWVyYXJjaHlQYXJhbXM6T2JqZWN0LHByb2dyZXNzOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHRpdGxlOlN0cmluZyxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWRFZGdlOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LF9sYXN0U2VsZWN0ZWRFZGdlR3JvdXA6T2JqZWN0LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSx0cmFjZUlucHV0czpCb29sZWFuLApub2RlQ29udGV4dE1lbnVJdGVtczpBcnJheSxfcmVuZGVyRGVwdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9hbGxvd0dyYXBoU2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGhlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLGVkZ2VXaWR0aEZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0saGFuZGxlTm9kZVNlbGVjdGVkOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0sZWRnZUxhYmVsRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOiIifSxoYW5kbGVFZGdlU2VsZWN0ZWQ6e3R5cGU6T2JqZWN0LHZhbHVlOiIifX0sb2JzZXJ2ZXJzOlsiX3N0YXRzQ2hhbmdlZChzdGF0cywgZGV2aWNlc0ZvclN0YXRzKSIsIl9idWlsZE5ld1JlbmRlckhpZXJhcmNoeShncmFwaEhpZXJhcmNoeSwgZWRnZVdpZHRoRnVuY3Rpb24sIGhhbmRsZU5vZGVTZWxlY3RlZCwgZWRnZUxhYmVsRnVuY3Rpb24sIGhhbmRsZUVkZ2VTZWxlY3RlZCkiLCJfc2VsZWN0ZWROb2RlQ2hhbmdlZChzZWxlY3RlZE5vZGUpIiwKIl9zZWxlY3RlZEVkZ2VDaGFuZ2VkKHNlbGVjdGVkRWRnZSkiXSxwYW5Ub05vZGUoYil7dGhpcy4kJCgidGYtZ3JhcGgtc2NlbmUiKS5wYW5Ub05vZGUoYil9LF9idWlsZE5ld1JlbmRlckhpZXJhcmNoeShiKXtiJiZ0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeShiKX0sX3N0YXRzQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuZ3JhcGhIaWVyYXJjaHkmJihiJiZkJiYodGYuZ3JhcGguam9pblN0YXRzSW5mb1dpdGhHcmFwaCh0aGlzLmJhc2ljR3JhcGgsYixkKSx0Zi5ncmFwaC5oaWVyYXJjaHkuam9pbkFuZEFnZ3JlZ2F0ZVN0YXRzKHRoaXMuZ3JhcGhIaWVyYXJjaHkpKSx0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KSl9LF9idWlsZFJlbmRlckhpZXJhcmNoeTpmdW5jdGlvbihiKXt0Zi5ncmFwaC51dGlsLnRpbWUoIm5ldyB0Zi5ncmFwaC5yZW5kZXIuSGllcmFyY2h5IixmdW5jdGlvbigpe2Z1bmN0aW9uIGQoaCl7cmV0dXJue21pblZhbHVlOmguZG9tYWluKClbMF0sCm1heFZhbHVlOmguZG9tYWluKClbMV0sc3RhcnRDb2xvcjpoLnJhbmdlKClbMF0sZW5kQ29sb3I6aC5yYW5nZSgpWzFdfX1pZihiLnJvb3QudHlwZT09PXRmLmdyYXBoLk5vZGVUeXBlLk1FVEEpe3ZhciBmPW5ldyB0Zi5ncmFwaC5yZW5kZXIuUmVuZGVyR3JhcGhJbmZvKGIsISF0aGlzLnN0YXRzKTtmLmVkZ2VMYWJlbEZ1bmN0aW9uPXRoaXMuZWRnZUxhYmVsRnVuY3Rpb247Zi5lZGdlV2lkdGhGdW5jdGlvbj10aGlzLmVkZ2VXaWR0aEZ1bmN0aW9uO3RoaXMuX3NldENvbG9yQnlQYXJhbXMoe2NvbXB1dGVfdGltZTpkKGYuY29tcHV0ZVRpbWVTY2FsZSksbWVtb3J5OmQoZi5tZW1vcnlVc2FnZVNjYWxlKSxkZXZpY2U6Xy5tYXAoZi5kZXZpY2VDb2xvck1hcC5kb21haW4oKSxmdW5jdGlvbihoKXtyZXR1cm57ZGV2aWNlOmgsY29sb3I6Zi5kZXZpY2VDb2xvck1hcChoKX19KSx4bGFfY2x1c3RlcjpfLm1hcChmLnhsYUNsdXN0ZXJDb2xvck1hcC5kb21haW4oKSxmdW5jdGlvbihoKXtyZXR1cm57eGxhX2NsdXN0ZXI6aCwKY29sb3I6Zi54bGFDbHVzdGVyQ29sb3JNYXAoaCl9fSl9KTt0aGlzLl9zZXRSZW5kZXJIaWVyYXJjaHkoZik7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuZmlyZSgicmVuZGVyZWQiKX0pfX0uYmluZCh0aGlzKSl9LF9nZXRWaXNpYmxlOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucmVuZGVySGllcmFyY2h5LmdldE5lYXJlc3RWaXNpYmxlQW5jZXN0b3IoYik6Yn0sbGlzdGVuZXJzOnsiZ3JhcGgtc2VsZWN0IjoiX2dyYXBoU2VsZWN0ZWQiLCJkaXNhYmxlLWNsaWNrIjoiX2Rpc2FibGVDbGljayIsImVuYWJsZS1jbGljayI6Il9lbmFibGVDbGljayIsIm5vZGUtdG9nZ2xlLWV4cGFuZCI6Il9ub2RlVG9nZ2xlRXhwYW5kIiwibm9kZS1zZWxlY3QiOiJfbm9kZVNlbGVjdGVkIiwibm9kZS1oaWdobGlnaHQiOiJfbm9kZUhpZ2hsaWdodGVkIiwibm9kZS11bmhpZ2hsaWdodCI6Il9ub2RlVW5oaWdobGlnaHRlZCIsIm5vZGUtdG9nZ2xlLWV4dHJhY3QiOiJfbm9kZVRvZ2dsZUV4dHJhY3QiLAoibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiOiJfbm9kZVRvZ2dsZVNlcmllc0dyb3VwIiwiZWRnZS1zZWxlY3QiOiJfZWRnZVNlbGVjdGVkIiwiYW5ub3RhdGlvbi1zZWxlY3QiOiJfbm9kZVNlbGVjdGVkIiwiYW5ub3RhdGlvbi1oaWdobGlnaHQiOiJfbm9kZUhpZ2hsaWdodGVkIiwiYW5ub3RhdGlvbi11bmhpZ2hsaWdodCI6Il9ub2RlVW5oaWdobGlnaHRlZCJ9LGZpdDpmdW5jdGlvbigpe3RoaXMuJC5zY2VuZS5maXQoKX0sX2dyYXBoQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZ3JhcGgtc2VsZWN0Iil9LF9ncmFwaFNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmKHRoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLG51bGwpLHRoaXMuc2V0KCJzZWxlY3RlZEVkZ2UiLG51bGwpKTt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfSxfZGlzYWJsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMX0sX2VuYWJsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0KITB9LF9zZWxlY3RlZE5vZGVDaGFuZ2VkKGIpe3RoaXMuaGFuZGxlTm9kZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZChiKX0sX3NlbGVjdGVkRWRnZUNoYW5nZWQoYil7dGhpcy5fZGVzZWxlY3RQcmV2aW91c0VkZ2UoKTtiJiYodGhpcy5fbGFzdFNlbGVjdGVkRWRnZUdyb3VwLmNsYXNzZWQodGYuZ3JhcGguc2NlbmUuQ2xhc3MuRWRnZS5TRUxFQ1RFRCwhMCksdGhpcy5fdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UoYikpO3RoaXMuaGFuZGxlRWRnZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZChiKX0sX25vZGVTZWxlY3RlZDpmdW5jdGlvbihiKXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiZ0aGlzLnNldCgic2VsZWN0ZWROb2RlIixiLmRldGFpbC5uYW1lKTt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfSxfZWRnZVNlbGVjdGVkKGIpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJih0aGlzLnNldCgiX2xhc3RTZWxlY3RlZEVkZ2VHcm91cCIsYi5kZXRhaWwuZWRnZUdyb3VwKSwKdGhpcy5zZXQoInNlbGVjdGVkRWRnZSIsYi5kZXRhaWwuZWRnZURhdGEpKTt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfSxfbm9kZUhpZ2hsaWdodGVkOmZ1bmN0aW9uKGIpe3RoaXMuc2V0KCJoaWdobGlnaHRlZE5vZGUiLGIuZGV0YWlsLm5hbWUpfSxfbm9kZVVuaGlnaGxpZ2h0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiaGlnaGxpZ2h0ZWROb2RlIixudWxsKX0sX25vZGVUb2dnbGVFeHBhbmQ6ZnVuY3Rpb24oYil7dGhpcy5fbm9kZVNlbGVjdGVkKGIpO2I9Yi5kZXRhaWwubmFtZTt2YXIgZD10aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKGIpO2Qubm9kZS50eXBlIT09dGYuZ3JhcGguTm9kZVR5cGUuT1AmJih0aGlzLnJlbmRlckhpZXJhcmNoeS5idWlsZFN1YmhpZXJhcmNoeShiKSxkLmV4cGFuZGVkPSFkLmV4cGFuZGVkLHRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLiQuc2NlbmUuc2V0Tm9kZUV4cGFuZGVkKGQpfSw3NSkpfSxfbm9kZVRvZ2dsZUV4dHJhY3Q6ZnVuY3Rpb24oYil7dGhpcy5ub2RlVG9nZ2xlRXh0cmFjdChiLmRldGFpbC5uYW1lKX0sCm5vZGVUb2dnbGVFeHRyYWN0OmZ1bmN0aW9uKGIpe2I9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShiKTtiLm5vZGUuaW5jbHVkZT1iLm5vZGUuaW5jbHVkZT09dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5JTkNMVURFP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERTpiLm5vZGUuaW5jbHVkZT09dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5FWENMVURFP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERTp0aGlzLnJlbmRlckhpZXJhcmNoeS5pc05vZGVBdXhpbGlhcnkoYik/dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5JTkNMVURFOnRmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERTt0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KX0sX25vZGVUb2dnbGVTZXJpZXNHcm91cDpmdW5jdGlvbihiKXt0aGlzLm5vZGVUb2dnbGVTZXJpZXNHcm91cChiLmRldGFpbC5uYW1lKX0sbm9kZVRvZ2dsZVNlcmllc0dyb3VwOmZ1bmN0aW9uKGIpe3RmLmdyYXBoLnRvZ2dsZU5vZGVTZXJpZXNHcm91cCh0aGlzLmhpZXJhcmNoeVBhcmFtcy5zZXJpZXNNYXAsCmIpO3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7dGYuZ3JhcGguaGllcmFyY2h5LmJ1aWxkKHRoaXMuYmFzaWNHcmFwaCx0aGlzLmhpZXJhcmNoeVBhcmFtcyx0Zi5ncmFwaC51dGlsLmdldFN1YnRhc2tUcmFja2VyKHRmLmdyYXBoLnV0aWwuZ2V0VHJhY2tlcih0aGlzKSwxMDAsIk5hbWVzcGFjZSBoaWVyYXJjaHkiKSkudGhlbihmdW5jdGlvbihkKXt0aGlzLnNldCgiZ3JhcGhIaWVyYXJjaHkiLGQpO3RoaXMuX2J1aWxkUmVuZGVySGllcmFyY2h5KHRoaXMuZ3JhcGhIaWVyYXJjaHkpfS5iaW5kKHRoaXMpKX0sX2Rlc2VsZWN0UHJldmlvdXNFZGdlKCl7ZDMuc2VsZWN0KCIuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5FZGdlLlNFTEVDVEVEKS5jbGFzc2VkKHRmLmdyYXBoLnNjZW5lLkNsYXNzLkVkZ2UuU0VMRUNURUQsITEpLmVhY2goYj0+e2lmKGIubGFiZWwpe2NvbnN0IGQ9ZDMuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgicGF0aC5lZGdlbGluZSIpO2IubGFiZWwuc3RhcnRNYXJrZXJJZCYmCmQuc3R5bGUoIm1hcmtlci1zdGFydCIsYHVybCgjJHtiLmxhYmVsLnN0YXJ0TWFya2VySWR9KWApO2IubGFiZWwuZW5kTWFya2VySWQmJmQuc3R5bGUoIm1hcmtlci1lbmQiLGB1cmwoIyR7Yi5sYWJlbC5lbmRNYXJrZXJJZH0pYCl9fSl9LF91cGRhdGVNYXJrZXJPZlNlbGVjdGVkRWRnZShiKXtpZihiLmxhYmVsKXt2YXIgZD1iLmxhYmVsLnN0YXJ0TWFya2VySWR8fGIubGFiZWwuZW5kTWFya2VySWQ7aWYoZCl7Y29uc3QgZj1kLnJlcGxhY2UoImRhdGFmbG93LSIsInNlbGVjdGVkLSIpO2xldCBoPXRoaXMuJCQoIiMiK2YpO2h8fChkPXRoaXMuJC5zY2VuZS5xdWVyeVNlbGVjdG9yKCIjIitkKSxoPWQuY2xvbmVOb2RlKCEwKSxoLnNldEF0dHJpYnV0ZSgiaWQiLGYpLGguY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQtYXJyb3doZWFkIiksZC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGgpKTtiPWIubGFiZWwuc3RhcnRNYXJrZXJJZD8ibWFya2VyLXN0YXJ0IjoibWFya2VyLWVuZCI7dGhpcy5fbGFzdFNlbGVjdGVkRWRnZUdyb3VwLnNlbGVjdEFsbCgicGF0aC5lZGdlbGluZSIpLnN0eWxlKGIsCmB1cmwoIyR7Zn0pYCl9fX0sbm90OmZ1bmN0aW9uKGIpe3JldHVybiFifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWxvYWRlci90Zi1ncmFwaC1sb2FkZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtbG9hZGVyIixfdGVtcGxhdGU6bnVsbCxwcm9wZXJ0aWVzOntkYXRhc2V0czpBcnJheSxzZWxlY3RlZERhdGE6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHNlbGVjdGVkRmlsZTpPYmplY3QsY29tcGF0aWJpbGl0eVByb3ZpZGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGIuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyfSxvdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0scHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sb3V0R3JhcGhIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0R3JhcGg6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0SGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfbG9hZERhdGEoZGF0YXNldHMsIHNlbGVjdGVkRGF0YSwgb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtcywgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSIsCiJfbG9hZEZpbGUoc2VsZWN0ZWRGaWxlLCBvdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIl0sX2xvYWREYXRhKCl7dGhpcy5kZWJvdW5jZSgibG9hZCIsKCk9Pntjb25zdCBmPXRoaXMuZGF0YXNldHNbdGhpcy5zZWxlY3RlZERhdGFdO2YmJnRoaXMuX3BhcnNlQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZi5wYXRoKX0pfSxfcGFyc2VBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChmLGgpe2NvbnN0IGs9dGhpcy5vdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zLHQ9dGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXI7dGhpcy5wcm9ncmVzcz17dmFsdWU6MCxtc2c6IiJ9O2NvbnN0IGw9Yi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcykscD1PYmplY3QuYXNzaWduKHt9LGIuZ3JhcGguaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXMsayk7Yi5ncmFwaC5sb2FkZXIuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChsLApmLGgsdCxwKS50aGVuKCh7Z3JhcGg6bSxncmFwaEhpZXJhcmNoeTpufSk9Pnt0aGlzLl9zZXRPdXRIaWVyYXJjaHlQYXJhbXMocCk7dGhpcy5fc2V0T3V0R3JhcGgobSk7dGhpcy5fc2V0T3V0R3JhcGhIaWVyYXJjaHkobil9KX0sX2xvYWRGaWxlKGYpe2lmKGYpe2Y9Zi50YXJnZXQ7dmFyIGg9Zi5maWxlc1swXTtoJiYoZi52YWx1ZT0iIix0aGlzLl9wYXJzZUFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKG51bGwsaCkpfX19KX0pKGQubG9hZGVyfHwoZC5sb2FkZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL2hlYWx0aC1waWxscy5qcwp2YXIgVmk7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGssdCl7aWYobnVsbD09ayl0aHJvdyBFcnJvcihgTWlzc2luZyByZWZWYWx1ZSBmb3IgY29uZGl0aW9uICgke3R9KS5gKTt9ZnVuY3Rpb24gZihrKXtyZXR1cm4gbnVsbD09a3x8MD09ay5sZW5ndGh8fDEhPT1rWzBdfWNvbnN0IGg9e0lORl9PUl9OQU46e2Rlc2NyaXB0aW9uOiJDb250YWlucyArLy1cdTIyMWUgb3IgTmFOIixwcmVkaWNhdGU6az0+MDxrWzJdfHwwPGtbM118fDA8a1s3XX0sSU5GOntkZXNjcmlwdGlvbjoiQ29udGFpbnMgKy8tXHUyMjFlIixwcmVkaWNhdGU6az0+MDxrWzNdfHwwPGtbN119LE5BTjp7ZGVzY3JpcHRpb246IkNvbnRhaW5zIE5hTiIscHJlZGljYXRlOms9PjA8a1syXX0sTUFYX0dUOntkZXNjcmlwdGlvbjoiTWF4IFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiTUFYX0dUIik7cmV0dXJuIGtbOV0+dH19LE1BWF9MVDp7ZGVzY3JpcHRpb246Ik1heCBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1BWF9MVCIpOwpyZXR1cm4ga1s5XTx0fX0sTUlOX0dUOntkZXNjcmlwdGlvbjoiTWluIFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiTUlOX0dUIik7cmV0dXJuIGtbOF0+dH19LE1JTl9MVDp7ZGVzY3JpcHRpb246Ik1pbiBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1JTl9MVCIpO3JldHVybiBrWzhdPHR9fSxNRUFOX0dUOntkZXNjcmlwdGlvbjoiTWVhbiBceDNlIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1FQU5fR1QiKTtyZXR1cm4ga1sxMF0+dH19LE1FQU5fTFQ6e2Rlc2NyaXB0aW9uOiJNZWFuIFx4M2MiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiTUVBTl9MVCIpO3JldHVybiBrWzEwXTx0fX0sUkFOR0VfR1Q6e2Rlc2NyaXB0aW9uOiJNYXggLSBNaW4gXHgzZSIscHJlZGljYXRlOihrLHQpPT57ZCh0LCJSQU5HRV9HVCIpO3JldHVybiBrWzldLWtbOF0+dH19LFJBTkdFX0xUOntkZXNjcmlwdGlvbjoiTWF4IC0gTWluIFx4M2MiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiUkFOR0VfTFQiKTsKcmV0dXJuIGtbOV0ta1s4XTx0fX0sU1REREVWX0dUOntkZXNjcmlwdGlvbjoiU3RhbmRhcmQgZGV2aWF0aW9uIFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiU1REREVWX0dUIik7cmV0dXJuIE1hdGguc3FydChrWzExXSk+dH19LFNURERFVl9MVDp7ZGVzY3JpcHRpb246IlN0YW5kYXJkIGRldmlhdGlvbiBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIlNURERFVl9MVCIpO3JldHVybiBNYXRoLnNxcnQoa1sxMV0pPHR9fX07Yi50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXk9ZnVuY3Rpb24oayl7Zm9yKGNvbnN0IHQgaW4gaClpZihoLmhhc093blByb3BlcnR5KHQpJiZoW3RdLmRlc2NyaXB0aW9uPT09aylyZXR1cm4gdDtyZXR1cm4gbnVsbH07Yi5jaGVja0hlYWx0aFBpbGxBZ2FpbnN0VGVuc29yQ29uZGl0aW9uS2V5PWZ1bmN0aW9uKGssdCxsKXtpZihmKHQpKXJldHVybiExO2s9aFtrXS5wcmVkaWNhdGU7cmV0dXJuIGsodCxsKX19KShWaXx8KFZpPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1jb250aW51ZS1kaWFsb2ciLHByb3BlcnRpZXM6e2NvbnRpbnVlTnVtOnt0eXBlOk51bWJlcix2YWx1ZTo1fSxzZXNzaW9uUnVuR286RnVuY3Rpb24sdGVuc29yQ29uZGl0aW9uR286RnVuY3Rpb24sZm9yY2VDb250aW51YXRpb25TdG9wOkZ1bmN0aW9uLF9jb250aW51ZUJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiJ9LF9jb250aW51ZUJ1dHRvbkNvbnRpbnVlVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IkNvbnRpbnVlLi4uIixyZWFkb25seTohMH0sX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJTdG9wIENvbnRpbnVhdGlvbiIscmVhZG9ubHk6ITB9LF9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbjpTdHJpbmcsX3RlbnNvckNvbmRpdGlvblJlZlZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sX2lzUmVmVmFsdWVJbnB1dEhpZGRlbjp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLApub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfb25TZWxlY3RlZFRlbnNvckNvbmRpdGlvbkNoYW5nZWQoX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKSJdLG5vdGlmeUNvbnRpbnVhdGlvblN0b3AoKXt0aGlzLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMSl9LF9vcGVuRGlhbG9nKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLm9wZW4oKX0sX2Nsb3NlRGlhbG9nKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLmNsb3NlKCl9LF9jb250aW51ZUJ1dHRvbkNhbGxiYWNrKCl7dGhpcy5fY29udGludWVCdXR0b25UZXh0PT09dGhpcy5fY29udGludWVCdXR0b25TdG9wVGV4dD90aGlzLmZvcmNlQ29udGludWF0aW9uU3RvcCgpOnRoaXMuX29wZW5EaWFsb2coKX0sdXBkYXRlQ29udGludWVCdXR0b25UZXh0KGIpe3RoaXMuc2V0KCJfY29udGludWVCdXR0b25UZXh0IixiP3RoaXMuX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ6dGhpcy5fY29udGludWVCdXR0b25Db250aW51ZVRleHQpfSxfc2Vzc2lvblJ1bkdvQnV0dG9uQ2FsbGJhY2soKXswPAp0aGlzLmNvbnRpbnVlTnVtPyh0aGlzLnNlc3Npb25SdW5Hbyh0aGlzLmNvbnRpbnVlTnVtKSx0aGlzLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMCksdGhpcy5fY2xvc2VEaWFsb2coKSk6dGhpcy5zZXQoImNvbnRpbnVlTnVtIiwxKX0sX3RlbnNvckNvbnRpbnVlR29CdXR0b25DYWxsYmFjaygpe2lmKG51bGwhPXRoaXMuX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKXt2YXIgYj1WaS50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXkodGhpcy5fc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pO251bGw9PWImJmNvbnNvbGUuZXJyb3IoIkludmFsaWQgVGVuc29yIENvbmRpdGlvbiBuYW1lOiIrdGhpcy5fc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pO3ZhciBkPU51bWJlcih0aGlzLl90ZW5zb3JDb25kaXRpb25SZWZWYWx1ZSk7TnVtYmVyLmlzRmluaXRlKGQpPyh0aGlzLnRlbnNvckNvbmRpdGlvbkdvKGIsZCksdGhpcy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApLHRoaXMuX2Nsb3NlRGlhbG9nKCkpOgp0aGlzLnNldCgiX3RlbnNvckNvbmRpdGlvblJlZlZhbHVlIiwwKX19LF9vblNlbGVjdGVkVGVuc29yQ29uZGl0aW9uQ2hhbmdlZChiKXtiPVZpLnRlbnNvckNvbmRpdGlvbkRlc2NyaXB0aW9uMktleShiKTt0aGlzLnNldCgiX2lzUmVmVmFsdWVJbnB1dEhpZGRlbiIsLTEhPT1bIklORl9PUl9OQU4iLCJJTkYiLCJOQU4iXS5pbmRleE9mKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2ciLHByb3BlcnRpZXM6e190aXRsZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2N1c3RvbU1lc3NhZ2U6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9oYXNDdXN0b21NZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzQ3VzdG9tTWVzc2FnZShfY3VzdG9tTWVzc2FnZSkifSxfaG9zdDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3BvcnQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9vcGVuOnt0eXBlOkJvb2xlYW59LF9oaWRkZW46e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIaWRkZW4oX29wZW4pIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvcGVuRGlhbG9nKGIsZCl7dGhpcy5zZXQoIl90aXRsZSIsIkRlYnVnZ2VyIGlzIHdhaXRpbmcgZm9yIFNlc3Npb24ucnVuKCkgY29ubmVjdGlvbnMuLi4iKTt0aGlzLnNldCgiX2N1c3RvbU1lc3NhZ2UiLG51bGwpO3RoaXMuJC5kaWFsb2cub3BlbigpOwpudWxsIT1iJiZudWxsIT1kJiYodGhpcy5zZXQoIl9ob3N0IixiKSx0aGlzLnNldCgiX3BvcnQiLGQpKX0sY2xvc2VEaWFsb2coKXt0aGlzLiQuZGlhbG9nLmNsb3NlKCl9LG9wZW5EaXNhYmxlZERpYWxvZygpe3RoaXMuc2V0KCJfdGl0bGUiLCJEZWJ1Z2dlciBpcyBub3QgZW5hYmxlZCBpbiB0aGlzIFRlbnNvckJvYXJkIGluc3RhbmNlIik7dGhpcy5zZXQoIl9jdXN0b21NZXNzYWdlIiwiVG8gZW5hYmxlIHRoZSBkZWJ1Z2dlciBpbiBUZW5zb3JCb2FyZCwgdXNlIHRoZSBmbGFnOiAtLWRlYnVnZ2VyX3BvcnQgXHgzY3BvcnRfbnVtYmVyXHgzZSIpO3RoaXMuJC5kaWFsb2cub3BlbigpfSxfY29tcHV0ZUhpZGRlbihiKXtyZXR1cm4hYn0sX2NvbXB1dGVIYXNDdXN0b21NZXNzYWdlKGIpe3JldHVybiFfLmlzRW1wdHkoYil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLXJlc2l6ZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItcmVzaXplciIscHJvcGVydGllczp7Y3VycmVudExlbmd0aDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxtaW5MZW5ndGg6TnVtYmVyLG1heExlbmd0aDpOdW1iZXIsaXNIb3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfcmVzaXplcklkZW50aWZpZXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9pc1ZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNWZXJ0aWNhbChpc0hvcml6b250YWwpIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITB9LF9kcmFnU3RhcnRQb3NpdGlvbjpOdW1iZXIsX2RyYWdTdGFydExlbmd0aDpOdW1iZXIsX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2s6T2JqZWN0LF9wcmV2aW91c01vdXNlVXBDYWxsYmFjazpPYmplY3R9LGxpc3RlbmVyczp7bW91c2Vkb3duOiJfaGFuZGxlTW91c2VEb3duIn0sCl9oYW5kbGVNb3VzZURvd24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2VuZERyYWcoKTt0aGlzLl9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrPWQ9PntkLnByZXZlbnREZWZhdWx0KCk7ZD10aGlzLl9kcmFnU3RhcnRMZW5ndGgrKHRoaXMuX2dldFBvc2l0aW9uUmVsYXRpdmVUb1ZpZXdwb3J0KGQpLXRoaXMuX2RyYWdTdGFydFBvc2l0aW9uKTtkPU1hdGgubWF4KGQsdGhpcy5taW5MZW5ndGgpO2Q9TWF0aC5taW4oZCx0aGlzLm1heExlbmd0aCk7dGhpcy5zZXQoImN1cnJlbnRMZW5ndGgiLGQpfTt0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaz1kPT57ZC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2VuZERyYWcoKX07dGhpcy5zZXQoIl9kcmFnU3RhcnRQb3NpdGlvbiIsdGhpcy5fZ2V0UG9zaXRpb25SZWxhdGl2ZVRvVmlld3BvcnQoYikpO3RoaXMuc2V0KCJfZHJhZ1N0YXJ0TGVuZ3RoIix0aGlzLmN1cnJlbnRMZW5ndGgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwKdGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2ssITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2ssITEpfSxfZ2V0UG9zaXRpb25SZWxhdGl2ZVRvVmlld3BvcnQoYil7cmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsP2IuY2xpZW50WTpiLmNsaWVudFh9LF9lbmREcmFnKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaywhMSk7dGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaz1udWxsO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaywhMSk7dGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2s9bnVsbH0sX2NvbXB1dGVJc1ZlcnRpY2FsKGIpe3JldHVybiFifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC9zZWxlY3Rpb24tdHJlZS1ub2RlLmpzCihmdW5jdGlvbihiKXtiLk5PREVfTkFNRV9TRVBBUkFUT1I9Ii8iO2IuREVWSUNFX05BTUVfUEFUVEVSTj0vXlwvam9iOltBLVphLXowLTlfXStcL3JlcGxpY2E6WzAtOV9dK1wvdGFzazpbMC05XStcL2RldmljZTpbQS1aYS16MC05X10rOlswLTldKy87bGV0IGQ7KGZ1bmN0aW9uKGspe2tbay5FTVBUWT0wXT0iRU1QVFkiO2tbay5DSEVDS0VEPTFdPSJDSEVDS0VEIjtrW2suUEFSVElBTD0yXT0iUEFSVElBTCJ9KShkPWIuQ2hlY2tib3hTdGF0ZXx8KGIuQ2hlY2tib3hTdGF0ZT17fSkpO2Iuc3BsaXROb2RlTmFtZT1mdW5jdGlvbihrKXtsZXQgdD1bXTtjb25zdCBsPWsubWF0Y2goYi5ERVZJQ0VfTkFNRV9QQVRURVJOKTtudWxsIT1sJiYodC5wdXNoKGxbMF0pLCIvIiE9PWtbbFswXS5sZW5ndGhdJiZjb25zb2xlLmVycm9yKCdObyBzbGFzaCAoIi8iKSBhZnRlciBkZXZpY2UgbmFtZSBpbiBub2RlIG5hbWU6JyxrKSxrPWsuc2xpY2UobFswXS5sZW5ndGgrMSkpO3JldHVybiB0LmNvbmNhdChrLnNwbGl0KGIuTk9ERV9OQU1FX1NFUEFSQVRPUikpfTsKYi5nZXRDbGVhbk5vZGVOYW1lPWZ1bmN0aW9uKGspe2xldCB0PWs7Y29uc3QgbD1rLm1hdGNoKGIuREVWSUNFX05BTUVfUEFUVEVSTik7bnVsbCE9bD8odC5sZW5ndGg+bFswXS5sZW5ndGgmJiIvIiE9dFtsWzBdLmxlbmd0aF0mJmNvbnNvbGUuZXJyb3IoJ05vIHNsYXNoICgiLyIpIGFmdGVyIGRldmljZSBuYW1lIGluIG5vZGUgbmFtZTonLGspLHQ9dC5zbGljZShsWzBdLmxlbmd0aCsxKSk6Ii8iPT09dFswXSYmKHQ9dC5zbGljZSgxKSk7dC5pbmRleE9mKCIpIik9PT10Lmxlbmd0aC0xJiYodD10LnNsaWNlKDAsdC5pbmRleE9mKCIvKCIpKSk7cmV0dXJuIHR9O2Iuc29ydEFuZEJhc2VFeHBhbmREZWJ1Z1dhdGNoZXM9ZnVuY3Rpb24oayl7ay5zb3J0KChsLHApPT5sLm5vZGVfbmFtZTxwLm5vZGVfbmFtZT8tMTpsLm5vZGVfbmFtZT5wLm5vZGVfbmFtZT8xOmwub3V0cHV0X3Nsb3QtcC5vdXRwdXRfc2xvdCk7Zm9yKGxldCBsPTA7bDxrLmxlbmd0aDsrK2wpe3ZhciB0PWtbbF0ubm9kZV9uYW1lKwoiLyI7bGV0IHA9ITE7Zm9yKGxldCBtPWwrMTttPGsubGVuZ3RoOysrbSlpZigwPT09a1ttXS5ub2RlX25hbWUuaW5kZXhPZih0KSl7cD0hMDticmVha31wJiYodD1rW2xdLm5vZGVfbmFtZS5zcGxpdCgiLyIpLGtbbF0ubm9kZV9uYW1lKz0iLygiK3RbdC5sZW5ndGgtMV0rIikiKX19O2IucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uPWZ1bmN0aW9uKGspe3JldHVybiBrLmVuZHNXaXRoKCIpIik/ay5zbGljZSgwLGsubGFzdEluZGV4T2YoIi8oIikpOmt9O2IuYXNzZW1ibGVEZXZpY2VBbmROb2RlTmFtZXM9ZnVuY3Rpb24oayl7Y29uc3QgdD1bbnVsbCxudWxsXTtpZihrWzBdLm1hdGNoKGIuREVWSUNFX05BTUVfUEFUVEVSTikpe2xldCBsPWtbMF07Ii8iPT09bFtsLmxlbmd0aC0xXSYmKGw9bC5zbGljZSgwLGwubGVuZ3RoLTEpKTt0WzBdPWw7dFsxXT1rLnNsaWNlKDEpLmpvaW4oIi8iKX1lbHNlIHRbMV09ay5qb2luKCIvIik7cmV0dXJuIHR9O2xldCBmOyhmdW5jdGlvbihrKXtrW2suTm9kZU5hbWU9CjBdPSJOb2RlTmFtZSI7a1trLk9wVHlwZT0xXT0iT3BUeXBlIn0pKGY9Yi5EZWJ1Z1dhdGNoRmlsdGVyTW9kZXx8KGIuRGVidWdXYXRjaEZpbHRlck1vZGU9e30pKTtiLmZpbHRlckRlYnVnV2F0Y2hlcz1mdW5jdGlvbihrLHQsbCl7aWYodD09PWYuTm9kZU5hbWUpcmV0dXJuIGsuZmlsdGVyKHA9PnAubm9kZV9uYW1lLm1hdGNoKGwpKTtpZih0PT09Zi5PcFR5cGUpcmV0dXJuIGsuZmlsdGVyKHA9PnAub3BfdHlwZS5tYXRjaChsKSl9O2NsYXNzIGh7Y29uc3RydWN0b3Ioayx0LGwscCl7dGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlPXQ7dGhpcy5kZWJ1Z1dhdGNoPXA7dGhpcy5uYW1lPWs7dGhpcy5kZWJ1Z1dhdGNoPXA7dGhpcy5jaGVja2JveFN0YXRlPWQuRU1QVFk7dGhpcy5wYXJlbnQ9bDt0aGlzLmNoaWxkcmVuPXt9O3RoaXMuY2hlY2tib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItY2hlY2tib3giKTt0aGlzLmNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsKCk9Pgp7dGhpcy5faGFuZGxlQ2hhbmdlKCl9LCExKX1faGFuZGxlQ2hhbmdlKCl7aWYodGhpcy5hdm9pZFByb3BhZ2F0aW9uKXRoaXMuZGVidWdXYXRjaCYmdGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlKHRoaXMuZGVidWdXYXRjaCx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCkpO2Vsc2UgaWYodGhpcy5kZWJ1Z1dhdGNoKXRoaXMuc2V0Q2hlY2tib3hTdGF0ZSh0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCk/ZC5DSEVDS0VEOmQuRU1QVFksITApLHRoaXMuaXNDaGVja2JveENoZWNrZWQoKT90aGlzLnNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKTp0aGlzLnNldE5vZGVzQWJvdmVUb0VtcHR5KCksdGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlKHRoaXMuZGVidWdXYXRjaCx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCkpO2Vsc2UgaWYodGhpcy5zZXRDaGVja2JveFN0YXRlKHRoaXMuaXNDaGVja2JveENoZWNrZWQoKT9kLkNIRUNLRUQ6ZC5FTVBUWSwhMCksdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpKXtjb25zdCB0PV8udmFsdWVzKHRoaXMuY2hpbGRyZW4pOwpmb3IoO3QubGVuZ3RoOyl7dmFyIGs9dC5wb3AoKTtfLmZvckVhY2goay5jaGlsZHJlbixsPT50LnB1c2gobCkpO2suc2V0Q2hlY2tib3hTdGF0ZShkLkNIRUNLRUQsITApfXRoaXMuc2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpfWVsc2V7Y29uc3QgdD1fLnZhbHVlcyh0aGlzLmNoaWxkcmVuKTtmb3IoO3QubGVuZ3RoOylrPXQucG9wKCksXy5mb3JFYWNoKGsuY2hpbGRyZW4sbD0+dC5wdXNoKGwpKSxrLnNldENoZWNrYm94U3RhdGUoZC5FTVBUWSwhMCk7dGhpcy5zZXROb2Rlc0Fib3ZlVG9FbXB0eSgpfX1pc0xlYWYoKXtyZXR1cm4hIXRoaXMuZGVidWdXYXRjaH1zZXRUb0FsbENoZWNrZWRFeHRlcm5hbGx5KCl7dGhpcy5zZXRDaGVja2JveFN0YXRlKGQuQ0hFQ0tFRCk7dGhpcy5faGFuZGxlQ2hhbmdlKCl9c2V0Q2hlY2tib3hTdGF0ZShrLHQpe3RoaXMuYXZvaWRQcm9wYWdhdGlvbj10O3RoaXMuY2hlY2tib3hTdGF0ZT1rO3RoaXMuY2hlY2tib3guY2xhc3NMaXN0LnRvZ2dsZSgicGFydGlhbC1jaGVja2JveCIsCms9PT1kLlBBUlRJQUwpO2s9PT1kLkNIRUNLRUQ/dGhpcy5jaGVja2JveC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIik6dGhpcy5jaGVja2JveC5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKTt0aGlzLmF2b2lkUHJvcGFnYXRpb249ITF9aXNDaGVja2JveENoZWNrZWQoKXtyZXR1cm4gdGhpcy5jaGVja2JveC5oYXNBdHRyaWJ1dGUoImNoZWNrZWQiKX1zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCl7bGV0IGs9dGhpcy5wYXJlbnQsdD0hMTtmb3IoO2s7KXQ/ay5zZXRDaGVja2JveFN0YXRlKGQuUEFSVElBTCwhMCk6KHQ9LTEhPT1fLmZpbmRJbmRleChfLnZhbHVlcyhrLmNoaWxkcmVuKSxsPT5sLmNoZWNrYm94U3RhdGUhPT1kLkNIRUNLRUQpLGsuc2V0Q2hlY2tib3hTdGF0ZSh0P2QuUEFSVElBTDpkLkNIRUNLRUQsITApKSxrPWsucGFyZW50fXNldE5vZGVzQWJvdmVUb0VtcHR5KCl7bGV0IGs9dGhpcy5wYXJlbnQsdD0hMTtmb3IoO2s7KXQ/ay5zZXRDaGVja2JveFN0YXRlKGQuUEFSVElBTCwKITApOih0PS0xIT09Xy5maW5kSW5kZXgoXy52YWx1ZXMoay5jaGlsZHJlbiksbD0+bC5jaGVja2JveFN0YXRlIT09ZC5FTVBUWSksay5zZXRDaGVja2JveFN0YXRlKHQ/ZC5QQVJUSUFMOmQuRU1QVFksITApKSxrPWsucGFyZW50fXNldExldmVsRG9tKGspe3RoaXMubGV2ZWxEb209a319Yi5TZWxlY3Rpb25UcmVlTm9kZT1ofSkoVml8fChWaT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1vcC1zZWxlY3Rvci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1vcC1zZWxlY3RvciIscHJvcGVydGllczp7ZGVidWdXYXRjaGVzOkFycmF5LGRlYnVnV2F0Y2hDaGFuZ2U6T2JqZWN0LG5vZGVDbGlja2VkOkZ1bmN0aW9uLGZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZm9yY2VFeHBhbmROb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfbGV2ZWxOYW1lMkNvbnRhaW5lcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX2xldmVsTmFtZTJOb2RlOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfd2F0Y2hIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVdhdGNoSGllcmFyY2h5KGRlYnVnV2F0Y2hlcywgZGVidWdXYXRjaENoYW5nZSwgX2ZpbHRlck1vZGUsIF9maWx0ZXJJbnB1dCkifSxfZmlsdGVyTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6Ik5vZGUgTmFtZSIsCm5vdGlmeTohMH0sX2ZpbHRlcklucHV0Ont0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LF9pc0xvYWRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2hpZ2hsaWdodGVkTGV2ZWxEb206e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfcmVuZGVySGllcmFyY2h5V2l0aFRpbWVvdXQoX3dhdGNoSGllcmFyY2h5LCBkZWJ1Z1dhdGNoQ2hhbmdlKSIsIl9oYW5kbGVGb3JjZU5vZGVFeHBhbmRBbmRDaGVjayhmb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWUpIiwiX2hhbmRsZUZvcmNlTm9kZUV4cGFuZChmb3JjZUV4cGFuZE5vZGVOYW1lKSJdLF9jb21wdXRlV2F0Y2hIaWVyYXJjaHkoYixkLGYsaCl7aD1oLnRyaW0oKTtsZXQgaz1iO251bGwhPWYmJjA8aC5sZW5ndGgmJihrPVZpLmZpbHRlckRlYnVnV2F0Y2hlcyhiLFZpLkRlYnVnV2F0Y2hGaWx0ZXJNb2RlW2YucmVwbGFjZSgvXHMvZywiIildLG5ldyBSZWdFeHAoaCkpKTtjb25zdCB0PW5ldyBWaS5TZWxlY3Rpb25UcmVlTm9kZSgiIiwKZCk7dC5pc1Jvb3Q9ITA7Xy5mb3JFYWNoKGssbD0+e2NvbnN0IHA9Vmkuc3BsaXROb2RlTmFtZShsLmRldmljZV9uYW1lKyIvIitsLm5vZGVfbmFtZSk7bGV0IG09dDtfLmZvckVhY2gocCwobixxKT0+e3E9PT1wLmxlbmd0aC0xPyhxPW5ldyBWaS5TZWxlY3Rpb25UcmVlTm9kZShuLGQsbSxsKSxtLmNoaWxkcmVuW25dPXEpOihtLmNoaWxkcmVuW25dfHwobS5jaGlsZHJlbltuXT1uZXcgVmkuU2VsZWN0aW9uVHJlZU5vZGUobixkLG0pKSxtPW0uY2hpbGRyZW5bbl0pfSl9KTtyZXR1cm4gdH0sX2NsZWFyU2VsZWN0b3JIaWVyYXJjaHkoKXtjb25zdCBiPXRoaXMuJCQoIiNzZWxlY3Rvci1oaWVyYXJjaHkiKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfSxfcmVuZGVySGllcmFyY2h5V2l0aFRpbWVvdXQoYixkLGYsaCl7dGhpcy5faXNMb2FkaW5nfHwodGhpcy5zZXQoIl9pc0xvYWRpbmciLCEwKSx0aGlzLl9jbGVhclNlbGVjdG9ySGllcmFyY2h5KCksCnNldFRpbWVvdXQoKCk9Pnt0aGlzLl9yZW5kZXJIaWVyYXJjaHkoYixkLGYsaCl9LDEwKSl9LF9yZW5kZXJIaWVyYXJjaHkoYixkKXt0aGlzLnNldCgiX2xldmVsTmFtZTJDb250YWluZXIiLHt9KTt0aGlzLnNldCgiX2xldmVsTmFtZTJOb2RlIix7fSk7Yj10aGlzLl9yZW5kZXJMZXZlbChudWxsLG51bGwsYixkKTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2VsZWN0b3ItaGllcmFyY2h5IikpLmFwcGVuZENoaWxkKGIpO3RoaXMuc2V0KCJfaXNMb2FkaW5nIiwhMSl9LF9yZW5kZXJMZXZlbChiLGQsZixoKXtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO251bGwhPWImJmsuc2V0QXR0cmlidXRlKCJsZXZlbC1uYW1lIixiKTtsZXQgdDt0PW51bGw9PWQ/YjpkKyIvIitiO1BvbHltZXIuZG9tKGspLmNsYXNzTGlzdC5hZGQoImxldmVsLWNvbnRhaW5lciIpO2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1jb2xsYXBzZSIpO2lmKGIpe3RoaXMuX2xldmVsTmFtZTJDb250YWluZXJbdF09Cmw7bC5yZW1vdmVBdHRyaWJ1dGUoIm9wZW5lZCIpO1BvbHltZXIuZG9tKGspLmNsYXNzTGlzdC5hZGQoImluZGVudGVkLWxldmVsLWNvbnRhaW5lciIpO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7UG9seW1lci5kb20oZCkuY2xhc3NMaXN0LmFkZCgibGV2ZWwtdGl0bGUiKTtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7UG9seW1lci5kb20obikuY2xhc3NMaXN0LmFkZCgibm9kZS1leHBhbmQtYnV0dG9uIik7Y29uc3QgcT0oKT0+e24uc2V0QXR0cmlidXRlKCJpY29uIixsLmhhc0F0dHJpYnV0ZSgib3BlbmVkIik/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUiKX07bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntsLmhhc0F0dHJpYnV0ZSgib3BlbmVkIik/bC5yZW1vdmVBdHRyaWJ1dGUoIm9wZW5lZCIpOmwuc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKTtxKCl9LCExKTtxKCk7UG9seW1lci5kb20oZCkuYXBwZW5kQ2hpbGQobik7ClBvbHltZXIuZG9tKGQpLmFwcGVuZENoaWxkKGYuY2hlY2tib3gpO2Yuc2V0TGV2ZWxEb20oZCk7Y29uc3QgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7UG9seW1lci5kb20odSkuY2xhc3NMaXN0LmFkZCgibGV2ZWwtdGl0bGUtdGV4dCIpO3UudGV4dENvbnRlbnQ9YjtQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZCh1KTtQb2x5bWVyLmRvbShrKS5hcHBlbmRDaGlsZChkKTsoYi5tYXRjaChWaS5ERVZJQ0VfTkFNRV9QQVRURVJOKXx8MT09PU9iamVjdC5rZXlzKGYuY2hpbGRyZW4pLmxlbmd0aCkmJmwuc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKX1lbHNlIGwuc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKTtjb25zdCBwPVtdLG09W107UG9seW1lci5kb20obCkuY2xhc3NMaXN0LmFkZCgiY29udGVudC1jb250YWluZXIiKTtfLmZvckVhY2goZi5jaGlsZHJlbiwobixxKT0+e2NvbnN0IHU9bi5kZWJ1Z1dhdGNoO3ZhciB4PXQ7bnVsbD09dCYmKHg9IiIpO3grPSIvIitxOwp0aGlzLl9sZXZlbE5hbWUyTm9kZVt4XT1uO251bGwhPXRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbeF0mJihuLnNldENoZWNrYm94U3RhdGUoVmkuQ2hlY2tib3hTdGF0ZS5DSEVDS0VEKSxuLnNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKSk7aWYodSl7eD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtQb2x5bWVyLmRvbSh4KS5jbGFzc0xpc3QuYWRkKCJvcC1kZXNjcmlwdGlvbiIpO24uY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix5PT57dGhpcy5faGFuZGxlTGVhZk5vZGVTZWxlY3RlZChoLHUseS50YXJnZXQuY2hlY2tlZCl9LCExKTtQb2x5bWVyLmRvbSh4KS5hcHBlbmRDaGlsZChuLmNoZWNrYm94KTtuLnNldExldmVsRG9tKHgpO3ZhciBBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtBLnRleHRDb250ZW50PSJbIit1Lm9wX3R5cGUrIl0iO0Euc2V0QXR0cmlidXRlKCJjbGFzcyIsIm9wLXR5cGUiKTtQb2x5bWVyLmRvbSh4KS5hcHBlbmRDaGlsZChBKTsKQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7QS50ZXh0Q29udGVudD1xO0Euc2V0QXR0cmlidXRlKCJjbGFzcyIsIm9wLXRpdGxlLWxlYWYiKTtBLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e2NvbnN0IHk9dGhpcy5fZ2V0RGV2aWNlQW5kTm9kZU5hbWVzKHEsayk7dGhpcy5ub2RlQ2xpY2tlZCh5WzBdLHlbMV0pfSwhMSk7UG9seW1lci5kb20oeCkuYXBwZW5kQ2hpbGQoQSk7bS5wdXNoKHgpfWVsc2Ugbi5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHk9Pnt0aGlzLl9oYW5kbGVNZXRhTm9kZUNoYW5nZShuLGgseS50YXJnZXQuY2hlY2tlZCl9KSxwLnB1c2godGhpcy5fcmVuZGVyTGV2ZWwocSx0LG4saCkpfSk7Yj1uPT57UG9seW1lci5kb20obCkuYXBwZW5kQ2hpbGQobil9O18uZm9yRWFjaChtLGIpO18uZm9yRWFjaChwLGIpO1BvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGwpO3JldHVybiBrfSxfZ2V0TGVhZkRlYnVnV2F0Y2hlcyhiLGQpe2IuZGVidWdXYXRjaD8KZC5wdXNoKGIuZGVidWdXYXRjaCk6Xy5mb3JFYWNoKGIuY2hpbGRyZW4sZj0+e3RoaXMuX2dldExlYWZEZWJ1Z1dhdGNoZXMoZixkKX0pfSxfZ2V0RGV2aWNlQW5kTm9kZU5hbWVzKGIsZCl7Zm9yKGI9W2JdOzspe2NvbnN0IGY9ZC5nZXRBdHRyaWJ1dGUoImxldmVsLW5hbWUiKTtpZihudWxsPT1mKWJyZWFrO2Vsc2UgYi5wdXNoKGYpO2Q9UG9seW1lci5kb20oZCkucGFyZW50Tm9kZS5wYXJlbnROb2RlfWIucmV2ZXJzZSgpO3JldHVybiBWaS5hc3NlbWJsZURldmljZUFuZE5vZGVOYW1lcyhiKX0sX2hhbmRsZU1ldGFOb2RlQ2hhbmdlKGIsZCxmKXtsZXQgaD1bXTt0aGlzLl9nZXRMZWFmRGVidWdXYXRjaGVzKGIsaCk7Xy5mb3JFYWNoKGgsaz0+e3RoaXMuX2hhbmRsZUxlYWZOb2RlU2VsZWN0ZWQoZCxrLGYpfSl9LF9oYW5kbGVMZWFmTm9kZVNlbGVjdGVkKGIsZCxmKXtjb25zdCBoPWQuZGV2aWNlX25hbWUrIi8iK2Qubm9kZV9uYW1lO2Y/dGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1toXT0KZDpkZWxldGUgdGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1toXTtiKGQsZil9LF9oYW5kbGVGb3JjZU5vZGUoYixkKXt0aGlzLnNldCgiX2ZpbHRlcklucHV0IiwiIik7c2V0VGltZW91dCgoKT0+e2lmKG51bGwhPWImJm51bGwhPXRoaXMuX2xldmVsTmFtZTJDb250YWluZXIpe3ZhciBmPVZpLnNwbGl0Tm9kZU5hbWUoYik7Zm9yKGxldCBrPTE7azw9Zi5sZW5ndGg7KytrKXt2YXIgaD1mLnNsaWNlKDAsaykuam9pbigiLyIpO2NvbnN0IHQ9dGhpcy5fbGV2ZWxOYW1lMk5vZGVbaF07bnVsbCE9dCYmbnVsbCE9dC5sZXZlbERvbSYmdC5sZXZlbERvbS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImNlbnRlciIsYmVoYXZpb3VyOiJzbW9vdGgifSk7azxmLmxlbmd0aD9udWxsIT10aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyW2hdJiZ0aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyW2hdLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCk6KHQuZGVidWdXYXRjaHx8dGhpcy5faGFuZGxlTWV0YU5vZGVDaGFuZ2UodCwKdC5kZWJ1Z1dhdGNoQ2hhbmdlLCEwKSxkJiYodC5zZXRUb0FsbENoZWNrZWRFeHRlcm5hbGx5KCksKGg9dC5kZWJ1Z1dhdGNoKSYmbnVsbD09dGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1toLm5vZGVfbmFtZV0mJih0aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2JdPWgpKSxudWxsIT10aGlzLl9oaWdobGlnaHRlZExldmVsRG9tJiZ0aGlzLl9oaWdobGlnaHRlZExldmVsRG9tLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkIiksdC5sZXZlbERvbS5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZCIpLHRoaXMuc2V0KCJfaGlnaGxpZ2h0ZWRMZXZlbERvbSIsdC5sZXZlbERvbSkpfX19LDIwKX0sX2hhbmRsZUZvcmNlTm9kZUV4cGFuZEFuZENoZWNrKGIpe3RoaXMuX2hhbmRsZUZvcmNlTm9kZShiLCEwKX0sX2hhbmRsZUZvcmNlTm9kZUV4cGFuZChiKXt0aGlzLl9oYW5kbGVGb3JjZU5vZGUoYiwhMSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXNlc3Npb24tcnVucy12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNlc3Npb24tcnVucy12aWV3Iixwcm9wZXJ0aWVzOntsYXRlc3RTZXNzaW9uUnVuOk9iamVjdCxzZXNzaW9uUnVuS2V5VG9EZXZpY2VOYW1lczpPYmplY3Qsc29sZUFjdGl2ZTpCb29sZWFuLG5vZGVPclRlbnNvckNsaWNrZWQ6RnVuY3Rpb24sX3J1bktleTJDb3VudDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9ydW5LZXkyTnVtRGV2aWNlczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9hY3RpdmVSdW5LZXk6U3RyaW5nfSxvYnNlcnZlcnM6WyJyZW5kZXJMYXRlc3QobGF0ZXN0U2Vzc2lvblJ1bikiLCJzZXRTb2xlQWN0aXZlU3RhdHVzKHNvbGVBY3RpdmUpIl0scmVuZGVyTGF0ZXN0KGIpe2I9SlNPTi5zdHJpbmdpZnkoYik7dGhpcy5fcnVuS2V5MkNvdW50W2JdPXZvaWQgMD09PXRoaXMuX3J1bktleTJDb3VudFtiXT8xOnRoaXMuX3J1bktleTJDb3VudFtiXSsxO3ZvaWQgMD09PXRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2JdJiYodGhpcy5fcnVuS2V5Mk51bURldmljZXNbYl09CjApO3RoaXMuX2FjdGl2ZVJ1bktleT1iO3RoaXMuX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpfSx1cGRhdGVOdW1EZXZpY2VzKGIpe251bGwhPXRoaXMuX2FjdGl2ZVJ1bktleSYmKHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW3RoaXMuX2FjdGl2ZVJ1bktleV09Yix0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKSl9LHNldFNvbGVBY3RpdmVTdGF0dXMoKXt0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKX0sX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpe3RoaXMuX2NsZWFyVGFibGUoKTt0aGlzLl9yZW5kZXJIZWFkZXIoKTtsZXQgYjtmb3IoY29uc3QgZiBpbiB0aGlzLl9ydW5LZXkyQ291bnQpaWYodGhpcy5fcnVuS2V5MkNvdW50Lmhhc093blByb3BlcnR5KGYpKXt2YXIgZD1KU09OLnBhcnNlKGYpOyhkPXRoaXMuX3JlbmRlclJvdyhkLHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2ZdLHRoaXMuX3J1bktleTJDb3VudFtmXSx0aGlzLl9hY3RpdmVSdW5LZXk9PT1mLHRoaXMuc29sZUFjdGl2ZSkpJiYKKGI9ZCl9YiYmKFBvbHltZXIuZG9tKHRoaXMuJCQoIiNzZXNzaW9uLXJ1bnMtdGFibGUiKSkucGFyZW50Tm9kZS5wYXJlbnROb2RlLnNjcm9sbFRvcD1iLm9mZnNldFRvcCl9LF9jbGVhclRhYmxlKCl7Y29uc3QgYj10aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIik7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX0sX3JlbmRlckhlYWRlcigpe2NvbnN0IGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7ZC50ZXh0Q29udGVudD0iRmVlZHMiO2NvbnN0IGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtmLnRleHRDb250ZW50PSJGZXRjaGVzIjtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7aC50ZXh0Q29udGVudD0iVGFyZ2V0cyI7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2sudGV4dENvbnRlbnQ9IiMoRGV2aWNlcykiO2NvbnN0IHQ9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7dC50ZXh0Q29udGVudD0iQ291bnQiO2IuYXBwZW5kQ2hpbGQoZCk7Yi5hcHBlbmRDaGlsZChmKTtiLmFwcGVuZENoaWxkKGgpO2IuYXBwZW5kQ2hpbGQoayk7Yi5hcHBlbmRDaGlsZCh0KTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLmFwcGVuZENoaWxkKGIpfSxfcmVuZGVyUm93KGIsZCxmLGgsayl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLGw9dGhpcy5fcmVuZGVyR3JhcGhFbGVtZW50cyhiLmZlZWRzKSxwPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYi5mZXRjaGVzKTtiPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYi50YXJnZXRzKTtjb25zdCBtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7bS50ZXh0Q29udGVudD1kO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtkLnRleHRDb250ZW50PWY7dC5hcHBlbmRDaGlsZChsKTt0LmFwcGVuZENoaWxkKHApOwp0LmFwcGVuZENoaWxkKGIpO3QuYXBwZW5kQ2hpbGQobSk7dC5hcHBlbmRDaGlsZChkKTtoJiYoaz90LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJzb2xlLWFjdGl2ZS1zZXNzaW9uLXJ1biIpOnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsImFjdGl2ZS1zZXNzaW9uLXJ1biIpKTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLmFwcGVuZENoaWxkKHQpO2lmKGgpcmV0dXJuIHR9LF9yZW5kZXJHcmFwaEVsZW1lbnRzKGIpe2NvbnN0IGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtfLmZvckVhY2goYixmPT57Y29uc3QgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnRleHRDb250ZW50PWY7aC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwibm9kZS1vci10ZW5zb3ItZWxlbWVudCIpO2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dGhpcy5ub2RlT3JUZW5zb3JDbGlja2VkKGYpfSk7ZC5hcHBlbmRDaGlsZChoKX0pO3JldHVybiBkfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1zb3VyY2UtY29kZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNvdXJjZS1jb2RlLXZpZXciLHByb3BlcnRpZXM6e3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxmb2N1c05vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfb2xkRm9jdXNOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZGVidWdXYXRjaGVzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxub2RlQ2xpY2tlZDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSxjb250aW51ZVRvTm9kZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSxfaGlnaGxpZ2h0ZWRFbGVtZW50czp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX2ZpbGVQYXRoU2VsZWN0ZWQ6TnVtYmVyLF9mdWxsRmlsZVBhdGhzOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9zaG9ydEZpbGVQYXRoczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfZmlsZUxpbmVzOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9ub2RlTmFtZTJEZXZpY2VOYW1lOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSwKX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfbm9kZU5hbWUyTm9kZUVsZW1lbnRzOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfbm9kZU5hbWUyU3RhY2tUb3BOb2RlRWxlbWVudDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX2Z1bGxTdGFja1Nob3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9mdWxsU3RhY2tOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlbmRlckRlbGF5TWlsbGlzOnt0eXBlOk51bWJlcix2YWx1ZTo1MCxyZWFkb25seTohMH19LG9ic2VydmVyczpbIl9yZW5kZXJGaWxlKF9maWxlUGF0aFNlbGVjdGVkKSIsIl9mb2N1c09uTm9kZShmb2N1c05vZGVOYW1lKSJdLHJlbmRlcihiKXtudWxsIT1iJiZ0aGlzLnNldCgiX2RlYnVnV2F0Y2hlcyIsYik7dGhpcy5fcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoe21vZGU6InBhdGhzIn0pLnRoZW4oZD0+Cnt0aGlzLnNldCgiX2Z1bGxGaWxlUGF0aHMiLGQucGF0aHMpO2NvbnN0IGY9ZC5wYXRocy5tYXAoaD0+KHtpZDpoLG5hbWU6dGhpcy5fc2hvcnRlblBhdGgoaCxkLnBhdGhzKX0pKTt0aGlzLnNldCgiX3Nob3J0RmlsZVBhdGhzIixmKTswPGYubGVuZ3RoJiZ0aGlzLnNldCgiX2ZpbGVQYXRoU2VsZWN0ZWQiLDApfSl9LF9zaG9ydGVuUGF0aChiKXtiPWIucmVwbGFjZSgvXFwvZywiLyIpO2I9Yi5zcGxpdCgiLyIpO3JldHVybiBiW2IubGVuZ3RoLTFdfSxfcmVuZGVyRmlsZShiKXtpZihudWxsIT1iKXt2YXIgZD10aGlzLl9zaG9ydEZpbGVQYXRoc1tiXS5pZDt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToiY29udGVudCIsZmlsZV9wYXRoOmR9KS50aGVuKGY9Pntjb25zdCBoPVtdLGs9Zi5jb250ZW50W2RdLHQ9Zi5saW5lbm9fdG9fb3BfbmFtZV9hbmRfc3RhY2tfcG9zO2Y9e307Zm9yKHZhciBsIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShsKSYmKGZbbF09dFtsXS5sZW5ndGgpOwp0aGlzLl9maWx0ZXJGaWxlVHJhY2ViYWNrc0J5RGVidWdXYXRjaGVzKHQpO2ZvcihsPTA7bDxrLmxlbmd0aDsrK2wpe2NvbnN0IG09bCsxO2gucHVzaCh7bGluZW5vOm0sbnVtTm9kZXM6bnVsbCE9dFttXT9TdHJpbmcodFttXS5sZW5ndGgpKyIvIitTdHJpbmcoZlttXSkrIiBcdTI1YmMiOiIiLHRleHQ6dGhpcy5faHRtbEVzY2FwZShrW2xdKX0pfXRoaXMuc2V0KCJfZmlsZUxpbmVzIixoKTtjb25zdCBwPXRoaXM7c2V0VGltZW91dCgoKT0+e2NvbnN0IG09e30sbj17fTtmb3IoY29uc3QgdSBpbiB0KXtpZighdC5oYXNPd25Qcm9wZXJ0eSh1KSljb250aW51ZTtmb3IodmFyIHE9cC4kJCgiI3NvdXJjZS1saW5lLW5vZGVzLSIrdSk7cS5maXJzdENoaWxkOylxLnJlbW92ZUNoaWxkKHEuZmlyc3RDaGlsZCk7Y29uc3QgeD10W3VdO3guc29ydChmdW5jdGlvbihBLHkpe3JldHVybiBBWzBdPHlbMF0/LTE6QVswXT55WzBdPzE6MH0pO2ZvcihsZXQgQT0wO0E8eC5sZW5ndGg7KytBKXtjb25zdCB5PQp4W0FdWzBdLHc9eFtBXVsxXSxDPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO0cuc2V0QXR0cmlidXRlKCJjbGFzcyIsInNvdXJjZS1saW5lLW5vZGUtZW50dHJ5Iik7Ry5zZXRBdHRyaWJ1dGUoInNvdXJjZUxpbmVubyIsdSk7Ry50ZXh0Q29udGVudD15O0cuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3RoaXMubm9kZUNsaWNrZWQodGhpcy5fbm9kZU5hbWUyRGV2aWNlTmFtZVt5XSx0aGlzLl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZVt5XSwhMCl9KTtjb25zdCBEPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7RC5zZXRBdHRyaWJ1dGUoImljb24iLCJmaWx0ZXItbGlzdCIpO0Quc2V0QXR0cmlidXRlKCJ0aXRsZSIsIlNob3cgc3RhY2siKTtELmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLl9oaWdobGlnaHROb2RlRWxlbWVudHMoeSk7dGhpcy5zZXQoIl9mdWxsU3RhY2tOb2RlTmFtZSIsCnkpO3RoaXMuc2V0KCJfZnVsbFN0YWNrU2hvd24iLCEwKTt0aGlzLl9wb3B1bGF0ZUZ1bGxTdGFjayh5LHRoaXMuX2Z1bGxGaWxlUGF0aHNbdGhpcy5fZmlsZVBhdGhTZWxlY3RlZF0sTnVtYmVyKHUpKX0pO2NvbnN0IEI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTtCLnNldEF0dHJpYnV0ZSgiaWNvbiIsImZvcndhcmQiKTtCLnNldEF0dHJpYnV0ZSgidGl0bGUiLCJDb250aW51ZSB0byIpO0IuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3RoaXMubm9kZUNsaWNrZWQodGhpcy5fbm9kZU5hbWUyRGV2aWNlTmFtZVt5XSx0aGlzLl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZVt5XSwhMCk7Y29uc3QgST10aGlzLl9ub2RlTmFtZTJEZXZpY2VOYW1lW3ldLE49dGhpcy5fbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWVbeV07dGhpcy5zZXQoIl9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQiLEcpO3RoaXMuY29udGludWVUb05vZGUoSSwKTil9KTtDLmFwcGVuZENoaWxkKEQpO0MuYXBwZW5kQ2hpbGQoQik7Qy5hcHBlbmRDaGlsZChHKTtxLmFwcGVuZENoaWxkKEMpO20uaGFzT3duUHJvcGVydHkoeSl8fChtW3ldPVtdKTttW3ldLnB1c2goRyk7bi5oYXNPd25Qcm9wZXJ0eSh5KXx8KG5beV09W0csd10pO3c+blt5XVsxXSYmKG5beV09W0csd10pfXEuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTtxPXAuJCQoIiNzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZS0iK3UpO251bGw9PXEuZ2V0QXR0cmlidXRlKCJ0YXBDYWxsYmFja1NldCIpJiYocS5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57cC5fdG9nZ2xlTGluZU5vZGVzKE51bWJlcih1KSl9KSxxLnNldEF0dHJpYnV0ZSgidGFwQ2FsbGJhY2tTZXQiLCEwKSl9cC5zZXQoIl9ub2RlTmFtZTJOb2RlRWxlbWVudHMiLG0pO2Zvcihjb25zdCB1IGluIG4pbi5oYXNPd25Qcm9wZXJ0eSh1KSYmKG5bdV09blt1XVswXSk7cC5zZXQoIl9ub2RlTmFtZTJTdGFja1RvcE5vZGVFbGVtZW50IiwKbil9LHRoaXMuX3JlbmRlckRlbGF5TWlsbGlzKX0pfX0sX3RvZ2dsZUxpbmVOb2RlcyhiLGQ9ITEpe2I9dGhpcy4kJCgiI3NvdXJjZS1saW5lLW5vZGVzLSIrYik7bnVsbD09Yi5nZXRBdHRyaWJ1dGUoImhpZGRlbiIpJiYhMCE9PWQ/Yi5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsITApOmIucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKX0sX2ZpbHRlckZpbGVUcmFjZWJhY2tzQnlEZWJ1Z1dhdGNoZXMoYil7Y29uc3QgZD10aGlzLmRlYnVnV2F0Y2hlcy5tYXAoaz0+VmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGsubm9kZV9uYW1lKSksZj17fSxoPXt9O2Zvcihjb25zdCBrIG9mIHRoaXMuZGVidWdXYXRjaGVzKXtjb25zdCB0PVZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihrLm5vZGVfbmFtZSk7Zlt0XT1rLmRldmljZV9uYW1lO2hbdF09ay5ub2RlX25hbWV9dGhpcy5zZXQoIl9ub2RlTmFtZTJEZXZpY2VOYW1lIixmKTt0aGlzLnNldCgiX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lIiwKaCk7Zm9yKGNvbnN0IGsgaW4gYiliLmhhc093blByb3BlcnR5KGspJiYoYltrXT1iW2tdLmZpbHRlcih0PT5fLmluY2x1ZGVzKGQsdFswXSkpKX0sX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KGIpe2NvbnN0IGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL3NvdXJjZV9jb2RlIik7Yj12Yy5hZGRQYXJhbXMoZCxiKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpfSxfaHRtbEVzY2FwZShiKXtyZXR1cm4gYi5yZXBsYWNlKC8gL2csIlx1MDBhMCIpfSxfZm9jdXNPbk5vZGUoYil7aWYobnVsbCE9Yil7dmFyIGQ9dGhpcy5fc2hvcnRGaWxlUGF0aHNbdGhpcy5fZmlsZVBhdGhTZWxlY3RlZF0uaWQsZj10aGlzO3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJvcF90cmFjZWJhY2siLG9wX25hbWU6Yn0pLnRoZW4oaD0+e2NvbnN0IGs9aC5vcF90cmFjZWJhY2tbYl07aD1bXTtmb3IobGV0IGw9MDtsPGsubGVuZ3RoOysrbCl7Y29uc3QgcD0Ka1tsXVsxXTtrW2xdWzBdPT09ZCYmaC5wdXNoKHApfWZvcih2YXIgdCBvZiBmLl9oaWdobGlnaHRlZEVsZW1lbnRzKXQuY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQtc291cmNlLWxpbmUiKTt0PVtdO2Zvcihjb25zdCBsIG9mIGgpaD10aGlzLiQkKCIjc291cmNlLWxpbmUtIitsKSx0LnB1c2goaCksaC5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZC1zb3VyY2UtbGluZSIpLGYuX3RvZ2dsZUxpbmVOb2RlcyhsLCEwKTtmLnNldCgiX2hpZ2hsaWdodGVkRWxlbWVudHMiLHQpO3RoaXMuX2hpZ2hsaWdodE5vZGVFbGVtZW50cyhiKX0pfX0sX2hpZ2hsaWdodE5vZGVFbGVtZW50cyhiKXtpZihudWxsIT10aGlzLl9vbGRGb2N1c05vZGVOYW1lKWZvcihjb25zdCBkIG9mIHRoaXMuX25vZGVOYW1lMk5vZGVFbGVtZW50c1t0aGlzLl9vbGRGb2N1c05vZGVOYW1lXSlkLnN0eWxlWyJmb250LXdlaWdodCJdPSJub3JtYWwiO2Zvcihjb25zdCBkIG9mIHRoaXMuX25vZGVOYW1lMk5vZGVFbGVtZW50c1tiXSlkLnN0eWxlWyJmb250LXdlaWdodCJdPQoiYm9sZCI7bnVsbD09dGhpcy5fc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50P3RoaXMuX25vZGVOYW1lMlN0YWNrVG9wTm9kZUVsZW1lbnRbYl0uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJjZW50ZXIiLGJlaGF2aW91cjoic21vb3RoIn0pOnRoaXMuc2V0KCJfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50IixudWxsKTt0aGlzLnNldCgiX29sZEZvY3VzTm9kZU5hbWUiLGIpfSxfcG9wdWxhdGVGdWxsU3RhY2soYixkLGYpe3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJvcF90cmFjZWJhY2siLG9wX25hbWU6Yn0pLnRoZW4oaD0+e2NvbnN0IGs9dGhpcy4kJCgiI2Z1bGwtc3RhY2stY29udGVudCIpO2Zvcig7ay5maXJzdENoaWxkOylrLnJlbW92ZUNoaWxkKGsuZmlyc3RDaGlsZCk7Zm9yKGNvbnN0IHQgb2YgaC5vcF90cmFjZWJhY2tbYl0pe2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxwPXRbMF0sbT1OdW1iZXIodFsxXSk7bC50ZXh0Q29udGVudD0KcCsiOiAiK1N0cmluZyhtKTtfLmluY2x1ZGVzKHRoaXMuX2Z1bGxGaWxlUGF0aHMscCk/KGwuY2xhc3NMaXN0LmFkZCgic3RhY2stZnJhbWUtY2xpY2thYmxlIiksbC5zdHlsZS5jb2xvcj0iYmx1ZSIsbC5zdHlsZVsidGV4dC1kZWNvcmF0aW9uIl09InVuZGVybGluZSIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHA9PT1kJiZtPT09ZiYmKGwuc3R5bGVbImZvbnQtd2VpZ2h0Il09ImJvbGQiKSxsLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLnNldCgiX2ZpbGVQYXRoU2VsZWN0ZWQiLHRoaXMuX2Z1bGxGaWxlUGF0aHMuaW5kZXhPZihwKSk7c2V0VGltZW91dCgoKT0+e3RoaXMuX3RvZ2dsZUxpbmVOb2RlcyhtLCEwKTtmb3IoY29uc3QgbiBvZiB0aGlzLl9ub2RlTmFtZTJOb2RlRWxlbWVudHNbYl0pTnVtYmVyKG4uZ2V0QXR0cmlidXRlKCJzb3VyY2VMaW5lbm8iKSk9PT1OdW1iZXIobSkmJihuLnNjcm9sbEludG9WaWV3KHtibG9jazoiY2VudGVyIixiZWhhdmlvdXI6InNtb290aCJ9KSwKdGhpcy5zZXQoIl9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQiLGwpLHRoaXMuX2hpZ2hsaWdodE5vZGVFbGVtZW50cyhiKSxkPT09cCYmZj09PW18fHRoaXMuX3BvcHVsYXRlRnVsbFN0YWNrKGIscCxtKSl9LDIqdGhpcy5fcmVuZGVyRGVsYXlNaWxsaXMpfSkpOihsLmNsYXNzTGlzdC5hZGQoInN0YWNrLWZyYW1lLW5vbmNsaWNrYWJsZSIpLGwuc3R5bGUuY29sb3I9IiM1NTUiKTtrLmFwcGVuZENoaWxkKGwpfX0pfSxfY2xvc2VGdWxsU3RhY2tEaWFsb2coKXt0aGlzLnNldCgiX2Z1bGxTdGFja1Nob3duIiwhMSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci1kYXRhLXN1bW1hcnkuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGVuc29yLWRhdGEtc3VtbWFyeSIscHJvcGVydGllczp7bGF0ZXN0VGVuc29yRGF0YTpPYmplY3QsZXhwYW5kSGFuZGxlcjpPYmplY3QsY29udGludWVUb0NhbGxiYWNrOkZ1bmN0aW9uLGhpZ2hsaWdodGVkTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHRlbnNvck5hbWVDbGlja2VkOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOm51bGx9LGdldEhlYWx0aFBpbGw6RnVuY3Rpb24sX2hlYWx0aFBpbGxzRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMH0sX3dhdGNoS2V5czp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX3dhdGNoS2V5MkRhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyQ291bnQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyRXhwYW5kSGFuZGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6e319LF93YXRjaEtleTJWYWx1ZVNob3J0Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MlJvdzp7dHlwZTpPYmplY3QsCnZhbHVlOnt9fSxfYWN0aXZlV2F0Y2hLZXk6U3RyaW5nLF9oZWFsdGhQaWxsV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjIwMCxyZWFkb25seTohMH0sX2hlYWx0aFBpbGxIZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOjMyLHJlYWRvbmx5OiEwfX0sb2JzZXJ2ZXJzOlsiX3JlbmRlckxhdGVzdChsYXRlc3RUZW5zb3JEYXRhLCBleHBhbmRIYW5kbGVyKSIsIl9oaWdobGlnaHQoaGlnaGxpZ2h0ZWROb2RlTmFtZSkiXSxsaXN0ZW5lcnM6eyJzaG93LWhlYWx0aC1waWxscy5jaGFuZ2UiOiJfc2hvd0hlYWx0aFBpbGxzQ2hhbmdlZCJ9LHJlYWR5KCl7dGhpcy5fcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpfSxlbmFibGVIZWFsdGhQaWxscygpe3RoaXMuc2V0KCJfaGVhbHRoUGlsbHNFbmFibGVkIiwhMCk7dGhpcy5fcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpfSxfc2hvd0hlYWx0aFBpbGxzQ2hhbmdlZCgpe3RoaXMuX2hlYWx0aFBpbGxzRW5hYmxlZD90aGlzLl9yZW5kZXJIZWFsdGhQaWxsTGVnZW5kKCk6CnRoaXMuX2NsZWFySGVhbHRoUGlsbExlZ2VuZCgpO3RoaXMuX3JlbmRlckFsbCgpfSxfcmVuZGVyQWxsKCl7dGhpcy5fY2xlYXJUZW5zb3JEYXRhVGFibGUoKTtmb3IoY29uc3QgYiBvZiB0aGlzLl93YXRjaEtleXMpdGhpcy5fcmVuZGVyTGF0ZXN0KHRoaXMuX3dhdGNoS2V5MkRhdGFbYl0sdGhpcy5fd2F0Y2hLZXkyRXhwYW5kSGFuZGxlcltiXSl9LF90ZW5zb3JEYXRhMldhdGNoS2V5KGIpe3JldHVybiBiLmRldmljZU5hbWUrIi8iK2IudGVuc29yTmFtZSsiOiIrYi5kZWJ1Z09wfSxfcmVuZGVyTGF0ZXN0KGIsZCl7aWYoYil7dmFyIGY9dGhpcy5fdGVuc29yRGF0YTJXYXRjaEtleShiKSxoPW51bGw7IlVuaW5pdGlhbGl6ZWQiIT09Yi5kdHlwZSYmIlVuc3VwcG9ydGVkIiE9PWIuZHR5cGUmJihoPSgpPT5kKGIpKTt2YXIgaz1udWxsIT1iLnZhbHVlP0pTT04uc3RyaW5naWZ5KGIudmFsdWUsKHQsbCk9PmwudG9GaXhlZD9OdW1iZXIobC50b0ZpeGVkKDMpKTpsKToiKENsaWNrIHRvIHZpZXcpIjsKdGhpcy5fd2F0Y2hLZXkyRGF0YVtmXT1iOy0xPT09dGhpcy5fd2F0Y2hLZXlzLmluZGV4T2YoZik/KHRoaXMuX3dhdGNoS2V5cy5wdXNoKGYpLHRoaXMuX3dhdGNoS2V5MkNvdW50W2ZdPTEpOnRoaXMuX3dhdGNoS2V5MkNvdW50W2ZdKz0xO3RoaXMuX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXJbZl09aDt0aGlzLl93YXRjaEtleTJWYWx1ZVNob3J0W2ZdPWs7dGhpcy5fYWN0aXZlV2F0Y2hLZXk9Zjt0aGlzLl9yZW1vdmVBY3RpdmVTdGF0dXNGcm9tQWxsUm93cygpO3RoaXMuX3JlbmRlclJvdyhmKX19LF9jbGVhclRlbnNvckRhdGFUYWJsZSgpe2Zvcihjb25zdCBiIGluIHRoaXMuX3dhdGNoS2V5MlJvdyl0aGlzLl93YXRjaEtleTJSb3cuaGFzT3duUHJvcGVydHkoYikmJih0aGlzLl93YXRjaEtleTJSb3dbYl0ucmVtb3ZlKCksZGVsZXRlIHRoaXMuX3dhdGNoS2V5MlJvd1tiXSl9LF9jbGVhclRlbnNvckRhdGFSb3coYil7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX0sCl9jbGVhckhlYWx0aFBpbGxMZWdlbmQoKXtjb25zdCBiPXRoaXMuJCQoIiNoZWFsdGgtcGlsbC1sZWdlbmQiKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfSxfcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpe3RoaXMuX2NsZWFySGVhbHRoUGlsbExlZ2VuZCgpO2NvbnN0IGI9dGhpcy4kJCgiI2hlYWx0aC1waWxsLWxlZ2VuZCIpO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QudGV4dENvbnRlbnQ9IkxlZ2VuZDoiO2IuYXBwZW5kQ2hpbGQoZCk7ZC5zdHlsZVsibWFyZ2luLXJpZ2h0Il09IjAuNWVtIjtkLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI7Zm9yKGQ9MDtkPHRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzLmxlbmd0aDsrK2Qpe2NvbnN0IGY9dGYuZ3JhcGguc2NlbmUuaGVhbHRoUGlsbEVudHJpZXNbZF0saD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI7Cmguc3R5bGVbIm1hcmdpbi1yaWdodCJdPSIwLjI1ZW0iO2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2sudGV4dENvbnRlbnQ9Ilx1MjVhMCI7ay5zdHlsZS5jb2xvcj1mLmJhY2tncm91bmRfY29sb3I7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7dC50ZXh0Q29udGVudD1mLmxhYmVsO3Quc3R5bGUuY29sb3I9Zi5iYWNrZ3JvdW5kX2NvbG9yO2guYXBwZW5kQ2hpbGQoayk7aC5hcHBlbmRDaGlsZCh0KTtiLmFwcGVuZENoaWxkKGgpfX0sX3JlbW92ZUFjdGl2ZVN0YXR1c0Zyb21BbGxSb3dzKCl7Zm9yKGNvbnN0IGIgaW4gdGhpcy5fd2F0Y2hLZXkyUm93KXtpZighdGhpcy5fd2F0Y2hLZXkyUm93Lmhhc093blByb3BlcnR5KGIpKWNvbnRpbnVlO2NvbnN0IGQ9dGhpcy5fd2F0Y2hLZXkyUm93W2JdO1BvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZS10ZW5zb3IiKTtQb2x5bWVyLmRvbShkKS5jbGFzc0xpc3QucmVtb3ZlKCJoaWdobGlnaHRlZCIpfX0sCl9yZW5kZXJSb3coYil7bGV0IGQsZj0hMTtudWxsIT10aGlzLl93YXRjaEtleTJSb3dbYl0/KGQ9dGhpcy5fd2F0Y2hLZXkyUm93W2JdLHRoaXMuX2NsZWFyVGVuc29yRGF0YVJvdyhkKSxmPSExKTooZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLGY9ITApO2NvbnN0IGg9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5kZXZpY2VOYW1lLGs9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lLHQ9aCsiLyIrazt2YXIgbD10aGlzLl93YXRjaEtleTJDb3VudFtiXSxwPXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0udGVuc29yTmFtZSxtPXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0uZGVidWdPcCxuPXRoaXMuX3dhdGNoS2V5MlZhbHVlU2hvcnRbYl07Y29uc3QgcT10aGlzLl93YXRjaEtleTJFeHBhbmRIYW5kbGVyW2JdLHU9Yj09PXRoaXMuX2FjdGl2ZVdhdGNoS2V5LHg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtQb2x5bWVyLmRvbSh4KS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3ItbmFtZSIpOwp4LnN0eWxlWyJ0ZXh0LWRlY29yYXRpb24iXT0idW5kZXJsaW5lIjt4LnN0eWxlLmN1cnNvcj0icG9pbnRlciI7eC50ZXh0Q29udGVudD1wO3guYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e251bGwhPXRoaXMudGVuc29yTmFtZUNsaWNrZWQmJnRoaXMudGVuc29yTmFtZUNsaWNrZWQoaCxrKX0pO2NvbnN0IEE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtBLnRleHRDb250ZW50PWw7Y29uc3QgeT10aGlzLl93YXRjaEtleTJEYXRhW2JdLmR0eXBlO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtjb25zdCB3PXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0uc2hhcGU7bC50ZXh0Q29udGVudD15O2NvbnN0IEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtDLnRleHRDb250ZW50PUpTT04uc3RyaW5naWZ5KHcpO2NvbnN0IEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtHLnRleHRDb250ZW50PW47UG9seW1lci5kb20oRykuY2xhc3NMaXN0LmFkZCgidmFsdWUtZXhwYW5zaW9uLWxpbmsiKTsKbnVsbCE9cSYmKEcuYWRkRXZlbnRMaXN0ZW5lcigidGFwIixxLCExKSxHLnN0eWxlWyJ0ZXh0LWRlY29yYXRpb24iXT0idW5kZXJsaW5lIixHLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO249bnVsbDtuPXRoaXMuX2hlYWx0aFBpbGxzRW5hYmxlZD90aGlzLl9yZW5kZXJIZWFsdGhQaWxsKHArIjoiK20se2RldmljZV9uYW1lOmgsbm9kZV9uYW1lOmssZHR5cGU6eSxzaGFwZTp3LHZhbHVlOm51bGx9LHEpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7cD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTttLnNldEF0dHJpYnV0ZSgiaWNvbiIsImZvcndhcmQiKTttLnNldEF0dHJpYnV0ZSgidGl0bGUiLCJDb250aW51ZSB0byIpO20uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dGhpcy5jb250aW51ZVRvQ2FsbGJhY2soaCxrKX0pO3AuYXBwZW5kQ2hpbGQobSk7ZC5hcHBlbmRDaGlsZCh4KTsKZC5hcHBlbmRDaGlsZChBKTtkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoQyk7ZC5hcHBlbmRDaGlsZChHKTtkLmFwcGVuZENoaWxkKG4pO2QuYXBwZW5kQ2hpbGQocCk7ZC5zZXRBdHRyaWJ1dGUoIm5vZGVOYW1lV2l0aERldmljZSIsdCk7dSYmKFBvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZS10ZW5zb3IiKSxQb2x5bWVyLmRvbShkKS5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZCIpKTt0aGlzLl93YXRjaEtleTJSb3dbYl09ZDtmJiZQb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGVuc29yLWRhdGEtdGFibGUgdGJvZHkiKSkuYXBwZW5kQ2hpbGQoZCk7ZC5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImVuZCIsaW5saW5lOiJuZWFyZXN0IixiZWhhdmlvdXI6InNtb290aCJ9KX0sX3JlbmRlckhlYWx0aFBpbGwoYixkLGYpe2NvbnN0IGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtQb2x5bWVyLmRvbShoKS5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpOwpudWxsIT1mJiZoLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsZiwhMSk7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGYuZ3JhcGguc2NlbmUuU1ZHX05BTUVTUEFDRSwic3ZnIik7Zi5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLl9oZWFsdGhQaWxsV2lkdGgpO2Yuc2V0QXR0cmlidXRlKCJoZWlnaHQiLHRoaXMuX2hlYWx0aFBpbGxIZWlnaHQpO2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRmLmdyYXBoLnNjZW5lLlNWR19OQU1FU1BBQ0UsImciKTtmLmFwcGVuZENoaWxkKGspO2guYXBwZW5kQ2hpbGQoZik7Y29uc3QgdD0idGRwLyIrYjt0aGlzLmdldEhlYWx0aFBpbGwoYixkLmRldmljZV9uYW1lLGQubm9kZV9uYW1lLGw9PntudWxsPT1sPyhoLnRleHRDb250ZW50PSJOL0EiLGguc3R5bGUuY29sb3I9ImdyYXkiKTooZC52YWx1ZT1sLHRmLmdyYXBoLnNjZW5lLmFkZEhlYWx0aFBpbGwoayxkLG51bGwsdCx0aGlzLl9oZWFsdGhQaWxsV2lkdGgsdGhpcy5faGVhbHRoUGlsbEhlaWdodC8KMix0aGlzLl9oZWFsdGhQaWxsSGVpZ2h0LzIsMCkpfSk7cmV0dXJuIGh9LF9oaWdobGlnaHQoYil7UG9seW1lci5kb20odGhpcy4kJCgiI3RlbnNvci1kYXRhLXRhYmxlIikpO2NvbnN0IGQ9W107Zm9yKGNvbnN0IGYgaW4gdGhpcy5fd2F0Y2hLZXkyUm93KXtpZighdGhpcy5fd2F0Y2hLZXkyUm93Lmhhc093blByb3BlcnR5KGYpKWNvbnRpbnVlO2NvbnN0IGg9dGhpcy5fd2F0Y2hLZXkyUm93W2ZdO251bGwhPWguZ2V0QXR0cmlidXRlJiYoaC5nZXRBdHRyaWJ1dGUoIm5vZGVOYW1lV2l0aERldmljZSIpPT09Yj9kLnB1c2goaCk6UG9seW1lci5kb20oaCkuY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQiKSl9aWYobnVsbCE9Yilmb3IoYj0wO2I8ZC5sZW5ndGg7KytiKVBvbHltZXIuZG9tKGRbYl0pLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodGVkIiksZFtiXS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImVuZCIsaW5saW5lOiJuZWFyZXN0IixiZWhhdmlvdXI6InNtb290aCJ9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90ZW5zb3Itd2lkZ2V0L3RlbnNvcl93aWRnZXRfYmluYXJ5LmpzCnZhciBXaT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGQsZil7Yj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oaCxrKXtoLl9fcHJvdG9fXz1rfXx8ZnVuY3Rpb24oaCxrKXtmb3IodmFyIHQgaW4gaylrLmhhc093blByb3BlcnR5KHQpJiYoaFt0XT1rW3RdKX07cmV0dXJuIGIoZCxmKX1yZXR1cm4gZnVuY3Rpb24oZCxmKXtmdW5jdGlvbiBoKCl7dGhpcy5jb25zdHJ1Y3Rvcj1kfWIoZCxmKTtkLnByb3RvdHlwZT1udWxsPT09Zj9PYmplY3QuY3JlYXRlKGYpOihoLnByb3RvdHlwZT1mLnByb3RvdHlwZSxuZXcgaCl9fSgpLFhpPXRoaXMmJnRoaXMuX19nZW5lcmF0b3J8fGZ1bmN0aW9uKGIsZCl7ZnVuY3Rpb24gZihuKXtyZXR1cm4gZnVuY3Rpb24ocSl7cmV0dXJuIGgoW24scV0pfX1mdW5jdGlvbiBoKG4pe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpOwpmb3IoO2s7KXRyeXtpZih0PTEsbCYmKHA9blswXSYyP2xbInJldHVybiJdOm5bMF0/bFsidGhyb3ciXXx8KChwPWxbInJldHVybiJdKSYmcC5jYWxsKGwpLDApOmwubmV4dCkmJiEocD1wLmNhbGwobCxuWzFdKSkuZG9uZSlyZXR1cm4gcDtpZihsPTAscCluPVtuWzBdJjIscC52YWx1ZV07c3dpdGNoKG5bMF0pe2Nhc2UgMDpjYXNlIDE6cD1uO2JyZWFrO2Nhc2UgNDpyZXR1cm4gay5sYWJlbCsrLHt2YWx1ZTpuWzFdLGRvbmU6ITF9O2Nhc2UgNTprLmxhYmVsKys7bD1uWzFdO249WzBdO2NvbnRpbnVlO2Nhc2UgNzpuPWsub3BzLnBvcCgpO2sudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEocD1rLnRyeXMscD0wPHAubGVuZ3RoJiZwW3AubGVuZ3RoLTFdKSYmKDY9PT1uWzBdfHwyPT09blswXSkpe2s9MDtjb250aW51ZX1pZigzPT09blswXSYmKCFwfHxuWzFdPnBbMF0mJm5bMV08cFszXSkpay5sYWJlbD1uWzFdO2Vsc2UgaWYoNj09PW5bMF0mJmsubGFiZWw8cFsxXSlrLmxhYmVsPQpwWzFdLHA9bjtlbHNlIGlmKHAmJmsubGFiZWw8cFsyXSlrLmxhYmVsPXBbMl0say5vcHMucHVzaChuKTtlbHNle3BbMl0mJmsub3BzLnBvcCgpO2sudHJ5cy5wb3AoKTtjb250aW51ZX19bj1kLmNhbGwoYixrKX1jYXRjaChxKXtuPVs2LHFdLGw9MH1maW5hbGx5e3Q9cD0wfWlmKG5bMF0mNSl0aHJvdyBuWzFdO3JldHVybnt2YWx1ZTpuWzBdP25bMV06dm9pZCAwLGRvbmU6ITB9fXZhciBrPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZihwWzBdJjEpdGhyb3cgcFsxXTtyZXR1cm4gcFsxXX0sdHJ5czpbXSxvcHM6W119LHQsbCxwLG07cmV0dXJuIG09e25leHQ6ZigwKSwidGhyb3ciOmYoMSksInJldHVybiI6ZigyKX0sImZ1bmN0aW9uIj09PXR5cGVvZiBTeW1ib2wmJihtW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLG19LFlpPXRoaXMmJnRoaXMuX19yZWFkfHxmdW5jdGlvbihiLGQpe3ZhciBmPSJmdW5jdGlvbiI9PT10eXBlb2YgU3ltYm9sJiZiW1N5bWJvbC5pdGVyYXRvcl07CmlmKCFmKXJldHVybiBiO2I9Zi5jYWxsKGIpO3ZhciBoLGs9W107dHJ5e2Zvcig7KHZvaWQgMD09PWR8fDA8ZC0tKSYmIShoPWIubmV4dCgpKS5kb25lOylrLnB1c2goaC52YWx1ZSl9Y2F0Y2gobCl7dmFyIHQ9e2Vycm9yOmx9fWZpbmFsbHl7dHJ5e2gmJiFoLmRvbmUmJihmPWJbInJldHVybiJdKSYmZi5jYWxsKGIpfWZpbmFsbHl7aWYodCl0aHJvdyB0LmVycm9yO319cmV0dXJuIGt9OwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKEgsSyxNLEwpe3JldHVybiBuZXcgKE18fChNPVByb21pc2UpKShmdW5jdGlvbihRLFQpe2Z1bmN0aW9uIFgoWil7dHJ5e2xhKEwubmV4dChaKSl9Y2F0Y2goYmEpe1QoYmEpfX1mdW5jdGlvbiBhYShaKXt0cnl7bGEoTFsidGhyb3ciXShaKSl9Y2F0Y2goYmEpe1QoYmEpfX1mdW5jdGlvbiBsYShaKXtaLmRvbmU/UShaLnZhbHVlKToobmV3IE0oZnVuY3Rpb24oYmEpe2JhKFoudmFsdWUpfSkpLnRoZW4oWCxhYSl9bGEoKEw9TC5hcHBseShILEt8fFtdKSkubmV4dCgpKX0pfWZ1bmN0aW9uIGQoSCl7cmV0dXJuIG51bGwhPT1ILm1hdGNoKC9eaW50WzAtOV0rJC8pfHxudWxsIT09SC5tYXRjaCgvXnVpbnRbMC05XSskLyl9ZnVuY3Rpb24gZihIKXtyZXR1cm4gbnVsbCE9PUgubWF0Y2goL15mbG9hdFswLTldKyQvKXx8bnVsbCE9PUgubWF0Y2goL15iZmxvYXRbMC05XSskLyl9ZnVuY3Rpb24gaChIKXtyZXR1cm4iYm9vbCI9PT1ILnRvTG93ZXJDYXNlKCl8fAoiYm9vbGVhbiI9PT1ILnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gayhIKXtyZXR1cm4ic3RyIj09PUgudG9Mb3dlckNhc2UoKXx8InN0cmluZyI9PT1ILnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gdChIKXt2YXIgSz0xO0guZm9yRWFjaChmdW5jdGlvbihNKXtLKj1NfSk7cmV0dXJuIEt9ZnVuY3Rpb24gbChIKXtyZXR1cm4gMD09PUgubGVuZ3RoPyJzY2FsYXIiOiJbIitIKyJdIn1mdW5jdGlvbiBwKEgpe3ZhciBLPXtzbGljaW5nRGltc0FuZEluZGljZXM6W10sdmlld2luZ0RpbXM6W10sdmVydGljYWxSYW5nZTpudWxsLGhvcml6b250YWxSYW5nZTpudWxsfSxNPUgubGVuZ3RoO2lmKDE9PT1NKUsudmlld2luZ0RpbXM9WzBdO2Vsc2UgaWYoMTxNKXtpZigyPE0pZm9yKHZhciBMPTA7TDxNLTI7KytMKUsuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLnB1c2goe2RpbTpMLGluZGV4OjA9PT1IW0xdP251bGw6MH0pO2ZvcihMPUgubGVuZ3RoLTI7TDxILmxlbmd0aDsrK0wpSy52aWV3aW5nRGltcy5wdXNoKEwpfXJldHVybiBLfQpmdW5jdGlvbiBtKEgsSyl7aWYoSC52aWV3aW5nRGltc1swXSE9PUsudmlld2luZ0RpbXNbMF18fEgudmlld2luZ0RpbXNbMV0hPT1LLnZpZXdpbmdEaW1zWzFdKXJldHVybiExO0s9SC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLmRpbX0pO0suc29ydCgpO0g9SC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLmRpbX0pO0guc29ydCgpO3JldHVybiBKU09OLnN0cmluZ2lmeShLKT09PUpTT04uc3RyaW5naWZ5KEgpfWZ1bmN0aW9uIG4oSCl7cmV0dXJuIDIwPj1ILmxlbmd0aD9IOkguc2xpY2UoMCwxMCkrIi4uLiIrSC5zbGljZShILmxlbmd0aC03LEgubGVuZ3RoKX1mdW5jdGlvbiBxKEgsSyxNLEwpe3ZvaWQgMD09PU0mJihNPTIpO2lmKGlzTmFOKEgpKXJldHVybiJOYU4iO2lmKC1JbmZpbml0eT09PUgpcmV0dXJuIi1cdTIyMWUiO2lmKEluZmluaXR5PT09SClyZXR1cm4iK1x1MjIxZSI7bnVsbD09TCYmKEw9Ck1hdGguYWJzKEgpLEw9MUUzPkwmJi4wMTw9THx8MD09PUw/ImZpeGVkIjoiZXhwb25lbnRpYWwiKTtyZXR1cm4gbnVsbD09THx8ImZpeGVkIj09PUw/Sz8iIitIOkgudG9GaXhlZChNKTpILnRvRXhwb25lbnRpYWwoTSl9ZnVuY3Rpb24gdShILEspe3ZvaWQgMD09PUsmJihLPSEwKTtyZXR1cm4gSD9LPyJUIjoiVHJ1ZSI6Sz8iRiI6IkZhbHNlIn1mdW5jdGlvbiB4KEgsSyl7dm9pZCAwPT09SyYmKEs9NCk7cmV0dXJuIG51bGw9PT1LfHxILmxlbmd0aDw9Sz9IOkguc2xpY2UoMCxLLTEpKyJcdTIwMjYifXZhciBBPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLKXt0aGlzLmlzU2hvd249ITE7dGhpcy5ibHVySGlkZUZ1bmN0aW9uPW51bGw7dGhpcy5kcm9wZG93bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIik7dGhpcy5kcm9wZG93bi5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO3RoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0KIm5vbmUiO0suYXBwZW5kQ2hpbGQodGhpcy5kcm9wZG93bil9SC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbihLLE0sTCl7dmFyIFE9dGhpcztMLmZvckVhY2goZnVuY3Rpb24oWCl7dmFyIGFhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2FhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSIpO2FhLnRleHRDb250ZW50PVguY2FwdGlvbjtRLmRyb3Bkb3duLmFwcGVuZENoaWxkKGFhKTtYLmRpc2FibGVkP2FhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCIpOihhYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24obGEpe2xhLnN0b3BQcm9wYWdhdGlvbigpO1EuZHJvcGRvd24uY2xpY2soKTtpZihudWxsIT09WC5vbkNsaWNrKVgub25DbGljayhsYSk7US5oaWRlKCl9KSxhYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbihsYSl7aWYobnVsbCE9PQpYLm9uSG92ZXIpWC5vbkhvdmVyKGxhKTthYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tYWN0aXZlIil9KSxhYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe2FhLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtpZihudWxsIT09WC5vbkhvdmVyKXtmb3IodmFyIGxhPVtdLFo9MDtaPGFhLmNoaWxkcmVuLmxlbmd0aDsrK1ope3ZhciBiYT1hYS5jaGlsZHJlbltaXTtiYS5jbGFzc0xpc3QuY29udGFpbnMoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIikmJmxhLnB1c2goYmEpfWxhLmZvckVhY2goZnVuY3Rpb24oZWEpe3JldHVybiBhYS5yZW1vdmVDaGlsZChlYSl9KX19KSl9KTt0aGlzLmRyb3Bkb3duLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt0aGlzLmRyb3Bkb3duLnN0eWxlLnRvcD1LKyJweCI7dGhpcy5kcm9wZG93bi5zdHlsZS5sZWZ0PQpNKyJweCI7TD10aGlzLmRyb3Bkb3duLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBUPUwubGVmdC1NO3RoaXMuZHJvcGRvd24uc3R5bGUudG9wPShLLShMLnRvcC1LKSkudG9GaXhlZCgxKSsicHgiO3RoaXMuZHJvcGRvd24uc3R5bGUubGVmdD0oTS1UKS50b0ZpeGVkKDEpKyJweCI7dGhpcy5pc1Nob3duPSEwO3RoaXMuYmx1ckhpZGVGdW5jdGlvbj1mdW5jdGlvbigpe1EuaGlkZSgpfTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsUS5ibHVySGlkZUZ1bmN0aW9uKX0sNTApfTtILnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7Zm9yKHRoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kcm9wZG93bi5maXJzdENoaWxkOyl0aGlzLmRyb3Bkb3duLnJlbW92ZUNoaWxkKHRoaXMuZHJvcGRvd24uZmlyc3RDaGlsZCk7dGhpcy5pc1Nob3duPSExO251bGwhPXRoaXMuYmx1ckhpZGVGdW5jdGlvbiYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5ibHVySGlkZUZ1bmN0aW9uKX07SC5wcm90b3R5cGUuc2hvd249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1Nob3dufTtyZXR1cm4gSH0oKSx5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLLE0pe3ZhciBMPXRoaXM7dGhpcy5jb25maWc9Szt0aGlzLnBhcmVudEVsZW1lbnQ9TTt0aGlzLmJhc2VGbGF0TWVudT1uZXcgQSh0aGlzLnBhcmVudEVsZW1lbnQpO3RoaXMuY3VycmVudENob2ljZVNlbGVjdGlvbnM9e307dGhpcy5jb25maWcuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihRLFQpe251bGwhPVEub3B0aW9ucyYmKEwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbVF09US5kZWZhdWx0U2VsZWN0aW9uKX0pfUgucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oSyxNKXt2YXIgTD10aGlzLFE9W107dGhpcy5jb25maWcuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihULFgpe3ZhciBhYT17Y2FwdGlvbjpULmNhcHRpb24sb25DbGljazpudWxsLG9uSG92ZXI6bnVsbH07aWYobnVsbCE9VC5vcHRpb25zKXt2YXIgbGE9CkwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbWF07YWEub25Ib3Zlcj1mdW5jdGlvbihaKXt2YXIgYmE9Wi50YXJnZXQsZWE9W107VC5vcHRpb25zLmZvckVhY2goZnVuY3Rpb24oY2Esa2Epe2VhLnB1c2goe2NhcHRpb246a2E9PT1sYT9jYSsiIChcdTI3MTMpIjpjYSxvbkNsaWNrOmZ1bmN0aW9uKCl7bGEhPT1rYSYmKEwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbWF09a2EsVC5jYWxsYmFjayhrYSkpfSxvbkhvdmVyOm51bGx9KX0pO1o9bmV3IEEoYmEpO2JhPWJhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1ouc2hvdyhiYS50b3AsYmEucmlnaHQsZWEpfX1lbHNlIGFhLm9uQ2xpY2s9VC5jYWxsYmFjaztudWxsPT1ULmlzRW5hYmxlZHx8VC5pc0VuYWJsZWQoKXx8KGFhLmRpc2FibGVkPSEwKTtRLnB1c2goYWEpfSk7dGhpcy5iYXNlRmxhdE1lbnUuc2hvdyhLLE0sUSl9O0gucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmJhc2VGbGF0TWVudS5oaWRlKCl9O0gucHJvdG90eXBlLnNob3duPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJhc2VGbGF0TWVudS5zaG93bigpfTtyZXR1cm4gSH0oKSx3OyhmdW5jdGlvbihIKXtIW0guVVA9MV09IlVQIjtIW0guRE9XTj0yXT0iRE9XTiI7SFtILkxFRlQ9M109IkxFRlQiO0hbSC5SSUdIVD00XT0iUklHSFQifSkod3x8KHc9e30pKTt2YXIgQz1mdW5jdGlvbigpe2Z1bmN0aW9uIEgoSyxNLEwsUSxULFgpe3RoaXMuc2hhcGU9Szt0aGlzLnNsaWNlRGltcz1bXTt0aGlzLnNsaWNlSW5kaWNlcz1bXTtpZigwPT09dCh0aGlzLnNoYXBlKSl0aHJvdyBFcnJvcigiVGVuc29yRWxlbWVudFNlbGVjdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGVuc29yIHdpdGggemVybyBlbGVtZW50cy4iKTtmb3IoSz0wO0s8TS5zbGljaW5nRGltc0FuZEluZGljZXMubGVuZ3RoOysrSyl7dGhpcy5zbGljZURpbXMucHVzaChNLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tLXS5kaW0pO3ZhciBhYT1NLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tLXS5pbmRleDtpZihudWxsPT09CmFhKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIFRlbnNvckVsZW1lbnRTZWxlY3Rpb24gZHVlIHRvIHVuZGV0ZXJtaW5lZCBzbGljaW5nIGluZGV4IGF0IGRpbWVuc2lvbiAiK0spO3RoaXMuc2xpY2VJbmRpY2VzLnB1c2goYWEpfXRoaXMucmFuaz10aGlzLnNoYXBlLmxlbmd0aDtpZigwPHRoaXMucmFuayYmdGhpcy5zbGljZURpbXMubGVuZ3RoPj10aGlzLnJhbmspdGhyb3cgRXJyb3IoIkV4cGVjdGVkIHNsaWNlRGltcyB0byBoYXZlIGEgbGVuZ3RoIGxlc3MgdGhhbiByYW5rICIrdGhpcy5yYW5rKyIsIGJ1dCBnb3QgbGVuZ3RoICIrdGhpcy5zbGljZURpbXMubGVuZ3RoKTt0aGlzLnZpZXdEaW1zPVtdO2ZvcihLPTA7Szx0aGlzLnJhbms7KytLKS0xPT09dGhpcy5zbGljZURpbXMuaW5kZXhPZihLKSYmdGhpcy52aWV3RGltcy5wdXNoKEspO2lmKDI8dGhpcy52aWV3RGltcy5sZW5ndGgpdGhyb3cgRXJyb3IoIk9ubHkgc2VsZWN0aW9ucyBpbiAxRCBhbmQgMkQgYXJlIHN1cHBvcnRlZC4iKTsKdGhpcy5yb3dTdGFydD1udWxsPT1MPzA6TDt0aGlzLmNvbFN0YXJ0PW51bGw9PVE/MDpRO3RoaXMucm93Q291bnQ9bnVsbD09VD8xOlQ7dGhpcy5jb2xDb3VudD1udWxsPT1YPzE6WH1ILnByb3RvdHlwZS5nZXRFbGVtZW50U3RhdHVzPWZ1bmN0aW9uKEspe2lmKEsubGVuZ3RoIT09dGhpcy5yYW5rKXRocm93IEVycm9yKCJFeHBlY3RlZCBpbmRpY2VzIHRvIGhhdmUgYSByYW5rIG9mICIrdGhpcy5yYW5rKyIsIGJ1dCBnb3QgIisoSy5sZW5ndGgrIiAoWyIrSysiXSkiKSk7Zm9yKHZhciBNPTA7TTxLLmxlbmd0aDsrK00paWYoLTEhPT10aGlzLnNsaWNlRGltcy5pbmRleE9mKE0pJiZLW01dIT09dGhpcy5zbGljZUluZGljZXNbdGhpcy5zbGljZURpbXMuaW5kZXhPZihNKV0pcmV0dXJuIG51bGw7TT1udWxsO3ZhciBMPXRoaXMucm93U3RhcnQrdGhpcy5yb3dDb3VudCxRPXRoaXMuY29sU3RhcnQrdGhpcy5jb2xDb3VudDtpZigwPT09dGhpcy52aWV3RGltcy5sZW5ndGgpMD09PUsubGVuZ3RoJiYKKE09e3RvcEVkZ2U6ITAsYm90dG9tRWRnZTohMCxsZWZ0RWRnZTohMCxyaWdodEVkZ2U6ITB9KTtlbHNlIGlmKDE9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCl7dmFyIFQ9dGhpcy52aWV3RGltc1swXTtLW1RdPj10aGlzLnJvd1N0YXJ0JiZLW1RdPEwmJihNPXt0b3BFZGdlOktbVF09PT10aGlzLnJvd1N0YXJ0LGJvdHRvbUVkZ2U6S1tUXT09PUwtMSxsZWZ0RWRnZTohMCxyaWdodEVkZ2U6ITB9KX1lbHNlIGlmKDI9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCl7VD10aGlzLnZpZXdEaW1zWzBdO3ZhciBYPXRoaXMudmlld0RpbXNbMV07S1tUXT49dGhpcy5yb3dTdGFydCYmS1tUXTxMJiZLW1hdPj10aGlzLmNvbFN0YXJ0JiZLW1hdPFEmJihNPXt0b3BFZGdlOktbVF09PT10aGlzLnJvd1N0YXJ0LGJvdHRvbUVkZ2U6S1tUXT09PUwtMSxsZWZ0RWRnZTpLW1hdPT09dGhpcy5jb2xTdGFydCxyaWdodEVkZ2U6S1tYXT09PVEtMX0pfWVsc2UgdGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgbGVuZ3RoIG9mIHZpZXdEaW1zOiAiKwp0aGlzLnZpZXdEaW1zKTtyZXR1cm4gTX07SC5wcm90b3R5cGUubW92ZT1mdW5jdGlvbihLLE0pe3ZhciBMPW51bGw7aWYoMD09PXRoaXMucmFua3x8MT09PXRoaXMucmFuayYmKEs9PT13LkxFRlR8fEs9PT13LlJJR0hUKSlyZXR1cm4gbnVsbDtpZihudWxsPT09TS52ZXJ0aWNhbFJhbmdlfHxudWxsPT09TS52ZXJ0aWNhbFJhbmdlWzFdKXRocm93IEVycm9yKCJGYWlsZWQgdG8gbW92ZSBkdWUgdG8gdW5kZXRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpO0s9PT13LlVQPzA8dGhpcy5yb3dTdGFydCYmKHRoaXMucm93U3RhcnQtLSxudWxsIT1NLnZlcnRpY2FsUmFuZ2UmJnRoaXMucm93U3RhcnQ8TS52ZXJ0aWNhbFJhbmdlWzBdJiYoTD13LlVQKSk6Sz09PXcuRE9XTj9udWxsIT1NLnZpZXdpbmdEaW1zJiZudWxsIT1NLnZpZXdpbmdEaW1zWzBdJiZ0aGlzLnJvd1N0YXJ0PHRoaXMuc2hhcGVbTS52aWV3aW5nRGltc1swXV0tMSYmKHRoaXMucm93U3RhcnQrKyxudWxsIT1NLnZlcnRpY2FsUmFuZ2UmJgp0aGlzLnJvd1N0YXJ0Pj1NLnZlcnRpY2FsUmFuZ2VbMV0mJihMPXcuRE9XTikpOks9PT13LkxFRlQ/MDx0aGlzLmNvbFN0YXJ0JiYodGhpcy5jb2xTdGFydC0tLG51bGwhPU0uaG9yaXpvbnRhbFJhbmdlJiZ0aGlzLmNvbFN0YXJ0PE0uaG9yaXpvbnRhbFJhbmdlWzBdJiYoTD13LkxFRlQpKTpLPT09dy5SSUdIVCYmbnVsbCE9TS52aWV3aW5nRGltcyYmbnVsbCE9TS52aWV3aW5nRGltc1sxXSYmdGhpcy5jb2xTdGFydDx0aGlzLnNoYXBlW00udmlld2luZ0RpbXNbMV1dLTEmJih0aGlzLmNvbFN0YXJ0KyssbnVsbCE9TS5ob3Jpem9udGFsUmFuZ2UmJnRoaXMuY29sU3RhcnQ+PU0uaG9yaXpvbnRhbFJhbmdlWzFdJiYoTD13LlJJR0hUKSk7dGhpcy5jb2xDb3VudD10aGlzLnJvd0NvdW50PTE7cmV0dXJuIEx9O0gucHJvdG90eXBlLmdldFJvd1N0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm93U3RhcnR9O0gucHJvdG90eXBlLmdldFJvd0NvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm93Q291bnR9OwpILnByb3RvdHlwZS5nZXRDb2xTdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbFN0YXJ0fTtILnByb3RvdHlwZS5nZXRDb2xDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbENvdW50fTtyZXR1cm4gSH0oKSxHPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLLE0sTCl7dm9pZCAwPT09TCYmKEw9ZnVuY3Rpb24oKXt9KTt0aGlzLnJvb3REaXY9Szt0aGlzLnNoYXBlPU07dGhpcy5vblNsaWNpbmdTcGVjQ2hhbmdlPUw7dGhpcy5kaW1Db250cm9scz1bXTt0aGlzLmRpbUlucHV0cz1bXTt0aGlzLmNvbW1hcz1bXTt0aGlzLmRyb3Bkb3ducz1bXTt0aGlzLmJyYWNrZXREaXZzPVtudWxsLG51bGxdO3RoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkPVtdO3RoaXMucmFuaz10aGlzLnNoYXBlLmxlbmd0aDtpZigzPnRoaXMucmFuayl0aHJvdyBFcnJvcigiRGltZW5zaW9uIGNvbnRyb2wgaXMgbm90IGFwcGxpY2FibGUgdG8gdGVuc29yIHNoYXBlcyBsZXNzIHRoYW4gM0Q6IHJlY2VpdmVkICIrCih0aGlzLnJhbmsrIkQgdGVuc29yIHNoYXBlOiAiKSsoSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFwZSkrIi4iKSk7dGhpcy5jcmVhdGVDb21wb25lbnRzKCk7dGhpcy5zbGljaW5nU3BlYz1wKE0pfUgucHJvdG90eXBlLmNyZWF0ZUNvbXBvbmVudHM9ZnVuY3Rpb24oKXtmb3IodmFyIEs9dGhpczt0aGlzLnJvb3REaXYuZmlyc3RDaGlsZDspdGhpcy5yb290RGl2LnJlbW92ZUNoaWxkKHRoaXMucm9vdERpdi5maXJzdENoaWxkKTt0aGlzLmRpbUNvbnRyb2xzPVtdO3RoaXMuZGltSW5wdXRzPVtdO3RoaXMuY29tbWFzPVtdO3RoaXMuZHJvcGRvd25zPVtdO3RoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkPVtdO3RoaXMuYnJhY2tldERpdnNbMF09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5icmFja2V0RGl2c1swXS50ZXh0Q29udGVudD0iU2xpY2luZzogWyI7dGhpcy5icmFja2V0RGl2c1swXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyIpOwp0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQodGhpcy5icmFja2V0RGl2c1swXSk7Zm9yKHZhciBNPTA7TTx0aGlzLnJhbms7KytNKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7TC50aXRsZT0iRGltZW5zaW9uICIrTSsiOiBzaXplXHgzZCIrdGhpcy5zaGFwZVtNXTt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoTCk7dGhpcy5kaW1Db250cm9scy5wdXNoKEwpO3RoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkLnB1c2goITEpO0w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7TC5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoTCk7dGhpcy5kaW1JbnB1dHMucHVzaChMKTtNPHRoaXMucmFuay0xJiYoTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWNvbW1hIiksCkwudGV4dENvbnRlbnQ9IiwiLHRoaXMucm9vdERpdi5hcHBlbmRDaGlsZChMKSx0aGlzLmNvbW1hcy5wdXNoKEwpKTtMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0wuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24iKTtMLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZChMKTt0aGlzLmRyb3Bkb3ducy5wdXNoKEwpfXRoaXMuYnJhY2tldERpdnNbMV09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5icmFja2V0RGl2c1sxXS50ZXh0Q29udGVudD0iXSI7dGhpcy5icmFja2V0RGl2c1sxXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyIpO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZCh0aGlzLmJyYWNrZXREaXZzWzFdKTt0aGlzLnJvb3REaXYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtLLmNsZWFyQWxsRHJvcGRvd25zKCl9KX07SC5wcm90b3R5cGUucmVuZGVyPQpmdW5jdGlvbihLKXtmdW5jdGlvbiBNKGFhKXt2YXIgbGE9WC5kaW1Db250cm9sc1thYV0sWj1YLmRpbUlucHV0c1thYV0sYmE9WC5kcm9wZG93bnNbYWFdO2lmKCJub25lIiE9PVouc3R5bGUuZGlzcGxheSlyZXR1cm4iY29udGludWUiO3ZhciBlYT1YLnNoYXBlW2FhXTtpZigtMSE9PVEuaW5kZXhPZihhYSkpe3ZhciBjYT1UW1EuaW5kZXhPZihhYSldO2xhLnRleHRDb250ZW50PVN0cmluZyhjYSk7Wi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO1oudHlwZT0ibnVtYmVyIjtaLm1pbj0iMCI7Wi5tYXg9U3RyaW5nKGVhLTEpO1oudmFsdWU9U3RyaW5nKGNhKTtYLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFthYV18fChsYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtMLmNsZWFyQWxsRHJvcGRvd25zKCk7bGEuc3R5bGUuZGlzcGxheT0ibm9uZSI7Wi5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2sifSksWi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLApmdW5jdGlvbigpe2lmKG51bGw9PT1MLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgY2hhbmdlIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzcGVjLiIpO3ZhciBrYT1wYXJzZUludChaLnZhbHVlLDEwKTshaXNGaW5pdGUoa2EpfHwwPmthfHxrYT49ZWF8fE1hdGguZmxvb3IoZWEpIT1lYT9aLnZhbHVlPVN0cmluZyhMLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tRLmluZGV4T2YoYWEpXS5pbmRleCk6KEwuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzW1EuaW5kZXhPZihhYSldLmluZGV4PWthLGxhLnRleHRDb250ZW50PVN0cmluZyhrYSksTC5vblNsaWNpbmdTcGVjQ2hhbmdlKEwuc2xpY2luZ1NwZWMpKX0pLFouYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsZnVuY3Rpb24oKXtaLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2xhLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayJ9KSxYLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFthYV09CiEwKX1lbHNle2lmKFguc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1hYSl7aWYobnVsbD09PVguc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZS4iKTtsYS50ZXh0Q29udGVudD0iXHUyMTk1ICIrWC5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdKyI6IitYLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV19ZWxzZXtpZihudWxsPT09WC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZS4iKTtsYS50ZXh0Q29udGVudD0iXHUyMTk0ICIrWC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0rIjoiK1guc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdfWxhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7WC5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbYWFdfHwobGEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGthPQpsYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtMLnJlbmRlckRyb3Bkb3duTWVudUl0ZW1zKGJhLGthLmJvdHRvbSxrYS5sZWZ0LGFhKX0pLFguZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkW2FhXT0hMCl9fXZhciBMPXRoaXM7bnVsbCE9SyYmKHRoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShLKSkpO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgcmVuZGVyaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzbGljaW5nIHNwZWMuIik7dmFyIFE9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKGFhKXtyZXR1cm4gYWEuZGltfSksVD10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oYWEpe3JldHVybiBhYS5pbmRleH0pLFg9dGhpcztmb3IoSz0wO0s8dGhpcy5yYW5rOysrSylNKEspfTtILnByb3RvdHlwZS5yZW5kZXJEcm9wZG93bk1lbnVJdGVtcz0KZnVuY3Rpb24oSyxNLEwsUSl7ZnVuY3Rpb24gVChlYSl7aWYoLTE9PT1hYS5pbmRleE9mKGVhKXx8UT09PWxhLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdJiZlYTw9bGEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF18fFE9PWxhLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdJiZlYT49bGEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV0pcmV0dXJuImNvbnRpbnVlIjt2YXIgY2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Y2EuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtIik7Y2EudGV4dENvbnRlbnQ9IlN3YXAgd2l0aCBkaW1lbnNpb24gIitlYTtLLmFwcGVuZENoaWxkKGNhKTtjYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe2NhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtYLmRpbUNvbnRyb2xzW2VhXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCIpfSk7CmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7Y2EuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpO1guZGltQ29udHJvbHNbZWFdLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIil9KTt2YXIga2E9bGEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1RO2NhLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2lmKG51bGw9PT1YLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJEaW1lbnNpb24gc3dhcHBpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHNsaWNpbmcgc3BlYyIpO3ZhciBZPWFhLmluZGV4T2YoZWEpO1guc2xpY2luZ1NwZWMudmlld2luZ0RpbXNba2E/MDoxXT1lYTtYLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tZXT17ZGltOlEsaW5kZXg6MH07WC5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlPW51bGw7WC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2U9Cm51bGw7aWYoWC5vblNsaWNpbmdTcGVjQ2hhbmdlKVgub25TbGljaW5nU3BlY0NoYW5nZShYLnNsaWNpbmdTcGVjKX0pfXZhciBYPXRoaXM7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIlNsaWNpbmcgY29udHJvbCBjYW5ub3QgcmVuZGVyIGRyb3Bkb3duIG1lbnUgaXRlbXMgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjLiIpO3RoaXMuY2xlYXJBbGxEcm9wZG93bnMoKTtmb3IodmFyIGFhPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihlYSl7cmV0dXJuIGVhLmRpbX0pLGxhPXRoaXMsWj0wO1o8dGhpcy5yYW5rOysrWilUKFopO0suYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtLLnN0eWxlLmRpc3BsYXk9Im5vbmUifSk7aWYoSy5maXJzdENoaWxkKXtLLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Sy5zdHlsZS50b3A9TSsicHgiO0suc3R5bGUubGVmdD1MKyJweCI7Sy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siO1o9Sy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgYmE9Wi5sZWZ0LUw7Sy5zdHlsZS50b3A9KE0tKFoudG9wLU0pKS50b0ZpeGVkKDEpKyJweCI7Sy5zdHlsZS5sZWZ0PShMLWJhKS50b0ZpeGVkKDEpKyJweCJ9fTtILnByb3RvdHlwZS5zZXRTbGljaW5nU3BlYz1mdW5jdGlvbihLKXt0aGlzLnNsaWNpbmdTcGVjPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoSykpO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJDYW5ub3Qgc2V0IHNsaWNpbmcgc3BlYyB0byBudWxsLiIpO3RoaXMucmVuZGVyKHRoaXMuc2xpY2luZ1NwZWMpfTtILnByb3RvdHlwZS5jbGVhckFsbERyb3Bkb3ducz1mdW5jdGlvbigpe3RoaXMuZHJvcGRvd25zLmZvckVhY2goZnVuY3Rpb24oSyl7aWYobnVsbCE9Syl7Zm9yKDtLLmZpcnN0Q2hpbGQ7KUsucmVtb3ZlQ2hpbGQoSy5maXJzdENoaWxkKTtLLnN0eWxlLmRpc3BsYXk9Im5vbmUifX0pfTtyZXR1cm4gSH0oKSxEPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLKXt0aGlzLmNvbmZpZz0KSztpZighaXNGaW5pdGUoSy5taW4pKXRocm93IEVycm9yKCJtaW4gdmFsdWUgKCIrSy5taW4rIikgaXMgbm90IGZpbml0ZSIpO2lmKCFpc0Zpbml0ZShLLm1heCkpdGhyb3cgRXJyb3IoIm1heCB2YWx1ZSAoIitLLm1heCsiKSBpcyBub3QgZmluaXRlIik7aWYoSy5tYXg8Sy5taW4pdGhyb3cgRXJyb3IoIm1heCAoIitLLm1heCsiKSBpcyBceDNjIG1pbiAoIitLLm1pbisiKSIpO31ILnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oSyxNKXtpZih0aGlzLmNvbmZpZy5taW4hPT10aGlzLmNvbmZpZy5tYXgpe3ZhciBMPUsuZ2V0Q29udGV4dCgiMmQiKTtpZihudWxsIT1MKXtmb3IodmFyIFE9Sy53aWR0aC8xMDAsVD1LLmhlaWdodCxYPS42KlQsYWE9MDsxMDA+YWE7KythYSl7dmFyIGxhPVEqYWEsWj0uMipULGJhPVlpKHRoaXMuZ2V0UkdCKGFhLzEwMCoodGhpcy5jb25maWcubWF4LXRoaXMuY29uZmlnLm1pbikrdGhpcy5jb25maWcubWluKSwzKSxlYT1iYVswXSxjYT1iYVsxXTtiYT1iYVsyXTsKTC5iZWdpblBhdGgoKTtMLmZpbGxTdHlsZT0icmdiYSgiK2VhKyIsICIrY2ErIiwgIitiYSsiLCAxKSI7TC5maWxsUmVjdChsYSxaLFEsWCk7TC5zdHJva2UoKX1udWxsIT1NJiZNPj10aGlzLmNvbmZpZy5taW4mJk08PXRoaXMuY29uZmlnLm1heCYmKEs9KE0tdGhpcy5jb25maWcubWluKS8odGhpcy5jb25maWcubWF4LXRoaXMuY29uZmlnLm1pbikqSy53aWR0aCxMLmJlZ2luUGF0aCgpLEwuZmlsbFN0eWxlPSJyZ2JhKDAsIDAsIDAsIDEpIixMLm1vdmVUbyhLLC4yKlQpLEwubGluZVRvKEstNCwwKSxMLmxpbmVUbyhLKzQsMCksTC5maWxsKCksTC5iZWdpblBhdGgoKSxMLm1vdmVUbyhLLC44KlQpLEwubGluZVRvKEstNCxUKSxMLmxpbmVUbyhLKzQsVCksTC5maWxsKCkpfX19O3JldHVybiBIfSgpLEI9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSygpe3JldHVybiBudWxsIT09SCYmSC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9V2koSyxIKTtLLnByb3RvdHlwZS5nZXRSR0I9ZnVuY3Rpb24oTSl7aWYoaXNOYU4oTSkpcmV0dXJuWzI1NSwKMCwwXTtpZighaXNGaW5pdGUoTSkpcmV0dXJuIDA8TT9bMCwwLDI1NV06WzI1NSwxMjcuNSwwXTtNPXRoaXMuY29uZmlnLm1pbj09PXRoaXMuY29uZmlnLm1heD8uNTooTS10aGlzLmNvbmZpZy5taW4pLyh0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKTtNPU1hdGgubWF4KE1hdGgubWluKE0sMSksMCk7cmV0dXJuWzI1NSpNLDI1NSpNLDI1NSpNXX07cmV0dXJuIEt9KEQpO0Q9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSygpe3JldHVybiBudWxsIT09SCYmSC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9V2koSyxIKTtLLnByb3RvdHlwZS5nZXRSR0I9ZnVuY3Rpb24oTSl7aWYoaXNOYU4oTSkpcmV0dXJuWzYzLjc1LDYzLjc1LDYzLjc1XTtpZighaXNGaW5pdGUoTSkpcmV0dXJuIDA+TT9bMTI3LjUsMTI3LjUsMTI3LjVdOlsxOTEuMjUsMTkxLjI1LDE5MS4yNV07dmFyIEw9MCxRPTAsVD0wO009dGhpcy5jb25maWcubWluPT09dGhpcy5jb25maWcubWF4Py41OihNLXRoaXMuY29uZmlnLm1pbikvCih0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKTtNPU1hdGgubWF4KE1hdGgubWluKE0sMSksMCk7LjM1Pj1NPyhRPU0vLjM1LFQ9MSk6LjM1PE0mJi42NT49TT8oTD0oTS0uMzUpLyguNjUtLjM1KSxRPTEsVD0oLjY1LU0pLyguNjUtLjM1KSk6LjY1PE0mJihMPTEsUT0oMS1NKS8uMzUpO3JldHVyblsyNTUqTCwyNTUqUSwyNTUqVF19O3JldHVybiBLfShEKTt2YXIgSTsoZnVuY3Rpb24oSCl7SFtILlRFWFQ9MV09IlRFWFQiO0hbSC5JTUFHRT0yXT0iSU1BR0UifSkoSXx8KEk9e30pKTt2YXIgTj17R3JheXNjYWxlOkIsSmV0OkR9LE89ZnVuY3Rpb24oKXtmdW5jdGlvbiBIKEssTSxMKXt0aGlzLnJvb3RFbGVtZW50PUs7dGhpcy50ZW5zb3JWaWV3PU07dGhpcy5iYXNlUnVsZXJUaWNrPXRoaXMudG9wUnVsZXI9dGhpcy52YWx1ZVNlY3Rpb249dGhpcy5zbGljaW5nU3BlY1Jvb3Q9dGhpcy5tZW51VGh1bWI9dGhpcy5pbmZvU3Vic2VjdGlvbj10aGlzLmhlYWRlclNlY3Rpb249bnVsbDsKdGhpcy50b3BSdWxlclRpY2tzPVtdO3RoaXMubGVmdFJ1bGVyVGlja3M9W107dGhpcy52YWx1ZVJvd3M9W107dGhpcy52YWx1ZURpdnM9W107dGhpcy5zbGljaW5nQ29udHJvbD10aGlzLnZhbHVlVG9vbHRpcD1udWxsO3RoaXMuY29sc0N1dG9mZj10aGlzLnJvd3NDdXRvZmY9ITE7dGhpcy5tZW51PXRoaXMubWVudUNvbmZpZz10aGlzLnNlbGVjdGlvbj1udWxsO3RoaXMuY29sb3JNYXBOYW1lPSJHcmF5c2NhbGUiO3RoaXMuY29sb3JNYXA9bnVsbDt0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0hMTt0aGlzLmltYWdlQ2VsbFNpemU9MTY7dGhpcy5taW5JbWFnZUNlbGxTaXplPTQ7dGhpcy5tYXhJbWFnZUNlbGxTaXplPTQwO3RoaXMuem9vbVN0ZXBSYXRpbz0xLjI7dGhpcy5udW1lcmljU3VtbWFyeT1udWxsO3RoaXMub3B0aW9ucz1MfHx7fTt0aGlzLnNsaWNpbmdTcGVjPXAodGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUpO3RoaXMucmFuaz10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZS5sZW5ndGg7CnRoaXMudmFsdWVSZW5kZXJNb2RlPUkuVEVYVH1ILnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gWGkodGhpcyxmdW5jdGlvbihLKXtzd2l0Y2goSy5sYWJlbCl7Y2FzZSAwOnRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldCIpO3RoaXMucmVuZGVySGVhZGVyKCk7aWYoIShkKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKXx8Zih0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGgodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxrKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSkpdGhyb3cgRXJyb3IoIlJlbmRlcmluZyBkdHlwZSAiK3RoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKyIgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIik7cmV0dXJuWzQsdGhpcy5yZW5kZXJWYWx1ZXMoKV07Y2FzZSAxOnJldHVybiBLLnNlbnQoKSxbMl19fSl9KX07SC5wcm90b3R5cGUucmVuZGVySGVhZGVyPQpmdW5jdGlvbigpe251bGw9PXRoaXMuaGVhZGVyU2VjdGlvbiYmKHRoaXMuaGVhZGVyU2VjdGlvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmhlYWRlclNlY3Rpb24uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1oZWFkZXIiKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGVhZGVyU2VjdGlvbiksdGhpcy5jcmVhdGVNZW51KCkpO3RoaXMucmVuZGVySW5mbygpfTtILnByb3RvdHlwZS5yZW5kZXJJbmZvPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBpbmZvIGZhaWxlZCBkdWUgdG8gbWlzaW5nIGhlYWRlciBzZWN0aW9uIik7bnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbiYmKHRoaXMuaW5mb1N1YnNlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5pbmZvU3Vic2VjdGlvbi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWluZm8iKSwKdGhpcy5oZWFkZXJTZWN0aW9uLmFwcGVuZENoaWxkKHRoaXMuaW5mb1N1YnNlY3Rpb24pKTtmb3IoO3RoaXMuaW5mb1N1YnNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy5pbmZvU3Vic2VjdGlvbi5yZW1vdmVDaGlsZCh0aGlzLmluZm9TdWJzZWN0aW9uLmZpcnN0Q2hpbGQpO3RoaXMucmVuZGVyTmFtZSgpO3RoaXMucmVuZGVyRFR5cGUoKTt0aGlzLnJlbmRlclNoYXBlKCl9O0gucHJvdG90eXBlLnJlbmRlck5hbWU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIG5hbWUgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGluZm8gc3Vic2VjdGlvbi4iKTtpZihudWxsIT10aGlzLm9wdGlvbnMubmFtZSYmMCE9PXRoaXMub3B0aW9ucy5uYW1lLmxlbmd0aCl7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIik7Sy50ZXh0Q29udGVudD0Kbih0aGlzLm9wdGlvbnMubmFtZSk7Sy50aXRsZT10aGlzLm9wdGlvbnMubmFtZTt0aGlzLmluZm9TdWJzZWN0aW9uLmFwcGVuZENoaWxkKEspfX07SC5wcm90b3R5cGUucmVuZGVyRFR5cGU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIGR0eXBlIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBpbmZvIHN1YnNlY3Rpb24uIik7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWR0eXBlIik7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCIpO00udGV4dENvbnRlbnQ9ImR0eXBlOiI7Sy5hcHBlbmRDaGlsZChNKTtNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtNLnRleHRDb250ZW50PXRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlO0suYXBwZW5kQ2hpbGQoTSk7CnRoaXMuaW5mb1N1YnNlY3Rpb24uYXBwZW5kQ2hpbGQoSyl9O0gucHJvdG90eXBlLnJlbmRlclNoYXBlPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBzaGFwZSBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaW5mbyBzdWJzZWN0aW9uLiIpO3ZhciBLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0suY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZSIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCIpO00udGV4dENvbnRlbnQ9InNoYXBlOiI7Sy5hcHBlbmRDaGlsZChNKTtNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZS12YWx1ZSIpO00udGV4dENvbnRlbnQ9bCh0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSk7Sy5hcHBlbmRDaGlsZChNKTsKdGhpcy5pbmZvU3Vic2VjdGlvbi5hcHBlbmRDaGlsZChLKX07SC5wcm90b3R5cGUuY3JlYXRlTWVudT1mdW5jdGlvbigpe3ZhciBLPXRoaXM7dGhpcy5tZW51Q29uZmlnPXtpdGVtczpbXX07aWYoZih0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGQodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxoKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSl0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiU2VsZWN0IGRpc3BsYXkgbW9kZS4uLiIsb3B0aW9uczpbIlRleHQiLCJJbWFnZSJdLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpmdW5jdGlvbihNKXswPT09TT8oSy52YWx1ZVJlbmRlck1vZGU9SS5URVhULEsucmVuZGVyVmFsdWVzKCkpOihLLnZhbHVlUmVuZGVyTW9kZT1JLklNQUdFLEsudGVuc29yVmlldy5nZXROdW1lcmljU3VtbWFyeSgpLnRoZW4oZnVuY3Rpb24oTCl7Sy5udW1lcmljU3VtbWFyeT1MO0sucmVuZGVyVmFsdWVzKCl9KSl9fSksdGhpcy5tZW51Q29uZmlnLml0ZW1zLnB1c2goe2NhcHRpb246IlNlbGVjdCBjb2xvciBtYXAuLi4iLApvcHRpb25zOk9iamVjdC5rZXlzKE4pLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpmdW5jdGlvbihNKXtLLmNvbG9yTWFwTmFtZT1PYmplY3Qua2V5cyhOKVtNXTtLLnJlbmRlclZhbHVlcygpfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gSy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFfX0pLHRoaXMubWVudUNvbmZpZy5pdGVtcy5wdXNoKHtjYXB0aW9uOiJab29tIGluIChJbWFnZSBtb2RlKSIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtLLnpvb21Jbk9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIEsudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRX19KSx0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiWm9vbSBvdXQgKEltYWdlIG1vZGUpIixjYWxsYmFjazpmdW5jdGlvbigpe0suem9vbU91dE9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIEsudmFsdWVSZW5kZXJNb2RlPT09CkkuSU1BR0V9fSk7bnVsbCE9PXRoaXMubWVudUNvbmZpZyYmMDx0aGlzLm1lbnVDb25maWcuaXRlbXMubGVuZ3RoJiYodGhpcy5tZW51PW5ldyB5KHRoaXMubWVudUNvbmZpZyx0aGlzLmhlYWRlclNlY3Rpb24pLHRoaXMucmVuZGVyTWVudVRodW1iKCkpfTtILnByb3RvdHlwZS56b29tSW5PbmVTdGVwQW5kUmVuZGVyVmFsdWVzPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZUNlbGxTaXplKnRoaXMuem9vbVN0ZXBSYXRpbzw9dGhpcy5tYXhJbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplKj10aGlzLnpvb21TdGVwUmF0aW8sdGhpcy5yZW5kZXJWYWx1ZXMoKSl9O0gucHJvdG90eXBlLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZUNlbGxTaXplL3RoaXMuem9vbVN0ZXBSYXRpbz49dGhpcy5taW5JbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplLz10aGlzLnpvb21TdGVwUmF0aW8sdGhpcy5yZW5kZXJWYWx1ZXMoKSl9O0gucHJvdG90eXBlLnJlbmRlck1lbnVUaHVtYj0KZnVuY3Rpb24oKXt2YXIgSz10aGlzO2lmKG51bGw9PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIG1lbnUgdGh1bWIgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGhlYWRlciBzZWN0aW9uLiIpO3RoaXMubWVudVRodW1iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMubWVudVRodW1iLnRleHRDb250ZW50PSJcdTIyZWUiO3RoaXMubWVudVRodW1iLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtbWVudS10aHVtYiIpO3RoaXMuaGVhZGVyU2VjdGlvbi5hcHBlbmRDaGlsZCh0aGlzLm1lbnVUaHVtYik7dGhpcy5tZW51VGh1bWIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7aWYobnVsbCE9PUsubWVudSlpZihLLm1lbnUuc2hvd24oKSlLLm1lbnUuaGlkZSgpO2Vsc2V7dmFyIE09Sy5tZW51VGh1bWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Sy5tZW51LnNob3coTS5ib3R0b20sTS5sZWZ0KX19KX07SC5wcm90b3R5cGUucmVuZGVyVmFsdWVzPQpmdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBLPXRoaXM7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oTSl7c3dpdGNoKE0ubGFiZWwpe2Nhc2UgMDpyZXR1cm4gMjx0aGlzLnJhbmsmJm51bGw9PT10aGlzLnNsaWNpbmdTcGVjUm9vdCYmKHRoaXMuc2xpY2luZ1NwZWNSb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2xpY2luZ1NwZWNSb290LmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zbGljaW5nU3BlY1Jvb3QpKSxudWxsPT10aGlzLnZhbHVlU2VjdGlvbiYmKHRoaXMudmFsdWVTZWN0aW9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudmFsdWVTZWN0aW9uLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy52YWx1ZVNlY3Rpb24pLAp0aGlzLnZhbHVlU2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsZnVuY3Rpb24oTCl7cmV0dXJuIGIoSyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIFE7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oVCl7c3dpdGNoKFQubGFiZWwpe2Nhc2UgMDpRPSExO251bGw9PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXl8fCJjdHJsIj09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXk/UT1MLmN0cmxLZXk6ImFsdCI9PT10aGlzLm9wdGlvbnMud2hlZWxab29tS2V5P1E9TC5hbHRLZXk6InNoaWZ0Ij09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXkmJihRPUwuc2hpZnRLZXkpO2lmKFEmJnRoaXMudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSlyZXR1cm4gTC5zdG9wUHJvcGFnYXRpb24oKSxMLnByZXZlbnREZWZhdWx0KCksMDxMLmRlbHRhWT90aGlzLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCk6dGhpcy56b29tSW5PbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCksWzJdO2lmKG51bGw9PQp0aGlzLnNlbGVjdGlvbilyZXR1cm5bMl07TC5zdG9wUHJvcGFnYXRpb24oKTtMLnByZXZlbnREZWZhdWx0KCk7dGhpcy5oaWRlVmFsdWVUb29sdGlwKCk7cmV0dXJuWzQsdGhpcy5zY3JvbGxVcE9yRG93bigwPEwuZGVsdGFZP3cuRE9XTjp3LlVQKV07Y2FzZSAxOnJldHVybiBULnNlbnQoKSxbMl19fSl9KX0pLHRoaXMudmFsdWVTZWN0aW9uLnRhYkluZGV4PTEwMjQsdGhpcy52YWx1ZVNlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oTCl7dmFyIFE9WzM4LDQwLDM3LDM5XTtpZihudWxsIT1LLnNlbGVjdGlvbiYmLTEhPT1RLmluZGV4T2YoTC5rZXlDb2RlKSl7TC5zdG9wUHJvcGFnYXRpb24oKTtMLnByZXZlbnREZWZhdWx0KCk7Sy5oaWRlVmFsdWVUb29sdGlwKCk7dmFyIFQ9UT1udWxsOzM4PT09TC5rZXlDb2RlP1Q9dy5VUDo0MD09PUwua2V5Q29kZT9UPXcuRE9XTjozNz09PUwua2V5Q29kZT9UPXcuTEVGVDozOT09PUwua2V5Q29kZSYmKFQ9dy5SSUdIVCk7Cm51bGwhPT1UJiYoUT1LLnNlbGVjdGlvbi5tb3ZlKFQsSy5zbGljaW5nU3BlYykpO251bGw9PT1RP0sucmVuZGVyU2VsZWN0aW9uKCk6UT09PXcuVVB8fFE9PT13LkRPV04/Sy5zY3JvbGxVcE9yRG93bihRKTooUT09PXcuTEVGVHx8UT09PXcuUklHSFQpJiZLLnNjcm9sbExlZnRPclJpZ2h0KFEpfX0pKSx0aGlzLmNsZWFyVmFsdWVTZWN0aW9uKCksdGhpcy5jcmVhdGVUb3BSdWxlcigpLHRoaXMuY3JlYXRlTGVmdFJ1bGVyKCksdGhpcy5jcmVhdGVWYWx1ZURpdnMoKSxbNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDE6cmV0dXJuIE0uc2VudCgpLDI8dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nQ29udHJvbD1uZXcgRyh0aGlzLnNsaWNpbmdTcGVjUm9vdCx0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxmdW5jdGlvbihMKXtyZXR1cm4gYihLLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gWGkodGhpcyxmdW5jdGlvbihRKXtzd2l0Y2goUS5sYWJlbCl7Y2FzZSAwOmlmKG0odGhpcy5zbGljaW5nU3BlYywKTCkpcmV0dXJuWzMsMl07dGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKTtyZXR1cm5bNCx0aGlzLnJlbmRlcigpXTtjYXNlIDE6cmV0dXJuIFEuc2VudCgpLFszLDRdO2Nhc2UgMjpyZXR1cm4gdGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKSxbNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDM6US5zZW50KCksUS5sYWJlbD00O2Nhc2UgNDpyZXR1cm5bMl19fSl9KX0pLHRoaXMuc2xpY2luZ0NvbnRyb2wucmVuZGVyKHRoaXMuc2xpY2luZ1NwZWMpKSxbMl19fSl9KX07SC5wcm90b3R5cGUuY2xlYXJWYWx1ZVNlY3Rpb249ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy52YWx1ZVNlY3Rpb24pe2Zvcig7dGhpcy52YWx1ZVNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy52YWx1ZVNlY3Rpb24ucmVtb3ZlQ2hpbGQodGhpcy52YWx1ZVNlY3Rpb24uZmlyc3RDaGlsZCk7dGhpcy50b3BSdWxlcj1udWxsOwp0aGlzLnZhbHVlUm93cz1bXX19O0gucHJvdG90eXBlLmNyZWF0ZVRvcFJ1bGVyPWZ1bmN0aW9uKCl7dmFyIEs9dGhpcztpZihudWxsPT09dGhpcy52YWx1ZVNlY3Rpb24pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgdG9wIHJ1bGVyIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHNlY3Rpb24uIik7bnVsbD09dGhpcy50b3BSdWxlciYmKHRoaXMudG9wUnVsZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy50b3BSdWxlci5jbGFzc0xpc3QuYWRkKCJ0ZW5lc29yLXdpZGdldC10b3AtcnVsZXIiKSx0aGlzLnRvcFJ1bGVyLnN0eWxlLndoaXRlU3BhY2U9Im5vd3JhcCIsdGhpcy52YWx1ZVNlY3Rpb24uYXBwZW5kQ2hpbGQodGhpcy50b3BSdWxlciksdGhpcy50b3BSdWxlclRpY2tzPVtdLHRoaXMudG9wUnVsZXIuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGZ1bmN0aW9uKFgpe3JldHVybiBiKEssdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKGFhKXtzd2l0Y2goYWEubGFiZWwpe2Nhc2UgMDppZihudWxsPT0KdGhpcy5zZWxlY3Rpb24pcmV0dXJuWzJdO1guc3RvcFByb3BhZ2F0aW9uKCk7WC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaGlkZVZhbHVlVG9vbHRpcCgpO3JldHVybls0LHRoaXMuc2Nyb2xsTGVmdE9yUmlnaHQoMDxYLmRlbHRhWT93LlJJR0hUOncuTEVGVCldO2Nhc2UgMTpyZXR1cm4gYWEuc2VudCgpLFsyXX19KX0pfSkpO2Zvcig7dGhpcy50b3BSdWxlci5maXJzdENoaWxkOyl0aGlzLnRvcFJ1bGVyLnJlbW92ZUNoaWxkKHRoaXMudG9wUnVsZXIuZmlyc3RDaGlsZCk7dGhpcy5iYXNlUnVsZXJUaWNrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuYmFzZVJ1bGVyVGljay5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7dGhpcy50b3BSdWxlci5hcHBlbmRDaGlsZCh0aGlzLmJhc2VSdWxlclRpY2spOzI8PXRoaXMucmFuayYmKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlPVswLG51bGxdKTt2YXIgTT0xPj10aGlzLnJhbms/CjE6dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07dmFyIEw9dGhpcy5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDt0aGlzLmNvbHNDdXRvZmY9ITE7Zm9yKHZhciBRPTA7UTxNOysrUSl7dmFyIFQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7VC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoVC5zdHlsZS53aWR0aD10aGlzLmltYWdlQ2VsbFNpemUrInB4Iik7dGhpcy50b3BSdWxlci5hcHBlbmRDaGlsZChUKTt0aGlzLnRvcFJ1bGVyVGlja3MucHVzaChUKTtpZihULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0Pj1MKXtpZigyPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAiKwp0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPVErMTt0aGlzLmNvbHNDdXRvZmY9ITB9YnJlYWt9fWlmKCF0aGlzLmNvbHNDdXRvZmYmJjI8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1NfX07SC5wcm90b3R5cGUuY3JlYXRlTGVmdFJ1bGVyPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMudmFsdWVTZWN0aW9uKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGxlZnQgcnVsZXIgZHVlIHRvIG1pc3NpbmcgdmFsdWUgc2VjdGlvbi4iKTt0aGlzLnZhbHVlUm93cz1bXTt0aGlzLmxlZnRSdWxlclRpY2tzPVtdOzE8PXRoaXMucmFuayYmKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZT0KWzAsbnVsbF0pO3ZhciBLPTA9PT10aGlzLnJhbms/MTp0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnJvd3NDdXRvZmY9ITE7Zm9yKHZhciBNPXRoaXMucm9vdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tLEw9MDtMPEs7KytMKXt2YXIgUT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtRLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtcm93Iik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoUS5zdHlsZS5oZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIsUS5zdHlsZS5saW5lSGVpZ2h0PXRoaXMuaW1hZ2VDZWxsU2l6ZSsicHgiKTt0aGlzLnZhbHVlU2VjdGlvbi5hcHBlbmRDaGlsZChRKTt0aGlzLnZhbHVlUm93cy5wdXNoKFEpO3ZhciBUPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1QuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayIpOwp0aGlzLnZhbHVlUmVuZGVyTW9kZT09PUkuSU1BR0UmJihULnN0eWxlLmhlaWdodD10aGlzLmltYWdlQ2VsbFNpemUrInB4IixULnN0eWxlLmxpbmVIZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIpO1EuYXBwZW5kQ2hpbGQoVCk7dGhpcy5sZWZ0UnVsZXJUaWNrcy5wdXNoKFQpO2lmKFQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tPj1NKXtpZigxPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09TCsxO3RoaXMucm93c0N1dG9mZj0hMH1icmVha319aWYoIXRoaXMucm93c0N1dG9mZiYmMTw9dGhpcy5yYW5rKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiKwp0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1LfX07SC5wcm90b3R5cGUuY3JlYXRlVmFsdWVEaXZzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSyhhYSl7ZnVuY3Rpb24gbGEoYmEpe3ZhciBlYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdiIpO1QudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSYmKGVhLnN0eWxlLndpZHRoPVQuaW1hZ2VDZWxsU2l6ZSsicHgiLGVhLnN0eWxlLmhlaWdodD1ULmltYWdlQ2VsbFNpemUrInB4IixlYS5zdHlsZS5saW5lSGVpZ2h0PVQuaW1hZ2VDZWxsU2l6ZSsicHgiKTtULnZhbHVlUm93c1thYV0uYXBwZW5kQ2hpbGQoZWEpO1QudmFsdWVEaXZzW2FhXS5wdXNoKGVhKTtlYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtNLnNlbGVjdGlvbj1uZXcgQyhNLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxNLnNsaWNpbmdTcGVjLApudWxsPT1NLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2V8fG51bGw9PU0uc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXT8wOk0uc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXSthYSxudWxsPT1NLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZXx8bnVsbD09TS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0/MDpNLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStiYSwxLDEpO00ucmVuZGVyU2VsZWN0aW9uKCl9KTtlYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe3ZhciBjYT1lYS5nZXRBdHRyaWJ1dGUoImRldGFpbGVkLXZhbHVlIik7aWYobnVsbCE9PWNhKXt2YXIga2E9TS5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxZPWVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEVhPVkuYm90dG9tLVkudG9wLHZhPVkucmlnaHQtWS5sZWZ0LHhhPU0uY2FsY3VsYXRlSW5kaWNlcyhhYSxiYSk7TS5kcmF3VmFsdWVUb29sdGlwKHhhLApjYSxZLnRvcC1rYS50b3ArLjgqRWEsWS5sZWZ0LWthLmxlZnQrLjc1KnZhKX19KTtlYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe00uaGlkZVZhbHVlVG9vbHRpcCgpfSl9VC52YWx1ZURpdnNbYWFdPVtdO2Zvcih2YXIgWj0wO1o8TDsrK1opbGEoWil9dmFyIE09dGhpcztpZihudWxsPT09dGhpcy52YWx1ZVJvd3MpdGhyb3cgRXJyb3IoIlZhbHVlIHJvd3MgYXJlIHVuZXhwZWN0ZWRseSB1bmluaXRpYWxpemVkLiIpO3RoaXMudmFsdWVEaXZzPVtdO2Zvcih2YXIgTD10aGlzLnRvcFJ1bGVyVGlja3MubGVuZ3RoLFE9dGhpcy52YWx1ZVJvd3MubGVuZ3RoLFQ9dGhpcyxYPTA7WDxROysrWClLKFgpfTtILnByb3RvdHlwZS5yZW5kZXJUb3BSdWxlcj1mdW5jdGlvbigpe2lmKDI8PXRoaXMucmFuaylmb3IodmFyIEs9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV0sTT0wO008dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aDsrK00pe2lmKG51bGw9PT0KdGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZSBmb3IgIit0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3ZhciBMPXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdK007dGhpcy5zaG93SW5kaWNlc09uVGlja3MmJih0aGlzLnRvcFJ1bGVyVGlja3NbTV0udGV4dENvbnRlbnQ9TDxLPyIiK0w6IiIpfX07SC5wcm90b3R5cGUucmVuZGVyTGVmdFJ1bGVyPWZ1bmN0aW9uKCl7aWYoMTw9dGhpcy5yYW5rKWZvcih2YXIgSz10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXSxNPTA7TTx0aGlzLmxlZnRSdWxlclRpY2tzLmxlbmd0aDsrK00pe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGNpYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt2YXIgTD10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0rCk07dGhpcy5zaG93SW5kaWNlc09uVGlja3MmJih0aGlzLmxlZnRSdWxlclRpY2tzW01dLnRleHRDb250ZW50PUw8Sz8iIitMOiIiKX19O0gucHJvdG90eXBlLnJlbmRlclZhbHVlRGl2cz1mdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBLLE0sTCxRLFQsWCxhYSxsYSxaLGJhLGVhLGNhLGthLFksRWEsdmEseGE7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oQWEpe3N3aXRjaChBYS5sYWJlbCl7Y2FzZSAwOnJldHVybiBLPXRoaXMudmFsdWVEaXZzLmxlbmd0aCxNPXRoaXMudmFsdWVEaXZzWzBdLmxlbmd0aCxbNCx0aGlzLnRlbnNvclZpZXcudmlldyh0aGlzLnNsaWNpbmdTcGVjKV07Y2FzZSAxOkw9QWEuc2VudCgpOzA9PT10aGlzLnJhbms/TD1bW0xdXToxPT09dGhpcy5yYW5rJiYoTD1MLm1hcChmdW5jdGlvbihGYSl7cmV0dXJuW0ZhXX0pKTtRPXRoaXMuZ2V0VmFsdWVDbGFzcygpO1Q9dGhpcy52YWx1ZVJlbmRlck1vZGU7aWYoVD09PQpJLklNQUdFKXtpZihudWxsPT10aGlzLm51bWVyaWNTdW1tYXJ5KXRocm93IEVycm9yKCJGYWlsZWQgdG8gcmVuZGVyIGltYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRlbnNvciBkdWUgdG8gbWlzc2luZyBudW1lcmljIHN1bW1hcnkiKTtYPXRoaXMubnVtZXJpY1N1bW1hcnk7YWE9WC5taW5pbXVtO2xhPVgubWF4aW11bTtpZihudWxsPT1hYXx8bnVsbD09bGEpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byByZW5kZXIgaW1hZ2UgcmVwcmVzZW50YXRpb24gb2YgdGVuc29yIGR1ZSB0byBtaXNzaW5nIG1pbmltdW0gb3IgbWF4aW11bSB2YWx1ZXMgaW4gbnVtZXJpYyBzdW1tYXJ5Iik7Wj17bWluOmFhLG1heDpsYX07dGhpcy5jb2xvck1hcD10aGlzLmNvbG9yTWFwTmFtZSBpbiBOP25ldyBOW3RoaXMuY29sb3JNYXBOYW1lXShaKTpuZXcgQihaKX1mb3IoYmE9MDtiYTxLOysrYmEpZm9yKGVhPTA7ZWE8TTsrK2VhKWNhPXRoaXMudmFsdWVEaXZzW2JhXVtlYV0sYmE8TC5sZW5ndGgmJmVhPExbYmFdLmxlbmd0aD8KKGthPUxbYmFdW2VhXSxUPT09SS5JTUFHRT8oWT1ZaSh0aGlzLmNvbG9yTWFwLmdldFJHQihrYSksMyksRWE9WVswXSx2YT1ZWzFdLHhhPVlbMl0sY2Euc3R5bGUuYmFja2dyb3VuZENvbG9yPSJyZ2IoIitFYSsiLCAiK3ZhKyIsICIreGErIikiKToibnVtZXJpYyI9PT1RP2NhLnRleHRDb250ZW50PXEoa2EsZCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSkpOiJib29sZWFuIj09PVE/Y2EudGV4dENvbnRlbnQ9dShrYSk6InN0cmluZyI9PT1RJiYoY2EudGV4dENvbnRlbnQ9eChrYSkpLGNhLnNldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiLHRoaXMuZ2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmcoa2EpKSk6KGNhLnRleHRDb250ZW50PSIiLGNhLnNldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiLCIiKSk7dGhpcy5yZW5kZXJTZWxlY3Rpb24oKTtyZXR1cm5bMl19fSl9KX07SC5wcm90b3R5cGUuZ2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmc9ZnVuY3Rpb24oSyl7cmV0dXJuImJvb2xlYW4iPT09CnRoaXMuZ2V0VmFsdWVDbGFzcygpP3UoSywhMSk6InN0cmluZyI9PT10aGlzLmdldFZhbHVlQ2xhc3MoKT8iTGVuZ3RoLSIrSy5sZW5ndGgrJyBzdHJpbmc6ICInK3goSyw1MDApKyciJzpTdHJpbmcoSyl9O0gucHJvdG90eXBlLnJlbmRlclNlbGVjdGlvbj1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuc2VsZWN0aW9uKWZvcih2YXIgSz10aGlzLnZhbHVlRGl2cy5sZW5ndGgsTT10aGlzLnZhbHVlRGl2c1swXS5sZW5ndGgsTD0wO0w8SzsrK0wpZm9yKHZhciBRPTA7UTxNOysrUSl7dmFyIFQ9dGhpcy52YWx1ZURpdnNbTF1bUV07VC5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24iKTtULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi10b3AiKTtULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1ib3R0b20iKTtULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0Iik7ClQuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0Iik7dmFyIFg9dGhpcy5jYWxjdWxhdGVJbmRpY2VzKEwsUSk7WD10aGlzLnNlbGVjdGlvbi5nZXRFbGVtZW50U3RhdHVzKFgpO251bGwhPT1YJiYoVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24iKSxYLnRvcEVkZ2UmJlQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCIpLFguYm90dG9tRWRnZSYmVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIiksWC5sZWZ0RWRnZSYmVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tbGVmdCIpLFgucmlnaHRFZGdlJiZULmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCIpKX19O0gucHJvdG90eXBlLmNhbGN1bGF0ZUluZGljZXM9CmZ1bmN0aW9uKEssTSl7Zm9yKHZhciBMPVtdLFE9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKGxhKXtyZXR1cm4gbGEuZGltfSksVD10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24obGEpe3JldHVybiBsYS5pbmRleH0pLFg9MDtYPHRoaXMucmFuazsrK1gpaWYoLTEhPT1RLmluZGV4T2YoWCkpe3ZhciBhYT1UW1EuaW5kZXhPZihYKV07aWYobnVsbD09PWFhKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY2FsY3VsYXRlIGluZGljZXM6IFVuZGV0ZXJtaW5lZCBpbmRleCBhdCBkaW1lbnNpb24gIitYKTtMLnB1c2goYWEpfWVsc2UgaWYoWD09PXRoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF0pe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2V8fG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjYWxjdWxhdGUgaW5kaWNlcyBkdWUgdG8gdW5kZXJ0ZXJtaW5lZCB2ZXJ0aWNhbCByYW5nZS4iKTsKTC5wdXNoKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXStLKX1lbHNlIGlmKFg9PT10aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2V8fG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBpbmRpY2VzIGR1ZSB0byB1bmRlcnRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpO0wucHVzaCh0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStNKX1yZXR1cm4gTH07SC5wcm90b3R5cGUuZHJhd1ZhbHVlVG9vbHRpcD1mdW5jdGlvbihLLE0sTCxRKXtudWxsPT09dGhpcy52YWx1ZVRvb2x0aXAmJih0aGlzLnZhbHVlVG9vbHRpcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnZhbHVlVG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAiKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudmFsdWVUb29sdGlwKSk7CmZvcig7dGhpcy52YWx1ZVRvb2x0aXAuZmlyc3RDaGlsZDspdGhpcy52YWx1ZVRvb2x0aXAucmVtb3ZlQ2hpbGQodGhpcy52YWx1ZVRvb2x0aXAuZmlyc3RDaGlsZCk7dmFyIFQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7VC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtaW5kaWNlcyIpO1QudGV4dENvbnRlbnQ9IkluZGljZXM6ICIrSlNPTi5zdHJpbmdpZnkoSyk7dGhpcy52YWx1ZVRvb2x0aXAuYXBwZW5kQ2hpbGQoVCk7Sz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtLLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSIpO0sudGV4dENvbnRlbnQ9TTt0aGlzLnZhbHVlVG9vbHRpcC5hcHBlbmRDaGlsZChLKTt0aGlzLnZhbHVlVG9vbHRpcC5zdHlsZS50b3A9TCsicHgiO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLmxlZnQ9USsicHgiO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjsKdGhpcy52YWx1ZVJlbmRlck1vZGU9PUkuSU1BR0UmJm51bGwhPXRoaXMuY29sb3JNYXAmJihMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLEwuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIiksdGhpcy52YWx1ZVRvb2x0aXAuYXBwZW5kQ2hpbGQoTCksdGhpcy5jb2xvck1hcC5yZW5kZXIoTCxwYXJzZUZsb2F0KE0pKSl9O0gucHJvdG90eXBlLmhpZGVWYWx1ZVRvb2x0aXA9ZnVuY3Rpb24oKXtudWxsIT10aGlzLnZhbHVlVG9vbHRpcCYmKHRoaXMudmFsdWVUb29sdGlwLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX07SC5wcm90b3R5cGUucmVuZGVyUnVsZXJzQW5kVmFsdWVEaXZzPWZ1bmN0aW9uKCl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oSyl7c3dpdGNoKEsubGFiZWwpe2Nhc2UgMDpyZXR1cm4gbnVsbCE9dGhpcy5zbGljaW5nQ29udHJvbCYmdGhpcy5zbGljaW5nQ29udHJvbC5zZXRTbGljaW5nU3BlYyh0aGlzLnNsaWNpbmdTcGVjKSwKdGhpcy5jYWxjdWxhdGVTaG93SW5kaWNlc09uUnVsZXJUaWNrcygpLHRoaXMucmVuZGVyVG9wUnVsZXIoKSx0aGlzLnJlbmRlckxlZnRSdWxlcigpLFs0LHRoaXMucmVuZGVyVmFsdWVEaXZzKCldO2Nhc2UgMTpyZXR1cm4gSy5zZW50KCksWzJdfX0pfSl9O0gucHJvdG90eXBlLmNhbGN1bGF0ZVNob3dJbmRpY2VzT25SdWxlclRpY2tzPWZ1bmN0aW9uKCl7aWYoMjw9dGhpcy5yYW5rKXt2YXIgSz10aGlzLnRvcFJ1bGVyVGlja3NbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5zaG93SW5kaWNlc09uVGlja3M9Sy5yaWdodC1LLmxlZnQ+OSpNYXRoLmNlaWwoTWF0aC5sb2codGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV0pL01hdGguTE4xMCl9ZWxzZSAxPT09dGhpcy5yYW5rPyhLPXRoaXMubGVmdFJ1bGVyVGlja3NbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5zaG93SW5kaWNlc09uVGlja3M9MTY8Sy5ib3R0b20tCksudG9wKTp0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0hMX07SC5wcm90b3R5cGUuc2Nyb2xsSG9yaXpvbnRhbGx5PWZ1bmN0aW9uKEspe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBNLEw7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oUSl7c3dpdGNoKFEubGFiZWwpe2Nhc2UgMDppZigxPj10aGlzLnJhbmspcmV0dXJuWzJdO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7TT10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdXTtpZigwPkt8fEs+PU0pdGhyb3cgRXJyb3IoIkluZGV4IG91dCBvZiBib3VuZDogIitLKyIgaXMgb3V0c2lkZSBbMCwgIitNKyJdKSIpO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdPUs7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV09CksrdGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aDtMPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPkwmJih0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1MKTtyZXR1cm5bNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDE6cmV0dXJuIFEuc2VudCgpLFsyXX19KX0pfTtILnByb3RvdHlwZS5zY3JvbGxWZXJ0aWNhbGx5PWZ1bmN0aW9uKEspe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBNLEw7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oUSl7c3dpdGNoKFEubGFiZWwpe2Nhc2UgMDppZigwPT09dGhpcy5yYW5rKXJldHVyblsyXTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiK3RoaXMucmFuaysKIkQgdGVuc29yLiIpO2lmKG51bGw9PT10aGlzLnZhbHVlUm93cyl0aHJvdyBFcnJvcigiVmVydGljYWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyB2YWx1ZSByb3dzLiIpO009dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV07aWYoMD5LfHxLPj1NKXRocm93IEVycm9yKCJJbmRleCBvdXQgb2YgYm91bmQ6ICIrSysiIGlzIG91dHNpZGUgWzAsICIrTSsiXSkiKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF09Szt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09Syt0aGlzLnZhbHVlUm93cy5sZW5ndGg7TD10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV0+TCYmKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1MKTtyZXR1cm5bNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTsKY2FzZSAxOnJldHVybiBRLnNlbnQoKSxbMl19fSl9KX07SC5wcm90b3R5cGUuc2Nyb2xsVXBPckRvd249ZnVuY3Rpb24oSyl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIE0sTCxRO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKFQpe3N3aXRjaChULmxhYmVsKXtjYXNlIDA6aWYoMD09PXRoaXMucmFua3x8IXRoaXMucm93c0N1dG9mZilyZXR1cm5bMl07aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZSBmb3IgIit0aGlzLnJhbmsrIkQgdGVuc29yLiIpO2lmKG51bGw9PT10aGlzLnZhbHVlUm93cyl0aHJvdyBFcnJvcigiVmVydGljYWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyB2YWx1ZSByb3dzLiIpO009dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdO2lmKEshPT13LkRPV04pcmV0dXJuWzMsM107TD10aGlzLnZhbHVlUm93cy5sZW5ndGgtCjE7UT10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXS1MO3JldHVybiBNPFE/WzQsdGhpcy5zY3JvbGxWZXJ0aWNhbGx5KE0rMSldOlszLDJdO2Nhc2UgMTpULnNlbnQoKSxULmxhYmVsPTI7Y2FzZSAyOnJldHVyblszLDVdO2Nhc2UgMzpyZXR1cm4gMDw9TS0xP1s0LHRoaXMuc2Nyb2xsVmVydGljYWxseShNLTEpXTpbMyw1XTtjYXNlIDQ6VC5zZW50KCksVC5sYWJlbD01O2Nhc2UgNTpyZXR1cm5bMl19fSl9KX07SC5wcm90b3R5cGUuc2Nyb2xsTGVmdE9yUmlnaHQ9ZnVuY3Rpb24oSyl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIE0sTCxRO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKFQpe3N3aXRjaChULmxhYmVsKXtjYXNlIDA6aWYoMT49dGhpcy5yYW5rfHwhdGhpcy5jb2xzQ3V0b2ZmKXJldHVyblsyXTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIkhvcml6b250YWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBob3Jpem9udGFsIHJhbmdlLiIpOwpNPXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdO2lmKEshPT13LlJJR0hUKXJldHVyblszLDNdO0w9dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aC0xO1E9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV0tTDtyZXR1cm4gTTxRP1s0LHRoaXMuc2Nyb2xsSG9yaXpvbnRhbGx5KE0rMSldOlszLDJdO2Nhc2UgMTpULnNlbnQoKSxULmxhYmVsPTI7Y2FzZSAyOnJldHVyblszLDVdO2Nhc2UgMzpyZXR1cm4gMDw9TS0xP1s0LHRoaXMuc2Nyb2xsSG9yaXpvbnRhbGx5KE0tMSldOlszLDVdO2Nhc2UgNDpULnNlbnQoKSxULmxhYmVsPTU7Y2FzZSA1OnJldHVyblsyXX19KX0pfTtILnByb3RvdHlwZS5uYXZpZ2F0ZVRvSW5kaWNlcz1mdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIm5hdmlnYXRlVG9JbmRpY2VzKCkgaXMgbm90IGltcGxlbWVudGVkIHlldC4iKTsKfSl9KX07SC5wcm90b3R5cGUuZ2V0VmFsdWVDbGFzcz1mdW5jdGlvbigpe3ZhciBLPXRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlO3JldHVybiBkKEspfHxmKEspPyJudW1lcmljIjpoKEspPyJib29sZWFuIjoic3RyaW5nIn07cmV0dXJuIEh9KCk7RD1PYmplY3QuZnJlZXplKHt0ZW5zb3JXaWRnZXQ6ZnVuY3Rpb24oSCxLLE0pe3JldHVybiBuZXcgTyhILEssTSl9LFZFUlNJT046IjAuMC4wIn0pO3dpbmRvdy50ZW5zb3Jfd2lkZ2V0PUR9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1saW5lLWNoYXJ0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiLHByb3BlcnRpZXM6e2RhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9kZWZhdWx0U2VyaWVzTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6Il9fZGVidWdnZXJfZGF0YV9fIixyZWFkb25seTohMH0sX2xpbmVDaGFydFhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOigpPT4oKT0+e2NvbnN0IGI9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTpiLGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoYiwiYm90dG9tIiksYWNjZXNzb3I6ZD0+ZC5zdGVwfX19LF9saW5lQ2hhcnRZVmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PmI9PmIuc2NhbGFyfSxfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6KCk9Plt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmI9Pgoic3RlcFx4M2QiK2IuZGF0dW0uc3RlcCsiOyBzY2FsYXJceDNkICIrYi5kYXR1bS5zY2FsYXJ9XX0sX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9ic2VydmVyczpbInJlbmRlcihkYXRhKSJdLHJlbmRlcihiKXtpZihudWxsIT1iKXt2YXIgZD10aGlzLiQkKCJ2ei1saW5lLWNoYXJ0MiIpO2Quc2V0VmlzaWJsZVNlcmllcyhbdGhpcy5fZGVmYXVsdFNlcmllc05hbWVdKTt2YXIgZj1bXSxoPWIueDtiPWIueTtmb3IobGV0IGs9MDtrPGgubGVuZ3RoOysraylmLnB1c2goe3N0ZXA6aFtrXSxzY2FsYXI6YltrXX0pO2Quc2V0U2VyaWVzRGF0YSh0aGlzLl9kZWZhdWx0U2VyaWVzTmFtZSxmKX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci12YWx1ZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci12YWx1ZS12aWV3Iixwcm9wZXJ0aWVzOnt2aWV3SWQ6U3RyaW5nLHRlbnNvck5hbWU6U3RyaW5nLGRlYnVnT3A6U3RyaW5nLGRldmljZU5hbWU6U3RyaW5nLG1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU6U3RyaW5nLHNsaWNpbmc6U3RyaW5nLHRpbWVJbmRpY2VzOlN0cmluZyxkdHlwZTpTdHJpbmcsc2hhcGU6QXJyYXksY29udGludWVUb0J1dHRvbkNhbGxiYWNrOk9iamVjdCxjbG9zZUJ1dHRvbkNhbGxiYWNrOk9iamVjdCx0ZW5zb3JOYW1lQ2FsbGJhY2s6T2JqZWN0LHRlbnNvcldpZGdldDpPYmplY3QsZ2V0SGVhbHRoUGlsbDpGdW5jdGlvbixfaXNUZW5zb3JWYWx1ZVNjYWxhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaXNUZW5zb3JWYWx1ZUxpbmVDaGFydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaXNUZW5zb3JWYWx1ZUltYWdlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9kYXRhU2NhbGFyOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfSwKX2xpbmVDaGFydERhdGE6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX2RhdGFJbWFnZVNyYzp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyKDEwKX19LG9ic2VydmVyczpbIl91cGRhdGVUaW1lSW5kaWNlc1RvZ2dsZSh0aW1lSW5kaWNlcykiXSxyZW5kZXJUZW5zb3JWYWx1ZSgpe2lmKHRoaXMudGVuc29yTmFtZSlpZihudWxsPT10aGlzLnNsaWNpbmcpe3RoaXMuc2V0KCJfdXNlVGVuc29yV2lkZ2V0IiwhMCk7Y29uc3QgZD17c3BlYzp7ZHR5cGU6dGhpcy5kdHlwZSxzaGFwZTp0aGlzLnNoYXBlfSxnZXQ6KCk9Pnt0aHJvdyBFcnJvcigidGVuc29yVmlldy5nZXQoKSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiIpO30sdmlldzpmPT57Y29uc3QgaD10aGlzO3JldHVybiBoYyhmdW5jdGlvbiooKXtjb25zdCBrPWguc2hhcGUubGVuZ3RoLHQ9Zi5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKG09PgptLmRpbSksbD1mLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAobT0+bS5pbmRleCk7bGV0IHA9IlsiO2ZvcihsZXQgbT0wO208azsrK20pLTEhPT10LmluZGV4T2YobSk/cCs9YCR7bFt0LmluZGV4T2YobSldfWA6Zi52aWV3aW5nRGltc1swXT09PW0/cCs9YCR7Zi52ZXJ0aWNhbFJhbmdlWzBdfToke2YudmVydGljYWxSYW5nZVsxXX1gOmYudmlld2luZ0RpbXNbMV09PT1tJiYocCs9YCR7Zi5ob3Jpem9udGFsUmFuZ2VbMF19OiR7Zi5ob3Jpem9udGFsUmFuZ2VbMV19YCksbTxrLTEmJihwKz0iLCIpO3ArPSJdIjtyZXR1cm4gbmV3IFByb21pc2UoKG0sbik9Pntjb25zdCBxPWguX2dldFRlbnNvckRhdGFVUkwoe3dhdGNoX2tleTpoLnRlbnNvck5hbWUrIjoiK2guZGVidWdPcCxzbGljaW5nOnAsdGltZV9pbmRpY2VzOmgudGltZUluZGljZXMsbWFwcGluZzoibm9uZSJ9KTtoLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHEpLnRoZW4odT0+e251bGw9PXUuZXJyb3I/bSh1LnRlbnNvcl9kYXRhW3UudGVuc29yX2RhdGEubGVuZ3RoLQoxXSk6bih1LmVycm9yKX0pLmNhdGNoKHU9Pm4odSkpfSl9KX0sZ2V0TnVtZXJpY1N1bW1hcnk6KCk9Pntjb25zdCBmPXRoaXM7cmV0dXJuIGhjKGZ1bmN0aW9uKigpe3JldHVybiBuZXcgUHJvbWlzZSgoaCxrKT0+e2NvbnN0IHQ9Zi50ZW5zb3JOYW1lKyI6IitmLmRlYnVnT3A7Zi5nZXRIZWFsdGhQaWxsKHQsZi5kZXZpY2VOYW1lLGYubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxsPT57bnVsbD09bD9rKGBGYWlsZWQgdG8gZ2V0IGhlYWx0aCBwaWxsIGZvciB3YXRjaCBrZXkgJHt0fWApOmgoe2VsZW1lbnRDb3VudDpsWzFdLG1pbmltdW06bFs4XSxtYXhpbXVtOmxbOV19KX0pfSl9KX19O3NldFRpbWVvdXQoKCk9PntudWxsPT10aGlzLnRlbnNvcldpZGdldCYmKHRoaXMudGVuc29yV2lkZ2V0PXRlbnNvcl93aWRnZXQudGVuc29yV2lkZ2V0KHRoaXMuJCQoIiN0ZW5zb3Itd2lkZ2V0IiksZCx7d2hlZWxab29tS2V5OiJhbHQifSkpO3RoaXMudGVuc29yV2lkZ2V0LnJlbmRlcigpfSwKMTApfWVsc2V7dGhpcy5zZXQoIl91c2VUZW5zb3JXaWRnZXQiLCExKTt2YXIgYj10aGlzLl9yYW5rRnJvbVNsaWNpbmcodGhpcy5zbGljaW5nLnRyaW0oKSk7Y29uc3QgZD10aGlzLl9pc1RpbWVJbmRpY2VzU2luZ2xlU3RlcCh0aGlzLnRpbWVJbmRpY2VzKTtsZXQgZj1iO2lmKCFkKXtpZigxPGIpe3RoaXMuX3Nob3dUb2FzdCgiSGlzdG9yeSBmb3IgdGVuc29ycyBceDNlIDFEIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpO3JldHVybn1mKz0xfWI9dGhpcy5fZ2V0VGVuc29yRGF0YVVSTCh7d2F0Y2hfa2V5OnRoaXMudGVuc29yTmFtZSsiOiIrdGhpcy5kZWJ1Z09wLHNsaWNpbmc6dGhpcy5zbGljaW5nLHRpbWVfaW5kaWNlczp0aGlzLnRpbWVJbmRpY2VzLG1hcHBpbmc6Mjw9Zj8iaW1hZ2UvcG5nIjoibm9uZSJ9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oaD0+e3RoaXMuJCQoIiNkZWJ1Zy1vcCIpLnRleHRDb250ZW50PXRoaXMuX2NhbGN1bGF0ZURlYnVnT3BUb0Rpc3BsYXkoKTsKaWYobnVsbCE9aC5lcnJvcil0aGlzLl9zaG93VG9hc3QoaC5lcnJvci50eXBlKyI6ICIraC5lcnJvci5tZXNzYWdlKTtlbHNlIGlmKGg9ZD9oLnRlbnNvcl9kYXRhWzBdOmgudGVuc29yX2RhdGEsMD09PWYpdGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoInNjYWxhciIpLHRoaXMuc2V0KCJfZGF0YVNjYWxhciIsaCk7ZWxzZSBpZigxPT09Zil7dGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoImxpbmVDaGFydCIpO2xldCBrPXt4OltdLHk6aH07Zm9yKGxldCB0PTA7dDxoLmxlbmd0aDsrK3Qpay54LnB1c2godCsxKTt0aGlzLnNldCgiX2xpbmVDaGFydERhdGEiLGspfWVsc2UgMjw9Zj8odGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoImltYWdlIiksdGhpcy5zZXQoIl9kYXRhSW1hZ2VTcmMiLCJkYXRhOmltYWdlL3BuZztiYXNlNjQsIitoKSk6dGhpcy5fc2hvd1RvYXN0KCJWaXN1YWxpemF0aW9uIG9mIHJhbmstIitmKyIgdGVuc29ycyBpcyBub3QgeWV0IHN1cHBvcnRlZC4iKX0pfX0sCnJlZnJlc2goKXt0aGlzLnRlbnNvck5hbWUudHJpbSgpJiZ0aGlzLnJlbmRlclRlbnNvclZhbHVlKCl9LF9nZXRUZW5zb3JEYXRhVVJMKGIpe2NvbnN0IGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL3RlbnNvcl9kYXRhIik7cmV0dXJuIHZjLmFkZFBhcmFtcyhkLGIpfSxfcmFua0Zyb21TbGljaW5nKGIpe2Iuc3RhcnRzV2l0aCgiWyIpJiYoYj1iLnNsaWNlKDEsYi5sZW5ndGgtMSkpO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gMDt7Yj1iLnNwbGl0KCIsIik7bGV0IGQ9Yi5sZW5ndGg7Zm9yKGNvbnN0IGYgb2YgYilpc05hTihOdW1iZXIoZikpfHxkLS07cmV0dXJuIGR9fSxfc2V0VmlzdWFsaXphdGlvblR5cGUoYil7InNjYWxhciI9PT1iPyh0aGlzLnNldCgiX2lzVmFsdWVTY2FsYXIiLCEwKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToibGluZUNoYXJ0Ij09PWI/KHRoaXMuc2V0KCJfaXNWYWx1ZVNjYWxhciIsCiExKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCEwKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToiaW1hZ2UiPT09Yj8odGhpcy5zZXQoIl9pc1ZhbHVlU2NhbGFyIiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlTGluZUNoYXJ0IiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlSW1hZ2UiLCEwKSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCB2aXN1YWxpemF0aW9uVHlwZToiLGIpfSxfdGltZUluZGljZXNUb2dnbGVCdXR0b25DYWxsYmFjaygpeyJmdWxsIGhpc3RvcnkiPT09UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCk/dGhpcy5zZXQoInRpbWVJbmRpY2VzIiwiOiIpOnRoaXMuc2V0KCJ0aW1lSW5kaWNlcyIsIi0xIik7dGhpcy5yZW5kZXJUZW5zb3JWYWx1ZSgpfSxfdXBkYXRlVGltZUluZGljZXNUb2dnbGUoYil7dGhpcy5faXNUaW1lSW5kaWNlc1NpbmdsZVN0ZXAoYik/UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50PQoiRnVsbCBIaXN0b3J5IjpQb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iKSkudGV4dENvbnRlbnQ9IkxhdGVzdCBUaW1lIFBvaW50In0sX2lzVGltZUluZGljZXNTaW5nbGVTdGVwKGIpe2Iuc3RhcnRzV2l0aCgiWyIpJiYoYj1iLnNsaWNlKDEsYi5sZW5ndGgtMSkpO3JldHVybiFpc05hTihOdW1iZXIoYikpfSxfY2FsY3VsYXRlRGVidWdPcFRvRGlzcGxheSgpe3JldHVybiJEZWJ1Z0lkZW50aXR5Ij09PXRoaXMuZGVidWdPcD8iIjp0aGlzLmRlYnVnT3B9LF9zaG93VG9hc3QoYil7dGhpcy4kLnRlbnNvclZhbHVlVG9hc3Quc2V0QXR0cmlidXRlKCJ0ZXh0IixiKTt0aGlzLiQudGVuc29yVmFsdWVUb2FzdC5vcGVuKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Iixwcm9wZXJ0aWVzOntjb250aW51ZVRvQ2FsbGJhY2s6RnVuY3Rpb24sdGVuc29yTmFtZUNsaWNrZWQ6RnVuY3Rpb24sX3RlbnNvclZpZXdDb3VudGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxnZXRIZWFsdGhQaWxsOkZ1bmN0aW9ufSxhZGRWaWV3KGIpe2NvbnN0IGQ9dGhpcy4kJCgiI211bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciIpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGYtdGVuc29yLXZhbHVlLXZpZXciKTtmLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJkZWJ1Z2dlci10ZW5zb3ItdmlldyIpO2Yudmlld0lkPWIudmlld0lkO2YudGVuc29yTmFtZT1iLnRlbnNvck5hbWU7Zi5kZWJ1Z09wPWIuZGVidWdPcDtmLmRldmljZU5hbWU9Yi5kZXZpY2VOYW1lO2YubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZT1iLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU7Zi5kdHlwZT1iLmR0eXBlO2Yuc2hhcGU9Yi5zaGFwZTsKZi5zbGljaW5nPWIuc2xpY2luZztmLnRpbWVJbmRpY2VzPWIudGltZUluZGljZXM7Zi5jbG9zZUJ1dHRvbkNhbGxiYWNrPXRoaXMuX2NyZWF0ZUNsb3NlQnV0dG9uQ2FsbGJhY2soYi52aWV3SWQpO2YuY29udGludWVUb0J1dHRvbkNhbGxiYWNrPSgpPT57dGhpcy5jb250aW51ZVRvQ2FsbGJhY2soYi5kZXZpY2VOYW1lLGIubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSl9O2YudGVuc29yTmFtZUNhbGxiYWNrPSgpPT57dGhpcy50ZW5zb3JOYW1lQ2xpY2tlZChiLmRldmljZU5hbWUsYi5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lKX07Zi5nZXRIZWFsdGhQaWxsPXRoaXMuZ2V0SGVhbHRoUGlsbDtkLmFwcGVuZENoaWxkKGYpO2YucmVmcmVzaCgpfSxnZXRWaWV3cygpe2NvbnN0IGI9W107Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKSxkPT57Yi5wdXNoKHt2aWV3SWQ6ZC52aWV3SWQsdGVuc29yTmFtZTpkLnRlbnNvck5hbWUsCmRlYnVnT3A6ZC5kZWJ1Z09wLHNsaWNpbmc6ZC5zbGljaW5nLHRpbWVJbmRpY2VzOmQudGltZUluZGljZXN9KX0pO3JldHVybiBifSxyZW5kZXJUZW5zb3JWYWx1ZXMoKXtfLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpLGI9PntiLnJlbmRlclRlbnNvclZhbHVlKCl9KX0sX3JlZHJhd1ZpZXdzKGIpe2NvbnN0IGQ9dGhpcy4kJCgiI211bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciIpO18uZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRlYnVnZ2VyLXRlbnNvci12aWV3IiksZj0+e2QucmVtb3ZlQ2hpbGQoZil9KTtfLmZvckVhY2goYixmPT57dGhpcy5hZGRWaWV3KGYpfSl9LF9jcmVhdGVDbG9zZUJ1dHRvbkNhbGxiYWNrKGIpe3JldHVybigpPT57Y29uc3QgZD1bXSxmPXRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKTtmb3IobGV0IGg9MDtoPGYubGVuZ3RoOysraCl7Y29uc3Qgaz0KZltoXTtrLnZpZXdJZCE9PWImJmQucHVzaCh7dmlld0lkOmsudmlld0lkLHRlbnNvck5hbWU6ay50ZW5zb3JOYW1lLGRlYnVnT3A6ay5kZWJ1Z09wLGR0eXBlOmsuZHR5cGUsc2hhcGU6ay5zaGFwZSxzbGljaW5nOmsuc2xpY2luZyx0aW1lSW5kaWNlczprLnRpbWVJbmRpY2VzfSl9dGhpcy5fcmVkcmF3Vmlld3MoZCl9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90ZW5zb3Itc2hhcGUtaGVscGVyLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYsaCl7cmV0dXJuIGY8PWg/Ijo6IjoiOjoiK01hdGguY2VpbChmL2gpfWIuZ2V0RGVmYXVsdFNsaWNpbmc9ZnVuY3Rpb24oZil7cmV0dXJuIDA9PT1mLmxlbmd0aD8iIjoxPT09Zi5sZW5ndGg/IlsiK2QoZlswXSwxRTMpKyJdIjoyPT09Zi5sZW5ndGg/IlsiK2QoZlswXSwyNTApKyIsICIrZChmWzFdLDI1MCkrIl0iOm51bGx9O2IucmFua0Zyb21TbGljaW5nPWZ1bmN0aW9uKGYpe2Yuc3RhcnRzV2l0aCgiWyIpJiYoZj1mLnNsaWNlKDEsZi5sZW5ndGgtMSkpO2lmKDA9PT1mLmxlbmd0aClyZXR1cm4gMDt7Zj1mLnNwbGl0KCIsIik7bGV0IGg9Zi5sZW5ndGg7Zm9yKGNvbnN0IGsgb2YgZilpc05hTihOdW1iZXIoaykpfHxoLS07cmV0dXJuIGh9fX0pKFZpfHwoVmk9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItZGFzaGJvYXJkLmh0bWwuanMKY29uc3QgWmk9KCk9PndpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsSGs9KCk9PndpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsSWs9KFppKCktNzApLzI7ClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e190b3BSaWdodFRhYnM6e3R5cGU6QXJyYXksdmFsdWU6W3tpZDoidGFiLXJ1bnRpbWUtZ3JhcGhzIixuYW1lOiJSdW50aW1lIEdyYXBocyJ9LHtpZDoidGFiLXRlbnNvci12YWx1ZXMiLG5hbWU6IlRlbnNvciBWYWx1ZXMifV0scmVhZG9ubHk6ITB9LF9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdG9wUmlnaHRTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6IjAiLG9ic2VydmVyOiJfdG9wUmlnaHRTZWxlY3RlZENoYW5nZWQifSxfbG9uZ1BvbGxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3N0ZXBCdXR0b25UZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiU3RlcCJ9LF9jb250aW51ZUJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiJ9LApfdGVuc29yVmlld0lkQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saXNSZWxvYWREaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSxhbHJlYWR5U3RhcnRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY3VycmVudFNlc3Npb25SdW5JbmZvOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfc2Vzc2lvblJ1blRvdGFsQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3Nlc3Npb25SdW5Db3VudGVyczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2FjdGl2ZVNlc3Npb25SdW5LZXk6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX2FjdGl2ZVNlc3Npb25SdW5OdW1EZXZpY2VzOnt0eXBlOk51bWJlcix2YWx1ZTotMX0sX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWU6e3R5cGU6U3RyaW5nLAp2YWx1ZTpudWxsLG5vdGlmeTohMH0sX2hpZ2hsaWdodE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY29udGludWVUb1R5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9jb250aW51ZVN0b3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NvbnRpbnVlVG9UYXJnZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXJUYXJnZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOi0xfSxfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lOlN0cmluZyxfZm9yY2VFeHBhbmROb2RlTmFtZTpTdHJpbmcsX3NvdXJjZUZvY3VzTm9kZU5hbWU6U3RyaW5nLF9zb3VyY2VDb2RlU2hvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3Nob3dTb3VyY2VDb2RlQ2hhbmdlZCJ9LF9ncmFwaFByb2dyZXNzOnt0eXBlOk9iamVjdH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+Cm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcig1MCl9LF9idXN5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9sZWZ0UGFuZVdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTpwZC5nZXROdW1iZXJJbml0aWFsaXplcigiX2xlZnRQYW5lV2lkdGgiLHtkZWZhdWx0VmFsdWU6NDUwfSksb2JzZXJ2ZXI6Il9sZWZ0UGFuZVdpZHRoT2JzZXJ2ZXIifSxfbWlubGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6NDUwLHJlYWRPbmx5OiEwfSxfbWF4bGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4bGVmdFBhbmVXaWR0aChfd2luZG93V2lkdGgsIF9tYXhNYWluQ29udGVudFdpZHRoLCBfcmVzaXplcldpZHRoKSJ9LF9tYXhNYWluQ29udGVudFdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTozNTAscmVhZE9ubHk6ITB9LF90b3BSaWdodFF1YWRyYW50SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTpwZC5nZXROdW1iZXJJbml0aWFsaXplcigiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQiLAp7ZGVmYXVsdFZhbHVlOklrfSksb2JzZXJ2ZXI6Il90b3BSaWdodFF1YWRyYW50SGVpZ2h0T2JzZXJ2ZXIifSxfbWluVG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjAwLHJlYWRPbmx5OiEwfSxfbWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodChfd2luZG93SGVpZ2h0LCBfcmVzaXplcldpZHRoKSJ9LF9yZXNpemVyV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjMwLHJlYWRPbmx5OiEwfSxfd2luZG93V2lkdGg6TnVtYmVyLF93aW5kb3dIZWlnaHQ6TnVtYmVyLF9kZWJ1Z1dhdGNoZXM6QXJyYXksX2xhdGVzdFNlc3Npb25SdW46T2JqZWN0fSxvYnNlcnZlcnM6WyJfb25BY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lQ2hhbmdlKF9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lKSIsIl9zaXplRGFzaGJvYXJkUmVnaW9ucyhfbGVmdFBhbmVXaWR0aCwgX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQsIF93aW5kb3dXaWR0aCkiLAoiX2dyYXBoUHJvZ3Jlc3NVcGRhdGVkKF9ncmFwaFByb2dyZXNzKSJdLHJlYWR5KCl7dGhpcy5faGFuZGxlV2luZG93UmVzaXplKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsKCk9Pnt0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemUoKX0sITEpO3RoaXMucmVsb2FkKCl9LGxvbmdfcG9sbCgpe2NvbnN0IGI9e3BvczorK3RoaXMuX2xvbmdQb2xsQ291bnR9O2xldCBkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9jb21tIik7ZD12Yy5hZGRQYXJhbXMoZCxiKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGQpLnRoZW4oZj0+e2NvbnN0IGg9Zi50eXBlO2Y9Zi5kYXRhO2lmKCJtZXRhIj09PWgpe3ZhciBrPWYucnVuX2tleSx0PWtbMF0uc3BsaXQoIiwiKSxsPWtbMV0uc3BsaXQoIiwiKTtjb25zdCBtPWtbMl0uc3BsaXQoIiwiKTt2YXIgcD10aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5O3RoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bktleSIsCmspO3RoaXMuc2V0KCJfbGF0ZXN0U2Vzc2lvblJ1biIse2ZlZWRzOnQsZmV0Y2hlczpsLHRhcmdldHM6bX0pO3RoaXMuc2V0KCJfc2Vzc2lvblJ1blNvbGVBY3RpdmUiLCEwKTt2b2lkIDA9PT10aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2tdPyh0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2tdPVtdLHRoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMiLFtdKSk6dGhpcy5zZXQoIl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcyIsdGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1trXSk7dGhpcy5fY3VycmVudFNlc3Npb25SdW5JbmZvPXQ9IkZlZWRzOiAiK3QrIjsgRmV0Y2hlczogIitsKyI7IFRhcmdldHM6ICIrbTt0aGlzLl9zZXNzaW9uUnVuQ291bnRlcnMuaGFzT3duUHJvcGVydHkodCk/dGhpcy5fc2Vzc2lvblJ1bkNvdW50ZXJzW3RdKz0xOnRoaXMuX3Nlc3Npb25SdW5Db3VudGVyc1t0XT0xO3RoaXMuX3Nlc3Npb25SdW5Ub3RhbENvdW50ZXIrKzsKdGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKTt0aGlzLl9jb250aW51ZVRvVHlwZSYmXy5pc0VxdWFsKHAsayl8fCh0aGlzLl9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoaywhMSksdGhpcy5fYW5ub3VuY2VOZXdTZXNzaW9uUnVuKCkpfWVsc2UidGVuc29yIj09PWg/KGs9Zi5kZXZpY2VfbmFtZSxwPWYubm9kZV9uYW1lLHQ9Zi5tYXliZV9iYXNlX2V4cGFuZGVkX25vZGVfbmFtZSx0aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIT1rP3RoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsayk6IXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZ0aGlzLl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSYmKHRoaXMuX2ZvY3VzT25HcmFwaE5vZGUoayx0KSx0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGsrIi8iK3QpKSx0aGlzLnNldCgiX3Nlc3Npb25SdW5Tb2xlQWN0aXZlIiwhMSksbD1wKyI6IitmLm91dHB1dF9zbG90LHRoaXMuc2V0KCJfbGF0ZXN0VGVuc29yRGF0YSIsCntkZXZpY2VOYW1lOmssdGVuc29yTmFtZTpsLG5vZGVOYW1lOnAsbWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZTp0LGRlYnVnT3A6Zi5kZWJ1Z19vcCxkdHlwZTpmLmR0eXBlLHNoYXBlOmYuc2hhcGUsdmFsdWU6Zi52YWx1ZXN9KSx0aGlzLl9tYXliZVVwZGF0ZVRlbnNvclZhbHVlVmlld3MobCxmLmRlYnVnX29wKSx0aGlzLnNldCgiX2J1c3kiLCExKSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCBsb25nLXBvbGxpbmcgcmVzcG9uc2UgdHlwZTogIixoKTtudWxsIT10aGlzLl9jb250aW51ZVRvVHlwZSYmdGhpcy5fcHJvY2Vzc0NvbnRpbnVlVG8oaCxmKTt0aGlzLmxvbmdfcG9sbCgpfSl9LF9wcm9jZXNzQ29udGludWVUbyhiLGQpe3RoaXMuX2NvbnRpbnVlU3RvcD90aGlzLl9jbGVhckNvbnRpbnVlVG8oKToiU2Vzc2lvblJ1biI9PT10aGlzLl9jb250aW51ZVRvVHlwZT90aGlzLl9wcm9jZXNzQ29udGludWVUb1Nlc3Npb25SdW4oIm1ldGEiPT09Yik6IlRlbnNvckNvbmRpdGlvbiI9PT0KdGhpcy5fY29udGludWVUb1R5cGU/dGhpcy5fc3RlcCgpOiJvcCI9PT10aGlzLl9jb250aW51ZVRvVHlwZT90aGlzLl9wcm9jZXNzQ29udGludWVUb09wKCJtZXRhIj09PWIsZCk6bnVsbCE9dGhpcy5fY29udGludWVUb1R5cGUmJiIiIT09dGhpcy5fY29udGludWVUb1R5cGUmJmNvbnNvbGUuZXJyb3IoIkludmFsaWQgX2NvbnRpbnVlVG9UeXBlOiIsdGhpcy5fY29udGludWVUb1R5cGUpfSxfcHJvY2Vzc0NvbnRpbnVlVG9TZXNzaW9uUnVuKGIpe2ImJnRoaXMuc2V0KCJfY29udGludWVUb0NvdW50ZXIiLHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyKzEpO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyPHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0P3RoaXMuX3N0ZXAoKTp0aGlzLl9jbGVhckNvbnRpbnVlVG8oKX0sX3Byb2Nlc3NDb250aW51ZVRvT3AoYixkKXtiJiZ0aGlzLl9hbm5vdW5jZU5ld1Nlc3Npb25SdW4oKTtiPWQuZGV2aWNlX25hbWU7ZD1kLm1heWJlX2Jhc2VfZXhwYW5kZWRfbm9kZV9uYW1lOwpjb25zdCBmPW51bGw9PWQ/bnVsbDpWaS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZCk7YisiLyIrZD09PXRoaXMuX2NvbnRpbnVlVG9UYXJnZXR8fGIrIi8iK2Y9PT10aGlzLl9jb250aW51ZVRvVGFyZ2V0Pyh0aGlzLl9jbGVhckNvbnRpbnVlVG8oKSx0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsZikpOnRoaXMuX3N0ZXAoKX0sX21heWJlVXBkYXRlVGVuc29yVmFsdWVWaWV3cyhiLGQpe2NvbnN0IGY9dGhpcy4kJCgiI3RlbnNvclZhbHVlTXVsdGlWaWV3Iik7aWYobnVsbCE9Zil7dmFyIGg9ITE7Xy5mb3JFYWNoKGYuZ2V0Vmlld3MoKSxrPT57aWYoay50ZW5zb3JOYW1lPT09YiYmay5kZWJ1Z09wPT09ZClyZXR1cm4gaD0hMCwhMX0pO2gmJmYucmVuZGVyVGVuc29yVmFsdWVzKCl9fSxyZWxvYWQoKXtpZighdGhpcy5hbHJlYWR5U3RhcnRlZCl7dGhpcy5zZXQoImFscmVhZHlTdGFydGVkIiwhMCk7dmFyIGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwKIi9kZWJ1Z2dlcl9ncnBjX2hvc3RfcG9ydCIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57MDxkLnBvcnQ/KHRoaXMuJC5pbml0aWFsRGlhbG9nLm9wZW5EaWFsb2coZC5ob3N0LGQucG9ydCksdGhpcy5sb25nX3BvbGwoKSk6dGhpcy4kLmluaXRpYWxEaWFsb2cub3BlbkRpc2FibGVkRGlhbG9nKCl9KX19LF9zaG93U291cmNlQ29kZUNoYW5nZWQoKXt0aGlzLl9zb3VyY2VDb2RlU2hvd24/KHRoaXMuJCQoIiNub2RlLWVudHJpZXMiKS5zdHlsZS5oZWlnaHQ9IjQwJSIsdGhpcy4kLnNvdXJjZUNvZGVWaWV3LnJlbmRlcigpKTp0aGlzLiQkKCIjbm9kZS1lbnRyaWVzIikuc3R5bGUuaGVpZ2h0PSI4MCUifSxfc2hvd1RvYXN0KGIpe3RoaXMuJC50b2FzdC5zZXRBdHRyaWJ1dGUoInRleHQiLGIpO3RoaXMuJC50b2FzdC5vcGVuKCl9LF9hbm5vdW5jZU5ld1Nlc3Npb25SdW4oKXt0aGlzLl9zaG93VG9hc3QoIlNlc3Npb24ucnVuKCkgIyIrdGhpcy5fc2Vzc2lvblJ1blRvdGFsQ291bnRlcisKIiBpcyBzdGFydGluZy4iKX0sX2Rpc3BsYXlHcmFwaChiLGQpe2I9e3J1bl9rZXk6SlNPTi5zdHJpbmdpZnkoYiksZGV2aWNlX25hbWU6ZH07Yj12Yy5hZGRQYXJhbXMoIi9kYXRhL3BsdWdpbi9kZWJ1Z2dlci9kZWJ1Z2dlcl9ncmFwaCIsYik7dGhpcy4kLmxvYWRlci5kYXRhc2V0cz1be25hbWU6Ii9kZWJ1Z2dlcl9ncmFwaCIscGF0aDpifV07dGhpcy4kLmxvYWRlci5zZXQoInNlbGVjdGVkRGF0YXNldCIsMCl9LF9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoYixkKXtkP2NvbnNvbGUubG9nKCJQb2xsaW5nIGZvciBmaXJzdCBHcmFwaERlZiBmb3IgcnVuIGtleToiLGIpOnRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsbnVsbCk7dmFyIGY9e21vZGU6InJldHJpZXZlX2FsbCIscnVuX2tleTpKU09OLnN0cmluZ2lmeShiKX07Y29uc3QgaD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2Y9dmMuYWRkUGFyYW1zKGgsCmYpO2xldCBrPVtdO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZikudGhlbih0PT57aWYoMD09dC5kZXZpY2VfbmFtZXMubGVuZ3RoKWR8fHRoaXMuX3N0ZXAoKSx0aGlzLl9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoYiwhMCk7ZWxzZXt2YXIgbD1udWxsO2Zvcihjb25zdCBwIGluIHQuZ2F0ZWRfZ3JwY190ZW5zb3JzKWlmKHQuZ2F0ZWRfZ3JwY190ZW5zb3JzLmhhc093blByb3BlcnR5KHApKXstMT09PXRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYl0uaW5kZXhPZihwKSYmKHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYl0ucHVzaChwKSx0aGlzLiQuc2Vzc2lvblJ1bnNWaWV3LnVwZGF0ZU51bURldmljZXModGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1tiXS5sZW5ndGgpKTt0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzIix0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2JdLnNsaWNlKCkpO2w9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNbdGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMubGVuZ3RoLQoxXTtjb25zdCBtPXQuZ2F0ZWRfZ3JwY190ZW5zb3JzW3BdO2ZvcihsZXQgbj0wO248bS5sZW5ndGg7KytuKWsucHVzaCh7ZGV2aWNlX25hbWU6cCxub2RlX25hbWU6bVtuXVswXSxvcF90eXBlOm1bbl1bMV0sb3V0cHV0X3Nsb3Q6bVtuXVsyXSxkZWJ1Z19vcDptW25dWzNdfSl9bnVsbCE9bCYmKHRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsbCksdD1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiKSksbnVsbCE9dCYmdC5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIixsKSk7Vmkuc29ydEFuZEJhc2VFeHBhbmREZWJ1Z1dhdGNoZXMoayk7dGhpcy5zZXQoIl9kZWJ1Z1dhdGNoZXMiLGspO3RoaXMuJC5zb3VyY2VDb2RlVmlldy5yZW5kZXIoayl9fSl9LF9jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpe3JldHVybihiLGQpPT57ZD1kPyJicmVhayI6ImRpc2FibGUiO3RoaXMuX3JlcXVlc3RCcmVha3BvaW50U3RhdGVDaGFuZ2UoVmkuZ2V0Q2xlYW5Ob2RlTmFtZShiLmRldmljZV9uYW1lKwoiLyIrYi5ub2RlX25hbWUpLGIub3V0cHV0X3Nsb3QsYi5kZWJ1Z19vcCxkKX19LF9mb2N1c09uR3JhcGhOb2RlKGIsZCl7bnVsbCE9YiYmdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSE9PWImJnRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsYik7dGhpcy5fc2V0VG9wUmlnaHRSdW50aW1lR3JhcGhzVG9BY3RpdmUoKTtjb25zdCBmPXRoaXMuJCQoIiNncmFwaCIpO2lmKGYuc2VsZWN0ZWROb2RlPT09ZClmLnBhblRvTm9kZShkKTtlbHNle2NvbnN0IGg9Zi5nZXQoInJlbmRlckhpZXJhcmNoeSIpLmhpZXJhcmNoeS5nZXROb2RlTWFwKCk7bnVsbD09aFtkXSYmKGQ9VmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKTtudWxsIT1oW2RdJiZmLnNldCgic2VsZWN0ZWROb2RlIixkKX10aGlzLnNldCgiX2hpZ2hsaWdodE5vZGVOYW1lIixiKyIvIitkKX0sX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpe3JldHVybihiLGQsZik9Pnt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJgohMCE9PWYmJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKTt0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGIsZCk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixiKyIvIitkKX19LF9jcmVhdGVGZWVkRmV0Y2hUYXJnZXRDbGlja2VkSGFuZGxlcigpe3JldHVybiBiPT57bGV0IGQ9YjstMSE9PWQuaW5kZXhPZigiOiIpJiYoZD1kLnNsaWNlKDAsZC5pbmRleE9mKCI6IikpKTtiPV8uZmluZCh0aGlzLl9kZWJ1Z1dhdGNoZXMsZj0+Zi5ub2RlX25hbWU9PT1kfHwwPT09Zi5ub2RlX25hbWUuaW5kZXhPZihkKSYmIigiPT09Zi5ub2RlX25hbWVbZC5sZW5ndGhdKTtudWxsPT1iP3RoaXMuX3Nob3dUb2FzdCgiTm9kZSAnIitkKyInIGlzIG5vdCBpbiB0aGUgcnVudGltZSBncmFwaCBvZiB0aGUgY3VycmVudCBTZXNzaW9uLnJ1biBvciBkb2VzIG5vdCBoYXZlIGEgZGVidWcgb3AgYXR0YWNoZWQuIik6dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShiLmRldmljZV9uYW1lLApkKX19LF9jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpe3JldHVybiBiPT57dGhpcy5fc2V0VG9wUmlnaHRUZW5zb3JWYWx1ZXNUb0FjdGl2ZSgpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLiQkKCIjdGVuc29yVmFsdWVNdWx0aVZpZXciKS5hZGRWaWV3KHt2aWV3SWQ6dGhpcy5fY3JlYXRlVGVuc29yVmlld0lkKCksZGV2aWNlTmFtZTpiLmRldmljZU5hbWUsdGVuc29yTmFtZTpiLnRlbnNvck5hbWUsbm9kZU5hbWU6Yi5ub2RlTmFtZSxtYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lOmIubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxkZWJ1Z09wOmIuZGVidWdPcCxkdHlwZTpiLmR0eXBlLHNoYXBlOmIuc2hhcGUsc2xpY2luZzpWaS5nZXREZWZhdWx0U2xpY2luZyhiLnNoYXBlKSx0aW1lSW5kaWNlczoiLTEifSl9LDEwKX19LF9jcmVhdGVUZW5zb3JWaWV3SWQoKXtjb25zdCBiPSJkZWJ1Z2dlci10ZW5zb3Itdmlldy0iK3RoaXMuX3RlbnNvclZpZXdJZENvdW50ZXI7dGhpcy5fdGVuc29yVmlld0lkQ291bnRlcisrOwpyZXR1cm4gYn0sX2NyZWF0ZU5vZGVDb250ZXh0TWVudUl0ZW1zKCl7cmV0dXJuW3t0aXRsZTooKT0+IkV4cGFuZCBhbmQgaGlnaGxpZ2h0IixhY3Rpb246Yj0+e2NvbnN0IGQ9VmkuZ2V0Q2xlYW5Ob2RlTmFtZShiLm5vZGUubmFtZSk7Yj10aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lKyIvIitiLm5vZGUubmFtZTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGIpO3RoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLGIpO3RoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixWaS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZCkpfX0se3RpdGxlOigpPT4iQWRkIGJyZWFrcG9pbnQiLGFjdGlvbjpiPT57Y29uc3QgZD1WaS5nZXRDbGVhbk5vZGVOYW1lKGIubm9kZS5uYW1lKTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZSIsdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSsKIi8iK2Iubm9kZS5uYW1lKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKX19LHt0aXRsZTooKT0+IkNvbnRpbnVlIHRvIixhY3Rpb246Yj0+ey0xIT09WyJfQXJnIiwiX1JldHZhbCJdLmluZGV4T2YoYi5ub2RlLm9wKT90aGlzLl9zaG93VG9hc3QoJ0Nhbm5vdCBjb250aW51ZSB0byBub2RlICInK2Iubm9kZS5uYW1lKyciLCBkdWUgdG8gb3AgdHlwZSAiJytiLm5vZGUub3ArJyIuJyk6dGhpcy5fY29udGludWVUb05vZGUodGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSxiLm5vZGUubmFtZSl9fV19LF9jcmVhdGVHZXRIZWFsdGhQaWxsKCl7cmV0dXJuKGIsZCxmLGgpPT57dmFyIGs9e3dhdGNoX2tleTpiLHRpbWVfaW5kaWNlczoiLTEiLG1hcHBpbmc6ImhlYWx0aC1waWxsIn07Y29uc3QgdD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLAoiL3RlbnNvcl9kYXRhIik7az12Yy5hZGRQYXJhbXModCxrKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGspLnRoZW4obD0+e2w9bC50ZW5zb3JfZGF0YVswXTtoKGwpO3RoaXMuX2NvbmRpdGlvbmFsSGVhbHRoUGlsbFN0b3AoYixkLGYsbCl9KX19LF9jb25kaXRpb25hbEhlYWx0aFBpbGxTdG9wKGIsZCxmLGgpe2lmKCJUZW5zb3JDb25kaXRpb24iPT09dGhpcy5fY29udGludWVUb1R5cGUmJlZpLmNoZWNrSGVhbHRoUGlsbEFnYWluc3RUZW5zb3JDb25kaXRpb25LZXkodGhpcy5fY29udGludWVUb1RhcmdldCxoLHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0KSl7dGhpcy5zZXQoIl9jb250aW51ZVN0b3AiLCEwKTtoPVZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihmKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsaCk7dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShkLGYpO2NvbnN0IGs9ZCsiLyIrZjt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLAprKTtzZXRUaW1lb3V0KCgpPT57dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsbnVsbCk7dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsayl9LDEwMCk7dGhpcy5fc2hvd1RvYXN0KCdUZW5zb3IgY29uZGl0aW9uICInK3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQrJyIgaXMgbWV0IGJ5IHdhdGNoIGtleTogIicrYisnIi5cblN0b3BwaW5nIGNvbnRpbnVhdGlvbi4nKX19LF9jb250aW51ZVRvTm9kZShiLGQpe2NvbnN0IGY9VmkuZ2V0Q2xlYW5Ob2RlTmFtZShkKTtiPWIrIi8iK2Q7dGhpcy5fcmVxdWVzdEJyZWFrcG9pbnRTdGF0ZUNoYW5nZShmLDAsIkRlYnVnSWRlbnRpdHkiLCJicmVhayIpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lIixiKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGYpKTt0aGlzLl9zZXRDb250aW51ZVRvKCJvcCIsYik7CnRoaXMuJC5jb250aW51ZURpYWxvZy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApO3RoaXMuX3N0ZXAoKX0sX2NyZWF0ZUNvbnRpbnVlVG9Ob2RlSGFuZGxlcigpe3JldHVybihiLGQpPT57dGhpcy5fY29udGludWVUb05vZGUoYixkKX19LF9vbkFjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWVDaGFuZ2UoYil7Y29uc3QgZD1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSIpKTtpZigwPHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmxlbmd0aCl7bGV0IGY7Zj1iKygiIChkZXZpY2UgIisodGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMuaW5kZXhPZihiKSsxKSsiIG9mICIrdGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMubGVuZ3RoKyIpIik7dGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJm51bGwhPWQmJihkLnRleHRDb250ZW50PWYpfWVsc2UgdGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJgpudWxsIT1kJiYoZC50ZXh0Q29udGVudD0iV2FpdGluZyBmb3IgZGV2aWNlLi4uIik7bnVsbCE9YiYmdGhpcy5fZGlzcGxheUdyYXBoKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXksYil9LF9zdGVwKCl7aWYobnVsbCE9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleSl7dGhpcy5zZXQoIl9idXN5IiwhMCk7dmFyIGI9e21vZGU6InJldHJpZXZlX2RldmljZV9uYW1lcyIscnVuX2tleTpKU09OLnN0cmluZ2lmeSh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5KX0sZD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2I9dmMuYWRkUGFyYW1zKGQsYik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGY9PntsZXQgaD0hMTtmb3IobGV0IGs9MDtrPGYuZGV2aWNlX25hbWVzLmxlbmd0aDsrK2spaWYoLTE9PT10aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5pbmRleE9mKGYuZGV2aWNlX25hbWVzW2tdKSl7aD0hMDticmVha31mPQp2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvYWNrIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKCgpPT57aCYmdGhpcy5fcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXksITEpfSl9KX19LF9jcmVhdGVTZXNzaW9uUnVuR28oKXtyZXR1cm4gYj0+e3RoaXMuX3NldENvbnRpbnVlVG8oIlNlc3Npb25SdW4iLHRoaXMuX2N1cnJlbnRTZXNzaW9uUnVuSW5mbyxiKTt0aGlzLl9zdGVwKCl9fSxfY3JlYXRlVGVuc29yQ29uZGl0aW9uR28oKXtyZXR1cm4oYixkKT0+e3RoaXMuX3NldENvbnRpbnVlVG8oIlRlbnNvckNvbmRpdGlvbiIsYixkKTt0aGlzLiQudGVuc29yRGF0YVN1bW1hcnkuZW5hYmxlSGVhbHRoUGlsbHMoKTt0aGlzLl9zdGVwKCl9fSxfY3JlYXRlRm9yY2VDb250aW51YXRpb25TdG9wKCl7cmV0dXJuKCk9Pnt0aGlzLl9zaG93VG9hc3QoJ0NvbnRpbnVhdGlvbiBvZiB0eXBlICInK3RoaXMuX2NvbnRpbnVlVG9UeXBlKwonIiB3YXMgaW50ZXJydXB0ZWQgYnkgdXNlci4nKTt0aGlzLnNldCgiX2NvbnRpbnVlU3RvcCIsITApfX0sX3NldENvbnRpbnVlVG8oYixkLGY9LTEpe3RoaXMuX2NvbnRpbnVlVG9UeXBlPWI7dGhpcy5fY29udGludWVUb1RhcmdldD1kO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0PWY7dGhpcy5fY29udGludWVUb0NvdW50ZXI9MDt0aGlzLl9jb250aW51ZVN0b3A9ITF9LF9jbGVhckNvbnRpbnVlVG8oKXt0aGlzLiQuY29udGludWVEaWFsb2cubm90aWZ5Q29udGludWF0aW9uU3RvcCgpO3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQ9dGhpcy5fY29udGludWVUb1R5cGU9IiI7dGhpcy5fY29udGludWVUb0NvdW50ZXJUYXJnZXQ9LTE7dGhpcy5fY29udGludWVUb0NvdW50ZXI9MDt0aGlzLl9jb250aW51ZVN0b3A9ITE7dGhpcy5zZXQoIl9idXN5IiwhMSl9LF9jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKXtyZXR1cm4oYixkKT0+e3RoaXMuX3NldENvbnRpbnVlVG8oIm9wIixiKyIvIisKZCk7dGhpcy5fc3RlcCgpO3RoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiZ0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGIsZCk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixiKyIvIitkKX19LF90b3BSaWdodFNlbGVjdGVkQ2hhbmdlZChiKXtiPXRoaXMuX3RvcFJpZ2h0VGFic1tiXS5pZDt0aGlzLnNldCgiX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlIiwidGFiLXJ1bnRpbWUtZ3JhcGhzIj09PWIpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsInRhYi10ZW5zb3ItdmFsdWVzIj09PWIpfSxfc2V0VG9wUmlnaHRSdW50aW1lR3JhcGhzVG9BY3RpdmUoKXt0aGlzLnNldCgiX3RvcFJpZ2h0U2VsZWN0ZWQiLCIwIik7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsITApO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsITEpfSxfc2V0VG9wUmlnaHRUZW5zb3JWYWx1ZXNUb0FjdGl2ZSgpe3RoaXMuc2V0KCJfdG9wUmlnaHRTZWxlY3RlZCIsCiIxIik7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsITEpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsITApfSxfcmVxdWVzdEJyZWFrcG9pbnRTdGF0ZUNoYW5nZShiLGQsZixoKXtiPXttb2RlOiJzZXRfc3RhdGUiLG5vZGVfbmFtZTpiLG91dHB1dF9zbG90OmQsZGVidWdfb3A6ZixzdGF0ZTpofTtkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9nYXRlZF9ncnBjIik7Yj12Yy5hZGRQYXJhbXMoZCxiKTt0aGlzLnNldCgiX2J1c3kiLCEwKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oaz0+e3RoaXMuc2V0KCJfYnVzeSIsITEpO2NvbnNvbGUubG9nKCJCcmVha3BvaW50IHNldF9zdGF0ZSByZXNwb25zZTogIixrKX0pfSxfZ3JhcGhQcm9ncmVzc1VwZGF0ZWQoYil7Y29uc3QgZD10aGlzLiQkKCIjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciIpO251bGw9PXRoaXMuX2xhdGVzdFNlc3Npb25SdW4/CihkLnNldEF0dHJpYnV0ZSgidmFsdWUiLDApLHRoaXMuc2V0KCJfYnVzeSIsITEpKTooZC5zZXRBdHRyaWJ1dGUoInZhbHVlIixiLnZhbHVlKSx0aGlzLnNldCgiX2J1c3kiLDEwMD5iLnZhbHVlKSl9LF9oYW5kbGVXaW5kb3dSZXNpemUoKXt0aGlzLnNldCgiX3dpbmRvd1dpZHRoIixIaygpKTt0aGlzLnNldCgiX3dpbmRvd0hlaWdodCIsWmkoKSk7dGhpcy5fc2l6ZURhc2hib2FyZFJlZ2lvbnModGhpcy5fbGVmdFBhbmVXaWR0aCx0aGlzLl90b3BSaWdodFF1YWRyYW50SGVpZ2h0LHRoaXMuX3dpbmRvd1dpZHRoKX0sX2NvbXB1dGVNYXhsZWZ0UGFuZVdpZHRoKGIsZCxmKXtyZXR1cm4gYi1kLWZ9LF9jb21wdXRlTWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodChiLGQpe3JldHVybiBiLWQtNzB9LF9zaXplRGFzaGJvYXJkUmVnaW9ucyhiLGQsZil7dGhpcy4kJCgiI2xlZnQtcGFuZSIpLnN0eWxlLndpZHRoPWIrInB4IjtiPWYtYi10aGlzLl9yZXNpemVyV2lkdGgtODt0aGlzLiQkKCIjY2VudGVyLWNvbnRlbnQiKS5zdHlsZS53aWR0aD0KYisicHgiO2I9ZC10aGlzLl9yZXNpemVyV2lkdGg7dGhpcy4kJCgiI3RvcC1yaWdodC1xdWFkcmFudCIpLnN0eWxlLmhlaWdodD1iKyJweCI7dGhpcy4kJCgiI3RlbnNvci1kYXRhIikuc3R5bGUudG9wPWQrInB4In0sX2xlZnRQYW5lV2lkdGhPYnNlcnZlcjpwZC5nZXROdW1iZXJPYnNlcnZlcigiX2xlZnRQYW5lV2lkdGgiLHtkZWZhdWx0VmFsdWU6NDUwfSksX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHRPYnNlcnZlcjpwZC5nZXROdW1iZXJPYnNlcnZlcigiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQiLHtkZWZhdWx0VmFsdWU6SWt9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLW1hdGVyaWFsL3BhcGVyLW1hdGVyaWFsLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLW1hdGVyaWFsIixwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZToxfSxhbmltYXRlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkL3RmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQiLHByb3BlcnRpZXM6e3JlbmRlckhpZXJhcmNoeTpPYmplY3QsZGVidWdnZXJOdW1lcmljQWxlcnRzOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sbm9kZU5hbWVzVG9IZWFsdGhQaWxsczpPYmplY3QsaGVhbHRoUGlsbFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxlY3RlZE5vZGVJbmNsdWRlOnt0eXBlOk51bWJlcixub3RpZnk6ITB9LGFyZUhlYWx0aFBpbGxzTG9hZGluZzpCb29sZWFuLGhlYWx0aFBpbGxFbnRyaWVzOnt0eXBlOkFycmF5LHZhbHVlOnRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzLHJlYWRPbmx5OiEwfSxoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlOnt0eXBlOkFycmF5LApjb21wdXRlZDoiX2NvbXB1dGVIZWFsdGhQaWxsRm9yTm9kZShub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4LCBzZWxlY3RlZE5vZGUsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIGFyZUhlYWx0aFBpbGxzTG9hZGluZykifSxhbGxTdGVwc01vZGVFbmFibGVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfYmlnZ2VzdFN0ZXBFdmVyU2Vlbjp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlQmlnZ2VzdFN0ZXBFdmVyU2Vlbihub2RlTmFtZXNUb0hlYWx0aFBpbGxzKSJ9LF9tYXhTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFN0ZXBJbmRleChub2RlTmFtZXNUb0hlYWx0aFBpbGxzKSJ9LF9jdXJyZW50U3RlcERpc3BsYXlWYWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXBEaXNwbGF5VmFsdWUobm9kZU5hbWVzVG9IZWFsdGhQaWxscywgaGVhbHRoUGlsbFN0ZXBJbmRleCwgYWxsU3RlcHNNb2RlRW5hYmxlZCwgc3BlY2lmaWNIZWFsdGhQaWxsU3RlcCwgYXJlSGVhbHRoUGlsbHNMb2FkaW5nKSJ9fSwKb2JzZXJ2ZXJzOlsiX3VwZGF0ZUFsZXJ0c0xpc3QoZGVidWdnZXJOdW1lcmljQWxlcnRzKSJdLHJlYWR5OmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5Db250YWluZXIiKSxkPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRmLWRhc2hib2FyZC1sYXlvdXQgLnNjcm9sbGJhciIpO2ImJmQmJihiLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGQuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpfSxfaGVhbHRoUGlsbHNBdmFpbGFibGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYiYmZH0sX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZzpmdW5jdGlvbihiLGQpe3JldHVybiBiP2JbZF0udG9GaXhlZCgwKToiIn0sX2NvbXB1dGVIZWFsdGhQaWxsRm9yTm9kZTpmdW5jdGlvbihiLGQsZixoLGspe2lmKGt8fCFmKXJldHVybiBudWxsO2I9YltmXTtyZXR1cm4gYj8oZD1iW2g/MDpkXSk/ZC52YWx1ZS5zbGljZSgyLDgpOm51bGw6bnVsbH0sX2NvbXB1dGVDdXJyZW50U3RlcERpc3BsYXlWYWx1ZTpmdW5jdGlvbihiLApkLGYsaCxrKXtpZihmKXJldHVybiBoLnRvRml4ZWQoMCk7aWYoaylyZXR1cm4gMDtmb3IobGV0IHQgaW4gYilyZXR1cm4gYlt0XVtkXS5zdGVwLnRvRml4ZWQoMCk7cmV0dXJuIDB9LF9jb21wdXRlQmlnZ2VzdFN0ZXBFdmVyU2VlbjpmdW5jdGlvbihiKXtmb3IobGV0IGQgaW4gYilyZXR1cm4gYj1iW2RdLE1hdGgubWF4KHRoaXMuX2JpZ2dlc3RTdGVwRXZlclNlZW4sYltiLmxlbmd0aC0xXS5zdGVwKTtyZXR1cm4gdGhpcy5fYmlnZ2VzdFN0ZXBFdmVyU2Vlbnx8MH0sX2NvbXB1dGVNYXhTdGVwSW5kZXg6ZnVuY3Rpb24oYil7Zm9yKGxldCBkIGluIGIpcmV0dXJuIGJbZF0ubGVuZ3RoLTE7cmV0dXJuIDB9LF9oYXNEZWJ1Z2dlck51bWVyaWNBbGVydHM6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIubGVuZ3RofSxfdXBkYXRlQWxlcnRzTGlzdDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLiQkKCIjbnVtZXJpYy1hbGVydHMtYm9keSIpO2lmKGQpe2QuaW5uZXJIVE1MPSIiO2Zvcih2YXIgZj0KMDtmPGIubGVuZ3RoO2YrKyl7dmFyIGg9YltmXSxrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO3QuaW5uZXJIVE1MPXRmLmdyYXBoLnV0aWwuY29tcHV0ZUh1bWFuRnJpZW5kbHlUaW1lKGguZmlyc3RfdGltZXN0YW1wKTt0LmNsYXNzTGlzdC5hZGQoImZpcnN0LW9mZmVuc2UtdGQiKTtrLmFwcGVuZENoaWxkKHQpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTt0LmNsYXNzTGlzdC5hZGQoInRlbnNvci1kZXZpY2UtdGQiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoInRlbnNvci1zZWN0aW9uLXdpdGhpbi10YWJsZSIpO2wuaW5uZXJIVE1MPWgudGVuc29yX25hbWU7dGhpcy5fYWRkT3BFeHBhbnNpb25MaXN0ZW5lcihsLGgudGVuc29yX25hbWUpO3QuYXBwZW5kQ2hpbGQobCk7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoImRldmljZS1zZWN0aW9uLXdpdGhpbi10YWJsZSIpOwpsLmlubmVySFRNTD0iKCIraC5kZXZpY2VfbmFtZSsiKSI7dC5hcHBlbmRDaGlsZChsKTtrLmFwcGVuZENoaWxkKHQpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc0xpc3QuYWRkKCJtaW5pLWhlYWx0aC1waWxsIik7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2wuY2xhc3NMaXN0LmFkZCgibWluaS1oZWFsdGgtcGlsbC10ZCIpO2wuYXBwZW5kQ2hpbGQodCk7ay5hcHBlbmRDaGlsZChsKTtoLm5lZ19pbmZfZXZlbnRfY291bnQmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGwuY2xhc3NMaXN0LmFkZCgibmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGwuaW5uZXJIVE1MPWgubmVnX2luZl9ldmVudF9jb3VudCxsLnNldEF0dHJpYnV0ZSgidGl0bGUiLGgubmVnX2luZl9ldmVudF9jb3VudCsiIGV2ZW50cyB3aXRoIC1cdTIyMWUiKSx0LmFwcGVuZENoaWxkKGwpKTtoLnBvc19pbmZfZXZlbnRfY291bnQmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLApsLmNsYXNzTGlzdC5hZGQoInBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24iKSxsLmlubmVySFRNTD1oLnBvc19pbmZfZXZlbnRfY291bnQsbC5zZXRBdHRyaWJ1dGUoInRpdGxlIixoLnBvc19pbmZfZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCArXHUyMjFlIiksdC5hcHBlbmRDaGlsZChsKSk7aC5uYW5fZXZlbnRfY291bnQmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGwuY2xhc3NMaXN0LmFkZCgibmFuLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGwuaW5uZXJIVE1MPWgubmFuX2V2ZW50X2NvdW50LGwuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaC5uYW5fZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCBOYU4iKSx0LmFwcGVuZENoaWxkKGwpKTtQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZChrKX19fSxfYWRkT3BFeHBhbnNpb25MaXN0ZW5lcjpmdW5jdGlvbihiLGQpe2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dmFyIGY9dGYuZ3JhcGgucmVuZGVyLmV4cGFuZFVudGlsTm9kZUlzU2hvd24odGhpcy5yZW5kZXJIaWVyYXJjaHksCmQpLGgsaz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0Zi1ncmFwaC1pbmZvI2dyYXBoLWluZm8iKTtrJiYoaD1rLnNjcm9sbEhlaWdodC1rLnNjcm9sbFRvcCk7dmFyIHQ9dGhpcy5zZWxlY3RlZE5vZGU7dGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsZik7Zj0oKT0+e2suc2Nyb2xsVG9wPWsuc2Nyb2xsSGVpZ2h0LWh9O2smJih0P2YoKTp3aW5kb3cuc2V0VGltZW91dChmLDIwKSl9KX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1zY3JvbGwtdGFyZ2V0LWJlaGF2aW9yL2lyb24tc2Nyb2xsLXRhcmdldC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzY3JvbGxUYXJnZXQ6e3R5cGU6SFRNTEVsZW1lbnQsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmYXVsdFNjcm9sbFRhcmdldH19fSxvYnNlcnZlcnM6WyJfc2Nyb2xsVGFyZ2V0Q2hhbmdlZChzY3JvbGxUYXJnZXQsIGlzQXR0YWNoZWQpIl0sX3Nob3VsZEhhdmVMaXN0ZW5lcjohMCxfc2Nyb2xsVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuX29sZFNjcm9sbFRhcmdldCYmKHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKCExLHRoaXMuX29sZFNjcm9sbFRhcmdldCksdGhpcy5fb2xkU2Nyb2xsVGFyZ2V0PW51bGwpO2QmJigiZG9jdW1lbnQiPT09Yj90aGlzLnNjcm9sbFRhcmdldD10aGlzLl9kb2M6InN0cmluZyI9PT10eXBlb2YgYj90aGlzLnNjcm9sbFRhcmdldD0oZD10aGlzLmRvbUhvc3QpJiZkLiQ/ZC4kW2JdOlBvbHltZXIuZG9tKHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvcigiIyIrCmIpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuX29sZFNjcm9sbFRhcmdldD1iLHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKHRoaXMuX3Nob3VsZEhhdmVMaXN0ZW5lcixiKSkpfSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpe30sZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuX2RvY30sZ2V0IF9kb2MoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudH0sZ2V0IF9zY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5wYWdlWU9mZnNldDp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A6MH0sZ2V0IF9zY3JvbGxMZWZ0KCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cucGFnZVhPZmZzZXQ6dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdDoKMH0sc2V0IF9zY3JvbGxUb3AoYil7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKHdpbmRvdy5wYWdlWE9mZnNldCxiKTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9Yil9LHNldCBfc2Nyb2xsTGVmdChiKXt0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuc2Nyb2xsVG8oYix3aW5kb3cucGFnZVlPZmZzZXQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9Yil9LHNjcm9sbDpmdW5jdGlvbihiLGQpe3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5zY3JvbGxUbyhiLGQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9Yix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9ZCl9LGdldCBfc2Nyb2xsVGFyZ2V0V2lkdGgoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpPwp0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuaW5uZXJXaWR0aDp0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aDowfSxnZXQgX3Njcm9sbFRhcmdldEhlaWdodCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodDowfSxfaXNWYWxpZFNjcm9sbFRhcmdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fSxfdG9nZ2xlU2Nyb2xsTGlzdGVuZXI6ZnVuY3Rpb24oYixkKXtkPWQ9PT10aGlzLl9kb2M/d2luZG93OmQ7Yj90aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fCh0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXI9dGhpcy5fc2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpLGQuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIpKToKdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyJiYoZC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlciksdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyPW51bGwpfSx0b2dnbGVTY3JvbGxMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLl9zaG91bGRIYXZlTGlzdGVuZXI9Yjt0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcihiLHRoaXMuc2Nyb2xsVGFyZ2V0KX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbGlzdC9pcm9uLWxpc3QuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGQ9YiYmODw9YlsxXSxmPW51bGwhPVBvbHltZXIuZmx1c2gsaD1mP1BvbHltZXIuQXN5bmMuYW5pbWF0aW9uRnJhbWU6MCxrPWY/UG9seW1lci5Bc3luYy5pZGxlUGVyaW9kOjEsdD1mP1BvbHltZXIuQXN5bmMubWljcm9UYXNrOjI7UG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3J8fChQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcj17fSk7UG9seW1lcih7aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7aXRlbXM6e3R5cGU6QXJyYXl9LGFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LGluZGV4QXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbmRleCJ9LHNlbGVjdGVkQXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJzZWxlY3RlZCJ9LGdyaWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsCm9ic2VydmVyOiJfZ3JpZENoYW5nZWQifSxzZWxlY3Rpb25FbmFibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3RlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG11bHRpU2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH19LG9ic2VydmVyczpbIl9pdGVtc0NoYW5nZWQoaXRlbXMuKikiLCJfc2VsZWN0aW9uRW5hYmxlZENoYW5nZWQoc2VsZWN0aW9uRW5hYmxlZCkiLCJfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkKG11bHRpU2VsZWN0aW9uKSIsIl9zZXRPdmVyZmxvdyhzY3JvbGxUYXJnZXQsIHNjcm9sbE9mZnNldCkiXSxiZWhhdmlvcnM6W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JdLApfcmF0aW86LjUsX3Njcm9sbGVyUGFkZGluZ1RvcDowLF9zY3JvbGxQb3NpdGlvbjowLF9waHlzaWNhbFNpemU6MCxfcGh5c2ljYWxBdmVyYWdlOjAsX3BoeXNpY2FsQXZlcmFnZUNvdW50OjAsX3BoeXNpY2FsVG9wOjAsX3ZpcnR1YWxDb3VudDowLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCxfcGh5c2ljYWxJdGVtczpudWxsLF9waHlzaWNhbFNpemVzOm51bGwsX2ZpcnN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfbGFzdFZpc2libGVJbmRleFZhbDpudWxsLF9tYXhQYWdlczoyLF9mb2N1c2VkSXRlbTpudWxsLF9mb2N1c2VkVmlydHVhbEluZGV4Oi0xLF9mb2N1c2VkUGh5c2ljYWxJbmRleDotMSxfb2Zmc2NyZWVuRm9jdXNlZEl0ZW06bnVsbCxfZm9jdXNCYWNrZmlsbEl0ZW06bnVsbCxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLF90ZW1wbGF0ZUNvc3Q6MCwKX3BhcmVudE1vZGVsOiEwLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4odGhpcy5ncmlkP3RoaXMuX3BoeXNpY2FsUm93cyp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplKS10aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF9pdGVtc1BhcmVudCgpe3JldHVybiBQb2x5bWVyLmRvbShQb2x5bWVyLmRvbSh0aGlzLl91c2VyVGVtcGxhdGUpLnBhcmVudE5vZGUpfSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fdmlld3BvcnRIZWlnaHQrdGhpcy5fc2Nyb2xsT2Zmc2V0fSwKZ2V0IF9tYXhWaXJ0dWFsU3RhcnQoKXt2YXIgbD10aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KHRoaXMuX3ZpcnR1YWxDb3VudCk7cmV0dXJuIE1hdGgubWF4KDAsbC10aGlzLl9waHlzaWNhbENvdW50KX0sc2V0IF92aXJ0dWFsU3RhcnQobCl7bD10aGlzLl9jbGFtcChsLDAsdGhpcy5fbWF4VmlydHVhbFN0YXJ0KTt0aGlzLmdyaWQmJihsLT1sJXRoaXMuX2l0ZW1zUGVyUm93KTt0aGlzLl92aXJ0dWFsU3RhcnRWYWw9bH0sZ2V0IF92aXJ0dWFsU3RhcnQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0VmFsfHwwfSxzZXQgX3BoeXNpY2FsU3RhcnQobCl7bCU9dGhpcy5fcGh5c2ljYWxDb3VudDswPmwmJihsPXRoaXMuX3BoeXNpY2FsQ291bnQrbCk7dGhpcy5ncmlkJiYobC09bCV0aGlzLl9pdGVtc1BlclJvdyk7dGhpcy5fcGh5c2ljYWxTdGFydFZhbD1sfSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sZ2V0IF9waHlzaWNhbEVuZCgpe3JldHVybih0aGlzLl9waHlzaWNhbFN0YXJ0Kwp0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LHNldCBfcGh5c2ljYWxDb3VudChsKXt0aGlzLl9waHlzaWNhbENvdW50VmFsPWx9LGdldCBfcGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsfHwwfSxnZXQgX29wdFBoeXNpY2FsU2l6ZSgpe3JldHVybiAwPT09dGhpcy5fdmlld3BvcnRIZWlnaHQ/SW5maW5pdHk6dGhpcy5fdmlld3BvcnRIZWlnaHQqdGhpcy5fbWF4UGFnZXN9LGdldCBfaXNWaXNpYmxlKCl7cmV0dXJuISghdGhpcy5vZmZzZXRXaWR0aCYmIXRoaXMub2Zmc2V0SGVpZ2h0KX0sZ2V0IGZpcnN0VmlzaWJsZUluZGV4KCl7dmFyIGw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09bCl7dmFyIHA9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPWw9dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKG0sbil7cCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG0pOwppZihwPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiB0aGlzLmdyaWQ/bi1uJXRoaXMuX2l0ZW1zUGVyUm93Om47aWYodGhpcy5ncmlkJiZ0aGlzLl92aXJ0dWFsQ291bnQtMT09PW4pcmV0dXJuIG4tbiV0aGlzLl9pdGVtc1BlclJvd30pfHwwfXJldHVybiBsfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe3ZhciBsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09bCl7aWYodGhpcy5ncmlkKWw9TWF0aC5taW4odGhpcy5fdmlydHVhbENvdW50LHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgrdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdy0xKTtlbHNle3ZhciBwPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSxuKXtwPHRoaXMuX3Njcm9sbEJvdHRvbSYmKGw9bik7cCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG0pfSl9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1sfXJldHVybiBsfSwKZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXN9LGdldCBfdmlydHVhbFJvd0NvdW50KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aXJ0dWFsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxnZXQgX2VzdFJvd3NJblZpZXcoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpZXdwb3J0SGVpZ2h0L3RoaXMuX3Jvd0hlaWdodCl9LGdldCBfcGh5c2ljYWxSb3dzKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9zY3JvbGxPZmZzZXQoKXtyZXR1cm4gdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3RoaXMuc2Nyb2xsT2Zmc2V0fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2RpZEZvY3VzLmJpbmQodGhpcyksITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsaCk7dGhpcy5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLAoiX3Jlc2l6ZUhhbmRsZXIiKTt0aGlzLmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIik7dGhpcy51bmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LF9zZXRPdmVyZmxvdzpmdW5jdGlvbihsKXt0aGlzLnN0eWxlLndlYmtpdE92ZXJmbG93U2Nyb2xsaW5nPWw9PT10aGlzPyJ0b3VjaCI6IiI7dGhpcy5zdHlsZS5vdmVyZmxvd1k9bD09PXRoaXM/ImF1dG8iOiIiO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt2YXIgbD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9CnRoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcz8wOnBhcnNlSW50KGxbInBhZGRpbmctdG9wIl0sMTApO3RoaXMuX2lzUlRMPSJydGwiPT09bC5kaXJlY3Rpb247dGhpcy5fdmlld3BvcnRXaWR0aD10aGlzLiQuaXRlbXMub2Zmc2V0V2lkdGg7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuZ3JpZCYmdGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKX0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgbD1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxwPWwtdGhpcy5fc2Nyb2xsUG9zaXRpb24sbT0wPD1wO3RoaXMuX3Njcm9sbFBvc2l0aW9uPWw7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO01hdGguYWJzKHApPnRoaXMuX3BoeXNpY2FsU2l6ZSYmMDx0aGlzLl9waHlzaWNhbFNpemU/KHAtPXRoaXMuX3Njcm9sbE9mZnNldCxtPU1hdGgucm91bmQocC8KdGhpcy5fcGh5c2ljYWxBdmVyYWdlKSp0aGlzLl9pdGVtc1BlclJvdyx0aGlzLl92aXJ0dWFsU3RhcnQrPW0sdGhpcy5fcGh5c2ljYWxTdGFydCs9bSx0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcGh5c2ljYWxBdmVyYWdlLHRoaXMuX3VwZGF0ZSgpKTowPHRoaXMuX3BoeXNpY2FsQ291bnQmJihsPXRoaXMuX2dldFJldXNhYmxlcyhtKSxtPyh0aGlzLl9waHlzaWNhbFRvcD1sLnBoeXNpY2FsVG9wLHRoaXMuX3ZpcnR1YWxTdGFydCs9bC5pbmRleGVzLmxlbmd0aCx0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sLmluZGV4ZXMubGVuZ3RoKToodGhpcy5fdmlydHVhbFN0YXJ0LT1sLmluZGV4ZXMubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQtPWwuaW5kZXhlcy5sZW5ndGgpLHRoaXMuX3VwZGF0ZShsLmluZGV4ZXMsbT9udWxsOmwuaW5kZXhlcyksdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsCnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcywwKSx0KSl9LF9nZXRSZXVzYWJsZXM6ZnVuY3Rpb24obCl7dmFyIHA9W10sbT10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSp0aGlzLl9yYXRpbyxuPXRoaXMuX3ZpcnR1YWxTdGFydCxxPXRoaXMuX3ZpcnR1YWxFbmQsdT10aGlzLl9waHlzaWNhbENvdW50LHg9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3ZhciBBPXRoaXMuX3BoeXNpY2FsQm90dG9tK3RoaXMuX3Njcm9sbE9mZnNldDt2YXIgeT10aGlzLl9zY3JvbGxUb3Asdz10aGlzLl9zY3JvbGxCb3R0b207aWYobCl7dmFyIEM9dGhpcy5fcGh5c2ljYWxTdGFydDtBPXkteH1lbHNlIEM9dGhpcy5fcGh5c2ljYWxFbmQsQS09dztmb3IoOzspe3ZhciBHPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChDKTtBLT1HO2lmKHAubGVuZ3RoPj11fHxBPD1tKWJyZWFrO2lmKGwpe2lmKHErcC5sZW5ndGgrMT49dGhpcy5fdmlydHVhbENvdW50KWJyZWFrOwppZih4K0c+PXktdGhpcy5fc2Nyb2xsT2Zmc2V0KWJyZWFrO3AucHVzaChDKTt4Kz1HO0M9KEMrMSkldX1lbHNle2lmKDA+PW4tcC5sZW5ndGgpYnJlYWs7aWYoeCt0aGlzLl9waHlzaWNhbFNpemUtRzw9dylicmVhaztwLnB1c2goQyk7eC09RztDPTA9PT1DP3UtMTpDLTF9fXJldHVybntpbmRleGVzOnAscGh5c2ljYWxUb3A6eC10aGlzLl9zY3JvbGxPZmZzZXR9fSxfdXBkYXRlOmZ1bmN0aW9uKGwscCl7aWYoIShsJiYwPT09bC5sZW5ndGh8fDA9PT10aGlzLl9waHlzaWNhbENvdW50KSl7dGhpcy5fbWFuYWdlRm9jdXMoKTt0aGlzLl9hc3NpZ25Nb2RlbHMobCk7dGhpcy5fdXBkYXRlTWV0cmljcyhsKTtpZihwKWZvcig7cC5sZW5ndGg7KWw9cC5wb3AoKSx0aGlzLl9waHlzaWNhbFRvcC09dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGwpO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKX19LF9jcmVhdGVQb29sOmZ1bmN0aW9uKGwpe3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCk7CnZhciBwLG09QXJyYXkobCk7Zm9yKHA9MDtwPGw7cCsrKXt2YXIgbj10aGlzLnN0YW1wKG51bGwpO21bcF09bi5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChuLnJvb3QpfXJldHVybiBtfSxfaXNDbGllbnRGdWxsOmZ1bmN0aW9uKCl7cmV0dXJuIDAhPXRoaXMuX3Njcm9sbEJvdHRvbSYmdGhpcy5fcGh5c2ljYWxCb3R0b20tMT49dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbFRvcDw9dGhpcy5fc2Nyb2xsUG9zaXRpb259LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbihsKXtsPXRoaXMuX2NsYW1wKHRoaXMuX3BoeXNpY2FsQ291bnQrbCwzLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQpO2w9dGhpcy5fY29udmVydEluZGV4VG9Db21wbGV0ZVJvdyhsKTtpZih0aGlzLmdyaWQpe3ZhciBwPWwldGhpcy5faXRlbXNQZXJSb3c7cCYmbC1wPD10aGlzLl9waHlzaWNhbENvdW50JiYobCs9dGhpcy5faXRlbXNQZXJSb3cpOwpsLT1wfWwtPXRoaXMuX3BoeXNpY2FsQ291bnQ7cD1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpO2lmKCEoMD5sKSl7aWYoMDxsKXtwPXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsSXRlbXMsdGhpcy5fY3JlYXRlUG9vbChsKSk7Zm9yKHZhciBtPTA7bTxsO20rKyl0aGlzLl9waHlzaWNhbFNpemVzLnB1c2goMCk7dGhpcy5fcGh5c2ljYWxDb3VudCs9bDt0aGlzLl9waHlzaWNhbFN0YXJ0PnRoaXMuX3BoeXNpY2FsRW5kJiZ0aGlzLl9pc0luZGV4UmVuZGVyZWQodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkmJnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCk8dGhpcy5fcGh5c2ljYWxFbmQmJih0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sKTt0aGlzLl91cGRhdGUoKTt0aGlzLl90ZW1wbGF0ZUNvc3Q9KHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKS1wKS9sO3A9TWF0aC5yb3VuZCguNSoKdGhpcy5fcGh5c2ljYWxDb3VudCl9dGhpcy5fdmlydHVhbEVuZD49dGhpcy5fdmlydHVhbENvdW50LTF8fDA9PT1wfHwodGhpcy5faXNDbGllbnRGdWxsKCk/dGhpcy5fcGh5c2ljYWxTaXplPHRoaXMuX29wdFBoeXNpY2FsU2l6ZSYmdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLHRoaXMuX2NsYW1wKE1hdGgucm91bmQoNTAvdGhpcy5fdGVtcGxhdGVDb3N0KSwxLHApKSxrKTp0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMscCksdCkpfX0sX3JlbmRlcjpmdW5jdGlvbigpe2lmKHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faXNWaXNpYmxlKWlmKDAhPT10aGlzLl9waHlzaWNhbENvdW50KXt2YXIgbD10aGlzLl9nZXRSZXVzYWJsZXMoITApO3RoaXMuX3BoeXNpY2FsVG9wPWwucGh5c2ljYWxUb3A7dGhpcy5fdmlydHVhbFN0YXJ0Kz0KbC5pbmRleGVzLmxlbmd0aDt0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sLmluZGV4ZXMubGVuZ3RoO3RoaXMuX3VwZGF0ZShsLmluZGV4ZXMpO3RoaXMuX3VwZGF0ZSgpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApfWVsc2UgMDx0aGlzLl92aXJ0dWFsQ291bnQmJih0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDMpKX0sX2Vuc3VyZVRlbXBsYXRpemVkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY3Rvcil7KHRoaXMuX3VzZXJUZW1wbGF0ZT10aGlzLnF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4oInRlbXBsYXRlIikpfHxjb25zb2xlLndhcm4oImlyb24tbGlzdCByZXF1aXJlcyBhIHRlbXBsYXRlIHRvIGJlIHByb3ZpZGVkIGluIGxpZ2h0LWRvbSIpO3ZhciBsPXtfX2tleV9fOiEwfTtsW3RoaXMuYXNdPSEwO2xbdGhpcy5pbmRleEFzXT0hMDtsW3RoaXMuc2VsZWN0ZWRBc109ITA7bC50YWJJbmRleD0hMDt0aGlzLl9pbnN0YW5jZVByb3BzPQpsO3RoaXMudGVtcGxhdGl6ZSh0aGlzLl91c2VyVGVtcGxhdGUsdGhpcy5tdXRhYmxlRGF0YSl9fSxfZ3JpZENoYW5nZWQ6ZnVuY3Rpb24obCxwKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBwJiYodGhpcy5ub3RpZnlSZXNpemUoKSxQb2x5bWVyLmZsdXNoP1BvbHltZXIuZmx1c2goKTpQb2x5bWVyLmRvbS5mbHVzaCgpLGwmJnRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCkpfSxfaXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGwpe2lmKCJpdGVtcyI9PT1sLnBhdGgpdGhpcy5fcGh5c2ljYWxUb3A9dGhpcy5fdmlydHVhbFN0YXJ0PTAsdGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MCx0aGlzLl9jb2xsZWN0aW9uPXRoaXMuaXRlbXMmJlBvbHltZXIuQ29sbGVjdGlvbj9Qb2x5bWVyLkNvbGxlY3Rpb24uZ2V0KHRoaXMuaXRlbXMpOm51bGwsdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fSx0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPQpudWxsLHRoaXMuX3BoeXNpY2FsQ291bnQ9dGhpcy5fcGh5c2ljYWxDb3VudHx8MCx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdLHRoaXMuX3BoeXNpY2FsU2l6ZXM9dGhpcy5fcGh5c2ljYWxTaXplc3x8W10sdGhpcy5fcGh5c2ljYWxTdGFydD0wLHRoaXMuX3Njcm9sbFRvcD50aGlzLl9zY3JvbGxPZmZzZXQmJnRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oMCksdGhpcy5fcmVtb3ZlRm9jdXNlZEl0ZW0oKSx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpO2Vsc2UgaWYoIml0ZW1zLnNwbGljZXMiPT09bC5wYXRoKXt0aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXgobC52YWx1ZS5pbmRleFNwbGljZXMpO3RoaXMuX3ZpcnR1YWxDb3VudD10aGlzLml0ZW1zP3RoaXMuaXRlbXMubGVuZ3RoOjA7aWYobC52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihtKXtyZXR1cm4gMDxtLmFkZGVkQ291bnR8fDA8bS5yZW1vdmVkLmxlbmd0aH0pKXt2YXIgcD0KdGhpcy5fZ2V0QWN0aXZlRWxlbWVudCgpO3RoaXMuY29udGFpbnMocCkmJnAuYmx1cigpfWw9bC52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihtKXtyZXR1cm4gbS5pbmRleCttLmFkZGVkQ291bnQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmbS5pbmRleDw9dGhpcy5fdmlydHVhbEVuZH0sdGhpcyk7dGhpcy5faXNDbGllbnRGdWxsKCkmJiFsfHx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpfWVsc2UiaXRlbXMubGVuZ3RoIiE9PWwucGF0aCYmdGhpcy5fZm9yd2FyZEl0ZW1QYXRoKGwucGF0aCxsLnZhbHVlKX0sX2ZvcndhcmRJdGVtUGF0aDpmdW5jdGlvbihsLHApe2w9bC5zbGljZSg2KTt2YXIgbT1sLmluZGV4T2YoIi4iKTstMT09PW0mJihtPWwubGVuZ3RoKTt2YXIgbixxPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTtpZihmKXt2YXIgdT1wYXJzZUludChsLnN1YnN0cmluZygwLG0pLDEwKTtpZihuPXRoaXMuX2lzSW5kZXhSZW5kZXJlZCh1KSl7dmFyIHg9CnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodSk7dmFyIEE9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t4XSl9ZWxzZSBxJiYoQT1xKTtpZighQXx8QVt0aGlzLmluZGV4QXNdIT09dSlyZXR1cm59ZWxzZSBpZih1PWwuc3Vic3RyaW5nKDAsbSkscSYmcS5fX2tleV9fPT09dSlBPXE7ZWxzZSBpZih4PXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdV0sQT10aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3hdKSwhQXx8QS5fX2tleV9fIT09dSlyZXR1cm47bD1sLnN1YnN0cmluZyhtKzEpO2w9dGhpcy5hcysobD8iLiIrbDoiIik7Zj9BLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgobCxwLCExLCEwKTpBLm5vdGlmeVBhdGgobCxwLCEwKTtBLl9mbHVzaFByb3BlcnRpZXMmJkEuX2ZsdXNoUHJvcGVydGllcyghMCk7biYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW3hdKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCkpfSwKX2FkanVzdFZpcnR1YWxJbmRleDpmdW5jdGlvbihsKXtsLmZvckVhY2goZnVuY3Rpb24ocCl7cC5yZW1vdmVkLmZvckVhY2godGhpcy5fcmVtb3ZlSXRlbSx0aGlzKTtwLmluZGV4PHRoaXMuX3ZpcnR1YWxTdGFydCYmKHA9TWF0aC5tYXgocC5hZGRlZENvdW50LXAucmVtb3ZlZC5sZW5ndGgscC5pbmRleC10aGlzLl92aXJ0dWFsU3RhcnQpLHRoaXMuX3ZpcnR1YWxTdGFydCs9cCwwPD10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiYodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCs9cCkpfSx0aGlzKX0sX3JlbW92ZUl0ZW06ZnVuY3Rpb24obCl7dGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0KGwpO3RoaXMuX2ZvY3VzZWRJdGVtJiZ0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9mb2N1c2VkSXRlbSlbdGhpcy5hc109PT1sJiZ0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKGwscCl7dmFyIG0sbjtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmcClmb3Iobj0KMDtuPHAubGVuZ3RoO24rKyl7dmFyIHE9cFtuXTt2YXIgdT10aGlzLl9jb21wdXRlVmlkeChxKTtpZihudWxsIT0obT1sLmNhbGwodGhpcyxxLHUpKSlyZXR1cm4gbX1lbHNle3E9dGhpcy5fcGh5c2ljYWxTdGFydDtmb3IodT10aGlzLl92aXJ0dWFsU3RhcnQ7cTx0aGlzLl9waHlzaWNhbENvdW50O3ErKyx1KyspaWYobnVsbCE9KG09bC5jYWxsKHRoaXMscSx1KSkpcmV0dXJuIG07Zm9yKHE9MDtxPHRoaXMuX3BoeXNpY2FsU3RhcnQ7cSsrLHUrKylpZihudWxsIT0obT1sLmNhbGwodGhpcyxxLHUpKSlyZXR1cm4gbX19LF9jb21wdXRlVmlkeDpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5fcGh5c2ljYWxTdGFydD90aGlzLl92aXJ0dWFsU3RhcnQrKGwtdGhpcy5fcGh5c2ljYWxTdGFydCk6dGhpcy5fdmlydHVhbFN0YXJ0Kyh0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3BoeXNpY2FsU3RhcnQpK2x9LF9hc3NpZ25Nb2RlbHM6ZnVuY3Rpb24obCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHAsCm0pe3ZhciBuPXRoaXMuX3BoeXNpY2FsSXRlbXNbcF0scT10aGlzLml0ZW1zJiZ0aGlzLml0ZW1zW21dO2lmKG51bGwhPXEpe3ZhciB1PXRoaXMubW9kZWxGb3JFbGVtZW50KG4pO3UuX19rZXlfXz10aGlzLl9jb2xsZWN0aW9uP3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHEpOm51bGw7dGhpcy5fZm9yd2FyZFByb3BlcnR5KHUsdGhpcy5hcyxxKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSx0aGlzLnNlbGVjdGVkQXMsdGhpcy4kLnNlbGVjdG9yLmlzU2VsZWN0ZWQocSkpO3RoaXMuX2ZvcndhcmRQcm9wZXJ0eSh1LHRoaXMuaW5kZXhBcyxtKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSwidGFiSW5kZXgiLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9PT1tPzA6LTEpO3RoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdS5fX2tleV9fXT1wO3UuX2ZsdXNoUHJvcGVydGllcyYmdS5fZmx1c2hQcm9wZXJ0aWVzKCEwKTtuLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIil9ZWxzZSBuLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwKIiIpfSxsKX0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24obCl7UG9seW1lci5mbHVzaD9Qb2x5bWVyLmZsdXNoKCk6UG9seW1lci5kb20uZmx1c2goKTt2YXIgcD0wLG09MCxuPXRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50LHE9dGhpcy5fcGh5c2ljYWxBdmVyYWdlO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbih1KXttKz10aGlzLl9waHlzaWNhbFNpemVzW3VdO3RoaXMuX3BoeXNpY2FsU2l6ZXNbdV09dGhpcy5fcGh5c2ljYWxJdGVtc1t1XS5vZmZzZXRIZWlnaHQ7cCs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XTt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XT8xOjB9LGwpO3RoaXMuZ3JpZD8odGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSx0aGlzLl9waHlzaWNhbFNpemU9TWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCk6KG09MT09PXRoaXMuX2l0ZW1zUGVyUm93P206Ck1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9yb3dIZWlnaHQsdGhpcy5fcGh5c2ljYWxTaXplPXRoaXMuX3BoeXNpY2FsU2l6ZStwLW0sdGhpcy5faXRlbXNQZXJSb3c9MSk7dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQhPT1uJiYodGhpcy5fcGh5c2ljYWxBdmVyYWdlPU1hdGgucm91bmQoKHEqbitwKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCkpfSxfdXBkYXRlR3JpZE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9pdGVtV2lkdGg9MDx0aGlzLl9waHlzaWNhbENvdW50P3RoaXMuX3BoeXNpY2FsSXRlbXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg6MjAwO3RoaXMuX3Jvd0hlaWdodD0wPHRoaXMuX3BoeXNpY2FsQ291bnQ/dGhpcy5fcGh5c2ljYWxJdGVtc1swXS5vZmZzZXRIZWlnaHQ6MjAwO3RoaXMuX2l0ZW1zUGVyUm93PXRoaXMuX2l0ZW1XaWR0aD9NYXRoLmZsb29yKHRoaXMuX3ZpZXdwb3J0V2lkdGgvdGhpcy5faXRlbVdpZHRoKToKdGhpcy5faXRlbXNQZXJSb3d9LF9wb3NpdGlvbkl0ZW1zOmZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKTt2YXIgbD10aGlzLl9waHlzaWNhbFRvcDtpZih0aGlzLmdyaWQpe3ZhciBwPSh0aGlzLl92aWV3cG9ydFdpZHRoLXRoaXMuX2l0ZW1zUGVyUm93KnRoaXMuX2l0ZW1XaWR0aCkvMjt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSxuKXt2YXIgcT1NYXRoLmZsb29yKG4ldGhpcy5faXRlbXNQZXJSb3cqdGhpcy5faXRlbVdpZHRoK3ApO3RoaXMuX2lzUlRMJiYocSo9LTEpO3RoaXMudHJhbnNsYXRlM2QocSsicHgiLGwrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbV0pO3RoaXMuX3Nob3VsZFJlbmRlck5leHRSb3cobikmJihsKz10aGlzLl9yb3dIZWlnaHQpfSl9ZWxzZSB0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSl7dGhpcy50cmFuc2xhdGUzZCgwLGwrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbV0pO2wrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbV19KX0sCl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZ3JpZD90aGlzLl9jb21wdXRlVmlkeChsKSV0aGlzLl9pdGVtc1BlclJvdyE9PXRoaXMuX2l0ZW1zUGVyUm93LTE/MDp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplc1tsXX0sX3Nob3VsZFJlbmRlck5leHRSb3c6ZnVuY3Rpb24obCl7cmV0dXJuIGwldGhpcy5faXRlbXNQZXJSb3c9PT10aGlzLl9pdGVtc1BlclJvdy0xfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgbD0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2lmKDAhPT1sKXt0aGlzLl9waHlzaWNhbFRvcC09bDt2YXIgcD10aGlzLl9zY3JvbGxUb3A7IWQmJjA8cCYmdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbihwLWwpfX0sX3Jlc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24obCl7dGhpcy5zY3JvbGxUYXJnZXQmJgowPD1sJiYodGhpcy5fc2Nyb2xsUG9zaXRpb249dGhpcy5fc2Nyb2xsVG9wPWwpfSxfdXBkYXRlU2Nyb2xsZXJTaXplOmZ1bmN0aW9uKGwpe3RoaXMuX2VzdFNjcm9sbEhlaWdodD10aGlzLmdyaWQ/dGhpcy5fdmlydHVhbFJvd0NvdW50KnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbEJvdHRvbStNYXRoLm1heCh0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsMCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2lmKChsPShsPShsPWx8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fHRoaXMuZ3JpZCYmdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodDx0aGlzLl9lc3RTY3JvbGxIZWlnaHQpfHxNYXRoLmFicyh0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fc2Nyb2xsSGVpZ2h0KT49dGhpcy5fdmlld3BvcnRIZWlnaHQpdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD0KdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KyJweCIsdGhpcy5fc2Nyb2xsSGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodH0sc2Nyb2xsVG9JdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sc2Nyb2xsVG9JbmRleDpmdW5jdGlvbihsKXtpZighKCJudW1iZXIiIT09dHlwZW9mIGx8fDA+bHx8bD50aGlzLml0ZW1zLmxlbmd0aC0xKSYmKFBvbHltZXIuZmx1c2g/UG9seW1lci5mbHVzaCgpOlBvbHltZXIuZG9tLmZsdXNoKCksMCE9PXRoaXMuX3BoeXNpY2FsQ291bnQpKXtsPXRoaXMuX2NsYW1wKGwsMCx0aGlzLl92aXJ0dWFsQ291bnQtMSk7aWYoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZChsKXx8bD49dGhpcy5fbWF4VmlydHVhbFN0YXJ0KXRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLmdyaWQ/bC0yKnRoaXMuX2l0ZW1zUGVyUm93OmwtMTt0aGlzLl9tYW5hZ2VGb2N1cygpO3RoaXMuX2Fzc2lnbk1vZGVscygpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoKTsKdGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIHA9dGhpcy5fcGh5c2ljYWxTdGFydCxtPXRoaXMuX3ZpcnR1YWxTdGFydCxuPTAscT10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTttPGwmJm48PXE7KW4rPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChwKSxwPShwKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsbSsrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0K24pO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbH19LF9yZXNldEF2ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudD0KdGhpcy5fcGh5c2ljYWxBdmVyYWdlPTB9LF9yZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLGZ1bmN0aW9uKCl7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO3RoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCk7dGhpcy5faXNWaXNpYmxlPyh0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCEwKSx0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLl9yZW5kZXIoKSk6dGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMSl9LGgpfSxzZWxlY3RJdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnNlbGVjdEluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHNlbGVjdEluZGV4OmZ1bmN0aW9uKGwpe2lmKCEoMD5sfHxsPj10aGlzLl92aXJ0dWFsQ291bnQpKXshdGhpcy5tdWx0aVNlbGVjdGlvbiYmdGhpcy5zZWxlY3RlZEl0ZW0mJnRoaXMuY2xlYXJTZWxlY3Rpb24oKTtpZih0aGlzLl9pc0luZGV4UmVuZGVyZWQobCkpe3ZhciBwPQp0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldKTtwJiYocFt0aGlzLnNlbGVjdGVkQXNdPSEwKTt0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChsKX10aGlzLiQuc2VsZWN0b3Iuc2VsZWN0SW5kZXg/dGhpcy4kLnNlbGVjdG9yLnNlbGVjdEluZGV4KGwpOnRoaXMuJC5zZWxlY3Rvci5zZWxlY3QodGhpcy5pdGVtc1tsXSl9fSxkZXNlbGVjdEl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZGVzZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YobCkpfSxkZXNlbGVjdEluZGV4OmZ1bmN0aW9uKGwpezA+bHx8bD49dGhpcy5fdmlydHVhbENvdW50fHwodGhpcy5faXNJbmRleFJlbmRlcmVkKGwpJiYodGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KGwpXSlbdGhpcy5zZWxlY3RlZEFzXT0hMSx0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChsKSksdGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0SW5kZXg/CnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdEluZGV4KGwpOnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdCh0aGlzLml0ZW1zW2xdKSl9LHRvZ2dsZVNlbGVjdGlvbkZvckl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMudG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sdG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXg6ZnVuY3Rpb24obCl7KHRoaXMuJC5zZWxlY3Rvci5pc0luZGV4U2VsZWN0ZWQ/dGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZChsKTp0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2xdKSk/dGhpcy5kZXNlbGVjdEluZGV4KGwpOnRoaXMuc2VsZWN0SW5kZXgobCl9LGNsZWFyU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGwpe3RoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbbF0pW3RoaXMuc2VsZWN0ZWRBc109ITF9KTt0aGlzLiQuc2VsZWN0b3IuY2xlYXJTZWxlY3Rpb24oKX0sCl9zZWxlY3Rpb25FbmFibGVkQ2hhbmdlZDpmdW5jdGlvbihsKXsobD90aGlzLmxpc3Rlbjp0aGlzLnVubGlzdGVuKS5jYWxsKHRoaXMsdGhpcywidGFwIiwiX3NlbGVjdGlvbkhhbmRsZXIiKX0sX3NlbGVjdGlvbkhhbmRsZXI6ZnVuY3Rpb24obCl7dmFyIHA9dGhpcy5tb2RlbEZvckVsZW1lbnQobC50YXJnZXQpO2lmKHApe3ZhciBtPVBvbHltZXIuZG9tKGwpLnBhdGhbMF07bD10aGlzLl9nZXRBY3RpdmVFbGVtZW50KCk7dmFyIG49dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHBbdGhpcy5pbmRleEFzXSldO2lmKCJpbnB1dCIhPT1tLmxvY2FsTmFtZSYmImJ1dHRvbiIhPT1tLmxvY2FsTmFtZSYmInNlbGVjdCIhPT1tLmxvY2FsTmFtZSl7bT1wLnRhYkluZGV4O3AudGFiSW5kZXg9LTEwMDt2YXIgcT1sP2wudGFiSW5kZXg6LTE7cC50YWJJbmRleD1tO2wmJm4hPT1sJiZuLmNvbnRhaW5zKGwpJiYtMTAwIT09cXx8dGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJdGVtKHBbdGhpcy5hc10pfX19LApfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkOmZ1bmN0aW9uKGwpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKTt0aGlzLiQuc2VsZWN0b3IubXVsdGk9bH0sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHVwZGF0ZVNpemVGb3JJbmRleDpmdW5jdGlvbihsKXtpZighdGhpcy5faXNJbmRleFJlbmRlcmVkKGwpKXJldHVybiBudWxsO3RoaXMuX3VwZGF0ZU1ldHJpY3MoW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7cmV0dXJuIG51bGx9LF9tYW5hZ2VGb2N1czpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7MDw9bCYmbDx0aGlzLl92aXJ0dWFsQ291bnQ/dGhpcy5faXNJbmRleFJlbmRlcmVkKGwpP3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOnRoaXMuX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtKCk6MDx0aGlzLl92aXJ0dWFsQ291bnQmJgowPHRoaXMuX3BoeXNpY2FsQ291bnQmJih0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9waHlzaWNhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9dGhpcy5fdmlydHVhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fcGh5c2ljYWxTdGFydF0pfSxfY29udmVydEluZGV4VG9Db21wbGV0ZVJvdzpmdW5jdGlvbihsKXt0aGlzLl9pdGVtc1BlclJvdz10aGlzLl9pdGVtc1BlclJvd3x8MTtyZXR1cm4gdGhpcy5ncmlkP01hdGguY2VpbChsL3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9pdGVtc1BlclJvdzpsfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGwpe3JldHVybiBsPj10aGlzLl92aXJ0dWFsU3RhcnQmJmw8PXRoaXMuX3ZpcnR1YWxFbmR9LF9pc0luZGV4VmlzaWJsZTpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5maXJzdFZpc2libGVJbmRleCYmbDw9dGhpcy5sYXN0VmlzaWJsZUluZGV4fSxfZ2V0UGh5c2ljYWxJbmRleDpmdW5jdGlvbihsKXtyZXR1cm4gZj8KKHRoaXMuX3BoeXNpY2FsU3RhcnQrKGwtdGhpcy5fdmlydHVhbFN0YXJ0KSkldGhpcy5fcGh5c2ljYWxDb3VudDp0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5W3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHRoaXMuaXRlbXNbbF0pXX0sZm9jdXNJdGVtOmZ1bmN0aW9uKGwpe3RoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKGwpfSxfZm9jdXNQaHlzaWNhbEl0ZW06ZnVuY3Rpb24obCl7aWYoISgwPmx8fGw+PXRoaXMuX3ZpcnR1YWxDb3VudCkpe3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpO3RoaXMuX2lzSW5kZXhSZW5kZXJlZChsKXx8dGhpcy5zY3JvbGxUb0luZGV4KGwpO3ZhciBwPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChsKV0sbT10aGlzLm1vZGVsRm9yRWxlbWVudChwKSxuO20udGFiSW5kZXg9LTEwMDstMTAwPT09cC50YWJJbmRleCYmKG49cCk7bnx8KG49UG9seW1lci5kb20ocCkucXVlcnlTZWxlY3RvcignW3RhYmluZGV4XHgzZCItMTAwIl0nKSk7Cm0udGFiSW5kZXg9MDt0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4PWw7biYmbi5mb2N1cygpfX0sX3JlbW92ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX2l0ZW1zUGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTt0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbT1udWxsO3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9LTF9LF9jcmVhdGVGb2N1c0JhY2tmaWxsSXRlbTpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4O2lmKCEodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW18fDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe2lmKCF0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSl7dmFyIHA9dGhpcy5zdGFtcChudWxsKTt0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT0KcC5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChwLnJvb3QpfXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbbF07dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pLnRhYkluZGV4PTA7dGhpcy5fcGh5c2ljYWxJdGVtc1tsXT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbTt0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD1sO3RoaXMudHJhbnNsYXRlM2QoMCwiLTEwMDAwcHgiLDAsdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pfX0sX3Jlc3RvcmVGb2N1c2VkSXRlbTpmdW5jdGlvbigpe2lmKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtJiYhKDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe3RoaXMuX2Fzc2lnbk1vZGVscygpO3ZhciBsPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksCnA9dGhpcy5fcGh5c2ljYWxJdGVtc1tsXTtpZihwKXt2YXIgbT10aGlzLm1vZGVsRm9yRWxlbWVudChwKSxuPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTttW3RoaXMuYXNdPT09blt0aGlzLmFzXT8odGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09cCxtLnRhYkluZGV4PS0xLHRoaXMuX3BoeXNpY2FsSXRlbXNbbF09dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy50cmFuc2xhdGUzZCgwLCItMTAwMDBweCIsMCx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSkpOih0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPW51bGwpO3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGx9fX0sX2RpZEZvY3VzOmZ1bmN0aW9uKGwpe2w9dGhpcy5tb2RlbEZvckVsZW1lbnQobC50YXJnZXQpO3ZhciBwPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKSxtPW51bGwhPT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSwKbj10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4O2wmJihwPT09bD90aGlzLl9pc0luZGV4VmlzaWJsZShuKXx8dGhpcy5zY3JvbGxUb0luZGV4KG4pOih0aGlzLl9yZXN0b3JlRm9jdXNlZEl0ZW0oKSxwJiYocC50YWJJbmRleD0tMSksbC50YWJJbmRleD0wLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9bj1sW3RoaXMuaW5kZXhBc10sdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9dGhpcy5fZ2V0UGh5c2ljYWxJbmRleChuKSx0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4XSxtJiYhdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX3VwZGF0ZSgpKSl9LF9rZXlkb3duSGFuZGxlcjpmdW5jdGlvbihsKXtzd2l0Y2gobC5rZXlDb2RlKXtjYXNlIDQwOnRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8dGhpcy5fdmlydHVhbENvdW50LTEmJmwucHJldmVudERlZmF1bHQoKTt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KwoodGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM5OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/LTE6MSkpO2JyZWFrO2Nhc2UgMzg6MDx0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiZsLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleC0odGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM3OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/MTotMSkpO2JyZWFrO2Nhc2UgMTM6dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksdGhpcy5zZWxlY3Rpb25FbmFibGVkJiZ0aGlzLl9zZWxlY3Rpb25IYW5kbGVyKGwpfX0sX2NsYW1wOmZ1bmN0aW9uKGwsCnAsbSl7cmV0dXJuIE1hdGgubWluKG0sTWF0aC5tYXgocCxsKSl9LF9kZWJvdW5jZTpmdW5jdGlvbihsLHAsbSl7Zj8odGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fSx0aGlzLl9kZWJvdW5jZXJzW2xdPVBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcnNbbF0sbSxwLmJpbmQodGhpcykpLFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9kZWJvdW5jZXJzW2xdKSk6UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UobCxwKSl9LF9mb3J3YXJkUHJvcGVydHk6ZnVuY3Rpb24obCxwLG0pe2Y/bC5fc2V0UGVuZGluZ1Byb3BlcnR5KHAsbSk6bFtwXT1tfSxfZm9yd2FyZEhvc3RQcm9wVjI6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJnRoaXMubW9kZWxGb3JFbGVtZW50KG0pLmZvcndhcmRIb3N0UHJvcChsLApwKX0sdGhpcyl9LF9ub3RpZnlJbnN0YW5jZVByb3BWMjpmdW5jdGlvbihsLHAsbSl7UG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcyxwKSYmKGw9bFt0aGlzLmluZGV4QXNdLHA9PXRoaXMuYXMmJih0aGlzLml0ZW1zW2xdPW0pLHRoaXMubm90aWZ5UGF0aChQb2x5bWVyLlBhdGgudHJhbnNsYXRlKHRoaXMuYXMsIml0ZW1zLiIrbCxwKSxtKSl9LF9nZXRTdGFtcGVkQ2hpbGRyZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxJdGVtc30sX2ZvcndhcmRJbnN0YW5jZVBhdGg6ZnVuY3Rpb24obCxwLG0pezA9PT1wLmluZGV4T2YodGhpcy5hcysiLiIpJiZ0aGlzLm5vdGlmeVBhdGgoIml0ZW1zLiIrbC5fX2tleV9fKyIuIitwLnNsaWNlKHRoaXMuYXMubGVuZ3RoKzEpLG0pfSxfZm9yd2FyZFBhcmVudFBhdGg6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJgp0aGlzLm1vZGVsRm9yRWxlbWVudChtKS5ub3RpZnlQYXRoKGwscCwhMCl9LHRoaXMpfSxfZm9yd2FyZFBhcmVudFByb3A6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJih0aGlzLm1vZGVsRm9yRWxlbWVudChtKVtsXT1wKX0sdGhpcyl9LF9nZXRBY3RpdmVFbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5faXRlbXNQYXJlbnQubm9kZS5kb21Ib3N0O3JldHVybiBQb2x5bWVyLmRvbShsP2wucm9vdDpkb2N1bWVudCkuYWN0aXZlRWxlbWVudH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaXRlbS9wYXBlci1pdGVtLWJvZHkuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaXRlbS1ib2R5In0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90Zi1ncmFwaC1pY29uLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2xldCBoOyhmdW5jdGlvbihrKXtrLkNPTlNUPSJDT05TVCI7ay5NRVRBPSJNRVRBIjtrLk9QPSJPUCI7ay5TRVJJRVM9IlNFUklFUyI7ay5TVU1NQVJZPSJTVU1NQVJZIn0pKGg9Zi5HcmFwaEljb25UeXBlfHwoZi5HcmFwaEljb25UeXBlPXt9KSk7UG9seW1lcih7aXM6InRmLWdyYXBoLWljb24iLHByb3BlcnRpZXM6e3R5cGU6U3RyaW5nLHZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGxPdmVycmlkZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sc3Ryb2tlT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LGZhZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9maWxsOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVGaWxsKHR5cGUsIGZpbGxPdmVycmlkZSkifSxfc3Ryb2tlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTdHJva2UodHlwZSwgc3Ryb2tlT3ZlcnJpZGUpIn19LApnZXRTdmdEZWZpbmFibGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuJC5zdmdEZWZzfSxfY29tcHV0ZUZpbGwoayx0KXtpZihudWxsIT10KXJldHVybiB0O3N3aXRjaChrKXtjYXNlIGguTUVUQTpyZXR1cm4gYi5ncmFwaC5yZW5kZXIuTWV0YW5vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2Nhc2UgaC5TRVJJRVM6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLlNlcmllc05vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2RlZmF1bHQ6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX0ZJTEx9fSxfY29tcHV0ZVN0cm9rZShrLHQpe2lmKG51bGwhPXQpcmV0dXJuIHQ7c3dpdGNoKGspe2Nhc2UgaC5NRVRBOnJldHVybiBiLmdyYXBoLnJlbmRlci5NZXRhbm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRTtjYXNlIGguU0VSSUVTOnJldHVybiBiLmdyYXBoLnJlbmRlci5TZXJpZXNOb2RlQ29sb3JzLkRFRkFVTFRfU1RST0tFO2RlZmF1bHQ6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRX19LApfaXNUeXBlKGssdCl7cmV0dXJuIGs9PT10fSxfZmFkZWRDbGFzczpmdW5jdGlvbihrLHQpe3JldHVybiBrPyJmYWRlZC0iK3Q6IiJ9fSl9KShkLmljb258fChkLmljb249e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3RmLW5vZGUtaWNvbi5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWljb24iLHByb3BlcnRpZXM6e25vZGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHJlbmRlckluZm86e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LGNvbG9yQnk6e3R5cGU6T2JqZWN0LHZhbHVlOiJzdHJ1Y3R1cmFsIn0sdGVtcGxhdGVJbmRleDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSx0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx2ZXJ0aWNhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxjb25zdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzdW1tYXJ5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGw6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LF9maWxsT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUZpbGxPdmVycmlkZShub2RlLCByZW5kZXJJbmZvLCBjb2xvckJ5LCB0ZW1wbGF0ZUluZGV4LCBmaWxsKSIsb2JzZXJ2ZXI6Il9vbkZpbGxPdmVycmlkZUNoYW5nZWQifX0sCl9jb21wdXRlRmlsbE92ZXJyaWRlOmZ1bmN0aW9uKGIsZCxmLGgsayl7cmV0dXJuIGImJmQmJmYmJmg/KGI9dGYuZ3JhcGguc2NlbmUubm9kZSxiLmdldEZpbGxGb3JOb2RlKGgsYi5Db2xvckJ5W2YudG9VcHBlckNhc2UoKV0sZCwhMSkpOmt9LF9nZXRTdHJva2VPdmVycmlkZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFN0cm9rZUZvckZpbGwoYik6bnVsbH0sX2dldFR5cGU6ZnVuY3Rpb24oYixkLGYsaCl7Y29uc3Qgaz10Zi5ncmFwaC5pY29uLkdyYXBoSWNvblR5cGU7aWYoYilzd2l0Y2goYi50eXBlKXtjYXNlIHRmLmdyYXBoLk5vZGVUeXBlLk9QOnJldHVybiBiPWIub3AsInN0cmluZyIhPT10eXBlb2YgYj9rLk9QOiJDb25zdCI9PT1ifHxmP2suQ09OU1Q6Yi5lbmRzV2l0aCgiU3VtbWFyeSIpfHxkP2suU1VNTUFSWTprLk9QO2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuTUVUQTpyZXR1cm4gay5NRVRBO2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuU0VSSUVTOnJldHVybiBrLlNFUklFU31yZXR1cm4gaH0sCl9pc1ZlcnRpY2FsOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/Yi5oYXNOb25Db250cm9sRWRnZXM6ISFkfSxfZ2V0RmFkZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuaXNGYWRlZE91dH0sX29uRmlsbE92ZXJyaWRlQ2hhbmdlZChiLGQpe2NvbnN0IGY9dGhpcy5ub2RlLGg9dGhpcy5yZW5kZXJJbmZvLGs9dGhpcy5jb2xvckJ5LHQ9dGhpcy50ZW1wbGF0ZUluZGV4LGw9dGYuZ3JhcGguc2NlbmUubm9kZTtiIT09ZCYmbC5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zKHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSk7ZiYmaCYmayYmdCYmbC5nZXRGaWxsRm9yTm9kZSh0LGwuQ29sb3JCeVtrLnRvVXBwZXJDYXNlKCldLGgsITEsdGhpcy4kLmljb24uZ2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQvdGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtIixwcm9wZXJ0aWVzOntjYXJkTm9kZTpPYmplY3QsaXRlbU5vZGU6T2JqZWN0LGVkZ2VMYWJlbDpTdHJpbmcsaXRlbVJlbmRlckluZm86T2JqZWN0LG5hbWU6U3RyaW5nLGl0ZW1UeXBlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2l0ZW1UeXBlQ2hhbmdlZCJ9LGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6T2JqZWN0LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb259LF9pdGVtVHlwZUNoYW5nZWQ6ZnVuY3Rpb24oKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX0sX25vZGVMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLmZpcmUoIm5vZGUtbGlzdC1pdGVtLSIrYi50eXBlLHtub2RlTmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLml0ZW1UeXBlfSl9LApfZmFkZWRDbGFzczpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LG5vZGVUaXRsZTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9pbmNvbXBhdGlibGVPcE5vZGVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEluY29tcGF0aWJsZU9wTm9kZXMoZ3JhcGhIaWVyYXJjaHksIGhpZXJhcmNoeVBhcmFtcykifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX29wQ29tcGF0U2NvcmU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU9wQ29tcGF0U2NvcmUoZ3JhcGhIaWVyYXJjaHkpIn0sX29wQ29tcGF0U2NvcmVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXRPcENvbXBhdFNjb3JlTGFiZWwoX29wQ29tcGF0U2NvcmUpIn0sCl9vcENvbXBhdENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTp0Zi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEV9LF9vcEluY29tcGF0Q29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOnRmLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuSU5DT01QQVRJQkxFfSxfdG90YWxJbmNvbXBhdE9wczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbEluY29tcGF0aWJsZU9wcyhncmFwaEhpZXJhcmNoeSkifX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihiLGQpe3JldHVybiBkLm5vZGUoYil9LF9nZXRQcmludGFibGVIVE1MTm9kZU5hbWU6ZnVuY3Rpb24oYil7cmV0dXJuKGJ8fCIiKS5yZXBsYWNlKC9cLy9nLCJceDNjd2JyXHgzZS8iKX0sX2dldFJlbmRlckluZm86ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZShiKX0sCl90b2dnbGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2V4cGFuZGVkPSF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYil7cmV0dXJuIGI/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzaXplTGlzdDpmdW5jdGlvbihiKXsoYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGIpKSYmYi5maXJlKCJpcm9uLXJlc2l6ZSIpfSxfZ2V0SW5jb21wYXRpYmxlT3BOb2RlczpmdW5jdGlvbihiLGQpe2lmKGImJmIucm9vdClyZXR1cm4gdGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2luY29tcGF0aWJsZU9wc0xpc3QiKSksdGYuZ3JhcGguaGllcmFyY2h5LmdldEluY29tcGF0aWJsZU9wcyhiLGQpfSxfY29tcHV0ZU9wQ29tcGF0U2NvcmU6ZnVuY3Rpb24oYil7aWYoYiYmYi5yb290KXt2YXIgZD1iLnJvb3Q7Yj1kLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZTtkPWQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7CnJldHVybiAwPT1iJiYwPT1kPzA6TWF0aC5mbG9vcigxMDAqYi8oYitkKSkvMTAwfXJldHVybiAwfSxfZ2V0T3BDb21wYXRTY29yZUxhYmVsOmZ1bmN0aW9uKGIpe3JldHVybiBkMy5mb3JtYXQoIi4wJSIpKGIpfSxfZ2V0VG90YWxJbmNvbXBhdGlibGVPcHM6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIucm9vdD9iLnJvb3QuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU6MH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWxpc3QtaXRlbSIscHJvcGVydGllczp7Y2FyZE5vZGU6T2JqZWN0LGl0ZW1Ob2RlOk9iamVjdCxlZGdlTGFiZWw6U3RyaW5nLGl0ZW1SZW5kZXJJbmZvOk9iamVjdCxuYW1lOlN0cmluZyxpdGVtVHlwZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9pdGVtVHlwZUNoYW5nZWQifSxjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOk9iamVjdCx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9ufSxfaXRlbVR5cGVDaGFuZ2VkOmZ1bmN0aW9uKCl7InN1Ym5vZGUiIT09dGhpcy5pdGVtVHlwZT90aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5hZGQoImNsaWNrYWJsZSIpOnRoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LnJlbW92ZSgiY2xpY2thYmxlIil9LF9ub2RlTGlzdGVuZXI6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJub2RlLWxpc3QtaXRlbS0iK2IudHlwZSx7Y2FyZE5vZGU6dGhpcy5jYXJkTm9kZS5uYW1lLG5vZGVOYW1lOnRoaXMubmFtZSwKdHlwZTp0aGlzLml0ZW1UeXBlfSl9LF9mYWRlZENsYXNzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmlzRmFkZWRPdXQ/ImZhZGVkIjoiIn19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbm9kZS1pbmZvIixwcm9wZXJ0aWVzOntncmFwaE5vZGVOYW1lOlN0cmluZyxncmFwaEhpZXJhcmNoeTpPYmplY3QscmVuZGVySGllcmFyY2h5Ok9iamVjdCxjb2xvckJ5OlN0cmluZyxfdGVtcGxhdGVJbmRleDp7dHlwZTpGdW5jdGlvbixjb21wdXRlZDoiX2dldFRlbXBsYXRlSW5kZXgoZ3JhcGhIaWVyYXJjaHkpIn0sX25vZGU6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Tm9kZShncmFwaE5vZGVOYW1lLCBncmFwaEhpZXJhcmNoeSkiLG9ic2VydmVyOiJfcmVzZXRTdGF0ZSJ9LF9ub2RlU3RhdHM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Tm9kZVN0YXRzKGdyYXBoTm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSIsb2JzZXJ2ZXI6Il9yZXNldFN0YXRlIn0sX2hhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKF9ub2RlU3RhdHMpIn0sX25vZGVTdGF0c0Zvcm1hdHRlZEJ5dGVzOnt0eXBlOlN0cmluZywKY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlcyhfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZShfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzKF9ub2RlU3RhdHMpIn0sbm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG9ic2VydmVyOiJfbm9kZUluY2x1ZGVTdGF0ZUNoYW5nZWQifSxfYXR0cmlidXRlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEF0dHJpYnV0ZXMoX25vZGUpIn0sX2RldmljZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXREZXZpY2UoX25vZGUpIn0sX3N1Y2Nlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0U3VjY2Vzc29ycyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sCl9wcmVkZWNlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0UHJlZGVjZXNzb3JzKF9ub2RlLCBncmFwaEhpZXJhcmNoeSkifSxfZnVuY3Rpb25Vc2FnZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRGdW5jdGlvblVzYWdlcyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sX3N1Ym5vZGVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0U3Vibm9kZXMoX25vZGUpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF90b3RhbFByZWRlY2Vzc29yczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbFByZWQoX3ByZWRlY2Vzc29ycykifSxfdG90YWxTdWNjZXNzb3JzOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2dldFRvdGFsU3VjYyhfc3VjY2Vzc29ycykifSxfb3BlbmVkQ29udHJvbFByZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX29wZW5lZENvbnRyb2xTdWNjOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hdXhCdXR0b25UZXh0OlN0cmluZyxfZ3JvdXBCdXR0b25UZXh0OlN0cmluZ30sCmV4cGFuZE5vZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIl9ub2RlLmV4cGFuZCIsdGhpcy5ub2RlKX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihiLGQpe3JldHVybiBkLm5vZGUoYil9LF9nZXROb2RlU3RhdHM6ZnVuY3Rpb24oYixkKXtyZXR1cm4oYj10aGlzLl9nZXROb2RlKGIsZCkpP2Iuc3RhdHM6bnVsbH0sX2dldFRvdGFsTWljcm9zOmZ1bmN0aW9uKGIpe3JldHVybiBiP2IuZ2V0VG90YWxNaWNyb3MoKTowfSxfZ2V0SGFzRGlzcGxheWFibGVOb2RlU3RhdHM6ZnVuY3Rpb24oYil7cmV0dXJuIHRmLmdyYXBoLnV0aWwuaGFzRGlzcGxheWFibGVOb2RlU3RhdHMoYil9LF9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlczpmdW5jdGlvbihiKXtpZihiJiZiLnRvdGFsQnl0ZXMpcmV0dXJuIHRmLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKGIudG90YWxCeXRlcyx0Zi5ncmFwaC51dGlsLk1FTU9SWV9VTklUUyl9LApfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWU6ZnVuY3Rpb24oYil7aWYoYiYmYi5nZXRUb3RhbE1pY3JvcygpKXJldHVybiB0Zi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShiLmdldFRvdGFsTWljcm9zKCksdGYuZ3JhcGgudXRpbC5USU1FX1VOSVRTKX0sX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzOmZ1bmN0aW9uKGIpe2lmKGImJmIub3V0cHV0U2l6ZSYmYi5vdXRwdXRTaXplLmxlbmd0aClyZXR1cm4gXy5tYXAoYi5vdXRwdXRTaXplLGZ1bmN0aW9uKGQpe3JldHVybiAwPT09ZC5sZW5ndGg/InNjYWxhciI6IlsiK2Quam9pbigiLCAiKSsiXSJ9KX0sX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZTpmdW5jdGlvbihiKXtyZXR1cm4oYnx8IiIpLnJlcGxhY2UoL1wvL2csIlx4M2N3YnJceDNlLyIpfSxfZ2V0UmVuZGVySW5mbzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKGIpfSwKX2dldEF0dHJpYnV0ZXM6ZnVuY3Rpb24oYil7dGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2F0dHJpYnV0ZXNMaXN0IikpO2lmKCFifHwhYi5hdHRyKXJldHVybltdO3ZhciBkPVtdO18uZWFjaChiLmF0dHIsZnVuY3Rpb24oZil7Zi5rZXk9PT10Zi5ncmFwaC5MQVJHRV9BVFRSU19LRVk/ZD1kLmNvbmNhdChmLnZhbHVlLmxpc3Qucy5tYXAoZnVuY3Rpb24oaCl7cmV0dXJue2tleTpoLHZhbHVlOiJUb28gbGFyZ2UgdG8gc2hvdy4uLiJ9fSkpOmQucHVzaCh7a2V5OmYua2V5LHZhbHVlOkpTT04uc3RyaW5naWZ5KGYudmFsdWUpfSl9KTtyZXR1cm4gZH0sX2dldERldmljZTpmdW5jdGlvbihiKXtyZXR1cm4gYj9iLmRldmljZTpudWxsfSxfZ2V0U3VjY2Vzc29ycyhiLGQpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImlucHV0c0xpc3QiKTtyZXR1cm4gYj90aGlzLl9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdChkLmdldFN1Y2Nlc3NvcnMoYi5uYW1lKSwKITEsYi5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRQcmVkZWNlc3NvcnMoYixkKXt0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJvdXRwdXRzTGlzdCIpO3JldHVybiBiP3RoaXMuX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0KGQuZ2V0UHJlZGVjZXNzb3JzKGIubmFtZSksITAsYi5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRGdW5jdGlvblVzYWdlcyhiLGQpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImZ1bmN0aW9uVXNhZ2VzTGlzdCIpO3JldHVybiBiJiZiLnR5cGU9PT10Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBPyhiPWQubGlicmFyeUZ1bmN0aW9uc1tiLmFzc29jaWF0ZWRGdW5jdGlvbl0pP2IudXNhZ2VzOltdOltdfSxfcmVmcmVzaE5vZGVJdGVtTGlzdChiKXt0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLGAjJHtifWApKX0sX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0OmZ1bmN0aW9uKGIsCmQsZil7dmFyIGg9dD0+Xy5tYXAodC5iYXNlRWRnZUxpc3QsbD0+e3ZhciBwPWQ/bC52OmwudztyZXR1cm57bmFtZTpwLG5vZGU6dGhpcy5fZ2V0Tm9kZShwLHRoaXMuZ3JhcGhIaWVyYXJjaHkpLGVkZ2VMYWJlbDp0Zi5ncmFwaC5zY2VuZS5lZGdlLmdldExhYmVsRm9yQmFzZUVkZ2UobCx0aGlzLnJlbmRlckhpZXJhcmNoeSkscmVuZGVySW5mbzp0aGlzLl9nZXRSZW5kZXJJbmZvKHAsdGhpcy5yZW5kZXJIaWVyYXJjaHkpfX0pLGs9ZnVuY3Rpb24odCl7dmFyIGw9W107Xy5lYWNoKHQscD0+e3ZhciBtPWQ/cC52OnAudztmJiYxIT1wLmJhc2VFZGdlTGlzdC5sZW5ndGg/bC5wdXNoKHtuYW1lOm0sbm9kZTp0aGlzLl9nZXROb2RlKG0sdGhpcy5ncmFwaEhpZXJhcmNoeSksZWRnZUxhYmVsOnRmLmdyYXBoLnNjZW5lLmVkZ2UuZ2V0TGFiZWxGb3JFZGdlKHAsdGhpcy5yZW5kZXJIaWVyYXJjaHkpLHJlbmRlckluZm86dGhpcy5fZ2V0UmVuZGVySW5mbyhtLHRoaXMucmVuZGVySGllcmFyY2h5KX0pOgpsPWwuY29uY2F0KGgocCkpfSk7cmV0dXJuIGx9LmJpbmQodGhpcyk7cmV0dXJue3JlZ3VsYXI6ayhiLnJlZ3VsYXIpLGNvbnRyb2w6ayhiLmNvbnRyb2wpfX0sX2dldFN1Ym5vZGVzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLm1ldGFncmFwaD9iLm1ldGFncmFwaC5ub2RlcygpOm51bGx9LF9nZXRUb3RhbFByZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIucmVndWxhci5sZW5ndGgrYi5jb250cm9sLmxlbmd0aH0sX2dldFRvdGFsU3VjYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5yZWd1bGFyLmxlbmd0aCtiLmNvbnRyb2wubGVuZ3RofSxfdG9nZ2xlQ29udHJvbFByZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWRDb250cm9sUHJlZD0hdGhpcy5fb3BlbmVkQ29udHJvbFByZWR9LF90b2dnbGVDb250cm9sU3VjYzpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPSF0aGlzLl9vcGVuZWRDb250cm9sU3VjY30sX3RvZ2dsZUV4cGFuZGVkOmZ1bmN0aW9uKCl7dGhpcy5fZXhwYW5kZWQ9CiF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYil7cmV0dXJuIGI/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzZXRTdGF0ZTpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPXRoaXMuX29wZW5lZENvbnRyb2xQcmVkPSExO3RoaXMuc2V0KCJfZ3JvdXBCdXR0b25UZXh0Iix0Zi5ncmFwaC5zY2VuZS5ub2RlLmdldEdyb3VwU2V0dGluZ0xhYmVsKHRoaXMuX25vZGUpKTt0aGlzLl9ub2RlJiYoUG9seW1lci5kb20odGhpcy4kLm5vZGV0aXRsZSkuaW5uZXJIVE1MPXRoaXMuX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZSh0aGlzLl9ub2RlLm5hbWUpKX0sX3Jlc2l6ZUxpc3Q6ZnVuY3Rpb24oYil7KGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihiKSkmJmIuZmlyZSgiaXJvbi1yZXNpemUiKX0sX3RvZ2dsZUluY2x1ZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIm5vZGUtdG9nZ2xlLWluY2x1c2lvbiIse25hbWU6dGhpcy5ncmFwaE5vZGVOYW1lfSl9LApfbm9kZUluY2x1ZGVTdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZXQoIl9hdXhCdXR0b25UZXh0Iix0Zi5ncmFwaC5nZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZyhiKSl9LF90b2dnbGVHcm91cDpmdW5jdGlvbigpe3ZhciBiPXRmLmdyYXBoLnNjZW5lLm5vZGUuZ2V0U2VyaWVzTmFtZSh0aGlzLl9ub2RlKTt0aGlzLmZpcmUoIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIix7bmFtZTpifSl9LF9pc0xpYnJhcnlGdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5uYW1lLnN0YXJ0c1dpdGgodGYuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCl9LF9pc0luU2VyaWVzOmZ1bmN0aW9uKGIpe3JldHVybiB0Zi5ncmFwaC5zY2VuZS5ub2RlLmNhbkJlSW5TZXJpZXMoYil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWluZm8vdGYtZ3JhcGgtaW5mby5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1pbmZvIixwcm9wZXJ0aWVzOnt0aXRsZTpTdHJpbmcsZ3JhcGhIaWVyYXJjaHk6T2JqZWN0LGdyYXBoOk9iamVjdCxyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGhlYWx0aFBpbGxTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sY29sb3JCeTpTdHJpbmcsY29tcGF0Tm9kZVRpdGxlOlN0cmluZyxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0saGlnaGxpZ2h0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkTm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sZGVidWdnZXJEYXRhRW5hYmxlZDpCb29sZWFufSxsaXN0ZW5lcnM6eyJub2RlLWxpc3QtaXRlbS1jbGljayI6Il9ub2RlTGlzdEl0ZW1DbGlja2VkIiwibm9kZS1saXN0LWl0ZW0tbW91c2VvdmVyIjoiX25vZGVMaXN0SXRlbU1vdXNlb3ZlciIsIm5vZGUtbGlzdC1pdGVtLW1vdXNlb3V0IjoiX25vZGVMaXN0SXRlbU1vdXNlb3V0In0sCl9ub2RlTGlzdEl0ZW1DbGlja2VkOmZ1bmN0aW9uKGIpe3RoaXMuc2VsZWN0ZWROb2RlPWIuZGV0YWlsLm5vZGVOYW1lfSxfbm9kZUxpc3RJdGVtTW91c2VvdmVyOmZ1bmN0aW9uKGIpe3RoaXMuaGlnaGxpZ2h0ZWROb2RlPWIuZGV0YWlsLm5vZGVOYW1lfSxfbm9kZUxpc3RJdGVtTW91c2VvdXQ6ZnVuY3Rpb24oKXt0aGlzLmhpZ2hsaWdodGVkTm9kZT1udWxsfSxfaGVhbHRoUGlsbHNBdmFpbGFibGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYiYmZCYmMDxPYmplY3Qua2V5cyhkKS5sZW5ndGh9LF9lcXVhbHM6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj09PWR9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWJvYXJkL3RmLWdyYXBoLWJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoLWJvYXJkIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTpPYmplY3QsZ3JhcGg6T2JqZWN0LHN0YXRzOk9iamVjdCxwcm9ncmVzczpPYmplY3QsdHJhY2VJbnB1dHM6Qm9vbGVhbixjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxkZWJ1Z2dlckRhdGFFbmFibGVkOkJvb2xlYW4sYXJlSGVhbHRoUGlsbHNMb2FkaW5nOkJvb2xlYW4sZGVidWdnZXJOdW1lcmljQWxlcnRzOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sbm9kZU5hbWVzVG9IZWFsdGhQaWxsczpPYmplY3QsYWxsU3RlcHNNb2RlRW5hYmxlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOjB9LGhlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsCm5vdGlmeTohMH0sY29tcGF0Tm9kZVRpdGxlOnt0eXBlOlN0cmluZyx2YWx1ZToiVFBVIENvbXBhdGliaWxpdHkifSxlZGdlV2lkdGhGdW5jdGlvbjpPYmplY3QsX3NlbGVjdGVkTm9kZUluY2x1ZGU6TnVtYmVyLF9oaWdobGlnaHRlZE5vZGU6U3RyaW5nLGhhbmRsZU5vZGVTZWxlY3RlZDpPYmplY3QsZWRnZUxhYmVsRnVuY3Rpb246T2JqZWN0LGhhbmRsZUVkZ2VTZWxlY3RlZDpPYmplY3R9LG9ic2VydmVyczpbIl91cGRhdGVOb2RlSW5jbHVkZShzZWxlY3RlZE5vZGUsIHJlbmRlckhpZXJhcmNoeSkiXSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLiQuZ3JhcGguZml0KCl9LF9pc05vdENvbXBsZXRlOmZ1bmN0aW9uKGIpe3JldHVybiAxMDA+Yi52YWx1ZX0sX2dldENvbnRhaW5lckNsYXNzOmZ1bmN0aW9uKGIpe3ZhciBkPSJjb250YWluZXIiO2IuZXJyb3ImJihkKz0iIGVycm9yIik7dGhpcy5faXNOb3RDb21wbGV0ZShiKSYmKGQrPSIgbG9hZGluZyIpO3JldHVybiBkfSxfb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZChiKXt0aGlzLiQuZ3JhcGgubm9kZVRvZ2dsZUV4dHJhY3QoYi5kZXRhaWwubmFtZSl9LApfb25Ob2RlU2VyaWVzR3JvdXBUb2dnbGVkKGIpe3RoaXMuJC5ncmFwaC5ub2RlVG9nZ2xlU2VyaWVzR3JvdXAoYi5kZXRhaWwubmFtZSl9LF91cGRhdGVOb2RlSW5jbHVkZSgpe2NvbnN0IGI9dGhpcy5yZW5kZXJIaWVyYXJjaHk/dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0Tm9kZUJ5TmFtZSh0aGlzLnNlbGVjdGVkTm9kZSk6bnVsbDt0aGlzLl9zZWxlY3RlZE5vZGVJbmNsdWRlPWI/Yi5pbmNsdWRlOnRmLmdyYXBoLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1tZW51LWJlaGF2aW9yL2lyb24tbWVudWJhci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGw9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJtZW51YmFyIn0sa2V5QmluZGluZ3M6e2xlZnQ6Il9vbkxlZnRLZXkiLHJpZ2h0OiJfb25SaWdodEtleSJ9LF9vblVwS2V5OmZ1bmN0aW9uKGIpe3RoaXMuZm9jdXNlZEl0ZW0uY2xpY2soKTtiLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24oYil7dGhpcy5mb2N1c2VkSXRlbS5jbGljaygpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sZ2V0IF9pc1JUTCgpe3JldHVybiJydGwiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlyZWN0aW9ufSxfb25MZWZ0S2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2lzUlRMP3RoaXMuX2ZvY3VzTmV4dCgpOnRoaXMuX2ZvY3VzUHJldmlvdXMoKTtiLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2lzUlRMPwp0aGlzLl9mb2N1c1ByZXZpb3VzKCk6dGhpcy5fZm9jdXNOZXh0KCk7Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25LZXlkb3duOmZ1bmN0aW9uKGIpe3RoaXMua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGIsInVwIGRvd24gbGVmdCByaWdodCBlc2MiKXx8dGhpcy5fZm9jdXNXaXRoS2V5Ym9hcmRFdmVudChiKX19O1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvcj1bUG9seW1lci5Jcm9uTWVudUJlaGF2aW9yLFBvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJhZGlvLWJ1dHRvbi9wYXBlci1yYWRpby1idXR0b24uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItcmFkaW8tYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToicmFkaW8iLCJhcmlhLWNoZWNrZWQiOiExLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e2FyaWFBY3RpdmVBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJhcmlhLWNoZWNrZWQifX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnJhZGlvQ29udGFpbmVyfSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUiKS50cmltKCkpe3ZhciBiPXBhcnNlRmxvYXQodGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSIpLnRyaW0oKSksCmQ9TWF0aC5mbG9vcigzKmIpO2QlMiE9PWIlMiYmZCsrO3RoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUiOmQrInB4In0pfX0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJhZGlvLWdyb3VwL3BhcGVyLXJhZGlvLWdyb3VwLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXJhZGlvLWdyb3VwIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InJhZGlvZ3JvdXAifSxwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJuYW1lIn0sc2VsZWN0ZWRBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJjaGVja2VkIn0sc2VsZWN0YWJsZTp7dHlwZTpTdHJpbmcsdmFsdWU6InBhcGVyLXJhZGlvLWJ1dHRvbiJ9LGFsbG93RW1wdHlTZWxlY3Rpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LHNlbGVjdDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl92YWx1ZVRvSXRlbShiKTtpZighZHx8IWQuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXtpZih0aGlzLnNlbGVjdGVkKXtkPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2lmKHRoaXMuc2VsZWN0ZWQ9PWIpaWYodGhpcy5hbGxvd0VtcHR5U2VsZWN0aW9uKWI9IiI7ZWxzZXtkJiYKKGQuY2hlY2tlZD0hMCk7cmV0dXJufWQmJihkLmNoZWNrZWQ9ITEpfVBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5zZWxlY3QuYXBwbHkodGhpcyxbYl0pO3RoaXMuZmlyZSgicGFwZXItcmFkaW8tZ3JvdXAtY2hhbmdlZCIpfX0sX2FjdGl2YXRlRm9jdXNlZEl0ZW06ZnVuY3Rpb24oKXt0aGlzLl9pdGVtQWN0aXZhdGUodGhpcy5fdmFsdWVGb3JJdGVtKHRoaXMuZm9jdXNlZEl0ZW0pLHRoaXMuZm9jdXNlZEl0ZW0pfSxfb25VcEtleTpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c1ByZXZpb3VzKCk7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uRG93bktleTpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c05leHQoKTtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fYWN0aXZhdGVGb2N1c2VkSXRlbSgpfSxfb25MZWZ0S2V5OmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGwuX29uTGVmdEtleS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CnRoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uUmlnaHRLZXk6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uTWVudWJhckJlaGF2aW9ySW1wbC5fb25SaWdodEtleS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5fYWN0aXZhdGVGb2N1c2VkSXRlbSgpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvb2x0aXAvcGFwZXItdG9vbHRpcC5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b29sdGlwIixob3N0QXR0cmlidXRlczp7cm9sZToidG9vbHRpcCIsdGFiaW5kZXg6LTF9LHByb3BlcnRpZXM6e2Zvcjp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9maW5kVGFyZ2V0In0sbWFudWFsTW9kZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfbWFudWFsTW9kZUNoYW5nZWQifSxwb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImJvdHRvbSJ9LGZpdFRvVmlzaWJsZUJvdW5kczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxvZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjE0fSxtYXJnaW5Ub3A6e3R5cGU6TnVtYmVyLHZhbHVlOjE0fSxhbmltYXRpb25EZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwLG9ic2VydmVyOiJfZGVsYXlDaGFuZ2UifSxhbmltYXRpb25FbnRyeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGFuaW1hdGlvbkV4aXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LAp2YWx1ZTpmdW5jdGlvbigpe3JldHVybntlbnRyeTpbe25hbWU6ImZhZGUtaW4tYW5pbWF0aW9uIixub2RlOnRoaXMsdGltaW5nOntkZWxheTowfX1dLGV4aXQ6W3tuYW1lOiJmYWRlLW91dC1hbmltYXRpb24iLG5vZGU6dGhpc31dfX19LF9zaG93aW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxsaXN0ZW5lcnM6e3dlYmtpdEFuaW1hdGlvbkVuZDoiX29uQW5pbWF0aW9uRW5kIn0sZ2V0IHRhcmdldCgpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMpLnBhcmVudE5vZGUsZD1Qb2x5bWVyLmRvbSh0aGlzKS5nZXRPd25lclJvb3QoKTtyZXR1cm4gdGhpcy5mb3I/UG9seW1lci5kb20oZCkucXVlcnlTZWxlY3RvcigiIyIrdGhpcy5mb3IpOmIubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERT9kLmhvc3Q6Yn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5kVGFyZ2V0KCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5tYW51YWxNb2RlfHx0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKX0sCnBsYXlBbmltYXRpb246ZnVuY3Rpb24oYil7ImVudHJ5Ij09PWI/dGhpcy5zaG93KCk6ImV4aXQiPT09YiYmdGhpcy5oaWRlKCl9LGNhbmNlbEFuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImNhbmNlbC1hbmltYXRpb24iKX0sc2hvdzpmdW5jdGlvbigpe2lmKCF0aGlzLl9zaG93aW5nKXtpZigiIj09PVBvbHltZXIuZG9tKHRoaXMpLnRleHRDb250ZW50LnRyaW0oKSl7Zm9yKHZhciBiPSEwLGQ9UG9seW1lci5kb20odGhpcykuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpLGY9MDtmPGQubGVuZ3RoO2YrKylpZigiIiE9PWRbZl0udGV4dENvbnRlbnQudHJpbSgpKXtiPSExO2JyZWFrfWlmKGIpcmV0dXJufXRoaXMuX3Nob3dpbmc9ITA7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiY2FuY2VsLWFuaW1hdGlvbiIpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKTsKdGhpcy51cGRhdGVQb3NpdGlvbigpO3RoaXMuX2FuaW1hdGlvblBsYXlpbmc9ITA7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKX19LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLl9zaG93aW5nJiYodGhpcy5fYW5pbWF0aW9uUGxheWluZz8odGhpcy5fc2hvd2luZz0hMSx0aGlzLl9jYW5jZWxBbmltYXRpb24oKSk6KHRoaXMuX29uQW5pbWF0aW9uRmluaXNoKCksdGhpcy5fc2hvd2luZz0hMSx0aGlzLl9hbmltYXRpb25QbGF5aW5nPSEwKSl9LHVwZGF0ZVBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fdGFyZ2V0JiZ0aGlzLm9mZnNldFBhcmVudCl7dmFyIGI9dGhpcy5vZmZzZXQ7MTQhPXRoaXMubWFyZ2luVG9wJiYxND09dGhpcy5vZmZzZXQmJihiPXRoaXMubWFyZ2luVG9wKTt2YXIgZD10aGlzLm9mZnNldFBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxmPXRoaXMuX3RhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKaD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGs9KGYud2lkdGgtaC53aWR0aCkvMix0PShmLmhlaWdodC1oLmhlaWdodCkvMixsPWYubGVmdC1kLmxlZnQscD1mLnRvcC1kLnRvcDtzd2l0Y2godGhpcy5wb3NpdGlvbil7Y2FzZSAidG9wIjp2YXIgbT1sK2s7dmFyIG49cC1oLmhlaWdodC1iO2JyZWFrO2Nhc2UgImJvdHRvbSI6bT1sK2s7bj1wK2YuaGVpZ2h0K2I7YnJlYWs7Y2FzZSAibGVmdCI6bT1sLWgud2lkdGgtYjtuPXArdDticmVhaztjYXNlICJyaWdodCI6bT1sK2Yud2lkdGgrYixuPXArdH10aGlzLmZpdFRvVmlzaWJsZUJvdW5kcz8oZC5sZWZ0K20raC53aWR0aD53aW5kb3cuaW5uZXJXaWR0aD8odGhpcy5zdHlsZS5yaWdodD0iMHB4Iix0aGlzLnN0eWxlLmxlZnQ9ImF1dG8iKToodGhpcy5zdHlsZS5sZWZ0PU1hdGgubWF4KDAsbSkrInB4Iix0aGlzLnN0eWxlLnJpZ2h0PSJhdXRvIiksZC50b3ArbitoLmhlaWdodD53aW5kb3cuaW5uZXJIZWlnaHQ/KHRoaXMuc3R5bGUuYm90dG9tPQpkLmhlaWdodCsicHgiLHRoaXMuc3R5bGUudG9wPSJhdXRvIik6KHRoaXMuc3R5bGUudG9wPU1hdGgubWF4KC1kLnRvcCxuKSsicHgiLHRoaXMuc3R5bGUuYm90dG9tPSJhdXRvIikpOih0aGlzLnN0eWxlLmxlZnQ9bSsicHgiLHRoaXMuc3R5bGUudG9wPW4rInB4Iil9fSxfYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdGFyZ2V0JiYodGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWVudGVyIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwiZm9jdXMiLCJzaG93IiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWxlYXZlIiwiaGlkZSIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwiYmx1ciIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsInRhcCIsImhpZGUiKSk7dGhpcy5saXN0ZW4odGhpcy4kLnRvb2x0aXAsImFuaW1hdGlvbmVuZCIsIl9vbkFuaW1hdGlvbkVuZCIpO3RoaXMubGlzdGVuKHRoaXMsIm1vdXNlZW50ZXIiLCJoaWRlIil9LApfZmluZFRhcmdldDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk7dGhpcy5fdGFyZ2V0PXRoaXMudGFyZ2V0O3RoaXMubWFudWFsTW9kZXx8dGhpcy5fYWRkTGlzdGVuZXJzKCl9LF9kZWxheUNoYW5nZTpmdW5jdGlvbihiKXs1MDAhPT1iJiZ0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiI6YisibXMifSl9LF9tYW51YWxNb2RlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZT90aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTp0aGlzLl9hZGRMaXN0ZW5lcnMoKX0sX2NhbmNlbEFuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSk7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKTsKdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIil9LF9vbkFuaW1hdGlvbkZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX3Nob3dpbmcmJih0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImVudHJ5IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSkpfSxfb25BbmltYXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9hbmltYXRpb25QbGF5aW5nPSExO3RoaXMuX3Nob3dpbmd8fCh0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIikpfSxfZ2V0QW5pbWF0aW9uVHlwZTpmdW5jdGlvbihiKXtpZigiZW50cnkiPT09YiYmIiIhPT10aGlzLmFuaW1hdGlvbkVudHJ5KXJldHVybiB0aGlzLmFuaW1hdGlvbkVudHJ5OwppZigiZXhpdCI9PT1iJiYiIiE9PXRoaXMuYW5pbWF0aW9uRXhpdClyZXR1cm4gdGhpcy5hbmltYXRpb25FeGl0O2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdJiYic3RyaW5nIj09PXR5cGVvZiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS5uYW1lKXtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS50aW1pbmcmJnRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdWzBdLnRpbWluZy5kZWxheSYmMCE9PXRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdWzBdLnRpbWluZy5kZWxheSl7dmFyIGQ9dGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0udGltaW5nLmRlbGF5OyJlbnRyeSI9PT1iP3RoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci10b29sdGlwLWRlbGF5LWluIjpkKyJtcyJ9KToiZXhpdCI9PT1iJiZ0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQiOmQrIm1zIn0pfXJldHVybiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS5uYW1lfX0sX3JlbW92ZUxpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmCih0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VlbnRlciIsInNob3ciKSx0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwiZm9jdXMiLCJzaG93IiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsIm1vdXNlbGVhdmUiLCJoaWRlIiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsImJsdXIiLCJoaWRlIiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsInRhcCIsImhpZGUiKSk7dGhpcy51bmxpc3Rlbih0aGlzLiQudG9vbHRpcCwiYW5pbWF0aW9uZW5kIiwiX29uQW5pbWF0aW9uRW5kIik7dGhpcy51bmxpc3Rlbih0aGlzLCJtb3VzZWVudGVyIiwiaGlkZSIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW5vZGUtc2VhcmNoL3RmLWdyYXBoLW5vZGUtc2VhcmNoLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoLW5vZGUtc2VhcmNoIixwcm9wZXJ0aWVzOntyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfcmF3UmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9yZWdleElucHV0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSZWdleElucHV0KHJlbmRlckhpZXJhcmNoeSwgX3Jhd1JlZ2V4SW5wdXQpIn0sX3ByZXZpb3VzUmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9zZWFyY2hUaW1lb3V0RGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjE1MCxyZWFkT25seTohMH0sX3NlYXJjaFBlbmRpbmc6Qm9vbGVhbixfbWF4UmVnZXhSZXN1bHRzOnt0eXBlOk51bWJlcix2YWx1ZTo0Mn0sX3JlZ2V4TWF0Y2hlczpBcnJheX0sb2JzZXJ2ZXJzOlsiX3JlZ2V4SW5wdXRDaGFuZ2VkKF9yZWdleElucHV0KSJdLF9jb21wdXRlUmVnZXhJbnB1dChiLGQpe3JldHVybiBkLnRyaW0oKX0sCl9yZWdleElucHV0Q2hhbmdlZCgpe3RoaXMuX3JlcXVlc3RTZWFyY2goKX0sX2NsZWFyU2VhcmNoUmVzdWx0cygpe3RoaXMuc2V0KCJfcmVnZXhNYXRjaGVzIixbXSl9LF9yZXF1ZXN0U2VhcmNoKCl7dGhpcy5fc2VhcmNoUGVuZGluZ3x8KHRoaXMuX3JlZ2V4SW5wdXQ9PT10aGlzLl9wcmV2aW91c1JlZ2V4SW5wdXQ/dGhpcy5fc2VhcmNoUGVuZGluZz0hMToodGhpcy5fc2VhcmNoUGVuZGluZz0hMCx0aGlzLl9leGVjdXRlU2VhcmNoKCksdGhpcy5hc3luYygoKT0+e3RoaXMuX3NlYXJjaFBlbmRpbmc9ITE7dGhpcy5fcmVxdWVzdFNlYXJjaCgpfSx0aGlzLl9zZWFyY2hUaW1lb3V0RGVsYXkpKSl9LF9leGVjdXRlU2VhcmNoKCl7aWYodGhpcy5fcHJldmlvdXNSZWdleElucHV0PXRoaXMuX3JlZ2V4SW5wdXQpe3RyeXt2YXIgYj1uZXcgUmVnRXhwKHRoaXMuX3JlZ2V4SW5wdXQpfWNhdGNoKGYpe3RoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpO3JldHVybn12YXIgZD1bXTtfLmVhY2godGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5LmdldE5vZGVNYXAoKSwKKGYsaCk9PntpZihkLmxlbmd0aD49dGhpcy5fbWF4UmVnZXhSZXN1bHRzKXJldHVybiExO2IudGVzdChoKSYmZC5wdXNoKGgpfSk7dGhpcy5zZXQoIl9yZWdleE1hdGNoZXMiLGQpfWVsc2UgdGhpcy5fY2xlYXJTZWFyY2hSZXN1bHRzKCl9LF9tYXRjaENsaWNrZWQoYil7dGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsYi5tb2RlbC5pdGVtKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb250cm9scy90Zi1ncmFwaC1jb250cm9scy5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjb25zdCBoPS9kZXZpY2U6KFteOl0rOlswLTldKykkLyxrPVt7cmVnZXg6aH1dLHQ9W107bGV0IGw7KGZ1bmN0aW9uKG0pe20uQ09NUFVURV9USU1FPSJjb21wdXRlX3RpbWUiO20uTUVNT1JZPSJtZW1vcnkiO20uU1RSVUNUVVJFPSJzdHJ1Y3R1cmUiO20uWExBX0NMVVNURVI9InhsYV9jbHVzdGVyIjttLk9QX0NPTVBBVElCSUxJVFk9Im9wX2NvbXBhdGliaWxpdHkifSkobD1mLkNvbG9yQnl8fChmLkNvbG9yQnk9e30pKTtjb25zdCBwPW5ldyBTZXQoW2wuQ09NUFVURV9USU1FLGwuTUVNT1JZXSk7UG9seW1lcih7aXM6InRmLWdyYXBoLWNvbnRyb2xzIixwcm9wZXJ0aWVzOntzdGF0czp7dmFsdWU6bnVsbCx0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3N0YXRzQ2hhbmdlZCJ9LGRldmljZXNGb3JTdGF0czp7dmFsdWU6bnVsbCx0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZG9ubHk6ITB9LGNvbG9yQnk6e3R5cGU6U3RyaW5nLAp2YWx1ZTpsLlNUUlVDVFVSRSxub3RpZnk6ITB9LGNvbG9yQnlQYXJhbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxyZWFkb25seTohMH0sZGF0YXNldHM6e3R5cGU6QXJyYXksb2JzZXJ2ZXI6Il9kYXRhc2V0c0NoYW5nZWQiLHZhbHVlOigpPT5bXX0scmVuZGVySGllcmFyY2h5Ont0eXBlOk9iamVjdH0sc2VsZWN0aW9uOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZE9ubHk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlU2VsZWN0aW9uKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgsIF9zZWxlY3RlZEdyYXBoVHlwZSkifSxzZWxlY3RlZEZpbGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sX3NlbGVjdGVkUnVuSW5kZXg6e3R5cGU6TnVtYmVyLHZhbHVlOjAsb2JzZXJ2ZXI6Il9zZWxlY3RlZFJ1bkluZGV4Q2hhbmdlZCJ9LHRyYWNlSW5wdXRzOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxfc2VsZWN0ZWRUYWdJbmRleDp7dHlwZTpOdW1iZXIsCnZhbHVlOjAsb2JzZXJ2ZXI6Il9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCJ9LF9zZWxlY3RlZEdyYXBoVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIfSxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2N1cnJlbnREZXZpY2VzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0Q3VycmVudERldmljZXMoZGV2aWNlc0ZvclN0YXRzKSJ9LF9jdXJyZW50RGV2aWNlUGFyYW1zOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0Q3VycmVudERldmljZVBhcmFtcyhjb2xvckJ5UGFyYW1zKSJ9LF9jdXJyZW50WGxhQ2x1c3RlclBhcmFtczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnRYbGFDbHVzdGVyUGFyYW1zKGNvbG9yQnlQYXJhbXMpIn0sX2N1cnJlbnRHcmFkaWVudFBhcmFtczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXRDdXJyZW50R3JhZGllbnRQYXJhbXMoY29sb3JCeVBhcmFtcywgY29sb3JCeSkifSwKc2hvd1Nlc3Npb25SdW5zRHJvcGRvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sc2hvd1VwbG9hZEJ1dHRvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxoZWFsdGhQaWxsc0ZlYXR1cmVFbmFibGVkOkJvb2xlYW4saGVhbHRoUGlsbHNUb2dnbGVkT246e3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9LF9sZWdlbmRPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LF94bGFDbHVzdGVyc1Byb3ZpZGVkOmZ1bmN0aW9uKG0pe3JldHVybiBtJiZtLmhpZXJhcmNoeSYmMDxtLmhpZXJhcmNoeS54bGFDbHVzdGVycy5sZW5ndGh9LF9zdGF0c0NoYW5nZWQ6ZnVuY3Rpb24obSl7aWYobnVsbCE9bSl7dmFyIG49e307Xy5lYWNoKG0uZGV2X3N0YXRzLGZ1bmN0aW9uKHEpe3ZhciB1PV8uc29tZShrLGZ1bmN0aW9uKEEpe3JldHVybiBBLnJlZ2V4LnRlc3QocS5kZXZpY2UpfSkseD1fLnNvbWUodCxmdW5jdGlvbihBKXtyZXR1cm4gQS5yZWdleC50ZXN0KHEuZGV2aWNlKX0pO3UmJiF4JiYobltxLmRldmljZV09CiEwKX0pO3RoaXMuc2V0KCJkZXZpY2VzRm9yU3RhdHMiLG4pfX0sX2dldEN1cnJlbnREZXZpY2VzOmZ1bmN0aW9uKG0pe3ZhciBuPXRoaXMuc3RhdHM7bj0obj9uLmRldl9zdGF0czpbXSkubWFwKHU9PnUuZGV2aWNlKS5maWx0ZXIodT0+ay5zb21lKHg9PngucmVnZXgudGVzdCh1KSkpO2NvbnN0IHE9Yi5ncmFwaC51dGlsLnJlbW92ZUNvbW1vblByZWZpeChuKTtpZigxPT1xLmxlbmd0aCl7Y29uc3QgdT1xWzBdLm1hdGNoKGgpO3UmJihxWzBdPXVbMV0pfXJldHVybiBuLm1hcCgodSx4KT0+e2xldCBBPW51bGw7dC5mb3JFYWNoKHk9Pnt5LnJlZ2V4LnRlc3QodSkmJihBPXkubXNnKX0pO3JldHVybntkZXZpY2U6dSxzdWZmaXg6cVt4XSx1c2VkOm1bdV0saWdub3JlZE1zZzpBfX0pfSxfZGV2aWNlQ2hlY2tib3hDbGlja2VkOmZ1bmN0aW9uKG0pe209bS50YXJnZXQ7Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LHRoaXMuZGV2aWNlc0ZvclN0YXRzKSxxPW0udmFsdWU7bS5jaGVja2VkPwpuW3FdPSEwOmRlbGV0ZSBuW3FdO3RoaXMuc2V0KCJkZXZpY2VzRm9yU3RhdHMiLG4pfSxfbnVtVGFnczpmdW5jdGlvbihtLG4pe3JldHVybiB0aGlzLl9nZXRUYWdzKG0sbikubGVuZ3RofSxfZ2V0VGFnczpmdW5jdGlvbihtLG4pe3JldHVybiBtJiZtW25dP21bbl0udGFnczpbXX0sX2ZpdDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZml0LXRhcCIpfSxfaXNHcmFkaWVudENvbG9yaW5nOmZ1bmN0aW9uKG0sbil7cmV0dXJuIHAuaGFzKG4pJiZudWxsIT1tfSxfZXF1YWxzOmZ1bmN0aW9uKG0sbil7cmV0dXJuIG09PT1ufSxfZ2V0Q3VycmVudERldmljZVBhcmFtczpmdW5jdGlvbihtKXttPW0uZGV2aWNlLmZpbHRlcih1PT5rLnNvbWUoeD0+eC5yZWdleC50ZXN0KHUuZGV2aWNlKSkpO2NvbnN0IG49Yi5ncmFwaC51dGlsLnJlbW92ZUNvbW1vblByZWZpeChtLm1hcCh1PT51LmRldmljZSkpO2lmKDE9PW4ubGVuZ3RoKXt2YXIgcT1uWzBdLm1hdGNoKGgpO3EmJihuWzBdPXFbMV0pfXJldHVybiBtLm1hcCgodSwKeCk9Pih7ZGV2aWNlOm5beF0sY29sb3I6dS5jb2xvcn0pKX0sX2dldEN1cnJlbnRYbGFDbHVzdGVyUGFyYW1zOmZ1bmN0aW9uKG0pe3JldHVybiBtLnhsYV9jbHVzdGVyfSxfZ2V0Q3VycmVudEdyYWRpZW50UGFyYW1zOmZ1bmN0aW9uKG0sbil7aWYodGhpcy5faXNHcmFkaWVudENvbG9yaW5nKHRoaXMuc3RhdHMsbikpe209bVtuXTt2YXIgcT1tLm1pblZhbHVlLHU9bS5tYXhWYWx1ZTtuPT09bC5NRU1PUlk/KHE9Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShxLGIuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpLHU9Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZSh1LGIuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpKTpuPT09bC5DT01QVVRFX1RJTUUmJihxPWIuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUocSxiLmdyYXBoLnV0aWwuVElNRV9VTklUUyksdT1iLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKHUsCmIuZ3JhcGgudXRpbC5USU1FX1VOSVRTKSk7cmV0dXJue21pblZhbHVlOnEsbWF4VmFsdWU6dSxzdGFydENvbG9yOm0uc3RhcnRDb2xvcixlbmRDb2xvcjptLmVuZENvbG9yfX19LGRvd25sb2FkOmZ1bmN0aW9uKCl7dGhpcy4kLmdyYXBoZG93bmxvYWQuY2xpY2soKX0sX3VwZGF0ZUZpbGVJbnB1dDpmdW5jdGlvbihtKXt2YXIgbj1tLnRhcmdldC5maWxlc1swXTtpZihuKXtuPW4ubmFtZTt2YXIgcT1uLmxhc3RJbmRleE9mKCIuIik7MDw9cSYmKG49bi5zdWJzdHJpbmcoMCxxKSk7cT1uLmxhc3RJbmRleE9mKCIvIik7MDw9cSYmKG49bi5zdWJzdHJpbmcocSsxKSk7dGhpcy5fc2V0RG93bmxvYWRGaWxlbmFtZShuKTt0aGlzLnNldCgic2VsZWN0ZWRGaWxlIixtKX19LF9kYXRhc2V0c0NoYW5nZWQ6ZnVuY3Rpb24obSxuKXtudWxsIT1uJiYodGhpcy5fc2VsZWN0ZWRSdW5JbmRleD0wKX0sX2NvbXB1dGVTZWxlY3Rpb246ZnVuY3Rpb24obSxuLHEsdSl7cmV0dXJuIG1bbl0mJm1bbl0udGFnc1txXT8Ke3J1bjptW25dLm5hbWUsdGFnOm1bbl0udGFnc1txXS50YWcsdHlwZTp1fTpudWxsfSxfc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQ6ZnVuY3Rpb24obSl7dGhpcy5kYXRhc2V0cyYmKHRoaXMuY29sb3JCeT1sLlNUUlVDVFVSRSx0aGlzLl9zZWxlY3RlZFRhZ0luZGV4PTAsdGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGU9dGhpcy5fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKSx0aGlzLnRyYWNlSW5wdXRzPSExLHRoaXMuX3NldERvd25sb2FkRmlsZW5hbWUodGhpcy5kYXRhc2V0c1ttXT90aGlzLmRhdGFzZXRzW21dLm5hbWU6IiIpKX0sX3NlbGVjdGVkVGFnSW5kZXhDaGFuZ2VkKCl7dGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGU9dGhpcy5fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKX0sX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl7Y29uc3QgbT10aGlzLmRhdGFzZXRzLG49dGhpcy5fc2VsZWN0ZWRSdW5JbmRleCxxPXRoaXMuX3NlbGVjdGVkVGFnSW5kZXg7cmV0dXJuIG0mJm1bbl0mJm1bbl0udGFnc1txXSYmCiFtW25dLnRhZ3NbcV0ub3BHcmFwaD9tW25dLnRhZ3NbcV0ucHJvZmlsZT9iLmdyYXBoLlNlbGVjdGlvblR5cGUuUFJPRklMRTptW25dLnRhZ3NbcV0uY29uY2VwdHVhbEdyYXBoP2IuZ3JhcGguU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIOmIuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSDpiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEh9LF9nZXRGaWxlOmZ1bmN0aW9uKCl7dGhpcy4kJCgiI2ZpbGUiKS5jbGljaygpfSxfc2V0RG93bmxvYWRGaWxlbmFtZTpmdW5jdGlvbihtKXt0aGlzLiQuZ3JhcGhkb3dubG9hZC5zZXRBdHRyaWJ1dGUoImRvd25sb2FkIixtKyIucG5nIil9LF9zdGF0c05vdE51bGw6ZnVuY3Rpb24obSl7cmV0dXJuIG51bGwhPT1tfSxfdG9nZ2xlTGVnZW5kT3Blbigpe3RoaXMuc2V0KCJfbGVnZW5kT3BlbmVkIiwhdGhpcy5fbGVnZW5kT3BlbmVkKX0sX2dldFRvZ2dsZVRleHQobSl7cmV0dXJuIG0/IkNsb3NlIGxlZ2VuZC4iOiJFeHBhbmQgbGVnZW5kLiJ9LApfZ2V0VG9nZ2xlTGVnZW5kSWNvbihtKXtyZXR1cm4gbT8iZXhwYW5kLW1vcmUiOiJleHBhbmQtbGVzcyJ9LF9nZXRTZWxlY3Rpb25PcEdyYXBoRGlzYWJsZWQobSxuLHEpe3JldHVybiFtW25dfHwhbVtuXS50YWdzW3FdfHwhbVtuXS50YWdzW3FdLm9wR3JhcGh9LF9nZXRTZWxlY3Rpb25Qcm9maWxlRGlzYWJsZWQobSxuLHEpe3JldHVybiFtW25dfHwhbVtuXS50YWdzW3FdfHwhbVtuXS50YWdzW3FdLnByb2ZpbGV9LF9nZXRTZWxlY3Rpb25Db25jZXB0dWFsR3JhcGhEaXNhYmxlZChtLG4scSl7cmV0dXJuIW1bbl18fCFtW25dLnRhZ3NbcV18fCFtW25dLnRhZ3NbcV0uY29uY2VwdHVhbEdyYXBofX0pfSkoZC5jb250cm9sc3x8KGQuY29udHJvbHM9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtbG9hZGVyL3RmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIuanMKVWk9dGhpcyYmdGhpcy5fX2F3YWl0ZXJ8fGZ1bmN0aW9uKGIsZCxmLGgpe3JldHVybiBuZXcgKGZ8fChmPVByb21pc2UpKShmdW5jdGlvbihrLHQpe2Z1bmN0aW9uIGwobil7dHJ5e20oaC5uZXh0KG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBwKG4pe3RyeXttKGhbInRocm93Il0obikpfWNhdGNoKHEpe3QocSl9fWZ1bmN0aW9uIG0obil7bi5kb25lP2sobi52YWx1ZSk6KG5ldyBmKGZ1bmN0aW9uKHEpe3Eobi52YWx1ZSl9KSkudGhlbihsLHApfW0oKGg9aC5hcHBseShiLGR8fFtdKSkubmV4dCgpKX0pfTsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlciIsX3RlbXBsYXRlOm51bGwscHJvcGVydGllczp7ZGF0YXNldHM6QXJyYXkscHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sc2VsZWN0aW9uOk9iamVjdCxzZWxlY3RlZEZpbGU6T2JqZWN0LGNvbXBhdGliaWxpdHlQcm92aWRlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBiLmdyYXBoLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcn0saGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+Yi5ncmFwaC5oaWVyYXJjaHkuRGVmYXVsdEhpZXJhcmNoeVBhcmFtc30sb3V0R3JhcGhIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0R3JhcGg6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0U3RhdHM6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sCl9ncmFwaFJ1blRhZzpPYmplY3R9LG9ic2VydmVyczpbIl9zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbiwgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSIsIl9zZWxlY3RlZEZpbGVDaGFuZ2VkKHNlbGVjdGVkRmlsZSwgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSJdLF9zZWxlY3Rpb25DaGFuZ2VkKCl7dGhpcy5kZWJvdW5jZSgic2VsZWN0aW9uY2hhbmdlIiwoKT0+e3RoaXMuX2xvYWQodGhpcy5zZWxlY3Rpb24pfSl9LF9sb2FkOmZ1bmN0aW9uKGYpe2NvbnN0IGg9Zi5ydW4saz1mLnRhZztmPWYudHlwZTtzd2l0Y2goZil7Y2FzZSBiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEg6Y2FzZSBiLmdyYXBoLlNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSDp0aGlzLl9zZXRPdXRTdGF0cyhudWxsKTt2YXIgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3Quc2V0KCJydW4iLGgpO3Quc2V0KCJjb25jZXB0dWFsIixTdHJpbmcoZj09PWIuZ3JhcGguU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIKSk7CmsmJnQuc2V0KCJ0YWciLGspO2Y9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ncmFwaCIsdCk7cmV0dXJuIHRoaXMuX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZikudGhlbigoKT0+e3RoaXMuX2dyYXBoUnVuVGFnPXtydW46aCx0YWc6a319KTtjYXNlIGIuZ3JhcGguU2VsZWN0aW9uVHlwZS5QUk9GSUxFOnsoe3RhZ3M6Zn09dGhpcy5kYXRhc2V0cy5maW5kKCh7bmFtZTptfSk9Pm09PT1oKSk7Y29uc3QgbD1mLmZpbmQobT0+bS50YWc9PT1rKS5vcEdyYXBoP2s6bnVsbDtjb25zb2xlLmFzc2VydChmLmZpbmQobT0+bS50YWc9PT1sKSxgUmVxdWlyZWQgdGFnICgke2x9KSBpcyBtaXNzaW5nLmApO2Y9dGhpcy5fZ3JhcGhSdW5UYWcmJnRoaXMuX2dyYXBoUnVuVGFnLnJ1bj09PWgmJnRoaXMuX2dyYXBoUnVuVGFnLnRhZz09PWw/UHJvbWlzZS5yZXNvbHZlKCk6dGhpcy5fbG9hZCh7cnVuOmgsdGFnOmwsdHlwZTpiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEh9KTsKdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3Quc2V0KCJ0YWciLGspO3Quc2V0KCJydW4iLGgpO2NvbnN0IHA9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ydW5fbWV0YWRhdGEiLHQpO3JldHVybiBmLnRoZW4oKCk9PnRoaXMuX3JlYWRBbmRQYXJzZU1ldGFkYXRhKHApKX1kZWZhdWx0OnJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcihgVW5rbm93biBzZWxlY3Rpb24gdHlwZTogJHtmfWApKX19LF9yZWFkQW5kUGFyc2VNZXRhZGF0YTpmdW5jdGlvbihmKXt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pO2IuZ3JhcGgucGFyc2VyLmZldGNoQW5kUGFyc2VNZXRhZGF0YShmLGIuZ3JhcGgudXRpbC5nZXRUcmFja2VyKHRoaXMpKS50aGVuKGg9Pnt0aGlzLl9zZXRPdXRTdGF0cyhoKX0pfSxfZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaDpmdW5jdGlvbihmLGgpe3JldHVybiBVaSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7dGhpcy5zZXQoInByb2dyZXNzIiwKe3ZhbHVlOjAsbXNnOiIifSk7cmV0dXJuIGIuZ3JhcGgubG9hZGVyLmZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoYi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcyksZixoLHRoaXMuY29tcGF0aWJpbGl0eVByb3ZpZGVyLHRoaXMuaGllcmFyY2h5UGFyYW1zKS50aGVuKCh7Z3JhcGg6ayxncmFwaEhpZXJhcmNoeTp0fSk9Pnt0aGlzLl9zZXRPdXRHcmFwaChrKTt0aGlzLl9zZXRPdXRHcmFwaEhpZXJhcmNoeSh0KX0pfSl9LF9zZWxlY3RlZEZpbGVDaGFuZ2VkOmZ1bmN0aW9uKGYpe2lmKGYpe2Y9Zi50YXJnZXQ7dmFyIGg9Zi5maWxlc1swXTtoJiYoZi52YWx1ZT0iIix0aGlzLl9mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKG51bGwsaCkpfX19KX0pKGQubG9hZGVyfHwoZC5sb2FkZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtZGFzaGJvYXJkL3RmLWdyYXBoLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19kYXRhc2V0czp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9kYXRhc2V0c0ZldGNoZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3NlbGVjdGVkRGF0YXNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3JlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX2RlYnVnZ2VyRGF0YUVuYWJsZWQ6Qm9vbGVhbixhbGxTdGVwc01vZGVFbmFibGVkOkJvb2xlYW4sc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saGVhbHRoUGlsbHNUb2dnbGVkT246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZCJ9LApzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2lzQXR0YWNoZWQ6Qm9vbGVhbixfaW5pdGlhbGl6ZWQ6Qm9vbGVhbixfYXJlSGVhbHRoUGlsbHNMb2FkaW5nOkJvb2xlYW4sX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0czp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LF9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2hlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLF9oZWFsdGhQaWxsUmVxdWVzdElkOnt0eXBlOk51bWJlcix2YWx1ZToxfSxfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZDpOdW1iZXIsX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVyRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMCxyZWFkT25seTohMH0scnVuczpBcnJheSxydW46e3R5cGU6U3RyaW5nLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXRTdHJpbmdJbml0aWFsaXplcigicnVuIix7ZGVmYXVsdFZhbHVlOiIiLHVzZUxvY2FsU3RvcmFnZTohMX0pLG9ic2VydmVyOiJfcnVuT2JzZXJ2ZXIifSwKX3NlbGVjdGlvbjp7dHlwZTpPYmplY3R9LF9jb21wYXRpYmlsaXR5UHJvdmlkZXI6T2JqZWN0LF90cmFjZUlucHV0czpCb29sZWFufSxsaXN0ZW5lcnM6eyJub2RlLXRvZ2dsZS1leHBhbmQiOiJfaGFuZGxlTm9kZVRvZ2dsZUV4cGFuZCJ9LG9ic2VydmVyczpbIl9tYXliZUZldGNoSGVhbHRoUGlsbHMoX2RlYnVnZ2VyRGF0YUVuYWJsZWQsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIHNwZWNpZmljSGVhbHRoUGlsbFN0ZXAsIF9zZWxlY3RlZE5vZGUpIiwiX21heWJlSW5pdGlhbGl6ZURhc2hib2FyZChfaXNBdHRhY2hlZCkiLCJfZGV0ZXJtaW5lU2VsZWN0ZWREYXRhc2V0KF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgcnVuKSIsIl91cGRhdGVTZWxlY3RlZERhdGFzZXROYW1lKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgX3NlbGVjdGVkRGF0YXNldCkiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsCiExKX0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5fZGVidWdnZXJEYXRhRW5hYmxlZHx8dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShiPT57Yi5jYW5jZWxsZWR8fGIudmFsdWVbImRlYnVnZ2VyIl0mJnRoaXMuc2V0KCJfZGVidWdnZXJEYXRhRW5hYmxlZCIsITApfSkpO3RoaXMuX21heWJlRmV0Y2hIZWFsdGhQaWxscygpfSxfZml0OmZ1bmN0aW9uKCl7dGhpcy4kJCgiI2dyYXBoYm9hcmQiKS5maXQoKX0sX3J1bk9ic2VydmVyOnBkLmdldFN0cmluZ09ic2VydmVyKCJydW4iLHtkZWZhdWx0VmFsdWU6IiIscG9seW1lclByb3BlcnR5OiJydW4iLHVzZUxvY2FsU3RvcmFnZTohMX0pLF9mZXRjaERhdGFzZXQoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2luZm8iKSl9LF9mZXRjaEhlYWx0aFBpbGxzKGIsCmQpe2I9e25vZGVfbmFtZXM6SlNPTi5zdHJpbmdpZnkoYikscnVuOiJfX2RlYnVnZ2VyX2RhdGFfXyJ9O3ZvaWQgMCE9PWQmJihiLnN0ZXA9ZCk7ZD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvaGVhbHRoX3BpbGxzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZCxiKX0sX2ZldGNoRGVidWdnZXJOdW1lcmljc0FsZXJ0cygpe3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9udW1lcmljc19hbGVydF9yZXBvcnQiKSl9LF9ncmFwaFVybChiLGQsZil7cmV0dXJuIHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvZ3JhcGgiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3J1bjpiLGxpbWl0X2F0dHJfc2l6ZTpkLGxhcmdlX2F0dHJzX2tleTpmfSkpfSxfc2hvdWxkUmVxdWVzdEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWQmJgp0aGlzLmhlYWx0aFBpbGxzVG9nZ2xlZE9uJiZ0aGlzLl9yZW5kZXJIaWVyYXJjaHkmJnRoaXMuX2RhdGFzZXRzU3RhdGUodGhpcy5fZGF0YXNldHNGZXRjaGVkLHRoaXMuX2RhdGFzZXRzLCJQUkVTRU5UIil9LF9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQ6ZnVuY3Rpb24oYil7IXRoaXMuX2luaXRpYWxpemVkJiZiJiYodGhpcy5zZXQoIl9jb21wYXRpYmlsaXR5UHJvdmlkZXIiLG5ldyB0Zi5ncmFwaC5vcC5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXIpLHRoaXMuX2luaXRpYWxpemVkPSEwLHRoaXMuX2ZldGNoRGF0YXNldCgpLnRoZW4oZD0+e3RoaXMuX2RhdGFzZXRzPU9iamVjdC5rZXlzKGQpLnNvcnQocmMuY29tcGFyZVRhZ05hbWVzKS5tYXAoZj0+e2NvbnN0IGg9ZFtmXTt2YXIgaz1PYmplY3Qua2V5cyhoLnRhZ3MpLnNvcnQocmMuY29tcGFyZVRhZ05hbWVzKS5tYXAodD0+aC50YWdzW3RdKS5tYXAoKHt0YWc6dCxjb25jZXB0dWFsX2dyYXBoOmwsb3BfZ3JhcGg6cCxwcm9maWxlOm19KT0+Cih7dGFnOnQsZGlzcGxheU5hbWU6dCxjb25jZXB0dWFsR3JhcGg6bCxvcEdyYXBoOnAscHJvZmlsZTptfSkpO2s9aC5ydW5fZ3JhcGg/W3t0YWc6bnVsbCxkaXNwbGF5TmFtZToiRGVmYXVsdCIsY29uY2VwdHVhbEdyYXBoOiExLG9wR3JhcGg6ITAscHJvZmlsZTohMX0sLi4ua106aztyZXR1cm57bmFtZTpmLHRhZ3M6a319KTt0aGlzLl9kYXRhc2V0c0ZldGNoZWQ9ITB9KSl9LF9kZXRlcm1pbmVTZWxlY3RlZERhdGFzZXQoYixkLGYpe2Y/KGQ9ZC5maW5kSW5kZXgoaD0+aC5uYW1lPT09ZiksLTE9PT1kP2ImJihiPXRoaXMuJCQoIiNlcnJvci1kaWFsb2ciKSxiLnRleHRDb250ZW50PWBObyBkYXRhc2V0IG5hbWVkICIke2Z9IiBjb3VsZCBiZSBmb3VuZC5gLGIub3BlbigpKTp0aGlzLnNldCgiX3NlbGVjdGVkRGF0YXNldCIsZCkpOnRoaXMuc2V0KCJfc2VsZWN0ZWREYXRhc2V0IiwwKX0sX3VwZGF0ZVNlbGVjdGVkRGF0YXNldE5hbWUoYixkLGYpe2ImJihkLmxlbmd0aDw9Znx8dGhpcy5zZXQoInJ1biIsCmRbZl0ubmFtZSkpfSxfcmVxdWVzdEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9hcmVIZWFsdGhQaWxsc0xvYWRpbmciLCEwKTt2YXIgYj0rK3RoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQ7bnVsbCE9PXRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQpLHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9bnVsbCk7dGhpcy5hbGxTdGVwc01vZGVFbmFibGVkP3RoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9bnVsbDt0aGlzLl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHMoYil9LmJpbmQodGhpcyksdGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJEZWxheSk6dGhpcy5faW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzKGIpfSwKX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxsczpmdW5jdGlvbihiKXtpZih0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkPT09Yil7dmFyIGQ9dGhpcy5fZmV0Y2hIZWFsdGhQaWxscyh0aGlzLl9yZW5kZXJIaWVyYXJjaHkuZ2V0TmFtZXNPZlJlbmRlcmVkT3BzKCksdGhpcy5hbGxTdGVwc01vZGVFbmFibGVkP3RoaXMuc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp2b2lkIDApLGY9dGhpcy5fZmV0Y2hEZWJ1Z2dlck51bWVyaWNzQWxlcnRzKCk7UHJvbWlzZS5hbGwoW2QsZl0pLnRoZW4oZnVuY3Rpb24oaCl7dmFyIGs9aFswXTtoPWhbMV07aWYodGhpcy5oZWFsdGhQaWxsc1RvZ2dsZWRPbiYmYj09PXRoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQpe2Zvcih2YXIgdCBpbiBrKXt0aGlzLnNldCgiX2hlYWx0aFBpbGxTdGVwSW5kZXgiLGtbdF0ubGVuZ3RoLTEpO2JyZWFrfXRoaXMuc2V0KCJfZGVidWdnZXJOdW1lcmljQWxlcnRzIixoKTt0aGlzLnNldCgiX25vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLAprKTt0aGlzLnNldCgiX2FyZUhlYWx0aFBpbGxzTG9hZGluZyIsITEpO3RoaXMuc2V0KCJfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCIsbnVsbCl9fS5iaW5kKHRoaXMpKX19LF9kYXRhc2V0c1N0YXRlOmZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4gYj9kJiZkLmxlbmd0aD8iUFJFU0VOVCI9PT1mOiJFTVBUWSI9PT1mOiJOT1RfTE9BREVEIj09PWZ9LF9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5yZWxvYWQoKX0sX2hhbmRsZU5vZGVUb2dnbGVFeHBhbmQ6ZnVuY3Rpb24oKXt0aGlzLl9tYXliZUZldGNoSGVhbHRoUGlsbHMoKX0sX2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZDpmdW5jdGlvbihiKXtiP3RoaXMucmVsb2FkKCk6dGhpcy5zZXQoIl9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix7fSl9LF9tYXliZUZldGNoSGVhbHRoUGlsbHM6ZnVuY3Rpb24oKXt0aGlzLl9zaG91bGRSZXF1ZXN0SGVhbHRoUGlsbHMoKSYmdGhpcy5fcmVxdWVzdEhlYWx0aFBpbGxzKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotZGlzdHJpYnV0aW9uLWNoYXJ0L3Z6LWRpc3RyaWJ1dGlvbi1jaGFydC5qcwp2YXIgSms7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGYsaCl7dGhpcy5ydW4yZGF0YXNldHM9e307dGhpcy5jb2xvclNjYWxlPWg7dGhpcy5idWlsZENoYXJ0KGYpfWdldERhdGFzZXQoZil7dm9pZCAwPT09dGhpcy5ydW4yZGF0YXNldHNbZl0mJih0aGlzLnJ1bjJkYXRhc2V0c1tmXT1uZXcgUGxvdHRhYmxlLkRhdGFzZXQoW10se3J1bjpmfSkpO3JldHVybiB0aGlzLnJ1bjJkYXRhc2V0c1tmXX1idWlsZENoYXJ0KGYpe3RoaXMub3V0ZXImJnRoaXMub3V0ZXIuZGVzdHJveSgpO2Y9cmcuZ2V0WENvbXBvbmVudHMoZik7dGhpcy54QWNjZXNzb3I9Zi5hY2Nlc3Nvcjt0aGlzLnhTY2FsZT1mLnNjYWxlO3RoaXMueEF4aXM9Zi5heGlzO3RoaXMueEF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoMyk7dGhpcy55U2NhbGU9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3RoaXMueUF4aXM9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModGhpcy55U2NhbGUsImxlZnQiKTtmPQpyZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OKTt0aGlzLnlBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDUpLmZvcm1hdHRlcihmKTt0aGlzLnlBeGlzLnVzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uKCk7Zj10aGlzLmJ1aWxkUGxvdCh0aGlzLnhBY2Nlc3Nvcix0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7dGhpcy5ncmlkbGluZXM9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyaWRsaW5lcyh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7dGhpcy5jZW50ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKFt0aGlzLmdyaWRsaW5lcyxmXSk7dGhpcy5vdXRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdChmLGgsayl7bGV0IHQ9WzAsMjI4LDE1ODcsMzA4NSw1RTMsNjkxNSw4NDEzLDk3NzIsMUU0XSxsPV8ucmFuZ2UodC5sZW5ndGgtCjEpLm1hcCh1PT4odFt1KzFdLXRbdV0pLzI1MDApLHA9dC5tYXAoKHUseCk9PkE9PkFbeF1bMV0pLG09cFs0XSxuPV8ucmFuZ2UocC5sZW5ndGgtMSkubWFwKHU9PntsZXQgeD1uZXcgUGxvdHRhYmxlLlBsb3RzLkFyZWE7eC54KGYsaCk7bGV0IEE9NDx1P3BbdV06cFt1KzFdO3gueSg0PHU/cFt1KzFdOnBbdV0sayk7eC55MChBKTt4LmF0dHIoImZpbGwiLCh5LHcsQyk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShDLm1ldGFkYXRhKCkucnVuKSk7eC5hdHRyKCJzdHJva2UiLCh5LHcsQyk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShDLm1ldGFkYXRhKCkucnVuKSk7eC5hdHRyKCJzdHJva2Utd2VpZ2h0IiwoKT0+IjAuNXB4Iik7eC5hdHRyKCJzdHJva2Utb3BhY2l0eSIsKCk9PmxbdV0pO3guYXR0cigiZmlsbC1vcGFjaXR5IiwoKT0+bFt1XSk7cmV0dXJuIHh9KSxxPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtxLngoZixoKTtxLnkobSxrKTtxLmF0dHIoInN0cm9rZSIsKHUseCxBKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKEEucnVuKSk7CnRoaXMucGxvdHM9bjtyZXR1cm4gbmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKG4pfXNldFZpc2libGVTZXJpZXMoZil7dGhpcy5ydW5zPWY7bGV0IGg9Zi5tYXAoaz0+dGhpcy5nZXREYXRhc2V0KGspKTt0aGlzLnBsb3RzLmZvckVhY2goaz0+ay5kYXRhc2V0cyhoKSl9c2V0U2VyaWVzRGF0YShmLGgpe3RoaXMuZ2V0RGF0YXNldChmKS5kYXRhKGgpfXJlbmRlclRvKGYpe3RoaXMudGFyZ2V0U1ZHPWY7dGhpcy5vdXRlci5yZW5kZXJUbyhmKX1yZWRyYXcoKXt0aGlzLm91dGVyLnJlZHJhdygpfWRlc3Ryb3koKXt0aGlzLm91dGVyLmRlc3Ryb3koKX19Yi5EaXN0cmlidXRpb25DaGFydD1kO1BvbHltZXIoe2lzOiJ2ei1kaXN0cmlidXRpb24tY2hhcnQiLHByb3BlcnRpZXM6e2NvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yKS5yYW5nZShkMy5zY2hlbWVDYXRlZ29yeTEwKX19LHhUeXBlOnt0eXBlOlN0cmluZywKdmFsdWU6InN0ZXAifSxfYXR0YWNoZWQ6Qm9vbGVhbixfY2hhcnQ6T2JqZWN0LF92aXNpYmxlU2VyaWVzQ2FjaGU6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9zZXJpZXNEYXRhQ2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fSxfbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX21ha2VDaGFydCh4VHlwZSwgY29sb3JTY2FsZSwgX2F0dGFjaGVkKSIsIl9yZWxvYWRGcm9tQ2FjaGUoX2NoYXJ0KSJdLHNldFZpc2libGVTZXJpZXM6ZnVuY3Rpb24oZil7dGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlPWY7dGhpcy5fY2hhcnQmJih0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKGYpLHRoaXMucmVkcmF3KCkpfSxzZXRTZXJpZXNEYXRhOmZ1bmN0aW9uKGYsaCl7dGhpcy5fc2VyaWVzRGF0YUNhY2hlW2ZdPWg7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoZiwKaCl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0LnJlZHJhdygpfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5jaGFydGRpdiwhMCl9LF9tYWtlQ2hhcnQ6ZnVuY3Rpb24oZixoLGspe251bGw9PT10aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQmJnRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKTt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsO2lmKGspe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5kZXN0cm95KCk7dmFyIHQ9bmV3IGQoZixoKSxsPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnRkaXYpO3QucmVuZGVyVG8obCk7dGhpcy5fY2hhcnQ9dH19LDM1MCl9LF9yZWxvYWRGcm9tQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlKSwKdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZvckVhY2goZnVuY3Rpb24oZil7dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShmLHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtmXXx8W10pfS5iaW5kKHRoaXMpKSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITB9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITF9fSl9KShKa3x8KEprPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC90Zi1kaXN0cmlidXRpb24tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyx0YWdNZXRhZGF0YTpPYmplY3QseFR5cGU6U3RyaW5nLGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGF0YVRvTG9hZChydW4sIHRhZykifSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7cnVuOmJ9KT0+Yn0sZ2V0RGF0YUxvYWRVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7dGFnOmIscnVuOmR9KT0+dmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkaXN0cmlidXRpb25zIiwiL2Rpc3RyaWJ1dGlvbnMiKSx7dGFnOmIscnVuOmR9KX0sbG9hZERhdGFDYWxsYmFjazp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihiLGQsZik9PntiPWYubWFwKGg9Pntjb25zdCBbayx0LGxdPWg7bC53YWxsX3RpbWU9bmV3IERhdGUoMUUzKmspO2wuc3RlcD10O3JldHVybiBsfSk7CmQ9dGhpcy5nZXREYXRhTG9hZE5hbWUoZCk7dGhpcy4kLmNoYXJ0LnNldFNlcmllc0RhdGEoZCxiKTt0aGlzLiQuY2hhcnQuc2V0VmlzaWJsZVNlcmllcyhbZF0pfX19LF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHtzY2FsZTpwZi5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZykiXSxiZWhhdmlvcnM6W3FkLkRhdGFMb2FkZXJCZWhhdmlvcl0sX2NvbXB1dGVEYXRhVG9Mb2FkKGIsZCl7cmV0dXJuW3tydW46Yix0YWc6ZH1dfSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnNjYWxlKGIpfSwKcmVkcmF3KCl7dGhpcy4kLmNoYXJ0LnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC90Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e194VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWREaXN0cmlidXRpb25zKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRpc3RyaWJ1dGlvbnMiLAoiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxrPT5PYmplY3Qua2V5cyhrKSksaD12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09aC5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWciLGYpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkRGlzdHJpYnV0aW9ucygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1kaXN0cmlidXRpb24tbG9hZGVyIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtyZXR1cm4gJGMuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhiLGQsZil9LF90YWdNZXRhZGF0YShiLApkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzL3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLmh0bWwuanMKUG9seW1lcih7aXM6InZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToib2Zmc2V0In0sdGltZVByb3BlcnR5Ont0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LGJpbnM6e3R5cGU6U3RyaW5nLHZhbHVlOiJiaW5zIn0seDp7dHlwZTpTdHJpbmcsdmFsdWU6IngifSxkeDp7dHlwZTpTdHJpbmcsdmFsdWU6ImR4In0seTp7dHlwZTpTdHJpbmcsdmFsdWU6InkifSxjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkMy5zY2FsZU9yZGluYWwoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSxtb2RlVHJhbnNpdGlvbkR1cmF0aW9uOnt0eXBlOk51bWJlcix2YWx1ZTo1MDB9LF9hdHRhY2hlZDpCb29sZWFuLF9uYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfZGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsicmVkcmF3KHRpbWVQcm9wZXJ0eSwgX2F0dGFjaGVkKSIsIl9tb2RlUmVkcmF3KG1vZGUpIl0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLnN2ZywhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITB9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITF9LHNldFNlcmllc0RhdGE6ZnVuY3Rpb24oYixkKXt0aGlzLl9uYW1lPWI7dGhpcy5fZGF0YT1kO3RoaXMucmVkcmF3KCl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2RyYXcoMCl9LF9tb2RlUmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fZHJhdyh0aGlzLm1vZGVUcmFuc2l0aW9uRHVyYXRpb24pfSxfZHJhdzpmdW5jdGlvbihiKXtpZih0aGlzLl9hdHRhY2hlZCYmdGhpcy5fZGF0YSl7aWYodm9pZCAwPT09Yil0aHJvdyBFcnJvcigidnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgX2RyYXcgbmVlZHMgZHVyYXRpb24iKTtpZigwPj10aGlzLl9kYXRhLmxlbmd0aCl0aHJvdyBFcnJvcigiTm90IGVub3VnaCBzdGVwcyBpbiB0aGUgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdLmhhc093blByb3BlcnR5KHRoaXMuYmlucykpdGhyb3cgRXJyb3IoIk5vIGJpbnMgcHJvcGVydHkgb2YgJyIrCnRoaXMuYmlucysiJyBpbiBkYXRhIik7aWYoMD49dGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdLmxlbmd0aCl0aHJvdyBFcnJvcigiTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBiaW4gaW4gYmlucyBpbiBkYXRhIik7aWYoIXRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLngpKXRocm93IEVycm9yKCJObyB4IHByb3BlcnR5ICciK3RoaXMueCsiJyBvbiBiaW5zIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMuZHgpKXRocm93IEVycm9yKCJObyBkeCBwcm9wZXJ0eSAnIit0aGlzLmR4KyInIG9uIGJpbnMgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy55KSl0aHJvdyBFcnJvcigiTm8geSBwcm9wZXJ0eSAnIit0aGlzLnkrIicgb24gYmlucyBkYXRhIik7dmFyIGQ9dGhpcy50aW1lUHJvcGVydHksZj10aGlzLngsaD10aGlzLmJpbnMsaz10aGlzLmR4LAp0PXRoaXMueSxsPXRoaXMuX2RhdGEscD10aGlzLm1vZGUsbT1kMy5oY2wodGhpcy5jb2xvclNjYWxlKHRoaXMuX25hbWUpKSxuPWQzLnNlbGVjdCh0aGlzLiQudG9vbHRpcCkscT1mdW5jdGlvbih5YSl7cmV0dXJuIHlhW2ZdfSx1PWZ1bmN0aW9uKHlhKXtyZXR1cm4geWFbdF19LHg9ZnVuY3Rpb24oeWEpe3JldHVybiB5YVtmXSt5YVtrXX0sQT1mdW5jdGlvbih5YSl7cmV0dXJuIHlhW2RdfTsicmVsYXRpdmUiPT09ZCYmKEE9ZnVuY3Rpb24oeWEpe3JldHVybiB5YS53YWxsX3RpbWUtbFswXS53YWxsX3RpbWV9KTt2YXIgeT10aGlzLiQuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHc9eS53aWR0aCxDPXkuaGVpZ2h0LEc9NTtpZigib2Zmc2V0Ij09PXApe3ZhciBEPUMvMi41O0c9RCs1fWVsc2UgRD1DLUctMjA7dmFyIEI9dy0yNC02MCxJPUMtRy0yMDtkMy5taW4obCxxKTtkMy5tYXgobCx4KTt2YXIgTj1kMy5mb3JtYXQoIi4zbiIpO3k9ZDMuZm9ybWF0KCIuMGYiKTsid2FsbF90aW1lIj09PQpkP3k9ZDMudGltZUZvcm1hdCgiJW0vJWQgJVgiKToicmVsYXRpdmUiPT09ZCYmKHk9ZnVuY3Rpb24oeWEpe3JldHVybiBkMy5mb3JtYXQoIi4xciIpKHlhLzM2RTUpKyJoIn0pO3ZhciBPPWwubWFwKGZ1bmN0aW9uKHlhKXtyZXR1cm5bZDMubWluKHlhW2hdLHEpLGQzLm1heCh5YVtoXSx4KV19KSxIPWwubWFwKGZ1bmN0aW9uKHlhKXtyZXR1cm4gZDMuZXh0ZW50KHlhW2hdLHUpfSksSz1kMy5leHRlbnQobCxBKSxNPSgid2FsbF90aW1lIj09PWQ/ZDMuc2NhbGVUaW1lKCk6ZDMuc2NhbGVMaW5lYXIoKSkuZG9tYWluKEspLnJhbmdlKFswLCJvZmZzZXQiPT09cD9JOjBdKSxMPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLGQzLm1heChsLGZ1bmN0aW9uKHlhLFNhKXtyZXR1cm4gSFtTYV1bMV19KV0pLnJhbmdlKFtELDBdKSxRPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKEwuZG9tYWluKCkpLnJhbmdlKFs1MDAsMF0pLFQ9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW2QzLm1pbihsLGZ1bmN0aW9uKHlhLApTYSl7cmV0dXJuIE9bU2FdWzBdfSksZDMubWF4KGwsZnVuY3Rpb24oeWEsU2Epe3JldHVybiBPW1NhXVsxXX0pXSkubmljZSgpLnJhbmdlKFswLEJdKSxYPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFQuZG9tYWluKCkpLnJhbmdlKFswLDUwMF0pLGFhPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGQzLmV4dGVudChsLEEpKS5yYW5nZShbbS5kYXJrZXIoKSxtLmJyaWdodGVyKCldKS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZUhjbCk7bT1kMy5heGlzQm90dG9tKFQpLnRpY2tzKCk7dmFyIGxhPWQzLmF4aXNSaWdodChNKS50aWNrcygpLnRpY2tGb3JtYXQoeSksWj1kMy5heGlzUmlnaHQoTCkudGlja3MoKS50aWNrU2l6ZShCKzUpLnRpY2tGb3JtYXQoTiksYmE9ZnVuY3Rpb24oeWEpe3JldHVybiB5YVtmXSt5YVtrXS8yfSxlYT1kMy5saW5lKCkueChmdW5jdGlvbih5YSl7cmV0dXJuIFgoYmEoeWEpKX0pLnkoZnVuY3Rpb24oeWEpe3JldHVybiBRKHlhW3RdKX0pLGNhPWZ1bmN0aW9uKHlhKXtyZXR1cm4iTSIrClgoYmEoeWFbMF0pKSsiLCIrUSgwKSsiTCIrZWEoeWEpLnNsaWNlKDEpKyJMIitYKGJhKHlhW3lhLmxlbmd0aC0xXSkpKyIsIitRKDApfSxrYT10aGlzLiQuc3ZnO3k9ZDMuc2VsZWN0KGthKTtiPXkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGIpO3k9eS5zZWxlY3QoImciKS5jbGFzc2VkKCJzbWFsbCIsZnVuY3Rpb24oKXtyZXR1cm4gMDxCJiYxNTA+PUJ9KS5jbGFzc2VkKCJtZWRpdW0iLGZ1bmN0aW9uKCl7cmV0dXJuIDE1MDxCJiYzMDA+PUJ9KS5jbGFzc2VkKCJsYXJnZSIsZnVuY3Rpb24oKXtyZXR1cm4gMzAwPEJ9KTtiPWIuc2VsZWN0KCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDI0LCIrRysiKSIpO3ZhciBZPWQzLmJpc2VjdG9yKHgpLmxlZnQ7Sz15LnNlbGVjdCgiLnN0YWdlIikub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YS5zdHlsZSgib3BhY2l0eSIsMSk7eGEuc3R5bGUoIm9wYWNpdHkiLDEpO0FhLnN0eWxlKCJvcGFjaXR5IiwxKTtGYS5zdHlsZSgib3BhY2l0eSIsCjEpO24uc3R5bGUoIm9wYWNpdHkiLDEpfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhLnN0eWxlKCJvcGFjaXR5IiwwKTt4YS5zdHlsZSgib3BhY2l0eSIsMCk7QWEuc3R5bGUoIm9wYWNpdHkiLDApO0ZhLnN0eWxlKCJvcGFjaXR5IiwwKTt2YS5jbGFzc2VkKCJob3Zlci1jbG9zZXN0IiwhMSk7RWEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsITEpO24uc3R5bGUoIm9wYWNpdHkiLDApfSkub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24oKXtmdW5jdGlvbiB5YShBYil7cmV0dXJuIE1hdGgubWluKEFiW2hdLmxlbmd0aC0xLFkoQWJbaF0sWGEpKX12YXIgU2E9ZDMubW91c2UodGhpcyksWGE9VC5pbnZlcnQoU2FbMF0pO00uaW52ZXJ0KFNhWzFdKTt2YXIgdWIsQmI9SW5maW5pdHkscWI7dmEuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihBYil7dmFyIEhiPXlhKEFiKTtxYj1BYjt2YXIgaWM9VChBYltoXVtIYl1bZl0rQWJbaF1bSGJdW2tdLzIpO0hiPUwoQWJbaF1bSGJdW3RdKTt2YXIgYmM9CiJvZmZzZXQiPT09cD9NKEEoQWIpKS0oRC1IYik6SGI7YmM9TWF0aC5hYnMoU2FbMV0tYmMpO2JjPEJiJiYoQmI9YmMsdWI9QWIpO3JldHVybiJ0cmFuc2xhdGUoIitpYysiLCIrSGIrIikifSk7dmEuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbihBYil7dmFyIEhiPXlhKEFiKTtyZXR1cm4gQWJbaF1bSGJdW3RdfSk7dmEuY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsZnVuY3Rpb24oQWIpe3JldHVybiBBYj09PXVifSk7RWEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsZnVuY3Rpb24oQWIpe3JldHVybiBBYj09PXVifSk7dmFyIHpiPXlhKHFiKTt4YS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK1QocWJbaF1bemJdW2ZdK3FiW2hdW3piXVtrXS8yKSsiLCAiK0krIikifSkuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBOKHFiW2hdW3piXVtmXStxYltoXVt6Yl1ba10vMil9KTt2YXIgdmI9bGEudGlja0Zvcm1hdCgpO0FhLmF0dHIoInRyYW5zZm9ybSIsCmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wP00oQSh1YikpOjApKyIpIn0pLnN0eWxlKCJkaXNwbGF5Iiwib2Zmc2V0Ij09PXA/IiI6Im5vbmUiKS5zZWxlY3QoInRleHQiKS50ZXh0KGZ1bmN0aW9uKCl7cmV0dXJuIHZiKEEodWIpKX0pO3ZhciBHYj1aLnRpY2tGb3JtYXQoKTtGYS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wPzA6TCh1YltoXVt6Yl1bdF0pKSsiKSJ9KS5zdHlsZSgiZGlzcGxheSIsIm9mZnNldCI9PT1wPyJub25lIjoiIikuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBHYih1YltoXVt6Yl1bdF0pfSk7dmFyIE5iPWQzLm1vdXNlKGthKTtuLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisoTmJbMF0rMTUpKyJweCwiKyhOYlsxXS0xNSkrInB4KSIpLnNlbGVjdCgic3BhbiIpLnRleHQoIm9mZnNldCI9PT1wP0diKHViW2hdW3piXVt0XSk6Cigic3RlcCI9PT1kPyJzdGVwICI6IiIpK3ZiKEEodWIpKSl9KTtLLnNlbGVjdCgiLmJhY2tncm91bmQiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoLTI0LCIrLUcrIikiKS5hdHRyKCJ3aWR0aCIsdykuYXR0cigiaGVpZ2h0IixDKTtDPUsuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuZGF0YShsKTtDLmV4aXQoKS5yZW1vdmUoKTt3PUMuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImhpc3RvZ3JhbSIpO0M9dy5tZXJnZShDKS5zb3J0KGZ1bmN0aW9uKHlhLFNhKXtyZXR1cm4gQSh5YSktQShTYSl9KTtHPWIuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih5YSl7cmV0dXJuInRyYW5zbGF0ZSgwLCAiKygib2Zmc2V0Ij09PXA/TShBKHlhKSktRDowKSsiKSJ9KTt3LmFwcGVuZCgibGluZSIpLmF0dHIoImNsYXNzIiwiYmFzZWxpbmUiKTtHLnNlbGVjdCgiLmJhc2VsaW5lIikuc3R5bGUoInN0cm9rZS1vcGFjaXR5IixmdW5jdGlvbigpe3JldHVybiJvZmZzZXQiPT09CnA/LjE6MH0pLmF0dHIoInkxIixEKS5hdHRyKCJ5MiIsRCkuYXR0cigieDIiLEIpO3cuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJvdXRsaW5lIik7dmFyIEVhPUMuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInZlY3Rvci1lZmZlY3QiLCJub24tc2NhbGluZy1zdHJva2UiKS5hdHRyKCJkIixmdW5jdGlvbih5YSl7cmV0dXJuIGNhKHlhW2hdKX0pLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpO0cuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInRyYW5zZm9ybSIsInNjYWxlKCIrQi81MDArIiwgIitELzUwMCsiKSIpLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKHlhKXtyZXR1cm4ib2Zmc2V0Ij09PXA/IndoaXRlIjphYShBKHlhKSl9KS5zdHlsZSgiZmlsbC1vcGFjaXR5IixmdW5jdGlvbigpe3JldHVybiJvZmZzZXQiPT09cD8xOjB9KS5zdHlsZSgiZmlsbCIsZnVuY3Rpb24oeWEpe3JldHVybiBhYShBKHlhKSl9KTt3PXcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJob3ZlciIpLnN0eWxlKCJmaWxsIiwKZnVuY3Rpb24oeWEpe3JldHVybiBhYShBKHlhKSl9KTt2YXIgdmE9Qy5zZWxlY3QoIi5ob3ZlciIpO3cuYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJyIiwyKTt3LmFwcGVuZCgidGV4dCIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoImR4Iiw0KTt3PXkuc2VsZWN0KCIueC1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieCJdKTtDPXcuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIHhhPXcubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtMjApLmF0dHIoInkiLDYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7Qy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDApLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsNik7Qy5hcHBlbmQoInRleHQiKS5hdHRyKCJkeSIsMTgpO3c9eS5zZWxlY3QoIi55LWF4aXMtaG92ZXIiKS5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEoWyJ5Il0pOwpDPXcuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIEFhPXcubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4Iiw4KS5hdHRyKCJ5IiwtNikuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLDE0KTtDLmFwcGVuZCgibGluZSIpLmF0dHIoIngxIiwwKS5hdHRyKCJ4MiIsNikuYXR0cigieTEiLDApLmF0dHIoInkyIiwwKTtDLmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCk7eT15LnNlbGVjdCgiLnktc2xpY2UtYXhpcy1ob3ZlciIpLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YShbInkiXSk7dz15LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciBGYT15Lm1lcmdlKHcpO3cuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7dy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDYpLmF0dHIoInkxIiwKMCkuYXR0cigieTIiLDApO3cuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHgiLDgpLmF0dHIoImR5Iiw0KTtiLnNlbGVjdCgiLnkuYXhpcy5zbGljZSIpLnN0eWxlKCJvcGFjaXR5Iiwib2Zmc2V0Ij09PXA/MDoxKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwgIisoIm9mZnNldCI9PT1wPy1EOjApKyIpIikuY2FsbChaKTtiLnNlbGVjdCgiLnguYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCAiK0krIikiKS5jYWxsKG0pO2Iuc2VsZWN0KCIueS5heGlzIikuc3R5bGUoIm9wYWNpdHkiLCJvZmZzZXQiPT09cD8xOjApLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wPzA6SSkrIikiKS5jYWxsKGxhKTtiLnNlbGVjdEFsbCgiLnRpY2sgdGV4dCIpLmF0dHIoImZpbGwiLCIjYWFhIik7Yi5zZWxlY3RBbGwoIi5heGlzIHBhdGguZG9tYWluIikuYXR0cigic3Ryb2tlIiwibm9uZSIpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL2hpc3RvZ3JhbUNvcmUuanMKdmFyIEtrOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChoKXtjb25zdCBbayx0LGxdPWg7cmV0dXJue3dhbGxfdGltZTprLHN0ZXA6dCxtaW46ZDMubWluKGwubWFwKChbcF0pPT5wKSksbWF4OmQzLm1heChsLm1hcCgoWyxwXSk9PnApKSxidWNrZXRzOmwubWFwKChbcCxtLG5dKT0+KHtsZWZ0OnAscmlnaHQ6bSxjb3VudDpufSkpfX1mdW5jdGlvbiBmKGgsayx0LGw9MzApe3Q9PT1rJiYodD0xLjEqaysxLGs9ay8xLjEtMSk7Y29uc3QgcD0odC1rKS9sO2xldCBtPTA7cmV0dXJuIGQzLnJhbmdlKGssdCxwKS5tYXAobj0+e2NvbnN0IHE9bitwO2xldCB1PTA7Zm9yKDttPGguYnVja2V0cy5sZW5ndGg7KXtjb25zdCBBPU1hdGgubWluKHQsaC5idWNrZXRzW21dLnJpZ2h0KTt2YXIgeD1NYXRoLm1heChrLGguYnVja2V0c1ttXS5sZWZ0KTtjb25zdCB5PU1hdGgubWluKEEscSktTWF0aC5tYXgoeCxuKTt4PXkvKEEteCkqaC5idWNrZXRzW21dLmNvdW50O3UrPTA8eT94OjA7aWYoQT5xKWJyZWFrO20rK31yZXR1cm57eDpuLApkeDpwLHk6dX19KX1iLmJhY2tlbmRUb0ludGVybWVkaWF0ZT1kO2IuaW50ZXJtZWRpYXRlVG9EMz1mO2IuYmFja2VuZFRvVno9ZnVuY3Rpb24oaCl7aD1oLm1hcChkKTtjb25zdCBrPWQzLm1pbihoLGw9PmwubWluKSx0PWQzLm1heChoLGw9PmwubWF4KTtyZXR1cm4gaC5tYXAobD0+KHt3YWxsX3RpbWU6bC53YWxsX3RpbWUsc3RlcDpsLnN0ZXAsYmluczpmKGwsayx0KX0pKX19KShLa3x8KEtrPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaGlzdG9ncmFtLWRhc2hib2FyZC90Zi1oaXN0b2dyYW0tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhpc3RvZ3JhbS1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyxkYXRhVG9Mb2FkOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZURhdGFUb0xvYWQocnVuLCB0YWcpIn0sZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3J1bjpifSk9PmJ9LGdldERhdGFMb2FkVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3RhZzpiLHJ1bjpkfSk9PnZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaGlzdG9ncmFtcyIsIi9oaXN0b2dyYW1zIikse3RhZzpiLHJ1bjpkfSl9LGxvYWREYXRhQ2FsbGJhY2s6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57Yj1Lay5iYWNrZW5kVG9WeihmKTtkPXRoaXMuZ2V0RGF0YUxvYWROYW1lKGQpO3RoaXMuJC5jaGFydC5zZXRTZXJpZXNEYXRhKGQsYil9fX0sdGFnTWV0YWRhdGE6T2JqZWN0LHRpbWVQcm9wZXJ0eTpTdHJpbmcsCmhpc3RvZ3JhbU1vZGU6U3RyaW5nLF9jb2xvclNjYWxlRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5wZi5ydW5zQ29sb3JTY2FsZX0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1biwgdGFnLCByZXF1ZXN0TWFuYWdlcikiXSxiZWhhdmlvcnM6W3FkLkRhdGFMb2FkZXJCZWhhdmlvcl0sX2NvbXB1dGVEYXRhVG9Mb2FkKGIsZCl7cmV0dXJuW3tydW46Yix0YWc6ZH1dfSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24oYil9LHJlZHJhdygpe3RoaXMuJC5jaGFydC5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhpc3RvZ3JhbS1kYXNoYm9hcmQvdGYtaGlzdG9ncmFtLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfaGlzdG9ncmFtTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZnNldCJ9LF90aW1lUHJvcGVydHk6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWc6T2JqZWN0LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOlN0cmluZyxfcmVzdGFtcDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWcsIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfX0sbGlzdGVuZXJzOnsiY29udGVudC12aXNpYmlsaXR5LWNoYW5nZWQiOiJfcmVkcmF3Q2F0ZWdvcnlQYW5lIn0sCl9yZWRyYXdDYXRlZ29yeVBhbmUoYixkKXtkJiZiLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1oaXN0b2dyYW0tbG9hZGVyIikuZm9yRWFjaChmPT5mLnJlZHJhdygpKX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkSGlzdG9ncmFtcygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJoaXN0b2dyYW1zIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxrPT5PYmplY3Qua2V5cyhrKSksaD12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09aC5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWciLGYpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT4Ke3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZEhpc3RvZ3JhbXMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9tYWtlQ2F0ZWdvcmllcyhiLGQsZil7cmV0dXJuICRjLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnMoYixkLGYpfSxfdGFnTWV0YWRhdGEoYixkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX3RleHRzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9fSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9hdHRhY2hlZCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBiPXZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsIi90ZXh0Iikse3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW59KSxkPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT57Zi5jYW5jZWxsZWR8fAooZj1mLnZhbHVlLm1hcChoPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqaC53YWxsX3RpbWUpLHN0ZXA6aC5zdGVwLHRleHQ6aC50ZXh0fSkpLHRoaXMuc2V0KCJfdGV4dHMiLGYuc2xpY2UoKS5yZXZlcnNlKCkpKX0pO3RoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfX0sX2Zvcm1hdFN0ZXAoYil7cmV0dXJuIGQzLmZvcm1hdCgiLCIpKGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRUZXh0cygpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT4Ke2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZykpe3ZhciBmPXZjLmdldFRhZ3MoZCk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZFRleHRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXRleHQtbG9hZGVyIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGIsZCxmKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQvdGYtcHItY3VydmUtY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wci1jdXJ2ZS1jYXJkIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHRhZzpTdHJpbmcsdGFnTWV0YWRhdGE6T2JqZWN0LHJ1blRvU3RlcENhcDpPYmplY3QscmVxdWVzdE1hbmFnZXI6T2JqZWN0LGFjdGl2ZTpCb29sZWFuLF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3J1blRvUHJDdXJ2ZUVudHJ5Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnk6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuc1dpdGhTdGVwQXZhaWxhYmxlOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJ1bnNXaXRoU3RlcEF2YWlsYWJsZShydW5zLCBfcnVuVG9QckN1cnZlRW50cnkpIn0sX3NldE9mUmVsZXZhbnRSdW5zOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVTZXRPZlJlbGV2YW50UnVucyhfcnVuc1dpdGhTdGVwQXZhaWxhYmxlKSJ9LF9ydW5Ub0RhdGFPdmVyVGltZTpPYmplY3QsCl9jb2xvclNjYWxlRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSl9LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuQ2FuY2VsbGVyfSxfYXR0YWNoZWQ6Qm9vbGVhbixfeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PigpPT57Y29uc3QgYj1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7cmV0dXJue3NjYWxlOmIsYXhpczpuZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhiLCJib3R0b20iKSxhY2Nlc3NvcjpkPT5kLnJlY2FsbH19fSxfeVZhbHVlQWNjZXNzb3I6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOigpPT5iPT5iLnByZWNpc2lvbn0sX3Rvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLHZhbHVlOigpPT57Y29uc3QgYj1yZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKSwKZD1mPT5pc05hTihmKT8iTmFOIjpiKGYpO3JldHVyblt7dGl0bGU6IlJ1biIsZXZhbHVhdGU6Zj0+Zi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJUaHJlc2hvbGQiLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS50aHJlc2hvbGRzKX0se3RpdGxlOiJQcmVjaXNpb24iLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS5wcmVjaXNpb24pfSx7dGl0bGU6IlJlY2FsbCIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnJlY2FsbCl9LHt0aXRsZToiVFAiLGV2YWx1YXRlOmY9PmYuZGF0dW0udHJ1ZV9wb3NpdGl2ZXN9LHt0aXRsZToiRlAiLGV2YWx1YXRlOmY9PmYuZGF0dW0uZmFsc2VfcG9zaXRpdmVzfSx7dGl0bGU6IlROIixldmFsdWF0ZTpmPT5mLmRhdHVtLnRydWVfbmVnYXRpdmVzfSx7dGl0bGU6IkZOIixldmFsdWF0ZTpmPT5mLmRhdHVtLmZhbHNlX25lZ2F0aXZlc31dfX0sX3Nlcmllc0RhdGFGaWVsZHM6e3R5cGU6QXJyYXksdmFsdWU6InRocmVzaG9sZHMgcHJlY2lzaW9uIHJlY2FsbCB0cnVlX3Bvc2l0aXZlcyBmYWxzZV9wb3NpdGl2ZXMgdHJ1ZV9uZWdhdGl2ZXMgZmFsc2VfbmVnYXRpdmVzIi5zcGxpdCgiICIpLApyZWFkT25seTohMH0sX2RlZmF1bHRYUmFuZ2U6e3R5cGU6QXJyYXksdmFsdWU6Wy0uMDUsMS4wNV0scmVhZE9ubHk6ITB9LF9kZWZhdWx0WVJhbmdlOnt0eXBlOkFycmF5LHZhbHVlOlstLjA1LDEuMDVdLHJlYWRPbmx5OiEwfSxfZGF0YVVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT57Y29uc3QgZD10aGlzLnRhZztyZXR1cm4gdmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJwcl9jdXJ2ZXMiLCIvcHJfY3VydmVzIikse3RhZzpkLHJ1bjpifSl9fX0sX3Ntb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9ic2VydmVyczpbInJlbG9hZChydW5zLCB0YWcpIiwiX3NldENoYXJ0RGF0YShfcnVuVG9QckN1cnZlRW50cnksIF9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5LCBfc2V0T2ZSZWxldmFudFJ1bnMpIiwiX3VwZGF0ZVJ1blRvUHJDdXJ2ZUVudHJ5KF9ydW5Ub0RhdGFPdmVyVGltZSwgcnVuVG9TdGVwQ2FwKSJdLApfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpe3JldHVybihiLGQsZik9Pnt0aGlzLnNldCgiX3J1blRvRGF0YU92ZXJUaW1lIixPYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvRGF0YU92ZXJUaW1lLGYpKX19LF9jb21wdXRlUnVuQ29sb3IoYil7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbi5zY2FsZShiKX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9hdHRhY2hlZCYmKDA9PT10aGlzLnJ1bnMubGVuZ3RoP3RoaXMuc2V0KCJfcnVuVG9EYXRhT3ZlclRpbWUiLHt9KTp0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVsb2FkKCkpfSxfc2V0Q2hhcnREYXRhKGIsZCxmKXtfLmZvck93bihiLChoLGspPT57Y29uc3QgdD1kW2tdO3QmJmJba10uc3RlcD09PXQuc3RlcHx8KGZba10/dGhpcy5fdXBkYXRlU2VyaWVzRGF0YUZvclJ1bihrLGgpOnRoaXMuX2NsZWFyU2VyaWVzRGF0YShrKSl9KX0sCl91cGRhdGVTZXJpZXNEYXRhRm9yUnVuKGIsZCl7Y29uc3QgZj1fLnJlZHVjZSh0aGlzLl9zZXJpZXNEYXRhRmllbGRzLChrLHQpPT57a1t0XT1kW3RdLnNsaWNlKCkucmV2ZXJzZSgpO3JldHVybiBrfSx7fSksaD1BcnJheShmW3RoaXMuX3Nlcmllc0RhdGFGaWVsZHNbMF1dLmxlbmd0aCk7Zm9yKGxldCBrPTA7azxoLmxlbmd0aDtrKyspaFtrXT1fLm1hcFZhbHVlcyhmLHQ9PnRba10pO3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5zZXRTZXJpZXNEYXRhKGIsaCl9LF9jbGVhclNlcmllc0RhdGEoYil7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnNldFNlcmllc0RhdGEoYixbXSl9LF91cGRhdGVSdW5Ub1ByQ3VydmVFbnRyeShiLGQpe2NvbnN0IGY9e307Xy5mb3JPd24oYiwoaCxrKT0+e2gmJmgubGVuZ3RoJiYoZltrXT10aGlzLl9jb21wdXRlRW50cnlDbG9zZXN0T3JFcXVhbFRvU3RlcENhcChkW2tdLGgpKX0pO3RoaXMuc2V0KCJfcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeSIsCnRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5KTt0aGlzLnNldCgiX3J1blRvUHJDdXJ2ZUVudHJ5IixmKX0sX2NvbXB1dGVFbnRyeUNsb3Nlc3RPckVxdWFsVG9TdGVwQ2FwKGIsZCl7Yj1NYXRoLm1pbihfLnNvcnRlZEluZGV4KGQubWFwKGY9PmYuc3RlcCksYiksZC5sZW5ndGgtMSk7cmV0dXJuIGRbYl19LF9jb21wdXRlUnVuc1dpdGhTdGVwQXZhaWxhYmxlKGIsZCl7cmV0dXJuIF8uZmlsdGVyKGIsZj0+ZFtmXSkuc29ydCgpfSxfY29tcHV0ZVNldE9mUmVsZXZhbnRSdW5zKGIpe2NvbnN0IGQ9e307Xy5mb3JFYWNoKGIsZj0+e2RbZl09ITB9KTtyZXR1cm4gZH0sX2NvbXB1dGVDdXJyZW50U3RlcEZvclJ1bihiLGQpe3JldHVybihiPWJbZF0pP2Iuc3RlcDpudWxsfSxfY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bihiLGQpe3JldHVybihiPWJbZF0pPyhuZXcgRGF0ZSgxRTMqYi53YWxsX3RpbWUpKS50b1N0cmluZygpOm51bGx9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLAohdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF9yZXNldERvbWFpbigpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZXNldERvbWFpbigpfSxyZWRyYXcoKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVkcmF3KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHItY3VydmUtZGFzaGJvYXJkL3RmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXM6T2JqZWN0LHJ1blRvU3RlcDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLGNvbXB1dGVkOiJfY29tcHV0ZVJ1blRvU3RlcChydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBfcnVuVG9TdGVwSW5kZXgpIn0sdGltZURpc3BsYXlUeXBlOlN0cmluZyxfcnVuVG9TdGVwSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuc1dpdGhTbGlkZXJzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJ1bnNXaXRoU2xpZGVycyhydW5zLCBydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzKSJ9fSxvYnNlcnZlcnM6WyJfdXBkYXRlU3RlcHNGb3JOZXdSdW5zKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMpIl0sX2NvbXB1dGVDb2xvckZvclJ1bihiKXtyZXR1cm4gcGYucnVuc0NvbG9yU2NhbGUoYil9LF9jb21wdXRlVGltZVRleHRGb3JSdW4oYiwKZCxmLGgpe2Q9ZFtmXTtpZighXy5pc051bWJlcihkKSlyZXR1cm4iIjtiPWJbZl07aWYoIWIpcmV0dXJuIiI7Yj1iW2RdW2hdO2lmKCJzdGVwIj09PWgpcmV0dXJuYHN0ZXAgJHtifWA7aWYoInJlbGF0aXZlIj09PWgpcmV0dXJuIDE+Yj9gJHsoMUUzKmIpLnRvRml4ZWQoMil9IG1zYDpgJHtiLnRvRml4ZWQoMil9IHNgO2lmKCJ3YWxsX3RpbWUiPT09aClyZXR1cm4obmV3IERhdGUoMUUzKmIpKS50b1N0cmluZygpO3Rocm93IEVycm9yKGBUaGUgZGlzcGxheSB0eXBlIG9mICR7aH0gaXMgbm90IHJlY29nbml6ZWQuYCk7fSxfc2xpZGVyVmFsdWVDaGFuZ2VkKGIpe2NvbnN0IGQ9Yi50YXJnZXQuZGF0YXNldC5ydW4sZj1iLnRhcmdldC5pbW1lZGlhdGVWYWx1ZSxoPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9TdGVwSW5kZXgpO2lzTmFOKGYpP2RlbGV0ZSBoW2RdOmhbZF09Yi50YXJnZXQuaW1tZWRpYXRlVmFsdWU7dGhpcy5fcnVuVG9TdGVwSW5kZXg9aH0sX2NvbXB1dGVNYXhTdGVwSW5kZXhGb3JSdW4oYiwKZCl7cmV0dXJuKGI9YltkXSkmJmIubGVuZ3RoP2IubGVuZ3RoLTE6MH0sX3VwZGF0ZVN0ZXBzRm9yTmV3UnVucyhiKXtjb25zdCBkPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9TdGVwSW5kZXgpO18uZm9yT3duKGIsKGYsaCk9PntfLmlzTnVtYmVyKGRbaF0pfHwoZFtoXT1mLmxlbmd0aC0xKX0pO3RoaXMuX3J1blRvU3RlcEluZGV4PWR9LF9nZXRTdGVwKGIsZCl7cmV0dXJuIHRoaXMuX3J1blRvU3RlcEluZGV4P3RoaXMuX3J1blRvU3RlcEluZGV4W2RdOjB9LF9jb21wdXRlUnVuVG9TdGVwKGIsZCl7Y29uc3QgZj17fTtfLmZvck93bihkLChoLGspPT57Y29uc3QgdD1iW2tdO3QmJihmW2tdPXRbaF0uc3RlcCl9KTtyZXR1cm4gZn0sX2NvbXB1dGVSdW5zV2l0aFNsaWRlcnMoYixkKXtyZXR1cm4gYi5maWx0ZXIoZj0+ZFtmXSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHItY3VydmUtZGFzaGJvYXJkL3RmLXByLWN1cnZlLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e190aW1lRGlzcGxheVR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX3NlbGVjdGVkUnVuczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9ydW5Ub1RhZ0luZm86e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9yZWxldmFudFNlbGVjdGVkUnVuczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVSZWxldmFudFNlbGVjdGVkUnVucyhfc2VsZWN0ZWRSdW5zLCBfcnVuVG9UYWdJbmZvKSJ9LF9ydW5zV2l0aFByQ3VydmVEYXRhOkFycmF5LF9ydW5Ub1N0ZXA6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sCl9nZXRDYXRlZ29yeUl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmI9PmIudGFnfSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7UHJvbWlzZS5hbGwoW3RoaXMuX2ZldGNoVGFncygpLHRoaXMuX2ZldGNoVGltZUVudHJpZXNQZXJSdW4oKV0pLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRDYXJkcygpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJfY3VydmVzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5fLmtleXMoaCkpOwpmPXZjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGQpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9mZXRjaFRpbWVFbnRyaWVzUGVyUnVuKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJfY3VydmVzIiwiL2F2YWlsYWJsZV90aW1lX2VudHJpZXMiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntfLmZvck93bihkLGY9PntfLmZvckVhY2goZixoPT57aC5yZWxhdGl2ZT1oLndhbGxfdGltZS1mWzBdLndhbGxfdGltZX0pfSk7dGhpcy5zZXQoIl9ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzIixkKTtkPV8ua2V5cyhkKS5zbGljZSgpLnNvcnQoKTtfLmlzRXF1YWwoZCx0aGlzLl9ydW5zV2l0aFByQ3VydmVEYXRhKXx8dGhpcy5zZXQoIl9ydW5zV2l0aFByQ3VydmVEYXRhIiwKZCl9KX0sX3JlbG9hZENhcmRzKCl7Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1wci1jdXJ2ZS1jYXJkIiksYj0+e2IucmVsb2FkKCl9KX0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtiPV8ubWFwVmFsdWVzKGIsaD0+T2JqZWN0LmtleXMoaCkpO3JldHVybiAkYy5jYXRlZ29yaXplVGFncyhiLGQsZil9LF9jb21wdXRlQ29sb3JGb3JSdW4oYil7cmV0dXJuIHBmLnJ1bnNDb2xvclNjYWxlKGIpfSxfY29tcHV0ZVJlbGV2YW50U2VsZWN0ZWRSdW5zKGIsZCl7cmV0dXJuIGIuZmlsdGVyKGY9PmRbZl0pfSxfdGFnTWV0YWRhdGEoYixkLGYpe2NvbnN0IGg9e307ZC5mb3JFYWNoKGs9PntoW2tdPWJba11bZl19KTtkPWYucmVwbGFjZSgvXC9wcl9jdXJ2ZXMkLywiIik7cmV0dXJuIHJmLmFnZ3JlZ2F0ZVRhZ0luZm8oaCxkKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZC90Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZCIscHJvcGVydGllczp7X2luc3RhbGxDb21tYW5kOnt0eXBlOlN0cmluZyxyZWFkT25seTohMCx2YWx1ZToicGlwIGluc3RhbGwgLVUgdGVuc29yYm9hcmRfcGx1Z2luX3Byb2ZpbGUifX0sX2NvcHlJbnN0YWxsQ29tbWFuZCgpe2NvbnN0IGI9dGhpcztyZXR1cm4gaGMoZnVuY3Rpb24qKCl7Y29uc3QgZD0oKT0+aGMoZnVuY3Rpb24qKCl7Yi4kLmNvbW1hbmRUZXh0YXJlYS5zZWxlY3QoKTt0cnl7eWllbGQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoYi5faW5zdGFsbENvbW1hbmQpfWNhdGNoKGYpe2lmKCFkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpKXJldHVybiBQcm9taXNlLnJlamVjdCgpfX0pO3RyeXt5aWVsZCBkKCksYi4kLmNvcGllZE1lc3NhZ2UuaW5uZXJUZXh0PSJDb3BpZWQuIn1jYXRjaChmKXtiLiQuY29waWVkTWVzc2FnZS5pbm5lclRleHQ9IkZhaWxlZCB0byBjb3B5IHRvIGNsaXBib2FyZC4ifX0pfSwKX3JlbW92ZUNvcGllZE1lc3NhZ2UoKXt0aGlzLiQuY29waWVkTWVzc2FnZS5pbm5lclRleHQ9IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3BsdWdpbi1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcGx1Z2luLWRpYWxvZyIscHJvcGVydGllczp7X3RpdGxlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY3VzdG9tTWVzc2FnZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX29wZW46e3R5cGU6Qm9vbGVhbn0sX2hpZGRlbjp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhpZGRlbihfb3BlbikiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3VzZU5hdGl2ZUJhY2tkcm9wOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9fSxvcGVuTm9UZW5zb3JGbG93RGlhbG9nKCl7dGhpcy5vcGVuRGlhbG9nKCJUaGlzIHBsdWdpbiBpcyBkaXNhYmxlZCB3aXRob3V0IFRlbnNvckZsb3ciLCdUbyBlbmFibGUgdGhpcyBwbHVnaW4gaW4gVGVuc29yQm9hcmQsIGluc3RhbGwgVGVuc29yRmxvdyB3aXRoICJwaXAgaW5zdGFsbCB0ZW5zb3JmbG93IiBvciBlcXVpdmFsZW50LicpfSxvcGVuT2xkVGVuc29yRmxvd0RpYWxvZyhiKXt0aGlzLm9wZW5EaWFsb2coIlRoaXMgcGx1Z2luIGlzIGRpc2FibGVkIHdpdGhvdXQgVGVuc29yRmxvdyAiKwpiLCJUbyBlbmFibGUgdGhpcyBwbHVnaW4gaW4gVGVuc29yQm9hcmQsIGluc3RhbGwgVGVuc29yRmxvdyAiK2IrJyBvciBncmVhdGVyIHdpdGggInBpcCBpbnN0YWxsIHRlbnNvcmZsb3ciIG9yIGVxdWl2YWxlbnQuJyl9LG9wZW5EaWFsb2coYixkKXt0aGlzLnNldCgiX3RpdGxlIixiKTt0aGlzLnNldCgiX2N1c3RvbU1lc3NhZ2UiLGQpO3RoaXMuJC5kaWFsb2cub3BlbigpfSxjbG9zZURpYWxvZygpe3RoaXMuJC5kaWFsb2cuY2xvc2UoKX0sX2NvbXB1dGVIaWRkZW4oYil7cmV0dXJuIWJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLXZpZGVvLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvYmVob2xkZXItZnJhbWUiKSxkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9waW5nIik7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLXZpZGVvIixwcm9wZXJ0aWVzOntmcHM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfZnBzQ2hhbmdlZCJ9LHBpbmdTbGVlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MUUzfSx4aHJUaW1lb3V0Ont0eXBlOk51bWJlcix2YWx1ZToyNTAwfSxfaW1hZ2VVUkw6e3R5cGU6U3RyaW5nLHZhbHVlOiJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHNceDNkIn0sX3hocjpPYmplY3QsX3RpbWVyOk51bWJlcixfaXNEZWFkOkJvb2xlYW59LGF0dGFjaGVkKCl7dGhpcy5zZXQoIl9pbWFnZVVSTCIsYik7dGhpcy5fcGluZygpfSxkZXRhY2hlZCgpe3RoaXMuX2NsZWFyKCk7CnRoaXMuc2V0KCJfaW1hZ2VVUkwiLCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHNceDNkIil9LF9waW5nKCl7dGhpcy5fY2xlYXIoKTt0aGlzLl94aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3RoaXMuX3hoci5vcGVuKCJHRVQiLGQsITApO3RoaXMuX3hoci50aW1lb3V0PXRoaXMueGhyVGltZW91dDt0aGlzLl94aHIub25sb2FkPXRoaXMuX29uUGluZ0xvYWQuYmluZCh0aGlzKTt0aGlzLl94aHIub25lcnJvcj10aGlzLl9vblBpbmcuYmluZCh0aGlzLCExLHRoaXMucGluZ1NsZWVwKTt0aGlzLl94aHIub250aW1lb3V0PXRoaXMuX29uUGluZy5iaW5kKHRoaXMsITEsMSk7dGhpcy5feGhyLnNlbmQobnVsbCl9LF9vblBpbmdMb2FkKCl7aWYoMjAwPT10aGlzLl94aHIuc3RhdHVzKXtjb25zdCBmPUpTT04ucGFyc2UodGhpcy5feGhyLnJlc3BvbnNlVGV4dCk7dGhpcy5fb25QaW5nKCJhbGl2ZSI9PWYuc3RhdHVzLHRoaXMucGluZ1NsZWVwKX1lbHNlIHRoaXMuX29uUGluZyghMSwKdGhpcy5waW5nU2xlZXApfSxfb25QaW5nKGYsaCl7ZiYmdGhpcy5faXNEZWFkJiZ0aGlzLnNldCgiX2ltYWdlVVJMIixiKyI/dFx4M2QiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpKTt0aGlzLl9pc0RlYWQ9IWY7dGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQoKCk9PnRoaXMuX3BpbmcoKSxoKX0sX2NsZWFyKCl7dGhpcy5fdGltZXImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj1udWxsKTt0aGlzLl94aHImJih0aGlzLl94aHIucmVhZHlTdGF0ZTxYTUxIdHRwUmVxdWVzdC5ET05FJiZ0aGlzLl94aHIuYWJvcnQoKSx0aGlzLl94aHI9bnVsbCl9LF9mcHNDaGFuZ2VkKGYsaCl7MD09Zj90aGlzLl9jbGVhcigpOjA9PWgmJnRoaXMuX3BpbmcoKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9zZWN0aW9uLWluZm8iKTtQb2x5bWVyKHtpczoidGYtYmVob2xkZXItaW5mbyIscHJvcGVydGllczp7ZnBzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2Zwc0NoYW5nZWQifSx4aHJUaW1lb3V0Ont0eXBlOk51bWJlcix2YWx1ZToxRTR9LF9pdGVtczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W3tuYW1lOiJMb2FkaW5nLi4uIn1dfSxfeGhyOk9iamVjdCxfdGltZXI6TnVtYmVyfSxhdHRhY2hlZCgpe3RoaXMuX2xvYWQoKX0sZGV0YWNoZWQoKXt0aGlzLl9jbGVhcigpfSxfbG9hZCgpe3RoaXMuX2NsZWFyKCk7dGhpcy5feGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt0aGlzLl94aHIub3BlbigiR0VUIixiLCEwKTt0aGlzLl94aHIudGltZW91dD10aGlzLnhoclRpbWVvdXQ7dGhpcy5feGhyLm9ubG9hZD10aGlzLl9vbkxvYWQuYmluZCh0aGlzKTt0aGlzLl94aHIub25lcnJvcj0KdGhpcy5fcmV0cnkuYmluZCh0aGlzLHRoaXMuX2dldFNsZWVwKCkpO3RoaXMuX3hoci5vbnRpbWVvdXQ9dGhpcy5fcmV0cnkuYmluZCh0aGlzLDEpO3RoaXMuX3hoci5zZW5kKG51bGwpfSxfb25Mb2FkKCl7aWYoMjAwPT10aGlzLl94aHIuc3RhdHVzKXtjb25zdCBkPUpTT04ucGFyc2UodGhpcy5feGhyLnJlc3BvbnNlVGV4dCk7Y29uc29sZS5hc3NlcnQoQXJyYXkuaXNBcnJheShkKSwiRXhwZWN0ZWQgcmVzcG9uc2UgdG8gYmUgaW4gYW4gYXJyYXkiKTt0aGlzLl9pdGVtcz1kfXRoaXMuX3JldHJ5KHRoaXMuX2dldFNsZWVwKCkpfSxfcmV0cnkoZCl7dGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQodGhpcy5fbG9hZC5iaW5kKHRoaXMpLGQpfSxfZ2V0U2xlZXAoKXtyZXR1cm4gMUUzLygwPT09dGhpcy5mcHM/MTp0aGlzLmZwcyl9LF9jbGVhcigpe3RoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9bnVsbCk7dGhpcy5feGhyJiYKKHRoaXMuX3hoci5yZWFkeVN0YXRlPFhNTEh0dHBSZXF1ZXN0LkRPTkUmJnRoaXMuX3hoci5hYm9ydCgpLHRoaXMuX3hocj1udWxsKX0sX2Zwc0NoYW5nZWQoZCxmKXswPT1kP3RoaXMuX2NsZWFyKCk6MD09ZiYmdGhpcy5fbG9hZCgpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iZWhvbGRlci1kYXNoYm9hcmQvdGYtYmVob2xkZXItZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyKDEwLDApfSxfaXNBdmFpbGFibGU6Qm9vbGVhbixfdmFsdWVzOnt0eXBlOlN0cmluZyx2YWx1ZToidHJhaW5hYmxlX3ZhcmlhYmxlcyIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJ2YXJpYW5jZSIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3NjYWxpbmc6e3R5cGU6U3RyaW5nLHZhbHVlOiJsYXllciIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3dpbmRvd1NpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjE1LG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9wcmV2aW91c0ZQUzp7dHlwZTpOdW1iZXIsdmFsdWU6MzB9LF9GUFM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LApfcmVjb3JkVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YXJ0IHJlY29yZGluZyJ9LF9pc1JlY29yZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9zaG93QWxsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX2NvbG9ybWFwOnt0eXBlOlN0cmluZyx2YWx1ZToibWFnbWEiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9pc19hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfY29udHJvbHNfZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifX0sX3ZhbHVlc05vdEZyYW1lKGIpe3JldHVybiJmcmFtZXMiIT09Yn0sX3ZhcmlhbmNlU2VsZWN0ZWQoYil7cmV0dXJuInZhcmlhbmNlIj09PWJ9LF9jb25maWdDaGFuZ2VkKCl7aWYodGhpcy5faXNfYWN0aXZlJiYhdGhpcy5fY29udHJvbHNfZGlzYWJsZWQpe3ZhciBiPQpbdGhpcy5fdmFsdWVzLHRoaXMuX21vZGUsdGhpcy5fc2NhbGluZyx0aGlzLl93aW5kb3dTaXplLHRoaXMuX0ZQUyx0aGlzLl9pc1JlY29yZGluZyx0aGlzLl9zaG93QWxsLHRoaXMuX2NvbG9ybWFwXSxkO2ZvcihkIG9mIGIpaWYoInVuZGVmaW5lZCI9PT10eXBlb2YgZHx8IiI9PT1kKXJldHVybjtiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9jaGFuZ2UtY29uZmlnIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiLHt2YWx1ZXM6dGhpcy5fdmFsdWVzLG1vZGU6dGhpcy5fbW9kZSxzY2FsaW5nOnRoaXMuX3NjYWxpbmcsd2luZG93X3NpemU6dGhpcy5fd2luZG93U2l6ZSxGUFM6dGhpcy5fRlBTLGlzX3JlY29yZGluZzp0aGlzLl9pc1JlY29yZGluZyxzaG93X2FsbDp0aGlzLl9zaG93QWxsLGNvbG9ybWFwOnRoaXMuX2NvbG9ybWFwfSl9fSxfdG9nZ2xlUmVjb3JkKCl7InN0YXJ0IHJlY29yZGluZyI9PXRoaXMuX3JlY29yZFRleHQ/KHRoaXMuc2V0KCJfcmVjb3JkVGV4dCIsCiJzdG9wIHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCEwKSk6KHRoaXMuc2V0KCJfcmVjb3JkVGV4dCIsInN0YXJ0IHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCExKSk7dGhpcy4kLnJlY29yZF9idXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgiaXMtcmVjb3JkaW5nIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKGI9PnsiYmVob2xkZXIiaW4gYj8odGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKSx0aGlzLnNldCgiX2lzQXZhaWxhYmxlIiwhMCkpOih0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuTm9UZW5zb3JGbG93RGlhbG9nKCksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITEpKX0pfSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2lzQXZhaWxhYmxlKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsCiIvaXMtYWN0aXZlIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9Pnt0aGlzLnNldCgiX2lzX2FjdGl2ZSIsZC5pc19hY3RpdmUpO3RoaXMuc2V0KCJfY29udHJvbHNfZGlzYWJsZWQiLCFkLmlzX2NvbmZpZ193cml0YWJsZSl9KX19fSk7cWYucmVnaXN0ZXJEYXNoYm9hcmQoKX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy11dGlscy90Zi1ocGFyYW1zLXV0aWxzLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChCKXtyZXR1cm4iIiE9PUIuZGlzcGxheU5hbWUmJnZvaWQgMCE9PUIuZGlzcGxheU5hbWU/Qi5kaXNwbGF5TmFtZTpCLm5hbWV9ZnVuY3Rpb24gayhCKXtpZigiIiE9PUIuZGlzcGxheU5hbWUmJnZvaWQgMCE9PUIuZGlzcGxheU5hbWUpcmV0dXJuIEIuZGlzcGxheU5hbWU7bGV0IEk9Qi5uYW1lLmdyb3VwO0I9Qi5uYW1lLnRhZzt2b2lkIDA9PT1JJiYoST0iIik7dm9pZCAwPT09QiYmKEI9IiIpO3JldHVybiIiPT09ST9COkkrIi4iK0J9ZnVuY3Rpb24gdChCKXtyZXR1cm4gQi5ocGFyYW1Db2x1bW5zLmxlbmd0aH1mdW5jdGlvbiBsKEIpe3JldHVybiBCLm1ldHJpY0NvbHVtbnMubGVuZ3RofWZ1bmN0aW9uIHAoQixJKXtyZXR1cm4gQltJXX1mdW5jdGlvbiBtKEIsSSl7cmV0dXJuIEIuZmluZChOPT5fLmlzRXF1YWwoTi5uYW1lLEkpKX1mdW5jdGlvbiBuKEIsSSxOKXtyZXR1cm4gSS5ocGFyYW1zW0IuaHBhcmFtQ29sdW1uc1tOXS5ocGFyYW1JbmZvLm5hbWVdfQpmdW5jdGlvbiBxKEIsSSxOKXtCPW0oSS5tZXRyaWNWYWx1ZXMsQi5tZXRyaWNDb2x1bW5zW05dLm1ldHJpY0luZm8ubmFtZSk7cmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOkIudmFsdWV9ZnVuY3Rpb24gdShCLEksTil7cmV0dXJuIE48Qi5ocGFyYW1Db2x1bW5zLmxlbmd0aD9uKEIsSSxOKTpxKEIsSSxOLUIuaHBhcmFtQ29sdW1ucy5sZW5ndGgpfWZ1bmN0aW9uIHgoQil7cmV0dXJuIEIuaHBhcmFtSW5mb3MubGVuZ3RofWZ1bmN0aW9uIEEoQil7cmV0dXJuIEIubWV0cmljSW5mb3MubGVuZ3RofWZ1bmN0aW9uIHkoQixJLE4pe3JldHVybiBJLmhwYXJhbXNbQi5ocGFyYW1JbmZvc1tOXS5uYW1lXX1mdW5jdGlvbiB3KEIsSSxOKXtCPW0oSS5tZXRyaWNWYWx1ZXMsQi5tZXRyaWNJbmZvc1tOXS5uYW1lKTtyZXR1cm4gdm9pZCAwPT09Qj92b2lkIDA6Qi52YWx1ZX1mdW5jdGlvbiBDKEIsSSxOKXtyZXR1cm4gTjxCLmhwYXJhbUluZm9zLmxlbmd0aD95KEIsSSxOKTp3KEIsSSxOLUIuaHBhcmFtSW5mb3MubGVuZ3RoKX0KZnVuY3Rpb24gRyhCKXtyZXR1cm4gXy5pc051bWJlcihCKT9CLnRvUHJlY2lzaW9uKDUpOnZvaWQgMD09PUI/IiI6Qi50b1N0cmluZygpfWZ1bmN0aW9uIEQoQixJKXtyZXR1cm4gQipCK0kqSX1mLmhwYXJhbU5hbWU9aDtmLm1ldHJpY05hbWU9aztmLnNjaGVtYUNvbHVtbk5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gSTxCLmhwYXJhbUNvbHVtbnMubGVuZ3RoP2goQi5ocGFyYW1Db2x1bW5zW0ldLmhwYXJhbUluZm8pOmsoQi5tZXRyaWNDb2x1bW5zW0ktQi5ocGFyYW1Db2x1bW5zLmxlbmd0aF0ubWV0cmljSW5mbyl9O2YubnVtSFBhcmFtcz10O2YubnVtTWV0cmljcz1sO2YubnVtQ29sdW1ucz1mdW5jdGlvbihCKXtyZXR1cm4gdChCKStsKEIpfTtmLmhwYXJhbVZhbHVlQnlOYW1lPXA7Zi5tZXRyaWNWYWx1ZUJ5TmFtZT1tO2YuaHBhcmFtVmFsdWVCeUluZGV4PW47Zi5tZXRyaWNWYWx1ZUJ5SW5kZXg9cTtmLmNvbHVtblZhbHVlQnlJbmRleD11O2YubnVtZXJpY0NvbHVtbkV4dGVudD0KZnVuY3Rpb24oQixJLE4pe3JldHVybiBkMy5leHRlbnQoSSxPPT51KEIsTyxOKSl9O2YuZ2V0QWJzb2x1dGVDb2x1bW5JbmRleD1mdW5jdGlvbihCLEksTil7aWYoTjxJLmhwYXJhbUluZm9zLmxlbmd0aClCPUIuaHBhcmFtQ29sdW1ucy5maW5kSW5kZXgoTz0+Ty5ocGFyYW1JbmZvLm5hbWU9PT1JLmhwYXJhbUluZm9zW05dLm5hbWUpO2Vsc2V7Y29uc3QgTz1JLm1ldHJpY0luZm9zW04tSS5ocGFyYW1JbmZvcy5sZW5ndGhdLm5hbWU7Qj1CLmhwYXJhbUNvbHVtbnMubGVuZ3RoK0IubWV0cmljQ29sdW1ucy5maW5kSW5kZXgoSD0+SC5tZXRyaWNJbmZvLm5hbWU9PT1PKX1jb25zb2xlLmFzc2VydCgtMSE9PUIpO3JldHVybiBCfTtmLnNjaGVtYVZpc2libGVDb2x1bW5OYW1lPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEk8Qi5ocGFyYW1JbmZvcy5sZW5ndGg/aChCLmhwYXJhbUluZm9zW0ldKTprKEIubWV0cmljSW5mb3NbSS1CLmhwYXJhbUluZm9zLmxlbmd0aF0pfTtmLm51bVZpc2libGVIUGFyYW1zPQp4O2YubnVtVmlzaWJsZU1ldHJpY3M9QTtmLm51bVZpc2libGVDb2x1bW5zPWZ1bmN0aW9uKEIpe3JldHVybiB4KEIpK0EoQil9O2YudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQ9ZnVuY3Rpb24oQixJLE4pe3JldHVybiBkMy5leHRlbnQoSSxPPT5DKEIsTyxOKSl9O2YucHJldHR5UHJpbnRIUGFyYW1WYWx1ZUJ5TmFtZT1mdW5jdGlvbihCLEkpe3JldHVybiBHKHAoQixJKSl9O2YucHJldHR5UHJpbnRNZXRyaWNWYWx1ZUJ5TmFtZT1mdW5jdGlvbihCLEkpe3JldHVybiBHKG0oQixJKSl9O2Yuc2Vzc2lvbkdyb3VwV2l0aE5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gQi5maW5kKE49Pk4ubmFtZT09PUkpfTtmLmhwYXJhbVZhbHVlQnlWaXNpYmxlSW5kZXg9eTtmLm1ldHJpY1ZhbHVlQnlWaXNpYmxlSW5kZXg9dztmLmNvbHVtblZhbHVlQnlWaXNpYmxlSW5kZXg9QztmLnByZXR0eVByaW50PUc7Zi5sMk5vcm1TcXVhcmVkPUQ7Zi5ldWNsaWRlYW5EaXN0PWZ1bmN0aW9uKEIsSSxOLE8pe3JldHVybiBNYXRoLnNxcnQoRChCLQpOLEktTykpfTtmLnBvaW50VG9SZWN0YW5nbGVEaXN0PWZ1bmN0aW9uKEIsSSxOLE8sSCxLKXtpZihCPE4mJkk8TylyZXR1cm4gZi5ldWNsaWRlYW5EaXN0KEIsSSxOLE8pO2lmKE48PUImJkI8SCYmSTxPKXJldHVybiBPLUk7aWYoSDw9QiYmSTxPKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixJLEgsTyk7aWYoQjxOJiZPPD1JJiZJPEspcmV0dXJuIE4tQjtpZihOPD1CJiZCPEgmJk88PUkmJkk8SylyZXR1cm4gMDtpZihIPD1CJiZPPD1JJiZJPEspcmV0dXJuIEItSDtpZihCPE4mJks8PUkpcmV0dXJuIGYuZXVjbGlkZWFuRGlzdChCLEksTixLKTtpZihOPD1CJiZCPEgmJks8PUkpcmV0dXJuIEktSztpZihIPD1CJiZLPD1JKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixJLEgsSyk7dGhyb3ciUG9pbnQgKHgseSkgbXVzdCBiZSBpbiBvbmUgb2YgdGhlIHJlZ2lvbnMgZGVmaW5lZCBhYm92ZS4iO307Zi50cmFuc2xhdGVTdHI9ZnVuY3Rpb24oQixJKXtyZXR1cm4gdm9pZCAwPT09ST8idHJhbnNsYXRlKCIrCkIrIikiOiJ0cmFuc2xhdGUoIitCKyIsIitJKyIpIn07Zi5yb3RhdGVTdHI9ZnVuY3Rpb24oQixJKXtsZXQgTj0icm90YXRlKDkwIjt2b2lkIDAhPT1CJiZ2b2lkIDAhPT1JJiYoTj1OKyIsIitCKyIsIitJKTtyZXR1cm4gTisiKSJ9O2YuaXNOdWxsT3JVbmRlZmluZWQ9ZnVuY3Rpb24oQil7cmV0dXJuIG51bGw9PT1CfHx2b2lkIDA9PT1CfTtmLnF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3Q9ZnVuY3Rpb24oQixJLE4sTyxILEspe0IudmlzaXQoKE0sTCxRLFQsWCk9PntpZih2b2lkIDA9PT1NLmxlbmd0aCl7ZG8gTD1CLngoKShNLmRhdGEpLFE9Qi55KCkoTS5kYXRhKSxJPD1MJiZMPE8mJk48PVEmJlE8SCYmSyhNLmRhdGEpO3doaWxlKE09TS5uZXh0KTtyZXR1cm4hMH1yZXR1cm4gTD49T3x8VDw9SXx8UT49SHx8WDw9Tn0pfTtmLnF1YWRUcmVlVmlzaXRQb2ludHNJbkRpc2s9ZnVuY3Rpb24oQixJLE4sTyxIKXtCLnZpc2l0KChLLE0sTCxRLFQpPT57aWYodm9pZCAwPT09Sy5sZW5ndGgpe2RvIE09CkIueCgpKEsuZGF0YSksTD1CLnkoKShLLmRhdGEpLE09Zi5ldWNsaWRlYW5EaXN0KEksTixNLEwpLE08PU8mJkgoSy5kYXRhLE0pO3doaWxlKEs9Sy5uZXh0KTtyZXR1cm4hMH1yZXR1cm4gZi5wb2ludFRvUmVjdGFuZ2xlRGlzdChJLE4sTSxMLFEsVCk+T30pfTtmLmZpbHRlclNldD1mdW5jdGlvbihCLEkpe2NvbnN0IE49bmV3IFNldDtCLmZvckVhY2goTz0+e0koTykmJk4uYWRkKE8pfSk7cmV0dXJuIE59O2Yuc2V0QXJyYXlPYnNlcnZhYmx5PWZ1bmN0aW9uKEIsSSl7Y29uc3QgTj1CLmdldCgic2Vzc2lvbkdyb3VwcyIsQik7QXJyYXkuaXNBcnJheShOKT9CLnNwbGljZS5hcHBseShCLFsic2Vzc2lvbkdyb3VwcyIsMCxOLmxlbmd0aF0uY29uY2F0KEkpKTpCLnNldCgic2Vzc2lvbkdyb3VwcyIsSSl9O2YuaGFzaE9mU3RyaW5nPWZ1bmN0aW9uKEIpe2xldCBJPTA7Zm9yKGxldCBOPTA7TjxCLmxlbmd0aDsrK04pST0zMSpJK0IuY2hhckNvZGVBdChOKSY0Mjk0OTY3Mjk1O3JldHVybiBJKwpNYXRoLnBvdygyLDMxKX19KShkLnV0aWxzfHwoZC51dGlscz17fSkpfSkoYi5ocGFyYW1zfHwoYi5ocGFyYW1zPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLXNwbGl0LWxheW91dC92YWFkaW4tc3BsaXQtbGF5b3V0Lmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1zcGxpdC1sYXlvdXQiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3ZlcnRpY2FsOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxfcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50czpTdHJpbmcsX3ByZXZpb3VzU2Vjb25kYXJ5UG9pbnRlckV2ZW50czpTdHJpbmd9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXI9UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX3Byb2Nlc3NDaGlsZHJlbil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpfSxfcHJvY2Vzc0NoaWxkcmVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gYi5jbGFzc0xpc3QuY29udGFpbnMoInNwbGl0dGVyLWhhbmRsZSIpPwooUG9seW1lci5kb20oYikuc2V0QXR0cmlidXRlKCJzbG90IiwiaGFuZGxlIiksITEpOiEwfSkuZm9yRWFjaChmdW5jdGlvbihiLGQpezA9PT1kPyh0aGlzLl9wcmltYXJ5Q2hpbGQ9YixQb2x5bWVyLmRvbShiKS5zZXRBdHRyaWJ1dGUoInNsb3QiLCJwcmltYXJ5IikpOjE9PWQ/KHRoaXMuX3NlY29uZGFyeUNoaWxkPWIsUG9seW1lci5kb20oYikuc2V0QXR0cmlidXRlKCJzbG90Iiwic2Vjb25kYXJ5IikpOlBvbHltZXIuZG9tKGIpLnJlbW92ZUF0dHJpYnV0ZSgic2xvdCIpfS5iaW5kKHRoaXMpKX0sX3NldEZsZXhCYXNpczpmdW5jdGlvbihiLGQsZil7ZD1NYXRoLm1heCgwLE1hdGgubWluKGQsZikpOzA9PT1kJiYoZD0xRS02KTtiLnN0eWxlLmZsZXg9IjEgMSAiK2QrInB4In0sX29uSGFuZGxlVHJhY2s6ZnVuY3Rpb24oYil7aWYodGhpcy5fcHJpbWFyeUNoaWxkJiZ0aGlzLl9zZWNvbmRhcnlDaGlsZCl7dmFyIGQ9dGhpcy52ZXJ0aWNhbD8iaGVpZ2h0Ijoid2lkdGgiOyJzdGFydCI9PT0KYi5kZXRhaWwuc3RhdGU/KHRoaXMuX3N0YXJ0U2l6ZT17Y29udGFpbmVyOnRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZF0tdGhpcy4kLnNwbGl0dGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdLHByaW1hcnk6dGhpcy5fcHJpbWFyeUNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdLHNlY29uZGFyeTp0aGlzLl9zZWNvbmRhcnlDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkXX0sdGhpcy5fcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50cz10aGlzLl9wcmltYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cyx0aGlzLl9wcmV2aW91c1NlY29uZGFyeVBvaW50ZXJFdmVudHM9dGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cyx0aGlzLl9wcmltYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsdGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIpOihkPXRoaXMudmVydGljYWw/Yi5kZXRhaWwuZHk6CmIuZGV0YWlsLmR4LHRoaXMuX3NldEZsZXhCYXNpcyh0aGlzLl9wcmltYXJ5Q2hpbGQsdGhpcy5fc3RhcnRTaXplLnByaW1hcnkrZCx0aGlzLl9zdGFydFNpemUuY29udGFpbmVyKSx0aGlzLl9zZXRGbGV4QmFzaXModGhpcy5fc2Vjb25kYXJ5Q2hpbGQsdGhpcy5fc3RhcnRTaXplLnNlY29uZGFyeS1kLHRoaXMuX3N0YXJ0U2l6ZS5jb250YWluZXIpLHRoaXMubm90aWZ5UmVzaXplKCksImVuZCI9PT1iLmRldGFpbC5zdGF0ZSYmKGRlbGV0ZSB0aGlzLl9zdGFydFNpemUsdGhpcy5fcHJpbWFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9dGhpcy5fcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50cyx0aGlzLl9zZWNvbmRhcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzPXRoaXMuX3ByZXZpb3VzU2Vjb25kYXJ5UG9pbnRlckV2ZW50cykpfX0sX3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKGIpe2IucHJldmVudERlZmF1bHQoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUvdGYtaHBhcmFtcy1xdWVyeS1wYW5lLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcXVlcnktcGFuZSIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjaGVtYTp7aHBhcmFtQ29sdW1uczpbXSxtZXRyaWNDb2x1bW5zOltdfSxjb2x1bW5zVmlzaWJpbGl0eTpbXSx2aXNpYmxlU2NoZW1hOntocGFyYW1JbmZvczpbXSxtZXRyaWNJbmZvczpbXX19KSxyZWFkT25seTohMCxub3RpZnk6ITB9LHNlc3Npb25Hcm91cHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sX2V4cGVyaW1lbnQ6T2JqZWN0LF9ocGFyYW1zOkFycmF5LF9tZXRyaWNzOkFycmF5LF9zdGF0dXNlczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W3t2YWx1ZToiU1RBVFVTX1VOS05PV04iLGRpc3BsYXlOYW1lOiJVbmtub3duIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19TVUNDRVNTIixkaXNwbGF5TmFtZToiU3VjY2VzcyIsCmFsbG93ZWQ6ITB9LHt2YWx1ZToiU1RBVFVTX0ZBSUxVUkUiLGRpc3BsYXlOYW1lOiJGYWlsdXJlIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19SVU5OSU5HIixkaXNwbGF5TmFtZToiUnVubmluZyIsYWxsb3dlZDohMH1dfSxfZ2V0RXhwZXJpbWVudFJlc29sdmVkOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZShiPT57dGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQ9Yn0pfX0sX3Jlc29sdmVHZXRFeHBlcmltZW50OkZ1bmN0aW9uLF9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9zb3J0QnlJbmRleDpOdW1iZXIsX3NvcnREaXJlY3Rpb246TnVtYmVyLF9wYWdlU2l6ZUlucHV0Ont0eXBlOk9iamVjdCx2YWx1ZTp7dmFsdWU6IjEwMCIsaW52YWxpZDohMX19LF9wYWdlTnVtYmVySW5wdXQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt2YWx1ZToiMSIsaW52YWxpZDohMX19LApfcGFnZUNvdW50U3RyOnt0eXBlOlN0cmluZyx2YWx1ZToiPyJ9LF90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0cjpTdHJpbmcsX3Nlc3Npb25Hcm91cHNSZXF1ZXN0Ok9iamVjdH0sb2JzZXJ2ZXJzOlsiX2NvbXB1dGVFeHBlcmltZW50QW5kUmVsYXRlZFByb3BzKGJhY2tlbmQsIGV4cGVyaW1lbnROYW1lKSIsIl91cGRhdGVDb25maWd1cmF0aW9uKF9ocGFyYW1zLiosIF9tZXRyaWNzLiopIl0scmVsb2FkKCl7dGhpcy5fcXVlcnlTZXJ2ZXIoKX0sX2NzdlVybChiLGQpe3JldHVybiB0aGlzLl9kb3dubG9hZERhdGFVcmwoYixkLCJjc3YiKX0sX2pzb25VcmwoYixkKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCwianNvbiIpfSxfbGF0ZXhVcmwoYixkKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCwibGF0ZXgiKX0sX2Rvd25sb2FkRGF0YVVybChiLGQsZil7cmV0dXJuIHRoaXMuYmFja2VuZC5nZXREb3dubG9hZFVybChmLGIsZC5jb2x1bW5zVmlzaWJpbGl0eSl9LApfY29tcHV0ZUV4cGVyaW1lbnRBbmRSZWxhdGVkUHJvcHMoKXtjb25zdCBiPXRmLmhwYXJhbXMudXRpbHM7Yi5pc051bGxPclVuZGVmaW5lZCh0aGlzLmJhY2tlbmQpfHxiLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuZXhwZXJpbWVudE5hbWUpfHx0aGlzLmJhY2tlbmQuZ2V0RXhwZXJpbWVudCh7ZXhwZXJpbWVudE5hbWU6dGhpcy5leHBlcmltZW50TmFtZX0pLnRoZW4oZD0+e18uaXNFcXVhbChkLHRoaXMuX2V4cGVyaW1lbnQpfHwodGhpcy5zZXQoIl9leHBlcmltZW50IixkKSx0aGlzLl9jb21wdXRlSFBhcmFtcygpLHRoaXMuX2NvbXB1dGVNZXRyaWNzKCksdGhpcy5fcXVlcnlTZXJ2ZXIoKSx0aGlzLl9yZXNvbHZlR2V0RXhwZXJpbWVudCgpKX0pfSxfY29tcHV0ZUhQYXJhbXMoKXtjb25zdCBiPVtdO3RoaXMuX2V4cGVyaW1lbnQuaHBhcmFtSW5mb3MuZm9yRWFjaCgoZCxmKT0+e2NvbnN0IGg9e2luZm86ZCxkaXNwbGF5ZWQ6NT5mLGZpbHRlcjp7fX07aC5pbmZvLmhhc093blByb3BlcnR5KCJkb21haW5EaXNjcmV0ZSIpPwooaC5maWx0ZXIuZG9tYWluRGlzY3JldGU9W10saC5pbmZvLmRvbWFpbkRpc2NyZXRlLmZvckVhY2goaz0+e2guZmlsdGVyLmRvbWFpbkRpc2NyZXRlLnB1c2goe3ZhbHVlOmssY2hlY2tlZDohMH0pfSkpOiJEQVRBX1RZUEVfQk9PTCI9PT1oLmluZm8udHlwZT9oLmZpbHRlci5kb21haW5EaXNjcmV0ZT1be3ZhbHVlOiExLGNoZWNrZWQ6ITB9LHt2YWx1ZTohMCxjaGVja2VkOiEwfV06IkRBVEFfVFlQRV9GTE9BVDY0Ij09PWguaW5mby50eXBlP2guZmlsdGVyLmludGVydmFsPXttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19OiJEQVRBX1RZUEVfU1RSSU5HIj09PWguaW5mby50eXBlP2guZmlsdGVyLnJlZ2V4cD0iIjpjb25zb2xlLndhcm4oInVua25vd24gaHBhcmFtLmluZm8udHlwZTogJXMiLGguaW5mby50eXBlKTtiLnB1c2goaCl9KTt0aGlzLnNldCgiX2hwYXJhbXMiLGIpfSxfY29tcHV0ZU1ldHJpY3MoKXtjb25zdCBiPVtdO3RoaXMuX2V4cGVyaW1lbnQubWV0cmljSW5mb3MuZm9yRWFjaCgoZCwKZik9PntiLnB1c2goe2luZm86ZCxmaWx0ZXI6e2ludGVydmFsOnttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19fSxkaXNwbGF5ZWQ6NT5mfSl9KTt0aGlzLnNldCgiX21ldHJpY3MiLGIpfSxfY29tcHV0ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9ocGFyYW1zJiZ0aGlzLl9tZXRyaWNzP3tocGFyYW1Db2x1bW5zOnRoaXMuX2hwYXJhbXMubWFwKGI9Pih7aHBhcmFtSW5mbzpiLmluZm99KSksbWV0cmljQ29sdW1uczp0aGlzLl9tZXRyaWNzLm1hcChiPT4oe21ldHJpY0luZm86Yi5pbmZvfSkpfTp7aHBhcmFtQ29sdW1uczpbXSxtZXRyaWNDb2x1bW5zOltdfX0sX3VwZGF0ZUNvbmZpZ3VyYXRpb24oKXt0aGlzLmRlYm91bmNlKCJfdXBkYXRlQ29uZmlndXJhdGlvbiIsKCk9Pnt0aGlzLl9zZXRDb25maWd1cmF0aW9uKHtzY2hlbWE6dGhpcy5fY29tcHV0ZVNjaGVtYSgpLGNvbHVtbnNWaXNpYmlsaXR5OnRoaXMuX2NvbXB1dGVDb2x1bW5zVmlzaWJpbGl0eSgpLAp2aXNpYmxlU2NoZW1hOnRoaXMuX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl9KX0pfSxfY29tcHV0ZUNvbHVtbnNWaXNpYmlsaXR5KCl7cmV0dXJuIHRoaXMuX2hwYXJhbXMmJnRoaXMuX21ldHJpY3M/dGhpcy5faHBhcmFtcy5tYXAoYj0+Yi5kaXNwbGF5ZWQpLmNvbmNhdCh0aGlzLl9tZXRyaWNzLm1hcChiPT5iLmRpc3BsYXllZCkpOltdfSxfY29tcHV0ZVZpc2libGVTY2hlbWEoKXtpZighdGhpcy5faHBhcmFtc3x8IXRoaXMuX21ldHJpY3MpcmV0dXJue2hwYXJhbUluZm9zOltdLG1ldHJpY0luZm9zOltdfTtjb25zdCBiPXRoaXMuX2hwYXJhbXMuZmlsdGVyKGY9PmYuZGlzcGxheWVkKS5tYXAoZj0+Zi5pbmZvKSxkPXRoaXMuX21ldHJpY3MuZmlsdGVyKGY9PmYuZGlzcGxheWVkKS5tYXAoZj0+Zi5pbmZvKTtyZXR1cm57aHBhcmFtSW5mb3M6YixtZXRyaWNJbmZvczpkfX0sX3F1ZXJ5U2VydmVyKCl7dGhpcy5kZWJvdW5jZSgicXVlcnlTZXJ2ZXIiLCgpPT50aGlzLl9xdWVyeVNlcnZlck5vRGVib3VuY2UoKSwKMTAwKX0sX3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpe3JldHVybiB0aGlzLl9zZW5kTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCkudGhlbih0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxsYWJsZSgoe3ZhbHVlOmIsY2FuY2VsbGVkOmR9KT0+e2R8fCgwPD1iLnRvdGFsU2l6ZT8odGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLFN0cmluZyhNYXRoLmNlaWwoYi50b3RhbFNpemUvK3RoaXMuX3BhZ2VTaXplSW5wdXQudmFsdWUpKSksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsYi50b3RhbFNpemUpKToodGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLCI/IiksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsIlVua25vd24iKSksdGYuaHBhcmFtcy51dGlscy5zZXRBcnJheU9ic2VydmFibHkodGhpcyxiLnNlc3Npb25Hcm91cHMpKX0pKX0sX3NlbmRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKXtjb25zdCBiPXRoaXMuX2J1aWxkTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCk7CmlmKG51bGwhPT1iKXJldHVybiB0aGlzLnNldCgiX3Nlc3Npb25Hcm91cHNSZXF1ZXN0IixiKSx0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxBbGwoKSx0aGlzLmJhY2tlbmQubGlzdFNlc3Npb25Hcm91cHMoYil9LF9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2Z1bmN0aW9uIGIobSl7dmFyIG49Zi5nZXQobSsiLm1pbi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PW4pO249IiI9PT1uPyItSW5maW5pdHkiOituO2Yuc2V0KG0rIi5taW4uaW52YWxpZCIsaXNOYU4obikpO2g9aCYmIWlzTmFOKG4pO3ZhciBxPWYuZ2V0KG0rIi5tYXgudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1xKTtxPSIiPT09cT8iSW5maW5pdHkiOitxO2Yuc2V0KG0rIi5tYXguaW52YWxpZCIsaXNOYU4ocSkpO2g9aCYmIWlzTmFOKHEpO3JldHVybiBpc05hTihuKXx8aXNOYU4ocSk/bnVsbDp7bWluVmFsdWU6bixtYXhWYWx1ZTpxfX1mdW5jdGlvbiBkKG0pe3ZhciBuPQpmLmdldChtKyIudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1uKTtuPStuO2NvbnN0IHE9TnVtYmVyLmlzSW50ZWdlcihuKSYmMDxuO2Yuc2V0KG0rIi5pbnZhbGlkIiwhcSk7aD1oJiZxO3JldHVybiBxP246bnVsbH1jb25zdCBmPXRoaXM7bGV0IGg9ITA7Y29uc3Qgaz10aGlzLl9zdGF0dXNlcy5maWx0ZXIobT0+bS5hbGxvd2VkKS5tYXAobT0+bS52YWx1ZSk7bGV0IHQ9W107dGhpcy5faHBhcmFtcy5mb3JFYWNoKChtLG4pPT57bGV0IHE9e2hwYXJhbTptLmluZm8ubmFtZX07aWYobS5maWx0ZXIuZG9tYWluRGlzY3JldGUpcS5maWx0ZXJEaXNjcmV0ZT1bXSxtLmZpbHRlci5kb21haW5EaXNjcmV0ZS5mb3JFYWNoKHU9Pnt1LmNoZWNrZWQmJnEuZmlsdGVyRGlzY3JldGUucHVzaCh1LnZhbHVlKX0pO2Vsc2UgaWYobS5maWx0ZXIuaW50ZXJ2YWwpcS5maWx0ZXJJbnRlcnZhbD1iKCJfaHBhcmFtcy4iK24rIi5maWx0ZXIuaW50ZXJ2YWwiKTtlbHNlIGlmKG0uZmlsdGVyLnJlZ2V4cClxLmZpbHRlclJlZ2V4cD0KbS5maWx0ZXIucmVnZXhwO2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoImhwYXJhbS5maWx0ZXIgd2l0aCBubyBkb21haW5EaXNjcmV0ZSwgaW50ZXJ2YWwgb3IgcmVnZXhwIHByb3BlcnRpZXMgc2V0OiAlcyIsbSksbnVsbDt0LnB1c2gocSl9KTt0aGlzLl9tZXRyaWNzLmZvckVhY2goKG0sbik9PnttPXttZXRyaWM6bS5pbmZvLm5hbWUsZmlsdGVySW50ZXJ2YWw6YigiX21ldHJpY3MuIituKyIuZmlsdGVyLmludGVydmFsIil9O3QucHVzaChtKX0pO2lmKHZvaWQgMCE9PXRoaXMuX3NvcnRCeUluZGV4JiZ2b2lkIDAhPT10aGlzLl9zb3J0RGlyZWN0aW9uKXtpZighKHRoaXMuX3NvcnRCeUluZGV4IGluIHQpKXJldHVybiBjb25zb2xlLmVycm9yKCJObyBjb2x1bW4gaW4gY29sUGFyYW1zIHdpdGggaW5kZXggc29ydEJ5SW5kZXg6ICVzIix0aGlzLl9zb3J0QnlJbmRleCksbnVsbDt0W3RoaXMuX3NvcnRCeUluZGV4XS5vcmRlcj0wPT09dGhpcy5fc29ydERpcmVjdGlvbj8iT1JERVJfQVNDIjoKIk9SREVSX0RFU0MifWNvbnN0IGw9ZCgiX3BhZ2VOdW1iZXJJbnB1dCIpLHA9ZCgiX3BhZ2VTaXplSW5wdXQiKTtyZXR1cm4gaD97ZXhwZXJpbWVudE5hbWU6dGhpcy5leHBlcmltZW50TmFtZSxhbGxvd2VkU3RhdHVzZXM6ayxjb2xQYXJhbXM6dCxzdGFydEluZGV4OnAqKGwtMSksc2xpY2VTaXplOnB9Om51bGx9LF9tZXRyaWNTb3J0QnlJbmRleChiKXtyZXR1cm4gYit0aGlzLl9ocGFyYW1zLmxlbmd0aH0sX2hwYXJhbU5hbWU6dGYuaHBhcmFtcy51dGlscy5ocGFyYW1OYW1lLF9tZXRyaWNOYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZSxfcHJldHR5UHJpbnQ6dGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludH0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tcGFnZXMvaXJvbi1wYWdlcy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLXBhZ2VzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcl0scHJvcGVydGllczp7YWN0aXZhdGVFdmVudDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZWxlY3RlZFBhZ2VDaGFuZ2VkKHNlbGVjdGVkKSJdLF9zZWxlY3RlZFBhZ2VDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyh0aGlzLm5vdGlmeVJlc2l6ZSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaGVhZGVyLXBhbmVsL3BhcGVyLWhlYWRlci1wYW5lbC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtzY3JvbGw6ITB9LGQ9e3N0YW5kYXJkOjIsd2F0ZXJmYWxsOjEsIndhdGVyZmFsbC10YWxsIjoxfSxmPXsid2F0ZXJmYWxsLXRhbGwiOiEwfTtQb2x5bWVyKHtpczoicGFwZXItaGVhZGVyLXBhbmVsIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RhbmRhcmQiLG9ic2VydmVyOiJfbW9kZUNoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sc2hhZG93Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHRhbGxDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6InRhbGwifSxhdFRvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW4oYXRUb3AsIG1vZGUsIHNoYWRvdykiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FkZExpc3RlbmVyKCk7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXIoKX0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxIYW5kbGVyPXRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpO2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sZ2V0IGhlYWRlcigpe3JldHVybiBQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyU2xvdCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdfSxnZXQgc2Nyb2xsZXIoKXtyZXR1cm4gdGhpcy5fZ2V0U2Nyb2xsZXJGb3JNb2RlKHRoaXMubW9kZSl9LGdldCB2aXNpYmxlU2hhZG93KCl7cmV0dXJuIHRoaXMuJC5kcm9wU2hhZG93LmNsYXNzTGlzdC5jb250YWlucygiaGFzLXNoYWRvdyIpfSxfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW46ZnVuY3Rpb24oaCxrKXtrPWRba107dGhpcy5zaGFkb3c/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITAsdGhpcy4kLmRyb3BTaGFkb3cpOjI9PT1rP3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KToKMSE9PWt8fGg/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITEsdGhpcy4kLmRyb3BTaGFkb3cpOnRoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KX0sX2NvbXB1dGVNYWluQ29udGFpbmVyQ2xhc3M6ZnVuY3Rpb24oaCl7dmFyIGs9e307ay5mbGV4PSJjb3ZlciIhPT1oO3JldHVybiBPYmplY3Qua2V5cyhrKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIGtbdF19KS5qb2luKCIgIil9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLnNjcm9sbEhhbmRsZXIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX21vZGVDaGFuZ2VkOmZ1bmN0aW9uKGgsayl7dmFyIHQ9dGhpcy5oZWFkZXI7dCYmKGZba10mJiFmW2hdPyh0LmNsYXNzTGlzdC5yZW1vdmUodGhpcy50YWxsQ2xhc3MpLAp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJhbmltYXRlIil9LDIwMCkpOnRoaXMudG9nZ2xlQ2xhc3MoImFuaW1hdGUiLGZbaF0sdCkpO3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxfa2VlcFNjcm9sbGluZ1N0YXRlOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5zY3JvbGxlcixrPXRoaXMuaGVhZGVyO3RoaXMuX3NldEF0VG9wKDA9PT1oLnNjcm9sbFRvcCk7ayYmdGhpcy50YWxsQ2xhc3MmJmZbdGhpcy5tb2RlXSYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnRhbGxDbGFzcyx0aGlzLmF0VG9wfHxrLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLnRhbGxDbGFzcykmJmguc2Nyb2xsSGVpZ2h0PHRoaXMub2Zmc2V0SGVpZ2h0LGspfSxfc2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCk7dGhpcy5maXJlKCJjb250ZW50LXNjcm9sbCIse3RhcmdldDp0aGlzLnNjcm9sbGVyfSx7YnViYmxlczohMX0pfSxfZ2V0U2Nyb2xsZXJGb3JNb2RlOmZ1bmN0aW9uKGgpe3JldHVybiBiW2hdPwp0aGlzOnRoaXMuJC5tYWluQ29udGFpbmVyfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10YWIiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcl0scHJvcGVydGllczp7bGluazp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0YWIifSxsaXN0ZW5lcnM6e2Rvd246Il91cGRhdGVOb2luayIsdGFwOiJfb25UYXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZU5vaW5rKCl9LGdldCBfcGFyZW50Tm9pbmsoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiEhYiYmISFiLm5vaW5rfSxfdXBkYXRlTm9pbms6ZnVuY3Rpb24oKXt0aGlzLm5vaW5rPSEhdGhpcy5ub2lua3x8ISF0aGlzLl9wYXJlbnROb2lua30sX29uVGFwOmZ1bmN0aW9uKGIpe2lmKHRoaXMubGluayl7dmFyIGQ9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCJhIik7CmQmJmIudGFyZ2V0IT09ZCYmZC5jbGljaygpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYnMuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGFicyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLHByb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxub0Jhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub1NsaWRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZml0Q29udGFpbmVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVEcmFnOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGhpZGVTY3JvbGxCdXR0b25zOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsaWduQm90dG9tOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci10YWIifSxhdXRvc2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9zZWxlY3REZWxheTp7dHlwZTpOdW1iZXIsCnZhbHVlOjB9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2hvbGREZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2xlZnRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3JpZ2h0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wcmV2aW91c1RhYjp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToidGFibGlzdCJ9LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uVGFiU2l6aW5nQ2hhbmdlZCIsImlyb24taXRlbXMtY2hhbmdlZCI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QiLCJpcm9uLWRlc2VsZWN0IjoiX29uSXJvbkRlc2VsZWN0In0sa2V5QmluZGluZ3M6eyJsZWZ0OmtleXVwIHJpZ2h0OmtleXVwIjoiX29uQXJyb3dLZXl1cCJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9ob2xkSm9iPW51bGw7dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT0Kdm9pZCAwO3RoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXI9dGhpcy5fZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9vbkJsdXJDYXB0dXJlLmJpbmQodGhpcyksITApfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2V0U2Nyb2xsRGlyZWN0aW9uKCJ5Iix0aGlzLiQudGFic0NvbnRhaW5lcil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sX25vaW5rQ2hhbmdlZDpmdW5jdGlvbihiKXtQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci10YWIiKS5mb3JFYWNoKGI/dGhpcy5fc2V0Tm9pbmtBdHRyaWJ1dGU6dGhpcy5fcmVtb3ZlTm9pbmtBdHRyaWJ1dGUpfSxfc2V0Tm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24oYil7Yi5zZXRBdHRyaWJ1dGUoIm5vaW5rIiwiIil9LF9yZW1vdmVOb2lua0F0dHJpYnV0ZTpmdW5jdGlvbihiKXtiLnJlbW92ZUF0dHJpYnV0ZSgibm9pbmsiKX0sCl9jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3M6ZnVuY3Rpb24oYixkLGYpe3JldHVybiFkfHxmPyJoaWRkZW4iOmI/Im5vdC12aXNpYmxlIjoiIn0sX2NvbXB1dGVUYWJzQ29udGVudENsYXNzOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/InNjcm9sbGFibGUiKyhkPyIgZml0LWNvbnRhaW5lciI6IiIpOiIgZml0LWNvbnRhaW5lciJ9LF9jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3M6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj8iaGlkZGVuIjpkPyJhbGlnbi1ib3R0b20iOiIifSxfb25UYWJTaXppbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX29uVGFiU2l6aW5nQ2hhbmdlZCIsZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGwoKTt0aGlzLl90YWJDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRJdGVtKX0sMTApfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMuX3RhYkNoYW5nZWQoYi5kZXRhaWwuaXRlbSx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9Yi5kZXRhaWwuaXRlbTsKdGhpcy5jYW5jZWxEZWJvdW5jZXIoInRhYi1jaGFuZ2VkIil9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoInRhYi1jaGFuZ2VkIixmdW5jdGlvbigpe3RoaXMuX3RhYkNoYW5nZWQobnVsbCx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9bnVsbH0sMSl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX2FjdGl2YXRlSGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9zY2hlZHVsZUFjdGl2YXRpb246ZnVuY3Rpb24oYixkKXt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09Yjt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5hc3luYyh0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLGQpfSxfZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtOwp0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXZvaWQgMDtiLmZpcmUodGhpcy5hY3RpdmF0ZUV2ZW50LG51bGwse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pfSxfY2FuY2VsUGVuZGluZ0FjdGl2YXRpb246ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCksdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDApfSxfb25BcnJvd0tleXVwOmZ1bmN0aW9uKCl7dGhpcy5hdXRvc2VsZWN0JiZ0aGlzLl9zY2hlZHVsZUFjdGl2YXRpb24odGhpcy5mb2N1c2VkSXRlbSx0aGlzLmF1dG9zZWxlY3REZWxheSl9LF9vbkJsdXJDYXB0dXJlOmZ1bmN0aW9uKGIpe2IudGFyZ2V0PT09dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtJiZ0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpfSwKZ2V0IF90YWJDb250YWluZXJTY3JvbGxTaXplKCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsV2lkdGgtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgpfSxfc2Nyb2xsOmZ1bmN0aW9uKGIsZCl7dGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9hZmZlY3RTY3JvbGwoZCYmLWQuZGR4fHwwKX0sX2Rvd246ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKX0sMSl9LF9hZmZlY3RTY3JvbGw6ZnVuY3Rpb24oYil7dGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9YjtiPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7dGhpcy5fbGVmdEhpZGRlbj0wPT09Yjt0aGlzLl9yaWdodEhpZGRlbj1iPT09dGhpcy5fdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZX0sCl9vbkxlZnRTY3JvbGxCdXR0b25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsVG9MZWZ0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb0xlZnQuYmluZCh0aGlzKSx0aGlzLl9ob2xkRGVsYXkpfSxfb25SaWdodFNjcm9sbEJ1dHRvbkRvd246ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxUb1JpZ2h0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb1JpZ2h0LmJpbmQodGhpcyksdGhpcy5faG9sZERlbGF5KX0sX29uU2Nyb2xsQnV0dG9uVXA6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuX2hvbGRKb2IpO3RoaXMuX2hvbGRKb2I9bnVsbH0sX3Njcm9sbFRvTGVmdDpmdW5jdGlvbigpe3RoaXMuX2FmZmVjdFNjcm9sbCgtdGhpcy5fc3RlcCl9LF9zY3JvbGxUb1JpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5fYWZmZWN0U2Nyb2xsKHRoaXMuX3N0ZXApfSxfdGFiQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2lmKGIpe3ZhciBmPXRoaXMuJC50YWJzQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKaD1mLndpZHRoLGs9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtmPWsubGVmdC1mLmxlZnQ7dGhpcy5fcG9zPXt3aWR0aDp0aGlzLl9jYWxjUGVyY2VudChrLndpZHRoLGgpLGxlZnQ6dGhpcy5fY2FsY1BlcmNlbnQoZixoKX07aWYodGhpcy5ub1NsaWRlfHxudWxsPT1kKXRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiZXhwYW5kIiksdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCk7ZWxzZXt2YXIgdD1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Q9dGhpcy5pdGVtcy5pbmRleE9mKGQpO2I9dGhpcy5pdGVtcy5pbmRleE9mKGIpO3RoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LmFkZCgiZXhwYW5kIik7Yj1kPGI7dGhpcy5faXNSVEwmJihiPSFiKTtiP3RoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KGsubGVmdCtrLndpZHRoLQp0LmxlZnQsaCktNSx0aGlzLl9sZWZ0KTp0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9jYWxjUGVyY2VudCh0LmxlZnQrdC53aWR0aC1rLmxlZnQsaCktNSx0aGlzLl9jYWxjUGVyY2VudChmLGgpKzUpO3RoaXMuc2Nyb2xsYWJsZSYmdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZElmTmVlZGVkKGsud2lkdGgsZil9fWVsc2UgdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJleHBhbmQiKSx0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImNvbnRyYWN0IiksdGhpcy5fcG9zaXRpb25CYXIoMCwwKX0sX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZDpmdW5jdGlvbihiLGQpe2QtPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7MD5kP3RoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQrPWQ6KGQrPWItdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgsMDxkJiYodGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9ZCkpfSxfY2FsY1BlcmNlbnQ6ZnVuY3Rpb24oYiwKZCl7cmV0dXJuIDEwMCpiL2R9LF9wb3NpdGlvbkJhcjpmdW5jdGlvbihiLGQpe2I9Ynx8MDtkPWR8fDA7dGhpcy5fd2lkdGg9Yjt0aGlzLl9sZWZ0PWQ7dGhpcy50cmFuc2Zvcm0oInRyYW5zbGF0ZVgoIitkKyIlKSBzY2FsZVgoIitiLzEwMCsiKSIsdGhpcy4kLnNlbGVjdGlvbkJhcil9LF9vbkJhclRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdDtiLmNvbnRhaW5zKCJleHBhbmQiKT8oYi5yZW1vdmUoImV4cGFuZCIpLGIuYWRkKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCkpOmIuY29udGFpbnMoImNvbnRyYWN0IikmJmIucmVtb3ZlKCJjb250cmFjdCIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvb2xiYXIvcGFwZXItdG9vbGJhci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b29sYmFyIixob3N0QXR0cmlidXRlczp7cm9sZToidG9vbGJhciJ9LHByb3BlcnRpZXM6e2JvdHRvbUp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxqdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sbWlkZGxlSnVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxyZWFkeTpmdW5jdGlvbigpe2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj10aGlzLl9vYnNlcnZlKHRoaXMpO3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJnRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKX0sX29ic2VydmU6ZnVuY3Rpb24oYil7dmFyIGQ9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpfS5iaW5kKHRoaXMpKTsKZC5vYnNlcnZlKGIse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7cmV0dXJuIGR9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe1BvbHltZXIuZG9tLmZsdXNoKCk7Zm9yKHZhciBiPVtdLGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJzbG90IikpLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoImNvbnRlbnQiKSkpLGYsaD0wO2Y9ZFtoXTtoKyspe2Y9UG9seW1lci5kb20oZikuZ2V0RGlzdHJpYnV0ZWROb2RlcygpO2Zvcih2YXIgayx0PTA7az1mW3RdO3QrKylpZihrLmNsYXNzTGlzdCYmay5jbGFzc0xpc3QuY29udGFpbnMoInRpdGxlIikpaWYoay5pZCliLnB1c2goay5pZCk7ZWxzZXt2YXIgbD0icGFwZXItdG9vbGJhci1sYWJlbC0iK01hdGguZmxvb3IoMUU0Kk1hdGgucmFuZG9tKCkpO2suaWQ9bDtiLnB1c2gobCl9fTA8CmIubGVuZ3RoJiZ0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixiLmpvaW4oIiAiKSl9LF9jb21wdXRlQmFyRXh0cmFDbGFzc2VzOmZ1bmN0aW9uKGIpe3JldHVybiBiP2IrKCJqdXN0aWZpZWQiPT09Yj8iIjoiLWp1c3RpZmllZCIpOiIifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzL3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIixwcm9wZXJ0aWVzOntjb25maWd1cmF0aW9uOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LG9wdGlvbnM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKGNvbmZpZ3VyYXRpb24uKikiLCJfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcyhzZXNzaW9uR3JvdXBzLiopIl0sX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKCl7Y29uc3QgYj10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYSxkPXRoaXMuY29uZmlndXJhdGlvbi5zY2hlbWEsZj17Y29sdW1uczpiLmhwYXJhbUluZm9zLm1hcCgoaCxrKT0+KHtuYW1lOnRmLmhwYXJhbXMudXRpbHMuaHBhcmFtTmFtZShoKSxpbmRleDprLGFic29sdXRlSW5kZXg6dGYuaHBhcmFtcy51dGlscy5nZXRBYnNvbHV0ZUNvbHVtbkluZGV4KGQsYixrKSxzY2FsZTp0aGlzLl9pc051bWVyaWNDb2x1bW4oayk/CiJMSU5FQVIiOiJOT05fTlVNRVJJQyJ9KSkuY29uY2F0KGIubWV0cmljSW5mb3MubWFwKChoLGspPT57ays9Yi5ocGFyYW1JbmZvcy5sZW5ndGg7cmV0dXJue3NjYWxlOiJMSU5FQVIiLG5hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lKGgpLGluZGV4OmssYWJzb2x1dGVJbmRleDp0Zi5ocGFyYW1zLnV0aWxzLmdldEFic29sdXRlQ29sdW1uSW5kZXgoZCxiLGspfX0pKSxtaW5Db2xvcjoiIzAwMDBGRiIsbWF4Q29sb3I6IiNGRjAwMDAiLGNvbmZpZ3VyYXRpb246dGhpcy5jb25maWd1cmF0aW9ufTt0aGlzLnNldCgib3B0aW9ucyIsZik7UG9seW1lci5kb20uZmx1c2goKTt0aGlzLnNldCgib3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgiLHRoaXMuX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKSl9LF91bnNlbGVjdERpc2FibGVkTG9nU2NhbGVzKCl7bnVsbCE9PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmNvbHVtbnMuZm9yRWFjaChiPT57Y29uc3QgZD0ib3B0aW9ucy5jb2x1bW5zLiIrCmIuaW5kZXg7dGhpcy5fYWxsb3dMb2dTY2FsZShiKXx8IkxPRyIhPT1iLnNjYWxlfHx0aGlzLnNldChkKyIuc2NhbGUiLCJMSU5FQVIiKX0pfSxfYWxsb3dMb2dTY2FsZShiKXtpZighdGhpcy5faXNOdW1lcmljQ29sdW1uKGIuaW5kZXgpfHwhdGhpcy5zZXNzaW9uR3JvdXBzKXJldHVybiExO2NvbnN0IFtkLGZdPXRmLmhwYXJhbXMudXRpbHMudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQodGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGIuaW5kZXgpO3JldHVybiAwPGR8fDA+Zn0sX2lzTnVtZXJpY0NvbHVtbihiKXtyZXR1cm4gYj49dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RofHwiREFUQV9UWVBFX0ZMT0FUNjQiPT09dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3NbYl0udHlwZX0sX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKXtpZigwPHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aClyZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RoOwpjb25zdCBiPXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmZpbmRJbmRleChkPT4iREFUQV9UWVBFX0ZMT0FUNjQiPT09ZC50eXBlKTtpZigtMSE9PWIpcmV0dXJuIGJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthY3RpdmVJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6bnVsbH19LGxpc3RlbmVyczp7ImNlbGwtYWN0aXZhdGUiOiJfYWN0aXZhdGVJdGVtIn0sb2JzZXJ2ZXJzOlsiX2FjdGl2ZUl0ZW1DaGFuZ2VkKGFjdGl2ZUl0ZW0pIl0sX2FjdGl2YXRlSXRlbTpmdW5jdGlvbihiKXt2YXIgZD1iLmRldGFpbC5tb2RlbC5pdGVtO3RoaXMuYWN0aXZlSXRlbT10aGlzLmFjdGl2ZUl0ZW0hPT1kP2Q6bnVsbDtiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxfYWN0aXZlSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMmJnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3RoaXMuX3VwZGF0ZUl0ZW0oYixiLml0ZW0pfS5iaW5kKHRoaXMpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7X3ZpZHhPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGlvczp7dHlwZTpCb29sZWFuLHZhbHVlOm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspLykscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxmaXhlZFNlY3Rpb25zOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLGNvbXB1dGVkOiJfaGFzRml4ZWRTZWN0aW9ucyhzY3JvbGxiYXJXaWR0aCkifSxfZnJvemVuQ2VsbHM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNjcm9sbGluZzp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxUYXJnZXQ9dGhpcy4kLnRhYmxlfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMubGlzdGVuKHRoaXMuc2Nyb2xsVGFyZ2V0LCJ3aGVlbCIsCiJfb25XaGVlbCIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5zY3JvbGxUYXJnZXQsIndoZWVsIiwiX29uV2hlZWwiKX0sc2Nyb2xsVG9TY2FsZWRJbmRleDpmdW5jdGlvbihiKXt0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleD1udWxsO3RoaXMuJC5pdGVtcy5zdHlsZS5ib3JkZXJUb3BXaWR0aHx8KHRoaXMuX3BlbmRpbmdTY3JvbGxUb1NjYWxlZEluZGV4PWIpO2I9TWF0aC5taW4oTWF0aC5tYXgoYiwwKSx0aGlzLnNpemUtMSk7dGhpcy4kLnRhYmxlLnNjcm9sbFRvcD1iL3RoaXMuc2l6ZSp0aGlzLiQudGFibGUuc2Nyb2xsSGVpZ2h0O3RoaXMuX3Njcm9sbEhhbmRsZXIoKTt0aGlzLnNjcm9sbFRvSW5kZXgoYi10aGlzLl92aWR4T2Zmc2V0KTt0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3Njcm9sbFBvc2l0aW9uKTt0aGlzLl9zY3JvbGxIYW5kbGVyKCk7dGhpcy5fdmlkeE9mZnNldCt0aGlzLmxhc3RWaXNpYmxlSW5kZXg9PT10aGlzLnNpemUtCjEmJih0aGlzLiQudGFibGUuc2Nyb2xsVG9wPXRoaXMuJC50YWJsZS5zY3JvbGxIZWlnaHQtdGhpcy4kLnRhYmxlLm9mZnNldEhlaWdodCx0aGlzLl9zY3JvbGxIYW5kbGVyKCkpfSxfaGFzRml4ZWRTZWN0aW9uczpmdW5jdGlvbihiKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZS8pJiYwPT09Yn0sX29uV2hlZWw6ZnVuY3Rpb24oYil7aWYoIWIuY3RybEtleSYmIXRoaXMuX2hhc1Njcm9sbGVkQW5jZXN0b3IoYi50YXJnZXQsYi5kZWx0YVgsYi5kZWx0YVkpKXt2YXIgZD10aGlzLiQudGFibGUsZj1iLmRlbHRhWTsxPT09Yi5kZWx0YU1vZGUmJihmKj1ncmlkLiQuc2Nyb2xsZXIuX3BoeXNpY2FsQXZlcmFnZSk7dmFyIGg9TWF0aC5hYnMoYi5kZWx0YVgpK01hdGguYWJzKGYpO3RoaXMuX2NhblNjcm9sbChkLGIuZGVsdGFYLGYpPyhiLnByZXZlbnREZWZhdWx0KCksZC5zY3JvbGxUb3ArPWYsZC5zY3JvbGxMZWZ0Kz1iLmRlbHRhWCx0aGlzLl9zY3JvbGxIYW5kbGVyKCksCnRoaXMuX2hhc1Jlc2lkdWFsTW9tZW50dW09ITAsdGhpcy5faWdub3JlTmV3V2hlZWw9dGhpcy5kZWJvdW5jZSgiaWdub3JlLW5ldy13aGVlbCIsZnVuY3Rpb24oKXt0aGlzLl9pZ25vcmVOZXdXaGVlbD1udWxsfSw1MDApKTp0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtJiZoPD10aGlzLl9wcmV2aW91c01vbWVudHVtfHx0aGlzLl9pZ25vcmVOZXdXaGVlbD9iLnByZXZlbnREZWZhdWx0KCk6aD50aGlzLl9wcmV2aW91c01vbWVudHVtJiYodGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bT0hMSk7dGhpcy5fcHJldmlvdXNNb21lbnR1bT1ofX0sX2hhc1Njcm9sbGVkQW5jZXN0b3I6ZnVuY3Rpb24oYixkLGYpe2lmKHRoaXMuX2NhblNjcm9sbChiLGQsZikpcmV0dXJuITA7aWYoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCIhPT1iLmxvY2FsTmFtZSYmYiE9PXRoaXMmJmIucGFyZW50RWxlbWVudClyZXR1cm4gdGhpcy5faGFzU2Nyb2xsZWRBbmNlc3RvcihiLnBhcmVudEVsZW1lbnQsZCxmKX0sCl9jYW5TY3JvbGw6ZnVuY3Rpb24oYixkLGYpe3JldHVybiAwPGYmJmIuc2Nyb2xsVG9wPGIuc2Nyb2xsSGVpZ2h0LWIub2Zmc2V0SGVpZ2h0fHwwPmYmJjA8Yi5zY3JvbGxUb3B8fDA8ZCYmYi5zY3JvbGxMZWZ0PGIuc2Nyb2xsV2lkdGgtYi5vZmZzZXRXaWR0aHx8MD5kJiYwPGIuc2Nyb2xsTGVmdH0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgYj1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxkPWItdGhpcy5fc2Nyb2xsUG9zaXRpb24sZj10aGlzLl9yYXRpbyxoPTAsaz10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSx0PWYsbD1bXTt0aGlzLl9zY3JvbGxQb3NpdGlvbj1iO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt2YXIgcD10aGlzLl9zY3JvbGxCb3R0b207dmFyIG09dGhpcy5fcGh5c2ljYWxCb3R0b207aWYoTWF0aC5hYnMoZCk+dGhpcy5fcGh5c2ljYWxTaXplKXRoaXMuX3BoeXNpY2FsVG9wKz0KZCxoPU1hdGgucm91bmQoZC90aGlzLl9waHlzaWNhbEF2ZXJhZ2UpO2Vsc2UgaWYoMD5kKXt2YXIgbj1iLXRoaXMuX3BoeXNpY2FsVG9wO2w9dGhpcy5fdmlydHVhbFN0YXJ0O3ZhciBxPVtdO3ZhciB1PXRoaXMuX3BoeXNpY2FsRW5kO2Zvcih0PW4vazt0PGYmJmg8dGhpcy5fcGh5c2ljYWxDb3VudCYmMDxsLWgmJm0tdGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpPnA7KW49dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpLHQrPW4vayxtLT1uLHEucHVzaCh1KSxoKyssdT0wPT09dT90aGlzLl9waHlzaWNhbENvdW50LTE6dS0xO2w9cTtoPS1ofWVsc2UgaWYoMDxkKXt2YXIgeD10aGlzLl92aXJ0dWFsRW5kLEE9dGhpcy5fdmlydHVhbENvdW50LTE7cT1bXTt1PXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHQ9KG0tcCkvazt0PGYmJmg8dGhpcy5fcGh5c2ljYWxDb3VudCYmeCtoPEEmJnRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh1KTwKYjspbj10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodSksdCs9bi9rLHRoaXMuX3BoeXNpY2FsVG9wKz1uLHEucHVzaCh1KSxoKyssdT0odSsxKSV0aGlzLl9waHlzaWNhbENvdW50fXRoaXMuX3ZpcnR1YWxDb3VudDx0aGlzLnNpemUmJnRoaXMuX2FkanVzdFZpcnR1YWxJbmRleE9mZnNldChkKTswPT09aD8obTxwfHx0aGlzLl9waHlzaWNhbFRvcD5iKSYmdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoKToodGhpcy5fdmlydHVhbFN0YXJ0Kz1oLHRoaXMuX3BoeXNpY2FsU3RhcnQrPWgsdGhpcy5fdXBkYXRlKHEsbCkpO3RoaXMuX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpO3RoaXMuaGFzQXR0cmlidXRlKCJyZW9yZGVyaW5nIil8fCh0aGlzLnNjcm9sbGluZz0hMCk7dGhpcy5kZWJvdW5jZSgidmFhZGluLWdyaWQtc2Nyb2xsaW5nIixmdW5jdGlvbigpe3RoaXMuc2Nyb2xsaW5nPSExO3RoaXMuX3Jlb3JkZXJSb3dzKCl9LDEwMCl9LF9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQ6ZnVuY3Rpb24oYil7aWYoMUU0PApNYXRoLmFicyhiKSl0aGlzLl9ub1NjYWxlP3RoaXMuX25vU2NhbGU9ITE6KGI9TWF0aC5yb3VuZCh0aGlzLl9zY3JvbGxQb3NpdGlvbi90aGlzLl9zY3JvbGxIZWlnaHQqMUUzKS8xRTMsdGhpcy5fdmlkeE9mZnNldD1NYXRoLnJvdW5kKGIqdGhpcy5zaXplLWIqdGhpcy5fdmlydHVhbENvdW50KSwwPT09dGhpcy5fc2Nyb2xsVG9wJiZ0aGlzLnNjcm9sbFRvSW5kZXgoMCkpO2Vsc2V7Yj10aGlzLl92aWR4T2Zmc2V0fHwwOzA9PT10aGlzLl9zY3JvbGxUb3A/KHRoaXMuX3ZpZHhPZmZzZXQ9MCxiIT09dGhpcy5fdmlkeE9mZnNldCYmdGhpcy5zY3JvbGxUb0luZGV4KDApKToxRTM+dGhpcy5maXJzdFZpc2libGVJbmRleCYmMDx0aGlzLl92aWR4T2Zmc2V0JiYodGhpcy5fdmlkeE9mZnNldC09TWF0aC5taW4odGhpcy5fdmlkeE9mZnNldCwxMDApLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4KyhiLXRoaXMuX3ZpZHhPZmZzZXQpKzEpLHRoaXMuX25vU2NhbGU9CiEwKTt2YXIgZD10aGlzLnNpemUtdGhpcy5fdmlydHVhbENvdW50O3RoaXMuX3Njcm9sbFRvcD49dGhpcy5fbWF4U2Nyb2xsVG9wPyh0aGlzLl92aWR4T2Zmc2V0PWQsYiE9PXRoaXMuX3ZpZHhPZmZzZXQmJnRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLl92aXJ0dWFsQ291bnQpKTp0aGlzLmZpcnN0VmlzaWJsZUluZGV4PnRoaXMuX3ZpcnR1YWxDb3VudC0xRTMmJnRoaXMuX3ZpZHhPZmZzZXQ8ZCYmKHRoaXMuX3ZpZHhPZmZzZXQrPU1hdGgubWluKGQtdGhpcy5fdmlkeE9mZnNldCwxMDApLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4LSh0aGlzLl92aWR4T2Zmc2V0LWIpKSx0aGlzLl9ub1NjYWxlPSEwKX19LF9yZW9yZGVyUm93czpmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5pdGVtcyksZD1iLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3ciKSxmPWQubGVuZ3RoLShkWzBdLmluZGV4LSh0aGlzLl92aXJ0dWFsU3RhcnQrdGhpcy5fdmlkeE9mZnNldCkpOwppZihmPGQubGVuZ3RoLzIpZm9yKHZhciBoPTA7aDxmO2grKyliLmFwcGVuZENoaWxkKGRbaF0pO2Vsc2UgZm9yKDtmPGQubGVuZ3RoO2YrKyliLmluc2VydEJlZm9yZShkW2ZdLGRbMF0pfSxfZnJvemVuQ2VsbHNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiY2FjaGUtZWxlbWVudHMiLGZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcy5kb21Ib3N0LnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1jZWxsIikuZm9yRWFjaChmdW5jdGlvbihiKXtiLnN0eWxlLnRyYW5zZm9ybT0iIn0pO3RoaXMuX2Zyb3plbkNlbGxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJbZnJvemVuXSIpKTt0aGlzLl90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKX0pO3RoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKX0sX3VwZGF0ZUxhc3RGcm96ZW46ZnVuY3Rpb24oKXtpZih0aGlzLmNvbHVtblRyZWUpe3ZhciBiPQp0aGlzLmNvbHVtblRyZWVbdGhpcy5jb2x1bW5UcmVlLmxlbmd0aC0xXS5zbGljZSgwKTtiLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gZi5fb3JkZXItaC5fb3JkZXJ9KTt2YXIgZD1iLnJlZHVjZShmdW5jdGlvbihmLGgsayl7aC5fbGFzdEZyb3plbj0hMTtyZXR1cm4gaC5mcm96ZW4mJiFoLmhpZGRlbj9rOmZ9LHZvaWQgMCk7dm9pZCAwIT09ZCYmKGJbZF0uX2xhc3RGcm96ZW49ITApfX0sX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50czpmdW5jdGlvbigpe3RoaXMuZml4ZWRTZWN0aW9ucz8odGhpcy4kLml0ZW1zLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoLXRoaXMuX3Njcm9sbExlZnR8fDAsLXRoaXMuX3Njcm9sbFRvcHx8MCksdGhpcy4kLmZvb3Rlci5zdHlsZS50cmFuc2Zvcm09dGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKC10aGlzLl9zY3JvbGxMZWZ0fHwwLDApKTp0aGlzLiQuZm9vdGVyLnN0eWxlLnRyYW5zZm9ybT0KdGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKDAsdGhpcy5fc2Nyb2xsVG9wKTtmb3IodmFyIGI9dGhpcy5fZ2V0VHJhbnNsYXRlKHRoaXMuX3Njcm9sbExlZnQsMCksZD0wO2Q8dGhpcy5fZnJvemVuQ2VsbHMubGVuZ3RoO2QrKyl0aGlzLl9mcm96ZW5DZWxsc1tkXS5zdHlsZS50cmFuc2Zvcm09Yn0sX2dldFRyYW5zbGF0ZTpmdW5jdGlvbihiLGQpe3JldHVybiJ0cmFuc2xhdGUoIitiKyJweCwiK2QrInB4KSJ9fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9yPVtQb2x5bWVyLklyb25TY3JvbGxUYXJnZXRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY2VsbC1jbGljay1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcj17bGlzdGVuZXJzOntjbGljazoiX29uQ2xpY2sifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGIpe2IudGFyZ2V0IT09dGhpcy5fY2VsbENvbnRlbnQmJnRoaXMuZmlyZSgiY2VsbC1jb250ZW50LWZvY3VzIix7Y2VsbDp0aGlzfSl9LmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fY2VsbENvbnRlbnRGb2N1c0hhbmRsZXIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyLCEwKX0sX29uQ2xpY2s6ZnVuY3Rpb24oYil7InZhYWRpbi1ncmlkLXNvcnRlciIhPT10aGlzLmxvY2FsTmFtZSYmdGhpcy5maXJlKCJjZWxsLWZvY3VzIix7Y2VsbDp0aGlzfSk7aWYodGhpcy5fY2VsbENsaWNrKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5sb2NhbFRhcmdldDsKZC5nZXREaXN0cmlidXRlZE5vZGVzJiYoZD1Qb2x5bWVyLmRvbShkKS5nZXREaXN0cmlidXRlZE5vZGVzKClbMF0pO3ZhciBmPVBvbHltZXIuZG9tKGIpLnBhdGg7Zj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmLDAsZi5pbmRleE9mKGQpKzEpO2QuY29udGFpbnModGhpcy50YXJnZXQmJnRoaXMudGFyZ2V0LnJvb3QuYWN0aXZlRWxlbWVudHx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl8fGYuc29tZSh0aGlzLl9pc0ZvY3VzYWJsZSl8fHRoaXMuX2NlbGxDbGljayhiKX19LF9pc0ZvY3VzYWJsZTpmdW5jdGlvbihiKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5wYXJlbnROb2RlO2Q9LTEhPT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGQpLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0YWJpbmRleF0sIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIG9iamVjdCwgaWZyYW1lLCBsYWJlbCwgYVtocmVmXSwgYXJlYVtocmVmXSIpLGIpO3JldHVybiFiLmRpc2FibGVkJiYKZH19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLWNlbGwuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj17cHJvcGVydGllczp7Y29sdW1uOk9iamVjdCxleHBhbmRlZDpCb29sZWFuLGZsZXhHcm93Ok51bWJlcixjb2xTcGFuOk51bWJlcixmb2N1c2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxmcm96ZW46e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGxhc3RGcm96ZW46e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGhpZGRlbjp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0saW5zdGFuY2U6T2JqZWN0LGluZGV4Ok51bWJlcixpdGVtOk9iamVjdCxzZWxlY3RlZDpCb29sZWFuLHRlbXBsYXRlOk9iamVjdCx0YXJnZXQ6T2JqZWN0LHdpZHRoOlN0cmluZyxvcmRlcjpOdW1iZXIscmVvcmRlclN0YXR1czp7dHlwZTpTdHJpbmcscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfY2hpbGRDb2x1bW5zOkFycmF5LF9jZWxsQ29udGVudDpPYmplY3QsX2luc2VydGlvblBvaW50Ok9iamVjdCwKX3RlbXBsYXRpemVyOk9iamVjdH0sb2JzZXJ2ZXJzOiJfY29sdW1uQ2hhbmdlZChjb2x1bW4pO19jZWxsQXR0YWNoZWQoY29sdW1uLCBpc0F0dGFjaGVkKTtfZXhwYW5kZWRDaGFuZ2VkKGV4cGFuZGVkLCBpbnN0YW5jZSk7X2ZsZXhHcm93Q2hhbmdlZChmbGV4R3Jvdyk7X2luZGV4Q2hhbmdlZChpbmRleCwgaW5zdGFuY2UpO19pdGVtQ2hhbmdlZChpdGVtLCBpbnN0YW5jZSk7X2luc3RhbmNlQ2hhbmdlZChpbnN0YW5jZSwgdGFyZ2V0KTtfc2VsZWN0ZWRDaGFuZ2VkKHNlbGVjdGVkLCBpbnN0YW5jZSk7X3RvZ2dsZUNvbnRlbnQoaXNBdHRhY2hlZCwgX2NlbGxDb250ZW50LCBfaW5zZXJ0aW9uUG9pbnQpO190b2dnbGVJbnN0YW5jZShpc0F0dGFjaGVkLCBfdGVtcGxhdGl6ZXIsIGluc3RhbmNlKTtfd2lkdGhDaGFuZ2VkKHdpZHRoKTtfb3JkZXJDaGFuZ2VkKG9yZGVyKTtfdmlzaWJsZUNoaWxkQ29sdW1uc0NoYW5nZWQoX3Zpc2libGVDaGlsZENvbHVtbnMpO19jaGlsZENvbHVtbnNDaGFuZ2VkKF9jaGlsZENvbHVtbnMpIi5zcGxpdCgiOyIpLApyZWFkeTpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQtY2VsbCIpOyExPT09UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cmJih0aGlzLmNsYXNzTGlzdC5hZGQoInN0eWxlLXNjb3BlIiksdGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZCIpKX0sX2NvbHVtbkNoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5mbGV4R3Jvdz1kLmZsZXhHcm93O3RoaXMuZnJvemVuPWQuZnJvemVuO3RoaXMubGFzdEZyb3plbj1kLl9sYXN0RnJvemVuO3RoaXMuaGVhZGVyVGVtcGxhdGU9ZC5oZWFkZXJUZW1wbGF0ZTt0aGlzLmZvb3RlclRlbXBsYXRlPWQuZm9vdGVyVGVtcGxhdGU7dGhpcy50ZW1wbGF0ZT1kLnRlbXBsYXRlO3RoaXMud2lkdGg9ZC53aWR0aDt0aGlzLmhpZGRlbj1kLmhpZGRlbjt0aGlzLnJlc2l6YWJsZT1kLnJlc2l6YWJsZTt0aGlzLl9jaGlsZENvbHVtbnM9ZC5fY2hpbGRDb2x1bW5zO3RoaXMub3JkZXI9ZC5fb3JkZXI7ZC5jb2xTcGFuJiYodGhpcy5jb2xTcGFuPQpkLmNvbFNwYW4pO3RoaXMubGlzdGVuKGQsInByb3BlcnR5LWNoYW5nZWQiLCJfY29sdW1uUHJvcENoYW5nZWQiKX0sX2NlbGxBdHRhY2hlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihmP3RoaXMubGlzdGVuKGQsInByb3BlcnR5LWNoYW5nZWQiLCJfY29sdW1uUHJvcENoYW5nZWQiKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkfHx0aGlzLnVubGlzdGVuKGQsInByb3BlcnR5LWNoYW5nZWQiLCJfY29sdW1uUHJvcENoYW5nZWQiKX0pKX0sX2NvbHVtblByb3BDaGFuZ2VkOmZ1bmN0aW9uKGQpe2QudGFyZ2V0PT10aGlzLmNvbHVtbiYmKHRoaXNbZC5kZXRhaWwucGF0aF09ZC5kZXRhaWwudmFsdWUpfSxfZXhwYW5kZWRDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGYuX19leHBhbmRlZF9fPWQsZi5leHBhbmRlZD1kKX0sX2ZsZXhHcm93Q2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLnN0eWxlLmZsZXhHcm93PQpkfSxfaW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGYuaW5kZXg9ZCl9LF9pdGVtQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihmLml0ZW09ZCl9LF9zZWxlY3RlZENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYoZi5fX3NlbGVjdGVkX189ZCxmLnNlbGVjdGVkPWQpfSxfY2hpbGRDb2x1bW5zQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLmNvbFNwYW49ZC5sZW5ndGh9LF90b2dnbGVDb250ZW50OmZ1bmN0aW9uKGQsZixoKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZ2b2lkIDAhPT1oJiYoZD8oUG9seW1lci5kb20oZikucGFyZW50Tm9kZSE9PXRoaXMudGFyZ2V0JiZQb2x5bWVyLmRvbSh0aGlzLnRhcmdldCkuYXBwZW5kQ2hpbGQoZiksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQoaCkpOnRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWR8fFBvbHltZXIuZG9tKGYpLnBhcmVudE5vZGUhPT0KdGhpcy50YXJnZXR8fFBvbHltZXIuZG9tKHRoaXMudGFyZ2V0KS5yZW1vdmVDaGlsZChmKX0pKX0sX3RvZ2dsZUluc3RhbmNlOmZ1bmN0aW9uKGQsZixoKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZ2b2lkIDAhPT1oJiYoZD9mLmFkZEluc3RhbmNlKGgpOmYucmVtb3ZlSW5zdGFuY2UoaCkpfSxfd2lkdGhDaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMuc3R5bGUud2lkdGg9ZH0sX29yZGVyQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLnN0eWxlLm9yZGVyPWR9LF90ZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5pbnN0YW5jZT1kLnRlbXBsYXRpemVyLmNyZWF0ZUluc3RhbmNlKCk7dGhpcy5fdGVtcGxhdGl6ZXI9ZC50ZW1wbGF0aXplcn0sX2luc3RhbmNlQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJih0aGlzLnN0eWxlLmhlaWdodD0iIix0aGlzLl9jZWxsQ29udGVudD10aGlzLl9jZWxsQ29udGVudHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtY2VsbC1jb250ZW50IiksCmQ9InZhYWRpbi1ncmlkLWNlbGwtY29udGVudC0iKyh2YWFkaW4uZWxlbWVudHMuZ3JpZC5fY29udGVudEluZGV4PXZhYWRpbi5lbGVtZW50cy5ncmlkLl9jb250ZW50SW5kZXgrMXx8MCksdGhpcy5fY2VsbENvbnRlbnQuaW5uZXJIVE1MPSIiLFBvbHltZXIuZG9tKHRoaXMuX2NlbGxDb250ZW50KS5hcHBlbmRDaGlsZCh0aGlzLmluc3RhbmNlLnJvb3QpLHRoaXMuX2NlbGxDb250ZW50LnNldEF0dHJpYnV0ZSgiaWQiLGQpLFBvbHltZXIuRWxlbWVudD8odGhpcy5fY2VsbENvbnRlbnQuc2V0QXR0cmlidXRlKCJzbG90IixkKSx0aGlzLl9pbnNlcnRpb25Qb2ludD10aGlzLl9pbnNlcnRpb25Qb2ludHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2xvdCIpLHRoaXMuX2luc2VydGlvblBvaW50LnNldEF0dHJpYnV0ZSgibmFtZSIsZCkpOih0aGlzLl9pbnNlcnRpb25Qb2ludD10aGlzLl9pbnNlcnRpb25Qb2ludHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY29udGVudCIpLHRoaXMuX2luc2VydGlvblBvaW50LnNldEF0dHJpYnV0ZSgic2VsZWN0IiwKIiMiK2QpKSl9fTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtY2VsbCIsYmVoYXZpb3JzOltiLHZhYWRpbi5lbGVtZW50cy5ncmlkLkNlbGxDbGlja0JlaGF2aW9yXSxvYnNlcnZlcnM6WyJfdGVtcGxhdGVDaGFuZ2VkKHRlbXBsYXRlKSJdLF9jZWxsQ2xpY2s6ZnVuY3Rpb24oZCl7ZC5kZWZhdWx0UHJldmVudGVkfHx0aGlzLmZpcmUoImNlbGwtYWN0aXZhdGUiLHttb2RlbDp0aGlzLmluc3RhbmNlfSl9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1jZWxsIixwcm9wZXJ0aWVzOntoZWFkZXJUZW1wbGF0ZTpPYmplY3QscmVzaXphYmxlOkJvb2xlYW4sY29sdW1uUmVzaXppbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3JdLG9ic2VydmVyczpbIl9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQoaGVhZGVyVGVtcGxhdGUpIiwiX2lzRW1wdHlDaGFuZ2VkKF9pc0VtcHR5LCBpc0F0dGFjaGVkKSIsCiJfcmVzaXphYmxlQ2hhbmdlZChyZXNpemFibGUpIl0sbGlzdGVuZXJzOnttb3VzZWRvd246Il9jYW5jZWxNb3VzZURvd25PblJlc2l6ZSIsbW91c2Vtb3ZlOiJfZW5hYmxlRHJhZyIsbW91c2VvdXQ6Il9kaXNhYmxlRHJhZyIsdG91Y2hzdGFydDoiX29uVG91Y2hTdGFydCIsdG91Y2htb3ZlOiJfb25Ub3VjaE1vdmUiLHRvdWNoZW5kOiJfb25Ub3VjaEVuZCIsY29udGV4dG1lbnU6Il9vbkNvbnRleHRNZW51In0sX29uQ29udGV4dE1lbnU6ZnVuY3Rpb24oZCl7dGhpcy5fcmVvcmRlckdob3N0JiZkLnByZXZlbnREZWZhdWx0KCl9LF9vblRvdWNoU3RhcnQ6ZnVuY3Rpb24oZCl7ZC50YXJnZXQhPT10aGlzLl9yZXNpemVIYW5kbGUmJnRoaXMudGFyZ2V0LmNvbHVtblJlb3JkZXJpbmdBbGxvd2VkJiYodGhpcy5fc3RhcnRSZW9yZGVyVGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX3N0YXJ0UmVvcmRlci5iaW5kKHRoaXMsZCksMTAwKSl9LF9zdGFydFJlb3JkZXI6ZnVuY3Rpb24oZCl7dGhpcy5fcmVvcmRlckdob3N0PQp0aGlzLl9nZXRHaG9zdCgpO3RoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIjt2YXIgZj1uZXcgQ3VzdG9tRXZlbnQoImRyYWdzdGFydCIse2J1YmJsZXM6ITB9KTt0aGlzLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KGYpO3RoaXMuX3Jlb3JkZXJYWT17eDpkLnRvdWNoZXNbMF0uY2xpZW50WC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQseTpkLnRvdWNoZXNbMF0uY2xpZW50WS10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH07dGhpcy5fdXBkYXRlR2hvc3RQb3NpdGlvbihkLnRvdWNoZXNbMF0uY2xpZW50WCxkLnRvdWNoZXNbMF0uY2xpZW50WSl9LF9vblRvdWNoTW92ZTpmdW5jdGlvbihkKXtpZih0aGlzLl9yZW9yZGVyR2hvc3Qpe2QucHJldmVudERlZmF1bHQoKTt2YXIgZj1uZXcgQ3VzdG9tRXZlbnQoImRyYWdvdmVyIix7YnViYmxlczohMH0pO2YuY2xpZW50WD1kLnRvdWNoZXNbMF0uY2xpZW50WDtmLmNsaWVudFk9CmQudG91Y2hlc1swXS5jbGllbnRZO3ZhciBoPXRoaXMuX2NvbnRlbnRGcm9tUG9pbnQoZi5jbGllbnRYLGYuY2xpZW50WSk7aCYmaC5kaXNwYXRjaEV2ZW50KGYpO3RoaXMuX3VwZGF0ZUdob3N0UG9zaXRpb24oZC50b3VjaGVzWzBdLmNsaWVudFgsZC50b3VjaGVzWzBdLmNsaWVudFkpfWVsc2UgY2xlYXJUaW1lb3V0KHRoaXMuX3N0YXJ0UmVvcmRlclRpbWVvdXQpfSxfdXBkYXRlR2hvc3RQb3NpdGlvbjpmdW5jdGlvbihkLGYpe2QtPXRoaXMuX3Jlb3JkZXJYWS54O2Y9Zi10aGlzLl9yZW9yZGVyWFkueS01MDt2YXIgaD1wYXJzZUludCh0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUubGVmdHx8MCksaz1wYXJzZUludCh0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudG9wfHwwKSx0PXRoaXMuX3Jlb3JkZXJHaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUubGVmdD1oLSh0LmxlZnQtZCkrInB4Ijt0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudG9wPQprLSh0LnRvcC1mKSsicHgifSxfb25Ub3VjaEVuZDpmdW5jdGlvbihkKXtjbGVhclRpbWVvdXQodGhpcy5fc3RhcnRSZW9yZGVyVGltZW91dCk7dGhpcy5fcmVvcmRlckdob3N0JiYoZC5wcmV2ZW50RGVmYXVsdCgpLGQ9bmV3IEN1c3RvbUV2ZW50KCJkcmFnZW5kIix7YnViYmxlczohMH0pLHRoaXMuZGlzcGF0Y2hFdmVudChkKSx0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIix0aGlzLl9yZW9yZGVyR2hvc3Q9bnVsbCl9LF9jb250ZW50RnJvbVBvaW50OmZ1bmN0aW9uKGQsZil7aWYoUG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpe3ZhciBoPXRoaXMudGFyZ2V0LiQuc2Nyb2xsZXI7aC50b2dnbGVBdHRyaWJ1dGUoIm5vLWNvbnRlbnQtcG9pbnRlci1ldmVudHMiLCEwKTtkPXRoaXMuZG9tSG9zdC5yb290LmVsZW1lbnRGcm9tUG9pbnQoZCxmKTtoLnRvZ2dsZUF0dHJpYnV0ZSgibm8tY29udGVudC1wb2ludGVyLWV2ZW50cyIsITEpO2lmKGQmJmQuZ2V0Q29udGVudENoaWxkcmVuKXJldHVybiBkLmdldENvbnRlbnRDaGlsZHJlbihQb2x5bWVyLkVsZW1lbnQ/CiJzbG90IjoiY29udGVudCIpWzBdfWVsc2UgcmV0dXJuIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZCxmKX0sX2dldEdob3N0OmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy50YXJnZXQuJC5zY3JvbGxlci4kLnJlb3JkZXJnaG9zdDtkLmlubmVyVGV4dD10aGlzLl9jZWxsQ29udGVudC5pbm5lclRleHQ7dmFyIGY9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fY2VsbENvbnRlbnQpOyJib3hTaXppbmcgZGlzcGxheSB3aWR0aCBoZWlnaHQgYmFja2dyb3VuZCBhbGlnbkl0ZW1zIHBhZGRpbmcgYm9yZGVyIGZsZXgtZGlyZWN0aW9uIG92ZXJmbG93Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oaCl7ZC5zdHlsZVtoXT1mW2hdfSx0aGlzKTtyZXR1cm4gZH0sX2VuYWJsZURyYWc6ZnVuY3Rpb24oKXt0aGlzLl9jZWxsQ29udGVudC5kcmFnZ2FibGU9dGhpcy50YXJnZXQuY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQmJiF3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKX0sX2Rpc2FibGVEcmFnOmZ1bmN0aW9uKCl7dGhpcy5fY2VsbENvbnRlbnQuZHJhZ2dhYmxlPQohMX0sX2NhbmNlbE1vdXNlRG93bk9uUmVzaXplOmZ1bmN0aW9uKGQpe2QudGFyZ2V0PT09dGhpcy5fcmVzaXplSGFuZGxlJiZkLnByZXZlbnREZWZhdWx0KCl9LF9yZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKGQpe2Q/KHRoaXMuX3Jlc2l6ZUhhbmRsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLl9yZXNpemVIYW5kbGUuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGUiKSx0aGlzLmxpc3Rlbih0aGlzLl9yZXNpemVIYW5kbGUsInRyYWNrIiwiX29uVHJhY2siKSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLl9yZXNpemVIYW5kbGUpKTp0aGlzLl9yZXNpemVIYW5kbGUmJih0aGlzLnVubGlzdGVuKHRoaXMuX3Jlc2l6ZUhhbmRsZSwidHJhY2siLCJfb25UcmFjayIpLFBvbHltZXIuZG9tKHRoaXMpLnJlbW92ZUNoaWxkKHRoaXMuX3Jlc2l6ZUhhbmRsZSkpfSxfb25UcmFjazpmdW5jdGlvbihkKXt0aGlzLmNvbHVtblJlc2l6aW5nPQohMDt2YXIgZj10aGlzLmNvbHVtbjsidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWYubG9jYWxOYW1lJiYoZj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmLl9jaGlsZENvbHVtbnMsMCkuc29ydChmdW5jdGlvbih0LGwpe3JldHVybiB0Ll9vcmRlci1sLl9vcmRlcn0pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hdC5oaWRkZW59KS5wb3AoKSk7dmFyIGg9dGhpcy5fZ2V0SGVhZGVyQ2VsbEJ5Q29sdW1uKGYpO2lmKGgub2Zmc2V0V2lkdGgpe3ZhciBrPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGguX2NlbGxDb250ZW50KTtmLndpZHRoPU1hdGgubWF4KDEwK3BhcnNlSW50KGsucGFkZGluZ0xlZnQpK3BhcnNlSW50KGsucGFkZGluZ1JpZ2h0KSxoLm9mZnNldFdpZHRoK2QuZGV0YWlsLngtaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkrInB4IjtmLmZsZXhHcm93PTB9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3c6bGFzdC1jaGlsZCAudmFhZGluLWdyaWQtY2VsbCIpKS5zb3J0KGZ1bmN0aW9uKHQsCmwpe3JldHVybiB0LmNvbHVtbi5fb3JkZXItbC5jb2x1bW4uX29yZGVyfSkuZm9yRWFjaChmdW5jdGlvbih0LGwscCl7bDxwLmluZGV4T2YoaCkmJih0LmNvbHVtbi53aWR0aD10Lm9mZnNldFdpZHRoKyJweCIsdC5jb2x1bW4uZmxleEdyb3c9MCl9KTt0aGlzLmNvbHVtblJlc2l6aW5nJiYiZW5kIj09PWQuZGV0YWlsLnN0YXRlJiYodGhpcy5jb2x1bW5SZXNpemluZz0hMSk7dGhpcy5maXJlKCJjb2x1bW4tcmVzaXppbmciKX0sX2dldEhlYWRlckNlbGxCeUNvbHVtbjpmdW5jdGlvbihkKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKFBvbHltZXIuZG9tKHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwiKSxmdW5jdGlvbihmKXtyZXR1cm4gZi5jb2x1bW49PT1kfSlbMF19LF9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7dm9pZCAwIT09CmQmJihudWxsPT09ZHx8IXRoaXMuX2lzQ29sdW1uUm93JiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiE9PXRoaXMuY29sdW1uLmxvY2FsTmFtZT8odGhpcy5pbnN0YW5jZT17cm9vdDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX0sdGhpcy5faXNFbXB0eT0hMCk6KHRoaXMuaW5zdGFuY2U9ZC50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpLHRoaXMuX3RlbXBsYXRpemVyPWQudGVtcGxhdGl6ZXIsdGhpcy5faXNFbXB0eT0hMSkpfSxfaXNFbXB0eUNoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtmJiZ0aGlzLmZpcmUoImNlbGwtZW1wdHktY2hhbmdlZCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItY2VsbCIscHJvcGVydGllczp7Zm9vdGVyVGVtcGxhdGU6T2JqZWN0fSxiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3JdLG9ic2VydmVyczpbIl9mb290ZXJUZW1wbGF0ZUNoYW5nZWQoZm9vdGVyVGVtcGxhdGUpIiwKIl9pc0VtcHR5Q2hhbmdlZChfaXNFbXB0eSwgaXNBdHRhY2hlZCkiXSxfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGQpe3ZvaWQgMCE9PWQmJihudWxsPT09ZHx8IXRoaXMuX2lzQ29sdW1uUm93JiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiE9PXRoaXMuY29sdW1uLmxvY2FsTmFtZT8odGhpcy5pbnN0YW5jZT17cm9vdDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX0sdGhpcy5faXNFbXB0eT0hMCk6KHRoaXMuaW5zdGFuY2U9ZC50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpLHRoaXMuX3RlbXBsYXRpemVyPWQudGVtcGxhdGl6ZXIsdGhpcy5faXNFbXB0eT0hMSkpfSxfaXNFbXB0eUNoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtmJiZ0aGlzLmZpcmUoImNlbGwtZW1wdHktY2hhbmdlZCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC1zaXplci1jZWxsIixiZWhhdmlvcnM6W2JdfSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXNpemVyLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXNpemVyIixwcm9wZXJ0aWVzOntjb2x1bW5UcmVlOkFycmF5LHRvcDpOdW1iZXIsX2NvbHVtbnM6QXJyYXl9LG9ic2VydmVyczpbIl9jb2x1bW5UcmVlQ2hhbmdlZChjb2x1bW5UcmVlKSIsIl90b3BDaGFuZ2VkKHRvcCkiXSxfY29sdW1uVHJlZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fY29sdW1ucz1iW2IubGVuZ3RoLTFdfSxfdG9wQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnN0eWxlLnRvcD1iKyJweCJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIiLHByb3BlcnRpZXM6e3Njcm9sbFRhcmdldDp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9zY3JvbGxUYXJnZXRDaGFuZ2VkIn0scGFzc3Rocm91Z2g6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITB9fSxsaXN0ZW5lcnM6e3Njcm9sbDoiX3N5bmNTY3JvbGxUYXJnZXQifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMubGlzdGVuKHRoaXMuZG9tSG9zdCwibW91c2Vtb3ZlIiwiX29uTW91c2VNb3ZlIik7dGhpcy5zdHlsZS53ZWJraXRPdmVyZmxvd1Njcm9sbGluZz0idG91Y2gifSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5kb21Ib3N0LCJtb3VzZW1vdmUiLCJfb25Nb3VzZU1vdmUiKX0sX3Njcm9sbFRhcmdldENoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiZ0aGlzLnVubGlzdGVuKGQsInNjcm9sbCIsIl9zeW5jT3V0ZXJTY3JvbGxlciIpO3RoaXMubGlzdGVuKGIsCiJzY3JvbGwiLCJfc3luY091dGVyU2Nyb2xsZXIiKX0sX29uTW91c2VNb3ZlOmZ1bmN0aW9uKGIpe3RoaXMucGFzc3Rocm91Z2g9Yi5vZmZzZXRZPD10aGlzLmNsaWVudEhlaWdodCYmYi5vZmZzZXRYPD10aGlzLmNsaWVudFdpZHRofSxfc3luY091dGVyU2Nyb2xsZXI6ZnVuY3Rpb24oKXt0aGlzLl9zeW5jaW5nU2Nyb2xsVGFyZ2V0fHwodGhpcy5fc3luY2luZ091dGVyU2Nyb2xsZXI9ITAsdGhpcy5zY3JvbGxUb3A9dGhpcy5kb21Ib3N0Ll9zY3JvbGxUb3AsdGhpcy5zY3JvbGxMZWZ0PXRoaXMuZG9tSG9zdC5fc2Nyb2xsTGVmdCk7dGhpcy5fc3luY2luZ1Njcm9sbFRhcmdldD0hMX0sX3N5bmNTY3JvbGxUYXJnZXQ6ZnVuY3Rpb24oKXt0aGlzLl9zeW5jaW5nT3V0ZXJTY3JvbGxlcnx8KHRoaXMuX3N5bmNpbmdTY3JvbGxUYXJnZXQ9ITAsdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9dGhpcy5zY3JvbGxMZWZ0LAp0aGlzLmRvbUhvc3QuX3Njcm9sbEhhbmRsZXIoKSk7dGhpcy5fc3luY2luZ091dGVyU2Nyb2xsZXI9ITF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZm9jdXNhYmxlLWNlbGwtY29udGFpbmVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcj17cHJvcGVydGllczp7Zm9jdXNlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2ZvY3VzZWRSb3c6T2JqZWN0LF9mb2N1c2VkUm93SW5kZXg6TnVtYmVyLF9mb2N1c2VkQ2VsbDpPYmplY3QsX2ZvY3VzZWRDZWxsSW5kZXg6TnVtYmVyLF9sYXN0Rm9jdXNlZENlbGw6T2JqZWN0fSxvYnNlcnZlcnM6WyJfYW5ub3VuY2VGb2N1c2VkQ2VsbChfZm9jdXNlZENlbGwsIGZvY3VzZWQpIiwiX2Rpc3BhdGNoRXZlbnRzKF9mb2N1c2VkQ2VsbCwgZm9jdXNlZCkiLCJfZm9jdXNlZENlbGxDaGFuZ2VkKF9mb2N1c2VkUm93SW5kZXgsIF9mb2N1c2VkQ2VsbEluZGV4KSJdLF9hbm5vdW5jZUZvY3VzZWRDZWxsOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmdGhpcy5kb21Ib3N0Lm5hdmlnYXRpbmcmJmQmJihkPVBvbHltZXIuRWxlbWVudD9iLl9jZWxsQ29udGVudC5nZXRBdHRyaWJ1dGUoInNsb3QiKToKYi5fY2VsbENvbnRlbnQuaWQsInZhYWRpbi1ncmlkLXRhYmxlLWJvZHkiIT09dGhpcy5pc3x8Yi5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIil8fChiPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oYi5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLGIpLGQ9dGhpcy5kb21Ib3N0LiQuaGVhZGVyLmxhc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW5bYl0uX2NlbGxDb250ZW50LmlkKyIgIitkKSx0aGlzLmRvbUhvc3QuJC5mb290ZXJGb2N1c1RyYXAuYWN0aXZlVGFyZ2V0PWQpfSxfZGlzcGF0Y2hFdmVudHM6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5fbGFzdEZvY3VzZWRDZWxsJiYodGhpcy5fbGFzdEZvY3VzZWRDZWxsLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1mb2N1c291dCIpKSx0aGlzLl9sYXN0Rm9jdXNlZENlbGw9dm9pZCAwKSwKZCYmKGIuX2NlbGxDb250ZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWZvY3VzaW4iKSksdGhpcy5fbGFzdEZvY3VzZWRDZWxsPWIpKX0sX2ZvY3VzZWRDZWxsQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3ZvaWQgMCE9PWImJnZvaWQgMCE9PWQmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcykuY2hpbGRyZW4sZnVuY3Rpb24oZixoKXtmLmZvY3VzZWQ9aD09PWI7Zi5mb2N1c2VkJiYodGhpcy5fZm9jdXNlZFJvdz1mLHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9TWF0aC5taW4oZCxmLmNoaWxkcmVuLmxlbmd0aC0xKSx0aGlzLl9mb2N1c2VkQ2VsbD1mLmNoaWxkcmVuW3RoaXMuX2ZvY3VzZWRDZWxsSW5kZXhdKTtmLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oayx0KXtrLmZvY3VzZWQ9dD09PXRoaXMuX2ZvY3VzZWRDZWxsSW5kZXh9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX0sZm9jdXNMZWZ0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGI9CnRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbTWF0aC5tYXgoMCxiLmluZGV4T2YodGhpcy5fZm9jdXNlZENlbGxJbmRleCktMSldKX19LGZvY3VzRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1pbih0aGlzLl9mb2N1c2VkUm93SW5kZXgrMSx0aGlzLmNoaWxkcmVuLmxlbmd0aC0xKX0sX3Zpc2libGVDZWxsSW5kZXhlczpmdW5jdGlvbigpe3ZhciBiPVtdO2lmKHRoaXMuX2ZvY3VzZWRSb3cmJnRoaXMuX2ZvY3VzZWRSb3cuY2hpbGRyZW4pe2Zvcih2YXIgZD10aGlzLl9mb2N1c2VkUm93LmNoaWxkcmVuLGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLmhpZGRlbnx8ZFtmXT09PXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfHxiLnB1c2goZik7Yi5zb3J0KGZ1bmN0aW9uKGgsayl7cmV0dXJuIGRbaF0uY29sdW1uLl9vcmRlcjxkW2tdLmNvbHVtbi5fb3JkZXI/LTE6MX0pfXJldHVybiBifSwKZm9jdXNQYWdlRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1pbih0aGlzLl9mb2N1c2VkUm93SW5kZXgrMTAsdGhpcy5jaGlsZHJlbi5sZW5ndGgtMSl9LGZvY3VzUGFnZVVwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEwKX0sZm9jdXNSaWdodDpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPXRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbTWF0aC5taW4oYi5pbmRleE9mKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpKzEsYi5sZW5ndGgtMSldKX19LGZvY3VzVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMSl9LGZvY3VzSG9tZTpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPQp0aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGIubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1iWzBdKX19LGZvY3VzRW5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGI9dGhpcy5fdmlzaWJsZUNlbGxJbmRleGVzKCk7MDxiLmxlbmd0aCYmKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9YltiLmxlbmd0aC0xXSl9fSxmb2N1c0ZpcnN0OmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PTA7dGhpcy5mb2N1c0hvbWUoKX0sZm9jdXNMYXN0OmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PXRoaXMuY2hpbGRyZW4ubGVuZ3RoLTE7dGhpcy5mb2N1c0VuZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWZvb3Rlci5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtwcm9wZXJ0aWVzOntjb2x1bW5UcmVlOkFycmF5LHRhcmdldDpPYmplY3QsX3Jvd3M6QXJyYXl9LG9ic2VydmVyczpbIl9jb2x1bW5UcmVlQ2hhbmdlZChjb2x1bW5UcmVlLCB0YXJnZXQpIiwiX3Jvd3NDaGFuZ2VkKF9yb3dzKSJdLF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihkLGYpe2lmKHZvaWQgMCE9PWQmJnZvaWQgMCE9PWYpe3RoaXMuX3Jvd3MmJnRoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihsKXtQb2x5bWVyLmRvbShsKS5pbm5lckhUTUw9IiJ9KTtmb3IodmFyIGg9W10saz0wO2s8ZC5sZW5ndGg7aysrKXt2YXIgdD10aGlzLl9jcmVhdGVSb3coKTt0LnRhcmdldD1mO3QuX2lzQ29sdW1uUm93PWs9PWQubGVuZ3RoLTE7dC5jb2x1bW5zPWRba107aC5wdXNoKHQpfXRoaXMuX3Jvd3M9InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciI9PT10aGlzLmxvY2FsTmFtZT9oOmgucmV2ZXJzZSgpfX0sX3Jvd3NDaGFuZ2VkOmZ1bmN0aW9uKGQpe1BvbHltZXIuZG9tKHRoaXMpLmlubmVySFRNTD0KIiI7ZC5mb3JFYWNoKGZ1bmN0aW9uKGYpe1BvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGYpfS5iaW5kKHRoaXMpKX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIiLGJlaGF2aW9yczpbYix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3JdLF9jcmVhdGVSb3c6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IixiZWhhdmlvcnM6W3ZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2Fubm91bmNlRm9jdXNlZFJvdyhfZm9jdXNlZFJvdykiXSxfYW5ub3VuY2VGb2N1c2VkUm93OmZ1bmN0aW9uKGQpe3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6IlJvdyAiKyhkLmluZGV4KzEpKyIgb2YgIisKdGhpcy5kb21Ib3N0LnNpemV9KX0sX21vdmVGb2N1c1RvRGV0YWlsc0NlbGw6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkQ2VsbC5mb2N1c2VkPSExO3RoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsLmZvY3VzZWQ9ITA7dGhpcy5fZm9jdXNlZENlbGw9dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx9LF9mb2N1c2VkUm93SGFzRGV0YWlsc0NlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZm9jdXNlZFJvdyYmdGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGwmJnRoaXMuX2ZvY3VzZWRDZWxsIT09dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx9LGZvY3VzRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dIYXNEZXRhaWxzQ2VsbCgpP3RoaXMuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKTp0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5taW4odGhpcy5fZm9jdXNlZFJvd0luZGV4KzEsdGhpcy5kb21Ib3N0LnNpemUtMSl9LGZvY3VzVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93JiYKdGhpcy5fZm9jdXNlZENlbGw9PT10aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbD90aGlzLl9mb2N1c2VkQ2VsbENoYW5nZWQodGhpcy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpOih0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMSksdGhpcy5fZm9jdXNlZFJvd0hhc0RldGFpbHNDZWxsKCkmJnRoaXMuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKSl9LGZvY3VzTGFzdDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD10aGlzLmRvbUhvc3Quc2l6ZS0xO3RoaXMuZm9jdXNFbmQoKX0sX2ZvY3VzZWRDZWxsQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcykuY2hpbGRyZW4sZnVuY3Rpb24oaCl7aC5mb2N1c2VkPWguaW5kZXg9PT1kO2guaW5kZXg9PT1kJiYodGhpcy5fZm9jdXNlZFJvdz0KaCx0aGlzLl9mb2N1c2VkQ2VsbD1oLmNoaWxkcmVuW2ZdKTtoLml0ZXJhdGVDZWxscyhmdW5jdGlvbihrLHQpe2suZm9jdXNlZD10PT09Zn0pfS5iaW5kKHRoaXMpKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIixiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRm9jdXNhYmxlQ2VsbENvbnRhaW5lckJlaGF2aW9yXSxfY3JlYXRlUm93OmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1yb3ciKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIixob3N0QXR0cmlidXRlczp7cm9sZToiZ3JpZGNlbGwifSxwcm9wZXJ0aWVzOnthY3RpdmVUYXJnZXQ6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfYWN0aXZlVGFyZ2V0Q2hhbmdlZCJ9fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3ByaW1hcnk9UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yKCIucHJpbWFyeSIpO3RoaXMuX3NlY29uZGFyeT1Qb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoIi5zZWNvbmRhcnkiKTtpZihQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvd3x8UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQodGhpcy5fc2Vjb25kYXJ5KSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLl9wcmltYXJ5KX0sZm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkIT09dGhpcy5fcHJpbWFyeT90aGlzLl9wcmltYXJ5LmZvY3VzKCk6CnRoaXMuX3NlY29uZGFyeS5mb2N1cygpfSxfb25CYWl0Rm9jdXM6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNlZD1iLnRhcmdldDt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHl8fCh0aGlzLmZpcmUoImZvY3VzLWdhaW5lZCIpLHRoaXMuX3ByaW1hcnkudGFiSW5kZXg9LTEpfSxfb25CYWl0Qmx1cjpmdW5jdGlvbigpe3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseXx8KHRoaXMuZmlyZSgiZm9jdXMtbG9zdCIpLHRoaXMuX3ByaW1hcnkudGFiSW5kZXg9MCl9LF9hY3RpdmVUYXJnZXRDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMDt0aGlzLl9mb2N1c2VkPT09dGhpcy5fcHJpbWFyeT8odGhpcy5fc2Vjb25kYXJ5LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixiKSx0aGlzLl9zZWNvbmRhcnkuZm9jdXMoKSk6KHRoaXMuX3ByaW1hcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLGIpLHRoaXMuX3ByaW1hcnkuZm9jdXMoKSk7CnRoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMX0sX3JlYW5ub3VuY2U6ZnVuY3Rpb24oKXt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITA7dGhpcy5fZm9jdXNlZD09PXRoaXMuX3ByaW1hcnk/KHRoaXMuX3NlY29uZGFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdGhpcy5hY3RpdmVUYXJnZXQpLHRoaXMuX3NlY29uZGFyeS5mb2N1cygpKToodGhpcy5fcHJpbWFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdGhpcy5hY3RpdmVUYXJnZXQpLHRoaXMuX3ByaW1hcnkuZm9jdXMoKSk7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5PSExfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLXJvdy5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtwcm9wZXJ0aWVzOnthY3RpdmU6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LGNvbHVtbnM6QXJyYXksaW5kZXg6TnVtYmVyLGNlbGxzOnt2YWx1ZTpbXX0sdGFyZ2V0Ok9iamVjdCxleHBhbmRlZDp7dmFsdWU6ITF9LGZvY3VzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGl0ZW06T2JqZWN0LHNlbGVjdGVkOntyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9yb3dEZXRhaWxzQ2VsbDpPYmplY3Qscm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdH0sb2JzZXJ2ZXJzOiJfY29sdW1uc0NoYW5nZWQoY29sdW1ucywgdGFyZ2V0KTtfaW5kZXhDaGFuZ2VkKGluZGV4LCBjZWxscyk7X2l0ZW1DaGFuZ2VkKGl0ZW0sIGNlbGxzKTtfaXRlbUNoYW5nZWRGb3JEZXRhaWxzKGl0ZW0sIF9yb3dEZXRhaWxzQ2VsbCk7X3Jvd0RldGFpbHNDaGFuZ2VkKGV4cGFuZGVkLCByb3dEZXRhaWxzVGVtcGxhdGUsIHRhcmdldCk7X3Jvd0RldGFpbHNDZWxsSW5kZXhDaGFuZ2VkKF9yb3dEZXRhaWxzQ2VsbCwgaW5kZXgpO19yb3dEZXRhaWxzQ2VsbENoYW5nZWQoX3Jvd0RldGFpbHNDZWxsLCB0YXJnZXQpO19zZWxlY3RlZENoYW5nZWQoc2VsZWN0ZWQsIGNlbGxzKTtfc2VsZWN0ZWRDaGFuZ2VkRm9yRGV0YWlscyhzZWxlY3RlZCwgX3Jvd0RldGFpbHNDZWxsKSIuc3BsaXQoIjsiKSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkLXJvdyIpOyExPT09UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cmJih0aGlzLmNsYXNzTGlzdC5hZGQoInN0eWxlLXNjb3BlIiksdGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZCIpKX0saXRlcmF0ZUNlbGxzOmZ1bmN0aW9uKGQpe3RoaXMuY2VsbHMuZm9yRWFjaChkKTt0aGlzLl9yb3dEZXRhaWxzQ2VsbCYmZCh0aGlzLl9yb3dEZXRhaWxzQ2VsbCl9LF9yb3dEZXRhaWxzQ2hhbmdlZDpmdW5jdGlvbihkLGYsaCl7aWYodm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmdm9pZCAwIT09aCl7aWYoZCl7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtY2VsbCIpO2suc2V0QXR0cmlidXRlKCJkZXRhaWxzY2VsbCIsITApO2suZnJvemVuPSEwO2sudGFyZ2V0PWg7ay50ZW1wbGF0ZT1mO2sudG9nZ2xlQXR0cmlidXRlKCJsYXN0Y29sdW1uIiwhMCk7UG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZChrKTsKUG9seW1lci5kb20uZmx1c2goKTt0aGlzLl9yb3dEZXRhaWxzQ2VsbD1rfWVsc2UgdGhpcy5fcm93RGV0YWlsc0NlbGwmJihQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnJlbW92ZUNoaWxkKHRoaXMuX3Jvd0RldGFpbHNDZWxsKSx0aGlzLl9yb3dEZXRhaWxzQ2VsbD1udWxsKTt0aGlzLml0ZXJhdGVDZWxscyhmdW5jdGlvbih0KXt0LmV4cGFuZGVkPWR9KTt0aGlzLnRhcmdldC4kLnNjcm9sbGVyLl9mcm96ZW5DZWxsc0NoYW5nZWQoKX19LF91cGRhdGVSb3dWaXNpYmlsaXR5OmZ1bmN0aW9uKCl7dGhpcy5oaWRkZW49dGhpcy5jZWxscy5ldmVyeShmdW5jdGlvbihkKXtyZXR1cm4gZC5faXNFbXB0eX0pfSxfcm93RGV0YWlsc0NlbGxDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZi4kLnNjcm9sbGVyLl91cGRhdGUoKX0sX3Jvd0RldGFpbHNDZWxsSW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGQ/KGQuaW5kZXg9CmYsUG9seW1lci5kb20uZmx1c2goKSx0aGlzLnVwZGF0ZVJvd0RldGFpbHNDZWxsTWV0cmljcygpKTp0aGlzLnN0eWxlLnBhZGRpbmdCb3R0b209IiIpfSx1cGRhdGVSb3dEZXRhaWxzQ2VsbE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9yb3dEZXRhaWxzQ2VsbCYmKHRoaXMudGFyZ2V0JiZ0aGlzLnRhcmdldC5fb2JzZXJ2ZXImJnRoaXMudGFyZ2V0Ll9vYnNlcnZlci5mbHVzaCYmdGhpcy50YXJnZXQuX29ic2VydmVyLmZsdXNoKCksdGhpcy5fcm93RGV0YWlsc0NlbGwuc3R5bGUuaGVpZ2h0PSIiLHRoaXMuc3R5bGUucGFkZGluZ0JvdHRvbT10aGlzLl9yb3dEZXRhaWxzQ2VsbC5zdHlsZS5oZWlnaHQ9dGhpcy5fcm93RGV0YWlsc0NlbGwuY2xpZW50SGVpZ2h0KyJweCIpfSxfY29sdW1uc0NoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtpZih2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mKXtQb2x5bWVyLmRvbSh0aGlzKS5pbm5lckhUTUw9IiI7dmFyIGg9W107ZC5mb3JFYWNoKGZ1bmN0aW9uKGspe3ZhciB0PQoiXyIrdGhpcy5pcy5yZXBsYWNlKC8tL2csIl8iKSsiX2NlbGxzIjt0PWtbdF09a1t0XXx8W107dmFyIGw9dC5maWx0ZXIoZnVuY3Rpb24obSl7cmV0dXJuIVBvbHltZXIuZG9tKG0pLnBhcmVudE5vZGV9KVswXTtpZighbCl7bD10aGlzLl9jcmVhdGVDZWxsKCk7dmFyIHA9QXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbCh0aGlzLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJkb20tcmVwZWF0IiksZnVuY3Rpb24obSl7cmV0dXJuIW0ucmVzdGFtcH0pOyhwPXB8fCJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItcm93Ij09PXRoaXMuaXN8fCJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93Ij09PXRoaXMuaXMpfHx0LnB1c2gobCl9bC5pbmRleD10aGlzLmluZGV4O2wudGFyZ2V0PXRoaXMudGFyZ2V0O2wuX2lzQ29sdW1uUm93PXRoaXMuX2lzQ29sdW1uUm93O2wuY29sdW1uPWs7bC5leHBhbmRlZD10aGlzLmV4cGFuZGVkO1BvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGwpO2gucHVzaChsKX0uYmluZCh0aGlzKSk7CnRoaXMuY2VsbHM9aH19LF9pbmRleENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmLmZvckVhY2goZnVuY3Rpb24oaCl7aC5pbmRleD1kfSl9LF9pdGVtQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYuZm9yRWFjaChmdW5jdGlvbihoKXtoLml0ZW09ZH0pfSxfaXRlbUNoYW5nZWRGb3JEZXRhaWxzOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZiYmKGYuaXRlbT1kKX0sX3NlbGVjdGVkQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYuZm9yRWFjaChmdW5jdGlvbihoKXtoLnNlbGVjdGVkPWR9KX0sX3NlbGVjdGVkQ2hhbmdlZEZvckRldGFpbHM6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmJiYoZi5zZWxlY3RlZD1kKX0sdXBkYXRlTGFzdENvbHVtbjpmdW5jdGlvbigpe3RoaXMuY2VsbHMuc2xpY2UoMCkuc29ydChmdW5jdGlvbihkLApmKXtyZXR1cm4gZC5jb2x1bW4uX29yZGVyLWYuY29sdW1uLl9vcmRlcn0pLmZvckVhY2goZnVuY3Rpb24oZCxmLGgpe2QudG9nZ2xlQXR0cmlidXRlKCJsYXN0Y29sdW1uIixmPT09aC5sZW5ndGgtMSl9KX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1yb3ciLGJlaGF2aW9yczpbYl0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtY2VsbCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItcm93IixiZWhhdmlvcnM6W2JdLG9ic2VydmVyczpbIl91cGRhdGVSb3dWaXNpYmlsaXR5KGNvbHVtbnMpIl0sbGlzdGVuZXJzOnsiY2VsbC1lbXB0eS1jaGFuZ2VkIjoiX3VwZGF0ZVJvd1Zpc2liaWxpdHkifSxfY3JlYXRlQ2VsbDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItY2VsbCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93IiwKYmVoYXZpb3JzOltiXSxvYnNlcnZlcnM6WyJfdXBkYXRlUm93VmlzaWJpbGl0eShjb2x1bW5zKSJdLGxpc3RlbmVyczp7ImNlbGwtZW1wdHktY2hhbmdlZCI6Il91cGRhdGVSb3dWaXNpYmlsaXR5In0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLWNlbGwiKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcj1mdW5jdGlvbigpe307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyPVBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10ZW1wbGF0aXplciIsYmVoYXZpb3JzOltQb2x5bWVyLlRlbXBsYXRpemVyXSxwcm9wZXJ0aWVzOntkYXRhSG9zdDpPYmplY3QsdGVtcGxhdGU6T2JqZWN0LF90ZW1wbGF0ZUluc3RhbmNlczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3BhcmVudFBhdGhWYWx1ZXM6e3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3RlbXBsYXRlSW5zdGFuY2VzQ2hhbmdlZChfdGVtcGxhdGVJbnN0YW5jZXMuKiwgX3BhcmVudFBhdGhWYWx1ZXMuKikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50TW9kZWw9ITA7dGhpcy5faW5zdGFuY2VQcm9wcz17ZXhwYW5kZWQ6ITAsaW5kZXg6ITAsaXRlbTohMCxzZWxlY3RlZDohMH19LGNyZWF0ZUluc3RhbmNlOmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTt2YXIgYj10aGlzLnN0YW1wKHt9KTsKdGhpcy5hZGRJbnN0YW5jZShiKTtyZXR1cm4gYn0sYWRkSW5zdGFuY2U6ZnVuY3Rpb24oYil7LTE9PT10aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5pbmRleE9mKGIpJiZ0aGlzLnB1c2goIl90ZW1wbGF0ZUluc3RhbmNlcyIsYil9LHJlbW92ZUluc3RhbmNlOmZ1bmN0aW9uKGIpe3RoaXMuc3BsaWNlKCJfdGVtcGxhdGVJbnN0YW5jZXMiLHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmluZGV4T2YoYiksMSl9LF9lbnN1cmVUZW1wbGF0aXplZDpmdW5jdGlvbigpe3RoaXMudGVtcGxhdGUuX3RlbXBsYXRpemVkfHwodGhpcy50ZW1wbGF0ZS5fdGVtcGxhdGl6ZWQ9ITAsdGhpcy50ZW1wbGF0aXplKHRoaXMudGVtcGxhdGUpLHRoaXMuX3BhcmVudFByb3BzPXRoaXMuX3BhcmVudFByb3BzfHx7fSxQb2x5bWVyLkVsZW1lbnR8fE9iamVjdC5rZXlzKHRoaXMuX3BhcmVudFByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uKCl7fSx0aGlzKSl9LF9mb3J3YXJkSW5zdGFuY2VQcm9wOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT0KYlsiX18iK2QrIl9fIl0mJmJbIl9fIitkKyJfXyJdIT09ZiYmdGhpcy5maXJlKCJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIix7cHJvcDpkLHZhbHVlOmYsaW5zdDpifSl9LF9mb3J3YXJkSW5zdGFuY2VQYXRoOmZ1bmN0aW9uKGIsZCxmKXswIT09ZC5pbmRleE9mKCJpdGVtLiIpfHx0aGlzLl9zdXBwcmVzc0l0ZW1DaGFuZ2VFdmVudHx8dGhpcy5maXJlKCJpdGVtLWNoYW5nZWQiLHtpdGVtOmIuaXRlbSxwYXRoOmQuc3Vic3RyaW5nKDUpLHZhbHVlOmZ9KX0sX25vdGlmeUluc3RhbmNlUHJvcFYyOmZ1bmN0aW9uKGIsZCxmKXt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQcm9wKGIsZCxmKTt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQYXRoKGIsZCxmKX0sX2ZvcndhcmRQYXJlbnRQcm9wOmZ1bmN0aW9uKGIsZCl7dGhpcy5fcGFyZW50UGF0aFZhbHVlc1tiXT1kO3RoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oZil7Zi5zZXQoYixkKX0sdGhpcyl9LF9mb3J3YXJkUGFyZW50UGF0aDpmdW5jdGlvbihiLApkKXt0aGlzLnNldChbIl9wYXJlbnRQYXRoVmFsdWVzIixiXSxkKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Yubm90aWZ5UGF0aChiLGQpfSx0aGlzKX0sX2ZvcndhcmRIb3N0UHJvcFYyOmZ1bmN0aW9uKGIsZCl7dGhpcy5fZm9yd2FyZFBhcmVudFByb3AoYixkKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcyYmdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihmKXtmLm5vdGlmeVBhdGgoYixkKX0sdGhpcyl9LF90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQ6ZnVuY3Rpb24oYil7aWYoIl90ZW1wbGF0ZUluc3RhbmNlcyI9PT1iLnBhdGgpe3ZhciBkPTA7dmFyIGY9dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMubGVuZ3RofWVsc2UgaWYoIl90ZW1wbGF0ZUluc3RhbmNlcy5zcGxpY2VzIj09PWIucGF0aClkPWIudmFsdWUuaW5kZXgsZj1iLnZhbHVlLmFkZGVkQ291bnQ7ZWxzZSByZXR1cm47T2JqZWN0LmtleXModGhpcy5fcGFyZW50UGF0aFZhbHVlc3x8Cnt9KS5mb3JFYWNoKGZ1bmN0aW9uKGgpe2Zvcih2YXIgaz1kO2s8ZCtmO2srKyl0aGlzLl90ZW1wbGF0ZUluc3RhbmNlc1trXS5zZXQoaCx0aGlzLl9wYXJlbnRQYXRoVmFsdWVzW2hdKX0sdGhpcyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtcm93LWRldGFpbHMtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuUm93RGV0YWlsc0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntleHBhbmRlZEl0ZW1zOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsidGVtcGxhdGUtaW5zdGFuY2UtY2hhbmdlZCI6Il90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZEV4cGFuZGVkIn0sb2JzZXJ2ZXJzOlsiX2V4cGFuZGVkSXRlbXNDaGFuZ2VkKGV4cGFuZGVkSXRlbXMuKiwgZGF0YVByb3ZpZGVyKSIsIl9yb3dEZXRhaWxzVGVtcGxhdGVDaGFuZ2VkKF9yb3dEZXRhaWxzVGVtcGxhdGUpIl0sX2V4cGFuZGVkSXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmKHRoaXMuX2ZsdXNoSXRlbXNEZWJvdW5jZXIoKSx0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMmJnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuZXhwYW5kZWQ9dGhpcy5faXNFeHBhbmRlZChmLml0ZW0pfS5iaW5kKHRoaXMpKSl9LApfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihiKXt2YXIgZD1uZXcgdmFhZGluLmVsZW1lbnRzLmdyaWQuVGVtcGxhdGl6ZXI7ZC5kYXRhSG9zdD10aGlzLmRhdGFIb3N0O2QuX2luc3RhbmNlUHJvcHM9e2V4cGFuZGVkOiEwLGluZGV4OiEwLGl0ZW06ITAsc2VsZWN0ZWQ6ITB9O1BvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoZCk7ZC50ZW1wbGF0ZT1iO2IudGVtcGxhdGl6ZXI9ZH0sX2lzRXhwYW5kZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuZXhwYW5kZWRJdGVtcyYmLTEhPT10aGlzLmV4cGFuZGVkSXRlbXMuaW5kZXhPZihiKX0sZXhwYW5kSXRlbTpmdW5jdGlvbihiKXt0aGlzLl9pc0V4cGFuZGVkKGIpfHx0aGlzLnB1c2goImV4cGFuZGVkSXRlbXMiLGIpfSxjb2xsYXBzZUl0ZW06ZnVuY3Rpb24oYil7dGhpcy5faXNFeHBhbmRlZChiKSYmdGhpcy5zcGxpY2UoImV4cGFuZGVkSXRlbXMiLHRoaXMuZXhwYW5kZWRJdGVtcy5pbmRleE9mKGIpLDEpfSwKX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkRXhwYW5kZWQ6ZnVuY3Rpb24oYil7ImV4cGFuZGVkIj09PWIuZGV0YWlsLnByb3AmJihiLmRldGFpbC52YWx1ZT90aGlzLmV4cGFuZEl0ZW0oYi5kZXRhaWwuaW5zdC5pdGVtKTp0aGlzLmNvbGxhcHNlSXRlbShiLmRldGFpbC5pbnN0Lml0ZW0pLGIuc3RvcFByb3BhZ2F0aW9uKCkpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5EYXRhUHJvdmlkZXJCZWhhdmlvcj17bGlzdGVuZXJzOnsiaXRlbS1jaGFuZ2VkIjoiX3RlbXBsYXRlSXRlbUNoYW5nZWQifSxwcm9wZXJ0aWVzOntwYWdlU2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAsb2JzZXJ2ZXI6Il9wYWdlU2l6ZUNoYW5nZWQifSxkYXRhUHJvdmlkZXI6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX2RhdGFQcm92aWRlckNoYW5nZWQifSxfbG9hZGluZzpCb29sZWFuLF9jYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9wZW5kaW5nUmVxdWVzdHM6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sX3RlbXBsYXRlSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5kZXRhaWwuaXRlbTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMuJC5pdGVtcykuY2hpbGRyZW4sZnVuY3Rpb24oZil7Zi5pdGVtPT09ZCYmZi5pdGVyYXRlQ2VsbHMoZnVuY3Rpb24oaCl7aC5fdGVtcGxhdGl6ZXIuX3N1cHByZXNzSXRlbUNoYW5nZUV2ZW50PQohMDtoLmluc3RhbmNlLm5vdGlmeVBhdGgoIml0ZW0uIitiLmRldGFpbC5wYXRoLGIuZGV0YWlsLnZhbHVlKTtoLl90ZW1wbGF0aXplci5fc3VwcHJlc3NJdGVtQ2hhbmdlRXZlbnQ9ITF9KX0pfSxfZ2V0Q2FjaGVkSXRlbTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9nZXRQYWdlRm9ySW5kZXgoYiksZj10aGlzLl9jYWNoZSYmdGhpcy5fY2FjaGVbZF07cmV0dXJuIGY/ZltiLWQqdGhpcy5wYWdlU2l6ZV06bnVsbH0sX2dldEl0ZW06ZnVuY3Rpb24oYixkKXt0aGlzLl91cGRhdGVJdGVtKGQsdGhpcy5fZ2V0Q2FjaGVkSXRlbShiKSk7dGhpcy5fZWFnZXJseUxvYWRQYWdlcygpO3ZhciBmPXRoaXMuX3VuY2FjaGVkUGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCk7MDxmLmxlbmd0aCYmKHRoaXMuX2xvYWRpbmc9ITAsdGhpcy5kZWJvdW5jZSgibG9hZCIsZnVuY3Rpb24oKXtmLmZvckVhY2goZnVuY3Rpb24oaCl7dGhpcy5fbG9hZFBhZ2UoaCl9LmJpbmQodGhpcykpfSwxMDApKX0sX2NhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYWdlc0ZvclBoeXNpY2FsSXRlbXMoKS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIHZvaWQgMCE9PQp0aGlzLl9jYWNoZSYmdm9pZCAwIT09dGhpcy5fY2FjaGVbYl19LmJpbmQodGhpcykpfSxfdW5jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCkuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiB2b2lkIDAhPT10aGlzLl9jYWNoZSYmdm9pZCAwPT09dGhpcy5fY2FjaGVbYl19LmJpbmQodGhpcykpfSxfZWFnZXJseUxvYWRQYWdlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2NhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtcygpLnNsaWNlKDApO2lmKDA8Yi5sZW5ndGgpe2Iuc29ydChmdW5jdGlvbihmLGgpe3JldHVybiBmPmh9KTt2YXIgZD1NYXRoLm1pbihiW2IubGVuZ3RoLTFdKzEsTWF0aC5tYXgoMCxNYXRoLmZsb29yKHRoaXMuc2l6ZS90aGlzLnBhZ2VTaXplKS0xKSk7dGhpcy5fbG9hZFBhZ2UoTWF0aC5tYXgoMCxiWzBdLTEpKTt0aGlzLl9sb2FkUGFnZShkKX19LF9wYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5fZ2V0UGFnZUZvckluZGV4KHRoaXMuJC5zY3JvbGxlci5maXJzdFZpc2libGVJbmRleCsKdGhpcy4kLnNjcm9sbGVyLl92aWR4T2Zmc2V0KV0uY29uY2F0KHRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGIuaW5kZXh9KS5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2dldFBhZ2VGb3JJbmRleChiLmluZGV4KX0uYmluZCh0aGlzKSkpLnJlZHVjZShmdW5jdGlvbihiLGQpey0xPT09Yi5pbmRleE9mKGQpJiZiLnB1c2goZCk7cmV0dXJuIGJ9LFtdKX0sX3VwZGF0ZUl0ZW1zOmZ1bmN0aW9uKGIsZCl7Zm9yKHZhciBmPTA7Zjx0aGlzLnBhZ2VTaXplO2YrKyl7dmFyIGg9dGhpcy4kLnNjcm9sbGVyLl92aXJ0dWFsSW5kZXhUb0l0ZW1bYip0aGlzLnBhZ2VTaXplK2ZdO2gmJih0aGlzLl91cGRhdGVJdGVtKGgsZFtmXSksdGhpcy5kZWJvdW5jZSgidXBkYXRlLWhlaWdodHMiLGZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLl91cGRhdGVNZXRyaWNzKCk7dGhpcy4kLnNjcm9sbGVyLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy4kLnNjcm9sbGVyLl91cGRhdGVTY3JvbGxlclNpemUoKX0sCjEpKX19LF9sb2FkUGFnZTpmdW5jdGlvbihiLGQpe2Q9ZHx8dGhpcy5fdXBkYXRlSXRlbXMuYmluZCh0aGlzKTtpZighdGhpcy5fY2FjaGVbYl0mJiF0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYl0mJnRoaXMuZGF0YVByb3ZpZGVyKXt0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYl09ITA7dmFyIGY9e3BhZ2U6YixwYWdlU2l6ZTp0aGlzLnBhZ2VTaXplLHNvcnRPcmRlcnM6dGhpcy5fbWFwU29ydGVycygpLGZpbHRlcnM6dGhpcy5fbWFwRmlsdGVycygpfTt0aGlzLmRhdGFQcm92aWRlcihmLGZ1bmN0aW9uKGgpe3RoaXMuX2NhY2hlW2JdPWg7ZGVsZXRlIHRoaXMuX3BlbmRpbmdSZXF1ZXN0c1tiXTtkKGIsaCk7dGhpcy5fbG9hZGluZz0wPHRoaXMuX3BlbmRpbmdSZXF1ZXN0cy5sZW5ndGg7dGhpcy5kZWJvdW5jZSgiY2hlY2stc2l6ZSIsdGhpcy5fY2hlY2tTaXplLDJFMyl9LmJpbmQodGhpcykpfX0sX2dldFBhZ2VGb3JJbmRleDpmdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5mbG9vcihiL3RoaXMucGFnZVNpemUpfSwKY2xlYXJDYWNoZTpmdW5jdGlvbigpe3RoaXMuX2NhY2hlPXt9O3RoaXMuX3BlbmRpbmdSZXF1ZXN0cz17fTt0aGlzLiQuc2Nyb2xsZXIuaGFzRGF0YSYmdGhpcy4kLnNjcm9sbGVyLl91cGRhdGUoKTt0aGlzLl9mbHVzaEl0ZW1zRGVib3VuY2VyKCl9LF9mbHVzaEl0ZW1zRGVib3VuY2VyOmZ1bmN0aW9uKCl7dGhpcy5mbHVzaERlYm91bmNlcigibG9hZCIpfSxfcGFnZVNpemVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09ZCYmYiE9PWQmJnRoaXMuY2xlYXJDYWNoZSgpfSxfY2hlY2tTaXplOmZ1bmN0aW9uKCl7dm9pZCAwPT09dGhpcy5zaXplJiZjb25zb2xlLndhcm4oJ1RoZSBceDNjdmFhZGluLWdyaWRceDNlIG5lZWRzIGEgdmFsdWUgZm9yICJzaXplIiBwcm9wZXJ0eSBpbiBvcmRlciB0byBkaXNwbGF5IHJvd3MuJyl9LF9kYXRhUHJvdmlkZXJDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09ZCYmdGhpcy5jbGVhckNhY2hlKCk7dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGF8fAoodGhpcy5fbG9hZGluZz0hMCx0aGlzLl9sb2FkUGFnZSgwLGZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGE9ITB9LmJpbmQodGhpcykpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXNlbGVjdGlvbi1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5TZWxlY3Rpb25CZWhhdmlvcj17cHJvcGVydGllczp7c2VsZWN0ZWRJdGVtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGVkSXRlbXNDaGFuZ2VkKHNlbGVjdGVkSXRlbXMuKikiXSxsaXN0ZW5lcnM6eyJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIjoiX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkU2VsZWN0aW9uIn0sX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkU2VsZWN0aW9uOmZ1bmN0aW9uKGIpe2lmKCJzZWxlY3RlZCI9PT1iLmRldGFpbC5wcm9wKXt2YXIgZD1iLmRldGFpbC5pbnN0Lml0ZW07KHRoaXMuX2lzU2VsZWN0ZWQoZCk/dGhpcy5kZXNlbGVjdEl0ZW06dGhpcy5zZWxlY3RJdGVtKS5iaW5kKHRoaXMpKGQpO3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6KHRoaXMuX2lzU2VsZWN0ZWQoZCk/IlNlbGVjdGVkIjoiRGVzZWxlY3RlZCIpKyIgUm93ICIrCihiLmRldGFpbC5pbnN0LmluZGV4KzEpKyIgb2YgIit0aGlzLnNpemV9KTtiLnN0b3BQcm9wYWdhdGlvbigpfX0sX2lzU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcyYmLTE8dGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoYil9LHNlbGVjdEl0ZW06ZnVuY3Rpb24oYil7Yj10aGlzLl90YWtlSXRlbShiKTt0aGlzLl9pc1NlbGVjdGVkKGIpfHx0aGlzLnB1c2goInNlbGVjdGVkSXRlbXMiLGIpfSxkZXNlbGVjdEl0ZW06ZnVuY3Rpb24oYil7Yj10aGlzLl90YWtlSXRlbShiKTtiPXRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGIpOy0xPGImJnRoaXMuc3BsaWNlKCJzZWxlY3RlZEl0ZW1zIixiLDEpfSxfdG9nZ2xlSXRlbTpmdW5jdGlvbihiKXtiPXRoaXMuX3Rha2VJdGVtKGIpOy0xPT09dGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoYik/dGhpcy5zZWxlY3RJdGVtKGIpOnRoaXMuZGVzZWxlY3RJdGVtKGIpfSxfdGFrZUl0ZW06ZnVuY3Rpb24oYil7cmV0dXJuIm51bWJlciI9PT0KdHlwZW9mIGImJjA8PWImJnRoaXMuaXRlbXMmJnRoaXMuaXRlbXMubGVuZ3RoPmI/dGhpcy5pdGVtc1tiXTpifSxfc2VsZWN0ZWRJdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYil7IXRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtc3x8InNlbGVjdGVkSXRlbXMiIT09Yi5wYXRoJiYic2VsZWN0ZWRJdGVtcy5zcGxpY2VzIiE9PWIucGF0aHx8dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5zZWxlY3RlZD10aGlzLl9pc1NlbGVjdGVkKGQuaXRlbSl9LmJpbmQodGhpcykpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQta2V5Ym9hcmQtbmF2aWdhdGlvbi1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToiYXBwbGljYXRpb24iLHRhYmluZGV4OjB9LGtleUJpbmRpbmdzOnsiY3RybCtob21lIjoiX29uQ3RybEhvbWUiLCJjdHJsK2VuZCI6Il9vbkN0cmxFbmQiLGRvd246Il9vbkFycm93RG93biIsZW5kOiJfb25FbmQiLGVudGVyOiJfb25FbnRlciIsZXNjOiJfb25Fc2NhcGUiLGYyOiJfb25GMiIsaG9tZToiX29uSG9tZSIsbGVmdDoiX29uQXJyb3dMZWZ0IixwYWdlZG93bjoiX29uUGFnZURvd24iLHBhZ2V1cDoiX29uUGFnZVVwIixyaWdodDoiX29uQXJyb3dSaWdodCIsc3BhY2U6Il9vblNwYWNlIix0YWI6Il9vblRhYiIsdXA6Il9vbkFycm93VXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIucmVxdWVzdEF2YWlsYWJpbGl0eSgpfSxwcm9wZXJ0aWVzOntfdmlydHVhbEZvY3VzOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3ZpcnR1YWxGb2N1c0NoYW5nZWQifSwKaW50ZXJhY3Rpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LG5hdmlnYXRpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9fSxsaXN0ZW5lcnM6e2ZvY3VzOiJfb25Gb2N1cyIsImNlbGwtZm9jdXMiOiJfb25DZWxsRm9jdXMiLCJjZWxsLWNvbnRlbnQtZm9jdXMiOiJfb25DZWxsQ29udGVudEZvY3VzIn0scmVhZHk6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihiKXs5PT09Yi5rZXlDb2RlJiYodGhpcy5fdGFiYmVkPSEwKTs5PT09Yi5rZXlDb2RlJiZiLnNoaWZ0S2V5JiYodGhpcy5fc2hpZnRUYWJiZWQ9ITApfS5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsZnVuY3Rpb24oYil7OT09PWIua2V5Q29kZSYmKHRoaXMuX3RhYmJlZD0hMSk7OT09PWIua2V5Q29kZSYmYi5zaGlmdEtleSYmKHRoaXMuX3NoaWZ0VGFiYmVkPQohMSl9LmJpbmQodGhpcyksITApfSxfaXNGb290ZXJWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy4kLmZvb3Rlci5fcm93cy5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIWIuaGlkZGVufSkubGVuZ3RofSxfb25Gb2N1czpmdW5jdGlvbigpe3RoaXMuX3RhYmJlZCYmIXRoaXMuX3NoaWZ0VGFiYmVkJiZ0aGlzLl9hY3RpdmF0ZU5hdmlnYXRpb24oKX0sX2FjdGl2YXRlTmF2aWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKX0sX29uRm9jdXNvdXQ6ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW5nPXRoaXMubmF2aWdhdGluZz0hMX0sX29uRm9vdGVyRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLm5hdmlnYXRpbmc9ITA7dGhpcy5pbnRlcmFjdGluZz0hMTt0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy5fdmlydHVhbEZvY3VzfHwodGhpcy5fc2hpZnRUYWJiZWQ/dGhpcy5faXNGb290ZXJWaXNpYmxlKCk/dGhpcy4kLmZvb3Rlcjp0aGlzLiQuaXRlbXM6CnRoaXMuJC5oZWFkZXIpfSxfdmlydHVhbEZvY3VzQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJihkLmZvY3VzZWQ9ITEpO2ImJihiLl9mb2N1c2VkQ2VsbEluZGV4PWIuX2ZvY3VzZWRDZWxsSW5kZXh8fDAsYi5fZm9jdXNlZFJvd0luZGV4PWIuX2ZvY3VzZWRSb3dJbmRleHx8MCxiLmZvY3VzZWQ9ITAsYj09PXRoaXMuJC5pdGVtcyYmdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uVGFiOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmludGVyYWN0aW5nJiZ0aGlzLl92aXJ0dWFsRm9jdXMpaWYodGhpcy5uYXZpZ2F0aW5nKWlmKGIuZGV0YWlsLmtleWJvYXJkRXZlbnQuc2hpZnRLZXkpc3dpdGNoKHRoaXMuX3ZpcnR1YWxGb2N1cyl7Y2FzZSB0aGlzLiQuZm9vdGVyOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaXRlbXM7Yi5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgdGhpcy4kLml0ZW1zOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaGVhZGVyO2IucHJldmVudERlZmF1bHQoKTsKYnJlYWs7Y2FzZSB0aGlzLiQuaGVhZGVyOnRoaXMuZm9jdXMoKSx0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH1lbHNlIHN3aXRjaCh0aGlzLl92aXJ0dWFsRm9jdXMpe2Nhc2UgdGhpcy4kLmhlYWRlcjp0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLml0ZW1zO2IucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIHRoaXMuJC5pdGVtczp0aGlzLl9pc0Zvb3RlclZpc2libGUoKT8odGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuJC5mb290ZXIsYi5wcmV2ZW50RGVmYXVsdCgpKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fdmlydHVhbEZvY3VzPW51bGx9LDEpO2JyZWFrO2Nhc2UgdGhpcy4kLmZvb3Rlcjp0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH1lbHNlIHRoaXMuX2FjdGl2YXRlTmF2aWdhdGlvbigpLGIucHJldmVudERlZmF1bHQoKX0sX2lzQWJvdmVWaWV3cG9ydDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5maXJzdFZpc2libGVJbmRleD5ifSxfb25BcnJvd0Rvd246ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8CihiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0Rvd24oKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfc2Nyb2xsUGFnZURvd246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWQudG9wLWIuYm90dG9tO3RoaXMuJC5zY3JvbGxlci5fc2Nyb2xsSGFuZGxlcigpfSxfb25QYWdlRG93bjpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXM/KGI9dGhpcy4kLnNjcm9sbGVyLmxhc3RWaXNpYmxlSW5kZXgsdGhpcy5fc2Nyb2xsUGFnZURvd24oKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleCs9CnRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LWJ8fHRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSk6dGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzUGFnZURvd24oKSl9LF9zY3JvbGxQYWdlVXA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3AtPWQudG9wLWIuYm90dG9tO3RoaXMuJC5zY3JvbGxlci5fc2Nyb2xsSGFuZGxlcigpfSxfb25QYWdlVXA6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zPyhiPXRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LAp0aGlzLl9zY3JvbGxQYWdlVXAoKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleC09Yi10aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleHx8dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgsdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKTp0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNQYWdlVXAoKSl9LF9vbkFycm93VXA6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzVXAoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25BcnJvd1JpZ2h0OmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1JpZ2h0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sCl9vbkFycm93TGVmdDpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNMZWZ0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uSG9tZTpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNIb21lKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uRW5kOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0VuZCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbC5fY2VsbENvbnRlbnQ7CihiPWIucXVlcnlTZWxlY3RvcigiW2ZvY3VzLXRhcmdldF0iKXx8Yi5maXJzdEVsZW1lbnRDaGlsZCkmJmIuZm9jdXMoKX0sX29uRW50ZXI6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZz8iaW5wdXQiPT09Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC50YXJnZXQubG9jYWxOYW1lJiYidGV4dCI9PT1iLmRldGFpbC5rZXlib2FyZEV2ZW50LnRhcmdldC50eXBlJiZ0aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6KGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0KCkpfSxfb25Fc2NhcGU6ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW5nP3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKTp0aGlzLm5hdmlnYXRpbmcmJih0aGlzLm5hdmlnYXRpbmc9ITEpfSxfb25GMjpmdW5jdGlvbihiKXtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5pbnRlcmFjdGluZz90aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6dGhpcy5fbW92ZUZvY3VzVG9Gb2N1c1RhcmdldCgpfSwKX29uQ3RybEhvbWU6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzRmlyc3QoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25DdHJsRW5kOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0xhc3QoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25TcGFjZTpmdW5jdGlvbihiKXtpZighdGhpcy5pbnRlcmFjdGluZyl7Yi5wcmV2ZW50RGVmYXVsdCgpO2I9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbDt2YXIgZD1iLmdldENvbnRlbnRDaGlsZHJlbihQb2x5bWVyLkVsZW1lbnQ/InNsb3QiOiJjb250ZW50IilbMF0uZmlyc3RFbGVtZW50Q2hpbGQ7ZD9kLmNsaWNrKCk6dGhpcy5uYXZpZ2F0aW5nJiYKdGhpcy5maXJlKCJjZWxsLWFjdGl2YXRlIix7bW9kZWw6Yi5pbnN0YW5jZX0pfX0sX29uQ2VsbENvbnRlbnRGb2N1czpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nPSEwO3RoaXMuX29uQ2VsbEZvY3VzKGIpfSxfb25DZWxsRm9jdXM6ZnVuY3Rpb24oYil7Yj1iLmRldGFpbC5jZWxsO3ZhciBkPWIucGFyZW50RWxlbWVudCxmPWQucGFyZW50RWxlbWVudCxoPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oZikuY2hpbGRyZW4sZCk7Zj09PXRoaXMuJC5pdGVtcyYmKGg9ZC5pbmRleCk7Zi5fZm9jdXNlZFJvd0luZGV4PWg7Zi5fZm9jdXNlZENlbGxJbmRleD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGQpLmNoaWxkcmVuLGIpO3RoaXMuX3ZpcnR1YWxGb2N1cz1mO2IuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpJiYoZi5fZm9jdXNlZENlbGxJbmRleD0wLGYuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKSl9LF9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0OmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuJC5zY3JvbGxlci5fdmlkeE9mZnNldCt0aGlzLiQuc2Nyb2xsZXIuX3ZpcnR1YWxTdGFydCxkPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4O3RoaXMuX3ZpcnR1YWxGb2N1cz09PXRoaXMuJC5pdGVtcyYmKGQ8Ynx8ZD5iK3RoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxDb3VudCkmJih0aGlzLiQuc2Nyb2xsZXIuc2Nyb2xsVG9TY2FsZWRJbmRleChkKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsQ2hhbmdlZChkLHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGxJbmRleCkpO3RoaXMuX2Vuc3VyZUVsZW1lbnRJblZpZXdwb3J0KHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGwpfSxfZW5zdXJlRWxlbWVudEluVmlld3BvcnQ6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZih0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXMpe3ZhciBmPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLApoPXRoaXMuJC5oZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO2QuYm90dG9tPmY/dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wKz1kLmJvdHRvbS1mOmQudG9wPGgmJih0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWQudG9wLWgpfWlmKCFiLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7Yj10aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtmPXRoaXMuJC5zY3JvbGxlci4kLnRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7aWYoaD10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3cucXVlcnlTZWxlY3RvcigiW2xhc3QtZnJvemVuXSIpKWY9aC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtkLnJpZ2h0PmI/dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsTGVmdCs9ZC5yaWdodC1iOmQubGVmdDxmJiYodGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsTGVmdCs9CmQubGVmdC1mKX19fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3I9W3ZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlS2V5Ym9hcmRCZWhhdmlvckltcGwsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY29sdW1uLXJlb3JkZXJpbmctYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5SZW9yZGVyaW5nQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fX07CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntfb3JkZXJCYXNlU2NvcGU6e3R5cGU6TnVtYmVyLHZhbHVlOjFFN319LGxpc3RlbmVyczp7ZHJhZ3N0YXJ0OiJfb25EcmFnU3RhcnQiLGRyYWdvdmVyOiJfb25EcmFnT3ZlciIsZHJhZ2VuZDoiX29uRHJhZ0VuZCJ9LG9ic2VydmVyczpbIl91cGRhdGVPcmRlcnMoY29sdW1uVHJlZSwgY29sdW1uVHJlZS4qKSJdLF91cGRhdGVPcmRlcnM6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiZiWzBdLmZvckVhY2goZnVuY3Rpb24oZixoKXtmLl9vcmRlcj0oaCsxKSp0aGlzLl9vcmRlckJhc2VTY29wZX0sdGhpcyl9LF9vbkRyYWdTdGFydDpmdW5jdGlvbihiKXtpZigidmFhZGluLWdyaWQtY2VsbC1jb250ZW50Ij09PWIudGFyZ2V0LmxvY2FsTmFtZSl7dmFyIGQ9dGhpcy5fZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQoYi50YXJnZXQpO2QmJih0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsCiEwKSx0aGlzLl9kcmFnZ2VkQ29sdW1uPWQuY29sdW1uLHRoaXMuX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1cyh0aGlzLl9kcmFnZ2VkQ29sdW1uLCJhbGxvd2VkIiksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iZHJhZ2dpbmciLGIuZGF0YVRyYW5zZmVyJiYoYi5kYXRhVHJhbnNmZXIuc2V0RGF0YSgidGV4dCIsIiIpLGIuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ9Im1vdmUiKSx0aGlzLl9hdXRvU2Nyb2xsZXIoKSl9fSxfc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzOmZ1bmN0aW9uKGIsZCl7QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKFBvbHltZXIuZG9tKFBvbHltZXIuZG9tKGIpLnBhcmVudE5vZGUpLmNoaWxkcmVuLGZ1bmN0aW9uKGYpe3JldHVybi9jb2x1bW4vLnRlc3QoZi5sb2NhbE5hbWUpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKGYsYil9LHRoaXMpLmZvckVhY2goZnVuY3Rpb24oZil7Zi5fcmVvcmRlclN0YXR1cz1kfSl9LF9vbkRyYWdPdmVyOmZ1bmN0aW9uKGIpe2lmKHRoaXMuX2RyYWdnZWRDb2x1bW4pe3ZhciBkPQooUG9seW1lci5FbGVtZW50P2IuY29tcG9zZWRQYXRoKCk6UG9seW1lci5kb20oYikucGF0aCkuZmlsdGVyKGZ1bmN0aW9uKGYpe3JldHVybiJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiPT09Zi5sb2NhbE5hbWV9KVswXTtkJiYoYi5wcmV2ZW50RGVmYXVsdCgpLGQ9dGhpcy5fZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQoZCksKGQ9dGhpcy5fZ2V0VGFyZ2V0Q29sdW1uKGQsdGhpcy5fZHJhZ2dlZENvbHVtbikpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKHRoaXMuX2RyYWdnZWRDb2x1bW4sZCkmJnRoaXMuX2lzU3dhcHBhYmxlQnlQb3NpdGlvbihkLGIuY2xpZW50WCkmJnRoaXMuX3N3YXBDb2x1bW5PcmRlcnModGhpcy5fZHJhZ2dlZENvbHVtbixkKSx0aGlzLl9sYXN0RHJhZ0NsaWVudFg9Yi5jbGllbnRYKX19LF9hdXRvU2Nyb2xsZXI6ZnVuY3Rpb24oKXtpZih0aGlzLl9sYXN0RHJhZ0NsaWVudFgpe3ZhciBiPXRoaXMuX2xhc3REcmFnQ2xpZW50WC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0Kwo1MCxkPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC10aGlzLl9sYXN0RHJhZ0NsaWVudFgrNTA7MDxiP3RoaXMuJC50YWJsZS5zY3JvbGxMZWZ0Kz1iLzEwOjA8ZCYmKHRoaXMuJC50YWJsZS5zY3JvbGxMZWZ0LT1kLzEwKTt0aGlzLl9zY3JvbGxIYW5kbGVyKCl9dGhpcy5fZHJhZ2dlZENvbHVtbiYmdGhpcy5hc3luYyh0aGlzLl9hdXRvU2Nyb2xsZXIsMTApfSxfb25EcmFnRW5kOmZ1bmN0aW9uKCl7dGhpcy5fZHJhZ2dlZENvbHVtbiYmKHRoaXMudG9nZ2xlQXR0cmlidXRlKCJyZW9yZGVyaW5nIiwhMSksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iIix0aGlzLl9zZXRTaWJsaW5nc1Jlb3JkZXJTdGF0dXModGhpcy5fZHJhZ2dlZENvbHVtbiwiIiksdGhpcy5fbGFzdERyYWdDbGllbnRYPXRoaXMuX2RyYWdnZWRDb2x1bW49bnVsbCl9LF9pc1N3YXBBbGxvd2VkOmZ1bmN0aW9uKGIsZCl7aWYoYiYmZCl7dmFyIGY9Yi5wYXJlbnRFbGVtZW50PT09ZC5wYXJlbnRFbGVtZW50LApoPWIuZnJvemVuPT09ZC5mcm96ZW47cmV0dXJuIGIhPT1kJiZmJiZofX0sX2lzU3dhcHBhYmxlQnlQb3NpdGlvbjpmdW5jdGlvbihiLGQpe3ZhciBmPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyKS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLGZ1bmN0aW9uKGspe3JldHVybiBrLmNvbHVtbj09PWJ9KVswXSxoPXRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvcigiW3Jlb3JkZXItc3RhdHVzXHgzZGRyYWdnaW5nXSIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ+aC5sZWZ0P2Q+Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodC1oLndpZHRoOmQ8Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0K2gud2lkdGh9LF9nZXRDZWxsQnlDZWxsQ29udGVudDpmdW5jdGlvbihiKXtpZihQb2x5bWVyLkVsZW1lbnQpcmV0dXJuIGIuYXNzaWduZWRTbG90LnBhcmVudE5vZGU7CmI9UG9seW1lci5kb20oYikuZ2V0RGVzdGluYXRpb25JbnNlcnRpb25Qb2ludHMoKVswXTtyZXR1cm4gUG9seW1lci5kb20oYikucGFyZW50Tm9kZX0sX3N3YXBDb2x1bW5PcmRlcnM6ZnVuY3Rpb24oYixkKXt2YXIgZj1iLl9vcmRlcjtiLl9vcmRlcj1kLl9vcmRlcjtkLl9vcmRlcj1mO3RoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKTt0aGlzLl91cGRhdGVMYXN0Q29sdW1uKCl9LF9nZXRUYXJnZXRDb2x1bW46ZnVuY3Rpb24oYixkKXtpZihiJiZkKXtmb3IodmFyIGY9Yi5jb2x1bW47Zi5wYXJlbnRFbGVtZW50IT09ZC5wYXJlbnRFbGVtZW50JiZmIT09dGhpcy50YXJnZXQ7KWY9Zi5wYXJlbnRFbGVtZW50O3JldHVybiBmLnBhcmVudEVsZW1lbnQ9PT1kLnBhcmVudEVsZW1lbnQ/ZjpiLmNvbHVtbn19fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC9pcm9uLWxpc3QtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvckltcGw9ZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGQ9YiYmODw9YlsxXTtyZXR1cm57aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7bWF4UGh5c2ljYWxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwfSxhczp7dHlwZTpTdHJpbmcsdmFsdWU6Iml0ZW0ifSxpbmRleEFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaW5kZXgifX0sX3JhdGlvOi41LF9zY3JvbGxlclBhZGRpbmdUb3A6MCxfc2Nyb2xsUG9zaXRpb246MCxfcGh5c2ljYWxTaXplOjAsX3BoeXNpY2FsQXZlcmFnZTowLF9waHlzaWNhbEF2ZXJhZ2VDb3VudDowLF9waHlzaWNhbFRvcDowLF92aXJ0dWFsQ291bnQ6MCxfcGh5c2ljYWxJbmRleEZvcktleTpudWxsLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCwKX3BoeXNpY2FsSXRlbXM6bnVsbCxfcGh5c2ljYWxTaXplczpudWxsLF9maXJzdFZpc2libGVJbmRleFZhbDpudWxsLF9sYXN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfaXRlbXNSZW5kZXJlZDohMSxfbGFzdFBhZ2U6bnVsbCxfbWF4UGFnZXM6MyxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTaXplLXRoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtCnRoaXMuX3ZpZXdwb3J0SGVpZ2h0K3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcH0sX21pblZpcnR1YWxTdGFydDowLGdldCBfbWF4VmlydHVhbFN0YXJ0KCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3BoeXNpY2FsQ291bnQpfSxfdmlydHVhbFN0YXJ0VmFsOjAsc2V0IF92aXJ0dWFsU3RhcnQoZil7dGhpcy5fdmlydHVhbFN0YXJ0VmFsPU1hdGgubWluKHRoaXMuX21heFZpcnR1YWxTdGFydCxNYXRoLm1heCh0aGlzLl9taW5WaXJ0dWFsU3RhcnQsZikpfSxnZXQgX3ZpcnR1YWxTdGFydCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnRWYWx8fDB9LF9waHlzaWNhbFN0YXJ0VmFsOjAsc2V0IF9waHlzaWNhbFN0YXJ0KGYpe3RoaXMuX3BoeXNpY2FsU3RhcnRWYWw9ZiV0aGlzLl9waHlzaWNhbENvdW50OzA+dGhpcy5fcGh5c2ljYWxTdGFydFZhbCYmKHRoaXMuX3BoeXNpY2FsU3RhcnRWYWw9dGhpcy5fcGh5c2ljYWxDb3VudCt0aGlzLl9waHlzaWNhbFN0YXJ0VmFsKTsKdGhpcy5fcGh5c2ljYWxFbmQ9KHRoaXMuX3BoeXNpY2FsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xKSV0aGlzLl9waHlzaWNhbENvdW50fSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sX3BoeXNpY2FsQ291bnRWYWw6MCxzZXQgX3BoeXNpY2FsQ291bnQoZil7dGhpcy5fcGh5c2ljYWxDb3VudFZhbD1mO3RoaXMuX3BoeXNpY2FsRW5kPSh0aGlzLl9waHlzaWNhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMSkldGhpcy5fcGh5c2ljYWxDb3VudH0sZ2V0IF9waHlzaWNhbENvdW50KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsQ291bnRWYWx9LF9waHlzaWNhbEVuZDowLGdldCBfb3B0UGh5c2ljYWxTaXplKCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0SGVpZ2h0KnRoaXMuX21heFBhZ2VzfSxnZXQgX29wdFBoeXNpY2FsQ291bnQoKXtyZXR1cm4gdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9tYXhQYWdlc30sCmdldCBfaXNWaXNpYmxlKCl7cmV0dXJuIHRoaXMuc2Nyb2xsVGFyZ2V0JiYhKCF0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aCYmIXRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodCl9LGdldCBmaXJzdFZpc2libGVJbmRleCgpe2lmKG51bGw9PT10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbCl7dmFyIGY9TWF0aC5mbG9vcih0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3ApO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihoLGspe2YrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKTtpZihmPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiBrfSl8fDB9cmV0dXJuIHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe2lmKG51bGw9PT10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsKXt2YXIgZj10aGlzLl9waHlzaWNhbFRvcDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oaCwKayl7aWYoZjx0aGlzLl9zY3JvbGxCb3R0b20pdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1rO2Vsc2UgcmV0dXJuITA7Zis9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGgpfSl9cmV0dXJuIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWx9LGdldCBfZGVmYXVsdFNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzfSxnZXQgX3ZpcnR1YWxSb3dDb3VudCgpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlydHVhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9lc3RSb3dzSW5WaWV3KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC90aGlzLl9yb3dIZWlnaHQpfSxnZXQgX3BoeXNpY2FsUm93cygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fcGh5c2ljYWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTt0aGlzLl9yZW5kZXIoKTt0aGlzLmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsCiJfcmVzaXplSGFuZGxlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2l0ZW1zUmVuZGVyZWQ9ITE7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIil9LHVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllczpmdW5jdGlvbigpe3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcD10aGlzLnNjcm9sbFRhcmdldD09PXRoaXM/MDpwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKVsicGFkZGluZy10b3AiXXx8MCwxMCk7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0fSxfdXBkYXRlOmZ1bmN0aW9uKGYsaCl7dGhpcy5fYXNzaWduTW9kZWxzKGYpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoZik7aWYoaClmb3IoO2gubGVuZ3RoOylmPWgucG9wKCksdGhpcy5fcGh5c2ljYWxUb3AtPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChmKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCk7CnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCl9LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbigpe2lmKDA9PT10aGlzLl92aWV3cG9ydEhlaWdodClyZXR1cm4hMTt2YXIgZj10aGlzLl9waHlzaWNhbFNpemVzLnJlZHVjZShmdW5jdGlvbihrLHQpe3JldHVybiBrKyh0fHwxMDApfSwwKSxoPWY+dGhpcy5fdmlld3BvcnRIZWlnaHQ7aWYoZj49dGhpcy5fb3B0UGh5c2ljYWxTaXplJiZoKXJldHVybiExO2Y9TWF0aC5mbG9vcih0aGlzLl9waHlzaWNhbFNpemUvdGhpcy5fdmlld3BvcnRIZWlnaHQpOzA9PT1mP3RoaXMuX2RlYm91bmNlVGVtcGxhdGUodGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyxNYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpKSk6dGhpcy5fbGFzdFBhZ2UhPT1mJiZoP1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsdGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyx0aGlzLl9pdGVtc1BlclJvdyksCjE2KSk6dGhpcy5fZGVib3VuY2VUZW1wbGF0ZSh0aGlzLl9pbmNyZWFzZVBvb2wuYmluZCh0aGlzLE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC8odGhpcy5fcGh5c2ljYWxTaXplL3RoaXMuX3BoeXNpY2FsQ291bnQpKnRoaXMuX21heFBhZ2VzLXRoaXMuX3BoeXNpY2FsQ291bnQpfHwxKSk7dGhpcy5fbGFzdFBhZ2U9ZjtyZXR1cm4hMH0sX2RlYm91bmNlVGVtcGxhdGU6ZnVuY3Rpb24oZil7UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UoIl9kZWJvdW5jZVRlbXBsYXRlIixmKSl9LF9pbmNyZWFzZVBvb2w6ZnVuY3Rpb24oZil7dmFyIGg9dGhpcy5fcGh5c2ljYWxDb3VudDtmPU1hdGgubWluKHRoaXMuX3BoeXNpY2FsQ291bnQrZix0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fdmlydHVhbFN0YXJ0LE1hdGgubWF4KHRoaXMubWF4UGh5c2ljYWxDb3VudCwyNSkpLWg7MD49Znx8KFtdLnB1c2guYXBwbHkodGhpcy5fcGh5c2ljYWxJdGVtcyx0aGlzLl9jcmVhdGVQb29sKGYpKSwKW10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbFNpemVzLEFycmF5KGYpKSx0aGlzLl9waHlzaWNhbENvdW50PWgrZix0aGlzLl91cGRhdGUoKSl9LF9yZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZj0wPHRoaXMuX3ZpcnR1YWxDb3VudHx8MDx0aGlzLl9waHlzaWNhbENvdW50O3RoaXMuaXNBdHRhY2hlZCYmIXRoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX2lzVmlzaWJsZSYmZiYmKHRoaXMuX2xhc3RQYWdlPTAsdGhpcy5fdXBkYXRlKCksdGhpcy5faXRlbXNSZW5kZXJlZD0hMCl9LF9pdGVyYXRlSXRlbXM6ZnVuY3Rpb24oZixoKXt2YXIgayx0O2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiZoKWZvcih0PTA7dDxoLmxlbmd0aDt0Kyspe3ZhciBsPWhbdF07dmFyIHA9dGhpcy5fY29tcHV0ZVZpZHgobCk7aWYobnVsbCE9KGs9Zi5jYWxsKHRoaXMsbCxwKSkpcmV0dXJuIGt9ZWxzZXtsPXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHA9dGhpcy5fdmlydHVhbFN0YXJ0O2w8dGhpcy5fcGh5c2ljYWxDb3VudDtsKyssCnArKylpZihudWxsIT0oaz1mLmNhbGwodGhpcyxsLHApKSlyZXR1cm4gaztmb3IobD0wO2w8dGhpcy5fcGh5c2ljYWxTdGFydDtsKysscCsrKWlmKG51bGwhPShrPWYuY2FsbCh0aGlzLGwscCkpKXJldHVybiBrfX0sX2NvbXB1dGVWaWR4OmZ1bmN0aW9uKGYpe3JldHVybiBmPj10aGlzLl9waHlzaWNhbFN0YXJ0P3RoaXMuX3ZpcnR1YWxTdGFydCsoZi10aGlzLl9waHlzaWNhbFN0YXJ0KTp0aGlzLl92aXJ0dWFsU3RhcnQrKHRoaXMuX3BoeXNpY2FsQ291bnQtdGhpcy5fcGh5c2ljYWxTdGFydCkrZn0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24oZil7dGhpcy5zY3JvbGxpbmcmJlBvbHltZXIuZG9tLmZsdXNoKCk7dmFyIGg9MCxrPTAsdD10aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCxsPXRoaXMuX3BoeXNpY2FsQXZlcmFnZTt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocCl7ays9dGhpcy5fcGh5c2ljYWxTaXplc1twXXx8MDt0aGlzLl9waHlzaWNhbFNpemVzW3BdPXRoaXMuX3BoeXNpY2FsSXRlbXNbcF0ub2Zmc2V0SGVpZ2h0OwpoKz10aGlzLl9waHlzaWNhbFNpemVzW3BdO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50Kz10aGlzLl9waHlzaWNhbFNpemVzW3BdPzE6MH0sZik7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuX3BoeXNpY2FsU2l6ZT10aGlzLl9waHlzaWNhbFNpemUraC1rO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50IT09dCYmKHRoaXMuX3BoeXNpY2FsQXZlcmFnZT1NYXRoLnJvdW5kKChsKnQraCkvdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQpKX0sX3Bvc2l0aW9uSXRlbXM6ZnVuY3Rpb24oKXt0aGlzLl9hZGp1c3RTY3JvbGxQb3NpdGlvbigpO3ZhciBmPXRoaXMuX3BoeXNpY2FsVG9wO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihoKXt0aGlzLl9waHlzaWNhbEl0ZW1zW2hdLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoMCxmKTtmKz10aGlzLl9waHlzaWNhbFNpemVzW2hdfSl9LF9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU2l6ZXNbZl19LApfc2hvdWxkUmVuZGVyTmV4dFJvdzpmdW5jdGlvbihmKXtyZXR1cm4gZiV0aGlzLl9pdGVtc1BlclJvdz09PXRoaXMuX2l0ZW1zUGVyUm93LTF9LF9hZGp1c3RTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBmPTA9PT10aGlzLl92aXJ0dWFsU3RhcnQ/dGhpcy5fcGh5c2ljYWxUb3A6TWF0aC5taW4odGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fcGh5c2ljYWxUb3AsMCk7ZiYmKHRoaXMuX3BoeXNpY2FsVG9wLT1mLGR8fDA9PT10aGlzLl9waHlzaWNhbFRvcHx8dGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9zY3JvbGxUb3AtZikpfSxfcmVzZXRTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbihmKXt0aGlzLnNjcm9sbFRhcmdldCYmKHRoaXMuX3Njcm9sbFBvc2l0aW9uPXRoaXMuX3Njcm9sbFRvcD1mKX0sX3VwZGF0ZVNjcm9sbGVyU2l6ZTpmdW5jdGlvbihmKXt0aGlzLl9lc3RTY3JvbGxIZWlnaHQ9dGhpcy5fcGh5c2ljYWxCb3R0b20rTWF0aC5tYXgodGhpcy5fdmlydHVhbENvdW50LQp0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCwwKSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7aWYoKGY9KGY9Znx8MD09PXRoaXMuX3Njcm9sbEhlaWdodCl8fHRoaXMuX3Njcm9sbFBvc2l0aW9uPj10aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fcGh5c2ljYWxTaXplKXx8TWF0aC5hYnModGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3Njcm9sbEhlaWdodCk+PXRoaXMuX29wdFBoeXNpY2FsU2l6ZSl0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodCsicHgiLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHR9LHNjcm9sbFRvSW5kZXg6ZnVuY3Rpb24oZil7UG9seW1lci5kb20uZmx1c2goKTtmPU1hdGgubWluKE1hdGgubWF4KGYsMCksdGhpcy5fdmlydHVhbENvdW50LTEpO2lmKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQoZil8fGY+PXRoaXMuX21heFZpcnR1YWxTdGFydCl0aGlzLl92aXJ0dWFsU3RhcnQ9CmYtMTt0aGlzLl9hc3NpZ25Nb2RlbHMoKTt0aGlzLl91cGRhdGVNZXRyaWNzKCk7dGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIGg9dGhpcy5fcGh5c2ljYWxTdGFydCxrPXRoaXMuX3ZpcnR1YWxTdGFydCx0PTAsbD10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTtrPGYmJnQ8PWw7KXQrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKSxoPShoKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsaysrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3QpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCk7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD0KbnVsbH0sX3Jlc2V0QXZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50PXRoaXMuX3BoeXNpY2FsQXZlcmFnZT0wfSxfcmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpO3RoaXMuX3JlbmRlcigpO3RoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX3BoeXNpY2FsSXRlbXMmJnRoaXMuX2lzVmlzaWJsZSYmKHRoaXMuX3Jlc2V0QXZlcmFnZSgpLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4KSl9LmJpbmQodGhpcyksMSkpfSx1cGRhdGVTaXplRm9ySXRlbTpmdW5jdGlvbihmKXtmPXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbZl07bnVsbCE9ZiYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW2ZdKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCkpfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGYpe3JldHVybiBmPj0KdGhpcy5fdmlydHVhbFN0YXJ0JiZmPD10aGlzLl92aXJ0dWFsRW5kfSxfaXNJbmRleFZpc2libGU6ZnVuY3Rpb24oZil7cmV0dXJuIGY+PXRoaXMuZmlyc3RWaXNpYmxlSW5kZXgmJmY8PXRoaXMubGFzdFZpc2libGVJbmRleH19fSgpO3ZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3I9W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlIixiZWhhdmlvcnM6W3ZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUNvbHVtblJlb3JkZXJpbmdCZWhhdmlvcixQb2x5bWVyLlRlbXBsYXRpemVyXSxwcm9wZXJ0aWVzOntzaXplOk51bWJlcixjb2x1bW5UcmVlOkFycmF5LGJpbmREYXRhOkZ1bmN0aW9uLHJvd0RldGFpbHNUZW1wbGF0ZTpPYmplY3QsY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHNhZmFyaTp7dHlwZTpCb29sZWFuLHZhbHVlOi9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9LHNjcm9sbGJhcldpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpiLnN0eWxlLndpZHRoPSIxMDBweCI7Yi5zdHlsZS5oZWlnaHQ9IjEwMHB4IjtiLnN0eWxlLm92ZXJmbG93PSJzY3JvbGwiO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iLTk5OTlweCI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD1iLm9mZnNldFdpZHRoLWIuY2xpZW50V2lkdGg7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTtyZXR1cm4gZH19LHRhcmdldDpPYmplY3QsaGFzRGF0YTpCb29sZWFufSxvYnNlcnZlcnM6WyJfY29sdW1uVHJlZUNoYW5nZWQoY29sdW1uVHJlZSwgX3BoeXNpY2FsSXRlbXMsIF9waHlzaWNhbENvdW50VmFsKSIsIl9zaXplQ2hhbmdlZChzaXplLCBiaW5kRGF0YSwgaGFzRGF0YSkiLCJfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZChyb3dEZXRhaWxzVGVtcGxhdGUsIF9waHlzaWNhbEl0ZW1zLCBfcGh5c2ljYWxDb3VudFZhbCkiXSxsaXN0ZW5lcnM6eyJwcm9wZXJ0eS1jaGFuZ2VkIjoiX2NvbHVtblByb3BDaGFuZ2VkIiwKYW5pbWF0aW9uZW5kOiJfb25BbmltYXRpb25FbmQiLCJjb2x1bW4tcmVzaXppbmciOiJfb25Db2x1bW5SZXNpemUifSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuJD10aGlzLiR8fHt9O3RoaXMuJC5oZWFkZXI9dGhpcy5kb21Ib3N0LiQuaGVhZGVyO3RoaXMuJC5pdGVtcz10aGlzLmRvbUhvc3QuJC5pdGVtczt0aGlzLiQuZm9vdGVyPXRoaXMuZG9tSG9zdC4kLmZvb3Rlcn0sX29uQ29sdW1uUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImNvbHVtbi1yZXNpemluZyIsdGhpcy4kLmhlYWRlci5xdWVyeVNlbGVjdG9yKCJbY29sdW1uLXJlc2l6aW5nXSIpKTt0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpfSxfb25BbmltYXRpb25FbmQ6ZnVuY3Rpb24oYil7L2FwcGVhci8udGVzdChiLmFuaW1hdGlvbk5hbWUpJiYodGhpcy5fcmVuZGVyKCksdGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljcygpLGIuc3RvcFByb3BhZ2F0aW9uKCkpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oYil7ImhlYWRlclRlbXBsYXRlIj09PQpiLmRldGFpbC5wYXRoJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsITAsdGhpcy4kLmhlYWRlcik7ImZvb3RlclRlbXBsYXRlIj09PWIuZGV0YWlsLnBhdGgmJnRoaXMudG9nZ2xlQXR0cmlidXRlKCJoYXMtdGVtcGxhdGVzIiwhMCx0aGlzLiQuZm9vdGVyKTsvZnJvemVufGhpZGRlbi8udGVzdChiLmRldGFpbC5wYXRoKSYmdGhpcy5fZnJvemVuQ2VsbHNDaGFuZ2VkKCk7ImhpZGRlbiI9PT1iLmRldGFpbC5wYXRoJiZ0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpfSxfaGlkZU91dGVyU2Nyb2xsZXI6ZnVuY3Rpb24oYixkKXtyZXR1cm4gMD09PWImJiFkfSxfaGlkZVRhYmxlT3ZlcmZsb3c6ZnVuY3Rpb24oYixkKXtyZXR1cm4gMD09PWImJmR9LF9yb3dEZXRhaWxzVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT1iJiZkJiZ2b2lkIDAhPT1mJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsZnVuY3Rpb24oaCl7aC5yb3dEZXRhaWxzVGVtcGxhdGU9CmJ9KX0sX2NvbHVtblRyZWVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT1iJiZkJiZ2b2lkIDAhPT1mJiYoUG9seW1lci5SZW5kZXJTdGF0dXMuYWZ0ZXJOZXh0UmVuZGVyKHRoaXMsdGhpcy5fdXBkYXRlKSx0aGlzLl9mcm96ZW5DZWxsc0NoYW5nZWQoKSx0aGlzLl9oYXNUZW1wbGF0ZXNDaGFuZ2VkKGIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCxmdW5jdGlvbihoKXtoLmNvbHVtbnM9YltiLmxlbmd0aC0xXX0pLHRoaXMuX2dyaWRSZXNpemVIYW5kbGVyKCksUG9seW1lci5kb20uZmx1c2godGhpcyksdGhpcy5fdXBkYXRlTGFzdENvbHVtbigpKX0sX3VwZGF0ZUxhc3RDb2x1bW46ZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93IiksZnVuY3Rpb24oYil7Yi51cGRhdGVMYXN0Q29sdW1uKCl9KX0sX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbFNpemVzJiYKUG9seW1lci5kb20uZmx1c2goKTt0aGlzLl91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzU3luYygpO1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLiQuaGVhZGVyLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmMoKTt0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleCYmdGhpcy5zY3JvbGxUb1NjYWxlZEluZGV4KHRoaXMuX3BlbmRpbmdTY3JvbGxUb1NjYWxlZEluZGV4KX0uYmluZCh0aGlzKSl9LF91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzU3luYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJC5oZWFkZXIuY2xpZW50SGVpZ2h0KyJweCIsZD10aGlzLiQuZm9vdGVyLmNsaWVudEhlaWdodCsicHgiO1t0aGlzLiQub3V0ZXJzaXplcix0aGlzLiQuZml4ZWRzaXplcix0aGlzLiQuaXRlbXNdLmZvckVhY2goZnVuY3Rpb24oZil7Zi5zdHlsZS5ib3JkZXJUb3BXaWR0aD1iO2Yuc3R5bGUuYm9yZGVyQm90dG9tV2lkdGg9CmR9KX0sX2hhc1RlbXBsYXRlc0NoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9ITEsZj0hMTtiLmZvckVhY2goZnVuY3Rpb24oaCl7cmV0dXJuIGguZm9yRWFjaChmdW5jdGlvbihrKXtkPWR8fGsuaGVhZGVyVGVtcGxhdGU7Zj1mfHxrLmZvb3RlclRlbXBsYXRlfSl9KTt0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsZCx0aGlzLiQuaGVhZGVyKTt0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsZix0aGlzLiQuZm9vdGVyKX0sX2NyZWF0ZVBvb2w6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPUFycmF5KGIpLGY9MDtmPGI7ZisrKXt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1yb3ciKTtoLnRhcmdldD10aGlzLmRvbUhvc3Q7ZFtmXT1oO2guc2V0QXR0cmlidXRlKCJoaWRkZW4iLCIiKTtQb2x5bWVyLmRvbSh0aGlzLiQuaXRlbXMpLmFwcGVuZENoaWxkKGgpfXJldHVybiBkfSxfc2l6ZUNoYW5nZWQ6ZnVuY3Rpb24oYiwKZCxmKXtpZih2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mKXt2YXIgaD10aGlzLl9zY3JvbGxUb3Asaz10aGlzLmZpcnN0VmlzaWJsZUluZGV4K3RoaXMuX3ZpZHhPZmZzZXQ7dGhpcy5fdmlydHVhbENvdW50PU1hdGgubWluKGIsMUU1KTt0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5PXt9O3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLl92aWR4T2Zmc2V0PTA7dGhpcy5fcGh5c2ljYWxJdGVtc3x8KHRoaXMuX3BoeXNpY2FsQ291bnQ9TWF0aC5tYXgoMSxNYXRoLm1pbigyNSx0aGlzLl92aXJ0dWFsQ291bnQpKSx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX2NyZWF0ZVBvb2wodGhpcy5fcGh5c2ljYWxDb3VudCksdGhpcy5fcGh5c2ljYWxTaXplcz1BcnJheSh0aGlzLl9waHlzaWNhbENvdW50KSk7dGhpcy5faXRlbXNSZW5kZXJlZD0hMTt0aGlzLl9kZWJvdW5jZVRlbXBsYXRlKGZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyKCk7CnRoaXMuX3ZpZXdwb3J0SGVpZ2h0JiYodGhpcy5zY3JvbGxUb1NjYWxlZEluZGV4KE1hdGgubWluKGssdGhpcy5zaXplKSksdGhpcy5fc2Nyb2xsVG9wPWgsdGhpcy5fc2Nyb2xsSGFuZGxlcigpLHRoaXMuZmx1c2hEZWJvdW5jZXIoInZhYWRpbi1ncmlkLXNjcm9sbGluZyIpKX0pfX0sX2Fzc2lnbk1vZGVsczpmdW5jdGlvbihiKXt0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW09dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtfHx7fTt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oZCxmKXtkPXRoaXMuX3BoeXNpY2FsSXRlbXNbZF07ZC5pbmRleCYmZGVsZXRlIHRoaXMuX3ZpcnR1YWxJbmRleFRvSXRlbVtkLmluZGV4XTtkLmluZGV4PWYrdGhpcy5fdmlkeE9mZnNldDt0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW1bZC5pbmRleF09ZDtkLnRvZ2dsZUF0dHJpYnV0ZSgib2RkIixkLmluZGV4JTIpO2QudG9nZ2xlQXR0cmlidXRlKCJsYXN0cm93IixkLmluZGV4PT09dGhpcy5zaXplLTEpO2QudG9nZ2xlQXR0cmlidXRlKCJoaWRkZW4iLApkLmluZGV4Pj10aGlzLnNpemUpO3RoaXMuYmluZERhdGEoZC5pbmRleCxkKX0sYil9LF9ncmlkUmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3MoKTt0aGlzLl9waHlzaWNhbFNpemVzJiYodGhpcy5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IudXBkYXRlUm93RGV0YWlsc0NlbGxNZXRyaWNzKCl9KSx0aGlzLmRlYm91bmNlKCJ2YWFkaW4tZ3JpZC1yZXNpemluZyIsZnVuY3Rpb24oKXt0aGlzLl91cGRhdGUoKX0uYmluZCh0aGlzKSwxKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY29sdW1uLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJhc2VCZWhhdmlvcj17cHJvcGVydGllczp7cmVzaXphYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ZnVuY3Rpb24oKXtpZigidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiE9PXRoaXMubG9jYWxOYW1lKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiBiJiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWIubG9jYWxOYW1lP2IucmVzaXphYmxlfHwhMTohMX19fSxoZWFkZXJUZW1wbGF0ZTp7dHlwZTpPYmplY3R9LGZvb3RlclRlbXBsYXRlOnt0eXBlOk9iamVjdH0sZnJvemVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxoaWRkZW46e3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9LF9sYXN0RnJvemVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxfb3JkZXI6TnVtYmVyLF9yZW9yZGVyU3RhdHVzOkJvb2xlYW59LG9ic2VydmVyczpbIl9mb290ZXJUZW1wbGF0ZUNoYW5nZWQoZm9vdGVyVGVtcGxhdGUpIiwKIl9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQoaGVhZGVyVGVtcGxhdGUpIiwiX2xhc3RGcm96ZW5DaGFuZ2VkKF9sYXN0RnJvemVuKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGQpezA8PWQuYWRkZWROb2Rlcy5sZW5ndGgmJih0aGlzLmhlYWRlclRlbXBsYXRlPXRoaXMuX3ByZXBhcmVIZWFkZXJUZW1wbGF0ZSgpLHRoaXMuZm9vdGVyVGVtcGxhdGU9dGhpcy5fcHJlcGFyZUZvb3RlclRlbXBsYXRlKCksdGhpcy50ZW1wbGF0ZT10aGlzLl9wcmVwYXJlQm9keVRlbXBsYXRlKCkpfXRoaXMuX3RlbXBsYXRlT2JzZXJ2ZXI9UG9seW1lci5FbGVtZW50P25ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcyxiKTpQb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoYil9LF9wcmVwYXJlSGVhZGVyVGVtcGxhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlcGFyZVRlbXBsYXRpemVyKHRoaXMuX2ZpbmRUZW1wbGF0ZSgidGVtcGxhdGUuaGVhZGVyIil8fG51bGwsCnt9KX0sX3ByZXBhcmVGb290ZXJUZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCJ0ZW1wbGF0ZS5mb290ZXIiKXx8bnVsbCx7fSl9LF9wcmVwYXJlQm9keVRlbXBsYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoInRlbXBsYXRlOm5vdCguaGVhZGVyKTpub3QoLmZvb3RlcikiLHt9KSl9LF9wcmVwYXJlVGVtcGxhdGl6ZXI6ZnVuY3Rpb24oYixkKXtpZihiJiYhYi50ZW1wbGF0aXplcil7dmFyIGY9bmV3IHZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyO2YuZGF0YUhvc3Q9dGhpcy5kYXRhSG9zdDtmLl9pbnN0YW5jZVByb3BzPWR8fGYuX2luc3RhbmNlUHJvcHM7Zi50ZW1wbGF0ZT1iO2IudGVtcGxhdGl6ZXI9Zn1yZXR1cm4gYn0sX3NlbGVjdEZpcnN0VGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKGIpLApmdW5jdGlvbihkKXtyZXR1cm4gUG9seW1lci5kb20oZCkucGFyZW50Tm9kZT09PXRoaXN9LmJpbmQodGhpcykpWzBdfSxfZmluZFRlbXBsYXRlOmZ1bmN0aW9uKGIpeyhiPXRoaXMuX3NlbGVjdEZpcnN0VGVtcGxhdGUoYikpJiZ0aGlzLmRhdGFIb3N0JiYoYi5fcm9vdERhdGFIb3N0PXRoaXMuZGF0YUhvc3QuX3Jvb3REYXRhSG9zdHx8dGhpcy5kYXRhSG9zdCk7cmV0dXJuIGJ9LF9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiaGVhZGVyVGVtcGxhdGUiLHZhbHVlOmJ9KX0sX2Zvb3RlclRlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJmb290ZXJUZW1wbGF0ZSIsdmFsdWU6Yn0pfSxfZmxleEdyb3dDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImZsZXhHcm93Iix2YWx1ZTpifSl9LF93aWR0aENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIiwKe3BhdGg6IndpZHRoIix2YWx1ZTpifSl9LF9sYXN0RnJvemVuQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJsYXN0RnJvemVuIix2YWx1ZTpifSl9fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOnt3aWR0aDp7dHlwZTpTdHJpbmcsdmFsdWU6IjEwMHB4In0sZmxleEdyb3c6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LHRlbXBsYXRlOnt0eXBlOk9iamVjdH19LG9ic2VydmVyczoiX2ZsZXhHcm93Q2hhbmdlZChmbGV4R3Jvdyk7X3dpZHRoQ2hhbmdlZCh3aWR0aCk7X3RlbXBsYXRlQ2hhbmdlZCh0ZW1wbGF0ZSk7X2Zyb3plbkNoYW5nZWQoZnJvemVuLCBpc0F0dGFjaGVkKTtfaGlkZGVuQ2hhbmdlZChoaWRkZW4pO19vcmRlckNoYW5nZWQoX29yZGVyKTtfcmVvcmRlclN0YXR1c0NoYW5nZWQoX3Jlb3JkZXJTdGF0dXMpO19yZXNpemFibGVDaGFuZ2VkKHJlc2l6YWJsZSkiLnNwbGl0KCI7IiksX2Zyb3plbkNoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodm9pZCAwPT09dGhpcy5fb2xkRnJvemVuJiYhMT09PWJ8fHRoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJmcm96ZW4iLHZhbHVlOmJ9KSx0aGlzLl9vbGRGcm96ZW49Yil9LF90ZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7YiYmYi50ZW1wbGF0aXplciYmUG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZChiLnRlbXBsYXRpemVyKTt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJ0ZW1wbGF0ZSIsdmFsdWU6Yn0se2J1YmJsZXM6ITF9KX0sX2hpZGRlbkNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiaGlkZGVuIix2YWx1ZTpifSl9LF9vcmRlckNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoib3JkZXIiLHZhbHVlOmJ9KX0sX3Jlb3JkZXJTdGF0dXNDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6InJlb3JkZXJTdGF0dXMiLHZhbHVlOmJ9KX0sX3Jlc2l6YWJsZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIiwKe3BhdGg6InJlc2l6YWJsZSIsdmFsdWU6Yn0pfX07dmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3I9W3ZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJhc2VCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi5odG1sLTIuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLWNvbHVtbiIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CZWhhdmlvcl19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1hcnJheS1kYXRhLXByb3ZpZGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkFycmF5RGF0YVByb3ZpZGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2l0ZW1zOkFycmF5fSxvYnNlcnZlcnM6WyJfaXRlbXNDaGFuZ2VkKGl0ZW1zLCBpdGVtcy4qKSJdLF9pdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5zaXplPShifHxbXSkubGVuZ3RoLHRoaXMuZGF0YVByb3ZpZGVyPXRoaXMuZGF0YVByb3ZpZGVyfHx0aGlzLl9hcnJheURhdGFQcm92aWRlcix0aGlzLmNsZWFyQ2FjaGUoKSl9LF9hcnJheURhdGFQcm92aWRlcjpmdW5jdGlvbihiLGQpe3ZhciBmPSh0aGlzLml0ZW1zfHxbXSkuc2xpY2UoMCk7dGhpcy5fY2hlY2tQYXRocyh0aGlzLl9maWx0ZXJzLCJmaWx0ZXJpbmciLGYpJiYoZj10aGlzLl9maWx0ZXIoZikpO3RoaXMuc2l6ZT1mLmxlbmd0aDtiLnNvcnRPcmRlcnMubGVuZ3RoJiZ0aGlzLl9jaGVja1BhdGhzKHRoaXMuX3NvcnRlcnMsInNvcnRpbmciLGYpJiYoZj1mLnNvcnQodGhpcy5fbXVsdGlTb3J0LmJpbmQodGhpcykpKTsKdmFyIGg9Yi5wYWdlKmIucGFnZVNpemU7ZChmLnNsaWNlKGgsaCtiLnBhZ2VTaXplKSxmLmxlbmd0aCl9LF9jaGVja1BhdGhzOmZ1bmN0aW9uKGIsZCxmKXtpZighZi5sZW5ndGgpcmV0dXJuITE7dmFyIGg9ITAsaztmb3IoayBpbiBiKXt2YXIgdD1iW2tdLnBhdGg7aWYodCYmLTEhPT10LmluZGV4T2YoIi4iKSl7dmFyIGw9dC5yZXBsYWNlKC9cLlteXC5dKiQvLCIiKTt2b2lkIDA9PT1Qb2x5bWVyLkJhc2UuZ2V0KGwsZlswXSkmJihjb25zb2xlLndhcm4oJ1BhdGggIicrdCsnIiB1c2VkIGZvciAnK2QrIiBkb2VzIG5vdCBleGlzdCBpbiBhbGwgb2YgdGhlIGl0ZW1zLCAiK2QrIiBpcyBkaXNhYmxlZC4iKSxoPSExKX19cmV0dXJuIGh9LF9tdWx0aVNvcnQ6ZnVuY3Rpb24oYixkKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoZnVuY3Rpb24oZil7cmV0dXJuImFzYyI9PT1mLmRpcmVjdGlvbj90aGlzLl9jb21wYXJlKFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLGIpLFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLApkKSk6ImRlc2MiPT09Zi5kaXJlY3Rpb24/dGhpcy5fY29tcGFyZShQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxkKSxQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxiKSk6MH0sdGhpcykucmVkdWNlKGZ1bmN0aW9uKGYsaCl7cmV0dXJuIGY/ZjpofSwwKX0sX25vcm1hbGl6ZUVtcHR5VmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PVt2b2lkIDAsbnVsbF0uaW5kZXhPZihiKT8iIjppc05hTihiKT9iLnRvU3RyaW5nKCk6Yn0sX2NvbXBhcmU6ZnVuY3Rpb24oYixkKXtiPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoYik7ZD10aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKGQpO3JldHVybiBiPGQ/LTE6Yj5kPzE6MH0sX2ZpbHRlcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIDA9PT10aGlzLl9maWx0ZXJzLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4tMT09PXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoUG9seW1lci5CYXNlLmdldChmLnBhdGgsZCkpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGYudmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKX0uYmluZCh0aGlzKSkubGVuZ3RofSwKdGhpcyl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1keW5hbWljLWNvbHVtbnMtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuRHluYW1pY0NvbHVtbnNCZWhhdmlvcj17cmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9hZGROb2RlT2JzZXJ2ZXIoKX0sX2hhc0NvbHVtbkdyb3VwczpmdW5jdGlvbihiKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKylpZigidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWJbZF0ubG9jYWxOYW1lKXJldHVybiEwO3JldHVybiExfSxfZ2V0Q2hpbGRDb2x1bW5zOmZ1bmN0aW9uKGIpe3JldHVybiBQb2x5bWVyLmRvbShiKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIil9LF9mbGF0dGVuQ29sdW1uR3JvdXBzOmZ1bmN0aW9uKGIpe3JldHVybiBiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4idmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWQubG9jYWxOYW1lP3RoaXMuX2dldENoaWxkQ29sdW1ucyhkKTpbZF19LHRoaXMpLnJlZHVjZShmdW5jdGlvbihkLApmKXtyZXR1cm4gZC5jb25jYXQoZil9LFtdKX0sX2dldENvbHVtblRyZWU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9W10sZD10aGlzLnF1ZXJ5QWxsRWZmZWN0aXZlQ2hpbGRyZW4oInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIik7Oyl7Yi5wdXNoKGQpO2lmKCF0aGlzLl9oYXNDb2x1bW5Hcm91cHMoZCkpYnJlYWs7ZD10aGlzLl9mbGF0dGVuQ29sdW1uR3JvdXBzKGQpfXJldHVybiBifSxfdXBkYXRlQ29sdW1uVHJlZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2dldENvbHVtblRyZWUoKTt0aGlzLl9hcnJheUVxdWFscyhiLHRoaXMuX2NvbHVtblRyZWUpfHwodGhpcy5fY29sdW1uVHJlZT1iKX0sX2FkZE5vZGVPYnNlcnZlcjpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPVBvbHltZXIuZG9tKHRoaXMpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe3JldHVybiBmLm5vZGVUeXBlPT09Ck5vZGUuRUxFTUVOVF9OT0RFJiYvXnZhYWRpbi1ncmlkLShjb2x1bW58c2VsZWN0aW9uKS9pLnRlc3QoZi5sb2NhbE5hbWUpfSgwPGIuYWRkZWROb2Rlcy5maWx0ZXIoZCkubGVuZ3RofHwwPGIucmVtb3ZlZE5vZGVzLmZpbHRlcihkKS5sZW5ndGgpJiZ0aGlzLl91cGRhdGVDb2x1bW5UcmVlKCk7KFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlU2hhZG93fHxQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdykmJlBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuJC5mb290ZXJGb2N1c1RyYXApO3RoaXMuZGVib3VuY2UoImNoZWNrLWltcG9ydHMiLHRoaXMuX2NoZWNrSW1wb3J0cywyRTMpfS5iaW5kKHRoaXMpKX0sX2FycmF5RXF1YWxzOmZ1bmN0aW9uKGIsZCl7aWYoIWJ8fCFkfHxiLmxlbmd0aCE9ZC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBmPTAsaD1iLmxlbmd0aDtmPGg7ZisrKWlmKGJbZl1pbnN0YW5jZW9mIEFycmF5JiZkW2ZdaW5zdGFuY2VvZiBBcnJheSl7aWYoIXRoaXMuX2FycmF5RXF1YWxzKGJbZl0sCmRbZl0pKXJldHVybiExfWVsc2UgaWYoYltmXSE9ZFtmXSlyZXR1cm4hMTtyZXR1cm4hMH0sX2NoZWNrSW1wb3J0czpmdW5jdGlvbigpe1sidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiwidmFhZGluLWdyaWQtc29ydGVyIiwidmFhZGluLWdyaWQtZmlsdGVyIiwidmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiJdLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvcihiKTshZHx8KFBvbHltZXIuaXNJbnN0YW5jZT9Qb2x5bWVyLmlzSW5zdGFuY2UoZCk6ZCBpbnN0YW5jZW9mIFBvbHltZXIuRWxlbWVudCl8fGNvbnNvbGUud2FybigiTWFrZSBzdXJlIHlvdSBoYXZlIGltcG9ydGVkIHRoZSByZXF1aXJlZCBtb2R1bGUgZm9yIFx4M2MiK2IrIlx4M2UgZWxlbWVudC4iKX0sdGhpcyl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zb3J0LWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlNvcnRCZWhhdmlvcj17cHJvcGVydGllczp7bXVsdGlTb3J0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zb3J0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfcHJldmlvdXNTb3J0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsic29ydGVyLWNoYW5nZWQiOiJfb25Tb3J0ZXJDaGFuZ2VkIn0scmVhZHk6ZnVuY3Rpb24oKXtQb2x5bWVyLkVsZW1lbnQmJiFQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvdyYmdGhpcy5hc3luYyhmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoInZhYWRpbi1ncmlkLXNvcnRlciIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYixmdW5jdGlvbihkKXtkLmZpcmUmJmQuZmlyZSgic29ydGVyLWNoYW5nZWQiKX0pfSl9LF9vblNvcnRlckNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9CmIudGFyZ2V0O3RoaXMuX3JlbW92ZUFycmF5SXRlbSh0aGlzLl9zb3J0ZXJzLGQpO2QuX29yZGVyPW51bGw7dGhpcy5tdWx0aVNvcnQ/KGQuZGlyZWN0aW9uJiZ0aGlzLl9zb3J0ZXJzLnVuc2hpZnQoZCksdGhpcy5fc29ydGVycy5mb3JFYWNoKGZ1bmN0aW9uKGYsaCl7Zi5fb3JkZXI9MTx0aGlzLl9zb3J0ZXJzLmxlbmd0aD9oOm51bGx9LHRoaXMpKToodGhpcy5fc29ydGVycy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuX29yZGVyPW51bGw7Zi5kaXJlY3Rpb249bnVsbH0pLGQuZGlyZWN0aW9uJiYodGhpcy5fc29ydGVycz1bZF0pKTtiLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZKU09OLnN0cmluZ2lmeSh0aGlzLl9wcmV2aW91c1NvcnRlcnMpIT09SlNPTi5zdHJpbmdpZnkodGhpcy5fbWFwU29ydGVycygpKSYmdGhpcy5jbGVhckNhY2hlKCk7dGhpcy5fcHJldmlvdXNTb3J0ZXJzPXRoaXMuX21hcFNvcnRlcnMoKX0sX21hcFNvcnRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoZnVuY3Rpb24oYil7cmV0dXJue3BhdGg6Yi5wYXRoLApkaXJlY3Rpb246Yi5kaXJlY3Rpb259fSl9LF9yZW1vdmVBcnJheUl0ZW06ZnVuY3Rpb24oYixkKXtkPWIuaW5kZXhPZihkKTstMTxkJiZiLnNwbGljZShkLDEpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZmlsdGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuRmlsdGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e19maWx0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsiZmlsdGVyLWNoYW5nZWQiOiJfZmlsdGVyQ2hhbmdlZCJ9LF9maWx0ZXJDaGFuZ2VkOmZ1bmN0aW9uKGIpey0xPT09dGhpcy5fZmlsdGVycy5pbmRleE9mKGIudGFyZ2V0KSYmdGhpcy5fZmlsdGVycy5wdXNoKGIudGFyZ2V0KTtiLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZ0aGlzLmNsZWFyQ2FjaGUoKX0sX21hcEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmlsdGVycy5tYXAoZnVuY3Rpb24oYil7cmV0dXJue3BhdGg6Yi5wYXRoLHZhbHVlOmIudmFsdWV9fSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZCIscHJvcGVydGllczp7X2NvbHVtblRyZWU6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxzaXplOk51bWJlcixfcm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdCxfYmluZERhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldEl0ZW0uYmluZCh0aGlzKX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlJvd0RldGFpbHNCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5EYXRhUHJvdmlkZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5EeW5hbWljQ29sdW1uc0JlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkFycmF5RGF0YVByb3ZpZGVyQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuU2VsZWN0aW9uQmVoYXZpb3IsCnZhYWRpbi5lbGVtZW50cy5ncmlkLlNvcnRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5GaWx0ZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5SZW9yZGVyaW5nQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJwcm9wZXJ0eS1jaGFuZ2VkIjoiX2NvbHVtblByb3BDaGFuZ2VkIiwiaXJvbi1yZXNpemUiOiJfZ3JpZFJlc2l6ZUhhbmRsZXIifSxfdXBkYXRlSXRlbTpmdW5jdGlvbihiLGQpe2Iuc3R5bGUubWluSGVpZ2h0PWQ/IiI6dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEF2ZXJhZ2UrInB4IjtiLml0ZW09ZDtiLnNlbGVjdGVkPXRoaXMuX2lzU2VsZWN0ZWQoZCk7Yi5leHBhbmRlZD10aGlzLl9pc0V4cGFuZGVkKGQpO2IuYWN0aXZlPW51bGwhPT1kJiZkPT10aGlzLmFjdGl2ZUl0ZW07Yi5mb2N1c2VkPWIuaW5kZXg9PT10aGlzLiQuaXRlbXMuX2ZvY3VzZWRSb3dJbmRleH0sX2dldENvbnRlbnRUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpO3RoaXMuX3Jvd0RldGFpbHNUZW1wbGF0ZT1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJ0ZW1wbGF0ZS5yb3ctZGV0YWlscyIpfHx2b2lkIDA7dGhpcy4kLnNjcm9sbGVyLnRhcmdldD10aGlzO251bGw9PT1kb2N1bWVudC5kb2N0eXBlJiZjb25zb2xlLndhcm4oJ1x4M2N2YWFkaW4tZ3JpZFx4M2UgcmVxdWlyZXMgdGhlICJzdGFuZGFyZHMgbW9kZSIgZGVjbGFyYXRpb24uIFBsZWFzZSBhZGQgXHgzYyFET0NUWVBFIGh0bWxceDNlIHRvIHRoZSBIVE1MIGRvY3VtZW50LicpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oYil7Il9jaGlsZENvbHVtbnMiPT09Yi5kZXRhaWwucGF0aCYmdGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9ncmlkUmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuJC5zY3JvbGxlci5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLHZpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cDpPYmplY3QsX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpyZy5YVHlwZS5TVEVQfSxfbm9NdWx0aUV4cGVyaW1lbnRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbmRleE9mU2Vzc2lvbjpPYmplY3QsX3Nlc3Npb25Hcm91cE5hbWVIYXNoOk51bWJlcixfcmVxdWVzdERhdGE6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oe3RhZzpiLHJ1bjpkfSk9PnRoaXMuYmFja2VuZC5saXN0TWV0cmljRXZhbHMoe2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWUsc2Vzc2lvbk5hbWU6ZCxtZXRyaWNOYW1lOmJ9KX19LF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybntzY2FsZTpiPT57Yj1KU09OLnBhcnNlKGIpWzFdOwpiPXRoaXMuX2luZGV4T2ZTZXNzaW9uLmdldChiKTtjb25zdCBkPXBmLnN0YW5kYXJkO3JldHVybiBkWyh0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaCtiKSVkLmxlbmd0aF19fX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6InJlZHJhdyJ9LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBDaGFuZ2VkKHNlc3Npb25Hcm91cC4qKSJdLHJlZHJhdygpe1BvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKGI9PmIucmVkcmF3KCkpfSxfc2Vzc2lvbkdyb3VwQ2hhbmdlZCgpe3RoaXMuc2Vzc2lvbkdyb3VwPyh0aGlzLl9pbmRleE9mU2Vzc2lvbj1uZXcgTWFwKHRoaXMuc2Vzc2lvbkdyb3VwLnNlc3Npb25zLm1hcCgoYixkKT0+W2IubmFtZSxkXSkpLHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoPXRmLmhwYXJhbXMudXRpbHMuaGFzaE9mU3RyaW5nKHRoaXMuc2Vzc2lvbkdyb3VwLm5hbWUpKToKKHRoaXMuX2luZGV4T2ZTZXNzaW9uPW5ldyBNYXAsdGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2g9MCk7UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYj0+e2NvbnN0IGQ9Yi5nZXQoInRhZyIpO2Iuc2V0KCJ0YWciLCIiKTtiLnNldCgidGFnIixkKX0pfSxfaGF2ZU1ldHJpY3MoKXtyZXR1cm4gdGhpcy52aXNpYmxlU2NoZW1hJiZBcnJheS5pc0FycmF5KHRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcykmJjA8dGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aH0sX2hhdmVNZXRyaWNzQW5kU2Vzc2lvbkdyb3VwKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbkdyb3VwJiZ0aGlzLl9oYXZlTWV0cmljcygpfSxfY29tcHV0ZVNlcmllc0ZvclNlc3Npb25Hcm91cE1ldHJpYyhiLGQpe3JldHVybiBudWxsPT09Ynx8bnVsbD09PWQ/W106Yi5zZXNzaW9ucy5maWx0ZXIoZj0+dm9pZCAwIT09dGYuaHBhcmFtcy51dGlscy5tZXRyaWNWYWx1ZUJ5TmFtZShmLm1ldHJpY1ZhbHVlcywKZC5uYW1lKSkubWFwKGY9Pih7dGFnOmQubmFtZSxydW46Zi5uYW1lfSkpfSxfY29tcHV0ZVRhZ01ldGFkYXRhKGIpe3JldHVybntkaXNwbGF5TmFtZTp0Zi5ocGFyYW1zLnV0aWxzLm1ldHJpY05hbWUoYiksZGVzY3JpcHRpb246Yi5kZXNjcmlwdGlvbnx8IiJ9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtdGFibGUtdmlldy90Zi1ocGFyYW1zLXRhYmxlLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy10YWJsZS12aWV3Iixwcm9wZXJ0aWVzOnt2aXNpYmxlU2NoZW1hOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LGVuYWJsZVNob3dNZXRyaWNzOkJvb2xlYW4sYmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nfSxvYnNlcnZlcnM6WyJfdmlzaWJsZVNjaGVtYU9yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodmlzaWJsZVNjaGVtYS4qLCBzZXNzaW9uR3JvdXBzLiopIl0sX3Zpc2libGVTY2hlbWFPclNlc3Npb25Hcm91cHNDaGFuZ2VkKCl7Y29uc3QgYj10aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLmdldCgiZXhwYW5kZWRJdGVtcyIpO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJleHBhbmRlZEl0ZW1zIixbXSk7UG9seW1lci5kb20uZmx1c2goKTtjb25zdCBkPW5ldyBNYXA7dGhpcy5zZXNzaW9uR3JvdXBzLmZvckVhY2goZj0+e2Quc2V0KGYubmFtZSxmKX0pO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJleHBhbmRlZEl0ZW1zIiwKYi5tYXAoZj0+ZC5nZXQoZi5uYW1lKSkuZmlsdGVyKEJvb2xlYW4pKX0sX2hwYXJhbU5hbWU6dGYuaHBhcmFtcy51dGlscy5ocGFyYW1OYW1lLF9tZXRyaWNOYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZSxfc2Vzc2lvbkdyb3VwSFBhcmFtKGIsZCl7cmV0dXJuIG51bGwhPWImJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLmhwYXJhbXMsZCk/dGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludChiLmhwYXJhbXNbZF0pOiIifSxfc2Vzc2lvbkdyb3VwTWV0cmljKGIsZCl7aWYobnVsbD09YilyZXR1cm4gbnVsbDtmb3IobGV0IGY9MDtmPGIubWV0cmljVmFsdWVzLmxlbmd0aDsrK2Ype2xldCBoPWIubWV0cmljVmFsdWVzW2ZdO2lmKGgubmFtZS5ncm91cD09PWQuZ3JvdXAmJmgubmFtZS50YWc9PWQudGFnKXJldHVybiB0Zi5ocGFyYW1zLnV0aWxzLnByZXR0eVByaW50KGgudmFsdWUpfXJldHVybiIifSxfcm93TnVtYmVyKGIpe3JldHVybiBiKzF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiLHByb3BlcnRpZXM6e3Nlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sdmlzaWJsZVNjaGVtYTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LF9wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIHZvaWQgMCE9PWImJm51bGwhPT1iJiZ2b2lkIDAhPT1kJiZudWxsIT09ZH0sX3NpbmdsZXRvblNlc3Npb25Hcm91cHM6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PT1ifHx2b2lkIDA9PT1iP1tdOltiXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L3V0aWxzLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChrLHQsbCl7ZnVuY3Rpb24gcCgpe2lmKDA9PT1rLmxlbmd0aClyZXR1cm5bMSwyXTtjb25zdCBbbSxuXT1kMy5leHRlbnQoayk7cmV0dXJuIG0hPT1uP1ttLG5dOjA8bT9bLjUqbSwxLjUqbV06MD5tP1sxLjUqbSwuNSptXTpbLTEsMV19aWYoIkxJTkVBUiI9PT1sKXJldHVybiBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihwKCkpLnJhbmdlKFt0LDBdKTtpZigiTE9HIj09PWwpcmV0dXJuIGw9cCgpLDA+PWxbMF0mJjA8PWxbMV0/aChrLHQsIkxJTkVBUiIpOmQzLnNjYWxlTG9nKCkuZG9tYWluKGwpLnJhbmdlKFt0LDBdKTtpZigiUVVBTlRJTEUiPT09bClyZXR1cm4gbD1kMy5yYW5nZSgyMCkubWFwKG09PnQtbSp0LzE5KSwwPT09ay5sZW5ndGgmJihrPVsxXSksZDMuc2NhbGVRdWFudGlsZSgpLmRvbWFpbihfLnVuaXEoaykpLnJhbmdlKGwpO2lmKCJOT05fTlVNRVJJQyI9PT1sKXJldHVybiBkMy5zY2FsZVBvaW50KCkuZG9tYWluKF8udW5pcShrLnNvcnQoKSkpLnJhbmdlKFt0LAowXSkucGFkZGluZyguMSk7dGhyb3cgUmFuZ2VFcnJvcigiVW5rbm93biBzY2FsZTogIitsKTt9Zi5maW5kQ2xvc2VzdFBhdGg9ZnVuY3Rpb24oayx0LGwpe2Z1bmN0aW9uIHAoeSx3LEMsRyl7Y29uc3QgRD15LUMsQj13LUc7Qz1tLUM7Rz1uLUc7Y29uc3QgST0oRCpDK0IqRykvKEQqRCtCKkIpO3JldHVybiAwPj1JP2IuaHBhcmFtcy51dGlscy5sMk5vcm1TcXVhcmVkKEMsRyk6MTw9ST9iLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZCh5LW0sdy1uKTpiLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZChDLUkqRCxHLUkqQil9aWYoMj50Lmxlbmd0aClyZXR1cm4gY29uc29sZS5lcnJvcigiTGVzcyB0aGFuIHR3byBheGVzIGluIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QuIiksbnVsbDtjb25zdCBtPWxbMF0sbj1sWzFdO2lmKG08PXRbMF18fG0+PXRbdC5sZW5ndGgtMV0pcmV0dXJuIG51bGw7Y29uc3QgcT1fLnNvcnRlZEluZGV4KHQsbSk7Y29uc29sZS5hc3NlcnQoMDxxKTsKY29uc29sZS5hc3NlcnQocTx0Lmxlbmd0aCk7Y29uc3QgdT1xLTE7bGV0IHg9bnVsbCxBPW51bGw7ay5mb3JFYWNoKHk9Pntjb25zdCB3PXAoeS5jb250cm9sUG9pbnRzW3VdWzBdLHkuY29udHJvbFBvaW50c1t1XVsxXSx5LmNvbnRyb2xQb2ludHNbcV1bMF0seS5jb250cm9sUG9pbnRzW3FdWzFdKTsxMDA8d3x8IShudWxsPT09eHx8dzx4KXx8KHg9dyxBPXkpfSk7cmV0dXJuIEF9O2YucG9pbnRTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHQsbCl7cmV0dXJuIGsuZG9tYWluKCkuZmlsdGVyKHA9PntwPWsocCk7cmV0dXJuIHQ8PXAmJnA8PWx9KX07Zi5xdWFudGlsZVNjYWxlSW52ZXJzZUltYWdlPWZ1bmN0aW9uKGssdCxsKXtjb25zdCBwPWsucmFuZ2UoKSxtPXAuZmlsdGVyKG49PnQ8PW4mJm48PWwpLm1hcChuPT57Y29uc3QgcT1rLmludmVydEV4dGVudChuKTtyZXR1cm4gbj09PXBbcC5sZW5ndGgtMV0/W3FbMF0scVsxXSsxXTpxfSk7cmV0dXJuIDA9PW0ubGVuZ3RoP1swLAowXTpkMy5leHRlbnQoZDMubWVyZ2UobSkpfTtmLmNvbnRpbnVvdXNTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHQsbCl7cmV0dXJuW2suaW52ZXJ0KHQpLGsuaW52ZXJ0KGwpXS5zb3J0KChwLG0pPT5wLW0pfTtmLmNyZWF0ZUF4aXNTY2FsZT1ofSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvYXhlcy5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKHEpe3JldHVybiBudWxsIT09cS5zb3VyY2VFdmVudH1sZXQgazsoZnVuY3Rpb24ocSl7cS5MSU5FQVI9IkxJTkVBUiI7cS5MT0c9IkxPRyI7cS5RVUFOVElMRT0iUVVBTlRJTEUiO3EuTk9OX05VTUVSSUM9Ik5PTl9OVU1FUklDIn0pKGs9Zi5TY2FsZVR5cGV8fChmLlNjYWxlVHlwZT17fSkpO2NsYXNzIHR7aXNQYXNzaW5nKCl7cmV0dXJuITB9fWNsYXNzIGx7Y29uc3RydWN0b3IocSx1LHgsQSl7dGhpcy5fbG93ZXI9cTt0aGlzLl91cHBlcj11O3RoaXMuX2xvd2VyT3Blbj14O3RoaXMuX3VwcGVyT3Blbj1BfWlzUGFzc2luZyhxKXtyZXR1cm4gdGhpcy5fYmVmb3JlKHRoaXMuX2xvd2VyLHEsIXRoaXMuX2xvd2VyT3BlbikmJnRoaXMuX2JlZm9yZShxLHRoaXMuX3VwcGVyLCF0aGlzLl91cHBlck9wZW4pfV9iZWZvcmUocSx1LHgpe3JldHVybiB4P3E8PXU6cTx1fX1jbGFzcyBwe2NvbnN0cnVjdG9yKHEpe3RoaXMuX2RvbWFpblNldD0KcX1pc1Bhc3NpbmcocSl7cmV0dXJuLTEhPT10aGlzLl9kb21haW5TZXQuZmluZEluZGV4KHU9PnU9PT1xKX19Y2xhc3MgbXtjb25zdHJ1Y3RvcihxLHUseCxBKXt0aGlzLl9zdmdQcm9wcz1xO3RoaXMuX3NjaGVtYT11O3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlcj14O3RoaXMuX2NvbEluZGV4PUE7dGhpcy5faXNEaXNwbGF5ZWQ9ITE7dGhpcy5fc2NhbGVUeXBlPXRoaXMuX3lTY2FsZT1udWxsO3RoaXMuc2V0QnJ1c2hTZWxlY3Rpb24obnVsbCl9Y29sSW5kZXgoKXtyZXR1cm4gdGhpcy5fY29sSW5kZXh9eVNjYWxlKCl7cmV0dXJuIHRoaXMuX3lTY2FsZX1zY2FsZVR5cGUoKXtyZXR1cm4gdGhpcy5fc2NhbGVUeXBlfWJydXNoU2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2JydXNoU2VsZWN0aW9ufWlzRGlzcGxheWVkKCl7cmV0dXJuIHRoaXMuX2lzRGlzcGxheWVkfXNldEJydXNoU2VsZWN0aW9uKHEpe3RoaXMuX2JydXNoU2VsZWN0aW9uPXE7dGhpcy5fYnJ1c2hGaWx0ZXI9dGhpcy5fYnVpbGRCcnVzaEZpbHRlcih0aGlzLmJydXNoU2VsZWN0aW9uKCksCnRoaXMuc2NhbGVUeXBlKCksdGhpcy55U2NhbGUoKSl9c2V0RG9tYWluQW5kU2NhbGUocSx1KXt0aGlzLl9zY2FsZVR5cGU9dTt0aGlzLl95U2NhbGU9Yi5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LmNyZWF0ZUF4aXNTY2FsZShxLnNsaWNlKCksdGhpcy5fc3ZnUHJvcHMuaGVpZ2h0LHRoaXMuc2NhbGVUeXBlKCkpO3RoaXMuX2JydXNoRmlsdGVyPXRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLHRoaXMuc2NhbGVUeXBlKCksdGhpcy55U2NhbGUoKSl9YnJ1c2hGaWx0ZXIoKXtyZXR1cm4gdGhpcy5fYnJ1c2hGaWx0ZXJ9dXBkYXRlRE9NKHEpe3ZhciB1PWQzLmF4aXNMZWZ0KHRoaXMueVNjYWxlKCkpO3RoaXMuc2NhbGVUeXBlKCk9PT1rLlFVQU5USUxFJiYodT11LnRpY2tWYWx1ZXModGhpcy55U2NhbGUoKS5xdWFudGlsZXMoKSkudGlja0Zvcm1hdChkMy5mb3JtYXQoIi0uNmciKSkpO3ZhciB4PWQzLnNlbGVjdChxKTt4LnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpOwp4LmFwcGVuZCgiZyIpLmNsYXNzZWQoImF4aXMiLCEwKS5jYWxsKHUpLmFwcGVuZCgidGV4dCIpLmNsYXNzZWQoImF4aXMtdGl0bGUiLCEwKS5zdHlsZSgiY3Vyc29yIiwibW92ZSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoInkiLC05KS50ZXh0KEE9PmIuaHBhcmFtcy51dGlscy5zY2hlbWFDb2x1bW5OYW1lKHRoaXMuX3NjaGVtYSxBKSk7eC5jYWxsKGQzLmRyYWcoKS5vbigic3RhcnQiLCgpPT57cS5zZXRBdHRyaWJ1dGUoImlzLWRyYWdnaW5nIiwiIik7dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZ1N0YXJ0KHRoaXMuY29sSW5kZXgoKSl9KS5vbigiZHJhZyIsKCk9PnRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWcoZDMuZXZlbnQueCkpLm9uKCJlbmQiLCgpPT57dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZ0VuZCgpO3EucmVtb3ZlQXR0cmlidXRlKCJpcy1kcmFnZ2luZyIpfSkpO3U9ZDMuYnJ1c2hZKCkuZXh0ZW50KFtbLTgsMF0sCls4LHRoaXMuX3N2Z1Byb3BzLmhlaWdodCsxXV0pLm9uKCJzdGFydCIsKCk9PntoKGQzLmV2ZW50KSYmKHEuc2V0QXR0cmlidXRlKCJpcy1icnVzaGluZyIsIiIpLHRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkJydXNoQ2hhbmdlZCh0aGlzLmNvbEluZGV4KCkpKX0pLm9uKCJicnVzaCIsKCk9PntpZihoKGQzLmV2ZW50KSl0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKX0pLm9uKCJlbmQiLCgpPT57aChkMy5ldmVudCkmJih0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKSxxLnJlbW92ZUF0dHJpYnV0ZSgiaXMtYnJ1c2hpbmciKSl9KTt4PWQzLnNlbGVjdChxKS5hcHBlbmQoImciKS5jbGFzc2VkKCJicnVzaCIsITApO3guY2FsbCh1KTt1Lm1vdmUoeCx0aGlzLmJydXNoU2VsZWN0aW9uKCkpfXNldERpc3BsYXllZChxKXt0aGlzLl9pc0Rpc3BsYXllZD1xfV9idWlsZEJydXNoRmlsdGVyKHEsCnUseCl7aWYobnVsbD09PXEpcmV0dXJuIG5ldyB0O2lmKG51bGw9PT11KXJldHVybiBjb25zb2xlLmVycm9yKCJTY2FsZSB0eXBlIGlzIG51bGwsIGJ1dCBicnVzaFNlbGVjdGlvbiBpc24ndDogIixxKSxuZXcgdDtzd2l0Y2godSl7Y2FzZSBrLkxJTkVBUjpjYXNlIGsuTE9HOntjb25zdCBbQSx5XT1iLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuY29udGludW91c1NjYWxlSW52ZXJzZUltYWdlKHgscVswXSxxWzFdKTtyZXR1cm4gbmV3IGwoQSx5LCExLCExKX1jYXNlIGsuUVVBTlRJTEU6e2NvbnN0IFtBLHldPWIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5xdWFudGlsZVNjYWxlSW52ZXJzZUltYWdlKHgscVswXSxxWzFdKTtyZXR1cm4gbmV3IGwoQSx5LCExLCEwKX1jYXNlIGsuTk9OX05VTUVSSUM6cmV0dXJuIG5ldyBwKGIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5wb2ludFNjYWxlSW52ZXJzZUltYWdlKHgscVswXSxxWzFdKSl9Y29uc29sZS5lcnJvcigiVW5rbm93biBzY2FsZSB0eXBlOiAiLAp1KTtyZXR1cm4gbmV3IHR9fWYuQXhpcz1tO2NsYXNzIG57Y29uc3RydWN0b3IocSx1LHgpe3RoaXMuX3N2Z1Byb3BzPXE7dGhpcy5fc2NoZW1hPXU7dGhpcy5fYXhlcz10aGlzLl9jcmVhdGVBeGVzKHgpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zPWQzLnNjYWxlUG9pbnQoKS5yYW5nZShbMSx0aGlzLl9zdmdQcm9wcy53aWR0aC0xXSkucGFkZGluZyguNSk7dGhpcy5fZHJhZ2dlZEF4aXM9bnVsbDt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5heGlzLXBhcmVudCIpLnJlbW92ZSgpO3RoaXMuX3BhcmVudHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoIi5heGlzLXBhcmVudCIpfXVwZGF0ZUF4ZXMocSx1KXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTtjb25zdCB4PW5ldyBTZXQ7cS5jb2x1bW5zLmZvckVhY2goeT0+e2NvbnN0IHc9eS5hYnNvbHV0ZUluZGV4O2xldCBDPXRoaXMuX2F4ZXNbd107Qy5zZXREaXNwbGF5ZWQoITApOwpjb25zdCBHPXUubWFwKEQ9PmIuaHBhcmFtcy51dGlscy5jb2x1bW5WYWx1ZUJ5SW5kZXgodGhpcy5fc2NoZW1hLEQsdykpO0Muc2V0RG9tYWluQW5kU2NhbGUoRyx5LnNjYWxlKTt4LmFkZCh3KX0pO3RoaXMuX2F4ZXMuZm9yRWFjaCh5PT57eC5oYXMoeS5jb2xJbmRleCgpKXx8eS5zZXREaXNwbGF5ZWQoITEpfSk7dGhpcy5fdXBkYXRlU3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMoeCk7dGhpcy5fcGFyZW50c1NlbD10aGlzLl9wYXJlbnRzU2VsLmRhdGEoQXJyYXkuZnJvbSh4KSx5PT55KTt0aGlzLl9wYXJlbnRzU2VsLmV4aXQoKS5yZW1vdmUoKTt0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3BhcmVudHNTZWwuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJheGlzLXBhcmVudCIsITApLm1lcmdlKHRoaXMuX3BhcmVudHNTZWwpO2NvbnN0IEE9dGhpczt0aGlzLl9wYXJlbnRzU2VsLmNhbGwoeT0+dGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHkpKS5lYWNoKGZ1bmN0aW9uKHkpe0EuX2F4ZXNbeV0udXBkYXRlRE9NKHRoaXMpfSl9bWFwVmlzaWJsZUF4ZXMocSl7cmV0dXJuIHRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpLm1hcCh1PT4KcSh0aGlzLmdldEF4aXNQb3NpdGlvbih1KSx0aGlzLl9heGVzW3VdKSl9YWxsVmlzaWJsZUF4ZXNTYXRpc2Z5KHEpe3JldHVybiB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5ldmVyeSh1PT5xKHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHUpLHRoaXMuX2F4ZXNbdV0pKX1nZXRBeGlzRm9yQ29sSW5kZXgocSl7cmV0dXJuIHRoaXMuX2F4ZXNbcV19ZHJhZ1N0YXJ0KHEpe2NvbnNvbGUuYXNzZXJ0KCF0aGlzLmlzQXhpc0RyYWdnaW5nKCkpO2NvbnNvbGUuYXNzZXJ0KHRoaXMuX2F4ZXNbcV0uaXNEaXNwbGF5ZWQoKSk7dGhpcy5fZHJhZ2dlZEF4aXM9dGhpcy5fYXhlc1txXTt0aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uPXRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zKHEpfWRyYWcocSl7dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj1xPU1hdGgubWluKE1hdGgubWF4KHEsMCksdGhpcy5fc3ZnUHJvcHMud2lkdGgpO3E9dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCk7CnEuc29ydCgodSx4KT0+dGhpcy5nZXRBeGlzUG9zaXRpb24odSktdGhpcy5nZXRBeGlzUG9zaXRpb24oeCkpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbihxKTt0aGlzLl91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00odGhpcy5fcGFyZW50c1NlbCl9ZHJhZ0VuZCgpe2NvbnNvbGUuYXNzZXJ0KHRoaXMuaXNBeGlzRHJhZ2dpbmcoKSk7dGhpcy5fZHJhZ2dlZEF4aXM9dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj1udWxsO3RoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh0aGlzLl9wYXJlbnRzU2VsLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApKX1pc0F4aXNEcmFnZ2luZygpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXN9Z2V0QXhpc1Bvc2l0aW9uKHEpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXMmJnRoaXMuX2RyYWdnZWRBeGlzLmNvbEluZGV4KCk9PT1xP3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb246dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMocSl9X3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHEpe3ZhciB1PQp0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5maWx0ZXIoeD0+cS5oYXMoeCkpO3U9QXJyYXkuZnJvbShuZXcgU2V0KFsuLi51LC4uLkFycmF5LmZyb20ocSldKSk7dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKHUpfV91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00ocSl7cS5hdHRyKCJ0cmFuc2Zvcm0iLHU9PmIuaHBhcmFtcy51dGlscy50cmFuc2xhdGVTdHIodGhpcy5nZXRBeGlzUG9zaXRpb24odSkpKX1fY3JlYXRlQXhlcyhxKXtyZXR1cm4gZDMucmFuZ2UoYi5ocGFyYW1zLnV0aWxzLm51bUNvbHVtbnModGhpcy5fc2NoZW1hKSkubWFwKHU9Pm5ldyBtKHRoaXMuX3N2Z1Byb3BzLHRoaXMuX3NjaGVtYSxxLHUpKX19Zi5BeGVzQ29sbGVjdGlvbj1ufSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvbGluZXMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7bGV0IGg7KGZ1bmN0aW9uKGwpe2xbbC5GT1JFR1JPVU5EPTBdPSJGT1JFR1JPVU5EIjtsW2wuQkFDS0dST1VORD0xXT0iQkFDS0dST1VORCJ9KShoPWYuTGluZVR5cGV8fChmLkxpbmVUeXBlPXt9KSk7Y2xhc3Mga3tjb25zdHJ1Y3RvcihsKXt2b2lkIDA9PT1sJiYobD1kMy5zZWxlY3RBbGwobnVsbCkpO2NvbnNvbGUuYXNzZXJ0KDE+PWwuc2l6ZSgpKTt0aGlzLl9zZXNzaW9uR3JvdXBTZWw9bH1zZXNzaW9uR3JvdXAoKXtyZXR1cm4gMT09PXRoaXMuX3Nlc3Npb25Hcm91cFNlbC5zaXplKCk/dGhpcy5fc2Vzc2lvbkdyb3VwU2VsLmRhdHVtKCk6bnVsbH1pc051bGwoKXtyZXR1cm4gbnVsbD09PXRoaXMuc2Vzc2lvbkdyb3VwKCl9c2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nlc3Npb25Hcm91cFNlbH1lcXVhbHNUbyhsKXtyZXR1cm4gdGhpcy5pc051bGwoKT9sLmlzTnVsbCgpOmwuaXNOdWxsKCk/ITE6bC5zZXNzaW9uR3JvdXAoKS5uYW1lPT0KdGhpcy5zZXNzaW9uR3JvdXAoKS5uYW1lfX1mLlNlc3Npb25Hcm91cEhhbmRsZT1rO2NsYXNzIHR7Y29uc3RydWN0b3IobCxwLG0pe3RoaXMuX3N2Z1Byb3BzPWw7dGhpcy5fc2NoZW1hPXA7dGhpcy5fYXhlc0NvbGxlY3Rpb249bTt0aGlzLl9zZXNzaW9uR3JvdXBzPVtdO3RoaXMuX3N2Z1Byb3BzLnN2Z0cuc2VsZWN0QWxsKCJnLmJhY2tncm91bmQiKS5yZW1vdmUoKTt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5mb3JlZ3JvdW5kIikucmVtb3ZlKCk7dGhpcy5fYmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImJhY2tncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKTt0aGlzLl9mZ1BhdGhzU2VsPXRoaXMuX3N2Z1Byb3BzLnN2Z0cuYXBwZW5kKCJnIikuY2xhc3NlZCgiZm9yZWdyb3VuZCIsITApLnNlbGVjdEFsbCgicGF0aCIpO3RoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPQpuZXcgazt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZT1uZXcgazt0aGlzLl9kM2xpbmU9ZDMubGluZSgpLmN1cnZlKGQzLmN1cnZlTGluZWFyKX1nZXRTZXNzaW9uR3JvdXBIYW5kbGUobCl7cmV0dXJuIG51bGw9PT1sfHx2b2lkIDA9PT1sP25ldyBrOm5ldyBrKHRoaXMuX2ZnUGF0aHNTZWwuZmlsdGVyKHA9PnAubmFtZT09PWwubmFtZSkpfWhpZGVCYWNrZ3JvdW5kTGluZXMoKXt0aGlzLl9iZ1BhdGhzU2VsLmF0dHIoInZpc2liaWxpdHkiLCJoaWRkZW4iKX1zaG93QmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IixudWxsKX1wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKXtyZXR1cm4gdGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlfXNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlfXJlY29tcHV0ZUNvbnRyb2xQb2ludHMobCxwPTApeyhsPT09aC5GT1JFR1JPVU5EPwp0aGlzLl9mZ1BhdGhzU2VsOnRoaXMuX2JnUGF0aHNTZWwpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihwKS5hdHRyKCJkIixtPT50aGlzLl9wYXRoREF0dHJpYnV0ZShtKSk7bD09PWguRk9SRUdST1VORCYmd2luZG93LnNldFRpbWVvdXQoKCk9Pntjb25zdCBtPXRoaXM7dGhpcy5fZmdQYXRoc1NlbC5lYWNoKGZ1bmN0aW9uKG4pe20uX3NldENvbnRyb2xQb2ludHNQcm9wZXJ0eSh0aGlzLG4pfSl9KX1yZWNvbXB1dGVGb3JlZ3JvdW5kTGluZXNWaXNpYmlsaXR5KCl7dGhpcy5fZmdQYXRoc1NlbC5jbGFzc2VkKCJpbnZpc2libGUtcGF0aCIsbD0+IXRoaXMuX2F4ZXNDb2xsZWN0aW9uLmFsbFZpc2libGVBeGVzU2F0aXNmeSgocCxtKT0+bS5icnVzaEZpbHRlcigpLmlzUGFzc2luZyhiLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxsLG0uY29sSW5kZXgoKSkpKSk7dGhpcy5fdXBkYXRlVmlzaWJsZUZnUGF0aHNTZWwoKX1zZXRGb3JlZ3JvdW5kTGluZXNDb2xvcihsLApwLG0pe2w9dGhpcy5fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24obCxwLG0pO3RoaXMuX2ZnUGF0aHNTZWwuYXR0cigic3Ryb2tlIixsKX1yZWRyYXcobCxwLG0sbil7Y29uc3QgcT10aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCksdT10aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZS5zZXNzaW9uR3JvdXAoKTt0aGlzLl9zZXNzaW9uR3JvdXBzPWw7dGhpcy5fZmdQYXRoc1NlbD10aGlzLl9yZWNvbXB1dGVQYXRoU2VsZWN0aW9uKHRoaXMuX2ZnUGF0aHNTZWwpO3RoaXMuX2JnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9iZ1BhdGhzU2VsKTt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUocSk7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUodSk7dGhpcy5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGguRk9SRUdST1VORCk7CnRoaXMucmVjb21wdXRlQ29udHJvbFBvaW50cyhoLkJBQ0tHUk9VTkQpO3RoaXMucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpO3RoaXMuc2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IocCxtLG4pfXVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cChsKXt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCExKTt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9bDt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCEwKX1jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpe3RoaXMudXBkYXRlUGVha2VkU2Vzc2lvbkdyb3VwKG5ldyBrKX11cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChsKXt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZS5zZWxlY3Rpb24oKS5jbGFzc2VkKCJzZWxlY3RlZC1wYXRoIiwhMSk7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9Cmw7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgic2VsZWN0ZWQtcGF0aCIsITApfWZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKGwscCl7Y29uc3QgbT10aGlzLl9heGVzQ29sbGVjdGlvbi5tYXBWaXNpYmxlQXhlcyhuPT5uKTtsPWIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5maW5kQ2xvc2VzdFBhdGgodGhpcy5fdmlzaWJsZUZnUGF0aHNTZWwubm9kZXMoKSxtLFtsLHBdKTtyZXR1cm4gbnVsbD09PWw/bmV3IGs6bmV3IGsoZDMuc2VsZWN0KGwpKX1fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24obCxwLG0pe2lmKG51bGw9PT1sKXJldHVybigpPT4icmVkIjtjb25zdCBuPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGIuaHBhcmFtcy51dGlscy5udW1lcmljQ29sdW1uRXh0ZW50KHRoaXMuX3NjaGVtYSx0aGlzLl9zZXNzaW9uR3JvdXBzLGwpKS5yYW5nZShbcCxtXSkuaW50ZXJwb2xhdGUoZDMuaW50ZXJwb2xhdGVMYWIpO3JldHVybiBxPT4KbihiLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxxLGwpKX1fcmVjb21wdXRlUGF0aFNlbGVjdGlvbihsKXtsPWwuZGF0YSh0aGlzLl9zZXNzaW9uR3JvdXBzLHA9PnAubmFtZSk7bC5leGl0KCkucmVtb3ZlKCk7cmV0dXJuIGwuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5tZXJnZShsKX1fc2V0Q29udHJvbFBvaW50c1Byb3BlcnR5KGwscCl7bC5jb250cm9sUG9pbnRzPXRoaXMuX2NvbXB1dGVDb250cm9sUG9pbnRzKHApfV9jb21wdXRlQ29udHJvbFBvaW50cyhsKXtyZXR1cm4gdGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMoKHAsbSk9PltwLG0ueVNjYWxlKCkoYi5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsbCxtLmNvbEluZGV4KCkpKV0pfV9wYXRoREF0dHJpYnV0ZShsKXtyZXR1cm4gdGhpcy5fZDNsaW5lKHRoaXMuX2NvbXB1dGVDb250cm9sUG9pbnRzKGwpKX1fdXBkYXRlVmlzaWJsZUZnUGF0aHNTZWwoKXt0aGlzLl92aXNpYmxlRmdQYXRoc1NlbD0KdGhpcy5fZmdQYXRoc1NlbC5maWx0ZXIoIjpub3QoLmludmlzaWJsZS1wYXRoKSIpfX1mLkxpbmVzQ29sbGVjdGlvbj10fSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvaW50ZXJhY3Rpb25fbWFuYWdlci5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjbGFzcyBoe2NvbnN0cnVjdG9yKHQsbCl7dGhpcy5zdmc9ZDMuc2VsZWN0KHQpO3Q9MTAwKmwrMjA7dGhpcy5zdmcuYXR0cigidmlld0JveCIsYDAgMCAke3R9ICR7MjQwfWApO3RoaXMuc3ZnLmF0dHIoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCIpO3RoaXMuc3ZnLnN0eWxlKCJtaW4td2lkdGgiLHQrInB4Iik7dGhpcy5zdmcuc3R5bGUoIm1pbi1oZWlnaHQiLCIyNDBweCIpO3RoaXMud2lkdGg9dC0xMC0xMDt0aGlzLmhlaWdodD0yMDA7dGhpcy5zdmdHPXRoaXMuc3ZnLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsYi5ocGFyYW1zLnV0aWxzLnRyYW5zbGF0ZVN0cigxMCwzMCkpfX1mLlNWR1Byb3BlcnRpZXM9aDtjbGFzcyBre2NvbnN0cnVjdG9yKHQsbCxwLG0pe3RoaXMuX3N2Z1Byb3BzPXQ7dGhpcy5fc2NoZW1hPWw7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCPXA7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0I9Cm07dGhpcy5fYXhlc0NvbGxlY3Rpb249bmV3IGYuQXhlc0NvbGxlY3Rpb24odCxsLHRoaXMpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbj1uZXcgZi5MaW5lc0NvbGxlY3Rpb24odCxsLHRoaXMuX2F4ZXNDb2xsZWN0aW9uKTt0aGlzLl9zdmdQcm9wcy5zdmcub24oImNsaWNrIiwoKT0+dGhpcy5vbkNsaWNrKCkpLm9uKCJtb3VzZW1vdmUgbW91c2VlbnRlciIsKCk9Pntjb25zdCBbbixxXT1kMy5tb3VzZSh0aGlzLl9zdmdQcm9wcy5zdmdHLm5vZGUoKSk7dGhpcy5vbk1vdXNlTW92ZWQobixxKX0pLm9uKCJtb3VzZWxlYXZlIiwoKT0+dGhpcy5vbk1vdXNlTGVhdmUoKSl9b25EcmFnU3RhcnQodCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ1N0YXJ0KHQpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5oaWRlQmFja2dyb3VuZExpbmVzKCl9b25EcmFnKHQpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWcodCk7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZi5MaW5lVHlwZS5GT1JFR1JPVU5EKX1vbkRyYWdFbmQoKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnRW5kKCk7CnRoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGYuTGluZVR5cGUuRk9SRUdST1VORCw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KCgpPT57dGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZi5MaW5lVHlwZS5CQUNLR1JPVU5EKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2hvd0JhY2tncm91bmRMaW5lcygpfSw1MDApfW9uQnJ1c2hDaGFuZ2VkKHQpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmdldEF4aXNGb3JDb2xJbmRleCh0KS5zZXRCcnVzaFNlbGVjdGlvbihkMy5ldmVudC5zZWxlY3Rpb24pO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVGb3JlZ3JvdW5kTGluZXNWaXNpYmlsaXR5KCl9b25Nb3VzZU1vdmVkKHQsbCl7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cCh0aGlzLl9saW5lc0NvbGxlY3Rpb24uZmluZENsb3Nlc3RTZXNzaW9uR3JvdXAodCxsKSk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25Nb3VzZUxlYXZlKCl7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpLmlzTnVsbCgpfHwKKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQihudWxsKSl9b25DbGljaygpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT09PXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpP3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChuZXcgZi5TZXNzaW9uR3JvdXBIYW5kbGUpOnRoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cCh0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpKX1vbk9wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKHQsCmwpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLnVwZGF0ZUF4ZXModCxsKTtjb25zdCBwPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSxtPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWRyYXcobCx2b2lkIDAhPT10LmNvbG9yQnlDb2x1bW5JbmRleD90LmNvbHVtbnNbdC5jb2xvckJ5Q29sdW1uSW5kZXhdLmFic29sdXRlSW5kZXg6bnVsbCx0Lm1pbkNvbG9yLHQubWF4Q29sb3IpO3AuZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKXx8dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSk7bS5lcXVhbHNUbyh0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fAp0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9c2NoZW1hKCl7cmV0dXJuIHRoaXMuX3NjaGVtYX19Zi5JbnRlcmFjdGlvbk1hbmFnZXI9a30pKGQucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChkLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdCIscHJvcGVydGllczp7c2Vzc2lvbkdyb3VwczpBcnJheSxvcHRpb25zOk9iamVjdCxzZWxlY3RlZFNlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbCxyZWFkT25seTohMCxub3RpZnk6ITB9LGNsb3Nlc3RTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxyZWRyYXdDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3ZhbGlkU2Vzc2lvbkdyb3VwczpBcnJheSxfaW50ZXJhY3Rpb25NYW5hZ2VyOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX29wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKG9wdGlvbnMuKiwgc2Vzc2lvbkdyb3Vwcy4qKSJdLF9vcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCgpe2lmKG51bGwhPT10aGlzLm9wdGlvbnMpe3ZhciBiPXRoaXMub3B0aW9ucy5jb25maWd1cmF0aW9uO2lmKHZvaWQgMD09PXRoaXMuX2ludGVyYWN0aW9uTWFuYWdlcnx8CiFfLmlzRXF1YWwodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLnNjaGVtYSgpLGIuc2NoZW1hKSl7ZDMuc2VsZWN0KHRoaXMuJC5zdmcpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO2NvbnN0IGQ9bmV3IHRmLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuU1ZHUHJvcGVydGllcyh0aGlzLiQuc3ZnLHRmLmhwYXJhbXMudXRpbHMubnVtQ29sdW1ucyhiLnNjaGVtYSkpO3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5zdmcsITApO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlcj1uZXcgdGYuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5JbnRlcmFjdGlvbk1hbmFnZXIoZCxiLnNjaGVtYSxmPT50aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKGYpLGY9PnRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkKGYpKX10aGlzLl9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCk7dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uT3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodGhpcy5vcHRpb25zLAp0aGlzLl92YWxpZFNlc3Npb25Hcm91cHMpO3RoaXMucmVkcmF3Q291bnQrK319LGNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKGIpe3RoaXMuX3NldENsb3Nlc3RTZXNzaW9uR3JvdXAoYil9LHNlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZChiKXt0aGlzLl9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChiKX0sX2NvbXB1dGVWYWxpZFNlc3Npb25Hcm91cHMoKXtjb25zdCBiPXRmLmhwYXJhbXMudXRpbHM7aWYodm9pZCAwPT09dGhpcy5zZXNzaW9uR3JvdXBzKXRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz12b2lkIDA7ZWxzZXt2YXIgZD10aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5zY2hlbWE7dGhpcy5fdmFsaWRTZXNzaW9uR3JvdXBzPXRoaXMuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoZj0+e2ZvcihsZXQgaD0wO2g8Yi5udW1Db2x1bW5zKGQpOysraClpZih0aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5jb2x1bW5zVmlzaWJpbGl0eVtoXSYmdm9pZCAwPT09Yi5jb2x1bW5WYWx1ZUJ5SW5kZXgoZCwKZixoKSlyZXR1cm4hMTtyZXR1cm4hMH0pfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXl9LF9jbG9zZXN0T3JTZWxlY3RlZDpmdW5jdGlvbihiLGQpe3JldHVybiBudWxsIT09Yj9iOmR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QvdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLHByb3BlcnRpZXM6e3Zpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXksb3B0aW9uczpPYmplY3Qsc2VsZWN0ZWRTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxjbG9zZXN0U2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sX2NvbnRhaW5lcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3N2Zzp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sd2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX2JydXNoZWRDZWxsSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9icnVzaFNlbGVjdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBzQ2hhbmdlZChzZXNzaW9uR3JvdXBzLiopIiwKIl92aXNpYmxlU2NoZW1hQ2hhbmdlZCh2aXNpYmxlU2NoZW1hLiopIiwiX3JlZHJhdyhvcHRpb25zLiopIl0scmVhZHkoKXt0aGlzLl9jb250YWluZXI9dGhpcy4kLmNvbnRhaW5lcjt0aGlzLl9zdmc9ZDMuc2VsZWN0KHRoaXMuJC5zdmcpO3RoaXMuX3JlZHJhdygpfSxfc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtudWxsIT09dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCYmdGhpcy5fc2V0U2VsZWN0ZWRTZXNzaW9uR3JvdXAodGYuaHBhcmFtcy51dGlscy5zZXNzaW9uR3JvdXBXaXRoTmFtZSh0aGlzLnNlc3Npb25Hcm91cHMsdGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cC5uYW1lKXx8bnVsbCk7dGhpcy5fcmVkcmF3KCl9LF92aXNpYmxlU2NoZW1hQ2hhbmdlZCgpe3RoaXMuX2JydXNoU2VsZWN0aW9uPXRoaXMuX2JydXNoZWRDZWxsSW5kZXg9bnVsbDt0aGlzLl9yZWRyYXcoKX0sX3JlZHJhdygpe3RoaXMuZGVib3VuY2UoIl9yZWRyYXciLCgpPT57Y29uc3QgYj10Zi5ocGFyYW1zLnV0aWxzOwp0aGlzLndpZHRoPU1hdGgubWF4KDE1MCpiLm51bVZpc2libGVDb2x1bW5zKHRoaXMudmlzaWJsZVNjaGVtYSksMTIwMCk7dGhpcy5oZWlnaHQ9TWF0aC5tYXgoMTEyLjUqYi5udW1WaXNpYmxlTWV0cmljcyh0aGlzLnZpc2libGVTY2hlbWEpLDQ4MCk7dGhpcy5fY29udGFpbmVyLnN0eWxlLndpZHRoPXRoaXMud2lkdGgrInB4Ijt0aGlzLl9jb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0KyJweCI7dGhpcy5fc3ZnLmF0dHIoIndpZHRoIix0aGlzLndpZHRoKS5hdHRyKCJoZWlnaHQiLHRoaXMuaGVpZ2h0KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dGhpcy5fZHJhdygpfSwxMDApfSxfZHJhdygpe2Z1bmN0aW9uIGIoa2Epe3JldHVybiJ4LWF4aXMtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gZChrYSl7cmV0dXJuIngtbGFiZWwtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gZihrYSl7cmV0dXJuInktYXhpcy1jbGlwLXBhdGgtIitrYX1mdW5jdGlvbiBoKGthKXtyZXR1cm4ieS1sYWJlbC1jbGlwLXBhdGgtIisKa2F9ZnVuY3Rpb24gayhrYSxZLEVhLHZhLHhhKXtFYT1NYXRoLmZsb29yKEVhL3ZhKTt2YT1ZLnNjYWxlKCk7aWYoIlFVQU5USUxFIj09PXhhKXtsZXQgQWE9dmEucXVhbnRpbGVzKCk7QWE9ZDMucmFuZ2UoMCxBYS5sZW5ndGgsTWF0aC5jZWlsKEFhLmxlbmd0aC9FYSkpLm1hcChGYT0+QWFbRmFdKTtZLnRpY2tWYWx1ZXMoQWEpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCItLjJnIikpfSJMSU5FQVIiIT09eGEmJiJMT0ciIT09eGF8fFkudGlja3MoRWEpO2thLmNhbGwoWSk7a2Euc2VsZWN0QWxsKCIuZG9tYWluIikucmVtb3ZlKCk7a2Euc2VsZWN0QWxsKCIudGljayBsaW5lIikuYXR0cigic3Ryb2tlIiwiI2RkZCIpfWZ1bmN0aW9uIHQoa2EsWSl7cmV0dXJuIE9bWV0ody5fY29sVmFsdWUoa2EsWSkpfWZ1bmN0aW9uIGwoa2EsWSl7cmV0dXJuIEhbWV0ody5fbWV0cmljVmFsdWUoa2EsWSkpfWZ1bmN0aW9uIHAoa2EsWSl7Y29uc3QgRWE9W107VFtrYV1bWV0uZWFjaChmdW5jdGlvbigpe0VhLnB1c2godGhpcyl9KTsKcmV0dXJuIGQzLnF1YWR0cmVlKCkueCh2YT0+ZDMuc2VsZWN0KHZhKS5kYXR1bSgpLngpLnkodmE9PmQzLnNlbGVjdCh2YSkuZGF0dW0oKS55KS5hZGRBbGwoRWEpfWZ1bmN0aW9uIG0oKXtsZXQga2E9bmV3IFNldChRLm5vZGVzKCkpO3goKXx8KGthPW4ody5fYnJ1c2hlZENlbGxJbmRleCx3Ll9icnVzaFNlbGVjdGlvbikpO2QzLnNlbGVjdEFsbChBcnJheS5mcm9tKHkuZmlsdGVyU2V0KGthLFk9PiFaLmhhcyhZKSkpKS5hdHRyKCJmaWxsIixMKTtkMy5zZWxlY3RBbGwoQXJyYXkuZnJvbSh5LmZpbHRlclNldChaLFk9PiFrYS5oYXMoWSkpKSkuYXR0cigiZmlsbCIsIiNkZGQiKTtaPWthfWZ1bmN0aW9uIG4oa2EsWSl7Y29uc29sZS5hc3NlcnQobnVsbCE9PWthKTtjb25zb2xlLmFzc2VydChudWxsIT09WSk7Y29uc3QgW0VhLHZhXT1rYSx4YT1uZXcgU2V0O3kucXVhZFRyZWVWaXNpdFBvaW50c0luUmVjdChhYVtFYV1bdmFdLFlbMF1bMF0sWVswXVsxXSxZWzFdWzBdLFlbMV1bMV0sCkFhPT57ZDMuc2VsZWN0KEFhKS5kYXR1bSgpLnNlc3Npb25Hcm91cE1hcmtlcnMuZm9yRWFjaChGYT0+e3hhLmFkZChGYSl9KX0pO3JldHVybiB4YX1mdW5jdGlvbiBxKGthKXtjb25zdCBZPWQzLmJydXNoU2VsZWN0aW9uKGthKTshdSgpJiZudWxsPT09WXx8dSgpJiZrYT09PWxhLm5vZGUoKSYmXy5pc0VxdWFsKFksdy5fYnJ1c2hTZWxlY3Rpb24pfHwody5fYnJ1c2hTZWxlY3Rpb249WSxudWxsIT09WT8obGE9ZDMuc2VsZWN0KGthKSx3Ll9icnVzaGVkQ2VsbEluZGV4PWxhLmRhdHVtKCkpOihsYT1udWxsLHcuX2JydXNoZWRDZWxsSW5kZXg9bnVsbCksbSgpKX1mdW5jdGlvbiB1KCl7cmV0dXJuIG51bGwhPT13Ll9icnVzaGVkQ2VsbEluZGV4JiZudWxsIT09dy5fYnJ1c2hTZWxlY3Rpb259ZnVuY3Rpb24geCgpe3JldHVybiF1KCl8fHcuX2JydXNoU2VsZWN0aW9uWzBdWzBdPT09dy5fYnJ1c2hTZWxlY3Rpb25bMV1bMF18fHcuX2JydXNoU2VsZWN0aW9uWzBdWzFdPT09dy5fYnJ1c2hTZWxlY3Rpb25bMV1bMV19CmZ1bmN0aW9uIEEoa2EsWSxFYSx2YSx4YSl7bGV0IEFhPUluZmluaXR5LEZhPW51bGw7eS5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrKGFhW2thXVtZXSxFYSx2YSx4YSwoeWEsU2EpPT57Wi5oYXMoeWEpJiZTYTxBYSYmKHlhPWQzLnNlbGVjdCh5YSkuZGF0dW0oKSxBYT1TYSxGYT15YS5zZXNzaW9uR3JvdXApfSk7cmV0dXJuIG51bGw9PT1GYT9udWxsOmQzLnNlbGVjdEFsbChYLmdldChGYSkpfWNvbnN0IHk9dGYuaHBhcmFtcy51dGlscyx3PXRoaXM7aWYodGhpcy5zZXNzaW9uR3JvdXBzJiYwIT10aGlzLnNlc3Npb25Hcm91cHMubGVuZ3RoJiZ0aGlzLnZpc2libGVTY2hlbWEmJjAhPXRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGgpe3ZhciBDPWQzLnJhbmdlKHkubnVtVmlzaWJsZUNvbHVtbnMody52aXNpYmxlU2NoZW1hKSksRz1kMy5yYW5nZSh5Lm51bVZpc2libGVNZXRyaWNzKHcudmlzaWJsZVNjaGVtYSkpLEQ9ZDMuc2NhbGVCYW5kKCkuZG9tYWluKEMpLnJhbmdlKFs4NSwKdGhpcy53aWR0aC0xLTVdKS5wYWRkaW5nSW5uZXIoLjEpLEI9ZDMuc2NhbGVCYW5kKCkuZG9tYWluKEcpLnJhbmdlKFt0aGlzLmhlaWdodC0xLTUtNTAsNV0pLnBhZGRpbmdJbm5lciguMSksST1ELmJhbmR3aWR0aCgpLE49Qi5iYW5kd2lkdGgoKSxPPUMubWFwKGthPT53Ll9jZWxsU2NhbGUoa2EsWzAsSS0xXSkpLEg9Ry5tYXAoa2E9PncuX2NlbGxTY2FsZShrYSt5Lm51bVZpc2libGVIUGFyYW1zKHcudmlzaWJsZVNjaGVtYSksW04tMSwwXSkpLEs9dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLngtYXhpcyIpLmRhdGEoQykuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ4LWF4aXMiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLGthPT55LnRyYW5zbGF0ZVN0cihEKGthKSwwKSk7Sy5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGIpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC01KS5hdHRyKCJ5IiwwKS5hdHRyKCJ3aWR0aCIsSSsxMCkuYXR0cigiaGVpZ2h0Iix3LmhlaWdodC0yNSk7CksuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixkKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwwKS5hdHRyKCJ5Iix3LmhlaWdodC0yNSkuYXR0cigid2lkdGgiLEkpLmF0dHIoImhlaWdodCIsMjUpO0suYXBwZW5kKCJnIikuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIitiKGthKSsiKSIpLmVhY2goZnVuY3Rpb24oa2Epe2QzLnNlbGVjdCh0aGlzKS5jYWxsKGssZDMuYXhpc0JvdHRvbShPW2thXSkudGlja1NpemUody5oZWlnaHQtNTApLEksNDAsdy5vcHRpb25zLmNvbHVtbnNba2FdLnNjYWxlKX0pO0suYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzLWxhYmVsIiwhMCkuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIitkKGthKSsiKSIpLmFwcGVuZCgidGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieCIsSS8yKS5hdHRyKCJ5Iix3LmhlaWdodC0xLTEyLjUpLnRleHQoa2E9Pnkuc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWUody52aXNpYmxlU2NoZW1hLAprYSkpLmFwcGVuZCgidGl0bGUiKS50ZXh0KGthPT55LnNjaGVtYVZpc2libGVDb2x1bW5OYW1lKHcudmlzaWJsZVNjaGVtYSxrYSkpO0s9dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLnktYXhpcyIpLmRhdGEoRykuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWF4aXMiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLGthPT55LnRyYW5zbGF0ZVN0cih3LndpZHRoLTEsQihrYSkpKTtLLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsZikuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLSh3LndpZHRoLTQwLTEpKS5hdHRyKCJ5IiwtNSkuYXR0cigid2lkdGgiLHcud2lkdGgtNDApLmF0dHIoImhlaWdodCIsTisxMCk7Sy5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGgpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0ody53aWR0aC0xKSkuYXR0cigieSIsMCkuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLE4pO0suYXBwZW5kKCJnIikuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIisKZihrYSkrIikiKS5lYWNoKGZ1bmN0aW9uKGthKXtkMy5zZWxlY3QodGhpcykuY2FsbChrLGQzLmF4aXNMZWZ0KEhba2FdKS50aWNrU2l6ZSh3LndpZHRoLTgwKSxOLDIwLHcub3B0aW9ucy5jb2x1bW5zW2thK3kubnVtVmlzaWJsZUhQYXJhbXMody52aXNpYmxlU2NoZW1hKV0uc2NhbGUpfSk7Sy5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWF4aXMtbGFiZWwiLCEwKS5hdHRyKCJjbGlwLXBhdGgiLGthPT4idXJsKCMiK2goa2EpKyIpIikuYXBwZW5kKCJ0ZXh0IikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ4IiwtKHcud2lkdGgtMjAtMSkpLmF0dHIoInkiLE4vMikuYXR0cigidHJhbnNmb3JtIix5LnJvdGF0ZVN0cigtKHcud2lkdGgtMjAtMSksTi8yKSkudGV4dChrYT0+eS5tZXRyaWNOYW1lKHcudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1trYV0pKS5hcHBlbmQoInRpdGxlIikudGV4dChrYT0+eS5tZXRyaWNOYW1lKHcudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1trYV0pKTsKSz10aGlzLl9zdmcuc2VsZWN0QWxsKCIuY2VsbCIpLmRhdGEoZDMuY3Jvc3MoQyxHKSkuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJjZWxsIiwhMCkuYXR0cigidHJhbnNmb3JtIiwoW2thLFldKT0+eS50cmFuc2xhdGVTdHIoRChrYSksQihZKSkpO0suYXBwZW5kKCJnIikuY2xhc3NlZCgiZnJhbWUiLCEwKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtNSkuYXR0cigieSIsLTUpLmF0dHIoIndpZHRoIixJKzEwKS5hdHRyKCJoZWlnaHQiLE4rMTApLmF0dHIoInN0cm9rZSIsIiMwMDAiKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInNoYXBlLXJlbmRlcmluZyIsImNyaXNwRWRnZXMiKTt2YXIgTT1udWxsO3ZvaWQgMCE9PXcub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgmJihNPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKHRoaXMuX2NvbEV4dGVudCh0aGlzLm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4KSkucmFuZ2UoW3RoaXMub3B0aW9ucy5taW5Db2xvcix0aGlzLm9wdGlvbnMubWF4Q29sb3JdKS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZUxhYikpOwp2YXIgTD12b2lkIDA9PT13Lm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4PygpPT4icmVkIjooe3Nlc3Npb25Hcm91cDprYX0pPT5NKHRoaXMuX2NvbFZhbHVlKGthLHcub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgpKSxbUSxULFhdPWZ1bmN0aW9uKGthLFkpe2NvbnN0IEVhPWthLnNlbGVjdEFsbCgiLmRhdGEtbWFya2VyIikuZGF0YSgoW3hhLEFhXSk9Pncuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoRmE9PnZvaWQgMCE9PXcuX2NvbFZhbHVlKEZhLHhhKSYmdm9pZCAwIT09dy5fbWV0cmljVmFsdWUoRmEsQWEpKS5tYXAoRmE9Pih7Y29sOnhhLG1ldHJpYzpBYSxzZXNzaW9uR3JvdXA6RmEseDp0KEZhLHhhKSx5OmwoRmEsQWEpLHNlc3Npb25Hcm91cE1hcmtlcnM6bnVsbH0pKSkuZW50ZXIoKS5hcHBlbmQoImNpcmNsZSIpLmNsYXNzZWQoImRhdGEtbWFya2VyIiwhMCkuYXR0cigiY3giLCh7eDp4YX0pPT54YSkuYXR0cigiY3kiLCh7eTp4YX0pPT54YSkuYXR0cigiciIsMikuYXR0cigiZmlsbCIsClkpLHZhPW5ldyBNYXA7dy5zZXNzaW9uR3JvdXBzLmZvckVhY2goeGE9Pnt2YS5zZXQoeGEsW10pfSk7RWEuZWFjaChmdW5jdGlvbih4YSl7dmEuZ2V0KHhhLnNlc3Npb25Hcm91cCkucHVzaCh0aGlzKX0pO0VhLmVhY2goeGE9Pntjb25zdCBBYT12YS5nZXQoeGEuc2Vzc2lvbkdyb3VwKTt4YS5zZXNzaW9uR3JvdXBNYXJrZXJzPW5ldyBTZXQoQWEpfSk7a2E9Qy5tYXAoeGE9PkcubWFwKEFhPT5FYS5maWx0ZXIoRmE9PkZhLmNvbD09eGEmJkZhLm1ldHJpYz09QWEpKSk7cmV0dXJuW0VhLGthLHZhXX0oSy5hcHBlbmQoImciKSxMKSxhYT1DLm1hcChrYT0+Ry5tYXAoWT0+cChrYSxZKSkpLGxhPW51bGw7dSgpJiYobGE9Sy5maWx0ZXIoa2E9Pl8uaXNFcXVhbChrYSx3Ll9icnVzaGVkQ2VsbEluZGV4KSksY29uc29sZS5hc3NlcnQoMT09bGEuc2l6ZSgpLGxhKSk7dmFyIFo9bmV3IFNldChRLm5vZGVzKCkpO20oKTt2YXIgYmE9ZDMuYnJ1c2goKS5leHRlbnQoW1stNCwtNF0sW0ktMSs1LQoxLE4tMSs1LTFdXSkub24oInN0YXJ0IixmdW5jdGlvbigpe3UoKSYmbGEubm9kZSgpIT10aGlzJiZiYS5tb3ZlKGxhLG51bGwpO3EodGhpcyl9KS5vbigiYnJ1c2giLGZ1bmN0aW9uKCl7cSh0aGlzKX0pLm9uKCJlbmQiLGZ1bmN0aW9uKCl7cSh0aGlzKX0pO0suY2FsbChiYSk7dSgpJiZiYS5tb3ZlKGxhLHcuX2JydXNoU2VsZWN0aW9uKTt2YXIgZWE9bnVsbCxjYT1udWxsO251bGwhPT10aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwJiYoY2E9ZDMuc2VsZWN0QWxsKFguZ2V0KHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXApKS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCEwKSk7Sy5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGthPWVhPT09Y2E/bnVsbDplYTtrYSE9PWNhJiYobnVsbCE9PWNhJiZjYS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCExKSxjYT1rYSxudWxsIT09Y2EmJmNhLmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITApLGthPW51bGw9PT1jYT9udWxsOmNhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwLAp3Ll9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChrYSkpfSkub24oIm1vdXNlbW92ZSBtb3VzZWVudGVyIixmdW5jdGlvbihba2EsWV0pe2NvbnN0IFtFYSx2YV09ZDMubW91c2UodGhpcyk7a2E9QShrYSxZLEVhLHZhLDIwKTtlYSE9PWthJiYobnVsbCE9PWVhJiZlYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGVhPWthLG51bGwhPT1lYT8oZWEuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCEwKSx3Ll9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKGVhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwKSk6dy5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KS5vbigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtudWxsIT09ZWEmJihlYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGVhPW51bGwsdy5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCIqIikuY2xhc3NlZCgidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLCEwKX19LApfY2VsbFNjYWxlKGIsZCl7dmFyIGY9dGhpcy5fY29sRXh0ZW50KGIpO2NvbnN0IGg9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oZikucmFuZ2UoZCk7aWYoIkxJTkVBUiI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1tiXS5zY2FsZSlyZXR1cm4gaDtpZigiTE9HIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXJldHVybiAwPj1mWzBdJiYwPD1mWzFdP2g6ZDMuc2NhbGVMb2coKS5kb21haW4oZikucmFuZ2UoZCk7aWYoIlFVQU5USUxFIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXtjb25zdCBrPShkWzFdLWRbMF0pLzE5O2Y9ZDMucmFuZ2UoMjApLm1hcCh0PT5kWzBdK2sqdCk7cmV0dXJuIGQzLnNjYWxlUXVhbnRpbGUoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAodD0+dGhpcy5fY29sVmFsdWUodCxiKSkpKS5yYW5nZShmKX1pZigiTk9OX05VTUVSSUMiPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbYl0uc2NhbGUpcmV0dXJuIGQzLnNjYWxlUG9pbnQoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAoaz0+CnRoaXMuX2NvbFZhbHVlKGssYikpLnNvcnQoKSkpLnJhbmdlKGQpLnBhZGRpbmcoLjEpO3Rocm93IlVua25vd24gc2NhbGUgZm9yIGNvbHVtbjogIitiKyIuIG9wdGlvbnM6ICIrdGhpcy5vcHRpb25zO30sX2NvbFZhbHVlKGIsZCl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYixkKX0sX21ldHJpY1ZhbHVlKGIsZCl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMubWV0cmljVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYixkKX0sX2NvbEV4dGVudChiKXtyZXR1cm4gdGYuaHBhcmFtcy51dGlscy52aXNpYmxlTnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Iixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheX0sX2Nsb3Nlc3RPclNlbGVjdGVkOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIG51bGwhPT1iP2I6ZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsaGVscFVybDpTdHJpbmcsYnVnUmVwb3J0VXJsOlN0cmluZyxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxfc2VsZWN0ZWRUYWI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyL3RmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyIixoYW5kbGVFdmVudDpmdW5jdGlvbigpe319KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1tYWluL3RmLWhwYXJhbXMtbWFpbi5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLW1haW4iLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyx0cmFja2luZ0lkOlN0cmluZyxoZWxwVXJsOlN0cmluZyxidWdSZXBvcnRVcmw6U3RyaW5nLF9jb25maWd1cmF0aW9uOk9iamVjdCxfc2Vzc2lvbkdyb3VwczpBcnJheSxfdGhyb3R0bGVkU2VuZEV2ZW50VG9HQTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Xy50aHJvdHRsZShmdW5jdGlvbigpe3RoaXMuX2hhbmRsZUdBRXZlbnQoe2RldGFpbDp7aGl0VHlwZToiZXZlbnQiLGV2ZW50Q2F0ZWdvcnk6IlVzZXJJbnRlcmFjdGlvbiIsZXZlbnRMYWJlbDoiRXhwZXJpbWVudDogIit0aGlzLmV4cGVyaW1lbnROYW1lfX0pfSw2RTQse2xlYWRpbmc6ITB9KX19LGxpc3RlbmVyczp7bW91c2Vtb3ZlOiJfc2VuZEV2ZW50VG9HQSIsdGFwOiJfc2VuZEV2ZW50VG9HQSIsImdvb2dsZS1hbmFseXRpY3MtdHJhY2tpbmciOiJfaGFuZGxlR0FFdmVudCJ9LGF0dGFjaGVkKCl7dGhpcy5faGFuZGxlR0FFdmVudCh7ZGV0YWlsOntoaXRUeXBlOiJwYWdldmlldyJ9fSl9LApyZWxvYWQoKXt0aGlzLiRbInF1ZXJ5LXBhbmUiXS5yZWxvYWQoKX0sX3NlbmRFdmVudFRvR0EoKXt0aGlzLl90aHJvdHRsZWRTZW5kRXZlbnRUb0dBKHRoaXMpfSxfaGFuZGxlR0FFdmVudChiKXt0aGlzLiQudHJhY2tlci5oYW5kbGVFdmVudChiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLWJhY2tlbmQvdGYtaHBhcmFtcy1iYWNrZW5kLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtjbGFzcyBme2NvbnN0cnVjdG9yKGgsayx0PSEwKXt0aGlzLl9hcGlVcmw9aDt0aGlzLl9yZXF1ZXN0TWFuYWdlcj1rO3RoaXMuX3VzZUh0dHBHZXQ9dH1nZXRFeHBlcmltZW50KGgpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgiZXhwZXJpbWVudCIsaCl9Z2V0RG93bmxvYWRVcmwoaCxrLHQpe3JldHVybiB0aGlzLl9hcGlVcmwrIi9kb3dubG9hZF9kYXRhPyIrbmV3IFVSTFNlYXJjaFBhcmFtcyh7Zm9ybWF0OmgsY29sdW1uc1Zpc2liaWxpdHk6SlNPTi5zdHJpbmdpZnkodCkscmVxdWVzdDpKU09OLnN0cmluZ2lmeShrKX0pfWxpc3RTZXNzaW9uR3JvdXBzKGgpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgic2Vzc2lvbl9ncm91cHMiLGgpfWxpc3RNZXRyaWNFdmFscyhoKXtyZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3QoIm1ldHJpY19ldmFscyIsaCl9X3NlbmRSZXF1ZXN0KGgsayl7aWYodGhpcy5fdXNlSHR0cEdldClyZXR1cm4gaz1lbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoaykpLAp0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHRoaXMuX2FwaVVybCsiLyIraCsiP3JlcXVlc3RceDNkIitrKTtjb25zdCB0PW5ldyB2Yy5SZXF1ZXN0T3B0aW9uczt0LndpdGhDcmVkZW50aWFscz0hMDt0Lm1ldGhvZFR5cGU9IlBPU1QiO3QuY29udGVudFR5cGU9InRleHQvcGxhaW4iO3QuYm9keT1KU09OLnN0cmluZ2lmeShrKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdFdpdGhPcHRpb25zKHRoaXMuX2FwaVVybCsiLyIraCx0KX19ZC5CYWNrZW5kPWZ9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLWRhc2hib2FyZC90Zi1ocGFyYW1zLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLWRhc2hib2FyZCIscHJvcGVydGllczp7X2JhY2tlbmQ6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdGYuaHBhcmFtcy5CYWNrZW5kKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJocGFyYW1zIiwiIiksbmV3IHZjLlJlcXVlc3RNYW5hZ2VyLCEhKHdpbmRvdy5URU5TT1JCT0FSRF9FTlZ8fHt9KS5JTl9DT0xBQil9fSxyZWxvYWQoKXt0aGlzLiRbImhwYXJhbXMtbWFpbiJdLnJlbG9hZCgpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbXBvcnRzL3RocmVlLmpzCihmdW5jdGlvbihiLGQpeyJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT09dHlwZW9mIG1vZHVsZT9kKGV4cG9ydHMpOiJmdW5jdGlvbiI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImV4cG9ydHMiXSxkKTooYj1ifHxzZWxmLGQoYi5USFJFRT17fSkpfSkodGhpcyxmdW5jdGlvbihiKXtmdW5jdGlvbiBkKCl7fWZ1bmN0aW9uIGYoYSxjKXt0aGlzLng9YXx8MDt0aGlzLnk9Y3x8MH1mdW5jdGlvbiBoKGEsYyxlLGcpe3RoaXMuX3g9YXx8MDt0aGlzLl95PWN8fDA7dGhpcy5fej1lfHwwO3RoaXMuX3c9dm9pZCAwIT09Zz9nOjF9ZnVuY3Rpb24gayhhLGMsZSl7dGhpcy54PWF8fDA7dGhpcy55PWN8fDA7dGhpcy56PWV8fDB9ZnVuY3Rpb24gdCgpe3RoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXTswPGFyZ3VtZW50cy5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9CmZ1bmN0aW9uIGwoYSxjLGUsZyxyLHYseixFLEYsSil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6TmsrK30pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy5pbWFnZT12b2lkIDAhPT1hP2E6bC5ERUZBVUxUX0lNQUdFO3RoaXMubWlwbWFwcz1bXTt0aGlzLm1hcHBpbmc9dm9pZCAwIT09Yz9jOmwuREVGQVVMVF9NQVBQSU5HO3RoaXMud3JhcFM9dm9pZCAwIT09ZT9lOjEwMDE7dGhpcy53cmFwVD12b2lkIDAhPT1nP2c6MTAwMTt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT1yP3I6MTAwNjt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT12P3Y6MTAwODt0aGlzLmFuaXNvdHJvcHk9dm9pZCAwIT09Rj9GOjE7dGhpcy5mb3JtYXQ9dm9pZCAwIT09ej96OjEwMjM7dGhpcy50eXBlPXZvaWQgMCE9PUU/RToxMDA5O3RoaXMub2Zmc2V0PW5ldyBmKDAsMCk7dGhpcy5yZXBlYXQ9bmV3IGYoMSwxKTt0aGlzLmNlbnRlcj1uZXcgZigwLDApOwp0aGlzLnJvdGF0aW9uPTA7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSEwO3RoaXMubWF0cml4PW5ldyB0O3RoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwO3RoaXMucHJlbXVsdGlwbHlBbHBoYT0hMTt0aGlzLmZsaXBZPSEwO3RoaXMudW5wYWNrQWxpZ25tZW50PTQ7dGhpcy5lbmNvZGluZz12b2lkIDAhPT1KP0o6M0UzO3RoaXMudmVyc2lvbj0wO3RoaXMub25VcGRhdGU9bnVsbH1mdW5jdGlvbiBwKGEsYyxlLGcpe3RoaXMueD1hfHwwO3RoaXMueT1jfHwwO3RoaXMuej1lfHwwO3RoaXMudz12b2lkIDAhPT1nP2c6MX1mdW5jdGlvbiBtKGEsYyxlKXt0aGlzLndpZHRoPWE7dGhpcy5oZWlnaHQ9Yzt0aGlzLnNjaXNzb3I9bmV3IHAoMCwwLGEsYyk7dGhpcy5zY2lzc29yVGVzdD0hMTt0aGlzLnZpZXdwb3J0PW5ldyBwKDAsMCxhLGMpO2U9ZXx8e307dGhpcy50ZXh0dXJlPW5ldyBsKHZvaWQgMCx2b2lkIDAsZS53cmFwUyxlLndyYXBULGUubWFnRmlsdGVyLGUubWluRmlsdGVyLGUuZm9ybWF0LGUudHlwZSwKZS5hbmlzb3Ryb3B5LGUuZW5jb2RpbmcpO3RoaXMudGV4dHVyZS5pbWFnZT17fTt0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGg9YTt0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0PWM7dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz12b2lkIDAhPT1lLmdlbmVyYXRlTWlwbWFwcz9lLmdlbmVyYXRlTWlwbWFwczohMTt0aGlzLnRleHR1cmUubWluRmlsdGVyPXZvaWQgMCE9PWUubWluRmlsdGVyP2UubWluRmlsdGVyOjEwMDY7dGhpcy5kZXB0aEJ1ZmZlcj12b2lkIDAhPT1lLmRlcHRoQnVmZmVyP2UuZGVwdGhCdWZmZXI6ITA7dGhpcy5zdGVuY2lsQnVmZmVyPXZvaWQgMCE9PWUuc3RlbmNpbEJ1ZmZlcj9lLnN0ZW5jaWxCdWZmZXI6ITA7dGhpcy5kZXB0aFRleHR1cmU9dm9pZCAwIT09ZS5kZXB0aFRleHR1cmU/ZS5kZXB0aFRleHR1cmU6bnVsbH1mdW5jdGlvbiBuKGEsYyxlKXttLmNhbGwodGhpcyxhLGMsZSk7dGhpcy5zYW1wbGVzPTR9ZnVuY3Rpb24gcSgpe3RoaXMuZWxlbWVudHM9ClsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXTswPGFyZ3VtZW50cy5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9ZnVuY3Rpb24gdShhLGMsZSxnKXt0aGlzLl94PWF8fDA7dGhpcy5feT1jfHwwO3RoaXMuX3o9ZXx8MDt0aGlzLl9vcmRlcj1nfHx1LkRlZmF1bHRPcmRlcn1mdW5jdGlvbiB4KCl7dGhpcy5tYXNrPTF9ZnVuY3Rpb24gQSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOk9rKyt9KTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMudHlwZT0iT2JqZWN0M0QiO3RoaXMucGFyZW50PW51bGw7dGhpcy5jaGlsZHJlbj1bXTt0aGlzLnVwPUEuRGVmYXVsdFVwLmNsb25lKCk7dmFyIGE9bmV3IGssYz1uZXcgdSxlPW5ldyBoLGc9bmV3IGsoMSwxLDEpO2MuX29uQ2hhbmdlKGZ1bmN0aW9uKCl7ZS5zZXRGcm9tRXVsZXIoYywKITEpfSk7ZS5fb25DaGFuZ2UoZnVuY3Rpb24oKXtjLnNldEZyb21RdWF0ZXJuaW9uKGUsdm9pZCAwLCExKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTphfSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y30scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmd9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IHF9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IHR9fSk7dGhpcy5tYXRyaXg9bmV3IHE7dGhpcy5tYXRyaXhXb3JsZD1uZXcgcTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9QS5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZTt0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITE7dGhpcy5sYXllcnM9bmV3IHg7dGhpcy52aXNpYmxlPSEwOwp0aGlzLnJlY2VpdmVTaGFkb3c9dGhpcy5jYXN0U2hhZG93PSExO3RoaXMuZnJ1c3R1bUN1bGxlZD0hMDt0aGlzLnJlbmRlck9yZGVyPTA7dGhpcy51c2VyRGF0YT17fX1mdW5jdGlvbiB5KCl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2NlbmUiO3RoaXMub3ZlcnJpZGVNYXRlcmlhbD10aGlzLmZvZz10aGlzLmJhY2tncm91bmQ9bnVsbDt0aGlzLmF1dG9VcGRhdGU9ITA7InVuZGVmaW5lZCIhPT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1mdW5jdGlvbiB3KGEsYyl7dGhpcy5taW49dm9pZCAwIT09YT9hOm5ldyBrKEluZmluaXR5LEluZmluaXR5LEluZmluaXR5KTt0aGlzLm1heD12b2lkIDAhPT1jP2M6bmV3IGsoLUluZmluaXR5LC1JbmZpbml0eSwtSW5maW5pdHkpfWZ1bmN0aW9uIEMoYSxjLGUsZyxyKXt2YXIgdjt2YXIgej0wO2Zvcih2PWEubGVuZ3RoLQozO3o8PXY7eis9Myl7S2QuZnJvbUFycmF5KGEseik7dmFyIEU9Yy5kb3QoS2QpLEY9ZS5kb3QoS2QpLEo9Zy5kb3QoS2QpO2lmKE1hdGgubWF4KC1NYXRoLm1heChFLEYsSiksTWF0aC5taW4oRSxGLEopKT5yLngqTWF0aC5hYnMoS2QueCkrci55Kk1hdGguYWJzKEtkLnkpK3IueipNYXRoLmFicyhLZC56KSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBHKGEsYyl7dGhpcy5jZW50ZXI9dm9pZCAwIT09YT9hOm5ldyBrO3RoaXMucmFkaXVzPXZvaWQgMCE9PWM/YzowfWZ1bmN0aW9uIEQoYSxjKXt0aGlzLm9yaWdpbj12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5kaXJlY3Rpb249dm9pZCAwIT09Yz9jOm5ldyBrfWZ1bmN0aW9uIEIoYSxjLGUpe3RoaXMuYT12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5iPXZvaWQgMCE9PWM/YzpuZXcgazt0aGlzLmM9dm9pZCAwIT09ZT9lOm5ldyBrfWZ1bmN0aW9uIEkoYSxjLGUpe3JldHVybiB2b2lkIDA9PT1jJiZ2b2lkIDA9PT1lP3RoaXMuc2V0KGEpOgp0aGlzLnNldFJHQihhLGMsZSl9ZnVuY3Rpb24gTihhLGMsZSl7MD5lJiYoZSs9MSk7MTxlJiYtLWU7cmV0dXJuIGU8MS82P2ErNiooYy1hKSplOi41PmU/YzplPDIvMz9hKzYqKGMtYSkqKDIvMy1lKTphfWZ1bmN0aW9uIE8oYSl7cmV0dXJuLjA0MDQ1PmE/LjA3NzM5OTM4MDgqYTpNYXRoLnBvdyguOTQ3ODY3Mjk4NiphKy4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gSChhKXtyZXR1cm4uMDAzMTMwOD5hPzEyLjkyKmE6MS4wNTUqTWF0aC5wb3coYSwuNDE2NjYpLS4wNTV9ZnVuY3Rpb24gSyhhLGMsZSxnLHIsdil7dGhpcy5hPWE7dGhpcy5iPWM7dGhpcy5jPWU7dGhpcy5ub3JtYWw9ZyYmZy5pc1ZlY3RvcjM/ZzpuZXcgazt0aGlzLnZlcnRleE5vcm1hbHM9QXJyYXkuaXNBcnJheShnKT9nOltdO3RoaXMuY29sb3I9ciYmci5pc0NvbG9yP3I6bmV3IEk7dGhpcy52ZXJ0ZXhDb2xvcnM9QXJyYXkuaXNBcnJheShyKT9yOltdO3RoaXMubWF0ZXJpYWxJbmRleD12b2lkIDAhPT12P3Y6MH0KZnVuY3Rpb24gTSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlBrKyt9KTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMudHlwZT0iTWF0ZXJpYWwiO3RoaXMubGlnaHRzPXRoaXMuZm9nPSEwO3RoaXMuYmxlbmRpbmc9MTt0aGlzLnNpZGU9MDt0aGlzLnZlcnRleFRhbmdlbnRzPXRoaXMuZmxhdFNoYWRpbmc9ITE7dGhpcy52ZXJ0ZXhDb2xvcnM9MDt0aGlzLm9wYWNpdHk9MTt0aGlzLnRyYW5zcGFyZW50PSExO3RoaXMuYmxlbmRTcmM9MjA0O3RoaXMuYmxlbmREc3Q9MjA1O3RoaXMuYmxlbmRFcXVhdGlvbj0xMDA7dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmRTcmNBbHBoYT1udWxsO3RoaXMuZGVwdGhGdW5jPTM7dGhpcy5kZXB0aFdyaXRlPXRoaXMuZGVwdGhUZXN0PSEwO3RoaXMuc3RlbmNpbEZ1bmM9NTE5O3RoaXMuc3RlbmNpbFJlZj0wO3RoaXMuc3RlbmNpbE1hc2s9CjI1NTt0aGlzLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxGYWlsPTc2ODA7dGhpcy5zdGVuY2lsV3JpdGU9ITE7dGhpcy5jbGlwcGluZ1BsYW5lcz1udWxsO3RoaXMuY2xpcFNoYWRvd3M9dGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExO3RoaXMuc2hhZG93U2lkZT1udWxsO3RoaXMuY29sb3JXcml0ZT0hMDt0aGlzLnByZWNpc2lvbj1udWxsO3RoaXMucG9seWdvbk9mZnNldD0hMTt0aGlzLnBvbHlnb25PZmZzZXRVbml0cz10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9MDt0aGlzLmRpdGhlcmluZz0hMTt0aGlzLmFscGhhVGVzdD0wO3RoaXMucHJlbXVsdGlwbGllZEFscGhhPSExO3RoaXMudG9uZU1hcHBlZD10aGlzLnZpc2libGU9ITA7dGhpcy51c2VyRGF0YT17fTt0aGlzLm5lZWRzVXBkYXRlPSEwfWZ1bmN0aW9uIEwoYSl7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaEJhc2ljTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEkoMTY3NzcyMTUpO3RoaXMubGlnaHRNYXA9CnRoaXMubWFwPW51bGw7dGhpcy5saWdodE1hcEludGVuc2l0eT0xO3RoaXMuYW9NYXA9bnVsbDt0aGlzLmFvTWFwSW50ZW5zaXR5PTE7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLnNwZWN1bGFyTWFwPW51bGw7dGhpcy5jb21iaW5lPTA7dGhpcy5yZWZsZWN0aXZpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiO3RoaXMubGlnaHRzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gUShhLGMsZSl7aWYoQXJyYXkuaXNBcnJheShhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LiIpO3RoaXMubmFtZT0iIjt0aGlzLmFycmF5PWE7dGhpcy5pdGVtU2l6ZT0KYzt0aGlzLmNvdW50PXZvaWQgMCE9PWE/YS5sZW5ndGgvYzowO3RoaXMubm9ybWFsaXplZD0hMD09PWU7dGhpcy5keW5hbWljPSExO3RoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfTt0aGlzLnZlcnNpb249MH1mdW5jdGlvbiBUKGEsYyxlKXtRLmNhbGwodGhpcyxuZXcgSW50OEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWChhLGMsZSl7US5jYWxsKHRoaXMsbmV3IFVpbnQ4QXJyYXkoYSksYyxlKX1mdW5jdGlvbiBhYShhLGMsZSl7US5jYWxsKHRoaXMsbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gbGEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBJbnQxNkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWihhLGMsZSl7US5jYWxsKHRoaXMsbmV3IFVpbnQxNkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gYmEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBJbnQzMkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gZWEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBVaW50MzJBcnJheShhKSwKYyxlKX1mdW5jdGlvbiBjYShhLGMsZSl7US5jYWxsKHRoaXMsbmV3IEZsb2F0MzJBcnJheShhKSxjLGUpfWZ1bmN0aW9uIGthKGEsYyxlKXtRLmNhbGwodGhpcyxuZXcgRmxvYXQ2NEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWSgpe3RoaXMudmVydGljZXM9W107dGhpcy5ub3JtYWxzPVtdO3RoaXMuY29sb3JzPVtdO3RoaXMudXZzPVtdO3RoaXMudXZzMj1bXTt0aGlzLmdyb3Vwcz1bXTt0aGlzLm1vcnBoVGFyZ2V0cz17fTt0aGlzLnNraW5XZWlnaHRzPVtdO3RoaXMuc2tpbkluZGljZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5ncm91cHNOZWVkVXBkYXRlPXRoaXMudXZzTmVlZFVwZGF0ZT10aGlzLmNvbG9yc05lZWRVcGRhdGU9dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMX1mdW5jdGlvbiBFYShhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuLUluZmluaXR5O2Zvcih2YXIgYz1hWzBdLGU9MSxnPQphLmxlbmd0aDtlPGc7KytlKWFbZV0+YyYmKGM9YVtlXSk7cmV0dXJuIGN9ZnVuY3Rpb24gdmEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpRays9Mn0pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSI7dGhpcy5pbmRleD1udWxsO3RoaXMuYXR0cmlidXRlcz17fTt0aGlzLm1vcnBoQXR0cmlidXRlcz17fTt0aGlzLmdyb3Vwcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLmRyYXdSYW5nZT17c3RhcnQ6MCxjb3VudDpJbmZpbml0eX07dGhpcy51c2VyRGF0YT17fX1mdW5jdGlvbiB4YShhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2giO3RoaXMuZ2VvbWV0cnk9dm9pZCAwIT09YT9hOm5ldyB2YTt0aGlzLm1hdGVyaWFsPXZvaWQgMCE9PWM/YzpuZXcgTCh7Y29sb3I6MTY3NzcyMTUqTWF0aC5yYW5kb20oKX0pO3RoaXMuZHJhd01vZGU9CjA7dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1mdW5jdGlvbiBBYShhLGMsZSxnLHIsdix6LEUpe2lmKG51bGw9PT0oMT09PWMuc2lkZT9nLmludGVyc2VjdFRyaWFuZ2xlKHosdixyLCEwLEUpOmcuaW50ZXJzZWN0VHJpYW5nbGUocix2LHosMiE9PWMuc2lkZSxFKSkpcmV0dXJuIG51bGw7c2cuY29weShFKTtzZy5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCk7Yz1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhzZyk7cmV0dXJuIGM8ZS5uZWFyfHxjPmUuZmFyP251bGw6e2Rpc3RhbmNlOmMscG9pbnQ6c2cuY2xvbmUoKSxvYmplY3Q6YX19ZnVuY3Rpb24gRmEoYSxjLGUsZyxyLHYseixFLEYsSixQKXtMZC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsRik7TWQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLEopO05kLmZyb21CdWZmZXJBdHRyaWJ1dGUocixQKTtyPWEubW9ycGhUYXJnZXRJbmZsdWVuY2VzO2lmKGMubW9ycGhUYXJnZXRzJiZ2JiZyKXtJaC5zZXQoMCwwLDApO0poLnNldCgwLDAsMCk7CktoLnNldCgwLDAsMCk7Zm9yKHZhciBSPTAsUz12Lmxlbmd0aDtSPFM7UisrKXt2YXIgVj1yW1JdLFc9dltSXTswIT09ViYmKCRpLmZyb21CdWZmZXJBdHRyaWJ1dGUoVyxGKSxhai5mcm9tQnVmZmVyQXR0cmlidXRlKFcsSiksYmouZnJvbUJ1ZmZlckF0dHJpYnV0ZShXLFApLEloLmFkZFNjYWxlZFZlY3RvcigkaS5zdWIoTGQpLFYpLEpoLmFkZFNjYWxlZFZlY3Rvcihhai5zdWIoTWQpLFYpLEtoLmFkZFNjYWxlZFZlY3Rvcihiai5zdWIoTmQpLFYpKX1MZC5hZGQoSWgpO01kLmFkZChKaCk7TmQuYWRkKEtoKX1pZihhPUFhKGEsYyxlLGcsTGQsTWQsTmQsc2YpKXomJihvZS5mcm9tQnVmZmVyQXR0cmlidXRlKHosRikscGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh6LEopLHFlLmZyb21CdWZmZXJBdHRyaWJ1dGUoeixQKSxhLnV2PUIuZ2V0VVYoc2YsTGQsTWQsTmQsb2UscGUscWUsbmV3IGYpKSxFJiYob2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLEYpLHBlLmZyb21CdWZmZXJBdHRyaWJ1dGUoRSwKSikscWUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLFApLGEudXYyPUIuZ2V0VVYoc2YsTGQsTWQsTmQsb2UscGUscWUsbmV3IGYpKSx6PW5ldyBLKEYsSixQKSxCLmdldE5vcm1hbChMZCxNZCxOZCx6Lm5vcm1hbCksYS5mYWNlPXo7cmV0dXJuIGF9ZnVuY3Rpb24geWEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpSays9Mn0pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJHZW9tZXRyeSI7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLmNvbG9ycz1bXTt0aGlzLmZhY2VzPVtdO3RoaXMuZmFjZVZlcnRleFV2cz1bW11dO3RoaXMubW9ycGhUYXJnZXRzPVtdO3RoaXMubW9ycGhOb3JtYWxzPVtdO3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmxpbmVEaXN0YW5jZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5ncm91cHNOZWVkVXBkYXRlPXRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGU9CnRoaXMuY29sb3JzTmVlZFVwZGF0ZT10aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudXZzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT10aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZT0hMX1mdW5jdGlvbiBTYShhLGMsZSxnLHIsdil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJveEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOmEsaGVpZ2h0OmMsZGVwdGg6ZSx3aWR0aFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6cixkZXB0aFNlZ21lbnRzOnZ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBYYShhLGMsZSxnLHIsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFhhKGEsYyxlLGcscix2KXtmdW5jdGlvbiB6KFcsaGEsZmEscmEscGEscWEsdWEsb2EsdGEsQmEsVGEpe3ZhciBVYT1xYS90YSxDYT11YS9CYSxIYT1xYS8yLERhPXVhLzIsTWE9b2EvMjt1YT10YSsxO3ZhciBkYj1CYSsxLHRiPXFhPTAsS2EsYmIsamI9bmV3IGs7Zm9yKGJiPQowO2JiPGRiO2JiKyspe3ZhciBFYj1iYipDYS1EYTtmb3IoS2E9MDtLYTx1YTtLYSsrKWpiW1ddPShLYSpVYS1IYSkqcmEsamJbaGFdPUViKnBhLGpiW2ZhXT1NYSxKLnB1c2goamIueCxqYi55LGpiLnopLGpiW1ddPTAsamJbaGFdPTAsamJbZmFdPTA8b2E/MTotMSxQLnB1c2goamIueCxqYi55LGpiLnopLFIucHVzaChLYS90YSksUi5wdXNoKDEtYmIvQmEpLHFhKz0xfWZvcihiYj0wO2JiPEJhO2JiKyspZm9yKEthPTA7S2E8dGE7S2ErKylXPVMrS2ErdWEqKGJiKzEpLGhhPVMrKEthKzEpK3VhKihiYisxKSxmYT1TKyhLYSsxKSt1YSpiYixGLnB1c2goUytLYSt1YSpiYixXLGZhKSxGLnB1c2goVyxoYSxmYSksdGIrPTY7RS5hZGRHcm91cChWLHRiLFRhKTtWKz10YjtTKz1xYX12YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQm94QnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6YyxkZXB0aDplLHdpZHRoU2VnbWVudHM6ZyxoZWlnaHRTZWdtZW50czpyLApkZXB0aFNlZ21lbnRzOnZ9O3ZhciBFPXRoaXM7YT1hfHwxO2M9Y3x8MTtlPWV8fDE7Zz1NYXRoLmZsb29yKGcpfHwxO3I9TWF0aC5mbG9vcihyKXx8MTt2PU1hdGguZmxvb3Iodil8fDE7dmFyIEY9W10sSj1bXSxQPVtdLFI9W10sUz0wLFY9MDt6KCJ6IiwieSIsIngiLC0xLC0xLGUsYyxhLHYsciwwKTt6KCJ6IiwieSIsIngiLDEsLTEsZSxjLC1hLHYsciwxKTt6KCJ4IiwieiIsInkiLDEsMSxhLGUsYyxnLHYsMik7eigieCIsInoiLCJ5IiwxLC0xLGEsZSwtYyxnLHYsMyk7eigieCIsInkiLCJ6IiwxLC0xLGEsYyxlLGcsciw0KTt6KCJ4IiwieSIsInoiLC0xLC0xLGEsYywtZSxnLHIsNSk7dGhpcy5zZXRJbmRleChGKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShKLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoUCwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoUiwyKSl9ZnVuY3Rpb24gdWIoYSl7dmFyIGM9e30sZTtmb3IoZSBpbiBhKXtjW2VdPQp7fTtmb3IodmFyIGcgaW4gYVtlXSl7dmFyIHI9YVtlXVtnXTtjW2VdW2ddPXImJihyLmlzQ29sb3J8fHIuaXNNYXRyaXgzfHxyLmlzTWF0cml4NHx8ci5pc1ZlY3RvcjJ8fHIuaXNWZWN0b3IzfHxyLmlzVmVjdG9yNHx8ci5pc1RleHR1cmUpP3IuY2xvbmUoKTpBcnJheS5pc0FycmF5KHIpP3Iuc2xpY2UoKTpyfX1yZXR1cm4gY31mdW5jdGlvbiBCYihhKXtmb3IodmFyIGM9e30sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz11YihhW2VdKSxyO2ZvcihyIGluIGcpY1tyXT1nW3JdfXJldHVybiBjfWZ1bmN0aW9uIHFiKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYWRlck1hdGVyaWFsIjt0aGlzLmRlZmluZXM9e307dGhpcy51bmlmb3Jtcz17fTt0aGlzLnZlcnRleFNoYWRlcj0idm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59Ijt0aGlzLmZyYWdtZW50U2hhZGVyPQoidm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcbn0iO3RoaXMubGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPXRoaXMuY2xpcHBpbmc9dGhpcy5saWdodHM9dGhpcy5mb2c9ITE7dGhpcy5leHRlbnNpb25zPXtkZXJpdmF0aXZlczohMSxmcmFnRGVwdGg6ITEsZHJhd0J1ZmZlcnM6ITEsc2hhZGVyVGV4dHVyZUxPRDohMX07dGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzPXtjb2xvcjpbMSwxLDFdLHV2OlswLDBdLHV2MjpbMCwwXX07dGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lPXZvaWQgMDt0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMTt2b2lkIDAhPT1hJiYodm9pZCAwIT09YS5hdHRyaWJ1dGVzJiZjb25zb2xlLmVycm9yKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKSwKdGhpcy5zZXRWYWx1ZXMoYSkpfWZ1bmN0aW9uIHpiKCl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2FtZXJhIjt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZT1uZXcgcTt0aGlzLnByb2plY3Rpb25NYXRyaXg9bmV3IHE7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZT1uZXcgcX1mdW5jdGlvbiB2YihhLGMsZSxnKXt6Yi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGVyc3BlY3RpdmVDYW1lcmEiO3RoaXMuZm92PXZvaWQgMCE9PWE/YTo1MDt0aGlzLnpvb209MTt0aGlzLm5lYXI9dm9pZCAwIT09ZT9lOi4xO3RoaXMuZmFyPXZvaWQgMCE9PWc/ZzoyRTM7dGhpcy5mb2N1cz0xMDt0aGlzLmFzcGVjdD12b2lkIDAhPT1jP2M6MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmZpbG1HYXVnZT0zNTt0aGlzLmZpbG1PZmZzZXQ9MDt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBHYihhLGMsZSxnKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDdWJlQ2FtZXJhIjt2YXIgcj1uZXcgdmIoOTAsCjEsYSxjKTtyLnVwLnNldCgwLC0xLDApO3IubG9va0F0KG5ldyBrKDEsMCwwKSk7dGhpcy5hZGQocik7dmFyIHY9bmV3IHZiKDkwLDEsYSxjKTt2LnVwLnNldCgwLC0xLDApO3YubG9va0F0KG5ldyBrKC0xLDAsMCkpO3RoaXMuYWRkKHYpO3ZhciB6PW5ldyB2Yig5MCwxLGEsYyk7ei51cC5zZXQoMCwwLDEpO3oubG9va0F0KG5ldyBrKDAsMSwwKSk7dGhpcy5hZGQoeik7dmFyIEU9bmV3IHZiKDkwLDEsYSxjKTtFLnVwLnNldCgwLDAsLTEpO0UubG9va0F0KG5ldyBrKDAsLTEsMCkpO3RoaXMuYWRkKEUpO3ZhciBGPW5ldyB2Yig5MCwxLGEsYyk7Ri51cC5zZXQoMCwtMSwwKTtGLmxvb2tBdChuZXcgaygwLDAsMSkpO3RoaXMuYWRkKEYpO3ZhciBKPW5ldyB2Yig5MCwxLGEsYyk7Si51cC5zZXQoMCwtMSwwKTtKLmxvb2tBdChuZXcgaygwLDAsLTEpKTt0aGlzLmFkZChKKTtnPWd8fHtmb3JtYXQ6MTAyMixtYWdGaWx0ZXI6MTAwNixtaW5GaWx0ZXI6MTAwNn07dGhpcy5yZW5kZXJUYXJnZXQ9Cm5ldyBOYihlLGUsZyk7dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lPSJDdWJlQ2FtZXJhIjt0aGlzLnVwZGF0ZT1mdW5jdGlvbihQLFIpe251bGw9PT10aGlzLnBhcmVudCYmdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO3ZhciBTPVAuZ2V0UmVuZGVyVGFyZ2V0KCksVj10aGlzLnJlbmRlclRhcmdldCxXPVYudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7Vi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz0hMTtQLnNldFJlbmRlclRhcmdldChWLDApO1AucmVuZGVyKFIscik7UC5zZXRSZW5kZXJUYXJnZXQoViwxKTtQLnJlbmRlcihSLHYpO1Auc2V0UmVuZGVyVGFyZ2V0KFYsMik7UC5yZW5kZXIoUix6KTtQLnNldFJlbmRlclRhcmdldChWLDMpO1AucmVuZGVyKFIsRSk7UC5zZXRSZW5kZXJUYXJnZXQoViw0KTtQLnJlbmRlcihSLEYpO1YudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9VztQLnNldFJlbmRlclRhcmdldChWLDUpO1AucmVuZGVyKFIsSik7UC5zZXRSZW5kZXJUYXJnZXQoUyl9Owp0aGlzLmNsZWFyPWZ1bmN0aW9uKFAsUixTLFYpe2Zvcih2YXIgVz1QLmdldFJlbmRlclRhcmdldCgpLGhhPXRoaXMucmVuZGVyVGFyZ2V0LGZhPTA7Nj5mYTtmYSsrKVAuc2V0UmVuZGVyVGFyZ2V0KGhhLGZhKSxQLmNsZWFyKFIsUyxWKTtQLnNldFJlbmRlclRhcmdldChXKX19ZnVuY3Rpb24gTmIoYSxjLGUpe20uY2FsbCh0aGlzLGEsYyxlKX1mdW5jdGlvbiBBYihhLGMsZSxnLHIsdix6LEUsRixKLFAsUil7bC5jYWxsKHRoaXMsbnVsbCx2LHosRSxGLEosZyxyLFAsUik7dGhpcy5pbWFnZT17ZGF0YTphLHdpZHRoOmMsaGVpZ2h0OmV9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PUY/RjoxMDAzO3RoaXMubWluRmlsdGVyPXZvaWQgMCE9PUo/SjoxMDAzO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITE7dGhpcy51bnBhY2tBbGlnbm1lbnQ9MX1mdW5jdGlvbiBIYihhLGMpe3RoaXMubm9ybWFsPXZvaWQgMCE9PWE/YTpuZXcgaygxLDAsMCk7dGhpcy5jb25zdGFudD12b2lkIDAhPT0KYz9jOjB9ZnVuY3Rpb24gaWMoYSxjLGUsZyxyLHYpe3RoaXMucGxhbmVzPVt2b2lkIDAhPT1hP2E6bmV3IEhiLHZvaWQgMCE9PWM/YzpuZXcgSGIsdm9pZCAwIT09ZT9lOm5ldyBIYix2b2lkIDAhPT1nP2c6bmV3IEhiLHZvaWQgMCE9PXI/cjpuZXcgSGIsdm9pZCAwIT09dj92Om5ldyBIYl19ZnVuY3Rpb24gYmMoKXtmdW5jdGlvbiBhKHIsdil7ITEhPT1lJiYoZyhyLHYpLGMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGEpKX12YXIgYz1udWxsLGU9ITEsZz1udWxsO3JldHVybntzdGFydDpmdW5jdGlvbigpeyEwIT09ZSYmbnVsbCE9PWcmJihjLnJlcXVlc3RBbmltYXRpb25GcmFtZShhKSxlPSEwKX0sc3RvcDpmdW5jdGlvbigpe2U9ITF9LHNldEFuaW1hdGlvbkxvb3A6ZnVuY3Rpb24ocil7Zz1yfSxzZXRDb250ZXh0OmZ1bmN0aW9uKHIpe2M9cn19fWZ1bmN0aW9uIE9kKGEpe2Z1bmN0aW9uIGMocix2KXt2YXIgej1yLmFycmF5LEU9ci5keW5hbWljPzM1MDQ4OjM1MDQ0LEY9YS5jcmVhdGVCdWZmZXIoKTsKYS5iaW5kQnVmZmVyKHYsRik7YS5idWZmZXJEYXRhKHYseixFKTtyLm9uVXBsb2FkQ2FsbGJhY2soKTt2PTUxMjY7eiBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheT92PTUxMjY6eiBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuIik6eiBpbnN0YW5jZW9mIFVpbnQxNkFycmF5P3Y9NTEyMzp6IGluc3RhbmNlb2YgSW50MTZBcnJheT92PTUxMjI6eiBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3Y9NTEyNTp6IGluc3RhbmNlb2YgSW50MzJBcnJheT92PTUxMjQ6eiBpbnN0YW5jZW9mIEludDhBcnJheT92PTUxMjA6eiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJih2PTUxMjEpO3JldHVybntidWZmZXI6Rix0eXBlOnYsYnl0ZXNQZXJFbGVtZW50OnouQllURVNfUEVSX0VMRU1FTlQsdmVyc2lvbjpyLnZlcnNpb259fWZ1bmN0aW9uIGUocix2LHope3ZhciBFPQp2LmFycmF5LEY9di51cGRhdGVSYW5nZTthLmJpbmRCdWZmZXIoeixyKTshMT09PXYuZHluYW1pYz9hLmJ1ZmZlckRhdGEoeixFLDM1MDQ0KTotMT09PUYuY291bnQ/YS5idWZmZXJTdWJEYXRhKHosMCxFKTowPT09Ri5jb3VudD9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWljIFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJhbmdlLmNvdW50IGlzIDAsIGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0aW5nIG1hbnVhbGx5LiIpOihhLmJ1ZmZlclN1YkRhdGEoeixGLm9mZnNldCpFLkJZVEVTX1BFUl9FTEVNRU5ULEUuc3ViYXJyYXkoRi5vZmZzZXQsRi5vZmZzZXQrRi5jb3VudCkpLEYuY291bnQ9LTEpfXZhciBnPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24ocil7ci5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYocj1yLmRhdGEpO3JldHVybiBnLmdldChyKX0sCnJlbW92ZTpmdW5jdGlvbihyKXtyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihyPXIuZGF0YSk7dmFyIHY9Zy5nZXQocik7diYmKGEuZGVsZXRlQnVmZmVyKHYuYnVmZmVyKSxnLmRlbGV0ZShyKSl9LHVwZGF0ZTpmdW5jdGlvbihyLHYpe3IuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKHI9ci5kYXRhKTt2YXIgej1nLmdldChyKTt2b2lkIDA9PT16P2cuc2V0KHIsYyhyLHYpKTp6LnZlcnNpb248ci52ZXJzaW9uJiYoZSh6LmJ1ZmZlcixyLHYpLHoudmVyc2lvbj1yLnZlcnNpb24pfX19ZnVuY3Rpb24gcmQoYSxjLGUsZyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBsYW5lR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6Yyx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IExjKGEsYyxlLGcpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBMYyhhLGMsZSxnKXt2YS5jYWxsKHRoaXMpOwp0aGlzLnR5cGU9IlBsYW5lQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6Yyx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6Z307YT1hfHwxO2M9Y3x8MTt2YXIgcj1hLzIsdj1jLzI7ZT1NYXRoLmZsb29yKGUpfHwxO2c9TWF0aC5mbG9vcihnKXx8MTt2YXIgej1lKzEsRT1nKzEsRj1hL2UsSj1jL2csUD1bXSxSPVtdLFM9W10sVj1bXTtmb3IoYT0wO2E8RTthKyspe3ZhciBXPWEqSi12O2ZvcihjPTA7Yzx6O2MrKylSLnB1c2goYypGLXIsLVcsMCksUy5wdXNoKDAsMCwxKSxWLnB1c2goYy9lKSxWLnB1c2goMS1hL2cpfWZvcihhPTA7YTxnO2ErKylmb3IoYz0wO2M8ZTtjKyspcj1jK3oqKGErMSksdj1jKzEreiooYSsxKSxFPWMrMSt6KmEsUC5wdXNoKGMreiphLHIsRSksUC5wdXNoKHIsdixFKTt0aGlzLnNldEluZGV4KFApO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKFIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLApuZXcgY2EoUywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoViwyKSl9ZnVuY3Rpb24gc2QoYSxjLGUsZyl7ZnVuY3Rpb24gcihSLFMpe2MuYnVmZmVycy5jb2xvci5zZXRDbGVhcihSLnIsUi5nLFIuYixTLGcpfXZhciB2PW5ldyBJKDApLHo9MCxFLEYsSj1udWxsLFA9MDtyZXR1cm57Z2V0Q2xlYXJDb2xvcjpmdW5jdGlvbigpe3JldHVybiB2fSxzZXRDbGVhckNvbG9yOmZ1bmN0aW9uKFIsUyl7di5zZXQoUik7ej12b2lkIDAhPT1TP1M6MTtyKHYseil9LGdldENsZWFyQWxwaGE6ZnVuY3Rpb24oKXtyZXR1cm4gen0sc2V0Q2xlYXJBbHBoYTpmdW5jdGlvbihSKXt6PVI7cih2LHopfSxyZW5kZXI6ZnVuY3Rpb24oUixTLFYsVyl7Uz1TLmJhY2tncm91bmQ7Vj1hLnZyOyhWPVYuZ2V0U2Vzc2lvbiYmVi5nZXRTZXNzaW9uKCkpJiYiYWRkaXRpdmUiPT09Vi5lbnZpcm9ubWVudEJsZW5kTW9kZSYmKFM9bnVsbCk7bnVsbD09PVM/KHIodix6KSxKPW51bGwsUD0wKTpTJiZTLmlzQ29sb3ImJgoocihTLDEpLFc9ITAsSj1udWxsLFA9MCk7KGEuYXV0b0NsZWFyfHxXKSYmYS5jbGVhcihhLmF1dG9DbGVhckNvbG9yLGEuYXV0b0NsZWFyRGVwdGgsYS5hdXRvQ2xlYXJTdGVuY2lsKTtpZihTJiYoUy5pc0N1YmVUZXh0dXJlfHxTLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKSl7dm9pZCAwPT09RiYmKEY9bmV3IHhhKG5ldyBYYSgxLDEsMSksbmV3IHFiKHt0eXBlOiJCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsIix1bmlmb3Jtczp1YihNYy5jdWJlLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6TWMuY3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6TWMuY3ViZS5mcmFnbWVudFNoYWRlcixzaWRlOjEsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEYuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxGLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSgidXYiKSxGLm9uQmVmb3JlUmVuZGVyPWZ1bmN0aW9uKGhhLGZhLHJhKXt0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbihyYS5tYXRyaXhXb3JsZCl9LApPYmplY3QuZGVmaW5lUHJvcGVydHkoRi5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudEN1YmUudmFsdWV9fSksZS51cGRhdGUoRikpO1c9Uy5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT9TLnRleHR1cmU6UztGLm1hdGVyaWFsLnVuaWZvcm1zLnRDdWJlLnZhbHVlPVc7Ri5tYXRlcmlhbC51bmlmb3Jtcy50RmxpcC52YWx1ZT1TLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPzE6LTE7aWYoSiE9PVN8fFAhPT1XLnZlcnNpb24pRi5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxKPVMsUD1XLnZlcnNpb247Ui51bnNoaWZ0KEYsRi5nZW9tZXRyeSxGLm1hdGVyaWFsLDAsMCxudWxsKX1lbHNlIGlmKFMmJlMuaXNUZXh0dXJlKXt2b2lkIDA9PT1FJiYoRT1uZXcgeGEobmV3IExjKDIsMiksbmV3IHFiKHt0eXBlOiJCYWNrZ3JvdW5kTWF0ZXJpYWwiLHVuaWZvcm1zOnViKE1jLmJhY2tncm91bmQudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpNYy5iYWNrZ3JvdW5kLnZlcnRleFNoYWRlciwKZnJhZ21lbnRTaGFkZXI6TWMuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixzaWRlOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEUuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlfX0pLGUudXBkYXRlKEUpKTtFLm1hdGVyaWFsLnVuaWZvcm1zLnQyRC52YWx1ZT1TOyEwPT09Uy5tYXRyaXhBdXRvVXBkYXRlJiZTLnVwZGF0ZU1hdHJpeCgpO0UubWF0ZXJpYWwudW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weShTLm1hdHJpeCk7aWYoSiE9PVN8fFAhPT1TLnZlcnNpb24pRS5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxKPVMsUD1TLnZlcnNpb247Ui51bnNoaWZ0KEUsRS5nZW9tZXRyeSxFLm1hdGVyaWFsLDAsMCxudWxsKX19fX1mdW5jdGlvbiBzYShhLGMsZSxnKXt2YXIgcjt0aGlzLnNldE1vZGU9CmZ1bmN0aW9uKHYpe3I9dn07dGhpcy5yZW5kZXI9ZnVuY3Rpb24odix6KXthLmRyYXdBcnJheXMocix2LHopO2UudXBkYXRlKHoscil9O3RoaXMucmVuZGVySW5zdGFuY2VzPWZ1bmN0aW9uKHYseixFKXtpZihnLmlzV2ViR0wyKXt2YXIgRj1hO3ZhciBKPSJkcmF3QXJyYXlzSW5zdGFuY2VkIn1lbHNlIGlmKEY9Yy5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxKPSJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1GKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4iKTtyZXR1cm59RltKXShyLHosRSx2Lm1heEluc3RhbmNlZENvdW50KTtlLnVwZGF0ZShFLHIsdi5tYXhJbnN0YW5jZWRDb3VudCl9fWZ1bmN0aW9uIE1iKGEsYyxlKXtmdW5jdGlvbiBnKHFhKXtpZigiaGlnaHAiPT09CnFhKXtpZigwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMzLDM2MzM4KS5wcmVjaXNpb24mJjA8YS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzIsMzYzMzgpLnByZWNpc2lvbilyZXR1cm4iaGlnaHAiO3FhPSJtZWRpdW1wIn1yZXR1cm4ibWVkaXVtcCI9PT1xYSYmMDxhLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMywzNjMzNykucHJlY2lzaW9uJiYwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMyLDM2MzM3KS5wcmVjaXNpb24/Im1lZGl1bXAiOiJsb3dwIn12YXIgcix2PSJ1bmRlZmluZWQiIT09dHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQmJmEgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LHo9dm9pZCAwIT09ZS5wcmVjaXNpb24/ZS5wcmVjaXNpb246ImhpZ2hwIixFPWcoeik7RSE9PXomJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6Iix6LCJub3Qgc3VwcG9ydGVkLCB1c2luZyIsRSwiaW5zdGVhZC4iKSwKej1FKTtlPSEwPT09ZS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyO0U9YS5nZXRQYXJhbWV0ZXIoMzQ5MzApO3ZhciBGPWEuZ2V0UGFyYW1ldGVyKDM1NjYwKSxKPWEuZ2V0UGFyYW1ldGVyKDMzNzkpLFA9YS5nZXRQYXJhbWV0ZXIoMzQwNzYpLFI9YS5nZXRQYXJhbWV0ZXIoMzQ5MjEpLFM9YS5nZXRQYXJhbWV0ZXIoMzYzNDcpLFY9YS5nZXRQYXJhbWV0ZXIoMzYzNDgpLFc9YS5nZXRQYXJhbWV0ZXIoMzYzNDkpLGhhPTA8RixmYT12fHwhIWMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdCIpLHJhPWhhJiZmYSxwYT12P2EuZ2V0UGFyYW1ldGVyKDM2MTgzKTowO3JldHVybntpc1dlYkdMMjp2LGdldE1heEFuaXNvdHJvcHk6ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1yKXJldHVybiByO3ZhciBxYT1jLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7cmV0dXJuIHI9bnVsbCE9PXFhP2EuZ2V0UGFyYW1ldGVyKHFhLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCk6MH0sCmdldE1heFByZWNpc2lvbjpnLHByZWNpc2lvbjp6LGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6ZSxtYXhUZXh0dXJlczpFLG1heFZlcnRleFRleHR1cmVzOkYsbWF4VGV4dHVyZVNpemU6SixtYXhDdWJlbWFwU2l6ZTpQLG1heEF0dHJpYnV0ZXM6UixtYXhWZXJ0ZXhVbmlmb3JtczpTLG1heFZhcnlpbmdzOlYsbWF4RnJhZ21lbnRVbmlmb3JtczpXLHZlcnRleFRleHR1cmVzOmhhLGZsb2F0RnJhZ21lbnRUZXh0dXJlczpmYSxmbG9hdFZlcnRleFRleHR1cmVzOnJhLG1heFNhbXBsZXM6cGF9fWZ1bmN0aW9uIHdjKCl7ZnVuY3Rpb24gYSgpe0oudmFsdWUhPT1nJiYoSi52YWx1ZT1nLEoubmVlZHNVcGRhdGU9MDxyKTtlLm51bVBsYW5lcz1yO2UubnVtSW50ZXJzZWN0aW9uPTB9ZnVuY3Rpb24gYyhQLFIsUyxWKXt2YXIgVz1udWxsIT09UD9QLmxlbmd0aDowLGhhPW51bGw7aWYoMCE9PVcpe2hhPUoudmFsdWU7aWYoITAhPT1WfHxudWxsPT09aGEpe1Y9Uys0Klc7Uj1SLm1hdHJpeFdvcmxkSW52ZXJzZTsKRi5nZXROb3JtYWxNYXRyaXgoUik7aWYobnVsbD09PWhhfHxoYS5sZW5ndGg8ViloYT1uZXcgRmxvYXQzMkFycmF5KFYpO2ZvcihWPTA7ViE9PVc7KytWLFMrPTQpRS5jb3B5KFBbVl0pLmFwcGx5TWF0cml4NChSLEYpLEUubm9ybWFsLnRvQXJyYXkoaGEsUyksaGFbUyszXT1FLmNvbnN0YW50fUoudmFsdWU9aGE7Si5uZWVkc1VwZGF0ZT0hMH1lLm51bVBsYW5lcz1XO3JldHVybiBoYX12YXIgZT10aGlzLGc9bnVsbCxyPTAsdj0hMSx6PSExLEU9bmV3IEhiLEY9bmV3IHQsSj17dmFsdWU6bnVsbCxuZWVkc1VwZGF0ZTohMX07dGhpcy51bmlmb3JtPUo7dGhpcy5udW1JbnRlcnNlY3Rpb249dGhpcy5udW1QbGFuZXM9MDt0aGlzLmluaXQ9ZnVuY3Rpb24oUCxSLFMpe3ZhciBWPTAhPT1QLmxlbmd0aHx8Unx8MCE9PXJ8fHY7dj1SO2c9YyhQLFMsMCk7cj1QLmxlbmd0aDtyZXR1cm4gVn07dGhpcy5iZWdpblNoYWRvd3M9ZnVuY3Rpb24oKXt6PSEwO2MobnVsbCl9O3RoaXMuZW5kU2hhZG93cz0KZnVuY3Rpb24oKXt6PSExO2EoKX07dGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihQLFIsUyxWLFcsaGEpe2lmKCF2fHxudWxsPT09UHx8MD09PVAubGVuZ3RofHx6JiYhUyl6P2MobnVsbCk6YSgpO2Vsc2V7Uz16PzA6cjt2YXIgZmE9NCpTLHJhPVcuY2xpcHBpbmdTdGF0ZXx8bnVsbDtKLnZhbHVlPXJhO3JhPWMoUCxWLGZhLGhhKTtmb3IoUD0wO1AhPT1mYTsrK1ApcmFbUF09Z1tQXTtXLmNsaXBwaW5nU3RhdGU9cmE7dGhpcy5udW1JbnRlcnNlY3Rpb249Uj90aGlzLm51bVBsYW5lczowO3RoaXMubnVtUGxhbmVzKz1TfX19ZnVuY3Rpb24gYmQoYSl7dmFyIGM9e307cmV0dXJue2dldDpmdW5jdGlvbihlKXtpZih2b2lkIDAhPT1jW2VdKXJldHVybiBjW2VdO3N3aXRjaChlKXtjYXNlICJXRUJHTF9kZXB0aF90ZXh0dXJlIjp2YXIgZz1hLmdldEV4dGVuc2lvbigiV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHxhLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUiKXx8YS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlIik7CmJyZWFrO2Nhc2UgIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyI6Zz1hLmdldEV4dGVuc2lvbigiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fGEuZ2V0RXh0ZW5zaW9uKCJNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fGEuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7YnJlYWs7Y2FzZSAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiOmc9YS5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGEuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8YS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpO2JyZWFrO2Nhc2UgIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyI6Zz1hLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fAphLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpO2JyZWFrO2RlZmF1bHQ6Zz1hLmdldEV4dGVuc2lvbihlKX1udWxsPT09ZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK2UrIiBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4iKTtyZXR1cm4gY1tlXT1nfX19ZnVuY3Rpb24gdGQoYSxjLGUpe2Z1bmN0aW9uIGcoRSl7dmFyIEY9RS50YXJnZXQ7RT12LmdldChGKTtudWxsIT09RS5pbmRleCYmYy5yZW1vdmUoRS5pbmRleCk7Zm9yKHZhciBKIGluIEUuYXR0cmlidXRlcyljLnJlbW92ZShFLmF0dHJpYnV0ZXNbSl0pO0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZyk7di5kZWxldGUoRik7aWYoSj16LmdldChFKSljLnJlbW92ZShKKSx6LmRlbGV0ZShFKTtlLm1lbW9yeS5nZW9tZXRyaWVzLS19ZnVuY3Rpb24gcihFKXt2YXIgRj1bXSxKPUUuaW5kZXgsUD1FLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbCE9PQpKKXt2YXIgUj1KLmFycmF5O0o9Si52ZXJzaW9uO1A9MDtmb3IodmFyIFM9Ui5sZW5ndGg7UDxTO1ArPTMpe3ZhciBWPVJbUCswXSxXPVJbUCsxXSxoYT1SW1ArMl07Ri5wdXNoKFYsVyxXLGhhLGhhLFYpfX1lbHNlIGZvcihSPVAuYXJyYXksSj1QLnZlcnNpb24sUD0wLFM9Ui5sZW5ndGgvMy0xO1A8UztQKz0zKVY9UCswLFc9UCsxLGhhPVArMixGLnB1c2goVixXLFcsaGEsaGEsVik7Rj1uZXcgKDY1NTM1PEVhKEYpP2VhOlopKEYsMSk7Ri52ZXJzaW9uPUo7Yy51cGRhdGUoRiwzNDk2Myk7KFI9ei5nZXQoRSkpJiZjLnJlbW92ZShSKTt6LnNldChFLEYpfXZhciB2PW5ldyBXZWFrTWFwLHo9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihFLEYpe3ZhciBKPXYuZ2V0KEYpO2lmKEopcmV0dXJuIEo7Ri5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixnKTtGLmlzQnVmZmVyR2VvbWV0cnk/Sj1GOkYuaXNHZW9tZXRyeSYmKHZvaWQgMD09PUYuX2J1ZmZlckdlb21ldHJ5JiYoRi5fYnVmZmVyR2VvbWV0cnk9CihuZXcgdmEpLnNldEZyb21PYmplY3QoRSkpLEo9Ri5fYnVmZmVyR2VvbWV0cnkpO3Yuc2V0KEYsSik7ZS5tZW1vcnkuZ2VvbWV0cmllcysrO3JldHVybiBKfSx1cGRhdGU6ZnVuY3Rpb24oRSl7dmFyIEY9RS5pbmRleCxKPUUuYXR0cmlidXRlcztudWxsIT09RiYmYy51cGRhdGUoRiwzNDk2Myk7Zm9yKHZhciBQIGluIEopYy51cGRhdGUoSltQXSwzNDk2Mik7RT1FLm1vcnBoQXR0cmlidXRlcztmb3IoUCBpbiBFKXtGPUVbUF07Sj0wO2Zvcih2YXIgUj1GLmxlbmd0aDtKPFI7SisrKWMudXBkYXRlKEZbSl0sMzQ5NjIpfX0sZ2V0V2lyZWZyYW1lQXR0cmlidXRlOmZ1bmN0aW9uKEUpe3ZhciBGPXouZ2V0KEUpO2lmKEYpe3ZhciBKPUUuaW5kZXg7bnVsbCE9PUomJkYudmVyc2lvbjxKLnZlcnNpb24mJnIoRSl9ZWxzZSByKEUpO3JldHVybiB6LmdldChFKX19fWZ1bmN0aW9uIHRnKGEsYyxlLGcpe3ZhciByLHYsejt0aGlzLnNldE1vZGU9ZnVuY3Rpb24oRSl7cj1FfTt0aGlzLnNldEluZGV4PQpmdW5jdGlvbihFKXt2PUUudHlwZTt6PUUuYnl0ZXNQZXJFbGVtZW50fTt0aGlzLnJlbmRlcj1mdW5jdGlvbihFLEYpe2EuZHJhd0VsZW1lbnRzKHIsRix2LEUqeik7ZS51cGRhdGUoRixyKX07dGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24oRSxGLEope2lmKGcuaXNXZWJHTDIpe3ZhciBQPWE7dmFyIFI9ImRyYXdFbGVtZW50c0luc3RhbmNlZCJ9ZWxzZSBpZihQPWMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiksUj0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1QKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7cmV0dXJufVBbUl0ocixKLHYsRip6LEUubWF4SW5zdGFuY2VkQ291bnQpO2UudXBkYXRlKEoscixFLm1heEluc3RhbmNlZENvdW50KX19CmZ1bmN0aW9uIFNrKCl7dmFyIGE9e2ZyYW1lOjAsY2FsbHM6MCx0cmlhbmdsZXM6MCxwb2ludHM6MCxsaW5lczowfTtyZXR1cm57bWVtb3J5OntnZW9tZXRyaWVzOjAsdGV4dHVyZXM6MH0scmVuZGVyOmEscHJvZ3JhbXM6bnVsbCxhdXRvUmVzZXQ6ITAscmVzZXQ6ZnVuY3Rpb24oKXthLmZyYW1lKys7YS5jYWxscz0wO2EudHJpYW5nbGVzPTA7YS5wb2ludHM9MDthLmxpbmVzPTB9LHVwZGF0ZTpmdW5jdGlvbihjLGUsZyl7Zz1nfHwxO2EuY2FsbHMrKztzd2l0Y2goZSl7Y2FzZSA0OmEudHJpYW5nbGVzKz1jLzMqZzticmVhaztjYXNlIDU6Y2FzZSA2OmEudHJpYW5nbGVzKz1nKihjLTIpO2JyZWFrO2Nhc2UgMTphLmxpbmVzKz1jLzIqZzticmVhaztjYXNlIDM6YS5saW5lcys9ZyooYy0xKTticmVhaztjYXNlIDI6YS5saW5lcys9ZypjO2JyZWFrO2Nhc2UgMDphLnBvaW50cys9ZypjO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLAplKX19fX1mdW5jdGlvbiBUayhhLGMpe3JldHVybiBNYXRoLmFicyhjWzFdKS1NYXRoLmFicyhhWzFdKX1mdW5jdGlvbiBVayhhKXt2YXIgYz17fSxlPW5ldyBGbG9hdDMyQXJyYXkoOCk7cmV0dXJue3VwZGF0ZTpmdW5jdGlvbihnLHIsdix6KXt2YXIgRT1nLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxGPUUubGVuZ3RoO2c9Y1tyLmlkXTtpZih2b2lkIDA9PT1nKXtnPVtdO2Zvcih2YXIgSj0wO0o8RjtKKyspZ1tKXT1bSiwwXTtjW3IuaWRdPWd9dmFyIFA9di5tb3JwaFRhcmdldHMmJnIubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO3Y9di5tb3JwaE5vcm1hbHMmJnIubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtmb3IoSj0wO0o8RjtKKyspe3ZhciBSPWdbSl07MCE9PVJbMV0mJihQJiZyLnJlbW92ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0opLHYmJnIucmVtb3ZlQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrSikpfWZvcihKPTA7SjxGO0orKylSPWdbSl0sUlswXT1KLFJbMV09RVtKXTtnLnNvcnQoVGspOwpmb3IoSj0wOzg+SjtKKyspe2lmKFI9Z1tKXSlpZihFPVJbMF0sRj1SWzFdKXtQJiZyLmFkZEF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0osUFtFXSk7diYmci5hZGRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIitKLHZbRV0pO2VbSl09Rjtjb250aW51ZX1lW0pdPTB9ei5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGEsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsZSl9fX1mdW5jdGlvbiBWayhhLGMpe3ZhciBlPXt9O3JldHVybnt1cGRhdGU6ZnVuY3Rpb24oZyl7dmFyIHI9Yy5yZW5kZXIuZnJhbWUsdj1nLmdlb21ldHJ5LHo9YS5nZXQoZyx2KTtlW3ouaWRdIT09ciYmKHYuaXNHZW9tZXRyeSYmei51cGRhdGVGcm9tT2JqZWN0KGcpLGEudXBkYXRlKHopLGVbei5pZF09cik7cmV0dXJuIHp9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtlPXt9fX19ZnVuY3Rpb24gY2QoYSxjLGUsZyxyLHYseixFLEYsSil7YT12b2lkIDAhPT1hP2E6W107bC5jYWxsKHRoaXMsYSx2b2lkIDAhPT1jP2M6MzAxLGUsZyxyLHYsCnZvaWQgMCE9PXo/ejoxMDIyLEUsRixKKTt0aGlzLmZsaXBZPSExfWZ1bmN0aW9uIHJlKGEsYyxlLGcpe2wuY2FsbCh0aGlzLG51bGwpO3RoaXMuaW1hZ2U9e2RhdGE6YSx3aWR0aDpjLGhlaWdodDplLGRlcHRoOmd9O3RoaXMubWluRmlsdGVyPXRoaXMubWFnRmlsdGVyPTEwMDM7dGhpcy53cmFwUj0xMDAxO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gc2UoYSxjLGUsZyl7bC5jYWxsKHRoaXMsbnVsbCk7dGhpcy5pbWFnZT17ZGF0YTphLHdpZHRoOmMsaGVpZ2h0OmUsZGVwdGg6Z307dGhpcy5taW5GaWx0ZXI9dGhpcy5tYWdGaWx0ZXI9MTAwMzt0aGlzLndyYXBSPTEwMDE7dGhpcy5mbGlwWT10aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiB0ZShhLGMsZSl7dmFyIGc9YVswXTtpZigwPj1nfHwwPGcpcmV0dXJuIGE7dmFyIHI9YyplLHY9Y2pbcl07dm9pZCAwPT09diYmKHY9bmV3IEZsb2F0MzJBcnJheShyKSxjaltyXT12KTtpZigwIT09Yylmb3IoZy50b0FycmF5KHYsCjApLGc9MSxyPTA7ZyE9PWM7KytnKXIrPWUsYVtnXS50b0FycmF5KHYscik7cmV0dXJuIHZ9ZnVuY3Rpb24gc2MoYSxjKXtpZihhLmxlbmd0aCE9PWMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKylpZihhW2VdIT09Y1tlXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtYyhhLGMpe2Zvcih2YXIgZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKylhW2VdPWNbZV19ZnVuY3Rpb24gZGooYSxjKXt2YXIgZT1laltjXTt2b2lkIDA9PT1lJiYoZT1uZXcgSW50MzJBcnJheShjKSxlaltjXT1lKTtmb3IodmFyIGc9MDtnIT09YzsrK2cpZVtnXT1hLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtyZXR1cm4gZX1mdW5jdGlvbiBXayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7ZVswXSE9PWMmJihhLnVuaWZvcm0xZih0aGlzLmFkZHIsYyksZVswXT1jKX1mdW5jdGlvbiBYayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09CmMueSlhLnVuaWZvcm0yZih0aGlzLmFkZHIsYy54LGMueSksZVswXT1jLngsZVsxXT1jLnl9ZWxzZSBzYyhlLGMpfHwoYS51bmlmb3JtMmZ2KHRoaXMuYWRkcixjKSxtYyhlLGMpKX1mdW5jdGlvbiBZayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09Yy55fHxlWzJdIT09Yy56KWEudW5pZm9ybTNmKHRoaXMuYWRkcixjLngsYy55LGMueiksZVswXT1jLngsZVsxXT1jLnksZVsyXT1jLnp9ZWxzZSBpZih2b2lkIDAhPT1jLnIpe2lmKGVbMF0hPT1jLnJ8fGVbMV0hPT1jLmd8fGVbMl0hPT1jLmIpYS51bmlmb3JtM2YodGhpcy5hZGRyLGMucixjLmcsYy5iKSxlWzBdPWMucixlWzFdPWMuZyxlWzJdPWMuYn1lbHNlIHNjKGUsYyl8fChhLnVuaWZvcm0zZnYodGhpcy5hZGRyLGMpLG1jKGUsYykpfWZ1bmN0aW9uIFprKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTtpZih2b2lkIDAhPT1jLngpe2lmKGVbMF0hPT1jLnh8fGVbMV0hPT1jLnl8fAplWzJdIT09Yy56fHxlWzNdIT09Yy53KWEudW5pZm9ybTRmKHRoaXMuYWRkcixjLngsYy55LGMueixjLncpLGVbMF09Yy54LGVbMV09Yy55LGVbMl09Yy56LGVbM109Yy53fWVsc2Ugc2MoZSxjKXx8KGEudW5pZm9ybTRmdih0aGlzLmFkZHIsYyksbWMoZSxjKSl9ZnVuY3Rpb24gJGsoYSxjKXt2YXIgZT10aGlzLmNhY2hlLGc9Yy5lbGVtZW50czt2b2lkIDA9PT1nP3NjKGUsYyl8fChhLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLGMpLG1jKGUsYykpOnNjKGUsZyl8fChmai5zZXQoZyksYS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxmaiksbWMoZSxnKSl9ZnVuY3Rpb24gYWwoYSxjKXt2YXIgZT10aGlzLmNhY2hlLGc9Yy5lbGVtZW50czt2b2lkIDA9PT1nP3NjKGUsYyl8fChhLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLGMpLG1jKGUsYykpOnNjKGUsZyl8fChnai5zZXQoZyksYS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxnaiksbWMoZSxnKSl9CmZ1bmN0aW9uIGJsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZSxnPWMuZWxlbWVudHM7dm9pZCAwPT09Zz9zYyhlLGMpfHwoYS51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxjKSxtYyhlLGMpKTpzYyhlLGcpfHwoaGouc2V0KGcpLGEudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsaGopLG1jKGUsZykpfWZ1bmN0aW9uIGNsKGEsYyxlKXt2YXIgZz10aGlzLmNhY2hlLHI9ZS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7Z1swXSE9PXImJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsciksZ1swXT1yKTtlLnNhZmVTZXRUZXh0dXJlMkQoY3x8aWoscil9ZnVuY3Rpb24gZGwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUscj1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtnWzBdIT09ciYmKGEudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxnWzBdPXIpO2Uuc2V0VGV4dHVyZTJEQXJyYXkoY3x8ZWwscil9ZnVuY3Rpb24gZmwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUscj1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKZ1swXSE9PXImJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsciksZ1swXT1yKTtlLnNldFRleHR1cmUzRChjfHxnbCxyKX1mdW5jdGlvbiBobChhLGMsZSl7dmFyIGc9dGhpcy5jYWNoZSxyPWUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO2dbMF0hPT1yJiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLHIpLGdbMF09cik7ZS5zYWZlU2V0VGV4dHVyZUN1YmUoY3x8amoscil9ZnVuY3Rpb24gaWwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO2VbMF0hPT1jJiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLGMpLGVbMF09Yyl9ZnVuY3Rpb24gamwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO3NjKGUsYyl8fChhLnVuaWZvcm0yaXYodGhpcy5hZGRyLGMpLG1jKGUsYykpfWZ1bmN0aW9uIGtsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTtzYyhlLGMpfHwoYS51bmlmb3JtM2l2KHRoaXMuYWRkcixjKSxtYyhlLGMpKX1mdW5jdGlvbiBsbChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7c2MoZSxjKXx8KGEudW5pZm9ybTRpdih0aGlzLmFkZHIsCmMpLG1jKGUsYykpfWZ1bmN0aW9uIG1sKGEpe3N3aXRjaChhKXtjYXNlIDUxMjY6cmV0dXJuIFdrO2Nhc2UgMzU2NjQ6cmV0dXJuIFhrO2Nhc2UgMzU2NjU6cmV0dXJuIFlrO2Nhc2UgMzU2NjY6cmV0dXJuIFprO2Nhc2UgMzU2NzQ6cmV0dXJuICRrO2Nhc2UgMzU2NzU6cmV0dXJuIGFsO2Nhc2UgMzU2NzY6cmV0dXJuIGJsO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpyZXR1cm4gY2w7Y2FzZSAzNTY3OTpyZXR1cm4gZmw7Y2FzZSAzNTY4MDpyZXR1cm4gaGw7Y2FzZSAzNjI4OTpyZXR1cm4gZGw7Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIGlsO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gamw7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBrbDtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIGxsfX1mdW5jdGlvbiBubChhLGMpe2EudW5pZm9ybTFmdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gb2woYSxjKXthLnVuaWZvcm0xaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIHBsKGEsCmMpe2EudW5pZm9ybTJpdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gcWwoYSxjKXthLnVuaWZvcm0zaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIHJsKGEsYyl7YS51bmlmb3JtNGl2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBzbChhLGMpe2M9dGUoYyx0aGlzLnNpemUsMik7YS51bmlmb3JtMmZ2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiB0bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsMyk7YS51bmlmb3JtM2Z2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiB1bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsNCk7YS51bmlmb3JtNGZ2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiB2bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsNCk7YS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxjKX1mdW5jdGlvbiB3bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsOSk7YS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxjKX1mdW5jdGlvbiB4bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsMTYpO2EudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsCiExLGMpfWZ1bmN0aW9uIHlsKGEsYyxlKXt2YXIgZz1jLmxlbmd0aCxyPWRqKGUsZyk7YS51bmlmb3JtMWl2KHRoaXMuYWRkcixyKTtmb3IoYT0wO2EhPT1nOysrYSllLnNhZmVTZXRUZXh0dXJlMkQoY1thXXx8aWosclthXSl9ZnVuY3Rpb24gemwoYSxjLGUpe3ZhciBnPWMubGVuZ3RoLHI9ZGooZSxnKTthLnVuaWZvcm0xaXYodGhpcy5hZGRyLHIpO2ZvcihhPTA7YSE9PWc7KythKWUuc2FmZVNldFRleHR1cmVDdWJlKGNbYV18fGpqLHJbYV0pfWZ1bmN0aW9uIEFsKGEpe3N3aXRjaChhKXtjYXNlIDUxMjY6cmV0dXJuIG5sO2Nhc2UgMzU2NjQ6cmV0dXJuIHNsO2Nhc2UgMzU2NjU6cmV0dXJuIHRsO2Nhc2UgMzU2NjY6cmV0dXJuIHVsO2Nhc2UgMzU2NzQ6cmV0dXJuIHZsO2Nhc2UgMzU2NzU6cmV0dXJuIHdsO2Nhc2UgMzU2NzY6cmV0dXJuIHhsO2Nhc2UgMzU2Nzg6cmV0dXJuIHlsO2Nhc2UgMzU2ODA6cmV0dXJuIHpsO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBvbDtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIHBsOwpjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIHFsO2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gcmx9fWZ1bmN0aW9uIEJsKGEsYyxlKXt0aGlzLmlkPWE7dGhpcy5hZGRyPWU7dGhpcy5jYWNoZT1bXTt0aGlzLnNldFZhbHVlPW1sKGMudHlwZSl9ZnVuY3Rpb24ga2ooYSxjLGUpe3RoaXMuaWQ9YTt0aGlzLmFkZHI9ZTt0aGlzLmNhY2hlPVtdO3RoaXMuc2l6ZT1jLnNpemU7dGhpcy5zZXRWYWx1ZT1BbChjLnR5cGUpfWZ1bmN0aW9uIGxqKGEpe3RoaXMuaWQ9YTt0aGlzLnNlcT1bXTt0aGlzLm1hcD17fX1mdW5jdGlvbiBtaihhLGMpe2Euc2VxLnB1c2goYyk7YS5tYXBbYy5pZF09Y31mdW5jdGlvbiBDbChhLGMsZSl7dmFyIGc9YS5uYW1lLHI9Zy5sZW5ndGg7Zm9yKExoLmxhc3RJbmRleD0wOzspe3ZhciB2PUxoLmV4ZWMoZyksej1MaC5sYXN0SW5kZXgsRT12WzFdLEY9dlszXTsiXSI9PT12WzJdJiYoRXw9MCk7aWYodm9pZCAwPT09Rnx8IlsiPT09RiYmeisyPT09cil7bWooZSwKdm9pZCAwPT09Rj9uZXcgQmwoRSxhLGMpOm5ldyBraihFLGEsYykpO2JyZWFrfWVsc2Ugdj1lLm1hcFtFXSx2b2lkIDA9PT12JiYodj1uZXcgbGooRSksbWooZSx2KSksZT12fX1mdW5jdGlvbiB1ZChhLGMpe3RoaXMuc2VxPVtdO3RoaXMubWFwPXt9O2Zvcih2YXIgZT1hLmdldFByb2dyYW1QYXJhbWV0ZXIoYywzNTcxOCksZz0wO2c8ZTsrK2cpe3ZhciByPWEuZ2V0QWN0aXZlVW5pZm9ybShjLGcpO0NsKHIsYS5nZXRVbmlmb3JtTG9jYXRpb24oYyxyLm5hbWUpLHRoaXMpfX1mdW5jdGlvbiBuaihhLGMsZSl7Yz1hLmNyZWF0ZVNoYWRlcihjKTthLnNoYWRlclNvdXJjZShjLGUpO2EuY29tcGlsZVNoYWRlcihjKTtyZXR1cm4gY31mdW5jdGlvbiBEbChhKXthPWEuc3BsaXQoIlxuIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYVtjXT1jKzErIjogIithW2NdO3JldHVybiBhLmpvaW4oIlxuIil9ZnVuY3Rpb24gb2ooYSl7c3dpdGNoKGEpe2Nhc2UgM0UzOnJldHVyblsiTGluZWFyIiwKIiggdmFsdWUgKSJdO2Nhc2UgMzAwMTpyZXR1cm5bInNSR0IiLCIoIHZhbHVlICkiXTtjYXNlIDMwMDI6cmV0dXJuWyJSR0JFIiwiKCB2YWx1ZSApIl07Y2FzZSAzMDA0OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDcuMCApIl07Y2FzZSAzMDA1OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDE2LjAgKSJdO2Nhc2UgMzAwNjpyZXR1cm5bIlJHQkQiLCIoIHZhbHVlLCAyNTYuMCApIl07Y2FzZSAzMDA3OnJldHVyblsiR2FtbWEiLCIoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSJdO2Nhc2UgMzAwMzpyZXR1cm5bIkxvZ0x1diIsIiggdmFsdWUgKSJdO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIGVuY29kaW5nOiAiK2EpO319ZnVuY3Rpb24gcGooYSxjLGUpe3ZhciBnPWEuZ2V0U2hhZGVyUGFyYW1ldGVyKGMsMzU3MTMpLHI9YS5nZXRTaGFkZXJJbmZvTG9nKGMpLnRyaW0oKTtyZXR1cm4gZyYmIiI9PT1yPyIiOiJUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpICIrCmUrIlxuIityK0RsKGEuZ2V0U2hhZGVyU291cmNlKGMpKX1mdW5jdGlvbiB1ZyhhLGMpe2M9b2ooYyk7cmV0dXJuInZlYzQgIithKyIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiAiK2NbMF0rIlRvTGluZWFyIitjWzFdKyI7IH0ifWZ1bmN0aW9uIEVsKGEsYyl7Yz1vaihjKTtyZXR1cm4idmVjNCAiK2ErIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvIitjWzBdK2NbMV0rIjsgfSJ9ZnVuY3Rpb24gRmwoYSxjKXtzd2l0Y2goYyl7Y2FzZSAxOmM9IkxpbmVhciI7YnJlYWs7Y2FzZSAyOmM9IlJlaW5oYXJkIjticmVhaztjYXNlIDM6Yz0iVW5jaGFydGVkMiI7YnJlYWs7Y2FzZSA0OmM9Ik9wdGltaXplZENpbmVvbiI7YnJlYWs7Y2FzZSA1OmM9IkFDRVNGaWxtaWMiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiAiK2MpO31yZXR1cm4idmVjMyAiK2ErIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrYysiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifQpmdW5jdGlvbiBHbChhLGMsZSl7YT1hfHx7fTtyZXR1cm5bYS5kZXJpdmF0aXZlc3x8Yy5lbnZNYXBDdWJlVVZ8fGMuYnVtcE1hcHx8Yy50YW5nZW50U3BhY2VOb3JtYWxNYXB8fGMuY2xlYXJjb2F0Tm9ybWFsTWFwfHxjLmZsYXRTaGFkaW5nPyIjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZSI6IiIsKGEuZnJhZ0RlcHRofHxjLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpJiZlLmdldCgiRVhUX2ZyYWdfZGVwdGgiKT8iI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZSI6IiIsYS5kcmF3QnVmZmVycyYmZS5nZXQoIldFQkdMX2RyYXdfYnVmZmVycyIpPyIjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlIjoiIiwoYS5zaGFkZXJUZXh0dXJlTE9EfHxjLmVudk1hcCkmJmUuZ2V0KCJFWFRfc2hhZGVyX3RleHR1cmVfbG9kIik/IiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZSI6IiJdLmZpbHRlcih1Zikuam9pbigiXG4iKX0KZnVuY3Rpb24gSGwoYSl7dmFyIGM9W10sZTtmb3IoZSBpbiBhKXt2YXIgZz1hW2VdOyExIT09ZyYmYy5wdXNoKCIjZGVmaW5lICIrZSsiICIrZyl9cmV0dXJuIGMuam9pbigiXG4iKX1mdW5jdGlvbiBJbChhLGMpe2Zvcih2YXIgZT17fSxnPWEuZ2V0UHJvZ3JhbVBhcmFtZXRlcihjLDM1NzIxKSxyPTA7cjxnO3IrKyl7dmFyIHY9YS5nZXRBY3RpdmVBdHRyaWIoYyxyKS5uYW1lO2Vbdl09YS5nZXRBdHRyaWJMb2NhdGlvbihjLHYpfXJldHVybiBlfWZ1bmN0aW9uIHVmKGEpe3JldHVybiIiIT09YX1mdW5jdGlvbiBxaihhLGMpe3JldHVybiBhLnJlcGxhY2UoL05VTV9ESVJfTElHSFRTL2csYy5udW1EaXJMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUUy9nLGMubnVtU3BvdExpZ2h0cykucmVwbGFjZSgvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZyxjLm51bVJlY3RBcmVhTGlnaHRzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRTL2csYy5udW1Qb2ludExpZ2h0cykucmVwbGFjZSgvTlVNX0hFTUlfTElHSFRTL2csCmMubnVtSGVtaUxpZ2h0cykucmVwbGFjZSgvTlVNX0RJUl9MSUdIVF9TSEFET1dTL2csYy5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZyxjLm51bVNwb3RMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVF9TSEFET1dTL2csYy5udW1Qb2ludExpZ2h0U2hhZG93cyl9ZnVuY3Rpb24gcmooYSxjKXtyZXR1cm4gYS5yZXBsYWNlKC9OVU1fQ0xJUFBJTkdfUExBTkVTL2csYy5udW1DbGlwcGluZ1BsYW5lcykucmVwbGFjZSgvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csYy5udW1DbGlwcGluZ1BsYW5lcy1jLm51bUNsaXBJbnRlcnNlY3Rpb24pfWZ1bmN0aW9uIE1oKGEpe3JldHVybiBhLnJlcGxhY2UoL15bIFx0XSojaW5jbHVkZSArPChbXHdcZC4vXSspPi9nbSxmdW5jdGlvbihjLGUpe2M9cmJbZV07aWYodm9pZCAwPT09Yyl0aHJvdyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIFx4M2MiK2UrIlx4M2UiKTtyZXR1cm4gTWgoYyl9KX0KZnVuY3Rpb24gc2ooYSl7cmV0dXJuIGEucmVwbGFjZSgvI3ByYWdtYSB1bnJvbGxfbG9vcFtcc10rP2ZvciBcKCBpbnQgaSA9IChcZCspOyBpIDwgKFxkKyk7IGkgXCtcKyBcKSBceyhbXHNcU10rPykoPz1cfSlcfS9nLGZ1bmN0aW9uKGMsZSxnLHIpe2M9IiI7Zm9yKGU9cGFyc2VJbnQoZSk7ZTxwYXJzZUludChnKTtlKyspYys9ci5yZXBsYWNlKC9cWyBpIFxdL2csIlsgIitlKyIgXSIpLnJlcGxhY2UoL1VOUk9MTEVEX0xPT1BfSU5ERVgvZyxlKTtyZXR1cm4gY30pfWZ1bmN0aW9uIEpsKGEsYyxlLGcscix2LHope3ZhciBFPWEuZ2V0Q29udGV4dCgpLEY9Zy5kZWZpbmVzLEo9ci52ZXJ0ZXhTaGFkZXIsUD1yLmZyYWdtZW50U2hhZGVyLFI9IlNIQURPV01BUF9UWVBFX0JBU0lDIjsxPT09di5zaGFkb3dNYXBUeXBlP1I9IlNIQURPV01BUF9UWVBFX1BDRiI6Mj09PXYuc2hhZG93TWFwVHlwZT9SPSJTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCI6Mz09PXYuc2hhZG93TWFwVHlwZSYmKFI9CiJTSEFET1dNQVBfVFlQRV9WU00iKTt2YXIgUz0iRU5WTUFQX1RZUEVfQ1VCRSIsVj0iRU5WTUFQX01PREVfUkVGTEVDVElPTiIsVz0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjtpZih2LmVudk1hcCl7c3dpdGNoKGcuZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAxOmNhc2UgMzAyOlM9IkVOVk1BUF9UWVBFX0NVQkUiO2JyZWFrO2Nhc2UgMzA2OmNhc2UgMzA3OlM9IkVOVk1BUF9UWVBFX0NVQkVfVVYiO2JyZWFrO2Nhc2UgMzAzOmNhc2UgMzA0OlM9IkVOVk1BUF9UWVBFX0VRVUlSRUMiO2JyZWFrO2Nhc2UgMzA1OlM9IkVOVk1BUF9UWVBFX1NQSEVSRSJ9c3dpdGNoKGcuZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAyOmNhc2UgMzA0OlY9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04ifXN3aXRjaChnLmNvbWJpbmUpe2Nhc2UgMDpXPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgMTpXPSJFTlZNQVBfQkxFTkRJTkdfTUlYIjticmVhaztjYXNlIDI6Vz0iRU5WTUFQX0JMRU5ESU5HX0FERCJ9fXZhciBoYT0KMDxhLmdhbW1hRmFjdG9yP2EuZ2FtbWFGYWN0b3I6MSxmYT16LmlzV2ViR0wyPyIiOkdsKGcuZXh0ZW5zaW9ucyx2LGMpLHJhPUhsKEYpLHBhPUUuY3JlYXRlUHJvZ3JhbSgpO2cuaXNSYXdTaGFkZXJNYXRlcmlhbD8oRj1bcmFdLmZpbHRlcih1Zikuam9pbigiXG4iKSwwPEYubGVuZ3RoJiYoRis9IlxuIiksYz1bZmEscmFdLmZpbHRlcih1Zikuam9pbigiXG4iKSwwPGMubGVuZ3RoJiYoYys9IlxuIikpOihGPVsicHJlY2lzaW9uICIrdi5wcmVjaXNpb24rIiBmbG9hdDsiLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGludDsiLCJoaWdocCI9PT12LnByZWNpc2lvbj8iI2RlZmluZSBISUdIX1BSRUNJU0lPTiI6IiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIityLm5hbWUscmEsdi5zdXBwb3J0c1ZlcnRleFRleHR1cmVzPyIjZGVmaW5lIFZFUlRFWF9URVhUVVJFUyI6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIraGEsIiNkZWZpbmUgTUFYX0JPTkVTICIrdi5tYXhCb25lcyx2LnVzZUZvZyYmCnYuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHYudXNlRm9nJiZ2LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHYubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrVjoiIix2LmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsdi5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLHYuZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIix2LmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHYubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdi5ub3JtYWxNYXAmJnYudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHYuY2xlYXJjb2F0Tm9ybWFsTWFwPwoiI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsdi5kaXNwbGFjZW1lbnRNYXAmJnYuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIix2LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHYudmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLHYudmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsdi52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIix2LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix2LnNraW5uaW5nPyIjZGVmaW5lIFVTRV9TS0lOTklORyI6IiIsdi51c2VWZXJ0ZXhUZXh0dXJlPyIjZGVmaW5lIEJPTkVfVEVYVFVSRSI6CiIiLHYubW9ycGhUYXJnZXRzPyIjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMiOiIiLHYubW9ycGhOb3JtYWxzJiYhMT09PXYuZmxhdFNoYWRpbmc/IiNkZWZpbmUgVVNFX01PUlBITk9STUFMUyI6IiIsdi5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLHYuZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIix2LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitSOiIiLHYuc2l6ZUF0dGVudWF0aW9uPyIjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04iOiIiLHYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOiIiLHYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmKHouaXNXZWJHTDJ8fGMuZ2V0KCJFWFRfZnJhZ19kZXB0aCIpKT8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OyIsInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwKInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OyIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLCJhdHRyaWJ1dGUgdmVjMiB1djsiLCIjaWZkZWYgVVNFX1RBTkdFTlQiLCJcdGF0dHJpYnV0ZSB2ZWM0IHRhbmdlbnQ7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9DT0xPUiIsIlx0YXR0cmlidXRlIHZlYzMgY29sb3I7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MjsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsiLCJcdCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTIiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsiLAoiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7IiwiXHQjZWxzZSIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7IiwiXHQjZW5kaWYiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1NLSU5OSU5HIiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OyIsIiNlbmRpZiIsIlxuIl0uZmlsdGVyKHVmKS5qb2luKCJcbiIpLGM9W2ZhLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGZsb2F0OyIsInByZWNpc2lvbiAiK3YucHJlY2lzaW9uKyIgaW50OyIsImhpZ2hwIj09PXYucHJlY2lzaW9uPyIjZGVmaW5lIEhJR0hfUFJFQ0lTSU9OIjoKIiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIityLm5hbWUscmEsdi5hbHBoYVRlc3Q/IiNkZWZpbmUgQUxQSEFURVNUICIrdi5hbHBoYVRlc3QrKHYuYWxwaGFUZXN0JTE/IiI6Ii4wIik6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIraGEsdi51c2VGb2cmJnYuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHYudXNlRm9nJiZ2LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHYubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHYubWF0Y2FwPyIjZGVmaW5lIFVTRV9NQVRDQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrUzoiIix2LmVudk1hcD8iI2RlZmluZSAiK1Y6IiIsdi5lbnZNYXA/IiNkZWZpbmUgIitXOiIiLHYubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIix2LmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsdi5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLHYuYnVtcE1hcD8KIiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHYubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdi5ub3JtYWxNYXAmJnYudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHYuY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIix2LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHYuc2hlZW4/IiNkZWZpbmUgVVNFX1NIRUVOIjoiIix2LnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoKIiIsdi52ZXJ0ZXhDb2xvcnM/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIix2LnZlcnRleFV2cz8iI2RlZmluZSBVU0VfVVYiOiIiLHYuZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIix2LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix2LmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsdi5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsdi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK1I6IiIsdi5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsdi5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz8iI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJgooei5pc1dlYkdMMnx8Yy5nZXQoIkVYVF9mcmFnX2RlcHRoIikpPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLChnLmV4dGVuc2lvbnMmJmcuZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EfHx2LmVudk1hcCkmJih6LmlzV2ViR0wyfHxjLmdldCgiRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCIpKT8iI2RlZmluZSBURVhUVVJFX0xPRF9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwwIT09di50b25lTWFwcGluZz8iI2RlZmluZSBUT05FX01BUFBJTkciOiIiLDAhPT12LnRvbmVNYXBwaW5nP3JiLnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiIsMCE9PXYudG9uZU1hcHBpbmc/RmwoInRvbmVNYXBwaW5nIix2LnRvbmVNYXBwaW5nKToiIix2LmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHYub3V0cHV0RW5jb2Rpbmd8fHYubWFwRW5jb2Rpbmd8fHYubWF0Y2FwRW5jb2Rpbmd8fHYuZW52TWFwRW5jb2Rpbmd8fAp2LmVtaXNzaXZlTWFwRW5jb2Rpbmc/cmIuZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IiIsdi5tYXBFbmNvZGluZz91ZygibWFwVGV4ZWxUb0xpbmVhciIsdi5tYXBFbmNvZGluZyk6IiIsdi5tYXRjYXBFbmNvZGluZz91ZygibWF0Y2FwVGV4ZWxUb0xpbmVhciIsdi5tYXRjYXBFbmNvZGluZyk6IiIsdi5lbnZNYXBFbmNvZGluZz91ZygiZW52TWFwVGV4ZWxUb0xpbmVhciIsdi5lbnZNYXBFbmNvZGluZyk6IiIsdi5lbWlzc2l2ZU1hcEVuY29kaW5nP3VnKCJlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIiLHYuZW1pc3NpdmVNYXBFbmNvZGluZyk6IiIsdi5vdXRwdXRFbmNvZGluZz9FbCgibGluZWFyVG9PdXRwdXRUZXhlbCIsdi5vdXRwdXRFbmNvZGluZyk6IiIsdi5kZXB0aFBhY2tpbmc/IiNkZWZpbmUgREVQVEhfUEFDS0lORyAiK2cuZGVwdGhQYWNraW5nOiIiLCJcbiJdLmZpbHRlcih1Zikuam9pbigiXG4iKSk7Sj1NaChKKTtKPXFqKEosdik7Sj1yaihKLHYpO1A9TWgoUCk7UD1xaihQLAp2KTtQPXJqKFAsdik7Sj1zaihKKTtQPXNqKFApO3ouaXNXZWJHTDImJiFnLmlzUmF3U2hhZGVyTWF0ZXJpYWwmJih6PSExLFI9L15ccyojdmVyc2lvblxzKzMwMFxzK2VzXHMqXG4vLGcuaXNTaGFkZXJNYXRlcmlhbCYmbnVsbCE9PUoubWF0Y2goUikmJm51bGwhPT1QLm1hdGNoKFIpJiYoej0hMCxKPUoucmVwbGFjZShSLCIiKSxQPVAucmVwbGFjZShSLCIiKSksRj0iI3ZlcnNpb24gMzAwIGVzXG5cbiNkZWZpbmUgYXR0cmlidXRlIGluXG4jZGVmaW5lIHZhcnlpbmcgb3V0XG4jZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlXG4iK0YsYz1bIiN2ZXJzaW9uIDMwMCBlc1xuXG4jZGVmaW5lIHZhcnlpbmcgaW4iLHo/IiI6Im91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLHo/IiI6IiNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvciIsIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aFxuI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZVxuI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlXG4jZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2pcbiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2RcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZFxuI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kXG4jZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWRcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkXG4jZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCJdLmpvaW4oIlxuIikrCiJcbiIrYyk7UD1jK1A7Sj1uaihFLDM1NjMzLEYrSik7UD1uaihFLDM1NjMyLFApO0UuYXR0YWNoU2hhZGVyKHBhLEopO0UuYXR0YWNoU2hhZGVyKHBhLFApO3ZvaWQgMCE9PWcuaW5kZXgwQXR0cmlidXRlTmFtZT9FLmJpbmRBdHRyaWJMb2NhdGlvbihwYSwwLGcuaW5kZXgwQXR0cmlidXRlTmFtZSk6ITA9PT12Lm1vcnBoVGFyZ2V0cyYmRS5iaW5kQXR0cmliTG9jYXRpb24ocGEsMCwicG9zaXRpb24iKTtFLmxpbmtQcm9ncmFtKHBhKTtpZihhLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKXthPUUuZ2V0UHJvZ3JhbUluZm9Mb2cocGEpLnRyaW0oKTt2PUUuZ2V0U2hhZGVySW5mb0xvZyhKKS50cmltKCk7ej1FLmdldFNoYWRlckluZm9Mb2coUCkudHJpbSgpO1M9Uj0hMDtpZighMT09PUUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwYSwzNTcxNCkpUj0hMSxWPXBqKEUsSiwidmVydGV4IiksVz1waihFLFAsImZyYWdtZW50IiksY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICIsCkUuZ2V0RXJyb3IoKSwiMzU3MTUiLEUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwYSwzNTcxNSksImdsLmdldFByb2dyYW1JbmZvTG9nIixhLFYsVyk7ZWxzZSBpZigiIiE9PWEpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCkiLGEpO2Vsc2UgaWYoIiI9PT12fHwiIj09PXopUz0hMTtTJiYodGhpcy5kaWFnbm9zdGljcz17cnVubmFibGU6UixtYXRlcmlhbDpnLHByb2dyYW1Mb2c6YSx2ZXJ0ZXhTaGFkZXI6e2xvZzp2LHByZWZpeDpGfSxmcmFnbWVudFNoYWRlcjp7bG9nOnoscHJlZml4OmN9fSl9RS5kZWxldGVTaGFkZXIoSik7RS5kZWxldGVTaGFkZXIoUCk7dmFyIHFhO3RoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXt2b2lkIDA9PT1xYSYmKHFhPW5ldyB1ZChFLHBhKSk7cmV0dXJuIHFhfTt2YXIgdWE7dGhpcy5nZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7dm9pZCAwPT09dWEmJih1YT1JbChFLHBhKSk7cmV0dXJuIHVhfTt0aGlzLmRlc3Ryb3k9CmZ1bmN0aW9uKCl7RS5kZWxldGVQcm9ncmFtKHBhKTt0aGlzLnByb2dyYW09dm9pZCAwfTt0aGlzLm5hbWU9ci5uYW1lO3RoaXMuaWQ9S2wrKzt0aGlzLmNvZGU9ZTt0aGlzLnVzZWRUaW1lcz0xO3RoaXMucHJvZ3JhbT1wYTt0aGlzLnZlcnRleFNoYWRlcj1KO3RoaXMuZnJhZ21lbnRTaGFkZXI9UDtyZXR1cm4gdGhpc31mdW5jdGlvbiBMbChhLGMsZSl7ZnVuY3Rpb24gZyhGKXtGPUYuc2tlbGV0b24uYm9uZXM7aWYoZS5mbG9hdFZlcnRleFRleHR1cmVzKXJldHVybiAxMDI0O3ZhciBKPU1hdGgubWluKE1hdGguZmxvb3IoKGUubWF4VmVydGV4VW5pZm9ybXMtMjApLzQpLEYubGVuZ3RoKTtyZXR1cm4gSjxGLmxlbmd0aD8oY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2VsZXRvbiBoYXMgIitGLmxlbmd0aCsiIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAiK0orIi4iKSwwKTpKfWZ1bmN0aW9uIHIoRixKKXtpZihGKUYuaXNUZXh0dXJlP1A9Ri5lbmNvZGluZzpGLmlzV2ViR0xSZW5kZXJUYXJnZXQmJgooY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksUD1GLnRleHR1cmUuZW5jb2RpbmcpO2Vsc2UgdmFyIFA9M0UzOzNFMz09PVAmJkomJihQPTMwMDcpO3JldHVybiBQfXZhciB2PVtdLHo9e01lc2hEZXB0aE1hdGVyaWFsOiJkZXB0aCIsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ImRpc3RhbmNlUkdCQSIsTWVzaE5vcm1hbE1hdGVyaWFsOiJub3JtYWwiLE1lc2hCYXNpY01hdGVyaWFsOiJiYXNpYyIsTWVzaExhbWJlcnRNYXRlcmlhbDoibGFtYmVydCIsTWVzaFBob25nTWF0ZXJpYWw6InBob25nIixNZXNoVG9vbk1hdGVyaWFsOiJwaG9uZyIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIiwKTGluZUJhc2ljTWF0ZXJpYWw6ImJhc2ljIixMaW5lRGFzaGVkTWF0ZXJpYWw6ImRhc2hlZCIsUG9pbnRzTWF0ZXJpYWw6InBvaW50cyIsU2hhZG93TWF0ZXJpYWw6InNoYWRvdyIsU3ByaXRlTWF0ZXJpYWw6InNwcml0ZSJ9LEU9InByZWNpc2lvbiBzdXBwb3J0c1ZlcnRleFRleHR1cmVzIG1hcCBtYXBFbmNvZGluZyBtYXRjYXAgbWF0Y2FwRW5jb2RpbmcgZW52TWFwIGVudk1hcE1vZGUgZW52TWFwRW5jb2RpbmcgbGlnaHRNYXAgYW9NYXAgZW1pc3NpdmVNYXAgZW1pc3NpdmVNYXBFbmNvZGluZyBidW1wTWFwIG5vcm1hbE1hcCBvYmplY3RTcGFjZU5vcm1hbE1hcCB0YW5nZW50U3BhY2VOb3JtYWxNYXAgY2xlYXJjb2F0Tm9ybWFsTWFwIGRpc3BsYWNlbWVudE1hcCBzcGVjdWxhck1hcCByb3VnaG5lc3NNYXAgbWV0YWxuZXNzTWFwIGdyYWRpZW50TWFwIGFscGhhTWFwIGNvbWJpbmUgdmVydGV4Q29sb3JzIHZlcnRleFRhbmdlbnRzIGZvZyB1c2VGb2cgZm9nRXhwMiBmbGF0U2hhZGluZyBzaXplQXR0ZW51YXRpb24gbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciBza2lubmluZyBtYXhCb25lcyB1c2VWZXJ0ZXhUZXh0dXJlIG1vcnBoVGFyZ2V0cyBtb3JwaE5vcm1hbHMgbWF4TW9ycGhUYXJnZXRzIG1heE1vcnBoTm9ybWFscyBwcmVtdWx0aXBsaWVkQWxwaGEgbnVtRGlyTGlnaHRzIG51bVBvaW50TGlnaHRzIG51bVNwb3RMaWdodHMgbnVtSGVtaUxpZ2h0cyBudW1SZWN0QXJlYUxpZ2h0cyBzaGFkb3dNYXBFbmFibGVkIHNoYWRvd01hcFR5cGUgdG9uZU1hcHBpbmcgcGh5c2ljYWxseUNvcnJlY3RMaWdodHMgYWxwaGFUZXN0IGRvdWJsZVNpZGVkIGZsaXBTaWRlZCBudW1DbGlwcGluZ1BsYW5lcyBudW1DbGlwSW50ZXJzZWN0aW9uIGRlcHRoUGFja2luZyBkaXRoZXJpbmcgc2hlZW4iLnNwbGl0KCIgIik7CnRoaXMuZ2V0UGFyYW1ldGVycz1mdW5jdGlvbihGLEosUCxSLFMsVixXKXt2YXIgaGE9eltGLnR5cGVdLGZhPVcuaXNTa2lubmVkTWVzaD9nKFcpOjAscmE9ZS5wcmVjaXNpb247bnVsbCE9PUYucHJlY2lzaW9uJiYocmE9ZS5nZXRNYXhQcmVjaXNpb24oRi5wcmVjaXNpb24pLHJhIT09Ri5wcmVjaXNpb24mJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6IixGLnByZWNpc2lvbiwibm90IHN1cHBvcnRlZCwgdXNpbmciLHJhLCJpbnN0ZWFkLiIpKTt2YXIgcGE9YS5nZXRSZW5kZXJUYXJnZXQoKTtyZXR1cm57c2hhZGVySUQ6aGEscHJlY2lzaW9uOnJhLHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6ZS52ZXJ0ZXhUZXh0dXJlcyxvdXRwdXRFbmNvZGluZzpyKHBhP3BhLnRleHR1cmU6bnVsbCxhLmdhbW1hT3V0cHV0KSxtYXA6ISFGLm1hcCxtYXBFbmNvZGluZzpyKEYubWFwLGEuZ2FtbWFJbnB1dCksbWF0Y2FwOiEhRi5tYXRjYXAsbWF0Y2FwRW5jb2Rpbmc6cihGLm1hdGNhcCwKYS5nYW1tYUlucHV0KSxlbnZNYXA6ISFGLmVudk1hcCxlbnZNYXBNb2RlOkYuZW52TWFwJiZGLmVudk1hcC5tYXBwaW5nLGVudk1hcEVuY29kaW5nOnIoRi5lbnZNYXAsYS5nYW1tYUlucHV0KSxlbnZNYXBDdWJlVVY6ISFGLmVudk1hcCYmKDMwNj09PUYuZW52TWFwLm1hcHBpbmd8fDMwNz09PUYuZW52TWFwLm1hcHBpbmcpLGxpZ2h0TWFwOiEhRi5saWdodE1hcCxhb01hcDohIUYuYW9NYXAsZW1pc3NpdmVNYXA6ISFGLmVtaXNzaXZlTWFwLGVtaXNzaXZlTWFwRW5jb2Rpbmc6cihGLmVtaXNzaXZlTWFwLGEuZ2FtbWFJbnB1dCksYnVtcE1hcDohIUYuYnVtcE1hcCxub3JtYWxNYXA6ISFGLm5vcm1hbE1hcCxvYmplY3RTcGFjZU5vcm1hbE1hcDoxPT09Ri5ub3JtYWxNYXBUeXBlLHRhbmdlbnRTcGFjZU5vcm1hbE1hcDowPT09Ri5ub3JtYWxNYXBUeXBlLGNsZWFyY29hdE5vcm1hbE1hcDohIUYuY2xlYXJjb2F0Tm9ybWFsTWFwLGRpc3BsYWNlbWVudE1hcDohIUYuZGlzcGxhY2VtZW50TWFwLApyb3VnaG5lc3NNYXA6ISFGLnJvdWdobmVzc01hcCxtZXRhbG5lc3NNYXA6ISFGLm1ldGFsbmVzc01hcCxzcGVjdWxhck1hcDohIUYuc3BlY3VsYXJNYXAsYWxwaGFNYXA6ISFGLmFscGhhTWFwLGdyYWRpZW50TWFwOiEhRi5ncmFkaWVudE1hcCxzaGVlbjohIUYuc2hlZW4sY29tYmluZTpGLmNvbWJpbmUsdmVydGV4VGFuZ2VudHM6Ri5ub3JtYWxNYXAmJkYudmVydGV4VGFuZ2VudHMsdmVydGV4Q29sb3JzOkYudmVydGV4Q29sb3JzLHZlcnRleFV2czohIUYubWFwfHwhIUYuYnVtcE1hcHx8ISFGLm5vcm1hbE1hcHx8ISFGLnNwZWN1bGFyTWFwfHwhIUYuYWxwaGFNYXB8fCEhRi5lbWlzc2l2ZU1hcHx8ISFGLnJvdWdobmVzc01hcHx8ISFGLm1ldGFsbmVzc01hcHx8ISFGLmNsZWFyY29hdE5vcm1hbE1hcCxmb2c6ISFSLHVzZUZvZzpGLmZvZyxmb2dFeHAyOlImJlIuaXNGb2dFeHAyLGZsYXRTaGFkaW5nOkYuZmxhdFNoYWRpbmcsc2l6ZUF0dGVudWF0aW9uOkYuc2l6ZUF0dGVudWF0aW9uLApsb2dhcml0aG1pY0RlcHRoQnVmZmVyOmUubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixza2lubmluZzpGLnNraW5uaW5nJiYwPGZhLG1heEJvbmVzOmZhLHVzZVZlcnRleFRleHR1cmU6ZS5mbG9hdFZlcnRleFRleHR1cmVzLG1vcnBoVGFyZ2V0czpGLm1vcnBoVGFyZ2V0cyxtb3JwaE5vcm1hbHM6Ri5tb3JwaE5vcm1hbHMsbWF4TW9ycGhUYXJnZXRzOmEubWF4TW9ycGhUYXJnZXRzLG1heE1vcnBoTm9ybWFsczphLm1heE1vcnBoTm9ybWFscyxudW1EaXJMaWdodHM6Si5kaXJlY3Rpb25hbC5sZW5ndGgsbnVtUG9pbnRMaWdodHM6Si5wb2ludC5sZW5ndGgsbnVtU3BvdExpZ2h0czpKLnNwb3QubGVuZ3RoLG51bVJlY3RBcmVhTGlnaHRzOkoucmVjdEFyZWEubGVuZ3RoLG51bUhlbWlMaWdodHM6Si5oZW1pLmxlbmd0aCxudW1EaXJMaWdodFNoYWRvd3M6Si5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsbnVtUG9pbnRMaWdodFNoYWRvd3M6Si5wb2ludFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93czpKLnNwb3RTaGFkb3dNYXAubGVuZ3RoLApudW1DbGlwcGluZ1BsYW5lczpTLG51bUNsaXBJbnRlcnNlY3Rpb246VixkaXRoZXJpbmc6Ri5kaXRoZXJpbmcsc2hhZG93TWFwRW5hYmxlZDphLnNoYWRvd01hcC5lbmFibGVkJiZXLnJlY2VpdmVTaGFkb3cmJjA8UC5sZW5ndGgsc2hhZG93TWFwVHlwZTphLnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOkYudG9uZU1hcHBlZD9hLnRvbmVNYXBwaW5nOjAscGh5c2ljYWxseUNvcnJlY3RMaWdodHM6YS5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxwcmVtdWx0aXBsaWVkQWxwaGE6Ri5wcmVtdWx0aXBsaWVkQWxwaGEsYWxwaGFUZXN0OkYuYWxwaGFUZXN0LGRvdWJsZVNpZGVkOjI9PT1GLnNpZGUsZmxpcFNpZGVkOjE9PT1GLnNpZGUsZGVwdGhQYWNraW5nOnZvaWQgMCE9PUYuZGVwdGhQYWNraW5nP0YuZGVwdGhQYWNraW5nOiExfX07dGhpcy5nZXRQcm9ncmFtQ29kZT1mdW5jdGlvbihGLEope3ZhciBQPVtdO0ouc2hhZGVySUQ/UC5wdXNoKEouc2hhZGVySUQpOihQLnB1c2goRi5mcmFnbWVudFNoYWRlciksClAucHVzaChGLnZlcnRleFNoYWRlcikpO2lmKHZvaWQgMCE9PUYuZGVmaW5lcylmb3IodmFyIFIgaW4gRi5kZWZpbmVzKVAucHVzaChSKSxQLnB1c2goRi5kZWZpbmVzW1JdKTtmb3IoUj0wO1I8RS5sZW5ndGg7UisrKVAucHVzaChKW0VbUl1dKTtQLnB1c2goRi5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKSk7UC5wdXNoKGEuZ2FtbWFPdXRwdXQpO1AucHVzaChhLmdhbW1hRmFjdG9yKTtyZXR1cm4gUC5qb2luKCl9O3RoaXMuYWNxdWlyZVByb2dyYW09ZnVuY3Rpb24oRixKLFAsUil7Zm9yKHZhciBTLFY9MCxXPXYubGVuZ3RoO1Y8VztWKyspe3ZhciBoYT12W1ZdO2lmKGhhLmNvZGU9PT1SKXtTPWhhOysrUy51c2VkVGltZXM7YnJlYWt9fXZvaWQgMD09PVMmJihTPW5ldyBKbChhLGMsUixGLEosUCxlKSx2LnB1c2goUykpO3JldHVybiBTfTt0aGlzLnJlbGVhc2VQcm9ncmFtPWZ1bmN0aW9uKEYpezA9PT0tLUYudXNlZFRpbWVzJiYodlt2LmluZGV4T2YoRildPXZbdi5sZW5ndGgtMV0sCnYucG9wKCksRi5kZXN0cm95KCkpfTt0aGlzLnByb2dyYW1zPXZ9ZnVuY3Rpb24gTWwoKXt2YXIgYT1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe3ZhciBlPWEuZ2V0KGMpO3ZvaWQgMD09PWUmJihlPXt9LGEuc2V0KGMsZSkpO3JldHVybiBlfSxyZW1vdmU6ZnVuY3Rpb24oYyl7YS5kZWxldGUoYyl9LHVwZGF0ZTpmdW5jdGlvbihjLGUsZyl7YS5nZXQoYylbZV09Z30sZGlzcG9zZTpmdW5jdGlvbigpe2E9bmV3IFdlYWtNYXB9fX1mdW5jdGlvbiBObChhLGMpe3JldHVybiBhLmdyb3VwT3JkZXIhPT1jLmdyb3VwT3JkZXI/YS5ncm91cE9yZGVyLWMuZ3JvdXBPcmRlcjphLnJlbmRlck9yZGVyIT09Yy5yZW5kZXJPcmRlcj9hLnJlbmRlck9yZGVyLWMucmVuZGVyT3JkZXI6YS5wcm9ncmFtIT09Yy5wcm9ncmFtP2EucHJvZ3JhbS5pZC1jLnByb2dyYW0uaWQ6YS5tYXRlcmlhbC5pZCE9PWMubWF0ZXJpYWwuaWQ/YS5tYXRlcmlhbC5pZC1jLm1hdGVyaWFsLmlkOmEueiE9PQpjLno/YS56LWMuejphLmlkLWMuaWR9ZnVuY3Rpb24gT2woYSxjKXtyZXR1cm4gYS5ncm91cE9yZGVyIT09Yy5ncm91cE9yZGVyP2EuZ3JvdXBPcmRlci1jLmdyb3VwT3JkZXI6YS5yZW5kZXJPcmRlciE9PWMucmVuZGVyT3JkZXI/YS5yZW5kZXJPcmRlci1jLnJlbmRlck9yZGVyOmEueiE9PWMuej9jLnotYS56OmEuaWQtYy5pZH1mdW5jdGlvbiB0aigpe2Z1bmN0aW9uIGEoeixFLEYsSixQLFIpe3ZhciBTPWNbZV07dm9pZCAwPT09Uz8oUz17aWQ6ei5pZCxvYmplY3Q6eixnZW9tZXRyeTpFLG1hdGVyaWFsOkYscHJvZ3JhbTpGLnByb2dyYW18fHYsZ3JvdXBPcmRlcjpKLHJlbmRlck9yZGVyOnoucmVuZGVyT3JkZXIsejpQLGdyb3VwOlJ9LGNbZV09Uyk6KFMuaWQ9ei5pZCxTLm9iamVjdD16LFMuZ2VvbWV0cnk9RSxTLm1hdGVyaWFsPUYsUy5wcm9ncmFtPUYucHJvZ3JhbXx8dixTLmdyb3VwT3JkZXI9SixTLnJlbmRlck9yZGVyPXoucmVuZGVyT3JkZXIsUy56PVAsUy5ncm91cD1SKTsKZSsrO3JldHVybiBTfXZhciBjPVtdLGU9MCxnPVtdLHI9W10sdj17aWQ6LTF9O3JldHVybntvcGFxdWU6Zyx0cmFuc3BhcmVudDpyLGluaXQ6ZnVuY3Rpb24oKXtlPTA7Zy5sZW5ndGg9MDtyLmxlbmd0aD0wfSxwdXNoOmZ1bmN0aW9uKHosRSxGLEosUCxSKXt6PWEoeixFLEYsSixQLFIpOyghMD09PUYudHJhbnNwYXJlbnQ/cjpnKS5wdXNoKHopfSx1bnNoaWZ0OmZ1bmN0aW9uKHosRSxGLEosUCxSKXt6PWEoeixFLEYsSixQLFIpOyghMD09PUYudHJhbnNwYXJlbnQ/cjpnKS51bnNoaWZ0KHopfSxzb3J0OmZ1bmN0aW9uKCl7MTxnLmxlbmd0aCYmZy5zb3J0KE5sKTsxPHIubGVuZ3RoJiZyLnNvcnQoT2wpfX19ZnVuY3Rpb24gUGwoKXtmdW5jdGlvbiBhKGUpe2U9ZS50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKTtjLmRlbGV0ZShlKX12YXIgYz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUsZyl7dmFyIHI9Yy5nZXQoZSk7aWYodm9pZCAwPT09CnIpe3ZhciB2PW5ldyB0ajtjLnNldChlLG5ldyBXZWFrTWFwKTtjLmdldChlKS5zZXQoZyx2KTtlLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpfWVsc2Ugdj1yLmdldChnKSx2b2lkIDA9PT12JiYodj1uZXcgdGosci5zZXQoZyx2KSk7cmV0dXJuIHZ9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtjPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gUWwoKXt2YXIgYT17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe2lmKHZvaWQgMCE9PWFbYy5pZF0pcmV0dXJuIGFbYy5pZF07c3dpdGNoKGMudHlwZSl7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dmFyIGU9e2RpcmVjdGlvbjpuZXcgayxjb2xvcjpuZXcgSSxzaGFkb3c6ITEsc2hhZG93QmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IGZ9O2JyZWFrO2Nhc2UgIlNwb3RMaWdodCI6ZT17cG9zaXRpb246bmV3IGssZGlyZWN0aW9uOm5ldyBrLGNvbG9yOm5ldyBJLGRpc3RhbmNlOjAsY29uZUNvczowLHBlbnVtYnJhQ29zOjAsZGVjYXk6MCwKc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmfTticmVhaztjYXNlICJQb2ludExpZ2h0IjplPXtwb3NpdGlvbjpuZXcgayxjb2xvcjpuZXcgSSxkaXN0YW5jZTowLGRlY2F5OjAsc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmLHNoYWRvd0NhbWVyYU5lYXI6MSxzaGFkb3dDYW1lcmFGYXI6MUUzfTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOmU9e2RpcmVjdGlvbjpuZXcgayxza3lDb2xvcjpuZXcgSSxncm91bmRDb2xvcjpuZXcgSX07YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6ZT17Y29sb3I6bmV3IEkscG9zaXRpb246bmV3IGssaGFsZldpZHRoOm5ldyBrLGhhbGZIZWlnaHQ6bmV3IGt9fXJldHVybiBhW2MuaWRdPWV9fX1mdW5jdGlvbiBSbChhLGMpe3JldHVybihjLmNhc3RTaGFkb3c/MTowKS0oYS5jYXN0U2hhZG93PzE6MCl9ZnVuY3Rpb24gU2woKXtmb3IodmFyIGE9Cm5ldyBRbCxjPXt2ZXJzaW9uOjAsaGFzaDp7ZGlyZWN0aW9uYWxMZW5ndGg6LTEscG9pbnRMZW5ndGg6LTEsc3BvdExlbmd0aDotMSxyZWN0QXJlYUxlbmd0aDotMSxoZW1pTGVuZ3RoOi0xLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGFtYmllbnQ6WzAsMCwwXSxwcm9iZTpbXSxkaXJlY3Rpb25hbDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hcDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDpbXSxzcG90OltdLHNwb3RTaGFkb3dNYXA6W10sc3BvdFNoYWRvd01hdHJpeDpbXSxyZWN0QXJlYTpbXSxwb2ludDpbXSxwb2ludFNoYWRvd01hcDpbXSxwb2ludFNoYWRvd01hdHJpeDpbXSxoZW1pOltdLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGU9MDs5PmU7ZSsrKWMucHJvYmUucHVzaChuZXcgayk7dmFyIGc9bmV3IGsscj1uZXcgcSx2PW5ldyBxO3JldHVybntzZXR1cDpmdW5jdGlvbih6LApFLEYpe2Zvcih2YXIgSj0wLFA9MCxSPTAsUz0wOzk+UztTKyspYy5wcm9iZVtTXS5zZXQoMCwwLDApO3ZhciBWPUU9MCxXPTAsaGE9MCxmYT0wLHJhPTAscGE9MCxxYT0wO0Y9Ri5tYXRyaXhXb3JsZEludmVyc2U7ei5zb3J0KFJsKTtTPTA7Zm9yKHZhciB1YT16Lmxlbmd0aDtTPHVhO1MrKyl7dmFyIG9hPXpbU10sdGE9b2EuY29sb3IsQmE9b2EuaW50ZW5zaXR5LFRhPW9hLmRpc3RhbmNlLFVhPW9hLnNoYWRvdyYmb2Euc2hhZG93Lm1hcD9vYS5zaGFkb3cubWFwLnRleHR1cmU6bnVsbDtpZihvYS5pc0FtYmllbnRMaWdodClKKz10YS5yKkJhLFArPXRhLmcqQmEsUis9dGEuYipCYTtlbHNlIGlmKG9hLmlzTGlnaHRQcm9iZSlmb3IoVWE9MDs5PlVhO1VhKyspYy5wcm9iZVtVYV0uYWRkU2NhbGVkVmVjdG9yKG9hLnNoLmNvZWZmaWNpZW50c1tVYV0sQmEpO2Vsc2UgaWYob2EuaXNEaXJlY3Rpb25hbExpZ2h0KXt2YXIgQ2E9YS5nZXQob2EpO0NhLmNvbG9yLmNvcHkob2EuY29sb3IpLm11bHRpcGx5U2NhbGFyKG9hLmludGVuc2l0eSk7CkNhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpO2cuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLnRhcmdldC5tYXRyaXhXb3JsZCk7Q2EuZGlyZWN0aW9uLnN1YihnKTtDYS5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKEYpO2lmKENhLnNoYWRvdz1vYS5jYXN0U2hhZG93KUJhPW9hLnNoYWRvdyxDYS5zaGFkb3dCaWFzPUJhLmJpYXMsQ2Euc2hhZG93UmFkaXVzPUJhLnJhZGl1cyxDYS5zaGFkb3dNYXBTaXplPUJhLm1hcFNpemUsYy5kaXJlY3Rpb25hbFNoYWRvd01hcFtFXT1VYSxjLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W0VdPW9hLnNoYWRvdy5tYXRyaXgscmErKztjLmRpcmVjdGlvbmFsW0VdPUNhO0UrK31lbHNlIGlmKG9hLmlzU3BvdExpZ2h0KXtDYT1hLmdldChvYSk7Q2EucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLm1hdHJpeFdvcmxkKTtDYS5wb3NpdGlvbi5hcHBseU1hdHJpeDQoRik7Q2EuY29sb3IuY29weSh0YSkubXVsdGlwbHlTY2FsYXIoQmEpOwpDYS5kaXN0YW5jZT1UYTtDYS5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLm1hdHJpeFdvcmxkKTtnLnNldEZyb21NYXRyaXhQb3NpdGlvbihvYS50YXJnZXQubWF0cml4V29ybGQpO0NhLmRpcmVjdGlvbi5zdWIoZyk7Q2EuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihGKTtDYS5jb25lQ29zPU1hdGguY29zKG9hLmFuZ2xlKTtDYS5wZW51bWJyYUNvcz1NYXRoLmNvcyhvYS5hbmdsZSooMS1vYS5wZW51bWJyYSkpO0NhLmRlY2F5PW9hLmRlY2F5O2lmKENhLnNoYWRvdz1vYS5jYXN0U2hhZG93KUJhPW9hLnNoYWRvdyxDYS5zaGFkb3dCaWFzPUJhLmJpYXMsQ2Euc2hhZG93UmFkaXVzPUJhLnJhZGl1cyxDYS5zaGFkb3dNYXBTaXplPUJhLm1hcFNpemUsYy5zcG90U2hhZG93TWFwW1ddPVVhLGMuc3BvdFNoYWRvd01hdHJpeFtXXT1vYS5zaGFkb3cubWF0cml4LHFhKys7Yy5zcG90W1ddPUNhO1crK31lbHNlIGlmKG9hLmlzUmVjdEFyZWFMaWdodClDYT1hLmdldChvYSksCkNhLmNvbG9yLmNvcHkodGEpLm11bHRpcGx5U2NhbGFyKEJhKSxDYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpLENhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChGKSx2LmlkZW50aXR5KCksci5jb3B5KG9hLm1hdHJpeFdvcmxkKSxyLnByZW11bHRpcGx5KEYpLHYuZXh0cmFjdFJvdGF0aW9uKHIpLENhLmhhbGZXaWR0aC5zZXQoLjUqb2Eud2lkdGgsMCwwKSxDYS5oYWxmSGVpZ2h0LnNldCgwLC41Km9hLmhlaWdodCwwKSxDYS5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KHYpLENhLmhhbGZIZWlnaHQuYXBwbHlNYXRyaXg0KHYpLGMucmVjdEFyZWFbaGFdPUNhLGhhKys7ZWxzZSBpZihvYS5pc1BvaW50TGlnaHQpe0NhPWEuZ2V0KG9hKTtDYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpO0NhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChGKTtDYS5jb2xvci5jb3B5KG9hLmNvbG9yKS5tdWx0aXBseVNjYWxhcihvYS5pbnRlbnNpdHkpOwpDYS5kaXN0YW5jZT1vYS5kaXN0YW5jZTtDYS5kZWNheT1vYS5kZWNheTtpZihDYS5zaGFkb3c9b2EuY2FzdFNoYWRvdylCYT1vYS5zaGFkb3csQ2Euc2hhZG93Qmlhcz1CYS5iaWFzLENhLnNoYWRvd1JhZGl1cz1CYS5yYWRpdXMsQ2Euc2hhZG93TWFwU2l6ZT1CYS5tYXBTaXplLENhLnNoYWRvd0NhbWVyYU5lYXI9QmEuY2FtZXJhLm5lYXIsQ2Euc2hhZG93Q2FtZXJhRmFyPUJhLmNhbWVyYS5mYXIsYy5wb2ludFNoYWRvd01hcFtWXT1VYSxjLnBvaW50U2hhZG93TWF0cml4W1ZdPW9hLnNoYWRvdy5tYXRyaXgscGErKztjLnBvaW50W1ZdPUNhO1YrK31lbHNlIG9hLmlzSGVtaXNwaGVyZUxpZ2h0JiYoQ2E9YS5nZXQob2EpLENhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpLENhLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oRiksQ2EuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpLENhLnNreUNvbG9yLmNvcHkob2EuY29sb3IpLm11bHRpcGx5U2NhbGFyKEJhKSwKQ2EuZ3JvdW5kQ29sb3IuY29weShvYS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoQmEpLGMuaGVtaVtmYV09Q2EsZmErKyl9Yy5hbWJpZW50WzBdPUo7Yy5hbWJpZW50WzFdPVA7Yy5hbWJpZW50WzJdPVI7ej1jLmhhc2g7aWYoei5kaXJlY3Rpb25hbExlbmd0aCE9PUV8fHoucG9pbnRMZW5ndGghPT1WfHx6LnNwb3RMZW5ndGghPT1XfHx6LnJlY3RBcmVhTGVuZ3RoIT09aGF8fHouaGVtaUxlbmd0aCE9PWZhfHx6Lm51bURpcmVjdGlvbmFsU2hhZG93cyE9PXJhfHx6Lm51bVBvaW50U2hhZG93cyE9PXBhfHx6Lm51bVNwb3RTaGFkb3dzIT09cWEpYy5kaXJlY3Rpb25hbC5sZW5ndGg9RSxjLnNwb3QubGVuZ3RoPVcsYy5yZWN0QXJlYS5sZW5ndGg9aGEsYy5wb2ludC5sZW5ndGg9VixjLmhlbWkubGVuZ3RoPWZhLGMuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoPXJhLGMucG9pbnRTaGFkb3dNYXAubGVuZ3RoPXBhLGMuc3BvdFNoYWRvd01hcC5sZW5ndGg9cWEsYy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGg9CnJhLGMucG9pbnRTaGFkb3dNYXRyaXgubGVuZ3RoPXBhLGMuc3BvdFNoYWRvd01hdHJpeC5sZW5ndGg9cWEsei5kaXJlY3Rpb25hbExlbmd0aD1FLHoucG9pbnRMZW5ndGg9Vix6LnNwb3RMZW5ndGg9Vyx6LnJlY3RBcmVhTGVuZ3RoPWhhLHouaGVtaUxlbmd0aD1mYSx6Lm51bURpcmVjdGlvbmFsU2hhZG93cz1yYSx6Lm51bVBvaW50U2hhZG93cz1wYSx6Lm51bVNwb3RTaGFkb3dzPXFhLGMudmVyc2lvbj1UbCsrfSxzdGF0ZTpjfX1mdW5jdGlvbiB1aigpe3ZhciBhPW5ldyBTbCxjPVtdLGU9W107cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtjLmxlbmd0aD0wO2UubGVuZ3RoPTB9LHN0YXRlOntsaWdodHNBcnJheTpjLHNoYWRvd3NBcnJheTplLGxpZ2h0czphfSxzZXR1cExpZ2h0czpmdW5jdGlvbihnKXthLnNldHVwKGMsZSxnKX0scHVzaExpZ2h0OmZ1bmN0aW9uKGcpe2MucHVzaChnKX0scHVzaFNoYWRvdzpmdW5jdGlvbihnKXtlLnB1c2goZyl9fX1mdW5jdGlvbiBVbCgpe2Z1bmN0aW9uIGEoZSl7ZT0KZS50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKTtjLmRlbGV0ZShlKX12YXIgYz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUsZyl7aWYoITE9PT1jLmhhcyhlKSl7dmFyIHI9bmV3IHVqO2Muc2V0KGUsbmV3IFdlYWtNYXApO2MuZ2V0KGUpLnNldChnLHIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSl9ZWxzZSExPT09Yy5nZXQoZSkuaGFzKGcpPyhyPW5ldyB1aixjLmdldChlKS5zZXQoZyxyKSk6cj1jLmdldChlKS5nZXQoZyk7cmV0dXJuIHJ9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtjPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gdmQoYSl7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaERlcHRoTWF0ZXJpYWwiO3RoaXMuZGVwdGhQYWNraW5nPTMyMDA7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KMTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIHdkKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hEaXN0YW5jZU1hdGVyaWFsIjt0aGlzLnJlZmVyZW5jZVBvc2l0aW9uPW5ldyBrO3RoaXMubmVhckRpc3RhbmNlPTE7dGhpcy5mYXJEaXN0YW5jZT0xRTM7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIHZqKGEsYyxlKXtmdW5jdGlvbiBnKHRhLEJhKXt2YXIgVGE9Yy51cGRhdGUocmEpO1cudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9CnRhLm1hcC50ZXh0dXJlO1cudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT10YS5tYXBTaXplO1cudW5pZm9ybXMucmFkaXVzLnZhbHVlPXRhLnJhZGl1czthLnNldFJlbmRlclRhcmdldCh0YS5tYXBQYXNzKTthLmNsZWFyKCk7YS5yZW5kZXJCdWZmZXJEaXJlY3QoQmEsbnVsbCxUYSxXLHJhLG51bGwpO2hhLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPXRhLm1hcFBhc3MudGV4dHVyZTtoYS51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPXRhLm1hcFNpemU7aGEudW5pZm9ybXMucmFkaXVzLnZhbHVlPXRhLnJhZGl1czthLnNldFJlbmRlclRhcmdldCh0YS5tYXApO2EuY2xlYXIoKTthLnJlbmRlckJ1ZmZlckRpcmVjdChCYSxudWxsLFRhLGhhLHJhLG51bGwpfWZ1bmN0aW9uIHIodGEsQmEsVGEsVWEsQ2EsSGEpe3ZhciBEYT10YS5nZW9tZXRyeTt2YXIgTWE9UDt2YXIgZGI9dGEuY3VzdG9tRGVwdGhNYXRlcmlhbDtUYS5pc1BvaW50TGlnaHQmJihNYT1SLGRiPXRhLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWwpOwpkYj9NYT1kYjooZGI9ITEsQmEubW9ycGhUYXJnZXRzJiYoRGEmJkRhLmlzQnVmZmVyR2VvbWV0cnk/ZGI9RGEubW9ycGhBdHRyaWJ1dGVzJiZEYS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24mJjA8RGEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDpEYSYmRGEuaXNHZW9tZXRyeSYmKGRiPURhLm1vcnBoVGFyZ2V0cyYmMDxEYS5tb3JwaFRhcmdldHMubGVuZ3RoKSksdGEuaXNTa2lubmVkTWVzaCYmITE9PT1CYS5za2lubmluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Iix0YSksdGE9dGEuaXNTa2lubmVkTWVzaCYmQmEuc2tpbm5pbmcsRGE9MCxkYiYmKERhfD0xKSx0YSYmKERhfD0yKSxNYT1NYVtEYV0pO2EubG9jYWxDbGlwcGluZ0VuYWJsZWQmJiEwPT09QmEuY2xpcFNoYWRvd3MmJjAhPT1CYS5jbGlwcGluZ1BsYW5lcy5sZW5ndGgmJihEYT1NYS51dWlkLApkYj1CYS51dWlkLHRhPVNbRGFdLHZvaWQgMD09PXRhJiYodGE9e30sU1tEYV09dGEpLERhPXRhW2RiXSx2b2lkIDA9PT1EYSYmKERhPU1hLmNsb25lKCksdGFbZGJdPURhKSxNYT1EYSk7TWEudmlzaWJsZT1CYS52aXNpYmxlO01hLndpcmVmcmFtZT1CYS53aXJlZnJhbWU7TWEuc2lkZT0zPT09SGE/bnVsbCE9QmEuc2hhZG93U2lkZT9CYS5zaGFkb3dTaWRlOkJhLnNpZGU6bnVsbCE9QmEuc2hhZG93U2lkZT9CYS5zaGFkb3dTaWRlOlZbQmEuc2lkZV07TWEuY2xpcFNoYWRvd3M9QmEuY2xpcFNoYWRvd3M7TWEuY2xpcHBpbmdQbGFuZXM9QmEuY2xpcHBpbmdQbGFuZXM7TWEuY2xpcEludGVyc2VjdGlvbj1CYS5jbGlwSW50ZXJzZWN0aW9uO01hLndpcmVmcmFtZUxpbmV3aWR0aD1CYS53aXJlZnJhbWVMaW5ld2lkdGg7TWEubGluZXdpZHRoPUJhLmxpbmV3aWR0aDtUYS5pc1BvaW50TGlnaHQmJk1hLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwmJihNYS5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oVGEubWF0cml4V29ybGQpLApNYS5uZWFyRGlzdGFuY2U9VWEsTWEuZmFyRGlzdGFuY2U9Q2EpO3JldHVybiBNYX1mdW5jdGlvbiB2KHRhLEJhLFRhLFVhLENhKXtpZighMSE9PXRhLnZpc2libGUpe2lmKHRhLmxheWVycy50ZXN0KEJhLmxheWVycykmJih0YS5pc01lc2h8fHRhLmlzTGluZXx8dGEuaXNQb2ludHMpJiYodGEuY2FzdFNoYWRvd3x8dGEucmVjZWl2ZVNoYWRvdyYmMz09PUNhKSYmKCF0YS5mcnVzdHVtQ3VsbGVkfHx6LmludGVyc2VjdHNPYmplY3QodGEpKSl7dGEubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoVGEubWF0cml4V29ybGRJbnZlcnNlLHRhLm1hdHJpeFdvcmxkKTt2YXIgSGE9Yy51cGRhdGUodGEpLERhPXRhLm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoRGEpKWZvcih2YXIgTWE9SGEuZ3JvdXBzLGRiPTAsdGI9TWEubGVuZ3RoO2RiPHRiO2RiKyspe3ZhciBLYT1NYVtkYl0sYmI9RGFbS2EubWF0ZXJpYWxJbmRleF07YmImJmJiLnZpc2libGUmJihiYj1yKHRhLGJiLFVhLFRhLm5lYXIsClRhLmZhcixDYSksYS5yZW5kZXJCdWZmZXJEaXJlY3QoVGEsbnVsbCxIYSxiYix0YSxLYSkpfWVsc2UgRGEudmlzaWJsZSYmKGJiPXIodGEsRGEsVWEsVGEubmVhcixUYS5mYXIsQ2EpLGEucmVuZGVyQnVmZmVyRGlyZWN0KFRhLG51bGwsSGEsYmIsdGEsbnVsbCkpfXRhPXRhLmNoaWxkcmVuO0hhPTA7Zm9yKERhPXRhLmxlbmd0aDtIYTxEYTtIYSsrKXYodGFbSGFdLEJhLFRhLFVhLENhKX19dmFyIHo9bmV3IGljLEU9bmV3IGYsRj1uZXcgZixKPW5ldyBwLFA9QXJyYXkoNCksUj1BcnJheSg0KSxTPXt9LFY9ezA6MSwxOjAsMjoyfSxXPW5ldyBxYih7ZGVmaW5lczp7U0FNUExFX1JBVEU6LjI1LEhBTEZfU0FNUExFX1JBVEU6LjEyNX0sdW5pZm9ybXM6e3NoYWRvd19wYXNzOnt2YWx1ZTpudWxsfSxyZXNvbHV0aW9uOnt2YWx1ZTpuZXcgZn0scmFkaXVzOnt2YWx1ZTo0fX0sdmVydGV4U2hhZGVyOiJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsCmZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzcztcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCByYWRpdXM7XG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbnZvaWQgbWFpbigpIHtcbiAgZmxvYXQgbWVhbiBceDNkIDAuMDtcbiAgZmxvYXQgc3F1YXJlZF9tZWFuIFx4M2QgMC4wO1xuICBcblx0ZmxvYXQgZGVwdGggXHgzZCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgICkgLyByZXNvbHV0aW9uICkgKTtcbiAgZm9yICggZmxvYXQgaSBceDNkIC0xLjA7IGkgXHgzYyAxLjAgOyBpICtceDNkIFNBTVBMRV9SQVRFKSB7XG4gICAgI2lmZGVmIEhPUklaT05BTF9QQVNTXG4gICAgICB2ZWMyIGRpc3RyaWJ1dGlvbiBceDNkIGRlY29kZUhhbGZSR0JBICggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG4gICAgICBtZWFuICtceDNkIGRpc3RyaWJ1dGlvbi54O1xuICAgICAgc3F1YXJlZF9tZWFuICtceDNkIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54O1xuICAgICNlbHNlXG4gICAgICBmbG9hdCBkZXB0aCBceDNkIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgIGkgKSAgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuICAgICAgbWVhbiArXHgzZCBkZXB0aDtcbiAgICAgIHNxdWFyZWRfbWVhbiArXHgzZCBkZXB0aCAqIGRlcHRoO1xuICAgICNlbmRpZlxuICB9XG4gIG1lYW4gXHgzZCBtZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgc3F1YXJlZF9tZWFuIFx4M2Qgc3F1YXJlZF9tZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgZmxvYXQgc3RkX2RldiBceDNkIHBvdyggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4sIDAuNSApO1xuICBnbF9GcmFnQ29sb3IgXHgzZCBlbmNvZGVIYWxmUkdCQSggdmVjMiggbWVhbiwgc3RkX2RldiApICk7XG59In0pLApoYT1XLmNsb25lKCk7aGEuZGVmaW5lcy5IT1JJWk9OQUxfUEFTUz0xO3ZhciBmYT1uZXcgdmE7ZmEuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFEobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO3ZhciByYT1uZXcgeGEoZmEsVyk7Zm9yKGZhPTA7NCE9PWZhOysrZmEpe3ZhciBwYT0wIT09KGZhJjEpLHFhPTAhPT0oZmEmMiksdWE9bmV3IHZkKHtkZXB0aFBhY2tpbmc6MzIwMSxtb3JwaFRhcmdldHM6cGEsc2tpbm5pbmc6cWF9KTtQW2ZhXT11YTtwYT1uZXcgd2Qoe21vcnBoVGFyZ2V0czpwYSxza2lubmluZzpxYX0pO1JbZmFdPXBhfXZhciBvYT10aGlzO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmF1dG9VcGRhdGU9ITA7dGhpcy5uZWVkc1VwZGF0ZT0hMTt0aGlzLnR5cGU9MTt0aGlzLnJlbmRlcj1mdW5jdGlvbih0YSxCYSxUYSl7aWYoITEhPT1vYS5lbmFibGVkJiYoITEhPT1vYS5hdXRvVXBkYXRlfHwhMSE9PW9hLm5lZWRzVXBkYXRlKSYmCjAhPT10YS5sZW5ndGgpe3ZhciBVYT1hLmdldFJlbmRlclRhcmdldCgpLENhPWEuZ2V0QWN0aXZlQ3ViZUZhY2UoKSxIYT1hLmdldEFjdGl2ZU1pcG1hcExldmVsKCksRGE9YS5zdGF0ZTtEYS5zZXRCbGVuZGluZygwKTtEYS5idWZmZXJzLmNvbG9yLnNldENsZWFyKDEsMSwxLDEpO0RhLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCk7RGEuc2V0U2Npc3NvclRlc3QoITEpO2Zvcih2YXIgTWE9MCxkYj10YS5sZW5ndGg7TWE8ZGI7TWErKyl7dmFyIHRiPXRhW01hXSxLYT10Yi5zaGFkb3c7aWYodm9pZCAwPT09S2EpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLHRiLCJoYXMgbm8gc2hhZG93LiIpO2Vsc2V7RS5jb3B5KEthLm1hcFNpemUpO3ZhciBiYj1LYS5nZXRGcmFtZUV4dGVudHMoKTtFLm11bHRpcGx5KGJiKTtGLmNvcHkoS2EubWFwU2l6ZSk7aWYoRS54PmV8fEUueT5lKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6Iix0YiwiaGFzIHNoYWRvdyBleGNlZWRpbmcgbWF4IHRleHR1cmUgc2l6ZSwgcmVkdWNpbmciKSwKRS54PmUmJihGLng9TWF0aC5mbG9vcihlL2JiLngpLEUueD1GLngqYmIueCxLYS5tYXBTaXplLng9Ri54KSxFLnk+ZSYmKEYueT1NYXRoLmZsb29yKGUvYmIueSksRS55PUYueSpiYi55LEthLm1hcFNpemUueT1GLnkpO251bGwhPT1LYS5tYXB8fEthLmlzUG9pbnRMaWdodFNoYWRvd3x8MyE9PXRoaXMudHlwZXx8KGJiPXttaW5GaWx0ZXI6MTAwNixtYWdGaWx0ZXI6MTAwNixmb3JtYXQ6MTAyM30sS2EubWFwPW5ldyBtKEUueCxFLnksYmIpLEthLm1hcC50ZXh0dXJlLm5hbWU9dGIubmFtZSsiLnNoYWRvd01hcCIsS2EubWFwUGFzcz1uZXcgbShFLngsRS55LGJiKSxLYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTtudWxsPT09S2EubWFwJiYoYmI9e21pbkZpbHRlcjoxMDAzLG1hZ0ZpbHRlcjoxMDAzLGZvcm1hdDoxMDIzfSxLYS5tYXA9bmV3IG0oRS54LEUueSxiYiksS2EubWFwLnRleHR1cmUubmFtZT10Yi5uYW1lKyIuc2hhZG93TWFwIixLYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTsKYS5zZXRSZW5kZXJUYXJnZXQoS2EubWFwKTthLmNsZWFyKCk7YmI9S2EuZ2V0Vmlld3BvcnRDb3VudCgpO2Zvcih2YXIgamI9MDtqYjxiYjtqYisrKXt2YXIgRWI9S2EuZ2V0Vmlld3BvcnQoamIpO0ouc2V0KEYueCpFYi54LEYueSpFYi55LEYueCpFYi56LEYueSpFYi53KTtEYS52aWV3cG9ydChKKTtLYS51cGRhdGVNYXRyaWNlcyh0YixUYSxqYik7ej1LYS5nZXRGcnVzdHVtKCk7dihCYSxUYSxLYS5jYW1lcmEsdGIsdGhpcy50eXBlKX1LYS5pc1BvaW50TGlnaHRTaGFkb3d8fDMhPT10aGlzLnR5cGV8fGcoS2EsVGEpfX1vYS5uZWVkc1VwZGF0ZT0hMTthLnNldFJlbmRlclRhcmdldChVYSxDYSxIYSl9fX1mdW5jdGlvbiBWbChhLGMsZSxnKXtmdW5jdGlvbiByKGphLEdhLExhKXt2YXIgbmI9bmV3IFVpbnQ4QXJyYXkoNCksVmE9YS5jcmVhdGVUZXh0dXJlKCk7YS5iaW5kVGV4dHVyZShqYSxWYSk7YS50ZXhQYXJhbWV0ZXJpKGphLDEwMjQxLDk3MjgpO2EudGV4UGFyYW1ldGVyaShqYSwKMTAyNDAsOTcyOCk7Zm9yKGphPTA7amE8TGE7amErKylhLnRleEltYWdlMkQoR2EramEsMCw2NDA4LDEsMSwwLDY0MDgsNTEyMSxuYik7cmV0dXJuIFZhfWZ1bmN0aW9uIHYoamEsR2Epe3JhW2phXT0xOzA9PT1wYVtqYV0mJihhLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGphKSxwYVtqYV09MSk7cWFbamFdIT09R2EmJigoZy5pc1dlYkdMMj9hOmMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpW2cuaXNXZWJHTDI/InZlcnRleEF0dHJpYkRpdmlzb3IiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiXShqYSxHYSkscWFbamFdPUdhKX1mdW5jdGlvbiB6KGphKXshMCE9PXVhW2phXSYmKGEuZW5hYmxlKGphKSx1YVtqYV09ITApfWZ1bmN0aW9uIEUoamEpeyExIT09dWFbamFdJiYoYS5kaXNhYmxlKGphKSx1YVtqYV09ITEpfWZ1bmN0aW9uIEYoamEsR2EsTGEsbmIsVmEsaWIsa2IsUWEpe2lmKDA9PT1qYSlCYSYmKEUoMzA0MiksQmE9ITEpO2Vsc2UgaWYoQmF8fCh6KDMwNDIpLApCYT0hMCksNSE9PWphKXtpZihqYSE9PVRhfHxRYSE9PXRiKXtpZigxMDAhPT1VYXx8MTAwIT09RGEpYS5ibGVuZEVxdWF0aW9uKDMyNzc0KSxEYT1VYT0xMDA7aWYoUWEpc3dpdGNoKGphKXtjYXNlIDE6YS5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOmEuYmxlbmRGdW5jKDEsMSk7YnJlYWs7Y2FzZSAzOmEuYmxlbmRGdW5jU2VwYXJhdGUoMCwwLDc2OSw3NzEpO2JyZWFrO2Nhc2UgNDphLmJsZW5kRnVuY1NlcGFyYXRlKDAsNzY4LDAsNzcwKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsamEpfWVsc2Ugc3dpdGNoKGphKXtjYXNlIDE6YS5ibGVuZEZ1bmNTZXBhcmF0ZSg3NzAsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6YS5ibGVuZEZ1bmMoNzcwLDEpO2JyZWFrO2Nhc2UgMzphLmJsZW5kRnVuYygwLDc2OSk7YnJlYWs7Y2FzZSA0OmEuYmxlbmRGdW5jKDAsNzY4KTticmVhazsKZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGphKX1kYj1NYT1IYT1DYT1udWxsO1RhPWphO3RiPVFhfX1lbHNle1ZhPVZhfHxHYTtpYj1pYnx8TGE7a2I9a2J8fG5iO2lmKEdhIT09VWF8fFZhIT09RGEpYS5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoZS5jb252ZXJ0KEdhKSxlLmNvbnZlcnQoVmEpKSxVYT1HYSxEYT1WYTtpZihMYSE9PUNhfHxuYiE9PUhhfHxpYiE9PU1hfHxrYiE9PWRiKWEuYmxlbmRGdW5jU2VwYXJhdGUoZS5jb252ZXJ0KExhKSxlLmNvbnZlcnQobmIpLGUuY29udmVydChpYiksZS5jb252ZXJ0KGtiKSksQ2E9TGEsSGE9bmIsTWE9aWIsZGI9a2I7VGE9amE7dGI9bnVsbH19ZnVuY3Rpb24gSihqYSl7S2EhPT1qYSYmKGphP2EuZnJvbnRGYWNlKDIzMDQpOmEuZnJvbnRGYWNlKDIzMDUpLEthPWphKX1mdW5jdGlvbiBQKGphKXswIT09amE/KHooMjg4NCksamEhPT1iYiYmKDE9PT1qYT9hLmN1bGxGYWNlKDEwMjkpOgoyPT09amE/YS5jdWxsRmFjZSgxMDI4KTphLmN1bGxGYWNlKDEwMzIpKSk6RSgyODg0KTtiYj1qYX1mdW5jdGlvbiBSKGphLEdhLExhKXtpZihqYSl7aWYoeigzMjgyMyksRWIhPT1HYXx8eGIhPT1MYSlhLnBvbHlnb25PZmZzZXQoR2EsTGEpLEViPUdhLHhiPUxhfWVsc2UgRSgzMjgyMyl9ZnVuY3Rpb24gUyhqYSl7dm9pZCAwPT09amEmJihqYT0zMzk4NCtpYS0xKTt6YSE9PWphJiYoYS5hY3RpdmVUZXh0dXJlKGphKSx6YT1qYSl9dmFyIFY9bmV3IGZ1bmN0aW9uKCl7dmFyIGphPSExLEdhPW5ldyBwLExhPW51bGwsbmI9bmV3IHAoMCwwLDAsMCk7cmV0dXJue3NldE1hc2s6ZnVuY3Rpb24oVmEpe0xhPT09VmF8fGphfHwoYS5jb2xvck1hc2soVmEsVmEsVmEsVmEpLExhPVZhKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKFZhKXtqYT1WYX0sc2V0Q2xlYXI6ZnVuY3Rpb24oVmEsaWIsa2IsUWEsZWIpeyEwPT09ZWImJihWYSo9UWEsaWIqPVFhLGtiKj1RYSk7R2Euc2V0KFZhLGliLGtiLFFhKTsKITE9PT1uYi5lcXVhbHMoR2EpJiYoYS5jbGVhckNvbG9yKFZhLGliLGtiLFFhKSxuYi5jb3B5KEdhKSl9LHJlc2V0OmZ1bmN0aW9uKCl7amE9ITE7TGE9bnVsbDtuYi5zZXQoLTEsMCwwLDApfX19LFc9bmV3IGZ1bmN0aW9uKCl7dmFyIGphPSExLEdhPW51bGwsTGE9bnVsbCxuYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKFZhKXtWYT96KDI5MjkpOkUoMjkyOSl9LHNldE1hc2s6ZnVuY3Rpb24oVmEpe0dhPT09VmF8fGphfHwoYS5kZXB0aE1hc2soVmEpLEdhPVZhKX0sc2V0RnVuYzpmdW5jdGlvbihWYSl7aWYoTGEhPT1WYSl7aWYoVmEpc3dpdGNoKFZhKXtjYXNlIDA6YS5kZXB0aEZ1bmMoNTEyKTticmVhaztjYXNlIDE6YS5kZXB0aEZ1bmMoNTE5KTticmVhaztjYXNlIDI6YS5kZXB0aEZ1bmMoNTEzKTticmVhaztjYXNlIDM6YS5kZXB0aEZ1bmMoNTE1KTticmVhaztjYXNlIDQ6YS5kZXB0aEZ1bmMoNTE0KTticmVhaztjYXNlIDU6YS5kZXB0aEZ1bmMoNTE4KTticmVhaztjYXNlIDY6YS5kZXB0aEZ1bmMoNTE2KTsKYnJlYWs7Y2FzZSA3OmEuZGVwdGhGdW5jKDUxNyk7YnJlYWs7ZGVmYXVsdDphLmRlcHRoRnVuYyg1MTUpfWVsc2UgYS5kZXB0aEZ1bmMoNTE1KTtMYT1WYX19LHNldExvY2tlZDpmdW5jdGlvbihWYSl7amE9VmF9LHNldENsZWFyOmZ1bmN0aW9uKFZhKXtuYiE9PVZhJiYoYS5jbGVhckRlcHRoKFZhKSxuYj1WYSl9LHJlc2V0OmZ1bmN0aW9uKCl7amE9ITE7bmI9TGE9R2E9bnVsbH19fSxoYT1uZXcgZnVuY3Rpb24oKXt2YXIgamE9ITEsR2E9bnVsbCxMYT1udWxsLG5iPW51bGwsVmE9bnVsbCxpYj1udWxsLGtiPW51bGwsUWE9bnVsbCxlYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKG1iKXtqYXx8KG1iP3ooMjk2MCk6RSgyOTYwKSl9LHNldE1hc2s6ZnVuY3Rpb24obWIpe0dhPT09bWJ8fGphfHwoYS5zdGVuY2lsTWFzayhtYiksR2E9bWIpfSxzZXRGdW5jOmZ1bmN0aW9uKG1iLHBiLHNiKXtpZihMYSE9PW1ifHxuYiE9PXBifHxWYSE9PXNiKWEuc3RlbmNpbEZ1bmMobWIscGIsCnNiKSxMYT1tYixuYj1wYixWYT1zYn0sc2V0T3A6ZnVuY3Rpb24obWIscGIsc2Ipe2lmKGliIT09bWJ8fGtiIT09cGJ8fFFhIT09c2IpYS5zdGVuY2lsT3AobWIscGIsc2IpLGliPW1iLGtiPXBiLFFhPXNifSxzZXRMb2NrZWQ6ZnVuY3Rpb24obWIpe2phPW1ifSxzZXRDbGVhcjpmdW5jdGlvbihtYil7ZWIhPT1tYiYmKGEuY2xlYXJTdGVuY2lsKG1iKSxlYj1tYil9LHJlc2V0OmZ1bmN0aW9uKCl7amE9ITE7ZWI9UWE9a2I9aWI9VmE9bmI9TGE9R2E9bnVsbH19fSxmYT1hLmdldFBhcmFtZXRlcigzNDkyMSkscmE9bmV3IFVpbnQ4QXJyYXkoZmEpLHBhPW5ldyBVaW50OEFycmF5KGZhKSxxYT1uZXcgVWludDhBcnJheShmYSksdWE9e30sb2E9bnVsbCx0YT1udWxsLEJhPW51bGwsVGE9bnVsbCxVYT1udWxsLENhPW51bGwsSGE9bnVsbCxEYT1udWxsLE1hPW51bGwsZGI9bnVsbCx0Yj0hMSxLYT1udWxsLGJiPW51bGwsamI9bnVsbCxFYj1udWxsLHhiPW51bGwsaWE9YS5nZXRQYXJhbWV0ZXIoMzU2NjEpLApuYT0hMTtmYT0wO2ZhPWEuZ2V0UGFyYW1ldGVyKDc5MzgpOy0xIT09ZmEuaW5kZXhPZigiV2ViR0wiKT8oZmE9cGFyc2VGbG9hdCgvXldlYkdMIChbMC05XSkvLmV4ZWMoZmEpWzFdKSxuYT0xPD1mYSk6LTEhPT1mYS5pbmRleE9mKCJPcGVuR0wgRVMiKSYmKGZhPXBhcnNlRmxvYXQoL15PcGVuR0wgRVMgKFswLTldKS8uZXhlYyhmYSlbMV0pLG5hPTI8PWZhKTt2YXIgemE9bnVsbCxKYT17fSxZYT1uZXcgcCxOYT1uZXcgcCxjYj17fTtjYlszNTUzXT1yKDM1NTMsMzU1MywxKTtjYlszNDA2N109cigzNDA2NywzNDA2OSw2KTtWLnNldENsZWFyKDAsMCwwLDEpO1cuc2V0Q2xlYXIoMSk7aGEuc2V0Q2xlYXIoMCk7eigyOTI5KTtXLnNldEZ1bmMoMyk7SighMSk7UCgxKTt6KDI4ODQpO0YoMCk7cmV0dXJue2J1ZmZlcnM6e2NvbG9yOlYsZGVwdGg6VyxzdGVuY2lsOmhhfSxpbml0QXR0cmlidXRlczpmdW5jdGlvbigpe2Zvcih2YXIgamE9MCxHYT1yYS5sZW5ndGg7amE8R2E7amErKylyYVtqYV09CjB9LGVuYWJsZUF0dHJpYnV0ZTpmdW5jdGlvbihqYSl7dihqYSwwKX0sZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcjp2LGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7Zm9yKHZhciBqYT0wLEdhPXBhLmxlbmd0aDtqYSE9PUdhOysramEpcGFbamFdIT09cmFbamFdJiYoYS5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoamEpLHBhW2phXT0wKX0sZW5hYmxlOnosZGlzYWJsZTpFLGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czpmdW5jdGlvbigpe2lmKG51bGw9PT1vYSYmKG9hPVtdLGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSIpfHxjLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSkpZm9yKHZhciBqYT1hLmdldFBhcmFtZXRlcigzNDQ2NyksR2E9MDtHYTxqYS5sZW5ndGg7R2ErKylvYS5wdXNoKGphW0dhXSk7CnJldHVybiBvYX0sdXNlUHJvZ3JhbTpmdW5jdGlvbihqYSl7cmV0dXJuIHRhIT09amE/KGEudXNlUHJvZ3JhbShqYSksdGE9amEsITApOiExfSxzZXRCbGVuZGluZzpGLHNldE1hdGVyaWFsOmZ1bmN0aW9uKGphLEdhKXsyPT09amEuc2lkZT9FKDI4ODQpOnooMjg4NCk7dmFyIExhPTE9PT1qYS5zaWRlO0dhJiYoTGE9IUxhKTtKKExhKTsxPT09amEuYmxlbmRpbmcmJiExPT09amEudHJhbnNwYXJlbnQ/RigwKTpGKGphLmJsZW5kaW5nLGphLmJsZW5kRXF1YXRpb24samEuYmxlbmRTcmMsamEuYmxlbmREc3QsamEuYmxlbmRFcXVhdGlvbkFscGhhLGphLmJsZW5kU3JjQWxwaGEsamEuYmxlbmREc3RBbHBoYSxqYS5wcmVtdWx0aXBsaWVkQWxwaGEpO1cuc2V0RnVuYyhqYS5kZXB0aEZ1bmMpO1cuc2V0VGVzdChqYS5kZXB0aFRlc3QpO1cuc2V0TWFzayhqYS5kZXB0aFdyaXRlKTtWLnNldE1hc2soamEuY29sb3JXcml0ZSk7R2E9amEuc3RlbmNpbFdyaXRlO2hhLnNldFRlc3QoR2EpO0dhJiYKKGhhLnNldEZ1bmMoamEuc3RlbmNpbEZ1bmMsamEuc3RlbmNpbFJlZixqYS5zdGVuY2lsTWFzayksaGEuc2V0T3AoamEuc3RlbmNpbEZhaWwsamEuc3RlbmNpbFpGYWlsLGphLnN0ZW5jaWxaUGFzcykpO1IoamEucG9seWdvbk9mZnNldCxqYS5wb2x5Z29uT2Zmc2V0RmFjdG9yLGphLnBvbHlnb25PZmZzZXRVbml0cyl9LHNldEZsaXBTaWRlZDpKLHNldEN1bGxGYWNlOlAsc2V0TGluZVdpZHRoOmZ1bmN0aW9uKGphKXtqYSE9PWpiJiYobmEmJmEubGluZVdpZHRoKGphKSxqYj1qYSl9LHNldFBvbHlnb25PZmZzZXQ6UixzZXRTY2lzc29yVGVzdDpmdW5jdGlvbihqYSl7amE/eigzMDg5KTpFKDMwODkpfSxhY3RpdmVUZXh0dXJlOlMsYmluZFRleHR1cmU6ZnVuY3Rpb24oamEsR2Epe251bGw9PT16YSYmUygpO3ZhciBMYT1KYVt6YV07dm9pZCAwPT09TGEmJihMYT17dHlwZTp2b2lkIDAsdGV4dHVyZTp2b2lkIDB9LEphW3phXT1MYSk7aWYoTGEudHlwZSE9PWphfHxMYS50ZXh0dXJlIT09CkdhKWEuYmluZFRleHR1cmUoamEsR2F8fGNiW2phXSksTGEudHlwZT1qYSxMYS50ZXh0dXJlPUdhfSxjb21wcmVzc2VkVGV4SW1hZ2UyRDpmdW5jdGlvbigpe3RyeXthLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChqYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGphKX19LHRleEltYWdlMkQ6ZnVuY3Rpb24oKXt0cnl7YS50ZXhJbWFnZTJELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChqYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGphKX19LHRleEltYWdlM0Q6ZnVuY3Rpb24oKXt0cnl7YS50ZXhJbWFnZTNELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChqYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGphKX19LHNjaXNzb3I6ZnVuY3Rpb24oamEpeyExPT09WWEuZXF1YWxzKGphKSYmKGEuc2Npc3NvcihqYS54LGphLnksamEueixqYS53KSxZYS5jb3B5KGphKSl9LHZpZXdwb3J0OmZ1bmN0aW9uKGphKXshMT09PQpOYS5lcXVhbHMoamEpJiYoYS52aWV3cG9ydChqYS54LGphLnksamEueixqYS53KSxOYS5jb3B5KGphKSl9LHJlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBqYT0wO2phPHBhLmxlbmd0aDtqYSsrKTE9PT1wYVtqYV0mJihhLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShqYSkscGFbamFdPTApO3VhPXt9O3phPW9hPW51bGw7SmE9e307YmI9S2E9VGE9dGE9bnVsbDtWLnJlc2V0KCk7Vy5yZXNldCgpO2hhLnJlc2V0KCl9fX1mdW5jdGlvbiBXbChhLGMsZSxnLHIsdix6KXtmdW5jdGlvbiBFKGlhLG5hKXtyZXR1cm4gYmI/bmV3IE9mZnNjcmVlbkNhbnZhcyhpYSxuYSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIil9ZnVuY3Rpb24gRihpYSxuYSx6YSxKYSl7dmFyIFlhPTE7aWYoaWEud2lkdGg+SmF8fGlhLmhlaWdodD5KYSlZYT1KYS9NYXRoLm1heChpYS53aWR0aCxpYS5oZWlnaHQpO2lmKDE+WWF8fCEwPT09bmEpe2lmKCJ1bmRlZmluZWQiIT09CnR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50JiZpYSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT09dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZpYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9PXR5cGVvZiBJbWFnZUJpdG1hcCYmaWEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcClyZXR1cm4gSmE9bmE/aGIuZmxvb3JQb3dlck9mVHdvOk1hdGguZmxvb3IsbmE9SmEoWWEqaWEud2lkdGgpLFlhPUphKFlhKmlhLmhlaWdodCksdm9pZCAwPT09S2EmJihLYT1FKG5hLFlhKSksemE9emE/RShuYSxZYSk6S2EsemEud2lkdGg9bmEsemEuaGVpZ2h0PVlhLHphLmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKGlhLDAsMCxuYSxZYSksY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoIitpYS53aWR0aCsieCIraWEuaGVpZ2h0KyIpIHRvICgiK25hKyJ4IitZYSsiKS4iKSwKemE7ImRhdGEiaW4gaWEmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogSW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoIitpYS53aWR0aCsieCIraWEuaGVpZ2h0KyIpLiIpfXJldHVybiBpYX1mdW5jdGlvbiBKKGlhKXtyZXR1cm4gaGIuaXNQb3dlck9mVHdvKGlhLndpZHRoKSYmaGIuaXNQb3dlck9mVHdvKGlhLmhlaWdodCl9ZnVuY3Rpb24gUChpYSl7cmV0dXJuIHIuaXNXZWJHTDI/ITE6MTAwMSE9PWlhLndyYXBTfHwxMDAxIT09aWEud3JhcFR8fDEwMDMhPT1pYS5taW5GaWx0ZXImJjEwMDYhPT1pYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUihpYSxuYSl7cmV0dXJuIGlhLmdlbmVyYXRlTWlwbWFwcyYmbmEmJjEwMDMhPT1pYS5taW5GaWx0ZXImJjEwMDYhPT1pYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUyhpYSxuYSx6YSxKYSl7YS5nZW5lcmF0ZU1pcG1hcChpYSk7Zy5nZXQobmEpLl9fbWF4TWlwTGV2ZWw9TWF0aC5sb2coTWF0aC5tYXgoemEsSmEpKSpNYXRoLkxPRzJFfQpmdW5jdGlvbiBWKGlhLG5hKXtpZighci5pc1dlYkdMMilyZXR1cm4gaWE7dmFyIHphPWlhOzY0MDM9PT1pYSYmKDUxMjY9PT1uYSYmKHphPTMzMzI2KSw1MTMxPT09bmEmJih6YT0zMzMyNSksNTEyMT09PW5hJiYoemE9MzMzMjEpKTs2NDA3PT09aWEmJig1MTI2PT09bmEmJih6YT0zNDgzNyksNTEzMT09PW5hJiYoemE9MzQ4NDMpLDUxMjE9PT1uYSYmKHphPTMyODQ5KSk7NjQwOD09PWlhJiYoNTEyNj09PW5hJiYoemE9MzQ4MzYpLDUxMzE9PT1uYSYmKHphPTM0ODQyKSw1MTIxPT09bmEmJih6YT0zMjg1NikpOzMzMzI1PT09emF8fDMzMzI2PT09emF8fDM0ODQyPT09emF8fDM0ODM2PT09emE/Yy5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTooMzQ4NDM9PT16YXx8MzQ4Mzc9PT16YSkmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgUkdCQSBpbnN0ZWFkLiIpOwpyZXR1cm4gemF9ZnVuY3Rpb24gVyhpYSl7cmV0dXJuIDEwMDM9PT1pYXx8MTAwND09PWlhfHwxMDA1PT09aWE/OTcyODo5NzI5fWZ1bmN0aW9uIGhhKGlhKXtpYT1pYS50YXJnZXQ7aWEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaGEpO3JhKGlhKTtpYS5pc1ZpZGVvVGV4dHVyZSYmdGIuZGVsZXRlKGlhKTt6Lm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIGZhKGlhKXtpYT1pYS50YXJnZXQ7aWEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZmEpO3BhKGlhKTt6Lm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIHJhKGlhKXt2YXIgbmE9Zy5nZXQoaWEpO3ZvaWQgMCE9PW5hLl9fd2ViZ2xJbml0JiYoYS5kZWxldGVUZXh0dXJlKG5hLl9fd2ViZ2xUZXh0dXJlKSxnLnJlbW92ZShpYSkpfWZ1bmN0aW9uIHBhKGlhKXt2YXIgbmE9Zy5nZXQoaWEpLHphPWcuZ2V0KGlhLnRleHR1cmUpO2lmKGlhKXt2b2lkIDAhPT16YS5fX3dlYmdsVGV4dHVyZSYmYS5kZWxldGVUZXh0dXJlKHphLl9fd2ViZ2xUZXh0dXJlKTsKaWEuZGVwdGhUZXh0dXJlJiZpYS5kZXB0aFRleHR1cmUuZGlzcG9zZSgpO2lmKGlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKWZvcih6YT0wOzY+emE7emErKylhLmRlbGV0ZUZyYW1lYnVmZmVyKG5hLl9fd2ViZ2xGcmFtZWJ1ZmZlclt6YV0pLG5hLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmYS5kZWxldGVSZW5kZXJidWZmZXIobmEuX193ZWJnbERlcHRoYnVmZmVyW3phXSk7ZWxzZSBhLmRlbGV0ZUZyYW1lYnVmZmVyKG5hLl9fd2ViZ2xGcmFtZWJ1ZmZlciksbmEuX193ZWJnbERlcHRoYnVmZmVyJiZhLmRlbGV0ZVJlbmRlcmJ1ZmZlcihuYS5fX3dlYmdsRGVwdGhidWZmZXIpO2cucmVtb3ZlKGlhLnRleHR1cmUpO2cucmVtb3ZlKGlhKX19ZnVuY3Rpb24gcWEoaWEsbmEpe3ZhciB6YT1nLmdldChpYSk7aWEuaXNWaWRlb1RleHR1cmUmJmRiKGlhKTtpZigwPGlhLnZlcnNpb24mJnphLl9fdmVyc2lvbiE9PWlhLnZlcnNpb24pe3ZhciBKYT1pYS5pbWFnZTtpZih2b2lkIDA9PT1KYSljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpOwplbHNlIGlmKCExPT09SmEuY29tcGxldGUpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlIik7ZWxzZXtUYSh6YSxpYSxuYSk7cmV0dXJufX1lLmFjdGl2ZVRleHR1cmUoMzM5ODQrbmEpO2UuYmluZFRleHR1cmUoMzU1Myx6YS5fX3dlYmdsVGV4dHVyZSl9ZnVuY3Rpb24gdWEoaWEsbmEpe2lmKDY9PT1pYS5pbWFnZS5sZW5ndGgpe3ZhciB6YT1nLmdldChpYSk7aWYoMDxpYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1pYS52ZXJzaW9uKXtCYSh6YSxpYSk7ZS5hY3RpdmVUZXh0dXJlKDMzOTg0K25hKTtlLmJpbmRUZXh0dXJlKDM0MDY3LHphLl9fd2ViZ2xUZXh0dXJlKTthLnBpeGVsU3RvcmVpKDM3NDQwLGlhLmZsaXBZKTt2YXIgSmE9aWEmJmlhLmlzQ29tcHJlc3NlZFRleHR1cmU7bmE9aWEuaW1hZ2VbMF0mJmlhLmltYWdlWzBdLmlzRGF0YVRleHR1cmU7Zm9yKHZhciBZYT1bXSwKTmE9MDs2Pk5hO05hKyspWWFbTmFdPUphfHxuYT9uYT9pYS5pbWFnZVtOYV0uaW1hZ2U6aWEuaW1hZ2VbTmFdOkYoaWEuaW1hZ2VbTmFdLCExLCEwLHIubWF4Q3ViZW1hcFNpemUpO3ZhciBjYj1ZYVswXSxqYT1KKGNiKXx8ci5pc1dlYkdMMixHYT12LmNvbnZlcnQoaWEuZm9ybWF0KSxMYT12LmNvbnZlcnQoaWEudHlwZSksbmI9VihHYSxMYSk7dGEoMzQwNjcsaWEsamEpO2lmKEphKXtmb3IoTmE9MDs2Pk5hO05hKyspe3ZhciBWYT1ZYVtOYV0ubWlwbWFwcztmb3IoSmE9MDtKYTxWYS5sZW5ndGg7SmErKyl7dmFyIGliPVZhW0phXTsxMDIzIT09aWEuZm9ybWF0JiYxMDIyIT09aWEuZm9ybWF0Py0xPGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihHYSk/ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNDA2OStOYSxKYSxuYixpYi53aWR0aCxpYi5oZWlnaHQsMCxpYi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik6CmUudGV4SW1hZ2UyRCgzNDA2OStOYSxKYSxuYixpYi53aWR0aCxpYi5oZWlnaHQsMCxHYSxMYSxpYi5kYXRhKX19emEuX19tYXhNaXBMZXZlbD1WYS5sZW5ndGgtMX1lbHNle1ZhPWlhLm1pcG1hcHM7Zm9yKE5hPTA7Nj5OYTtOYSsrKWlmKG5hKWZvcihlLnRleEltYWdlMkQoMzQwNjkrTmEsMCxuYixZYVtOYV0ud2lkdGgsWWFbTmFdLmhlaWdodCwwLEdhLExhLFlhW05hXS5kYXRhKSxKYT0wO0phPFZhLmxlbmd0aDtKYSsrKWliPVZhW0phXSxpYj1pYi5pbWFnZVtOYV0uaW1hZ2UsZS50ZXhJbWFnZTJEKDM0MDY5K05hLEphKzEsbmIsaWIud2lkdGgsaWIuaGVpZ2h0LDAsR2EsTGEsaWIuZGF0YSk7ZWxzZSBmb3IoZS50ZXhJbWFnZTJEKDM0MDY5K05hLDAsbmIsR2EsTGEsWWFbTmFdKSxKYT0wO0phPFZhLmxlbmd0aDtKYSsrKWliPVZhW0phXSxlLnRleEltYWdlMkQoMzQwNjkrTmEsSmErMSxuYixHYSxMYSxpYi5pbWFnZVtOYV0pO3phLl9fbWF4TWlwTGV2ZWw9VmEubGVuZ3RofVIoaWEsCmphKSYmUygzNDA2NyxpYSxjYi53aWR0aCxjYi5oZWlnaHQpO3phLl9fdmVyc2lvbj1pYS52ZXJzaW9uO2lmKGlhLm9uVXBkYXRlKWlhLm9uVXBkYXRlKGlhKX1lbHNlIGUuYWN0aXZlVGV4dHVyZSgzMzk4NCtuYSksZS5iaW5kVGV4dHVyZSgzNDA2Nyx6YS5fX3dlYmdsVGV4dHVyZSl9fWZ1bmN0aW9uIG9hKGlhLG5hKXtlLmFjdGl2ZVRleHR1cmUoMzM5ODQrbmEpO2UuYmluZFRleHR1cmUoMzQwNjcsZy5nZXQoaWEpLl9fd2ViZ2xUZXh0dXJlKX1mdW5jdGlvbiB0YShpYSxuYSx6YSl7emE/KGEudGV4UGFyYW1ldGVyaShpYSwxMDI0Mix2LmNvbnZlcnQobmEud3JhcFMpKSxhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDMsdi5jb252ZXJ0KG5hLndyYXBUKSksMzI4NzkhPT1pYSYmMzU4NjYhPT1pYXx8YS50ZXhQYXJhbWV0ZXJpKGlhLDMyODgyLHYuY29udmVydChuYS53cmFwUikpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MCx2LmNvbnZlcnQobmEubWFnRmlsdGVyKSksYS50ZXhQYXJhbWV0ZXJpKGlhLAoxMDI0MSx2LmNvbnZlcnQobmEubWluRmlsdGVyKSkpOihhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDIsMzMwNzEpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MywzMzA3MSksMzI4NzkhPT1pYSYmMzU4NjYhPT1pYXx8YS50ZXhQYXJhbWV0ZXJpKGlhLDMyODgyLDMzMDcxKSwxMDAxPT09bmEud3JhcFMmJjEwMDE9PT1uYS53cmFwVHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MCxXKG5hLm1hZ0ZpbHRlcikpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MSxXKG5hLm1pbkZpbHRlcikpLDEwMDMhPT1uYS5taW5GaWx0ZXImJjEwMDYhPT1uYS5taW5GaWx0ZXImJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLiIpKTsKISh6YT1jLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpfHwxMDE1PT09bmEudHlwZSYmbnVsbD09PWMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKXx8MTAxNj09PW5hLnR5cGUmJm51bGw9PT0oci5pc1dlYkdMMnx8Yy5nZXQoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIikpfHwhKDE8bmEuYW5pc290cm9weXx8Zy5nZXQobmEpLl9fY3VycmVudEFuaXNvdHJvcHkpfHwoYS50ZXhQYXJhbWV0ZXJmKGlhLHphLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULE1hdGgubWluKG5hLmFuaXNvdHJvcHksci5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxnLmdldChuYSkuX19jdXJyZW50QW5pc290cm9weT1uYS5hbmlzb3Ryb3B5KX1mdW5jdGlvbiBCYShpYSxuYSl7dm9pZCAwPT09aWEuX193ZWJnbEluaXQmJihpYS5fX3dlYmdsSW5pdD0hMCxuYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixoYSksaWEuX193ZWJnbFRleHR1cmU9YS5jcmVhdGVUZXh0dXJlKCksCnoubWVtb3J5LnRleHR1cmVzKyspfWZ1bmN0aW9uIFRhKGlhLG5hLHphKXt2YXIgSmE9MzU1MztuYS5pc0RhdGFUZXh0dXJlMkRBcnJheSYmKEphPTM1ODY2KTtuYS5pc0RhdGFUZXh0dXJlM0QmJihKYT0zMjg3OSk7QmEoaWEsbmEpO2UuYWN0aXZlVGV4dHVyZSgzMzk4NCt6YSk7ZS5iaW5kVGV4dHVyZShKYSxpYS5fX3dlYmdsVGV4dHVyZSk7YS5waXhlbFN0b3JlaSgzNzQ0MCxuYS5mbGlwWSk7YS5waXhlbFN0b3JlaSgzNzQ0MSxuYS5wcmVtdWx0aXBseUFscGhhKTthLnBpeGVsU3RvcmVpKDMzMTcsbmEudW5wYWNrQWxpZ25tZW50KTt6YT1QKG5hKSYmITE9PT1KKG5hLmltYWdlKTt6YT1GKG5hLmltYWdlLHphLCExLHIubWF4VGV4dHVyZVNpemUpO3ZhciBZYT1KKHphKXx8ci5pc1dlYkdMMixOYT12LmNvbnZlcnQobmEuZm9ybWF0KSxjYj12LmNvbnZlcnQobmEudHlwZSksamE9VihOYSxjYik7dGEoSmEsbmEsWWEpO3ZhciBHYT1uYS5taXBtYXBzO2lmKG5hLmlzRGVwdGhUZXh0dXJlKXtqYT0KNjQwMjtpZigxMDE1PT09bmEudHlwZSl7aWYoIXIuaXNXZWJHTDIpdGhyb3cgRXJyb3IoIkZsb2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAiKTtqYT0zNjAxMn1lbHNlIHIuaXNXZWJHTDImJihqYT0zMzE4OSk7MTAyNj09PW5hLmZvcm1hdCYmNjQwMj09PWphJiYxMDEyIT09bmEudHlwZSYmMTAxNCE9PW5hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4iKSxuYS50eXBlPTEwMTIsY2I9di5jb252ZXJ0KG5hLnR5cGUpKTsxMDI3PT09bmEuZm9ybWF0JiYoamE9MzQwNDEsMTAyMCE9PW5hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksbmEudHlwZT0xMDIwLGNiPQp2LmNvbnZlcnQobmEudHlwZSkpKTtlLnRleEltYWdlMkQoMzU1MywwLGphLHphLndpZHRoLHphLmhlaWdodCwwLE5hLGNiLG51bGwpfWVsc2UgaWYobmEuaXNEYXRhVGV4dHVyZSlpZigwPEdhLmxlbmd0aCYmWWEpe2Zvcih2YXIgTGE9MCxuYj1HYS5sZW5ndGg7TGE8bmI7TGErKylKYT1HYVtMYV0sZS50ZXhJbWFnZTJEKDM1NTMsTGEsamEsSmEud2lkdGgsSmEuaGVpZ2h0LDAsTmEsY2IsSmEuZGF0YSk7bmEuZ2VuZXJhdGVNaXBtYXBzPSExO2lhLl9fbWF4TWlwTGV2ZWw9R2EubGVuZ3RoLTF9ZWxzZSBlLnRleEltYWdlMkQoMzU1MywwLGphLHphLndpZHRoLHphLmhlaWdodCwwLE5hLGNiLHphLmRhdGEpLGlhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKG5hLmlzQ29tcHJlc3NlZFRleHR1cmUpe0xhPTA7Zm9yKG5iPUdhLmxlbmd0aDtMYTxuYjtMYSsrKUphPUdhW0xhXSwxMDIzIT09bmEuZm9ybWF0JiYxMDIyIT09bmEuZm9ybWF0Py0xPGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihOYSk/CmUuY29tcHJlc3NlZFRleEltYWdlMkQoMzU1MyxMYSxqYSxKYS53aWR0aCxKYS5oZWlnaHQsMCxKYS5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTplLnRleEltYWdlMkQoMzU1MyxMYSxqYSxKYS53aWR0aCxKYS5oZWlnaHQsMCxOYSxjYixKYS5kYXRhKTtpYS5fX21heE1pcExldmVsPUdhLmxlbmd0aC0xfWVsc2UgaWYobmEuaXNEYXRhVGV4dHVyZTJEQXJyYXkpZS50ZXhJbWFnZTNEKDM1ODY2LDAsamEsemEud2lkdGgsemEuaGVpZ2h0LHphLmRlcHRoLDAsTmEsY2IsemEuZGF0YSksaWEuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYobmEuaXNEYXRhVGV4dHVyZTNEKWUudGV4SW1hZ2UzRCgzMjg3OSwwLGphLHphLndpZHRoLHphLmhlaWdodCx6YS5kZXB0aCwwLE5hLGNiLHphLmRhdGEpLGlhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKDA8CkdhLmxlbmd0aCYmWWEpe0xhPTA7Zm9yKG5iPUdhLmxlbmd0aDtMYTxuYjtMYSsrKUphPUdhW0xhXSxlLnRleEltYWdlMkQoMzU1MyxMYSxqYSxOYSxjYixKYSk7bmEuZ2VuZXJhdGVNaXBtYXBzPSExO2lhLl9fbWF4TWlwTGV2ZWw9R2EubGVuZ3RoLTF9ZWxzZSBlLnRleEltYWdlMkQoMzU1MywwLGphLE5hLGNiLHphKSxpYS5fX21heE1pcExldmVsPTA7UihuYSxZYSkmJlMoMzU1MyxuYSx6YS53aWR0aCx6YS5oZWlnaHQpO2lhLl9fdmVyc2lvbj1uYS52ZXJzaW9uO2lmKG5hLm9uVXBkYXRlKW5hLm9uVXBkYXRlKG5hKX1mdW5jdGlvbiBVYShpYSxuYSx6YSxKYSl7dmFyIFlhPXYuY29udmVydChuYS50ZXh0dXJlLmZvcm1hdCksTmE9di5jb252ZXJ0KG5hLnRleHR1cmUudHlwZSksY2I9VihZYSxOYSk7ZS50ZXhJbWFnZTJEKEphLDAsY2IsbmEud2lkdGgsbmEuaGVpZ2h0LDAsWWEsTmEsbnVsbCk7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaWEpO2EuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsCnphLEphLGcuZ2V0KG5hLnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlLDApO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIENhKGlhLG5hLHphKXthLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsaWEpO2lmKG5hLmRlcHRoQnVmZmVyJiYhbmEuc3RlbmNpbEJ1ZmZlcil6YT8oemE9TWEobmEpLGEucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHphLDMzMTg5LG5hLndpZHRoLG5hLmhlaWdodCkpOmEucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSwzMzE4OSxuYS53aWR0aCxuYS5oZWlnaHQpLGEuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsaWEpO2Vsc2UgaWYobmEuZGVwdGhCdWZmZXImJm5hLnN0ZW5jaWxCdWZmZXIpemE/KHphPU1hKG5hKSxhLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSx6YSwzNTA1NixuYS53aWR0aCxuYS5oZWlnaHQpKTphLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoMzYxNjEsMzQwNDEsCm5hLndpZHRoLG5hLmhlaWdodCksYS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzMzMwNiwzNjE2MSxpYSk7ZWxzZXtpYT12LmNvbnZlcnQobmEudGV4dHVyZS5mb3JtYXQpO3ZhciBKYT12LmNvbnZlcnQobmEudGV4dHVyZS50eXBlKTtpYT1WKGlhLEphKTt6YT8oemE9TWEobmEpLGEucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHphLGlhLG5hLndpZHRoLG5hLmhlaWdodCkpOmEucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxpYSxuYS53aWR0aCxuYS5oZWlnaHQpfWEuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKX1mdW5jdGlvbiBIYShpYSxuYSl7aWYobmEmJm5hLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKXRocm93IEVycm9yKCJEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkIik7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaWEpO2lmKCFuYS5kZXB0aFRleHR1cmV8fCFuYS5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpdGhyb3cgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTsKZy5nZXQobmEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSYmbmEuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09bmEud2lkdGgmJm5hLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQ9PT1uYS5oZWlnaHR8fChuYS5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGg9bmEud2lkdGgsbmEuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1uYS5oZWlnaHQsbmEuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlPSEwKTtxYShuYS5kZXB0aFRleHR1cmUsMCk7aWE9Zy5nZXQobmEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZigxMDI2PT09bmEuZGVwdGhUZXh0dXJlLmZvcm1hdClhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDk2LDM1NTMsaWEsMCk7ZWxzZSBpZigxMDI3PT09bmEuZGVwdGhUZXh0dXJlLmZvcm1hdClhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsaWEsMCk7ZWxzZSB0aHJvdyBFcnJvcigiVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0Iik7Cn1mdW5jdGlvbiBEYShpYSl7dmFyIG5hPWcuZ2V0KGlhKSx6YT0hMD09PWlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlO2lmKGlhLmRlcHRoVGV4dHVyZSl7aWYoemEpdGhyb3cgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7SGEobmEuX193ZWJnbEZyYW1lYnVmZmVyLGlhKX1lbHNlIGlmKHphKWZvcihuYS5fX3dlYmdsRGVwdGhidWZmZXI9W10semE9MDs2PnphO3phKyspYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbmEuX193ZWJnbEZyYW1lYnVmZmVyW3phXSksbmEuX193ZWJnbERlcHRoYnVmZmVyW3phXT1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLENhKG5hLl9fd2ViZ2xEZXB0aGJ1ZmZlclt6YV0saWEpO2Vsc2UgYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbmEuX193ZWJnbEZyYW1lYnVmZmVyKSxuYS5fX3dlYmdsRGVwdGhidWZmZXI9YS5jcmVhdGVSZW5kZXJidWZmZXIoKSxDYShuYS5fX3dlYmdsRGVwdGhidWZmZXIsCmlhKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKX1mdW5jdGlvbiBNYShpYSl7cmV0dXJuIHIuaXNXZWJHTDImJmlhLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9NYXRoLm1pbihyLm1heFNhbXBsZXMsaWEuc2FtcGxlcyk6MH1mdW5jdGlvbiBkYihpYSl7dmFyIG5hPXoucmVuZGVyLmZyYW1lO3RiLmdldChpYSkhPT1uYSYmKHRiLnNldChpYSxuYSksaWEudXBkYXRlKCkpfXZhciB0Yj1uZXcgV2Vha01hcCxLYSxiYj0idW5kZWZpbmVkIiE9PXR5cGVvZiBPZmZzY3JlZW5DYW52YXMsamI9MCxFYj0hMSx4Yj0hMTt0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQ9ZnVuY3Rpb24oKXt2YXIgaWE9amI7aWE+PXIubWF4VGV4dHVyZXMmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK2lhKyIgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICIrci5tYXhUZXh0dXJlcyk7amIrPTE7cmV0dXJuIGlhfTt0aGlzLnJlc2V0VGV4dHVyZVVuaXRzPQpmdW5jdGlvbigpe2piPTB9O3RoaXMuc2V0VGV4dHVyZTJEPXFhO3RoaXMuc2V0VGV4dHVyZTJEQXJyYXk9ZnVuY3Rpb24oaWEsbmEpe3ZhciB6YT1nLmdldChpYSk7MDxpYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1pYS52ZXJzaW9uP1RhKHphLGlhLG5hKTooZS5hY3RpdmVUZXh0dXJlKDMzOTg0K25hKSxlLmJpbmRUZXh0dXJlKDM1ODY2LHphLl9fd2ViZ2xUZXh0dXJlKSl9O3RoaXMuc2V0VGV4dHVyZTNEPWZ1bmN0aW9uKGlhLG5hKXt2YXIgemE9Zy5nZXQoaWEpOzA8aWEudmVyc2lvbiYmemEuX192ZXJzaW9uIT09aWEudmVyc2lvbj9UYSh6YSxpYSxuYSk6KGUuYWN0aXZlVGV4dHVyZSgzMzk4NCtuYSksZS5iaW5kVGV4dHVyZSgzMjg3OSx6YS5fX3dlYmdsVGV4dHVyZSkpfTt0aGlzLnNldFRleHR1cmVDdWJlPXVhO3RoaXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljPW9hO3RoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oaWEpe3ZhciBuYT1nLmdldChpYSksemE9Zy5nZXQoaWEudGV4dHVyZSk7CmlhLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGZhKTt6YS5fX3dlYmdsVGV4dHVyZT1hLmNyZWF0ZVRleHR1cmUoKTt6Lm1lbW9yeS50ZXh0dXJlcysrO3ZhciBKYT0hMD09PWlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlLFlhPSEwPT09aWEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LE5hPUooaWEpfHxyLmlzV2ViR0wyO2lmKEphKWZvcihuYS5fX3dlYmdsRnJhbWVidWZmZXI9W10sWWE9MDs2PllhO1lhKyspbmEuX193ZWJnbEZyYW1lYnVmZmVyW1lhXT1hLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ZWxzZSBpZihuYS5fX3dlYmdsRnJhbWVidWZmZXI9YS5jcmVhdGVGcmFtZWJ1ZmZlcigpLFlhKWlmKHIuaXNXZWJHTDIpe25hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj1hLmNyZWF0ZUZyYW1lYnVmZmVyKCk7bmEuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyPWEuY3JlYXRlUmVuZGVyYnVmZmVyKCk7YS5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG5hLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcik7CllhPXYuY29udmVydChpYS50ZXh0dXJlLmZvcm1hdCk7dmFyIGNiPXYuY29udmVydChpYS50ZXh0dXJlLnR5cGUpO1lhPVYoWWEsY2IpO2NiPU1hKGlhKTthLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxjYixZYSxpYS53aWR0aCxpYS5oZWlnaHQpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG5hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7YS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCwzNjE2MSxuYS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpO2EuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKTtpYS5kZXB0aEJ1ZmZlciYmKG5hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLENhKG5hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcixpYSwhMCkpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7CmlmKEphKXtlLmJpbmRUZXh0dXJlKDM0MDY3LHphLl9fd2ViZ2xUZXh0dXJlKTt0YSgzNDA2NyxpYS50ZXh0dXJlLE5hKTtmb3IoWWE9MDs2PllhO1lhKyspVWEobmEuX193ZWJnbEZyYW1lYnVmZmVyW1lhXSxpYSwzNjA2NCwzNDA2OStZYSk7UihpYS50ZXh0dXJlLE5hKSYmUygzNDA2NyxpYS50ZXh0dXJlLGlhLndpZHRoLGlhLmhlaWdodCk7ZS5iaW5kVGV4dHVyZSgzNDA2NyxudWxsKX1lbHNlIGUuYmluZFRleHR1cmUoMzU1Myx6YS5fX3dlYmdsVGV4dHVyZSksdGEoMzU1MyxpYS50ZXh0dXJlLE5hKSxVYShuYS5fX3dlYmdsRnJhbWVidWZmZXIsaWEsMzYwNjQsMzU1MyksUihpYS50ZXh0dXJlLE5hKSYmUygzNTUzLGlhLnRleHR1cmUsaWEud2lkdGgsaWEuaGVpZ2h0KSxlLmJpbmRUZXh0dXJlKDM1NTMsbnVsbCk7aWEuZGVwdGhCdWZmZXImJkRhKGlhKX07dGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24oaWEpe3ZhciBuYT1pYS50ZXh0dXJlLHphPUooaWEpfHwKci5pc1dlYkdMMjtpZihSKG5hLHphKSl7emE9aWEuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/MzQwNjc6MzU1Mzt2YXIgSmE9Zy5nZXQobmEpLl9fd2ViZ2xUZXh0dXJlO2UuYmluZFRleHR1cmUoemEsSmEpO1MoemEsbmEsaWEud2lkdGgsaWEuaGVpZ2h0KTtlLmJpbmRUZXh0dXJlKHphLG51bGwpfX07dGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1mdW5jdGlvbihpYSl7aWYoaWEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KWlmKHIuaXNXZWJHTDIpe3ZhciBuYT1nLmdldChpYSk7YS5iaW5kRnJhbWVidWZmZXIoMzYwMDgsbmEuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxuYS5fX3dlYmdsRnJhbWVidWZmZXIpO25hPWlhLndpZHRoO3ZhciB6YT1pYS5oZWlnaHQsSmE9MTYzODQ7aWEuZGVwdGhCdWZmZXImJihKYXw9MjU2KTtpYS5zdGVuY2lsQnVmZmVyJiYoSmF8PTEwMjQpO2EuYmxpdEZyYW1lYnVmZmVyKDAsCjAsbmEsemEsMCwwLG5hLHphLEphLDk3MjgpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIil9O3RoaXMuc2FmZVNldFRleHR1cmUyRD1mdW5jdGlvbihpYSxuYSl7aWEmJmlhLmlzV2ViR0xSZW5kZXJUYXJnZXQmJighMT09PUViJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlMkQ6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksRWI9ITApLGlhPWlhLnRleHR1cmUpO3FhKGlhLG5hKX07dGhpcy5zYWZlU2V0VGV4dHVyZUN1YmU9ZnVuY3Rpb24oaWEsbmEpe2lhJiZpYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSYmKCExPT09eGImJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmVDdWJlOiBkb24ndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksCnhiPSEwKSxpYT1pYS50ZXh0dXJlKTtpYSYmaWEuaXNDdWJlVGV4dHVyZXx8QXJyYXkuaXNBcnJheShpYS5pbWFnZSkmJjY9PT1pYS5pbWFnZS5sZW5ndGg/dWEoaWEsbmEpOm9hKGlhLG5hKX19ZnVuY3Rpb24gd2ooYSxjLGUpe3JldHVybntjb252ZXJ0OmZ1bmN0aW9uKGcpe2lmKDFFMz09PWcpcmV0dXJuIDEwNDk3O2lmKDEwMDE9PT1nKXJldHVybiAzMzA3MTtpZigxMDAyPT09ZylyZXR1cm4gMzM2NDg7aWYoMTAwMz09PWcpcmV0dXJuIDk3Mjg7aWYoMTAwND09PWcpcmV0dXJuIDk5ODQ7aWYoMTAwNT09PWcpcmV0dXJuIDk5ODY7aWYoMTAwNj09PWcpcmV0dXJuIDk3Mjk7aWYoMTAwNz09PWcpcmV0dXJuIDk5ODU7aWYoMTAwOD09PWcpcmV0dXJuIDk5ODc7aWYoMTAwOT09PWcpcmV0dXJuIDUxMjE7aWYoMTAxNz09PWcpcmV0dXJuIDMyODE5O2lmKDEwMTg9PT1nKXJldHVybiAzMjgyMDtpZigxMDE5PT09ZylyZXR1cm4gMzM2MzU7aWYoMTAxMD09PWcpcmV0dXJuIDUxMjA7aWYoMTAxMT09PQpnKXJldHVybiA1MTIyO2lmKDEwMTI9PT1nKXJldHVybiA1MTIzO2lmKDEwMTM9PT1nKXJldHVybiA1MTI0O2lmKDEwMTQ9PT1nKXJldHVybiA1MTI1O2lmKDEwMTU9PT1nKXJldHVybiA1MTI2O2lmKDEwMTY9PT1nKXtpZihlLmlzV2ViR0wyKXJldHVybiA1MTMxO3ZhciByPWMuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Iik7aWYobnVsbCE9PXIpcmV0dXJuIHIuSEFMRl9GTE9BVF9PRVN9aWYoMTAyMT09PWcpcmV0dXJuIDY0MDY7aWYoMTAyMj09PWcpcmV0dXJuIDY0MDc7aWYoMTAyMz09PWcpcmV0dXJuIDY0MDg7aWYoMTAyND09PWcpcmV0dXJuIDY0MDk7aWYoMTAyNT09PWcpcmV0dXJuIDY0MTA7aWYoMTAyNj09PWcpcmV0dXJuIDY0MDI7aWYoMTAyNz09PWcpcmV0dXJuIDM0MDQxO2lmKDEwMjg9PT1nKXJldHVybiA2NDAzO2lmKDEwMD09PWcpcmV0dXJuIDMyNzc0O2lmKDEwMT09PWcpcmV0dXJuIDMyNzc4O2lmKDEwMj09PWcpcmV0dXJuIDMyNzc5O2lmKDIwMD09PWcpcmV0dXJuIDA7CmlmKDIwMT09PWcpcmV0dXJuIDE7aWYoMjAyPT09ZylyZXR1cm4gNzY4O2lmKDIwMz09PWcpcmV0dXJuIDc2OTtpZigyMDQ9PT1nKXJldHVybiA3NzA7aWYoMjA1PT09ZylyZXR1cm4gNzcxO2lmKDIwNj09PWcpcmV0dXJuIDc3MjtpZigyMDc9PT1nKXJldHVybiA3NzM7aWYoMjA4PT09ZylyZXR1cm4gNzc0O2lmKDIwOT09PWcpcmV0dXJuIDc3NTtpZigyMTA9PT1nKXJldHVybiA3NzY7aWYoMzM3NzY9PT1nfHwzMzc3Nz09PWd8fDMzNzc4PT09Z3x8MzM3Nzk9PT1nKWlmKHI9Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIiksbnVsbCE9PXIpe2lmKDMzNzc2PT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO2lmKDMzNzc3PT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDtpZigzMzc3OD09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7aWYoMzM3Nzk9PT1nKXJldHVybiByLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUfWlmKDM1ODQwPT09Cmd8fDM1ODQxPT09Z3x8MzU4NDI9PT1nfHwzNTg0Mz09PWcpaWYocj1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIiksbnVsbCE9PXIpe2lmKDM1ODQwPT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKDM1ODQxPT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKDM1ODQyPT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZigzNTg0Mz09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9aWYoMzYxOTY9PT1nJiYocj1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEiKSxudWxsIT09cikpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtpZigzNzgwOD09PWd8fDM3ODA5PT09Z3x8Mzc4MTA9PT1nfHwzNzgxMT09PWd8fDM3ODEyPT09Z3x8Mzc4MTM9PT1nfHwzNzgxND09PWd8fDM3ODE1PT09Z3x8Mzc4MTY9PT0KZ3x8Mzc4MTc9PT1nfHwzNzgxOD09PWd8fDM3ODE5PT09Z3x8Mzc4MjA9PT1nfHwzNzgyMT09PWcpaWYocj1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxudWxsIT09cilyZXR1cm4gZztpZigxMDM9PT1nfHwxMDQ9PT1nKXtpZihlLmlzV2ViR0wyKXtpZigxMDM9PT1nKXJldHVybiAzMjc3NTtpZigxMDQ9PT1nKXJldHVybiAzMjc3Nn1yPWMuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iik7aWYobnVsbCE9PXIpe2lmKDEwMz09PWcpcmV0dXJuIHIuTUlOX0VYVDtpZigxMDQ9PT1nKXJldHVybiByLk1BWF9FWFR9fWlmKDEwMjA9PT1nKXtpZihlLmlzV2ViR0wyKXJldHVybiAzNDA0MjtyPWMuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIik7aWYobnVsbCE9PXIpcmV0dXJuIHIuVU5TSUdORURfSU5UXzI0XzhfV0VCR0x9cmV0dXJuIDB9fX1mdW5jdGlvbiB1ZSgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikdyb3VwIn1mdW5jdGlvbiB2ZihhKXt2Yi5jYWxsKHRoaXMpOwp0aGlzLmNhbWVyYXM9YXx8W119ZnVuY3Rpb24geGooYSxjLGUpe3lqLnNldEZyb21NYXRyaXhQb3NpdGlvbihjLm1hdHJpeFdvcmxkKTt6ai5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCk7dmFyIGc9eWouZGlzdGFuY2VUbyh6aikscj1jLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsdj1lLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsej1yWzE0XS8oclsxMF0tMSk7ZT1yWzE0XS8oclsxMF0rMSk7dmFyIEU9KHJbOV0rMSkvcls1XSxGPShyWzldLTEpL3JbNV0sSj0ocls4XS0xKS9yWzBdLFA9KHZbOF0rMSkvdlswXTtyPXoqSjt2PXoqUDtQPWcvKC1KK1ApO0o9UCotSjtjLm1hdHJpeFdvcmxkLmRlY29tcG9zZShhLnBvc2l0aW9uLGEucXVhdGVybmlvbixhLnNjYWxlKTthLnRyYW5zbGF0ZVgoSik7YS50cmFuc2xhdGVaKFApO2EubWF0cml4V29ybGQuY29tcG9zZShhLnBvc2l0aW9uLGEucXVhdGVybmlvbixhLnNjYWxlKTthLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKGEubWF0cml4V29ybGQpOwpjPXorUDt6PWUrUDthLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKHItSix2KyhnLUopLEUqZS96KmMsRiplL3oqYyxjLHopfWZ1bmN0aW9uIE5oKGEpe2Z1bmN0aW9uIGMoKXtyZXR1cm4gbnVsbCE9PUomJiEwPT09Si5pc1ByZXNlbnRpbmd9ZnVuY3Rpb24gZSgpe2lmKGMoKSl7dmFyIEhhPUouZ2V0RXllUGFyYW1ldGVycygibGVmdCIpO3o9MipIYS5yZW5kZXJXaWR0aCpoYTtFPUhhLnJlbmRlckhlaWdodCpoYTtUYT1hLmdldFBpeGVsUmF0aW8oKTthLmdldFNpemUoQmEpO2Euc2V0RHJhd2luZ0J1ZmZlclNpemUoeixFLDEpO3VhLnZpZXdwb3J0LnNldCgwLDAsei8yLEUpO29hLnZpZXdwb3J0LnNldCh6LzIsMCx6LzIsRSk7Q2Euc3RhcnQoKTtGLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25zdGFydCJ9KX1lbHNlIEYuZW5hYmxlZCYmYS5zZXREcmF3aW5nQnVmZmVyU2l6ZShCYS53aWR0aCxCYS5oZWlnaHQsVGEpLENhLnN0b3AoKSxGLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9CmZ1bmN0aW9uIGcoSGEpe2Zvcih2YXIgRGE9bmF2aWdhdG9yLmdldEdhbWVwYWRzJiZuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMoKSxNYT0wLGRiPTAsdGI9RGEubGVuZ3RoO01hPHRiO01hKyspe3ZhciBLYT1EYVtNYV07aWYoS2EmJigiRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1LYS5pZHx8IkdlYXIgVlIgQ29udHJvbGxlciI9PT1LYS5pZHx8Ik9jdWx1cyBHbyBDb250cm9sbGVyIj09PUthLmlkfHwiT3BlblZSIEdhbWVwYWQiPT09S2EuaWR8fEthLmlkLnN0YXJ0c1dpdGgoIk9jdWx1cyBUb3VjaCIpfHxLYS5pZC5zdGFydHNXaXRoKCJIVEMgVml2ZSBGb2N1cyIpfHxLYS5pZC5zdGFydHNXaXRoKCJTcGF0aWFsIENvbnRyb2xsZXIiKSkpe2lmKGRiPT09SGEpcmV0dXJuIEthO2RiKyt9fX1mdW5jdGlvbiByKCl7Zm9yKHZhciBIYT0wO0hhPFMubGVuZ3RoO0hhKyspe3ZhciBEYT1TW0hhXSxNYT1nKEhhKTtpZih2b2lkIDAhPT1NYSYmdm9pZCAwIT09TWEucG9zZSl7aWYobnVsbD09PU1hLnBvc2UpYnJlYWs7CnZhciBkYj1NYS5wb3NlOyExPT09ZGIuaGFzUG9zaXRpb24mJkRhLnBvc2l0aW9uLnNldCguMiwtLjYsLS4wNSk7bnVsbCE9PWRiLnBvc2l0aW9uJiZEYS5wb3NpdGlvbi5mcm9tQXJyYXkoZGIucG9zaXRpb24pO251bGwhPT1kYi5vcmllbnRhdGlvbiYmRGEucXVhdGVybmlvbi5mcm9tQXJyYXkoZGIub3JpZW50YXRpb24pO0RhLm1hdHJpeC5jb21wb3NlKERhLnBvc2l0aW9uLERhLnF1YXRlcm5pb24sRGEuc2NhbGUpO0RhLm1hdHJpeC5wcmVtdWx0aXBseShWKTtEYS5tYXRyaXguZGVjb21wb3NlKERhLnBvc2l0aW9uLERhLnF1YXRlcm5pb24sRGEuc2NhbGUpO0RhLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITA7RGEudmlzaWJsZT0hMDtkYj0iRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1NYS5pZD8wOjE7dm9pZCAwPT09VWFbSGFdJiYoVWFbSGFdPSExKTtVYVtIYV0hPT1NYS5idXR0b25zW2RiXS5wcmVzc2VkJiYoVWFbSGFdPU1hLmJ1dHRvbnNbZGJdLnByZXNzZWQsITA9PT1VYVtIYV0/CkRhLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlbGVjdHN0YXJ0In0pOihEYS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZWxlY3RlbmQifSksRGEuZGlzcGF0Y2hFdmVudCh7dHlwZToic2VsZWN0In0pKSl9ZWxzZSBEYS52aXNpYmxlPSExfX1mdW5jdGlvbiB2KEhhLERhKXtudWxsIT09RGEmJjQ9PT1EYS5sZW5ndGgmJkhhLnNldChEYVswXSp6LERhWzFdKkUsRGFbMl0qeixEYVszXSpFKX12YXIgeixFLEY9dGhpcyxKPW51bGwsUD1udWxsLFI9bnVsbCxTPVtdLFY9bmV3IHEsVz1uZXcgcSxoYT0xLGZhPSJsb2NhbC1mbG9vciI7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiYiVlJGcmFtZURhdGEiaW4gd2luZG93JiYoUD1uZXcgd2luZG93LlZSRnJhbWVEYXRhLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixlLCExKSk7dmFyIHJhPW5ldyBxLHBhPW5ldyBoLHFhPW5ldyBrLHVhPW5ldyB2Yjt1YS52aWV3cG9ydD1uZXcgcDt1YS5sYXllcnMuZW5hYmxlKDEpOwp2YXIgb2E9bmV3IHZiO29hLnZpZXdwb3J0PW5ldyBwO29hLmxheWVycy5lbmFibGUoMik7dmFyIHRhPW5ldyB2ZihbdWEsb2FdKTt0YS5sYXllcnMuZW5hYmxlKDEpO3RhLmxheWVycy5lbmFibGUoMik7dmFyIEJhPW5ldyBmLFRhLFVhPVtdO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmdldENvbnRyb2xsZXI9ZnVuY3Rpb24oSGEpe3ZhciBEYT1TW0hhXTt2b2lkIDA9PT1EYSYmKERhPW5ldyB1ZSxEYS5tYXRyaXhBdXRvVXBkYXRlPSExLERhLnZpc2libGU9ITEsU1tIYV09RGEpO3JldHVybiBEYX07dGhpcy5nZXREZXZpY2U9ZnVuY3Rpb24oKXtyZXR1cm4gSn07dGhpcy5zZXREZXZpY2U9ZnVuY3Rpb24oSGEpe3ZvaWQgMCE9PUhhJiYoSj1IYSk7Q2Euc2V0Q29udGV4dChIYSl9O3RoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3Rvcj1mdW5jdGlvbihIYSl7aGE9SGF9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKEhhKXtmYT1IYX07dGhpcy5zZXRQb3NlVGFyZ2V0PWZ1bmN0aW9uKEhhKXt2b2lkIDAhPT0KSGEmJihSPUhhKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24oSGEpe3ZhciBEYT0ibG9jYWwtZmxvb3IiPT09ZmE/MS42OjA7aWYoITE9PT1jKCkpcmV0dXJuIEhhLnBvc2l0aW9uLnNldCgwLERhLDApLEhhLnJvdGF0aW9uLnNldCgwLDAsMCksSGE7Si5kZXB0aE5lYXI9SGEubmVhcjtKLmRlcHRoRmFyPUhhLmZhcjtKLmdldEZyYW1lRGF0YShQKTtpZigibG9jYWwtZmxvb3IiPT09ZmEpe3ZhciBNYT1KLnN0YWdlUGFyYW1ldGVycztNYT9WLmZyb21BcnJheShNYS5zaXR0aW5nVG9TdGFuZGluZ1RyYW5zZm9ybSk6Vi5tYWtlVHJhbnNsYXRpb24oMCxEYSwwKX1EYT1QLnBvc2U7TWE9bnVsbCE9PVI/UjpIYTtNYS5tYXRyaXguY29weShWKTtNYS5tYXRyaXguZGVjb21wb3NlKE1hLnBvc2l0aW9uLE1hLnF1YXRlcm5pb24sTWEuc2NhbGUpO251bGwhPT1EYS5vcmllbnRhdGlvbiYmKHBhLmZyb21BcnJheShEYS5vcmllbnRhdGlvbiksTWEucXVhdGVybmlvbi5tdWx0aXBseShwYSkpO251bGwhPT0KRGEucG9zaXRpb24mJihwYS5zZXRGcm9tUm90YXRpb25NYXRyaXgoVikscWEuZnJvbUFycmF5KERhLnBvc2l0aW9uKSxxYS5hcHBseVF1YXRlcm5pb24ocGEpLE1hLnBvc2l0aW9uLmFkZChxYSkpO01hLnVwZGF0ZU1hdHJpeFdvcmxkKCk7dWEubmVhcj1IYS5uZWFyO29hLm5lYXI9SGEubmVhcjt1YS5mYXI9SGEuZmFyO29hLmZhcj1IYS5mYXI7dWEubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheShQLmxlZnRWaWV3TWF0cml4KTtvYS5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KFAucmlnaHRWaWV3TWF0cml4KTtXLmdldEludmVyc2UoVik7ImxvY2FsLWZsb29yIj09PWZhJiYodWEubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KFcpLG9hLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShXKSk7SGE9TWEucGFyZW50O251bGwhPT1IYSYmKHJhLmdldEludmVyc2UoSGEubWF0cml4V29ybGQpLHVhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShyYSksb2EubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KHJhKSk7CnVhLm1hdHJpeFdvcmxkLmdldEludmVyc2UodWEubWF0cml4V29ybGRJbnZlcnNlKTtvYS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKG9hLm1hdHJpeFdvcmxkSW52ZXJzZSk7dWEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoUC5sZWZ0UHJvamVjdGlvbk1hdHJpeCk7b2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoUC5yaWdodFByb2plY3Rpb25NYXRyaXgpO3hqKHRhLHVhLG9hKTtIYT1KLmdldExheWVycygpO0hhLmxlbmd0aCYmKEhhPUhhWzBdLHYodWEudmlld3BvcnQsSGEubGVmdEJvdW5kcyksdihvYS52aWV3cG9ydCxIYS5yaWdodEJvdW5kcykpO3IoKTtyZXR1cm4gdGF9O3RoaXMuZ2V0U3RhbmRpbmdNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gVn07dGhpcy5pc1ByZXNlbnRpbmc9Yzt2YXIgQ2E9bmV3IGJjO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihIYSl7Q2Euc2V0QW5pbWF0aW9uTG9vcChIYSk7YygpJiZDYS5zdGFydCgpfTt0aGlzLnN1Ym1pdEZyYW1lPQpmdW5jdGlvbigpe2MoKSYmSi5zdWJtaXRGcmFtZSgpfTt0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXsidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixlKX07dGhpcy5zZXRGcmFtZU9mUmVmZXJlbmNlVHlwZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViVlJNYW5hZ2VyOiBzZXRGcmFtZU9mUmVmZXJlbmNlVHlwZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9fWZ1bmN0aW9uIEFqKGEsYyl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09RiYmbnVsbCE9PUp9ZnVuY3Rpb24gZyhxYSl7Zm9yKHZhciB1YT0wO3VhPFMubGVuZ3RoO3VhKyspVlt1YV09PT1xYS5pbnB1dFNvdXJjZSYmU1t1YV0uZGlzcGF0Y2hFdmVudCh7dHlwZTpxYS50eXBlfSl9ZnVuY3Rpb24gcigpe2Euc2V0RnJhbWVidWZmZXIobnVsbCk7YS5zZXRSZW5kZXJUYXJnZXQoYS5nZXRSZW5kZXJUYXJnZXQoKSk7CnBhLnN0b3AoKTtFLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9ZnVuY3Rpb24gdihxYSl7Sj1xYTtwYS5zZXRDb250ZXh0KEYpO3BhLnN0YXJ0KCk7RS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9ZnVuY3Rpb24geihxYSx1YSl7bnVsbD09PXVhP3FhLm1hdHJpeFdvcmxkLmNvcHkocWEubWF0cml4KTpxYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHVhLm1hdHJpeFdvcmxkLHFhLm1hdHJpeCk7cWEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UocWEubWF0cml4V29ybGQpfXZhciBFPXRoaXMsRj1udWxsLEo9bnVsbCxQPSJsb2NhbC1mbG9vciIsUj1udWxsLFM9W10sVj1bXSxXPW5ldyB2YjtXLmxheWVycy5lbmFibGUoMSk7Vy52aWV3cG9ydD1uZXcgcDt2YXIgaGE9bmV3IHZiO2hhLmxheWVycy5lbmFibGUoMik7aGEudmlld3BvcnQ9bmV3IHA7dmFyIGZhPW5ldyB2ZihbVyxoYV0pO2ZhLmxheWVycy5lbmFibGUoMSk7ZmEubGF5ZXJzLmVuYWJsZSgyKTsKdGhpcy5lbmFibGVkPSExO3RoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbihxYSl7dmFyIHVhPVNbcWFdO3ZvaWQgMD09PXVhJiYodWE9bmV3IHVlLHVhLm1hdHJpeEF1dG9VcGRhdGU9ITEsdWEudmlzaWJsZT0hMSxTW3FhXT11YSk7cmV0dXJuIHVhfTt0aGlzLnNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3I9ZnVuY3Rpb24oKXt9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKHFhKXtQPXFhfTt0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gRn07dGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKHFhKXtGPXFhO251bGwhPT1GJiYoRi5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLGcpLEYuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLGcpLEYuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixnKSxGLmFkZEV2ZW50TGlzdGVuZXIoImVuZCIsciksRi51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOm5ldyBYUldlYkdMTGF5ZXIoRixjKX0pLEYucmVxdWVzdFJlZmVyZW5jZVNwYWNlKFApLnRoZW4odiksClY9Ri5pbnB1dFNvdXJjZXMsRi5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLGZ1bmN0aW9uKCl7Vj1GLmlucHV0U291cmNlcztjb25zb2xlLmxvZyhWKTtmb3IodmFyIHVhPTA7dWE8Uy5sZW5ndGg7dWErKylTW3VhXS51c2VyRGF0YS5pbnB1dFNvdXJjZT1WW3VhXX0pKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24ocWEpe2lmKGUoKSl7dmFyIHVhPXFhLnBhcmVudCxvYT1mYS5jYW1lcmFzO3ooZmEsdWEpO2Zvcih2YXIgdGE9MDt0YTxvYS5sZW5ndGg7dGErKyl6KG9hW3RhXSx1YSk7cWEubWF0cml4V29ybGQuY29weShmYS5tYXRyaXhXb3JsZCk7cWE9cWEuY2hpbGRyZW47dGE9MDtmb3IodWE9cWEubGVuZ3RoO3RhPHVhO3RhKyspcWFbdGFdLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt4aihmYSxXLGhhKTtyZXR1cm4gZmF9cmV0dXJuIHFhfTt0aGlzLmlzUHJlc2VudGluZz1lO3ZhciByYT1udWxsLHBhPW5ldyBiYztwYS5zZXRBbmltYXRpb25Mb29wKGZ1bmN0aW9uKHFhLAp1YSl7Uj11YS5nZXRWaWV3ZXJQb3NlKEopO2lmKG51bGwhPT1SKXt2YXIgb2E9Ui52aWV3cyx0YT1GLnJlbmRlclN0YXRlLmJhc2VMYXllcjthLnNldEZyYW1lYnVmZmVyKHRhLmZyYW1lYnVmZmVyKTtmb3IodmFyIEJhPTA7QmE8b2EubGVuZ3RoO0JhKyspe3ZhciBUYT1vYVtCYV0sVWE9dGEuZ2V0Vmlld3BvcnQoVGEpLENhPWZhLmNhbWVyYXNbQmFdO0NhLm1hdHJpeC5mcm9tQXJyYXkoVGEudHJhbnNmb3JtLmludmVyc2UubWF0cml4KS5nZXRJbnZlcnNlKENhLm1hdHJpeCk7Q2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoVGEucHJvamVjdGlvbk1hdHJpeCk7Q2Eudmlld3BvcnQuc2V0KFVhLngsVWEueSxVYS53aWR0aCxVYS5oZWlnaHQpOzA9PT1CYSYmZmEubWF0cml4LmNvcHkoQ2EubWF0cml4KX19Zm9yKEJhPTA7QmE8Uy5sZW5ndGg7QmErKyl7b2E9U1tCYV07aWYodGE9VltCYV0paWYodGE9dWEuZ2V0UG9zZSh0YS50YXJnZXRSYXlTcGFjZSxKKSxudWxsIT09dGEpe29hLm1hdHJpeC5mcm9tQXJyYXkodGEudHJhbnNmb3JtLm1hdHJpeCk7Cm9hLm1hdHJpeC5kZWNvbXBvc2Uob2EucG9zaXRpb24sb2Eucm90YXRpb24sb2Euc2NhbGUpO29hLnZpc2libGU9ITA7Y29udGludWV9b2EudmlzaWJsZT0hMX1yYSYmcmEocWEpfSk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKHFhKXtyYT1xYX07dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7fTt0aGlzLmdldFN0YW5kaW5nTWF0cml4PWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldFN0YW5kaW5nTWF0cml4KCkgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKTtyZXR1cm4gbmV3IHF9O3RoaXMuZ2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RnJhbWVPZlJlZmVyZW5jZVR5cGU9CmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldEZyYW1lT2ZSZWZlcmVuY2VUeXBlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4iKX07dGhpcy5zdWJtaXRGcmFtZT1mdW5jdGlvbigpe319ZnVuY3Rpb24gT2goYSl7dmFyIGM7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsPT09aWI/Y2M6MX1mdW5jdGlvbiBnKCl7TGI9bmV3IGJkKFJhKTtkYz1uZXcgTWIoUmEsTGIsYSk7ZGMuaXNXZWJHTDJ8fChMYi5nZXQoIldFQkdMX2RlcHRoX3RleHR1cmUiKSxMYi5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0IiksTGIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksTGIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpLExiLmdldCgiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIiksTGIuZ2V0KCJPRVNfZWxlbWVudF9pbmRleF91aW50IiksTGIuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpO0xiLmdldCgiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik7Ck5jPW5ldyB3aihSYSxMYixkYyk7eWI9bmV3IFZsKFJhLExiLE5jLGRjKTt5Yi5zY2lzc29yKFNiLmNvcHkodmUpLm11bHRpcGx5U2NhbGFyKGNjKS5mbG9vcigpKTt5Yi52aWV3cG9ydChLYi5jb3B5KHdlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSk7eGQ9bmV3IFNrKFJhKTtlYz1uZXcgTWw7T2M9bmV3IFdsKFJhLExiLHliLGVjLGRjLE5jLHhkKTt2Zz1uZXcgT2QoUmEpO1BoPW5ldyB0ZChSYSx2Zyx4ZCk7eGU9bmV3IFZrKFBoLHhkKTtCaj1uZXcgVWsoUmEpO1BkPW5ldyBMbChqYSxMYixkYyk7d2c9bmV3IFBsO3llPW5ldyBVbDt5ZD1uZXcgc2QoamEseWIseGUsbmEpO0NqPW5ldyBzYShSYSxMYix4ZCxkYyk7RGo9bmV3IHRnKFJhLExiLHhkLGRjKTt4ZC5wcm9ncmFtcz1QZC5wcm9ncmFtcztqYS5jYXBhYmlsaXRpZXM9ZGM7amEuZXh0ZW5zaW9ucz1MYjtqYS5wcm9wZXJ0aWVzPWVjO2phLnJlbmRlckxpc3RzPXdnO2phLnN0YXRlPXliO2phLmluZm89eGR9ZnVuY3Rpb24gcihVKXtVLnByZXZlbnREZWZhdWx0KCk7CmNvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IExvc3QuIik7R2E9ITB9ZnVuY3Rpb24gdigpe2NvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLiIpO0dhPSExO2coKX1mdW5jdGlvbiB6KFUpe1U9VS50YXJnZXQ7VS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIix6KTtFKFUpfWZ1bmN0aW9uIEUoVSl7RihVKTtlYy5yZW1vdmUoVSl9ZnVuY3Rpb24gRihVKXt2YXIgZGE9ZWMuZ2V0KFUpLnByb2dyYW07VS5wcm9ncmFtPXZvaWQgMDt2b2lkIDAhPT1kYSYmUGQucmVsZWFzZVByb2dyYW0oZGEpfWZ1bmN0aW9uIEooVSxkYSl7VS5yZW5kZXIoZnVuY3Rpb24obWEpe2phLnJlbmRlckJ1ZmZlckltbWVkaWF0ZShtYSxkYSl9KX1mdW5jdGlvbiBQKFUsZGEsbWEpe2lmKG1hJiZtYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JiYhZGMuaXNXZWJHTDImJm51bGw9PT1MYi5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSljb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7CmVsc2V7eWIuaW5pdEF0dHJpYnV0ZXMoKTt2YXIgSWE9bWEuYXR0cmlidXRlcztkYT1kYS5nZXRBdHRyaWJ1dGVzKCk7VT1VLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7Zm9yKHZhciBPYSBpbiBkYSl7dmFyIGFiPWRhW09hXTtpZigwPD1hYil7dmFyIFBhPUlhW09hXTtpZih2b2lkIDAhPT1QYSl7dmFyIGZiPVBhLm5vcm1hbGl6ZWQsQ2I9UGEuaXRlbVNpemUsb2I9dmcuZ2V0KFBhKTtpZih2b2lkIDAhPT1vYil7dmFyICRhPW9iLmJ1ZmZlcixQYz1vYi50eXBlO29iPW9iLmJ5dGVzUGVyRWxlbWVudDtpZihQYS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXt2YXIgeGM9UGEuZGF0YSx6ZT14Yy5zdHJpZGU7UGE9UGEub2Zmc2V0O3hjJiZ4Yy5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPyh5Yi5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKGFiLHhjLm1lc2hQZXJBdHRyaWJ1dGUpLHZvaWQgMD09PW1hLm1heEluc3RhbmNlZENvdW50JiYobWEubWF4SW5zdGFuY2VkQ291bnQ9CnhjLm1lc2hQZXJBdHRyaWJ1dGUqeGMuY291bnQpKTp5Yi5lbmFibGVBdHRyaWJ1dGUoYWIpO1JhLmJpbmRCdWZmZXIoMzQ5NjIsJGEpO1JhLnZlcnRleEF0dHJpYlBvaW50ZXIoYWIsQ2IsUGMsZmIsemUqb2IsUGEqb2IpfWVsc2UgUGEuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/KHliLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoYWIsUGEubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09bWEubWF4SW5zdGFuY2VkQ291bnQmJihtYS5tYXhJbnN0YW5jZWRDb3VudD1QYS5tZXNoUGVyQXR0cmlidXRlKlBhLmNvdW50KSk6eWIuZW5hYmxlQXR0cmlidXRlKGFiKSxSYS5iaW5kQnVmZmVyKDM0OTYyLCRhKSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGFiLENiLFBjLGZiLDAsMCl9fWVsc2UgaWYodm9pZCAwIT09VSYmKGZiPVVbT2FdLHZvaWQgMCE9PWZiKSlzd2l0Y2goZmIubGVuZ3RoKXtjYXNlIDI6UmEudmVydGV4QXR0cmliMmZ2KGFiLGZiKTticmVhaztjYXNlIDM6UmEudmVydGV4QXR0cmliM2Z2KGFiLApmYik7YnJlYWs7Y2FzZSA0OlJhLnZlcnRleEF0dHJpYjRmdihhYixmYik7YnJlYWs7ZGVmYXVsdDpSYS52ZXJ0ZXhBdHRyaWIxZnYoYWIsZmIpfX19eWIuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKX19ZnVuY3Rpb24gUihVLGRhLG1hLElhKXtpZighMSE9PVUudmlzaWJsZSl7aWYoVS5sYXllcnMudGVzdChkYS5sYXllcnMpKWlmKFUuaXNHcm91cCltYT1VLnJlbmRlck9yZGVyO2Vsc2UgaWYoVS5pc0xPRCkhMD09PVUuYXV0b1VwZGF0ZSYmVS51cGRhdGUoZGEpO2Vsc2UgaWYoVS5pc0xpZ2h0KWNiLnB1c2hMaWdodChVKSxVLmNhc3RTaGFkb3cmJmNiLnB1c2hTaGFkb3coVSk7ZWxzZSBpZihVLmlzU3ByaXRlKXtpZighVS5mcnVzdHVtQ3VsbGVkfHxRaC5pbnRlcnNlY3RzU3ByaXRlKFUpKXtJYSYmemQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFUubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NCh3Zik7dmFyIE9hPXhlLnVwZGF0ZShVKSxhYj1VLm1hdGVyaWFsO2FiLnZpc2libGUmJk5hLnB1c2goVSwKT2EsYWIsbWEsemQueixudWxsKX19ZWxzZSBpZihVLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0KUlhJiZ6ZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oVS5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KHdmKSxOYS5wdXNoKFUsbnVsbCxVLm1hdGVyaWFsLG1hLHpkLnosbnVsbCk7ZWxzZSBpZihVLmlzTWVzaHx8VS5pc0xpbmV8fFUuaXNQb2ludHMpaWYoVS5pc1NraW5uZWRNZXNoJiZVLnNrZWxldG9uLnVwZGF0ZSgpLCFVLmZydXN0dW1DdWxsZWR8fFFoLmludGVyc2VjdHNPYmplY3QoVSkpaWYoSWEmJnpkLnNldEZyb21NYXRyaXhQb3NpdGlvbihVLm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQod2YpLE9hPXhlLnVwZGF0ZShVKSxhYj1VLm1hdGVyaWFsLEFycmF5LmlzQXJyYXkoYWIpKWZvcih2YXIgUGE9T2EuZ3JvdXBzLGZiPTAsQ2I9UGEubGVuZ3RoO2ZiPENiO2ZiKyspe3ZhciBvYj1QYVtmYl0sJGE9YWJbb2IubWF0ZXJpYWxJbmRleF07JGEmJiRhLnZpc2libGUmJk5hLnB1c2goVSwKT2EsJGEsbWEsemQueixvYil9ZWxzZSBhYi52aXNpYmxlJiZOYS5wdXNoKFUsT2EsYWIsbWEsemQueixudWxsKTtVPVUuY2hpbGRyZW47ZmI9MDtmb3IoQ2I9VS5sZW5ndGg7ZmI8Q2I7ZmIrKylSKFVbZmJdLGRhLG1hLElhKX19ZnVuY3Rpb24gUyhVLGRhLG1hLElhKXtmb3IodmFyIE9hPTAsYWI9VS5sZW5ndGg7T2E8YWI7T2ErKyl7dmFyIFBhPVVbT2FdLGZiPVBhLm9iamVjdCxDYj1QYS5nZW9tZXRyeSxvYj12b2lkIDA9PT1JYT9QYS5tYXRlcmlhbDpJYTtQYT1QYS5ncm91cDtpZihtYS5pc0FycmF5Q2FtZXJhKXtzYj1tYTtmb3IodmFyICRhPW1hLmNhbWVyYXMsUGM9MCx4Yz0kYS5sZW5ndGg7UGM8eGM7UGMrKyl7dmFyIHplPSRhW1BjXTtmYi5sYXllcnMudGVzdCh6ZS5sYXllcnMpJiYoeWIudmlld3BvcnQoS2IuY29weSh6ZS52aWV3cG9ydCkpLGNiLnNldHVwTGlnaHRzKHplKSxWKGZiLGRhLHplLENiLG9iLFBhKSl9fWVsc2Ugc2I9bnVsbCxWKGZiLGRhLG1hLENiLG9iLFBhKX19CmZ1bmN0aW9uIFYoVSxkYSxtYSxJYSxPYSxhYil7VS5vbkJlZm9yZVJlbmRlcihqYSxkYSxtYSxJYSxPYSxhYik7Y2I9eWUuZ2V0KGRhLHNifHxtYSk7VS5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhtYS5tYXRyaXhXb3JsZEludmVyc2UsVS5tYXRyaXhXb3JsZCk7VS5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KFUubW9kZWxWaWV3TWF0cml4KTtVLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0Pyh5Yi5zZXRNYXRlcmlhbChPYSksSWE9aGEobWEsZGEuZm9nLE9hLFUpLGViPWM9bnVsbCxtYj0hMSxKKFUsSWEpKTpqYS5yZW5kZXJCdWZmZXJEaXJlY3QobWEsZGEuZm9nLElhLE9hLFUsYWIpO2NiPXllLmdldChkYSxzYnx8bWEpfWZ1bmN0aW9uIFcoVSxkYSxtYSl7dmFyIElhPWVjLmdldChVKSxPYT1jYi5zdGF0ZS5saWdodHMsYWI9T2Euc3RhdGUudmVyc2lvbjttYT1QZC5nZXRQYXJhbWV0ZXJzKFUsT2Euc3RhdGUsY2Iuc3RhdGUuc2hhZG93c0FycmF5LGRhLHljLm51bVBsYW5lcywKeWMubnVtSW50ZXJzZWN0aW9uLG1hKTt2YXIgUGE9UGQuZ2V0UHJvZ3JhbUNvZGUoVSxtYSksZmI9SWEucHJvZ3JhbSxDYj0hMDtpZih2b2lkIDA9PT1mYilVLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHopO2Vsc2UgaWYoZmIuY29kZSE9PVBhKUYoVSk7ZWxzZXtpZihJYS5saWdodHNTdGF0ZVZlcnNpb24hPT1hYilJYS5saWdodHNTdGF0ZVZlcnNpb249YWI7ZWxzZSBpZih2b2lkIDAhPT1tYS5zaGFkZXJJRClyZXR1cm47Q2I9ITF9Q2ImJihtYS5zaGFkZXJJRD8oUGE9TWNbbWEuc2hhZGVySURdLElhLnNoYWRlcj17bmFtZTpVLnR5cGUsdW5pZm9ybXM6dWIoUGEudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpQYS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6UGEuZnJhZ21lbnRTaGFkZXJ9KTpJYS5zaGFkZXI9e25hbWU6VS50eXBlLHVuaWZvcm1zOlUudW5pZm9ybXMsdmVydGV4U2hhZGVyOlUudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOlUuZnJhZ21lbnRTaGFkZXJ9LApQYT1QZC5nZXRQcm9ncmFtQ29kZShVLG1hKSxmYj1QZC5hY3F1aXJlUHJvZ3JhbShVLElhLnNoYWRlcixtYSxQYSksSWEucHJvZ3JhbT1mYixVLnByb2dyYW09ZmIpO21hPWZiLmdldEF0dHJpYnV0ZXMoKTtpZihVLm1vcnBoVGFyZ2V0cylmb3IoUGE9VS5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHM9MDtQYTxqYS5tYXhNb3JwaFRhcmdldHM7UGErKykwPD1tYVsibW9ycGhUYXJnZXQiK1BhXSYmVS5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMrKztpZihVLm1vcnBoTm9ybWFscylmb3IoUGE9VS5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHM9MDtQYTxqYS5tYXhNb3JwaE5vcm1hbHM7UGErKykwPD1tYVsibW9ycGhOb3JtYWwiK1BhXSYmVS5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMrKzttYT1JYS5zaGFkZXIudW5pZm9ybXM7aWYoIVUuaXNTaGFkZXJNYXRlcmlhbCYmIVUuaXNSYXdTaGFkZXJNYXRlcmlhbHx8ITA9PT1VLmNsaXBwaW5nKUlhLm51bUNsaXBwaW5nUGxhbmVzPXljLm51bVBsYW5lcywKSWEubnVtSW50ZXJzZWN0aW9uPXljLm51bUludGVyc2VjdGlvbixtYS5jbGlwcGluZ1BsYW5lcz15Yy51bmlmb3JtO0lhLmZvZz1kYTtJYS5saWdodHNTdGF0ZVZlcnNpb249YWI7VS5saWdodHMmJihtYS5hbWJpZW50TGlnaHRDb2xvci52YWx1ZT1PYS5zdGF0ZS5hbWJpZW50LG1hLmxpZ2h0UHJvYmUudmFsdWU9T2Euc3RhdGUucHJvYmUsbWEuZGlyZWN0aW9uYWxMaWdodHMudmFsdWU9T2Euc3RhdGUuZGlyZWN0aW9uYWwsbWEuc3BvdExpZ2h0cy52YWx1ZT1PYS5zdGF0ZS5zcG90LG1hLnJlY3RBcmVhTGlnaHRzLnZhbHVlPU9hLnN0YXRlLnJlY3RBcmVhLG1hLnBvaW50TGlnaHRzLnZhbHVlPU9hLnN0YXRlLnBvaW50LG1hLmhlbWlzcGhlcmVMaWdodHMudmFsdWU9T2Euc3RhdGUuaGVtaSxtYS5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZT1PYS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcCxtYS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZT1PYS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeCwKbWEuc3BvdFNoYWRvd01hcC52YWx1ZT1PYS5zdGF0ZS5zcG90U2hhZG93TWFwLG1hLnNwb3RTaGFkb3dNYXRyaXgudmFsdWU9T2Euc3RhdGUuc3BvdFNoYWRvd01hdHJpeCxtYS5wb2ludFNoYWRvd01hcC52YWx1ZT1PYS5zdGF0ZS5wb2ludFNoYWRvd01hcCxtYS5wb2ludFNoYWRvd01hdHJpeC52YWx1ZT1PYS5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCk7VT1JYS5wcm9ncmFtLmdldFVuaWZvcm1zKCk7VT11ZC5zZXFXaXRoVmFsdWUoVS5zZXEsbWEpO0lhLnVuaWZvcm1zTGlzdD1VfWZ1bmN0aW9uIGhhKFUsZGEsbWEsSWEpe09jLnJlc2V0VGV4dHVyZVVuaXRzKCk7dmFyIE9hPWVjLmdldChtYSksYWI9Y2Iuc3RhdGUubGlnaHRzO3hnJiYoUmh8fFUhPT1wYikmJnljLnNldFN0YXRlKG1hLmNsaXBwaW5nUGxhbmVzLG1hLmNsaXBJbnRlcnNlY3Rpb24sbWEuY2xpcFNoYWRvd3MsVSxPYSxVPT09cGImJm1hLmlkPT09UWEpOyExPT09bWEubmVlZHNVcGRhdGUmJih2b2lkIDA9PT1PYS5wcm9ncmFtPwptYS5uZWVkc1VwZGF0ZT0hMDptYS5mb2cmJk9hLmZvZyE9PWRhP21hLm5lZWRzVXBkYXRlPSEwOm1hLmxpZ2h0cyYmT2EubGlnaHRzU3RhdGVWZXJzaW9uIT09YWIuc3RhdGUudmVyc2lvbj9tYS5uZWVkc1VwZGF0ZT0hMDp2b2lkIDA9PT1PYS5udW1DbGlwcGluZ1BsYW5lc3x8T2EubnVtQ2xpcHBpbmdQbGFuZXM9PT15Yy5udW1QbGFuZXMmJk9hLm51bUludGVyc2VjdGlvbj09PXljLm51bUludGVyc2VjdGlvbnx8KG1hLm5lZWRzVXBkYXRlPSEwKSk7bWEubmVlZHNVcGRhdGUmJihXKG1hLGRhLElhKSxtYS5uZWVkc1VwZGF0ZT0hMSk7dmFyIFBhPSExLGZiPWFiPSExLENiPU9hLnByb2dyYW0sb2I9Q2IuZ2V0VW5pZm9ybXMoKSwkYT1PYS5zaGFkZXIudW5pZm9ybXM7eWIudXNlUHJvZ3JhbShDYi5wcm9ncmFtKSYmKGZiPWFiPVBhPSEwKTttYS5pZCE9PVFhJiYoUWE9bWEuaWQsYWI9ITApO2lmKFBhfHxwYiE9PVUpe29iLnNldFZhbHVlKFJhLCJwcm9qZWN0aW9uTWF0cml4IixVLnByb2plY3Rpb25NYXRyaXgpOwpkYy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZvYi5zZXRWYWx1ZShSYSwibG9nRGVwdGhCdWZGQyIsMi8oTWF0aC5sb2coVS5mYXIrMSkvTWF0aC5MTjIpKTtwYiE9PVUmJihwYj1VLGZiPWFiPSEwKTtpZihtYS5pc1NoYWRlck1hdGVyaWFsfHxtYS5pc01lc2hQaG9uZ01hdGVyaWFsfHxtYS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxtYS5lbnZNYXApUGE9b2IubWFwLmNhbWVyYVBvc2l0aW9uLHZvaWQgMCE9PVBhJiZQYS5zZXRWYWx1ZShSYSx6ZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oVS5tYXRyaXhXb3JsZCkpOyhtYS5pc01lc2hQaG9uZ01hdGVyaWFsfHxtYS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fG1hLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fG1hLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fG1hLmlzU2hhZGVyTWF0ZXJpYWx8fG1hLnNraW5uaW5nKSYmb2Iuc2V0VmFsdWUoUmEsInZpZXdNYXRyaXgiLFUubWF0cml4V29ybGRJbnZlcnNlKX1pZihtYS5za2lubmluZyYmKG9iLnNldE9wdGlvbmFsKFJhLApJYSwiYmluZE1hdHJpeCIpLG9iLnNldE9wdGlvbmFsKFJhLElhLCJiaW5kTWF0cml4SW52ZXJzZSIpLFU9SWEuc2tlbGV0b24pKWlmKFBhPVUuYm9uZXMsZGMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyl7aWYodm9pZCAwPT09VS5ib25lVGV4dHVyZSl7UGE9TWF0aC5zcXJ0KDQqUGEubGVuZ3RoKTtQYT1oYi5jZWlsUG93ZXJPZlR3byhQYSk7UGE9TWF0aC5tYXgoUGEsNCk7dmFyIFBjPW5ldyBGbG9hdDMyQXJyYXkoUGEqUGEqNCk7UGMuc2V0KFUuYm9uZU1hdHJpY2VzKTt2YXIgeGM9bmV3IEFiKFBjLFBhLFBhLDEwMjMsMTAxNSk7eGMubmVlZHNVcGRhdGU9ITA7VS5ib25lTWF0cmljZXM9UGM7VS5ib25lVGV4dHVyZT14YztVLmJvbmVUZXh0dXJlU2l6ZT1QYX1vYi5zZXRWYWx1ZShSYSwiYm9uZVRleHR1cmUiLFUuYm9uZVRleHR1cmUsT2MpO29iLnNldFZhbHVlKFJhLCJib25lVGV4dHVyZVNpemUiLFUuYm9uZVRleHR1cmVTaXplKX1lbHNlIG9iLnNldE9wdGlvbmFsKFJhLFUsImJvbmVNYXRyaWNlcyIpOwphYiYmKG9iLnNldFZhbHVlKFJhLCJ0b25lTWFwcGluZ0V4cG9zdXJlIixqYS50b25lTWFwcGluZ0V4cG9zdXJlKSxvYi5zZXRWYWx1ZShSYSwidG9uZU1hcHBpbmdXaGl0ZVBvaW50IixqYS50b25lTWFwcGluZ1doaXRlUG9pbnQpLG1hLmxpZ2h0cyYmdGIoJGEsZmIpLGRhJiZtYS5mb2cmJm9hKCRhLGRhKSxtYS5pc01lc2hCYXNpY01hdGVyaWFsP2ZhKCRhLG1hKTptYS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw/KGZhKCRhLG1hKSx0YSgkYSxtYSkpOm1hLmlzTWVzaFBob25nTWF0ZXJpYWw/KGZhKCRhLG1hKSxtYS5pc01lc2hUb29uTWF0ZXJpYWw/VGEoJGEsbWEpOkJhKCRhLG1hKSk6bWEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD8oZmEoJGEsbWEpLG1hLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw/Q2EoJGEsbWEpOlVhKCRhLG1hKSk6bWEuaXNNZXNoTWF0Y2FwTWF0ZXJpYWw/KGZhKCRhLG1hKSxIYSgkYSxtYSkpOm1hLmlzTWVzaERlcHRoTWF0ZXJpYWw/KGZhKCRhLG1hKSxEYSgkYSwKbWEpKTptYS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhmYSgkYSxtYSksTWEoJGEsbWEpKTptYS5pc01lc2hOb3JtYWxNYXRlcmlhbD8oZmEoJGEsbWEpLGRiKCRhLG1hKSk6bWEuaXNMaW5lQmFzaWNNYXRlcmlhbD8ocmEoJGEsbWEpLG1hLmlzTGluZURhc2hlZE1hdGVyaWFsJiZwYSgkYSxtYSkpOm1hLmlzUG9pbnRzTWF0ZXJpYWw/cWEoJGEsbWEpOm1hLmlzU3ByaXRlTWF0ZXJpYWw/dWEoJGEsbWEpOm1hLmlzU2hhZG93TWF0ZXJpYWwmJigkYS5jb2xvci52YWx1ZS5jb3B5KG1hLmNvbG9yKSwkYS5vcGFjaXR5LnZhbHVlPW1hLm9wYWNpdHkpLHZvaWQgMCE9PSRhLmx0Y18xJiYoJGEubHRjXzEudmFsdWU9V2EuTFRDXzEpLHZvaWQgMCE9PSRhLmx0Y18yJiYoJGEubHRjXzIudmFsdWU9V2EuTFRDXzIpLHVkLnVwbG9hZChSYSxPYS51bmlmb3Jtc0xpc3QsJGEsT2MpKTttYS5pc1NoYWRlck1hdGVyaWFsJiYhMD09PW1hLnVuaWZvcm1zTmVlZFVwZGF0ZSYmKHVkLnVwbG9hZChSYSxPYS51bmlmb3Jtc0xpc3QsCiRhLE9jKSxtYS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpO21hLmlzU3ByaXRlTWF0ZXJpYWwmJm9iLnNldFZhbHVlKFJhLCJjZW50ZXIiLElhLmNlbnRlcik7b2Iuc2V0VmFsdWUoUmEsIm1vZGVsVmlld01hdHJpeCIsSWEubW9kZWxWaWV3TWF0cml4KTtvYi5zZXRWYWx1ZShSYSwibm9ybWFsTWF0cml4IixJYS5ub3JtYWxNYXRyaXgpO29iLnNldFZhbHVlKFJhLCJtb2RlbE1hdHJpeCIsSWEubWF0cml4V29ybGQpO3JldHVybiBDYn1mdW5jdGlvbiBmYShVLGRhKXtVLm9wYWNpdHkudmFsdWU9ZGEub3BhY2l0eTtkYS5jb2xvciYmVS5kaWZmdXNlLnZhbHVlLmNvcHkoZGEuY29sb3IpO2RhLmVtaXNzaXZlJiZVLmVtaXNzaXZlLnZhbHVlLmNvcHkoZGEuZW1pc3NpdmUpLm11bHRpcGx5U2NhbGFyKGRhLmVtaXNzaXZlSW50ZW5zaXR5KTtkYS5tYXAmJihVLm1hcC52YWx1ZT1kYS5tYXApO2RhLmFscGhhTWFwJiYoVS5hbHBoYU1hcC52YWx1ZT1kYS5hbHBoYU1hcCk7ZGEuc3BlY3VsYXJNYXAmJgooVS5zcGVjdWxhck1hcC52YWx1ZT1kYS5zcGVjdWxhck1hcCk7ZGEuZW52TWFwJiYoVS5lbnZNYXAudmFsdWU9ZGEuZW52TWFwLFUuZmxpcEVudk1hcC52YWx1ZT1kYS5lbnZNYXAuaXNDdWJlVGV4dHVyZT8tMToxLFUucmVmbGVjdGl2aXR5LnZhbHVlPWRhLnJlZmxlY3Rpdml0eSxVLnJlZnJhY3Rpb25SYXRpby52YWx1ZT1kYS5yZWZyYWN0aW9uUmF0aW8sVS5tYXhNaXBMZXZlbC52YWx1ZT1lYy5nZXQoZGEuZW52TWFwKS5fX21heE1pcExldmVsKTtkYS5saWdodE1hcCYmKFUubGlnaHRNYXAudmFsdWU9ZGEubGlnaHRNYXAsVS5saWdodE1hcEludGVuc2l0eS52YWx1ZT1kYS5saWdodE1hcEludGVuc2l0eSk7ZGEuYW9NYXAmJihVLmFvTWFwLnZhbHVlPWRhLmFvTWFwLFUuYW9NYXBJbnRlbnNpdHkudmFsdWU9ZGEuYW9NYXBJbnRlbnNpdHkpO2lmKGRhLm1hcCl2YXIgbWE9ZGEubWFwO2Vsc2UgZGEuc3BlY3VsYXJNYXA/bWE9ZGEuc3BlY3VsYXJNYXA6ZGEuZGlzcGxhY2VtZW50TWFwPwptYT1kYS5kaXNwbGFjZW1lbnRNYXA6ZGEubm9ybWFsTWFwP21hPWRhLm5vcm1hbE1hcDpkYS5idW1wTWFwP21hPWRhLmJ1bXBNYXA6ZGEucm91Z2huZXNzTWFwP21hPWRhLnJvdWdobmVzc01hcDpkYS5tZXRhbG5lc3NNYXA/bWE9ZGEubWV0YWxuZXNzTWFwOmRhLmFscGhhTWFwP21hPWRhLmFscGhhTWFwOmRhLmVtaXNzaXZlTWFwJiYobWE9ZGEuZW1pc3NpdmVNYXApO3ZvaWQgMCE9PW1hJiYobWEuaXNXZWJHTFJlbmRlclRhcmdldCYmKG1hPW1hLnRleHR1cmUpLCEwPT09bWEubWF0cml4QXV0b1VwZGF0ZSYmbWEudXBkYXRlTWF0cml4KCksVS51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KG1hLm1hdHJpeCkpfWZ1bmN0aW9uIHJhKFUsZGEpe1UuZGlmZnVzZS52YWx1ZS5jb3B5KGRhLmNvbG9yKTtVLm9wYWNpdHkudmFsdWU9ZGEub3BhY2l0eX1mdW5jdGlvbiBwYShVLGRhKXtVLmRhc2hTaXplLnZhbHVlPWRhLmRhc2hTaXplO1UudG90YWxTaXplLnZhbHVlPWRhLmRhc2hTaXplK2RhLmdhcFNpemU7ClUuc2NhbGUudmFsdWU9ZGEuc2NhbGV9ZnVuY3Rpb24gcWEoVSxkYSl7VS5kaWZmdXNlLnZhbHVlLmNvcHkoZGEuY29sb3IpO1Uub3BhY2l0eS52YWx1ZT1kYS5vcGFjaXR5O1Uuc2l6ZS52YWx1ZT1kYS5zaXplKmNjO1Uuc2NhbGUudmFsdWU9LjUqemM7VS5tYXAudmFsdWU9ZGEubWFwO251bGwhPT1kYS5tYXAmJighMD09PWRhLm1hcC5tYXRyaXhBdXRvVXBkYXRlJiZkYS5tYXAudXBkYXRlTWF0cml4KCksVS51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGRhLm1hcC5tYXRyaXgpKX1mdW5jdGlvbiB1YShVLGRhKXtVLmRpZmZ1c2UudmFsdWUuY29weShkYS5jb2xvcik7VS5vcGFjaXR5LnZhbHVlPWRhLm9wYWNpdHk7VS5yb3RhdGlvbi52YWx1ZT1kYS5yb3RhdGlvbjtVLm1hcC52YWx1ZT1kYS5tYXA7bnVsbCE9PWRhLm1hcCYmKCEwPT09ZGEubWFwLm1hdHJpeEF1dG9VcGRhdGUmJmRhLm1hcC51cGRhdGVNYXRyaXgoKSxVLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoZGEubWFwLm1hdHJpeCkpfQpmdW5jdGlvbiBvYShVLGRhKXtVLmZvZ0NvbG9yLnZhbHVlLmNvcHkoZGEuY29sb3IpO2RhLmlzRm9nPyhVLmZvZ05lYXIudmFsdWU9ZGEubmVhcixVLmZvZ0Zhci52YWx1ZT1kYS5mYXIpOmRhLmlzRm9nRXhwMiYmKFUuZm9nRGVuc2l0eS52YWx1ZT1kYS5kZW5zaXR5KX1mdW5jdGlvbiB0YShVLGRhKXtkYS5lbWlzc2l2ZU1hcCYmKFUuZW1pc3NpdmVNYXAudmFsdWU9ZGEuZW1pc3NpdmVNYXApfWZ1bmN0aW9uIEJhKFUsZGEpe1Uuc3BlY3VsYXIudmFsdWUuY29weShkYS5zcGVjdWxhcik7VS5zaGluaW5lc3MudmFsdWU9TWF0aC5tYXgoZGEuc2hpbmluZXNzLDFFLTQpO2RhLmVtaXNzaXZlTWFwJiYoVS5lbWlzc2l2ZU1hcC52YWx1ZT1kYS5lbWlzc2l2ZU1hcCk7ZGEuYnVtcE1hcCYmKFUuYnVtcE1hcC52YWx1ZT1kYS5idW1wTWFwLFUuYnVtcFNjYWxlLnZhbHVlPWRhLmJ1bXBTY2FsZSwxPT09ZGEuc2lkZSYmKFUuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2RhLm5vcm1hbE1hcCYmKFUubm9ybWFsTWFwLnZhbHVlPQpkYS5ub3JtYWxNYXAsVS5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLm5vcm1hbFNjYWxlKSwxPT09ZGEuc2lkZSYmVS5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSk7ZGEuZGlzcGxhY2VtZW50TWFwJiYoVS5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZGEuZGlzcGxhY2VtZW50TWFwLFUuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZGEuZGlzcGxhY2VtZW50U2NhbGUsVS5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWRhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIFRhKFUsZGEpe0JhKFUsZGEpO2RhLmdyYWRpZW50TWFwJiYoVS5ncmFkaWVudE1hcC52YWx1ZT1kYS5ncmFkaWVudE1hcCl9ZnVuY3Rpb24gVWEoVSxkYSl7VS5yb3VnaG5lc3MudmFsdWU9ZGEucm91Z2huZXNzO1UubWV0YWxuZXNzLnZhbHVlPWRhLm1ldGFsbmVzcztkYS5yb3VnaG5lc3NNYXAmJihVLnJvdWdobmVzc01hcC52YWx1ZT1kYS5yb3VnaG5lc3NNYXApO2RhLm1ldGFsbmVzc01hcCYmKFUubWV0YWxuZXNzTWFwLnZhbHVlPQpkYS5tZXRhbG5lc3NNYXApO2RhLmVtaXNzaXZlTWFwJiYoVS5lbWlzc2l2ZU1hcC52YWx1ZT1kYS5lbWlzc2l2ZU1hcCk7ZGEuYnVtcE1hcCYmKFUuYnVtcE1hcC52YWx1ZT1kYS5idW1wTWFwLFUuYnVtcFNjYWxlLnZhbHVlPWRhLmJ1bXBTY2FsZSwxPT09ZGEuc2lkZSYmKFUuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2RhLm5vcm1hbE1hcCYmKFUubm9ybWFsTWFwLnZhbHVlPWRhLm5vcm1hbE1hcCxVLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZGEubm9ybWFsU2NhbGUpLDE9PT1kYS5zaWRlJiZVLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtkYS5kaXNwbGFjZW1lbnRNYXAmJihVLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxVLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZGEuZGlzcGxhY2VtZW50Qmlhcyk7ZGEuZW52TWFwJiYoVS5lbnZNYXBJbnRlbnNpdHkudmFsdWU9CmRhLmVudk1hcEludGVuc2l0eSl9ZnVuY3Rpb24gQ2EoVSxkYSl7VWEoVSxkYSk7VS5yZWZsZWN0aXZpdHkudmFsdWU9ZGEucmVmbGVjdGl2aXR5O1UuY2xlYXJjb2F0LnZhbHVlPWRhLmNsZWFyY29hdDtVLmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZT1kYS5jbGVhcmNvYXRSb3VnaG5lc3M7ZGEuc2hlZW4mJlUuc2hlZW4udmFsdWUuY29weShkYS5zaGVlbik7ZGEuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoVS5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLmNsZWFyY29hdE5vcm1hbFNjYWxlKSxVLmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1kYS5jbGVhcmNvYXROb3JtYWxNYXAsMT09PWRhLnNpZGUmJlUuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1UudHJhbnNwYXJlbmN5LnZhbHVlPWRhLnRyYW5zcGFyZW5jeX1mdW5jdGlvbiBIYShVLGRhKXtkYS5tYXRjYXAmJihVLm1hdGNhcC52YWx1ZT1kYS5tYXRjYXApO2RhLmJ1bXBNYXAmJihVLmJ1bXBNYXAudmFsdWU9CmRhLmJ1bXBNYXAsVS5idW1wU2NhbGUudmFsdWU9ZGEuYnVtcFNjYWxlLDE9PT1kYS5zaWRlJiYoVS5idW1wU2NhbGUudmFsdWUqPS0xKSk7ZGEubm9ybWFsTWFwJiYoVS5ub3JtYWxNYXAudmFsdWU9ZGEubm9ybWFsTWFwLFUubm9ybWFsU2NhbGUudmFsdWUuY29weShkYS5ub3JtYWxTY2FsZSksMT09PWRhLnNpZGUmJlUubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiBEYShVLGRhKXtkYS5kaXNwbGFjZW1lbnRNYXAmJihVLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxVLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9CmRhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIE1hKFUsZGEpe2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKTtVLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoZGEucmVmZXJlbmNlUG9zaXRpb24pO1UubmVhckRpc3RhbmNlLnZhbHVlPWRhLm5lYXJEaXN0YW5jZTtVLmZhckRpc3RhbmNlLnZhbHVlPWRhLmZhckRpc3RhbmNlfWZ1bmN0aW9uIGRiKFUsZGEpe2RhLmJ1bXBNYXAmJihVLmJ1bXBNYXAudmFsdWU9ZGEuYnVtcE1hcCxVLmJ1bXBTY2FsZS52YWx1ZT1kYS5idW1wU2NhbGUsMT09PWRhLnNpZGUmJihVLmJ1bXBTY2FsZS52YWx1ZSo9LTEpKTtkYS5ub3JtYWxNYXAmJihVLm5vcm1hbE1hcC52YWx1ZT1kYS5ub3JtYWxNYXAsVS5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLm5vcm1hbFNjYWxlKSwKMT09PWRhLnNpZGUmJlUubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiB0YihVLGRhKXtVLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlPWRhO1UubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZT1kYTtVLmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlPWRhO1UucG9pbnRMaWdodHMubmVlZHNVcGRhdGU9ZGE7VS5zcG90TGlnaHRzLm5lZWRzVXBkYXRlPWRhO1UucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGU9ZGE7VS5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlPWRhfWE9YXx8e307dmFyIEthPXZvaWQgMCE9PWEuY2FudmFzP2EuY2FudmFzOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiJjYW52YXMiKSxiYj12b2lkIDAhPT1hLmNvbnRleHQ/YS5jb250ZXh0Om51bGwsamI9dm9pZCAwIT09YS5hbHBoYT9hLmFscGhhOiExLEViPXZvaWQgMCE9PWEuZGVwdGg/YS5kZXB0aDohMCx4Yj12b2lkIDAhPT1hLnN0ZW5jaWw/YS5zdGVuY2lsOiEwLGlhPXZvaWQgMCE9PWEuYW50aWFsaWFzP2EuYW50aWFsaWFzOiExLG5hPXZvaWQgMCE9PWEucHJlbXVsdGlwbGllZEFscGhhP2EucHJlbXVsdGlwbGllZEFscGhhOiEwLHphPXZvaWQgMCE9PWEucHJlc2VydmVEcmF3aW5nQnVmZmVyP2EucHJlc2VydmVEcmF3aW5nQnVmZmVyOiExLEphPXZvaWQgMCE9PWEucG93ZXJQcmVmZXJlbmNlP2EucG93ZXJQcmVmZXJlbmNlOiJkZWZhdWx0IixZYT12b2lkIDAhPT1hLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ/YS5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiExLE5hPW51bGwsY2I9bnVsbDt0aGlzLmRvbUVsZW1lbnQ9S2E7dGhpcy5kZWJ1Zz17Y2hlY2tTaGFkZXJFcnJvcnM6ITB9Owp0aGlzLnNvcnRPYmplY3RzPXRoaXMuYXV0b0NsZWFyU3RlbmNpbD10aGlzLmF1dG9DbGVhckRlcHRoPXRoaXMuYXV0b0NsZWFyQ29sb3I9dGhpcy5hdXRvQ2xlYXI9ITA7dGhpcy5jbGlwcGluZ1BsYW5lcz1bXTt0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkPSExO3RoaXMuZ2FtbWFGYWN0b3I9Mjt0aGlzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzPXRoaXMuZ2FtbWFPdXRwdXQ9dGhpcy5nYW1tYUlucHV0PSExO3RoaXMudG9uZU1hcHBpbmdXaGl0ZVBvaW50PXRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZT10aGlzLnRvbmVNYXBwaW5nPTE7dGhpcy5tYXhNb3JwaFRhcmdldHM9ODt0aGlzLm1heE1vcnBoTm9ybWFscz00O3ZhciBqYT10aGlzLEdhPSExLExhPW51bGwsbmI9MCxWYT0wLGliPW51bGwsa2I9bnVsbCxRYT0tMTt2YXIgZWI9Yz1udWxsO3ZhciBtYj0hMTt2YXIgcGI9bnVsbCxzYj1udWxsLEtiPW5ldyBwLFNiPW5ldyBwLG5jPW51bGwsUWM9S2Eud2lkdGgsemM9S2EuaGVpZ2h0LApjYz0xLHdlPW5ldyBwKDAsMCxRYyx6YyksdmU9bmV3IHAoMCwwLFFjLHpjKSxTaD0hMSxRaD1uZXcgaWMseWM9bmV3IHdjLHhnPSExLFJoPSExLHdmPW5ldyBxLHpkPW5ldyBrO3RyeXtqYj17YWxwaGE6amIsZGVwdGg6RWIsc3RlbmNpbDp4YixhbnRpYWxpYXM6aWEscHJlbXVsdGlwbGllZEFscGhhOm5hLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjp6YSxwb3dlclByZWZlcmVuY2U6SmEsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDpZYSx4ckNvbXBhdGlibGU6ITB9O0thLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHIsITEpO0thLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix2LCExKTt2YXIgUmE9YmJ8fEthLmdldENvbnRleHQoIndlYmdsIixqYil8fEthLmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIsamIpO2lmKG51bGw9PT1SYSl7aWYobnVsbCE9PUthLmdldENvbnRleHQoIndlYmdsIikpdGhyb3cgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIik7CnRocm93IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LiIpO312b2lkIDA9PT1SYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQmJihSYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm57cmFuZ2VNaW46MSxyYW5nZU1heDoxLHByZWNpc2lvbjoxfX0pfWNhdGNoKFUpe3Rocm93IGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6ICIrVS5tZXNzYWdlKSxVO312YXIgTGIsZGMseWIseGQsZWMsT2MsdmcsUGgseGUsUGQsd2cseWUseWQsQmosQ2osRGosTmM7ZygpO3ZhciBkZD0idW5kZWZpbmVkIiE9PXR5cGVvZiBuYXZpZ2F0b3ImJiJ4ciJpbiBuYXZpZ2F0b3ImJiJzdXBwb3J0c1Nlc3Npb24iaW4gbmF2aWdhdG9yLnhyP25ldyBBaihqYSxSYSk6bmV3IE5oKGphKTt0aGlzLnZyPWRkO3ZhciBFaj1uZXcgdmooamEseGUsZGMubWF4VGV4dHVyZVNpemUpO3RoaXMuc2hhZG93TWFwPUVqO3RoaXMuZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiBSYX07CnRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gUmEuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKX07dGhpcy5mb3JjZUNvbnRleHRMb3NzPWZ1bmN0aW9uKCl7dmFyIFU9TGIuZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTtVJiZVLmxvc2VDb250ZXh0KCl9O3RoaXMuZm9yY2VDb250ZXh0UmVzdG9yZT1mdW5jdGlvbigpe3ZhciBVPUxiLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7VSYmVS5yZXN0b3JlQ29udGV4dCgpfTt0aGlzLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4gY2N9O3RoaXMuc2V0UGl4ZWxSYXRpbz1mdW5jdGlvbigpe3ZhciBVPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3ZvaWQgMCE9PVUmJihjYz1VLHRoaXMuc2V0U2l6ZShRYyx6YywhMSkpfTt0aGlzLmdldFNpemU9ZnVuY3Rpb24oVSl7dm9pZCAwPT09VSYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldHNpemUoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3IyIGFzIGFuIGFyZ3VtZW50IiksClU9bmV3IGYpO3JldHVybiBVLnNldChRYyx6Yyl9O3RoaXMuc2V0U2l6ZT1mdW5jdGlvbihVLGRhLG1hKXtkZC5pc1ByZXNlbnRpbmcoKT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IENhbid0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLiIpOihRYz1VLHpjPWRhLEthLndpZHRoPU1hdGguZmxvb3IoVSpjYyksS2EuaGVpZ2h0PU1hdGguZmxvb3IoZGEqY2MpLCExIT09bWEmJihLYS5zdHlsZS53aWR0aD1VKyJweCIsS2Euc3R5bGUuaGVpZ2h0PWRhKyJweCIpLHRoaXMuc2V0Vmlld3BvcnQoVSxkYSkpfTt0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFUpe3ZvaWQgMD09PVUmJihjb25zb2xlLndhcm4oIldlYkdMUmVuZGVyZXI6IC5nZXRkcmF3aW5nQnVmZmVyU2l6ZSgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjIgYXMgYW4gYXJndW1lbnQiKSxVPW5ldyBmKTtyZXR1cm4gVS5zZXQoUWMqY2MsemMqY2MpLmZsb29yKCl9Owp0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFUsZGEsbWEpe1FjPVU7emM9ZGE7Y2M9bWE7S2Eud2lkdGg9TWF0aC5mbG9vcihVKm1hKTtLYS5oZWlnaHQ9TWF0aC5mbG9vcihkYSptYSk7dGhpcy5zZXRWaWV3cG9ydChVLGRhKX07dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQ9ZnVuY3Rpb24oVSl7dm9pZCAwPT09VSYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRWaWV3cG9ydCgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjQgYXMgYW4gYXJndW1lbnQiKSxVPW5ldyBwKTtyZXR1cm4gVS5jb3B5KEtiKX07dGhpcy5nZXRWaWV3cG9ydD1mdW5jdGlvbihVKXtyZXR1cm4gVS5jb3B5KHdlKX07dGhpcy5zZXRWaWV3cG9ydD1mdW5jdGlvbihVLGRhKXsoMCkuaXNWZWN0b3I0P3dlLnNldCgoMCkueCwoMCkueSwoMCkueiwoMCkudyk6d2Uuc2V0KDAsMCxVLGRhKTt5Yi52aWV3cG9ydChLYi5jb3B5KHdlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSl9Owp0aGlzLmdldFNjaXNzb3I9ZnVuY3Rpb24oVSl7cmV0dXJuIFUuY29weSh2ZSl9O3RoaXMuc2V0U2Npc3Nvcj1mdW5jdGlvbihVLGRhLG1hLElhKXtVLmlzVmVjdG9yND92ZS5zZXQoVS54LFUueSxVLnosVS53KTp2ZS5zZXQoVSxkYSxtYSxJYSk7eWIuc2Npc3NvcihTYi5jb3B5KHZlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSl9O3RoaXMuZ2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gU2h9O3RoaXMuc2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oVSl7eWIuc2V0U2Npc3NvclRlc3QoU2g9VSl9O3RoaXMuZ2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3JldHVybiB5ZC5nZXRDbGVhckNvbG9yKCl9O3RoaXMuc2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3lkLnNldENsZWFyQ29sb3IuYXBwbHkoeWQsYXJndW1lbnRzKX07dGhpcy5nZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7cmV0dXJuIHlkLmdldENsZWFyQWxwaGEoKX07dGhpcy5zZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7eWQuc2V0Q2xlYXJBbHBoYS5hcHBseSh5ZCwKYXJndW1lbnRzKX07dGhpcy5jbGVhcj1mdW5jdGlvbihVLGRhLG1hKXt2YXIgSWE9MDtpZih2b2lkIDA9PT1VfHxVKUlhfD0xNjM4NDtpZih2b2lkIDA9PT1kYXx8ZGEpSWF8PTI1NjtpZih2b2lkIDA9PT1tYXx8bWEpSWF8PTEwMjQ7UmEuY2xlYXIoSWEpfTt0aGlzLmNsZWFyQ29sb3I9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCEwLCExLCExKX07dGhpcy5jbGVhckRlcHRoPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMCwhMSl9O3RoaXMuY2xlYXJTdGVuY2lsPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMSwhMCl9O3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe0thLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHIsITEpO0thLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix2LCExKTt3Zy5kaXNwb3NlKCk7eWUuZGlzcG9zZSgpO2VjLmRpc3Bvc2UoKTt4ZS5kaXNwb3NlKCk7ZGQuZGlzcG9zZSgpO3lnLnN0b3AoKX07dGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGU9CmZ1bmN0aW9uKFUsZGEpe3liLmluaXRBdHRyaWJ1dGVzKCk7dmFyIG1hPWVjLmdldChVKTtVLmhhc1Bvc2l0aW9ucyYmIW1hLnBvc2l0aW9uJiYobWEucG9zaXRpb249UmEuY3JlYXRlQnVmZmVyKCkpO1UuaGFzTm9ybWFscyYmIW1hLm5vcm1hbCYmKG1hLm5vcm1hbD1SYS5jcmVhdGVCdWZmZXIoKSk7VS5oYXNVdnMmJiFtYS51diYmKG1hLnV2PVJhLmNyZWF0ZUJ1ZmZlcigpKTtVLmhhc0NvbG9ycyYmIW1hLmNvbG9yJiYobWEuY29sb3I9UmEuY3JlYXRlQnVmZmVyKCkpO2RhPWRhLmdldEF0dHJpYnV0ZXMoKTtVLmhhc1Bvc2l0aW9ucyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbWEucG9zaXRpb24pLFJhLmJ1ZmZlckRhdGEoMzQ5NjIsVS5wb3NpdGlvbkFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoZGEucG9zaXRpb24pLFJhLnZlcnRleEF0dHJpYlBvaW50ZXIoZGEucG9zaXRpb24sMyw1MTI2LCExLDAsMCkpO1UuaGFzTm9ybWFscyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbWEubm9ybWFsKSwKUmEuYnVmZmVyRGF0YSgzNDk2MixVLm5vcm1hbEFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoZGEubm9ybWFsKSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRhLm5vcm1hbCwzLDUxMjYsITEsMCwwKSk7VS5oYXNVdnMmJihSYS5iaW5kQnVmZmVyKDM0OTYyLG1hLnV2KSxSYS5idWZmZXJEYXRhKDM0OTYyLFUudXZBcnJheSwzNTA0OCkseWIuZW5hYmxlQXR0cmlidXRlKGRhLnV2KSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRhLnV2LDIsNTEyNiwhMSwwLDApKTtVLmhhc0NvbG9ycyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbWEuY29sb3IpLFJhLmJ1ZmZlckRhdGEoMzQ5NjIsVS5jb2xvckFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoZGEuY29sb3IpLFJhLnZlcnRleEF0dHJpYlBvaW50ZXIoZGEuY29sb3IsMyw1MTI2LCExLDAsMCkpO3liLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7UmEuZHJhd0FycmF5cyg0LDAsVS5jb3VudCk7VS5jb3VudD0wfTt0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdD0KZnVuY3Rpb24oVSxkYSxtYSxJYSxPYSxhYil7eWIuc2V0TWF0ZXJpYWwoSWEsT2EuaXNNZXNoJiYwPk9hLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkpO3ZhciBQYT1oYShVLGRhLElhLE9hKSxmYj0hMTtpZihjIT09bWEuaWR8fGViIT09UGEuaWR8fG1iIT09KCEwPT09SWEud2lyZWZyYW1lKSljPW1hLmlkLGViPVBhLmlkLG1iPSEwPT09SWEud2lyZWZyYW1lLGZiPSEwO09hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKEJqLnVwZGF0ZShPYSxtYSxJYSxQYSksZmI9ITApO3ZhciBDYj1tYS5pbmRleCxvYj1tYS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2RhPTE7ITA9PT1JYS53aXJlZnJhbWUmJihDYj1QaC5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUobWEpLGRhPTIpO1U9Q2o7aWYobnVsbCE9PUNiKXt2YXIgJGE9dmcuZ2V0KENiKTtVPURqO1Uuc2V0SW5kZXgoJGEpfWZiJiYoUChJYSxQYSxtYSksbnVsbCE9PUNiJiZSYS5iaW5kQnVmZmVyKDM0OTYzLCRhLmJ1ZmZlcikpOyRhPUluZmluaXR5OwpudWxsIT09Q2I/JGE9Q2IuY291bnQ6dm9pZCAwIT09b2ImJigkYT1vYi5jb3VudCk7b2I9bWEuZHJhd1JhbmdlLnN0YXJ0KmRhO1BhPW51bGwhPT1hYj9hYi5zdGFydCpkYTowO0NiPU1hdGgubWF4KG9iLFBhKTthYj1NYXRoLm1heCgwLE1hdGgubWluKCRhLG9iK21hLmRyYXdSYW5nZS5jb3VudCpkYSxQYSsobnVsbCE9PWFiP2FiLmNvdW50KmRhOkluZmluaXR5KSktMS1DYisxKTtpZigwIT09YWIpe2lmKE9hLmlzTWVzaClpZighMD09PUlhLndpcmVmcmFtZSl5Yi5zZXRMaW5lV2lkdGgoSWEud2lyZWZyYW1lTGluZXdpZHRoKmUoKSksVS5zZXRNb2RlKDEpO2Vsc2Ugc3dpdGNoKE9hLmRyYXdNb2RlKXtjYXNlIDA6VS5zZXRNb2RlKDQpO2JyZWFrO2Nhc2UgMTpVLnNldE1vZGUoNSk7YnJlYWs7Y2FzZSAyOlUuc2V0TW9kZSg2KX1lbHNlIE9hLmlzTGluZT8oSWE9SWEubGluZXdpZHRoLHZvaWQgMD09PUlhJiYoSWE9MSkseWIuc2V0TGluZVdpZHRoKElhKmUoKSksT2EuaXNMaW5lU2VnbWVudHM/ClUuc2V0TW9kZSgxKTpPYS5pc0xpbmVMb29wP1Uuc2V0TW9kZSgyKTpVLnNldE1vZGUoMykpOk9hLmlzUG9pbnRzP1Uuc2V0TW9kZSgwKTpPYS5pc1Nwcml0ZSYmVS5zZXRNb2RlKDQpO21hJiZtYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PzA8bWEubWF4SW5zdGFuY2VkQ291bnQmJlUucmVuZGVySW5zdGFuY2VzKG1hLENiLGFiKTpVLnJlbmRlcihDYixhYil9fTt0aGlzLmNvbXBpbGU9ZnVuY3Rpb24oVSxkYSl7Y2I9eWUuZ2V0KFUsZGEpO2NiLmluaXQoKTtVLnRyYXZlcnNlKGZ1bmN0aW9uKG1hKXttYS5pc0xpZ2h0JiYoY2IucHVzaExpZ2h0KG1hKSxtYS5jYXN0U2hhZG93JiZjYi5wdXNoU2hhZG93KG1hKSl9KTtjYi5zZXR1cExpZ2h0cyhkYSk7VS50cmF2ZXJzZShmdW5jdGlvbihtYSl7aWYobWEubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheShtYS5tYXRlcmlhbCkpZm9yKHZhciBJYT0wO0lhPG1hLm1hdGVyaWFsLmxlbmd0aDtJYSsrKVcobWEubWF0ZXJpYWxbSWFdLFUuZm9nLAptYSk7ZWxzZSBXKG1hLm1hdGVyaWFsLFUuZm9nLG1hKX0pfTt2YXIgVGg9bnVsbCx5Zz1uZXcgYmM7eWcuc2V0QW5pbWF0aW9uTG9vcChmdW5jdGlvbihVKXtkZC5pc1ByZXNlbnRpbmcoKXx8VGgmJlRoKFUpfSk7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiZ5Zy5zZXRDb250ZXh0KHdpbmRvdyk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKFUpe1RoPVU7ZGQuc2V0QW5pbWF0aW9uTG9vcChVKTt5Zy5zdGFydCgpfTt0aGlzLnJlbmRlcj1mdW5jdGlvbihVLGRhLG1hLElhKXtpZih2b2lkIDAhPT1tYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcigpOiB0aGUgcmVuZGVyVGFyZ2V0IGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuc2V0UmVuZGVyVGFyZ2V0KCkgaW5zdGVhZC4iKTt2YXIgT2E9bWF9aWYodm9pZCAwIT09SWEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXIoKTogdGhlIGZvcmNlQ2xlYXIgYXJndW1lbnQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5jbGVhcigpIGluc3RlYWQuIik7CnZhciBhYj1JYX1kYSYmZGEuaXNDYW1lcmE/R2F8fChlYj1jPW51bGwsbWI9ITEsUWE9LTEscGI9bnVsbCwhMD09PVUuYXV0b1VwZGF0ZSYmVS51cGRhdGVNYXRyaXhXb3JsZCgpLG51bGw9PT1kYS5wYXJlbnQmJmRhLnVwZGF0ZU1hdHJpeFdvcmxkKCksZGQuZW5hYmxlZCYmKGRhPWRkLmdldENhbWVyYShkYSkpLGNiPXllLmdldChVLGRhKSxjYi5pbml0KCksVS5vbkJlZm9yZVJlbmRlcihqYSxVLGRhLE9hfHxpYiksd2YubXVsdGlwbHlNYXRyaWNlcyhkYS5wcm9qZWN0aW9uTWF0cml4LGRhLm1hdHJpeFdvcmxkSW52ZXJzZSksUWguc2V0RnJvbU1hdHJpeCh3ZiksUmg9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCx4Zz15Yy5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsUmgsZGEpLE5hPXdnLmdldChVLGRhKSxOYS5pbml0KCksUihVLGRhLDAsamEuc29ydE9iamVjdHMpLCEwPT09amEuc29ydE9iamVjdHMmJk5hLnNvcnQoKSx4ZyYmeWMuYmVnaW5TaGFkb3dzKCksRWoucmVuZGVyKGNiLnN0YXRlLnNoYWRvd3NBcnJheSwKVSxkYSksY2Iuc2V0dXBMaWdodHMoZGEpLHhnJiZ5Yy5lbmRTaGFkb3dzKCksdGhpcy5pbmZvLmF1dG9SZXNldCYmdGhpcy5pbmZvLnJlc2V0KCksdm9pZCAwIT09T2EmJnRoaXMuc2V0UmVuZGVyVGFyZ2V0KE9hKSx5ZC5yZW5kZXIoTmEsVSxkYSxhYiksbWE9TmEub3BhcXVlLElhPU5hLnRyYW5zcGFyZW50LFUub3ZlcnJpZGVNYXRlcmlhbD8oT2E9VS5vdmVycmlkZU1hdGVyaWFsLG1hLmxlbmd0aCYmUyhtYSxVLGRhLE9hKSxJYS5sZW5ndGgmJlMoSWEsVSxkYSxPYSkpOihtYS5sZW5ndGgmJlMobWEsVSxkYSksSWEubGVuZ3RoJiZTKElhLFUsZGEpKSxudWxsIT09aWImJihPYy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoaWIpLE9jLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KGliKSkseWIuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSx5Yi5idWZmZXJzLmRlcHRoLnNldE1hc2soITApLHliLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayghMCkseWIuc2V0UG9seWdvbk9mZnNldCghMSksCmRkLmVuYWJsZWQmJmRkLnN1Ym1pdEZyYW1lKCksY2I9TmE9bnVsbCk6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLiIpfTt0aGlzLnNldEZyYW1lYnVmZmVyPWZ1bmN0aW9uKFUpe0xhIT09VSYmUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLFUpO0xhPVV9O3RoaXMuZ2V0QWN0aXZlQ3ViZUZhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gbmJ9O3RoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gVmF9O3RoaXMuZ2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGlifTt0aGlzLnNldFJlbmRlclRhcmdldD1mdW5jdGlvbihVLGRhLG1hKXtpYj1VO25iPWRhO1ZhPW1hO1UmJnZvaWQgMD09PWVjLmdldChVKS5fX3dlYmdsRnJhbWVidWZmZXImJk9jLnNldHVwUmVuZGVyVGFyZ2V0KFUpO3ZhciBJYT1MYSxPYT0hMTtVPyhJYT1lYy5nZXQoVSkuX193ZWJnbEZyYW1lYnVmZmVyLApVLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPyhJYT1JYVtkYXx8MF0sT2E9ITApOklhPVUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0P2VjLmdldChVKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI6SWEsS2IuY29weShVLnZpZXdwb3J0KSxTYi5jb3B5KFUuc2Npc3NvciksbmM9VS5zY2lzc29yVGVzdCk6KEtiLmNvcHkod2UpLm11bHRpcGx5U2NhbGFyKGNjKS5mbG9vcigpLFNiLmNvcHkodmUpLm11bHRpcGx5U2NhbGFyKGNjKS5mbG9vcigpLG5jPVNoKTtrYiE9PUlhJiYoUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLElhKSxrYj1JYSk7eWIudmlld3BvcnQoS2IpO3liLnNjaXNzb3IoU2IpO3liLnNldFNjaXNzb3JUZXN0KG5jKTtPYSYmKFU9ZWMuZ2V0KFUudGV4dHVyZSksUmEuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwNjQsMzQwNjkrKGRhfHwwKSxVLl9fd2ViZ2xUZXh0dXJlLG1hfHwwKSl9O3RoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscz1mdW5jdGlvbihVLApkYSxtYSxJYSxPYSxhYixQYSl7aWYoVSYmVS5pc1dlYkdMUmVuZGVyVGFyZ2V0KXt2YXIgZmI9ZWMuZ2V0KFUpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtVLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlJiZ2b2lkIDAhPT1QYSYmKGZiPWZiW1BhXSk7aWYoZmIpe1BhPSExO2ZiIT09a2ImJihSYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsZmIpLFBhPSEwKTt0cnl7dmFyIENiPVUudGV4dHVyZSxvYj1DYi5mb3JtYXQsJGE9Q2IudHlwZTsxMDIzIT09b2ImJk5jLmNvbnZlcnQob2IpIT09UmEuZ2V0UGFyYW1ldGVyKDM1NzM5KT9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKToxMDA5PT09JGF8fE5jLmNvbnZlcnQoJGEpPT09UmEuZ2V0UGFyYW1ldGVyKDM1NzM4KXx8MTAxNT09PSRhJiYoZGMuaXNXZWJHTDJ8fExiLmdldCgiT0VTX3RleHR1cmVfZmxvYXQiKXx8CkxiLmdldCgiV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IikpfHwxMDE2PT09JGEmJihkYy5pc1dlYkdMMj9MYi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTpMYi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpKT8zNjA1Mz09PVJhLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoMzYxNjApPzA8PWRhJiZkYTw9VS53aWR0aC1JYSYmMDw9bWEmJm1hPD1VLmhlaWdodC1PYSYmUmEucmVhZFBpeGVscyhkYSxtYSxJYSxPYSxOYy5jb252ZXJ0KG9iKSxOYy5jb252ZXJ0KCRhKSxhYik6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKX1maW5hbGx5e1BhJiYKUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLGtiKX19fWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LiIpfTt0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbihVLGRhLG1hKXt2YXIgSWE9ZGEuaW1hZ2Uud2lkdGgsT2E9ZGEuaW1hZ2UuaGVpZ2h0LGFiPU5jLmNvbnZlcnQoZGEuZm9ybWF0KTtPYy5zZXRUZXh0dXJlMkQoZGEsMCk7UmEuY29weVRleEltYWdlMkQoMzU1MyxtYXx8MCxhYixVLngsVS55LElhLE9hLDApfTt0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlPWZ1bmN0aW9uKFUsZGEsbWEsSWEpe3ZhciBPYT1kYS5pbWFnZS53aWR0aCxhYj1kYS5pbWFnZS5oZWlnaHQsUGE9TmMuY29udmVydChtYS5mb3JtYXQpLGZiPU5jLmNvbnZlcnQobWEudHlwZSk7T2Muc2V0VGV4dHVyZTJEKG1hLDApO2RhLmlzRGF0YVRleHR1cmU/ClJhLnRleFN1YkltYWdlMkQoMzU1MyxJYXx8MCxVLngsVS55LE9hLGFiLFBhLGZiLGRhLmltYWdlLmRhdGEpOlJhLnRleFN1YkltYWdlMkQoMzU1MyxJYXx8MCxVLngsVS55LFBhLGZiLGRhLmltYWdlKX07InVuZGVmaW5lZCIhPT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1mdW5jdGlvbiB6ZyhhLGMpe3RoaXMubmFtZT0iIjt0aGlzLmNvbG9yPW5ldyBJKGEpO3RoaXMuZGVuc2l0eT12b2lkIDAhPT1jP2M6Mi41RS00fWZ1bmN0aW9uIEFnKGEsYyxlKXt0aGlzLm5hbWU9IiI7dGhpcy5jb2xvcj1uZXcgSShhKTt0aGlzLm5lYXI9dm9pZCAwIT09Yz9jOjE7dGhpcy5mYXI9dm9pZCAwIT09ZT9lOjFFM31mdW5jdGlvbiBRZChhLGMpe3RoaXMuYXJyYXk9YTt0aGlzLnN0cmlkZT1jO3RoaXMuY291bnQ9dm9pZCAwIT09YT9hLmxlbmd0aC9jOjA7dGhpcy5keW5hbWljPQohMTt0aGlzLnVwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX07dGhpcy52ZXJzaW9uPTB9ZnVuY3Rpb24geGYoYSxjLGUsZyl7dGhpcy5kYXRhPWE7dGhpcy5pdGVtU2l6ZT1jO3RoaXMub2Zmc2V0PWU7dGhpcy5ub3JtYWxpemVkPSEwPT09Z31mdW5jdGlvbiBBZChhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcHJpdGVNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5tYXA9bnVsbDt0aGlzLnJvdGF0aW9uPTA7dGhpcy5zaXplQXR0ZW51YXRpb249ITA7dGhpcy5saWdodHM9ITE7dGhpcy50cmFuc3BhcmVudD0hMDt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiB5ZihhKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcHJpdGUiO2lmKHZvaWQgMD09PUFlKXtBZT1uZXcgdmE7dmFyIGM9bmV3IFFkKG5ldyBGbG9hdDMyQXJyYXkoWy0uNSwtLjUsMCwwLDAsLjUsLS41LDAsMSwwLC41LC41LDAsMSwxLC0uNSwuNSwwLDAsMV0pLDUpO0FlLnNldEluZGV4KFswLAoxLDIsMCwyLDNdKTtBZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgeGYoYywzLDAsITEpKTtBZS5hZGRBdHRyaWJ1dGUoInV2IixuZXcgeGYoYywyLDMsITEpKX10aGlzLmdlb21ldHJ5PUFlO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09YT9hOm5ldyBBZDt0aGlzLmNlbnRlcj1uZXcgZiguNSwuNSl9ZnVuY3Rpb24gQmcoYSxjLGUsZyxyLHYpe0JlLnN1YlZlY3RvcnMoYSxlKS5hZGRTY2FsYXIoLjUpLm11bHRpcGx5KGcpO3ZvaWQgMCE9PXI/KHpmLng9dipCZS54LXIqQmUueSx6Zi55PXIqQmUueCt2KkJlLnkpOnpmLmNvcHkoQmUpO2EuY29weShjKTthLngrPXpmLng7YS55Kz16Zi55O2EuYXBwbHlNYXRyaXg0KEZqKX1mdW5jdGlvbiBBZigpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxPRCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7bGV2ZWxzOntlbnVtZXJhYmxlOiEwLHZhbHVlOltdfX0pO3RoaXMuYXV0b1VwZGF0ZT0hMH1mdW5jdGlvbiBCZihhLGMpe2EmJmEuaXNHZW9tZXRyeSYmCmNvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIik7eGEuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJTa2lubmVkTWVzaCI7dGhpcy5iaW5kTW9kZT0iYXR0YWNoZWQiO3RoaXMuYmluZE1hdHJpeD1uZXcgcTt0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyBxfWZ1bmN0aW9uIENnKGEsYyl7YT1hfHxbXTt0aGlzLmJvbmVzPWEuc2xpY2UoMCk7dGhpcy5ib25lTWF0cmljZXM9bmV3IEZsb2F0MzJBcnJheSgxNip0aGlzLmJvbmVzLmxlbmd0aCk7aWYodm9pZCAwPT09Yyl0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7ZWxzZSBpZih0aGlzLmJvbmVzLmxlbmd0aD09PWMubGVuZ3RoKXRoaXMuYm9uZUludmVyc2VzPWMuc2xpY2UoMCk7ZWxzZSBmb3IoY29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4iKSwKdGhpcy5ib25lSW52ZXJzZXM9W10sYT0wLGM9dGhpcy5ib25lcy5sZW5ndGg7YTxjO2ErKyl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBxKX1mdW5jdGlvbiBVaCgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJvbmUifWZ1bmN0aW9uIEZiKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmxpbmV3aWR0aD0xO3RoaXMubGluZWpvaW49dGhpcy5saW5lY2FwPSJyb3VuZCI7dGhpcy5saWdodHM9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gVmIoYSxjLGUpezE9PT1lJiZjb25zb2xlLmVycm9yKCJUSFJFRS5MaW5lOiBwYXJhbWV0ZXIgVEhSRUUuTGluZVBpZWNlcyBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2UgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuIik7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGluZSI7dGhpcy5nZW9tZXRyeT12b2lkIDAhPT1hP2E6bmV3IHZhO3RoaXMubWF0ZXJpYWw9CnZvaWQgMCE9PWM/YzpuZXcgRmIoe2NvbG9yOjE2Nzc3MjE1Kk1hdGgucmFuZG9tKCl9KX1mdW5jdGlvbiBJYihhLGMpe1ZiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iTGluZVNlZ21lbnRzIn1mdW5jdGlvbiBEZyhhLGMpe1ZiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iTGluZUxvb3AifWZ1bmN0aW9uIEFjKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvaW50c01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLm1hcD1udWxsO3RoaXMuc2l6ZT0xO3RoaXMuc2l6ZUF0dGVudWF0aW9uPSEwO3RoaXMubGlnaHRzPXRoaXMubW9ycGhUYXJnZXRzPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIENlKGEsYyl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUG9pbnRzIjt0aGlzLmdlb21ldHJ5PXZvaWQgMCE9PWE/YTpuZXcgdmE7dGhpcy5tYXRlcmlhbD12b2lkIDAhPT1jP2M6bmV3IEFjKHtjb2xvcjoxNjc3NzIxNSpNYXRoLnJhbmRvbSgpfSk7dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX0KZnVuY3Rpb24gVmgoYSxjLGUsZyxyLHYseil7dmFyIEU9V2guZGlzdGFuY2VTcVRvUG9pbnQoYSk7RTxlJiYoZT1uZXcgayxXaC5jbG9zZXN0UG9pbnRUb1BvaW50KGEsZSksZS5hcHBseU1hdHJpeDQoZyksYT1yLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhlKSxhPHIubmVhcnx8YT5yLmZhcnx8di5wdXNoKHtkaXN0YW5jZTphLGRpc3RhbmNlVG9SYXk6TWF0aC5zcXJ0KEUpLHBvaW50OmUsaW5kZXg6YyxmYWNlOm51bGwsb2JqZWN0Onp9KSl9ZnVuY3Rpb24gWGgoYSxjLGUsZyxyLHYseixFLEYpe2wuY2FsbCh0aGlzLGEsYyxlLGcscix2LHosRSxGKTt0aGlzLmZvcm1hdD12b2lkIDAhPT16P3o6MTAyMjt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT12P3Y6MTAwNjt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT1yP3I6MTAwNjt0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiBEZShhLGMsZSxnLHIsdix6LEUsRixKLFAsUil7bC5jYWxsKHRoaXMsbnVsbCx2LHosRSxGLEosZyxyLFAsClIpO3RoaXMuaW1hZ2U9e3dpZHRoOmMsaGVpZ2h0OmV9O3RoaXMubWlwbWFwcz1hO3RoaXMuZ2VuZXJhdGVNaXBtYXBzPXRoaXMuZmxpcFk9ITF9ZnVuY3Rpb24gQ2YoYSxjLGUsZyxyLHYseixFLEYpe2wuY2FsbCh0aGlzLGEsYyxlLGcscix2LHosRSxGKTt0aGlzLm5lZWRzVXBkYXRlPSEwfWZ1bmN0aW9uIERmKGEsYyxlLGcscix2LHosRSxGLEope0o9dm9pZCAwIT09Sj9KOjEwMjY7aWYoMTAyNiE9PUomJjEwMjchPT1KKXRocm93IEVycm9yKCJEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCIpO3ZvaWQgMD09PWUmJjEwMjY9PT1KJiYoZT0xMDEyKTt2b2lkIDA9PT1lJiYxMDI3PT09SiYmKGU9MTAyMCk7bC5jYWxsKHRoaXMsbnVsbCxnLHIsdix6LEUsSixlLEYpO3RoaXMuaW1hZ2U9e3dpZHRoOmEsaGVpZ2h0OmN9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PXo/ejoxMDAzO3RoaXMubWluRmlsdGVyPQp2b2lkIDAhPT1FP0U6MTAwMzt0aGlzLmdlbmVyYXRlTWlwbWFwcz10aGlzLmZsaXBZPSExfWZ1bmN0aW9uIEVlKGEpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJXaXJlZnJhbWVHZW9tZXRyeSI7dmFyIGM9W10sZSxnLHIsdj1bMCwwXSx6PXt9LEU9WyJhIiwiYiIsImMiXTtpZihhJiZhLmlzR2VvbWV0cnkpe3ZhciBGPWEuZmFjZXM7dmFyIEo9MDtmb3IoZz1GLmxlbmd0aDtKPGc7SisrKXt2YXIgUD1GW0pdO2ZvcihlPTA7Mz5lO2UrKyl7dmFyIFI9UFtFW2VdXTt2YXIgUz1QW0VbKGUrMSklM11dO3ZbMF09TWF0aC5taW4oUixTKTt2WzFdPU1hdGgubWF4KFIsUyk7Uj12WzBdKyIsIit2WzFdO3ZvaWQgMD09PXpbUl0mJih6W1JdPXtpbmRleDE6dlswXSxpbmRleDI6dlsxXX0pfX1mb3IoUiBpbiB6KUo9eltSXSxFPWEudmVydGljZXNbSi5pbmRleDFdLGMucHVzaChFLngsRS55LEUueiksRT1hLnZlcnRpY2VzW0ouaW5kZXgyXSxjLnB1c2goRS54LEUueSxFLnopfWVsc2UgaWYoYSYmCmEuaXNCdWZmZXJHZW9tZXRyeSlpZihFPW5ldyBrLG51bGwhPT1hLmluZGV4KXtGPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtQPWEuaW5kZXg7dmFyIFY9YS5ncm91cHM7MD09PVYubGVuZ3RoJiYoVj1be3N0YXJ0OjAsY291bnQ6UC5jb3VudCxtYXRlcmlhbEluZGV4OjB9XSk7YT0wO2ZvcihyPVYubGVuZ3RoO2E8cjsrK2EpZm9yKEo9VlthXSxlPUouc3RhcnQsZz1KLmNvdW50LEo9ZSxnPWUrZztKPGc7Sis9Mylmb3IoZT0wOzM+ZTtlKyspUj1QLmdldFgoSitlKSxTPVAuZ2V0WChKKyhlKzEpJTMpLHZbMF09TWF0aC5taW4oUixTKSx2WzFdPU1hdGgubWF4KFIsUyksUj12WzBdKyIsIit2WzFdLHZvaWQgMD09PXpbUl0mJih6W1JdPXtpbmRleDE6dlswXSxpbmRleDI6dlsxXX0pO2ZvcihSIGluIHopSj16W1JdLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShGLEouaW5kZXgxKSxjLnB1c2goRS54LEUueSxFLnopLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShGLEouaW5kZXgyKSxjLnB1c2goRS54LApFLnksRS56KX1lbHNlIGZvcihGPWEuYXR0cmlidXRlcy5wb3NpdGlvbixKPTAsZz1GLmNvdW50LzM7SjxnO0orKylmb3IoZT0wOzM+ZTtlKyspej0zKkorZSxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRix6KSxjLnB1c2goRS54LEUueSxFLnopLHo9MypKKyhlKzEpJTMsRS5mcm9tQnVmZmVyQXR0cmlidXRlKEYseiksYy5wdXNoKEUueCxFLnksRS56KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShjLDMpKX1mdW5jdGlvbiBFZihhLGMsZSl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBhcmFtZXRyaWNHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtmdW5jOmEsc2xpY2VzOmMsc3RhY2tzOmV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBGZShhLGMsZSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEZlKGEsYyxlKXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2Z1bmM6YSwKc2xpY2VzOmMsc3RhY2tzOmV9O3ZhciBnPVtdLHI9W10sdj1bXSx6PVtdLEU9bmV3IGssRj1uZXcgayxKPW5ldyBrLFA9bmV3IGssUj1uZXcgayxTLFY7Mz5hLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuUGFyYW1ldHJpY0dlb21ldHJ5OiBGdW5jdGlvbiBtdXN0IG5vdyBtb2RpZnkgYSBWZWN0b3IzIGFzIHRoaXJkIHBhcmFtZXRlci4iKTt2YXIgVz1jKzE7Zm9yKFM9MDtTPD1lO1MrKyl7dmFyIGhhPVMvZTtmb3IoVj0wO1Y8PWM7VisrKXt2YXIgZmE9Vi9jO2EoZmEsaGEsRik7ci5wdXNoKEYueCxGLnksRi56KTswPD1mYS0xRS01PyhhKGZhLTFFLTUsaGEsSiksUC5zdWJWZWN0b3JzKEYsSikpOihhKGZhKzFFLTUsaGEsSiksUC5zdWJWZWN0b3JzKEosRikpOzA8PWhhLTFFLTU/KGEoZmEsaGEtMUUtNSxKKSxSLnN1YlZlY3RvcnMoRixKKSk6KGEoZmEsaGErMUUtNSxKKSxSLnN1YlZlY3RvcnMoSixGKSk7RS5jcm9zc1ZlY3RvcnMoUCxSKS5ub3JtYWxpemUoKTt2LnB1c2goRS54LApFLnksRS56KTt6LnB1c2goZmEsaGEpfX1mb3IoUz0wO1M8ZTtTKyspZm9yKFY9MDtWPGM7VisrKWE9UypXK1YrMSxFPShTKzEpKlcrVisxLEY9KFMrMSkqVytWLGcucHVzaChTKlcrVixhLEYpLGcucHVzaChhLEUsRik7dGhpcy5zZXRJbmRleChnKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShyLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoeiwyKSl9ZnVuY3Rpb24gRmYoYSxjLGUsZyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczphLGluZGljZXM6YyxyYWRpdXM6ZSxkZXRhaWw6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IGpjKGEsYyxlLGcpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBqYyhhLGMsZSxnKXtmdW5jdGlvbiByKFcsaGEsZmEscmEpe3JhPU1hdGgucG93KDIsCnJhKTt2YXIgcGE9W10scWEsdWE7Zm9yKHFhPTA7cWE8PXJhO3FhKyspe3BhW3FhXT1bXTt2YXIgb2E9Vy5jbG9uZSgpLmxlcnAoZmEscWEvcmEpLHRhPWhhLmNsb25lKCkubGVycChmYSxxYS9yYSksQmE9cmEtcWE7Zm9yKHVhPTA7dWE8PUJhO3VhKyspcGFbcWFdW3VhXT0wPT09dWEmJnFhPT09cmE/b2E6b2EuY2xvbmUoKS5sZXJwKHRhLHVhL0JhKX1mb3IocWE9MDtxYTxyYTtxYSsrKWZvcih1YT0wO3VhPDIqKHJhLXFhKS0xO3VhKyspVz1NYXRoLmZsb29yKHVhLzIpLDA9PT11YSUyPyh6KHBhW3FhXVtXKzFdKSx6KHBhW3FhKzFdW1ddKSx6KHBhW3FhXVtXXSkpOih6KHBhW3FhXVtXKzFdKSx6KHBhW3FhKzFdW1crMV0pLHoocGFbcWErMV1bV10pKX1mdW5jdGlvbiB2KCl7Zm9yKHZhciBXPTA7VzxWLmxlbmd0aDtXKz02KXt2YXIgaGE9VltXKzBdLGZhPVZbVysyXSxyYT1WW1crNF0scGE9TWF0aC5taW4oaGEsZmEscmEpOy45PE1hdGgubWF4KGhhLGZhLHJhKSYmLjE+cGEmJiguMj4KaGEmJihWW1crMF0rPTEpLC4yPmZhJiYoVltXKzJdKz0xKSwuMj5yYSYmKFZbVys0XSs9MSkpfX1mdW5jdGlvbiB6KFcpe1MucHVzaChXLngsVy55LFcueil9ZnVuY3Rpb24gRShXLGhhKXtXKj0zO2hhLng9YVtXKzBdO2hhLnk9YVtXKzFdO2hhLno9YVtXKzJdfWZ1bmN0aW9uIEYoKXtmb3IodmFyIFc9bmV3IGssaGE9bmV3IGssZmE9bmV3IGsscmE9bmV3IGsscGE9bmV3IGYscWE9bmV3IGYsdWE9bmV3IGYsb2E9MCx0YT0wO29hPFMubGVuZ3RoO29hKz05LHRhKz02KXtXLnNldChTW29hKzBdLFNbb2ErMV0sU1tvYSsyXSk7aGEuc2V0KFNbb2ErM10sU1tvYSs0XSxTW29hKzVdKTtmYS5zZXQoU1tvYSs2XSxTW29hKzddLFNbb2ErOF0pO3BhLnNldChWW3RhKzBdLFZbdGErMV0pO3FhLnNldChWW3RhKzJdLFZbdGErM10pO3VhLnNldChWW3RhKzRdLFZbdGErNV0pO3JhLmNvcHkoVykuYWRkKGhhKS5hZGQoZmEpLmRpdmlkZVNjYWxhcigzKTt2YXIgQmE9UChyYSk7SihwYSx0YSswLFcsCkJhKTtKKHFhLHRhKzIsaGEsQmEpO0oodWEsdGErNCxmYSxCYSl9fWZ1bmN0aW9uIEooVyxoYSxmYSxyYSl7MD5yYSYmMT09PVcueCYmKFZbaGFdPVcueC0xKTswPT09ZmEueCYmMD09PWZhLnomJihWW2hhXT1yYS8yL01hdGguUEkrLjUpfWZ1bmN0aW9uIFAoVyl7cmV0dXJuIE1hdGguYXRhbjIoVy56LC1XLngpfWZ1bmN0aW9uIFIoVyl7cmV0dXJuIE1hdGguYXRhbjIoLVcueSxNYXRoLnNxcnQoVy54KlcueCtXLnoqVy56KSl9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczphLGluZGljZXM6YyxyYWRpdXM6ZSxkZXRhaWw6Z307ZT1lfHwxO2c9Z3x8MDt2YXIgUz1bXSxWPVtdOyhmdW5jdGlvbihXKXtmb3IodmFyIGhhPW5ldyBrLGZhPW5ldyBrLHJhPW5ldyBrLHBhPTA7cGE8Yy5sZW5ndGg7cGErPTMpRShjW3BhKzBdLGhhKSxFKGNbcGErMV0sZmEpLEUoY1twYSsyXSxyYSkscihoYSxmYSxyYSwKVyl9KShnKTsoZnVuY3Rpb24oVyl7Zm9yKHZhciBoYT1uZXcgayxmYT0wO2ZhPFMubGVuZ3RoO2ZhKz0zKWhhLng9U1tmYSswXSxoYS55PVNbZmErMV0saGEuej1TW2ZhKzJdLGhhLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKFcpLFNbZmErMF09aGEueCxTW2ZhKzFdPWhhLnksU1tmYSsyXT1oYS56fSkoZSk7KGZ1bmN0aW9uKCl7Zm9yKHZhciBXPW5ldyBrLGhhPTA7aGE8Uy5sZW5ndGg7aGErPTMpe1cueD1TW2hhKzBdO1cueT1TW2hhKzFdO1cuej1TW2hhKzJdO3ZhciBmYT1QKFcpLzIvTWF0aC5QSSsuNSxyYT1SKFcpL01hdGguUEkrLjU7Vi5wdXNoKGZhLDEtcmEpfUYoKTt2KCl9KSgpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKFMsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShTLnNsaWNlKCksMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKFYsMikpOzA9PT1nP3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTp0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKX0KZnVuY3Rpb24gR2YoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEdlKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEdlKGEsYyl7amMuY2FsbCh0aGlzLFsxLDEsMSwtMSwtMSwxLC0xLDEsLTEsMSwtMSwtMV0sWzIsMSwwLDAsMywyLDEsMywwLDIsMywxXSxhLGMpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y319ZnVuY3Rpb24gSGYoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgUmQoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUmQoYSxjKXtqYy5jYWxsKHRoaXMsClsxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMV0sWzAsMiw0LDAsNCwzLDAsMyw1LDAsNSwyLDEsMiw1LDEsNSwzLDEsMyw0LDEsNCwyXSxhLGMpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBJZihhLGMpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgSGUoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gSGUoYSxjKXt2YXIgZT0oMStNYXRoLnNxcnQoNSkpLzI7amMuY2FsbCh0aGlzLFstMSxlLDAsMSxlLDAsLTEsLWUsMCwxLC1lLDAsMCwtMSxlLDAsMSxlLDAsLTEsLWUsMCwxLC1lLGUsMCwtMSxlLDAsMSwtZSwwLC0xLC1lLDAsMV0sWzAsMTEsNSwwLDUsMSwwLDEsNywwLDcsMTAsMCwxMCwxMSwKMSw1LDksNSwxMSw0LDExLDEwLDIsMTAsNyw2LDcsMSw4LDMsOSw0LDMsNCwyLDMsMiw2LDMsNiw4LDMsOCw5LDQsOSw1LDIsNCwxMSw2LDIsMTAsOCw2LDcsOSw4LDFdLGEsYyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBKZihhLGMpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJEb2RlY2FoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEllKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEllKGEsYyl7dmFyIGU9KDErTWF0aC5zcXJ0KDUpKS8yLGc9MS9lO2pjLmNhbGwodGhpcyxbLTEsLTEsLTEsLTEsLTEsMSwtMSwxLC0xLC0xLDEsMSwxLC0xLC0xLDEsLTEsMSwxLDEsLTEsMSwxLDEsMCwtZywtZSwwLC1nLGUsMCxnLC1lLDAsZyxlLC1nLC1lLDAsLWcsZSwwLGcsCi1lLDAsZyxlLDAsLWUsMCwtZyxlLDAsLWcsLWUsMCxnLGUsMCxnXSxbMywxMSw3LDMsNywxNSwzLDE1LDEzLDcsMTksMTcsNywxNyw2LDcsNiwxNSwxNyw0LDgsMTcsOCwxMCwxNywxMCw2LDgsMCwxNiw4LDE2LDIsOCwyLDEwLDAsMTIsMSwwLDEsMTgsMCwxOCwxNiw2LDEwLDIsNiwyLDEzLDYsMTMsMTUsMiwxNiwxOCwyLDE4LDMsMiwzLDEzLDE4LDEsOSwxOCw5LDExLDE4LDExLDMsNCwxNCwxMiw0LDEyLDAsNCwwLDgsMTEsOSw1LDExLDUsMTksMTEsMTksNywxOSw1LDE0LDE5LDE0LDQsMTksNCwxNywxLDEyLDE0LDEsMTQsNSwxLDUsOV0sYSxjKTt0aGlzLnR5cGU9IkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBLZihhLGMsZSxnLHIsdil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlR1YmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwYXRoOmEsdHVidWxhclNlZ21lbnRzOmMscmFkaXVzOmUsCnJhZGlhbFNlZ21lbnRzOmcsY2xvc2VkOnJ9O3ZvaWQgMCE9PXYmJmNvbnNvbGUud2FybigiVEhSRUUuVHViZUdlb21ldHJ5OiB0YXBlciBoYXMgYmVlbiByZW1vdmVkLiIpO2E9bmV3IFNkKGEsYyxlLGcscik7dGhpcy50YW5nZW50cz1hLnRhbmdlbnRzO3RoaXMubm9ybWFscz1hLm5vcm1hbHM7dGhpcy5iaW5vcm1hbHM9YS5iaW5vcm1hbHM7dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoYSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gU2QoYSxjLGUsZyxyKXtmdW5jdGlvbiB2KHFhKXtTPWEuZ2V0UG9pbnRBdChxYS9jLFMpO3ZhciB1YT1GLm5vcm1hbHNbcWFdO3FhPUYuYmlub3JtYWxzW3FhXTtmb3IoVz0wO1c8PWc7VysrKXt2YXIgb2E9Vy9nKk1hdGguUEkqMix0YT1NYXRoLnNpbihvYSk7b2E9LU1hdGguY29zKG9hKTtQLng9b2EqdWEueCt0YSpxYS54O1AueT1vYSp1YS55K3RhKnFhLnk7UC56PW9hKnVhLnordGEqcWEuejtQLm5vcm1hbGl6ZSgpO2ZhLnB1c2goUC54LApQLnksUC56KTtKLng9Uy54K2UqUC54O0oueT1TLnkrZSpQLnk7Si56PVMueitlKlAuejtoYS5wdXNoKEoueCxKLnksSi56KX19ZnVuY3Rpb24geigpe2ZvcihXPTE7Vzw9YztXKyspZm9yKFY9MTtWPD1nO1YrKyl7dmFyIHFhPShnKzEpKlcrKFYtMSksdWE9KGcrMSkqVytWLG9hPShnKzEpKihXLTEpK1Y7cGEucHVzaCgoZysxKSooVy0xKSsoVi0xKSxxYSxvYSk7cGEucHVzaChxYSx1YSxvYSl9fWZ1bmN0aW9uIEUoKXtmb3IoVj0wO1Y8PWM7VisrKWZvcihXPTA7Vzw9ZztXKyspUi54PVYvYyxSLnk9Vy9nLHJhLnB1c2goUi54LFIueSl9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlR1YmVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwYXRoOmEsdHVidWxhclNlZ21lbnRzOmMscmFkaXVzOmUscmFkaWFsU2VnbWVudHM6ZyxjbG9zZWQ6cn07Yz1jfHw2NDtlPWV8fDE7Zz1nfHw4O3I9cnx8ITE7dmFyIEY9YS5jb21wdXRlRnJlbmV0RnJhbWVzKGMscik7dGhpcy50YW5nZW50cz0KRi50YW5nZW50czt0aGlzLm5vcm1hbHM9Ri5ub3JtYWxzO3RoaXMuYmlub3JtYWxzPUYuYmlub3JtYWxzO3ZhciBKPW5ldyBrLFA9bmV3IGssUj1uZXcgZixTPW5ldyBrLFYsVyxoYT1bXSxmYT1bXSxyYT1bXSxwYT1bXTsoZnVuY3Rpb24oKXtmb3IoVj0wO1Y8YztWKyspdihWKTt2KCExPT09cj9jOjApO0UoKTt6KCl9KSgpO3RoaXMuc2V0SW5kZXgocGEpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGhhLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoZmEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHJhLDIpKX1mdW5jdGlvbiBMZihhLGMsZSxnLHIsdix6KXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVG9ydXNLbm90R2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsdHViZTpjLHR1YnVsYXJTZWdtZW50czplLHJhZGlhbFNlZ21lbnRzOmcscDpyLHE6dn07dm9pZCAwIT09eiYmY29uc29sZS53YXJuKCJUSFJFRS5Ub3J1c0tub3RHZW9tZXRyeTogaGVpZ2h0U2NhbGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zY2FsZSggeCwgeSwgeiApIGluc3RlYWQuIik7CnRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBKZShhLGMsZSxnLHIsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEplKGEsYyxlLGcscix2KXtmdW5jdGlvbiB6KHRhLEJhLFRhLFVhLENhKXt2YXIgSGE9TWF0aC5zaW4odGEpO0JhPVRhL0JhKnRhO1RhPU1hdGguY29zKEJhKTtDYS54PVVhKigyK1RhKSouNSpNYXRoLmNvcyh0YSk7Q2EueT1VYSooMitUYSkqSGEqLjU7Q2Euej1VYSpNYXRoLnNpbihCYSkqLjV9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHR1YmU6Yyx0dWJ1bGFyU2VnbWVudHM6ZSxyYWRpYWxTZWdtZW50czpnLHA6cixxOnZ9O2E9YXx8MTtjPWN8fC40O2U9TWF0aC5mbG9vcihlKXx8NjQ7Zz1NYXRoLmZsb29yKGcpfHw4O3I9cnx8Mjt2PXZ8fDM7dmFyIEU9W10sRj1bXSxKPVtdLFA9W10sUixTPW5ldyBrLFY9bmV3IGssVz1uZXcgayxoYT1uZXcgayxmYT1uZXcgaywKcmE9bmV3IGsscGE9bmV3IGs7Zm9yKFI9MDtSPD1lOysrUil7dmFyIHFhPVIvZSpyKk1hdGguUEkqMjt6KHFhLHIsdixhLFcpO3oocWErLjAxLHIsdixhLGhhKTtyYS5zdWJWZWN0b3JzKGhhLFcpO3BhLmFkZFZlY3RvcnMoaGEsVyk7ZmEuY3Jvc3NWZWN0b3JzKHJhLHBhKTtwYS5jcm9zc1ZlY3RvcnMoZmEscmEpO2ZhLm5vcm1hbGl6ZSgpO3BhLm5vcm1hbGl6ZSgpO2ZvcihxYT0wO3FhPD1nOysrcWEpe3ZhciB1YT1xYS9nKk1hdGguUEkqMixvYT0tYypNYXRoLmNvcyh1YSk7dWE9YypNYXRoLnNpbih1YSk7Uy54PVcueCsob2EqcGEueCt1YSpmYS54KTtTLnk9Vy55KyhvYSpwYS55K3VhKmZhLnkpO1Muej1XLnorKG9hKnBhLnordWEqZmEueik7Ri5wdXNoKFMueCxTLnksUy56KTtWLnN1YlZlY3RvcnMoUyxXKS5ub3JtYWxpemUoKTtKLnB1c2goVi54LFYueSxWLnopO1AucHVzaChSL2UpO1AucHVzaChxYS9nKX19Zm9yKHFhPTE7cWE8PWU7cWErKylmb3IoUj0xO1I8PWc7UisrKWE9CihnKzEpKnFhKyhSLTEpLGM9KGcrMSkqcWErUixyPShnKzEpKihxYS0xKStSLEUucHVzaCgoZysxKSoocWEtMSkrKFItMSksYSxyKSxFLnB1c2goYSxjLHIpO3RoaXMuc2V0SW5kZXgoRSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoRiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKEosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKFAsMikpfWZ1bmN0aW9uIE1mKGEsYyxlLGcscil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsdHViZTpjLHJhZGlhbFNlZ21lbnRzOmUsdHVidWxhclNlZ21lbnRzOmcsYXJjOnJ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBLZShhLGMsZSxnLHIpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBLZShhLGMsZSxnLHIpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9CntyYWRpdXM6YSx0dWJlOmMscmFkaWFsU2VnbWVudHM6ZSx0dWJ1bGFyU2VnbWVudHM6ZyxhcmM6cn07YT1hfHwxO2M9Y3x8LjQ7ZT1NYXRoLmZsb29yKGUpfHw4O2c9TWF0aC5mbG9vcihnKXx8NjtyPXJ8fDIqTWF0aC5QSTt2YXIgdj1bXSx6PVtdLEU9W10sRj1bXSxKPW5ldyBrLFA9bmV3IGssUj1uZXcgayxTLFY7Zm9yKFM9MDtTPD1lO1MrKylmb3IoVj0wO1Y8PWc7VisrKXt2YXIgVz1WL2cqcixoYT1TL2UqTWF0aC5QSSoyO1AueD0oYStjKk1hdGguY29zKGhhKSkqTWF0aC5jb3MoVyk7UC55PShhK2MqTWF0aC5jb3MoaGEpKSpNYXRoLnNpbihXKTtQLno9YypNYXRoLnNpbihoYSk7ei5wdXNoKFAueCxQLnksUC56KTtKLng9YSpNYXRoLmNvcyhXKTtKLnk9YSpNYXRoLnNpbihXKTtSLnN1YlZlY3RvcnMoUCxKKS5ub3JtYWxpemUoKTtFLnB1c2goUi54LFIueSxSLnopO0YucHVzaChWL2cpO0YucHVzaChTL2UpfWZvcihTPTE7Uzw9ZTtTKyspZm9yKFY9MTtWPD1nO1YrKylhPShnKwoxKSooUy0xKStWLTEsYz0oZysxKSooUy0xKStWLHI9KGcrMSkqUytWLHYucHVzaCgoZysxKSpTK1YtMSxhLHIpLHYucHVzaChhLGMscik7dGhpcy5zZXRJbmRleCh2KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYSh6LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoRSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoRiwyKSl9ZnVuY3Rpb24gR2ooYSxjLGUsZyxyKXtpZihyPT09MDxYbChhLGMsZSxnKSlmb3Iocj1jO3I8ZTtyKz1nKXZhciB2PUhqKHIsYVtyXSxhW3IrMV0sdik7ZWxzZSBmb3Iocj1lLWc7cj49YztyLT1nKXY9SGoocixhW3JdLGFbcisxXSx2KTt2JiZUZCh2LHYubmV4dCkmJihOZih2KSx2PXYubmV4dCk7cmV0dXJuIHZ9ZnVuY3Rpb24gT2YoYSxjKXtpZighYSlyZXR1cm4gYTtjfHwoYz1hKTtkb3t2YXIgZT0hMTtpZihhLnN0ZWluZXJ8fCFUZChhLGEubmV4dCkmJjAhPT1XYihhLnByZXYsYSxhLm5leHQpKWE9YS5uZXh0OwplbHNle05mKGEpO2E9Yz1hLnByZXY7aWYoYT09PWEubmV4dClicmVhaztlPSEwfX13aGlsZShlfHxhIT09Yyk7cmV0dXJuIGN9ZnVuY3Rpb24gUGYoYSxjLGUsZyxyLHYseil7aWYoYSl7IXomJnYmJllsKGEsZyxyLHYpO2Zvcih2YXIgRT1hLEYsSjthLnByZXYhPT1hLm5leHQ7KWlmKEY9YS5wcmV2LEo9YS5uZXh0LHY/WmwoYSxnLHIsdik6JGwoYSkpYy5wdXNoKEYuaS9lKSxjLnB1c2goYS5pL2UpLGMucHVzaChKLmkvZSksTmYoYSksRT1hPUoubmV4dDtlbHNlIGlmKGE9SixhPT09RSl7ej8xPT09ej8oYT1hbShhLGMsZSksUGYoYSxjLGUsZyxyLHYsMikpOjI9PT16JiZibShhLGMsZSxnLHIsdik6UGYoT2YoYSksYyxlLGcscix2LDEpO2JyZWFrfX19ZnVuY3Rpb24gJGwoYSl7dmFyIGM9YS5wcmV2LGU9YS5uZXh0O2lmKDA8PVdiKGMsYSxlKSlyZXR1cm4hMTtmb3IodmFyIGc9YS5uZXh0Lm5leHQ7ZyE9PWEucHJldjspe2lmKExlKGMueCxjLnksYS54LGEueSxlLngsZS55LGcueCwKZy55KSYmMDw9V2IoZy5wcmV2LGcsZy5uZXh0KSlyZXR1cm4hMTtnPWcubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBabChhLGMsZSxnKXt2YXIgcj1hLnByZXYsdj1hLm5leHQ7aWYoMDw9V2IocixhLHYpKXJldHVybiExO3ZhciB6PXIueD5hLng/ci54PnYueD9yLng6di54OmEueD52Lng/YS54OnYueCxFPXIueT5hLnk/ci55PnYueT9yLnk6di55OmEueT52Lnk/YS55OnYueSxGPVloKHIueDxhLng/ci54PHYueD9yLng6di54OmEueDx2Lng/YS54OnYueCxyLnk8YS55P3IueTx2Lnk/ci55OnYueTphLnk8di55P2EueTp2LnksYyxlLGcpO2M9WWgoeixFLGMsZSxnKTtlPWEucHJldlo7Zm9yKGc9YS5uZXh0WjtlJiZlLno+PUYmJmcmJmcuejw9Yzspe2lmKGUhPT1hLnByZXYmJmUhPT1hLm5leHQmJkxlKHIueCxyLnksYS54LGEueSx2Lngsdi55LGUueCxlLnkpJiYwPD1XYihlLnByZXYsZSxlLm5leHQpKXJldHVybiExO2U9ZS5wcmV2WjtpZihnIT09YS5wcmV2JiZnIT09YS5uZXh0JiZMZShyLngsCnIueSxhLngsYS55LHYueCx2LnksZy54LGcueSkmJjA8PVdiKGcucHJldixnLGcubmV4dCkpcmV0dXJuITE7Zz1nLm5leHRafWZvcig7ZSYmZS56Pj1GOyl7aWYoZSE9PWEucHJldiYmZSE9PWEubmV4dCYmTGUoci54LHIueSxhLngsYS55LHYueCx2LnksZS54LGUueSkmJjA8PVdiKGUucHJldixlLGUubmV4dCkpcmV0dXJuITE7ZT1lLnByZXZafWZvcig7ZyYmZy56PD1jOyl7aWYoZyE9PWEucHJldiYmZyE9PWEubmV4dCYmTGUoci54LHIueSxhLngsYS55LHYueCx2LnksZy54LGcueSkmJjA8PVdiKGcucHJldixnLGcubmV4dCkpcmV0dXJuITE7Zz1nLm5leHRafXJldHVybiEwfWZ1bmN0aW9uIGFtKGEsYyxlKXt2YXIgZz1hO2Rve3ZhciByPWcucHJldix2PWcubmV4dC5uZXh0OyFUZChyLHYpJiZJaihyLGcsZy5uZXh0LHYpJiZRZihyLHYpJiZRZih2LHIpJiYoYy5wdXNoKHIuaS9lKSxjLnB1c2goZy5pL2UpLGMucHVzaCh2LmkvZSksTmYoZyksTmYoZy5uZXh0KSxnPWE9dik7Zz1nLm5leHR9d2hpbGUoZyE9PQphKTtyZXR1cm4gZ31mdW5jdGlvbiBibShhLGMsZSxnLHIsdil7dmFyIHo9YTtkb3tmb3IodmFyIEU9ei5uZXh0Lm5leHQ7RSE9PXoucHJldjspe2lmKHouaSE9PUUuaSYmY20oeixFKSl7YT1Kaih6LEUpO3o9T2Yoeix6Lm5leHQpO2E9T2YoYSxhLm5leHQpO1BmKHosYyxlLGcscix2KTtQZihhLGMsZSxnLHIsdik7cmV0dXJufUU9RS5uZXh0fXo9ei5uZXh0fXdoaWxlKHohPT1hKX1mdW5jdGlvbiBkbShhLGMsZSxnKXt2YXIgcj1bXSx2O3ZhciB6PTA7Zm9yKHY9Yy5sZW5ndGg7ejx2O3orKyl7dmFyIEU9Y1t6XSpnO3ZhciBGPXo8di0xP2NbeisxXSpnOmEubGVuZ3RoO0U9R2ooYSxFLEYsZywhMSk7RT09PUUubmV4dCYmKEUuc3RlaW5lcj0hMCk7ci5wdXNoKGVtKEUpKX1yLnNvcnQoZm0pO2Zvcih6PTA7ejxyLmxlbmd0aDt6KyspZ20oclt6XSxlKSxlPU9mKGUsZS5uZXh0KTtyZXR1cm4gZX1mdW5jdGlvbiBmbShhLGMpe3JldHVybiBhLngtYy54fWZ1bmN0aW9uIGdtKGEsYyl7aWYoYz0KaG0oYSxjKSlhPUpqKGMsYSksT2YoYSxhLm5leHQpfWZ1bmN0aW9uIGhtKGEsYyl7dmFyIGU9YyxnPWEueCxyPWEueSx2PS1JbmZpbml0eTtkb3tpZihyPD1lLnkmJnI+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7dmFyIHo9ZS54KyhyLWUueSkqKGUubmV4dC54LWUueCkvKGUubmV4dC55LWUueSk7aWYoejw9ZyYmej52KXt2PXo7aWYoej09PWcpe2lmKHI9PT1lLnkpcmV0dXJuIGU7aWYocj09PWUubmV4dC55KXJldHVybiBlLm5leHR9dmFyIEU9ZS54PGUubmV4dC54P2U6ZS5uZXh0fX1lPWUubmV4dH13aGlsZShlIT09Yyk7aWYoIUUpcmV0dXJuIG51bGw7aWYoZz09PXYpcmV0dXJuIEUucHJldjtjPUU7ej1FLng7dmFyIEY9RS55LEo9SW5maW5pdHk7Zm9yKGU9RS5uZXh0O2UhPT1jOyl7aWYoZz49ZS54JiZlLng+PXomJmchPT1lLngmJkxlKHI8Rj9nOnYscix6LEYscjxGP3Y6ZyxyLGUueCxlLnkpKXt2YXIgUD1NYXRoLmFicyhyLWUueSkvKGctZS54KTsoUDxKfHxQPT09SiYmCmUueD5FLngpJiZRZihlLGEpJiYoRT1lLEo9UCl9ZT1lLm5leHR9cmV0dXJuIEV9ZnVuY3Rpb24gWWwoYSxjLGUsZyl7dmFyIHI9YTtkbyBudWxsPT09ci56JiYoci56PVloKHIueCxyLnksYyxlLGcpKSxyLnByZXZaPXIucHJldixyPXIubmV4dFo9ci5uZXh0O3doaWxlKHIhPT1hKTtyLnByZXZaLm5leHRaPW51bGw7ci5wcmV2Wj1udWxsO2ltKHIpfWZ1bmN0aW9uIGltKGEpe3ZhciBjLGUsZyxyLHY9MTtkb3t2YXIgej1hO3ZhciBFPWE9bnVsbDtmb3IoZT0wO3o7KXtlKys7dmFyIEY9ejtmb3IoYz1nPTA7Yzx2JiYoZysrLEY9Ri5uZXh0WixGKTtjKyspO2ZvcihyPXY7MDxnfHwwPHImJkY7KTAhPT1nJiYoMD09PXJ8fCFGfHx6Lno8PUYueik/KGM9eix6PXoubmV4dFosZy0tKTooYz1GLEY9Ri5uZXh0WixyLS0pLEU/RS5uZXh0Wj1jOmE9YyxjLnByZXZaPUUsRT1jO3o9Rn1FLm5leHRaPW51bGw7dio9Mn13aGlsZSgxPGUpO3JldHVybiBhfWZ1bmN0aW9uIFloKGEsYyxlLGcscil7YT0KMzI3NjcqKGEtZSkqcjtjPTMyNzY3KihjLWcpKnI7YT0oYXxhPDw4KSYxNjcxMTkzNTthPShhfGE8PDQpJjI1MjY0NTEzNTthPShhfGE8PDIpJjg1ODk5MzQ1OTtjPShjfGM8PDgpJjE2NzExOTM1O2M9KGN8Yzw8NCkmMjUyNjQ1MTM1O2M9KGN8Yzw8MikmODU4OTkzNDU5O3JldHVybihhfGE8PDEpJjE0MzE2NTU3NjV8KChjfGM8PDEpJjE0MzE2NTU3NjUpPDwxfWZ1bmN0aW9uIGVtKGEpe3ZhciBjPWEsZT1hO2Rve2lmKGMueDxlLnh8fGMueD09PWUueCYmYy55PGUueSllPWM7Yz1jLm5leHR9d2hpbGUoYyE9PWEpO3JldHVybiBlfWZ1bmN0aW9uIExlKGEsYyxlLGcscix2LHosRSl7cmV0dXJuIDA8PShyLXopKihjLUUpLShhLXopKih2LUUpJiYwPD0oYS16KSooZy1FKS0oZS16KSooYy1FKSYmMDw9KGUteikqKHYtRSktKHIteikqKGctRSl9ZnVuY3Rpb24gY20oYSxjKXtyZXR1cm4gYS5uZXh0LmkhPT1jLmkmJmEucHJldi5pIT09Yy5pJiYham0oYSxjKSYmUWYoYSxjKSYmUWYoYyxhKSYmCmttKGEsYyl9ZnVuY3Rpb24gV2IoYSxjLGUpe3JldHVybihjLnktYS55KSooZS54LWMueCktKGMueC1hLngpKihlLnktYy55KX1mdW5jdGlvbiBUZChhLGMpe3JldHVybiBhLng9PT1jLngmJmEueT09PWMueX1mdW5jdGlvbiBJaihhLGMsZSxnKXtyZXR1cm4gVGQoYSxlKSYmVGQoYyxnKXx8VGQoYSxnKSYmVGQoZSxjKT8hMDowPFdiKGEsYyxlKSE9PTA8V2IoYSxjLGcpJiYwPFdiKGUsZyxhKSE9PTA8V2IoZSxnLGMpfWZ1bmN0aW9uIGptKGEsYyl7dmFyIGU9YTtkb3tpZihlLmkhPT1hLmkmJmUubmV4dC5pIT09YS5pJiZlLmkhPT1jLmkmJmUubmV4dC5pIT09Yy5pJiZJaihlLGUubmV4dCxhLGMpKXJldHVybiEwO2U9ZS5uZXh0fXdoaWxlKGUhPT1hKTtyZXR1cm4hMX1mdW5jdGlvbiBRZihhLGMpe3JldHVybiAwPldiKGEucHJldixhLGEubmV4dCk/MDw9V2IoYSxjLGEubmV4dCkmJjA8PVdiKGEsYS5wcmV2LGMpOjA+V2IoYSxjLGEucHJldil8fDA+V2IoYSxhLm5leHQsYyl9ZnVuY3Rpb24ga20oYSwKYyl7dmFyIGU9YSxnPSExLHI9KGEueCtjLngpLzI7Yz0oYS55K2MueSkvMjtkbyBlLnk+YyE9PWUubmV4dC55PmMmJmUubmV4dC55IT09ZS55JiZyPChlLm5leHQueC1lLngpKihjLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYoZz0hZyksZT1lLm5leHQ7d2hpbGUoZSE9PWEpO3JldHVybiBnfWZ1bmN0aW9uIEpqKGEsYyl7dmFyIGU9bmV3IFpoKGEuaSxhLngsYS55KSxnPW5ldyBaaChjLmksYy54LGMueSkscj1hLm5leHQsdj1jLnByZXY7YS5uZXh0PWM7Yy5wcmV2PWE7ZS5uZXh0PXI7ci5wcmV2PWU7Zy5uZXh0PWU7ZS5wcmV2PWc7di5uZXh0PWc7Zy5wcmV2PXY7cmV0dXJuIGd9ZnVuY3Rpb24gSGooYSxjLGUsZyl7YT1uZXcgWmgoYSxjLGUpO2c/KGEubmV4dD1nLm5leHQsYS5wcmV2PWcsZy5uZXh0LnByZXY9YSxnLm5leHQ9YSk6KGEucHJldj1hLGEubmV4dD1hKTtyZXR1cm4gYX1mdW5jdGlvbiBOZihhKXthLm5leHQucHJldj1hLnByZXY7YS5wcmV2Lm5leHQ9YS5uZXh0O2EucHJldlomJgooYS5wcmV2Wi5uZXh0Wj1hLm5leHRaKTthLm5leHRaJiYoYS5uZXh0Wi5wcmV2Wj1hLnByZXZaKX1mdW5jdGlvbiBaaChhLGMsZSl7dGhpcy5pPWE7dGhpcy54PWM7dGhpcy55PWU7dGhpcy5uZXh0Wj10aGlzLnByZXZaPXRoaXMuej10aGlzLm5leHQ9dGhpcy5wcmV2PW51bGw7dGhpcy5zdGVpbmVyPSExfWZ1bmN0aW9uIFhsKGEsYyxlLGcpe2Zvcih2YXIgcj0wLHY9ZS1nO2M8ZTtjKz1nKXIrPShhW3ZdLWFbY10pKihhW2MrMV0rYVt2KzFdKSx2PWM7cmV0dXJuIHJ9ZnVuY3Rpb24gS2ooYSl7dmFyIGM9YS5sZW5ndGg7MjxjJiZhW2MtMV0uZXF1YWxzKGFbMF0pJiZhLnBvcCgpfWZ1bmN0aW9uIExqKGEsYyl7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspYS5wdXNoKGNbZV0ueCksYS5wdXNoKGNbZV0ueSl9ZnVuY3Rpb24gVWQoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRXh0cnVkZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczphLG9wdGlvbnM6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFJjKGEsCmMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBSYyhhLGMpe2Z1bmN0aW9uIGUoRil7ZnVuY3Rpb24gSihRYSxlYixtYil7ZWJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0Iik7cmV0dXJuIGViLmNsb25lKCkubXVsdGlwbHlTY2FsYXIobWIpLmFkZChRYSl9ZnVuY3Rpb24gUChRYSxlYixtYil7dmFyIHBiPVFhLngtZWIueDt2YXIgc2I9UWEueS1lYi55O3ZhciBLYj1tYi54LVFhLng7dmFyIFNiPW1iLnktUWEueSxuYz1wYipwYitzYipzYjtpZihNYXRoLmFicyhwYipTYi1zYipLYik+TnVtYmVyLkVQU0lMT04pe3ZhciBRYz1NYXRoLnNxcnQobmMpLHpjPU1hdGguc3FydChLYipLYitTYipTYik7bmM9ZWIueC1zYi9RYztlYj1lYi55K3BiL1FjO1NiPSgobWIueC1TYi96Yy1uYykqU2ItKG1iLnkrS2IvemMtZWIpKktiKS8ocGIqU2Itc2IqS2IpO0tiPW5jK3BiKlNiLVFhLng7cGI9ZWIrc2IqU2ItUWEueTtzYj1LYioKS2IrcGIqcGI7aWYoMj49c2IpcmV0dXJuIG5ldyBmKEtiLHBiKTtzYj1NYXRoLnNxcnQoc2IvMil9ZWxzZSBRYT0hMSxwYj5OdW1iZXIuRVBTSUxPTj9LYj5OdW1iZXIuRVBTSUxPTiYmKFFhPSEwKTpwYjwtTnVtYmVyLkVQU0lMT04/S2I8LU51bWJlci5FUFNJTE9OJiYoUWE9ITApOk1hdGguc2lnbihzYik9PT1NYXRoLnNpZ24oU2IpJiYoUWE9ITApLFFhPyhLYj0tc2Isc2I9TWF0aC5zcXJ0KG5jKSk6KEtiPXBiLHBiPXNiLHNiPU1hdGguc3FydChuYy8yKSk7cmV0dXJuIG5ldyBmKEtiL3NiLHBiL3NiKX1mdW5jdGlvbiBSKFFhLGViKXtmb3IoamE9UWEubGVuZ3RoOzA8PS0tamE7KXt2YXIgbWI9amE7dmFyIHBiPWphLTE7MD5wYiYmKHBiPVFhLmxlbmd0aC0xKTt2YXIgc2IsS2I9cWErMipVYTtmb3Ioc2I9MDtzYjxLYjtzYisrKXt2YXIgU2I9WWEqc2IsbmM9WWEqKHNiKzEpO1coZWIrbWIrU2IsZWIrcGIrU2IsZWIrcGIrbmMsZWIrbWIrbmMpfX19ZnVuY3Rpb24gUyhRYSxlYixtYil7cmEucHVzaChRYSk7CnJhLnB1c2goZWIpO3JhLnB1c2gobWIpfWZ1bmN0aW9uIFYoUWEsZWIsbWIpe2hhKFFhKTtoYShlYik7aGEobWIpO1FhPXIubGVuZ3RoLzM7UWE9SGEuZ2VuZXJhdGVUb3BVVihnLHIsUWEtMyxRYS0yLFFhLTEpO2ZhKFFhWzBdKTtmYShRYVsxXSk7ZmEoUWFbMl0pfWZ1bmN0aW9uIFcoUWEsZWIsbWIscGIpe2hhKFFhKTtoYShlYik7aGEocGIpO2hhKGViKTtoYShtYik7aGEocGIpO1FhPXIubGVuZ3RoLzM7UWE9SGEuZ2VuZXJhdGVTaWRlV2FsbFVWKGcscixRYS02LFFhLTMsUWEtMixRYS0xKTtmYShRYVswXSk7ZmEoUWFbMV0pO2ZhKFFhWzNdKTtmYShRYVsxXSk7ZmEoUWFbMl0pO2ZhKFFhWzNdKX1mdW5jdGlvbiBoYShRYSl7ci5wdXNoKHJhWzMqUWFdKTtyLnB1c2gocmFbMypRYSsxXSk7ci5wdXNoKHJhWzMqUWErMl0pfWZ1bmN0aW9uIGZhKFFhKXt2LnB1c2goUWEueCk7di5wdXNoKFFhLnkpfXZhciByYT1bXSxwYT12b2lkIDAhPT1jLmN1cnZlU2VnbWVudHM/Yy5jdXJ2ZVNlZ21lbnRzOgoxMixxYT12b2lkIDAhPT1jLnN0ZXBzP2Muc3RlcHM6MSx1YT12b2lkIDAhPT1jLmRlcHRoP2MuZGVwdGg6MTAwLG9hPXZvaWQgMCE9PWMuYmV2ZWxFbmFibGVkP2MuYmV2ZWxFbmFibGVkOiEwLHRhPXZvaWQgMCE9PWMuYmV2ZWxUaGlja25lc3M/Yy5iZXZlbFRoaWNrbmVzczo2LEJhPXZvaWQgMCE9PWMuYmV2ZWxTaXplP2MuYmV2ZWxTaXplOnRhLTIsVGE9dm9pZCAwIT09Yy5iZXZlbE9mZnNldD9jLmJldmVsT2Zmc2V0OjAsVWE9dm9pZCAwIT09Yy5iZXZlbFNlZ21lbnRzP2MuYmV2ZWxTZWdtZW50czozLENhPWMuZXh0cnVkZVBhdGgsSGE9dm9pZCAwIT09Yy5VVkdlbmVyYXRvcj9jLlVWR2VuZXJhdG9yOmxtO3ZvaWQgMCE9PWMuYW1vdW50JiYoY29uc29sZS53YXJuKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IGFtb3VudCBoYXMgYmVlbiByZW5hbWVkIHRvIGRlcHRoLiIpLHVhPWMuYW1vdW50KTt2YXIgRGE9ITE7aWYoQ2Epe3ZhciBNYT1DYS5nZXRTcGFjZWRQb2ludHMocWEpOwpEYT0hMDtvYT0hMTt2YXIgZGI9Q2EuY29tcHV0ZUZyZW5ldEZyYW1lcyhxYSwhMSk7dmFyIHRiPW5ldyBrO3ZhciBLYT1uZXcgazt2YXIgYmI9bmV3IGt9b2F8fChUYT1CYT10YT1VYT0wKTt2YXIgamI7cGE9Ri5leHRyYWN0UG9pbnRzKHBhKTtGPXBhLnNoYXBlO3ZhciBFYj1wYS5ob2xlcztpZighZWQuaXNDbG9ja1dpc2UoRikpe0Y9Ri5yZXZlcnNlKCk7dmFyIHhiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKXt2YXIgaWE9RWJbeGJdO2VkLmlzQ2xvY2tXaXNlKGlhKSYmKEViW3hiXT1pYS5yZXZlcnNlKCkpfX12YXIgbmE9ZWQudHJpYW5ndWxhdGVTaGFwZShGLEViKSx6YT1GO3hiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKWlhPUViW3hiXSxGPUYuY29uY2F0KGlhKTt2YXIgSmEsWWE9Ri5sZW5ndGgsTmEsY2I9bmEubGVuZ3RoO3BhPVtdO3ZhciBqYT0wO3ZhciBHYT16YS5sZW5ndGg7dmFyIExhPUdhLTE7Zm9yKEphPWphKzE7amE8R2E7amErKyxMYSsrLEphKyspTGE9PT0KR2EmJihMYT0wKSxKYT09PUdhJiYoSmE9MCkscGFbamFdPVAoemFbamFdLHphW0xhXSx6YVtKYV0pO0NhPVtdO3ZhciBuYj1wYS5jb25jYXQoKTt4Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKyl7aWE9RWJbeGJdO3ZhciBWYT1bXTtqYT0wO0dhPWlhLmxlbmd0aDtMYT1HYS0xO2ZvcihKYT1qYSsxO2phPEdhO2phKyssTGErKyxKYSsrKUxhPT09R2EmJihMYT0wKSxKYT09PUdhJiYoSmE9MCksVmFbamFdPVAoaWFbamFdLGlhW0xhXSxpYVtKYV0pO0NhLnB1c2goVmEpO25iPW5iLmNvbmNhdChWYSl9Zm9yKExhPTA7TGE8VWE7TGErKyl7R2E9TGEvVWE7dmFyIGliPXRhKk1hdGguY29zKEdhKk1hdGguUEkvMik7SmE9QmEqTWF0aC5zaW4oR2EqTWF0aC5QSS8yKStUYTtqYT0wO2ZvcihHYT16YS5sZW5ndGg7amE8R2E7amErKyl7dmFyIGtiPUooemFbamFdLHBhW2phXSxKYSk7UyhrYi54LGtiLnksLWliKX14Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKylmb3IoaWE9CkViW3hiXSxWYT1DYVt4Yl0samE9MCxHYT1pYS5sZW5ndGg7amE8R2E7amErKylrYj1KKGlhW2phXSxWYVtqYV0sSmEpLFMoa2IueCxrYi55LC1pYil9SmE9QmErVGE7Zm9yKGphPTA7amE8WWE7amErKylrYj1vYT9KKEZbamFdLG5iW2phXSxKYSk6RltqYV0sRGE/KEthLmNvcHkoZGIubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoa2IueCksdGIuY29weShkYi5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGtiLnkpLGJiLmNvcHkoTWFbMF0pLmFkZChLYSkuYWRkKHRiKSxTKGJiLngsYmIueSxiYi56KSk6UyhrYi54LGtiLnksMCk7Zm9yKEdhPTE7R2E8PXFhO0dhKyspZm9yKGphPTA7amE8WWE7amErKylrYj1vYT9KKEZbamFdLG5iW2phXSxKYSk6RltqYV0sRGE/KEthLmNvcHkoZGIubm9ybWFsc1tHYV0pLm11bHRpcGx5U2NhbGFyKGtiLngpLHRiLmNvcHkoZGIuYmlub3JtYWxzW0dhXSkubXVsdGlwbHlTY2FsYXIoa2IueSksYmIuY29weShNYVtHYV0pLmFkZChLYSkuYWRkKHRiKSwKUyhiYi54LGJiLnksYmIueikpOlMoa2IueCxrYi55LHVhL3FhKkdhKTtmb3IoTGE9VWEtMTswPD1MYTtMYS0tKXtHYT1MYS9VYTtpYj10YSpNYXRoLmNvcyhHYSpNYXRoLlBJLzIpO0phPUJhKk1hdGguc2luKEdhKk1hdGguUEkvMikrVGE7amE9MDtmb3IoR2E9emEubGVuZ3RoO2phPEdhO2phKyspa2I9Sih6YVtqYV0scGFbamFdLEphKSxTKGtiLngsa2IueSx1YStpYik7eGI9MDtmb3IoamI9RWIubGVuZ3RoO3hiPGpiO3hiKyspZm9yKGlhPUViW3hiXSxWYT1DYVt4Yl0samE9MCxHYT1pYS5sZW5ndGg7amE8R2E7amErKylrYj1KKGlhW2phXSxWYVtqYV0sSmEpLERhP1Moa2IueCxrYi55K01hW3FhLTFdLnksTWFbcWEtMV0ueCtpYik6UyhrYi54LGtiLnksdWEraWIpfShmdW5jdGlvbigpe3ZhciBRYT1yLmxlbmd0aC8zO2lmKG9hKXt2YXIgZWI9MCpZYTtmb3IoamE9MDtqYTxjYjtqYSsrKU5hPW5hW2phXSxWKE5hWzJdK2ViLE5hWzFdK2ViLE5hWzBdK2ViKTtlYj1ZYSoocWErMipVYSk7CmZvcihqYT0wO2phPGNiO2phKyspTmE9bmFbamFdLFYoTmFbMF0rZWIsTmFbMV0rZWIsTmFbMl0rZWIpfWVsc2V7Zm9yKGphPTA7amE8Y2I7amErKylOYT1uYVtqYV0sVihOYVsyXSxOYVsxXSxOYVswXSk7Zm9yKGphPTA7amE8Y2I7amErKylOYT1uYVtqYV0sVihOYVswXStZYSpxYSxOYVsxXStZYSpxYSxOYVsyXStZYSpxYSl9Zy5hZGRHcm91cChRYSxyLmxlbmd0aC8zLVFhLDApfSkoKTsoZnVuY3Rpb24oKXt2YXIgUWE9ci5sZW5ndGgvMyxlYj0wO1IoemEsZWIpO2ViKz16YS5sZW5ndGg7eGI9MDtmb3IoamI9RWIubGVuZ3RoO3hiPGpiO3hiKyspaWE9RWJbeGJdLFIoaWEsZWIpLGViKz1pYS5sZW5ndGg7Zy5hZGRHcm91cChRYSxyLmxlbmd0aC8zLVFhLDEpfSkoKX12YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRXh0cnVkZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczphLG9wdGlvbnM6Y307YT1BcnJheS5pc0FycmF5KGEpP2E6W2FdO2Zvcih2YXIgZz10aGlzLApyPVtdLHY9W10sej0wLEU9YS5sZW5ndGg7ejxFO3orKyllKGFbel0pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHYsMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX1mdW5jdGlvbiBNaihhLGMsZSl7ZS5zaGFwZXM9W107aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIGc9MCxyPWEubGVuZ3RoO2c8cjtnKyspZS5zaGFwZXMucHVzaChhW2ddLnV1aWQpO2Vsc2UgZS5zaGFwZXMucHVzaChhLnV1aWQpO3ZvaWQgMCE9PWMuZXh0cnVkZVBhdGgmJihlLm9wdGlvbnMuZXh0cnVkZVBhdGg9Yy5leHRydWRlUGF0aC50b0pTT04oKSk7cmV0dXJuIGV9ZnVuY3Rpb24gUmYoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV4dEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3RleHQ6YSxwYXJhbWV0ZXJzOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBNZShhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX0KZnVuY3Rpb24gTWUoYSxjKXtjPWN8fHt9O3ZhciBlPWMuZm9udDtpZighZXx8IWUuaXNGb250KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LiIpLG5ldyB5YTthPWUuZ2VuZXJhdGVTaGFwZXMoYSxjLnNpemUpO2MuZGVwdGg9dm9pZCAwIT09Yy5oZWlnaHQ/Yy5oZWlnaHQ6NTA7dm9pZCAwPT09Yy5iZXZlbFRoaWNrbmVzcyYmKGMuYmV2ZWxUaGlja25lc3M9MTApO3ZvaWQgMD09PWMuYmV2ZWxTaXplJiYoYy5iZXZlbFNpemU9OCk7dm9pZCAwPT09Yy5iZXZlbEVuYWJsZWQmJihjLmJldmVsRW5hYmxlZD0hMSk7UmMuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJUZXh0QnVmZmVyR2VvbWV0cnkifWZ1bmN0aW9uIFNmKGEsYyxlLGcscix2LHope3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcGhlcmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSx3aWR0aFNlZ21lbnRzOmMsCmhlaWdodFNlZ21lbnRzOmUscGhpU3RhcnQ6ZyxwaGlMZW5ndGg6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEJkKGEsYyxlLGcscix2LHopKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBCZChhLGMsZSxnLHIsdix6KXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3BoZXJlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsd2lkdGhTZWdtZW50czpjLGhlaWdodFNlZ21lbnRzOmUscGhpU3RhcnQ6ZyxwaGlMZW5ndGg6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en07YT1hfHwxO2M9TWF0aC5tYXgoMyxNYXRoLmZsb29yKGMpfHw4KTtlPU1hdGgubWF4KDIsTWF0aC5mbG9vcihlKXx8Nik7Zz12b2lkIDAhPT1nP2c6MDtyPXZvaWQgMCE9PXI/cjoyKk1hdGguUEk7dj12b2lkIDAhPT12P3Y6MDt6PXZvaWQgMCE9PXo/ejpNYXRoLlBJO3ZhciBFPU1hdGgubWluKHYreixNYXRoLlBJKSxGLApKLFA9MCxSPVtdLFM9bmV3IGssVj1uZXcgayxXPVtdLGhhPVtdLGZhPVtdLHJhPVtdO2ZvcihKPTA7Sjw9ZTtKKyspe3ZhciBwYT1bXSxxYT1KL2UsdWE9MDswPT1KJiYwPT12P3VhPS41L2M6Sj09ZSYmRT09TWF0aC5QSSYmKHVhPS0uNS9jKTtmb3IoRj0wO0Y8PWM7RisrKXt2YXIgb2E9Ri9jO1MueD0tYSpNYXRoLmNvcyhnK29hKnIpKk1hdGguc2luKHYrcWEqeik7Uy55PWEqTWF0aC5jb3ModitxYSp6KTtTLno9YSpNYXRoLnNpbihnK29hKnIpKk1hdGguc2luKHYrcWEqeik7aGEucHVzaChTLngsUy55LFMueik7Vi5jb3B5KFMpLm5vcm1hbGl6ZSgpO2ZhLnB1c2goVi54LFYueSxWLnopO3JhLnB1c2gob2ErdWEsMS1xYSk7cGEucHVzaChQKyspfVIucHVzaChwYSl9Zm9yKEo9MDtKPGU7SisrKWZvcihGPTA7RjxjO0YrKylhPVJbSl1bRisxXSxnPVJbSl1bRl0scj1SW0orMV1bRl0sej1SW0orMV1bRisxXSwoMCE9PUp8fDA8dikmJlcucHVzaChhLGcseiksKEohPT1lLTF8fEU8TWF0aC5QSSkmJgpXLnB1c2goZyxyLHopO3RoaXMuc2V0SW5kZXgoVyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoaGEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShmYSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EocmEsMikpfWZ1bmN0aW9uIFRmKGEsYyxlLGcscix2KXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUmluZ0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2lubmVyUmFkaXVzOmEsb3V0ZXJSYWRpdXM6Yyx0aGV0YVNlZ21lbnRzOmUscGhpU2VnbWVudHM6Zyx0aGV0YVN0YXJ0OnIsdGhldGFMZW5ndGg6dn07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IE5lKGEsYyxlLGcscix2KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gTmUoYSxjLGUsZyxyLHYpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJSaW5nQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17aW5uZXJSYWRpdXM6YSxvdXRlclJhZGl1czpjLHRoZXRhU2VnbWVudHM6ZSwKcGhpU2VnbWVudHM6Zyx0aGV0YVN0YXJ0OnIsdGhldGFMZW5ndGg6dn07YT1hfHwuNTtjPWN8fDE7cj12b2lkIDAhPT1yP3I6MDt2PXZvaWQgMCE9PXY/djoyKk1hdGguUEk7ZT12b2lkIDAhPT1lP01hdGgubWF4KDMsZSk6ODtnPXZvaWQgMCE9PWc/TWF0aC5tYXgoMSxnKToxO3ZhciB6PVtdLEU9W10sRj1bXSxKPVtdLFA9YSxSPShjLWEpL2csUz1uZXcgayxWPW5ldyBmLFcsaGE7Zm9yKFc9MDtXPD1nO1crKyl7Zm9yKGhhPTA7aGE8PWU7aGErKylhPXIraGEvZSp2LFMueD1QKk1hdGguY29zKGEpLFMueT1QKk1hdGguc2luKGEpLEUucHVzaChTLngsUy55LFMueiksRi5wdXNoKDAsMCwxKSxWLng9KFMueC9jKzEpLzIsVi55PShTLnkvYysxKS8yLEoucHVzaChWLngsVi55KTtQKz1SfWZvcihXPTA7VzxnO1crKylmb3IoYz1XKihlKzEpLGhhPTA7aGE8ZTtoYSsrKWE9aGErYyxyPWErZSsxLHY9YStlKzIsUD1hKzEsei5wdXNoKGEscixQKSx6LnB1c2gocix2LFApO3RoaXMuc2V0SW5kZXgoeik7CnRoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKEUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShGLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYShKLDIpKX1mdW5jdGlvbiBVZihhLGMsZSxnKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGF0aGVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwb2ludHM6YSxzZWdtZW50czpjLHBoaVN0YXJ0OmUscGhpTGVuZ3RoOmd9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBPZShhLGMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gT2UoYSxjLGUsZyl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxhdGhlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cG9pbnRzOmEsc2VnbWVudHM6YyxwaGlTdGFydDplLHBoaUxlbmd0aDpnfTtjPU1hdGguZmxvb3IoYyl8fDEyO2U9ZXx8MDtnPWd8fDIqTWF0aC5QSTtnPWhiLmNsYW1wKGcsMCwyKk1hdGguUEkpO3ZhciByPQpbXSx2PVtdLHo9W10sRT0xL2MsRj1uZXcgayxKPW5ldyBmLFA7Zm9yKFA9MDtQPD1jO1ArKyl7dmFyIFI9ZStQKkUqZzt2YXIgUz1NYXRoLnNpbihSKSxWPU1hdGguY29zKFIpO2ZvcihSPTA7Ujw9YS5sZW5ndGgtMTtSKyspRi54PWFbUl0ueCpTLEYueT1hW1JdLnksRi56PWFbUl0ueCpWLHYucHVzaChGLngsRi55LEYueiksSi54PVAvYyxKLnk9Ui8oYS5sZW5ndGgtMSksei5wdXNoKEoueCxKLnkpfWZvcihQPTA7UDxjO1ArKylmb3IoUj0wO1I8YS5sZW5ndGgtMTtSKyspZT1SK1AqYS5sZW5ndGgsRT1lK2EubGVuZ3RoLEY9ZSthLmxlbmd0aCsxLEo9ZSsxLHIucHVzaChlLEUsSiksci5wdXNoKEUsRixKKTt0aGlzLnNldEluZGV4KHIpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHYsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHosMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtpZihnPT09MipNYXRoLlBJKWZvcihnPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwuYXJyYXksCnI9bmV3IGssdj1uZXcgayx6PW5ldyBrLGU9YyphLmxlbmd0aCozLFI9UD0wO1A8YS5sZW5ndGg7UCsrLFIrPTMpci54PWdbUiswXSxyLnk9Z1tSKzFdLHIuej1nW1IrMl0sdi54PWdbZStSKzBdLHYueT1nW2UrUisxXSx2Lno9Z1tlK1IrMl0sei5hZGRWZWN0b3JzKHIsdikubm9ybWFsaXplKCksZ1tSKzBdPWdbZStSKzBdPXoueCxnW1IrMV09Z1tlK1IrMV09ei55LGdbUisyXT1nW2UrUisyXT16Lnp9ZnVuY3Rpb24gVmQoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2hhcGVHZW9tZXRyeSI7Im9iamVjdCI9PT10eXBlb2YgYyYmKGNvbnNvbGUud2FybigiVEhSRUUuU2hhcGVHZW9tZXRyeTogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKSxjPWMuY3VydmVTZWdtZW50cyk7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YSxjdXJ2ZVNlZ21lbnRzOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBXZChhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBXZChhLApjKXtmdW5jdGlvbiBlKFApe3ZhciBSLFM9ci5sZW5ndGgvMztQPVAuZXh0cmFjdFBvaW50cyhjKTt2YXIgVj1QLnNoYXBlLFc9UC5ob2xlczshMT09PWVkLmlzQ2xvY2tXaXNlKFYpJiYoVj1WLnJldmVyc2UoKSk7UD0wO2ZvcihSPVcubGVuZ3RoO1A8UjtQKyspe3ZhciBoYT1XW1BdOyEwPT09ZWQuaXNDbG9ja1dpc2UoaGEpJiYoV1tQXT1oYS5yZXZlcnNlKCkpfXZhciBmYT1lZC50cmlhbmd1bGF0ZVNoYXBlKFYsVyk7UD0wO2ZvcihSPVcubGVuZ3RoO1A8UjtQKyspaGE9V1tQXSxWPVYuY29uY2F0KGhhKTtQPTA7Zm9yKFI9Vi5sZW5ndGg7UDxSO1ArKyloYT1WW1BdLHIucHVzaChoYS54LGhhLnksMCksdi5wdXNoKDAsMCwxKSx6LnB1c2goaGEueCxoYS55KTtQPTA7Zm9yKFI9ZmEubGVuZ3RoO1A8UjtQKyspVj1mYVtQXSxnLnB1c2goVlswXStTLFZbMV0rUyxWWzJdK1MpLEYrPTN9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYXBlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz0Ke3NoYXBlczphLGN1cnZlU2VnbWVudHM6Y307Yz1jfHwxMjt2YXIgZz1bXSxyPVtdLHY9W10sej1bXSxFPTAsRj0wO2lmKCExPT09QXJyYXkuaXNBcnJheShhKSllKGEpO2Vsc2UgZm9yKHZhciBKPTA7SjxhLmxlbmd0aDtKKyspZShhW0pdKSx0aGlzLmFkZEdyb3VwKEUsRixKKSxFKz1GLEY9MDt0aGlzLnNldEluZGV4KGcpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYSh2LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYSh6LDIpKX1mdW5jdGlvbiBOaihhLGMpe2Muc2hhcGVzPVtdO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKHZhciBlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKWMuc2hhcGVzLnB1c2goYVtlXS51dWlkKTtlbHNlIGMuc2hhcGVzLnB1c2goYS51dWlkKTtyZXR1cm4gY31mdW5jdGlvbiBQZShhLGMpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJFZGdlc0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9Cnt0aHJlc2hvbGRBbmdsZTpjfTt2YXIgZT1bXTtjPU1hdGguY29zKGhiLkRFRzJSQUQqKHZvaWQgMCE9PWM/YzoxKSk7dmFyIGc9WzAsMF0scj17fSx2PVsiYSIsImIiLCJjIl07aWYoYS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgej1uZXcgeWE7ei5mcm9tQnVmZmVyR2VvbWV0cnkoYSl9ZWxzZSB6PWEuY2xvbmUoKTt6Lm1lcmdlVmVydGljZXMoKTt6LmNvbXB1dGVGYWNlTm9ybWFscygpO2E9ei52ZXJ0aWNlczt6PXouZmFjZXM7Zm9yKHZhciBFPTAsRj16Lmxlbmd0aDtFPEY7RSsrKWZvcih2YXIgSj16W0VdLFA9MDszPlA7UCsrKXt2YXIgUj1KW3ZbUF1dO3ZhciBTPUpbdlsoUCsxKSUzXV07Z1swXT1NYXRoLm1pbihSLFMpO2dbMV09TWF0aC5tYXgoUixTKTtSPWdbMF0rIiwiK2dbMV07dm9pZCAwPT09cltSXT9yW1JdPXtpbmRleDE6Z1swXSxpbmRleDI6Z1sxXSxmYWNlMTpFLGZhY2UyOnZvaWQgMH06cltSXS5mYWNlMj1FfWZvcihSIGluIHIpaWYoZz1yW1JdLHZvaWQgMD09PWcuZmFjZTJ8fAp6W2cuZmFjZTFdLm5vcm1hbC5kb3QoeltnLmZhY2UyXS5ub3JtYWwpPD1jKXY9YVtnLmluZGV4MV0sZS5wdXNoKHYueCx2Lnksdi56KSx2PWFbZy5pbmRleDJdLGUucHVzaCh2Lngsdi55LHYueik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoZSwzKSl9ZnVuY3Rpb24gWGQoYSxjLGUsZyxyLHYseixFKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3lsaW5kZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXNUb3A6YSxyYWRpdXNCb3R0b206YyxoZWlnaHQ6ZSxyYWRpYWxTZWdtZW50czpnLGhlaWdodFNlZ21lbnRzOnIsb3BlbkVuZGVkOnYsdGhldGFTdGFydDp6LHRoZXRhTGVuZ3RoOkV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBmZChhLGMsZSxnLHIsdix6LEUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBmZChhLGMsZSxnLHIsdix6LEUpe2Z1bmN0aW9uIEYocGEpe3ZhciBxYSx1YT1uZXcgZixvYT1uZXcgayx0YT0wLEJhPSEwPT09CnBhP2E6YyxUYT0hMD09PXBhPzE6LTE7dmFyIFVhPVc7Zm9yKHFhPTE7cWE8PWc7cWErKylSLnB1c2goMCxmYSpUYSwwKSxTLnB1c2goMCxUYSwwKSxWLnB1c2goLjUsLjUpLFcrKzt2YXIgQ2E9Vztmb3IocWE9MDtxYTw9ZztxYSsrKXt2YXIgSGE9cWEvZypFK3osRGE9TWF0aC5jb3MoSGEpO0hhPU1hdGguc2luKEhhKTtvYS54PUJhKkhhO29hLnk9ZmEqVGE7b2Euej1CYSpEYTtSLnB1c2gob2EueCxvYS55LG9hLnopO1MucHVzaCgwLFRhLDApO3VhLng9LjUqRGErLjU7dWEueT0uNSpIYSpUYSsuNTtWLnB1c2godWEueCx1YS55KTtXKyt9Zm9yKHFhPTA7cWE8ZztxYSsrKXVhPVVhK3FhLG9hPUNhK3FhLCEwPT09cGE/UC5wdXNoKG9hLG9hKzEsdWEpOlAucHVzaChvYSsxLG9hLHVhKSx0YSs9MztKLmFkZEdyb3VwKHJhLHRhLCEwPT09cGE/MToyKTtyYSs9dGF9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN5bGluZGVyQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOmEsCnJhZGl1c0JvdHRvbTpjLGhlaWdodDplLHJhZGlhbFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6cixvcGVuRW5kZWQ6dix0aGV0YVN0YXJ0OnosdGhldGFMZW5ndGg6RX07dmFyIEo9dGhpczthPXZvaWQgMCE9PWE/YToxO2M9dm9pZCAwIT09Yz9jOjE7ZT1lfHwxO2c9TWF0aC5mbG9vcihnKXx8ODtyPU1hdGguZmxvb3Iocil8fDE7dj12b2lkIDAhPT12P3Y6ITE7ej12b2lkIDAhPT16P3o6MDtFPXZvaWQgMCE9PUU/RToyKk1hdGguUEk7dmFyIFA9W10sUj1bXSxTPVtdLFY9W10sVz0wLGhhPVtdLGZhPWUvMixyYT0wOyhmdW5jdGlvbigpe3ZhciBwYSxxYSx1YT1uZXcgayxvYT1uZXcgayx0YT0wLEJhPShjLWEpL2U7Zm9yKHFhPTA7cWE8PXI7cWErKyl7dmFyIFRhPVtdLFVhPXFhL3IsQ2E9VWEqKGMtYSkrYTtmb3IocGE9MDtwYTw9ZztwYSsrKXt2YXIgSGE9cGEvZyxEYT1IYSpFK3osTWE9TWF0aC5zaW4oRGEpO0RhPU1hdGguY29zKERhKTtvYS54PUNhKk1hO29hLnk9LVVhKmUrZmE7Cm9hLno9Q2EqRGE7Ui5wdXNoKG9hLngsb2EueSxvYS56KTt1YS5zZXQoTWEsQmEsRGEpLm5vcm1hbGl6ZSgpO1MucHVzaCh1YS54LHVhLnksdWEueik7Vi5wdXNoKEhhLDEtVWEpO1RhLnB1c2goVysrKX1oYS5wdXNoKFRhKX1mb3IocGE9MDtwYTxnO3BhKyspZm9yKHFhPTA7cWE8cjtxYSsrKXVhPWhhW3FhKzFdW3BhXSxvYT1oYVtxYSsxXVtwYSsxXSxCYT1oYVtxYV1bcGErMV0sUC5wdXNoKGhhW3FhXVtwYV0sdWEsQmEpLFAucHVzaCh1YSxvYSxCYSksdGErPTY7Si5hZGRHcm91cChyYSx0YSwwKTtyYSs9dGF9KSgpOyExPT09diYmKDA8YSYmRighMCksMDxjJiZGKCExKSk7dGhpcy5zZXRJbmRleChQKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShSLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoUywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoViwyKSl9ZnVuY3Rpb24gVmYoYSxjLGUsZyxyLHYseil7WGQuY2FsbCh0aGlzLAowLGEsYyxlLGcscix2LHopO3RoaXMudHlwZT0iQ29uZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGhlaWdodDpjLHJhZGlhbFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6ZyxvcGVuRW5kZWQ6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en19ZnVuY3Rpb24gV2YoYSxjLGUsZyxyLHYseil7ZmQuY2FsbCh0aGlzLDAsYSxjLGUsZyxyLHYseik7dGhpcy50eXBlPSJDb25lQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsaGVpZ2h0OmMscmFkaWFsU2VnbWVudHM6ZSxoZWlnaHRTZWdtZW50czpnLG9wZW5FbmRlZDpyLHRoZXRhU3RhcnQ6dix0aGV0YUxlbmd0aDp6fX1mdW5jdGlvbiBYZihhLGMsZSxnKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2lyY2xlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsc2VnbWVudHM6Yyx0aGV0YVN0YXJ0OmUsdGhldGFMZW5ndGg6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFFlKGEsCmMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUWUoYSxjLGUsZyl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNpcmNsZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHNlZ21lbnRzOmMsdGhldGFTdGFydDplLHRoZXRhTGVuZ3RoOmd9O2E9YXx8MTtjPXZvaWQgMCE9PWM/TWF0aC5tYXgoMyxjKTo4O2U9dm9pZCAwIT09ZT9lOjA7Zz12b2lkIDAhPT1nP2c6MipNYXRoLlBJO3ZhciByPVtdLHY9W10sej1bXSxFPVtdLEYsSj1uZXcgayxQPW5ldyBmO3YucHVzaCgwLDAsMCk7ei5wdXNoKDAsMCwxKTtFLnB1c2goLjUsLjUpO3ZhciBSPTA7Zm9yKEY9MztSPD1jO1IrKyxGKz0zKXt2YXIgUz1lK1IvYypnO0oueD1hKk1hdGguY29zKFMpO0oueT1hKk1hdGguc2luKFMpO3YucHVzaChKLngsSi55LEoueik7ei5wdXNoKDAsMCwxKTtQLng9KHZbRl0vYSsxKS8yO1AueT0odltGKzFdL2ErMSkvMjtFLnB1c2goUC54LFAueSl9Zm9yKEY9MTtGPD0KYztGKyspci5wdXNoKEYsRisxLDApO3RoaXMuc2V0SW5kZXgocik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKHosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKEUsMikpfWZ1bmN0aW9uIFlkKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYWRvd01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDApO3RoaXMudHJhbnNwYXJlbnQ9ITA7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gUmUoYSl7cWIuY2FsbCh0aGlzLGEpO3RoaXMudHlwZT0iUmF3U2hhZGVyTWF0ZXJpYWwifWZ1bmN0aW9uIFNjKGEpe00uY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifTt0aGlzLnR5cGU9Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLm1ldGFsbmVzcz10aGlzLnJvdWdobmVzcz0uNTt0aGlzLmxpZ2h0TWFwPXRoaXMubWFwPQpudWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEkoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuYnVtcE1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMubWV0YWxuZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwPW51bGw7dGhpcy5lbnZNYXBJbnRlbnNpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0KInJvdW5kIjt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIFpkKGEpe1NjLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn07dGhpcy50eXBlPSJNZXNoUGh5c2ljYWxNYXRlcmlhbCI7dGhpcy5yZWZsZWN0aXZpdHk9LjU7dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXQ9MDt0aGlzLnNoZWVuPW51bGw7dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZT1uZXcgZigxLDEpO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPW51bGw7dGhpcy50cmFuc3BhcmVuY3k9MDt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBCYyhhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoUGhvbmdNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5zcGVjdWxhcj1uZXcgSSgxMTE4NDgxKTt0aGlzLnNoaW5pbmVzcz0zMDt0aGlzLmxpZ2h0TWFwPQp0aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEkoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuYnVtcE1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPQoicm91bmQiO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gJGQoYSl7QmMuY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1RPT046IiJ9O3RoaXMudHlwZT0iTWVzaFRvb25NYXRlcmlhbCI7dGhpcy5ncmFkaWVudE1hcD1udWxsO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGFlKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hOb3JtYWxNYXRlcmlhbCI7dGhpcy5idW1wTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPQp0aGlzLnNraW5uaW5nPXRoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGJlKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hMYW1iZXJ0TWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEkoMTY3NzcyMTUpO3RoaXMubGlnaHRNYXA9dGhpcy5tYXA9bnVsbDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTE7dGhpcy5hb01hcD1udWxsO3RoaXMuYW9NYXBJbnRlbnNpdHk9MTt0aGlzLmVtaXNzaXZlPW5ldyBJKDApO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MTt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9dGhpcy5lbWlzc2l2ZU1hcD1udWxsO3RoaXMuY29tYmluZT0wO3RoaXMucmVmbGVjdGl2aXR5PTE7dGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4O3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIjsKdGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBjZShhKXtNLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9O3RoaXMudHlwZT0iTWVzaE1hdGNhcE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmJ1bXBNYXA9dGhpcy5tYXA9dGhpcy5tYXRjYXA9bnVsbDt0aGlzLmJ1bXBTY2FsZT0xO3RoaXMubm9ybWFsTWFwPW51bGw7dGhpcy5ub3JtYWxNYXBUeXBlPTA7dGhpcy5ub3JtYWxTY2FsZT1uZXcgZigxLDEpO3RoaXMuZGlzcGxhY2VtZW50TWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMuYWxwaGFNYXA9bnVsbDt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGRlKGEpe0ZiLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIjt0aGlzLnNjYWxlPTE7dGhpcy5kYXNoU2l6ZT0zO3RoaXMuZ2FwU2l6ZT0xO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIG9jKGEsYyxlLGcpe3RoaXMucGFyYW1ldGVyUG9zaXRpb25zPWE7dGhpcy5fY2FjaGVkSW5kZXg9MDt0aGlzLnJlc3VsdEJ1ZmZlcj12b2lkIDAhPT1nP2c6bmV3IGMuY29uc3RydWN0b3IoZSk7dGhpcy5zYW1wbGVWYWx1ZXM9Yzt0aGlzLnZhbHVlU2l6ZT1lfWZ1bmN0aW9uIEVnKGEsYyxlLGcpe29jLmNhbGwodGhpcyxhLGMsZSxnKTt0aGlzLl9vZmZzZXROZXh0PXRoaXMuX3dlaWdodE5leHQ9dGhpcy5fb2Zmc2V0UHJldj10aGlzLl93ZWlnaHRQcmV2PS0wfWZ1bmN0aW9uIFlmKGEsYyxlLGcpe29jLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBGZyhhLGMsZSxnKXtvYy5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gWGIoYSxjLGUsZyl7aWYodm9pZCAwPT09YSl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQiKTsKaWYodm9pZCAwPT09Y3x8MD09PWMubGVuZ3RoKXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgIithKTt0aGlzLm5hbWU9YTt0aGlzLnRpbWVzPVRiLmNvbnZlcnRBcnJheShjLHRoaXMuVGltZUJ1ZmZlclR5cGUpO3RoaXMudmFsdWVzPVRiLmNvbnZlcnRBcnJheShlLHRoaXMuVmFsdWVCdWZmZXJUeXBlKTt0aGlzLnNldEludGVycG9sYXRpb24oZ3x8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gR2coYSxjLGUpe1hiLmNhbGwodGhpcyxhLGMsZSl9ZnVuY3Rpb24gSGcoYSxjLGUsZyl7WGIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIFNlKGEsYyxlLGcpe1hiLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBJZyhhLGMsZSxnKXtvYy5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gWmYoYSxjLGUsZyl7WGIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIEpnKGEsYyxlLGcpe1hiLmNhbGwodGhpcywKYSxjLGUsZyl9ZnVuY3Rpb24gVGUoYSxjLGUsZyl7WGIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIHRjKGEsYyxlKXt0aGlzLm5hbWU9YTt0aGlzLnRyYWNrcz1lO3RoaXMuZHVyYXRpb249dm9pZCAwIT09Yz9jOi0xO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTswPnRoaXMuZHVyYXRpb24mJnRoaXMucmVzZXREdXJhdGlvbigpfWZ1bmN0aW9uIG1tKGEpe3N3aXRjaChhLnRvTG93ZXJDYXNlKCkpe2Nhc2UgInNjYWxhciI6Y2FzZSAiZG91YmxlIjpjYXNlICJmbG9hdCI6Y2FzZSAibnVtYmVyIjpjYXNlICJpbnRlZ2VyIjpyZXR1cm4gU2U7Y2FzZSAidmVjdG9yIjpjYXNlICJ2ZWN0b3IyIjpjYXNlICJ2ZWN0b3IzIjpjYXNlICJ2ZWN0b3I0IjpyZXR1cm4gVGU7Y2FzZSAiY29sb3IiOnJldHVybiBIZztjYXNlICJxdWF0ZXJuaW9uIjpyZXR1cm4gWmY7Y2FzZSAiYm9vbCI6Y2FzZSAiYm9vbGVhbiI6cmV0dXJuIEdnO2Nhc2UgInN0cmluZyI6cmV0dXJuIEpnfXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIisKYSk7fWZ1bmN0aW9uIG5tKGEpe2lmKHZvaWQgMD09PWEudHlwZSl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UiKTt2YXIgYz1tbShhLnR5cGUpO2lmKHZvaWQgMD09PWEudGltZXMpe3ZhciBlPVtdLGc9W107VGIuZmxhdHRlbkpTT04oYS5rZXlzLGUsZywidmFsdWUiKTthLnRpbWVzPWU7YS52YWx1ZXM9Z31yZXR1cm4gdm9pZCAwIT09Yy5wYXJzZT9jLnBhcnNlKGEpOm5ldyBjKGEubmFtZSxhLnRpbWVzLGEudmFsdWVzLGEuaW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gJGgoYSxjLGUpe3ZhciBnPXRoaXMscj0hMSx2PTAsej0wLEU9dm9pZCAwO3RoaXMub25TdGFydD12b2lkIDA7dGhpcy5vbkxvYWQ9YTt0aGlzLm9uUHJvZ3Jlc3M9Yzt0aGlzLm9uRXJyb3I9ZTt0aGlzLml0ZW1TdGFydD1mdW5jdGlvbihGKXt6Kys7aWYoITE9PT1yJiZ2b2lkIDAhPT1nLm9uU3RhcnQpZy5vblN0YXJ0KEYsdix6KTtyPSEwfTsKdGhpcy5pdGVtRW5kPWZ1bmN0aW9uKEYpe3YrKztpZih2b2lkIDAhPT1nLm9uUHJvZ3Jlc3MpZy5vblByb2dyZXNzKEYsdix6KTtpZih2PT09eiYmKHI9ITEsdm9pZCAwIT09Zy5vbkxvYWQpKWcub25Mb2FkKCl9O3RoaXMuaXRlbUVycm9yPWZ1bmN0aW9uKEYpe2lmKHZvaWQgMCE9PWcub25FcnJvcilnLm9uRXJyb3IoRil9O3RoaXMucmVzb2x2ZVVSTD1mdW5jdGlvbihGKXtyZXR1cm4gRT9FKEYpOkZ9O3RoaXMuc2V0VVJMTW9kaWZpZXI9ZnVuY3Rpb24oRil7RT1GO3JldHVybiB0aGlzfX1mdW5jdGlvbiBEYihhKXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09YT9hOk9qO3RoaXMuY3Jvc3NPcmlnaW49ImFub255bW91cyI7dGhpcy5yZXNvdXJjZVBhdGg9dGhpcy5wYXRoPSIifWZ1bmN0aW9uIHVjKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBhaShhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gYmkoYSl7RGIuY2FsbCh0aGlzLGEpO3RoaXMuX3BhcnNlcj1udWxsfWZ1bmN0aW9uIEtnKGEpe0RiLmNhbGwodGhpcywKYSk7dGhpcy5fcGFyc2VyPW51bGx9ZnVuY3Rpb24gVWUoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIExnKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBNZyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gWmEoKXt0aGlzLnR5cGU9IkN1cnZlIjt0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz0yMDB9ZnVuY3Rpb24gcGMoYSxjLGUsZyxyLHYseixFKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRWxsaXBzZUN1cnZlIjt0aGlzLmFYPWF8fDA7dGhpcy5hWT1jfHwwO3RoaXMueFJhZGl1cz1lfHwxO3RoaXMueVJhZGl1cz1nfHwxO3RoaXMuYVN0YXJ0QW5nbGU9cnx8MDt0aGlzLmFFbmRBbmdsZT12fHwyKk1hdGguUEk7dGhpcy5hQ2xvY2t3aXNlPXp8fCExO3RoaXMuYVJvdGF0aW9uPUV8fDB9ZnVuY3Rpb24gVmUoYSxjLGUsZyxyLHYpe3BjLmNhbGwodGhpcyxhLGMsZSxlLGcscix2KTt0aGlzLnR5cGU9IkFyY0N1cnZlIn1mdW5jdGlvbiBjaSgpe2Z1bmN0aW9uIGEodix6LEUsCkYpe2M9djtlPUU7Zz0tMyp2KzMqei0yKkUtRjtyPTIqdi0yKnorRStGfXZhciBjPTAsZT0wLGc9MCxyPTA7cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHYseixFLEYsSil7YSh6LEUsSiooRS12KSxKKihGLXopKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHYseixFLEYsSixQLFIpe2EoeixFLCgoei12KS9KLShFLXYpLyhKK1ApKyhFLXopL1ApKlAsKChFLXopL1AtKEYteikvKFArUikrKEYtRSkvUikqUCl9LGNhbGM6ZnVuY3Rpb24odil7dmFyIHo9dip2O3JldHVybiBjK2UqditnKnorcip6KnZ9fX1mdW5jdGlvbiBaYihhLGMsZSxnKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2F0bXVsbFJvbUN1cnZlMyI7dGhpcy5wb2ludHM9YXx8W107dGhpcy5jbG9zZWQ9Y3x8ITE7dGhpcy5jdXJ2ZVR5cGU9ZXx8ImNlbnRyaXBldGFsIjt0aGlzLnRlbnNpb249Z3x8LjV9ZnVuY3Rpb24gUGooYSxjLGUsZyxyKXtjPS41KihnLWMpO3I9LjUqKHItZSk7dmFyIHY9CmEqYTtyZXR1cm4oMiplLTIqZytjK3IpKmEqdisoLTMqZSszKmctMipjLXIpKnYrYyphK2V9ZnVuY3Rpb24gb20oYSxjKXthPTEtYTtyZXR1cm4gYSphKmN9ZnVuY3Rpb24gcG0oYSxjKXtyZXR1cm4gMiooMS1hKSphKmN9ZnVuY3Rpb24gcW0oYSxjKXtyZXR1cm4gYSphKmN9ZnVuY3Rpb24gJGYoYSxjLGUsZyl7cmV0dXJuIG9tKGEsYykrcG0oYSxlKStxbShhLGcpfWZ1bmN0aW9uIHJtKGEsYyl7YT0xLWE7cmV0dXJuIGEqYSphKmN9ZnVuY3Rpb24gc20oYSxjKXt2YXIgZT0xLWE7cmV0dXJuIDMqZSplKmEqY31mdW5jdGlvbiB0bShhLGMpe3JldHVybiAzKigxLWEpKmEqYSpjfWZ1bmN0aW9uIHVtKGEsYyl7cmV0dXJuIGEqYSphKmN9ZnVuY3Rpb24gYWcoYSxjLGUsZyxyKXtyZXR1cm4gcm0oYSxjKStzbShhLGUpK3RtKGEsZykrdW0oYSxyKX1mdW5jdGlvbiBDYyhhLGMsZSxnKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSI7dGhpcy52MD1hfHxuZXcgZjsKdGhpcy52MT1jfHxuZXcgZjt0aGlzLnYyPWV8fG5ldyBmO3RoaXMudjM9Z3x8bmV3IGZ9ZnVuY3Rpb24gVGMoYSxjLGUsZyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIjt0aGlzLnYwPWF8fG5ldyBrO3RoaXMudjE9Y3x8bmV3IGs7dGhpcy52Mj1lfHxuZXcgazt0aGlzLnYzPWd8fG5ldyBrfWZ1bmN0aW9uIGtjKGEsYyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVDdXJ2ZSI7dGhpcy52MT1hfHxuZXcgZjt0aGlzLnYyPWN8fG5ldyBmfWZ1bmN0aW9uIERjKGEsYyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiO3RoaXMudjE9YXx8bmV3IGs7dGhpcy52Mj1jfHxuZXcga31mdW5jdGlvbiBFYyhhLGMsZSl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlF1YWRyYXRpY0JlemllckN1cnZlIjt0aGlzLnYwPWF8fG5ldyBmO3RoaXMudjE9Y3x8bmV3IGY7dGhpcy52Mj1lfHxuZXcgZn1mdW5jdGlvbiBVYyhhLGMsZSl7WmEuY2FsbCh0aGlzKTsKdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiO3RoaXMudjA9YXx8bmV3IGs7dGhpcy52MT1jfHxuZXcgazt0aGlzLnYyPWV8fG5ldyBrfWZ1bmN0aW9uIEZjKGEpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcGxpbmVDdXJ2ZSI7dGhpcy5wb2ludHM9YXx8W119ZnVuY3Rpb24gZ2QoKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3VydmVQYXRoIjt0aGlzLmN1cnZlcz1bXTt0aGlzLmF1dG9DbG9zZT0hMX1mdW5jdGlvbiBHYyhhKXtnZC5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGF0aCI7dGhpcy5jdXJyZW50UG9pbnQ9bmV3IGY7YSYmdGhpcy5zZXRGcm9tUG9pbnRzKGEpfWZ1bmN0aW9uIENkKGEpe0djLmNhbGwodGhpcyxhKTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy50eXBlPSJTaGFwZSI7dGhpcy5ob2xlcz1bXX1mdW5jdGlvbiBKYihhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpZ2h0Ijt0aGlzLmNvbG9yPW5ldyBJKGEpO3RoaXMuaW50ZW5zaXR5PQp2b2lkIDAhPT1jP2M6MTt0aGlzLnJlY2VpdmVTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIE5nKGEsYyxlKXtKYi5jYWxsKHRoaXMsYSxlKTt0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCI7dGhpcy5jYXN0U2hhZG93PXZvaWQgMDt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy5ncm91bmRDb2xvcj1uZXcgSShjKX1mdW5jdGlvbiBWYyhhKXt0aGlzLmNhbWVyYT1hO3RoaXMuYmlhcz0wO3RoaXMucmFkaXVzPTE7dGhpcy5tYXBTaXplPW5ldyBmKDUxMiw1MTIpO3RoaXMubWFwUGFzcz10aGlzLm1hcD1udWxsO3RoaXMubWF0cml4PW5ldyBxO3RoaXMuX2ZydXN0dW09bmV3IGljO3RoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgZigxLDEpO3RoaXMuX3ZpZXdwb3J0Q291bnQ9MTt0aGlzLl92aWV3cG9ydHM9W25ldyBwKDAsMCwxLDEpXX1mdW5jdGlvbiBPZygpe1ZjLmNhbGwodGhpcyxuZXcgdmIoNTAsMSwuNSw1MDApKX1mdW5jdGlvbiBQZyhhLApjLGUsZyxyLHYpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iU3BvdExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy50YXJnZXQ9bmV3IEE7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBvd2VyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbih6KXt0aGlzLmludGVuc2l0eT16L01hdGguUEl9fSk7dGhpcy5kaXN0YW5jZT12b2lkIDAhPT1lP2U6MDt0aGlzLmFuZ2xlPXZvaWQgMCE9PWc/ZzpNYXRoLlBJLzM7dGhpcy5wZW51bWJyYT12b2lkIDAhPT1yP3I6MDt0aGlzLmRlY2F5PXZvaWQgMCE9PXY/djoxO3RoaXMuc2hhZG93PW5ldyBPZ31mdW5jdGlvbiBkaSgpe1ZjLmNhbGwodGhpcyxuZXcgdmIoOTAsMSwuNSw1MDApKTt0aGlzLl9mcmFtZUV4dGVudHM9bmV3IGYoNCwyKTt0aGlzLl92aWV3cG9ydENvdW50PTY7dGhpcy5fdmlld3BvcnRzPVtuZXcgcCgyLAoxLDEsMSksbmV3IHAoMCwxLDEsMSksbmV3IHAoMywxLDEsMSksbmV3IHAoMSwxLDEsMSksbmV3IHAoMywwLDEsMSksbmV3IHAoMSwwLDEsMSldO3RoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgaygxLDAsMCksbmV3IGsoLTEsMCwwKSxuZXcgaygwLDAsMSksbmV3IGsoMCwwLC0xKSxuZXcgaygwLDEsMCksbmV3IGsoMCwtMSwwKV07dGhpcy5fY3ViZVVwcz1bbmV3IGsoMCwxLDApLG5ldyBrKDAsMSwwKSxuZXcgaygwLDEsMCksbmV3IGsoMCwxLDApLG5ldyBrKDAsMCwxKSxuZXcgaygwLDAsLTEpXX1mdW5jdGlvbiBRZyhhLGMsZSxnKXtKYi5jYWxsKHRoaXMsYSxjKTt0aGlzLnR5cGU9IlBvaW50TGlnaHQiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb3dlciIse2dldDpmdW5jdGlvbigpe3JldHVybiA0KnRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbihyKXt0aGlzLmludGVuc2l0eT1yLyg0Kk1hdGguUEkpfX0pO3RoaXMuZGlzdGFuY2U9dm9pZCAwIT09ZT8KZTowO3RoaXMuZGVjYXk9dm9pZCAwIT09Zz9nOjE7dGhpcy5zaGFkb3c9bmV3IGRpfWZ1bmN0aW9uIGJnKGEsYyxlLGcscix2KXt6Yi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT3J0aG9ncmFwaGljQ2FtZXJhIjt0aGlzLnpvb209MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmxlZnQ9dm9pZCAwIT09YT9hOi0xO3RoaXMucmlnaHQ9dm9pZCAwIT09Yz9jOjE7dGhpcy50b3A9dm9pZCAwIT09ZT9lOjE7dGhpcy5ib3R0b209dm9pZCAwIT09Zz9nOi0xO3RoaXMubmVhcj12b2lkIDAhPT1yP3I6LjE7dGhpcy5mYXI9dm9pZCAwIT09dj92OjJFMzt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBSZygpe1ZjLmNhbGwodGhpcyxuZXcgYmcoLTUsNSw1LC01LC41LDUwMCkpfWZ1bmN0aW9uIFNnKGEsYyl7SmIuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7CnRoaXMudGFyZ2V0PW5ldyBBO3RoaXMuc2hhZG93PW5ldyBSZ31mdW5jdGlvbiBUZyhhLGMpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iQW1iaWVudExpZ2h0Ijt0aGlzLmNhc3RTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIFVnKGEsYyxlLGcpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodCI7dGhpcy53aWR0aD12b2lkIDAhPT1lP2U6MTA7dGhpcy5oZWlnaHQ9dm9pZCAwIT09Zz9nOjEwfWZ1bmN0aW9uIFZnKGEpe0RiLmNhbGwodGhpcyxhKTt0aGlzLnRleHR1cmVzPXt9fWZ1bmN0aW9uIFdnKCl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLm1heEluc3RhbmNlZENvdW50PXZvaWQgMH1mdW5jdGlvbiBYZyhhLGMsZSxnKXsibnVtYmVyIj09PXR5cGVvZiBlJiYoZz1lLGU9ITEsY29uc29sZS5lcnJvcigiVEhSRUUuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiBUaGUgY29uc3RydWN0b3Igbm93IGV4cGVjdHMgbm9ybWFsaXplZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQuIikpOwpRLmNhbGwodGhpcyxhLGMsZSk7dGhpcy5tZXNoUGVyQXR0cmlidXRlPWd8fDF9ZnVuY3Rpb24gWWcoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIFpnKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBlaShhKXsidW5kZWZpbmVkIj09PXR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLiIpOyJ1bmRlZmluZWQiPT09dHlwZW9mIGZldGNoJiZjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuIik7RGIuY2FsbCh0aGlzLGEpO3RoaXMub3B0aW9ucz12b2lkIDB9ZnVuY3Rpb24gZmkoKXt0aGlzLnR5cGU9IlNoYXBlUGF0aCI7dGhpcy5jb2xvcj1uZXcgSTt0aGlzLnN1YlBhdGhzPVtdO3RoaXMuY3VycmVudFBhdGg9bnVsbH1mdW5jdGlvbiBnaShhKXt0aGlzLnR5cGU9IkZvbnQiO3RoaXMuZGF0YT0KYX1mdW5jdGlvbiB2bShhLGMsZSl7YT1BcnJheS5mcm9tP0FycmF5LmZyb20oYSk6U3RyaW5nKGEpLnNwbGl0KCIiKTtjLz1lLnJlc29sdXRpb247Zm9yKHZhciBnPShlLmJvdW5kaW5nQm94LnlNYXgtZS5ib3VuZGluZ0JveC55TWluK2UudW5kZXJsaW5lVGhpY2tuZXNzKSpjLHI9W10sdj0wLHo9MCxFPTA7RTxhLmxlbmd0aDtFKyspe3ZhciBGPWFbRV07IlxuIj09PUY/KHY9MCx6LT1nKTooRj13bShGLGMsdix6LGUpLHYrPUYub2Zmc2V0WCxyLnB1c2goRi5wYXRoKSl9cmV0dXJuIHJ9ZnVuY3Rpb24gd20oYSxjLGUsZyxyKXt2YXIgdj1yLmdseXBoc1thXXx8ci5nbHlwaHNbIj8iXTtpZih2KXthPW5ldyBmaTtpZih2Lm8pe3I9di5fY2FjaGVkT3V0bGluZXx8KHYuX2NhY2hlZE91dGxpbmU9di5vLnNwbGl0KCIgIikpO2Zvcih2YXIgej0wLEU9ci5sZW5ndGg7ejxFOylzd2l0Y2goclt6KytdKXtjYXNlICJtIjp2YXIgRj1yW3orK10qYytlO3ZhciBKPXJbeisrXSpjK2c7YS5tb3ZlVG8oRiwKSik7YnJlYWs7Y2FzZSAibCI6Rj1yW3orK10qYytlO0o9clt6KytdKmMrZzthLmxpbmVUbyhGLEopO2JyZWFrO2Nhc2UgInEiOkY9clt6KytdKmMrZTtKPXJbeisrXSpjK2c7dmFyIFA9clt6KytdKmMrZTt2YXIgUj1yW3orK10qYytnO2EucXVhZHJhdGljQ3VydmVUbyhQLFIsRixKKTticmVhaztjYXNlICJiIjpGPXJbeisrXSpjK2U7Sj1yW3orK10qYytnO1A9clt6KytdKmMrZTtSPXJbeisrXSpjK2c7dmFyIFM9clt6KytdKmMrZTt2YXIgVj1yW3orK10qYytnO2EuYmV6aWVyQ3VydmVUbyhQLFIsUyxWLEYsSil9fXJldHVybntvZmZzZXRYOnYuaGEqYyxwYXRoOmF9fWNvbnNvbGUuZXJyb3IoJ1RIUkVFLkZvbnQ6IGNoYXJhY3RlciAiJythKyciIGRvZXMgbm90IGV4aXN0cyBpbiBmb250IGZhbWlseSAnK3IuZmFtaWx5TmFtZSsiLiIpfWZ1bmN0aW9uIGhpKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiAkZyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gYWgoKXt0aGlzLmNvZWZmaWNpZW50cz0KW107Zm9yKHZhciBhPTA7OT5hO2ErKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBrKX1mdW5jdGlvbiBIYyhhLGMpe0piLmNhbGwodGhpcyx2b2lkIDAsYyk7dGhpcy5zaD12b2lkIDAhPT1hP2E6bmV3IGFofWZ1bmN0aW9uIGlpKGEsYyxlKXtIYy5jYWxsKHRoaXMsdm9pZCAwLGUpO2E9KG5ldyBJKS5zZXQoYSk7ZT0obmV3IEkpLnNldChjKTtjPW5ldyBrKGEucixhLmcsYS5iKTthPW5ldyBrKGUucixlLmcsZS5iKTtlPU1hdGguc3FydChNYXRoLlBJKTt2YXIgZz1lKk1hdGguc3FydCguNzUpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLmNvcHkoYykuYWRkKGEpLm11bHRpcGx5U2NhbGFyKGUpO3RoaXMuc2guY29lZmZpY2llbnRzWzFdLmNvcHkoYykuc3ViKGEpLm11bHRpcGx5U2NhbGFyKGcpfWZ1bmN0aW9uIGppKGEsYyl7SGMuY2FsbCh0aGlzLHZvaWQgMCxjKTthPShuZXcgSSkuc2V0KGEpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLnNldChhLnIsYS5nLGEuYikubXVsdGlwbHlTY2FsYXIoMioKTWF0aC5zcXJ0KE1hdGguUEkpKX1mdW5jdGlvbiBRaigpe3RoaXMudHlwZT0iU3RlcmVvQ2FtZXJhIjt0aGlzLmFzcGVjdD0xO3RoaXMuZXllU2VwPS4wNjQ7dGhpcy5jYW1lcmFMPW5ldyB2Yjt0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSgxKTt0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNhbWVyYVI9bmV3IHZiO3RoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpO3RoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuX2NhY2hlPXtmb2N1czpudWxsLGZvdjpudWxsLGFzcGVjdDpudWxsLG5lYXI6bnVsbCxmYXI6bnVsbCx6b29tOm51bGwsZXllU2VwOm51bGx9fWZ1bmN0aW9uIGtpKGEpe3RoaXMuYXV0b1N0YXJ0PXZvaWQgMCE9PWE/YTohMDt0aGlzLmVsYXBzZWRUaW1lPXRoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZT0wO3RoaXMucnVubmluZz0hMX1mdW5jdGlvbiBsaSgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkF1ZGlvTGlzdGVuZXIiOwp0aGlzLmNvbnRleHQ9bWkuZ2V0Q29udGV4dCgpO3RoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7dGhpcy5maWx0ZXI9bnVsbDt0aGlzLnRpbWVEZWx0YT0wO3RoaXMuX2Nsb2NrPW5ldyBraX1mdW5jdGlvbiBXZShhKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJBdWRpbyI7dGhpcy5saXN0ZW5lcj1hO3RoaXMuY29udGV4dD1hLmNvbnRleHQ7dGhpcy5nYWluPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7dGhpcy5nYWluLmNvbm5lY3QoYS5nZXRJbnB1dCgpKTt0aGlzLmF1dG9wbGF5PSExO3RoaXMuYnVmZmVyPW51bGw7dGhpcy5kZXR1bmU9MDt0aGlzLmxvb3A9ITE7dGhpcy5vZmZzZXQ9dGhpcy5zdGFydFRpbWU9MDt0aGlzLmR1cmF0aW9uPXZvaWQgMDt0aGlzLnBsYXliYWNrUmF0ZT0xO3RoaXMuaXNQbGF5aW5nPSExO3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSEwO3RoaXMuc291cmNlVHlwZT0KImVtcHR5Ijt0aGlzLmZpbHRlcnM9W119ZnVuY3Rpb24gbmkoYSl7V2UuY2FsbCh0aGlzLGEpO3RoaXMucGFubmVyPXRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTt0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWw9IkhSVEYiO3RoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKX1mdW5jdGlvbiBvaShhLGMpe3RoaXMuYW5hbHlzZXI9YS5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7dGhpcy5hbmFseXNlci5mZnRTaXplPXZvaWQgMCE9PWM/YzoyMDQ4O3RoaXMuZGF0YT1uZXcgVWludDhBcnJheSh0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KTthLmdldE91dHB1dCgpLmNvbm5lY3QodGhpcy5hbmFseXNlcil9ZnVuY3Rpb24gcGkoYSxjLGUpe3RoaXMuYmluZGluZz1hO3RoaXMudmFsdWVTaXplPWU7YT1GbG9hdDY0QXJyYXk7c3dpdGNoKGMpe2Nhc2UgInF1YXRlcm5pb24iOmM9dGhpcy5fc2xlcnA7YnJlYWs7Y2FzZSAic3RyaW5nIjpjYXNlICJib29sIjphPUFycmF5O2M9CnRoaXMuX3NlbGVjdDticmVhaztkZWZhdWx0OmM9dGhpcy5fbGVycH10aGlzLmJ1ZmZlcj1uZXcgYSg0KmUpO3RoaXMuX21peEJ1ZmZlclJlZ2lvbj1jO3RoaXMucmVmZXJlbmNlQ291bnQ9dGhpcy51c2VDb3VudD10aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MH1mdW5jdGlvbiBSaihhLGMsZSl7ZT1lfHwkYi5wYXJzZVRyYWNrTmFtZShjKTt0aGlzLl90YXJnZXRHcm91cD1hO3RoaXMuX2JpbmRpbmdzPWEuc3Vic2NyaWJlXyhjLGUpfWZ1bmN0aW9uICRiKGEsYyxlKXt0aGlzLnBhdGg9Yzt0aGlzLnBhcnNlZFBhdGg9ZXx8JGIucGFyc2VUcmFja05hbWUoYyk7dGhpcy5ub2RlPSRiLmZpbmROb2RlKGEsdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lKXx8YTt0aGlzLnJvb3ROb2RlPWF9ZnVuY3Rpb24gU2ooKXt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5fb2JqZWN0cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubkNhY2hlZE9iamVjdHNfPTA7dmFyIGE9Cnt9O3RoaXMuX2luZGljZXNCeVVVSUQ9YTtmb3IodmFyIGM9MCxlPWFyZ3VtZW50cy5sZW5ndGg7YyE9PWU7KytjKWFbYXJndW1lbnRzW2NdLnV1aWRdPWM7dGhpcy5fcGF0aHM9W107dGhpcy5fcGFyc2VkUGF0aHM9W107dGhpcy5fYmluZGluZ3M9W107dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoPXt9O3ZhciBnPXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGcuX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC1nLm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiBnLl9iaW5kaW5ncy5sZW5ndGh9fX1mdW5jdGlvbiBUaihhLGMsZSl7dGhpcy5fbWl4ZXI9YTt0aGlzLl9jbGlwPWM7dGhpcy5fbG9jYWxSb290PWV8fG51bGw7YT1jLnRyYWNrcztjPWEubGVuZ3RoO2U9QXJyYXkoYyk7Zm9yKHZhciBnPXtlbmRpbmdTdGFydDoyNDAwLGVuZGluZ0VuZDoyNDAwfSxyPTA7ciE9PQpjOysrcil7dmFyIHY9YVtyXS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtlW3JdPXY7di5zZXR0aW5ncz1nfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9Zzt0aGlzLl9pbnRlcnBvbGFudHM9ZTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPUFycmF5KGMpO3RoaXMuX3dlaWdodEludGVycG9sYW50PXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PXRoaXMuX2J5Q2xpcENhY2hlSW5kZXg9dGhpcy5fY2FjaGVJbmRleD1udWxsO3RoaXMubG9vcD0yMjAxO3RoaXMuX2xvb3BDb3VudD0tMTt0aGlzLl9zdGFydFRpbWU9bnVsbDt0aGlzLnRpbWU9MDt0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy53ZWlnaHQ9dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPXRoaXMudGltZVNjYWxlPTE7dGhpcy5yZXBldGl0aW9ucz1JbmZpbml0eTt0aGlzLnBhdXNlZD0hMTt0aGlzLmVuYWJsZWQ9ITA7dGhpcy5jbGFtcFdoZW5GaW5pc2hlZD0hMTt0aGlzLnplcm9TbG9wZUF0RW5kPXRoaXMuemVyb1Nsb3BlQXRTdGFydD0KITB9ZnVuY3Rpb24gcWkoYSl7dGhpcy5fcm9vdD1hO3RoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7dGhpcy50aW1lPXRoaXMuX2FjY3VJbmRleD0wO3RoaXMudGltZVNjYWxlPTF9ZnVuY3Rpb24gYmgoYSxjKXsic3RyaW5nIj09PXR5cGVvZiBhJiYoY29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLiIpLGE9Yyk7dGhpcy52YWx1ZT1hfWZ1bmN0aW9uIHJpKGEsYyxlKXtRZC5jYWxsKHRoaXMsYSxjKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9ZXx8MX1mdW5jdGlvbiBVaihhLGMsZSxnKXt0aGlzLnJheT1uZXcgRChhLGMpO3RoaXMubmVhcj1lfHwwO3RoaXMuZmFyPWd8fEluZmluaXR5O3RoaXMuY2FtZXJhPW51bGw7dGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7fSxMT0Q6e30sUG9pbnRzOnt0aHJlc2hvbGQ6MX0sU3ByaXRlOnt9fTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLnBhcmFtcyx7UG9pbnRDbG91ZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXljYXN0ZXI6IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gcGFyYW1zLlBvaW50cy4iKTsKcmV0dXJuIHRoaXMuUG9pbnRzfX19KX1mdW5jdGlvbiBWaihhLGMpe3JldHVybiBhLmRpc3RhbmNlLWMuZGlzdGFuY2V9ZnVuY3Rpb24gc2koYSxjLGUsZyl7aWYoITEhPT1hLnZpc2libGUmJihhLnJheWNhc3QoYyxlKSwhMD09PWcpKXthPWEuY2hpbGRyZW47Zz0wO2Zvcih2YXIgcj1hLmxlbmd0aDtnPHI7ZysrKXNpKGFbZ10sYyxlLCEwKX19ZnVuY3Rpb24gV2ooYSxjLGUpe3RoaXMucmFkaXVzPXZvaWQgMCE9PWE/YToxO3RoaXMucGhpPXZvaWQgMCE9PWM/YzowO3RoaXMudGhldGE9dm9pZCAwIT09ZT9lOjA7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gWGooYSxjLGUpe3RoaXMucmFkaXVzPXZvaWQgMCE9PWE/YToxO3RoaXMudGhldGE9dm9pZCAwIT09Yz9jOjA7dGhpcy55PXZvaWQgMCE9PWU/ZTowO3JldHVybiB0aGlzfWZ1bmN0aW9uIHRpKGEsYyl7dGhpcy5taW49dm9pZCAwIT09YT9hOm5ldyBmKEluZmluaXR5LEluZmluaXR5KTt0aGlzLm1heD12b2lkIDAhPT1jP2M6bmV3IGYoLUluZmluaXR5LAotSW5maW5pdHkpfWZ1bmN0aW9uIHVpKGEsYyl7dGhpcy5zdGFydD12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5lbmQ9dm9pZCAwIT09Yz9jOm5ldyBrfWZ1bmN0aW9uIGNnKGEpe0EuY2FsbCh0aGlzKTt0aGlzLm1hdGVyaWFsPWE7dGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXt9fWZ1bmN0aW9uIGRnKGEsYyxlLGcpe3RoaXMub2JqZWN0PWE7dGhpcy5zaXplPXZvaWQgMCE9PWM/YzoxO2E9dm9pZCAwIT09ZT9lOjE2NzExNjgwO2c9dm9pZCAwIT09Zz9nOjE7Yz0wOyhlPXRoaXMub2JqZWN0Lmdlb21ldHJ5KSYmZS5pc0dlb21ldHJ5P2M9MyplLmZhY2VzLmxlbmd0aDplJiZlLmlzQnVmZmVyR2VvbWV0cnkmJihjPWUuYXR0cmlidXRlcy5ub3JtYWwuY291bnQpO2U9bmV3IHZhO2M9bmV3IGNhKDYqYywzKTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGMpO0liLmNhbGwodGhpcyxlLG5ldyBGYih7Y29sb3I6YSxsaW5ld2lkdGg6Z30pKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX0KZnVuY3Rpb24gWGUoYSxjKXtBLmNhbGwodGhpcyk7dGhpcy5saWdodD1hO3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNvbG9yPWM7YT1uZXcgdmE7Yz1bMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsLTEsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsLTEsMV07Zm9yKHZhciBlPTAsZz0xOzMyPmU7ZSsrLGcrKyl7dmFyIHI9ZS8zMipNYXRoLlBJKjIsdj1nLzMyKk1hdGguUEkqMjtjLnB1c2goTWF0aC5jb3MociksTWF0aC5zaW4ociksMSxNYXRoLmNvcyh2KSxNYXRoLnNpbih2KSwxKX1hLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShjLDMpKTtjPW5ldyBGYih7Zm9nOiExfSk7dGhpcy5jb25lPW5ldyBJYihhLGMpO3RoaXMuYWRkKHRoaXMuY29uZSk7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBZaihhKXt2YXIgYz1bXTthJiZhLmlzQm9uZSYmYy5wdXNoKGEpOwpmb3IodmFyIGU9MDtlPGEuY2hpbGRyZW4ubGVuZ3RoO2UrKyljLnB1c2guYXBwbHkoYyxZaihhLmNoaWxkcmVuW2VdKSk7cmV0dXJuIGN9ZnVuY3Rpb24gWWUoYSl7Zm9yKHZhciBjPVlqKGEpLGU9bmV3IHZhLGc9W10scj1bXSx2PW5ldyBJKDAsMCwxKSx6PW5ldyBJKDAsMSwwKSxFPTA7RTxjLmxlbmd0aDtFKyspe3ZhciBGPWNbRV07Ri5wYXJlbnQmJkYucGFyZW50LmlzQm9uZSYmKGcucHVzaCgwLDAsMCksZy5wdXNoKDAsMCwwKSxyLnB1c2godi5yLHYuZyx2LmIpLHIucHVzaCh6LnIsei5nLHouYikpfWUuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGcsMykpO2UuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKHIsMykpO2c9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6MixkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSx0cmFuc3BhcmVudDohMH0pO0liLmNhbGwodGhpcyxlLGcpO3RoaXMucm9vdD1hO3RoaXMuYm9uZXM9Yzt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0KITF9ZnVuY3Rpb24gWmUoYSxjLGUpe3RoaXMubGlnaHQ9YTt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5jb2xvcj1lO2E9bmV3IEJkKGMsNCwyKTtjPW5ldyBMKHt3aXJlZnJhbWU6ITAsZm9nOiExfSk7eGEuY2FsbCh0aGlzLGEsYyk7dGhpcy5tYXRyaXg9dGhpcy5saWdodC5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiAkZShhLGMpe3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodEhlbHBlciI7dGhpcy5saWdodD1hO3RoaXMuY29sb3I9YzthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwtMSwwLDEsMSwwXSwzKSk7YS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtjPW5ldyBGYih7Zm9nOiExfSk7VmIuY2FsbCh0aGlzLGEsYyk7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzEsMSwwLC0xLDEsMCwtMSwtMSwwLAoxLDEsMCwtMSwtMSwwLDEsLTEsMF0sMykpO2EuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7dGhpcy5hZGQobmV3IHhhKGEsbmV3IEwoe3NpZGU6MSxmb2c6ITF9KSkpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gYWYoYSxjLGUpe0EuY2FsbCh0aGlzKTt0aGlzLmxpZ2h0PWE7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMubWF0cml4PWEubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuY29sb3I9ZTthPW5ldyBSZChjKTthLnJvdGF0ZVkoLjUqTWF0aC5QSSk7dGhpcy5tYXRlcmlhbD1uZXcgTCh7d2lyZWZyYW1lOiEwLGZvZzohMX0pO3ZvaWQgMD09PXRoaXMuY29sb3ImJih0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycz0yKTtjPWEuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2EuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKmMuY291bnQpLDMpKTt0aGlzLmFkZChuZXcgeGEoYSx0aGlzLm1hdGVyaWFsKSk7CnRoaXMudXBkYXRlKCl9ZnVuY3Rpb24gYmYoYSxjKXt0aGlzLmxpZ2h0UHJvYmU9YTt0aGlzLnNpemU9YzthPW5ldyBxYih7ZGVmaW5lczp7R0FNTUFfT1VUUFVUOiIifSx1bmlmb3Jtczp7c2g6e3ZhbHVlOnRoaXMubGlnaHRQcm9iZS5zaC5jb2VmZmljaWVudHN9LGludGVuc2l0eTp7dmFsdWU6dGhpcy5saWdodFByb2JlLmludGVuc2l0eX19LHZlcnRleFNoYWRlcjoidmFyeWluZyB2ZWMzIHZOb3JtYWw7XG52b2lkIG1haW4oKSB7XG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59IixmcmFnbWVudFNoYWRlcjoiI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2XG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgbm9ybWFsLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0Ly8gbWF0cml4IGlzIGFzc3VtZWQgdG8gYmUgb3J0aG9nb25hbFxuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIG5vcm1hbCwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgbGluZWFyVG9PdXRwdXQoIGluIHZlYzMgYSApIHtcblx0I2lmZGVmIEdBTU1BX09VVFBVVFxuXHRcdHJldHVybiBwb3coIGEsIHZlYzMoIDEuMCAvIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApICk7XG5cdCNlbHNlXG5cdFx0cmV0dXJuIGE7XG5cdCNlbmRpZlxufVxuLy8gc291cmNlOiBodHRwczovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9wYXBlcnMvZW52bWFwL2Vudm1hcC5wZGZcbnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7XG5cdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcblx0ZmxvYXQgeCBceDNkIG5vcm1hbC54LCB5IFx4M2Qgbm9ybWFsLnksIHogXHgzZCBub3JtYWwuejtcblx0Ly8gYmFuZCAwXG5cdHZlYzMgcmVzdWx0IFx4M2Qgc2hDb2VmZmljaWVudHNbIDAgXSAqIDAuODg2MjI3O1xuXHQvLyBiYW5kIDFcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0Ly8gYmFuZCAyXG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudW5pZm9ybSB2ZWMzIHNoWyA5IF07IC8vIHNoIGNvZWZmaWNpZW50c1xudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHk7IC8vIGxpZ2h0IHByb2JlIGludGVuc2l0eVxudmFyeWluZyB2ZWMzIHZOb3JtYWw7XG52b2lkIG1haW4oKSB7XG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2Qgc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBzaCApO1xuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCBSRUNJUFJPQ0FMX1BJICogaXJyYWRpYW5jZSAqIGludGVuc2l0eTtcblx0b3V0Z29pbmdMaWdodCBceDNkIGxpbmVhclRvT3V0cHV0KCBvdXRnb2luZ0xpZ2h0ICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIDEuMCApO1xufSJ9KTsKYz1uZXcgQmQoMSwzMiwxNik7eGEuY2FsbCh0aGlzLGMsYSk7dGhpcy5vbkJlZm9yZVJlbmRlcigpfWZ1bmN0aW9uIGNoKGEsYyxlLGcpe2E9YXx8MTA7Yz1jfHwxMDtlPW5ldyBJKHZvaWQgMCE9PWU/ZTo0NDczOTI0KTtnPW5ldyBJKHZvaWQgMCE9PWc/Zzo4OTQ3ODQ4KTt2YXIgcj1jLzIsdj1hL2Msej1hLzI7YT1bXTtmb3IodmFyIEU9W10sRj0wLEo9MCxQPS16O0Y8PWM7RisrLFArPXYpe2EucHVzaCgteiwwLFAseiwwLFApO2EucHVzaChQLDAsLXosUCwwLHopO3ZhciBSPUY9PT1yP2U6ZztSLnRvQXJyYXkoRSxKKTtKKz0zO1IudG9BcnJheShFLEopO0orPTM7Ui50b0FycmF5KEUsSik7Sis9MztSLnRvQXJyYXkoRSxKKTtKKz0zfWM9bmV3IHZhO2MuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGEsMykpO2MuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKEUsMykpO2U9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6Mn0pO0liLmNhbGwodGhpcyxjLGUpfWZ1bmN0aW9uIGRoKGEsCmMsZSxnLHIsdil7YT1hfHwxMDtjPWN8fDE2O2U9ZXx8ODtnPWd8fDY0O3I9bmV3IEkodm9pZCAwIT09cj9yOjQ0NzM5MjQpO3Y9bmV3IEkodm9pZCAwIT09dj92Ojg5NDc4NDgpO3ZhciB6PVtdLEU9W10sRjtmb3IoRj0wO0Y8PWM7RisrKXt2YXIgSj1GL2MqMipNYXRoLlBJO3ZhciBQPU1hdGguc2luKEopKmE7Sj1NYXRoLmNvcyhKKSphO3oucHVzaCgwLDAsMCk7ei5wdXNoKFAsMCxKKTt2YXIgUj1GJjE/cjp2O0UucHVzaChSLnIsUi5nLFIuYik7RS5wdXNoKFIucixSLmcsUi5iKX1mb3IoRj0wO0Y8PWU7RisrKXtSPUYmMT9yOnY7dmFyIFM9YS1hL2UqRjtmb3IoYz0wO2M8ZztjKyspSj1jL2cqMipNYXRoLlBJLFA9TWF0aC5zaW4oSikqUyxKPU1hdGguY29zKEopKlMsei5wdXNoKFAsMCxKKSxFLnB1c2goUi5yLFIuZyxSLmIpLEo9KGMrMSkvZyoyKk1hdGguUEksUD1NYXRoLnNpbihKKSpTLEo9TWF0aC5jb3MoSikqUyx6LnB1c2goUCwwLEopLEUucHVzaChSLnIsUi5nLFIuYil9YT0KbmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHosMykpO2EuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKEUsMykpO3o9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6Mn0pO0liLmNhbGwodGhpcyxhLHopfWZ1bmN0aW9uIGNmKGEsYyxlLGcpe3RoaXMuYXVkaW89YTt0aGlzLnJhbmdlPWN8fDE7dGhpcy5kaXZpc2lvbnNJbm5lckFuZ2xlPWV8fDE2O3RoaXMuZGl2aXNpb25zT3V0ZXJBbmdsZT1nfHwyO2E9bmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKigzKih0aGlzLmRpdmlzaW9uc0lubmVyQW5nbGUrMip0aGlzLmRpdmlzaW9uc091dGVyQW5nbGUpKzMpKSwzKSk7Yz1uZXcgRmIoe2NvbG9yOjY1MjgwfSk7ZT1uZXcgRmIoe2NvbG9yOjE2Nzc2OTYwfSk7VmIuY2FsbCh0aGlzLGEsW2UsY10pO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZWcoYSxjLGUsZyl7dGhpcy5vYmplY3Q9YTt0aGlzLnNpemU9dm9pZCAwIT09CmM/YzoxO2E9dm9pZCAwIT09ZT9lOjE2Nzc2OTYwO2c9dm9pZCAwIT09Zz9nOjE7Yz0wOyhlPXRoaXMub2JqZWN0Lmdlb21ldHJ5KSYmZS5pc0dlb21ldHJ5P2M9ZS5mYWNlcy5sZW5ndGg6Y29uc29sZS53YXJuKCJUSFJFRS5GYWNlTm9ybWFsc0hlbHBlcjogb25seSBUSFJFRS5HZW9tZXRyeSBpcyBzdXBwb3J0ZWQuIFVzZSBUSFJFRS5WZXJ0ZXhOb3JtYWxzSGVscGVyLCBpbnN0ZWFkLiIpO2U9bmV3IHZhO2M9bmV3IGNhKDYqYywzKTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGMpO0liLmNhbGwodGhpcyxlLG5ldyBGYih7Y29sb3I6YSxsaW5ld2lkdGg6Z30pKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBkZihhLGMsZSl7QS5jYWxsKHRoaXMpO3RoaXMubGlnaHQ9YTt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jb2xvcj1lOwp2b2lkIDA9PT1jJiYoYz0xKTthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbLWMsYywwLGMsYywwLGMsLWMsMCwtYywtYywwLC1jLGMsMF0sMykpO2M9bmV3IEZiKHtmb2c6ITF9KTt0aGlzLmxpZ2h0UGxhbmU9bmV3IFZiKGEsYyk7dGhpcy5hZGQodGhpcy5saWdodFBsYW5lKTthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMCwwLDAsMCwwLDFdLDMpKTt0aGlzLnRhcmdldExpbmU9bmV3IFZiKGEsYyk7dGhpcy5hZGQodGhpcy50YXJnZXRMaW5lKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGZnKGEpe2Z1bmN0aW9uIGMoVixXLGhhKXtlKFYsaGEpO2UoVyxoYSl9ZnVuY3Rpb24gZShWLFcpe3YucHVzaCgwLDAsMCk7ei5wdXNoKFcucixXLmcsVy5iKTt2b2lkIDA9PT1FW1ZdJiYoRVtWXT1bXSk7RVtWXS5wdXNoKHYubGVuZ3RoLzMtMSl9dmFyIGc9bmV3IHZhLHI9bmV3IEZiKHtjb2xvcjoxNjc3NzIxNSx2ZXJ0ZXhDb2xvcnM6MX0pLAp2PVtdLHo9W10sRT17fSxGPW5ldyBJKDE2NzU1MjAwKSxKPW5ldyBJKDE2NzExNjgwKSxQPW5ldyBJKDQzNzc1KSxSPW5ldyBJKDE2Nzc3MjE1KSxTPW5ldyBJKDMzNTU0NDMpO2MoIm4xIiwibjIiLEYpO2MoIm4yIiwibjQiLEYpO2MoIm40IiwibjMiLEYpO2MoIm4zIiwibjEiLEYpO2MoImYxIiwiZjIiLEYpO2MoImYyIiwiZjQiLEYpO2MoImY0IiwiZjMiLEYpO2MoImYzIiwiZjEiLEYpO2MoIm4xIiwiZjEiLEYpO2MoIm4yIiwiZjIiLEYpO2MoIm4zIiwiZjMiLEYpO2MoIm40IiwiZjQiLEYpO2MoInAiLCJuMSIsSik7YygicCIsIm4yIixKKTtjKCJwIiwibjMiLEopO2MoInAiLCJuNCIsSik7YygidTEiLCJ1MiIsUCk7YygidTIiLCJ1MyIsUCk7YygidTMiLCJ1MSIsUCk7YygiYyIsInQiLFIpO2MoInAiLCJjIixTKTtjKCJjbjEiLCJjbjIiLFMpO2MoImNuMyIsImNuNCIsUyk7YygiY2YxIiwiY2YyIixTKTtjKCJjZjMiLCJjZjQiLFMpO2cuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsCm5ldyBjYSh2LDMpKTtnLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBjYSh6LDMpKTtJYi5jYWxsKHRoaXMsZyxyKTt0aGlzLmNhbWVyYT1hO3RoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgmJnRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLnBvaW50TWFwPUU7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBQYihhLGMsZSxnLHIsdix6KXtlaC5zZXQocix2LHopLnVucHJvamVjdChnKTthPWNbYV07aWYodm9pZCAwIT09YSlmb3IoZT1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxjPTAsZz1hLmxlbmd0aDtjPGc7YysrKWUuc2V0WFlaKGFbY10sZWgueCxlaC55LGVoLnopfWZ1bmN0aW9uIGhkKGEsYyl7dGhpcy5vYmplY3Q9YTt2b2lkIDA9PT1jJiYoYz0xNjc3Njk2MCk7YT1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LAo0LDAsNCwxLDUsMiw2LDMsN10pO3ZhciBlPW5ldyBGbG9hdDMyQXJyYXkoMjQpLGc9bmV3IHZhO2cuc2V0SW5kZXgobmV3IFEoYSwxKSk7Zy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUShlLDMpKTtJYi5jYWxsKHRoaXMsZyxuZXcgRmIoe2NvbG9yOmN9KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZ2coYSxjKXt0aGlzLnR5cGU9IkJveDNIZWxwZXIiO3RoaXMuYm94PWE7Yz1jfHwxNjc3Njk2MDthPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKTt2YXIgZT1uZXcgdmE7ZS5zZXRJbmRleChuZXcgUShhLDEpKTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwtMSwtMSwxLC0xLC0xLC0xLC0xLDEsLTEsLTFdLDMpKTtJYi5jYWxsKHRoaXMsZSxuZXcgRmIoe2NvbG9yOmN9KSk7dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX0KZnVuY3Rpb24gaGcoYSxjLGUpe3RoaXMudHlwZT0iUGxhbmVIZWxwZXIiO3RoaXMucGxhbmU9YTt0aGlzLnNpemU9dm9pZCAwPT09Yz8xOmM7YT12b2lkIDAhPT1lP2U6MTY3NzY5NjA7Yz1uZXcgdmE7Yy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzEsLTEsMSwtMSwxLDEsLTEsLTEsMSwxLDEsMSwtMSwxLDEsLTEsLTEsMSwxLC0xLDEsMSwxLDEsMCwwLDEsMCwwLDBdLDMpKTtjLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1ZiLmNhbGwodGhpcyxjLG5ldyBGYih7Y29sb3I6YX0pKTtjPW5ldyB2YTtjLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsLTEsMSwxLC0xLDFdLDMpKTtjLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3RoaXMuYWRkKG5ldyB4YShjLG5ldyBMKHtjb2xvcjphLG9wYWNpdHk6LjIsdHJhbnNwYXJlbnQ6ITAsZGVwdGhXcml0ZTohMX0pKSl9ZnVuY3Rpb24gaWQoYSxjLGUsZyxyLHYpe0EuY2FsbCh0aGlzKTsKdm9pZCAwPT09YSYmKGE9bmV3IGsoMCwwLDEpKTt2b2lkIDA9PT1jJiYoYz1uZXcgaygwLDAsMCkpO3ZvaWQgMD09PWUmJihlPTEpO3ZvaWQgMD09PWcmJihnPTE2Nzc2OTYwKTt2b2lkIDA9PT1yJiYocj0uMiplKTt2b2lkIDA9PT12JiYodj0uMipyKTt2b2lkIDA9PT1maCYmKGZoPW5ldyB2YSxmaC5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzAsMCwwLDAsMSwwXSwzKSksdmk9bmV3IGZkKDAsLjUsMSw1LDEpLHZpLnRyYW5zbGF0ZSgwLC0uNSwwKSk7dGhpcy5wb3NpdGlvbi5jb3B5KGMpO3RoaXMubGluZT1uZXcgVmIoZmgsbmV3IEZiKHtjb2xvcjpnfSkpO3RoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuYWRkKHRoaXMubGluZSk7dGhpcy5jb25lPW5ldyB4YSh2aSxuZXcgTCh7Y29sb3I6Z30pKTt0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmFkZCh0aGlzLmNvbmUpO3RoaXMuc2V0RGlyZWN0aW9uKGEpO3RoaXMuc2V0TGVuZ3RoKGUsCnIsdil9ZnVuY3Rpb24gaWcoYSl7YT1hfHwxO3ZhciBjPVswLDAsMCxhLDAsMCwwLDAsMCwwLGEsMCwwLDAsMCwwLDAsYV07YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoYywzKSk7YS5hZGRBdHRyaWJ1dGUoImNvbG9yIixuZXcgY2EoWzEsMCwwLDEsLjYsMCwwLDEsMCwuNiwxLDAsMCwwLDEsMCwuNiwxXSwzKSk7Yz1uZXcgRmIoe3ZlcnRleENvbG9yczoyfSk7SWIuY2FsbCh0aGlzLGEsYyl9ZnVuY3Rpb24gWmooYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DbG9zZWRTcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTtaYi5jYWxsKHRoaXMsYSk7dGhpcy50eXBlPSJjYXRtdWxscm9tIjt0aGlzLmNsb3NlZD0hMH1mdW5jdGlvbiBhayhhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpOwpaYi5jYWxsKHRoaXMsYSk7dGhpcy50eXBlPSJjYXRtdWxscm9tIn1mdW5jdGlvbiB3aShhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwbGluZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpO1piLmNhbGwodGhpcyxhKTt0aGlzLnR5cGU9ImNhdG11bGxyb20ifXZvaWQgMD09PU51bWJlci5FUFNJTE9OJiYoTnVtYmVyLkVQU0lMT049TWF0aC5wb3coMiwtNTIpKTt2b2lkIDA9PT1OdW1iZXIuaXNJbnRlZ2VyJiYoTnVtYmVyLmlzSW50ZWdlcj1mdW5jdGlvbihhKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBhJiZpc0Zpbml0ZShhKSYmTWF0aC5mbG9vcihhKT09PWF9KTt2b2lkIDA9PT1NYXRoLnNpZ24mJihNYXRoLnNpZ249ZnVuY3Rpb24oYSl7cmV0dXJuIDA+YT8tMTowPGE/MTorYX0pOyExPT09Im5hbWUiaW4gRnVuY3Rpb24ucHJvdG90eXBlJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCJuYW1lIiwKe2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvblxzKihbXlwoXHNdKikvKVsxXX19KTt2b2lkIDA9PT1PYmplY3QuYXNzaWduJiYoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhKXtpZih2b2lkIDA9PT1hfHxudWxsPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIGM9T2JqZWN0KGEpLGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgZz1hcmd1bWVudHNbZV07aWYodm9pZCAwIT09ZyYmbnVsbCE9PWcpZm9yKHZhciByIGluIGcpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGcscikmJihjW3JdPWdbcl0pfXJldHVybiBjfSk7T2JqZWN0LmFzc2lnbihkLnByb3RvdHlwZSx7YWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PXRoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycz17fSk7dmFyIGU9CnRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1lW2FdJiYoZVthXT1bXSk7LTE9PT1lW2FdLmluZGV4T2YoYykmJmVbYV0ucHVzaChjKX0saGFzRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMD09PXRoaXMuX2xpc3RlbmVycylyZXR1cm4hMTt2YXIgZT10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIHZvaWQgMCE9PWVbYV0mJi0xIT09ZVthXS5pbmRleE9mKGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09dGhpcy5fbGlzdGVuZXJzJiYoYT10aGlzLl9saXN0ZW5lcnNbYV0sdm9pZCAwIT09YSYmKGM9YS5pbmRleE9mKGMpLC0xIT09YyYmYS5zcGxpY2UoYywxKSkpfSxkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGEpe2lmKHZvaWQgMCE9PXRoaXMuX2xpc3RlbmVycyl7dmFyIGM9dGhpcy5fbGlzdGVuZXJzW2EudHlwZV07aWYodm9pZCAwIT09Yyl7YS50YXJnZXQ9dGhpcztjPWMuc2xpY2UoMCk7Zm9yKHZhciBlPTAsZz1jLmxlbmd0aDtlPGc7ZSsrKWNbZV0uY2FsbCh0aGlzLAphKX19fX0pO2Zvcih2YXIgWWI9W10samc9MDsyNTY+amc7amcrKylZYltqZ109KDE2PmpnPyIwIjoiIikramcudG9TdHJpbmcoMTYpO3ZhciBoYj17REVHMlJBRDpNYXRoLlBJLzE4MCxSQUQyREVHOjE4MC9NYXRoLlBJLGdlbmVyYXRlVVVJRDpmdW5jdGlvbigpe3ZhciBhPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGM9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxnPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwO3JldHVybihZYlthJjI1NV0rWWJbYT4+OCYyNTVdK1liW2E+PjE2JjI1NV0rWWJbYT4+MjQmMjU1XSsiLSIrWWJbYyYyNTVdK1liW2M+PjgmMjU1XSsiLSIrWWJbYz4+MTYmMTV8NjRdK1liW2M+PjI0JjI1NV0rIi0iK1liW2UmNjN8MTI4XStZYltlPj44JjI1NV0rIi0iK1liW2U+PjE2JjI1NV0rWWJbZT4+MjQmMjU1XStZYltnJjI1NV0rWWJbZz4+OCYyNTVdK1liW2c+PjE2JjI1NV0rWWJbZz4+MjQmMjU1XSkudG9VcHBlckNhc2UoKX0sCmNsYW1wOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gTWF0aC5tYXgoYyxNYXRoLm1pbihlLGEpKX0sZXVjbGlkZWFuTW9kdWxvOmZ1bmN0aW9uKGEsYyl7cmV0dXJuKGElYytjKSVjfSxtYXBMaW5lYXI6ZnVuY3Rpb24oYSxjLGUsZyxyKXtyZXR1cm4gZysoYS1jKSooci1nKS8oZS1jKX0sbGVycDpmdW5jdGlvbihhLGMsZSl7cmV0dXJuKDEtZSkqYStlKmN9LHNtb290aHN0ZXA6ZnVuY3Rpb24oYSxjLGUpe2lmKGE8PWMpcmV0dXJuIDA7aWYoYT49ZSlyZXR1cm4gMTthPShhLWMpLyhlLWMpO3JldHVybiBhKmEqKDMtMiphKX0sc21vb3RoZXJzdGVwOmZ1bmN0aW9uKGEsYyxlKXtpZihhPD1jKXJldHVybiAwO2lmKGE+PWUpcmV0dXJuIDE7YT0oYS1jKS8oZS1jKTtyZXR1cm4gYSphKmEqKGEqKDYqYS0xNSkrMTApfSxyYW5kSW50OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGErTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihjLWErMSkpfSxyYW5kRmxvYXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYSsKTWF0aC5yYW5kb20oKSooYy1hKX0scmFuZEZsb2F0U3ByZWFkOmZ1bmN0aW9uKGEpe3JldHVybiBhKiguNS1NYXRoLnJhbmRvbSgpKX0sZGVnVG9SYWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEqaGIuREVHMlJBRH0scmFkVG9EZWc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEqaGIuUkFEMkRFR30saXNQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe3JldHVybiAwPT09KGEmYS0xKSYmMCE9PWF9LGNlaWxQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnBvdygyLE1hdGguY2VpbChNYXRoLmxvZyhhKS9NYXRoLkxOMikpfSxmbG9vclBvd2VyT2ZUd286ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhhKS9NYXRoLkxOMikpfX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZi5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy54PWF9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnl9LApzZXQ6ZnVuY3Rpb24oYSl7dGhpcy55PWF9fX0pO09iamVjdC5hc3NpZ24oZi5wcm90b3R5cGUse2lzVmVjdG9yMjohMCxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YTt0aGlzLnk9YztyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueT10aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihhKXt0aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihhKXt0aGlzLnk9YTtyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEsYyl7c3dpdGNoKGEpe2Nhc2UgMDp0aGlzLng9YzticmVhaztjYXNlIDE6dGhpcy55PWM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2EpO31yZXR1cm4gdGhpc30sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrCmEpO319LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMueD1hLng7dGhpcy55PWEueTtyZXR1cm4gdGhpc30sYWRkOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKGEsYyk7dGhpcy54Kz1hLng7dGhpcy55Kz1hLnk7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngrPWE7dGhpcy55Kz1hO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy54PWEueCtjLng7dGhpcy55PWEueStjLnk7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihhLGMpe3RoaXMueCs9YS54KmM7dGhpcy55Kz1hLnkqYztyZXR1cm4gdGhpc30sCnN1YjpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyhhLGMpO3RoaXMueC09YS54O3RoaXMueS09YS55O3JldHVybiB0aGlzfSxzdWJTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54LT1hO3RoaXMueS09YTtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngtYy54O3RoaXMueT1hLnktYy55O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhKXt0aGlzLngqPWEueDt0aGlzLnkqPWEueTtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hO3RoaXMueSo9YTtyZXR1cm4gdGhpc30sZGl2aWRlOmZ1bmN0aW9uKGEpe3RoaXMueC89YS54O3RoaXMueS89YS55O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYSl9LGFwcGx5TWF0cml4MzpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngsZT10aGlzLnk7YT1hLmVsZW1lbnRzO3RoaXMueD1hWzBdKmMrYVszXSplK2FbNl07dGhpcy55PWFbMV0qYythWzRdKmUrYVs3XTtyZXR1cm4gdGhpc30sbWluOmZ1bmN0aW9uKGEpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYS54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LGEueSk7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGEueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxhLnkpO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLngsTWF0aC5taW4oYy54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLnksTWF0aC5taW4oYy55LHRoaXMueSkpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEsTWF0aC5taW4oYywKdGhpcy55KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoZXx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYSxNYXRoLm1pbihjLGUpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3JldHVybiB0aGlzfSxjZWlsOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguY2VpbCh0aGlzLngpO3RoaXMueT1NYXRoLmNlaWwodGhpcy55KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpO3RoaXMueT1NYXRoLnJvdW5kKHRoaXMueSk7cmV0dXJuIHRoaXN9LHJvdW5kVG9aZXJvOmZ1bmN0aW9uKCl7dGhpcy54PTA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpOwpyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueCt0aGlzLnkqYS55fSxjcm9zczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueS10aGlzLnkqYS54fSxsZW5ndGhTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfSxhbmdsZTpmdW5jdGlvbigpe3ZhciBhPU1hdGguYXRhbjIodGhpcy55LHRoaXMueCk7MD5hJiYoYSs9MipNYXRoLlBJKTtyZXR1cm4gYX0sCmRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGEpKX0sZGlzdGFuY2VUb1NxdWFyZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LWEueDthPXRoaXMueS1hLnk7cmV0dXJuIGMqYythKmF9LG1hbmhhdHRhbkRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1hLngpK01hdGguYWJzKHRoaXMueS1hLnkpfSxzZXRMZW5ndGg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoYSl9LGxlcnA6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPShhLngtdGhpcy54KSpjO3RoaXMueSs9KGEueS10aGlzLnkpKmM7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGMsYSkubXVsdGlwbHlTY2FsYXIoZSkuYWRkKGEpfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueD09PXRoaXMueCYmYS55PT09dGhpcy55fSwKZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy54PWFbY107dGhpcy55PWFbYysxXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTthW2NdPXRoaXMueDthW2MrMV09dGhpcy55O3JldHVybiBhfSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTt0aGlzLng9YS5nZXRYKGMpO3RoaXMueT1hLmdldFkoYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZUFyb3VuZDpmdW5jdGlvbihhLGMpe3ZhciBlPU1hdGguY29zKGMpO2M9TWF0aC5zaW4oYyk7dmFyIGc9dGhpcy54LWEueCxyPXRoaXMueS1hLnk7dGhpcy54PWcqZS1yKmMrYS54O3RoaXMueT1nKmMrciplK2EueTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKGgsCntzbGVycDpmdW5jdGlvbihhLGMsZSxnKXtyZXR1cm4gZS5jb3B5KGEpLnNsZXJwKGMsZyl9LHNsZXJwRmxhdDpmdW5jdGlvbihhLGMsZSxnLHIsdix6KXt2YXIgRT1lW2crMF0sRj1lW2crMV0sSj1lW2crMl07ZT1lW2crM107Zz1yW3YrMF07dmFyIFA9clt2KzFdLFI9clt2KzJdO3I9clt2KzNdO2lmKGUhPT1yfHxFIT09Z3x8RiE9PVB8fEohPT1SKXt2PTEtejt2YXIgUz1FKmcrRipQK0oqUitlKnIsVj0wPD1TPzE6LTEsVz0xLVMqUztXPk51bWJlci5FUFNJTE9OJiYoVz1NYXRoLnNxcnQoVyksUz1NYXRoLmF0YW4yKFcsUypWKSx2PU1hdGguc2luKHYqUykvVyx6PU1hdGguc2luKHoqUykvVyk7Vio9ejtFPUUqditnKlY7Rj1GKnYrUCpWO0o9Sip2K1IqVjtlPWUqdityKlY7dj09PTEteiYmKHo9MS9NYXRoLnNxcnQoRSpFK0YqRitKKkorZSplKSxFKj16LEYqPXosSio9eixlKj16KX1hW2NdPUU7YVtjKzFdPUY7YVtjKzJdPUo7YVtjKzNdPWV9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaC5wcm90b3R5cGUsCnt4OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3k9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx6OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fen0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3o9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx3OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3c9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fX0pO09iamVjdC5hc3NpZ24oaC5wcm90b3R5cGUse2lzUXVhdGVybmlvbjohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5feD1hO3RoaXMuX3k9Yzt0aGlzLl96PWU7dGhpcy5fdz1nO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCwKdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YS54O3RoaXMuX3k9YS55O3RoaXMuX3o9YS56O3RoaXMuX3c9YS53O3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbUV1bGVyOmZ1bmN0aW9uKGEsYyl7aWYoIWF8fCFhLmlzRXVsZXIpdGhyb3cgRXJyb3IoIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3ZhciBlPWEuX3gsZz1hLl95LHI9YS5fejthPWEub3JkZXI7dmFyIHY9TWF0aC5jb3Msej1NYXRoLnNpbixFPXYoZS8yKSxGPXYoZy8yKTt2PXYoci8yKTtlPXooZS8yKTtnPXooZy8yKTtyPXooci8yKTsiWFlaIj09PWE/KHRoaXMuX3g9ZSpGKnYrRSpnKnIsdGhpcy5feT1FKmcqdi1lKkYqcix0aGlzLl96PUUqRipyK2UqZyp2LHRoaXMuX3c9RSpGKnYtZSpnKnIpOiJZWFoiPT09CmE/KHRoaXMuX3g9ZSpGKnYrRSpnKnIsdGhpcy5feT1FKmcqdi1lKkYqcix0aGlzLl96PUUqRipyLWUqZyp2LHRoaXMuX3c9RSpGKnYrZSpnKnIpOiJaWFkiPT09YT8odGhpcy5feD1lKkYqdi1FKmcqcix0aGlzLl95PUUqZyp2K2UqRipyLHRoaXMuX3o9RSpGKnIrZSpnKnYsdGhpcy5fdz1FKkYqdi1lKmcqcik6IlpZWCI9PT1hPyh0aGlzLl94PWUqRip2LUUqZypyLHRoaXMuX3k9RSpnKnYrZSpGKnIsdGhpcy5fej1FKkYqci1lKmcqdix0aGlzLl93PUUqRip2K2UqZypyKToiWVpYIj09PWE/KHRoaXMuX3g9ZSpGKnYrRSpnKnIsdGhpcy5feT1FKmcqditlKkYqcix0aGlzLl96PUUqRipyLWUqZyp2LHRoaXMuX3c9RSpGKnYtZSpnKnIpOiJYWlkiPT09YSYmKHRoaXMuX3g9ZSpGKnYtRSpnKnIsdGhpcy5feT1FKmcqdi1lKkYqcix0aGlzLl96PUUqRipyK2UqZyp2LHRoaXMuX3c9RSpGKnYrZSpnKnIpOyExIT09YyYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGEsCmMpe2MvPTI7dmFyIGU9TWF0aC5zaW4oYyk7dGhpcy5feD1hLngqZTt0aGlzLl95PWEueSplO3RoaXMuX3o9YS56KmU7dGhpcy5fdz1NYXRoLmNvcyhjKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbihhKXt2YXIgYz1hLmVsZW1lbnRzLGU9Y1swXTthPWNbNF07dmFyIGc9Y1s4XSxyPWNbMV0sdj1jWzVdLHo9Y1s5XSxFPWNbMl0sRj1jWzZdO2M9Y1sxMF07dmFyIEo9ZSt2K2M7MDxKPyhlPS41L01hdGguc3FydChKKzEpLHRoaXMuX3c9LjI1L2UsdGhpcy5feD0oRi16KSplLHRoaXMuX3k9KGctRSkqZSx0aGlzLl96PShyLWEpKmUpOmU+diYmZT5jPyhlPTIqTWF0aC5zcXJ0KDErZS12LWMpLHRoaXMuX3c9KEYteikvZSx0aGlzLl94PS4yNSplLHRoaXMuX3k9KGErcikvZSx0aGlzLl96PShnK0UpL2UpOnY+Yz8oZT0yKk1hdGguc3FydCgxK3YtZS1jKSx0aGlzLl93PShnLUUpL2UsdGhpcy5feD0oYStyKS9lLAp0aGlzLl95PS4yNSplLHRoaXMuX3o9KHorRikvZSk6KGU9MipNYXRoLnNxcnQoMStjLWUtdiksdGhpcy5fdz0oci1hKS9lLHRoaXMuX3g9KGcrRSkvZSx0aGlzLl95PSh6K0YpL2UsdGhpcy5fej0uMjUqZSk7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tVW5pdFZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLmRvdChjKSsxOzFFLTY+ZT8oZT0wLE1hdGguYWJzKGEueCk+TWF0aC5hYnMoYS56KT8odGhpcy5feD0tYS55LHRoaXMuX3k9YS54LHRoaXMuX3o9MCk6KHRoaXMuX3g9MCx0aGlzLl95PS1hLnosdGhpcy5fej1hLnkpKToodGhpcy5feD1hLnkqYy56LWEueipjLnksdGhpcy5feT1hLnoqYy54LWEueCpjLnosdGhpcy5fej1hLngqYy55LWEueSpjLngpO3RoaXMuX3c9ZTtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKX0sYW5nbGVUbzpmdW5jdGlvbihhKXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoaGIuY2xhbXAodGhpcy5kb3QoYSksLTEsCjEpKSl9LHJvdGF0ZVRvd2FyZHM6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmFuZ2xlVG8oYSk7aWYoMD09PWUpcmV0dXJuIHRoaXM7dGhpcy5zbGVycChhLE1hdGgubWluKDEsYy9lKSk7cmV0dXJuIHRoaXN9LGludmVyc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25qdWdhdGUoKX0sY29uanVnYXRlOmZ1bmN0aW9uKCl7dGhpcy5feCo9LTE7dGhpcy5feSo9LTE7dGhpcy5feio9LTE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3gqYS5feCt0aGlzLl95KmEuX3krdGhpcy5feiphLl96K3RoaXMuX3cqYS5fd30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feioKdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfSxub3JtYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmxlbmd0aCgpOzA9PT1hPyh0aGlzLl96PXRoaXMuX3k9dGhpcy5feD0wLHRoaXMuX3c9MSk6KGE9MS9hLHRoaXMuX3gqPWEsdGhpcy5feSo9YSx0aGlzLl96Kj1hLHRoaXMuX3cqPWEpO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdm9pZCAwIT09Yz8oY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoYSxjKSk6dGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsYSl9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoYSx0aGlzKX0sbXVsdGlwbHlRdWF0ZXJuaW9uczpmdW5jdGlvbihhLApjKXt2YXIgZT1hLl94LGc9YS5feSxyPWEuX3o7YT1hLl93O3ZhciB2PWMuX3gsej1jLl95LEU9Yy5fejtjPWMuX3c7dGhpcy5feD1lKmMrYSp2K2cqRS1yKno7dGhpcy5feT1nKmMrYSp6K3Iqdi1lKkU7dGhpcy5fej1yKmMrYSpFK2Uqei1nKnY7dGhpcy5fdz1hKmMtZSp2LWcqei1yKkU7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzbGVycDpmdW5jdGlvbihhLGMpe2lmKDA9PT1jKXJldHVybiB0aGlzO2lmKDE9PT1jKXJldHVybiB0aGlzLmNvcHkoYSk7dmFyIGU9dGhpcy5feCxnPXRoaXMuX3kscj10aGlzLl96LHY9dGhpcy5fdyx6PXYqYS5fdytlKmEuX3grZyphLl95K3IqYS5fejswPno/KHRoaXMuX3c9LWEuX3csdGhpcy5feD0tYS5feCx0aGlzLl95PS1hLl95LHRoaXMuX3o9LWEuX3osej0teik6dGhpcy5jb3B5KGEpO2lmKDE8PXopcmV0dXJuIHRoaXMuX3c9dix0aGlzLl94PWUsdGhpcy5feT1nLHRoaXMuX3o9cix0aGlzO2E9MS16Kno7aWYoYTw9TnVtYmVyLkVQU0lMT04pcmV0dXJuIHo9CjEtYyx0aGlzLl93PXoqditjKnRoaXMuX3csdGhpcy5feD16KmUrYyp0aGlzLl94LHRoaXMuX3k9eipnK2MqdGhpcy5feSx0aGlzLl96PXoqcitjKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpczthPU1hdGguc3FydChhKTt2YXIgRT1NYXRoLmF0YW4yKGEseik7ej1NYXRoLnNpbigoMS1jKSpFKS9hO2M9TWF0aC5zaW4oYypFKS9hO3RoaXMuX3c9dip6K3RoaXMuX3cqYzt0aGlzLl94PWUqeit0aGlzLl94KmM7dGhpcy5feT1nKnordGhpcy5feSpjO3RoaXMuX3o9cip6K3RoaXMuX3oqYzt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5feD09PXRoaXMuX3gmJmEuX3k9PT10aGlzLl95JiZhLl96PT09dGhpcy5feiYmYS5fdz09PXRoaXMuX3d9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMuX3g9YVtjXTt0aGlzLl95PWFbYysxXTsKdGhpcy5fej1hW2MrMl07dGhpcy5fdz1hW2MrM107dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO2FbY109dGhpcy5feDthW2MrMV09dGhpcy5feTthW2MrMl09dGhpcy5fejthW2MrM109dGhpcy5fdztyZXR1cm4gYX0sX29uQ2hhbmdlOmZ1bmN0aW9uKGEpe3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9YTtyZXR1cm4gdGhpc30sX29uQ2hhbmdlQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9fSk7dmFyIHhpPW5ldyBrLGJrPW5ldyBoO09iamVjdC5hc3NpZ24oay5wcm90b3R5cGUse2lzVmVjdG9yMzohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUpe3RoaXMueD1hO3RoaXMueT1jO3RoaXMuej1lO3JldHVybiB0aGlzfSxzZXRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy56PXRoaXMueT10aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihhKXt0aGlzLng9YTtyZXR1cm4gdGhpc30sCnNldFk6ZnVuY3Rpb24oYSl7dGhpcy55PWE7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYSl7dGhpcy56PWE7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudDpmdW5jdGlvbihhLGMpe3N3aXRjaChhKXtjYXNlIDA6dGhpcy54PWM7YnJlYWs7Y2FzZSAxOnRoaXMueT1jO2JyZWFrO2Nhc2UgMjp0aGlzLno9YzticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fXJldHVybiB0aGlzfSxnZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueil9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy54PWEueDt0aGlzLnk9YS55Owp0aGlzLno9YS56O3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnMoYSxjKTt0aGlzLngrPWEueDt0aGlzLnkrPWEueTt0aGlzLnorPWEuejtyZXR1cm4gdGhpc30sYWRkU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCs9YTt0aGlzLnkrPWE7dGhpcy56Kz1hO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy54PWEueCtjLng7dGhpcy55PWEueStjLnk7dGhpcy56PWEueitjLno7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihhLGMpe3RoaXMueCs9YS54KmM7dGhpcy55Kz1hLnkqYzt0aGlzLnorPWEueipjO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSwKdGhpcy5zdWJWZWN0b3JzKGEsYyk7dGhpcy54LT1hLng7dGhpcy55LT1hLnk7dGhpcy56LT1hLno7cmV0dXJuIHRoaXN9LHN1YlNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngtPWE7dGhpcy55LT1hO3RoaXMuei09YTtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngtYy54O3RoaXMueT1hLnktYy55O3RoaXMuej1hLnotYy56O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5VmVjdG9ycyhhLGMpO3RoaXMueCo9YS54O3RoaXMueSo9YS55O3RoaXMueio9YS56O3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngqPWE7dGhpcy55Kj1hO3RoaXMueio9CmE7cmV0dXJuIHRoaXN9LG11bHRpcGx5VmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngqYy54O3RoaXMueT1hLnkqYy55O3RoaXMuej1hLnoqYy56O3JldHVybiB0aGlzfSxhcHBseUV1bGVyOmZ1bmN0aW9uKGEpe2EmJmEuaXNFdWxlcnx8Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihiay5zZXRGcm9tRXVsZXIoYSkpfSxhcHBseUF4aXNBbmdsZTpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihiay5zZXRGcm9tQXhpc0FuZ2xlKGEsYykpfSxhcHBseU1hdHJpeDM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbM10qZSthWzZdKmc7dGhpcy55PWFbMV0qYythWzRdKmUrYVs3XSoKZzt0aGlzLno9YVsyXSpjK2FbNV0qZSthWzhdKmc7cmV0dXJuIHRoaXN9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngsZT10aGlzLnksZz10aGlzLno7YT1hLmVsZW1lbnRzO3ZhciByPTEvKGFbM10qYythWzddKmUrYVsxMV0qZythWzE1XSk7dGhpcy54PShhWzBdKmMrYVs0XSplK2FbOF0qZythWzEyXSkqcjt0aGlzLnk9KGFbMV0qYythWzVdKmUrYVs5XSpnK2FbMTNdKSpyO3RoaXMuej0oYVsyXSpjK2FbNl0qZSthWzEwXSpnK2FbMTRdKSpyO3JldHVybiB0aGlzfSxhcHBseVF1YXRlcm5pb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56LHI9YS54LHY9YS55LHo9YS56O2E9YS53O3ZhciBFPWEqYyt2KmcteiplLEY9YSplK3oqYy1yKmcsSj1hKmcrciplLXYqYztjPS1yKmMtdiplLXoqZzt0aGlzLng9RSphK2MqLXIrRiotei1KKi12O3RoaXMueT1GKmErYyotditKKi1yLUUqLXo7dGhpcy56PUoqYStjKi16K0UqLXYtRiotcjtyZXR1cm4gdGhpc30sCnByb2plY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQoYS5wcm9qZWN0aW9uTWF0cml4KX0sdW5wcm9qZWN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKS5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCl9LHRyYW5zZm9ybURpcmVjdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngsZT10aGlzLnksZz10aGlzLno7YT1hLmVsZW1lbnRzO3RoaXMueD1hWzBdKmMrYVs0XSplK2FbOF0qZzt0aGlzLnk9YVsxXSpjK2FbNV0qZSthWzldKmc7dGhpcy56PWFbMl0qYythWzZdKmUrYVsxMF0qZztyZXR1cm4gdGhpcy5ub3JtYWxpemUoKX0sZGl2aWRlOmZ1bmN0aW9uKGEpe3RoaXMueC89YS54O3RoaXMueS89YS55O3RoaXMuei89YS56O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYSl9LG1pbjpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5taW4odGhpcy54LGEueCk7dGhpcy55PU1hdGgubWluKHRoaXMueSxhLnkpO3RoaXMuej1NYXRoLm1pbih0aGlzLnosYS56KTtyZXR1cm4gdGhpc30sbWF4OmZ1bmN0aW9uKGEpe3RoaXMueD1NYXRoLm1heCh0aGlzLngsYS54KTt0aGlzLnk9TWF0aC5tYXgodGhpcy55LGEueSk7dGhpcy56PU1hdGgubWF4KHRoaXMueixhLnopO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLngsTWF0aC5taW4oYy54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLnksTWF0aC5taW4oYy55LHRoaXMueSkpO3RoaXMuej1NYXRoLm1heChhLnosTWF0aC5taW4oYy56LHRoaXMueikpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEsTWF0aC5taW4oYyx0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYSwKTWF0aC5taW4oYyx0aGlzLnopKTtyZXR1cm4gdGhpc30sY2xhbXBMZW5ndGg6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihlfHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heChhLE1hdGgubWluKGMsZSkpKX0sZmxvb3I6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT1NYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PU1hdGguZmxvb3IodGhpcy56KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7dGhpcy56PU1hdGguY2VpbCh0aGlzLnopO3JldHVybiB0aGlzfSxyb3VuZDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLnJvdW5kKHRoaXMueCk7dGhpcy55PU1hdGgucm91bmQodGhpcy55KTt0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopO3JldHVybiB0aGlzfSxyb3VuZFRvWmVybzpmdW5jdGlvbigpe3RoaXMueD0KMD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PTA+dGhpcy56P01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KTtyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7dGhpcy56PS10aGlzLno7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueCt0aGlzLnkqYS55K3RoaXMueiphLnp9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KSsKTWF0aC5hYnModGhpcy56KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfSxzZXRMZW5ndGg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoYSl9LGxlcnA6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPShhLngtdGhpcy54KSpjO3RoaXMueSs9KGEueS10aGlzLnkpKmM7dGhpcy56Kz0oYS56LXRoaXMueikqYztyZXR1cm4gdGhpc30sbGVycFZlY3RvcnM6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiB0aGlzLnN1YlZlY3RvcnMoYyxhKS5tdWx0aXBseVNjYWxhcihlKS5hZGQoYSl9LGNyb3NzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHZvaWQgMCE9PWM/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmNyb3NzVmVjdG9ycyhhLGMpKTp0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLAphKX0sY3Jvc3NWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS54LGc9YS55O2E9YS56O3ZhciByPWMueCx2PWMueTtjPWMuejt0aGlzLng9ZypjLWEqdjt0aGlzLnk9YSpyLWUqYzt0aGlzLno9ZSp2LWcqcjtyZXR1cm4gdGhpc30scHJvamVjdE9uVmVjdG9yOmZ1bmN0aW9uKGEpe3ZhciBjPWEuZG90KHRoaXMpL2EubGVuZ3RoU3EoKTtyZXR1cm4gdGhpcy5jb3B5KGEpLm11bHRpcGx5U2NhbGFyKGMpfSxwcm9qZWN0T25QbGFuZTpmdW5jdGlvbihhKXt4aS5jb3B5KHRoaXMpLnByb2plY3RPblZlY3RvcihhKTtyZXR1cm4gdGhpcy5zdWIoeGkpfSxyZWZsZWN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN1Yih4aS5jb3B5KGEpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QoYSkpKX0sYW5nbGVUbzpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5hY29zKGhiLmNsYW1wKHRoaXMuZG90KGEpL01hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqYS5sZW5ndGhTcSgpKSwtMSwxKSl9LGRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGEpKX0sCmRpc3RhbmNlVG9TcXVhcmVkOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueC1hLngsZT10aGlzLnktYS55O2E9dGhpcy56LWEuejtyZXR1cm4gYypjK2UqZSthKmF9LG1hbmhhdHRhbkRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1hLngpK01hdGguYWJzKHRoaXMueS1hLnkpK01hdGguYWJzKHRoaXMuei1hLnopfSxzZXRGcm9tU3BoZXJpY2FsOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHMoYS5yYWRpdXMsYS5waGksYS50aGV0YSl9LHNldEZyb21TcGhlcmljYWxDb29yZHM6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPU1hdGguc2luKGMpKmE7dGhpcy54PWcqTWF0aC5zaW4oZSk7dGhpcy55PU1hdGguY29zKGMpKmE7dGhpcy56PWcqTWF0aC5jb3MoZSk7cmV0dXJuIHRoaXN9LHNldEZyb21DeWxpbmRyaWNhbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoYS5yYWRpdXMsYS50aGV0YSwKYS55KX0sc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLng9YSpNYXRoLnNpbihjKTt0aGlzLnk9ZTt0aGlzLno9YSpNYXRoLmNvcyhjKTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2E9YS5lbGVtZW50czt0aGlzLng9YVsxMl07dGhpcy55PWFbMTNdO3RoaXMuej1hWzE0XTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeFNjYWxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihhLDApLmxlbmd0aCgpLGU9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsMSkubGVuZ3RoKCk7YT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oYSwyKS5sZW5ndGgoKTt0aGlzLng9Yzt0aGlzLnk9ZTt0aGlzLno9YTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeENvbHVtbjpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmZyb21BcnJheShhLmVsZW1lbnRzLDQqYyl9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS54PT09CnRoaXMueCYmYS55PT09dGhpcy55JiZhLno9PT10aGlzLnp9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMueD1hW2NdO3RoaXMueT1hW2MrMV07dGhpcy56PWFbYysyXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTthW2NdPXRoaXMueDthW2MrMV09dGhpcy55O2FbYysyXT10aGlzLno7cmV0dXJuIGF9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe3ZvaWQgMCE9PWUmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3RoaXMueD1hLmdldFgoYyk7dGhpcy55PWEuZ2V0WShjKTt0aGlzLno9YS5nZXRaKGMpO3JldHVybiB0aGlzfX0pO3ZhciBlZT1uZXcgaztPYmplY3QuYXNzaWduKHQucHJvdG90eXBlLHtpc01hdHJpeDM6ITAsc2V0OmZ1bmN0aW9uKGEsCmMsZSxnLHIsdix6LEUsRil7dmFyIEo9dGhpcy5lbGVtZW50cztKWzBdPWE7SlsxXT1nO0pbMl09ejtKWzNdPWM7Sls0XT1yO0pbNV09RTtKWzZdPWU7Sls3XT12O0pbOF09RjtyZXR1cm4gdGhpc30saWRlbnRpdHk6ZnVuY3Rpb24oKXt0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Y1swXT1hWzBdO2NbMV09YVsxXTtjWzJdPWFbMl07Y1szXT1hWzNdO2NbNF09YVs0XTtjWzVdPWFbNV07Y1s2XT1hWzZdO2NbN109YVs3XTtjWzhdPWFbOF07cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXg0OmZ1bmN0aW9uKGEpe2E9YS5lbGVtZW50czt0aGlzLnNldChhWzBdLGFbNF0sYVs4XSxhWzFdLGFbNV0sYVs5XSxhWzJdLGFbNl0sYVsxMF0pO3JldHVybiB0aGlzfSwKYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MCxlPWEuY291bnQ7YzxlO2MrKyllZS54PWEuZ2V0WChjKSxlZS55PWEuZ2V0WShjKSxlZS56PWEuZ2V0WihjKSxlZS5hcHBseU1hdHJpeDModGhpcyksYS5zZXRYWVooYyxlZS54LGVlLnksZWUueik7cmV0dXJuIGF9LG11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyxhKX0scHJlbXVsdGlwbHk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyhhLHRoaXMpfSxtdWx0aXBseU1hdHJpY2VzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5lbGVtZW50cyxnPWMuZWxlbWVudHM7Yz10aGlzLmVsZW1lbnRzO2E9ZVswXTt2YXIgcj1lWzNdLHY9ZVs2XSx6PWVbMV0sRT1lWzRdLEY9ZVs3XSxKPWVbMl0sUD1lWzVdO2U9ZVs4XTt2YXIgUj1nWzBdLFM9Z1szXSxWPWdbNl0sVz1nWzFdLGhhPWdbNF0sZmE9Z1s3XSxyYT1nWzJdLHBhPWdbNV07Zz1nWzhdOwpjWzBdPWEqUityKlcrdipyYTtjWzNdPWEqUytyKmhhK3YqcGE7Y1s2XT1hKlYrcipmYSt2Kmc7Y1sxXT16KlIrRSpXK0YqcmE7Y1s0XT16KlMrRSpoYStGKnBhO2NbN109eipWK0UqZmErRipnO2NbMl09SipSK1AqVytlKnJhO2NbNV09SipTK1AqaGErZSpwYTtjWzhdPUoqVitQKmZhK2UqZztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50cztjWzBdKj1hO2NbM10qPWE7Y1s2XSo9YTtjWzFdKj1hO2NbNF0qPWE7Y1s3XSo9YTtjWzJdKj1hO2NbNV0qPWE7Y1s4XSo9YTtyZXR1cm4gdGhpc30sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzLGM9YVswXSxlPWFbMV0sZz1hWzJdLHI9YVszXSx2PWFbNF0sej1hWzVdLEU9YVs2XSxGPWFbN107YT1hWzhdO3JldHVybiBjKnYqYS1jKnoqRi1lKnIqYStlKnoqRStnKnIqRi1nKnYqRX0sZ2V0SW52ZXJzZTpmdW5jdGlvbihhLGMpe2EmJmEuaXNNYXRyaXg0JiYKY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LiIpO3ZhciBlPWEuZWxlbWVudHM7YT10aGlzLmVsZW1lbnRzO3ZhciBnPWVbMF0scj1lWzFdLHY9ZVsyXSx6PWVbM10sRT1lWzRdLEY9ZVs1XSxKPWVbNl0sUD1lWzddO2U9ZVs4XTt2YXIgUj1lKkUtRipQLFM9RipKLWUqeixWPVAqei1FKkosVz1nKlIrcipTK3YqVjtpZigwPT09Vyl7aWYoITA9PT1jKXRocm93IEVycm9yKCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO3JldHVybiB0aGlzLmlkZW50aXR5KCl9Yz0xL1c7YVswXT1SKmM7YVsxXT0odipQLWUqcikqYzthWzJdPShGKnItdipFKSpjO2FbM109UypjO2FbNF09CihlKmctdipKKSpjO2FbNV09KHYqei1GKmcpKmM7YVs2XT1WKmM7YVs3XT0ocipKLVAqZykqYzthWzhdPShFKmctcip6KSpjO3JldHVybiB0aGlzfSx0cmFuc3Bvc2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzO3ZhciBjPWFbMV07YVsxXT1hWzNdO2FbM109YztjPWFbMl07YVsyXT1hWzZdO2FbNl09YztjPWFbNV07YVs1XT1hWzddO2FbN109YztyZXR1cm4gdGhpc30sZ2V0Tm9ybWFsTWF0cml4OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KGEpLmdldEludmVyc2UodGhpcykudHJhbnNwb3NlKCl9LHRyYW5zcG9zZUludG9BcnJheTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2FbMF09Y1swXTthWzFdPWNbM107YVsyXT1jWzZdO2FbM109Y1sxXTthWzRdPWNbNF07YVs1XT1jWzddO2FbNl09Y1syXTthWzddPWNbNV07YVs4XT1jWzhdO3JldHVybiB0aGlzfSxzZXRVdlRyYW5zZm9ybTpmdW5jdGlvbihhLGMsZSxnLHIsdix6KXt2YXIgRT0KTWF0aC5jb3Mocik7cj1NYXRoLnNpbihyKTt0aGlzLnNldChlKkUsZSpyLC1lKihFKnYrcip6KSt2K2EsLWcqcixnKkUsLWcqKC1yKnYrRSp6KSt6K2MsMCwwLDEpfSxzY2FsZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZWxlbWVudHM7ZVswXSo9YTtlWzNdKj1hO2VbNl0qPWE7ZVsxXSo9YztlWzRdKj1jO2VbN10qPWM7cmV0dXJuIHRoaXN9LHJvdGF0ZTpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3ZhciBlPXRoaXMuZWxlbWVudHMsZz1lWzBdLHI9ZVszXSx2PWVbNl0sej1lWzFdLEU9ZVs0XSxGPWVbN107ZVswXT1jKmcrYSp6O2VbM109YypyK2EqRTtlWzZdPWMqdithKkY7ZVsxXT0tYSpnK2MqejtlWzRdPS1hKnIrYypFO2VbN109LWEqditjKkY7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZWxlbWVudHM7ZVswXSs9YSplWzJdO2VbM10rPWEqZVs1XTtlWzZdKz1hKmVbOF07ZVsxXSs9YyplWzJdO2VbNF0rPQpjKmVbNV07ZVs3XSs9YyplWzhdO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Zm9yKHZhciBlPTA7OT5lO2UrKylpZihjW2VdIT09YVtlXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmVsZW1lbnRzW2VdPWFbZStjXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTt2YXIgZT10aGlzLmVsZW1lbnRzO2FbY109ZVswXTthW2MrMV09ZVsxXTthW2MrMl09ZVsyXTthW2MrM109ZVszXTthW2MrNF09ZVs0XTthW2MrNV09ZVs1XTthW2MrNl09ZVs2XTthW2MrN109ZVs3XTthW2MrOF09ZVs4XTtyZXR1cm4gYX19KTt2YXIgZWYsRGQ9e2dldERhdGFVUkw6ZnVuY3Rpb24oYSl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudClyZXR1cm4gYS5zcmM7CmlmKCEoYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSl7dm9pZCAwPT09ZWYmJihlZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKSk7ZWYud2lkdGg9YS53aWR0aDtlZi5oZWlnaHQ9YS5oZWlnaHQ7dmFyIGM9ZWYuZ2V0Q29udGV4dCgiMmQiKTthIGluc3RhbmNlb2YgSW1hZ2VEYXRhP2MucHV0SW1hZ2VEYXRhKGEsMCwwKTpjLmRyYXdJbWFnZShhLDAsMCxhLndpZHRoLGEuaGVpZ2h0KTthPWVmfXJldHVybiAyMDQ4PGEud2lkdGh8fDIwNDg8YS5oZWlnaHQ/YS50b0RhdGFVUkwoImltYWdlL2pwZWciLC42KTphLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9fSxOaz0wO2wuREVGQVVMVF9JTUFHRT12b2lkIDA7bC5ERUZBVUxUX01BUFBJTkc9MzAwO2wucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmwsaXNUZXh0dXJlOiEwLHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsCnRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWEubmFtZTt0aGlzLmltYWdlPWEuaW1hZ2U7dGhpcy5taXBtYXBzPWEubWlwbWFwcy5zbGljZSgwKTt0aGlzLm1hcHBpbmc9YS5tYXBwaW5nO3RoaXMud3JhcFM9YS53cmFwUzt0aGlzLndyYXBUPWEud3JhcFQ7dGhpcy5tYWdGaWx0ZXI9YS5tYWdGaWx0ZXI7dGhpcy5taW5GaWx0ZXI9YS5taW5GaWx0ZXI7dGhpcy5hbmlzb3Ryb3B5PWEuYW5pc290cm9weTt0aGlzLmZvcm1hdD1hLmZvcm1hdDt0aGlzLnR5cGU9YS50eXBlO3RoaXMub2Zmc2V0LmNvcHkoYS5vZmZzZXQpO3RoaXMucmVwZWF0LmNvcHkoYS5yZXBlYXQpO3RoaXMuY2VudGVyLmNvcHkoYS5jZW50ZXIpO3RoaXMucm90YXRpb249CmEucm90YXRpb247dGhpcy5tYXRyaXhBdXRvVXBkYXRlPWEubWF0cml4QXV0b1VwZGF0ZTt0aGlzLm1hdHJpeC5jb3B5KGEubWF0cml4KTt0aGlzLmdlbmVyYXRlTWlwbWFwcz1hLmdlbmVyYXRlTWlwbWFwczt0aGlzLnByZW11bHRpcGx5QWxwaGE9YS5wcmVtdWx0aXBseUFscGhhO3RoaXMuZmxpcFk9YS5mbGlwWTt0aGlzLnVucGFja0FsaWdubWVudD1hLnVucGFja0FsaWdubWVudDt0aGlzLmVuY29kaW5nPWEuZW5jb2Rpbmc7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXt2YXIgYz12b2lkIDA9PT1hfHwic3RyaW5nIj09PXR5cGVvZiBhO2lmKCFjJiZ2b2lkIDAhPT1hLnRleHR1cmVzW3RoaXMudXVpZF0pcmV0dXJuIGEudGV4dHVyZXNbdGhpcy51dWlkXTt2YXIgZT17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxtYXBwaW5nOnRoaXMubWFwcGluZywKcmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCx0eXBlOnRoaXMudHlwZSxlbmNvZGluZzp0aGlzLmVuY29kaW5nLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxwcmVtdWx0aXBseUFscGhhOnRoaXMucHJlbXVsdGlwbHlBbHBoYSx1bnBhY2tBbGlnbm1lbnQ6dGhpcy51bnBhY2tBbGlnbm1lbnR9O2lmKHZvaWQgMCE9PXRoaXMuaW1hZ2Upe3ZhciBnPXRoaXMuaW1hZ2U7dm9pZCAwPT09Zy51dWlkJiYoZy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpKTtpZighYyYmdm9pZCAwPT09YS5pbWFnZXNbZy51dWlkXSl7aWYoQXJyYXkuaXNBcnJheShnKSl7dmFyIHI9CltdO2Zvcih2YXIgdj0wLHo9Zy5sZW5ndGg7djx6O3YrKylyLnB1c2goRGQuZ2V0RGF0YVVSTChnW3ZdKSl9ZWxzZSByPURkLmdldERhdGFVUkwoZyk7YS5pbWFnZXNbZy51dWlkXT17dXVpZDpnLnV1aWQsdXJsOnJ9fWUuaW1hZ2U9Zy51dWlkfWN8fChhLnRleHR1cmVzW3RoaXMudXVpZF09ZSk7cmV0dXJuIGV9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9LHRyYW5zZm9ybVV2OmZ1bmN0aW9uKGEpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gYTthLmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCk7aWYoMD5hLnh8fDE8YS54KXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFFMzphLngtPU1hdGguZmxvb3IoYS54KTticmVhaztjYXNlIDEwMDE6YS54PTA+YS54PzA6MTticmVhaztjYXNlIDEwMDI6YS54PTE9PT1NYXRoLmFicyhNYXRoLmZsb29yKGEueCklMik/TWF0aC5jZWlsKGEueCktYS54OmEueC1NYXRoLmZsb29yKGEueCl9aWYoMD4KYS55fHwxPGEueSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxRTM6YS55LT1NYXRoLmZsb29yKGEueSk7YnJlYWs7Y2FzZSAxMDAxOmEueT0wPmEueT8wOjE7YnJlYWs7Y2FzZSAxMDAyOmEueT0xPT09TWF0aC5hYnMoTWF0aC5mbG9vcihhLnkpJTIpP01hdGguY2VpbChhLnkpLWEueTphLnktTWF0aC5mbG9vcihhLnkpfXRoaXMuZmxpcFkmJihhLnk9MS1hLnkpO3JldHVybiBhfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShsLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYSl7ITA9PT1hJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwLnByb3RvdHlwZSx7d2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnp9LHNldDpmdW5jdGlvbihhKXt0aGlzLno9YX19LGhlaWdodDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMudz1hfX19KTtPYmplY3QuYXNzaWduKHAucHJvdG90eXBlLAp7aXNWZWN0b3I0OiEwLHNldDpmdW5jdGlvbihhLGMsZSxnKXt0aGlzLng9YTt0aGlzLnk9Yzt0aGlzLno9ZTt0aGlzLnc9ZztyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMudz10aGlzLno9dGhpcy55PXRoaXMueD1hO3JldHVybiB0aGlzfSxzZXRYOmZ1bmN0aW9uKGEpe3RoaXMueD1hO3JldHVybiB0aGlzfSxzZXRZOmZ1bmN0aW9uKGEpe3RoaXMueT1hO3JldHVybiB0aGlzfSxzZXRaOmZ1bmN0aW9uKGEpe3RoaXMuej1hO3JldHVybiB0aGlzfSxzZXRXOmZ1bmN0aW9uKGEpe3RoaXMudz1hO3JldHVybiB0aGlzfSxzZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSxjKXtzd2l0Y2goYSl7Y2FzZSAwOnRoaXMueD1jO2JyZWFrO2Nhc2UgMTp0aGlzLnk9YzticmVhaztjYXNlIDI6dGhpcy56PWM7YnJlYWs7Y2FzZSAzOnRoaXMudz1jO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9cmV0dXJuIHRoaXN9LGdldENvbXBvbmVudDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAwOnJldHVybiB0aGlzLng7CmNhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMueD1hLng7dGhpcy55PWEueTt0aGlzLno9YS56O3RoaXMudz12b2lkIDAhPT1hLnc/YS53OjE7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyhhLGMpO3RoaXMueCs9YS54O3RoaXMueSs9YS55O3RoaXMueis9YS56O3RoaXMudys9YS53O3JldHVybiB0aGlzfSwKYWRkU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCs9YTt0aGlzLnkrPWE7dGhpcy56Kz1hO3RoaXMudys9YTtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngrYy54O3RoaXMueT1hLnkrYy55O3RoaXMuej1hLnorYy56O3RoaXMudz1hLncrYy53O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPWEueCpjO3RoaXMueSs9YS55KmM7dGhpcy56Kz1hLnoqYzt0aGlzLncrPWEudypjO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnMoYSxjKTt0aGlzLngtPWEueDt0aGlzLnktPWEueTt0aGlzLnotPWEuejt0aGlzLnctPWEudztyZXR1cm4gdGhpc30sc3ViU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueC09CmE7dGhpcy55LT1hO3RoaXMuei09YTt0aGlzLnctPWE7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54LWMueDt0aGlzLnk9YS55LWMueTt0aGlzLno9YS56LWMuejt0aGlzLnc9YS53LWMudztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hO3RoaXMueSo9YTt0aGlzLnoqPWE7dGhpcy53Kj1hO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56LHI9dGhpcy53O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbNF0qZSthWzhdKmcrYVsxMl0qcjt0aGlzLnk9YVsxXSpjK2FbNV0qZSthWzldKmcrYVsxM10qcjt0aGlzLno9YVsyXSpjK2FbNl0qZSthWzEwXSpnK2FbMTRdKnI7dGhpcy53PWFbM10qYythWzddKmUrYVsxMV0qZythWzE1XSpyO3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYSl9LHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3RoaXMudz0yKk1hdGguYWNvcyhhLncpO3ZhciBjPU1hdGguc3FydCgxLWEudyphLncpOzFFLTQ+Yz8odGhpcy54PTEsdGhpcy56PXRoaXMueT0wKToodGhpcy54PWEueC9jLHRoaXMueT1hLnkvYyx0aGlzLno9YS56L2MpO3JldHVybiB0aGlzfSxzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXg6ZnVuY3Rpb24oYSl7YT1hLmVsZW1lbnRzO3ZhciBjPWFbMF07dmFyIGU9YVs0XTt2YXIgZz1hWzhdLHI9YVsxXSx2PWFbNV0sej1hWzldO3ZhciBFPWFbMl07dmFyIEY9YVs2XTt2YXIgSj1hWzEwXTtpZiguMDE+TWF0aC5hYnMoZS1yKSYmLjAxPk1hdGguYWJzKGctRSkmJi4wMT5NYXRoLmFicyh6LUYpKXtpZiguMT5NYXRoLmFicyhlK3IpJiYuMT5NYXRoLmFicyhnK0UpJiYuMT5NYXRoLmFicyh6K0YpJiYuMT5NYXRoLmFicyhjK3YrSi0zKSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpczthPU1hdGguUEk7CmM9KGMrMSkvMjt2PSh2KzEpLzI7Sj0oSisxKS8yO2U9KGUrcikvNDtnPShnK0UpLzQ7ej0oeitGKS80O2M+diYmYz5KPy4wMT5jPyhGPTAsZT1FPS43MDcxMDY3ODEpOihGPU1hdGguc3FydChjKSxFPWUvRixlPWcvRik6dj5KPy4wMT52PyhGPS43MDcxMDY3ODEsRT0wLGU9LjcwNzEwNjc4MSk6KEU9TWF0aC5zcXJ0KHYpLEY9ZS9FLGU9ei9FKTouMDE+Sj8oRT1GPS43MDcxMDY3ODEsZT0wKTooZT1NYXRoLnNxcnQoSiksRj1nL2UsRT16L2UpO3RoaXMuc2V0KEYsRSxlLGEpO3JldHVybiB0aGlzfWE9TWF0aC5zcXJ0KChGLXopKihGLXopKyhnLUUpKihnLUUpKyhyLWUpKihyLWUpKTsuMDAxPk1hdGguYWJzKGEpJiYoYT0xKTt0aGlzLng9KEYteikvYTt0aGlzLnk9KGctRSkvYTt0aGlzLno9KHItZSkvYTt0aGlzLnc9TWF0aC5hY29zKChjK3YrSi0xKS8yKTtyZXR1cm4gdGhpc30sbWluOmZ1bmN0aW9uKGEpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYS54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LAphLnkpO3RoaXMuej1NYXRoLm1pbih0aGlzLnosYS56KTt0aGlzLnc9TWF0aC5taW4odGhpcy53LGEudyk7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGEueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxhLnkpO3RoaXMuej1NYXRoLm1heCh0aGlzLnosYS56KTt0aGlzLnc9TWF0aC5tYXgodGhpcy53LGEudyk7cmV0dXJuIHRoaXN9LGNsYW1wOmZ1bmN0aW9uKGEsYyl7dGhpcy54PU1hdGgubWF4KGEueCxNYXRoLm1pbihjLngsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEueSxNYXRoLm1pbihjLnksdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGEueixNYXRoLm1pbihjLnosdGhpcy56KSk7dGhpcy53PU1hdGgubWF4KGEudyxNYXRoLm1pbihjLncsdGhpcy53KSk7cmV0dXJuIHRoaXN9LGNsYW1wU2NhbGFyOmZ1bmN0aW9uKGEsYyl7dGhpcy54PU1hdGgubWF4KGEsTWF0aC5taW4oYyx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYSxNYXRoLm1pbihjLAp0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMueikpO3RoaXMudz1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy53KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoZXx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYSxNYXRoLm1pbihjLGUpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej1NYXRoLmZsb29yKHRoaXMueik7dGhpcy53PU1hdGguZmxvb3IodGhpcy53KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7dGhpcy56PU1hdGguY2VpbCh0aGlzLnopO3RoaXMudz1NYXRoLmNlaWwodGhpcy53KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9Ck1hdGgucm91bmQodGhpcy54KTt0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpO3RoaXMuej1NYXRoLnJvdW5kKHRoaXMueik7dGhpcy53PU1hdGgucm91bmQodGhpcy53KTtyZXR1cm4gdGhpc30scm91bmRUb1plcm86ZnVuY3Rpb24oKXt0aGlzLng9MD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PTA+dGhpcy56P01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KTt0aGlzLnc9MD50aGlzLnc/TWF0aC5jZWlsKHRoaXMudyk6TWF0aC5mbG9vcih0aGlzLncpO3JldHVybiB0aGlzfSxuZWdhdGU6ZnVuY3Rpb24oKXt0aGlzLng9LXRoaXMueDt0aGlzLnk9LXRoaXMueTt0aGlzLno9LXRoaXMuejt0aGlzLnc9LXRoaXMudztyZXR1cm4gdGhpc30sZG90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLngqYS54K3RoaXMueSphLnkrdGhpcy56KgphLnordGhpcy53KmEud30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud30sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX0sc2V0TGVuZ3RoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGEpfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz0oYS54LXRoaXMueCkqYzt0aGlzLnkrPShhLnktdGhpcy55KSpjO3RoaXMueis9KGEuei0KdGhpcy56KSpjO3RoaXMudys9KGEudy10aGlzLncpKmM7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGMsYSkubXVsdGlwbHlTY2FsYXIoZSkuYWRkKGEpfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueD09PXRoaXMueCYmYS55PT09dGhpcy55JiZhLno9PT10aGlzLnomJmEudz09PXRoaXMud30sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy54PWFbY107dGhpcy55PWFbYysxXTt0aGlzLno9YVtjKzJdO3RoaXMudz1hW2MrM107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLng7YVtjKzFdPXRoaXMueTthW2MrMl09dGhpcy56O2FbYyszXT10aGlzLnc7cmV0dXJuIGF9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe3ZvaWQgMCE9PWUmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpOwp0aGlzLng9YS5nZXRYKGMpO3RoaXMueT1hLmdldFkoYyk7dGhpcy56PWEuZ2V0WihjKTt0aGlzLnc9YS5nZXRXKGMpO3JldHVybiB0aGlzfX0pO20ucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm0saXNXZWJHTFJlbmRlclRhcmdldDohMCxzZXRTaXplOmZ1bmN0aW9uKGEsYyl7aWYodGhpcy53aWR0aCE9PWF8fHRoaXMuaGVpZ2h0IT09Yyl0aGlzLndpZHRoPWEsdGhpcy5oZWlnaHQ9Yyx0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGg9YSx0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0PWMsdGhpcy5kaXNwb3NlKCk7dGhpcy52aWV3cG9ydC5zZXQoMCwwLGEsYyk7dGhpcy5zY2lzc29yLnNldCgwLDAsYSxjKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy53aWR0aD1hLndpZHRoO3RoaXMuaGVpZ2h0PWEuaGVpZ2h0O3RoaXMudmlld3BvcnQuY29weShhLnZpZXdwb3J0KTsKdGhpcy50ZXh0dXJlPWEudGV4dHVyZS5jbG9uZSgpO3RoaXMuZGVwdGhCdWZmZXI9YS5kZXB0aEJ1ZmZlcjt0aGlzLnN0ZW5jaWxCdWZmZXI9YS5zdGVuY2lsQnVmZmVyO3RoaXMuZGVwdGhUZXh0dXJlPWEuZGVwdGhUZXh0dXJlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO24ucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShtLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm4saXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7bS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5zYW1wbGVzPWEuc2FtcGxlcztyZXR1cm4gdGhpc319KTt2YXIgcWM9bmV3IGssUWI9bmV3IHEseG09bmV3IGsoMCwwLDApLHltPW5ldyBrKDEsMSwxKSxFZD1uZXcgayxnaD1uZXcgayxmYz1uZXcgaztPYmplY3QuYXNzaWduKHEucHJvdG90eXBlLHtpc01hdHJpeDQ6ITAsCnNldDpmdW5jdGlvbihhLGMsZSxnLHIsdix6LEUsRixKLFAsUixTLFYsVyxoYSl7dmFyIGZhPXRoaXMuZWxlbWVudHM7ZmFbMF09YTtmYVs0XT1jO2ZhWzhdPWU7ZmFbMTJdPWc7ZmFbMV09cjtmYVs1XT12O2ZhWzldPXo7ZmFbMTNdPUU7ZmFbMl09RjtmYVs2XT1KO2ZhWzEwXT1QO2ZhWzE0XT1SO2ZhWzNdPVM7ZmFbN109VjtmYVsxMV09VztmYVsxNV09aGE7cmV0dXJuIHRoaXN9LGlkZW50aXR5OmZ1bmN0aW9uKCl7dGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBxKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Y1swXT1hWzBdO2NbMV09YVsxXTtjWzJdPWFbMl07Y1szXT1hWzNdO2NbNF09YVs0XTtjWzVdPWFbNV07Y1s2XT1hWzZdO2NbN109YVs3XTtjWzhdPWFbOF07Y1s5XT1hWzldO2NbMTBdPQphWzEwXTtjWzExXT1hWzExXTtjWzEyXT1hWzEyXTtjWzEzXT1hWzEzXTtjWzE0XT1hWzE0XTtjWzE1XT1hWzE1XTtyZXR1cm4gdGhpc30sY29weVBvc2l0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2NbMTJdPWFbMTJdO2NbMTNdPWFbMTNdO2NbMTRdPWFbMTRdO3JldHVybiB0aGlzfSxleHRyYWN0QmFzaXM6ZnVuY3Rpb24oYSxjLGUpe2Euc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApO2Muc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpO2Uuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpO3JldHVybiB0aGlzfSxtYWtlQmFzaXM6ZnVuY3Rpb24oYSxjLGUpe3RoaXMuc2V0KGEueCxjLngsZS54LDAsYS55LGMueSxlLnksMCxhLnosYy56LGUueiwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxleHRyYWN0Um90YXRpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50cyxlPWEuZWxlbWVudHMsZz0xL3FjLnNldEZyb21NYXRyaXhDb2x1bW4oYSwKMCkubGVuZ3RoKCkscj0xL3FjLnNldEZyb21NYXRyaXhDb2x1bW4oYSwxKS5sZW5ndGgoKTthPTEvcWMuc2V0RnJvbU1hdHJpeENvbHVtbihhLDIpLmxlbmd0aCgpO2NbMF09ZVswXSpnO2NbMV09ZVsxXSpnO2NbMl09ZVsyXSpnO2NbM109MDtjWzRdPWVbNF0qcjtjWzVdPWVbNV0qcjtjWzZdPWVbNl0qcjtjWzddPTA7Y1s4XT1lWzhdKmE7Y1s5XT1lWzldKmE7Y1sxMF09ZVsxMF0qYTtjWzExXT0wO2NbMTJdPTA7Y1sxM109MDtjWzE0XT0wO2NbMTVdPTE7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvbkZyb21FdWxlcjpmdW5jdGlvbihhKXthJiZhLmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7dmFyIGM9dGhpcy5lbGVtZW50cyxlPWEueCxnPWEueSxyPWEueix2PU1hdGguY29zKGUpO2U9TWF0aC5zaW4oZSk7CnZhciB6PU1hdGguY29zKGcpO2c9TWF0aC5zaW4oZyk7dmFyIEU9TWF0aC5jb3Mocik7cj1NYXRoLnNpbihyKTtpZigiWFlaIj09PWEub3JkZXIpe2E9dipFO3ZhciBGPXYqcixKPWUqRSxQPWUqcjtjWzBdPXoqRTtjWzRdPS16KnI7Y1s4XT1nO2NbMV09RitKKmc7Y1s1XT1hLVAqZztjWzldPS1lKno7Y1syXT1QLWEqZztjWzZdPUorRipnO2NbMTBdPXYqen1lbHNlIllYWiI9PT1hLm9yZGVyPyhhPXoqRSxGPXoqcixKPWcqRSxQPWcqcixjWzBdPWErUCplLGNbNF09SiplLUYsY1s4XT12KmcsY1sxXT12KnIsY1s1XT12KkUsY1s5XT0tZSxjWzJdPUYqZS1KLGNbNl09UCthKmUsY1sxMF09dip6KToiWlhZIj09PWEub3JkZXI/KGE9eipFLEY9eipyLEo9ZypFLFA9ZypyLGNbMF09YS1QKmUsY1s0XT0tdipyLGNbOF09SitGKmUsY1sxXT1GK0oqZSxjWzVdPXYqRSxjWzldPVAtYSplLGNbMl09LXYqZyxjWzZdPWUsY1sxMF09dip6KToiWllYIj09PWEub3JkZXI/KGE9dipFLEY9dipyLEo9ZSoKRSxQPWUqcixjWzBdPXoqRSxjWzRdPUoqZy1GLGNbOF09YSpnK1AsY1sxXT16KnIsY1s1XT1QKmcrYSxjWzldPUYqZy1KLGNbMl09LWcsY1s2XT1lKnosY1sxMF09dip6KToiWVpYIj09PWEub3JkZXI/KGE9dip6LEY9dipnLEo9ZSp6LFA9ZSpnLGNbMF09eipFLGNbNF09UC1hKnIsY1s4XT1KKnIrRixjWzFdPXIsY1s1XT12KkUsY1s5XT0tZSpFLGNbMl09LWcqRSxjWzZdPUYqcitKLGNbMTBdPWEtUCpyKToiWFpZIj09PWEub3JkZXImJihhPXYqeixGPXYqZyxKPWUqeixQPWUqZyxjWzBdPXoqRSxjWzRdPS1yLGNbOF09ZypFLGNbMV09YSpyK1AsY1s1XT12KkUsY1s5XT1GKnItSixjWzJdPUoqci1GLGNbNl09ZSpFLGNbMTBdPVAqcithKTtjWzNdPTA7Y1s3XT0wO2NbMTFdPTA7Y1sxMl09MDtjWzEzXT0wO2NbMTRdPTA7Y1sxNV09MTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29tcG9zZSh4bSxhLHltKX0sbG9va0F0OmZ1bmN0aW9uKGEsCmMsZSl7dmFyIGc9dGhpcy5lbGVtZW50cztmYy5zdWJWZWN0b3JzKGEsYyk7MD09PWZjLmxlbmd0aFNxKCkmJihmYy56PTEpO2ZjLm5vcm1hbGl6ZSgpO0VkLmNyb3NzVmVjdG9ycyhlLGZjKTswPT09RWQubGVuZ3RoU3EoKSYmKDE9PT1NYXRoLmFicyhlLnopP2ZjLngrPTFFLTQ6ZmMueis9MUUtNCxmYy5ub3JtYWxpemUoKSxFZC5jcm9zc1ZlY3RvcnMoZSxmYykpO0VkLm5vcm1hbGl6ZSgpO2doLmNyb3NzVmVjdG9ycyhmYyxFZCk7Z1swXT1FZC54O2dbNF09Z2gueDtnWzhdPWZjLng7Z1sxXT1FZC55O2dbNV09Z2gueTtnWzldPWZjLnk7Z1syXT1FZC56O2dbNl09Z2guejtnWzEwXT1mYy56O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhLGMpe3JldHVybiB2b2lkIDAhPT1jPyhjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSBpbnN0ZWFkLiIpLAp0aGlzLm11bHRpcGx5TWF0cmljZXMoYSxjKSk6dGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsYSl9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoYSx0aGlzKX0sbXVsdGlwbHlNYXRyaWNlczpmdW5jdGlvbihhLGMpe3ZhciBlPWEuZWxlbWVudHMsZz1jLmVsZW1lbnRzO2M9dGhpcy5lbGVtZW50czthPWVbMF07dmFyIHI9ZVs0XSx2PWVbOF0sej1lWzEyXSxFPWVbMV0sRj1lWzVdLEo9ZVs5XSxQPWVbMTNdLFI9ZVsyXSxTPWVbNl0sVj1lWzEwXSxXPWVbMTRdLGhhPWVbM10sZmE9ZVs3XSxyYT1lWzExXTtlPWVbMTVdO3ZhciBwYT1nWzBdLHFhPWdbNF0sdWE9Z1s4XSxvYT1nWzEyXSx0YT1nWzFdLEJhPWdbNV0sVGE9Z1s5XSxVYT1nWzEzXSxDYT1nWzJdLEhhPWdbNl0sRGE9Z1sxMF0sTWE9Z1sxNF0sZGI9Z1szXSx0Yj1nWzddLEthPWdbMTFdO2c9Z1sxNV07Y1swXT1hKnBhK3IqdGErdipDYSt6KmRiO2NbNF09YSpxYStyKkJhK3YqCkhhK3oqdGI7Y1s4XT1hKnVhK3IqVGErdipEYSt6KkthO2NbMTJdPWEqb2ErcipVYSt2Kk1hK3oqZztjWzFdPUUqcGErRip0YStKKkNhK1AqZGI7Y1s1XT1FKnFhK0YqQmErSipIYStQKnRiO2NbOV09RSp1YStGKlRhK0oqRGErUCpLYTtjWzEzXT1FKm9hK0YqVWErSipNYStQKmc7Y1syXT1SKnBhK1MqdGErVipDYStXKmRiO2NbNl09UipxYStTKkJhK1YqSGErVyp0YjtjWzEwXT1SKnVhK1MqVGErVipEYStXKkthO2NbMTRdPVIqb2ErUypVYStWKk1hK1cqZztjWzNdPWhhKnBhK2ZhKnRhK3JhKkNhK2UqZGI7Y1s3XT1oYSpxYStmYSpCYStyYSpIYStlKnRiO2NbMTFdPWhhKnVhK2ZhKlRhK3JhKkRhK2UqS2E7Y1sxNV09aGEqb2ErZmEqVWErcmEqTWErZSpnO3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2NbMF0qPWE7Y1s0XSo9YTtjWzhdKj1hO2NbMTJdKj1hO2NbMV0qPWE7Y1s1XSo9YTtjWzldKj1hO2NbMTNdKj1hO2NbMl0qPQphO2NbNl0qPWE7Y1sxMF0qPWE7Y1sxNF0qPWE7Y1szXSo9YTtjWzddKj1hO2NbMTFdKj1hO2NbMTVdKj1hO3JldHVybiB0aGlzfSxhcHBseVRvQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wLGU9YS5jb3VudDtjPGU7YysrKXFjLng9YS5nZXRYKGMpLHFjLnk9YS5nZXRZKGMpLHFjLno9YS5nZXRaKGMpLHFjLmFwcGx5TWF0cml4NCh0aGlzKSxhLnNldFhZWihjLHFjLngscWMueSxxYy56KTtyZXR1cm4gYX0sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzLGM9YVswXSxlPWFbNF0sZz1hWzhdLHI9YVsxMl0sdj1hWzFdLHo9YVs1XSxFPWFbOV0sRj1hWzEzXSxKPWFbMl0sUD1hWzZdLFI9YVsxMF0sUz1hWzE0XTtyZXR1cm4gYVszXSooK3IqRSpQLWcqRipQLXIqeipSK2UqRipSK2cqeipTLWUqRSpTKSthWzddKigrYypFKlMtYypGKlIrcip2KlItZyp2KlMrZypGKkotcipFKkopK2FbMTFdKigrYypGKlAtYyp6KlMtcip2KlArZSp2KlMrCnIqeipKLWUqRipKKSthWzE1XSooLWcqeipKLWMqRSpQK2MqeipSK2cqdipQLWUqdipSK2UqRSpKKX0sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50czt2YXIgYz1hWzFdO2FbMV09YVs0XTthWzRdPWM7Yz1hWzJdO2FbMl09YVs4XTthWzhdPWM7Yz1hWzZdO2FbNl09YVs5XTthWzldPWM7Yz1hWzNdO2FbM109YVsxMl07YVsxMl09YztjPWFbN107YVs3XT1hWzEzXTthWzEzXT1jO2M9YVsxMV07YVsxMV09YVsxNF07YVsxNF09YztyZXR1cm4gdGhpc30sc2V0UG9zaXRpb246ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuZWxlbWVudHM7YS5pc1ZlY3RvcjM/KGdbMTJdPWEueCxnWzEzXT1hLnksZ1sxNF09YS56KTooZ1sxMl09YSxnWzEzXT1jLGdbMTRdPWUpO3JldHVybiB0aGlzfSxnZXRJbnZlcnNlOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5lbGVtZW50cyxnPWEuZWxlbWVudHM7YT1nWzBdO3ZhciByPWdbMV0sdj1nWzJdLHo9Z1szXSxFPWdbNF0sRj1nWzVdLApKPWdbNl0sUD1nWzddLFI9Z1s4XSxTPWdbOV0sVj1nWzEwXSxXPWdbMTFdLGhhPWdbMTJdLGZhPWdbMTNdLHJhPWdbMTRdO2c9Z1sxNV07dmFyIHBhPVMqcmEqUC1mYSpWKlArZmEqSipXLUYqcmEqVy1TKkoqZytGKlYqZyxxYT1oYSpWKlAtUipyYSpQLWhhKkoqVytFKnJhKlcrUipKKmctRSpWKmcsdWE9UipmYSpQLWhhKlMqUCtoYSpGKlctRSpmYSpXLVIqRipnK0UqUypnLG9hPWhhKlMqSi1SKmZhKkotaGEqRipWK0UqZmEqVitSKkYqcmEtRSpTKnJhLHRhPWEqcGErcipxYSt2KnVhK3oqb2E7aWYoMD09PXRhKXtpZighMD09PWMpdGhyb3cgRXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIik7cmV0dXJuIHRoaXMuaWRlbnRpdHkoKX1jPTEvdGE7ZVswXT0KcGEqYztlWzFdPShmYSpWKnotUypyYSp6LWZhKnYqVytyKnJhKlcrUyp2KmctcipWKmcpKmM7ZVsyXT0oRipyYSp6LWZhKkoqeitmYSp2KlAtcipyYSpQLUYqdipnK3IqSipnKSpjO2VbM109KFMqSip6LUYqVip6LVMqdipQK3IqVipQK0YqdipXLXIqSipXKSpjO2VbNF09cWEqYztlWzVdPShSKnJhKnotaGEqVip6K2hhKnYqVy1hKnJhKlctUip2KmcrYSpWKmcpKmM7ZVs2XT0oaGEqSip6LUUqcmEqei1oYSp2KlArYSpyYSpQK0UqdipnLWEqSipnKSpjO2VbN109KEUqVip6LVIqSip6K1IqdipQLWEqVipQLUUqdipXK2EqSipXKSpjO2VbOF09dWEqYztlWzldPShoYSpTKnotUipmYSp6LWhhKnIqVythKmZhKlcrUipyKmctYSpTKmcpKmM7ZVsxMF09KEUqZmEqei1oYSpGKnoraGEqcipQLWEqZmEqUC1FKnIqZythKkYqZykqYztlWzExXT0oUipGKnotRSpTKnotUipyKlArYSpTKlArRSpyKlctYSpGKlcpKmM7ZVsxMl09b2EqYztlWzEzXT0oUipmYSp2LWhhKlMqditoYSpyKlYtYSpmYSpWLQpSKnIqcmErYSpTKnJhKSpjO2VbMTRdPShoYSpGKnYtRSpmYSp2LWhhKnIqSithKmZhKkorRSpyKnJhLWEqRipyYSkqYztlWzE1XT0oRSpTKnYtUipGKnYrUipyKkotYSpTKkotRSpyKlYrYSpGKlYpKmM7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHMsZT1hLngsZz1hLnk7YT1hLno7Y1swXSo9ZTtjWzRdKj1nO2NbOF0qPWE7Y1sxXSo9ZTtjWzVdKj1nO2NbOV0qPWE7Y1syXSo9ZTtjWzZdKj1nO2NbMTBdKj1hO2NbM10qPWU7Y1s3XSo9ZztjWzExXSo9YTtyZXR1cm4gdGhpc30sZ2V0TWF4U2NhbGVPbkF4aXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzO3JldHVybiBNYXRoLnNxcnQoTWF0aC5tYXgoYVswXSphWzBdK2FbMV0qYVsxXSthWzJdKmFbMl0sYVs0XSphWzRdK2FbNV0qYVs1XSthWzZdKmFbNl0sYVs4XSphWzhdK2FbOV0qYVs5XSthWzEwXSphWzEwXSkpfSxtYWtlVHJhbnNsYXRpb246ZnVuY3Rpb24oYSxjLGUpe3RoaXMuc2V0KDEsCjAsMCxhLDAsMSwwLGMsMCwwLDEsZSwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWDpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3RoaXMuc2V0KDEsMCwwLDAsMCxjLC1hLDAsMCxhLGMsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWTpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3RoaXMuc2V0KGMsMCxhLDAsMCwxLDAsMCwtYSwwLGMsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWjpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3RoaXMuc2V0KGMsLWEsMCwwLGEsYywwLDAsMCwwLDEsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uQXhpczpmdW5jdGlvbihhLGMpe3ZhciBlPU1hdGguY29zKGMpO2M9TWF0aC5zaW4oYyk7dmFyIGc9MS1lLHI9YS54LHY9YS55O2E9YS56O3ZhciB6PWcqcixFPWcqdjt0aGlzLnNldCh6KgpyK2Useip2LWMqYSx6KmErYyp2LDAseip2K2MqYSxFKnYrZSxFKmEtYypyLDAseiphLWMqdixFKmErYypyLGcqYSphK2UsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVNjYWxlOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldChhLDAsMCwwLDAsYywwLDAsMCwwLGUsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVNoZWFyOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldCgxLGMsZSwwLGEsMSxlLDAsYSxjLDEsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sY29tcG9zZTpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5lbGVtZW50cyxyPWMuX3gsdj1jLl95LHo9Yy5feixFPWMuX3csRj1yK3IsSj12K3YsUD16K3o7Yz1yKkY7dmFyIFI9cipKO3IqPVA7dmFyIFM9dipKO3YqPVA7eio9UDtGKj1FO0oqPUU7RSo9UDtQPWUueDt2YXIgVj1lLnk7ZT1lLno7Z1swXT0oMS0oUyt6KSkqUDtnWzFdPShSK0UpKlA7Z1syXT0oci1KKSpQO2dbM109MDtnWzRdPShSLUUpKlY7Z1s1XT0oMS0oYyt6KSkqClY7Z1s2XT0oditGKSpWO2dbN109MDtnWzhdPShyK0opKmU7Z1s5XT0odi1GKSplO2dbMTBdPSgxLShjK1MpKSplO2dbMTFdPTA7Z1sxMl09YS54O2dbMTNdPWEueTtnWzE0XT1hLno7Z1sxNV09MTtyZXR1cm4gdGhpc30sZGVjb21wb3NlOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLmVsZW1lbnRzLHI9cWMuc2V0KGdbMF0sZ1sxXSxnWzJdKS5sZW5ndGgoKSx2PXFjLnNldChnWzRdLGdbNV0sZ1s2XSkubGVuZ3RoKCksej1xYy5zZXQoZ1s4XSxnWzldLGdbMTBdKS5sZW5ndGgoKTswPnRoaXMuZGV0ZXJtaW5hbnQoKSYmKHI9LXIpO2EueD1nWzEyXTthLnk9Z1sxM107YS56PWdbMTRdO1FiLmNvcHkodGhpcyk7YT0xL3I7Zz0xL3Y7dmFyIEU9MS96O1FiLmVsZW1lbnRzWzBdKj1hO1FiLmVsZW1lbnRzWzFdKj1hO1FiLmVsZW1lbnRzWzJdKj1hO1FiLmVsZW1lbnRzWzRdKj1nO1FiLmVsZW1lbnRzWzVdKj1nO1FiLmVsZW1lbnRzWzZdKj1nO1FiLmVsZW1lbnRzWzhdKj1FO1FiLmVsZW1lbnRzWzldKj0KRTtRYi5lbGVtZW50c1sxMF0qPUU7Yy5zZXRGcm9tUm90YXRpb25NYXRyaXgoUWIpO2UueD1yO2UueT12O2Uuej16O3JldHVybiB0aGlzfSxtYWtlUGVyc3BlY3RpdmU6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3ZvaWQgMD09PXYmJmNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VQZXJzcGVjdGl2ZSgpIGhhcyBiZWVuIHJlZGVmaW5lZCBhbmQgaGFzIGEgbmV3IHNpZ25hdHVyZS4gUGxlYXNlIGNoZWNrIHRoZSBkb2NzLiIpO3ZhciB6PXRoaXMuZWxlbWVudHM7elswXT0yKnIvKGMtYSk7els0XT0wO3pbOF09KGMrYSkvKGMtYSk7elsxMl09MDt6WzFdPTA7els1XT0yKnIvKGUtZyk7els5XT0oZStnKS8oZS1nKTt6WzEzXT0wO3pbMl09MDt6WzZdPTA7elsxMF09LSh2K3IpLyh2LXIpO3pbMTRdPS0yKnYqci8odi1yKTt6WzNdPTA7els3XT0wO3pbMTFdPS0xO3pbMTVdPTA7cmV0dXJuIHRoaXN9LG1ha2VPcnRob2dyYXBoaWM6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3ZhciB6PQp0aGlzLmVsZW1lbnRzLEU9MS8oYy1hKSxGPTEvKGUtZyksSj0xLyh2LXIpO3pbMF09MipFO3pbNF09MDt6WzhdPTA7elsxMl09LSgoYythKSpFKTt6WzFdPTA7els1XT0yKkY7els5XT0wO3pbMTNdPS0oKGUrZykqRik7elsyXT0wO3pbNl09MDt6WzEwXT0tMipKO3pbMTRdPS0oKHYrcikqSik7elszXT0wO3pbN109MDt6WzExXT0wO3pbMTVdPTE7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2E9YS5lbGVtZW50cztmb3IodmFyIGU9MDsxNj5lO2UrKylpZihjW2VdIT09YVtlXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPTA7MTY+ZTtlKyspdGhpcy5lbGVtZW50c1tlXT1hW2UrY107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7dmFyIGU9dGhpcy5lbGVtZW50czthW2NdPWVbMF07CmFbYysxXT1lWzFdO2FbYysyXT1lWzJdO2FbYyszXT1lWzNdO2FbYys0XT1lWzRdO2FbYys1XT1lWzVdO2FbYys2XT1lWzZdO2FbYys3XT1lWzddO2FbYys4XT1lWzhdO2FbYys5XT1lWzldO2FbYysxMF09ZVsxMF07YVtjKzExXT1lWzExXTthW2MrMTJdPWVbMTJdO2FbYysxM109ZVsxM107YVtjKzE0XT1lWzE0XTthW2MrMTVdPWVbMTVdO3JldHVybiBhfX0pO3ZhciBjaz1uZXcgcSxkaz1uZXcgaDt1LlJvdGF0aW9uT3JkZXJzPSJYWVogWVpYIFpYWSBYWlkgWVhaIFpZWCIuc3BsaXQoIiAiKTt1LkRlZmF1bHRPcmRlcj0iWFlaIjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1LnByb3RvdHlwZSx7eDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3h9LHNldDpmdW5jdGlvbihhKXt0aGlzLl94PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0seTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3l9LHNldDpmdW5jdGlvbihhKXt0aGlzLl95PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0sCno6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl96fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5fej1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19LG9yZGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JkZXJ9LHNldDpmdW5jdGlvbihhKXt0aGlzLl9vcmRlcj1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19fSk7T2JqZWN0LmFzc2lnbih1LnByb3RvdHlwZSx7aXNFdWxlcjohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5feD1hO3RoaXMuX3k9Yzt0aGlzLl96PWU7dGhpcy5fb3JkZXI9Z3x8dGhpcy5fb3JkZXI7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5feD1hLl94O3RoaXMuX3k9YS5feTt0aGlzLl96PWEuX3o7dGhpcy5fb3JkZXI9YS5fb3JkZXI7CnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz1oYi5jbGFtcCxyPWEuZWxlbWVudHM7YT1yWzBdO3ZhciB2PXJbNF0sej1yWzhdLEU9clsxXSxGPXJbNV0sSj1yWzldLFA9clsyXSxSPXJbNl07cj1yWzEwXTtjPWN8fHRoaXMuX29yZGVyOyJYWVoiPT09Yz8odGhpcy5feT1NYXRoLmFzaW4oZyh6LC0xLDEpKSwuOTk5OTk5OT5NYXRoLmFicyh6KT8odGhpcy5feD1NYXRoLmF0YW4yKC1KLHIpLHRoaXMuX3o9TWF0aC5hdGFuMigtdixhKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihSLEYpLHRoaXMuX3o9MCkpOiJZWFoiPT09Yz8odGhpcy5feD1NYXRoLmFzaW4oLWcoSiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoSik/KHRoaXMuX3k9TWF0aC5hdGFuMih6LHIpLHRoaXMuX3o9TWF0aC5hdGFuMihFLEYpKToodGhpcy5feT1NYXRoLmF0YW4yKC1QLGEpLHRoaXMuX3o9MCkpOiJaWFkiPT09Yz8odGhpcy5feD0KTWF0aC5hc2luKGcoUiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoUik/KHRoaXMuX3k9TWF0aC5hdGFuMigtUCxyKSx0aGlzLl96PU1hdGguYXRhbjIoLXYsRikpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKEUsYSkpKToiWllYIj09PWM/KHRoaXMuX3k9TWF0aC5hc2luKC1nKFAsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKFApPyh0aGlzLl94PU1hdGguYXRhbjIoUixyKSx0aGlzLl96PU1hdGguYXRhbjIoRSxhKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLXYsRikpKToiWVpYIj09PWM/KHRoaXMuX3o9TWF0aC5hc2luKGcoRSwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoRSk/KHRoaXMuX3g9TWF0aC5hdGFuMigtSixGKSx0aGlzLl95PU1hdGguYXRhbjIoLVAsYSkpOih0aGlzLl94PTAsdGhpcy5feT1NYXRoLmF0YW4yKHoscikpKToiWFpZIj09PWM/KHRoaXMuX3o9TWF0aC5hc2luKC1nKHYsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKHYpPyh0aGlzLl94PQpNYXRoLmF0YW4yKFIsRiksdGhpcy5feT1NYXRoLmF0YW4yKHosYSkpOih0aGlzLl94PU1hdGguYXRhbjIoLUosciksdGhpcy5feT0wKSk6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAiK2MpO3RoaXMuX29yZGVyPWM7ITEhPT1lJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEsYyxlKXtjay5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihhKTtyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoY2ssYyxlKX0sc2V0RnJvbVZlY3RvcjM6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5zZXQoYS54LGEueSxhLnosY3x8dGhpcy5fb3JkZXIpfSxyZW9yZGVyOmZ1bmN0aW9uKGEpe2RrLnNldEZyb21FdWxlcih0aGlzKTtyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbihkayxhKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLl94PT09CnRoaXMuX3gmJmEuX3k9PT10aGlzLl95JiZhLl96PT09dGhpcy5feiYmYS5fb3JkZXI9PT10aGlzLl9vcmRlcn0sZnJvbUFycmF5OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YVswXTt0aGlzLl95PWFbMV07dGhpcy5fej1hWzJdO3ZvaWQgMCE9PWFbM10mJih0aGlzLl9vcmRlcj1hWzNdKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLl94O2FbYysxXT10aGlzLl95O2FbYysyXT10aGlzLl96O2FbYyszXT10aGlzLl9vcmRlcjtyZXR1cm4gYX0sdG9WZWN0b3IzOmZ1bmN0aW9uKGEpe3JldHVybiBhP2Euc2V0KHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KTpuZXcgayh0aGlzLl94LHRoaXMuX3ksdGhpcy5feil9LF9vbkNoYW5nZTpmdW5jdGlvbihhKXt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPWE7cmV0dXJuIHRoaXN9LF9vbkNoYW5nZUNhbGxiYWNrOmZ1bmN0aW9uKCl7fX0pOwpPYmplY3QuYXNzaWduKHgucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5tYXNrPTE8PGF8MH0sZW5hYmxlOmZ1bmN0aW9uKGEpe3RoaXMubWFzaz10aGlzLm1hc2t8MTw8YXwwfSxlbmFibGVBbGw6ZnVuY3Rpb24oKXt0aGlzLm1hc2s9LTF9LHRvZ2dsZTpmdW5jdGlvbihhKXt0aGlzLm1hc2tePTE8PGF8MH0sZGlzYWJsZTpmdW5jdGlvbihhKXt0aGlzLm1hc2smPX4oMTw8YXwwKX0sZGlzYWJsZUFsbDpmdW5jdGlvbigpe3RoaXMubWFzaz0wfSx0ZXN0OmZ1bmN0aW9uKGEpe3JldHVybiAwIT09KHRoaXMubWFzayZhLm1hc2spfX0pO3ZhciBPaz0wLGVrPW5ldyBrLGZmPW5ldyBoLGpkPW5ldyBxLGhoPW5ldyBrLGtnPW5ldyBrLHptPW5ldyBrLEFtPW5ldyBoLGZrPW5ldyBrKDEsMCwwKSxnaz1uZXcgaygwLDEsMCksaGs9bmV3IGsoMCwwLDEpLEJtPXt0eXBlOiJhZGRlZCJ9LENtPXt0eXBlOiJyZW1vdmVkIn07QS5EZWZhdWx0VXA9bmV3IGsoMCwxLDApO0EuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU9CiEwO0EucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkEsaXNPYmplY3QzRDohMCxvbkJlZm9yZVJlbmRlcjpmdW5jdGlvbigpe30sb25BZnRlclJlbmRlcjpmdW5jdGlvbigpe30sYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYSl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpO3RoaXMubWF0cml4LnByZW11bHRpcGx5KGEpO3RoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX0sYXBwbHlRdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3RoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShhKTtyZXR1cm4gdGhpc30sc2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGEsYyl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoYSxjKX0sc2V0Um90YXRpb25Gcm9tRXVsZXI6ZnVuY3Rpb24oYSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcihhLAohMCl9LHNldFJvdGF0aW9uRnJvbU1hdHJpeDpmdW5jdGlvbihhKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KGEpfSxzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3RoaXMucXVhdGVybmlvbi5jb3B5KGEpfSxyb3RhdGVPbkF4aXM6ZnVuY3Rpb24oYSxjKXtmZi5zZXRGcm9tQXhpc0FuZ2xlKGEsYyk7dGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KGZmKTtyZXR1cm4gdGhpc30scm90YXRlT25Xb3JsZEF4aXM6ZnVuY3Rpb24oYSxjKXtmZi5zZXRGcm9tQXhpc0FuZ2xlKGEsYyk7dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KGZmKTtyZXR1cm4gdGhpc30scm90YXRlWDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoZmssYSl9LHJvdGF0ZVk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGdrLGEpfSxyb3RhdGVaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhoayxhKX0sdHJhbnNsYXRlT25BeGlzOmZ1bmN0aW9uKGEsCmMpe2VrLmNvcHkoYSkuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbik7dGhpcy5wb3NpdGlvbi5hZGQoZWsubXVsdGlwbHlTY2FsYXIoYykpO3JldHVybiB0aGlzfSx0cmFuc2xhdGVYOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhmayxhKX0sdHJhbnNsYXRlWTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoZ2ssYSl9LHRyYW5zbGF0ZVo6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGhrLGEpfSxsb2NhbFRvV29ybGQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfSx3b3JsZFRvTG9jYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KGpkLmdldEludmVyc2UodGhpcy5tYXRyaXhXb3JsZCkpfSxsb29rQXQ6ZnVuY3Rpb24oYSxjLGUpe2EuaXNWZWN0b3IzP2hoLmNvcHkoYSk6aGguc2V0KGEsYyxlKTthPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsCiExKTtrZy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5pc0NhbWVyYXx8dGhpcy5pc0xpZ2h0P2pkLmxvb2tBdChrZyxoaCx0aGlzLnVwKTpqZC5sb29rQXQoaGgsa2csdGhpcy51cCk7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChqZCk7YSYmKGpkLmV4dHJhY3RSb3RhdGlvbihhLm1hdHJpeFdvcmxkKSxmZi5zZXRGcm9tUm90YXRpb25NYXRyaXgoamQpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShmZi5pbnZlcnNlKCkpKX0sYWRkOmZ1bmN0aW9uKGEpe2lmKDE8YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBjPTA7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyl0aGlzLmFkZChhcmd1bWVudHNbY10pO3JldHVybiB0aGlzfWlmKGE9PT10aGlzKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLGEpLHRoaXM7YSYmYS5pc09iamVjdDNEPwoobnVsbCE9PWEucGFyZW50JiZhLnBhcmVudC5yZW1vdmUoYSksYS5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2goYSksYS5kaXNwYXRjaEV2ZW50KEJtKSk6Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELiIsYSk7cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbihhKXtpZigxPGFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW2NdKTtyZXR1cm4gdGhpc31jPXRoaXMuY2hpbGRyZW4uaW5kZXhPZihhKTstMSE9PWMmJihhLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGMsMSksYS5kaXNwYXRjaEV2ZW50KENtKSk7cmV0dXJuIHRoaXN9LGF0dGFjaDpmdW5jdGlvbihhKXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtqZC5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpO251bGwhPT0KYS5wYXJlbnQmJihhLnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksamQubXVsdGlwbHkoYS5wYXJlbnQubWF0cml4V29ybGQpKTthLmFwcGx5TWF0cml4KGpkKTthLnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTt0aGlzLmFkZChhKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0QnlJZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsYSl9LGdldE9iamVjdEJ5TmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIixhKX0sZ2V0T2JqZWN0QnlQcm9wZXJ0eTpmdW5jdGlvbihhLGMpe2lmKHRoaXNbYV09PT1jKXJldHVybiB0aGlzO2Zvcih2YXIgZT0wLGc9dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9dGhpcy5jaGlsZHJlbltlXS5nZXRPYmplY3RCeVByb3BlcnR5KGEsYyk7aWYodm9pZCAwIT09cilyZXR1cm4gcn19LGdldFdvcmxkUG9zaXRpb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09CmEmJihjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRQb3NpdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtyZXR1cm4gYS5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9LGdldFdvcmxkUXVhdGVybmlvbjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUXVhdGVybmlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBoKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShrZyxhLHptKTtyZXR1cm4gYX0sZ2V0V29ybGRTY2FsZTpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkU2NhbGUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7CnRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKGtnLEFtLGEpO3JldHVybiBhfSxnZXRXb3JsZERpcmVjdGlvbjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApO3ZhciBjPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGEuc2V0KGNbOF0sY1s5XSxjWzEwXSkubm9ybWFsaXplKCl9LHJheWNhc3Q6ZnVuY3Rpb24oKXt9LHRyYXZlcnNlOmZ1bmN0aW9uKGEpe2EodGhpcyk7Zm9yKHZhciBjPXRoaXMuY2hpbGRyZW4sZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyljW2VdLnRyYXZlcnNlKGEpfSx0cmF2ZXJzZVZpc2libGU6ZnVuY3Rpb24oYSl7aWYoITEhPT10aGlzLnZpc2libGUpe2EodGhpcyk7Zm9yKHZhciBjPXRoaXMuY2hpbGRyZW4sZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyljW2VdLnRyYXZlcnNlVmlzaWJsZShhKX19LAp0cmF2ZXJzZUFuY2VzdG9yczpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBhcmVudDtudWxsIT09YyYmKGEoYyksYy50cmF2ZXJzZUFuY2VzdG9ycyhhKSl9LHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSk7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7aWYodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHxhKW51bGw9PT10aGlzLnBhcmVudD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLGE9ITA7Zm9yKHZhciBjPXRoaXMuY2hpbGRyZW4sZT0KMCxnPWMubGVuZ3RoO2U8ZztlKyspY1tlXS51cGRhdGVNYXRyaXhXb3JsZChhKX0sdXBkYXRlV29ybGRNYXRyaXg6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLnBhcmVudDshMD09PWEmJm51bGwhPT1lJiZlLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7bnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KTtpZighMD09PWMpZm9yKGE9dGhpcy5jaGlsZHJlbixjPTAsZT1hLmxlbmd0aDtjPGU7YysrKWFbY10udXBkYXRlV29ybGRNYXRyaXgoITEsITApfSx0b0pTT046ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhQLFIpe3ZvaWQgMD09PVBbUi51dWlkXSYmKFBbUi51dWlkXT1SLnRvSlNPTihhKSk7cmV0dXJuIFIudXVpZH1mdW5jdGlvbiBlKFApe3ZhciBSPQpbXSxTO2ZvcihTIGluIFApe3ZhciBWPVBbU107ZGVsZXRlIFYubWV0YWRhdGE7Ui5wdXNoKFYpfXJldHVybiBSfXZhciBnPXZvaWQgMD09PWF8fCJzdHJpbmciPT09dHlwZW9mIGEscj17fTtnJiYoYT17Z2VvbWV0cmllczp7fSxtYXRlcmlhbHM6e30sdGV4dHVyZXM6e30saW1hZ2VzOnt9LHNoYXBlczp7fX0sci5tZXRhZGF0YT17dmVyc2lvbjo0LjUsdHlwZToiT2JqZWN0IixnZW5lcmF0b3I6Ik9iamVjdDNELnRvSlNPTiJ9KTt2YXIgdj17fTt2LnV1aWQ9dGhpcy51dWlkO3YudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJih2Lm5hbWU9dGhpcy5uYW1lKTshMD09PXRoaXMuY2FzdFNoYWRvdyYmKHYuY2FzdFNoYWRvdz0hMCk7ITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJih2LnJlY2VpdmVTaGFkb3c9ITApOyExPT09dGhpcy52aXNpYmxlJiYodi52aXNpYmxlPSExKTshMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKHYuZnJ1c3R1bUN1bGxlZD0hMSk7MCE9PXRoaXMucmVuZGVyT3JkZXImJgoodi5yZW5kZXJPcmRlcj10aGlzLnJlbmRlck9yZGVyKTsie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJih2LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO3YubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2s7di5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpOyExPT09dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiYodi5tYXRyaXhBdXRvVXBkYXRlPSExKTt0aGlzLmlzTWVzaCYmMCE9PXRoaXMuZHJhd01vZGUmJih2LmRyYXdNb2RlPXRoaXMuZHJhd01vZGUpO2lmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7di5nZW9tZXRyeT1jKGEuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTt2YXIgej10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYodm9pZCAwIT09eiYmdm9pZCAwIT09ei5zaGFwZXMpaWYoej16LnNoYXBlcyxBcnJheS5pc0FycmF5KHopKWZvcih2YXIgRT0wLEY9ei5sZW5ndGg7RTxGO0UrKyljKGEuc2hhcGVzLHpbRV0pO2Vsc2UgYyhhLnNoYXBlcywKeil9aWYodm9pZCAwIT09dGhpcy5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXt6PVtdO0U9MDtmb3IoRj10aGlzLm1hdGVyaWFsLmxlbmd0aDtFPEY7RSsrKXoucHVzaChjKGEubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbRV0pKTt2Lm1hdGVyaWFsPXp9ZWxzZSB2Lm1hdGVyaWFsPWMoYS5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYoMDx0aGlzLmNoaWxkcmVuLmxlbmd0aClmb3Iodi5jaGlsZHJlbj1bXSxFPTA7RTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtFKyspdi5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bRV0udG9KU09OKGEpLm9iamVjdCk7aWYoZyl7Zz1lKGEuZ2VvbWV0cmllcyk7RT1lKGEubWF0ZXJpYWxzKTtGPWUoYS50ZXh0dXJlcyk7dmFyIEo9ZShhLmltYWdlcyk7ej1lKGEuc2hhcGVzKTswPGcubGVuZ3RoJiYoci5nZW9tZXRyaWVzPWcpOzA8RS5sZW5ndGgmJihyLm1hdGVyaWFscz1FKTswPEYubGVuZ3RoJiYoci50ZXh0dXJlcz1GKTsKMDxKLmxlbmd0aCYmKHIuaW1hZ2VzPUopOzA8ei5sZW5ndGgmJihyLnNoYXBlcz16KX1yLm9iamVjdD12O3JldHVybiByfSxjbG9uZTpmdW5jdGlvbihhKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyxhKX0sY29weTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPSEwKTt0aGlzLm5hbWU9YS5uYW1lO3RoaXMudXAuY29weShhLnVwKTt0aGlzLnBvc2l0aW9uLmNvcHkoYS5wb3NpdGlvbik7dGhpcy5xdWF0ZXJuaW9uLmNvcHkoYS5xdWF0ZXJuaW9uKTt0aGlzLnNjYWxlLmNvcHkoYS5zY2FsZSk7dGhpcy5tYXRyaXguY29weShhLm1hdHJpeCk7dGhpcy5tYXRyaXhXb3JsZC5jb3B5KGEubWF0cml4V29ybGQpO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPWEubWF0cml4V29ybGROZWVkc1VwZGF0ZTt0aGlzLmxheWVycy5tYXNrPWEubGF5ZXJzLm1hc2s7dGhpcy52aXNpYmxlPWEudmlzaWJsZTsKdGhpcy5jYXN0U2hhZG93PWEuY2FzdFNoYWRvdzt0aGlzLnJlY2VpdmVTaGFkb3c9YS5yZWNlaXZlU2hhZG93O3RoaXMuZnJ1c3R1bUN1bGxlZD1hLmZydXN0dW1DdWxsZWQ7dGhpcy5yZW5kZXJPcmRlcj1hLnJlbmRlck9yZGVyO3RoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhLnVzZXJEYXRhKSk7aWYoITA9PT1jKWZvcihjPTA7YzxhLmNoaWxkcmVuLmxlbmd0aDtjKyspdGhpcy5hZGQoYS5jaGlsZHJlbltjXS5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt5LnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp5LGlzU2NlbmU6ITAsY29weTpmdW5jdGlvbihhLGMpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEsYyk7bnVsbCE9PWEuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZD1hLmJhY2tncm91bmQuY2xvbmUoKSk7bnVsbCE9PWEuZm9nJiYodGhpcy5mb2c9YS5mb2cuY2xvbmUoKSk7Cm51bGwhPT1hLm92ZXJyaWRlTWF0ZXJpYWwmJih0aGlzLm92ZXJyaWRlTWF0ZXJpYWw9YS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCkpO3RoaXMuYXV0b1VwZGF0ZT1hLmF1dG9VcGRhdGU7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPWEubWF0cml4QXV0b1VwZGF0ZTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGEpe3ZhciBjPUEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSk7bnVsbCE9PXRoaXMuYmFja2dyb3VuZCYmKGMub2JqZWN0LmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTihhKSk7bnVsbCE9PXRoaXMuZm9nJiYoYy5vYmplY3QuZm9nPXRoaXMuZm9nLnRvSlNPTigpKTtyZXR1cm4gY30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTt2YXIga2Q9W25ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrXSxXYz1uZXcgayxnZj1uZXcgayxoZj1uZXcgayxqZj1uZXcgaywKRmQ9bmV3IGssR2Q9bmV3IGssZmU9bmV3IGssbGc9bmV3IGssaWg9bmV3IGssamg9bmV3IGssS2Q9bmV3IGs7T2JqZWN0LmFzc2lnbih3LnByb3RvdHlwZSx7aXNCb3gzOiEwLHNldDpmdW5jdGlvbihhLGMpe3RoaXMubWluLmNvcHkoYSk7dGhpcy5tYXguY29weShjKTtyZXR1cm4gdGhpc30sc2V0RnJvbUFycmF5OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1JbmZpbml0eSxlPUluZmluaXR5LGc9SW5maW5pdHkscj0tSW5maW5pdHksdj0tSW5maW5pdHksej0tSW5maW5pdHksRT0wLEY9YS5sZW5ndGg7RTxGO0UrPTMpe3ZhciBKPWFbRV0sUD1hW0UrMV0sUj1hW0UrMl07SjxjJiYoYz1KKTtQPGUmJihlPVApO1I8ZyYmKGc9Uik7Sj5yJiYocj1KKTtQPnYmJih2PVApO1I+eiYmKHo9Uil9dGhpcy5taW4uc2V0KGMsZSxnKTt0aGlzLm1heC5zZXQocix2LHopO3JldHVybiB0aGlzfSxzZXRGcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1JbmZpbml0eSxlPUluZmluaXR5LApnPUluZmluaXR5LHI9LUluZmluaXR5LHY9LUluZmluaXR5LHo9LUluZmluaXR5LEU9MCxGPWEuY291bnQ7RTxGO0UrKyl7dmFyIEo9YS5nZXRYKEUpLFA9YS5nZXRZKEUpLFI9YS5nZXRaKEUpO0o8YyYmKGM9Sik7UDxlJiYoZT1QKTtSPGcmJihnPVIpO0o+ciYmKHI9Sik7UD52JiYodj1QKTtSPnomJih6PVIpfXRoaXMubWluLnNldChjLGUsZyk7dGhpcy5tYXguc2V0KHIsdix6KTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihhKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgYz0wLGU9YS5sZW5ndGg7YzxlO2MrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYVtjXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKGEsYyl7Yz1XYy5jb3B5KGMpLm11bHRpcGx5U2NhbGFyKC41KTt0aGlzLm1pbi5jb3B5KGEpLnN1YihjKTt0aGlzLm1heC5jb3B5KGEpLmFkZChjKTtyZXR1cm4gdGhpc30sc2V0RnJvbU9iamVjdDpmdW5jdGlvbihhKXt0aGlzLm1ha2VFbXB0eSgpOwpyZXR1cm4gdGhpcy5leHBhbmRCeU9iamVjdChhKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5taW4uY29weShhLm1pbik7dGhpcy5tYXguY29weShhLm1heCk7cmV0dXJuIHRoaXN9LG1ha2VFbXB0eTpmdW5jdGlvbigpe3RoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PUluZmluaXR5O3RoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS1JbmZpbml0eTtyZXR1cm4gdGhpc30saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fSxnZXRDZW50ZXI6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/CmEuc2V0KDAsMCwwKTphLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX0sZ2V0U2l6ZTpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/YS5zZXQoMCwwLDApOmEuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9LGV4cGFuZEJ5UG9pbnQ6ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEpO3RoaXMubWF4Lm1heChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlWZWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5taW4uc3ViKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkU2NhbGFyKC1hKTt0aGlzLm1heC5hZGRTY2FsYXIoYSk7cmV0dXJuIHRoaXN9LGV4cGFuZEJ5T2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBjO2EudXBkYXRlV29ybGRNYXRyaXgoITEsCiExKTt2YXIgZT1hLmdlb21ldHJ5O2lmKHZvaWQgMCE9PWUpaWYoZS5pc0dlb21ldHJ5KXt2YXIgZz1lLnZlcnRpY2VzO2U9MDtmb3IoYz1nLmxlbmd0aDtlPGM7ZSsrKVdjLmNvcHkoZ1tlXSksV2MuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChXYyl9ZWxzZSBpZihlLmlzQnVmZmVyR2VvbWV0cnkmJihnPWUuYXR0cmlidXRlcy5wb3NpdGlvbix2b2lkIDAhPT1nKSlmb3IoZT0wLGM9Zy5jb3VudDtlPGM7ZSsrKVdjLmZyb21CdWZmZXJBdHRyaWJ1dGUoZyxlKS5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KFdjKTthPWEuY2hpbGRyZW47ZT0wO2ZvcihjPWEubGVuZ3RoO2U8YztlKyspdGhpcy5leHBhbmRCeU9iamVjdChhW2VdKTtyZXR1cm4gdGhpc30sY29udGFpbnNQb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gYS54PHRoaXMubWluLnh8fGEueD50aGlzLm1heC54fHxhLnk8dGhpcy5taW4ueXx8YS55PnRoaXMubWF4Lnl8fAphLno8dGhpcy5taW4uenx8YS56PnRoaXMubWF4Lno/ITE6ITB9LGNvbnRhaW5zQm94OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1pbi54PD1hLm1pbi54JiZhLm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD1hLm1pbi55JiZhLm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD1hLm1pbi56JiZhLm1heC56PD10aGlzLm1heC56fSxnZXRQYXJhbWV0ZXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3JldHVybiBjLnNldCgoYS54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLChhLnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKGEuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWF4Lng8dGhpcy5taW4ueHx8CmEubWluLng+dGhpcy5tYXgueHx8YS5tYXgueTx0aGlzLm1pbi55fHxhLm1pbi55PnRoaXMubWF4Lnl8fGEubWF4Lno8dGhpcy5taW4uenx8YS5taW4uej50aGlzLm1heC56PyExOiEwfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3RoaXMuY2xhbXBQb2ludChhLmNlbnRlcixXYyk7cmV0dXJuIFdjLmRpc3RhbmNlVG9TcXVhcmVkKGEuY2VudGVyKTw9YS5yYWRpdXMqYS5yYWRpdXN9LGludGVyc2VjdHNQbGFuZTpmdW5jdGlvbihhKXtpZigwPGEubm9ybWFsLngpe3ZhciBjPWEubm9ybWFsLngqdGhpcy5taW4ueDt2YXIgZT1hLm5vcm1hbC54KnRoaXMubWF4Lnh9ZWxzZSBjPWEubm9ybWFsLngqdGhpcy5tYXgueCxlPWEubm9ybWFsLngqdGhpcy5taW4ueDswPGEubm9ybWFsLnk/KGMrPWEubm9ybWFsLnkqdGhpcy5taW4ueSxlKz1hLm5vcm1hbC55KnRoaXMubWF4LnkpOihjKz1hLm5vcm1hbC55KnRoaXMubWF4LnksZSs9YS5ub3JtYWwueSp0aGlzLm1pbi55KTswPGEubm9ybWFsLno/CihjKz1hLm5vcm1hbC56KnRoaXMubWluLnosZSs9YS5ub3JtYWwueip0aGlzLm1heC56KTooYys9YS5ub3JtYWwueip0aGlzLm1heC56LGUrPWEubm9ybWFsLnoqdGhpcy5taW4ueik7cmV0dXJuIGM8PS1hLmNvbnN0YW50JiZlPj0tYS5jb25zdGFudH0saW50ZXJzZWN0c1RyaWFuZ2xlOmZ1bmN0aW9uKGEpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKGxnKTtpaC5zdWJWZWN0b3JzKHRoaXMubWF4LGxnKTtnZi5zdWJWZWN0b3JzKGEuYSxsZyk7aGYuc3ViVmVjdG9ycyhhLmIsbGcpO2pmLnN1YlZlY3RvcnMoYS5jLGxnKTtGZC5zdWJWZWN0b3JzKGhmLGdmKTtHZC5zdWJWZWN0b3JzKGpmLGhmKTtmZS5zdWJWZWN0b3JzKGdmLGpmKTthPVswLC1GZC56LEZkLnksMCwtR2QueixHZC55LDAsLWZlLnosZmUueSxGZC56LDAsLUZkLngsR2QueiwwLC1HZC54LGZlLnosMCwtZmUueCwtRmQueSxGZC54LDAsLUdkLnksR2QueCwwLC1mZS55LGZlLngsMF07aWYoIUMoYSwKZ2YsaGYsamYsaWgpKXJldHVybiExO2E9WzEsMCwwLDAsMSwwLDAsMCwxXTtpZighQyhhLGdmLGhmLGpmLGloKSlyZXR1cm4hMTtqaC5jcm9zc1ZlY3RvcnMoRmQsR2QpO2E9W2poLngsamgueSxqaC56XTtyZXR1cm4gQyhhLGdmLGhmLGpmLGloKX0sY2xhbXBQb2ludDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3JldHVybiBjLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFdjLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1YihhKS5sZW5ndGgoKX0sZ2V0Qm91bmRpbmdTcGhlcmU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmY29uc29sZS5lcnJvcigiVEhSRUUuQm94MzogLmdldEJvdW5kaW5nU3BoZXJlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpO3RoaXMuZ2V0Q2VudGVyKGEuY2VudGVyKTsKYS5yYWRpdXM9LjUqdGhpcy5nZXRTaXplKFdjKS5sZW5ndGgoKTtyZXR1cm4gYX0saW50ZXJzZWN0OmZ1bmN0aW9uKGEpe3RoaXMubWluLm1heChhLm1pbik7dGhpcy5tYXgubWluKGEubWF4KTt0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKTtyZXR1cm4gdGhpc30sdW5pb246ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEubWluKTt0aGlzLm1heC5tYXgoYS5tYXgpO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7a2RbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoYSk7a2RbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoYSk7a2RbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoYSk7a2RbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoYSk7CmtkWzRdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO2tkWzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpO2tkWzZdLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO2tkWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpO3RoaXMuc2V0RnJvbVBvaW50cyhrZCk7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihhKXt0aGlzLm1pbi5hZGQoYSk7dGhpcy5tYXguYWRkKGEpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWluLmVxdWFscyh0aGlzLm1pbikmJmEubWF4LmVxdWFscyh0aGlzLm1heCl9fSk7dmFyIERtPW5ldyB3O09iamVjdC5hc3NpZ24oRy5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMuY2VudGVyLmNvcHkoYSk7dGhpcy5yYWRpdXM9CmM7cmV0dXJuIHRoaXN9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmNlbnRlcjt2b2lkIDAhPT1jP2UuY29weShjKTpEbS5zZXRGcm9tUG9pbnRzKGEpLmdldENlbnRlcihlKTtmb3IodmFyIGc9Yz0wLHI9YS5sZW5ndGg7ZzxyO2crKyljPU1hdGgubWF4KGMsZS5kaXN0YW5jZVRvU3F1YXJlZChhW2ddKSk7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLmNlbnRlci5jb3B5KGEuY2VudGVyKTt0aGlzLnJhZGl1cz1hLnJhZGl1cztyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gMD49dGhpcy5yYWRpdXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c30sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLQp0aGlzLnJhZGl1c30saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnJhZGl1cythLnJhZGl1cztyZXR1cm4gYS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1jKmN9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicyhhLmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c30sY2xhbXBQb2ludDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKGEpO3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLlNwaGVyZTogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7Yy5jb3B5KGEpO2U+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihjLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksYy5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSk7CnJldHVybiBjfSxnZXRCb3VuZGluZ0JveDpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5TcGhlcmU6IC5nZXRCb3VuZGluZ0JveCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyB3KTthLnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlcik7YS5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyk7cmV0dXJuIGF9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQoYSk7dGhpcy5yYWRpdXMqPWEuZ2V0TWF4U2NhbGVPbkF4aXMoKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEpe3RoaXMuY2VudGVyLmFkZChhKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZhLnJhZGl1cz09PXRoaXMucmFkaXVzfX0pO3ZhciBsZD1uZXcgayx5aT1uZXcgayxraD1uZXcgayxIZD1uZXcgayx6aT1uZXcgayxsaD1uZXcgayxBaT1uZXcgazsKT2JqZWN0LmFzc2lnbihELnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5vcmlnaW4uY29weShhKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm9yaWdpbi5jb3B5KGEub3JpZ2luKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGEuZGlyZWN0aW9uKTtyZXR1cm4gdGhpc30sYXQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5hdCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtyZXR1cm4gYy5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5vcmlnaW4pfSxsb29rQXQ6ZnVuY3Rpb24oYSl7dGhpcy5kaXJlY3Rpb24uY29weShhKS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzfSxyZWNhc3Q6ZnVuY3Rpb24oYSl7dGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KGEsCmxkKSk7cmV0dXJuIHRoaXN9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO2Muc3ViVmVjdG9ycyhhLHRoaXMub3JpZ2luKTthPWMuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gMD5hP2MuY29weSh0aGlzLm9yaWdpbik6Yy5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5vcmlnaW4pfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGEpKX0sZGlzdGFuY2VTcVRvUG9pbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9bGQuc3ViVmVjdG9ycyhhLHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA+YylyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoYSk7bGQuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYykuYWRkKHRoaXMub3JpZ2luKTsKcmV0dXJuIGxkLmRpc3RhbmNlVG9TcXVhcmVkKGEpfSxkaXN0YW5jZVNxVG9TZWdtZW50OmZ1bmN0aW9uKGEsYyxlLGcpe3lpLmNvcHkoYSkuYWRkKGMpLm11bHRpcGx5U2NhbGFyKC41KTtraC5jb3B5KGMpLnN1YihhKS5ub3JtYWxpemUoKTtIZC5jb3B5KHRoaXMub3JpZ2luKS5zdWIoeWkpO3ZhciByPS41KmEuZGlzdGFuY2VUbyhjKSx2PS10aGlzLmRpcmVjdGlvbi5kb3Qoa2gpLHo9SGQuZG90KHRoaXMuZGlyZWN0aW9uKSxFPS1IZC5kb3Qoa2gpLEY9SGQubGVuZ3RoU3EoKSxKPU1hdGguYWJzKDEtdip2KTtpZigwPEope2E9dipFLXo7Yz12KnotRTt2YXIgUD1yKko7MDw9YT9jPj0tUD9jPD1QPyhyPTEvSixhKj1yLGMqPXIsdj1hKihhK3YqYysyKnopK2MqKHYqYStjKzIqRSkrRik6KGM9cixhPU1hdGgubWF4KDAsLSh2KmMreikpLHY9LWEqYStjKihjKzIqRSkrRik6KGM9LXIsYT1NYXRoLm1heCgwLC0odipjK3opKSx2PS1hKmErYyooYysyKkUpK0YpOmM8PS1QPyhhPU1hdGgubWF4KDAsCi0oLXYqcit6KSksYz0wPGE/LXI6TWF0aC5taW4oTWF0aC5tYXgoLXIsLUUpLHIpLHY9LWEqYStjKihjKzIqRSkrRik6Yzw9UD8oYT0wLGM9TWF0aC5taW4oTWF0aC5tYXgoLXIsLUUpLHIpLHY9YyooYysyKkUpK0YpOihhPU1hdGgubWF4KDAsLSh2KnIreikpLGM9MDxhP3I6TWF0aC5taW4oTWF0aC5tYXgoLXIsLUUpLHIpLHY9LWEqYStjKihjKzIqRSkrRil9ZWxzZSBjPTA8dj8tcjpyLGE9TWF0aC5tYXgoMCwtKHYqYyt6KSksdj0tYSphK2MqKGMrMipFKStGO2UmJmUuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMub3JpZ2luKTtnJiZnLmNvcHkoa2gpLm11bHRpcGx5U2NhbGFyKGMpLmFkZCh5aSk7cmV0dXJuIHZ9LGludGVyc2VjdFNwaGVyZTpmdW5jdGlvbihhLGMpe2xkLnN1YlZlY3RvcnMoYS5jZW50ZXIsdGhpcy5vcmlnaW4pO3ZhciBlPWxkLmRvdCh0aGlzLmRpcmVjdGlvbiksZz1sZC5kb3QobGQpLWUqZTthPWEucmFkaXVzKmEucmFkaXVzOwppZihnPmEpcmV0dXJuIG51bGw7YT1NYXRoLnNxcnQoYS1nKTtnPWUtYTtlKz1hO3JldHVybiAwPmcmJjA+ZT9udWxsOjA+Zz90aGlzLmF0KGUsYyk6dGhpcy5hdChnLGMpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGEuY2VudGVyKTw9YS5yYWRpdXMqYS5yYWRpdXN9LGRpc3RhbmNlVG9QbGFuZTpmdW5jdGlvbihhKXt2YXIgYz1hLm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1jKXJldHVybiAwPT09YS5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDthPS0odGhpcy5vcmlnaW4uZG90KGEubm9ybWFsKSthLmNvbnN0YW50KS9jO3JldHVybiAwPD1hP2E6bnVsbH0saW50ZXJzZWN0UGxhbmU6ZnVuY3Rpb24oYSxjKXthPXRoaXMuZGlzdGFuY2VUb1BsYW5lKGEpO3JldHVybiBudWxsPT09YT9udWxsOnRoaXMuYXQoYSxjKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGEpe3ZhciBjPWEuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTsKcmV0dXJuIDA9PT1jfHwwPmEubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqYz8hMDohMX0saW50ZXJzZWN0Qm94OmZ1bmN0aW9uKGEsYyl7dmFyIGU9MS90aGlzLmRpcmVjdGlvbi54O3ZhciBnPTEvdGhpcy5kaXJlY3Rpb24ueTt2YXIgcj0xL3RoaXMuZGlyZWN0aW9uLnosdj10aGlzLm9yaWdpbjtpZigwPD1lKXt2YXIgej0oYS5taW4ueC12LngpKmU7ZSo9YS5tYXgueC12Lnh9ZWxzZSB6PShhLm1heC54LXYueCkqZSxlKj1hLm1pbi54LXYueDtpZigwPD1nKXt2YXIgRT0oYS5taW4ueS12LnkpKmc7Zyo9YS5tYXgueS12Lnl9ZWxzZSBFPShhLm1heC55LXYueSkqZyxnKj1hLm1pbi55LXYueTtpZih6Pmd8fEU+ZSlyZXR1cm4gbnVsbDtpZihFPnp8fHohPT16KXo9RTtpZihnPGV8fGUhPT1lKWU9ZzswPD1yPyhFPShhLm1pbi56LXYueikqcixhPShhLm1heC56LXYueikqcik6KEU9KGEubWF4Lnotdi56KSpyLGE9KGEubWluLnotdi56KSpyKTtpZih6PmF8fEU+ZSlyZXR1cm4gbnVsbDsKaWYoRT56fHx6IT09eil6PUU7aWYoYTxlfHxlIT09ZSllPWE7cmV0dXJuIDA+ZT9udWxsOnRoaXMuYXQoMDw9ej96OmUsYyl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveChhLGxkKX0saW50ZXJzZWN0VHJpYW5nbGU6ZnVuY3Rpb24oYSxjLGUsZyxyKXt6aS5zdWJWZWN0b3JzKGMsYSk7bGguc3ViVmVjdG9ycyhlLGEpO0FpLmNyb3NzVmVjdG9ycyh6aSxsaCk7Yz10aGlzLmRpcmVjdGlvbi5kb3QoQWkpO2lmKDA8Yyl7aWYoZylyZXR1cm4gbnVsbDtnPTF9ZWxzZSBpZigwPmMpZz0tMSxjPS1jO2Vsc2UgcmV0dXJuIG51bGw7SGQuc3ViVmVjdG9ycyh0aGlzLm9yaWdpbixhKTthPWcqdGhpcy5kaXJlY3Rpb24uZG90KGxoLmNyb3NzVmVjdG9ycyhIZCxsaCkpO2lmKDA+YSlyZXR1cm4gbnVsbDtlPWcqdGhpcy5kaXJlY3Rpb24uZG90KHppLmNyb3NzKEhkKSk7aWYoMD5lfHxhK2U+YylyZXR1cm4gbnVsbDthPS1nKkhkLmRvdChBaSk7CnJldHVybiAwPmE/bnVsbDp0aGlzLmF0KGEvYyxyKX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe3RoaXMub3JpZ2luLmFwcGx5TWF0cml4NChhKTt0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmYS5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX19KTt2YXIgSWM9bmV3IGssbWQ9bmV3IGssQmk9bmV3IGssbmQ9bmV3IGssa2Y9bmV3IGssbGY9bmV3IGssaWs9bmV3IGssQ2k9bmV3IGssRGk9bmV3IGssRWk9bmV3IGs7T2JqZWN0LmFzc2lnbihCLHtnZXROb3JtYWw6ZnVuY3Rpb24oYSxjLGUsZyl7dm9pZCAwPT09ZyYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXROb3JtYWwoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksZz1uZXcgayk7Zy5zdWJWZWN0b3JzKGUsYyk7SWMuc3ViVmVjdG9ycyhhLGMpO2cuY3Jvc3MoSWMpOwphPWcubGVuZ3RoU3EoKTtyZXR1cm4gMDxhP2cubXVsdGlwbHlTY2FsYXIoMS9NYXRoLnNxcnQoYSkpOmcuc2V0KDAsMCwwKX0sZ2V0QmFyeWNvb3JkOmZ1bmN0aW9uKGEsYyxlLGcscil7SWMuc3ViVmVjdG9ycyhnLGMpO21kLnN1YlZlY3RvcnMoZSxjKTtCaS5zdWJWZWN0b3JzKGEsYyk7YT1JYy5kb3QoSWMpO2M9SWMuZG90KG1kKTtlPUljLmRvdChCaSk7dmFyIHY9bWQuZG90KG1kKTtnPW1kLmRvdChCaSk7dmFyIHo9YSp2LWMqYzt2b2lkIDA9PT1yJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmdldEJhcnljb29yZCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxyPW5ldyBrKTtpZigwPT09eilyZXR1cm4gci5zZXQoLTIsLTEsLTEpO3o9MS96O3Y9KHYqZS1jKmcpKno7YT0oYSpnLWMqZSkqejtyZXR1cm4gci5zZXQoMS12LWEsYSx2KX0sY29udGFpbnNQb2ludDpmdW5jdGlvbihhLGMsZSxnKXtCLmdldEJhcnljb29yZChhLGMsZSxnLG5kKTtyZXR1cm4gMDw9bmQueCYmCjA8PW5kLnkmJjE+PW5kLngrbmQueX0sZ2V0VVY6ZnVuY3Rpb24oYSxjLGUsZyxyLHYseixFKXt0aGlzLmdldEJhcnljb29yZChhLGMsZSxnLG5kKTtFLnNldCgwLDApO0UuYWRkU2NhbGVkVmVjdG9yKHIsbmQueCk7RS5hZGRTY2FsZWRWZWN0b3IodixuZC55KTtFLmFkZFNjYWxlZFZlY3Rvcih6LG5kLnopO3JldHVybiBFfSxpc0Zyb250RmFjaW5nOmZ1bmN0aW9uKGEsYyxlLGcpe0ljLnN1YlZlY3RvcnMoZSxjKTttZC5zdWJWZWN0b3JzKGEsYyk7cmV0dXJuIDA+SWMuY3Jvc3MobWQpLmRvdChnKT8hMDohMX19KTtPYmplY3QuYXNzaWduKEIucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSxjLGUpe3RoaXMuYS5jb3B5KGEpO3RoaXMuYi5jb3B5KGMpO3RoaXMuYy5jb3B5KGUpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczpmdW5jdGlvbihhLGMsZSxnKXt0aGlzLmEuY29weShhW2NdKTt0aGlzLmIuY29weShhW2VdKTt0aGlzLmMuY29weShhW2ddKTtyZXR1cm4gdGhpc30sCmNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYS5jb3B5KGEuYSk7dGhpcy5iLmNvcHkoYS5iKTt0aGlzLmMuY29weShhLmMpO3JldHVybiB0aGlzfSxnZXRBcmVhOmZ1bmN0aW9uKCl7SWMuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKTttZC5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpO3JldHVybi41KkljLmNyb3NzKG1kKS5sZW5ndGgoKX0sZ2V0TWlkcG9pbnQ6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRNaWRwb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9LGdldE5vcm1hbDpmdW5jdGlvbihhKXtyZXR1cm4gQi5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsYSl9LGdldFBsYW5lOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmdldFBsYW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3JldHVybiBhLnNldEZyb21Db3BsYW5hclBvaW50cyh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LGdldEJhcnljb29yZDpmdW5jdGlvbihhLGMpe3JldHVybiBCLmdldEJhcnljb29yZChhLHRoaXMuYSx0aGlzLmIsdGhpcy5jLGMpfSxnZXRVVjpmdW5jdGlvbihhLGMsZSxnLHIpe3JldHVybiBCLmdldFVWKGEsdGhpcy5hLHRoaXMuYix0aGlzLmMsYyxlLGcscil9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEIuY29udGFpbnNQb2ludChhLHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0saXNGcm9udEZhY2luZzpmdW5jdGlvbihhKXtyZXR1cm4gQi5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLGEpfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLmludGVyc2VjdHNUcmlhbmdsZSh0aGlzKX0sY2xvc2VzdFBvaW50VG9Qb2ludDpmdW5jdGlvbihhLApjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7dmFyIGU9dGhpcy5hLGc9dGhpcy5iLHI9dGhpcy5jO2tmLnN1YlZlY3RvcnMoZyxlKTtsZi5zdWJWZWN0b3JzKHIsZSk7Q2kuc3ViVmVjdG9ycyhhLGUpO3ZhciB2PWtmLmRvdChDaSksej1sZi5kb3QoQ2kpO2lmKDA+PXYmJjA+PXopcmV0dXJuIGMuY29weShlKTtEaS5zdWJWZWN0b3JzKGEsZyk7dmFyIEU9a2YuZG90KERpKSxGPWxmLmRvdChEaSk7aWYoMDw9RSYmRjw9RSlyZXR1cm4gYy5jb3B5KGcpO3ZhciBKPXYqRi1FKno7aWYoMD49SiYmMDw9diYmMD49RSlyZXR1cm4gZz12Lyh2LUUpLGMuY29weShlKS5hZGRTY2FsZWRWZWN0b3Ioa2YsZyk7RWkuc3ViVmVjdG9ycyhhLHIpO2E9a2YuZG90KEVpKTt2YXIgUD1sZi5kb3QoRWkpO2lmKDA8PVAmJmE8PVApcmV0dXJuIGMuY29weShyKTt2PWEqei0KdipQO2lmKDA+PXYmJjA8PXomJjA+PVApcmV0dXJuIEo9ei8oei1QKSxjLmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKGxmLEopO3o9RSpQLWEqRjtpZigwPj16JiYwPD1GLUUmJjA8PWEtUClyZXR1cm4gaWsuc3ViVmVjdG9ycyhyLGcpLEo9KEYtRSkvKEYtRSsoYS1QKSksYy5jb3B5KGcpLmFkZFNjYWxlZFZlY3RvcihpayxKKTtyPTEvKHorditKKTtnPXYqcjtKKj1yO3JldHVybiBjLmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKGtmLGcpLmFkZFNjYWxlZFZlY3RvcihsZixKKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmEuZXF1YWxzKHRoaXMuYSkmJmEuYi5lcXVhbHModGhpcy5iKSYmYS5jLmVxdWFscyh0aGlzLmMpfX0pO3ZhciBFbT17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSwKYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LApkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsCmxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NywKbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LApyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LGxjPXtoOjAsCnM6MCxsOjB9LG1oPXtoOjAsczowLGw6MH07T2JqZWN0LmFzc2lnbihJLnByb3RvdHlwZSx7aXNDb2xvcjohMCxyOjEsZzoxLGI6MSxzZXQ6ZnVuY3Rpb24oYSl7YSYmYS5pc0NvbG9yP3RoaXMuY29weShhKToibnVtYmVyIj09PXR5cGVvZiBhP3RoaXMuc2V0SGV4KGEpOiJzdHJpbmciPT09dHlwZW9mIGEmJnRoaXMuc2V0U3R5bGUoYSk7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLmI9dGhpcy5nPXRoaXMucj1hO3JldHVybiB0aGlzfSxzZXRIZXg6ZnVuY3Rpb24oYSl7YT1NYXRoLmZsb29yKGEpO3RoaXMucj0oYT4+MTYmMjU1KS8yNTU7dGhpcy5nPShhPj44JjI1NSkvMjU1O3RoaXMuYj0oYSYyNTUpLzI1NTtyZXR1cm4gdGhpc30sc2V0UkdCOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnI9YTt0aGlzLmc9Yzt0aGlzLmI9ZTtyZXR1cm4gdGhpc30sc2V0SFNMOmZ1bmN0aW9uKGEsYyxlKXthPWhiLmV1Y2xpZGVhbk1vZHVsbyhhLDEpO2M9aGIuY2xhbXAoYywwLAoxKTtlPWhiLmNsYW1wKGUsMCwxKTswPT09Yz90aGlzLnI9dGhpcy5nPXRoaXMuYj1lOihjPS41Pj1lP2UqKDErYyk6ZStjLWUqYyxlPTIqZS1jLHRoaXMucj1OKGUsYyxhKzEvMyksdGhpcy5nPU4oZSxjLGEpLHRoaXMuYj1OKGUsYyxhLTEvMykpO3JldHVybiB0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbihhKXtmdW5jdGlvbiBjKHope3ZvaWQgMCE9PXomJjE+cGFyc2VGbG9hdCh6KSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrYSsiIHdpbGwgYmUgaWdub3JlZC4iKX12YXIgZTtpZihlPS9eKCg/OnJnYnxoc2wpYT8pXChccyooW15cKV0qKVwpLy5leGVjKGEpKXt2YXIgZz1lWzJdO3N3aXRjaChlWzFdKXtjYXNlICJyZ2IiOmNhc2UgInJnYmEiOmlmKGU9L14oXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMoZykpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigyNTUscGFyc2VJbnQoZVsxXSwKMTApKS8yNTUsdGhpcy5nPU1hdGgubWluKDI1NSxwYXJzZUludChlWzJdLDEwKSkvMjU1LHRoaXMuYj1NYXRoLm1pbigyNTUscGFyc2VJbnQoZVszXSwxMCkpLzI1NSxjKGVbNV0pLHRoaXM7aWYoZT0vXihcZCspJVxzKixccyooXGQrKSVccyosXHMqKFxkKyklXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyhnKSlyZXR1cm4gdGhpcy5yPU1hdGgubWluKDEwMCxwYXJzZUludChlWzFdLDEwKSkvMTAwLHRoaXMuZz1NYXRoLm1pbigxMDAscGFyc2VJbnQoZVsyXSwxMCkpLzEwMCx0aGlzLmI9TWF0aC5taW4oMTAwLHBhcnNlSW50KGVbM10sMTApKS8xMDAsYyhlWzVdKSx0aGlzO2JyZWFrO2Nhc2UgImhzbCI6Y2FzZSAiaHNsYSI6aWYoZT0vXihbMC05XSpcLj9bMC05XSspXHMqLFxzKihcZCspJVxzKixccyooXGQrKSVccyooLFxzKihbMC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKGcpKXtnPXBhcnNlRmxvYXQoZVsxXSkvMzYwO3ZhciByPXBhcnNlSW50KGVbMl0sCjEwKS8xMDAsdj1wYXJzZUludChlWzNdLDEwKS8xMDA7YyhlWzVdKTtyZXR1cm4gdGhpcy5zZXRIU0woZyxyLHYpfX19ZWxzZSBpZihlPS9eIyhbQS1GYS1mMC05XSspJC8uZXhlYyhhKSl7ZT1lWzFdO2c9ZS5sZW5ndGg7aWYoMz09PWcpcmV0dXJuIHRoaXMucj1wYXJzZUludChlLmNoYXJBdCgwKStlLmNoYXJBdCgwKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludChlLmNoYXJBdCgxKStlLmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludChlLmNoYXJBdCgyKStlLmNoYXJBdCgyKSwxNikvMjU1LHRoaXM7aWYoNj09PWcpcmV0dXJuIHRoaXMucj1wYXJzZUludChlLmNoYXJBdCgwKStlLmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludChlLmNoYXJBdCgyKStlLmNoYXJBdCgzKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludChlLmNoYXJBdCg0KStlLmNoYXJBdCg1KSwxNikvMjU1LHRoaXN9YSYmMDxhLmxlbmd0aCYmKGU9RW1bYV0sdm9pZCAwIT09ZT90aGlzLnNldEhleChlKToKY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK2EpKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMucj1hLnI7dGhpcy5nPWEuZzt0aGlzLmI9YS5iO3JldHVybiB0aGlzfSxjb3B5R2FtbWFUb0xpbmVhcjpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTIpO3RoaXMucj1NYXRoLnBvdyhhLnIsYyk7dGhpcy5nPU1hdGgucG93KGEuZyxjKTt0aGlzLmI9TWF0aC5wb3coYS5iLGMpO3JldHVybiB0aGlzfSxjb3B5TGluZWFyVG9HYW1tYTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTIpO2M9MDxjPzEvYzoxO3RoaXMucj1NYXRoLnBvdyhhLnIsYyk7dGhpcy5nPU1hdGgucG93KGEuZyxjKTt0aGlzLmI9TWF0aC5wb3coYS5iLGMpO3JldHVybiB0aGlzfSxjb252ZXJ0R2FtbWFUb0xpbmVhcjpmdW5jdGlvbihhKXt0aGlzLmNvcHlHYW1tYVRvTGluZWFyKHRoaXMsCmEpO3JldHVybiB0aGlzfSxjb252ZXJ0TGluZWFyVG9HYW1tYTpmdW5jdGlvbihhKXt0aGlzLmNvcHlMaW5lYXJUb0dhbW1hKHRoaXMsYSk7cmV0dXJuIHRoaXN9LGNvcHlTUkdCVG9MaW5lYXI6ZnVuY3Rpb24oYSl7dGhpcy5yPU8oYS5yKTt0aGlzLmc9TyhhLmcpO3RoaXMuYj1PKGEuYik7cmV0dXJuIHRoaXN9LGNvcHlMaW5lYXJUb1NSR0I6ZnVuY3Rpb24oYSl7dGhpcy5yPUgoYS5yKTt0aGlzLmc9SChhLmcpO3RoaXMuYj1IKGEuYik7cmV0dXJuIHRoaXN9LGNvbnZlcnRTUkdCVG9MaW5lYXI6ZnVuY3Rpb24oKXt0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyk7cmV0dXJuIHRoaXN9LGNvbnZlcnRMaW5lYXJUb1NSR0I6ZnVuY3Rpb24oKXt0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyk7cmV0dXJuIHRoaXN9LGdldEhleDpmdW5jdGlvbigpe3JldHVybiAyNTUqdGhpcy5yPDwxNl4yNTUqdGhpcy5nPDw4XjI1NSp0aGlzLmI8PDB9LGdldEhleFN0cmluZzpmdW5jdGlvbigpe3JldHVybigiMDAwMDAwIisKdGhpcy5nZXRIZXgoKS50b1N0cmluZygxNikpLnNsaWNlKC02KX0sZ2V0SFNMOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9e2g6MCxzOjAsbDowfSk7dmFyIGM9dGhpcy5yLGU9dGhpcy5nLGc9dGhpcy5iLHI9TWF0aC5tYXgoYyxlLGcpLHY9TWF0aC5taW4oYyxlLGcpLHosRT0odityKS8yO2lmKHY9PT1yKXY9ej0wO2Vsc2V7dmFyIEY9ci12O3Y9LjU+PUU/Ri8ocit2KTpGLygyLXItdik7c3dpdGNoKHIpe2Nhc2UgYzp6PShlLWcpL0YrKGU8Zz82OjApO2JyZWFrO2Nhc2UgZTp6PShnLWMpL0YrMjticmVhaztjYXNlIGc6ej0oYy1lKS9GKzR9ei89Nn1hLmg9ejthLnM9djthLmw9RTtyZXR1cm4gYX0sZ2V0U3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm4icmdiKCIrKDI1NSp0aGlzLnJ8MCkrIiwiKygyNTUqdGhpcy5nfDApKyIsIisoMjU1KnRoaXMuYnwwKSsiKSJ9LG9mZnNldEhTTDpmdW5jdGlvbihhLApjLGUpe3RoaXMuZ2V0SFNMKGxjKTtsYy5oKz1hO2xjLnMrPWM7bGMubCs9ZTt0aGlzLnNldEhTTChsYy5oLGxjLnMsbGMubCk7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhKXt0aGlzLnIrPWEucjt0aGlzLmcrPWEuZzt0aGlzLmIrPWEuYjtyZXR1cm4gdGhpc30sYWRkQ29sb3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy5yPWEucitjLnI7dGhpcy5nPWEuZytjLmc7dGhpcy5iPWEuYitjLmI7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLnIrPWE7dGhpcy5nKz1hO3RoaXMuYis9YTtyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGEpe3RoaXMucj1NYXRoLm1heCgwLHRoaXMuci1hLnIpO3RoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy1hLmcpO3RoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi1hLmIpO3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhKXt0aGlzLnIqPWEucjt0aGlzLmcqPWEuZzt0aGlzLmIqPWEuYjtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5yKj0KYTt0aGlzLmcqPWE7dGhpcy5iKj1hO3JldHVybiB0aGlzfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy5yKz0oYS5yLXRoaXMucikqYzt0aGlzLmcrPShhLmctdGhpcy5nKSpjO3RoaXMuYis9KGEuYi10aGlzLmIpKmM7cmV0dXJuIHRoaXN9LGxlcnBIU0w6ZnVuY3Rpb24oYSxjKXt0aGlzLmdldEhTTChsYyk7YS5nZXRIU0wobWgpO2E9aGIubGVycChsYy5oLG1oLmgsYyk7dmFyIGU9aGIubGVycChsYy5zLG1oLnMsYyk7Yz1oYi5sZXJwKGxjLmwsbWgubCxjKTt0aGlzLnNldEhTTChhLGUsYyk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5yPT09dGhpcy5yJiZhLmc9PT10aGlzLmcmJmEuYj09PXRoaXMuYn0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy5yPWFbY107dGhpcy5nPWFbYysxXTt0aGlzLmI9YVtjKzJdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PQpjJiYoYz0wKTthW2NdPXRoaXMucjthW2MrMV09dGhpcy5nO2FbYysyXT10aGlzLmI7cmV0dXJuIGF9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEhleCgpfX0pO09iamVjdC5hc3NpZ24oSy5wcm90b3R5cGUse2Nsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYT1hLmE7dGhpcy5iPWEuYjt0aGlzLmM9YS5jO3RoaXMubm9ybWFsLmNvcHkoYS5ub3JtYWwpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hdGVyaWFsSW5kZXg9YS5tYXRlcmlhbEluZGV4O2Zvcih2YXIgYz0wLGU9YS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDtjPGU7YysrKXRoaXMudmVydGV4Tm9ybWFsc1tjXT1hLnZlcnRleE5vcm1hbHNbY10uY2xvbmUoKTtjPTA7Zm9yKGU9YS52ZXJ0ZXhDb2xvcnMubGVuZ3RoO2M8ZTtjKyspdGhpcy52ZXJ0ZXhDb2xvcnNbY109YS52ZXJ0ZXhDb2xvcnNbY10uY2xvbmUoKTsKcmV0dXJuIHRoaXN9fSk7dmFyIFBrPTA7TS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TSxpc01hdGVyaWFsOiEwLG9uQmVmb3JlQ29tcGlsZTpmdW5jdGlvbigpe30sc2V0VmFsdWVzOmZ1bmN0aW9uKGEpe2lmKHZvaWQgMCE9PWEpZm9yKHZhciBjIGluIGEpe3ZhciBlPWFbY107aWYodm9pZCAwPT09ZSljb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAnIitjKyInIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIik7ZWxzZSBpZigic2hhZGluZyI9PT1jKWNvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpLHRoaXMuZmxhdFNoYWRpbmc9MT09PWU/ITA6ITE7ZWxzZXt2YXIgZz10aGlzW2NdO3ZvaWQgMD09PWc/Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAnIitjKyInIGlzIG5vdCBhIHByb3BlcnR5IG9mIHRoaXMgbWF0ZXJpYWwuIik6CmcmJmcuaXNDb2xvcj9nLnNldChlKTpnJiZnLmlzVmVjdG9yMyYmZSYmZS5pc1ZlY3RvcjM/Zy5jb3B5KGUpOnRoaXNbY109ZX19fSx0b0pTT046ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhyKXt2YXIgdj1bXSx6O2Zvcih6IGluIHIpe3ZhciBFPXJbel07ZGVsZXRlIEUubWV0YWRhdGE7di5wdXNoKEUpfXJldHVybiB2fXZhciBlPXZvaWQgMD09PWF8fCJzdHJpbmciPT09dHlwZW9mIGE7ZSYmKGE9e3RleHR1cmVzOnt9LGltYWdlczp7fX0pO3ZhciBnPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O2cudXVpZD10aGlzLnV1aWQ7Zy50eXBlPXRoaXMudHlwZTsiIiE9PXRoaXMubmFtZSYmKGcubmFtZT10aGlzLm5hbWUpO3RoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKGcuY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5yb3VnaG5lc3MmJihnLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyk7CnZvaWQgMCE9PXRoaXMubWV0YWxuZXNzJiYoZy5tZXRhbG5lc3M9dGhpcy5tZXRhbG5lc3MpO3RoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKGcuZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eSYmMSE9PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJihnLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpO3RoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKGcuc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5zaGluaW5lc3MmJihnLnNoaW5pbmVzcz10aGlzLnNoaW5pbmVzcyk7dm9pZCAwIT09dGhpcy5jbGVhcmNvYXQmJihnLmNsZWFyY29hdD10aGlzLmNsZWFyY29hdCk7dm9pZCAwIT09dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MmJihnLmNsZWFyY29hdFJvdWdobmVzcz10aGlzLmNsZWFyY29hdFJvdWdobmVzcyk7dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAmJgp0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUmJihnLmNsZWFyY29hdE5vcm1hbE1hcD10aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04oYSkudXVpZCxnLmNsZWFyY29hdE5vcm1hbFNjYWxlPXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpKTt0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYoZy5tYXA9dGhpcy5tYXAudG9KU09OKGEpLnV1aWQpO3RoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihnLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04oYSkudXVpZCk7dGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihnLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYoZy5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLmFvTWFwJiZ0aGlzLmFvTWFwLmlzVGV4dHVyZSYmKGcuYW9NYXA9dGhpcy5hb01hcC50b0pTT04oYSkudXVpZCwKZy5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KTt0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihnLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTihhKS51dWlkLGcuYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKTt0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYoZy5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKGEpLnV1aWQsZy5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxnLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKTt0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYoZy5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKGEpLnV1aWQsZy5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLGcuZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpO3RoaXMucm91Z2huZXNzTWFwJiYKdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYoZy5yb3VnaG5lc3NNYXA9dGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMubWV0YWxuZXNzTWFwJiZ0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUmJihnLm1ldGFsbmVzc01hcD10aGlzLm1ldGFsbmVzc01hcC50b0pTT04oYSkudXVpZCk7dGhpcy5lbWlzc2l2ZU1hcCYmdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUmJihnLmVtaXNzaXZlTWFwPXRoaXMuZW1pc3NpdmVNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMuc3BlY3VsYXJNYXAmJnRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlJiYoZy5zcGVjdWxhck1hcD10aGlzLnNwZWN1bGFyTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYoZy5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKGEpLnV1aWQsZy5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHksZy5yZWZyYWN0aW9uUmF0aW89dGhpcy5yZWZyYWN0aW9uUmF0aW8sCnZvaWQgMCE9PXRoaXMuY29tYmluZSYmKGcuY29tYmluZT10aGlzLmNvbWJpbmUpLHZvaWQgMCE9PXRoaXMuZW52TWFwSW50ZW5zaXR5JiYoZy5lbnZNYXBJbnRlbnNpdHk9dGhpcy5lbnZNYXBJbnRlbnNpdHkpKTt0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKGcuZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04oYSkudXVpZCk7dm9pZCAwIT09dGhpcy5zaXplJiYoZy5zaXplPXRoaXMuc2l6ZSk7dm9pZCAwIT09dGhpcy5zaXplQXR0ZW51YXRpb24mJihnLnNpemVBdHRlbnVhdGlvbj10aGlzLnNpemVBdHRlbnVhdGlvbik7MSE9PXRoaXMuYmxlbmRpbmcmJihnLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpOyEwPT09dGhpcy5mbGF0U2hhZGluZyYmKGcuZmxhdFNoYWRpbmc9dGhpcy5mbGF0U2hhZGluZyk7MCE9PXRoaXMuc2lkZSYmKGcuc2lkZT10aGlzLnNpZGUpOzAhPT10aGlzLnZlcnRleENvbG9ycyYmKGcudmVydGV4Q29sb3JzPQp0aGlzLnZlcnRleENvbG9ycyk7MT50aGlzLm9wYWNpdHkmJihnLm9wYWNpdHk9dGhpcy5vcGFjaXR5KTshMD09PXRoaXMudHJhbnNwYXJlbnQmJihnLnRyYW5zcGFyZW50PXRoaXMudHJhbnNwYXJlbnQpO2cuZGVwdGhGdW5jPXRoaXMuZGVwdGhGdW5jO2cuZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0O2cuZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGU7Zy5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGU7Zy5zdGVuY2lsRnVuYz10aGlzLnN0ZW5jaWxGdW5jO2cuc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWY7Zy5zdGVuY2lsTWFzaz10aGlzLnN0ZW5jaWxNYXNrO2cuc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbDtnLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbDtnLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaUGFzczt0aGlzLnJvdGF0aW9uJiYwIT09dGhpcy5yb3RhdGlvbiYmKGcucm90YXRpb249dGhpcy5yb3RhdGlvbik7ITA9PT10aGlzLnBvbHlnb25PZmZzZXQmJgooZy5wb2x5Z29uT2Zmc2V0PSEwKTswIT09dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yJiYoZy5wb2x5Z29uT2Zmc2V0RmFjdG9yPXRoaXMucG9seWdvbk9mZnNldEZhY3Rvcik7MCE9PXRoaXMucG9seWdvbk9mZnNldFVuaXRzJiYoZy5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMpO3RoaXMubGluZXdpZHRoJiYxIT09dGhpcy5saW5ld2lkdGgmJihnLmxpbmV3aWR0aD10aGlzLmxpbmV3aWR0aCk7dm9pZCAwIT09dGhpcy5kYXNoU2l6ZSYmKGcuZGFzaFNpemU9dGhpcy5kYXNoU2l6ZSk7dm9pZCAwIT09dGhpcy5nYXBTaXplJiYoZy5nYXBTaXplPXRoaXMuZ2FwU2l6ZSk7dm9pZCAwIT09dGhpcy5zY2FsZSYmKGcuc2NhbGU9dGhpcy5zY2FsZSk7ITA9PT10aGlzLmRpdGhlcmluZyYmKGcuZGl0aGVyaW5nPSEwKTswPHRoaXMuYWxwaGFUZXN0JiYoZy5hbHBoYVRlc3Q9dGhpcy5hbHBoYVRlc3QpOyEwPT09dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEmJihnLnByZW11bHRpcGxpZWRBbHBoYT0KdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEpOyEwPT09dGhpcy53aXJlZnJhbWUmJihnLndpcmVmcmFtZT10aGlzLndpcmVmcmFtZSk7MTx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCYmKGcud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKTsicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lY2FwJiYoZy53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCk7InJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWpvaW4mJihnLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pOyEwPT09dGhpcy5tb3JwaFRhcmdldHMmJihnLm1vcnBoVGFyZ2V0cz0hMCk7ITA9PT10aGlzLm1vcnBoTm9ybWFscyYmKGcubW9ycGhOb3JtYWxzPSEwKTshMD09PXRoaXMuc2tpbm5pbmcmJihnLnNraW5uaW5nPSEwKTshMT09PXRoaXMudmlzaWJsZSYmKGcudmlzaWJsZT0hMSk7ITE9PT10aGlzLnRvbmVNYXBwZWQmJihnLnRvbmVNYXBwZWQ9ITEpOwoie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJihnLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO2UmJihlPWMoYS50ZXh0dXJlcyksYT1jKGEuaW1hZ2VzKSwwPGUubGVuZ3RoJiYoZy50ZXh0dXJlcz1lKSwwPGEubGVuZ3RoJiYoZy5pbWFnZXM9YSkpO3JldHVybiBnfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm5hbWU9YS5uYW1lO3RoaXMuZm9nPWEuZm9nO3RoaXMubGlnaHRzPWEubGlnaHRzO3RoaXMuYmxlbmRpbmc9YS5ibGVuZGluZzt0aGlzLnNpZGU9YS5zaWRlO3RoaXMuZmxhdFNoYWRpbmc9YS5mbGF0U2hhZGluZzt0aGlzLnZlcnRleENvbG9ycz1hLnZlcnRleENvbG9yczt0aGlzLm9wYWNpdHk9YS5vcGFjaXR5O3RoaXMudHJhbnNwYXJlbnQ9YS50cmFuc3BhcmVudDt0aGlzLmJsZW5kU3JjPWEuYmxlbmRTcmM7dGhpcy5ibGVuZERzdD1hLmJsZW5kRHN0O3RoaXMuYmxlbmRFcXVhdGlvbj0KYS5ibGVuZEVxdWF0aW9uO3RoaXMuYmxlbmRTcmNBbHBoYT1hLmJsZW5kU3JjQWxwaGE7dGhpcy5ibGVuZERzdEFscGhhPWEuYmxlbmREc3RBbHBoYTt0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1hLmJsZW5kRXF1YXRpb25BbHBoYTt0aGlzLmRlcHRoRnVuYz1hLmRlcHRoRnVuYzt0aGlzLmRlcHRoVGVzdD1hLmRlcHRoVGVzdDt0aGlzLmRlcHRoV3JpdGU9YS5kZXB0aFdyaXRlO3RoaXMuc3RlbmNpbFdyaXRlPWEuc3RlbmNpbFdyaXRlO3RoaXMuc3RlbmNpbEZ1bmM9YS5zdGVuY2lsRnVuYzt0aGlzLnN0ZW5jaWxSZWY9YS5zdGVuY2lsUmVmO3RoaXMuc3RlbmNpbE1hc2s9YS5zdGVuY2lsTWFzazt0aGlzLnN0ZW5jaWxGYWlsPWEuc3RlbmNpbEZhaWw7dGhpcy5zdGVuY2lsWkZhaWw9YS5zdGVuY2lsWkZhaWw7dGhpcy5zdGVuY2lsWlBhc3M9YS5zdGVuY2lsWlBhc3M7dGhpcy5jb2xvcldyaXRlPWEuY29sb3JXcml0ZTt0aGlzLnByZWNpc2lvbj1hLnByZWNpc2lvbjt0aGlzLnBvbHlnb25PZmZzZXQ9CmEucG9seWdvbk9mZnNldDt0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9YS5wb2x5Z29uT2Zmc2V0RmFjdG9yO3RoaXMucG9seWdvbk9mZnNldFVuaXRzPWEucG9seWdvbk9mZnNldFVuaXRzO3RoaXMuZGl0aGVyaW5nPWEuZGl0aGVyaW5nO3RoaXMuYWxwaGFUZXN0PWEuYWxwaGFUZXN0O3RoaXMucHJlbXVsdGlwbGllZEFscGhhPWEucHJlbXVsdGlwbGllZEFscGhhO3RoaXMudmlzaWJsZT1hLnZpc2libGU7dGhpcy50b25lTWFwcGVkPWEudG9uZU1hcHBlZDt0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYS51c2VyRGF0YSkpO3RoaXMuY2xpcFNoYWRvd3M9YS5jbGlwU2hhZG93czt0aGlzLmNsaXBJbnRlcnNlY3Rpb249YS5jbGlwSW50ZXJzZWN0aW9uO3ZhciBjPWEuY2xpcHBpbmdQbGFuZXMsZT1udWxsO2lmKG51bGwhPT1jKXt2YXIgZz1jLmxlbmd0aDtlPUFycmF5KGcpO2Zvcih2YXIgcj0wO3IhPT1nOysrcillW3JdPWNbcl0uY2xvbmUoKX10aGlzLmNsaXBwaW5nUGxhbmVzPQplO3RoaXMuc2hhZG93U2lkZT1hLnNoYWRvd1NpZGU7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7TC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7TC5wcm90b3R5cGUuY29uc3RydWN0b3I9TDtMLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsPSEwO0wucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubWFwPWEubWFwO3RoaXMubGlnaHRNYXA9YS5saWdodE1hcDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWEubGlnaHRNYXBJbnRlbnNpdHk7dGhpcy5hb01hcD1hLmFvTWFwO3RoaXMuYW9NYXBJbnRlbnNpdHk9YS5hb01hcEludGVuc2l0eTt0aGlzLnNwZWN1bGFyTWFwPWEuc3BlY3VsYXJNYXA7dGhpcy5hbHBoYU1hcD1hLmFscGhhTWFwO3RoaXMuZW52TWFwPWEuZW52TWFwOwp0aGlzLmNvbWJpbmU9YS5jb21iaW5lO3RoaXMucmVmbGVjdGl2aXR5PWEucmVmbGVjdGl2aXR5O3RoaXMucmVmcmFjdGlvblJhdGlvPWEucmVmcmFjdGlvblJhdGlvO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMud2lyZWZyYW1lTGluZWNhcD1hLndpcmVmcmFtZUxpbmVjYXA7dGhpcy53aXJlZnJhbWVMaW5lam9pbj1hLndpcmVmcmFtZUxpbmVqb2luO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0cztyZXR1cm4gdGhpc307T2JqZWN0LmRlZmluZVByb3BlcnR5KFEucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihhKXshMD09PWEmJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24oUS5wcm90b3R5cGUse2lzQnVmZmVyQXR0cmlidXRlOiEwLG9uVXBsb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9LHNldEFycmF5OmZ1bmN0aW9uKGEpe2lmKEFycmF5LmlzQXJyYXkoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTsKdGhpcy5jb3VudD12b2lkIDAhPT1hP2EubGVuZ3RoL3RoaXMuaXRlbVNpemU6MDt0aGlzLmFycmF5PWE7cmV0dXJuIHRoaXN9LHNldER5bmFtaWM6ZnVuY3Rpb24oYSl7dGhpcy5keW5hbWljPWE7cmV0dXJuIHRoaXN9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWEubmFtZTt0aGlzLmFycmF5PW5ldyBhLmFycmF5LmNvbnN0cnVjdG9yKGEuYXJyYXkpO3RoaXMuaXRlbVNpemU9YS5pdGVtU2l6ZTt0aGlzLmNvdW50PWEuY291bnQ7dGhpcy5ub3JtYWxpemVkPWEubm9ybWFsaXplZDt0aGlzLmR5bmFtaWM9YS5keW5hbWljO3JldHVybiB0aGlzfSxjb3B5QXQ6ZnVuY3Rpb24oYSxjLGUpe2EqPXRoaXMuaXRlbVNpemU7ZSo9Yy5pdGVtU2l6ZTtmb3IodmFyIGc9MCxyPXRoaXMuaXRlbVNpemU7ZzxyO2crKyl0aGlzLmFycmF5W2ErZ109Yy5hcnJheVtlK2ddO3JldHVybiB0aGlzfSxjb3B5QXJyYXk6ZnVuY3Rpb24oYSl7dGhpcy5hcnJheS5zZXQoYSk7cmV0dXJuIHRoaXN9LGNvcHlDb2xvcnNBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9CnRoaXMuYXJyYXksZT0wLGc9MCxyPWEubGVuZ3RoO2c8cjtnKyspe3ZhciB2PWFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IEkpO2NbZSsrXT12LnI7Y1tlKytdPXYuZztjW2UrK109di5ifXJldHVybiB0aGlzfSxjb3B5VmVjdG9yMnNBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5hcnJheSxlPTAsZz0wLHI9YS5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9YVtnXTt2b2lkIDA9PT12JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsZyksdj1uZXcgZik7Y1tlKytdPXYueDtjW2UrK109di55fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yM3NBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5hcnJheSxlPTAsZz0wLHI9YS5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9CmFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IGspO2NbZSsrXT12Lng7Y1tlKytdPXYueTtjW2UrK109di56fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yNHNBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5hcnJheSxlPTAsZz0wLHI9YS5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9YVtnXTt2b2lkIDA9PT12JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsZyksdj1uZXcgcCk7Y1tlKytdPXYueDtjW2UrK109di55O2NbZSsrXT12Lno7Y1tlKytdPXYud31yZXR1cm4gdGhpc30sc2V0OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy5hcnJheS5zZXQoYSxjKTtyZXR1cm4gdGhpc30sZ2V0WDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcnJheVthKgp0aGlzLml0ZW1TaXplXX0sc2V0WDpmdW5jdGlvbihhLGMpe3RoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplXT1jO3JldHVybiB0aGlzfSxnZXRZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSsxXX0sc2V0WTpmdW5jdGlvbihhLGMpe3RoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzFdPWM7cmV0dXJuIHRoaXN9LGdldFo6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzJdfSxzZXRaOmZ1bmN0aW9uKGEsYyl7dGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrMl09YztyZXR1cm4gdGhpc30sZ2V0VzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrM119LHNldFc6ZnVuY3Rpb24oYSxjKXt0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSszXT1jO3JldHVybiB0aGlzfSxzZXRYWTpmdW5jdGlvbihhLGMsZSl7YSo9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2ErMF09Yzt0aGlzLmFycmF5W2ErCjFdPWU7cmV0dXJuIHRoaXN9LHNldFhZWjpmdW5jdGlvbihhLGMsZSxnKXthKj10aGlzLml0ZW1TaXplO3RoaXMuYXJyYXlbYSswXT1jO3RoaXMuYXJyYXlbYSsxXT1lO3RoaXMuYXJyYXlbYSsyXT1nO3JldHVybiB0aGlzfSxzZXRYWVpXOmZ1bmN0aW9uKGEsYyxlLGcscil7YSo9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2ErMF09Yzt0aGlzLmFycmF5W2ErMV09ZTt0aGlzLmFycmF5W2ErMl09Zzt0aGlzLmFycmF5W2ErM109cjtyZXR1cm4gdGhpc30sb25VcGxvYWQ6ZnVuY3Rpb24oYSl7dGhpcy5vblVwbG9hZENhbGxiYWNrPWE7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybntpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpLApub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fSk7VC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShRLnByb3RvdHlwZSk7VC5wcm90b3R5cGUuY29uc3RydWN0b3I9VDtYLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtYLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YO2FhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTthYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YWE7bGEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2xhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1sYTtaLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtaLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aO2JhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtiYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YmE7ZWEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2VhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lYTtjYS5wcm90b3R5cGU9Ck9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2NhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jYTtrYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShRLnByb3RvdHlwZSk7a2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPWthO09iamVjdC5hc3NpZ24oWS5wcm90b3R5cGUse2NvbXB1dGVHcm91cHM6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZT12b2lkIDA7YT1hLmZhY2VzO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgcj1hW2ddO2lmKHIubWF0ZXJpYWxJbmRleCE9PWUpe2U9ci5tYXRlcmlhbEluZGV4O3ZvaWQgMCE9PXYmJih2LmNvdW50PTMqZy12LnN0YXJ0LGMucHVzaCh2KSk7dmFyIHY9e3N0YXJ0OjMqZyxtYXRlcmlhbEluZGV4OmV9fX12b2lkIDAhPT12JiYodi5jb3VudD0zKmctdi5zdGFydCxjLnB1c2godikpO3RoaXMuZ3JvdXBzPWN9LGZyb21HZW9tZXRyeTpmdW5jdGlvbihhKXt2YXIgYz1hLmZhY2VzLGU9YS52ZXJ0aWNlcyxnPWEuZmFjZVZlcnRleFV2cyxyPWdbMF0mJgowPGdbMF0ubGVuZ3RoLHY9Z1sxXSYmMDxnWzFdLmxlbmd0aCx6PWEubW9ycGhUYXJnZXRzLEU9ei5sZW5ndGg7aWYoMDxFKXt2YXIgRj1bXTtmb3IodmFyIEo9MDtKPEU7SisrKUZbSl09e25hbWU6eltKXS5uYW1lLGRhdGE6W119O3RoaXMubW9ycGhUYXJnZXRzLnBvc2l0aW9uPUZ9dmFyIFA9YS5tb3JwaE5vcm1hbHMsUj1QLmxlbmd0aDtpZigwPFIpe3ZhciBTPVtdO2ZvcihKPTA7SjxSO0orKylTW0pdPXtuYW1lOlBbSl0ubmFtZSxkYXRhOltdfTt0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWw9U312YXIgVj1hLnNraW5JbmRpY2VzLFc9YS5za2luV2VpZ2h0cyxoYT1WLmxlbmd0aD09PWUubGVuZ3RoLGZhPVcubGVuZ3RoPT09ZS5sZW5ndGg7MDxlLmxlbmd0aCYmMD09PWMubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5EaXJlY3RHZW9tZXRyeTogRmFjZWxlc3MgZ2VvbWV0cmllcyBhcmUgbm90IHN1cHBvcnRlZC4iKTtmb3IoSj0wO0o8Yy5sZW5ndGg7SisrKXt2YXIgcmE9Y1tKXTsKdGhpcy52ZXJ0aWNlcy5wdXNoKGVbcmEuYV0sZVtyYS5iXSxlW3JhLmNdKTt2YXIgcGE9cmEudmVydGV4Tm9ybWFsczszPT09cGEubGVuZ3RoP3RoaXMubm9ybWFscy5wdXNoKHBhWzBdLHBhWzFdLHBhWzJdKToocGE9cmEubm9ybWFsLHRoaXMubm9ybWFscy5wdXNoKHBhLHBhLHBhKSk7cGE9cmEudmVydGV4Q29sb3JzOzM9PT1wYS5sZW5ndGg/dGhpcy5jb2xvcnMucHVzaChwYVswXSxwYVsxXSxwYVsyXSk6KHBhPXJhLmNvbG9yLHRoaXMuY29sb3JzLnB1c2gocGEscGEscGEpKTshMD09PXImJihwYT1nWzBdW0pdLHZvaWQgMCE9PXBhP3RoaXMudXZzLnB1c2gocGFbMF0scGFbMV0scGFbMl0pOihjb25zb2xlLndhcm4oIlRIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYgIixKKSx0aGlzLnV2cy5wdXNoKG5ldyBmLG5ldyBmLG5ldyBmKSkpOyEwPT09diYmKHBhPWdbMV1bSl0sdm9pZCAwIT09cGE/dGhpcy51dnMyLnB1c2gocGFbMF0sCnBhWzFdLHBhWzJdKTooY29uc29sZS53YXJuKCJUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2MiAiLEopLHRoaXMudXZzMi5wdXNoKG5ldyBmLG5ldyBmLG5ldyBmKSkpO2ZvcihwYT0wO3BhPEU7cGErKyl7dmFyIHFhPXpbcGFdLnZlcnRpY2VzO0ZbcGFdLmRhdGEucHVzaChxYVtyYS5hXSxxYVtyYS5iXSxxYVtyYS5jXSl9Zm9yKHBhPTA7cGE8UjtwYSsrKXFhPVBbcGFdLnZlcnRleE5vcm1hbHNbSl0sU1twYV0uZGF0YS5wdXNoKHFhLmEscWEuYixxYS5jKTtoYSYmdGhpcy5za2luSW5kaWNlcy5wdXNoKFZbcmEuYV0sVltyYS5iXSxWW3JhLmNdKTtmYSYmdGhpcy5za2luV2VpZ2h0cy5wdXNoKFdbcmEuYV0sV1tyYS5iXSxXW3JhLmNdKX10aGlzLmNvbXB1dGVHcm91cHMoYSk7dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9YS52ZXJ0aWNlc05lZWRVcGRhdGU7dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT1hLm5vcm1hbHNOZWVkVXBkYXRlOwp0aGlzLmNvbG9yc05lZWRVcGRhdGU9YS5jb2xvcnNOZWVkVXBkYXRlO3RoaXMudXZzTmVlZFVwZGF0ZT1hLnV2c05lZWRVcGRhdGU7dGhpcy5ncm91cHNOZWVkVXBkYXRlPWEuZ3JvdXBzTmVlZFVwZGF0ZTtudWxsIT09YS5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9YS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtudWxsIT09YS5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9YS5ib3VuZGluZ0JveC5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt2YXIgUWs9MSxYYz1uZXcgcSxGaT1uZXcgQSxuaD1uZXcgayxnZT1uZXcgdyxHaT1uZXcgdyxKYz1uZXcgazt2YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6dmEsaXNCdWZmZXJHZW9tZXRyeTohMCxnZXRJbmRleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluZGV4fSxzZXRJbmRleDpmdW5jdGlvbihhKXt0aGlzLmluZGV4PUFycmF5LmlzQXJyYXkoYSk/Cm5ldyAoNjU1MzU8RWEoYSk/ZWE6WikoYSwxKTphfSxhZGRBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe2lmKCEoYyYmYy5pc0J1ZmZlckF0dHJpYnV0ZXx8YyYmYy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIG5vdyBleHBlY3RzICggbmFtZSwgYXR0cmlidXRlICkuIiksdGhpcy5hZGRBdHRyaWJ1dGUoYSxuZXcgUShjLGUpKTtpZigiaW5kZXgiPT09YSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGU6IFVzZSAuc2V0SW5kZXgoKSBmb3IgaW5kZXggYXR0cmlidXRlLiIpLHRoaXMuc2V0SW5kZXgoYyksdGhpczt0aGlzLmF0dHJpYnV0ZXNbYV09YztyZXR1cm4gdGhpc30sZ2V0QXR0cmlidXRlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbYV19LHJlbW92ZUF0dHJpYnV0ZTpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW2FdOwpyZXR1cm4gdGhpc30sYWRkR3JvdXA6ZnVuY3Rpb24oYSxjLGUpe3RoaXMuZ3JvdXBzLnB1c2goe3N0YXJ0OmEsY291bnQ6YyxtYXRlcmlhbEluZGV4OnZvaWQgMCE9PWU/ZTowfSl9LGNsZWFyR3JvdXBzOmZ1bmN0aW9uKCl7dGhpcy5ncm91cHM9W119LHNldERyYXdSYW5nZTpmdW5jdGlvbihhLGMpe3RoaXMuZHJhd1JhbmdlLnN0YXJ0PWE7dGhpcy5kcmF3UmFuZ2UuY291bnQ9Y30sYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZvaWQgMCE9PWMmJihhLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoYyksYy5uZWVkc1VwZGF0ZT0hMCk7dmFyIGU9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDt2b2lkIDAhPT1lJiYoYz0obmV3IHQpLmdldE5vcm1hbE1hdHJpeChhKSxjLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoZSksZS5uZWVkc1VwZGF0ZT0hMCk7ZT10aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDt2b2lkIDAhPT1lJiYoYz0obmV3IHQpLmdldE5vcm1hbE1hdHJpeChhKSwKYy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGUpLGUubmVlZHNVcGRhdGU9ITApO251bGwhPT10aGlzLmJvdW5kaW5nQm94JiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO251bGwhPT10aGlzLmJvdW5kaW5nU3BoZXJlJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3JldHVybiB0aGlzfSxyb3RhdGVYOmZ1bmN0aW9uKGEpe1hjLm1ha2VSb3RhdGlvblgoYSk7dGhpcy5hcHBseU1hdHJpeChYYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVk6ZnVuY3Rpb24oYSl7WGMubWFrZVJvdGF0aW9uWShhKTt0aGlzLmFwcGx5TWF0cml4KFhjKTtyZXR1cm4gdGhpc30scm90YXRlWjpmdW5jdGlvbihhKXtYYy5tYWtlUm90YXRpb25aKGEpO3RoaXMuYXBwbHlNYXRyaXgoWGMpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSxjLGUpe1hjLm1ha2VUcmFuc2xhdGlvbihhLGMsZSk7dGhpcy5hcHBseU1hdHJpeChYYyk7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEsYyxlKXtYYy5tYWtlU2NhbGUoYSwKYyxlKTt0aGlzLmFwcGx5TWF0cml4KFhjKTtyZXR1cm4gdGhpc30sbG9va0F0OmZ1bmN0aW9uKGEpe0ZpLmxvb2tBdChhKTtGaS51cGRhdGVNYXRyaXgoKTt0aGlzLmFwcGx5TWF0cml4KEZpLm1hdHJpeCk7cmV0dXJuIHRoaXN9LGNlbnRlcjpmdW5jdGlvbigpe3RoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIobmgpLm5lZ2F0ZSgpO3RoaXMudHJhbnNsYXRlKG5oLngsbmgueSxuaC56KTtyZXR1cm4gdGhpc30sc2V0RnJvbU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYz1hLmdlb21ldHJ5O2lmKGEuaXNQb2ludHN8fGEuaXNMaW5lKXthPW5ldyBjYSgzKmMudmVydGljZXMubGVuZ3RoLDMpO3ZhciBlPW5ldyBjYSgzKmMuY29sb3JzLmxlbmd0aCwzKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGEuY29weVZlY3RvcjNzQXJyYXkoYy52ZXJ0aWNlcykpO3RoaXMuYWRkQXR0cmlidXRlKCJjb2xvciIsZS5jb3B5Q29sb3JzQXJyYXkoYy5jb2xvcnMpKTsKYy5saW5lRGlzdGFuY2VzJiZjLmxpbmVEaXN0YW5jZXMubGVuZ3RoPT09Yy52ZXJ0aWNlcy5sZW5ndGgmJihhPW5ldyBjYShjLmxpbmVEaXN0YW5jZXMubGVuZ3RoLDEpLHRoaXMuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLGEuY29weUFycmF5KGMubGluZURpc3RhbmNlcykpKTtudWxsIT09Yy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Yy5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtudWxsIT09Yy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9Yy5ib3VuZGluZ0JveC5jbG9uZSgpKX1lbHNlIGEuaXNNZXNoJiZjJiZjLmlzR2VvbWV0cnkmJnRoaXMuZnJvbUdlb21ldHJ5KGMpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXt2YXIgcj1hW2VdO2MucHVzaChyLngsci55LHIuenx8MCl9dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoYywzKSk7CnJldHVybiB0aGlzfSx1cGRhdGVGcm9tT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2VvbWV0cnk7aWYoYS5pc01lc2gpe3ZhciBlPWMuX19kaXJlY3RHZW9tZXRyeTshMD09PWMuZWxlbWVudHNOZWVkVXBkYXRlJiYoZT12b2lkIDAsYy5lbGVtZW50c05lZWRVcGRhdGU9ITEpO2lmKHZvaWQgMD09PWUpcmV0dXJuIHRoaXMuZnJvbUdlb21ldHJ5KGMpO2UudmVydGljZXNOZWVkVXBkYXRlPWMudmVydGljZXNOZWVkVXBkYXRlO2Uubm9ybWFsc05lZWRVcGRhdGU9Yy5ub3JtYWxzTmVlZFVwZGF0ZTtlLmNvbG9yc05lZWRVcGRhdGU9Yy5jb2xvcnNOZWVkVXBkYXRlO2UudXZzTmVlZFVwZGF0ZT1jLnV2c05lZWRVcGRhdGU7ZS5ncm91cHNOZWVkVXBkYXRlPWMuZ3JvdXBzTmVlZFVwZGF0ZTtjLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMTtjLm5vcm1hbHNOZWVkVXBkYXRlPSExO2MuY29sb3JzTmVlZFVwZGF0ZT0hMTtjLnV2c05lZWRVcGRhdGU9ITE7Yy5ncm91cHNOZWVkVXBkYXRlPSExOwpjPWV9ITA9PT1jLnZlcnRpY2VzTmVlZFVwZGF0ZSYmKGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLHZvaWQgMCE9PWUmJihlLmNvcHlWZWN0b3Izc0FycmF5KGMudmVydGljZXMpLGUubmVlZHNVcGRhdGU9ITApLGMudmVydGljZXNOZWVkVXBkYXRlPSExKTshMD09PWMubm9ybWFsc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwsdm9pZCAwIT09ZSYmKGUuY29weVZlY3RvcjNzQXJyYXkoYy5ub3JtYWxzKSxlLm5lZWRzVXBkYXRlPSEwKSxjLm5vcm1hbHNOZWVkVXBkYXRlPSExKTshMD09PWMuY29sb3JzTmVlZFVwZGF0ZSYmKGU9dGhpcy5hdHRyaWJ1dGVzLmNvbG9yLHZvaWQgMCE9PWUmJihlLmNvcHlDb2xvcnNBcnJheShjLmNvbG9ycyksZS5uZWVkc1VwZGF0ZT0hMCksYy5jb2xvcnNOZWVkVXBkYXRlPSExKTtjLnV2c05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy51dix2b2lkIDAhPT1lJiYoZS5jb3B5VmVjdG9yMnNBcnJheShjLnV2cyksZS5uZWVkc1VwZGF0ZT0KITApLGMudXZzTmVlZFVwZGF0ZT0hMSk7Yy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSYmKGU9dGhpcy5hdHRyaWJ1dGVzLmxpbmVEaXN0YW5jZSx2b2lkIDAhPT1lJiYoZS5jb3B5QXJyYXkoYy5saW5lRGlzdGFuY2VzKSxlLm5lZWRzVXBkYXRlPSEwKSxjLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlPSExKTtjLmdyb3Vwc05lZWRVcGRhdGUmJihjLmNvbXB1dGVHcm91cHMoYS5nZW9tZXRyeSksdGhpcy5ncm91cHM9Yy5ncm91cHMsYy5ncm91cHNOZWVkVXBkYXRlPSExKTtyZXR1cm4gdGhpc30sZnJvbUdlb21ldHJ5OmZ1bmN0aW9uKGEpe2EuX19kaXJlY3RHZW9tZXRyeT0obmV3IFkpLmZyb21HZW9tZXRyeShhKTtyZXR1cm4gdGhpcy5mcm9tRGlyZWN0R2VvbWV0cnkoYS5fX2RpcmVjdEdlb21ldHJ5KX0sZnJvbURpcmVjdEdlb21ldHJ5OmZ1bmN0aW9uKGEpe3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsKG5ldyBRKG5ldyBGbG9hdDMyQXJyYXkoMyphLnZlcnRpY2VzLmxlbmd0aCksCjMpKS5jb3B5VmVjdG9yM3NBcnJheShhLnZlcnRpY2VzKSk7MDxhLm5vcm1hbHMubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIiwobmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKmEubm9ybWFscy5sZW5ndGgpLDMpKS5jb3B5VmVjdG9yM3NBcnJheShhLm5vcm1hbHMpKTswPGEuY29sb3JzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoImNvbG9yIiwobmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKmEuY29sb3JzLmxlbmd0aCksMykpLmNvcHlDb2xvcnNBcnJheShhLmNvbG9ycykpOzA8YS51dnMubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLChuZXcgUShuZXcgRmxvYXQzMkFycmF5KDIqYS51dnMubGVuZ3RoKSwyKSkuY29weVZlY3RvcjJzQXJyYXkoYS51dnMpKTswPGEudXZzMi5sZW5ndGgmJnRoaXMuYWRkQXR0cmlidXRlKCJ1djIiLChuZXcgUShuZXcgRmxvYXQzMkFycmF5KDIqYS51dnMyLmxlbmd0aCksMikpLmNvcHlWZWN0b3Iyc0FycmF5KGEudXZzMikpOwp0aGlzLmdyb3Vwcz1hLmdyb3Vwcztmb3IodmFyIGMgaW4gYS5tb3JwaFRhcmdldHMpe2Zvcih2YXIgZT1bXSxnPWEubW9ycGhUYXJnZXRzW2NdLHI9MCx2PWcubGVuZ3RoO3I8djtyKyspe3ZhciB6PWdbcl0sRT1uZXcgY2EoMyp6LmRhdGEubGVuZ3RoLDMpO0UubmFtZT16Lm5hbWU7ZS5wdXNoKEUuY29weVZlY3RvcjNzQXJyYXkoei5kYXRhKSl9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbY109ZX0wPGEuc2tpbkluZGljZXMubGVuZ3RoJiYoYz1uZXcgY2EoNCphLnNraW5JbmRpY2VzLmxlbmd0aCw0KSx0aGlzLmFkZEF0dHJpYnV0ZSgic2tpbkluZGV4IixjLmNvcHlWZWN0b3I0c0FycmF5KGEuc2tpbkluZGljZXMpKSk7MDxhLnNraW5XZWlnaHRzLmxlbmd0aCYmKGM9bmV3IGNhKDQqYS5za2luV2VpZ2h0cy5sZW5ndGgsNCksdGhpcy5hZGRBdHRyaWJ1dGUoInNraW5XZWlnaHQiLGMuY29weVZlY3RvcjRzQXJyYXkoYS5za2luV2VpZ2h0cykpKTtudWxsIT09YS5ib3VuZGluZ1NwaGVyZSYmCih0aGlzLmJvdW5kaW5nU3BoZXJlPWEuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWEuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWEuYm91bmRpbmdCb3guY2xvbmUoKSk7cmV0dXJuIHRoaXN9LGNvbXB1dGVCb3VuZGluZ0JveDpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgdyk7dmFyIGE9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGM9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodm9pZCAwIT09YSl7aWYodGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpLGMpe2E9MDtmb3IodmFyIGU9Yy5sZW5ndGg7YTxlO2ErKylnZS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGNbYV0pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChnZS5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChnZS5tYXgpfX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7Cihpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi54KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueSl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnopKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94OiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX0sY29tcHV0ZUJvdW5kaW5nU3BoZXJlOmZ1bmN0aW9uKCl7bnVsbD09PXRoaXMuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBHKTt2YXIgYT10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sYz10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZihhKXt2YXIgZT10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtnZS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpO2lmKGMpZm9yKHZhciBnPTAscj1jLmxlbmd0aDtnPHI7ZysrKXt2YXIgdj0KY1tnXTtHaS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHYpO2dlLmV4cGFuZEJ5UG9pbnQoR2kubWluKTtnZS5leHBhbmRCeVBvaW50KEdpLm1heCl9Z2UuZ2V0Q2VudGVyKGUpO3ZhciB6PTA7Zz0wO2ZvcihyPWEuY291bnQ7ZzxyO2crKylKYy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsZyksej1NYXRoLm1heCh6LGUuZGlzdGFuY2VUb1NxdWFyZWQoSmMpKTtpZihjKWZvcihnPTAscj1jLmxlbmd0aDtnPHI7ZysrKXt2PWNbZ107YT0wO2Zvcih2YXIgRT12LmNvdW50O2E8RTthKyspSmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh2LGEpLHo9TWF0aC5tYXgoeixlLmRpc3RhbmNlVG9TcXVhcmVkKEpjKSl9dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM9TWF0aC5zcXJ0KHopO2lzTmFOKHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsCnRoaXMpfX0sY29tcHV0ZUZhY2VOb3JtYWxzOmZ1bmN0aW9uKCl7fSxjb21wdXRlVmVydGV4Tm9ybWFsczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaW5kZXgsYz10aGlzLmF0dHJpYnV0ZXM7aWYoYy5wb3NpdGlvbil7dmFyIGU9Yy5wb3NpdGlvbi5hcnJheTtpZih2b2lkIDA9PT1jLm5vcm1hbCl0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgUShuZXcgRmxvYXQzMkFycmF5KGUubGVuZ3RoKSwzKSk7ZWxzZSBmb3IodmFyIGc9Yy5ub3JtYWwuYXJyYXkscj0wLHY9Zy5sZW5ndGg7cjx2O3IrKylnW3JdPTA7Zz1jLm5vcm1hbC5hcnJheTt2YXIgej1uZXcgayxFPW5ldyBrLEY9bmV3IGssSj1uZXcgayxQPW5ldyBrO2lmKGEpe3ZhciBSPWEuYXJyYXk7cj0wO2Zvcih2PWEuY291bnQ7cjx2O3IrPTMpe2E9MypSW3IrMF07dmFyIFM9MypSW3IrMV07dmFyIFY9MypSW3IrMl07ei5mcm9tQXJyYXkoZSxhKTtFLmZyb21BcnJheShlLFMpO0YuZnJvbUFycmF5KGUsVik7Si5zdWJWZWN0b3JzKEYsCkUpO1Auc3ViVmVjdG9ycyh6LEUpO0ouY3Jvc3MoUCk7Z1thXSs9Si54O2dbYSsxXSs9Si55O2dbYSsyXSs9Si56O2dbU10rPUoueDtnW1MrMV0rPUoueTtnW1MrMl0rPUouejtnW1ZdKz1KLng7Z1tWKzFdKz1KLnk7Z1tWKzJdKz1KLnp9fWVsc2UgZm9yKHI9MCx2PWUubGVuZ3RoO3I8djtyKz05KXouZnJvbUFycmF5KGUsciksRS5mcm9tQXJyYXkoZSxyKzMpLEYuZnJvbUFycmF5KGUscis2KSxKLnN1YlZlY3RvcnMoRixFKSxQLnN1YlZlY3RvcnMoeixFKSxKLmNyb3NzKFApLGdbcl09Si54LGdbcisxXT1KLnksZ1tyKzJdPUoueixnW3IrM109Si54LGdbcis0XT1KLnksZ1tyKzVdPUoueixnW3IrNl09Si54LGdbcis3XT1KLnksZ1tyKzhdPUouejt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTtjLm5vcm1hbC5uZWVkc1VwZGF0ZT0hMH19LG1lcmdlOmZ1bmN0aW9uKGEsYyl7aWYoYSYmYS5pc0J1ZmZlckdlb21ldHJ5KXt2b2lkIDA9PT1jJiYoYz0wLGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogT3ZlcndyaXRpbmcgb3JpZ2luYWwgZ2VvbWV0cnksIHN0YXJ0aW5nIGF0IG9mZnNldFx4M2QwLiBVc2UgQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoKSBmb3IgbG9zc2xlc3MgbWVyZ2UuIikpOwp2YXIgZT10aGlzLmF0dHJpYnV0ZXMsZztmb3IoZyBpbiBlKWlmKHZvaWQgMCE9PWEuYXR0cmlidXRlc1tnXSl7dmFyIHI9ZVtnXS5hcnJheSx2PWEuYXR0cmlidXRlc1tnXSx6PXYuYXJyYXksRT12Lml0ZW1TaXplKmM7dj1NYXRoLm1pbih6Lmxlbmd0aCxyLmxlbmd0aC1FKTtmb3IodmFyIEY9MDtGPHY7RisrLEUrKylyW0VdPXpbRl19cmV0dXJuIHRoaXN9Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LiIsYSl9LG5vcm1hbGl6ZU5vcm1hbHM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbCxjPTAsZT1hLmNvdW50O2M8ZTtjKyspSmMueD1hLmdldFgoYyksSmMueT1hLmdldFkoYyksSmMuej1hLmdldFooYyksSmMubm9ybWFsaXplKCksYS5zZXRYWVooYyxKYy54LEpjLnksSmMueil9LHRvTm9uSW5kZXhlZDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoUCwKUil7dmFyIFM9UC5hcnJheTtQPVAuaXRlbVNpemU7Zm9yKHZhciBWPW5ldyBTLmNvbnN0cnVjdG9yKFIubGVuZ3RoKlApLFcsaGE9MCxmYT0wLHJhPVIubGVuZ3RoO2ZhPHJhO2ZhKyspe1c9UltmYV0qUDtmb3IodmFyIHBhPTA7cGE8UDtwYSsrKVZbaGErK109U1tXKytdfXJldHVybiBuZXcgUShWLFApfWlmKG51bGw9PT10aGlzLmluZGV4KXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLHRoaXM7dmFyIGM9bmV3IHZhLGU9dGhpcy5pbmRleC5hcnJheSxnPXRoaXMuYXR0cmlidXRlcyxyO2ZvcihyIGluIGcpe3ZhciB2PWdbcl07dj1hKHYsZSk7Yy5hZGRBdHRyaWJ1dGUocix2KX12YXIgej10aGlzLm1vcnBoQXR0cmlidXRlcztmb3IociBpbiB6KXt2YXIgRT1bXSxGPXpbcl07Zz0wO2Zvcih2YXIgSj1GLmxlbmd0aDtnPEo7ZysrKXY9RltnXSx2PWEodixlKSxFLnB1c2godik7CmMubW9ycGhBdHRyaWJ1dGVzW3JdPUV9ZT10aGlzLmdyb3VwcztnPTA7Zm9yKHI9ZS5sZW5ndGg7ZzxyO2crKyl2PWVbZ10sYy5hZGRHcm91cCh2LnN0YXJ0LHYuY291bnQsdi5tYXRlcmlhbEluZGV4KTtyZXR1cm4gY30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJCdWZmZXJHZW9tZXRyeSIsZ2VuZXJhdG9yOiJCdWZmZXJHZW9tZXRyeS50b0pTT04ifX07YS51dWlkPXRoaXMudXVpZDthLnR5cGU9dGhpcy50eXBlOyIiIT09dGhpcy5uYW1lJiYoYS5uYW1lPXRoaXMubmFtZSk7MDxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGgmJihhLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO2lmKHZvaWQgMCE9PXRoaXMucGFyYW1ldGVycyl7dmFyIGM9dGhpcy5wYXJhbWV0ZXJzO2ZvcihKIGluIGMpdm9pZCAwIT09Y1tKXSYmKGFbSl09Y1tKXSk7cmV0dXJuIGF9YS5kYXRhPXthdHRyaWJ1dGVzOnt9fTtjPXRoaXMuaW5kZXg7bnVsbCE9PQpjJiYoYS5kYXRhLmluZGV4PXt0eXBlOmMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjLmFycmF5KX0pO3ZhciBlPXRoaXMuYXR0cmlidXRlcztmb3IoSiBpbiBlKXtjPWVbSl07dmFyIGc9Yy50b0pTT04oKTsiIiE9PWMubmFtZSYmKGcubmFtZT1jLm5hbWUpO2EuZGF0YS5hdHRyaWJ1dGVzW0pdPWd9ZT17fTt2YXIgcj0hMTtmb3IoSiBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcyl7Zm9yKHZhciB2PXRoaXMubW9ycGhBdHRyaWJ1dGVzW0pdLHo9W10sRT0wLEY9di5sZW5ndGg7RTxGO0UrKyljPXZbRV0sZz1jLnRvSlNPTigpLCIiIT09Yy5uYW1lJiYoZy5uYW1lPWMubmFtZSksei5wdXNoKGcpOzA8ei5sZW5ndGgmJihlW0pdPXoscj0hMCl9ciYmKGEuZGF0YS5tb3JwaEF0dHJpYnV0ZXM9ZSk7dmFyIEo9dGhpcy5ncm91cHM7MDxKLmxlbmd0aCYmKGEuZGF0YS5ncm91cHM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShKKSkpO0o9CnRoaXMuYm91bmRpbmdTcGhlcmU7bnVsbCE9PUomJihhLmRhdGEuYm91bmRpbmdTcGhlcmU9e2NlbnRlcjpKLmNlbnRlci50b0FycmF5KCkscmFkaXVzOkoucmFkaXVzfSk7cmV0dXJuIGF9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB2YSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt2YXIgYzt0aGlzLmluZGV4PW51bGw7dGhpcy5hdHRyaWJ1dGVzPXt9O3RoaXMubW9ycGhBdHRyaWJ1dGVzPXt9O3RoaXMuZ3JvdXBzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMubmFtZT1hLm5hbWU7dmFyIGU9YS5pbmRleDtudWxsIT09ZSYmdGhpcy5zZXRJbmRleChlLmNsb25lKCkpO2U9YS5hdHRyaWJ1dGVzO2Zvcih6IGluIGUpdGhpcy5hZGRBdHRyaWJ1dGUoeixlW3pdLmNsb25lKCkpO3ZhciBnPWEubW9ycGhBdHRyaWJ1dGVzO2Zvcih6IGluIGcpe3ZhciByPVtdLHY9Z1t6XTtlPTA7Zm9yKGM9di5sZW5ndGg7ZTxjO2UrKylyLnB1c2godltlXS5jbG9uZSgpKTsKdGhpcy5tb3JwaEF0dHJpYnV0ZXNbel09cn12YXIgej1hLmdyb3VwcztlPTA7Zm9yKGM9ei5sZW5ndGg7ZTxjO2UrKylnPXpbZV0sdGhpcy5hZGRHcm91cChnLnN0YXJ0LGcuY291bnQsZy5tYXRlcmlhbEluZGV4KTt6PWEuYm91bmRpbmdCb3g7bnVsbCE9PXomJih0aGlzLmJvdW5kaW5nQm94PXouY2xvbmUoKSk7ej1hLmJvdW5kaW5nU3BoZXJlO251bGwhPT16JiYodGhpcy5ib3VuZGluZ1NwaGVyZT16LmNsb25lKCkpO3RoaXMuZHJhd1JhbmdlLnN0YXJ0PWEuZHJhd1JhbmdlLnN0YXJ0O3RoaXMuZHJhd1JhbmdlLmNvdW50PWEuZHJhd1JhbmdlLmNvdW50O3RoaXMudXNlckRhdGE9YS51c2VyRGF0YTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTt2YXIgams9bmV3IHEsaGU9bmV3IEQsSGk9bmV3IEcsTGQ9bmV3IGssTWQ9bmV3IGssTmQ9bmV3IGssJGk9bmV3IGssYWo9bmV3IGssYmo9bmV3IGssSWg9Cm5ldyBrLEpoPW5ldyBrLEtoPW5ldyBrLG9lPW5ldyBmLHBlPW5ldyBmLHFlPW5ldyBmLHNmPW5ldyBrLHNnPW5ldyBrO3hhLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp4YSxpc01lc2g6ITAsc2V0RHJhd01vZGU6ZnVuY3Rpb24oYSl7dGhpcy5kcmF3TW9kZT1hfSxjb3B5OmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZHJhd01vZGU9YS5kcmF3TW9kZTt2b2lkIDAhPT1hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPWEubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpO3ZvaWQgMCE9PWEubW9ycGhUYXJnZXREaWN0aW9uYXJ5JiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSxhLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpO3JldHVybiB0aGlzfSx1cGRhdGVNb3JwaFRhcmdldHM6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpe2E9YS5tb3JwaEF0dHJpYnV0ZXM7dmFyIGM9T2JqZWN0LmtleXMoYSk7aWYoMDxjLmxlbmd0aCl7dmFyIGU9YVtjWzBdXTtpZih2b2lkIDAhPT1lKWZvcih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fSxhPTAsYz1lLmxlbmd0aDthPGM7YSsrKXt2YXIgZz1lW2FdLm5hbWV8fFN0cmluZyhhKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApO3RoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2ddPWF9fX1lbHNlIGE9YS5tb3JwaFRhcmdldHMsdm9pZCAwIT09YSYmMDxhLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWVzaC51cGRhdGVNb3JwaFRhcmdldHMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfSxyYXljYXN0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5nZW9tZXRyeSwKZz10aGlzLm1hdGVyaWFsLHI9dGhpcy5tYXRyaXhXb3JsZDtpZih2b2lkIDAhPT1nJiYobnVsbD09PWUuYm91bmRpbmdTcGhlcmUmJmUuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksSGkuY29weShlLmJvdW5kaW5nU3BoZXJlKSxIaS5hcHBseU1hdHJpeDQociksITEhPT1hLnJheS5pbnRlcnNlY3RzU3BoZXJlKEhpKSYmKGprLmdldEludmVyc2UociksaGUuY29weShhLnJheSkuYXBwbHlNYXRyaXg0KGprKSxudWxsPT09ZS5ib3VuZGluZ0JveHx8ITEhPT1oZS5pbnRlcnNlY3RzQm94KGUuYm91bmRpbmdCb3gpKSkpaWYoZS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgdj1lLmluZGV4O3I9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZhciB6PWUubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLEU9ZS5hdHRyaWJ1dGVzLnV2LEY9ZS5hdHRyaWJ1dGVzLnV2MixKPWUuZ3JvdXBzLFA9ZS5kcmF3UmFuZ2UsUixTO2lmKG51bGwhPT12KWlmKEFycmF5LmlzQXJyYXkoZykpe3ZhciBWPTA7Zm9yKFI9Si5sZW5ndGg7VjwKUjtWKyspe3ZhciBXPUpbVl07dmFyIGhhPWdbVy5tYXRlcmlhbEluZGV4XTt2YXIgZmE9TWF0aC5tYXgoVy5zdGFydCxQLnN0YXJ0KTtmb3IoUz1lPU1hdGgubWluKFcuc3RhcnQrVy5jb3VudCxQLnN0YXJ0K1AuY291bnQpO2ZhPFM7ZmErPTMpe2U9di5nZXRYKGZhKTt2YXIgcmE9di5nZXRYKGZhKzEpO3ZhciBwYT12LmdldFgoZmErMik7aWYoZT1GYSh0aGlzLGhhLGEsaGUscix6LEUsRixlLHJhLHBhKSllLmZhY2VJbmRleD1NYXRoLmZsb29yKGZhLzMpLGUuZmFjZS5tYXRlcmlhbEluZGV4PVcubWF0ZXJpYWxJbmRleCxjLnB1c2goZSl9fX1lbHNlIGZvcihmYT1NYXRoLm1heCgwLFAuc3RhcnQpLGU9TWF0aC5taW4odi5jb3VudCxQLnN0YXJ0K1AuY291bnQpLFY9ZmEsUj1lO1Y8UjtWKz0zKXtpZihlPXYuZ2V0WChWKSxyYT12LmdldFgoVisxKSxwYT12LmdldFgoVisyKSxlPUZhKHRoaXMsZyxhLGhlLHIseixFLEYsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihWLzMpLApjLnB1c2goZSl9ZWxzZSBpZih2b2lkIDAhPT1yKWlmKEFycmF5LmlzQXJyYXkoZykpZm9yKFY9MCxSPUoubGVuZ3RoO1Y8UjtWKyspZm9yKFc9SltWXSxoYT1nW1cubWF0ZXJpYWxJbmRleF0sZmE9TWF0aC5tYXgoVy5zdGFydCxQLnN0YXJ0KSxTPWU9TWF0aC5taW4oVy5zdGFydCtXLmNvdW50LFAuc3RhcnQrUC5jb3VudCk7ZmE8UztmYSs9Myl7aWYoZT1mYSxyYT1mYSsxLHBhPWZhKzIsZT1GYSh0aGlzLGhhLGEsaGUscix6LEUsRixlLHJhLHBhKSllLmZhY2VJbmRleD1NYXRoLmZsb29yKGZhLzMpLGUuZmFjZS5tYXRlcmlhbEluZGV4PVcubWF0ZXJpYWxJbmRleCxjLnB1c2goZSl9ZWxzZSBmb3IoZmE9TWF0aC5tYXgoMCxQLnN0YXJ0KSxlPU1hdGgubWluKHIuY291bnQsUC5zdGFydCtQLmNvdW50KSxWPWZhLFI9ZTtWPFI7Vis9MylpZihlPVYscmE9VisxLHBhPVYrMixlPUZhKHRoaXMsZyxhLGhlLHIseixFLEYsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihWLzMpLGMucHVzaChlKX1lbHNlIGlmKGUuaXNHZW9tZXRyeSlmb3Iocj0KQXJyYXkuaXNBcnJheShnKSx6PWUudmVydGljZXMsRT1lLmZhY2VzLGU9ZS5mYWNlVmVydGV4VXZzWzBdLDA8ZS5sZW5ndGgmJih2PWUpLFY9MCxSPUUubGVuZ3RoO1Y8UjtWKyspaWYoVz1FW1ZdLGU9cj9nW1cubWF0ZXJpYWxJbmRleF06Zyx2b2lkIDAhPT1lJiYoRj16W1cuYV0sSj16W1cuYl0sUD16W1cuY10sZT1BYSh0aGlzLGUsYSxoZSxGLEosUCxzZikpKXYmJnZbVl0mJihoYT12W1ZdLG9lLmNvcHkoaGFbMF0pLHBlLmNvcHkoaGFbMV0pLHFlLmNvcHkoaGFbMl0pLGUudXY9Qi5nZXRVVihzZixGLEosUCxvZSxwZSxxZSxuZXcgZikpLGUuZmFjZT1XLGUuZmFjZUluZGV4PVYsYy5wdXNoKGUpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmdlb21ldHJ5LHRoaXMubWF0ZXJpYWwpKS5jb3B5KHRoaXMpfX0pO3ZhciBSaz0wLFljPW5ldyBxLElpPW5ldyBBLG9oPW5ldyBrO3lhLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6eWEsaXNHZW9tZXRyeTohMCxhcHBseU1hdHJpeDpmdW5jdGlvbihhKXtmb3IodmFyIGM9KG5ldyB0KS5nZXROb3JtYWxNYXRyaXgoYSksZT0wLGc9dGhpcy52ZXJ0aWNlcy5sZW5ndGg7ZTxnO2UrKyl0aGlzLnZlcnRpY2VzW2VdLmFwcGx5TWF0cml4NChhKTtlPTA7Zm9yKGc9dGhpcy5mYWNlcy5sZW5ndGg7ZTxnO2UrKyl7YT10aGlzLmZhY2VzW2VdO2Eubm9ybWFsLmFwcGx5TWF0cml4MyhjKS5ub3JtYWxpemUoKTtmb3IodmFyIHI9MCx2PWEudmVydGV4Tm9ybWFscy5sZW5ndGg7cjx2O3IrKylhLnZlcnRleE5vcm1hbHNbcl0uYXBwbHlNYXRyaXgzKGMpLm5vcm1hbGl6ZSgpfW51bGwhPT10aGlzLmJvdW5kaW5nQm94JiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO251bGwhPT10aGlzLmJvdW5kaW5nU3BoZXJlJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3RoaXMubm9ybWFsc05lZWRVcGRhdGU9dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9ITA7cmV0dXJuIHRoaXN9LApyb3RhdGVYOmZ1bmN0aW9uKGEpe1ljLm1ha2VSb3RhdGlvblgoYSk7dGhpcy5hcHBseU1hdHJpeChZYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVk6ZnVuY3Rpb24oYSl7WWMubWFrZVJvdGF0aW9uWShhKTt0aGlzLmFwcGx5TWF0cml4KFljKTtyZXR1cm4gdGhpc30scm90YXRlWjpmdW5jdGlvbihhKXtZYy5tYWtlUm90YXRpb25aKGEpO3RoaXMuYXBwbHlNYXRyaXgoWWMpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSxjLGUpe1ljLm1ha2VUcmFuc2xhdGlvbihhLGMsZSk7dGhpcy5hcHBseU1hdHJpeChZYyk7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEsYyxlKXtZYy5tYWtlU2NhbGUoYSxjLGUpO3RoaXMuYXBwbHlNYXRyaXgoWWMpO3JldHVybiB0aGlzfSxsb29rQXQ6ZnVuY3Rpb24oYSl7SWkubG9va0F0KGEpO0lpLnVwZGF0ZU1hdHJpeCgpO3RoaXMuYXBwbHlNYXRyaXgoSWkubWF0cml4KTtyZXR1cm4gdGhpc30sZnJvbUJ1ZmZlckdlb21ldHJ5OmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoViwKVyxoYSxmYSl7dmFyIHJhPXZvaWQgMD09PUU/W106W2UuY29sb3JzW1ZdLmNsb25lKCksZS5jb2xvcnNbV10uY2xvbmUoKSxlLmNvbG9yc1toYV0uY2xvbmUoKV0scGE9dm9pZCAwPT09ej9bXTpbKG5ldyBrKS5mcm9tQXJyYXkoeiwzKlYpLChuZXcgaykuZnJvbUFycmF5KHosMypXKSwobmV3IGspLmZyb21BcnJheSh6LDMqaGEpXTtmYT1uZXcgSyhWLFcsaGEscGEscmEsZmEpO2UuZmFjZXMucHVzaChmYSk7dm9pZCAwIT09RiYmZS5mYWNlVmVydGV4VXZzWzBdLnB1c2goWyhuZXcgZikuZnJvbUFycmF5KEYsMipWKSwobmV3IGYpLmZyb21BcnJheShGLDIqVyksKG5ldyBmKS5mcm9tQXJyYXkoRiwyKmhhKV0pO3ZvaWQgMCE9PUomJmUuZmFjZVZlcnRleFV2c1sxXS5wdXNoKFsobmV3IGYpLmZyb21BcnJheShKLDIqViksKG5ldyBmKS5mcm9tQXJyYXkoSiwyKlcpLChuZXcgZikuZnJvbUFycmF5KEosMipoYSldKX12YXIgZT10aGlzLGc9bnVsbCE9PWEuaW5kZXg/YS5pbmRleC5hcnJheToKdm9pZCAwLHI9YS5hdHRyaWJ1dGVzLHY9ci5wb3NpdGlvbi5hcnJheSx6PXZvaWQgMCE9PXIubm9ybWFsP3Iubm9ybWFsLmFycmF5OnZvaWQgMCxFPXZvaWQgMCE9PXIuY29sb3I/ci5jb2xvci5hcnJheTp2b2lkIDAsRj12b2lkIDAhPT1yLnV2P3IudXYuYXJyYXk6dm9pZCAwLEo9dm9pZCAwIT09ci51djI/ci51djIuYXJyYXk6dm9pZCAwO3ZvaWQgMCE9PUomJih0aGlzLmZhY2VWZXJ0ZXhVdnNbMV09W10pO2ZvcihyPTA7cjx2Lmxlbmd0aDtyKz0zKWUudmVydGljZXMucHVzaCgobmV3IGspLmZyb21BcnJheSh2LHIpKSx2b2lkIDAhPT1FJiZlLmNvbG9ycy5wdXNoKChuZXcgSSkuZnJvbUFycmF5KEUscikpO3ZhciBQPWEuZ3JvdXBzO2lmKDA8UC5sZW5ndGgpZm9yKHI9MDtyPFAubGVuZ3RoO3IrKyl7dj1QW3JdO3ZhciBSPXYuc3RhcnQsUz1SO2ZvcihSKz12LmNvdW50O1M8UjtTKz0zKXZvaWQgMCE9PWc/YyhnW1NdLGdbUysxXSxnW1MrMl0sdi5tYXRlcmlhbEluZGV4KTpjKFMsClMrMSxTKzIsdi5tYXRlcmlhbEluZGV4KX1lbHNlIGlmKHZvaWQgMCE9PWcpZm9yKHI9MDtyPGcubGVuZ3RoO3IrPTMpYyhnW3JdLGdbcisxXSxnW3IrMl0pO2Vsc2UgZm9yKHI9MDtyPHYubGVuZ3RoLzM7cis9MyljKHIscisxLHIrMik7dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtudWxsIT09YS5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9YS5ib3VuZGluZ0JveC5jbG9uZSgpKTtudWxsIT09YS5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9YS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtyZXR1cm4gdGhpc30sY2VudGVyOmZ1bmN0aW9uKCl7dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTt0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihvaCkubmVnYXRlKCk7dGhpcy50cmFuc2xhdGUob2gueCxvaC55LG9oLnopO3JldHVybiB0aGlzfSxub3JtYWxpemU6ZnVuY3Rpb24oKXt0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3ZhciBhPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyLApjPXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzO2M9MD09PWM/MToxL2M7dmFyIGU9bmV3IHE7ZS5zZXQoYywwLDAsLWMqYS54LDAsYywwLC1jKmEueSwwLDAsYywtYyphLnosMCwwLDAsMSk7dGhpcy5hcHBseU1hdHJpeChlKTtyZXR1cm4gdGhpc30sY29tcHV0ZUZhY2VOb3JtYWxzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBrLGM9bmV3IGssZT0wLGc9dGhpcy5mYWNlcy5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9dGhpcy5mYWNlc1tlXSx2PXRoaXMudmVydGljZXNbci5hXSx6PXRoaXMudmVydGljZXNbci5iXTthLnN1YlZlY3RvcnModGhpcy52ZXJ0aWNlc1tyLmNdLHopO2Muc3ViVmVjdG9ycyh2LHopO2EuY3Jvc3MoYyk7YS5ub3JtYWxpemUoKTtyLm5vcm1hbC5jb3B5KGEpfX0sY29tcHV0ZVZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9ITApO3ZhciBjO3ZhciBlPUFycmF5KHRoaXMudmVydGljZXMubGVuZ3RoKTt2YXIgZz0wO2ZvcihjPXRoaXMudmVydGljZXMubGVuZ3RoO2c8CmM7ZysrKWVbZ109bmV3IGs7aWYoYSl7dmFyIHI9bmV3IGssdj1uZXcgazthPTA7Zm9yKGc9dGhpcy5mYWNlcy5sZW5ndGg7YTxnO2ErKyl7Yz10aGlzLmZhY2VzW2FdO3ZhciB6PXRoaXMudmVydGljZXNbYy5hXTt2YXIgRT10aGlzLnZlcnRpY2VzW2MuYl07dmFyIEY9dGhpcy52ZXJ0aWNlc1tjLmNdO3Iuc3ViVmVjdG9ycyhGLEUpO3Yuc3ViVmVjdG9ycyh6LEUpO3IuY3Jvc3Modik7ZVtjLmFdLmFkZChyKTtlW2MuYl0uYWRkKHIpO2VbYy5jXS5hZGQocil9fWVsc2UgZm9yKHRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCksYT0wLGc9dGhpcy5mYWNlcy5sZW5ndGg7YTxnO2ErKyljPXRoaXMuZmFjZXNbYV0sZVtjLmFdLmFkZChjLm5vcm1hbCksZVtjLmJdLmFkZChjLm5vcm1hbCksZVtjLmNdLmFkZChjLm5vcm1hbCk7Zz0wO2ZvcihjPXRoaXMudmVydGljZXMubGVuZ3RoO2c8YztnKyspZVtnXS5ub3JtYWxpemUoKTthPTA7Zm9yKGc9dGhpcy5mYWNlcy5sZW5ndGg7YTxnO2ErKyljPQp0aGlzLmZhY2VzW2FdLHo9Yy52ZXJ0ZXhOb3JtYWxzLDM9PT16Lmxlbmd0aD8oelswXS5jb3B5KGVbYy5hXSkselsxXS5jb3B5KGVbYy5iXSkselsyXS5jb3B5KGVbYy5jXSkpOih6WzBdPWVbYy5hXS5jbG9uZSgpLHpbMV09ZVtjLmJdLmNsb25lKCkselsyXT1lW2MuY10uY2xvbmUoKSk7MDx0aGlzLmZhY2VzLmxlbmd0aCYmKHRoaXMubm9ybWFsc05lZWRVcGRhdGU9ITApfSxjb21wdXRlRmxhdFZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oKXt2YXIgYTt0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO3ZhciBjPTA7Zm9yKGE9dGhpcy5mYWNlcy5sZW5ndGg7YzxhO2MrKyl7dmFyIGU9dGhpcy5mYWNlc1tjXTt2YXIgZz1lLnZlcnRleE5vcm1hbHM7Mz09PWcubGVuZ3RoPyhnWzBdLmNvcHkoZS5ub3JtYWwpLGdbMV0uY29weShlLm5vcm1hbCksZ1syXS5jb3B5KGUubm9ybWFsKSk6KGdbMF09ZS5ub3JtYWwuY2xvbmUoKSxnWzFdPWUubm9ybWFsLmNsb25lKCksZ1syXT1lLm5vcm1hbC5jbG9uZSgpKX0wPAp0aGlzLmZhY2VzLmxlbmd0aCYmKHRoaXMubm9ybWFsc05lZWRVcGRhdGU9ITApfSxjb21wdXRlTW9ycGhOb3JtYWxzOmZ1bmN0aW9uKCl7dmFyIGEsYzt2YXIgZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8YztlKyspe3ZhciBnPXRoaXMuZmFjZXNbZV07Zy5fX29yaWdpbmFsRmFjZU5vcm1hbD9nLl9fb3JpZ2luYWxGYWNlTm9ybWFsLmNvcHkoZy5ub3JtYWwpOmcuX19vcmlnaW5hbEZhY2VOb3JtYWw9Zy5ub3JtYWwuY2xvbmUoKTtnLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzfHwoZy5fX29yaWdpbmFsVmVydGV4Tm9ybWFscz1bXSk7dmFyIHI9MDtmb3IoYT1nLnZlcnRleE5vcm1hbHMubGVuZ3RoO3I8YTtyKyspZy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1tyXT9nLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzW3JdLmNvcHkoZy52ZXJ0ZXhOb3JtYWxzW3JdKTpnLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzW3JdPWcudmVydGV4Tm9ybWFsc1tyXS5jbG9uZSgpfXZhciB2PW5ldyB5YTsKdi5mYWNlcz10aGlzLmZhY2VzO3I9MDtmb3IoYT10aGlzLm1vcnBoVGFyZ2V0cy5sZW5ndGg7cjxhO3IrKyl7aWYoIXRoaXMubW9ycGhOb3JtYWxzW3JdKXt0aGlzLm1vcnBoTm9ybWFsc1tyXT17fTt0aGlzLm1vcnBoTm9ybWFsc1tyXS5mYWNlTm9ybWFscz1bXTt0aGlzLm1vcnBoTm9ybWFsc1tyXS52ZXJ0ZXhOb3JtYWxzPVtdO2c9dGhpcy5tb3JwaE5vcm1hbHNbcl0uZmFjZU5vcm1hbHM7dmFyIHo9dGhpcy5tb3JwaE5vcm1hbHNbcl0udmVydGV4Tm9ybWFscztlPTA7Zm9yKGM9dGhpcy5mYWNlcy5sZW5ndGg7ZTxjO2UrKyl7dmFyIEU9bmV3IGs7dmFyIEY9e2E6bmV3IGssYjpuZXcgayxjOm5ldyBrfTtnLnB1c2goRSk7ei5wdXNoKEYpfX16PXRoaXMubW9ycGhOb3JtYWxzW3JdO3YudmVydGljZXM9dGhpcy5tb3JwaFRhcmdldHNbcl0udmVydGljZXM7di5jb21wdXRlRmFjZU5vcm1hbHMoKTt2LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7ZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8CmM7ZSsrKWc9dGhpcy5mYWNlc1tlXSxFPXouZmFjZU5vcm1hbHNbZV0sRj16LnZlcnRleE5vcm1hbHNbZV0sRS5jb3B5KGcubm9ybWFsKSxGLmEuY29weShnLnZlcnRleE5vcm1hbHNbMF0pLEYuYi5jb3B5KGcudmVydGV4Tm9ybWFsc1sxXSksRi5jLmNvcHkoZy52ZXJ0ZXhOb3JtYWxzWzJdKX1lPTA7Zm9yKGM9dGhpcy5mYWNlcy5sZW5ndGg7ZTxjO2UrKylnPXRoaXMuZmFjZXNbZV0sZy5ub3JtYWw9Zy5fX29yaWdpbmFsRmFjZU5vcm1hbCxnLnZlcnRleE5vcm1hbHM9Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc30sY29tcHV0ZUJvdW5kaW5nQm94OmZ1bmN0aW9uKCl7bnVsbD09PXRoaXMuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PW5ldyB3KTt0aGlzLmJvdW5kaW5nQm94LnNldEZyb21Qb2ludHModGhpcy52ZXJ0aWNlcyl9LGNvbXB1dGVCb3VuZGluZ1NwaGVyZTpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nU3BoZXJlJiYodGhpcy5ib3VuZGluZ1NwaGVyZT0KbmV3IEcpO3RoaXMuYm91bmRpbmdTcGhlcmUuc2V0RnJvbVBvaW50cyh0aGlzLnZlcnRpY2VzKX0sbWVyZ2U6ZnVuY3Rpb24oYSxjLGUpe2lmKGEmJmEuaXNHZW9tZXRyeSl7dmFyIGcscj10aGlzLnZlcnRpY2VzLmxlbmd0aCx2PXRoaXMudmVydGljZXMsej1hLnZlcnRpY2VzLEU9dGhpcy5mYWNlcyxGPWEuZmFjZXMsSj10aGlzLmNvbG9ycyxQPWEuY29sb3JzO3ZvaWQgMD09PWUmJihlPTApO3ZvaWQgMCE9PWMmJihnPShuZXcgdCkuZ2V0Tm9ybWFsTWF0cml4KGMpKTtmb3IodmFyIFI9MCxTPXoubGVuZ3RoO1I8UztSKyspe3ZhciBWPXpbUl0uY2xvbmUoKTt2b2lkIDAhPT1jJiZWLmFwcGx5TWF0cml4NChjKTt2LnB1c2goVil9Uj0wO2ZvcihTPVAubGVuZ3RoO1I8UztSKyspSi5wdXNoKFBbUl0uY2xvbmUoKSk7Uj0wO2ZvcihTPUYubGVuZ3RoO1I8UztSKyspe3o9RltSXTt2YXIgVz16LnZlcnRleE5vcm1hbHM7UD16LnZlcnRleENvbG9ycztKPW5ldyBLKHouYStyLHouYityLHouYysKcik7Si5ub3JtYWwuY29weSh6Lm5vcm1hbCk7dm9pZCAwIT09ZyYmSi5ub3JtYWwuYXBwbHlNYXRyaXgzKGcpLm5vcm1hbGl6ZSgpO2M9MDtmb3Iodj1XLmxlbmd0aDtjPHY7YysrKVY9V1tjXS5jbG9uZSgpLHZvaWQgMCE9PWcmJlYuYXBwbHlNYXRyaXgzKGcpLm5vcm1hbGl6ZSgpLEoudmVydGV4Tm9ybWFscy5wdXNoKFYpO0ouY29sb3IuY29weSh6LmNvbG9yKTtjPTA7Zm9yKHY9UC5sZW5ndGg7Yzx2O2MrKylWPVBbY10sSi52ZXJ0ZXhDb2xvcnMucHVzaChWLmNsb25lKCkpO0oubWF0ZXJpYWxJbmRleD16Lm1hdGVyaWFsSW5kZXgrZTtFLnB1c2goSil9Uj0wO2ZvcihTPWEuZmFjZVZlcnRleFV2cy5sZW5ndGg7UjxTO1IrKylmb3IoZT1hLmZhY2VWZXJ0ZXhVdnNbUl0sdm9pZCAwPT09dGhpcy5mYWNlVmVydGV4VXZzW1JdJiYodGhpcy5mYWNlVmVydGV4VXZzW1JdPVtdKSxjPTAsdj1lLmxlbmd0aDtjPHY7YysrKXtnPWVbY107cj1bXTtFPTA7Zm9yKEY9Zy5sZW5ndGg7RTxGO0UrKylyLnB1c2goZ1tFXS5jbG9uZSgpKTsKdGhpcy5mYWNlVmVydGV4VXZzW1JdLnB1c2gocil9fWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkdlb21ldHJ5LiIsYSl9LG1lcmdlTWVzaDpmdW5jdGlvbihhKXthJiZhLmlzTWVzaD8oYS5tYXRyaXhBdXRvVXBkYXRlJiZhLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWVyZ2UoYS5nZW9tZXRyeSxhLm1hdHJpeCkpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5Lm1lcmdlTWVzaCgpOiBtZXNoIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5NZXNoLiIsYSl9LG1lcmdlVmVydGljZXM6ZnVuY3Rpb24oKXt2YXIgYT17fSxjPVtdLGU9W10sZz1NYXRoLnBvdygxMCw0KSxyO3ZhciB2PTA7Zm9yKHI9dGhpcy52ZXJ0aWNlcy5sZW5ndGg7djxyO3YrKyl7dmFyIHo9dGhpcy52ZXJ0aWNlc1t2XTt6PU1hdGgucm91bmQoei54KmcpKyJfIitNYXRoLnJvdW5kKHoueSpnKSsiXyIrTWF0aC5yb3VuZCh6LnoqCmcpO3ZvaWQgMD09PWFbel0/KGFbel09dixjLnB1c2godGhpcy52ZXJ0aWNlc1t2XSksZVt2XT1jLmxlbmd0aC0xKTplW3ZdPWVbYVt6XV19YT1bXTt2PTA7Zm9yKHI9dGhpcy5mYWNlcy5sZW5ndGg7djxyO3YrKylmb3IoZz10aGlzLmZhY2VzW3ZdLGcuYT1lW2cuYV0sZy5iPWVbZy5iXSxnLmM9ZVtnLmNdLGc9W2cuYSxnLmIsZy5jXSx6PTA7Mz56O3orKylpZihnW3pdPT09Z1soeisxKSUzXSl7YS5wdXNoKHYpO2JyZWFrfWZvcih2PWEubGVuZ3RoLTE7MDw9djt2LS0pZm9yKGc9YVt2XSx0aGlzLmZhY2VzLnNwbGljZShnLDEpLGU9MCxyPXRoaXMuZmFjZVZlcnRleFV2cy5sZW5ndGg7ZTxyO2UrKyl0aGlzLmZhY2VWZXJ0ZXhVdnNbZV0uc3BsaWNlKGcsMSk7dj10aGlzLnZlcnRpY2VzLmxlbmd0aC1jLmxlbmd0aDt0aGlzLnZlcnRpY2VzPWM7cmV0dXJuIHZ9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSl7dGhpcy52ZXJ0aWNlcz1bXTtmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2M8ZTtjKyspe3ZhciBnPQphW2NdO3RoaXMudmVydGljZXMucHVzaChuZXcgayhnLngsZy55LGcuenx8MCkpfXJldHVybiB0aGlzfSxzb3J0RmFjZXNCeU1hdGVyaWFsSW5kZXg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mYWNlcyxjPWEubGVuZ3RoLGU9MDtlPGM7ZSsrKWFbZV0uX2lkPWU7YS5zb3J0KGZ1bmN0aW9uKEYsSil7cmV0dXJuIEYubWF0ZXJpYWxJbmRleC1KLm1hdGVyaWFsSW5kZXh9KTt2YXIgZz10aGlzLmZhY2VWZXJ0ZXhVdnNbMF0scj10aGlzLmZhY2VWZXJ0ZXhVdnNbMV0sdix6O2cmJmcubGVuZ3RoPT09YyYmKHY9W10pO3ImJnIubGVuZ3RoPT09YyYmKHo9W10pO2ZvcihlPTA7ZTxjO2UrKyl7dmFyIEU9YVtlXS5faWQ7diYmdi5wdXNoKGdbRV0pO3omJnoucHVzaChyW0VdKX12JiYodGhpcy5mYWNlVmVydGV4VXZzWzBdPXYpO3omJih0aGlzLmZhY2VWZXJ0ZXhVdnNbMV09eil9LHRvSlNPTjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEob2EsdGEsQmEpe3JldHVybiBCYT9vYXwxPDx0YTpvYSYKfigxPDx0YSl9ZnVuY3Rpb24gYyhvYSl7dmFyIHRhPW9hLngudG9TdHJpbmcoKStvYS55LnRvU3RyaW5nKCkrb2Euei50b1N0cmluZygpO2lmKHZvaWQgMCE9PUpbdGFdKXJldHVybiBKW3RhXTtKW3RhXT1GLmxlbmd0aC8zO0YucHVzaChvYS54LG9hLnksb2Eueik7cmV0dXJuIEpbdGFdfWZ1bmN0aW9uIGUob2Epe3ZhciB0YT1vYS5yLnRvU3RyaW5nKCkrb2EuZy50b1N0cmluZygpK29hLmIudG9TdHJpbmcoKTtpZih2b2lkIDAhPT1SW3RhXSlyZXR1cm4gUlt0YV07Ult0YV09UC5sZW5ndGg7UC5wdXNoKG9hLmdldEhleCgpKTtyZXR1cm4gUlt0YV19ZnVuY3Rpb24gZyhvYSl7dmFyIHRhPW9hLngudG9TdHJpbmcoKStvYS55LnRvU3RyaW5nKCk7aWYodm9pZCAwIT09Vlt0YV0pcmV0dXJuIFZbdGFdO1ZbdGFdPVMubGVuZ3RoLzI7Uy5wdXNoKG9hLngsb2EueSk7cmV0dXJuIFZbdGFdfXZhciByPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiR2VvbWV0cnkiLGdlbmVyYXRvcjoiR2VvbWV0cnkudG9KU09OIn19OwpyLnV1aWQ9dGhpcy51dWlkO3IudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJihyLm5hbWU9dGhpcy5uYW1lKTtpZih2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe3ZhciB2PXRoaXMucGFyYW1ldGVycyx6O2Zvcih6IGluIHYpdm9pZCAwIT09dlt6XSYmKHJbel09dlt6XSk7cmV0dXJuIHJ9dj1bXTtmb3Ioej0wO3o8dGhpcy52ZXJ0aWNlcy5sZW5ndGg7eisrKXt2YXIgRT10aGlzLnZlcnRpY2VzW3pdO3YucHVzaChFLngsRS55LEUueil9RT1bXTt2YXIgRj1bXSxKPXt9LFA9W10sUj17fSxTPVtdLFY9e307Zm9yKHo9MDt6PHRoaXMuZmFjZXMubGVuZ3RoO3orKyl7dmFyIFc9dGhpcy5mYWNlc1t6XSxoYT12b2lkIDAhPT10aGlzLmZhY2VWZXJ0ZXhVdnNbMF1bel0sZmE9MDxXLm5vcm1hbC5sZW5ndGgoKSxyYT0wPFcudmVydGV4Tm9ybWFscy5sZW5ndGgscGE9MSE9PVcuY29sb3Iucnx8MSE9PVcuY29sb3IuZ3x8MSE9PVcuY29sb3IuYixxYT0wPFcudmVydGV4Q29sb3JzLmxlbmd0aCwKdWE9MDt1YT1hKHVhLDAsMCk7dWE9YSh1YSwxLCEwKTt1YT1hKHVhLDIsITEpO3VhPWEodWEsMyxoYSk7dWE9YSh1YSw0LGZhKTt1YT1hKHVhLDUscmEpO3VhPWEodWEsNixwYSk7dWE9YSh1YSw3LHFhKTtFLnB1c2godWEpO0UucHVzaChXLmEsVy5iLFcuYyk7RS5wdXNoKFcubWF0ZXJpYWxJbmRleCk7aGEmJihoYT10aGlzLmZhY2VWZXJ0ZXhVdnNbMF1bel0sRS5wdXNoKGcoaGFbMF0pLGcoaGFbMV0pLGcoaGFbMl0pKSk7ZmEmJkUucHVzaChjKFcubm9ybWFsKSk7cmEmJihmYT1XLnZlcnRleE5vcm1hbHMsRS5wdXNoKGMoZmFbMF0pLGMoZmFbMV0pLGMoZmFbMl0pKSk7cGEmJkUucHVzaChlKFcuY29sb3IpKTtxYSYmKFc9Vy52ZXJ0ZXhDb2xvcnMsRS5wdXNoKGUoV1swXSksZShXWzFdKSxlKFdbMl0pKSl9ci5kYXRhPXt9O3IuZGF0YS52ZXJ0aWNlcz12O3IuZGF0YS5ub3JtYWxzPUY7MDxQLmxlbmd0aCYmKHIuZGF0YS5jb2xvcnM9UCk7MDxTLmxlbmd0aCYmKHIuZGF0YS51dnM9CltTXSk7ci5kYXRhLmZhY2VzPUU7cmV0dXJuIHJ9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB5YSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt2YXIgYyxlLGc7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLmNvbG9ycz1bXTt0aGlzLmZhY2VzPVtdO3RoaXMuZmFjZVZlcnRleFV2cz1bW11dO3RoaXMubW9ycGhUYXJnZXRzPVtdO3RoaXMubW9ycGhOb3JtYWxzPVtdO3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmxpbmVEaXN0YW5jZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5uYW1lPWEubmFtZTt2YXIgcj1hLnZlcnRpY2VzO3ZhciB2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLnZlcnRpY2VzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEuY29sb3JzO3Y9MDtmb3IoYz1yLmxlbmd0aDt2PGM7disrKXRoaXMuY29sb3JzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEuZmFjZXM7dj0wO2ZvcihjPQpyLmxlbmd0aDt2PGM7disrKXRoaXMuZmFjZXMucHVzaChyW3ZdLmNsb25lKCkpO3Y9MDtmb3IoYz1hLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO3Y8Yzt2Kyspe3ZhciB6PWEuZmFjZVZlcnRleFV2c1t2XTt2b2lkIDA9PT10aGlzLmZhY2VWZXJ0ZXhVdnNbdl0mJih0aGlzLmZhY2VWZXJ0ZXhVdnNbdl09W10pO3I9MDtmb3IoZT16Lmxlbmd0aDtyPGU7cisrKXt2YXIgRT16W3JdLEY9W107dmFyIEo9MDtmb3IoZz1FLmxlbmd0aDtKPGc7SisrKUYucHVzaChFW0pdLmNsb25lKCkpO3RoaXMuZmFjZVZlcnRleFV2c1t2XS5wdXNoKEYpfX1KPWEubW9ycGhUYXJnZXRzO3Y9MDtmb3IoYz1KLmxlbmd0aDt2PGM7disrKXtnPXt9O2cubmFtZT1KW3ZdLm5hbWU7aWYodm9pZCAwIT09Slt2XS52ZXJ0aWNlcylmb3IoZy52ZXJ0aWNlcz1bXSxyPTAsZT1KW3ZdLnZlcnRpY2VzLmxlbmd0aDtyPGU7cisrKWcudmVydGljZXMucHVzaChKW3ZdLnZlcnRpY2VzW3JdLmNsb25lKCkpO2lmKHZvaWQgMCE9PUpbdl0ubm9ybWFscylmb3IoZy5ub3JtYWxzPQpbXSxyPTAsZT1KW3ZdLm5vcm1hbHMubGVuZ3RoO3I8ZTtyKyspZy5ub3JtYWxzLnB1c2goSlt2XS5ub3JtYWxzW3JdLmNsb25lKCkpO3RoaXMubW9ycGhUYXJnZXRzLnB1c2goZyl9Sj1hLm1vcnBoTm9ybWFsczt2PTA7Zm9yKGM9Si5sZW5ndGg7djxjO3YrKyl7Zz17fTtpZih2b2lkIDAhPT1KW3ZdLnZlcnRleE5vcm1hbHMpZm9yKGcudmVydGV4Tm9ybWFscz1bXSxyPTAsZT1KW3ZdLnZlcnRleE5vcm1hbHMubGVuZ3RoO3I8ZTtyKyspej1KW3ZdLnZlcnRleE5vcm1hbHNbcl0sRT17fSxFLmE9ei5hLmNsb25lKCksRS5iPXouYi5jbG9uZSgpLEUuYz16LmMuY2xvbmUoKSxnLnZlcnRleE5vcm1hbHMucHVzaChFKTtpZih2b2lkIDAhPT1KW3ZdLmZhY2VOb3JtYWxzKWZvcihnLmZhY2VOb3JtYWxzPVtdLHI9MCxlPUpbdl0uZmFjZU5vcm1hbHMubGVuZ3RoO3I8ZTtyKyspZy5mYWNlTm9ybWFscy5wdXNoKEpbdl0uZmFjZU5vcm1hbHNbcl0uY2xvbmUoKSk7dGhpcy5tb3JwaE5vcm1hbHMucHVzaChnKX1yPQphLnNraW5XZWlnaHRzO3Y9MDtmb3IoYz1yLmxlbmd0aDt2PGM7disrKXRoaXMuc2tpbldlaWdodHMucHVzaChyW3ZdLmNsb25lKCkpO3I9YS5za2luSW5kaWNlczt2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLnNraW5JbmRpY2VzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEubGluZURpc3RhbmNlczt2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLmxpbmVEaXN0YW5jZXMucHVzaChyW3ZdKTt2PWEuYm91bmRpbmdCb3g7bnVsbCE9PXYmJih0aGlzLmJvdW5kaW5nQm94PXYuY2xvbmUoKSk7dj1hLmJvdW5kaW5nU3BoZXJlO251bGwhPT12JiYodGhpcy5ib3VuZGluZ1NwaGVyZT12LmNsb25lKCkpO3RoaXMuZWxlbWVudHNOZWVkVXBkYXRlPWEuZWxlbWVudHNOZWVkVXBkYXRlO3RoaXMudmVydGljZXNOZWVkVXBkYXRlPWEudmVydGljZXNOZWVkVXBkYXRlO3RoaXMudXZzTmVlZFVwZGF0ZT1hLnV2c05lZWRVcGRhdGU7dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT1hLm5vcm1hbHNOZWVkVXBkYXRlOwp0aGlzLmNvbG9yc05lZWRVcGRhdGU9YS5jb2xvcnNOZWVkVXBkYXRlO3RoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGU9YS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZTt0aGlzLmdyb3Vwc05lZWRVcGRhdGU9YS5ncm91cHNOZWVkVXBkYXRlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO1NhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7U2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNhO1hhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7WGEucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhhO3ZhciBGbT17Y2xvbmU6dWIsbWVyZ2U6QmJ9O3FiLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtxYi5wcm90b3R5cGUuY29uc3RydWN0b3I9cWI7cWIucHJvdG90eXBlLmlzU2hhZGVyTWF0ZXJpYWw9ITA7cWIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmEpO3RoaXMuZnJhZ21lbnRTaGFkZXI9YS5mcmFnbWVudFNoYWRlcjt0aGlzLnZlcnRleFNoYWRlcj1hLnZlcnRleFNoYWRlcjt0aGlzLnVuaWZvcm1zPXViKGEudW5pZm9ybXMpO3RoaXMuZGVmaW5lcz1PYmplY3QuYXNzaWduKHt9LGEuZGVmaW5lcyk7dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy5saWdodHM9YS5saWdodHM7dGhpcy5jbGlwcGluZz1hLmNsaXBwaW5nO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFsczt0aGlzLmV4dGVuc2lvbnM9YS5leHRlbnNpb25zO3JldHVybiB0aGlzfTtxYi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKGEpe3ZhciBjPU0ucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSk7Yy51bmlmb3Jtcz17fTtmb3IodmFyIGUgaW4gdGhpcy51bmlmb3Jtcyl7dmFyIGc9CnRoaXMudW5pZm9ybXNbZV0udmFsdWU7Yy51bmlmb3Jtc1tlXT1nJiZnLmlzVGV4dHVyZT97dHlwZToidCIsdmFsdWU6Zy50b0pTT04oYSkudXVpZH06ZyYmZy5pc0NvbG9yP3t0eXBlOiJjIix2YWx1ZTpnLmdldEhleCgpfTpnJiZnLmlzVmVjdG9yMj97dHlwZToidjIiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzVmVjdG9yMz97dHlwZToidjMiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzVmVjdG9yND97dHlwZToidjQiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzTWF0cml4Mz97dHlwZToibTMiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzTWF0cml4ND97dHlwZToibTQiLHZhbHVlOmcudG9BcnJheSgpfTp7dmFsdWU6Z319MDxPYmplY3Qua2V5cyh0aGlzLmRlZmluZXMpLmxlbmd0aCYmKGMuZGVmaW5lcz10aGlzLmRlZmluZXMpO2MudmVydGV4U2hhZGVyPXRoaXMudmVydGV4U2hhZGVyO2MuZnJhZ21lbnRTaGFkZXI9dGhpcy5mcmFnbWVudFNoYWRlcjthPXt9O2Zvcih2YXIgciBpbiB0aGlzLmV4dGVuc2lvbnMpITA9PT0KdGhpcy5leHRlbnNpb25zW3JdJiYoYVtyXT0hMCk7MDxPYmplY3Qua2V5cyhhKS5sZW5ndGgmJihjLmV4dGVuc2lvbnM9YSk7cmV0dXJuIGN9O3piLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp6Yixpc0NhbWVyYTohMCxjb3B5OmZ1bmN0aW9uKGEsYyl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSxjKTt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KGEubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLnByb2plY3Rpb25NYXRyaXguY29weShhLnByb2plY3Rpb25NYXRyaXgpO3RoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTtyZXR1cm4gdGhpc30sZ2V0V29ybGREaXJlY3Rpb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQ2FtZXJhOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksCmE9bmV3IGspO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApO3ZhciBjPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGEuc2V0KC1jWzhdLC1jWzldLC1jWzEwXSkubm9ybWFsaXplKCl9LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcyxhKTt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19KTt2Yi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZiLGlzUGVyc3BlY3RpdmVDYW1lcmE6ITAsY29weTpmdW5jdGlvbihhLGMpe3piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhLGMpO3RoaXMuZm92PWEuZm92O3RoaXMuem9vbT1hLnpvb207dGhpcy5uZWFyPWEubmVhcjt0aGlzLmZhcj0KYS5mYXI7dGhpcy5mb2N1cz1hLmZvY3VzO3RoaXMuYXNwZWN0PWEuYXNwZWN0O3RoaXMudmlldz1udWxsPT09YS52aWV3P251bGw6T2JqZWN0LmFzc2lnbih7fSxhLnZpZXcpO3RoaXMuZmlsbUdhdWdlPWEuZmlsbUdhdWdlO3RoaXMuZmlsbU9mZnNldD1hLmZpbG1PZmZzZXQ7cmV0dXJuIHRoaXN9LHNldEZvY2FsTGVuZ3RoOmZ1bmN0aW9uKGEpe3RoaXMuZm92PTIqaGIuUkFEMkRFRypNYXRoLmF0YW4oLjUqdGhpcy5nZXRGaWxtSGVpZ2h0KCkvYSk7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LGdldEZvY2FsTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuLjUqdGhpcy5nZXRGaWxtSGVpZ2h0KCkvTWF0aC50YW4oLjUqaGIuREVHMlJBRCp0aGlzLmZvdil9LGdldEVmZmVjdGl2ZUZPVjpmdW5jdGlvbigpe3JldHVybiAyKmhiLlJBRDJERUcqTWF0aC5hdGFuKE1hdGgudGFuKC41KmhiLkRFRzJSQUQqdGhpcy5mb3YpL3RoaXMuem9vbSl9LGdldEZpbG1XaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbG1HYXVnZSoKTWF0aC5taW4odGhpcy5hc3BlY3QsMSl9LGdldEZpbG1IZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UvTWF0aC5tYXgodGhpcy5hc3BlY3QsMSl9LHNldFZpZXdPZmZzZXQ6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3RoaXMuYXNwZWN0PWEvYztudWxsPT09dGhpcy52aWV3JiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KTt0aGlzLnZpZXcuZW5hYmxlZD0hMDt0aGlzLnZpZXcuZnVsbFdpZHRoPWE7dGhpcy52aWV3LmZ1bGxIZWlnaHQ9Yzt0aGlzLnZpZXcub2Zmc2V0WD1lO3RoaXMudmlldy5vZmZzZXRZPWc7dGhpcy52aWV3LndpZHRoPXI7dGhpcy52aWV3LmhlaWdodD12O3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxjbGVhclZpZXdPZmZzZXQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSwKdXBkYXRlUHJvamVjdGlvbk1hdHJpeDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmVhcixjPWEqTWF0aC50YW4oLjUqaGIuREVHMlJBRCp0aGlzLmZvdikvdGhpcy56b29tLGU9MipjLGc9dGhpcy5hc3BlY3QqZSxyPS0uNSpnLHY9dGhpcy52aWV3O2lmKG51bGwhPT10aGlzLnZpZXcmJnRoaXMudmlldy5lbmFibGVkKXt2YXIgej12LmZ1bGxXaWR0aCxFPXYuZnVsbEhlaWdodDtyKz12Lm9mZnNldFgqZy96O2MtPXYub2Zmc2V0WSplL0U7Zyo9di53aWR0aC96O2UqPXYuaGVpZ2h0L0V9dj10aGlzLmZpbG1PZmZzZXQ7MCE9PXYmJihyKz1hKnYvdGhpcy5nZXRGaWxtV2lkdGgoKSk7dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZShyLHIrZyxjLGMtZSxhLHRoaXMuZmFyKTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5wcm9qZWN0aW9uTWF0cml4KX0sdG9KU09OOmZ1bmN0aW9uKGEpe2E9QS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcywKYSk7YS5vYmplY3QuZm92PXRoaXMuZm92O2Eub2JqZWN0Lnpvb209dGhpcy56b29tO2Eub2JqZWN0Lm5lYXI9dGhpcy5uZWFyO2Eub2JqZWN0LmZhcj10aGlzLmZhcjthLm9iamVjdC5mb2N1cz10aGlzLmZvY3VzO2Eub2JqZWN0LmFzcGVjdD10aGlzLmFzcGVjdDtudWxsIT09dGhpcy52aWV3JiYoYS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpO2Eub2JqZWN0LmZpbG1HYXVnZT10aGlzLmZpbG1HYXVnZTthLm9iamVjdC5maWxtT2Zmc2V0PXRoaXMuZmlsbU9mZnNldDtyZXR1cm4gYX19KTtHYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7R2IucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdiO05iLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG0ucHJvdG90eXBlKTtOYi5wcm90b3R5cGUuY29uc3RydWN0b3I9TmI7TmIucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPSEwO05iLnByb3RvdHlwZS5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZT0KZnVuY3Rpb24oYSxjKXt0aGlzLnRleHR1cmUudHlwZT1jLnR5cGU7dGhpcy50ZXh0dXJlLmZvcm1hdD1jLmZvcm1hdDt0aGlzLnRleHR1cmUuZW5jb2Rpbmc9Yy5lbmNvZGluZzt2YXIgZT1uZXcgeSxnPW5ldyBxYih7dHlwZToiQ3ViZW1hcEZyb21FcXVpcmVjdCIsdW5pZm9ybXM6dWIoe3RFcXVpcmVjdDp7dmFsdWU6bnVsbH19KSx2ZXJ0ZXhTaGFkZXI6InZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxufSIsCmZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MThcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NFxudm9pZCBtYWluKCkge1xuXHR2ZWMzIGRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XG5cdHZlYzIgc2FtcGxlVVY7XG5cdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggZGlyZWN0aW9uLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcblx0c2FtcGxlVVYueCBceDNkIGF0YW4oIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xufSIsc2lkZToxLGJsZW5kaW5nOjB9KTtnLnVuaWZvcm1zLnRFcXVpcmVjdC52YWx1ZT1jOwpjPW5ldyB4YShuZXcgWGEoNSw1LDUpLGcpO2UuYWRkKGMpO2c9bmV3IEdiKDEsMTAsMSk7Zy5yZW5kZXJUYXJnZXQ9dGhpcztnLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWU9IkN1YmVDYW1lcmFUZXh0dXJlIjtnLnVwZGF0ZShhLGUpO2MuZ2VvbWV0cnkuZGlzcG9zZSgpO2MubWF0ZXJpYWwuZGlzcG9zZSgpO3JldHVybiB0aGlzfTtBYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShsLnByb3RvdHlwZSk7QWIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUFiO0FiLnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlPSEwO3ZhciBKaT1uZXcgayxHbT1uZXcgayxIbT1uZXcgdDtPYmplY3QuYXNzaWduKEhiLnByb3RvdHlwZSx7aXNQbGFuZTohMCxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLm5vcm1hbC5jb3B5KGEpO3RoaXMuY29uc3RhbnQ9YztyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50czpmdW5jdGlvbihhLGMsZSxnKXt0aGlzLm5vcm1hbC5zZXQoYSxjLGUpO3RoaXMuY29uc3RhbnQ9ZztyZXR1cm4gdGhpc30sCnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50OmZ1bmN0aW9uKGEsYyl7dGhpcy5ub3JtYWwuY29weShhKTt0aGlzLmNvbnN0YW50PS1jLmRvdCh0aGlzLm5vcm1hbCk7cmV0dXJuIHRoaXN9LHNldEZyb21Db3BsYW5hclBvaW50czpmdW5jdGlvbihhLGMsZSl7Yz1KaS5zdWJWZWN0b3JzKGUsYykuY3Jvc3MoR20uc3ViVmVjdG9ycyhhLGMpKS5ub3JtYWxpemUoKTt0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KGMsYSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubm9ybWFsLmNvcHkoYS5ub3JtYWwpO3RoaXMuY29uc3RhbnQ9YS5jb25zdGFudDtyZXR1cm4gdGhpc30sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTt0aGlzLm5vcm1hbC5tdWx0aXBseVNjYWxhcihhKTt0aGlzLmNvbnN0YW50Kj1hO3JldHVybiB0aGlzfSwKbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb25zdGFudCo9LTE7dGhpcy5ub3JtYWwubmVnYXRlKCk7cmV0dXJuIHRoaXN9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KGEpK3RoaXMuY29uc3RhbnR9LGRpc3RhbmNlVG9TcGhlcmU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KGEuY2VudGVyKS1hLnJhZGl1c30scHJvamVjdFBvaW50OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5wcm9qZWN0UG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7cmV0dXJuIGMuY29weSh0aGlzLm5vcm1hbCkubXVsdGlwbHlTY2FsYXIoLXRoaXMuZGlzdGFuY2VUb1BvaW50KGEpKS5hZGQoYSl9LGludGVyc2VjdExpbmU6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5QbGFuZTogLmludGVyc2VjdExpbmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksCmM9bmV3IGspO3ZhciBlPWEuZGVsdGEoSmkpLGc9dGhpcy5ub3JtYWwuZG90KGUpO2lmKDA9PT1nKXtpZigwPT09dGhpcy5kaXN0YW5jZVRvUG9pbnQoYS5zdGFydCkpcmV0dXJuIGMuY29weShhLnN0YXJ0KX1lbHNlIGlmKGc9LShhLnN0YXJ0LmRvdCh0aGlzLm5vcm1hbCkrdGhpcy5jb25zdGFudCkvZywhKDA+Z3x8MTxnKSlyZXR1cm4gYy5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKGcpLmFkZChhLnN0YXJ0KX0saW50ZXJzZWN0c0xpbmU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5kaXN0YW5jZVRvUG9pbnQoYS5zdGFydCk7YT10aGlzLmRpc3RhbmNlVG9Qb2ludChhLmVuZCk7cmV0dXJuIDA+YyYmMDxhfHwwPmEmJjA8Y30saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pbnRlcnNlY3RzUGxhbmUodGhpcyl9LGludGVyc2VjdHNTcGhlcmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW50ZXJzZWN0c1BsYW5lKHRoaXMpfSxjb3BsYW5hclBvaW50OmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5QbGFuZTogLmNvcGxhbmFyUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuY29weSh0aGlzLm5vcm1hbCkubXVsdGlwbHlTY2FsYXIoLXRoaXMuY29uc3RhbnQpfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSxjKXtjPWN8fEhtLmdldE5vcm1hbE1hdHJpeChhKTthPXRoaXMuY29wbGFuYXJQb2ludChKaSkuYXBwbHlNYXRyaXg0KGEpO2M9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKGMpLm5vcm1hbGl6ZSgpO3RoaXMuY29uc3RhbnQ9LWEuZG90KGMpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSl7dGhpcy5jb25zdGFudC09YS5kb3QodGhpcy5ub3JtYWwpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9ybWFsLmVxdWFscyh0aGlzLm5vcm1hbCkmJmEuY29uc3RhbnQ9PT10aGlzLmNvbnN0YW50fX0pO3ZhciBtZj1uZXcgRyxwaD1uZXcgaztPYmplY3QuYXNzaWduKGljLnByb3RvdHlwZSwKe3NldDpmdW5jdGlvbihhLGMsZSxnLHIsdil7dmFyIHo9dGhpcy5wbGFuZXM7elswXS5jb3B5KGEpO3pbMV0uY29weShjKTt6WzJdLmNvcHkoZSk7elszXS5jb3B5KGcpO3pbNF0uY29weShyKTt6WzVdLmNvcHkodik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz10aGlzLnBsYW5lcyxlPTA7Nj5lO2UrKyljW2VdLmNvcHkoYS5wbGFuZXNbZV0pO3JldHVybiB0aGlzfSxzZXRGcm9tTWF0cml4OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGxhbmVzLGU9YS5lbGVtZW50czthPWVbMF07dmFyIGc9ZVsxXSxyPWVbMl0sdj1lWzNdLHo9ZVs0XSxFPWVbNV0sRj1lWzZdLEo9ZVs3XSxQPWVbOF0sUj1lWzldLFM9ZVsxMF0sVj1lWzExXSxXPWVbMTJdLGhhPWVbMTNdLGZhPWVbMTRdO2U9ZVsxNV07Y1swXS5zZXRDb21wb25lbnRzKHYtYSxKLXosVi1QLGUtVykubm9ybWFsaXplKCk7CmNbMV0uc2V0Q29tcG9uZW50cyh2K2EsSit6LFYrUCxlK1cpLm5vcm1hbGl6ZSgpO2NbMl0uc2V0Q29tcG9uZW50cyh2K2csSitFLFYrUixlK2hhKS5ub3JtYWxpemUoKTtjWzNdLnNldENvbXBvbmVudHModi1nLEotRSxWLVIsZS1oYSkubm9ybWFsaXplKCk7Y1s0XS5zZXRDb21wb25lbnRzKHYtcixKLUYsVi1TLGUtZmEpLm5vcm1hbGl6ZSgpO2NbNV0uc2V0Q29tcG9uZW50cyh2K3IsSitGLFYrUyxlK2ZhKS5ub3JtYWxpemUoKTtyZXR1cm4gdGhpc30saW50ZXJzZWN0c09iamVjdDpmdW5jdGlvbihhKXt2YXIgYz1hLmdlb21ldHJ5O251bGw9PT1jLmJvdW5kaW5nU3BoZXJlJiZjLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO21mLmNvcHkoYy5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUobWYpfSxpbnRlcnNlY3RzU3ByaXRlOmZ1bmN0aW9uKGEpe21mLmNlbnRlci5zZXQoMCwwLDApO21mLnJhZGl1cz0KLjcwNzEwNjc4MTE4NjU0NzY7bWYuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUobWYpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGxhbmVzLGU9YS5jZW50ZXI7YT0tYS5yYWRpdXM7Zm9yKHZhciBnPTA7Nj5nO2crKylpZihjW2ddLmRpc3RhbmNlVG9Qb2ludChlKTxhKXJldHVybiExO3JldHVybiEwfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz10aGlzLnBsYW5lcyxlPTA7Nj5lO2UrKyl7dmFyIGc9Y1tlXTtwaC54PTA8Zy5ub3JtYWwueD9hLm1heC54OmEubWluLng7cGgueT0wPGcubm9ybWFsLnk/YS5tYXgueTphLm1pbi55O3BoLno9MDxnLm5vcm1hbC56P2EubWF4Lno6YS5taW4uejtpZigwPmcuZGlzdGFuY2VUb1BvaW50KHBoKSlyZXR1cm4hMX1yZXR1cm4hMH0sY29udGFpbnNQb2ludDpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5wbGFuZXMsZT0wOzY+ZTtlKyspaWYoMD4KY1tlXS5kaXN0YW5jZVRvUG9pbnQoYSkpcmV0dXJuITE7cmV0dXJuITB9fSk7dmFyIHJiPXthbHBoYW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHRkaWZmdXNlQ29sb3IuYSAqXHgzZCB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xuI2VuZGlmIixhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FMUEhBTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xuI2VuZGlmIixhbHBoYXRlc3RfZnJhZ21lbnQ6IiNpZmRlZiBBTFBIQVRFU1Rcblx0aWYgKCBkaWZmdXNlQ29sb3IuYSBceDNjIEFMUEhBVEVTVCApIGRpc2NhcmQ7XG4jZW5kaWYiLGFvbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FPTUFQXG5cdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gXHgzZCAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICpceDNkIGFtYmllbnRPY2NsdXNpb247XG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggU1RBTkRBUkQgKVxuXHRcdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICpceDNkIGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKYW9tYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcblx0dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcbiNlbmRpZiIsYmVnaW5fdmVydGV4OiJ2ZWMzIHRyYW5zZm9ybWVkIFx4M2QgdmVjMyggcG9zaXRpb24gKTsiLGJlZ2lubm9ybWFsX3ZlcnRleDoidmVjMyBvYmplY3ROb3JtYWwgXHgzZCB2ZWMzKCBub3JtYWwgKTtcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIG9iamVjdFRhbmdlbnQgXHgzZCB2ZWMzKCB0YW5nZW50Lnh5eiApO1xuI2VuZGlmIixic2RmczoidmVjMiBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IHZlYzQgYzAgXHgzZCB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xuXHRjb25zdCB2ZWM0IGMxIFx4M2QgdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTtcblx0dmVjNCByIFx4M2Qgcm91Z2huZXNzICogYzAgKyBjMTtcblx0ZmxvYXQgYTAwNCBceDNkIG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XG5cdHJldHVybiB2ZWMyKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XG59XG5mbG9hdCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHtcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXG5cdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiBceDNkIDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcblx0aWYoIGN1dG9mZkRpc3RhbmNlIFx4M2UgMC4wICkge1xuXHRcdGRpc3RhbmNlRmFsbG9mZiAqXHgzZCBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xuXHR9XG5cdHJldHVybiBkaXN0YW5jZUZhbGxvZmY7XG4jZWxzZVxuXHRpZiggY3V0b2ZmRGlzdGFuY2UgXHgzZSAwLjAgXHgyNlx4MjYgZGVjYXlFeHBvbmVudCBceDNlIDAuMCApIHtcblx0XHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XG5cdH1cblx0cmV0dXJuIDEuMDtcbiNlbmRpZlxufVxudmVjMyBCUkRGX0RpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xufVxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XG5cdGZsb2F0IGZyZXNuZWwgXHgzZCBleHAyKCAoIC01LjU1NDczICogZG90TEggLSA2Ljk4MzE2ICkgKiBkb3RMSCApO1xuXHRyZXR1cm4gKCAxLjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcbn1cbnZlYzMgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggY29uc3QgaW4gdmVjMyBGMCwgY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgZnJlc25lbCBceDNkIGV4cDIoICggLTUuNTU0NzMgKiBkb3ROViAtIDYuOTgzMTYgKSAqIGRvdE5WICk7XG5cdHZlYzMgRnIgXHgzZCBtYXgoIHZlYzMoIDEuMCAtIHJvdWdobmVzcyApLCBGMCApIC0gRjA7XG5cdHJldHVybiBGciAqIGZyZXNuZWwgKyBGMDtcbn1cbmZsb2F0IEdfR0dYX1NtaXRoKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGdsIFx4M2QgZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcblx0ZmxvYXQgZ3YgXHgzZCBkb3ROViArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRyZXR1cm4gMS4wIC8gKCBnbCAqIGd2ICk7XG59XG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XG5cdGZsb2F0IGEyIFx4M2QgcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZ3YgXHgzZCBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRmbG9hdCBnbCBceDNkIGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTtcbn1cbmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdGZsb2F0IGEyIFx4M2QgcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZGVub20gXHgzZCBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wO1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGFscGhhIFx4M2QgcG93Miggcm91Z2huZXNzICk7XG5cdHZlYzMgaGFsZkRpciBceDNkIG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyB2aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCBceDNkIHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHIFx4M2QgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XG5cdGZsb2F0IEQgXHgzZCBEX0dHWCggYWxwaGEsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFICBceDNkIDY0LjA7XG5cdGNvbnN0IGZsb2F0IExVVF9TQ0FMRSBceDNkICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFO1xuXHRjb25zdCBmbG9hdCBMVVRfQklBUyAgXHgzZCAwLjUgLyBMVVRfU0laRTtcblx0ZmxvYXQgZG90TlYgXHgzZCBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcblx0dmVjMiB1diBceDNkIHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApO1xuXHR1diBceDNkIHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XG5cdHJldHVybiB1djtcbn1cbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xuXHRmbG9hdCBsIFx4M2QgbGVuZ3RoKCBmICk7XG5cdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcbn1cbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xuXHRmbG9hdCB4IFx4M2QgZG90KCB2MSwgdjIgKTtcblx0ZmxvYXQgeSBceDNkIGFicyggeCApO1xuXHRmbG9hdCBhIFx4M2QgMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5O1xuXHRmbG9hdCBiIFx4M2QgMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5O1xuXHRmbG9hdCB2IFx4M2QgYSAvIGI7XG5cdGZsb2F0IHRoZXRhX3NpbnRoZXRhIFx4M2QgKCB4IFx4M2UgMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjtcblx0cmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhO1xufVxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XG5cdHZlYzMgdjEgXHgzZCByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgdjIgXHgzZCByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgbGlnaHROb3JtYWwgXHgzZCBjcm9zcyggdjEsIHYyICk7XG5cdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgXHgzYyAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XG5cdHZlYzMgVDEsIFQyO1xuXHRUMSBceDNkIG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xuXHRUMiBceDNkIC0gY3Jvc3MoIE4sIFQxICk7XG5cdG1hdDMgbWF0IFx4M2QgbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7XG5cdHZlYzMgY29vcmRzWyA0IF07XG5cdGNvb3Jkc1sgMCBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XG5cdGNvb3Jkc1sgMSBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7XG5cdGNvb3Jkc1sgMiBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XG5cdGNvb3Jkc1sgMyBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XG5cdGNvb3Jkc1sgMCBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDAgXSApO1xuXHRjb29yZHNbIDEgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcblx0Y29vcmRzWyAyIF0gXHgzZCBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XG5cdGNvb3Jkc1sgMyBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDMgXSApO1xuXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICtceDNkIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xuXHRmbG9hdCByZXN1bHQgXHgzZCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTtcblx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0dmVjMiBicmRmIFx4M2QgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHJldHVybiBzcGVjdWxhckNvbG9yICogYnJkZi54ICsgYnJkZi55O1xufVxudm9pZCBCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggc3BlY3VsYXJDb2xvciwgZG90TlYsIHJvdWdobmVzcyApO1xuXHR2ZWMyIGJyZGYgXHgzZCBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMyBGc3NFc3MgXHgzZCBGICogYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFc3MgXHgzZCBicmRmLnggKyBicmRmLnk7XG5cdGZsb2F0IEVtcyBceDNkIDEuMCAtIEVzcztcblx0dmVjMyBGYXZnIFx4M2Qgc3BlY3VsYXJDb2xvciArICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogMC4wNDc2MTk7XHR2ZWMzIEZtcyBceDNkIEZzc0VzcyAqIEZhdmcgLyAoIDEuMCAtIEVtcyAqIEZhdmcgKTtcblx0c2luZ2xlU2NhdHRlciArXHgzZCBGc3NFc3M7XG5cdG11bHRpU2NhdHRlciArXHgzZCBGbXMgKiBFbXM7XG59XG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkge1xuXHRyZXR1cm4gMC4yNTtcbn1cbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcblx0dmVjMyBoYWxmRGlyIFx4M2Qgbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCBceDNkIHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHIFx4M2QgR19CbGlublBob25nX0ltcGxpY2l0KCApO1xuXHRmbG9hdCBEIFx4M2QgRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxuZmxvYXQgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBjb25zdCBpbiBmbG9hdCBnZ3hSb3VnaG5lc3MgKSB7XG5cdHJldHVybiAoIDIuMCAvIHBvdzIoIGdneFJvdWdobmVzcyArIDAuMDAwMSApIC0gMi4wICk7XG59XG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XG5cdHJldHVybiBzcXJ0KCAyLjAgLyAoIGJsaW5uRXhwb25lbnQgKyAyLjAgKSApO1xufVxuI2lmIGRlZmluZWQoIFVTRV9TSEVFTiApXG5mbG9hdCBEX0NoYXJsaWUoZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBOb0gpIHtcblx0ZmxvYXQgaW52QWxwaGEgIFx4M2QgMS4wIC8gcm91Z2huZXNzO1xuXHRmbG9hdCBjb3MyaCBceDNkIE5vSCAqIE5vSDtcblx0ZmxvYXQgc2luMmggXHgzZCBtYXgoMS4wIC0gY29zMmgsIDAuMDA3ODEyNSk7XHRyZXR1cm4gKDIuMCArIGludkFscGhhKSAqIHBvdyhzaW4yaCwgaW52QWxwaGEgKiAwLjUpIC8gKDIuMCAqIFBJKTtcbn1cbmZsb2F0IFZfTmV1YmVsdChmbG9hdCBOb1YsIGZsb2F0IE5vTCkge1xuXHRyZXR1cm4gc2F0dXJhdGUoMS4wIC8gKDQuMCAqIChOb0wgKyBOb1YgLSBOb0wgKiBOb1YpKSk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfU2hlZW4oIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBMLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCB2ZWMzIHNwZWN1bGFyQ29sb3IgKSB7XG5cdHZlYzMgTiBceDNkIGdlb21ldHJ5Lm5vcm1hbDtcblx0dmVjMyBWIFx4M2QgZ2VvbWV0cnkudmlld0Rpcjtcblx0dmVjMyBIIFx4M2Qgbm9ybWFsaXplKCBWICsgTCApO1xuXHRmbG9hdCBkb3ROSCBceDNkIHNhdHVyYXRlKCBkb3QoIE4sIEggKSApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIERfQ2hhcmxpZSggcm91Z2huZXNzLCBkb3ROSCApICogVl9OZXViZWx0KCBkb3QoTiwgViksIGRvdChOLCBMKSApO1xufVxuI2VuZGlmIiwKYnVtcG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0JVTVBNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYnVtcE1hcDtcblx0dW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7XG5cdHZlYzIgZEhkeHlfZndkKCkge1xuXHRcdHZlYzIgZFNUZHggXHgzZCBkRmR4KCB2VXYgKTtcblx0XHR2ZWMyIGRTVGR5IFx4M2QgZEZkeSggdlV2ICk7XG5cdFx0ZmxvYXQgSGxsIFx4M2QgYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKS54O1xuXHRcdGZsb2F0IGRCeCBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHggKS54IC0gSGxsO1xuXHRcdGZsb2F0IGRCeSBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHkgKS54IC0gSGxsO1xuXHRcdHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xuXHR9XG5cdHZlYzMgcGVydHVyYk5vcm1hbEFyYiggdmVjMyBzdXJmX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgZEhkeHkgKSB7XG5cdFx0dmVjMyB2U2lnbWFYIFx4M2QgdmVjMyggZEZkeCggc3VyZl9wb3MueCApLCBkRmR4KCBzdXJmX3Bvcy55ICksIGRGZHgoIHN1cmZfcG9zLnogKSApO1xuXHRcdHZlYzMgdlNpZ21hWSBceDNkIHZlYzMoIGRGZHkoIHN1cmZfcG9zLnggKSwgZEZkeSggc3VyZl9wb3MueSApLCBkRmR5KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZOIFx4M2Qgc3VyZl9ub3JtO1xuXHRcdHZlYzMgUjEgXHgzZCBjcm9zcyggdlNpZ21hWSwgdk4gKTtcblx0XHR2ZWMzIFIyIFx4M2QgY3Jvc3MoIHZOLCB2U2lnbWFYICk7XG5cdFx0ZmxvYXQgZkRldCBceDNkIGRvdCggdlNpZ21hWCwgUjEgKTtcblx0XHRmRGV0ICpceDNkICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHR2ZWMzIHZHcmFkIFx4M2Qgc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XG5cdH1cbiNlbmRpZiIsCmNsaXBwaW5nX3BsYW5lc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgXHgzZSAwXG5cdHZlYzQgcGxhbmU7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xuXHRcdHBsYW5lIFx4M2QgY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRpZiAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgXHgzZSBwbGFuZS53ICkgZGlzY2FyZDtcblx0fVxuXHQjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIFx4M2MgTlVNX0NMSVBQSU5HX1BMQU5FU1xuXHRcdGJvb2wgY2xpcHBlZCBceDNkIHRydWU7XG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRcdGZvciAoIGludCBpIFx4M2QgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIFx4M2MgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRcdHBsYW5lIFx4M2QgY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRcdGNsaXBwZWQgXHgzZCAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgXHgzZSBwbGFuZS53ICkgXHgyNlx4MjYgY2xpcHBlZDtcblx0XHR9XG5cdFx0aWYgKCBjbGlwcGVkICkgZGlzY2FyZDtcblx0I2VuZGlmXG4jZW5kaWYiLApjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgXHgzZSAwXG5cdCNpZiAhIGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgISBkZWZpbmVkKCBQSE9ORyApIFx4MjZceDI2ICEgZGVmaW5lZCggTUFUQ0FQIClcblx0XHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcblx0I2VuZGlmXG5cdHVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMCBceDI2XHgyNiAhIGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgISBkZWZpbmVkKCBQSE9ORyApIFx4MjZceDI2ICEgZGVmaW5lZCggTUFUQ0FQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWYiLGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMCBceDI2XHgyNiAhIGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgISBkZWZpbmVkKCBQSE9ORyApIFx4MjZceDI2ICEgZGVmaW5lZCggTUFUQ0FQIClcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWYiLApjb2xvcl9mcmFnbWVudDoiI2lmZGVmIFVTRV9DT0xPUlxuXHRkaWZmdXNlQ29sb3IucmdiICpceDNkIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9DT0xPUlxuXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmIixjb2xvcl9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9DT0xPUlxuXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmIixjb2xvcl92ZXJ0ZXg6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dkNvbG9yLnh5eiBceDNkIGNvbG9yLnh5ejtcbiNlbmRpZiIsY29tbW9uOiIjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTlcbiNkZWZpbmUgUEkyIDYuMjgzMTg1MzA3MThcbiNkZWZpbmUgUElfSEFMRiAxLjU3MDc5NjMyNjc5NDlcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcbiNkZWZpbmUgTE9HMiAxLjQ0MjY5NVxuI2RlZmluZSBFUFNJTE9OIDFlLTZcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcbiNkZWZpbmUgd2hpdGVDb21wbGVtZW50KGEpICggMS4wIC0gc2F0dXJhdGUoIGEgKSApXG5mbG9hdCBwb3cyKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4OyB9XG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cbmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyIFx4M2QgeCp4OyByZXR1cm4geDIqeDI7IH1cbmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7IHJldHVybiBkb3QoIGNvbG9yLCB2ZWMzKCAwLjMzMzMgKSApOyB9XG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xuXHRjb25zdCBoaWdocCBmbG9hdCBhIFx4M2QgMTIuOTg5OCwgYiBceDNkIDc4LjIzMywgYyBceDNkIDQzNzU4LjU0NTM7XG5cdGhpZ2hwIGZsb2F0IGR0IFx4M2QgZG90KCB1di54eSwgdmVjMiggYSxiICkgKSwgc24gXHgzZCBtb2QoIGR0LCBQSSApO1xuXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xufVxuI2lmZGVmIEhJR0hfUFJFQ0lTSU9OXG5cdGZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHsgcmV0dXJuIGxlbmd0aCggdiApOyB9XG4jZWxzZVxuXHRmbG9hdCBtYXgzKCB2ZWMzIHYgKSB7IHJldHVybiBtYXgoIG1heCggdi54LCB2LnkgKSwgdi56ICk7IH1cblx0ZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkge1xuXHRcdGZsb2F0IG1heENvbXBvbmVudCBceDNkIG1heDMoIGFicyggdiApICk7XG5cdFx0cmV0dXJuIGxlbmd0aCggdiAvIG1heENvbXBvbmVudCApICogbWF4Q29tcG9uZW50O1xuXHR9XG4jZW5kaWZcbnN0cnVjdCBJbmNpZGVudExpZ2h0IHtcblx0dmVjMyBjb2xvcjtcblx0dmVjMyBkaXJlY3Rpb247XG5cdGJvb2wgdmlzaWJsZTtcbn07XG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xuXHR2ZWMzIGRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgZGlyZWN0U3BlY3VsYXI7XG5cdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGluZGlyZWN0U3BlY3VsYXI7XG59O1xuc3RydWN0IEdlb21ldHJpY0NvbnRleHQge1xuXHR2ZWMzIHBvc2l0aW9uO1xuXHR2ZWMzIG5vcm1hbDtcblx0dmVjMyB2aWV3RGlyO1xuI2lmZGVmIENMRUFSQ09BVFxuXHR2ZWMzIGNsZWFyY29hdE5vcm1hbDtcbiNlbmRpZlxufTtcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xufVxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggdmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xufVxudmVjMyBwcm9qZWN0T25QbGFuZShpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0ZmxvYXQgZGlzdGFuY2UgXHgzZCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludCAtIHBvaW50T25QbGFuZSApO1xuXHRyZXR1cm4gLSBkaXN0YW5jZSAqIHBsYW5lTm9ybWFsICsgcG9pbnQ7XG59XG5mbG9hdCBzaWRlT2ZQbGFuZSggaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBzaWduKCBkb3QoIHBvaW50IC0gcG9pbnRPblBsYW5lLCBwbGFuZU5vcm1hbCApICk7XG59XG52ZWMzIGxpbmVQbGFuZUludGVyc2VjdCggaW4gdmVjMyBwb2ludE9uTGluZSwgaW4gdmVjMyBsaW5lRGlyZWN0aW9uLCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0cmV0dXJuIGxpbmVEaXJlY3Rpb24gKiAoIGRvdCggcGxhbmVOb3JtYWwsIHBvaW50T25QbGFuZSAtIHBvaW50T25MaW5lICkgLyBkb3QoIHBsYW5lTm9ybWFsLCBsaW5lRGlyZWN0aW9uICkgKSArIHBvaW50T25MaW5lO1xufVxubWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7XG5cdG1hdDMgdG1wO1xuXHR0bXBbIDAgXSBceDNkIHZlYzMoIG1bIDAgXS54LCBtWyAxIF0ueCwgbVsgMiBdLnggKTtcblx0dG1wWyAxIF0gXHgzZCB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7XG5cdHRtcFsgMiBdIFx4M2QgdmVjMyggbVsgMCBdLnosIG1bIDEgXS56LCBtWyAyIF0ueiApO1xuXHRyZXR1cm4gdG1wO1xufVxuZmxvYXQgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHtcblx0dmVjMyB3ZWlnaHRzIFx4M2QgdmVjMyggMC4yMTI2LCAwLjcxNTIsIDAuMDcyMiApO1xuXHRyZXR1cm4gZG90KCB3ZWlnaHRzLCBjb2xvci5yZ2IgKTtcbn0iLApjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ6IiNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXG4jZGVmaW5lIGN1YmVVVl90ZXh0dXJlU2l6ZSAoMTAyNC4wKVxuaW50IGdldEZhY2VGcm9tRGlyZWN0aW9uKHZlYzMgZGlyZWN0aW9uKSB7XG5cdHZlYzMgYWJzRGlyZWN0aW9uIFx4M2QgYWJzKGRpcmVjdGlvbik7XG5cdGludCBmYWNlIFx4M2QgLTE7XG5cdGlmKCBhYnNEaXJlY3Rpb24ueCBceDNlIGFic0RpcmVjdGlvbi56ICkge1xuXHRcdGlmKGFic0RpcmVjdGlvbi54IFx4M2UgYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi54IFx4M2UgMC4wID8gMCA6IDM7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi55IFx4M2UgMC4wID8gMSA6IDQ7XG5cdH1cblx0ZWxzZSB7XG5cdFx0aWYoYWJzRGlyZWN0aW9uLnogXHgzZSBhYnNEaXJlY3Rpb24ueSApXG5cdFx0XHRmYWNlIFx4M2QgZGlyZWN0aW9uLnogXHgzZSAwLjAgPyAyIDogNTtcblx0XHRlbHNlXG5cdFx0XHRmYWNlIFx4M2QgZGlyZWN0aW9uLnkgXHgzZSAwLjAgPyAxIDogNDtcblx0fVxuXHRyZXR1cm4gZmFjZTtcbn1cbiNkZWZpbmUgY3ViZVVWX21heExvZHMxICAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAxLjApXG4jZGVmaW5lIGN1YmVVVl9yYW5nZUNsYW1wIChleHAyKCg2LjAgLSAxLjApICogMi4wKSlcbnZlYzIgTWlwTGV2ZWxJbmZvKCB2ZWMzIHZlYywgZmxvYXQgcm91Z2huZXNzTGV2ZWwsIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgc2NhbGUgXHgzZCBleHAyKGN1YmVVVl9tYXhMb2RzMSAtIHJvdWdobmVzc0xldmVsKTtcblx0ZmxvYXQgZHhSb3VnaG5lc3MgXHgzZCBkRmR4KHJvdWdobmVzcyk7XG5cdGZsb2F0IGR5Um91Z2huZXNzIFx4M2QgZEZkeShyb3VnaG5lc3MpO1xuXHR2ZWMzIGR4IFx4M2QgZEZkeCggdmVjICogc2NhbGUgKiBkeFJvdWdobmVzcyApO1xuXHR2ZWMzIGR5IFx4M2QgZEZkeSggdmVjICogc2NhbGUgKiBkeVJvdWdobmVzcyApO1xuXHRmbG9hdCBkIFx4M2QgbWF4KCBkb3QoIGR4LCBkeCApLCBkb3QoIGR5LCBkeSApICk7XG5cdGQgXHgzZCBjbGFtcChkLCAxLjAsIGN1YmVVVl9yYW5nZUNsYW1wKTtcblx0ZmxvYXQgbWlwTGV2ZWwgXHgzZCAwLjUgKiBsb2cyKGQpO1xuXHRyZXR1cm4gdmVjMihmbG9vcihtaXBMZXZlbCksIGZyYWN0KG1pcExldmVsKSk7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMiAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAyLjApXG4jZGVmaW5lIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZSAoMS4wIC8gY3ViZVVWX3RleHR1cmVTaXplKVxudmVjMiBnZXRDdWJlVVYodmVjMyBkaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCBtaXBMZXZlbCkge1xuXHRtaXBMZXZlbCBceDNkIHJvdWdobmVzc0xldmVsIFx4M2UgY3ViZVVWX21heExvZHMyIC0gMy4wID8gMC4wIDogbWlwTGV2ZWw7XG5cdGZsb2F0IGEgXHgzZCAxNi4wICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xuXHR2ZWMyIGV4cDJfcGFja2VkIFx4M2QgZXhwMiggdmVjMiggcm91Z2huZXNzTGV2ZWwsIG1pcExldmVsICkgKTtcblx0dmVjMiByY3BfZXhwMl9wYWNrZWQgXHgzZCB2ZWMyKCAxLjAgKSAvIGV4cDJfcGFja2VkO1xuXHRmbG9hdCBwb3dTY2FsZSBceDNkIGV4cDJfcGFja2VkLnggKiBleHAyX3BhY2tlZC55O1xuXHRmbG9hdCBzY2FsZSBceDNkIHJjcF9leHAyX3BhY2tlZC54ICogcmNwX2V4cDJfcGFja2VkLnkgKiAwLjI1O1xuXHRmbG9hdCBtaXBPZmZzZXQgXHgzZCAwLjc1KigxLjAgLSByY3BfZXhwMl9wYWNrZWQueSkgKiByY3BfZXhwMl9wYWNrZWQueDtcblx0Ym9vbCBiUmVzIFx4M2QgbWlwTGV2ZWwgXHgzZFx4M2QgMC4wO1xuXHRzY2FsZSBceDNkICBiUmVzIFx4MjZceDI2IChzY2FsZSBceDNjIGEpID8gYSA6IHNjYWxlO1xuXHR2ZWMzIHI7XG5cdHZlYzIgb2Zmc2V0O1xuXHRpbnQgZmFjZSBceDNkIGdldEZhY2VGcm9tRGlyZWN0aW9uKGRpcmVjdGlvbik7XG5cdGZsb2F0IHJjcFBvd1NjYWxlIFx4M2QgMS4wIC8gcG93U2NhbGU7XG5cdGlmKCBmYWNlIFx4M2RceDNkIDApIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSk7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMigwLjArbWlwT2Zmc2V0LDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDEpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gYSA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgMikge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gYSA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgMykge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMC4wK21pcE9mZnNldCwwLjUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgNCkge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueiwgLWRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdHIgXHgzZCBub3JtYWxpemUocik7XG5cdGZsb2F0IHRleGVsT2Zmc2V0IFx4M2QgMC41ICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xuXHR2ZWMyIHMgXHgzZCAoIHIueXogLyBhYnMoIHIueCApICsgdmVjMiggMS4wICkgKSAqIDAuNTtcblx0dmVjMiBiYXNlIFx4M2Qgb2Zmc2V0ICsgdmVjMiggdGV4ZWxPZmZzZXQgKTtcblx0cmV0dXJuIGJhc2UgKyBzICogKCBzY2FsZSAtIDIuMCAqIHRleGVsT2Zmc2V0ICk7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMyAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAzLjApXG52ZWM0IHRleHR1cmVDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgcmVmbGVjdGVkRGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHJvdWdobmVzc1ZhbCBceDNkIHJvdWdobmVzcyogY3ViZVVWX21heExvZHMzO1xuXHRmbG9hdCByMSBceDNkIGZsb29yKHJvdWdobmVzc1ZhbCk7XG5cdGZsb2F0IHIyIFx4M2QgcjEgKyAxLjA7XG5cdGZsb2F0IHQgXHgzZCBmcmFjdChyb3VnaG5lc3NWYWwpO1xuXHR2ZWMyIG1pcEluZm8gXHgzZCBNaXBMZXZlbEluZm8ocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgcm91Z2huZXNzKTtcblx0ZmxvYXQgcyBceDNkIG1pcEluZm8ueTtcblx0ZmxvYXQgbGV2ZWwwIFx4M2QgbWlwSW5mby54O1xuXHRmbG9hdCBsZXZlbDEgXHgzZCBsZXZlbDAgKyAxLjA7XG5cdGxldmVsMSBceDNkIGxldmVsMSBceDNlIDUuMCA/IDUuMCA6IGxldmVsMTtcblx0bGV2ZWwwICtceDNkIG1pbiggZmxvb3IoIHMgKyAwLjUgKSwgNS4wICk7XG5cdHZlYzIgdXZfMTAgXHgzZCBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgbGV2ZWwwKTtcblx0dmVjNCBjb2xvcjEwIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dl8xMCkpO1xuXHR2ZWMyIHV2XzIwIFx4M2QgZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjIsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IyMCBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMjApKTtcblx0dmVjNCByZXN1bHQgXHgzZCBtaXgoY29sb3IxMCwgY29sb3IyMCwgdCk7XG5cdHJldHVybiB2ZWM0KHJlc3VsdC5yZ2IsIDEuMCk7XG59XG4jZW5kaWYiLApkZWZhdWx0bm9ybWFsX3ZlcnRleDoidmVjMyB0cmFuc2Zvcm1lZE5vcm1hbCBceDNkIG5vcm1hbE1hdHJpeCAqIG9iamVjdE5vcm1hbDtcbiNpZmRlZiBGTElQX1NJREVEXG5cdHRyYW5zZm9ybWVkTm9ybWFsIFx4M2QgLSB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNlbmRpZlxuI2lmZGVmIFVTRV9UQU5HRU5UXG5cdHZlYzMgdHJhbnNmb3JtZWRUYW5nZW50IFx4M2Qgbm9ybWFsTWF0cml4ICogb2JqZWN0VGFuZ2VudDtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHR0cmFuc2Zvcm1lZFRhbmdlbnQgXHgzZCAtIHRyYW5zZm9ybWVkVGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHRyYW5zZm9ybWVkICtceDNkIG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB1diApLnggKiBkaXNwbGFjZW1lbnRTY2FsZSArIGRpc3BsYWNlbWVudEJpYXMgKTtcbiNlbmRpZiIsCmVtaXNzaXZlbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHZlYzQgZW1pc3NpdmVDb2xvciBceDNkIHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xuXHRlbWlzc2l2ZUNvbG9yLnJnYiBceDNkIGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcblx0dG90YWxFbWlzc2l2ZVJhZGlhbmNlICpceDNkIGVtaXNzaXZlQ29sb3IucmdiO1xuI2VuZGlmIixlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGVtaXNzaXZlTWFwO1xuI2VuZGlmIixlbmNvZGluZ3NfZnJhZ21lbnQ6ImdsX0ZyYWdDb2xvciBceDNkIGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApOyIsZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IlxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZhbHVlO1xufVxudmVjNCBHYW1tYVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcblx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9HYW1tYSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMS4wIC8gZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBMaW5lYXJUb3NSR0IoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgUkdCRVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogZXhwMiggdmFsdWUuYSAqIDI1NS4wIC0gMTI4LjAgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgbWF4Q29tcG9uZW50IFx4M2QgbWF4KCBtYXgoIHZhbHVlLnIsIHZhbHVlLmcgKSwgdmFsdWUuYiApO1xuXHRmbG9hdCBmRXhwIFx4M2QgY2xhbXAoIGNlaWwoIGxvZzIoIG1heENvbXBvbmVudCApICksIC0xMjguMCwgMTI3LjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XG59XG52ZWM0IFJHQk1Ub0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiB2YWx1ZS5hICogbWF4UmFuZ2UsIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgXHgzZCBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IE0gXHgzZCBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XG5cdE0gXHgzZCBjZWlsKCBNICogMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xufVxudmVjNCBSR0JEVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCAoIG1heFJhbmdlIC8gMjU1LjAgKSAvIHZhbHVlLmEgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdGZsb2F0IG1heFJHQiBceDNkIG1heCggdmFsdWUuciwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcblx0ZmxvYXQgRCBceDNkIG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xuXHREIFx4M2QgbWluKCBmbG9vciggRCApIC8gMjU1LjAsIDEuMCApO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICogKCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xufVxuY29uc3QgbWF0MyBjTG9nTHV2TSBceDNkIG1hdDMoIDAuMjIwOSwgMC4zMzkwLCAwLjQxODQsIDAuMTEzOCwgMC42NzgwLCAwLjczMTksIDAuMDEwMiwgMC4xMTMwLCAwLjI5NjkgKTtcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUgKSAge1xuXHR2ZWMzIFhwX1lfWFlacCBceDNkIGNMb2dMdXZNICogdmFsdWUucmdiO1xuXHRYcF9ZX1hZWnAgXHgzZCBtYXgoIFhwX1lfWFlacCwgdmVjMyggMWUtNiwgMWUtNiwgMWUtNiApICk7XG5cdHZlYzQgdlJlc3VsdDtcblx0dlJlc3VsdC54eSBceDNkIFhwX1lfWFlacC54eSAvIFhwX1lfWFlacC56O1xuXHRmbG9hdCBMZSBceDNkIDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XG5cdHZSZXN1bHQudyBceDNkIGZyYWN0KCBMZSApO1xuXHR2UmVzdWx0LnogXHgzZCAoIExlIC0gKCBmbG9vciggdlJlc3VsdC53ICogMjU1LjAgKSApIC8gMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdlJlc3VsdDtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNIFx4M2QgbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XG52ZWM0IExvZ0x1dlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRmbG9hdCBMZSBceDNkIHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XG5cdHZlYzMgWHBfWV9YWVpwO1xuXHRYcF9ZX1hZWnAueSBceDNkIGV4cDIoICggTGUgLSAxMjcuMCApIC8gMi4wICk7XG5cdFhwX1lfWFlacC56IFx4M2QgWHBfWV9YWVpwLnkgLyB2YWx1ZS55O1xuXHRYcF9ZX1hZWnAueCBceDNkIHZhbHVlLnggKiBYcF9ZX1hZWnAuejtcblx0dmVjMyB2UkdCIFx4M2QgY0xvZ0x1dkludmVyc2VNICogWHBfWV9YWVpwLnJnYjtcblx0cmV0dXJuIHZlYzQoIG1heCggdlJHQiwgMC4wICksIDEuMCApO1xufSIsCmVudm1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggXHgzZCBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcblx0XHR2ZWMzIHdvcmxkTm9ybWFsIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZlYzMgcmVmbGVjdFZlYyBceDNkIHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHQjZWxzZVxuXHRcdHZlYzMgcmVmbGVjdFZlYyBceDNkIHZSZWZsZWN0O1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdHZlYzIgc2FtcGxlVVY7XG5cdFx0cmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xuXHRcdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdFx0c2FtcGxlVVYueCBceDNkIGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXG5cdFx0cmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xuXHRcdHZlYzMgcmVmbGVjdFZpZXcgXHgzZCBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLCAwLjAsIDEuMCApICk7XG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSApO1xuXHQjZWxzZVxuXHRcdHZlYzQgZW52Q29sb3IgXHgzZCB2ZWM0KCAwLjAgKTtcblx0I2VuZGlmXG5cdGVudkNvbG9yIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcblx0I2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWVxuXHRcdG91dGdvaW5nTGlnaHQgXHgzZCBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApXG5cdFx0b3V0Z29pbmdMaWdodCBceDNkIG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxuXHRcdG91dGdvaW5nTGlnaHQgK1x4M2QgZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcblx0I2VuZGlmXG4jZW5kaWYiLAplbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgZW52TWFwSW50ZW5zaXR5O1xuXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XG5cdHVuaWZvcm0gaW50IG1heE1pcExldmVsO1xuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcblx0I2VuZGlmXG5cdFxuI2VuZGlmIixlbnZtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXG5cdFx0I2RlZmluZSBFTlZfV09STERQT1Ncblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xuXHQjZW5kaWZcbiNlbmRpZiIsCmVudm1hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8ZGVmaW5lZCggUEhPTkcgKVxuXHRcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0XG5cdFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2VuZGlmXG4jZW5kaWYiLGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApXG5cdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZSQUNUSU9OXG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHR2ZWMzIHdvcmxkTm9ybWFsIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHRcdHZlYzMgcXVlcnlWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHF1ZXJ5VmVjLCAxLjAgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHZlYzQoIDAuMCApO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHRmbG9hdCBtYXhNSVBMZXZlbFNjYWxhciBceDNkIGZsb2F0KCBtYXhNSVBMZXZlbCApO1xuXHRcdGZsb2F0IHNpZ21hIFx4M2QgUEkgKiByb3VnaG5lc3MgKiByb3VnaG5lc3MgLyAoIDEuMCArIHJvdWdobmVzcyApO1xuXHRcdGZsb2F0IGRlc2lyZWRNSVBMZXZlbCBceDNkIG1heE1JUExldmVsU2NhbGFyICsgbG9nMiggc2lnbWEgKTtcblx0XHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xuXHR9XG5cdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0ICB2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZsZWN0KCAtdmlld0Rpciwgbm9ybWFsICk7XG5cdFx0ICByZWZsZWN0VmVjIFx4M2Qgbm9ybWFsaXplKCBtaXgoIHJlZmxlY3RWZWMsIG5vcm1hbCwgcm91Z2huZXNzICogcm91Z2huZXNzKSApO1xuXHRcdCNlbHNlXG5cdFx0ICB2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZyYWN0KCAtdmlld0Rpciwgbm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0XHRyZWZsZWN0VmVjIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xuXHRcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgXHgzZCBnZXRTcGVjdWxhck1JUExldmVsKCByb3VnaG5lc3MsIG1heE1JUExldmVsICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVVViggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHJvdWdobmVzcyApO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdFx0dmVjMiBzYW1wbGVVVjtcblx0XHRcdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdFx0XHRzYW1wbGVVVi54IFx4M2QgYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXG5cdFx0XHR2ZWMzIHJlZmxlY3RWaWV3IFx4M2Qgbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwwLjAsMS4wICkgKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRExvZEVYVCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG4jZW5kaWYiLAplbnZtYXBfdmVydGV4OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0dldvcmxkUG9zaXRpb24gXHgzZCB3b3JsZFBvc2l0aW9uLnh5ejtcblx0I2Vsc2Vcblx0XHR2ZWMzIGNhbWVyYVRvVmVydGV4IFx4M2Qgbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZSZWZsZWN0IFx4M2QgcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZSZWZsZWN0IFx4M2QgcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWYiLGZvZ192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdGZvZ0RlcHRoIFx4M2QgLW12UG9zaXRpb24uejtcbiNlbmRpZiIsCmZvZ19wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9GT0dcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcbiNlbmRpZiIsZm9nX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0ZPR1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHRmbG9hdCBmb2dGYWN0b3IgXHgzZCAxLjAgLSBleHAoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBmb2dEZXB0aCAqIGZvZ0RlcHRoICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgZm9nRmFjdG9yIFx4M2Qgc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApO1xuI2VuZGlmIixmb2dfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9GT0dcblx0dW5pZm9ybSB2ZWMzIGZvZ0NvbG9yO1xuXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dOZWFyO1xuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRmFyO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBUT09OXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50TWFwO1xuXHR2ZWMzIGdldEdyYWRpZW50SXJyYWRpYW5jZSggdmVjMyBub3JtYWwsIHZlYzMgbGlnaHREaXJlY3Rpb24gKSB7XG5cdFx0ZmxvYXQgZG90TkwgXHgzZCBkb3QoIG5vcm1hbCwgbGlnaHREaXJlY3Rpb24gKTtcblx0XHR2ZWMyIGNvb3JkIFx4M2QgdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApO1xuXHRcdCNpZmRlZiBVU0VfR1JBRElFTlRNQVBcblx0XHRcdHJldHVybiB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnJnYjtcblx0XHQjZWxzZVxuXHRcdFx0cmV0dXJuICggY29vcmQueCBceDNjIDAuNyApID8gdmVjMyggMC43ICkgOiB2ZWMzKCAxLjAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIixsaWdodG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgUEkgKiB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG4jZW5kaWYiLApsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIixsaWdodHNfbGFtYmVydF92ZXJ0ZXg6InZlYzMgZGlmZnVzZSBceDNkIHZlYzMoIDEuMCApO1xuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uIFx4M2QgbXZQb3NpdGlvbi54eXo7XG5nZW9tZXRyeS5ub3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5nZW9tZXRyeS52aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcbkdlb21ldHJpY0NvbnRleHQgYmFja0dlb21ldHJ5O1xuYmFja0dlb21ldHJ5LnBvc2l0aW9uIFx4M2QgZ2VvbWV0cnkucG9zaXRpb247XG5iYWNrR2VvbWV0cnkubm9ybWFsIFx4M2QgLWdlb21ldHJ5Lm5vcm1hbDtcbmJhY2tHZW9tZXRyeS52aWV3RGlyIFx4M2QgZ2VvbWV0cnkudmlld0RpcjtcbnZMaWdodEZyb250IFx4M2QgdmVjMyggMC4wICk7XG52SW5kaXJlY3RGcm9udCBceDNkIHZlYzMoIDAuMCApO1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2TGlnaHRCYWNrIFx4M2QgdmVjMyggMC4wICk7XG5cdHZJbmRpcmVjdEJhY2sgXHgzZCB2ZWMzKCAwLjAgKTtcbiNlbmRpZlxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbmZsb2F0IGRvdE5MO1xudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG4jaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgXHgzZCBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICtceDNkIHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgK1x4M2Qgc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fU1BPVF9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgXHgzZCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlIFx4M2QgUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArXHgzZCBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICtceDNkIHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX0RJUl9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XG5cdFx0Z2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSBceDNkIFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgK1x4M2Qgc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArXHgzZCBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9IRU1JX0xJR0hUUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0dkluZGlyZWN0RnJvbnQgK1x4M2QgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZJbmRpcmVjdEJhY2sgK1x4M2QgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBiYWNrR2VvbWV0cnkgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIiwKbGlnaHRzX3BhcnNfYmVnaW46InVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjtcbnVuaWZvcm0gdmVjMyBsaWdodFByb2JlWyA5IF07XG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xuXHRmbG9hdCB4IFx4M2Qgbm9ybWFsLngsIHkgXHgzZCBub3JtYWwueSwgeiBceDNkIG5vcm1hbC56O1xuXHR2ZWMzIHJlc3VsdCBceDNkIHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA0IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA3IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7XG5cdHJldHVybiByZXN1bHQ7XG59XG52ZWMzIGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGxpZ2h0UHJvYmVbIDkgXSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBzaEdldElycmFkaWFuY2VBdCggd29ybGROb3JtYWwsIGxpZ2h0UHJvYmUgKTtcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG52ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGFtYmllbnRMaWdodENvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICpceDNkIFBJO1xuXHQjZW5kaWZcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG4jaWYgTlVNX0RJUl9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHR9O1xuXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XG5cdHZvaWQgZ2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgXHgzZCBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCB0cnVlO1xuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUE9JTlRfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XG5cdFx0ZmxvYXQgc2hhZG93Q2FtZXJhRmFyO1xuXHR9O1xuXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHR2ZWMzIGxWZWN0b3IgXHgzZCBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uIFx4M2Qgbm9ybWFsaXplKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSBceDNkIGxlbmd0aCggbFZlY3RvciApO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgcG9pbnRMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XG5cdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkICggZGlyZWN0TGlnaHQuY29sb3IgIVx4M2QgdmVjMyggMC4wICkgKTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdFx0ZmxvYXQgY29uZUNvcztcblx0XHRmbG9hdCBwZW51bWJyYUNvcztcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XG5cdHZvaWQgZ2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgICkge1xuXHRcdHZlYzMgbFZlY3RvciBceDNkIHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgXHgzZCBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBhbmdsZUNvcyBceDNkIGRvdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0aWYgKCBhbmdsZUNvcyBceDNlIHNwb3RMaWdodC5jb25lQ29zICkge1xuXHRcdFx0ZmxvYXQgc3BvdEVmZmVjdCBceDNkIHNtb290aHN0ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHNwb3RMaWdodC5jb2xvcjtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIHNwb3RFZmZlY3QgKiBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgdmVjMyggMC4wICk7XG5cdFx0XHRkaXJlY3RMaWdodC52aXNpYmxlIFx4M2QgZmFsc2U7XG5cdFx0fVxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQ7XG5cdH07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xO1x0dW5pZm9ybSBzYW1wbGVyMkQgbHRjXzI7XG5cdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcbiNlbmRpZlxuI2lmIE5VTV9IRU1JX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IEhlbWlzcGhlcmVMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBza3lDb2xvcjtcblx0XHR2ZWMzIGdyb3VuZENvbG9yO1xuXHR9O1xuXHR1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTtcblx0dmVjMyBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVtaUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5ICkge1xuXHRcdGZsb2F0IGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhlbWlMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRmbG9hdCBoZW1pRGlmZnVzZVdlaWdodCBceDNkIDAuNSAqIGRvdE5MICsgMC41O1xuXHRcdHZlYzMgaXJyYWRpYW5jZSBceDNkIG1peCggaGVtaUxpZ2h0Lmdyb3VuZENvbG9yLCBoZW1pTGlnaHQuc2t5Q29sb3IsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRpcnJhZGlhbmNlICpceDNkIFBJO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBpcnJhZGlhbmNlO1xuXHR9XG4jZW5kaWYiLApsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciBceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5tYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2Qgc3BlY3VsYXI7XG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyBceDNkIHNoaW5pbmVzcztcbm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggXHgzZCBzcGVjdWxhclN0cmVuZ3RoOyIsbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6InZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VDb2xvcjtcblx0dmVjM1x0c3BlY3VsYXJDb2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyU2hpbmluZXNzO1xuXHRmbG9hdFx0c3BlY3VsYXJTdHJlbmd0aDtcbn07XG52b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHQjaWZkZWYgVE9PTlxuXHRcdHZlYzMgaXJyYWRpYW5jZSBceDNkIGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGRvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRcdHZlYzMgaXJyYWRpYW5jZSBceDNkIGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNlbmRpZlxuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICpceDNkIFBJO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfQmxpbm5QaG9uZ1xuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdcbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVx0KDApIiwKbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xubWF0ZXJpYWwuZGlmZnVzZUNvbG9yIFx4M2QgZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7XG5tYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyBceDNkIGNsYW1wKCByb3VnaG5lc3NGYWN0b3IsIDAuMDQsIDEuMCApO1xuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2QgbWl4KCB2ZWMzKCBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UICogcG93MiggcmVmbGVjdGl2aXR5ICkgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XG4jZWxzZVxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2QgbWl4KCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2VuZGlmXG4jaWZkZWYgQ0xFQVJDT0FUXG5cdG1hdGVyaWFsLmNsZWFyY29hdCBceDNkIHNhdHVyYXRlKCBjbGVhcmNvYXQgKTtcdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyBceDNkIGNsYW1wKCBjbGVhcmNvYXRSb3VnaG5lc3MsIDAuMDQsIDEuMCApO1xuI2VuZGlmXG4jaWZkZWYgVVNFX1NIRUVOXG5cdG1hdGVyaWFsLnNoZWVuQ29sb3IgXHgzZCBzaGVlbjtcbiNlbmRpZiIsCmxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiJzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VDb2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyUm91Z2huZXNzO1xuXHR2ZWMzXHRzcGVjdWxhckNvbG9yO1xuI2lmZGVmIENMRUFSQ09BVFxuXHRmbG9hdCBjbGVhcmNvYXQ7XG5cdGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR2ZWMzIHNoZWVuQ29sb3I7XG4jZW5kaWZcbn07XG4jZGVmaW5lIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgMC4xNlxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcbmZsb2F0IGNsZWFyY29hdERIUkFwcHJveCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROTCApIHtcblx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcbn1cbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyBceDNlIDBcblx0dm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdFx0dmVjMyBub3JtYWwgXHgzZCBnZW9tZXRyeS5ub3JtYWw7XG5cdFx0dmVjMyB2aWV3RGlyIFx4M2QgZ2VvbWV0cnkudmlld0Rpcjtcblx0XHR2ZWMzIHBvc2l0aW9uIFx4M2QgZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0dmVjMyBsaWdodFBvcyBceDNkIHJlY3RBcmVhTGlnaHQucG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGggXHgzZCByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQgXHgzZCByZWN0QXJlYUxpZ2h0LmhhbGZIZWlnaHQ7XG5cdFx0dmVjMyBsaWdodENvbG9yIFx4M2QgcmVjdEFyZWFMaWdodC5jb2xvcjtcblx0XHRmbG9hdCByb3VnaG5lc3MgXHgzZCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcztcblx0XHR2ZWMzIHJlY3RDb29yZHNbIDQgXTtcblx0XHRyZWN0Q29vcmRzWyAwIF0gXHgzZCBsaWdodFBvcyArIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XHRcdHJlY3RDb29yZHNbIDEgXSBceDNkIGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcblx0XHRyZWN0Q29vcmRzWyAyIF0gXHgzZCBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMyBdIFx4M2QgbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHZlYzIgdXYgXHgzZCBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XG5cdFx0dmVjNCB0MSBceDNkIHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XG5cdFx0dmVjNCB0MiBceDNkIHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XG5cdFx0bWF0MyBtSW52IFx4M2QgbWF0Myhcblx0XHRcdHZlYzMoIHQxLngsIDAsIHQxLnkgKSxcblx0XHRcdHZlYzMoICAgIDAsIDEsICAgIDAgKSxcblx0XHRcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxuXHRcdCk7XG5cdFx0dmVjMyBmcmVzbmVsIFx4M2QgKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICtceDNkIGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XG5cdH1cbiNlbmRpZlxudm9pZCBSRV9EaXJlY3RfUGh5c2ljYWwoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2QgZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRmbG9hdCBjY0RvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRcdHZlYzMgY2NJcnJhZGlhbmNlIFx4M2QgY2NEb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0Y2NJcnJhZGlhbmNlICpceDNkIFBJO1xuXHRcdCNlbmRpZlxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIG1hdGVyaWFsLmNsZWFyY29hdCAqIGNsZWFyY29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBjY0RvdE5MICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgY2NJcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSIFx4M2QgMC4wO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9TSEVFTlxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9TaGVlbihcblx0XHRcdG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLFxuXHRcdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uLFxuXHRcdFx0Z2VvbWV0cnksXG5cdFx0XHRtYXRlcmlhbC5zaGVlbkNvbG9yXG5cdFx0KTtcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyk7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICtceDNkICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0KSB7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRmbG9hdCBjY0RvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICtceDNkIGNsZWFyY29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBjY0RvdE5MIFx4M2QgY2NEb3ROVjtcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIDAuMDtcblx0I2VuZGlmXG5cdGZsb2F0IGNsZWFyY29hdEludiBceDNkIDEuMCAtIGNsZWFyY29hdERIUjtcblx0dmVjMyBzaW5nbGVTY2F0dGVyaW5nIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgbXVsdGlTY2F0dGVyaW5nIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlIFx4M2QgaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7XG5cdEJSREZfU3BlY3VsYXJfTXVsdGlzY2F0dGVyaW5nX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIHNpbmdsZVNjYXR0ZXJpbmcsIG11bHRpU2NhdHRlcmluZyApO1xuXHR2ZWMzIGRpZmZ1c2UgXHgzZCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiAoIDEuMCAtICggc2luZ2xlU2NhdHRlcmluZyArIG11bHRpU2NhdHRlcmluZyApICk7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgK1x4M2QgY2xlYXJjb2F0SW52ICogcmFkaWFuY2UgKiBzaW5nbGVTY2F0dGVyaW5nO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgZGlmZnVzZSAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfUGh5c2ljYWxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXHRcdFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcdFx0UkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbFxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRyZXR1cm4gc2F0dXJhdGUoIHBvdyggZG90TlYgKyBhbWJpZW50T2NjbHVzaW9uLCBleHAyKCAtIDE2LjAgKiByb3VnaG5lc3MgLSAxLjAgKSApIC0gMS4wICsgYW1iaWVudE9jY2x1c2lvbiApO1xufSIsCmxpZ2h0c19mcmFnbWVudF9iZWdpbjoiXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xuZ2VvbWV0cnkucG9zaXRpb24gXHgzZCAtIHZWaWV3UG9zaXRpb247XG5nZW9tZXRyeS5ub3JtYWwgXHgzZCBub3JtYWw7XG5nZW9tZXRyeS52aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG4jaWZkZWYgQ0xFQVJDT0FUXG5cdGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCBceDNkIGNsZWFyY29hdE5vcm1hbDtcbiNlbmRpZlxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCBceDNkIHBvaW50TGlnaHRzWyBpIF07XG5cdFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgXHgyNlx4MjYgKCBVTlJPTExFRF9MT09QX0lOREVYIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIHBvaW50TGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX1NQT1RfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdFNwb3RMaWdodCBzcG90TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCBceDNkIHNwb3RMaWdodHNbIGkgXTtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgXHgyNlx4MjYgKCBVTlJPTExFRF9MT09QX0lOREVYIFx4M2MgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyApXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgYWxsKCBidmVjMiggc3BvdExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX0RJUl9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGRpcmVjdGlvbmFsTGlnaHQgXHgzZCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9ESVJfTElHSFRfU0hBRE9XUyApXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgYWxsKCBidmVjMiggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcblx0UmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xuXHRcdHJlY3RBcmVhTGlnaHQgXHgzZCByZWN0QXJlYUxpZ2h0c1sgaSBdO1xuXHRcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHR2ZWMzIGlibElycmFkaWFuY2UgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2QgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0aXJyYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnkgKTtcblx0I2lmICggTlVNX0hFTUlfTElHSFRTIFx4M2UgMCApXG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRcdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcblx0XHRcdGlycmFkaWFuY2UgK1x4M2QgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdH1cblx0I2VuZGlmXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0dmVjMyByYWRpYW5jZSBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIGNsZWFyY29hdFJhZGlhbmNlIFx4M2QgdmVjMyggMC4wICk7XG4jZW5kaWYiLApsaWdodHNfZnJhZ21lbnRfbWFwczoiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSBceDNkIHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRpcnJhZGlhbmNlICtceDNkIGxpZ2h0TWFwSXJyYWRpYW5jZTtcblx0I2VuZGlmXG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggU1RBTkRBUkQgKSBceDI2XHgyNiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRpYmxJcnJhZGlhbmNlICtceDNkIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGdlb21ldHJ5LCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSBceDI2XHgyNiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0cmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRjbGVhcmNvYXRSYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKbGlnaHRzX2ZyYWdtZW50X2VuZDoiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdFJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdFJFX0luZGlyZWN0U3BlY3VsYXIoIHJhZGlhbmNlLCBpYmxJcnJhZGlhbmNlLCBjbGVhcmNvYXRSYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApIFx4MjZceDI2IGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHRnbF9GcmFnRGVwdGhFWFQgXHgzZCBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41O1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkgXHgyNlx4MjYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGX0VYVCApXG5cdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuI2VuZGlmIiwKbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xuXHQjZW5kaWZcbiNlbmRpZiIsbG9nZGVwdGhidWZfdmVydGV4OiIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dkZyYWdEZXB0aCBceDNkIDEuMCArIGdsX1Bvc2l0aW9uLnc7XG5cdCNlbHNlXG5cdFx0Z2xfUG9zaXRpb24ueiBceDNkIGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xuXHRcdGdsX1Bvc2l0aW9uLnogKlx4M2QgZ2xfUG9zaXRpb24udztcblx0I2VuZGlmXG4jZW5kaWYiLG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dmVjNCB0ZXhlbENvbG9yIFx4M2QgdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xuXHR0ZXhlbENvbG9yIFx4M2QgbWFwVGV4ZWxUb0xpbmVhciggdGV4ZWxDb2xvciApO1xuXHRkaWZmdXNlQ29sb3IgKlx4M2QgdGV4ZWxDb2xvcjtcbiNlbmRpZiIsCm1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dmVjMiB1diBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCBnbF9Qb2ludENvb3JkLngsIDEuMCAtIGdsX1BvaW50Q29vcmQueSwgMSApICkueHk7XG5cdHZlYzQgbWFwVGV4ZWwgXHgzZCB0ZXh0dXJlMkQoIG1hcCwgdXYgKTtcblx0ZGlmZnVzZUNvbG9yICpceDNkIG1hcFRleGVsVG9MaW5lYXIoIG1hcFRleGVsICk7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcbiNlbmRpZiIsbWV0YWxuZXNzbWFwX2ZyYWdtZW50OiJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgXHgzZCBtZXRhbG5lc3M7XG4jaWZkZWYgVVNFX01FVEFMTkVTU01BUFxuXHR2ZWM0IHRleGVsTWV0YWxuZXNzIFx4M2QgdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZVdiApO1xuXHRtZXRhbG5lc3NGYWN0b3IgKlx4M2QgdGV4ZWxNZXRhbG5lc3MuYjtcbiNlbmRpZiIsCm1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01FVEFMTkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7XG4jZW5kaWYiLG1vcnBobm9ybWFsX3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwwIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwxIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwyIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwzIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcbiNlbmRpZiIsbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xuXHQjZWxzZVxuXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xuXHQjZW5kaWZcbiNlbmRpZiIsCm1vcnBodGFyZ2V0X3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDAgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQxIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0MiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDMgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDUgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA1IF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQ2IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNiBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDcgXTtcblx0I2VuZGlmXG4jZW5kaWYiLApub3JtYWxfZnJhZ21lbnRfYmVnaW46IiNpZmRlZiBGTEFUX1NIQURFRFxuXHR2ZWMzIGZkeCBceDNkIHZlYzMoIGRGZHgoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeCggdlZpZXdQb3NpdGlvbi56ICkgKTtcblx0dmVjMyBmZHkgXHgzZCB2ZWMzKCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeSggdlZpZXdQb3NpdGlvbi55ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApO1xuI2Vsc2Vcblx0dmVjMyBub3JtYWwgXHgzZCBub3JtYWxpemUoIHZOb3JtYWwgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCBceDNkIG5vcm1hbCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZlYzMgdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdlRhbmdlbnQgKTtcblx0XHR2ZWMzIGJpdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHRhbmdlbnQgXHgzZCB0YW5nZW50ICogKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xuXHRcdFx0Yml0YW5nZW50IFx4M2QgYml0YW5nZW50ICogKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcbiNlbmRpZlxudmVjMyBnZW9tZXRyeU5vcm1hbCBceDNkIG5vcm1hbDsiLApub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHRub3JtYWwgXHgzZCB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHQjaWZkZWYgRkxJUF9TSURFRFxuXHRcdG5vcm1hbCBceDNkIC0gbm9ybWFsO1xuXHQjZW5kaWZcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCBceDNkIG5vcm1hbCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0I2VuZGlmXG5cdG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggbm9ybWFsTWF0cml4ICogbm9ybWFsICk7XG4jZWxpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0bWF0MyB2VEJOIFx4M2QgbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBub3JtYWwgKTtcblx0XHR2ZWMzIG1hcE4gXHgzZCB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRcdG1hcE4ueHkgXHgzZCBub3JtYWxTY2FsZSAqIG1hcE4ueHk7XG5cdFx0bm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xuXHQjZWxzZVxuXHRcdG5vcm1hbCBceDNkIHBlcnR1cmJOb3JtYWwyQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBub3JtYWxTY2FsZSwgbm9ybWFsTWFwICk7XG5cdCNlbmRpZlxuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxuXHRub3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSApO1xuI2VuZGlmIiwKbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlO1xuI2VuZGlmXG4jaWZkZWYgT0JKRUNUU1BBQ0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7XG4jZW5kaWZcbiNpZiAhIGRlZmluZWQgKCBVU0VfVEFOR0VOVCApIFx4MjZceDI2ICggZGVmaW5lZCAoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkICggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSApXG5cdHZlYzMgcGVydHVyYk5vcm1hbDJBcmIoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgbm9ybWFsU2NhbGUsIGluIHNhbXBsZXIyRCBub3JtYWxNYXAgKSB7XG5cdFx0dmVjMyBxMCBceDNkIHZlYzMoIGRGZHgoIGV5ZV9wb3MueCApLCBkRmR4KCBleWVfcG9zLnkgKSwgZEZkeCggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHExIFx4M2QgdmVjMyggZEZkeSggZXllX3Bvcy54ICksIGRGZHkoIGV5ZV9wb3MueSApLCBkRmR5KCBleWVfcG9zLnogKSApO1xuXHRcdHZlYzIgc3QwIFx4M2QgZEZkeCggdlV2LnN0ICk7XG5cdFx0dmVjMiBzdDEgXHgzZCBkRmR5KCB2VXYuc3QgKTtcblx0XHRmbG9hdCBzY2FsZSBceDNkIHNpZ24oIHN0MS50ICogc3QwLnMgLSBzdDAudCAqIHN0MS5zICk7XG5cdFx0dmVjMyBTIFx4M2Qgbm9ybWFsaXplKCAoIHEwICogc3QxLnQgLSBxMSAqIHN0MC50ICkgKiBzY2FsZSApO1xuXHRcdHZlYzMgVCBceDNkIG5vcm1hbGl6ZSggKCAtIHEwICogc3QxLnMgKyBxMSAqIHN0MC5zICkgKiBzY2FsZSApO1xuXHRcdHZlYzMgTiBceDNkIG5vcm1hbGl6ZSggc3VyZl9ub3JtICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5ICpceDNkIG5vcm1hbFNjYWxlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZlYzMgTmZyb21TVCBceDNkIGNyb3NzKCBTLCBUICk7XG5cdFx0XHRpZiggZG90KCBOZnJvbVNULCBOICkgXHgzZSAwLjAgKSB7XG5cdFx0XHRcdFMgKlx4M2QgLTEuMDtcblx0XHRcdFx0VCAqXHgzZCAtMS4wO1xuXHRcdFx0fVxuXHRcdCNlbHNlXG5cdFx0XHRtYXBOLnh5ICpceDNkICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHQjZW5kaWZcblx0XHRtYXQzIHRzbiBceDNkIG1hdDMoIFMsIFQsIE4gKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCB0c24gKiBtYXBOICk7XG5cdH1cbiNlbmRpZiIsCmNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW46IiNpZmRlZiBDTEVBUkNPQVRcblx0dmVjMyBjbGVhcmNvYXROb3JtYWwgXHgzZCBnZW9tZXRyeU5vcm1hbDtcbiNlbmRpZiIsY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzOiIjaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0bWF0MyB2VEJOIFx4M2QgbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBjbGVhcmNvYXROb3JtYWwgKTtcblx0XHR2ZWMzIG1hcE4gXHgzZCB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRcdG1hcE4ueHkgXHgzZCBjbGVhcmNvYXROb3JtYWxTY2FsZSAqIG1hcE4ueHk7XG5cdFx0Y2xlYXJjb2F0Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xuXHQjZWxzZVxuXHRcdGNsZWFyY29hdE5vcm1hbCBceDNkIHBlcnR1cmJOb3JtYWwyQXJiKCAtIHZWaWV3UG9zaXRpb24sIGNsZWFyY29hdE5vcm1hbCwgY2xlYXJjb2F0Tm9ybWFsU2NhbGUsIGNsZWFyY29hdE5vcm1hbE1hcCApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmNsZWFyY29hdF9ub3JtYWxtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIGNsZWFyY29hdE5vcm1hbFNjYWxlO1xuI2VuZGlmIixwYWNraW5nOiJ2ZWMzIHBhY2tOb3JtYWxUb1JHQiggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XG5cdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xufVxudmVjMyB1bnBhY2tSR0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7XG5cdHJldHVybiAyLjAgKiByZ2IueHl6IC0gMS4wO1xufVxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgXHgzZCAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgXHgzZCAyNTUuIC8gMjU2LjtcbmNvbnN0IHZlYzMgUGFja0ZhY3RvcnMgXHgzZCB2ZWMzKCAyNTYuICogMjU2LiAqIDI1Ni4sIDI1Ni4gKiAyNTYuLCAgMjU2LiApO1xuY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzIFx4M2QgVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3RvcnMsIDEuICk7XG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCBceDNkIDEuIC8gMjU2LjtcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xuXHR2ZWM0IHIgXHgzZCB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcblx0ci55encgLVx4M2Qgci54eXogKiBTaGlmdFJpZ2h0ODtcdHJldHVybiByICogUGFja1Vwc2NhbGU7XG59XG5mbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkge1xuXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XG59XG52ZWM0IGVuY29kZUhhbGZSR0JBICggdmVjMiB2ICkge1xuXHR2ZWM0IGVuY29kZWQgXHgzZCB2ZWM0KCAwLjAgKTtcblx0Y29uc3QgdmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAxLjAgLyAyNTUuMCwgMC4wICk7XG5cdGVuY29kZWQueHkgXHgzZCB2ZWMyKCB2LngsIGZyYWN0KCB2LnggKiAyNTUuMCApICk7XG5cdGVuY29kZWQueHkgXHgzZCBlbmNvZGVkLnh5IC0gKCBlbmNvZGVkLnl5ICogb2Zmc2V0ICk7XG5cdGVuY29kZWQuencgXHgzZCB2ZWMyKCB2LnksIGZyYWN0KCB2LnkgKiAyNTUuMCApICk7XG5cdGVuY29kZWQuencgXHgzZCBlbmNvZGVkLnp3IC0gKCBlbmNvZGVkLnd3ICogb2Zmc2V0ICk7XG5cdHJldHVybiBlbmNvZGVkO1xufVxudmVjMiBkZWNvZGVIYWxmUkdCQSggdmVjNCB2ICkge1xuXHRyZXR1cm4gdmVjMiggdi54ICsgKCB2LnkgLyAyNTUuMCApLCB2LnogKyAoIHYudyAvIDI1NS4wICkgKTtcbn1cbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcbn1cbmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgbGluZWFyQ2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xufVxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCggZmFyIC0gbmVhciApICogdmlld1ogKTtcbn1cbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcbn0iLApwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiIjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxuXHRnbF9GcmFnQ29sb3IucmdiICpceDNkIGdsX0ZyYWdDb2xvci5hO1xuI2VuZGlmIixwcm9qZWN0X3ZlcnRleDoidmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuZ2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsiLGRpdGhlcmluZ19mcmFnbWVudDoiI2lmZGVmIERJVEhFUklOR1xuXHRnbF9GcmFnQ29sb3IucmdiIFx4M2QgZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiLGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiIjaWZkZWYgRElUSEVSSU5HXG5cdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRcdGZsb2F0IGdyaWRfcG9zaXRpb24gXHgzZCByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTtcblx0XHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgXHgzZCB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xuXHRcdGRpdGhlcl9zaGlmdF9SR0IgXHgzZCBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7XG5cdFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcblx0fVxuI2VuZGlmIiwKcm91Z2huZXNzbWFwX2ZyYWdtZW50OiJmbG9hdCByb3VnaG5lc3NGYWN0b3IgXHgzZCByb3VnaG5lc3M7XG4jaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR2ZWM0IHRleGVsUm91Z2huZXNzIFx4M2QgdGV4dHVyZTJEKCByb3VnaG5lc3NNYXAsIHZVdiApO1xuXHRyb3VnaG5lc3NGYWN0b3IgKlx4M2QgdGV4ZWxSb3VnaG5lc3MuZztcbiNlbmRpZiIscm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHJvdWdobmVzc01hcDtcbiNlbmRpZiIsc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHRmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdHJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApO1xuXHR9XG5cdHZlYzIgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2ICkge1xuXHRcdHJldHVybiBkZWNvZGVIYWxmUkdCQSggdGV4dHVyZTJEKCBzaGFkb3csIHV2ICkgKTtcblx0fVxuXHRmbG9hdCBWU01TaGFkb3cgKHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKXtcblx0XHRmbG9hdCBvY2NsdXNpb24gXHgzZCAxLjA7XG5cdFx0dmVjMiBkaXN0cmlidXRpb24gXHgzZCB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNoYWRvdywgdXYgKTtcblx0XHRmbG9hdCBoYXJkX3NoYWRvdyBceDNkIHN0ZXAoIGNvbXBhcmUgLCBkaXN0cmlidXRpb24ueCApO1xuXHRcdGlmIChoYXJkX3NoYWRvdyAhXHgzZCAxLjAgKSB7XG5cdFx0XHRmbG9hdCBkaXN0YW5jZSBceDNkIGNvbXBhcmUgLSBkaXN0cmlidXRpb24ueCA7XG5cdFx0XHRmbG9hdCB2YXJpYW5jZSBceDNkIG1heCggMC4wMDAwMCwgZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSApO1xuXHRcdFx0ZmxvYXQgc29mdG5lc3NfcHJvYmFiaWxpdHkgXHgzZCB2YXJpYW5jZSAvICh2YXJpYW5jZSArIGRpc3RhbmNlICogZGlzdGFuY2UgKTtcdFx0XHRzb2Z0bmVzc19wcm9iYWJpbGl0eSBceDNkIGNsYW1wKCAoIHNvZnRuZXNzX3Byb2JhYmlsaXR5IC0gMC4zICkgLyAoIDAuOTUgLSAwLjMgKSwgMC4wLCAxLjAgKTtcdFx0XHRvY2NsdXNpb24gXHgzZCBjbGFtcCggbWF4KCBoYXJkX3NoYWRvdywgc29mdG5lc3NfcHJvYmFiaWxpdHkgKSwgMC4wLCAxLjAgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9jY2x1c2lvbjtcblx0fVxuXHRmbG9hdCB0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHNpemUsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XG5cdFx0Y29uc3QgdmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAwLjAsIDEuMCApO1xuXHRcdHZlYzIgdGV4ZWxTaXplIFx4M2QgdmVjMiggMS4wICkgLyBzaXplO1xuXHRcdHZlYzIgY2VudHJvaWRVViBceDNkICggZmxvb3IoIHV2ICogc2l6ZSAtIDAuNSApICsgMC41ICkgKiB0ZXhlbFNpemU7XG5cdFx0ZmxvYXQgbGIgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHgsIGNvbXBhcmUgKTtcblx0XHRmbG9hdCBsdCBceDNkIHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC54eSwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJiIFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl4LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgcnQgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueXksIGNvbXBhcmUgKTtcblx0XHR2ZWMyIGYgXHgzZCBmcmFjdCggdXYgKiBzaXplICsgMC41ICk7XG5cdFx0ZmxvYXQgYSBceDNkIG1peCggbGIsIGx0LCBmLnkgKTtcblx0XHRmbG9hdCBiIFx4M2QgbWl4KCByYiwgcnQsIGYueSApO1xuXHRcdGZsb2F0IGMgXHgzZCBtaXgoIGEsIGIsIGYueCApO1xuXHRcdHJldHVybiBjO1xuXHR9XG5cdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XG5cdFx0ZmxvYXQgc2hhZG93IFx4M2QgMS4wO1xuXHRcdHNoYWRvd0Nvb3JkLnh5eiAvXHgzZCBzaGFkb3dDb29yZC53O1xuXHRcdHNoYWRvd0Nvb3JkLnogK1x4M2Qgc2hhZG93Qmlhcztcblx0XHRidmVjNCBpbkZydXN0dW1WZWMgXHgzZCBidmVjNCAoIHNoYWRvd0Nvb3JkLnggXHgzZVx4M2QgMC4wLCBzaGFkb3dDb29yZC54IFx4M2NceDNkIDEuMCwgc2hhZG93Q29vcmQueSBceDNlXHgzZCAwLjAsIHNoYWRvd0Nvb3JkLnkgXHgzY1x4M2QgMS4wICk7XG5cdFx0Ym9vbCBpbkZydXN0dW0gXHgzZCBhbGwoIGluRnJ1c3R1bVZlYyApO1xuXHRcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjIFx4M2QgYnZlYzIoIGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiBceDNjXHgzZCAxLjAgKTtcblx0XHRib29sIGZydXN0dW1UZXN0IFx4M2QgYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xuXHRcdGlmICggZnJ1c3R1bVRlc3QgKSB7XG5cdFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCBceDNkIC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgXHgzZCAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxIFx4M2QgKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MSBceDNkICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeDIgXHgzZCBkeDAgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeTIgXHgzZCBkeTAgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeDMgXHgzZCBkeDEgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeTMgXHgzZCBkeTEgLyAyLjA7XG5cdFx0XHRzaGFkb3cgXHgzZCAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcblx0XHRcdCkgKiAoIDEuMCAvIDE3LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCBceDNkIC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgXHgzZCAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxIFx4M2QgKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MSBceDNkICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRzaGFkb3cgXHgzZCAoXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0c2hhZG93IFx4M2QgVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHNoYWRvdyBceDNkIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTtcblx0XHQjZW5kaWZcblx0XHR9XG5cdFx0cmV0dXJuIHNoYWRvdztcblx0fVxuXHR2ZWMyIGN1YmVUb1VWKCB2ZWMzIHYsIGZsb2F0IHRleGVsU2l6ZVkgKSB7XG5cdFx0dmVjMyBhYnNWIFx4M2QgYWJzKCB2ICk7XG5cdFx0ZmxvYXQgc2NhbGVUb0N1YmUgXHgzZCAxLjAgLyBtYXgoIGFic1YueCwgbWF4KCBhYnNWLnksIGFic1YueiApICk7XG5cdFx0YWJzViAqXHgzZCBzY2FsZVRvQ3ViZTtcblx0XHR2ICpceDNkIHNjYWxlVG9DdWJlICogKCAxLjAgLSAyLjAgKiB0ZXhlbFNpemVZICk7XG5cdFx0dmVjMiBwbGFuYXIgXHgzZCB2Lnh5O1xuXHRcdGZsb2F0IGFsbW9zdEFUZXhlbCBceDNkIDEuNSAqIHRleGVsU2l6ZVk7XG5cdFx0ZmxvYXQgYWxtb3N0T25lIFx4M2QgMS4wIC0gYWxtb3N0QVRleGVsO1xuXHRcdGlmICggYWJzVi56IFx4M2VceDNkIGFsbW9zdE9uZSApIHtcblx0XHRcdGlmICggdi56IFx4M2UgMC4wIClcblx0XHRcdFx0cGxhbmFyLnggXHgzZCA0LjAgLSB2Lng7XG5cdFx0fSBlbHNlIGlmICggYWJzVi54IFx4M2VceDNkIGFsbW9zdE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25YIFx4M2Qgc2lnbiggdi54ICk7XG5cdFx0XHRwbGFuYXIueCBceDNkIHYueiAqIHNpZ25YICsgMi4wICogc2lnblg7XG5cdFx0fSBlbHNlIGlmICggYWJzVi55IFx4M2VceDNkIGFsbW9zdE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25ZIFx4M2Qgc2lnbiggdi55ICk7XG5cdFx0XHRwbGFuYXIueCBceDNkIHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xuXHRcdFx0cGxhbmFyLnkgXHgzZCB2LnogKiBzaWduWSAtIDIuMDtcblx0XHR9XG5cdFx0cmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIgKyB2ZWMyKCAwLjM3NSwgMC43NSApO1xuXHR9XG5cdGZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCwgZmxvYXQgc2hhZG93Q2FtZXJhTmVhciwgZmxvYXQgc2hhZG93Q2FtZXJhRmFyICkge1xuXHRcdHZlYzIgdGV4ZWxTaXplIFx4M2QgdmVjMiggMS4wICkgLyAoIHNoYWRvd01hcFNpemUgKiB2ZWMyKCA0LjAsIDIuMCApICk7XG5cdFx0dmVjMyBsaWdodFRvUG9zaXRpb24gXHgzZCBzaGFkb3dDb29yZC54eXo7XG5cdFx0ZmxvYXQgZHAgXHgzZCAoIGxlbmd0aCggbGlnaHRUb1Bvc2l0aW9uICkgLSBzaGFkb3dDYW1lcmFOZWFyICkgLyAoIHNoYWRvd0NhbWVyYUZhciAtIHNoYWRvd0NhbWVyYU5lYXIgKTtcdFx0ZHAgK1x4M2Qgc2hhZG93Qmlhcztcblx0XHR2ZWMzIGJkM0QgXHgzZCBub3JtYWxpemUoIGxpZ2h0VG9Qb3NpdGlvbiApO1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApXG5cdFx0XHR2ZWMyIG9mZnNldCBceDNkIHZlYzIoIC0gMSwgMSApICogc2hhZG93UmFkaXVzICogdGV4ZWxTaXplLnk7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWYiLApzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBwb2ludFNoYWRvd01hdHJpeFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2hhZG93bWFwX3ZlcnRleDoiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0dkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSBceDNkIGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHZTcG90U2hhZG93Q29vcmRbIGkgXSBceDNkIHNwb3RTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdIFx4M2QgcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG4jZW5kaWYiLApzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6ImZsb2F0IGdldFNoYWRvd01hc2soKSB7XG5cdGZsb2F0IHNoYWRvdyBceDNkIDEuMDtcblx0I2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0IFx4M2QgZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKlx4M2QgYm9vbCggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0IFx4M2Qgc3BvdExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRvdyAqXHgzZCBib29sKCBzcG90TGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0fVxuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCBceDNkIHBvaW50TGlnaHRzWyBpIF07XG5cdFx0c2hhZG93ICpceDNkIGJvb2woIHBvaW50TGlnaHQuc2hhZG93ICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNlbmRpZlxuXHRyZXR1cm4gc2hhZG93O1xufSIsCnNraW5iYXNlX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHRtYXQ0IGJvbmVNYXRYIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcblx0bWF0NCBib25lTWF0WSBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC55ICk7XG5cdG1hdDQgYm9uZU1hdFogXHgzZCBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xuXHRtYXQ0IGJvbmVNYXRXIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcbiNlbmRpZiIsc2tpbm5pbmdfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTtcblx0I2lmZGVmIEJPTkVfVEVYVFVSRVxuXHRcdHVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xuXHRcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtcblx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRmbG9hdCBqIFx4M2QgaSAqIDQuMDtcblx0XHRcdGZsb2F0IHggXHgzZCBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgeSBceDNkIGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0XHRmbG9hdCBkeCBceDNkIDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcblx0XHRcdGZsb2F0IGR5IFx4M2QgMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRcdFx0eSBceDNkIGR5ICogKCB5ICsgMC41ICk7XG5cdFx0XHR2ZWM0IHYxIFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAwLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYyIFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYzIFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHY0IFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAzLjUgKSwgeSApICk7XG5cdFx0XHRtYXQ0IGJvbmUgXHgzZCBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZWxzZVxuXHRcdHVuaWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xuXHRcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcblx0XHRcdG1hdDQgYm9uZSBceDNkIGJvbmVNYXRyaWNlc1sgaW50KGkpIF07XG5cdFx0XHRyZXR1cm4gYm9uZTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2tpbm5pbmdfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdHZlYzQgc2tpblZlcnRleCBceDNkIGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG5cdHZlYzQgc2tpbm5lZCBceDNkIHZlYzQoIDAuMCApO1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7XG5cdHNraW5uZWQgK1x4M2QgYm9uZU1hdFogKiBza2luVmVydGV4ICogc2tpbldlaWdodC56O1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudztcblx0dHJhbnNmb3JtZWQgXHgzZCAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejtcbiNlbmRpZiIsc2tpbm5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0bWF0NCBza2luTWF0cml4IFx4M2QgbWF0NCggMC4wICk7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC54ICogYm9uZU1hdFg7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC55ICogYm9uZU1hdFk7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC56ICogYm9uZU1hdFo7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC53ICogYm9uZU1hdFc7XG5cdHNraW5NYXRyaXggIFx4M2QgYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcblx0b2JqZWN0Tm9ybWFsIFx4M2QgdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG9iamVjdFRhbmdlbnQgXHgzZCB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7XG5cdCNlbmRpZlxuI2VuZGlmIiwKc3BlY3VsYXJtYXBfZnJhZ21lbnQ6ImZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXG5cdHZlYzQgdGV4ZWxTcGVjdWxhciBceDNkIHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZVdiApO1xuXHRzcGVjdWxhclN0cmVuZ3RoIFx4M2QgdGV4ZWxTcGVjdWxhci5yO1xuI2Vsc2Vcblx0c3BlY3VsYXJTdHJlbmd0aCBceDNkIDEuMDtcbiNlbmRpZiIsc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcbiNlbmRpZiIsdG9uZW1hcHBpbmdfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKVxuXHRnbF9GcmFnQ29sb3IucmdiIFx4M2QgdG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZiIsdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDoiI2lmbmRlZiBzYXR1cmF0ZVxuXHQjZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZW5kaWZcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTtcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdXaGl0ZVBvaW50O1xudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0cmV0dXJuIHRvbmVNYXBwaW5nRXhwb3N1cmUgKiBjb2xvcjtcbn1cbnZlYzMgUmVpbmhhcmRUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCBjb2xvciAvICggdmVjMyggMS4wICkgKyBjb2xvciApICk7XG59XG4jZGVmaW5lIFVuY2hhcnRlZDJIZWxwZXIoIHggKSBtYXgoICggKCB4ICogKCAwLjE1ICogeCArIDAuMTAgKiAwLjUwICkgKyAwLjIwICogMC4wMiApIC8gKCB4ICogKCAwLjE1ICogeCArIDAuNTAgKSArIDAuMjAgKiAwLjMwICkgKSAtIDAuMDIgLyAwLjMwLCB2ZWMzKCAwLjAgKSApXG52ZWMzIFVuY2hhcnRlZDJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCBVbmNoYXJ0ZWQySGVscGVyKCBjb2xvciApIC8gVW5jaGFydGVkMkhlbHBlciggdmVjMyggdG9uZU1hcHBpbmdXaGl0ZVBvaW50ICkgKSApO1xufVxudmVjMyBPcHRpbWl6ZWRDaW5lb25Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0Y29sb3IgXHgzZCBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XG5cdHJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7XG59XG52ZWMzIEFDRVNGaWxtaWNUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCAoIGNvbG9yICogKCAyLjUxICogY29sb3IgKyAwLjAzICkgKSAvICggY29sb3IgKiAoIDIuNDMgKiBjb2xvciArIDAuNTkgKSArIDAuMTQgKSApO1xufSIsCnV2X3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfVVZcblx0dmFyeWluZyB2ZWMyIHZVdjtcbiNlbmRpZiIsdXZfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfVVZcblx0dmFyeWluZyB2ZWMyIHZVdjtcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuI2VuZGlmIix1dl92ZXJ0ZXg6IiNpZmRlZiBVU0VfVVZcblx0dlV2IFx4M2QgKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcbiNlbmRpZiIsdXYyX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiIsdXYyX3BhcnNfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0YXR0cmlidXRlIHZlYzIgdXYyO1xuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiIsdXYyX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdHZVdjIgXHgzZCB1djI7XG4jZW5kaWYiLAp3b3JsZHBvc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggRElTVEFOQ0UgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApXG5cdHZlYzQgd29ybGRQb3NpdGlvbiBceDNkIG1vZGVsTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuI2VuZGlmIixiYWNrZ3JvdW5kX2ZyYWc6InVuaWZvcm0gc2FtcGxlcjJEIHQyRDtcbnZhcnlpbmcgdmVjMiB2VXY7XG52b2lkIG1haW4oKSB7XG5cdHZlYzQgdGV4Q29sb3IgXHgzZCB0ZXh0dXJlMkQoIHQyRCwgdlV2ICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLGJhY2tncm91bmRfdmVydDoidmFyeWluZyB2ZWMyIHZVdjtcbnVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbnZvaWQgbWFpbigpIHtcblx0dlV2IFx4M2QgKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcblx0Z2xfUG9zaXRpb24gXHgzZCB2ZWM0KCBwb3NpdGlvbi54eSwgMS4wLCAxLjAgKTtcbn0iLApjdWJlX2ZyYWc6InVuaWZvcm0gc2FtcGxlckN1YmUgdEN1YmU7XG51bmlmb3JtIGZsb2F0IHRGbGlwO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbnZvaWQgbWFpbigpIHtcblx0dmVjNCB0ZXhDb2xvciBceDNkIHRleHR1cmVDdWJlKCB0Q3ViZSwgdmVjMyggdEZsaXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcblx0Z2xfRnJhZ0NvbG9yLmEgKlx4M2Qgb3BhY2l0eTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxufSIsY3ViZV92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHRnbF9Qb3NpdGlvbi56IFx4M2QgZ2xfUG9zaXRpb24udztcbn0iLApkZXB0aF9mcmFnOiIjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdFx0ZGlmZnVzZUNvbG9yLmEgXHgzZCBvcGFjaXR5O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpZiBERVBUSF9QQUNLSU5HIFx4M2RceDNkIDMyMDBcblx0XHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCB2ZWMzKCAxLjAgLSBnbF9GcmFnQ29vcmQueiApLCBvcGFjaXR5ICk7XG5cdCNlbGlmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMVxuXHRcdGdsX0ZyYWdDb2xvciBceDNkIHBhY2tEZXB0aFRvUkdCQSggZ2xfRnJhZ0Nvb3JkLnogKTtcblx0I2VuZGlmXG59IiwKZGVwdGhfdmVydDoiI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0XHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcbn0iLApkaXN0YW5jZVJHQkFfZnJhZzoiI2RlZmluZSBESVNUQU5DRVxudW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uO1xudW5pZm9ybSBmbG9hdCBuZWFyRGlzdGFuY2U7XG51bmlmb3JtIGZsb2F0IGZhckRpc3RhbmNlO1xudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbiAoKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggMS4wICk7XG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0ZmxvYXQgZGlzdCBceDNkIGxlbmd0aCggdldvcmxkUG9zaXRpb24gLSByZWZlcmVuY2VQb3NpdGlvbiApO1xuXHRkaXN0IFx4M2QgKCBkaXN0IC0gbmVhckRpc3RhbmNlICkgLyAoIGZhckRpc3RhbmNlIC0gbmVhckRpc3RhbmNlICk7XG5cdGRpc3QgXHgzZCBzYXR1cmF0ZSggZGlzdCApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBwYWNrRGVwdGhUb1JHQkEoIGRpc3QgKTtcbn0iLApkaXN0YW5jZVJHQkFfdmVydDoiI2RlZmluZSBESVNUQU5DRVxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0XHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dldvcmxkUG9zaXRpb24gXHgzZCB3b3JsZFBvc2l0aW9uLnh5ejtcbn0iLAplcXVpcmVjdF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dmVjMyBkaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWO1xuXHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIGRpcmVjdGlvbi55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHNhbXBsZVVWLnggXHgzZCBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHR2ZWM0IHRleENvbG9yIFx4M2QgdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLAplcXVpcmVjdF92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxufSIsbGluZWRhc2hlZF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgXHgzZSBkYXNoU2l6ZSApIHtcblx0XHRkaXNjYXJkO1xuXHR9XG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCmxpbmVkYXNoZWRfdmVydDoidW5pZm9ybSBmbG9hdCBzY2FsZTtcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdHZMaW5lRGlzdGFuY2UgXHgzZCBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcblx0dmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaGJhc2ljX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0I2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIHZlYzMoIDEuMCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKlx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xuXHQjaW5jbHVkZSBceDNjZW52bWFwX2ZyYWdtZW50XHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2hiYXNpY192ZXJ0OiIjaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3V2Ml92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hsYW1iZXJ0X2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcblx0dmFyeWluZyB2ZWMzIHZJbmRpcmVjdEJhY2s7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFza19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgXHgzZCBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZJbmRpcmVjdEZyb250IDogdkluZGlyZWN0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgdkluZGlyZWN0RnJvbnQ7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjbGlnaHRtYXBfZnJhZ21lbnRceDNlXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqXHgzZCBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSBceDNkICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlIFx4M2QgdkxpZ2h0RnJvbnQ7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICpceDNkIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNobGFtYmVydF92ZXJ0OiIjZGVmaW5lIExBTUJFUlRcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcbnZhcnlpbmcgdmVjMyB2SW5kaXJlY3RGcm9udDtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XG5cdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfbGFtYmVydF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLAptZXNobWF0Y2FwX2ZyYWc6IiNkZWZpbmUgTUFUQ0FQXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gc2FtcGxlcjJEIG1hdGNhcDtcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHR2ZWMzIHZpZXdEaXIgXHgzZCBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcblx0dmVjMyB4IFx4M2Qgbm9ybWFsaXplKCB2ZWMzKCB2aWV3RGlyLnosIDAuMCwgLSB2aWV3RGlyLnggKSApO1xuXHR2ZWMzIHkgXHgzZCBjcm9zcyggdmlld0RpciwgeCApO1xuXHR2ZWMyIHV2IFx4M2QgdmVjMiggZG90KCB4LCBub3JtYWwgKSwgZG90KCB5LCBub3JtYWwgKSApICogMC40OTUgKyAwLjU7XG5cdCNpZmRlZiBVU0VfTUFUQ0FQXG5cdFx0dmVjNCBtYXRjYXBDb2xvciBceDNkIHRleHR1cmUyRCggbWF0Y2FwLCB1diApO1xuXHRcdG1hdGNhcENvbG9yIFx4M2QgbWF0Y2FwVGV4ZWxUb0xpbmVhciggbWF0Y2FwQ29sb3IgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IG1hdGNhcENvbG9yIFx4M2QgdmVjNCggMS4wICk7XG5cdCNlbmRpZlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiICogbWF0Y2FwQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2htYXRjYXBfdmVydDoiI2RlZmluZSBNQVRDQVBcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpZm5kZWYgRkxBVF9TSEFERURcblx0XHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcbn0iLAptZXNocGhvbmdfZnJhZzoiI2RlZmluZSBQSE9OR1xudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIHZlYzMgc3BlY3VsYXI7XG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGFyc19iZWdpblx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NidW1wbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgXHgzZCBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X2JlZ2luXHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19waG9uZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2VuZFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaW5jbHVkZSBceDNjZW52bWFwX2ZyYWdtZW50XHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZGl0aGVyaW5nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2hwaG9uZ192ZXJ0OiIjZGVmaW5lIFBIT05HXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcbiNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaHBoeXNpY2FsX2ZyYWc6IiNkZWZpbmUgU1RBTkRBUkRcbiNpZmRlZiBQSFlTSUNBTFxuXHQjZGVmaW5lIFJFRkxFQ1RJVklUWVxuXHQjZGVmaW5lIENMRUFSQ09BVFxuXHQjZGVmaW5lIFRSQU5TUEFSRU5DWVxuI2VuZGlmXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWZkZWYgVFJBTlNQQVJFTkNZXG5cdHVuaWZvcm0gZmxvYXQgdHJhbnNwYXJlbmN5O1xuI2VuZGlmXG4jaWZkZWYgUkVGTEVDVElWSVRZXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuI2VuZGlmXG4jaWZkZWYgQ0xFQVJDT0FUXG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0O1xuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR1bmlmb3JtIHZlYzMgc2hlZW47XG4jZW5kaWZcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY2RpdGhlcmluZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NhbHBoYW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FvbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2N1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgXHgzZCBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3JvdWdobmVzc21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21ldGFsbmVzc21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2JlZ2luXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfZW5kXHgzZVxuXHQjaW5jbHVkZSBceDNjYW9tYXBfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpZmRlZiBUUkFOU1BBUkVOQ1lcblx0XHRkaWZmdXNlQ29sb3IuYSAqXHgzZCBzYXR1cmF0ZSggMS4gLSB0cmFuc3BhcmVuY3kgKyBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKCByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKSApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNocGh5c2ljYWxfdmVydDoiI2RlZmluZSBTVEFOREFSRFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NoYWRvd21hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm5vcm1hbF9mcmFnOiIjZGVmaW5lIE5PUk1BTFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBwYWNrTm9ybWFsVG9SR0IoIG5vcm1hbCApLCBvcGFjaXR5ICk7XG59IiwKbm9ybWFsX3ZlcnQ6IiNkZWZpbmUgTk9STUFMXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNlbmRpZlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2VGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0dkJpdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcblx0I2VuZGlmXG4jZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcbiNlbmRpZlxufSIsCnBvaW50c19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9wYXJ0aWNsZV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLApwb2ludHNfdmVydDoidW5pZm9ybSBmbG9hdCBzaXplO1xudW5pZm9ybSBmbG9hdCBzY2FsZTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHRnbF9Qb2ludFNpemUgXHgzZCBzaXplO1xuXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxuXHRcdGJvb2wgaXNQZXJzcGVjdGl2ZSBceDNkICggcHJvamVjdGlvbk1hdHJpeFsgMiBdWyAzIF0gXHgzZFx4M2QgLSAxLjAgKTtcblx0XHRpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKlx4M2QgKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKc2hhZG93X2ZyYWc6InVuaWZvcm0gdmVjMyBjb2xvcjtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGFyc19iZWdpblx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsc2hhZG93X3ZlcnQ6IiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLApzcHJpdGVfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG59IiwKc3ByaXRlX3ZlcnQ6InVuaWZvcm0gZmxvYXQgcm90YXRpb247XG51bmlmb3JtIHZlYzIgY2VudGVyO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHR2ZWM0IG12UG9zaXRpb24gXHgzZCBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcblx0dmVjMiBzY2FsZTtcblx0c2NhbGUueCBceDNkIGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDAgXS54LCBtb2RlbE1hdHJpeFsgMCBdLnksIG1vZGVsTWF0cml4WyAwIF0ueiApICk7XG5cdHNjYWxlLnkgXHgzZCBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueCwgbW9kZWxNYXRyaXhbIDEgXS55LCBtb2RlbE1hdHJpeFsgMSBdLnogKSApO1xuXHQjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgXHgzZCAoIHByb2plY3Rpb25NYXRyaXhbIDIgXVsgMyBdIFx4M2RceDNkIC0gMS4wICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKlx4M2QgLSBtdlBvc2l0aW9uLno7XG5cdCNlbmRpZlxuXHR2ZWMyIGFsaWduZWRQb3NpdGlvbiBceDNkICggcG9zaXRpb24ueHkgLSAoIGNlbnRlciAtIHZlYzIoIDAuNSApICkgKSAqIHNjYWxlO1xuXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjtcblx0cm90YXRlZFBvc2l0aW9uLnggXHgzZCBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRyb3RhdGVkUG9zaXRpb24ueSBceDNkIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XG5cdG12UG9zaXRpb24ueHkgK1x4M2Qgcm90YXRlZFBvc2l0aW9uO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59In0sCldhPXtjb21tb246e2RpZmZ1c2U6e3ZhbHVlOm5ldyBJKDE1NjU4NzM0KX0sb3BhY2l0eTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IHR9LGFscGhhTWFwOnt2YWx1ZTpudWxsfX0sc3BlY3VsYXJtYXA6e3NwZWN1bGFyTWFwOnt2YWx1ZTpudWxsfX0sZW52bWFwOntlbnZNYXA6e3ZhbHVlOm51bGx9LGZsaXBFbnZNYXA6e3ZhbHVlOi0xfSxyZWZsZWN0aXZpdHk6e3ZhbHVlOjF9LHJlZnJhY3Rpb25SYXRpbzp7dmFsdWU6Ljk4fSxtYXhNaXBMZXZlbDp7dmFsdWU6MH19LGFvbWFwOnthb01hcDp7dmFsdWU6bnVsbH0sYW9NYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fSxsaWdodG1hcDp7bGlnaHRNYXA6e3ZhbHVlOm51bGx9LGxpZ2h0TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sZW1pc3NpdmVtYXA6e2VtaXNzaXZlTWFwOnt2YWx1ZTpudWxsfX0sYnVtcG1hcDp7YnVtcE1hcDp7dmFsdWU6bnVsbH0sYnVtcFNjYWxlOnt2YWx1ZToxfX0sbm9ybWFsbWFwOntub3JtYWxNYXA6e3ZhbHVlOm51bGx9LApub3JtYWxTY2FsZTp7dmFsdWU6bmV3IGYoMSwxKX19LGRpc3BsYWNlbWVudG1hcDp7ZGlzcGxhY2VtZW50TWFwOnt2YWx1ZTpudWxsfSxkaXNwbGFjZW1lbnRTY2FsZTp7dmFsdWU6MX0sZGlzcGxhY2VtZW50Qmlhczp7dmFsdWU6MH19LHJvdWdobmVzc21hcDp7cm91Z2huZXNzTWFwOnt2YWx1ZTpudWxsfX0sbWV0YWxuZXNzbWFwOnttZXRhbG5lc3NNYXA6e3ZhbHVlOm51bGx9fSxncmFkaWVudG1hcDp7Z3JhZGllbnRNYXA6e3ZhbHVlOm51bGx9fSxmb2c6e2ZvZ0RlbnNpdHk6e3ZhbHVlOjIuNUUtNH0sZm9nTmVhcjp7dmFsdWU6MX0sZm9nRmFyOnt2YWx1ZToyRTN9LGZvZ0NvbG9yOnt2YWx1ZTpuZXcgSSgxNjc3NzIxNSl9fSxsaWdodHM6e2FtYmllbnRMaWdodENvbG9yOnt2YWx1ZTpbXX0sbGlnaHRQcm9iZTp7dmFsdWU6W119LGRpcmVjdGlvbmFsTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sY29sb3I6e30sc2hhZG93Ont9LHNoYWRvd0JpYXM6e30sCnNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sZGlyZWN0aW9uYWxTaGFkb3dNYXA6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDp7dmFsdWU6W119LHNwb3RMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRpcmVjdGlvbjp7fSxkaXN0YW5jZTp7fSxjb25lQ29zOnt9LHBlbnVtYnJhQ29zOnt9LGRlY2F5Ont9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sc3BvdFNoYWRvd01hcDp7dmFsdWU6W119LHNwb3RTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxwb2ludExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sZGVjYXk6e30sZGlzdGFuY2U6e30sc2hhZG93Ont9LHNoYWRvd0JpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e30sc2hhZG93Q2FtZXJhTmVhcjp7fSxzaGFkb3dDYW1lcmFGYXI6e319fSwKcG9pbnRTaGFkb3dNYXA6e3ZhbHVlOltdfSxwb2ludFNoYWRvd01hdHJpeDp7dmFsdWU6W119LGhlbWlzcGhlcmVMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2RpcmVjdGlvbjp7fSxza3lDb2xvcjp7fSxncm91bmRDb2xvcjp7fX19LHJlY3RBcmVhTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSx3aWR0aDp7fSxoZWlnaHQ6e319fX0scG9pbnRzOntkaWZmdXNlOnt2YWx1ZTpuZXcgSSgxNTY1ODczNCl9LG9wYWNpdHk6e3ZhbHVlOjF9LHNpemU6e3ZhbHVlOjF9LHNjYWxlOnt2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgdH19LHNwcml0ZTp7ZGlmZnVzZTp7dmFsdWU6bmV3IEkoMTU2NTg3MzQpfSxvcGFjaXR5Ont2YWx1ZToxfSxjZW50ZXI6e3ZhbHVlOm5ldyBmKC41LC41KX0scm90YXRpb246e3ZhbHVlOjB9LG1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyB0fX19LE1jPQp7YmFzaWM6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2Euc3BlY3VsYXJtYXAsV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmZvZ10pLHZlcnRleFNoYWRlcjpyYi5tZXNoYmFzaWNfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNoYmFzaWNfZnJhZ30sbGFtYmVydDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5zcGVjdWxhcm1hcCxXYS5lbnZtYXAsV2EuYW9tYXAsV2EubGlnaHRtYXAsV2EuZW1pc3NpdmVtYXAsV2EuZm9nLFdhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBJKDApfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaGxhbWJlcnRfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNobGFtYmVydF9mcmFnfSxwaG9uZzp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5zcGVjdWxhcm1hcCxXYS5lbnZtYXAsV2EuYW9tYXAsV2EubGlnaHRtYXAsV2EuZW1pc3NpdmVtYXAsV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLFdhLmdyYWRpZW50bWFwLApXYS5mb2csV2EubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IEkoMCl9LHNwZWN1bGFyOnt2YWx1ZTpuZXcgSSgxMTE4NDgxKX0sc2hpbmluZXNzOnt2YWx1ZTozMH19XSksdmVydGV4U2hhZGVyOnJiLm1lc2hwaG9uZ192ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLm1lc2hwaG9uZ19mcmFnfSxzdGFuZGFyZDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5lbnZtYXAsV2EuYW9tYXAsV2EubGlnaHRtYXAsV2EuZW1pc3NpdmVtYXAsV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLFdhLnJvdWdobmVzc21hcCxXYS5tZXRhbG5lc3NtYXAsV2EuZm9nLFdhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBJKDApfSxyb3VnaG5lc3M6e3ZhbHVlOi41fSxtZXRhbG5lc3M6e3ZhbHVlOi41fSxlbnZNYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfZnJhZ30sCm1hdGNhcDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5idW1wbWFwLFdhLm5vcm1hbG1hcCxXYS5kaXNwbGFjZW1lbnRtYXAsV2EuZm9nLHttYXRjYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNobWF0Y2FwX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaG1hdGNhcF9mcmFnfSxwb2ludHM6e3VuaWZvcm1zOkJiKFtXYS5wb2ludHMsV2EuZm9nXSksdmVydGV4U2hhZGVyOnJiLnBvaW50c192ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLnBvaW50c19mcmFnfSxkYXNoZWQ6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuZm9nLHtzY2FsZTp7dmFsdWU6MX0sZGFzaFNpemU6e3ZhbHVlOjF9LHRvdGFsU2l6ZTp7dmFsdWU6Mn19XSksdmVydGV4U2hhZGVyOnJiLmxpbmVkYXNoZWRfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5saW5lZGFzaGVkX2ZyYWd9LGRlcHRoOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmRpc3BsYWNlbWVudG1hcF0pLHZlcnRleFNoYWRlcjpyYi5kZXB0aF92ZXJ0LApmcmFnbWVudFNoYWRlcjpyYi5kZXB0aF9mcmFnfSxub3JtYWw6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLHtvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubm9ybWFsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubm9ybWFsX2ZyYWd9LHNwcml0ZTp7dW5pZm9ybXM6QmIoW1dhLnNwcml0ZSxXYS5mb2ddKSx2ZXJ0ZXhTaGFkZXI6cmIuc3ByaXRlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuc3ByaXRlX2ZyYWd9LGJhY2tncm91bmQ6e3VuaWZvcm1zOnt1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IHR9LHQyRDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpyYi5iYWNrZ3JvdW5kX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuYmFja2dyb3VuZF9mcmFnfSxjdWJlOnt1bmlmb3Jtczp7dEN1YmU6e3ZhbHVlOm51bGx9LHRGbGlwOnt2YWx1ZTotMX0sb3BhY2l0eTp7dmFsdWU6MX19LHZlcnRleFNoYWRlcjpyYi5jdWJlX3ZlcnQsCmZyYWdtZW50U2hhZGVyOnJiLmN1YmVfZnJhZ30sZXF1aXJlY3Q6e3VuaWZvcm1zOnt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6cmIuZXF1aXJlY3RfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5lcXVpcmVjdF9mcmFnfSxkaXN0YW5jZVJHQkE6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuZGlzcGxhY2VtZW50bWFwLHtyZWZlcmVuY2VQb3NpdGlvbjp7dmFsdWU6bmV3IGt9LG5lYXJEaXN0YW5jZTp7dmFsdWU6MX0sZmFyRGlzdGFuY2U6e3ZhbHVlOjFFM319XSksdmVydGV4U2hhZGVyOnJiLmRpc3RhbmNlUkdCQV92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLmRpc3RhbmNlUkdCQV9mcmFnfSxzaGFkb3c6e3VuaWZvcm1zOkJiKFtXYS5saWdodHMsV2EuZm9nLHtjb2xvcjp7dmFsdWU6bmV3IEkoMCl9LG9wYWNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpyYi5zaGFkb3dfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5zaGFkb3dfZnJhZ319O01jLnBoeXNpY2FsPQp7dW5pZm9ybXM6QmIoW01jLnN0YW5kYXJkLnVuaWZvcm1zLHt0cmFuc3BhcmVuY3k6e3ZhbHVlOjB9LGNsZWFyY29hdDp7dmFsdWU6MH0sY2xlYXJjb2F0Um91Z2huZXNzOnt2YWx1ZTowfSxzaGVlbjp7dmFsdWU6bmV3IEkoMCl9LGNsZWFyY29hdE5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgZigxLDEpfSxjbGVhcmNvYXROb3JtYWxNYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfZnJhZ307cmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtyZC5wcm90b3R5cGUuY29uc3RydWN0b3I9cmQ7TGMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtMYy5wcm90b3R5cGUuY29uc3RydWN0b3I9TGM7Y2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO2NkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jZDtjZC5wcm90b3R5cGUuaXNDdWJlVGV4dHVyZT0KITA7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLnByb3RvdHlwZSwiaW1hZ2VzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW1hZ2V9LHNldDpmdW5jdGlvbihhKXt0aGlzLmltYWdlPWF9fSk7cmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO3JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1yZTtyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTJEQXJyYXk9ITA7c2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO3NlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1zZTtzZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTNEPSEwO3ZhciBpaj1uZXcgbCxlbD1uZXcgcmUsZ2w9bmV3IHNlLGpqPW5ldyBjZCxjaj1bXSxlaj1bXSxoaj1uZXcgRmxvYXQzMkFycmF5KDE2KSxnaj1uZXcgRmxvYXQzMkFycmF5KDkpLGZqPW5ldyBGbG9hdDMyQXJyYXkoNCk7a2oucHJvdG90eXBlLnVwZGF0ZUNhY2hlPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY2FjaGU7YSBpbnN0YW5jZW9mCkZsb2F0MzJBcnJheSYmYy5sZW5ndGghPT1hLmxlbmd0aCYmKHRoaXMuY2FjaGU9bmV3IEZsb2F0MzJBcnJheShhLmxlbmd0aCkpO21jKGMsYSl9O2xqLnByb3RvdHlwZS5zZXRWYWx1ZT1mdW5jdGlvbihhLGMsZSl7Zm9yKHZhciBnPXRoaXMuc2VxLHI9MCx2PWcubGVuZ3RoO3IhPT12Oysrcil7dmFyIHo9Z1tyXTt6LnNldFZhbHVlKGEsY1t6LmlkXSxlKX19O3ZhciBMaD0vKFtcd1xkX10rKShcXSk/KFxbfFwuKT8vZzt1ZC5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oYSxjLGUsZyl7Yz10aGlzLm1hcFtjXTt2b2lkIDAhPT1jJiZjLnNldFZhbHVlKGEsZSxnKX07dWQucHJvdG90eXBlLnNldE9wdGlvbmFsPWZ1bmN0aW9uKGEsYyxlKXtjPWNbZV07dm9pZCAwIT09YyYmdGhpcy5zZXRWYWx1ZShhLGUsYyl9O3VkLnVwbG9hZD1mdW5jdGlvbihhLGMsZSxnKXtmb3IodmFyIHI9MCx2PWMubGVuZ3RoO3IhPT12Oysrcil7dmFyIHo9Y1tyXSxFPWVbei5pZF07ITEhPT1FLm5lZWRzVXBkYXRlJiYKei5zZXRWYWx1ZShhLEUudmFsdWUsZyl9fTt1ZC5zZXFXaXRoVmFsdWU9ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9W10sZz0wLHI9YS5sZW5ndGg7ZyE9PXI7KytnKXt2YXIgdj1hW2ddO3YuaWQgaW4gYyYmZS5wdXNoKHYpfXJldHVybiBlfTt2YXIgS2w9MCxUbD0wO3ZkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTt2ZC5wcm90b3R5cGUuY29uc3RydWN0b3I9dmQ7dmQucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWw9ITA7dmQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kZXB0aFBhY2tpbmc9YS5kZXB0aFBhY2tpbmc7dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubWFwPWEubWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmRpc3BsYWNlbWVudE1hcD1hLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPQphLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7cmV0dXJuIHRoaXN9O3dkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTt3ZC5wcm90b3R5cGUuY29uc3RydWN0b3I9d2Q7d2QucHJvdG90eXBlLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9ITA7d2QucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KGEucmVmZXJlbmNlUG9zaXRpb24pO3RoaXMubmVhckRpc3RhbmNlPWEubmVhckRpc3RhbmNlO3RoaXMuZmFyRGlzdGFuY2U9YS5mYXJEaXN0YW5jZTt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tYXA9YS5tYXA7dGhpcy5hbHBoYU1hcD0KYS5hbHBoYU1hcDt0aGlzLmRpc3BsYWNlbWVudE1hcD1hLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWEuZGlzcGxhY2VtZW50U2NhbGU7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPWEuZGlzcGxhY2VtZW50QmlhcztyZXR1cm4gdGhpc307dWUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnVlLGlzR3JvdXA6ITB9KTt2Zi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHZiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZmLGlzQXJyYXlDYW1lcmE6ITB9KTt2YXIgeWo9bmV3IGssemo9bmV3IGs7T2JqZWN0LmFzc2lnbihOaC5wcm90b3R5cGUsZC5wcm90b3R5cGUpO09iamVjdC5hc3NpZ24oQWoucHJvdG90eXBlLGQucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKHpnLnByb3RvdHlwZSx7aXNGb2dFeHAyOiEwLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB6Zyh0aGlzLmNvbG9yLAp0aGlzLmRlbnNpdHkpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiRm9nRXhwMiIsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxkZW5zaXR5OnRoaXMuZGVuc2l0eX19fSk7T2JqZWN0LmFzc2lnbihBZy5wcm90b3R5cGUse2lzRm9nOiEwLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBZyh0aGlzLmNvbG9yLHRoaXMubmVhcix0aGlzLmZhcil9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJGb2ciLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksbmVhcjp0aGlzLm5lYXIsZmFyOnRoaXMuZmFyfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoUWQucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihhKXshMD09PWEmJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24oUWQucHJvdG90eXBlLHtpc0ludGVybGVhdmVkQnVmZmVyOiEwLG9uVXBsb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9LHNldEFycmF5OmZ1bmN0aW9uKGEpe2lmKEFycmF5LmlzQXJyYXkoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTsKdGhpcy5jb3VudD12b2lkIDAhPT1hP2EubGVuZ3RoL3RoaXMuc3RyaWRlOjA7dGhpcy5hcnJheT1hO3JldHVybiB0aGlzfSxzZXREeW5hbWljOmZ1bmN0aW9uKGEpe3RoaXMuZHluYW1pYz1hO3JldHVybiB0aGlzfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYXJyYXk9bmV3IGEuYXJyYXkuY29uc3RydWN0b3IoYS5hcnJheSk7dGhpcy5jb3VudD1hLmNvdW50O3RoaXMuc3RyaWRlPWEuc3RyaWRlO3RoaXMuZHluYW1pYz1hLmR5bmFtaWM7cmV0dXJuIHRoaXN9LGNvcHlBdDpmdW5jdGlvbihhLGMsZSl7YSo9dGhpcy5zdHJpZGU7ZSo9Yy5zdHJpZGU7Zm9yKHZhciBnPTAscj10aGlzLnN0cmlkZTtnPHI7ZysrKXRoaXMuYXJyYXlbYStnXT1jLmFycmF5W2UrZ107cmV0dXJuIHRoaXN9LHNldDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMuYXJyYXkuc2V0KGEsYyk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSwKb25VcGxvYWQ6ZnVuY3Rpb24oYSl7dGhpcy5vblVwbG9hZENhbGxiYWNrPWE7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeGYucHJvdG90eXBlLHtjb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5jb3VudH19LGFycmF5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5fX19KTtPYmplY3QuYXNzaWduKHhmLnByb3RvdHlwZSx7aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTohMCxzZXRYOmZ1bmN0aW9uKGEsYyl7dGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF09YztyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihhLGMpe3RoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09YztyZXR1cm4gdGhpc30sc2V0WjpmdW5jdGlvbihhLGMpe3RoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl09YztyZXR1cm4gdGhpc30sCnNldFc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdPWM7cmV0dXJuIHRoaXN9LGdldFg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdfSxnZXRZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdfSxnZXRaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdfSxnZXRXOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdfSxzZXRYWTpmdW5jdGlvbihhLGMsZSl7YT1hKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7dGhpcy5kYXRhLmFycmF5W2ErMF09Yzt0aGlzLmRhdGEuYXJyYXlbYSsxXT1lO3JldHVybiB0aGlzfSxzZXRYWVo6ZnVuY3Rpb24oYSwKYyxlLGcpe2E9YSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVthKzBdPWM7dGhpcy5kYXRhLmFycmF5W2ErMV09ZTt0aGlzLmRhdGEuYXJyYXlbYSsyXT1nO3JldHVybiB0aGlzfSxzZXRYWVpXOmZ1bmN0aW9uKGEsYyxlLGcscil7YT1hKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7dGhpcy5kYXRhLmFycmF5W2ErMF09Yzt0aGlzLmRhdGEuYXJyYXlbYSsxXT1lO3RoaXMuZGF0YS5hcnJheVthKzJdPWc7dGhpcy5kYXRhLmFycmF5W2ErM109cjtyZXR1cm4gdGhpc319KTtBZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7QWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPUFkO0FkLnByb3RvdHlwZS5pc1Nwcml0ZU1hdGVyaWFsPSEwO0FkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hcD1hLm1hcDt0aGlzLnJvdGF0aW9uPQphLnJvdGF0aW9uO3RoaXMuc2l6ZUF0dGVudWF0aW9uPWEuc2l6ZUF0dGVudWF0aW9uO3JldHVybiB0aGlzfTt2YXIgQWUsbWc9bmV3IGssbmY9bmV3IGssb2Y9bmV3IGssQmU9bmV3IGYsemY9bmV3IGYsRmo9bmV3IHEscWg9bmV3IGssbmc9bmV3IGsscmg9bmV3IGssa2s9bmV3IGYsS2k9bmV3IGYsbGs9bmV3IGY7eWYucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnlmLGlzU3ByaXRlOiEwLHJheWNhc3Q6ZnVuY3Rpb24oYSxjKXtudWxsPT09YS5jYW1lcmEmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLlNwcml0ZTogIlJheWNhc3Rlci5jYW1lcmEiIG5lZWRzIHRvIGJlIHNldCBpbiBvcmRlciB0byByYXljYXN0IGFnYWluc3Qgc3ByaXRlcy4nKTtuZi5zZXRGcm9tTWF0cml4U2NhbGUodGhpcy5tYXRyaXhXb3JsZCk7RmouY29weShhLmNhbWVyYS5tYXRyaXhXb3JsZCk7dGhpcy5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhhLmNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsCnRoaXMubWF0cml4V29ybGQpO29mLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1vZGVsVmlld01hdHJpeCk7YS5jYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSYmITE9PT10aGlzLm1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiYmbmYubXVsdGlwbHlTY2FsYXIoLW9mLnopO3ZhciBlPXRoaXMubWF0ZXJpYWwucm90YXRpb247aWYoMCE9PWUpe3ZhciBnPU1hdGguY29zKGUpO3ZhciByPU1hdGguc2luKGUpfWU9dGhpcy5jZW50ZXI7QmcocWguc2V0KC0uNSwtLjUsMCksb2YsZSxuZixyLGcpO0JnKG5nLnNldCguNSwtLjUsMCksb2YsZSxuZixyLGcpO0JnKHJoLnNldCguNSwuNSwwKSxvZixlLG5mLHIsZyk7a2suc2V0KDAsMCk7S2kuc2V0KDEsMCk7bGsuc2V0KDEsMSk7dmFyIHY9YS5yYXkuaW50ZXJzZWN0VHJpYW5nbGUocWgsbmcscmgsITEsbWcpO2lmKG51bGw9PT12JiYoQmcobmcuc2V0KC0uNSwuNSwwKSxvZixlLG5mLHIsZyksS2kuc2V0KDAsMSksdj1hLnJheS5pbnRlcnNlY3RUcmlhbmdsZShxaCwKcmgsbmcsITEsbWcpLG51bGw9PT12KSlyZXR1cm47cj1hLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhtZyk7cjxhLm5lYXJ8fHI+YS5mYXJ8fGMucHVzaCh7ZGlzdGFuY2U6cixwb2ludDptZy5jbG9uZSgpLHV2OkIuZ2V0VVYobWcscWgsbmcscmgsa2ssS2ksbGssbmV3IGYpLGZhY2U6bnVsbCxvYmplY3Q6dGhpc30pfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt2b2lkIDAhPT1hLmNlbnRlciYmdGhpcy5jZW50ZXIuY29weShhLmNlbnRlcik7cmV0dXJuIHRoaXN9fSk7dmFyIHNoPW5ldyBrLG1rPW5ldyBrO0FmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpBZixpc0xPRDohMCxjb3B5OmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphLCExKTthPWEubGV2ZWxzO2Zvcih2YXIgYz0wLGU9YS5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YVtjXTt0aGlzLmFkZExldmVsKGcub2JqZWN0LmNsb25lKCksZy5kaXN0YW5jZSl9cmV0dXJuIHRoaXN9LGFkZExldmVsOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Yz1NYXRoLmFicyhjKTtmb3IodmFyIGU9dGhpcy5sZXZlbHMsZz0wO2c8ZS5sZW5ndGgmJiEoYzxlW2ddLmRpc3RhbmNlKTtnKyspO2Uuc3BsaWNlKGcsMCx7ZGlzdGFuY2U6YyxvYmplY3Q6YX0pO3RoaXMuYWRkKGEpO3JldHVybiB0aGlzfSxnZXRPYmplY3RGb3JEaXN0YW5jZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5sZXZlbHMsZT0xLGc9Yy5sZW5ndGg7ZTxnJiYhKGE8Y1tlXS5kaXN0YW5jZSk7ZSsrKTtyZXR1cm4gY1tlLTFdLm9iamVjdH0scmF5Y2FzdDpmdW5jdGlvbihhLGMpe3NoLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKTt0aGlzLmdldE9iamVjdEZvckRpc3RhbmNlKGEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKHNoKSkucmF5Y2FzdChhLApjKX0sdXBkYXRlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMubGV2ZWxzO2lmKDE8Yy5sZW5ndGgpe3NoLnNldEZyb21NYXRyaXhQb3NpdGlvbihhLm1hdHJpeFdvcmxkKTttay5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7YT1zaC5kaXN0YW5jZVRvKG1rKTtjWzBdLm9iamVjdC52aXNpYmxlPSEwO2Zvcih2YXIgZT0xLGc9Yy5sZW5ndGg7ZTxnO2UrKylpZihhPj1jW2VdLmRpc3RhbmNlKWNbZS0xXS5vYmplY3QudmlzaWJsZT0hMSxjW2VdLm9iamVjdC52aXNpYmxlPSEwO2Vsc2UgYnJlYWs7Zm9yKDtlPGc7ZSsrKWNbZV0ub2JqZWN0LnZpc2libGU9ITF9fSx0b0pTT046ZnVuY3Rpb24oYSl7YT1BLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0LmxldmVscz1bXTtmb3IodmFyIGM9dGhpcy5sZXZlbHMsZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9Y1tlXTthLm9iamVjdC5sZXZlbHMucHVzaCh7b2JqZWN0OnIub2JqZWN0LnV1aWQsCmRpc3RhbmNlOnIuZGlzdGFuY2V9KX1yZXR1cm4gYX19KTtCZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkJmLGlzU2tpbm5lZE1lc2g6ITAsYmluZDpmdW5jdGlvbihhLGMpe3RoaXMuc2tlbGV0b249YTt2b2lkIDA9PT1jJiYodGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCksdGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpLGM9dGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5iaW5kTWF0cml4LmNvcHkoYyk7dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKGMpfSxwb3NlOmZ1bmN0aW9uKCl7dGhpcy5za2VsZXRvbi5wb3NlKCl9LG5vcm1hbGl6ZVNraW5XZWlnaHRzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBwLGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQsZT0wLGc9Yy5jb3VudDtlPGc7ZSsrKXthLng9Yy5nZXRYKGUpO2EueT1jLmdldFkoZSk7YS56PWMuZ2V0WihlKTsKYS53PWMuZ2V0VyhlKTt2YXIgcj0xL2EubWFuaGF0dGFuTGVuZ3RoKCk7SW5maW5pdHkhPT1yP2EubXVsdGlwbHlTY2FsYXIocik6YS5zZXQoMSwwLDAsMCk7Yy5zZXRYWVpXKGUsYS54LGEueSxhLnosYS53KX19LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGEpe3hhLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSk7ImF0dGFjaGVkIj09PXRoaXMuYmluZE1vZGU/dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpOiJkZXRhY2hlZCI9PT10aGlzLmJpbmRNb2RlP3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLmJpbmRNYXRyaXgpOmNvbnNvbGUud2FybigiVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogIit0aGlzLmJpbmRNb2RlKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTsKdmFyIG5rPW5ldyBxLEltPW5ldyBxO09iamVjdC5hc3NpZ24oQ2cucHJvdG90eXBlLHtjYWxjdWxhdGVJbnZlcnNlczpmdW5jdGlvbigpe3RoaXMuYm9uZUludmVyc2VzPVtdO2Zvcih2YXIgYT0wLGM9dGhpcy5ib25lcy5sZW5ndGg7YTxjO2ErKyl7dmFyIGU9bmV3IHE7dGhpcy5ib25lc1thXSYmZS5nZXRJbnZlcnNlKHRoaXMuYm9uZXNbYV0ubWF0cml4V29ybGQpO3RoaXMuYm9uZUludmVyc2VzLnB1c2goZSl9fSxwb3NlOmZ1bmN0aW9uKCl7dmFyIGEsYzt2YXIgZT0wO2ZvcihjPXRoaXMuYm9uZXMubGVuZ3RoO2U8YztlKyspKGE9dGhpcy5ib25lc1tlXSkmJmEubWF0cml4V29ybGQuZ2V0SW52ZXJzZSh0aGlzLmJvbmVJbnZlcnNlc1tlXSk7ZT0wO2ZvcihjPXRoaXMuYm9uZXMubGVuZ3RoO2U8YztlKyspaWYoYT10aGlzLmJvbmVzW2VdKWEucGFyZW50JiZhLnBhcmVudC5pc0JvbmU/KGEubWF0cml4LmdldEludmVyc2UoYS5wYXJlbnQubWF0cml4V29ybGQpLGEubWF0cml4Lm11bHRpcGx5KGEubWF0cml4V29ybGQpKToKYS5tYXRyaXguY29weShhLm1hdHJpeFdvcmxkKSxhLm1hdHJpeC5kZWNvbXBvc2UoYS5wb3NpdGlvbixhLnF1YXRlcm5pb24sYS5zY2FsZSl9LHVwZGF0ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmJvbmVzLGM9dGhpcy5ib25lSW52ZXJzZXMsZT10aGlzLmJvbmVNYXRyaWNlcyxnPXRoaXMuYm9uZVRleHR1cmUscj0wLHY9YS5sZW5ndGg7cjx2O3IrKyluay5tdWx0aXBseU1hdHJpY2VzKGFbcl0/YVtyXS5tYXRyaXhXb3JsZDpJbSxjW3JdKSxuay50b0FycmF5KGUsMTYqcik7dm9pZCAwIT09ZyYmKGcubmVlZHNVcGRhdGU9ITApfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgQ2codGhpcy5ib25lcyx0aGlzLmJvbmVJbnZlcnNlcyl9LGdldEJvbmVCeU5hbWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTAsZT10aGlzLmJvbmVzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz10aGlzLmJvbmVzW2NdO2lmKGcubmFtZT09PWEpcmV0dXJuIGd9fX0pO1VoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6VWgsaXNCb25lOiEwfSk7RmIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO0ZiLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GYjtGYi5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbD0hMDtGYi5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5saW5ld2lkdGg9YS5saW5ld2lkdGg7dGhpcy5saW5lY2FwPWEubGluZWNhcDt0aGlzLmxpbmVqb2luPWEubGluZWpvaW47cmV0dXJuIHRoaXN9O3ZhciBvaz1uZXcgayxwaz1uZXcgayxxaz1uZXcgcSx0aD1uZXcgRCxvZz1uZXcgRztWYi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VmIsaXNMaW5lOiEwLGNvbXB1dGVMaW5lRGlzdGFuY2VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PQphLmluZGV4KXtmb3IodmFyIGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9WzBdLGc9MSxyPWMuY291bnQ7ZzxyO2crKylvay5mcm9tQnVmZmVyQXR0cmlidXRlKGMsZy0xKSxway5mcm9tQnVmZmVyQXR0cmlidXRlKGMsZyksZVtnXT1lW2ctMV0sZVtnXSs9b2suZGlzdGFuY2VUbyhwayk7YS5hZGRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGNhKGUsMSkpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5MaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIGlmKGEuaXNHZW9tZXRyeSlmb3IoYz1hLnZlcnRpY2VzLGU9YS5saW5lRGlzdGFuY2VzLGVbMF09MCxnPTEscj1jLmxlbmd0aDtnPHI7ZysrKWVbZ109ZVtnLTFdLGVbZ10rPWNbZy0xXS5kaXN0YW5jZVRvKGNbZ10pO3JldHVybiB0aGlzfSxyYXljYXN0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5saW5lUHJlY2lzaW9uLApnPXRoaXMuZ2VvbWV0cnkscj10aGlzLm1hdHJpeFdvcmxkO251bGw9PT1nLmJvdW5kaW5nU3BoZXJlJiZnLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO29nLmNvcHkoZy5ib3VuZGluZ1NwaGVyZSk7b2cuYXBwbHlNYXRyaXg0KHIpO29nLnJhZGl1cys9ZTtpZighMSE9PWEucmF5LmludGVyc2VjdHNTcGhlcmUob2cpKXtxay5nZXRJbnZlcnNlKHIpO3RoLmNvcHkoYS5yYXkpLmFwcGx5TWF0cml4NChxayk7ZS89KHRoaXMuc2NhbGUueCt0aGlzLnNjYWxlLnkrdGhpcy5zY2FsZS56KS8zO2UqPWU7dmFyIHY9bmV3IGssej1uZXcgaztyPW5ldyBrO3ZhciBFPW5ldyBrLEY9dGhpcyYmdGhpcy5pc0xpbmVTZWdtZW50cz8yOjE7aWYoZy5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgSj1nLmluZGV4LFA9Zy5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O2lmKG51bGwhPT1KKXtKPUouYXJyYXk7Zz0wO2Zvcih2YXIgUj1KLmxlbmd0aC0xO2c8UjtnKz1GKXt2YXIgUz1KW2crMV07di5mcm9tQXJyYXkoUCwKMypKW2ddKTt6LmZyb21BcnJheShQLDMqUyk7Uz10aC5kaXN0YW5jZVNxVG9TZWdtZW50KHYseixFLHIpO1M+ZXx8KEUuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLFM9YS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oRSksUzxhLm5lYXJ8fFM+YS5mYXJ8fGMucHVzaCh7ZGlzdGFuY2U6Uyxwb2ludDpyLmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4OmcsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfX1lbHNlIGZvcihnPTAsUj1QLmxlbmd0aC8zLTE7ZzxSO2crPUYpdi5mcm9tQXJyYXkoUCwzKmcpLHouZnJvbUFycmF5KFAsMypnKzMpLFM9dGguZGlzdGFuY2VTcVRvU2VnbWVudCh2LHosRSxyKSxTPmV8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxTPWEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFM8YS5uZWFyfHxTPmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOlMscG9pbnQ6ci5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSwKaW5kZXg6ZyxmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsb2JqZWN0OnRoaXN9KSl9ZWxzZSBpZihnLmlzR2VvbWV0cnkpZm9yKHY9Zy52ZXJ0aWNlcyx6PXYubGVuZ3RoLGc9MDtnPHotMTtnKz1GKVM9dGguZGlzdGFuY2VTcVRvU2VnbWVudCh2W2ddLHZbZysxXSxFLHIpLFM+ZXx8KEUuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLFM9YS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oRSksUzxhLm5lYXJ8fFM+YS5mYXJ8fGMucHVzaCh7ZGlzdGFuY2U6Uyxwb2ludDpyLmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4OmcsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTt2YXIgdWg9bmV3IGssdmg9bmV3IGs7SWIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6SWIsaXNMaW5lU2VnbWVudHM6ITAsY29tcHV0ZUxpbmVEaXN0YW5jZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdlb21ldHJ5O2lmKGEuaXNCdWZmZXJHZW9tZXRyeSlpZihudWxsPT09YS5pbmRleCl7Zm9yKHZhciBjPWEuYXR0cmlidXRlcy5wb3NpdGlvbixlPVtdLGc9MCxyPWMuY291bnQ7ZzxyO2crPTIpdWguZnJvbUJ1ZmZlckF0dHJpYnV0ZShjLGcpLHZoLmZyb21CdWZmZXJBdHRyaWJ1dGUoYyxnKzEpLGVbZ109MD09PWc/MDplW2ctMV0sZVtnKzFdPWVbZ10rdWguZGlzdGFuY2VUbyh2aCk7YS5hZGRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGNhKGUsMSkpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5MaW5lU2VnbWVudHMuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LiIpO2Vsc2UgaWYoYS5pc0dlb21ldHJ5KWZvcihjPWEudmVydGljZXMsZT0KYS5saW5lRGlzdGFuY2VzLGc9MCxyPWMubGVuZ3RoO2c8cjtnKz0yKXVoLmNvcHkoY1tnXSksdmguY29weShjW2crMV0pLGVbZ109MD09PWc/MDplW2ctMV0sZVtnKzFdPWVbZ10rdWguZGlzdGFuY2VUbyh2aCk7cmV0dXJuIHRoaXN9fSk7RGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpEZyxpc0xpbmVMb29wOiEwfSk7QWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO0FjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BYztBYy5wcm90b3R5cGUuaXNQb2ludHNNYXRlcmlhbD0hMDtBYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXA9YS5tYXA7dGhpcy5zaXplPWEuc2l6ZTt0aGlzLnNpemVBdHRlbnVhdGlvbj1hLnNpemVBdHRlbnVhdGlvbjt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czsKcmV0dXJuIHRoaXN9O3ZhciByaz1uZXcgcSxXaD1uZXcgRCxwZz1uZXcgRyx3aD1uZXcgaztDZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6Q2UsaXNQb2ludHM6ITAscmF5Y2FzdDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZ2VvbWV0cnksZz10aGlzLm1hdHJpeFdvcmxkLHI9YS5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZDtudWxsPT09ZS5ib3VuZGluZ1NwaGVyZSYmZS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtwZy5jb3B5KGUuYm91bmRpbmdTcGhlcmUpO3BnLmFwcGx5TWF0cml4NChnKTtwZy5yYWRpdXMrPXI7aWYoITEhPT1hLnJheS5pbnRlcnNlY3RzU3BoZXJlKHBnKSlpZihyay5nZXRJbnZlcnNlKGcpLFdoLmNvcHkoYS5yYXkpLmFwcGx5TWF0cml4NChyayksci89KHRoaXMuc2NhbGUueCt0aGlzLnNjYWxlLnkrdGhpcy5zY2FsZS56KS8zLHIqPXIsZS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgdj1lLmluZGV4OwplPWUuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtpZihudWxsIT09dil7dmFyIHo9di5hcnJheTt2PTA7Zm9yKHZhciBFPXoubGVuZ3RoO3Y8RTt2Kyspe3ZhciBGPXpbdl07d2guZnJvbUFycmF5KGUsMypGKTtWaCh3aCxGLHIsZyxhLGMsdGhpcyl9fWVsc2UgZm9yKHY9MCx6PWUubGVuZ3RoLzM7djx6O3YrKyl3aC5mcm9tQXJyYXkoZSwzKnYpLFZoKHdoLHYscixnLGEsYyx0aGlzKX1lbHNlIGZvcihlPWUudmVydGljZXMsdj0wLHo9ZS5sZW5ndGg7djx6O3YrKylWaChlW3ZdLHYscixnLGEsYyx0aGlzKX0sdXBkYXRlTW9ycGhUYXJnZXRzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpe2E9YS5tb3JwaEF0dHJpYnV0ZXM7dmFyIGM9T2JqZWN0LmtleXMoYSk7aWYoMDxjLmxlbmd0aCl7dmFyIGU9YVtjWzBdXTtpZih2b2lkIDAhPT1lKWZvcih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT0Ke30sYT0wLGM9ZS5sZW5ndGg7YTxjO2ErKyl7dmFyIGc9ZVthXS5uYW1lfHxTdHJpbmcoYSk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKTt0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtnXT1hfX19ZWxzZSBhPWEubW9ycGhUYXJnZXRzLHZvaWQgMCE9PWEmJjA8YS5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlBvaW50cy51cGRhdGVNb3JwaFRhcmdldHMoKSBkb2VzIG5vdCBzdXBwb3J0IFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTtYaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WGgsaXNWaWRlb1RleHR1cmU6ITAsdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pbWFnZTthLnJlYWR5U3RhdGU+PQphLkhBVkVfQ1VSUkVOVF9EQVRBJiYodGhpcy5uZWVkc1VwZGF0ZT0hMCl9fSk7RGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0RlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EZTtEZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZT0hMDtDZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShsLnByb3RvdHlwZSk7Q2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPUNmO0NmLnByb3RvdHlwZS5pc0NhbnZhc1RleHR1cmU9ITA7RGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EZjtEZi5wcm90b3R5cGUuaXNEZXB0aFRleHR1cmU9ITA7RWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtFZS5wcm90b3R5cGUuY29uc3RydWN0b3I9RWU7RWYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtFZi5wcm90b3R5cGUuY29uc3RydWN0b3I9RWY7RmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTsKRmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZlO0ZmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7RmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZmO2pjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7amMucHJvdG90eXBlLmNvbnN0cnVjdG9yPWpjO0dmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7R2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdmO0dlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGpjLnByb3RvdHlwZSk7R2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdlO0hmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7SGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUhmO1JkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGpjLnByb3RvdHlwZSk7UmQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJkO0lmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7SWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpJZjtIZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShqYy5wcm90b3R5cGUpO0hlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1IZTtKZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO0pmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1KZjtJZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShqYy5wcm90b3R5cGUpO0llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1JZTtLZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO0tmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1LZjtTZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1NkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TZDtTZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9dmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EucGF0aD10aGlzLnBhcmFtZXRlcnMucGF0aC50b0pTT04oKTtyZXR1cm4gYX07TGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTsKTGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxmO0plLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7SmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPUplO01mLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7TWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPU1mO0tlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7S2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPUtlO3ZhciBKbT17dHJpYW5ndWxhdGU6ZnVuY3Rpb24oYSxjLGUpe2U9ZXx8Mjt2YXIgZz1jJiZjLmxlbmd0aCxyPWc/Y1swXSplOmEubGVuZ3RoLHY9R2ooYSwwLHIsZSwhMCksej1bXTtpZighdnx8di5uZXh0PT09di5wcmV2KXJldHVybiB6O2cmJih2PWRtKGEsYyx2LGUpKTtpZihhLmxlbmd0aD44MCplKXt2YXIgRT1jPWFbMF07dmFyIEY9Zz1hWzFdO2Zvcih2YXIgSj1lO0o8cjtKKz1lKXt2YXIgUD1hW0pdO3ZhciBSPWFbSisxXTtQPEUmJihFPVApO1I8RiYmKEY9Uik7ClA+YyYmKGM9UCk7Uj5nJiYoZz1SKX1QPU1hdGgubWF4KGMtRSxnLUYpO1A9MCE9PVA/MS9QOjB9UGYodix6LGUsRSxGLFApO3JldHVybiB6fX0sZWQ9e2FyZWE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWEubGVuZ3RoLGU9MCxnPWMtMSxyPTA7cjxjO2c9cisrKWUrPWFbZ10ueCphW3JdLnktYVtyXS54KmFbZ10ueTtyZXR1cm4uNSplfSxpc0Nsb2NrV2lzZTpmdW5jdGlvbihhKXtyZXR1cm4gMD5lZC5hcmVhKGEpfSx0cmlhbmd1bGF0ZVNoYXBlOmZ1bmN0aW9uKGEsYyl7dmFyIGU9W10sZz1bXSxyPVtdO0tqKGEpO0xqKGUsYSk7dmFyIHY9YS5sZW5ndGg7Yy5mb3JFYWNoKEtqKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKWcucHVzaCh2KSx2Kz1jW2FdLmxlbmd0aCxMaihlLGNbYV0pO2M9Sm0udHJpYW5ndWxhdGUoZSxnKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSs9MylyLnB1c2goYy5zbGljZShhLGErMykpO3JldHVybiByfX07VWQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTsKVWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVVkO1VkLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT15YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIE1qKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnMsYSl9O1JjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7UmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJjO1JjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT12YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIE1qKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnMsYSl9O3ZhciBsbT17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihhLGMsZSxnLHIpe2E9Y1szKmddO2c9Y1szKmcrMV07dmFyIHY9Y1szKnJdO3I9Y1szKnIrMV07cmV0dXJuW25ldyBmKGNbMyplXSxjWzMqZSsxXSksbmV3IGYoYSxnKSxuZXcgZih2LHIpXX0sZ2VuZXJhdGVTaWRlV2FsbFVWOmZ1bmN0aW9uKGEsCmMsZSxnLHIsdil7YT1jWzMqZV07dmFyIHo9Y1szKmUrMV07ZT1jWzMqZSsyXTt2YXIgRT1jWzMqZ10sRj1jWzMqZysxXTtnPWNbMypnKzJdO3ZhciBKPWNbMypyXSxQPWNbMypyKzFdO3I9Y1szKnIrMl07dmFyIFI9Y1szKnZdLFM9Y1szKnYrMV07Yz1jWzMqdisyXTtyZXR1cm4uMDE+TWF0aC5hYnMoei1GKT9bbmV3IGYoYSwxLWUpLG5ldyBmKEUsMS1nKSxuZXcgZihKLDEtciksbmV3IGYoUiwxLWMpXTpbbmV3IGYoeiwxLWUpLG5ldyBmKEYsMS1nKSxuZXcgZihQLDEtciksbmV3IGYoUywxLWMpXX19O1JmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7UmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJmO01lLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFJjLnByb3RvdHlwZSk7TWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPU1lO1NmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7U2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNmO0JkLnByb3RvdHlwZT0KT2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO0JkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1CZDtUZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UZjtOZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO05lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1OZTtVZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1VmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VZjtPZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO09lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1PZTtWZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1ZkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1WZDtWZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9eWEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBOaih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLAphKX07V2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtXZC5wcm90b3R5cGUuY29uc3RydWN0b3I9V2Q7V2QucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPXZhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtyZXR1cm4gTmoodGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxhKX07UGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtQZS5wcm90b3R5cGUuY29uc3RydWN0b3I9UGU7WGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtYZC5wcm90b3R5cGUuY29uc3RydWN0b3I9WGQ7ZmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtmZC5wcm90b3R5cGUuY29uc3RydWN0b3I9ZmQ7VmYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWGQucHJvdG90eXBlKTtWZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VmY7V2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZmQucHJvdG90eXBlKTtXZi5wcm90b3R5cGUuY29uc3RydWN0b3I9CldmO1hmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7WGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhmO1FlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7UWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVFlO3ZhciBnYz1PYmplY3QuZnJlZXplKHtXaXJlZnJhbWVHZW9tZXRyeTpFZSxQYXJhbWV0cmljR2VvbWV0cnk6RWYsUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5OkZlLFRldHJhaGVkcm9uR2VvbWV0cnk6R2YsVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTpHZSxPY3RhaGVkcm9uR2VvbWV0cnk6SGYsT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5OlJkLEljb3NhaGVkcm9uR2VvbWV0cnk6SWYsSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTpIZSxEb2RlY2FoZWRyb25HZW9tZXRyeTpKZixEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTpJZSxQb2x5aGVkcm9uR2VvbWV0cnk6RmYsUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OmpjLFR1YmVHZW9tZXRyeTpLZiwKVHViZUJ1ZmZlckdlb21ldHJ5OlNkLFRvcnVzS25vdEdlb21ldHJ5OkxmLFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5OkplLFRvcnVzR2VvbWV0cnk6TWYsVG9ydXNCdWZmZXJHZW9tZXRyeTpLZSxUZXh0R2VvbWV0cnk6UmYsVGV4dEJ1ZmZlckdlb21ldHJ5Ok1lLFNwaGVyZUdlb21ldHJ5OlNmLFNwaGVyZUJ1ZmZlckdlb21ldHJ5OkJkLFJpbmdHZW9tZXRyeTpUZixSaW5nQnVmZmVyR2VvbWV0cnk6TmUsUGxhbmVHZW9tZXRyeTpyZCxQbGFuZUJ1ZmZlckdlb21ldHJ5OkxjLExhdGhlR2VvbWV0cnk6VWYsTGF0aGVCdWZmZXJHZW9tZXRyeTpPZSxTaGFwZUdlb21ldHJ5OlZkLFNoYXBlQnVmZmVyR2VvbWV0cnk6V2QsRXh0cnVkZUdlb21ldHJ5OlVkLEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTpSYyxFZGdlc0dlb21ldHJ5OlBlLENvbmVHZW9tZXRyeTpWZixDb25lQnVmZmVyR2VvbWV0cnk6V2YsQ3lsaW5kZXJHZW9tZXRyeTpYZCxDeWxpbmRlckJ1ZmZlckdlb21ldHJ5OmZkLENpcmNsZUdlb21ldHJ5OlhmLApDaXJjbGVCdWZmZXJHZW9tZXRyeTpRZSxCb3hHZW9tZXRyeTpTYSxCb3hCdWZmZXJHZW9tZXRyeTpYYX0pO1lkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtZZC5wcm90b3R5cGUuY29uc3RydWN0b3I9WWQ7WWQucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWw9ITA7WWQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3JldHVybiB0aGlzfTtSZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShxYi5wcm90b3R5cGUpO1JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SZTtSZS5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbD0hMDtTYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7U2MucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNjO1NjLnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPSEwO1NjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphKTt0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5yb3VnaG5lc3M9YS5yb3VnaG5lc3M7dGhpcy5tZXRhbG5lc3M9YS5tZXRhbG5lc3M7dGhpcy5tYXA9YS5tYXA7dGhpcy5saWdodE1hcD1hLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9YS5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWEuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShhLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWEuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT1hLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7CnRoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMucm91Z2huZXNzTWFwPWEucm91Z2huZXNzTWFwO3RoaXMubWV0YWxuZXNzTWFwPWEubWV0YWxuZXNzTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD1hLmVudk1hcDt0aGlzLmVudk1hcEludGVuc2l0eT1hLmVudk1hcEludGVuc2l0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1hLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9CmEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTtaZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTYy5wcm90b3R5cGUpO1pkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aZDtaZC5wcm90b3R5cGUuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD0hMDtaZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn07dGhpcy5yZWZsZWN0aXZpdHk9YS5yZWZsZWN0aXZpdHk7dGhpcy5jbGVhcmNvYXQ9YS5jbGVhcmNvYXQ7dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9YS5jbGVhcmNvYXRSb3VnaG5lc3M7dGhpcy5zaGVlbj1hLnNoZWVuPyh0aGlzLnNoZWVufHxuZXcgSSkuY29weShhLnNoZWVuKTpudWxsO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPWEuY2xlYXJjb2F0Tm9ybWFsTWFwO3RoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUuY29weShhLmNsZWFyY29hdE5vcm1hbFNjYWxlKTsKdGhpcy50cmFuc3BhcmVuY3k9YS50cmFuc3BhcmVuY3k7cmV0dXJuIHRoaXN9O0JjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtCYy5wcm90b3R5cGUuY29uc3RydWN0b3I9QmM7QmMucHJvdG90eXBlLmlzTWVzaFBob25nTWF0ZXJpYWw9ITA7QmMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMuc3BlY3VsYXIuY29weShhLnNwZWN1bGFyKTt0aGlzLnNoaW5pbmVzcz1hLnNoaW5pbmVzczt0aGlzLm1hcD1hLm1hcDt0aGlzLmxpZ2h0TWFwPWEubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9YS5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHk7dGhpcy5lbWlzc2l2ZS5jb3B5KGEuZW1pc3NpdmUpO3RoaXMuZW1pc3NpdmVNYXA9YS5lbWlzc2l2ZU1hcDt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PQphLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy5zcGVjdWxhck1hcD1hLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD1hLmVudk1hcDt0aGlzLmNvbWJpbmU9YS5jb21iaW5lO3RoaXMucmVmbGVjdGl2aXR5PWEucmVmbGVjdGl2aXR5O3RoaXMucmVmcmFjdGlvblJhdGlvPWEucmVmcmFjdGlvblJhdGlvO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPQphLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9OyRkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEJjLnByb3RvdHlwZSk7JGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRkOyRkLnByb3RvdHlwZS5pc01lc2hUb29uTWF0ZXJpYWw9ITA7JGQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7QmMucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZ3JhZGllbnRNYXA9YS5ncmFkaWVudE1hcDtyZXR1cm4gdGhpc307YWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO2FlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hZTthZS5wcm90b3R5cGUuaXNNZXNoTm9ybWFsTWF0ZXJpYWw9CiEwO2FlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTsKYmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO2JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iZTtiZS5wcm90b3R5cGUuaXNNZXNoTGFtYmVydE1hdGVyaWFsPSEwO2JlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hcD1hLm1hcDt0aGlzLmxpZ2h0TWFwPWEubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9YS5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHk7dGhpcy5lbWlzc2l2ZS5jb3B5KGEuZW1pc3NpdmUpO3RoaXMuZW1pc3NpdmVNYXA9YS5lbWlzc2l2ZU1hcDt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PWEuZW1pc3NpdmVJbnRlbnNpdHk7dGhpcy5zcGVjdWxhck1hcD1hLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD0KYS5lbnZNYXA7dGhpcy5jb21iaW5lPWEuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1hLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9O2NlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtjZS5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2U7Y2UucHJvdG90eXBlLmlzTWVzaE1hdGNhcE1hdGVyaWFsPSEwO2NlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphKTt0aGlzLmRlZmluZXM9e01BVENBUDoiIn07dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubWF0Y2FwPWEubWF0Y2FwO3RoaXMubWFwPWEubWFwO3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy5hbHBoYU1hcD1hLmFscGhhTWFwO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307ZGUucHJvdG90eXBlPQpPYmplY3QuY3JlYXRlKEZiLnByb3RvdHlwZSk7ZGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRlO2RlLnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbD0hMDtkZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtGYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5zY2FsZT1hLnNjYWxlO3RoaXMuZGFzaFNpemU9YS5kYXNoU2l6ZTt0aGlzLmdhcFNpemU9YS5nYXBTaXplO3JldHVybiB0aGlzfTt2YXIgS209T2JqZWN0LmZyZWV6ZSh7U2hhZG93TWF0ZXJpYWw6WWQsU3ByaXRlTWF0ZXJpYWw6QWQsUmF3U2hhZGVyTWF0ZXJpYWw6UmUsU2hhZGVyTWF0ZXJpYWw6cWIsUG9pbnRzTWF0ZXJpYWw6QWMsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6WmQsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6U2MsTWVzaFBob25nTWF0ZXJpYWw6QmMsTWVzaFRvb25NYXRlcmlhbDokZCxNZXNoTm9ybWFsTWF0ZXJpYWw6YWUsTWVzaExhbWJlcnRNYXRlcmlhbDpiZSxNZXNoRGVwdGhNYXRlcmlhbDp2ZCwKTWVzaERpc3RhbmNlTWF0ZXJpYWw6d2QsTWVzaEJhc2ljTWF0ZXJpYWw6TCxNZXNoTWF0Y2FwTWF0ZXJpYWw6Y2UsTGluZURhc2hlZE1hdGVyaWFsOmRlLExpbmVCYXNpY01hdGVyaWFsOkZiLE1hdGVyaWFsOk19KSxUYj17YXJyYXlTbGljZTpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIFRiLmlzVHlwZWRBcnJheShhKT9uZXcgYS5jb25zdHJ1Y3RvcihhLnN1YmFycmF5KGMsdm9pZCAwIT09ZT9lOmEubGVuZ3RoKSk6YS5zbGljZShjLGUpfSxjb252ZXJ0QXJyYXk6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiFhfHwhZSYmYS5jb25zdHJ1Y3Rvcj09PWM/YToibnVtYmVyIj09PXR5cGVvZiBjLkJZVEVTX1BFUl9FTEVNRU5UP25ldyBjKGEpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpfSxpc1R5cGVkQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhKSYmIShhIGluc3RhbmNlb2YgRGF0YVZpZXcpfSxnZXRLZXlmcmFtZU9yZGVyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0KYS5sZW5ndGgsZT1BcnJheShjKSxnPTA7ZyE9PWM7KytnKWVbZ109ZztlLnNvcnQoZnVuY3Rpb24ocix2KXtyZXR1cm4gYVtyXS1hW3ZdfSk7cmV0dXJuIGV9LHNvcnRlZEFycmF5OmZ1bmN0aW9uKGEsYyxlKXtmb3IodmFyIGc9YS5sZW5ndGgscj1uZXcgYS5jb25zdHJ1Y3RvcihnKSx2PTAsej0wO3ohPT1nOysrdilmb3IodmFyIEU9ZVt2XSpjLEY9MDtGIT09YzsrK0Ypclt6KytdPWFbRStGXTtyZXR1cm4gcn0sZmxhdHRlbkpTT046ZnVuY3Rpb24oYSxjLGUsZyl7Zm9yKHZhciByPTEsdj1hWzBdO3ZvaWQgMCE9PXYmJnZvaWQgMD09PXZbZ107KXY9YVtyKytdO2lmKHZvaWQgMCE9PXYpe3ZhciB6PXZbZ107aWYodm9pZCAwIT09eilpZihBcnJheS5pc0FycmF5KHopKXtkbyB6PXZbZ10sdm9pZCAwIT09eiYmKGMucHVzaCh2LnRpbWUpLGUucHVzaC5hcHBseShlLHopKSx2PWFbcisrXTt3aGlsZSh2b2lkIDAhPT12KX1lbHNlIGlmKHZvaWQgMCE9PXoudG9BcnJheSl7ZG8gej12W2ddLAp2b2lkIDAhPT16JiYoYy5wdXNoKHYudGltZSksei50b0FycmF5KGUsZS5sZW5ndGgpKSx2PWFbcisrXTt3aGlsZSh2b2lkIDAhPT12KX1lbHNle2RvIHo9dltnXSx2b2lkIDAhPT16JiYoYy5wdXNoKHYudGltZSksZS5wdXNoKHopKSx2PWFbcisrXTt3aGlsZSh2b2lkIDAhPT12KX19fX07T2JqZWN0LmFzc2lnbihvYy5wcm90b3R5cGUse2V2YWx1YXRlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zLGU9dGhpcy5fY2FjaGVkSW5kZXgsZz1jW2VdLHI9Y1tlLTFdO2E6e2I6e2M6e2Q6aWYoIShhPGcpKXtmb3IodmFyIHY9ZSsyOzspe2lmKHZvaWQgMD09PWcpe2lmKGE8cilicmVhayBkO3RoaXMuX2NhY2hlZEluZGV4PWU9Yy5sZW5ndGg7cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKGUtMSxhLHIpfWlmKGU9PT12KWJyZWFrO3I9ZztnPWNbKytlXTtpZihhPGcpYnJlYWsgYn1nPWMubGVuZ3RoO2JyZWFrIGN9aWYoYT49cilicmVhayBhO2Vsc2V7dj1jWzFdO2E8diYmCihlPTIscj12KTtmb3Iodj1lLTI7Oyl7aWYodm9pZCAwPT09cilyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmJlZm9yZVN0YXJ0XygwLGEsZyk7aWYoZT09PXYpYnJlYWs7Zz1yO3I9Y1stLWUtMV07aWYoYT49cilicmVhayBifWc9ZTtlPTB9fWZvcig7ZTxnOylyPWUrZz4+PjEsYTxjW3JdP2c9cjplPXIrMTtnPWNbZV07cj1jW2UtMV07aWYodm9pZCAwPT09cilyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmJlZm9yZVN0YXJ0XygwLGEsZyk7aWYodm9pZCAwPT09ZylyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9ZT1jLmxlbmd0aCx0aGlzLmFmdGVyRW5kXyhlLTEscixhKX10aGlzLl9jYWNoZWRJbmRleD1lO3RoaXMuaW50ZXJ2YWxDaGFuZ2VkXyhlLHIsZyl9cmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKGUscixhLGcpfSxzZXR0aW5nczpudWxsLERlZmF1bHRTZXR0aW5nc186e30sZ2V0U2V0dGluZ3NfOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0dGluZ3N8fAp0aGlzLkRlZmF1bHRTZXR0aW5nc199LGNvcHlTYW1wbGVWYWx1ZV86ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5yZXN1bHRCdWZmZXIsZT10aGlzLnNhbXBsZVZhbHVlcyxnPXRoaXMudmFsdWVTaXplO2EqPWc7Zm9yKHZhciByPTA7ciE9PWc7KytyKWNbcl09ZVthK3JdO3JldHVybiBjfSxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiY2FsbCB0byBhYnN0cmFjdCBtZXRob2QiKTt9LGludGVydmFsQ2hhbmdlZF86ZnVuY3Rpb24oKXt9fSk7T2JqZWN0LmFzc2lnbihvYy5wcm90b3R5cGUse2JlZm9yZVN0YXJ0XzpvYy5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxhZnRlckVuZF86b2MucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV99KTtFZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkVnLERlZmF1bHRTZXR0aW5nc186e2VuZGluZ1N0YXJ0OjI0MDAsZW5kaW5nRW5kOjI0MDB9LGludGVydmFsQ2hhbmdlZF86ZnVuY3Rpb24oYSwKYyxlKXt2YXIgZz10aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxyPWEtMix2PWErMSx6PWdbcl0sRT1nW3ZdO2lmKHZvaWQgMD09PXopc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQpe2Nhc2UgMjQwMTpyPWE7ej0yKmMtZTticmVhaztjYXNlIDI0MDI6cj1nLmxlbmd0aC0yO3o9YytnW3JdLWdbcisxXTticmVhaztkZWZhdWx0OnI9YSx6PWV9aWYodm9pZCAwPT09RSlzd2l0Y2godGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQpe2Nhc2UgMjQwMTp2PWE7RT0yKmUtYzticmVhaztjYXNlIDI0MDI6dj0xO0U9ZStnWzFdLWdbMF07YnJlYWs7ZGVmYXVsdDp2PWEtMSxFPWN9YT0uNSooZS1jKTtnPXRoaXMudmFsdWVTaXplO3RoaXMuX3dlaWdodFByZXY9YS8oYy16KTt0aGlzLl93ZWlnaHROZXh0PWEvKEUtZSk7dGhpcy5fb2Zmc2V0UHJldj1yKmc7dGhpcy5fb2Zmc2V0TmV4dD12Kmd9LGludGVycG9sYXRlXzpmdW5jdGlvbihhLGMsZSxnKXt2YXIgcj10aGlzLnJlc3VsdEJ1ZmZlciwKdj10aGlzLnNhbXBsZVZhbHVlcyx6PXRoaXMudmFsdWVTaXplO2EqPXo7dmFyIEU9YS16LEY9dGhpcy5fb2Zmc2V0UHJldixKPXRoaXMuX29mZnNldE5leHQsUD10aGlzLl93ZWlnaHRQcmV2LFI9dGhpcy5fd2VpZ2h0TmV4dCxTPShlLWMpLyhnLWMpO2U9UypTO2c9ZSpTO2M9LVAqZysyKlAqZS1QKlM7UD0oMStQKSpnKygtMS41LTIqUCkqZSsoLS41K1ApKlMrMTtTPSgtMS1SKSpnKygxLjUrUikqZSsuNSpTO1I9UipnLVIqZTtmb3IoZT0wO2UhPT16OysrZSlyW2VdPWMqdltGK2VdK1AqdltFK2VdK1MqdlthK2VdK1IqdltKK2VdO3JldHVybiByfX0pO1lmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUob2MucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WWYsaW50ZXJwb2xhdGVfOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMucmVzdWx0QnVmZmVyLHY9dGhpcy5zYW1wbGVWYWx1ZXMsej10aGlzLnZhbHVlU2l6ZTthKj16O3ZhciBFPWEtejtjPShlLWMpLyhnLQpjKTtlPTEtYztmb3IoZz0wO2chPT16OysrZylyW2ddPXZbRStnXSplK3ZbYStnXSpjO3JldHVybiByfX0pO0ZnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUob2MucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6RmcsaW50ZXJwb2xhdGVfOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oYS0xKX19KTtPYmplY3QuYXNzaWduKFhiLHt0b0pTT046ZnVuY3Rpb24oYSl7dmFyIGM9YS5jb25zdHJ1Y3RvcjtpZih2b2lkIDAhPT1jLnRvSlNPTiljPWMudG9KU09OKGEpO2Vsc2V7Yz17bmFtZTphLm5hbWUsdGltZXM6VGIuY29udmVydEFycmF5KGEudGltZXMsQXJyYXkpLHZhbHVlczpUYi5jb252ZXJ0QXJyYXkoYS52YWx1ZXMsQXJyYXkpfTt2YXIgZT1hLmdldEludGVycG9sYXRpb24oKTtlIT09YS5EZWZhdWx0SW50ZXJwb2xhdGlvbiYmKGMuaW50ZXJwb2xhdGlvbj1lKX1jLnR5cGU9YS5WYWx1ZVR5cGVOYW1lO3JldHVybiBjfX0pO09iamVjdC5hc3NpZ24oWGIucHJvdG90eXBlLAp7Y29uc3RydWN0b3I6WGIsVGltZUJ1ZmZlclR5cGU6RmxvYXQzMkFycmF5LFZhbHVlQnVmZmVyVHlwZTpGbG9hdDMyQXJyYXksRGVmYXVsdEludGVycG9sYXRpb246MjMwMSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEZnKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxhKX0sSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgWWYodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGEpfSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBFZyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYSl9LHNldEludGVycG9sYXRpb246ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgMjMwMDp2YXIgYz10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOwpicmVhaztjYXNlIDIzMDE6Yz10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjticmVhaztjYXNlIDIzMDI6Yz10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aH1pZih2b2lkIDA9PT1jKXtjPSJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiK3RoaXMuVmFsdWVUeXBlTmFtZSsiIGtleWZyYW1lIHRyYWNrIG5hbWVkICIrdGhpcy5uYW1lO2lmKHZvaWQgMD09PXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpaWYoYSE9PXRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pdGhpcy5zZXRJbnRlcnBvbGF0aW9uKHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pO2Vsc2UgdGhyb3cgRXJyb3IoYyk7Y29uc29sZS53YXJuKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiIsYyk7cmV0dXJuIHRoaXN9dGhpcy5jcmVhdGVJbnRlcnBvbGFudD1jO3JldHVybiB0aGlzfSxnZXRJbnRlcnBvbGF0aW9uOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpe2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpyZXR1cm4gMjMwMDsKY2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpyZXR1cm4gMjMwMTtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnJldHVybiAyMzAyfX0sZ2V0VmFsdWVTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aC90aGlzLnRpbWVzLmxlbmd0aH0sc2hpZnQ6ZnVuY3Rpb24oYSl7aWYoMCE9PWEpZm9yKHZhciBjPXRoaXMudGltZXMsZT0wLGc9Yy5sZW5ndGg7ZSE9PWc7KytlKWNbZV0rPWE7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEpe2lmKDEhPT1hKWZvcih2YXIgYz10aGlzLnRpbWVzLGU9MCxnPWMubGVuZ3RoO2UhPT1nOysrZSljW2VdKj1hO3JldHVybiB0aGlzfSx0cmltOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPXRoaXMudGltZXMsZz1lLmxlbmd0aCxyPTAsdj1nLTE7ciE9PWcmJmVbcl08YTspKytyO2Zvcig7LTEhPT12JiZlW3ZdPmM7KS0tdjsrK3Y7aWYoMCE9PXJ8fHYhPT1nKXI+PXYmJih2PU1hdGgubWF4KHYsCjEpLHI9di0xKSxhPXRoaXMuZ2V0VmFsdWVTaXplKCksdGhpcy50aW1lcz1UYi5hcnJheVNsaWNlKGUscix2KSx0aGlzLnZhbHVlcz1UYi5hcnJheVNsaWNlKHRoaXMudmFsdWVzLHIqYSx2KmEpO3JldHVybiB0aGlzfSx2YWxpZGF0ZTpmdW5jdGlvbigpe3ZhciBhPSEwLGM9dGhpcy5nZXRWYWx1ZVNpemUoKTswIT09Yy1NYXRoLmZsb29yKGMpJiYoY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogSW52YWxpZCB2YWx1ZSBzaXplIGluIHRyYWNrLiIsdGhpcyksYT0hMSk7dmFyIGU9dGhpcy50aW1lcztjPXRoaXMudmFsdWVzO3ZhciBnPWUubGVuZ3RoOzA9PT1nJiYoY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuIix0aGlzKSxhPSExKTtmb3IodmFyIHI9bnVsbCx2PTA7diE9PWc7disrKXt2YXIgej1lW3ZdO2lmKCJudW1iZXIiPT09dHlwZW9mIHomJmlzTmFOKHopKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUaW1lIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLAp0aGlzLHYseik7YT0hMTticmVha31pZihudWxsIT09ciYmcj56KXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4iLHRoaXMsdix6LHIpO2E9ITE7YnJlYWt9cj16fWlmKHZvaWQgMCE9PWMmJlRiLmlzVHlwZWRBcnJheShjKSlmb3Iodj0wLGU9Yy5sZW5ndGg7diE9PWU7Kyt2KWlmKGc9Y1t2XSxpc05hTihnKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyx2LGcpO2E9ITE7YnJlYWt9cmV0dXJuIGF9LG9wdGltaXplOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudGltZXMsYz10aGlzLnZhbHVlcyxlPXRoaXMuZ2V0VmFsdWVTaXplKCksZz0yMzAyPT09dGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkscj0xLHY9YS5sZW5ndGgtMSx6PTE7ejx2Oysreil7dmFyIEU9ITEsRj1hW3pdO2lmKEYhPT1hW3orMV0mJigxIT09enx8RiE9PUZbMF0pKWlmKGcpRT0hMDsKZWxzZXt2YXIgSj16KmUsUD1KLWUsUj1KK2U7Zm9yKEY9MDtGIT09ZTsrK0Ype3ZhciBTPWNbSitGXTtpZihTIT09Y1tQK0ZdfHxTIT09Y1tSK0ZdKXtFPSEwO2JyZWFrfX19aWYoRSl7aWYoeiE9PXIpZm9yKGFbcl09YVt6XSxFPXoqZSxKPXIqZSxGPTA7RiE9PWU7KytGKWNbSitGXT1jW0UrRl07KytyfX1pZigwPHYpe2Fbcl09YVt2XTtFPXYqZTtKPXIqZTtmb3IoRj0wO0YhPT1lOysrRiljW0orRl09Y1tFK0ZdOysrcn1yIT09YS5sZW5ndGgmJih0aGlzLnRpbWVzPVRiLmFycmF5U2xpY2UoYSwwLHIpLHRoaXMudmFsdWVzPVRiLmFycmF5U2xpY2UoYywwLHIqZSkpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBhPVRiLmFycmF5U2xpY2UodGhpcy50aW1lcywwKSxjPVRiLmFycmF5U2xpY2UodGhpcy52YWx1ZXMsMCk7YT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLm5hbWUsYSxjKTthLmNyZWF0ZUludGVycG9sYW50PXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ7cmV0dXJuIGF9fSk7CkdnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6R2csVmFsdWVUeXBlTmFtZToiYm9vbCIsVmFsdWVCdWZmZXJUeXBlOkFycmF5LERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOnZvaWQgMCxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6dm9pZCAwfSk7SGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShYYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpIZyxWYWx1ZVR5cGVOYW1lOiJjb2xvciJ9KTtTZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlNlLFZhbHVlVHlwZU5hbWU6Im51bWJlciJ9KTtJZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOklnLGludGVycG9sYXRlXzpmdW5jdGlvbihhLApjLGUsZyl7dmFyIHI9dGhpcy5yZXN1bHRCdWZmZXIsdj10aGlzLnNhbXBsZVZhbHVlcyx6PXRoaXMudmFsdWVTaXplO2EqPXo7Yz0oZS1jKS8oZy1jKTtmb3IoZT1hK3o7YSE9PWU7YSs9NCloLnNsZXJwRmxhdChyLDAsdixhLXosdixhLGMpO3JldHVybiByfX0pO1pmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WmYsVmFsdWVUeXBlTmFtZToicXVhdGVybmlvbiIsRGVmYXVsdEludGVycG9sYXRpb246MjMwMSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBJZyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYSl9LEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDp2b2lkIDB9KTtKZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkpnLFZhbHVlVHlwZU5hbWU6InN0cmluZyIsClZhbHVlQnVmZmVyVHlwZTpBcnJheSxEZWZhdWx0SW50ZXJwb2xhdGlvbjoyMzAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjp2b2lkIDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnZvaWQgMH0pO1RlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VGUsVmFsdWVUeXBlTmFtZToidmVjdG9yIn0pO09iamVjdC5hc3NpZ24odGMse3BhcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPWEudHJhY2tzLGc9MS8oYS5mcHN8fDEpLHI9MCx2PWUubGVuZ3RoO3IhPT12OysrciljLnB1c2gobm0oZVtyXSkuc2NhbGUoZykpO3JldHVybiBuZXcgdGMoYS5uYW1lLGEuZHVyYXRpb24sYyl9LHRvSlNPTjpmdW5jdGlvbihhKXt2YXIgYz1bXSxlPWEudHJhY2tzO2E9e25hbWU6YS5uYW1lLGR1cmF0aW9uOmEuZHVyYXRpb24sdHJhY2tzOmMsdXVpZDphLnV1aWR9O2Zvcih2YXIgZz0wLHI9ZS5sZW5ndGg7ZyE9PQpyOysrZyljLnB1c2goWGIudG9KU09OKGVbZ10pKTtyZXR1cm4gYX0sQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2U6ZnVuY3Rpb24oYSxjLGUsZyl7Zm9yKHZhciByPWMubGVuZ3RoLHY9W10sej0wO3o8cjt6Kyspe3ZhciBFPVtdLEY9W107RS5wdXNoKCh6K3ItMSklcix6LCh6KzEpJXIpO0YucHVzaCgwLDEsMCk7dmFyIEo9VGIuZ2V0S2V5ZnJhbWVPcmRlcihFKTtFPVRiLnNvcnRlZEFycmF5KEUsMSxKKTtGPVRiLnNvcnRlZEFycmF5KEYsMSxKKTtnfHwwIT09RVswXXx8KEUucHVzaChyKSxGLnB1c2goRlswXSkpO3YucHVzaCgobmV3IFNlKCIubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyIrY1t6XS5uYW1lKyJdIixFLEYpKS5zY2FsZSgxL2UpKX1yZXR1cm4gbmV3IHRjKGEsLTEsdil9LGZpbmRCeU5hbWU6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hO0FycmF5LmlzQXJyYXkoYSl8fChlPWEuZ2VvbWV0cnkmJmEuZ2VvbWV0cnkuYW5pbWF0aW9uc3x8YS5hbmltYXRpb25zKTtmb3IoYT0KMDthPGUubGVuZ3RoO2ErKylpZihlW2FdLm5hbWU9PT1jKXJldHVybiBlW2FdO3JldHVybiBudWxsfSxDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlczpmdW5jdGlvbihhLGMsZSl7Zm9yKHZhciBnPXt9LHI9L14oW1x3LV0qPykoW1xkXSspJC8sdj0wLHo9YS5sZW5ndGg7djx6O3YrKyl7dmFyIEU9YVt2XSxGPUUubmFtZS5tYXRjaChyKTtpZihGJiYxPEYubGVuZ3RoKXt2YXIgSj1GWzFdOyhGPWdbSl0pfHwoZ1tKXT1GPVtdKTtGLnB1c2goRSl9fWE9W107Zm9yKEogaW4gZylhLnB1c2godGMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoSixnW0pdLGMsZSkpO3JldHVybiBhfSxwYXJzZUFuaW1hdGlvbjpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoaGEsZmEscmEscGEscWEpe2lmKDAhPT1yYS5sZW5ndGgpe3ZhciB1YT1bXSxvYT1bXTtUYi5mbGF0dGVuSlNPTihyYSx1YSxvYSxwYSk7MCE9PXVhLmxlbmd0aCYmcWEucHVzaChuZXcgaGEoZmEsdWEsb2EpKX19CmlmKCFhKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLiIpLG51bGw7dmFyIGc9W10scj1hLm5hbWV8fCJkZWZhdWx0Iix2PWEubGVuZ3RofHwtMSx6PWEuZnBzfHwzMDthPWEuaGllcmFyY2h5fHxbXTtmb3IodmFyIEU9MDtFPGEubGVuZ3RoO0UrKyl7dmFyIEY9YVtFXS5rZXlzO2lmKEYmJjAhPT1GLmxlbmd0aClpZihGWzBdLm1vcnBoVGFyZ2V0cyl7dj17fTtmb3IodmFyIEo9MDtKPEYubGVuZ3RoO0orKylpZihGW0pdLm1vcnBoVGFyZ2V0cylmb3IodmFyIFA9MDtQPEZbSl0ubW9ycGhUYXJnZXRzLmxlbmd0aDtQKyspdltGW0pdLm1vcnBoVGFyZ2V0c1tQXV09LTE7Zm9yKHZhciBSIGluIHYpe3ZhciBTPVtdLFY9W107Zm9yKFA9MDtQIT09RltKXS5tb3JwaFRhcmdldHMubGVuZ3RoOysrUCl7dmFyIFc9RltKXTtTLnB1c2goVy50aW1lKTtWLnB1c2goVy5tb3JwaFRhcmdldD09PVI/MTowKX1nLnB1c2gobmV3IFNlKCIubW9ycGhUYXJnZXRJbmZsdWVuY2VbIisKUisiXSIsUyxWKSl9dj12Lmxlbmd0aCooenx8MSl9ZWxzZSBKPSIuYm9uZXNbIitjW0VdLm5hbWUrIl0iLGUoVGUsSisiLnBvc2l0aW9uIixGLCJwb3MiLGcpLGUoWmYsSisiLnF1YXRlcm5pb24iLEYsInJvdCIsZyksZShUZSxKKyIuc2NhbGUiLEYsInNjbCIsZyl9cmV0dXJuIDA9PT1nLmxlbmd0aD9udWxsOm5ldyB0YyhyLHYsZyl9fSk7T2JqZWN0LmFzc2lnbih0Yy5wcm90b3R5cGUse3Jlc2V0RHVyYXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxjPTAsZT10aGlzLnRyYWNrcy5sZW5ndGg7YyE9PWU7KytjKXt2YXIgZz10aGlzLnRyYWNrc1tjXTthPU1hdGgubWF4KGEsZy50aW1lc1tnLnRpbWVzLmxlbmd0aC0xXSl9dGhpcy5kdXJhdGlvbj1hO3JldHVybiB0aGlzfSx0cmltOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLnRyYWNrcy5sZW5ndGg7YSsrKXRoaXMudHJhY2tzW2FdLnRyaW0oMCx0aGlzLmR1cmF0aW9uKTtyZXR1cm4gdGhpc30sdmFsaWRhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiEwLGM9MDtjPHRoaXMudHJhY2tzLmxlbmd0aDtjKyspYT1hJiZ0aGlzLnRyYWNrc1tjXS52YWxpZGF0ZSgpO3JldHVybiBhfSxvcHRpbWl6ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy50cmFja3MubGVuZ3RoO2ErKyl0aGlzLnRyYWNrc1thXS5vcHRpbWl6ZSgpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxjPTA7Yzx0aGlzLnRyYWNrcy5sZW5ndGg7YysrKWEucHVzaCh0aGlzLnRyYWNrc1tjXS5jbG9uZSgpKTtyZXR1cm4gbmV3IHRjKHRoaXMubmFtZSx0aGlzLmR1cmF0aW9uLGEpfX0pO3ZhciBpZT17ZW5hYmxlZDohMSxmaWxlczp7fSxhZGQ6ZnVuY3Rpb24oYSxjKXshMSE9PXRoaXMuZW5hYmxlZCYmKHRoaXMuZmlsZXNbYV09Yyl9LGdldDpmdW5jdGlvbihhKXtpZighMSE9PXRoaXMuZW5hYmxlZClyZXR1cm4gdGhpcy5maWxlc1thXX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2RlbGV0ZSB0aGlzLmZpbGVzW2FdfSxjbGVhcjpmdW5jdGlvbigpe3RoaXMuZmlsZXM9Cnt9fX0sT2o9bmV3ICRoO09iamVjdC5hc3NpZ24oRGIucHJvdG90eXBlLHtsb2FkOmZ1bmN0aW9uKCl7fSxwYXJzZTpmdW5jdGlvbigpe30sc2V0Q3Jvc3NPcmlnaW46ZnVuY3Rpb24oYSl7dGhpcy5jcm9zc09yaWdpbj1hO3JldHVybiB0aGlzfSxzZXRQYXRoOmZ1bmN0aW9uKGEpe3RoaXMucGF0aD1hO3JldHVybiB0aGlzfSxzZXRSZXNvdXJjZVBhdGg6ZnVuY3Rpb24oYSl7dGhpcy5yZXNvdXJjZVBhdGg9YTtyZXR1cm4gdGhpc319KTtEYi5IYW5kbGVycz17aGFuZGxlcnM6W10sYWRkOmZ1bmN0aW9uKGEsYyl7dGhpcy5oYW5kbGVycy5wdXNoKGEsYyl9LGdldDpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5oYW5kbGVycyxlPTAsZz1jLmxlbmd0aDtlPGc7ZSs9Mil7dmFyIHI9Y1tlKzFdO2lmKGNbZV0udGVzdChhKSlyZXR1cm4gcn1yZXR1cm4gbnVsbH19O3ZhciBLYz17fTt1Yy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnVjLApsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZvaWQgMD09PWEmJihhPSIiKTt2b2lkIDAhPT10aGlzLnBhdGgmJihhPXRoaXMucGF0aCthKTthPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGEpO3ZhciByPXRoaXMsdj1pZS5nZXQoYSk7aWYodm9pZCAwIT09dilyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyYmYyh2KTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sMCksdjtpZih2b2lkIDAhPT1LY1thXSlLY1thXS5wdXNoKHtvbkxvYWQ6YyxvblByb2dyZXNzOmUsb25FcnJvcjpnfSk7ZWxzZXt2YXIgej1hLm1hdGNoKC9eZGF0YTooLio/KSg7YmFzZTY0KT8sKC4qKSQvKTtpZih6KXtlPXpbMV07dmFyIEU9ISF6WzJdO3o9elszXTt6PWRlY29kZVVSSUNvbXBvbmVudCh6KTtFJiYoej1hdG9iKHopKTt0cnl7dmFyIEY9KHRoaXMucmVzcG9uc2VUeXBlfHwiIikudG9Mb3dlckNhc2UoKTtzd2l0Y2goRil7Y2FzZSAiYXJyYXlidWZmZXIiOmNhc2UgImJsb2IiOnZhciBKPQpuZXcgVWludDhBcnJheSh6Lmxlbmd0aCk7Zm9yKEU9MDtFPHoubGVuZ3RoO0UrKylKW0VdPXouY2hhckNvZGVBdChFKTt2YXIgUD0iYmxvYiI9PT1GP25ldyBCbG9iKFtKLmJ1ZmZlcl0se3R5cGU6ZX0pOkouYnVmZmVyO2JyZWFrO2Nhc2UgImRvY3VtZW50IjpQPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoeixlKTticmVhaztjYXNlICJqc29uIjpQPUpTT04ucGFyc2Uoeik7YnJlYWs7ZGVmYXVsdDpQPXp9c2V0VGltZW91dChmdW5jdGlvbigpe2MmJmMoUCk7ci5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApfWNhdGNoKFMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtnJiZnKFMpO3IubWFuYWdlci5pdGVtRXJyb3IoYSk7ci5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApfX1lbHNle0tjW2FdPVtdO0tjW2FdLnB1c2goe29uTG9hZDpjLG9uUHJvZ3Jlc3M6ZSxvbkVycm9yOmd9KTt2YXIgUj1uZXcgWE1MSHR0cFJlcXVlc3Q7Ui5vcGVuKCJHRVQiLGEsITApO1IuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsCmZ1bmN0aW9uKFMpe3ZhciBWPXRoaXMucmVzcG9uc2U7aWUuYWRkKGEsVik7dmFyIFc9S2NbYV07ZGVsZXRlIEtjW2FdO2lmKDIwMD09PXRoaXMuc3RhdHVzfHwwPT09dGhpcy5zdGF0dXMpezA9PT10aGlzLnN0YXR1cyYmY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpO2Zvcih2YXIgaGE9MCxmYT1XLmxlbmd0aDtoYTxmYTtoYSsrKXt2YXIgcmE9V1toYV07aWYocmEub25Mb2FkKXJhLm9uTG9hZChWKX19ZWxzZXtoYT0wO2ZvcihmYT1XLmxlbmd0aDtoYTxmYTtoYSsrKWlmKHJhPVdbaGFdLHJhLm9uRXJyb3IpcmEub25FcnJvcihTKTtyLm1hbmFnZXIuaXRlbUVycm9yKGEpfXIubWFuYWdlci5pdGVtRW5kKGEpfSwhMSk7Ui5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZnVuY3Rpb24oUyl7Zm9yKHZhciBWPUtjW2FdLFc9MCxoYT1WLmxlbmd0aDtXPGhhO1crKyl7dmFyIGZhPVZbV107aWYoZmEub25Qcm9ncmVzcylmYS5vblByb2dyZXNzKFMpfX0sCiExKTtSLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihTKXt2YXIgVj1LY1thXTtkZWxldGUgS2NbYV07Zm9yKHZhciBXPTAsaGE9Vi5sZW5ndGg7VzxoYTtXKyspe3ZhciBmYT1WW1ddO2lmKGZhLm9uRXJyb3IpZmEub25FcnJvcihTKX1yLm1hbmFnZXIuaXRlbUVycm9yKGEpO3IubWFuYWdlci5pdGVtRW5kKGEpfSwhMSk7Ui5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsZnVuY3Rpb24oUyl7dmFyIFY9S2NbYV07ZGVsZXRlIEtjW2FdO2Zvcih2YXIgVz0wLGhhPVYubGVuZ3RoO1c8aGE7VysrKXt2YXIgZmE9VltXXTtpZihmYS5vbkVycm9yKWZhLm9uRXJyb3IoUyl9ci5tYW5hZ2VyLml0ZW1FcnJvcihhKTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sITEpO3ZvaWQgMCE9PXRoaXMucmVzcG9uc2VUeXBlJiYoUi5yZXNwb25zZVR5cGU9dGhpcy5yZXNwb25zZVR5cGUpO3ZvaWQgMCE9PXRoaXMud2l0aENyZWRlbnRpYWxzJiYoUi53aXRoQ3JlZGVudGlhbHM9dGhpcy53aXRoQ3JlZGVudGlhbHMpOwpSLm92ZXJyaWRlTWltZVR5cGUmJlIub3ZlcnJpZGVNaW1lVHlwZSh2b2lkIDAhPT10aGlzLm1pbWVUeXBlP3RoaXMubWltZVR5cGU6InRleHQvcGxhaW4iKTtmb3IoRSBpbiB0aGlzLnJlcXVlc3RIZWFkZXIpUi5zZXRSZXF1ZXN0SGVhZGVyKEUsdGhpcy5yZXF1ZXN0SGVhZGVyW0VdKTtSLnNlbmQobnVsbCl9ci5tYW5hZ2VyLml0ZW1TdGFydChhKTtyZXR1cm4gUn19LHNldFJlc3BvbnNlVHlwZTpmdW5jdGlvbihhKXt0aGlzLnJlc3BvbnNlVHlwZT1hO3JldHVybiB0aGlzfSxzZXRXaXRoQ3JlZGVudGlhbHM6ZnVuY3Rpb24oYSl7dGhpcy53aXRoQ3JlZGVudGlhbHM9YTtyZXR1cm4gdGhpc30sc2V0TWltZVR5cGU6ZnVuY3Rpb24oYSl7dGhpcy5taW1lVHlwZT1hO3JldHVybiB0aGlzfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEpe3RoaXMucmVxdWVzdEhlYWRlcj1hO3JldHVybiB0aGlzfX0pO2FpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOmFpLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcyx2PW5ldyB1YyhyLm1hbmFnZXIpO3Yuc2V0UGF0aChyLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope2Moci5wYXJzZShKU09OLnBhcnNlKHopKSl9LGUsZyl9LHBhcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBnPXRjLnBhcnNlKGFbZV0pO2MucHVzaChnKX1yZXR1cm4gY319KTtiaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmJpLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7ZnVuY3Rpb24gcihTKXtGLmxvYWQoYVtTXSxmdW5jdGlvbihWKXtWPXYuX3BhcnNlcihWLCEwKTt6W1NdPXt3aWR0aDpWLndpZHRoLGhlaWdodDpWLmhlaWdodCxmb3JtYXQ6Vi5mb3JtYXQsbWlwbWFwczpWLm1pcG1hcHN9O0orPTE7Nj09PUomJigxPT09Vi5taXBtYXBDb3VudCYmKEUubWluRmlsdGVyPQoxMDA2KSxFLmZvcm1hdD1WLmZvcm1hdCxFLm5lZWRzVXBkYXRlPSEwLGMmJmMoRSkpfSxlLGcpfXZhciB2PXRoaXMsej1bXSxFPW5ldyBEZTtFLmltYWdlPXo7dmFyIEY9bmV3IHVjKHRoaXMubWFuYWdlcik7Ri5zZXRQYXRoKHRoaXMucGF0aCk7Ri5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIEo9MCxQPTAsUj1hLmxlbmd0aDtQPFI7KytQKXIoUCk7ZWxzZSBGLmxvYWQoYSxmdW5jdGlvbihTKXtTPXYuX3BhcnNlcihTLCEwKTtpZihTLmlzQ3ViZW1hcClmb3IodmFyIFY9Uy5taXBtYXBzLmxlbmd0aC9TLm1pcG1hcENvdW50LFc9MDtXPFY7VysrKXt6W1ddPXttaXBtYXBzOltdfTtmb3IodmFyIGhhPTA7aGE8Uy5taXBtYXBDb3VudDtoYSsrKXpbV10ubWlwbWFwcy5wdXNoKFMubWlwbWFwc1tXKlMubWlwbWFwQ291bnQraGFdKSx6W1ddLmZvcm1hdD1TLmZvcm1hdCx6W1ddLndpZHRoPVMud2lkdGgseltXXS5oZWlnaHQ9Uy5oZWlnaHR9ZWxzZSBFLmltYWdlLndpZHRoPQpTLndpZHRoLEUuaW1hZ2UuaGVpZ2h0PVMuaGVpZ2h0LEUubWlwbWFwcz1TLm1pcG1hcHM7MT09PVMubWlwbWFwQ291bnQmJihFLm1pbkZpbHRlcj0xMDA2KTtFLmZvcm1hdD1TLmZvcm1hdDtFLm5lZWRzVXBkYXRlPSEwO2MmJmMoRSl9LGUsZyk7cmV0dXJuIEV9fSk7S2cucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpLZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj1uZXcgQWIsej1uZXcgdWModGhpcy5tYW5hZ2VyKTt6LnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKTt6LnNldFBhdGgodGhpcy5wYXRoKTt6LmxvYWQoYSxmdW5jdGlvbihFKXtpZihFPXIuX3BhcnNlcihFKSl2b2lkIDAhPT1FLmltYWdlP3YuaW1hZ2U9RS5pbWFnZTp2b2lkIDAhPT1FLmRhdGEmJih2LmltYWdlLndpZHRoPUUud2lkdGgsdi5pbWFnZS5oZWlnaHQ9RS5oZWlnaHQsdi5pbWFnZS5kYXRhPUUuZGF0YSksdi53cmFwUz0Kdm9pZCAwIT09RS53cmFwUz9FLndyYXBTOjEwMDEsdi53cmFwVD12b2lkIDAhPT1FLndyYXBUP0Uud3JhcFQ6MTAwMSx2Lm1hZ0ZpbHRlcj12b2lkIDAhPT1FLm1hZ0ZpbHRlcj9FLm1hZ0ZpbHRlcjoxMDA2LHYubWluRmlsdGVyPXZvaWQgMCE9PUUubWluRmlsdGVyP0UubWluRmlsdGVyOjEwMDgsdi5hbmlzb3Ryb3B5PXZvaWQgMCE9PUUuYW5pc290cm9weT9FLmFuaXNvdHJvcHk6MSx2b2lkIDAhPT1FLmZvcm1hdCYmKHYuZm9ybWF0PUUuZm9ybWF0KSx2b2lkIDAhPT1FLnR5cGUmJih2LnR5cGU9RS50eXBlKSx2b2lkIDAhPT1FLm1pcG1hcHMmJih2Lm1pcG1hcHM9RS5taXBtYXBzKSwxPT09RS5taXBtYXBDb3VudCYmKHYubWluRmlsdGVyPTEwMDYpLHYubmVlZHNVcGRhdGU9ITAsYyYmYyh2LEUpfSxlLGcpO3JldHVybiB2fX0pO1VlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VWUsbG9hZDpmdW5jdGlvbihhLApjLGUsZyl7ZnVuY3Rpb24gcigpe0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsciwhMSk7Ri5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdiwhMSk7aWUuYWRkKGEsdGhpcyk7YyYmYyh0aGlzKTt6Lm1hbmFnZXIuaXRlbUVuZChhKX1mdW5jdGlvbiB2KEope0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsciwhMSk7Ri5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdiwhMSk7ZyYmZyhKKTt6Lm1hbmFnZXIuaXRlbUVycm9yKGEpO3oubWFuYWdlci5pdGVtRW5kKGEpfXZvaWQgMCE9PXRoaXMucGF0aCYmKGE9dGhpcy5wYXRoK2EpO2E9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoYSk7dmFyIHo9dGhpcyxFPWllLmdldChhKTtpZih2b2lkIDAhPT1FKXJldHVybiB6Lm1hbmFnZXIuaXRlbVN0YXJ0KGEpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjJiZjKEUpO3oubWFuYWdlci5pdGVtRW5kKGEpfSwwKSxFO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiJpbWciKTtGLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHIsITEpO0YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHYsITEpOyJkYXRhOiIhPT1hLnN1YnN0cigwLDUpJiZ2b2lkIDAhPT10aGlzLmNyb3NzT3JpZ2luJiYoRi5jcm9zc09yaWdpbj10aGlzLmNyb3NzT3JpZ2luKTt6Lm1hbmFnZXIuaXRlbVN0YXJ0KGEpO0Yuc3JjPWE7cmV0dXJuIEZ9fSk7TGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpMZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe2Z1bmN0aW9uIHIoRil7ei5sb2FkKGFbRl0sZnVuY3Rpb24oSil7di5pbWFnZXNbRl09SjtFKys7Nj09PUUmJih2Lm5lZWRzVXBkYXRlPSEwLGMmJmModikpfSx2b2lkIDAsZyl9dmFyIHY9bmV3IGNkLHo9bmV3IFVlKHRoaXMubWFuYWdlcik7ei5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTt6LnNldFBhdGgodGhpcy5wYXRoKTt2YXIgRT0wO2ZvcihlPQowO2U8YS5sZW5ndGg7KytlKXIoZSk7cmV0dXJuIHZ9fSk7TWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpNZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPW5ldyBsLHY9bmV3IFVlKHRoaXMubWFuYWdlcik7di5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTt2LnNldFBhdGgodGhpcy5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtyLmltYWdlPXo7ej0wPGEuc2VhcmNoKC9cLmpwZT9nKCR8XD8pL2kpfHwwPT09YS5zZWFyY2goL15kYXRhOmltYWdlXC9qcGVnLyk7ci5mb3JtYXQ9ej8xMDIyOjEwMjM7ci5uZWVkc1VwZGF0ZT0hMDt2b2lkIDAhPT1jJiZjKHIpfSxlLGcpO3JldHVybiByfX0pO09iamVjdC5hc3NpZ24oWmEucHJvdG90eXBlLHtnZXRQb2ludDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKTtyZXR1cm4gbnVsbH0sCmdldFBvaW50QXQ6ZnVuY3Rpb24oYSxjKXthPXRoaXMuZ2V0VXRvVG1hcHBpbmcoYSk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYSxjKX0sZ2V0UG9pbnRzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPTUpO2Zvcih2YXIgYz1bXSxlPTA7ZTw9YTtlKyspYy5wdXNoKHRoaXMuZ2V0UG9pbnQoZS9hKSk7cmV0dXJuIGN9LGdldFNwYWNlZFBvaW50czpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT01KTtmb3IodmFyIGM9W10sZT0wO2U8PWE7ZSsrKWMucHVzaCh0aGlzLmdldFBvaW50QXQoZS9hKSk7cmV0dXJuIGN9LGdldExlbmd0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiBhW2EubGVuZ3RoLTFdfSxnZXRMZW5ndGhzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKTtpZih0aGlzLmNhY2hlQXJjTGVuZ3RocyYmdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoPT09YSsxJiYhdGhpcy5uZWVkc1VwZGF0ZSlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7CnRoaXMubmVlZHNVcGRhdGU9ITE7dmFyIGM9W10sZT10aGlzLmdldFBvaW50KDApLGcscj0wO2MucHVzaCgwKTtmb3IoZz0xO2c8PWE7ZysrKXt2YXIgdj10aGlzLmdldFBvaW50KGcvYSk7cis9di5kaXN0YW5jZVRvKGUpO2MucHVzaChyKTtlPXZ9cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzPWN9LHVwZGF0ZUFyY0xlbmd0aHM6ZnVuY3Rpb24oKXt0aGlzLm5lZWRzVXBkYXRlPSEwO3RoaXMuZ2V0TGVuZ3RocygpfSxnZXRVdG9UbWFwcGluZzpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZ2V0TGVuZ3RocygpLGc9ZS5sZW5ndGg7Yz1jP2M6YSplW2ctMV07Zm9yKHZhciByPTAsdj1nLTEsejtyPD12OylpZihhPU1hdGguZmxvb3Iocisodi1yKS8yKSx6PWVbYV0tYywwPnopcj1hKzE7ZWxzZSBpZigwPHopdj1hLTE7ZWxzZXt2PWE7YnJlYWt9YT12O2lmKGVbYV09PT1jKXJldHVybiBhLyhnLTEpO3I9ZVthXTtyZXR1cm4oYSsoYy1yKS8oZVthKzFdLXIpKS8oZy0xKX0sZ2V0VGFuZ2VudDpmdW5jdGlvbihhKXt2YXIgYz0KYS0xRS00O2ErPTFFLTQ7MD5jJiYoYz0wKTsxPGEmJihhPTEpO2M9dGhpcy5nZXRQb2ludChjKTtyZXR1cm4gdGhpcy5nZXRQb2ludChhKS5jbG9uZSgpLnN1YihjKS5ub3JtYWxpemUoKX0sZ2V0VGFuZ2VudEF0OmZ1bmN0aW9uKGEpe2E9dGhpcy5nZXRVdG9UbWFwcGluZyhhKTtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KGEpfSxjb21wdXRlRnJlbmV0RnJhbWVzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9bmV3IGssZz1bXSxyPVtdLHY9W10sej1uZXcgayxFPW5ldyBxLEY7Zm9yKEY9MDtGPD1hO0YrKyl7dmFyIEo9Ri9hO2dbRl09dGhpcy5nZXRUYW5nZW50QXQoSik7Z1tGXS5ub3JtYWxpemUoKX1yWzBdPW5ldyBrO3ZbMF09bmV3IGs7Rj1OdW1iZXIuTUFYX1ZBTFVFO0o9TWF0aC5hYnMoZ1swXS54KTt2YXIgUD1NYXRoLmFicyhnWzBdLnkpLFI9TWF0aC5hYnMoZ1swXS56KTtKPD1GJiYoRj1KLGUuc2V0KDEsMCwwKSk7UDw9RiYmKEY9UCxlLnNldCgwLDEsMCkpO1I8PUYmJmUuc2V0KDAsCjAsMSk7ei5jcm9zc1ZlY3RvcnMoZ1swXSxlKS5ub3JtYWxpemUoKTtyWzBdLmNyb3NzVmVjdG9ycyhnWzBdLHopO3ZbMF0uY3Jvc3NWZWN0b3JzKGdbMF0sclswXSk7Zm9yKEY9MTtGPD1hO0YrKylyW0ZdPXJbRi0xXS5jbG9uZSgpLHZbRl09dltGLTFdLmNsb25lKCksei5jcm9zc1ZlY3RvcnMoZ1tGLTFdLGdbRl0pLHoubGVuZ3RoKCk+TnVtYmVyLkVQU0lMT04mJih6Lm5vcm1hbGl6ZSgpLGU9TWF0aC5hY29zKGhiLmNsYW1wKGdbRi0xXS5kb3QoZ1tGXSksLTEsMSkpLHJbRl0uYXBwbHlNYXRyaXg0KEUubWFrZVJvdGF0aW9uQXhpcyh6LGUpKSksdltGXS5jcm9zc1ZlY3RvcnMoZ1tGXSxyW0ZdKTtpZighMD09PWMpZm9yKGU9TWF0aC5hY29zKGhiLmNsYW1wKHJbMF0uZG90KHJbYV0pLC0xLDEpKSxlLz1hLDA8Z1swXS5kb3Qoei5jcm9zc1ZlY3RvcnMoclswXSxyW2FdKSkmJihlPS1lKSxGPTE7Rjw9YTtGKyspcltGXS5hcHBseU1hdHJpeDQoRS5tYWtlUm90YXRpb25BeGlzKGdbRl0sCmUqRikpLHZbRl0uY3Jvc3NWZWN0b3JzKGdbRl0scltGXSk7cmV0dXJue3RhbmdlbnRzOmcsbm9ybWFsczpyLGJpbm9ybWFsczp2fX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9YS5hcmNMZW5ndGhEaXZpc2lvbnM7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O2EuYXJjTGVuZ3RoRGl2aXNpb25zPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO2EudHlwZT10aGlzLnR5cGU7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWEuYXJjTGVuZ3RoRGl2aXNpb25zO3JldHVybiB0aGlzfX0pO3BjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7cGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpwYztwYy5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmU9ITA7cGMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgZjtmb3IodmFyIGU9MipNYXRoLlBJLGc9dGhpcy5hRW5kQW5nbGUtdGhpcy5hU3RhcnRBbmdsZSxyPU1hdGguYWJzKGcpPE51bWJlci5FUFNJTE9OOzA+ZzspZys9ZTtmb3IoO2c+ZTspZy09ZTtnPE51bWJlci5FUFNJTE9OJiYoZz1yPzA6ZSk7ITAhPT10aGlzLmFDbG9ja3dpc2V8fHJ8fChnPWc9PT1lPy1lOmctZSk7ZT10aGlzLmFTdGFydEFuZ2xlK2EqZzthPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGUpO3ZhciB2PXRoaXMuYVkrdGhpcy55UmFkaXVzKk1hdGguc2luKGUpOzAhPT10aGlzLmFSb3RhdGlvbiYmKGU9TWF0aC5jb3ModGhpcy5hUm90YXRpb24pLGc9TWF0aC5zaW4odGhpcy5hUm90YXRpb24pLHI9YS10aGlzLmFYLHYtPXRoaXMuYVksYT1yKmUtdipnK3RoaXMuYVgsdj1yKmcrdiplK3RoaXMuYVkpO3JldHVybiBjLnNldChhLAp2KX07cGMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuYVg9YS5hWDt0aGlzLmFZPWEuYVk7dGhpcy54UmFkaXVzPWEueFJhZGl1czt0aGlzLnlSYWRpdXM9YS55UmFkaXVzO3RoaXMuYVN0YXJ0QW5nbGU9YS5hU3RhcnRBbmdsZTt0aGlzLmFFbmRBbmdsZT1hLmFFbmRBbmdsZTt0aGlzLmFDbG9ja3dpc2U9YS5hQ2xvY2t3aXNlO3RoaXMuYVJvdGF0aW9uPWEuYVJvdGF0aW9uO3JldHVybiB0aGlzfTtwYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EuYVg9dGhpcy5hWDthLmFZPXRoaXMuYVk7YS54UmFkaXVzPXRoaXMueFJhZGl1czthLnlSYWRpdXM9dGhpcy55UmFkaXVzO2EuYVN0YXJ0QW5nbGU9dGhpcy5hU3RhcnRBbmdsZTthLmFFbmRBbmdsZT10aGlzLmFFbmRBbmdsZTthLmFDbG9ja3dpc2U9dGhpcy5hQ2xvY2t3aXNlO2EuYVJvdGF0aW9uPQp0aGlzLmFSb3RhdGlvbjtyZXR1cm4gYX07cGMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5hWD1hLmFYO3RoaXMuYVk9YS5hWTt0aGlzLnhSYWRpdXM9YS54UmFkaXVzO3RoaXMueVJhZGl1cz1hLnlSYWRpdXM7dGhpcy5hU3RhcnRBbmdsZT1hLmFTdGFydEFuZ2xlO3RoaXMuYUVuZEFuZ2xlPWEuYUVuZEFuZ2xlO3RoaXMuYUNsb2Nrd2lzZT1hLmFDbG9ja3dpc2U7dGhpcy5hUm90YXRpb249YS5hUm90YXRpb247cmV0dXJuIHRoaXN9O1ZlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHBjLnByb3RvdHlwZSk7VmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVZlO1ZlLnByb3RvdHlwZS5pc0FyY0N1cnZlPSEwO3ZhciB4aD1uZXcgayxMaT1uZXcgY2ksTWk9bmV3IGNpLE5pPW5ldyBjaTtaYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO1piLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aYjsKWmIucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMz0hMDtaYi5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBrO3ZhciBlPXRoaXMucG9pbnRzLGc9ZS5sZW5ndGg7YSo9Zy0odGhpcy5jbG9zZWQ/MDoxKTt2YXIgcj1NYXRoLmZsb29yKGEpO2EtPXI7dGhpcy5jbG9zZWQ/cis9MDxyPzA6KE1hdGguZmxvb3IoTWF0aC5hYnMocikvZykrMSkqZzowPT09YSYmcj09PWctMSYmKHI9Zy0yLGE9MSk7aWYodGhpcy5jbG9zZWR8fDA8cil2YXIgdj1lWyhyLTEpJWddO2Vsc2UgeGguc3ViVmVjdG9ycyhlWzBdLGVbMV0pLmFkZChlWzBdKSx2PXhoO3ZhciB6PWVbciVnXTt2YXIgRT1lWyhyKzEpJWddO3RoaXMuY2xvc2VkfHxyKzI8Zz9lPWVbKHIrMiklZ106KHhoLnN1YlZlY3RvcnMoZVtnLTFdLGVbZy0yXSkuYWRkKGVbZy0xXSksZT14aCk7aWYoImNlbnRyaXBldGFsIj09PXRoaXMuY3VydmVUeXBlfHwiY2hvcmRhbCI9PT10aGlzLmN1cnZlVHlwZSl7dmFyIEY9CiJjaG9yZGFsIj09PXRoaXMuY3VydmVUeXBlPy41Oi4yNTtnPU1hdGgucG93KHYuZGlzdGFuY2VUb1NxdWFyZWQoeiksRik7cj1NYXRoLnBvdyh6LmRpc3RhbmNlVG9TcXVhcmVkKEUpLEYpO0Y9TWF0aC5wb3coRS5kaXN0YW5jZVRvU3F1YXJlZChlKSxGKTsxRS00PnImJihyPTEpOzFFLTQ+ZyYmKGc9cik7MUUtND5GJiYoRj1yKTtMaS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20odi54LHoueCxFLngsZS54LGcscixGKTtNaS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20odi55LHoueSxFLnksZS55LGcscixGKTtOaS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20odi56LHoueixFLnosZS56LGcscixGKX1lbHNlImNhdG11bGxyb20iPT09dGhpcy5jdXJ2ZVR5cGUmJihMaS5pbml0Q2F0bXVsbFJvbSh2Lngsei54LEUueCxlLngsdGhpcy50ZW5zaW9uKSxNaS5pbml0Q2F0bXVsbFJvbSh2Lnksei55LEUueSxlLnksdGhpcy50ZW5zaW9uKSxOaS5pbml0Q2F0bXVsbFJvbSh2Lnosei56LEUueiwKZS56LHRoaXMudGVuc2lvbikpO2Muc2V0KExpLmNhbGMoYSksTWkuY2FsYyhhKSxOaS5jYWxjKGEpKTtyZXR1cm4gY307WmIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMucG9pbnRzPVtdO2Zvcih2YXIgYz0wLGU9YS5wb2ludHMubGVuZ3RoO2M8ZTtjKyspdGhpcy5wb2ludHMucHVzaChhLnBvaW50c1tjXS5jbG9uZSgpKTt0aGlzLmNsb3NlZD1hLmNsb3NlZDt0aGlzLmN1cnZlVHlwZT1hLmN1cnZlVHlwZTt0aGlzLnRlbnNpb249YS50ZW5zaW9uO3JldHVybiB0aGlzfTtaYi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EucG9pbnRzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5wb2ludHMubGVuZ3RoO2M8ZTtjKyspYS5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tjXS50b0FycmF5KCkpO2EuY2xvc2VkPXRoaXMuY2xvc2VkO2EuY3VydmVUeXBlPXRoaXMuY3VydmVUeXBlOwphLnRlbnNpb249dGhpcy50ZW5zaW9uO3JldHVybiBhfTtaYi5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLnBvaW50c1tjXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgaykuZnJvbUFycmF5KGcpKX10aGlzLmNsb3NlZD1hLmNsb3NlZDt0aGlzLmN1cnZlVHlwZT1hLmN1cnZlVHlwZTt0aGlzLnRlbnNpb249YS50ZW5zaW9uO3JldHVybiB0aGlzfTtDYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0NjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1DYztDYy5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlPSEwO0NjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7dmFyIGU9dGhpcy52MCxnPXRoaXMudjEscj10aGlzLnYyLHY9dGhpcy52MztjLnNldChhZyhhLAplLngsZy54LHIueCx2LngpLGFnKGEsZS55LGcueSxyLnksdi55KSk7cmV0dXJuIGN9O0NjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYwLmNvcHkoYS52MCk7dGhpcy52MS5jb3B5KGEudjEpO3RoaXMudjIuY29weShhLnYyKTt0aGlzLnYzLmNvcHkoYS52Myk7cmV0dXJuIHRoaXN9O0NjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MD10aGlzLnYwLnRvQXJyYXkoKTthLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7YS52Mz10aGlzLnYzLnRvQXJyYXkoKTtyZXR1cm4gYX07Q2MucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MC5mcm9tQXJyYXkoYS52MCk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7dGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7CnRoaXMudjMuZnJvbUFycmF5KGEudjMpO3JldHVybiB0aGlzfTtUYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO1RjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UYztUYy5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlMz0hMDtUYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBrO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHI9dGhpcy52Mix2PXRoaXMudjM7Yy5zZXQoYWcoYSxlLngsZy54LHIueCx2LngpLGFnKGEsZS55LGcueSxyLnksdi55KSxhZyhhLGUueixnLnosci56LHYueikpO3JldHVybiBjfTtUYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MC5jb3B5KGEudjApO3RoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7dGhpcy52My5jb3B5KGEudjMpO3JldHVybiB0aGlzfTtUYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9ClphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnYwPXRoaXMudjAudG9BcnJheSgpO2EudjE9dGhpcy52MS50b0FycmF5KCk7YS52Mj10aGlzLnYyLnRvQXJyYXkoKTthLnYzPXRoaXMudjMudG9BcnJheSgpO3JldHVybiBhfTtUYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYwLmZyb21BcnJheShhLnYwKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTt0aGlzLnYyLmZyb21BcnJheShhLnYyKTt0aGlzLnYzLmZyb21BcnJheShhLnYzKTtyZXR1cm4gdGhpc307a2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtrYy5wcm90b3R5cGUuY29uc3RydWN0b3I9a2M7a2MucHJvdG90eXBlLmlzTGluZUN1cnZlPSEwO2tjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7MT09PWE/Yy5jb3B5KHRoaXMudjIpOihjLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLApjLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLnYxKSk7cmV0dXJuIGN9O2tjLnByb3RvdHlwZS5nZXRQb2ludEF0PWZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYSxjKX07a2MucHJvdG90eXBlLmdldFRhbmdlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52Mi5jbG9uZSgpLnN1Yih0aGlzLnYxKS5ub3JtYWxpemUoKX07a2MucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7cmV0dXJuIHRoaXN9O2tjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtrYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTsKdGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7cmV0dXJuIHRoaXN9O0RjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7RGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPURjO0RjLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZTM9ITA7RGMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgazsxPT09YT9jLmNvcHkodGhpcy52Mik6KGMuY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksYy5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy52MSkpO3JldHVybiBjfTtEYy5wcm90b3R5cGUuZ2V0UG9pbnRBdD1mdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmdldFBvaW50KGEsYyl9O0RjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtEYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpOwphLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7cmV0dXJuIGF9O0RjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMudjEuZnJvbUFycmF5KGEudjEpO3RoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtFYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0VjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1FYztFYy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZT0hMDtFYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHI9dGhpcy52MjtjLnNldCgkZihhLGUueCxnLngsci54KSwkZihhLGUueSxnLnksci55KSk7cmV0dXJuIGN9O0VjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYwLmNvcHkoYS52MCk7CnRoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7cmV0dXJuIHRoaXN9O0VjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MD10aGlzLnYwLnRvQXJyYXkoKTthLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7cmV0dXJuIGF9O0VjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMudjAuZnJvbUFycmF5KGEudjApO3RoaXMudjEuZnJvbUFycmF5KGEudjEpO3RoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtVYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO1VjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VYztVYy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITA7VWMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHwKbmV3IGs7dmFyIGU9dGhpcy52MCxnPXRoaXMudjEscj10aGlzLnYyO2Muc2V0KCRmKGEsZS54LGcueCxyLngpLCRmKGEsZS55LGcueSxyLnkpLCRmKGEsZS56LGcueixyLnopKTtyZXR1cm4gY307VWMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudjAuY29weShhLnYwKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtVYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjA9dGhpcy52MC50b0FycmF5KCk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtVYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYwLmZyb21BcnJheShhLnYwKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTsKdGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7cmV0dXJuIHRoaXN9O0ZjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7RmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZjO0ZjLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlPSEwO0ZjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7dmFyIGU9dGhpcy5wb2ludHMsZz0oZS5sZW5ndGgtMSkqYTthPU1hdGguZmxvb3IoZyk7Zy09YTt2YXIgcj1lWzA9PT1hP2E6YS0xXSx2PWVbYV0sej1lW2E+ZS5sZW5ndGgtMj9lLmxlbmd0aC0xOmErMV07ZT1lW2E+ZS5sZW5ndGgtMz9lLmxlbmd0aC0xOmErMl07Yy5zZXQoUGooZyxyLngsdi54LHoueCxlLngpLFBqKGcsci55LHYueSx6LnksZS55KSk7cmV0dXJuIGN9O0ZjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPAplO2MrKyl0aGlzLnBvaW50cy5wdXNoKGEucG9pbnRzW2NdLmNsb25lKCkpO3JldHVybiB0aGlzfTtGYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EucG9pbnRzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5wb2ludHMubGVuZ3RoO2M8ZTtjKyspYS5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tjXS50b0FycmF5KCkpO3JldHVybiBhfTtGYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLnBvaW50c1tjXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgZikuZnJvbUFycmF5KGcpKX1yZXR1cm4gdGhpc307dmFyIE9pPU9iamVjdC5mcmVlemUoe0FyY0N1cnZlOlZlLENhdG11bGxSb21DdXJ2ZTM6WmIsQ3ViaWNCZXppZXJDdXJ2ZTpDYyxDdWJpY0JlemllckN1cnZlMzpUYywKRWxsaXBzZUN1cnZlOnBjLExpbmVDdXJ2ZTprYyxMaW5lQ3VydmUzOkRjLFF1YWRyYXRpY0JlemllckN1cnZlOkVjLFF1YWRyYXRpY0JlemllckN1cnZlMzpVYyxTcGxpbmVDdXJ2ZTpGY30pO2dkLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6Z2QsYWRkOmZ1bmN0aW9uKGEpe3RoaXMuY3VydmVzLnB1c2goYSl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3VydmVzWzBdLmdldFBvaW50KDApLGM9dGhpcy5jdXJ2ZXNbdGhpcy5jdXJ2ZXMubGVuZ3RoLTFdLmdldFBvaW50KDEpO2EuZXF1YWxzKGMpfHx0aGlzLmN1cnZlcy5wdXNoKG5ldyBrYyhjLGEpKX0sZ2V0UG9pbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9YSp0aGlzLmdldExlbmd0aCgpLGU9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtmb3IoYT0wO2E8ZS5sZW5ndGg7KXtpZihlW2FdPj1jKXJldHVybiBjPWVbYV0tYyxhPXRoaXMuY3VydmVzW2FdLGU9CmEuZ2V0TGVuZ3RoKCksYS5nZXRQb2ludEF0KDA9PT1lPzA6MS1jL2UpO2ErK31yZXR1cm4gbnVsbH0sZ2V0TGVuZ3RoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtyZXR1cm4gYVthLmxlbmd0aC0xXX0sdXBkYXRlQXJjTGVuZ3RoczpmdW5jdGlvbigpe3RoaXMubmVlZHNVcGRhdGU9ITA7dGhpcy5jYWNoZUxlbmd0aHM9bnVsbDt0aGlzLmdldEN1cnZlTGVuZ3RocygpfSxnZXRDdXJ2ZUxlbmd0aHM6ZnVuY3Rpb24oKXtpZih0aGlzLmNhY2hlTGVuZ3RocyYmdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoPT09dGhpcy5jdXJ2ZXMubGVuZ3RoKXJldHVybiB0aGlzLmNhY2hlTGVuZ3Rocztmb3IodmFyIGE9W10sYz0wLGU9MCxnPXRoaXMuY3VydmVzLmxlbmd0aDtlPGc7ZSsrKWMrPXRoaXMuY3VydmVzW2VdLmdldExlbmd0aCgpLGEucHVzaChjKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9YX0sZ2V0U3BhY2VkUG9pbnRzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoYT00MCk7Zm9yKHZhciBjPVtdLGU9MDtlPD1hO2UrKyljLnB1c2godGhpcy5nZXRQb2ludChlL2EpKTt0aGlzLmF1dG9DbG9zZSYmYy5wdXNoKGNbMF0pO3JldHVybiBjfSxnZXRQb2ludHM6ZnVuY3Rpb24oYSl7YT1hfHwxMjtmb3IodmFyIGM9W10sZSxnPTAscj10aGlzLmN1cnZlcztnPHIubGVuZ3RoO2crKyl7dmFyIHY9cltnXTt2PXYuZ2V0UG9pbnRzKHYmJnYuaXNFbGxpcHNlQ3VydmU/MiphOnYmJih2LmlzTGluZUN1cnZlfHx2LmlzTGluZUN1cnZlMyk/MTp2JiZ2LmlzU3BsaW5lQ3VydmU/YSp2LnBvaW50cy5sZW5ndGg6YSk7Zm9yKHZhciB6PTA7ejx2Lmxlbmd0aDt6Kyspe3ZhciBFPXZbel07ZSYmZS5lcXVhbHMoRSl8fChjLnB1c2goRSksZT1FKX19dGhpcy5hdXRvQ2xvc2UmJjE8Yy5sZW5ndGgmJiFjW2MubGVuZ3RoLTFdLmVxdWFscyhjWzBdKSYmYy5wdXNoKGNbMF0pO3JldHVybiBjfSxjb3B5OmZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5jdXJ2ZXM9W107Zm9yKHZhciBjPTAsZT1hLmN1cnZlcy5sZW5ndGg7YzxlO2MrKyl0aGlzLmN1cnZlcy5wdXNoKGEuY3VydmVzW2NdLmNsb25lKCkpO3RoaXMuYXV0b0Nsb3NlPWEuYXV0b0Nsb3NlO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS5hdXRvQ2xvc2U9dGhpcy5hdXRvQ2xvc2U7YS5jdXJ2ZXM9W107Zm9yKHZhciBjPTAsZT10aGlzLmN1cnZlcy5sZW5ndGg7YzxlO2MrKylhLmN1cnZlcy5wdXNoKHRoaXMuY3VydmVzW2NdLnRvSlNPTigpKTtyZXR1cm4gYX0sZnJvbUpTT046ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLmF1dG9DbG9zZT1hLmF1dG9DbG9zZTt0aGlzLmN1cnZlcz1bXTtmb3IodmFyIGM9MCxlPWEuY3VydmVzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLmN1cnZlc1tjXTt0aGlzLmN1cnZlcy5wdXNoKChuZXcgT2lbZy50eXBlXSkuZnJvbUpTT04oZykpfXJldHVybiB0aGlzfX0pOwpHYy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGdkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkdjLHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSl7dGhpcy5tb3ZlVG8oYVswXS54LGFbMF0ueSk7Zm9yKHZhciBjPTEsZT1hLmxlbmd0aDtjPGU7YysrKXRoaXMubGluZVRvKGFbY10ueCxhW2NdLnkpfSxtb3ZlVG86ZnVuY3Rpb24oYSxjKXt0aGlzLmN1cnJlbnRQb2ludC5zZXQoYSxjKX0sbGluZVRvOmZ1bmN0aW9uKGEsYyl7dmFyIGU9bmV3IGtjKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IGYoYSxjKSk7dGhpcy5jdXJ2ZXMucHVzaChlKTt0aGlzLmN1cnJlbnRQb2ludC5zZXQoYSxjKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbihhLGMsZSxnKXthPW5ldyBFYyh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBmKGEsYyksbmV3IGYoZSxnKSk7dGhpcy5jdXJ2ZXMucHVzaChhKTt0aGlzLmN1cnJlbnRQb2ludC5zZXQoZSxnKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbihhLApjLGUsZyxyLHYpe2E9bmV3IENjKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IGYoYSxjKSxuZXcgZihlLGcpLG5ldyBmKHIsdikpO3RoaXMuY3VydmVzLnB1c2goYSk7dGhpcy5jdXJyZW50UG9pbnQuc2V0KHIsdil9LHNwbGluZVRocnU6ZnVuY3Rpb24oYSl7dmFyIGM9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdChhKTtjPW5ldyBGYyhjKTt0aGlzLmN1cnZlcy5wdXNoKGMpO3RoaXMuY3VycmVudFBvaW50LmNvcHkoYVthLmxlbmd0aC0xXSl9LGFyYzpmdW5jdGlvbihhLGMsZSxnLHIsdil7dGhpcy5hYnNhcmMoYSt0aGlzLmN1cnJlbnRQb2ludC54LGMrdGhpcy5jdXJyZW50UG9pbnQueSxlLGcscix2KX0sYWJzYXJjOmZ1bmN0aW9uKGEsYyxlLGcscix2KXt0aGlzLmFic2VsbGlwc2UoYSxjLGUsZSxnLHIsdil9LGVsbGlwc2U6ZnVuY3Rpb24oYSxjLGUsZyxyLHYseixFKXt0aGlzLmFic2VsbGlwc2UoYSt0aGlzLmN1cnJlbnRQb2ludC54LGMrdGhpcy5jdXJyZW50UG9pbnQueSwKZSxnLHIsdix6LEUpfSxhYnNlbGxpcHNlOmZ1bmN0aW9uKGEsYyxlLGcscix2LHosRSl7YT1uZXcgcGMoYSxjLGUsZyxyLHYseixFKTswPHRoaXMuY3VydmVzLmxlbmd0aCYmKGM9YS5nZXRQb2ludCgwKSxjLmVxdWFscyh0aGlzLmN1cnJlbnRQb2ludCl8fHRoaXMubGluZVRvKGMueCxjLnkpKTt0aGlzLmN1cnZlcy5wdXNoKGEpO2E9YS5nZXRQb2ludCgxKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGEpfSxjb3B5OmZ1bmN0aW9uKGEpe2dkLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGEuY3VycmVudFBvaW50KTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9Z2QucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EuY3VycmVudFBvaW50PXRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKTtyZXR1cm4gYX0sZnJvbUpTT046ZnVuY3Rpb24oYSl7Z2QucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLmN1cnJlbnRQb2ludC5mcm9tQXJyYXkoYS5jdXJyZW50UG9pbnQpOwpyZXR1cm4gdGhpc319KTtDZC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEdjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkNkLGdldFBvaW50c0hvbGVzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPTAsZz10aGlzLmhvbGVzLmxlbmd0aDtlPGc7ZSsrKWNbZV09dGhpcy5ob2xlc1tlXS5nZXRQb2ludHMoYSk7cmV0dXJuIGN9LGV4dHJhY3RQb2ludHM6ZnVuY3Rpb24oYSl7cmV0dXJue3NoYXBlOnRoaXMuZ2V0UG9pbnRzKGEpLGhvbGVzOnRoaXMuZ2V0UG9pbnRzSG9sZXMoYSl9fSxjb3B5OmZ1bmN0aW9uKGEpe0djLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmhvbGVzPVtdO2Zvcih2YXIgYz0wLGU9YS5ob2xlcy5sZW5ndGg7YzxlO2MrKyl0aGlzLmhvbGVzLnB1c2goYS5ob2xlc1tjXS5jbG9uZSgpKTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9R2MucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudXVpZD10aGlzLnV1aWQ7CmEuaG9sZXM9W107Zm9yKHZhciBjPTAsZT10aGlzLmhvbGVzLmxlbmd0aDtjPGU7YysrKWEuaG9sZXMucHVzaCh0aGlzLmhvbGVzW2NdLnRvSlNPTigpKTtyZXR1cm4gYX0sZnJvbUpTT046ZnVuY3Rpb24oYSl7R2MucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnV1aWQ9YS51dWlkO3RoaXMuaG9sZXM9W107Zm9yKHZhciBjPTAsZT1hLmhvbGVzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLmhvbGVzW2NdO3RoaXMuaG9sZXMucHVzaCgobmV3IEdjKS5mcm9tSlNPTihnKSl9cmV0dXJuIHRoaXN9fSk7SmIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkpiLGlzTGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5pbnRlbnNpdHk9YS5pbnRlbnNpdHk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXthPQpBLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0LmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCk7YS5vYmplY3QuaW50ZW5zaXR5PXRoaXMuaW50ZW5zaXR5O3ZvaWQgMCE9PXRoaXMuZ3JvdW5kQ29sb3ImJihhLm9iamVjdC5ncm91bmRDb2xvcj10aGlzLmdyb3VuZENvbG9yLmdldEhleCgpKTt2b2lkIDAhPT10aGlzLmRpc3RhbmNlJiYoYS5vYmplY3QuZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSk7dm9pZCAwIT09dGhpcy5hbmdsZSYmKGEub2JqZWN0LmFuZ2xlPXRoaXMuYW5nbGUpO3ZvaWQgMCE9PXRoaXMuZGVjYXkmJihhLm9iamVjdC5kZWNheT10aGlzLmRlY2F5KTt2b2lkIDAhPT10aGlzLnBlbnVtYnJhJiYoYS5vYmplY3QucGVudW1icmE9dGhpcy5wZW51bWJyYSk7dm9pZCAwIT09dGhpcy5zaGFkb3cmJihhLm9iamVjdC5zaGFkb3c9dGhpcy5zaGFkb3cudG9KU09OKCkpO3JldHVybiBhfX0pO05nLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSmIucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOk5nLGlzSGVtaXNwaGVyZUxpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7SmIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZ3JvdW5kQ29sb3IuY29weShhLmdyb3VuZENvbG9yKTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKFZjLnByb3RvdHlwZSx7X3Byb2pTY3JlZW5NYXRyaXg6bmV3IHEsX2xpZ2h0UG9zaXRpb25Xb3JsZDpuZXcgayxfbG9va1RhcmdldDpuZXcgayxnZXRWaWV3cG9ydENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q291bnR9LGdldEZydXN0dW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJ1c3R1bX0sdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jYW1lcmEsZT10aGlzLm1hdHJpeCxnPXRoaXMuX3Byb2pTY3JlZW5NYXRyaXgscj10aGlzLl9sb29rVGFyZ2V0LHY9dGhpcy5fbGlnaHRQb3NpdGlvbldvcmxkO3Yuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEubWF0cml4V29ybGQpOwpjLnBvc2l0aW9uLmNvcHkodik7ci5zZXRGcm9tTWF0cml4UG9zaXRpb24oYS50YXJnZXQubWF0cml4V29ybGQpO2MubG9va0F0KHIpO2MudXBkYXRlTWF0cml4V29ybGQoKTtnLm11bHRpcGx5TWF0cmljZXMoYy5wcm9qZWN0aW9uTWF0cml4LGMubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLl9mcnVzdHVtLnNldEZyb21NYXRyaXgoZyk7ZS5zZXQoLjUsMCwwLC41LDAsLjUsMCwuNSwwLDAsLjUsLjUsMCwwLDAsMSk7ZS5tdWx0aXBseShjLnByb2plY3Rpb25NYXRyaXgpO2UubXVsdGlwbHkoYy5tYXRyaXhXb3JsZEludmVyc2UpfSxnZXRWaWV3cG9ydDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fdmlld3BvcnRzW2FdfSxnZXRGcmFtZUV4dGVudHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuY2FtZXJhPWEuY2FtZXJhLmNsb25lKCk7dGhpcy5iaWFzPWEuYmlhczt0aGlzLnJhZGl1cz1hLnJhZGl1czt0aGlzLm1hcFNpemUuY29weShhLm1hcFNpemUpOwpyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXt9OzAhPT10aGlzLmJpYXMmJihhLmJpYXM9dGhpcy5iaWFzKTsxIT09dGhpcy5yYWRpdXMmJihhLnJhZGl1cz10aGlzLnJhZGl1cyk7aWYoNTEyIT09dGhpcy5tYXBTaXplLnh8fDUxMiE9PXRoaXMubWFwU2l6ZS55KWEubWFwU2l6ZT10aGlzLm1hcFNpemUudG9BcnJheSgpO2EuY2FtZXJhPXRoaXMuY2FtZXJhLnRvSlNPTighMSkub2JqZWN0O2RlbGV0ZSBhLmNhbWVyYS5tYXRyaXg7cmV0dXJuIGF9fSk7T2cucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShWYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpPZyxpc1Nwb3RMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5jYW1lcmEscj0yKmhiLlJBRDJERUcqYS5hbmdsZSx2PXRoaXMubWFwU2l6ZS53aWR0aC8KdGhpcy5tYXBTaXplLmhlaWdodCx6PWEuZGlzdGFuY2V8fGcuZmFyO2lmKHIhPT1nLmZvdnx8diE9PWcuYXNwZWN0fHx6IT09Zy5mYXIpZy5mb3Y9cixnLmFzcGVjdD12LGcuZmFyPXosZy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7VmMucHJvdG90eXBlLnVwZGF0ZU1hdHJpY2VzLmNhbGwodGhpcyxhLGMsZSl9fSk7UGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShKYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpQZyxpc1Nwb3RMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmRpc3RhbmNlPWEuZGlzdGFuY2U7dGhpcy5hbmdsZT1hLmFuZ2xlO3RoaXMucGVudW1icmE9YS5wZW51bWJyYTt0aGlzLmRlY2F5PWEuZGVjYXk7dGhpcy50YXJnZXQ9YS50YXJnZXQuY2xvbmUoKTt0aGlzLnNoYWRvdz1hLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO2RpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVmMucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOmRpLGlzUG9pbnRMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihhLGMsZSl7Yz10aGlzLmNhbWVyYTt2YXIgZz10aGlzLm1hdHJpeCxyPXRoaXMuX2xpZ2h0UG9zaXRpb25Xb3JsZCx2PXRoaXMuX2xvb2tUYXJnZXQsej10aGlzLl9wcm9qU2NyZWVuTWF0cml4O3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEubWF0cml4V29ybGQpO2MucG9zaXRpb24uY29weShyKTt2LmNvcHkoYy5wb3NpdGlvbik7di5hZGQodGhpcy5fY3ViZURpcmVjdGlvbnNbZV0pO2MudXAuY29weSh0aGlzLl9jdWJlVXBzW2VdKTtjLmxvb2tBdCh2KTtjLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Zy5tYWtlVHJhbnNsYXRpb24oLXIueCwtci55LC1yLnopO3oubXVsdGlwbHlNYXRyaWNlcyhjLnByb2plY3Rpb25NYXRyaXgsYy5tYXRyaXhXb3JsZEludmVyc2UpO3RoaXMuX2ZydXN0dW0uc2V0RnJvbU1hdHJpeCh6KX19KTtRZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpRZyxpc1BvaW50TGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtKYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kaXN0YW5jZT1hLmRpc3RhbmNlO3RoaXMuZGVjYXk9YS5kZWNheTt0aGlzLnNoYWRvdz1hLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO2JnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoemIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6YmcsaXNPcnRob2dyYXBoaWNDYW1lcmE6ITAsY29weTpmdW5jdGlvbihhLGMpe3piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhLGMpO3RoaXMubGVmdD1hLmxlZnQ7dGhpcy5yaWdodD1hLnJpZ2h0O3RoaXMudG9wPWEudG9wO3RoaXMuYm90dG9tPWEuYm90dG9tO3RoaXMubmVhcj1hLm5lYXI7dGhpcy5mYXI9YS5mYXI7dGhpcy56b29tPWEuem9vbTt0aGlzLnZpZXc9bnVsbD09PWEudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sYS52aWV3KTtyZXR1cm4gdGhpc30sCnNldFZpZXdPZmZzZXQ6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe251bGw9PT10aGlzLnZpZXcmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pO3RoaXMudmlldy5lbmFibGVkPSEwO3RoaXMudmlldy5mdWxsV2lkdGg9YTt0aGlzLnZpZXcuZnVsbEhlaWdodD1jO3RoaXMudmlldy5vZmZzZXRYPWU7dGhpcy52aWV3Lm9mZnNldFk9Zzt0aGlzLnZpZXcud2lkdGg9cjt0aGlzLnZpZXcuaGVpZ2h0PXY7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LGNsZWFyVmlld09mZnNldDpmdW5jdGlvbigpe251bGwhPT10aGlzLnZpZXcmJih0aGlzLnZpZXcuZW5hYmxlZD0hMSk7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LHVwZGF0ZVByb2plY3Rpb25NYXRyaXg6ZnVuY3Rpb24oKXt2YXIgYT0odGhpcy5yaWdodC10aGlzLmxlZnQpLygyKnRoaXMuem9vbSksYz0odGhpcy50b3AtCnRoaXMuYm90dG9tKS8oMip0aGlzLnpvb20pLGU9KHRoaXMucmlnaHQrdGhpcy5sZWZ0KS8yLGc9KHRoaXMudG9wK3RoaXMuYm90dG9tKS8yLHI9ZS1hO2UrPWE7YT1nK2M7Yz1nLWM7aWYobnVsbCE9PXRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe2U9dGhpcy56b29tLyh0aGlzLnZpZXcud2lkdGgvdGhpcy52aWV3LmZ1bGxXaWR0aCk7Yz10aGlzLnpvb20vKHRoaXMudmlldy5oZWlnaHQvdGhpcy52aWV3LmZ1bGxIZWlnaHQpO3ZhciB2PSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvdGhpcy52aWV3LndpZHRoO2c9KHRoaXMudG9wLXRoaXMuYm90dG9tKS90aGlzLnZpZXcuaGVpZ2h0O3IrPXRoaXMudmlldy5vZmZzZXRYL2UqdjtlPXIrdGhpcy52aWV3LndpZHRoL2UqdjthLT10aGlzLnZpZXcub2Zmc2V0WS9jKmc7Yz1hLXRoaXMudmlldy5oZWlnaHQvYypnfXRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKHIsZSxhLGMsdGhpcy5uZWFyLHRoaXMuZmFyKTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5wcm9qZWN0aW9uTWF0cml4KX0sCnRvSlNPTjpmdW5jdGlvbihhKXthPUEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSk7YS5vYmplY3Quem9vbT10aGlzLnpvb207YS5vYmplY3QubGVmdD10aGlzLmxlZnQ7YS5vYmplY3QucmlnaHQ9dGhpcy5yaWdodDthLm9iamVjdC50b3A9dGhpcy50b3A7YS5vYmplY3QuYm90dG9tPXRoaXMuYm90dG9tO2Eub2JqZWN0Lm5lYXI9dGhpcy5uZWFyO2Eub2JqZWN0LmZhcj10aGlzLmZhcjtudWxsIT09dGhpcy52aWV3JiYoYS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpO3JldHVybiBhfX0pO1JnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVmMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6UmcsaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93OiEwLHVwZGF0ZU1hdHJpY2VzOmZ1bmN0aW9uKGEsYyxlKXtWYy5wcm90b3R5cGUudXBkYXRlTWF0cmljZXMuY2FsbCh0aGlzLGEsYyxlKX19KTtTZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpTZyxpc0RpcmVjdGlvbmFsTGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtKYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy50YXJnZXQ9YS50YXJnZXQuY2xvbmUoKTt0aGlzLnNoYWRvdz1hLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO1RnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSmIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VGcsaXNBbWJpZW50TGlnaHQ6ITB9KTtVZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlVnLGlzUmVjdEFyZWFMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLndpZHRoPWEud2lkdGg7dGhpcy5oZWlnaHQ9YS5oZWlnaHQ7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXthPUpiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0LndpZHRoPQp0aGlzLndpZHRoO2Eub2JqZWN0LmhlaWdodD10aGlzLmhlaWdodDtyZXR1cm4gYX19KTtWZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlZnLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcyx2PW5ldyB1YyhyLm1hbmFnZXIpO3Yuc2V0UGF0aChyLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope2Moci5wYXJzZShKU09OLnBhcnNlKHopKSl9LGUsZyl9LHBhcnNlOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoRSl7dm9pZCAwPT09ZVtFXSYmY29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUiLEUpO3JldHVybiBlW0VdfXZhciBlPXRoaXMudGV4dHVyZXMsZz1uZXcgS21bYS50eXBlXTt2b2lkIDAhPT1hLnV1aWQmJihnLnV1aWQ9YS51dWlkKTt2b2lkIDAhPT1hLm5hbWUmJihnLm5hbWU9YS5uYW1lKTt2b2lkIDAhPT1hLmNvbG9yJiZnLmNvbG9yLnNldEhleChhLmNvbG9yKTsKdm9pZCAwIT09YS5yb3VnaG5lc3MmJihnLnJvdWdobmVzcz1hLnJvdWdobmVzcyk7dm9pZCAwIT09YS5tZXRhbG5lc3MmJihnLm1ldGFsbmVzcz1hLm1ldGFsbmVzcyk7dm9pZCAwIT09YS5lbWlzc2l2ZSYmZy5lbWlzc2l2ZS5zZXRIZXgoYS5lbWlzc2l2ZSk7dm9pZCAwIT09YS5zcGVjdWxhciYmZy5zcGVjdWxhci5zZXRIZXgoYS5zcGVjdWxhcik7dm9pZCAwIT09YS5zaGluaW5lc3MmJihnLnNoaW5pbmVzcz1hLnNoaW5pbmVzcyk7dm9pZCAwIT09YS5jbGVhcmNvYXQmJihnLmNsZWFyY29hdD1hLmNsZWFyY29hdCk7dm9pZCAwIT09YS5jbGVhcmNvYXRSb3VnaG5lc3MmJihnLmNsZWFyY29hdFJvdWdobmVzcz1hLmNsZWFyY29hdFJvdWdobmVzcyk7dm9pZCAwIT09YS52ZXJ0ZXhDb2xvcnMmJihnLnZlcnRleENvbG9ycz1hLnZlcnRleENvbG9ycyk7dm9pZCAwIT09YS5mb2cmJihnLmZvZz1hLmZvZyk7dm9pZCAwIT09YS5mbGF0U2hhZGluZyYmKGcuZmxhdFNoYWRpbmc9YS5mbGF0U2hhZGluZyk7CnZvaWQgMCE9PWEuYmxlbmRpbmcmJihnLmJsZW5kaW5nPWEuYmxlbmRpbmcpO3ZvaWQgMCE9PWEuY29tYmluZSYmKGcuY29tYmluZT1hLmNvbWJpbmUpO3ZvaWQgMCE9PWEuc2lkZSYmKGcuc2lkZT1hLnNpZGUpO3ZvaWQgMCE9PWEub3BhY2l0eSYmKGcub3BhY2l0eT1hLm9wYWNpdHkpO3ZvaWQgMCE9PWEudHJhbnNwYXJlbnQmJihnLnRyYW5zcGFyZW50PWEudHJhbnNwYXJlbnQpO3ZvaWQgMCE9PWEuYWxwaGFUZXN0JiYoZy5hbHBoYVRlc3Q9YS5hbHBoYVRlc3QpO3ZvaWQgMCE9PWEuZGVwdGhUZXN0JiYoZy5kZXB0aFRlc3Q9YS5kZXB0aFRlc3QpO3ZvaWQgMCE9PWEuZGVwdGhXcml0ZSYmKGcuZGVwdGhXcml0ZT1hLmRlcHRoV3JpdGUpO3ZvaWQgMCE9PWEuY29sb3JXcml0ZSYmKGcuY29sb3JXcml0ZT1hLmNvbG9yV3JpdGUpO3ZvaWQgMCE9PWEud2lyZWZyYW1lJiYoZy53aXJlZnJhbWU9YS53aXJlZnJhbWUpO3ZvaWQgMCE9PWEud2lyZWZyYW1lTGluZXdpZHRoJiYoZy53aXJlZnJhbWVMaW5ld2lkdGg9CmEud2lyZWZyYW1lTGluZXdpZHRoKTt2b2lkIDAhPT1hLndpcmVmcmFtZUxpbmVjYXAmJihnLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwKTt2b2lkIDAhPT1hLndpcmVmcmFtZUxpbmVqb2luJiYoZy53aXJlZnJhbWVMaW5lam9pbj1hLndpcmVmcmFtZUxpbmVqb2luKTt2b2lkIDAhPT1hLnJvdGF0aW9uJiYoZy5yb3RhdGlvbj1hLnJvdGF0aW9uKTsxIT09YS5saW5ld2lkdGgmJihnLmxpbmV3aWR0aD1hLmxpbmV3aWR0aCk7dm9pZCAwIT09YS5kYXNoU2l6ZSYmKGcuZGFzaFNpemU9YS5kYXNoU2l6ZSk7dm9pZCAwIT09YS5nYXBTaXplJiYoZy5nYXBTaXplPWEuZ2FwU2l6ZSk7dm9pZCAwIT09YS5zY2FsZSYmKGcuc2NhbGU9YS5zY2FsZSk7dm9pZCAwIT09YS5wb2x5Z29uT2Zmc2V0JiYoZy5wb2x5Z29uT2Zmc2V0PWEucG9seWdvbk9mZnNldCk7dm9pZCAwIT09YS5wb2x5Z29uT2Zmc2V0RmFjdG9yJiYoZy5wb2x5Z29uT2Zmc2V0RmFjdG9yPWEucG9seWdvbk9mZnNldEZhY3Rvcik7CnZvaWQgMCE9PWEucG9seWdvbk9mZnNldFVuaXRzJiYoZy5wb2x5Z29uT2Zmc2V0VW5pdHM9YS5wb2x5Z29uT2Zmc2V0VW5pdHMpO3ZvaWQgMCE9PWEuc2tpbm5pbmcmJihnLnNraW5uaW5nPWEuc2tpbm5pbmcpO3ZvaWQgMCE9PWEubW9ycGhUYXJnZXRzJiYoZy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHMpO3ZvaWQgMCE9PWEubW9ycGhOb3JtYWxzJiYoZy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHMpO3ZvaWQgMCE9PWEuZGl0aGVyaW5nJiYoZy5kaXRoZXJpbmc9YS5kaXRoZXJpbmcpO3ZvaWQgMCE9PWEudmlzaWJsZSYmKGcudmlzaWJsZT1hLnZpc2libGUpO3ZvaWQgMCE9PWEudG9uZU1hcHBlZCYmKGcudG9uZU1hcHBlZD1hLnRvbmVNYXBwZWQpO3ZvaWQgMCE9PWEudXNlckRhdGEmJihnLnVzZXJEYXRhPWEudXNlckRhdGEpO2lmKHZvaWQgMCE9PWEudW5pZm9ybXMpZm9yKHZhciByIGluIGEudW5pZm9ybXMpe3ZhciB2PWEudW5pZm9ybXNbcl07Zy51bmlmb3Jtc1tyXT0Ke307c3dpdGNoKHYudHlwZSl7Y2FzZSAidCI6Zy51bmlmb3Jtc1tyXS52YWx1ZT1jKHYudmFsdWUpO2JyZWFrO2Nhc2UgImMiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBJKS5zZXRIZXgodi52YWx1ZSk7YnJlYWs7Y2FzZSAidjIiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBmKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7Y2FzZSAidjMiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBrKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7Y2FzZSAidjQiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBwKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7Y2FzZSAibTMiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyB0KS5mcm9tQXJyYXkodi52YWx1ZSk7Y2FzZSAibTQiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBxKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7ZGVmYXVsdDpnLnVuaWZvcm1zW3JdLnZhbHVlPXYudmFsdWV9fXZvaWQgMCE9PWEuZGVmaW5lcyYmKGcuZGVmaW5lcz1hLmRlZmluZXMpOwp2b2lkIDAhPT1hLnZlcnRleFNoYWRlciYmKGcudmVydGV4U2hhZGVyPWEudmVydGV4U2hhZGVyKTt2b2lkIDAhPT1hLmZyYWdtZW50U2hhZGVyJiYoZy5mcmFnbWVudFNoYWRlcj1hLmZyYWdtZW50U2hhZGVyKTtpZih2b2lkIDAhPT1hLmV4dGVuc2lvbnMpZm9yKHZhciB6IGluIGEuZXh0ZW5zaW9ucylnLmV4dGVuc2lvbnNbel09YS5leHRlbnNpb25zW3pdO3ZvaWQgMCE9PWEuc2hhZGluZyYmKGcuZmxhdFNoYWRpbmc9MT09PWEuc2hhZGluZyk7dm9pZCAwIT09YS5zaXplJiYoZy5zaXplPWEuc2l6ZSk7dm9pZCAwIT09YS5zaXplQXR0ZW51YXRpb24mJihnLnNpemVBdHRlbnVhdGlvbj1hLnNpemVBdHRlbnVhdGlvbik7dm9pZCAwIT09YS5tYXAmJihnLm1hcD1jKGEubWFwKSk7dm9pZCAwIT09YS5tYXRjYXAmJihnLm1hdGNhcD1jKGEubWF0Y2FwKSk7dm9pZCAwIT09YS5hbHBoYU1hcCYmKGcuYWxwaGFNYXA9YyhhLmFscGhhTWFwKSxnLnRyYW5zcGFyZW50PSEwKTt2b2lkIDAhPT0KYS5idW1wTWFwJiYoZy5idW1wTWFwPWMoYS5idW1wTWFwKSk7dm9pZCAwIT09YS5idW1wU2NhbGUmJihnLmJ1bXBTY2FsZT1hLmJ1bXBTY2FsZSk7dm9pZCAwIT09YS5ub3JtYWxNYXAmJihnLm5vcm1hbE1hcD1jKGEubm9ybWFsTWFwKSk7dm9pZCAwIT09YS5ub3JtYWxNYXBUeXBlJiYoZy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZSk7dm9pZCAwIT09YS5ub3JtYWxTY2FsZSYmKHI9YS5ub3JtYWxTY2FsZSwhMT09PUFycmF5LmlzQXJyYXkocikmJihyPVtyLHJdKSxnLm5vcm1hbFNjYWxlPShuZXcgZikuZnJvbUFycmF5KHIpKTt2b2lkIDAhPT1hLmRpc3BsYWNlbWVudE1hcCYmKGcuZGlzcGxhY2VtZW50TWFwPWMoYS5kaXNwbGFjZW1lbnRNYXApKTt2b2lkIDAhPT1hLmRpc3BsYWNlbWVudFNjYWxlJiYoZy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlKTt2b2lkIDAhPT1hLmRpc3BsYWNlbWVudEJpYXMmJihnLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzKTsKdm9pZCAwIT09YS5yb3VnaG5lc3NNYXAmJihnLnJvdWdobmVzc01hcD1jKGEucm91Z2huZXNzTWFwKSk7dm9pZCAwIT09YS5tZXRhbG5lc3NNYXAmJihnLm1ldGFsbmVzc01hcD1jKGEubWV0YWxuZXNzTWFwKSk7dm9pZCAwIT09YS5lbWlzc2l2ZU1hcCYmKGcuZW1pc3NpdmVNYXA9YyhhLmVtaXNzaXZlTWFwKSk7dm9pZCAwIT09YS5lbWlzc2l2ZUludGVuc2l0eSYmKGcuZW1pc3NpdmVJbnRlbnNpdHk9YS5lbWlzc2l2ZUludGVuc2l0eSk7dm9pZCAwIT09YS5zcGVjdWxhck1hcCYmKGcuc3BlY3VsYXJNYXA9YyhhLnNwZWN1bGFyTWFwKSk7dm9pZCAwIT09YS5lbnZNYXAmJihnLmVudk1hcD1jKGEuZW52TWFwKSk7dm9pZCAwIT09YS5lbnZNYXBJbnRlbnNpdHkmJihnLmVudk1hcEludGVuc2l0eT1hLmVudk1hcEludGVuc2l0eSk7dm9pZCAwIT09YS5yZWZsZWN0aXZpdHkmJihnLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eSk7dm9pZCAwIT09YS5yZWZyYWN0aW9uUmF0aW8mJihnLnJlZnJhY3Rpb25SYXRpbz0KYS5yZWZyYWN0aW9uUmF0aW8pO3ZvaWQgMCE9PWEubGlnaHRNYXAmJihnLmxpZ2h0TWFwPWMoYS5saWdodE1hcCkpO3ZvaWQgMCE9PWEubGlnaHRNYXBJbnRlbnNpdHkmJihnLmxpZ2h0TWFwSW50ZW5zaXR5PWEubGlnaHRNYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWEuYW9NYXAmJihnLmFvTWFwPWMoYS5hb01hcCkpO3ZvaWQgMCE9PWEuYW9NYXBJbnRlbnNpdHkmJihnLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWEuZ3JhZGllbnRNYXAmJihnLmdyYWRpZW50TWFwPWMoYS5ncmFkaWVudE1hcCkpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoZy5jbGVhcmNvYXROb3JtYWxNYXA9YyhhLmNsZWFyY29hdE5vcm1hbE1hcCkpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUmJihnLmNsZWFyY29hdE5vcm1hbFNjYWxlPShuZXcgZikuZnJvbUFycmF5KGEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpKTtyZXR1cm4gZ30sc2V0VGV4dHVyZXM6ZnVuY3Rpb24oYSl7dGhpcy50ZXh0dXJlcz0KYTtyZXR1cm4gdGhpc319KTt2YXIgUGk9e2RlY29kZVRleHQ6ZnVuY3Rpb24oYSl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgVGV4dERlY29kZXIpcmV0dXJuKG5ldyBUZXh0RGVjb2RlcikuZGVjb2RlKGEpO2Zvcih2YXIgYz0iIixlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKWMrPVN0cmluZy5mcm9tQ2hhckNvZGUoYVtlXSk7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGMpKX1jYXRjaChyKXtyZXR1cm4gY319LGV4dHJhY3RVcmxCYXNlOmZ1bmN0aW9uKGEpe3ZhciBjPWEubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4tMT09PWM/Ii4vIjphLnN1YnN0cigwLGMrMSl9fTtXZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOldnLGlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6ITAsY29weTpmdW5jdGlvbihhKXt2YS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5tYXhJbnN0YW5jZWRDb3VudD0KYS5tYXhJbnN0YW5jZWRDb3VudDtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXZhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLm1heEluc3RhbmNlZENvdW50PXRoaXMubWF4SW5zdGFuY2VkQ291bnQ7YS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PSEwO3JldHVybiBhfX0pO1hnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpYZyxpc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTohMCxjb3B5OmZ1bmN0aW9uKGEpe1EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMubWVzaFBlckF0dHJpYnV0ZT1hLm1lc2hQZXJBdHRyaWJ1dGU7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPVEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EubWVzaFBlckF0dHJpYnV0ZT0KdGhpcy5tZXNoUGVyQXR0cmlidXRlO2EuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITA7cmV0dXJuIGF9fSk7WWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpZZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj1uZXcgdWMoci5tYW5hZ2VyKTt2LnNldFBhdGgoci5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtjKHIucGFyc2UoSlNPTi5wYXJzZSh6KSkpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXt2YXIgYz1hLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk/bmV3IFdnOm5ldyB2YSxlPWEuZGF0YS5pbmRleDtpZih2b2lkIDAhPT1lKXt2YXIgZz1uZXcgUWlbZS50eXBlXShlLmFycmF5KTtjLnNldEluZGV4KG5ldyBRKGcsMSkpfWU9YS5kYXRhLmF0dHJpYnV0ZXM7Zm9yKHZhciByIGluIGUpe3ZhciB2PWVbcl07Zz1uZXcgUWlbdi50eXBlXSh2LmFycmF5KTtnPW5ldyAodi5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT8KWGc6USkoZyx2Lml0ZW1TaXplLHYubm9ybWFsaXplZCk7dm9pZCAwIT09di5uYW1lJiYoZy5uYW1lPXYubmFtZSk7Yy5hZGRBdHRyaWJ1dGUocixnKX12YXIgej1hLmRhdGEubW9ycGhBdHRyaWJ1dGVzO2lmKHopZm9yKHIgaW4geil7dmFyIEU9eltyXSxGPVtdO2U9MDtmb3IodmFyIEo9RS5sZW5ndGg7ZTxKO2UrKyl2PUVbZV0sZz1uZXcgUWlbdi50eXBlXSh2LmFycmF5KSxnPW5ldyBRKGcsdi5pdGVtU2l6ZSx2Lm5vcm1hbGl6ZWQpLHZvaWQgMCE9PXYubmFtZSYmKGcubmFtZT12Lm5hbWUpLEYucHVzaChnKTtjLm1vcnBoQXR0cmlidXRlc1tyXT1GfXI9YS5kYXRhLmdyb3Vwc3x8YS5kYXRhLmRyYXdjYWxsc3x8YS5kYXRhLm9mZnNldHM7aWYodm9pZCAwIT09cilmb3IoZT0wLHY9ci5sZW5ndGg7ZSE9PXY7KytlKWc9cltlXSxjLmFkZEdyb3VwKGcuc3RhcnQsZy5jb3VudCxnLm1hdGVyaWFsSW5kZXgpO2U9YS5kYXRhLmJvdW5kaW5nU3BoZXJlO3ZvaWQgMCE9PWUmJihyPW5ldyBrLAp2b2lkIDAhPT1lLmNlbnRlciYmci5mcm9tQXJyYXkoZS5jZW50ZXIpLGMuYm91bmRpbmdTcGhlcmU9bmV3IEcocixlLnJhZGl1cykpO2EubmFtZSYmKGMubmFtZT1hLm5hbWUpO2EudXNlckRhdGEmJihjLnVzZXJEYXRhPWEudXNlckRhdGEpO3JldHVybiBjfX0pO3ZhciBRaT17SW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXk6InVuZGVmaW5lZCIhPT10eXBlb2YgVWludDhDbGFtcGVkQXJyYXk/VWludDhDbGFtcGVkQXJyYXk6VWludDhBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF5LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheX07WmcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpaZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj0iIj09PXRoaXMucGF0aD9QaS5leHRyYWN0VXJsQmFzZShhKTp0aGlzLnBhdGg7dGhpcy5yZXNvdXJjZVBhdGg9CnRoaXMucmVzb3VyY2VQYXRofHx2O3Y9bmV3IHVjKHIubWFuYWdlcik7di5zZXRQYXRoKHRoaXMucGF0aCk7di5sb2FkKGEsZnVuY3Rpb24oeil7dmFyIEU9bnVsbDt0cnl7RT1KU09OLnBhcnNlKHopfWNhdGNoKEYpe3ZvaWQgMCE9PWcmJmcoRik7Y29uc29sZS5lcnJvcigiVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW4ndCBwYXJzZSAiK2ErIi4iLEYubWVzc2FnZSk7cmV0dXJufXo9RS5tZXRhZGF0YTt2b2lkIDA9PT16fHx2b2lkIDA9PT16LnR5cGV8fCJnZW9tZXRyeSI9PT16LnR5cGUudG9Mb3dlckNhc2UoKT9jb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIithKTpyLnBhcnNlKEUsYyl9LGUsZyl9LHBhcnNlOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5wYXJzZVNoYXBlKGEuc2hhcGVzKTtlPXRoaXMucGFyc2VHZW9tZXRyaWVzKGEuZ2VvbWV0cmllcyxlKTt2YXIgZz10aGlzLnBhcnNlSW1hZ2VzKGEuaW1hZ2VzLGZ1bmN0aW9uKCl7dm9pZCAwIT09CmMmJmMocil9KTtnPXRoaXMucGFyc2VUZXh0dXJlcyhhLnRleHR1cmVzLGcpO2c9dGhpcy5wYXJzZU1hdGVyaWFscyhhLm1hdGVyaWFscyxnKTt2YXIgcj10aGlzLnBhcnNlT2JqZWN0KGEub2JqZWN0LGUsZyk7YS5hbmltYXRpb25zJiYoci5hbmltYXRpb25zPXRoaXMucGFyc2VBbmltYXRpb25zKGEuYW5pbWF0aW9ucykpO3ZvaWQgMCE9PWEuaW1hZ2VzJiYwIT09YS5pbWFnZXMubGVuZ3RofHx2b2lkIDA9PT1jfHxjKHIpO3JldHVybiByfSxwYXJzZVNoYXBlOmZ1bmN0aW9uKGEpe3ZhciBjPXt9O2lmKHZvaWQgMCE9PWEpZm9yKHZhciBlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXt2YXIgcj0obmV3IENkKS5mcm9tSlNPTihhW2VdKTtjW3IudXVpZF09cn1yZXR1cm4gY30scGFyc2VHZW9tZXRyaWVzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9e307aWYodm9pZCAwIT09YSlmb3IodmFyIGc9bmV3IFlnLHI9MCx2PWEubGVuZ3RoO3I8djtyKyspe3ZhciB6PWFbcl07c3dpdGNoKHoudHlwZSl7Y2FzZSAiUGxhbmVHZW9tZXRyeSI6Y2FzZSAiUGxhbmVCdWZmZXJHZW9tZXRyeSI6dmFyIEU9Cm5ldyBnY1t6LnR5cGVdKHoud2lkdGgsei5oZWlnaHQsei53aWR0aFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMpO2JyZWFrO2Nhc2UgIkJveEdlb21ldHJ5IjpjYXNlICJCb3hCdWZmZXJHZW9tZXRyeSI6Y2FzZSAiQ3ViZUdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoud2lkdGgsei5oZWlnaHQsei5kZXB0aCx6LndpZHRoU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6LmRlcHRoU2VnbWVudHMpO2JyZWFrO2Nhc2UgIkNpcmNsZUdlb21ldHJ5IjpjYXNlICJDaXJjbGVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnJhZGl1cyx6LnNlZ21lbnRzLHoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJDeWxpbmRlckdlb21ldHJ5IjpjYXNlICJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzVG9wLHoucmFkaXVzQm90dG9tLHouaGVpZ2h0LHoucmFkaWFsU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6Lm9wZW5FbmRlZCwKei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIkNvbmVHZW9tZXRyeSI6Y2FzZSAiQ29uZUJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHouaGVpZ2h0LHoucmFkaWFsU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6Lm9wZW5FbmRlZCx6LnRoZXRhU3RhcnQsei50aGV0YUxlbmd0aCk7YnJlYWs7Y2FzZSAiU3BoZXJlR2VvbWV0cnkiOmNhc2UgIlNwaGVyZUJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHoud2lkdGhTZWdtZW50cyx6LmhlaWdodFNlZ21lbnRzLHoucGhpU3RhcnQsei5waGlMZW5ndGgsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIkRvZGVjYWhlZHJvbkdlb21ldHJ5IjpjYXNlICJEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSI6Y2FzZSAiSWNvc2FoZWRyb25HZW9tZXRyeSI6Y2FzZSAiSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSI6Y2FzZSAiT2N0YWhlZHJvbkdlb21ldHJ5IjpjYXNlICJPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIlRldHJhaGVkcm9uR2VvbWV0cnkiOmNhc2UgIlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOkU9Cm5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHouZGV0YWlsKTticmVhaztjYXNlICJSaW5nR2VvbWV0cnkiOmNhc2UgIlJpbmdCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LmlubmVyUmFkaXVzLHoub3V0ZXJSYWRpdXMsei50aGV0YVNlZ21lbnRzLHoucGhpU2VnbWVudHMsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIlRvcnVzR2VvbWV0cnkiOmNhc2UgIlRvcnVzQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGdjW3oudHlwZV0oei5yYWRpdXMsei50dWJlLHoucmFkaWFsU2VnbWVudHMsei50dWJ1bGFyU2VnbWVudHMsei5hcmMpO2JyZWFrO2Nhc2UgIlRvcnVzS25vdEdlb21ldHJ5IjpjYXNlICJUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnJhZGl1cyx6LnR1YmUsei50dWJ1bGFyU2VnbWVudHMsei5yYWRpYWxTZWdtZW50cyx6LnAsei5xKTticmVhaztjYXNlICJUdWJlR2VvbWV0cnkiOmNhc2UgIlR1YmVCdWZmZXJHZW9tZXRyeSI6RT0KbmV3IGdjW3oudHlwZV0oKG5ldyBPaVt6LnBhdGgudHlwZV0pLmZyb21KU09OKHoucGF0aCksei50dWJ1bGFyU2VnbWVudHMsei5yYWRpdXMsei5yYWRpYWxTZWdtZW50cyx6LmNsb3NlZCk7YnJlYWs7Y2FzZSAiTGF0aGVHZW9tZXRyeSI6Y2FzZSAiTGF0aGVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnBvaW50cyx6LnNlZ21lbnRzLHoucGhpU3RhcnQsei5waGlMZW5ndGgpO2JyZWFrO2Nhc2UgIlBvbHloZWRyb25HZW9tZXRyeSI6Y2FzZSAiUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoudmVydGljZXMsei5pbmRpY2VzLHoucmFkaXVzLHouZGV0YWlscyk7YnJlYWs7Y2FzZSAiU2hhcGVHZW9tZXRyeSI6Y2FzZSAiU2hhcGVCdWZmZXJHZW9tZXRyeSI6RT1bXTtmb3IodmFyIEY9MCxKPXouc2hhcGVzLmxlbmd0aDtGPEo7RisrKXt2YXIgUD1jW3ouc2hhcGVzW0ZdXTtFLnB1c2goUCl9RT1uZXcgZ2Nbei50eXBlXShFLHouY3VydmVTZWdtZW50cyk7CmJyZWFrO2Nhc2UgIkV4dHJ1ZGVHZW9tZXRyeSI6Y2FzZSAiRXh0cnVkZUJ1ZmZlckdlb21ldHJ5IjpFPVtdO0Y9MDtmb3IoSj16LnNoYXBlcy5sZW5ndGg7RjxKO0YrKylQPWNbei5zaGFwZXNbRl1dLEUucHVzaChQKTtGPXoub3B0aW9ucy5leHRydWRlUGF0aDt2b2lkIDAhPT1GJiYoei5vcHRpb25zLmV4dHJ1ZGVQYXRoPShuZXcgT2lbRi50eXBlXSkuZnJvbUpTT04oRikpO0U9bmV3IGdjW3oudHlwZV0oRSx6Lm9wdGlvbnMpO2JyZWFrO2Nhc2UgIkJ1ZmZlckdlb21ldHJ5IjpjYXNlICJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSI6RT1nLnBhcnNlKHopO2JyZWFrO2Nhc2UgIkdlb21ldHJ5IjoiVEhSRUUiaW4gd2luZG93JiYiTGVnYWN5SlNPTkxvYWRlciJpbiBUSFJFRT9FPShuZXcgVEhSRUUuTGVnYWN5SlNPTkxvYWRlcikucGFyc2Uoeix0aGlzLnJlc291cmNlUGF0aCkuZ2VvbWV0cnk6Y29uc29sZS5lcnJvcignVEhSRUUuT2JqZWN0TG9hZGVyOiBZb3UgaGF2ZSB0byBpbXBvcnQgTGVnYWN5SlNPTkxvYWRlciBpbiBvcmRlciBsb2FkIGdlb21ldHJ5IGRhdGEgb2YgdHlwZSAiR2VvbWV0cnkiLicpOwpicmVhaztkZWZhdWx0OmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlICInK3oudHlwZSsnIicpO2NvbnRpbnVlfUUudXVpZD16LnV1aWQ7dm9pZCAwIT09ei5uYW1lJiYoRS5uYW1lPXoubmFtZSk7ITA9PT1FLmlzQnVmZmVyR2VvbWV0cnkmJnZvaWQgMCE9PXoudXNlckRhdGEmJihFLnVzZXJEYXRhPXoudXNlckRhdGEpO2Vbei51dWlkXT1FfXJldHVybiBlfSxwYXJzZU1hdGVyaWFsczpmdW5jdGlvbihhLGMpe3ZhciBlPXt9LGc9e307aWYodm9pZCAwIT09YSl7dmFyIHI9bmV3IFZnO3Iuc2V0VGV4dHVyZXMoYyk7Yz0wO2Zvcih2YXIgdj1hLmxlbmd0aDtjPHY7YysrKXt2YXIgej1hW2NdO2lmKCJNdWx0aU1hdGVyaWFsIj09PXoudHlwZSl7Zm9yKHZhciBFPVtdLEY9MDtGPHoubWF0ZXJpYWxzLmxlbmd0aDtGKyspe3ZhciBKPXoubWF0ZXJpYWxzW0ZdO3ZvaWQgMD09PWVbSi51dWlkXSYmKGVbSi51dWlkXT1yLnBhcnNlKEopKTsKRS5wdXNoKGVbSi51dWlkXSl9Z1t6LnV1aWRdPUV9ZWxzZSB2b2lkIDA9PT1lW3oudXVpZF0mJihlW3oudXVpZF09ci5wYXJzZSh6KSksZ1t6LnV1aWRdPWVbei51dWlkXX19cmV0dXJuIGd9LHBhcnNlQW5pbWF0aW9uczpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz1hW2VdLHI9dGMucGFyc2UoZyk7dm9pZCAwIT09Zy51dWlkJiYoci51dWlkPWcudXVpZCk7Yy5wdXNoKHIpfXJldHVybiBjfSxwYXJzZUltYWdlczpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoUyl7Zy5tYW5hZ2VyLml0ZW1TdGFydChTKTtyZXR1cm4gdi5sb2FkKFMsZnVuY3Rpb24oKXtnLm1hbmFnZXIuaXRlbUVuZChTKX0sdm9pZCAwLGZ1bmN0aW9uKCl7Zy5tYW5hZ2VyLml0ZW1FcnJvcihTKTtnLm1hbmFnZXIuaXRlbUVuZChTKX0pfXZhciBnPXRoaXMscj17fTtpZih2b2lkIDAhPT1hJiYwPGEubGVuZ3RoKXtjPW5ldyAkaChjKTt2YXIgdj1uZXcgVWUoYyk7di5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTsKYz0wO2Zvcih2YXIgej1hLmxlbmd0aDtjPHo7YysrKXt2YXIgRT1hW2NdLEY9RS51cmw7aWYoQXJyYXkuaXNBcnJheShGKSl7cltFLnV1aWRdPVtdO2Zvcih2YXIgSj0wLFA9Ri5sZW5ndGg7SjxQO0orKyl7dmFyIFI9RltKXTtSPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KFIpP1I6Zy5yZXNvdXJjZVBhdGgrUjtyW0UudXVpZF0ucHVzaChlKFIpKX19ZWxzZSBSPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KEUudXJsKT9FLnVybDpnLnJlc291cmNlUGF0aCtFLnVybCxyW0UudXVpZF09ZShSKX19cmV0dXJuIHJ9LHBhcnNlVGV4dHVyZXM6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBlKEYsSil7aWYoIm51bWJlciI9PT10eXBlb2YgRilyZXR1cm4gRjtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlci5wYXJzZVRleHR1cmU6IENvbnN0YW50IHNob3VsZCBiZSBpbiBudW1lcmljIGZvcm0uIixGKTtyZXR1cm4gSltGXX12YXIgZz17fTtpZih2b2lkIDAhPT0KYSlmb3IodmFyIHI9MCx2PWEubGVuZ3RoO3I8djtyKyspe3ZhciB6PWFbcl07dm9pZCAwPT09ei5pbWFnZSYmY29uc29sZS53YXJuKCdUSFJFRS5PYmplY3RMb2FkZXI6IE5vICJpbWFnZSIgc3BlY2lmaWVkIGZvcicsei51dWlkKTt2b2lkIDA9PT1jW3ouaW1hZ2VdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGltYWdlIix6LmltYWdlKTt2YXIgRT1BcnJheS5pc0FycmF5KGNbei5pbWFnZV0pP25ldyBjZChjW3ouaW1hZ2VdKTpuZXcgbChjW3ouaW1hZ2VdKTtFLm5lZWRzVXBkYXRlPSEwO0UudXVpZD16LnV1aWQ7dm9pZCAwIT09ei5uYW1lJiYoRS5uYW1lPXoubmFtZSk7dm9pZCAwIT09ei5tYXBwaW5nJiYoRS5tYXBwaW5nPWUoei5tYXBwaW5nLExtKSk7dm9pZCAwIT09ei5vZmZzZXQmJkUub2Zmc2V0LmZyb21BcnJheSh6Lm9mZnNldCk7dm9pZCAwIT09ei5yZXBlYXQmJkUucmVwZWF0LmZyb21BcnJheSh6LnJlcGVhdCk7dm9pZCAwIT09ei5jZW50ZXImJgpFLmNlbnRlci5mcm9tQXJyYXkoei5jZW50ZXIpO3ZvaWQgMCE9PXoucm90YXRpb24mJihFLnJvdGF0aW9uPXoucm90YXRpb24pO3ZvaWQgMCE9PXoud3JhcCYmKEUud3JhcFM9ZSh6LndyYXBbMF0sc2spLEUud3JhcFQ9ZSh6LndyYXBbMV0sc2spKTt2b2lkIDAhPT16LmZvcm1hdCYmKEUuZm9ybWF0PXouZm9ybWF0KTt2b2lkIDAhPT16LnR5cGUmJihFLnR5cGU9ei50eXBlKTt2b2lkIDAhPT16LmVuY29kaW5nJiYoRS5lbmNvZGluZz16LmVuY29kaW5nKTt2b2lkIDAhPT16Lm1pbkZpbHRlciYmKEUubWluRmlsdGVyPWUoei5taW5GaWx0ZXIsdGspKTt2b2lkIDAhPT16Lm1hZ0ZpbHRlciYmKEUubWFnRmlsdGVyPWUoei5tYWdGaWx0ZXIsdGspKTt2b2lkIDAhPT16LmFuaXNvdHJvcHkmJihFLmFuaXNvdHJvcHk9ei5hbmlzb3Ryb3B5KTt2b2lkIDAhPT16LmZsaXBZJiYoRS5mbGlwWT16LmZsaXBZKTt2b2lkIDAhPT16LnByZW11bHRpcGx5QWxwaGEmJihFLnByZW11bHRpcGx5QWxwaGE9CnoucHJlbXVsdGlwbHlBbHBoYSk7dm9pZCAwIT09ei51bnBhY2tBbGlnbm1lbnQmJihFLnVucGFja0FsaWdubWVudD16LnVucGFja0FsaWdubWVudCk7Z1t6LnV1aWRdPUV9cmV0dXJuIGd9LHBhcnNlT2JqZWN0OmZ1bmN0aW9uKGEsYyxlKXtmdW5jdGlvbiBnKEope3ZvaWQgMD09PWNbSl0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnkiLEopO3JldHVybiBjW0pdfWZ1bmN0aW9uIHIoSil7aWYodm9pZCAwIT09Sil7aWYoQXJyYXkuaXNBcnJheShKKSl7Zm9yKHZhciBQPVtdLFI9MCxTPUoubGVuZ3RoO1I8UztSKyspe3ZhciBWPUpbUl07dm9pZCAwPT09ZVtWXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCIsVik7UC5wdXNoKGVbVl0pfXJldHVybiBQfXZvaWQgMD09PWVbSl0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLEopO3JldHVybiBlW0pdfX0Kc3dpdGNoKGEudHlwZSl7Y2FzZSAiU2NlbmUiOnZhciB2PW5ldyB5O3ZvaWQgMCE9PWEuYmFja2dyb3VuZCYmTnVtYmVyLmlzSW50ZWdlcihhLmJhY2tncm91bmQpJiYodi5iYWNrZ3JvdW5kPW5ldyBJKGEuYmFja2dyb3VuZCkpO3ZvaWQgMCE9PWEuZm9nJiYoIkZvZyI9PT1hLmZvZy50eXBlP3YuZm9nPW5ldyBBZyhhLmZvZy5jb2xvcixhLmZvZy5uZWFyLGEuZm9nLmZhcik6IkZvZ0V4cDIiPT09YS5mb2cudHlwZSYmKHYuZm9nPW5ldyB6ZyhhLmZvZy5jb2xvcixhLmZvZy5kZW5zaXR5KSkpO2JyZWFrO2Nhc2UgIlBlcnNwZWN0aXZlQ2FtZXJhIjp2PW5ldyB2YihhLmZvdixhLmFzcGVjdCxhLm5lYXIsYS5mYXIpO3ZvaWQgMCE9PWEuZm9jdXMmJih2LmZvY3VzPWEuZm9jdXMpO3ZvaWQgMCE9PWEuem9vbSYmKHYuem9vbT1hLnpvb20pO3ZvaWQgMCE9PWEuZmlsbUdhdWdlJiYodi5maWxtR2F1Z2U9YS5maWxtR2F1Z2UpO3ZvaWQgMCE9PWEuZmlsbU9mZnNldCYmKHYuZmlsbU9mZnNldD0KYS5maWxtT2Zmc2V0KTt2b2lkIDAhPT1hLnZpZXcmJih2LnZpZXc9T2JqZWN0LmFzc2lnbih7fSxhLnZpZXcpKTticmVhaztjYXNlICJPcnRob2dyYXBoaWNDYW1lcmEiOnY9bmV3IGJnKGEubGVmdCxhLnJpZ2h0LGEudG9wLGEuYm90dG9tLGEubmVhcixhLmZhcik7dm9pZCAwIT09YS56b29tJiYodi56b29tPWEuem9vbSk7dm9pZCAwIT09YS52aWV3JiYodi52aWV3PU9iamVjdC5hc3NpZ24oe30sYS52aWV3KSk7YnJlYWs7Y2FzZSAiQW1iaWVudExpZ2h0Ijp2PW5ldyBUZyhhLmNvbG9yLGEuaW50ZW5zaXR5KTticmVhaztjYXNlICJEaXJlY3Rpb25hbExpZ2h0Ijp2PW5ldyBTZyhhLmNvbG9yLGEuaW50ZW5zaXR5KTticmVhaztjYXNlICJQb2ludExpZ2h0Ijp2PW5ldyBRZyhhLmNvbG9yLGEuaW50ZW5zaXR5LGEuZGlzdGFuY2UsYS5kZWNheSk7YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6dj1uZXcgVWcoYS5jb2xvcixhLmludGVuc2l0eSxhLndpZHRoLGEuaGVpZ2h0KTticmVhazsKY2FzZSAiU3BvdExpZ2h0Ijp2PW5ldyBQZyhhLmNvbG9yLGEuaW50ZW5zaXR5LGEuZGlzdGFuY2UsYS5hbmdsZSxhLnBlbnVtYnJhLGEuZGVjYXkpO2JyZWFrO2Nhc2UgIkhlbWlzcGhlcmVMaWdodCI6dj1uZXcgTmcoYS5jb2xvcixhLmdyb3VuZENvbG9yLGEuaW50ZW5zaXR5KTticmVhaztjYXNlICJTa2lubmVkTWVzaCI6Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VPYmplY3QoKSBkb2VzIG5vdCBzdXBwb3J0IFNraW5uZWRNZXNoIHlldC4iKTtjYXNlICJNZXNoIjp2PWcoYS5nZW9tZXRyeSk7dmFyIHo9cihhLm1hdGVyaWFsKTt2PXYuYm9uZXMmJjA8di5ib25lcy5sZW5ndGg/bmV3IEJmKHYseik6bmV3IHhhKHYseik7dm9pZCAwIT09YS5kcmF3TW9kZSYmdi5zZXREcmF3TW9kZShhLmRyYXdNb2RlKTticmVhaztjYXNlICJMT0QiOnY9bmV3IEFmO2JyZWFrO2Nhc2UgIkxpbmUiOnY9bmV3IFZiKGcoYS5nZW9tZXRyeSkscihhLm1hdGVyaWFsKSxhLm1vZGUpOwpicmVhaztjYXNlICJMaW5lTG9vcCI6dj1uZXcgRGcoZyhhLmdlb21ldHJ5KSxyKGEubWF0ZXJpYWwpKTticmVhaztjYXNlICJMaW5lU2VnbWVudHMiOnY9bmV3IEliKGcoYS5nZW9tZXRyeSkscihhLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiUG9pbnRDbG91ZCI6Y2FzZSAiUG9pbnRzIjp2PW5ldyBDZShnKGEuZ2VvbWV0cnkpLHIoYS5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIlNwcml0ZSI6dj1uZXcgeWYocihhLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiR3JvdXAiOnY9bmV3IHVlO2JyZWFrO2RlZmF1bHQ6dj1uZXcgQX12LnV1aWQ9YS51dWlkO3ZvaWQgMCE9PWEubmFtZSYmKHYubmFtZT1hLm5hbWUpO3ZvaWQgMCE9PWEubWF0cml4Pyh2Lm1hdHJpeC5mcm9tQXJyYXkoYS5tYXRyaXgpLHZvaWQgMCE9PWEubWF0cml4QXV0b1VwZGF0ZSYmKHYubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGUpLHYubWF0cml4QXV0b1VwZGF0ZSYmdi5tYXRyaXguZGVjb21wb3NlKHYucG9zaXRpb24sCnYucXVhdGVybmlvbix2LnNjYWxlKSk6KHZvaWQgMCE9PWEucG9zaXRpb24mJnYucG9zaXRpb24uZnJvbUFycmF5KGEucG9zaXRpb24pLHZvaWQgMCE9PWEucm90YXRpb24mJnYucm90YXRpb24uZnJvbUFycmF5KGEucm90YXRpb24pLHZvaWQgMCE9PWEucXVhdGVybmlvbiYmdi5xdWF0ZXJuaW9uLmZyb21BcnJheShhLnF1YXRlcm5pb24pLHZvaWQgMCE9PWEuc2NhbGUmJnYuc2NhbGUuZnJvbUFycmF5KGEuc2NhbGUpKTt2b2lkIDAhPT1hLmNhc3RTaGFkb3cmJih2LmNhc3RTaGFkb3c9YS5jYXN0U2hhZG93KTt2b2lkIDAhPT1hLnJlY2VpdmVTaGFkb3cmJih2LnJlY2VpdmVTaGFkb3c9YS5yZWNlaXZlU2hhZG93KTthLnNoYWRvdyYmKHZvaWQgMCE9PWEuc2hhZG93LmJpYXMmJih2LnNoYWRvdy5iaWFzPWEuc2hhZG93LmJpYXMpLHZvaWQgMCE9PWEuc2hhZG93LnJhZGl1cyYmKHYuc2hhZG93LnJhZGl1cz1hLnNoYWRvdy5yYWRpdXMpLHZvaWQgMCE9PWEuc2hhZG93Lm1hcFNpemUmJgp2LnNoYWRvdy5tYXBTaXplLmZyb21BcnJheShhLnNoYWRvdy5tYXBTaXplKSx2b2lkIDAhPT1hLnNoYWRvdy5jYW1lcmEmJih2LnNoYWRvdy5jYW1lcmE9dGhpcy5wYXJzZU9iamVjdChhLnNoYWRvdy5jYW1lcmEpKSk7dm9pZCAwIT09YS52aXNpYmxlJiYodi52aXNpYmxlPWEudmlzaWJsZSk7dm9pZCAwIT09YS5mcnVzdHVtQ3VsbGVkJiYodi5mcnVzdHVtQ3VsbGVkPWEuZnJ1c3R1bUN1bGxlZCk7dm9pZCAwIT09YS5yZW5kZXJPcmRlciYmKHYucmVuZGVyT3JkZXI9YS5yZW5kZXJPcmRlcik7dm9pZCAwIT09YS51c2VyRGF0YSYmKHYudXNlckRhdGE9YS51c2VyRGF0YSk7dm9pZCAwIT09YS5sYXllcnMmJih2LmxheWVycy5tYXNrPWEubGF5ZXJzKTtpZih2b2lkIDAhPT1hLmNoaWxkcmVuKXt6PWEuY2hpbGRyZW47Zm9yKHZhciBFPTA7RTx6Lmxlbmd0aDtFKyspdi5hZGQodGhpcy5wYXJzZU9iamVjdCh6W0VdLGMsZSkpfWlmKCJMT0QiPT09YS50eXBlKWZvcihhPWEubGV2ZWxzLHo9CjA7ejxhLmxlbmd0aDt6Kyspe0U9YVt6XTt2YXIgRj12LmdldE9iamVjdEJ5UHJvcGVydHkoInV1aWQiLEUub2JqZWN0KTt2b2lkIDAhPT1GJiZ2LmFkZExldmVsKEYsRS5kaXN0YW5jZSl9cmV0dXJuIHZ9fSk7dmFyIExtPXtVVk1hcHBpbmc6MzAwLEN1YmVSZWZsZWN0aW9uTWFwcGluZzozMDEsQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOjMwMixFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzozMDMsRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6MzA0LFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nOjMwNSxDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzozMDYsQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6MzA3fSxzaz17UmVwZWF0V3JhcHBpbmc6MUUzLENsYW1wVG9FZGdlV3JhcHBpbmc6MTAwMSxNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOjEwMDJ9LHRrPXtOZWFyZXN0RmlsdGVyOjEwMDMsTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6MTAwNCxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOjEwMDUsCkxpbmVhckZpbHRlcjoxMDA2LExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6MTAwNyxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI6MTAwOH07ZWkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjplaSxzZXRPcHRpb25zOmZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucz1hO3JldHVybiB0aGlzfSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZvaWQgMD09PWEmJihhPSIiKTt2b2lkIDAhPT10aGlzLnBhdGgmJihhPXRoaXMucGF0aCthKTthPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGEpO3ZhciByPXRoaXMsdj1pZS5nZXQoYSk7aWYodm9pZCAwIT09dilyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyYmYyh2KTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sMCksdjtmZXRjaChhKS50aGVuKGZ1bmN0aW9uKHope3JldHVybiB6LmJsb2IoKX0pLnRoZW4oZnVuY3Rpb24oeil7cmV0dXJuIHZvaWQgMD09PQpyLm9wdGlvbnM/Y3JlYXRlSW1hZ2VCaXRtYXAoeik6Y3JlYXRlSW1hZ2VCaXRtYXAoeixyLm9wdGlvbnMpfSkudGhlbihmdW5jdGlvbih6KXtpZS5hZGQoYSx6KTtjJiZjKHopO3IubWFuYWdlci5pdGVtRW5kKGEpfSkuY2F0Y2goZnVuY3Rpb24oeil7ZyYmZyh6KTtyLm1hbmFnZXIuaXRlbUVycm9yKGEpO3IubWFuYWdlci5pdGVtRW5kKGEpfSk7ci5tYW5hZ2VyLml0ZW1TdGFydChhKX19KTtPYmplY3QuYXNzaWduKGZpLnByb3RvdHlwZSx7bW92ZVRvOmZ1bmN0aW9uKGEsYyl7dGhpcy5jdXJyZW50UGF0aD1uZXcgR2M7dGhpcy5zdWJQYXRocy5wdXNoKHRoaXMuY3VycmVudFBhdGgpO3RoaXMuY3VycmVudFBhdGgubW92ZVRvKGEsYyl9LGxpbmVUbzpmdW5jdGlvbihhLGMpe3RoaXMuY3VycmVudFBhdGgubGluZVRvKGEsYyl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKGEsYyxlLGcpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKGEsCmMsZSxnLHIsdil7dGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKGEsYyxlLGcscix2KX0sc3BsaW5lVGhydTpmdW5jdGlvbihhKXt0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUoYSl9LHRvU2hhcGVzOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZShmYSl7Zm9yKHZhciByYT1bXSxwYT0wLHFhPWZhLmxlbmd0aDtwYTxxYTtwYSsrKXt2YXIgdWE9ZmFbcGFdLG9hPW5ldyBDZDtvYS5jdXJ2ZXM9dWEuY3VydmVzO3JhLnB1c2gob2EpfXJldHVybiByYX1mdW5jdGlvbiBnKGZhLHJhKXtmb3IodmFyIHBhPXJhLmxlbmd0aCxxYT0hMSx1YT1wYS0xLG9hPTA7b2E8cGE7dWE9b2ErKyl7dmFyIHRhPXJhW3VhXSxCYT1yYVtvYV0sVGE9QmEueC10YS54LFVhPUJhLnktdGEueTtpZihNYXRoLmFicyhVYSk+TnVtYmVyLkVQU0lMT04pe2lmKDA+VWEmJih0YT1yYVtvYV0sVGE9LVRhLEJhPXJhW3VhXSxVYT0tVWEpLCEoZmEueTx0YS55fHxmYS55PkJhLnkpKWlmKGZhLnk9PT10YS55KXtpZihmYS54PT09CnRhLngpcmV0dXJuITB9ZWxzZXt1YT1VYSooZmEueC10YS54KS1UYSooZmEueS10YS55KTtpZigwPT09dWEpcmV0dXJuITA7MD51YXx8KHFhPSFxYSl9fWVsc2UgaWYoZmEueT09PXRhLnkmJihCYS54PD1mYS54JiZmYS54PD10YS54fHx0YS54PD1mYS54JiZmYS54PD1CYS54KSlyZXR1cm4hMH1yZXR1cm4gcWF9dmFyIHI9ZWQuaXNDbG9ja1dpc2Usdj10aGlzLnN1YlBhdGhzO2lmKDA9PT12Lmxlbmd0aClyZXR1cm5bXTtpZighMD09PWMpcmV0dXJuIGUodik7Yz1bXTtpZigxPT09di5sZW5ndGgpe3ZhciB6PXZbMF07dmFyIEU9bmV3IENkO0UuY3VydmVzPXouY3VydmVzO2MucHVzaChFKTtyZXR1cm4gY312YXIgRj0hcih2WzBdLmdldFBvaW50cygpKTtGPWE/IUY6RjtFPVtdO3ZhciBKPVtdLFA9W10sUj0wO0pbUl09dm9pZCAwO1BbUl09W107Zm9yKHZhciBTPTAsVj12Lmxlbmd0aDtTPFY7UysrKXt6PXZbU107dmFyIFc9ei5nZXRQb2ludHMoKTt2YXIgaGE9cihXKTsoaGE9YT8haGE6CmhhKT8oIUYmJkpbUl0mJlIrKyxKW1JdPXtzOm5ldyBDZCxwOld9LEpbUl0ucy5jdXJ2ZXM9ei5jdXJ2ZXMsRiYmUisrLFBbUl09W10pOlBbUl0ucHVzaCh7aDp6LHA6V1swXX0pfWlmKCFKWzBdKXJldHVybiBlKHYpO2lmKDE8Si5sZW5ndGgpe1M9ITE7YT1bXTtyPTA7Zm9yKHY9Si5sZW5ndGg7cjx2O3IrKylFW3JdPVtdO3I9MDtmb3Iodj1KLmxlbmd0aDtyPHY7cisrKWZvcih6PVBbcl0saGE9MDtoYTx6Lmxlbmd0aDtoYSsrKXtGPXpbaGFdO1I9ITA7Zm9yKFc9MDtXPEoubGVuZ3RoO1crKylnKEYucCxKW1ddLnApJiYociE9PVcmJmEucHVzaCh7ZnJvbXM6cix0b3M6Vyxob2xlOmhhfSksUj8oUj0hMSxFW1ddLnB1c2goRikpOlM9ITApO1ImJkVbcl0ucHVzaChGKX0wPGEubGVuZ3RoJiYoU3x8KFA9RSkpfVM9MDtmb3Iocj1KLmxlbmd0aDtTPHI7UysrKWZvcihFPUpbU10ucyxjLnB1c2goRSksYT1QW1NdLHY9MCx6PWEubGVuZ3RoO3Y8ejt2KyspRS5ob2xlcy5wdXNoKGFbdl0uaCk7CnJldHVybiBjfX0pO09iamVjdC5hc3NpZ24oZ2kucHJvdG90eXBlLHtpc0ZvbnQ6ITAsZ2VuZXJhdGVTaGFwZXM6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0xMDApO3ZhciBlPVtdO2E9dm0oYSxjLHRoaXMuZGF0YSk7Yz0wO2Zvcih2YXIgZz1hLmxlbmd0aDtjPGc7YysrKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGUsYVtjXS50b1NoYXBlcygpKTtyZXR1cm4gZX19KTtoaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmhpLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcyx2PW5ldyB1Yyh0aGlzLm1hbmFnZXIpO3Yuc2V0UGF0aCh0aGlzLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope3RyeXt2YXIgRT1KU09OLnBhcnNlKHopfWNhdGNoKEYpe2NvbnNvbGUud2FybigiVEhSRUUuRm9udExvYWRlcjogdHlwZWZhY2UuanMgc3VwcG9ydCBpcyBiZWluZyBkZXByZWNhdGVkLiBVc2UgdHlwZWZhY2UuanNvbiBpbnN0ZWFkLiIpLApFPUpTT04ucGFyc2Uoei5zdWJzdHJpbmcoNjUsei5sZW5ndGgtMikpfXo9ci5wYXJzZShFKTtjJiZjKHopfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IGdpKGEpfX0pO3ZhciB5aCxtaT17Z2V0Q29udGV4dDpmdW5jdGlvbigpe3ZvaWQgMD09PXloJiYoeWg9bmV3ICh3aW5kb3cuQXVkaW9Db250ZXh0fHx3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0KSk7cmV0dXJuIHlofSxzZXRDb250ZXh0OmZ1bmN0aW9uKGEpe3loPWF9fTskZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOiRnLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9bmV3IHVjKHRoaXMubWFuYWdlcik7ci5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7ci5zZXRQYXRoKHRoaXMucGF0aCk7ci5sb2FkKGEsZnVuY3Rpb24odil7dj12LnNsaWNlKDApO21pLmdldENvbnRleHQoKS5kZWNvZGVBdWRpb0RhdGEodixmdW5jdGlvbih6KXtjKHopfSl9LAplLGcpfX0pO09iamVjdC5hc3NpZ24oYWgucHJvdG90eXBlLHtpc1NwaGVyaWNhbEhhcm1vbmljczM6ITAsc2V0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzk+YztjKyspdGhpcy5jb2VmZmljaWVudHNbY10uY29weShhW2NdKTtyZXR1cm4gdGhpc30semVybzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wOzk+YTthKyspdGhpcy5jb2VmZmljaWVudHNbYV0uc2V0KDAsMCwwKTtyZXR1cm4gdGhpc30sZ2V0QXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLngsZz1hLnk7YT1hLno7dmFyIHI9dGhpcy5jb2VmZmljaWVudHM7Yy5jb3B5KHJbMF0pLm11bHRpcGx5U2NhbGFyKC4yODIwOTUpO2MuYWRkU2NhbGUoclsxXSwuNDg4NjAzKmcpO2MuYWRkU2NhbGUoclsyXSwuNDg4NjAzKmEpO2MuYWRkU2NhbGUoclszXSwuNDg4NjAzKmUpO2MuYWRkU2NhbGUocls0XSwxLjA5MjU0OCplKmcpO2MuYWRkU2NhbGUocls1XSwxLjA5MjU0OCpnKmEpO2MuYWRkU2NhbGUocls2XSwuMzE1MzkyKigzKmEqYS0xKSk7CmMuYWRkU2NhbGUocls3XSwxLjA5MjU0OCplKmEpO2MuYWRkU2NhbGUocls4XSwuNTQ2Mjc0KihlKmUtZypnKSk7cmV0dXJuIGN9LGdldElycmFkaWFuY2VBdDpmdW5jdGlvbihhLGMpe3ZhciBlPWEueCxnPWEueTthPWEuejt2YXIgcj10aGlzLmNvZWZmaWNpZW50cztjLmNvcHkoclswXSkubXVsdGlwbHlTY2FsYXIoLjg4NjIyNyk7Yy5hZGRTY2FsZShyWzFdLDEuMDIzMzI4KmcpO2MuYWRkU2NhbGUoclsyXSwxLjAyMzMyOCphKTtjLmFkZFNjYWxlKHJbM10sMS4wMjMzMjgqZSk7Yy5hZGRTY2FsZShyWzRdLC44NTgwODYqZSpnKTtjLmFkZFNjYWxlKHJbNV0sLjg1ODA4NipnKmEpO2MuYWRkU2NhbGUocls2XSwuNzQzMTI1KmEqYS0uMjQ3NzA4KTtjLmFkZFNjYWxlKHJbN10sLjg1ODA4NiplKmEpO2MuYWRkU2NhbGUocls4XSwuNDI5MDQzKihlKmUtZypnKSk7cmV0dXJuIGN9LGFkZDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuY29lZmZpY2llbnRzW2NdLmFkZChhLmNvZWZmaWNpZW50c1tjXSk7CnJldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuY29lZmZpY2llbnRzW2NdLm11bHRpcGx5U2NhbGFyKGEpO3JldHVybiB0aGlzfSxsZXJwOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5sZXJwKGEuY29lZmZpY2llbnRzW2VdLGMpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7OT5jO2MrKylpZighdGhpcy5jb2VmZmljaWVudHNbY10uZXF1YWxzKGEuY29lZmZpY2llbnRzW2NdKSlyZXR1cm4hMTtyZXR1cm4hMH0sY29weTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXQoYS5jb2VmZmljaWVudHMpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPXRoaXMuY29lZmZpY2llbnRzLGc9MDs5Pmc7ZysrKWVbZ10uZnJvbUFycmF5KGEsCmMrMypnKTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTtmb3IodmFyIGU9dGhpcy5jb2VmZmljaWVudHMsZz0wOzk+ZztnKyspZVtnXS50b0FycmF5KGEsYyszKmcpO3JldHVybiBhfX0pO09iamVjdC5hc3NpZ24oYWgse2dldEJhc2lzQXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLngsZz1hLnk7YT1hLno7Y1swXT0uMjgyMDk1O2NbMV09LjQ4ODYwMypnO2NbMl09LjQ4ODYwMyphO2NbM109LjQ4ODYwMyplO2NbNF09MS4wOTI1NDgqZSpnO2NbNV09MS4wOTI1NDgqZyphO2NbNl09LjMxNTM5MiooMyphKmEtMSk7Y1s3XT0xLjA5MjU0OCplKmE7Y1s4XT0uNTQ2Mjc0KihlKmUtZypnKX19KTtIYy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkhjLGlzTGlnaHRQcm9iZTohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5zaC5jb3B5KGEuc2gpO3RoaXMuaW50ZW5zaXR5PWEuaW50ZW5zaXR5O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7cmV0dXJuIEpiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpfX0pO2lpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6aWksaXNIZW1pc3BoZXJlTGlnaHRQcm9iZTohMCxjb3B5OmZ1bmN0aW9uKGEpe0hjLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGEpe3JldHVybiBIYy5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKX19KTtqaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEhjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmppLGlzQW1iaWVudExpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihhKXtIYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXtyZXR1cm4gSGMucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsCmEpfX0pO3ZhciB1az1uZXcgcSx2az1uZXcgcTtPYmplY3QuYXNzaWduKFFqLnByb3RvdHlwZSx7dXBkYXRlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2NhY2hlO2lmKGMuZm9jdXMhPT1hLmZvY3VzfHxjLmZvdiE9PWEuZm92fHxjLmFzcGVjdCE9PWEuYXNwZWN0KnRoaXMuYXNwZWN0fHxjLm5lYXIhPT1hLm5lYXJ8fGMuZmFyIT09YS5mYXJ8fGMuem9vbSE9PWEuem9vbXx8Yy5leWVTZXAhPT10aGlzLmV5ZVNlcCl7Yy5mb2N1cz1hLmZvY3VzO2MuZm92PWEuZm92O2MuYXNwZWN0PWEuYXNwZWN0KnRoaXMuYXNwZWN0O2MubmVhcj1hLm5lYXI7Yy5mYXI9YS5mYXI7Yy56b29tPWEuem9vbTtjLmV5ZVNlcD10aGlzLmV5ZVNlcDt2YXIgZT1hLnByb2plY3Rpb25NYXRyaXguY2xvbmUoKSxnPWMuZXllU2VwLzIscj1nKmMubmVhci9jLmZvY3VzLHY9Yy5uZWFyKk1hdGgudGFuKGhiLkRFRzJSQUQqYy5mb3YqLjUpL2Muem9vbTt2ay5lbGVtZW50c1sxMl09LWc7dWsuZWxlbWVudHNbMTJdPQpnO2c9LXYqYy5hc3BlY3Qrcjt2YXIgej12KmMuYXNwZWN0K3I7ZS5lbGVtZW50c1swXT0yKmMubmVhci8oei1nKTtlLmVsZW1lbnRzWzhdPSh6K2cpLyh6LWcpO3RoaXMuY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmNvcHkoZSk7Zz0tdipjLmFzcGVjdC1yO3o9dipjLmFzcGVjdC1yO2UuZWxlbWVudHNbMF09MipjLm5lYXIvKHotZyk7ZS5lbGVtZW50c1s4XT0oeitnKS8oei1nKTt0aGlzLmNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5jb3B5KGUpfXRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KGEubWF0cml4V29ybGQpLm11bHRpcGx5KHZrKTt0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weShhLm1hdHJpeFdvcmxkKS5tdWx0aXBseSh1ayl9fSk7T2JqZWN0LmFzc2lnbihraS5wcm90b3R5cGUse3N0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5vbGRUaW1lPXRoaXMuc3RhcnRUaW1lPSgidW5kZWZpbmVkIj09PXR5cGVvZiBwZXJmb3JtYW5jZT9EYXRlOnBlcmZvcm1hbmNlKS5ub3coKTsKdGhpcy5lbGFwc2VkVGltZT0wO3RoaXMucnVubmluZz0hMH0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZ2V0RWxhcHNlZFRpbWUoKTt0aGlzLmF1dG9TdGFydD10aGlzLnJ1bm5pbmc9ITF9LGdldEVsYXBzZWRUaW1lOmZ1bmN0aW9uKCl7dGhpcy5nZXREZWx0YSgpO3JldHVybiB0aGlzLmVsYXBzZWRUaW1lfSxnZXREZWx0YTpmdW5jdGlvbigpe3ZhciBhPTA7aWYodGhpcy5hdXRvU3RhcnQmJiF0aGlzLnJ1bm5pbmcpcmV0dXJuIHRoaXMuc3RhcnQoKSwwO2lmKHRoaXMucnVubmluZyl7dmFyIGM9KCJ1bmRlZmluZWQiPT09dHlwZW9mIHBlcmZvcm1hbmNlP0RhdGU6cGVyZm9ybWFuY2UpLm5vdygpO2E9KGMtdGhpcy5vbGRUaW1lKS8xRTM7dGhpcy5vbGRUaW1lPWM7dGhpcy5lbGFwc2VkVGltZSs9YX1yZXR1cm4gYX19KTt2YXIgamU9bmV3IGssd2s9bmV3IGgsTW09bmV3IGssa2U9bmV3IGs7bGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpsaSxnZXRJbnB1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW59LHJlbW92ZUZpbHRlcjpmdW5jdGlvbigpe251bGwhPT10aGlzLmZpbHRlciYmKHRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuZmlsdGVyKSx0aGlzLmZpbHRlci5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5nYWluLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmZpbHRlcj1udWxsKTtyZXR1cm4gdGhpc30sZ2V0RmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyfSxzZXRGaWx0ZXI6ZnVuY3Rpb24oYSl7bnVsbCE9PXRoaXMuZmlsdGVyPyh0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pKTp0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO3RoaXMuZmlsdGVyPWE7dGhpcy5nYWluLmNvbm5lY3QodGhpcy5maWx0ZXIpOwp0aGlzLmZpbHRlci5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7cmV0dXJuIHRoaXN9LGdldE1hc3RlclZvbHVtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX0sc2V0TWFzdGVyVm9sdW1lOmZ1bmN0aW9uKGEpe3RoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZShhLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpO3JldHVybiB0aGlzfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSk7YT10aGlzLmNvbnRleHQubGlzdGVuZXI7dmFyIGM9dGhpcy51cDt0aGlzLnRpbWVEZWx0YT10aGlzLl9jbG9jay5nZXREZWx0YSgpO3RoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKGplLHdrLE1tKTtrZS5zZXQoMCwwLC0xKS5hcHBseVF1YXRlcm5pb24od2spO2lmKGEucG9zaXRpb25YKXt2YXIgZT10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy50aW1lRGVsdGE7CmEucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGplLngsZSk7YS5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoamUueSxlKTthLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShqZS56LGUpO2EuZm9yd2FyZFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoa2UueCxlKTthLmZvcndhcmRZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGtlLnksZSk7YS5mb3J3YXJkWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShrZS56LGUpO2EudXBYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGMueCxlKTthLnVwWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShjLnksZSk7YS51cFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoYy56LGUpfWVsc2UgYS5zZXRQb3NpdGlvbihqZS54LGplLnksamUueiksYS5zZXRPcmllbnRhdGlvbihrZS54LGtlLnksa2UueixjLngsYy55LGMueil9fSk7V2UucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpXZSxnZXRPdXRwdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWlufSxzZXROb2RlU291cmNlOmZ1bmN0aW9uKGEpe3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSExO3RoaXMuc291cmNlVHlwZT0iYXVkaW9Ob2RlIjt0aGlzLnNvdXJjZT1hO3RoaXMuY29ubmVjdCgpO3JldHVybiB0aGlzfSxzZXRNZWRpYUVsZW1lbnRTb3VyY2U6ZnVuY3Rpb24oYSl7dGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9ITE7dGhpcy5zb3VyY2VUeXBlPSJtZWRpYU5vZGUiO3RoaXMuc291cmNlPXRoaXMuY29udGV4dC5jcmVhdGVNZWRpYUVsZW1lbnRTb3VyY2UoYSk7dGhpcy5jb25uZWN0KCk7cmV0dXJuIHRoaXN9LHNldEJ1ZmZlcjpmdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcj1hO3RoaXMuc291cmNlVHlwZT0iYnVmZmVyIjt0aGlzLmF1dG9wbGF5JiZ0aGlzLnBsYXkoKTtyZXR1cm4gdGhpc30scGxheTpmdW5jdGlvbigpe2lmKCEwPT09dGhpcy5pc1BsYXlpbmcpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLiIpOwplbHNlIGlmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtlbHNle3ZhciBhPXRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTthLmJ1ZmZlcj10aGlzLmJ1ZmZlcjthLmxvb3A9dGhpcy5sb29wO2Eub25lbmRlZD10aGlzLm9uRW5kZWQuYmluZCh0aGlzKTt0aGlzLnN0YXJ0VGltZT10aGlzLmNvbnRleHQuY3VycmVudFRpbWU7YS5zdGFydCh0aGlzLnN0YXJ0VGltZSx0aGlzLm9mZnNldCx0aGlzLmR1cmF0aW9uKTt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnNvdXJjZT1hO3RoaXMuc2V0RGV0dW5lKHRoaXMuZGV0dW5lKTt0aGlzLnNldFBsYXliYWNrUmF0ZSh0aGlzLnBsYXliYWNrUmF0ZSk7cmV0dXJuIHRoaXMuY29ubmVjdCgpfX0scGF1c2U6ZnVuY3Rpb24oKXtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7CmVsc2UgcmV0dXJuITA9PT10aGlzLmlzUGxheWluZyYmKHRoaXMuc291cmNlLnN0b3AoKSx0aGlzLnNvdXJjZS5vbmVuZGVkPW51bGwsdGhpcy5vZmZzZXQrPSh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUtdGhpcy5zdGFydFRpbWUpKnRoaXMucGxheWJhY2tSYXRlLHRoaXMuaXNQbGF5aW5nPSExKSx0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2UgcmV0dXJuIHRoaXMuc291cmNlLnN0b3AoKSx0aGlzLnNvdXJjZS5vbmVuZGVkPW51bGwsdGhpcy5vZmZzZXQ9MCx0aGlzLmlzUGxheWluZz0hMSx0aGlzfSxjb25uZWN0OmZ1bmN0aW9uKCl7aWYoMDx0aGlzLmZpbHRlcnMubGVuZ3RoKXt0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuZmlsdGVyc1swXSk7Zm9yKHZhciBhPTEsYz10aGlzLmZpbHRlcnMubGVuZ3RoO2E8YzthKyspdGhpcy5maWx0ZXJzW2EtCjFdLmNvbm5lY3QodGhpcy5maWx0ZXJzW2FdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpc30sZGlzY29ubmVjdDpmdW5jdGlvbigpe2lmKDA8dGhpcy5maWx0ZXJzLmxlbmd0aCl7dGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2Zvcih2YXIgYT0xLGM9dGhpcy5maWx0ZXJzLmxlbmd0aDthPGM7YSsrKXRoaXMuZmlsdGVyc1thLTFdLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzW2FdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpc30sZ2V0RmlsdGVyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcnN9LHNldEZpbHRlcnM6ZnVuY3Rpb24oYSl7YXx8CihhPVtdKTshMD09PXRoaXMuaXNQbGF5aW5nPyh0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZpbHRlcnM9YSx0aGlzLmNvbm5lY3QoKSk6dGhpcy5maWx0ZXJzPWE7cmV0dXJuIHRoaXN9LHNldERldHVuZTpmdW5jdGlvbihhKXt0aGlzLmRldHVuZT1hO2lmKHZvaWQgMCE9PXRoaXMuc291cmNlLmRldHVuZSlyZXR1cm4hMD09PXRoaXMuaXNQbGF5aW5nJiZ0aGlzLnNvdXJjZS5kZXR1bmUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMuZGV0dW5lLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9LGdldERldHVuZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRldHVuZX0sZ2V0RmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWzBdfSxzZXRGaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0RmlsdGVycyhhP1thXTpbXSl9LHNldFBsYXliYWNrUmF0ZTpmdW5jdGlvbihhKXtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7CmVsc2UgcmV0dXJuIHRoaXMucGxheWJhY2tSYXRlPWEsITA9PT10aGlzLmlzUGxheWluZyYmdGhpcy5zb3VyY2UucGxheWJhY2tSYXRlLnNldFRhcmdldEF0VGltZSh0aGlzLnBsYXliYWNrUmF0ZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfSxnZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGV9LG9uRW5kZWQ6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMX0sZ2V0TG9vcDpmdW5jdGlvbigpe3JldHVybiExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2w/KGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIiksITEpOnRoaXMubG9vcH0sc2V0TG9vcDpmdW5jdGlvbihhKXtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7ZWxzZSByZXR1cm4gdGhpcy5sb29wPQphLCEwPT09dGhpcy5pc1BsYXlpbmcmJih0aGlzLnNvdXJjZS5sb29wPXRoaXMubG9vcCksdGhpc30sZ2V0Vm9sdW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlfSxzZXRWb2x1bWU6ZnVuY3Rpb24oYSl7dGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKGEsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSk7cmV0dXJuIHRoaXN9fSk7dmFyIGxlPW5ldyBrLHhrPW5ldyBoLE5tPW5ldyBrLG1lPW5ldyBrO25pLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoV2UucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6bmksZ2V0T3V0cHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyfSxnZXRSZWZEaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZX0sc2V0UmVmRGlzdGFuY2U6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIucmVmRGlzdGFuY2U9YTtyZXR1cm4gdGhpc30sZ2V0Um9sbG9mZkZhY3RvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yfSwKc2V0Um9sbG9mZkZhY3RvcjpmdW5jdGlvbihhKXt0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yPWE7cmV0dXJuIHRoaXN9LGdldERpc3RhbmNlTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbH0sc2V0RGlzdGFuY2VNb2RlbDpmdW5jdGlvbihhKXt0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsPWE7cmV0dXJuIHRoaXN9LGdldE1heERpc3RhbmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlfSxzZXRNYXhEaXN0YW5jZTpmdW5jdGlvbihhKXt0aGlzLnBhbm5lci5tYXhEaXN0YW5jZT1hO3JldHVybiB0aGlzfSxzZXREaXJlY3Rpb25hbENvbmU6ZnVuY3Rpb24oYSxjLGUpe3RoaXMucGFubmVyLmNvbmVJbm5lckFuZ2xlPWE7dGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGU9Yzt0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluPWU7cmV0dXJuIHRoaXN9LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcywKYSk7aWYoITAhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbHx8ITEhPT10aGlzLmlzUGxheWluZylpZih0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShsZSx4ayxObSksbWUuc2V0KDAsMCwxKS5hcHBseVF1YXRlcm5pb24oeGspLGE9dGhpcy5wYW5uZXIsYS5wb3NpdGlvblgpe3ZhciBjPXRoaXMuY29udGV4dC5jdXJyZW50VGltZSt0aGlzLmxpc3RlbmVyLnRpbWVEZWx0YTthLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShsZS54LGMpO2EucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGxlLnksYyk7YS5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobGUueixjKTthLm9yaWVudGF0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShtZS54LGMpO2Eub3JpZW50YXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG1lLnksYyk7YS5vcmllbnRhdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobWUueixjKX1lbHNlIGEuc2V0UG9zaXRpb24obGUueCwKbGUueSxsZS56KSxhLnNldE9yaWVudGF0aW9uKG1lLngsbWUueSxtZS56KX19KTtPYmplY3QuYXNzaWduKG9pLnByb3RvdHlwZSx7Z2V0RnJlcXVlbmN5RGF0YTpmdW5jdGlvbigpe3RoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEodGhpcy5kYXRhKTtyZXR1cm4gdGhpcy5kYXRhfSxnZXRBdmVyYWdlRnJlcXVlbmN5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYz10aGlzLmdldEZyZXF1ZW5jeURhdGEoKSxlPTA7ZTxjLmxlbmd0aDtlKyspYSs9Y1tlXTtyZXR1cm4gYS9jLmxlbmd0aH19KTtPYmplY3QuYXNzaWduKHBpLnByb3RvdHlwZSx7YWNjdW11bGF0ZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuYnVmZmVyLGc9dGhpcy52YWx1ZVNpemU7YT1hKmcrZzt2YXIgcj10aGlzLmN1bXVsYXRpdmVXZWlnaHQ7aWYoMD09PXIpe2ZvcihyPTA7ciE9PWc7KytyKWVbYStyXT1lW3JdO3I9Y31lbHNlIHIrPWMsdGhpcy5fbWl4QnVmZmVyUmVnaW9uKGUsYSwwLGMvcixnKTt0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9CnJ9LGFwcGx5OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudmFsdWVTaXplLGU9dGhpcy5idWZmZXI7YT1hKmMrYzt2YXIgZz10aGlzLmN1bXVsYXRpdmVXZWlnaHQscj10aGlzLmJpbmRpbmc7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PTA7MT5nJiZ0aGlzLl9taXhCdWZmZXJSZWdpb24oZSxhLDMqYywxLWcsYyk7Zz1jO2Zvcih2YXIgdj1jK2M7ZyE9PXY7KytnKWlmKGVbZ10hPT1lW2crY10pe3Iuc2V0VmFsdWUoZSxhKTticmVha319LHNhdmVPcmlnaW5hbFN0YXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5idWZmZXIsYz10aGlzLnZhbHVlU2l6ZSxlPTMqYzt0aGlzLmJpbmRpbmcuZ2V0VmFsdWUoYSxlKTtmb3IodmFyIGc9YztnIT09ZTsrK2cpYVtnXT1hW2UrZyVjXTt0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MH0scmVzdG9yZU9yaWdpbmFsU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLmJpbmRpbmcuc2V0VmFsdWUodGhpcy5idWZmZXIsMyp0aGlzLnZhbHVlU2l6ZSl9LF9zZWxlY3Q6ZnVuY3Rpb24oYSwKYyxlLGcscil7aWYoLjU8PWcpZm9yKGc9MDtnIT09cjsrK2cpYVtjK2ddPWFbZStnXX0sX3NsZXJwOmZ1bmN0aW9uKGEsYyxlLGcpe2guc2xlcnBGbGF0KGEsYyxhLGMsYSxlLGcpfSxfbGVycDpmdW5jdGlvbihhLGMsZSxnLHIpe2Zvcih2YXIgdj0xLWcsej0wO3ohPT1yOysreil7dmFyIEU9Yyt6O2FbRV09YVtFXSp2K2FbZSt6XSpnfX19KTt2YXIgT209L1tcW1xdXC46XC9dL2csUG09IlteIisiXFxbXFxdXFwuOlxcLyIucmVwbGFjZSgiXFwuIiwiIikrIl0iLFFtPS8oKD86V0MrW1wvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCJXQyIsIlteXFxbXFxdXFwuOlxcL10iKSxSbT0vKFdDT0QrKT8vLnNvdXJjZS5yZXBsYWNlKCJXQ09EIixQbSksU209Lyg/OlwuKFdDKykoPzpcWyguKylcXSk/KT8vLnNvdXJjZS5yZXBsYWNlKCJXQyIsIlteXFxbXFxdXFwuOlxcL10iKSxUbT0vXC4oV0MrKSg/OlxbKC4rKVxdKT8vLnNvdXJjZS5yZXBsYWNlKCJXQyIsIlteXFxbXFxdXFwuOlxcL10iKSxVbT0KbmV3IFJlZ0V4cCgiXiIrUW0rUm0rU20rVG0rIiQiKSxWbT1bIm1hdGVyaWFsIiwibWF0ZXJpYWxzIiwiYm9uZXMiXTtPYmplY3QuYXNzaWduKFJqLnByb3RvdHlwZSx7Z2V0VmFsdWU6ZnVuY3Rpb24oYSxjKXt0aGlzLmJpbmQoKTt2YXIgZT10aGlzLl9iaW5kaW5nc1t0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c19dO3ZvaWQgMCE9PWUmJmUuZ2V0VmFsdWUoYSxjKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5fYmluZGluZ3MsZz10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18scj1lLmxlbmd0aDtnIT09cjsrK2cpZVtnXS5zZXRWYWx1ZShhLGMpfSxiaW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX2JpbmRpbmdzLGM9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLGU9YS5sZW5ndGg7YyE9PWU7KytjKWFbY10uYmluZCgpfSx1bmJpbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fYmluZGluZ3MsYz10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sCmU9YS5sZW5ndGg7YyE9PWU7KytjKWFbY10udW5iaW5kKCl9fSk7T2JqZWN0LmFzc2lnbigkYix7Q29tcG9zaXRlOlJqLGNyZWF0ZTpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIGEmJmEuaXNBbmltYXRpb25PYmplY3RHcm91cD9uZXcgJGIuQ29tcG9zaXRlKGEsYyxlKTpuZXcgJGIoYSxjLGUpfSxzYW5pdGl6ZU5vZGVOYW1lOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKE9tLCIiKX0scGFyc2VUcmFja05hbWU6ZnVuY3Rpb24oYSl7dmFyIGM9VW0uZXhlYyhhKTtpZighYyl0aHJvdyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAiK2EpO2M9e25vZGVOYW1lOmNbMl0sb2JqZWN0TmFtZTpjWzNdLG9iamVjdEluZGV4OmNbNF0scHJvcGVydHlOYW1lOmNbNV0scHJvcGVydHlJbmRleDpjWzZdfTt2YXIgZT1jLm5vZGVOYW1lJiZjLm5vZGVOYW1lLmxhc3RJbmRleE9mKCIuIik7aWYodm9pZCAwIT09ZSYmLTEhPT0KZSl7dmFyIGc9Yy5ub2RlTmFtZS5zdWJzdHJpbmcoZSsxKTstMSE9PVZtLmluZGV4T2YoZykmJihjLm5vZGVOYW1lPWMubm9kZU5hbWUuc3Vic3RyaW5nKDAsZSksYy5vYmplY3ROYW1lPWcpfWlmKG51bGw9PT1jLnByb3BlcnR5TmFtZXx8MD09PWMucHJvcGVydHlOYW1lLmxlbmd0aCl0aHJvdyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogIithKTtyZXR1cm4gY30sZmluZE5vZGU6ZnVuY3Rpb24oYSxjKXtpZighY3x8IiI9PT1jfHwicm9vdCI9PT1jfHwiLiI9PT1jfHwtMT09PWN8fGM9PT1hLm5hbWV8fGM9PT1hLnV1aWQpcmV0dXJuIGE7aWYoYS5za2VsZXRvbil7dmFyIGU9YS5za2VsZXRvbi5nZXRCb25lQnlOYW1lKGMpO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGV9aWYoYS5jaGlsZHJlbil7dmFyIGc9ZnVuY3Rpb24ocil7Zm9yKHZhciB2PTA7djxyLmxlbmd0aDt2Kyspe3ZhciB6PXJbdl07aWYoei5uYW1lPT09CmN8fHoudXVpZD09PWMpcmV0dXJuIHo7aWYoej1nKHouY2hpbGRyZW4pKXJldHVybiB6fXJldHVybiBudWxsfTtpZihhPWcoYS5jaGlsZHJlbikpcmV0dXJuIGF9cmV0dXJuIG51bGx9fSk7T2JqZWN0LmFzc2lnbigkYi5wcm90b3R5cGUse19nZXRWYWx1ZV91bmF2YWlsYWJsZTpmdW5jdGlvbigpe30sX3NldFZhbHVlX3VuYXZhaWxhYmxlOmZ1bmN0aW9uKCl7fSxCaW5kaW5nVHlwZTp7RGlyZWN0OjAsRW50aXJlQXJyYXk6MSxBcnJheUVsZW1lbnQ6MixIYXNGcm9tVG9BcnJheTozfSxWZXJzaW9uaW5nOntOb25lOjAsTmVlZHNVcGRhdGU6MSxNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOjJ9LEdldHRlckJ5QmluZGluZ1R5cGU6W2Z1bmN0aW9uKGEsYyl7YVtjXT10aGlzLm5vZGVbdGhpcy5wcm9wZXJ0eU5hbWVdfSxmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnJlc29sdmVkUHJvcGVydHksZz0wLHI9ZS5sZW5ndGg7ZyE9PXI7KytnKWFbYysrXT1lW2ddfSxmdW5jdGlvbihhLGMpe2FbY109CnRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KGEsYyl9XSxTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZzpbW2Z1bmN0aW9uKGEsYyl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWFbY119LGZ1bmN0aW9uKGEsYyl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWFbY107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9LGZ1bmN0aW9uKGEsYyl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWFbY107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnJlc29sdmVkUHJvcGVydHksZz0wLHI9ZS5sZW5ndGg7ZyE9PXI7KytnKWVbZ109YVtjKytdfSxmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnJlc29sdmVkUHJvcGVydHksCmc9MCxyPWUubGVuZ3RoO2chPT1yOysrZyllW2ddPWFbYysrXTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LGc9MCxyPWUubGVuZ3RoO2chPT1yOysrZyllW2ddPWFbYysrXTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV0sW2Z1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09YVtjXX0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPWFbY107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYSwKYyl9LGZ1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheShhLGMpO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYSxjKTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV1dLGdldFZhbHVlOmZ1bmN0aW9uKGEsYyl7dGhpcy5iaW5kKCk7dGhpcy5nZXRWYWx1ZShhLGMpfSxzZXRWYWx1ZTpmdW5jdGlvbihhLGMpe3RoaXMuYmluZCgpO3RoaXMuc2V0VmFsdWUoYSxjKX0sYmluZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubm9kZSxjPXRoaXMucGFyc2VkUGF0aCxlPWMub2JqZWN0TmFtZSxnPWMucHJvcGVydHlOYW1lLHI9Yy5wcm9wZXJ0eUluZGV4O2F8fCh0aGlzLm5vZGU9YT0kYi5maW5kTm9kZSh0aGlzLnJvb3ROb2RlLGMubm9kZU5hbWUpfHx0aGlzLnJvb3ROb2RlKTt0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlOwp0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlO2lmKGEpe2lmKGUpe3ZhciB2PWMub2JqZWN0SW5kZXg7c3dpdGNoKGUpe2Nhc2UgIm1hdGVyaWFscyI6aWYoIWEubWF0ZXJpYWwpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLiIsdGhpcyk7cmV0dXJufWlmKCFhLm1hdGVyaWFsLm1hdGVyaWFscyl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4iLHRoaXMpO3JldHVybn1hPWEubWF0ZXJpYWwubWF0ZXJpYWxzO2JyZWFrO2Nhc2UgImJvbmVzIjppZighYS5za2VsZXRvbil7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uIiwKdGhpcyk7cmV0dXJufWE9YS5za2VsZXRvbi5ib25lcztmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWlmKGFbZV0ubmFtZT09PXYpe3Y9ZTticmVha31icmVhaztkZWZhdWx0OmlmKHZvaWQgMD09PWFbZV0pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSB1bmRlZmluZWQuIix0aGlzKTtyZXR1cm59YT1hW2VdfWlmKHZvaWQgMCE9PXYpe2lmKHZvaWQgMD09PWFbdl0pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIGJpbmQgdG8gb2JqZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZC4iLHRoaXMsYSk7cmV0dXJufWE9YVt2XX19dj1hW2ddO2lmKHZvaWQgMD09PXYpY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogIitjLm5vZGVOYW1lKyIuIitnKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iLAphKTtlbHNle2M9dGhpcy5WZXJzaW9uaW5nLk5vbmU7dGhpcy50YXJnZXRPYmplY3Q9YTt2b2lkIDAhPT1hLm5lZWRzVXBkYXRlP2M9dGhpcy5WZXJzaW9uaW5nLk5lZWRzVXBkYXRlOnZvaWQgMCE9PWEubWF0cml4V29ybGROZWVkc1VwZGF0ZSYmKGM9dGhpcy5WZXJzaW9uaW5nLk1hdHJpeFdvcmxkTmVlZHNVcGRhdGUpO2U9dGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7aWYodm9pZCAwIT09cil7aWYoIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyI9PT1nKXtpZighYS5nZW9tZXRyeSl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuIix0aGlzKTtyZXR1cm59aWYoYS5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5KXtpZighYS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4iLAp0aGlzKTtyZXR1cm59Zm9yKGU9MDtlPHRoaXMubm9kZS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24ubGVuZ3RoO2UrKylpZihhLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbltlXS5uYW1lPT09cil7cj1lO2JyZWFrfX1lbHNle2lmKCFhLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhUYXJnZXRzLiIsdGhpcyk7cmV0dXJufWZvcihlPTA7ZTx0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDtlKyspaWYoYS5nZW9tZXRyeS5tb3JwaFRhcmdldHNbZV0ubmFtZT09PXIpe3I9ZTticmVha319fWU9dGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQ7dGhpcy5yZXNvbHZlZFByb3BlcnR5PXY7dGhpcy5wcm9wZXJ0eUluZGV4PXJ9ZWxzZSB2b2lkIDAhPT0Kdi5mcm9tQXJyYXkmJnZvaWQgMCE9PXYudG9BcnJheT8oZT10aGlzLkJpbmRpbmdUeXBlLkhhc0Zyb21Ub0FycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT12KTpBcnJheS5pc0FycmF5KHYpPyhlPXRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXksdGhpcy5yZXNvbHZlZFByb3BlcnR5PXYpOnRoaXMucHJvcGVydHlOYW1lPWc7dGhpcy5nZXRWYWx1ZT10aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbZV07dGhpcy5zZXRWYWx1ZT10aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nW2VdW2NdfX1lbHNlIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBub2RlIGZvciB0cmFjazogIit0aGlzLnBhdGgrIiBidXQgaXQgd2Fzbid0IGZvdW5kLiIpfSx1bmJpbmQ6ZnVuY3Rpb24oKXt0aGlzLm5vZGU9bnVsbDt0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYm91bmQ7dGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmJvdW5kfX0pOwpPYmplY3QuYXNzaWduKCRiLnByb3RvdHlwZSx7X2dldFZhbHVlX3VuYm91bmQ6JGIucHJvdG90eXBlLmdldFZhbHVlLF9zZXRWYWx1ZV91bmJvdW5kOiRiLnByb3RvdHlwZS5zZXRWYWx1ZX0pO09iamVjdC5hc3NpZ24oU2oucHJvdG90eXBlLHtpc0FuaW1hdGlvbk9iamVjdEdyb3VwOiEwLGFkZDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9vYmplY3RzLGM9YS5sZW5ndGgsZT10aGlzLm5DYWNoZWRPYmplY3RzXyxnPXRoaXMuX2luZGljZXNCeVVVSUQscj10aGlzLl9wYXRocyx2PXRoaXMuX3BhcnNlZFBhdGhzLHo9dGhpcy5fYmluZGluZ3MsRT16Lmxlbmd0aCxGPXZvaWQgMCxKPTAsUD1hcmd1bWVudHMubGVuZ3RoO0ohPT1QOysrSil7dmFyIFI9YXJndW1lbnRzW0pdLFM9Ui51dWlkLFY9Z1tTXTtpZih2b2lkIDA9PT1WKXtWPWMrKztnW1NdPVY7YS5wdXNoKFIpO1M9MDtmb3IodmFyIFc9RTtTIT09VzsrK1MpeltTXS5wdXNoKG5ldyAkYihSLHJbU10sdltTXSkpfWVsc2UgaWYoVjwKZSl7Rj1hW1ZdO3ZhciBoYT0tLWU7Vz1hW2hhXTtnW1cudXVpZF09VjthW1ZdPVc7Z1tTXT1oYTthW2hhXT1SO1M9MDtmb3IoVz1FO1MhPT1XOysrUyl7dmFyIGZhPXpbU10scmE9ZmFbVl07ZmFbVl09ZmFbaGFdO3ZvaWQgMD09PXJhJiYocmE9bmV3ICRiKFIscltTXSx2W1NdKSk7ZmFbaGFdPXJhfX1lbHNlIGFbVl0hPT1GJiZjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25PYmplY3RHcm91cDogRGlmZmVyZW50IG9iamVjdHMgd2l0aCB0aGUgc2FtZSBVVUlEIGRldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLiIpfXRoaXMubkNhY2hlZE9iamVjdHNfPWV9LHJlbW92ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9vYmplY3RzLGM9dGhpcy5uQ2FjaGVkT2JqZWN0c18sZT10aGlzLl9pbmRpY2VzQnlVVUlELGc9dGhpcy5fYmluZGluZ3Mscj1nLmxlbmd0aCx2PTAsej1hcmd1bWVudHMubGVuZ3RoO3YhPT0KejsrK3Ype3ZhciBFPWFyZ3VtZW50c1t2XSxGPUUudXVpZCxKPWVbRl07aWYodm9pZCAwIT09SiYmSj49Yyl7dmFyIFA9YysrLFI9YVtQXTtlW1IudXVpZF09SjthW0pdPVI7ZVtGXT1QO2FbUF09RTtFPTA7Zm9yKEY9cjtFIT09RjsrK0Upe1I9Z1tFXTt2YXIgUz1SW0pdO1JbSl09UltQXTtSW1BdPVN9fX10aGlzLm5DYWNoZWRPYmplY3RzXz1jfSx1bmNhY2hlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX29iamVjdHMsYz1hLmxlbmd0aCxlPXRoaXMubkNhY2hlZE9iamVjdHNfLGc9dGhpcy5faW5kaWNlc0J5VVVJRCxyPXRoaXMuX2JpbmRpbmdzLHY9ci5sZW5ndGgsej0wLEU9YXJndW1lbnRzLmxlbmd0aDt6IT09RTsrK3ope3ZhciBGPWFyZ3VtZW50c1t6XS51dWlkLEo9Z1tGXTtpZih2b2lkIDAhPT1KKWlmKGRlbGV0ZSBnW0ZdLEo8ZSl7Rj0tLWU7dmFyIFA9YVtGXSxSPS0tYyxTPWFbUl07Z1tQLnV1aWRdPUo7YVtKXT1QO2dbUy51dWlkXT1GO2FbRl09UzthLnBvcCgpO1A9CjA7Zm9yKFM9djtQIT09UzsrK1Ape3ZhciBWPXJbUF0sVz1WW1JdO1ZbSl09VltGXTtWW0ZdPVc7Vi5wb3AoKX19ZWxzZSBmb3IoUj0tLWMsUz1hW1JdLGdbUy51dWlkXT1KLGFbSl09UyxhLnBvcCgpLFA9MCxTPXY7UCE9PVM7KytQKVY9cltQXSxWW0pdPVZbUl0sVi5wb3AoKX10aGlzLm5DYWNoZWRPYmplY3RzXz1lfSxzdWJzY3JpYmVfOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLGc9ZVthXSxyPXRoaXMuX2JpbmRpbmdzO2lmKHZvaWQgMCE9PWcpcmV0dXJuIHJbZ107dmFyIHY9dGhpcy5fcGF0aHMsej10aGlzLl9wYXJzZWRQYXRocyxFPXRoaXMuX29iamVjdHMsRj10aGlzLm5DYWNoZWRPYmplY3RzXyxKPUFycmF5KEUubGVuZ3RoKTtnPXIubGVuZ3RoO2VbYV09Zzt2LnB1c2goYSk7ei5wdXNoKGMpO3IucHVzaChKKTtlPUY7Zm9yKGc9RS5sZW5ndGg7ZSE9PWc7KytlKUpbZV09bmV3ICRiKEVbZV0sYSxjKTtyZXR1cm4gSn0sdW5zdWJzY3JpYmVfOmZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsZT1jW2FdO2lmKHZvaWQgMCE9PWUpe3ZhciBnPXRoaXMuX3BhdGhzLHI9dGhpcy5fcGFyc2VkUGF0aHMsdj10aGlzLl9iaW5kaW5ncyx6PXYubGVuZ3RoLTEsRT12W3pdO2NbYVt6XV09ZTt2W2VdPUU7di5wb3AoKTtyW2VdPXJbel07ci5wb3AoKTtnW2VdPWdbel07Zy5wb3AoKX19fSk7T2JqZWN0LmFzc2lnbihUai5wcm90b3R5cGUse3BsYXk6ZnVuY3Rpb24oKXt0aGlzLl9taXhlci5fYWN0aXZhdGVBY3Rpb24odGhpcyk7cmV0dXJuIHRoaXN9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbih0aGlzKTtyZXR1cm4gdGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3RoaXMucGF1c2VkPSExO3RoaXMuZW5hYmxlZD0hMDt0aGlzLnRpbWU9MDt0aGlzLl9sb29wQ291bnQ9LTE7dGhpcy5fc3RhcnRUaW1lPW51bGw7cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCl9LGlzUnVubmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVuYWJsZWQmJgohdGhpcy5wYXVzZWQmJjAhPT10aGlzLnRpbWVTY2FsZSYmbnVsbD09PXRoaXMuX3N0YXJ0VGltZSYmdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfSxpc1NjaGVkdWxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24odGhpcyl9LHN0YXJ0QXQ6ZnVuY3Rpb24oYSl7dGhpcy5fc3RhcnRUaW1lPWE7cmV0dXJuIHRoaXN9LHNldExvb3A6ZnVuY3Rpb24oYSxjKXt0aGlzLmxvb3A9YTt0aGlzLnJlcGV0aXRpb25zPWM7cmV0dXJuIHRoaXN9LHNldEVmZmVjdGl2ZVdlaWdodDpmdW5jdGlvbihhKXt0aGlzLndlaWdodD1hO3RoaXMuX2VmZmVjdGl2ZVdlaWdodD10aGlzLmVuYWJsZWQ/YTowO3JldHVybiB0aGlzLnN0b3BGYWRpbmcoKX0sZ2V0RWZmZWN0aXZlV2VpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodH0sZmFkZUluOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyhhLDAsMSl9LGZhZGVPdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKGEsCjEsMCl9LGNyb3NzRmFkZUZyb206ZnVuY3Rpb24oYSxjLGUpe2EuZmFkZU91dChjKTt0aGlzLmZhZGVJbihjKTtpZihlKXtlPXRoaXMuX2NsaXAuZHVyYXRpb247dmFyIGc9YS5fY2xpcC5kdXJhdGlvbixyPWUvZzthLndhcnAoMSxnL2UsYyk7dGhpcy53YXJwKHIsMSxjKX1yZXR1cm4gdGhpc30sY3Jvc3NGYWRlVG86ZnVuY3Rpb24oYSxjLGUpe3JldHVybiBhLmNyb3NzRmFkZUZyb20odGhpcyxjLGUpfSxzdG9wRmFkaW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7bnVsbCE9PWEmJih0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD1udWxsLHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudChhKSk7cmV0dXJuIHRoaXN9LHNldEVmZmVjdGl2ZVRpbWVTY2FsZTpmdW5jdGlvbihhKXt0aGlzLnRpbWVTY2FsZT1hO3RoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnBhdXNlZD8wOmE7cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKX0sZ2V0RWZmZWN0aXZlVGltZVNjYWxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZX0sCnNldER1cmF0aW9uOmZ1bmN0aW9uKGEpe3RoaXMudGltZVNjYWxlPXRoaXMuX2NsaXAuZHVyYXRpb24vYTtyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpfSxzeW5jV2l0aDpmdW5jdGlvbihhKXt0aGlzLnRpbWU9YS50aW1lO3RoaXMudGltZVNjYWxlPWEudGltZVNjYWxlO3JldHVybiB0aGlzLnN0b3BXYXJwaW5nKCl9LGhhbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMud2FycCh0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsMCxhKX0sd2FycDpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5fbWl4ZXIscj1nLnRpbWUsdj10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCx6PXRoaXMudGltZVNjYWxlO251bGw9PT12JiYodGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9dj1nLl9sZW5kQ29udHJvbEludGVycG9sYW50KCkpO2c9di5wYXJhbWV0ZXJQb3NpdGlvbnM7dj12LnNhbXBsZVZhbHVlcztnWzBdPXI7Z1sxXT1yK2U7dlswXT1hL3o7dlsxXT1jL3o7cmV0dXJuIHRoaXN9LHN0b3BXYXJwaW5nOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O251bGwhPT1hJiYodGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoYSkpO3JldHVybiB0aGlzfSxnZXRNaXhlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taXhlcn0sZ2V0Q2xpcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jbGlwfSxnZXRSb290OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvY2FsUm9vdHx8dGhpcy5fbWl4ZXIuX3Jvb3R9LF91cGRhdGU6ZnVuY3Rpb24oYSxjLGUsZyl7aWYodGhpcy5lbmFibGVkKXt2YXIgcj10aGlzLl9zdGFydFRpbWU7aWYobnVsbCE9PXIpe2M9KGEtcikqZTtpZigwPmN8fDA9PT1lKXJldHVybjt0aGlzLl9zdGFydFRpbWU9bnVsbDtjKj1lfWMqPXRoaXMuX3VwZGF0ZVRpbWVTY2FsZShhKTtlPXRoaXMuX3VwZGF0ZVRpbWUoYyk7YT10aGlzLl91cGRhdGVXZWlnaHQoYSk7aWYoMDxhKXtjPXRoaXMuX2ludGVycG9sYW50czsKcj10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzO2Zvcih2YXIgdj0wLHo9Yy5sZW5ndGg7diE9PXo7Kyt2KWNbdl0uZXZhbHVhdGUoZSksclt2XS5hY2N1bXVsYXRlKGcsYSl9fWVsc2UgdGhpcy5fdXBkYXRlV2VpZ2h0KGEpfSxfdXBkYXRlV2VpZ2h0OmZ1bmN0aW9uKGEpe3ZhciBjPTA7aWYodGhpcy5lbmFibGVkKXtjPXRoaXMud2VpZ2h0O3ZhciBlPXRoaXMuX3dlaWdodEludGVycG9sYW50O2lmKG51bGwhPT1lKXt2YXIgZz1lLmV2YWx1YXRlKGEpWzBdO2MqPWc7YT5lLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcEZhZGluZygpLDA9PT1nJiYodGhpcy5lbmFibGVkPSExKSl9fXJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9Y30sX3VwZGF0ZVRpbWVTY2FsZTpmdW5jdGlvbihhKXt2YXIgYz0wO2lmKCF0aGlzLnBhdXNlZCl7Yz10aGlzLnRpbWVTY2FsZTt2YXIgZT10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtpZihudWxsIT09ZSl7dmFyIGc9ZS5ldmFsdWF0ZShhKVswXTsKYyo9ZzthPmUucGFyYW1ldGVyUG9zaXRpb25zWzFdJiYodGhpcy5zdG9wV2FycGluZygpLDA9PT1jP3RoaXMucGF1c2VkPSEwOnRoaXMudGltZVNjYWxlPWMpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPWN9LF91cGRhdGVUaW1lOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudGltZSthLGU9dGhpcy5fY2xpcC5kdXJhdGlvbixnPXRoaXMubG9vcCxyPXRoaXMuX2xvb3BDb3VudCx2PTIyMDI9PT1nO2lmKDA9PT1hKXJldHVybi0xPT09cj9jOnYmJjE9PT0ociYxKT9lLWM6YztpZigyMjAwPT09ZylhOntpZigtMT09PXImJih0aGlzLl9sb29wQ291bnQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLCEwLCExKSksYz49ZSljPWU7ZWxzZSBpZigwPmMpYz0wO2Vsc2V7dGhpcy50aW1lPWM7YnJlYWsgYX10aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMTt0aGlzLnRpbWU9Yzt0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsCmFjdGlvbjp0aGlzLGRpcmVjdGlvbjowPmE/LTE6MX0pfWVsc2V7LTE9PT1yJiYoMDw9YT8ocj0wLHRoaXMuX3NldEVuZGluZ3MoITAsMD09PXRoaXMucmVwZXRpdGlvbnMsdikpOnRoaXMuX3NldEVuZGluZ3MoMD09PXRoaXMucmVwZXRpdGlvbnMsITAsdikpO2lmKGM+PWV8fDA+Yyl7Zz1NYXRoLmZsb29yKGMvZSk7Yy09ZSpnO3IrPU1hdGguYWJzKGcpO3ZhciB6PXRoaXMucmVwZXRpdGlvbnMtcjswPj16Pyh0aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSx0aGlzLnRpbWU9Yz0wPGE/ZTowLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246MDxhPzE6LTF9KSk6KDE9PT16PyhhPTA+YSx0aGlzLl9zZXRFbmRpbmdzKGEsIWEsdikpOnRoaXMuX3NldEVuZGluZ3MoITEsITEsdiksdGhpcy5fbG9vcENvdW50PXIsdGhpcy50aW1lPWMsdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToibG9vcCIsCmFjdGlvbjp0aGlzLGxvb3BEZWx0YTpnfSkpfWVsc2UgdGhpcy50aW1lPWM7aWYodiYmMT09PShyJjEpKXJldHVybiBlLWN9cmV0dXJuIGN9LF9zZXRFbmRpbmdzOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO2U/KGcuZW5kaW5nU3RhcnQ9MjQwMSxnLmVuZGluZ0VuZD0yNDAxKTooZy5lbmRpbmdTdGFydD1hP3RoaXMuemVyb1Nsb3BlQXRTdGFydD8yNDAxOjI0MDA6MjQwMixnLmVuZGluZ0VuZD1jP3RoaXMuemVyb1Nsb3BlQXRFbmQ/MjQwMToyNDAwOjI0MDIpfSxfc2NoZWR1bGVGYWRpbmc6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuX21peGVyLHI9Zy50aW1lLHY9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7bnVsbD09PXYmJih0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD12PWcuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSk7Zz12LnBhcmFtZXRlclBvc2l0aW9uczt2PXYuc2FtcGxlVmFsdWVzO2dbMF09cjt2WzBdPWM7Z1sxXT1yK2E7dlsxXT0KZTtyZXR1cm4gdGhpc319KTtxaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6cWksX2JpbmRBY3Rpb246ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QsZz1hLl9jbGlwLnRyYWNrcyxyPWcubGVuZ3RoLHY9YS5fcHJvcGVydHlCaW5kaW5nczthPWEuX2ludGVycG9sYW50czt2YXIgej1lLnV1aWQsRT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsRj1FW3pdO3ZvaWQgMD09PUYmJihGPXt9LEVbel09Rik7Zm9yKEU9MDtFIT09cjsrK0Upe3ZhciBKPWdbRV0sUD1KLm5hbWUsUj1GW1BdO2lmKHZvaWQgMD09PVIpe1I9dltFXTtpZih2b2lkIDAhPT1SKXtudWxsPT09Ui5fY2FjaGVJbmRleCYmKCsrUi5yZWZlcmVuY2VDb3VudCx0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoUix6LFApKTtjb250aW51ZX1SPW5ldyBwaSgkYi5jcmVhdGUoZSxQLGMmJmMuX3Byb3BlcnR5QmluZGluZ3NbRV0uYmluZGluZy5wYXJzZWRQYXRoKSwKSi5WYWx1ZVR5cGVOYW1lLEouZ2V0VmFsdWVTaXplKCkpOysrUi5yZWZlcmVuY2VDb3VudDt0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoUix6LFApfXZbRV09UjthW0VdLnJlc3VsdEJ1ZmZlcj1SLmJ1ZmZlcn19LF9hY3RpdmF0ZUFjdGlvbjpmdW5jdGlvbihhKXtpZighdGhpcy5faXNBY3RpdmVBY3Rpb24oYSkpe2lmKG51bGw9PT1hLl9jYWNoZUluZGV4KXt2YXIgYz0oYS5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkLGU9YS5fY2xpcC51dWlkLGc9dGhpcy5fYWN0aW9uc0J5Q2xpcFtlXTt0aGlzLl9iaW5kQWN0aW9uKGEsZyYmZy5rbm93bkFjdGlvbnNbMF0pO3RoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGEsZSxjKX1jPWEuX3Byb3BlcnR5QmluZGluZ3M7ZT0wO2ZvcihnPWMubGVuZ3RoO2UhPT1nOysrZSl7dmFyIHI9Y1tlXTswPT09ci51c2VDb3VudCsrJiYodGhpcy5fbGVuZEJpbmRpbmcociksci5zYXZlT3JpZ2luYWxTdGF0ZSgpKX10aGlzLl9sZW5kQWN0aW9uKGEpfX0sCl9kZWFjdGl2YXRlQWN0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2lzQWN0aXZlQWN0aW9uKGEpKXtmb3IodmFyIGM9YS5fcHJvcGVydHlCaW5kaW5ncyxlPTAsZz1jLmxlbmd0aDtlIT09ZzsrK2Upe3ZhciByPWNbZV07MD09PS0tci51c2VDb3VudCYmKHIucmVzdG9yZU9yaWdpbmFsU3RhdGUoKSx0aGlzLl90YWtlQmFja0JpbmRpbmcocikpfXRoaXMuX3Rha2VCYWNrQWN0aW9uKGEpfX0sX2luaXRNZW1vcnlNYW5hZ2VyOmZ1bmN0aW9uKCl7dGhpcy5fYWN0aW9ucz1bXTt0aGlzLl9uQWN0aXZlQWN0aW9ucz0wO3RoaXMuX2FjdGlvbnNCeUNsaXA9e307dGhpcy5fYmluZGluZ3M9W107dGhpcy5fbkFjdGl2ZUJpbmRpbmdzPTA7dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lPXt9O3RoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHM9W107dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM9MDt2YXIgYT10aGlzO3RoaXMuc3RhdHM9e2FjdGlvbnM6e2dldCB0b3RhbCgpe3JldHVybiBhLl9hY3Rpb25zLmxlbmd0aH0sCmdldCBpblVzZSgpe3JldHVybiBhLl9uQWN0aXZlQWN0aW9uc319LGJpbmRpbmdzOntnZXQgdG90YWwoKXtyZXR1cm4gYS5fYmluZGluZ3MubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gYS5fbkFjdGl2ZUJpbmRpbmdzfX0sY29udHJvbEludGVycG9sYW50czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGEuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gYS5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHN9fX19LF9pc0FjdGl2ZUFjdGlvbjpmdW5jdGlvbihhKXthPWEuX2NhY2hlSW5kZXg7cmV0dXJuIG51bGwhPT1hJiZhPHRoaXMuX25BY3RpdmVBY3Rpb25zfSxfYWRkSW5hY3RpdmVBY3Rpb246ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuX2FjdGlvbnMscj10aGlzLl9hY3Rpb25zQnlDbGlwLHY9cltjXTt2b2lkIDA9PT12Pyh2PXtrbm93bkFjdGlvbnM6W2FdLGFjdGlvbkJ5Um9vdDp7fX0sYS5fYnlDbGlwQ2FjaGVJbmRleD0wLHJbY109dik6KGM9CnYua25vd25BY3Rpb25zLGEuX2J5Q2xpcENhY2hlSW5kZXg9Yy5sZW5ndGgsYy5wdXNoKGEpKTthLl9jYWNoZUluZGV4PWcubGVuZ3RoO2cucHVzaChhKTt2LmFjdGlvbkJ5Um9vdFtlXT1hfSxfcmVtb3ZlSW5hY3RpdmVBY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYWN0aW9ucyxlPWNbYy5sZW5ndGgtMV0sZz1hLl9jYWNoZUluZGV4O2UuX2NhY2hlSW5kZXg9ZztjW2ddPWU7Yy5wb3AoKTthLl9jYWNoZUluZGV4PW51bGw7Yz1hLl9jbGlwLnV1aWQ7ZT10aGlzLl9hY3Rpb25zQnlDbGlwO2c9ZVtjXTt2YXIgcj1nLmtub3duQWN0aW9ucyx2PXJbci5sZW5ndGgtMV0sej1hLl9ieUNsaXBDYWNoZUluZGV4O3YuX2J5Q2xpcENhY2hlSW5kZXg9ejtyW3pdPXY7ci5wb3AoKTthLl9ieUNsaXBDYWNoZUluZGV4PW51bGw7ZGVsZXRlIGcuYWN0aW9uQnlSb290WyhhLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QpLnV1aWRdOzA9PT1yLmxlbmd0aCYmZGVsZXRlIGVbY107dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihhKX0sCl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uOmZ1bmN0aW9uKGEpe2E9YS5fcHJvcGVydHlCaW5kaW5ncztmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2MhPT1lOysrYyl7dmFyIGc9YVtjXTswPT09LS1nLnJlZmVyZW5jZUNvdW50JiZ0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoZyl9fSxfbGVuZEFjdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9hY3Rpb25zLGU9YS5fY2FjaGVJbmRleCxnPXRoaXMuX25BY3RpdmVBY3Rpb25zKysscj1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7ci5fY2FjaGVJbmRleD1lO2NbZV09cn0sX3Rha2VCYWNrQWN0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2FjdGlvbnMsZT1hLl9jYWNoZUluZGV4LGc9LS10aGlzLl9uQWN0aXZlQWN0aW9ucyxyPWNbZ107YS5fY2FjaGVJbmRleD1nO2NbZ109YTtyLl9jYWNoZUluZGV4PWU7Y1tlXT1yfSxfYWRkSW5hY3RpdmVCaW5kaW5nOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsCnI9Z1tjXSx2PXRoaXMuX2JpbmRpbmdzO3ZvaWQgMD09PXImJihyPXt9LGdbY109cik7cltlXT1hO2EuX2NhY2hlSW5kZXg9di5sZW5ndGg7di5wdXNoKGEpfSxfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2JpbmRpbmdzLGU9YS5iaW5kaW5nLGc9ZS5yb290Tm9kZS51dWlkO2U9ZS5wYXRoO3ZhciByPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSx2PXJbZ10sej1jW2MubGVuZ3RoLTFdO2E9YS5fY2FjaGVJbmRleDt6Ll9jYWNoZUluZGV4PWE7Y1thXT16O2MucG9wKCk7ZGVsZXRlIHZbZV07MD09PU9iamVjdC5rZXlzKHYpLmxlbmd0aCYmZGVsZXRlIHJbZ119LF9sZW5kQmluZGluZzpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9iaW5kaW5ncyxlPWEuX2NhY2hlSW5kZXgsZz10aGlzLl9uQWN0aXZlQmluZGluZ3MrKyxyPWNbZ107YS5fY2FjaGVJbmRleD1nO2NbZ109YTtyLl9jYWNoZUluZGV4PWU7Y1tlXT1yfSxfdGFrZUJhY2tCaW5kaW5nOmZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLl9iaW5kaW5ncyxlPWEuX2NhY2hlSW5kZXgsZz0tLXRoaXMuX25BY3RpdmVCaW5kaW5ncyxyPWNbZ107YS5fY2FjaGVJbmRleD1nO2NbZ109YTtyLl9jYWNoZUluZGV4PWU7Y1tlXT1yfSxfbGVuZENvbnRyb2xJbnRlcnBvbGFudDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsYz10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cysrLGU9YVtjXTt2b2lkIDA9PT1lJiYoZT1uZXcgWWYobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciksZS5fX2NhY2hlSW5kZXg9YyxhW2NdPWUpO3JldHVybiBlfSxfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fY29udHJvbEludGVycG9sYW50cyxlPWEuX19jYWNoZUluZGV4LGc9LS10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyxyPWNbZ107YS5fX2NhY2hlSW5kZXg9Cmc7Y1tnXT1hO3IuX19jYWNoZUluZGV4PWU7Y1tlXT1yfSxfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlcjpuZXcgRmxvYXQzMkFycmF5KDEpLGNsaXBBY3Rpb246ZnVuY3Rpb24oYSxjKXt2YXIgZT1jfHx0aGlzLl9yb290LGc9ZS51dWlkO2U9InN0cmluZyI9PT10eXBlb2YgYT90Yy5maW5kQnlOYW1lKGUsYSk6YTthPW51bGwhPT1lP2UudXVpZDphO3ZhciByPXRoaXMuX2FjdGlvbnNCeUNsaXBbYV0sdj1udWxsO2lmKHZvaWQgMCE9PXIpe3Y9ci5hY3Rpb25CeVJvb3RbZ107aWYodm9pZCAwIT09dilyZXR1cm4gdjt2PXIua25vd25BY3Rpb25zWzBdO251bGw9PT1lJiYoZT12Ll9jbGlwKX1pZihudWxsPT09ZSlyZXR1cm4gbnVsbDtjPW5ldyBUaih0aGlzLGUsYyk7dGhpcy5fYmluZEFjdGlvbihjLHYpO3RoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGMsYSxnKTtyZXR1cm4gY30sZXhpc3RpbmdBY3Rpb246ZnVuY3Rpb24oYSxjKXt2YXIgZT1jfHx0aGlzLl9yb290O2M9ZS51dWlkOwplPSJzdHJpbmciPT09dHlwZW9mIGE/dGMuZmluZEJ5TmFtZShlLGEpOmE7YT10aGlzLl9hY3Rpb25zQnlDbGlwW2U/ZS51dWlkOmFdO3JldHVybiB2b2lkIDAhPT1hP2EuYWN0aW9uQnlSb290W2NdfHxudWxsOm51bGx9LHN0b3BBbGxBY3Rpb246ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fYWN0aW9ucyxjPXRoaXMuX25BY3RpdmVBY3Rpb25zLGU9dGhpcy5fYmluZGluZ3MsZz10aGlzLl9uQWN0aXZlQmluZGluZ3Mscj10aGlzLl9uQWN0aXZlQmluZGluZ3M9dGhpcy5fbkFjdGl2ZUFjdGlvbnM9MDtyIT09YzsrK3IpYVtyXS5yZXNldCgpO2ZvcihyPTA7ciE9PWc7KytyKWVbcl0udXNlQ291bnQ9MDtyZXR1cm4gdGhpc30sdXBkYXRlOmZ1bmN0aW9uKGEpe2EqPXRoaXMudGltZVNjYWxlO2Zvcih2YXIgYz10aGlzLl9hY3Rpb25zLGU9dGhpcy5fbkFjdGl2ZUFjdGlvbnMsZz10aGlzLnRpbWUrPWEscj1NYXRoLnNpZ24oYSksdj10aGlzLl9hY2N1SW5kZXhePTEsej0wO3ohPT1lOysreiljW3pdLl91cGRhdGUoZywKYSxyLHYpO2E9dGhpcy5fYmluZGluZ3M7Yz10aGlzLl9uQWN0aXZlQmluZGluZ3M7Zm9yKHo9MDt6IT09YzsrK3opYVt6XS5hcHBseSh2KTtyZXR1cm4gdGhpc30sZ2V0Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSx1bmNhY2hlQ2xpcDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9hY3Rpb25zO2E9YS51dWlkO3ZhciBlPXRoaXMuX2FjdGlvbnNCeUNsaXAsZz1lW2FdO2lmKHZvaWQgMCE9PWcpe2c9Zy5rbm93bkFjdGlvbnM7Zm9yKHZhciByPTAsdj1nLmxlbmd0aDtyIT09djsrK3Ipe3ZhciB6PWdbcl07dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbih6KTt2YXIgRT16Ll9jYWNoZUluZGV4LEY9Y1tjLmxlbmd0aC0xXTt6Ll9jYWNoZUluZGV4PW51bGw7ei5fYnlDbGlwQ2FjaGVJbmRleD1udWxsO0YuX2NhY2hlSW5kZXg9RTtjW0VdPUY7Yy5wb3AoKTt0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHopfWRlbGV0ZSBlW2FdfX0sdW5jYWNoZVJvb3Q6ZnVuY3Rpb24oYSl7YT0KYS51dWlkO3ZhciBjPXRoaXMuX2FjdGlvbnNCeUNsaXA7Zm9yKGcgaW4gYyl7dmFyIGU9Y1tnXS5hY3Rpb25CeVJvb3RbYV07dm9pZCAwIT09ZSYmKHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oZSksdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oZSkpfXZhciBnPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZVthXTtpZih2b2lkIDAhPT1nKWZvcih2YXIgciBpbiBnKWE9Z1tyXSxhLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKGEpfSx1bmNhY2hlQWN0aW9uOmZ1bmN0aW9uKGEsYyl7YT10aGlzLmV4aXN0aW5nQWN0aW9uKGEsYyk7bnVsbCE9PWEmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGEpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGEpKX19KTtiaC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGJoKHZvaWQgMD09PXRoaXMudmFsdWUuY2xvbmU/dGhpcy52YWx1ZTp0aGlzLnZhbHVlLmNsb25lKCkpfTtyaS5wcm90b3R5cGU9Ck9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShRZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpyaSxpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyOiEwLGNvcHk6ZnVuY3Rpb24oYSl7UWQucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMubWVzaFBlckF0dHJpYnV0ZT1hLm1lc2hQZXJBdHRyaWJ1dGU7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihVai5wcm90b3R5cGUse2xpbmVQcmVjaXNpb246MSxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLnJheS5zZXQoYSxjKX0sc2V0RnJvbUNhbWVyYTpmdW5jdGlvbihhLGMpe2MmJmMuaXNQZXJzcGVjdGl2ZUNhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbihjLm1hdHJpeFdvcmxkKSx0aGlzLnJheS5kaXJlY3Rpb24uc2V0KGEueCxhLnksLjUpLnVucHJvamVjdChjKS5zdWIodGhpcy5yYXkub3JpZ2luKS5ub3JtYWxpemUoKSx0aGlzLmNhbWVyYT1jKTpjJiZjLmlzT3J0aG9ncmFwaGljQ2FtZXJhPwoodGhpcy5yYXkub3JpZ2luLnNldChhLngsYS55LChjLm5lYXIrYy5mYXIpLyhjLm5lYXItYy5mYXIpKS51bnByb2plY3QoYyksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbihjLm1hdHJpeFdvcmxkKSx0aGlzLmNhbWVyYT1jKTpjb25zb2xlLmVycm9yKCJUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlLiIpfSxpbnRlcnNlY3RPYmplY3Q6ZnVuY3Rpb24oYSxjLGUpe2U9ZXx8W107c2koYSx0aGlzLGUsYyk7ZS5zb3J0KFZqKTtyZXR1cm4gZX0saW50ZXJzZWN0T2JqZWN0czpmdW5jdGlvbihhLGMsZSl7ZT1lfHxbXTtpZighMT09PUFycmF5LmlzQXJyYXkoYSkpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHM6IG9iamVjdHMgaXMgbm90IGFuIEFycmF5LiIpLGU7Zm9yKHZhciBnPTAscj1hLmxlbmd0aDtnPHI7ZysrKXNpKGFbZ10sdGhpcyxlLGMpO2Uuc29ydChWaik7cmV0dXJuIGV9fSk7Ck9iamVjdC5hc3NpZ24oV2oucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSxjLGUpe3RoaXMucmFkaXVzPWE7dGhpcy5waGk9Yzt0aGlzLnRoZXRhPWU7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMucmFkaXVzPWEucmFkaXVzO3RoaXMucGhpPWEucGhpO3RoaXMudGhldGE9YS50aGV0YTtyZXR1cm4gdGhpc30sbWFrZVNhZmU6ZnVuY3Rpb24oKXt0aGlzLnBoaT1NYXRoLm1heCgxRS02LE1hdGgubWluKE1hdGguUEktMUUtNix0aGlzLnBoaSkpO3JldHVybiB0aGlzfSxzZXRGcm9tVmVjdG9yMzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKGEueCxhLnksYS56KX0sc2V0RnJvbUNhcnRlc2lhbkNvb3JkczpmdW5jdGlvbihhLGMsZSl7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGEqYStjKmMrZSplKTswPT09dGhpcy5yYWRpdXM/dGhpcy5waGk9CnRoaXMudGhldGE9MDoodGhpcy50aGV0YT1NYXRoLmF0YW4yKGEsZSksdGhpcy5waGk9TWF0aC5hY29zKGhiLmNsYW1wKGMvdGhpcy5yYWRpdXMsLTEsMSkpKTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKFhqLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnJhZGl1cz1hO3RoaXMudGhldGE9Yzt0aGlzLnk9ZTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5yYWRpdXM9YS5yYWRpdXM7dGhpcy50aGV0YT1hLnRoZXRhO3RoaXMueT1hLnk7cmV0dXJuIHRoaXN9LHNldEZyb21WZWN0b3IzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoYS54LGEueSxhLnopfSxzZXRGcm9tQ2FydGVzaWFuQ29vcmRzOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnJhZGl1cz1NYXRoLnNxcnQoYSphK2UqZSk7dGhpcy50aGV0YT1NYXRoLmF0YW4yKGEsCmUpO3RoaXMueT1jO3JldHVybiB0aGlzfX0pO3ZhciB5az1uZXcgZjtPYmplY3QuYXNzaWduKHRpLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5taW4uY29weShhKTt0aGlzLm1heC5jb3B5KGMpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKHZhciBjPTAsZT1hLmxlbmd0aDtjPGU7YysrKXRoaXMuZXhwYW5kQnlQb2ludChhW2NdKTtyZXR1cm4gdGhpc30sc2V0RnJvbUNlbnRlckFuZFNpemU6ZnVuY3Rpb24oYSxjKXtjPXlrLmNvcHkoYykubXVsdGlwbHlTY2FsYXIoLjUpO3RoaXMubWluLmNvcHkoYSkuc3ViKGMpO3RoaXMubWF4LmNvcHkoYSkuYWRkKGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm1pbi5jb3B5KGEubWluKTt0aGlzLm1heC5jb3B5KGEubWF4KTtyZXR1cm4gdGhpc30sCm1ha2VFbXB0eTpmdW5jdGlvbigpe3RoaXMubWluLng9dGhpcy5taW4ueT1JbmZpbml0eTt0aGlzLm1heC54PXRoaXMubWF4Lnk9LUluZmluaXR5O3JldHVybiB0aGlzfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fSxnZXRDZW50ZXI6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBmKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/YS5zZXQoMCwwKTphLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX0sZ2V0U2l6ZTpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBmKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/YS5zZXQoMCwwKTphLnN1YlZlY3RvcnModGhpcy5tYXgsCnRoaXMubWluKX0sZXhwYW5kQnlQb2ludDpmdW5jdGlvbihhKXt0aGlzLm1pbi5taW4oYSk7dGhpcy5tYXgubWF4KGEpO3JldHVybiB0aGlzfSxleHBhbmRCeVZlY3RvcjpmdW5jdGlvbihhKXt0aGlzLm1pbi5zdWIoYSk7dGhpcy5tYXguYWRkKGEpO3JldHVybiB0aGlzfSxleHBhbmRCeVNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLm1pbi5hZGRTY2FsYXIoLWEpO3RoaXMubWF4LmFkZFNjYWxhcihhKTtyZXR1cm4gdGhpc30sY29udGFpbnNQb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gYS54PHRoaXMubWluLnh8fGEueD50aGlzLm1heC54fHxhLnk8dGhpcy5taW4ueXx8YS55PnRoaXMubWF4Lnk/ITE6ITB9LGNvbnRhaW5zQm94OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1pbi54PD1hLm1pbi54JiZhLm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD1hLm1pbi55JiZhLm1heC55PD10aGlzLm1heC55fSxnZXRQYXJhbWV0ZXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLApjPW5ldyBmKTtyZXR1cm4gYy5zZXQoKGEueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwoYS55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpKX0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXgueDx0aGlzLm1pbi54fHxhLm1pbi54PnRoaXMubWF4Lnh8fGEubWF4Lnk8dGhpcy5taW4ueXx8YS5taW4ueT50aGlzLm1heC55PyExOiEwfSxjbGFtcFBvaW50OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgZik7cmV0dXJuIGMuY29weShhKS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbihhKXtyZXR1cm4geWsuY29weShhKS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuc3ViKGEpLmxlbmd0aCgpfSxpbnRlcnNlY3Q6ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWF4KGEubWluKTsKdGhpcy5tYXgubWluKGEubWF4KTtyZXR1cm4gdGhpc30sdW5pb246ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEubWluKTt0aGlzLm1heC5tYXgoYS5tYXgpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLm1pbi5lcXVhbHModGhpcy5taW4pJiZhLm1heC5lcXVhbHModGhpcy5tYXgpfX0pO3ZhciB6az1uZXcgayx6aD1uZXcgaztPYmplY3QuYXNzaWduKHVpLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5zdGFydC5jb3B5KGEpO3RoaXMuZW5kLmNvcHkoYyk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuc3RhcnQuY29weShhLnN0YXJ0KTt0aGlzLmVuZC5jb3B5KGEuZW5kKTtyZXR1cm4gdGhpc30sZ2V0Q2VudGVyOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX0sZGVsdGE6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5kZWx0YSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfSxkaXN0YW5jZVNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5lbmQpfSxkaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpfSxhdDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz0KbmV3IGspO3JldHVybiB0aGlzLmRlbHRhKGMpLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLnN0YXJ0KX0sY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcjpmdW5jdGlvbihhLGMpe3prLnN1YlZlY3RvcnMoYSx0aGlzLnN0YXJ0KTt6aC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpO2E9emguZG90KHprKS96aC5kb3QoemgpO2MmJihhPWhiLmNsYW1wKGEsMCwxKSk7cmV0dXJuIGF9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYSxjLGUpe2E9dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKGEsYyk7dm9pZCAwPT09ZSYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGspO3JldHVybiB0aGlzLmRlbHRhKGUpLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLnN0YXJ0KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe3RoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KGEpOwp0aGlzLmVuZC5hcHBseU1hdHJpeDQoYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJmEuZW5kLmVxdWFscyh0aGlzLmVuZCl9fSk7Y2cucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO2NnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jZztjZy5wcm90b3R5cGUuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3Q9ITA7dmFyIFpjPW5ldyBrLG9kPW5ldyBrLFJpPW5ldyB0LFdtPVsiYSIsImIiLCJjIl07ZGcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtkZy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGc7ZGcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtSaS5nZXROb3JtYWxNYXRyaXgodGhpcy5vYmplY3QubWF0cml4V29ybGQpO3ZhciBhPXRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkLGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLAplPXRoaXMub2JqZWN0Lmdlb21ldHJ5O2lmKGUmJmUuaXNHZW9tZXRyeSlmb3IodmFyIGc9ZS52ZXJ0aWNlcyxyPWUuZmFjZXMsdj1lPTAsej1yLmxlbmd0aDt2PHo7disrKWZvcih2YXIgRT1yW3ZdLEY9MCxKPUUudmVydGV4Tm9ybWFscy5sZW5ndGg7RjxKO0YrKyl7dmFyIFA9RS52ZXJ0ZXhOb3JtYWxzW0ZdO1pjLmNvcHkoZ1tFW1dtW0ZdXV0pLmFwcGx5TWF0cml4NChhKTtvZC5jb3B5KFApLmFwcGx5TWF0cml4MyhSaSkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKS5hZGQoWmMpO2Muc2V0WFlaKGUsWmMueCxaYy55LFpjLnopO2UrPTE7Yy5zZXRYWVooZSxvZC54LG9kLnksb2Queik7ZSs9MX1lbHNlIGlmKGUmJmUuaXNCdWZmZXJHZW9tZXRyeSlmb3IoZz1lLmF0dHJpYnV0ZXMucG9zaXRpb24scj1lLmF0dHJpYnV0ZXMubm9ybWFsLEY9ZT0wLEo9Zy5jb3VudDtGPEo7RisrKVpjLnNldChnLmdldFgoRiksZy5nZXRZKEYpLGcuZ2V0WihGKSkuYXBwbHlNYXRyaXg0KGEpLApvZC5zZXQoci5nZXRYKEYpLHIuZ2V0WShGKSxyLmdldFooRikpLG9kLmFwcGx5TWF0cml4MyhSaSkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKS5hZGQoWmMpLGMuc2V0WFlaKGUsWmMueCxaYy55LFpjLnopLGUrPTEsYy5zZXRYWVooZSxvZC54LG9kLnksb2QueiksZSs9MTtjLm5lZWRzVXBkYXRlPSEwfTt2YXIgQWs9bmV3IGs7WGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO1hlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YZTtYZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKX07WGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt2YXIgYT10aGlzLmxpZ2h0LmRpc3RhbmNlP3RoaXMubGlnaHQuZGlzdGFuY2U6MUUzLGM9YSpNYXRoLnRhbih0aGlzLmxpZ2h0LmFuZ2xlKTsKdGhpcy5jb25lLnNjYWxlLnNldChjLGMsYSk7QWsuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKTt0aGlzLmNvbmUubG9va0F0KEFrKTt2b2lkIDAhPT10aGlzLmNvbG9yP3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9O3ZhciBJZD1uZXcgayxBaD1uZXcgcSxTaT1uZXcgcTtZZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO1llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZZTtZZS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5ib25lcyxlPXRoaXMuZ2VvbWV0cnksZz1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtTaS5nZXRJbnZlcnNlKHRoaXMucm9vdC5tYXRyaXhXb3JsZCk7Zm9yKHZhciByPTAsdj0wO3I8Yy5sZW5ndGg7cisrKXt2YXIgej1jW3JdO3oucGFyZW50JiYKei5wYXJlbnQuaXNCb25lJiYoQWgubXVsdGlwbHlNYXRyaWNlcyhTaSx6Lm1hdHJpeFdvcmxkKSxJZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oQWgpLGcuc2V0WFlaKHYsSWQueCxJZC55LElkLnopLEFoLm11bHRpcGx5TWF0cmljZXMoU2ksei5wYXJlbnQubWF0cml4V29ybGQpLElkLnNldEZyb21NYXRyaXhQb3NpdGlvbihBaCksZy5zZXRYWVoodisxLElkLngsSWQueSxJZC56KSx2Kz0yKX1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMDtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSl9O1plLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7WmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVplO1plLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9O1plLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLmNvbG9yPwp0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTp0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9OyRlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFZiLnByb3RvdHlwZSk7JGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRlOyRlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLnNjYWxlLnNldCguNSp0aGlzLmxpZ2h0LndpZHRoLC41KnRoaXMubGlnaHQuaGVpZ2h0LDEpO2lmKHZvaWQgMCE9PXRoaXMuY29sb3IpdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvciksdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7ZWxzZXt0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcikubXVsdGlwbHlTY2FsYXIodGhpcy5saWdodC5pbnRlbnNpdHkpO3ZhciBhPXRoaXMubWF0ZXJpYWwuY29sb3IsYz1NYXRoLm1heChhLnIsYS5nLGEuYik7MTxjJiZhLm11bHRpcGx5U2NhbGFyKDEvCmMpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLm1hdGVyaWFsLmNvbG9yKX19OyRlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9O3ZhciBYbT1uZXcgayxCaz1uZXcgSSxDaz1uZXcgSTthZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7YWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWFmO2FmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9O2FmLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoaWxkcmVuWzBdO2lmKHZvaWQgMCE9PXRoaXMuY29sb3IpdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7CmVsc2V7dmFyIGM9YS5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7QmsuY29weSh0aGlzLmxpZ2h0LmNvbG9yKTtDay5jb3B5KHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IpO2Zvcih2YXIgZT0wLGc9Yy5jb3VudDtlPGc7ZSsrKXt2YXIgcj1lPGcvMj9CazpDaztjLnNldFhZWihlLHIucixyLmcsci5iKX1jLm5lZWRzVXBkYXRlPSEwfWEubG9va0F0KFhtLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKS5uZWdhdGUoKSl9O2JmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7YmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWJmO2JmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9O2JmLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcj1mdW5jdGlvbigpe3RoaXMucG9zaXRpb24uY29weSh0aGlzLmxpZ2h0UHJvYmUucG9zaXRpb24pO3RoaXMuc2NhbGUuc2V0KDEsCjEsMSkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKTt0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmludGVuc2l0eS52YWx1ZT10aGlzLmxpZ2h0UHJvYmUuaW50ZW5zaXR5fTtjaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmNoLGNvcHk6ZnVuY3Rpb24oYSl7SWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZ2VvbWV0cnkuY29weShhLmdlb21ldHJ5KTt0aGlzLm1hdGVyaWFsLmNvcHkoYS5tYXRlcmlhbCk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX0pO2RoLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7ZGgucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRoO2NmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFZiLnByb3RvdHlwZSk7Y2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPWNmO2NmLnByb3RvdHlwZS51cGRhdGU9CmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShXLGhhLGZhLHJhKXtmYT0oaGEtVykvZmE7Vi5zZXRYWVooRiwwLDAsMCk7SisrO2ZvcihQPVc7UDxoYTtQKz1mYSlSPUYrSixWLnNldFhZWihSLE1hdGguc2luKFApKmUsMCxNYXRoLmNvcyhQKSplKSxWLnNldFhZWihSKzEsTWF0aC5zaW4oTWF0aC5taW4oUCtmYSxoYSkpKmUsMCxNYXRoLmNvcyhNYXRoLm1pbihQK2ZhLGhhKSkqZSksVi5zZXRYWVooUisyLDAsMCwwKSxKKz0zO1MuYWRkR3JvdXAoRixKLHJhKTtGKz1KO0o9MH12YXIgYz10aGlzLmF1ZGlvLGU9dGhpcy5yYW5nZSxnPXRoaXMuZGl2aXNpb25zSW5uZXJBbmdsZSxyPXRoaXMuZGl2aXNpb25zT3V0ZXJBbmdsZSx2PWhiLmRlZ1RvUmFkKGMucGFubmVyLmNvbmVJbm5lckFuZ2xlKTtjPWhiLmRlZ1RvUmFkKGMucGFubmVyLmNvbmVPdXRlckFuZ2xlKTt2YXIgej12LzIsRT1jLzIsRj0wLEo9MCxQLFIsUz10aGlzLmdlb21ldHJ5LFY9Uy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1MuY2xlYXJHcm91cHMoKTsKYSgtRSwteixyLDApO2EoLXoseixnLDEpO2EoeixFLHIsMCk7Vi5uZWVkc1VwZGF0ZT0hMDt2PT09YyYmKHRoaXMubWF0ZXJpYWxbMF0udmlzaWJsZT0hMSl9O2NmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbFswXS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbFsxXS5kaXNwb3NlKCl9O3ZhciBxZz1uZXcgayxCaD1uZXcgayxEaz1uZXcgdDtlZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2VnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lZztlZy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoITApO0RrLmdldE5vcm1hbE1hdHJpeCh0aGlzLm9iamVjdC5tYXRyaXhXb3JsZCk7dmFyIGE9dGhpcy5vYmplY3QubWF0cml4V29ybGQsYz10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm9iamVjdC5nZW9tZXRyeSxnPQplLnZlcnRpY2VzO2U9ZS5mYWNlcztmb3IodmFyIHI9MCx2PTAsej1lLmxlbmd0aDt2PHo7disrKXt2YXIgRT1lW3ZdLEY9RS5ub3JtYWw7cWcuY29weShnW0UuYV0pLmFkZChnW0UuYl0pLmFkZChnW0UuY10pLmRpdmlkZVNjYWxhcigzKS5hcHBseU1hdHJpeDQoYSk7QmguY29weShGKS5hcHBseU1hdHJpeDMoRGspLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKHFnKTtjLnNldFhZWihyLHFnLngscWcueSxxZy56KTtyKz0xO2Muc2V0WFlaKHIsQmgueCxCaC55LEJoLnopO3IrPTF9Yy5uZWVkc1VwZGF0ZT0hMH07dmFyIEVrPW5ldyBrLENoPW5ldyBrLEZrPW5ldyBrO2RmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtkZi5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGY7ZGYucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCk7CnRoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKX07ZGYucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe0VrLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKTtDaC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQpO0ZrLnN1YlZlY3RvcnMoQ2gsRWspO3RoaXMubGlnaHRQbGFuZS5sb29rQXQoQ2gpO3ZvaWQgMCE9PXRoaXMuY29sb3I/KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvciksdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKSk6KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpKTt0aGlzLnRhcmdldExpbmUubG9va0F0KENoKTsKdGhpcy50YXJnZXRMaW5lLnNjYWxlLno9RmsubGVuZ3RoKCl9O3ZhciBlaD1uZXcgayxPYj1uZXcgemI7ZmcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtmZy5wcm90b3R5cGUuY29uc3RydWN0b3I9Zmc7ZmcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2VvbWV0cnksYz10aGlzLnBvaW50TWFwO09iLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UpO1BiKCJjIixjLGEsT2IsMCwwLC0xKTtQYigidCIsYyxhLE9iLDAsMCwxKTtQYigibjEiLGMsYSxPYiwtMSwtMSwtMSk7UGIoIm4yIixjLGEsT2IsMSwtMSwtMSk7UGIoIm4zIixjLGEsT2IsLTEsMSwtMSk7UGIoIm40IixjLGEsT2IsMSwxLC0xKTtQYigiZjEiLGMsYSxPYiwtMSwtMSwxKTtQYigiZjIiLGMsYSxPYiwxLC0xLDEpO1BiKCJmMyIsYyxhLE9iLC0xLDEsMSk7UGIoImY0IixjLGEsT2IsMSwxLDEpO1BiKCJ1MSIsCmMsYSxPYiwuNywxLjEsLTEpO1BiKCJ1MiIsYyxhLE9iLC0uNywxLjEsLTEpO1BiKCJ1MyIsYyxhLE9iLDAsMiwtMSk7UGIoImNmMSIsYyxhLE9iLC0xLDAsMSk7UGIoImNmMiIsYyxhLE9iLDEsMCwxKTtQYigiY2YzIixjLGEsT2IsMCwtMSwxKTtQYigiY2Y0IixjLGEsT2IsMCwxLDEpO1BiKCJjbjEiLGMsYSxPYiwtMSwwLC0xKTtQYigiY24yIixjLGEsT2IsMSwwLC0xKTtQYigiY24zIixjLGEsT2IsMCwtMSwtMSk7UGIoImNuNCIsYyxhLE9iLDAsMSwtMSk7YS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITB9O3ZhciBEaD1uZXcgdztoZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2hkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZDtoZC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEmJmNvbnNvbGUud2FybigiVEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMuIik7dm9pZCAwIT09CnRoaXMub2JqZWN0JiZEaC5zZXRGcm9tT2JqZWN0KHRoaXMub2JqZWN0KTtpZighRGguaXNFbXB0eSgpKXthPURoLm1pbjt2YXIgYz1EaC5tYXgsZT10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZz1lLmFycmF5O2dbMF09Yy54O2dbMV09Yy55O2dbMl09Yy56O2dbM109YS54O2dbNF09Yy55O2dbNV09Yy56O2dbNl09YS54O2dbN109YS55O2dbOF09Yy56O2dbOV09Yy54O2dbMTBdPWEueTtnWzExXT1jLno7Z1sxMl09Yy54O2dbMTNdPWMueTtnWzE0XT1hLno7Z1sxNV09YS54O2dbMTZdPWMueTtnWzE3XT1hLno7Z1sxOF09YS54O2dbMTldPWEueTtnWzIwXT1hLno7Z1syMV09Yy54O2dbMjJdPWEueTtnWzIzXT1hLno7ZS5uZWVkc1VwZGF0ZT0hMDt0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfX07aGQucHJvdG90eXBlLnNldEZyb21PYmplY3Q9ZnVuY3Rpb24oYSl7dGhpcy5vYmplY3Q9YTt0aGlzLnVwZGF0ZSgpO3JldHVybiB0aGlzfTtoZC5wcm90b3R5cGUuY29weT0KZnVuY3Rpb24oYSl7SWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMub2JqZWN0PWEub2JqZWN0O3JldHVybiB0aGlzfTtoZC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9O2dnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7Z2cucHJvdG90eXBlLmNvbnN0cnVjdG9yPWdnO2dnLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZD1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmJveDtjLmlzRW1wdHkoKXx8KGMuZ2V0Q2VudGVyKHRoaXMucG9zaXRpb24pLGMuZ2V0U2l6ZSh0aGlzLnNjYWxlKSx0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKC41KSxBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSkpfTtoZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpO2hnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZztoZy5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9CmZ1bmN0aW9uKGEpe3ZhciBjPS10aGlzLnBsYW5lLmNvbnN0YW50OzFFLTg+TWF0aC5hYnMoYykmJihjPTFFLTgpO3RoaXMuc2NhbGUuc2V0KC41KnRoaXMuc2l6ZSwuNSp0aGlzLnNpemUsYyk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5zaWRlPTA+Yz8xOjA7dGhpcy5sb29rQXQodGhpcy5wbGFuZS5ub3JtYWwpO0EucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcyxhKX07dmFyIEdrPW5ldyBrLGZoLHZpO2lkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtpZC5wcm90b3R5cGUuY29uc3RydWN0b3I9aWQ7aWQucHJvdG90eXBlLnNldERpcmVjdGlvbj1mdW5jdGlvbihhKXsuOTk5OTk8YS55P3RoaXMucXVhdGVybmlvbi5zZXQoMCwwLDAsMSk6LS45OTk5OT5hLnk/dGhpcy5xdWF0ZXJuaW9uLnNldCgxLDAsMCwwKTooR2suc2V0KGEueiwwLC1hLngpLm5vcm1hbGl6ZSgpLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKEdrLE1hdGguYWNvcyhhLnkpKSl9OwppZC5wcm90b3R5cGUuc2V0TGVuZ3RoPWZ1bmN0aW9uKGEsYyxlKXt2b2lkIDA9PT1jJiYoYz0uMiphKTt2b2lkIDA9PT1lJiYoZT0uMipjKTt0aGlzLmxpbmUuc2NhbGUuc2V0KDEsTWF0aC5tYXgoMCxhLWMpLDEpO3RoaXMubGluZS51cGRhdGVNYXRyaXgoKTt0aGlzLmNvbmUuc2NhbGUuc2V0KGUsYyxlKTt0aGlzLmNvbmUucG9zaXRpb24ueT1hO3RoaXMuY29uZS51cGRhdGVNYXRyaXgoKX07aWQucHJvdG90eXBlLnNldENvbG9yPWZ1bmN0aW9uKGEpe3RoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQoYSk7dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldChhKX07aWQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSwhMSk7dGhpcy5saW5lLmNvcHkoYS5saW5lKTt0aGlzLmNvbmUuY29weShhLmNvbmUpO3JldHVybiB0aGlzfTtpZC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9OwppZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2lnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1pZztaYS5jcmVhdGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLmxvZygiVEhSRUUuQ3VydmUuY3JlYXRlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCIpO2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucHJvdG90eXBlLmdldFBvaW50PWM7cmV0dXJuIGF9O09iamVjdC5hc3NpZ24oZ2QucHJvdG90eXBlLHtjcmVhdGVQb2ludHNHZW9tZXRyeTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuIik7YT10aGlzLmdldFBvaW50cyhhKTtyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeShhKX0sY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpOwphPXRoaXMuZ2V0U3BhY2VkUG9pbnRzKGEpO3JldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KGEpfSxjcmVhdGVHZW9tZXRyeTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuIik7Zm9yKHZhciBjPW5ldyB5YSxlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXt2YXIgcj1hW2VdO2MudmVydGljZXMucHVzaChuZXcgayhyLngsci55LHIuenx8MCkpfXJldHVybiBjfX0pO09iamVjdC5hc3NpZ24oR2MucHJvdG90eXBlLHtmcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUGF0aDogLmZyb21Qb2ludHMoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUG9pbnRzKCkuIik7dGhpcy5zZXRGcm9tUG9pbnRzKGEpfX0pO1pqLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSk7CmFrLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSk7d2kucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmIucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKHdpLnByb3RvdHlwZSx7aW5pdEZyb21BcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNwbGluZTogLmluaXRGcm9tQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxnZXRDb250cm9sUG9pbnRzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5nZXRDb250cm9sUG9pbnRzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyZXBhcmFtZXRyaXplQnlBcmNMZW5ndGg6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO2NoLnByb3RvdHlwZS5zZXRDb2xvcnM9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5HcmlkSGVscGVyOiBzZXRDb2xvcnMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBwYXNzIHRoZW0gaW4gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuIil9OwpZZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2tlbGV0b25IZWxwZXI6IHVwZGF0ZSgpIG5vIGxvbmdlciBuZWVkcyB0byBiZSBjYWxsZWQuIil9O09iamVjdC5hc3NpZ24oRGIucHJvdG90eXBlLHtleHRyYWN0VXJsQmFzZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxvYWRlcjogLmV4dHJhY3RVcmxCYXNlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkxvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCkgaW5zdGVhZC4iKTtyZXR1cm4gUGkuZXh0cmFjdFVybEJhc2UoYSl9fSk7T2JqZWN0LmFzc2lnbihaZy5wcm90b3R5cGUse3NldFRleHR1cmVQYXRoOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiAuc2V0VGV4dHVyZVBhdGgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRSZXNvdXJjZVBhdGgoKS4iKTtyZXR1cm4gdGhpcy5zZXRSZXNvdXJjZVBhdGgoYSl9fSk7T2JqZWN0LmFzc2lnbih0aS5wcm90b3R5cGUsCntjZW50ZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGEpfSxlbXB0eTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpO3JldHVybiB0aGlzLmlzRW1wdHkoKX0saXNJbnRlcnNlY3Rpb25Cb3g6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveChhKX0sc2l6ZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLiIpO3JldHVybiB0aGlzLmdldFNpemUoYSl9fSk7T2JqZWN0LmFzc2lnbih3LnByb3RvdHlwZSwKe2NlbnRlcjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4iKTtyZXR1cm4gdGhpcy5nZXRDZW50ZXIoYSl9LGVtcHR5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuIik7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfSxpc0ludGVyc2VjdGlvbkJveDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KGEpfSxpc0ludGVyc2VjdGlvblNwaGVyZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGEpfSwKc2l6ZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLiIpO3JldHVybiB0aGlzLmdldFNpemUoYSl9fSk7dWkucHJvdG90eXBlLmNlbnRlcj1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGEpfTtPYmplY3QuYXNzaWduKGhiLHtyYW5kb20xNjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLnJhbmRvbTE2KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIE1hdGgucmFuZG9tKCkgaW5zdGVhZC4iKTtyZXR1cm4gTWF0aC5yYW5kb20oKX0sbmVhcmVzdFBvd2VyT2ZUd286ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRoOiAubmVhcmVzdFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mbG9vclBvd2VyT2ZUd28oKS4iKTsKcmV0dXJuIGhiLmZsb29yUG93ZXJPZlR3byhhKX0sbmV4dFBvd2VyT2ZUd286ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRoOiAubmV4dFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jZWlsUG93ZXJPZlR3bygpLiIpO3JldHVybiBoYi5jZWlsUG93ZXJPZlR3byhhKX19KTtPYmplY3QuYXNzaWduKHQucHJvdG90eXBlLHtmbGF0dGVuVG9BcnJheU9mZnNldDpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy50b0FycmF5KGEsYyl9LG11bHRpcGx5VmVjdG9yMzpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4iKTtyZXR1cm4gYS5hcHBseU1hdHJpeDModGhpcyl9LAptdWx0aXBseVZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFwcGx5VG9CdWZmZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb0J1ZmZlcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGEpfSxhcHBseVRvVmVjdG9yM0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5hc3NpZ24ocS5wcm90b3R5cGUse2V4dHJhY3RQb3NpdGlvbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4iKTsKcmV0dXJuIHRoaXMuY29weVBvc2l0aW9uKGEpfSxmbGF0dGVuVG9BcnJheU9mZnNldDpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy50b0FycmF5KGEsYyl9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuKG5ldyBrKS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMyl9LHNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkuIik7CnJldHVybiB0aGlzLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKGEpfSxtdWx0aXBseVRvQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxtdWx0aXBseVZlY3RvcjM6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMpfSxtdWx0aXBseVZlY3RvcjQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3I0KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMpfSxtdWx0aXBseVZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LApyb3RhdGVBeGlzOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy50cmFuc2Zvcm1EaXJlY3Rpb24oIG1hdHJpeCApIGluc3RlYWQuIik7YS50cmFuc2Zvcm1EaXJlY3Rpb24odGhpcyl9LGNyb3NzVmVjdG9yOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmNyb3NzVmVjdG9yKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMpfSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scm90YXRlWDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVYKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scm90YXRlWTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVZKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCnJvdGF0ZVo6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZUJ5QXhpczpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhcHBseVRvQnVmZmVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShhKX0sYXBwbHlUb1ZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sbWFrZUZydXN0dW06ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VGcnVzdHVtKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkgaW5zdGVhZC4iKTsKcmV0dXJuIHRoaXMubWFrZVBlcnNwZWN0aXZlKGEsYyxnLGUscix2KX19KTtIYi5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25MaW5lPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzTGluZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNMaW5lKGEpfTtoLnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjM9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGlzIG5vdyB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICkgaW5zdGVhZC4iKTtyZXR1cm4gYS5hcHBseVF1YXRlcm5pb24odGhpcyl9O09iamVjdC5hc3NpZ24oRC5wcm90b3R5cGUse2lzSW50ZXJzZWN0aW9uQm94OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7CnJldHVybiB0aGlzLmludGVyc2VjdHNCb3goYSl9LGlzSW50ZXJzZWN0aW9uUGxhbmU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1BsYW5lKCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1BsYW5lKGEpfSxpc0ludGVyc2VjdGlvblNwaGVyZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoYSl9fSk7T2JqZWN0LmFzc2lnbihCLnByb3RvdHlwZSx7YXJlYTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5hcmVhKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QXJlYSgpLiIpO3JldHVybiB0aGlzLmdldEFyZWEoKX0sYmFyeWNvb3JkRnJvbVBvaW50OmZ1bmN0aW9uKGEsCmMpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4iKTtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQoYSxjKX0sbWlkcG9pbnQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm1pZHBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0TWlkcG9pbnQoKS4iKTtyZXR1cm4gdGhpcy5nZXRNaWRwb2ludChhKX0sbm9ybWFsOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4iKTtyZXR1cm4gdGhpcy5nZXROb3JtYWwoYSl9LHBsYW5lOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5wbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFBsYW5lKCkuIik7cmV0dXJuIHRoaXMuZ2V0UGxhbmUoYSl9fSk7T2JqZWN0LmFzc2lnbihCLAp7YmFyeWNvb3JkRnJvbVBvaW50OmZ1bmN0aW9uKGEsYyxlLGcscil7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLiIpO3JldHVybiBCLmdldEJhcnljb29yZChhLGMsZSxnLHIpfSxub3JtYWw6ZnVuY3Rpb24oYSxjLGUsZyl7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLiIpO3JldHVybiBCLmdldE5vcm1hbChhLGMsZSxnKX19KTtPYmplY3QuYXNzaWduKENkLnByb3RvdHlwZSx7ZXh0cmFjdEFsbFBvaW50czpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cmFjdEFsbFBvaW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZXh0cmFjdFBvaW50cygpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuZXh0cmFjdFBvaW50cyhhKX0sZXh0cnVkZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLiIpOwpyZXR1cm4gbmV3IFVkKHRoaXMsYSl9LG1ha2VHZW9tZXRyeTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAubWFrZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgVmQodGhpcyxhKX19KTtPYmplY3QuYXNzaWduKGYucHJvdG90eXBlLHtmcm9tQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3JldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxjLGUpfSxkaXN0YW5jZVRvTWFuaGF0dGFuOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuIik7cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyhhKX0sCmxlbmd0aE1hbmhhdHRhbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfX0pO09iamVjdC5hc3NpZ24oay5wcm90b3R5cGUse3NldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGluc3RlYWQuIil9LHNldEV1bGVyRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUXVhdGVybmlvbigpIGluc3RlYWQuIil9LGdldFBvc2l0aW9uRnJvbU1hdHJpeDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5nZXRQb3NpdGlvbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4UG9zaXRpb24oKS4iKTsKcmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEpfSxnZXRTY2FsZUZyb21NYXRyaXg6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuIik7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFNjYWxlKGEpfSxnZXRDb2x1bW5Gcm9tTWF0cml4OmZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4iKTtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGMsYSl9LGFwcGx5UHJvamVjdGlvbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGEpfSwKZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsYyxlKX0sZGlzdGFuY2VUb01hbmhhdHRhbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oYSl9LGxlbmd0aE1hbmhhdHRhbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfX0pO09iamVjdC5hc3NpZ24ocC5wcm90b3R5cGUsCntmcm9tQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3JldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxjLGUpfSxsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKHlhLnByb3RvdHlwZSx7Y29tcHV0ZVRhbmdlbnRzOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxjb21wdXRlTGluZURpc3RhbmNlczpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpIGluc3RlYWQuIil9fSk7Ck9iamVjdC5hc3NpZ24oQS5wcm90b3R5cGUse2dldENoaWxkQnlOYW1lOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRDaGlsZEJ5TmFtZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE9iamVjdEJ5TmFtZSgpLiIpO3JldHVybiB0aGlzLmdldE9iamVjdEJ5TmFtZShhKX0scmVuZGVyRGVwdGg6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAucmVuZGVyRGVwdGggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5yZW5kZXJPcmRlciwgaW5zdGVhZC4iKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAudHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGMsYSl9LGdldFdvcmxkUm90YXRpb246ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUm90YXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuT2JqZWN0M0QuZ2V0V29ybGRRdWF0ZXJuaW9uKCB0YXJnZXQgKSBpbnN0ZWFkLiIpfX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhBLnByb3RvdHlwZSx7ZXVsZXJPcmRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4iKTtyZXR1cm4gdGhpcy5yb3RhdGlvbi5vcmRlcn0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIik7dGhpcy5yb3RhdGlvbi5vcmRlcj1hfX0sdXNlUXVhdGVybmlvbjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4iKX19fSk7Ck9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFmLnByb3RvdHlwZSx7b2JqZWN0czp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MT0Q6IC5vYmplY3RzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmxldmVscy4iKTtyZXR1cm4gdGhpcy5sZXZlbHN9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShDZy5wcm90b3R5cGUsInVzZVZlcnRleFRleHR1cmUiLHtnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtCZi5wcm90b3R5cGUuaW5pdEJvbmVzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2tpbm5lZE1lc2g6IGluaXRCb25lcygpIGhhcyBiZWVuIHJlbW92ZWQuIil9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShaYS5wcm90b3R5cGUsCiJfX2FyY0xlbmd0aERpdmlzaW9ucyIse2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4iKTtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnN9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuIik7dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9YX19KTt2Yi5wcm90b3R5cGUuc2V0TGVucz1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEuc2V0TGVucyBpcyBkZXByZWNhdGVkLiBVc2UgLnNldEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdlIGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC4iKTt2b2lkIDAhPT1jJiYodGhpcy5maWxtR2F1Z2U9Yyk7dGhpcy5zZXRGb2NhbExlbmd0aChhKX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSmIucHJvdG90eXBlLAp7b25seVNoYWRvdzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLm9ubHlTaGFkb3cgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHNoYWRvd0NhbWVyYUZvdjp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGb3YgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZvdi4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuZm92PWF9fSxzaGFkb3dDYW1lcmFMZWZ0OntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUxlZnQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmxlZnQuIik7dGhpcy5zaGFkb3cuY2FtZXJhLmxlZnQ9YX19LHNoYWRvd0NhbWVyYVJpZ2h0OntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4iKTt0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQ9YX19LHNoYWRvd0NhbWVyYVRvcDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFUb3AgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnRvcC4iKTsKdGhpcy5zaGFkb3cuY2FtZXJhLnRvcD1hfX0sc2hhZG93Q2FtZXJhQm90dG9tOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUJvdHRvbSBpcyBub3cgLnNoYWRvdy5jYW1lcmEuYm90dG9tLiIpO3RoaXMuc2hhZG93LmNhbWVyYS5ib3R0b209YX19LHNoYWRvd0NhbWVyYU5lYXI6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTmVhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEubmVhci4iKTt0aGlzLnNoYWRvdy5jYW1lcmEubmVhcj1hfX0sc2hhZG93Q2FtZXJhRmFyOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZmFyLiIpO3RoaXMuc2hhZG93LmNhbWVyYS5mYXI9YX19LHNoYWRvd0NhbWVyYVZpc2libGU6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFWaXNpYmxlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBsaWdodC5zaGFkb3cuY2FtZXJhICkgaW5zdGVhZC4iKX19LApzaGFkb3dCaWFzOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0JpYXMgaXMgbm93IC5zaGFkb3cuYmlhcy4iKTt0aGlzLnNoYWRvdy5iaWFzPWF9fSxzaGFkb3dEYXJrbmVzczp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0RhcmtuZXNzIGhhcyBiZWVuIHJlbW92ZWQuIil9fSxzaGFkb3dNYXBXaWR0aDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBXaWR0aCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLndpZHRoLiIpO3RoaXMuc2hhZG93Lm1hcFNpemUud2lkdGg9YX19LHNoYWRvd01hcEhlaWdodDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuIik7dGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQ9YX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUS5wcm90b3R5cGUsCntsZW5ndGg6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAubGVuZ3RoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuY291bnQgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy5hcnJheS5sZW5ndGh9fSxjb3B5SW5kaWNlc0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuY29weUluZGljZXNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7T2JqZWN0LmFzc2lnbih2YS5wcm90b3R5cGUse2FkZEluZGV4OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuIik7dGhpcy5zZXRJbmRleChhKX0sYWRkRHJhd0NhbGw6ZnVuY3Rpb24oYSxjLGUpe3ZvaWQgMCE9PWUmJmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIG5vIGxvbmdlciBzdXBwb3J0cyBpbmRleE9mZnNldC4iKTsKY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLiIpO3RoaXMuYWRkR3JvdXAoYSxjKX0sY2xlYXJEcmF3Q2FsbHM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY2xlYXJEcmF3Q2FsbHMoKSBpcyBub3cgLmNsZWFyR3JvdXBzKCkuIik7dGhpcy5jbGVhckdyb3VwcygpfSxjb21wdXRlVGFuZ2VudHM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sY29tcHV0ZU9mZnNldHM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZU9mZnNldHMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHZhLnByb3RvdHlwZSx7ZHJhd2NhbGxzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuIik7CnJldHVybiB0aGlzLmdyb3Vwc319LG9mZnNldHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5vZmZzZXRzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdyb3Vwcy4iKTtyZXR1cm4gdGhpcy5ncm91cHN9fX0pO09iamVjdC5hc3NpZ24oUmMucHJvdG90eXBlLHtnZXRBcnJheXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5nZXRBcnJheXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhZGRTaGFwZUxpc3Q6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZUxpc3QoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhZGRTaGFwZTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiaC5wcm90b3R5cGUsCntkeW5hbWljOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlVuaWZvcm06IC5keW5hbWljIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLiIpfX0sb25VcGRhdGU6e3ZhbHVlOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiAub25VcGRhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpc319fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTS5wcm90b3R5cGUse3dyYXBBcm91bmQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuIil9fSxvdmVyZHJhdzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogLm92ZXJkcmF3IGhhcyBiZWVuIHJlbW92ZWQuIil9LApzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHdyYXBSR0I6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC53cmFwUkdCIGhhcyBiZWVuIHJlbW92ZWQuIik7cmV0dXJuIG5ldyBJfX0sc2hhZGluZzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuIik7dGhpcy5mbGF0U2hhZGluZz0xPT09YX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmMucHJvdG90eXBlLHttZXRhbDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkLiIpOwpyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHFiLnByb3RvdHlwZSx7ZGVyaXZhdGl2ZXM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS4gU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4iKTt0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXM9YX19fSk7T2JqZWN0LmFzc2lnbihPaC5wcm90b3R5cGUsCntjbGVhclRhcmdldDpmdW5jdGlvbihhLGMsZSxnKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5jbGVhclRhcmdldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2V0UmVuZGVyVGFyZ2V0KCkgYW5kIC5jbGVhcigpIGluc3RlYWQuIik7dGhpcy5zZXRSZW5kZXJUYXJnZXQoYSk7dGhpcy5jbGVhcihjLGUsZyl9LGFuaW1hdGU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYW5pbWF0ZSgpIGlzIG5vdyAuc2V0QW5pbWF0aW9uTG9vcCgpLiIpO3RoaXMuc2V0QW5pbWF0aW9uTG9vcChhKX0sZ2V0Q3VycmVudFJlbmRlclRhcmdldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJnZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLiIpO3JldHVybiB0aGlzLmdldFJlbmRlclRhcmdldCgpfSxnZXRNYXhBbmlzb3Ryb3B5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0TWF4QW5pc290cm9weSgpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKS4iKTsKcmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKX0sZ2V0UHJlY2lzaW9uOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLiIpO3JldHVybiB0aGlzLmNhcGFiaWxpdGllcy5wcmVjaXNpb259LHJlc2V0R0xTdGF0ZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnJlc2V0R0xTdGF0ZSgpIGlzIG5vdyAuc3RhdGUucmVzZXQoKS4iKTtyZXR1cm4gdGhpcy5zdGF0ZS5yZXNldCgpfSxzdXBwb3J0c0Zsb2F0VGV4dHVyZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0Zsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0Iil9LApzdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Iil9LHN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpfSxzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQzpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApLiIpOwpyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKX0sc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil9LHN1cHBvcnRzQmxlbmRNaW5NYXg6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIkVYVF9ibGVuZF9taW5tYXgiKX0sc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMoKSBpcyBub3cgLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcy4iKTsKcmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzfSxzdXBwb3J0c0luc3RhbmNlZEFycmF5czpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKX0sZW5hYmxlU2Npc3NvclRlc3Q6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZW5hYmxlU2Npc3NvclRlc3QoKSBpcyBub3cgLnNldFNjaXNzb3JUZXN0KCkuIik7dGhpcy5zZXRTY2lzc29yVGVzdChhKX0saW5pdE1hdGVyaWFsOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkUHJlUGx1Z2luOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUHJlUGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCmFkZFBvc3RQbHVnaW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sdXBkYXRlU2hhZG93TWFwOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudXBkYXRlU2hhZG93TWFwKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0RmFjZUN1bGxpbmc6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRGYWNlQ3VsbGluZygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFsbG9jVGV4dHVyZVVuaXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hbGxvY1RleHR1cmVVbml0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0VGV4dHVyZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXRUZXh0dXJlMkQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlMkQoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwKc2V0VGV4dHVyZUN1YmU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlQ3ViZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGdldEFjdGl2ZU1pcE1hcExldmVsOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0QWN0aXZlTWlwTWFwTGV2ZWwoKSBpcyBub3cgLmdldEFjdGl2ZU1pcG1hcExldmVsKCkuIik7cmV0dXJuIHRoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPaC5wcm90b3R5cGUse3NoYWRvd01hcEVuYWJsZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLiIpO3RoaXMuc2hhZG93TWFwLmVuYWJsZWQ9YX19LHNoYWRvd01hcFR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC50eXBlfSwKc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcFR5cGUgaXMgbm93IC5zaGFkb3dNYXAudHlwZS4iKTt0aGlzLnNoYWRvd01hcC50eXBlPWF9fSxzaGFkb3dNYXBDdWxsRmFjZTp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19LGNvbnRleHQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNvbnRleHQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5nZXRDb250ZXh0KCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy5nZXRDb250ZXh0KCl9fX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyh2ai5wcm90b3R5cGUse2N1bGxGYWNlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxyZW5kZXJSZXZlcnNlU2lkZWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0sCnJlbmRlclNpbmdsZVNpZGVkOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE5iLnByb3RvdHlwZSx7YWN0aXZlQ3ViZUZhY2U6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlOiAuYWN0aXZlQ3ViZUZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gSXQgaXMgbm93IHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIFdlYkdMUmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCkuIil9fSwKYWN0aXZlTWlwTWFwTGV2ZWw6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlOiAuYWN0aXZlTWlwTWFwTGV2ZWwgaGFzIGJlZW4gcmVtb3ZlZC4gSXQgaXMgbm93IHRoZSB0aGlyZCBwYXJhbWV0ZXIgb2YgV2ViR0xSZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoKS4iKX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobS5wcm90b3R5cGUse3dyYXBTOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpO3JldHVybiB0aGlzLnRleHR1cmUud3JhcFN9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpO3RoaXMudGV4dHVyZS53cmFwUz1hfX0sd3JhcFQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuIik7CnJldHVybiB0aGlzLnRleHR1cmUud3JhcFR9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULiIpO3RoaXMudGV4dHVyZS53cmFwVD1hfX0sbWFnRmlsdGVyOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5tYWdGaWx0ZXJ9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuIik7dGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcj1hfX0sbWluRmlsdGVyOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXJ9LApzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpO3RoaXMudGV4dHVyZS5taW5GaWx0ZXI9YX19LGFuaXNvdHJvcHk6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpO3JldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weX0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpO3RoaXMudGV4dHVyZS5hbmlzb3Ryb3B5PWF9fSxvZmZzZXQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLm9mZnNldH0sCnNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIik7dGhpcy50ZXh0dXJlLm9mZnNldD1hfX0scmVwZWF0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5yZXBlYXR9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIik7dGhpcy50ZXh0dXJlLnJlcGVhdD1hfX0sZm9ybWF0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5mb3JtYXR9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuIik7CnRoaXMudGV4dHVyZS5mb3JtYXQ9YX19LHR5cGU6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLiIpO3JldHVybiB0aGlzLnRleHR1cmUudHlwZX0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLiIpO3RoaXMudGV4dHVyZS50eXBlPWF9fSxnZW5lcmF0ZU1pcG1hcHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwc30sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4iKTsKdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1hfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhOaC5wcm90b3R5cGUse3N0YW5kaW5nOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYlZSTWFuYWdlcjogLnN0YW5kaW5nIGhhcyBiZWVuIHJlbW92ZWQuIil9fSx1c2VySGVpZ2h0OntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYlZSTWFuYWdlcjogLnVzZXJIZWlnaHQgaGFzIGJlZW4gcmVtb3ZlZC4iKX19fSk7V2UucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogLmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkF1ZGlvTG9hZGVyIGluc3RlYWQuIik7dmFyIGM9dGhpczsobmV3ICRnKS5sb2FkKGEsZnVuY3Rpb24oZSl7Yy5zZXRCdWZmZXIoZSl9KTtyZXR1cm4gdGhpc307b2kucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvQW5hbHlzZXI6IC5nZXREYXRhKCkgaXMgbm93IC5nZXRGcmVxdWVuY3lEYXRhKCkuIik7CnJldHVybiB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKX07R2IucHJvdG90eXBlLnVwZGF0ZUN1YmVNYXA9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1YmVDYW1lcmE6IC51cGRhdGVDdWJlTWFwKCkgaXMgbm93IC51cGRhdGUoKS4iKTtyZXR1cm4gdGhpcy51cGRhdGUoYSxjKX07RGQuY3Jvc3NPcmlnaW49dm9pZCAwO0RkLmxvYWRUZXh0dXJlPWZ1bmN0aW9uKGEsYyxlLGcpe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuIik7dmFyIHI9bmV3IE1nO3Iuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7YT1yLmxvYWQoYSxlLHZvaWQgMCxnKTtjJiYoYS5tYXBwaW5nPWMpO3JldHVybiBhfTtEZC5sb2FkVGV4dHVyZUN1YmU9ZnVuY3Rpb24oYSxjLGUsZyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLiIpOwp2YXIgcj1uZXcgTGc7ci5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTthPXIubG9hZChhLGUsdm9pZCAwLGcpO2MmJihhLm1hcHBpbmc9Yyk7cmV0dXJuIGF9O0RkLmxvYWRDb21wcmVzc2VkVGV4dHVyZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4iKX07RGQubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuIil9O2IuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nPTU7Yi5BZGRFcXVhdGlvbj0xMDA7Yi5BZGRPcGVyYXRpb249MjtiLkFkZGl0aXZlQmxlbmRpbmc9MjtiLkFscGhhRm9ybWF0PTEwMjE7Yi5BbHdheXNEZXB0aD0KMTtiLkFsd2F5c1N0ZW5jaWxGdW5jPTUxOTtiLkFtYmllbnRMaWdodD1UZztiLkFtYmllbnRMaWdodFByb2JlPWppO2IuQW5pbWF0aW9uQ2xpcD10YztiLkFuaW1hdGlvbkxvYWRlcj1haTtiLkFuaW1hdGlvbk1peGVyPXFpO2IuQW5pbWF0aW9uT2JqZWN0R3JvdXA9U2o7Yi5BbmltYXRpb25VdGlscz1UYjtiLkFyY0N1cnZlPVZlO2IuQXJyYXlDYW1lcmE9dmY7Yi5BcnJvd0hlbHBlcj1pZDtiLkF1ZGlvPVdlO2IuQXVkaW9BbmFseXNlcj1vaTtiLkF1ZGlvQ29udGV4dD1taTtiLkF1ZGlvTGlzdGVuZXI9bGk7Yi5BdWRpb0xvYWRlcj0kZztiLkF4ZXNIZWxwZXI9aWc7Yi5BeGlzSGVscGVyPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQXhpc0hlbHBlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkF4ZXNIZWxwZXIuIik7cmV0dXJuIG5ldyBpZyhhKX07Yi5CYWNrU2lkZT0xO2IuQmFzaWNEZXB0aFBhY2tpbmc9MzIwMDtiLkJhc2ljU2hhZG93TWFwPTA7Yi5CaW5hcnlUZXh0dXJlTG9hZGVyPQpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJpbmFyeVRleHR1cmVMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4iKTtyZXR1cm4gbmV3IEtnKGEpfTtiLkJvbmU9VWg7Yi5Cb29sZWFuS2V5ZnJhbWVUcmFjaz1HZztiLkJvdW5kaW5nQm94SGVscGVyPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3VuZGluZ0JveEhlbHBlciBoYXMgYmVlbiBkZXByZWNhdGVkLiBDcmVhdGluZyBhIFRIUkVFLkJveEhlbHBlciBpbnN0ZWFkLiIpO3JldHVybiBuZXcgaGQoYSxjKX07Yi5Cb3gyPXRpO2IuQm94Mz13O2IuQm94M0hlbHBlcj1nZztiLkJveEJ1ZmZlckdlb21ldHJ5PVhhO2IuQm94R2VvbWV0cnk9U2E7Yi5Cb3hIZWxwZXI9aGQ7Yi5CdWZmZXJBdHRyaWJ1dGU9UTtiLkJ1ZmZlckdlb21ldHJ5PXZhO2IuQnVmZmVyR2VvbWV0cnlMb2FkZXI9WWc7Yi5CeXRlVHlwZT0xMDEwO2IuQ2FjaGU9aWU7Yi5DYW1lcmE9emI7Yi5DYW1lcmFIZWxwZXI9CmZnO2IuQ2FudmFzUmVuZGVyZXI9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5DYW52YXNSZW5kZXJlciBoYXMgYmVlbiByZW1vdmVkIil9O2IuQ2FudmFzVGV4dHVyZT1DZjtiLkNhdG11bGxSb21DdXJ2ZTM9WmI7Yi5DaW5lb25Ub25lTWFwcGluZz00O2IuQ2lyY2xlQnVmZmVyR2VvbWV0cnk9UWU7Yi5DaXJjbGVHZW9tZXRyeT1YZjtiLkNsYW1wVG9FZGdlV3JhcHBpbmc9MTAwMTtiLkNsb2NrPWtpO2IuQ2xvc2VkU3BsaW5lQ3VydmUzPVpqO2IuQ29sb3I9STtiLkNvbG9yS2V5ZnJhbWVUcmFjaz1IZztiLkNvbXByZXNzZWRUZXh0dXJlPURlO2IuQ29tcHJlc3NlZFRleHR1cmVMb2FkZXI9Ymk7Yi5Db25lQnVmZmVyR2VvbWV0cnk9V2Y7Yi5Db25lR2VvbWV0cnk9VmY7Yi5DdWJlQ2FtZXJhPUdiO2IuQ3ViZUdlb21ldHJ5PVNhO2IuQ3ViZVJlZmxlY3Rpb25NYXBwaW5nPTMwMTtiLkN1YmVSZWZyYWN0aW9uTWFwcGluZz0zMDI7Yi5DdWJlVGV4dHVyZT1jZDtiLkN1YmVUZXh0dXJlTG9hZGVyPQpMZztiLkN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nPTMwNjtiLkN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nPTMwNztiLkN1YmljQmV6aWVyQ3VydmU9Q2M7Yi5DdWJpY0JlemllckN1cnZlMz1UYztiLkN1YmljSW50ZXJwb2xhbnQ9RWc7Yi5DdWxsRmFjZUJhY2s9MTtiLkN1bGxGYWNlRnJvbnQ9MjtiLkN1bGxGYWNlRnJvbnRCYWNrPTM7Yi5DdWxsRmFjZU5vbmU9MDtiLkN1cnZlPVphO2IuQ3VydmVQYXRoPWdkO2IuQ3VzdG9tQmxlbmRpbmc9NTtiLkN5bGluZGVyQnVmZmVyR2VvbWV0cnk9ZmQ7Yi5DeWxpbmRlckdlb21ldHJ5PVhkO2IuQ3lsaW5kcmljYWw9WGo7Yi5EYXRhVGV4dHVyZT1BYjtiLkRhdGFUZXh0dXJlMkRBcnJheT1yZTtiLkRhdGFUZXh0dXJlM0Q9c2U7Yi5EYXRhVGV4dHVyZUxvYWRlcj1LZztiLkRlY3JlbWVudFN0ZW5jaWxPcD03NjgzO2IuRGVjcmVtZW50V3JhcFN0ZW5jaWxPcD0zNDA1NjtiLkRlZmF1bHRMb2FkaW5nTWFuYWdlcj1PajtiLkRlcHRoRm9ybWF0PTEwMjY7CmIuRGVwdGhTdGVuY2lsRm9ybWF0PTEwMjc7Yi5EZXB0aFRleHR1cmU9RGY7Yi5EaXJlY3Rpb25hbExpZ2h0PVNnO2IuRGlyZWN0aW9uYWxMaWdodEhlbHBlcj1kZjtiLkRpcmVjdGlvbmFsTGlnaHRTaGFkb3c9Umc7Yi5EaXNjcmV0ZUludGVycG9sYW50PUZnO2IuRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk9SWU7Yi5Eb2RlY2FoZWRyb25HZW9tZXRyeT1KZjtiLkRvdWJsZVNpZGU9MjtiLkRzdEFscGhhRmFjdG9yPTIwNjtiLkRzdENvbG9yRmFjdG9yPTIwODtiLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoKS5zZXREeW5hbWljKCB0cnVlICkgaW5zdGVhZC4iKTtyZXR1cm4obmV3IFEoYSxjKSkuc2V0RHluYW1pYyghMCl9O2IuRWRnZXNHZW9tZXRyeT1QZTtiLkVkZ2VzSGVscGVyPWZ1bmN0aW9uKGEsCmMpe2NvbnNvbGUud2FybigiVEhSRUUuRWRnZXNIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkVkZ2VzR2VvbWV0cnkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IEliKG5ldyBQZShhLmdlb21ldHJ5KSxuZXcgRmIoe2NvbG9yOnZvaWQgMCE9PWM/YzoxNjc3NzIxNX0pKX07Yi5FbGxpcHNlQ3VydmU9cGM7Yi5FcXVhbERlcHRoPTQ7Yi5FcXVhbFN0ZW5jaWxGdW5jPTUxNDtiLkVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nPTMwMztiLkVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nPTMwNDtiLkV1bGVyPXU7Yi5FdmVudERpc3BhdGNoZXI9ZDtiLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeT1SYztiLkV4dHJ1ZGVHZW9tZXRyeT1VZDtiLkZhY2UzPUs7Yi5GYWNlND1mdW5jdGlvbihhLGMsZSxnLHIsdix6KXtjb25zb2xlLndhcm4oIlRIUkVFLkZhY2U0IGhhcyBiZWVuIHJlbW92ZWQuIEEgVEhSRUUuRmFjZTMgd2lsbCBiZSBjcmVhdGVkIGluc3RlYWQuIik7cmV0dXJuIG5ldyBLKGEsCmMsZSxyLHYseil9O2IuRmFjZUNvbG9ycz0xO2IuRmFjZU5vcm1hbHNIZWxwZXI9ZWc7Yi5GaWxlTG9hZGVyPXVjO2IuRmxhdFNoYWRpbmc9MTtiLkZsb2F0MzJBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkZsb2F0MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGNhKGEsYyl9O2IuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZT1jYTtiLkZsb2F0NjRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkZsb2F0NjRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDY0QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGthKGEsYyl9O2IuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZT1rYTtiLkZsb2F0VHlwZT0xMDE1O2IuRm9nPUFnO2IuRm9nRXhwMj16ZztiLkZvbnQ9Z2k7CmIuRm9udExvYWRlcj1oaTtiLkZyb250RmFjZURpcmVjdGlvbkNDVz0xO2IuRnJvbnRGYWNlRGlyZWN0aW9uQ1c9MDtiLkZyb250U2lkZT0wO2IuRnJ1c3R1bT1pYztiLkdhbW1hRW5jb2Rpbmc9MzAwNztiLkdlb21ldHJ5PXlhO2IuR2VvbWV0cnlVdGlscz17bWVyZ2U6ZnVuY3Rpb24oYSxjLGUpe2NvbnNvbGUud2FybigiVEhSRUUuR2VvbWV0cnlVdGlsczogLm1lcmdlKCkgaGFzIGJlZW4gbW92ZWQgdG8gR2VvbWV0cnkuIFVzZSBnZW9tZXRyeS5tZXJnZSggZ2VvbWV0cnkyLCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSBpbnN0ZWFkLiIpO2lmKGMuaXNNZXNoKXtjLm1hdHJpeEF1dG9VcGRhdGUmJmMudXBkYXRlTWF0cml4KCk7dmFyIGc9Yy5tYXRyaXg7Yz1jLmdlb21ldHJ5fWEubWVyZ2UoYyxnLGUpfSxjZW50ZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5HZW9tZXRyeVV0aWxzOiAuY2VudGVyKCkgaGFzIGJlZW4gbW92ZWQgdG8gR2VvbWV0cnkuIFVzZSBnZW9tZXRyeS5jZW50ZXIoKSBpbnN0ZWFkLiIpOwpyZXR1cm4gYS5jZW50ZXIoKX19O2IuR3JlYXRlckRlcHRoPTY7Yi5HcmVhdGVyRXF1YWxEZXB0aD01O2IuR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM9NTE4O2IuR3JlYXRlclN0ZW5jaWxGdW5jPTUxNjtiLkdyaWRIZWxwZXI9Y2g7Yi5Hcm91cD11ZTtiLkhhbGZGbG9hdFR5cGU9MTAxNjtiLkhlbWlzcGhlcmVMaWdodD1OZztiLkhlbWlzcGhlcmVMaWdodEhlbHBlcj1hZjtiLkhlbWlzcGhlcmVMaWdodFByb2JlPWlpO2IuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeT1IZTtiLkljb3NhaGVkcm9uR2VvbWV0cnk9SWY7Yi5JbWFnZUJpdG1hcExvYWRlcj1laTtiLkltYWdlTG9hZGVyPVVlO2IuSW1hZ2VVdGlscz1EZDtiLkltbWVkaWF0ZVJlbmRlck9iamVjdD1jZztiLkluY3JlbWVudFN0ZW5jaWxPcD03NjgyO2IuSW5jcmVtZW50V3JhcFN0ZW5jaWxPcD0zNDA1NTtiLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT1YZztiLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PVdnO2IuSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI9CnJpO2IuSW50MTZBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgbGEoYSxjKX07Yi5JbnQxNkJ1ZmZlckF0dHJpYnV0ZT1sYTtiLkludDMyQXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGJhKGEsYyl9O2IuSW50MzJCdWZmZXJBdHRyaWJ1dGU9YmE7Yi5JbnQ4QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBUKGEsCmMpfTtiLkludDhCdWZmZXJBdHRyaWJ1dGU9VDtiLkludFR5cGU9MTAxMztiLkludGVybGVhdmVkQnVmZmVyPVFkO2IuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU9eGY7Yi5JbnRlcnBvbGFudD1vYztiLkludGVycG9sYXRlRGlzY3JldGU9MjMwMDtiLkludGVycG9sYXRlTGluZWFyPTIzMDE7Yi5JbnRlcnBvbGF0ZVNtb290aD0yMzAyO2IuSW52ZXJ0U3RlbmNpbE9wPTUzODY7Yi5KU09OTG9hZGVyPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuSlNPTkxvYWRlciBoYXMgYmVlbiByZW1vdmVkLiIpfTtiLktlZXBTdGVuY2lsT3A9NzY4MDtiLktleWZyYW1lVHJhY2s9WGI7Yi5MT0Q9QWY7Yi5MYXRoZUJ1ZmZlckdlb21ldHJ5PU9lO2IuTGF0aGVHZW9tZXRyeT1VZjtiLkxheWVycz14O2IuTGVuc0ZsYXJlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTGVuc0ZsYXJlIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy9vYmplY3RzL0xlbnNmbGFyZS5qcyIpfTsKYi5MZXNzRGVwdGg9MjtiLkxlc3NFcXVhbERlcHRoPTM7Yi5MZXNzRXF1YWxTdGVuY2lsRnVuYz01MTU7Yi5MZXNzU3RlbmNpbEZ1bmM9NTEzO2IuTGlnaHQ9SmI7Yi5MaWdodFByb2JlPUhjO2IuTGlnaHRQcm9iZUhlbHBlcj1iZjtiLkxpZ2h0U2hhZG93PVZjO2IuTGluZT1WYjtiLkxpbmUzPXVpO2IuTGluZUJhc2ljTWF0ZXJpYWw9RmI7Yi5MaW5lQ3VydmU9a2M7Yi5MaW5lQ3VydmUzPURjO2IuTGluZURhc2hlZE1hdGVyaWFsPWRlO2IuTGluZUxvb3A9RGc7Yi5MaW5lUGllY2VzPTE7Yi5MaW5lU2VnbWVudHM9SWI7Yi5MaW5lU3RyaXA9MDtiLkxpbmVhckVuY29kaW5nPTNFMztiLkxpbmVhckZpbHRlcj0xMDA2O2IuTGluZWFySW50ZXJwb2xhbnQ9WWY7Yi5MaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI9MTAwODtiLkxpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXI9MTAwNztiLkxpbmVhck1pcG1hcExpbmVhckZpbHRlcj0xMDA4O2IuTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcj0xMDA3OwpiLkxpbmVhclRvbmVNYXBwaW5nPTE7Yi5Mb2FkZXI9RGI7Yi5Mb2FkZXJVdGlscz1QaTtiLkxvYWRpbmdNYW5hZ2VyPSRoO2IuTG9nTHV2RW5jb2Rpbmc9MzAwMztiLkxvb3BPbmNlPTIyMDA7Yi5Mb29wUGluZ1Bvbmc9MjIwMjtiLkxvb3BSZXBlYXQ9MjIwMTtiLkx1bWluYW5jZUFscGhhRm9ybWF0PTEwMjU7Yi5MdW1pbmFuY2VGb3JtYXQ9MTAyNDtiLk1PVVNFPXtMRUZUOjAsTUlERExFOjEsUklHSFQ6MixST1RBVEU6MCxET0xMWToxLFBBTjoyfTtiLk1hdGVyaWFsPU07Yi5NYXRlcmlhbExvYWRlcj1WZztiLk1hdGg9aGI7Yi5NYXRyaXgzPXQ7Yi5NYXRyaXg0PXE7Yi5NYXhFcXVhdGlvbj0xMDQ7Yi5NZXNoPXhhO2IuTWVzaEJhc2ljTWF0ZXJpYWw9TDtiLk1lc2hEZXB0aE1hdGVyaWFsPXZkO2IuTWVzaERpc3RhbmNlTWF0ZXJpYWw9d2Q7Yi5NZXNoRmFjZU1hdGVyaWFsPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaEZhY2VNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4iKTsKcmV0dXJuIGF9O2IuTWVzaExhbWJlcnRNYXRlcmlhbD1iZTtiLk1lc2hNYXRjYXBNYXRlcmlhbD1jZTtiLk1lc2hOb3JtYWxNYXRlcmlhbD1hZTtiLk1lc2hQaG9uZ01hdGVyaWFsPUJjO2IuTWVzaFBoeXNpY2FsTWF0ZXJpYWw9WmQ7Yi5NZXNoU3RhbmRhcmRNYXRlcmlhbD1TYztiLk1lc2hUb29uTWF0ZXJpYWw9JGQ7Yi5NaW5FcXVhdGlvbj0xMDM7Yi5NaXJyb3JlZFJlcGVhdFdyYXBwaW5nPTEwMDI7Yi5NaXhPcGVyYXRpb249MTtiLk11bHRpTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9W10pO2NvbnNvbGUud2FybigiVEhSRUUuTXVsdGlNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4iKTthLmlzTXVsdGlNYXRlcmlhbD0hMDthLm1hdGVyaWFscz1hO2EuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5zbGljZSgpfTtyZXR1cm4gYX07Yi5NdWx0aXBseUJsZW5kaW5nPTQ7Yi5NdWx0aXBseU9wZXJhdGlvbj0wO2IuTmVhcmVzdEZpbHRlcj0KMTAwMztiLk5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI9MTAwNTtiLk5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyPTEwMDQ7Yi5OZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyPTEwMDU7Yi5OZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcj0xMDA0O2IuTmV2ZXJEZXB0aD0wO2IuTmV2ZXJTdGVuY2lsRnVuYz01MTI7Yi5Ob0JsZW5kaW5nPTA7Yi5Ob0NvbG9ycz0wO2IuTm9Ub25lTWFwcGluZz0wO2IuTm9ybWFsQmxlbmRpbmc9MTtiLk5vdEVxdWFsRGVwdGg9NztiLk5vdEVxdWFsU3RlbmNpbEZ1bmM9NTE3O2IuTnVtYmVyS2V5ZnJhbWVUcmFjaz1TZTtiLk9iamVjdDNEPUE7Yi5PYmplY3RMb2FkZXI9Wmc7Yi5PYmplY3RTcGFjZU5vcm1hbE1hcD0xO2IuT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5PVJkO2IuT2N0YWhlZHJvbkdlb21ldHJ5PUhmO2IuT25lRmFjdG9yPTIwMTtiLk9uZU1pbnVzRHN0QWxwaGFGYWN0b3I9MjA3O2IuT25lTWludXNEc3RDb2xvckZhY3Rvcj0yMDk7Yi5PbmVNaW51c1NyY0FscGhhRmFjdG9yPQoyMDU7Yi5PbmVNaW51c1NyY0NvbG9yRmFjdG9yPTIwMztiLk9ydGhvZ3JhcGhpY0NhbWVyYT1iZztiLlBDRlNoYWRvd01hcD0xO2IuUENGU29mdFNoYWRvd01hcD0yO2IuUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5PUZlO2IuUGFyYW1ldHJpY0dlb21ldHJ5PUVmO2IuUGFydGljbGU9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlNwcml0ZS4iKTtyZXR1cm4gbmV3IHlmKGEpfTtiLlBhcnRpY2xlQmFzaWNNYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlQmFzaWNNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLiIpO3JldHVybiBuZXcgQWMoYSl9O2IuUGFydGljbGVTeXN0ZW09ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlU3lzdGVtIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLiIpO3JldHVybiBuZXcgQ2UoYSwKYyl9O2IuUGFydGljbGVTeXN0ZW1NYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IEFjKGEpfTtiLlBhdGg9R2M7Yi5QZXJzcGVjdGl2ZUNhbWVyYT12YjtiLlBsYW5lPUhiO2IuUGxhbmVCdWZmZXJHZW9tZXRyeT1MYztiLlBsYW5lR2VvbWV0cnk9cmQ7Yi5QbGFuZUhlbHBlcj1oZztiLlBvaW50Q2xvdWQ9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuIik7cmV0dXJuIG5ldyBDZShhLGMpfTtiLlBvaW50Q2xvdWRNYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBvaW50Q2xvdWRNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLiIpO3JldHVybiBuZXcgQWMoYSl9O2IuUG9pbnRMaWdodD0KUWc7Yi5Qb2ludExpZ2h0SGVscGVyPVplO2IuUG9pbnRzPUNlO2IuUG9pbnRzTWF0ZXJpYWw9QWM7Yi5Qb2xhckdyaWRIZWxwZXI9ZGg7Yi5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk9amM7Yi5Qb2x5aGVkcm9uR2VvbWV0cnk9RmY7Yi5Qb3NpdGlvbmFsQXVkaW89bmk7Yi5Qb3NpdGlvbmFsQXVkaW9IZWxwZXI9Y2Y7Yi5Qcm9wZXJ0eUJpbmRpbmc9JGI7Yi5Qcm9wZXJ0eU1peGVyPXBpO2IuUXVhZHJhdGljQmV6aWVyQ3VydmU9RWM7Yi5RdWFkcmF0aWNCZXppZXJDdXJ2ZTM9VWM7Yi5RdWF0ZXJuaW9uPWg7Yi5RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaz1aZjtiLlF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudD1JZztiLlJFVklTSU9OPSIxMDgiO2IuUkdCQURlcHRoUGFja2luZz0zMjAxO2IuUkdCQUZvcm1hdD0xMDIzO2IuUkdCQV9BU1RDXzEweDEwX0Zvcm1hdD0zNzgxOTtiLlJHQkFfQVNUQ18xMHg1X0Zvcm1hdD0zNzgxNjtiLlJHQkFfQVNUQ18xMHg2X0Zvcm1hdD0zNzgxNztiLlJHQkFfQVNUQ18xMHg4X0Zvcm1hdD0KMzc4MTg7Yi5SR0JBX0FTVENfMTJ4MTBfRm9ybWF0PTM3ODIwO2IuUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdD0zNzgyMTtiLlJHQkFfQVNUQ180eDRfRm9ybWF0PTM3ODA4O2IuUkdCQV9BU1RDXzV4NF9Gb3JtYXQ9Mzc4MDk7Yi5SR0JBX0FTVENfNXg1X0Zvcm1hdD0zNzgxMDtiLlJHQkFfQVNUQ182eDVfRm9ybWF0PTM3ODExO2IuUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQ9Mzc4MTI7Yi5SR0JBX0FTVENfOHg1X0Zvcm1hdD0zNzgxMztiLlJHQkFfQVNUQ184eDZfRm9ybWF0PTM3ODE0O2IuUkdCQV9BU1RDXzh4OF9Gb3JtYXQ9Mzc4MTU7Yi5SR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQ9MzU4NDM7Yi5SR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQ9MzU4NDI7Yi5SR0JBX1MzVENfRFhUMV9Gb3JtYXQ9MzM3Nzc7Yi5SR0JBX1MzVENfRFhUM19Gb3JtYXQ9MzM3Nzg7Yi5SR0JBX1MzVENfRFhUNV9Gb3JtYXQ9MzM3Nzk7Yi5SR0JERW5jb2Rpbmc9MzAwNjtiLlJHQkVFbmNvZGluZz0zMDAyO2IuUkdCRUZvcm1hdD0KMTAyMztiLlJHQkZvcm1hdD0xMDIyO2IuUkdCTTE2RW5jb2Rpbmc9MzAwNTtiLlJHQk03RW5jb2Rpbmc9MzAwNDtiLlJHQl9FVEMxX0Zvcm1hdD0zNjE5NjtiLlJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0PTM1ODQxO2IuUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQ9MzU4NDA7Yi5SR0JfUzNUQ19EWFQxX0Zvcm1hdD0zMzc3NjtiLlJhd1NoYWRlck1hdGVyaWFsPVJlO2IuUmF5PUQ7Yi5SYXljYXN0ZXI9VWo7Yi5SZWN0QXJlYUxpZ2h0PVVnO2IuUmVjdEFyZWFMaWdodEhlbHBlcj0kZTtiLlJlZEZvcm1hdD0xMDI4O2IuUmVpbmhhcmRUb25lTWFwcGluZz0yO2IuUmVwZWF0V3JhcHBpbmc9MUUzO2IuUmVwbGFjZVN0ZW5jaWxPcD03NjgxO2IuUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb249MTAyO2IuUmluZ0J1ZmZlckdlb21ldHJ5PU5lO2IuUmluZ0dlb21ldHJ5PVRmO2IuU2NlbmU9eTtiLlNjZW5lVXRpbHM9e2NyZWF0ZU11bHRpTWF0ZXJpYWxPYmplY3Q6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9LApkZXRhY2g6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9LGF0dGFjaDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3V0aWxzL1NjZW5lVXRpbHMuanMiKX19O2IuU2hhZGVyQ2h1bms9cmI7Yi5TaGFkZXJMaWI9TWM7Yi5TaGFkZXJNYXRlcmlhbD1xYjtiLlNoYWRvd01hdGVyaWFsPVlkO2IuU2hhcGU9Q2Q7Yi5TaGFwZUJ1ZmZlckdlb21ldHJ5PVdkO2IuU2hhcGVHZW9tZXRyeT1WZDtiLlNoYXBlUGF0aD1maTtiLlNoYXBlVXRpbHM9ZWQ7Yi5TaG9ydFR5cGU9MTAxMTtiLlNrZWxldG9uPUNnO2IuU2tlbGV0b25IZWxwZXI9WWU7Yi5Ta2lubmVkTWVzaD1CZjtiLlNtb290aFNoYWRpbmc9MjtiLlNwaGVyZT1HO2IuU3BoZXJlQnVmZmVyR2VvbWV0cnk9QmQ7Yi5TcGhlcmVHZW9tZXRyeT0KU2Y7Yi5TcGhlcmljYWw9V2o7Yi5TcGhlcmljYWxIYXJtb25pY3MzPWFoO2IuU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc9MzA1O2IuU3BsaW5lPXdpO2IuU3BsaW5lQ3VydmU9RmM7Yi5TcGxpbmVDdXJ2ZTM9YWs7Yi5TcG90TGlnaHQ9UGc7Yi5TcG90TGlnaHRIZWxwZXI9WGU7Yi5TcG90TGlnaHRTaGFkb3c9T2c7Yi5TcHJpdGU9eWY7Yi5TcHJpdGVNYXRlcmlhbD1BZDtiLlNyY0FscGhhRmFjdG9yPTIwNDtiLlNyY0FscGhhU2F0dXJhdGVGYWN0b3I9MjEwO2IuU3JjQ29sb3JGYWN0b3I9MjAyO2IuU3RlcmVvQ2FtZXJhPVFqO2IuU3RyaW5nS2V5ZnJhbWVUcmFjaz1KZztiLlN1YnRyYWN0RXF1YXRpb249MTAxO2IuU3VidHJhY3RpdmVCbGVuZGluZz0zO2IuVE9VQ0g9e1JPVEFURTowLFBBTjoxLERPTExZX1BBTjoyLERPTExZX1JPVEFURTozfTtiLlRhbmdlbnRTcGFjZU5vcm1hbE1hcD0wO2IuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeT1HZTtiLlRldHJhaGVkcm9uR2VvbWV0cnk9CkdmO2IuVGV4dEJ1ZmZlckdlb21ldHJ5PU1lO2IuVGV4dEdlb21ldHJ5PVJmO2IuVGV4dHVyZT1sO2IuVGV4dHVyZUxvYWRlcj1NZztiLlRvcnVzQnVmZmVyR2VvbWV0cnk9S2U7Yi5Ub3J1c0dlb21ldHJ5PU1mO2IuVG9ydXNLbm90QnVmZmVyR2VvbWV0cnk9SmU7Yi5Ub3J1c0tub3RHZW9tZXRyeT1MZjtiLlRyaWFuZ2xlPUI7Yi5UcmlhbmdsZUZhbkRyYXdNb2RlPTI7Yi5UcmlhbmdsZVN0cmlwRHJhd01vZGU9MTtiLlRyaWFuZ2xlc0RyYXdNb2RlPTA7Yi5UdWJlQnVmZmVyR2VvbWV0cnk9U2Q7Yi5UdWJlR2VvbWV0cnk9S2Y7Yi5VVk1hcHBpbmc9MzAwO2IuVWludDE2QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgWihhLGMpfTtiLlVpbnQxNkJ1ZmZlckF0dHJpYnV0ZT1aO2IuVWludDMyQXR0cmlidXRlPQpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuVWludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGVhKGEsYyl9O2IuVWludDMyQnVmZmVyQXR0cmlidXRlPWVhO2IuVWludDhBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgWChhLGMpfTtiLlVpbnQ4QnVmZmVyQXR0cmlidXRlPVg7Yi5VaW50OENsYW1wZWRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBhYShhLApjKX07Yi5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU9YWE7Yi5VbmNoYXJ0ZWQyVG9uZU1hcHBpbmc9MztiLlVuaWZvcm09Ymg7Yi5Vbmlmb3Jtc0xpYj1XYTtiLlVuaWZvcm1zVXRpbHM9Rm07Yi5VbnNpZ25lZEJ5dGVUeXBlPTEwMDk7Yi5VbnNpZ25lZEludDI0OFR5cGU9MTAyMDtiLlVuc2lnbmVkSW50VHlwZT0xMDE0O2IuVW5zaWduZWRTaG9ydDQ0NDRUeXBlPTEwMTc7Yi5VbnNpZ25lZFNob3J0NTU1MVR5cGU9MTAxODtiLlVuc2lnbmVkU2hvcnQ1NjVUeXBlPTEwMTk7Yi5VbnNpZ25lZFNob3J0VHlwZT0xMDEyO2IuVlNNU2hhZG93TWFwPTM7Yi5WZWN0b3IyPWY7Yi5WZWN0b3IzPWs7Yi5WZWN0b3I0PXA7Yi5WZWN0b3JLZXlmcmFtZVRyYWNrPVRlO2IuVmVydGV4PWZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlcnRleCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuVmVjdG9yMyBpbnN0ZWFkLiIpO3JldHVybiBuZXcgayhhLGMsZSl9O2IuVmVydGV4Q29sb3JzPQoyO2IuVmVydGV4Tm9ybWFsc0hlbHBlcj1kZztiLlZpZGVvVGV4dHVyZT1YaDtiLldlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ9bjtiLldlYkdMUmVuZGVyVGFyZ2V0PW07Yi5XZWJHTFJlbmRlclRhcmdldEN1YmU9TmI7Yi5XZWJHTFJlbmRlcmVyPU9oO2IuV2ViR0xVdGlscz13ajtiLldpcmVmcmFtZUdlb21ldHJ5PUVlO2IuV2lyZWZyYW1lSGVscGVyPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5XaXJlZnJhbWVIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBJYihuZXcgRWUoYS5nZW9tZXRyeSksbmV3IEZiKHtjb2xvcjp2b2lkIDAhPT1jP2M6MTY3NzcyMTV9KSl9O2IuV3JhcEFyb3VuZEVuZGluZz0yNDAyO2IuWEhSTG9hZGVyPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuWEhSTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRmlsZUxvYWRlci4iKTsKcmV0dXJuIG5ldyB1YyhhKX07Yi5aZXJvQ3VydmF0dXJlRW5kaW5nPTI0MDA7Yi5aZXJvRmFjdG9yPTIwMDtiLlplcm9TbG9wZUVuZGluZz0yNDAxO2IuWmVyb1N0ZW5jaWxPcD0wO2Iuc1JHQkVuY29kaW5nPTMwMDE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9PcmJpdENvbnRyb2xzLmpzClRIUkVFLk9yYml0Q29udHJvbHM9ZnVuY3Rpb24oYixkKXtmdW5jdGlvbiBmKCl7cmV0dXJuIDIqTWF0aC5QSS82MC82MCpZLmF1dG9Sb3RhdGVTcGVlZH1mdW5jdGlvbiBoKCl7cmV0dXJuIE1hdGgucG93KC45NSxZLnpvb21TcGVlZCl9ZnVuY3Rpb24gayhzYSl7WGEudGhldGEtPXNhfWZ1bmN0aW9uIHQoc2Epe1hhLnBoaS09c2F9ZnVuY3Rpb24gbChzYSl7WS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT91Yi89c2E6WS5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/KFkub2JqZWN0Lnpvb209TWF0aC5tYXgoWS5taW5ab29tLE1hdGgubWluKFkubWF4Wm9vbSxZLm9iamVjdC56b29tKnNhKSksWS5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLHFiPSEwKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpLFkuZW5hYmxlWm9vbT0hMSl9ZnVuY3Rpb24gcChzYSl7WS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT8KdWIqPXNhOlkub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPyhZLm9iamVjdC56b29tPU1hdGgubWF4KFkubWluWm9vbSxNYXRoLm1pbihZLm1heFpvb20sWS5vYmplY3Quem9vbS9zYSkpLFkub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSxxYj0hMCk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4iKSxZLmVuYWJsZVpvb209ITEpfWZ1bmN0aW9uIG0oc2Epe3piLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIG4oc2Epe2ljLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIHEoc2Epe05iLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIHUoc2Epe3ZiLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpO0diLnN1YlZlY3RvcnModmIsemIpLm11bHRpcGx5U2NhbGFyKFkucm90YXRlU3BlZWQpO3NhPQpZLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9ZLmRvbUVsZW1lbnQuYm9keTpZLmRvbUVsZW1lbnQ7aygyKk1hdGguUEkqR2IueC9zYS5jbGllbnRIZWlnaHQpO3QoMipNYXRoLlBJKkdiLnkvc2EuY2xpZW50SGVpZ2h0KTt6Yi5jb3B5KHZiKTtZLnVwZGF0ZSgpfWZ1bmN0aW9uIHgoc2Epe2JjLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpO09kLnN1YlZlY3RvcnMoYmMsaWMpOzA8T2QueT9sKGgoKSk6MD5PZC55JiZwKGgoKSk7aWMuY29weShiYyk7WS51cGRhdGUoKX1mdW5jdGlvbiBBKHNhKXtBYi5zZXQoc2EuY2xpZW50WCxzYS5jbGllbnRZKTtIYi5zdWJWZWN0b3JzKEFiLE5iKS5tdWx0aXBseVNjYWxhcihZLnBhblNwZWVkKTtzZChIYi54LEhiLnkpO05iLmNvcHkoQWIpO1kudXBkYXRlKCl9ZnVuY3Rpb24geSgpe31mdW5jdGlvbiB3KHNhKXswPnNhLmRlbHRhWT9wKGgoKSk6MDxzYS5kZWx0YVkmJmwoaCgpKTtZLnVwZGF0ZSgpfWZ1bmN0aW9uIEMoc2Epe3ZhciBNYj0hMTtzd2l0Y2goc2Eua2V5Q29kZSl7Y2FzZSBZLmtleXMuVVA6c2QoMCwKWS5rZXlQYW5TcGVlZCk7TWI9ITA7YnJlYWs7Y2FzZSBZLmtleXMuQk9UVE9NOnNkKDAsLVkua2V5UGFuU3BlZWQpO01iPSEwO2JyZWFrO2Nhc2UgWS5rZXlzLkxFRlQ6c2QoWS5rZXlQYW5TcGVlZCwwKTtNYj0hMDticmVhaztjYXNlIFkua2V5cy5SSUdIVDpzZCgtWS5rZXlQYW5TcGVlZCwwKSxNYj0hMH1NYiYmKHNhLnByZXZlbnREZWZhdWx0KCksWS51cGRhdGUoKSl9ZnVuY3Rpb24gRyhzYSl7MT09c2EudG91Y2hlcy5sZW5ndGg/emIuc2V0KHNhLnRvdWNoZXNbMF0ucGFnZVgsc2EudG91Y2hlc1swXS5wYWdlWSk6emIuc2V0KC41KihzYS50b3VjaGVzWzBdLnBhZ2VYK3NhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBEKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD9OYi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTpOYi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrCnNhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBCKHNhKXt2YXIgTWI9c2EudG91Y2hlc1swXS5wYWdlWC1zYS50b3VjaGVzWzFdLnBhZ2VYO3NhPXNhLnRvdWNoZXNbMF0ucGFnZVktc2EudG91Y2hlc1sxXS5wYWdlWTtpYy5zZXQoMCxNYXRoLnNxcnQoTWIqTWIrc2Eqc2EpKX1mdW5jdGlvbiBJKHNhKXtZLmVuYWJsZVpvb20mJkIoc2EpO1kuZW5hYmxlUGFuJiZEKHNhKX1mdW5jdGlvbiBOKHNhKXtZLmVuYWJsZVpvb20mJkIoc2EpO1kuZW5hYmxlUm90YXRlJiZHKHNhKX1mdW5jdGlvbiBPKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD92Yi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTp2Yi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrc2EudG91Y2hlc1sxXS5wYWdlWCksLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVkrc2EudG91Y2hlc1sxXS5wYWdlWSkpO0diLnN1YlZlY3RvcnModmIsCnpiKS5tdWx0aXBseVNjYWxhcihZLnJvdGF0ZVNwZWVkKTtzYT1ZLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9ZLmRvbUVsZW1lbnQuYm9keTpZLmRvbUVsZW1lbnQ7aygyKk1hdGguUEkqR2IueC9zYS5jbGllbnRIZWlnaHQpO3QoMipNYXRoLlBJKkdiLnkvc2EuY2xpZW50SGVpZ2h0KTt6Yi5jb3B5KHZiKX1mdW5jdGlvbiBIKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD9BYi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTpBYi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrc2EudG91Y2hlc1sxXS5wYWdlWCksLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVkrc2EudG91Y2hlc1sxXS5wYWdlWSkpO0hiLnN1YlZlY3RvcnMoQWIsTmIpLm11bHRpcGx5U2NhbGFyKFkucGFuU3BlZWQpO3NkKEhiLngsSGIueSk7TmIuY29weShBYil9ZnVuY3Rpb24gSyhzYSl7dmFyIE1iPXNhLnRvdWNoZXNbMF0ucGFnZVgtc2EudG91Y2hlc1sxXS5wYWdlWDtzYT1zYS50b3VjaGVzWzBdLnBhZ2VZLQpzYS50b3VjaGVzWzFdLnBhZ2VZO2JjLnNldCgwLE1hdGguc3FydChNYipNYitzYSpzYSkpO09kLnNldCgwLE1hdGgucG93KGJjLnkvaWMueSxZLnpvb21TcGVlZCkpO2woT2QueSk7aWMuY29weShiYyl9ZnVuY3Rpb24gTShzYSl7WS5lbmFibGVab29tJiZLKHNhKTtZLmVuYWJsZVBhbiYmSChzYSl9ZnVuY3Rpb24gTChzYSl7WS5lbmFibGVab29tJiZLKHNhKTtZLmVuYWJsZVJvdGF0ZSYmTyhzYSl9ZnVuY3Rpb24gUSgpe31mdW5jdGlvbiBUKHNhKXtpZighMSE9PVkuZW5hYmxlZCl7c2EucHJldmVudERlZmF1bHQoKTtZLmRvbUVsZW1lbnQuZm9jdXM/WS5kb21FbGVtZW50LmZvY3VzKCk6d2luZG93LmZvY3VzKCk7c3dpdGNoKHNhLmJ1dHRvbil7Y2FzZSAwOnN3aXRjaChZLm1vdXNlQnV0dG9ucy5MRUZUKXtjYXNlIFRIUkVFLk1PVVNFLlJPVEFURTppZihzYS5jdHJsS2V5fHxzYS5tZXRhS2V5fHxzYS5zaGlmdEtleSl7aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9CkFhLlBBTn1lbHNle2lmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURX1icmVhaztjYXNlIFRIUkVFLk1PVVNFLlBBTjppZihzYS5jdHJsS2V5fHxzYS5tZXRhS2V5fHxzYS5zaGlmdEtleSl7aWYoITE9PT1ZLmVuYWJsZVJvdGF0ZSlyZXR1cm47bShzYSk7RmE9QWEuUk9UQVRFfWVsc2V7aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9QWEuUEFOfWJyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDE6c3dpdGNoKFkubW91c2VCdXR0b25zLk1JRERMRSl7Y2FzZSBUSFJFRS5NT1VTRS5ET0xMWTppZighMT09PVkuZW5hYmxlWm9vbSlyZXR1cm47bihzYSk7RmE9QWEuRE9MTFk7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfWJyZWFrO2Nhc2UgMjpzd2l0Y2goWS5tb3VzZUJ1dHRvbnMuUklHSFQpe2Nhc2UgVEhSRUUuTU9VU0UuUk9UQVRFOmlmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURTsKYnJlYWs7Y2FzZSBUSFJFRS5NT1VTRS5QQU46aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9QWEuUEFOO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX19RmEhPT1BYS5OT05FJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixYLCExKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIixhYSwhMSksWS5kaXNwYXRjaEV2ZW50KHZhKSl9fWZ1bmN0aW9uIFgoc2Epe2lmKCExIT09WS5lbmFibGVkKXN3aXRjaChzYS5wcmV2ZW50RGVmYXVsdCgpLEZhKXtjYXNlIEFhLlJPVEFURTppZighMT09PVkuZW5hYmxlUm90YXRlKWJyZWFrO3Uoc2EpO2JyZWFrO2Nhc2UgQWEuRE9MTFk6aWYoITE9PT1ZLmVuYWJsZVpvb20pYnJlYWs7eChzYSk7YnJlYWs7Y2FzZSBBYS5QQU46ITEhPT1ZLmVuYWJsZVBhbiYmQShzYSl9fWZ1bmN0aW9uIGFhKHNhKXshMSE9PVkuZW5hYmxlZCYmKHkoc2EpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsClgsITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGFhLCExKSxZLmRpc3BhdGNoRXZlbnQoeGEpLEZhPUFhLk5PTkUpfWZ1bmN0aW9uIGxhKHNhKXshMT09PVkuZW5hYmxlZHx8ITE9PT1ZLmVuYWJsZVpvb218fEZhIT09QWEuTk9ORSYmRmEhPT1BYS5ST1RBVEV8fChzYS5wcmV2ZW50RGVmYXVsdCgpLHNhLnN0b3BQcm9wYWdhdGlvbigpLFkuZGlzcGF0Y2hFdmVudCh2YSksdyhzYSksWS5kaXNwYXRjaEV2ZW50KHhhKSl9ZnVuY3Rpb24gWihzYSl7ITEhPT1ZLmVuYWJsZWQmJiExIT09WS5lbmFibGVLZXlzJiYhMSE9PVkuZW5hYmxlUGFuJiZDKHNhKX1mdW5jdGlvbiBiYShzYSl7aWYoITEhPT1ZLmVuYWJsZWQpe3NhLnByZXZlbnREZWZhdWx0KCk7c3dpdGNoKHNhLnRvdWNoZXMubGVuZ3RoKXtjYXNlIDE6c3dpdGNoKFkudG91Y2hlcy5PTkUpe2Nhc2UgVEhSRUUuVE9VQ0guUk9UQVRFOmlmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO0coc2EpO0ZhPQpBYS5UT1VDSF9ST1RBVEU7YnJlYWs7Y2FzZSBUSFJFRS5UT1VDSC5QQU46aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47RChzYSk7RmE9QWEuVE9VQ0hfUEFOO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDI6c3dpdGNoKFkudG91Y2hlcy5UV08pe2Nhc2UgVEhSRUUuVE9VQ0guRE9MTFlfUEFOOmlmKCExPT09WS5lbmFibGVab29tJiYhMT09PVkuZW5hYmxlUGFuKXJldHVybjtJKHNhKTtGYT1BYS5UT1VDSF9ET0xMWV9QQU47YnJlYWs7Y2FzZSBUSFJFRS5UT1VDSC5ET0xMWV9ST1RBVEU6aWYoITE9PT1ZLmVuYWJsZVpvb20mJiExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO04oc2EpO0ZhPUFhLlRPVUNIX0RPTExZX1JPVEFURTticmVhaztkZWZhdWx0OkZhPUFhLk5PTkV9YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfUZhIT09QWEuTk9ORSYmWS5kaXNwYXRjaEV2ZW50KHZhKX19ZnVuY3Rpb24gZWEoc2Epe2lmKCExIT09WS5lbmFibGVkKXN3aXRjaChzYS5wcmV2ZW50RGVmYXVsdCgpLApzYS5zdG9wUHJvcGFnYXRpb24oKSxGYSl7Y2FzZSBBYS5UT1VDSF9ST1RBVEU6aWYoITE9PT1ZLmVuYWJsZVJvdGF0ZSlicmVhaztPKHNhKTtZLnVwZGF0ZSgpO2JyZWFrO2Nhc2UgQWEuVE9VQ0hfUEFOOmlmKCExPT09WS5lbmFibGVQYW4pYnJlYWs7SChzYSk7WS51cGRhdGUoKTticmVhaztjYXNlIEFhLlRPVUNIX0RPTExZX1BBTjppZighMT09PVkuZW5hYmxlWm9vbSYmITE9PT1ZLmVuYWJsZVBhbilicmVhaztNKHNhKTtZLnVwZGF0ZSgpO2JyZWFrO2Nhc2UgQWEuVE9VQ0hfRE9MTFlfUk9UQVRFOmlmKCExPT09WS5lbmFibGVab29tJiYhMT09PVkuZW5hYmxlUm90YXRlKWJyZWFrO0woc2EpO1kudXBkYXRlKCk7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfX1mdW5jdGlvbiBjYShzYSl7ITEhPT1ZLmVuYWJsZWQmJihRKHNhKSxZLmRpc3BhdGNoRXZlbnQoeGEpLEZhPUFhLk5PTkUpfWZ1bmN0aW9uIGthKHNhKXshMSE9PVkuZW5hYmxlZCYmc2EucHJldmVudERlZmF1bHQoKX10aGlzLm9iamVjdD0KYjt0aGlzLmRvbUVsZW1lbnQ9dm9pZCAwIT09ZD9kOmRvY3VtZW50O3RoaXMuZW5hYmxlZD0hMDt0aGlzLnRhcmdldD1uZXcgVEhSRUUuVmVjdG9yMzt0aGlzLm1pbkRpc3RhbmNlPTA7dGhpcy5tYXhEaXN0YW5jZT1JbmZpbml0eTt0aGlzLm1pblpvb209MDt0aGlzLm1heFpvb209SW5maW5pdHk7dGhpcy5taW5Qb2xhckFuZ2xlPTA7dGhpcy5tYXhQb2xhckFuZ2xlPU1hdGguUEk7dGhpcy5taW5BemltdXRoQW5nbGU9LUluZmluaXR5O3RoaXMubWF4QXppbXV0aEFuZ2xlPUluZmluaXR5O3RoaXMuZW5hYmxlRGFtcGluZz0hMTt0aGlzLmRhbXBpbmdGYWN0b3I9LjA1O3RoaXMuZW5hYmxlWm9vbT0hMDt0aGlzLnpvb21TcGVlZD0xO3RoaXMuZW5hYmxlUm90YXRlPSEwO3RoaXMucm90YXRlU3BlZWQ9MTt0aGlzLmVuYWJsZVBhbj0hMDt0aGlzLnBhblNwZWVkPTE7dGhpcy5zY3JlZW5TcGFjZVBhbm5pbmc9ITE7dGhpcy5rZXlQYW5TcGVlZD03O3RoaXMuYXV0b1JvdGF0ZT0hMTt0aGlzLmF1dG9Sb3RhdGVTcGVlZD0KMjt0aGlzLmVuYWJsZUtleXM9ITA7dGhpcy5rZXlzPXtMRUZUOjM3LFVQOjM4LFJJR0hUOjM5LEJPVFRPTTo0MH07dGhpcy5tb3VzZUJ1dHRvbnM9e0xFRlQ6VEhSRUUuTU9VU0UuUk9UQVRFLE1JRERMRTpUSFJFRS5NT1VTRS5ET0xMWSxSSUdIVDpUSFJFRS5NT1VTRS5QQU59O3RoaXMudG91Y2hlcz17T05FOlRIUkVFLlRPVUNILlJPVEFURSxUV086VEhSRUUuVE9VQ0guRE9MTFlfUEFOfTt0aGlzLnRhcmdldDA9dGhpcy50YXJnZXQuY2xvbmUoKTt0aGlzLnBvc2l0aW9uMD10aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpO3RoaXMuem9vbTA9dGhpcy5vYmplY3Quem9vbTt0aGlzLmdldFBvbGFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gU2EucGhpfTt0aGlzLmdldEF6aW11dGhhbEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIFNhLnRoZXRhfTt0aGlzLnNhdmVTdGF0ZT1mdW5jdGlvbigpe1kudGFyZ2V0MC5jb3B5KFkudGFyZ2V0KTtZLnBvc2l0aW9uMC5jb3B5KFkub2JqZWN0LnBvc2l0aW9uKTsKWS56b29tMD1ZLm9iamVjdC56b29tfTt0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7WS50YXJnZXQuY29weShZLnRhcmdldDApO1kub2JqZWN0LnBvc2l0aW9uLmNvcHkoWS5wb3NpdGlvbjApO1kub2JqZWN0Lnpvb209WS56b29tMDtZLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7WS5kaXNwYXRjaEV2ZW50KEVhKTtZLnVwZGF0ZSgpO0ZhPUFhLk5PTkV9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIHNhPW5ldyBUSFJFRS5WZWN0b3IzLE1iPShuZXcgVEhSRUUuUXVhdGVybmlvbikuc2V0RnJvbVVuaXRWZWN0b3JzKGIudXAsbmV3IFRIUkVFLlZlY3RvcjMoMCwxLDApKSx3Yz1NYi5jbG9uZSgpLmludmVyc2UoKSxiZD1uZXcgVEhSRUUuVmVjdG9yMyx0ZD1uZXcgVEhSRUUuUXVhdGVybmlvbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdGc9WS5vYmplY3QucG9zaXRpb247c2EuY29weSh0Zykuc3ViKFkudGFyZ2V0KTtzYS5hcHBseVF1YXRlcm5pb24oTWIpO1NhLnNldEZyb21WZWN0b3IzKHNhKTsKWS5hdXRvUm90YXRlJiZGYT09PUFhLk5PTkUmJmsoZigpKTtZLmVuYWJsZURhbXBpbmc/KFNhLnRoZXRhKz1YYS50aGV0YSpZLmRhbXBpbmdGYWN0b3IsU2EucGhpKz1YYS5waGkqWS5kYW1waW5nRmFjdG9yKTooU2EudGhldGErPVhhLnRoZXRhLFNhLnBoaSs9WGEucGhpKTtTYS50aGV0YT1NYXRoLm1heChZLm1pbkF6aW11dGhBbmdsZSxNYXRoLm1pbihZLm1heEF6aW11dGhBbmdsZSxTYS50aGV0YSkpO1NhLnBoaT1NYXRoLm1heChZLm1pblBvbGFyQW5nbGUsTWF0aC5taW4oWS5tYXhQb2xhckFuZ2xlLFNhLnBoaSkpO1NhLm1ha2VTYWZlKCk7U2EucmFkaXVzKj11YjtTYS5yYWRpdXM9TWF0aC5tYXgoWS5taW5EaXN0YW5jZSxNYXRoLm1pbihZLm1heERpc3RhbmNlLFNhLnJhZGl1cykpOyEwPT09WS5lbmFibGVEYW1waW5nP1kudGFyZ2V0LmFkZFNjYWxlZFZlY3RvcihCYixZLmRhbXBpbmdGYWN0b3IpOlkudGFyZ2V0LmFkZChCYik7c2Euc2V0RnJvbVNwaGVyaWNhbChTYSk7c2EuYXBwbHlRdWF0ZXJuaW9uKHdjKTsKdGcuY29weShZLnRhcmdldCkuYWRkKHNhKTtZLm9iamVjdC5sb29rQXQoWS50YXJnZXQpOyEwPT09WS5lbmFibGVEYW1waW5nPyhYYS50aGV0YSo9MS1ZLmRhbXBpbmdGYWN0b3IsWGEucGhpKj0xLVkuZGFtcGluZ0ZhY3RvcixCYi5tdWx0aXBseVNjYWxhcigxLVkuZGFtcGluZ0ZhY3RvcikpOihYYS5zZXQoMCwwLDApLEJiLnNldCgwLDAsMCkpO3ViPTE7cmV0dXJuIHFifHxiZC5kaXN0YW5jZVRvU3F1YXJlZChZLm9iamVjdC5wb3NpdGlvbik+eWF8fDgqKDEtdGQuZG90KFkub2JqZWN0LnF1YXRlcm5pb24pKT55YT8oWS5kaXNwYXRjaEV2ZW50KEVhKSxiZC5jb3B5KFkub2JqZWN0LnBvc2l0aW9uKSx0ZC5jb3B5KFkub2JqZWN0LnF1YXRlcm5pb24pLHFiPSExLCEwKTohMX19KCk7dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixrYSwhMSk7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsClQsITEpO1kuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsbGEsITEpO1kuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixiYSwhMSk7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixjYSwhMSk7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsZWEsITEpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsWCwhMSk7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsYWEsITEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixaLCExKX07dmFyIFk9dGhpcyxFYT17dHlwZToiY2hhbmdlIn0sdmE9e3R5cGU6InN0YXJ0In0seGE9e3R5cGU6ImVuZCJ9LEFhPXtOT05FOi0xLFJPVEFURTowLERPTExZOjEsUEFOOjIsVE9VQ0hfUk9UQVRFOjMsVE9VQ0hfUEFOOjQsVE9VQ0hfRE9MTFlfUEFOOjUsVE9VQ0hfRE9MTFlfUk9UQVRFOjZ9LApGYT1BYS5OT05FLHlhPTFFLTYsU2E9bmV3IFRIUkVFLlNwaGVyaWNhbCxYYT1uZXcgVEhSRUUuU3BoZXJpY2FsLHViPTEsQmI9bmV3IFRIUkVFLlZlY3RvcjMscWI9ITEsemI9bmV3IFRIUkVFLlZlY3RvcjIsdmI9bmV3IFRIUkVFLlZlY3RvcjIsR2I9bmV3IFRIUkVFLlZlY3RvcjIsTmI9bmV3IFRIUkVFLlZlY3RvcjIsQWI9bmV3IFRIUkVFLlZlY3RvcjIsSGI9bmV3IFRIUkVFLlZlY3RvcjIsaWM9bmV3IFRIUkVFLlZlY3RvcjIsYmM9bmV3IFRIUkVFLlZlY3RvcjIsT2Q9bmV3IFRIUkVFLlZlY3RvcjIscmQ9ZnVuY3Rpb24oKXt2YXIgc2E9bmV3IFRIUkVFLlZlY3RvcjM7cmV0dXJuIGZ1bmN0aW9uKE1iLHdjKXtzYS5zZXRGcm9tTWF0cml4Q29sdW1uKHdjLDApO3NhLm11bHRpcGx5U2NhbGFyKC1NYik7QmIuYWRkKHNhKX19KCksTGM9ZnVuY3Rpb24oKXt2YXIgc2E9bmV3IFRIUkVFLlZlY3RvcjM7cmV0dXJuIGZ1bmN0aW9uKE1iLHdjKXshMD09PVkuc2NyZWVuU3BhY2VQYW5uaW5nPwpzYS5zZXRGcm9tTWF0cml4Q29sdW1uKHdjLDEpOihzYS5zZXRGcm9tTWF0cml4Q29sdW1uKHdjLDApLHNhLmNyb3NzVmVjdG9ycyhZLm9iamVjdC51cCxzYSkpO3NhLm11bHRpcGx5U2NhbGFyKE1iKTtCYi5hZGQoc2EpfX0oKSxzZD1mdW5jdGlvbigpe3ZhciBzYT1uZXcgVEhSRUUuVmVjdG9yMztyZXR1cm4gZnVuY3Rpb24oTWIsd2Mpe3ZhciBiZD1ZLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9ZLmRvbUVsZW1lbnQuYm9keTpZLmRvbUVsZW1lbnQ7aWYoWS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYSl7c2EuY29weShZLm9iamVjdC5wb3NpdGlvbikuc3ViKFkudGFyZ2V0KTt2YXIgdGQ9c2EubGVuZ3RoKCk7dGQqPU1hdGgudGFuKFkub2JqZWN0LmZvdi8yKk1hdGguUEkvMTgwKTtyZCgyKk1iKnRkL2JkLmNsaWVudEhlaWdodCxZLm9iamVjdC5tYXRyaXgpO0xjKDIqd2MqdGQvYmQuY2xpZW50SGVpZ2h0LFkub2JqZWN0Lm1hdHJpeCl9ZWxzZSBZLm9iamVjdC5pc09ydGhvZ3JhcGhpY0NhbWVyYT8KKHJkKE1iKihZLm9iamVjdC5yaWdodC1ZLm9iamVjdC5sZWZ0KS9ZLm9iamVjdC56b29tL2JkLmNsaWVudFdpZHRoLFkub2JqZWN0Lm1hdHJpeCksTGMod2MqKFkub2JqZWN0LnRvcC1ZLm9iamVjdC5ib3R0b20pL1kub2JqZWN0Lnpvb20vYmQuY2xpZW50SGVpZ2h0LFkub2JqZWN0Lm1hdHJpeCkpOihjb25zb2xlLndhcm4oIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIHBhbiBkaXNhYmxlZC4iKSxZLmVuYWJsZVBhbj0hMSl9fSgpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsa2EsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLFQsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsbGEsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixiYSwhMSk7WS5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwKY2EsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGVhLCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsWiwhMSk7dGhpcy51cGRhdGUoKX07VEhSRUUuT3JiaXRDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5PcmJpdENvbnRyb2xzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1USFJFRS5PcmJpdENvbnRyb2xzO1RIUkVFLk1hcENvbnRyb2xzPWZ1bmN0aW9uKGIsZCl7VEhSRUUuT3JiaXRDb250cm9scy5jYWxsKHRoaXMsYixkKTt0aGlzLm1vdXNlQnV0dG9ucy5MRUZUPVRIUkVFLk1PVVNFLlBBTjt0aGlzLm1vdXNlQnV0dG9ucy5SSUdIVD1USFJFRS5NT1VTRS5ST1RBVEU7dGhpcy50b3VjaGVzLk9ORT1USFJFRS5UT1VDSC5QQU47dGhpcy50b3VjaGVzLlRXTz1USFJFRS5UT1VDSC5ET0xMWV9ST1RBVEV9OwpUSFJFRS5NYXBDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5NYXBDb250cm9scy5wcm90b3R5cGUuY29uc3RydWN0b3I9VEhSRUUuTWFwQ29udHJvbHM7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9hcnJheS1idWZmZXItZGF0YS1wcm92aWRlci5qcwp2YXIgTGs7CihmdW5jdGlvbihiKXtiLkVycm9yQ29kZXM9e0NBTkNFTExFRDoxfTtjb25zdCBkPXtWRVJURVg6MSxGQUNFOjIsQ09MT1I6M30sZj17VkVSVEVYOiJmbG9hdDMyIixGQUNFOiJpbnQzMiIsQ09MT1I6InVpbnQ4In07Y2xhc3MgaHtjb25zdHJ1Y3RvcihrKXt0aGlzLl9yZXF1ZXN0TWFuYWdlcj1rO3RoaXMuX2NhbmNlbGxlcj1uZXcgdmMuQ2FuY2VsbGVyfXJlbG9hZChrLHQsbCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO3JldHVybiB0aGlzLl9mZXRjaE1ldGFkYXRhKGssdCxsKX1fZmV0Y2hEYXRhQnlTdGVwKGssdCxsLHAsbSxuKXtmdW5jdGlvbiBxKHUpe2xldCB4PVtdO2ZvcihsZXQgQT0wO0E8dS5sZW5ndGgvMztBKyspe2xldCB5PVtdO2ZvcihsZXQgdz0wOzM+dzt3KyspeS5wdXNoKHVbMypBK3ddKTt4LnB1c2goeSl9cmV0dXJuIHh9az12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgibWVzaCIsIi9kYXRhIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6dCxydW46aywKY29udGVudF90eXBlOmwsc2FtcGxlOnAsc3RlcDptfSkpO3Q9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKHU9PntpZih1LmNhbmNlbGxlZClyZXR1cm4gUHJvbWlzZS5yZWplY3Qoe2NvZGU6Yi5FcnJvckNvZGVzLkNBTkNFTExFRCxtZXNzYWdlOiJSZXNwb25zZSB3YXMgaW52YWxpZGF0ZWQuIn0pO3U9dS52YWx1ZTtzd2l0Y2gobCl7Y2FzZSAiVkVSVEVYIjpuLnZlcnRpY2VzPXEobmV3IEZsb2F0MzJBcnJheSh1KSk7YnJlYWs7Y2FzZSAiRkFDRSI6bi5mYWNlcz1xKG5ldyBJbnQzMkFycmF5KHUpKTticmVhaztjYXNlICJDT0xPUiI6bi5jb2xvcnM9cShuZXcgVWludDhBcnJheSh1KSl9cmV0dXJuIG59KTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIuZmV0Y2goayxudWxsLCJhcnJheWJ1ZmZlciIsZltsXSkudGhlbih1PT51LmFycmF5QnVmZmVyKCkpLnRoZW4odCl9ZmV0Y2hEYXRhKGssdCxsLHApe2xldCBtPVtdLG49bmV3IE1hcDtPYmplY3Qua2V5cyhkKS5mb3JFYWNoKHE9Pgp7ay5jb21wb25lbnRzJjE8PGRbcV0mJm0ucHVzaCh0aGlzLl9mZXRjaERhdGFCeVN0ZXAodCxsLHEscCxrLnN0ZXAsbikpfSk7cmV0dXJuIFByb21pc2UuYWxsKG0pfV9mZXRjaE1ldGFkYXRhKGssdCxsKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7az12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgibWVzaCIsIi9tZXNoZXMiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzp0LHJ1bjprLHNhbXBsZTpsfSkpO3Q9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKHA9PnAuY2FuY2VsbGVkP1Byb21pc2UucmVqZWN0KHtjb2RlOmIuRXJyb3JDb2Rlcy5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTpwLnZhbHVlKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIuZmV0Y2goaykudGhlbihwPT5wLmpzb24oKSkudGhlbih0KS50aGVuKHRoaXMuX3Byb2Nlc3NNZXRhZGF0YS5iaW5kKHRoaXMpKX1fcHJvY2Vzc01ldGFkYXRhKGspe2lmKGspe3ZhciB0PQpuZXcgTWFwO2ZvcihsZXQgcD0wO3A8ay5sZW5ndGg7cCsrKXtsZXQgbT1rW3BdO3QuaGFzKG0uc3RlcCl8fHQuc2V0KG0uc3RlcCxbXSk7dC5nZXQobS5zdGVwKS5wdXNoKG0pfXZhciBsPVtdO3QuZm9yRWFjaChwPT57cD10aGlzLl9jcmVhdGVTdGVwRGF0dW0ocFswXSk7bC5wdXNoKHApfSk7cmV0dXJuIGx9fV9jcmVhdGVTdGVwRGF0dW0oayl7cmV0dXJue3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqay53YWxsX3RpbWUpLHN0ZXA6ay5zdGVwLGNvbmZpZzprLmNvbmZpZyxjb250ZW50X3R5cGU6ay5jb250ZW50X3R5cGUsY29tcG9uZW50czprLmNvbXBvbmVudHN9fX1iLkFycmF5QnVmZmVyRGF0YVByb3ZpZGVyPWh9KShMa3x8KExrPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9tZXNoLXZpZXdlci5qcwooZnVuY3Rpb24oYil7Y2xhc3MgZCBleHRlbmRzIFRIUkVFLkV2ZW50RGlzcGF0Y2hlcntjb25zdHJ1Y3RvcihmKXtzdXBlcigpO3RoaXMuX2xhc3RNZXNoPW51bGw7dGhpcy5fY2xvY2s9bmV3IFRIUkVFLkNsb2NrO3RoaXMuX2NhbnZhc1NpemU9bnVsbDt0aGlzLl9ydW5Db2xvcj1mfV9pc09iamVjdChmKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGYmJm51bGwhPWYmJiFBcnJheS5pc0FycmF5KGYpfV9hcHBseURlZmF1bHRzKGYsaCl7bGV0IGs9e307Zj1bZixoXTtmb3IoaD0wO2g8Zi5sZW5ndGg7aCsrKXtjb25zdCB0PWZbaF07Zm9yKGxldCBsIGluIHQpe2NvbnN0IHA9bCBpbiBrO3RoaXMuX2lzT2JqZWN0KHRbbF0pP2tbbF09dGhpcy5fYXBwbHlEZWZhdWx0cyhrW2xdfHx7fSx0W2xdKTpwfHwoa1tsXT10W2xdKX19cmV0dXJuIGt9X2NyZWF0ZVdvcmxkKGYsaCl7dGhpcy5pc1JlYWR5KCl8fCh0aGlzLl9zY2VuZT1uZXcgVEhSRUUuU2NlbmUsdGhpcy5fY2FtZXJhPWY9bmV3IFRIUkVFW2YuY2FtZXJhLmNsc10oZi5jYW1lcmEuZm92LAp0aGlzLl9jYW52YXNTaXplLndpZHRoL3RoaXMuX2NhbnZhc1NpemUuaGVpZ2h0LGYuY2FtZXJhLm5lYXIsZi5jYW1lcmEuZmFyKSxoPW5ldyBUSFJFRS5PcmJpdENvbnRyb2xzKGYsaCksaC5sb29rU3BlZWQ9LjQsaC5tb3ZlbWVudFNwZWVkPTIwLGgubm9GbHk9ITAsaC5sb29rVmVydGljYWw9ITAsaC5jb25zdHJhaW5WZXJ0aWNhbD0hMCxoLnZlcnRpY2FsTWluPTEsaC52ZXJ0aWNhbE1heD0yLGguYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLl9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlLmJpbmQodGhpcykpLHRoaXMuX2NhbWVyYUNvbnRyb2xzPWgsdGhpcy5fcmVuZGVyZXI9bmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoe2FudGlhbGlhczohMH0pLHRoaXMuX3JlbmRlcmVyLnNldFBpeGVsUmF0aW8oKSx0aGlzLl9yZW5kZXJlci5zZXRTaXplKHRoaXMuX2NhbnZhc1NpemUud2lkdGgsdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQpLHRoaXMuX3JlbmRlcmVyLnNldENsZWFyQ29sb3IoMTY3NzcyMTUsCjEpKX1fY2xlYXJTY2VuZSgpe2Zvcig7MDx0aGlzLl9zY2VuZS5jaGlsZHJlbi5sZW5ndGg7KXRoaXMuX3NjZW5lLnJlbW92ZSh0aGlzLl9zY2VuZS5jaGlsZHJlblswXSl9Z2V0UmVuZGVyZXIoKXtyZXR1cm4gdGhpcy5fcmVuZGVyZXJ9Z2V0Q2FtZXJhQ29udHJvbHMoKXtyZXR1cm4gdGhpcy5fY2FtZXJhQ29udHJvbHN9aXNSZWFkeSgpe3JldHVybiEhdGhpcy5fY2FtZXJhJiYhIXRoaXMuX2NhbWVyYUNvbnRyb2xzfWdldENhbWVyYVBvc2l0aW9uKCl7cmV0dXJue2Zhcjp0aGlzLl9jYW1lcmEuZmFyLHBvc2l0aW9uOnRoaXMuX2NhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLHRhcmdldDp0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQuY2xvbmUoKX19c2V0Q2FudmFzU2l6ZShmKXt0aGlzLl9jYW52YXNTaXplPWZ9ZHJhdygpe3RoaXMuX2FuaW1hdGlvbkZyYW1lSW5kZXgmJmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGlvbkZyYW1lSW5kZXgpO3RoaXMuX2NhbWVyYS5hc3BlY3Q9CnRoaXMuX2NhbnZhc1NpemUud2lkdGgvdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQ7dGhpcy5fY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLl9yZW5kZXJlci5zZXRTaXplKHRoaXMuX2NhbnZhc1NpemUud2lkdGgsdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQpO2NvbnN0IGY9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLl9jbG9jay5nZXREZWx0YSgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZShoKTt0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4PXJlcXVlc3RBbmltYXRpb25GcmFtZShmKTt0aGlzLl9yZW5kZXJlci5yZW5kZXIodGhpcy5fc2NlbmUsdGhpcy5fY2FtZXJhKX0uYmluZCh0aGlzKTtmKCl9dXBkYXRlU2NlbmUoZixoKXtsZXQgaz17fTsiY29uZmlnImluIGYmJmYuY29uZmlnJiYoaz1KU09OLnBhcnNlKGYuY29uZmlnKSk7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJiZWZvcmVVcGRhdGVTY2VuZSJ9KTtrPXRoaXMuX2FwcGx5RGVmYXVsdHMoayx7Y2FtZXJhOntjbHM6IlBlcnNwZWN0aXZlQ2FtZXJhIiwKZm92Ojc1LG5lYXI6LjEsZmFyOjFFM30sbGlnaHRzOlt7Y2xzOiJBbWJpZW50TGlnaHQiLGNvbG9yOiIjZmZmZmZmIixpbnRlbnNpdHk6Ljc1fSx7Y2xzOiJEaXJlY3Rpb25hbExpZ2h0Iixjb2xvcjoiI2ZmZmZmZiIsaW50ZW5zaXR5Oi43NSxwb3NpdGlvbjpbMCwtMSwyXX1dfSk7dGhpcy5fY3JlYXRlV29ybGQoayxoKTt0aGlzLl9jbGVhclNjZW5lKCk7dGhpcy5fY3JlYXRlTGlnaHRzKHRoaXMuX3NjZW5lLGspO3RoaXMuX2NyZWF0ZUdlb21ldHJ5KGYsayk7dGhpcy5kcmF3KCl9cmVzZXRWaWV3KCl7aWYodGhpcy5pc1JlYWR5KCkpe3RoaXMuX2NhbWVyYUNvbnRyb2xzLnJlc2V0KCk7aWYoIWYmJnRoaXMuX2xhc3RNZXNoKXZhciBmPXRoaXMuX2xhc3RNZXNoO2YmJih0aGlzLl9maXRPYmplY3RUb1ZpZXdwb3J0KGYpLHRoaXMuX2xhc3RNZXNoPWYpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZSgpfX1fY3JlYXRlR2VvbWV0cnkoZixoKXtmPWYubWVzaDtmLnZlcnRpY2VzJiZmLmZhY2VzJiYKZi5mYWNlcy5sZW5ndGg/dGhpcy5fY3JlYXRlTWVzaChmLGgpOnRoaXMuX2NyZWF0ZVBvaW50Q2xvdWQoZixoKX1fY3JlYXRlUG9pbnRDbG91ZChmLGgpe3ZhciBrPWYudmVydGljZXM7Zj1mLmNvbG9ycztsZXQgdD17bWF0ZXJpYWw6e2NsczoiUG9pbnRzTWF0ZXJpYWwiLHNpemU6LjAwNX19O2YmJmYubGVuZ3RoPT1rLmxlbmd0aD90Lm1hdGVyaWFsLnZlcnRleENvbG9ycz1USFJFRS5WZXJ0ZXhDb2xvcnM6dC5tYXRlcmlhbC5jb2xvcj10aGlzLl9ydW5Db2xvcjtoPXRoaXMuX2FwcGx5RGVmYXVsdHMoaCx0KTt2YXIgbD1uZXcgVEhSRUUuR2VvbWV0cnk7ay5mb3JFYWNoKGZ1bmN0aW9uKHApe3ZhciBtPW5ldyBUSFJFRS5WZWN0b3IzKHBbMF0scFsxXSxwWzJdKTttLng9MSpwWzBdO20ueT0xKnBbMV07bS56PTEqcFsyXTtsLnZlcnRpY2VzLnB1c2gobSl9KTtmJiZmLmxlbmd0aD09ay5sZW5ndGgmJmYuZm9yRWFjaChmdW5jdGlvbihwKXtwPW5ldyBUSFJFRS5Db2xvcihwWzBdLzI1NSwKcFsxXS8yNTUscFsyXS8yNTUpO2wuY29sb3JzLnB1c2gocCl9KTtrPW5ldyBUSFJFRVtoLm1hdGVyaWFsLmNsc10oaC5tYXRlcmlhbCk7az1uZXcgVEhSRUUuUG9pbnRzKGwsayk7dGhpcy5fc2NlbmUuYWRkKGspO3RoaXMuX2xhc3RNZXNoPWt9c2V0Q2FtZXJhVmlld3BvaW50KGYsaCxrKXt0aGlzLl9zaWxlbnQ9ITA7dGhpcy5fY2FtZXJhLmZhcj1oO3RoaXMuX2NhbWVyYS5wb3NpdGlvbi5zZXQoZi54LGYueSxmLnopO3RoaXMuX2NhbWVyYS5sb29rQXQoay5jbG9uZSgpKTt0aGlzLl9jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnRhcmdldD1rLmNsb25lKCk7dGhpcy5fY2FtZXJhQ29udHJvbHMudXBkYXRlKCk7dGhpcy5fc2lsZW50PSExfV9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlKGYpe3RoaXMuX3NpbGVudHx8dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJjYW1lcmFQb3NpdGlvbkNoYW5nZSIsZXZlbnQ6Zn0pfV9maXRPYmplY3RUb1ZpZXdwb3J0KGYpe3ZhciBoPQpuZXcgVEhSRUUuQm94MztoLnNldEZyb21PYmplY3QoZik7Zj1oLmNlbnRlcigpO3ZhciBrPWguc2l6ZSgpO2s9MS4yNSpNYXRoLmFicyhNYXRoLm1heChrLngsay55LGsueikvKDIqTWF0aC50YW4oTWF0aC5QSS8xODAqdGhpcy5fY2FtZXJhLmZvdi8yKSkpO2g9aC5taW4uejt0aGlzLnNldENhbWVyYVZpZXdwb2ludCh7eDpmLngseTpmLnksejprfSwzKigwPmg/LWgrazprLWgpLGYpfV9jcmVhdGVNZXNoKGYsaCl7dmFyIGs9Zi52ZXJ0aWNlcztjb25zdCB0PWYuZmFjZXMsbD1mLmNvbG9ycztmPXRoaXMuX2FwcGx5RGVmYXVsdHMoaCx7bWF0ZXJpYWw6e2NsczoiTWVzaFN0YW5kYXJkTWF0ZXJpYWwiLGNvbG9yOiIjYTBhMGEwIixyb3VnaG5lc3M6MSxtZXRhbG5lc3M6MH19KTtsZXQgcD1uZXcgVEhSRUUuR2VvbWV0cnk7ay5mb3JFYWNoKGZ1bmN0aW9uKG0pe2xldCBuPW5ldyBUSFJFRS5WZWN0b3IzKG1bMF0sbVsxXSxtWzJdKTtuLng9MSptWzBdO24ueT0xKm1bMV07bi56PTEqbVsyXTsKcC52ZXJ0aWNlcy5wdXNoKG4pfSk7dC5mb3JFYWNoKGZ1bmN0aW9uKG0pe2xldCBuPW5ldyBUSFJFRS5GYWNlMyhtWzBdLG1bMV0sbVsyXSk7aWYobCYmbC5sZW5ndGgpe209W2xbbVswXV0sbFttWzFdXSxsW21bMl1dXTtmb3IobGV0IHU9MDt1PG0ubGVuZ3RoO3UrKyl7dmFyIHE9bVt1XTtxPW5ldyBUSFJFRS5Db2xvcihxWzBdLzI1NSxxWzFdLzI1NSxxWzJdLzI1NSk7bi52ZXJ0ZXhDb2xvcnMucHVzaChxKX19cC5mYWNlcy5wdXNoKG4pfSk7bCYmbC5sZW5ndGgmJihmLm1hdGVyaWFsPWYubWF0ZXJpYWx8fHt9LGYubWF0ZXJpYWwudmVydGV4Q29sb3JzPVRIUkVFLlZlcnRleENvbG9ycyk7cC5jZW50ZXIoKTtwLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3AuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtrPW5ldyBUSFJFRVtmLm1hdGVyaWFsLmNsc10oZi5tYXRlcmlhbCk7az1uZXcgVEhSRUUuTWVzaChwLGspO2suY2FzdFNoYWRvdz0hMDtrLnJlY2VpdmVTaGFkb3c9ITA7dGhpcy5fc2NlbmUuYWRkKGspOwp0aGlzLl9sYXN0TWVzaD1rfV9jcmVhdGVMaWdodHMoZixoKXtmb3IobGV0IGs9MDtrPGgubGlnaHRzLmxlbmd0aDtrKyspe2NvbnN0IHQ9aC5saWdodHNba107bGV0IGw9bmV3IFRIUkVFW3QuY2xzXSh0LmNvbG9yLHQuaW50ZW5zaXR5KTt0LnBvc2l0aW9uJiZsLnBvc2l0aW9uLnNldCh0LnBvc2l0aW9uWzBdLHQucG9zaXRpb25bMV0sdC5wb3NpdGlvblsyXSk7Zi5hZGQobCl9fX1iLk1lc2hWaWV3ZXI9ZH0pKExrfHwoTGs9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1tZXNoLWRhc2hib2FyZC9tZXNoLWxvYWRlci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLW1lc2gtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcixvZlNhbXBsZXM6TnVtYmVyLHNlbGVjdGVkVmlldzp7dHlwZTpTdHJpbmcsdmFsdWU6ImFsbCJ9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX21lc2hWaWV3ZXI6e3R5cGU6T2JqZWN0fSxfZGF0YVByb3ZpZGVyOnt0eXBlOk9iamVjdH0sX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PnBmLnJ1bnNDb2xvclNjYWxlfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfc3RlcHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdLG5vdGlmeTohMH0sX3N0ZXBJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxfY3VycmVudFN0ZXA6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRTdGVwKF9zdGVwcywgX3N0ZXBJbmRleCkifSwKX21lc2hWaWV3ZXJBdHRhY2hlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc3RlcFZhbHVlOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVTdGVwVmFsdWUoX2N1cnJlbnRTdGVwKSJ9LF9jdXJyZW50V2FsbFRpbWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRXYWxsVGltZShfY3VycmVudFN0ZXApIn0sX2lzTWVzaExvYWRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZywgYWN0aXZlLCBfZGF0YVByb3ZpZGVyLCBfbWVzaFZpZXdlcikiLCJfdXBkYXRlU2NlbmUoX2N1cnJlbnRTdGVwLiosIF9tZXNoVmlld2VyKSIsIl9kZWJvdW5jZWRGZXRjaE1lc2goX2N1cnJlbnRTdGVwKSIsIl91cGRhdGVWaWV3KHNlbGVjdGVkVmlldykiXSxfY29tcHV0ZVJ1bkNvbG9yOmZ1bmN0aW9uKGQpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24oZCl9LAphdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RhdGFQcm92aWRlcj1uZXcgYi5BcnJheUJ1ZmZlckRhdGFQcm92aWRlcih0aGlzLnJlcXVlc3RNYW5hZ2VyKTtjb25zdCBkPW5ldyBiLk1lc2hWaWV3ZXIodGhpcy5fcnVuQ29sb3IpO2QuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JlVXBkYXRlU2NlbmUiLHRoaXMuX3VwZGF0ZUNhbnZhc1NpemUuYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJjYW1lcmFQb3NpdGlvbkNoYW5nZSIsdGhpcy5fb25DYW1lcmFQb3NpdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTt0aGlzLl9tZXNoVmlld2VyPWR9LHJlbG9hZDpmdW5jdGlvbigpe3RoaXMuYWN0aXZlJiZ0aGlzLl9kYXRhUHJvdmlkZXImJih0aGlzLnNldCgiX2lzTWVzaExvYWRpbmciLCEwKSx0aGlzLl9kYXRhUHJvdmlkZXIucmVsb2FkKHRoaXMucnVuLHRoaXMudGFnLHRoaXMuc2FtcGxlKS50aGVuKGQ9PntkJiYodGhpcy5zZXQoIl9zdGVwcyIsZCksdGhpcy5zZXQoIl9zdGVwSW5kZXgiLApkLmxlbmd0aC0xKSl9KS5jYXRjaChkPT57aWYoIWR8fCFkLmNvZGV8fGQuY29kZSE9Yi5FcnJvckNvZGVzLkNBTkNFTExFRCl0aHJvdyBFcnJvcihkfHwiUmVzcG9uc2UgcHJvY2Vzc2luZyBmYWlsZWQuIik7fSkpfSxfdXBkYXRlU2NlbmU6ZnVuY3Rpb24oKXtjb25zdCBkPXRoaXMuX2N1cnJlbnRTdGVwO2QmJmQubWVzaCYmKHRoaXMuX21lc2hWaWV3ZXIudXBkYXRlU2NlbmUoZCx0aGlzKSx0aGlzLl9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkfHwodGhpcy5fbWVzaFZpZXdlci5yZXNldFZpZXcoKSx0aGlzLl9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkPSEwKSx0aGlzLl9tZXNoVmlld2VyQXR0YWNoZWR8fCh0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5fbWVzaFZpZXdlci5nZXRSZW5kZXJlcigpLmRvbUVsZW1lbnQpLHRoaXMuX21lc2hWaWV3ZXJBdHRhY2hlZD0hMCkpfSxfZGVib3VuY2VkRmV0Y2hNZXNoKCl7dGhpcy5kZWJvdW5jZSgiZmV0Y2hNZXNoIiwoKT0+dGhpcy5fbWF5YmVGZXRjaE1lc2goKSwKMTAwKX0sX21heWJlRmV0Y2hNZXNoKCl7Y29uc3QgZD10aGlzO3JldHVybiBoYyhmdW5jdGlvbiooKXtjb25zdCBmPWQuX2N1cnJlbnRTdGVwO2lmKGYmJiFmLm1lc2gmJiFmLm1lc2hGZXRjaGluZyl7Zi5tZXNoRmV0Y2hpbmc9ITA7ZC5faXNNZXNoTG9hZGluZz0hMDt0cnl7Y29uc3QgaD15aWVsZCBkLl9kYXRhUHJvdmlkZXIuZmV0Y2hEYXRhKGYsZC5ydW4sZC50YWcsZC5zYW1wbGUpO2YubWVzaD1oWzBdO2Qubm90aWZ5UGF0aCgiX2N1cnJlbnRTdGVwLm1lc2giKX1jYXRjaChoKXtpZighaHx8IWguY29kZXx8aC5jb2RlIT1iLkVycm9yQ29kZXMuQ0FOQ0VMTEVEKXRocm93IGg9aHx8IlJlc3BvbnNlIHByb2Nlc3NpbmcgZmFpbGVkLiIsRXJyb3IoaCk7fWZpbmFsbHl7ZC5faXNNZXNoTG9hZGluZz0hMSxmLm1lc2hGZXRjaGluZz0hMX19fSl9LF9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWVzaFZpZXdlci5pc1JlYWR5KCkpe3ZhciBkPW5ldyBDdXN0b21FdmVudCgiY2FtZXJhLXBvc2l0aW9uLWNoYW5nZSIsCntkZXRhaWw6dGhpcy5fbWVzaFZpZXdlci5nZXRDYW1lcmFQb3NpdGlvbigpfSk7dGhpcy5kaXNwYXRjaEV2ZW50KGQpfX0sc2V0Q2FtZXJhVmlld3BvaW50OmZ1bmN0aW9uKGQsZixoKXt0aGlzLl9tZXNoVmlld2VyLnNldENhbWVyYVZpZXdwb2ludChkLGYsaCl9LF91cGRhdGVDYW52YXNTaXplOmZ1bmN0aW9uKCl7Y29uc3QgZD10aGlzLm9mZnNldFdpZHRoLGY9dGhpcy4kJCgiLnRmLW1lc2gtbG9hZGVyLWhlYWRlciIpLm9mZnNldEhlaWdodDt0aGlzLl9tZXNoVmlld2VyLnNldENhbnZhc1NpemUoe3dpZHRoOmQsaGVpZ2h0OmQtZn0pfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDYW52YXNTaXplKCk7dGhpcy5pc0Nvbm5lY3RlZCYmdGhpcy5fbWVzaFZpZXdlci5kcmF3KCl9LF9oYXNBdExlYXN0T25lU3RlcDpmdW5jdGlvbihkKXtyZXR1cm4hIWQmJjA8ZC5sZW5ndGh9LF9oYXNNdWx0aXBsZVN0ZXBzOmZ1bmN0aW9uKGQpe3JldHVybiEhZCYmMTxkLmxlbmd0aH0sX2NvbXB1dGVDdXJyZW50U3RlcDpmdW5jdGlvbihkLApmKXtyZXR1cm4gZFtmXXx8bnVsbH0sX2NvbXB1dGVTdGVwVmFsdWU6ZnVuY3Rpb24oZCl7cmV0dXJuIGQ/ZC5zdGVwOjB9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lOmZ1bmN0aW9uKGQpe3JldHVybiBkP0hoLmZvcm1hdERhdGUoZC53YWxsX3RpbWUpOiIifSxfZ2V0TWF4U3RlcEluZGV4OmZ1bmN0aW9uKGQpe3JldHVybiBkLmxlbmd0aC0xfSxfZ2V0U2FtcGxlVGV4dDpmdW5jdGlvbihkKXtyZXR1cm4gU3RyaW5nKGQrMSl9LF9oYXNNdWx0aXBsZVNhbXBsZXM6ZnVuY3Rpb24oZCl7cmV0dXJuIDE8ZH0sX3VwZGF0ZVZpZXc6ZnVuY3Rpb24oZCl7dGhpcy5fbWVzaFZpZXdlciYmImFsbCI9PWQmJnRoaXMuX21lc2hWaWV3ZXIucmVzZXRWaWV3KCl9LHRvTG9jYWxlU3RyaW5nXzpmdW5jdGlvbihkKXtyZXR1cm4gZC50b0xvY2FsZVN0cmluZygpfX0pfSkoTGt8fChMaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW1lc2gtZGFzaGJvYXJkL3RmLW1lc2gtZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6Im1lc2gtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiLioifSxfc2VsZWN0ZWRWaWV3Ont0eXBlOlN0cmluZyxub3RpZnk6ITAsdmFsdWU6ImFsbCJ9LF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlcikifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCgpPT57dGhpcy5faGFuZGxlV2luZG93UmVzaXplKCl9LCExKTt0aGlzLnJlbG9hZCgpfSxfZ2V0QWxsQ2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLW1lc2gtbG9hZGVyIil9LApfb25DYW1lcmFQb3NpdGlvbkNoYW5nZWQoYil7InNoYXJlIj09dGhpcy5fc2VsZWN0ZWRWaWV3JiZ0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goZD0+e2IudGFyZ2V0IT1kJiZkLnNldENhbWVyYVZpZXdwb2ludChiLmRldGFpbC5wb3NpdGlvbixiLmRldGFpbC5mYXIsYi5kZXRhaWwudGFyZ2V0KX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbih0aGlzLl9yZWxvYWRNZXNoZXMuYmluZCh0aGlzKSl9LF9oYW5kbGVXaW5kb3dSZXNpemUoKXt0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goYj0+e2IucmVkcmF3KCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+e2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZj1fLm1hcFZhbHVlcyhkLApoPT5PYmplY3Qua2V5cyhoKSk7Zj12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKX19KX0sX3JlbG9hZE1lc2hlcygpe3RoaXMuX2dldEFsbENoaWxkcmVuKCkuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgodCl7Y29uc3QgbD1iW3QucnVuXVt0LnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSx0LHtzYW1wbGU6cCxvZlNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIsdD0+T2JqZWN0LmtleXModCkpO3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaCkpfSkpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9tZXNzYWdlLmpzClVpPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbihiLGQsZixoKXtyZXR1cm4gbmV3IChmfHwoZj1Qcm9taXNlKSkoZnVuY3Rpb24oayx0KXtmdW5jdGlvbiBsKG4pe3RyeXttKGgubmV4dChuKSl9Y2F0Y2gocSl7dChxKX19ZnVuY3Rpb24gcChuKXt0cnl7bShoWyJ0aHJvdyJdKG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBtKG4pe24uZG9uZT9rKG4udmFsdWUpOihuZXcgZihmdW5jdGlvbihxKXtxKG4udmFsdWUpfSkpLnRoZW4obCxwKX1tKChoPWguYXBwbHkoYixkfHxbXSkpLm5leHQoKSl9KX07dmFyIE1rOwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjbGFzcyBoe2NvbnN0cnVjdG9yKGspe3RoaXMucG9ydD1rO3RoaXMuaWQ9MDt0aGlzLnJlc3BvbnNlV2FpdHM9bmV3IE1hcDt0aGlzLmxpc3RlbmVycz1uZXcgTWFwO3RoaXMucG9ydC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0PT50aGlzLm9uTWVzc2FnZSh0KSl9bGlzdGVuKGssdCl7dGhpcy5saXN0ZW5lcnMuc2V0KGssdCl9dW5saXN0ZW4oayl7dGhpcy5saXN0ZW5lcnMuZGVsZXRlKGspfW9uTWVzc2FnZShrKXtyZXR1cm4gVWkodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3ZhciB0PUpTT04ucGFyc2Uoay5kYXRhKTtjb25zdCBsPXQudHlwZSxwPXQuaWQsbT10LnBheWxvYWQ7dmFyIG49dC5lcnJvcjtpZih0LmlzUmVwbHkpe2lmKHRoaXMucmVzcG9uc2VXYWl0cy5oYXMocCkpe3ZhciB7cmVzb2x2ZTpxLHJlamVjdDp1fT10aGlzLnJlc3BvbnNlV2FpdHMuZ2V0KHApO3RoaXMucmVzcG9uc2VXYWl0cy5kZWxldGUocCk7Cm4/dShFcnJvcihuKSk6cShtKX19ZWxzZXtuPXQ9bnVsbDtpZih0aGlzLmxpc3RlbmVycy5oYXMobCkpe2NvbnN0IHg9dGhpcy5saXN0ZW5lcnMuZ2V0KGwpO3RyeXt0PXlpZWxkIHgobSl9Y2F0Y2goQSl7bj1BfX10aGlzLnBvc3RNZXNzYWdlKHtbInR5cGUiXTpsLFsiaWQiXTpwLFsicGF5bG9hZCJdOnQsWyJlcnJvciJdOm4sWyJpc1JlcGx5Il06ITB9KX19KX1wb3N0TWVzc2FnZShrKXt0aGlzLnBvcnQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaykpfXNlbmRNZXNzYWdlKGspe2NvbnN0IHQ9dGhpcy5pZCsrO3RoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6ImV4cGVyaW1lbnRhbC5SdW5zQ2hhbmdlZCIsaWQ6dCxwYXlsb2FkOmssZXJyb3I6bnVsbCxpc1JlcGx5OiExfSk7cmV0dXJuIG5ldyBQcm9taXNlKChsLHApPT57dGhpcy5yZXNwb25zZVdhaXRzLnNldCh0LHtyZXNvbHZlOmwscmVqZWN0OnB9KX0pfX1mLklQQz1ofSkoZC5ET19OT1RfVVNFX0lOVEVSTkFMfHwoZC5ET19OT1RfVVNFX0lOVEVSTkFMPQp7fSkpfSkoYi5saWJ8fChiLmxpYj17fSkpfSkoTWt8fChNaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL3BsdWdpbi1ob3N0LWlwYy5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYobSxuKXtjb25zdCBxPW5ldyBiLmxpYi5ET19OT1RfVVNFX0lOVEVSTkFMLklQQyhtKTt0LmFkZChxKTtwLnNldChxLG4pO20uc3RhcnQoKTtmb3IoY29uc3QgW3UseF1vZiBsKW09aCh4LHEpLHEubGlzdGVuKHUsbSl9ZnVuY3Rpb24gaChtLG4pe3JldHVybiBxPT57dmFyIHU9cC5nZXQobik7dT1rLmdldCh1KXx8bnVsbDtyZXR1cm4gbSh1LHEpfX1kLnJlZ2lzdGVyUGx1Z2luSWZyYW1lPWZ1bmN0aW9uKG0sbil7ay5zZXQobSx7cGx1Z2luTmFtZTpufSl9O2NvbnN0IGs9bmV3IFdlYWtNYXAsdD1uZXcgU2V0LGw9bmV3IE1hcCxwPW5ldyBNYXA7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG09PntpZigiZXhwZXJpbWVudGFsLmJvb3RzdHJhcCI9PT1tLmRhdGEpe3ZhciBuPW0ucG9ydHNbMF07biYmKG09bS5zb3VyY2U/bS5zb3VyY2UuZnJhbWVFbGVtZW50Om51bGwpJiZmKG4sbSl9fSk7ZC5icm9hZGNhc3Q9CmZ1bmN0aW9uKCl7dmFyIG09dmMucnVuc1N0b3JlLmdldFJ1bnMoKTtmb3IodmFyIG4gb2YgdClwLmdldChuKS5pc0Nvbm5lY3RlZHx8KHQuZGVsZXRlKG4pLHAuZGVsZXRlKG4pKTtuPVsuLi50XS5tYXAocT0+cS5zZW5kTWVzc2FnZShtKSk7cmV0dXJuIFByb21pc2UuYWxsKG4pfTtkLmxpc3Rlbj1mdW5jdGlvbihtLG4pe2wuc2V0KG0sbik7Zm9yKGNvbnN0IHEgb2YgdCl7Y29uc3QgdT1oKG4scSk7cS5saXN0ZW4obSx1KX19O2QudW5saXN0ZW49ZnVuY3Rpb24obSl7bC5kZWxldGUobSk7Zm9yKGNvbnN0IG4gb2YgdCluLnVubGlzdGVuKG0pfX0pKGIuaG9zdHx8KGIuaG9zdD17fSkpfSkoTWt8fChNaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL2NvcmUtaG9zdC1pbXBsLmpzCk1rLmhvc3QubGlzdGVuKCJleHBlcmltZW50YWwuR2V0VVJMUGx1Z2luRGF0YSIsYj0+e2lmKGIpe2I9YHAuJHtiLnBsdWdpbk5hbWV9LmA7dmFyIGQ9e307Zm9yKGxldCBmIGluIHBkLnVybERpY3QpZi5zdGFydHNXaXRoKGIpJiYoZFtmLnN1YnN0cmluZyhiLmxlbmd0aCldPXBkLnVybERpY3RbZl0pO3JldHVybiBkfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL3J1bnMtaG9zdC1pbXBsLmpzCk1rLmhvc3QubGlzdGVuKCJleHBlcmltZW50YWwuR2V0UnVucyIsKCk9PnZjLnJ1bnNTdG9yZS5nZXRSdW5zKCkpO3ZjLnJ1bnNTdG9yZS5hZGRMaXN0ZW5lcigoKT0+TWsuaG9zdC5icm9hZGNhc3QoKSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGVuc29yYm9hcmQvYXV0b1JlbG9hZEJlaGF2aW9yLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKCl7cmV0dXJuKG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkpLmhhcygiX0Rpc2FibGVBdXRvUmVsb2FkIil9Yi5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVk9IlRGLlRlbnNvckJvYXJkLmF1dG9SZWxvYWRFbmFibGVkIjtiLkF1dG9SZWxvYWRCZWhhdmlvcj17cHJvcGVydGllczp7YXV0b1JlbG9hZEVuYWJsZWQ6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2F1dG9SZWxvYWRPYnNlcnZlciIsdmFsdWU6KCk9Pnt2YXIgZj13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYi5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVkpO3JldHVybiJ0cnVlIj09PWZ8fG51bGw9PWZ9fSxfYXV0b1JlbG9hZElkOnt0eXBlOk51bWJlcn0sX21pc3NlZEF1dG9SZWxvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kSGFuZGxlVmlzaWJpbGl0eUNoYW5nZTp7dHlwZTpPYmplY3R9LGF1dG9SZWxvYWRJbnRlcnZhbFNlY3M6e3R5cGU6TnVtYmVyLAp2YWx1ZTozMH19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYm91bmRIYW5kbGVWaXNpYmlsaXR5Q2hhbmdlPXRoaXMuX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UuYmluZCh0aGlzKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9ib3VuZEhhbmRsZVZpc2liaWxpdHlDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9ib3VuZEhhbmRsZVZpc2liaWxpdHlDaGFuZ2UpfSxfYXV0b1JlbG9hZE9ic2VydmVyOmZ1bmN0aW9uKGYpe3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShiLkFVVE9SRUxPQURfTE9DQUxTVE9SQUdFX0tFWSxmKTtmJiYhZCgpP3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyk6CndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKX0sX2RvQXV0b1JlbG9hZDpmdW5jdGlvbigpe3RoaXMuX2lzRG9jdW1lbnRWaXNpYmxlKCk/dGhpcy5fZG9SZWxvYWQoKTp0aGlzLl9taXNzZWRBdXRvUmVsb2FkPSEwO3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyl9LF9kb1JlbG9hZDpmdW5jdGlvbigpe2lmKG51bGw9PXRoaXMucmVsb2FkKXRocm93IEVycm9yKCJBdXRvUmVsb2FkQmVoYXZpb3IgcmVxdWlyZXMgYSByZWxvYWQgbWV0aG9kIik7dGhpcy5yZWxvYWQoKX0sX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLl9pc0RvY3VtZW50VmlzaWJsZSgpJiZ0aGlzLl9taXNzZWRBdXRvUmVsb2FkJiYodGhpcy5fbWlzc2VkQXV0b1JlbG9hZD0hMSx0aGlzLl9kb1JlbG9hZCgpKX0sX2lzRG9jdW1lbnRWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuInZpc2libGUiPT09CmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZX19fSkocWZ8fChxZj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3RmLXRlbnNvcmJvYXJkLmh0bWwuanMKY29uc3QgWW09e2dldExvY2F0aW9uKCl7cmV0dXJuIHdpbmRvdy5sb2NhdGlvbn19OwpQb2x5bWVyKHtpczoidGYtdGVuc29yYm9hcmQiLGJlaGF2aW9yczpbcWYuQXV0b1JlbG9hZEJlaGF2aW9yXSxwcm9wZXJ0aWVzOnticmFuZDp7dHlwZTpTdHJpbmcsdmFsdWU6IlRlbnNvckJvYXJkLVgifSxob21lUGF0aDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9ob21lUGF0aDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9zYW5pdGl6ZUhvbWVQYXRoKGhvbWVQYXRoKSJ9LHRpdGxlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3VwZGF0ZVRpdGxlIn0scm91dGVyOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZVJvdXRlciJ9LGRlbW9EaXI6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHVzZUhhc2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZGlzYWJsZWREYXNoYm9hcmRzOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2Rhc2hib2FyZERhdGE6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkRGF0YShfZGFzaGJvYXJkUmVnaXN0cnkpIn0sX2Rhc2hib2FyZFJlZ2lzdHJ5Ont0eXBlOk9iamVjdCwKY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkUmVnaXN0cnkoX3BsdWdpbnNMaXN0aW5nKSJ9LF9wbHVnaW5zTGlzdGluZzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9hY3RpdmVEYXNoYm9hcmRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZChfZGFzaGJvYXJkRGF0YSwgX3BsdWdpbnNMaXN0aW5nKSJ9LF9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlOnt0eXBlOlN0cmluZyx2YWx1ZTpxZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9hY3RpdmVEYXNoYm9hcmRzTm90TG9hZGVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSxfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNMb2FkZWQoX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUpIn0sCl9hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0ZhaWxlZFRvTG9hZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSxfc2hvd05vRGFzaGJvYXJkc01lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkifSxfc2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZCwgX2Rhc2hib2FyZFJlZ2lzdHJ5LCBfc2VsZWN0ZWREYXNoYm9hcmQpIn0sX3NlbGVjdGVkRGFzaGJvYXJkOnt0eXBlOlN0cmluZyx2YWx1ZTpwZC5nZXRTdHJpbmcocGQuVEFCKXx8bnVsbCxvYnNlcnZlcjoiX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZCJ9LApfZGFzaGJvYXJkVG9NYXliZVJlbW92ZTpTdHJpbmcsX2Rhc2hib2FyZENvbnRhaW5lcnNTdGFtcGVkOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX2lzUmVsb2FkRGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2xhc3RSZWxvYWRUaW1lOnt0eXBlOlN0cmluZyx2YWx1ZToibm90IHlldCBsb2FkZWQifSxfbGFzdFJlbG9hZFRpbWVTaG9ydDp7dHlwZTpTdHJpbmcsdmFsdWU6Ik5vdCB5ZXQgbG9hZGVkIn0sX2RhdGFMb2NhdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX3JlZnJlc2hpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbIl91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21BY3RpdmUoX3NlbGVjdGVkRGFzaGJvYXJkLCBfYWN0aXZlRGFzaGJvYXJkcykiLAoiX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChfZGFzaGJvYXJkUmVnaXN0cnksIF9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkiXSxfc2FuaXRpemVIb21lUGF0aChiKXtpZighYilyZXR1cm4iIjtjb25zdCBkPVltLmdldExvY2F0aW9uKCksZj1uZXcgVVJMKGIsZC5ocmVmKSxoPSJodHRwOiI9PT1mLnByb3RvY29sfHwiaHR0cHM6Ij09PWYucHJvdG9jb2wsaz1mLm9yaWdpbj09PWQub3JpZ2luO2lmKCFoKXRocm93IG5ldyBSYW5nZUVycm9yKGBFeHBlY3QgJ2hvbWVQYXRoJyB0byBiZSBvZiBodHRwOiBvciBodHRwczouICR7Yn1gKTtpZighayl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRXhwZWN0ICdob21lUGF0aCcgYmUgYSBwYXRoIG9yIGhhdmUgdGhlIHNhbWUgb3JpZ2luLiAke2J9IHZzLiAke2Qub3JpZ2lufWApO3JldHVybiBoJiZrP2YudG9TdHJpbmcoKToiIn0sX2FjdGl2ZURhc2hib2FyZHNVcGRhdGVkKCl7fSwKX2lzRGFzaGJvYXJkQWN0aXZlKGIsZCxmKXtyZXR1cm4gMDw9KGJ8fCIiKS5zcGxpdCgiLCIpLmluZGV4T2YoZi5wbHVnaW4pfHwhKGR8fFtdKS5pbmNsdWRlcyhmLnBsdWdpbik/ITE6ITB9LF9pc0Rhc2hib2FyZEluYWN0aXZlKGIsZCxmKXtyZXR1cm4gMDw9KGJ8fCIiKS5zcGxpdCgiLCIpLmluZGV4T2YoZi5wbHVnaW4pPyExOihkfHxbXSkuaW5jbHVkZXMoZi5wbHVnaW4pPyExOiEwfSxfaW5hY3RpdmVEYXNoYm9hcmRzRXhpc3QoYixkLGYpe2lmKCFmKXJldHVybiExO2NvbnN0IGg9bmV3IFNldDtiLmZvckVhY2goaz0+e2guYWRkKGsucGx1Z2luKX0pOyhkfHwiIikuc3BsaXQoIiwiKS5mb3JFYWNoKGs9PntoLmRlbGV0ZShrLnBsdWdpbil9KTtmLmZvckVhY2goaz0+e2guZGVsZXRlKGspfSk7cmV0dXJuIDA8aC5zaXplfSxfZ2V0RGFzaGJvYXJkRnJvbUluZGV4KGIsZCl7cmV0dXJuIGJbZF19LF9zZWxlY3RlZFN0YXR1cyhiLGQpe3JldHVybiBiPT09ZH0sX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZChiKXtiPQpifHwiIjtwZC5zZXRTdHJpbmcocGQuVEFCLGIpO2xldCBkPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtkKz1kLmVuZHNXaXRoKCIvIik/YjoiLyIrYjtnYSgic2V0IiwicGFnZSIsZCk7Z2EoInNlbmQiLCJwYWdldmlldyIpfSxfdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tQWN0aXZlKGIsZCl7ZCYmbnVsbD09YiYmKGI9ZFswXXx8bnVsbCxudWxsIT1iJiYocGQuc2V0U3RyaW5nKHBkLlRBQixiLHt1c2VMb2NhdGlvblJlcGxhY2U6ITB9KSx0aGlzLl9zZWxlY3RlZERhc2hib2FyZD1iKSl9LF91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21IYXNoKCl7Y29uc3QgYj1wZC5nZXRTdHJpbmcocGQuVEFCKTt0aGlzLnNldCgiX3NlbGVjdGVkRGFzaGJvYXJkIixifHxudWxsKX0sX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChiLGQsZixoKXtpZihmJiZoJiZkW2hdJiYoZD10aGlzLl9kYXNoYm9hcmRUb01heWJlUmVtb3ZlLHRoaXMuX2Rhc2hib2FyZFRvTWF5YmVSZW1vdmU9CmgsZCYmZCE9aCYmYltkXS5yZW1vdmVEb20mJihkPXRoaXMuJCQoYC5kYXNoYm9hcmQtY29udGFpbmVyW2RhdGEtZGFzaGJvYXJkPSR7ZH1dYCksZC5maXJzdENoaWxkJiZkLmZpcnN0Q2hpbGQucmVtb3ZlKCkpLGQ9dGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHtofV1gKSkpe2I9YltoXTtpZigwPT09ZC5jaGlsZHJlbi5sZW5ndGgpc3dpdGNoKGY9Yi5sb2FkaW5nTWVjaGFuaXNtLGYudHlwZSl7Y2FzZSAiQ1VTVE9NX0VMRU1FTlQiOmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChmLmVsZW1lbnROYW1lKTtoLmlkPSJkYXNoYm9hcmQiO2QuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7Y2FzZSAiSUZSQU1FIjp0aGlzLl9yZW5kZXJQbHVnaW5JZnJhbWUoZCxoLGYpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJJbnZhcmlhbnQgdmlvbGF0aW9uOiIsZil9dGhpcy5zZXQoIl9pc1JlbG9hZERpc2FibGVkIixiLmRpc2FibGVSZWxvYWQpfX0sX3JlbmRlclBsdWdpbklmcmFtZShiLApkKXtjb25zdCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2YuaWQ9ImRhc2hib2FyZCI7TWsuaG9zdC5yZWdpc3RlclBsdWdpbklmcmFtZShmLGQpO2NvbnN0IGg9bmV3IFVSTCgiZGF0YS9wbHVnaW5fZW50cnkuaHRtbCIsd2luZG93LmxvY2F0aW9uLmhyZWYpO2guc2VhcmNoUGFyYW1zLnNldCgibmFtZSIsZCk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsaC50b1N0cmluZygpKTtiLmFwcGVuZENoaWxkKGYpfSxfc2VsZWN0ZWREYXNoYm9hcmRDb21wb25lbnQoKXtyZXR1cm4gdGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHt0aGlzLl9zZWxlY3RlZERhc2hib2FyZH1dICNkYXNoYm9hcmRgKX0scmVhZHkoKXthZC5zZXRVc2VIYXNoKHRoaXMudXNlSGFzaCk7dGhpcy5fdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tSGFzaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwoKT0+e3RoaXMuX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUhhc2goKX0sCiExKTt2Yy5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5fZGF0YUxvY2F0aW9uPXZjLmVudmlyb25tZW50U3RvcmUuZ2V0RGF0YUxvY2F0aW9uKCk7Y29uc3QgYj12Yy5lbnZpcm9ubWVudFN0b3JlLmdldFdpbmRvd1RpdGxlKCk7YiYmKHdpbmRvdy5kb2N1bWVudC50aXRsZT1iKX0pO3BkLm1pZ3JhdGVMZWdhY3lVUkxTY2hlbWUoKTt0aGlzLl9yZWxvYWREYXRhKCk7dGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZCgpe3JldHVybiB0aGlzLl9kYXNoYm9hcmREYXRhP3RoaXMuX2Rhc2hib2FyZERhdGEubWFwKGI9PmIucGx1Z2luKS5maWx0ZXIoYj0+e2I9dGhpcy5fcGx1Z2luc0xpc3RpbmdbYl07cmV0dXJuImJvb2xlYW4iPT09dHlwZW9mIGI/YjpiJiZiLmVuYWJsZWR9KTpbXX0sX29uVGVtcGxhdGVDaGFuZ2VkKCl7Y29uc3QgYj17fTtmb3IoY29uc3QgZCBvZiB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRhc2hib2FyZC1jb250YWluZXIiKSliW2QuZGF0YXNldC5kYXNoYm9hcmRdPQohMDt0aGlzLl9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZD1ifSxfY29tcHV0ZURhc2hib2FyZFJlZ2lzdHJ5KGIpe2NvbnN0IGQ9e307Zm9yKGNvbnN0IFtoLGtdb2YgT2JqZWN0LmVudHJpZXMocWYuZGFzaGJvYXJkUmVnaXN0cnkpKWRbaF09e3BsdWdpbjprLnBsdWdpbixsb2FkaW5nTWVjaGFuaXNtOnt0eXBlOiJDVVNUT01fRUxFTUVOVCIsZWxlbWVudE5hbWU6ay5lbGVtZW50TmFtZX0sdGFiTmFtZTprLnRhYk5hbWUudG9VcHBlckNhc2UoKSxkaXNhYmxlUmVsb2FkOmsuaXNSZWxvYWREaXNhYmxlZHx8ITEscmVtb3ZlRG9tOmsucmVtb3ZlRG9tfHwhMX07aWYobnVsbCE9Yilmb3IoY29uc3QgW2gsa11vZiBPYmplY3QuZW50cmllcyhiKSlpZigiYm9vbGVhbiIhPT10eXBlb2Ygayl7c3dpdGNoKGsubG9hZGluZ19tZWNoYW5pc20udHlwZSl7Y2FzZSAiTk9ORSI6bnVsbD09ZFtoXSYmY29uc29sZS53YXJuKCJQbHVnaW4gaGFzIG5vIGxvYWRpbmcgbWVjaGFuaXNtIGFuZCBubyBiYWtlZC1pbiByZWdpc3RyeSBlbnRyeTogJXMiLApoKTtjb250aW51ZTtjYXNlICJDVVNUT01fRUxFTUVOVCI6dmFyIGY9e3R5cGU6IkNVU1RPTV9FTEVNRU5UIixlbGVtZW50TmFtZTprLmxvYWRpbmdfbWVjaGFuaXNtLmVsZW1lbnRfbmFtZX07YnJlYWs7Y2FzZSAiSUZSQU1FIjpmPXt0eXBlOiJJRlJBTUUiLG1vZHVsZVBhdGg6ay5sb2FkaW5nX21lY2hhbmlzbS5tb2R1bGVfcGF0aH07YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlVua25vd24gbG9hZGluZyBtZWNoYW5pc20gZm9yIHBsdWdpbiAlczogJXMiLGgsay5sb2FkaW5nX21lY2hhbmlzbSk7Y29udGludWV9bnVsbD09ZiYmY29uc29sZS5lcnJvcigiSW52YXJpYW50IHZpb2xhdGlvbjogbG9hZGluZ01lY2hhbmlzbSBpcyAlcyBmb3IgJXMiLGYsaCk7ZFtoXT17cGx1Z2luOmgsbG9hZGluZ01lY2hhbmlzbTpmLHRhYk5hbWU6ay50YWJfbmFtZS50b1VwcGVyQ2FzZSgpLGRpc2FibGVSZWxvYWQ6ay5kaXNhYmxlX3JlbG9hZCxyZW1vdmVEb206ay5yZW1vdmVfZG9tfX1mPXt9Owpmb3IoY29uc3QgaCBvZiBPYmplY3Qua2V5cyhiKSlkW2hdJiYoZltoXT1kW2hdKTtPYmplY3QuYXNzaWduKGYsZCk7cmV0dXJuIGZ9LF9jb21wdXRlRGFzaGJvYXJkRGF0YShiKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyhiKX0sX2ZldGNoUGx1Z2luc0xpc3RpbmcoKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7Y29uc3QgYj10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZD0+e2QuY2FuY2VsbGVkfHwodGhpcy5fcGx1Z2luc0xpc3Rpbmc9ZC52YWx1ZSx0aGlzLl9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPXFmLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEKX0pO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHZjLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4oYiwoKT0+e3RoaXMuX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGU9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUQ/dGhpcy5fYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT0KcWYuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5GQUlMRUQ6Y29uc29sZS53YXJuKCJGYWlsZWQgdG8gcmVsb2FkIHRoZSBzZXQgb2YgYWN0aXZlIHBsdWdpbnM7IHVzaW5nIG9sZCB2YWx1ZS4iKX0pfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWQoYil7cmV0dXJuIGI9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0xvYWRlZChiKXtyZXR1cm4gYj09PXFmLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNGYWlsZWRUb0xvYWQoYil7cmV0dXJuIGI9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLkZBSUxFRH0sX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShiLGQsZil7cmV0dXJuIGImJjA9PT1kLmxlbmd0aCYmbnVsbD09Zn0sX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShiLGQsZil7cmV0dXJuIGImJiEhZiYmCm51bGw9PWRbZl19LF91cGRhdGVSb3V0ZXIoYil7dmMuc2V0Um91dGVyKGIpfSxfdXBkYXRlVGl0bGUoYil7YiYmdGhpcy5zZXQoImJyYW5kIixiKX0scmVsb2FkKCl7dGhpcy5faXNSZWxvYWREaXNhYmxlZHx8KHRoaXMuX3JlbG9hZERhdGEoKS50aGVuKCgpPT57Y29uc3QgYj10aGlzLl9zZWxlY3RlZERhc2hib2FyZENvbXBvbmVudCgpO2ImJmIucmVsb2FkJiZiLnJlbG9hZCgpfSksdGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpKX0sX3JlbG9hZERhdGEoKXt0aGlzLl9yZWZyZXNoaW5nPSEwO3JldHVybiBQcm9taXNlLmFsbChbdGhpcy5fZmV0Y2hQbHVnaW5zTGlzdGluZygpLHZjLmVudmlyb25tZW50U3RvcmUucmVmcmVzaCgpLHZjLnJ1bnNTdG9yZS5yZWZyZXNoKCksdmMuZXhwZXJpbWVudHNTdG9yZS5yZWZyZXNoKCldKS50aGVuKCgpPT57dGhpcy5fbGFzdFJlbG9hZFRpbWVTaG9ydD0obmV3IERhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAsCnttb250aDoibG9uZyIsZGF5OiJudW1lcmljIixob3VyOiJudW1lcmljIixtaW51dGU6Im51bWVyaWMiLHNlY29uZDoibnVtZXJpYyJ9KX0pLmZpbmFsbHkoKCk9Pnt0aGlzLl9yZWZyZXNoaW5nPSExfSl9LF9nZXREYXRhUmVmcmVzaGluZ0NsYXNzKCl7cmV0dXJuIHRoaXMuX3JlZnJlc2hpbmc/InJlZnJlc2hpbmciOiIifSxvcGVuU2V0dGluZ3MoKXt0aGlzLiQuc2V0dGluZ3Mub3BlbigpO3RoaXMuJC5wYWdpbmF0aW9uTGltaXRJbnB1dC52YWx1ZT1uZS5nZXRMaW1pdCgpfSxfcGFnaW5hdGlvbkxpbWl0VmFsaWRhdGUoYil7Yi50YXJnZXQudmFsaWRhdGUoKX0sX3BhZ2luYXRpb25MaW1pdENoYW5nZWQoYil7Yj1OdW1iZXIucGFyc2VJbnQoYi50YXJnZXQudmFsdWUsMTApO2I9PT0rYiYmMDxiJiZuZS5zZXRMaW1pdChiKX19KTsK", + "ok": true, + "headers": [ + [ + "content-type", + "application/javascript; charset=utf-8" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/runs": { + "data": "WyJ2ZXJzaW9uXzAiLCAidmVyc2lvbl8xIl0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/environment": { + "data": "eyJkYXRhX2xvY2F0aW9uIjogImxpZ2h0bmluZ19sb2dzLyIsICJ3aW5kb3dfdGl0bGUiOiAiIn0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugins_listing": { + "data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJDdXN0b20gU2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJpbWFnZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJpbWFnZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWltYWdlLWRhc2hib2FyZCJ9fSwgImF1ZGlvIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiYXVkaW8iLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWF1ZGlvLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZGVidWdnZXIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRlYnVnZ2VyLWRhc2hib2FyZCJ9fSwgImdyYXBocyI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZ3JhcGhzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1ncmFwaC1kYXNoYm9hcmQifX0sICJkaXN0cmlidXRpb25zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZGlzdHJpYnV0aW9ucyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCJ9fSwgImhpc3RvZ3JhbXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJoaXN0b2dyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIn19LCAidGV4dCI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInRleHQiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXRleHQtZGFzaGJvYXJkIn19LCAicHJfY3VydmVzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUFIgQ3VydmVzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQifX0sICJwcm9maWxlX3JlZGlyZWN0IjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUHJvZmlsZSIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQifX0sICJiZWhvbGRlciI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiB0cnVlLCAidGFiX25hbWUiOiAiYmVob2xkZXIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWJlaG9sZGVyLWRhc2hib2FyZCJ9fSwgImhwYXJhbXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogdHJ1ZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImhwYXJhbXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWhwYXJhbXMtZGFzaGJvYXJkIn19LCAibWVzaCI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogIm1lc2giLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogIm1lc2gtZGFzaGJvYXJkIn19LCAicHJvamVjdG9yIjogeyJkaXNhYmxlX3JlbG9hZCI6IHRydWUsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJwcm9qZWN0b3IiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiSUZSQU1FIiwgIm1vZHVsZV9wYXRoIjogIi9kYXRhL3BsdWdpbi9wcm9qZWN0b3IvaW5kZXguanMifX0sICJ3aGF0aWYiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJXaGF0LUlmIFRvb2wiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiSUZSQU1FIiwgIm1vZHVsZV9wYXRoIjogIi9kYXRhL3BsdWdpbi93aGF0aWYvaW5kZXguanMifX19", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/experiments": { + "data": "W10=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/tags": { + "data": "eyJ2ZXJzaW9uXzAiOiB7InRyYWluX2xvc3MiOiB7ImRpc3BsYXlOYW1lIjogInRyYWluX2xvc3MiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJlcG9jaCI6IHsiZGlzcGxheU5hbWUiOiAiZXBvY2giLCAiZGVzY3JpcHRpb24iOiAiIn0sICJ2YWxfbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAidmFsX2xvc3MiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJBY2N1cmFjeSI6IHsiZGlzcGxheU5hbWUiOiAiQWNjdXJhY3kiLCAiZGVzY3JpcHRpb24iOiAiIn19LCAidmVyc2lvbl8xIjogeyJ0cmFpbl9sb3NzIjogeyJkaXNwbGF5TmFtZSI6ICJ0cmFpbl9sb3NzIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAiZXBvY2giOiB7ImRpc3BsYXlOYW1lIjogImVwb2NoIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidmFsX2xvc3MiOiB7ImRpc3BsYXlOYW1lIjogInZhbF9sb3NzIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAiQWNjdXJhY3kiOiB7ImRpc3BsYXlOYW1lIjogIkFjY3VyYWN5IiwgImRlc2NyaXB0aW9uIjogIiJ9LCAibG9zcyI6IHsiZGlzcGxheU5hbWUiOiAibG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifX19", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy&run=version_1": { + "data": "W1sxNTkwOTU2ODIzLjk1MDE1NCwgNDI5LCAwLjk2NjAwMDAyMDUwMzk5NzhdLCBbMTU5MDk1NjgyMy45NTc3NDE1LCA0MzAsIDAuODIxNDkwODgzODI3MjA5NV0sIFsxNTkwOTU2ODQwLjY2NDk3MjMsIDg1OSwgMC45Nzk3OTk5ODU4ODU2MjAxXSwgWzE1OTA5NTY4NDAuNjc2NjIyNiwgODYwLCAwLjk0NjQzNjM0NTU3NzI0XSwgWzE1OTA5NTY4NTcuMTA3NzI1LCAxMjg5LCAwLjk4NDYwMDAwNzUzNDAyNzFdLCBbMTU5MDk1Njg1Ny4xMTcwOTcsIDEyOTAsIDAuOTU5ODU0NTQzMjA5MDc1OV0sIFsxNTkwOTU2ODczLjQwMzM0NDQsIDE3MTksIDAuOTg2MDAwMDAxNDMwNTExNV0sIFsxNTkwOTU2ODczLjQxMjI5NTgsIDE3MjAsIDAuOTY3MDM2MzY2NDYyNzA3NV0sIFsxNTkwOTU2ODkwLjAyNDc4MywgMjE0OSwgMC45ODg3OTk5ODkyMjM0ODAyXSwgWzE1OTA5NTY4OTAuMDM0MTAwMywgMjE1MCwgMC45NzAyNTQ1NDA0NDM0MjA0XSwgWzE1OTA5NTY5MDYuMjczNDUxMywgMjU3OSwgMC45ODk0MDAwMjkxODI0MzQxXSwgWzE1OTA5NTY5MDYuMjkyNTYwMywgMjU4MCwgMC45NzI1NjM2MjQzODIwMTldLCBbMTU5MDk1NjkyMi42MjAxMjc3LCAzMDA5LCAwLjk5MDU5OTk4OTg5MTA1MjJdLCBbMTU5MDk1NjkyMi42Mzg4MDU5LCAzMDEwLCAwLjk3NDg3MjcwODMyMDYxNzddLCBbMTU5MDk1NjkzOS4yODc0NTYzLCAzNDM5LCAwLjk5MTk5OTk4Mzc4NzUzNjZdLCBbMTU5MDk1NjkzOS4yOTYyMjI0LCAzNDQwLCAwLjk3NzE0NTQzMzQyNTkwMzNdLCBbMTU5MDk1Njk1NS41NTM2OTUsIDM4NjksIDAuOTkxMTk5OTcwMjQ1MzYxM10sIFsxNTkwOTU2OTU1LjU2Mjg3MSwgMzg3MCwgMC45NzczNjM2NDYwMzA0MjZdLCBbMTU5MDk1Njk3MS43NzYxNTg4LCA0Mjk5LCAwLjk5MjIwMDAxNjk3NTQwMjhdLCBbMTU5MDk1Njk3MS43OTYyNzM1LCA0MzAwLCAwLjk3OTYwMDAxMjMwMjM5ODddXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy&run=version_0": { + "data": "W1sxNTkwOTU2Njk3LjY5ODUxMzUsIDQyOSwgMC45NTQ1OTk5NzY1Mzk2MTE4XV0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=epoch&run=version_1": { + "data": "W1sxNTkwOTU2ODA4LjY5MTAyOTgsIDAsIDAuMF0sIFsxNTkwOTU2ODA5LjA1MzE2NzMsIDEwLCAwLjBdLCBbMTU5MDk1NjgwOS4zNjA4NDI1LCAyMCwgMC4wXSwgWzE1OTA5NTY4MDkuNjgwOTU3LCAzMCwgMC4wXSwgWzE1OTA5NTY4MDkuOTg0MDQxNywgNDAsIDAuMF0sIFsxNTkwOTU2ODEwLjI3ODIzMTQsIDUwLCAwLjBdLCBbMTU5MDk1NjgxMC41OTAwNTcsIDYwLCAwLjBdLCBbMTU5MDk1NjgxMC44ODQ3NTgsIDcwLCAwLjBdLCBbMTU5MDk1NjgxMS4xOTI1MzU2LCA4MCwgMC4wXSwgWzE1OTA5NTY4MTEuNDg4NjU2LCA5MCwgMC4wXSwgWzE1OTA5NTY4MTEuNzg5ODQ3NiwgMTAwLCAwLjBdLCBbMTU5MDk1NjgxMi4xMDE3NDMyLCAxMTAsIDAuMF0sIFsxNTkwOTU2ODEyLjQwNTYwOTEsIDEyMCwgMC4wXSwgWzE1OTA5NTY4MTIuNjkxNDQyNywgMTMwLCAwLjBdLCBbMTU5MDk1NjgxMy4wMDEzNSwgMTQwLCAwLjBdLCBbMTU5MDk1NjgxMy4zMjcyMzEsIDE1MCwgMC4wXSwgWzE1OTA5NTY4MTMuNjM0OTA4LCAxNjAsIDAuMF0sIFsxNTkwOTU2ODEzLjk1MDMyNTcsIDE3MCwgMC4wXSwgWzE1OTA5NTY4MTQuMjkyNTA5NiwgMTgwLCAwLjBdLCBbMTU5MDk1NjgxNC41ODU3MDMsIDE5MCwgMC4wXSwgWzE1OTA5NTY4MTQuODg0MzY1NiwgMjAwLCAwLjBdLCBbMTU5MDk1NjgxNS4yMDAyNCwgMjEwLCAwLjBdLCBbMTU5MDk1NjgxNS40OTkzMTk4LCAyMjAsIDAuMF0sIFsxNTkwOTU2ODE1Ljc5MzI5NzgsIDIzMCwgMC4wXSwgWzE1OTA5NTY4MTYuMDk1ODQ5NSwgMjQwLCAwLjBdLCBbMTU5MDk1NjgxNi4zOTQ1OTUsIDI1MCwgMC4wXSwgWzE1OTA5NTY4MTYuNjk2MzM5LCAyNjAsIDAuMF0sIFsxNTkwOTU2ODE3LjAxNjY5MDMsIDI3MCwgMC4wXSwgWzE1OTA5NTY4MTcuMzQzOTM0LCAyODAsIDAuMF0sIFsxNTkwOTU2ODE3LjY0MzA2OSwgMjkwLCAwLjBdLCBbMTU5MDk1NjgxNy45NDQ3NjIyLCAzMDAsIDAuMF0sIFsxNTkwOTU2ODE4LjI0OTk2NjksIDMxMCwgMC4wXSwgWzE1OTA5NTY4MTguNTUzMDI4MywgMzIwLCAwLjBdLCBbMTU5MDk1NjgxOC44NDc5MjczLCAzMzAsIDAuMF0sIFsxNTkwOTU2ODE5LjE2Njc0NDIsIDM0MCwgMC4wXSwgWzE1OTA5NTY4MTkuNDYwNTk5NywgMzUwLCAwLjBdLCBbMTU5MDk1NjgxOS43NTM4ODc0LCAzNjAsIDAuMF0sIFsxNTkwOTU2ODIwLjAyNDE3MDYsIDM3MCwgMC4wXSwgWzE1OTA5NTY4MjAuMjY3NTczOCwgMzgwLCAwLjBdLCBbMTU5MDk1NjgyMC41MDE1NDE0LCAzOTAsIDAuMF0sIFsxNTkwOTU2ODIwLjcyNzc3NDEsIDQwMCwgMC4wXSwgWzE1OTA5NTY4MjAuOTQ3Nzk3LCA0MTAsIDAuMF0sIFsxNTkwOTU2ODIxLjE3MTY4LCA0MjAsIDAuMF0sIFsxNTkwOTU2ODIzLjk1MDIwNTMsIDQyOSwgMC4wXSwgWzE1OTA5NTY4MjMuOTU3ODA2NiwgNDMwLCAwLjBdLCBbMTU5MDk1NjgyNS41MjE0NDMsIDQzMCwgMS4wXSwgWzE1OTA5NTY4MjUuOTQ5NzQyMywgNDQwLCAxLjBdLCBbMTU5MDk1NjgyNi4yMzY1NDIyLCA0NTAsIDEuMF0sIFsxNTkwOTU2ODI2LjU2NTE5ODQsIDQ2MCwgMS4wXSwgWzE1OTA5NTY4MjYuODUzMzUzNSwgNDcwLCAxLjBdLCBbMTU5MDk1NjgyNy4xMjI2MDk5LCA0ODAsIDEuMF0sIFsxNTkwOTU2ODI3LjQyNjE5LCA0OTAsIDEuMF0sIFsxNTkwOTU2ODI3LjcyNzQ3NiwgNTAwLCAxLjBdLCBbMTU5MDk1NjgyOC4wMzAyNzIyLCA1MTAsIDEuMF0sIFsxNTkwOTU2ODI4LjMxNDI2ODQsIDUyMCwgMS4wXSwgWzE1OTA5NTY4MjguNjE4NzE1LCA1MzAsIDEuMF0sIFsxNTkwOTU2ODI4LjkyMjE2NCwgNTQwLCAxLjBdLCBbMTU5MDk1NjgyOS4yNDQyMjQ4LCA1NTAsIDEuMF0sIFsxNTkwOTU2ODI5LjU1NjIyMjQsIDU2MCwgMS4wXSwgWzE1OTA5NTY4MjkuODcxMDMxOCwgNTcwLCAxLjBdLCBbMTU5MDk1NjgzMC4xNjUxMTgsIDU4MCwgMS4wXSwgWzE1OTA5NTY4MzAuNDcwNDU2MSwgNTkwLCAxLjBdLCBbMTU5MDk1NjgzMC43NzIwMTQsIDYwMCwgMS4wXSwgWzE1OTA5NTY4MzEuMDYzNTE0LCA2MTAsIDEuMF0sIFsxNTkwOTU2ODMxLjM1Njg5MTQsIDYyMCwgMS4wXSwgWzE1OTA5NTY4MzEuNjUxNDk1NSwgNjMwLCAxLjBdLCBbMTU5MDk1NjgzMS45NTQ3MzE1LCA2NDAsIDEuMF0sIFsxNTkwOTU2ODMyLjI1MzgyNzMsIDY1MCwgMS4wXSwgWzE1OTA5NTY4MzIuNTUzNjI3NywgNjYwLCAxLjBdLCBbMTU5MDk1NjgzMi44NTkxOTY0LCA2NzAsIDEuMF0sIFsxNTkwOTU2ODMzLjE1ODA3NSwgNjgwLCAxLjBdLCBbMTU5MDk1NjgzMy40NjcwNCwgNjkwLCAxLjBdLCBbMTU5MDk1NjgzMy43ODIzMzYyLCA3MDAsIDEuMF0sIFsxNTkwOTU2ODM0LjA3NzgzNDYsIDcxMCwgMS4wXSwgWzE1OTA5NTY4MzQuMzYzODUyNSwgNzIwLCAxLjBdLCBbMTU5MDk1NjgzNC42NjM4MzQ4LCA3MzAsIDEuMF0sIFsxNTkwOTU2ODM0Ljk2OTg3MDMsIDc0MCwgMS4wXSwgWzE1OTA5NTY4MzUuMjU3MzY4OCwgNzUwLCAxLjBdLCBbMTU5MDk1NjgzNS41NjIxNTcsIDc2MCwgMS4wXSwgWzE1OTA5NTY4MzUuODc4NDQ2NiwgNzcwLCAxLjBdLCBbMTU5MDk1NjgzNi4xNzkyMDgsIDc4MCwgMS4wXSwgWzE1OTA5NTY4MzYuNDcwMjQ2NiwgNzkwLCAxLjBdLCBbMTU5MDk1NjgzNi43MjgyMDA0LCA4MDAsIDEuMF0sIFsxNTkwOTU2ODM2Ljk2MjQwNTcsIDgxMCwgMS4wXSwgWzE1OTA5NTY4MzcuMTg5MjQ0NSwgODIwLCAxLjBdLCBbMTU5MDk1NjgzNy40MTU3MTQsIDgzMCwgMS4wXSwgWzE1OTA5NTY4MzcuNjQxNTU4LCA4NDAsIDEuMF0sIFsxNTkwOTU2ODM3Ljg2NTAxMjIsIDg1MCwgMS4wXSwgWzE1OTA5NTY4NDAuNjY1MDY0MywgODU5LCAxLjBdLCBbMTU5MDk1Njg0MC42NzY2OTY1LCA4NjAsIDEuMF0sIFsxNTkwOTU2ODQyLjMxMTg1MzIsIDg2MCwgMi4wXSwgWzE1OTA5NTY4NDIuNjU0MjUyNSwgODcwLCAyLjBdLCBbMTU5MDk1Njg0Mi45NDM0ODU3LCA4ODAsIDIuMF0sIFsxNTkwOTU2ODQzLjI2MjYzMzYsIDg5MCwgMi4wXSwgWzE1OTA5NTY4NDMuNTM5NDI2MywgOTAwLCAyLjBdLCBbMTU5MDk1Njg0My44MjEyNzk1LCA5MTAsIDIuMF0sIFsxNTkwOTU2ODQ0LjEzNTEzNSwgOTIwLCAyLjBdLCBbMTU5MDk1Njg0NC40MTI0MzQzLCA5MzAsIDIuMF0sIFsxNTkwOTU2ODQ0LjcxOTU1MDEsIDk0MCwgMi4wXSwgWzE1OTA5NTY4NDUuMDIxNTEyNywgOTUwLCAyLjBdLCBbMTU5MDk1Njg0NS4zMTQzNTU0LCA5NjAsIDIuMF0sIFsxNTkwOTU2ODQ1LjYwODUyOTgsIDk3MCwgMi4wXSwgWzE1OTA5NTY4NDUuOTA4ODgxMiwgOTgwLCAyLjBdLCBbMTU5MDk1Njg0Ni4xOTEyMzk0LCA5OTAsIDIuMF0sIFsxNTkwOTU2ODQ2LjUwNjY4NTMsIDEwMDAsIDIuMF0sIFsxNTkwOTU2ODQ2Ljc5NDgwOTMsIDEwMTAsIDIuMF0sIFsxNTkwOTU2ODQ3LjA4NzAxMDYsIDEwMjAsIDIuMF0sIFsxNTkwOTU2ODQ3LjM5MDkwNTYsIDEwMzAsIDIuMF0sIFsxNTkwOTU2ODQ3LjY4MDU4MywgMTA0MCwgMi4wXSwgWzE1OTA5NTY4NDcuOTc0Njk1NCwgMTA1MCwgMi4wXSwgWzE1OTA5NTY4NDguMjgyMTU1MywgMTA2MCwgMi4wXSwgWzE1OTA5NTY4NDguNTcyODU0OCwgMTA3MCwgMi4wXSwgWzE1OTA5NTY4NDguODU4ODg3NCwgMTA4MCwgMi4wXSwgWzE1OTA5NTY4NDkuMTUyNTIxNiwgMTA5MCwgMi4wXSwgWzE1OTA5NTY4NDkuNDU3NzAzNiwgMTEwMCwgMi4wXSwgWzE1OTA5NTY4NDkuNzQ0MzY1MiwgMTExMCwgMi4wXSwgWzE1OTA5NTY4NTAuMDQ0MDg4LCAxMTIwLCAyLjBdLCBbMTU5MDk1Njg1MC4zNDg3OTE4LCAxMTMwLCAyLjBdLCBbMTU5MDk1Njg1MC42NDI0Mjg2LCAxMTQwLCAyLjBdLCBbMTU5MDk1Njg1MC45NDc3MzMsIDExNTAsIDIuMF0sIFsxNTkwOTU2ODUxLjIzOTU3NTksIDExNjAsIDIuMF0sIFsxNTkwOTU2ODUxLjUzMjcyOCwgMTE3MCwgMi4wXSwgWzE1OTA5NTY4NTEuODExNjk0OSwgMTE4MCwgMi4wXSwgWzE1OTA5NTY4NTIuMTA5NTI1MiwgMTE5MCwgMi4wXSwgWzE1OTA5NTY4NTIuNDA5MTc1NCwgMTIwMCwgMi4wXSwgWzE1OTA5NTY4NTIuNzA3NTc3NywgMTIxMCwgMi4wXSwgWzE1OTA5NTY4NTMuMDA5Mjc4LCAxMjIwLCAyLjBdLCBbMTU5MDk1Njg1My4yNTA4MzAyLCAxMjMwLCAyLjBdLCBbMTU5MDk1Njg1My40NzE3OTcsIDEyNDAsIDIuMF0sIFsxNTkwOTU2ODUzLjY3NTgxNSwgMTI1MCwgMi4wXSwgWzE1OTA5NTY4NTMuOTAyMDc0MywgMTI2MCwgMi4wXSwgWzE1OTA5NTY4NTQuMTI1ODY0NywgMTI3MCwgMi4wXSwgWzE1OTA5NTY4NTQuMzQ5MTIyOCwgMTI4MCwgMi4wXSwgWzE1OTA5NTY4NTcuMTA3NzY5NSwgMTI4OSwgMi4wXSwgWzE1OTA5NTY4NTcuMTE3MTU3NSwgMTI5MCwgMi4wXSwgWzE1OTA5NTY4NTguNjg2MjI2LCAxMjkwLCAzLjBdLCBbMTU5MDk1Njg1OS4xMDYzNDA2LCAxMzAwLCAzLjBdLCBbMTU5MDk1Njg1OS4zNzY2OTA5LCAxMzEwLCAzLjBdLCBbMTU5MDk1Njg1OS42ODM2MTkzLCAxMzIwLCAzLjBdLCBbMTU5MDk1Njg1OS45NjU3MTM1LCAxMzMwLCAzLjBdLCBbMTU5MDk1Njg2MC4yNDY2MTQyLCAxMzQwLCAzLjBdLCBbMTU5MDk1Njg2MC41NDk0MTIsIDEzNTAsIDMuMF0sIFsxNTkwOTU2ODYwLjgyNTg5NjMsIDEzNjAsIDMuMF0sIFsxNTkwOTU2ODYxLjEzMDUyNDksIDEzNzAsIDMuMF0sIFsxNTkwOTU2ODYxLjQxOTY0MDMsIDEzODAsIDMuMF0sIFsxNTkwOTU2ODYxLjcyMjE2OSwgMTM5MCwgMy4wXSwgWzE1OTA5NTY4NjIuMDEyMTE0MywgMTQwMCwgMy4wXSwgWzE1OTA5NTY4NjIuMzA3MzMyNSwgMTQxMCwgMy4wXSwgWzE1OTA5NTY4NjIuNTk2MTQ4NywgMTQyMCwgMy4wXSwgWzE1OTA5NTY4NjIuODkwNjU4MSwgMTQzMCwgMy4wXSwgWzE1OTA5NTY4NjMuMTc0MjMwMywgMTQ0MCwgMy4wXSwgWzE1OTA5NTY4NjMuNDU4NzAxMSwgMTQ1MCwgMy4wXSwgWzE1OTA5NTY4NjMuNzU2NDA1NCwgMTQ2MCwgMy4wXSwgWzE1OTA5NTY4NjQuMDUxMDk2LCAxNDcwLCAzLjBdLCBbMTU5MDk1Njg2NC4zMzg4MDQ1LCAxNDgwLCAzLjBdLCBbMTU5MDk1Njg2NC42MzMyNDQ4LCAxNDkwLCAzLjBdLCBbMTU5MDk1Njg2NC45MTI1OTc3LCAxNTAwLCAzLjBdLCBbMTU5MDk1Njg2NS4xOTI1NDc4LCAxNTEwLCAzLjBdLCBbMTU5MDk1Njg2NS40ODIzMTQ4LCAxNTIwLCAzLjBdLCBbMTU5MDk1Njg2NS43Njc1NjI0LCAxNTMwLCAzLjBdLCBbMTU5MDk1Njg2Ni4wNTg5MTUxLCAxNTQwLCAzLjBdLCBbMTU5MDk1Njg2Ni4zNTI3NjQ4LCAxNTUwLCAzLjBdLCBbMTU5MDk1Njg2Ni42Mjc4OTQ5LCAxNTYwLCAzLjBdLCBbMTU5MDk1Njg2Ni45MjI3NDE0LCAxNTcwLCAzLjBdLCBbMTU5MDk1Njg2Ny4yMjI4NDIyLCAxNTgwLCAzLjBdLCBbMTU5MDk1Njg2Ny41MTI4MjM4LCAxNTkwLCAzLjBdLCBbMTU5MDk1Njg2Ny44MTE1NjYsIDE2MDAsIDMuMF0sIFsxNTkwOTU2ODY4LjA5NTQyMDEsIDE2MTAsIDMuMF0sIFsxNTkwOTU2ODY4LjQwNDA3NCwgMTYyMCwgMy4wXSwgWzE1OTA5NTY4NjguNjk5MzMzNCwgMTYzMCwgMy4wXSwgWzE1OTA5NTY4NjguOTgxMjgxNSwgMTY0MCwgMy4wXSwgWzE1OTA5NTY4NjkuMjY1ODQ5NCwgMTY1MCwgMy4wXSwgWzE1OTA5NTY4NjkuNTIwMDIyLCAxNjYwLCAzLjBdLCBbMTU5MDk1Njg2OS43NTQ3OTUzLCAxNjcwLCAzLjBdLCBbMTU5MDk1Njg2OS45NzM5MzcsIDE2ODAsIDMuMF0sIFsxNTkwOTU2ODcwLjE4NTE1MywgMTY5MCwgMy4wXSwgWzE1OTA5NTY4NzAuNDA1ODQxLCAxNzAwLCAzLjBdLCBbMTU5MDk1Njg3MC42MjIyNDg0LCAxNzEwLCAzLjBdLCBbMTU5MDk1Njg3My40MDM0MDQ3LCAxNzE5LCAzLjBdLCBbMTU5MDk1Njg3My40MTIzNjgzLCAxNzIwLCAzLjBdLCBbMTU5MDk1Njg3NC45OTQyMDI2LCAxNzIwLCA0LjBdLCBbMTU5MDk1Njg3NS4zODM1MzEsIDE3MzAsIDQuMF0sIFsxNTkwOTU2ODc1LjY3NTc1MzgsIDE3NDAsIDQuMF0sIFsxNTkwOTU2ODc2LjAwODkwMzMsIDE3NTAsIDQuMF0sIFsxNTkwOTU2ODc2LjI5MjY2ODMsIDE3NjAsIDQuMF0sIFsxNTkwOTU2ODc2LjU4MTY2NDYsIDE3NzAsIDQuMF0sIFsxNTkwOTU2ODc2Ljg3NDAyMDMsIDE3ODAsIDQuMF0sIFsxNTkwOTU2ODc3LjE4NTc5MDMsIDE3OTAsIDQuMF0sIFsxNTkwOTU2ODc3LjQ4NzcxOCwgMTgwMCwgNC4wXSwgWzE1OTA5NTY4NzcuNzc3NzMyMSwgMTgxMCwgNC4wXSwgWzE1OTA5NTY4NzguMDkwMzY5NSwgMTgyMCwgNC4wXSwgWzE1OTA5NTY4NzguMzg0ODYxMiwgMTgzMCwgNC4wXSwgWzE1OTA5NTY4NzguNjgxNTg2NywgMTg0MCwgNC4wXSwgWzE1OTA5NTY4NzguOTg5NzAyMiwgMTg1MCwgNC4wXSwgWzE1OTA5NTY4NzkuMjkyMDQ1NCwgMTg2MCwgNC4wXSwgWzE1OTA5NTY4NzkuNTg4OTc2NiwgMTg3MCwgNC4wXSwgWzE1OTA5NTY4NzkuODkyMTQ1NCwgMTg4MCwgNC4wXSwgWzE1OTA5NTY4ODAuMTk0NjU0NywgMTg5MCwgNC4wXSwgWzE1OTA5NTY4ODAuNDg4MzYzNywgMTkwMCwgNC4wXSwgWzE1OTA5NTY4ODAuNzc1NzY0NSwgMTkxMCwgNC4wXSwgWzE1OTA5NTY4ODEuMDg0MzYzNywgMTkyMCwgNC4wXSwgWzE1OTA5NTY4ODEuMzc1OTQ1OCwgMTkzMCwgNC4wXSwgWzE1OTA5NTY4ODEuNjg0MzA4OCwgMTk0MCwgNC4wXSwgWzE1OTA5NTY4ODEuOTgxMDI1NywgMTk1MCwgNC4wXSwgWzE1OTA5NTY4ODIuMjc1ODE5LCAxOTYwLCA0LjBdLCBbMTU5MDk1Njg4Mi41NzQyNTEsIDE5NzAsIDQuMF0sIFsxNTkwOTU2ODgyLjg2MTU0OSwgMTk4MCwgNC4wXSwgWzE1OTA5NTY4ODMuMTYwMTc3NywgMTk5MCwgNC4wXSwgWzE1OTA5NTY4ODMuNDUwODA2LCAyMDAwLCA0LjBdLCBbMTU5MDk1Njg4My43NDcwNjk2LCAyMDEwLCA0LjBdLCBbMTU5MDk1Njg4NC4wNDA2MSwgMjAyMCwgNC4wXSwgWzE1OTA5NTY4ODQuMzQyMjAyLCAyMDMwLCA0LjBdLCBbMTU5MDk1Njg4NC42Mzg1MiwgMjA0MCwgNC4wXSwgWzE1OTA5NTY4ODQuOTM1MjU0NiwgMjA1MCwgNC4wXSwgWzE1OTA5NTY4ODUuMjQ1Mzg4MywgMjA2MCwgNC4wXSwgWzE1OTA5NTY4ODUuNTQ3MDYyMiwgMjA3MCwgNC4wXSwgWzE1OTA5NTY4ODUuODYyMjQzNCwgMjA4MCwgNC4wXSwgWzE1OTA5NTY4ODYuMTExODk5OSwgMjA5MCwgNC4wXSwgWzE1OTA5NTY4ODYuMzUzMTcsIDIxMDAsIDQuMF0sIFsxNTkwOTU2ODg2LjU2NDUxMDgsIDIxMTAsIDQuMF0sIFsxNTkwOTU2ODg2Ljc4MTIwOTIsIDIxMjAsIDQuMF0sIFsxNTkwOTU2ODg3LjAwMTQ2MDgsIDIxMzAsIDQuMF0sIFsxNTkwOTU2ODg3LjIyMzQ5NzQsIDIxNDAsIDQuMF0sIFsxNTkwOTU2ODkwLjAyNDgyODcsIDIxNDksIDQuMF0sIFsxNTkwOTU2ODkwLjAzNDE5NjQsIDIxNTAsIDQuMF0sIFsxNTkwOTU2ODkxLjY2NjE1NDQsIDIxNTAsIDUuMF0sIFsxNTkwOTU2ODkyLjAzMjE4NDgsIDIxNjAsIDUuMF0sIFsxNTkwOTU2ODkyLjMzNTcyMTUsIDIxNzAsIDUuMF0sIFsxNTkwOTU2ODkyLjY1MTgzNjYsIDIxODAsIDUuMF0sIFsxNTkwOTU2ODkyLjkzNjk0NDcsIDIxOTAsIDUuMF0sIFsxNTkwOTU2ODkzLjE5OTA5OTUsIDIyMDAsIDUuMF0sIFsxNTkwOTU2ODkzLjQ4ODI2ODEsIDIyMTAsIDUuMF0sIFsxNTkwOTU2ODkzLjc2OTU2MDMsIDIyMjAsIDUuMF0sIFsxNTkwOTU2ODk0LjA2MDIzOTMsIDIyMzAsIDUuMF0sIFsxNTkwOTU2ODk0LjMzNzAyOTIsIDIyNDAsIDUuMF0sIFsxNTkwOTU2ODk0LjYzNjcyMSwgMjI1MCwgNS4wXSwgWzE1OTA5NTY4OTQuOTIwNTEzNCwgMjI2MCwgNS4wXSwgWzE1OTA5NTY4OTUuMjEzODIyMSwgMjI3MCwgNS4wXSwgWzE1OTA5NTY4OTUuNDk1NjY1LCAyMjgwLCA1LjBdLCBbMTU5MDk1Njg5NS43ODY4NTU3LCAyMjkwLCA1LjBdLCBbMTU5MDk1Njg5Ni4wNzkyMTQsIDIzMDAsIDUuMF0sIFsxNTkwOTU2ODk2LjM2MTU4NTQsIDIzMTAsIDUuMF0sIFsxNTkwOTU2ODk2LjY0NTYxMDgsIDIzMjAsIDUuMF0sIFsxNTkwOTU2ODk2LjkzMjgxMTcsIDIzMzAsIDUuMF0sIFsxNTkwOTU2ODk3LjIxNDg2NiwgMjM0MCwgNS4wXSwgWzE1OTA5NTY4OTcuNDkzMzc5LCAyMzUwLCA1LjBdLCBbMTU5MDk1Njg5Ny43NzgxNDIyLCAyMzYwLCA1LjBdLCBbMTU5MDk1Njg5OC4wODAyOTQ4LCAyMzcwLCA1LjBdLCBbMTU5MDk1Njg5OC4zODMwODQ4LCAyMzgwLCA1LjBdLCBbMTU5MDk1Njg5OC42NzExNjUyLCAyMzkwLCA1LjBdLCBbMTU5MDk1Njg5OC45NTQ3MTI5LCAyNDAwLCA1LjBdLCBbMTU5MDk1Njg5OS4yNDk2MTI2LCAyNDEwLCA1LjBdLCBbMTU5MDk1Njg5OS41NTE1MjQ0LCAyNDIwLCA1LjBdLCBbMTU5MDk1Njg5OS44MzgxOTQsIDI0MzAsIDUuMF0sIFsxNTkwOTU2OTAwLjEzNjYzLCAyNDQwLCA1LjBdLCBbMTU5MDk1NjkwMC40MTgxNjU3LCAyNDUwLCA1LjBdLCBbMTU5MDk1NjkwMC43MDE5NDcyLCAyNDYwLCA1LjBdLCBbMTU5MDk1NjkwMS4wMDg1NCwgMjQ3MCwgNS4wXSwgWzE1OTA5NTY5MDEuMjkxOTM4OCwgMjQ4MCwgNS4wXSwgWzE1OTA5NTY5MDEuNTg0NTgxOSwgMjQ5MCwgNS4wXSwgWzE1OTA5NTY5MDEuODY1OTY5LCAyNTAwLCA1LjBdLCBbMTU5MDk1NjkwMi4xNjQwOTQsIDI1MTAsIDUuMF0sIFsxNTkwOTU2OTAyLjQwMDU2ODIsIDI1MjAsIDUuMF0sIFsxNTkwOTU2OTAyLjYyNzE5NywgMjUzMCwgNS4wXSwgWzE1OTA5NTY5MDIuODM3Mjc4LCAyNTQwLCA1LjBdLCBbMTU5MDk1NjkwMy4wNjM2MTY4LCAyNTUwLCA1LjBdLCBbMTU5MDk1NjkwMy4yNzI2MDQ3LCAyNTYwLCA1LjBdLCBbMTU5MDk1NjkwMy40ODY3ODkyLCAyNTcwLCA1LjBdLCBbMTU5MDk1NjkwNi4yNzM0OTU0LCAyNTc5LCA1LjBdLCBbMTU5MDk1NjkwNi4yOTI2MTE0LCAyNTgwLCA1LjBdLCBbMTU5MDk1NjkwNy45NTE3MzIsIDI1ODAsIDYuMF0sIFsxNTkwOTU2OTA4LjI3NTg4MjIsIDI1OTAsIDYuMF0sIFsxNTkwOTU2OTA4LjU1NjkxMzksIDI2MDAsIDYuMF0sIFsxNTkwOTU2OTA4Ljg5ODc3NTgsIDI2MTAsIDYuMF0sIFsxNTkwOTU2OTA5LjE4MzQ2NjcsIDI2MjAsIDYuMF0sIFsxNTkwOTU2OTA5LjQ1MzQ5NTMsIDI2MzAsIDYuMF0sIFsxNTkwOTU2OTA5LjczMTEwNDQsIDI2NDAsIDYuMF0sIFsxNTkwOTU2OTEwLjAzNDY0NDgsIDI2NTAsIDYuMF0sIFsxNTkwOTU2OTEwLjMzMjEwMDQsIDI2NjAsIDYuMF0sIFsxNTkwOTU2OTEwLjYxNDg2NywgMjY3MCwgNi4wXSwgWzE1OTA5NTY5MTAuOTExODU1MiwgMjY4MCwgNi4wXSwgWzE1OTA5NTY5MTEuMjE5MTQxLCAyNjkwLCA2LjBdLCBbMTU5MDk1NjkxMS41MTE1NTQ3LCAyNzAwLCA2LjBdLCBbMTU5MDk1NjkxMS44MDExMjAzLCAyNzEwLCA2LjBdLCBbMTU5MDk1NjkxMi4xMjE5MDQ5LCAyNzIwLCA2LjBdLCBbMTU5MDk1NjkxMi40MjQzMzE3LCAyNzMwLCA2LjBdLCBbMTU5MDk1NjkxMi43MTg3NTMzLCAyNzQwLCA2LjBdLCBbMTU5MDk1NjkxMy4wMDQyNDQ2LCAyNzUwLCA2LjBdLCBbMTU5MDk1NjkxMy4yOTQwNzI5LCAyNzYwLCA2LjBdLCBbMTU5MDk1NjkxMy41NzgyNCwgMjc3MCwgNi4wXSwgWzE1OTA5NTY5MTMuODY4MDc2NiwgMjc4MCwgNi4wXSwgWzE1OTA5NTY5MTQuMTY1MTg1MiwgMjc5MCwgNi4wXSwgWzE1OTA5NTY5MTQuNDQ3ODI1NywgMjgwMCwgNi4wXSwgWzE1OTA5NTY5MTQuNzMxNTEzNSwgMjgxMCwgNi4wXSwgWzE1OTA5NTY5MTUuMDI2NDI2NiwgMjgyMCwgNi4wXSwgWzE1OTA5NTY5MTUuMzE3MjA0LCAyODMwLCA2LjBdLCBbMTU5MDk1NjkxNS41OTM2MDk4LCAyODQwLCA2LjBdLCBbMTU5MDk1NjkxNS44NzU3OTgsIDI4NTAsIDYuMF0sIFsxNTkwOTU2OTE2LjE3MzgzNCwgMjg2MCwgNi4wXSwgWzE1OTA5NTY5MTYuNDYxMTQxLCAyODcwLCA2LjBdLCBbMTU5MDk1NjkxNi43NTEzMTksIDI4ODAsIDYuMF0sIFsxNTkwOTU2OTE3LjA0ODU1NCwgMjg5MCwgNi4wXSwgWzE1OTA5NTY5MTcuMzUyNTA2OSwgMjkwMCwgNi4wXSwgWzE1OTA5NTY5MTcuNjM5MDQwNSwgMjkxMCwgNi4wXSwgWzE1OTA5NTY5MTcuOTIxMjE0OCwgMjkyMCwgNi4wXSwgWzE1OTA5NTY5MTguMjA5NTU0NCwgMjkzMCwgNi4wXSwgWzE1OTA5NTY5MTguNDkyMDk1MiwgMjk0MCwgNi4wXSwgWzE1OTA5NTY5MTguNzI3ODg3NCwgMjk1MCwgNi4wXSwgWzE1OTA5NTY5MTguOTU0NTM4NiwgMjk2MCwgNi4wXSwgWzE1OTA5NTY5MTkuMTc2MDEyMywgMjk3MCwgNi4wXSwgWzE1OTA5NTY5MTkuNDA1NjQ3OCwgMjk4MCwgNi4wXSwgWzE1OTA5NTY5MTkuNjI1OTQzMiwgMjk5MCwgNi4wXSwgWzE1OTA5NTY5MTkuODU0MTU2MywgMzAwMCwgNi4wXSwgWzE1OTA5NTY5MjIuNjIwMTc1NiwgMzAwOSwgNi4wXSwgWzE1OTA5NTY5MjIuNjM4OTc2NiwgMzAxMCwgNi4wXSwgWzE1OTA5NTY5MjQuMjUzMTA1NiwgMzAxMCwgNy4wXSwgWzE1OTA5NTY5MjQuNjEzNzgxNywgMzAyMCwgNy4wXSwgWzE1OTA5NTY5MjQuOTE5NDQ1LCAzMDMwLCA3LjBdLCBbMTU5MDk1NjkyNS4yMjQyNzE1LCAzMDQwLCA3LjBdLCBbMTU5MDk1NjkyNS41MDc3Nzg2LCAzMDUwLCA3LjBdLCBbMTU5MDk1NjkyNS43ODY1MzAzLCAzMDYwLCA3LjBdLCBbMTU5MDk1NjkyNi4wODQyNTI0LCAzMDcwLCA3LjBdLCBbMTU5MDk1NjkyNi4zNzQ3MTMsIDMwODAsIDcuMF0sIFsxNTkwOTU2OTI2LjY3ODkwNzIsIDMwOTAsIDcuMF0sIFsxNTkwOTU2OTI2Ljk2Njc1MjUsIDMxMDAsIDcuMF0sIFsxNTkwOTU2OTI3LjI2MDM3MTIsIDMxMTAsIDcuMF0sIFsxNTkwOTU2OTI3LjU2MDUyNywgMzEyMCwgNy4wXSwgWzE1OTA5NTY5MjcuODU3NjY3NywgMzEzMCwgNy4wXSwgWzE1OTA5NTY5MjguMTUyNzU5LCAzMTQwLCA3LjBdLCBbMTU5MDk1NjkyOC40NTczODY3LCAzMTUwLCA3LjBdLCBbMTU5MDk1NjkyOC43NjMzODIyLCAzMTYwLCA3LjBdLCBbMTU5MDk1NjkyOS4wNTUyMTE4LCAzMTcwLCA3LjBdLCBbMTU5MDk1NjkyOS4zNjU0NzEsIDMxODAsIDcuMF0sIFsxNTkwOTU2OTI5LjY4MDI2MjMsIDMxOTAsIDcuMF0sIFsxNTkwOTU2OTI5Ljk5ODI4MzEsIDMyMDAsIDcuMF0sIFsxNTkwOTU2OTMwLjI4NjQ0MTMsIDMyMTAsIDcuMF0sIFsxNTkwOTU2OTMwLjU4NzE0MjUsIDMyMjAsIDcuMF0sIFsxNTkwOTU2OTMwLjg4Njk1NCwgMzIzMCwgNy4wXSwgWzE1OTA5NTY5MzEuMTk5ODg2NiwgMzI0MCwgNy4wXSwgWzE1OTA5NTY5MzEuNDg5MDYzNSwgMzI1MCwgNy4wXSwgWzE1OTA5NTY5MzEuODA4NDg1NywgMzI2MCwgNy4wXSwgWzE1OTA5NTY5MzIuMDk5NTUzLCAzMjcwLCA3LjBdLCBbMTU5MDk1NjkzMi40MDQ5NTg3LCAzMjgwLCA3LjBdLCBbMTU5MDk1NjkzMi43MDUzNTQsIDMyOTAsIDcuMF0sIFsxNTkwOTU2OTMzLjAwNjg4NTMsIDMzMDAsIDcuMF0sIFsxNTkwOTU2OTMzLjMwMzEzMzUsIDMzMTAsIDcuMF0sIFsxNTkwOTU2OTMzLjU5NzU5MzMsIDMzMjAsIDcuMF0sIFsxNTkwOTU2OTMzLjkwMDEwMSwgMzMzMCwgNy4wXSwgWzE1OTA5NTY5MzQuMTgwNTA2MiwgMzM0MCwgNy4wXSwgWzE1OTA5NTY5MzQuNDk0MjIzOCwgMzM1MCwgNy4wXSwgWzE1OTA5NTY5MzQuNzg5MDA4MSwgMzM2MCwgNy4wXSwgWzE1OTA5NTY5MzUuMDg0Njk4NCwgMzM3MCwgNy4wXSwgWzE1OTA5NTY5MzUuMzUwMDYzLCAzMzgwLCA3LjBdLCBbMTU5MDk1NjkzNS41OTQzMDA3LCAzMzkwLCA3LjBdLCBbMTU5MDk1NjkzNS44MzA3ODMxLCAzNDAwLCA3LjBdLCBbMTU5MDk1NjkzNi4wNjA3NjU1LCAzNDEwLCA3LjBdLCBbMTU5MDk1NjkzNi4yODUyMTk3LCAzNDIwLCA3LjBdLCBbMTU5MDk1NjkzNi41MTQyODU2LCAzNDMwLCA3LjBdLCBbMTU5MDk1NjkzOS4yODc1MTk1LCAzNDM5LCA3LjBdLCBbMTU5MDk1NjkzOS4yOTYyOTQsIDM0NDAsIDcuMF0sIFsxNTkwOTU2OTQwLjkxMTAxOTYsIDM0NDAsIDguMF0sIFsxNTkwOTU2OTQxLjI1OTMwMjYsIDM0NTAsIDguMF0sIFsxNTkwOTU2OTQxLjU0NzUxOTQsIDM0NjAsIDguMF0sIFsxNTkwOTU2OTQxLjg3MjE5NTUsIDM0NzAsIDguMF0sIFsxNTkwOTU2OTQyLjE0NzkxNjgsIDM0ODAsIDguMF0sIFsxNTkwOTU2OTQyLjQxNjA4MDUsIDM0OTAsIDguMF0sIFsxNTkwOTU2OTQyLjcxNjc0ODcsIDM1MDAsIDguMF0sIFsxNTkwOTU2OTQyLjk5NzM3MDUsIDM1MTAsIDguMF0sIFsxNTkwOTU2OTQzLjI4ODA2NjYsIDM1MjAsIDguMF0sIFsxNTkwOTU2OTQzLjU4MDA3NDMsIDM1MzAsIDguMF0sIFsxNTkwOTU2OTQzLjg5NzczOCwgMzU0MCwgOC4wXSwgWzE1OTA5NTY5NDQuMTc1MTQ5LCAzNTUwLCA4LjBdLCBbMTU5MDk1Njk0NC40NTYxNzQxLCAzNTYwLCA4LjBdLCBbMTU5MDk1Njk0NC43NDU3NDU0LCAzNTcwLCA4LjBdLCBbMTU5MDk1Njk0NS4wNDA1NjU3LCAzNTgwLCA4LjBdLCBbMTU5MDk1Njk0NS4zMjcyNjcsIDM1OTAsIDguMF0sIFsxNTkwOTU2OTQ1LjU5NzQ5NDEsIDM2MDAsIDguMF0sIFsxNTkwOTU2OTQ1LjkwODYyODUsIDM2MTAsIDguMF0sIFsxNTkwOTU2OTQ2LjE5MjcxNDIsIDM2MjAsIDguMF0sIFsxNTkwOTU2OTQ2LjQ5MjQ3OTMsIDM2MzAsIDguMF0sIFsxNTkwOTU2OTQ2Ljc4NTg2MzYsIDM2NDAsIDguMF0sIFsxNTkwOTU2OTQ3LjA3MjMyMjYsIDM2NTAsIDguMF0sIFsxNTkwOTU2OTQ3LjM1NzYxMjQsIDM2NjAsIDguMF0sIFsxNTkwOTU2OTQ3LjY0NTc2NDQsIDM2NzAsIDguMF0sIFsxNTkwOTU2OTQ3Ljk1MDE1OTMsIDM2ODAsIDguMF0sIFsxNTkwOTU2OTQ4LjIzMTQ2MzcsIDM2OTAsIDguMF0sIFsxNTkwOTU2OTQ4LjUxODI0ODYsIDM3MDAsIDguMF0sIFsxNTkwOTU2OTQ4Ljc5OTI2NTYsIDM3MTAsIDguMF0sIFsxNTkwOTU2OTQ5LjEwMzUyNjgsIDM3MjAsIDguMF0sIFsxNTkwOTU2OTQ5LjM4NTE5OCwgMzczMCwgOC4wXSwgWzE1OTA5NTY5NDkuNjc0MTU0NSwgMzc0MCwgOC4wXSwgWzE1OTA5NTY5NDkuOTY2NTY1NiwgMzc1MCwgOC4wXSwgWzE1OTA5NTY5NTAuMjU2MTYwMywgMzc2MCwgOC4wXSwgWzE1OTA5NTY5NTAuNTQxNDcxNywgMzc3MCwgOC4wXSwgWzE1OTA5NTY5NTAuODM0ODgyLCAzNzgwLCA4LjBdLCBbMTU5MDk1Njk1MS4xMzc1MDI0LCAzNzkwLCA4LjBdLCBbMTU5MDk1Njk1MS40MTkwNjI0LCAzODAwLCA4LjBdLCBbMTU5MDk1Njk1MS42NjYyMTA3LCAzODEwLCA4LjBdLCBbMTU5MDk1Njk1MS44OTgzNzIyLCAzODIwLCA4LjBdLCBbMTU5MDk1Njk1Mi4xMjEyNTIsIDM4MzAsIDguMF0sIFsxNTkwOTU2OTUyLjMzNDY4MjIsIDM4NDAsIDguMF0sIFsxNTkwOTU2OTUyLjU1NDUsIDM4NTAsIDguMF0sIFsxNTkwOTU2OTUyLjc3NjQwNjgsIDM4NjAsIDguMF0sIFsxNTkwOTU2OTU1LjU1MzczOTUsIDM4NjksIDguMF0sIFsxNTkwOTU2OTU1LjU2Mjk0OTQsIDM4NzAsIDguMF0sIFsxNTkwOTU2OTU3LjE3MDgyOSwgMzg3MCwgOS4wXSwgWzE1OTA5NTY5NTcuNTIxMzcwNiwgMzg4MCwgOS4wXSwgWzE1OTA5NTY5NTcuODE1NzUyLCAzODkwLCA5LjBdLCBbMTU5MDk1Njk1OC4xNDc4NDI2LCAzOTAwLCA5LjBdLCBbMTU5MDk1Njk1OC40MTExLCAzOTEwLCA5LjBdLCBbMTU5MDk1Njk1OC42Nzk1ODA1LCAzOTIwLCA5LjBdLCBbMTU5MDk1Njk1OC45ODEwNDQ4LCAzOTMwLCA5LjBdLCBbMTU5MDk1Njk1OS4yNzIxMzc5LCAzOTQwLCA5LjBdLCBbMTU5MDk1Njk1OS41NTc1MjMsIDM5NTAsIDkuMF0sIFsxNTkwOTU2OTU5Ljg0NDQ0MjEsIDM5NjAsIDkuMF0sIFsxNTkwOTU2OTYwLjE1NjMxMywgMzk3MCwgOS4wXSwgWzE1OTA5NTY5NjAuNDUyODEzNiwgMzk4MCwgOS4wXSwgWzE1OTA5NTY5NjAuNzQzMDk4LCAzOTkwLCA5LjBdLCBbMTU5MDk1Njk2MS4wMzMyMTA1LCA0MDAwLCA5LjBdLCBbMTU5MDk1Njk2MS4zMzQ4OTI1LCA0MDEwLCA5LjBdLCBbMTU5MDk1Njk2MS42MDcxNDU4LCA0MDIwLCA5LjBdLCBbMTU5MDk1Njk2MS44OTcxOTA4LCA0MDMwLCA5LjBdLCBbMTU5MDk1Njk2Mi4xODk1MTE1LCA0MDQwLCA5LjBdLCBbMTU5MDk1Njk2Mi40OTEwMzg4LCA0MDUwLCA5LjBdLCBbMTU5MDk1Njk2Mi43NzU2NzUsIDQwNjAsIDkuMF0sIFsxNTkwOTU2OTYzLjA1OTYyMTYsIDQwNzAsIDkuMF0sIFsxNTkwOTU2OTYzLjM0OTI1MTcsIDQwODAsIDkuMF0sIFsxNTkwOTU2OTYzLjYyODIzNjUsIDQwOTAsIDkuMF0sIFsxNTkwOTU2OTYzLjkwMjA4MiwgNDEwMCwgOS4wXSwgWzE1OTA5NTY5NjQuMTg1MzEwMSwgNDExMCwgOS4wXSwgWzE1OTA5NTY5NjQuNDg1ODA0OCwgNDEyMCwgOS4wXSwgWzE1OTA5NTY5NjQuNzYyMjU3NiwgNDEzMCwgOS4wXSwgWzE1OTA5NTY5NjUuMDM4MjUyOCwgNDE0MCwgOS4wXSwgWzE1OTA5NTY5NjUuMzI2Mjc5OSwgNDE1MCwgOS4wXSwgWzE1OTA5NTY5NjUuNjE3NjYxLCA0MTYwLCA5LjBdLCBbMTU5MDk1Njk2NS44OTk4NzU0LCA0MTcwLCA5LjBdLCBbMTU5MDk1Njk2Ni4xODgxNzYyLCA0MTgwLCA5LjBdLCBbMTU5MDk1Njk2Ni40ODA2Njc0LCA0MTkwLCA5LjBdLCBbMTU5MDk1Njk2Ni43Njc1MjA3LCA0MjAwLCA5LjBdLCBbMTU5MDk1Njk2Ny4wNjQ4MTMxLCA0MjEwLCA5LjBdLCBbMTU5MDk1Njk2Ny4zNTg1OTEsIDQyMjAsIDkuMF0sIFsxNTkwOTU2OTY3LjY1MDIwODIsIDQyMzAsIDkuMF0sIFsxNTkwOTU2OTY3LjkwMDY3MywgNDI0MCwgOS4wXSwgWzE1OTA5NTY5NjguMTEzNzc4OCwgNDI1MCwgOS4wXSwgWzE1OTA5NTY5NjguMzI1OTI0LCA0MjYwLCA5LjBdLCBbMTU5MDk1Njk2OC41NTUwOTY5LCA0MjcwLCA5LjBdLCBbMTU5MDk1Njk2OC43NzI4MjA1LCA0MjgwLCA5LjBdLCBbMTU5MDk1Njk2OC45ODc3NzUsIDQyOTAsIDkuMF0sIFsxNTkwOTU2OTcxLjc3NjIwNDYsIDQyOTksIDkuMF0sIFsxNTkwOTU2OTcxLjc5NjMyMjMsIDQzMDAsIDkuMF1d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=epoch&run=version_0": { + "data": "W1sxNTkwOTU2NjgyLjQ1MTMyMTEsIDAsIDAuMF0sIFsxNTkwOTU2NjgyLjc2MDU4NCwgMTAsIDAuMF0sIFsxNTkwOTU2NjgzLjA2OTIwMTcsIDIwLCAwLjBdLCBbMTU5MDk1NjY4My4zOTAyMjI4LCAzMCwgMC4wXSwgWzE1OTA5NTY2ODMuNjkzNjQzNiwgNDAsIDAuMF0sIFsxNTkwOTU2NjgzLjk5NjM1MSwgNTAsIDAuMF0sIFsxNTkwOTU2Njg0LjI5NTg5MywgNjAsIDAuMF0sIFsxNTkwOTU2Njg0LjU4OTIzNTgsIDcwLCAwLjBdLCBbMTU5MDk1NjY4NC45MDM2OTAzLCA4MCwgMC4wXSwgWzE1OTA5NTY2ODUuMjIyNTQzNywgOTAsIDAuMF0sIFsxNTkwOTU2Njg1LjUyMDQ3OCwgMTAwLCAwLjBdLCBbMTU5MDk1NjY4NS44MjMwOTM0LCAxMTAsIDAuMF0sIFsxNTkwOTU2Njg2LjEyMDgwNTMsIDEyMCwgMC4wXSwgWzE1OTA5NTY2ODYuNDE3NjI1NCwgMTMwLCAwLjBdLCBbMTU5MDk1NjY4Ni43MjMxMDg1LCAxNDAsIDAuMF0sIFsxNTkwOTU2Njg3LjAyOTkwOTYsIDE1MCwgMC4wXSwgWzE1OTA5NTY2ODcuMzIyMjI1LCAxNjAsIDAuMF0sIFsxNTkwOTU2Njg3LjYzMzg4NzgsIDE3MCwgMC4wXSwgWzE1OTA5NTY2ODcuOTQ1MTkyMywgMTgwLCAwLjBdLCBbMTU5MDk1NjY4OC4yNjcxNTQ1LCAxOTAsIDAuMF0sIFsxNTkwOTU2Njg4LjU4ODI5NzgsIDIwMCwgMC4wXSwgWzE1OTA5NTY2ODguOTAxNjUwMiwgMjEwLCAwLjBdLCBbMTU5MDk1NjY4OS4yMDk2MjA3LCAyMjAsIDAuMF0sIFsxNTkwOTU2Njg5LjUwNTY2MjIsIDIzMCwgMC4wXSwgWzE1OTA5NTY2ODkuODI1MzAxNiwgMjQwLCAwLjBdLCBbMTU5MDk1NjY5MC4xMjcxMzAzLCAyNTAsIDAuMF0sIFsxNTkwOTU2NjkwLjQzMjMyNSwgMjYwLCAwLjBdLCBbMTU5MDk1NjY5MC43NDcwNzgsIDI3MCwgMC4wXSwgWzE1OTA5NTY2OTEuMDY0MTAxNywgMjgwLCAwLjBdLCBbMTU5MDk1NjY5MS4zNTU2ODEyLCAyOTAsIDAuMF0sIFsxNTkwOTU2NjkxLjY2NzMxNjIsIDMwMCwgMC4wXSwgWzE1OTA5NTY2OTEuOTc0MzU0LCAzMTAsIDAuMF0sIFsxNTkwOTU2NjkyLjI2OTQ5OCwgMzIwLCAwLjBdLCBbMTU5MDk1NjY5Mi41NjI4NjI5LCAzMzAsIDAuMF0sIFsxNTkwOTU2NjkyLjg3MTEyNzgsIDM0MCwgMC4wXSwgWzE1OTA5NTY2OTMuMTcxMjE0NiwgMzUwLCAwLjBdLCBbMTU5MDk1NjY5My40NzM5MDUzLCAzNjAsIDAuMF0sIFsxNTkwOTU2NjkzLjczODA0NjQsIDM3MCwgMC4wXSwgWzE1OTA5NTY2OTMuOTc0OTYzNCwgMzgwLCAwLjBdLCBbMTU5MDk1NjY5NC4yMTIxODIzLCAzOTAsIDAuMF0sIFsxNTkwOTU2Njk0LjQ2MDEyOCwgNDAwLCAwLjBdLCBbMTU5MDk1NjY5NC43MDAyMTEzLCA0MTAsIDAuMF0sIFsxNTkwOTU2Njk0LjkzOTA5MTcsIDQyMCwgMC4wXSwgWzE1OTA5NTY2OTcuNjk4NTU3OSwgNDI5LCAwLjBdXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 821 + }, + "outputId": "ea04489a-c5bc-43af-911a-d2b25694f6b1" + }, + "source": [ + "%load_ext tensorboard\n", + "%tensorboard --logdir lightning_logs/" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "display_data", + "data": { + "application/javascript": [ + "\n", + " (async () => {\n", + " const url = await google.colab.kernel.proxyPort(6006, {\"cache\": true});\n", + " const iframe = document.createElement('iframe');\n", + " iframe.src = url;\n", + " iframe.setAttribute('width', '100%');\n", + " iframe.setAttribute('height', '800');\n", + " iframe.setAttribute('frameborder', 0);\n", + " document.body.appendChild(iframe);\n", + " })();\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7pZ1d3CGaLZz", + "colab_type": "text" + }, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e4so8_e-RYUZ", + "colab_type": "text" + }, + "source": [ + "# **2. Using Lightning's TensorBoard Logger**\n", + "The code contains the implementation of Lightning logger to\n", + "\n", + "\n", + "**1. Draw Graphs(Log Scalars)**\n", + "![Scalars Logging](https://www.learnopencv.com/wp-content/uploads/2020/05/Annotation-2020-05-25-101405.png)\n", + "**2. View Commputational Graph**\n", + "![Computational Graph Logging](https://www.learnopencv.com/wp-content/uploads/2020/05/okok.png)\n", + "**3. View Histograms**\n", + "![Histogram Logging](https://www.learnopencv.com/wp-content/uploads/2020/05/Annotation-2020-05-25-112155.png)\n", + "**4. View Activations**\n", + "![Activation Logging](https://www.learnopencv.com/wp-content/uploads/2020/05/Annotation-2020-05-25-175429.png)\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "kAYqu14qeLz-", + "colab_type": "code", + "colab": {} + }, + "source": [ + "'''\n", + "Neural Network architecture inspired from: \n", + "https://towardsdatascience.com/convolutional-neural-network-for-image-classification-with-implementation-on-python-using-pytorch-7b88342c9ca9\n", + "'''\n", + "\n", + "#importing necessary libraries\n", + "import os\n", + "import torch\n", + "from torch.nn import functional as F\n", + "from torch.utils.data import DataLoader,random_split\n", + "from torchvision.datasets import MNIST\n", + "from torchvision import transforms\n", + "import pytorch_lightning as pl\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import torchvision\n", + "\n", + "\n", + "#defining the model\n", + "class smallAndSmartModelWithLogger(pl.LightningModule):\n", + "\n", + " def __init__(self):\n", + " # this is the init function where we will defnine the architecture\n", + " super(smallAndSmartModelWithLogger, self).__init__()\n", + " \n", + " self.layer1 = torch.nn.Sequential(\n", + " torch.nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1),\n", + " torch.nn.ReLU(),\n", + " torch.nn.MaxPool2d(kernel_size=2, stride=2),\n", + " torch.nn.Dropout(p=0.5))\n", + " self.layer2 = torch.nn.Sequential(\n", + " torch.nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),\n", + " torch.nn.ReLU(),\n", + " torch.nn.MaxPool2d(kernel_size=2, stride=2),\n", + " torch.nn.Dropout(p=0.5))\n", + " self.layer3 = torch.nn.Sequential(\n", + " torch.nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),\n", + " torch.nn.ReLU(),\n", + " torch.nn.MaxPool2d(kernel_size=2, stride=2, padding=1),\n", + " torch.nn.Dropout(p=0.5))\n", + "\n", + " self.fc1 = torch.nn.Linear(4 * 4 * 128, 625, bias=True)\n", + " torch.nn.init.xavier_uniform(self.fc1.weight)\n", + " self.layer4 = torch.nn.Sequential(\n", + " self.fc1,\n", + " torch.nn.ReLU(),\n", + " torch.nn.Dropout(p=0.5))\n", + " self.dense1_bn = torch.nn.BatchNorm1d(625)\n", + " self.fc2 = torch.nn.Linear(625, 10, bias=True)\n", + " self.dense2_bn = torch.nn.BatchNorm1d(10)\n", + " torch.nn.init.xavier_uniform_(self.fc2.weight) # initialize parameters\n", + "\n", + " # reference dummy image for logging graph \n", + " self.reference_image=torch.rand((1,1,28,28))\n", + "\n", + " def prepare_data(self):\n", + " \n", + " # This contains the manupulation on data that needs to be done only once such as downloading it\n", + "\n", + " #download the MNIST dataset\n", + " MNIST(os.getcwd(), train=True, download =True)\n", + " MNIST(os.getcwd(), train=False, download =True)\n", + " \n", + " # See here I have set download to false as it is already downloaded\n", + " mnist_train=MNIST(os.getcwd(), train=True, download =False,transform=transforms.ToTensor())\n", + "\n", + " #dividing into validation and training set\n", + " self.train_set, self.val_set= random_split(mnist_train,[55000,5000])\n", + " \n", + " def train_dataloader(self):\n", + " # REQUIRED\n", + " # This is an essential function. Needs to be included in the code\n", + " \n", + " return DataLoader(self.train_set,batch_size=128,num_workers=32)\n", + " \n", + " def val_dataloader(self):\n", + " # OPTIONAL\n", + " #loading validation dataset\n", + " return DataLoader(self.val_set, batch_size=128,num_workers=32)\n", + "\n", + " def test_dataloader(self):\n", + " # OPTIONAL\n", + " # loading test dataset\n", + " return DataLoader(MNIST(os.getcwd(), train=False, download=False, transform=transforms.ToTensor()), batch_size=128,num_workers=32)\n", + "\n", + "\n", + " def forward(self,x):\n", + " #evaluating the batch data as it moves forward in the netowrk\n", + " out = self.layer1(x)\n", + " out = self.layer2(out)\n", + " out = self.layer3(out)\n", + " out = out.view(out.size(0), -1) # Flatten them for FC\n", + " # out = self.fc1(out)\n", + " out = self.dense1_bn(self.fc1(out))\n", + " # out = self.fc2(out)\n", + " out = self.dense2_bn(self.fc2(out))\n", + " return F.softmax(out,dim=1)\n", + "\n", + " def validation_step(self, batch, batch_nb):\n", + " # OPTIONAL\n", + " # The code that runs as we forward pass a validation batch\n", + " x, y = batch\n", + " y_hat = self(x)\n", + " correct=y_hat.argmax(dim=1).eq(y).sum().item()\n", + " total=len(y)\n", + " return {'val_loss': F.cross_entropy(y_hat, y),\"correct\": correct,\"total\": total}\n", + "\n", + " def validation_epoch_end(self, outputs):\n", + " # OPTIONAL\n", + " # The code that runs as a validation epoch finished\n", + " # Used for metric evaluation\n", + " avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean()\n", + " correct=sum([x[\"correct\"] for x in outputs])\n", + " total=sum([x[\"total\"] for x in outputs])\n", + " print(\"Loss val= {}\".format(avg_loss))\n", + " print(\"Number of Correctly identified Validation Images {} from aset of {}. \\nAccuracy= {} \".format(correct,total,correct/total))\n", + " \n", + " # Adding logs to TensorBoard\n", + " self.logger.experiment.add_scalar(\"Loss/Val\",avg_loss,self.current_epoch)\n", + " self.logger.experiment.add_scalar(\"Accuracy/Val\",correct/total,self.current_epoch)\n", + " \n", + " return {'val_loss': avg_loss}\n", + "\n", + " def test_step(self, batch, batch_nb):\n", + " # OPTIONAL\n", + " # The code that runs as we forward pass a test batch\n", + "\n", + " x, y = batch\n", + " y_hat = self(x)\n", + " correct=y_hat.argmax(dim=1).eq(y).sum().item()\n", + " total=len(y)\n", + " return {'test_loss': F.cross_entropy(y_hat, y),\n", + " \"correct\": correct,\n", + " \"total\": total}\n", + "\n", + "\n", + "\n", + " \n", + " def test_epoch_end(self, outputs):\n", + " # OPTIONAL\n", + " # The code that runs as a validation epoch finished\n", + " # Used for metric evaluation\n", + " correct=sum([x[\"correct\"] for x in outputs])\n", + " total=sum([x[\"total\"] for x in outputs])\n", + " print(\"Number of Correctly identified Testing Images {} from aset of {}. \\nAccuracy= {} \".format(testCorrect,testTotal,testCorrect/testTotal))\n", + " avg_loss = torch.stack([x['test_loss'] for x in outputs]).mean()\n", + " print(\"Loss= {}\".format(avg_loss))\n", + "\n", + " # Logging Data to TensorBoard\n", + " self.logger.experiment.add_scalar(\"Loss/Test\",avg_loss,self.current_epoch)\n", + " self.logger.experiment.add_scalar(\"Accuracy/Test\",correct/total,self.current_epoch)\n", + "\n", + " return {'test_loss': avg_loss}\n", + "\n", + " def configure_optimizers(self):\n", + " # REQUIRED\n", + " # Can return multiple optimizers and learning_rate schedulers\n", + " return torch.optim.Adam(self.parameters(), lr=0.0005)\n", + " \n", + " def custom_histogram_adder(self):\n", + " # A custom defined function that adds Histogram to TensorBoard\n", + "\n", + " # Iterating over all parameters and logging them\n", + " for name,params in self.named_parameters():\n", + " self.logger.experiment.add_histogram(name,params,self.current_epoch)\n", + "\n", + " def training_step(self,batch,batch_idx):\n", + " #REQUIRED\n", + " # print(batch)\n", + " if(batch_idx==0):\n", + " self.reference_image=(batch[0][0]).unsqueeze(0)\n", + " # self.reference_image.resize((1,1,28,28))\n", + " print(self.reference_image.shape)\n", + "\n", + " #extracting input and output from the batch\n", + " x,labels=batch\n", + " pred=self.forward(x)\n", + " \n", + " correct=pred.argmax(dim=1).eq(labels).sum().item()\n", + " total=len(labels)\n", + " #calculating the loss\n", + " train_loss = F.cross_entropy(pred, labels)\n", + "\n", + " logs={\"train_loss\": train_loss}\n", + "\n", + " output={\n", + " #REQUIRED: It ie required for us to return \"loss\"\n", + " \"loss\": train_loss,\n", + " #optional for logging purposes\n", + " \"log\": logs,\n", + " \"correct\": correct,\n", + " \"total\": total\n", + " }\n", + "\n", + " return output\n", + "\n", + " def showActivations(self,x):\n", + " # Evaluating the batch data as it moves forward in the netowrk\n", + " # Custom made function for this model to log activations\n", + " print(x.shape)\n", + " plt.imshow(torch.Tensor.cpu(x[0][0]))\n", + "\n", + " # Logging the input image\n", + " self.logger.experiment.add_image(\"input\",torch.Tensor.cpu(x[0][0]),self.current_epoch,dataformats=\"HW\")\n", + " plt.show()\n", + " plt.clf()\n", + " out = self.layer1(x)\n", + " outer=(torch.Tensor.cpu(out).detach())\n", + " plt.figure(figsize=(20,5))\n", + " b=np.array([]).reshape(0,outer.shape[2])\n", + " c=np.array([]).reshape(4*outer.shape[2],0)\n", + " \n", + " # Plotting for layer 1\n", + " i=0\n", + " j=0\n", + " while(i<32):\n", + " img=outer[0][i]\n", + " b=np.concatenate((img,b),axis=0)\n", + " j+=1\n", + " if(j==4):\n", + " c=np.concatenate((c,b),axis=1)\n", + " b=np.array([]).reshape(0,outer.shape[2])\n", + " j=0\n", + " \n", + " i+=1\n", + " \n", + "\n", + " plt.imshow(c)\n", + " plt.show()\n", + " plt.clf()\n", + " self.logger.experiment.add_image(\"layer 1\",c,self.current_epoch,dataformats=\"HW\")\n", + " \n", + " out = self.layer2(out)\n", + " outer=(torch.Tensor.cpu(out).detach())\n", + " plt.figure(figsize=(10,10))\n", + " b=np.array([]).reshape(0,outer.shape[2])\n", + " c=np.array([]).reshape(8*outer.shape[2],0)\n", + " \n", + " # Plotting for layer2\n", + " i=0\n", + " j=0\n", + " while(i<64):\n", + " img=outer[0][i]\n", + " b=np.concatenate((img,b),axis=0)\n", + " j+=1\n", + " if(j==8):\n", + " c=np.concatenate((c,b),axis=1)\n", + " b=np.array([]).reshape(0,outer.shape[2])\n", + " j=0\n", + " \n", + " i+=1\n", + "\n", + " self.logger.experiment.add_image(\"layer 2\",c,self.current_epoch,dataformats=\"HW\")\n", + " plt.imshow(c)\n", + " plt.show()\n", + " plt.clf()\n", + " \n", + " # print(out.shape)\n", + " out = self.layer3(out)\n", + " outer=(torch.Tensor.cpu(out).detach())\n", + " plt.figure(figsize=(20,5))\n", + " b=np.array([]).reshape(0,outer.shape[2])\n", + " c=np.array([]).reshape(8*outer.shape[2],0)\n", + " \n", + " # Plotting for layer3\n", + " j=0\n", + " i=0\n", + " while(i<128):\n", + " img=outer[0][i]\n", + " b=np.concatenate((img,b),axis=0)\n", + " j+=1\n", + " if(j==8):\n", + " c=np.concatenate((c,b),axis=1)\n", + " b=np.array([]).reshape(0,outer.shape[2])\n", + " j=0\n", + " \n", + " i+=1\n", + " # print(c.shape)\n", + "\n", + " self.logger.experiment.add_image(\"layer 3\",c,self.current_epoch,dataformats=\"HW\")\n", + " plt.imshow(c)\n", + " plt.show()\n", + " \n", + " def training_epoch_end(self,outputs):\n", + "\n", + " # Logging activations\n", + " self.showActivations(self.reference_image)\n", + " \n", + " # Logging graph\n", + " if(self.current_epoch==1):\n", + " sampleImg=torch.rand((1,1,28,28))\n", + " self.logger.experiment.add_graph(smallAndSmartModel(),sampleImg)\n", + "\n", + " avg_loss = torch.stack([x['loss'] for x in outputs]).mean()\n", + " print(\"Loss train= {}\".format(avg_loss))\n", + " correct=sum([x[\"correct\"] for x in outputs])\n", + " total=sum([x[\"total\"] for x in outputs])\n", + "\n", + " # Loggig scalars\n", + " self.logger.experiment.add_scalar(\"Loss/Train\",avg_loss,self.current_epoch)\n", + " self.logger.experiment.add_scalar(\"Accuracy/Train\",correct/total,self.current_epoch)\n", + " \n", + " # Logging histograms\n", + " self.custom_histogram_adder()\n", + "\n", + " print(\"Number of Correctly identified Training Set Images {} from a set of {}. \\nAccuracy= {} \".format(correct,total,correct/total))\n", + " return {'loss': avg_loss}" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vVXlYjjydZ6b", + "colab_type": "text" + }, + "source": [ + "## Defining Model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "BifQyqxr9pjb", + "colab_type": "code", + "outputId": "22ed7466-aee5-424d-d267-5be6166d815d", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 86 + } + }, + "source": [ + "# Using the Lightning trainer and specifing the requied parameters as arguments\n", + "from pytorch_lightning.loggers import TensorBoardLogger\n", + "logger = TensorBoardLogger('tb_logs', name='testing_for_activations')\n", + "\n", + "myTrainerWithLogger=pl.Trainer(gpus=1,max_nb_epochs=10,checkpoint_callback=False,logger=logger)\n", + "\n", + "myModelWithLogger=smallAndSmartModelWithLogger()" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "stream", + "text": [ + "GPU available: True, used: True\n", + "No environment variable for node rank defined. Set as 0.\n", + "CUDA_VISIBLE_DEVICES: [0]\n", + "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:43: UserWarning: nn.init.xavier_uniform is now deprecated in favor of nn.init.xavier_uniform_.\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4p8-iXtwdkeL", + "colab_type": "text" + }, + "source": [ + "## Train" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "qGGulxsvxQuS", + "colab_type": "code", + "outputId": "dea3815a-b8f0-4941-e692-05a42a91c1ac", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000, + "referenced_widgets": [ + "f6b418ac9a784cf39f537e93b9712b0f", + "bbb09b3b11454d3d902c981c1874e227", + "727f101faa1147dca0bab10a1b867754", + "4ffae6daab15469181ad62dcf4b6755f", + "b067a85aa69c4acc8f38077444b0b62b", + "702e0c51876d491d84eeb7b93e021416", + "695279db98734f72b5a8187f484ed4eb", + "b801e6dda709479fb28a11ccff2e9fd2", + "b0caff9a0db3449da90c4696ff0c6dc0", + "23f2a1c6eadb415c9253c74dbefd701e", + "8d61e6981653498dbfe5cd863d1d4abf", + "bbbf9723a0214db3a55f7c643650a59e", + "e0543446503d4548bf7b49a1ba1c8811", + "a0b0e0209c5d4148bb50ef2defc83cef", + "c863ca4c52dd45bbb4b8d04ac7bbf13e", + "69c58acf0f1b477fb9486b214ed10ef8", + "cfe1eb2121444a0a84266c3d75fcd963", + "3756191380f34b33a371f7956c88dfe6", + "6e0b815542c94c2a8d3f7c5272ae87b2", + "fe1bd530a464467d915d23b7bf82dbe7", + "2bb4b7c9b0104bfbb4699c0ae914fc53", + "aa0cc4c7dce948bdaa0857e028eadbc6", + "c62dcf23227f4cbcbaa2ea8297455c76", + "7329aace66ce4a5290e0b8acb9273aba", + "86169559e322466f9868a541c1f6724c", + "448a75c288ab40e59b8e9efbf083ba06", + "478a909bdccb44949182a485aa4c7aac", + "83cc7e5988fa4699843a873408375ec7", + "ccec043d8c8c47dd826612978a1d8fec", + "37a1ca16333841039c6b1b3b260aebb9", + "3813ceefeb3841d9887c82ba0a3e659f", + "d1c400398bc74762b2f7882d1cc57702", + "40180487115c473a872d7c896bacb3ff", + "f00cd38365174318af3c49ba42d67bc5", + "704f7b19739a4c05ae46a0d6ffa7a865", + "33306403471c4538abdab5bfa05b4610", + "ffcb6cca375c4c8b9dfd9190671ff348", + "149e414e1c9441019eb052a4c36d19a9", + "fb7cab66a2474ab6bcd7946a2fb60f42", + "5e54c83fcc3a4efba43349a1b08061fd", + "02ec7b2afb7d4456bbfed4efe0ed3df4", + "7d8abb71feeb4a64a7e21e645d5da2f4", + "26cf343f24e44198808769ff76958275", + "e755ff286a074c42a236062a763ed59c", + "d5a5178a43c1418092f7dd604b8f1305", + "67161adc5d514547a036374dee270d7d", + "59a1f9c386db47e7b4d263adaa4a720b", + "6a9b117e0050412f85013848881988de" + ] + } + }, + "source": [ + "myTrainerWithLogger.fit(myModelWithLogger)" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "text": [ + "\n", + " | Name | Type | Params\n", + "--------------------------------------\n", + "0 | layer1 | Sequential | 320 \n", + "1 | layer1.0 | Conv2d | 320 \n", + "2 | layer1.1 | ReLU | 0 \n", + "3 | layer1.2 | MaxPool2d | 0 \n", + "4 | layer1.3 | Dropout | 0 \n", + "5 | layer2 | Sequential | 18 K \n", + "6 | layer2.0 | Conv2d | 18 K \n", + "7 | layer2.1 | ReLU | 0 \n", + "8 | layer2.2 | MaxPool2d | 0 \n", + "9 | layer2.3 | Dropout | 0 \n", + "10 | layer3 | Sequential | 73 K \n", + "11 | layer3.0 | Conv2d | 73 K \n", + "12 | layer3.1 | ReLU | 0 \n", + "13 | layer3.2 | MaxPool2d | 0 \n", + "14 | layer3.3 | Dropout | 0 \n", + "15 | fc1 | Linear | 1 M \n", + "16 | layer4 | Sequential | 1 M \n", + "17 | layer4.1 | ReLU | 0 \n", + "18 | layer4.2 | Dropout | 0 \n", + "19 | dense1_bn | BatchNorm1d | 1 K \n", + "20 | fc2 | Linear | 6 K \n", + "21 | dense2_bn | BatchNorm1d | 20 \n" + ], + "name": "stderr" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f6b418ac9a784cf39f537e93b9712b0f", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validation sanity check', layout=Layout…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 2.3020882606506348\n", + "Number of Correctly identified Validation Images 17 from aset of 256. \n", + "Accuracy= 0.06640625 \n", + "\r" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b0caff9a0db3449da90c4696ff0c6dc0", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Training', layout=Layout(flex='2'), max…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "torch.Size([1, 1, 28, 28])\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cfe1eb2121444a0a84266c3d75fcd963", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.7506769895553589\n", + "Number of Correctly identified Validation Images 4826 from aset of 5000. \n", + "Accuracy= 0.9652 \n", + "torch.Size([1, 1, 28, 28])\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkEAAAI/CAYAAABwLA0cAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3de7zd9Vkn+ue71w5JCQkQCAklQLgkXEoLLYEArTO1tB2q1fY4Wtt6lHGqjFrHOtOq6KhjPd56jlpbL/UwWmXmWNp66cVLtZ203gqEOxQIJVxLAiFAAgmhCey9v/NHdudACP4estdlJ9/3+/Xilb3X/vD7PVm/nbU/WVn72aXWGgAArRkb9QAAAKOgBAEATVKCAIAmKUEAQJOUIACgSUoQANCk8WGe7KAyt86L+cM8JQANKL3c3+nr5FT/zjkn9yW0zp2TO+CTX5/BNLyQnbEjnq67yt4+NqMSVEq5KCI+FBG9iPiDWuuv/Uv5eTE/VpcLZ3JKZpuxXndmanLwcwBN6x2yMJWb3Latb+ccX7w0lXv6pFxu7J9vmsk4vIC1dc0Lfmyf/zmslNKLiN+NiDdFxOkR8Y5Syun7ejwAgGGayWuCzo2Iu2qt99Ran46Ij0fEW/ozFgDAYM2kBB0TEQ886/0N07cBAMx6A39hdCnlkoi4JCJiXhw86NMBAKTM5JmgjRFx7LPeXzZ923PUWi+rta6qta6aE3NncDoAgP6ZSQm6NiJWlFJOKKUcFBFvj4jP9mcsAIDB2ud/Dqu1TpRSfjQi/i52f4v8R2utt/VtMgCAAZrRa4JqrX8TEX/Tp1kAAIZmqBujs3onn9CZmbzr3iFMMmBlrwssn6/Wwc4xA2NnrOjMTN1yxxAm2Tf3XnFmKnfCO24e8CTsz8rc3Osd665dA55k3zz8Yxekcks+fGUqt/53Vqdyp/3Gps7MxL33p46VXYLYO31l97FuvzN1rImHuuePiBhL5l5xQ/fXhM98/rzUsU649KpULqN3+OGp3OTWranc+LHLUrmJBzakcjPhZ4cBAE1SggCAJilBAECTlCAAoElKEADQJCUIAGiSEgQANEkJAgCaVOoQF/EtLIvq6t4bO3O9E4/rzBwQyxL7qHfYoanc5ONPDHiSwSuvfFlnpt44mp/gMvnaV3VmNr9qXupYR38wuews8Wf47t/ILVg76b1Xp3L3feIVqdzy774llWvFo//h/M7MEbd+PXWs8uWbUrl+LgccO+PUVG7q1tm7IJXn6i1c2JnJLqL82n/NLd087v25pZv9srauiW11y143UXomCABokhIEADRJCQIAmqQEAQBNUoIAgCYpQQBAk5QgAKBJShAA0CQlCABo0vA3RpcLh3a+lmz68dymzqW/NdxNnRFtbRceW7CgMzO1fXtfz1nOeXlnpl77lb6eczbr5wbcfnOtXryd33ZuKnfITQ+mchMPbJjJOPtk/JiXpnITG7t/D1u+v3vreETEoj9KbpxvgI3RAAB7UIIAgCYpQQBAk5QgAKBJShAA0CQlCABokhIEADRJCQIAmqQEAQBNGh/1APTHsj+9L5Wb6PN5n3zbeZ2ZQz+310WdA7Xx0twG7aPf8EAqt2HLYanccd/Vv22/Y/Pnp3Ll3u4ts5MzHWYPd/2PV6ZyZx7fvZ1353/I3beT69anclMrju3M3PmDuft25Q9dk8plZbZB3/3r3X+mIiJOet/VMx1nYCb+53Gp3Jyf6N6wPu8vc9egn49t9dVnpXLlyzelcplN0FlHXnFjKjfVtzPmHucjIg755Oz9nHwhngkCAJqkBAEATVKCAIAmKUEAQJOUIACgSUoQANAkJQgAaJISBAA0SQkCAJpUaq1DO9nCsqiuLhcO7XzQgu3f3b3NdcEncptcF1+Z2978yAWPp3IZvcMOTeUmH3+ib+dk34yddXoqN3XT7QOeZC/n/KbcFvPMX/3H/iG3lZnBGl+6pDMzsenhzszauia21S17/dEFngkCAJqkBAEATVKCAIAmKUEAQJOUIACgSUoQANAkJQgAaJISBAA0ab9dljg2b14qN7VzZ1/O15oy56BUrj7z9IAnAeif8ROO78xM3Ht/6lib331BKnfU716ZyvVWntSZKTu+njrWxMYHU7kWWJYIALAHJQgAaJISBAA0SQkCAJqkBAEATVKCAIAmKUEAQJOUIACgSUoQANCk8VEPsFdlr4sdn6Pfm6B7hx+eyk1u3dqZGVuwIHWsqe3bU7mM3mkrUrnJdetTuewm6PGjl3ZmJh7alDoWzzV+/LGp3MT9Dwx4kr0Y6+VyU5ODnQNepLr18c7M2Bmnpo6V3QSdNXnn3X071vgxL03lRrFZeuzgg1O5qaeeGvAkngkCABqlBAEATVKCAIAmKUEAQJOUIACgSUoQANAkJQgAaJISBAA0SQkCAJpUaq1DO9nCsqiuHnt9d3CIM3FgevB9F6RyR395RypXrrp5JuMwRLvedE5nZu7nrk0da9vnTkrlVh91fyq37uyJVG626h15RCq36btWpnKLP3LVTMZhSB74udzj6bH/V26D9p2/f24qt/KHrunMbH/7eZ2ZW//ut+LJxx7Y64+i8EwQANAkJQgAaJISBAA0SQkCAJqkBAEATVKCAIAmKUEAQJOUIACgScNfllguHNr5XoxN78ktg1r6odwyqGEbO/O0VG7q5nUDnuT5xubNS+Wmdu7s2zl3fltuGde8v+xextWSbe/sXjwWEbHt+Nzfn5b9av/+vPQWL84FD1/YGZm88+4ZTjM4vcMPT+Umt24d8CT7btnVh6RyGy74endoanKG0wzO134+93Xj4HMeTeWO/LY7ZzLOc2QXW9anuq/B1FNPzXScgSlnv6wzc/Xtl8W2HQ9alggA8A1KEADQJCUIAGiSEgQANEkJAgCapAQBAE1SggCAJilBAECTlCAAoElD3Rh9aO/Iet4h396Zm9qR2E6Z3CI69ZqzUrmxf74pleudtqIzM7lufepYo/DYD5yfyo1/Pfd5ceifXD2TcfYb48e8NJXb+prjOjMLPtHn++y8V3Rnrr6lv+fkOcYWLEjlprZvH/Akzzc2f35npp66PHWsev1tM5xm9HqnnNyZmfzqXbljJbeYTz7ySCo3W2W3T08++lgqV+YclMrVZ55O5bqsrWtiW92ybxujSykfLaVsLqXc+qzbFpVSvlBKWT/9a27POwDALJH557A/joiL9rjt0ohYU2tdERFrpt8HANhvdJagWus/RsSWPW5+S0RcPv325RHx1j7PBQAwUPv6wugltdaHpt/eFBFL+jQPAMBQzPi7w+ruV1a/4KtoSymXlFKuK6Vc93TdOdPTAQD0xb6WoIdLKUdHREz/uvmFgrXWy2qtq2qtqw4q8/bxdAAA/bWvJeizEXHx9NsXR8Rn+jMOAMBwZL5F/oqIuCoiTimlbCilvCsifi0i3lBKWR8Rr59+HwBgvzHeFai1vuMFPnRhn2cBABiaoW6MXlgW1dWluzuVuXM7M3XXrn6MNFL93sLJgWV8eff26YiIifu+NuBJDjxjZ5yayk3dekcq9+TfnpjKHXLRPanc/u7O/3ZOKrfyB6/tzJSzX5Y61oGwzTpj17fk7tuD196dyk0+tucGnOd7+D9ekDrWhf8utw3/5fM3pHJXnJrb1N9lRhujAQAOREoQANAkJQgAaJISBAA0SQkCAJqkBAEATVKCAIAmKUEAQJOUIACgSbNyY3TG4993fip32H+/KpW784/OTuVWfv/1nZnMxuuIiHLQQanc1Pbtqdwo3PeJV3Rmjv/QXhd1Pk+58uaZjsMsM/WaszozB931UOpYE5senuk4+4XewoWp3OS2bQOeZN898sO5x+fFH8k9Ps9WZ92Yy31gyU2p3Mp//L7OzAlvvyV3Uv43G6MBAPagBAEATVKCAIAmKUEAQJOUIACgSUoQANAkJQgAaJISBAA0ab9dlthvY2eelspN3bxuwJMM1p0fOTeVW3jHeCp3zF93L7qbvOve1LEOBONLl3RmRrH0b2zevFRuaufOAU9Cl94pJ6dyk1+9a8CTPN/YggWpXD8XvGaXz9Zdu/p2zvHjj03lJu5/oG/n7LfeYYemcpOPP9GZGZs/P3WsqR07Urk4r3vJbkREb1v349Hk7Xd2ZixLBADYgxIEADRJCQIAmqQEAQBNUoIAgCYpQQBAk5QgAKBJShAA0CQlCABoko3R7Hcy21wnFy1MHaveeFvunEcvTeUmHtqUyvHi9U4+IZWbzRvKy6ozOjNj9+c2ik8+8shMx4Em2BgNALAHJQgAaJISBAA0SQkCAJqkBAEATVKCAIAmKUEAQJOUIACgSUoQANCk8VEPsK/KF49J5errNqZyvVNOTuUmv3pXKteK3uLFnZnsZtv0Vub7H+gO3Z86VJpN0KM3mzdBZ9Xrbu3MTM2dO4RJ9s340iWp3MSm3NZrGDXPBAEATVKCAIAmKUEAQJOUIACgSUoQANAkJQgAaJISBAA0SQkCAJo0K5cl3v2xszozK8vm1LEmk+e0BPG51v/O6lRuxY+u7ds5R7GQcO4/5BY03n7t8lTupPddPYNp9lBKLldr30654acvSOUm5ufOufxnr5rJOE2qu3b19XhPX3ROZ2bH0tyXgsP/uI3r+cgPnZ/KLf794d8f5ZUvS+Xqjbf17Zx3/z+5++OknxjB58e5L+/O3HrlC37IM0EAQJOUIACgSUoQANAkJQgAaJISBAA0SQkCAJqkBAEATVKCAIAmKUEAQJNK7eO22S4Ly6K6ulzYmdvyVys7M4vefGc/RmIIxhYsSOXqztym3PrM093nfMWpqWNN3XJHKre/e/SS3MbXIy9rYyNwv933y7n7d/l/Gf79u+Pfdm9/n//n/dv83m+9IxalcpOPbRnwJLPDnZd1bwCPiFh5ybUDnmTw7kn89IgT33lTZ2ZtXRPb6pa9ruD3TBAA0CQlCABokhIEADRJCQIAmqQEAQBNUoIAgCYpQQBAk5QgAKBJShAA0KRZuTF6Nnvo06d1Zo5+67ohTLJvdr753FRu/t1bU7nHzjmyM7PoU7emjjW1fXsqt7/b8DMXpHLLfuXKVK7MnduZqbty27j7LbO5e+PrcxuBl33ukVRuct36VG622npxbvv04Zf3b/t07/DDU7nJrbnHhf3d1Gu6NxVHRIz9c/e24gPB9u8+L5Vb8ImrBzzJvrExGgBgD0oQANAkJQgAaJISBAA0SQkCAJqkBAEATVKCAIAmKUEAQJOUIACgSTZGHyDu/lhuw+lJ78xtOF1/+atSuZW/80xnpl77ldSxxo95aSr34FuXd2YmXv946lg/97K/TuXedsgTqdyrb/mOzkz946NSx1rw8dz21S3/vnvD8KKP9m+7cETEpsTm9IiIqSu7NxG/9P/ObcburTwplXvk1d337+LPfjV1rMnHtqRy+7vxE5enclOPPJbLNbL9nf2DjdEAAHtQggCAJilBAECTlCAAoElKEADQJCUIAGiSEgQANEkJAgCaNDuXJZa97jR6ruzcY71cbmoyFesddmhnpi47OnfKW+9I5XjxNv/IBancUb+XW9SX1TttRWdmct36vp4zo8w5KJXrLc0tctx1Ui7X+/sbUrl+6uc1eOi9uc+jBW/YlModctE9qRzMJtnHjzrRvTx3d3B4vSNihssSSynHllK+VEq5vZRyWynlPdO3LyqlfKGUsn761+7VsAAAs0Tmn8MmIuK9tdbTI+K8iHh3KeX0iLg0ItbUWldExJrp9wEA9gudJajW+lCt9Ybpt7dHxLqIOCYi3hIRl0/HLo+Itw5qSACAfntRL4wupSyPiFdGxNqIWFJrfWj6Q5siYklfJwMAGKB0CSqlHBIRfx4RP15r3fbsj9Xdr67e6yudSimXlFKuK6Vc90zsmtGwAAD9kipBpZQ5sbsA/Umt9S+mb364lHL09MePjojNe/t/a62X1VpX1VpXzYm5/ZgZAGDGMt8dViLiDyNiXa31N5/1oc9GxMXTb18cEZ/p/3gAAIMxnsi8OiK+NyK+Ukq5afq2n4mIX4uIT5ZS3hUR90fE2wYzIgBA/3WWoFrrP0fEC20vTGw+BACYfWbnxmggbee3nduZmfeX1/T1nGNnnZ7KTd10e2dm/MTlqWNN3HNfKgezTh9/csHY/Pm5Q+3YkTtnA2a0MRoA4ECkBAEATVKCAIAmKUEAQJOUIACgSUoQANAkJQgAaJISBAA0SQkCAJqU+dlhs9KdH+nekhsRsfKHc5ty1394dSq34sfWpnKz1SM/fH4q9/j5u1K5Fd93w0zGGbmnLzonlTvob68d8CTPN/Was1K5fm+Dzshsgs4axSbo7J+DxR+5qq/nnfzmV3Vmel8a/p+p3mkrUrnJdetTucd+IHf/HvEH/b1/Z63EJuj0oUawCbqsOiOVq9fdmspte8d5qdzCK65O5WbCM0EAQJOUIACgSUoQANAkJQgAaJISBAA0SQkCAJqkBAEATVKCAIAmlVrr0E62sCyqq8uFQztfRMTGSy9I5Z4+68lU7oS33zKTcQYmu1jvoAceS+Ue/NZjU7mlX97amSlPT6SOlV3ENgoPfur0VO6UIzd3ZrZ/06MzHWfkekuOSuUmH+6+P9h/3PXB3JK7+Q/k/n599G9eOZNxRm7iwrNTuaeOmpPKDWM54P5k+3d3f74t+ET3fba2roltdUvZ28c8EwQANEkJAgCapAQBAE1SggCAJilBAECTlCAAoElKEADQJCUIAGiSEgQANOmA3xjNc/UWLkzlJrdtG/Ak++7rbzm3M/OSz1wzhEnateXfn5/KLfroVQOe5Pnq+Wd2ZspVNw9hkufrnXJyZ2biiPmpY5UrR/N7mK3Glx2Tyq37yWWdmRU/tnam4zxX2euy4ucb4tfjltgYDQCwByUIAGiSEgQANEkJAgCapAQBAE1SggCAJilBAECTlCAAoElKEADQpFm5MXrs4IM7M1NPPdWPkf63Hd+5OpU75NPXd2bqxMRMx3nRZvMG33575vVnd2ae+s9PpI712C2LU7kTL83db73F3cebfOSR3LGOPCKVm3z0sVSuFb3DD+/MTG7dOoRJZoddbzqnMzN3667cwa6+JRX72i9ckMotvKf7689h/334j1ljrzg1lZu65Y4BTzI73HtF9xb2iIgT3pHbYr7j3+a+3s7/8/5s7rYxGgBgD0oQANAkJQgAaJISBAA0SQkCAJqkBAEATVKCAIAmKUEAQJOUIACgSbNyY3TG5h/JbSQ96veu7Mv5Zruxs05P5aZuun3Ak8wO2955Xiq38GNXp3Jf+9OXp3LHfddXUrl+euaNqzozcz5/XV/P+eTbcvfvIZ9M3L/nvSJ30uS2Yl688WXHpHL3fd/xqdzyjz+Yyk3cc18qt78bmzcvlZvauXPAkwzW0/+m+7EoIuKgv+vv41EXG6MBAPagBAEATVKCAIAmKUEAQJOUIACgSUoQANAkJQgAaJISBAA0ab9dlggHut5pK1K5J085vDPzkk9fM9NxAPZLliUCAOxBCQIAmqQEAQBNUoIAgCYpQQBAk5QgAKBJShAA0CQlCABokhIEADRpfNQD7M3YvHmdmamdO4cwCYzO5Lr1qdxL1g14EA54YwcfnMpNPfVU7niJx/CI3ON4mXNQ6lj1madTOXg2zwQBAE1SggCAJilBAECTlCAAoElKEADQJCUIAGiSEgQANEkJAgCapAQBAE2alRuj+7kN+tFLzk/ljn7nfanchj8/oTOz5LevTB2rn8ZecWoqN3XLHancXf/fK1O5lT/Qva7Ydu/9x/ixy3LBWlOxiQ0bZzANw5LdBL3xpy5I5Y75QO4xsHfYoZ2ZycefSB3rQJDZ3J29VuR4JggAaJISBAA0SQkCAJqkBAEATVKCAIAmKUEAQJOUIACgSUoQANCkUpNLz/phYVlUV5cLh3a+QSjj3fsl68TEECbZ45yvPiuV237cvFRu4RVXp3I7vnN1Z2b+n61NHaufnnnjqlRu3oZtqdzWMxelcg9f9HRnZsXFN6SO1U9lzkGpXH2me/6IiF1vOieV23rKnM7M0t8a/nLRUemd3L1sdfKue4cwCf+SX7n3mlTuZ044t6/nnbjw7M7M+Jrr+3rOjLLqjFSuXndrKvfID+eWGB929zOdmTmfv64zs7auiW11S9nbxzqfCSqlzCulXFNKubmUclsp5f3Tt59QSllbSrmrlPKJUkruURYAYBbI/HPYroh4Xa31zIg4KyIuKqWcFxEfiIgP1lpPjoitEfGuwY0JANBfnSWo7vbk9Ltzpv+rEfG6iPiz6dsvj4i3DmRCAIABSL0wupTSK6XcFBGbI+ILEXF3RDxea/3Gi182RMQxgxkRAKD/UiWo1jpZaz0rIpZFxLkRkfuR5RFRSrmklHJdKeW6Z2LXPo4JANBfL+pb5Gutj0fElyLi/Ig4rJTyjW+VWhYRG1/g/7ms1rqq1rpqTsyd0bAAAP2S+e6wxaWUw6bffklEvCEi1sXuMvSd07GLI+IzgxoSAKDfupfeRBwdEZeXUnqxuzR9stb6V6WU2yPi46WUX4qIGyPiDwc4JwBAX3WWoFrrLRHxyr3cfk/sfn0QAMB+Z6gbow8dX1zPX/iWztzk4090ZsrZL0uds15/Wyo3m/UOO7Qzk7nPYNju/8XuzbDH//xVfT3nfb/Ufc7lP9vfc47Cpv90QSq39IPD38jd0uMzs9+MNkYDAByIlCAAoElKEADQJCUIAGiSEgQANEkJAgCapAQBAE1SggCAJilBAECTMj87rG/q5GTfNhv3e9Ponb+X+wkgK3/kmv6dtOx1geXz9HMb9D2/1r1NNyLixEtn70bdDT/dvSn36cNym9BP/Kn+/j4nX/uqzsz49l2pY2U/x8decWpnZuqWO1LH6rfFN04N/ZwnfnJrZ+bJ71idOtbBf7F2puMMTHYTdO+Uk7tDD21OHWvDD56Ryh39G8PfUt1XY71cbmoyFestOSqVu/vDSzszEw8dnDrWyT9+dSrXOs8EAQBNUoIAgCYpQQBAk5QgAKBJShAA0CQlCABokhIEADRJCQIAmqQEAQBNKrXmNuv2w8KyqK4uFw7tfC0ZP/7YVO6ei3O5E//wvlRuYuODqVw/9V52Smfm8TMOTx1rwSeGv1V1bP78VG5qx46+nbOc8/JU7sF/tSCVm80bgTP3bz/vWward+QRqdzko4/17ZxlPPfDFHrLXprKTdz3tZmMM3LZx4967VcGPMm+WVvXxLa6Za8/osEzQQBAk5QgAKBJShAA0CQlCABokhIEADRJCQIAmqQEAQBNUoIAgCZZlvgijS87pjMzsWHjECYBWjZ+4vJUbuKe+/p2zlEs+hxfuiSVm9j0cP/OeUxyCeIIlsXy4lmWCACwByUIAGiSEgQANEkJAgCapAQBAE1SggCAJilBAECTlCAAoElKEADQpPFRD7C/sQ0amA36uQk6q5+boLP6uQk6fU6boAdqFNvOX4hnggCAJilBAECTlCAAoElKEADQJCUIAGiSEgQANEkJAgCapAQBAE1SggCAJtkYzYw89X+s7swc/Km1Q5iEYVr/293XPSJixX+cnde+97JTUrnJ276ayq3/3eT98e7u+6N3xKLUsSYf25LK9dPmd1+Qyh31u1cOeBKGaezM01K5qZvXpXKj2Hb+QjwTBAA0SQkCAJqkBAEATVKCAIAmKUEAQJOUIACgSUoQANAkJQgAaNKsXJbYW3lSZ6Zs35E61sSmh3MnrTUV6518Qmdm8q57c+fso6+/9dxU7iWfvqav552cW/p6vH554nvOS+UO/ZOrBzzJ7LDrTeekcnM/d20qd8KnJ2YyzshllyBmZZYgZqWXIJbcn73eUYu7z/nw5tSxWlmCuPlHk0shf6e/98fUv35lZ2bsH27s6zkzsksQs3pHHpE77+NPdGbqxMweizwTBAA0SQkCAJqkBAEATVKCAIAmKUEAQJOUIACgSUoQANAkJQgAaJISBAA0qdTkpuR+WFgW1dXlws5cb8lRnZmdZx6XOuecz1+XymWNH7usMzPxwIa+nrOc8/LOTL32K309JwzLxOvOTuXGv3j9gCehS+axOSK/gTpj2zty298XXpHb/v7Af+neBn3sL7exGbsVa+ua2Fa37HXFumeCAIAmKUEAQJOUIACgSUoQANAkJQgAaJISBAA0SQkCAJqkBAEATVKCAIAmjY96gL0pY93dbOuKg1LHOurzuXOu/1BuK+mK/3Rt7oB9lNkGfe+vnp861qEvfyyVW/TmO1O5r7/l3M7MvM27UscqV92cymX0jjwid86XvCSV6/cW8GF78H3dW3IjIo78NxtTuYPecP9MxnmOscmpvh2r3x742dz9duwv7d8bhh97V+7x430/+fFU7o9OOX4m4zxHdhN0VmYb9DNvXJU6Vr9/IsHkN7+qM9P70g19PWfGxIXJre5r9r+t7p4JAgCapAQBAE1SggCAJilBAECTlCAAoElKEADQJCUIAGiSEgQANEkJAgCaVGqtuWApvYi4LiI21lrfXEo5ISI+HhFHRMT1EfG9tdan/6VjLCyL6upy4QxHHq3e4Yd3Zia3bh3CJM+1883dm5sjIrauzC0JP/ZTuc3BE/f2b3NwP42deVoqN3XzugFPMjs89R2rU7mD/2JtKrfrW89J5eb+9fA3rPPiZTesTz6a2zi/vxs749RUburWOwY8yf5l/PhjU7mJ+x8Y8CTPtbauiW11S9nbx17MM0HviYhnf8X4QER8sNZ6ckRsjYh37fuIAADDlSpBpZRlEfGtEfEH0++XiHhdRPzZdOTyiHjrIAYEABiE7DNBvxURPxkR3/hJh0dExOO11onp9zdExDF9ng0AYGA6S1Ap5c0RsbnWuk8/HraUckkp5bpSynXPRO6niQMADFrmVbKvjohvL6V8S0TMi4iFEfGhiDislDI+/WzQsojY6ytpa62XRcRlEbtfGN2XqQEAZqjzmaBa60/XWpfVWpdHxNsj4ou11u+JiC9FxHdOxy6OiM8MbEoAgD6byZ6gn4qI/1xKuSt2v0boD/szEgDA4OWWxkyrtf59RPz99Nv3RERuOQ0AwCyTXpbYDwfCskRevLEFC1K5qe3bBzwJwza+LPFNoxMT3aHTwsYAAA2bSURBVJmImNj08Ayn4YWMHXxwKvfUhWekcvP+8pqZjPNcY71cbmqyf+c8AIwfuywXTHSAiQc35Y41gmtQVnV/Tl592/8b23Y8OONliQAABwwlCABokhIEADRJCQIAmqQEAQBNUoIAgCYpQQBAk5QgAKBJShAA0CQbowGAA9bauia21S02RgMAfIMSBAA0SQkCAJqkBAEATVKCAIAmKUEAQJOUIACgSUoQANAkJQgAaNL4qAfYV09+1+pU7pA/XdvX8275/vM7M4v+6Kq+njPjmTeuSuXmfP66AU/yfL0jFqVyk49tGfAk9Mv9v9j95yAi4vifH/6fBUbvgZ+9IJU74rbJzszBn+rvY3g/Pfi+3O/zpb9+5YAnmYGy10XKz430eqlD1YmJmU4zdJ4JAgCapAQBAE1SggCAJilBAECTlCAAoElKEADQJCUIAGiSEgQANKnUWod2soVlUV1dLuzMbXpP9wKqpR/q7/KpqW96ZSo39k83dmYsB9x/PHpJbunfU0d3LxSLiDju/cNfijY2f35nZmrHjtSx7vxv56RyJ358KpUbX3N9Kjdb3f0nuceFk76n+3Gh36Zec1Yq19vVvZBwcl5ub27m8Y999/CPdX/te+aQ3LGW/Ur/Hovu+Vjuc+3Ed97Ut3P209q6JrbVLXt9EPdMEADQJCUIAGiSEgQANEkJAgCapAQBAE1SggCAJilBAECTlCAAoElKEADQpFm5MZrnquef2ZkpV908hEn2TWYDeER+C3g55+XdoRvXpY5VJyZSuayxM0/rzjy2LXWsiQ0bU7l6QeLz48rZ+/nBc40tWJDKTW3fnspNvvZVnZne39+QOhaD9czrz+7MzPmfuS3sZdUZqdy9P9H9XMjxH849X1K+bGM0AMB+QQkCAJqkBAEATVKCAIAmKUEAQJOUIACgSUoQANAkJQgAaJISBAA0ycboaZs+3b3pNyJi6Vtzm4j3d3f/+nmp3Envu3rAkzxfZqvq5rPnpo51zAeSW6rPflkqd+f3dW/7XfGe4d9nWes/vDoXXJjbtL3i3+W22/bVuYmN4td8ZfBz7EfG5s1L5Xb9q9wW4gdeNyeVO/HSq1K52ern78lt2n7vz/9IKnfEl77WmZnY+GDqWP00dsapqdzUrXcMeJJ9Y2M0AMAelCAAoElKEADQJCUIAGiSEgQANEkJAgCapAQBAE1SggCAJilBAECTDviN0b1TTk7lJr9614AnYX+2+UcvSOWO+p3cBurZ6oGfy/0+l//2banc5ONPzGScgdn2jtxG9IVX9He796OXnN+ZOfKy/XuLMoNVxsdTuTqR2+reAhujAQD2oAQBAE1SggCAJilBAECTlCAAoElKEADQJCUIAGiSEgQANOmAX5YIcEAa6+VyU5OdkTLnoNSh6jNP584J/5I+fu5mjrV28vOWJQIAPJsSBAA0SQkCAJqkBAEATVKCAIAmKUEAQJOUIACgSUoQANAkJQgAaNL4qAcAYB9ktukmHRCboPu5hZjB6uc1mOGxPBMEADRJCQIAmqQEAQBNUoIAgCYpQQBAk5QgAKBJShAA0CQlCABokhIEADQptTG6lHJfRGyPiMmImKi1riqlLIqIT0TE8oi4LyLeVmvdOpgx2Z+VOQelcgfE1lpgNJKbg8eXH9eZmbjva6ljbX73BancE+fuTOVWXHxDKjdsm3489/ssyeXNTy6fSuVOeu/VuQPOwIt5Juiba61n1VpXTb9/aUSsqbWuiIg10+8DAOwXZvLPYW+JiMun3748It4683EAAIYjW4JqRHy+lHJ9KeWS6duW1Fofmn57U0Qs6ft0AAADkv0p8q+ptW4spRwVEV8opdzx7A/WWmsppe7tf5wuTZdERMyLg2c0LABAv6SeCaq1bpz+dXNEfCoizo2Ih0spR0dETP+6+QX+38tqratqravmxNz+TA0AMEOdJaiUMr+UsuAbb0fEGyPi1oj4bERcPB27OCI+M6ghAQD6LfPPYUsi4lOllG/kP1Zr/dtSyrUR8clSyrsi4v6IeNvgxgQA6K/OElRrvSciztzL7Y9FxIWDGAoAYNBKrXt9PfNALCyL6urS3Zt6p5zcmZn86l39GOlFm3jd2Z2Z8S9e39dzllVndGY2n7Mgdawll9+cyk099VQq14re6StTucnb7xzwJIP1yA+dn8p9fWlJ5Y77hStnMs7AZP5MRUQ8sfKQVG7b8blvtF32q7Pz/ui38WXHpHITGzYOeBK6TL72VZ2ZiYN7qWPN/ZtrZzrOc/ROW9GZmVy3vjOztq6JbXXLXh+0/NgMAKBJShAA0CQlCABokhIEADRJCQIAmqQEAQBNUoIAgCYpQQBAk5QgAKBJmZ8dNnSj2gadsfFfz+3MHP/F/p5zyxnd26AXf+Sq1LGmZjrMnsf7pld2Zsb+6cY+n3X4+rkJevKbuze0RkT0vnRD3845fvTSVG7x7+c+j7Lu+6XuDdTLfzZ5zpLbUh2JLfj1ultTh1p4Xe6UC3OxZmQ3QZezX9aZqdffNtNxmpTZthwRseXE7q9piz7a38eFrPL1XZ2ZzHbysmnOC37MM0EAQJOUIACgSUoQANAkJQgAaJISBAA0SQkCAJqkBAEATVKCAIAmKUEAQJNKTWxX7ZeFZVFdXS4c2vlmu97Kk1K5yTvvHvAkz7f+w6tTuRU/trZ/J+3jRuDx5celDjVx39dy52SfPP693RujD7/i2tSx6sTETMcZufGlS7pD87o3+EaM5nN3bEH39vqIiHrq8lzu2q90ZrZ8f/fnUETEEbdsy50zsYE683kbEXHY/xjNJuVhe+o7cl8P3v2rn0zl3n/FO1K5hXd3P9ZnrsHauia21S17/QLjmSAAoElKEADQJCUIAGiSEgQANEkJAgCapAQBAE1SggCAJilBAECTlCAAoEk2RgP7hd6KE3PBLY93RnZccHLqUJNzc1vM5/9ZbnN6ffVZnZny5ZtSxxqJPm5177fxo5emchMPbRrwJMw2NkYDAOxBCQIAmqQEAQBNUoIAgCYpQQBAk5QgAKBJShAA0CQlCABo0vioB4DW9BYuTOUmt20b8CT7l8n19/TtWC/53A2pXJ2Y6Ns5I2b5IsSMESxBzJrcsnXUI7ygr/3CBanccb9w5YAn2b+U8e6KMtM/o54JAgCapAQBAE1SggCAJilBAECTlCAAoElKEADQJCUIAGiSEgQANEkJAgCaVOoQN4CWUh6JiPv3uPnIiHh0aEOwN67B6LkGo+cajJ5rMHoH4jU4vta6eG8fGGoJ2usApVxXa1010iEa5xqMnmsweq7B6LkGo9faNfDPYQBAk5QgAKBJs6EEXTbqAXANZgHXYPRcg9FzDUavqWsw8tcEAQCMwmx4JggAYOhGVoJKKReVUr5aSrmrlHLpqOZoTSnlo6WUzaWUW59126JSyhdKKeunfz18lDMeyEopx5ZSvlRKub2Uclsp5T3Tt7sGQ1JKmVdKuaaUcvP0NXj/9O0nlFLWTj8mfaKUctCoZz3QlVJ6pZQbSyl/Nf2+azBkpZT7SilfKaXcVEq5bvq2Zh6PRlKCSim9iPjdiHhTRJweEe8opZw+ilka9McRcdEet10aEWtqrSsiYs30+wzGRES8t9Z6ekScFxHvnv7cdw2GZ1dEvK7WemZEnBURF5VSzouID0TEB2utJ0fE1oh41whnbMV7ImLds953DUbjm2utZz3rW+ObeTwa1TNB50bEXbXWe2qtT0fExyPiLSOapSm11n+MiC173PyWiLh8+u3LI+KtQx2qIbXWh2qtN0y/vT12fwE4JlyDoam7PTn97pzp/2pEvC4i/mz6dtdgwEopyyLiWyPiD6bfL+EazBbNPB6NqgQdExEPPOv9DdO3MRpLaq0PTb+9KSKWjHKYVpRSlkfEKyNibbgGQzX9zzA3RcTmiPhCRNwdEY/XWiemIx6TBu+3IuInI2Jq+v0jwjUYhRoRny+lXF9KuWT6tmYej8ZHPQCzS621llJ8y+CAlVIOiYg/j4gfr7Vu2/2X4N1cg8GrtU5GxFmllMMi4lMRceqIR2pKKeXNEbG51np9KeW1o56nca+ptW4spRwVEV8opdzx7A8e6I9Ho3omaGNEHPus95dN38ZoPFxKOToiYvrXzSOe54BWSpkTuwvQn9Ra/2L6ZtdgBGqtj0fElyLi/Ig4rJTyjb8YekwarFdHxLeXUu6L3S+HeF1EfChcg6GrtW6c/nVz7P4LwbnR0OPRqErQtRGxYvo7AQ6KiLdHxGdHNAu77/uLp9++OCI+M8JZDmjTr3v4w4hYV2v9zWd9yDUYklLK4ulngKKU8pKIeEPsfm3WlyLiO6djrsEA1Vp/uta6rNa6PHY//n+x1vo94RoMVSllfillwTfejog3RsSt0dDj0ciWJZZSviV2/5twLyI+Wmv95ZEM0phSyhUR8drY/ZOCH46I/xoRn46IT0bEcRFxf0S8rda654un6YNSymsi4p8i4ivx/78W4mdi9+uCXIMhKKW8Ina/2LMXu/8i+Mla6y+WUk6M3c9KLIqIGyPi/6y17hrdpG2Y/uew99Va3+waDNf0/f2p6XfHI+JjtdZfLqUcEY08HtkYDQA0ycZoAKBJShAA0CQlCABokhIEADRJCQIAmqQEAQBNUoIAgCYpQQBAk/4Xaw/wxo7fJlIAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "stream", + "text": [ + "Loss train= 1.8867101669311523\n", + "Number of Correctly identified Training Set Images 45009 from a set of 55000. \n", + "Accuracy= 0.8183454545454546 \n", + "torch.Size([1, 1, 28, 28])\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "86169559e322466f9868a541c1f6724c", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.6459505558013916\n", + "Number of Correctly identified Validation Images 4896 from aset of 5000. \n", + "Accuracy= 0.9792 \n", + "torch.Size([1, 1, 28, 28])\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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cqaIfCL3c79OROY551pFZF5uG6X1GRFZesj2N0TkW865qSKyXUSursis0uPbIvJL59yxInKi9NwXPA/KRFXHi8inRWSmc+4EEcmIyPuE50Gp/UBELsqr9fa4f4eItOb+my0it5dpjhVR7neCTheRFc65Vc65gyJyr4hcVuY5pI5zboNz7pncn3dLzwv/eOn52c/N7TZXRGZVZobpoKotIvJOEbkjt60icr6IPJDbhfughFR1mIi8WUTuFBFxzh10zu0QngflVisig1S1VkQGi8gG4XlQUs6534nItrxyb4/7y0TkbtfjKREZrqpjyzPT8iv3Imi8iKw7ZLstV0OZqOpEETlZROaLSLNzbkPurzaKSHOFppUW/yoi14pId267SUR2OOe6cts8H0prkohsFpF/z30keYeqNgjPg7Jxzr0mIv8sIq9Kz+Jnp4gsEp4HldDb4z5Vv6cJRqeIqh4lIj8Rkc8653Yd+neup1cC/RJKRFUvEZF259yiSs8lxWpF5BQRud05d7KI7JW8j754HpRWLndymfQsSMeJSIPYj2lQZml+3Jd7EfSaiEw4ZLslV0OJqWqd9CyA/sM592CuvOn1tzlz/2+v1PxS4BwRuVRV10jPx8DnS08+ZXjuYwERng+l1iYibc65+bntB6RnUcTzoHzeJiKrnXObnXOdIvKg9Dw3eB6UX2+P+1T9ni73ImiBiLTmvgkwQHoCcT8r8xxSJ5c9uVNEljrnvnnIX/1MRK7M/flKEXm43HNLC+fc9c65FufcROl53D/mnHu/iDwuIpfnduM+KCHn3EYRWaeq03OlC0RkifA8KKdXReRMVR2ce116/T7geVB+vT3ufyYiH8p9S+xMEdl5yMdm/U7ZO0ar6sXSk43IiMhdzrmvlXUCKaSq54rI/4rIC/KnPMoN0pMLul9EjhaRtSLyHudcfngOCVPV80TkC865S1R1svS8M9QoIs+KyAeccx2VnF9/pqonSU8wfYCIrBKRq6TnH4M8D8pEVf9BRN4rPd9afVZEPio9mROeByWiqveIyHkiMlJENonI/xeRh8TzuM8tTr8jPR9T7hORq5xzCysx73LgshkAACCVCEYDAIBUYhEEAABSiUUQAABIJRZBAAAglVgEAQCAVGIRBAAAUolFEAAASKX/A70pp5fIAwgCAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:43: UserWarning: nn.init.xavier_uniform is now deprecated in favor of nn.init.xavier_uniform_.\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "Loss train= 1.7053251266479492\n", + "Number of Correctly identified Training Set Images 52016 from a set of 55000. \n", + "Accuracy= 0.9457454545454546 \n", + "torch.Size([1, 1, 28, 28])\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "40180487115c473a872d7c896bacb3ff", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Loss val= 1.5884579420089722\n", + "Number of Correctly identified Validation Images 4912 from aset of 5000. \n", + "Accuracy= 0.9824 \n", + "torch.Size([1, 1, 28, 28])\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + }, + { + "output_type": "stream", + "text": [ + "Loss train= 1.6423791646957397\n", + "Number of Correctly identified Training Set Images 52775 from a set of 55000. \n", + "Accuracy= 0.9595454545454546 \n", + "torch.Size([1, 1, 28, 28])\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "02ec7b2afb7d4456bbfed4efe0ed3df4", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=1.0, bar_style='info', description='Validating', layout=Layout(flex='2'), m…" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "Detected KeyboardInterrupt, attempting graceful shutdown...\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "1" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 17 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "n-JXnWy0oQi6", + "colab_type": "code", + "outputId": "3c5e11aa-f17d-421a-edba-f050053c0573", + "colab": { + "resources": { + "https://localhost:6006/": { + "data": "PCFkb2N0eXBlIGh0bWw+PCEtLQpAbGljZW5zZQpDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLT48aHRtbCBsYW5nPSJlbiI+PG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDx0aXRsZT5UZW5zb3JCb2FyZDwvdGl0bGU+CiAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQU1RQUFBREVDQVlBQUFEQXBvNXJBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQmFiZ0FBV200QnhXc2pPQUFBQUJsMFJWaDBVMjltZEhkaGNtVUFkM2QzTG1sdWEzTmpZWEJsTG05eVo1dnVQQm9BQUJsMFNVUkJWSGljN1oxNWVGVFYzY2MvdjVzRkNWUnhxVnRwdFZXMlZseGY2MXF0aXEwTDlHbDlOWFVCRkVwRlJUSWhoQkFEQ1RkQU1BRWtDWXNLN3FCOStrRDcycWZCV2l2cVc3VmE2NzRpcmU5cmF4WDFiWlZXWlRITC9ONC81ZzRHU0dEdXpMMXo3NTA1bjM4NHpNdzU1OHZNL1hLMjN6a0hESUdqaXpoUEYzRmUwRG9NSUVFTHlHZDBQb093YUFBdWNWNWFoMFc1VlBCNmtMcnlHV09JQUZDYi92U2pFcWdHK3V6d0t3Z2R3QzEwVUNmVi9Ec1loZm1MTVVRV1VSdUxFa1lEOHhFTzJ2N0dqb1p3UHN4SFdNeGhJRXVsbEs1czZzeG5qQ0d5aEM3Z0pKUlc0Q1NnWnhQMG5INEppNWlVODdqZkdnM0dFTDZqVFF3RTVnR2prVzdmZCtxR1NMS1dJc3BrTW0vN0lOUGdZQXpoRTJwVFFoK3FzS2dDK2dMdVRiQnJlaXV3bUhZYVpEcWZlaXJZQUJoRGVJNHFRaU1YQXdzUUR2UEFCRDJsTnlMVXM0bmJ4U2FldVdwREVtTUlEOUViT1FGb1JUaHQrNHYrR0NMNTU3TkF1Y1I0S2kzQmhsMHdodkFBYmVBUUxHeGdBbUQ1YW9MdTZjU2ZpdkFMbEVxSjhZNUw2WWFkTUliSUFMVXBwb2hyRVdZajdMMzlqZXdhSXBuZWpMS1F2V21VY1d4TDZSOWcyQVZqaURUUnVZekNvZ1g0QnBBOUUzUlA5L3orMzRHWlVzYktYcVFiZG9NeGhFdTBnYU1SbWxITzl2QUIvNk9UT3RrRFF5VFN5aU1vNVJManRaNytIWWFlc1lJV0VCWFVaaitkU3l2d1BNclpIaFc3RVdFaW4zRWFVemtWb1JUNG15Y2xDK2RnOGJJdVphWGV3b0dlbEprSG1CWmlENmhOSVVXTVIya0FEdkNvVmRpS3NKajRydXNKdXB3U1BxTUtxRUtjOVl2ZXlrbTl6azFBRXdmU0xLVzBZK2dWWTRqZG9QV2NnMFVMd2xIYlg4emNFR3NSeW1UYTdsZWN0WW1CRkRrcjNPeXd4cDJPSVpMcERRaFQ1VG9lMkYzZCtZd3hSQS9vSEFaQnQ3QnNiMXFGRnltZ1hDcmR4U1RwSXM0RVdoQ08zYVhNOUxXc280Q1lYTU1iYnJUa0E4WVEzVkNiL2dpVnlFNWgyWmtaNGlPRU9SeWVmdFNxMmxnTVlEVEtmT0FnajNSMW9OeENJWFV5MFlTWkp6R0d3SG5nTE9lQjZ5a3NPNzBITC9IQWlYZjdHblFaL1dudndiRHBhd1NjTVBQOVRKZzVHRU9nczFNSXkzYi9zSzBqVGt4cS9PbVNhQ3VEVUJxUTdUdnR2T2pXdlloUUx0ZmtkNWg1M2hwQ2JSZGgyYWsvVkJ0UUtxU0czM2dxdGhlMGxYT0FGdUFvRDlkRTFsSkFtZncwUDhQTTg4NFFhbE1DenJSbXFtSFplMzZRTmlFMDhUbk5ZbWQzV2xOdEN0bVg4WWd6TGR5N1JqZnBSSmg1RVEzeWsvd0tNODhiUXlnSWRWeU14UUxVWlZoMjcrOTNvdHlKTUZOcStJZlhtdDJnaTlpUFFtWUIxeUVVYm44ak0zTzhoMUxEUkZhSm9KNEtEaWw1WVFpdDVRUWtnN0Rzbmw5N0ZJdHlxZVpWVDhWbWlDNWhLRW96NGh4cjQwMVg2bG1VbUZ6RDB4NUtEU1U1YlFpdDRSQ0tzTkVNdzdKM2ZPMHRsQnFaeVJxUDVYcUtMbVlVUWd2aUJCOUNwdVpRNEY0NnFKSkpmT0NwMkJDUms0WlFtMkk2UFF6TFR2eVpDSy9laHh1bGpNODlsdXdMYWxQTS9zNzNBSHQ3MUZwc1JsaElZVzZHbWVlY0lYU0c1MkhaY1lUN0VLYkpERDcwVm0xMjBPVWNRZ2MyNHJTVTRNWDM4aFpDalV3SWQwdnBscHd4aE43QVVBcG9Cczd6Y0FyeUdaU1kxUEdNaDFJRFEyOTJ0cmdxcDNuMkhWazhTcHdwOGxOZThWQnFZRVRlRUdxekh4M01RcmdPbk5tVnpIL3NkNEVaMU9iZTdJb3F3aTNPSVFod0dPREY5OVdKT0xOdDQ0T2RiY3VVeUJwQ2JRcnBZRHg0R3BhOUJWakFsMmlTQ3JaNktEZDA2SEpLNktRS1NTSE1QTlcweFNiaU5MRjNkTVBNSTJrSXJYRldhTDBMeTFiZ0Z4UXdUV1o2dEVFbkl1amlGTUxNM2FZVFllWVZNaTQ3Sy9aZUVpbEQ2RXdHRWZjOExQczVMTXFsamo5NHB6UjY2TTJjNlV4RzdCcG03amI5eFd2cktLUk14ckxlTzZYK0VnbERxTzFFZVNyVkNIMjJ2NUdaSVRZQzlXQU8rMHFpTmhZSE80Y3hkdzh6aDB6V2JSSlJ2eDNSQ0RNUHRTSFV4bUlybzdHY0h3aThhQlhhZ1ZzcFlhWTVEckpuZEJuOXNhakVjc0xNSVJOREpFbUVtZmNOZDVoNWFBMmhOM1FMeS9adUduVXRRa3hzL3RkRHFUbUwzc29neE9taVptNklaUG9GbEhJWnh4TmVhdldLMEJsQ3F4aUkxVzJRQjE2MENpK2hsTXNjZnUrcDJEeEJWekRDaVk5S1RHSmtab2hrZWkxeEpzczQvdXFsMWt3SmpTSFVwb1F0empRZzlQV29WVWhzMzF6UFVsa1QzbVk2Q3FoTklWOXhUaDhSSjh3Y01qRUVKS2E1bDlDWHVWTEtaOTRxVG8vQURhRWdUT05peEZrb2N2K2w5cFJPWEV2VlRwMDBoWDhnRnlYMGR2WkRtUVZNQWdveU5FUXkvUjVDRGFPRFh3Z04xQkE2bFJPd2VnbkxUdDhRNnhES1pZNjV1TkJQOURhR0FZdVFicmVuWnY3Yi9RbUxtSXplZnBKaDFnbkVFRnJ1aEdYdjdyUnM5MS9xQnVKTWxYbm16S0Zzb3JjekNweGdTbTlhZDBXY01QTngyUTh6ejZvaG5PN1JOSlJhaFA0OXFuRC9wWDRNMUZQRXpXTFQ2YTFpUXlyb1hleEZuQXJnQnFDL1IrTy9UN0NZUXhHTHN4a0drdlVXUWlzNHpqa043NHdlVmFSdWlFUllkaEdWWXZOL2ZtZzF1RU9YY3dpRlBvV1pYNUdkTVBQQXhoQmF5U2lFVnVEcnJnMmhQSW93UmVibFJzaHhycUYzY3dKZHp0alF1eldrUjFIS1piUy9XM2FESFZUYkZMT1pheEhtQUYvYVFWSFBYOHhiV05SSVEyNXRTc2xGVkJIdTlpSE1ITzZraUpsUzZrK1llZURUcmdCYXhhSEFMR0FDMG1OVG05aTJXRXlqMkxtM2JUR1gwZVdVVUp6aWFlYXBwemVoMUhNb3krUXNiOGVOb1RCRUVxM2lQNXh1MUttT3NzVEc5aTZxWkVIdWJtelBCL1EyQmxMTVBOVERNSE40RTRzS3VaUUh2ZElaS2tPQU14TTFuVEVJRjJOaHl6eGVDRnFUd1R2MExyN3JoSmtmcy8zRnpNMXhQM0VxNVlyTVk5UkNad2hEN3FNMkZvYzdZZWFTUVpqNWp1a09MRzZoZzFvWnpTZnBhak9HTUFTR3JxWS9XN3VkWmc2WnR4YkMreWcyRm5la0UyWnVER0VJSEwyUFFYU2xFV2ErdXpROGowVzVsUEtrR3kzR0VJYlFvUGR3UHNJaWhLRkFwb2FBeEtYMkUrVEgzSm1xQnRlM2tHbzVFN1NjSDdyTlp6RHNDYm1TQjluSzBjQkU0SjllRkFrYzZpYUQrMnQ1bFNOUjd0Y1k2L1I2eDhrR2cwZklSRHBrREN2b3d4QmdNV1IzSDBzNmhpaHlVdWRRd0NzYW8xV3Y2eGFvWnpCNGdKVHlzWXdtUnB6aHdHK3pWYTk3UTFqYkRRRlFCSlJSeEhxTk1kWXpWUWFEZzR4bHZZem1mSVFmZ1A5NzRUTnBJYm96RUxoSHkzallkS01NZmlDWDAwWVJ3NEJ5U0grZFlVKzROd1E5R2lLQk1JSUNYdFlwTktyTlh1bkxNaGgyUlVwcGx5dG9SUmdHL3B5bDVhMGhFaFNqVE9kZnZLNHhScVlqeW1EWUhYSVpHOEdmdmRkK0dDTEpOeERhZEFwdFdzblgwNmpIWU1nNlhvMGhkc2RJdW5oZEs3Qk5OOG9RZGpLZFpVcVZ2aWl6K0lUWHRKSUwwOGh2TUdTRmJMUVEzVG1DT0d1MWdqWXQ1L0FNeWpFWWZNSFBNY1R1R0VrQmIyaWw2VVlad2tWUWhvQmtOK3BUWHRWcFhPQlJtUVpEUmdScGlDUkhvanlnVTJuVGF0T05NZ1JMdHNjUXZTT01wSlBYdFFwYkozZTdGTVZneUNMdURTRStHU0pCQ2Nvcyt2Q2FUdXQyWnFqQmtDWEMwR1hhRmVGSTRFR3RvazJuT21mNkdBeFpJSnlHK0lMRWJKVHBSaG15Uk5nTkFWQUN6S0tFVjNVNjM4OXkzWVk4SXdxR1NESUkrSzFXMDZiVCtWcEFHZ3c1VHBRTWtVQVppYkJlcTdIVnBqaFFMWWFjSTNxR1NKRG9SbTNqVmEzbWUwR0xNZVFPVVRWRWtzRUlEK2tOdE9rTXZocTBHRVAwaWJvaGtvd2t6bnF0TWQwb1EyYmtpaUVBK2dHemFPY1ZyZUhjb01VWW9va3JRMmppNEtkQ243UjR4UkRnZHpyRGRLTU03bkhYUWx3ZGVqTjBaeVN3WG1lYWJsUmVFM2QzR0lIYkxsTll1MHU5MFE5bEZsMjhyRE1aRWJRWVExYlpqRkxQTmhhNXllVE9FUHRHemhBSmxLSEE3M1FtSzdXR2c0S1dZL0FWQlZiUndTQzVERnZHdWJ1Q3paMGhPaU5xaUFRQ2pLR0FEVHFUbU5xUjZ2NFpVa0g1RXhhbnlhV01sVEc4bjA0UjdnelJGV2xESk5rSG9ZVXVudE5hVGd0YWpNRVQza1c0a2tzNVdVcDVPcE9DM0JuQ3I4MUJ3WEFNd2hOYVo3cFJrVVhaQXRSVHdHQzVsSlVpbVI5ZTVzNFE4Wnd5QkNTN1VZVzhxWFhFOUJJS2doWmtTQkZoRlVVTWxzdXdwWlN0M2hYckFyMmVvUlN3M2xXcDBVcS9oREJKYko3Q2tKZTRheUdLY3E2RjJKbGpnU2ZWWnFYYUhCaTBHRVAyeWVjeFJNK28wNDJDRFZwUFRGZWJibFErWVF6Uk93TlFXbGpQc3pxYlU0SVdZOGdPdWI1UzdRWEhvZnhCNjFtcDgvaHkwR0lNL21KYWlOUklkS002MmFCelREY3FsM0ZuQ01uN0lMbDlVVnJZd0o5MExpY0hMY2JnUGFiTGxBN0s4U2hQNlJ6VGpjbzFUSmNwZlJMZHFDN1RqY29sVEF1Uk9mc2l0UEFYbnRIWm5CUzBHRU5tdURORWVyY0g1UWZLQ1ZnOHBYTlpxVFlIQkMzSGtCNm1oZkFXQzJFTVJXelFCbUpxcDdWblBWUm9Nd09DMXBBSnVwcUQzWHplN1ErMjV6MEVycUtqY3BiOWdCYUtlVkliT1Nab01lbWdTemhVbDdLY1l1WUVyU1VkZEJWRDlHYzhRQWRUM2VSek82aDJOKzFxekhFS1NsblFJdHlnTnNXNmhCZ1dieUpjVFhvbnN3U0czc2UrZWgrTldMd0M3bSttY3JkclRDbEsreUhmTWQ5bTRER2dqUzZlb0lqSDBCemRreENuUFdnSnFhTExHSVhTQ3RHN1YxeHRMSTVnTkxBQTBnL01kTHVOTXBNeHhOc29Ed05yMlllSHhQN2lRZEZLS29EN01pZzd2QWdkUVV2WUU3cU1ZNG5UZ25KbTBGclNRZS9qTE9LMElCeWRhVm51REdGUjVHSlBVaGVKL1FWckVkcmtKcDd2N1lPeWtKOXBKWmRERHQ1aExlRnRJWFFwK3dOMXhKa0UwVnRIMFpWOERZdTVLR084NnA2Nzd6THRuczJJMHhVcTVOZXlnQTljS0xtZUxyNUw0Z1MrM0VIRDEwTG9jb3BvNXpyaTFDUHNFN1FldCtoSytpRk1BNmFqN09YbFdOV0xMdFBiQ0E4anUzYUYzQ0NOL0ZXcmFFQ1psM2doblZKQ1NNZ01vWXNad2VlMEFOOEtXb3RiVkJIdVpReEtFN2liVGsyVmRBenhSVmNvVHBzczdyMHI1Sm9TRnJDWlVoSTcxM0lES3h5RzBLVU1wb3RGS0JkRzhUOGJ2WXNUV1VVcitMczN4WjBodXJpYkl1WkxNeC83SVVac09yV1M2eENlcFB0MFgyLzdvS05Cb0dNSWJXWUFRalZkVElIb1JTdnJQWHdGdUJFWVRSWitmVmVHa0tXODZaZVE3WFVzNUdtZHhuTGdXci9yeWdvQmRablV4bUpBNXRPUVFhR3I2Y3RXeW9BWndKZXlWVzg0RjEyMlVZM3czaDQvRjRYV0lvQlpKcjJKczlpSEY0QjdpS0laN21JVVczZ0RwWkVzbWdGQ2FnaFp3aWRBaGJ0TS9takptQ3kyRUhvVFg5Vm1WbUx4S0VRdlpFVHY1SGk5aThjUmZnMGNIb1NHMEo1dktrMnMxbW1NUmhqbFByTVBndElsQzRiUUJmVERZaHJDZEdBdnYrdnpHcjJIL2VtaURnbCtQU1MwaGdEQTRucVVzNEQrYVpjUnZEbDg2ektwSWl6aVlvU0ZFTDJyaW5VNVJSUnpIVjNoV1E4SlpaY3BpVFR4RGtLOWR3VjZWbExxK0RUdHFnczVrVVU4Q2F3bWltYTRreEVVOFJKS0M0VERESkJsUTZoTm9icDlMUHZTQXJ6b3VaanNtR01UeXF0ZUZxaE5IS29MV1k3d1IrQlVMOHZPQm5vSFEvUjJIbkRpMnI0WnRKNmQ4ZDBRT3BrK09vVVJXa0Vybi9BdVU3aktUWDZ4NlVTNW1zU0NvRC80WVE3bEF5ek9raHJlOEt6SWhWeEVBWCtHNklWbEEranRqQWRlUTl5SFpXY0xYNzVVblVKZm5jSW9uY0pLQ3ZrUWVCZ29BdzVDYU5ZcUJyb3BUK2J6SEhDekgxcDNyY3lUVXQ2bWdPOUlOUzk3VXRvWEhFTzBZNzJHRWZKeHEyZml0SndCS09jaWpFTDVFZEMvbDRkckg3cTRCVnpPSGlrekVINEU3c3lVRWVtWjR6VUsrYjVNWjZQSGFneFpJS01XUWlleHY4WVlxekhhVUQ0a01jQWJ3NTVuaFVacUJUOTJVNWZNNTFNazlMdlBIcWVBMDQwWm9vdHJRK2hrQm1vWlYydU1OZ3A1bjhScTZFamN4c2tJUzdYUzNTcXFOSEkveXE5YzFlTVZlMjR0MWxMQ2VWTE52N09neHVBVDdpNXVMK2NpTE41QldFN0NCSm5zb0R1QU9NMnVjeW1USU9DSGJtZHpLUGZ5WlM2U0N1OXVzakVFZzlzcnRmcmg1WnlNY0xsTzVZZXVzc3huSThvc3p6Umtpc1VTdXJoU0pvWWp6TnVRR2NGUDNRazNhelg3dXNyVGx5WEFILzBSbERJSzFNc015c1FtSHJBV2cwY0Vid2c0aEU2YTNHUVFtemdXRXlHdy81VzdVSzZSV3V5QTZqZjRSQmdNQVRCQnAvRTlOeGxrSHE4QVMzelNzenZhRVM2VE9sWUVVTGZCWjhKaUNDSE9jclZkQnZIMW9SWjQyeDlKUGJJWllaVE1aRTBXNnpSa2tiQVlBb1REMmN4Y1YxbHN0amdodzluZ1l5eEdTQzIveTFKOWhnQUlqeUVTVE5icG5PNG1nOHpqUWVBWFB1bEo4ZzdDcVRJejhJRzh3V2ZDWmdpTE9MZXI3WEtUU3llVGdYLzVJNG4xRkhDNjFMTEJwL0lOSVNKc2hnQVl3bVpxM1dSd0RrU2I2WU9XNXlqaVRKbkozOU10UUJzNHlrdEJCbjhKb3lFQXFyU2FFMXpsS09ZVzRDa1BOVHpHWHB3dE5md2ozUUwwUnFZalZIcW95ZUF6WVRWRUlYSHUwS3RURHcwUm16Z0ZYSU0zYXhPL0FpNlE2WHlhYmdIYXdHem4xQWhEaEFpcklRQ09ZUUJWYmpMSUhGNUYwb2lQMnBHN2dVdkVabHM2bVZVUmJhQUZjZGZ0TTRTRE1Cc0NvRmFudXp5RGRBczI4RDlwMVNZMGljMDRzZWxNSjd1dXBvQjUzQTdFMHFyZkVEaGhOMFFmNEE2OUpQV2pTYVNaclU1RWJPb0lpbElwTnRWdUJTYlIxUlR3Wis0Q3hxZGJoaUY0d200SVVFN2k2MHgyazBYbThSREN6MVA4ZUJjd1FXWnprM3R4Q2RTbW1EK3pCbUZNdW1VWXdrSDREUUVnTkdnMVI3cktFNmNjMkxTSFQzMU9Zcnh3WjdyUzFLYUVRdHFBSDZWYmhpRThSTU1RVUlKeW01c2piR1FlSDhKdXUwRC93bUtFek9iK2RFWHBBdm81Wm5BVm1HZ0lMMUV4Qk1CM3FlYW5ybkkwY0J2d1pBL3ZKSTZJc1h0OEx5WFVaZ0RiV0FlY25XNFpodkFSSlVPQXNrQm44TlZVUHk2SlRUd1RTSFNOa2lTT2lMRjVLVzBaTmdkU3dIOERKNmRiaGlHY1JNc1FzRGRkM09vbWc4eGxBN0RRK2V2cnhQbU8yTHlWcmdDMU9aZ0NIaUdDcDJzYjlrelVEQUZ3Z1Zaemhhc2NoY3hGdVpzQ1RwZUdGTzZkNkFXZHkyRllQQUVtUGlsWENmVXBhcnVoVld0WTV3eWM5NGl6Nmp3dWt3clZaakJ4MWtIcVhUWkQ5SWhpQ3dHd1A4cmliRldtY3hpR3hXTVlNK1E4VVRVRUtLVjZBeGY1WG8zTjhjUjVIRGpVNzdvTXdSTmRReVJZcGpiNytWVzR6dVpFaEllQkEveXF3eEF1b202SWc5bVdmc2pGN3REWm5JbnlDUGhuT0VQNGlMb2hRTGhLcXpuUHl5SzFudk9KOHlCWnZnSFRFRHpSTndTQXNGeXJ2SGw0MWVZSEtQY0RmYjBvenhBdGNzTVE4RFVLdVRIVFFyU095NEJma2dnN04rUWh1V0lJZ0d0MUJtZWttMWx0cmthNGwraXV6Umc4SUpjTVlhSGNwbFBjZDNXMGprbkFyZVRXOTJGSWcxeDdBQVpUNHU0QVlxMWpPc0pTTkFRM1doc0NKOWNNQWNwVXJlWEVsRDQ2aTNvd0oyUGtNRytnL05KTkJuZUc2T0p4SlBSbm14WVE1dzYxZTcvaVMwRjBGcTBvZGRrVVpzZ2FtNEJxQ2psT1JyczdmdFRWQUZLVzhUZmcrenFGRWNScEFaY25ZbVNQNGJSekExQy84eHRxWTlISkNwU2ZCS0RMNEM5eDRENkttQ3FsNlIwd2wxYVhTWnBaeDFhT1F5a242UHZlZWtPbzBWcUdkMzlKTDZHQVR1NUVqQmx5RHVGUkxJNlRLeGlicmhrZ2d6R0VyS0JERnROS0owY0FpMG1jWGhFbWlvbHpqOXFKVmxCdGlobkthb1FyZ3habThKUzNFRXJsQ3M2Unkza2wwOEl5SGxUTE1qNlNWbUlJdzRHSE1pM1BZNDZqZzNLZFRCODZXUVArUjhjYXNzWm1vSjVPaHNzVjNsMWc0OWtpbExTd0hqaFBZMXlDTUI4NDNLdXlNMEtZelQ1Y0JKd1N0QlNESnlod0w1MVV5VGcrOExwd3o2ZGRwWlUxREdBSVFqbndpZGZscDBGZmpCbHloV2RSVHBPeGpQWERET0RUT29UWXRFc3pyUlF4REZnQjV0cGFRMGE4aDNJbFl6aEpydVJwUHl2eWRXRk81ck5SbXBrSW5BVDh3Yys2RERuSlZxQ0p2Z3lWcTFncGd2cGRZVllDMmFTWjV4UytRd1VYQXd1QXc3SlJyeUhTckVXWkxGZngxMnhXbXJYUURRR1ZSYXpoTTc2SlVFL0MvUWJEenJ5QWNvWmN4U2dabDEwelFBQ3hUTEtDTGJJUW13SUdBNnZBLzJiUUVBaytBc3JweDdkbEhFOEVKU0t3NEQ2Wno3dHlFMk9CVXhCejNXMGUwd0VzcHAwalpCeXRVaHJzQW0vZzBhNnlrR2ZveDJuT0NuSktCNDhaY29aMXdMRXlucGhNREVjSVVPQ0dnTVNGaWJLQWxTaEhPT09Mei9lWXlSQmxObUJ4b1l6blhCblBHMEdMNlU0b0RKRkVGckpaNW1OVHdGR0lkOHZ4aHREd01jcGsvczVSTW83ZkJDMm1KMEs1ZjFnYWVRc28xV3JPZHNMTWgrOHBqeUg4eUlUTUQ0THdtMUMxRURzampUeEtDY2NqVElUMFEzb05obFFKdFNFQXhLWlRHbG1CTUFTbENXZ1BXcE1oZHdtOUlaSklJNXRrUHRYRU9SckMyZjgwUkovSUdDS0p6R2VETkhJaGNDNkVhNGJDRUgwaVo0Z2swc2c2UHVKWUo4dzhGSFBZaHVnVFdVT0FzNDExSHEzQUVjNEZLbUhieG1xSUdKRTJSQks1a1kva1JtTEVPUkY0UEdnOWh1aVNFNFpJSW8yOEtQTTRFL2dCOEhiUWVnelJJNmNNa1VRYWFHTUwzMEtwQmo0TldvOGhPdVNrSVFDa21hMHlqeVlLR1lxYWJheUcxTWhaUXlRUm00M1N3RVNVa3hDZUNscFB4UGd2NHRzdnZjOExjdDRRU2FTQjU1ak42UWlsd0R0QjZ3azVid0xueXlUK1V5Ym4xMWdzYnd3QnpqYlcyYXloZ0dFa3puM2RGclNta1BFeFNqbi9aTGhNNHJkQml3bUN2REpFRXJIWklyT3hzUmdFckNJTHB6bUVuRTVnQlVVTWtjbTBpazFuMElLQ0lpOE5rVVJzM3BYWmpLV0xzNENYZ3RZVENNb2p4RGxPSmpOUkp2TFBvT1VFVFY0Yklvbk00ZmNJSitUWk50YS9JSlJLR1NNa3htdEJpd2tMeGhBT1loTVhtNVhBa1pEVDIxZy9RNmtIaHN0a3N5dHhaNHdoZGtKc1BoTWJtd0tHUTA0OU1IRmdGY3FSRXNPV3NwdzFmRWFFY2d0cEdKQmEvZ0tVYWozbkFNMUVleHZyTXlneEtlZVpvSVdFSGROQzdBR1p4U01veDBNa3Q3RytDMXhKakZPTUdWTERHQ0lGeEtaVDZsaEJuS0VrYmtzSys3VGtGcUNlT0lPbFBEdUhCT2NLeGhBdUVKdVBwWTRZQlF4SGVUQm9QVDJnd0JxNitLWk13WllLYzM2dVc4d1lJZzJraGplQkMzUU9JMGkwR01NQ2xnVEM4MEJNcHBockJ6TEJ0QkFaSUxXczQ4c2NFL0J0ck84alRPVGZmTnVZSVhPTUlUSkVKdElodGJSaWNRU1MxVzJzN2NCaWloZ3FVMWdodGdsdjl3SmpDSStRR2o2U0dtTEF0OEgzNDl6WFlqRk1waEtUc2xEYzQ1Y3ptREdFeDhnTVhnRE8wTG1Nd3FMVjQrTGZSRGhicHZLWXgrVWFEUDZqTmlYYXlCbEI2ekNrenY4RFFkN1FyTWJMUjFBQUFBQUFTVVZPUks1Q1lJST0iPgogIDxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FZQUFBREFwbzVyQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUJhYmdBQVdtNEJ4V3NqT0FBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFCbDBTVVJCVkhpYzdaMTVlRlRWM2NjL3Y1c0ZDVlJ4cVZ0cHRWVzJWbHhmNjFxdGlxMEw5R2w5TlhVQkZFcEZSVEloaEJBRENUZEFNQUVrQ1lzSzdxQjkra0Q3MnFmQldpdnFXN1ZhNjc0aXJlOXJheFgxYlpWV1pUSEwvTjQvNWc0R1NHRHV6TDF6NzUwNW4zODR6TXc1NTh2TS9YSzIzemtIRElHaml6aFBGM0ZlMERvTUlFRUx5R2QwUG9Pd2FBQXVjVjVhaDBXNVZQQjZrTHJ5R1dPSUFGQ2IvdlNqRXFnRyt1endLd2dkd0MxMFVDZlYvRHNZaGZtTE1VUVdVUnVMRWtZRDh4RU8ydjdHam9ad1BzeEhXTXhoSUV1bGxLNXM2c3huakNHeWhDN2dKSlJXNENTZ1p4UDBuSDRKaTVpVTg3amZHZzNHRUw2alRRd0U1Z0dqa1c3ZmQrcUdTTEtXSXNwa01tLzdJTlBnWUF6aEUycFRRaCtxc0tnQytnTHVUYkJyZWl1d21IWWFaRHFmZWlyWUFCaERlSTRxUWlNWEF3c1FEdlBBQkQybE55TFVzNG5ieFNhZXVXcERFbU1JRDlFYk9RRm9SVGh0KzR2K0dDTDU1N05BdWNSNEtpM0JobDB3aHZBQWJlQVFMR3hnQW1ENWFvTHU2Y1NmaXZBTGxFcUo4WTVMNllhZE1JYklBTFVwcG9ockVXWWo3TDM5amV3YUlwbmVqTEtRdldtVWNXeEw2UjlnMkFWamlEVFJ1WXpDb2dYNEJwQTlFM1JQOS96KzM0R1pVc2JLWHFRYmRvTXhoRXUwZ2FNUm1sSE85dkFCLzZPVE90a0RReVRTeWlNbzVSTGp0WjcrSFlhZXNZSVdFQlhVWmorZFN5dndQTXJaSGhXN0VXRWluM0VhVXprVm9SVDRteWNsQytkZzhiSXVaYVhld29HZWxKa0htQlppRDZoTklVV01SMmtBRHZDb1ZkaUtzSmo0cnVzSnVwd1NQcU1LcUVLYzlZdmV5a205emsxQUV3ZlNMS1cwWStnVlk0amRvUFdjZzBVTHdsSGJYOHpjRUdzUnltVGE3bGVjdFltQkZEa3IzT3l3eHAyT0laTHBEUWhUNVRvZTJGM2QrWXd4UkEvb0hBWkJ0N0JzYjFxRkZ5bWdYQ3JkeFNUcElzNEVXaENPM2FYTTlMV3NvNENZWE1NYmJyVGtBOFlRM1ZDYi9naVZ5RTVoMlprWjRpT0VPUnllZnRTcTJsZ01ZRFRLZk9BZ2ozUjFvTnhDSVhVeTBZU1pKekdHd0huZ0xPZUI2eWtzTzcwSEwvSEFpWGY3R25RWi9XbnZ3YkRwYXdTY01QUDlUSmc1R0VPZ3MxTUl5M2Ivc0swalRreHEvT21TYUN1RFVCcVE3VHZ0dk9qV3ZZaFFMdGZrZDVoNTNocENiUmRoMmFrL1ZCdFFLcVNHMzNncXRoZTBsWE9BRnVBb0Q5ZEUxbEpBbWZ3MFA4UE04ODRRYWxNQ3pyUm1xbUhaZTM2UU5pRTA4VG5OWW1kM1dsTnRDdG1YOFlnekxkeTdSamZwUkpoNUVRM3lrL3dLTTg4YlF5Z0lkVnlNeFFMVVpWaDI3Kzkzb3R5Sk1GTnErSWZYbXQyZ2k5aVBRbVlCMXlFVWJuOGpNM084aDFMRFJGYUpvSjRLRGlsNVlRaXQ1UVFrZzdEc25sOTdGSXR5cWVaVlQ4Vm1pQzVoS0VvejRoeHI0MDFYNmxtVW1GekQweDVLRFNVNWJRaXQ0UkNLc05FTXc3SjNmTzB0bEJxWnlScVA1WHFLTG1ZVVFndmlCQjlDcHVaUTRGNDZxSkpKZk9DcDJCQ1JrNFpRbTJJNlBRekxUdnlaQ0svZWh4dWxqTTg5bHV3TGFsUE0vczczQUh0NzFGcHNSbGhJWVc2R21lZWNJWFNHNTJIWmNZVDdFS2JKREQ3MFZtMTIwT1VjUWdjMjRyU1U0TVgzOGhaQ2pVd0lkMHZwbHB3eGhON0FVQXBvQnM3emNBcnlHWlNZMVBHTWgxSURRMjkydHJncXAzbjJIVms4U3B3cDhsTmU4VkJxWUVUZUVHcXpIeDNNUXJnT25ObVZ6SC9zZDRFWjFPYmU3SW9xd2kzT0lRaHdHT0RGOTlXSk9MTnQ0NE9kYmN1VXlCcENiUXJwWUR4NEdwYTlCVmpBbDJpU0NyWjZLRGQwNkhKSzZLUUtTU0hNUE5XMHhTYmlOTEYzZE1QTUkya0lyWEZXYUwwTHkxYmdGeFF3VFdaNnRFRW5JdWppRk1MTTNhWVRZZVlWTWk0N0svWmVFaWxENkV3R0VmYzhMUHM1TE1xbGpqOTRwelI2Nk0yYzZVeEc3QnBtN2piOXhXdnJLS1JNeHJMZU82WCtFZ2xEcU8xRWVTclZDSDIydjVHWklUWUM5V0FPKzBxaU5oWUhPNGN4ZHc4emgweldiUkpSdngzUkNETVB0U0hVeG1Jcm83R2NId2k4YUJYYWdWc3BZYVk1RHJKbmRCbjlzYWpFY3NMTUlSTkRKRW1FbWZjTmQ1aDVhQTJoTjNRTHkvWnVHblV0UWt4cy90ZERxVG1MM3NvZ3hPbWlabTZJWlBvRmxISVp4eE5lYXZXSzBCbENxeGlJMVcyUUIxNjBDaStobE1zY2Z1K3AyRHhCVnpEQ2lZOUtUR0prWm9oa2VpMXhKc3M0L3VxbDFrd0pqU0hVcG9RdHpqUWc5UFdvVlVoczMxelBVbGtUM21ZNkNxaE5JVjl4VGg4Uko4d2NNakVFSkthNWw5Q1h1VkxLWjk0cVRvL0FEYUVnVE9OaXhGa29jditsOXBST1hFdlZUcDAwaFg4Z0Z5WDBkdlpEbVFWTUFnb3lORVF5L1I1Q0RhT0RYd2dOMUJBNmxST3dlZ25MVHQ4UTZ4REtaWTY1dU5CUDlEYUdBWXVRYnJlblp2N2IvUW1MbUl6ZWZwSmgxZ25FRUZydWhHWHY3clJzOTEvcUJ1Sk1sWG5tektGc29yY3pDcHhnU205YWQwV2NNUE54MlE4eno2b2huTzdSTkpSYWhQNDlxbkQvcFg0TTFGUEV6V0xUNmExaVF5cm9YZXhGbkFyZ0JxQy9SK08vVDdDWVF4R0xzeGtHa3ZVV1FpczR6amtONzR3ZVZhUnVpRVJZZGhHVll2Ti9mbWcxdUVPWGN3aUZQb1daWDVHZE1QUEF4aEJheVNpRVZ1RHJyZzJoUElvd1JlYmxSc2h4cnFGM2N3SmR6dGpRdXpXa1IxSEtaYlMvVzNhREhWVGJGTE9aYXhIbUFGL2FRVkhQWDh4YldOUklRMjV0U3NsRlZCSHU5aUhNSE82a2lKbFM2aytZZWVEVHJnQmF4YUhBTEdBQzBtTlRtOWkyV0V5ajJMbTNiVEdYMGVXVVVKemlhZWFwcHplaDFITW95K1FzYjhlTm9UQkVFcTNpUDV4dTFLbU9zc1RHOWk2cVpFSHVibXpQQi9RMkJsTE1QTlRETUhONEU0c0t1WlFIdmRJWktrT0FNeE0xblRFSUYyTmh5enhlQ0ZxVHdUdjBMcjdyaEprZnMvM0Z6TTF4UDNFcTVZck1ZOVJDWndoRDdxTTJGb2M3WWVhU1FaajVqdWtPTEc2aGcxb1p6U2ZwYWpPR01BU0dycVkvVzd1ZFpnNlp0eGJDK3lnMkZuZWtFMlp1REdFSUhMMlBRWFNsRVdhK3V6UThqMFc1bFBLa0d5M0dFSWJRb1Bkd1BzSWloS0ZBcG9hQXhLWDJFK1RIM0ptcUJ0ZTNrR281RTdTY0g3ck5aekRzQ2JtU0I5bkswY0JFNEo5ZUZBa2M2aWFEKzJ0NWxTTlI3dGNZNi9SNng4a0dnMGZJUkRwa0RDdm93eEJnTVdSM0gwczZoaWh5VXVkUXdDc2FvMVd2Nnhhb1p6QjRnSlR5c1l3bVJwemh3Ryt6VmE5N1ExamJEUUZRQkpSUnhIcU5NZFl6VlFhRGc0eGx2WXptZklRZmdQOTc0VE5wSWJvekVMaEh5M2pZZEtNTWZpQ1gwMFlSdzRCeVNIK2RZVSs0TndROUdpS0JNSUlDWHRZcE5Lck5YdW5MTWhoMlJVcHBseXRvUlJnRy9weWw1YTBoRWhTalRPZGZ2SzR4UnFZanltRFlIWElaRzhHZnZkZCtHQ0xKTnhEYWRBcHRXc25YMDZqSFlNZzZYbzBoZHNkSXVuaGRLN0JOTjhvUWRqS2RaVXFWdmlpeitJVFh0SklMMDhodk1HU0ZiTFFRM1RtQ09HdTFnall0NS9BTXlqRVlmTUhQTWNUdUdFa0JiMmlsNlVZWndrVlFob0JrTitwVFh0VnBYT0JSbVFaRFJnUnBpQ1JIb2p5Z1UyblRhdE9OTWdSTHRzY1F2U09NcEpQWHRRcGJKM2U3Rk1WZ3lDTHVEU0UrR1NKQkNjb3MrdkNhVHV0MlpxakJrQ1hDMEdYYUZlRkk0RUd0b2sybk9tZjZHQXhaSUp5RytJTEViSlRwUmhteVJOZ05BVkFDektLRVYzVTYzODl5M1lZOEl3cUdTRElJK0sxVzA2YlQrVnBBR2d3NVRwUU1rVUFaaWJCZXE3SFZwamhRTFlhY0kzcUdTSkRvUm0zalZhM21lMEdMTWVRT1VUVkVrc0VJRCtrTnRPa012aHEwR0VQMGlib2hrb3drem5xdE1kMG9RMmJraWlFQStnR3phT2NWcmVIY29NVVlvb2tyUTJqaTRLZENuN1I0eFJEZ2R6ckRkS01NN25IWFFsd2Rlak4wWnlTd1htZWFibFJlRTNkM0dJSGJMbE5ZdTB1OTBROWxGbDI4ckRNWkViUVlRMWJaakZMUE5oYTV5ZVRPRVB0R3poQUpsS0hBNzNRbUs3V0dnNEtXWS9BVkJWYlJ3U0M1REZ2R3VidUN6WjBoT2lOcWlBUUNqS0dBRFRxVG1OcVI2djRaVWtINUV4YW55YVdNbFRHOG4wNFI3Z3pSRldsREpOa0hvWVV1bnROYVRndGFqTUVUM2tXNGtrczVXVXA1T3BPQzNCbkNyODFCd1hBTXdoTmFaN3BSa1VYWkF0UlR3R0M1bEpVaW1SOWU1czRROFp3eUJDUzdVWVc4cVhYRTlCSUtnaFprU0JGaEZVVU1sc3V3cFpTdDNoWHJBcjJlb1JTdzNsV3AwVXEvaERCSmJKN0NrSmU0YXlHS2NxNkYySmxqZ1NmVlpxWGFIQmkwR0VQMnllY3hSTStvMDQyQ0RWcFBURmViYmxRK1lRelJPd05RV2xqUHN6cWJVNElXWThnT3ViNVM3UVhIb2Z4QjYxbXA4L2h5MEdJTS9tSmFpTlJJZEtNNjJhQnpURGNxbDNGbkNNbjdJTGw5VVZyWXdKOTBMaWNITGNiZ1BhYkxsQTdLOFNoUDZSelRqY28xVEpjcGZSTGRxQzdUamNvbFRBdVJPZnNpdFBBWG50SFpuQlMwR0VObXVETkVlcmNINVFmS0NWZzhwWE5acVRZSEJDM0hrQjZtaGZBV0MyRU1SV3pRQm1KcXA3Vm5QVlJvTXdPQzFwQUp1cHFEM1h6ZTdRKzI1ejBFcnFLamNwYjlnQmFLZVZJYk9TWm9NZW1nU3poVWw3S2NZdVlFclNVZGRCVkQ5R2M4UUFkVDNlUnpPNmgyTisxcXpIRUtTbG5RSXR5Z05zVzZoQmdXYnlKY1RYb25zd1NHM3NlK2VoK05XTHdDN20rbWNyZHJUQ2xLK3lIZk1kOW00REdnalM2ZW9JakgwQnpka3hDblBXZ0pxYUxMR0lYU0N0RzdWMXh0TEk1Z05MQUEwZy9NZEx1Tk1wTXh4TnNvRHdOcjJZZUh4UDdpUWRGS0tvRDdNaWc3dkFnZFFVdllFN3FNWTRuVGduSm0wRnJTUWUvakxPSzBJQnlkYVZudURHRlI1R0pQVWhlSi9RVnJFZHJrSnA3djdZT3lrSjlwSlpkRER0NWhMZUZ0SVhRcCt3TjF4SmtFMFZ0SDBaVjhEWXU1S0dPODZwNjc3ekx0bnMySTB4VXE1TmV5Z0E5Y0tMbWVMcjVMNGdTKzNFSEQxMExvY29wbzV6cmkxQ1BzRTdRZXQraEsraUZNQTZhajdPWGxXTldMTHRQYkNBOGp1M2FGM0NDTi9GV3JhRUNabDNnaG5WSkNTTWdNb1lzWndlZTBBTjhLV290YlZCSHVaUXhLRTdpYlRrMlZkQXp4UlZjb1Rwc3M3cjByNUpvU0ZyQ1pVaEk3MTNJREt4eUcwS1VNcG90RktCZEc4VDhidllzVFdVVXIrTHMzeFowaHVyaWJJdVpMTXgvN0lVWnNPcldTNnhDZXBQdDBYMi83b0tOQm9HTUliV1lBUWpWZFRJSG9SU3ZyUFh3RnVCRVlUUlorZlZlR2tLVzg2WmVRN1hVczVHbWR4bkxnV3Ivcnlnb0JkWm5VeG1KQTV0T1FRYUdyNmN0V3lvQVp3SmV5Vlc4NEYxMjJVWTN3M2g0L0Y0WFdJb0JaSnIySnM5aUhGNEI3aUtJWjdtSVVXM2dEcFpFc21nRkNhZ2had2lkQWhidE0vbWpKbUN5MkVIb1RYOVZtVm1MeEtFUXZaRVR2NUhpOWk4Y1JmZzBjSG9TRzBKNXZLazJzMW1tTVJoamxQck1QZ3RJbEM0YlFCZlREWWhyQ2RHQXZ2K3Z6R3IySC9lbWlEZ2wrUFNTMGhnREE0bnFVczREK2FaY1J2RGw4NnpLcElpemlZb1NGRUwycmluVTVSUlJ6SFYzaFdROEpaWmNwaVRUeERrSzlkd1Y2VmxMcStEVHRxZ3M1a1VVOENhd21pbWE0a3hFVThSSktDNFREREpCbFE2aE5vYnA5TFB2U0Fyem91WmpzbUdNVHlxdGVGcWhOSEtvTFdZN3dSK0JVTDh2T0Jub0hRL1IySG5EaTJyNFp0SjZkOGQwUU9waytPb1VSV2tFcm4vQXVVN2pLVFg2eDZVUzVtc1NDb0QvNFlRN2xBeXpPa2hyZThLekloVnhFQVgrRzZJVmxBK2p0akFkZVE5eUhaV2NMWDc1VW5VSmZuY0lvbmNKS0N2a1FlQmdvQXc1Q2FOWXFCcm9wVCtiekhIQ3pIMXAzcmN5VFV0Nm1nTzlJTlM5N1V0b1hIRU8wWTcyR0VmSnhxMmZpdEp3QktPY2lqRUw1RWRDL2w0ZHJIN3E0QlZ6T0hpa3pFSDRFN3N5VUVlbVo0elVLK2I1TVo2UEhhZ3haSUtNV1FpZXh2OFlZcXpIYVVENGtNY0FidzU1bmhVWnFCVDkyVTVmTTUxTWs5THZQSHFlQTA0MFpvb3RyUStoa0Jtb1pWMnVNTmdwNW44UnE2RWpjeHNrSVM3WFMzU3FxTkhJL3lxOWMxZU1WZTI0dDFsTENlVkxOdjdPZ3h1QVQ3aTV1TCtjaUxONUJXRTdDQkpuc29EdUFPTTJ1Y3ltVElPQ0hibWR6S1BmeVpTNlNDdTl1c2pFRWc5c3J0ZnJoNVp5TWNMbE81WWV1c3N4bkk4b3N6elJraXNVU3VyaFNKb1lqek51UUdjRlAzUWszYXpYN3VzclRseVhBSC8wUmxESUsxTXNNeXNRbUhyQVdnMGNFYndnNGhFNmEzR1FRbXpnV0V5R3cvNVc3VUs2Uld1eUE2amY0UkJnTUFUQkJwL0U5Tnhsa0hxOEFTM3pTc3p2YUVTNlRPbFlFVUxmQlo4SmlDQ0hPY3JWZEJ2SDFvUlo0Mng5SlBiSVpZWlRNWkUwVzZ6UmtrYkFZQW9URDJjeGNWMWxzdGpnaHc5bmdZeXhHU0MyL3kxSjloZ0FJanlFU1ROYnBuTzRtZzh6alFlQVhQdWxKOGc3Q3FUSXo4SUc4d1dmQ1pnaUxPTGVyN1hLVFN5ZVRnWC81STRuMUZIQzYxTExCcC9JTklTSnNoZ0FZd21acTNXUndEa1NiNllPVzV5amlUSm5KMzlNdFFCczR5a3RCQm44Sm95RUFxclNhRTF6bEtPWVc0Q2tQTlR6R1hwd3ROZndqM1FMMFJxWWpWSHFveWVBellUVkVJWEh1MEt0VER3MFJtemdGWElNM2F4Ty9BaTZRNlh5YWJnSGF3R3puMUFoRGhBaXJJUUNPWVFCVmJqTElIRjVGMG9pUDJwRzdnVXZFWmxzNm1WVVJiYUFGY2RmdE00U0RNQnNDb0ZhbnV6eURkQXMyOEQ5cDFTWTBpYzA0c2VsTUo3dXVwb0I1M0E3RTBxcmZFRGhoTjBRZjRBNjlKUFdqU2FTWnJVNUViT29JaWxJcE50VnVCU2JSMVJUd1orNEN4cWRiaGlGNHdtNElVRTdpNjB4MmswWG04UkRDejFQOGVCY3dRV1p6azN0eENkU21tRCt6Qm1GTXVtVVl3a0g0RFFFZ05HZzFSN3JLRTZjYzJMU0hUMzFPWXJ4d1o3clMxS2FFUXRxQUg2VmJoaUU4Uk1NUVVJSnltNXNqYkdRZUg4SnV1MEQvd21LRXpPYitkRVhwQXZvNVpuQVZtR2dJTDFFeEJNQjNxZWFucm5JMGNCdndaQS92Skk2SXNYdDhMeVhVWmdEYldBZWNuVzRaaHZBUkpVT0Fza0JuOE5WVVB5NkpUVHdUU0hTTmtpU09pTEY1S1cwWk5nZFN3SDhESjZkYmhpR2NSTXNRc0RkZDNPb21nOHhsQTdEUStldnJ4UG1PMkx5VnJnQzFPWmdDSGlHQ3Ayc2I5a3pVREFGd2dWWnpoYXNjaGN4RnVac0NUcGVHRk82ZDZBV2R5MkZZUEFFbVBpbFhDZlVwYXJ1aFZXdFk1d3ljOTRpejZqd3Vrd3JWWmpCeDFrSHFYVFpEOUloaUN3R3dQOHJpYkZXbWN4aUd4V01ZTStROFVUVUVLS1Y2QXhmNVhvM044Y1I1SERqVTc3b013Uk5kUXlSWXBqYjcrVlc0enVaRWhJZUJBL3lxd3hBdW9tNklnOW1XZnNqRjd0RFpuSW55Q1Bobk9FUDRpTG9oUUxoS3F6blB5eUsxbnZPSjh5Qlp2Z0hURUR6Uk53U0FzRnlydkhsNDFlWUhLUGNEZmIwb3p4QXRjc01ROERVS3VUSFRRclNPeTRCZmtnZzdOK1FodVdJSWdHdDFCbWVrbTFsdHJrYTRsK2l1elJnOElKY01ZYUhjcGxQY2QzVzBqa25BcmVUVzkyRklnMXg3QUFaVDR1NEFZcTFqT3NKU05BUTNXaHNDSjljTUFjcFVyZVhFbEQ0Nmkzb3dKMlBrTUcrZy9OSk5CbmVHNk9KeEpQUm5teFlRNXc2MWU3L2lTMEYwRnEwb2Rka1Vac2dhbTRCcUNqbE9ScnM3ZnRUVkFGS1c4VGZnK3pxRkVjUnBBWmNuWW1TUDRiUnpBMUMvOHh0cVk5SEpDcFNmQktETDRDOXg0RDZLbUNxbDZSMHdsMWFYU1pwWngxYU9ReWtuNlB2ZWVrT28wVnFHZDM5Skw2R0FUdTVFakJseUR1RlJMSTZUS3hpYnJoa2dnekdFcktCREZ0TktKMGNBaTBtY1hoRW1pb2x6ajlxSlZsQnRpaG5LYW9Rcmd4Wm04SlMzRUVybENzNlJ5M2tsMDhJeUhsVExNajZTVm1JSXc0R0hNaTNQWTQ2amczS2RUQjg2V1FQK1I4Y2Fzc1ptb0o1T2hzc1YzbDFnNDlraWxMU3dIamhQWTF5Q01CODQzS3V5TTBLWXpUNWNCSndTdEJTREp5aHdMNTFVeVRnKzhMcHd6NmRkcFpVMURHQUlRam53aWRmbHAwRmZqQmx5aFdkUlRwT3hqUFhERE9EVE9vVFl0RXN6clJReERGZ0I1dHBhUTBhOGgzSWxZemhKcnVScFB5dnlkV0ZPNXJOUm1wa0luQVQ4d2MrNkREbkpWcUNKdmd5VnExZ3BndnBkWVZZQzJhU1o1eFMrUXdVWEF3dUF3N0pScnlIU3JFV1pMRmZ4MTJ4V21yWFFEUUdWUmF6aE03NkpVRS9DL1FiRHpyeUFjb1pjeFNnWmwxMHpRQUN4VExLQ0xiSVFtd0lHQTZ2QS8yYlFFQWsrQXNycHg3ZGxIRThFSlNLdzRENlp6N3R5RTJPQlV4QnozVzBlMHdFc3BwMGpaQnl0VWhyc0FtL2cwYTZ5a0dmb3gybk9DbkpLQjQ4WmNvWjF3TEV5bnBoTURFY0lVT0NHZ01TRmliS0FsU2hIT09PTHovZVl5UkJsTm1CeG9Zem5YQm5QRzBHTDZVNG9ESkZFRnJKWjVtTlR3RkdJZDh2eGh0RHdNY3BrL3M1Uk1vN2ZCQzJtSjBLNWYxZ2FlUXNvMVdyT2RzTE1oKzhwanlIOHlJVE1ENEx3bTFDMUVEc2pqVHhLQ2NjalRJVDBRM29OaGxRSnRTRUF4S1pUR2xtQk1BU2xDV2dQV3BNaGR3bTlJWkpJSTV0a1B0WEVPUnJDMmY4MFJKL0lHQ0tKekdlRE5ISWhjQzZFYTRiQ0VIMGlaNGdrMHNnNlB1SllKOHc4RkhQWWh1Z1RXVU9BczQxMUhxM0FFYzRGS21IYnhtcUlHSkUyUkJLNWtZL2tSbUxFT1JGNFBHZzlodWlTRTRaSUlvMjhLUE00RS9nQjhIYlFlZ3pSSTZjTWtVUWFhR01MMzBLcEJqNE5XbzhoT3VTa0lRQ2ttYTB5anlZS0dZcWFiYXlHMU1oWlF5UVJtNDNTd0VTVWt4Q2VDbHBQeFBndjR0c3Z2YzhMY3Q0UVNhU0I1NWpONlFpbHdEdEI2d2s1YndMbnl5VCtVeWJuMTFnc2J3d0J6amJXMmF5aGdHRWt6bjNkRnJTbWtQRXhTam4vWkxoTTRyZEJpd21DdkRKRUVySFpJck94c1JnRXJDSUxwem1FbkU1Z0JVVU1rY20waWsxbjBJS0NJaThOa1VSczNwWFpqS1dMczRDWGd0WVRDTW9qeERsT0pqTlJKdkxQb09VRVRWNGJJb25NNGZjSUorVFpOdGEvSUpSS0dTTWt4bXRCaXdrTHhoQU9ZaE1YbTVYQWtaRFQyMWcvUTZrSGhzdGtzeXR4WjR3aGRrSnNQaE1ibXdLR1EwNDlNSEZnRmNxUkVzT1dzcHcxZkVhRWNndHBHSkJhL2dLVWFqM25BTTFFZXh2ck15Z3hLZWVab0lXRUhkTkM3QUdaeFNNb3gwTWt0N0crQzF4SmpGT01HVkxER0NJRnhLWlQ2bGhCbktFa2Jrc0srN1RrRnFDZU9JT2xQRHVIQk9jS3hoQXVFSnVQcFk0WUJReEhlVEJvUFQyZ3dCcTYrS1pNd1pZS2MzNnVXOHdZSWcya2hqZUJDM1FPSTBpMEdNTUNsZ1RDODBCTXBwaHJCekxCdEJBWklMV3M0OHNjRS9CdHJPOGpUT1RmZk51WUlYT01JVEpFSnRJaHRiUmljUVNTMVcyczdjQmlpaGdxVTFnaHRnbHY5d0pqQ0krUUdqNlNHbUxBdDhIMzQ5elhZakZNcGhLVHNsRGM0NWN6bURHRXg4Z01YZ0RPMExtTXdxTFY0K0xmUkRoYnB2S1l4K1VhRFA2ak5pWGF5QmxCNnpDa3p2OERRZDdRck1iTFIxQUFBQUFBU1VWT1JLNUNZSUk9Ij4KCiAgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8c3R5bGU+CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vdVlFQ01Lb0hjTzl4MXdkbWJ5SEltMy1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3NUZGFBNmowUHNiOTIwVmp2LW1yekgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9fVllGeC1zODI0a1hxX1VsMkJIcVlILV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by90bmo0U0I2RE5iZGFRbnNNOENGcUJYLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9vTU1nZlpNUXRoT3J5UW85bjIyZGN1dnZEaW4xcEs4YUt0ZUxwZVo1YzBBLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9Lc19jVnhpQ2l3VVdWc0ZXRkEzQmpuLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL05KNHZ4bGdXd1diRXN2MThkQWhxbm4tX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vaXNaLXdiQ1hOS0FibmpvNl9Ud0hUb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vNzdGWEZqUmJHek40YUNyU0ZobGgzb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8valNOMkNHVkRiY1Z5Q25mSmZqU2RmSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9VWDZpNEp4UURtM2ZWVGMxQ1B1d3FvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL2QtNklZcGxPRm9jQ2FjS3p4d1hTT0pCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vOTd1YWh4aXFaUm9uY0JhQ0VJM2FXNFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1B3WmMtWWJJTDQxNHdCOXJCMUlBUFlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0NfWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDd3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNGdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PcFhVcVRvMFVnUVFoR2pfU0ZkTFdCa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vV3hyWEphMEMzS2R0QzdsTWFmRzRkUmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL2NES2hSYVhuUVRPVmJhb3h3ZE9yOXhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzFoWmYwMlBPQU5oMzJrMlZrZ0VvVUJrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZQY3luU0wwcUhxXzZkWDdsS1ZCeVhZaGpiU3B2YzQ3ZWU2eFJfODBIbncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZTenVsZktTSzBMTGpqZmVheGNSRWhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vSzIzY3hXVlRySUZENkRKc0VWaTA3UmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0ZsNHkwUWRPeHl5VEhFR01YWDhrY1lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vMGVDNmZsMDZsdVhFWVdwQlNKdlhDSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9JM1Mxd3NnU2c5WUN1clY2UFVrVE9ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vLUwxNEprMDZtNnBVSEItNW1YUVFuWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0hnbzEzay10ZlNwbjBxaTFTRmRVZlpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9QcnUzM3FqU2hwWlNtRzN6NlZZd25ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9OWURXQmRENGdJcTI2RzVYWWJIc0ZJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdF9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdHd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0MUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9vSGkzMGt3UVd2cENXcUFoekhjQ1NJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vWkxxS2VlbFliQVRHNjBFcFpCU0R5NFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL214OVVjazZ1QjYzVklLRlluRU1YcllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL3JHdkhkSm5yMmw3NXFiMFlORDlOeUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL1J4WkpkbnplbzNSNXpTZXhnZThVVVpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL29PZUZ3Wk5sclRlZnpMWW1sVlYxVUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vbWJtaHByTUg2OVppNmVFUEJZVkZoWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFY0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwZlpyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBRdF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwVkJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFlncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBhRThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBkRGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWV9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWXd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6MXgtTTFJMXc1T01pcW5WRjh4QkxoVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rnp3WGFBWHVwNW1abGZLNnhSTHJoc2NvLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGenduNldxeG8teHd4aWxEWFBVOGNoVlUud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnoxVDdhSkxLNm5LcG4zNklNd1RjTU1jLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6Xzc5X1p1VXhDaWdNMkRlc3BUbkZhdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejRnZDlPRVBVQ04zQWRZVzBlOHRhdDQud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejhiSVFTWVpuV0xhV0M5UU5DcFRLX1Uud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQo8L3N0eWxlPgoKCjxzdHlsZT4KICBodG1sLAogIGJvZHkgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGhlaWdodDogMTAwJTsKICAgIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgfQo8L3N0eWxlPgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIFtoaWRkZW5dIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tbGF5b3V0OiB7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1pbmxpbmU6IHsKICAgICAgICBkaXNwbGF5OiAtbXMtaW5saW5lLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtZmxleDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWhvcml6b250YWw6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsLXJldmVyc2U6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcDogewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcC1yZXZlcnNlOiB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LWF1dG86IHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtbm9uZTogewogICAgICAgIC1tcy1mbGV4OiBub25lOwogICAgICAgIC13ZWJraXQtZmxleDogbm9uZTsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleDogewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMjogewogICAgICAgIC1tcy1mbGV4OiAyOwogICAgICAgIC13ZWJraXQtZmxleDogMjsKICAgICAgICBmbGV4OiAyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0zOiB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTQ6IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNTogewogICAgICAgIC1tcy1mbGV4OiA1OwogICAgICAgIC13ZWJraXQtZmxleDogNTsKICAgICAgICBmbGV4OiA1OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC02OiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTc6IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtODogewogICAgICAgIC1tcy1mbGV4OiA4OwogICAgICAgIC13ZWJraXQtZmxleDogODsKICAgICAgICBmbGV4OiA4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC05OiB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEwOiB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTExOiB7CiAgICAgICAgLW1zLWZsZXg6IDExOwogICAgICAgIC13ZWJraXQtZmxleDogMTE7CiAgICAgICAgZmxleDogMTE7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEyOiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH07CgogICAgICAvKiBhbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlcjogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWJhc2VsaW5lOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfTsKCiAgICAgIC8qIGFsaWdubWVudCBpbiBtYWluIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1hcm91bmQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItY2VudGVyOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfTsKCiAgICAgIC8qIHNlbGYgYWxpZ25tZW50ICovCgogICAgICAtLWxheW91dC1zZWxmLXN0YXJ0OiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWNlbnRlcjogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1lbmQ6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtc3RyZXRjaDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1iYXNlbGluZTogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9OwoKICAgICAgLyogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYmV0d2Vlbi1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYXJvdW5kLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH07CgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgT3RoZXIgTGF5b3V0CiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAtLWxheW91dC1ibG9jazogewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaW52aXNpYmxlOiB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1yZWxhdGl2ZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpdDogewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zY3JvbGw6IHsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH07CgogICAgICAtLWxheW91dC1mdWxsYmxlZWQ6IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfTsKCiAgICAgIC8qIGZpeGVkIHBvc2l0aW9uICovCgogICAgICAtLWxheW91dC1maXhlZC10b3A6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1yaWdodDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtYm90dG9tOiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtbGVmdDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItcmlwcGxlIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CgogICAgICAgIC8qIFNlZSBQb2x5bWVyRWxlbWVudHMvcGFwZXItYmVoYXZpb3JzL2lzc3Vlcy8zNC4gT24gbm9uLUNocm9tZSBicm93c2VycywKICAgICAgICAgKiBjcmVhdGluZyBhIG5vZGUgKHdpdGggYSBwb3NpdGlvbjphYnNvbHV0ZSkgaW4gdGhlIG1pZGRsZSBvZiBhbiBldmVudAogICAgICAgICAqIGhhbmRsZXIgImludGVycnVwdHMiIHRoYXQgZXZlbnQgaGFuZGxlciAod2hpY2ggaGFwcGVucyB3aGVuIHRoZQogICAgICAgICAqIHJpcHBsZSBpcyBjcmVhdGVkIG9uIGRlbWFuZCkgKi8KICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGluZ10pIHsKICAgICAgICAvKiBUaGlzIHJlc29sdmVzIGEgcmVuZGVyaW5nIGlzc3VlIGluIENocm9tZSAoYXMgb2YgNDApIHdoZXJlIHRoZQogICAgICAgICAgIHJpcHBsZSBpcyBub3QgcHJvcGVybHkgY2xpcHBlZCBieSBpdHMgcGFyZW50ICh3aGljaCBtYXkgaGF2ZQogICAgICAgICAgIHJvdW5kZWQgY29ybmVycykuIFNlZTogaHR0cDovL2pzYmluLmNvbS90ZW1leGEvNAoKICAgICAgICAgICBOb3RlOiBXZSBvbmx5IGFwcGx5IHRoaXMgc3R5bGUgY29uZGl0aW9uYWxseS4gT3RoZXJ3aXNlLCB0aGUgYnJvd3NlcgogICAgICAgICAgIHdpbGwgY3JlYXRlIGEgbmV3IGNvbXBvc2l0aW5nIGxheWVyIGZvciBldmVyeSByaXBwbGUgZWxlbWVudCBvbiB0aGUKICAgICAgICAgICBwYWdlLCBhbmQgdGhhdCB3b3VsZCBiZSBiYWQuICovCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgI3dhdmVzLAogICAgICAud2F2ZS1jb250YWluZXIsCiAgICAgIC53YXZlIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgLndhdmUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgICN3YXZlcywKICAgICAgLndhdmUgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC53YXZlLWNvbnRhaW5lciwKICAgICAgLndhdmUgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNpcmNsZSkgI2JhY2tncm91bmQsCiAgICAgIDpob3N0KC5jaXJjbGUpICN3YXZlcyB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICA6aG9zdCguY2lyY2xlKSAud2F2ZS1jb250YWluZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iYmFja2dyb3VuZCI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ3YXZlcyI+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAtLXNoYWRvdy10cmFuc2l0aW9uOiB7CiAgICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjI4cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctbm9uZTogewogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgIH07CgogICAgICAvKiBmcm9tIGh0dHA6Ly9jb2RlcGVuLmlvL3NoeW5kbWFuL3Blbi9jNTM5NGRkZjJlOGIyYTVjOTE4NTkwNGI1NzQyMWNkYiAqLwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tM2RwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAzcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi00ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi02ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDZweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCAxOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0xMmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAxMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCA0cHggMjJweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgIDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgIDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTI0ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCwgaHRtbCB7CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbDogewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLThkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICB9OwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbCksIC5wYXBlci1tYXRlcmlhbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSksIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIC8qIE5lZWQgdG8gc3BlY2lmeSB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyB0aGUgc3R5bGVzIGltcG9ydGVkIGZyb20gcGFwZXItbWF0ZXJpYWwuICovCiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1pbi13aWR0aDogNS4xNGVtOwogICAgICAgIG1hcmdpbjogMCAwLjI5ZW07CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIG91dGxpbmUtd2lkdGg6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgcGFkZGluZzogMC43ZW0gMC41N2VtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMpIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tcmFpc2VkLWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtyYWlzZWRdKS5rZXlib2FyZC1mb2N1cykgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1mbGF0LWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgYmFja2dyb3VuZDogI2VhZWFlYTsKICAgICAgICBjb2xvcjogI2E4YThhODsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1idXR0b24taW5rLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZm9yIEdvb2dsZSBwcm9kdWN0cyAqLwoKICAgICAgLS1nb29nbGUtcmVkLTEwMDogI2Y0YzdjMzsKICAgICAgLS1nb29nbGUtcmVkLTMwMDogI2U2N2M3MzsKICAgICAgLS1nb29nbGUtcmVkLTUwMDogI2RiNDQzNzsKICAgICAgLS1nb29nbGUtcmVkLTcwMDogI2M1MzkyOTsKCiAgICAgIC0tZ29vZ2xlLWJsdWUtMTAwOiAjYzZkYWZjOwogICAgICAtLWdvb2dsZS1ibHVlLTMwMDogIzdiYWFmNzsKICAgICAgLS1nb29nbGUtYmx1ZS01MDA6ICM0Mjg1ZjQ7CiAgICAgIC0tZ29vZ2xlLWJsdWUtNzAwOiAjMzM2N2Q2OwoKICAgICAgLS1nb29nbGUtZ3JlZW4tMTAwOiAjYjdlMWNkOwogICAgICAtLWdvb2dsZS1ncmVlbi0zMDA6ICM1N2JiOGE7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTUwMDogIzBmOWQ1ODsKICAgICAgLS1nb29nbGUtZ3JlZW4tNzAwOiAjMGI4MDQzOwoKICAgICAgLS1nb29nbGUteWVsbG93LTEwMDogI2ZjZThiMjsKICAgICAgLS1nb29nbGUteWVsbG93LTMwMDogI2Y3Y2I0ZDsKICAgICAgLS1nb29nbGUteWVsbG93LTUwMDogI2Y0YjQwMDsKICAgICAgLS1nb29nbGUteWVsbG93LTcwMDogI2YwOTMwMDsKCiAgICAgIC0tZ29vZ2xlLWdyZXktMTAwOiAjZjVmNWY1OwogICAgICAtLWdvb2dsZS1ncmV5LTMwMDogI2UwZTBlMDsKICAgICAgLS1nb29nbGUtZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tZ29vZ2xlLWdyZXktNzAwOiAjNjE2MTYxOwoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZnJvbSBvbmxpbmUgc3BlYyBkb2N1bWVudCAqLwoKICAgICAgLS1wYXBlci1yZWQtNTA6ICNmZmViZWU7CiAgICAgIC0tcGFwZXItcmVkLTEwMDogI2ZmY2RkMjsKICAgICAgLS1wYXBlci1yZWQtMjAwOiAjZWY5YTlhOwogICAgICAtLXBhcGVyLXJlZC0zMDA6ICNlNTczNzM7CiAgICAgIC0tcGFwZXItcmVkLTQwMDogI2VmNTM1MDsKICAgICAgLS1wYXBlci1yZWQtNTAwOiAjZjQ0MzM2OwogICAgICAtLXBhcGVyLXJlZC02MDA6ICNlNTM5MzU7CiAgICAgIC0tcGFwZXItcmVkLTcwMDogI2QzMmYyZjsKICAgICAgLS1wYXBlci1yZWQtODAwOiAjYzYyODI4OwogICAgICAtLXBhcGVyLXJlZC05MDA6ICNiNzFjMWM7CiAgICAgIC0tcGFwZXItcmVkLWExMDA6ICNmZjhhODA7CiAgICAgIC0tcGFwZXItcmVkLWEyMDA6ICNmZjUyNTI7CiAgICAgIC0tcGFwZXItcmVkLWE0MDA6ICNmZjE3NDQ7CiAgICAgIC0tcGFwZXItcmVkLWE3MDA6ICNkNTAwMDA7CgogICAgICAtLXBhcGVyLXBpbmstNTA6ICNmY2U0ZWM7CiAgICAgIC0tcGFwZXItcGluay0xMDA6ICNmOGJiZDA7CiAgICAgIC0tcGFwZXItcGluay0yMDA6ICNmNDhmYjE7CiAgICAgIC0tcGFwZXItcGluay0zMDA6ICNmMDYyOTI7CiAgICAgIC0tcGFwZXItcGluay00MDA6ICNlYzQwN2E7CiAgICAgIC0tcGFwZXItcGluay01MDA6ICNlOTFlNjM7CiAgICAgIC0tcGFwZXItcGluay02MDA6ICNkODFiNjA7CiAgICAgIC0tcGFwZXItcGluay03MDA6ICNjMjE4NWI7CiAgICAgIC0tcGFwZXItcGluay04MDA6ICNhZDE0NTc7CiAgICAgIC0tcGFwZXItcGluay05MDA6ICM4ODBlNGY7CiAgICAgIC0tcGFwZXItcGluay1hMTAwOiAjZmY4MGFiOwogICAgICAtLXBhcGVyLXBpbmstYTIwMDogI2ZmNDA4MTsKICAgICAgLS1wYXBlci1waW5rLWE0MDA6ICNmNTAwNTc7CiAgICAgIC0tcGFwZXItcGluay1hNzAwOiAjYzUxMTYyOwoKICAgICAgLS1wYXBlci1wdXJwbGUtNTA6ICNmM2U1ZjU7CiAgICAgIC0tcGFwZXItcHVycGxlLTEwMDogI2UxYmVlNzsKICAgICAgLS1wYXBlci1wdXJwbGUtMjAwOiAjY2U5M2Q4OwogICAgICAtLXBhcGVyLXB1cnBsZS0zMDA6ICNiYTY4Yzg7CiAgICAgIC0tcGFwZXItcHVycGxlLTQwMDogI2FiNDdiYzsKICAgICAgLS1wYXBlci1wdXJwbGUtNTAwOiAjOWMyN2IwOwogICAgICAtLXBhcGVyLXB1cnBsZS02MDA6ICM4ZTI0YWE7CiAgICAgIC0tcGFwZXItcHVycGxlLTcwMDogIzdiMWZhMjsKICAgICAgLS1wYXBlci1wdXJwbGUtODAwOiAjNmExYjlhOwogICAgICAtLXBhcGVyLXB1cnBsZS05MDA6ICM0YTE0OGM7CiAgICAgIC0tcGFwZXItcHVycGxlLWExMDA6ICNlYTgwZmM7CiAgICAgIC0tcGFwZXItcHVycGxlLWEyMDA6ICNlMDQwZmI7CiAgICAgIC0tcGFwZXItcHVycGxlLWE0MDA6ICNkNTAwZjk7CiAgICAgIC0tcGFwZXItcHVycGxlLWE3MDA6ICNhYTAwZmY7CgogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTUwOiAjZWRlN2Y2OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTEwMDogI2QxYzRlOTsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0yMDA6ICNiMzlkZGI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMzAwOiAjOTU3NWNkOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTQwMDogIzdlNTdjMjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS01MDA6ICM2NzNhYjc7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNjAwOiAjNWUzNWIxOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTcwMDogIzUxMmRhODsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS04MDA6ICM0NTI3YTA7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtOTAwOiAjMzExYjkyOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWExMDA6ICNiMzg4ZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTIwMDogIzdjNGRmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hNDAwOiAjNjUxZmZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWE3MDA6ICM2MjAwZWE7CgogICAgICAtLXBhcGVyLWluZGlnby01MDogI2U4ZWFmNjsKICAgICAgLS1wYXBlci1pbmRpZ28tMTAwOiAjYzVjYWU5OwogICAgICAtLXBhcGVyLWluZGlnby0yMDA6ICM5ZmE4ZGE7CiAgICAgIC0tcGFwZXItaW5kaWdvLTMwMDogIzc5ODZjYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNDAwOiAjNWM2YmMwOwogICAgICAtLXBhcGVyLWluZGlnby01MDA6ICMzZjUxYjU7CiAgICAgIC0tcGFwZXItaW5kaWdvLTYwMDogIzM5NDlhYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNzAwOiAjMzAzZjlmOwogICAgICAtLXBhcGVyLWluZGlnby04MDA6ICMyODM1OTM7CiAgICAgIC0tcGFwZXItaW5kaWdvLTkwMDogIzFhMjM3ZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTEwMDogIzhjOWVmZjsKICAgICAgLS1wYXBlci1pbmRpZ28tYTIwMDogIzUzNmRmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTQwMDogIzNkNWFmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTcwMDogIzMwNGZmZTsKCiAgICAgIC0tcGFwZXItYmx1ZS01MDogI2UzZjJmZDsKICAgICAgLS1wYXBlci1ibHVlLTEwMDogI2JiZGVmYjsKICAgICAgLS1wYXBlci1ibHVlLTIwMDogIzkwY2FmOTsKICAgICAgLS1wYXBlci1ibHVlLTMwMDogIzY0YjVmNjsKICAgICAgLS1wYXBlci1ibHVlLTQwMDogIzQyYTVmNTsKICAgICAgLS1wYXBlci1ibHVlLTUwMDogIzIxOTZmMzsKICAgICAgLS1wYXBlci1ibHVlLTYwMDogIzFlODhlNTsKICAgICAgLS1wYXBlci1ibHVlLTcwMDogIzE5NzZkMjsKICAgICAgLS1wYXBlci1ibHVlLTgwMDogIzE1NjVjMDsKICAgICAgLS1wYXBlci1ibHVlLTkwMDogIzBkNDdhMTsKICAgICAgLS1wYXBlci1ibHVlLWExMDA6ICM4MmIxZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hMjAwOiAjNDQ4YWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTQwMDogIzI5NzlmZjsKICAgICAgLS1wYXBlci1ibHVlLWE3MDA6ICMyOTYyZmY7CgogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNTA6ICNlMWY1ZmU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0xMDA6ICNiM2U1ZmM7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0yMDA6ICM4MWQ0ZmE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0zMDA6ICM0ZmMzZjc7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS00MDA6ICMyOWI2ZjY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS01MDA6ICMwM2E5ZjQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS02MDA6ICMwMzliZTU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS03MDA6ICMwMjg4ZDE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS04MDA6ICMwMjc3YmQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS05MDA6ICMwMTU3OWI7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hMTAwOiAjODBkOGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTIwMDogIzQwYzRmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWE0MDA6ICMwMGIwZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hNzAwOiAjMDA5MWVhOwoKICAgICAgLS1wYXBlci1jeWFuLTUwOiAjZTBmN2ZhOwogICAgICAtLXBhcGVyLWN5YW4tMTAwOiAjYjJlYmYyOwogICAgICAtLXBhcGVyLWN5YW4tMjAwOiAjODBkZWVhOwogICAgICAtLXBhcGVyLWN5YW4tMzAwOiAjNGRkMGUxOwogICAgICAtLXBhcGVyLWN5YW4tNDAwOiAjMjZjNmRhOwogICAgICAtLXBhcGVyLWN5YW4tNTAwOiAjMDBiY2Q0OwogICAgICAtLXBhcGVyLWN5YW4tNjAwOiAjMDBhY2MxOwogICAgICAtLXBhcGVyLWN5YW4tNzAwOiAjMDA5N2E3OwogICAgICAtLXBhcGVyLWN5YW4tODAwOiAjMDA4MzhmOwogICAgICAtLXBhcGVyLWN5YW4tOTAwOiAjMDA2MDY0OwogICAgICAtLXBhcGVyLWN5YW4tYTEwMDogIzg0ZmZmZjsKICAgICAgLS1wYXBlci1jeWFuLWEyMDA6ICMxOGZmZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hNDAwOiAjMDBlNWZmOwogICAgICAtLXBhcGVyLWN5YW4tYTcwMDogIzAwYjhkNDsKCiAgICAgIC0tcGFwZXItdGVhbC01MDogI2UwZjJmMTsKICAgICAgLS1wYXBlci10ZWFsLTEwMDogI2IyZGZkYjsKICAgICAgLS1wYXBlci10ZWFsLTIwMDogIzgwY2JjNDsKICAgICAgLS1wYXBlci10ZWFsLTMwMDogIzRkYjZhYzsKICAgICAgLS1wYXBlci10ZWFsLTQwMDogIzI2YTY5YTsKICAgICAgLS1wYXBlci10ZWFsLTUwMDogIzAwOTY4ODsKICAgICAgLS1wYXBlci10ZWFsLTYwMDogIzAwODk3YjsKICAgICAgLS1wYXBlci10ZWFsLTcwMDogIzAwNzk2YjsKICAgICAgLS1wYXBlci10ZWFsLTgwMDogIzAwNjk1YzsKICAgICAgLS1wYXBlci10ZWFsLTkwMDogIzAwNGQ0MDsKICAgICAgLS1wYXBlci10ZWFsLWExMDA6ICNhN2ZmZWI7CiAgICAgIC0tcGFwZXItdGVhbC1hMjAwOiAjNjRmZmRhOwogICAgICAtLXBhcGVyLXRlYWwtYTQwMDogIzFkZTliNjsKICAgICAgLS1wYXBlci10ZWFsLWE3MDA6ICMwMGJmYTU7CgogICAgICAtLXBhcGVyLWdyZWVuLTUwOiAjZThmNWU5OwogICAgICAtLXBhcGVyLWdyZWVuLTEwMDogI2M4ZTZjOTsKICAgICAgLS1wYXBlci1ncmVlbi0yMDA6ICNhNWQ2YTc7CiAgICAgIC0tcGFwZXItZ3JlZW4tMzAwOiAjODFjNzg0OwogICAgICAtLXBhcGVyLWdyZWVuLTQwMDogIzY2YmI2YTsKICAgICAgLS1wYXBlci1ncmVlbi01MDA6ICM0Y2FmNTA7CiAgICAgIC0tcGFwZXItZ3JlZW4tNjAwOiAjNDNhMDQ3OwogICAgICAtLXBhcGVyLWdyZWVuLTcwMDogIzM4OGUzYzsKICAgICAgLS1wYXBlci1ncmVlbi04MDA6ICMyZTdkMzI7CiAgICAgIC0tcGFwZXItZ3JlZW4tOTAwOiAjMWI1ZTIwOwogICAgICAtLXBhcGVyLWdyZWVuLWExMDA6ICNiOWY2Y2E7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTIwMDogIzY5ZjBhZTsKICAgICAgLS1wYXBlci1ncmVlbi1hNDAwOiAjMDBlNjc2OwogICAgICAtLXBhcGVyLWdyZWVuLWE3MDA6ICMwMGM4NTM7CgogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTUwOiAjZjFmOGU5OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTEwMDogI2RjZWRjODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0yMDA6ICNjNWUxYTU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMzAwOiAjYWVkNTgxOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTQwMDogIzljY2M2NTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi01MDA6ICM4YmMzNGE7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNjAwOiAjN2NiMzQyOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTcwMDogIzY4OWYzODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi04MDA6ICM1NThiMmY7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tOTAwOiAjMzM2OTFlOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWExMDA6ICNjY2ZmOTA7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTIwMDogI2IyZmY1OTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hNDAwOiAjNzZmZjAzOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWE3MDA6ICM2NGRkMTc7CgogICAgICAtLXBhcGVyLWxpbWUtNTA6ICNmOWZiZTc7CiAgICAgIC0tcGFwZXItbGltZS0xMDA6ICNmMGY0YzM7CiAgICAgIC0tcGFwZXItbGltZS0yMDA6ICNlNmVlOWM7CiAgICAgIC0tcGFwZXItbGltZS0zMDA6ICNkY2U3NzU7CiAgICAgIC0tcGFwZXItbGltZS00MDA6ICNkNGUxNTc7CiAgICAgIC0tcGFwZXItbGltZS01MDA6ICNjZGRjMzk7CiAgICAgIC0tcGFwZXItbGltZS02MDA6ICNjMGNhMzM7CiAgICAgIC0tcGFwZXItbGltZS03MDA6ICNhZmI0MmI7CiAgICAgIC0tcGFwZXItbGltZS04MDA6ICM5ZTlkMjQ7CiAgICAgIC0tcGFwZXItbGltZS05MDA6ICM4Mjc3MTc7CiAgICAgIC0tcGFwZXItbGltZS1hMTAwOiAjZjRmZjgxOwogICAgICAtLXBhcGVyLWxpbWUtYTIwMDogI2VlZmY0MTsKICAgICAgLS1wYXBlci1saW1lLWE0MDA6ICNjNmZmMDA7CiAgICAgIC0tcGFwZXItbGltZS1hNzAwOiAjYWVlYTAwOwoKICAgICAgLS1wYXBlci15ZWxsb3ctNTA6ICNmZmZkZTc7CiAgICAgIC0tcGFwZXIteWVsbG93LTEwMDogI2ZmZjljNDsKICAgICAgLS1wYXBlci15ZWxsb3ctMjAwOiAjZmZmNTlkOwogICAgICAtLXBhcGVyLXllbGxvdy0zMDA6ICNmZmYxNzY7CiAgICAgIC0tcGFwZXIteWVsbG93LTQwMDogI2ZmZWU1ODsKICAgICAgLS1wYXBlci15ZWxsb3ctNTAwOiAjZmZlYjNiOwogICAgICAtLXBhcGVyLXllbGxvdy02MDA6ICNmZGQ4MzU7CiAgICAgIC0tcGFwZXIteWVsbG93LTcwMDogI2ZiYzAyZDsKICAgICAgLS1wYXBlci15ZWxsb3ctODAwOiAjZjlhODI1OwogICAgICAtLXBhcGVyLXllbGxvdy05MDA6ICNmNTdmMTc7CiAgICAgIC0tcGFwZXIteWVsbG93LWExMDA6ICNmZmZmOGQ7CiAgICAgIC0tcGFwZXIteWVsbG93LWEyMDA6ICNmZmZmMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE0MDA6ICNmZmVhMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE3MDA6ICNmZmQ2MDA7CgogICAgICAtLXBhcGVyLWFtYmVyLTUwOiAjZmZmOGUxOwogICAgICAtLXBhcGVyLWFtYmVyLTEwMDogI2ZmZWNiMzsKICAgICAgLS1wYXBlci1hbWJlci0yMDA6ICNmZmUwODI7CiAgICAgIC0tcGFwZXItYW1iZXItMzAwOiAjZmZkNTRmOwogICAgICAtLXBhcGVyLWFtYmVyLTQwMDogI2ZmY2EyODsKICAgICAgLS1wYXBlci1hbWJlci01MDA6ICNmZmMxMDc7CiAgICAgIC0tcGFwZXItYW1iZXItNjAwOiAjZmZiMzAwOwogICAgICAtLXBhcGVyLWFtYmVyLTcwMDogI2ZmYTAwMDsKICAgICAgLS1wYXBlci1hbWJlci04MDA6ICNmZjhmMDA7CiAgICAgIC0tcGFwZXItYW1iZXItOTAwOiAjZmY2ZjAwOwogICAgICAtLXBhcGVyLWFtYmVyLWExMDA6ICNmZmU1N2Y7CiAgICAgIC0tcGFwZXItYW1iZXItYTIwMDogI2ZmZDc0MDsKICAgICAgLS1wYXBlci1hbWJlci1hNDAwOiAjZmZjNDAwOwogICAgICAtLXBhcGVyLWFtYmVyLWE3MDA6ICNmZmFiMDA7CgogICAgICAtLXBhcGVyLW9yYW5nZS01MDogI2ZmZjNlMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtMTAwOiAjZmZlMGIyOwogICAgICAtLXBhcGVyLW9yYW5nZS0yMDA6ICNmZmNjODA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTMwMDogI2ZmYjc0ZDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNDAwOiAjZmZhNzI2OwogICAgICAtLXBhcGVyLW9yYW5nZS01MDA6ICNmZjk4MDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTYwMDogI2ZiOGMwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNzAwOiAjZjU3YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS04MDA6ICNlZjZjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTkwMDogI2U2NTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTEwMDogI2ZmZDE4MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTIwMDogI2ZmYWI0MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTQwMDogI2ZmOTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTcwMDogI2ZmNjUwMDsKCiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNTA6ICNmYmU5ZTc7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMTAwOiAjZmZjY2JjOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTIwMDogI2ZmYWI5MTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0zMDA6ICNmZjhhNjU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNDAwOiAjZmY3MDQzOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTUwMDogI2ZmNTcyMjsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS02MDA6ICNmNDUxMWU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNzAwOiAjZTY0YTE5OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTgwMDogI2Q4NDMxNTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS05MDA6ICNiZjM2MGM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTEwMDogI2ZmOWU4MDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hMjAwOiAjZmY2ZTQwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWE0MDA6ICNmZjNkMDA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMDogI2RkMmMwMDsKCiAgICAgIC0tcGFwZXItYnJvd24tNTA6ICNlZmViZTk7CiAgICAgIC0tcGFwZXItYnJvd24tMTAwOiAjZDdjY2M4OwogICAgICAtLXBhcGVyLWJyb3duLTIwMDogI2JjYWFhNDsKICAgICAgLS1wYXBlci1icm93bi0zMDA6ICNhMTg4N2Y7CiAgICAgIC0tcGFwZXItYnJvd24tNDAwOiAjOGQ2ZTYzOwogICAgICAtLXBhcGVyLWJyb3duLTUwMDogIzc5NTU0ODsKICAgICAgLS1wYXBlci1icm93bi02MDA6ICM2ZDRjNDE7CiAgICAgIC0tcGFwZXItYnJvd24tNzAwOiAjNWQ0MDM3OwogICAgICAtLXBhcGVyLWJyb3duLTgwMDogIzRlMzQyZTsKICAgICAgLS1wYXBlci1icm93bi05MDA6ICMzZTI3MjM7CgogICAgICAtLXBhcGVyLWdyZXktNTA6ICNmYWZhZmE7CiAgICAgIC0tcGFwZXItZ3JleS0xMDA6ICNmNWY1ZjU7CiAgICAgIC0tcGFwZXItZ3JleS0yMDA6ICNlZWVlZWU7CiAgICAgIC0tcGFwZXItZ3JleS0zMDA6ICNlMGUwZTA7CiAgICAgIC0tcGFwZXItZ3JleS00MDA6ICNiZGJkYmQ7CiAgICAgIC0tcGFwZXItZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tcGFwZXItZ3JleS02MDA6ICM3NTc1NzU7CiAgICAgIC0tcGFwZXItZ3JleS03MDA6ICM2MTYxNjE7CiAgICAgIC0tcGFwZXItZ3JleS04MDA6ICM0MjQyNDI7CiAgICAgIC0tcGFwZXItZ3JleS05MDA6ICMyMTIxMjE7CgogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDogI2VjZWZmMTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMTAwOiAjY2ZkOGRjOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0yMDA6ICNiMGJlYzU7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTMwMDogIzkwYTRhZTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNDAwOiAjNzg5MDljOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDA6ICM2MDdkOGI7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTYwMDogIzU0NmU3YTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNzAwOiAjNDU1YTY0OwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS04MDA6ICMzNzQ3NGY7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTkwMDogIzI2MzIzODsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGRhcmsgdGV4dCBvbiBhIGxpZ2h0IGJhY2tncm91bmQgKi8KICAgICAgLS1kYXJrLWRpdmlkZXItb3BhY2l0eTogMC4xMjsKICAgICAgLS1kYXJrLWRpc2FibGVkLW9wYWNpdHk6IDAuMzg7IC8qIG9yIGhpbnQgdGV4dCBvciBpY29uICovCiAgICAgIC0tZGFyay1zZWNvbmRhcnktb3BhY2l0eTogMC41NDsKICAgICAgLS1kYXJrLXByaW1hcnktb3BhY2l0eTogMC44NzsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGxpZ2h0IHRleHQgb24gYSBkYXJrIGJhY2tncm91bmQgKi8KICAgICAgLS1saWdodC1kaXZpZGVyLW9wYWNpdHk6IDAuMTI7CiAgICAgIC0tbGlnaHQtZGlzYWJsZWQtb3BhY2l0eTogMC4zOyAvKiBvciBoaW50IHRleHQgb3IgaWNvbiAqLwogICAgICAtLWxpZ2h0LXNlY29uZGFyeS1vcGFjaXR5OiAwLjc7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1vcGFjaXR5OiAxLjA7CgogICAgfQoKICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CiAgICAgIC8qCiAgICAgICAqIFlvdSBjYW4gdXNlIHRoZXNlIGdlbmVyaWMgdmFyaWFibGVzIGluIHlvdXIgZWxlbWVudHMgZm9yIGVhc3kgdGhlbWluZy4KICAgICAgICogRm9yIGV4YW1wbGUsIGlmIGFsbCB5b3VyIGVsZW1lbnRzIHVzZSBgLS1wcmltYXJ5LXRleHQtY29sb3JgIGFzIGl0cyBtYWluCiAgICAgICAqIGNvbG9yLCB0aGVuIHN3aXRjaGluZyBmcm9tIGEgbGlnaHQgdG8gYSBkYXJrIHRoZW1lIGlzIGp1c3QgYSBtYXR0ZXIgb2YKICAgICAgICogY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGAtLXByaW1hcnktdGV4dC1jb2xvcmAgaW4geW91ciBhcHBsaWNhdGlvbi4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS10ZXh0LWNvbG9yKTsKICAgICAgLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWJhY2tncm91bmQtY29sb3IpOwogICAgICAtLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3IpOwogICAgICAtLWRpc2FibGVkLXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWRpc2FibGVkLWNvbG9yKTsKICAgICAgLS1kaXZpZGVyLWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yKTsKICAgICAgLS1lcnJvci1jb2xvcjogdmFyKC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMCk7CgogICAgICAvKgogICAgICAgKiBQcmltYXJ5IGFuZCBhY2NlbnQgY29sb3JzLiBBbHNvIHNlZSBjb2xvci5odG1sIGZvciBtb3JlIGNvbG9ycy4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTEwMCk7CiAgICAgIC0tZGFyay1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNzAwKTsKCiAgICAgIC0tYWNjZW50LWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLWEyMDApOwogICAgICAtLWxpZ2h0LWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMTAwKTsKICAgICAgLS1kYXJrLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hNDAwKTsKCgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gTGlnaHQgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1saWdodC10aGVtZS1iYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWxpZ2h0LXRoZW1lLWJhc2UtY29sb3I6ICMwMDAwMDA7CiAgICAgIC0tbGlnaHQtdGhlbWUtdGV4dC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWxpZ2h0LXRoZW1lLXNlY29uZGFyeS1jb2xvcjogIzczNzM3MzsgIC8qIGZvciBzZWNvbmRhcnkgdGV4dCBhbmQgaWNvbnMgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzliOWI5YjsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWxpZ2h0LXRoZW1lLWRpdmlkZXItY29sb3I6ICNkYmRiZGI7CgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gRGFyayBiYWNrZ3JvdW5kIHRoZW1lCiAgICAgICAqLwogICAgICAtLWRhcmstdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWRhcmstdGhlbWUtYmFzZS1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1kYXJrLXRoZW1lLXRleHQtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS1zZWNvbmRhcnktY29sb3I6ICNiY2JjYmM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tZGFyay10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzY0NjQ2NDsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWRhcmstdGhlbWUtZGl2aWRlci1jb2xvcjogIzNjM2MzYzsKCiAgICAgIC8qCiAgICAgICAqIERlcHJlY2F0ZWQgdmFsdWVzIGJlY2F1c2Ugb2YgdGhlaXIgY29uZnVzaW5nIG5hbWVzLgogICAgICAgKi8KICAgICAgLS10ZXh0LXByaW1hcnktY29sb3I6IHZhcigtLWRhcmstdGhlbWUtdGV4dC1jb2xvcik7CiAgICAgIC0tZGVmYXVsdC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItY2hlY2tib3giPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplOiB2YXIoLS1wYXBlci1jaGVja2JveC1zaXplLCAxOHB4KTsKICAgICAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlZCBpbiBgYXR0YWNoZWRgLiAqLwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZTogdmFyKC0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUsIC0xcHgpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgICNjaGVja2JveENvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICAgICAgbWluLXdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpOwogICAgICAgIG1hcmdpbjogdmFyKC0tcGFwZXItY2hlY2tib3gtbWFyZ2luLCBpbml0aWFsKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItY2hlY2tib3gtdmVydGljYWwtYWxpZ24sIG1pZGRsZSk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgfQoKICAgICAgI2luayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwoKICAgICAgICAvKiBDZW50ZXIgdGhlIHJpcHBsZSBpbiB0aGUgY2hlY2tib3ggYnkgbmVnYXRpdmUgb2Zmc2V0dGluZyBpdCBieQogICAgICAgICAqIChpbmtXaWR0aCAtIHJpcHBsZVdpZHRoKSAvIDIgKi8KICAgICAgICB0b3A6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI2luazpkaXIocnRsKSB7CiAgICAgICAgcmlnaHQ6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBhdXRvOwogICAgICB9CgogICAgICAjaW5rW2NoZWNrZWRdIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI2NoZWNrYm94IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAycHg7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDE0MG1zLCBib3JkZXItY29sb3IgMTQwbXM7CiAgICAgIH0KCiAgICAgIC8qIGNoZWNrYm94IGNoZWNrZWQgYW5pbWF0aW9ucyAqLwogICAgICAjY2hlY2tib3guY2hlY2tlZCAjY2hlY2ttYXJrIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY2hlY2ttYXJrLWV4cGFuZCAxNDBtcyBlYXNlLW91dCBmb3J3YXJkczsKICAgICAgICBhbmltYXRpb246IGNoZWNrbWFyay1leHBhbmQgMTQwbXMgZWFzZS1vdXQgZm9yd2FyZHM7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjaGVja21hcmstZXhwYW5kIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCwgMCkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY2hlY2ttYXJrLWV4cGFuZCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNjaGVja2JveC5jaGVja2VkIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgICNjaGVja21hcmsgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMzYlOwogICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXItbGVmdDogbm9uZTsKICAgICAgICBib3JkZXItcmlnaHQtd2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2ttYXJrLWNvbG9yLCB3aGl0ZSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA5NyUgODYlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDk3JSA4NiU7CiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7IC8qIHByb3RlY3QgYWdhaW5zdCBwYWdlLWxldmVsIGJveC1zaXppbmcgKi8KICAgICAgfQoKICAgICAgI2NoZWNrbWFyazpkaXIocnRsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTQlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSAxNCU7CiAgICAgIH0KCiAgICAgIC8qIGxhYmVsICovCiAgICAgICNjaGVja2JveExhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nLCA4cHgpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWNoZWNrYm94LWxhYmVsOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNjaGVja2JveExhYmVsIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZC1jb2xvciwgdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkOwogICAgICB9CgogICAgICAjY2hlY2tib3hMYWJlbDpkaXIocnRsKSB7CiAgICAgICAgcGFkZGluZy1yaWdodDogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtc3BhY2luZywgOHB4KTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICAgIH0KCiAgICAgICNjaGVja2JveExhYmVsW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3ggewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNjaGVja2JveCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNjaGVja2JveExhYmVsICB7CiAgICAgICAgb3BhY2l0eTogMC42NTsKICAgICAgfQoKICAgICAgLyogaW52YWxpZCBzdGF0ZSAqLwogICAgICAjY2hlY2tib3guaW52YWxpZDpub3QoLmNoZWNrZWQpIHsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWVycm9yLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9ImNoZWNrYm94Q29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iY2hlY2tib3giIGNsYXNzJD0iW1tfY29tcHV0ZUNoZWNrYm94Q2xhc3MoY2hlY2tlZCwgaW52YWxpZCldXSI+CiAgICAgICAgPGRpdiBpZD0iY2hlY2ttYXJrIiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja21hcmtDbGFzcyhjaGVja2VkKV1dIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjaGVja2JveExhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIGZpbGw6IHZhcigtLWlyb24taWNvbi1maWxsLWNvbG9yLCBjdXJyZW50Y29sb3IpOwogICAgICAgIHN0cm9rZTogdmFyKC0taXJvbi1pY29uLXN0cm9rZS1jb2xvciwgbm9uZSk7CgogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWljb24td2lkdGgsIDI0cHgpOwogICAgICAgIGhlaWdodDogdmFyKC0taXJvbi1pY29uLWhlaWdodCwgMjRweCk7CiAgICAgICAgQGFwcGx5IC0taXJvbi1pY29uOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWExMXktYW5ub3VuY2VyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIGNsaXA6IHJlY3QoMHB4LDBweCwwcHgsMHB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgYXJpYS1saXZlJD0iW1ttb2RlXV0iPltbX3RleHRdXTwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taW5wdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJjb250ZW50Ij48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogU2hhcmVkIFN0eWxlcyAqLwogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U6IHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90bycsICdOb3RvJywgc2Fucy1zZXJpZjsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tY29kZTogewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCAnQ29uc29sYXMnLCAnTWVubG8nLCBtb25vc3BhY2U7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWV4cGVuc2l2ZS1rZXJuaW5nOiB7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOiB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9OwoKICAgICAgLyogTWF0ZXJpYWwgRm9udCBTdHlsZXMgKi8KCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5NDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDExMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDQ0ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkzOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogNTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAyNmVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA2MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiA0NXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDE4ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDM0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWhlYWRsaW5lOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDEyZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDMycHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtdGl0bGU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtc3ViaGVhZDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJvZHkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYm9keTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jYXB0aW9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LW1lbnU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYnV0dG9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxOGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29kZTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb2RlMTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgIH0KCiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWNoYXItY291bnRlciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsb2F0OiByaWdodDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNoYXItY291bnRlcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpkaXIocnRsKSkgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzcGFuPltbX2NoYXJDb3VudGVyU3RyXV08L3NwYW4+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlOiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiB0byBtYWtlIGEgc3RhY2tpbmcgY29udGV4dCAqLwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgfTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1jb250YWluZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2lubGluZV0pIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjMzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICB9CgogICAgICAudW5kZXJsaW5lIHsKICAgICAgICBoZWlnaHQ6IDJweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLDEsMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1mb2N1czsKICAgICAgfQoKICAgICAgLnVuZGVybGluZS5pcy1oaWdobGlnaHRlZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWludmFsaWQgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzLCB3aWR0aCAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgLyogRml4IGZvciBzYWZhcmkgbm90IGZvY3VzaW5nIDAtaGVpZ2h0IGRhdGUvdGltZSBpbnB1dHMgd2l0aCAtd2Via2l0LWFwcGVyYW5jZTogbm9uZTsgKi8KICAgICAgICBtaW4taGVpZ2h0OiAxcHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwoKICAgICAgICAvKiBTaW5jZSB3ZSBzY2FsZSB0byA3NS8xMDAgb2YgdGhlIHNpemUsIHdlIGFjdHVhbGx5IGhhdmUgMTAwLzc1IG9mIHRoZQogICAgICAgIG9yaWdpbmFsIHNwYWNlIG5vdyBhdmFpbGFibGUgKi8KICAgICAgICB3aWR0aDogMTMzJTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZsb2F0aW5nOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICAvKiBUaGUgYXBwbHkgc2hpbSBkb2Vzbid0IGFwcGx5IHRoZSBuZXN0ZWQgY29sb3IgY3VzdG9tIHByb3BlcnR5LAogICAgICAgICAgc28gd2UgaGF2ZSB0byByZS1hcHBseSBpdCBoZXJlLiAqLwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1pbnZhbGlkOwogICAgICB9CgogICAgICAucHJlZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXByZWZpeDsKICAgICAgfQoKICAgICAgLnN1ZmZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtc3VmZml4OwogICAgICB9CgogICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSkgewogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciIgYXJpYS1oaWRkZW49InRydWUiIGhpZGRlbj0iW1tub0xhYmVsRmxvYXRdXSI+Jm5ic3A7PC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPjxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90Pjwvc3Bhbj4KCiAgICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlSW5wdXRDb250ZW50Q2xhc3Mobm9MYWJlbEZsb2F0LGFsd2F5c0Zsb2F0TGFiZWwsZm9jdXNlZCxpbnZhbGlkLF9pbnB1dEhhc0NvbnRlbnQpXV0iIGlkPSJsYWJlbEFuZElucHV0Q29udGFpbmVyIj4KICAgICAgICA8c2xvdCBuYW1lPSJsYWJlbCI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9ImlucHV0Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPHNwYW4gY2xhc3M9InN1ZmZpeCI+PHNsb3QgbmFtZT0ic3VmZml4Ij48L3Nsb3Q+PC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVVbmRlcmxpbmVDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJ1bmZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxzbG90IG5hbWU9ImFkZC1vbiI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWVycm9yIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWludmFsaWQtY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1lcnJvcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDowOwogICAgICAgIHJpZ2h0OjA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgewogICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgIH07CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtmb2N1c2VkXSkgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhlIDxpbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMgaXQuCiAgICAgIEluIDIueCB0aGUgPGlyb24taW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzCiAgICAgIGl0LCBidXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHksIHdlIG5lZWQgdG8gcmVzZXQgc29tZQogICAgICBvZiB0aGUgbmF0aXZlIGlucHV0J3MgcHJvcGVydGllcyB0byBpbmhlcml0IChmcm9tIHRoZSBpcm9uLWlucHV0KSAqLwogICAgICBpcm9uLWlucHV0ID4gaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIHdvcmQtc3BhY2luZzogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jbGVhci1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLWNsZWFyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtcmV2ZWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtcmV2ZWFsOwogICAgICB9CgogICAgICBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIGlkPSJjb250YWluZXIiIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPHNsb3QgbmFtZT0icHJlZml4IiBzbG90PSJwcmVmaXgiPjwvc2xvdD4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDxzcGFuIGlkPSJ0ZW1wbGF0ZS1wbGFjZWhvbGRlciI+PC9zcGFuPgoKICAgICAgPHNsb3QgbmFtZT0ic3VmZml4IiBzbG90PSJzdWZmaXgiPjwvc2xvdD4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgoKICAKICA8dGVtcGxhdGUgaWQ9InYwIj4KICAgIDxpbnB1dCBpcz0iaXJvbi1pbnB1dCIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgaW52YWxpZD0ie3tpbnZhbGlkfX0iIHByZXZlbnQtaW52YWxpZC1pbnB1dD0iW1twcmV2ZW50SW52YWxpZElucHV0XV0iIGFsbG93ZWQtcGF0dGVybj0iW1thbGxvd2VkUGF0dGVybl1dIiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgPC90ZW1wbGF0ZT4KCiAgPHRlbXBsYXRlIGlkPSJ2MSI+CiAgICAKICAgIDxpcm9uLWlucHV0IGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYWxsb3dlZC1wYXR0ZXJuPSJbW2FsbG93ZWRQYXR0ZXJuXV0iIGludmFsaWQ9Int7aW52YWxpZH19IiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iPgogICAgICA8aW5wdXQgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgICA8L2lyb24taW5wdXQ+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1vdmVybGF5LWJhY2tkcm9wIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pcm9uLW92ZXJsYXktYmFja2Ryb3AtYmFja2dyb3VuZC1jb2xvciwgIzAwMCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wOwogICAgICB9CgogICAgICA6aG9zdCgub3BlbmVkKSB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wYWNpdHksIDAuNik7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wZW5lZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1kcm9wZG93biI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyLmFuaW1hdGluZyA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudFdyYXBwZXIiPgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbWVudS1idXR0b24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiPgogICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIGNsYXNzPSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvaXJvbi1kcm9wZG93bj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItZHJvcGRvd24tbWVudSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj48cGF0aCBkPSJNNyAxMGw1IDUgNS01eiI+PC9wYXRoPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKCiAgICAgICAgLyogTk9URShjZGF0YSk6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlCiAgICAgICAgICogdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4KICAgICAgICAgKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbbm9pbmtdKSBwYXBlci1yaXBwbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtuby1sYWJlbC1mbG9hdF0pIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiAxMnB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICByaWdodDogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LXJpcHBsZTsKICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcik7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaWNvbjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZHJvcGRvd24tbWVudSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRyb3Bkb3duLW1lbnUtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAKICAgIDxzcGFuIHJvbGU9ImJ1dHRvbiI+PC9zcGFuPgogICAgPHBhcGVyLW1lbnUtYnV0dG9uIGlkPSJtZW51QnV0dG9uIiB2ZXJ0aWNhbC1hbGlnbj0iW1t2ZXJ0aWNhbEFsaWduXV0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIGR5bmFtaWMtYWxpZ249IltbZHluYW1pY0FsaWduXV0iIHZlcnRpY2FsLW9mZnNldD0iW1tfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldChub0xhYmVsRmxvYXQsIHZlcnRpY2FsT2Zmc2V0KV1dIiBkaXNhYmxlZD0iW1tkaXNhYmxlZF1dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBvbi1pcm9uLXNlbGVjdD0iX29uSXJvblNlbGVjdCIgb24taXJvbi1kZXNlbGVjdD0iX29uSXJvbkRlc2VsZWN0IiBvcGVuZWQ9Int7b3BlbmVkfX0iIGNsb3NlLW9uLWFjdGl2YXRlIGFsbG93LW91dHNpZGUtc2Nyb2xsPSJbW2FsbG93T3V0c2lkZVNjcm9sbF1dIiByZXN0b3JlLWZvY3VzLW9uLWNsb3NlPSJbW3Jlc3RvcmVGb2N1c09uQ2xvc2VdXSI+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIj4KICAgICAgICA8cGFwZXItcmlwcGxlPjwvcGFwZXItcmlwcGxlPgogICAgICAgIAogICAgICAgIDxwYXBlci1pbnB1dCB0eXBlPSJ0ZXh0IiBpbnZhbGlkPSJbW2ludmFsaWRdXSIgcmVhZG9ubHkgZGlzYWJsZWQ9IltbZGlzYWJsZWRdXSIgdmFsdWU9IltbdmFsdWVdXSIgcGxhY2Vob2xkZXI9IltbcGxhY2Vob2xkZXJdXSIgZXJyb3ItbWVzc2FnZT0iW1tlcnJvck1lc3NhZ2VdXSIgYWx3YXlzLWZsb2F0LWxhYmVsPSJbW2Fsd2F5c0Zsb2F0TGFiZWxdXSIgbm8tbGFiZWwtZmxvYXQ9Iltbbm9MYWJlbEZsb2F0XV0iIGxhYmVsPSJbW2xhYmVsXV0iPgogICAgICAgICAgCiAgICAgICAgICA8aXJvbi1pY29uIGljb249InBhcGVyLWRyb3Bkb3duLW1lbnU6YXJyb3ctZHJvcC1kb3duIiBzdWZmaXggc2xvdD0ic3VmZml4Ij48L2lyb24taWNvbj4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgICAgPHNsb3QgaWQ9ImNvbnRlbnQiIG5hbWU9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPjwvc2xvdD4KICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbGlzdGJveCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CgogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLWxpc3Rib3gtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWxpc3Rib3gtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1saXN0Ym94OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QsIC5wYXBlci1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1taW4taGVpZ2h0LCA0OHB4KTsKICAgICAgICBwYWRkaW5nOiAwcHggMTZweDsKICAgICAgfQoKICAgICAgLnBhcGVyLWl0ZW0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBib3JkZXI6bm9uZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgLnBhcGVyLWl0ZW1baGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCguaXJvbi1zZWxlY3RlZCksIC5wYXBlci1pdGVtLmlyb24tc2VsZWN0ZWQgewogICAgICAgIGZvbnQtd2VpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLXNlbGVjdGVkLXdlaWdodCwgYm9sZCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pLCAucGFwZXItaXRlbVtkaXNhYmxlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pdGVtLWRpc2FibGVkLWNvbG9yLCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cyksIC5wYXBlci1pdGVtOmZvY3VzIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogMDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1mb2N1c2VkOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpOmJlZm9yZSwgLnBhcGVyLWl0ZW06Zm9jdXM6YmVmb3JlIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwoKICAgICAgICBiYWNrZ3JvdW5kOiBjdXJyZW50Q29sb3I7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tZGFyay1kaXZpZGVyLW9wYWNpdHkpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWZvY3VzZWQtYmVmb3JlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzIj4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iYWNrZW5kIj4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zdG9yYWdlIj4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGFnLWZpbHRlcmVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgbGFiZWw9IkZpbHRlciB0YWdzIChyZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnRlZCkiIHZhbHVlPSJ7e190YWdGaWx0ZXJ9fSIgY2xhc3M9InNlYXJjaC1pbnB1dCI+CiAgICAgIDxpcm9uLWljb24gcHJlZml4IGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmxheW91dC5ob3Jpem9udGFsLAogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5pbmxpbmUgewogICAgICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmxheW91dC53cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5uby13cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZmxleCB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC1hdXRvIHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgLmZsZXgtbm9uZSB7CiAgICAgICAgLW1zLWZsZXg6IG5vbmU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiBub25lOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtcmV2ZXJzZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSwKICAgICAgLmxheW91dC52ZXJ0aWNhbC1yZXZlcnNlIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5ob3Jpem9udGFsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtYWxpZ25tZW50Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlciwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZCB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmFzZWxpbmUgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGVuZDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5hcm91bmQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGYgYWxpZ25tZW50LgogICAgICAgKi8KICAgICAgLnNlbGYtc3RhcnQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAuc2VsZi1jZW50ZXIgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9CgogICAgICAuc2VsZi1lbmQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAuc2VsZi1zdHJldGNoIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgfQoKICAgICAgLnNlbGYtYmFzZWxpbmUgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IHN0YXJ0OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGVuZDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBjZW50ZXI7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmV0d2Vlbi1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGp1c3RpZnk7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYXJvdW5kLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZGlzdHJpYnV0ZTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1mbGV4LWZhY3RvcnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmZsZXgsCiAgICAgIC5mbGV4LTEgewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfQoKICAgICAgLmZsZXgtMiB7CiAgICAgICAgLW1zLWZsZXg6IDI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAyOwogICAgICAgIGZsZXg6IDI7CiAgICAgIH0KCiAgICAgIC5mbGV4LTMgewogICAgICAgIC1tcy1mbGV4OiAzOwogICAgICAgIC13ZWJraXQtZmxleDogMzsKICAgICAgICBmbGV4OiAzOwogICAgICB9CgogICAgICAuZmxleC00IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfQoKICAgICAgLmZsZXgtNSB7CiAgICAgICAgLW1zLWZsZXg6IDU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA1OwogICAgICAgIGZsZXg6IDU7CiAgICAgIH0KCiAgICAgIC5mbGV4LTYgewogICAgICAgIC1tcy1mbGV4OiA2OwogICAgICAgIC13ZWJraXQtZmxleDogNjsKICAgICAgICBmbGV4OiA2OwogICAgICB9CgogICAgICAuZmxleC03IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfQoKICAgICAgLmZsZXgtOCB7CiAgICAgICAgLW1zLWZsZXg6IDg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA4OwogICAgICAgIGZsZXg6IDg7CiAgICAgIH0KCiAgICAgIC5mbGV4LTkgewogICAgICAgIC1tcy1mbGV4OiA5OwogICAgICAgIC13ZWJraXQtZmxleDogOTsKICAgICAgICBmbGV4OiA5OwogICAgICB9CgogICAgICAuZmxleC0xMCB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH0KCiAgICAgIC5mbGV4LTExIHsKICAgICAgICAtbXMtZmxleDogMTE7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMTsKICAgICAgICBmbGV4OiAxMTsKICAgICAgfQoKICAgICAgLmZsZXgtMTIgewogICAgICAgIC1tcy1mbGV4OiAxMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDEyOwogICAgICAgIGZsZXg6IDEyOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1wb3NpdGlvbmluZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaW52aXNpYmxlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnJlbGF0aXZlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIGJvZHkuZnVsbGJsZWVkIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNjcm9sbCB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwogICAgICAuZml4ZWQtYm90dG9tLAogICAgICAuZml4ZWQtbGVmdCwKICAgICAgLmZpeGVkLXJpZ2h0LAogICAgICAuZml4ZWQtdG9wIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtcmlnaHQgewogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1ib3R0b20gewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtbGVmdCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogIDpyb290IHsKICAgIC0tdGItb3JhbmdlLXdlYWs6ICNmZmE3MjY7CiAgICAtLXRiLW9yYW5nZS1zdHJvbmc6ICNmNTdjMDA7CiAgICAtLXRiLW9yYW5nZS1kYXJrOiAjZGM3MzIwOwogICAgLS10Yi1ncmV5LWRhcmtlcjogI2UyZTJlMjsKICAgIC0tdGItZ3JleS1saWdodGVyOiAjZjNmM2YzOwogICAgLS10Yi11aS1kYXJrLWFjY2VudDogIzc1NzU3NTsKICAgIC0tdGItdWktbGlnaHQtYWNjZW50OiAjZTBlMGUwOwogICAgLS10Yi1ncmFwaC1mYWRlZDogI2UwZDRiMzsKICB9Cjwvc3R5bGU+CgoKPGRvbS1tb2R1bGUgaWQ9ImRhc2hib2FyZC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nOiAxNXB4OwogICAgICAgIC0tc2lkZWJhci1sZWZ0LXBhZGRpbmc6IDMwcHg7CiAgICAgIH0KCiAgICAgIFtzbG90PSdzaWRlYmFyJ10gewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHBhZGRpbmc6IDVweCAwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgbGVmdDogdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpOwogICAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgKiAyKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgLnNlYXJjaC1pbnB1dCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDVweCAwIDEwcHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gewogICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpOwogICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMAogICAgICAgICAgdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbjpsYXN0LW9mLXR5cGUgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgcGFkZGluZy10b3A6IDA7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiBoMyB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJzY3JvbGxiYXItc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRhc2hib2FyZC1sYXlvdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InNpZGViYXIiPgogICAgICA8c2xvdCBuYW1lPSJzaWRlYmFyIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjZW50ZXIiPgogICAgICA8c2xvdCBuYW1lPSJjZW50ZXIiIGNsYXNzPSJzY29sbGJhciI+PC9zbG90PgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpZGViYXIgewogICAgICAgIGZsZXg6IDAgMCB2YXIoLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItYmFzaXMsIDI1JSk7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1heC13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aCwgMzUwcHgpOwogICAgICAgIG1pbi13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1pbi13aWR0aCwgMjcwcHgpOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgICNjZW50ZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKFtzbG90PSdjZW50ZXInXSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAudGYtZ3JhcGgtZGFzaGJvYXJkICNjZW50ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcHRpb24tc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9IndyYXAiPgogICAgICA8aDM+W1tuYW1lXV08L2gzPgogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LXdyYXBwZXIiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCguc2VsZWN0ZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIGgzIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogMCAwIDVweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWNvbGxhcHNlIj4KCiAgPHRlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLWlyb24tY29sbGFwc2UtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMzAwbXMpOwogICAgICAgIC8qIFNhZmFyaSAxMCBuZWVkcyB0aGlzIHByb3BlcnR5IHByZWZpeGVkIHRvIGNvcnJlY3RseSBhcHBseSB0aGUgY3VzdG9tIHByb3BlcnR5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmlyb24tY29sbGFwc2UtY2xvc2VkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1jb2xsYXBzZS1vcGVuZWQpKSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CgogIDwvdGVtcGxhdGU+Cgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcGFuZVJlbmRlcmVkXV0iIGlkPSJpZlJlbmRlcmVkIj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iaGVhZGluZyIgb24tdGFwPSJfdG9nZ2xlUGFuZSIgb3Blbi1idXR0b24kPSJbW29wZW5lZF1dIj4KICAgICAgICA8c3BhbiBjbGFzcz0ibmFtZSI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0NvbXBvc2l0ZVNlYXJjaChjYXRlZ29yeSldXSI+CiAgICAgICAgICAgICAgPHNwYW4+VGFncyBtYXRjaGluZyBtdWx0aXBsZSBleHBlcmltZW50czwvc3Bhbj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzSW52YWxpZFNlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4mbmJzcDs8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc0NvbXBvc2l0ZVNlYXJjaChjYXRlZ29yeSldXSI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxpZ2h0Ij5UYWdzIG1hdGNoaW5nIC88L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LW5hbWUiIHRpdGxlJD0iW1tjYXRlZ29yeS5uYW1lXV0iPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaWdodCI+Lzwvc3Bhbj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVW5pdmVyc2FsU2VhcmNoUXVlcnldXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4gKGFsbCB0YWdzKTwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNJbnZhbGlkU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgICAgIDxzcGFuPiA8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LW5hbWUiIHRpdGxlJD0iW1tjYXRlZ29yeS5uYW1lXV0iPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvdW50Ij4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVdXSI+CiAgICAgICAgICAgIDxzcGFuPltbX2NvdW50XV08L3NwYW4+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJleHBhbmQtbW9yZSIgY2xhc3M9ImV4cGFuZC1hcnJvdyI+PC9pcm9uLWljb24+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2J1dHRvbj4KICAgICAgCiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tvcGVuZWRdXSIgbm8tYW5pbWF0aW9uPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgPHNwYW4gaWQ9InRvcC1vZi1jb250YWluZXIiPjwvc3Bhbj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbXVsdGlwbGVQYWdlc0V4aXN0XV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJiaWctcGFnZS1idXR0b25zIiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMTBweDsiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybVByZXZpb3VzUGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzUHJldmlvdXNQYWdlXV0iPlByZXZpb3VzIHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iX3BlcmZvcm1OZXh0UGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzTmV4dFBhZ2VdXSI+TmV4dCBwYWdlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGlkPSJpdGVtcyI+CiAgICAgICAgICAgIDxzbG90IG5hbWU9Iml0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbXVsdGlwbGVQYWdlc0V4aXN0XV0iPgogICAgICAgICAgICA8ZGl2IGlkPSJjb250cm9scy1jb250YWluZXIiPgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogMCA1cHgiPgogICAgICAgICAgICAgICAgUGFnZQogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJwYWdlLWlucHV0IiB0eXBlPSJudW1iZXIiIG5vLWxhYmVsLWZsb2F0IG1pbj0iMSIgbWF4PSJbW19wYWdlQ291bnRdXSIgdmFsdWU9IltbX3BhZ2VJbnB1dFZhbHVlXV0iIG9uLWlucHV0PSJfaGFuZGxlUGFnZUlucHV0RXZlbnQiIG9uLWNoYW5nZT0iX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCIgb24tZm9jdXM9Il9oYW5kbGVQYWdlRm9jdXNFdmVudCIgb24tYmx1cj0iX2hhbmRsZVBhZ2VCbHVyRXZlbnQiPjwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICBvZiBbW19wYWdlQ291bnRdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNQcmV2aW91c1BhZ2VdXSI+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybU5leHRQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIj5OZXh0IHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAwIDVweCAxcHggMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZpcnN0LW9mLXR5cGUpIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICA6aG9zdCg6bGFzdC1vZi10eXBlKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmhlYWRpbmcgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgIH0KCiAgICAgIFtvcGVuLWJ1dHRvbl0gewogICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbb3Blbi1idXR0b25dIC5leHBhbmQtYXJyb3cgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlWigxODBkZWcpOwogICAgICB9CgogICAgICAubmFtZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmxpZ2h0IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICB9CgogICAgICAuY2F0ZWdvcnktbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHBhZGRpbmc6IDJweCAwOwogICAgICB9CgogICAgICAuY291bnQgewogICAgICAgIG1hcmdpbjogMCA1cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGVkZWRlOwogICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgIH0KCiAgICAgIC5saWdodCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbGV4LWJhc2lzOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIH0KCiAgICAgIHNsb3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgICNwYWdlLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IHZhcigtLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgsIDEwMCUpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZGlhbG9nLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbjogMjRweCA0MHB4OwoKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1kaWFsb2ctYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWRpYWxvZy1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtYm9keTE7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZzsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG1hcmdpbi10b3A6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMCAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgubm8tcGFkZGluZykgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIAogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgqOmZpcnN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpsYXN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQoKICAgICAgLyogSW4gMS54LCB0aGlzIHNlbGVjdG9yIHdhcyBgOmhvc3QgPiA6OmNvbnRlbnQgaDJgLiBJbiAyLnggPHNsb3Q+IGFsbG93cwogICAgICB0byBzZWxlY3QgZGlyZWN0IGNoaWxkcmVuIG9ubHksIHdoaWNoIGluY3JlYXNlcyB0aGUgd2VpZ2h0IG9mIHRoaXMKICAgICAgc2VsZWN0b3IsIHNvIHdlIGhhdmUgdG8gcmUtZGVmaW5lIGZpcnN0LWNoaWxkL2xhc3QtY2hpbGQgbWFyZ2lucyBiZWxvdy4gKi8KICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDIpIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAwOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXRpdGxlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tdG9wLiAqLwogICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXRpdGxlOwogICAgICB9CgogICAgICAvKiBBcHBseSBtaXhpbiBhZ2FpbiwgaW4gY2FzZSBpdCBzZXRzIG1hcmdpbi1ib3R0b20uICovCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyOmxhc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLnBhcGVyLWRpYWxvZy1idXR0b25zKSwKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLmJ1dHRvbnMpIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4IDhweCA4cHggMjRweDsKICAgICAgICBtYXJnaW46IDA7CgogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctYnV0dG9uLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY29sb3Itc2NhbGUiPgogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgo8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJpY29ucyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iM2Qtcm90YXRpb24iPjxwYXRoIGQ9Ik03LjUyIDIxLjQ4QzQuMjUgMTkuOTQgMS45MSAxNi43NiAxLjU1IDEzSC4wNUMuNTYgMTkuMTYgNS43MSAyNCAxMiAyNGwuNjYtLjAzLTMuODEtMy44MS0xLjMzIDEuMzJ6bS44OS02LjUyYy0uMTkgMC0uMzctLjAzLS41Mi0uMDgtLjE2LS4wNi0uMjktLjEzLS40LS4yNC0uMTEtLjEtLjItLjIyLS4yNi0uMzctLjA2LS4xNC0uMDktLjMtLjA5LS40N2gtMS4zYzAgLjM2LjA3LjY4LjIxLjk1LjE0LjI3LjMzLjUuNTYuNjkuMjQuMTguNTEuMzIuODIuNDEuMy4xLjYyLjE1Ljk2LjE1LjM3IDAgLjcyLS4wNSAxLjAzLS4xNS4zMi0uMS42LS4yNS44My0uNDRzLjQyLS40My41NS0uNzJjLjEzLS4yOS4yLS42MS4yLS45NyAwLS4xOS0uMDItLjM4LS4wNy0uNTYtLjA1LS4xOC0uMTItLjM1LS4yMy0uNTEtLjEtLjE2LS4yNC0uMy0uNC0uNDMtLjE3LS4xMy0uMzctLjIzLS42MS0uMzEuMi0uMDkuMzctLjIuNTItLjMzLjE1LS4xMy4yNy0uMjcuMzctLjQyLjEtLjE1LjE3LS4zLjIyLS40Ni4wNS0uMTYuMDctLjMyLjA3LS40OCAwLS4zNi0uMDYtLjY4LS4xOC0uOTYtLjEyLS4yOC0uMjktLjUxLS41MS0uNjktLjItLjE5LS40Ny0uMzMtLjc3LS40M0M5LjEgOC4wNSA4Ljc2IDggOC4zOSA4Yy0uMzYgMC0uNjkuMDUtMSAuMTYtLjMuMTEtLjU3LjI2LS43OS40NS0uMjEuMTktLjM4LjQxLS41MS42Ny0uMTIuMjYtLjE4LjU0LS4xOC44NWgxLjNjMC0uMTcuMDMtLjMyLjA5LS40NXMuMTQtLjI1LjI1LS4zNGMuMTEtLjA5LjIzLS4xNy4zOC0uMjIuMTUtLjA1LjMtLjA4LjQ4LS4wOC40IDAgLjcuMS44OS4zMS4xOS4yLjI5LjQ5LjI5Ljg2IDAgLjE4LS4wMy4zNC0uMDguNDktLjA1LjE1LS4xNC4yNy0uMjUuMzctLjExLjEtLjI1LjE4LS40MS4yNC0uMTYuMDYtLjM2LjA5LS41OC4wOUg3LjV2MS4wM2guNzdjLjIyIDAgLjQyLjAyLjYuMDdzLjMzLjEzLjQ1LjIzYy4xMi4xMS4yMi4yNC4yOS40LjA3LjE2LjEuMzUuMS41NyAwIC40MS0uMTIuNzItLjM1LjkzLS4yMy4yMy0uNTUuMzMtLjk1LjMzem04LjU1LTUuOTJjLS4zMi0uMzMtLjctLjU5LTEuMTQtLjc3LS40My0uMTgtLjkyLS4yNy0xLjQ2LS4yN0gxMnY4aDIuM2MuNTUgMCAxLjA2LS4wOSAxLjUxLS4yNy40NS0uMTguODQtLjQzIDEuMTYtLjc2LjMyLS4zMy41Ny0uNzMuNzQtMS4xOS4xNy0uNDcuMjYtLjk5LjI2LTEuNTd2LS40YzAtLjU4LS4wOS0xLjEtLjI2LTEuNTctLjE4LS40Ny0uNDMtLjg3LS43NS0xLjJ6bS0uMzkgMy4xNmMwIC40Mi0uMDUuNzktLjE0IDEuMTMtLjEuMzMtLjI0LjYyLS40My44NS0uMTkuMjMtLjQzLjQxLS43MS41My0uMjkuMTItLjYyLjE4LS45OS4xOGgtLjkxVjkuMTJoLjk3Yy43MiAwIDEuMjcuMjMgMS42NC42OS4zOC40Ni41NyAxLjEyLjU3IDEuOTl2LjR6TTEyIDBsLS42Ni4wMyAzLjgxIDMuODEgMS4zMy0xLjMzYzMuMjcgMS41NSA1LjYxIDQuNzIgNS45NiA4LjQ4aDEuNUMyMy40NCA0Ljg0IDE4LjI5IDAgMTIgMHoiIC8+PC9nPgo8ZyBpZD0iYWNjZXNzaWJpbGl0eSI+PHBhdGggZD0iTTEyIDJjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem05IDdoLTZ2MTNoLTJ2LTZoLTJ2Nkg5VjlIM1Y3aDE4djJ6IiAvPjwvZz4KPGcgaWQ9ImFjY2Vzc2libGUiPjxjaXJjbGUgY3g9IjEyIiBjeT0iNCIgcj0iMiIgLz48cGF0aCBkPSJNMTkgMTN2LTJjLTEuNTQuMDItMy4wOS0uNzUtNC4wNy0xLjgzbC0xLjI5LTEuNDNjLS4xNy0uMTktLjM4LS4zNC0uNjEtLjQ1LS4wMSAwLS4wMS0uMDEtLjAyLS4wMUgxM2MtLjM1LS4yLS43NS0uMy0xLjE5LS4yNkMxMC43NiA3LjExIDEwIDguMDQgMTAgOS4wOVYxNWMwIDEuMS45IDIgMiAyaDV2NWgydi01LjVjMC0xLjEtLjktMi0yLTJoLTN2LTMuNDVjMS4yOSAxLjA3IDMuMjUgMS45NCA1IDEuOTV6bS02LjE3IDVjLS40MSAxLjE2LTEuNTIgMi0yLjgzIDItMS42NiAwLTMtMS4zNC0zLTMgMC0xLjMxLjg0LTIuNDEgMi0yLjgzVjEyLjFjLTIuMjguNDYtNCAyLjQ4LTQgNC45IDAgMi43NiAyLjI0IDUgNSA1IDIuNDIgMCA0LjQ0LTEuNzIgNC45LTRoLTIuMDd6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYmFsYW5jZSI+PHBhdGggZD0iTTQgMTB2N2gzdi03SDR6bTYgMHY3aDN2LTdoLTN6TTIgMjJoMTl2LTNIMnYzem0xNC0xMnY3aDN2LTdoLTN6bS00LjUtOUwyIDZ2MmgxOVY2bC05LjUtNXoiIC8+PC9nPgo8ZyBpZD0iYWNjb3VudC1iYWxhbmNlLXdhbGxldCI+PHBhdGggZD0iTTIxIDE4djFjMCAxLjEtLjkgMi0yIDJINWMtMS4xMSAwLTItLjktMi0yVjVjMC0xLjEuODktMiAyLTJoMTRjMS4xIDAgMiAuOSAyIDJ2MWgtOWMtMS4xMSAwLTIgLjktMiAydjhjMCAxLjEuODkgMiAyIDJoOXptLTktMmgxMFY4SDEydjh6bTQtMi41Yy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0iYWNjb3VudC1ib3giPjxwYXRoIGQ9Ik0zIDV2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMkg1Yy0xLjExIDAtMiAuOS0yIDJ6bTEyIDRjMCAxLjY2LTEuMzQgMy0zIDNzLTMtMS4zNC0zLTMgMS4zNC0zIDMtMyAzIDEuMzQgMyAzem0tOSA4YzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxSDZ2LTF6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptMCAxNC4yYy0yLjUgMC00LjcxLTEuMjgtNi0zLjIyLjAzLTEuOTkgNC0zLjA4IDYtMy4wOCAxLjk5IDAgNS45NyAxLjA5IDYgMy4wOC0xLjI5IDEuOTQtMy41IDMuMjItNiAzLjIyeiIgLz48L2c+CjxnIGlkPSJhZGQiPjxwYXRoIGQ9Ik0xOSAxM2gtNnY2aC0ydi02SDV2LTJoNlY1aDJ2Nmg2djJ6IiAvPjwvZz4KPGcgaWQ9ImFkZC1hbGVydCI+PHBhdGggZD0iTTEwLjAxIDIxLjAxYzAgMS4xLjg5IDEuOTkgMS45OSAxLjk5czEuOTktLjg5IDEuOTktMS45OWgtMy45OHptOC44Ny00LjE5VjExYzAtMy4yNS0yLjI1LTUuOTctNS4yOS02LjY5di0uNzJDMTMuNTkgMi43MSAxMi44OCAyIDEyIDJzLTEuNTkuNzEtMS41OSAxLjU5di43MkM3LjM3IDUuMDMgNS4xMiA3Ljc1IDUuMTIgMTF2NS44MkwzIDE4Ljk0VjIwaDE4di0xLjA2bC0yLjEyLTIuMTJ6TTE2IDEzLjAxaC0zdjNoLTJ2LTNIOFYxMWgzVjhoMnYzaDN2Mi4wMXoiIC8+PC9nPgo8ZyBpZD0iYWRkLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0yIDEwaC00djRoLTJ2LTRIN3YtMmg0VjdoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFoLTR2NGgtMnYtNEg3di0yaDRWN2gydjRoNHYyeiIgLz48L2c+CjxnIGlkPSJhZGQtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMyA3aC0ydjRIN3YyaDR2NGgydi00aDR2LTJoLTRWN3ptLTEtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImFkZC1zaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNMTEgOWgyVjZoM1Y0aC0zVjFoLTJ2M0g4djJoM3Yzem0tNCA5Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yem0xMCAwYy0xLjEgMC0xLjk5LjktMS45OSAycy44OSAyIDEuOTkgMiAyLS45IDItMi0uOS0yLTItMnptLTkuODMtMy4yNWwuMDMtLjEyLjktMS42M2g3LjQ1Yy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjg2LTcuMDFMMTkuNDIgNGgtLjAxbC0xLjEgMi0yLjc2IDVIOC41M2wtLjEzLS4yN0w2LjE2IDZsLS45NS0yLS45NC0ySDF2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTMgMC0uMjUtLjExLS4yNS0uMjV6IiAvPjwvZz4KPGcgaWQ9ImFsYXJtIj48cGF0aCBkPSJNMjIgNS43MmwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTcuODggMy4zOUw2LjYgMS44NiAyIDUuNzFsMS4yOSAxLjUzIDQuNTktMy44NXpNMTIuNSA4SDExdjZsNC43NSAyLjg1Ljc1LTEuMjMtNC0yLjM3Vjh6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3eiIgLz48L2c+CjxnIGlkPSJhbGFybS1hZGQiPjxwYXRoIGQ9Ik03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptMS0xMWgtMnYzSDh2MmgzdjNoMnYtM2gzdi0yaC0zVjl6IiAvPjwvZz4KPGcgaWQ9ImFsYXJtLW9mZiI+PHBhdGggZD0iTTEyIDZjMy44NyAwIDcgMy4xMyA3IDcgMCAuODQtLjE2IDEuNjUtLjQzIDIuNGwxLjUyIDEuNTJjLjU4LTEuMTkuOTEtMi41MS45MS0zLjkyIDAtNC45Ny00LjAzLTktOS05LTEuNDEgMC0yLjczLjMzLTMuOTIuOTFMOS42IDYuNDNDMTAuMzUgNi4xNiAxMS4xNiA2IDEyIDZ6bTEwLS4yOGwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTIuOTIgMi4yOUwxLjY1IDMuNTcgMi45OCA0LjlsLTEuMTEuOTMgMS40MiAxLjQyIDEuMTEtLjk0LjguOEMzLjgzIDguNjkgMyAxMC43NSAzIDEzYzAgNC45NyA0LjAyIDkgOSA5IDIuMjUgMCA0LjMxLS44MyA1Ljg5LTIuMmwyLjIgMi4yIDEuMjctMS4yN0wzLjg5IDMuMjdsLS45Ny0uOTh6bTEzLjU1IDE2LjFDMTUuMjYgMTkuMzkgMTMuNyAyMCAxMiAyMGMtMy44NyAwLTctMy4xMy03LTcgMC0xLjcuNjEtMy4yNiAxLjYxLTQuNDdsOS44NiA5Ljg2ek04LjAyIDMuMjhMNi42IDEuODZsLS44Ni43MSAxLjQyIDEuNDIuODYtLjcxeiIgLz48L2c+CjxnIGlkPSJhbGFybS1vbiI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3em0tMS40Ni01LjQ3TDguNDEgMTIuNGwtMS4wNiAxLjA2IDMuMTggMy4xOCA2LTYtMS4wNi0xLjA2LTQuOTMgNC45NXoiIC8+PC9nPgo8ZyBpZD0iYWxsLW91dCI+PHBhdGggZD0iTTE2LjIxIDQuMTZsNCA0di00em00IDEybC00IDRoNHptLTEyIDRsLTQtNHY0em0tNC0xMmw0LTRoLTR6bTEyLjk1LS45NWMtMi43My0yLjczLTcuMTctMi43My05LjkgMHMtMi43MyA3LjE3IDAgOS45IDcuMTcgMi43MyA5LjkgMCAyLjczLTcuMTYgMC05Ljl6bS0xLjEgOC44Yy0yLjEzIDIuMTMtNS41NyAyLjEzLTcuNyAwcy0yLjEzLTUuNTcgMC03LjcgNS41Ny0yLjEzIDcuNyAwIDIuMTMgNS41NyAwIDcuN3oiIC8+PC9nPgo8ZyBpZD0iYW5kcm9pZCI+PHBhdGggZD0iTTYgMThjMCAuNTUuNDUgMSAxIDFoMXYzLjVjMCAuODMuNjcgMS41IDEuNSAxLjVzMS41LS42NyAxLjUtMS41VjE5aDJ2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgxYy41NSAwIDEtLjQ1IDEtMVY4SDZ2MTB6TTMuNSA4QzIuNjcgOCAyIDguNjcgMiA5LjV2N2MwIC44My42NyAxLjUgMS41IDEuNVM1IDE3LjMzIDUgMTYuNXYtN0M1IDguNjcgNC4zMyA4IDMuNSA4em0xNyAwYy0uODMgMC0xLjUuNjctMS41IDEuNXY3YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNXYtN2MwLS44My0uNjctMS41LTEuNS0xLjV6bS00Ljk3LTUuODRsMS4zLTEuM2MuMi0uMi4yLS41MSAwLS43MS0uMi0uMi0uNTEtLjItLjcxIDBsLTEuNDggMS40OEMxMy44NSAxLjIzIDEyLjk1IDEgMTIgMWMtLjk2IDAtMS44Ni4yMy0yLjY2LjYzTDcuODUuMTVjLS4yLS4yLS41MS0uMi0uNzEgMC0uMi4yLS4yLjUxIDAgLjcxbDEuMzEgMS4zMUM2Ljk3IDMuMjYgNiA1LjAxIDYgN2gxMmMwLTEuOTktLjk3LTMuNzUtMi40Ny00Ljg0ek0xMCA1SDlWNGgxdjF6bTUgMGgtMVY0aDF2MXoiIC8+PC9nPgo8ZyBpZD0iYW5ub3VuY2VtZW50Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDloLTJWNWgydjZ6bTAgNGgtMnYtMmgydjJ6IiAvPjwvZz4KPGcgaWQ9ImFwcHMiPjxwYXRoIGQ9Ik00IDhoNFY0SDR2NHptNiAxMmg0di00aC00djR6bS02IDBoNHYtNEg0djR6bTAtNmg0di00SDR2NHptNiAwaDR2LTRoLTR2NHptNi0xMHY0aDRWNGgtNHptLTYgNGg0VjRoLTR2NHptNiA2aDR2LTRoLTR2NHptMCA2aDR2LTRoLTR2NHoiIC8+PC9nPgo8ZyBpZD0iYXJjaGl2ZSI+PHBhdGggZD0iTTIwLjU0IDUuMjNsLTEuMzktMS42OEMxOC44OCAzLjIxIDE4LjQ3IDMgMTggM0g2Yy0uNDcgMC0uODguMjEtMS4xNi41NUwzLjQ2IDUuMjNDMy4xNyA1LjU3IDMgNi4wMiAzIDYuNVYxOWMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjYuNWMwLS40OC0uMTctLjkzLS40Ni0xLjI3ek0xMiAxNy41TDYuNSAxMkgxMHYtMmg0djJoMy41TDEyIDE3LjV6TTUuMTIgNWwuODEtMWgxMmwuOTQgMUg1LjEyeiIgLz48L2c+CjxnIGlkPSJhcnJvdy1iYWNrIj48cGF0aCBkPSJNMjAgMTFINy44M2w1LjU5LTUuNTlMMTIgNGwtOCA4IDggOCAxLjQxLTEuNDFMNy44MyAxM0gyMHYtMnoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctZG93bndhcmQiPjxwYXRoIGQ9Ik0yMCAxMmwtMS40MS0xLjQxTDEzIDE2LjE3VjRoLTJ2MTIuMTdsLTUuNTgtNS41OUw0IDEybDggOCA4LTh6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtZG93biI+PHBhdGggZD0iTTcgMTBsNSA1IDUtNXoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMTJsLTQtNGg4bC00IDR6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtdXAiPjxwYXRoIGQ9Ik03IDE0bDUtNSA1IDV6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWZvcndhcmQiPjxwYXRoIGQ9Ik0xMiA0bC0xLjQxIDEuNDFMMTYuMTcgMTFINHYyaDEyLjE3bC01LjU4IDUuNTlMMTIgMjBsOC04eiIgLz48L2c+CjxnIGlkPSJhcnJvdy11cHdhcmQiPjxwYXRoIGQ9Ik00IDEybDEuNDEgMS40MUwxMSA3LjgzVjIwaDJWNy44M2w1LjU4IDUuNTlMMjAgMTJsLTgtOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImFzcGVjdC1yYXRpbyI+PHBhdGggZD0iTTE5IDEyaC0ydjNoLTN2Mmg1di01ek03IDloM1Y3SDV2NWgyVjl6bTE0LTZIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnoiIC8+PC9nPgo8ZyBpZD0iYXNzZXNzbWVudCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50Ij48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTIgMTRIN3YtMmg3djJ6bTMtNEg3di0yaDEwdjJ6bTAtNEg3VjdoMTB2MnoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1pbmQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMCA0YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xLjRjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xVjE5eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LWxhdGUiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS02IDE1aC0ydi0yaDJ2MnptMC00aC0yVjhoMnY2em0tMS05Yy0uNTUgMC0xLS40NS0xLTFzLjQ1LTEgMS0xIDEgLjQ1IDEgMS0uNDUgMS0xIDF6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTQgMTJoLTR2M2wtNS01IDUtNXYzaDR2NHoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1yZXR1cm5lZCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0wIDE1bC01LTVoM1Y5aDR2NGgzbC01IDV6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtdHVybmVkLWluIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bS0yIDE0bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6IiAvPjwvZz4KPGcgaWQ9ImF0dGFjaG1lbnQiPjxwYXRoIGQ9Ik0yIDEyLjVDMiA5LjQ2IDQuNDYgNyA3LjUgN0gxOGMyLjIxIDAgNCAxLjc5IDQgNHMtMS43OSA0LTQgNEg5LjVDOC4xMiAxNSA3IDEzLjg4IDcgMTIuNVM4LjEyIDEwIDkuNSAxMEgxN3YySDkuNDFjLS41NSAwLS41NSAxIDAgMUgxOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTJINy41QzUuNTcgOSA0IDEwLjU3IDQgMTIuNVM1LjU3IDE2IDcuNSAxNkgxN3YySDcuNUM0LjQ2IDE4IDIgMTUuNTQgMiAxMi41eiIgLz48L2c+CjxnIGlkPSJhdXRvcmVuZXciPjxwYXRoIGQ9Ik0xMiA2djNsNC00LTQtNHYzYy00LjQyIDAtOCAzLjU4LTggOCAwIDEuNTcuNDYgMy4wMyAxLjI0IDQuMjZMNi43IDE0LjhjLS40NS0uODMtLjctMS43OS0uNy0yLjggMC0zLjMxIDIuNjktNiA2LTZ6bTYuNzYgMS43NEwxNy4zIDkuMmMuNDQuODQuNyAxLjc5LjcgMi44IDAgMy4zMS0yLjY5IDYtNiA2di0zbC00IDQgNCA0di0zYzQuNDIgMCA4LTMuNTggOC04IDAtMS41Ny0uNDYtMy4wMy0xLjI0LTQuMjZ6IiAvPjwvZz4KPGcgaWQ9ImJhY2tzcGFjZSI+PHBhdGggZD0iTTIyIDNIN2MtLjY5IDAtMS4yMy4zNS0xLjU5Ljg4TDAgMTJsNS40MSA4LjExYy4zNi41My45Ljg5IDEuNTkuODloMTVjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTMgMTIuNTlMMTcuNTkgMTcgMTQgMTMuNDEgMTAuNDEgMTcgOSAxNS41OSAxMi41OSAxMiA5IDguNDEgMTAuNDEgNyAxNCAxMC41OSAxNy41OSA3IDE5IDguNDEgMTUuNDEgMTIgMTkgMTUuNTl6IiAvPjwvZz4KPGcgaWQ9ImJhY2t1cCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6IiAvPjwvZz4KPGcgaWQ9ImJsb2NrIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNNCAxMmMwLTQuNDIgMy41OC04IDgtOCAxLjg1IDAgMy41NS42MyA0LjkgMS42OUw1LjY5IDE2LjlDNC42MyAxNS41NSA0IDEzLjg1IDQgMTJ6bTggOGMtMS44NSAwLTMuNTUtLjYzLTQuOS0xLjY5TDE4LjMxIDcuMUMxOS4zNyA4LjQ1IDIwIDEwLjE1IDIwIDEyYzAgNC40Mi0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJib29rIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiIgLz48L2c+CjxnIGlkPSJib29rbWFyayI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iYm9va21hcmstYm9yZGVyIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiIgLz48L2c+CjxnIGlkPSJidWctcmVwb3J0Ij48cGF0aCBkPSJNMjAgOGgtMi44MWMtLjQ1LS43OC0xLjA3LTEuNDUtMS44Mi0xLjk2TDE3IDQuNDEgMTUuNTkgM2wtMi4xNyAyLjE3QzEyLjk2IDUuMDYgMTIuNDkgNSAxMiA1Yy0uNDkgMC0uOTYuMDYtMS40MS4xN0w4LjQxIDMgNyA0LjQxbDEuNjIgMS42M0M3Ljg4IDYuNTUgNy4yNiA3LjIyIDYuODEgOEg0djJoMi4wOWMtLjA1LjMzLS4wOS42Ni0uMDkgMXYxSDR2MmgydjFjMCAuMzQuMDQuNjcuMDkgMUg0djJoMi44MWMxLjA0IDEuNzkgMi45NyAzIDUuMTkgM3M0LjE1LTEuMjEgNS4xOS0zSDIwdi0yaC0yLjA5Yy4wNS0uMzMuMDktLjY2LjA5LTF2LTFoMnYtMmgtMnYtMWMwLS4zNC0uMDQtLjY3LS4wOS0xSDIwVjh6bS02IDhoLTR2LTJoNHYyem0wLTRoLTR2LTJoNHYyeiIgLz48L2c+CjxnIGlkPSJidWlsZCI+PHBhdGggZD0iTTIyLjcgMTlsLTkuMS05LjFjLjktMi4zLjQtNS0xLjUtNi45LTItMi01LTIuNC03LjQtMS4zTDkgNiA2IDkgMS42IDQuN0MuNCA3LjEuOSAxMC4xIDIuOSAxMi4xYzEuOSAxLjkgNC42IDIuNCA2LjkgMS41bDkuMSA5LjFjLjQuNCAxIC40IDEuNCAwbDIuMy0yLjNjLjUtLjQuNS0xLjEuMS0xLjR6IiAvPjwvZz4KPGcgaWQ9ImNhY2hlZCI+PHBhdGggZD0iTTE5IDhsLTQgNGgzYzAgMy4zMS0yLjY5IDYtNiA2LTEuMDEgMC0xLjk3LS4yNS0yLjgtLjdsLTEuNDYgMS40NkM4Ljk3IDE5LjU0IDEwLjQzIDIwIDEyIDIwYzQuNDIgMCA4LTMuNTggOC04aDNsLTQtNHpNNiAxMmMwLTMuMzEgMi42OS02IDYtNiAxLjAxIDAgMS45Ny4yNSAyLjguN2wxLjQ2LTEuNDZDMTUuMDMgNC40NiAxMy41NyA0IDEyIDRjLTQuNDIgMC04IDMuNTgtOCA4SDFsNCA0IDQtNEg2eiIgLz48L2c+CjxnIGlkPSJjYW1lcmEtZW5oYW5jZSI+PHBhdGggZD0iTTkgM0w3LjE3IDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yaC0zLjE3TDE1IDNIOXptMyAxNWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6bTAtMWwxLjI1LTIuNzVMMTYgMTNsLTIuNzUtMS4yNUwxMiA5bC0xLjI1IDIuNzVMOCAxM2wyLjc1IDEuMjV6IiAvPjwvZz4KPGcgaWQ9ImNhbmNlbCI+PHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTUgMTMuNTlMMTUuNTkgMTcgMTIgMTMuNDEgOC40MSAxNyA3IDE1LjU5IDEwLjU5IDEyIDcgOC40MSA4LjQxIDcgMTIgMTAuNTkgMTUuNTkgNyAxNyA4LjQxIDEzLjQxIDEyIDE3IDE1LjU5eiIgLz48L2c+CjxnIGlkPSJjYXJkLWdpZnRjYXJkIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6IiAvPjwvZz4KPGcgaWQ9ImNhcmQtbWVtYmVyc2hpcCI+PHBhdGggZD0iTTIwIDJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoNHY1bDQtMiA0IDJ2LTVoNGMxLjExIDAgMi0uODkgMi0yVjRjMC0xLjExLS44OS0yLTItMnptMCAxM0g0di0yaDE2djJ6bTAtNUg0VjRoMTZ2NnoiIC8+PC9nPgo8ZyBpZD0iY2FyZC10cmF2ZWwiPjxwYXRoIGQ9Ik0yMCA2aC0zVjRjMC0xLjExLS44OS0yLTItMkg5Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6TTkgNGg2djJIOVY0em0xMSAxNUg0di0yaDE2djJ6bTAtNUg0VjhoM3YyaDJWOGg2djJoMlY4aDN2NnoiIC8+PC9nPgo8ZyBpZD0iY2hhbmdlLWhpc3RvcnkiPjxwYXRoIGQ9Ik0xMiA3Ljc3TDE4LjM5IDE4SDUuNjFMMTIgNy43N00xMiA0TDIgMjBoMjBMMTIgNHoiIC8+PC9nPgo8ZyBpZD0iY2hlY2siPjxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiIC8+PC9nPgo8ZyBpZD0iY2hlY2stYm94Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjkgMi0yVjVjMC0xLjEtLjg5LTItMi0yem0tOSAxNGwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiIgLz48L2c+CjxnIGlkPSJjaGVjay1ib3gtb3V0bGluZS1ibGFuayI+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0yIDE1bC01LTUgMS40MS0xLjQxTDEwIDE0LjE3bDcuNTktNy41OUwxOSA4bC05IDl6IiAvPjwvZz4KPGcgaWQ9ImNoZXZyb24tbGVmdCI+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNoZXZyb24tcmlnaHQiPjxwYXRoIGQ9Ik0xMCA2TDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiIC8+PC9nPgo8ZyBpZD0iY2hyb21lLXJlYWRlci1tb2RlIj48cGF0aCBkPSJNMTMgMTJoN3YxLjVoLTd6bTAtMi41aDdWMTFoLTd6bTAgNWg3VjE2aC03ek0yMSA0SDNjLTEuMSAwLTIgLjktMiAydjEzYzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNWgtOVY2aDl2MTN6IiAvPjwvZz4KPGcgaWQ9ImNsYXNzIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiIgLz48L2c+CjxnIGlkPSJjbGVhciI+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiIC8+PC9nPgo8ZyBpZD0iY2xvc2UiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem00LjUgMTRIOGMtMS42NiAwLTMtMS4zNC0zLTNzMS4zNC0zIDMtM2wuMTQuMDFDOC41OCA4LjI4IDEwLjEzIDcgMTIgN2MyLjIxIDAgNCAxLjc5IDQgNGguNWMxLjM4IDAgMi41IDEuMTIgMi41IDIuNVMxNy44OCAxNiAxNi41IDE2eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1kb25lIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xMCAxN2wtMy41LTMuNSAxLjQxLTEuNDFMMTAgMTQuMTcgMTUuMTggOWwxLjQxIDEuNDFMMTAgMTd6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLWRvd25sb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNyAxM2wtNSA1LTUtNWgzVjloNHY0aDN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLW9mZiI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0Yy0xLjQ4IDAtMi44NS40My00LjAxIDEuMTdsMS40NiAxLjQ2QzEwLjIxIDYuMjMgMTEuMDggNiAxMiA2YzMuMDQgMCA1LjUgMi40NiA1LjUgNS41di41SDE5YzEuNjYgMCAzIDEuMzQgMyAzIDAgMS4xMy0uNjQgMi4xMS0xLjU2IDIuNjJsMS40NSAxLjQ1QzIzLjE2IDE4LjE2IDI0IDE2LjY4IDI0IDE1YzAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0zIDUuMjdsMi43NSAyLjc0QzIuNTYgOC4xNSAwIDEwLjc3IDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTEuNzNsMiAyTDIxIDIwLjczIDQuMjcgNCAzIDUuMjd6TTcuNzMgMTBsOCA4SDZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTRoMS43M3oiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtcXVldWUiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE5IDE4SDZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTRoLjcxQzcuMzcgNy42OSA5LjQ4IDYgMTIgNmMzLjA0IDAgNS41IDIuNDYgNS41IDUuNXYuNUgxOWMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgM3oiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtdXBsb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNCAxM3Y0aC00di00SDdsNS01IDUgNWgtM3oiIC8+PC9nPgo8ZyBpZD0iY29kZSI+PHBhdGggZD0iTTkuNCAxNi42TDQuOCAxMmw0LjYtNC42TDggNmwtNiA2IDYgNiAxLjQtMS40em01LjIgMGw0LjYtNC42LTQuNi00LjZMMTYgNmw2IDYtNiA2LTEuNC0xLjR6IiAvPjwvZz4KPGcgaWQ9ImNvbXBhcmUtYXJyb3dzIj48cGF0aCBkPSJNOS4wMSAxNEgydjJoNy4wMXYzTDEzIDE1bC0zLjk5LTR2M3ptNS45OC0xdi0zSDIyVjhoLTcuMDFWNUwxMSA5bDMuOTkgNHoiIC8+PC9nPgo8ZyBpZD0iY29udGVudC1jb3B5Ij48cGF0aCBkPSJNMTYgMUg0Yy0xLjEgMC0yIC45LTIgMnYxNGgyVjNoMTJWMXptMyA0SDhjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTFjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptMCAxNkg4VjdoMTF2MTR6IiAvPjwvZz4KPGcgaWQ9ImNvbnRlbnQtY3V0Ij48cGF0aCBkPSJNOS42NCA3LjY0Yy4yMy0uNS4zNi0xLjA1LjM2LTEuNjQgMC0yLjIxLTEuNzktNC00LTRTMiAzLjc5IDIgNnMxLjc5IDQgNCA0Yy41OSAwIDEuMTQtLjEzIDEuNjQtLjM2TDEwIDEybC0yLjM2IDIuMzZDNy4xNCAxNC4xMyA2LjU5IDE0IDYgMTRjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNGMwLS41OS0uMTMtMS4xNC0uMzYtMS42NEwxMiAxNGw3IDdoM3YtMUw5LjY0IDcuNjR6TTYgOGMtMS4xIDAtMi0uODktMi0ycy45LTIgMi0yIDIgLjg5IDIgMi0uOSAyLTIgMnptMCAxMmMtMS4xIDAtMi0uODktMi0ycy45LTIgMi0yIDIgLjg5IDIgMi0uOSAyLTIgMnptNi03LjVjLS4yOCAwLS41LS4yMi0uNS0uNXMuMjItLjUuNS0uNS41LjIyLjUuNS0uMjIuNS0uNS41ek0xOSAzbC02IDYgMiAyIDctN1YzeiIgLz48L2c+CjxnIGlkPSJjb250ZW50LXBhc3RlIj48cGF0aCBkPSJNMTkgMmgtNC4xOEMxNC40Ljg0IDEzLjMgMCAxMiAwYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem03IDE4SDVWNGgydjNoMTBWNGgydjE2eiIgLz48L2c+CjxnIGlkPSJjb3B5cmlnaHQiPjxwYXRoIGQ9Ik0xMC4wOCAxMC44NmMuMDUtLjMzLjE2LS42Mi4zLS44N3MuMzQtLjQ2LjU5LS42MmMuMjQtLjE1LjU0LS4yMi45MS0uMjMuMjMuMDEuNDQuMDUuNjMuMTMuMi4wOS4zOC4yMS41Mi4zNnMuMjUuMzMuMzQuNTMuMTMuNDIuMTQuNjRoMS43OWMtLjAyLS40Ny0uMTEtLjktLjI4LTEuMjlzLS40LS43My0uNy0xLjAxLS42Ni0uNS0xLjA4LS42Ni0uODgtLjIzLTEuMzktLjIzYy0uNjUgMC0xLjIyLjExLTEuNy4zNHMtLjg4LjUzLTEuMi45Mi0uNTYuODQtLjcxIDEuMzZTOCAxMS4yOSA4IDExLjg3di4yN2MwIC41OC4wOCAxLjEyLjIzIDEuNjRzLjM5Ljk3LjcxIDEuMzUuNzIuNjkgMS4yLjkxIDEuMDUuMzQgMS43LjM0Yy40NyAwIC45MS0uMDggMS4zMi0uMjNzLjc3LS4zNiAxLjA4LS42My41Ni0uNTguNzQtLjk0LjI5LS43NC4zLTEuMTVoLTEuNzljLS4wMS4yMS0uMDYuNC0uMTUuNThzLS4yMS4zMy0uMzYuNDYtLjMyLjIzLS41Mi4zYy0uMTkuMDctLjM5LjA5LS42LjEtLjM2LS4wMS0uNjYtLjA4LS44OS0uMjMtLjI1LS4xNi0uNDUtLjM3LS41OS0uNjJzLS4yNS0uNTUtLjMtLjg4LS4wOC0uNjctLjA4LTF2LS4yN2MwLS4zNS4wMy0uNjguMDgtMS4wMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImNyZWF0ZSI+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiIC8+PC9nPgo8ZyBpZD0iY3JlYXRlLW5ldy1mb2xkZXIiPjxwYXRoIGQ9Ik0yMCA2aC04bC0yLTJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tMSA4aC0zdjNoLTJ2LTNoLTN2LTJoM1Y5aDJ2M2gzdjJ6IiAvPjwvZz4KPGcgaWQ9ImNyZWRpdC1jYXJkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiIgLz48L2c+CjxnIGlkPSJkYXNoYm9hcmQiPjxwYXRoIGQ9Ik0zIDEzaDhWM0gzdjEwem0wIDhoOHYtNkgzdjZ6bTEwIDBoOFYxMWgtOHYxMHptMC0xOHY2aDhWM2gtOHoiIC8+PC9nPgo8ZyBpZD0iZGF0ZS1yYW5nZSI+PHBhdGggZD0iTTkgMTFIN3YyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTItN2gtMVYyaC0ydjJIOFYySDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDIwYzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY5aDE0djExeiIgLz48L2c+CjxnIGlkPSJkZWxldGUiPjxwYXRoIGQ9Ik02IDE5YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlY3SDZ2MTJ6TTE5IDRoLTMuNWwtMS0xaC01bC0xIDFINXYyaDE0VjR6IiAvPjwvZz4KPGcgaWQ9ImRlbGV0ZS1mb3JldmVyIj48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz48L2c+CjxnIGlkPSJkZWxldGUtc3dlZXAiPjxwYXRoIGQ9Ik0xNSAxNmg0djJoLTR6bTAtOGg3djJoLTd6bTAgNGg2djJoLTZ6TTMgMThjMCAxLjEuOSAyIDIgMmg2YzEuMSAwIDItLjkgMi0yVjhIM3YxMHpNMTQgNWgtM2wtMS0xSDZMNSA1SDJ2MmgxMnoiIC8+PC9nPgo8ZyBpZD0iZGVzY3JpcHRpb24iPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bTIgMTZIOHYtMmg4djJ6bTAtNEg4di0yaDh2MnptLTMtNVYzLjVMMTguNSA5SDEzeiIgLz48L2c+CjxnIGlkPSJkbnMiPjxwYXRoIGQ9Ik0yMCAxM0g0Yy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxNmMuNTUgMCAxLS40NSAxLTF2LTZjMC0uNTUtLjQ1LTEtMS0xek03IDE5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNMjAgM0g0Yy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxNmMuNTUgMCAxLS40NSAxLTFWNGMwLS41NS0uNDUtMS0xLTF6TTcgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6IiAvPjwvZz4KPGcgaWQ9ImRvbmUiPjxwYXRoIGQ9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6IiAvPjwvZz4KPGcgaWQ9ImRvbmUtYWxsIj48cGF0aCBkPSJNMTggN2wtMS40MS0xLjQxLTYuMzQgNi4zNCAxLjQxIDEuNDFMMTggN3ptNC4yNC0xLjQxTDExLjY2IDE2LjE3IDcuNDggMTJsLTEuNDEgMS40MUwxMS42NiAxOWwxMi0xMi0xLjQyLTEuNDF6TS40MSAxMy40MUw2IDE5bDEuNDEtMS40MUwxLjgzIDEyIC40MSAxMy40MXoiIC8+PC9nPgo8ZyBpZD0iZG9udXQtbGFyZ2UiPjxwYXRoIGQ9Ik0xMSA1LjA4VjJjLTUgLjUtOSA0LjgxLTkgMTBzNCA5LjUgOSAxMHYtMy4wOGMtMy0uNDgtNi0zLjQtNi02LjkyczMtNi40NCA2LTYuOTJ6TTE4Ljk3IDExSDIyYy0uNDctNS00LTguNTMtOS05djMuMDhDMTYgNS41MSAxOC41NCA4IDE4Ljk3IDExek0xMyAxOC45MlYyMmM1LS40NyA4LjUzLTQgOS05aC0zLjAzYy0uNDMgMy0yLjk3IDUuNDktNS45NyA1LjkyeiIgLz48L2c+CjxnIGlkPSJkb251dC1zbWFsbCI+PHBhdGggZD0iTTExIDkuMTZWMmMtNSAuNS05IDQuNzktOSAxMHM0IDkuNSA5IDEwdi03LjE2Yy0xLS40MS0yLTEuNTItMi0yLjg0czEtMi40MyAyLTIuODR6TTE0Ljg2IDExSDIyYy0uNDgtNC43NS00LTguNTMtOS05djcuMTZjMSAuMyAxLjUyLjk4IDEuODYgMS44NHpNMTMgMTQuODRWMjJjNS0uNDcgOC41Mi00LjI1IDktOWgtNy4xNGMtLjM0Ljg2LS44NiAxLjU0LTEuODYgMS44NHoiIC8+PC9nPgo8ZyBpZD0iZHJhZnRzIj48cGF0aCBkPSJNMjEuOTkgOGMwLS43Mi0uMzctMS4zNS0uOTQtMS43TDEyIDEgMi45NSA2LjNDMi4zOCA2LjY1IDIgNy4yOCAyIDh2MTBjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMmwtLjAxLTEwek0xMiAxM0wzLjc0IDcuODQgMTIgM2w4LjI2IDQuODRMMTIgMTN6IiAvPjwvZz4KPGcgaWQ9ImVqZWN0Ij48cGF0aCBkPSJNNSAxN2gxNHYySDV6bTctMTJMNS4zMyAxNWgxMy4zNHoiIC8+PC9nPgo8ZyBpZD0iZXJyb3IiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJlcnJvci1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTVoMnYyaC0yem0wLThoMnY2aC0yem0uOTktNUM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJldXJvLXN5bWJvbCI+PHBhdGggZD0iTTE1IDE4LjVjLTIuNTEgMC00LjY4LTEuNDItNS43Ni0zLjVIMTV2LTJIOC41OGMtLjA1LS4zMy0uMDgtLjY2LS4wOC0xcy4wMy0uNjcuMDgtMUgxNVY5SDkuMjRDMTAuMzIgNi45MiAxMi41IDUuNSAxNSA1LjVjMS42MSAwIDMuMDkuNTkgNC4yMyAxLjU3TDIxIDUuM0MxOS40MSAzLjg3IDE3LjMgMyAxNSAzYy0zLjkyIDAtNy4yNCAyLjUxLTguNDggNkgzdjJoMy4wNmMtLjA0LjMzLS4wNi42Ni0uMDYgMSAwIC4zNC4wMi42Ny4wNiAxSDN2MmgzLjUyYzEuMjQgMy40OSA0LjU2IDYgOC40OCA2IDIuMzEgMCA0LjQxLS44NyA2LTIuM2wtMS43OC0xLjc3Yy0xLjEzLjk4LTIuNiAxLjU3LTQuMjIgMS41N3oiIC8+PC9nPgo8ZyBpZD0iZXZlbnQiPjxwYXRoIGQ9Ik0xNyAxMmgtNXY1aDV2LTV6TTE2IDF2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMmgtMVYxaC0yem0zIDE4SDVWOGgxNHYxMXoiIC8+PC9nPgo8ZyBpZD0iZXZlbnQtc2VhdCI+PHBhdGggZD0iTTQgMTh2M2gzdi0zaDEwdjNoM3YtNkg0em0xNS04aDN2M2gtM3pNMiAxMGgzdjNIMnptMTUgM0g3VjVjMC0xLjEuOS0yIDItMmg2YzEuMSAwIDIgLjkgMiAydjh6IiAvPjwvZz4KPGcgaWQ9ImV4aXQtdG8tYXBwIj48cGF0aCBkPSJNMTAuMDkgMTUuNTlMMTEuNSAxN2w1LTUtNS01LTEuNDEgMS40MUwxMi42NyAxMUgzdjJoOS42N2wtMi41OCAyLjU5ek0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnY0aDJWNWgxNHYxNEg1di00SDN2NGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJleHBhbmQtbGVzcyI+PHBhdGggZD0iTTEyIDhsLTYgNiAxLjQxIDEuNDFMMTIgMTAuODNsNC41OSA0LjU4TDE4IDE0eiIgLz48L2c+CjxnIGlkPSJleHBhbmQtbW9yZSI+PHBhdGggZD0iTTE2LjU5IDguNTlMMTIgMTMuMTcgNy40MSA4LjU5IDYgMTBsNiA2IDYtNnoiIC8+PC9nPgo8ZyBpZD0iZXhwbG9yZSI+PHBhdGggZD0iTTEyIDEwLjljLS42MSAwLTEuMS40OS0xLjEgMS4xcy40OSAxLjEgMS4xIDEuMWMuNjEgMCAxLjEtLjQ5IDEuMS0xLjFzLS40OS0xLjEtMS4xLTEuMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMi4xOSAxMi4xOUw2IDE4bDMuODEtOC4xOUwxOCA2bC0zLjgxIDguMTl6IiAvPjwvZz4KPGcgaWQ9ImV4dGVuc2lvbiI+PHBhdGggZD0iTTIwLjUgMTFIMTlWN2MwLTEuMS0uOS0yLTItMmgtNFYzLjVDMTMgMi4xMiAxMS44OCAxIDEwLjUgMVM4IDIuMTIgOCAzLjVWNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAydjMuOEgzLjVjMS40OSAwIDIuNyAxLjIxIDIuNyAyLjdzLTEuMjEgMi43LTIuNyAyLjdIMlYyMGMwIDEuMS45IDIgMiAyaDMuOHYtMS41YzAtMS40OSAxLjIxLTIuNyAyLjctMi43IDEuNDkgMCAyLjcgMS4yMSAyLjcgMi43VjIySDE3YzEuMSAwIDItLjkgMi0ydi00aDEuNWMxLjM4IDAgMi41LTEuMTIgMi41LTIuNVMyMS44OCAxMSAyMC41IDExeiIgLz48L2c+CjxnIGlkPSJmYWNlIj48cGF0aCBkPSJNOSAxMS43NWMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6bTYgMGMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04IDAtLjI5LjAyLS41OC4wNS0uODYgMi4zNi0xLjA1IDQuMjMtMi45OCA1LjIxLTUuMzdDMTEuMDcgOC4zMyAxNC4wNSAxMCAxNy40MiAxMGMuNzggMCAxLjUzLS4wOSAyLjI1LS4yNi4yMS43MS4zMyAxLjQ3LjMzIDIuMjYgMCA0LjQxLTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImZhdm9yaXRlIj48cGF0aCBkPSJNMTIgMjEuMzVsLTEuNDUtMS4zMkM1LjQgMTUuMzYgMiAxMi4yOCAyIDguNSAyIDUuNDIgNC40MiAzIDcuNSAzYzEuNzQgMCAzLjQxLjgxIDQuNSAyLjA5QzEzLjA5IDMuODEgMTQuNzYgMyAxNi41IDMgMTkuNTggMyAyMiA1LjQyIDIyIDguNWMwIDMuNzgtMy40IDYuODYtOC41NSAxMS41NEwxMiAyMS4zNXoiIC8+PC9nPgo8ZyBpZD0iZmF2b3JpdGUtYm9yZGVyIj48cGF0aCBkPSJNMTYuNSAzYy0xLjc0IDAtMy40MS44MS00LjUgMi4wOUMxMC45MSAzLjgxIDkuMjQgMyA3LjUgMyA0LjQyIDMgMiA1LjQyIDIgOC41YzAgMy43OCAzLjQgNi44NiA4LjU1IDExLjU0TDEyIDIxLjM1bDEuNDUtMS4zMkMxOC42IDE1LjM2IDIyIDEyLjI4IDIyIDguNSAyMiA1LjQyIDE5LjU4IDMgMTYuNSAzem0tNC40IDE1LjU1bC0uMS4xLS4xLS4xQzcuMTQgMTQuMjQgNCAxMS4zOSA0IDguNSA0IDYuNSA1LjUgNSA3LjUgNWMxLjU0IDAgMy4wNC45OSAzLjU3IDIuMzZoMS44N0MxMy40NiA1Ljk5IDE0Ljk2IDUgMTYuNSA1YzIgMCAzLjUgMS41IDMuNSAzLjUgMCAyLjg5LTMuMTQgNS43NC03LjkgMTAuMDV6IiAvPjwvZz4KPGcgaWQ9ImZlZWRiYWNrIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDEyaC0ydi0yaDJ2MnptMC00aC0yVjZoMnY0eiIgLz48L2c+CjxnIGlkPSJmaWxlLWRvd25sb2FkIj48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJmaWxlLXVwbG9hZCI+PHBhdGggZD0iTTkgMTZoNnYtNmg0bC03LTctNyA3aDR6bS00IDJoMTR2Mkg1eiIgLz48L2c+CjxnIGlkPSJmaWx0ZXItbGlzdCI+PHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiIgLz48L2c+CjxnIGlkPSJmaW5kLWluLXBhZ2UiPjxwYXRoIGQ9Ik0yMCAxOS41OVY4bC02LTZINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4Yy40NSAwIC44NS0uMTUgMS4xOS0uNGwtNC40My00LjQzYy0uOC41Mi0xLjc0LjgzLTIuNzYuODMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1YzAgMS4wMi0uMzEgMS45Ni0uODMgMi43NUwyMCAxOS41OXpNOSAxM2MwIDEuNjYgMS4zNCAzIDMgM3MzLTEuMzQgMy0zLTEuMzQtMy0zLTMtMyAxLjM0LTMgM3oiIC8+PC9nPgo8ZyBpZD0iZmluZC1yZXBsYWNlIj48cGF0aCBkPSJNMTEgNmMxLjM4IDAgMi42My41NiAzLjU0IDEuNDZMMTIgMTBoNlY0bC0yLjA1IDIuMDVDMTQuNjggNC43OCAxMi45MyA0IDExIDRjLTMuNTMgMC02LjQzIDIuNjEtNi45MiA2SDYuMWMuNDYtMi4yOCAyLjQ4LTQgNC45LTR6bTUuNjQgOS4xNGMuNjYtLjkgMS4xMi0xLjk3IDEuMjgtMy4xNEgxNS45Yy0uNDYgMi4yOC0yLjQ4IDQtNC45IDQtMS4zOCAwLTIuNjMtLjU2LTMuNTQtMS40NkwxMCAxMkg0djZsMi4wNS0yLjA1QzcuMzIgMTcuMjIgOS4wNyAxOCAxMSAxOGMxLjU1IDAgMi45OC0uNTEgNC4xNC0xLjM2TDIwIDIxLjQ5IDIxLjQ5IDIwbC00Ljg1LTQuODZ6IiAvPjwvZz4KPGcgaWQ9ImZpbmdlcnByaW50Ij48cGF0aCBkPSJNMTcuODEgNC40N2MtLjA4IDAtLjE2LS4wMi0uMjMtLjA2QzE1LjY2IDMuNDIgMTQgMyAxMi4wMSAzYy0xLjk4IDAtMy44Ni40Ny01LjU3IDEuNDEtLjI0LjEzLS41NC4wNC0uNjgtLjItLjEzLS4yNC0uMDQtLjU1LjItLjY4QzcuODIgMi41MiA5Ljg2IDIgMTIuMDEgMmMyLjEzIDAgMy45OS40NyA2LjAzIDEuNTIuMjUuMTMuMzQuNDMuMjEuNjctLjA5LjE4LS4yNi4yOC0uNDQuMjh6TTMuNSA5LjcyYy0uMSAwLS4yLS4wMy0uMjktLjA5LS4yMy0uMTYtLjI4LS40Ny0uMTItLjcuOTktMS40IDIuMjUtMi41IDMuNzUtMy4yN0M5Ljk4IDQuMDQgMTQgNC4wMyAxNy4xNSA1LjY1YzEuNS43NyAyLjc2IDEuODYgMy43NSAzLjI1LjE2LjIyLjExLjU0LS4xMi43LS4yMy4xNi0uNTQuMTEtLjctLjEyLS45LTEuMjYtMi4wNC0yLjI1LTMuMzktMi45NC0yLjg3LTEuNDctNi41NC0xLjQ3LTkuNC4wMS0xLjM2LjctMi41IDEuNy0zLjQgMi45Ni0uMDguMTQtLjIzLjIxLS4zOS4yMXptNi4yNSAxMi4wN2MtLjEzIDAtLjI2LS4wNS0uMzUtLjE1LS44Ny0uODctMS4zNC0xLjQzLTIuMDEtMi42NC0uNjktMS4yMy0xLjA1LTIuNzMtMS4wNS00LjM0IDAtMi45NyAyLjU0LTUuMzkgNS42Ni01LjM5czUuNjYgMi40MiA1LjY2IDUuMzljMCAuMjgtLjIyLjUtLjUuNXMtLjUtLjIyLS41LS41YzAtMi40Mi0yLjA5LTQuMzktNC42Ni00LjM5LTIuNTcgMC00LjY2IDEuOTctNC42NiA0LjM5IDAgMS40NC4zMiAyLjc3LjkzIDMuODUuNjQgMS4xNSAxLjA4IDEuNjQgMS44NSAyLjQyLjE5LjIuMTkuNTEgMCAuNzEtLjExLjEtLjI0LjE1LS4zNy4xNXptNy4xNy0xLjg1Yy0xLjE5IDAtMi4yNC0uMy0zLjEtLjg5LTEuNDktMS4wMS0yLjM4LTIuNjUtMi4zOC00LjM5IDAtLjI4LjIyLS41LjUtLjVzLjUuMjIuNS41YzAgMS40MS43MiAyLjc0IDEuOTQgMy41Ni43MS40OCAxLjU0LjcxIDIuNTQuNzEuMjQgMCAuNjQtLjAzIDEuMDQtLjEuMjctLjA1LjUzLjEzLjU4LjQxLjA1LjI3LS4xMy41My0uNDEuNTgtLjU3LjExLTEuMDcuMTItMS4yMS4xMnpNMTQuOTEgMjJjLS4wNCAwLS4wOS0uMDEtLjEzLS4wMi0xLjU5LS40NC0yLjYzLTEuMDMtMy43Mi0yLjEtMS40LTEuMzktMi4xNy0zLjI0LTIuMTctNS4yMiAwLTEuNjIgMS4zOC0yLjk0IDMuMDgtMi45NCAxLjcgMCAzLjA4IDEuMzIgMy4wOCAyLjk0IDAgMS4wNy45MyAxLjk0IDIuMDggMS45NHMyLjA4LS44NyAyLjA4LTEuOTRjMC0zLjc3LTMuMjUtNi44My03LjI1LTYuODMtMi44NCAwLTUuNDQgMS41OC02LjYxIDQuMDMtLjM5LjgxLS41OSAxLjc2LS41OSAyLjggMCAuNzguMDcgMi4wMS42NyAzLjYxLjEuMjYtLjAzLjU1LS4yOS42NC0uMjYuMS0uNTUtLjA0LS42NC0uMjktLjQ5LTEuMzEtLjczLTIuNjEtLjczLTMuOTYgMC0xLjIuMjMtMi4yOS42OC0zLjI0IDEuMzMtMi43OSA0LjI4LTQuNiA3LjUxLTQuNiA0LjU1IDAgOC4yNSAzLjUxIDguMjUgNy44MyAwIDEuNjItMS4zOCAyLjk0LTMuMDggMi45NHMtMy4wOC0xLjMyLTMuMDgtMi45NGMwLTEuMDctLjkzLTEuOTQtMi4wOC0xLjk0cy0yLjA4Ljg3LTIuMDggMS45NGMwIDEuNzEuNjYgMy4zMSAxLjg3IDQuNTEuOTUuOTQgMS44NiAxLjQ2IDMuMjcgMS44NS4yNy4wNy40Mi4zNS4zNS42MS0uMDUuMjMtLjI2LjM4LS40Ny4zOHoiIC8+PC9nPgo8ZyBpZD0iZmlyc3QtcGFnZSI+PHBhdGggZD0iTTE4LjQxIDE2LjU5TDEzLjgyIDEybDQuNTktNC41OUwxNyA2bC02IDYgNiA2ek02IDZoMnYxMkg2eiIgLz48L2c+CjxnIGlkPSJmbGFnIj48cGF0aCBkPSJNMTQuNCA2TDE0IDRINXYxN2gydi03aDUuNmwuNCAyaDdWNnoiIC8+PC9nPgo8ZyBpZD0iZmxpZ2h0LWxhbmQiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTcuMTgtNS43M2w0LjM1IDEuMTYgNS4zMSAxLjQyYy44LjIxIDEuNjItLjI2IDEuODQtMS4wNi4yMS0uOC0uMjYtMS42Mi0xLjA2LTEuODRsLTUuMzEtMS40Mi0yLjc2LTkuMDJMMTAuMTIgMnY4LjI4TDUuMTUgOC45NWwtLjkzLTIuMzItMS40NS0uMzl2NS4xN2wxLjYuNDMgNS4zMSAxLjQzeiIgLz48L2c+CjxnIGlkPSJmbGlnaHQtdGFrZW9mZiI+PHBhdGggZD0iTTIuNSAxOWgxOXYyaC0xOXptMTkuNTctOS4zNmMtLjIxLS44LTEuMDQtMS4yOC0xLjg0LTEuMDZMMTQuOTIgMTBsLTYuOS02LjQzLTEuOTMuNTEgNC4xNCA3LjE3LTQuOTcgMS4zMy0xLjk3LTEuNTQtMS40NS4zOSAxLjgyIDMuMTYuNzcgMS4zMyAxLjYtLjQzIDUuMzEtMS40MiA0LjM1LTEuMTZMMjEgMTEuNDljLjgxLS4yMyAxLjI4LTEuMDUgMS4wNy0xLjg1eiIgLz48L2c+CjxnIGlkPSJmbGlwLXRvLWJhY2siPjxwYXRoIGQ9Ik05IDdIN3YyaDJWN3ptMCA0SDd2Mmgydi0yem0wLThjLTEuMTEgMC0yIC45LTIgMmgyVjN6bTQgMTJoLTJ2Mmgydi0yem02LTEydjJoMmMwLTEuMS0uOS0yLTItMnptLTYgMGgtMnYyaDJWM3pNOSAxN3YtMkg3YzAgMS4xLjg5IDIgMiAyem0xMC00aDJ2LTJoLTJ2MnptMC00aDJWN2gtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnpNNSA3SDN2MTJjMCAxLjEuODkgMiAyIDJoMTJ2LTJINVY3em0xMC0yaDJWM2gtMnYyem0wIDEyaDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iZmxpcC10by1mcm9udCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMiA0di0ySDNjMCAxLjEuODkgMiAyIDJ6TTMgOWgyVjdIM3Yyem0xMiAxMmgydi0yaC0ydjJ6bTQtMThIOWMtMS4xMSAwLTIgLjktMiAydjEwYzAgMS4xLjg5IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJIOVY1aDEwdjEwem0tOCA2aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnoiIC8+PC9nPgo8ZyBpZD0iZm9sZGVyIj48cGF0aCBkPSJNMTAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yaC04bC0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImZvbGRlci1vcGVuIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bTAgMTJINFY4aDE2djEweiIgLz48L2c+CjxnIGlkPSJmb2xkZXItc2hhcmVkIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS01IDNjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem00IDhoLTh2LTFjMC0xLjMzIDIuNjctMiA0LTJzNCAuNjcgNCAydjF6IiAvPjwvZz4KPGcgaWQ9ImZvbnQtZG93bmxvYWQiPjxwYXRoIGQ9Ik05LjkzIDEzLjVoNC4xNEwxMiA3Ljk4ek0yMCAySDRjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTQuMDUgMTYuNWwtMS4xNC0zSDkuMTdsLTEuMTIgM0g1Ljk2bDUuMTEtMTNoMS44Nmw1LjExIDEzaC0yLjA5eiIgLz48L2c+CjxnIGlkPSJmb3J3YXJkIj48cGF0aCBkPSJNMTIgOFY0bDggOC04IDh2LTRINFY4eiIgLz48L2c+CjxnIGlkPSJmdWxsc2NyZWVuIj48cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiIC8+PC9nPgo8ZyBpZD0iZnVsbHNjcmVlbi1leGl0Ij48cGF0aCBkPSJNNSAxNmgzdjNoMnYtNUg1djJ6bTMtOEg1djJoNVY1SDh2M3ptNiAxMWgydi0zaDN2LTJoLTV2NXptMi0xMVY1aC0ydjVoNVY4aC0zeiIgLz48L2c+CjxnIGlkPSJnLXRyYW5zbGF0ZSI+PHBhdGggZD0iTTIwIDVoLTkuMTJMMTAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDdsMSAzaDhjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnpNNy4xNyAxNC41OWMtMi4yNSAwLTQuMDktMS44My00LjA5LTQuMDlzMS44My00LjA5IDQuMDktNC4wOWMxLjA0IDAgMS45OS4zNyAyLjc0IDEuMDdsLjA3LjA2LTEuMjMgMS4xOC0uMDYtLjA1Yy0uMjktLjI3LS43OC0uNTktMS41Mi0uNTktMS4zMSAwLTIuMzggMS4wOS0yLjM4IDIuNDJzMS4wNyAyLjQyIDIuMzggMi40MmMxLjM3IDAgMS45Ni0uODcgMi4xMi0xLjQ2SDcuMDhWOS45MWgzLjk1bC4wMS4wN2MuMDQuMjEuMDUuNC4wNS42MSAwIDIuMzUtMS42MSA0LTMuOTIgNHptNi4wMy0xLjcxYy4zMy42Ljc0IDEuMTggMS4xOSAxLjdsLS41NC41My0uNjUtMi4yM3ptLjc3LS43NmgtLjk5bC0uMzEtMS4wNGgzLjk5cy0uMzQgMS4zMS0xLjU2IDIuNzRjLS41Mi0uNjItLjg5LTEuMjMtMS4xMy0xLjd6TTIxIDIwYzAgLjU1LS40NSAxLTEgMWgtN2wyLTItLjgxLTIuNzcuOTItLjkyTDE3Ljc5IDE4bC43My0uNzMtMi43MS0yLjY4Yy45LTEuMDMgMS42LTIuMjUgMS45Mi0zLjUxSDE5di0xLjA0aC0zLjY0VjloLTEuMDR2MS4wNGgtMS45NkwxMS4xOCA2SDIwYy41NSAwIDEgLjQ1IDEgMXYxM3oiIC8+PC9nPgo8ZyBpZD0iZ2F2ZWwiPjxwYXRoIGQ9Ik0xIDIxaDEydjJIMXpNNS4yNDUgOC4wN2wyLjgzLTIuODI3IDE0LjE0IDE0LjE0Mi0yLjgyOCAyLjgyOHpNMTIuMzE3IDFsNS42NTcgNS42NTYtMi44MyAyLjgzLTUuNjU0LTUuNjZ6TTMuODI1IDkuNDg1bDUuNjU3IDUuNjU3LTIuODI4IDIuODI4LTUuNjU3LTUuNjU3eiIgLz48L2c+CjxnIGlkPSJnZXN0dXJlIj48cGF0aCBkPSJNNC41OSA2Ljg5Yy43LS43MSAxLjQtMS4zNSAxLjcxLTEuMjIuNS4yIDAgMS4wMy0uMyAxLjUyLS4yNS40Mi0yLjg2IDMuODktMi44NiA2LjMxIDAgMS4yOC40OCAyLjM0IDEuMzQgMi45OC43NS41NiAxLjc0LjczIDIuNjQuNDYgMS4wNy0uMzEgMS45NS0xLjQgMy4wNi0yLjc3IDEuMjEtMS40OSAyLjgzLTMuNDQgNC4wOC0zLjQ0IDEuNjMgMCAxLjY1IDEuMDEgMS43NiAxLjc5LTMuNzguNjQtNS4zOCAzLjY3LTUuMzggNS4zNyAwIDEuNyAxLjQ0IDMuMDkgMy4yMSAzLjA5IDEuNjMgMCA0LjI5LTEuMzMgNC42OS02LjFIMjF2LTIuNWgtMi40N2MtLjE1LTEuNjUtMS4wOS00LjItNC4wMy00LjItMi4yNSAwLTQuMTggMS45MS00Ljk0IDIuODQtLjU4LjczLTIuMDYgMi40OC0yLjI5IDIuNzItLjI1LjMtLjY4Ljg0LTEuMTEuODQtLjQ1IDAtLjcyLS44My0uMzYtMS45Mi4zNS0xLjA5IDEuNC0yLjg2IDEuODUtMy41Mi43OC0xLjE0IDEuMy0xLjkyIDEuMy0zLjI4QzguOTUgMy42OSA3LjMxIDMgNi40NCAzIDUuMTIgMyAzLjk3IDQgMy43MiA0LjI1Yy0uMzYuMzYtLjY2LjY2LS44OC45M2wxLjc1IDEuNzF6bTkuMjkgMTEuNjZjLS4zMSAwLS43NC0uMjYtLjc0LS43MiAwLS42LjczLTIuMiAyLjg3LTIuNzYtLjMgMi42OS0xLjQzIDMuNDgtMi4xMyAzLjQ4eiIgLz48L2c+CjxnIGlkPSJnZXQtYXBwIj48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJnaWYiPjxwYXRoIGQ9Ik0xMS41IDlIMTN2NmgtMS41ek05IDlINmMtLjYgMC0xIC41LTEgMXY0YzAgLjUuNCAxIDEgMWgzYy42IDAgMS0uNSAxLTF2LTJIOC41djEuNWgtMnYtM0gxMFYxMGMwLS41LS40LTEtMS0xem0xMCAxLjVWOWgtNC41djZIMTZ2LTJoMnYtMS41aC0ydi0xeiIgLz48L2c+CjxnIGlkPSJncmFkZSI+PHBhdGggZD0iTTEyIDE3LjI3TDE4LjE4IDIxbC0xLjY0LTcuMDNMMjIgOS4yNGwtNy4xOS0uNjFMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxeiIgLz48L2c+CjxnIGlkPSJncm91cC13b3JrIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNOCAxNy41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXpNOS41IDhjMC0xLjM4IDEuMTItMi41IDIuNS0yLjVzMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41UzkuNSA5LjM4IDkuNSA4em02LjUgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiIC8+PC9nPgo8ZyBpZD0iaGVscCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTEgMTdoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45LjkyQzEzLjQ1IDEyLjkgMTMgMTMuNSAxMyAxNWgtMnYtLjVjMC0xLjEuNDUtMi4xIDEuMTctMi44M2wxLjI0LTEuMjZjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEgMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz48L2c+CjxnIGlkPSJoZWxwLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxOGgydi0yaC0ydjJ6bTEtMTZDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0wLTE0Yy0yLjIxIDAtNCAxLjc5LTQgNGgyYzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAyLTMgMS43NS0zIDVoMmMwLTIuMjUgMy0yLjUgMy01IDAtMi4yMS0xLjc5LTQtNC00eiIgLz48L2c+CjxnIGlkPSJoaWdobGlnaHQtb2ZmIj48cGF0aCBkPSJNMTQuNTkgOEwxMiAxMC41OSA5LjQxIDggOCA5LjQxIDEwLjU5IDEyIDggMTQuNTkgOS40MSAxNiAxMiAxMy40MSAxNC41OSAxNiAxNiAxNC41OSAxMy40MSAxMiAxNiA5LjQxIDE0LjU5IDh6TTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJoaXN0b3J5Ij48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiIgLz48L2c+CjxnIGlkPSJob21lIj48cGF0aCBkPSJNMTAgMjB2LTZoNHY2aDV2LThoM0wxMiAzIDIgMTJoM3Y4eiIgLz48L2c+CjxnIGlkPSJob3VyZ2xhc3MtZW1wdHkiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnptMTAgMTQuNVYyMEg4di0zLjVsNC00IDQgNHptLTQtNWwtNC00VjRoOHYzLjVsLTQgNHoiIC8+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWZ1bGwiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnoiIC8+PC9nPgo8ZyBpZD0iaHR0cCI+PHBhdGggZD0iTTQuNSAxMWgtMlY5SDF2NmgxLjV2LTIuNWgyVjE1SDZWOUg0LjV2MnptMi41LS41aDEuNVYxNUgxMHYtNC41aDEuNVY5SDd2MS41em01LjUgMEgxNFYxNWgxLjV2LTQuNUgxN1Y5aC00LjV2MS41em05LTEuNUgxOHY2aDEuNXYtMmgyYy44IDAgMS41LS43IDEuNS0xLjV2LTFjMC0uOC0uNy0xLjUtMS41LTEuNXptMCAyLjVoLTJ2LTFoMnYxeiIgLz48L2c+CjxnIGlkPSJodHRwcyI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6IiAvPjwvZz4KPGcgaWQ9ImltcG9ydGFudC1kZXZpY2VzIj48cGF0aCBkPSJNMjMgMTEuMDFMMTggMTFjLS41NSAwLTEgLjQ1LTEgMXY5YzAgLjU1LjQ1IDEgMSAxaDVjLjU1IDAgMS0uNDUgMS0xdi05YzAtLjU1LS40NS0uOTktMS0uOTl6TTIzIDIwaC01di03aDV2N3pNMjAgMkgyQy44OSAyIDAgMi44OSAwIDR2MTJjMCAxLjEuODkgMiAyIDJoN3YySDd2Mmg4di0yaC0ydi0yaDJ2LTJIMlY0aDE4djVoMlY0YzAtMS4xMS0uOS0yLTItMnptLTguMDMgN0wxMSA2bC0uOTcgM0g3bDIuNDcgMS43Ni0uOTQgMi45MSAyLjQ3LTEuOCAyLjQ3IDEuOC0uOTQtMi45MUwxNSA5aC0zLjAzeiIgLz48L2c+CjxnIGlkPSJpbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguODktMS45OCAyTDMgMTljMCAxLjEuODggMiAxLjk5IDJIMTljMS4xIDAgMi0uOSAyLTJWNWMwLTEuMTEtLjktMi0yLTJ6bTAgMTJoLTRjMCAxLjY2LTEuMzUgMy0zIDNzLTMtMS4zNC0zLTNINC45OVY1SDE5djEweiIgLz48L2c+CjxnIGlkPSJpbmRldGVybWluYXRlLWNoZWNrLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMEg3di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImluZm8iPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi02aDJ2NnptMC04aC0yVjdoMnYyeiIgLz48L2c+CjxnIGlkPSJpbmZvLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxN2gydi02aC0ydjZ6bTEtMTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4ek0xMSA5aDJWN2gtMnYyeiIgLz48L2c+CjxnIGlkPSJpbnB1dCI+PHBhdGggZD0iTTIxIDMuMDFIM2MtMS4xIDAtMiAuOS0yIDJWOWgyVjQuOTloMTh2MTQuMDNIM1YxNUgxdjQuMDFjMCAxLjEuOSAxLjk4IDIgMS45OGgxOGMxLjEgMCAyLS44OCAyLTEuOTh2LTE0YzAtMS4xMS0uOS0yLTItMnpNMTEgMTZsNC00LTQtNHYzSDF2MmgxMHYzeiIgLz48L2c+CjxnIGlkPSJpbnZlcnQtY29sb3JzIj48cGF0aCBkPSJNMTcuNjYgNy45M0wxMiAyLjI3IDYuMzQgNy45M2MtMy4xMiAzLjEyLTMuMTIgOC4xOSAwIDExLjMxQzcuOSAyMC44IDkuOTUgMjEuNTggMTIgMjEuNThjMi4wNSAwIDQuMS0uNzggNS42Ni0yLjM0IDMuMTItMy4xMiAzLjEyLTguMTkgMC0xMS4zMXpNMTIgMTkuNTljLTEuNiAwLTMuMTEtLjYyLTQuMjQtMS43NkM2LjYyIDE2LjY5IDYgMTUuMTkgNiAxMy41OXMuNjItMy4xMSAxLjc2LTQuMjRMMTIgNS4xdjE0LjQ5eiIgLz48L2c+CjxnIGlkPSJsYWJlbCI+PHBhdGggZD0iTTE3LjYzIDUuODRDMTcuMjcgNS4zMyAxNi42NyA1IDE2IDVMNSA1LjAxQzMuOSA1LjAxIDMgNS45IDMgN3YxMGMwIDEuMS45IDEuOTkgMiAxLjk5TDE2IDE5Yy42NyAwIDEuMjctLjMzIDEuNjMtLjg0TDIyIDEybC00LjM3LTYuMTZ6IiAvPjwvZz4KPGcgaWQ9ImxhYmVsLW91dGxpbmUiPjxwYXRoIGQ9Ik0xNy42MyA1Ljg0QzE3LjI3IDUuMzMgMTYuNjcgNSAxNiA1TDUgNS4wMUMzLjkgNS4wMSAzIDUuOSAzIDd2MTBjMCAxLjEuOSAxLjk5IDIgMS45OUwxNiAxOWMuNjcgMCAxLjI3LS4zMyAxLjYzLS44NEwyMiAxMmwtNC4zNy02LjE2ek0xNiAxN0g1VjdoMTFsMy41NSA1TDE2IDE3eiIgLz48L2c+CjxnIGlkPSJsYW5ndWFnZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6bTYuOTMgNmgtMi45NWMtLjMyLTEuMjUtLjc4LTIuNDUtMS4zOC0zLjU2IDEuODQuNjMgMy4zNyAxLjkxIDQuMzMgMy41NnpNMTIgNC4wNGMuODMgMS4yIDEuNDggMi41MyAxLjkxIDMuOTZoLTMuODJjLjQzLTEuNDMgMS4wOC0yLjc2IDEuOTEtMy45NnpNNC4yNiAxNEM0LjEgMTMuMzYgNCAxMi42OSA0IDEycy4xLTEuMzYuMjYtMmgzLjM4Yy0uMDguNjYtLjE0IDEuMzItLjE0IDIgMCAuNjguMDYgMS4zNC4xNCAySDQuMjZ6bS44MiAyaDIuOTVjLjMyIDEuMjUuNzggMi40NSAxLjM4IDMuNTYtMS44NC0uNjMtMy4zNy0xLjktNC4zMy0zLjU2em0yLjk1LThINS4wOGMuOTYtMS42NiAyLjQ5LTIuOTMgNC4zMy0zLjU2QzguODEgNS41NSA4LjM1IDYuNzUgOC4wMyA4ek0xMiAxOS45NmMtLjgzLTEuMi0xLjQ4LTIuNTMtMS45MS0zLjk2aDMuODJjLS40MyAxLjQzLTEuMDggMi43Ni0xLjkxIDMuOTZ6TTE0LjM0IDE0SDkuNjZjLS4wOS0uNjYtLjE2LTEuMzItLjE2LTIgMC0uNjguMDctMS4zNS4xNi0yaDQuNjhjLjA5LjY1LjE2IDEuMzIuMTYgMiAwIC42OC0uMDcgMS4zNC0uMTYgMnptLjI1IDUuNTZjLjYtMS4xMSAxLjA2LTIuMzEgMS4zOC0zLjU2aDIuOTVjLS45NiAxLjY1LTIuNDkgMi45My00LjMzIDMuNTZ6TTE2LjM2IDE0Yy4wOC0uNjYuMTQtMS4zMi4xNC0yIDAtLjY4LS4wNi0xLjM0LS4xNC0yaDMuMzhjLjE2LjY0LjI2IDEuMzEuMjYgMnMtLjEgMS4zNi0uMjYgMmgtMy4zOHoiIC8+PC9nPgo8ZyBpZD0ibGFzdC1wYWdlIj48cGF0aCBkPSJNNS41OSA3LjQxTDEwLjE4IDEybC00LjU5IDQuNTlMNyAxOGw2LTYtNi02ek0xNiA2aDJ2MTJoLTJ6IiAvPjwvZz4KPGcgaWQ9ImxhdW5jaCI+PHBhdGggZD0iTTE5IDE5SDVWNWg3VjNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi03aC0ydjd6TTE0IDN2MmgzLjU5bC05LjgzIDkuODMgMS40MSAxLjQxTDE5IDYuNDFWMTBoMlYzaC03eiIgLz48L2c+CjxnIGlkPSJsaWdodGJ1bGItb3V0bGluZSI+PHBhdGggZD0iTTkgMjFjMCAuNTUuNDUgMSAxIDFoNGMuNTUgMCAxLS40NSAxLTF2LTFIOXYxem0zLTE5QzguMTQgMiA1IDUuMTQgNSA5YzAgMi4zOCAxLjE5IDQuNDcgMyA1Ljc0VjE3YzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xdi0yLjI2YzEuODEtMS4yNyAzLTMuMzYgMy01Ljc0IDAtMy44Ni0zLjE0LTctNy03em0yLjg1IDExLjFsLS44NS42VjE2aC00di0yLjNsLS44NS0uNkM3LjggMTIuMTYgNyAxMC42MyA3IDljMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWMwIDEuNjMtLjggMy4xNi0yLjE1IDQuMXoiIC8+PC9nPgo8ZyBpZD0ibGluZS1zdHlsZSI+PHBhdGggZD0iTTMgMTZoNXYtMkgzdjJ6bTYuNSAwaDV2LTJoLTV2MnptNi41IDBoNXYtMmgtNXYyek0zIDIwaDJ2LTJIM3Yyem00IDBoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTMgMTJoOHYtMkgzdjJ6bTEwIDBoOHYtMmgtOHYyek0zIDR2NGgxOFY0SDN6IiAvPjwvZz4KPGcgaWQ9ImxpbmUtd2VpZ2h0Ij48cGF0aCBkPSJNMyAxN2gxOHYtMkgzdjJ6bTAgM2gxOHYtMUgzdjF6bTAtN2gxOHYtM0gzdjN6bTAtOXY0aDE4VjRIM3oiIC8+PC9nPgo8ZyBpZD0ibGluayI+PHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIgLz48L2c+CjxnIGlkPSJsaXN0Ij48cGF0aCBkPSJNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptNCA0aDE0di0ySDd2MnptMCA0aDE0di0ySDd2MnpNNyA3djJoMTRWN0g3eiIgLz48L2c+CjxnIGlkPSJsb2NrIj48cGF0aCBkPSJNMTggOGgtMVY2YzAtMi43Ni0yLjI0LTUtNS01UzcgMy4yNCA3IDZ2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0tNiA5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnptMy4xLTlIOC45VjZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2MnoiIC8+PC9nPgo8ZyBpZD0ibG9jay1vcGVuIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2aDEuOWMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bTAgMTJINlYxMGgxMnYxMHoiIC8+PC9nPgo8ZyBpZD0ibG9jay1vdXRsaW5lIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnpNOC45IDZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFzMy4xIDEuMzkgMy4xIDMuMXYySDguOVY2ek0xOCAyMEg2VjEwaDEydjEweiIgLz48L2c+CjxnIGlkPSJsb3ctcHJpb3JpdHkiPjxwYXRoIGQ9Ik0xNCA1aDh2MmgtOHptMCA1LjVoOHYyaC04em0wIDUuNWg4djJoLTh6TTIgMTEuNUMyIDE1LjA4IDQuOTIgMTggOC41IDE4SDl2MmwzLTMtMy0zdjJoLS41QzYuMDIgMTYgNCAxMy45OCA0IDExLjVTNi4wMiA3IDguNSA3SDEyVjVIOC41QzQuOTIgNSAyIDcuOTIgMiAxMS41eiIgLz48L2c+CjxnIGlkPSJsb3lhbHR5Ij48cGF0aCBkPSJNMjEuNDEgMTEuNThsLTktOUMxMi4wNSAyLjIyIDExLjU1IDIgMTEgMkg0Yy0xLjEgMC0yIC45LTIgMnY3YzAgLjU1LjIyIDEuMDUuNTkgMS40Mmw5IDljLjM2LjM2Ljg2LjU4IDEuNDEuNTguNTUgMCAxLjA1LS4yMiAxLjQxLS41OWw3LTdjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLS41NS0uMjMtMS4wNi0uNTktMS40MnpNNS41IDdDNC42NyA3IDQgNi4zMyA0IDUuNVM0LjY3IDQgNS41IDQgNyA0LjY3IDcgNS41IDYuMzMgNyA1LjUgN3ptMTEuNzcgOC4yN0wxMyAxOS41NGwtNC4yNy00LjI3QzguMjggMTQuODEgOCAxNC4xOSA4IDEzLjVjMC0xLjM4IDEuMTItMi41IDIuNS0yLjUuNjkgMCAxLjMyLjI4IDEuNzcuNzRsLjczLjcyLjczLS43M2MuNDUtLjQ1IDEuMDgtLjczIDEuNzctLjczIDEuMzggMCAyLjUgMS4xMiAyLjUgMi41IDAgLjY5LS4yOCAxLjMyLS43MyAxLjc3eiIgLz48L2c+CjxnIGlkPSJtYWlsIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9Im1hcmt1bnJlYWQiPjxwYXRoIGQ9Ik0yMCA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgNGwtOCA1LTgtNVY2bDggNSA4LTV2MnoiIC8+PC9nPgo8ZyBpZD0ibWFya3VucmVhZC1tYWlsYm94Ij48cGF0aCBkPSJNMjAgNkgxMHY2SDhWNGg2VjBINnY2SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibWVudSI+PHBhdGggZD0iTTMgMThoMTh2LTJIM3Yyem0wLTVoMTh2LTJIM3Yyem0wLTd2MmgxOFY2SDN6IiAvPjwvZz4KPGcgaWQ9Im1vcmUtaG9yaXoiPjxwYXRoIGQ9Ik02IDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMTIgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bS02IDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJtb3JlLXZlcnQiPjxwYXRoIGQ9Ik0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibW90b3JjeWNsZSI+PHBhdGggZD0iTTE5LjQ0IDkuMDNMMTUuNDEgNUgxMXYyaDMuNTlsMiAySDVjLTIuOCAwLTUgMi4yLTUgNXMyLjIgNSA1IDVjMi40NiAwIDQuNDUtMS42OSA0LjktNGgxLjY1bDIuNzctMi43N2MtLjIxLjU0LS4zMiAxLjE0LS4zMiAxLjc3IDAgMi44IDIuMiA1IDUgNXM1LTIuMiA1LTVjMC0yLjY1LTEuOTctNC43Ny00LjU2LTQuOTd6TTcuODIgMTVDNy40IDE2LjE1IDYuMjggMTcgNSAxN2MtMS42MyAwLTMtMS4zNy0zLTNzMS4zNy0zIDMtM2MxLjI4IDAgMi40Ljg1IDIuODIgMkg1djJoMi44MnpNMTkgMTdjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzeiIgLz48L2c+CjxnIGlkPSJtb3ZlLXRvLWluYm94Ij48cGF0aCBkPSJNMTkgM0g0Ljk5Yy0xLjExIDAtMS45OC45LTEuOTggMkwzIDE5YzAgMS4xLjg4IDIgMS45OSAySDE5YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJoLTRjMCAxLjY2LTEuMzUgMy0zIDNzLTMtMS4zNC0zLTNINC45OVY1SDE5djEwem0tMy01aC0yVjdoLTR2M0g4bDQgNCA0LTR6IiAvPjwvZz4KPGcgaWQ9Im5leHQtd2VlayI+PHBhdGggZD0iTTIwIDdoLTRWNWMwLS41NS0uMjItMS4wNS0uNTktMS40MUMxNS4wNSAzLjIyIDE0LjU1IDMgMTQgM2gtNGMtMS4xIDAtMiAuOS0yIDJ2Mkg0Yy0xLjEgMC0yIC45LTIgMnYxMWMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjljMC0xLjEtLjktMi0yLTJ6TTEwIDVoNHYyaC00VjV6bTEgMTMuNWwtMS0xIDMtMy0zLTMgMS0xIDQgNC00IDR6IiAvPjwvZz4KPGcgaWQ9Im5vdGUtYWRkIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE0aC0zdjNoLTJ2LTNIOHYtMmgzdi0zaDJ2M2gzdjJ6bS0zLTdWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0ib2ZmbGluZS1waW4iPjxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwIDEwLTQuNSAxMC0xMFMxNy41IDIgMTIgMnptNSAxNkg3di0yaDEwdjJ6bS02LjctNEw3IDEwLjdsMS40LTEuNCAxLjkgMS45IDUuMy01LjNMMTcgNy4zIDEwLjMgMTR6IiAvPjwvZz4KPGcgaWQ9Im9wYWNpdHkiPjxwYXRoIGQ9Ik0xNy42NiA4TDEyIDIuMzUgNi4zNCA4QzQuNzggOS41NiA0IDExLjY0IDQgMTMuNjRzLjc4IDQuMTEgMi4zNCA1LjY3IDMuNjEgMi4zNSA1LjY2IDIuMzUgNC4xLS43OSA1LjY2LTIuMzVTMjAgMTUuNjQgMjAgMTMuNjQgMTkuMjIgOS41NiAxNy42NiA4ek02IDE0Yy4wMS0yIC42Mi0zLjI3IDEuNzYtNC40TDEyIDUuMjdsNC4yNCA0LjM4QzE3LjM4IDEwLjc3IDE3Ljk5IDEyIDE4IDE0SDZ6IiAvPjwvZz4KPGcgaWQ9Im9wZW4taW4tYnJvd3NlciI+PHBhdGggZD0iTTE5IDRINWMtMS4xMSAwLTIgLjktMiAydjEyYzAgMS4xLjg5IDIgMiAyaDR2LTJINVY4aDE0djEwaC00djJoNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS44OS0yLTItMnptLTcgNmwtNCA0aDN2Nmgydi02aDNsLTQtNHoiIC8+PC9nPgo8ZyBpZD0ib3Blbi1pbi1uZXciPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiIC8+PC9nPgo8ZyBpZD0ib3Blbi13aXRoIj48cGF0aCBkPSJNMTAgOWg0VjZoM2wtNS01LTUgNWgzdjN6bS0xIDFINlY3bC01IDUgNSA1di0zaDN2LTR6bTE0IDJsLTUtNXYzaC0zdjRoM3YzbDUtNXptLTkgM2gtNHYzSDdsNSA1IDUtNWgtM3YtM3oiIC8+PC9nPgo8ZyBpZD0icGFnZXZpZXciPjxwYXRoIGQ9Ik0xMS41IDlDMTAuMTIgOSA5IDEwLjEyIDkgMTEuNXMxLjEyIDIuNSAyLjUgMi41IDIuNS0xLjEyIDIuNS0yLjVTMTIuODggOSAxMS41IDl6TTIwIDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tMy4yMSAxNC4yMWwtMi45MS0yLjkxYy0uNjkuNDQtMS41MS43LTIuMzkuN0M5LjAxIDE2IDcgMTMuOTkgNyAxMS41UzkuMDEgNyAxMS41IDcgMTYgOS4wMSAxNiAxMS41YzAgLjg4LS4yNiAxLjY5LS43IDIuMzlsMi45MSAyLjktMS40MiAxLjQyeiIgLz48L2c+CjxnIGlkPSJwYW4tdG9vbCI+PHBhdGggZD0iTTIzIDUuNVYyMGMwIDIuMi0xLjggNC00IDRoLTcuM2MtMS4wOCAwLTIuMS0uNDMtMi44NS0xLjE5TDEgMTQuODNzMS4yNi0xLjIzIDEuMy0xLjI1Yy4yMi0uMTkuNDktLjI5Ljc5LS4yOS4yMiAwIC40Mi4wNi42LjE2LjA0LjAxIDQuMzEgMi40NiA0LjMxIDIuNDZWNGMwLS44My42Ny0xLjUgMS41LTEuNVMxMSAzLjE3IDExIDR2N2gxVjEuNWMwLS44My42Ny0xLjUgMS41LTEuNVMxNSAuNjcgMTUgMS41VjExaDFWMi41YzAtLjgzLjY3LTEuNSAxLjUtMS41czEuNS42NyAxLjUgMS41VjExaDFWNS41YzAtLjgzLjY3LTEuNSAxLjUtMS41czEuNS42NyAxLjUgMS41eiIgLz48L2c+CjxnIGlkPSJwYXltZW50Ij48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiIgLz48L2c+CjxnIGlkPSJwZXJtLWNhbWVyYS1taWMiPjxwYXRoIGQ9Ik0yMCA1aC0zLjE3TDE1IDNIOUw3LjE3IDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg3di0yLjA5Yy0yLjgzLS40OC01LTIuOTQtNS01LjkxaDJjMCAyLjIxIDEuNzkgNCA0IDRzNC0xLjc5IDQtNGgyYzAgMi45Ny0yLjE3IDUuNDMtNSA1LjkxVjIxaDdjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptLTYgOGMwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTJWOWMwLTEuMS45LTIgMi0yczIgLjkgMiAydjR6IiAvPjwvZz4KPGcgaWQ9InBlcm0tY29udGFjdC1jYWxlbmRhciI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDNjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDMtMy0xLjM0LTMtMyAxLjM0LTMgMy0zem02IDEySDZ2LTFjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xdjF6IiAvPjwvZz4KPGcgaWQ9InBlcm0tZGF0YS1zZXR0aW5nIj48cGF0aCBkPSJNMTguOTkgMTEuNWMuMzQgMCAuNjcuMDMgMSAuMDdMMjAgMCAwIDIwaDExLjU2Yy0uMDQtLjMzLS4wNy0uNjYtLjA3LTEgMC00LjE0IDMuMzYtNy41IDcuNS03LjV6bTMuNzEgNy45OWMuMDItLjE2LjA0LS4zMi4wNC0uNDkgMC0uMTctLjAxLS4zMy0uMDQtLjQ5bDEuMDYtLjgzYy4wOS0uMDguMTItLjIxLjA2LS4zMmwtMS0xLjczYy0uMDYtLjExLS4xOS0uMTUtLjMxLS4xMWwtMS4yNC41Yy0uMjYtLjItLjU0LS4zNy0uODUtLjQ5bC0uMTktMS4zMmMtLjAxLS4xMi0uMTItLjIxLS4yNC0uMjFoLTJjLS4xMiAwLS4yMy4wOS0uMjUuMjFsLS4xOSAxLjMyYy0uMy4xMy0uNTkuMjktLjg1LjQ5bC0xLjI0LS41Yy0uMTEtLjA0LS4yNCAwLS4zMS4xMWwtMSAxLjczYy0uMDYuMTEtLjA0LjI0LjA2LjMybDEuMDYuODNjLS4wMi4xNi0uMDMuMzItLjAzLjQ5IDAgLjE3LjAxLjMzLjAzLjQ5bC0xLjA2LjgzYy0uMDkuMDgtLjEyLjIxLS4wNi4zMmwxIDEuNzNjLjA2LjExLjE5LjE1LjMxLjExbDEuMjQtLjVjLjI2LjIuNTQuMzcuODUuNDlsLjE5IDEuMzJjLjAyLjEyLjEyLjIxLjI1LjIxaDJjLjEyIDAgLjIzLS4wOS4yNS0uMjFsLjE5LTEuMzJjLjMtLjEzLjU5LS4yOS44NC0uNDlsMS4yNS41Yy4xMS4wNC4yNCAwIC4zMS0uMTFsMS0xLjczYy4wNi0uMTEuMDMtLjI0LS4wNi0uMzJsLTEuMDctLjgzem0tMy43MSAxLjAxYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0icGVybS1kZXZpY2UtaW5mb3JtYXRpb24iPjxwYXRoIGQ9Ik0xMyA3aC0ydjJoMlY3em0wIDRoLTJ2Nmgydi02em00LTkuOTlMNyAxYy0xLjEgMC0yIC45LTIgMnYxOGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE3IDE5SDdWNWgxMHYxNHoiIC8+PC9nPgo8ZyBpZD0icGVybS1pZGVudGl0eSI+PHBhdGggZD0iTTEyIDUuOWMxLjE2IDAgMi4xLjk0IDIuMSAyLjFzLS45NCAyLjEtMi4xIDIuMVM5LjkgOS4xNiA5LjkgOHMuOTQtMi4xIDIuMS0yLjFtMCA5YzIuOTcgMCA2LjEgMS40NiA2LjEgMi4xdjEuMUg1LjlWMTdjMC0uNjQgMy4xMy0yLjEgNi4xLTIuMU0xMiA0QzkuNzkgNCA4IDUuNzkgOCA4czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0wIDljLTIuNjcgMC04IDEuMzQtOCA0djNoMTZ2LTNjMC0yLjY2LTUuMzMtNC04LTR6IiAvPjwvZz4KPGcgaWQ9InBlcm0tbWVkaWEiPjxwYXRoIGQ9Ik0yIDZIMHY1aC4wMUwwIDIwYzAgMS4xLjkgMiAyIDJoMTh2LTJIMlY2em0yMC0yaC04bC0yLTJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnpNNyAxNWw0LjUtNiAzLjUgNC41MSAyLjUtMy4wMUwyMSAxNUg3eiIgLz48L2c+CjxnIGlkPSJwZXJtLXBob25lLW1zZyI+PHBhdGggZD0iTTIwIDE1LjVjLTEuMjUgMC0yLjQ1LS4yLTMuNTctLjU3LS4zNS0uMTEtLjc0LS4wMy0xLjAyLjI0bC0yLjIgMi4yYy0yLjgzLTEuNDQtNS4xNS0zLjc1LTYuNTktNi41OGwyLjItMi4yMWMuMjgtLjI3LjM2LS42Ni4yNS0xLjAxQzguNyA2LjQ1IDguNSA1LjI1IDguNSA0YzAtLjU1LS40NS0xLTEtMUg0Yy0uNTUgMC0xIC40NS0xIDEgMCA5LjM5IDcuNjEgMTcgMTcgMTcgLjU1IDAgMS0uNDUgMS0xdi0zLjVjMC0uNTUtLjQ1LTEtMS0xek0xMiAzdjEwbDMtM2g2VjNoLTl6IiAvPjwvZz4KPGcgaWQ9InBlcm0tc2Nhbi13aWZpIj48cGF0aCBkPSJNMTIgM0M2Ljk1IDMgMy4xNSA0Ljg1IDAgNy4yM0wxMiAyMiAyNCA3LjI1QzIwLjg1IDQuODcgMTcuMDUgMyAxMiAzem0xIDEzaC0ydi02aDJ2NnptLTItOFY2aDJ2MmgtMnoiIC8+PC9nPgo8ZyBpZD0icGV0cyI+PGNpcmNsZSBjeD0iNC41IiBjeT0iOS41IiByPSIyLjUiIC8+PGNpcmNsZSBjeD0iOSIgY3k9IjUuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjE1IiBjeT0iNS41IiByPSIyLjUiIC8+PGNpcmNsZSBjeD0iMTkuNSIgY3k9IjkuNSIgcj0iMi41IiAvPjxwYXRoIGQ9Ik0xNy4zNCAxNC44NmMtLjg3LTEuMDItMS42LTEuODktMi40OC0yLjkxLS40Ni0uNTQtMS4wNS0xLjA4LTEuNzUtMS4zMi0uMTEtLjA0LS4yMi0uMDctLjMzLS4wOS0uMjUtLjA0LS41Mi0uMDQtLjc4LS4wNHMtLjUzIDAtLjc5LjA1Yy0uMTEuMDItLjIyLjA1LS4zMy4wOS0uNy4yNC0xLjI4Ljc4LTEuNzUgMS4zMi0uODcgMS4wMi0xLjYgMS44OS0yLjQ4IDIuOTEtMS4zMSAxLjMxLTIuOTIgMi43Ni0yLjYyIDQuNzkuMjkgMS4wMiAxLjAyIDIuMDMgMi4zMyAyLjMyLjczLjE1IDMuMDYtLjQ0IDUuNTQtLjQ0aC4xOGMyLjQ4IDAgNC44MS41OCA1LjU0LjQ0IDEuMzEtLjI5IDIuMDQtMS4zMSAyLjMzLTIuMzIuMzEtMi4wNC0xLjMtMy40OS0yLjYxLTQuOHoiIC8+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlIj48cGF0aCBkPSJNMTkgN2gtOHY2aDhWN3ptMi00SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4VjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk4aDE4djE0LjAzeiIgLz48L2c+CjxnIGlkPSJwaWN0dXJlLWluLXBpY3R1cmUtYWx0Ij48cGF0aCBkPSJNMTkgMTFoLTh2Nmg4di02em00IDhWNC45OEMyMyAzLjg4IDIyLjEgMyAyMSAzSDNjLTEuMSAwLTIgLjg4LTIgMS45OFYxOWMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yem0tMiAuMDJIM1Y0Ljk3aDE4djE0LjA1eiIgLz48L2c+CjxnIGlkPSJwbGF5LWZvci13b3JrIj48cGF0aCBkPSJNMTEgNXY1LjU5SDcuNWw0LjUgNC41IDQuNS00LjVIMTNWNWgtMnptLTUgOWMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02aC0yYzAgMi4yMS0xLjc5IDQtNCA0cy00LTEuNzktNC00SDZ6IiAvPjwvZz4KPGcgaWQ9InBvbHltZXIiPjxwYXRoIGQ9Ik0xOSA0aC00TDcuMTEgMTYuNjMgNC41IDEyIDkgNEg1TC41IDEyIDUgMjBoNGw3Ljg5LTEyLjYzTDE5LjUgMTIgMTUgMjBoNGw0LjUtOHoiIC8+PC9nPgo8ZyBpZD0icG93ZXItc2V0dGluZ3MtbmV3Ij48cGF0aCBkPSJNMTMgM2gtMnYxMGgyVjN6bTQuODMgMi4xN2wtMS40MiAxLjQyQzE3Ljk5IDcuODYgMTkgOS44MSAxOSAxMmMwIDMuODctMy4xMyA3LTcgN3MtNy0zLjEzLTctN2MwLTIuMTkgMS4wMS00LjE0IDIuNTgtNS40Mkw2LjE3IDUuMTdDNC4yMyA2LjgyIDMgOS4yNiAzIDEyYzAgNC45NyA0LjAzIDkgOSA5czktNC4wMyA5LTljMC0yLjc0LTEuMjMtNS4xOC0zLjE3LTYuODN6IiAvPjwvZz4KPGcgaWQ9InByZWduYW50LXdvbWFuIj48cGF0aCBkPSJNOSA0YzAtMS4xMS44OS0yIDItMnMyIC44OSAyIDItLjg5IDItMiAyLTItLjg5LTItMnptNyA5Yy0uMDEtMS4zNC0uODMtMi41MS0yLTMgMC0xLjY2LTEuMzQtMy0zLTNzLTMgMS4zNC0zIDN2N2gydjVoM3YtNWgzdi00eiIgLz48L2c+CjxnIGlkPSJwcmludCI+PHBhdGggZD0iTTE5IDhINWMtMS42NiAwLTMgMS4zNC0zIDN2Nmg0djRoMTJ2LTRoNHYtNmMwLTEuNjYtMS4zNC0zLTMtM3ptLTMgMTFIOHYtNWg4djV6bTMtN2MtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxem0tMS05SDZ2NGgxMlYzeiIgLz48L2c+CjxnIGlkPSJxdWVyeS1idWlsZGVyIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0uNS0xM0gxMXY2bDUuMjUgMy4xNS43NS0xLjIzLTQuNS0yLjY3eiIgLz48L2c+CjxnIGlkPSJxdWVzdGlvbi1hbnN3ZXIiPjxwYXRoIGQ9Ik0yMSA2aC0ydjlINnYyYzAgLjU1LjQ1IDEgMSAxaDExbDQgNFY3YzAtLjU1LS40NS0xLTEtMXptLTQgNlYzYzAtLjU1LS40NS0xLTEtMUgzYy0uNTUgMC0xIC40NS0xIDF2MTRsNC00aDEwYy41NSAwIDEtLjQ1IDEtMXoiIC8+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLWNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiA3Yy0yLjc2IDAtNSAyLjI0LTUgNXMyLjI0IDUgNSA1IDUtMi4yNCA1LTUtMi4yNC01LTUtNXptMC01QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLXVuY2hlY2tlZCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJyZWNlaXB0Ij48cGF0aCBkPSJNMTggMTdINnYtMmgxMnYyem0wLTRINnYtMmgxMnYyem0wLTRINlY3aDEydjJ6TTMgMjJsMS41LTEuNUw2IDIybDEuNS0xLjVMOSAyMmwxLjUtMS41TDEyIDIybDEuNS0xLjVMMTUgMjJsMS41LTEuNUwxOCAyMmwxLjUtMS41TDIxIDIyVjJsLTEuNSAxLjVMMTggMmwtMS41IDEuNUwxNSAybC0xLjUgMS41TDEyIDJsLTEuNSAxLjVMOSAyIDcuNSAzLjUgNiAyIDQuNSAzLjUgMyAydjIweiIgLz48L2c+CjxnIGlkPSJyZWNvcmQtdm9pY2Utb3ZlciI+PGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjQiIC8+PHBhdGggZD0iTTkgMTVjLTIuNjcgMC04IDEuMzQtOCA0djJoMTZ2LTJjMC0yLjY2LTUuMzMtNC04LTR6bTcuNzYtOS42NGwtMS42OCAxLjY5Yy44NCAxLjE4Ljg0IDIuNzEgMCAzLjg5bDEuNjggMS42OWMyLjAyLTIuMDIgMi4wMi01LjA3IDAtNy4yN3pNMjAuMDcgMmwtMS42MyAxLjYzYzIuNzcgMy4wMiAyLjc3IDcuNTYgMCAxMC43NEwyMC4wNyAxNmMzLjktMy44OSAzLjkxLTkuOTUgMC0xNHoiIC8+PC9nPgo8ZyBpZD0icmVkZWVtIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6IiAvPjwvZz4KPGcgaWQ9InJlZG8iPjxwYXRoIGQ9Ik0xOC40IDEwLjZDMTYuNTUgOC45OSAxNC4xNSA4IDExLjUgOGMtNC42NSAwLTguNTggMy4wMy05Ljk2IDcuMjJMMy45IDE2YzEuMDUtMy4xOSA0LjA1LTUuNSA3LjYtNS41IDEuOTUgMCAzLjczLjcyIDUuMTIgMS44OEwxMyAxNmg5VjdsLTMuNiAzLjZ6IiAvPjwvZz4KPGcgaWQ9InJlZnJlc2giPjxwYXRoIGQ9Ik0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlIj48cGF0aCBkPSJNMTkgMTNINXYtMmgxNHYyeiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNSAxMUg3di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9InJlbW92ZS1jaXJjbGUtb3V0bGluZSI+PHBhdGggZD0iTTcgMTF2MmgxMHYtMkg3em01LTlDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTIyLjczIDIyLjczTDIuNzcgMi43NyAyIDJsLS43My0uNzNMMCAyLjU0bDQuMzkgNC4zOSAyLjIxIDQuNjYtMS4zNSAyLjQ1Yy0uMTYuMjgtLjI1LjYxLS4yNS45NiAwIDEuMS45IDIgMiAyaDcuNDZsMS4zOCAxLjM4Yy0uNS4zNi0uODMuOTUtLjgzIDEuNjIgMCAxLjEuODkgMiAxLjk5IDIgLjY3IDAgMS4yNi0uMzMgMS42Mi0uODRMMjEuNDYgMjRsMS4yNy0xLjI3ek03LjQyIDE1Yy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoMi4zNmwyIDJINy40MnptOC4xMy0yYy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjU4LTYuNDljLjA4LS4xNC4xMi0uMzEuMTItLjQ4IDAtLjU1LS40NS0xLTEtMUg2LjU0bDkuMDEgOXpNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0icmVvcmRlciI+PHBhdGggZD0iTTMgMTVoMTh2LTJIM3Yyem0wIDRoMTh2LTJIM3Yyem0wLThoMThWOUgzdjJ6bTAtNnYyaDE4VjVIM3oiIC8+PC9nPgo8ZyBpZD0icmVwbHkiPjxwYXRoIGQ9Ik0xMCA5VjVsLTcgNyA3IDd2LTQuMWM1IDAgOC41IDEuNiAxMSA1LjEtMS01LTQtMTAtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InJlcGx5LWFsbCI+PHBhdGggZD0iTTcgOFY1bC03IDcgNyA3di0zbC00LTQgNC00em02IDFWNWwtNyA3IDcgN3YtNC4xYzUgMCA4LjUgMS42IDExIDUuMS0xLTUtNC0xMC0xMS0xMXoiIC8+PC9nPgo8ZyBpZD0icmVwb3J0Ij48cGF0aCBkPSJNMTUuNzMgM0g4LjI3TDMgOC4yN3Y3LjQ2TDguMjcgMjFoNy40NkwyMSAxNS43M1Y4LjI3TDE1LjczIDN6TTEyIDE3LjNjLS43MiAwLTEuMy0uNTgtMS4zLTEuMyAwLS43Mi41OC0xLjMgMS4zLTEuMy43MiAwIDEuMy41OCAxLjMgMS4zIDAgLjcyLS41OCAxLjMtMS4zIDEuM3ptMS00LjNoLTJWN2gydjZ6IiAvPjwvZz4KPGcgaWQ9InJlcG9ydC1wcm9ibGVtIj48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJyZXN0b3JlIj48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiIgLz48L2c+CjxnIGlkPSJyZXN0b3JlLXBhZ2UiPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bS0yIDE2Yy0yLjA1IDAtMy44MS0xLjI0LTQuNTgtM2gxLjcxYy42My45IDEuNjggMS41IDIuODcgMS41IDEuOTMgMCAzLjUtMS41NyAzLjUtMy41UzEzLjkzIDkuNSAxMiA5LjVjLTEuMzUgMC0yLjUyLjc4LTMuMSAxLjlsMS42IDEuNmgtNFY5bDEuMyAxLjNDOC42OSA4LjkyIDEwLjIzIDggMTIgOGMyLjc2IDAgNSAyLjI0IDUgNXMtMi4yNCA1LTUgNXoiIC8+PC9nPgo8ZyBpZD0icm9vbSI+PHBhdGggZD0iTTEyIDJDOC4xMyAyIDUgNS4xMyA1IDljMCA1LjI1IDcgMTMgNyAxM3M3LTcuNzUgNy0xM2MwLTMuODctMy4xMy03LTctN3ptMCA5LjVjLTEuMzggMC0yLjUtMS4xMi0yLjUtMi41czEuMTItMi41IDIuNS0yLjUgMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41eiIgLz48L2c+CjxnIGlkPSJyb3VuZGVkLWNvcm5lciI+PHBhdGggZD0iTTE5IDE5aDJ2MmgtMnYtMnptMC0yaDJ2LTJoLTJ2MnpNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptMC00aDJWM0gzdjJ6bTQgMGgyVjNIN3Yyem04IDE2aDJ2LTJoLTJ2MnptLTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bS04IDBoMnYtMkg3djJ6bS00IDBoMnYtMkgzdjJ6TTIxIDhjMC0yLjc2LTIuMjQtNS01LTVoLTV2Mmg1YzEuNjUgMCAzIDEuMzUgMyAzdjVoMlY4eiIgLz48L2c+CjxnIGlkPSJyb3dpbmciPjxwYXRoIGQ9Ik04LjUgMTQuNUw0IDE5bDEuNSAxLjVMOSAxN2gybC0yLjUtMi41ek0xNSAxYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNiAyMC4wMUwxOCAyNGwtMi45OS0zLjAxVjE5LjVsLTcuMS03LjA5Yy0uMzEuMDUtLjYxLjA3LS45MS4wN3YtMi4xNmMxLjY2LjAzIDMuNjEtLjg3IDQuNjctMi4wNGwxLjQtMS41NWMuMTktLjIxLjQzLS4zOC42OS0uNS4yOS0uMTQuNjItLjIzLjk2LS4yM2guMDNDMTUuOTkgNi4wMSAxNyA3LjAyIDE3IDguMjZ2NS43NWMwIC44NC0uMzUgMS42MS0uOTIgMi4xNmwtMy41OC0zLjU4di0yLjI3Yy0uNjMuNTItMS40MyAxLjAyLTIuMjkgMS4zOUwxNi41IDE4SDE4bDMgMy4wMXoiIC8+PC9nPgo8ZyBpZD0ic2F2ZSI+PHBhdGggZD0iTTE3IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdsLTQtNHptLTUgMTZjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzem0zLTEwSDVWNWgxMHY0eiIgLz48L2c+CjxnIGlkPSJzY2hlZHVsZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiIC8+PC9nPgo8ZyBpZD0ic2VhcmNoIj48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiIC8+PC9nPgo8ZyBpZD0ic2VsZWN0LWFsbCI+PHBhdGggZD0iTTMgNWgyVjNjLTEuMSAwLTIgLjktMiAyem0wIDhoMnYtMkgzdjJ6bTQgOGgydi0ySDd2MnpNMyA5aDJWN0gzdjJ6bTEwLTZoLTJ2MmgyVjN6bTYgMHYyaDJjMC0xLjEtLjktMi0yLTJ6TTUgMjF2LTJIM2MwIDEuMS45IDIgMiAyem0tMi00aDJ2LTJIM3Yyek05IDNIN3YyaDJWM3ptMiAxOGgydi0yaC0ydjJ6bTgtOGgydi0yaC0ydjJ6bTAgOGMxLjEgMCAyLS45IDItMmgtMnYyem0wLTEyaDJWN2gtMnYyem0wIDhoMnYtMmgtMnYyem0tNCA0aDJ2LTJoLTJ2MnptMC0xNmgyVjNoLTJ2MnpNNyAxN2gxMFY3SDd2MTB6bTItOGg2djZIOVY5eiIgLz48L2c+CjxnIGlkPSJzZW5kIj48cGF0aCBkPSJNMi4wMSAyMUwyMyAxMiAyLjAxIDMgMiAxMGwxNSAyLTE1IDJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzIj48cGF0aCBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVDMTQuNDYgMi4xOCAxNC4yNSAyIDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYXBwbGljYXRpb25zIj48cGF0aCBkPSJNMTIgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem03LTdINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xLS44OS0yLTItMnptLTEuNzUgOWMwIC4yMy0uMDIuNDYtLjA1LjY4bDEuNDggMS4xNmMuMTMuMTEuMTcuMy4wOC40NWwtMS40IDIuNDJjLS4wOS4xNS0uMjcuMjEtLjQzLjE1bC0xLjc0LS43Yy0uMzYuMjgtLjc2LjUxLTEuMTguNjlsLS4yNiAxLjg1Yy0uMDMuMTctLjE4LjMtLjM1LjNoLTIuOGMtLjE3IDAtLjMyLS4xMy0uMzUtLjI5bC0uMjYtMS44NWMtLjQzLS4xOC0uODItLjQxLTEuMTgtLjY5bC0xLjc0LjdjLS4xNi4wNi0uMzQgMC0uNDMtLjE1bC0xLjQtMi40MmMtLjA5LS4xNS0uMDUtLjM0LjA4LS40NWwxLjQ4LTEuMTZjLS4wMy0uMjMtLjA1LS40Ni0uMDUtLjY5IDAtLjIzLjAyLS40Ni4wNS0uNjhsLTEuNDgtMS4xNmMtLjEzLS4xMS0uMTctLjMtLjA4LS40NWwxLjQtMi40MmMuMDktLjE1LjI3LS4yMS40My0uMTVsMS43NC43Yy4zNi0uMjguNzYtLjUxIDEuMTgtLjY5bC4yNi0xLjg1Yy4wMy0uMTcuMTgtLjMuMzUtLjNoMi44Yy4xNyAwIC4zMi4xMy4zNS4yOWwuMjYgMS44NWMuNDMuMTguODIuNDEgMS4xOC42OWwxLjc0LS43Yy4xNi0uMDYuMzQgMCAuNDMuMTVsMS40IDIuNDJjLjA5LjE1LjA1LjM0LS4wOC40NWwtMS40OCAxLjE2Yy4wMy4yMy4wNS40Ni4wNS42OXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYmFja3VwLXJlc3RvcmUiPjxwYXRoIGQ9Ik0xNCAxMmMwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDIgLjkgMiAyIDIgMi0uOSAyLTJ6bS0yLTljLTQuOTcgMC05IDQuMDMtOSA5SDBsNCA0IDQtNEg1YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS41MSAwLTIuOTEtLjQ5LTQuMDYtMS4zbC0xLjQyIDEuNDRDOC4wNCAyMC4zIDkuOTQgMjEgMTIgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJsdWV0b290aCI+PHBhdGggZD0iTTExIDI0aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnptOCAwaDJ2LTJoLTJ2MnptMi43MS0xOC4yOUwxMiAwaC0xdjcuNTlMNi40MSAzIDUgNC40MSAxMC41OSAxMCA1IDE1LjU5IDYuNDEgMTcgMTEgMTIuNDFWMjBoMWw1LjcxLTUuNzEtNC4zLTQuMjkgNC4zLTQuMjl6TTEzIDMuODNsMS44OCAxLjg4TDEzIDcuNTlWMy44M3ptMS44OCAxMC40NkwxMyAxNi4xN3YtMy43NmwxLjg4IDEuODh6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJyaWdodG5lc3MiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6TTggMTZoMi41bDEuNSAxLjUgMS41LTEuNUgxNnYtMi41bDEuNS0xLjUtMS41LTEuNVY4aC0yLjVMMTIgNi41IDEwLjUgOEg4djIuNUw2LjUgMTIgOCAxMy41VjE2em00LTdjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDNWOXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtY2VsbCI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTE2IC4wMUw4IDBDNi45IDAgNiAuOSA2IDJ2MTZjMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjJjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE2IDE2SDhWNGg4djEyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1ldGhlcm5ldCI+PHBhdGggZD0iTTcuNzcgNi43Nkw2LjIzIDUuNDguODIgMTJsNS40MSA2LjUyIDEuNTQtMS4yOEwzLjQyIDEybDQuMzUtNS4yNHpNNyAxM2gydi0ySDd2MnptMTAtMmgtMnYyaDJ2LTJ6bS02IDJoMnYtMmgtMnYyem02Ljc3LTcuNTJsLTEuNTQgMS4yOEwyMC41OCAxMmwtNC4zNSA1LjI0IDEuNTQgMS4yOEwyMy4xOCAxMmwtNS40MS02LjUyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1hbnRlbm5hIj48cGF0aCBkPSJNMTIgNWMtMy44NyAwLTcgMy4xMy03IDdoMmMwLTIuNzYgMi4yNC01IDUtNXM1IDIuMjQgNSA1aDJjMC0zLjg3LTMuMTMtNy03LTd6bTEgOS4yOWMuODgtLjM5IDEuNS0xLjI2IDEuNS0yLjI5IDAtMS4zOC0xLjEyLTIuNS0yLjUtMi41UzkuNSAxMC42MiA5LjUgMTJjMCAxLjAyLjYyIDEuOSAxLjUgMi4yOXYzLjNMNy41OSAyMSA5IDIyLjQxbDMtMyAzIDNMMTYuNDEgMjEgMTMgMTcuNTl2LTMuM3pNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJoMmMwLTQuOTcgNC4wMy05IDktOXM5IDQuMDMgOSA5aDJjMC02LjA3LTQuOTMtMTEtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvbmVudCI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtY29tcG9zaXRlIj48cGF0aCBkPSJNNSAyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIMXY2aDZWNkg1VjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJIOXYyem0tOCAwYzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOEM2LjE2IDE4LjQgNyAxNy4zIDcgMTZ2LTJIMXYyek0yMSA2VjJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NGgtMnY2aDZWNmgtMnptLTgtNGMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDl2Nmg2VjZoLTJWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMmgtNnYyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1oZG1pIj48cGF0aCBkPSJNMTggN1Y0YzAtMS4xLS45LTItMi0ySDhjLTEuMSAwLTIgLjktMiAydjNINXY2bDMgNnYzaDh2LTNsMy02VjdoLTF6TTggNGg4djNoLTJWNWgtMXYyaC0yVjVoLTF2Mkg4VjR6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LXN2aWRlbyI+PHBhdGggZD0iTTggMTEuNWMwLS44My0uNjctMS41LTEuNS0xLjVTNSAxMC42NyA1IDExLjUgNS42NyAxMyA2LjUgMTMgOCAxMi4zMyA4IDExLjV6bTctNWMwLS44My0uNjctMS41LTEuNS0xLjVoLTNDOS42NyA1IDkgNS42NyA5IDYuNVM5LjY3IDggMTAuNSA4aDNjLjgzIDAgMS41LS42NyAxLjUtMS41ek04LjUgMTVjLS44MyAwLTEuNS42Ny0xLjUgMS41UzcuNjcgMTggOC41IDE4czEuNS0uNjcgMS41LTEuNVM5LjMzIDE1IDguNSAxNXpNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJzNC45MyAxMSAxMSAxMSAxMS00LjkzIDExLTExUzE4LjA3IDEgMTIgMXptMCAyMGMtNC45NiAwLTktNC4wNC05LTlzNC4wNC05IDktOSA5IDQuMDQgOSA5LTQuMDQgOS05IDl6bTUuNS0xMWMtLjgzIDAtMS41LjY3LTEuNSAxLjVzLjY3IDEuNSAxLjUgMS41IDEuNS0uNjcgMS41LTEuNS0uNjctMS41LTEuNS0xLjV6bS0yIDVjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1vdmVyc2NhbiI+PHBhdGggZD0iTTEyLjAxIDUuNUwxMCA4aDRsLTEuOTktMi41ek0xOCAxMHY0bDIuNS0xLjk5TDE4IDEwek02IDEwbC0yLjUgMi4wMUw2IDE0di00em04IDZoLTRsMi4wMSAyLjVMMTQgMTZ6bTctMTNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcGhvbmUiPjxwYXRoIGQ9Ik0xMyA5aC0ydjJoMlY5em00IDBoLTJ2MmgyVjl6bTMgNi41Yy0xLjI1IDAtMi40NS0uMi0zLjU3LS41Ny0uMzUtLjExLS43NC0uMDMtMS4wMi4yNGwtMi4yIDIuMmMtMi44My0xLjQ0LTUuMTUtMy43NS02LjU5LTYuNThsMi4yLTIuMjFjLjI4LS4yNy4zNi0uNjYuMjUtMS4wMUM4LjcgNi40NSA4LjUgNS4yNSA4LjUgNGMwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxIDAgOS4zOSA3LjYxIDE3IDE3IDE3IC41NSAwIDEtLjQ1IDEtMXYtMy41YzAtLjU1LS40NS0xLTEtMXpNMTkgOXYyaDJWOWgtMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcG93ZXIiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem0yLTIyaC0ydjEwaDJWMnptMy41NiAyLjQ0bC0xLjQ1IDEuNDVDMTYuODQgNi45NCAxOCA4LjgzIDE4IDExYzAgMy4zMS0yLjY5IDYtNiA2cy02LTIuNjktNi02YzAtMi4xNyAxLjE2LTQuMDYgMi44OC01LjEyTDcuNDQgNC40NEM1LjM2IDUuODggNCA4LjI4IDQgMTFjMCA0LjQyIDMuNTggOCA4IDhzOC0zLjU4IDgtOGMwLTIuNzItMS4zNi01LjEyLTMuNDQtNi41NnpNMTUgMjRoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1yZW1vdGUiPjxwYXRoIGQ9Ik0xNSA5SDljLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMVYxMGMwLS41NS0uNDUtMS0xLTF6bS0zIDZjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyek03LjA1IDYuMDVsMS40MSAxLjQxQzkuMzcgNi41NiAxMC42MiA2IDEyIDZzMi42My41NiAzLjU0IDEuNDZsMS40MS0xLjQxQzE1LjY4IDQuNzggMTMuOTMgNCAxMiA0cy0zLjY4Ljc4LTQuOTUgMi4wNXpNMTIgMEM4Ljk2IDAgNi4yMSAxLjIzIDQuMjIgMy4yMmwxLjQxIDEuNDFDNy4yNiAzLjAxIDkuNTEgMiAxMiAyczQuNzQgMS4wMSA2LjM2IDIuNjRsMS40MS0xLjQxQzE3Ljc5IDEuMjMgMTUuMDQgMCAxMiAweiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy12b2ljZSI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTUtMTFjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNGMwLTEuNjYtMS4zNC0zLTMtM1M5IDIuMzQgOSA0djZjMCAxLjY2IDEuMzQgMyAzIDN6bS0xIDExaDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnptNC0xNGgtMS43YzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxMyA2LjcgMTBINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMGgydi0zLjI4YzMuMjgtLjQ5IDYtMy4zMSA2LTYuNzJ6IiAvPjwvZz4KPGcgaWQ9InNob3AiPjxwYXRoIGQ9Ik0xNiA2VjRjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDJ2MTNjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmgtNnptLTYtMmg0djJoLTRWNHpNOSAxOFY5bDcuNSA0TDkgMTh6IiAvPjwvZz4KPGcgaWQ9InNob3AtdHdvIj48cGF0aCBkPSJNMyA5SDF2MTFjMCAxLjExLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS44OSAyLTJIM1Y5em0xNS00VjNjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDV2MTFjMCAxLjExLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS44OSAyLTJWNWgtNXptLTYtMmg0djJoLTRWM3ptMCAxMlY4bDUuNSAzLTUuNSA0eiIgLz48L2c+CjxnIGlkPSJzaG9wcGluZy1iYXNrZXQiPjxwYXRoIGQ9Ik0xNy4yMSA5bC00LjM4LTYuNTZjLS4xOS0uMjgtLjUxLS40Mi0uODMtLjQyLS4zMiAwLS42NC4xNC0uODMuNDNMNi43OSA5SDJjLS41NSAwLTEgLjQ1LTEgMSAwIC4wOS4wMS4xOC4wNC4yN2wyLjU0IDkuMjdjLjIzLjg0IDEgMS40NiAxLjkyIDEuNDZoMTNjLjkyIDAgMS42OS0uNjIgMS45My0xLjQ2bDIuNTQtOS4yN0wyMyAxMGMwLS41NS0uNDUtMS0xLTFoLTQuNzl6TTkgOWwzLTQuNEwxNSA5SDl6bTMgOGMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6IiAvPjwvZz4KPGcgaWQ9InNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik03IDE4Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yek0xIDJ2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINS4yMWwtLjk0LTJIMXptMTYgMTZjLTEuMSAwLTEuOTkuOS0xLjk5IDJzLjg5IDIgMS45OSAyIDItLjkgMi0yLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJzb3J0Ij48cGF0aCBkPSJNMyAxOGg2di0ySDN2MnpNMyA2djJoMThWNkgzem0wIDdoMTJ2LTJIM3YyeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLW5vdGVzIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTggMTRINnYtMmgydjJ6bTAtM0g2VjloMnYyem0wLTNINlY2aDJ2MnptNyA2aC01di0yaDV2MnptMy0zaC04VjloOHYyem0wLTNoLThWNmg4djJ6IiAvPjwvZz4KPGcgaWQ9InNwZWFrZXItbm90ZXMtb2ZmIj48cGF0aCBkPSJNMTAuNTQgMTFsLS41NC0uNTRMNy41NCA4IDYgNi40NiAyLjM4IDIuODQgMS4yNyAxLjczIDAgM2wyLjAxIDIuMDFMMiAyMmw0LTRoOWw1LjczIDUuNzNMMjIgMjIuNDYgMTcuNTQgMThsLTctN3pNOCAxNEg2di0yaDJ2MnptLTItM1Y5bDIgMkg2em0xNC05SDQuMDhMMTAgNy45MlY2aDh2MmgtNy45MmwxIDFIMTh2MmgtNC45Mmw2Ljk5IDYuOTlDMjEuMTQgMTcuOTUgMjIgMTcuMDggMjIgMTZWNGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ic3BlbGxjaGVjayI+PHBhdGggZD0iTTEyLjQ1IDE2aDIuMDlMOS40MyAzSDcuNTdMMi40NiAxNmgyLjA5bDEuMTItM2g1LjY0bDEuMTQgM3ptLTYuMDItNUw4LjUgNS40OCAxMC41NyAxMUg2LjQzem0xNS4xNi41OWwtOC4wOSA4LjA5TDkuODMgMTZsLTEuNDEgMS40MSA1LjA5IDUuMDlMMjMgMTNsLTEuNDEtMS40MXoiIC8+PC9nPgo8ZyBpZD0ic3RhciI+PHBhdGggZD0iTTEyIDE3LjI3TDE4LjE4IDIxbC0xLjY0LTcuMDNMMjIgOS4yNGwtNy4xOS0uNjFMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxeiIgLz48L2c+CjxnIGlkPSJzdGFyLWJvcmRlciI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRsLTMuNzYgMi4yNyAxLTQuMjgtMy4zMi0yLjg4IDQuMzgtLjM4TDEyIDYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6IiAvPjwvZz4KPGcgaWQ9InN0YXItaGFsZiI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRWNi4xbDEuNzEgNC4wNCA0LjM4LjM4LTMuMzIgMi44OCAxIDQuMjhMMTIgMTUuNHoiIC8+PC9nPgo8ZyBpZD0ic3RhcnMiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyem00LjI0IDE2TDEyIDE1LjQ1IDcuNzcgMThsMS4xMi00LjgxLTMuNzMtMy4yMyA0LjkyLS40MkwxMiA1bDEuOTIgNC41MyA0LjkyLjQyLTMuNzMgMy4yM0wxNi4yMyAxOHoiIC8+PC9nPgo8ZyBpZD0ic3RvcmUiPjxwYXRoIGQ9Ik0yMCA0SDR2MmgxNlY0em0xIDEwdi0ybC0xLTVINGwtMSA1djJoMXY2aDEwdi02aDR2Nmgydi02aDF6bS05IDRINnYtNGg2djR6IiAvPjwvZz4KPGcgaWQ9InN1YmRpcmVjdG9yeS1hcnJvdy1sZWZ0Ij48cGF0aCBkPSJNMTEgOWwxLjQyIDEuNDJMOC44MyAxNEgxOFY0aDJ2MTJIOC44M2wzLjU5IDMuNThMMTEgMjFsLTYtNiA2LTZ6IiAvPjwvZz4KPGcgaWQ9InN1YmRpcmVjdG9yeS1hcnJvdy1yaWdodCI+PHBhdGggZD0iTTE5IDE1bC02IDYtMS40Mi0xLjQyTDE1LjE3IDE2SDRWNGgydjEwaDkuMTdsLTMuNTktMy41OEwxMyA5bDYgNnoiIC8+PC9nPgo8ZyBpZD0ic3ViamVjdCI+PHBhdGggZD0iTTE0IDE3SDR2MmgxMHYtMnptNi04SDR2MmgxNlY5ek00IDE1aDE2di0ySDR2MnpNNCA1djJoMTZWNUg0eiIgLz48L2c+CjxnIGlkPSJzdXBlcnZpc29yLWFjY291bnQiPjxwYXRoIGQ9Ik0xNi41IDEyYzEuMzggMCAyLjQ5LTEuMTIgMi40OS0yLjVTMTcuODggNyAxNi41IDdDMTUuMTIgNyAxNCA4LjEyIDE0IDkuNXMxLjEyIDIuNSAyLjUgMi41ek05IDExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zUzEwLjY2IDUgOSA1QzcuMzQgNSA2IDYuMzQgNiA4czEuMzQgMyAzIDN6bTcuNSAzYy0xLjgzIDAtNS41LjkyLTUuNSAyLjc1VjE5aDExdi0yLjI1YzAtMS44My0zLjY3LTIuNzUtNS41LTIuNzV6TTkgMTNjLTIuMzMgMC03IDEuMTctNyAzLjVWMTloN3YtMi4yNWMwLS44NS4zMy0yLjM0IDIuMzctMy40N0MxMC41IDEzLjEgOS42NiAxMyA5IDEzeiIgLz48L2c+CjxnIGlkPSJzd2FwLWhvcml6Ij48cGF0aCBkPSJNNi45OSAxMUwzIDE1bDMuOTkgNHYtM0gxNHYtMkg2Ljk5di0zek0yMSA5bC0zLjk5LTR2M0gxMHYyaDcuMDF2M0wyMSA5eiIgLz48L2c+CjxnIGlkPSJzd2FwLXZlcnQiPjxwYXRoIGQ9Ik0xNiAxNy4wMVYxMGgtMnY3LjAxaC0zTDE1IDIxbDQtMy45OWgtM3pNOSAzTDUgNi45OWgzVjE0aDJWNi45OWgzTDkgM3oiIC8+PC9nPgo8ZyBpZD0ic3dhcC12ZXJ0aWNhbC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyek02LjUgOUwxMCA1LjUgMTMuNSA5SDExdjRIOVY5SDYuNXptMTEgNkwxNCAxOC41IDEwLjUgMTVIMTN2LTRoMnY0aDIuNXoiIC8+PC9nPgo8ZyBpZD0ic3lzdGVtLXVwZGF0ZS1hbHQiPjxwYXRoIGQ9Ik0xMiAxNi41bDQtNGgtM3YtOWgtMnY5SDhsNCA0em05LTEzaC02djEuOTloNnYxNC4wM0gzVjUuNDloNlYzLjVIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnYtMTRjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InRhYiI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDNWNWgxMHY0aDh2MTB6IiAvPjwvZz4KPGcgaWQ9InRhYi11bnNlbGVjdGVkIj48cGF0aCBkPSJNMSA5aDJWN0gxdjJ6bTAgNGgydi0ySDF2MnptMC04aDJWM2MtMS4xIDAtMiAuOS0yIDJ6bTggMTZoMnYtMkg5djJ6bS04LTRoMnYtMkgxdjJ6bTIgNHYtMkgxYzAgMS4xLjkgMiAyIDJ6TTIxIDNoLTh2NmgxMFY1YzAtMS4xLS45LTItMi0yem0wIDE0aDJ2LTJoLTJ2MnpNOSA1aDJWM0g5djJ6TTUgMjFoMnYtMkg1djJ6TTUgNWgyVjNINXYyem0xNiAxNmMxLjEgMCAyLS45IDItMmgtMnYyem0wLThoMnYtMmgtMnYyem0tOCA4aDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0idGV4dC1mb3JtYXQiPjxwYXRoIGQ9Ik01IDE3djJoMTR2LTJINXptNC41LTQuMmg1bC45IDIuMmgyLjFMMTIuNzUgNGgtMS41TDYuNSAxNWgyLjFsLjktMi4yek0xMiA1Ljk4TDEzLjg3IDExaC0zLjc0TDEyIDUuOTh6IiAvPjwvZz4KPGcgaWQ9InRoZWF0ZXJzIj48cGF0aCBkPSJNMTggM3YyaC0yVjNIOHYySDZWM0g0djE4aDJ2LTJoMnYyaDh2LTJoMnYyaDJWM2gtMnpNOCAxN0g2di0yaDJ2MnptMC00SDZ2LTJoMnYyem0wLTRINlY3aDJ2MnptMTAgOGgtMnYtMmgydjJ6bTAtNGgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2MnoiIC8+PC9nPgo8ZyBpZD0idGh1bWItZG93biI+PHBhdGggZD0iTTE1IDNINmMtLjgzIDAtMS41NC41LTEuODQgMS4yMmwtMy4wMiA3LjA1Yy0uMDkuMjMtLjE0LjQ3LS4xNC43M3YxLjkxbC4wMS4wMUwxIDE0YzAgMS4xLjkgMiAyIDJoNi4zMWwtLjk1IDQuNTctLjAzLjMyYzAgLjQxLjE3Ljc5LjQ0IDEuMDZMOS44MyAyM2w2LjU5LTYuNTljLjM2LS4zNi41OC0uODYuNTgtMS40MVY1YzAtMS4xLS45LTItMi0yem00IDB2MTJoNFYzaC00eiIgLz48L2c+CjxnIGlkPSJ0aHVtYi11cCI+PHBhdGggZD0iTTEgMjFoNFY5SDF2MTJ6bTIyLTExYzAtMS4xLS45LTItMi0yaC02LjMxbC45NS00LjU3LjAzLS4zMmMwLS40MS0uMTctLjc5LS40NC0xLjA2TDE0LjE3IDEgNy41OSA3LjU5QzcuMjIgNy45NSA3IDguNDUgNyA5djEwYzAgMS4xLjkgMiAyIDJoOWMuODMgMCAxLjU0LS41IDEuODQtMS4yMmwzLjAyLTcuMDVjLjA5LS4yMy4xNC0uNDcuMTQtLjczdi0xLjkxbC0uMDEtLjAxTDIzIDEweiIgLz48L2c+CjxnIGlkPSJ0aHVtYnMtdXAtZG93biI+PHBhdGggZD0iTTEyIDZjMC0uNTUtLjQ1LTEtMS0xSDUuODJsLjY2LTMuMTguMDItLjIzYzAtLjMxLS4xMy0uNTktLjMzLS44TDUuMzggMCAuNDQgNC45NEMuMTcgNS4yMSAwIDUuNTkgMCA2djYuNWMwIC44My42NyAxLjUgMS41IDEuNWg2Ljc1Yy42MiAwIDEuMTUtLjM4IDEuMzgtLjkxbDIuMjYtNS4yOWMuMDctLjE3LjExLS4zNi4xMS0uNTVWNnptMTAuNSA0aC02Ljc1Yy0uNjIgMC0xLjE1LjM4LTEuMzguOTFsLTIuMjYgNS4yOWMtLjA3LjE3LS4xMS4zNi0uMTEuNTVWMThjMCAuNTUuNDUgMSAxIDFoNS4xOGwtLjY2IDMuMTgtLjAyLjI0YzAgLjMxLjEzLjU5LjMzLjhsLjc5Ljc4IDQuOTQtNC45NGMuMjctLjI3LjQ0LS42NS40NC0xLjA2di02LjVjMC0uODMtLjY3LTEuNS0xLjUtMS41eiIgLz48L2c+CjxnIGlkPSJ0aW1lbGluZSI+PHBhdGggZD0iTTIzIDhjMCAxLjEtLjkgMi0yIDItLjE4IDAtLjM1LS4wMi0uNTEtLjA3bC0zLjU2IDMuNTVjLjA1LjE2LjA3LjM0LjA3LjUyIDAgMS4xLS45IDItMiAycy0yLS45LTItMmMwLS4xOC4wMi0uMzYuMDctLjUybC0yLjU1LTIuNTVjLS4xNi4wNS0uMzQuMDctLjUyLjA3cy0uMzYtLjAyLS41Mi0uMDdsLTQuNTUgNC41NmMuMDUuMTYuMDcuMzMuMDcuNTEgMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yIC45LTIgMi0yYy4xOCAwIC4zNS4wMi41MS4wN2w0LjU2LTQuNTVDOC4wMiA5LjM2IDggOS4xOCA4IDljMC0xLjEuOS0yIDItMnMyIC45IDIgMmMwIC4xOC0uMDIuMzYtLjA3LjUybDIuNTUgMi41NWMuMTYtLjA1LjM0LS4wNy41Mi0uMDdzLjM2LjAyLjUyLjA3bDMuNTUtMy41NkMxOS4wMiA4LjM1IDE5IDguMTggMTkgOGMwLTEuMS45LTIgMi0yczIgLjkgMiAyeiIgLz48L2c+CjxnIGlkPSJ0b2MiPjxwYXRoIGQ9Ik0zIDloMTRWN0gzdjJ6bTAgNGgxNHYtMkgzdjJ6bTAgNGgxNHYtMkgzdjJ6bTE2IDBoMnYtMmgtMnYyem0wLTEwdjJoMlY3aC0yem0wIDZoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJ0b2RheSI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOGgxNHYxMXpNNyAxMGg1djVIN3oiIC8+PC9nPgo8ZyBpZD0idG9sbCI+PHBhdGggZD0iTTE1IDRjLTQuNDIgMC04IDMuNTgtOCA4czMuNTggOCA4IDggOC0zLjU4IDgtOC0zLjU4LTgtOC04em0wIDE0Yy0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02IDYgMi42OSA2IDYtMi42OSA2LTYgNnpNMyAxMmMwLTIuNjEgMS42Ny00LjgzIDQtNS42NVY0LjI2QzMuNTUgNS4xNSAxIDguMjcgMSAxMnMyLjU1IDYuODUgNiA3Ljc0di0yLjA5Yy0yLjMzLS44Mi00LTMuMDQtNC01LjY1eiIgLz48L2c+CjxnIGlkPSJ0b3VjaC1hcHAiPjxwYXRoIGQ9Ik05IDExLjI0VjcuNUM5IDYuMTIgMTAuMTIgNSAxMS41IDVTMTQgNi4xMiAxNCA3LjV2My43NGMxLjIxLS44MSAyLTIuMTggMi0zLjc0QzE2IDUuMDEgMTMuOTkgMyAxMS41IDNTNyA1LjAxIDcgNy41YzAgMS41Ni43OSAyLjkzIDIgMy43NHptOS44NCA0LjYzbC00LjU0LTIuMjZjLS4xNy0uMDctLjM1LS4xMS0uNTQtLjExSDEzdi02YzAtLjgzLS42Ny0xLjUtMS41LTEuNVMxMCA2LjY3IDEwIDcuNXYxMC43NGwtMy40My0uNzJjLS4wOC0uMDEtLjE1LS4wMy0uMjQtLjAzLS4zMSAwLS41OS4xMy0uNzkuMzNsLS43OS44IDQuOTQgNC45NGMuMjcuMjcuNjUuNDQgMS4wNi40NGg2Ljc5Yy43NSAwIDEuMzMtLjU1IDEuNDQtMS4yOGwuNzUtNS4yN2MuMDEtLjA3LjAyLS4xNC4wMi0uMiAwLS42Mi0uMzgtMS4xNi0uOTEtMS4zOHoiIC8+PC9nPgo8ZyBpZD0idHJhY2stY2hhbmdlcyI+PHBhdGggZD0iTTE5LjA3IDQuOTNsLTEuNDEgMS40MUMxOS4xIDcuNzkgMjAgOS43OSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHMtOC0zLjU4LTgtOGMwLTQuMDggMy4wNS03LjQ0IDctNy45M3YyLjAyQzguMTYgNi41NyA2IDkuMDMgNiAxMmMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02YzAtMS42Ni0uNjctMy4xNi0xLjc2LTQuMjRsLTEuNDEgMS40MUMxNS41NSA5LjkgMTYgMTAuOSAxNiAxMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNGMwLTEuODYgMS4yOC0zLjQxIDMtMy44NnYyLjE0Yy0uNi4zNS0xIC45OC0xIDEuNzIgMCAxLjEuOSAyIDIgMnMyLS45IDItMmMwLS43NC0uNC0xLjM4LTEtMS43MlYyaC0xQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBjMC0yLjc2LTEuMTItNS4yNi0yLjkzLTcuMDd6IiAvPjwvZz4KPGcgaWQ9InRyYW5zbGF0ZSI+PHBhdGggZD0iTTEyLjg3IDE1LjA3bC0yLjU0LTIuNTEuMDMtLjAzYzEuNzQtMS45NCAyLjk4LTQuMTcgMy43MS02LjUzSDE3VjRoLTdWMkg4djJIMXYxLjk5aDExLjE3QzExLjUgNy45MiAxMC40NCA5Ljc1IDkgMTEuMzUgOC4wNyAxMC4zMiA3LjMgOS4xOSA2LjY5IDhoLTJjLjczIDEuNjMgMS43MyAzLjE3IDIuOTggNC41NmwtNS4wOSA1LjAyTDQgMTlsNS01IDMuMTEgMy4xMS43Ni0yLjA0ek0xOC41IDEwaC0yTDEyIDIyaDJsMS4xMi0zaDQuNzVMMjEgMjJoMmwtNC41LTEyem0tMi42MiA3bDEuNjItNC4zM0wxOS4xMiAxN2gtMy4yNHoiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctZG93biI+PHBhdGggZD0iTTE2IDE4bDIuMjktMi4yOS00Ljg4LTQuODgtNCA0TDIgNy40MSAzLjQxIDZsNiA2IDQtNCA2LjMgNi4yOUwyMiAxMnY2eiIgLz48L2c+CjxnIGlkPSJ0cmVuZGluZy1mbGF0Ij48cGF0aCBkPSJNMjIgMTJsLTQtNHYzSDN2MmgxNXYzeiIgLz48L2c+CjxnIGlkPSJ0cmVuZGluZy11cCI+PHBhdGggZD0iTTE2IDZsMi4yOSAyLjI5LTQuODggNC44OC00LTRMMiAxNi41OSAzLjQxIDE4bDYtNiA0IDQgNi4zLTYuMjlMMjIgMTJWNnoiIC8+PC9nPgo8ZyBpZD0idHVybmVkLWluIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ0dXJuZWQtaW4tbm90Ij48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiIgLz48L2c+CjxnIGlkPSJ1bmFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NSA1LjIybC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTUuNTVMMy40NiA1LjIyQzMuMTcgNS41NyAzIDYuMDEgMyA2LjVWMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNi41YzAtLjQ5LS4xNy0uOTMtLjQ1LTEuMjh6TTEyIDkuNWw1LjUgNS41SDE0djJoLTR2LTJINi41TDEyIDkuNXpNNS4xMiA1bC44Mi0xaDEybC45MyAxSDUuMTJ6IiAvPjwvZz4KPGcgaWQ9InVuZG8iPjxwYXRoIGQ9Ik0xMi41IDhjLTIuNjUgMC01LjA1Ljk5LTYuOSAyLjZMMiA3djloOWwtMy42Mi0zLjYyYzEuMzktMS4xNiAzLjE2LTEuODggNS4xMi0xLjg4IDMuNTQgMCA2LjU1IDIuMzEgNy42IDUuNWwyLjM3LS43OEMyMS4wOCAxMS4wMyAxNy4xNSA4IDEyLjUgOHoiIC8+PC9nPgo8ZyBpZD0idW5mb2xkLWxlc3MiPjxwYXRoIGQ9Ik03LjQxIDE4LjU5TDguODMgMjAgMTIgMTYuODMgMTUuMTcgMjBsMS40MS0xLjQxTDEyIDE0bC00LjU5IDQuNTl6bTkuMTgtMTMuMThMMTUuMTcgNCAxMiA3LjE3IDguODMgNCA3LjQxIDUuNDEgMTIgMTBsNC41OS00LjU5eiIgLz48L2c+CjxnIGlkPSJ1bmZvbGQtbW9yZSI+PHBhdGggZD0iTTEyIDUuODNMMTUuMTcgOWwxLjQxLTEuNDFMMTIgMyA3LjQxIDcuNTkgOC44MyA5IDEyIDUuODN6bTAgMTIuMzRMOC44MyAxNWwtMS40MSAxLjQxTDEyIDIxbDQuNTktNC41OUwxNS4xNyAxNSAxMiAxOC4xN3oiIC8+PC9nPgo8ZyBpZD0idXBkYXRlIj48cGF0aCBkPSJNMjEgMTAuMTJoLTYuNzhsMi43NC0yLjgyYy0yLjczLTIuNy03LjE1LTIuOC05Ljg4LS4xLTIuNzMgMi43MS0yLjczIDcuMDggMCA5Ljc5IDIuNzMgMi43MSA3LjE1IDIuNzEgOS44OCAwQzE4LjMyIDE1LjY1IDE5IDE0LjA4IDE5IDEyLjFoMmMwIDEuOTgtLjg4IDQuNTUtMi42NCA2LjI5LTMuNTEgMy40OC05LjIxIDMuNDgtMTIuNzIgMC0zLjUtMy40Ny0zLjUzLTkuMTEtLjAyLTEyLjU4IDMuNTEtMy40NyA5LjE0LTMuNDcgMTIuNjUgMEwyMSAzdjcuMTJ6TTEyLjUgOHY0LjI1bDMuNSAyLjA4LS43MiAxLjIxTDExIDEzVjhoMS41eiIgLz48L2c+CjxnIGlkPSJ2ZXJpZmllZC11c2VyIj48cGF0aCBkPSJNMTIgMUwzIDV2NmMwIDUuNTUgMy44NCAxMC43NCA5IDEyIDUuMTYtMS4yNiA5LTYuNDUgOS0xMlY1bC05LTR6bS0yIDE2bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6IiAvPjwvZz4KPGcgaWQ9InZpZXctYWdlbmRhIj48cGF0aCBkPSJNMjAgMTNIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xdi02YzAtLjU1LS40NS0xLTEtMXptMC0xMEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWNGMwLS41NS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9InZpZXctYXJyYXkiPjxwYXRoIGQ9Ik00IDE4aDNWNUg0djEzek0xOCA1djEzaDNWNWgtM3pNOCAxOGg5VjVIOHYxM3oiIC8+PC9nPgo8ZyBpZD0idmlldy1jYXJvdXNlbCI+PHBhdGggZD0iTTcgMTloMTBWNEg3djE1em0tNS0yaDRWNkgydjExek0xOCA2djExaDRWNmgtNHoiIC8+PC9nPgo8ZyBpZD0idmlldy1jb2x1bW4iPjxwYXRoIGQ9Ik0xMCAxOGg1VjVoLTV2MTN6bS02IDBoNVY1SDR2MTN6TTE2IDV2MTNoNVY1aC01eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWRheSI+PHBhdGggZD0iTTIgMjFoMTl2LTNIMnYzek0yMCA4SDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMVY5YzAtLjU1LS40NS0xLTEtMXpNMiAzdjNoMTlWM0gyeiIgLz48L2c+CjxnIGlkPSJ2aWV3LWhlYWRsaW5lIj48cGF0aCBkPSJNNCAxNWgxNnYtMkg0djJ6bTAgNGgxNnYtMkg0djJ6bTAtOGgxNlY5SDR2MnptMC02djJoMTZWNUg0eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWxpc3QiPjxwYXRoIGQ9Ik00IDE0aDR2LTRINHY0em0wIDVoNHYtNEg0djR6TTQgOWg0VjVINHY0em01IDVoMTJ2LTRIOXY0em0wIDVoMTJ2LTRIOXY0ek05IDV2NGgxMlY1SDl6IiAvPjwvZz4KPGcgaWQ9InZpZXctbW9kdWxlIj48cGF0aCBkPSJNNCAxMWg1VjVINHY2em0wIDdoNXYtNkg0djZ6bTYgMGg1di02aC01djZ6bTYgMGg1di02aC01djZ6bS02LTdoNVY1aC01djZ6bTYtNnY2aDVWNWgtNXoiIC8+PC9nPgo8ZyBpZD0idmlldy1xdWlsdCI+PHBhdGggZD0iTTEwIDE4aDV2LTZoLTV2NnptLTYgMGg1VjVINHYxM3ptMTIgMGg1di02aC01djZ6TTEwIDV2NmgxMVY1SDEweiIgLz48L2c+CjxnIGlkPSJ2aWV3LXN0cmVhbSI+PHBhdGggZD0iTTQgMThoMTd2LTZINHY2ek00IDV2NmgxN1Y1SDR6IiAvPjwvZz4KPGcgaWQ9InZpZXctd2VlayI+PHBhdGggZD0iTTYgNUgzYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bTE0IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXptLTcgMGgtM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xeiIgLz48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5Ij48cGF0aCBkPSJNMTIgNC41QzcgNC41IDIuNzMgNy42MSAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjVzOS4yNy0zLjExIDExLTcuNWMtMS43My00LjM5LTYtNy41LTExLTcuNXpNMTIgMTdjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLThjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiIgLz48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5LW9mZiI+PHBhdGggZD0iTTEyIDdjMi43NiAwIDUgMi4yNCA1IDUgMCAuNjUtLjEzIDEuMjYtLjM2IDEuODNsMi45MiAyLjkyYzEuNTEtMS4yNiAyLjctMi44OSAzLjQzLTQuNzUtMS43My00LjM5LTYtNy41LTExLTcuNS0xLjQgMC0yLjc0LjI1LTMuOTguN2wyLjE2IDIuMTZDMTAuNzQgNy4xMyAxMS4zNSA3IDEyIDd6TTIgNC4yN2wyLjI4IDIuMjguNDYuNDZDMy4wOCA4LjMgMS43OCAxMC4wMiAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjUgMS41NSAwIDMuMDMtLjMgNC4zOC0uODRsLjQyLjQyTDE5LjczIDIyIDIxIDIwLjczIDMuMjcgMyAyIDQuMjd6TTcuNTMgOS44bDEuNTUgMS41NWMtLjA1LjIxLS4wOC40My0uMDguNjUgMCAxLjY2IDEuMzQgMyAzIDMgLjIyIDAgLjQ0LS4wMy42NS0uMDhsMS41NSAxLjU1Yy0uNjcuMzMtMS40MS41My0yLjIuNTMtMi43NiAwLTUtMi4yNC01LTUgMC0uNzkuMi0xLjUzLjUzLTIuMnptNC4zMS0uNzhsMy4xNSAzLjE1LjAyLS4xNmMwLTEuNjYtMS4zNC0zLTMtM2wtLjE3LjAxeiIgLz48L2c+CjxnIGlkPSJ3YXJuaW5nIj48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJ3YXRjaC1sYXRlciI+PHBhdGggZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyem00LjIgMTQuMkwxMSAxM1Y3aDEuNXY1LjJsNC41IDIuNy0uOCAxLjN6IiAvPjwvZz4KPGcgaWQ9IndlZWtlbmQiPjxwYXRoIGQ9Ik0yMSAxMGMtMS4xIDAtMiAuOS0yIDJ2M0g1di0zYzAtMS4xLS45LTItMi0ycy0yIC45LTIgMnY1YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTVjMC0xLjEtLjktMi0yLTJ6bS0zLTVINmMtMS4xIDAtMiAuOS0yIDJ2Mi4xNWMxLjE2LjQxIDIgMS41MSAyIDIuODJWMTRoMTJ2LTIuMDNjMC0xLjMuODQtMi40IDItMi44MlY3YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ3b3JrIj48cGF0aCBkPSJNMjAgNmgtNFY0YzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2Mkg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS02IDBoLTRWNGg0djJ6IiAvPjwvZz4KPGcgaWQ9InlvdXR1YmUtc2VhcmNoZWQtZm9yIj48cGF0aCBkPSJNMTcuMDEgMTRoLS44bC0uMjctLjI3Yy45OC0xLjE0IDEuNTctMi42MSAxLjU3LTQuMjMgMC0zLjU5LTIuOTEtNi41LTYuNS02LjVzLTYuNSAzLTYuNSA2LjVIMmwzLjg0IDQgNC4xNi00SDYuNTFDNi41MSA3IDguNTMgNSAxMS4wMSA1czQuNSAyLjAxIDQuNSA0LjVjMCAyLjQ4LTIuMDIgNC41LTQuNSA0LjUtLjY1IDAtMS4yNi0uMTQtMS44Mi0uMzhMNy43MSAxNS4xYy45Ny41NyAyLjA5LjkgMy4zLjkgMS42MSAwIDMuMDgtLjU5IDQuMjItMS41N2wuMjcuMjd2Ljc5bDUuMDEgNC45OUwyMiAxOWwtNC45OS01eiIgLz48L2c+CjxnIGlkPSJ6b29tLWluIj48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHptMi41LTRoLTJ2Mkg5di0ySDdWOWgyVjdoMXYyaDJ2MXoiIC8+PC9nPgo8ZyBpZD0iem9vbS1vdXQiPjxwYXRoIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0ek03IDloNXYxSDd6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pY29uLWJ1dHRvbiI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CgogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIGhlaWdodDogNDBweDsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLyogQmVjYXVzZSBvZiBwb2x5bWVyLzI1NTgsIHRoaXMgc3R5bGUgaGFzIGxvd2VyIHNwZWNpZmljaXR5IHRoYW4gKiAqLwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b247CiAgICAgIH0KCiAgICAgIDpob3N0ICNpbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZC10ZXh0LCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBhdXRvOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpob3ZlcikgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uLWhvdmVyOwogICAgICB9CgogICAgICBpcm9uLWljb24gewogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxMDAlOwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8aXJvbi1pY29uIGlkPSJpY29uIiBzcmM9Iltbc3JjXV0iIGljb249IltbaWNvbl1dIiBhbHQkPSJbW2FsdF1dIj48L2lyb24taWNvbj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJydW4tY29sb3Itc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2NvbG9yLWNsYXNzPSdsaWdodC1ibHVlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncmVkJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdncmVlbiddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwdXJwbGUnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J3RlYWwnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwaW5rJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nb3JhbmdlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdicm93biddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdpbmRpZ28nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tOTAwKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbXVsdGktY2hlY2tib3giPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icnVuLWNvbG9yLXN0eWxlIj48L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dCBpZD0ibmFtZXMtcmVnZXgiIG5vLWxhYmVsLWZsb2F0IGxhYmVsPSJXcml0ZSBhIHJlZ2V4IHRvIGZpbHRlciBydW5zIiB2YWx1ZT0iW1tyZWdleF1dIiBvbi1iaW5kLXZhbHVlLWNoYW5nZWQ9Il9kZWJvdW5jZWRSZWdleENoYW5nZSI+PC9wYXBlci1pbnB1dD4KICAgIDxkaXYgaWQ9Im91dGVyLWNvbnRhaW5lciIgY2xhc3M9InNjcm9sbGJhciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbmFtZXNNYXRjaGluZ1JlZ2V4XV0iIG9uLWRvbS1jaGFuZ2U9InN5bmNocm9uaXplQ29sb3JzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYW1lLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciBjaGVja2JveC1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJjaGVja2JveCB2ZXJ0aWNhbC1hbGlnbi1jZW50ZXIiIGlkJD0iY2hlY2tib3gtW1tpdGVtXV0iIG5hbWU9IltbaXRlbV1dIiBjaGVja2VkJD0iW1tfaXNDaGVja2VkKGl0ZW0sIHNlbGVjdGlvblN0YXRlLiopXV0iIG9uLWNoYW5nZT0iX2NoZWNrYm94Q2hhbmdlIj48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciBpc29sYXRvci1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQiIGNsYXNzPSJpc29sYXRvciB2ZXJ0aWNhbC1hbGlnbi1jZW50ZXIiIG9uLXRhcD0iX2lzb2xhdGVOYW1lIiBuYW1lPSJbW2l0ZW1dXSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1sYWJlbC1jb250YWluZXIiPgogICAgICAgICAgICA8c3Bhbj5bW2l0ZW1dXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAjb3V0ZXItY29udGFpbmVyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5uYW1lLXJvdyB7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyAvKiBtYWtlcyB3cmFwcGluZyBvZiBoeXBlcnBhcmFtIHN0cmluZ3MgYmV0dGVyICovCiAgICAgIH0KICAgICAgLmljb24tY29udGFpbmVyIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmlzb2xhdG9yIHsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvci1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNnB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgfQogICAgICAuY2hlY2tib3gtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAuaXRlbS1sYWJlbC1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICB3aWR0aDogMHB4OyAvKiBoYWNrIHRvIGdldCB0aGUgZmxleC1ncm93IHRvIHdvcmsgcHJvcGVybHkgKi8KICAgICAgfQogICAgICAudG9vbHRpcC12YWx1ZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tY2VudGVyIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tdG9wIHsKICAgICAgICBhbGlnbi1zZWxmOiBzdGFydDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtd2JyLXN0cmluZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19wYXJ0c11dIiBhcz0icGFydCI+W1twYXJ0XV08d2JyPjwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcnVucy1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyB3aXRoLWJhY2tkcm9wIGlkPSJkYXRhLWxvY2F0aW9uLWRpYWxvZyI+CiAgICAgIDxoMj5EYXRhIExvY2F0aW9uPC9oMj4KICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbZGF0YUxvY2F0aW9uXV0iIC8+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxkaXYgaWQ9InRvcC10ZXh0Ij4KICAgICAgPGgzIGlkPSJ0b29sdGlwLWhlbHAiIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+UnVuczwvaDM+CiAgICA8L2Rpdj4KICAgIDx0Zi1tdWx0aS1jaGVja2JveCBpZD0ibXVsdGlDaGVja2JveCIgbmFtZXM9IltbcnVuc11dIiBzZWxlY3Rpb24tc3RhdGU9Int7cnVuU2VsZWN0aW9uU3RhdGV9fSIgb3V0LXNlbGVjdGVkPSJ7e3NlbGVjdGVkUnVuc319IiByZWdleD0ie3tyZWdleElucHV0fX0iIGNvbG9yaW5nPSJbW2NvbG9yaW5nXV0iPjwvdGYtbXVsdGktY2hlY2tib3g+CiAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgaWQ9InRvZ2dsZS1hbGwiIG9uLXRhcD0iX3RvZ2dsZUFsbCI+CiAgICAgIFRvZ2dsZSBBbGwgUnVucwogICAgPC9wYXBlci1idXR0b24+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZGF0YUxvY2F0aW9uXV0iPgogICAgICA8ZGl2IGlkPSJkYXRhLWxvY2F0aW9uIj4KICAgICAgICA8dGYtd2JyLXN0cmluZyB2YWx1ZT0iW1tfY2xpcHBlZERhdGFMb2NhdGlvbl1dIiAvPjx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvdWxkU2hvd0V4cGFuZERhdGFMb2NhdGlvbkJ1dHRvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKV1dIj48YSBocmVmPSIiIG9uLWNsaWNrPSJfb3BlbkRhdGFMb2NhdGlvbkRpYWxvZyI+4oCmPC9hPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgICB9CiAgICAgICN0b3AtdGV4dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICB9CiAgICAgIHRmLW11bHRpLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAjdG9vbHRpcC1oZWxwIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAjZGF0YS1sb2NhdGlvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiA1cHggMCAwIDA7CiAgICAgICAgbWF4LXdpZHRoOiAyODhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgLyogU1RZTEVTIEZPUiBUSEUgU1BJTk5FUiAqLwogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAvKgogICAgICAgKiBDb25zdGFudHM6CiAgICAgICAqICAgICAgQVJDU0laRSAgICAgPSAyNzAgZGVncmVlcyAoYW1vdW50IG9mIGNpcmNsZSB0aGUgYXJjIHRha2VzIHVwKQogICAgICAgKiAgICAgIEFSQ1RJTUUgICAgID0gMTMzM21zICh0aW1lIGl0IHRha2VzIHRvIGV4cGFuZCBhbmQgY29udHJhY3QgYXJjKQogICAgICAgKiAgICAgIEFSQ1NUQVJUUk9UID0gMjE2IGRlZ3JlZXMgKGhvdyBtdWNoIHRoZSBzdGFydCBsb2NhdGlvbiBvZiB0aGUgYXJjCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgcm90YXRlIGVhY2ggdGltZSwgMjE2IGdpdmVzIHVzIGEKICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgcG9pbnRlZCBzdGFyIHNoYXBlIChpdCdzIDM2MC81ICogMykuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSA3IHBvaW50ZWQgc3Rhciwgd2UgbWlnaHQgZG8KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MC83ICogMyA9IDE1NC4yODYpCiAgICAgICAqICAgICAgU0hSSU5LX1RJTUUgPSA0MDBtcwogICAgICAgKi8KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKCiAgICAgICAgLyogMzYwICogQVJDVElNRSAvIChBUkNTVEFSVFJPVCArICgzNjAtQVJDU0laRSkpICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbjogMTU2OG1zOwoKICAgICAgICAvKiBBUkNUSU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWV4cGFuZC1jb250cmFjdC1kdXJhdGlvbjogMTMzM21zOwoKICAgICAgICAvKiA0ICogQVJDVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uOiA1MzMybXM7CgogICAgICAgIC8qIFNIUklOS19USU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uOiA0MDBtczsKICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKCiAgICAgICAgLyogVGhlIHNwaW5uZXIgZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudHMgdGhhdCB3b3VsZCBoYXZlIHRvIGJlCiAgICAgICAgICogZmxpcHBlZCBpZiB0aGUgZGlyZWN0aW9uIGNoYW5nZXMuIEFsd2F5cyB1c2UgbHRyIHNvIHRoYXQgdGhlCiAgICAgICAgICogc3R5bGUgd29ya3Mgb3V0IGNvcnJlY3RseSBpbiBib3RoIGNhc2VzLiAqLwogICAgICAgIGRpcmVjdGlvbjogbHRyOwogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5hY3RpdmUgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjb250YWluZXItcm90YXRlIHsKICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIH0KICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTEgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTEtY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTUwMCkpOwogICAgICB9CgogICAgICAubGF5ZXItMiB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItMi1jb2xvciwgdmFyKC0tZ29vZ2xlLXJlZC01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTMgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTMtY29sb3IsIHZhcigtLWdvb2dsZS15ZWxsb3ctNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci00IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci00LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJTVBPUlRBTlQgTk9URSBBQk9VVCBDU1MgQU5JTUFUSU9OIFBST1BFUlRJRVMgKGtlYW51bGVlKToKICAgICAgICoKICAgICAgICogaU9TIFNhZmFyaSAodGVzdGVkIG9uIGlPUyA4LjEpIGRvZXMgbm90IGhhbmRsZSBhbmltYXRpb24tZGVsYXkgdmVyeSB3ZWxsIC0gaXQgZG9lc24ndAogICAgICAgKiBndWFyYW50ZWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RhcnQgX2V4YWN0bHlfIGFmdGVyIHRoYXQgdmFsdWUuIFNvIHdlIGF2b2lkIHVzaW5nCiAgICAgICAqIGFuaW1hdGlvbi1kZWxheSBhbmQgaW5zdGVhZCBzZXQgY3VzdG9tIGtleWZyYW1lcyBmb3IgZWFjaCBjb2xvciAoYXMgbGF5ZXItMnVuZGFudCBhcyBpdAogICAgICAgKiBzZWVtcykuCiAgICAgICAqLwogICAgICAuYWN0aXZlIC5zcGlubmVyLWxheWVyIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uKTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0xIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTEtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMS1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0yIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMi1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0zIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMy1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci00IHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTQtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItNC1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZykgfSAvKiAwLjUgKiBBUkNTSVpFICovCiAgICAgICAgMjUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovCiAgICAgICAgMzcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDU0MGRlZykgfSAvKiAyICAgKiBBUkNTSVpFICovCiAgICAgICAgNjIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovCiAgICAgICAgNzUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDk0NWRlZykgfSAvKiAzLjUgKiBBUkNTSVpFICovCiAgICAgICAgdG8gICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqLwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqLwogICAgICAgIDI1JSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSB9IC8qIDEgICAqIEFSQ1NJWkUgKi8KICAgICAgICAzNy41JSB7IHRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqLwogICAgICAgIDYyLjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKSB9IC8qIDIuNSAqIEFSQ1NJWkUgKi8KICAgICAgICA3NSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqLwogICAgICAgIHRvICAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZykgfSAvKiA0ICAgKiBBUkNTSVpFICovCiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0xLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDg5JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA4OSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDEgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMi1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAxNSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTMtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzYlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci00LWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDY1JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA2NSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhdGNoIHRoZSBnYXAgdGhhdCBhcHBlYXIgYmV0d2VlbiB0aGUgdHdvIGFkamFjZW50IGRpdi5jaXJjbGUtY2xpcHBlciB3aGlsZSB0aGUKICAgICAgICogc3Bpbm5lciBpcyByb3RhdGluZyAoYXBwZWFycyBvbiBDaHJvbWUgNTAsIFNhZmFyaSA5LjEuMSwgYW5kIEVkZ2UpLgogICAgICAgKi8KICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyIHsKICAgICAgICBsZWZ0OiA0NSU7CiAgICAgICAgd2lkdGg6IDEwJTsKICAgICAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsKICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyLAogICAgICAuY2lyY2xlLWNsaXBwZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm9yZGVyLXdpZHRoOiB2YXIoLS1wYXBlci1zcGlubmVyLXN0cm9rZS13aWR0aCwgM3B4KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlcjo6YWZ0ZXIgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMjAwJTsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5sZWZ0OjphZnRlciB7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIGxlZnQ6IC0xMDAlOwogICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLmdhcC1wYXRjaDo6YWZ0ZXIsCiAgICAgIC5hY3RpdmUgLmNpcmNsZS1jbGlwcGVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb24pOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIubGVmdDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGxlZnQtc3BpbjsKICAgICAgICBhbmltYXRpb24tbmFtZTogbGVmdC1zcGluOwogICAgICB9CgogICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsZWZ0LXNwaW4gewogICAgICAgIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB9CiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxlZnQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyByaWdodC1zcGluIHsKICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICAgIDUwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcmlnaHQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5jb29sZG93biB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZSwgZmFkZS1vdXQgdmFyKC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbikgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlLCBmYWRlLW91dCB2YXIoLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uKSBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItbGl0ZSI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItc3Bpbm5lci1zdHlsZXMiPjwvc3R5bGU+CgogICAgPGRpdiBpZD0ic3Bpbm5lckNvbnRhaW5lciIgY2xhc3MtbmFtZT0iW1tfX2NvbXB1dGVDb250YWluZXJDbGFzc2VzKGFjdGl2ZSwgX19jb29saW5nRG93bildXSIgb24tYW5pbWF0aW9uZW5kPSJfX3Jlc2V0IiBvbi13ZWJraXQtYW5pbWF0aW9uLWVuZD0iX19yZXNldCI+CiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIGxlZnQiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIHJpZ2h0Ij48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxzdHlsZT4KLnBsb3R0YWJsZS1jb2xvcnMtMCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzUyNzljNzsgLyogSU5ESUdPICovCn0KCi5wbG90dGFibGUtY29sb3JzLTEgewogIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTMgewogIGJhY2tncm91bmQtY29sb3I6ICNmYWQ0MTk7IC8qIEJSSUdIVF9TVU4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy01IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy02IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGIyZTY1OyAvKiBDRVJJU0VfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTcgewogIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA2Y2NjYzsgLyogUk9CSU5TX0VHR19CTFVFICovCn0KCi8qKgogKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuCiAqLwoucGxvdHRhYmxlIHsKICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovCiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAvKioKICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTCiAgICogKGlubGluZSBvciB0aHJvdWdoIGEgc3R5bGVzaGVldCksIG9yIHVzaW5nIHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlCiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS4KICAgKgogICAqIFBvc3QgMy4wIHRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIGEgbm9ybWFsIGRpdiBhbmQgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgZGltZW5zaW9ucyBpcwogICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgIjEwMCUtYnktZGVmYXVsdCIgYmVoYXZpb3IsIHdlIGFwcGx5IHdpZHRoL2hlaWdodCAxMDAlLgogICAqLwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLgogKi8KLnBsb3R0YWJsZSAuY29tcG9uZW50IHsKICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovCiAgcG9zaXRpb246IGFic29sdXRlOwp9CgoucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lciwKLnBsb3R0YWJsZSAuY29udGVudCwKLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzCiAqLwoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIHsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICAvKioKICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuCiAgICovCiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7Cn0KCi5wbG90dGFibGUgdGV4dCB7CiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKfQoKLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuYmFyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQgewogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLm9mZi1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLXBsb3QgLm9mZi1iYXItbGFiZWwgewogIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqLwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgoucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsZXR0ZXItc3BhY2luZzogMXB4OwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUuYmFzZWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUgewogIGZpbGw6IHdoaXRlOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHN0cm9rZTogI0NDQzsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUgewogIHN0cm9rZTogIzk5OTsKfQoKLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUgewogIHN0cm9rZTogIzNDM0MzQzsgLyogaGFja2hhY2s6IGdyaWRsaW5lcyBzaG91bGQgYmUgc29saWQ7IHNlZSAjODIwICovCiAgb3BhY2l0eTogMC4yNTsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEgewogIGZpbGw6IGJsYWNrOwogIGZpbGwtb3BhY2l0eTogMC4wMzsKICBzdHJva2U6ICNDQ0M7Cn0KLyogRHJhZ0JveExheWVyICovCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIgewogIGN1cnNvcjogZXctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdGwgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRyIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1ibCB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYnIgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHsKICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovCiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgY3Vyc29yOiBncmFiOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUgewogIGN1cnNvcjogLW1vei1ncmFiYmluZzsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgY3Vyc29yOiBncmFiYmluZzsKfQovKiAvRHJhZ0JveExheWVyICovCgoucGxvdHRhYmxlIC5ndWlkZS1saW5lLWxheWVyIGxpbmUuZ3VpZGUtbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLmhvcml6b250YWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3ggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC53YXRlcmZhbGwtcGxvdCBsaW5lLmNvbm5lY3RvciB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUgewogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KPC9zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwbG90dGFibGUtc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KLnBsb3R0YWJsZS1jb2xvcnMtMCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzUyNzljNzsgLyogSU5ESUdPICovCn0KCi5wbG90dGFibGUtY29sb3JzLTEgewogIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTMgewogIGJhY2tncm91bmQtY29sb3I6ICNmYWQ0MTk7IC8qIEJSSUdIVF9TVU4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy01IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy02IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGIyZTY1OyAvKiBDRVJJU0VfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTcgewogIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA2Y2NjYzsgLyogUk9CSU5TX0VHR19CTFVFICovCn0KCi8qKgogKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuCiAqLwoucGxvdHRhYmxlIHsKICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovCiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAvKioKICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTCiAgICogKGlubGluZSBvciB0aHJvdWdoIGEgc3R5bGVzaGVldCksIG9yIHVzaW5nIHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlCiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS4KICAgKgogICAqIFBvc3QgMy4wIHRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIGEgbm9ybWFsIGRpdiBhbmQgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgZGltZW5zaW9ucyBpcwogICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgIjEwMCUtYnktZGVmYXVsdCIgYmVoYXZpb3IsIHdlIGFwcGx5IHdpZHRoL2hlaWdodCAxMDAlLgogICAqLwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLgogKi8KLnBsb3R0YWJsZSAuY29tcG9uZW50IHsKICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovCiAgcG9zaXRpb246IGFic29sdXRlOwp9CgoucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lciwKLnBsb3R0YWJsZSAuY29udGVudCwKLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzCiAqLwoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIHsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICAvKioKICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuCiAgICovCiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7Cn0KCi5wbG90dGFibGUgdGV4dCB7CiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKfQoKLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuYmFyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQgewogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLm9mZi1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLXBsb3QgLm9mZi1iYXItbGFiZWwgewogIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqLwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgoucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsZXR0ZXItc3BhY2luZzogMXB4OwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUuYmFzZWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUgewogIGZpbGw6IHdoaXRlOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHN0cm9rZTogI0NDQzsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUgewogIHN0cm9rZTogIzk5OTsKfQoKLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUgewogIHN0cm9rZTogIzNDM0MzQzsgLyogaGFja2hhY2s6IGdyaWRsaW5lcyBzaG91bGQgYmUgc29saWQ7IHNlZSAjODIwICovCiAgb3BhY2l0eTogMC4yNTsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEgewogIGZpbGw6IGJsYWNrOwogIGZpbGwtb3BhY2l0eTogMC4wMzsKICBzdHJva2U6ICNDQ0M7Cn0KLyogRHJhZ0JveExheWVyICovCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIgewogIGN1cnNvcjogZXctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdGwgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRyIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1ibCB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYnIgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHsKICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovCiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgY3Vyc29yOiBncmFiOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUgewogIGN1cnNvcjogLW1vei1ncmFiYmluZzsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgY3Vyc29yOiBncmFiYmluZzsKfQovKiAvRHJhZ0JveExheWVyICovCgoucGxvdHRhYmxlIC5ndWlkZS1saW5lLWxheWVyIGxpbmUuZ3VpZGUtbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLmhvcml6b250YWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3ggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC53YXRlcmZhbGwtcGxvdCBsaW5lLmNvbm5lY3RvciB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUgewogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotY2hhcnQtdG9vbHRpcCI+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotcGFuLXpvb20tc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmhlbHAgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAxczsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDFzOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmYWRlLW91dDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDMwLCAzMCwgMzAsIDAuNik7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLmhlbHAgPiBzcGFuIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIH0KCiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1saW5lLWNoYXJ0MiI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0iY2hhcnRkaXYiPjwvZGl2PgogICAgPHZ6LWNoYXJ0LXRvb2x0aXAgaWQ9InRvb2x0aXAiIHBvc2l0aW9uPSJbW3Rvb2x0aXBQb3NpdGlvbl1dIiBjb250ZW50LWNvbXBvbmVudC1uYW1lPSJ2ei1saW5lLWNoYXJ0LXRvb2x0aXAiPjwvdnotY2hhcnQtdG9vbHRpcD4KICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idnotcGFuLXpvb20tc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICAgIGRpdiB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IC5tYWluIHsKICAgICAgICBjdXJzb3I6IGNyb3NzaGFpcjsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhbmtleSkgI2NoYXJ0ZGl2IDpub3QoLmRyYWctem9vbWluZykgLm1haW4gewogICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogICAgICAgIGN1cnNvcjogZ3JhYjsKICAgICAgfQoKICAgICAgOmhvc3QoLm1vdXNlZG93bikgI2NoYXJ0ZGl2IC5wYW5uaW5nIC5tYWluIHsKICAgICAgICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgICAgICAgY3Vyc29yOiBncmFiYmluZzsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IGxpbmUuZ3VpZGUtbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5OwogICAgICAgIHN0cm9rZS13aWR0aDogMS41cHg7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2OmhvdmVyIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idnotbGluZS1jaGFydC10b29sdGlwIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgPHRhYmxlPgogICAgICAgIDx0aGVhZD48L3RoZWFkPgogICAgICAgIDx0Ym9keT48L3Rib2R5PgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIHRoZWFkIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIHRib2R5IHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIxcHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgdGQgewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICB9CgogICAgICAuc3dhdGNoIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICB9CgogICAgICAuY2xvc2VzdCAuc3dhdGNoIHsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggI2ZmZjsKICAgICAgfQoKICAgICAgdGggewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5kaXN0YW50IHRkOm5vdCguc3dhdGNoKSB7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjaGFydC1hbmQtc3Bpbm5lci1jb250YWluZXIiPgogICAgICA8dnotbGluZS1jaGFydDIgaWQ9ImNoYXJ0IiBkYXRhLWxvYWRpbmckPSJbW2RhdGFMb2FkaW5nXV0iIGNvbG9yLXNjYWxlPSJbW2NvbG9yU2NhbGVdXSIgZGVmYXVsdC14LXJhbmdlPSJbW2RlZmF1bHRYUmFuZ2VdXSIgZGVmYXVsdC15LXJhbmdlPSJbW2RlZmF1bHRZUmFuZ2VdXSIgZmlsbC1hcmVhPSJbW2ZpbGxBcmVhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBvbi1jaGFydC1hdHRhY2hlZD0iX29uQ2hhcnRBdHRhY2hlZCIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiBzeW1ib2wtZnVuY3Rpb249Iltbc3ltYm9sRnVuY3Rpb25dXSIgdG9vbHRpcC1jb2x1bW5zPSJbW3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1t4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW3lWYWx1ZUFjY2Vzc29yXV0iPjwvdnotbGluZS1jaGFydDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkYXRhTG9hZGluZ11dIj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdChbX21heWJlLXJlbmRlcmVkLWluLWJhZC1zdGF0ZV0pIHZ6LWxpbmUtY2hhcnQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2NoYXJ0LWFuZC1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjbG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDJbZGF0YS1sb2FkaW5nXSB7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSI+CgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcy1zY3JvbGxlZDpub3QoOmZpcnN0LWNoaWxkKSk6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRpdmlkZXItY29sb3IpOwogICAgICB9CgogICAgICA6aG9zdCguY2FuLXNjcm9sbDpub3QoLnNjcm9sbGVkLXRvLWJvdHRvbSk6bm90KDpsYXN0LWNoaWxkKSk6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvcik7CiAgICAgIH0KCiAgICAgIC5zY3JvbGxhYmxlIHsKICAgICAgICBwYWRkaW5nOiAwIDI0cHg7CgogICAgICAgIEBhcHBseSAtLWxheW91dC1zY3JvbGw7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXNjcm9sbGFibGU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ic2Nyb2xsYWJsZSIgY2xhc3M9InNjcm9sbGFibGUiIG9uLXNjcm9sbD0idXBkYXRlU2Nyb2xsU3RhdGUiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLW1hcmtkb3duLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9Im1hcmtkb3duIiBpbm5lci1oLXQtbS1sPSJbW2h0bWxdXSI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgICAqIFJlZHVjZSB0b3Btb3N0IGFuZCBib3R0b21tb3N0IG1hcmdpbnMgZnJvbSAxNnB4IHRvIDAuM2VtIChyZW5kZXJzCiAgICAgICAqIGF0IGFib3V0IDQuOHB4KSB0byBrZWVwIHRoZSBsYXlvdXQgY29tcGFjdC4gVGhpcyBpbXByb3ZlcyB0aGUKICAgICAgICogYXBwZWFyYW5jZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGxpbmUgb2YgdGV4dDsgc3RhbmRhcmQgTWFya2Rvd24KICAgICAgICogcmVuZGVyZXJzIHdpbGwgc3RpbGwgaW5jbHVkZSBhIGA8cD5gIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEJ5IHRhcmdldGluZyBvbmx5IHRoZSB0b3AtbGV2ZWwsIGV4dHJlbWFsIGVsZW1lbnRzLCB3ZSBwcmVzZXJ2ZSBhbnkKICAgICAgICogYWN0dWFsIHBhcmFncmFwaCBicmVha3MgYW5kIG9ubHkgY2hhbmdlIHRoZSBwYWRkaW5nIGFnYWluc3QgdGhlCiAgICAgICAqIGNvbXBvbmVudCBlZGdlcy4KICAgICAgICovCiAgICAgICNtYXJrZG93biA+IHA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDAuM2VtOwogICAgICB9CiAgICAgICNtYXJrZG93biA+IHA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC4zZW07CiAgICAgIH0KCiAgICAgIC8qIFBsZWFzYW50IHN0eWxlcyBmb3IgTWFya2Rvd24gdGFibGVzLiAqLwogICAgICAjbWFya2Rvd24gdGFibGUgewogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRoIHsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0aCwKICAgICAgI21hcmtkb3duIHRhYmxlIHRkIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTNweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGZlMmU1OwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0ciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2M2Y2JkMTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIGZpZ2NhcHRpb24gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAvKiogSG9yaXpvbnRhbCBsaW5lIG9mIGxhYmVscy4gKi8KICAgICAgLmhlYWRpbmctcm93IHsKICAgICAgICBtYXJnaW4tdG9wOiAtNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC8qKiBQaWVjZSBvZiB0ZXh0IGluIHRoZSBmaWd1cmUgY2FwdGlvbi4gKi8KICAgICAgLmhlYWRpbmctbGFiZWwgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQoKICAgICAgLyoqIE1ha2VzIGxhYmVsIHNob3cgb24gdGhlIHJpZ2h0LiAqLwogICAgICAuaGVhZGluZy1yaWdodCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZmlnY2FwdGlvbiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19uYW1lTGFiZWxdXSI+CiAgICAgICAgICAgIDxkaXYgaXRlbXByb3A9Im5hbWUiIGNsYXNzPSJoZWFkaW5nLWxhYmVsIG5hbWUiPgogICAgICAgICAgICAgIFtbX25hbWVMYWJlbF1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tydW5dXSI+CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgPHNwYW4gaXRlbXByb3A9InJ1biIgaWQ9ImhlYWRpbmctcnVuIiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0IHJ1biI+W1tydW5dXTwvc3Bhbj4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0xhYmVsXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgICB0YWc6IDxzcGFuIGl0ZW1wcm9wPSJ0YWciPltbX3RhZ0xhYmVsXV08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZmlnY2FwdGlvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Rlc2NyaXB0aW9uXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvIiBvbi10YXA9Il90b2dnbGVEZXNjcmlwdGlvbkRpYWxvZyIgdGl0bGU9IlNob3cgc3VtbWFyeSBkZXNjcmlwdGlvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZyBpZD0iZGVzY3JpcHRpb25EaWFsb2ciIG5vLW92ZXJsYXAgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgIDxwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbZGVzY3JpcHRpb25dXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY29udGVudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgcGFkZGluZzogMXB4IDRweCAycHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICBwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSB7CiAgICAgICAgbWF4LXdpZHRoOiA2NDBweDsKICAgICAgfQogICAgICAjaGVhZGluZy1ydW4gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRmLWNhcmQtaGVhZGluZy1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBjb2xvcjogdmFyKC0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kb3dubG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InJ1biB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfcnVufX0iPgogICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3J1bnNdXSI+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ydW5dXSI+CiAgICAgIDxhIGRvd25sb2FkPSJbW19jc3ZOYW1lKHRhZywgX3J1bildXSIgaHJlZj0iW1tfY3N2VXJsKHRhZywgX3J1biwgdXJsRm4pXV0iPkNTVjwvYT48YSBkb3dubG9hZD0iW1tfanNvbk5hbWUodGFnLCBfcnVuKV1dIiBocmVmPSJbW19qc29uVXJsKHRhZywgX3J1biwgdXJsRm4pXV0iPkpTT048L2E+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgfQogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgYSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMCAwLjJlbTsKICAgICAgfQogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgZm9udC1zaXplOiAyMnB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNjYWxhci1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIGNvbG9yLXNjYWxlPSJbW19nZXRDb2xvclNjYWxlKGNvbG9yU2NhbGUpXV0iIGRhdGEtc2VyaWVzPSJbW19nZXREYXRhU2VyaWVzKGRhdGFUb0xvYWQuKildXSIgZGF0YS10by1sb2FkPSJbW2RhdGFUb0xvYWRdXSIgZ2V0LWRhdGEtbG9hZC1uYW1lPSJbW19nZXREYXRhTG9hZE5hbWVdXSIgZ2V0LWRhdGEtbG9hZC11cmw9IltbZ2V0RGF0YUxvYWRVcmxdXSIgcmVxdWVzdC1kYXRhPSJbW3JlcXVlc3REYXRhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2xvYWREYXRhQ2FsbGJhY2tdXSIgbG9hZC1rZXk9IltbdGFnXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iIHRhZy1tZXRhZGF0YT0iW1t0YWdNZXRhZGF0YV1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249ImF1dG8iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW3hUeXBlXV0iPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgaWNvbj0ibGluZS13ZWlnaHQiIG9uLXRhcD0iX3RvZ2dsZUxvZ1NjYWxlIiB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJGaXQgZG9tYWluIHRvIGRhdGEiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8cGFwZXItbWVudS1idXR0b24gb24tcGFwZXItZHJvcGRvd24tb3Blbj0iX3VwZGF0ZURvd25sb2FkTGluayI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIiIHNsb3Q9ImRyb3Bkb3duLXRyaWdnZXIiIGljb249ImZpbGUtZG93bmxvYWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtPgogICAgICAgICAgICAgIDxhIGlkPSJzdmdMaW5rIiBkb3dubG9hZD0iW1t0YWddXS5zdmciPgogICAgICAgICAgICAgICAgRG93bmxvYWQgQ3VycmVudCBDaGFydCBhcyBTVkcKICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLW1lbnUtYnV0dG9uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8dGYtZG93bmxvYWRlciBydW5zPSJbW19ydW5zRnJvbURhdGEoZGF0YVRvTG9hZCldXSIgdGFnPSJbW3RhZ11dIiB1cmwtZm49IltbX2Rvd25sb2FkVXJsRm5dXSI+PC90Zi1kb3dubG9hZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXJnaW46IDVweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgIH0KCiAgICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICB9CgogICAgICAjYnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyBhIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1tZW51LWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQogICAgICBwYXBlci1pdGVtIGEgewogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItcHJvZ3Jlc3MiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pLCBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciwKICAgICAgLyogdGhlIHN0cmlwZSBmb3IgdGhlIGluZGV0ZXJtaW5hdGUgYW5pbWF0aW9uKi8KICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBoZWlnaHQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWhlaWdodCwgNHB4KTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgI3NlY29uZGFyeVByb2dyZXNzLAogICAgICAuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciwKICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXItY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTMwMCkpOwogICAgICB9CgogICAgICA6aG9zdCgudHJhbnNpdGluZykgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgOmhvc3QoLnRyYW5zaXRpbmcpICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTsKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm07CgogICAgICAgIC8qIER1cmF0aW9uICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWR1cmF0aW9uLCAwLjA4cyk7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMC4wOHMpOwoKICAgICAgICAvKiBUaW1pbmcgZnVuY3Rpb24gKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiwgZWFzZSk7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uLCBlYXNlKTsKCiAgICAgICAgLyogRGVsYXkgKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZGVsYXksIDBzKTsKICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWRlbGF5LCAwcyk7CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCk7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tMTAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNwcmltYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktNTAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS0zMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZGlzYWJsZWRdKSkgI3ByaW1hcnlQcm9ncmVzcy5pbmRldGVybWluYXRlIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGluZGV0ZXJtaW5hdGUtYmFyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLWJhciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtkaXNhYmxlZF0pKSAjcHJpbWFyeVByb2dyZXNzLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKCiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb246IGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtYmFyIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgICAgNzUlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguMjgsLjYyLC4zNywuOTEpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMCkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgIH0KICAgICAgICAzMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjQyLDAsLjYsLjgpOwogICAgICAgIH0KICAgICAgICA5MCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtYmFyIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgICA3NSUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjI4LC42MiwuMzcsLjkxKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgwKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICB9CiAgICAgICAgMzAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjQyLDAsLjYsLjgpOwogICAgICAgIH0KICAgICAgICA5MCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0icHJvZ3Jlc3NDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJzZWNvbmRhcnlQcm9ncmVzcyIgaGlkZGVuJD0iW1tfaGlkZVNlY29uZGFyeVByb2dyZXNzKHNlY29uZGFyeVJhdGlvKV1dIj48L2Rpdj4KICAgICAgPGRpdiBpZD0icHJpbWFyeVByb2dyZXNzIj48L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1zbGlkZXIiPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtMzAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1hY3RpdmUtY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQ6IHZhcigtLXBhcGVyLXNsaWRlci1oZWlnaHQsIDJweCk7CiAgICAgIH0KCiAgICAgIC8qIGZvY3VzIHNob3dzIHRoZSByaXBwbGUgKi8KICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5PVEUoa2VhbnVsZWUpOiBUaG91Z2ggOmhvc3QtY29udGV4dCBpcyBub3QgdW5pdmVyc2FsbHkgc3VwcG9ydGVkLCBzb21lIHBhZ2VzCiAgICAgICAqIHN0aWxsIHJlbHkgb24gcGFwZXItc2xpZGVyIGJlaW5nIGZsaXBwZWQgd2hlbiBkaXI9InJ0bCIgaXMgc2V0IG9uIGJvZHkuIEZvciBmdWxsCiAgICAgICAqIGNvbXBhdGFiaWxpdHksIGRpcj0icnRsIiBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0IG9uIHBhcGVyLXNsaWRlci4KICAgICAgICovCiAgICAgIDpkaXIocnRsKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOT1RFKGtlYW51bGVlKTogVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBydWxlIGFib3ZlIGJlY2F1c2UgOmhvc3QtY29udGV4dCBtYXkKICAgICAgICogbm90IGJlIHJlY29nbml6ZWQuCiAgICAgICAqLwogICAgICA6aG9zdChbZGlyPSJydGwiXSkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTk9URShrZWFudWxlZSk6IE5lZWRlZCB0byBvdmVycmlkZSB0aGUgOmhvc3QtY29udGV4dCBydWxlICh3aGVyZSBzdXBwb3J0ZWQpCiAgICAgICAqIHRvIHN1cHBvcnQgTFRSIHNsaWRlcnMgaW4gUlRMIHBhZ2VzLgogICAgICAgKi8KICAgICAgOmhvc3QoW2Rpcj0ibHRyIl0pICNzbGlkZXJDb250YWluZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICAgIH0KCiAgICAgICNzbGlkZXJDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKDE1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICAgIG1hcmdpbi1yaWdodDogY2FsYygxNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgfQoKICAgICAgI3NsaWRlckNvbnRhaW5lcjpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogMDsKICAgICAgfQoKICAgICAgI3NsaWRlckNvbnRhaW5lci5lZGl0YWJsZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTJweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICB9CgogICAgICAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAucmluZyA+IC5iYXItY29udGFpbmVyIHsKICAgICAgICBsZWZ0OiBjYWxjKDVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE4cyBlYXNlOwogICAgICB9CgogICAgICAucmluZy5leHBhbmQuZHJhZ2dpbmcgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnJpbmcuZXhwYW5kOm5vdCgucGluKSA+IC5iYXItY29udGFpbmVyIHsKICAgICAgICBsZWZ0OiBjYWxjKDhweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgIH0KCiAgICAgICNzbGlkZXJCYXIgewogICAgICAgIHBhZGRpbmc6IDE1cHggMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItYmFyLWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXItY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1jb250YWluZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbWFya2VycyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogY2FsYygxNHB4ICsgdmFyKC0tcGFwZXItc2xpZGVyLWhlaWdodCwycHgpLzIpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAtMXB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbWFya2VyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQogICAgICAuc2xpZGVyLW1hcmtlcnM6OmFmdGVyLAogICAgICAuc2xpZGVyLW1hcmtlcjo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4OwogICAgICAgIHdpZHRoOiAycHg7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKC0xNXB4IC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgICB3aWR0aDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgICAgfQoKICAgICAgLnRyYW5zaXRpbmcgPiAuc2xpZGVyLWtub2IgewogICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4wOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2IuZHJhZ2dpbmcgewogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIC5zbmFwcyA+IC5zbGlkZXIta25vYi5kcmFnZ2luZyB7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4wOHMgZWFzZTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4wOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBtYXJnaW46IDEwcHg7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMjBweCk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CgogICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybSwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyOwogICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICB9CgogICAgICAuZXhwYW5kOm5vdCgucGluKSA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuNSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgICB9CgogICAgICAucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItcGluLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgfQoKICAgICAgLnBpbiA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICBtYXJnaW4tbGVmdDogLTEzcHg7CiAgICAgICAgd2lkdGg6IDI2cHg7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJSA1MCUgNTAlIDA7CgogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlLAogICAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAuMThzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuMThzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlOwogICAgICB9CgogICAgICAucGluLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgfQoKICAgICAgLnBpbi5leHBhbmQgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDEpIHRyYW5zbGF0ZSgxN3B4LCAtMTdweCk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgxKSB0cmFuc2xhdGUoMTdweCwgLTE3cHgpOwogICAgICB9CgogICAgICAucGluID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgY29udGVudDogYXR0cih2YWx1ZSk7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xNnB4OwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1mb250LWNvbG9yLCAjZmZmKTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CgogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgIH0KCiAgICAgIC5waW4uZXhwYW5kID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZSgwLCAtMTdweCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGUoMCwgLTE3cHgpOwogICAgICB9CgogICAgICAvKiBwYXBlci1pbnB1dCAqLwogICAgICAuc2xpZGVyLWlucHV0IHsKICAgICAgICB3aWR0aDogNTBweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICBAYXBwbHkgLS1wYXBlci1zbGlkZXItaW5wdXQtY29udGFpbmVyLWlucHV0OwogICAgICAgIH07CiAgICAgICAgQGFwcGx5IC0tcGFwZXItc2xpZGVyLWlucHV0OwogICAgICB9CgogICAgICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwogICAgICAjc2xpZGVyQ29udGFpbmVyLmRpc2FibGVkIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmRpc2FibGVkID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLjc1LCAwLjc1LCAxKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlM2QoMC43NSwgMC43NSwgMSk7CiAgICAgIH0KCiAgICAgIC5kaXNhYmxlZC5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgfQoKICAgICAgcGFwZXItcmlwcGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNsaWRlckNvbnRhaW5lciIgY2xhc3MkPSJbW19nZXRDbGFzc05hbWVzKGRpc2FibGVkLCBwaW4sIHNuYXBzLCBpbW1lZGlhdGVWYWx1ZSwgbWluLCBleHBhbmQsIGRyYWdnaW5nLCB0cmFuc2l0aW5nLCBlZGl0YWJsZSldXSI+CiAgICAgIDxkaXYgY2xhc3M9ImJhci1jb250YWluZXIiPgogICAgICAgIDxwYXBlci1wcm9ncmVzcyBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaWQ9InNsaWRlckJhciIgYXJpYS1oaWRkZW49InRydWUiIG1pbj0iW1ttaW5dXSIgbWF4PSJbW21heF1dIiBzdGVwPSJbW3N0ZXBdXSIgdmFsdWU9IltbaW1tZWRpYXRlVmFsdWVdXSIgc2Vjb25kYXJ5LXByb2dyZXNzPSJbW3NlY29uZGFyeVByb2dyZXNzXV0iIG9uLWRvd249Il9iYXJkb3duIiBvbi11cD0iX3Jlc2V0S25vYiIgb24tdHJhY2s9Il9iYXJ0cmFjayIgb24tdGFwPSJfYmFyY2xpY2siPgogICAgICAgIDwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgIDwvZGl2PgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3NuYXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1tYXJrZXJzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbWFya2Vyc11dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLW1hcmtlciI+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPGRpdiBpZD0ic2xpZGVyS25vYiIgY2xhc3M9InNsaWRlci1rbm9iIiBvbi1kb3duPSJfa25vYmRvd24iIG9uLXVwPSJfcmVzZXRLbm9iIiBvbi10cmFjaz0iX29uVHJhY2siIG9uLXRyYW5zaXRpb25lbmQ9Il9rbm9iVHJhbnNpdGlvbkVuZCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXIta25vYi1pbm5lciIgdmFsdWUkPSJbW2ltbWVkaWF0ZVZhbHVlXV0iPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlZGl0YWJsZV1dIj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgdHlwZT0ibnVtYmVyIiBzdGVwPSJbW3N0ZXBdXSIgbWluPSJbW21pbl1dIiBtYXg9IltbbWF4XV0iIGNsYXNzPSJzbGlkZXItaW5wdXQiIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiB2YWx1ZT0iW1tpbW1lZGlhdGVWYWx1ZV1dIiBvbi1jaGFuZ2U9Il9jaGFuZ2VWYWx1ZSIgb24ta2V5ZG93bj0iX2lucHV0S2V5RG93biIgbm8tbGFiZWwtZmxvYXQ+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNtb290aGluZy1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPGgzIGNsYXNzPSJ0aXRsZSI+U21vb3RoaW5nPC9oMz4KICAgIDxkaXYgY2xhc3M9InNtb290aGluZy1ibG9jayI+CiAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InNsaWRlciIgaW1tZWRpYXRlLXZhbHVlPSJ7e19pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcn19IiBtYXg9IltbbWF4XV0iIG1pbj0iW1ttaW5dXSIgcGluIHN0ZXA9Iltbc3RlcF1dIiB0eXBlPSJudW1iZXIiIHZhbHVlPSJ7e3dlaWdodH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgbGFiZWw9IndlaWdodCIgbm8tbGFiZWwtZmxvYXQgdmFsdWU9Int7X2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dH19IiB0eXBlPSJudW1iZXIiIHN0ZXA9Iltbc3RlcF1dIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAudGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLnNtb290aGluZy1ibG9jayB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgZmxleC1ncm93OiAyOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNjYWxhci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGlkPSJzaG93LWRvd25sb2FkLWxpbmtzIiBjaGVja2VkPSJ7e19zaG93RG93bmxvYWRMaW5rc319Ij5TaG93IGRhdGEgZG93bmxvYWQgbGlua3M8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggaWQ9Imlnbm9yZS15LW91dGxpZXIiIGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgIDxkaXY+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMC45OTkiPjwvdGYtc21vb3RoaW5nLWlucHV0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ4LXR5cGUtc2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgQXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHNjYWxhciBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBzY2FsYXIgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIiBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtc2NhbGFyLWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiBkYXRhLXRvLWxvYWQ9IltbaXRlbS5zZXJpZXNdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBtdWx0aS1leHBlcmltZW50cz0iW1tfZ2V0TXVsdGlFeHBlcmltZW50cyhkYXRhU2VsZWN0aW9uKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHNob3ctZG93bmxvYWQtbGlua3M9IltbX3Nob3dEb3dubG9hZExpbmtzXV0iIHNtb290aGluZy1lbmFibGVkPSJbW19zbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9IltbX3Ntb290aGluZ1dlaWdodF1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKGNhdGVnb3J5LCBfcnVuVG9UYWdJbmZvLCBpdGVtKV1dIiB0YWc9IltbaXRlbS50YWddXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1tfdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW194VHlwZV1dIj48L3RmLXNjYWxhci1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICN0b29sdGlwLXNvcnRpbmcgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQogICAgICAjdG9vbHRpcC1zb3J0aW5nIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICB3aWR0aDogMTA1cHg7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuY2VudGVyIHsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXJnaW46IDVweCAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRleHQtdG9wOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICBoMSB7CiAgICAgICAgZm9udC1zaXplOiAxOXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGlkPSJsb2FkZXIiIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGZpbGwtYXJlYT0iW1tfZmlsbEFyZWFdXSIgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iIGxvYWQta2V5PSJbW190YWdGaWx0ZXJdXSIgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIgbG9nLXNjYWxlLWFjdGl2ZT0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKG1hcmdpbkNoYXJ0U2VyaWVzKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgc3ltYm9sLWZ1bmN0aW9uPSJbW19jcmVhdGVTeW1ib2xGdW5jdGlvbigpXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfdG9vbHRpcENvbHVtbnNdXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIiB4LXR5cGU9IltbeFR5cGVdXSI+CiAgICAgIDwvdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iYnV0dG9ucyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiBpY29uPSJsaW5lLXdlaWdodCIgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiIHRpdGxlPSJUb2dnbGUgeS1heGlzIGxvZyBzY2FsZSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQ9InRydWUiIGxhYmVsPSJzZXJpZXMgdG8gZG93bmxvYWQiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZH19Ij4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJkYXRhU2VyaWVzTmFtZSI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tkYXRhU2VyaWVzTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDxhIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5jc3YiIGhyZWY9IltbX2NzdlVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+Q1NWPC9hPgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmpzb24iIGhyZWY9IltbX2pzb25VcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iPkpTT048L2E+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWlzc2luZ1RhZ3MubGVuZ3RoXV0iPgogICAgICA8ZGl2IGNsYXNzPSJjb2xsYXBzaWJsZS1saXN0LXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlQ29sbGFwc2libGVJY29uKF9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkKV1dIiBvbi1jbGljaz0iX3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuIiBjbGFzcz0idG9nZ2xlLWNvbGxhcHNpYmxlLWJ1dHRvbiI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4gTWlzc2luZyBUYWdzCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWlzc2luZ1RhZ3NdXSIgYXM9Im1pc3NpbmdFbnRyeSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgUnVuICJbW21pc3NpbmdFbnRyeS5ydW5dXSIgbGFja3MgZGF0YSBmb3IgdGFncwogICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbWlzc2luZ0VudHJ5LnRhZ3NdXSIgYXM9InRhZyI+CiAgICAgICAgICAgICAgICAgIDxsaT5bW3RhZ11dPC9saT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdGFnRmlsdGVySW52YWxpZF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoaXMgcmVndWxhciBleHByZXNpb24gaXMgaW52YWxpZDo8YnI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImludmFsaWQtcmVnZXgiPltbX3RhZ0ZpbHRlcl1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdGVwc01pc21hdGNoXV0iPgogICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICA8aXJvbi1pY29uIGNsYXNzPSJlcnJvci1pY29uIiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+CiAgICAgICAgVGhlIHN0ZXBzIGZvciB2YWx1ZSwgbG93ZXIsIGFuZCB1cHBlciB0YWdzIGRvIG5vdCBtYXRjaDoKICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QudmFsdWVdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC52YWx1ZVN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0Lmxvd2VyXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gubG93ZXJTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC51cHBlcl1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLnVwcGVyU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDxkaXYgaWQ9Im1hdGNoZXMtY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2libGUtbGlzdC10aXRsZSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlQ29sbGFwc2libGVJY29uKF9tYXRjaGVzTGlzdE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNYXRjaGVzT3BlbiIgY2xhc3M9InRvZ2dsZS1tYXRjaGVzLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsYXBzaWJsZS10aXRsZS10ZXh0Ij4KICAgICAgICAgIE1hdGNoZXMgKFtbX3Nlcmllc05hbWVzLmxlbmd0aF1dKQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWF0Y2hlc0xpc3RPcGVuZWRdXSI+CiAgICAgICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIiBhcz0ic2VyaWVzTmFtZSIgaWQ9Im1hdGNoLWxpc3QtcmVwZWF0IiBvbi1kb20tY2hhbmdlPSJfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hdGNoLWxpc3QtZW50cnkiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1hdGNoLWVudHJ5LXN5bWJvbCI+CiAgICAgICAgICAgICAgICAgIFtbX2RldGVybWluZVN5bWJvbChfbmFtZVRvRGF0YVNlcmllcywgc2VyaWVzTmFtZSldXQogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgW1tzZXJpZXNOYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5lcnJvci1jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBtYXJnaW46IDEwcHggMCAwIDA7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQoKICAgICAgLmVycm9yLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgbWFyZ2luOiAwIGF1dG8gNXB4IGF1dG87CiAgICAgIH0KCiAgICAgIC5pbnZhbGlkLXJlZ2V4IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQoKICAgICAgLmVycm9yLWNvbnRlbnQgdWwgewogICAgICAgIG1hcmdpbjogMXB4IDAgMCAwOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDE5cHg7CiAgICAgIH0KCiAgICAgIC50YWctbmFtZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzaWJsZS1saXN0LXRpdGxlIHsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHggMDsKICAgICAgfQoKICAgICAgLmNvbGxhcHNpYmxlLXRpdGxlLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciB7CiAgICAgICAgbWFyZ2luOiA4cHggMCAwIDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGlkPSJsb2FkZXIiIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIj4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGljb249ImxpbmUtd2VpZ2h0IiBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iIG9uLXRhcD0iX3Jlc2V0RG9tYWluIiB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InNlcmllcyB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkfX0iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9ImRhdGFTZXJpZXNOYW1lIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2RhdGFTZXJpZXNOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmNzdiIgaHJlZj0iW1tfY3N2VXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5DU1Y8L2E+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uanNvbiIgaHJlZj0iW1tfanNvblVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+SlNPTjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWF0Y2hlcy1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZU1hdGNoZXNJY29uKF9tYXRjaGVzTGlzdE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNYXRjaGVzT3BlbiIgY2xhc3M9InRvZ2dsZS1tYXRjaGVzLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaGVzLXRleHQiPgogICAgICAgICAgTWF0Y2hlcyAoW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0pCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19tYXRjaGVzTGlzdE9wZW5lZF1dIj4KICAgICAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJzZXJpZXNOYW1lIiBpZD0ibWF0Y2gtbGlzdC1yZXBlYXQiIG9uLWRvbS1jaGFuZ2U9Il9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF0Y2gtbGlzdC1lbnRyeSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2gtZW50cnktc3ltYm9sIj4KICAgICAgICAgICAgICAgICAgW1tfZGV0ZXJtaW5lU3ltYm9sKF9uYW1lVG9EYXRhU2VyaWVzLCBzZXJpZXNOYW1lKV1dCiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICBbW3Nlcmllc05hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI21hdGNoZXMtbGlzdC10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4IDA7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1hdGNoZXMtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfc2hvd0Rvd25sb2FkTGlua3N9fSI+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZy1sYWJlbCI+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMSI+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9IngtdHlwZS1zZWxlY3RvciIgbmFtZT0iSG9yaXpvbnRhbCBBeGlzIiBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciIgaWQ9ImNhdGVnb3JpZXMtY29udGFpbmVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5UaGUgY3VzdG9tIHNjYWxhcnMgZGFzaGJvYXJkIGlzIGluYWN0aXZlLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPG9sPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW4ndCBsYWlkIG91dCB0aGUgZGFzaGJvYXJkLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgc2NhbGFyIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L29sPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgVG8gbGF5IG91dCB0aGUgZGFzaGJvYXJkLCBwYXNzIGEgPGNvZGU+TGF5b3V0PC9jb2RlPiBwcm90b2J1ZmZlcgogICAgICAgICAgICAgIHRvIHRoZSA8Y29kZT5zZXRfbGF5b3V0PC9jb2RlPiBtZXRob2QuIEZvciBleGFtcGxlLAogICAgICAgICAgICAKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkIGltcG9ydCBzdW1tYXJ5CmZyb20gdGVuc29yYm9hcmQucGx1Z2lucy5jdXN0b21fc2NhbGFyIGltcG9ydCBsYXlvdXRfcGIyCi4uLgojIFRoaXMgYWN0aW9uIGRvZXMgbm90IGhhdmUgdG8gYmUgcGVyZm9ybWVkIGF0IGV2ZXJ5IHN0ZXAsIHNvIHRoZSBhY3Rpb24gaXMgbm90CiMgdGFrZW4gY2FyZSBvZiBieSBhbiBvcCBpbiB0aGUgZ3JhcGguIFdlIG9ubHkgbmVlZCB0byBzcGVjaWZ5IHRoZSBsYXlvdXQgb25jZQojIChpbnN0ZWFkIG9mIHBlciBzdGVwKS4KbGF5b3V0X3N1bW1hcnkgPSBzdW1tYXJ5X2xpYi5jdXN0b21fc2NhbGFyX3BiKGxheW91dF9wYjIuTGF5b3V0KAogIGNhdGVnb3J5PVsKICAgIGxheW91dF9wYjIuQ2F0ZWdvcnkoCiAgICAgIHRpdGxlPSdsb3NzZXMnLAogICAgICBjaGFydD1bCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSdsb3NzZXMnLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcidsb3NzLionXSwKICAgICAgICAgICAgICApKSwKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J2JheicsCiAgICAgICAgICAgICAgbWFyZ2luPWxheW91dF9wYjIuTWFyZ2luQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgc2VyaWVzPVsKICAgICAgICAgICAgICAgICAgbGF5b3V0X3BiMi5NYXJnaW5DaGFydENvbnRlbnQuU2VyaWVzKAogICAgICAgICAgICAgICAgICAgIHZhbHVlPSdsb3NzL2Jhei9zY2FsYXJfc3VtbWFyeScsCiAgICAgICAgICAgICAgICAgICAgbG93ZXI9J2Jhel9sb3dlci9iYXovc2NhbGFyX3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgIHVwcGVyPSdiYXpfdXBwZXIvYmF6L3NjYWxhcl9zdW1tYXJ5JyksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICkpLAogICAgICBdKSwKICAgIGxheW91dF9wYjIuQ2F0ZWdvcnkoCiAgICAgIHRpdGxlPSd0cmlnIGZ1bmN0aW9ucycsCiAgICAgIGNoYXJ0PVsKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J3dhdmUgdHJpZyBmdW5jdGlvbnMnLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcid0cmlnRnVuY3Rpb25zL2Nvc2luZScsIHIndHJpZ0Z1bmN0aW9ucy9zaW5lJ10sCiAgICAgICAgICAgICAgKSksCiAgICAgICAgICAjIFRoZSByYW5nZSBvZiB0YW5nZW50IGlzIGRpZmZlcmVudC4gTGV0J3MgZ2l2ZSBpdCBpdHMgb3duIGNoYXJ0LgogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0ndGFuJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3IndHJpZ0Z1bmN0aW9ucy90YW5nZW50J10sCiAgICAgICAgICAgICAgKSksCiAgICAgIF0sCiAgICAgICMgVGhpcyBjYXRlZ29yeSB3ZSBjYXJlIGxlc3MgYWJvdXQuIExldCdzIG1ha2UgaXQgaW5pdGlhbGx5IGNsb3NlZC4KICAgICAgY2xvc2VkPVRydWUpLAogIF0pKQp3cml0ZXIuYWRkX3N1bW1hcnkobGF5b3V0X3N1bW1hcnkpCjwvcHJlPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGFzPSJjaGFydCIgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgZGlzYWJsZS1wYWdpbmF0aW9uIGluaXRpYWwtb3BlbmVkPSJbW2NhdGVnb3J5Lm1ldGFkYXRhLm9wZW5lZF1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhcnQubXVsdGlsaW5lXV0iPgogICAgICAgICAgICAgICAgICAgIDx0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVucz0iW1tfc2VsZWN0ZWRSdW5zXV0iIHRpdGxlPSJbW2NoYXJ0LnRpdGxlXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgc21vb3RoaW5nLXdlaWdodD0iW1tfc21vb3RoaW5nV2VpZ2h0XV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiB0YWctcmVnZXhlcz0iW1tjaGFydC5tdWx0aWxpbmUudGFnXV0iPjwvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjaGFydC5tYXJnaW5dXSI+CiAgICAgICAgICAgICAgICAgICAgPHRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIiB0aXRsZT0iW1tjaGFydC50aXRsZV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiBtYXJnaW4tY2hhcnQtc2VyaWVzPSJbW2NoYXJ0Lm1hcmdpbi5zZXJpZXNdXSI+PC90Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmcgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHdpZHRoOiAxMDVweDsKICAgICAgfQogICAgICAubGluZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWltYWdlLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdj5zYW1wbGU6IFtbX3NhbXBsZVRleHRdXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHN0ZXAKICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj5bW190b0xvY2FsZVN0cmluZyhfc3RlcFZhbHVlKV1dPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQgZGF0ZXRpbWUiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnRXYWxsVGltZV1dIj4KICAgICAgICAgICAgICBbW19jdXJyZW50V2FsbFRpbWVdXQogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCByaWdodCI+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIV9pc0ltYWdlTG9hZGluZ11dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJzdGVwcyIgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIgbWF4LW1hcmtlcnM9IltbX21heFN0ZXBJbmRleF1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CgogICAgCiAgICA8YSBpZD0ibWFpbi1pbWFnZS1jb250YWluZXIiIHJvbGU9ImJ1dHRvbiIgYXJpYS1sYWJlbD0iVG9nZ2xlIGFjdHVhbCBzaXplIiBhcmlhLWV4cGFuZGVkJD0iW1tfZ2V0QXJpYUV4cGFuZGVkKGFjdHVhbFNpemUpXV0iIG9uLXRhcD0iX2hhbmRsZVRhcCI+PC9hPgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiPgogICAgICAvKiogTWFrZSBidXR0b24gYSBkaXYuICovCiAgICAgIGJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IEdldCByaWQgb2YgZG90dGVkIGxpbmUgaW5zaWRlIGJ1dHRvbi4gKi8KICAgICAgYnV0dG9uOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IFNpbXVsYXRlIENocm9tZSdzIG91dGVyIGdsb3cgb24gYnV0dG9uIHdoZW4gZm9jdXNlZC4gKi8KICAgICAgYnV0dG9uOi1tb3otZm9jdXNyaW5nIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IDJweCBIaWdobGlnaHQ7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW46IDAgMTVweCA0MHB4IDA7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgfQoKICAgICAgLyoqIFdoZW4gYWN0dWFsIHNpemUgc2hvd24gaXMgb24sIHVzZSB0aGUgYWN0dWFsIGltYWdlIHdpZHRoLiAqLwogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IG5vbmU7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pICNtYWluLWltYWdlLWNvbnRhaW5lciBpbWcgewogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1zcGlubmVyLWxpdGUgewogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207CiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQoKICAgICAgI3N0ZXBzIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMTVweDsKICAgICAgICAvKgogICAgICAgICAqIDMxIGNvbWVzIGZyb20gYWRkaW5nIGEgcGFkZGluZyBvZiAxNXB4IGZyb20gYm90aCBzaWRlcyBvZiB0aGUKICAgICAgICAgKiBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nIDFweCBzbyB0aGF0IHRoZSBzbGlkZXIgd2lkdGggYWxpZ25zCiAgICAgICAgICogd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwgYW5kCiAgICAgICAgICogYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZgogICAgICAgICAqIHRoZSBpbWFnZS4gMzAgLSAxICsgMi4KICAgICAgICAgKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICB9CgogICAgICAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDEwMjRweDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI21haW4taW1hZ2UtY29udGFpbmVyIGltZyB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGltYWdlLXJlbmRlcmluZzogLW1vei1jcmlzcC1lZGdlczsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWltYWdlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfYWN0dWFsU2l6ZX19Ij5TaG93IGFjdHVhbCBpbWFnZSBzaXplPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8aDMgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5CcmlnaHRuZXNzIGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBtaW49IjAiIG1heD0iMiIgc25hcHMgcGluIHN0ZXA9IjAuMDEiIHZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19IiBpbW1lZGlhdGUtdmFsdWU9Int7X2JyaWdodG5lc3NBZGp1c3RtZW50fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgb24tdGFwPSJfcmVzZXRCcmlnaHRuZXNzIiBkaXNhYmxlZD0iW1tfYnJpZ2h0bmVzc0lzRGVmYXVsdF1dIj5SZXNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMyBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPkNvbnRyYXN0IGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBtaW49IjAiIG1heD0iNTAwIiBzbmFwcyBwaW4gc3RlcD0iMSIgdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19IiBpbW1lZGlhdGUtdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIG9uLXRhcD0iX3Jlc2V0Q29udHJhc3QiIGRpc2FibGVkPSJbW19jb250cmFzdElzRGVmYXVsdF1dIj5SZXNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIGlkPSJydW5zLXNlbGVjdG9yIiBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+PC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGltYWdlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGltYWdlIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWltYWdlLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iIG9mLXNhbXBsZXM9IltbaXRlbS5vZlNhbXBsZXNdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgYWN0dWFsLXNpemU9IltbX2FjdHVhbFNpemVdXSIgYnJpZ2h0bmVzcy1hZGp1c3RtZW50PSJbW19icmlnaHRuZXNzQWRqdXN0bWVudF1dIiBjb250cmFzdC1wZXJjZW50YWdlPSJbW19jb250cmFzdFBlcmNlbnRhZ2VdXSI+PC90Zi1pbWFnZS1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItc2xpZGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHVuc2V0OwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbdG90YWxTYW1wbGVzXV0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwIDxzdHJvbmc+W1tfY3VycmVudERhdHVtLnN0ZXBdXTwvc3Ryb25nPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnREYXR1bS53YWxsX3RpbWVdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgICAgW1tfY3VycmVudERhdHVtLndhbGxfdGltZV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgIDxhdWRpbyBjb250cm9scyBzcmMkPSJbW19jdXJyZW50RGF0dW0udXJsXV0iIHR5cGUkPSJbW19jdXJyZW50RGF0dW0uY29udGVudFR5cGVdXSI+PC9hdWRpbz4KICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tfY3VycmVudERhdHVtLmxhYmVsXV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtYWluLWF1ZGlvLWNvbnRhaW5lciI+PC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3I6ICM0MjQyNDI7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgICNzdGVwcyB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwYWRkaW5nOiAwIDVweDsgLyogc28gdGhlIHNsaWRlciBrbm9iIGRvZXNuJ3QgYnV0dCBvdXQgKi8KICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBpZD0icnVucy1zZWxlY3RvciIgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBhdWRpbyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBhdWRpbyBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1hdWRpby1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIiB0b3RhbC1zYW1wbGVzPSJbW2l0ZW0udG90YWxTYW1wbGVzXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iPjwvdGYtYXVkaW8tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tYXV0b2dyb3ctdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRhcmVhOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1pcnJvci10ZXh0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIHRlbXBsYXRlICovCiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIAogICAgCiAgICA8ZGl2IGlkPSJtaXJyb3IiIGNsYXNzPSJtaXJyb3ItdGV4dCIgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PgoKICAgIAogICAgPGRpdiBjbGFzcz0idGV4dGFyZWEtY29udGFpbmVyIGZpdCI+CiAgICAgIDx0ZXh0YXJlYSBpZD0idGV4dGFyZWEiIG5hbWUkPSJbW25hbWVdXSIgYXJpYS1sYWJlbCQ9IltbbGFiZWxdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSI+PC90ZXh0YXJlYT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgbGFiZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dC1jb250YWluZXIgbm8tbGFiZWwtZmxvYXQkPSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPGxhYmVsIGhpZGRlbiQ9IltbIWxhYmVsXV0iIGFyaWEtaGlkZGVuPSJ0cnVlIiBmb3IkPSJbW19pbnB1dElkXV0iIHNsb3Q9ImxhYmVsIj5bW2xhYmVsXV08L2xhYmVsPgoKICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3M9InBhcGVyLWlucHV0LWlucHV0IiBzbG90PSJpbnB1dCIgaWQkPSJbW19pbnB1dElkXV0iIGFyaWEtbGFiZWxsZWRieSQ9IltbX2FyaWFMYWJlbGxlZEJ5XV0iIGFyaWEtZGVzY3JpYmVkYnkkPSJbW19hcmlhRGVzY3JpYmVkQnldXSIgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yJD0iW1t2YWxpZGF0b3JdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGF1dG9jb21wbGV0ZSQ9IltbYXV0b2NvbXBsZXRlXV0iIGF1dG9mb2N1cyQ9IltbYXV0b2ZvY3VzXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIG5hbWUkPSJbW25hbWVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWF4LXJvd3MkPSJbW21heFJvd3NdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiPjwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9hc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2FzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjMzIzMjMyKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9hc3QtY29sb3IsICNmMWYxZjEpOwogICAgICAgIG1pbi1oZWlnaHQ6IDQ4cHg7CiAgICAgICAgbWluLXdpZHRoOiAyODhweDsKICAgICAgICBwYWRkaW5nOiAxNnB4IDI0cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMjYpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBtYXJnaW46IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuM3MsIG9wYWNpdHkgMC4zczsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcywgb3BhY2l0eSAwLjNzOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwcHgpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhcHN1bGUpIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCguZml0LWJvdHRvbSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhcGVyLXRvYXN0LW9wZW4pIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNwYW4gaWQ9ImxhYmVsIj57e3RleHR9fTwvc3Bhbj4KICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b2dnbGUtYnV0dG9uIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6bm9uZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1iYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhci1jb2xvciwgIzAwMDAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhcjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IC0zcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gbGluZWFyIC4wOHMsIGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b24tY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNTApKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbi5kcmFnZ2luZyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYmFyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJhci1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICAgICAgICBvcGFjaXR5OiAwLjEyOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF06bm90KFtkaXNhYmxlZF0pKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudG9nZ2xlLWluayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTE0cHg7CiAgICAgICAgbGVmdDogLTE0cHg7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIC8qIFRoZSB0b2dnbGUgYnV0dG9uIGhhcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZiAtM3B4OyBUaGUgZXh0cmEgMXB4CiAgICAgICAgLyogYWNjb3VudHMgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIHNoYWRvdyBib3guICovCiAgICAgICAgbWFyZ2luOiA0cHggMXB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICAvKiBpbnZhbGlkIHN0YXRlICovCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1iYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1iYXItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1idXR0b24tY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1pbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtaW5rLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCYXIiIGNsYXNzPSJ0b2dnbGUtYmFyIj48L2Rpdj4KICAgICAgPGRpdiBpZD0idG9nZ2xlQnV0dG9uIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtbGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1taW5pbWFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgbGluZWFyOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCguaGlkZGVuKSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgY2FudmFzIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwogICAgICB9CgogICAgICByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6ICMxMTExMTE7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwOwogICAgICAgIGZpbHRlcjogdXJsKCNtaW5pbWFwRHJvcFNoYWRvdyk7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdmc+CiAgICAgIDxkZWZzPgogICAgICAgIDxmaWx0ZXIgaWQ9Im1pbmltYXBEcm9wU2hhZG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTUwJSIgaGVpZ2h0PSIxNTAlIj4KICAgICAgICAgIDxmZW9mZnNldCByZXN1bHQ9Im9mZk91dCIgaW49IlNvdXJjZUdyYXBoaWMiIGR4PSIxIiBkeT0iMSI+PC9mZW9mZnNldD4KICAgICAgICAgIDxmZWNvbG9ybWF0cml4IHJlc3VsdD0ibWF0cml4T3V0IiBpbj0ib2ZmT3V0IiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4xIDAgMCAwIDAgMCAwLjEgMCAwIDAgMCAwIDAuMSAwIDAgMCAwIDAgMC41IDAiPjwvZmVjb2xvcm1hdHJpeD4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciByZXN1bHQ9ImJsdXJPdXQiIGluPSJtYXRyaXhPdXQiIHN0ZGRldmlhdGlvbj0iMiI+PC9mZWdhdXNzaWFuYmx1cj4KICAgICAgICAgIDxmZWJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImJsdXJPdXQiIG1vZGU9Im5vcm1hbCI+PC9mZWJsZW5kPgogICAgICAgIDwvZmlsdGVyPgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0PjwvcmVjdD4KICAgIDwvc3ZnPgogICAgPGNhbnZhcyBjbGFzcz0iZmlyc3QiPjwvY2FudmFzPgogICAgCiAgICA8Y2FudmFzIGNsYXNzPSJzZWNvbmQiPjwvY2FudmFzPgogICAgPGNhbnZhcyBjbGFzcz0iZG93bmxvYWQiPjwvY2FudmFzPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLXNjZW5lIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzdmcgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2hpZGRlbiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyogLS0tIE5vZGUgYW5kIGFubm90YXRpb24tbm9kZSBmb3IgTWV0YW5vZGUgLS0tICovCgogICAgICAubWV0YSA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YSA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgfQogICAgICAubWV0YS5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCwKICAgICAgLmZhZGVkIHJlY3QsCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgcGF0aCwKICAgICAgLmZhZGVkIHVzZSwKICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBwYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmFkZWQgcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgdXNlIHsKICAgICAgICBmaWxsOiB1cmwoI2VsbGlwc2VIYXRjaCkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmZhZGVkIHRleHQgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC8qIFJ1bGVzIHVzZWQgZm9yIGlucHV0LXRyYWNpbmcuICovCiAgICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gcmVjdCwKICAgICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiBlbGxpcHNlLAogICAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHVzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZmY5ODAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qICAtIEZhZGVkIG5vbi1pbnB1dCBzdHlsaW5nICovCiAgICAgIC5ub24taW5wdXQgPiAqID4gcmVjdCwKLm5vbi1pbnB1dCA+ICogPiBlbGxpcHNlLAoubm9uLWlucHV0ID4gKiA+IHVzZSwKLyogRm9yIENvbnN0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gKiA+IC5jb25zdGFudDpub3QoW2NsYXNzKj0iaW5wdXQtaGlnaGxpZ2h0Il0pID4KICAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiBpbmhlcml0OwogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgcGF0aCB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gLm5vZGVzaGFwZSA+IHJlY3QsCi5ub24taW5wdXQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgZWxsaXBzZSwKICAgICAgLm5vbi1pbnB1dCB1c2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLm5vbi1pbnB1dCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLyogSW5wdXQgZWRnZXMuICovCiAgICAgIC5pbnB1dC1lZGdlLWhpZ2hsaWdodCA+IHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLmlucHV0LWhpZ2hsaWdodCA+IC5pbi1hbm5vdGF0aW9ucyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSwKICAgICAgLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZAogICAgICAgID4gLmluLWFubm90YXRpb25zCiAgICAgICAgPiAuYW5ub3RhdGlvbgogICAgICAgID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIE5vbi1pbnB1dCBlZGdlcy4gKi8KICAgICAgLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCwKLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IHBhdGgsCi8qIEFubm90YXRpb24gc3R5bGVzIChsYWJlbCBhbmQgZWRnZXMgcmVzcGVjdGl2ZWx5KS4gKi8KLm5vbi1pbnB1dCA+IGcgPgouYW5ub3RhdGlvbjpub3QoLmlucHV0LWhpZ2hsaWdodCk6bm90KC5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQpID4KLmFubm90YXRpb24tbGFiZWwKLyouYW5ub3RhdGlvbi1lZGdlKi8KIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qIC0tLSBPcCBOb2RlIC0tLSAqLwoKICAgICAgLm9wID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAgIC5vcCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5vcC5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgICAub3Auc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAub3AuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgICAgLm9wLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQoKICAgICAgLyogLS0tIFNlcmllcyBOb2RlIC0tLSAqLwoKICAgICAgLyogQnkgZGVmYXVsdCwgZG9uJ3Qgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+LiAqLwogICAgICAuc2VyaWVzID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICAgIGZpbGw6IGhzbCgwLCAwJSwgNzAlKTsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogNSwgNTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC8qIE9uY2UgZXhwYW5kZWQsIHNob3cgdGhlIHNlcmllcyBiYWNrZ3JvdW5kIDxyZWN0PiBhbmQgaGlkZSB0aGUgPHVzZT4uICovCiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwLjE1OwogICAgICAgIHN0cm9rZTogaHNsKDAsIDAlLCA3MCUpOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gdXNlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKgogKiBUT0RPOiBTaW1wbGlmeSB0aGlzIGJ5IGFwcGx5aW5nIGEgc3RhYmxlIGNsYXNzIG5hbWUgdG8gYWxsIDxnPgogKiBlbGVtZW50cyB0aGF0IGN1cnJlbnRseSBoYXZlIGVpdGhlciB0aGUgbm9kZXNoYXBlIG9yIGFubm90YXRpb24tbm9kZSBjbGFzc2VzLgogKi8KICAgICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KICAgICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLnNlcmllcy5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBCcmlkZ2UgTm9kZSAtLS0gKi8KICAgICAgLmJyaWRnZSA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6ICNmMGY7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTdHJ1Y3R1cmFsIEVsZW1lbnRzIC0tLSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUuc3RydWN0dXJhbCB7CiAgICAgICAgc3Ryb2tlOiAjZjBmOwogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBSZWZlcmVuY2UgRWRnZSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUucmVmZXJlbmNlZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjZmZiNzRkOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTZXJpZXMgTm9kZXMgLS0tICovCgogICAgICAvKiBIaWRlIHRoZSByZWN0IGZvciBhIHNlcmllcycgYW5ub3RhdGlvbi4gKi8KICAgICAgLnNlcmllcyA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiAtLS0gTm9kZSBsYWJlbCAtLS0gKi8KCiAgICAgIC5ub2RlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiAjNDQ0OwogICAgICB9CgogICAgICAubWV0YS5leHBhbmRlZCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgfQoKICAgICAgLnNlcmllcyA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDhweDsKICAgICAgfQoKICAgICAgLm9wID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNnB4OwogICAgICB9CgogICAgICAuYnJpZGdlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ub2RlLm1ldGEuZXhwYW5kZWQgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgICAgY3Vyc29yOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuaGlnaGxpZ2h0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM1MGEzZjc7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM0Mjg1ZjQ7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uIC0tLSAqLwoKICAgICAgLyogb25seSBhcHBsaWVkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGFyZSBub3Qgc3VtbWFyeSBvciBjb25zdGFudC4KKC5zdW1tYXJ5LCAuY29uc3RhbnQgZ2V0cyBvdmVycmlkZGVuIGJlbG93KSAqLwogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zdW1tYXJ5ID4gLmFubm90YXRpb24tbm9kZSA+ICosCiAgICAgIC5hbm5vdGF0aW9uLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+ICogewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYWFhOwogICAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgICBtYXJrZXItZW5kOiB1cmwoI2Fubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTsKICAgICAgfQoKICAgICAgI2Fubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjYWFhOwogICAgICB9CgogICAgICAjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNhYWE7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWxhYmVsLmFubm90YXRpb24tZWxsaXBzaXMgewogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLyogSGlkZSBhbm5vdGF0aW9ucyBvbiBleHBhbmRlZCBtZXRhIG5vZGVzIHNpbmNlIHRoZXkncmUgcmVkdW5kYW50LiAqLwogICAgICAuZXhwYW5kZWQgPiAuaW4tYW5ub3RhdGlvbnMsCiAgICAgIC5leHBhbmRlZCA+IC5vdXQtYW5ub3RhdGlvbnMgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBDb25zdGFudCAtLS0gKi8KCiAgICAgIC5jb25zdGFudCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjODQ4NDg0OwogICAgICB9CgogICAgICAuY29uc3RhbnQuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIH0KCiAgICAgIC5jb25zdGFudC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEFubm90YXRpb246IFN1bW1hcnkgLS0tICovCgogICAgICAuc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2RiNDQzNzsKICAgICAgICBzdHJva2U6ICNkYjQ0Mzc7CiAgICAgIH0KCiAgICAgIC5zdW1tYXJ5LnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIGZpbGw6ICNhNTI3MTQ7CiAgICAgICAgc3Ryb2tlOiAjYTUyNzE0OwogICAgICB9CgogICAgICAuc3VtbWFyeS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEVkZ2UgLS0tICovCgogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYmJiOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNzU7CiAgICAgIH0KCiAgICAgIC5lZGdlIC5zZWxlY3RhYmxlZWRnZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuc2VsZWN0ZWRlZGdlID4gcGF0aC5lZGdlbGluZSB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHN0cm9rZTogI2YwMDsKICAgICAgfQoKICAgICAgLmVkZ2Uuc2VsZWN0ZWRlZGdlIHRleHQgewogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgIH0KCiAgICAgIC8qIExhYmVscyBzaG93aW5nIHRlbnNvciBzaGFwZXMgb24gZWRnZXMgKi8KICAgICAgLmVkZ2UgPiB0ZXh0IHsKICAgICAgICBmb250LXNpemU6IDMuNXB4OwogICAgICAgIGZpbGw6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5kYXRhZmxvdy1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNiYmI7CiAgICAgIH0KCiAgICAgIC5yZWZlcmVuY2UtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZmZiNzRkOwogICAgICB9CgogICAgICAuc2VsZWN0ZWQtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZjAwOwogICAgICB9CgogICAgICAuZWRnZSAuY29udHJvbC1kZXAgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDIsIDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBHcm91cCBub2RlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0tICovCgogICAgICAvKiBIaWRlcyBleHBhbmQvY29sbGFwc2UgYnV0dG9ucyB3aGVuIGEgbm9kZSBpc24ndCBleHBhbmRlZCBvciBoaWdobGlnaHRlZC4gVXNpbmcKICAgaW5jcmVkaWJseSBzbWFsbCBvcGFjaXR5IHNvIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgPGc+IHBhcmVudCBzdGlsbCB0YWtlcwogICB0aGlzIGNvbnRhaW5lciBpbnRvIGFjY291bnQgZXZlbiB3aGVuIGl0IGlzbid0IHZpc2libGUgKi8KICAgICAgLm5vZGU6bm90KC5oaWdobGlnaHRlZCk6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciB7CiAgICAgICAgb3BhY2l0eTogMC4wMTsKICAgICAgfQogICAgICAubm9kZS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLmJ1dHRvbmNpcmNsZSB7CiAgICAgICAgZmlsbDogI2U3ODExZDsKICAgICAgfQogICAgICAuYnV0dG9uY2lyY2xlOmhvdmVyIHsKICAgICAgICBmaWxsOiAjYjk2NzE3OwogICAgICB9CiAgICAgIC5leHBhbmRidXR0b24sCiAgICAgIC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgfQogICAgICAvKiBEbyBub3QgbGV0IHRoZSBwYXRoIGVsZW1lbnRzIGluIHRoZSBidXR0b24gdGFrZSBwb2ludGVyIGZvY3VzICovCiAgICAgIC5ub2RlID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuZXhwYW5kYnV0dG9uLAogICAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAvKiBPbmx5IHNob3cgdGhlIGV4cGFuZCBidXR0b24gd2hlbiBhIG5vZGUgaXMgY29sbGFwc2VkIGFuZCBvbmx5IHNob3cgdGhlCiAgIGNvbGxhcHNlIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZC4gKi8KICAgICAgLm5vZGUuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm5vZGU6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLXN0YXRzIHsKICAgICAgICBmb250LXNpemU6IDRweDsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwgcmVjdCB7CiAgICAgICAgZmlsdGVyOiB1cmwoI2hlYWx0aC1waWxsLXNoYWRvdyk7CiAgICAgICAgcng6IDM7CiAgICAgICAgcnk6IDM7CiAgICAgIH0KCiAgICAgIC50aXRsZUNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRvcDogMjBweDsKICAgICAgfQoKICAgICAgLnRpdGxlLAogICAgICAuYXV4VGl0bGUsCiAgICAgIC5mdW5jdGlvbkxpYnJhcnlUaXRsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjbWluaW1hcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAyMHB4OwogICAgICAgIGJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0idGl0bGVDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0aXRsZSIgY2xhc3M9InRpdGxlIj5NYWluIEdyYXBoPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImF1eFRpdGxlIiBjbGFzcz0iYXV4VGl0bGUiPkF1eGlsaWFyeSBOb2RlczwvZGl2PgogICAgICA8ZGl2IGlkPSJmdW5jdGlvbkxpYnJhcnlUaXRsZSIgY2xhc3M9ImZ1bmN0aW9uTGlicmFyeVRpdGxlIj4KICAgICAgICBGdW5jdGlvbnMKICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxkZWZzPgogICAgICAgIAogICAgICAgIDxwYXRoIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1zbWFsbCIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1tZWRpdW0iIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjEzIiBtYXJrZXJoZWlnaHQ9IjEzIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMTYiIG1hcmtlcmhlaWdodD0iMTYiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXhsYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMjAiIG1hcmtlcmhlaWdodD0iMjAiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8cGF0aCBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtc21hbGwiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbWVkaXVtIiB2aWV3Ym94PSIwIDAgMTAgMTAiIG1hcmtlcndpZHRoPSIxMyIgbWFya2VyaGVpZ2h0PSIxMyIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjE2IiBtYXJrZXJoZWlnaHQ9IjE2IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC14bGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjIwIiBtYXJrZXJoZWlnaHQ9IjIwIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQiIG1hcmtlcndpZHRoPSI1IiBtYXJrZXJoZWlnaHQ9IjUiIHJlZng9IjAiIHJlZnk9IjIuNSIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gNSwwIEwgMCwyLjUgTCA1LDUgTCA1LDAiIC8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgPG1hcmtlciBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIwIiByZWZ5PSIyLjUiIG9yaWVudD0iYXV0byI+CiAgICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICAKICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtYW5ub3RhdGlvbi1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjkiIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjciIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjUiIHk9IjIiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxzdmcgaWQ9InN1bW1hcnktaWNvbiIgZmlsbD0iIzg0ODQ4NCIgaGVpZ2h0PSIxMiIgdmlld2JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTIiPgogICAgICAgICAgPHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz4KICAgICAgICA8L3N2Zz4KCiAgICAgICAgCiAgICAgICAgPHBhdHRlcm4gaWQ9InJlY3RIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuIGlkPSJlbGxpcHNlSGF0Y2giIHBhdHRlcm50cmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIiB3aWR0aD0iMiIgaGVpZ2h0PSIyIiBwYXR0ZXJudW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIiAvPgogICAgICAgIDwvcGF0dGVybj4KCiAgICAgICAgCiAgICAgICAgPGZpbHRlciBpZD0iaGVhbHRoLXBpbGwtc2hhZG93IiB4PSItNDAlIiB5PSItNDAlIiB3aWR0aD0iMTgwJSIgaGVpZ2h0PSIxODAlIj4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMC44IiAvPgogICAgICAgICAgPGZlb2Zmc2V0IGR4PSIwIiBkeT0iMCIgcmVzdWx0PSJvZmZzZXRibHVyIiAvPgogICAgICAgICAgPGZlZmxvb2QgZmxvb2QtY29sb3I9IiMwMDAwMDAiIC8+CiAgICAgICAgICA8ZmVjb21wb3NpdGUgaW4yPSJvZmZzZXRibHVyIiBvcGVyYXRvcj0iaW4iIC8+CiAgICAgICAgICA8ZmVtZXJnZT4KICAgICAgICAgICAgPGZlbWVyZ2Vub2RlIC8+CiAgICAgICAgICAgIDxmZW1lcmdlbm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgICAgIDwvZmVtZXJnZT4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgPC9kZWZzPgogICAgICAKICAgICAgPHJlY3QgZmlsbD0id2hpdGUiIHdpZHRoPSIxMDAwMCIgaGVpZ2h0PSIxMDAwMCI+PC9yZWN0PgogICAgICA8ZyBpZD0icm9vdCI+PC9nPgogICAgPC9zdmc+CiAgICA8dGYtZ3JhcGgtbWluaW1hcCBpZD0ibWluaW1hcCI+PC90Zi1ncmFwaC1taW5pbWFwPgogICAgPGRpdiBpZD0iY29udGV4dE1lbnUiIGNsYXNzPSJjb250ZXh0LW1lbnUiPjwvZGl2PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgfQoKICAgICAgLmF1dG8gewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICBwYXBlci1idXR0b24gewogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0idmVydGljYWwiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t0aXRsZV1dIj4KICAgICAgICAgIDxoMj5bW3RpdGxlXV08L2gyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRmLWdyYXBoLXNjZW5lIGlkPSJzY2VuZSIgY2xhc3M9ImF1dG8iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1lZGdlPSJ7e3NlbGVjdGVkRWRnZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHByb2dyZXNzPSJbW3Byb2dyZXNzXV0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW25vZGVDb250ZXh0TWVudUl0ZW1zXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9jb250aW51ZUJ1dHRvbkNhbGxiYWNrIj4KICAgICAgPHNwYW4+W1tfY29udGludWVCdXR0b25UZXh0XV08L3NwYW4+CiAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iY29udGludWVEaWFsb2ciPgogICAgICA8aDI+Q29udGludWUuLi48L2gyPgogICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlLW5hbWUiPgogICAgICAgICAgT3ZlciBTZXNzaW9uIFJ1bnM6CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJjb250aW51ZU51bSIgY2xhc3M9ImlucHV0LWJveCIgbGFiZWw9Ik51bWJlciBvZiBTZXNzaW9uIFJ1bnMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBvbmUpOiIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIxIiBzdGVwPSIxIiB2YWx1ZT0ie3tjb250aW51ZU51bX19Ij48L3BhcGVyLWlucHV0PgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZ28tYnV0dG9uIiBpY29uPSJhcnJvdy1mb3J3YXJkIiB0aXRsZT0iU2Vzc2lvbiBSdW5zIEdvIiBvbi10YXA9Il9zZXNzaW9uUnVuR29CdXR0b25DYWxsYmFjayI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUtbmFtZSI+CiAgICAgICAgICBUaWxsIENvbmRpdGlvbiBNZXQgYnkgV2F0Y2hlZCBUZW5zb3IKICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0idGVuc29yQ29uZGl0aW9uRHJvcGRvd24iIGNsYXNzPSJpbnB1dC1ib3giIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iVGVuc29yIENvbmRpdGlvbiIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb259fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJ0ZW5zb3JDb25kaXRpb25NZW51IiBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Db250YWlucyArLy3iiJ4gb3IgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgKy8t4oiePC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWF4ICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1pbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWluICZsdDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggLSBNaW4gJmd0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1heCAtIE1pbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+U3RhbmRhcmQgZGV2aWF0aW9uICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5TdGFuZGFyZCBkZXZpYXRpb24gJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJnby1idXR0b24iIGljb249ImFycm93LWZvcndhcmQiIHRpdGxlPSJUZW5zb3IgQ29uZGl0aW9uIEdvIiBvbi10YXA9Il90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2siPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJyZWYtdmFsdWUiIGNsYXNzPSJpbnB1dC1ib3giIGxhYmVsPSJSZWZlcmVuY2UgdmFsdWUgdG8gY29tcGFyZSB0byIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0ie3tfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWV9fSIgaGlkZGVuPSJbW19pc1JlZlZhbHVlSW5wdXRIaWRkZW5dXSI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC5jb250aW51ZS10by10eXBlLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IHBhcGVyLWRpYWxvZyB7CiAgICAgICAgd2lkdGg6IDM2dnc7CiAgICAgIH0KICAgICAgOmhvc3QgLmlucHV0LWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgfQogICAgICA6aG9zdCAuZ28tYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nIj4KICA8dGVtcGxhdGU+CiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfb3Blbl1dIj4KICAgICAgPGRpdiBpZD0iZGFzaGJvYXJkLWJhY2tkcm9wIj48L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJkaWFsb2ciIG5vLWNhbmNlbC1vbi1vdXRzaWRlLWNsaWNrIG5vLWNhbmNlbC1vbi1lc2Mta2V5IG9wZW5lZD0ie3tfb3Blbn19Ij4KICAgICAgPGgyIGlkPSJkaWFsb2ctdGl0bGUiPltbX3RpdGxlXV08L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0N1c3RvbU1lc3NhZ2VdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLW1lc3NhZ2UiPltbX2N1c3RvbU1lc3NhZ2VdXTwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXNDdXN0b21NZXNzYWdlXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvU2Vzc2lvbiIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+dGYuU2Vzc2lvbjwvYT46CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlLXNuaXBwZXQiPmltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCmZyb20gdGVuc29yZmxvdy5weXRob24gaW1wb3J0IGRlYnVnIGFzIHRmX2RlYnVnCgpzZXNzID0gdGYuU2Vzc2lvbigpCnNlc3MgPSB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24oc2VzcywgIltbX2hvc3RdXTpbW19wb3J0XV0iKQpzZXNzLnJ1bihteV9mZXRjaGVzKQogICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL3Byb2dyYW1tZXJzX2d1aWRlL2VzdGltYXRvcnMiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPkVzdGltYXRvcjwvYT4KICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL3RyYWluL01vbml0b3JlZFNlc3Npb24iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPk1vbml0b3JlZFNlc3Npb248L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwoKaG9vayA9IHRmX2RlYnVnLlRlbnNvckJvYXJkRGVidWdIb29rKCJbW19ob3N0XV06W1tfcG9ydF1dIikKbXlfZXN0aW1hdG9yLmZpdCh4PXhfZGF0YSwgeT15X2RhdGEsIHN0ZXBzPTEwMDAsIG1vbml0b3JzPVtob29rXSkKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8va2VyYXMuaW8vbW9kZWxzL21vZGVsLyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+S2VyYXMgTW9kZWw8L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwppbXBvcnQga2VyYXMKCmtlcmFzLmJhY2tlbmQuc2V0X3Nlc3Npb24oCiAgICB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24odGYuU2Vzc2lvbigpLCAiW1tfaG9zdF1dOltbX3BvcnRdXSIpKQojIERlZmluZSB5b3VyIGtlcmFzIG1vZGVsLCBjYWxsZWQgIm1vZGVsIi4KbW9kZWwuZml0KC4uLikKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHN0eWxlPgogICAgICAvKiogV2UgcmVseSBvbiBhIHNlcGFyYXRlIGBfaGlkZGVuYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRpcmVjdGx5IG1ha2luZyB1c2UKICAgICAgICAgIG9mIHRoZSBgX29wZW5gIGF0dHJpYnV0ZSBiZWNhdXNlIHRoaXMgQ1NTIHNwZWNpZmljYXRpb24gbWF5IHN0cmFuZ2VseQogICAgICAgICAgYWZmZWN0IG90aGVyIGVsZW1lbnRzIHRocm91Z2hvdXQgVGVuc29yQm9hcmQuIFNlZSAjODk5LiAqLwogICAgICA6aG9zdChbX2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIDpob3N0LAogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgIH0KCiAgICAgIC5jb2RlLWV4YW1wbGUgewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CiAgICAgIC5jb2RlLWV4YW1wbGUtc2VjdGlvbiB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLmNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAuY29kZS1zbmlwcGV0IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKICAgICAgfQoKICAgICAgI2RpYWxvZy10aXRsZSB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jdXN0b20tbWVzc2FnZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZGVidWdnZXItcmVzaXplciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iYmFycyI+CiAgICAgIDxkaXYgY2xhc3M9ImJhcnMtcm90YXRvciI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImJhcnMtdGV4dCI+fCB8PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdChbX3Jlc2l6ZXItaWRlbnRpZmllcl0pIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYmFja2dyb3VuZDogI2NjYzsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2lzLWhvcml6b250YWxdKSB7CiAgICAgICAgY3Vyc29yOiByb3ctcmVzaXplOwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICA6aG9zdChbX2lzLXZlcnRpY2FsXSkgewogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICByaWdodDogLTE1cHg7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLmJhcnMgewogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgZm9udC1zaXplOiA1cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgIC8qKiBUaGlzIGJsb2NrIHByZXZlbnRzIHRoZSBiYXJzIHJvdGF0b3IgZnJvbSBoYXZpbmcgYSBoZWlnaHQgdGhhdCBpcwogICAgICAgICAgdGhlIGVudGlyZSB2aWV3cG9ydCwgdGh1cyBvY2NsdWRpbmcgaXQgYW5kIGdpdmluZyBpdCBhbiB1bmRlc2lyZWQgY3Vyc29yCiAgICAgICAgICB2YWx1ZS4gKi8KICAgICAgLmJhcnMtcm90YXRvciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaXMtaG9yaXpvbnRhbF0pIC5iYXJzLXJvdGF0b3IgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgICAgfQoKICAgICAgLmJhcnMtdGV4dCB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMTUpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdj4KICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9ImZpbHRlci1tb2RlIiBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9IkZpbHRlciBNb2RlIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19maWx0ZXJNb2RlfX0iPgogICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Ob2RlIE5hbWU8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+T3AgVHlwZTwvcGFwZXItaXRlbT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJmaWx0ZXItaW5wdXQiIGxhYmVsPSJGaWx0ZXIgUmVnZXgiIGFsd2F5cy1mbG9hdC1sYWJlbCB2YWx1ZT0ie3tfZmlsdGVySW5wdXR9fSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgY2xhc3M9InNwaW5uZXIiIGlkPSJsb2FkaW5nLXNwaW5uZXIiIGhpZGRlbj0iW1shX2lzTG9hZGluZ11dIj4KICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgPGRpdiBpZD0ic2VsZWN0b3ItaGllcmFyY2h5Ij48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgLmxldmVsLWNvbnRhaW5lciBpcm9uLWNvbGxhcHNlIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICBtYXJnaW46IDAgOHB4IDAgMDsKICAgICAgfQoKICAgICAgLm9wLXR5cGUgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7CiAgICAgICAgY29sb3I6ICM0NDQ7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQoKICAgICAgLnBhcnRpYWwtY2hlY2tib3ggewogICAgICAgIGJhY2tncm91bmQ6ICNmNTdjMDA7CiAgICAgIH0KCiAgICAgIC5ub2RlLWV4cGFuZC1idXR0b24gewogICAgICAgIG1hcmdpbjogMCAwIDAgLTEzcHg7CiAgICAgIH0KCiAgICAgIC5sZXZlbC10aXRsZS10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xcHg7CiAgICAgIH0KCiAgICAgIC5vcC1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIDI3cHg7CiAgICAgICAgcGFkZGluZzogMTBweCAwOwogICAgICB9CgogICAgICAuc3Bpbm5lciB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNmaWx0ZXItbW9kZSB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2ZpbHRlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIC5oaWdobGlnaHRlZCA+IC5vcC10eXBlIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CgogICAgICAjc2VsZWN0b3ItaGllcmFyY2h5IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zZXNzaW9uLXJ1bnMtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0ic2Vzc2lvbi1ydW5zLWRpdiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNlc3Npb24gUnVuczwvZGl2PgogICAgICA8dGFibGUgaWQ9InNlc3Npb24tcnVucy10YWJsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJzZXNzaW9uLXJ1bnMtdGFibGUiPgogICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICA8dGg+RmVlZHM8L3RoPgogICAgICAgICAgPHRoPkZldGNoZXM8L3RoPgogICAgICAgICAgPHRoPlRhcmdldHM8L3RoPgogICAgICAgICAgPHRoPiMoRGV2aWNlcyk8L3RoPgogICAgICAgICAgPHRoPkNvdW50PC90aD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAyMHB4IDA7CiAgICAgIH0KCiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgOmhvc3QgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLyogVE9ETyhjYWlzKTogVGhpcyBuZWVkcyB3b3JrOiB0aGUgdGFibGUgc2hvdWxkbid0IGdldCB0b28gd2lkZSB3aGVuCiAgICAgICAgIHRoZXJlIGFyZSBtYW55IGZlZWRzL2ZldGNoZXMvdGFyZ3RlIG5hbWVzLiAqLwogICAgICAuc2Vzc2lvbi1ydW5zLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZCAxcHggYmxhY2s7CiAgICAgICAgdGFibGUtbGF5b3V0OiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgIC5hY3RpdmUtc2Vzc2lvbi1ydW4gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLnNvbGUtYWN0aXZlLXNlc3Npb24tcnVuIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTcyLCAyMzIsIDE4OCk7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50IHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50OmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNvdXJjZS1jb2RlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImZ1bGxTdGFja0RpYWxvZyIgaGlkZGVuJD0iW1shX2Z1bGxTdGFja1Nob3duXV0iPgogICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iZmlsdGVyLWxpc3QiIGRpc2FibGVkPSJ0cnVlIj4KICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIEZ1bGwgU3RhY2sgVHJhY2Ugb2YgTm9kZToKICAgICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLW5vZGUtbmFtZSI+IltbX2Z1bGxTdGFja05vZGVOYW1lXV0iPC9kaXY+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImNsb3NlIiBpZD0iY2xvc2UtZnVsbC1zdGFjay1idXR0b24iIHRpdGxlPSJDbG9zZSBGdWxsIFN0YWNrIiBvbi10YXA9Il9jbG9zZUZ1bGxTdGFja0RpYWxvZyI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDx1bCBpZD0iZnVsbC1zdGFjay1jb250ZW50Ij48L3VsPgogICAgPC9kaXY+CiAgICA8cGFwZXItdGFicyBpZD0ic291cmNlLWZpbGVzLXRhYnMiIHNlbGVjdGVkPSJ7e19maWxlUGF0aFNlbGVjdGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zaG9ydEZpbGVQYXRoc11dIj4KICAgICAgICA8cGFwZXItdGFiIGlkPSJbW2l0ZW0uaWRdXSI+W1tpdGVtLm5hbWVdXTwvcGFwZXItdGFiPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci10YWJzPgogICAgPGRpdiBpZD0ic291cmNlLWZpbGUtY29udGVudCIgY2xhc3M9InNvdXJjZS1jb250ZW50Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZmlsZUxpbmVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJ7e2l0ZW0uc291cmNlQ2xhc3N9fSIgaWQ9InNvdXJjZS1saW5lLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtbnVtYmVyIiBpZD0ic291cmNlLWxpbmVuby1bW2l0ZW0ubGluZW5vXV0iPgogICAgICAgICAgICBbW2l0ZW0ubGluZW5vXV0KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSIgaWQ9InNvdXJjZS1saW5lLW5vZGUtdG9nZ2xlLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICAgIFtbaXRlbS5udW1Ob2Rlc11dCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtdGV4dCIgaWQ9InNvdXJjZS1saW5lLXRleHQtW1tpdGVtLmxpbmVub11dIj4KICAgICAgICAgICAgW1tpdGVtLnRleHRdXQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPGRpdiBjbGFzcz0ic291cmNlLWxpbmUtbm9kZXMiIGlkPSJzb3VyY2UtbGluZS1ub2Rlcy1bW2l0ZW0ubGluZW5vXV0iPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzb3VyY2UtZmlsZXMtdGFicyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogOCU7CiAgICAgIH0KICAgICAgLnNvdXJjZS1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiA5MCU7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICBvdmVyZmxvdy14OiBzY3JvbGw7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CiAgICAgIC5zb3VyY2UtY29udGVudCA6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmMDA7CiAgICAgIH0KICAgICAgLmhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1udW1iZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjb2xvcjogbGlnaHRibHVlOwogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuc291cmNlLWxpbmUtbm9kZXMgewogICAgICAgIHBhZGRpbmctbGVmdDogNGVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICBtYXJnaW4tdG9wOiAwZW07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMGVtOwogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLWVudHJ5IHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLW5vZGVzIHNwYW4gewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLXRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgI2Z1bGxTdGFja0RpYWxvZyB7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHdpZHRoOiA0NSU7CiAgICAgICAgaGVpZ2h0OiA4NSU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2RkZDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLW5vZGUtbmFtZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgOmhvc3QgI2Z1bGwtc3RhY2stY29udGVudCB7CiAgICAgICAgcGFkZGluZy10b3A6IDFlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KICAgICAgLnN0YWNrLWZyYW1lLWNsaWNrYWJsZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5zdGFjay1mcmFtZS1ub25jbGlja2FibGUgewogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICB9CiAgICAgICNjbG9zZS1mdWxsLXN0YWNrLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yLWRhdGEtc3VtbWFyeSI+CiAgPHRlbXBsYXRlPgogICAgPHNwYW4gY2xhc3M9InNlY3Rpb24tdGl0bGUiPlRlbnNvciBWYWx1ZSBPdmVydmlldzwvc3Bhbj4KICAgIDxkaXYgaWQ9InRlbnNvci1kYXRhLWRpdiIgY2xhc3M9InRlbnNvci1kYXRhLWRpdiI+CiAgICAgIDx0YWJsZSBpZD0idGVuc29yLWRhdGEtdGFibGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0idGVuc29yLWRhdGEtdGFibGUiPgogICAgICAgIDx0aGVhZD4KICAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgIDx0aD5UZW5zb3I8L3RoPgogICAgICAgICAgICA8dGg+Q291bnQ8L3RoPgogICAgICAgICAgICA8dGg+RFR5cGU8L3RoPgogICAgICAgICAgICA8dGg+U2hhcGU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+VmFsdWU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+CiAgICAgICAgICAgICAgSGVhbHRoIFBpbGwKICAgICAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0ic2hvdy1oZWFsdGgtcGlsbHMiIGNoZWNrZWQ9Int7X2hlYWx0aFBpbGxzRW5hYmxlZH19Ij4KICAgICAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWNhcmQ+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFsdGgtcGlsbC1sZWdlbmQiIGlkPSJoZWFsdGgtcGlsbC1sZWdlbmQiPjwvZGl2PgogICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgPHRoIHdpZHRoPSI1JSI+PC90aD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCAjdGVuc29yLWRhdGEtZGl2IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IC5pbmRlbnRlZC1sZXZlbC1jb250YWluZXIgLmNvbnRlbnQtY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDEwcHg7CiAgICAgIH0KICAgICAgOmhvc3QgLnRlbnNvci1kYXRhLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgIH0KICAgICAgOmhvc3QgI3RlbnNvci1kYXRhLXRhYmxlIHRoIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CiAgICAgIDpob3N0IC5hY3RpdmUtdGVuc29yIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGJvcmRlcjogc29saWQgMXB4ICM4ODg7CiAgICAgIH0KICAgICAgOmhvc3QgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIDpob3N0IC5oZWFsdGgtcGlsbC1sZWdlbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIDpob3N0ICNzaG93LWhlYWx0aC1waWxscyB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayA6aG92ZXIgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICB9CiAgICAgIC5oZWFsdGgtcGlsbCA6aG92ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxzdHlsZT4vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLnRlbnNvci13aWRnZXQgewogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxNHB4OwogIG92ZXJmbG93LXg6IGhpZGRlbjsKICBvdmVyZmxvdy15OiBoaWRkZW47CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoudGVuc29yLXdpZGdldC1kaW0gewogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICBtYXJnaW4tbGVmdDogMTVweDsKICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiAgcGFkZGluZzogMnB4Owp9CgoudGVuc29yLXdpZGdldC1kaW0tY29tbWEgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDEwMCwgMTgwLCAyNTUpOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1kaW0tYnJhY2tldHMgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0Owp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgd2lkdGg6IDE4MHB4OwogIHotaW5kZXg6IDEwMDA7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0gewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTgwLCAxODAsIDE4MCk7CiAgZm9udC1zaXplOiAxMnB4OwogIHBhZGRpbmc6IDNweDsKICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigxMDAsIDE4MCwgMjU1KTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUgewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDYwLCA2MCwgNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDhwdDsKICBoZWlnaHQ6IDQ4cHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwYWRkaW5nLWxlZnQ6IDE0cHg7CiAgcGFkZGluZy1yaWdodDogMTBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUtbGFiZWwgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7Cn0KCi50ZW5zb3Itd2lkZ2V0LWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MiwgMjUyLCAyNTIpOwogIGJveC1zaGFkb3c6IDJweCAycHggMnB4ICNiMGIwYjA7CiAgaGVpZ2h0OiA0MHB4OwogIGxpbmUtaGVpZ2h0OiA0MHB4OwogIG1heC1oZWlnaHQ6IDQwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDEwMCU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWluZm8gewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDAsIDAsIDI1NSk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogMjJweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXJnaW4tbGVmdDogOHB4OwogIG1heC1oZWlnaHQ6IDIycHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWIgewogIGNvbG9yOiByZ2IoMzIsIDMzLCAzNik7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LXNpemU6IDE2cHg7CiAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1tZW51LXRodW1iOmhvdmVyIHsKICBjb2xvcjogcmdiKDIyNywgMTE2LCAwKTsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUgewogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1sZWZ0OiAxMnB4Owp9CgoudGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLXZhbHVlIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNsaWNpbmctZ3JvdXAgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTAsIDI1MCwgMjUwKTsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDE5MCwgMTkwLCAxOTApOwogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMThweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgcGFkZGluZy1ib3R0b206IDVweDsKICBwYWRkaW5nLXRvcDogNXB4Owp9CgoudGVuc29yLXdpZGdldC10ZW5zb3ItbmFtZSB7CiAgY29sb3I6IGJsYWNrOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtbGVmdC1ydWxlci10aWNrIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yKTsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci10b3A6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm94LXNoYWRvdzogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjb2xvcjogcmdiKDExMCwgMTEwLCAxMTApOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMjlweDsKICBsaW5lLWhlaWdodDogMjlweDsKICBtYXJnaW4tbGVmdDogMHB4OwogIG1heC13aWR0aDogNDVweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0MCwgMjQwLCAyNDApOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBib3gtc2hhZG93OiAxcHggMXB4IDFweCAjYjBiMGIwOwogIGRpc3BsYXk6IG5vbmU7CiAgZm9udC1zaXplOiAxM3B4OwogIHBhZGRpbmc6IDVweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgd2lkdGg6IDI0MHB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2lkdGg6IDk1JTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSB7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIHBhZGRpbmctcmlnaHQ6IDJweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2IHsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci1yaWdodDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogODAlOwogIGhlaWdodDogMjRweDsKICBsaW5lLWhlaWdodDogMjRweDsKICBtYXgtd2lkdGg6IDQ1cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHVzZXItc2VsZWN0OiBub25lOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDQ1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24gewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IHsKICBib3JkZXItbGVmdDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCB7CiAgYm9yZGVyLXJpZ2h0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCB7CiAgYm9yZGVyLXRvcDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiB7CiAgLS1ib3JkZXItc3R5bGU6IDFweCBzb2xpZCByZ2IoMTQwLCAxNDAsIDE0MCk7CiAgLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEwLCAyMTAsIDIxMCk7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1yb3cgewogIGhlaWdodDogMjVweDsKICBsaW5lLWhlaWdodDogMjVweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Cjwvc3R5bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGVuc29yLXdpZGdldC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoudGVuc29yLXdpZGdldCB7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDE0cHg7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IGhpZGRlbjsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbSB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIG1hcmdpbi1yaWdodDogMTVweDsKICBwYWRkaW5nOiAycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1jb21tYSB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIHsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTAwLCAxODAsIDI1NSk7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjgsIDEyOCwgMTI4KTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGN1cnNvcjogcG9pbnRlcjsKICB3aWR0aDogMTgwcHg7CiAgei1pbmRleDogMTAwMDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigxODAsIDE4MCwgMTgwKTsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogM3B4OwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEwMCwgMTgwLCAyNTUpOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWRpc2FibGVkIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZSB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogNDhweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXgtaGVpZ2h0OiAyMnB4OwogIHBhZGRpbmctbGVmdDogMTRweDsKICBwYWRkaW5nLXJpZ2h0OiAxMHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtaGVhZGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUyLCAyNTIsIDI1Mik7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBoZWlnaHQ6IDQwcHg7CiAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgbWF4LWhlaWdodDogNDBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogMTAwJTsKfQoKLnRlbnNvci13aWRnZXQtaW5mbyB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoMCwgMCwgMjU1KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7CiAgaGVpZ2h0OiAyMnB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIG1hcmdpbi1sZWZ0OiA4cHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtbWVudS10aHVtYiB7CiAgY29sb3I6IHJnYigzMiwgMzMsIDM2KTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtc2l6ZTogMTZweDsKICBtYXJnaW4tbGVmdDogMTBweDsKICBtYXJnaW4tcmlnaHQ6IDVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWI6aG92ZXIgewogIGNvbG9yOiByZ2IoMjI3LCAxMTYsIDApOwp9CgoudGVuc29yLXdpZGdldC1zaGFwZSB7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLWxlZnQ6IDEycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUtdmFsdWUgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTkwLCAxOTAsIDE5MCk7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxOHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBwYWRkaW5nLWJvdHRvbTogNXB4OwogIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIHsKICBjb2xvcjogYmxhY2s7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1sZWZ0LXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3gtc2hhZG93OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyOXB4OwogIGxpbmUtaGVpZ2h0OiAyOXB4OwogIG1hcmdpbi1sZWZ0OiAwcHg7CiAgbWF4LXdpZHRoOiA0NXB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXIgewogIGhlaWdodDogMjRweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGJveC1zaGFkb3c6IDFweCAxcHggMXB4ICNiMGIwYjA7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEzcHg7CiAgcGFkZGluZzogNXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB3aWR0aDogMjQwcHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtY29sb3JiYXIgewogIGhlaWdodDogMjRweDsKICB3aWR0aDogOTUlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWluZGljZXMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIHsKICBtYXJnaW4tdG9wOiAyMHB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayB7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnVsZXItYmFja2dyb3VuZC1jb2xvcik7CiAgYm9yZGVyLWJvdHRvbTogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3JkZXItcmlnaHQ6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDI0cHg7CiAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYgewogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4MCU7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIG1heC13aWR0aDogNDVweDsKICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIHsKICBib3JkZXItYm90dG9tOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWxlZnQgewogIGJvcmRlci1sZWZ0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0IHsKICBib3JkZXItcmlnaHQ6IDAuNXB4IHNvbGlkIGJsdWU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIHsKICBib3JkZXItdG9wOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1zZWN0aW9uIHsKICAtLWJvcmRlci1zdHlsZTogMXB4IHNvbGlkIHJnYigxNDAsIDE0MCwgMTQwKTsKICAtLXJ1bGVyLWJhY2tncm91bmQtY29sb3I6IHJnYigyMTAsIDIxMCwgMjEwKTsKICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXJvdyB7CiAgaGVpZ2h0OiAyNXB4OwogIGxpbmUtaGVpZ2h0OiAyNXB4OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDx2ei1saW5lLWNoYXJ0MiB4LWNvbXBvbmVudHMtY3JlYXRpb24tbWV0aG9kPSJbW19saW5lQ2hhcnRYQ29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHktdmFsdWUtYWNjZXNzb3I9IltbX2xpbmVDaGFydFlWYWx1ZUFjY2Vzc29yXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnNdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWRdXSI+PC92ei1saW5lLWNoYXJ0Mj4KICAgIDxzdHlsZT4KICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIGhlaWdodDogMzAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3ItdmFsdWUtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0ZW5zb3JWYWx1ZVRvYXN0IiB0ZXh0PSIiIGFsd2F5cy1vbi10b3A+PC9wYXBlci10b2FzdD4KICAgIDx0YWJsZSBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGFibGUiPgogICAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9InRlbnNvci1uYW1lIiBvbi10YXA9InRlbnNvck5hbWVDYWxsYmFjayI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRlbnNvci1uYW1lLXRleHQiPltbdGVuc29yTmFtZV1dPC9zcGFuPgogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJjbG9zZSIgY2xhc3M9InZhbHVlLXZpZXctaWNvbi1idXR0b24iIGlkPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiB0aXRsZT0iQ2xvc2UiIG9uLXRhcD0iY2xvc2VCdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImZvcndhcmQiIGNsYXNzPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiBpZD0idmFsdWUtdmlldy1pY29uLWJ1dHRvbiIgdGl0bGU9IkNvbnRpbnVlIHRvIiBvbi10YXA9ImNvbnRpbnVlVG9CdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0idGVuc29yLXZhbHVlLXZhbHVlLXRyIj4KICAgICAgICA8dGQ+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPGRpdiBpZD0idGVuc29yLXdpZGdldCI+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9ImRlYnVnLW9wIj48L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlNsaWNpbmciIGlkPSJzbGljaW5nIiB2YWx1ZT0ie3tzbGljaW5nfX0iIG9uLWNoYW5nZT0icmVmcmVzaCI+CiAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlRpbWUgSW5kaWNlcyIgaWQ9InRpbWUtaW5kaWNlcyIgdmFsdWU9Int7dGltZUluZGljZXN9fSIgb24tY2hhbmdlPSJyZWZyZXNoIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBpZD0idGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iIGNsYXNzPSJ0ZW5zb3ItdmFsdWUtYnV0dG9ucyIgb24tY2xpY2s9Il90aW1lSW5kaWNlc1RvZ2dsZUJ1dHRvbkNhbGxiYWNrIj5GdWxsIEhpc3Rvcnk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgPC9kaXY+PC90ZW1wbGF0ZT48L3RkPjx0ZCBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlU2NhbGFyXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgY2xhc3M9ImlubGluZSIgbGFiZWw9IlNjYWxhciBWYWx1ZSIgaWQ9InZhbHVlLXNjYWxhciIgdmFsdWU9IltbX2RhdGFTY2FsYXJdXSI+CiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlTGluZUNoYXJ0XV0iPgogICAgICAgICAgICAgICAgICA8dGYtZGVidWdnZXItbGluZS1jaGFydCBkYXRhPSJbW19saW5lQ2hhcnREYXRhXV0iPjwvdGYtZGVidWdnZXItbGluZS1jaGFydD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVmFsdWVJbWFnZV1dIj4KICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0idmFsdWUtaW1hZ2UiIGhlaWdodD0iMjUwcHgiIHdpZHRoPSIyNTBweCIgc3JjJD0iW1tfZGF0YUltYWdlU3JjXV0iPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAKICAgICAgICAgIAogICAgICAgIAogICAgICA8L3RyPgogICAgPC90YWJsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGVuc29yLXdpZGdldC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnRlbnNvci12YWx1ZS1idXR0b25zIHsKICAgICAgICBoZWlnaHQ6IDc1JTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIH0KICAgICAgLnRlbnNvci12YWx1ZS12aWV3LXRhYmxlIHsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLXRhYmxlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiA1cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggMXB4IDFweCAjZDhkOGQ4OwogICAgICB9CiAgICAgIC50ZW5zb3ItdmFsdWUtdmlldy10ZCB7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICB9CiAgICAgIC52YWx1ZS1jYXJkLWlucHV0IHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KICAgICAgI3RlbnNvci1uYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC50ZW5zb3ItbmFtZS10ZXh0IHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAjZGVidWctb3AgewogICAgICAgIGZvbnQtc2l6ZTogOTAlOwogICAgICB9CiAgICAgIC52YWx1ZS1pbWFnZSB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgIH0KICAgICAgLnZhbHVlLXZpZXctaWNvbi1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgI3RlbnNvci13aWRnZXQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICAgICAgICAvKiBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogICAgICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7ICovCiAgICAgICAgaGVpZ2h0OiAyODBweDsKICAgICAgICB3aWR0aDogNDg0cHg7CiAgICAgIH0KICAgICAgI3NsaWNpbmcsCiAgICAgICN0aW1lLWluZGljZXMgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtdWx0aVZpZXciPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UZW5zb3IgVmFsdWVzPC9kaXY+CiAgICAgIDxkaXYgaWQ9Im11bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAjbXVsdGlWaWV3IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogM3B4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2VlZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0b2FzdCIgdGV4dD0iIiBhbHdheXMtb24tdG9wPjwvcGFwZXItdG9hc3Q+CiAgICA8dGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cgaWQ9ImluaXRpYWxEaWFsb2ciPjwvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2c+CiAgICAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBpZD0ibGVmdC1wYW5lIj4KICAgICAgICA8ZGl2IGlkPSJub2RlLWVudHJpZXMiIGNsYXNzPSJub2RlLWVudHJpZXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+UnVudGltZSBOb2RlIExpc3Q8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSI+CiAgICAgICAgICAgIFNob3cgQ29kZToKICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSIgaWQ9InNob3ctc291cmNlLWNvZGUiIGNoZWNrZWQ9Int7X3NvdXJjZUNvZGVTaG93bn19Ij48L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0Zi1vcC1zZWxlY3RvciBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZGVidWctd2F0Y2gtY2hhbmdlPSJbW19jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZm9yY2UtZXhwYW5kLWFuZC1jaGVjay1ub2RlLW5hbWU9IltbX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZV1dIiBmb3JjZS1leHBhbmQtbm9kZS1uYW1lPSJbW19mb3JjZUV4cGFuZE5vZGVOYW1lXV0iPgogICAgICAgICAgPC90Zi1vcC1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzb3VyY2UtY29kZS12aWV3LWRpdiIgY2xhc3M9InNvdXJjZS1jb2RlLXZpZXctZGl2IiBoaWRkZW4kPSJ7eyFfc291cmNlQ29kZVNob3dufX0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+U291cmNlIENvZGU8L2Rpdj4KICAgICAgICAgIDx0Zi1zb3VyY2UtY29kZS12aWV3IGlkPSJzb3VyY2VDb2RlVmlldyIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZm9jdXMtbm9kZS1uYW1lPSJbW19zb3VyY2VGb2N1c05vZGVOYW1lXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgY29udGludWUtdG8tbm9kZT0iW1tfY3JlYXRlQ29udGludWVUb05vZGVIYW5kbGVyKCldXSI+PC90Zi1zb3VyY2UtY29kZS12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDx0Zi1kZWJ1Z2dlci1yZXNpemVyIGN1cnJlbnQtbGVuZ3RoPSJ7e19sZWZ0UGFuZVdpZHRofX0iIG1pbi1sZW5ndGg9IltbX21pbmxlZnRQYW5lV2lkdGhdXSIgbWF4LWxlbmd0aD0iW1tfbWF4bGVmdFBhbmVXaWR0aF1dIj4KICAgICAgICA8L3RmLWRlYnVnZ2VyLXJlc2l6ZXI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0Zi1zZXNzaW9uLXJ1bnMtdmlldyBpZD0ic2Vzc2lvblJ1bnNWaWV3IiBsYXRlc3Qtc2Vzc2lvbi1ydW49IltbX2xhdGVzdFNlc3Npb25SdW5dXSIgc2Vzc2lvbi1ydW4ta2V5LXRvLWRldmljZS1uYW1lcz0iW1tfc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc11dIiBzb2xlLWFjdGl2ZT0iW1tfc2Vzc2lvblJ1blNvbGVBY3RpdmVdXSIgbm9kZS1vci10ZW5zb3ItY2xpY2tlZD0iW1tfY3JlYXRlRmVlZEZldGNoVGFyZ2V0Q2xpY2tlZEhhbmRsZXIoKV1dIj4KICAgICAgICAgIDwvdGYtc2Vzc2lvbi1ydW5zLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucy1jb250YWluZXIiPgogICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9zdGVwIj4KICAgICAgICAgICAgPHNwYW4+W1tfc3RlcEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPHRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyBpZD0iY29udGludWVEaWFsb2ciIHNlc3Npb24tcnVuLWdvPSJbW19jcmVhdGVTZXNzaW9uUnVuR28oKV1dIiB0ZW5zb3ItY29uZGl0aW9uLWdvPSJbW19jcmVhdGVUZW5zb3JDb25kaXRpb25HbygpXV0iIGZvcmNlLWNvbnRpbnVhdGlvbi1zdG9wPSJbW19jcmVhdGVGb3JjZUNvbnRpbnVhdGlvblN0b3AoKV1dIj4KICAgICAgICAgIDwvdGYtZGVidWdnZXItY29udGludWUtZGlhbG9nPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8dGYtZ3JhcGgtbG9hZGVyIGlkPSJsb2FkZXIiIG91dC1ncmFwaC1oaWVyYXJjaHk9Int7Z3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e2dyYXBofX0iIG91dC1zdGF0cz0ie3tzdGF0c319IiBwcm9ncmVzcz0ie3tfZ3JhcGhQcm9ncmVzc319Ij48L3RmLWdyYXBoLWxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIiBpZD0iY2VudGVyLWNvbnRlbnQiPgogICAgICAgIDxkaXYgaWQ9InRvcC1yaWdodC1xdWFkcmFudCI+CiAgICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfdG9wUmlnaHRTZWxlY3RlZH19Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdG9wUmlnaHRUYWJzXV0iPgogICAgICAgICAgICAgIDxwYXBlci10YWIgaWQ9IltbaXRlbS5pZF1dIj5bW2l0ZW0ubmFtZV1dPC9wYXBlci10YWI+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJydW50aW1lLWdyYXBoLWRldmljZSI+CiAgICAgICAgICAgIDxzcGFuIGlkPSJydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIj4gPC9zcGFuPgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0iYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iRGV2aWNlIG5hbWUiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNdXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgY2xhc3M9InNwaW5uZXIiIGlkPSJ0b3AtcmlnaHQtc3Bpbm5lciIgaGlkZGVuPSJbWyFfYnVzeV1dIiBhY3RpdmU9IltbX2J1c3ldXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgaWQ9InRvcC1yaWdodC1wcm9ncmVzcy1iYXIiIHZhbHVlPSIwIj48L3BhcGVyLXByb2dyZXNzPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZV1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iZ3JhcGgtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8dGYtZ3JhcGggaWQ9ImdyYXBoIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgYmFzaWMtZ3JhcGg9IltbZ3JhcGhdXSIgc3RhdHM9Iltbc3RhdHNdXSIgcHJvZ3Jlc3M9Int7X2dyYXBoUHJvZ3Jlc3N9fSIgY29sb3ItYnk9InN0cnVjdHVyZSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW19jcmVhdGVOb2RlQ29udGV4dE1lbnVJdGVtcygpXV0iPjwvdGYtZ3JhcGg+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGV4dC1tZW51Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlXV0iPgogICAgICAgICAgICA8dGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXcgaWQ9InRlbnNvclZhbHVlTXVsdGlWaWV3IiBjb250aW51ZS10by1jYWxsYmFjaz0iW1tfY3JlYXRlQ29udGludWVUb0NhbGxiYWNrKCldXSIgdGVuc29yLW5hbWUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZ2V0LWhlYWx0aC1waWxsPSJbW19jcmVhdGVHZXRIZWFsdGhQaWxsKCldXSI+CiAgICAgICAgICAgIDwvdGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8dGYtZGVidWdnZXItcmVzaXplciBpcy1ob3Jpem9udGFsPSJ0cnVlIiBjdXJyZW50LWxlbmd0aD0ie3tfdG9wUmlnaHRRdWFkcmFudEhlaWdodH19IiBtaW4tbGVuZ3RoPSJbW19taW5Ub3BSaWdodFF1YWRyYW50SGVpZ2h0XV0iIG1heC1sZW5ndGg9IltbX21heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHRdXSI+CiAgICAgICAgPC90Zi1kZWJ1Z2dlci1yZXNpemVyPgoKICAgICAgICA8ZGl2IGlkPSJ0ZW5zb3ItZGF0YSIgY2xhc3M9InRlbnNvci1kYXRhIj4KICAgICAgICAgIDx0Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5IGlkPSJ0ZW5zb3JEYXRhU3VtbWFyeSIgbGF0ZXN0LXRlbnNvci1kYXRhPSJbW19sYXRlc3RUZW5zb3JEYXRhXV0iIGV4cGFuZC1oYW5kbGVyPSJbW19jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpXV0iIGNvbnRpbnVlLXRvLWNhbGxiYWNrPSJbW19jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKV1dIiBoaWdobGlnaHRlZC1ub2RlLW5hbWU9IltbX2hpZ2hsaWdodE5vZGVOYW1lXV0iIHRlbnNvci1uYW1lLWNsaWNrZWQ9IltbX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpXV0iIGdldC1oZWFsdGgtcGlsbD0iW1tfY3JlYXRlR2V0SGVhbHRoUGlsbCgpXV0iPgogICAgICAgICAgPC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIHBhcGVyLXRvYXN0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIHdpZHRoOiA0MHZ3OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzMHZ3OwogICAgICB9CiAgICAgIHRmLWRhc2hib2FyZC1sYXlvdXQgewogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzOiBhdXRvOwogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aDogbm9uZTsKICAgICAgICAtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGg6IG5vbmU7CiAgICAgIH0KICAgICAgLmRlYnVnZ2VyLXNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICBwYXBlci10YWJzIHsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIHBhcGVyLXRhYi5pcm9uLXNlbGVjdGVkIHsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgI2luaXRpYWxEaWFsb2cgewogICAgICAgIC8qKiBUaGlzIG1hdGNoZXMgdGhlIGRlZmF1bHQgei1pbmRleCBvZiBwYXBlci1kaWFsb2cgYmFja2Ryb3BzLiAqLwogICAgICAgIHotaW5kZXg6IDEwMjsKICAgICAgfQogICAgICAvKiogUmVzaXplIHRoZSByZWdpb24gZm9yIHRoZSBncmFwaCBhcyB0aGUgdXNlciByZXNpemVzIHRoZSByZWdpb24uICovCiAgICAgICNncmFwaC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMTIwcHgpOwogICAgICAgIC8qKiBDbGlwIHRoZSBtaW5pbWFwIGlmIHRoZSBoZWlnaHQgb2YgdGhlIGdyYXBoIGNvbnRhaW5lciBpcyBzbWFsbC4gKi8KICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAjZ3JhcGggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmctbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEzcHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgICN4LXR5cGUtc2VsZWN0b3IgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDVweCAzcHg7CiAgICAgIH0KICAgICAgLnJ1bnRpbWUtZ3JhcGgtZGV2aWNlIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgICNydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgICNhY3RpdmUtcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiA4NSU7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuc2lkZWJhciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtZGVidWdnZXItcmVzaXplciB7CiAgICAgICAgcmlnaHQ6IC0xMHB4OwogICAgICB9CiAgICAgICNjZW50ZXItY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIC8qKiBUaGUgcmVzaXplciBzaG91bGQgaGF2ZSBubyBzcGFjZSB0byB0aGUgbGVmdCBvZiBpdC4gKi8KICAgICAgI2NlbnRlci1jb250ZW50IHRmLWRlYnVnZ2VyLXJlc2l6ZXJbaXMtaG9yaXpvbnRhbF0gewogICAgICAgIG1hcmdpbi1sZWZ0OiAtMjNweDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CiAgICAgIC5zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAubm9kZS1lbnRyaWVzIHsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDgwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc291cmNlLWNvZGUtdmlldy1kaXYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDQwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgICNzZXNzaW9uUnVuc1ZpZXcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiAyNXZoOwogICAgICB9CiAgICAgIC5idXR0b25zLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogMjBweCAwOwogICAgICB9CiAgICAgICN0ZW5zb3ItZGF0YSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDIwcHggMDsKICAgICAgICBtYXJnaW46IDAgMCAyMHB4IDA7CiAgICAgIH0KICAgICAgI3RlbnNvckRhdGFTdW1tYXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CiAgICAgICN0b3AtcmlnaHQtcXVhZHJhbnQgewogICAgICAgIGhlaWdodDogNjYlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC50b2dnbGUtc291cmNlLWNvZGUgewogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICAgIGZvbnQtc2l6ZTogODAlOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGkgewogICAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICB9CiAgICAgIC5pbmxpbmUsCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydCB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItbWF0ZXJpYWwtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIHsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgewogICAgICAgIG1hcmdpbjogMTBweCAxMHB4IDEwcHggMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1wcmV2aWV3IHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtYXJnaW46IDAgMTBweCAwIDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAuY29sb3ItbGFiZWwsCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBjb2xvcjogIzc3NzsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgICBsaW5lLWhlaWdodDogMjZweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLnRlbnNvci1jb3VudCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZSBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nCiAgICogMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMgd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwKICAgKiBhbmQgYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICogQXBwYXJlbnRseSwgdGhlIHBhcGVyLXNsaWRlciBsYWNrcyBhIG1peGluIGZvciB0aG9zZSBwYWRkaW5nIHZhbHVlcy4gKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHRkIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIHdpZHRoOiA4MHB4OwogICAgICB9CgogICAgICAudGVuc29yLWRldmljZS10ZCB7CiAgICAgICAgbWF4LXdpZHRoOiAxNDBweDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGU6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5kZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCB7CiAgICAgICAgd2lkdGg6IDEzMHB4OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCA+IGRpdiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgI2V2ZW50LWNvdW50cy10aCB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyNTUsIDE0MSwgMCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5wb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMCwgNjIsIDIxMik7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMjA0LCA0NywgNDQpOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24sCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5uby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24gewogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJjYXJkIGhlYWx0aC1waWxsLWxlZ2VuZCI+CiAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICBFbmFibGUgYWxsIChub3QganVzdCBzYW1wbGVkKSBzdGVwcy4gUmVxdWlyZXMgc2xvdyBkaXNrIHJlYWQuCiAgICAgIDwvZGl2PgogICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0iZW5hYmxlQWxsU3RlcHNNb2RlVG9nZ2xlIiBjaGVja2VkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSI+CiAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgPGgyPgogICAgICAgIFN0ZXAgb2YgSGVhbHRoIFBpbGxzOgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IiBtaW49IjAiIG1heD0iW1tfYmlnZ2VzdFN0ZXBFdmVyU2Vlbl1dIiB2YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOjppbnB1dH19Ij4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICAgIFtbX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlXV0KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIWFyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBpZD0iaGVhbHRoLXBpbGxzLWxvYWRpbmctc3Bpbm5lciI+PC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIiBpbW1lZGlhdGUtdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBtYXg9IltbX2JpZ2dlc3RTdGVwRXZlclNlZW5dXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWF4U3RlcEluZGV4XV0iPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIiIGltbWVkaWF0ZS12YWx1ZT0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIG1heD0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGgyPgogICAgICAgIEhlYWx0aCBQaWxsCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGVdXSI+CiAgICAgICAgICBDb3VudHMgZm9yIFNlbGVjdGVkIE5vZGUKICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZV1dIj4KICAgICAgICAgIExlZ2VuZAogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaGVhbHRoUGlsbEVudHJpZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhbHRoLXBpbGwtZW50cnkiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItcHJldmlldyIgc3R5bGU9ImJhY2tncm91bmQ6W1tpdGVtLmJhY2tncm91bmRfY29sb3JdXSI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sYWJlbCI+W1tpdGVtLmxhYmVsXV08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRlbnNvci1jb3VudCI+CiAgICAgICAgICAgIFtbX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZyhoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlLAogICAgICAgICAgICBpbmRleCldXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyhkZWJ1Z2dlck51bWVyaWNBbGVydHMpXV0iPgogICAgICAgIDxoMiBpZD0ibnVtZXJpYy1hbGVydHMtaGVhZGVyIj5OdW1lcmljIEFsZXJ0czwvaDI+CiAgICAgICAgPHA+CiAgICAgICAgICBBbGVydHMgYXJlIHNvcnRlZCBmcm9tIHRvcCB0byBib3R0b20gYnkgaW5jcmVhc2luZyB0aW1lc3RhbXAuCiAgICAgICAgCiAgICAgICAgPGRpdiBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUtY29udGFpbmVyIj4KICAgICAgICAgIDx0YWJsZSBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUiPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpcnN0IE9mZmVuc2U8L3RoPgogICAgICAgICAgICAgICAgPHRoPlRlbnNvciAoRGV2aWNlKTwvdGg+CiAgICAgICAgICAgICAgICA8dGggaWQ9ImV2ZW50LWNvdW50cy10aCI+RXZlbnQgQ291bnRzPC90aD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHkgaWQ9Im51bWVyaWMtYWxlcnRzLWJvZHkiPjwvdGJvZHk+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSI+CiAgICAgICAgPHAgY2xhc3M9Im5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiI+CiAgICAgICAgICBObyBudW1lcmljIGFsZXJ0cyBzbyBmYXIuIFRoYXQgaXMgbGlrZWx5IGdvb2QuIEFsZXJ0cyBpbmRpY2F0ZSB0aGUKICAgICAgICAgIHByZXNlbmNlIG9mIE5hTiBvciAoKy8tKSBJbmZpbml0eSB2YWx1ZXMsIHdoaWNoIG1heSBiZSBjb25jZXJuaW5nLgogICAgICAgIAogICAgICAKICAgIAogIAogIAoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tbGlzdCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWF4LWRldmljZS1waXhlbC1yYXRpbzogMSkgewogICAgICAgIDpob3N0IHsKICAgICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgfQogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIEBhcHBseSAtLWlyb24tbGlzdC1pdGVtcy1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtncmlkXSkpICNpdGVtcyA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNpdGVtcyA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxhcnJheS1zZWxlY3RvciBpZD0ic2VsZWN0b3IiIGl0ZW1zPSJ7e2l0ZW1zfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkSXRlbXN9fSIgc2VsZWN0ZWQtaXRlbT0ie3tzZWxlY3RlZEl0ZW19fSI+PC9hcnJheS1zZWxlY3Rvcj4KCiAgICA8L3RlbXBsYXRlPjwvZG9tLW1vZHVsZT48ZGl2IGlkPSJpdGVtcyI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgoKICA8L3RlbXBsYXRlPgo8L3BhcGVyLW1hdGVyaWFsPjwvdGVtcGxhdGU+PC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWl0ZW0tYm9keSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsgLyogbmVlZGVkIGZvciB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcyB0byB3b3JrIG9uIGZmICovCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICB9CgogICAgICA6aG9zdChbdHdvLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXR3by1saW5lLW1pbi1oZWlnaHQsIDcycHgpOwogICAgICB9CgogICAgICA6aG9zdChbdGhyZWUtbGluZV0pIHsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLWJvZHktdGhyZWUtbGluZS1taW4taGVpZ2h0LCA4OHB4KTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoW3NlY29uZGFyeV0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeS1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtaWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAwOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtZWxsaXBzZSB7CiAgICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCwKICAgICAgLmZhZGVkLWVsbGlwc2UsCiAgICAgIC5mYWRlZC1zZXJpZXMgewogICAgICAgIHN0cm9rZTogdmFyKC0tdGItZ3JhcGgtZmFkZWQpICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxzdmcgaGVpZ2h0PSIwIiB3aWR0aD0iMCIgaWQ9InN2Z0RlZnMiPgogICAgICA8ZGVmcz4KICAgICAgICAKICAgICAgICA8cGF0dGVybiBpZD0icmVjdEhhdGNoIiBwYXR0ZXJudHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIgd2lkdGg9IjUiIGhlaWdodD0iNSIgcGF0dGVybnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNSIgc3R5bGU9InN0cm9rZS13aWR0aDogMSIgLz4KICAgICAgICA8L3BhdHRlcm4+CiAgICAgICAgPHBhdHRlcm4gaWQ9ImVsbGlwc2VIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjIiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGlkPSJzdW1tYXJ5LWljb24iIGZpbGw9IiM4NDg0ODQiIGhlaWdodD0iMTIiIHZpZXdib3g9IjAgMCAyNCAyNCIgd2lkdGg9IjEyIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2RlZnM+CiAgICA8L3N2Zz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdDT05TVCcpXV0iPgogICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxMCAxMCI+CiAgICAgICAgPGNpcmNsZSBjeD0iNSIgY3k9IjUiIHI9IjMiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU1VNTUFSWScpXV0iPgogICAgICA8c3ZnIHdpZHRoJD0iW1toZWlnaHRdXSIgaGVpZ2h0JD0iW1toZWlnaHRdXSIgdmlld2JveD0iMCAwIDI0IDI0IiBmaWxsPSIjODQ4NDg0Ij4KICAgICAgICA8cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnT1AnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTYgOCI+CiAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdlbGxpcHNlJyl9fSIgeD0iOCIgeT0iNCIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ01FVEEnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMzcgMTYiPgogICAgICAgIDxyZWN0IHg9IjEiIHk9IjEiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdyZWN0Jyl9fSIgc3Ryb2tlLXdpZHRoPSIycHgiIGhlaWdodD0iMTQiIHdpZHRoPSIzNSIgcng9IjUiIHJ5PSI1IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU0VSSUVTJyldXSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNiAxNSI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLXZlcnRpY2FsLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnc2VyaWVzJyl9fSIgeD0iMCIgeT0iMiIgLz4KICAgICAgICA8L3N2Zz4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyF2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAyNCAxMCI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdzZXJpZXMnKX19IiB4PSIwIiB5PSIxIiAvPgogICAgICAgIDwvc3ZnPgogICAgICA8L3RlbXBsYXRlPgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ub2RlLWljb24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgLS10Yi1ncmFwaC1mYWRlZDogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRmLWdyYXBoLWljb24gaWQ9Imljb24iIHR5cGU9IltbX2dldFR5cGUobm9kZSwgc3VtbWFyeSwgY29uc3QsIHR5cGUpXV0iIGhlaWdodD0iW1toZWlnaHRdXSIgZmlsbC1vdmVycmlkZT0iW1tfZmlsbE92ZXJyaWRlXV0iIHN0cm9rZS1vdmVycmlkZT0iW1tfZ2V0U3Ryb2tlT3ZlcnJpZGUoX2ZpbGxPdmVycmlkZSldXSIgZmFkZWQ9IltbX2dldEZhZGVkKHJlbmRlckluZm8pXV0iIHZlcnRpY2FsPSJbW19pc1ZlcnRpY2FsKG5vZGUsIHZlcnRpY2FsKV1dIj48L3RmLWdyYXBoLWljb24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAjbGlzdC1pdGVtIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIC5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuIHsKICAgICAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbS5leGNsdWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuLmVkZ2UtbGFiZWwgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmZhZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgIDwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXgtaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgLmluY29tcGF0aWJsZS1vcHMtbGlzdCB7CiAgICAgICAgaGVpZ2h0OiAzNTBweDsKICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICBpcm9uLWxpc3QgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGJhY2tncm91bmQ6ICNlOWU5ZTk7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIGNvbG9yOiAjNWU1ZTVlOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ub24tY29udHJvbC1saXN0LWl0ZW0gewogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC1kaXNwbGF5IHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgc3ZnLm9wLWNvbXBhdCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGhlaWdodDogMjVweDsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC12YWx1ZSB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pdGVtPgogICAgICA8cGFwZXItaXRlbS1ib2R5IHR3by1saW5lPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfZXhwYW5kZWQpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlRXhwYW5kZWQiIGNsYXNzPSJ0b2dnbGUtYnV0dG9uIj4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJub2RlLW5hbWUiIGlkPSJub2RldGl0bGUiPltbbm9kZVRpdGxlXV08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3AtY29tcGF0LWRpc3BsYXkiPgogICAgICAgICAgICAgIDxzdmcgY2xhc3M9Im9wLWNvbXBhdCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDI1MCAyNSI+CiAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgPGxpbmVhcmdyYWRpZW50IGlkPSJvcC1jb21wYXQtZmlsbCI+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BJbmNvbXBhdENvbG9yXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3IkPSJbW19vcEluY29tcGF0Q29sb3IgXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgPC9saW5lYXJncmFkaWVudD4KICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgIDxyZWN0IGhlaWdodD0iMjUiIHdpZHRoPSIyNTAiIHJ4PSI1IiByeT0iNSIgc3R5bGU9ImZpbGw6IHVybCgnI29wLWNvbXBhdC1maWxsJyk7IiAvPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wLWNvbXBhdC12YWx1ZSI+W1tfb3BDb21wYXRTY29yZUxhYmVsXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci1pdGVtLWJvZHk+CiAgICA8L3BhcGVyLWl0ZW0+CgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgSW5jb21wYXRpYmxlIE9wZXJhdGlvbnM6ICg8c3Bhbj5bW190b3RhbEluY29tcGF0T3BzXV08L3NwYW4+KQogICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0iaW5jb21wYXRpYmxlLW9wcy1saXN0IiBpZD0iaW5jb21wYXRpYmxlT3BzTGlzdCIgaXRlbXM9IltbX2luY29tcGF0aWJsZU9wTm9kZXNdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW19nZXRSZW5kZXJJbmZvKGl0ZW0ubmFtZSwgcmVuZGVySGllcmFyY2h5KV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGl0ZW0tdHlwZT0iaW5jb21wYXRpYmxlLW9wcyI+CiAgICAgICAgICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tY29sbGFwc2U+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbm9kZS1saXN0LWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3BhbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQwcHg7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0uZXhjbHVkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3Bhbi5lZGdlLWxhYmVsIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDFweDsKICAgICAgICBsZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPjwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJlZGdlLWxhYmVsIj5bW2VkZ2VMYWJlbF1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLW5vZGUtaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuc3ViLWxpc3QtZ3JvdXAgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMzAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CgogICAgICAuYXR0ci1sZWZ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICB3aWR0aDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLmF0dHItcmlnaHQgewogICAgICAgIG1hcmdpbi1sZWZ0OiAzMCU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogdGFibGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLXJvdyAuc3ViLWxpc3QtdGFibGUtY2VsbDpsYXN0LWNoaWxkIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLWNlbGwgewogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDsKICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICB9CgogICAgICBwYXBlci1pdGVtLWJvZHlbdHdvLWxpbmVdIHsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDRweDsKICAgICAgfQoKICAgICAgLmV4cGFuZGVkSW5mbyB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sRGVwcyB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgOHB4OwogICAgICB9CgogICAgICAubm9kZS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBmb250LXNpemU6IDE0cHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAuc3VidGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICBjb2xvcjogIzVlNWU1ZTsKICAgICAgfQoKICAgICAgLmNvbnRyb2xMaW5lIHsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuY29udHJvbC10b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGUtZ3JvdXAgewogICAgICAgIHBhZGRpbmctdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZSB7CiAgICAgICAgbWFyZ2luOiA1cHggNnB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB0OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAubm9uLWNvbnRyb2wtbGlzdC1pdGVtIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItaXRlbT4KICAgICAgPHBhcGVyLWl0ZW0tYm9keSB0d28tbGluZT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX2V4cGFuZGVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUV4cGFuZGVkIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIiBpZD0ibm9kZXRpdGxlIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDx0Zi1ub2RlLWljb24gY2xhc3M9Im5vZGUtaWNvbiIgbm9kZT0iW1tfbm9kZV1dIiByZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhncmFwaE5vZGVOYW1lLCByZW5kZXJIaWVyYXJjaHkpXV0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+PC90Zi1ub2RlLWljb24+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUub3B9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgICBPcGVyYXRpb246CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5vcF1dPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUubWV0YWdyYXBofX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgU3ViZ3JhcGg6CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5jYXJkaW5hbGl0eV1dPC9zcGFuPiBub2RlcwogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvcGFwZXItaXRlbS1ib2R5PgogICAgPC9wYXBlci1pdGVtPgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgYXR0cmlidXRlcyI+CiAgICAgICAgICAgIEF0dHJpYnV0ZXMgKDxzcGFuPltbX2F0dHJpYnV0ZXMubGVuZ3RoXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImF0dHJpYnV0ZXNMaXN0IiBpdGVtcz0iW1tfYXR0cmlidXRlc11dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPltbaXRlbS5rZXldXTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLXJpZ2h0Ij5bW2l0ZW0udmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2RldmljZX19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgZGV2aWNlIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPkRldmljZTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItcmlnaHQiPltbX2RldmljZV1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBwcmVkZWNlc3NvcnMiPgogICAgICAgICAgICBJbnB1dHMgKDxzcGFuPltbX3RvdGFsUHJlZGVjZXNzb3JzXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImlucHV0c0xpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMucmVndWxhcl1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0gY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIgY2FyZC1ub2RlPSJbW19ub2RlXV0iIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIgZWRnZS1sYWJlbD0iW1tpdGVtLmVkZ2VMYWJlbF1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgIDwvdGYtbm9kZS1saXN0LWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcHJlZGVjZXNzb3JzLmNvbnRyb2wubGVuZ3RoXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xEZXBzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xMaW5lIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX29wZW5lZENvbnRyb2xQcmVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xQcmVkIiBjbGFzcz0iY29udHJvbC10b2dnbGUtYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sUHJlZH19IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfb3BlbmVkQ29udHJvbFByZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0icHJlZGVjZXNzb3JzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHN1Y2Nlc3NvcnMiPgogICAgICAgICAgICBPdXRwdXRzICg8c3Bhbj5bW190b3RhbFN1Y2Nlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpZD0ib3V0cHV0c0xpc3QiIGl0ZW1zPSJbW19zdWNjZXNzb3JzLnJlZ3VsYXJdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGVkZ2UtbGFiZWw9IltbaXRlbS5lZGdlTGFiZWxdXSIgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgaXRlbS10eXBlPSJzdWNjZXNzb3IiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N1Y2Nlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfb3BlbmVkQ29udHJvbFN1Y2MpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlQ29udHJvbFN1Y2MiIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7X29wZW5lZENvbnRyb2xTdWNjfX0iIG5vLWFuaW1hdGlvbj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaXRlbXM9IltbX3N1Y2Nlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0ic3VjY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaGFzRGlzcGxheWFibGVOb2RlU3RhdHN9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIG5vZGUtc3RhdHMiPgogICAgICAgICAgICAgIE5vZGUgU3RhdHMKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy50b3RhbEJ5dGVzfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPk1lbW9yeTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXNdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2dldFRvdGFsTWljcm9zKF9ub2RlU3RhdHMpfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPkNvbXB1dGUgVGltZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWVdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy5vdXRwdXRTaXplfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPlRlbnNvciBPdXRwdXQgU2l6ZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW1dXSA8YnI+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2Z1bmN0aW9uVXNhZ2VzLmxlbmd0aF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgICBVc2FnZXMgb2YgdGhlIEZ1bmN0aW9uICg8c3Bhbj5bW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXTwvc3Bhbj4pCiAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGlkPSJmdW5jdGlvblVzYWdlc0xpc3QiIGl0ZW1zPSJbW19mdW5jdGlvblVzYWdlc11dIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9ImZ1bmN0aW9uVXNhZ2VzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzTGlicmFyeUZ1bmN0aW9uKF9ub2RlKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWluY2x1ZGUtZ3JvdXAiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIGNsYXNzPSJ0b2dnbGUtaW5jbHVkZSIgb24tY2xpY2s9Il90b2dnbGVJbmNsdWRlIj4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2F1eEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaXNJblNlcmllcyhfbm9kZSl9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idG9nZ2xlLWluY2x1ZGUiIG9uLWNsaWNrPSJfdG9nZ2xlR3JvdXAiPgogICAgICAgICAgICAgICAgPHNwYW4+W1tfZ3JvdXBCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1pbmZvIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNjUwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7c2VsZWN0ZWROb2RlfX0iPgogICAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBjbGFzcz0iY2FyZCI+CiAgICAgICAgPHRmLW5vZGUtaW5mbyBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZmxhdC1ncmFwaD0iW1tncmFwaF1dIiBncmFwaC1ub2RlLW5hbWU9Iltbc2VsZWN0ZWROb2RlXV0iIG5vZGUtaW5jbHVkZT0iW1tzZWxlY3RlZE5vZGVJbmNsdWRlXV0iIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSI+CiAgICAgICAgPC90Zi1ub2RlLWluZm8+CiAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIG5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iPgogICAgICA8L3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGVhbHRoUGlsbHNBdmFpbGFibGUoZGVidWdnZXJEYXRhRW5hYmxlZCwgbm9kZU5hbWVzVG9IZWFsdGhQaWxscyldXSI+CiAgICAgIDx0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3toaWdobGlnaHRlZE5vZGV9fSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19Ij4KICAgICAgPC90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQ+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1ib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6Omhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAvZGVlcC8gLmNsb3NlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGxlZnQ6IDE1cHg7CiAgICAgICAgYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nIHsKICAgICAgICBjdXJzb3I6IHByb2dyZXNzOwogICAgICAgIG9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nLmVycm9yIHsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgIH0KCiAgICAgICNpbmZvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDVweDsKICAgICAgICB0b3A6IDVweDsKICAgICAgICBwYWRkaW5nOiAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAzODBweDsKICAgICAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgfQoKICAgICAgI21haW4gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNDBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLW1zZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXByb2dyZXNzIHsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IDZweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogI2YzOTEzZTsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgewogICAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIGxpIHsKICAgICAgICBwYWRkaW5nOiA0cHggMTZweDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc05vdENvbXBsZXRlKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtYmFyIj4KICAgICAgICA8ZGl2IGlkPSJwcm9ncmVzcy1tc2ciPltbcHJvZ3Jlc3MubXNnXV08L2Rpdj4KICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgdmFsdWU9IltbcHJvZ3Jlc3MudmFsdWVdXSI+PC9wYXBlci1wcm9ncmVzcz4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPGRpdiBjbGFzcyQ9IltbX2dldENvbnRhaW5lckNsYXNzKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0ibWFpbiI+CiAgICAgICAgPHRmLWdyYXBoIGlkPSJncmFwaCIgZ3JhcGgtaGllcmFyY2h5PSJ7e2dyYXBoSGllcmFyY2h5fX0iIGJhc2ljLWdyYXBoPSJbW2dyYXBoXV0iIGhpZXJhcmNoeS1wYXJhbXM9IltbaGllcmFyY2h5UGFyYW1zXV0iIHJlbmRlci1oaWVyYXJjaHk9Int7cmVuZGVySGllcmFyY2h5fX0iIGRldmljZXMtZm9yLXN0YXRzPSJbW2RldmljZXNGb3JTdGF0c11dIiBzdGF0cz0iW1tzdGF0c11dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBoaWdobGlnaHRlZC1ub2RlPSJ7e19oaWdobGlnaHRlZE5vZGV9fSIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBjb2xvci1ieS1wYXJhbXM9Int7Y29sb3JCeVBhcmFtc319IiBwcm9ncmVzcz0ie3twcm9ncmVzc319IiBlZGdlLWxhYmVsLWZ1bmN0aW9uPSJbW2VkZ2VMYWJlbEZ1bmN0aW9uXV0iIGVkZ2Utd2lkdGgtZnVuY3Rpb249IltbZWRnZVdpZHRoRnVuY3Rpb25dXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJbW2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIgaGFuZGxlLW5vZGUtc2VsZWN0ZWQ9IltbaGFuZGxlTm9kZVNlbGVjdGVkXV0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImluZm8iPgogICAgICAgIDx0Zi1ncmFwaC1pbmZvIGlkPSJncmFwaC1pbmZvIiB0aXRsZT0ic2VsZWN0ZWQiIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBncmFwaD0iW1tncmFwaF1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1ub2RlLWluY2x1ZGU9Int7X3NlbGVjdGVkTm9kZUluY2x1ZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgZGVidWdnZXItZGF0YS1lbmFibGVkPSJbW2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tkZWJ1Z2dlck51bWVyaWNBbGVydHNdXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IiBjb21wYXQtbm9kZS10aXRsZT0iW1tjb21wYXROb2RlVGl0bGVdXSIgb24tbm9kZS10b2dnbGUtaW5jbHVzaW9uPSJfb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZCIgb24tbm9kZS10b2dnbGUtc2VyaWVzZ3JvdXA9Il9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQiPjwvdGYtZ3JhcGgtaW5mbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJhZGlvLWJ1dHRvbiI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplLCAxNnB4KTsKICAgICAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlIGluIGBhdHRhY2hlZGAuICovCiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZTogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplLCAtMXB4KTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgI3JhZGlvQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tcmFkaW8tY29udGFpbmVyOwogICAgICB9CgogICAgICAjaW5rIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgI2lua1tjaGVja2VkXSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICAjb2ZmUmFkaW8sICNvblJhZGlvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtYmFja2dyb3VuZC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjI4czsKICAgICAgfQoKICAgICAgI29uUmFkaW8gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNvZmZSYWRpbyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNvblJhZGlvIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC41KTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsIHsKICAgICAgICBsaW5lLWhlaWdodDogbm9ybWFsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBtYXJnaW4tbGVmdDogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDEwcHgpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjcmFkaW9MYWJlbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLWNoZWNrZWQ7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsOmRpcihydGwpIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1zcGFjaW5nLCAxMHB4KTsKICAgICAgfQoKICAgICAgI3JhZGlvTGFiZWxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogZGlzYWJsZWQgc3RhdGUgKi8KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNvZmZSYWRpbyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNvblJhZGlvIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNyYWRpb0xhYmVsIHsKICAgICAgICAvKiBzbGlnaHRseSBkYXJrZXIgdGhhbiB0aGUgYnV0dG9uLCBzbyB0aGF0IGl0J3MgcmVhZGFibGUgKi8KICAgICAgICBvcGFjaXR5OiAwLjY1OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InJhZGlvQ29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ib2ZmUmFkaW8iPjwvZGl2PgogICAgICA8ZGl2IGlkPSJvblJhZGlvIj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InJhZGlvTGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJhZGlvLWdyb3VwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgcGFkZGluZzogdmFyKC0tcGFwZXItcmFkaW8tZ3JvdXAtaXRlbS1wYWRkaW5nLCAxMnB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9vbHRpcCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgei1pbmRleDogMTAwMjsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9vbHRpcC1iYWNrZ3JvdW5kLCAjNjE2MTYxKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbHRpcC10ZXh0LWNvbG9yLCB3aGl0ZSk7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2NhbGVVcCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjApOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTY2FsZURvd24gewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lRmFkZUluT3BhY2l0eSB7CiAgICAgICAgMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lRmFkZU91dE9wYWNpdHkgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNsaWRlRG93bkluIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgICAxMCUgewogICAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTbGlkZURvd25PdXQgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgICAgMTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmZhZGUtaW4tYW5pbWF0aW9uIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZUZhZGVJbk9wYWNpdHk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuZmFkZS1vdXQtYW5pbWF0aW9uIHsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVGYWRlT3V0T3BhY2l0eTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2NhbGUtdXAtYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTY2FsZVVwOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24taW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNjYWxlLWRvd24tYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2NhbGVEb3duOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zbGlkZS1kb3duLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNsaWRlRG93bkluOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNsaWRlLWRvd24tYW5pbWF0aW9uLW91dCB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2xpZGVEb3duT3V0OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5jYW5jZWwtYW5pbWF0aW9uIHsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IC0zMHMgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLyogVGhhbmtzIElFIDEwLiAqLwoKICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRvb2x0aXAiIGNsYXNzPSJoaWRkZW4iPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW5vZGUtc2VhcmNoIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJzZWFyY2gtY29udGFpbmVyIj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJydW5zLXJlZ2V4IiBsYWJlbD0iU2VhcmNoIG5vZGVzLiBSZWdleGVzIHN1cHBvcnRlZC4iIHZhbHVlPSJ7e19yYXdSZWdleElucHV0fX0iPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8ZGl2IGlkPSJzZWFyY2gtcmVzdWx0cy1hbmNob3IiPgogICAgICAgIDxkaXYgaWQ9InNlYXJjaC1yZXN1bHRzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3JlZ2V4TWF0Y2hlc11dIj4KICAgICAgICAgICAgPGRpdiBpZD0ic2VhcmNoLW1hdGNoIiBvbi1jbGljaz0iX21hdGNoQ2xpY2tlZCI+W1tpdGVtXV08L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzZWFyY2gtY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgI3J1bnMtcmVnZXggewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjc2VhcmNoLXJlc3VsdHMtYW5jaG9yIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtcmVzdWx0cyB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjc2VhcmNoLW1hdGNoIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlyZWN0aW9uOiBydGw7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtbWF0Y2g6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLW9yYW5nZS13ZWFrKTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1jb250cm9scyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgfQogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxNXB4OwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTVweDsKICAgICAgICAtLXByaW1hcnktdGV4dC1jb2xvcjogZ3JheTsKICAgICAgICAtLXBhcGVyLWl0ZW0tbWluLWhlaWdodDogMzBweDsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMgewogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5ydW4tZHJvcGRvd24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA4cHggMCA4cHggMTBweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5jb2xvci1kcm9wZG93biB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXI6IHsKICAgICAgICAgIHBhZGRpbmc6IDlweCAwIDAgMTNweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlIHsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiAwOwogICAgICB9CgogICAgICB0YWJsZSB0ZCB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyB7CiAgICAgICAgcGFkZGluZzogMCAyMHB4IDIwcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtaG9sZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgY29sb3I6ICM1NTU7CiAgICAgICAgcGFkZGluZzogMTVweCAyMHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAudG9nZ2xlLWxlZ2VuZC1idXR0b24gewogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGVnZW5kLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CiAgICAgIHN2Zy5pY29uLAogICAgICB0Zi1ncmFwaC1pY29uIHsKICAgICAgICB3aWR0aDogNjBweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmRvbWFpblZhbHVlcyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICB3aWR0aDogMTY1cHg7CiAgICAgIH0KICAgICAgLmRvbWFpblN0YXJ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAuZG9tYWluRW5kIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgLmNvbG9yQm94IHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLmltYWdlLWljb24gewogICAgICAgIHdpZHRoOiAyNHB4OwogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLmhlbHAtaWNvbiB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuZ3JheSB7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIG1hcmdpbjogOHB4IDVweCA4cHggMDsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgIH0KICAgICAgLnRpdGxlIHNtYWxsIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIC5kZXZpY2VMaXN0LAogICAgICAueGxhQ2x1c3Rlckxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNmaWxlIHsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgfQoKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CgogICAgICAuY29sb3ItbGVnZW5kLXJvdyAubGFiZWwsCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHN2ZywKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgZmxleDogMCAwIDQwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICB9CgogICAgICAuZGV2aWNlcy1jaGVja2JveCBpbnB1dCB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAuY29udHJvbC1ob2xkZXIgLmljb24tYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luOiAwIC01cHg7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CgogICAgICAuYnV0dG9uLXRleHQgewogICAgICAgIHBhZGRpbmctbGVmdDogMjBweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgLnVwbG9hZC1idXR0b24gewogICAgICAgIHdpZHRoOiAxNjVweDsKICAgICAgICBoZWlnaHQ6IDI1cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CgogICAgICAuYnV0dG9uLWljb24gewogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4taW5wdXQgewogICAgICAgIGhlaWdodDogMHB4OwogICAgICAgIHdpZHRoOiAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC5jb250cm9sLWhvbGRlciB7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAuY29udHJvbC1ob2xkZXIgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgc3Bhbi5jb3VudGVyIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgIH0KCiAgICAgIC5ydW5zIHBhcGVyLWl0ZW0gewogICAgICAgIC0tcGFwZXItaXRlbTogewogICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgfQoKICAgICAgdGFibGUudGYtZ3JhcGgtY29udHJvbHMgdGQuaW5wdXQtZWxlbWVudC10YWJsZS1kYXRhIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICAuc3BhY2VyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIC5jb2xvci10ZXh0IHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAvKiogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyB0aGF0IHN1cHByZXNzIHBvaW50ZXIgZXZlbnRzIGZvciBkaXNhYmxlZCBidXR0b25zLiBPdGhlcndpc2UsIHRoZSAqLwogICAgICAvKiAgdG9vbHRpcHMgZG8gbm90IGFwcGVhci4gKi8KICAgICAgcGFwZXItcmFkaW8tZ3JvdXAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0byAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubGVnZW5kLWNsYXJpZmllciB7CiAgICAgICAgY29sb3I6ICMyNjYyMzY7CiAgICAgICAgY3Vyc29yOiBoZWxwOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1jbGFyaWZpZXIgcGFwZXItdG9vbHRpcCB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICB9CgogICAgICAvKiogT3RoZXJ3aXNlLCBwb2x5bWVyIFVJIGNvbnRyb2xzIGFwcGVhciBhdG9wIG5vZGUgc2VhcmNoLiAqLwogICAgICB0Zi1ncmFwaC1ub2RlLXNlYXJjaCB7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImFsbGNvbnRyb2xzIj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDx0Zi1ncmFwaC1ub2RlLXNlYXJjaCBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIj48L3RmLWdyYXBoLW5vZGUtc2VhcmNoPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9Imljb24tYnV0dG9uIiBvbi10YXA9Il9maXQiIGFsdD0iRml0IHRvIHNjcmVlbiI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImFzcGVjdC1yYXRpbyIgY2xhc3M9ImJ1dHRvbi1pY29uIj48L2lyb24taWNvbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24tdGV4dCI+Rml0IHRvIFNjcmVlbjwvc3Bhbj4KICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpY29uLWJ1dHRvbiIgb24tY2xpY2s9ImRvd25sb2FkIiBhbHQ9IkRvd25sb2FkIFBORyI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImZpbGUtZG93bmxvYWQiIGNsYXNzPSJidXR0b24taWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXRleHQiPkRvd25sb2FkIFBORzwvc3Bhbj4KICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICA8YSBocmVmPSIjIiBpZD0iZ3JhcGhkb3dubG9hZCIgY2xhc3M9InRpdGxlIiBkb3dubG9hZD0iZ3JhcGgucG5nIj48L2E+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciBydW5zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+CiAgICAgICAgICBSdW4gPHNwYW4gY2xhc3M9ImNvdW50ZXIiPihbW2RhdGFzZXRzLmxlbmd0aF1dKTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIG5vaW5rIGhvcml6b250YWwtYWxpZ249ImxlZnQiIGNsYXNzPSJydW4tZHJvcGRvd24iPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFJ1bkluZGV4fX0iIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2RhdGFzZXRzXV0iPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbaXRlbS5uYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dTZXNzaW9uUnVuc0Ryb3Bkb3duXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgVGFnCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudGVyIj4oW1tfbnVtVGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0pPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIGhvcml6b250YWwtYWxpZ249ImxlZnQiIG5vaW5rIGNsYXNzPSJydW4tZHJvcGRvd24iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVGFnSW5kZXh9fSIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZ2V0VGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtLmRpc3BsYXlOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd1VwbG9hZEJ1dHRvbl1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+VXBsb2FkPC9kaXY+CiAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idXBsb2FkLWJ1dHRvbiIgb24tY2xpY2s9Il9nZXRGaWxlIiB0aXRsZT0iVXBsb2FkIGEgZ3JhcGggcGJ0eHQgZmlsZSB0byB2aWV3IHRoZSBncmFwaCI+CiAgICAgICAgICAgIENob29zZSBGaWxlCiAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhpZGRlbi1pbnB1dCI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iZmlsZSIgbmFtZT0iZmlsZSIgb24tY2hhbmdlPSJfdXBkYXRlRmlsZUlucHV0IiBhY2NlcHQ9Ii5wYnR4dCI+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRHcmFwaFR5cGV9fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0ib3BfZ3JhcGgiIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25PcEdyYXBoRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSI+R3JhcGg8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY29uY2VwdHVhbF9ncmFwaCIgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvbkNvbmNlcHR1YWxHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iPkNvbmNlcHR1YWwgR3JhcGg8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0icHJvZmlsZSIgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvblByb2ZpbGVEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIj5Qcm9maWxlPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3t0cmFjZUlucHV0c319IiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICBUcmFjZSBpbnB1dHMKICAgICAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWFsdGhQaWxsc0ZlYXR1cmVFbmFibGVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGNoZWNrZWQ9Int7aGVhbHRoUGlsbHNUb2dnbGVkT259fSIgY2xhc3M9InRpdGxlIj5TaG93IGhlYWx0aCBwaWxsczwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5Db2xvcjwvZGl2PgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ie3tjb2xvckJ5fX0iPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJzdHJ1Y3R1cmUiPlN0cnVjdHVyZTwvcGFwZXItcmFkaW8tYnV0dG9uPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZGV2aWNlIj5EZXZpY2U8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ4bGEtY2x1c3Rlci1yYWRpby1idXR0b24iIG5hbWU9InhsYV9jbHVzdGVyIiBkaXNhYmxlZD0iW1shX3hsYUNsdXN0ZXJzUHJvdmlkZWQocmVuZGVySGllcmFyY2h5KV1dIj4KICAgICAgICAgICAgWExBIENsdXN0ZXIKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InhsYS1jbHVzdGVyLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSBYTEEgY2x1c3RlciBpcyBvbmx5IGVuYWJsZWQgaWYgYXQgbGVhc3QgMSBvcCBzcGVjaWZpZXMKICAgICAgICAgICAgYW4gWExBIGNsdXN0ZXIuCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIgbmFtZT0iY29tcHV0ZV90aW1lIiBkaXNhYmxlZD0iW1shc3RhdHNdXSI+CiAgICAgICAgICAgIENvbXB1dGUgdGltZQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSBjb21wdXRlIHRpbWUgaXMgb25seSBlbmFibGVkIGlmIHRoZSBSdW5NZXRhZGF0YSBwcm90byBpcwogICAgICAgICAgICBwYXNzZWQgdG8gdGhlIEZpbGVXcml0ZXIgd2hlbiBhIHNwZWNpZmljIHNlc3Npb24gaXMgcnVuLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im1lbW9yeS1yYWRpby1idXR0b24iIG5hbWU9Im1lbW9yeSIgZGlzYWJsZWQ9IltbIXN0YXRzXV0iPgogICAgICAgICAgICBNZW1vcnkKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9Im1lbW9yeS1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgbWVtb3J5IGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgUnVuTWV0YWRhdGEgcHJvdG8gaXMKICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBGaWxlV3JpdGVyIHdoZW4gYSBzcGVjaWZpYyBzZXNzaW9uIGlzIHJ1bi4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iIG5hbWU9Im9wX2NvbXBhdGliaWxpdHkiPgogICAgICAgICAgICBUUFUgQ29tcGF0aWJpbGl0eQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0idHB1LWNvbXBhdGliaWxpdHktcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IHdoZXRoZXIgYW4gb3BlcmF0aW9uIGlzIGNvbXBhdGlibGUgZm9yIHRoZSBUUFUgZGV2aWNlLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgPHNwYW4gY2xhc3M9InNwYWNlciI+PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzR3JhZGllbnRDb2xvcmluZyhzdGF0cywgY29sb3JCeSldXSI+CiAgICAgICAgICA8c3ZnIHdpZHRoPSIxNDAiIGhlaWdodD0iMjAiIHN0eWxlPSJtYXJnaW46IDAgNXB4IiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgIDxsaW5lYXJncmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMTAwJSIgeTI9IjAlIj4KICAgICAgICAgICAgICAgIDxzdG9wIGNsYXNzPSJzdGFydCIgb2Zmc2V0PSIwJSIgc3RvcC1jb2xvciQ9IltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5zdGFydENvbG9yXV0iIC8+CiAgICAgICAgICAgICAgICA8c3RvcCBjbGFzcz0iZW5kIiBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3IkPSJbW19jdXJyZW50R3JhZGllbnRQYXJhbXMuZW5kQ29sb3JdXSIgLz4KICAgICAgICAgICAgICA8L2xpbmVhcmdyYWRpZW50PgogICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMzUiIGhlaWdodD0iMjAiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQpIiBzdHJva2U9ImJsYWNrIiAvPgogICAgICAgICAgPC9zdmc+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5WYWx1ZXMgY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpblN0YXJ0Ij5bW19jdXJyZW50R3JhZGllbnRQYXJhbXMubWluVmFsdWVdXTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5FbmQiPltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5tYXhWYWx1ZV1dPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxiciBzdHlsZT0iY2xlYXI6IGJvdGgiPgogICAgICAgICAgPGRpdj5EZXZpY2VzIGluY2x1ZGVkIGluIHN0YXRzOjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGV2aWNlTGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnREZXZpY2VzXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3cgZGV2aWNlcy1jaGVja2JveCI+CiAgICAgICAgICAgICAgICA8c3Bhbj48aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlJD0iW1tpdGVtLmRldmljZV1dIiBjaGVja2VkJD0iW1tpdGVtLnVzZWRdXSIgb24tY2xpY2s9Il9kZXZpY2VDaGVja2JveENsaWNrZWQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuPltbaXRlbS5zdWZmaXhdXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpdGVtLmlnbm9yZWRNc2ddXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJoZWxwIiBjbGFzcz0iaGVscC1pY29uIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCIgYW5pbWF0aW9uLWRlbGF5PSIwIj5bW2l0ZW0uaWdub3JlZE1zZ11dPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ3N0cnVjdHVyZScpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCI+CiAgICAgICAgICAgICAgICBjb2xvcnMKICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+c2FtZSBzdWJzdHJ1Y3R1cmU8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZWVlIiBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmlxdWUgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ2RldmljZScpXV0iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudERldmljZVBhcmFtc11dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IltbaXRlbS5jb2xvcl1dIiBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPltbaXRlbS5kZXZpY2VdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2VlZSIgc3Ryb2tlLW92ZXJyaWRlPSIjYTZhNmE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBkZXZpY2U8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAneGxhX2NsdXN0ZXInKV1dIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnRYbGFDbHVzdGVyUGFyYW1zXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI3VuZmlsbGVkLXJlY3QiIHg9IjAiIHk9IjAiIHN0eWxlPSJmaWxsOltbaXRlbS5jb2xvcl1dIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5bW2l0ZW0ueGxhX2NsdXN0ZXJdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgIDx1c2UgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhsaW5rOmhyZWY9IiNncmV5LXJlY3QiIHg9IjAiIHk9IjAiIC8+CiAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBYTEEgY2x1c3Rlcjwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdvcF9jb21wYXRpYmlsaXR5JyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci10ZXh0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iT1AiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiMwZjlkNTgiIHN0cm9rZS1vdmVycmlkZT0iI2NjYyI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPlZhbGlkIE9wPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iT1AiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiNkYjQ0MzciIHN0cm9rZS1vdmVycmlkZT0iI2NjYyI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPkludmFsaWQgT3A8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N0YXRzTm90TnVsbChzdGF0cyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmFkZWQ+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bnVzZWQgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1ob2xkZXIiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlTGVnZW5kSWNvbihfbGVnZW5kT3BlbmVkKV1dIiBvbi1jbGljaz0iX3RvZ2dsZUxlZ2VuZE9wZW4iIGNsYXNzPSJ0b2dnbGUtbGVnZW5kLWJ1dHRvbiI+CiAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJ0b2dnbGUtbGVnZW5kLXRleHQiPgogICAgICAgIFtbX2dldFRvZ2dsZVRleHQoX2xlZ2VuZE9wZW5lZCldXQogICAgICA8L3NwYW4+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbGVnZW5kT3BlbmVkXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz0idGl0bGUiPkdyYXBoPC9kaXY+PC90ZD4KICAgICAgICAgICAgICA8dGQ+KCogPSBleHBhbmRhYmxlKTwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZDlkOWQ5IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIE5hbWVzcGFjZTxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVuY2Fwc3VsYXRlcyBhIHNldCBvZiBub2Rlcy4gTmFtZXNwYWNlIGlzIGhpZXJhcmNoaWNhbCBhbmQKICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBzY29wZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBPcE5vZGUKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgcGVyZm9ybXMgYW4gb3BlcmF0aW9uLiBUaGVzZSBub2RlcyBjYW5ub3QgZXhwYW5kLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iU0VSSUVTIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBVbmNvbm5lY3RlZCBzZXJpZXM8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBvZiBudW1iZXJlZCBub2RlcyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIGVhY2gKICAgICAgICAgICAgICAgICAgICBvdGhlci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNFUklFUyIgaGVpZ2h0PSIxNiIgdmVydGljYWw+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgQ29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG9mIG51bWJlcmVkIG5vZGVzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iaWNvbiI+CiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzg0ODQ4NCIgY3g9IjEwIiBjeT0iMTAiIHI9IjUiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIENvbnN0YW50CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IG91dHB1dHMgYSBjb25zdGFudCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNVTU1BUlkiIGhlaWdodD0iMjAiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFN1bW1hcnkKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgY29sbGVjdHMgZGF0YSBmb3IgdmlzdWFsaXphdGlvbiB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZC4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLWxlZ2VuZCIgZmlsbD0iI2JiYiIgbWFya2Vyd2lkdGg9IjEwIiBtYXJrZXJoZWlnaHQ9IjEwIiByZWZ4PSI5IiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+CiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgPHBhdGggbWFya2VyLWVuZD0idXJsKCNkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kKSIgc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBEYXRhZmxvdyBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoZSBkYXRhIGZsb3cgYmV0d2VlbiBvcGVyYXRpb25zLiBFZGdlcyBmbG93CiAgICAgICAgICAgICAgICAgICAgdXB3YXJkcyB1bmxlc3MgYXJyb3doZWFkcyBzcGVjaWZ5IG90aGVyd2lzZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtZGFzaGFycmF5PSIyLCAyIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY3kgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGUgY29udHJvbCBkZXBlbmRlbmN5IGJldHdlZW4gb3BlcmF0aW9ucy4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQiIGZpbGw9IiNGRkI3NEQiIG1hcmtlcndpZHRoPSIxMCIgbWFya2VyaGVpZ2h0PSIxMCIgcmVmeD0iOSIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIiAvPgogICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICAgIDxwYXRoIG1hcmtlci1lbmQ9InVybCgjcmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQpIiBzdHJva2U9IiNGRkI3NEQiIGQ9Ik0yIDkgbCAyOSAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFJlZmVyZW5jZSBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoYXQgdGhlIG91dGdvaW5nIG9wZXJhdGlvbiBub2RlIGNhbiBtdXRhdGUgdGhlCiAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgdGVuc29yLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJlcnJvci1kaWFsb2ciIHdpdGgtYmFja2Ryb3A+PC9wYXBlci1kaWFsb2c+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFzZXRzU3RhdGUoX2RhdGFzZXRzRmV0Y2hlZCwgX2RhdGFzZXRzLCAnRU1QVFknKV1dIj4KICAgICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA1NDBweDsgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOyI+CiAgICAgICAgPGgzPk5vIGdyYXBoIGRlZmluaXRpb24gZmlsZXMgd2VyZSBmb3VuZC48L2gzPgogICAgICAgIDxwPgogICAgICAgICAgVG8gc3RvcmUgYSBncmFwaCwgY3JlYXRlIGEKICAgICAgICAgIDxjb2RlPnRmLnN1bW1hcnkuRmlsZVdyaXRlcjwvY29kZT4KICAgICAgICAgIGFuZCBwYXNzIHRoZSBncmFwaCBlaXRoZXIgdmlhIHRoZSBjb25zdHJ1Y3Rvciwgb3IgYnkgY2FsbGluZyBpdHMKICAgICAgICAgIDxjb2RlPmFkZF9ncmFwaCgpPC9jb2RlPiBtZXRob2QuIFlvdSBtYXkgd2FudCB0byBjaGVjayBvdXQgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9ncmFwaF92aXoiPmdyYXBoIHZpc3VhbGl6ZXIgdHV0b3JpYWw8L2E+LgogICAgICAgIAoKICAgICAgICA8cD4KICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvIGFkZAogICAgICAgICAgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgCgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAKICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhc2V0c1N0YXRlKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgJ1BSRVNFTlQnKV1dIj4KICAgICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgICAgPHRmLWdyYXBoLWNvbnRyb2xzIGlkPSJjb250cm9scyIgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiIGRldmljZXMtZm9yLXN0YXRzPSJ7e19kZXZpY2VzRm9yU3RhdHN9fSIgY29sb3ItYnktcGFyYW1zPSJbW19jb2xvckJ5UGFyYW1zXV0iIHN0YXRzPSJbW19zdGF0c11dIiBjb2xvci1ieT0ie3tfY29sb3JCeX19IiBkYXRhc2V0cz0iW1tfZGF0YXNldHNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tfcmVuZGVySGllcmFyY2h5XV0iIHNlbGVjdGlvbj0ie3tfc2VsZWN0aW9ufX0iIHNlbGVjdGVkLWZpbGU9Int7X3NlbGVjdGVkRmlsZX19IiBzZWxlY3RlZC1ub2RlPSJ7e19zZWxlY3RlZE5vZGV9fSIgaGVhbHRoLXBpbGxzLWZlYXR1cmUtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIiBoZWFsdGgtcGlsbHMtdG9nZ2xlZC1vbj0ie3toZWFsdGhQaWxsc1RvZ2dsZWRPbn19IiBvbi1maXQtdGFwPSJfZml0IiB0cmFjZS1pbnB1dHM9Int7X3RyYWNlSW5wdXRzfX0iPjwvdGYtZ3JhcGgtY29udHJvbHM+CiAgICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgICAgPHRmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIgaWQ9ImxvYWRlciIgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iIHNlbGVjdGlvbj0iW1tfc2VsZWN0aW9uXV0iIHNlbGVjdGVkLWZpbGU9IltbX3NlbGVjdGVkRmlsZV1dIiBvdXQtZ3JhcGgtaGllcmFyY2h5PSJ7e19ncmFwaEhpZXJhcmNoeX19IiBvdXQtZ3JhcGg9Int7X2dyYXBofX0iIG91dC1zdGF0cz0ie3tfc3RhdHN9fSIgcHJvZ3Jlc3M9Int7X3Byb2dyZXNzfX0iIGhpZXJhcmNoeS1wYXJhbXM9IltbX2hpZXJhcmNoeVBhcmFtc11dIiBjb21wYXRpYmlsaXR5LXByb3ZpZGVyPSJbW19jb21wYXRpYmlsaXR5UHJvdmlkZXJdXSI+PC90Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyPgogICAgICAgICAgPHRmLWdyYXBoLWJvYXJkIGlkPSJncmFwaGJvYXJkIiBkZXZpY2VzLWZvci1zdGF0cz0iW1tfZGV2aWNlc0ZvclN0YXRzXV0iIGNvbG9yLWJ5PSJbW19jb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0ie3tfY29sb3JCeVBhcmFtc319IiBncmFwaC1oaWVyYXJjaHk9IltbX2dyYXBoSGllcmFyY2h5XV0iIGdyYXBoPSJbW19ncmFwaF1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIgcHJvZ3Jlc3M9IltbX3Byb2dyZXNzXV0iIGRlYnVnZ2VyLWRhdGEtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIiBhcmUtaGVhbHRoLXBpbGxzLWxvYWRpbmc9IltbX2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tfZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW19ub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iIGFsbC1zdGVwcy1tb2RlLWVuYWJsZWQ9Int7YWxsU3RlcHNNb2RlRW5hYmxlZH19IiBzcGVjaWZpYy1oZWFsdGgtcGlsbC1zdGVwPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0iW1tfaGVhbHRoUGlsbFN0ZXBJbmRleF1dIiByZW5kZXItaGllcmFyY2h5PSJ7e19yZW5kZXJIaWVyYXJjaHl9fSIgc2VsZWN0ZWQtbm9kZT0ie3tfc2VsZWN0ZWROb2RlfX0iIHN0YXRzPSJbW19zdGF0c11dIiB0cmFjZS1pbnB1dHM9IltbX3RyYWNlSW5wdXRzXV0iPjwvdGYtZ3JhcGgtYm9hcmQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC9kZWVwLyB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRpYWxvZyB7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1kaXN0cmlidXRpb24tY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBydW49IltbcnVuXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICAKICAgIDx2ei1kaXN0cmlidXRpb24tY2hhcnQgaWQ9ImNoYXJ0IiB4LXR5cGU9IltbeFR5cGVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSI+PC92ei1kaXN0cmlidXRpb24tY2hhcnQ+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIGhlaWdodDogMjM1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogNzAwcHg7CiAgICAgICAgaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgewogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9InhUeXBlU2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGRpc3RyaWJ1dGlvbiBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgICAoSGlzdG9ncmFtcyBhbmQgZGlzdHJpYnV0aW9ucyBib3RoIHVzZSB0aGUgaGlzdG9ncmFtIHN1bW1hcnkKICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4pCiAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtZGlzdHJpYnV0aW9uLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1oaXN0b2dyYW0tdGltZXNlcmllcyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0idG9vbHRpcCI+PHNwYW4+PC9zcGFuPjwvZGl2PgogICAgPHN2ZyBpZD0ic3ZnIj4KICAgICAgPGc+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeCI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHkiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB5IHNsaWNlIj48L2c+CiAgICAgICAgPGcgY2xhc3M9InN0YWdlIj4KICAgICAgICAgIDxyZWN0IGNsYXNzPSJiYWNrZ3JvdW5kIj48L3JlY3Q+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGNsYXNzPSJ4LWF4aXMtaG92ZXIiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ieS1heGlzLWhvdmVyIj48L2c+CiAgICAgICAgPGcgY2xhc3M9Inktc2xpY2UtYXhpcy1ob3ZlciI+PC9nPgogICAgICA8L2c+CiAgICA8L3N2Zz4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgc3ZnIHsKICAgICAgICBmb250LWZhbWlseTogcm9ib3RvLCBzYW5zLXNlcmlmOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmJhY2tncm91bmQgewogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBmaWxsOiByZWQ7CiAgICAgIH0KCiAgICAgIC5oaXN0b2dyYW0gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuaG92ZXIgewogICAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgICAgIGRvbWluYW50LWJhc2VsaW5lOiBtaWRkbGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyIGNpcmNsZSB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICB9CgogICAgICAuaG92ZXIgdGV4dCB7CiAgICAgICAgZmlsbDogYmxhY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgY2lyY2xlIHsKICAgICAgICBmaWxsOiBibGFjayAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaG92ZXIuaG92ZXItY2xvc2VzdCB0ZXh0IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuYmFzZWxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLm91dGxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAub3V0bGluZS5vdXRsaW5lLWhvdmVyIHsKICAgICAgICBzdHJva2U6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIsCiAgICAgIC55LWF4aXMtaG92ZXIsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIC5sYWJlbCwKICAgICAgLnktYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgLmxhYmVsIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LWFuY2hvcjogZW5kOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHRleHQgewogICAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC55LWF4aXMtaG92ZXIgdGV4dCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktYXhpcy1ob3ZlciBsaW5lLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIGxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktYXhpcy1ob3ZlciByZWN0LAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIHJlY3QgewogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICB9CgogICAgICAuYXhpcyB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICB9CgogICAgICAuYXhpcyBwYXRoLmRvbWFpbiB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgfQoKICAgICAgLmF4aXMgLnRpY2sgbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjZGRkOwogICAgICB9CgogICAgICAuYXhpcy5zbGljZSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmF4aXMuc2xpY2UgLnRpY2sgbGluZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMjsKICAgICAgfQoKICAgICAgLnNtYWxsIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnNtYWxsIC5heGlzIC50aWNrOmZpcnN0LW9mLXR5cGUgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnNtYWxsIC5heGlzIC50aWNrOmxhc3Qtb2YtdHlwZSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAubWVkaXVtIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm1lZGl1bSAuYXhpcyAudGljazpudGgtY2hpbGQoMm4gKyAxKSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAubGFyZ2UgLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAubGFyZ2UgLmF4aXMgLnRpY2s6bnRoLWNoaWxkKDJuICsgMSkgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1oaXN0b2dyYW0tbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgCiAgICA8dnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgaWQ9ImNoYXJ0IiB0aW1lLXByb3BlcnR5PSJbW3RpbWVQcm9wZXJ0eV1dIiBtb2RlPSJbW2hpc3RvZ3JhbU1vZGVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVGdW5jdGlvbl1dIj48L3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzPgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDkwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0iaGlzdG9ncmFtTW9kZVNlbGVjdG9yIiBuYW1lPSJIaXN0b2dyYW0gbW9kZSIgc2VsZWN0ZWQtaWQ9Int7X2hpc3RvZ3JhbU1vZGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im92ZXJsYXkiPm92ZXJsYXk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ib2Zmc2V0Ij5vZmZzZXQ8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lUHJvcGVydHlTZWxlY3RvciIgbmFtZT0iT2Zmc2V0IHRpbWUgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3RpbWVQcm9wZXJ0eX19Ij4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGhpc3RvZ3JhbSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1oaXN0b2dyYW0tbG9hZGVyIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIgdGltZS1wcm9wZXJ0eT0iW1tfdGltZVByb3BlcnR5XV0iIGhpc3RvZ3JhbS1tb2RlPSJbW19oaXN0b2dyYW1Nb2RlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi1oaXN0b2dyYW0tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRleHQtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHJ1bj0iW1tydW5dXSIgdGFnPSJbW3RhZ11dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGlkPSJzdGVwcy1jb250YWluZXIiIGNsYXNzPSJjb250YWluZXIgc2Nyb2xsYmFyIiBzdHlsZT0iYm9yZGVyLWNvbG9yOiBbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdGV4dHNdXSI+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InN0ZXAtY29udGFpbmVyIj4KICAgICAgICAgIHN0ZXAgPHNwYW4gY2xhc3M9InN0ZXAtdmFsdWUiPltbX2Zvcm1hdFN0ZXAoaXRlbS5zdGVwKV1dPC9zcGFuPgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InRleHQiPgogICAgICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tpdGVtLnRleHRdXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgPHN0eWxlIGluY2x1ZGU9InNjcm9sbGJhci1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLnNjcm9sbGJhciB7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgICAjc3RlcHMtY29udGFpbmVyIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgLyogY29sb3IgY29tcHV0ZWQgYW5kIHNldCBhcyBpbmxpbmUgc3R5bGUgKi87CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQogICAgICAudGV4dCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAzcHggM3B4IDNweDsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgICAgfQogICAgICAuc3RlcC1jb250YWluZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4OyAvKiB0byBjb3JyZWN0IGZvciBib3JkZXIgKi8KICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgIH0KICAgICAgLnN0ZXAtY29udGFpbmVyOm5vdCg6Zmlyc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGV4dC1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHRleHQgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgdGV4dCBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi10ZXh0LWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBydW49IltbaXRlbS5ydW5dXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLXRleHQtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSI+PC90Zi1jYXJkLWhlYWRpbmc+CgogICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1tfeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW195VmFsdWVBY2Nlc3Nvcl1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlRnVuY3Rpb25dXSIgZGVmYXVsdC14LXJhbmdlPSJbW19kZWZhdWx0WFJhbmdlXV0iIGRlZmF1bHQteS1yYW5nZT0iW1tfZGVmYXVsdFlSYW5nZV1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIgZGF0YS1zZXJpZXM9IltbcnVuc11dIiBsb2FkLWtleT0iW1t0YWddXSIgZ2V0LWRhdGEtbG9hZC11cmw9IltbX2RhdGFVcmxdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCldXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIj48L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CgogICAgPGRpdiBpZD0iYnV0dG9ucy1yb3ciPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IlJlc2V0IGF4ZXMgdG8gWzAsIDFdLiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InN0ZXAtbGVnZW5kIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTdGVwQXZhaWxhYmxlXV0iIGFzPSJydW4iPgogICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItYm94IiBzdHlsZT0iYmFja2dyb3VuZDogW1tfY29tcHV0ZVJ1bkNvbG9yKHJ1bildXTsiPjwvZGl2PgogICAgICAgICAgW1tydW5dXSBpcyBhdAogICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtbGFiZWwtdGV4dCI+CiAgICAgICAgICAgIHN0ZXAgW1tfY29tcHV0ZUN1cnJlbnRTdGVwRm9yUnVuKF9ydW5Ub1ByQ3VydmVFbnRyeSwgcnVuKV1dIDwvc3Bhbj48YnI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0id2FsbC10aW1lLWxhYmVsLXRleHQiPgogICAgICAgICAgICAoW1tfY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bihfcnVuVG9QckN1cnZlRW50cnksIHJ1bildXSkKICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICB0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiA2MDBweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgICNzdGVwLWxlZ2VuZCB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAubGVnZW5kLXJvdyB7CiAgICAgICAgbWFyZ2luOiA1cHggMCA1cHggMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuY29sb3ItYm94IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMXB4OwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgfQogICAgICAuc3RlcC1sYWJlbC10ZXh0IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAud2FsbC10aW1lLWxhYmVsLXRleHQgewogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTbGlkZXJzXV0iIGFzPSJydW4iPgogICAgICA8ZGl2IGNsYXNzPSJydW4td2lkZ2V0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJydW4tZGlzcGxheS1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0icnVuLWNvbG9yLWJveCIgc3R5bGU9ImJhY2tncm91bmQ6W1tfY29tcHV0ZUNvbG9yRm9yUnVuKHJ1bildXTsiPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icnVuLXRleHQiPgogICAgICAgICAgICBbW3J1bl1dCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwLWRpc3BsYXktY29udGFpbmVyIj4KICAgICAgICAgIFtbX2NvbXB1dGVUaW1lVGV4dEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBfcnVuVG9TdGVwSW5kZXgsCiAgICAgICAgICBydW4sIHRpbWVEaXNwbGF5VHlwZSldXQogICAgICAgIDwvZGl2PgogICAgICAgIDxwYXBlci1zbGlkZXIgZGF0YS1ydW4kPSJbW3J1bl1dIiBzdGVwPSIxIiB0eXBlPSJudW1iZXIiIG1pbj0iMCIgbWF4PSJbW19jb21wdXRlTWF4U3RlcEluZGV4Rm9yUnVuKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIHJ1bildXSIgdmFsdWU9IltbX2dldFN0ZXAoX3J1blRvU3RlcEluZGV4LCBydW4pXV0iIG9uLWltbWVkaWF0ZS12YWx1ZS1jaGFuZ2VkPSJfc2xpZGVyVmFsdWVDaGFuZ2VkIj48L3BhcGVyLXNsaWRlcj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAucnVuLXdpZGdldCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICB9CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgbWFyZ2luOiAtOHB4IDAgMCAtMTVweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc3RlcC1kaXNwbGF5LWNvbnRhaW5lciB7CiAgICAgICAgZm9udC1zaXplOiAwLjllbTsKICAgICAgICBtYXJnaW46IDAgMTVweCAwIDA7CiAgICAgIH0KICAgICAgLnJ1bi10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgLnJ1bi1jb2xvci1ib3ggewogICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgIGhlaWdodDogMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lLXR5cGUtc2VsZWN0b3IiIG5hbWU9IlRpbWUgRGlzcGxheSBUeXBlIiBzZWxlY3RlZC1pZD0ie3tfdGltZURpc3BsYXlUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXNdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iIGlkPSJzdGVwcy1zZWxlY3Rvci1jb250YWluZXIiPgogICAgICAgICAgICA8dGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IgcnVucz0iW1tfcmVsZXZhbnRTZWxlY3RlZFJ1bnNdXSIgcnVuLXRvLXN0ZXA9Int7X3J1blRvU3RlcH19IiBydW4tdG8tYXZhaWxhYmxlLXRpbWUtZW50cmllcz0iW1tfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllc11dIiB0aW1lLWRpc3BsYXktdHlwZT0iW1tfdGltZURpc3BsYXlUeXBlXV0iPjwvdGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gcHJlY2lzaW9u4oCTcmVjYWxsIGN1cnZlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcHJlY2lzaW9u4oCTcmVjYWxsIGRhdGEgdG8geW91ciBldmVudAogICAgICAgICAgICAgICAgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIiBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtcHItY3VydmUtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bnM9IltbaXRlbS5ydW5zXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVucywgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVuLXRvLXN0ZXAtY2FwPSJbW19ydW5Ub1N0ZXBdXSI+PC90Zi1wci1jdXJ2ZS1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIC8qKiBEbyBub3QgbGV0IHRoZSBzdGVwcyBzZWxlY3RvciBvY2NsdWRlIHRoZSBydW4gc2VsZWN0b3IuICovCiAgICAgICNzdGVwcy1zZWxlY3Rvci1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByb2ZpbGUtcmVkaXJlY3QtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgPGgzPlRoZSBwcm9maWxlIHBsdWdpbiBoYXMgbW92ZWQuPC9oMz4KICAgICAgPHA+CiAgICAgICAgUGxlYXNlIGluc3RhbGwgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBwcm9maWxlIHBsdWdpbiBmcm9tIFB5UEkgYnkKICAgICAgICBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmcm9tIHRoZSBtYWNoaW5lIHJ1bm5pbmcgVGVuc29yQm9hcmQ6CiAgICAgIAogICAgICA8dGV4dGFyZWEgaWQ9ImNvbW1hbmRUZXh0YXJlYSIgcmVhZG9ubHkgcm93cz0iMSIgb24tYmx1cj0iX3JlbW92ZUNvcGllZE1lc3NhZ2UiPgpbW19pbnN0YWxsQ29tbWFuZF1dPC90ZXh0YXJlYT4KICAgICAgPGRpdiBpZD0iY29weUNvbnRhaW5lciI+CiAgICAgICAgPHNwYW4gaWQ9ImNvcGllZE1lc3NhZ2UiPjwvc3Bhbj4KICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBvbi10YXA9Il9jb3B5SW5zdGFsbENvbW1hbmQiPkNvcHkgdG8gY2xpcGJvYXJkPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICAubWVzc2FnZSB7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgIH0KICAgICAgI2NvbW1hbmRUZXh0YXJlYSB7CiAgICAgICAgbWFyZ2luLXRvcDogMWV4OwogICAgICAgIHBhZGRpbmc6IDFleCAxZW07CiAgICAgICAgcmVzaXplOiB2ZXJ0aWNhbDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAjY29weUNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAjY29waWVkTWVzc2FnZSB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcGx1Z2luLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX29wZW5dXSI+CiAgICAgIDxkaXYgaWQ9ImRhc2hib2FyZC1iYWNrZHJvcCI+PC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZGlhbG9nIiBtb2RhbCBvcGVuZWQ9Int7X29wZW59fSIgd2l0aC1iYWNrZHJvcD0iW1tfdXNlTmF0aXZlQmFja2Ryb3BdXSI+CiAgICAgIDxoMiBpZD0iZGlhbG9nLXRpdGxlIj5bW190aXRsZV1dPC9oMj4KICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLW1lc3NhZ2UiPltbX2N1c3RvbU1lc3NhZ2VdXTwvZGl2PgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8c3R5bGU+CiAgICAgIC8qKiBXZSByZWx5IG9uIGEgc2VwYXJhdGUgYF9oaWRkZW5gIHByb3BlcnR5IGluc3RlYWQgb2YgZGlyZWN0bHkgbWFraW5nIHVzZQogICAgICAgICAgb2YgdGhlIGBfb3BlbmAgYXR0cmlidXRlIGJlY2F1c2UgdGhpcyBDU1Mgc3BlY2lmaWNhdGlvbiBtYXkgc3RyYW5nZWx5CiAgICAgICAgICBhZmZlY3Qgb3RoZXIgZWxlbWVudHMgdGhyb3VnaG91dCBUZW5zb3JCb2FyZC4gU2VlICM4OTkuICovCiAgICAgICNkYXNoYm9hcmQtYmFja2Ryb3AgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNkaWFsb2ctdGl0bGUgewogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY3VzdG9tLW1lc3NhZ2UgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWJlaG9sZGVyLXZpZGVvIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8aW1nIGlkPSJ2aWRlbyIgc3JjJD0iW1tfaW1hZ2VVUkxdXSI+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIGltZyB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtYmVob2xkZXItaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaXRlbXNdXSI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24taW5mbyIgc3R5bGUkPSJoZWlnaHQ6IFtbaXRlbS5oZWlnaHRdXXB4Ij4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+W1tpdGVtLm5hbWVdXTwvbGk+CiAgICAgICAgICA8bGk+c2hhcGU6IFtbaXRlbS5zaGFwZV1dPC9saT4KICAgICAgICAgIDxsaT5yYW5nZTogWyBbW2l0ZW0ubWluXV0sIFtbaXRlbS5tYXhdXSBdPC9saT4KICAgICAgICAgIDxsaT5tZWFuOiBbW2l0ZW0ubWVhbl1dPC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbi1pbmZvIHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQogICAgICAuc2VjdGlvbi1pbmZvIHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1wbHVnaW4tZGlhbG9nIGlkPSJpbml0aWFsRGlhbG9nIj48L3RmLXBsdWdpbi1kaWFsb2c+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxwIGNsYXNzPSJjb250cm9scy1kaXNhYmxlZC1tZXNzYWdlIj4KICAgICAgICAgICAgICBDb250cm9scyBkaXNhYmxlZDogZGlyZWN0b3J5IGlzIG5vdCB3cml0ZWFibGUuCiAgICAgICAgICAgIAogICAgICAgICAgICA8cCBjbGFzcz0iZGlzY2xhaW1lciI+CiAgICAgICAgICAgICAgQmVob2xkZXIgcmVxdWlyZXMgd3JpdGUgYWNjZXNzIHRvIHRoZSBsb2cgZGlyZWN0b3J5IGluIG9yZGVyIHRvCiAgICAgICAgICAgICAgY29tbXVuaWNhdGUgdmlzdWFsaXphdGlvbiBjaGFuZ2VzIHRvIHRoZSA8Y29kZT5CZWhvbGRlcjwvY29kZT4KICAgICAgICAgICAgICBpbnN0YW5jZSBpbiB5b3VyIG1vZGVsLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMz5WYWx1ZXM8L2gzPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2YWx1ZXNTZWxlY3RvciIgc2VsZWN0ZWQ9Int7X3ZhbHVlc319Ij4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ0cmFpbmFibGVfdmFyaWFibGVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT50Zi50cmFpbmFibGVfdmFyaWFibGVzKCk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1hcnJheXMiIG5hbWU9ImFycmF5cyIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIDxwcmU+Yi51cGRhdGUoYXJyYXlzPVtOUF9BUlJBWVNdKTwvcHJlPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ib3B0aW9uLWZyYW1lcyIgbmFtZT0iZnJhbWVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT5iLnVwZGF0ZShmcmFtZT1OUF9BUlJBWSk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFsdWVzTm90RnJhbWUoX3ZhbHVlcyldXSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19zaG93QWxsfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj5TaG93IGFsbCBkYXRhIDxpPihjYW4gYmUgcmVzb3VyY2UgaW50ZW5zaXZlKTwvaT48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5Nb2RlPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJtb2RlU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19tb2RlfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY3VycmVudCIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgY3VycmVudCB2YWx1ZXMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InZhcmlhbmNlIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICB2YXJpYW5jZSBvdmVyIHRyYWluIHN0ZXBzCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFyaWFuY2VTZWxlY3RlZChfbW9kZSldXSI+CiAgICAgICAgICAgICAgPGg0PlZhcmlhbmNlIHRpbWVzdGVwczoge3tfd2luZG93U2l6ZX19PC9oND4KICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJ3aW5kb3dTbGlkZXIiIHZhbHVlPSJ7e193aW5kb3dTaXplfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIyIiBtYXg9IjIwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5JbWFnZSBzY2FsaW5nPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJzY2FsaW5nU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19zY2FsaW5nfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1sYXllciIgbmFtZT0ibGF5ZXIiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIHBlciBzZWN0aW9uCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbGF5ZXIiIHBvc2l0aW9uPSJyaWdodCI+CiAgICAgICAgICAgICAgICBCbGFjayBpcyB0aGUgbG93ZXN0IHZhbHVlIGluIHRoYXQgc2VjdGlvbiwgd2hpdGUgaXMgdGhhdCBsYXJnZXN0CiAgICAgICAgICAgICAgICB2YWx1ZSBpbiB0aGF0IHNlY3Rpb24uCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJvcHRpb24tbmV0d29yayIgbmFtZT0ibmV0d29yayIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgYWxsIHNlY3Rpb25zCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbmV0d29yayIgcG9zaXRpb249InJpZ2h0Ij4KICAgICAgICAgICAgICAgIEJsYWNrIGlzIHRoZSBzbWFsbGVzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMsIHdoaXRlIGlzIHRoZQogICAgICAgICAgICAgICAgbGFyZ2VzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgICAgPGRpdiBpZD0iY29sb3JtYXAtc2VsZWN0aW9uIj4KICAgICAgICAgICAgICA8ZGl2IGlkPSJjb2xvcm1hcC1zZWxlY3Rpb24tbGFiZWwiPkNvbG9ybWFwOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2NvbG9ybWFwfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bWFnbWE8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmluZmVybm88L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPnBsYXNtYTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+dmlyaWRpczwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+Z3JheXNjYWxlPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGgzPlVwZGF0ZXMgcGVyIHNlY29uZDoge3tfRlBTfX08L2gzPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iRlBTU2xpZGVyIiB2YWx1ZT0ie3tfRlBTfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIwIiBtYXg9IjMwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJyZWNvcmRfYnV0dG9uIiBvbi10YXA9Il90b2dnbGVSZWNvcmQiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICBbW19yZWNvcmRUZXh0XV0KICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgTm90ZTogQmVob2xkZXIgY3VycmVudGx5IG9ubHkgd29ya3Mgd2VsbCBvbiBsb2NhbCBmaWxlIHN5c3RlbXMuCiAgICAgICAgICAKICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc19hY3RpdmVdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gQmVob2xkZXIgZGF0YSB3YXMgZm91bmQuPC9oMz4KCiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3VyIHNjcmlwdCBpc24ndCBydW5uaW5nLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBhcmVuJ3QgY2FsbGluZyA8Y29kZT5iZWhvbGRlci51cGRhdGUoKTwvY29kZT4uPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIFRvIHVzZSBCZWhvbGRlciwgaW1wb3J0IGFuZCBpbnN0YW50aWF0ZSB0aGUKICAgICAgICAgICAgICA8Y29kZT5CZWhvbGRlcjwvY29kZT4gY2xhc3MsIGFuZCBjYWxsIGl0cwogICAgICAgICAgICAgIDxjb2RlPnVwZGF0ZTwvY29kZT4gbWV0aG9kIHdpdGggYSA8Y29kZT5TZXNzaW9uPC9jb2RlPiBhcmd1bWVudAogICAgICAgICAgICAgIGFmdGVyIGV2ZXJ5IHRyYWluIHN0ZXA6CiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuYmVob2xkZXIgaW1wb3J0IEJlaG9sZGVyCmJlaG9sZGVyID0gQmVob2xkZXIoTE9HX0RJUkVDVE9SWSkKCiMgaW5zaWRlIHRyYWluIGxvb3AKYmVob2xkZXIudXBkYXRlKAogIHNlc3Npb249c2VzcywKICBhcnJheXM9bGlzdF9vZl9ucF9hcnJheXMsICAjIG9wdGlvbmFsIGFyZ3VtZW50CiAgZnJhbWU9dHdvX2RpbWVuc2lvbmFsX25wX2FycmF5LCAgIyBvcHRpb25hbCBhcmd1bWVudAopPC9wcmU+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHVzaW5nIDxjb2RlPnRmLnRyYWluLk1vbml0b3JlZFNlc3Npb248L2NvZGU+LCB5b3UgY2FuIHVzZQogICAgICAgICAgICAgIDxjb2RlPkJlaG9sZGVySG9vazwvY29kZT46CiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuYmVob2xkZXIgaW1wb3J0IEJlaG9sZGVySG9vawpiZWhvbGRlcl9ob29rID0gQmVob2xkZXJIb29rKExPR19ESVJFQ1RPUlkpCndpdGggTW9uaXRvcmVkU2Vzc2lvbiguLi4sIGhvb2tzPVtiZWhvbGRlcl9ob29rXSkgYXMgc2VzczoKICBzZXNzLnJ1bih0cmFpbl9vcCk8L3ByZT4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBldmVyeXRoaW5nIGlzIHNldCB1cCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL3RlbnNvcmJvYXJkL3BsdWdpbnMvYmVob2xkZXIvUkVBRE1FLm1kIj50aGUgUkVBRE1FPC9hPgogICAgICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgICBOb3RlOiBCZWhvbGRlciBjdXJyZW50bHkgb25seSB3b3JrcyB3ZWxsIG9uIGxvY2FsIGZpbGUgc3lzdGVtcy4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzX2FjdGl2ZV1dIj4KICAgICAgICAgIDx0Zi1iZWhvbGRlci12aWRlbyBpZD0idmlkZW8iIGZwcz0iW1tfRlBTXV0iPjwvdGYtYmVob2xkZXItdmlkZW8+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgICAgPHRmLWJlaG9sZGVyLWluZm8gaWQ9ImluZm8iIGZwcz0iW1tfRlBTXV0iPiA8L3RmLWJlaG9sZGVyLWluZm8+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwOwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogNXB4OwoKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1yYWRpby1jb250YWluZXI6IHsKICAgICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIGZsZXgtZ3JvdzogMjsKICAgICAgfQoKICAgICAgcHJlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiNyZWNvcmRfYnV0dG9uIHsKICAgICAgICBjb2xvcjogI2QzMmYyZjsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uI3JlY29yZF9idXR0b24uaXMtcmVjb3JkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZDMyZjJmOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbi5iZWhvbGRlci1kYXNoYm9hcmQ6bGFzdC1jaGlsZCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CgogICAgICAjY29sb3JtYXAtc2VsZWN0aW9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbi1sYWJlbCB7CiAgICAgICAgbWFyZ2luLXRvcDogMTNweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbiBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CgogICAgICBoNCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgbWFyZ2luOiA1cHggMDsKICAgICAgfQoKICAgICAgcC5kaXNjbGFpbWVyIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIHAuY29udHJvbHMtZGlzYWJsZWQtbWVzc2FnZSB7CiAgICAgICAgY29sb3I6ICNjMDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tc3BsaXQtbGF5b3V0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCA+ICNzcGxpdHRlciB7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBtaW4td2lkdGg6IDhweDsKICAgICAgICBtaW4taGVpZ2h0OiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvciwgI2NjYyk7CiAgICAgICAgZmlsbDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKTsKICAgICAgICBAYXBwbHkgLS12YWFkaW4tc3BsaXQtbGF5b3V0LXNwbGl0dGVyOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFt2ZXJ0aWNhbF0pKSA+ICNzcGxpdHRlciB7CiAgICAgICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pID4gI3NwbGl0dGVyIHsKICAgICAgICBjdXJzb3I6IG5zLXJlc2l6ZTsKICAgICAgfQoKICAgICAgI2hhbmRsZSwKICAgICAgI3NwbGl0dGVyIDo6c2xvdHRlZChbc2xvdD1oYW5kbGVdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsXSkgPiAjc3BsaXR0ZXIgI2hhbmRsZSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDkwZGVnKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJwcmltYXJ5IiBuYW1lPSJwcmltYXJ5Ij48L3Nsb3Q+CiAgICA8ZGl2IGlkPSJzcGxpdHRlciIgb24tdHJhY2s9Il9vbkhhbmRsZVRyYWNrIiBvbi1kb3duPSJfcHJldmVudERlZmF1bHQiPgogICAgICA8c2xvdCBuYW1lPSJoYW5kbGUiPgogICAgICAgIDxzdmcgaWQ9ImhhbmRsZSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIj4KICAgICAgICAgIDxyZWN0IHg9IjE5IiB5PSI4IiB3aWR0aD0iMiIgaGVpZ2h0PSIyNCI+PC9yZWN0PgogICAgICAgIDwvc3ZnPgogICAgICA8L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzbG90IGlkPSJzZWNvbmRhcnkiIG5hbWU9InNlY29uZGFyeSI+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1xdWVyeS1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9Imh5cGVycGFyYW1ldGVycy1tZXRyaWNzLXN0YXR1c2VzIj4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsIGlkPSJoeXBlcnBhcmFtZXRlcnMtbWV0cmljcyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gaHlwZXJwYXJhbWV0ZXJzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5IeXBlcnBhcmFtZXRlcnM8L2Rpdj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19ocGFyYW1zfX0iIGFzPSJocGFyYW0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aHBhcmFtLmRpc3BsYXllZH19IiBjbGFzcz0iaHBhcmFtLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbS5pbmZvKV1dCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tocGFyYW0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aXRlbS5jaGVja2VkfX0iIGNsYXNzPSJkaXNjcmV0ZS12YWx1ZS1jaGVja2JveCIgb24tY2hhbmdlPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICBbW19wcmV0dHlQcmludChpdGVtLnZhbHVlKV1dCiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbF1dIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1pbiIgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIgYWxsb3dlZF9wYXR0ZXJuPSJbMC05LmVcLV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tocGFyYW0uZmlsdGVyLmludGVydmFsLm1pbi5pbnZhbGlkXV0iIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNYXgiIHZhbHVlPSJ7e2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXC1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbC5tYXguaW52YWxpZF1dIiBwbGFjZWhvbGRlcj0iK2luZmluaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIucmVnZXhwXV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUmVndWxhciBleHByZXNzaW9uIiB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLnJlZ2V4cH19IiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBtZXRyaWNzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5NZXRyaWNzPC9kaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfbWV0cmljc319IiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1ldHJpYyI+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3ttZXRyaWMuZGlzcGxheWVkfX0iIGNsYXNzPSJtZXRyaWMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljLmluZm8pXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lLWVsZW1lbnQiPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWluIiB2YWx1ZT0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1pbi52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTkuZVwtXSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWR9fSIgcGxhY2Vob2xkZXI9Ii1pbmZpbml0eSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50Ij4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05LmVcLV0iIHZhbHVlPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1heC5pbnZhbGlkfX0iIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIHN0YXR1cyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlN0YXR1czwvZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zdGF0dXNlc11dIiBhcz0ic3RhdHVzIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tzdGF0dXMuYWxsb3dlZH19IiBvbi1jaGFuZ2U9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICBbW3N0YXR1cy5kaXNwbGF5TmFtZV1dCiAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbCBpZD0ic29ydGluZy1wYWdpbmciPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBzb3J0aW5nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U29ydGluZzwvZGl2PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU29ydCBieSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc29ydEJ5SW5kZXh9fSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaHBhcmFtc11dIiBhcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW0uaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWV0cmljc11dIiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWMuaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iRGlyZWN0aW9uIiBvbi1zZWxlY3RlZC1pdGVtLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zb3J0RGlyZWN0aW9ufX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+QXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+RGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9InBhZ2luZy1kb3dubG9hZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gcGFnaW5nIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5QYWdpbmc8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgTnVtYmVyIG9mIG1hdGNoaW5nIHNlc3Npb24gZ3JvdXBzOgogICAgICAgICAgICAgICAgW1tfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHJdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2UtbnVtYmVyLWlucHV0Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUGFnZSAjIiB2YWx1ZT0ie3tfcGFnZU51bWJlcklucHV0LnZhbHVlfX0iIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbX3BhZ2VOdW1iZXJJbnB1dC5pbnZhbGlkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD0ic3VmZml4IiBjbGFzcz0icGFnZS1zdWZmaXgiPgogICAgICAgICAgICAgICAgICAgIC8gW1tfcGFnZUNvdW50U3RyXV0KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2Utc2l6ZS1pbnB1dCI+CiAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCAjIG9mIHNlc3Npb24gZ3JvdXBzIHBlciBwYWdlOiIgdmFsdWU9Int7X3BhZ2VTaXplSW5wdXQudmFsdWV9fSIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05XSIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tfcGFnZVNpemVJbnB1dC5pbnZhbGlkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBkb3dubG9hZCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXNzaW9uR3JvdXBzUmVxdWVzdF1dIj4KICAgICAgICAgICAgICAgIERvd25sb2FkIGRhdGEgYXMKICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICA8YSBpZD0iY3N2TGluayIgZG93bmxvYWQ9ImhwYXJhbXNfdGFibGUuY3N2IiBocmVmPSJbW19jc3ZVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIj5DU1Y8L2E+CiAgICAgICAgICAgICAgICAgIDxhIGlkPSJqc29uTGluayIgZG93bmxvYWQ9ImhwYXJhbXNfdGFibGUuanNvbiIgaHJlZj0iW1tfanNvblVybChfc2Vzc2lvbkdyb3Vwc1JlcXVlc3QsIGNvbmZpZ3VyYXRpb24pXV0iPkpTT048L2E+CiAgICAgICAgICAgICAgICAgIDxhIGlkPSJsYXRleExpbmsiIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLnRleCIgaHJlZj0iW1tfbGF0ZXhVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIj5MYVRlWDwvYT4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAucGFuZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuc2VjdGlvbiB7CiAgICAgICAgbWFyZ2luOiA1cHggMTBweCA1cHggMTBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA3cHg7CiAgICAgIH0KICAgICAgI2h5cGVycGFyYW1ldGVycy1tZXRyaWNzLXN0YXR1c2VzIHsKICAgICAgICBmbGV4LWJhc2lzOiA3MCU7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgICNoeXBlcnBhcmFtZXRlcnMtbWV0cmljcyB7CiAgICAgICAgZmxleC1iYXNpczogOTAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuaHlwZXJwYXJhbWV0ZXJzIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubWV0cmljcyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnN0YXR1c2VzIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAjc29ydGluZy1wYWdpbmcgewogICAgICAgIGZsZXgtYmFzaXM6IDMwJTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgI3BhZ2luZy1kb3dubG9hZCB7CiAgICAgICAgZmxleC1iYXNpczogOTAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuc29ydGluZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLnBhZ2luZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLmRvd25sb2FkIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3gsCiAgICAgIC5tZXRyaWMtY2hlY2tib3gsCiAgICAgIC5ocGFyYW0tY2hlY2tib3ggewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5kaXNjcmV0ZS12YWx1ZS1jaGVja2JveCB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7CiAgICAgIH0KICAgICAgLmhwYXJhbSwKICAgICAgLm1ldHJpYyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmlubGluZS1lbGVtZW50IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDQwJTsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgfQogICAgICAucGFnZS1udW1iZXItaW5wdXQgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgIH0KICAgICAgLnBhZ2Utc2l6ZS1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDYwJTsKICAgICAgfQogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItbGlzdGJveCB7CiAgICAgICAgbWF4LWhlaWdodDogMTVlbTsKICAgICAgfQogICAgICAucGFnZS1zdWZmaXggewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tcGFnZXMiPgoKICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoOm5vdChzbG90KTpub3QoLmlyb24tc2VsZWN0ZWQpKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWhlYWRlci1wYW5lbCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsOwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgI21haW5QYW5lbCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1ib2R5OwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2Nyb2xsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zY3JvbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNjcm9sbC1jb250YWluZXI7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IGNvdmVyCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1jb3Zlcl0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY292ZXItY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5QYW5lbCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc3RhbmRhcmQKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXN0YW5kYXJkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zdGFuZGFyZC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHNlYW1lZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c2VhbWVkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zZWFtZWQtY29udGFpbmVyOwogICAgICB9CgoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXdhdGVyZmFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHdhdGVyZmFsbC10YWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGwtdGFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLXRhbGwtY29udGFpbmVyOwogICAgICB9CgogICAgICAjZHJvcFNoYWRvdyB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzOwogICAgICAgIGhlaWdodDogNnB4OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zaGFkb3c7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93Lmhhcy1zaGFkb3cgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyID4gOjpzbG90dGVkKC5maXQpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgPC9zdHlsZT4KCiAgICA8c2xvdCBpZD0iaGVhZGVyU2xvdCIgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CgogICAgPGRpdiBpZD0ibWFpblBhbmVsIj4KICAgICAgPGRpdiBpZD0ibWFpbkNvbnRhaW5lciIgY2xhc3MkPSJbW19jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzKG1vZGUpXV0iPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImRyb3BTaGFkb3ciPjwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10YWIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1pbmxpbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbbGlua10pIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudGFiLWNvbnRlbnQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50OwogICAgICB9CgogICAgICA6aG9zdCg6bm90KC5pcm9uLXNlbGVjdGVkKSkgPiAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDAuODsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiLWNvbnRlbnQtdW5zZWxlY3RlZDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgfQoKICAgICAgcGFwZXItcmlwcGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdGFiLWluaywgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgfQoKICAgICAgLnRhYi1jb250ZW50ID4gOjpzbG90dGVkKGEpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItdGFicyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iY2hldnJvbi1sZWZ0Ij48cGF0aCBkPSJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiIC8+PC9nPgo8ZyBpZD0iY2hldnJvbi1yaWdodCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10YWJzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKCiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiczsKICAgICAgfQoKICAgICAgOmhvc3QoOmRpcihydGwpKSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWwtcmV2ZXJzZTsKICAgICAgfQoKICAgICAgI3RhYnNDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1jb250YWluZXI7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIC1tb3otZmxleC1iYXNpczogYXV0bzsKICAgICAgICAtbXMtZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYnMtY29udGVudDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQ6bm90KC5zY3JvbGxhYmxlKSwKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudC5zY3JvbGxhYmxlLmZpdC1jb250YWluZXIgewogICAgICAgIG1pbi13aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgLyogSUUgLSBwcmV2ZW50IHRhYnMgZnJvbSBjb21wcmVzc2luZyB3aGVuIHRoZXkgc2hvdWxkIHNjcm9sbC4gKi8KICAgICAgICAtbXMtZmxleDogMSAwIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDAgYXV0bzsKICAgICAgICBmbGV4OiAxIDAgYXV0bzsKICAgICAgfQoKICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLm5vdC12aXNpYmxlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIG1hcmdpbjogMCA0cHg7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvciwgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmFsaWduLWJvdHRvbSB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogYXV0bzsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhci5leHBhbmQgewogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMTVzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDEsIDEpOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmNvbnRyYWN0IHsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE4czsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMCwgMC4wLCAwLjIsIDEpOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQgPiA6OnNsb3R0ZWQoOm5vdCgjc2VsZWN0aW9uQmFyKSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0icGFwZXItdGFiczpjaGV2cm9uLWxlZnQiIGNsYXNzJD0iW1tfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzKF9sZWZ0SGlkZGVuLCBzY3JvbGxhYmxlLCBoaWRlU2Nyb2xsQnV0dG9ucyldXSIgb24tdXA9Il9vblNjcm9sbEJ1dHRvblVwIiBvbi1kb3duPSJfb25MZWZ0U2Nyb2xsQnV0dG9uRG93biIgdGFiaW5kZXg9Ii0xIj48L3BhcGVyLWljb24tYnV0dG9uPgoKICAgIDxkaXYgaWQ9InRhYnNDb250YWluZXIiIG9uLXRyYWNrPSJfc2Nyb2xsIiBvbi1kb3duPSJfZG93biI+CiAgICAgIDxkaXYgaWQ9InRhYnNDb250ZW50IiBjbGFzcyQ9IltbX2NvbXB1dGVUYWJzQ29udGVudENsYXNzKHNjcm9sbGFibGUsIGZpdENvbnRhaW5lcildXSI+CiAgICAgICAgPGRpdiBpZD0ic2VsZWN0aW9uQmFyIiBjbGFzcyQ9IltbX2NvbXB1dGVTZWxlY3Rpb25CYXJDbGFzcyhub0JhciwgYWxpZ25Cb3R0b20pXV0iIG9uLXRyYW5zaXRpb25lbmQ9Il9vbkJhclRyYW5zaXRpb25FbmQiPjwvZGl2PgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0icGFwZXItdGFiczpjaGV2cm9uLXJpZ2h0IiBjbGFzcyQ9IltbX2NvbXB1dGVTY3JvbGxCdXR0b25DbGFzcyhfcmlnaHRIaWRkZW4sIHNjcm9sbGFibGUsIGhpZGVTY3JvbGxCdXR0b25zKV1dIiBvbi11cD0iX29uU2Nyb2xsQnV0dG9uVXAiIG9uLWRvd249Il9vblJpZ2h0U2Nyb2xsQnV0dG9uRG93biIgdGFiaW5kZXg9Ii0xIj48L3BhcGVyLWljb24tYnV0dG9uPgoKICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b29sYmFyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItaGVpZ2h0LCA2NHB4KTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0LCA1NnB4KTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci10b29sYmFyLWJhY2tncm91bmQsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbGJhci1jb2xvciwgdmFyKC0tZGFyay10aGVtZS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhcjsKICAgICAgfQoKICAgICAgOmhvc3QoLmFuaW1hdGUpIHsKICAgICAgICB0cmFuc2l0aW9uOiB2YXIoLS1wYXBlci10b29sYmFyLXRyYW5zaXRpb24sIGhlaWdodCAwLjE4cyBlYXNlLWluKTsKICAgICAgfQoKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMik7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1tZWRpdW07CiAgICAgIH0KCiAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMyk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10YWxsOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCk7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1jb250ZW50OwogICAgICB9CgogICAgICAvKgogICAgICAgKiBUT0RPOiBXaGVyZSBzaG91bGQgbWVkaWEgcXVlcnkgYnJlYWtwb2ludHMgbGl2ZSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBlbGVtZW50cz8KICAgICAgICovCgogICAgICBAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAyKTsKICAgICAgICB9CgogICAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAzKTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLXRvb2xzIHsKICAgICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAjdG9wQmFyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC8qIG1pZGRsZSBiYXIgKi8KICAgICAgI21pZGRsZUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICA6aG9zdCgudGFsbCkgI21pZGRsZUJhciwKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSAjbWlkZGxlQmFyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7CiAgICAgIH0KCiAgICAgIC8qIGJvdHRvbSBiYXIgKi8KICAgICAgI2JvdHRvbUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtYWtlIGVsZW1lbnRzIChlLmcuIGJ1dHRvbnMpIHJlc3BvbmQgdG8gbW91c2UvdG91Y2ggZXZlbnRzCiAgICAgICAqCiAgICAgICAqIGAudG9vbGJhci10b29sc2AgZGlzYWJsZXMgdG91Y2ggZXZlbnRzIHNvIG11bHRpcGxlIHRvb2xiYXJzIGNhbiBzdGFjayBhbmQgbm90CiAgICAgICAqIGFic29yYiBldmVudHMuIEFsbCBjaGlsZHJlbiBtdXN0IGhhdmUgcG9pbnRlciBldmVudHMgcmUtZW5hYmxlZCB0byB3b3JrIGFzCiAgICAgICAqIGV4cGVjdGVkLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoKjpub3QoW2Rpc2FibGVkXSkpIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiA1NnB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbiArIC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIC0tcGFwZXItdG9vbGJhci10aXRsZSBtaXhpbiBpcyBhcHBsaWVkIGhlcmUgaW5zdGVhZCBvZiBhYm92ZSB0bwogICAgICAgKiBmaXggdGhlIGlzc3VlIHdpdGggbWFyZ2luLWxlZnQgYmVpbmcgaWdub3JlZCBkdWUgdG8gY3NzIG9yZGVyaW5nLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10aXRsZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQocGFwZXItaWNvbi1idXR0b25baWNvbj1tZW51XSkgewogICAgICAgIG1hcmdpbi1yaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGF1dG87CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAvKiBUT0RPKG5vbXMpOiBVbnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIGZvciBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlCiAgICAgICAqIC9kZWVwLyBjcmVhdGUgb3VyIG93bi4KICAgICAgICovCiAgICAgIC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1zdGFydC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5jZW50ZXItanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmVuZC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CgogICAgICAuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWFyb3VuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9wQmFyIiBjbGFzcyQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3NlcyhqdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0idG9wIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJtaWRkbGVCYXIiIGNsYXNzJD0idG9vbGJhci10b29scyBbW19jb21wdXRlQmFyRXh0cmFDbGFzc2VzKG1pZGRsZUp1c3RpZnkpXV0iPgogICAgICA8c2xvdCBuYW1lPSJtaWRkbGUiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImJvdHRvbUJhciIgY2xhc3MkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoYm90dG9tSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9ImJvdHRvbSI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtcGFuZWwiPgogICAgICAKICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkNvbG9yIGJ5IiBpZD0iY29sb3JCeURyb3BEb3duTWVudSIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e29wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4fX0iIGlkPSJjb2xvckJ5TGlzdEJveCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW29wdGlvbnMuY29sdW1uc11dIiBhcz0iY29sdW1uIiBpZD0iY29sb3JCeUNvbHVtblRlbXBsYXRlIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gZGlzYWJsZWQ9IltbIV9pc051bWVyaWNDb2x1bW4oY29sdW1uLmluZGV4KV1dIj4KICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KCiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJjb2x1bW5zLWNvbnRhaW5lciI+CiAgICAgICAgCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvcHRpb25zLmNvbHVtbnN9fSIgYXM9ImNvbHVtbiI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbi10aXRsZSI+CiAgICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGNsYXNzPSJzY2FsZS1yYWRpby1ncm91cCIgc2VsZWN0ZWQ9Int7Y29sdW1uLnNjYWxlfX0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkxJTkVBUiI+CiAgICAgICAgICAgICAgICAgICAgTGluZWFyCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ibG9nU2NhbGVCdXR0b25fW1tjb2x1bW4ubmFtZV1dIiBuYW1lPSJMT0ciIGRpc2FibGVkPSJbWyFfYWxsb3dMb2dTY2FsZShjb2x1bW4sIHNlc3Npb25Hcm91cHMuKildXSI+CiAgICAgICAgICAgICAgICAgICAgTG9nYXJpdGhtaWMKICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iUVVBTlRJTEUiPgogICAgICAgICAgICAgICAgICAgIFF1YW50aWxlCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmNvbnRyb2wtcGFuZWwgewogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC5jb2x1bW4gewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgICBib3JkZXI6IHNvbGlkIDFweCBkYXJrZ3JheTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgIH0KICAgICAgLmNvbHVtbi10aXRsZSB7CiAgICAgICAgLyogRml0IGV2ZXJ5IHRpdGxlIGluIG9uZSBsaW5lIHNvIHRoZSByYWRpbyBib3hlcyBhbGlnbiB2ZXJ0aWNhbGx5LiAqLwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgICAgLmNvbHVtbnMtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgLnNjYWxlLXJhZGlvLWdyb3VwIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMnB4OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWFjdGl2ZS1pdGVtLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93W2FjdGl2ZV0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1hY3RpdmUtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICN0YWJsZSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgICB6LWluZGV4OiAtMjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbaW9zXSAjdGFibGUgewogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdICN0YWJsZSB7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICB6LWluZGV4OiAtMTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHsKICAgICAgICAvKiBBbnkgdmFsdWUgb3RoZXIgdGhhbiDigJhub25l4oCZIGZvciB0aGUgdHJhbnNmb3JtIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGJvdGggYSBzdGFja2luZyBjb250ZXh0IGFuZAogICAgICAgIGEgY29udGFpbmluZyBibG9jay4gVGhlIG9iamVjdCBhY3RzIGFzIGEgY29udGFpbmluZyBibG9jayBmb3IgZml4ZWQgcG9zaXRpb25lZCBkZXNjZW5kYW50cy4gKi8KICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtYm9keSNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtY2VsbCI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiPjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIj48L2RvbS1tb2R1bGU+Cjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zaXplci1jZWxsIj48L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtc2l6ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuY2VsbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgZm9udC1zaXplOiAxcHg7CiAgICAgICAgbWFyZ2luLXRvcDogLTFlbTsKICAgICAgfQoKICAgICAgLmNlbGxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jb2x1bW5zXV0iIGFzPSJjb2x1bW4iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXItY2VsbCBjbGFzcz0iY2VsbCIgY29sdW1uPSJbW2NvbHVtbl1dIj4mbmJzcDs8L3ZhYWRpbi1ncmlkLXNpemVyLWNlbGw+CiAgICA8L3RlbXBsYXRlPgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbcGFzc3Rocm91Z2hdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpb3NdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICB6LWluZGV4OiAtMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2lvc11bc2Nyb2xsaW5nXSkgewogICAgICAgIHotaW5kZXg6IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgOmhvc3QgewogICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgei1pbmRleDogLTM7CiAgICAgICBoZWlnaHQ6IDA7CiAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgIH0KCiAgICAgOmhvc3QoOmZvY3VzKSwKICAgICAucHJpbWFyeTpmb2N1cywKICAgICA6OnNsb3R0ZWQoLnByaW1hcnk6Zm9jdXMpLAogICAgIC5zZWNvbmRhcnk6Zm9jdXMsCiAgICAgOjpzbG90dGVkKC5zZWNvbmRhcnk6Zm9jdXMpIHsKICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgfQogICAgPC9zdHlsZT4KCiAgICAKICAgIDxkaXYgY2xhc3M9InByaW1hcnkiIHRhYmluZGV4PSIwIiByb2xlPSJncmlkY2VsbCIgb24tZm9jdXM9Il9vbkJhaXRGb2N1cyIgb24tYmx1cj0iX29uQmFpdEJsdXIiPjxkaXYgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PjwvZGl2PgogICAgPGRpdiBjbGFzcz0ic2Vjb25kYXJ5IiB0YWJpbmRleD0iLTEiIHJvbGU9ImdyaWRjZWxsIiBvbi1mb2N1cz0iX29uQmFpdEZvY3VzIiBvbi1ibHVyPSJfb25CYWl0Qmx1ciI+PGRpdiBhcmlhLWhpZGRlbj0idHJ1ZSI+Jm5ic3A7PC9kaXY+PC9kaXY+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXJvdyI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyI+PC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2RldGFpbHNjZWxsXSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAudmFhZGluLWdyaWQtY2VsbFtkZXRhaWxzY2VsbF0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctZGV0YWlscy1jZWxsKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIC8qIEFuaW0gKi8KICAgICAgQGtleWZyYW1lcyB2YWFkaW4tZ3JpZC1zcGluLTM2MCB7CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgdmFhZGluLWdyaWQtc3Bpbi0zNjAgewogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNzcGlubmVyIHsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDNBOUY0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtOHB4OwogICAgICAgIG1hcmdpbi10b3A6IC04cHg7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtbG9hZGluZy1zcGlubmVyKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2xvYWRpbmddKSAjc3Bpbm5lciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICA6aG9zdChbbG9hZGluZ10pICNpdGVtcyB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3dbc2VsZWN0ZWRdIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS0xMDAsIHJnYigyNDMsIDI0MywgMjQzKSk7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctc2VsZWN0ZWQtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLW5hdmlnYXRpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KDpmb2N1cyksCiAgICAgICN0YWJsZTpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW25hdmlnYXRpbmddOm5vdChbaW50ZXJhY3RpbmddKSkgW2ZvY3VzZWRdID4gLnZhYWRpbi1ncmlkLXJvd1tmb2N1c2VkXSA+IFtmb2N1c2VkXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb2N1c2VkLWNlbGwpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtyZW9yZGVyaW5nXSAudmFhZGluLWdyaWQtY2VsbCB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQoKICAgICAgOmhvc3QoW3Jlb3JkZXJpbmddKSAudmFhZGluLWdyaWQtY2VsbFtyZW9yZGVyLXN0YXR1cz0iZHJhZ2dpbmciXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW3Jlb3JkZXJpbmddIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtczsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAjc2Nyb2xsZXIgLnZhYWRpbi1ncmlkLWNlbGxbcmVvcmRlci1zdGF0dXM9ImFsbG93ZWQiXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDAwKTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBvcGFjaXR5OiAwLjk1OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgQGtleWZyYW1lcyBhcHBlYXIgewogICAgICAgIHRvIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGFuaW1hdGlvbjogMW1zIGFwcGVhcjsKICAgICAgfQoKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1tYXgtZGV2aWNlLXBpeGVsLXJhdGlvOiAxKSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIGJvcmRlci10b3A6IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgI2l0ZW1zID4gLnZhYWRpbi1ncmlkLXJvdyB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1jZWxsLAogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMzVweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgIH0KCiAgICAgIFtsYXN0Y29sdW1uXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSwKICAgICAgW2xhc3QtZnJvemVuXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZF0gI2hlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtcm93Om5vdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIFtmcm96ZW5dIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbbm8tY29udGVudC1wb2ludGVyLWV2ZW50c10gLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2lvc11bY29sdW1uLXJlc2l6aW5nXSkgI291dGVyc2Nyb2xsZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgICNmaXhlZHNpemVyLAogICAgICAjb3V0ZXJzaXplciB7CiAgICAgICAgYm9yZGVyLXRvcDogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItYm90dG9tOiAwIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAjdGFibGUgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjdGFibGVbb3ZlcmZsb3ctaGlkZGVuXSwKICAgICAgI291dGVyc2Nyb2xsZXJbb3ZlcmZsb3ctaGlkZGVuXSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtc2l6ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpemVyd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IC0xMDA7CiAgICAgIH0KCiAgICAgICNyZW9yZGVyZ2hvc3QgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uKSwKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLXNlbGVjdGlvbi1jb2x1bW4pLAogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uLWdyb3VwKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgLyogRGVmYXVsdCBib3JkZXJzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIC52YWFkaW4tZ3JpZC1yb3c6Zmlyc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93Om5vdChbbGFzdHJvd10pIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgIH0KCiAgICAgIFtsYXN0LWZyb3plbl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICAvKiBDb2x1bW4gcmVzaXplIGhhbmRsZSAqLwoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1jb2x1bW4tcmVzaXplLWhhbmRsZSk7CiAgICAgIH0KCiAgICAgIC8qIENlbGxzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1oZWFkZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb290ZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgW29kZF0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1vZGQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pW2xhc3QtZnJvemVuXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbC1sYXN0LWZyb3plbik7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlOm5vdChbc2Nyb2xsaW5nXSkgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93OmhvdmVyIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1ob3Zlci1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbC52YWFkaW4tZ3JpZC1jZWxsW2xhc3Rjb2x1bW5dIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZSI+CiAgPHRlbXBsYXRlPgogICAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc2Nyb2xsLXN0eWxlcyI+PC9zdHlsZT4KICAgICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxkaXYgaWQ9InNwaW5uZXIiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJ0YWJsZSIgdGFiaW5kZXg9Ii0xIiBvdmVyZmxvdy1oaWRkZW4kPSJbW19oaWRlVGFibGVPdmVyZmxvdyhzY3JvbGxiYXJXaWR0aCwgc2FmYXJpKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzaXplcndyYXBwZXIiPgogICAgICAgICAgPHZhYWRpbi1ncmlkLXNpemVyIGlkPSJmaXhlZHNpemVyIiB0b3A9IltbX2VzdFNjcm9sbEhlaWdodF1dIiBjb2x1bW4tdHJlZT0iW1tjb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtc2l6ZXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNsb3QgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CiAgICAgICAgPHNsb3QgbmFtZT0iaXRlbXMiPjwvc2xvdD4KICAgICAgICA8c2xvdCBuYW1lPSJmb290ZXIiPjwvc2xvdD4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJyZW9yZGVyZ2hvc3QiPjwvZGl2PgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIgaWQ9Im91dGVyc2Nyb2xsZXIiIHNjcm9sbC10YXJnZXQ9Iltbc2Nyb2xsVGFyZ2V0XV0iIG92ZXJmbG93LWhpZGRlbiQ9IltbX2hpZGVPdXRlclNjcm9sbGVyKHNjcm9sbGJhcldpZHRoLCBzYWZhcmkpXV0iIGlvcyQ9IltbaW9zXV0iIHNjcm9sbGluZyQ9Iltbc2Nyb2xsaW5nXV0iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXIgaWQ9Im91dGVyc2l6ZXIiIHRvcD0iW1tfZXN0U2Nyb2xsSGVpZ2h0XV0iIGNvbHVtbi10cmVlPSJbW2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC1zaXplcj4KICAgIDwvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXI+CiAgICA8c2xvdD48L3Nsb3Q+CiAgICA8c2xvdCBuYW1lPSJmb290ZXJGb2N1c1RyYXAiPjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbiI+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvciwgI2ZmZik7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtcm93LWRldGFpbHMtc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXNlbGVjdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtbmF2aWdhdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1jb2x1bW4tcmVvcmRlcmluZy10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CgogICAgPHZhYWRpbi1ncmlkLXRhYmxlIGlkPSJzY3JvbGxlciIgbG9hZGluZyQ9IltbX2xvYWRpbmddXSIgYmluZC1kYXRhPSJbW19iaW5kRGF0YV1dIiBzaXplPSJbW3NpemVdXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSIgcm93LWRldGFpbHMtdGVtcGxhdGU9IltbX3Jvd0RldGFpbHNUZW1wbGF0ZV1dIiBjb2x1bW4tcmVvcmRlcmluZy1hbGxvd2VkPSJbW2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkXV0iPgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIGlkPSJoZWFkZXIiIHNsb3Q9ImhlYWRlciIgdGFyZ2V0PSJbW19nZXRDb250ZW50VGFyZ2V0KCldXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXI+CiAgICAgIDx2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IGlkPSJpdGVtcyIgc2xvdD0iaXRlbXMiPjwvdmFhZGluLWdyaWQtdGFibGUtYm9keT4KICAgICAgPHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciBpZD0iZm9vdGVyIiBzbG90PSJmb290ZXIiIHRhcmdldD0iW1tfZ2V0Q29udGVudFRhcmdldCgpXV0iIGNvbHVtbi10cmVlPSJbW19jb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyPgoKICAgICAgCiAgICAgIDxzbG90IG5hbWU9ImZvb3RlckZvY3VzVHJhcCI+PC9zbG90PgoKICAgICAgCiAgICAgIAogICAgICA8c2xvdD48L3Nsb3Q+CgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCBpZD0iZm9vdGVyRm9jdXNUcmFwIiBzbG90PSJmb290ZXJGb2N1c1RyYXAiIG9uLWZvY3VzLWdhaW5lZD0iX29uRm9vdGVyRm9jdXMiIG9uLWZvY3VzLWxvc3Q9Il9vbkZvY3Vzb3V0Ij4KICAgICAgPC92YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwPgogICAgPC92YWFkaW4tZ3JpZC10YWJsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFzZXNzaW9uR3JvdXBdXSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgzPk5vIHNlc3Npb24gZ3JvdXAgc2VsZWN0ZWQ8L2gzPgogICAgICAgIDxwPlBsZWFzZSBzZWxlY3QgYSBzZXNzaW9uIGdyb3VwIHRvIHNlZSBpdHMgbWV0cmljLWdyYXBocyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXZlTWV0cmljcyh2aXNpYmxlU2NoZW1hLiopXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBtZXRyaWNzIGFyZSBlbmFibGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2UgZW5hYmxlIHNvbWUgbWV0cmljcyB0byBzZWUgY29udGVudCBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQgaG9yaXpvbnRhbCB3cmFwIHNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGF2ZU1ldHJpY3NBbmRTZXNzaW9uR3JvdXAodmlzaWJsZVNjaGVtYS4qLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cCldXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zXV0iIGFzPSJtZXRyaWNJbmZvIj4KICAgICAgICAgIAogICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGNsYXNzPSJzY2FsYXItY2FyZCIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS10by1sb2FkPSJbW19jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHNlc3Npb25Hcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNJbmZvKV1dIiB0YWc9IltbbWV0cmljSW5mby5uYW1lLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX2NvbXB1dGVUYWdNZXRhZGF0YShtZXRyaWNJbmZvKV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIG11bHRpLWV4cGVyaW1lbnRzPSJbW19ub011bHRpRXhwZXJpbWVudHNdXSIgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIiBhY3RpdmU+CiAgICAgICAgICA8L3RmLXNjYWxhci1jYXJkPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIAogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXRhYmxlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tZ3JpZCBjbGFzcz0ic2Vzc2lvbi1ncm91cC10YWJsZSIgaWQ9InNlc3Npb25Hcm91cHNUYWJsZSIgY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZCBpdGVtcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMCIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+VHJpYWwgSUQ8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPltbaXRlbS5uYW1lXV08L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2VuYWJsZVNob3dNZXRyaWNzXV0iPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIwIiB3aWR0aD0iNWVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5TaG93IE1ldHJpY3M8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0idGFibGUtY2VsbCIgY2hlY2tlZD0ie3tleHBhbmRlZH19Ij4KICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc11dIiBhcz0iaHBhcmFtSW5mbyIgaW5kZXgtYXM9ImhwYXJhbUluZGV4Ij4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMiIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX2hwYXJhbU5hbWUoaHBhcmFtSW5mbyldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX3Nlc3Npb25Hcm91cEhQYXJhbShpdGVtLCBocGFyYW1JbmZvLm5hbWUpXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e3Zpc2libGVTY2hlbWEubWV0cmljSW5mb3N9fSIgYXM9Im1ldHJpY0luZm8iIGluZGV4LWFzPSJtZXRyaWNJbmRleCI+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjIiIHdpZHRoPSIxMGVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19tZXRyaWNOYW1lKG1ldHJpY0luZm8pXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19zZXNzaW9uR3JvdXBNZXRyaWMoaXRlbSwgbWV0cmljSW5mby5uYW1lKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGNsYXNzPSJyb3ctZGV0YWlscyI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tpdGVtXV0iIHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgY2xhc3M9InNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdmFhZGluLWdyaWQ+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAudGFibGUtaGVhZGVyIHsKICAgICAgICAvKiBsaW5lLWJyZWFrIG92ZXJmbG93aW5nIGNvbHVtbiBoZWFkZXJzICovCiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zZXNzaW9uLWdyb3VwLXRhYmxlIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlc3Npb24tZ3JvdXAtZGV0YWlscyB7CiAgICAgICAgaGVpZ2h0OiAzNjBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSI+CiAgICAgIAogICAgICA8dGYtaHBhcmFtcy10YWJsZS12aWV3IHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9IltbX3NpbmdsZXRvblNlc3Npb25Hcm91cHMoc2Vzc2lvbkdyb3VwKV1dIj4KICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfcHJvcGVydGllc0FyZVBvcHVsYXRlZCh2aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXApXV0iPgogICAgICA8ZGl2PgogICAgICAgIENsaWNrIG9yIGhvdmVyIG92ZXIgYSBzZXNzaW9uIGdyb3VwIHRvIGRpc3BsYXkgaXRzIHZhbHVlcyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxzdmcgaWQ9InN2ZyI+PC9zdmc+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHN2ZyB7CiAgICAgICAgZm9udDogMTBweCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuYmFja2dyb3VuZCBwYXRoIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7CiAgICAgIH0KCiAgICAgIC5mb3JlZ3JvdW5kIHBhdGggewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNzsKICAgICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIH0KCiAgICAgIC8qIFdpbGwgYmUgc2V0IG9uIGZvcmVncm91bmQgcGF0aHMgdGhhdCBhcmUgbm90ICJjb250YWluZWQiIGluIHRoZSBjdXJyZW50CiAgICAgICAgIGF4ZXMgYnJ1c2hlcy4gSWYgbm8gYnJ1c2hlcyBhcmUgc2V0LCBubyBwYXRoIHdpbGwgaGF2ZSB0aGlzIGNsYXNzLiAqLwogICAgICAuZm9yZWdyb3VuZCAuaW52aXNpYmxlLXBhdGggewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIFN0eWxlIGZvciB0aGUgcGF0aCBjbG9zZXN0IHRvIHRoZSBtb3VzZSBwb2ludGVyICh0eXBpY2FsbHkgd2lsbCBiZWNvbWUKICAgICAgdGhlIHNlbGVjdGVkIHBhdGggd2hlbiB0aGUgdXNlciBjbGlja3MpLiAqLwogICAgICAuZm9yZWdyb3VuZCAucGVha2VkLXBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQoKICAgICAgLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXRoIGNsYXNzLiBXZSB1c2UgIWltcG9ydGFudCB0byBvdmVycmlkZSB0aGUKICAgICAgICAgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBjb2xvciBvZiBhIHBhdGguICovCiAgICAgIC5mb3JlZ3JvdW5kIC5zZWxlY3RlZC1wYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDMgIWltcG9ydGFudDsKICAgICAgICBzdHJva2U6ICMwZjAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI2NvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmF4aXMgdGV4dCB7CiAgICAgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZiwgMXB4IDAgMCAjZmZmLCAwIC0xcHggMCAjZmZmLCAtMXB4IDAgMCAjZmZmOwogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPGRpdiBjbGFzcz0icGFuZSI+CiAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgIAogICAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzZWN0aW9uIiBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBvcHRpb25zPSJ7e19vcHRpb25zfX0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHM+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgICAKICAgICAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90IGlkPSJwbG90IiBjbGFzcz0ic2VjdGlvbiIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBzZWxlY3RlZC1zZXNzaW9uLWdyb3VwPSJ7e19zZWxlY3RlZEdyb3VwfX0iIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iIG9wdGlvbnM9IltbX29wdGlvbnNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3Q+CiAgICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMgaWQ9InZhbHVlcyIgY2xhc3M9InNlY3Rpb24iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIiBzZXNzaW9uLWdyb3VwPSJbW19jbG9zZXN0T3JTZWxlY3RlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGlkPSJkZXRhaWxzIiBjbGFzcz0ic2VjdGlvbiIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBzZXNzaW9uLWdyb3VwPSJbW19zZWxlY3RlZEdyb3VwXV0iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIj4KICAgICAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjbG9zZXN0IGRhdGEgcG9pbnQgbWFya2VyIHRvIHRoZSBtb3VzZSBwb2ludGVyLiBXZSB1c2UgIWltcG9ydGFudAogICAgICAgICB0byBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4KICAgICAgKi8KICAgICAgLmNsb3Nlc3QtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0YSBwb2ludCBtYXJrZXIuIFdlIHVzZSAhaW1wb3J0YW50IHRvCiAgICAgICAgIG92ZXJyaWRlIHRoZSBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIHN0eWxlIG9mIGEgbWFya2VyLiAqLwogICAgICAuc2VsZWN0ZWQtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgCiAgICAgICAgPHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIGNsYXNzPSJzZWN0aW9uIiBpZD0iY29udHJvbHMiIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iIG9wdGlvbnM9Int7X29wdGlvbnN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgIAogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IGNsYXNzPSJzZWN0aW9uIiBpZD0icGxvdCIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IiBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IiBvcHRpb25zPSJbW19vcHRpb25zXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdD4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyBjbGFzcz0ic2VjdGlvbiIgaWQ9InZhbHVlcyIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXA9IltbX2Nsb3Nlc3RPclNlbGVjdGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgCiAgICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyBjbGFzcz0ic2VjdGlvbiIgaWQ9ImRldGFpbHMiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tfc2VsZWN0ZWRHcm91cF1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaGVhZGVyLXBhbmVsPgogICAgICA8cGFwZXItdG9vbGJhciBzbG90PSJoZWFkZXIiIGNsYXNzPSJ0YWItYmFyIj4KICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRUYWJ9fSIgc2xvdD0idG9wIj4KICAgICAgICAgIAogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJ0YWJsZS12aWV3Ij4KICAgICAgICAgICAgVEFCTEUgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InBhcmFsbGVsLWNvb3Jkcy12aWV3Ij4KICAgICAgICAgICAgUEFSQUxMRUwgQ09PUkRJTkFURVMgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyI+CiAgICAgICAgICAgIFNDQVRURVIgUExPVCBNQVRSSVggVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLWFuZC1mZWVkYmFjayI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tidWdSZXBvcnRVcmxdXSI+CiAgICAgICAgICAgICAgPGEgaHJlZiQ9IltbYnVnUmVwb3J0VXJsXV0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0iYnVnLXJlcG9ydCIgcmFpc2VkIHRpdGxlPSJTZW5kIGEgYnVnIHJlcG9ydCBvciBmZWF0dXJlIHJlcXVlc3QiPgogICAgICAgICAgICAgICAgICBCdWcgUmVwb3J0IC8gRmVhdHVyZSBSZXF1ZXN0CiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWxwVXJsXV0iPgogICAgICAgICAgICAgIDxhIGhyZWYkPSJbW2hlbHBVcmxdXSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIiB0aXRsZT0iVmlldyBkb2N1bWVudGF0aW9uIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci10YWJzPgogICAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICAgIDxpcm9uLXBhZ2VzIHNlbGVjdGVkPSJbW19zZWxlY3RlZFRhYl1dIiBjbGFzcz0iZml0IHRhYi12aWV3Ij4KICAgICAgICA8ZGl2IGlkPSIwIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBlbmFibGUtc2hvdy1tZXRyaWNzPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iMSIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IjIiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3IGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0iW1tjb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3PgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tcGFnZXM+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIC50YWItdmlldyB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC50YWItYmFyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgfQogICAgICAudGFiIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItdGFicyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci10YWJzLWNvbnRlbnQ6IHsKICAgICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIH0KICAgICAgfQogICAgICB0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuaGVscC1hbmQtZmVlZGJhY2sgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICAgICNidWctcmVwb3J0IHsKICAgICAgICBib3JkZXI6IHNvbGlkIGJsYWNrOwogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmRzOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBtYXgtd2lkdGg6IDE1MHB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLW1haW4iPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8dGYtaHBhcmFtcy1xdWVyeS1wYW5lIGlkPSJxdWVyeS1wYW5lIiBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249Int7X2NvbmZpZ3VyYXRpb259fSIgc2Vzc2lvbi1ncm91cHM9Int7X3Nlc3Npb25Hcm91cHN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSBpZD0ic2Vzc2lvbnMtcGFuZSIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGhlbHAtdXJsPSJbW2hlbHBVcmxdXSIgYnVnLXJlcG9ydC11cmw9IltbYnVnUmVwb3J0VXJsXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBjb25maWd1cmF0aW9uPSJbW19jb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW19zZXNzaW9uR3JvdXBzXV0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lPgogICAgICA8L2Rpdj4KICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDx0Zi1ocGFyYW1zLWdvb2dsZS1hbmFseXRpY3MtdHJhY2tlciBpZD0idHJhY2tlciIgdHJhY2tpbmctaWQ9IltbdHJhY2tpbmdJZF1dIiBuYW1lPSJ0Zl9ocGFyYW1zIj4KICAgIDwvdGYtaHBhcmFtcy1nb29nbGUtYW5hbHl0aWNzLXRyYWNrZXI+CgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBtaW4td2lkdGg6IDEwJTsKICAgICAgfQoKICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRmLWhwYXJhbXMtbWFpbiBpZD0iaHBhcmFtcy1tYWluIiBiYWNrZW5kPSJbW19iYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iIj4KICAgIDwvdGYtaHBhcmFtcy1tYWluPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1tZXNoLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyBjb2xvcj0iW1tfcnVuQ29sb3JdXSIgY2xhc3M9InRmLW1lc2gtbG9hZGVyLWhlYWRlciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTYW1wbGVzKG9mU2FtcGxlcyldXSI+CiAgICAgICAgPGRpdj5zYW1wbGU6IFtbX2dldFNhbXBsZVRleHQoc2FtcGxlKV1dIG9mIFtbb2ZTYW1wbGVzXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcChfc3RlcHMpXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwCiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+W1t0b0xvY2FsZVN0cmluZ18oX3N0ZXBWYWx1ZSldXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jdXJyZW50V2FsbFRpbWVdXSI+CiAgICAgICAgICAgICAgW1tfY3VycmVudFdhbGxUaW1lXV0KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwgcmlnaHQiPgogICAgICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFjdGl2ZSBoaWRkZW4kPSJbWyFfaXNNZXNoTG9hZGluZ11dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzKF9zdGVwcyldXSI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX2dldE1heFN0ZXBJbmRleChfc3RlcHMpXV0iIG1heC1tYXJrZXJzPSJbW19nZXRNYXhTdGVwSW5kZXgoX3N0ZXBzKV1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDFweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFweDsKICAgICAgfQogICAgICAudGYtbWVzaC1sb2FkZXItaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwNXB4OwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9Im1lc2gtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIiBjbGFzcz0iYWxsLWNvbnRyb2xzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gdmlldy1jb250cm9sIj4KICAgICAgICAgIDxoMyBjbGFzcz0idGl0bGUiPlBvaW50IG9mIHZpZXc8L2gzPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2aWV3LXJhZGlvLWdyb3VwIiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRWaWV3fX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9ImFsbC1yYWRpby1idXR0b24iIG5hbWU9ImFsbCI+CiAgICAgICAgICAgICAgICBEaXNwbGF5IGFsbCBwb2ludHMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0iYWxsLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgWm9vbSBhbmQgY2VudGVyIGNhbWVyYSB0byBkaXNwbGF5IGFsbCBwb2ludHMgYXQgb25jZS4gTm90ZSwgdGhhdAogICAgICAgICAgICAgICAgc29tZSBwb2ludHMgY291bGQgYmUgdG9vIGZhciAoaS5lLiB0b28gc21hbGwpIHRvIGJlIHZpc2libGUuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InVzZXItcmFkaW8tYnV0dG9uIiBuYW1lPSJ1c2VyIj4KICAgICAgICAgICAgICAgIEN1cnJlbnQgdmlldwogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJ1c2VyLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgS2VlcCBjdXJyZW50IGNhbWVyYSBwb3NpdGlvbiBhbmQgem9vbSBsZXZlbC4KICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ic2hhcmUtcmFkaW8tYnV0dG9uIiBuYW1lPSJzaGFyZSI+CiAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0ic2hhcmUtcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQgYW1vbmcgYWxsIGNhbWVyYXMuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHBvaW50IGNsb3VkIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcG9pbnQgY2xvdWQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbWVzaC1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBzZWxlY3RlZC12aWV3PSJbW19zZWxlY3RlZFZpZXddXSIgcnVuPSJbW2l0ZW0ucnVuXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIgb2Ytc2FtcGxlcz0iW1tpdGVtLm9mU2FtcGxlc11dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1jb250YWluZXIiIG9uLWNhbWVyYS1wb3NpdGlvbi1jaGFuZ2U9Il9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlZCI+CiAgICAgICAgICAgICAgICA8L3RmLW1lc2gtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gaDMudGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLnJ1bnMtc2VsZWN0b3IgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgdGYtcnVucy1zZWxlY3RvciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZpZXctY29udHJvbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnZpZXctY29udHJvbCBoMy50aXRsZSB7CiAgICAgICAgcGFkZGluZy10b3A6IDE2cHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE2cHg7CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAudmlldy1jb250cm9sIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLyogTGF5b3V0IG11c3QgYmUgaG9yaXpvbnRhbCwgaS5lLiBpdGVtcyBhcnJhbmdlZCBpbiBhIHJvdy4gSWYgaXRlbXMgY2Fubm90IGZpdCBpbiBhIHJvdywKICAgICAgICogdGhleSBzaG91bGQgYmUgbW92ZWQgdG8gbmV4dCBsaW5lLiBBbGwgaXRlbXMgbXVzdCBiZSBzcXVhcmUgYXQgYWxsIHRpbWVzLiBNaW5pbXVtIHNpemUgb2YKICAgICAgICogdGhlIGl0ZW0gaXMgNDgwcHguIFRoaXMgbWVhbnMgdGhhdCBtYXhpbXVtIHNpemUgb2YgdGhlIGl0ZW0gbXVzdCBiZSA0ODBweCArIDQ3OXB4ID0gOTU5cHguCiAgICAgICAqICovCiAgICAgIC5ob3Jpem9udGFsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgIHRmLW1lc2gtbG9hZGVyIHsKICAgICAgICB3aWR0aDogNDgwcHg7CiAgICAgICAgZmxleC1iYXNpczogNDgwcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0ic2V0dGluZ3MiPgogICAgICA8aDI+U2V0dGluZ3M8L2gyPgogICAgICA8cGFwZXItY2hlY2tib3ggaWQ9ImF1dG8tcmVsb2FkLWNoZWNrYm94IiBjaGVja2VkPSJ7e2F1dG9SZWxvYWRFbmFibGVkfX0iPgogICAgICAgIFJlbG9hZCBkYXRhIGV2ZXJ5IDxzcGFuPltbYXV0b1JlbG9hZEludGVydmFsU2Vjc11dPC9zcGFuPnMuCiAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0icGFnaW5hdGlvbkxpbWl0SW5wdXQiIGxhYmVsPSJQYWdpbmF0aW9uIGxpbWl0IiBhbHdheXMtZmxvYXQtbGFiZWwgdHlwZT0ibnVtYmVyIiBtaW49IjEiIHN0ZXA9IjEiIG9uLWNoYW5nZT0iX3BhZ2luYXRpb25MaW1pdENoYW5nZWQiIG9uLXZhbHVlLWNoYW5nZWQ9Il9wYWdpbmF0aW9uTGltaXRWYWxpZGF0ZSI+PC9wYXBlci1pbnB1dD4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHBhcGVyLWhlYWRlci1wYW5lbD4KICAgICAgPHBhcGVyLXRvb2xiYXIgaWQ9InRvb2xiYXIiIHNsb3Q9ImhlYWRlciIgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgPGRpdiBpZD0idG9vbGJhci1jb250ZW50IiBzbG90PSJ0b3AiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaG9tZVBhdGhdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaG9tZVBhdGhdXSI+CiAgICAgICAgICAgIDxhIGhyZWY9IltbX2hvbWVQYXRoXV0iIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvYT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWRdXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0b29sYmFyLW1lc3NhZ2UiPgogICAgICAgICAgICAgIExvYWRpbmcgYWN0aXZlIGRhc2hib2FyZHPigKYKICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZF1dIj4KICAgICAgICAgICAgPHBhcGVyLXRhYnMgbm9pbmsgc2Nyb2xsYWJsZSBzZWxlY3RlZD0ie3tfc2VsZWN0ZWREYXNoYm9hcmR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9ImRhdGEtZGFzaGJvYXJkIj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19kYXNoYm9hcmREYXRhXV0iIGFzPSJkYXNoYm9hcmREYXR1bSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzRGFzaGJvYXJkQWN0aXZlKGRpc2FibGVkRGFzaGJvYXJkcywgX2FjdGl2ZURhc2hib2FyZHMsIGRhc2hib2FyZERhdHVtKV1dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRhYiBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iIHRpdGxlPSJbW2Rhc2hib2FyZERhdHVtLnRhYk5hbWVdXSI+CiAgICAgICAgICAgICAgICAgICAgW1tkYXNoYm9hcmREYXR1bS50YWJOYW1lXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItdGFicz4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pbmFjdGl2ZURhc2hib2FyZHNFeGlzdChfZGFzaGJvYXJkRGF0YSwgZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcyldXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IklOQUNUSVZFIiBuby1sYWJlbC1mbG9hdCBub2luayBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEycHgiPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggaWQ9ImluYWN0aXZlLWRhc2hib2FyZHMtbWVudSIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkRGFzaGJvYXJkfX0iIGF0dHItZm9yLXNlbGVjdGVkPSJkYXRhLWRhc2hib2FyZCI+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIj4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzRGFzaGJvYXJkSW5hY3RpdmUoZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcywgZGFzaGJvYXJkRGF0dW0pXV0iIHJlc3RhbXA+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iPltbZGFzaGJvYXJkRGF0dW0udGFiTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9Imdsb2JhbC1hY3Rpb25zIj4KICAgICAgICAgICAgPHNsb3QgbmFtZT0iaW5qZWN0ZWQtaGVhZGVyLWl0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpZD0icmVsb2FkLWJ1dHRvbiIgY2xhc3MkPSJbW19nZXREYXRhUmVmcmVzaGluZ0NsYXNzKF9yZWZyZXNoaW5nKV1dIiBkaXNhYmxlZCQ9IltbX2lzUmVsb2FkRGlzYWJsZWRdXSIgaWNvbj0icmVmcmVzaCIgb24tdGFwPSJyZWxvYWQiIHRpdGxlJD0iTGFzdCB1cGRhdGVkOiBbW19sYXN0UmVsb2FkVGltZVNob3J0XV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncyIgb24tdGFwPSJvcGVuU2V0dGluZ3MiIGlkPSJzZXR0aW5ncy1idXR0b24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiB0YWJpbmRleD0iLTEiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci10b29sYmFyPgoKICAgICAgPGRpdiBpZD0iY29udGVudC1wYW5lIiBjbGFzcz0iZml0Ij4KICAgICAgICA8c2xvdCBuYW1lPSJpbmplY3RlZC1vdmVydmlldyI+PC9zbG90PgogICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz5GYWlsZWQgdG8gbG9hZCB0aGUgc2V0IG9mIGFjdGl2ZSBkYXNoYm9hcmRzLjwvaDM+CiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBUaGlzIGNhbiBvY2N1ciBpZiB0aGUgVGVuc29yQm9hcmQgYmFja2VuZCBpcyBubyBsb25nZXIgcnVubmluZy4KICAgICAgICAgICAgICAgIFBlcmhhcHMgdGhpcyBwYWdlIGlzIGNhY2hlZD8KICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgdGhhdCB5b3XigJl2ZSBmaXhlZCB0aGUgcHJvYmxlbSwgY2xpY2sgdGhlIHJlbG9hZAogICAgICAgICAgICAgICAgYnV0dG9uIGluIHRoZSB0b3AtcmlnaHQuCiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbYXV0b1JlbG9hZEVuYWJsZWRdXSI+CiAgICAgICAgICAgICAgICAgIFdl4oCZbGwgdHJ5IHRvIHJlbG9hZCBldmVyeQogICAgICAgICAgICAgICAgICBbW2F1dG9SZWxvYWRJbnRlcnZhbFNlY3NdXSZuYnNwO3NlY29uZHMgYXMgd2VsbC4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgCgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGk+TGFzdCByZWxvYWQ6IFtbX2xhc3RSZWxvYWRUaW1lXV08L2k+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFMb2NhdGlvbl1dIj4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT48cD4KICAgICAgICAgICAgICAgICAgICA8aT5Mb2cgZGlyZWN0b3J5OgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRhdGFfbG9jYXRpb24iPltbX2RhdGFMb2NhdGlvbl1dPC9zcGFuPjwvaT4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zaG93Tm9EYXNoYm9hcmRzTWVzc2FnZV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0id2FybmluZy1tZXNzYWdlIj4KICAgICAgICAgICAgICA8aDM+Tm8gZGFzaGJvYXJkcyBhcmUgYWN0aXZlIGZvciB0aGUgY3VycmVudCBkYXRhIHNldC48L2gzPgogICAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjxwPgogICAgICAgICAgICAgICAgICAgIDxpPkRhdGEgbG9jYXRpb246CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGF0YV9sb2NhdGlvbiI+W1tfZGF0YUxvY2F0aW9uXV08L3NwYW4+PC9pPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3dOb1N1Y2hEYXNoYm9hcmRNZXNzYWdlXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz4KICAgICAgICAgICAgICAgIFRoZXJl4oCZcyBubyBkYXNoYm9hcmQgYnkgdGhlIG5hbWUgb2YKICAgICAgICAgICAgICAgIOKAnDx0dD5bW19zZWxlY3RlZERhc2hib2FyZF1dPC90dD4u4oCdCiAgICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNMb2FkZWRdXSI+CiAgICAgICAgICAgICAgICA8cD5Zb3UgY2FuIHNlbGVjdCBhIGRhc2hib2FyZCBmcm9tIHRoZSBsaXN0IGFib3ZlLgoKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxpPkxhc3QgcmVsb2FkOiBbW19sYXN0UmVsb2FkVGltZV1dPC9pPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTG9jYXRpb25dXSI+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+PHA+CiAgICAgICAgICAgICAgICAgICAgPGk+RGF0YSBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkYXRhX2xvY2F0aW9uIj5bW19kYXRhTG9jYXRpb25dXTwvc3Bhbj48L2k+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpZD0iZGFzaGJvYXJkcy10ZW1wbGF0ZSIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIiBvbi1kb20tY2hhbmdlPSJfb25UZW1wbGF0ZUNoYW5nZWQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtY29udGFpbmVyIiBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iIGRhdGEtc2VsZWN0ZWQkPSJbW19zZWxlY3RlZFN0YXR1cyhfc2VsZWN0ZWREYXNoYm9hcmQsIGRhc2hib2FyZERhdHVtLnBsdWdpbildXSI+CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS0xMDApOwogICAgICB9CgogICAgICAjdG9vbGJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKAogICAgICAgICAgLS10Yi10b29sYmFyLWJhY2tncm91bmQtY29sb3IsCiAgICAgICAgICB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKQogICAgICAgICk7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDZweDsKICAgICAgICAvKiBJbmNyZWFzZSBjbGlja2FibGUgYXJlYSBmb3IgY2FzZSB3aGVyZSB0aXRsZSBpcyBhbiBhbmNob3IuICovCiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICAgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZGlzcGxheTogdmFyKC0tdGItdG9vbGJhci10aXRsZS1kaXNwbGF5LCBibG9jayk7CiAgICAgIH0KCiAgICAgIGEudG9vbGJhci10aXRsZSB7CiAgICAgICAgLyogT3ZlcnJpZGUgZGVmYXVsdCBhbmNob3IgY29sb3IuICovCiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogT3ZlcnJpZGUgZGVmYXVsdCBhbmNob3IgdGV4dC1kZWNvcmF0aW9uLiAqLwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItbWVzc2FnZSB7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICBwYXBlci10YWJzIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLXRhYnMtY29udGVudDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItZHJvcGRvd24tbWVudS1pY29uOiB7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSBwYXBlci1pdGVtIHsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9CgogICAgICAjaW5hY3RpdmUtZGFzaGJvYXJkcy1tZW51IHsKICAgICAgICAtLXBhcGVyLWxpc3Rib3gtYmFja2dyb3VuZC1jb2xvcjogdmFyKAogICAgICAgICAgLS10Yi10b29sYmFyLWJhY2tncm91bmQtY29sb3IsCiAgICAgICAgICB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKQogICAgICAgICk7CiAgICAgICAgLS1wYXBlci1saXN0Ym94LWNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmdsb2JhbC1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgLyogRW5zdXJlIHRoYXQgaWNvbnMgc3RheSBhbGlnbmVkICovCiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmdsb2JhbC1hY3Rpb25zIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgI3Rvb2xiYXItY29udGVudCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgI2NvbnRlbnQtcGFuZSB7CiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0cmV0Y2g7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNjb250ZW50IHsKICAgICAgICBmbGV4OiAxIDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmRhc2hib2FyZC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLyogSGlkZSB1bnNlbGVjdGVkIGRhc2hib2FyZHMuIFdlIHN0aWxsIGRpc3BsYXkgdGhlbSB3aXRoaW4gYSBjb250YWluZXIKICAgICAgICAgb2YgaGVpZ2h0IDAgc2luY2UgUGxvdHRhYmxlIHByb2R1Y2VzIGRlZ2VuZXJhdGUgY2hhcnRzIHdoZW4gY2hhcnRzIGFyZQogICAgICAgICByZWxvYWRlZCB3aGlsZSBub3QgZGlzcGxheWVkLiAqLwogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lcjpub3QoW2RhdGEtc2VsZWN0ZWRdKSB7CiAgICAgICAgbWF4LWhlaWdodDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAvKiogV2UgZnVydGhlciBtYWtlIGNvbnRhaW5lcnMgaW52aXNpYmxlLiBTb21lIGVsZW1lbnRzIG1heSBhbmNob3IgdG8KICAgICAgICAgICAgdGhlIHZpZXdwb3J0IGluc3RlYWQgb2YgdGhlIGNvbnRhaW5lciwgaW4gd2hpY2ggY2FzZSBzZXR0aW5nIHRoZSBtYXgKICAgICAgICAgICAgaGVpZ2h0IGhlcmUgdG8gMCB3aWxsIG5vdCBoaWRlIHRoZW0uICovCiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lciBpZnJhbWUgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC53YXJuaW5nLW1lc3NhZ2UgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CgogICAgICBbZGlzYWJsZWRdIHsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAjcmVsb2FkLWJ1dHRvbi5yZWZyZXNoaW5nIHsKICAgICAgICBhbmltYXRpb246IHJvdGF0ZSAycyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcm90YXRlIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCiAgPGJvZHk+CiAgICA8dGYtdGVuc29yYm9hcmQgdXNlLWhhc2ggYnJhbmQ9IlRlbnNvckJvYXJkIj48L3RmLXRlbnNvcmJvYXJkPgogIAoKPHNjcmlwdCBzcmM9ImluZGV4LmpzIj48L3NjcmlwdD4=", + "ok": true, + "headers": [ + [ + "content-type", + "text/html; charset=utf-8" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/index.js": { + "data": "dmFyIENMT1NVUkVfTk9fREVQUyA9IHRydWU7Ci8vIENvcHlyaWdodCAyMDA2IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLy8KLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi8vCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTLUlTIiBCQVNJUywKLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgovKioKICogQGZpbGVvdmVydmlldyBCb290c3RyYXAgZm9yIHRoZSBHb29nbGUgSlMgTGlicmFyeSAoQ2xvc3VyZSkuCiAqCiAqIEluIHVuY29tcGlsZWQgbW9kZSBiYXNlLmpzIHdpbGwgYXR0ZW1wdCB0byBsb2FkIENsb3N1cmUncyBkZXBzIGZpbGUsIHVubGVzcwogKiB0aGUgZ2xvYmFsIDxjb2RlPkNMT1NVUkVfTk9fREVQUzwvY29kZT4gaXMgc2V0IHRvIHRydWUuICBUaGlzIGFsbG93cyBwcm9qZWN0cwogKiB0byBpbmNsdWRlIHRoZWlyIG93biBkZXBzIGZpbGUocykgZnJvbSBkaWZmZXJlbnQgbG9jYXRpb25zLgogKgogKiBBdm9pZCBpbmNsdWRpbmcgYmFzZS5qcyBtb3JlIHRoYW4gb25jZS4gVGhpcyBpcyBzdHJpY3RseSBkaXNjb3VyYWdlZCBhbmQgbm90CiAqIHN1cHBvcnRlZC4gZ29vZy5yZXF1aXJlKC4uLikgd29uJ3Qgd29yayBwcm9wZXJseSBpbiB0aGF0IGNhc2UuCiAqCiAqIEBwcm92aWRlR29vZwogKi8KCgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gT3ZlcnJpZGRlbiB0byB0cnVlIGJ5IHRoZSBjb21waWxlci4KICovCnZhciBDT01QSUxFRCA9IGZhbHNlOwoKCi8qKgogKiBCYXNlIG5hbWVzcGFjZSBmb3IgdGhlIENsb3N1cmUgbGlicmFyeS4gIENoZWNrcyB0byBzZWUgZ29vZyBpcyBhbHJlYWR5CiAqIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgc2NvcGUgYmVmb3JlIGFzc2lnbmluZyB0byBwcmV2ZW50IGNsb2JiZXJpbmcgaWYKICogYmFzZS5qcyBpcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuCiAqCiAqIEBjb25zdAogKi8KdmFyIGdvb2cgPSBnb29nIHx8IHt9OwoKLyoqCiAqIFJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4KICogaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi85LjAvaW5kZXguaHRtbCNzZWMtZ2xvYmFsLW9iamVjdAogKgogKiBNb3JlIGluZm8gb24gdGhpcyBpbXBsZW1lbnRhdGlvbiBoZXJlOgogKiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFOQWVXNFdrN0k3RlYwWTJ0Y1VGdlFkR01jODlrMnZkZ1NYSW53OF9udkNJL2VkaXQKICoKICogQGNvbnN0CiAqIEBzdXBwcmVzcyB7dW5kZWZpbmVkVmFyc30gc2VsZiB3b24ndCBiZSByZWZlcmVuY2VkIHVubGVzcyBgdGhpc2AgaXMgZmFsc3kuCiAqIEB0eXBlIHshR2xvYmFsfQogKi8KZ29vZy5nbG9iYWwgPQogICAgLy8gQ2hlY2sgYHRoaXNgIGZpcnN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgIC8vIFZhbGlkIHVubGVzcyBydW5uaW5nIGFzIGFuIEVTIG1vZHVsZSBvciBpbiBhIGZ1bmN0aW9uIHdyYXBwZXIgY2FsbGVkCiAgICAvLyAgIHdpdGhvdXQgc2V0dGluZyBgdGhpc2AgcHJvcGVybHkuCiAgICAvLyBOb3RlIHRoYXQgYmFzZS5qcyBjYW4ndCB1c2VmdWxseSBiZSBpbXBvcnRlZCBhcyBhbiBFUyBtb2R1bGUsIGJ1dCBpdCBtYXkKICAgIC8vIGJlIGNvbXBpbGVkIGludG8gYnVuZGxlcyB0aGF0IGFyZSBsb2FkYWJsZSBhcyBFUyBtb2R1bGVzLgogICAgdGhpcyB8fAogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9zZWxmCiAgICAvLyBGb3IgaW4tcGFnZSBicm93c2VyIGVudmlyb25tZW50cyBhbmQgd29ya2Vycy4KICAgIHNlbGY7CgoKLyoqCiAqIEEgaG9vayBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmaW5lIHZhbHVlcyBpbiB1bmNvbXBpbGVkIG1vZGUuCiAqCiAqIEluIHVuY29tcGlsZWQgbW9kZSwgYENMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTYCBtYXkgYmUgZGVmaW5lZCBiZWZvcmUKICogbG9hZGluZyBiYXNlLmpzLiAgSWYgYSBrZXkgaXMgZGVmaW5lZCBpbiBgQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVNgLAogKiBgZ29vZy5kZWZpbmVgIHdpbGwgdXNlIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZhbHVlLiAgVGhpcwogKiBhbGxvd3MgZmxhZ3MgdG8gYmUgb3ZlcndyaXR0ZW4gd2l0aG91dCBjb21waWxhdGlvbiAodGhpcyBpcyBub3JtYWxseQogKiBhY2NvbXBsaXNoZWQgd2l0aCB0aGUgY29tcGlsZXIncyAiZGVmaW5lIiBmbGFnKS4KICoKICogRXhhbXBsZToKICogPHByZT4KICogICB2YXIgQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVMgPSB7J2dvb2cuREVCVUcnOiBmYWxzZX07CiAqIDwvcHJlPgogKgogKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgKHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik+fHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTOwoKCi8qKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmluZSB2YWx1ZXMgaW4gdW5jb21waWxlZCBvciBjb21waWxlZCBtb2RlLAogKiBsaWtlIENMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTIGJ1dCBlZmZlY3RpdmUgaW4gY29tcGlsZWQgY29kZS4gIEluCiAqIHVuY29tcGlsZWQgY29kZSBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyB0YWtlcyBwcmVjZWRlbmNlLgogKgogKiBBbHNvIHVubGlrZSBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyB0aGUgdmFsdWVzIG11c3QgYmUgbnVtYmVyLCBib29sZWFuIG9yCiAqIHN0cmluZyBsaXRlcmFscyBvciB0aGUgY29tcGlsZXIgd2lsbCBlbWl0IGFuIGVycm9yLgogKgogKiBXaGlsZSBhbnkgQGRlZmluZSB2YWx1ZSBtYXkgYmUgc2V0LCBvbmx5IHRob3NlIHNldCB3aXRoIGdvb2cuZGVmaW5lIHdpbGwgYmUKICogZWZmZWN0aXZlIGZvciB1bmNvbXBpbGVkIGNvZGUuCiAqCiAqIEV4YW1wbGU6CiAqIDxwcmU+CiAqICAgdmFyIENMT1NVUkVfREVGSU5FUyA9IHsnZ29vZy5ERUJVRyc6IGZhbHNlfSA7CiAqIDwvcHJlPgogKgogKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgKHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik+fHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUzsKCgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgbm90IHVuZGVmaW5lZC4KICoKICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBkZWZpbmVkLgogKiBAZGVwcmVjYXRlZCBVc2UgYHZhbCAhPT0gdW5kZWZpbmVkYCBpbnN0ZWFkLgogKi8KZ29vZy5pc0RlZiA9IGZ1bmN0aW9uKHZhbCkgewogIC8vIHZvaWQgMCBhbHdheXMgZXZhbHVhdGVzIHRvIHVuZGVmaW5lZCBhbmQgaGVuY2Ugd2UgZG8gbm90IG5lZWQgdG8gZGVwZW5kIG9uCiAgLy8gdGhlIGRlZmluaXRpb24gb2YgdGhlIGdsb2JhbCB2YXJpYWJsZSBuYW1lZCAndW5kZWZpbmVkJy4KICByZXR1cm4gdmFsICE9PSB2b2lkIDA7Cn07CgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYSBzdHJpbmcuCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYSBzdHJpbmcuCiAqIEBkZXByZWNhdGVkIFVzZSBgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZydgIGluc3RlYWQuCiAqLwpnb29nLmlzU3RyaW5nID0gZnVuY3Rpb24odmFsKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gJ3N0cmluZyc7Cn07CgoKLyoqCiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGEgYm9vbGVhbi4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBib29sZWFuLgogKiBAZGVwcmVjYXRlZCBVc2UgYHR5cGVvZiB2YWwgPT09ICdib29sZWFuJ2AgaW5zdGVhZC4KICovCmdvb2cuaXNCb29sZWFuID0gZnVuY3Rpb24odmFsKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gJ2Jvb2xlYW4nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIG51bWJlci4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhIG51bWJlci4KICogQGRlcHJlY2F0ZWQgVXNlIGB0eXBlb2YgdmFsID09PSAnbnVtYmVyJ2AgaW5zdGVhZC4KICovCmdvb2cuaXNOdW1iZXIgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gdHlwZW9mIHZhbCA9PSAnbnVtYmVyJzsKfTsKCgovKioKICogQnVpbGRzIGFuIG9iamVjdCBzdHJ1Y3R1cmUgZm9yIHRoZSBwcm92aWRlZCBuYW1lc3BhY2UgcGF0aCwgZW5zdXJpbmcgdGhhdAogKiBuYW1lcyB0aGF0IGFscmVhZHkgZXhpc3QgYXJlIG5vdCBvdmVyd3JpdHRlbi4gRm9yIGV4YW1wbGU6CiAqICJhLmIuYyIgLT4gYSA9IHt9O2EuYj17fTthLmIuYz17fTsKICogVXNlZCBieSBnb29nLnByb3ZpZGUgYW5kIGdvb2cuZXhwb3J0U3ltYm9sLgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBvYmplY3QgdGhhdCB0aGlzIGZpbGUgZGVmaW5lcy4KICogQHBhcmFtIHsqPX0gb3B0X29iamVjdCB0aGUgb2JqZWN0IHRvIGV4cG9zZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmplY3RUb0V4cG9ydFRvIFRoZSBvYmplY3QgdG8gYWRkIHRoZSBwYXRoIHRvOyBkZWZhdWx0CiAqICAgICBpcyBgZ29vZy5nbG9iYWxgLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5leHBvcnRQYXRoXyA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmplY3QsIG9wdF9vYmplY3RUb0V4cG9ydFRvKSB7CiAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgnLicpOwogIHZhciBjdXIgPSBvcHRfb2JqZWN0VG9FeHBvcnRUbyB8fCBnb29nLmdsb2JhbDsKCiAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgZXhoaWJpdHMgc3RyYW5nZSBiZWhhdmlvciB3aGVuIHRocm93aW5nIGVycm9ycyBmcm9tCiAgLy8gbWV0aG9kcyBleHRlcm5lZCBpbiB0aGlzIG1hbm5lci4gIFNlZSB0aGUgdGVzdEV4cG9ydFN5bWJvbEV4Y2VwdGlvbnMgaW4KICAvLyBiYXNlX3Rlc3QuaHRtbCBmb3IgYW4gZXhhbXBsZS4KICBpZiAoIShwYXJ0c1swXSBpbiBjdXIpICYmIHR5cGVvZiBjdXIuZXhlY1NjcmlwdCAhPSAndW5kZWZpbmVkJykgewogICAgY3VyLmV4ZWNTY3JpcHQoJ3ZhciAnICsgcGFydHNbMF0pOwogIH0KCiAgZm9yICh2YXIgcGFydDsgcGFydHMubGVuZ3RoICYmIChwYXJ0ID0gcGFydHMuc2hpZnQoKSk7KSB7CiAgICBpZiAoIXBhcnRzLmxlbmd0aCAmJiBvcHRfb2JqZWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgLy8gbGFzdCBwYXJ0IGFuZCB3ZSBoYXZlIGFuIG9iamVjdDsgdXNlIGl0CiAgICAgIGN1cltwYXJ0XSA9IG9wdF9vYmplY3Q7CiAgICB9IGVsc2UgaWYgKGN1cltwYXJ0XSAmJiBjdXJbcGFydF0gIT09IE9iamVjdC5wcm90b3R5cGVbcGFydF0pIHsKICAgICAgY3VyID0gY3VyW3BhcnRdOwogICAgfSBlbHNlIHsKICAgICAgY3VyID0gY3VyW3BhcnRdID0ge307CiAgICB9CiAgfQp9OwoKCi8qKgogKiBEZWZpbmVzIGEgbmFtZWQgdmFsdWUuIEluIHVuY29tcGlsZWQgbW9kZSwgdGhlIHZhbHVlIGlzIHJldHJpZXZlZCBmcm9tCiAqIENMT1NVUkVfREVGSU5FUyBvciBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyBpZiB0aGUgb2JqZWN0IGlzIGRlZmluZWQgYW5kCiAqIGhhcyB0aGUgcHJvcGVydHkgc3BlY2lmaWVkLCBhbmQgb3RoZXJ3aXNlIHVzZWQgdGhlIGRlZmluZWQgZGVmYXVsdFZhbHVlLgogKiBXaGVuIGNvbXBpbGVkIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZSBjb21waWxlciBvcHRpb25zIG9yIHRoZQogKiB2YWx1ZSBzZXQgaW4gdGhlIENMT1NVUkVfREVGSU5FUyBvYmplY3QuIFJldHVybnMgdGhlIGRlZmluZWQgdmFsdWUgc28gdGhhdCBpdAogKiBjYW4gYmUgdXNlZCBzYWZlbHkgaW4gbW9kdWxlcy4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB0eXBlIE1VU1QgYmUgZWl0aGVyCiAqIGJvb2xlYW4sIG51bWJlciwgb3Igc3RyaW5nLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZGlzdGluZ3Vpc2hlZCBuYW1lIHRvIHByb3ZpZGUuCiAqIEBwYXJhbSB7VH0gZGVmYXVsdFZhbHVlCiAqIEByZXR1cm4ge1R9IFRoZSBkZWZpbmVkIHZhbHVlLgogKiBAdGVtcGxhdGUgVAogKi8KZ29vZy5kZWZpbmUgPSBmdW5jdGlvbihuYW1lLCBkZWZhdWx0VmFsdWUpIHsKICB2YXIgdmFsdWUgPSBkZWZhdWx0VmFsdWU7CiAgaWYgKCFDT01QSUxFRCkgewogICAgdmFyIHVuY29tcGlsZWREZWZpbmVzID0gZ29vZy5nbG9iYWwuQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVM7CiAgICB2YXIgZGVmaW5lcyA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUzsKICAgIGlmICh1bmNvbXBpbGVkRGVmaW5lcyAmJgogICAgICAgIC8vIEFudGkgRE9NLWNsb2JiZXJpbmcgcnVudGltZSBjaGVjayAoYi8zNzczNjU3NikuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLyAodW5jb21waWxlZERlZmluZXMpLm5vZGVUeXBlID09PSB1bmRlZmluZWQgJiYKICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodW5jb21waWxlZERlZmluZXMsIG5hbWUpKSB7CiAgICAgIHZhbHVlID0gdW5jb21waWxlZERlZmluZXNbbmFtZV07CiAgICB9IGVsc2UgaWYgKAogICAgICAgIGRlZmluZXMgJiYKICAgICAgICAvLyBBbnRpIERPTS1jbG9iYmVyaW5nIHJ1bnRpbWUgY2hlY2sgKGIvMzc3MzY1NzYpLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8gKGRlZmluZXMpLm5vZGVUeXBlID09PSB1bmRlZmluZWQgJiYKICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmaW5lcywgbmFtZSkpIHsKICAgICAgdmFsdWUgPSBkZWZpbmVzW25hbWVdOwogICAgfQogIH0KICByZXR1cm4gdmFsdWU7Cn07CgoKLyoqCiAqIEBkZWZpbmUge251bWJlcn0gSW50ZWdlciB5ZWFyIGluZGljYXRpbmcgdGhlIHNldCBvZiBicm93c2VyIGZlYXR1cmVzIHRoYXQgYXJlCiAqIGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VudC4gIFRoaXMgaXMgZGVmaW5lZCB0byBpbmNsdWRlIGV4YWN0bHkgZmVhdHVyZXMgdGhhdAogKiB3b3JrIGNvcnJlY3RseSBvbiBhbGwgIm1vZGVybiIgYnJvd3NlcnMgdGhhdCBhcmUgc3RhYmxlIG9uIEphbnVhcnkgMSBvZiB0aGUKICogc3BlY2lmaWVkIHllYXIuICBGb3IgZXhhbXBsZSwKICogYGBganMKICogaWYgKGdvb2cuRkVBVFVSRVNFVF9ZRUFSID49IDIwMTkpIHsKICogICAvLyB1c2UgQVBJcyBrbm93biB0byBiZSBhdmFpbGFibGUgb24gYWxsIG1ham9yIHN0YWJsZSBicm93c2VycyBKYW4gMSwgMjAxOQogKiB9IGVsc2UgewogKiAgIC8vIHBvbHlmaWxsIGZvciBvbGRlciBicm93c2VycwogKiB9CiAqIGBgYAogKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHRoZSBwcmltYXJ5IGRlZmluZSBmb3IgcmVtb3ZpbmcKICogdW5uZWNlc3NhcnkgYnJvd3NlciBjb21wYXRpYmlsaXR5IGNvZGUgKHN1Y2ggYXMgcG9ueWZpbGxzIGFuZCB3b3JrYXJvdW5kcyksCiAqIGFuZCBzaG91bGQgaW5mb3JtIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBtb3N0IG90aGVyIGRlZmluZXM6CiAqIGBgYGpzCiAqIGNvbnN0IEFTU1VNRV9OQVRJVkVfUFJPTUlTRSA9CiAqICAgICBnb29nLmRlZmluZSgnQVNTVU1FX05BVElWRV9QUk9NSVNFJywgZ29vZy5GRUFUVVJFU0VUX1lFQVIgPj0gMjAxNik7CiAqIGBgYAogKgogKiBUaGUgZGVmYXVsdCBhc3N1bXB0aW9uIGlzIHRoYXQgSUU5IGlzIHRoZSBsb3dlc3Qgc3VwcG9ydGVkIGJyb3dzZXIsIHdoaWNoIHdhcwogKiBmaXJzdCBhdmFpbGFibGUgSmFuIDEsIDIwMTIuCiAqCiAqIFRPRE8odXNlcik6IFJlZmVyZW5jZSBtb3JlIHRob3JvdWdoIGRvY3VtZW50YXRpb24gd2hlbiBpdCdzIGF2YWlsYWJsZS4KICovCmdvb2cuRkVBVFVSRVNFVF9ZRUFSID0gZ29vZy5kZWZpbmUoJ2dvb2cuRkVBVFVSRVNFVF9ZRUFSJywgMjAxMik7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IERFQlVHIGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBkZWJ1Z2dpbmcgY29kZQogKiB0aGF0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gYSBwcm9kdWN0aW9uLiBJdCBjYW4gYmUgZWFzaWx5IHN0cmlwcGVkCiAqIGJ5IHNwZWNpZnlpbmcgLS1kZWZpbmUgZ29vZy5ERUJVRz1mYWxzZSB0byB0aGUgQ2xvc3VyZSBDb21waWxlciBha2EKICogSlNDb21waWxlci4gRm9yIGV4YW1wbGUsIG1vc3QgdG9TdHJpbmcoKSBtZXRob2RzIHNob3VsZCBiZSBkZWNsYXJlZCBpbnNpZGUgYW4KICogImlmIChnb29nLkRFQlVHKSIgY29uZGl0aW9uYWwgYmVjYXVzZSB0aGV5IGFyZSBnZW5lcmFsbHkgdXNlZCBmb3IgZGVidWdnaW5nCiAqIHB1cnBvc2VzIGFuZCBpdCBpcyBkaWZmaWN1bHQgZm9yIHRoZSBKU0NvbXBpbGVyIHRvIHN0YXRpY2FsbHkgZGV0ZXJtaW5lCiAqIHdoZXRoZXIgdGhleSBhcmUgdXNlZC4KICovCmdvb2cuREVCVUcgPSBnb29nLmRlZmluZSgnZ29vZy5ERUJVRycsIHRydWUpOwoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IExPQ0FMRSBkZWZpbmVzIHRoZSBsb2NhbGUgYmVpbmcgdXNlZCBmb3IgY29tcGlsYXRpb24uIEl0IGlzCiAqIHVzZWQgdG8gc2VsZWN0IGxvY2FsZSBzcGVjaWZpYyBkYXRhIHRvIGJlIGNvbXBpbGVkIGluIGpzIGJpbmFyeS4gQlVJTEQgcnVsZQogKiBjYW4gc3BlY2lmeSB0aGlzIHZhbHVlIGJ5ICItLWRlZmluZSBnb29nLkxPQ0FMRT08bG9jYWxlX25hbWU+IiBhcyBhIGNvbXBpbGVyCiAqIG9wdGlvbi4KICoKICogVGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgbG9jYWxlIGNvZGUgZm9ybWF0IGlzIGltcG9ydGFudC4gWW91IHNob3VsZCB1c2UKICogdGhlIGNhbm9uaWNhbCBVbmljb2RlIGZvcm1hdCB3aXRoIGh5cGhlbiBhcyBhIGRlbGltaXRlci4gTGFuZ3VhZ2UgbXVzdCBiZQogKiBsb3dlcmNhc2UsIExhbmd1YWdlIFNjcmlwdCAtIENhcGl0YWxpemVkLCBSZWdpb24gLSBVUFBFUkNBU0UuCiAqIFRoZXJlIGFyZSBmZXcgZXhhbXBsZXM6IHB0LUJSLCBlbiwgZW4tVVMsIHNyLUxhdGluLUJPLCB6aC1IYW5zLUNOLgogKgogKiBTZWUgbW9yZSBpbmZvIGFib3V0IGxvY2FsZSBjb2RlcyBoZXJlOgogKiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS8jVW5pY29kZV9MYW5ndWFnZV9hbmRfTG9jYWxlX0lkZW50aWZpZXJzCiAqCiAqIEZvciBsYW5ndWFnZSBjb2RlcyB5b3Ugc2hvdWxkIHVzZSB2YWx1ZXMgZGVmaW5lZCBieSBJU08gNjkzLTEuIFNlZSBpdCBoZXJlCiAqIGh0dHA6Ly93d3cudzMub3JnL1dBSS9FUi9JRy9lcnQvaXNvNjM5Lmh0bS4gVGhlcmUgaXMgb25seSBvbmUgZXhjZXB0aW9uIGZyb20KICogdGhpcyBydWxlOiB0aGUgSGVicmV3IGxhbmd1YWdlLiBGb3IgbGVnYWN5IHJlYXNvbnMgdGhlIG9sZCBjb2RlIChpdykgc2hvdWxkCiAqIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbmV3IGNvZGUgKGhlKS4KICoKICovCmdvb2cuTE9DQUxFID0gZ29vZy5kZWZpbmUoJ2dvb2cuTE9DQUxFJywgJ2VuJyk7ICAvLyBkZWZhdWx0IHRvIGVuCgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBjb2RlIGlzIHJ1bm5pbmcgb24gdHJ1c3RlZCBzaXRlcy4KICoKICogT24gdW50cnVzdGVkIHNpdGVzLCBzZXZlcmFsIG5hdGl2ZSBmdW5jdGlvbnMgY2FuIGJlIGRlZmluZWQgb3Igb3ZlcnJpZGRlbiBieQogKiBleHRlcm5hbCBsaWJyYXJpZXMgbGlrZSBQcm90b3R5cGUsIERhdGVqcywgYW5kIEpRdWVyeSBhbmQgc2V0dGluZyB0aGlzIGZsYWcKICogdG8gZmFsc2UgZm9yY2VzIGNsb3N1cmUgdG8gdXNlIGl0cyBvd24gaW1wbGVtZW50YXRpb25zIHdoZW4gcG9zc2libGUuCiAqCiAqIElmIHlvdXIgSmF2YVNjcmlwdCBjYW4gYmUgbG9hZGVkIGJ5IGEgdGhpcmQgcGFydHkgc2l0ZSBhbmQgeW91IGFyZSB3YXJ5IGFib3V0CiAqIHJlbHlpbmcgb24gbm9uLXN0YW5kYXJkIGltcGxlbWVudGF0aW9ucywgc3BlY2lmeQogKiAiLS1kZWZpbmUgZ29vZy5UUlVTVEVEX1NJVEU9ZmFsc2UiIHRvIHRoZSBjb21waWxlci4KICovCmdvb2cuVFJVU1RFRF9TSVRFID0gZ29vZy5kZWZpbmUoJ2dvb2cuVFJVU1RFRF9TSVRFJywgdHJ1ZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgYSBwcm9qZWN0IGlzIGV4cGVjdGVkIHRvIGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUuCiAqCiAqIFRoaXMgZGVmaW5lIGNhbiBiZSB1c2VkIHRvIHRyaWdnZXIgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBjb21wYXRpYmxlIHdpdGgKICogcnVubmluZyBpbiBFY21hU2NyaXB0IFN0cmljdCBtb2RlIG9yIHdhcm4gYWJvdXQgdW5hdmFpbGFibGUgZnVuY3Rpb25hbGl0eS4KICogQHNlZSBodHRwczovL2dvby5nbC9QdWRRNHkKICoKICovCmdvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRSA9IGdvb2cuZGVmaW5lKCdnb29nLlNUUklDVF9NT0RFX0NPTVBBVElCTEUnLCBmYWxzZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgY29kZSB0aGF0IGNhbGxzIHtAbGluayBnb29nLnNldFRlc3RPbmx5fSBzaG91bGQKICogICAgIGJlIGRpc2FsbG93ZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuCiAqLwpnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFID0KICAgIGdvb2cuZGVmaW5lKCdnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFJywgQ09NUElMRUQgJiYgIWdvb2cuREVCVUcpOwoKCi8qKgogKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIHVzZSBhIENocm9tZSBhcHAgQ1NQLWNvbXBsaWFudCBtZXRob2QgZm9yCiAqICAgICBsb2FkaW5nIHNjcmlwdHMgdmlhIGdvb2cucmVxdWlyZS4gQHNlZSBhcHBlbmRTY3JpcHRTcmNOb2RlXy4KICovCmdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyA9CiAgICBnb29nLmRlZmluZSgnZ29vZy5FTkFCTEVfQ0hST01FX0FQUF9TQUZFX1NDUklQVF9MT0FESU5HJywgZmFsc2UpOwoKCi8qKgogKiBEZWZpbmVzIGEgbmFtZXNwYWNlIGluIENsb3N1cmUuCiAqCiAqIEEgbmFtZXNwYWNlIG1heSBvbmx5IGJlIGRlZmluZWQgb25jZSBpbiBhIGNvZGViYXNlLiBJdCBtYXkgYmUgZGVmaW5lZCB1c2luZwogKiBnb29nLnByb3ZpZGUoKSBvciBnb29nLm1vZHVsZSgpLgogKgogKiBUaGUgcHJlc2VuY2Ugb2Ygb25lIG9yIG1vcmUgZ29vZy5wcm92aWRlKCkgY2FsbHMgaW4gYSBmaWxlIGluZGljYXRlcwogKiB0aGF0IHRoZSBmaWxlIGRlZmluZXMgdGhlIGdpdmVuIG9iamVjdHMvbmFtZXNwYWNlcy4KICogUHJvdmlkZWQgc3ltYm9scyBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4KICoKICogSW4gYWRkaXRpb24sIGdvb2cucHJvdmlkZSgpIGNyZWF0ZXMgdGhlIG9iamVjdCBzdHVicyBmb3IgYSBuYW1lc3BhY2UKICogKGZvciBleGFtcGxlLCBnb29nLnByb3ZpZGUoImdvb2cuZm9vLmJhciIpIHdpbGwgY3JlYXRlIHRoZSBvYmplY3QKICogZ29vZy5mb28uYmFyIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QpLgogKgogKiBCdWlsZCB0b29scyBhbHNvIHNjYW4gZm9yIHByb3ZpZGUvcmVxdWlyZS9tb2R1bGUgc3RhdGVtZW50cwogKiB0byBkaXNjZXJuIGRlcGVuZGVuY2llcywgYnVpbGQgZGVwZW5kZW5jeSBmaWxlcyAoc2VlIGRlcHMuanMpLCBldGMuCiAqCiAqIEBzZWUgZ29vZy5yZXF1aXJlCiAqIEBzZWUgZ29vZy5tb2R1bGUKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZXNwYWNlIHByb3ZpZGVkIGJ5IHRoaXMgZmlsZSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICovCmdvb2cucHJvdmlkZSA9IGZ1bmN0aW9uKG5hbWUpIHsKICBpZiAoZ29vZy5pc0luTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cucHJvdmlkZSBjYW5ub3QgYmUgdXNlZCB3aXRoaW4gYSBtb2R1bGUuJyk7CiAgfQogIGlmICghQ09NUElMRUQpIHsKICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzYW1lIG5hbWVzcGFjZSBpc24ndCBwcm92aWRlZCB0d2ljZS4KICAgIC8vIEEgZ29vZy5tb2R1bGUvZ29vZy5wcm92aWRlIG1hcHMgYSBnb29nLnJlcXVpcmUgdG8gYSBzcGVjaWZpYyBmaWxlCiAgICBpZiAoZ29vZy5pc1Byb3ZpZGVkXyhuYW1lKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hbWVzcGFjZSAiJyArIG5hbWUgKyAnIiBhbHJlYWR5IGRlY2xhcmVkLicpOwogICAgfQogIH0KCiAgZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKG5hbWUpOwp9OwoKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgcHJvdmlkZWQgYnkgdGhpcyBmaWxlIGluIHRoZSBmb3JtCiAqICAgICAiZ29vZy5wYWNrYWdlLnBhcnQiLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmogVGhlIG9iamVjdCB0byBlbWJlZCBpbiB0aGUgbmFtZXNwYWNlLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfID0gZnVuY3Rpb24obmFtZSwgb3B0X29iaikgewogIGlmICghQ09NUElMRUQpIHsKICAgIGRlbGV0ZSBnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bbmFtZV07CgogICAgdmFyIG5hbWVzcGFjZSA9IG5hbWU7CiAgICB3aGlsZSAoKG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5zdWJzdHJpbmcoMCwgbmFtZXNwYWNlLmxhc3RJbmRleE9mKCcuJykpKSkgewogICAgICBpZiAoZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZXNwYWNlKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGdvb2cuaW1wbGljaXROYW1lc3BhY2VzX1tuYW1lc3BhY2VdID0gdHJ1ZTsKICAgIH0KICB9CgogIGdvb2cuZXhwb3J0UGF0aF8obmFtZSwgb3B0X29iaik7Cn07CgoKLyoqCiAqIFJldHVybnMgQ1NQIG5vbmNlLCBpZiBzZXQgZm9yIGFueSBzY3JpcHQgdGFnLgogKiBAcGFyYW0gez9XaW5kb3c9fSBvcHRfd2luZG93IFRoZSB3aW5kb3cgY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSBub25jZS4KICogICAgIERlZmF1bHRzIHRvIGdsb2JhbCBjb250ZXh0LgogKiBAcmV0dXJuIHtzdHJpbmd9IENTUCBub25jZSBvciBlbXB0eSBzdHJpbmcgaWYgbm8gbm9uY2UgaXMgcHJlc2VudC4KICovCmdvb2cuZ2V0U2NyaXB0Tm9uY2UgPSBmdW5jdGlvbihvcHRfd2luZG93KSB7CiAgaWYgKG9wdF93aW5kb3cgJiYgb3B0X3dpbmRvdyAhPSBnb29nLmdsb2JhbCkgewogICAgcmV0dXJuIGdvb2cuZ2V0U2NyaXB0Tm9uY2VfKG9wdF93aW5kb3cuZG9jdW1lbnQpOwogIH0KICBpZiAoZ29vZy5jc3BOb25jZV8gPT09IG51bGwpIHsKICAgIGdvb2cuY3NwTm9uY2VfID0gZ29vZy5nZXRTY3JpcHROb25jZV8oZ29vZy5nbG9iYWwuZG9jdW1lbnQpOwogIH0KICByZXR1cm4gZ29vZy5jc3BOb25jZV87Cn07CgoKLyoqCiAqIEFjY29yZGluZyB0byB0aGUgQ1NQMyBzcGVjIGEgbm9uY2UgbXVzdCBiZSBhIHZhbGlkIGJhc2U2NCBzdHJpbmcuCiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDMvI2dyYW1tYXJkZWYtYmFzZTY0LXZhbHVlCiAqIEBwcml2YXRlIEBjb25zdAogKi8KZ29vZy5OT05DRV9QQVRURVJOXyA9IC9eW1x3Ky9fLV0rWz1dezAsMn0kLzsKCgovKioKICogQHByaXZhdGUgez9zdHJpbmd9CiAqLwpnb29nLmNzcE5vbmNlXyA9IG51bGw7CgoKLyoqCiAqIFJldHVybnMgQ1NQIG5vbmNlLCBpZiBzZXQgZm9yIGFueSBzY3JpcHQgdGFnLgogKiBAcGFyYW0geyFEb2N1bWVudH0gZG9jCiAqIEByZXR1cm4ge3N0cmluZ30gQ1NQIG5vbmNlIG9yIGVtcHR5IHN0cmluZyBpZiBubyBub25jZSBpcyBwcmVzZW50LgogKiBAcHJpdmF0ZQogKi8KZ29vZy5nZXRTY3JpcHROb25jZV8gPSBmdW5jdGlvbihkb2MpIHsKICB2YXIgc2NyaXB0ID0gZG9jLnF1ZXJ5U2VsZWN0b3IgJiYgZG9jLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtub25jZV0nKTsKICBpZiAoc2NyaXB0KSB7CiAgICAvLyBUcnkgdG8gZ2V0IHRoZSBub25jZSBmcm9tIHRoZSBJREwgcHJvcGVydHkgZmlyc3QsIGJlY2F1c2UgYnJvd3NlcnMgdGhhdAogICAgLy8gaW1wbGVtZW50IGFkZGl0aW9uYWwgbm9uY2UgcHJvdGVjdGlvbiBmZWF0dXJlcyAoY3VycmVudGx5IG9ubHkgQ2hyb21lKSB0bwogICAgLy8gcHJldmVudCBub25jZSBzdGVhbGluZyB2aWEgQ1NTIGRvIG5vdCBleHBvc2UgdGhlIG5vbmNlIHZpYSBhdHRyaWJ1dGVzLgogICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvaHRtbC9pc3N1ZXMvMjM2OQogICAgdmFyIG5vbmNlID0gc2NyaXB0Wydub25jZSddIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoJ25vbmNlJyk7CiAgICBpZiAobm9uY2UgJiYgZ29vZy5OT05DRV9QQVRURVJOXy50ZXN0KG5vbmNlKSkgewogICAgICByZXR1cm4gbm9uY2U7CiAgICB9CiAgfQogIHJldHVybiAnJzsKfTsKCgovKioKICogTW9kdWxlIGlkZW50aWZpZXIgdmFsaWRhdGlvbiByZWdleHAuCiAqIE5vdGU6IFRoaXMgaXMgYSBjb25zZXJ2YXRpdmUgY2hlY2ssIGl0IGlzIHZlcnkgcG9zc2libGUgdG8gYmUgbW9yZSBsZW5pZW50LAogKiAgIHRoZSBwcmltYXJ5IGV4Y2x1c2lvbiBoZXJlIGlzICIvIiBhbmQgIlwiIGFuZCBhIGxlYWRpbmcgIi4iLCB0aGVzZQogKiAgIHJlc3RyaWN0aW9ucyBhcmUgaW50ZW5kZWQgdG8gbGVhdmUgdGhlIGRvb3Igb3BlbiBmb3IgdXNpbmcgZ29vZy5yZXF1aXJlCiAqICAgd2l0aCByZWxhdGl2ZSBmaWxlIHBhdGhzIHJhdGhlciB0aGFuIG1vZHVsZSBpZGVudGlmaWVycy4KICogQHByaXZhdGUKICovCmdvb2cuVkFMSURfTU9EVUxFX1JFXyA9IC9eW2EtekEtWl8kXVthLXpBLVowLTkuXyRdKiQvOwoKCi8qKgogKiBEZWZpbmVzIGEgbW9kdWxlIGluIENsb3N1cmUuCiAqCiAqIE1hcmtzIHRoYXQgdGhpcyBmaWxlIG11c3QgYmUgbG9hZGVkIGFzIGEgbW9kdWxlIGFuZCBjbGFpbXMgdGhlIG5hbWVzcGFjZS4KICoKICogQSBuYW1lc3BhY2UgbWF5IG9ubHkgYmUgZGVmaW5lZCBvbmNlIGluIGEgY29kZWJhc2UuIEl0IG1heSBiZSBkZWZpbmVkIHVzaW5nCiAqIGdvb2cucHJvdmlkZSgpIG9yIGdvb2cubW9kdWxlKCkuCiAqCiAqIGdvb2cubW9kdWxlKCkgaGFzIHRocmVlIHJlcXVpcmVtZW50czoKICogLSBnb29nLm1vZHVsZSBtYXkgbm90IGJlIHVzZWQgaW4gdGhlIHNhbWUgZmlsZSBhcyBnb29nLnByb3ZpZGUuCiAqIC0gZ29vZy5tb2R1bGUgbXVzdCBiZSB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBmaWxlLgogKiAtIG9ubHkgb25lIGdvb2cubW9kdWxlIGlzIGFsbG93ZWQgcGVyIGZpbGUuCiAqCiAqIFdoZW4gYSBnb29nLm1vZHVsZSBhbm5vdGF0ZWQgZmlsZSBpcyBsb2FkZWQsIGl0IGlzIGVuY2xvc2VkIGluCiAqIGEgc3RyaWN0IGZ1bmN0aW9uIGNsb3N1cmUuIFRoaXMgbWVhbnMgdGhhdDoKICogLSBhbnkgdmFyaWFibGVzIGRlY2xhcmVkIGluIGEgZ29vZy5tb2R1bGUgZmlsZSBhcmUgcHJpdmF0ZSB0byB0aGUgZmlsZQogKiAobm90IGdsb2JhbCksIHRob3VnaCB0aGUgY29tcGlsZXIgaXMgZXhwZWN0ZWQgdG8gaW5saW5lIHRoZSBtb2R1bGUuCiAqIC0gVGhlIGNvZGUgbXVzdCBvYmV5IGFsbCB0aGUgcnVsZXMgb2YgInN0cmljdCIgSmF2YVNjcmlwdC4KICogLSB0aGUgZmlsZSB3aWxsIGJlIG1hcmtlZCBhcyAidXNlIHN0cmljdCIKICoKICogTk9URTogdW5saWtlIGdvb2cucHJvdmlkZSwgZ29vZy5tb2R1bGUgZG9lcyBub3QgZGVjbGFyZSBhbnkgc3ltYm9scyBieQogKiBpdHNlbGYuIElmIGRlY2xhcmVkIHN5bWJvbHMgYXJlIGRlc2lyZWQsIHVzZQogKiBnb29nLm1vZHVsZS5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlKCkuCiAqCiAqCiAqIFNlZSB0aGUgcHVibGljIGdvb2cubW9kdWxlIHByb3Bvc2FsOiBodHRwOi8vZ29vLmdsL1ZhMWhpbgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgcHJvdmlkZWQgYnkgdGhpcyBmaWxlIGluIHRoZSBmb3JtCiAqICAgICAiZ29vZy5wYWNrYWdlLnBhcnQiLCBpcyBleHBlY3RlZCBidXQgbm90IHJlcXVpcmVkLgogKiBAcmV0dXJuIHt2b2lkfQogKi8KZ29vZy5tb2R1bGUgPSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCAhbmFtZSB8fAogICAgICBuYW1lLnNlYXJjaChnb29nLlZBTElEX01PRFVMRV9SRV8pID09IC0xKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIGlkZW50aWZpZXInKTsKICB9CiAgaWYgKCFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ01vZHVsZSAnICsgbmFtZSArICcgaGFzIGJlZW4gbG9hZGVkIGluY29ycmVjdGx5LiBOb3RlLCAnICsKICAgICAgICAnbW9kdWxlcyBjYW5ub3QgYmUgbG9hZGVkIGFzIG5vcm1hbCBzY3JpcHRzLiBUaGV5IHJlcXVpcmUgc29tZSBraW5kIG9mICcgKwogICAgICAgICdwcmUtcHJvY2Vzc2luZyBzdGVwLiBZb3VcJ3JlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBhIG1vZHVsZSB2aWEgYSAnICsKICAgICAgICAnc2NyaXB0IHRhZyBvciBhcyBhIHBhcnQgb2YgYSBjb25jYXRlbmF0ZWQgYnVuZGxlIHdpdGhvdXQgcmV3cml0aW5nIHRoZSAnICsKICAgICAgICAnbW9kdWxlLiBGb3IgbW9yZSBpbmZvIHNlZTogJyArCiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L3dpa2kvZ29vZy5tb2R1bGU6LWFuLUVTNi1tb2R1bGUtbGlrZS1hbHRlcm5hdGl2ZS10by1nb29nLnByb3ZpZGUuJyk7CiAgfQogIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cubW9kdWxlIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBtb2R1bGUuJyk7CiAgfQoKICAvLyBTdG9yZSB0aGUgbW9kdWxlIG5hbWUgZm9yIHRoZSBsb2FkZXIuCiAgZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZSA9IG5hbWU7CiAgaWYgKCFDT01QSUxFRCkgewogICAgLy8gRW5zdXJlIHRoYXQgdGhlIHNhbWUgbmFtZXNwYWNlIGlzbid0IHByb3ZpZGVkIHR3aWNlLgogICAgLy8gQSBnb29nLm1vZHVsZS9nb29nLnByb3ZpZGUgbWFwcyBhIGdvb2cucmVxdWlyZSB0byBhIHNwZWNpZmljIGZpbGUKICAgIGlmIChnb29nLmlzUHJvdmlkZWRfKG5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTmFtZXNwYWNlICInICsgbmFtZSArICciIGFscmVhZHkgZGVjbGFyZWQuJyk7CiAgICB9CiAgICBkZWxldGUgZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW25hbWVdOwogIH0KfTsKCgovKioKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG1vZHVsZSBpZGVudGlmaWVyLgogKiBAcmV0dXJuIHs/fSBUaGUgbW9kdWxlIGV4cG9ydHMgZm9yIGFuIGFscmVhZHkgbG9hZGVkIG1vZHVsZSBvciBudWxsLgogKgogKiBOb3RlOiBUaGlzIGlzIG5vdCBhbiBhbHRlcm5hdGl2ZSB0byBnb29nLnJlcXVpcmUsIGl0IGRvZXMgbm90CiAqIGluZGljYXRlIGEgaGFyZCBkZXBlbmRlbmN5LCBpbnN0ZWFkIGl0IGlzIHVzZWQgdG8gaW5kaWNhdGUKICogYW4gb3B0aW9uYWwgZGVwZW5kZW5jeSBvciB0byBhY2Nlc3MgdGhlIGV4cG9ydHMgb2YgYSBtb2R1bGUKICogdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4KICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICovCmdvb2cubW9kdWxlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHsKICByZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKG5hbWUpOwp9OwoKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbW9kdWxlIGlkZW50aWZpZXIuCiAqIEByZXR1cm4gez99IFRoZSBtb2R1bGUgZXhwb3J0cyBmb3IgYW4gYWxyZWFkeSBsb2FkZWQgbW9kdWxlIG9yIG51bGwuCiAqIEBwcml2YXRlCiAqLwpnb29nLm1vZHVsZS5nZXRJbnRlcm5hbF8gPSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKCFDT01QSUxFRCkgewogICAgaWYgKG5hbWUgaW4gZ29vZy5sb2FkZWRNb2R1bGVzXykgewogICAgICByZXR1cm4gZ29vZy5sb2FkZWRNb2R1bGVzX1tuYW1lXS5leHBvcnRzOwogICAgfSBlbHNlIGlmICghZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW25hbWVdKSB7CiAgICAgIHZhciBucyA9IGdvb2cuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpOwogICAgICByZXR1cm4gbnMgIT0gbnVsbCA/IG5zIDogbnVsbDsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn07CgoKLyoqCiAqIFR5cGVzIG9mIG1vZHVsZXMgdGhlIGRlYnVnIGxvYWRlciBjYW4gbG9hZC4KICogQGVudW0ge3N0cmluZ30KICovCmdvb2cuTW9kdWxlVHlwZSA9IHsKICBFUzY6ICdlczYnLAogIEdPT0c6ICdnb29nJwp9OwoKCi8qKgogKiBAcHJpdmF0ZSB7P3sKICogICBtb2R1bGVOYW1lOiAoc3RyaW5nfHVuZGVmaW5lZCksCiAqICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTpib29sZWFuLAogKiAgIHR5cGU6ID9nb29nLk1vZHVsZVR5cGUKICogfX0KICovCmdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gbnVsbDsKCgovKioKICogQHByaXZhdGUKICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhIGdvb2cubW9kdWxlIG9yIGFuIGVzNiBtb2R1bGUgaXMgY3VycmVudGx5IGJlaW5nCiAqICAgICBpbml0aWFsaXplZC4KICovCmdvb2cuaXNJbk1vZHVsZUxvYWRlcl8gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZ29vZy5pc0luR29vZ01vZHVsZUxvYWRlcl8oKSB8fCBnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfKCk7Cn07CgoKLyoqCiAqIEBwcml2YXRlCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSBnb29nLm1vZHVsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW5pdGlhbGl6ZWQuCiAqLwpnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiAhIWdvb2cubW9kdWxlTG9hZGVyU3RhdGVfICYmCiAgICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLnR5cGUgPT0gZ29vZy5Nb2R1bGVUeXBlLkdPT0c7Cn07CgoKLyoqCiAqIEBwcml2YXRlCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYW4gZXM2IG1vZHVsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW5pdGlhbGl6ZWQuCiAqLwpnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfID0gZnVuY3Rpb24oKSB7CiAgdmFyIGluTG9hZGVyID0gISFnb29nLm1vZHVsZUxvYWRlclN0YXRlXyAmJgogICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy50eXBlID09IGdvb2cuTW9kdWxlVHlwZS5FUzY7CgogIGlmIChpbkxvYWRlcikgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKCiAgaWYgKGpzY29tcCkgewogICAgLy8ganNjb21wIG1heSBub3QgaGF2ZSBnZXRDdXJyZW50TW9kdWxlUGF0aCBpZiB0aGlzIGlzIGEgY29tcGlsZWQgYnVuZGxlCiAgICAvLyB0aGF0IGhhcyBzb21lIG9mIHRoZSBydW50aW1lLCBidXQgbm90IGFsbCBvZiBpdC4gVGhpcyBjYW4gaGFwcGVuIGlmCiAgICAvLyBvcHRpbWl6YXRpb25zIGFyZSB0dXJuZWQgb24gc28gdGhlIHVudXNlZCBydW50aW1lIGlzIHJlbW92ZWQgYnV0IHJlbmFtaW5nCiAgICAvLyBhbmQgQ2xvc3VyZSBwYXNzIGFyZSBvZmYgKHNvICRqc2NvbXAgaXMgc3RpbGwgbmFtZWQgJGpzY29tcCBhbmQgdGhlCiAgICAvLyBnb29nLnByb3ZpZGUvcmVxdWlyZSBjYWxscyBzdGlsbCBleGlzdCkuCiAgICBpZiAodHlwZW9mIGpzY29tcC5nZXRDdXJyZW50TW9kdWxlUGF0aCAhPSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBCdW5kbGVkIEVTNiBtb2R1bGUuCiAgICByZXR1cm4gISFqc2NvbXAuZ2V0Q3VycmVudE1vZHVsZVBhdGgoKTsKICB9CgogIHJldHVybiBmYWxzZTsKfTsKCgovKioKICogUHJvdmlkZSB0aGUgbW9kdWxlJ3MgZXhwb3J0cyBhcyBhIGdsb2JhbGx5IGFjY2Vzc2libGUgb2JqZWN0IHVuZGVyIHRoZQogKiBtb2R1bGUncyBkZWNsYXJlZCBuYW1lLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBlYXNlIG1pZ3JhdGlvbiB0byBnb29nLm1vZHVsZQogKiBmb3IgZmlsZXMgdGhhdCBoYXZlIGV4aXN0aW5nIHVzYWdlcy4KICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICovCmdvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2UgPSBmdW5jdGlvbigpIHsKICBpZiAoIUNPTVBJTEVEICYmICFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ2dvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2UgbXVzdCBiZSBjYWxsZWQgZnJvbSAnICsKICAgICAgICAnd2l0aGluIGEgZ29vZy5tb2R1bGUnKTsKICB9CiAgaWYgKCFDT01QSUxFRCAmJiAhZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdnb29nLm1vZHVsZSBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byAnICsKICAgICAgICAnZ29vZy5tb2R1bGUuZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZS4nKTsKICB9CiAgZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8uZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZSA9IHRydWU7Cn07CgoKLyoqCiAqIEFzc29jaWF0ZXMgYW4gRVM2IG1vZHVsZSB3aXRoIGEgQ2xvc3VyZSBtb2R1bGUgSUQgc28gdGhhdCBpcyBhdmFpbGFibGUgdmlhCiAqIGdvb2cucmVxdWlyZS4gVGhlIGFzc29jaWF0ZWQgSUQgIGFjdHMgbGlrZSBhIGdvb2cubW9kdWxlIElEIC0gaXQgZG9lcyBub3QKICogY3JlYXRlIGFueSBnbG9iYWwgbmFtZXMsIGl0IGlzIG1lcmVseSBhdmFpbGFibGUgdmlhIGdvb2cucmVxdWlyZSAvCiAqIGdvb2cubW9kdWxlLmdldCAvIGdvb2cuZm9yd2FyZERlY2xhcmUgLyBnb29nLnJlcXVpcmVUeXBlLiBnb29nLnJlcXVpcmUgYW5kCiAqIGdvb2cubW9kdWxlLmdldCB3aWxsIHJldHVybiB0aGUgZW50aXJlIG1vZHVsZSBhcyBpZiBpdCB3YXMgaW1wb3J0IConZC4gVGhpcwogKiBhbGxvd3MgQ2xvc3VyZSBmaWxlcyB0byByZWZlcmVuY2UgRVM2IG1vZHVsZXMgZm9yIHRoZSBzYWtlIG9mIG1pZ3JhdGlvbi4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZQogKiBAc3VwcHJlc3Mge21pc3NpbmdQcm92aWRlfQogKi8KZ29vZy5kZWNsYXJlTW9kdWxlSWQgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICBpZiAoIUNPTVBJTEVEKSB7CiAgICBpZiAoIWdvb2cuaXNJbkVzNk1vZHVsZUxvYWRlcl8oKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnZ29vZy5kZWNsYXJlTW9kdWxlSWQgbWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gJyArCiAgICAgICAgICAnd2l0aGluIGFuIEVTNiBtb2R1bGUnKTsKICAgIH0KICAgIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXyAmJiBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdnb29nLmRlY2xhcmVNb2R1bGVJZCBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgbW9kdWxlLicpOwogICAgfQogICAgaWYgKG5hbWVzcGFjZSBpbiBnb29nLmxvYWRlZE1vZHVsZXNfKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdNb2R1bGUgd2l0aCBuYW1lc3BhY2UgIicgKyBuYW1lc3BhY2UgKyAnIiBhbHJlYWR5IGV4aXN0cy4nKTsKICAgIH0KICB9CiAgaWYgKGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfKSB7CiAgICAvLyBOb3QgYnVuZGxlZCAtIGRlYnVnIGxvYWRpbmcuCiAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lID0gbmFtZXNwYWNlOwogIH0gZWxzZSB7CiAgICAvLyBCdW5kbGVkIC0gbm90IGRlYnVnIGxvYWRpbmcsIG5vIG1vZHVsZSBsb2FkZXIgc3RhdGUuCiAgICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKICAgIGlmICghanNjb21wIHx8IHR5cGVvZiBqc2NvbXAuZ2V0Q3VycmVudE1vZHVsZVBhdGggIT0gJ2Z1bmN0aW9uJykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnTW9kdWxlIHdpdGggbmFtZXNwYWNlICInICsgbmFtZXNwYWNlICsKICAgICAgICAgICciIGhhcyBiZWVuIGxvYWRlZCBpbmNvcnJlY3RseS4nKTsKICAgIH0KICAgIHZhciBleHBvcnRzID0ganNjb21wLnJlcXVpcmUoanNjb21wLmdldEN1cnJlbnRNb2R1bGVQYXRoKCkpOwogICAgZ29vZy5sb2FkZWRNb2R1bGVzX1tuYW1lc3BhY2VdID0gewogICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICB0eXBlOiBnb29nLk1vZHVsZVR5cGUuRVM2LAogICAgICBtb2R1bGVJZDogbmFtZXNwYWNlCiAgICB9OwogIH0KfTsKCgovKioKICogTWFya3MgdGhhdCB0aGUgY3VycmVudCBmaWxlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RpbmcsIGFuZCBuZXZlciBmb3IKICogbGl2ZSBjb2RlIGluIHByb2R1Y3Rpb24uCiAqCiAqIEluIHRoZSBjYXNlIG9mIHVuaXQgdGVzdHMsIHRoZSBtZXNzYWdlIG1heSBvcHRpb25hbGx5IGJlIGFuIGV4YWN0IG5hbWVzcGFjZQogKiBmb3IgdGhlIHRlc3QgKGUuZy4gJ2dvb2cuc3RyaW5nVGVzdCcpLiBUaGUgbGludGVyIHdpbGwgdGhlbiBpZ25vcmUgdGhlIGV4dHJhCiAqIHByb3ZpZGUgKGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgaW4gdGhlIGNvZGUpLgogKgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9tZXNzYWdlIE9wdGlvbmFsIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBlcnJvciB0aGF0J3MKICogICAgIHJhaXNlZCB3aGVuIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLgogKi8KZ29vZy5zZXRUZXN0T25seSA9IGZ1bmN0aW9uKG9wdF9tZXNzYWdlKSB7CiAgaWYgKGdvb2cuRElTQUxMT1dfVEVTVF9PTkxZX0NPREUpIHsKICAgIG9wdF9tZXNzYWdlID0gb3B0X21lc3NhZ2UgfHwgJyc7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ0ltcG9ydGluZyB0ZXN0LW9ubHkgY29kZSBpbnRvIG5vbi1kZWJ1ZyBlbnZpcm9ubWVudCcgKwogICAgICAgIChvcHRfbWVzc2FnZSA/ICc6ICcgKyBvcHRfbWVzc2FnZSA6ICcuJykpOwogIH0KfTsKCgovKioKICogRm9yd2FyZCBkZWNsYXJlcyBhIHN5bWJvbC4gVGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRvIHRoZSBjb21waWxlciB0aGF0IHRoZQogKiBzeW1ib2wgbWF5IGJlIHVzZWQgaW4gdGhlIHNvdXJjZSB5ZXQgaXMgbm90IHJlcXVpcmVkIGFuZCBtYXkgbm90IGJlIHByb3ZpZGVkCiAqIGluIGNvbXBpbGF0aW9uLgogKgogKiBUaGUgbW9zdCBjb21tb24gdXNhZ2Ugb2YgZm9yd2FyZCBkZWNsYXJhdGlvbiBpcyBjb2RlIHRoYXQgdGFrZXMgYSB0eXBlIGFzIGEKICogZnVuY3Rpb24gcGFyYW1ldGVyIGJ1dCBkb2VzIG5vdCBuZWVkIHRvIHJlcXVpcmUgaXQuIEJ5IGZvcndhcmQgZGVjbGFyaW5nCiAqIGluc3RlYWQgb2YgcmVxdWlyaW5nLCBubyBoYXJkIGRlcGVuZGVuY3kgaXMgbWFkZSwgYW5kIChpZiBub3QgcmVxdWlyZWQKICogZWxzZXdoZXJlKSB0aGUgbmFtZXNwYWNlIG1heSBuZXZlciBiZSByZXF1aXJlZCBhbmQgdGh1cywgbm90IGJlIHB1bGxlZAogKiBpbnRvIHRoZSBKYXZhU2NyaXB0IGJpbmFyeS4gSWYgaXQgaXMgcmVxdWlyZWQgZWxzZXdoZXJlLCBpdCB3aWxsIGJlIHR5cGUKICogY2hlY2tlZCBhcyBub3JtYWwuCiAqCiAqIEJlZm9yZSB1c2luZyBnb29nLmZvcndhcmREZWNsYXJlLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBhdAogKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvd2lraS9CYWQtVHlwZS1Bbm5vdGF0aW9uIHRvCiAqIHVuZGVyc3RhbmQgdGhlIG9wdGlvbnMgYW5kIHRyYWRlb2ZmcyB3aGVuIHdvcmtpbmcgd2l0aCBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWVzcGFjZSB0byBmb3J3YXJkIGRlY2xhcmUgaW4gdGhlIGZvcm0gb2YKICogICAgICJnb29nLnBhY2thZ2UucGFydCIuCiAqLwpnb29nLmZvcndhcmREZWNsYXJlID0gZnVuY3Rpb24obmFtZSkge307CgoKLyoqCiAqIEZvcndhcmQgZGVjbGFyZSB0eXBlIGluZm9ybWF0aW9uLiBVc2VkIHRvIGFzc2lnbiB0eXBlcyB0byBnb29nLmdsb2JhbAogKiByZWZlcmVuY2VkIG9iamVjdCB0aGF0IHdvdWxkIG90aGVyd2lzZSByZXN1bHQgaW4gdW5rbm93biB0eXBlIHJlZmVyZW5jZXMKICogYW5kIHRodXMgYmxvY2sgcHJvcGVydHkgZGlzYW1iaWd1YXRpb24uCiAqLwpnb29nLmZvcndhcmREZWNsYXJlKCdEb2N1bWVudCcpOwpnb29nLmZvcndhcmREZWNsYXJlKCdIVE1MU2NyaXB0RWxlbWVudCcpOwpnb29nLmZvcndhcmREZWNsYXJlKCdYTUxIdHRwUmVxdWVzdCcpOwoKCmlmICghQ09NUElMRUQpIHsKICAvKioKICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbmFtZSBoYXMgYmVlbiBnb29nLnByb3ZpZGVkLiBUaGlzIHdpbGwgcmV0dXJuIGZhbHNlIGZvcgogICAqIG5hbWVzIHRoYXQgYXJlIGF2YWlsYWJsZSBvbmx5IGFzIGltcGxpY2l0IG5hbWVzcGFjZXMuCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgZm9yLgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG5hbWUgaGFzIGJlZW4gcHJvdmlkZWQuCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLmlzUHJvdmlkZWRfID0gZnVuY3Rpb24obmFtZSkgewogICAgcmV0dXJuIChuYW1lIGluIGdvb2cubG9hZGVkTW9kdWxlc18pIHx8CiAgICAgICAgKCFnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bbmFtZV0gJiYgZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZSkgIT0gbnVsbCk7CiAgfTsKCiAgLyoqCiAgICogTmFtZXNwYWNlcyBpbXBsaWNpdGx5IGRlZmluZWQgYnkgZ29vZy5wcm92aWRlLiBGb3IgZXhhbXBsZSwKICAgKiBnb29nLnByb3ZpZGUoJ2dvb2cuZXZlbnRzLkV2ZW50JykgaW1wbGljaXRseSBkZWNsYXJlcyB0aGF0ICdnb29nJyBhbmQKICAgKiAnZ29vZy5ldmVudHMnIG11c3QgYmUgbmFtZXNwYWNlcy4KICAgKgogICAqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgKGJvb2xlYW58dW5kZWZpbmVkKT59CiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLmltcGxpY2l0TmFtZXNwYWNlc18gPSB7J2dvb2cubW9kdWxlJzogdHJ1ZX07CgogIC8vIE5PVEU6IFdlIGFkZCBnb29nLm1vZHVsZSBhcyBhbiBpbXBsaWNpdCBuYW1lc3BhY2UgYXMgZ29vZy5tb2R1bGUgaXMgZGVmaW5lZAogIC8vIGhlcmUgYW5kIGJlY2F1c2UgdGhlIGV4aXN0aW5nIG1vZHVsZSBwYWNrYWdlIGhhcyBub3QgYmVlbiBtb3ZlZCB5ZXQgb3V0IG9mCiAgLy8gdGhlIGdvb2cubW9kdWxlIG5hbWVzcGFjZS4gVGhpcyBzYXRpc2lmaWVzIGJvdGggdGhlIGRlYnVnIGxvYWRlciBhbmQKICAvLyBhaGVhZC1vZi10aW1lIGRlcGVuZGVuY3kgbWFuYWdlbWVudC4KfQoKCi8qKgogKiBSZXR1cm5zIGFuIG9iamVjdCBiYXNlZCBvbiBpdHMgZnVsbHkgcXVhbGlmaWVkIGV4dGVybmFsIG5hbWUuICBUaGUgb2JqZWN0CiAqIGlzIG5vdCBmb3VuZCBpZiBudWxsIG9yIHVuZGVmaW5lZC4gIElmIHlvdSBhcmUgdXNpbmcgYSBjb21waWxhdGlvbiBwYXNzIHRoYXQKICogcmVuYW1lcyBwcm9wZXJ0eSBuYW1lcyBiZXdhcmUgdGhhdCB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGZpbmQgcmVuYW1lZAogKiBwcm9wZXJ0aWVzLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUuCiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X29iaiBUaGUgb2JqZWN0IHdpdGhpbiB3aGljaCB0byBsb29rOyBkZWZhdWx0IGlzCiAqICAgICB8Z29vZy5nbG9iYWx8LgogKiBAcmV0dXJuIHs/fSBUaGUgdmFsdWUgKG9iamVjdCBvciBwcmltaXRpdmUpIG9yLCBpZiBub3QgZm91bmQsIG51bGwuCiAqLwpnb29nLmdldE9iamVjdEJ5TmFtZSA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmopIHsKICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7CiAgdmFyIGN1ciA9IG9wdF9vYmogfHwgZ29vZy5nbG9iYWw7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgY3VyID0gY3VyW3BhcnRzW2ldXTsKICAgIGlmIChjdXIgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CiAgcmV0dXJuIGN1cjsKfTsKCgovKioKICogR2xvYmFsaXplcyBhIHdob2xlIG5hbWVzcGFjZSwgc3VjaCBhcyBnb29nIG9yIGdvb2cubGFuZy4KICoKICogQHBhcmFtIHshT2JqZWN0fSBvYmogVGhlIG5hbWVzcGFjZSB0byBnbG9iYWxpemUuCiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X2dsb2JhbCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgcHJvcGVydGllcyB0by4KICogQGRlcHJlY2F0ZWQgUHJvcGVydGllcyBtYXkgYmUgZXhwbGljaXRseSBleHBvcnRlZCB0byB0aGUgZ2xvYmFsIHNjb3BlLCBidXQKICogICAgIHRoaXMgc2hvdWxkIG5vIGxvbmdlciBiZSBkb25lIGluIGJ1bGsuCiAqLwpnb29nLmdsb2JhbGl6ZSA9IGZ1bmN0aW9uKG9iaiwgb3B0X2dsb2JhbCkgewogIHZhciBnbG9iYWwgPSBvcHRfZ2xvYmFsIHx8IGdvb2cuZ2xvYmFsOwogIGZvciAodmFyIHggaW4gb2JqKSB7CiAgICBnbG9iYWxbeF0gPSBvYmpbeF07CiAgfQp9OwoKCi8qKgogKiBBZGRzIGEgZGVwZW5kZW5jeSBmcm9tIGEgZmlsZSB0byB0aGUgZmlsZXMgaXQgcmVxdWlyZXMuCiAqIEBwYXJhbSB7c3RyaW5nfSByZWxQYXRoIFRoZSBwYXRoIHRvIHRoZSBqcyBmaWxlLgogKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGgKICogICAgIHRoZSBuYW1lcyBvZiB0aGUgb2JqZWN0cyB0aGlzIGZpbGUgcHJvdmlkZXMuCiAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aAogKiAgICAgdGhlIG5hbWVzIG9mIHRoZSBvYmplY3RzIHRoaXMgZmlsZSByZXF1aXJlcy4KICogQHBhcmFtIHtib29sZWFufCFPYmplY3Q8c3RyaW5nPj19IG9wdF9sb2FkRmxhZ3MgUGFyYW1ldGVycyBpbmRpY2F0aW5nCiAqICAgICBob3cgdGhlIGZpbGUgbXVzdCBiZSBsb2FkZWQuICBUaGUgYm9vbGVhbiAndHJ1ZScgaXMgZXF1aXZhbGVudAogKiAgICAgdG8geydtb2R1bGUnOiAnZ29vZyd9IGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4gIFZhbGlkIHByb3BlcnRpZXMKICogICAgIGFuZCB2YWx1ZXMgaW5jbHVkZSB7J21vZHVsZSc6ICdnb29nJ30gYW5kIHsnbGFuZyc6ICdlczYnfS4KICovCmdvb2cuYWRkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgb3B0X2xvYWRGbGFncykgewogIGlmICghQ09NUElMRUQgJiYgZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCkgewogICAgZ29vZy5kZWJ1Z0xvYWRlcl8uYWRkRGVwZW5kZW5jeShyZWxQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIG9wdF9sb2FkRmxhZ3MpOwogIH0KfTsKCgoKCi8vIE5PVEUobm5hemUpOiBUaGUgZGVidWcgRE9NIGxvYWRlciB3YXMgaW5jbHVkZWQgaW4gYmFzZS5qcyBhcyBhbiBvcmlnaW5hbCB3YXkKLy8gdG8gZG8gImRlYnVnLW1vZGUiIGRldmVsb3BtZW50LiAgVGhlIGRlcGVuZGVuY3kgc3lzdGVtIGNhbiBzb21ldGltZXMgYmUKLy8gY29uZnVzaW5nLCBhcyBjYW4gdGhlIGRlYnVnIERPTSBsb2FkZXIncyBhc3luY2hyb25vdXMgbmF0dXJlLgovLwovLyBXaXRoIHRoZSBET00gbG9hZGVyLCBhIGNhbGwgdG8gZ29vZy5yZXF1aXJlKCkgaXMgbm90IGJsb2NraW5nIC0tIHRoZSBzY3JpcHQKLy8gd2lsbCBub3QgbG9hZCB1bnRpbCBzb21lIHBvaW50IGFmdGVyIHRoZSBjdXJyZW50IHNjcmlwdC4gIElmIGEgbmFtZXNwYWNlIGlzCi8vIG5lZWRlZCBhdCBydW50aW1lLCBpdCBuZWVkcyB0byBiZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgc2NyaXB0LCBvciBsb2FkZWQgdmlhCi8vIHJlcXVpcmUoKSB3aXRoIGl0cyByZWdpc3RlcmVkIGRlcGVuZGVuY2llcy4KLy8KLy8gVXNlci1kZWZpbmVkIG5hbWVzcGFjZXMgbWF5IG5lZWQgdGhlaXIgb3duIGRlcHMgZmlsZS4gRm9yIGEgcmVmZXJlbmNlIG9uCi8vIGNyZWF0aW5nIGEgZGVwcyBmaWxlLCBzZWU6Ci8vIEV4dGVybmFsbHk6IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2Nsb3N1cmUvbGlicmFyeS9kb2NzL2RlcHN3cml0ZXIKLy8KLy8gQmVjYXVzZSBvZiBsZWdhY3kgY2xpZW50cywgdGhlIERPTSBsb2FkZXIgY2FuJ3QgYmUgZWFzaWx5IHJlbW92ZWQgZnJvbQovLyBiYXNlLmpzLiAgV29yayB3YXMgZG9uZSB0byBtYWtlIGl0IGRpc2FibGVhYmxlIG9yIHJlcGxhY2VhYmxlIGZvcgovLyBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIChET00tbGVzcyBKYXZhU2NyaXB0IGludGVycHJldGVycyBsaWtlIFJoaW5vIG9yIFY4LAovLyBmb3IgZXhhbXBsZSkuIFNlZSBib290c3RyYXAvIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKCi8qKgogKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIGVuYWJsZSB0aGUgZGVidWcgbG9hZGVyLgogKgogKiBJZiBlbmFibGVkLCBhIGNhbGwgdG8gZ29vZy5yZXF1aXJlKCkgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIG5hbWVzcGFjZSBieQogKiBhcHBlbmRpbmcgYSBzY3JpcHQgdGFnIHRvIHRoZSBET00gKGlmIHRoZSBuYW1lc3BhY2UgaGFzIGJlZW4gcmVnaXN0ZXJlZCkuCiAqCiAqIElmIGRpc2FibGVkLCBnb29nLnJlcXVpcmUoKSB3aWxsIHNpbXBseSBhc3NlcnQgdGhhdCB0aGUgbmFtZXNwYWNlIGhhcyBiZWVuCiAqIHByb3ZpZGVkIChhbmQgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgc29tZSBvdXRzaWRlIHRvb2wgY29ycmVjdGx5IG9yZGVyZWQKICogdGhlIHNjcmlwdCkuCiAqLwpnb29nLkVOQUJMRV9ERUJVR19MT0FERVIgPSBnb29nLmRlZmluZSgnZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSJywgdHJ1ZSk7CgoKLyoqCiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cKICogQHByaXZhdGUKICovCmdvb2cubG9nVG9Db25zb2xlXyA9IGZ1bmN0aW9uKG1zZykgewogIGlmIChnb29nLmdsb2JhbC5jb25zb2xlKSB7CiAgICBnb29nLmdsb2JhbC5jb25zb2xlWydlcnJvciddKG1zZyk7CiAgfQp9OwoKCi8qKgogKiBJbXBsZW1lbnRzIGEgc3lzdGVtIGZvciB0aGUgZHluYW1pYyByZXNvbHV0aW9uIG9mIGRlcGVuZGVuY2llcyB0aGF0IHdvcmtzIGluCiAqIHBhcmFsbGVsIHdpdGggdGhlIEJVSUxEIHN5c3RlbS4KICoKICogTm90ZSB0aGF0IGFsbCBjYWxscyB0byBnb29nLnJlcXVpcmUgd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgY29tcGlsZXIuCiAqCiAqIEBzZWUgZ29vZy5wcm92aWRlCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgTmFtZXNwYWNlIChhcyB3YXMgZ2l2ZW4gaW4gZ29vZy5wcm92aWRlLAogKiAgICAgZ29vZy5tb2R1bGUsIG9yIGdvb2cuZGVjbGFyZU1vZHVsZUlkKSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICogQHJldHVybiB7P30gSWYgY2FsbGVkIHdpdGhpbiBhIGdvb2cubW9kdWxlIG9yIEVTNiBtb2R1bGUgZmlsZSwgdGhlIGFzc29jaWF0ZWQKICogICAgIG5hbWVzcGFjZSBvciBtb2R1bGUgb3RoZXJ3aXNlIG51bGwuCiAqLwpnb29nLnJlcXVpcmUgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICBpZiAoIUNPTVBJTEVEKSB7CiAgICAvLyBNaWdodCBuZWVkIHRvIGxhenkgbG9hZCBvbiBvbGQgSUUuCiAgICBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7CiAgICAgIGdvb2cuZGVidWdMb2FkZXJfLnJlcXVlc3RlZChuYW1lc3BhY2UpOwogICAgfQoKICAgIC8vIElmIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMgd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcuCiAgICBpZiAoZ29vZy5pc1Byb3ZpZGVkXyhuYW1lc3BhY2UpKSB7CiAgICAgIGlmIChnb29nLmlzSW5Nb2R1bGVMb2FkZXJfKCkpIHsKICAgICAgICByZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKG5hbWVzcGFjZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7CiAgICAgIHZhciBtb2R1bGVMb2FkZXJTdGF0ZSA9IGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfOwogICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG51bGw7CiAgICAgIHRyeSB7CiAgICAgICAgZ29vZy5kZWJ1Z0xvYWRlcl8ubG9hZF8obmFtZXNwYWNlKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG1vZHVsZUxvYWRlclN0YXRlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQp9OwoKCi8qKgogKiBSZXF1aXJlcyBhIHN5bWJvbCBmb3IgaXRzIHR5cGUgaW5mb3JtYXRpb24uIFRoaXMgaXMgYW4gaW5kaWNhdGlvbiB0byB0aGUKICogY29tcGlsZXIgdGhhdCB0aGUgc3ltYm9sIG1heSBhcHBlYXIgaW4gdHlwZSBhbm5vdGF0aW9ucywgeWV0IGl0IGlzIG5vdAogKiByZWZlcmVuY2VkIGF0IHJ1bnRpbWUuCiAqCiAqIFdoZW4gY2FsbGVkIHdpdGhpbiBhIGdvb2cubW9kdWxlIG9yIEVTNiBtb2R1bGUgZmlsZSwgdGhlIHJldHVybiB2YWx1ZSBtYXkgYmUKICogYXNzaWduZWQgdG8gb3IgZGVzdHJ1Y3R1cmVkIGludG8gYSB2YXJpYWJsZSwgYnV0IGl0IG1heSBub3QgYmUgb3RoZXJ3aXNlIHVzZWQKICogaW4gY29kZSBvdXRzaWRlIG9mIGEgdHlwZSBhbm5vdGF0aW9uLgogKgogKiBOb3RlIHRoYXQgYWxsIGNhbGxzIHRvIGdvb2cucmVxdWlyZVR5cGUgd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgY29tcGlsZXIuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgTmFtZXNwYWNlIChhcyB3YXMgZ2l2ZW4gaW4gZ29vZy5wcm92aWRlLAogKiAgICAgZ29vZy5tb2R1bGUsIG9yIGdvb2cuZGVjbGFyZU1vZHVsZUlkKSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICogQHJldHVybiB7P30KICovCmdvb2cucmVxdWlyZVR5cGUgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IHNvIHRoYXQgc2luZ2xlLWxldmVsIGRlc3RydWN0dXJpbmcgb2YgdGhlIHJldHVybgogIC8vIHZhbHVlIGRvZXNuJ3QgY3Jhc2ggYXQgcnVudGltZSB3aGVuIHVzaW5nIHRoZSBkZWJ1ZyBsb2FkZXIuIE11bHRpLWxldmVsCiAgLy8gZGVzdHJ1Y3R1cmluZyBpc24ndCBzdXBwb3J0ZWQuCiAgcmV0dXJuIHt9Owp9OwoKCi8qKgogKiBQYXRoIGZvciBpbmNsdWRlZCBzY3JpcHRzLgogKiBAdHlwZSB7c3RyaW5nfQogKi8KZ29vZy5iYXNlUGF0aCA9ICcnOwoKCi8qKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIGJhc2UgcGF0aC4KICogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0JBU0VfUEFUSDsKCgovKioKICogV2hldGhlciB0byBhdHRlbXB0IHRvIGxvYWQgQ2xvc3VyZSdzIGRlcHMgZmlsZS4gQnkgZGVmYXVsdCwgd2hlbiB1bmNvbXBpbGVkLAogKiBkZXBzIGZpbGVzIHdpbGwgYXR0ZW1wdCB0byBiZSBsb2FkZWQuCiAqIEB0eXBlIHtib29sZWFufHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUzsKCgovKioKICogQSBmdW5jdGlvbiB0byBpbXBvcnQgYSBzaW5nbGUgc2NyaXB0LiBUaGlzIGlzIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4gd2hlbgogKiBDbG9zdXJlIGlzIGJlaW5nIHJ1biBpbiBub24tSFRNTCBjb250ZXh0cywgc3VjaCBhcyB3ZWIgd29ya2Vycy4gSXQncyBkZWZpbmVkCiAqIGluIHRoZSBnbG9iYWwgc2NvcGUgc28gdGhhdCBpdCBjYW4gYmUgc2V0IGJlZm9yZSBiYXNlLmpzIGlzIGxvYWRlZCwgd2hpY2gKICogYWxsb3dzIGRlcHMuanMgdG8gYmUgaW1wb3J0ZWQgcHJvcGVybHkuCiAqCiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgdGhlIHNjcmlwdCBzb3VyY2UsIHdoaWNoIGlzIGEgcmVsYXRpdmUgVVJJLiBUaGUgc2Vjb25kLAogKiBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgdGhlIHNjcmlwdCBjb250ZW50cywgaW4gdGhlIGV2ZW50IHRoZSBzY3JpcHQgbmVlZGVkCiAqIHRyYW5zZm9ybWF0aW9uLiBJdCBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlIHNjcmlwdCB3YXMgaW1wb3J0ZWQsIGZhbHNlCiAqIG90aGVyd2lzZS4KICogQHR5cGUgeyhmdW5jdGlvbihzdHJpbmcsIHN0cmluZz0pOiBib29sZWFuKXx1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQ7CgoKLyoqCiAqIE51bGwgZnVuY3Rpb24gdXNlZCBmb3IgZGVmYXVsdCB2YWx1ZXMgb2YgY2FsbGJhY2tzLCBldGMuCiAqIEByZXR1cm4ge3ZvaWR9IE5vdGhpbmcuCiAqLwpnb29nLm51bGxGdW5jdGlvbiA9IGZ1bmN0aW9uKCkge307CgoKLyoqCiAqIFdoZW4gZGVmaW5pbmcgYSBjbGFzcyBGb28gd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QgYmFyKCksIHlvdSBjYW4gZG86CiAqIEZvby5wcm90b3R5cGUuYmFyID0gZ29vZy5hYnN0cmFjdE1ldGhvZAogKgogKiBOb3cgaWYgYSBzdWJjbGFzcyBvZiBGb28gZmFpbHMgdG8gb3ZlcnJpZGUgYmFyKCksIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duCiAqIHdoZW4gYmFyKCkgaXMgaW52b2tlZC4KICoKICogQHR5cGUgeyFGdW5jdGlvbn0KICogQHRocm93cyB7RXJyb3J9IHdoZW4gaW52b2tlZCB0byBpbmRpY2F0ZSB0aGUgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuLgogKiBAZGVwcmVjYXRlZCBVc2UgIkBhYnN0cmFjdCIgYW5ub3RhdGlvbiBpbnN0ZWFkIG9mIGdvb2cuYWJzdHJhY3RNZXRob2QgaW4gbmV3CiAqICAgICBjb2RlLiBTZWUKICogICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci93aWtpL0BhYnN0cmFjdC1jbGFzc2VzLWFuZC1tZXRob2RzCiAqLwpnb29nLmFic3RyYWN0TWV0aG9kID0gZnVuY3Rpb24oKSB7CiAgdGhyb3cgbmV3IEVycm9yKCd1bmltcGxlbWVudGVkIGFic3RyYWN0IG1ldGhvZCcpOwp9OwoKCi8qKgogKiBBZGRzIGEgYGdldEluc3RhbmNlYCBzdGF0aWMgbWV0aG9kIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUKICogaW5zdGFuY2Ugb2JqZWN0LgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY3RvciBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcyB0byBhZGQgdGhlIHN0YXRpYwogKiAgICAgbWV0aG9kIHRvLgogKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSAnaW5zdGFuY2VfJyBpc24ndCBhIHByb3BlcnR5IG9uICdGdW5jdGlvbicKICogICAgIGJ1dCB3ZSBkb24ndCBoYXZlIGEgYmV0dGVyIHR5cGUgdG8gdXNlIGhlcmUuCiAqLwpnb29nLmFkZFNpbmdsZXRvbkdldHRlciA9IGZ1bmN0aW9uKGN0b3IpIHsKICAvLyBpbnN0YW5jZV8gaXMgaW1tZWRpYXRlbHkgc2V0IHRvIHByZXZlbnQgaXNzdWVzIHdpdGggc2VhbGVkIGNvbnN0cnVjdG9ycwogIC8vIHN1Y2ggYXMgYXJlIGVuY291bnRlcmVkIHdoZW4gYSBjb25zdHJ1Y3RvciBpcyByZXR1cm5lZCBhcyB0aGUgZXhwb3J0IG9iamVjdAogIC8vIG9mIGEgZ29vZy5tb2R1bGUgaW4gdW5vcHRpbWl6ZWQgY29kZS4KICAvLyBEZWxjYXJlIHR5cGUgdG8gYXZvaWQgY29uZm9ybWFuY2UgdmlvbGF0aW9ucyB0aGF0IGN0b3IuaW5zdGFuY2VfIGlzIHVua25vd24KICAvKiogQHR5cGUge3VuZGVmaW5lZHwhT2JqZWN0fSBAc3VwcHJlc3Mge3VuZGVyc2NvcmV9ICovCiAgY3Rvci5pbnN0YW5jZV8gPSB1bmRlZmluZWQ7CiAgY3Rvci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGN0b3IuaW5zdGFuY2VfKSB7CiAgICAgIHJldHVybiBjdG9yLmluc3RhbmNlXzsKICAgIH0KICAgIGlmIChnb29nLkRFQlVHKSB7CiAgICAgIC8vIE5PVEU6IEpTQ29tcGlsZXIgY2FuJ3Qgb3B0aW1pemUgYXdheSBBcnJheSNwdXNoLgogICAgICBnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfW2dvb2cuaW5zdGFudGlhdGVkU2luZ2xldG9uc18ubGVuZ3RoXSA9IGN0b3I7CiAgICB9CiAgICAvLyBDYXN0IHRvIGF2b2lkIGNvbmZvcm1hbmNlIHZpb2xhdGlvbnMgdGhhdCBjdG9yLmluc3RhbmNlXyBpcyB1bmtub3duCiAgICByZXR1cm4gLyoqIEB0eXBlIHshT2JqZWN0fHVuZGVmaW5lZH0gKi8gKGN0b3IuaW5zdGFuY2VfKSA9IG5ldyBjdG9yOwogIH07Cn07CgoKLyoqCiAqIEFsbCBzaW5nbGV0b24gY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBpbnN0YW50aWF0ZWQsIGZvciB0ZXN0aW5nLiBEb24ndCByZWFkCiAqIGl0IGRpcmVjdGx5LCB1c2UgdGhlIGBnb29nLnRlc3Rpbmcuc2luZ2xldG9uYCBtb2R1bGUuIFRoZSBjb21waWxlcgogKiByZW1vdmVzIHRoaXMgdmFyaWFibGUgaWYgdW51c2VkLgogKiBAdHlwZSB7IUFycmF5PCFGdW5jdGlvbj59CiAqIEBwcml2YXRlCiAqLwpnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfID0gW107CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdG8gbG9hZCBnb29nLm1vZHVsZXMgdXNpbmcgYGV2YWxgIHdoZW4gdXNpbmcKICogdGhlIGRlYnVnIGxvYWRlci4gIFRoaXMgcHJvdmlkZXMgYSBiZXR0ZXIgZGVidWdnaW5nIGV4cGVyaWVuY2UgYXMgdGhlCiAqIHNvdXJjZSBpcyB1bm1vZGlmaWVkIGFuZCBjYW4gYmUgZWRpdGVkIHVzaW5nIENocm9tZSBXb3Jrc3BhY2VzIG9yIHNpbWlsYXIuCiAqIEhvd2V2ZXIgaW4gc29tZSBlbnZpcm9ubWVudHMgdGhlIHVzZSBvZiBgZXZhbGAgaXMgYmFubmVkCiAqIHNvIHdlIHByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUuCiAqLwpnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUwgPSBnb29nLmRlZmluZSgnZ29vZy5MT0FEX01PRFVMRV9VU0lOR19FVkFMJywgdHJ1ZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGV4cG9ydHMgb2YgZ29vZy5tb2R1bGVzIHNob3VsZCBiZSBzZWFsZWQgd2hlbgogKiBwb3NzaWJsZS4KICovCmdvb2cuU0VBTF9NT0RVTEVfRVhQT1JUUyA9IGdvb2cuZGVmaW5lKCdnb29nLlNFQUxfTU9EVUxFX0VYUE9SVFMnLCBnb29nLkRFQlVHKTsKCgovKioKICogVGhlIHJlZ2lzdHJ5IG9mIGluaXRpYWxpemVkIG1vZHVsZXM6CiAqIFRoZSBtb2R1bGUgaWRlbnRpZmllciBvciBwYXRoIHRvIG1vZHVsZSBleHBvcnRzIG1hcC4KICogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywge2V4cG9ydHM6Pyx0eXBlOnN0cmluZyxtb2R1bGVJZDpzdHJpbmd9Pn0KICovCmdvb2cubG9hZGVkTW9kdWxlc18gPSB7fTsKCgovKioKICogVHJ1ZSBpZiB0aGUgZGVidWcgbG9hZGVyIGVuYWJsZWQgYW5kIHVzZWQuCiAqIEBjb25zdCB7Ym9vbGVhbn0KICovCmdvb2cuREVQRU5ERU5DSUVTX0VOQUJMRUQgPSAhQ09NUElMRUQgJiYgZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSOwoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IEhvdyB0byBkZWNpZGUgd2hldGhlciB0byB0cmFuc3BpbGUuICBWYWxpZCB2YWx1ZXMKICogYXJlICdhbHdheXMnLCAnbmV2ZXInLCBhbmQgJ2RldGVjdCcuICBUaGUgZGVmYXVsdCAoJ2RldGVjdCcpIGlzIHRvCiAqIHVzZSBmZWF0dXJlIGRldGVjdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggbGFuZ3VhZ2UgbGV2ZWxzIG5lZWQKICogdHJhbnNwaWxhdGlvbi4KICovCi8vIE5PVEUoc2RoKTogd2UgY291bGQgZXhwYW5kIHRoaXMgdG8gYWNjZXB0IGEgbGFuZ3VhZ2UgbGV2ZWwgdG8gYnlwYXNzCi8vIGRldGVjdGlvbjogZS5nLiBnb29nLlRSQU5TUElMRSA9PSAnZXM1JyB3b3VsZCB0cmFuc3BpbGUgRVM2IGZpbGVzIGJ1dAovLyB3b3VsZCBsZWF2ZSBFUzMgYW5kIEVTNSBmaWxlcyBhbG9uZS4KZ29vZy5UUkFOU1BJTEUgPSBnb29nLmRlZmluZSgnZ29vZy5UUkFOU1BJTEUnLCAnZGV0ZWN0Jyk7CgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gSWYgdHJ1ZSBhc3N1bWUgdGhhdCBFUyBtb2R1bGVzIGhhdmUgYWxyZWFkeSBiZWVuCiAqIHRyYW5zcGlsZWQgYnkgdGhlIGpzY29tcGlsZXIgKGluIHRoZSBzYW1lIHdheSB0aGF0IHRyYW5zcGlsZS5qcyB3b3VsZAogKiB0cmFuc3BpbGUgdGhlbSAtIHRvIGpzY29tcCBtb2R1bGVzKS4gVXNlZnVsIG9ubHkgZm9yIHNlcnZlcnMgdGhhdCB3aXNoIHRvIHVzZQogKiB0aGUgZGVidWcgbG9hZGVyIGFuZCB0cmFuc3BpbGUgc2VydmVyIHNpZGUuIFRodXMgdGhpcyBpcyBvbmx5IHJlc3BlY3RlZCBpZgogKiBnb29nLlRSQU5TUElMRSBpcyAibmV2ZXIiLgogKi8KZ29vZy5BU1NVTUVfRVNfTU9EVUxFU19UUkFOU1BJTEVEID0KICAgIGdvb2cuZGVmaW5lKCdnb29nLkFTU1VNRV9FU19NT0RVTEVTX1RSQU5TUElMRUQnLCBmYWxzZSk7CgoKLyoqCiAqIEBkZWZpbmUge3N0cmluZ30gSWYgYSBmaWxlIG5lZWRzIHRvIGJlIHRyYW5zcGlsZWQgd2hhdCB0aGUgb3V0cHV0IGxhbmd1YWdlCiAqIHNob3VsZCBiZS4gQnkgZGVmYXVsdCB0aGlzIGlzIHRoZSBoaWdoZXN0IGxhbmd1YWdlIGxldmVsIHRoaXMgZmlsZSBkZXRlY3RzCiAqIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzLiBHZW5lcmFsbHkgdGhpcyBmbGFnIHNob3VsZCBub3QgYmUgc2V0LCBidXQKICogaXQgY291bGQgYmUgdXNlZnVsIHRvIG92ZXJyaWRlLiBFeGFtcGxlOiBJZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cwogKiBFUzYgdGhlbiBieSBkZWZhdWx0IEVTNysgZmlsZXMgd2lsbCBiZSB0cmFuc3BpbGVkIHRvIEVTNiwgdW5sZXNzIHRoaXMgaXMKICogb3ZlcnJpZGRlbi4KICoKICogVmFsaWQgdmFsdWVzIGluY2x1ZGU6IGVzMywgZXM1LCBlczYsIGVzNywgYW5kIGVzOC4gQW55dGhpbmcgbm90IHJlY29nbml6ZWQKICogaXMgdHJlYXRlZCBhcyBlczMuCiAqCiAqIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgdmFsdWUgZG9lcyBub3QgZm9yY2UgdHJhbnNwaWxhdGlvbi4gSnVzdCBpZgogKiB0cmFuc3BpbGF0aW9uIG9jY3VycyB0aGlzIHdpbGwgYmUgdGhlIG91dHB1dC4gU28gdGhpcyBpcyBtb3N0IHVzZWZ1bCB3aGVuCiAqIGdvb2cuVFJBTlNQSUxFIGlzIHNldCB0byAnYWx3YXlzJyBhbmQgdGhlbiBmb3JjaW5nIHRoZSBsYW5ndWFnZSBsZXZlbCB0byBiZQogKiBzb21ldGhpbmcgbG93ZXIgdGhhbiB3aGF0IHRoZSBlbnZpcm9ubWVudCBkZXRlY3RzLgogKi8KZ29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0UgPSBnb29nLmRlZmluZSgnZ29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0UnLCAnJyk7CgoKLyoqCiAqIEBkZWZpbmUge3N0cmluZ30gUGF0aCB0byB0aGUgdHJhbnNwaWxlci4gIEV4ZWN1dGluZyB0aGUgc2NyaXB0IGF0IHRoaXMKICogcGF0aCAocmVsYXRpdmUgdG8gYmFzZS5qcykgc2hvdWxkIGRlZmluZSBhIGZ1bmN0aW9uICRqc2NvbXAudHJhbnNwaWxlLgogKi8KZ29vZy5UUkFOU1BJTEVSID0gZ29vZy5kZWZpbmUoJ2dvb2cuVFJBTlNQSUxFUicsICd0cmFuc3BpbGUuanMnKTsKCgovKioKICogQHBhY2thZ2Ugez9ib29sZWFufQogKiBWaXNpYmxlIGZvciB0ZXN0aW5nLgogKi8KZ29vZy5oYXNCYWRMZXRTY29waW5nID0gbnVsbDsKCgovKioKICogQHJldHVybiB7Ym9vbGVhbn0KICogQHBhY2thZ2UgVmlzaWJsZSBmb3IgdGVzdGluZy4KICovCmdvb2cudXNlU2FmYXJpMTBXb3JrYXJvdW5kID0gZnVuY3Rpb24oKSB7CiAgaWYgKGdvb2cuaGFzQmFkTGV0U2NvcGluZyA9PSBudWxsKSB7CiAgICB2YXIgaGFzQmFkTGV0U2NvcGluZzsKICAgIHRyeSB7CiAgICAgIGhhc0JhZExldFNjb3BpbmcgPSAhZXZhbCgKICAgICAgICAgICcidXNlIHN0cmljdCI7JyArCiAgICAgICAgICAnbGV0IHggPSAxOyBmdW5jdGlvbiBmKCkgeyByZXR1cm4gdHlwZW9mIHg7IH07JyArCiAgICAgICAgICAnZigpID09ICJudW1iZXIiOycpOwogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBBc3N1bWUgdGhhdCBFUzYgc3ludGF4IGlzbid0IHN1cHBvcnRlZC4KICAgICAgaGFzQmFkTGV0U2NvcGluZyA9IGZhbHNlOwogICAgfQogICAgZ29vZy5oYXNCYWRMZXRTY29waW5nID0gaGFzQmFkTGV0U2NvcGluZzsKICB9CiAgcmV0dXJuIGdvb2cuaGFzQmFkTGV0U2NvcGluZzsKfTsKCgovKioKICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZURlZgogKiBAcmV0dXJuIHtzdHJpbmd9CiAqIEBwYWNrYWdlIFZpc2libGUgZm9yIHRlc3RpbmcuCiAqLwpnb29nLndvcmthcm91bmRTYWZhcmkxMEV2YWxCdWcgPSBmdW5jdGlvbihtb2R1bGVEZWYpIHsKICByZXR1cm4gJyhmdW5jdGlvbigpeycgKyBtb2R1bGVEZWYgKwogICAgICAnXG4nICsgIC8vIFRlcm1pbmF0ZSBhbnkgdHJhaWxpbmcgc2luZ2xlIGxpbmUgY29tbWVudC4KICAgICAgJzsnICsgICAvLyBUZXJtaW5hdGUgYW55IHRyYWlsaW5nIGV4cHJlc3Npb24uCiAgICAgICd9KSgpO1xuJzsKfTsKCgovKioKICogQHBhcmFtIHtmdW5jdGlvbig/KTo/fHN0cmluZ30gbW9kdWxlRGVmIFRoZSBtb2R1bGUgZGVmaW5pdGlvbi4KICovCmdvb2cubG9hZE1vZHVsZSA9IGZ1bmN0aW9uKG1vZHVsZURlZikgewogIC8vIE5PVEU6IHdlIGFsbG93IGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIGJlIGVpdGhlciBpbiB0aGUgZnJvbQogIC8vIG9mIGEgc3RyaW5nIHRvIGV2YWwgKHdoaWNoIGtlZXBzIHRoZSBvcmlnaW5hbCBzb3VyY2UgaW50YWN0KSBvcgogIC8vIGluIGEgZXZhbCBmb3JiaWRkZW4gZW52aXJvbm1lbnQgKENTUCkgd2UgYWxsb3cgYSBmdW5jdGlvbiBkZWZpbml0aW9uCiAgLy8gd2hpY2ggaW4gaXRzIGJvZHkgbXVzdCBjYWxsIGBnb29nLm1vZHVsZWAsIGFuZCByZXR1cm4gdGhlIGV4cG9ydHMKICAvLyBvZiB0aGUgbW9kdWxlLgogIHZhciBwcmV2aW91c1N0YXRlID0gZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV87CiAgdHJ5IHsKICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gewogICAgICBtb2R1bGVOYW1lOiAnJywKICAgICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTogZmFsc2UsCiAgICAgIHR5cGU6IGdvb2cuTW9kdWxlVHlwZS5HT09HCiAgICB9OwogICAgdmFyIGV4cG9ydHM7CiAgICBpZiAoZ29vZy5pc0Z1bmN0aW9uKG1vZHVsZURlZikpIHsKICAgICAgZXhwb3J0cyA9IG1vZHVsZURlZi5jYWxsKHVuZGVmaW5lZCwge30pOwogICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlRGVmID09PSAnc3RyaW5nJykgewogICAgICBpZiAoZ29vZy51c2VTYWZhcmkxMFdvcmthcm91bmQoKSkgewogICAgICAgIG1vZHVsZURlZiA9IGdvb2cud29ya2Fyb3VuZFNhZmFyaTEwRXZhbEJ1Zyhtb2R1bGVEZWYpOwogICAgICB9CgogICAgICBleHBvcnRzID0gZ29vZy5sb2FkTW9kdWxlRnJvbVNvdXJjZV8uY2FsbCh1bmRlZmluZWQsIG1vZHVsZURlZik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIGRlZmluaXRpb24nKTsKICAgIH0KCiAgICB2YXIgbW9kdWxlTmFtZSA9IGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWU7CiAgICBpZiAodHlwZW9mIG1vZHVsZU5hbWUgPT09ICdzdHJpbmcnICYmIG1vZHVsZU5hbWUpIHsKICAgICAgLy8gRG9uJ3Qgc2VhbCBsZWdhY3kgbmFtZXNwYWNlcyBhcyB0aGV5IG1heSBiZSB1c2VkIGFzIGEgcGFyZW50IG9mCiAgICAgIC8vIGFub3RoZXIgbmFtZXNwYWNlCiAgICAgIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlKSB7CiAgICAgICAgZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKG1vZHVsZU5hbWUsIGV4cG9ydHMpOwogICAgICB9IGVsc2UgaWYgKAogICAgICAgICAgZ29vZy5TRUFMX01PRFVMRV9FWFBPUlRTICYmIE9iamVjdC5zZWFsICYmCiAgICAgICAgICB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICE9IG51bGwpIHsKICAgICAgICBPYmplY3Quc2VhbChleHBvcnRzKTsKICAgICAgfQoKICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgZXhwb3J0czogZXhwb3J0cywKICAgICAgICB0eXBlOiBnb29nLk1vZHVsZVR5cGUuR09PRywKICAgICAgICBtb2R1bGVJZDogZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZQogICAgICB9OwogICAgICBnb29nLmxvYWRlZE1vZHVsZXNfW21vZHVsZU5hbWVdID0gZGF0YTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtb2R1bGUgbmFtZSBcIicgKyBtb2R1bGVOYW1lICsgJ1wiJyk7CiAgICB9CiAgfSBmaW5hbGx5IHsKICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gcHJldmlvdXNTdGF0ZTsKICB9Cn07CgoKLyoqCiAqIEBwcml2YXRlIEBjb25zdAogKi8KZ29vZy5sb2FkTW9kdWxlRnJvbVNvdXJjZV8gPSAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyk6P30gKi8gKGZ1bmN0aW9uKCkgewogIC8vIE5PVEU6IHdlIGF2b2lkIGRlY2xhcmluZyBwYXJhbWV0ZXJzIG9yIGxvY2FsIHZhcmlhYmxlcyBoZXJlIHRvIGF2b2lkCiAgLy8gbWFza2luZyBnbG9iYWxzIG9yIGxlYWtpbmcgdmFsdWVzIGludG8gdGhlIG1vZHVsZSBkZWZpbml0aW9uLgogICd1c2Ugc3RyaWN0JzsKICB2YXIgZXhwb3J0cyA9IHt9OwogIGV2YWwoYXJndW1lbnRzWzBdKTsKICByZXR1cm4gZXhwb3J0czsKfSk7CgoKLyoqCiAqIE5vcm1hbGl6ZSBhIGZpbGUgcGF0aCBieSByZW1vdmluZyByZWR1bmRhbnQgIi4uIiBhbmQgZXh0cmFuZW91cyAiLiIgZmlsZQogKiBwYXRoIGNvbXBvbmVudHMuCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoCiAqIEByZXR1cm4ge3N0cmluZ30KICogQHByaXZhdGUKICovCmdvb2cubm9ybWFsaXplUGF0aF8gPSBmdW5jdGlvbihwYXRoKSB7CiAgdmFyIGNvbXBvbmVudHMgPSBwYXRoLnNwbGl0KCcvJyk7CiAgdmFyIGkgPSAwOwogIHdoaWxlIChpIDwgY29tcG9uZW50cy5sZW5ndGgpIHsKICAgIGlmIChjb21wb25lbnRzW2ldID09ICcuJykgewogICAgICBjb21wb25lbnRzLnNwbGljZShpLCAxKTsKICAgIH0gZWxzZSBpZiAoCiAgICAgICAgaSAmJiBjb21wb25lbnRzW2ldID09ICcuLicgJiYgY29tcG9uZW50c1tpIC0gMV0gJiYKICAgICAgICBjb21wb25lbnRzW2kgLSAxXSAhPSAnLi4nKSB7CiAgICAgIGNvbXBvbmVudHMuc3BsaWNlKC0taSwgMik7CiAgICB9IGVsc2UgewogICAgICBpKys7CiAgICB9CiAgfQogIHJldHVybiBjb21wb25lbnRzLmpvaW4oJy8nKTsKfTsKCgovKioKICogUHJvdmlkZXMgYSBob29rIGZvciBsb2FkaW5nIGEgZmlsZSB3aGVuIHVzaW5nIENsb3N1cmUncyBnb29nLnJlcXVpcmUoKSBBUEkKICogd2l0aCBnb29nLm1vZHVsZXMuICBJbiBwYXJ0aWN1bGFyIHRoaXMgaG9vayBpcyBwcm92aWRlZCB0byBzdXBwb3J0IE5vZGUuanMuCiAqCiAqIEB0eXBlIHsoZnVuY3Rpb24oc3RyaW5nKTpzdHJpbmcpfHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfTE9BRF9GSUxFX1NZTkM7CgoKLyoqCiAqIExvYWRzIGZpbGUgYnkgc3luY2hyb25vdXMgWEhSLiBTaG91bGQgbm90IGJlIHVzZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuCiAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgU291cmNlIFVSTC4KICogQHJldHVybiB7P3N0cmluZ30gRmlsZSBjb250ZW50cywgb3IgbnVsbCBpZiBsb2FkIGZhaWxlZC4KICogQHByaXZhdGUKICovCmdvb2cubG9hZEZpbGVTeW5jXyA9IGZ1bmN0aW9uKHNyYykgewogIGlmIChnb29nLmdsb2JhbC5DTE9TVVJFX0xPQURfRklMRV9TWU5DKSB7CiAgICByZXR1cm4gZ29vZy5nbG9iYWwuQ0xPU1VSRV9MT0FEX0ZJTEVfU1lOQyhzcmMpOwogIH0gZWxzZSB7CiAgICB0cnkgewogICAgICAvKiogQHR5cGUge1hNTEh0dHBSZXF1ZXN0fSAqLwogICAgICB2YXIgeGhyID0gbmV3IGdvb2cuZ2xvYmFsWydYTUxIdHRwUmVxdWVzdCddKCk7CiAgICAgIHhoci5vcGVuKCdnZXQnLCBzcmMsIGZhbHNlKTsKICAgICAgeGhyLnNlbmQoKTsKICAgICAgLy8gTk9URTogU3VjY2Vzc2Z1bCBodHRwOiByZXF1ZXN0cyBoYXZlIGEgc3RhdHVzIG9mIDIwMCwgYnV0IHN1Y2Nlc3NmdWwKICAgICAgLy8gZmlsZTogcmVxdWVzdHMgbWF5IGhhdmUgYSBzdGF0dXMgb2YgemVyby4gIEFueSBvdGhlciBzdGF0dXMsIG9yIGEKICAgICAgLy8gdGhyb3duIGV4Y2VwdGlvbiAocGFydGljdWxhcmx5IGluIGNhc2Ugb2YgZmlsZTogcmVxdWVzdHMpIGluZGljYXRlcwogICAgICAvLyBzb21lIHNvcnQgb2YgZXJyb3IsIHdoaWNoIHdlIHRyZWF0IGFzIGEgbWlzc2luZyBvciB1bmF2YWlsYWJsZSBmaWxlLgogICAgICByZXR1cm4geGhyLnN0YXR1cyA9PSAwIHx8IHhoci5zdGF0dXMgPT0gMjAwID8geGhyLnJlc3BvbnNlVGV4dCA6IG51bGw7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgLy8gTm8gbmVlZCB0byByZXRocm93IG9yIGxvZywgc2luY2UgZXJyb3JzIHNob3VsZCBzaG93IHVwIG9uIHRoZWlyIG93bi4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQp9OwoKCi8qKgogKiBMYXppbHkgcmV0cmlldmVzIHRoZSB0cmFuc3BpbGVyIGFuZCBhcHBsaWVzIGl0IHRvIHRoZSBzb3VyY2UuCiAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIEpTIGNvZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdGhlIGNvZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgTGFuZ3VhZ2UgbGV2ZWwgb3V0cHV0LgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0cmFuc3BpbGVkIGNvZGUuCiAqIEBwcml2YXRlCiAqLwpnb29nLnRyYW5zcGlsZV8gPSBmdW5jdGlvbihjb2RlLCBwYXRoLCB0YXJnZXQpIHsKICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKICBpZiAoIWpzY29tcCkgewogICAgZ29vZy5nbG9iYWxbJyRqc2NvbXAnXSA9IGpzY29tcCA9IHt9OwogIH0KICB2YXIgdHJhbnNwaWxlID0ganNjb21wLnRyYW5zcGlsZTsKICBpZiAoIXRyYW5zcGlsZSkgewogICAgdmFyIHRyYW5zcGlsZXJQYXRoID0gZ29vZy5iYXNlUGF0aCArIGdvb2cuVFJBTlNQSUxFUjsKICAgIHZhciB0cmFuc3BpbGVyQ29kZSA9IGdvb2cubG9hZEZpbGVTeW5jXyh0cmFuc3BpbGVyUGF0aCk7CiAgICBpZiAodHJhbnNwaWxlckNvZGUpIHsKICAgICAgLy8gVGhpcyBtdXN0IGJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHksIHNpbmNlIGJ5IHRoZSB0aW1lIHdlIGtub3cgd2UKICAgICAgLy8gbmVlZCBpdCwgd2UncmUgYWJvdXQgdG8gbG9hZCBhbmQgd3JpdGUgdGhlIEVTNiBjb2RlIHN5bmNocm9ub3VzbHksCiAgICAgIC8vIHNvIGEgbm9ybWFsIHNjcmlwdC10YWcgbG9hZCB3aWxsIGJlIHRvbyBzbG93LiBXcmFwcGVkIGluIGEgZnVuY3Rpb24KICAgICAgLy8gc28gdGhhdCBjb2RlIGlzIGV2YWwnZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgogICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgKDAsIGV2YWwpKHRyYW5zcGlsZXJDb2RlICsgJ1xuLy8jIHNvdXJjZVVSTD0nICsgdHJhbnNwaWxlclBhdGgpOwogICAgICB9KS5jYWxsKGdvb2cuZ2xvYmFsKTsKICAgICAgLy8gRXZlbiB0aG91Z2ggdGhlIHRyYW5zcGlsZXIgaXMgb3B0aW9uYWwsIGlmICRnd3RFeHBvcnQgaXMgZm91bmQsIGl0J3MKICAgICAgLy8gYSBzaWduIHRoZSB0cmFuc3BpbGVyIHdhcyBsb2FkZWQgYW5kIHRoZSAkanNjb21wLnRyYW5zcGlsZSAqc2hvdWxkKgogICAgICAvLyBiZSB0aGVyZS4KICAgICAgaWYgKGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J10gJiYgZ29vZy5nbG9iYWxbJyRnd3RFeHBvcnQnXVsnJGpzY29tcCddICYmCiAgICAgICAgICAhZ29vZy5nbG9iYWxbJyRnd3RFeHBvcnQnXVsnJGpzY29tcCddWyd0cmFuc3BpbGUnXSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgJ1RoZSB0cmFuc3BpbGVyIGRpZCBub3QgcHJvcGVybHkgZXhwb3J0IHRoZSAidHJhbnNwaWxlIiAnICsKICAgICAgICAgICAgJ21ldGhvZC4gJGd3dEV4cG9ydDogJyArIEpTT04uc3RyaW5naWZ5KGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J10pKTsKICAgICAgfQogICAgICAvLyB0cmFuc3BpbGUuanMgb25seSBleHBvcnRzIGEgc2luZ2xlICRqc2NvbXAgZnVuY3Rpb24sIHRyYW5zcGlsZS4gV2UKICAgICAgLy8gZ3JhYiBqdXN0IHRoYXQgYW5kIGFkZCBpdCB0byB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbiBvZiAkanNjb21wIHdoaWNoCiAgICAgIC8vIGNvbnRhaW5zIHRoZSBwb2x5ZmlsbHMuCiAgICAgIGdvb2cuZ2xvYmFsWyckanNjb21wJ10udHJhbnNwaWxlID0KICAgICAgICAgIGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J11bJyRqc2NvbXAnXVsndHJhbnNwaWxlJ107CiAgICAgIGpzY29tcCA9IGdvb2cuZ2xvYmFsWyckanNjb21wJ107CiAgICAgIHRyYW5zcGlsZSA9IGpzY29tcC50cmFuc3BpbGU7CiAgICB9CiAgfQogIGlmICghdHJhbnNwaWxlKSB7CiAgICAvLyBUaGUgdHJhbnNwaWxlciBpcyBhbiBvcHRpb25hbCBjb21wb25lbnQuICBJZiBpdCdzIG5vdCBhdmFpbGFibGUgdGhlbgogICAgLy8gcmVwbGFjZSBpdCB3aXRoIGEgcGFzcy10aHJvdWdoIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGxvZ3MuCiAgICB2YXIgc3VmZml4ID0gJyByZXF1aXJlcyB0cmFuc3BpbGF0aW9uIGJ1dCBubyB0cmFuc3BpbGVyIHdhcyBmb3VuZC4nOwogICAgdHJhbnNwaWxlID0ganNjb21wLnRyYW5zcGlsZSA9IGZ1bmN0aW9uKGNvZGUsIHBhdGgpIHsKICAgICAgLy8gVE9ETyhzZGgpOiBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIGdldCB0aGlzIGVycm9yIHRvIHNob3cgdXAKICAgICAgLy8gaW4gdGVzdCByZXN1bHRzLCBub3RpbmcgdGhhdCB0aGUgZmFpbHVyZSBtYXkgb2NjdXIgaW4gbWFueQogICAgICAvLyBkaWZmZXJlbnQgd2F5cywgaW5jbHVkaW5nIGluIGxvYWRNb2R1bGUoKSBiZWZvcmUgdGhlIHRlc3QKICAgICAgLy8gcnVubmVyIGV2ZW4gY29tZXMgdXAuCiAgICAgIGdvb2cubG9nVG9Db25zb2xlXyhwYXRoICsgc3VmZml4KTsKICAgICAgcmV0dXJuIGNvZGU7CiAgICB9OwogIH0KICAvLyBOb3RlOiBhbnkgdHJhbnNwaWxhdGlvbiBlcnJvcnMvd2FybmluZ3Mgd2lsbCBiZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUuCiAgcmV0dXJuIHRyYW5zcGlsZShjb2RlLCBwYXRoLCB0YXJnZXQpOwp9OwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTGFuZ3VhZ2UgRW5oYW5jZW1lbnRzCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKLyoqCiAqIFRoaXMgaXMgYSAiZml4ZWQiIHZlcnNpb24gb2YgdGhlIHR5cGVvZiBvcGVyYXRvci4gIEl0IGRpZmZlcnMgZnJvbSB0aGUgdHlwZW9mCiAqIG9wZXJhdG9yIGluIHN1Y2ggYSB3YXkgdGhhdCBudWxsIHJldHVybnMgJ251bGwnIGFuZCBhcnJheXMgcmV0dXJuICdhcnJheScuCiAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHZhbHVlIHRvIGdldCB0aGUgdHlwZSBvZi4KICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgdHlwZS4KICovCmdvb2cudHlwZU9mID0gZnVuY3Rpb24odmFsdWUpIHsKICB2YXIgcyA9IHR5cGVvZiB2YWx1ZTsKICBpZiAocyA9PSAnb2JqZWN0JykgewogICAgaWYgKHZhbHVlKSB7CiAgICAgIC8vIENoZWNrIHRoZXNlIGZpcnN0LCBzbyB3ZSBjYW4gYXZvaWQgY2FsbGluZyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIGlmCiAgICAgIC8vIHBvc3NpYmxlLgogICAgICAvLwogICAgICAvLyBJRSBpbXByb3Blcmx5IG1hcnNoYWxzIHR5cGVvZiBhY3Jvc3MgZXhlY3V0aW9uIGNvbnRleHRzLCBidXQgYQogICAgICAvLyBjcm9zcy1jb250ZXh0IG9iamVjdCB3aWxsIHN0aWxsIHJldHVybiBmYWxzZSBmb3IgImluc3RhbmNlb2YgT2JqZWN0Ii4KICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICByZXR1cm4gJ2FycmF5JzsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgIHJldHVybiBzOwogICAgICB9CgogICAgICAvLyBIQUNLOiBJbiBvcmRlciB0byB1c2UgYW4gT2JqZWN0IHByb3RvdHlwZSBtZXRob2Qgb24gdGhlIGFyYml0cmFyeQogICAgICAvLyAgIHZhbHVlLCB0aGUgY29tcGlsZXIgcmVxdWlyZXMgdGhlIHZhbHVlIGJlIGNhc3QgdG8gdHlwZSBPYmplY3QsCiAgICAgIC8vICAgZXZlbiB0aG91Z2ggdGhlIEVDTUEgc3BlYyBleHBsaWNpdGx5IGFsbG93cyBpdC4KICAgICAgdmFyIGNsYXNzTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCgKICAgICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKHZhbHVlKSk7CiAgICAgIC8vIEluIEZpcmVmb3ggMy42LCBhdHRlbXB0aW5nIHRvIGFjY2VzcyBpZnJhbWUgd2luZG93IG9iamVjdHMnIGxlbmd0aAogICAgICAvLyBwcm9wZXJ0eSB0aHJvd3MgYW4gTlNfRVJST1JfRkFJTFVSRSwgc28gd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgaXQKICAgICAgLy8gaGVyZS4KICAgICAgaWYgKGNsYXNzTmFtZSA9PSAnW29iamVjdCBXaW5kb3ddJykgewogICAgICAgIHJldHVybiAnb2JqZWN0JzsKICAgICAgfQoKICAgICAgLy8gV2UgY2Fubm90IGFsd2F5cyB1c2UgY29uc3RydWN0b3IgPT0gQXJyYXkgb3IgaW5zdGFuY2VvZiBBcnJheSBiZWNhdXNlCiAgICAgIC8vIGRpZmZlcmVudCBmcmFtZXMgaGF2ZSBkaWZmZXJlbnQgQXJyYXkgb2JqZWN0cy4gSW4gSUU2LCBpZiB0aGUgaWZyYW1lCiAgICAgIC8vIHdoZXJlIHRoZSBhcnJheSB3YXMgY3JlYXRlZCBpcyBkZXN0cm95ZWQsIHRoZSBhcnJheSBsb3NlcyBpdHMKICAgICAgLy8gcHJvdG90eXBlLiBUaGVuIGRlcmVmZXJlbmNpbmcgdmFsLnNwbGljZSBoZXJlIHRocm93cyBhbiBleGNlcHRpb24sIHNvCiAgICAgIC8vIHdlIGNhbid0IHVzZSBnb29nLmlzRnVuY3Rpb24uIENhbGxpbmcgdHlwZW9mIGRpcmVjdGx5IHJldHVybnMgJ3Vua25vd24nCiAgICAgIC8vIHNvIHRoYXQgd2lsbCB3b3JrLiBJbiB0aGlzIGNhc2UsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgYW5kCiAgICAgIC8vIG1vc3QgYXJyYXkgZnVuY3Rpb25zIHdpbGwgc3RpbGwgd29yayBiZWNhdXNlIHRoZSBhcnJheSBpcyBzdGlsbAogICAgICAvLyBhcnJheS1saWtlIChzdXBwb3J0cyBsZW5ndGggYW5kIFtdKSBldmVuIHRob3VnaCBpdCBoYXMgbG9zdCBpdHMKICAgICAgLy8gcHJvdG90eXBlLgogICAgICAvLyBNYXJrIE1pbGxlciBub3RpY2VkIHRoYXQgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZwogICAgICAvLyBhbGxvd3MgYWNjZXNzIHRvIHRoZSB1bmZvcmdlYWJsZSBbW0NsYXNzXV0gcHJvcGVydHkuCiAgICAgIC8vICAxNS4yLjQuMiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nICggKQogICAgICAvLyAgV2hlbiB0aGUgdG9TdHJpbmcgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46CiAgICAgIC8vICAgICAgMS4gR2V0IHRoZSBbW0NsYXNzXV0gcHJvcGVydHkgb2YgdGhpcyBvYmplY3QuCiAgICAgIC8vICAgICAgMi4gQ29tcHV0ZSBhIHN0cmluZyB2YWx1ZSBieSBjb25jYXRlbmF0aW5nIHRoZSB0aHJlZSBzdHJpbmdzCiAgICAgIC8vICAgICAgICAgIltvYmplY3QgIiwgUmVzdWx0KDEpLCBhbmQgIl0iLgogICAgICAvLyAgICAgIDMuIFJldHVybiBSZXN1bHQoMikuCiAgICAgIC8vIGFuZCB0aGlzIGJlaGF2aW9yIHN1cnZpdmVzIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgZXhlY3V0aW9uIGNvbnRleHQuCiAgICAgIGlmICgoY2xhc3NOYW1lID09ICdbb2JqZWN0IEFycmF5XScgfHwKICAgICAgICAgICAvLyBJbiBJRSBhbGwgbm9uIHZhbHVlIHR5cGVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMgYWNyb3NzIHdpbmRvdwogICAgICAgICAgIC8vIGJvdW5kYXJpZXMgKG5vdCBpZnJhbWUgdGhvdWdoKSBzbyB3ZSBoYXZlIHRvIGRvIG9iamVjdCBkZXRlY3Rpb24KICAgICAgICAgICAvLyBmb3IgdGhpcyBlZGdlIGNhc2UuCiAgICAgICAgICAgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PSAnbnVtYmVyJyAmJgogICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUuc3BsaWNlICE9ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAhdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUoJ3NwbGljZScpCgogICAgICAgICAgICAgICApKSB7CiAgICAgICAgcmV0dXJuICdhcnJheSc7CiAgICAgIH0KICAgICAgLy8gSEFDSzogVGhlcmUgaXMgc3RpbGwgYW4gYXJyYXkgY2FzZSB0aGF0IGZhaWxzLgogICAgICAvLyAgICAgZnVuY3Rpb24gQXJyYXlJbXBvc3RvcigpIHt9CiAgICAgIC8vICAgICBBcnJheUltcG9zdG9yLnByb3RvdHlwZSA9IFtdOwogICAgICAvLyAgICAgdmFyIGltcG9zdG9yID0gbmV3IEFycmF5SW1wb3N0b3I7CiAgICAgIC8vIHRoaXMgY2FuIGJlIGZpeGVkIGJ5IGdldHRpbmcgcmlkIG9mIHRoZSBmYXN0IHBhdGgKICAgICAgLy8gKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIGFuZCBzb2xlbHkgcmVseWluZyBvbgogICAgICAvLyAodmFsdWUgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy52YWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJykKICAgICAgLy8gYnV0IHRoYXQgd291bGQgcmVxdWlyZSBtYW55IG1vcmUgZnVuY3Rpb24gY2FsbHMgYW5kIGlzIG5vdCB3YXJyYW50ZWQKICAgICAgLy8gdW5sZXNzIGNsb3N1cmUgY29kZSBpcyByZWNlaXZpbmcgb2JqZWN0cyBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzLgoKICAgICAgLy8gSUUgaW4gY3Jvc3Mtd2luZG93IGNhbGxzIGRvZXMgbm90IGNvcnJlY3RseSBtYXJzaGFsIHRoZSBmdW5jdGlvbiB0eXBlCiAgICAgIC8vIChpdCBhcHBlYXJzIGp1c3QgYXMgYW4gb2JqZWN0KSBzbyB3ZSBjYW5ub3QgdXNlIGp1c3QgdHlwZW9mIHZhbCA9PQogICAgICAvLyAnZnVuY3Rpb24nLiBIb3dldmVyLCBpZiB0aGUgb2JqZWN0IGhhcyBhIGNhbGwgcHJvcGVydHksIGl0IGlzIGEKICAgICAgLy8gZnVuY3Rpb24uCiAgICAgIGlmICgoY2xhc3NOYW1lID09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHwKICAgICAgICAgICB0eXBlb2YgdmFsdWUuY2FsbCAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUgIT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgICAgIXZhbHVlLnByb3BlcnR5SXNFbnVtZXJhYmxlKCdjYWxsJykpKSB7CiAgICAgICAgcmV0dXJuICdmdW5jdGlvbic7CiAgICAgIH0KCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJ251bGwnOwogICAgfQoKICB9IGVsc2UgaWYgKHMgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUuY2FsbCA9PSAndW5kZWZpbmVkJykgewogICAgLy8gSW4gU2FmYXJpIHR5cGVvZiBub2RlTGlzdCByZXR1cm5zICdmdW5jdGlvbicsIGFuZCBvbiBGaXJlZm94IHR5cGVvZgogICAgLy8gYmVoYXZlcyBzaW1pbGFybHkgZm9yIEhUTUx7QXBwbGV0LEVtYmVkLE9iamVjdH0sIEVsZW1lbnRzIGFuZCBSZWdFeHBzLiBXZQogICAgLy8gd291bGQgbGlrZSB0byByZXR1cm4gb2JqZWN0IGZvciB0aG9zZSBhbmQgd2UgY2FuIGRldGVjdCBhbiBpbnZhbGlkCiAgICAvLyBmdW5jdGlvbiBieSBtYWtpbmcgc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3QgaGFzIGEgY2FsbCBtZXRob2QuCiAgICByZXR1cm4gJ29iamVjdCc7CiAgfQogIHJldHVybiBzOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBudWxsLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIG51bGwuCiAqIEBkZXByZWNhdGVkIFVzZSBgdmFsID09PSBudWxsYCBpbnN0ZWFkLgogKi8KZ29vZy5pc051bGwgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gdmFsID09PSBudWxsOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC4KICogQGRlcHJlY2F0ZWQgVXNlIGB2YWwgIT0gbnVsbGAgaW5zdGVhZC4KICovCmdvb2cuaXNEZWZBbmROb3ROdWxsID0gZnVuY3Rpb24odmFsKSB7CiAgLy8gTm90ZSB0aGF0IHVuZGVmaW5lZCA9PSBudWxsLgogIHJldHVybiB2YWwgIT0gbnVsbDsKfTsKCgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYW4gYXJyYXkuCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYW4gYXJyYXkuCiAqLwpnb29nLmlzQXJyYXkgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gZ29vZy50eXBlT2YodmFsKSA9PSAnYXJyYXknOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBsb29rcyBsaWtlIGFuIGFycmF5LiBUbyBxdWFsaWZ5IGFzIGFycmF5IGxpa2UKICogdGhlIHZhbHVlIG5lZWRzIHRvIGJlIGVpdGhlciBhIE5vZGVMaXN0IG9yIGFuIG9iamVjdCB3aXRoIGEgTnVtYmVyIGxlbmd0aAogKiBwcm9wZXJ0eS4gTm90ZSB0aGF0IGZvciB0aGlzIGZ1bmN0aW9uIG5laXRoZXIgc3RyaW5ncyBub3IgZnVuY3Rpb25zIGFyZQogKiBjb25zaWRlcmVkICJhcnJheS1saWtlIi4KICoKICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhbiBhcnJheS4KICovCmdvb2cuaXNBcnJheUxpa2UgPSBmdW5jdGlvbih2YWwpIHsKICB2YXIgdHlwZSA9IGdvb2cudHlwZU9mKHZhbCk7CiAgLy8gV2UgZG8gbm90IHVzZSBnb29nLmlzT2JqZWN0IGhlcmUgaW4gb3JkZXIgdG8gZXhjbHVkZSBmdW5jdGlvbiB2YWx1ZXMuCiAgcmV0dXJuIHR5cGUgPT0gJ2FycmF5JyB8fCB0eXBlID09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwubGVuZ3RoID09ICdudW1iZXInOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBsb29rcyBsaWtlIGEgRGF0ZS4gVG8gcXVhbGlmeSBhcyBEYXRlLWxpa2UgdGhlCiAqIHZhbHVlIG5lZWRzIHRvIGJlIGFuIG9iamVjdCBhbmQgaGF2ZSBhIGdldEZ1bGxZZWFyKCkgZnVuY3Rpb24uCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYSBsaWtlIGEgRGF0ZS4KICovCmdvb2cuaXNEYXRlTGlrZSA9IGZ1bmN0aW9uKHZhbCkgewogIHJldHVybiBnb29nLmlzT2JqZWN0KHZhbCkgJiYgdHlwZW9mIHZhbC5nZXRGdWxsWWVhciA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIGZ1bmN0aW9uLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24uCiAqLwpnb29nLmlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gZ29vZy50eXBlT2YodmFsKSA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBvYmplY3QuICBUaGlzIGluY2x1ZGVzIGFycmF5cyBhbmQKICogZnVuY3Rpb25zLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIGFuIG9iamVjdC4KICovCmdvb2cuaXNPYmplY3QgPSBmdW5jdGlvbih2YWwpIHsKICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7CiAgcmV0dXJuIHR5cGUgPT0gJ29iamVjdCcgJiYgdmFsICE9IG51bGwgfHwgdHlwZSA9PSAnZnVuY3Rpb24nOwogIC8vIHJldHVybiBPYmplY3QodmFsKSA9PT0gdmFsIGFsc28gd29ya3MsIGJ1dCBpcyBzbG93ZXIsIGVzcGVjaWFsbHkgaWYgdmFsIGlzCiAgLy8gbm90IGFuIG9iamVjdC4KfTsKCgovKioKICogR2V0cyBhIHVuaXF1ZSBJRCBmb3IgYW4gb2JqZWN0LiBUaGlzIG11dGF0ZXMgdGhlIG9iamVjdCBzbyB0aGF0IGZ1cnRoZXIgY2FsbHMKICogd2l0aCB0aGUgc2FtZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZS4gVGhlIHVuaXF1ZSBJRCBpcwogKiBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBhY3Jvc3MgdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbW9uZ3N0IG9iamVjdHMgdGhhdCBhcmUKICogcGFzc2VkIGludG8gYGdldFVpZGAuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBJRCBpcyB1bmlxdWUgb3IKICogY29uc2lzdGVudCBhY3Jvc3Mgc2Vzc2lvbnMuIEl0IGlzIHVuc2FmZSB0byBnZW5lcmF0ZSB1bmlxdWUgSUQgZm9yIGZ1bmN0aW9uCiAqIHByb3RvdHlwZXMuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBnZXQgdGhlIHVuaXF1ZSBJRCBmb3IuCiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIG9iamVjdC4KICovCmdvb2cuZ2V0VWlkID0gZnVuY3Rpb24ob2JqKSB7CiAgLy8gVE9ETyhhcnYpOiBNYWtlIHRoZSB0eXBlIHN0cmljdGVyLCBkbyBub3QgYWNjZXB0IG51bGwuCgogIC8vIEluIE9wZXJhIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSBleGlzdHMgYnV0IGFsd2F5cyByZXR1cm5zIGZhbHNlIHNvIHdlIGF2b2lkCiAgLy8gdXNpbmcgaXQuIEFzIGEgY29uc2VxdWVuY2UgdGhlIHVuaXF1ZSBJRCBnZW5lcmF0ZWQgZm9yIEJhc2VDbGFzcy5wcm90b3R5cGUKICAvLyBhbmQgU3ViQ2xhc3MucHJvdG90eXBlIHdpbGwgYmUgdGhlIHNhbWUuCiAgLy8gVE9ETyhiLzE0MTUxMjMyMyk6IFVVSURzIGFyZSBicm9rZW4gZm9yIGN0b3JzIHdpdGggY2xhc3Mtc2lkZSBpbmhlcml0YW5jZS4KICByZXR1cm4gb2JqW2dvb2cuVUlEX1BST1BFUlRZX10gfHwKICAgICAgKG9ialtnb29nLlVJRF9QUk9QRVJUWV9dID0gKytnb29nLnVpZENvdW50ZXJfKTsKfTsKCgovKioKICogV2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFscmVhZHkgYXNzaWduZWQgYSB1bmlxdWUgSUQuCiAqCiAqIFRoaXMgZG9lcyBub3QgbW9kaWZ5IHRoZSBvYmplY3QuCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2suCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlcmUgaXMgYW4gYXNzaWduZWQgdW5pcXVlIGlkIGZvciB0aGUgb2JqZWN0LgogKi8KZ29vZy5oYXNVaWQgPSBmdW5jdGlvbihvYmopIHsKICByZXR1cm4gISFvYmpbZ29vZy5VSURfUFJPUEVSVFlfXTsKfTsKCgovKioKICogUmVtb3ZlcyB0aGUgdW5pcXVlIElEIGZyb20gYW4gb2JqZWN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgb2JqZWN0IHdhcwogKiBwcmV2aW91c2x5IG11dGF0ZWQgdXNpbmcgYGdvb2cuZ2V0VWlkYCBpbiB3aGljaCBjYXNlIHRoZSBtdXRhdGlvbiBpcwogKiB1bmRvbmUuCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byByZW1vdmUgdGhlIHVuaXF1ZSBJRCBmaWVsZCBmcm9tLgogKi8KZ29vZy5yZW1vdmVVaWQgPSBmdW5jdGlvbihvYmopIHsKICAvLyBUT0RPKGFydik6IE1ha2UgdGhlIHR5cGUgc3RyaWN0ZXIsIGRvIG5vdCBhY2NlcHQgbnVsbC4KCiAgLy8gSW4gSUUsIERPTSBub2RlcyBhcmUgbm90IGluc3RhbmNlcyBvZiBPYmplY3QgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB3ZQogIC8vIHRyeSB0byBkZWxldGUuICBJbnN0ZWFkIHdlIHRyeSB0byB1c2UgcmVtb3ZlQXR0cmlidXRlLgogIGlmIChvYmogIT09IG51bGwgJiYgJ3JlbW92ZUF0dHJpYnV0ZScgaW4gb2JqKSB7CiAgICBvYmoucmVtb3ZlQXR0cmlidXRlKGdvb2cuVUlEX1BST1BFUlRZXyk7CiAgfQoKICB0cnkgewogICAgZGVsZXRlIG9ialtnb29nLlVJRF9QUk9QRVJUWV9dOwogIH0gY2F0Y2ggKGV4KSB7CiAgfQp9OwoKCi8qKgogKiBOYW1lIGZvciB1bmlxdWUgSUQgcHJvcGVydHkuIEluaXRpYWxpemVkIGluIGEgd2F5IHRvIGhlbHAgYXZvaWQgY29sbGlzaW9ucwogKiB3aXRoIG90aGVyIGNsb3N1cmUgSmF2YVNjcmlwdCBvbiB0aGUgc2FtZSBwYWdlLgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KZ29vZy5VSURfUFJPUEVSVFlfID0gJ2Nsb3N1cmVfdWlkXycgKyAoKE1hdGgucmFuZG9tKCkgKiAxZTkpID4+PiAwKTsKCgovKioKICogQ291bnRlciBmb3IgVUlELgogKiBAdHlwZSB7bnVtYmVyfQogKiBAcHJpdmF0ZQogKi8KZ29vZy51aWRDb3VudGVyXyA9IDA7CgoKLyoqCiAqIEFkZHMgYSBoYXNoIGNvZGUgZmllbGQgdG8gYW4gb2JqZWN0LiBUaGUgaGFzaCBjb2RlIGlzIHVuaXF1ZSBmb3IgdGhlCiAqIGdpdmVuIG9iamVjdC4KICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGdldCB0aGUgaGFzaCBjb2RlIGZvci4KICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaCBjb2RlIGZvciB0aGUgb2JqZWN0LgogKiBAZGVwcmVjYXRlZCBVc2UgZ29vZy5nZXRVaWQgaW5zdGVhZC4KICovCmdvb2cuZ2V0SGFzaENvZGUgPSBnb29nLmdldFVpZDsKCgovKioKICogUmVtb3ZlcyB0aGUgaGFzaCBjb2RlIGZpZWxkIGZyb20gYW4gb2JqZWN0LgogKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmVtb3ZlIHRoZSBmaWVsZCBmcm9tLgogKiBAZGVwcmVjYXRlZCBVc2UgZ29vZy5yZW1vdmVVaWQgaW5zdGVhZC4KICovCmdvb2cucmVtb3ZlSGFzaENvZGUgPSBnb29nLnJlbW92ZVVpZDsKCgovKioKICogQ2xvbmVzIGEgdmFsdWUuIFRoZSBpbnB1dCBtYXkgYmUgYW4gT2JqZWN0LCBBcnJheSwgb3IgYmFzaWMgdHlwZS4gT2JqZWN0cyBhbmQKICogYXJyYXlzIHdpbGwgYmUgY2xvbmVkIHJlY3Vyc2l2ZWx5LgogKgogKiBXQVJOSU5HUzoKICogPGNvZGU+Z29vZy5jbG9uZU9iamVjdDwvY29kZT4gZG9lcyBub3QgZGV0ZWN0IHJlZmVyZW5jZSBsb29wcy4gT2JqZWN0cyB0aGF0CiAqIHJlZmVyIHRvIHRoZW1zZWx2ZXMgd2lsbCBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24uCiAqCiAqIDxjb2RlPmdvb2cuY2xvbmVPYmplY3Q8L2NvZGU+IGlzIHVuYXdhcmUgb2YgdW5pcXVlIGlkZW50aWZpZXJzLCBhbmQgY29waWVzCiAqIFVJRHMgY3JlYXRlZCBieSA8Y29kZT5nZXRVaWQ8L2NvZGU+IGludG8gY2xvbmVkIHJlc3VsdHMuCiAqCiAqIEBwYXJhbSB7Kn0gb2JqIFRoZSB2YWx1ZSB0byBjbG9uZS4KICogQHJldHVybiB7Kn0gQSBjbG9uZSBvZiB0aGUgaW5wdXQgdmFsdWUuCiAqIEBkZXByZWNhdGVkIGdvb2cuY2xvbmVPYmplY3QgaXMgdW5zYWZlLiBQcmVmZXIgdGhlIGdvb2cub2JqZWN0IG1ldGhvZHMuCiAqLwpnb29nLmNsb25lT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7CiAgdmFyIHR5cGUgPSBnb29nLnR5cGVPZihvYmopOwogIGlmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2FycmF5JykgewogICAgaWYgKHR5cGVvZiBvYmouY2xvbmUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIG9iai5jbG9uZSgpOwogICAgfQogICAgdmFyIGNsb25lID0gdHlwZSA9PSAnYXJyYXknID8gW10gOiB7fTsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgY2xvbmVba2V5XSA9IGdvb2cuY2xvbmVPYmplY3Qob2JqW2tleV0pOwogICAgfQogICAgcmV0dXJuIGNsb25lOwogIH0KCiAgcmV0dXJuIG9iajsKfTsKCgovKioKICogQSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZ29vZy5iaW5kLgogKiBAcGFyYW0gez9mdW5jdGlvbih0aGlzOlQsIC4uLil9IGZuIEEgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5LgogKiBAcGFyYW0ge1R9IHNlbGZPYmogU3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hpY2ggdGhpcyBzaG91bGQgcG9pbnQgdG8gd2hlbiB0aGUKICogICAgIGZ1bmN0aW9uIGlzIHJ1bi4KICogQHBhcmFtIHsuLi4qfSB2YXJfYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXJ0aWFsbHkgYXBwbGllZCB0byB0aGUKICogICAgIGZ1bmN0aW9uLgogKiBAcmV0dXJuIHshRnVuY3Rpb259IEEgcGFydGlhbGx5LWFwcGxpZWQgZm9ybSBvZiB0aGUgZnVuY3Rpb24gZ29vZy5iaW5kKCkgd2FzCiAqICAgICBpbnZva2VkIGFzIGEgbWV0aG9kIG9mLgogKiBAdGVtcGxhdGUgVAogKiBAcHJpdmF0ZQogKi8KZ29vZy5iaW5kTmF0aXZlXyA9IGZ1bmN0aW9uKGZuLCBzZWxmT2JqLCB2YXJfYXJncykgewogIHJldHVybiAvKiogQHR5cGUgeyFGdW5jdGlvbn0gKi8gKGZuLmNhbGwuYXBwbHkoZm4uYmluZCwgYXJndW1lbnRzKSk7Cn07CgoKLyoqCiAqIEEgcHVyZS1KUyBpbXBsZW1lbnRhdGlvbiBvZiBnb29nLmJpbmQuCiAqIEBwYXJhbSB7P2Z1bmN0aW9uKHRoaXM6VCwgLi4uKX0gZm4gQSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkuCiAqIEBwYXJhbSB7VH0gc2VsZk9iaiBTcGVjaWZpZXMgdGhlIG9iamVjdCB3aGljaCB0aGlzIHNob3VsZCBwb2ludCB0byB3aGVuIHRoZQogKiAgICAgZnVuY3Rpb24gaXMgcnVuLgogKiBAcGFyYW0gey4uLip9IHZhcl9hcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgYXJlIHBhcnRpYWxseSBhcHBsaWVkIHRvIHRoZQogKiAgICAgZnVuY3Rpb24uCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gQSBwYXJ0aWFsbHktYXBwbGllZCBmb3JtIG9mIHRoZSBmdW5jdGlvbiBnb29nLmJpbmQoKSB3YXMKICogICAgIGludm9rZWQgYXMgYSBtZXRob2Qgb2YuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwcml2YXRlCiAqLwpnb29nLmJpbmRKc18gPSBmdW5jdGlvbihmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICBpZiAoIWZuKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICB9CgogIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgdmFyIGJvdW5kQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIC8vIFByZXBlbmQgdGhlIGJvdW5kIGFyZ3VtZW50cyB0byB0aGUgY3VycmVudCBhcmd1bWVudHMuCiAgICAgIHZhciBuZXdBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkobmV3QXJncywgYm91bmRBcmdzKTsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIG5ld0FyZ3MpOwogICAgfTsKCiAgfSBlbHNlIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIGFyZ3VtZW50cyk7CiAgICB9OwogIH0KfTsKCgovKioKICogUGFydGlhbGx5IGFwcGxpZXMgdGhpcyBmdW5jdGlvbiB0byBhIHBhcnRpY3VsYXIgJ3RoaXMgb2JqZWN0JyBhbmQgemVybyBvcgogKiBtb3JlIGFyZ3VtZW50cy4gVGhlIHJlc3VsdCBpcyBhIG5ldyBmdW5jdGlvbiB3aXRoIHNvbWUgYXJndW1lbnRzIG9mIHRoZSBmaXJzdAogKiBmdW5jdGlvbiBwcmUtZmlsbGVkIGFuZCB0aGUgdmFsdWUgb2YgdGhpcyAncHJlLXNwZWNpZmllZCcuCiAqCiAqIFJlbWFpbmluZyBhcmd1bWVudHMgc3BlY2lmaWVkIGF0IGNhbGwtdGltZSBhcmUgYXBwZW5kZWQgdG8gdGhlIHByZS1zcGVjaWZpZWQKICogb25lcy4KICoKICogQWxzbyBzZWU6IHtAbGluayAjcGFydGlhbH0uCiAqCiAqIFVzYWdlOgogKiA8cHJlPnZhciBiYXJNZXRoQm91bmQgPSBnb29nLmJpbmQobXlGdW5jdGlvbiwgbXlPYmosICdhcmcxJywgJ2FyZzInKTsKICogYmFyTWV0aEJvdW5kKCdhcmczJywgJ2FyZzQnKTs8L3ByZT4KICoKICogQHBhcmFtIHs/ZnVuY3Rpb24odGhpczpULCAuLi4pfSBmbiBBIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseS4KICogQHBhcmFtIHtUfSBzZWxmT2JqIFNwZWNpZmllcyB0aGUgb2JqZWN0IHdoaWNoIHRoaXMgc2hvdWxkIHBvaW50IHRvIHdoZW4gdGhlCiAqICAgICBmdW5jdGlvbiBpcyBydW4uCiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFydGlhbGx5IGFwcGxpZWQgdG8gdGhlCiAqICAgICBmdW5jdGlvbi4KICogQHJldHVybiB7IUZ1bmN0aW9ufSBBIHBhcnRpYWxseS1hcHBsaWVkIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIGdvb2cuYmluZCgpIHdhcwogKiAgICAgaW52b2tlZCBhcyBhIG1ldGhvZCBvZi4KICogQHRlbXBsYXRlIFQKICogQHN1cHByZXNzIHtkZXByZWNhdGVkfSBTZWUgYWJvdmUuCiAqLwpnb29nLmJpbmQgPSBmdW5jdGlvbihmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICAvLyBUT0RPKG5pY2tzYW50b3MpOiBuYXJyb3cgdGhlIHR5cGUgc2lnbmF0dXJlLgogIGlmIChGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAmJgogICAgICAvLyBOT1RFKG5pY2tzYW50b3MpOiBTb21lYm9keSBwdWxsZWQgYmFzZS5qcyBpbnRvIHRoZSBkZWZhdWx0IENocm9tZQogICAgICAvLyBleHRlbnNpb24gZW52aXJvbm1lbnQuIFRoaXMgbWVhbnMgdGhhdCBmb3IgQ2hyb21lIGV4dGVuc2lvbnMsIHRoZXkgZ2V0CiAgICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB0aGF0IGNhbGxzIGdvb2cuYmluZAogICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgb25lLiBFdmVuIHdvcnNlLCB3ZSBkb24ndCB3YW50IHRvIGludHJvZHVjZSBhCiAgICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBnb29nLmJpbmQgYW5kIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBzbwogICAgICAvLyB3ZSBoYXZlIHRvIGhhY2sgdGhpcyB0byBtYWtlIHN1cmUgaXQgd29ya3MgY29ycmVjdGx5LgogICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC50b1N0cmluZygpLmluZGV4T2YoJ25hdGl2ZSBjb2RlJykgIT0gLTEpIHsKICAgIGdvb2cuYmluZCA9IGdvb2cuYmluZE5hdGl2ZV87CiAgfSBlbHNlIHsKICAgIGdvb2cuYmluZCA9IGdvb2cuYmluZEpzXzsKICB9CiAgcmV0dXJuIGdvb2cuYmluZC5hcHBseShudWxsLCBhcmd1bWVudHMpOwp9OwoKCi8qKgogKiBMaWtlIGdvb2cuYmluZCgpLCBleGNlcHQgdGhhdCBhICd0aGlzIG9iamVjdCcgaXMgbm90IHJlcXVpcmVkLiBVc2VmdWwgd2hlbgogKiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGlzIGFscmVhZHkgYm91bmQuCiAqCiAqIFVzYWdlOgogKiB2YXIgZyA9IGdvb2cucGFydGlhbChmLCBhcmcxLCBhcmcyKTsKICogZyhhcmczLCBhcmc0KTsKICoKICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gQSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkuCiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFydGlhbGx5IGFwcGxpZWQgdG8gZm4uCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gQSBwYXJ0aWFsbHktYXBwbGllZCBmb3JtIG9mIHRoZSBmdW5jdGlvbiBnb29nLnBhcnRpYWwoKQogKiAgICAgd2FzIGludm9rZWQgYXMgYSBtZXRob2Qgb2YuCiAqLwpnb29nLnBhcnRpYWwgPSBmdW5jdGlvbihmbiwgdmFyX2FyZ3MpIHsKICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgLy8gQ2xvbmUgdGhlIGFycmF5ICh3aXRoIHNsaWNlKCkpIGFuZCBhcHBlbmQgYWRkaXRpb25hbCBhcmd1bWVudHMKICAgIC8vIHRvIHRoZSBleGlzdGluZyBhcmd1bWVudHMuCiAgICB2YXIgbmV3QXJncyA9IGFyZ3Muc2xpY2UoKTsKICAgIG5ld0FyZ3MucHVzaC5hcHBseShuZXdBcmdzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIGZuLmFwcGx5KC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpLCBuZXdBcmdzKTsKICB9Owp9OwoKCi8qKgogKiBDb3BpZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc291cmNlIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuIFRoaXMgbWV0aG9kCiAqIGRvZXMgbm90IHdvcmsgb24gYWxsIGJyb3dzZXJzIGZvciBhbGwgb2JqZWN0cyB0aGF0IGNvbnRhaW4ga2V5cyBzdWNoIGFzCiAqIHRvU3RyaW5nIG9yIGhhc093blByb3BlcnR5LiBVc2UgZ29vZy5vYmplY3QuZXh0ZW5kIGZvciB0aGlzIHB1cnBvc2UuCiAqCiAqIE5PVEU6IFNvbWUgaGF2ZSBhZHZvY2F0ZWQgZm9yIHRoZSB1c2Ugb2YgZ29vZy5taXhpbiB0byBzZXR1cCBjbGFzc2VzCiAqIHdpdGggbXVsdGlwbGUgaW5oZXJpdGVuY2UgKHRyYWl0cywgbWl4aW5zLCBldGMpLiAgSG93ZXZlciwgYXMgaXQgc2ltcGx5CiAqIHVzZXMgImZvciBpbiIsIHRoaXMgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBFUzYgY2xhc3NlcyB3aG9zZSBtZXRob2RzIGFyZQogKiBub24tZW51bWVyYWJsZS4gIENoYW5naW5nIHRoaXMsIHdvdWxkIGJyZWFrIGNhc2VzIHdoZXJlIG5vbi1lbnVtZXJhYmxlCiAqIHByb3BlcnRpZXMgYXJlIG5vdCBleHBlY3RlZC4KICoKICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQuCiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlLgogKiBAZGVwcmVjYXRlZCBQcmVmZXIgT2JqZWN0LmFzc2lnbgogKi8KZ29vZy5taXhpbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CiAgZm9yICh2YXIgeCBpbiBzb3VyY2UpIHsKICAgIHRhcmdldFt4XSA9IHNvdXJjZVt4XTsKICB9CgogIC8vIEZvciBJRTcgb3IgbG93ZXIsIHRoZSBmb3ItaW4tbG9vcCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9wZXJ0aWVzIHRoYXQgYXJlCiAgLy8gbm90IGVudW1lcmFibGUgb24gdGhlIHByb3RvdHlwZSBvYmplY3QgKGZvciBleGFtcGxlLCBpc1Byb3RvdHlwZU9mIGZyb20KICAvLyBPYmplY3QucHJvdG90eXBlKSBidXQgYWxzbyBpdCB3aWxsIG5vdCBpbmNsdWRlICdyZXBsYWNlJyBvbiBvYmplY3RzIHRoYXQKICAvLyBleHRlbmQgU3RyaW5nIGFuZCBjaGFuZ2UgJ3JlcGxhY2UnIChub3QgdGhhdCBpdCBpcyBjb21tb24gZm9yIGFueW9uZSB0bwogIC8vIGV4dGVuZCBhbnl0aGluZyBleGNlcHQgT2JqZWN0KS4KfTsKCgovKioKICogQHJldHVybiB7bnVtYmVyfSBBbiBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwogKiAgICAgYmV0d2VlbiBtaWRuaWdodCwgSmFudWFyeSAxLCAxOTcwIGFuZCB0aGUgY3VycmVudCB0aW1lLgogKiBAZGVwcmVjYXRlZCBVc2UgRGF0ZS5ub3cKICovCmdvb2cubm93ID0gKGdvb2cuVFJVU1RFRF9TSVRFICYmIERhdGUubm93KSB8fCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAvLyBVbmFyeSBwbHVzIG9wZXJhdG9yIGNvbnZlcnRzIGl0cyBvcGVyYW5kIHRvIGEgbnVtYmVyIHdoaWNoIGluCiAgICAgICAgICAgICAvLyB0aGUgY2FzZSBvZgogICAgICAgICAgICAgLy8gYSBkYXRlIGlzIGRvbmUgYnkgY2FsbGluZyBnZXRUaW1lKCkuCiAgICAgICAgICAgICByZXR1cm4gK25ldyBEYXRlKCk7CiAgICAgICAgICAgfSk7CgoKLyoqCiAqIEV2YWxzIEphdmFTY3JpcHQgaW4gdGhlIGdsb2JhbCBzY29wZS4gIEluIElFIHRoaXMgdXNlcyBleGVjU2NyaXB0LCBvdGhlcgogKiBicm93c2VycyB1c2UgZ29vZy5nbG9iYWwuZXZhbC4gSWYgZ29vZy5nbG9iYWwuZXZhbCBkb2VzIG5vdCBldmFsdWF0ZSBpbiB0aGUKICogZ2xvYmFsIHNjb3BlIChmb3IgZXhhbXBsZSwgaW4gU2FmYXJpKSwgYXBwZW5kcyBhIHNjcmlwdCB0YWcgaW5zdGVhZC4KICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBuZWl0aGVyIGV4ZWNTY3JpcHQgb3IgZXZhbCBpcyBkZWZpbmVkLgogKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0IEphdmFTY3JpcHQgc3RyaW5nLgogKi8KZ29vZy5nbG9iYWxFdmFsID0gZnVuY3Rpb24oc2NyaXB0KSB7CiAgaWYgKGdvb2cuZ2xvYmFsLmV4ZWNTY3JpcHQpIHsKICAgIGdvb2cuZ2xvYmFsLmV4ZWNTY3JpcHQoc2NyaXB0LCAnSmF2YVNjcmlwdCcpOwogIH0gZWxzZSBpZiAoZ29vZy5nbG9iYWwuZXZhbCkgewogICAgLy8gVGVzdCB0byBzZWUgaWYgZXZhbCB3b3JrcwogICAgaWYgKGdvb2cuZXZhbFdvcmtzRm9yR2xvYmFsc18gPT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIGdvb2cuZ2xvYmFsLmV2YWwoJ3ZhciBfZXZhbFRlc3RfID0gMTsnKTsKICAgICAgfSBjYXRjaCAoaWdub3JlKSB7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBnb29nLmdsb2JhbFsnX2V2YWxUZXN0XyddICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGRlbGV0ZSBnb29nLmdsb2JhbFsnX2V2YWxUZXN0XyddOwogICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkgewogICAgICAgICAgLy8gTWljcm9zb2Z0IGVkZ2UgZmFpbHMgdGhlIGRlbGV0aW9uIGFib3ZlIGluIHN0cmljdCBtb2RlLgogICAgICAgIH0KICAgICAgICBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXykgewogICAgICBnb29nLmdsb2JhbC5ldmFsKHNjcmlwdCk7CiAgICB9IGVsc2UgewogICAgICAvKiogQHR5cGUgeyFEb2N1bWVudH0gKi8KICAgICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50OwogICAgICB2YXIgc2NyaXB0RWx0ID0KICAgICAgICAgIC8qKiBAdHlwZSB7IUhUTUxTY3JpcHRFbGVtZW50fSAqLyAoZG9jLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKTsKICAgICAgc2NyaXB0RWx0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgc2NyaXB0RWx0LmRlZmVyID0gZmFsc2U7CiAgICAgIC8vIE5vdGUodXNlcik6IGNhbid0IHVzZSAuaW5uZXJIVE1MIHNpbmNlICJ0KCc8dGVzdD4nKSIgd2lsbCBmYWlsIGFuZAogICAgICAvLyAudGV4dCBkb2Vzbid0IHdvcmsgaW4gU2FmYXJpIDIuICBUaGVyZWZvcmUgd2UgYXBwZW5kIGEgdGV4dCBub2RlLgogICAgICBzY3JpcHRFbHQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHNjcmlwdCkpOwogICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHRFbHQpOwogICAgICBkb2MuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRFbHQpOwogICAgfQogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cuZ2xvYmFsRXZhbCBub3QgYXZhaWxhYmxlJyk7CiAgfQp9OwoKCi8qKgogKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3Qgd2UgY2FuIGNhbGwgJ2V2YWwnIGRpcmVjdGx5IHRvIGV2YWwgY29kZSBpbiB0aGUKICogZ2xvYmFsIHNjb3BlLiBTZXQgdG8gYSBCb29sZWFuIGJ5IHRoZSBmaXJzdCBjYWxsIHRvIGdvb2cuZ2xvYmFsRXZhbCAod2hpY2gKICogZW1waXJpY2FsbHkgdGVzdHMgd2hldGhlciBldmFsIHdvcmtzIGZvciBnbG9iYWxzKS4gQHNlZSBnb29nLmdsb2JhbEV2YWwKICogQHR5cGUgez9ib29sZWFufQogKiBAcHJpdmF0ZQogKi8KZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXyA9IG51bGw7CgoKLyoqCiAqIE9wdGlvbmFsIG1hcCBvZiBDU1MgY2xhc3MgbmFtZXMgdG8gb2JmdXNjYXRlZCBuYW1lcyB1c2VkIHdpdGgKICogZ29vZy5nZXRDc3NOYW1lKCkuCiAqIEBwcml2YXRlIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPnx1bmRlZmluZWR9CiAqIEBzZWUgZ29vZy5zZXRDc3NOYW1lTWFwcGluZwogKi8KZ29vZy5jc3NOYW1lTWFwcGluZ187CgoKLyoqCiAqIE9wdGlvbmFsIG9iZnVzY2F0aW9uIHN0eWxlIGZvciBDU1MgY2xhc3MgbmFtZXMuIFNob3VsZCBiZSBzZXQgdG8gZWl0aGVyCiAqICdCWV9XSE9MRScgb3IgJ0JZX1BBUlQnIGlmIGRlZmluZWQuCiAqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfQogKiBAcHJpdmF0ZQogKiBAc2VlIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcKICovCmdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV87CgoKCi8qKgogKiBBIGhvb2sgZm9yIG1vZGlmeWluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBnb29nLmdldENzc05hbWUuIFRoZSBmdW5jdGlvbgogKiBpZiBwcmVzZW50LCB3aWxsIHJlY2VpdmUgdGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGUgZ29vZy5nZXRDc3NOYW1lIGFzCiAqIGl0cyBpbnB1dC4KICoKICogQHR5cGUgeyhmdW5jdGlvbihzdHJpbmcpOnN0cmluZyl8dW5kZWZpbmVkfQogKi8KZ29vZy5nbG9iYWwuQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk47CgoKLyoqCiAqIEhhbmRsZXMgc3RyaW5ncyB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIENTUyBjbGFzcyBuYW1lcy4KICoKICogVGhpcyBmdW5jdGlvbiB3b3JrcyBpbiB0YW5kZW0gd2l0aCBAc2VlIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcuCiAqCiAqIFdpdGhvdXQgYW55IG1hcHBpbmcgc2V0LCB0aGUgYXJndW1lbnRzIGFyZSBzaW1wbGUgam9pbmVkIHdpdGggYSBoeXBoZW4gYW5kCiAqIHBhc3NlZCB0aHJvdWdoIHVuYWx0ZXJlZC4KICoKICogV2hlbiB0aGVyZSBpcyBhIG1hcHBpbmcsIHRoZXJlIGFyZSB0d28gcG9zc2libGUgc3R5bGVzIGluIHdoaWNoIHRoZXNlCiAqIG1hcHBpbmdzIGFyZSB1c2VkLiBJbiB0aGUgQllfUEFSVCBzdHlsZSwgZWFjaCBwYXJ0IChpLmUuIGluIGJldHdlZW4gaHlwaGVucykKICogb2YgdGhlIHBhc3NlZCBpbiBjc3MgbmFtZSBpcyByZXdyaXR0ZW4gYWNjb3JkaW5nIHRvIHRoZSBtYXAuIEluIHRoZSBCWV9XSE9MRQogKiBzdHlsZSwgdGhlIGZ1bGwgY3NzIG5hbWUgaXMgbG9va2VkIHVwIGluIHRoZSBtYXAgZGlyZWN0bHkuIElmIGEgcmV3cml0ZSBpcwogKiBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBtYXAsIHRoZSBjb21waWxlciB3aWxsIG91dHB1dCBhIHdhcm5pbmcuCiAqCiAqIFdoZW4gdGhlIG1hcHBpbmcgaXMgcGFzc2VkIHRvIHRoZSBjb21waWxlciwgaXQgd2lsbCByZXBsYWNlIGNhbGxzIHRvCiAqIGdvb2cuZ2V0Q3NzTmFtZSB3aXRoIHRoZSBzdHJpbmdzIGZyb20gdGhlIG1hcHBpbmcsIGUuZy4KICogICAgIHZhciB4ID0gZ29vZy5nZXRDc3NOYW1lKCdmb28nKTsKICogICAgIHZhciB5ID0gZ29vZy5nZXRDc3NOYW1lKHRoaXMuYmFzZUNsYXNzLCAnYWN0aXZlJyk7CiAqICBiZWNvbWVzOgogKiAgICAgdmFyIHggPSAnZm9vJzsKICogICAgIHZhciB5ID0gdGhpcy5iYXNlQ2xhc3MgKyAnLWFjdGl2ZSc7CiAqCiAqIElmIG9uZSBhcmd1bWVudCBpcyBwYXNzZWQgaXQgd2lsbCBiZSBwcm9jZXNzZWQsIGlmIHR3byBhcmUgcGFzc2VkIG9ubHkgdGhlCiAqIG1vZGlmaWVyIHdpbGwgYmUgcHJvY2Vzc2VkLCBhcyBpdCBpcyBhc3N1bWVkIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgZ2VuZXJhdGVkCiAqIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgZ29vZy5nZXRDc3NOYW1lLgogKgogKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lLgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9tb2RpZmllciBBIG1vZGlmaWVyIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBjbGFzcyBuYW1lLgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjbGFzcyBuYW1lIG9yIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjbGFzcyBuYW1lIGFuZAogKiAgICAgdGhlIG1vZGlmaWVyLgogKi8KZ29vZy5nZXRDc3NOYW1lID0gZnVuY3Rpb24oY2xhc3NOYW1lLCBvcHRfbW9kaWZpZXIpIHsKICAvLyBTdHJpbmcoKSBpcyB1c2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY29tcGlsZWQgc295IHdoZXJlIHRoZSBwYXNzZWQKICAvLyBjbGFzc05hbWUgY2FuIGJlIG5vbi1zdHJpbmcgb2JqZWN0cy4KICBpZiAoU3RyaW5nKGNsYXNzTmFtZSkuY2hhckF0KDApID09ICcuJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdjbGFzc05hbWUgcGFzc2VkIGluIGdvb2cuZ2V0Q3NzTmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICIuIi4nICsKICAgICAgICAnIFlvdSBwYXNzZWQ6ICcgKyBjbGFzc05hbWUpOwogIH0KCiAgdmFyIGdldE1hcHBpbmcgPSBmdW5jdGlvbihjc3NOYW1lKSB7CiAgICByZXR1cm4gZ29vZy5jc3NOYW1lTWFwcGluZ19bY3NzTmFtZV0gfHwgY3NzTmFtZTsKICB9OwoKICB2YXIgcmVuYW1lQnlQYXJ0cyA9IGZ1bmN0aW9uKGNzc05hbWUpIHsKICAgIC8vIFJlbWFwIGFsbCB0aGUgcGFydHMgaW5kaXZpZHVhbGx5LgogICAgdmFyIHBhcnRzID0gY3NzTmFtZS5zcGxpdCgnLScpOwogICAgdmFyIG1hcHBlZCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICBtYXBwZWQucHVzaChnZXRNYXBwaW5nKHBhcnRzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gbWFwcGVkLmpvaW4oJy0nKTsKICB9OwoKICB2YXIgcmVuYW1lOwogIGlmIChnb29nLmNzc05hbWVNYXBwaW5nXykgewogICAgcmVuYW1lID0KICAgICAgICBnb29nLmNzc05hbWVNYXBwaW5nU3R5bGVfID09ICdCWV9XSE9MRScgPyBnZXRNYXBwaW5nIDogcmVuYW1lQnlQYXJ0czsKICB9IGVsc2UgewogICAgcmVuYW1lID0gZnVuY3Rpb24oYSkgewogICAgICByZXR1cm4gYTsKICAgIH07CiAgfQoKICB2YXIgcmVzdWx0ID0KICAgICAgb3B0X21vZGlmaWVyID8gY2xhc3NOYW1lICsgJy0nICsgcmVuYW1lKG9wdF9tb2RpZmllcikgOiByZW5hbWUoY2xhc3NOYW1lKTsKCiAgLy8gVGhlIHNwZWNpYWwgQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk4gYWxsb3dzIHVzZXJzIHRvIHNwZWNpZnkgZnVydGhlcgogIC8vIHByb2Nlc3Npbmcgb2YgdGhlIGNsYXNzIG5hbWUuCiAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQX0ZOKSB7CiAgICByZXR1cm4gZ29vZy5nbG9iYWwuQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk4ocmVzdWx0KTsKICB9CgogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqCiAqIFNldHMgdGhlIG1hcCB0byBjaGVjayB3aGVuIHJldHVybmluZyBhIHZhbHVlIGZyb20gZ29vZy5nZXRDc3NOYW1lKCkuIEV4YW1wbGU6CiAqIDxwcmU+CiAqIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcoewogKiAgICJnb29nIjogImEiLAogKiAgICJkaXNhYmxlZCI6ICJiIiwKICogfSk7CiAqCiAqIHZhciB4ID0gZ29vZy5nZXRDc3NOYW1lKCdnb29nJyk7CiAqIC8vIFRoZSBmb2xsb3dpbmcgZXZhbHVhdGVzIHRvOiAiYSBhLWIiLgogKiBnb29nLmdldENzc05hbWUoJ2dvb2cnKSArICcgJyArIGdvb2cuZ2V0Q3NzTmFtZSh4LCAnZGlzYWJsZWQnKQogKiA8L3ByZT4KICogV2hlbiBkZWNsYXJlZCBhcyBhIG1hcCBvZiBzdHJpbmcgbGl0ZXJhbHMgdG8gc3RyaW5nIGxpdGVyYWxzLCB0aGUgSlNDb21waWxlcgogKiB3aWxsIHJlcGxhY2UgYWxsIGNhbGxzIHRvIGdvb2cuZ2V0Q3NzTmFtZSgpIHVzaW5nIHRoZSBzdXBwbGllZCBtYXAgaWYgdGhlCiAqIC0tcHJvY2Vzc19jbG9zdXJlX3ByaW1pdGl2ZXMgZmxhZyBpcyBzZXQuCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gbWFwcGluZyBBIG1hcCBvZiBzdHJpbmdzIHRvIHN0cmluZ3Mgd2hlcmUga2V5cyBhcmUgcG9zc2libGUKICogICAgIGFyZ3VtZW50cyB0byBnb29nLmdldENzc05hbWUoKSBhbmQgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMKICogICAgIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9zdHlsZSBUaGUgc3R5bGUgb2YgY3NzIG5hbWUgbWFwcGluZy4gVGhlcmUgYXJlIHR3byB2YWxpZAogKiAgICAgb3B0aW9uczogJ0JZX1BBUlQnLCBhbmQgJ0JZX1dIT0xFJy4KICogQHNlZSBnb29nLmdldENzc05hbWUgZm9yIGEgZGVzY3JpcHRpb24uCiAqLwpnb29nLnNldENzc05hbWVNYXBwaW5nID0gZnVuY3Rpb24obWFwcGluZywgb3B0X3N0eWxlKSB7CiAgZ29vZy5jc3NOYW1lTWFwcGluZ18gPSBtYXBwaW5nOwogIGdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV8gPSBvcHRfc3R5bGU7Cn07CgoKLyoqCiAqIFRvIHVzZSBDU1MgcmVuYW1pbmcgaW4gY29tcGlsZWQgbW9kZSwgb25lIG9mIHRoZSBpbnB1dCBmaWxlcyBzaG91bGQgaGF2ZSBhCiAqIGNhbGwgdG8gZ29vZy5zZXRDc3NOYW1lTWFwcGluZygpIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwgdGhhdCB0aGUgSlNDb21waWxlcgogKiBjYW4gZXh0cmFjdCBhbmQgdXNlIHRvIHJlcGxhY2UgYWxsIGNhbGxzIHRvIGdvb2cuZ2V0Q3NzTmFtZSgpLiBJbiB1bmNvbXBpbGVkCiAqIG1vZGUsIEphdmFTY3JpcHQgY29kZSBzaG91bGQgYmUgbG9hZGVkIGJlZm9yZSB0aGlzIGJhc2UuanMgZmlsZSB0aGF0IGRlY2xhcmVzCiAqIGEgZ2xvYmFsIHZhcmlhYmxlLCBDTE9TVVJFX0NTU19OQU1FX01BUFBJTkcsIHdoaWNoIGlzIHVzZWQgYmVsb3cuIFRoaXMgaXMKICogdG8gZW5zdXJlIHRoYXQgdGhlIG1hcHBpbmcgaXMgbG9hZGVkIGJlZm9yZSBhbnkgY2FsbHMgdG8gZ29vZy5nZXRDc3NOYW1lKCkKICogYXJlIG1hZGUgaW4gdW5jb21waWxlZCBtb2RlLgogKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIENTUyBuYW1lIG1hcHBpbmcuCiAqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPnx1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUFBJTkc7CgoKaWYgKCFDT01QSUxFRCAmJiBnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUFBJTkcpIHsKICAvLyBUaGlzIGRvZXMgbm90IGNhbGwgZ29vZy5zZXRDc3NOYW1lTWFwcGluZygpIGJlY2F1c2UgdGhlIEpTQ29tcGlsZXIKICAvLyByZXF1aXJlcyB0aGF0IGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcoKSBiZSBjYWxsZWQgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4KICBnb29nLmNzc05hbWVNYXBwaW5nXyA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQUElORzsKfQoKCi8qKgogKiBHZXRzIGEgbG9jYWxpemVkIG1lc3NhZ2UuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgYSBjb21waWxlciBwcmltaXRpdmUuIElmIHlvdSBnaXZlIHRoZSBjb21waWxlciBhIGxvY2FsaXplZAogKiBtZXNzYWdlIGJ1bmRsZSwgaXQgd2lsbCByZXBsYWNlIHRoZSBzdHJpbmcgYXQgY29tcGlsZS10aW1lIHdpdGggYSBsb2NhbGl6ZWQKICogdmVyc2lvbiwgYW5kIGV4cGFuZCBnb29nLmdldE1zZyBjYWxsIHRvIGEgY29uY2F0ZW5hdGVkIHN0cmluZy4KICoKICogTWVzc2FnZXMgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgZm9ybToKICogPGNvZGU+CiAqIHZhciBNU0dfTkFNRSA9IGdvb2cuZ2V0TXNnKCdIZWxsbyB7JHBsYWNlaG9sZGVyfScsIHsncGxhY2Vob2xkZXInOiAnd29ybGQnfSk7CiAqIDwvY29kZT4KICoKICogVGhpcyBmdW5jdGlvbiBwcm9kdWNlcyBhIHN0cmluZyB3aGljaCBzaG91bGQgYmUgdHJlYXRlZCBhcyBwbGFpbiB0ZXh0LiBVc2UKICoge0BsaW5rIGdvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlcn0gaW4gY29uanVuY3Rpb24gd2l0aCBnb29nLmdldE1zZyB0bwogKiBwcm9kdWNlIFNhZmVIdG1sLgogKgogKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRyYW5zbGF0YWJsZSBzdHJpbmcsIHBsYWNlcyBob2xkZXJzIGluIHRoZSBmb3JtIHskZm9vfS4KICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+PX0gb3B0X3ZhbHVlcyBNYXBzIHBsYWNlIGhvbGRlciBuYW1lIHRvIHZhbHVlLgogKiBAcGFyYW0ge3todG1sOiBib29sZWFufT19IG9wdF9vcHRpb25zIE9wdGlvbnM6CiAqICAgICBodG1sOiBFc2NhcGUgJzwnIGluIHN0ciB0byAnJmx0OycuIFVzZWQgYnkgQ2xvc3VyZSBUZW1wbGF0ZXMgd2hlcmUgdGhlCiAqICAgICBnZW5lcmF0ZWQgY29kZSBzaXplIGFuZCBwZXJmb3JtYW5jZSBpcyBjcml0aWNhbCB3aGljaCBpcyB3aHkge0BsaW5rCiAqICAgICBnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXJ9IGlzIG5vdCB1c2VkLiBUaGUgdmFsdWUgbXVzdCBiZSBsaXRlcmFsIHRydWUKICogICAgIG9yIGZhbHNlLgogKiBAcmV0dXJuIHtzdHJpbmd9IG1lc3NhZ2Ugd2l0aCBwbGFjZWhvbGRlcnMgZmlsbGVkLgogKi8KZ29vZy5nZXRNc2cgPSBmdW5jdGlvbihzdHIsIG9wdF92YWx1ZXMsIG9wdF9vcHRpb25zKSB7CiAgaWYgKG9wdF9vcHRpb25zICYmIG9wdF9vcHRpb25zLmh0bWwpIHsKICAgIC8vIE5vdGUgdGhhdCAnJicgaXMgbm90IHJlcGxhY2VkIGJlY2F1c2UgdGhlIHRyYW5zbGF0aW9uIGNhbiBjb250YWluIEhUTUwKICAgIC8vIGVudGl0aWVzLgogICAgc3RyID0gc3RyLnJlcGxhY2UoLzwvZywgJyZsdDsnKTsKICB9CiAgaWYgKG9wdF92YWx1ZXMpIHsKICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9ce1wkKFtefV0rKX0vZywgZnVuY3Rpb24obWF0Y2gsIGtleSkgewogICAgICByZXR1cm4gKG9wdF92YWx1ZXMgIT0gbnVsbCAmJiBrZXkgaW4gb3B0X3ZhbHVlcykgPyBvcHRfdmFsdWVzW2tleV0gOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDsKICAgIH0pOwogIH0KICByZXR1cm4gc3RyOwp9OwoKCi8qKgogKiBHZXRzIGEgbG9jYWxpemVkIG1lc3NhZ2UuIElmIHRoZSBtZXNzYWdlIGRvZXMgbm90IGhhdmUgYSB0cmFuc2xhdGlvbiwgZ2l2ZXMgYQogKiBmYWxsYmFjayBtZXNzYWdlLgogKgogKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGludHJvZHVjaW5nIGEgbmV3IG1lc3NhZ2UgdGhhdCBoYXMgbm90IHlldCBiZWVuCiAqIHRyYW5zbGF0ZWQgaW50byBhbGwgbGFuZ3VhZ2VzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGlsZXIgcHJpbWl0aXZlLiBNdXN0IGJlIHVzZWQgaW4gdGhlIGZvcm06CiAqIDxjb2RlPnZhciB4ID0gZ29vZy5nZXRNc2dXaXRoRmFsbGJhY2soTVNHX0EsIE1TR19CKTs8L2NvZGU+CiAqIHdoZXJlIE1TR19BIGFuZCBNU0dfQiB3ZXJlIGluaXRpYWxpemVkIHdpdGggZ29vZy5nZXRNc2cuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBhIFRoZSBwcmVmZXJyZWQgbWVzc2FnZS4KICogQHBhcmFtIHtzdHJpbmd9IGIgVGhlIGZhbGxiYWNrIG1lc3NhZ2UuCiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGJlc3QgdHJhbnNsYXRlZCBtZXNzYWdlLgogKi8KZ29vZy5nZXRNc2dXaXRoRmFsbGJhY2sgPSBmdW5jdGlvbihhLCBiKSB7CiAgcmV0dXJuIGE7Cn07CgoKLyoqCiAqIEV4cG9zZXMgYW4gdW5vYmZ1c2NhdGVkIGdsb2JhbCBuYW1lc3BhY2UgcGF0aCBmb3IgdGhlIGdpdmVuIG9iamVjdC4KICogTm90ZSB0aGF0IGZpZWxkcyBvZiB0aGUgZXhwb3J0ZWQgb2JqZWN0ICp3aWxsKiBiZSBvYmZ1c2NhdGVkLCB1bmxlc3MgdGhleSBhcmUKICogZXhwb3J0ZWQgaW4gdHVybiB2aWEgdGhpcyBmdW5jdGlvbiBvciBnb29nLmV4cG9ydFByb3BlcnR5LgogKgogKiBBbHNvIGhhbmR5IGZvciBtYWtpbmcgcHVibGljIGl0ZW1zIHRoYXQgYXJlIGRlZmluZWQgaW4gYW5vbnltb3VzIGNsb3N1cmVzLgogKgogKiBleC4gZ29vZy5leHBvcnRTeW1ib2woJ3B1YmxpYy5wYXRoLkZvbycsIEZvbyk7CiAqCiAqIGV4LiBnb29nLmV4cG9ydFN5bWJvbCgncHVibGljLnBhdGguRm9vLnN0YXRpY0Z1bmN0aW9uJywgRm9vLnN0YXRpY0Z1bmN0aW9uKTsKICogICAgIHB1YmxpYy5wYXRoLkZvby5zdGF0aWNGdW5jdGlvbigpOwogKgogKiBleC4gZ29vZy5leHBvcnRTeW1ib2woJ3B1YmxpYy5wYXRoLkZvby5wcm90b3R5cGUubXlNZXRob2QnLAogKiAgICAgICAgICAgICAgICAgICAgICAgRm9vLnByb3RvdHlwZS5teU1ldGhvZCk7CiAqICAgICBuZXcgcHVibGljLnBhdGguRm9vKCkubXlNZXRob2QoKTsKICoKICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY1BhdGggVW5vYmZ1c2NhdGVkIG5hbWUgdG8gZXhwb3J0LgogKiBAcGFyYW0geyp9IG9iamVjdCBPYmplY3QgdGhlIG5hbWUgc2hvdWxkIHBvaW50IHRvLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmplY3RUb0V4cG9ydFRvIFRoZSBvYmplY3QgdG8gYWRkIHRoZSBwYXRoIHRvOyBkZWZhdWx0CiAqICAgICBpcyBnb29nLmdsb2JhbC4KICovCmdvb2cuZXhwb3J0U3ltYm9sID0gZnVuY3Rpb24ocHVibGljUGF0aCwgb2JqZWN0LCBvcHRfb2JqZWN0VG9FeHBvcnRUbykgewogIGdvb2cuZXhwb3J0UGF0aF8ocHVibGljUGF0aCwgb2JqZWN0LCBvcHRfb2JqZWN0VG9FeHBvcnRUbyk7Cn07CgoKLyoqCiAqIEV4cG9ydHMgYSBwcm9wZXJ0eSB1bm9iZnVzY2F0ZWQgaW50byB0aGUgb2JqZWN0J3MgbmFtZXNwYWNlLgogKiBleC4gZ29vZy5leHBvcnRQcm9wZXJ0eShGb28sICdzdGF0aWNGdW5jdGlvbicsIEZvby5zdGF0aWNGdW5jdGlvbik7CiAqIGV4LiBnb29nLmV4cG9ydFByb3BlcnR5KEZvby5wcm90b3R5cGUsICdteU1ldGhvZCcsIEZvby5wcm90b3R5cGUubXlNZXRob2QpOwogKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IE9iamVjdCB3aG9zZSBzdGF0aWMgcHJvcGVydHkgaXMgYmVpbmcgZXhwb3J0ZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNOYW1lIFVub2JmdXNjYXRlZCBuYW1lIHRvIGV4cG9ydC4KICogQHBhcmFtIHsqfSBzeW1ib2wgT2JqZWN0IHRoZSBuYW1lIHNob3VsZCBwb2ludCB0by4KICovCmdvb2cuZXhwb3J0UHJvcGVydHkgPSBmdW5jdGlvbihvYmplY3QsIHB1YmxpY05hbWUsIHN5bWJvbCkgewogIG9iamVjdFtwdWJsaWNOYW1lXSA9IHN5bWJvbDsKfTsKCgovKioKICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLgogKgogKiBVc2FnZToKICogPHByZT4KICogZnVuY3Rpb24gUGFyZW50Q2xhc3MoYSwgYikgeyB9CiAqIFBhcmVudENsYXNzLnByb3RvdHlwZS5mb28gPSBmdW5jdGlvbihhKSB7IH07CiAqCiAqIGZ1bmN0aW9uIENoaWxkQ2xhc3MoYSwgYiwgYykgewogKiAgIENoaWxkQ2xhc3MuYmFzZSh0aGlzLCAnY29uc3RydWN0b3InLCBhLCBiKTsKICogfQogKiBnb29nLmluaGVyaXRzKENoaWxkQ2xhc3MsIFBhcmVudENsYXNzKTsKICoKICogdmFyIGNoaWxkID0gbmV3IENoaWxkQ2xhc3MoJ2EnLCAnYicsICdzZWUnKTsKICogY2hpbGQuZm9vKCk7IC8vIFRoaXMgd29ya3MuCiAqIDwvcHJlPgogKgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY2hpbGRDdG9yIENoaWxkIGNsYXNzLgogKiBAcGFyYW0geyFGdW5jdGlvbn0gcGFyZW50Q3RvciBQYXJlbnQgY2xhc3MuCiAqIEBzdXBwcmVzcyB7c3RyaWN0TWlzc2luZ1Byb3BlcnRpZXN9IHN1cGVyQ2xhc3NfIGFuZCBiYXNlIGlzIG5vdCBkZWZpbmVkIG9uCiAqICAgIEZ1bmN0aW9uLgogKi8KZ29vZy5pbmhlcml0cyA9IGZ1bmN0aW9uKGNoaWxkQ3RvciwgcGFyZW50Q3RvcikgewogIC8qKiBAY29uc3RydWN0b3IgKi8KICBmdW5jdGlvbiB0ZW1wQ3RvcigpIHt9CiAgdGVtcEN0b3IucHJvdG90eXBlID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnN1cGVyQ2xhc3NfID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOwogIC8qKiBAb3ZlcnJpZGUgKi8KICBjaGlsZEN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY2hpbGRDdG9yOwoKICAvKioKICAgKiBDYWxscyBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yL21ldGhvZC4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHVzZSBnb29nLmluaGVyaXRzIHRvCiAgICogZXhwcmVzcyBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gY2xhc3Nlcy4KICAgKgogICAqIE5PVEU6IFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgZ29vZy5iYXNlIGFuZCBmb3Igc3VwZXJDbGFzc18KICAgKiBwcm9wZXJ0eSBkZWZpbmVkIGluIGNoaWxkQ3Rvci4KICAgKgogICAqIEBwYXJhbSB7IU9iamVjdH0gbWUgU2hvdWxkIGFsd2F5cyBiZSAidGhpcyIuCiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIGNhbGwuIENhbGxpbmcKICAgKiAgICAgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciBjYW4gYmUgZG9uZSB3aXRoIHRoZSBzcGVjaWFsIHN0cmluZwogICAqICAgICAnY29uc3RydWN0b3InLgogICAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHN1cGVyY2xhc3MKICAgKiAgICAgbWV0aG9kL2NvbnN0cnVjdG9yLgogICAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kL2NvbnN0cnVjdG9yLgogICAqLwogIGNoaWxkQ3Rvci5iYXNlID0gZnVuY3Rpb24obWUsIG1ldGhvZE5hbWUsIHZhcl9hcmdzKSB7CiAgICAvLyBDb3B5aW5nIHVzaW5nIGxvb3AgdG8gYXZvaWQgZGVvcCBkdWUgdG8gcGFzc2luZyBhcmd1bWVudHMgb2JqZWN0IHRvCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAyKTsKICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGFyZ3NbaSAtIDJdID0gYXJndW1lbnRzW2ldOwogICAgfQogICAgcmV0dXJuIHBhcmVudEN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdLmFwcGx5KG1lLCBhcmdzKTsKICB9Owp9OwoKCi8qKgogKiBDYWxsIHVwIHRvIHRoZSBzdXBlcmNsYXNzLgogKgogKiBJZiB0aGlzIGlzIGNhbGxlZCBmcm9tIGEgY29uc3RydWN0b3IsIHRoZW4gdGhpcyBjYWxscyB0aGUgc3VwZXJjbGFzcwogKiBjb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50cyAxLU4uCiAqCiAqIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYSBwcm90b3R5cGUgbWV0aG9kLCB0aGVuIHlvdSBtdXN0IHBhc3MgdGhlIG5hbWUgb2YgdGhlCiAqIG1ldGhvZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24uIElmIHlvdSBkbyBub3QsIHlvdSB3aWxsIGdldCBhCiAqIHJ1bnRpbWUgZXJyb3IuIFRoaXMgY2FsbHMgdGhlIHN1cGVyY2xhc3MnIG1ldGhvZCB3aXRoIGFyZ3VtZW50cyAyLU4uCiAqCiAqIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBpZiB5b3UgdXNlIGdvb2cuaW5oZXJpdHMgdG8gZXhwcmVzcyBpbmhlcml0YW5jZQogKiByZWxhdGlvbnNoaXBzIGJldHdlZW4geW91ciBjbGFzc2VzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGlsZXIgcHJpbWl0aXZlLiBBdCBjb21waWxlLXRpbWUsIHRoZSBjb21waWxlciB3aWxsIGRvCiAqIG1hY3JvIGV4cGFuc2lvbiB0byByZW1vdmUgYSBsb3Qgb2YgdGhlIGV4dHJhIG92ZXJoZWFkIHRoYXQgdGhpcyBmdW5jdGlvbgogKiBpbnRyb2R1Y2VzLiBUaGUgY29tcGlsZXIgd2lsbCBhbHNvIGVuZm9yY2UgYSBsb3Qgb2YgdGhlIGFzc3VtcHRpb25zIHRoYXQgdGhpcwogKiBmdW5jdGlvbiBtYWtlcywgYW5kIHRyZWF0IGl0IGFzIGEgY29tcGlsZXIgZXJyb3IgaWYgeW91IGJyZWFrIHRoZW0uCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gbWUgU2hvdWxkIGFsd2F5cyBiZSAidGhpcyIuCiAqIEBwYXJhbSB7Kj19IG9wdF9tZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSBpZiBjYWxsaW5nIGEgc3VwZXIgbWV0aG9kLgogKiBAcGFyYW0gey4uLip9IHZhcl9hcmdzIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMuCiAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kLgogKiBAc3VwcHJlc3Mge2VzNVN0cmljdH0gVGhpcyBtZXRob2QgY2FuIG5vdCBiZSB1c2VkIGluIHN0cmljdCBtb2RlLCBidXQKICogICAgIGFsbCBDbG9zdXJlIExpYnJhcnkgY29uc3VtZXJzIG11c3QgZGVwZW5kIG9uIHRoaXMgZmlsZS4KICogQGRlcHJlY2F0ZWQgZ29vZy5iYXNlIGlzIG5vdCBzdHJpY3QgbW9kZSBjb21wYXRpYmxlLiAgUHJlZmVyIHRoZSBzdGF0aWMKICogICAgICJiYXNlIiBtZXRob2QgYWRkZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGJ5IGdvb2cuaW5oZXJpdHMKICogICAgIG9yIEVTNiBjbGFzc2VzIGFuZCB0aGUgInN1cGVyIiBrZXl3b3JkLgogKi8KZ29vZy5iYXNlID0gZnVuY3Rpb24obWUsIG9wdF9tZXRob2ROYW1lLCB2YXJfYXJncykgewogIHZhciBjYWxsZXIgPSBhcmd1bWVudHMuY2FsbGVlLmNhbGxlcjsKCiAgaWYgKGdvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRSB8fCAoZ29vZy5ERUJVRyAmJiAhY2FsbGVyKSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdhcmd1bWVudHMuY2FsbGVyIG5vdCBkZWZpbmVkLiAgZ29vZy5iYXNlKCkgY2Fubm90IGJlIHVzZWQgJyArCiAgICAgICAgJ3dpdGggc3RyaWN0IG1vZGUgY29kZS4gU2VlICcgKwogICAgICAgICdodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtQycpOwogIH0KCiAgaWYgKHR5cGVvZiBjYWxsZXIuc3VwZXJDbGFzc18gIT09ICd1bmRlZmluZWQnKSB7CiAgICAvLyBDb3B5aW5nIHVzaW5nIGxvb3AgdG8gYXZvaWQgZGVvcCBkdWUgdG8gcGFzc2luZyBhcmd1bWVudHMgb2JqZWN0IHRvCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICAgIHZhciBjdG9yQXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBjdG9yQXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07CiAgICB9CiAgICAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IuIENhbGwgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAgICByZXR1cm4gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovIChjYWxsZXIuc3VwZXJDbGFzc18pCiAgICAgICAgLmNvbnN0cnVjdG9yLmFwcGx5KG1lLCBjdG9yQXJncyk7CiAgfQoKICBpZiAodHlwZW9mIG9wdF9tZXRob2ROYW1lICE9ICdzdHJpbmcnICYmIHR5cGVvZiBvcHRfbWV0aG9kTmFtZSAhPSAnc3ltYm9sJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdtZXRob2QgbmFtZXMgcHJvdmlkZWQgdG8gZ29vZy5iYXNlIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wnKTsKICB9CgogIC8vIENvcHlpbmcgdXNpbmcgbG9vcCB0byBhdm9pZCBkZW9wIGR1ZSB0byBwYXNzaW5nIGFyZ3VtZW50cyBvYmplY3QgdG8KICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMik7CiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgIGFyZ3NbaSAtIDJdID0gYXJndW1lbnRzW2ldOwogIH0KICB2YXIgZm91bmRDYWxsZXIgPSBmYWxzZTsKICBmb3IgKHZhciBwcm90byA9IG1lLmNvbnN0cnVjdG9yLnByb3RvdHlwZTsgcHJvdG87CiAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykpIHsKICAgIGlmIChwcm90b1tvcHRfbWV0aG9kTmFtZV0gPT09IGNhbGxlcikgewogICAgICBmb3VuZENhbGxlciA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGZvdW5kQ2FsbGVyKSB7CiAgICAgIHJldHVybiBwcm90b1tvcHRfbWV0aG9kTmFtZV0uYXBwbHkobWUsIGFyZ3MpOwogICAgfQogIH0KCiAgLy8gSWYgd2UgZGlkIG5vdCBmaW5kIHRoZSBjYWxsZXIgaW4gdGhlIHByb3RvdHlwZSBjaGFpbiwgdGhlbiBvbmUgb2YgdHdvCiAgLy8gdGhpbmdzIGhhcHBlbmVkOgogIC8vIDEpIFRoZSBjYWxsZXIgaXMgYW4gaW5zdGFuY2UgbWV0aG9kLgogIC8vIDIpIFRoaXMgbWV0aG9kIHdhcyBub3QgY2FsbGVkIGJ5IHRoZSByaWdodCBjYWxsZXIuCiAgaWYgKG1lW29wdF9tZXRob2ROYW1lXSA9PT0gY2FsbGVyKSB7CiAgICByZXR1cm4gbWUuY29uc3RydWN0b3IucHJvdG90eXBlW29wdF9tZXRob2ROYW1lXS5hcHBseShtZSwgYXJncyk7CiAgfSBlbHNlIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAnZ29vZy5iYXNlIGNhbGxlZCBmcm9tIGEgbWV0aG9kIG9mIG9uZSBuYW1lICcgKwogICAgICAgICd0byBhIG1ldGhvZCBvZiBhIGRpZmZlcmVudCBuYW1lJyk7CiAgfQp9OwoKCi8qKgogKiBBbGxvdyBmb3IgYWxpYXNpbmcgd2l0aGluIHNjb3BlIGZ1bmN0aW9ucy4gIFRoaXMgZnVuY3Rpb24gZXhpc3RzIGZvcgogKiB1bmNvbXBpbGVkIGNvZGUgLSBpbiBjb21waWxlZCBjb2RlIHRoZSBjYWxscyB3aWxsIGJlIGlubGluZWQgYW5kIHRoZSBhbGlhc2VzCiAqIGFwcGxpZWQuICBJbiB1bmNvbXBpbGVkIGNvZGUgdGhlIGZ1bmN0aW9uIGlzIHNpbXBseSBydW4gc2luY2UgdGhlIGFsaWFzZXMgYXMKICogd3JpdHRlbiBhcmUgdmFsaWQgSmF2YVNjcmlwdC4KICoKICoKICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBGdW5jdGlvbiB0byBjYWxsLiAgVGhpcyBmdW5jdGlvbiBjYW4gY29udGFpbiBhbGlhc2VzCiAqICAgICB0byBuYW1lc3BhY2VzIChlLmcuICJ2YXIgZG9tID0gZ29vZy5kb20iKSBvciBjbGFzc2VzCiAqICAgICAoZS5nLiAidmFyIFRpbWVyID0gZ29vZy5UaW1lciIpLgogKi8KZ29vZy5zY29wZSA9IGZ1bmN0aW9uKGZuKSB7CiAgaWYgKGdvb2cuaXNJbk1vZHVsZUxvYWRlcl8oKSkgewogICAgdGhyb3cgbmV3IEVycm9yKCdnb29nLnNjb3BlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aGluIGEgbW9kdWxlLicpOwogIH0KICBmbi5jYWxsKGdvb2cuZ2xvYmFsKTsKfTsKCgovKgogKiBUbyBzdXBwb3J0IHVuY29tcGlsZWQsIHN0cmljdCBtb2RlIGJ1bmRsZXMgdGhhdCB1c2UgZXZhbCB0byBkaXZpZGUgc291cmNlCiAqIGxpa2Ugc286CiAqICAgIGV2YWwoJ3NvbWVTb3VyY2U7Ly8jIHNvdXJjZVVybCBzb3VyY2VmaWxlLmpzJyk7CiAqIFdlIG5lZWQgdG8gZXhwb3J0IHRoZSBnbG9iYWxseSBkZWZpbmVkIHN5bWJvbHMgImdvb2ciIGFuZCAiQ09NUElMRUQiLgogKiBFeHBvcnRpbmcgImdvb2ciIGJyZWFrcyB0aGUgY29tcGlsZXIgb3B0aW1pemF0aW9ucywgc28gd2UgcmVxdWlyZWQgdGhhdAogKiBiZSBkZWZpbmVkIGV4dGVybmFsbHkuCiAqIE5PVEU6IFdlIGRvbid0IHVzZSBnb29nLmV4cG9ydFN5bWJvbCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyCiAqIGV4dGVybiBnZW5lcmF0aW9uIHdoZW4gdGhhdCBjb21waWxlciBvcHRpb24gaXMgZW5hYmxlZC4KICovCmlmICghQ09NUElMRUQpIHsKICBnb29nLmdsb2JhbFsnQ09NUElMRUQnXSA9IENPTVBJTEVEOwp9CgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gZ29vZy5kZWZpbmVDbGFzcyBpbXBsZW1lbnRhdGlvbgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCi8qKgogKiBDcmVhdGVzIGEgcmVzdHJpY3RlZCBmb3JtIG9mIGEgQ2xvc3VyZSAiY2xhc3MiOgogKiAgIC0gZnJvbSB0aGUgY29tcGlsZXIncyBwZXJzcGVjdGl2ZSwgdGhlIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhlCiAqICAgICBjb25zdHJ1Y3RvciBpcyBzZWFsZWQgKG5vIG5ldyBwcm9wZXJ0aWVzIG1heSBiZSBhZGRlZCkuICBUaGlzIGVuYWJsZXMKICogICAgIGJldHRlciBjaGVja3MuCiAqICAgLSB0aGUgY29tcGlsZXIgd2lsbCByZXdyaXRlIHRoaXMgZGVmaW5pdGlvbiB0byBhIGZvcm0gdGhhdCBpcyBvcHRpbWFsCiAqICAgICBmb3IgdHlwZSBjaGVja2luZyBhbmQgb3B0aW1pemF0aW9uIChpbml0aWFsbHkgdGhpcyB3aWxsIGJlIGEgbW9yZQogKiAgICAgdHJhZGl0aW9uYWwgZm9ybSkuCiAqCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ2xhc3MgVGhlIHN1cGVyY2xhc3MsIE9iamVjdCBvciBudWxsLgogKiBAcGFyYW0ge2dvb2cuZGVmaW5lQ2xhc3MuQ2xhc3NEZXNjcmlwdG9yfSBkZWYKICogICAgIEFuIG9iamVjdCBsaXRlcmFsIGRlc2NyaWJpbmcKICogICAgIHRoZSBjbGFzcy4gIEl0IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICogICAgICJjb25zdHJ1Y3RvciI6IHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogKiAgICAgInN0YXRpY3MiOiBhbiBvYmplY3QgbGl0ZXJhbCBjb250YWluaW5nIG1ldGhvZHMgdG8gYWRkIHRvIHRoZSBjb25zdHJ1Y3RvcgogKiAgICAgICAgYXMgInN0YXRpYyIgbWV0aG9kcyBvciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBjb25zdHJ1Y3RvcgogKiAgICAgICAgZnVuY3Rpb24gYXMgaXRzIG9ubHkgcGFyYW1ldGVyIHRvIHdoaWNoIHN0YXRpYyBwcm9wZXJ0aWVzIGNhbgogKiAgICAgICAgYmUgYWRkZWQuCiAqICAgICBhbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIHByb3RvdHlwZS4KICogQHJldHVybiB7IUZ1bmN0aW9ufSBUaGUgY2xhc3MgY29uc3RydWN0b3IuCiAqIEBkZXByZWNhdGVkIFVzZSBFUzYgY2xhc3Mgc3ludGF4IGluc3RlYWQuCiAqLwpnb29nLmRlZmluZUNsYXNzID0gZnVuY3Rpb24oc3VwZXJDbGFzcywgZGVmKSB7CiAgLy8gVE9ETyhqb2hubGVueik6IGNvbnNpZGVyIG1ha2luZyB0aGUgc3VwZXJDbGFzcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgdmFyIGNvbnN0cnVjdG9yID0gZGVmLmNvbnN0cnVjdG9yOwogIHZhciBzdGF0aWNzID0gZGVmLnN0YXRpY3M7CiAgLy8gV3JhcCB0aGUgY29uc3RydWN0b3IgcHJpb3IgdG8gc2V0dGluZyB1cCB0aGUgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcy4KICBpZiAoIWNvbnN0cnVjdG9yIHx8IGNvbnN0cnVjdG9yID09IE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IpIHsKICAgIGNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdjYW5ub3QgaW5zdGFudGlhdGUgYW4gaW50ZXJmYWNlIChubyBjb25zdHJ1Y3RvciBkZWZpbmVkKS4nKTsKICAgIH07CiAgfQoKICB2YXIgY2xzID0gZ29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfKGNvbnN0cnVjdG9yLCBzdXBlckNsYXNzKTsKICBpZiAoc3VwZXJDbGFzcykgewogICAgZ29vZy5pbmhlcml0cyhjbHMsIHN1cGVyQ2xhc3MpOwogIH0KCiAgLy8gUmVtb3ZlIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBub3QgYmUgY29waWVkIHRvIHRoZSBwcm90b3R5cGUuCiAgZGVsZXRlIGRlZi5jb25zdHJ1Y3RvcjsKICBkZWxldGUgZGVmLnN0YXRpY3M7CgogIGdvb2cuZGVmaW5lQ2xhc3MuYXBwbHlQcm9wZXJ0aWVzXyhjbHMucHJvdG90eXBlLCBkZWYpOwogIGlmIChzdGF0aWNzICE9IG51bGwpIHsKICAgIGlmIChzdGF0aWNzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKICAgICAgc3RhdGljcyhjbHMpOwogICAgfSBlbHNlIHsKICAgICAgZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfKGNscywgc3RhdGljcyk7CiAgICB9CiAgfQoKICByZXR1cm4gY2xzOwp9OwoKCi8qKgogKiBAdHlwZWRlZiB7ewogKiAgIGNvbnN0cnVjdG9yOiAoIUZ1bmN0aW9ufHVuZGVmaW5lZCksCiAqICAgc3RhdGljczogKE9iamVjdHx1bmRlZmluZWR8ZnVuY3Rpb24oRnVuY3Rpb24pOnZvaWQpCiAqIH19CiAqLwpnb29nLmRlZmluZUNsYXNzLkNsYXNzRGVzY3JpcHRvcjsKCgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gV2hldGhlciB0aGUgaW5zdGFuY2VzIHJldHVybmVkIGJ5IGdvb2cuZGVmaW5lQ2xhc3Mgc2hvdWxkCiAqICAgICBiZSBzZWFsZWQgd2hlbiBwb3NzaWJsZS4KICoKICogV2hlbiBzZWFsaW5nIGlzIGRpc2FibGVkIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aWxsIG5vdCBiZSB3cmFwcGVkIGJ5CiAqIGdvb2cuZGVmaW5lQ2xhc3MsIG1ha2luZyBpdCBpbmNvbXBhdGlibGUgd2l0aCBFUzYgY2xhc3MgbWV0aG9kcy4KICovCmdvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMgPQogICAgZ29vZy5kZWZpbmUoJ2dvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMnLCBnb29nLkRFQlVHKTsKCgovKioKICogSWYgZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUyBpcyBlbmFibGVkIGFuZCBPYmplY3Quc2VhbCBpcwogKiBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgd3JhcCB0aGUgY29uc3RydWN0b3IgaW4gYSBmdW5jdGlvbiB0aGF0IHNlYWxzIHRoZQogKiByZXN1bHRzIG9mIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KICoKICogQHBhcmFtIHshRnVuY3Rpb259IGN0ciBUaGUgY29uc3RydWN0b3Igd2hvc2UgcmVzdWx0cyBtYXliZSBiZSBzZWFsZWQuCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ2xhc3MgVGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gVGhlIHJlcGxhY2VtZW50IGNvbnN0cnVjdG9yLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfID0gZnVuY3Rpb24oY3RyLCBzdXBlckNsYXNzKSB7CiAgaWYgKCFnb29nLmRlZmluZUNsYXNzLlNFQUxfQ0xBU1NfSU5TVEFOQ0VTKSB7CiAgICAvLyBEbyBub3cgd3JhcCB0aGUgY29uc3RydWN0b3Igd2hlbiBzZWFsaW5nIGlzIGRpc2FibGVkLiBBbmd1bGFyIGNvZGUKICAgIC8vIGRlcGVuZHMgb24gdGhpcyBmb3IgaW5qZWN0aW9uIHRvIHdvcmsgcHJvcGVybHkuCiAgICByZXR1cm4gY3RyOwogIH0KCiAgLy8gQ29tcHV0ZSB3aGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBzZWFsYWJsZSBhdCBkZWZpbml0aW9uIHRpbWUsIHJhdGhlcgogIC8vIHRoYW4gd2hlbiB0aGUgaW5zdGFuY2UgaXMgYmVpbmcgY29uc3RydWN0ZWQuCiAgdmFyIHN1cGVyY2xhc3NTZWFsYWJsZSA9ICFnb29nLmRlZmluZUNsYXNzLmlzVW5zZWFsYWJsZV8oc3VwZXJDbGFzcyk7CgogIC8qKgogICAqIEB0aGlzIHtPYmplY3R9CiAgICogQHJldHVybiB7P30KICAgKi8KICB2YXIgd3JhcHBlZEN0ciA9IGZ1bmN0aW9uKCkgewogICAgLy8gRG9uJ3Qgc2VhbCBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIHdoZW4gaXQgY2FsbHMgdGhlIGNvbnN0cnVjdG9yIG9mCiAgICAvLyBpdHMgc3VwZXIgY2xhc3MgYXMgdGhlcmUgaXMgbW9zdCBsaWtlbHkgc3RpbGwgc2V0dXAgdG8gZG8uCiAgICB2YXIgaW5zdGFuY2UgPSBjdHIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgaW5zdGFuY2VbZ29vZy5VSURfUFJPUEVSVFlfXSA9IGluc3RhbmNlW2dvb2cuVUlEX1BST1BFUlRZX107CgogICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IHdyYXBwZWRDdHIgJiYgc3VwZXJjbGFzc1NlYWxhYmxlICYmCiAgICAgICAgT2JqZWN0LnNlYWwgaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICBPYmplY3Quc2VhbChpbnN0YW5jZSk7CiAgICB9CiAgICByZXR1cm4gaW5zdGFuY2U7CiAgfTsKCiAgcmV0dXJuIHdyYXBwZWRDdHI7Cn07CgoKLyoqCiAqIEBwYXJhbSB7RnVuY3Rpb259IGN0ciBUaGUgY29uc3RydWN0b3IgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgY29uc3RydWN0b3IgaGFzIGJlZW4gdGFnZ2VkIGFzIHVuc2VhbGFibGUKICogICAgIHVzaW5nIGdvb2cudGFnVW5zZWFsYWJsZUNsYXNzLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5pc1Vuc2VhbGFibGVfID0gZnVuY3Rpb24oY3RyKSB7CiAgcmV0dXJuIGN0ciAmJiBjdHIucHJvdG90eXBlICYmCiAgICAgIGN0ci5wcm90b3R5cGVbZ29vZy5VTlNFQUxBQkxFX0NPTlNUUlVDVE9SX1BST1BFUlRZX107Cn07CgoKLy8gVE9ETyhqb2hubGVueik6IHNoYXJlIHRoZXNlIHZhbHVlcyB3aXRoIHRoZSBnb29nLm9iamVjdAovKioKICogVGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgdGhhdCBhcmUgZGVmaW5lZCBvbiBPYmplY3QucHJvdG90eXBlLgogKiBAdHlwZSB7IUFycmF5PHN0cmluZz59CiAqIEBwcml2YXRlCiAqIEBjb25zdAogKi8KZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18gPSBbCiAgJ2NvbnN0cnVjdG9yJywgJ2hhc093blByb3BlcnR5JywgJ2lzUHJvdG90eXBlT2YnLCAncHJvcGVydHlJc0VudW1lcmFibGUnLAogICd0b0xvY2FsZVN0cmluZycsICd0b1N0cmluZycsICd2YWx1ZU9mJwpdOwoKCi8vIFRPRE8oam9obmxlbnopOiBzaGFyZSB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGdvb2cub2JqZWN0Ci8qKgogKiBAcGFyYW0geyFPYmplY3R9IHRhcmdldCBUaGUgb2JqZWN0IHRvIGFkZCBwcm9wZXJ0aWVzIHRvLgogKiBAcGFyYW0geyFPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsKICAvLyBUT0RPKGpvaG5sZW56KTogdXBkYXRlIHRoaXMgdG8gc3VwcG9ydCBFUzUgZ2V0dGVycy9zZXR0ZXJzCgogIHZhciBrZXk7CiAgZm9yIChrZXkgaW4gc291cmNlKSB7CiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgewogICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOwogICAgfQogIH0KCiAgLy8gRm9yIElFIHRoZSBmb3ItaW4tbG9vcCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdAogIC8vIGVudW1lcmFibGUgb24gdGhlIHByb3RvdHlwZSBvYmplY3QgKGZvciBleGFtcGxlIGlzUHJvdG90eXBlT2YgZnJvbQogIC8vIE9iamVjdC5wcm90b3R5cGUpIGFuZCBpdCB3aWxsIGFsc28gbm90IGluY2x1ZGUgJ3JlcGxhY2UnIG9uIG9iamVjdHMgdGhhdAogIC8vIGV4dGVuZCBTdHJpbmcgYW5kIGNoYW5nZSAncmVwbGFjZScgKG5vdCB0aGF0IGl0IGlzIGNvbW1vbiBmb3IgYW55b25lIHRvCiAgLy8gZXh0ZW5kIGFueXRoaW5nIGV4Y2VwdCBPYmplY3QpLgogIGZvciAodmFyIGkgPSAwOyBpIDwgZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18ubGVuZ3RoOyBpKyspIHsKICAgIGtleSA9IGdvb2cuZGVmaW5lQ2xhc3MuT0JKRUNUX1BST1RPVFlQRV9GSUVMRFNfW2ldOwogICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsKICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsKICAgIH0KICB9Cn07CgoKLyoqCiAqIFNlYWxpbmcgY2xhc3NlcyBicmVha3MgdGhlIG9sZGVyIGlkaW9tIG9mIGFzc2lnbmluZyBwcm9wZXJ0aWVzIG9uIHRoZQogKiBwcm90b3R5cGUgcmF0aGVyIHRoYW4gaW4gdGhlIGNvbnN0cnVjdG9yLiBBcyBzdWNoLCBnb29nLmRlZmluZUNsYXNzCiAqIG11c3Qgbm90IHNlYWwgc3ViY2xhc3NlcyBvZiB0aGVzZSBvbGQtc3R5bGUgY2xhc3NlcyB1bnRpbCB0aGV5IGFyZSBmaXhlZC4KICogVW50aWwgdGhlbiwgdGhpcyBtYXJrcyBhIGNsYXNzIGFzICJicm9rZW4iLCBpbnN0cnVjdGluZyBkZWZpbmVDbGFzcwogKiBub3QgdG8gc2VhbCBzdWJjbGFzc2VzLgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY3RyIFRoZSBsZWdhY3kgY29uc3RydWN0b3IgdG8gdGFnIGFzIHVuc2VhbGFibGUuCiAqLwpnb29nLnRhZ1Vuc2VhbGFibGVDbGFzcyA9IGZ1bmN0aW9uKGN0cikgewogIGlmICghQ09NUElMRUQgJiYgZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUykgewogICAgY3RyLnByb3RvdHlwZVtnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfXSA9IHRydWU7CiAgfQp9OwoKCi8qKgogKiBOYW1lIGZvciB1bnNlYWxhYmxlIHRhZyBwcm9wZXJ0eS4KICogQGNvbnN0IEBwcml2YXRlIHtzdHJpbmd9CiAqLwpnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfID0gJ2dvb2dfZGVmaW5lQ2xhc3NfbGVnYWN5X3Vuc2VhbGFibGUnOwoKCi8vIFRoZXJlJ3MgYSBidWcgaW4gdGhlIGNvbXBpbGVyIHdoZXJlIHdpdGhvdXQgY29sbGFwc2UgcHJvcGVydGllcyB0aGUKLy8gQ2xvc3VyZSBuYW1lc3BhY2UgZGVmaW5lcyBkbyBub3QgZ3VhcmQgY29kZSBjb3JyZWN0bHkuIFRvIGhlbHAgcmVkdWNlIGNvZGUKLy8gc2l6ZSBhbHNvIGNoZWNrIGZvciAhQ09NUElMRUQgZXZlbiB0aG91Z2ggaXQgcmVkdW5kYW50IHVudGlsIHRoaXMgaXMgZml4ZWQuCmlmICghQ09NUElMRUQgJiYgZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCkgewoKICAvKioKICAgKiBUcmllcyB0byBkZXRlY3Qgd2hldGhlciBpcyBpbiB0aGUgY29udGV4dCBvZiBhbiBIVE1MIGRvY3VtZW50LgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgbG9va3MgbGlrZSBIVE1MIGRvY3VtZW50LgogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5pbkh0bWxEb2N1bWVudF8gPSBmdW5jdGlvbigpIHsKICAgIC8qKiBAdHlwZSB7IURvY3VtZW50fSAqLwogICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50OwogICAgcmV0dXJuIGRvYyAhPSBudWxsICYmICd3cml0ZScgaW4gZG9jOyAgLy8gWFVMRG9jdW1lbnQgbWlzc2VzIHdyaXRlLgogIH07CgoKICAvKioKICAgKiBXZSdkIGxpa2UgdG8gY2hlY2sgZm9yIGlmIHRoZSBkb2N1bWVudCByZWFkeVN0YXRlIGlzICdsb2FkaW5nJzsgaG93ZXZlcgogICAqIHRoZXJlIGFyZSBidWdzIG9uIElFIDEwIGFuZCBiZWxvdyB3aGVyZSB0aGUgcmVhZHlTdGF0ZSBiZWluZyBhbnl0aGluZyBvdGhlcgogICAqIHRoYW4gJ2NvbXBsZXRlJyBpcyBub3QgcmVsaWFibGUuCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuaXNEb2N1bWVudExvYWRpbmdfID0gZnVuY3Rpb24oKSB7CiAgICAvLyBhdHRhY2hFdmVudCBpcyBhdmFpbGFibGUgb24gSUUgNiB0aHJ1IDEwIG9ubHksIGFuZCB0aHVzIGNhbiBiZSB1c2VkIHRvCiAgICAvLyBkZXRlY3QgdGhvc2UgYnJvd3NlcnMuCiAgICAvKiogQHR5cGUgeyFIVE1MRG9jdW1lbnR9ICovCiAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CiAgICByZXR1cm4gZG9jLmF0dGFjaEV2ZW50ID8gZG9jLnJlYWR5U3RhdGUgIT0gJ2NvbXBsZXRlJyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLnJlYWR5U3RhdGUgPT0gJ2xvYWRpbmcnOwogIH07CgoKICAvKioKICAgKiBUcmllcyB0byBkZXRlY3QgdGhlIGJhc2UgcGF0aCBvZiBiYXNlLmpzIHNjcmlwdCB0aGF0IGJvb3RzdHJhcHMgQ2xvc3VyZS4KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuZmluZEJhc2VQYXRoXyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIICE9IHVuZGVmaW5lZCAmJgogICAgICAgIC8vIEFudGkgRE9NLWNsb2JiZXJpbmcgcnVudGltZSBjaGVjayAoYi8zNzczNjU3NikuCiAgICAgICAgdHlwZW9mIGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIID09PSAnc3RyaW5nJykgewogICAgICBnb29nLmJhc2VQYXRoID0gZ29vZy5nbG9iYWwuQ0xPU1VSRV9CQVNFX1BBVEg7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoIWdvb2cuaW5IdG1sRG9jdW1lbnRfKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLyoqIEB0eXBlIHshRG9jdW1lbnR9ICovCiAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CiAgICAvLyBJZiB3ZSBoYXZlIGEgY3VycmVudFNjcmlwdCBhdmFpbGFibGUsIHVzZSBpdCBleGNsdXNpdmVseS4KICAgIHZhciBjdXJyZW50U2NyaXB0ID0gZG9jLmN1cnJlbnRTY3JpcHQ7CiAgICBpZiAoY3VycmVudFNjcmlwdCkgewogICAgICB2YXIgc2NyaXB0cyA9IFtjdXJyZW50U2NyaXB0XTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBzY3JpcHRzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdTQ1JJUFQnKTsKICAgIH0KICAgIC8vIFNlYXJjaCBiYWNrd2FyZHMgc2luY2UgdGhlIGN1cnJlbnQgc2NyaXB0IGlzIGluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIG9uZQogICAgLy8gdGhhdCBoYXMgYmFzZS5qcy4KICAgIGZvciAodmFyIGkgPSBzY3JpcHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHZhciBzY3JpcHQgPSAvKiogQHR5cGUgeyFIVE1MU2NyaXB0RWxlbWVudH0gKi8gKHNjcmlwdHNbaV0pOwogICAgICB2YXIgc3JjID0gc2NyaXB0LnNyYzsKICAgICAgdmFyIHFtYXJrID0gc3JjLmxhc3RJbmRleE9mKCc/Jyk7CiAgICAgIHZhciBsID0gcW1hcmsgPT0gLTEgPyBzcmMubGVuZ3RoIDogcW1hcms7CiAgICAgIGlmIChzcmMuc3Vic3RyKGwgLSA3LCA3KSA9PSAnYmFzZS5qcycpIHsKICAgICAgICBnb29nLmJhc2VQYXRoID0gc3JjLnN1YnN0cigwLCBsIC0gNyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfTsKCiAgZ29vZy5maW5kQmFzZVBhdGhfKCk7CgogIC8qKiBAc3RydWN0IEBjb25zdHJ1Y3RvciBAZmluYWwgKi8KICBnb29nLlRyYW5zcGlsZXIgPSBmdW5jdGlvbigpIHsKICAgIC8qKiBAcHJpdmF0ZSB7P09iamVjdDxzdHJpbmcsIGJvb2xlYW4+fSAqLwogICAgdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fID0gbnVsbDsKICAgIC8qKiBAcHJpdmF0ZSB7c3RyaW5nfSAqLwogICAgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0XyA9IGdvb2cuVFJBTlNQSUxFX1RPX0xBTkdVQUdFOwogIH07CgoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBtYXAgZnJvbSBsYW5ndWFnZSBtb2RlIHN0cmluZyB0byBhIGJvb2xlYW4KICAgKiBpbmRpY2F0aW5nIHdoZXRoZXIgdHJhbnNwaWxhdGlvbiBzaG91bGQgYmUgZG9uZSBmb3IgdGhhdCBtb2RlIGFzIHdlbGwgYXMKICAgKiB0aGUgaGlnaGVzdCBsZXZlbCBsYW5ndWFnZSB0aGF0IHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMuCiAgICoKICAgKiBHdWFyYW50ZWVkIGludmFyaWFudDoKICAgKiBGb3IgYW55IHR3byBtb2RlcywgbDEgYW5kIGwyIHdoZXJlIGwyIGlzIGEgbmV3ZXIgbW9kZSB0aGFuIGwxLAogICAqIGBtYXBbbDFdID09IHRydWVgIGltcGxpZXMgdGhhdCBgbWFwW2wyXSA9PSB0cnVlYC4KICAgKgogICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgZXh0cmFjdGVkIGFuZCB1c2VkIGVsc2V3aGVyZSwgc28gaXQgY2Fubm90IHJlbHkgb24KICAgKiBhbnl0aGluZyBleHRlcm5hbCAoaXQgc2hvdWxkIGVhc2lseSBiZSBhYmxlIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gYQogICAqIHN0YW5kYWxvbmUsIHRvcCBsZXZlbCBmdW5jdGlvbikuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEByZXR1cm4ge3sKICAgKiAgIHRhcmdldDogc3RyaW5nLAogICAqICAgbWFwOiAhT2JqZWN0PHN0cmluZywgYm9vbGVhbj4KICAgKiB9fQogICAqLwogIGdvb2cuVHJhbnNwaWxlci5wcm90b3R5cGUuY3JlYXRlUmVxdWlyZXNUcmFuc3BpbGF0aW9uXyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHRyYW5zcGlsYXRpb25UYXJnZXQgPSAnZXMzJzsKICAgIHZhciAvKiogIU9iamVjdDxzdHJpbmcsIGJvb2xlYW4+ICovIHJlcXVpcmVzVHJhbnNwaWxhdGlvbiA9IHsnZXMzJzogZmFsc2V9OwogICAgdmFyIHRyYW5zcGlsYXRpb25SZXF1aXJlZEZvckFsbExhdGVyTW9kZXMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEFkZHMgYW4gZW50cnkgdG8gcmVxdWlyZXNUcmFuc3BsaWF0aW9uIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbW9kZS4KICAgICAqCiAgICAgKiBJTVBPUlRBTlQ6IENhbGxzIG11c3QgYmUgbWFkZSBpbiBvcmRlciBmcm9tIG9sZGVzdCB0byBuZXdlc3QgbGFuZ3VhZ2UKICAgICAqIG1vZGUuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZU5hbWUKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogYm9vbGVhbn0gaXNTdXBwb3J0ZWQgUmV0dXJucyB0cnVlIGlmIHRoZSBKUyBlbmdpbmUKICAgICAqICAgICBzdXBwb3J0cyB0aGUgZ2l2ZW4gbW9kZS4KICAgICAqLwogICAgZnVuY3Rpb24gYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjayhtb2RlTmFtZSwgaXNTdXBwb3J0ZWQpIHsKICAgICAgaWYgKHRyYW5zcGlsYXRpb25SZXF1aXJlZEZvckFsbExhdGVyTW9kZXMpIHsKICAgICAgICByZXF1aXJlc1RyYW5zcGlsYXRpb25bbW9kZU5hbWVdID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChpc1N1cHBvcnRlZCgpKSB7CiAgICAgICAgdHJhbnNwaWxhdGlvblRhcmdldCA9IG1vZGVOYW1lOwogICAgICAgIHJlcXVpcmVzVHJhbnNwaWxhdGlvblttb2RlTmFtZV0gPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXF1aXJlc1RyYW5zcGlsYXRpb25bbW9kZU5hbWVdID0gdHJ1ZTsKICAgICAgICB0cmFuc3BpbGF0aW9uUmVxdWlyZWRGb3JBbGxMYXRlck1vZGVzID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRG9lcyB0aGUgZ2l2ZW4gY29kZSBldmFsdWF0ZSB3aXRob3V0IHN5bnRheCBlcnJvcnMgYW5kIHJldHVybiBhIHRydXRoeQogICAgICogcmVzdWx0PwogICAgICovCiAgICBmdW5jdGlvbiAvKiogYm9vbGVhbiAqLyBldmFsQ2hlY2soLyoqIHN0cmluZyAqLyBjb2RlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuICEhZXZhbChjb2RlKTsKICAgICAgfSBjYXRjaCAoaWdub3JlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHZhciB1c2VyQWdlbnQgPSBnb29nLmdsb2JhbC5uYXZpZ2F0b3IgJiYgZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudCA/CiAgICAgICAgZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudCA6CiAgICAgICAgJyc7CgogICAgLy8gSWRlbnRpZnkgRVMzLW9ubHkgYnJvd3NlcnMgYnkgdGhlaXIgaW5jb3JyZWN0IHRyZWF0bWVudCBvZiBjb21tYXMuCiAgICBhZGROZXdlckxhbmd1YWdlVHJhbnNwaWxhdGlvbkNoZWNrKCdlczUnLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGV2YWxDaGVjaygnWzEsXS5sZW5ndGg9PTEnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM2JywgZnVuY3Rpb24oKSB7CiAgICAgIC8vIEVkZ2UgaGFzIGEgbm9uLWRldGVybWluaXN0aWMgKGkuZS4sIG5vdCByZXByb2R1Y2libGUpIGJ1ZyB3aXRoIEVTNjoKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9DaGFrcmFDb3JlL2lzc3Vlcy8xNDk2LgogICAgICB2YXIgcmUgPSAvRWRnZVwvKFxkKykoXC5cZCkqL2k7CiAgICAgIHZhciBlZGdlVXNlckFnZW50ID0gdXNlckFnZW50Lm1hdGNoKHJlKTsKICAgICAgaWYgKGVkZ2VVc2VyQWdlbnQpIHsKICAgICAgICAvLyBUaGUgUmVmbGVjdC5jb25zdHJ1Y3QgdGVzdCBiZWxvdyBpcyBmbGFreSBvbiBFZGdlLiBJdCBjYW4gc29tZXRpbWVzCiAgICAgICAgLy8gcGFzcyBvciBmYWlsIG9uIDQwIDE1LjE1MDYzLCBzbyBqdXN0IGV4aXQgZWFybHkgZm9yIEVkZ2UgYW5kIHRyZWF0CiAgICAgICAgLy8gaXQgYXMgRVM1LiBVbnRpbCB3ZSdyZSBvbiBhIG1vcmUgdXAgdG8gZGF0ZSB2ZXJzaW9uIGp1c3QgYWx3YXlzIHVzZQogICAgICAgIC8vIEVTNS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvQ2hha3JhQ29yZS9pc3N1ZXMvMzIxNy4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLy8gVGVzdCBlczY6IFtGRjUwICg/KSwgRWRnZSAxNCAoPyksIENocm9tZSA1MF0KICAgICAgLy8gICAoYSkgZGVmYXVsdCBwYXJhbXMgKHNwZWNpZmljYWxseSBzaGFkb3dpbmcgbG9jYWxzKSwKICAgICAgLy8gICAoYikgZGVzdHJ1Y3R1cmluZywgKGMpIGJsb2NrLXNjb3BlZCBmdW5jdGlvbnMsCiAgICAgIC8vICAgKGQpIGZvci1vZiAoY29uc3QpLCAoZSkgbmV3LnRhcmdldC9SZWZsZWN0LmNvbnN0cnVjdAogICAgICB2YXIgZXM2ZnVsbFRlc3QgPQogICAgICAgICAgJ2NsYXNzIFh7Y29uc3RydWN0b3IoKXtpZihuZXcudGFyZ2V0IT1TdHJpbmcpdGhyb3cgMTt0aGlzLng9NDJ9fScgKwogICAgICAgICAgJ2xldCBxPVJlZmxlY3QuY29uc3RydWN0KFgsW10sU3RyaW5nKTtpZihxLnghPTQyfHwhKHEgaW5zdGFuY2VvZiAnICsKICAgICAgICAgICdTdHJpbmcpKXRocm93IDE7Zm9yKGNvbnN0IGEgb2ZbMiwzXSl7aWYoYT09Miljb250aW51ZTtmdW5jdGlvbiAnICsKICAgICAgICAgICdmKHo9e2F9KXtsZXQgYT0wO3JldHVybiB6LmF9e2Z1bmN0aW9uIGYoKXtyZXR1cm4gMDt9fXJldHVybiBmKCknICsKICAgICAgICAgICc9PTN9JzsKCiAgICAgIHJldHVybiBldmFsQ2hlY2soJygoKT0+eyJ1c2Ugc3RyaWN0IjsnICsgZXM2ZnVsbFRlc3QgKyAnfSkoKScpOwogICAgfSk7CiAgICAvLyAqKiBhbmQgKio9IGFyZSB0aGUgb25seSBuZXcgZmVhdHVyZXMgaW4gJ2VzNycKICAgIGFkZE5ld2VyTGFuZ3VhZ2VUcmFuc3BpbGF0aW9uQ2hlY2soJ2VzNycsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXZhbENoZWNrKCcyICoqIDIgPT0gNCcpOwogICAgfSk7CiAgICAvLyBhc3luYyBmdW5jdGlvbnMgYXJlIHRoZSBvbmx5IG5ldyBmZWF0dXJlcyBpbiAnZXM4JwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM4JywgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBldmFsQ2hlY2soJ2FzeW5jICgpID0+IDEsIHRydWUnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM5JywgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBldmFsQ2hlY2soJyh7Li4ucmVzdH0gPSB7fSksIHRydWUnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXNfbmV4dCcsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZmFsc2U7ICAvLyBhc3N1bWUgaXQgYWx3YXlzIG5lZWQgdG8gdHJhbnNwaWxlCiAgICB9KTsKICAgIHJldHVybiB7dGFyZ2V0OiB0cmFuc3BpbGF0aW9uVGFyZ2V0LCBtYXA6IHJlcXVpcmVzVHJhbnNwaWxhdGlvbn07CiAgfTsKCgogIC8qKgogICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbmVlZHMgdG8gYmUgdHJhbnNwaWxlZC4KICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZwogICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gbW9kdWxlCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKi8KICBnb29nLlRyYW5zcGlsZXIucHJvdG90eXBlLm5lZWRzVHJhbnNwaWxlID0gZnVuY3Rpb24obGFuZywgbW9kdWxlKSB7CiAgICBpZiAoZ29vZy5UUkFOU1BJTEUgPT0gJ2Fsd2F5cycpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKGdvb2cuVFJBTlNQSUxFID09ICduZXZlcicpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmICghdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fKSB7CiAgICAgIHZhciBvYmogPSB0aGlzLmNyZWF0ZVJlcXVpcmVzVHJhbnNwaWxhdGlvbl8oKTsKICAgICAgdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fID0gb2JqLm1hcDsKICAgICAgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0XyA9IHRoaXMudHJhbnNwaWxhdGlvblRhcmdldF8gfHwgb2JqLnRhcmdldDsKICAgIH0KICAgIGlmIChsYW5nIGluIHRoaXMucmVxdWlyZXNUcmFuc3BpbGF0aW9uXykgewogICAgICBpZiAodGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fW2xhbmddKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICBnb29nLmluSHRtbERvY3VtZW50XygpICYmIG1vZHVsZSA9PSAnZXM2JyAmJgogICAgICAgICAgISgnbm9Nb2R1bGUnIGluIGdvb2cuZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxhbmd1YWdlIG1vZGU6ICcgKyBsYW5nKTsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogTGF6aWx5IHJldHJpZXZlcyB0aGUgdHJhbnNwaWxlciBhbmQgYXBwbGllcyBpdCB0byB0aGUgc291cmNlLgogICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIEpTIGNvZGUuCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0byB0aGUgY29kZS4KICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0cmFuc3BpbGVkIGNvZGUuCiAgICovCiAgZ29vZy5UcmFuc3BpbGVyLnByb3RvdHlwZS50cmFuc3BpbGUgPSBmdW5jdGlvbihjb2RlLCBwYXRoKSB7CiAgICAvLyBUT0RPKGpvaG5wbGFpc3RlZCk6IFdlIHNob3VsZCBkZWxldGUgZ29vZy50cmFuc3BpbGVfIGFuZCBqdXN0IGhhdmUgdGhpcwogICAgLy8gZnVuY3Rpb24uIEJ1dCB0aGVyZSdzIHNvbWUgY29tcGlsZSBlcnJvciBhdG0gd2hlcmUgZ29vZy5nbG9iYWwgaXMgYmVpbmcKICAgIC8vIHN0cmlwcGVkIGluY29ycmVjdGx5IHdpdGhvdXQgdGhpcy4KICAgIHJldHVybiBnb29nLnRyYW5zcGlsZV8oY29kZSwgcGF0aCwgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0Xyk7CiAgfTsKCgogIC8qKiBAcHJpdmF0ZSBAZmluYWwgeyFnb29nLlRyYW5zcGlsZXJ9ICovCiAgZ29vZy50cmFuc3BpbGVyXyA9IG5ldyBnb29nLlRyYW5zcGlsZXIoKTsKCiAgLyoqCiAgICogUmV3cml0ZXMgY2xvc2luZyBzY3JpcHQgdGFncyBpbiBpbnB1dCB0byBhdm9pZCBlbmRpbmcgYW4gZW5jbG9zaW5nIHNjcmlwdAogICAqIHRhZy4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLnByb3RlY3RTY3JpcHRUYWdfID0gZnVuY3Rpb24oc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLzxcLyhTQ1JJUFQpL2lnLCAnXFx4M2MvJDEnKTsKICB9OwoKCiAgLyoqCiAgICogQSBkZWJ1ZyBsb2FkZXIgaXMgcmVzcG9uc2libGUgZm9yIGRvd25sb2FkaW5nIGFuZCBleGVjdXRpbmcgamF2YXNjcmlwdAogICAqIGZpbGVzIGluIGFuIHVuYnVuZGxlZCwgdW5jb21waWxlZCBlbnZpcm9ubWVudC4KICAgKgogICAqIFRoaXMgY2FuIGJlIGN1c3RpbWl6ZWQgdmlhIHRoZSBzZXREZXBlbmRlbmN5RmFjdG9yeSBtZXRob2QsIG9yIGJ5CiAgICogQ0xPU1VSRV9JTVBPUlRfU0NSSVBUL0NMT1NVUkVfTE9BRF9GSUxFX1NZTkMuCiAgICoKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvciBAZmluYWwgQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXyA9IGZ1bmN0aW9uKCkgewogICAgLyoqIEBwcml2YXRlIEBjb25zdCB7IU9iamVjdDxzdHJpbmcsICFnb29nLkRlcGVuZGVuY3k+fSAqLwogICAgdGhpcy5kZXBlbmRlbmNpZXNfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gKi8KICAgIHRoaXMuaWRUb1BhdGhfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgYm9vbGVhbj59ICovCiAgICB0aGlzLndyaXR0ZW5fID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshQXJyYXk8IWdvb2cuRGVwZW5kZW5jeT59ICovCiAgICB0aGlzLmxvYWRpbmdEZXBzXyA9IFtdOwogICAgLyoqIEBwcml2YXRlIHshQXJyYXk8IWdvb2cuRGVwZW5kZW5jeT59ICovCiAgICB0aGlzLmRlcHNUb0xvYWRfID0gW107CiAgICAvKiogQHByaXZhdGUge2Jvb2xlYW59ICovCiAgICB0aGlzLnBhdXNlZF8gPSBmYWxzZTsKICAgIC8qKiBAcHJpdmF0ZSB7IWdvb2cuRGVwZW5kZW5jeUZhY3Rvcnl9ICovCiAgICB0aGlzLmZhY3RvcnlfID0gbmV3IGdvb2cuRGVwZW5kZW5jeUZhY3RvcnkoZ29vZy50cmFuc3BpbGVyXyk7CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPn0gKi8KICAgIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshQXJyYXk8c3RyaW5nPn0gKi8KICAgIHRoaXMuZGVmZXJyZWRRdWV1ZV8gPSBbXTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBuYW1lc3BhY2VzCiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiB1bmRlZmluZWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGNhbGwgb25jZSBhbGwgdGhlCiAgICogICAgIG5hbWVzcGFjZXMgaGF2ZSBsb2FkZWQuCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmJvb3RzdHJhcCA9IGZ1bmN0aW9uKG5hbWVzcGFjZXMsIGNhbGxiYWNrKSB7CiAgICB2YXIgY2IgPSBjYWxsYmFjazsKICAgIGZ1bmN0aW9uIHJlc29sdmUoKSB7CiAgICAgIGlmIChjYikgewogICAgICAgIGdvb2cuZ2xvYmFsLnNldFRpbWVvdXQoY2IsIDApOwogICAgICAgIGNiID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGlmICghbmFtZXNwYWNlcy5sZW5ndGgpIHsKICAgICAgcmVzb2x2ZSgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGRlcHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21EZXBzXyhuYW1lc3BhY2VzW2ldKTsKICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnJlZ29uaXplZCBuYW1lc3BhY2U6ICcgKyBuYW1lc3BhY2VzW2ldKTsKICAgICAgfQogICAgICBkZXBzLnB1c2godGhpcy5kZXBlbmRlbmNpZXNfW3BhdGhdKTsKICAgIH0KCiAgICB2YXIgcmVxdWlyZSA9IGdvb2cucmVxdWlyZTsKICAgIHZhciBsb2FkZWQgPSAwOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlcXVpcmUobmFtZXNwYWNlc1tpXSk7CiAgICAgIGRlcHNbaV0ub25Mb2FkKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICgrK2xvYWRlZCA9PSBuYW1lc3BhY2VzLmxlbmd0aCkgewogICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIExvYWRzIHRoZSBDbG9zdXJlIERlcGVuZGVuY3kgZmlsZS4KICAgKgogICAqIEV4cG9zZWQgYSBwdWJsaWMgZnVuY3Rpb24gc28gQ0xPU1VSRV9OT19ERVBTIGNhbiBiZSBzZXQgdG8gZmFsc2UsIGJhc2UKICAgKiBsb2FkZWQsIHNldERlcGVuZGVuY3lGYWN0b3J5IGNhbGxlZCwgYW5kIHRoZW4gdGhpcyBjYWxsZWQuIGkuZS4gYWxsb3dzCiAgICogY3VzdG9tIGxvYWRpbmcgb2YgdGhlIGRlcHMgZmlsZS4KICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZENsb3N1cmVEZXBzID0gZnVuY3Rpb24oKSB7CiAgICAvLyBDaXJjdW12ZW50IGFkZERlcGVuZGVuY3ksIHdoaWNoIHdvdWxkIHRyeSB0byB0cmFuc3BpbGUgZGVwcy5qcyBpZgogICAgLy8gdHJhbnNwaWxlIGlzIHNldCB0byBhbHdheXMuCiAgICB2YXIgcmVsUGF0aCA9ICdkZXBzLmpzJzsKICAgIHRoaXMuZGVwc1RvTG9hZF8ucHVzaCh0aGlzLmZhY3RvcnlfLmNyZWF0ZURlcGVuZGVuY3koCiAgICAgICAgZ29vZy5ub3JtYWxpemVQYXRoXyhnb29nLmJhc2VQYXRoICsgcmVsUGF0aCksIHJlbFBhdGgsIFtdLCBbXSwge30sCiAgICAgICAgZmFsc2UpKTsKICAgIHRoaXMubG9hZERlcHNfKCk7CiAgfTsKCgogIC8qKgogICAqIE5vdGlmaWVzIHRoZSBkZWJ1ZyBsb2FkZXIgd2hlbiBhIGRlcGVuZGVuY3kgaGFzIGJlZW4gcmVxdWVzdGVkLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGFic1BhdGhPcklkIFBhdGggb2YgdGhlIGRlcGVuZGVuY3kgb3IgZ29vZyBpZC4KICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfZm9yY2UKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUucmVxdWVzdGVkID0gZnVuY3Rpb24oYWJzUGF0aE9ySWQsIG9wdF9mb3JjZSkgewogICAgdmFyIHBhdGggPSB0aGlzLmdldFBhdGhGcm9tRGVwc18oYWJzUGF0aE9ySWQpOwogICAgaWYgKHBhdGggJiYKICAgICAgICAob3B0X2ZvcmNlIHx8IHRoaXMuYXJlRGVwc0xvYWRlZF8odGhpcy5kZXBlbmRlbmNpZXNfW3BhdGhdLnJlcXVpcmVzKSkpIHsKICAgICAgdmFyIGNhbGxiYWNrID0gdGhpcy5kZWZlcnJlZENhbGxiYWNrc19bcGF0aF07CiAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgIGRlbGV0ZSB0aGlzLmRlZmVycmVkQ2FsbGJhY2tzX1twYXRoXTsKICAgICAgICBjYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgfTsKCgogIC8qKgogICAqIFNldHMgdGhlIGRlcGVuZGVuY3kgZmFjdG9yeSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGN1c3RvbQogICAqIGdvb2cuRGVwZW5kZW5jeSBpbXBsZW1lbnRhdGlvbnMgdG8gY29udHJvbCBob3cgZGVwZW5kZW5jaWVzIGFyZSBsb2FkZWQuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3lGYWN0b3J5fSBmYWN0b3J5CiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnNldERlcGVuZGVuY3lGYWN0b3J5ID0gZnVuY3Rpb24oZmFjdG9yeSkgewogICAgdGhpcy5mYWN0b3J5XyA9IGZhY3Rvcnk7CiAgfTsKCgogIC8qKgogICAqIFRyYXZzZXJzZXMgdGhlIGRlcGVuZGVuY3kgZ3JhcGggYW5kIHF1ZXVlcyB0aGUgZ2l2ZW4gZGVwZW5kZW5jeSwgYW5kIGFsbCBvZgogICAqIGl0cyB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcywgZm9yIGxvYWRpbmcgYW5kIHRoZW4gc3RhcnRzIGxvYWRpbmcgaWYgbm90CiAgICogcGF1c2VkLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRfID0gZnVuY3Rpb24obmFtZXNwYWNlKSB7CiAgICBpZiAoIXRoaXMuZ2V0UGF0aEZyb21EZXBzXyhuYW1lc3BhY2UpKSB7CiAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSAnZ29vZy5yZXF1aXJlIGNvdWxkIG5vdCBmaW5kOiAnICsgbmFtZXNwYWNlOwoKICAgICAgZ29vZy5sb2dUb0NvbnNvbGVfKGVycm9yTWVzc2FnZSk7CiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7CiAgICB9IGVsc2UgewogICAgICB2YXIgbG9hZGVyID0gdGhpczsKCiAgICAgIHZhciBkZXBzID0gW107CgogICAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAqLwogICAgICB2YXIgdmlzaXQgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAgICAgICB2YXIgcGF0aCA9IGxvYWRlci5nZXRQYXRoRnJvbURlcHNfKG5hbWVzcGFjZSk7CgogICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgZGVwZW5kZW5jeSBwYXRoIG9yIHN5bWJvbDogJyArIG5hbWVzcGFjZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobG9hZGVyLndyaXR0ZW5fW3BhdGhdKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBsb2FkZXIud3JpdHRlbl9bcGF0aF0gPSB0cnVlOwoKICAgICAgICB2YXIgZGVwID0gbG9hZGVyLmRlcGVuZGVuY2llc19bcGF0aF07CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXAucmVxdWlyZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmICghZ29vZy5pc1Byb3ZpZGVkXyhkZXAucmVxdWlyZXNbaV0pKSB7CiAgICAgICAgICAgIHZpc2l0KGRlcC5yZXF1aXJlc1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBkZXBzLnB1c2goZGVwKTsKICAgICAgfTsKCiAgICAgIHZpc2l0KG5hbWVzcGFjZSk7CgogICAgICB2YXIgd2FzTG9hZGluZyA9ICEhdGhpcy5kZXBzVG9Mb2FkXy5sZW5ndGg7CiAgICAgIHRoaXMuZGVwc1RvTG9hZF8gPSB0aGlzLmRlcHNUb0xvYWRfLmNvbmNhdChkZXBzKTsKCiAgICAgIGlmICghdGhpcy5wYXVzZWRfICYmICF3YXNMb2FkaW5nKSB7CiAgICAgICAgdGhpcy5sb2FkRGVwc18oKTsKICAgICAgfQogICAgfQogIH07CgoKICAvKioKICAgKiBMb2FkcyBhbnkgcXVldWVkIGRlcGVuZGVuY2llcyB1bnRpbCB0aGV5IGFyZSBhbGwgbG9hZGVkIG9yIHBhdXNlZC4KICAgKgogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWREZXBzXyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxvYWRlciA9IHRoaXM7CiAgICB2YXIgcGF1c2VkID0gdGhpcy5wYXVzZWRfOwoKICAgIHdoaWxlICh0aGlzLmRlcHNUb0xvYWRfLmxlbmd0aCAmJiAhcGF1c2VkKSB7CiAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbG9hZENhbGxEb25lID0gZmFsc2U7CiAgICAgICAgdmFyIGRlcCA9IGxvYWRlci5kZXBzVG9Mb2FkXy5zaGlmdCgpOwoKICAgICAgICB2YXIgbG9hZGVkID0gZmFsc2U7CiAgICAgICAgbG9hZGVyLmxvYWRpbmdfKGRlcCk7CgogICAgICAgIHZhciBjb250cm9sbGVyID0gewogICAgICAgICAgcGF1c2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobG9hZENhbGxEb25lKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBwYXVzZSBhZnRlciB0aGUgY2FsbCB0byBsb2FkLicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBhdXNlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICByZXN1bWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobG9hZENhbGxEb25lKSB7CiAgICAgICAgICAgICAgbG9hZGVyLnJlc3VtZV8oKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBTb21lIGRlcCBjYWxsZWQgcGF1c2UgYW5kIHRoZW4gcmVzdW1lIGluIHRoZSBzYW1lIGxvYWQgY2FsbC4KICAgICAgICAgICAgICAvLyBKdXN0IGtlZXAgcnVubmluZyB0aGlzIHNhbWUgbG9vcC4KICAgICAgICAgICAgICBwYXVzZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGxvYWRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChsb2FkZWQpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvdWJsZSBjYWxsIHRvIGxvYWRlZC4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgbG9hZGVyLmxvYWRlZF8oZGVwKTsKICAgICAgICAgIH0sCiAgICAgICAgICBwZW5kaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gRGVmZW5zaXZlIGNvcHkuCiAgICAgICAgICAgIHZhciBwZW5kaW5nID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9hZGVyLmxvYWRpbmdEZXBzXy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHBlbmRpbmcucHVzaChsb2FkZXIubG9hZGluZ0RlcHNfW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGVuZGluZzsKICAgICAgICAgIH0sCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBwYXJhbSB7Z29vZy5Nb2R1bGVUeXBlfSB0eXBlCiAgICAgICAgICAgKi8KICAgICAgICAgIHNldE1vZHVsZVN0YXRlOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gewogICAgICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJycsCiAgICAgICAgICAgICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICAgIH0sCiAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgc3RyaW5nLCBzdHJpbmc9KX0gKi8KICAgICAgICAgIHJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0czogZnVuY3Rpb24oCiAgICAgICAgICAgICAgcGF0aCwgZXhwb3J0cywgb3B0X2Nsb3N1cmVOYW1lc3BhY2UpIHsKICAgICAgICAgICAgaWYgKG9wdF9jbG9zdXJlTmFtZXNwYWNlKSB7CiAgICAgICAgICAgICAgZ29vZy5sb2FkZWRNb2R1bGVzX1tvcHRfY2xvc3VyZU5hbWVzcGFjZV0gPSB7CiAgICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICAgICAgdHlwZTogZ29vZy5Nb2R1bGVUeXBlLkVTNiwKICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBvcHRfY2xvc3VyZU5hbWVzcGFjZSB8fCAnJwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgPyl9ICovCiAgICAgICAgICByZWdpc3Rlckdvb2dNb2R1bGVFeHBvcnRzOiBmdW5jdGlvbihtb2R1bGVJZCwgZXhwb3J0cykgewogICAgICAgICAgICBnb29nLmxvYWRlZE1vZHVsZXNfW21vZHVsZUlkXSA9IHsKICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICAgIHR5cGU6IGdvb2cuTW9kdWxlVHlwZS5HT09HLAogICAgICAgICAgICAgIG1vZHVsZUlkOiBtb2R1bGVJZAogICAgICAgICAgICB9OwogICAgICAgICAgfSwKICAgICAgICAgIGNsZWFyTW9kdWxlU3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG51bGw7CiAgICAgICAgICB9LAogICAgICAgICAgZGVmZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmIChsb2FkQ2FsbERvbmUpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICAgICAgICdDYW5ub3QgcmVnaXN0ZXIgd2l0aCBkZWZlciBhZnRlciB0aGUgY2FsbCB0byBsb2FkLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvYWRlci5kZWZlcl8oZGVwLCBjYWxsYmFjayk7CiAgICAgICAgICB9LAogICAgICAgICAgYXJlRGVwc0xvYWRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBsb2FkZXIuYXJlRGVwc0xvYWRlZF8oZGVwLnJlcXVpcmVzKTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICB0cnkgewogICAgICAgICAgZGVwLmxvYWQoY29udHJvbGxlcik7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGxvYWRDYWxsRG9uZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9KSgpOwogICAgfQoKICAgIGlmIChwYXVzZWQpIHsKICAgICAgdGhpcy5wYXVzZV8oKTsKICAgIH0KICB9OwoKCiAgLyoqIEBwcml2YXRlICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnBhdXNlXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wYXVzZWRfID0gdHJ1ZTsKICB9OwoKCiAgLyoqIEBwcml2YXRlICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnJlc3VtZV8gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnBhdXNlZF8pIHsKICAgICAgdGhpcy5wYXVzZWRfID0gZmFsc2U7CiAgICAgIHRoaXMubG9hZERlcHNfKCk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIE1hcmtzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGFzIGxvYWRpbmcgKGxvYWQgaGFzIGJlZW4gY2FsbGVkIGJ1dCBpdCBoYXMgbm90CiAgICogeWV0IG1hcmtlZCBpdHNlbGYgYXMgZmluaXNoZWQpLiBVc2VmdWwgZm9yIGRlcGVuZGVuY2llcyB0aGF0IHdhbnQgdG8ga25vdwogICAqIHdoYXQgZWxzZSBpcyBsb2FkaW5nLiBFeGFtcGxlOiBnb29nLm1vZHVsZXMgY2Fubm90IGV2YWwgaWYgdGhlcmUgYXJlCiAgICogbG9hZGluZyBkZXBlbmRlbmNpZXMuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3l9IGRlcAogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRpbmdfID0gZnVuY3Rpb24oZGVwKSB7CiAgICB0aGlzLmxvYWRpbmdEZXBzXy5wdXNoKGRlcCk7CiAgfTsKCgogIC8qKgogICAqIE1hcmtzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGFzIGhhdmluZyBmaW5pc2hlZCBsb2FkaW5nIGFuZCBiZWluZyBhdmFpbGFibGUKICAgKiBmb3IgcmVxdWlyZS4KICAgKgogICAqIEBwYXJhbSB7IWdvb2cuRGVwZW5kZW5jeX0gZGVwCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZGVkXyA9IGZ1bmN0aW9uKGRlcCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxvYWRpbmdEZXBzXy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpcy5sb2FkaW5nRGVwc19baV0gPT0gZGVwKSB7CiAgICAgICAgdGhpcy5sb2FkaW5nRGVwc18uc3BsaWNlKGksIDEpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRlZmVycmVkUXVldWVfLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzLmRlZmVycmVkUXVldWVfW2ldID09IGRlcC5wYXRoKSB7CiAgICAgICAgdGhpcy5kZWZlcnJlZFF1ZXVlXy5zcGxpY2UoaSwgMSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodGhpcy5sb2FkaW5nRGVwc18ubGVuZ3RoID09IHRoaXMuZGVmZXJyZWRRdWV1ZV8ubGVuZ3RoICYmCiAgICAgICAgIXRoaXMuZGVwc1RvTG9hZF8ubGVuZ3RoKSB7CiAgICAgIC8vIFNvbWV0aGluZyBoYXMgYXNrZWQgdG8gbG9hZCB0aGVzZSwgYnV0IHRoZXkgbWF5IG5vdCBiZSBkaXJlY3RseQogICAgICAvLyByZXF1aXJlZCBhZ2FpbiBsYXRlciwgc28gbG9hZCB0aGVtIG5vdyB0aGF0IHdlIGtub3cgd2UncmUgZG9uZSBsb2FkaW5nCiAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZS4gZS5nLiBhIGdvb2cgbW9kdWxlIGVudHJ5IHBvaW50LgogICAgICB3aGlsZSAodGhpcy5kZWZlcnJlZFF1ZXVlXy5sZW5ndGgpIHsKICAgICAgICB0aGlzLnJlcXVlc3RlZCh0aGlzLmRlZmVycmVkUXVldWVfLnNoaWZ0KCksIHRydWUpOwogICAgICB9CiAgICB9CgogICAgZGVwLmxvYWRlZCgpOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwYXRoc09ySWRzCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5hcmVEZXBzTG9hZGVkXyA9IGZ1bmN0aW9uKHBhdGhzT3JJZHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aHNPcklkcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21EZXBzXyhwYXRoc09ySWRzW2ldKTsKICAgICAgaWYgKCFwYXRoIHx8CiAgICAgICAgICAoIShwYXRoIGluIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfKSAmJgogICAgICAgICAgICFnb29nLmlzUHJvdmlkZWRfKHBhdGhzT3JJZHNbaV0pKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gYWJzUGF0aE9ySWQKICAgKiBAcmV0dXJuIHs/c3RyaW5nfQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmdldFBhdGhGcm9tRGVwc18gPSBmdW5jdGlvbihhYnNQYXRoT3JJZCkgewogICAgaWYgKGFic1BhdGhPcklkIGluIHRoaXMuaWRUb1BhdGhfKSB7CiAgICAgIHJldHVybiB0aGlzLmlkVG9QYXRoX1thYnNQYXRoT3JJZF07CiAgICB9IGVsc2UgaWYgKGFic1BhdGhPcklkIGluIHRoaXMuZGVwZW5kZW5jaWVzXykgewogICAgICByZXR1cm4gYWJzUGF0aE9ySWQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHshZ29vZy5EZXBlbmRlbmN5fSBkZXBlbmRlbmN5CiAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUuZGVmZXJfID0gZnVuY3Rpb24oZGVwZW5kZW5jeSwgY2FsbGJhY2spIHsKICAgIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfW2RlcGVuZGVuY3kucGF0aF0gPSBjYWxsYmFjazsKICAgIHRoaXMuZGVmZXJyZWRRdWV1ZV8ucHVzaChkZXBlbmRlbmN5LnBhdGgpOwogIH07CgoKICAvKioKICAgKiBJbnRlcmZhY2UgZm9yIGdvb2cuRGVwZW5kZW5jeSBpbXBsZW1lbnRhdGlvbnMgdG8gaGF2ZSBzb21lIGNvbnRyb2wgb3ZlcgogICAqIGxvYWRpbmcgb2YgZGVwZW5kZW5jaWVzLgogICAqCiAgICogQHJlY29yZAogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnRyb2xsZXIgdG8gaGFsdCBsb2FkaW5nIG9mIG1vcmUgZGVwZW5kZW5jaWVzLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7fTsKCgogIC8qKgogICAqIFRlbGxzIHRoZSBjb250cm9sbGVyIHRvIHJlc3VtZSBsb2FkaW5nIG9mIG1vcmUgZGVwZW5kZW5jaWVzIGlmIHBhdXNlZC4KICAgKi8KICBnb29nLkxvYWRDb250cm9sbGVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnRyb2xsZXIgdGhhdCB0aGlzIGRlcGVuZGVuY3kgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCiAgICoKICAgKiBUaGlzIGNhdXNlcyB0aGlzIHRvIGJlIHJlbW92ZWQgZnJvbSBwZW5kaW5nKCkgYW5kIGFueSBsb2FkIGNhbGxiYWNrcyB0bwogICAqIGZpcmUuCiAgICovCiAgZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUubG9hZGVkID0gZnVuY3Rpb24oKSB7fTsKCgogIC8qKgogICAqIExpc3Qgb2YgZGVwZW5kZW5jaWVzIG9uIHdoaWNoIGxvYWQgaGFzIGJlZW4gY2FsbGVkIGJ1dCB3aGljaCBoYXZlIG5vdAogICAqIGNhbGxlZCBsb2FkZWQgb24gdGhlaXIgY29udHJvbGxlci4gVGhpcyBpbmNsdWRlcyB0aGUgY3VycmVudCBkZXBlbmRlbmN5LgogICAqCiAgICogQHJldHVybiB7IUFycmF5PCFnb29nLkRlcGVuZGVuY3k+fQogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnBlbmRpbmcgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGFuIG9iamVjdCBhcyBhbiBFUzYgbW9kdWxlJ3MgZXhwb3J0cyBzbyB0aGF0IGdvb2cubW9kdWxlcyBtYXkKICAgKiByZXF1aXJlIGl0IGJ5IHBhdGguCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBGdWxsIHBhdGggb2YgdGhlIG1vZHVsZS4KICAgKiBAcGFyYW0gez99IGV4cG9ydHMKICAgKiBAcGFyYW0ge3N0cmluZz19IG9wdF9jbG9zdXJlTmFtZXNwYWNlIENsb3N1cmUgbmFtZXNwYWNlIHRvIGFzc29jaWF0ZSB3aXRoCiAgICogICAgIHRoaXMgbW9kdWxlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0cyA9IGZ1bmN0aW9uKAogICAgICBwYXRoLCBleHBvcnRzLCBvcHRfY2xvc3VyZU5hbWVzcGFjZSkge307CgoKICAvKioKICAgKiBTZXRzIHRoZSBjdXJyZW50IG1vZHVsZSBzdGF0ZS4KICAgKgogICAqIEBwYXJhbSB7Z29vZy5Nb2R1bGVUeXBlfSB0eXBlIFR5cGUgb2YgbW9kdWxlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnNldE1vZHVsZVN0YXRlID0gZnVuY3Rpb24odHlwZSkge307CgoKICAvKioKICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgbW9kdWxlIHN0YXRlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmNsZWFyTW9kdWxlU3RhdGUgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gY2FsbCBvbmNlIHRoZSBkZXBlbmRlbmN5IGlzIGFjdHVhbGx5IHJlcXVlc3RlZAogICAqIHZpYSBnb29nLnJlcXVpcmUgKyBhbGwgb2YgdGhlIGltbWVkaWF0ZSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGxvYWRlZCBvcgogICAqIGFsbCBvdGhlciBmaWxlcyBoYXZlIGJlZW4gbG9hZGVkLiBBbGxvd3MgZm9yIGxhenkgbG9hZGluZyB1bnRpbAogICAqIHJlcXVpcmUnZCB3aXRob3V0IHBhdXNpbmcgZGVwZW5kZW5jeSBsb2FkaW5nLCB3aGljaCBpcyBuZWVkZWQgb24gb2xkIElFLgogICAqCiAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrCiAgICovCiAgZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUuZGVmZXIgPSBmdW5jdGlvbihjYWxsYmFjaykge307CgoKICAvKioKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmFyZURlcHNMb2FkZWQgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogQmFzaWMgc3VwZXIgY2xhc3MgZm9yIGFsbCBkZXBlbmRlbmNpZXMgQ2xvc3VyZSBMaWJyYXJ5IGNhbiBsb2FkLgogICAqCiAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIGxvYWQgdW50cmFuc3BpbGVkLCBub24tbW9kdWxlCiAgICogc2NyaXB0cyBpbiBhIHdlYiBicm9zd2VyLgogICAqCiAgICogRm9yIHRyYW5zcGlsZWQgbm9uLWdvb2cubW9kdWxlIGZpbGVzIHtAc2VlIGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3l9LgogICAqIEZvciBnb29nLm1vZHVsZXMgc2VlIHtAc2VlIGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3l9LgogICAqIEZvciB1bnRyYW5zcGlsZWQgRVM2IG1vZHVsZXMge0BzZWUgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5fS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggb2YgdGhpcyBzY3JpcHQuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBQYXRoIG9mIHRoaXMgc2NyaXB0IHJlbGF0aXZlIHRvIGdvb2cuYmFzZVBhdGguCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcHJvdmlkZXMgZ29vZy5wcm92aWRlZCBvciBnb29nLm1vZHVsZSBzeW1ib2xzCiAgICogICAgIGluIHRoaXMgZmlsZS4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBnb29nIHN5bWJvbHMgb3IgcmVsYXRpdmUgcGF0aHMgdG8gQ2xvc3VyZQogICAqICAgICB0aGlzIGRlcGVuZHMgb24uCiAgICogQHBhcmFtIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gbG9hZEZsYWdzCiAgICogQHN0cnVjdCBAY29uc3RydWN0b3IKICAgKi8KICBnb29nLkRlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncykgewogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5wYXRoID0gcGF0aDsKICAgIC8qKiBAY29uc3QgKi8KICAgIHRoaXMucmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5wcm92aWRlcyA9IHByb3ZpZGVzOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5yZXF1aXJlcyA9IHJlcXVpcmVzOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5sb2FkRmxhZ3MgPSBsb2FkRmxhZ3M7CiAgICAvKiogQHByaXZhdGUge2Jvb2xlYW59ICovCiAgICB0aGlzLmxvYWRlZF8gPSBmYWxzZTsKICAgIC8qKiBAcHJpdmF0ZSB7IUFycmF5PGZ1bmN0aW9uKCk+fSAqLwogICAgdGhpcy5sb2FkQ2FsbGJhY2tzXyA9IFtdOwogIH07CgoKICAvKioKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYXRobmFtZSBwYXJ0IG9mIHRoaXMgZGVwZW5kZW5jeSdzIHBhdGggaWYgaXQgaXMgYQogICAqICAgICBVUkkuCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5nZXRQYXRoTmFtZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhdGhOYW1lID0gdGhpcy5wYXRoOwogICAgdmFyIHByb3RvY29sSW5kZXggPSBwYXRoTmFtZS5pbmRleE9mKCc6Ly8nKTsKICAgIGlmIChwcm90b2NvbEluZGV4ID49IDApIHsKICAgICAgcGF0aE5hbWUgPSBwYXRoTmFtZS5zdWJzdHJpbmcocHJvdG9jb2xJbmRleCArIDMpOwogICAgICB2YXIgc2xhc2hJbmRleCA9IHBhdGhOYW1lLmluZGV4T2YoJy8nKTsKICAgICAgaWYgKHNsYXNoSW5kZXggPj0gMCkgewogICAgICAgIHBhdGhOYW1lID0gcGF0aE5hbWUuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhdGhOYW1lOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIGZpcmUgYXMgc29vbiBhcyB0aGlzIGhhcyBsb2FkZWQuCiAgICogQGZpbmFsCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5vbkxvYWQgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgaWYgKHRoaXMubG9hZGVkXykgewogICAgICBjYWxsYmFjaygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5sb2FkQ2FsbGJhY2tzXy5wdXNoKGNhbGxiYWNrKTsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogTWFya3MgdGhpcyBkZXBlbmRlbmN5IGFzIGxvYWRlZCBhbmQgZmlyZXMgYW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGgKICAgKiBvbkxvYWQuCiAgICogQGZpbmFsCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubG9hZGVkXyA9IHRydWU7CiAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5sb2FkQ2FsbGJhY2tzXzsKICAgIHRoaXMubG9hZENhbGxiYWNrc18gPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNhbGxiYWNrc1tpXSgpOwogICAgfQogIH07CgoKICAvKioKICAgKiBXaGV0aGVyIG9yIG5vdCBkb2N1bWVudC53cml0dGVuIC8gYXBwZW5kZWQgc2NyaXB0IHRhZ3Mgc2hvdWxkIGJlIGRlZmVycmVkLgogICAqCiAgICogQHByaXZhdGUge2Jvb2xlYW59CiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LmRlZmVyXyA9IGZhbHNlOwoKCiAgLyoqCiAgICogTWFwIG9mIHNjcmlwdCByZWFkeSAvIHN0YXRlIGNoYW5nZSBjYWxsYmFja3MuIE9sZCBJRSBjYW5ub3QgaGFuZGxlIHB1dHRpbmcKICAgKiB0aGVzZSBwcm9wZXJ0aWVzIG9uIGdvb2cuZ2xvYmFsLgogICAqCiAgICogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgZnVuY3Rpb24oPyk6dW5kZWZpbmVkPn0KICAgKi8KICBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfID0ge307CgoKICAvKioKICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLj8pOj99IGNhbGxiYWNrCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHZhciBrZXkgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDMyKTsKICAgIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF9ba2V5XSA9IGNhbGxiYWNrOwogICAgcmV0dXJuIGtleTsKICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IGtleQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18gPSBmdW5jdGlvbihrZXkpIHsKICAgIGRlbGV0ZSBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfW2tleV07CiAgfTsKCgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkKICAgKiBAcGFyYW0gey4uLj99IHZhcl9hcmdzCiAgICogQHByaXZhdGUKICAgKiBAc3VwcHJlc3Mge3VudXNlZFByaXZhdGVNZW1iZXJzfQogICAqLwogIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja18gPSBmdW5jdGlvbihrZXksIHZhcl9hcmdzKSB7CiAgICBpZiAoa2V5IGluIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF8pIHsKICAgICAgdmFyIGNhbGxiYWNrID0gZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrTWFwX1trZXldOwogICAgICB2YXIgYXJncyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB9CiAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7CiAgICB9IGVsc2UgewogICAgICB2YXIgZXJyb3JNZXNzYWdlID0gJ0NhbGxiYWNrIGtleSAnICsga2V5ICsKICAgICAgICAgICcgZG9lcyBub3QgZXhpc3QgKHdhcyBiYXNlLmpzIGxvYWRlZCBtb3JlIHRoYW4gb25jZT8pLic7CiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIFN0YXJ0cyBsb2FkaW5nIHRoaXMgZGVwZW5kZW5jeS4gVGhpcyBkZXBlbmRlbmN5IGNhbiBwYXVzZSBsb2FkaW5nIGlmIGl0CiAgICogbmVlZHMgdG8gYW5kIHJlc3VtZSBpdCBsYXRlciB2aWEgdGhlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgogICAqCiAgICogV2hlbiB0aGlzIGlzIGxvYWRlZCBpdCBzaG91bGQgY2FsbCBjb250cm9sbGVyLmxvYWRlZCgpLiBOb3RlIHRoYXQgdGhpcyB3aWxsCiAgICogZW5kIHVwIGNhbGxpbmcgdGhlIGxvYWRlZCBtZXRob2Qgb2YgdGhpcyBkZXBlbmRlbmN5OyB0aGVyZSBpcyBubyBuZWVkIHRvCiAgICogY2FsbCBpdCBleHBsaWNpdGx5LgogICAqCiAgICogQHBhcmFtIHshZ29vZy5Mb2FkQ29udHJvbGxlcn0gY29udHJvbGxlcgogICAqLwogIGdvb2cuRGVwZW5kZW5jeS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uKGNvbnRyb2xsZXIpIHsKICAgIGlmIChnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQpIHsKICAgICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCh0aGlzLnBhdGgpKSB7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghZ29vZy5pbkh0bWxEb2N1bWVudF8oKSkgewogICAgICBnb29nLmxvZ1RvQ29uc29sZV8oCiAgICAgICAgICAnQ2Fubm90IHVzZSBkZWZhdWx0IGRlYnVnIGxvYWRlciBvdXRzaWRlIG9mIEhUTUwgZG9jdW1lbnRzLicpOwogICAgICBpZiAodGhpcy5yZWxhdGl2ZVBhdGggPT0gJ2RlcHMuanMnKSB7CiAgICAgICAgLy8gU29tZSBvbGQgY29kZSBpcyByZWx5aW5nIG9uIGJhc2UuanMgYXV0byBsb2FkaW5nIGRlcHMuanMgZmFpbGluZyB3aXRoCiAgICAgICAgLy8gbm8gZXJyb3IgYmVmb3JlIGxhdGVyIHNldHRpbmcgQ0xPU1VSRV9JTVBPUlRfU0NSSVBULgogICAgICAgIC8vIENMT1NVUkVfSU1QT1JUX1NDUklQVCBzaG91bGQgYmUgc2V0ICpiZWZvcmUqIGJhc2UuanMgaXMgbG9hZGVkLCBvcgogICAgICAgIC8vIENMT1NVUkVfTk9fREVQUyBzZXQgdG8gdHJ1ZS4KICAgICAgICBnb29nLmxvZ1RvQ29uc29sZV8oCiAgICAgICAgICAgICdDb25zaWRlciBzZXR0aW5nIENMT1NVUkVfSU1QT1JUX1NDUklQVCBiZWZvcmUgbG9hZGluZyBiYXNlLmpzLCAnICsKICAgICAgICAgICAgJ29yIHNldHRpbmcgQ0xPU1VSRV9OT19ERVBTIHRvIHRydWUuJyk7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKiBAdHlwZSB7IUhUTUxEb2N1bWVudH0gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICAvLyBJZiB0aGUgdXNlciB0cmllcyB0byByZXF1aXJlIGEgbmV3IHN5bWJvbCBhZnRlciBkb2N1bWVudCBsb2FkLAogICAgLy8gc29tZXRoaW5nIGhhcyBnb25lIHRlcnJpYmx5IHdyb25nLiBEb2luZyBhIGRvY3VtZW50LndyaXRlIHdvdWxkCiAgICAvLyB3aXBlIG91dCB0aGUgcGFnZS4gVGhpcyBkb2VzIG5vdCBhcHBseSB0byB0aGUgQ1NQLWNvbXBsaWFudCBtZXRob2QKICAgIC8vIG9mIHdyaXRpbmcgc2NyaXB0IHRhZ3MuCiAgICBpZiAoZG9jLnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJyAmJgogICAgICAgICFnb29nLkVOQUJMRV9DSFJPTUVfQVBQX1NBRkVfU0NSSVBUX0xPQURJTkcpIHsKICAgICAgLy8gQ2VydGFpbiB0ZXN0IGZyYW1ld29ya3MgbG9hZCBiYXNlLmpzIG11bHRpcGxlIHRpbWVzLCB3aGljaCB0cmllcwogICAgICAvLyB0byB3cml0ZSBkZXBzLmpzIGVhY2ggdGltZS4gSWYgdGhhdCBoYXBwZW5zLCBqdXN0IGZhaWwgc2lsZW50bHkuCiAgICAgIC8vIFRoZXNlIGZyYW1ld29ya3Mgd2lwZSB0aGUgcGFnZSBiZXR3ZWVuIGVhY2ggbG9hZCBvZiBiYXNlLmpzLCBzbyB0aGlzCiAgICAgIC8vIGlzIE9LLgogICAgICB2YXIgaXNEZXBzID0gL1xiZGVwcy5qcyQvLnRlc3QodGhpcy5wYXRoKTsKICAgICAgaWYgKGlzRGVwcykgewogICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IEVycm9yKCdDYW5ub3Qgd3JpdGUgIicgKyB0aGlzLnBhdGggKyAnIiBhZnRlciBkb2N1bWVudCBsb2FkJyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIWdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyAmJgogICAgICAgIGdvb2cuaXNEb2N1bWVudExvYWRpbmdfKCkpIHsKICAgICAgdmFyIGtleSA9IGdvb2cuRGVwZW5kZW5jeS5yZWdpc3RlckNhbGxiYWNrXyhmdW5jdGlvbihzY3JpcHQpIHsKICAgICAgICBpZiAoIWdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8gfHwgc2NyaXB0LnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJykgewogICAgICAgICAgZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18oa2V5KTsKICAgICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdmFyIG5vbmNlQXR0ciA9ICFnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfICYmIGdvb2cuZ2V0U2NyaXB0Tm9uY2UoKSA/CiAgICAgICAgICAnIG5vbmNlPSInICsgZ29vZy5nZXRTY3JpcHROb25jZSgpICsgJyInIDoKICAgICAgICAgICcnOwogICAgICB2YXIgZXZlbnQgPQogICAgICAgICAgZ29vZy5EZWJ1Z0xvYWRlcl8uSVNfT0xEX0lFXyA/ICdvbnJlYWR5c3RhdGVjaGFuZ2UnIDogJ29ubG9hZCc7CiAgICAgIHZhciBkZWZlciA9IGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8gPyAnZGVmZXInIDogJyc7CiAgICAgIHZhciBzY3JpcHQgPSAnPHNjcmlwdCBzcmM9IicgKyB0aGlzLnBhdGggKyAnIiAnICsgZXZlbnQgKwogICAgICAgICAgJz0iZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXyhcJycgKyBrZXkgKwogICAgICAgICAgJ1wnLCB0aGlzKSIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiAnICsgZGVmZXIgKyBub25jZUF0dHIgKyAnPjwnICsKICAgICAgICAgICcvc2NyaXB0Pic7CiAgICAgIGRvYy53cml0ZSgKICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgICBnb29nLlRSVVNURURfVFlQRVNfUE9MSUNZXy5jcmVhdGVIVE1MKHNjcmlwdCkgOgogICAgICAgICAgICAgIHNjcmlwdCk7CiAgICB9IGVsc2UgewogICAgICB2YXIgc2NyaXB0RWwgPQogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFNjcmlwdEVsZW1lbnR9ICovIChkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpOwogICAgICBzY3JpcHRFbC5kZWZlciA9IGdvb2cuRGVwZW5kZW5jeS5kZWZlcl87CiAgICAgIHNjcmlwdEVsLmFzeW5jID0gZmFsc2U7CiAgICAgIHNjcmlwdEVsLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKCiAgICAgIC8vIElmIENTUCBub25jZXMgYXJlIHVzZWQsIHByb3BhZ2F0ZSB0aGVtIHRvIGR5bmFtaWNhbGx5IGNyZWF0ZWQgc2NyaXB0cy4KICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgbm9uY2UtYmFzZWQgQ1NQcyB3aXRob3V0ICdzdHJpY3QtZHluYW1pYycuCiAgICAgIHZhciBub25jZSA9IGdvb2cuZ2V0U2NyaXB0Tm9uY2UoKTsKICAgICAgaWYgKG5vbmNlKSB7CiAgICAgICAgc2NyaXB0RWwuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTsKICAgICAgfQoKICAgICAgaWYgKGdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8pIHsKICAgICAgICAvLyBFeGVjdXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgb24gb2xkIElFLCBoYWx0IGxvYWRpbmcgYW5kIHdyaXRlCiAgICAgICAgLy8gdGhlc2Ugc2NyaXB0cyBvbmUgYXQgYSB0aW1lLCBhZnRlciBlYWNoIGxvYWRzLgogICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgICBzY3JpcHRFbC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChzY3JpcHRFbC5yZWFkeVN0YXRlID09ICdsb2FkZWQnIHx8CiAgICAgICAgICAgICAgc2NyaXB0RWwucmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnKSB7CiAgICAgICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgICAgIGNvbnRyb2xsZXIucmVzdW1lKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzY3JpcHRFbC5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHNjcmlwdEVsLm9ubG9hZCA9IG51bGw7CiAgICAgICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHNjcmlwdEVsLnNyYyA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZVNjcmlwdFVSTCh0aGlzLnBhdGgpIDoKICAgICAgICAgIHRoaXMucGF0aDsKICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpOwogICAgfQogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBBYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc2NyaXB0LgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggUGF0aCBvZiB0aGlzIHNjcmlwdCByZWxhdGl2ZSB0byBnb29nLmJhc2VQYXRoLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHByb3ZpZGVzIFNob3VsZCBiZSBhbiBlbXB0eSBhcnJheS4KICAgKiAgICAgVE9ETyhqb2hucGxhaXN0ZWQpIGFkZCBzdXBwb3J0IGZvciBhZGRpbmcgY2xvc3VyZSBuYW1lc3BhY2VzIHRvIEVTNgogICAqICAgICBtb2R1bGVzIGZvciBpbnRlcm9wIHB1cnBvc2VzLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLkRlcGVuZGVuY3l9CiAgICovCiAgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpIHsKICAgIGdvb2cuRXM2TW9kdWxlRGVwZW5kZW5jeS5iYXNlKAogICAgICAgIHRoaXMsICdjb25zdHJ1Y3RvcicsIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogIH07CiAgZ29vZy5pbmhlcml0cyhnb29nLkVzNk1vZHVsZURlcGVuZGVuY3ksIGdvb2cuRGVwZW5kZW5jeSk7CgoKICAvKiogQG92ZXJyaWRlICovCiAgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCkgewogICAgICBpZiAoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKHRoaXMucGF0aCkpIHsKICAgICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFnb29nLmluSHRtbERvY3VtZW50XygpKSB7CiAgICAgIGdvb2cubG9nVG9Db25zb2xlXygKICAgICAgICAgICdDYW5ub3QgdXNlIGRlZmF1bHQgZGVidWcgbG9hZGVyIG91dHNpZGUgb2YgSFRNTCBkb2N1bWVudHMuJyk7CiAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKiBAdHlwZSB7IUhUTUxEb2N1bWVudH0gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICB2YXIgZGVwID0gdGhpczsKCiAgICAvLyBUT0RPKGpvaG5wbGFpc3RlZCk6IERvZXMgZG9jdW1lbnQud3JpdGluZyByZWFsbHkgc3BlZWQgdXAgYW55dGhpbmc/IEFueQogICAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGp1c3Qgd2FpdGluZyBmb3IgaW50ZXJhY3RpdmUgbW9kZSBhbmQgdGhlbgogICAgLy8gYXBwZW5kaW5nPwogICAgZnVuY3Rpb24gd3JpdGUoc3JjLCBjb250ZW50cykgewogICAgICBpZiAoY29udGVudHMpIHsKICAgICAgICB2YXIgc2NyaXB0ID0gJzxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbj4nICsgY29udGVudHMgKyAnPC8nICsKICAgICAgICAgICAgJ3NjcmlwdD4nOwogICAgICAgIGRvYy53cml0ZSgKICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChzY3JpcHQpIDoKICAgICAgICAgICAgICAgIHNjcmlwdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHNjcmlwdCA9ICc8c2NyaXB0IHR5cGU9Im1vZHVsZSIgY3Jvc3NvcmlnaW4gc3JjPSInICsgc3JjICsgJyI+PC8nICsKICAgICAgICAgICAgJ3NjcmlwdD4nOwogICAgICAgIGRvYy53cml0ZSgKICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChzY3JpcHQpIDoKICAgICAgICAgICAgICAgIHNjcmlwdCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhcHBlbmQoc3JjLCBjb250ZW50cykgewogICAgICB2YXIgc2NyaXB0RWwgPQogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFNjcmlwdEVsZW1lbnR9ICovIChkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpOwogICAgICBzY3JpcHRFbC5kZWZlciA9IHRydWU7CiAgICAgIHNjcmlwdEVsLmFzeW5jID0gZmFsc2U7CiAgICAgIHNjcmlwdEVsLnR5cGUgPSAnbW9kdWxlJzsKICAgICAgc2NyaXB0RWwuc2V0QXR0cmlidXRlKCdjcm9zc29yaWdpbicsIHRydWUpOwoKICAgICAgLy8gSWYgQ1NQIG5vbmNlcyBhcmUgdXNlZCwgcHJvcGFnYXRlIHRoZW0gdG8gZHluYW1pY2FsbHkgY3JlYXRlZCBzY3JpcHRzLgogICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBub25jZS1iYXNlZCBDU1BzIHdpdGhvdXQgJ3N0cmljdC1keW5hbWljJy4KICAgICAgdmFyIG5vbmNlID0gZ29vZy5nZXRTY3JpcHROb25jZSgpOwogICAgICBpZiAobm9uY2UpIHsKICAgICAgICBzY3JpcHRFbC5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpOwogICAgICB9CgogICAgICBpZiAoY29udGVudHMpIHsKICAgICAgICBzY3JpcHRFbC50ZXh0Q29udGVudCA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0KGNvbnRlbnRzKSA6CiAgICAgICAgICAgIGNvbnRlbnRzOwogICAgICB9IGVsc2UgewogICAgICAgIHNjcmlwdEVsLnNyYyA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0VVJMKHNyYykgOgogICAgICAgICAgICBzcmM7CiAgICAgIH0KCiAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsKTsKICAgIH0KCiAgICB2YXIgY3JlYXRlOwoKICAgIGlmIChnb29nLmlzRG9jdW1lbnRMb2FkaW5nXygpKSB7CiAgICAgIGNyZWF0ZSA9IHdyaXRlOwogICAgICAvLyBXZSBjYW4gT05MWSBjYWxsIGRvY3VtZW50LndyaXRlIGlmIHdlIGFyZSBndWFyYW50ZWVkIHRoYXQgYW55CiAgICAgIC8vIG5vbi1tb2R1bGUgc2NyaXB0IHRhZ3MgZG9jdW1lbnQud3JpdHRlbiBhZnRlciB0aGlzIGFyZSBkZWZlcnJlZC4KICAgICAgLy8gU21hbGwgb3B0aW1pemF0aW9uLCBpbiB0aGVvcnkgZG9jdW1lbnQud3JpdGluZyBpcyBmYXN0ZXIuCiAgICAgIGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8gPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgY3JlYXRlID0gYXBwZW5kOwogICAgfQoKICAgIC8vIFdyaXRlIDQgc2VwYXJhdGUgdGFncyBoZXJlOgogICAgLy8gMSkgU2V0cyB0aGUgbW9kdWxlIHN0YXRlIGF0IHRoZSBjb3JyZWN0IHRpbWUgKGp1c3QgYmVmb3JlIGV4ZWN1dGlvbikuCiAgICAvLyAyKSBBIHNyYyBub2RlIGZvciB0aGlzLCB3aGljaCBqdXN0IGhvcGVmdWxseSBsZXRzIHRoZSBicm93c2VyIGxvYWQgaXQgYQogICAgLy8gICAgbGl0dGxlIGVhcmx5IChubyBuZWVkIHRvIHBhcnNlICMzKS4KICAgIC8vIDMpIEltcG9ydCB0aGUgbW9kdWxlIGFuZCByZWdpc3RlciBpdC4KICAgIC8vIDQpIENsZWFyIHRoZSBtb2R1bGUgc3RhdGUgYXQgdGhlIGNvcnJlY3QgdGltZS4gR3VhcmFudGVlZCB0byBydW4gZXZlbgogICAgLy8gICAgaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIG1vZHVsZSAoIzMgd2lsbCBub3QgcnVuIGlmIHRoZXJlIGlzIGFuCiAgICAvLyAgICBlcnJvciBpbiB0aGUgbW9kdWxlKS4KICAgIHZhciBiZWZvcmVLZXkgPSBnb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oKSB7CiAgICAgIGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGJlZm9yZUtleSk7CiAgICAgIGNvbnRyb2xsZXIuc2V0TW9kdWxlU3RhdGUoZ29vZy5Nb2R1bGVUeXBlLkVTNik7CiAgICB9KTsKICAgIGNyZWF0ZSh1bmRlZmluZWQsICdnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tfKCInICsgYmVmb3JlS2V5ICsgJyIpJyk7CgogICAgLy8gVE9ETyhqb2hucGxhaXN0ZWQpOiBEb2VzIHRoaXMgcmVhbGx5IHNwZWVkIHVwIGFueXRoaW5nPwogICAgY3JlYXRlKHRoaXMucGF0aCwgdW5kZWZpbmVkKTsKCiAgICB2YXIgcmVnaXN0ZXJLZXkgPSBnb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oZXhwb3J0cykgewogICAgICBnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhyZWdpc3RlcktleSk7CiAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKAogICAgICAgICAgZGVwLnBhdGgsIGV4cG9ydHMsIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWUpOwogICAgfSk7CiAgICBjcmVhdGUoCiAgICAgICAgdW5kZWZpbmVkLAogICAgICAgICdpbXBvcnQgKiBhcyBtIGZyb20gIicgKyB0aGlzLnBhdGggKyAnIjsgZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArCiAgICAgICAgICAgIHJlZ2lzdGVyS2V5ICsgJyIsIG0pJyk7CgogICAgdmFyIGFmdGVyS2V5ID0gZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCkgewogICAgICBnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhhZnRlcktleSk7CiAgICAgIGNvbnRyb2xsZXIuY2xlYXJNb2R1bGVTdGF0ZSgpOwogICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgfSk7CiAgICBjcmVhdGUodW5kZWZpbmVkLCAnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArIGFmdGVyS2V5ICsgJyIpJyk7CiAgfTsKCgogIC8qKgogICAqIFN1cGVyY2xhc3Mgb2YgYW55IGRlcGVuZGVuY3kgdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQgaW50byBtZW1vcnksCiAgICogdHJhbnNmb3JtZWQsIGFuZCB0aGVuIGV2YWwnZCAoZ29vZy5tb2R1bGVzIGFuZCB0cmFuc3BpbGVkIGZpbGVzKS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggb2YgdGhpcyBzY3JpcHQuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBQYXRoIG9mIHRoaXMgc2NyaXB0IHJlbGF0aXZlIHRvIGdvb2cuYmFzZVBhdGguCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcHJvdmlkZXMgZ29vZy5wcm92aWRlZCBvciBnb29nLm1vZHVsZSBzeW1ib2xzCiAgICogICAgIGluIHRoaXMgZmlsZS4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBnb29nIHN5bWJvbHMgb3IgcmVsYXRpdmUgcGF0aHMgdG8gQ2xvc3VyZQogICAqICAgICB0aGlzIGRlcGVuZHMgb24uCiAgICogQHBhcmFtIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gbG9hZEZsYWdzCiAgICogQHN0cnVjdCBAY29uc3RydWN0b3IgQGFic3RyYWN0CiAgICogQGV4dGVuZHMge2dvb2cuRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKAogICAgICBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKSB7CiAgICBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeS5iYXNlKAogICAgICAgIHRoaXMsICdjb25zdHJ1Y3RvcicsIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogICAgLyoqIEBwcml2YXRlIHs/c3RyaW5nfSAqLwogICAgdGhpcy5jb250ZW50c18gPSBudWxsOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBsYXppbHkgbWFrZSB0aGUgc3luY2hyb25vdXMgWEhSICh3aGVuIGdvb2cucmVxdWlyZSdkKSBvciBtYWtlCiAgICAgKiB0aGUgc3luY2hyb25vdXMgWEhSIHdoZW4gaW5pdGlhbGx5IGxvYWRpbmcuIE9uIEZpcmVGb3ggNjEgdGhlcmUgaXMgYSBidWcKICAgICAqIHdoZXJlIGFuIEVTNiBtb2R1bGUgY2Fubm90IG1ha2UgYSBzeW5jaHJvbm91cyBYSFIgKHJhdGhlciwgaXQgY2FuLCBidXQgaWYKICAgICAqIGl0IGRvZXMgdGhlbiBubyBvdGhlciBFUzYgbW9kdWxlcyB3aWxsIGxvYWQgYWZ0ZXIpLgogICAgICoKICAgICAqIHRsO2RyIHdlIGxhenkgbG9hZCBkdWUgdG8gYnVncyBvbiBvbGRlciBicm93c2VycyBhbmQgZWFnZXIgbG9hZCBkdWUgdG8KICAgICAqIGJ1Z3Mgb24gbmV3ZXIgb25lcy4KICAgICAqCiAgICAgKiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDc3MDkwCiAgICAgKgogICAgICogQHByaXZhdGUgQGNvbnN0IHtib29sZWFufQogICAgICovCiAgICB0aGlzLmxhenlGZXRjaF8gPSAhZ29vZy5pbkh0bWxEb2N1bWVudF8oKSB8fAogICAgICAgICEoJ25vTW9kdWxlJyBpbiBnb29nLmdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSk7CiAgfTsKICBnb29nLmluaGVyaXRzKGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LCBnb29nLkRlcGVuZGVuY3kpOwoKCiAgLyoqIEBvdmVycmlkZSAqLwogIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgdmFyIGRlcCA9IHRoaXM7CgogICAgZnVuY3Rpb24gZmV0Y2goKSB7CiAgICAgIGRlcC5jb250ZW50c18gPSBnb29nLmxvYWRGaWxlU3luY18oZGVwLnBhdGgpOwoKICAgICAgaWYgKGRlcC5jb250ZW50c18pIHsKICAgICAgICBkZXAuY29udGVudHNfID0gZGVwLnRyYW5zZm9ybShkZXAuY29udGVudHNfKTsKICAgICAgICBpZiAoZGVwLmNvbnRlbnRzXykgewogICAgICAgICAgZGVwLmNvbnRlbnRzXyArPSAnXG4vLyMgc291cmNlVVJMPScgKyBkZXAucGF0aDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKSB7CiAgICAgIGZldGNoKCk7CiAgICAgIGlmICh0aGlzLmNvbnRlbnRzXyAmJgogICAgICAgICAgZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKCcnLCB0aGlzLmNvbnRlbnRzXykpIHsKICAgICAgICB0aGlzLmNvbnRlbnRzXyA9IG51bGw7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKCiAgICB2YXIgaXNFczYgPSB0aGlzLmxvYWRGbGFnc1snbW9kdWxlJ10gPT0gZ29vZy5Nb2R1bGVUeXBlLkVTNjsKCiAgICBpZiAoIXRoaXMubGF6eUZldGNoXykgewogICAgICBmZXRjaCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICAgIGlmIChkZXAubGF6eUZldGNoXykgewogICAgICAgIGZldGNoKCk7CiAgICAgIH0KCiAgICAgIGlmICghZGVwLmNvbnRlbnRzXykgewogICAgICAgIC8vIGxvYWRGaWxlU3luY18gb3IgdHJhbnNmb3JtIGFyZSByZXNwb25zaWJsZS4gQXNzdW1lIHRoZXkgbG9nZ2VkIGFuCiAgICAgICAgLy8gZXJyb3IuCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoaXNFczYpIHsKICAgICAgICBjb250cm9sbGVyLnNldE1vZHVsZVN0YXRlKGdvb2cuTW9kdWxlVHlwZS5FUzYpOwogICAgICB9CgogICAgICB2YXIgbmFtZXNwYWNlOwoKICAgICAgdHJ5IHsKICAgICAgICB2YXIgY29udGVudHMgPSBkZXAuY29udGVudHNfOwogICAgICAgIGRlcC5jb250ZW50c18gPSBudWxsOwogICAgICAgIGdvb2cuZ2xvYmFsRXZhbChjb250ZW50cyk7CiAgICAgICAgaWYgKGlzRXM2KSB7CiAgICAgICAgICBuYW1lc3BhY2UgPSBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lOwogICAgICAgIH0KICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAoaXNFczYpIHsKICAgICAgICAgIGNvbnRyb2xsZXIuY2xlYXJNb2R1bGVTdGF0ZSgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGlzRXM2KSB7CiAgICAgICAgLy8gRHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB0aGlzIG1heSBub3QgYmUgYXZhaWxhYmxlIGZvciByZXF1aXJlCiAgICAgICAgLy8gcmlnaHQgbm93LgogICAgICAgIGdvb2cuZ2xvYmFsWyckanNjb21wJ11bJ3JlcXVpcmUnXVsnZW5zdXJlJ10oCiAgICAgICAgICAgIFtkZXAuZ2V0UGF0aE5hbWUoKV0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKAogICAgICAgICAgICAgICAgICBkZXAucGF0aCwKICAgICAgICAgICAgICAgICAgZ29vZy5nbG9iYWxbJyRqc2NvbXAnXVsncmVxdWlyZSddKGRlcC5nZXRQYXRoTmFtZSgpKSwKICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlKTsKICAgICAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICB9CgogICAgLy8gRG8gbm90IGZldGNoIG5vdzsgaW4gRmlyZUZveCA0NyB0aGUgc3luY2hyb25vdXMgWEhSIGRvZXNuJ3QgYmxvY2sgYWxsCiAgICAvLyBldmVudHMuIElmIHdlIGZldGNoZWQgbm93IGFuZCB0aGVuIGRvY3VtZW50LndyaXRlJ2QgdGhlIGNvbnRlbnRzIHRoZQogICAgLy8gZG9jdW1lbnQud3JpdGUgd291bGQgYmUgYW4gZXZhbCBhbmQgd291bGQgZXhlY3V0ZSB0b28gc29vbiEgSW5zdGVhZCB3cml0ZQogICAgLy8gYSBzY3JpcHQgdGFnIHRvIGZldGNoIGFuZCBldmFsIHN5bmNocm9ub3VzbHkgYXQgdGhlIGNvcnJlY3QgdGltZS4KICAgIGZ1bmN0aW9uIGZldGNoSW5Pd25TY3JpcHRUaGVuTG9hZCgpIHsKICAgICAgLyoqIEB0eXBlIHshSFRNTERvY3VtZW50fSAqLwogICAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CgogICAgICB2YXIga2V5ID0gZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCkgewogICAgICAgIGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGtleSk7CiAgICAgICAgbG9hZCgpOwogICAgICB9KTsKCiAgICAgIHZhciBzY3JpcHQgPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPicgKwogICAgICAgICAgZ29vZy5wcm90ZWN0U2NyaXB0VGFnXygnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArIGtleSArICciKTsnKSArCiAgICAgICAgICAnPC8nICsKICAgICAgICAgICdzY3JpcHQ+JzsKICAgICAgZG9jLndyaXRlKAogICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZUhUTUwoc2NyaXB0KSA6CiAgICAgICAgICAgICAgc2NyaXB0KTsKICAgIH0KCiAgICAvLyBJZiBvbmUgdGhpbmcgaXMgcGVuZGluZyBpdCBpcyB0aGlzLgogICAgdmFyIGFueXRoaW5nRWxzZVBlbmRpbmcgPSBjb250cm9sbGVyLnBlbmRpbmcoKS5sZW5ndGggPiAxOwoKICAgIC8vIElmIGFueXRoaW5nIGVsc2UgaXMgbG9hZGluZyB3ZSBuZWVkIHRvIGxhenkgbG9hZCBkdWUgdG8gYnVncyBpbiBvbGQgSUUuCiAgICAvLyBTcGVjaWZpY2FsbHkgc2NyaXB0IHRhZ3Mgd2l0aCBzcmMgYW5kIHNjcmlwdCB0YWdzIHdpdGggY29udGVudHMgY291bGQKICAgIC8vIGV4ZWN1dGUgb3V0IG9mIG9yZGVyIGlmIGRvY3VtZW50LndyaXRlIGlzIHVzZWQsIHNvIHdlIGNhbm5vdCB1c2UKICAgIC8vIGRvY3VtZW50LndyaXRlLiBEbyBub3QgcGF1c2UgaGVyZTsgaXQgYnJlYWtzIG9sZCBJRSBhcyB3ZWxsLgogICAgdmFyIHVzZU9sZEllV29ya0Fyb3VuZCA9CiAgICAgICAgYW55dGhpbmdFbHNlUGVuZGluZyAmJiBnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfOwoKICAgIC8vIEFkZGl0aW9uYWxseSBpZiB3ZSBhcmUgbWVhbnQgdG8gZGVmZXIgc2NyaXB0cyBidXQgdGhlIHBhZ2UgaXMgc3RpbGwKICAgIC8vIGxvYWRpbmcgKGUuZy4gYW4gRVM2IG1vZHVsZSBpcyBsb2FkaW5nKSB0aGVuIGFsc28gZGVmZXIuIE9yIGlmIHdlIGFyZQogICAgLy8gbWVhbnQgdG8gZGVmZXIgYW5kIGFueXRoaW5nIGVsc2UgaXMgcGVuZGluZyB0aGVuIGRlZmVyICh0aG9zZSBtYXkgYmUKICAgIC8vIHNjcmlwdHMgdGhhdCBkaWQgbm90IG5lZWQgdHJhbnNmb3JtYXRpb24gYW5kIGFyZSBqdXN0IHNjcmlwdCB0YWdzIHdpdGgKICAgIC8vIGRlZmVyIHNldCB0byB0cnVlLCBhbmQgd2UgbmVlZCB0byBldmFsdWF0ZSBhZnRlciB0aGF0IGRlZmVycmVkIHNjcmlwdCkuCiAgICB2YXIgbmVlZHNBc3luY0xvYWRpbmcgPSBnb29nLkRlcGVuZGVuY3kuZGVmZXJfICYmCiAgICAgICAgKGFueXRoaW5nRWxzZVBlbmRpbmcgfHwgZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSk7CgogICAgaWYgKHVzZU9sZEllV29ya0Fyb3VuZCB8fCBuZWVkc0FzeW5jTG9hZGluZykgewogICAgICAvLyBOb3RlIHRoYXQgd2Ugb25seSBkZWZlciB3aGVuIHdlIGhhdmUgdG8gcmF0aGVyIHRoYW4gMTAwJSBvZiB0aGUgdGltZS4KICAgICAgLy8gQWx3YXlzIGRlZmVyaW5nIHdvdWxkIHdvcmssIGJ1dCB0aGVuIGluIHRoZW9yeSB0aGUgb3JkZXIgb2YKICAgICAgLy8gZ29vZy5yZXF1aXJlIGNhbGxzIHdvdWxkIHRoZW4gbWF0dGVyLiBXZSB3YW50IHRvIGVuZm9yY2UgdGhhdCBtb3N0IG9mCiAgICAgIC8vIHRoZSB0aW1lIHRoZSBvcmRlciBvZiB0aGUgcmVxdWlyZSBjYWxscyBkb2VzIG5vdCBtYXR0ZXIuCiAgICAgIGNvbnRyb2xsZXIuZGVmZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgbG9hZCgpOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVE9ETyhqb2hucGxhaXN0ZWQpOiBFeHRlcm5zIGFyZSBtaXNzaW5nIG9ucmVhZHlzdGF0ZWNoYW5nZSBmb3IKICAgIC8vIEhUTUxEb2N1bWVudC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICB2YXIgaXNJbnRlcm5ldEV4cGxvcmVyID0KICAgICAgICBnb29nLmluSHRtbERvY3VtZW50XygpICYmICdBY3RpdmVYT2JqZWN0JyBpbiBnb29nLmdsb2JhbDsKCiAgICAvLyBEb24ndCBkZWxheSBpbiBhbnkgdmVyc2lvbiBvZiBJRS4gVGhlcmUncyBidWcgYXJvdW5kIHRoaXMgdGhhdCB3aWxsCiAgICAvLyBjYXVzZSBvdXQgb2Ygb3JkZXIgc2NyaXB0IGV4ZWN1dGlvbi4gVGhpcyBtZWFucyB0aGF0IG9uIG9sZGVyIElFIEVTNgogICAgLy8gbW9kdWxlcyB3aWxsIGxvYWQgdG9vIGVhcmx5ICh3aGlsZSB0aGUgZG9jdW1lbnQgaXMgc3RpbGwgbG9hZGluZyArIHRoZQogICAgLy8gZG9tIGlzIG5vdCBhdmFpbGFibGUpLiBUaGUgb3RoZXIgb3B0aW9uIGlzIHRvIGxvYWQgdG9vIGxhdGUgKHdoZW4gdGhlCiAgICAvLyBkb2N1bWVudCBpcyBjb21wbGV0ZSBhbmQgdGhlIG9ubG9hZCBldmVuIHdpbGwgbmV2ZXIgZmlyZSkuIFRoaXMgc2VlbXMKICAgIC8vIHRvIGJlIHRoZSBsZXNzZXIgb2YgdHdvIGV2aWxzIGFzIHNjcmlwdHMgYWxyZWFkeSBhY3QgbGlrZSB0aGUgZm9ybWVyLgogICAgaWYgKGlzRXM2ICYmIGdvb2cuaW5IdG1sRG9jdW1lbnRfKCkgJiYgZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSAmJgogICAgICAgICFpc0ludGVybmV0RXhwbG9yZXIpIHsKICAgICAgZ29vZy5EZXBlbmRlbmN5LmRlZmVyXyA9IHRydWU7CiAgICAgIC8vIFRyYW5zcGlsZWQgRVM2IG1vZHVsZXMgc3RpbGwgbmVlZCB0byBsb2FkIGxpa2UgcmVndWxhciBFUzYgbW9kdWxlcywKICAgICAgLy8gYWthIG9ubHkgYWZ0ZXIgdGhlIGRvY3VtZW50IGlzIGludGVyYWN0aXZlLgogICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIHZhciBvbGRDYWxsYmFjayA9IGRvYy5vbnJlYWR5c3RhdGVjaGFuZ2U7CiAgICAgIGRvYy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoZG9jLnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgewogICAgICAgICAgZG9jLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG9sZENhbGxiYWNrOwogICAgICAgICAgbG9hZCgpOwogICAgICAgICAgY29udHJvbGxlci5yZXN1bWUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGdvb2cuaXNGdW5jdGlvbihvbGRDYWxsYmFjaykpIHsKICAgICAgICAgIG9sZENhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICAvLyBBbHdheXMgZXZhbCBvbiBvbGQgSUUuCiAgICAgIGlmIChnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfIHx8ICFnb29nLmluSHRtbERvY3VtZW50XygpIHx8CiAgICAgICAgICAhZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSkgewogICAgICAgIGxvYWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmZXRjaEluT3duU2NyaXB0VGhlbkxvYWQoKTsKICAgICAgfQogICAgfQogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudHMKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogQGFic3RyYWN0CiAgICovCiAgZ29vZy5UcmFuc2Zvcm1lZERlcGVuZGVuY3kucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbnRlbnRzKSB7fTsKCgogIC8qKgogICAqIEFueSBub24tZ29vZy5tb2R1bGUgZGVwZW5kZW5jeSB3aGljaCBuZWVkcyB0byBiZSB0cmFuc3BpbGVkIGJlZm9yZSBldmFsLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNjcmlwdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggb2YgdGhpcyBzY3JpcHQgcmVsYXRpdmUgdG8gZ29vZy5iYXNlUGF0aC4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBnb29nLnByb3ZpZGVkIG9yIGdvb2cubW9kdWxlIHN5bWJvbHMKICAgKiAgICAgaW4gdGhpcyBmaWxlLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAcGFyYW0geyFnb29nLlRyYW5zcGlsZXJ9IHRyYW5zcGlsZXIKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlRyYW5zcGlsZWREZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIHRyYW5zcGlsZXIpIHsKICAgIGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3kuYmFzZSgKICAgICAgICB0aGlzLCAnY29uc3RydWN0b3InLCBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKTsKICAgIC8qKiBAcHJvdGVjdGVkIEBjb25zdCovCiAgICB0aGlzLnRyYW5zcGlsZXIgPSB0cmFuc3BpbGVyOwogIH07CiAgZ29vZy5pbmhlcml0cyhnb29nLlRyYW5zcGlsZWREZXBlbmRlbmN5LCBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSk7CgoKICAvKiogQG92ZXJyaWRlICovCiAgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24oY29udGVudHMpIHsKICAgIC8vIFRyYW5zcGlsZSB3aXRoIHRoZSBwYXRobmFtZSBzbyB0aGF0IEVTNiBtb2R1bGVzIGFyZSBkb21haW4gYWdub3N0aWMuCiAgICByZXR1cm4gdGhpcy50cmFuc3BpbGVyLnRyYW5zcGlsZShjb250ZW50cywgdGhpcy5nZXRQYXRoTmFtZSgpKTsKICB9OwoKCiAgLyoqCiAgICogQW4gRVM2IG1vZHVsZSBkZXBlbmRlbmN5IHRoYXQgd2FzIHRyYW5zcGlsZWQgdG8gYSBqc2NvbXAgbW9kdWxlIG91dHNpZGUKICAgKiBvZiB0aGUgZGVidWcgbG9hZGVyLCBlLmcuIHNlcnZlciBzaWRlLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNjcmlwdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggb2YgdGhpcyBzY3JpcHQgcmVsYXRpdmUgdG8gZ29vZy5iYXNlUGF0aC4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBnb29nLnByb3ZpZGVkIG9yIGdvb2cubW9kdWxlIHN5bWJvbHMKICAgKiAgICAgaW4gdGhpcyBmaWxlLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpIHsKICAgIGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3kuYmFzZSgKICAgICAgICB0aGlzLCAnY29uc3RydWN0b3InLCBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKTsKICB9OwogIGdvb2cuaW5oZXJpdHMoCiAgICAgIGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3ksIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KTsKCgogIC8qKiBAb3ZlcnJpZGUgKi8KICBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbigKICAgICAgY29udGVudHMpIHsKICAgIHJldHVybiBjb250ZW50czsKICB9OwoKCiAgLyoqCiAgICogQSBnb29nLm1vZHVsZSwgdHJhbnNwaWxlZCBvciBub3QuIFdpbGwgYWx3YXlzIHBlcmZvcm0gc29tZSBtaW5pbWFsCiAgICogdHJhbnNmb3JtYXRpb24gZXZlbiB3aGVuIG5vdCB0cmFuc3BpbGVkIHRvIHdyYXAgaW4gYSBnb29nLmxvYWRNb2R1bGUKICAgKiBzdGF0ZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBBYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc2NyaXB0LgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggUGF0aCBvZiB0aGlzIHNjcmlwdCByZWxhdGl2ZSB0byBnb29nLmJhc2VQYXRoLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHByb3ZpZGVzIGdvb2cucHJvdmlkZWQgb3IgZ29vZy5tb2R1bGUgc3ltYm9scwogICAqICAgICBpbiB0aGlzIGZpbGUuCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcmVxdWlyZXMgZ29vZyBzeW1ib2xzIG9yIHJlbGF0aXZlIHBhdGhzIHRvIENsb3N1cmUKICAgKiAgICAgdGhpcyBkZXBlbmRzIG9uLgogICAqIEBwYXJhbSB7IU9iamVjdDxzdHJpbmcsIHN0cmluZz59IGxvYWRGbGFncwogICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmVlZHNUcmFuc3BpbGUKICAgKiBAcGFyYW0geyFnb29nLlRyYW5zcGlsZXJ9IHRyYW5zcGlsZXIKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIG5lZWRzVHJhbnNwaWxlLAogICAgICB0cmFuc3BpbGVyKSB7CiAgICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LmJhc2UoCiAgICAgICAgdGhpcywgJ2NvbnN0cnVjdG9yJywgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAvKiogQHByaXZhdGUgQGNvbnN0ICovCiAgICB0aGlzLm5lZWRzVHJhbnNwaWxlXyA9IG5lZWRzVHJhbnNwaWxlOwogICAgLyoqIEBwcml2YXRlIEBjb25zdCAqLwogICAgdGhpcy50cmFuc3BpbGVyXyA9IHRyYW5zcGlsZXI7CiAgfTsKICBnb29nLmluaGVyaXRzKGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3ksIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KTsKCgogIC8qKiBAb3ZlcnJpZGUgKi8KICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb250ZW50cykgewogICAgaWYgKHRoaXMubmVlZHNUcmFuc3BpbGVfKSB7CiAgICAgIGNvbnRlbnRzID0gdGhpcy50cmFuc3BpbGVyXy50cmFuc3BpbGUoY29udGVudHMsIHRoaXMuZ2V0UGF0aE5hbWUoKSk7CiAgICB9CgogICAgaWYgKCFnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUwgfHwgZ29vZy5nbG9iYWwuSlNPTiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiAnJyArCiAgICAgICAgICAnZ29vZy5sb2FkTW9kdWxlKGZ1bmN0aW9uKGV4cG9ydHMpIHsnICsKICAgICAgICAgICcidXNlIHN0cmljdCI7JyArIGNvbnRlbnRzICsKICAgICAgICAgICdcbicgKyAgLy8gdGVybWluYXRlIGFueSB0cmFpbGluZyBzaW5nbGUgbGluZSBjb21tZW50LgogICAgICAgICAgJztyZXR1cm4gZXhwb3J0cycgKwogICAgICAgICAgJ30pOycgKwogICAgICAgICAgJ1xuLy8jIHNvdXJjZVVSTD0nICsgdGhpcy5wYXRoICsgJ1xuJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAnJyArCiAgICAgICAgICAnZ29vZy5sb2FkTW9kdWxlKCcgKwogICAgICAgICAgZ29vZy5nbG9iYWwuSlNPTi5zdHJpbmdpZnkoCiAgICAgICAgICAgICAgY29udGVudHMgKyAnXG4vLyMgc291cmNlVVJMPScgKyB0aGlzLnBhdGggKyAnXG4nKSArCiAgICAgICAgICAnKTsnOwogICAgfQogIH07CgoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBicm93c2VyIGlzIElFOSBvciBlYXJsaWVyLCB3aGljaCBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nCiAgICogZm9yIGRlZmVycmVkIG1vZHVsZXMuCiAgICogQGNvbnN0IEBwcml2YXRlIHtib29sZWFufQogICAqLwogIGdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8gPSAhISgKICAgICAgIWdvb2cuZ2xvYmFsLmF0b2IgJiYgZ29vZy5nbG9iYWwuZG9jdW1lbnQgJiYgZ29vZy5nbG9iYWwuZG9jdW1lbnRbJ2FsbCddKTsKCgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxQYXRoCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPnx1bmRlZmluZWR9IHByb3ZpZGVzCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcmVxdWlyZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW58IU9iamVjdDxzdHJpbmc+PX0gb3B0X2xvYWRGbGFncwogICAqIEBzZWUgZ29vZy5hZGREZXBlbmRlbmN5CiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmFkZERlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcmVsUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBvcHRfbG9hZEZsYWdzKSB7CiAgICBwcm92aWRlcyA9IHByb3ZpZGVzIHx8IFtdOwogICAgcmVsUGF0aCA9IHJlbFBhdGgucmVwbGFjZSgvXFwvZywgJy8nKTsKICAgIHZhciBwYXRoID0gZ29vZy5ub3JtYWxpemVQYXRoXyhnb29nLmJhc2VQYXRoICsgcmVsUGF0aCk7CiAgICBpZiAoIW9wdF9sb2FkRmxhZ3MgfHwgdHlwZW9mIG9wdF9sb2FkRmxhZ3MgPT09ICdib29sZWFuJykgewogICAgICBvcHRfbG9hZEZsYWdzID0gb3B0X2xvYWRGbGFncyA/IHsnbW9kdWxlJzogZ29vZy5Nb2R1bGVUeXBlLkdPT0d9IDoge307CiAgICB9CiAgICB2YXIgZGVwID0gdGhpcy5mYWN0b3J5Xy5jcmVhdGVEZXBlbmRlbmN5KAogICAgICAgIHBhdGgsIHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgb3B0X2xvYWRGbGFncywKICAgICAgICBnb29nLnRyYW5zcGlsZXJfLm5lZWRzVHJhbnNwaWxlKAogICAgICAgICAgICBvcHRfbG9hZEZsYWdzWydsYW5nJ10gfHwgJ2VzMycsIG9wdF9sb2FkRmxhZ3NbJ21vZHVsZSddKSk7CiAgICB0aGlzLmRlcGVuZGVuY2llc19bcGF0aF0gPSBkZXA7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3ZpZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHRoaXMuaWRUb1BhdGhfW3Byb3ZpZGVzW2ldXSA9IHBhdGg7CiAgICB9CiAgICB0aGlzLmlkVG9QYXRoX1tyZWxQYXRoXSA9IHBhdGg7CiAgfTsKCgogIC8qKgogICAqIENyZWF0ZXMgZ29vZy5EZXBlbmRlbmN5IGluc3RhbmNlcyBmb3IgdGhlIGRlYnVnIGxvYWRlciB0byBsb2FkLgogICAqCiAgICogU2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8gaGF2ZSB0aGUgZGVidWcgbG9hZGVyIHVzZSBjdXN0b20gc3ViY2xhc3NlcyBvZgogICAqIGdvb2cuRGVwZW5kZW5jeS4KICAgKgogICAqIEBwYXJhbSB7IWdvb2cuVHJhbnNwaWxlcn0gdHJhbnNwaWxlcgogICAqIEBzdHJ1Y3QgQGNvbnN0cnVjdG9yCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5RmFjdG9yeSA9IGZ1bmN0aW9uKHRyYW5zcGlsZXIpIHsKICAgIC8qKiBAcHJvdGVjdGVkIEBjb25zdCAqLwogICAgdGhpcy50cmFuc3BpbGVyID0gdHJhbnNwaWxlcjsKICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZS4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggcmVsYXRpdmUgdG8gY2xvc3VyZeKAmXMgYmFzZS5qcy4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBBcnJheSBvZiBwcm92aWRlZCBnb29nLnByb3ZpZGUvbW9kdWxlIGlkcy4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBBcnJheSBvZiByZXF1aXJlZCBnb29nLnByb3ZpZGUvbW9kdWxlIC8KICAgKiAgICAgcmVsYXRpdmUgRVM2IG1vZHVsZSBwYXRocy4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZWRzVHJhbnNwaWxlIFRydWUgaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgdHJhbnNwaWxlZAogICAqICAgICBwZXIgdGhlIGdvb2cuVHJhbnNwaWxlci4KICAgKiBAcmV0dXJuIHshZ29vZy5EZXBlbmRlbmN5fQogICAqLwogIGdvb2cuRGVwZW5kZW5jeUZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZURlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncywgbmVlZHNUcmFuc3BpbGUpIHsKCiAgICBpZiAobG9hZEZsYWdzWydtb2R1bGUnXSA9PSBnb29nLk1vZHVsZVR5cGUuR09PRykgewogICAgICByZXR1cm4gbmV3IGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3koCiAgICAgICAgICBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzLCBuZWVkc1RyYW5zcGlsZSwKICAgICAgICAgIHRoaXMudHJhbnNwaWxlcik7CiAgICB9IGVsc2UgaWYgKG5lZWRzVHJhbnNwaWxlKSB7CiAgICAgIHJldHVybiBuZXcgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeSgKICAgICAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIHRoaXMudHJhbnNwaWxlcik7CiAgICB9IGVsc2UgewogICAgICBpZiAobG9hZEZsYWdzWydtb2R1bGUnXSA9PSBnb29nLk1vZHVsZVR5cGUuRVM2KSB7CiAgICAgICAgaWYgKGdvb2cuVFJBTlNQSUxFID09ICduZXZlcicgJiYgZ29vZy5BU1NVTUVfRVNfTU9EVUxFU19UUkFOU1BJTEVEKSB7CiAgICAgICAgICByZXR1cm4gbmV3IGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3koCiAgICAgICAgICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBuZXcgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5KAogICAgICAgICAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IGdvb2cuRGVwZW5kZW5jeSgKICAgICAgICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAgIH0KICAgIH0KICB9OwoKCiAgLyoqIEBwcml2YXRlIEBjb25zdCAqLwogIGdvb2cuZGVidWdMb2FkZXJfID0gbmV3IGdvb2cuRGVidWdMb2FkZXJfKCk7CgoKICAvKioKICAgKiBMb2FkcyB0aGUgQ2xvc3VyZSBEZXBlbmRlbmN5IGZpbGUuCiAgICoKICAgKiBFeHBvc2VkIGEgcHVibGljIGZ1bmN0aW9uIHNvIENMT1NVUkVfTk9fREVQUyBjYW4gYmUgc2V0IHRvIGZhbHNlLCBiYXNlCiAgICogbG9hZGVkLCBzZXREZXBlbmRlbmN5RmFjdG9yeSBjYWxsZWQsIGFuZCB0aGVuIHRoaXMgY2FsbGVkLiBpLmUuIGFsbG93cwogICAqIGN1c3RvbSBsb2FkaW5nIG9mIHRoZSBkZXBzIGZpbGUuCiAgICovCiAgZ29vZy5sb2FkQ2xvc3VyZURlcHMgPSBmdW5jdGlvbigpIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLmxvYWRDbG9zdXJlRGVwcygpOwogIH07CgoKICAvKioKICAgKiBTZXRzIHRoZSBkZXBlbmRlbmN5IGZhY3RvcnksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBjdXN0b20KICAgKiBnb29nLkRlcGVuZGVuY3kgaW1wbGVtZW50YXRpb25zIHRvIGNvbnRyb2wgaG93IGRlcGVuZGVuY2llcyBhcmUgbG9hZGVkLgogICAqCiAgICogTm90ZTogaWYgeW91IHdpc2ggdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFuZCBwcm92aWRlIHlvdXIgb3duIGltcGxlbW5ldGF0aW9uCiAgICogaXQgaXMgYSB3aXNlIGlkZWEgdG8gc2V0IENMT1NVUkVfTk9fREVQUyB0byB0cnVlLCBvdGhlcndpc2UgdGhlIGRlcGVuZGVuY3kKICAgKiBmaWxlIGFuZCBhbGwgb2YgaXRzIGdvb2cuYWRkRGVwZW5kZW5jeSBjYWxscyB3aWxsIHVzZSB0aGUgZGVmYXVsdCBmYWN0b3J5LgogICAqIFlvdSBjYW4gY2FsbCBnb29nLmxvYWRDbG9zdXJlRGVwcyB0byBsb2FkIHRoZSBDbG9zdXJlIGRlcGVuZGVuY3kgZmlsZQogICAqIGxhdGVyLCBhZnRlciB5b3VyIGZhY3RvcnkgaXMgaW5qZWN0ZWQuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3lGYWN0b3J5fSBmYWN0b3J5CiAgICovCiAgZ29vZy5zZXREZXBlbmRlbmN5RmFjdG9yeSA9IGZ1bmN0aW9uKGZhY3RvcnkpIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLnNldERlcGVuZGVuY3lGYWN0b3J5KGZhY3RvcnkpOwogIH07CgoKICBpZiAoIWdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUykgewogICAgZ29vZy5kZWJ1Z0xvYWRlcl8ubG9hZENsb3N1cmVEZXBzKCk7CiAgfQoKCiAgLyoqCiAgICogQm9vdHN0cmFwcyB0aGUgZ2l2ZW4gbmFtZXNwYWNlcyBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIG9uY2UgdGhleSBhcmUKICAgKiBhdmFpbGFibGUgZWl0aGVyIHZpYSBnb29nLnJlcXVpcmUuIFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgdXNpbmcKICAgKiBgZ29vZy5yZXF1aXJlYCB0byBib290c3RyYXAgQ2xvc3VyZSBKYXZhU2NyaXB0LiBQcmV2aW91c2x5IGEgYGdvb2cucmVxdWlyZWAKICAgKiBpbiBhbiBIVE1MIGZpbGUgd291bGQgZ3VhcmFudGVlIHRoYXQgdGhlIHJlcXVpcmUnZCBuYW1lc3BhY2Ugd2FzIGF2YWlsYWJsZQogICAqIGluIHRoZSBuZXh0IGltbWVkaWF0ZSBzY3JpcHQgdGFnLiBXaXRoIEVTNiBtb2R1bGVzIHRoaXMgbm8gbG9uZ2VyIGEKICAgKiBndWFyYW50ZWUuCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBuYW1lc3BhY2VzCiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiA/fSBjYWxsYmFjayBGdW5jdGlvbiB0byBjYWxsIG9uY2UgYWxsIHRoZSBuYW1lc3BhY2VzCiAgICogICAgIGhhdmUgbG9hZGVkLiBBbHdheXMgY2FsbGVkIGFzeW5jaHJvbm91c2x5LgogICAqLwogIGdvb2cuYm9vdHN0cmFwID0gZnVuY3Rpb24obmFtZXNwYWNlcywgY2FsbGJhY2spIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLmJvb3RzdHJhcChuYW1lc3BhY2VzLCBjYWxsYmFjayk7CiAgfTsKfQoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IFRydXN0ZWQgVHlwZXMgcG9saWN5IG5hbWUuIElmIG5vbi1lbXB0eSB0aGVuIENsb3N1cmUgd2lsbAogKiB1c2UgVHJ1c3RlZCBUeXBlcy4KICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSA9CiAgICBnb29nLmRlZmluZSgnZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FJywgJycpOwoKCi8qKgogKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIuCiAqIEBwYXJhbSB7c3RyaW5nfSBzCiAqIEByZXR1cm4ge3N0cmluZ30KICogQHByaXZhdGUKICovCmdvb2cuaWRlbnRpdHlfID0gZnVuY3Rpb24ocykgewogIHJldHVybiBzOwp9OwoKCi8qKgogKiBDcmVhdGVzIFRydXN0ZWQgVHlwZXMgcG9saWN5IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci4KICogVGhlIHBvbGljeSBqdXN0IGJsZXNzZXMgYW55IHN0cmluZyBhcyBhIFRydXN0ZWQgVHlwZS4gSXQgaXMgbm90IHZpc2liaWxpdHkKICogcmVzdHJpY3RlZCBiZWNhdXNlIGFueW9uZSBjYW4gYWxzbyBjYWxsIFRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kgZGlyZWN0bHkuCiAqIEhvd2V2ZXIsIHRoZSBhbGxvd2VkIG5hbWVzIHNob3VsZCBiZSByZXN0cmljdGVkIGJ5IGEgSFRUUCBoZWFkZXIgYW5kIHRoZQogKiByZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgcG9saWN5IHNob3VsZCBiZSB2aXNpYmlsaXR5IHJlc3RyaWN0ZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAqIEByZXR1cm4gez9UcnVzdGVkVHlwZVBvbGljeX0KICovCmdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5ID0gZnVuY3Rpb24obmFtZSkgewogIHZhciBwb2xpY3kgPSBudWxsOwogIC8vIFRPRE8oa290byk6IFJlbW92ZSB3aW5kb3cuVHJ1c3RlZFR5cGVzIHZhcmlhbnQgd2hlbiB0aGUgbmV3ZXIgQVBJIHNoaXBzLgogIHZhciBwb2xpY3lGYWN0b3J5ID0gZ29vZy5nbG9iYWwudHJ1c3RlZFR5cGVzIHx8IGdvb2cuZ2xvYmFsLlRydXN0ZWRUeXBlczsKICBpZiAoIXBvbGljeUZhY3RvcnkgfHwgIXBvbGljeUZhY3RvcnkuY3JlYXRlUG9saWN5KSB7CiAgICByZXR1cm4gcG9saWN5OwogIH0KICAvLyBUcnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5IHRocm93cyBpZiBjYWxsZWQgd2l0aCBhIG5hbWUgdGhhdCBpcyBhbHJlYWR5CiAgLy8gcmVnaXN0ZXJlZCwgZXZlbiBpbiByZXBvcnQtb25seSBtb2RlLiBVbnRpbCB0aGUgQVBJIGNoYW5nZXMsIGNhdGNoIHRoZQogIC8vIGVycm9yIG5vdCB0byBicmVhayB0aGUgYXBwbGljYXRpb25zIGZ1bmN0aW9uYWxseS4gSW4gc3VjaCBjYXNlLCB0aGUgY29kZQogIC8vIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHJlZ3VsYXIgU2FmZSBUeXBlcy4KICAvLyBUT0RPKGtvdG8pOiBSZW1vdmUgY2F0Y2hpbmcgb25jZSBjcmVhdGVQb2xpY3kgQVBJIHN0b3BzIHRocm93aW5nLgogIHRyeSB7CiAgICBwb2xpY3kgPSBwb2xpY3lGYWN0b3J5LmNyZWF0ZVBvbGljeShuYW1lLCB7CiAgICAgIGNyZWF0ZUhUTUw6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVTY3JpcHQ6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVTY3JpcHRVUkw6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVVUkw6IGdvb2cuaWRlbnRpdHlfCiAgICB9KTsKICB9IGNhdGNoIChlKSB7CiAgICBnb29nLmxvZ1RvQ29uc29sZV8oZS5tZXNzYWdlKTsKICB9CiAgcmV0dXJuIHBvbGljeTsKfTsKCgovKiogQHByaXZhdGUgQGNvbnN0IHs/VHJ1c3RlZFR5cGVQb2xpY3l9ICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID0gZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FID8KICAgIGdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSArICcjYmFzZScpIDoKICAgIG51bGw7CgovLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUy1JUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgovLwovLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgR2VuSnNEZXBzLCBwbGVhc2UgZG8gbm90IGVkaXQuCgovLyBEaXNhYmxlIENsYW5nIGZvcm1hdHRlciBmb3IgdGhpcyBmaWxlLgovLyBTZWUgaHR0cDovL2dvby5nbC9TZGl3WkgKLy8gY2xhbmctZm9ybWF0IG9mZgoKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xsZWN0aW9ucy9zZXRzLmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHMnXSwgWydnb29nLmxhYnMuY29sbGVjdGlvbnMuaXRlcmFibGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY29sbGVjdGlvbnMvc2V0c190ZXN0LmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHNUZXN0J10sIFsnZ29vZy5jb2xsZWN0aW9ucy5zZXRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWQuanMnLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5BbHJlYWR5Q2FsbGVkRXJyb3InLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5DYW5jZWxlZEVycm9yJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnLi4vLi4vdGhpcmRfcGFydHkvY2xvc3VyZS9nb29nL21vY2hpa2l0L2FzeW5jL2RlZmVycmVkX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuZGVmZXJyZWRBc3luY1Rlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRsaXN0LmpzJywgWydnb29nLmFzeW5jLkRlZmVycmVkTGlzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJy4uLy4uL3RoaXJkX3BhcnR5L2Nsb3N1cmUvZ29vZy9tb2NoaWtpdC9hc3luYy9kZWZlcnJlZGxpc3RfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZExpc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuYXN5bmMuRGVmZXJyZWRMaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90by9wcm90by5qcycsIFsnZ29vZy5wcm90byddLCBbJ2dvb2cucHJvdG8uU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8vc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90by5TZXJpYWxpemVyJ10sIFsnZ29vZy5qc29uLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvL3NlcmlhbGl6ZXJfdGVzdC5qcycsIFsnZ29vZy5wcm90b1Rlc3QnXSwgWydnb29nLnByb3RvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYW5ub3VuY2VyLmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2Fubm91bmNlcl90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQW5ub3VuY2VyJywgJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uaWZyYW1lJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hcmlhLmpzJywgWydnb29nLmExMXkuYXJpYSddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hMTF5LmFyaWEuZGF0YXRhYmxlcycsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYXJpYV90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hdHRyaWJ1dGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5BdXRvQ29tcGxldGVWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuQ2hlY2tlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Ecm9wRWZmZWN0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkV4cGFuZGVkVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkdyYWJiZWRWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuSW52YWxpZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuT3JpZW50YXRpb25WYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuUHJlc3NlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5SZWxldmFudFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5TZWxlY3RlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Tb3J0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2RhdGF0YWJsZXMuanMnLCBbJ2dvb2cuYTExeS5hcmlhLmRhdGF0YWJsZXMnXSwgWydnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL3JvbGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5Sb2xlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXJyYXkvYXJyYXkuanMnLCBbJ2dvb2cuYXJyYXknXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FycmF5L2FycmF5X3Rlc3QuanMnLCBbJ2dvb2cuYXJyYXlUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczcnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzLmpzJywgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJ10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRvbS5Ob2RlVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuYXNzZXJ0c1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9hbmltYXRpb25kZWxheS5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvYW5pbWF0aW9uZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9jb25kaXRpb25hbGRlbGF5LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3luYy5EZWxheSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvY29uZGl0aW9uYWxkZWxheV90ZXN0LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXlUZXN0J10sIFsnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlYm91bmNlci5qcycsIFsnZ29vZy5hc3luYy5EZWJvdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVib3VuY2VyX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRGVib3VuY2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWJvdW5jZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlbGF5LmpzJywgWydnb29nLkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5EZWxheVRlc3QnXSwgWydnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0LmpzJywgWydnb29nLmFzeW5jLkZyZWVMaXN0J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRnJlZUxpc3RUZXN0J10sIFsnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvbmV4dHRpY2suanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL25leHR0aWNrX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2tUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuLmpzJywgWydnb29nLmFzeW5jLnJ1biddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuX25leHRfdGlja190ZXN0LmpzJywgWydnb29nLmFzeW5jLnJ1bk5leHRUaWNrVGVzdCddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9ydW5fdGVzdC5qcycsIFsnZ29vZy5hc3luYy5ydW5UZXN0J10sIFsnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy90aHJvdHRsZS5qcycsIFsnZ29vZy5UaHJvdHRsZScsICdnb29nLmFzeW5jLlRocm90dGxlJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL3Rocm90dGxlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuVGhyb3R0bGVUZXN0J10sIFsnZ29vZy5hc3luYy5UaHJvdHRsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy93b3JrcXVldWUuanMnLCBbJ2dvb2cuYXN5bmMuV29ya0l0ZW0nLCAnZ29vZy5hc3luYy5Xb3JrUXVldWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvd29ya3F1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlVGVzdCddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlLmpzJywgWydnb29nJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYmFzZV9tb2R1bGVfdGVzdC5qcycsIFsnZ29vZy5iYXNlTW9kdWxlVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy50ZXN0X21vZHVsZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlX3Rlc3QuanMnLCBbJ2dvb2cuYmFzZVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdF9tb2R1bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9hbHBoYS5qcycsIFsnZ29vZy5jb2xvci5hbHBoYSddLCBbJ2dvb2cuY29sb3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NvbG9yL2FscGhhX3Rlc3QuanMnLCBbJ2dvb2cuY29sb3IuYWxwaGFUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNvbG9yLmFscGhhJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvci5qcycsIFsnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLkhzbCcsICdnb29nLmNvbG9yLkhzdicsICdnb29nLmNvbG9yLlJnYiddLCBbJ2dvb2cuY29sb3IubmFtZXMnLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvcl90ZXN0LmpzJywgWydnb29nLmNvbG9yVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLm5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9uYW1lcy5qcycsIFsnZ29vZy5jb2xvci5uYW1lcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Flcy5qcycsIFsnZ29vZy5jcnlwdC5BZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5CbG9ja0NpcGhlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYWVzX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuQWVzVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5BZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2FyYzQuanMnLCBbJ2dvb2cuY3J5cHQuQXJjNCddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYXJjNF90ZXN0LmpzJywgWydnb29nLmNyeXB0LkFyYzRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2U2NC5qcycsIFsnZ29vZy5jcnlwdC5iYXNlNjQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmFzZTY0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZTY0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5iYXNlNjQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuLmpzJywgWydnb29nLmNyeXB0LmJhc2VOJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZU5UZXN0J10sIFsnZ29vZy5jcnlwdC5iYXNlTicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlci5qcycsIFsnZ29vZy5jcnlwdC5CbG9iSGFzaGVyJywgJ2dvb2cuY3J5cHQuQmxvYkhhc2hlci5FdmVudFR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcycsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlcl90ZXN0LmpzJywgWydnb29nLmNyeXB0LkJsb2JIYXNoZXJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkJsb2JIYXNoZXInLCAnZ29vZy5jcnlwdC5NZDUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jsb2NrY2lwaGVyLmpzJywgWydnb29nLmNyeXB0LkJsb2NrQ2lwaGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYnl0ZXN0cmluZ19wZXJmLmpzJywgWydnb29nLmNyeXB0LmJ5dGVBcnJheVRvU3RyaW5nUGVyZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiYy5qcycsIFsnZ29vZy5jcnlwdC5DYmMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQmxvY2tDaXBoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiY190ZXN0LmpzJywgWydnb29nLmNyeXB0LkNiY1Rlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQWVzJywgJ2dvb2cuY3J5cHQuQ2JjJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdC5qcycsIFsnZ29vZy5jcnlwdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdF90ZXN0LmpzJywgWydnb29nLmNyeXB0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2N0ci5qcycsIFsnZ29vZy5jcnlwdC5DdHInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jdHJfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5DdHJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFlcycsICdnb29nLmNyeXB0LkN0cicsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaC5qcycsIFsnZ29vZy5jcnlwdC5IYXNoJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaDMyLmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMiddLCBbJ2dvb2cuY3J5cHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2gzMl90ZXN0LmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMlRlc3QnXSwgWydnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2h0ZXN0ZXIuanMnLCBbJ2dvb2cuY3J5cHQuaGFzaFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jcnlwdCcsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZScsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9obWFjLmpzJywgWydnb29nLmNyeXB0LkhtYWMnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2htYWNfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5IbWFjVGVzdCddLCBbJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnLCAnZ29vZy5jcnlwdC5oYXNoVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDUuanMnLCBbJ2dvb2cuY3J5cHQuTWQ1J10sIFsnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDVfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5NZDVUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0Lk1kNScsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMi5qcycsIFsnZ29vZy5jcnlwdC5wYmtkZjInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMl90ZXN0LmpzJywgWydnb29nLmNyeXB0LnBia2RmMlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQucGJrZGYyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGExLmpzJywgWydnb29nLmNyeXB0LlNoYTEnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTFfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGExVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMi5qcycsIFsnZ29vZy5jcnlwdC5TaGEyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjQuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMjI0J10sIFsnZ29vZy5jcnlwdC5TaGEyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjRfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyMjRUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LlNoYTIyNCcsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Ni5qcycsIFsnZ29vZy5jcnlwdC5TaGEyNTYnXSwgWydnb29nLmNyeXB0LlNoYTInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Nl90ZXN0LmpzJywgWydnb29nLmNyeXB0LlNoYTI1NlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMjU2JywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMl82NGJpdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyXzY0Yml0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJywgJ2dvb2cubWF0aC5Mb25nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyXzY0Yml0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdF90ZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMzg0JywgJ2dvb2cuY3J5cHQuU2hhNTEyJywgJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NicsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTM4NC5qcycsIFsnZ29vZy5jcnlwdC5TaGEzODQnXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMi5qcycsIFsnZ29vZy5jcnlwdC5TaGE1MTInXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMl8yNTYuanMnLCBbJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NiddLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb20uanMnLCBbJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb21fdGVzdC5qcycsIFsnZ29vZy5jc3NvbVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vaWZyYW1lL3N0eWxlLmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNzc29tJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Nzc29tL2lmcmFtZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZVRlc3QnXSwgWydnb29nLmNzc29tJywgJ2dvb2cuY3Nzb20uaWZyYW1lLnN0eWxlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFtYW5hZ2VyLmpzJywgWydnb29nLmRzLkRhdGFNYW5hZ2VyJ10sIFsnZ29vZy5kcy5CYXNpY05vZGVMaXN0JywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFzb3VyY2UuanMnLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuRGF0YU5vZGVMaXN0JywgJ2dvb2cuZHMuRW1wdHlOb2RlTGlzdCcsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuVXRpbCcsICdnb29nLmRzLmxvZ2dlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzRGF0YVNvdXJjZVRlc3QnXSwgWydnb29nLmRvbS54bWwnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkpzRGF0YVNvdXJjZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuWG1sRGF0YVNvdXJjZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS9leHByLmpzJywgWydnb29nLmRzLkV4cHInXSwgWydnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2V4cHJfdGVzdC5qcycsIFsnZ29vZy5kcy5FeHByVGVzdCddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuSnNEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZS5qcycsIFsnZ29vZy5kcy5BYnN0cmFjdEZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3RMaXN0Tm9kZScsICdnb29nLmRzLlByaW1pdGl2ZUZhc3REYXRhTm9kZSddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5EYXRhTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZV90ZXN0LmpzJywgWydnb29nLmRzLkZhc3REYXRhTm9kZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuRmFzdERhdGFOb2RlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Kc1Byb3BlcnR5RGF0YVNvdXJjZSddLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFNYW5hZ2VyJywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuZHMuTG9hZFN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzb25kYXRhc291cmNlLmpzJywgWydnb29nLmRzLkpzb25EYXRhU291cmNlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Mb2FkU3RhdGUnLCAnZ29vZy5kcy5sb2dnZXInLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLmxvZ2dlcicsICdnb29nLmV2ZW50cycsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzWG1sSHR0cERhdGFTb3VyY2VUZXN0J10sIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS94bWxkYXRhc291cmNlLmpzJywgWydnb29nLmRzLlhtbERhdGFTb3VyY2UnLCAnZ29vZy5kcy5YbWxIdHRwRGF0YVNvdXJjZSddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuTG9hZFN0YXRlJywgJ2dvb2cuZHMubG9nZ2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGUuanMnLCBbJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kYXRlX3Rlc3QuanMnLCBbJ2dvb2cuZGF0ZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZWxpa2UuanMnLCBbJ2dvb2cuZGF0ZS5EYXRlTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZXJhbmdlLmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UuSXRlcmF0b3InLCAnZ29vZy5kYXRlLkRhdGVSYW5nZS5TdGFuZGFyZERhdGVSYW5nZUtleXMnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuSW50ZXJ2YWwnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGVyYW5nZV90ZXN0LmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZHVyYXRpb24uanMnLCBbJ2dvb2cuZGF0ZS5kdXJhdGlvbiddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uTWVzc2FnZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kdXJhdGlvbl90ZXN0LmpzJywgWydnb29nLmRhdGUuZHVyYXRpb25UZXN0J10sIFsnZ29vZy5kYXRlLmR1cmF0aW9uJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlLmpzJywgWydnb29nLmRhdGUucmVsYXRpdmUnLCAnZ29vZy5kYXRlLnJlbGF0aXZlLlRpbWVEZWx0YUZvcm1hdHRlcicsICdnb29nLmRhdGUucmVsYXRpdmUuVW5pdCddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9yZWxhdGl2ZV90ZXN0LmpzJywgWydnb29nLmRhdGUucmVsYXRpdmVUZXN0J10sIFsnZ29vZy5kYXRlLnJlbGF0aXZlQ29tbW9uVGVzdHMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlY29tbW9udGVzdHMuanMnLCBbJ2dvb2cuZGF0ZS5yZWxhdGl2ZUNvbW1vblRlc3RzJ10sIFsnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5yZWxhdGl2ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3V0Y2RhdGV0aW1lLmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWUnXSwgWydnb29nLmRhdGUnLCAnZ29vZy5kYXRlLkRhdGUnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS91dGNkYXRldGltZV90ZXN0LmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWVUZXN0J10sIFsnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5VdGNEYXRlVGltZScsICdnb29nLmRhdGUubW9udGgnLCAnZ29vZy5kYXRlLndlZWtEYXknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RiL2N1cnNvci5qcycsIFsnZ29vZy5kYi5DdXJzb3InXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9kYi5qcycsIFsnZ29vZy5kYicsICdnb29nLmRiLkJsb2NrZWRDYWxsYmFjaycsICdnb29nLmRiLlVwZ3JhZGVOZWVkZWRDYWxsYmFjayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5UcmFuc2FjdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvZGJfdGVzdC5qcycsIFsnZ29vZy5kYlRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRiJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRiLlRyYW5zYWN0aW9uJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9lcnJvci5qcycsIFsnZ29vZy5kYi5Eb21FcnJvckxpa2UnLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkVycm9yLkVycm9yQ29kZScsICdnb29nLmRiLkVycm9yLkVycm9yTmFtZScsICdnb29nLmRiLkVycm9yLlZlcnNpb25DaGFuZ2VCbG9ja2VkRXJyb3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvaW5kZXguanMnLCBbJ2dvb2cuZGIuSW5kZXgnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9pbmRleGVkZGIuanMnLCBbJ2dvb2cuZGIuSW5kZXhlZERiJ10sIFsnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLk9iamVjdFN0b3JlJywgJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIva2V5cmFuZ2UuanMnLCBbJ2dvb2cuZGIuS2V5UmFuZ2UnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9vYmplY3RzdG9yZS5qcycsIFsnZ29vZy5kYi5PYmplY3RTdG9yZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kYi5DdXJzb3InLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkluZGV4JywgJ2dvb2cuZGIuS2V5UmFuZ2UnLCAnZ29vZy5kZWJ1ZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvdHJhbnNhY3Rpb24uanMnLCBbJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5kYi5UcmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1vZGUnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5PYmplY3RTdG9yZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuQ29uc29sZSddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGVfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Db25zb2xlVGVzdCddLCBbJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RlYnVnLmpzJywgWydnb29nLmRlYnVnJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWdfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Z1Rlc3QnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuZXJyb3Jjb250ZXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZWJ1Z3dpbmRvdy5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdyddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWd3aW5kb3dfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvd1Rlc3QnXSwgWydnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzLmpzJywgWydnb29nLmRlYnVnLkRldkNzcycsICdnb29nLmRlYnVnLkRldkNzcy5Vc2VyQWdlbnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jc3NvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRGV2Q3NzVGVzdCddLCBbJ2dvb2cuZGVidWcuRGV2Q3NzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RldmNzcy9kZXZjc3NydW5uZXIuanMnLCBbJ2dvb2cuZGVidWcuZGV2Q3NzUnVubmVyJ10sIFsnZ29vZy5kZWJ1Zy5EZXZDc3MnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RpdmNvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuRGl2Q29uc29sZSddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VuaGFuY2VlcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnRW5oYW5jZUVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VudHJ5cG9pbnRyZWdpc3RyeS5qcycsIFsnZ29vZy5kZWJ1Zy5FbnRyeVBvaW50TW9uaXRvcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeSddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZW50cnlwb2ludHJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5VGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvci5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3Jjb250ZXh0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Vycm9yY29udGV4dF90ZXN0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dFRlc3QnXSwgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlci5Qcm90ZWN0ZWRGdW5jdGlvbkVycm9yJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLlRyYWNlJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyQXN5bmNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJ3ZWFrZGVwLmpzJywgWydnb29nLmRlYnVnLmVycm9ySGFuZGxlcldlYWtEZXAnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcnJlcG9ydGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLkV4Y2VwdGlvbkV2ZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmxvZycsICdnb29nLm5ldC5YaHJJbycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVyaS51dGlscycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JyZXBvcnRlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5lcnJvcmNvbnRleHQnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZmFuY3l3aW5kb3cuanMnLCBbJ2dvb2cuZGVidWcuRmFuY3lXaW5kb3cnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Zvcm1hdHRlci5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXInLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuVGV4dEZvcm1hdHRlciddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5SZWxhdGl2ZVRpbWVQcm92aWRlcicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9mb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheS5qcycsIFsnZ29vZy5kZWJ1Zy5GcHNEaXNwbGF5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheV90ZXN0LmpzJywgWydnb29nLmRlYnVnLkZwc0Rpc3BsYXlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRlYnVnLkZwc0Rpc3BsYXknLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXIuanMnLCBbJ2dvb2cuZGVidWcuTG9nQnVmZmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2xvZ2dlci5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2FibGUnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nQnVmZmVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dnZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dnZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmQuanMnLCBbJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvbG9ncmVjb3Jkc2VyaWFsaXplci5qcycsIFsnZ29vZy5kZWJ1Zy5sb2dSZWNvcmRTZXJpYWxpemVyJ10sIFsnZ29vZy5kZWJ1Zy5Mb2dSZWNvcmQnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmRzZXJpYWxpemVyX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcubG9nUmVjb3JkU2VyaWFsaXplclRlc3QnXSwgWydnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLmxvZ1JlY29yZFNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3JlbGF0aXZldGltZXByb3ZpZGVyLmpzJywgWydnb29nLmRlYnVnLlJlbGF0aXZlVGltZVByb3ZpZGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvdHJhY2VyLmpzJywgWydnb29nLmRlYnVnLlN0b3BUcmFjZURldGFpbCcsICdnb29nLmRlYnVnLlRyYWNlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5pdGVyJywgJ2dvb2cubG9nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3RyYWNlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLlRyYWNlVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5UcmFjZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlZmluZWNsYXNzX3Rlc3QuanMnLCBbJ2dvb2cuZGVmaW5lQ2xhc3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlbGVnYXRlL2RlbGVnYXRlcmVnaXN0cnkuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVsZWdhdGUvZGVsZWdhdGVzLmpzJywgWydnb29nLmRlbGVnYXRlLmRlbGVnYXRlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXNfdGVzdC5qcycsIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXNUZXN0J10sIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGUuanMnLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kaXNwb3NlQWxsJ10sIFsnZ29vZy5kaXNwb3NhYmxlLklEaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGVfdGVzdC5qcycsIFsnZ29vZy5EaXNwb3NhYmxlVGVzdCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Rpc3Bvc2FibGUvaWRpc3Bvc2FibGUuanMnLCBbJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdG11bHRpcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLkFic3RyYWN0TXVsdGlSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uUmFuZ2VUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYWJzdHJhY3RyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2FuaW1hdGlvbmZyYW1lL2FuaW1hdGlvbmZyYW1lLmpzJywgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLmRvbS5hbmltYXRpb25GcmFtZS5TcGVjJywgJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLlN0YXRlJ10sIFsnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUucG9seWZpbGwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbmltYXRpb25mcmFtZS9hbmltYXRpb25mcmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5BbmltYXRpb25GcmFtZVRlc3QnXSwgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYW5pbWF0aW9uZnJhbWUvcG9seWZpbGwuanMnLCBbJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLnBvbHlmaWxsJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZS5qcycsIFsnZ29vZy5kb20uYW5ub3RhdGUnLCAnZ29vZy5kb20uYW5ub3RhdGUuQW5ub3RhdGVGbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZV90ZXN0LmpzJywgWydnb29nLmRvbS5hbm5vdGF0ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmFubm90YXRlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Fzc2VydHMuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHMnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHNUZXN0J10sIFsnZ29vZy5kb20uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2F0dHIuanMnLCBbJ2dvb2cuZG9tLkF0dHInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VyZmVhdHVyZV90ZXN0LmpzJywgWydnb29nLmRvbS5Ccm93c2VyRmVhdHVyZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcnJhbmdlL2Jyb3dzZXJyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5FcnJvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5HZWNrb1JhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5JZVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5PcGVyYVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuV2ViS2l0UmFuZ2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvYnJvd3NlcnJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvZ2Vja29yYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkdlY2tvUmFuZ2UnXSwgWydnb29nLmRvbS5icm93c2VycmFuZ2UuVzNjUmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvaWVyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkllUmFuZ2UnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9vcGVyYXJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuT3BlcmFSYW5nZSddLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS93M2NyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2Uvd2Via2l0cmFuZ2UuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XZWJLaXRSYW5nZSddLCBbJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnVmZmVyZWR2aWV3cG9ydHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5CdWZmZXJlZFZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9idWZmZXJlZHZpZXdwb3J0c2l6ZW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uQnVmZmVyZWRWaWV3cG9ydFNpemVNb25pdG9yVGVzdCddLCBbJ2dvb2cuZG9tLkJ1ZmZlcmVkVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmRvbS5WaWV3cG9ydFNpemVNb25pdG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NsYXNzZXMuanMnLCBbJ2dvb2cuZG9tLmNsYXNzZXMnXSwgWydnb29nLmFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vY2xhc3Nlc190ZXN0LmpzJywgWydnb29nLmRvbS5jbGFzc2VzX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3QuanMnLCBbJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3RfdGVzdC5qcycsIFsnZ29vZy5kb20uY2xhc3NsaXN0X3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZS5qcycsIFsnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLkNvbnRyb2xSYW5nZUl0ZXJhdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdE11bHRpUmFuZ2UnLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5SYW5nZUl0ZXJhdG9yJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5Db250cm9sUmFuZ2VUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldC5qcycsIFsnZ29vZy5kb20uZGF0YXNldCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldF90ZXN0LmpzJywgWydnb29nLmRvbS5kYXRhc2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmRhdGFzZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9kb20uanMnLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFwcGVuZGFibGUnLCAnZ29vZy5kb20uRG9tSGVscGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV9jb21waWxlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkRvbUNvbXBpbGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV90ZXN0LmpzJywgWydnb29nLmRvbS5kb21fdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uRm9udFNpemVNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkZvbnRTaXplTW9uaXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXMuanMnLCBbJ2dvb2cuZG9tLmZvcm1zJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cud2luZG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXNfdGVzdC5qcycsIFsnZ29vZy5kb20uZm9ybXNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uZm9ybXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuLmpzJywgWydnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cuZG9tLmZ1bGxzY3JlZW4uRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmZ1bGxzY3JlZW5fdGVzdCddLCBbJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaHRtbGVsZW1lbnQuanMnLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lmcmFtZS5qcycsIFsnZ29vZy5kb20uaWZyYW1lJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9pZnJhbWVfdGVzdC5qcycsIFsnZ29vZy5kb20uaWZyYW1lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZS5qcycsIFsnZ29vZy5kb20uSW5wdXRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZV90ZXN0LmpzJywgWydnb29nLmRvbS5JbnB1dFR5cGVUZXN0J10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaXRlci5qcycsIFsnZ29vZy5kb20uaXRlci5BbmNlc3Rvckl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuQ2hpbGRJdGVyYXRvcicsICdnb29nLmRvbS5pdGVyLlNpYmxpbmdJdGVyYXRvciddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2l0ZXJfdGVzdC5qcycsIFsnZ29vZy5kb20uaXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5pdGVyLkFuY2VzdG9ySXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5DaGlsZEl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuU2libGluZ0l0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9tdWx0aXJhbmdlLmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RNdWx0aVJhbmdlJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbXVsdGlyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3InXSwgWydnb29nLmRvbS5UYWdJdGVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL25vZGVpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZUl0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0LmpzJywgWydnb29nLmRvbS5Ob2RlT2Zmc2V0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0X3Rlc3QuanMnLCBbJ2dvb2cuZG9tLk5vZGVPZmZzZXRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZXR5cGUuanMnLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vYWJzdHJhY3RwYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLkFic3RyYWN0UGF0dGVybiddLCBbJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9hbGxjaGlsZHJlbi5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5BbGxDaGlsZHJlbiddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9jYWxsYmFjay9jYWxsYmFjay5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svY291bnRlci5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5Db3VudGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svdGVzdC5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0J10sIFsnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2NoaWxkbWF0Y2hlcy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnXSwgWydnb29nLmRvbS5wYXR0ZXJuLkFsbENoaWxkcmVuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9lbmR0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRW5kVGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2Z1bGx0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRnVsbFRhZyddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uU3RhcnRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL21hdGNoZXIuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hlciddLCBbJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLm1hdGNoZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5wYXR0ZXJuLkVuZFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLkZ1bGxUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaGVyJywgJ2dvb2cuZG9tLnBhdHRlcm4uUmVwZWF0JywgJ2dvb2cuZG9tLnBhdHRlcm4uU2VxdWVuY2UnLCAnZ29vZy5kb20ucGF0dGVybi5TdGFydFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLmNhbGxiYWNrLkNvdW50ZXInLCAnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0JywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9ub2RldHlwZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5Ob2RlVHlwZSddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9wYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcGF0dGVybl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWxsQ2hpbGRyZW4nLCAnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnLCAnZ29vZy5kb20ucGF0dGVybi5FbmRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5GdWxsVGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTm9kZVR5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5SZXBlYXQnLCAnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZScsICdnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uVGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcmVwZWF0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlJlcGVhdCddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9zZXF1ZW5jZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZSddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5BYnN0cmFjdFBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3N0YXJ0dGFnLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3RhZy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi90ZXh0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlRleHQnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLlJhbmdlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uTXVsdGlSYW5nZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5SYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZWVuZHBvaW50LmpzJywgWydnb29nLmRvbS5SYW5nZUVuZHBvaW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhZmUuanMnLCBbJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbiddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2FmZV90ZXN0LmpzJywgWydnb29nLmRvbS5zYWZlVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkY2FyZXRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9zYXZlZGNhcmV0cmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2F2ZWRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NlbGVjdGlvbi5qcycsIFsnZ29vZy5kb20uc2VsZWN0aW9uJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2VsZWN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnNlbGVjdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvci5qcycsIFsnZ29vZy5kb20uVGFnSXRlcmF0b3InLCAnZ29vZy5kb20uVGFnV2Fsa1R5cGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdJdGVyYXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZS5qcycsIFsnZ29vZy5kb20uVGFnTmFtZSddLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdOYW1lVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzLmpzJywgWydnb29nLmRvbS50YWdzJ10sIFsnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnRhZ3NUZXN0J10sIFsnZ29vZy5kb20udGFncycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnQuanMnLCBbJ2dvb2cuZG9tLnRleHRBc3NlcnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnRfdGVzdC5qcycsIFsnZ29vZy5kb20udGV4dGFzc2VydF90ZXN0J10sIFsnZ29vZy5kb20udGV4dEFzc2VydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZS5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlRleHRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGV4dFJhbmdlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlaXRlcmF0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdXJpLmpzJywgWydnb29nLmRvbS51cmknXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3VyaV90ZXN0LmpzJywgWydnb29nLmRvbS51cmlUZXN0J10sIFsnZ29vZy5kb20udXJpJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92ZW5kb3IuanMnLCBbJ2dvb2cuZG9tLnZlbmRvciddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdmVuZG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnZlbmRvclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3ZpZXdwb3J0c2l6ZW1vbml0b3IuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92aWV3cG9ydHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20uVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3htbC5qcycsIFsnZ29vZy5kb20ueG1sJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS94bWxfdGVzdC5qcycsIFsnZ29vZy5kb20ueG1sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20ueG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy5lZGl0b3IuZGVmaW5lcycsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2Jyb3dzZXJmZWF0dXJlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXIuanMnLCBbJ2dvb2cuZWRpdG9yLkNsaWNrVG9FZGl0V3JhcHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyJywgJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvY29tbWFuZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29tbWFuZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29udGVudEVkaXRhYmxlRmllbGQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZCcsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9kZWZpbmVzLmpzJywgWydnb29nLmVkaXRvci5kZWZpbmVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ZpZWxkLmpzJywgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5GaWVsZC5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvZmllbGRfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuZmllbGRfdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1cy5qcycsIFsnZ29vZy5lZGl0b3IuZm9jdXMnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1c190ZXN0LmpzJywgWydnb29nLmVkaXRvci5mb2N1c1Rlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9pY29udGVudC5qcycsIFsnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ljb250ZW50X3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLmljb250ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvbGluay5qcycsIFsnZ29vZy5lZGl0b3IuTGluayddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2xpbmtfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuTGlua1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlLmpzJywgWydnb29nLmVkaXRvci5ub2RlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pdGVyLkNoaWxkSXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5TaWJsaW5nSXRlcmF0b3InLCAnZ29vZy5pdGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLm5vZGVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5QbHVnaW4nXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW5JbXBsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luX2ltcGwuanMnLCBbJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuUGx1Z2luVGVzdCddLCBbJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW4uanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdEJ1YmJsZVBsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdGRpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0RGlhbG9nUGx1Z2luLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmV2ZW50cycsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9iYXNpY3RleHRmb3JtYXR0ZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyLkNPTU1BTkQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Jhc2ljdGV4dGZvcm1hdHRlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CYXNpY1RleHRGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJsb2NrcXVvdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Vtb3RpY29ucy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnMnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbW90aWNvbnNfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnNUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW1vdGljb25zJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2VudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlT2Zmc2V0JywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmcuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5pMThuLmJpZGknLCAnZ29vZy5pMThuLnVDaGFyJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmdfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5GaXJzdFN0cm9uZ1Rlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvaGVhZGVyZm9ybWF0dGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlciddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9oZWFkZXJmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5IZWFkZXJGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlcicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGUuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUuQWN0aW9uJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0QnViYmxlUGx1Z2luJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rQnViYmxlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua2RpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nUGx1Z2luJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3REaWFsb2dQbHVnaW4nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtEaWFsb2dQbHVnaW4nLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua3Nob3J0Y3V0cGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtTaG9ydGN1dFBsdWdpbiddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9saW5rc2hvcnRjdXRwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW5UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW4nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpc3R0YWJoYW5kbGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpc3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlzdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaXN0VGFiSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlzdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbG9yZW1pcHN1bS5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9sb3JlbWlwc3VtX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5SZW1vdmVGb3JtYXR0aW5nJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZ190ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0VGFiSGFuZGxlcicsICdnb29nLmVkaXRvci5yYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlNwYWNlc1RhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3RhYmxlZWRpdG9yLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5UYWJsZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWJsZWVkaXRvcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWJsZUVkaXRvcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWdvbmVudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdGFnb25lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLlRhZ09uRW50ZXJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9NYW5hZ2VyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9TdGF0ZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5icm93c2VycmFuZ2UnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG8nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvbWFuYWdlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb21hbmFnZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb3N0YXRlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdW5kb3JlZG9zdGF0ZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGVUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcmFuZ2UuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnJhbmdlLlBvaW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3JhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5lZGl0b3IucmFuZ2UuUG9pbnQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3NlYW1sZXNzZmllbGQuanMnLCBbJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnXSwgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnN0eWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc2VhbWxlc3NmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5zZWFtbGVzc2ZpZWxkX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5TZWFtbGVzc0ZpZWxkJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tSYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3N0eWxlLmpzJywgWydnb29nLmVkaXRvci5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc3R5bGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3Iuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvdGFibGUuanMnLCBbJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cuZWRpdG9yLlRhYmxlQ2VsbCcsICdnb29nLmVkaXRvci5UYWJsZVJvdyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci90YWJsZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5UYWJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRXcmFwcGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2FjdGlvbmhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkFjdGlvbkV2ZW50JywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQWN0aW9uSGFuZGxlci5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuQmVmb3JlQWN0aW9uRXZlbnQnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5BY3Rpb25IYW5kbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJldmVudC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5Nb3VzZUJ1dHRvbicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9icm93c2VyZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJmZWF0dXJlLmpzJywgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZSddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnQuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50TGlrZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cy5FdmVudElkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlclRlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRpZC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHMuanMnLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkNhcHR1cmVTaW11bGF0aW9uTW9kZScsICdnb29nLmV2ZW50cy5LZXknLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuTGlzdGVuZXJNYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHNUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5DYXB0dXJlU2ltdWxhdGlvbk1vZGUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0X3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHRhcmdldF92aWFfZ29vZ2V2ZW50c190ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldEdvb2dFdmVudHNUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0YXJnZXRfdmlhX3czY2ludGVyZmFjZV90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldFczQ1Rlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0dGVzdGVyLmpzJywgWydnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLk1vdXNlRXZlbnRzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc1RvdWNoRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyVG91Y2hGYWxsYmFja0V2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZVRlc3QnXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuUG9pbnRlckZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJUb3VjaEZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFdyYXBwZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZmlsZWRyb3BoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5GaWxlRHJvcEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9maWxlZHJvcGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZm9jdXNoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Gb2N1c0hhbmRsZXInLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2ltZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW1lSGFuZGxlci5FdmVudCcsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9pbWVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlci5FdmVudFR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2tleWNvZGVzLmpzJywgWydnb29nLmV2ZW50cy5LZXlDb2RlcyddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5Y29kZXNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuS2V5Q29kZXNUZXN0J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXloYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLktleUV2ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXluYW1lcy5qcycsIFsnZ29vZy5ldmVudHMuS2V5TmFtZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5cy5qcycsIFsnZ29vZy5ldmVudHMuS2V5cyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuYWJsZS5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlS2V5J10sIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmFibGVfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVRlc3QnXSwgWydnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJ10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZUtleSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmVybWFwLmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuTGlzdGVuZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9saXN0ZW5lcm1hcF90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL21vdXNld2hlZWxoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Nb3VzZVdoZWVsRXZlbnQnLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXInLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubWF0aCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbW91c2V3aGVlbGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5Nb3VzZVdoZWVsSGFuZGxlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuT25saW5lSGFuZGxlcicsICdnb29nLmV2ZW50cy5PbmxpbmVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL29ubGluZWxpc3RlbmVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9wYXN0ZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLmV2ZW50cy5QYXN0ZUhhbmRsZXIuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlci5TdGF0ZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubG9nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvcGFzdGVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxldmVudC5qcycsIFsnZ29vZy5ldmVudHMuV2hlZWxFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy93aGVlbGhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLldoZWVsRXZlbnQnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5XaGVlbEhhbmRsZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2VtYWlsYWRkcmVzcy5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9lbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0LmpzJywgWydnb29nLmZvcm1hdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mb3JtYXQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlci5qcycsIFsnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXInLCAnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXIuQnVmZmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlcl90ZXN0LmpzJywgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlclRlc3QnXSwgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3MuanMnLCBbJ2dvb2cuZm9ybWF0LkludGVybmF0aW9uYWxpemVkRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuSW50ZXJuYXRpb25hbGl6ZWRFbWFpbEFkZHJlc3NUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmZvcm1hdC5JbnRlcm5hdGlvbmFsaXplZEVtYWlsQWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyLmpzJywgWydnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlcicsICdnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlci5TYWZlSHRtbERlbGltaXRlcnMnLCAnZ29vZy5mb3JtYXQuSnNvblByZXR0eVByaW50ZXIuVGV4dERlbGltaXRlcnMnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLmZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyX3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyVGVzdCddLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeS5qcycsIFsnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5LkJlaGF2aW9yJywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5GaWxlRW50cnknXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeWltcGwuanMnLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZUVudHJ5SW1wbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVFbnRyeScsICdnb29nLmZzLkZpbGVXcml0ZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2Vycm9yLmpzJywgWydnb29nLmZzLkRPTUVycm9yTGlrZScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRXJyb3IuRXJyb3JDb2RlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2ZpbGVyZWFkZXIuanMnLCBbJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVSZWFkZXIuRXZlbnRUeXBlJywgJ2dvb2cuZnMuRmlsZVJlYWRlci5SZWFkeVN0YXRlJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXNhdmVyLmpzJywgWydnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLmZzLkZpbGVTYXZlci5FdmVudFR5cGUnLCAnZ29vZy5mcy5GaWxlU2F2ZXIuUmVhZHlTdGF0ZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtLmpzJywgWydnb29nLmZzLkZpbGVTeXN0ZW0nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtaW1wbC5qcycsIFsnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCddLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZVN5c3RlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXdyaXRlci5qcycsIFsnZ29vZy5mcy5GaWxlV3JpdGVyJ10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnMuanMnLCBbJ2dvb2cuZnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCcsICdnb29nLmZzLnVybCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnNfdGVzdC5qcycsIFsnZ29vZy5mc1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvcHJvZ3Jlc3NldmVudC5qcycsIFsnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL3VybC5qcycsIFsnZ29vZy5mcy51cmwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvdXJsX3Rlc3QuanMnLCBbJ2dvb2cudXJsVGVzdCddLCBbJ2dvb2cuZnMudXJsJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zLmpzJywgWydnb29nLmZ1bmN0aW9ucyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zX3Rlc3QuanMnLCBbJ2dvb2cuZnVuY3Rpb25zVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ0Ryb3BFdmVudCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3BfdGVzdC5qcycsIFsnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wJywgJ2dvb2cuZnguRHJhZ0Ryb3BJdGVtJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW0vYW5pbS5qcycsIFsnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCBbJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbS9hbmltX3Rlc3QuanMnLCBbJ2dvb2cuZnguYW5pbVRlc3QnXSwgWydnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5hbmltJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9hbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguQW5pbWF0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LkFuaW1hdGlvbi5TdGF0ZScsICdnb29nLmZ4LkFuaW1hdGlvbkV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbWF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlLmpzJywgWydnb29nLmZ4LkFuaW1hdGlvblBhcmFsbGVsUXVldWUnLCAnZ29vZy5meC5BbmltYXRpb25RdWV1ZScsICdnb29nLmZ4LkFuaW1hdGlvblNlcmlhbFF1ZXVlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uUXVldWVUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb25QYXJhbGxlbFF1ZXVlJywgJ2dvb2cuZnguQW5pbWF0aW9uU2VyaWFsUXVldWUnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguYW5pbScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3MzL2Z4LmpzJywgWydnb29nLmZ4LmNzczMnXSwgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvY3NzMy90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2NzczMvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvblRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5jc3MzLlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZS50cmFuc2l0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3NzcHJpdGVhbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQ3NzU3ByaXRlQW5pbWF0aW9uJ10sIFsnZ29vZy5meC5BbmltYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Nzc3Nwcml0ZWFuaW1hdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvblRlc3QnXSwgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvbicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RvbS5qcycsIFsnZ29vZy5meC5kb20nLCAnZ29vZy5meC5kb20uQmdDb2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5Db2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5GYWRlJywgJ2dvb2cuZnguZG9tLkZhZGVJbicsICdnb29nLmZ4LmRvbS5GYWRlSW5BbmRTaG93JywgJ2dvb2cuZnguZG9tLkZhZGVPdXQnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5meC5kb20uUHJlZGVmaW5lZEVmZmVjdCcsICdnb29nLmZ4LmRvbS5SZXNpemUnLCAnZ29vZy5meC5kb20uUmVzaXplSGVpZ2h0JywgJ2dvb2cuZnguZG9tLlJlc2l6ZVdpZHRoJywgJ2dvb2cuZnguZG9tLlNjcm9sbCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLmZ4LmRvbS5TbGlkZUZyb20nLCAnZ29vZy5meC5kb20uU3dpcGUnXSwgWydnb29nLmNvbG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3AnXSwgWydnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AnLCAnZ29vZy5meC5EcmFnRHJvcEl0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdkcm9wZ3JvdXAuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3BHcm91cCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3Bncm91cF90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdEcm9wR3JvdXBUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5EcmFnRHJvcEdyb3VwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnZ2VyLmpzJywgWydnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5EcmFnZ2VyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2dlcl90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdnZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2xpc3Rncm91cC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdERpcmVjdGlvbicsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXAnLCAnZ29vZy5meC5EcmFnTGlzdEdyb3VwLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXBFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdsaXN0Z3JvdXBfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdEdyb3VwVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0RGlyZWN0aW9uJywgJ2dvb2cuZnguRHJhZ0xpc3RHcm91cCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbicsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnc2Nyb2xsc3VwcG9ydC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ3Njcm9sbHN1cHBvcnRfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydFRlc3QnXSwgWydnb29nLmZ4LkRyYWdTY3JvbGxTdXBwb3J0JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZWFzaW5nLmpzJywgWydnb29nLmZ4LmVhc2luZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Vhc2luZ190ZXN0LmpzJywgWydnb29nLmZ4LmVhc2luZ1Rlc3QnXSwgWydnb29nLmZ4LmVhc2luZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnguanMnLCBbJ2dvb2cuZngnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb24uRXZlbnRUeXBlJywgJ2dvb2cuZnguQW5pbWF0aW9uLlN0YXRlJywgJ2dvb2cuZnguQW5pbWF0aW9uRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LmVhc2luZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnhfdGVzdC5qcycsIFsnZ29vZy5meFRlc3QnXSwgWydnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L3RyYW5zaXRpb25iYXNlLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb25CYXNlJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UuU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ4LlRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dvb2cuanMnLCBbXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9hYnN0cmFjdGdyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLkVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkZpbGwnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdHJva2UnLCAnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2FmZmluZXRyYW5zZm9ybS5qcycsIFsnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQWZmaW5lVHJhbnNmb3JtVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5QYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkNhbnZhc0dyYXBoaWNzJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ncmFwaGljcy5BYnN0cmFjdEdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGVtZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9lbGxpcHNlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9jb29yZGluYXRlcy5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2Nvb3JkaW5hdGVzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LmNvb3JkaW5hdGVzVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50X3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnRUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dCcsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2VsbGlwc2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsbGlwc2UnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2V4dC5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5FbGxpcHNlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LlJlY3RhbmdsZScsICdnb29nLmdyYXBoaWNzLmV4dC5TaGFwZScsICdnb29nLmdyYXBoaWNzLmV4dC5jb29yZGluYXRlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5HcmFwaGljcyddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvZ3JvdXAuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvaW1hZ2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3BhdGguanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGgnXSwgWydnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5tYXRoLlJlY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9wYXRoX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGhUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dC5QYXRoJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3JlY3RhbmdsZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuUmVjdGFuZ2xlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9zaGFwZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuU2hhcGUnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3N0cm9rZWFuZGZpbGxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZpbGwuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZvbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRm9udCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlN2Z0dyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyb3VwZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5Hcm91cEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ltYWdlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5JbWFnZUVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2xpbmVhcmdyYWRpZW50LmpzJywgWydnb29nLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuUGF0aC5TZWdtZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9wYXRocy5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRocyddLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aHNfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRoc1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MucGF0aHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3JlY3RlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50J10sIFsnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsLmpzJywgWydnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCddLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdHJva2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc3Ryb2tlYW5kZmlsbGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5SZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdmdncmFwaGljcy5qcycsIFsnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvdGV4dGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy92bWxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlZtbEVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxSZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFRleHRFbGVtZW50J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5UZXh0RWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvdm1sZ3JhcGhpY3MuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZ3JhcGhpY3MuQWJzdHJhY3RHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLkZvbnQnLCAnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5WbWxFbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxUZXh0RWxlbWVudCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50LmpzJywgWydnb29nLmhpc3RvcnkuRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmhpc3RvcnkuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaGlzdG9yeS5qcycsIFsnZ29vZy5IaXN0b3J5JywgJ2dvb2cuSGlzdG9yeS5FdmVudCcsICdnb29nLkhpc3RvcnkuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5kZXZpY2UnLCAnZ29vZy5tZW1vaXplJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2hpc3RvcnlfdGVzdC5qcycsIFsnZ29vZy5IaXN0b3J5VGVzdCddLCBbJ2dvb2cuSGlzdG9yeScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaGlzdG9yeS9odG1sNWhpc3RvcnkuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnknLCAnZ29vZy5oaXN0b3J5Lkh0bWw1SGlzdG9yeS5Ub2tlblRyYW5zZm9ybWVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaHRtbDVoaXN0b3J5X3Rlc3QuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuSHRtbDVIaXN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9jc3NzcGVjaWZpY2l0eS5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5J10sIFsnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvY3Nzc3BlY2lmaWNpdHlfdGVzdC5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5VGVzdCddLCBbJ2dvb2cuaHRtbC5Dc3NTcGVjaWZpY2l0eScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoLmpzJywgWydnb29nLmh0bWwuZmxhc2gnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5mbGFzaFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuZmxhc2gnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvbGVnYWN5Y29udmVyc2lvbnMuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2xlZ2FjeWNvbnZlcnNpb25zX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9uc1Rlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZycsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlaHRtbF90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZUh0bWxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVodG1sZm9ybWF0dGVyLmpzJywgWydnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWxmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVIdG1sRm9ybWF0dGVyVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXNjcmlwdC5qcycsIFsnZ29vZy5odG1sLlNhZmVTY3JpcHQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlc2NyaXB0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYWZlU2NyaXB0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlLmpzJywgWydnb29nLmh0bWwuU2FmZVN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVzdHlsZV90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZVN0eWxlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXQuanMnLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXRfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVTdHlsZVNoZWV0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlVXJsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnMudXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmxfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2FmZVVybFRlc3RWZWN0b3JzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZldXJsX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0VmVjdG9ycyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2F0dHJpYnV0ZXdoaXRlbGlzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVTYW5pdGl6ZWRXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVXaGl0ZWxpc3QnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3Nwcm9wZXJ0eXNhbml0aXplci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Byb3BlcnR5c2FuaXRpemVyX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXJUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3NzYW5pdGl6ZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Nhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuQ3NzU2FuaXRpemVyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9lbGVtZW50d2Vha21hcC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcCddLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvZWxlbWVudHdlYWttYXBfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcFRlc3QnXSwgWydnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLmh0bWxUZXN0VmVjdG9ycyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyLmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyQXR0cmlidXRlUG9saWN5JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXJQb2xpY3lDb250ZXh0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeUhpbnRzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclVybFBvbGljeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlU2FuaXRpemVkV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3InLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdCbGFja2xpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvaHRtbHNhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuSHRtbFNhbml0aXplclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyX3VuaWZpZWRfdGVzdC5qcycsIFsnZ29vZy5odG1sLkh0bWxTYW5pdGl6ZXJVbmlmaWVkVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuaHRtbFRlc3RWZWN0b3JzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplci5CdWlsZGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXJUZXN0J10sIFsnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9zYWZlZG9tdHJlZXByb2Nlc3Nvci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3NhZmVkb210cmVlcHJvY2Vzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3JUZXN0J10sIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci90YWdibGFja2xpc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuVGFnQmxhY2tsaXN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvdGFnd2hpdGVsaXN0LmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLlRhZ1doaXRlbGlzdCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZS5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZV90ZXN0LmpzJywgWydnb29nLmh0bWwuVW5zYWZlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkF0dHJpYnV0ZVdoaXRlbGlzdCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zaWx2ZXJsaWdodC5qcycsIFsnZ29vZy5odG1sLnNpbHZlcmxpZ2h0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NpbHZlcmxpZ2h0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zaWx2ZXJsaWdodFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2lsdmVybGlnaHQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGVzdGluZy5qcycsIFsnZ29vZy5odG1sLnRlc3RpbmcnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkFyZ3VtZW50TWF0Y2hlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90ZXh0ZXh0cmFjdG9yLmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGV4dGV4dHJhY3Rvcl90ZXN0LmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvclRlc3QnXSwgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkcmVzb3VyY2V1cmwuanMnLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRGlyZWN0aW9uYWxTdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdHJ1c3RlZHJlc291cmNldXJsX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkUmVzb3VyY2VVcmxUZXN0J10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudHJ1c3RlZHR5cGVzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkdHlwZXMuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3VuY2hlY2tlZGNvbnZlcnNpb25zLmpzJywgWydnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdW5jaGVja2VkY29udmVyc2lvbnNfdGVzdC5qcycsIFsnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdXRpbHMuanMnLCBbJ2dvb2cuaHRtbC51dGlscyddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3V0aWxzX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5VdGlsc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnV0aWxzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGkuanMnLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5EaXJlY3Rpb25hbFN0cmluZycsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5iaWRpVGVzdCddLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpZm9ybWF0dGVyLmpzJywgWydnb29nLmkxOG4uQmlkaUZvcm1hdHRlciddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmkxOG4uYmlkaScsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRm9ybWF0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGlmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuaTE4bi5CaWRpRm9ybWF0dGVyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcmxpc3RkZWNvbXByZXNzb3IuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5pMThuLnVDaGFyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2NoYXJsaXN0ZGVjb21wcmVzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvclRlc3QnXSwgWydnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcnBpY2tlcmRhdGEuanMnLCBbJ2dvb2cuaTE4bi5DaGFyUGlja2VyRGF0YSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uLmpzJywgWydnb29nLmkxOG4uY29sbGF0aW9uJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5jb2xsYXRpb25UZXN0J10sIFsnZ29vZy5pMThuLmNvbGxhdGlvbicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jb21wYWN0bnVtYmVyZm9ybWF0c3ltYm9scy5qcycsIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYW0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jeScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19odScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ub19OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9QVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poX1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29tcGFjdG51bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc0V4dCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZ3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FrX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9BRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9QUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9YQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc19JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JlbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jlel9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibV9NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWJ1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lZV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbF9HUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0ZKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0tOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01IJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01TJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01XJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05GJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1ZHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1dTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19BUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19CWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19DUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19HVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19OSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19TVicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldF9FRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZmJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX01SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZvX0ZPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0JJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dQJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01DJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01VJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1BGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ2QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3VfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYXdfVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHJfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hzYl9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pYScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19paScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWlfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXRfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamFfSlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19qbWMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2p2X0lEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYWJfRFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZGUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZWFfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ra2onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsX0dMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa21fS0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29fS1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXNfTVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXVhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tem4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmVfTlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfQlEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfU1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25tZ19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubmgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19udXNfU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX255bicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vcl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vc19SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0FPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X1RMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3F1X0VDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JtX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ybicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JvX01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb19STycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb2ZfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfS1onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfVUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcndrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2FoX1JVJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2JwJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZF9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZV9OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VoX01aJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9UZm5nX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NsX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc24nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fREonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3FfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3ZfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3dfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGFfTEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGhfVEgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGlfRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdG8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHJfVFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHdxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHptX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VrX1VBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmxfVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192YWlfVmFpaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192dW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193YWVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hvZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195b19CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnRfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dV9aQSddLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jdXJyZW5jeS5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5pMThuLmN1cnJlbmN5LkN1cnJlbmN5SW5mb1RpZXIyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3lfdGVzdC5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5VGVzdCddLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3ljb2RlbWFwLmpzJywgWydnb29nLmkxOG4uY3VycmVuY3lDb2RlTWFwJywgJ2dvb2cuaTE4bi5jdXJyZW5jeUNvZGVNYXBUaWVyMiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsZm9ybWF0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlLkRhdGVMaWtlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzVHlwZScsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0VGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFBhdHRlcm5zJywgJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbHBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsUGF0dGVybnMnXSwgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9scyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFscGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJuc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJucyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsc3ltYm9scy5qcycsIFsnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRlaW50ZXJ2YWxzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9sc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5Gb3JtYXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuX1hBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3N2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGVfSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvX1JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3YnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGFyc2UuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGF0ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhcnNlX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19heicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ibicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jaHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXNfNDE5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX01YJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaGF3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ttJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25iJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3J1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZ3FfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYW1fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXJfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0JIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0pPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX09NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1FBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1REJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1ROJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hc2FfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzdF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXpfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iYXNfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVfQlknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JlbV9aTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnX0JHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyeCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icnhfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ic19DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JzX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9BRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jY3AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NjcF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2ViX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZ2dfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2hyX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ja2JfSVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2tiX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2N5X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kYXZfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGplJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHlvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19keicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kel9CVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lbl8xNTAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRksnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1onLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVE8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW9fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0hOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0lDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1ZFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V3bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfSFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfV0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2Z1cl9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meV9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYV9JRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZF9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3N3X0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2dzd19MSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2X0lNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oZV9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oaV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9IUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1X0hVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5X0FNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZF9JRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZ19ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pc19JUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9TTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9WQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qZ28nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfamdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qbWNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FfR0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rYW0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FtX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rZGVfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2VhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19raHEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2hxX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trX0taJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ra2pfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tsbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa29rX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NmJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzZl9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NoX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xhZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sYWdfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGt0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xrdF9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sb19MQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19scmMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xyY19JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdF9MVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdV9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x1eScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdXlfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWFzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21hc19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21lcl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWZlX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21naCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZ2hfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ta19NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tcl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19CTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdF9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbXVhX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215X01NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tem5fSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmFxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9TSicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZF9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25kc19OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9BVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9DVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubmhfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnVzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ueW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnluX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX0dFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0FyYWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGxfUEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ1YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfU1QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfUEUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fUk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9mJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9CWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9NRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd19SVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcndrX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2FxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhcV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2JwX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX1NFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2VzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Nlc19NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZ19DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG5fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2lfTEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2tfU0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Ntbl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbl9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9BTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9MYXRuX01FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9BWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190Z19USicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190a19UTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190b19UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dF9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHdxX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3R6bScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWdfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZpX1ZOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc192dW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfd2FlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aF9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194b2cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195YXZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWlfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3l1ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196Z2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemdoX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFudF9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNUeXBlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jeScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhdycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hZl9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9PTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9UTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfTGF0bl9BWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JlX0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbF9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMTUwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0pFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0tJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0xDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01QJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VvXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19DTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19ETycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19JQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19WRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9CRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZvX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0dOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0hUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1JFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1dGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXJfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2FfSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2xfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1el9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYV9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGlfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oeV9BTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWRfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfVkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2p2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocV9NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ra19LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa29fS1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tva19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXNfQk4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXRfTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19teV9NTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251cycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bl9VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vc19HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BhX0FyYWJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsX1BMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0xVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1NUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3F1X0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ybicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JuX0JJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yb19STycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfS0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcndfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXFfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXNfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoaV9UZm5nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NrX1NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc29fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3FfTUsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX1hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9MYXRuX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3ZfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3dfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGdfVEonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGlfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGtfVE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHJfQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHRfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VnX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VyX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9MYXRuX1VaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192YWlfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192aV9WTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfd29fU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2X0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeXVlX0hhbnQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaF9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFuc19ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudF9UVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrLmpzJywgWydnb29nLmkxOG4uR3JhcGhlbWVCcmVhayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrVGVzdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9sb2NhbGVmZWF0dXJlLmpzJywgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZSddLCBbXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2xvY2FsZWZlYXR1cmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmVUZXN0J10sIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbWVzc2FnZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLk1lc3NhZ2VGb3JtYXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9scycsICdnb29nLmkxOG4ub3JkaW5hbFJ1bGVzJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9tZXNzYWdlZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0VGVzdCddLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lLmpzJywgWydnb29nLmkxOG4ubWltZScsICdnb29nLmkxOG4ubWltZS5lbmNvZGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaTE4bi51Q2hhciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5taW1lLmVuY29kZVRlc3QnXSwgWydnb29nLmkxOG4ubWltZS5lbmNvZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0LmpzJywgWydnb29nLmkxOG4uTnVtYmVyRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQuQ3VycmVuY3lTdHlsZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0LkZvcm1hdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5jdXJyZW5jeScsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRUZXN0J10sIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUdfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3VfbnVfbGF0bicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHMuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FtJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19heicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2N5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0FUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19NWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oYXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa24nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa28nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm9fTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfUFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190bCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREpfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1dfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT01fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0FfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TT191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1NfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfVE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWEInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUVfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzYV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc3QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXpfQ3lybF9BWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0xhdG5fQVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmFzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZW0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JleicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZXpfVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm1fTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icngnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnNfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfQUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfSVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2ViJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2dnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jeV9HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYXYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0RFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHNiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHVhX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R6X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpbF9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19GTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ESicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9IVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ORScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9UTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9XRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ZVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZnVyX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsX0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndXpfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGF3X1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hpX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hzYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oc2JfREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHlfQU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lkX0lEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpX0NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1ZBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2phX0pQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfam1jJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdl9JRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2FiX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYW1fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rZWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2VhX0NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19raHFfTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tfS1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tqJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbF9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2xuX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ttX0tIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rb2tfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzaF9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sYWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xrdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG9fTEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVfQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sdXknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21hcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21lcicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21mZV9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWtfTUsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX0JOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210X01UJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX211YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU1fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXpuX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25hcScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRfWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZHNfTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NlaF9NWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VzX01MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NoaScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZ19NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19za19TSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbF9TSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc21uX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX1NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX01LJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9DeXJsX01FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9YSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bl9SUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X1NFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0xLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdGVvX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnX1RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RoX1RIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrX1RNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX1RSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0X1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R3cScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdHptJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R6bV9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191Z19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191a19VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL29yZGluYWxydWxlcy5qcycsIFsnZ29vZy5pMThuLm9yZGluYWxSdWxlcyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3BsdXJhbHJ1bGVzLmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9wbHVyYWxydWxlc190ZXN0LmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXNUZXN0J10sIFsnZ29vZy5pMThuLnBsdXJhbFJ1bGVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVmb3JtYXQuanMnLCBbJ2dvb2cuaTE4bi5SZWxhdGl2ZURhdGVUaW1lRm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaTE4bi5Mb2NhbGVGZWF0dXJlJywgJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5yZWxhdGl2ZURhdGVUaW1lU3ltYm9scyddLCB7J2xhbmcnOiAnZXM1JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vcmVsYXRpdmVkYXRldGltZWZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9yZWxhdGl2ZWRhdGV0aW1lc3ltYm9sc2V4dC5qcycsIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0J10sIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJ10sIHsnbGFuZyc6ICdlczUnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi90aW1lem9uZS5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdGltZXpvbmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lVGVzdCddLCBbJ2dvb2cuaTE4bi5UaW1lWm9uZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci5qcycsIFsnZ29vZy5pMThuLnVDaGFyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlci5qcycsIFsnZ29vZy5pMThuLnVDaGFyLkxvY2FsTmFtZUZldGNoZXInXSwgWydnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5pMThuLnVDaGFyTmFtZXMnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlciddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvcmVtb3RlbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5SZW1vdGVOYW1lRmV0Y2hlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlVyaScsICdnb29nLmV2ZW50cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5pMThuLnVDaGFyLk5hbWVGZXRjaGVyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci9yZW1vdGVuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuUmVtb3RlTmFtZUZldGNoZXJUZXN0J10sIFsnZ29vZy5pMThuLnVDaGFyLlJlbW90ZU5hbWVGZXRjaGVyJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3VjaGFyX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi51Q2hhclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lcy5qcycsIFsnZ29vZy5pMThuLnVDaGFyTmFtZXMnXSwgWydnb29nLmkxOG4udUNoYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lc190ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXJOYW1lc1Rlc3QnXSwgWydnb29nLmkxOG4udUNoYXJOYW1lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczYuanMnLCBbJ2dvb2cuaXRlci5lczYnXSwgWydnb29nLml0ZXIuSXRlcmFibGUnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczZfdGVzdC5qcycsIFsnZ29vZy5pdGVyLmVzNlRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLmVzNicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyLmpzJywgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhYmxlJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubWF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyX3Rlc3QuanMnLCBbJ2dvb2cuaXRlclRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2h5YnJpZC5qcycsIFsnZ29vZy5qc29uLmh5YnJpZCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vaHlicmlkX3Rlc3QuanMnLCBbJ2dvb2cuanNvbi5oeWJyaWRUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb24uanMnLCBbJ2dvb2cuanNvbicsICdnb29nLmpzb24uUmVwbGFjZXInLCAnZ29vZy5qc29uLlJldml2ZXInLCAnZ29vZy5qc29uLlNlcmlhbGl6ZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9qc29uX3BlcmYuanMnLCBbJ2dvb2cuanNvblBlcmYnXSwgWydnb29nLmRvbScsICdnb29nLmpzb24nLCAnZ29vZy5tYXRoJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRhYmxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vanNvbl90ZXN0LmpzJywgWydnb29nLmpzb25UZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb25hYmxlLmpzJywgWydnb29nLmpzb24uSnNvbmFibGUnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9uYXRpdmVqc29ucHJvY2Vzc29yLmpzJywgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24uUHJvY2Vzc29yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL3Byb2Nlc3Nvci5qcycsIFsnZ29vZy5qc29uLlByb2Nlc3NvciddLCBbJ2dvb2cuc3RyaW5nLlBhcnNlcicsICdnb29nLnN0cmluZy5TdHJpbmdpZmllciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9wcm9jZXNzb3JfdGVzdC5qcycsIFsnZ29vZy5qc29uLnByb2Nlc3NvclRlc3QnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXMuanMnLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXNfdGVzdC5qcycsIFsnZ29vZy5sYWJzLml0ZXJhYmxlVGVzdCddLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2RvbS9wYWdldmlzaWJpbGl0eW1vbml0b3IuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlFdmVudCcsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5TW9uaXRvcicsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5U3RhdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS52ZW5kb3InLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWVtb2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9kb20vcGFnZXZpc2liaWxpdHltb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL25vbmRpc3Bvc2FibGVldmVudHRhcmdldC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyTWFwJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy9ub25kaXNwb3NhYmxlZXZlbnR0YXJnZXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXRUZXN0J10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9ldmVudHMvbm9uZGlzcG9zYWJsZWV2ZW50dGFyZ2V0X3ZpYV9nb29nZXZlbnRzX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5ldmVudHMuTm9uRGlzcG9zYWJsZUV2ZW50VGFyZ2V0R29vZ0V2ZW50c1Rlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL3RvdWNoLmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoJywgJ2dvb2cubGFicy5ldmVudHMudG91Y2guVG91Y2hEYXRhJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy90b3VjaF90ZXN0LmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoVGVzdCddLCBbJ2dvb2cubGFicy5ldmVudHMudG91Y2gnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdi5qcycsIFsnZ29vZy5sYWJzLmZvcm1hdC5jc3YnLCAnZ29vZy5sYWJzLmZvcm1hdC5jc3YuUGFyc2VFcnJvcicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5Ub2tlbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdl90ZXN0LmpzJywgWydnb29nLmxhYnMuZm9ybWF0LmNzdlRlc3QnXSwgWydnb29nLmxhYnMuZm9ybWF0LmNzdicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5QYXJzZUVycm9yJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdC5qcycsIFsnZ29vZy5sYWJzLmkxOG4uR2VuZGVySW5mbycsICdnb29nLmxhYnMuaTE4bi5HZW5kZXJJbmZvLkdlbmRlcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0VGVzdCddLCBbJ2dvb2cubGFicy5pMThuLkdlbmRlckluZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196dScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9pMThuL2xpc3RzeW1ib2xzLmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hbScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19heicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ibicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX01YJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcl9DQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2luJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2phJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ttJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21rJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25lJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X1BUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NoJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0JIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01SJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1FBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1REJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1hCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1lFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXN0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzdF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXpfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JhcycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iYXNfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JlbV9aTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmV6X1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JnX0JHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0NOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyX0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyeCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ic19DeXJsX0JBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9BRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9GUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2NwX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NnZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZ2dfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NrYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ja2JfSVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NzX0NaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2N5X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0dMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTEknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RqZV9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R1YScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kdWFfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R5b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19keicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maWxfUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fRk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfREonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfS00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUEYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfWVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meV9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZF9HQicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3N3X0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2X0lNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhd19VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oZV9JTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9IUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1X0hVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZ19ORycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paV9DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pc19JUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9TTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qYV9KUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qZ28nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ptYycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qbWNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanZfSUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FfR0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thYl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rYW0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tkZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rZGVfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tlYV9DVicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19raHEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2traicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ra2pfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xfR0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbV9LSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2JfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NmJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NoX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1X1RSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5X0tHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xhZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGdfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGt0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9BTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sb19MQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHJjX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdV9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x1eScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHZfTFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWFzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tYXNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZmUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWZlX01VJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nX01HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21naCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWdvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nb19DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taV9OWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ta19NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbl9NTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tcl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdWEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbXVhX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25hcV9OQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9OTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZF9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmRzX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25kc19OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9OUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX1NFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZWhfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2VzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZ19DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG5fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2lfTEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2xfU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbl9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19ESicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19TTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9BTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsX1JTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9MYXRuX01FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9BWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9TRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9MSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Rlb19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aF9USCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190b19UTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9UUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190d3EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHdxX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190em1fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWtfVUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbW9jay9tb2NrLmpzJywgWydnb29nLmxhYnMubW9jaycsICdnb29nLmxhYnMubW9jay5UaW1lb3V0RXJyb3InLCAnZ29vZy5sYWJzLm1vY2suVmVyaWZpY2F0aW9uRXJyb3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dCcsICdnb29nLmxhYnMubW9jay50aW1lb3V0LlRpbWVvdXRNb2RlJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uQmFzZVZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uLlZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svbW9ja190ZXN0LmpzJywgWydnb29nLmxhYnMubW9ja1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy5tb2NrJywgJ2dvb2cubGFicy5tb2NrLlRpbWVvdXRFcnJvcicsICdnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25FcnJvcicsICdnb29nLmxhYnMubW9jay50aW1lb3V0JywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdGltZW91dG1vZGUuanMnLCBbJ2dvb2cubGFicy5tb2NrLnRpbWVvdXQnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dC5UaW1lb3V0TW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZS5qcycsIFsnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbi5CYXNlVmVyaWZpY2F0aW9uTW9kZScsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uVmVyaWZpY2F0aW9uTW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZV90ZXN0LmpzJywgWydnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25Nb2RlVGVzdCddLCBbJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2UuanMnLCBbJ2dvb2cubGFicy5uZXQuaW1hZ2UnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC5pbWFnZVRlc3QnXSwgWydnb29nLmxhYnMubmV0LmltYWdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LldlYkNoYW5uZWwnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cubmV0LlhtbEh0dHBGYWN0b3J5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Jhc2V0ZXN0Y2hhbm5lbC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkJhc2VUZXN0Q2hhbm5lbCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuV2ViQ2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jaGFubmVsLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2NoYW5uZWxyZXF1ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXN5bmMuVGhyb3R0bGUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsRGVidWcnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmVudmlyb25tZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvY2hhbm5lbHJlcXVlc3RfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jb25uZWN0aW9uc3RhdGUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Vudmlyb25tZW50LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuZW52aXJvbm1lbnQnXSwgWydnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvZW52aXJvbm1lbnRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkVudmlyb25tZW50VGVzdCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5lbnZpcm9ubWVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9mb3J3YXJkY2hhbm5lbHJlcXVlc3Rwb29sLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuRm9yd2FyZENoYW5uZWxSZXF1ZXN0UG9vbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2ZvcndhcmRjaGFubmVscmVxdWVzdHBvb2xfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2xUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Gb3J3YXJkQ2hhbm5lbFJlcXVlc3RQb29sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL25ldHV0aWxzLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwubmV0VXRpbHMnXSwgWydnb29nLlVyaScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3JlcXVlc3RzdGF0cy5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzLkV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TdGF0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdEV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuVGltaW5nRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZS5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5CYXNlVGVzdENoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxEZWJ1ZycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQucnBjLkh0dHBDb3JzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZV90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGJhc2V0cmFuc3BvcnQuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmpzb24nLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxvZycsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LldlYkNoYW5uZWxUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcucGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZXRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUcmFuc3BvcnRUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbEJhc2UnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3dpcmUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4X3Rlc3QuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlVjhUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldpcmVWOCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQuV2ViQ2hhbm5lbFRyYW5zcG9ydCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWx0cmFuc3BvcnRmYWN0b3J5LmpzJywgWydnb29nLm5ldC5jcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHIuanMnLCBbJ2dvb2cubGFicy5uZXQueGhyJywgJ2dvb2cubGFicy5uZXQueGhyLkVycm9yJywgJ2dvb2cubGFicy5uZXQueGhyLkh0dHBFcnJvcicsICdnb29nLmxhYnMubmV0Lnhoci5PcHRpb25zJywgJ2dvb2cubGFicy5uZXQueGhyLlBvc3REYXRhJywgJ2dvb2cubGFicy5uZXQueGhyLlJlc3BvbnNlVHlwZScsICdnb29nLmxhYnMubmV0Lnhoci5UaW1lb3V0RXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC54aHJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxhYnMubmV0LnhocicsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3B1YnN1Yi9icm9hZGNhc3RwdWJzdWIuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cubWF0aCcsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9wdWJzdWIvYnJvYWRjYXN0cHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0b3JhZ2UvYm91bmRlZGNvbGxlY3RhYmxlc3RvcmFnZS5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdG9yYWdlL2JvdW5kZWRjb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLmxhYnMuc3RvcmFnZS5Cb3VuZGVkQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0cnVjdHMvbXVsdGltYXAuanMnLCBbJ2dvb2cubGFicy5zdHJ1Y3RzLk11bHRpbWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvc3RydWN0cy9tdWx0aW1hcF90ZXN0LmpzJywgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcFRlc3QnXSwgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdHlsZS9waXhlbGRlbnNpdHltb25pdG9yLmpzJywgWydnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvcicsICdnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvci5EZW5zaXR5JywgJ2dvb2cubGFicy5zdHlsZS5QaXhlbERlbnNpdHlNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0eWxlL3BpeGVsZGVuc2l0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXQuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdFRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyRXJyb3InLCAnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kZWNvcmF0b3JtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3RpbmcvZGVjb3JhdG9ybWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kZWNvcmF0b3JNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFueXRoaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cmllc01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cnlNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkhhc0tleU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzVmFsdWVNYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kaWN0aW9uYXJ5TWF0Y2hlclRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5IYXNFbnRyeU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnXSwgWydnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudF90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5lbnZpcm9ubWVudFRlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Vudmlyb25tZW50X3VzYWdlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLmVudmlyb25tZW50VXNhZ2VUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9qc29uX2Z1enppbmcuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2pzb25fZnV6emluZ190ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Kc29uRnV6emluZ1Rlc3QnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sYWJzLnRlc3RpbmcuSnNvbkZ1enppbmcnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXIuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5BbnlPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOb3RNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmxvZ2ljTWF0Y2hlcnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcubG9naWNNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9tYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlOdW1iZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNsb3NlVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkVxdWFsVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkdyZWF0ZXJUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkxlc3NUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLm51bWJlck1hdGNoZXJUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuQW55T2JqZWN0TWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5IYXNQcm9wZXJ0eU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSW5zdGFuY2VPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOdWxsTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5Jc051bGxPclVuZGVmaW5lZE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNVbmRlZmluZWRNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk9iamVjdEVxdWFsc01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5vYmplY3RNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5PYmplY3RFcXVhbHNNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9zdHJpbmdtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlTdHJpbmdNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNvbnRhaW5zU3RyaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5FbmRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxUb0lnbm9yaW5nV2hpdGVzcGFjZU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxzTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5SZWdleE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RhcnRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RyaW5nQ29udGFpbnNJbk9yZGVyTWF0Y2hlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvc3RyaW5nbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5zdHJpbmdNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5TdHJpbmdDb250YWluc0luT3JkZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2Jyb3dzZXIuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9icm93c2VyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmRldmljZSddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2VuZ2luZS5qcycsIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZW5naW5lX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2V4dHJhLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9leHRyYV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L3BsYXRmb3JtLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdGVzdF9hZ2VudHMuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC91dGlsLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWwnXSwgWydnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdXRpbF90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWxUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXIuanMnLCBbJ2dvb2cubGFicy51c2VyYWdlbnQudmVyaWZpZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9hZGVyL2Fic3RyYWN0bW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlci5DYWxsYmFja1R5cGUnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvYWRlci9hY3RpdmVtb2R1bGVtYW5hZ2VyLmpzJywgWydnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJpZXMuanMnLCBbJ2dvb2cubG9jYWxlLmNvdW50cmllcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJ5bGFuZ3VhZ2VuYW1lc190ZXN0LmpzJywgWydnb29nLmxvY2FsZS5jb3VudHJ5TGFuZ3VhZ2VOYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2RlZmF1bHRsb2NhbGVuYW1lY29uc3RhbnRzLmpzJywgWydnb29nLmxvY2FsZS5kZWZhdWx0TG9jYWxlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9nZW5lcmljZm9udG5hbWVzLmpzJywgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2dlbmVyaWNmb250bmFtZXNfdGVzdC5qcycsIFsnZ29vZy5sb2NhbGUuZ2VuZXJpY0ZvbnROYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvZ2VuZXJpY2ZvbnRuYW1lc2RhdGEuanMnLCBbJ2dvb2cubG9jYWxlLmdlbmVyaWNGb250TmFtZXNEYXRhJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2xvY2FsZS5qcycsIFsnZ29vZy5sb2NhbGUnXSwgWydnb29nLmxvY2FsZS5uYXRpdmVOYW1lQ29uc3RhbnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvbmF0aXZlbmFtZWNvbnN0YW50cy5qcycsIFsnZ29vZy5sb2NhbGUubmF0aXZlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9zY3JpcHRUb0xhbmd1YWdlcy5qcycsIFsnZ29vZy5sb2NhbGUuc2NyaXB0VG9MYW5ndWFnZXMnXSwgWydnb29nLmxvY2FsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZGV0ZWN0aW9uLmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbiddLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS90aW1lem9uZWRldGVjdGlvbl90ZXN0LmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvblRlc3QnXSwgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZmluZ2VycHJpbnQuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0LmpzJywgWydnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVBbGxMb25nTmFtZXMnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVTZWxlY3RlZExvbmdOYW1lcycsICdnb29nLmxvY2FsZS5nZXRUaW1lWm9uZVNlbGVjdGVkU2hvcnROYW1lcyddLCBbJ2dvb2cubG9jYWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lTGlzdFRlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvZy9sb2cuanMnLCBbJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubG9nLkxvZ1JlY29yZCcsICdnb29nLmxvZy5Mb2dnZXInXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9nL2xvZ190ZXN0LmpzJywgWydnb29nLmxvZ1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtLmpzJywgWydnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5BZmZpbmVUcmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkFmZmluZVRyYW5zZm9ybScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9iZXppZXIuanMnLCBbJ2dvb2cubWF0aC5CZXppZXInXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYmV6aWVyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5CZXppZXJUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5CZXppZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYm94LmpzJywgWydnb29nLm1hdGguQm94J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2JveF90ZXN0LmpzJywgWydnb29nLm1hdGguQm94VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZS5qcycsIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwgWydnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZTMuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlMyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2Nvb3JkaW5hdGUzX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZV90ZXN0LmpzJywgWydnb29nLm1hdGguQ29vcmRpbmF0ZVRlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9leHBvbmVudGlhbGJhY2tvZmYuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmYnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvZXhwb25lbnRpYWxiYWNrb2ZmX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmZUZXN0J10sIFsnZ29vZy5tYXRoLkV4cG9uZW50aWFsQmFja29mZicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyLmpzJywgWydnb29nLm1hdGguSW50ZWdlciddLCBbJ2dvb2cucmVmbGVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5JbnRlZ2VyVGVzdCddLCBbJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9pbnRlcnBvbGF0b3IxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5JbnRlcnBvbGF0b3IxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuTGluZWFyMVRlc3QnXSwgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3BjaGlwMS5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9wY2hpcDFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDFUZXN0J10sIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTEuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnLCAnZ29vZy5tYXRoLnRkbWEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxVGVzdCddLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pcmVjdC5qcycsIFsnZ29vZy5tYXRoLklSZWN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lLmpzJywgWydnb29nLm1hdGguTGluZSddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5MaW5lVGVzdCddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5MaW5lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2xvbmcuanMnLCBbJ2dvb2cubWF0aC5Mb25nJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucmVmbGVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbG9uZ190ZXN0LmpzJywgWydnb29nLm1hdGguTG9uZ1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoLkxvbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aC5qcycsIFsnZ29vZy5tYXRoJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aF90ZXN0LmpzJywgWydnb29nLm1hdGhUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL21hdHJpeC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9tYXRyaXhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeFRlc3QnXSwgWydnb29nLm1hdGguTWF0cml4JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGguanMnLCBbJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cubWF0aC5QYXRoLlNlZ21lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlBhdGhUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJywgJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhzLmpzJywgWydnb29nLm1hdGgucGF0aHMnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9wYXRoc190ZXN0LmpzJywgWydnb29nLm1hdGgucGF0aHNUZXN0J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLnBhdGhzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3JhbmdlLmpzJywgWydnb29nLm1hdGguUmFuZ2UnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlVGVzdCddLCBbJ2dvb2cubWF0aC5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yYW5nZXNldC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlU2V0J10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5tYXRoLlJhbmdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3Jhbmdlc2V0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SYW5nZVNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5tYXRoLlJhbmdlJywgJ2dvb2cubWF0aC5SYW5nZVNldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0LmpzJywgWydnb29nLm1hdGguUmVjdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5JUmVjdCcsICdnb29nLm1hdGguU2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SZWN0VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvc2l6ZS5qcycsIFsnZ29vZy5tYXRoLlNpemUnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9zaXplX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5TaXplVGVzdCddLCBbJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3RkbWEuanMnLCBbJ2dvb2cubWF0aC50ZG1hJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdGRtYV90ZXN0LmpzJywgWydnb29nLm1hdGgudGRtYVRlc3QnXSwgWydnb29nLm1hdGgudGRtYScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMyLmpzJywgWydnb29nLm1hdGguVmVjMiddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjMl90ZXN0LmpzJywgWydnb29nLm1hdGguVmVjMlRlc3QnXSwgWydnb29nLm1hdGguVmVjMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMzLmpzJywgWydnb29nLm1hdGguVmVjMyddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZTMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjM190ZXN0LmpzJywgWydnb29nLm1hdGguVmVjM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy5tYXRoLlZlYzMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZS5qcycsIFsnZ29vZy5tZW1vaXplJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZV90ZXN0LmpzJywgWydnb29nLm1lbW9pemVUZXN0J10sIFsnZ29vZy5tZW1vaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbFRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2J1ZmZlcmVkY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuQnVmZmVyZWRDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYnVmZmVyZWRjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkJ1ZmZlcmVkQ2hhbm5lbFRlc3QnXSwgWydnb29nLmRlYnVnLkNvbnNvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5CdWZmZXJlZENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmFzeW5jLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvZGVmZXJyZWRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5EZWZlcnJlZENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9kZWZlcnJlZGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJjbGllbnQuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkxvZ2dlckNsaWVudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2xvZ2dlcmNsaWVudF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnRUZXN0J10sIFsnZ29vZy5kZWJ1ZycsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbG9nZ2Vyc2VydmVyLmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJzZXJ2ZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTG9nZ2VyU2VydmVyVGVzdCddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL21lc3NhZ2luZy5qcycsIFsnZ29vZy5tZXNzYWdpbmcnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnaW5nX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsVGVzdCddLCBbJ2dvb2cubWVzc2FnaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLk11bHRpQ2hhbm5lbC5WaXJ0dWFsQ2hhbm5lbCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NZXNzYWdlQ2hhbm5lbCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWxUZXN0J10sIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNhbGxlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cubWVzc2FnaW5nLkRlZmVycmVkQ2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjYWxsZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuanNvbicsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWxUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRuZXR3b3JrX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnRPcGVyYXRvclRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcmVzcG9uZGluZ2NoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlJlc3BvbmRpbmdDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9yZXNwb25kaW5nY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5SZXNwb25kaW5nQ2hhbm5lbFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5tZXNzYWdpbmcuUmVzcG9uZGluZ0NoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRjaGFubmVsX3dvcmtlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcudGVzdGRhdGEucG9ydGNoYW5uZWxfd29ya2VyJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy90ZXN0ZGF0YS9wb3J0bmV0d29ya193b3JrZXIxLmpzJywgWydnb29nLm1lc3NhZ2luZy50ZXN0ZGF0YS5wb3J0bmV0d29ya193b3JrZXIxJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRuZXR3b3JrX3dvcmtlcjIuanMnLCBbJ2dvb2cubWVzc2FnaW5nLnRlc3RkYXRhLnBvcnRuZXR3b3JrX3dvcmtlcjInXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvYWJzdHJhY3Rtb2R1bGVsb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkFic3RyYWN0TW9kdWxlTG9hZGVyJ10sIFsnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL2Jhc2Vtb2R1bGUuanMnLCBbJ2dvb2cubW9kdWxlLkJhc2VNb2R1bGUnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tb2R1bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9sb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkxvYWRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLm1vZHVsZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL21vZHVsZS5qcycsIFsnZ29vZy5tb2R1bGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlaW5mby5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVpbmZvX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUluZm9UZXN0J10sIFsnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkY2FsbGJhY2suanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFjayddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cubW9kdWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGNhbGxiYWNrX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFja1Rlc3QnXSwgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGVyLmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVMb2FkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SWQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5uZXQuQnVsa0xvYWRlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTG9hZGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkNhbGxiYWNrVHlwZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLlRyYWNlJywgJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2VBbGwnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLmFjdGl2ZU1vZHVsZU1hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlcl90ZXN0LmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8xJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMi5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8yJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEJfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQl8xJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Jyb3dzZXJjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvcicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FdmVudCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5IYW5kbGVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLkxvZ1NhdmVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLlF1ZXVlZE1hcCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdGUnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuVGltaW5nRXZlbnQnXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5OYXRpdmVKc29uUHJvY2Vzc29yJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcmNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWxUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcnRlc3RjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvcicsICdnb29nLm5ldC50bXBuZXR3b3JrJywgJ2dvb2cuc3RyaW5nLlBhcnNlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2J1bGtsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXInXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuQnVsa0xvYWRlckhlbHBlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXJUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyaGVscGVyLmpzJywgWydnb29nLm5ldC5CdWxrTG9hZGVySGVscGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLm5ldC5DaGFubmVsRGVidWcnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbHJlcXVlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LkVycm9yJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NoYW5uZWxyZXF1ZXN0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsJywgJ2dvb2cubmV0LkNoYW5uZWxEZWJ1ZycsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY29va2llcy5qcycsIFsnZ29vZy5uZXQuQ29va2llcycsICdnb29nLm5ldC5jb29raWVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nvb2tpZXNfdGVzdC5qcycsIFsnZ29vZy5uZXQuY29va2llc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubmV0LkNvb2tpZXMnLCAnZ29vZy5uZXQuY29va2llcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInXSwgWydnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5Db3JzWG1sSHR0cEZhY3RvcnlUZXN0J10sIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9jcm9zc2RvbWFpbnJwYy5qcycsIFsnZ29vZy5uZXQuQ3Jvc3NEb21haW5ScGMnXSwgWydnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nyb3NzZG9tYWlucnBjX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNyb3NzRG9tYWluUnBjVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm5ldC5Dcm9zc0RvbWFpblJwYycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Vycm9yY29kZS5qcycsIFsnZ29vZy5uZXQuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5uZXQuRXZlbnRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZldGNoeG1saHR0cGZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmV0Y2h4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5VGVzdCddLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZpbGVkb3dubG9hZGVyLmpzJywgWydnb29nLm5ldC5GaWxlRG93bmxvYWRlcicsICdnb29nLm5ldC5GaWxlRG93bmxvYWRlci5FcnJvciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmZzJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmlsZWRvd25sb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuRmlsZURvd25sb2FkZXJUZXN0J10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRmlsZURvd25sb2FkZXInLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcubmV0LlhocklvUG9vbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2h0dHBzdGF0dXMuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaHR0cHN0YXR1c25hbWUuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXNOYW1lJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLm5ldC5JZnJhbWVJby5JbmNyZW1lbnRhbERhdGFFdmVudCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklmcmFtZUlvVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuSWZyYW1lTG9hZE1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5JZnJhbWVMb2FkTW9uaXRvclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkltYWdlTG9hZGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuSW1hZ2VMb2FkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5JbWFnZUxvYWRlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzLmpzJywgWydnb29nLm5ldC5JcEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NkFkZHJlc3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklwQWRkcmVzc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cubmV0LklwQWRkcmVzcycsICdnb29nLm5ldC5JcHY0QWRkcmVzcycsICdnb29nLm5ldC5JcHY2QWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzbG9hZGVyLmpzJywgWydnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvckNvZGUnLCAnZ29vZy5uZXQuanNsb2FkZXIuT3B0aW9ucyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuanNsb2FkZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy5uZXQuanNsb2FkZXIuRXJyb3JDb2RlJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNvbnAuanMnLCBbJ2dvb2cubmV0Lkpzb25wJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzb25wX3Rlc3QuanMnLCBbJ2dvb2cubmV0Lkpzb25wVGVzdCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuSnNvbnAnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5Nb2NrSUZyYW1lSW8nXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LklmcmFtZUlvJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5NdWx0aUlmcmFtZUxvYWRNb25pdG9yVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L25ldHdvcmtzdGF0dXNtb25pdG9yLmpzJywgWydnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9uZXR3b3JrdGVzdGVyLmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbmV0d29ya3Rlc3Rlcl90ZXN0LmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyVGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cubmV0Lk5ldHdvcmtUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3JwYy9odHRwY29ycy5qcycsIFsnZ29vZy5uZXQucnBjLkh0dHBDb3JzJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvcnBjL2h0dHBjb3JzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LnJwYy5IdHRwQ29yc1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLm5ldC5ycGMuSHR0cENvcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHBic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvYmFzZTY0cGJzdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRQYlN0cmVhbVBhcnNlclRlc3QnXSwgWydnb29nLmNyeXB0LmJhc2U2NCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9iYXNlNjRzdHJlYW1kZWNvZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFN0cmVhbURlY29kZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5iYXNlNjQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHN0cmVhbWRlY29kZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRTdHJlYW1EZWNvZGVyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvanNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlci5PcHRpb25zJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2pzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvbm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3BianNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYmpzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXJUZXN0J10sIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3Bic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYnN0cmVhbXBhcnNlcl90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuUGJTdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3N0cmVhbWZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuY3JlYXRlWGhyTm9kZVJlYWRhYmxlU3RyZWFtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyTm9kZVJlYWRhYmxlU3RyZWFtJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9zdHJlYW1wYXJzZXIuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvdXRpbHMuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgW10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhybm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuc3RyZWFtcy5Ob2RlUmVhZGFibGVTdHJlYW0nLCAnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3hocm5vZGVyZWFkYWJsZXN0cmVhbV90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbVRlc3QnXSwgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhyc3RyZWFtcmVhZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmxvZycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy94aHJzdHJlYW1yZWFkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXJUZXN0J10sIFsnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0MS5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdGVzdGRhdGEvanNsb2FkZXJfdGVzdDIuanMnLCBbJ2dvb2cubmV0LnRlc3RkYXRhLmpzbG9hZGVyX3Rlc3QyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3Rlc3RkYXRhL2pzbG9hZGVyX3Rlc3QzLmpzJywgWydnb29nLm5ldC50ZXN0ZGF0YS5qc2xvYWRlcl90ZXN0MyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0NC5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdG1wbmV0d29yay5qcycsIFsnZ29vZy5uZXQudG1wbmV0d29yayddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5uZXQuQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0LmpzJywgWydnb29nLm5ldC5XZWJTb2NrZXQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkVycm9yRXZlbnQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJTb2NrZXQuTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LldlYlNvY2tldFRlc3QnXSwgWydnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LldlYlNvY2tldCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3dyYXBwZXJ4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuV3JhcHBlclhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hocmlvLmpzJywgWydnb29nLm5ldC5YaHJJbycsICdnb29nLm5ldC5YaHJJby5SZXNwb25zZVR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLm5ldC5YaHJJb1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cubmV0LlhocklvUG9vbCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2xfdGVzdC5qcycsIFsnZ29vZy5uZXQuWGhySW9Qb29sVGVzdCddLCBbJ2dvb2cubmV0LlhocklvUG9vbCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveGhybGlrZS5qcycsIFsnZ29vZy5uZXQuWGhyTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyLmpzJywgWydnb29nLm5ldC5YaHJNYW5hZ2VyJywgJ2dvb2cubmV0Llhock1hbmFnZXIuRXZlbnQnLCAnZ29vZy5uZXQuWGhyTWFuYWdlci5SZXF1ZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubmV0Llhock1hbmFnZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cubmV0Llhock1hbmFnZXInLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJb1Bvb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveG1saHR0cC5qcycsIFsnZ29vZy5uZXQuRGVmYXVsdFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5uZXQuWG1sSHR0cC5PcHRpb25UeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZScsICdnb29nLm5ldC5YbWxIdHRwRGVmaW5lcyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgWydnb29nLm5ldC5YaHJMaWtlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ2hhbm5lbFN0YXRlcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcycsICdnb29nLm5ldC54cGMuVXJpQ2ZnRmllbGRzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxUZXN0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuVXJpJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxyb2xlLmpzJywgWydnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5DZmdGaWVsZHMnLCAnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxSb2xlJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnQnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuRGlyZWN0VHJhbnNwb3J0VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9pZnJhbWVwb2xsaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5SZWNlaXZlcicsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5TZW5kZXInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvaWZyYW1lcG9sbGluZ3RyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLklmcmFtZVBvbGxpbmdUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvbmF0aXZlbWVzc2FnaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9uYXRpdmVtZXNzYWdpbmd0cmFuc3BvcnRfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9yZWxheS5qcycsIFsnZ29vZy5uZXQueHBjLnJlbGF5J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvdHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuVHJhbnNwb3J0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy94cGMuanMnLCBbJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5DaGFubmVsU3RhdGVzJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcycsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5uZXQueHBjLlVyaUNmZ0ZpZWxkcyddLCBbJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0LmpzJywgWydnb29nLm9iamVjdCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0X3Rlc3QuanMnLCBbJ2dvb2cub2JqZWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9hYnNvbHV0ZXBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzdHJhY3RQb3NpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYWJzdHJhY3Rwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYW5jaG9yZWRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uJ10sIFsnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkcG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQm94JywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5jbGllbnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvbWVudWFuY2hvcmVkcG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9tZW51YW5jaG9yZWRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5NZW51QW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvcG9zaXRpb25pbmcuanMnLCBbJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3Bvc2l0aW9uaW5nX3Rlc3QuanMnLCBbJ2dvb2cucG9zaXRpb25pbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy92aWV3cG9ydGNsaWVudHBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0Y2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbiddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvbmF0aXZlcmVzb2x2ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlciddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL25hdGl2ZXJlc29sdmVyX3Rlc3QuanMnLCBbJ2dvb2cucHJvbWlzZS5uYXRpdmVSZXNvbHZlclRlc3QnXSwgWydnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvcHJvbWlzZS5qcycsIFsnZ29vZy5Qcm9taXNlJ10sIFsnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Byb21pc2VfdGVzdC5qcycsIFsnZ29vZy5Qcm9taXNlVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Jlc29sdmVyLmpzJywgWydnb29nLnByb21pc2UuUmVzb2x2ZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Rlc3RzdWl0ZWFkYXB0ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS50ZXN0U3VpdGVBZGFwdGVyJ10sIFsnZ29vZy5Qcm9taXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3RoZW5hYmxlLmpzJywgWydnb29nLlRoZW5hYmxlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkRlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTWV0YWRhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3JfdGVzdC5qcycsIFsnZ29vZy5wcm90bzIuRGVzY3JpcHRvclRlc3QnXSwgWydnb29nLnByb3RvMi5EZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9maWVsZGRlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2ZpZWxkZGVzY3JpcHRvcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3JUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9sYXp5ZGVzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5MYXp5RGVzZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL21lc3NhZ2UuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9tZXNzYWdlX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2VUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9vYmplY3RzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvb2JqZWN0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLk9iamVjdFNlcmlhbGl6ZXInLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGFja2FnZV90ZXN0LnBiLmpzJywgWydzb21lcHJvdG9wYWNrYWdlLlRlc3RQYWNrYWdlVHlwZXMnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90bzIuUGJMaXRlU2VyaWFsaXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTGF6eURlc2VyaWFsaXplcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5QYkxpdGVTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLlBiTGl0ZVNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3Byb3RvX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLm1lc3NhZ2VUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcycsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnLCAnc29tZXByb3RvcGFja2FnZS5UZXN0UGFja2FnZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3NlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXN0LnBiLmpzJywgWydwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCcsICdwcm90bzIuVGVzdERlZmF1bHRDaGlsZCcsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvdGV4dGZvcm1hdHNlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5NZXNzYWdlJywgJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXh0Zm9ybWF0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5UZXh0Rm9ybWF0U2VyaWFsaXplclRlc3QnXSwgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJywgJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi91dGlsLmpzJywgWydnb29nLnByb3RvMi5VdGlsJ10sIFsnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvcHVic3ViLmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1biddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3B1YnN1Yl90ZXN0LmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3RvcGljaWQuanMnLCBbJ2dvb2cucHVic3ViLlRvcGljSWQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvdHlwZWRwdWJzdWIuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cucHVic3ViLlB1YlN1YiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3R5cGVkcHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5wdWJzdWIuVG9waWNJZCcsICdnb29nLnB1YnN1Yi5UeXBlZFB1YlN1YicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0LmpzJywgWydnb29nLnJlZmxlY3QnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0X3Rlc3QuanMnLCBbJ2dvb2cucmVmbGVjdFRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9jaGFpbl90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jaGFpblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvY29tYmluZV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jb21iaW5lVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L2RlZmVycmVkYWRhcHRvci5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5SZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZWZlcnJlZGFkYXB0b3JfdGVzdC5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5yZXN1bHQnLCAnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJywgJ2dvb2cucmVzdWx0LlNpbXBsZVJlc3VsdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZXBlbmRlbnRyZXN1bHQuanMnLCBbJ2dvb2cucmVzdWx0LkRlcGVuZGVudFJlc3VsdCddLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3Jlc3VsdF9pbnRlcmZhY2UuanMnLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCBbJ2dvb2cuVGhlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsLmpzJywgWydnb29nLnJlc3VsdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5yZXN1bHQuRGVwZW5kZW50UmVzdWx0JywgJ2dvb2cucmVzdWx0LlJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsX3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0VGVzdCddLCBbJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvc2ltcGxlcmVzdWx0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy5yZXN1bHQuU2ltcGxlUmVzdWx0LlN0YXRlRXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3NpbXBsZXJlc3VsdF90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHRUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC50cmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC93YWl0X3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0LndhaXRUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9kYXRhLmpzJywgWydnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENzcycsICdnb29nLnNveS5kYXRhLlNhbml0aXplZEh0bWwnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRIdG1sQXR0cmlidXRlJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkSnMnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRUcnVzdGVkUmVzb3VyY2VVcmknLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRVcmknXSwgWydnb29nLlVyaScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnN0cmluZy5Db25zdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L2RhdGFfdGVzdC5qcycsIFsnZ29vZy5zb3kuZGF0YVRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zb3kudGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyLmpzJywgWydnb29nLnNveS5JbmplY3RlZERhdGFTdXBwbGllcicsICdnb29nLnNveS5SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLnNveScsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cuc295LlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnNveS5SZW5kZXJlcicsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzb3kvc295LmpzJywgWydnb29nLnNveSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3NveV90ZXN0LmpzJywgWydnb29nLnNveVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc295JywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9zb3lfdGVzdGhlbHBlci5qcycsIFsnZ29vZy5zb3kudGVzdEhlbHBlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ3NzJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkVHJ1c3RlZFJlc291cmNlVXJpJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3BlbGwvc3BlbGxjaGVjay5qcycsIFsnZ29vZy5zcGVsbC5TcGVsbENoZWNrJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjay5Xb3JkQ2hhbmdlZEV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzcGVsbC9zcGVsbGNoZWNrX3Rlc3QuanMnLCBbJ2dvb2cuc3BlbGwuU3BlbGxDaGVja1Rlc3QnXSwgWydnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0YXRzL2Jhc2ljc3RhdC5qcycsIFsnZ29vZy5zdGF0cy5CYXNpY1N0YXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RhdHMvYmFzaWNzdGF0X3Rlc3QuanMnLCBbJ2dvb2cuc3RhdHMuQmFzaWNTdGF0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5zdGF0cy5CYXNpY1N0YXQnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy5Qc2V1ZG9SYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvY29sbGVjdGFibGVzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXInLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuRXhwaXJpbmdTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9jb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkNvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2NvbGxlY3RhYmxlc3RvcmFnZXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLmNvbGxlY3RhYmxlU3RvcmFnZVRlc3RlciddLCBbJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuYmFzZTY0JywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uU2VyaWFsaXplcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkVuY3J5cHRlZFN0b3JhZ2VUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXJyb3Jjb2RlLmpzJywgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9leHBpcmluZ3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXhwaXJpbmdzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2Vycm9yY29kZS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9lcnJvcmhhbmRsaW5nbWVjaGFuaXNtLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vZXJyb3JoYW5kbGluZ21lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc21UZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckhhbmRsaW5nTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXNlc3Npb25zdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVzZXNzaW9uc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVNlc3Npb25TdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVXZWJTdG9yYWdlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2lldXNlcmRhdGEuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pZXVzZXJkYXRhX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TZXBhcmF0aW9uVGVzdGVyJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2hhcmluZ1Rlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pdGVyYWJsZW1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaXRlcmFibGVtZWNoYW5pc210ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uaXRlcmFibGVNZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5NZWNoYW5pc20nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21mYWN0b3J5LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnknXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVTZXNzaW9uU3RvcmFnZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vbWVjaGFuaXNtZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnlUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21mYWN0b3J5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zZXBhcmF0aW9udGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zaGFyaW5ndGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc210ZXN0ZGVmaW5pdGlvbi5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLlByZWZpeGVkTWVjaGFuaXNtVGVzdCddLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TaGFyaW5nVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlLldyYXBwZXInXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2Uvc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2Uuc3RvcmFnZV90ZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2V0ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5zdG9yYWdlVGVzdGVyJ10sIFsnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9kZWZpbmVzLmpzJywgWydnb29nLnN0cmVhbXMuZGVmaW5lcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsJ10sIFsnZ29vZy5zdHJlYW1zLmRlZmluZXMnLCAnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCcsICdnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsSW1wbCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy5zdHJlYW1zLmZ1bGxUeXBlcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfaW1wbF90ZXN0LmpzJywgWydnb29nLnN0cmVhbXMuZnVsbEltcGxUZXN0J10sIFsnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsVGVzdENhc2VzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfbmF0aXZlX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMuZnVsbE5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmZ1bGxUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvZnVsbF90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJ10sIHsnbGFuZyc6ICdlczknLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX3R5cGVzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZS5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGUnXSwgWydnb29nLnN0cmVhbXMuZGVmaW5lcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJywgJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2xpdGVfaW1wbC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlcicsICdnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX2ltcGxfdGVzdC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsVGVzdCddLCBbJ2dvb2cuc3RyZWFtcy5saXRlSW1wbCcsICdnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnXSwgWydnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5saXRlTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90eXBlcy5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3QuanMnLCBbJ2dvb2cuc3RyaW5nLkNvbnN0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3RfdGVzdC5qcycsIFsnZ29vZy5zdHJpbmcuY29uc3RUZXN0J10sIFsnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9pbnRlcm5hbC5qcycsIFsnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL2xpbmtpZnkuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnknXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9saW5raWZ5X3Rlc3QuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5saW5raWZ5JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lcy5qcycsIFsnZ29vZy5zdHJpbmcubmV3bGluZXMnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMuTGluZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lc190ZXN0LmpzJywgWydnb29nLnN0cmluZy5uZXdsaW5lc1Rlc3QnXSwgWydnb29nLnN0cmluZy5uZXdsaW5lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhcnNlci5qcycsIFsnZ29vZy5zdHJpbmcuUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhdGguanMnLCBbJ2dvb2cuc3RyaW5nLnBhdGgnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvcGF0aF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5wYXRoVGVzdCddLCBbJ2dvb2cuc3RyaW5nLnBhdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9zdHJpbmcuanMnLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnXSwgWydnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ190ZXN0LmpzJywgWydnb29nLnN0cmluZ1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nYnVmZmVyLmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2J1ZmZlcl90ZXN0LmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXJUZXN0J10sIFsnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nZm9ybWF0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXQnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2Zvcm1hdF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXRUZXN0J10sIFsnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5naWZpZXIuanMnLCBbJ2dvb2cuc3RyaW5nLlN0cmluZ2lmaWVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3R5cGVkc3RyaW5nLmpzJywgWydnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvYXZsdHJlZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2F2bHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jaXJjdWxhcmJ1ZmZlci5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY2lyY3VsYXJidWZmZXJfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jb2xsZWN0aW9uLmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY29sbGVjdGlvbl90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvblRlc3QnXSwgWydnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2hlYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMuTm9kZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9oZWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuSGVhcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5JbnZlcnNpb25NYXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXBfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcFRlc3QnXSwgWydnb29nLnN0cnVjdHMuSW52ZXJzaW9uTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2xpbmtlZG1hcC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbGlua2VkbWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5MaW5rZWRNYXBUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbWFwLmpzJywgWydnb29nLnN0cnVjdHMuTWFwJ10sIFsnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL21hcF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuTWFwVGVzdCddLCBbJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9ub2RlLmpzJywgWydnb29nLnN0cnVjdHMuTm9kZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5zdHJ1Y3RzLlF1ZXVlJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUG9vbFRlc3QnXSwgWydnb29nLnN0cnVjdHMuUG9vbCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UG9vbCddLCBbJ2dvb2cuc3RydWN0cy5Qb29sJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlQb29sVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9wcmlvcml0eXF1ZXVlLmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlRdWV1ZSddLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UXVldWVUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3F1YWR0cmVlLmpzJywgWydnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLk5vZGUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLlBvaW50J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVhZHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWUuanMnLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1ZXVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXQuanMnLCBbJ2dvb2cuc3RydWN0cy5TZXQnXSwgWydnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc2ltcGxlcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RyaW5nc2V0LmpzJywgWydnb29nLnN0cnVjdHMuU3RyaW5nU2V0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zdHJpbmdzZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlN0cmluZ1NldFRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMuU3RyaW5nU2V0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3N0cnVjdHMuanMnLCBbJ2dvb2cuc3RydWN0cyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RydWN0c190ZXN0LmpzJywgWydnb29nLnN0cnVjdHNUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJlZW5vZGUuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RydWN0cy5Ob2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3RyZWVub2RlX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZVRlc3QnXSwgWydnb29nLnN0cnVjdHMuVHJlZU5vZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZV90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuVHJpZVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2JpZGkuanMnLCBbJ2dvb2cuc3R5bGUuYmlkaSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvYmlkaV90ZXN0LmpzJywgWydnb29nLnN0eWxlLmJpZGlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2N1cnNvci5qcycsIFsnZ29vZy5zdHlsZS5jdXJzb3InXSwgWydnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvY3Vyc29yX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuY3Vyc29yVGVzdCddLCBbJ2dvb2cuc3R5bGUuY3Vyc29yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZS5qcycsIFsnZ29vZy5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udmVuZG9yJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnN0eWxlX3Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbC5Vc2VyQWdlbnRzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfd2Via2l0X3Njcm9sbGJhcnNfdGVzdC5qcycsIFsnZ29vZy5zdHlsZS53ZWJraXRTY3JvbGxiYXJzVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGVTY3JvbGxiYXJUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3N0eWxlc2Nyb2xsYmFydGVzdGVyLmpzJywgWydnb29nLnN0eWxlU2Nyb2xsYmFyVGVzdGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS90cmFuc2Zvcm0uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNmb3JtJ10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zZm9ybVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy5zdHlsZS50cmFuc2Zvcm0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zaXRpb24uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNpdGlvbicsICdnb29nLnN0eWxlLnRyYW5zaXRpb24uQ3NzM1Byb3BlcnR5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zaXRpb25UZXN0J10sIFsnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RfbW9kdWxlLmpzJywgWydnb29nLnRlc3RfbW9kdWxlJ10sIFsnZ29vZy50ZXN0X21vZHVsZV9kZXAnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0X21vZHVsZV9kZXAuanMnLCBbJ2dvb2cudGVzdF9tb2R1bGVfZGVwJ10sIFtdLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0aW9uZmFpbHVyZS5qcycsIFsnZ29vZy50ZXN0aW5nLnNhZmUuYXNzZXJ0aW9uRmFpbHVyZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Fzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRvbScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sLmpzJywgWydnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbFRlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UuQ29udHJvbEJyZWFraW5nRXhjZXB0aW9uJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9hc3luY3Rlc3RjYXNlX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlQXN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jdGVzdGNhc2Vfbm9hc3luY190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVRlc3QnXSwgWydnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2JlbmNobWFyay5qcycsIFsnZ29vZy50ZXN0aW5nLmJlbmNobWFyayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2NvbnRpbnVhdGlvbnRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuQ29udGludWF0aW9uVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLkNvbnRpbnVhdGlvblRlc3QnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLlN0ZXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvY29udGludWF0aW9udGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Db250aW51YXRpb25UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kZWZlcnJlZHRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RlZmVycmVkdGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkRlZmVycmVkVGVzdENhc2VUZXN0J10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLk5vZGVJdGVyYXRvcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLml0ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nXSwgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvZG9tX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuZG9tVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2ZpZWxkbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL3Rlc3RoZWxwZXIuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy50ZXN0aW5nLmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvdGVzdGhlbHBlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50cy5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50c190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL21hdGNoZXJzLmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2V2ZW50cy9tYXRjaGVyc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL29ubGluZWhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0Lk5ldHdvcmtTdGF0dXNNb25pdG9yJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnRPYnNlcnZlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlcy5qcycsIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlc1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2Jsb2IuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LmJhc2U2NCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9ibG9iX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2RpcmVjdG9yeWVudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9lbnRyeS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cudGVzdGluZy5mcy5FbnRyeScsICdnb29nLnRlc3RpbmcuZnMuRmlsZUVudHJ5J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeUltcGwnLCAnZ29vZy5mcy5FbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZUVudHJ5JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2VudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5FbnRyeVRlc3QnXSwgWydnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGUnXSwgWydnb29nLnRlc3RpbmcuZnMuQmxvYiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxlZW50cnlfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVFbnRyeVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlRW50cnknLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZXJlYWRlci5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVyZWFkZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVzeXN0ZW0uanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJ10sIFsnZ29vZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyLmpzJywgWydnb29nLnRlc3RpbmcuZnMuRmlsZVdyaXRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcuZnMuRmlsZScsICdnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlU2F2ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnMuanMnLCBbJ2dvb2cudGVzdGluZy5mcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzVGVzdCddLCBbJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9pbnRlZ3JhdGlvbl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZnMuaW50ZWdyYXRpb25UZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVNhdmVyJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9wcm9ncmVzc2V2ZW50LmpzJywgWydnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Z1bmN0aW9ubW9jay5qcycsIFsnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2snLCAnZ29vZy50ZXN0aW5nLkdsb2JhbEZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTWV0aG9kTW9jayddLCBbJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnVuY3Rpb25tb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2dyYXBoaWNzLmpzJywgWydnb29nLnRlc3RpbmcuZ3JhcGhpY3MnXSwgWydnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzLmpzJywgWydnb29nLnRlc3RpbmcuaTE4bi5hc3NlcnRzJ10sIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5pMThuLmFzc2VydHNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmkxOG4uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkYXN5bmN3cmFwcGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZEFzeW5jV3JhcHBlciddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkdGVzdGNhc2VhZGFwdGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZFRlc3RDYXNlQWRhcHRlciddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Kc1RkQXN5bmNXcmFwcGVyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdC5qcycsIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdGV4Y2VwdGlvbi5qcycsIFsnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbiddLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2xvb3NlbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLkxvb3NlRXhwZWN0YXRpb25Db2xsZWN0aW9uJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbG9vc2Vtb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Mb29zZU1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJ10sIFsnZ29vZy5tZXNzYWdpbmcuQWJzdHJhY3RDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tZXNzYWdpbmcvbW9ja21lc3NhZ2VldmVudC5qcycsIFsnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZXBvcnQuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja1BvcnROZXR3b3JrJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydE5ldHdvcmsnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tFeHBlY3RhdGlvbiddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnByb21pc2UuUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZScsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Nb2NrRXhwZWN0YXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NsYXNzZmFjdG9yeS5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc1JlY29yZCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xhc3NmYWN0b3J5X3Rlc3QuanMnLCBbJ2Zha2UuQmFzZUNsYXNzJywgJ2Zha2UuQ2hpbGRDbGFzcycsICdnb29nLnRlc3RpbmcuTW9ja0NsYXNzRmFjdG9yeVRlc3QnXSwgWydnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2Nsb2NrLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xvY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbG9ja1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY29udHJvbC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NraW50ZXJmYWNlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZSddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrbWF0Y2hlcnMuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5JZ25vcmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkluc3RhbmNlT2YnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5PYmplY3RFcXVhbHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5SZWdleHBNYXRjaCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlNhdmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlR5cGVPZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja21hdGNoZXJzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb20uanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb21UZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3JhbmdlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlJ10sIFsnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5nZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2UuanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZSddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tTdG9yYWdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrdXNlcmFnZW50LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3VzZXJhZ2VudF90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbXVsdGl0ZXN0cnVubmVyLmpzJywgWydnb29nLnRlc3RpbmcuTXVsdGlUZXN0UnVubmVyJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXIuVGVzdEZyYW1lJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tdWx0aXRlc3RydW5uZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLnRlc3RpbmcubmV0Lk1vY2tJRnJhbWVJbyddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSWZyYW1lSW8nLCAnZ29vZy50ZXN0aW5nLlRlc3RRdWV1ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQveGhyaW8uanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuVGVzdFF1ZXVlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcubmV0LlhocklvVGVzdCddLCBbJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuSW5zdGFuY2VPZicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW9Qb29sJ10sIFsnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvb2JqZWN0cHJvcGVydHlzdHJpbmcuanMnLCBbJ2dvb2cudGVzdGluZy5PYmplY3RQcm9wZXJ0eVN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlLmpzJywgWydnb29nLnRlc3RpbmcucGFyYWxsZWxDbG9zdXJlVGVzdFN1aXRlJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cycsICdnb29nLmpzb24nLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wYXJhbGxlbENsb3N1cmVUZXN0U3VpdGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnBhcmFsbGVsQ2xvc3VyZVRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRhYmxlLmpzJywgWydnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BlcmZvcm1hbmNldGltZXIuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyLlRhc2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tYXRoJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRpbWVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlci5qcycsIFsnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvdG8yL3Byb3RvMi5qcycsIFsnZ29vZy50ZXN0aW5nLnByb3RvMiddLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuT2JqZWN0U2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wcm90bzIvcHJvdG8yX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wcm90bzJUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnByb3RvMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BzZXVkb3JhbmRvbS5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCBbJ2dvb2cuRGlzcG9zYWJsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wc2V1ZG9yYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbVRlc3QnXSwgWydnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uLmpzJywgWydnb29nLnRlc3RpbmcuRnVuY3Rpb25DYWxsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRDb25zdHJ1Y3RvcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvblRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkQ29uc3RydWN0b3InLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3NoYXJkaW5ndGVzdGNhc2UuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaGFyZGluZ3Rlc3RjYXNlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b24uanMnLCBbJ2dvb2cudGVzdGluZy5zaW5nbGV0b24nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b25fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnNpbmdsZXRvblRlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc2luZ2xldG9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0YWNrdHJhY2UuanMnLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJywgJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlLkZyYW1lJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RhY2t0cmFjZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZVRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZScsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZS5GcmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdG9yYWdlL2Zha2VtZWNoYW5pc20uanMnLCBbJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RyaWN0bW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5Nb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0cmljdG1vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3R5bGUvbGF5b3V0YXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlLmxheW91dGFzc2VydHMnXSwgWydnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9sYXlvdXRhc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5zdHlsZS5sYXlvdXRhc3NlcnRzVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3Rpbmcuc3R5bGUubGF5b3V0YXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZS5FcnJvcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuT3JkZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlLlJlc3VsdCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdENhc2VUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy5NZXRob2RNb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0cXVldWUuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RydW5uZXIuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuanNvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHJ1bm5lcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHN1aXRlLmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RzdWl0ZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHMuanMnLCBbJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnJlbmRlcmVyYXNzZXJ0c1Rlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3JlbmRlcmVyaGFybmVzcy5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3N0eWxlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy51aS5zdHlsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3RpbWVyL3RpbWVyLmpzJywgWydnb29nLlRpbWVyJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0aW1lci90aW1lcl90ZXN0LmpzJywgWydnb29nLlRpbWVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXMuanMnLCBbJ2dvb2cudHdlYWsuQmFzZUVudHJ5JywgJ2dvb2cudHdlYWsuQmFzZVByaW1pdGl2ZVNldHRpbmcnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXNfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5CYXNlRW50cnlUZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2Vhay50ZXN0aGVscGVycyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5LmpzJywgWydnb29nLnR3ZWFrLlJlZ2lzdHJ5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50d2Vhay5CYXNlUHJpbWl0aXZlU2V0dGluZycsICdnb29nLnR3ZWFrLkJhc2VTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cudHdlYWsuUmVnaXN0cnlUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdGVzdGhlbHBlcnMuanMnLCBbJ2dvb2cudHdlYWsudGVzdGhlbHBlcnMnXSwgWydnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuQm9vbGVhbkdyb3VwJywgJ2dvb2cudHdlYWsuQm9vbGVhbkluR3JvdXBTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5CdXR0b25BY3Rpb24nLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlJlZ2lzdHJ5JywgJ2dvb2cudHdlYWsuU3RyaW5nU2V0dGluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdHdlYWsuanMnLCBbJ2dvb2cudHdlYWsnLCAnZ29vZy50d2Vhay5Db25maWdQYXJhbXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5SZWdpc3RyeScsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWkuanMnLCBbJ2dvb2cudHdlYWsuRW50cmllc1BhbmVsJywgJ2dvb2cudHdlYWsuVHdlYWtVaSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLkJhc2VFbnRyeScsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWlfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5Ud2Vha1VpVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuVHdlYWtVaScsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWJzdHJhY3RzcGVsbGNoZWNrZXIuanMnLCBbJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlci5Bc3luY1Jlc3VsdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FjLmpzJywgWydnb29nLnVpLmFjJ10sIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5JbnB1dEhhbmRsZXInLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYWNfdGVzdC5qcycsIFsnZ29vZy51aS5hY1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNlbGVjdGlvbicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FycmF5bWF0Y2hlci5qcycsIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9hdXRvY29tcGxldGUuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlJywgJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXV0b2NvbXBsZXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbmRlck9wdGlvbnMnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2NhY2hpbmdtYXRjaGVyLmpzJywgWydnb29nLnVpLmFjLkNhY2hpbmdNYXRjaGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyJywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvY2FjaGluZ21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy51aS5hYy5DYWNoaW5nTWF0Y2hlclRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuQ2FjaGluZ01hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9pbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLnVpLmFjLklucHV0SGFuZGxlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2VsZWN0aW9uJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbW90ZS5qcycsIFsnZ29vZy51aS5hYy5SZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbW90ZUFycmF5TWF0Y2hlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvcmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5SZW1vdGVBcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW5kZXJlci5qcycsIFsnZ29vZy51aS5hYy5SZW5kZXJlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyLkN1c3RvbVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguZG9tLkZhZGVJbkFuZFNob3cnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5kb20uRmFkZUluQW5kU2hvdycsICdnb29nLmZ4LmRvbS5GYWRlT3V0QW5kSGlkZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcm9wdGlvbnMuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hpbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlciddLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlLmpzJywgWydnb29nLnVpLmFjLlJpY2hSZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLlJlbW90ZScsICdnb29nLnVpLmFjLlJlbmRlcmVyJywgJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJpY2hSZW1vdGVBcnJheU1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hyZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlclRlc3QnXSwgWydnb29nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjdGl2aXR5bW9uaXRvci5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FkdmFuY2VkdG9vbHRpcC5qcycsIFsnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWR2YW5jZWR0b29sdGlwX3Rlc3QuanMnLCBbJ2dvb2cudWkuQWR2YW5jZWRUb29sdGlwVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFkdmFuY2VkVG9vbHRpcCcsICdnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5LmpzJywgWydnb29nLnVpLkFuaW1hdGVkWmlwcHknXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZWFzaW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuQW5pbWF0ZWRaaXBweVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFuaW1hdGVkWmlwcHknLCAnZ29vZy51aS5aaXBweSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2F0dGFjaGFibGVtZW51LmpzJywgWydnb29nLnVpLkF0dGFjaGFibGVNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JdGVtRXZlbnQnLCAnZ29vZy51aS5NZW51QmFzZScsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0LmpzJywgWydnb29nLnVpLkJpZGlJbnB1dCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0X3Rlc3QuanMnLCBbJ2dvb2cudWkuQmlkaUlucHV0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5CaWRpSW5wdXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idWJibGUuanMnLCBbJ2dvb2cudWkuQnViYmxlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzb2x1dGVQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b24uanMnLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uLlNpZGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25fdGVzdC5qcycsIFsnZ29vZy51aS5CdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk5hdGl2ZUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2J1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25zaWRlLmpzJywgWydnb29nLnVpLkJ1dHRvblNpZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jaGFyY291bnRlci5qcycsIFsnZ29vZy51aS5DaGFyQ291bnRlcicsICdnb29nLnVpLkNoYXJDb3VudGVyLkRpc3BsYXknXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJjb3VudGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hhckNvdW50ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNoYXJDb3VudGVyJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hhcnBpY2tlci5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5zdHJ1Y3RzLlNldCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInLCAnZ29vZy51aS5GbGF0QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Ib3ZlckNhcmQnLCAnZ29vZy51aS5MYWJlbElucHV0JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRvb2x0aXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGFyUGlja2VyJywgJ2dvb2cudWkuRmxhdEJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3guanMnLCBbJ2dvb2cudWkuQ2hlY2tib3gnLCAnZ29vZy51aS5DaGVja2JveC5TdGF0ZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hlY2tib3hUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGVja2JveCcsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51aS5kZWNvcmF0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94bWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuQ2hlY2tCb3hNZW51SXRlbSddLCBbJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3hyZW5kZXJlci5qcycsIFsnZ29vZy51aS5DaGVja2JveFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JNZW51QnV0dG9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuUmVuZGVyZXJIYXJuZXNzJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b24nLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ycGFsZXR0ZS5qcycsIFsnZ29vZy51aS5Db2xvclBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuUGFsZXR0ZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29sb3JQYWxldHRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuQ29sb3JQaWNrZXInLCAnZ29vZy51aS5Db2xvclBpY2tlci5FdmVudFR5cGUnXSwgWydnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tYm9ib3guanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3gnLCAnZ29vZy51aS5Db21ib0JveEl0ZW0nXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubG9nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkl0ZW1FdmVudCcsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbWJvYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3hUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21ib0JveCcsICdnb29nLnVpLkNvbWJvQm94SXRlbScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnQuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50LkVycm9yJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tcG9uZW50X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnR1dGlsLmpzJywgWydnb29nLnVpLkNvbXBvbmVudFV0aWwnXSwgWydnb29nLmV2ZW50cy5Nb3VzZUFzTW91c2VFdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VFdmVudHMnLCAnZ29vZy5ldmVudHMuUG9pbnRlckFzTW91c2VFdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbXBvbmVudHV0aWxfdGVzdC5qcycsIFsnZ29vZy51aS5Db21wb25lbnRVdGlsVGVzdCddLCBbJ2dvb2cuZXZlbnRzLk1vdXNlQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRhaW5lci5qcycsIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Db250YWluZXIuRXZlbnRUeXBlJywgJ2dvb2cudWkuQ29udGFpbmVyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db21wb25lbnRVdGlsJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51aS5Db250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUV2ZW50JywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRyb2wnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udGFpbmVycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJTY3JvbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRhaW5lclNjcm9sbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9sLmpzJywgWydnb29nLnVpLkNvbnRyb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2xDb250ZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS5Db250cm9sVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udHJvbGNvbnRlbnQuanMnLCBbJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9scmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRyb2xSZW5kZXJlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb29raWVlZGl0b3IuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LmNvb2tpZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29va2llZWRpdG9yX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5jb29raWVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvb2tpZUVkaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NzczNidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3NzM21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Nzc25hbWVzLmpzJywgWydnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b24uanMnLCBbJ2dvb2cudWkuQ3VzdG9tQnV0dG9uJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21jb2xvcnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlJ10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3VzdG9tY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DdXN0b21Db2xvclBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyLmpzJywgWydnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5EYXRlUGlja2VyLkV2ZW50cycsICdnb29nLnVpLkRhdGVQaWNrZXJFdmVudCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuRGVmYXVsdERhdGVQaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLklkR2VuZXJhdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuRGF0ZVBpY2tlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSEsnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGF0ZVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RhdGVwaWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EYXRlUGlja2VyUmVuZGVyZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWNvcmF0ZS5qcycsIFsnZ29vZy51aS5kZWNvcmF0ZSddLCBbJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RlY29yYXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZGVjb3JhdGVUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmRlY29yYXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWZhdWx0ZGF0ZXBpY2tlcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkRlZmF1bHREYXRlUGlja2VyUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuRGF0ZVBpY2tlclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2cuanMnLCBbJ2dvb2cudWkuRGlhbG9nJywgJ2dvb2cudWkuRGlhbG9nLkJ1dHRvblNldCcsICdnb29nLnVpLkRpYWxvZy5CdXR0b25TZXQuRGVmYXVsdEJ1dHRvbnMnLCAnZ29vZy51aS5EaWFsb2cuRGVmYXVsdEJ1dHRvbkNhcHRpb25zJywgJ2dvb2cudWkuRGlhbG9nLkRlZmF1bHRCdXR0b25LZXlzJywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50JywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50VHlwZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Nb2RhbFBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2dfdGVzdC5qcycsIFsnZ29vZy51aS5EaWFsb2dUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5jc3MzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RpbWVuc2lvbnBpY2tlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXInXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLkFubm91bmNlcicsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkRpbWVuc2lvblBpY2tlclJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmFycmF5JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kcmFnZHJvcGRldGVjdG9yLmpzJywgWydnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3InLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkV2ZW50VHlwZScsICdnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3IuSW1hZ2VEcm9wRXZlbnQnLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkxpbmtEcm9wRXZlbnQnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RyaWxsZG93bnJvdy5qcycsIFsnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZHJpbGxkb3ducm93X3Rlc3QuanMnLCBbJ2dvb2cudWkuRHJpbGxkb3duUm93VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYWJzdHJhY3RkaWFsb2cuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nLkJ1aWxkZXInLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cuRXZlbnRUeXBlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cmluZycsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL2Fic3RyYWN0ZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9idWJibGUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm9iamVjdCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvd1N0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYnViYmxlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9kZWZhdWx0dG9vbGJhci5qcycsIFsnZ29vZy51aS5lZGl0b3IuQnV0dG9uRGVzY3JpcHRvcicsICdnb29nLnVpLmVkaXRvci5EZWZhdWx0VG9vbGJhciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nLmpzJywgWydnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cuQmVmb3JlVGVzdExpbmtFdmVudCcsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLkV2ZW50VHlwZScsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLk9rRXZlbnQnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTGlua0J1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2dUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLm1lc3NhZ2VzJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL21lc3NhZ2VzLmpzJywgWydnb29nLnVpLmVkaXRvci5tZXNzYWdlcyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyY29udHJvbGxlci5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckNvbnRyb2xsZXInXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyZmFjdG9yeS5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuT3B0aW9uJywgJ2dvb2cudWkuVG9vbGJhcicsICdnb29nLnVpLlRvb2xiYXJCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyQ29sb3JNZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInLCAnZ29vZy51aS5Ub29sYmFyU2VsZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvdG9vbGJhcmZhY3RvcnlfdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Vtb2ppcGFsZXR0ZS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSW1hZ2VMb2FkZXInLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuZW1vamkuRW1vamknLCAnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuRW1vamlQYWxldHRlUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLmVtb2ppLkVtb2ppJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaXBpY2tlci5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYlBhbmUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJywgJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Zhc3Rfbm9ucHJvZ3Jlc3NpdmVfZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5GYXN0Tm9uUHJvZ3Jlc3NpdmVFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudWkuZW1vamkuRW1vamlQaWNrZXInLCAnZ29vZy51aS5lbW9qaS5TcHJpdGVJbmZvJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZmFzdF9wcm9ncmVzc2l2ZV9lbW9qaXBpY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLkZhc3RQcm9ncmVzc2l2ZUVtb2ppUGlja2VyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3BvcHVwZW1vamlwaWNrZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9wb3B1cGVtb2ppcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3Byb2dyZXNzaXZlZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9zcHJpdGVpbmZvLmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvc3ByaXRlaW5mb190ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm9UZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnUuanMnLCBbJ2dvb2cudWkuRmlsdGVyZWRNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkZpbHRlck9ic2VydmluZ01lbnVJdGVtJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5GaWx0ZXJlZE1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRmlsdGVyZWRNZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJvYnNlcnZpbmdtZW51aXRlbS5qcycsIFsnZ29vZy51aS5GaWx0ZXJPYnNlcnZpbmdNZW51SXRlbSddLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZpbHRlcm9ic2VydmluZ21lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlciddLCBbJ2dvb2cudWkuTWVudUl0ZW1SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZmxhdGJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZsYXRtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmxhdE1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9mb3JtcG9zdC5qcycsIFsnZ29vZy51aS5Gb3JtUG9zdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Zvcm1wb3N0X3Rlc3QuanMnLCBbJ2dvb2cudWkuRm9ybVBvc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Gb3JtUG9zdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2UuanMnLCBbJ2dvb2cudWkuR2F1Z2UnLCAnZ29vZy51aS5HYXVnZUNvbG9yZWRSYW5nZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmVhc2luZycsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5tYXRoJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuR2F1Z2VUaGVtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2V0aGVtZS5qcycsIFsnZ29vZy51aS5HYXVnZVRoZW1lJ10sIFsnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaG92ZXJjYXJkLmpzJywgWydnb29nLnVpLkhvdmVyQ2FyZCcsICdnb29nLnVpLkhvdmVyQ2FyZC5FdmVudFR5cGUnLCAnZ29vZy51aS5Ib3ZlckNhcmQuVHJpZ2dlckV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51aS5Ub29sdGlwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9ob3ZlcmNhcmRfdGVzdC5qcycsIFsnZ29vZy51aS5Ib3ZlckNhcmRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSG92ZXJDYXJkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2YXBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3IuYWxwaGEnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkhzdlBhbGV0dGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdmFwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvci5hbHBoYScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Ic3ZhUGFsZXR0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2UGFsZXR0ZSddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2cGFsZXR0ZV90ZXN0LmpzJywgWydnb29nLnVpLkhzdlBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Ic3ZQYWxldHRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWRnZW5lcmF0b3IuanMnLCBbJ2dvb2cudWkuSWRHZW5lcmF0b3InXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXIuanMnLCBbJ2dvb2cudWkuSWRsZVRpbWVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXJfdGVzdC5qcycsIFsnZ29vZy51aS5JZGxlVGltZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSWRsZVRpbWVyJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lmcmFtZW1hc2suanMnLCBbJ2dvb2cudWkuSWZyYW1lTWFzayddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWZyYW1lbWFza190ZXN0LmpzJywgWydnb29nLnVpLklmcmFtZU1hc2tUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pZnJhbWUnLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5JZnJhbWVNYXNrJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pbWFnZWxlc3NidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ltYWdlbGVzc21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lucHV0ZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5JbnB1dERhdGVQaWNrZXInXSwgWydnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGFyc2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVpLlBvcHVwRGF0ZVBpY2tlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaW5wdXRkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaXRlbWV2ZW50LmpzJywgWydnb29nLnVpLkl0ZW1FdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZGV2ZW50ZGF0YS5qcycsIFsnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZHNob3J0Y3V0aGFuZGxlci5qcycsIFsnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0RXZlbnQnLCAnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0SGFuZGxlcicsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLkV2ZW50VHlwZScsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLk1vZGlmaWVycyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleU5hbWVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YScsICdnb29nLnVpLlN5bnRoZXRpY0tleWJvYXJkRXZlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2tleWJvYXJkc2hvcnRjdXRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9sYWJlbGlucHV0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbGFiZWxpbnB1dF90ZXN0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXRUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2xpbmtidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5MaW5rQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9mbGFzaG9iamVjdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0LlNjcmlwdEFjY2Vzc0xldmVsJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QuV21vZGVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cubG9nJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxhc2hvYmplY3RfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyLmpzJywgWydnb29nLnVpLm1lZGlhLkZsaWNrclNldCcsICdnb29nLnVpLm1lZGlhLkZsaWNrclNldE1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0TW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvLmpzJywgWydnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvJywgJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9Nb2RlbCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5Hb29nbGVWaWRlbycsICdnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYV90ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYW1vZGVsLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNhdGVnb3J5JywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNyZWRpdC5Sb2xlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQuU2NoZW1lJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5NZWRpdW0nLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLk1pbWVUeXBlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5QbGF5ZXInLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLlN1YlRpdGxlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5UaHVtYm5haWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvbXAzLmpzJywgWydnb29nLnVpLm1lZGlhLk1wMyddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21wM190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1wM1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1wMyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3Bob3RvLmpzJywgWydnb29nLnVpLm1lZGlhLlBob3RvJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGhvdG9fdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5QaG90b1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuUGhvdG8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9waWNhc2EuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhQWxidW0nLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bU1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGljYXNhX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bScsICdnb29nLnVpLm1lZGlhLlBpY2FzYUFsYnVtTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lby5qcycsIFsnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgWydnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lb190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLlZpbWVvVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS95b3V0dWJlLmpzJywgWydnb29nLnVpLm1lZGlhLllvdXR1YmUnLCAnZ29vZy51aS5tZWRpYS5Zb3V0dWJlTW9kZWwnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3lvdXR1YmVfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5Zb3V0dWJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuWW91dHViZScsICdnb29nLnVpLm1lZGlhLllvdXR1YmVNb2RlbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnUuanMnLCBbJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnUuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLk1lbnVIZWFkZXInLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YmFyLmpzJywgWydnb29nLnVpLm1lbnVCYXInXSwgWydnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLk1lbnVCYXJSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWJhcmRlY29yYXRvci5qcycsIFsnZ29vZy51aS5tZW51QmFyRGVjb3JhdG9yJ10sIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInLCAnZ29vZy51aS5tZW51QmFyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXNlLmpzJywgWydnb29nLnVpLk1lbnVCYXNlJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b24uanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklkR2VuZXJhdG9yJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuU3ViTWVudScsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9uX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlN1Yk1lbnUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9ucmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVoZWFkZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlciddLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLk1lbnVIZWFkZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aGVhZGVycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlclJlbmRlcmVyJ10sIFsnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtLmpzJywgWydnb29nLnVpLk1lbnVJdGVtJ10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUl0ZW1UZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aXRlbXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWl0ZW1yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5Db250YWluZXJSZW5kZXJlcicsICdnb29nLnVpLlNlcGFyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yJ10sIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51c2VwYXJhdG9ycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2NrYWN0aXZpdHltb25pdG9yLmpzJywgWydnb29nLnVpLk1vY2tBY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vY2thY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5Nb2NrQWN0aXZpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFsYXJpYXZpc2liaWxpdHloZWxwZXIuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2RhbGFyaWF2aXNpYmlsaXR5aGVscGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFscG9wdXAuanMnLCBbJ2dvb2cudWkuTW9kYWxQb3B1cCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlcicsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbW9kYWxwb3B1cF90ZXN0LmpzJywgWydnb29nLnVpLk1vZGFsUG9wdXBUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kaXNwb3NlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1vZGFsUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9uYXRpdmVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL25hdGl2ZWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTmF0aXZlQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL29wdGlvbi5qcycsIFsnZ29vZy51aS5PcHRpb24nXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BhbGV0dGUuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlSXRlcmF0b3InLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uZGF0YXNldCcsICdnb29nLml0ZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGFsZXR0ZXJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGxhaW50ZXh0c3BlbGxjaGVja2VyLmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BsYWludGV4dHNwZWxsY2hlY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwLmpzJywgWydnb29nLnVpLlBvcHVwJ10sIFsnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cFRlc3QnXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wb3B1cGJhc2UuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBCYXNlLkV2ZW50VHlwZScsICdnb29nLnVpLlBvcHVwQmFzZS5UeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cENvbG9yUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5Qb3B1cERhdGVQaWNrZXInXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51LmpzJywgWydnb29nLnVpLlBvcHVwTWVudSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuTW91c2VCdXR0b24nLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51X3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBNZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wcm9ncmVzc2Jhci5qcycsIFsnZ29vZy51aS5Qcm9ncmVzc0JhcicsICdnb29nLnVpLlByb2dyZXNzQmFyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlJhbmdlTW9kZWwnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdC5qcycsIFsnZ29vZy51aS5Qcm9tcHQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdF90ZXN0LmpzJywgWydnb29nLnVpLlByb21wdFRlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJpZGlJbnB1dCcsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlByb21wdCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmFuZ2Vtb2RlbC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JhbmdlbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmF0aW5ncy5qcycsIFsnZ29vZy51aS5SYXRpbmdzJywgJ2dvb2cudWkuUmF0aW5ncy5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JlZ2lzdHJ5LmpzJywgWydnb29nLnVpLnJlZ2lzdHJ5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmVnaXN0cnlfdGVzdC5qcycsIFsnZ29vZy51aS5yZWdpc3RyeVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yaWNodGV4dHNwZWxsY2hlY2tlci5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwTWVudSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmljaHRleHRzcGVsbGNoZWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLm9iamVjdCcsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JvdW5kZWRwYW5lbC5qcycsIFsnZ29vZy51aS5CYXNlUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuQ3NzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuR3JhcGhpY3NSb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwuQ29ybmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yb3VuZGVkcGFuZWxfdGVzdC5qcycsIFsnZ29vZy51aS5Sb3VuZGVkUGFuZWxUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNzc1JvdW5kZWRQYW5lbCcsICdnb29nLnVpLkdyYXBoaWNzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuUm91bmRlZFBhbmVsJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcm91bmRlZHRhYnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlJvdW5kZWRUYWJSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyLmpzJywgWydnb29nLnVpLlNjcm9sbEZsb2F0ZXInLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2Nyb2xsRmxvYXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0LmpzJywgWydnb29nLnVpLlNlbGVjdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdF90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdFRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TZWxlY3QnLCAnZ29vZy51aS5TZXBhcmF0b3InXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZWxlY3Rpb25tZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b24nLCAnZ29vZy51aS5TZWxlY3Rpb25NZW51QnV0dG9uLlNlbGVjdGlvblN0YXRlJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0aW9ubWVudWJ1dHRvbl90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VsZWN0aW9uTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2VsZWN0aW9uTW9kZWxUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VwYXJhdG9yLmpzJywgWydnb29nLnVpLlNlcGFyYXRvciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VydmVyY2hhcnQuanMnLCBbJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5BeGlzRGlzcGxheVR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5DaGFydFR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FbmNvZGluZ1R5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FdmVudCcsICdnb29nLnVpLlNlcnZlckNoYXJ0LkxlZ2VuZFBvc2l0aW9uJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTWF4aW11bVZhbHVlJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzQWxpZ25tZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzVHlwZScsICdnb29nLnVpLlNlcnZlckNoYXJ0LlVyaVBhcmFtJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuVXJpVG9vTG9uZ0V2ZW50J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZXJ2ZXJjaGFydF90ZXN0LmpzJywgWydnb29nLnVpLlNlcnZlckNoYXJ0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NsaWRlci5qcycsIFsnZ29vZy51aS5TbGlkZXInLCAnZ29vZy51aS5TbGlkZXIuT3JpZW50YXRpb24nXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5TbGlkZXJCYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlLmpzJywgWydnb29nLnVpLlNsaWRlckJhc2UnLCAnZ29vZy51aS5TbGlkZXJCYXNlLkFuaW1hdGlvbkZhY3RvcnknLCAnZ29vZy51aS5TbGlkZXJCYXNlLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuZnguQW5pbWF0aW9uUGFyYWxsZWxRdWV1ZScsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZG9tLlJlc2l6ZUhlaWdodCcsICdnb29nLmZ4LmRvbS5SZXNpemVXaWR0aCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2xpZGVyQmFzZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NwbGl0cGFuZS5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmUnLCAnZ29vZy51aS5TcGxpdFBhbmUuT3JpZW50YXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zcGxpdHBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU3BsaXRQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL2J1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9tZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuc3R5bGUuYXBwLkJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zdHlsZS9hcHAvbWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5zdHlsZS5hcHAuTWVudUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5QcmltYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuc3R5bGUnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudS5qcycsIFsnZ29vZy51aS5TdWJNZW51J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51UmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudV90ZXN0LmpzJywgWydnb29nLnVpLlN1Yk1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51JywgJ2dvb2cudWkuU3ViTWVudVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLlN1Yk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N5bnRoZXRpY2tleWJvYXJkZXZlbnQuanMnLCBbJ2dvb2cudWkuU3ludGhldGljS2V5Ym9hcmRFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudWkuS2V5Ym9hcmRFdmVudERhdGEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYi5qcycsIFsnZ29vZy51aS5UYWInXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYlJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFyLmpzJywgWydnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhci5Mb2NhdGlvbiddLCBbJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYkJhclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJCYXJSZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyLmpzJywgWydnb29nLnVpLlRhYmxlU29ydGVyJywgJ2dvb2cudWkuVGFibGVTb3J0ZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFibGVTb3J0ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuVGFiUGFuZScsICdnb29nLnVpLlRhYlBhbmUuRXZlbnRzJywgJ2dvb2cudWkuVGFiUGFuZS5UYWJMb2NhdGlvbicsICdnb29nLnVpLlRhYlBhbmUuVGFiUGFnZScsICdnb29nLnVpLlRhYlBhbmVFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJQYW5lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFicmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVGFiJywgJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90ZXh0YXJlYS5qcycsIFsnZ29vZy51aS5UZXh0YXJlYScsICdnb29nLnVpLlRleHRhcmVhLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFfdGVzdC5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRleHRhcmVhJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFyZW5kZXJlci5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVJlbmRlcmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhci5qcycsIFsnZ29vZy51aS5Ub29sYmFyJ10sIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ub29sYmFyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRvb2xiYXInLCAnZ29vZy51aS5Ub29sYmFyTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b24uanMnLCBbJ2dvb2cudWkuVG9vbGJhckJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhckJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Ub29sYmFyQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkN1c3RvbUJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b24nXSwgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcmNvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcycsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uJ10sIFsnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lclJlbmRlcmVyJywgJ2dvb2cudWkuU2VwYXJhdG9yJywgJ2dvb2cudWkuVG9vbGJhclNlcGFyYXRvclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyc2VsZWN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZWxlY3QnXSwgWydnb29nLnVpLlNlbGVjdCcsICdnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yJ10sIFsnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJzZXBhcmF0b3JyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuSU5MSU5FX0JMT0NLX0NMQVNTTkFNRScsICdnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFydG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJUb2dnbGVCdXR0b24nXSwgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sdGlwLmpzJywgWydnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51aS5Ub29sdGlwLkN1cnNvclRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuRWxlbWVudFRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuU3RhdGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbHRpcF90ZXN0LmpzJywgWydnb29nLnVpLlRvb2x0aXBUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvYmFzZW5vZGUuanMnLCBbJ2dvb2cudWkudHJlZS5CYXNlTm9kZScsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS9iYXNlbm9kZV90ZXN0LmpzJywgWydnb29nLnVpLnRyZWUuQmFzZU5vZGVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJywgJ2dvb2cudWkudHJlZS5UcmVlTm9kZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2wuanMnLCBbJ2dvb2cudWkudHJlZS5UcmVlQ29udHJvbCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVOb2RlJywgJ2dvb2cudWkudHJlZS5UeXBlQWhlYWQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVDb250cm9sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS90cmVlbm9kZS5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVOb2RlJ10sIFsnZ29vZy51aS50cmVlLkJhc2VOb2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmVlL3R5cGVhaGVhZC5qcycsIFsnZ29vZy51aS50cmVlLlR5cGVBaGVhZCcsICdnb29nLnVpLnRyZWUuVHlwZUFoZWFkLk9mZnNldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHlwZWFoZWFkX3Rlc3QuanMnLCBbJ2dvb2cudWkudHJlZS5UeXBlQWhlYWRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLnRyZWUuVHJlZUNvbnRyb2wnLCAnZ29vZy51aS50cmVlLlR5cGVBaGVhZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyaXN0YXRlbWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW0uU3RhdGUnXSwgWydnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmlzdGF0ZW1lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbVJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3R3b3RodW1ic2xpZGVyLmpzJywgWydnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuU2xpZGVyQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHdvdGh1bWJzbGlkZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ud29UaHVtYlNsaWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvemlwcHkuanMnLCBbJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweS5FdmVudHMnLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3ppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuWmlwcHlUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuWmlwcHknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXJpLmpzJywgWydnb29nLlVyaScsICdnb29nLlVyaS5RdWVyeURhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCcsICdnb29nLnVyaS51dGlscy5TdGFuZGFyZFF1ZXJ5UGFyYW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91cmlfdGVzdC5qcycsIFsnZ29vZy5VcmlUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91dGlscy5qcycsIFsnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXgnLCAnZ29vZy51cmkudXRpbHMuUXVlcnlBcnJheScsICdnb29nLnVyaS51dGlscy5RdWVyeVZhbHVlJywgJ2dvb2cudXJpLnV0aWxzLlN0YW5kYXJkUXVlcnlQYXJhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXRpbHNfdGVzdC5qcycsIFsnZ29vZy51cmkudXRpbHNUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVyaS51dGlscyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlci5qcycsIFsnZ29vZy51c2VyQWdlbnQuYWRvYmVSZWFkZXInXSwgWydnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlcl90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5hZG9iZVJlYWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmFkb2JlUmVhZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L2ZsYXNoLmpzJywgWydnb29nLnVzZXJBZ2VudC5mbGFzaCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvZmxhc2hfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuZmxhc2hUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9pcGhvdG8uanMnLCBbJ2dvb2cudXNlckFnZW50LmlwaG90byddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5qc2NyaXB0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9rZXlib2FyZC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmQnXSwgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQva2V5Ym9hcmRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmRUZXN0J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcGxhdGZvcm0uanMnLCBbJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wbGF0Zm9ybVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdC5qcycsIFsnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF9pc3ZlcnNpb24uanMnLCBbJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wcm9kdWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnQuanMnLCBbJ2dvb2cudXNlckFnZW50J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudF9xdWlya3NfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRRdWlya3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudHRlc3R1dGlsLmpzJywgWydnb29nLnVzZXJBZ2VudFRlc3RVdGlsJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwuVXNlckFnZW50cyddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDMyYXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQzMmFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDY0YXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQ2NGFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzLmpzJywgWydnb29nLnZlYy5NYXQzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLk1hdDNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5NYXQzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkLmpzJywgWydnb29nLnZlYy5tYXQzZCcsICdnb29nLnZlYy5tYXQzZC5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMudmVjM2QuVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDNkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMubWF0M2QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2YuanMnLCBbJ2dvb2cudmVjLm1hdDNmJywgJ2dvb2cudmVjLm1hdDNmLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2ZfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0M2ZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5tYXQzZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQ0LmpzJywgWydnb29nLnZlYy5NYXQ0J10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuVmVjMycsICdnb29nLnZlYy5WZWM0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NF90ZXN0LmpzJywgWydnb29nLnZlYy5NYXQ0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5WZWMzJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGQuanMnLCBbJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLm1hdDRkLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGRfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0NGRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmLmpzJywgWydnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy5tYXQ0Zi5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9xdWF0ZXJuaW9uLmpzJywgWydnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlF1YXRlcm5pb24uQW55VHlwZSddLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMuVmVjNCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3F1YXRlcm5pb25fdGVzdC5qcycsIFsnZ29vZy52ZWMuUXVhdGVybmlvblRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLk1hdDMnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMudmVjM2YnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5LmpzJywgWydnb29nLnZlYy5SYXknXSwgWydnb29nLnZlYy5WZWMzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLlJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMuanMnLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLkFueVR5cGUnLCAnZ29vZy52ZWMuQXJyYXlUeXBlJywgJ2dvb2cudmVjLkZsb2F0MzInLCAnZ29vZy52ZWMuRmxvYXQ2NCcsICdnb29nLnZlYy5OdW1iZXInXSwgWydnb29nLnZlYy5GbG9hdDMyQXJyYXknLCAnZ29vZy52ZWMuRmxvYXQ2NEFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMi5qcycsIFsnZ29vZy52ZWMuVmVjMiddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMl90ZXN0LmpzJywgWydnb29nLnZlYy5WZWMyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuVmVjMiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZC5qcycsIFsnZ29vZy52ZWMudmVjMmQnLCAnZ29vZy52ZWMudmVjMmQuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmRfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZi5qcycsIFsnZ29vZy52ZWMudmVjMmYnLCAnZ29vZy52ZWMudmVjMmYuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmZfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzLmpzJywgWydnb29nLnZlYy5WZWMzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLlZlYzNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5WZWMzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNkLmpzJywgWydnb29nLnZlYy52ZWMzZCcsICdnb29nLnZlYy52ZWMzZC5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZF90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNmLmpzJywgWydnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZl90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZlRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNmJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzQuanMnLCBbJ2dvb2cudmVjLlZlYzQnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRfdGVzdC5qcycsIFsnZ29vZy52ZWMuVmVjNFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGQuanMnLCBbJ2dvb2cudmVjLnZlYzRkJywgJ2dvb2cudmVjLnZlYzRkLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGYuanMnLCBbJ2dvb2cudmVjLnZlYzRmJywgJ2dvb2cudmVjLnZlYzRmLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGYnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3ZWJnbC93ZWJnbC5qcycsIFsnZ29vZy53ZWJnbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3dpbmRvdy93aW5kb3cuanMnLCBbJ2dvb2cud2luZG93J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3aW5kb3cvd2luZG93X3Rlc3QuanMnLCBbJ2dvb2cud2luZG93VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cud2luZG93J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9iYXNlLmpzCmZ1bmN0aW9uIHdhKGIpe3ZhciBkPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGQ8Yi5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6YltkKytdfTp7ZG9uZTohMH19fWZ1bmN0aW9uIGdiKGIpe3JldHVybntuZXh0OndhKGIpfX1mdW5jdGlvbiBsYihiKXt2YXIgZD0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZiW1N5bWJvbC5pdGVyYXRvcl07cmV0dXJuIGQ/ZC5jYWxsKGIpOmdiKGIpfXZhciB3Yj1mdW5jdGlvbihiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09Yj9iOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOmJ9KHRoaXMpLFJiPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oYixkLGYpe2IhPUFycmF5LnByb3RvdHlwZSYmYiE9T2JqZWN0LnByb3RvdHlwZSYmKGJbZF09Zi52YWx1ZSl9OwpmdW5jdGlvbiBVYihiLGQpe2lmKGQpe3ZhciBmPXdiO2I9Yi5zcGxpdCgiLiIpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGgtMTtoKyspe3ZhciBrPWJbaF07ayBpbiBmfHwoZltrXT17fSk7Zj1mW2tdfWI9YltiLmxlbmd0aC0xXTtoPWZbYl07ZD1kKGgpO2QhPWgmJm51bGwhPWQmJlJiKGYsYix7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmR9KX19ClViKCJQcm9taXNlIixmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHApe3RoaXMuc3RhdGVfPTA7dGhpcy5yZXN1bHRfPXZvaWQgMDt0aGlzLm9uU2V0dGxlZENhbGxiYWNrc189W107dmFyIG09dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtwKG0ucmVzb2x2ZSxtLnJlamVjdCl9Y2F0Y2gobil7bS5yZWplY3Qobil9fWZ1bmN0aW9uIGYoKXt0aGlzLmJhdGNoXz1udWxsfWZ1bmN0aW9uIGgocCl7c3dpdGNoKHR5cGVvZiBwKXtjYXNlICJvYmplY3QiOnJldHVybiBudWxsIT1wO2Nhc2UgImZ1bmN0aW9uIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBrKHApe3JldHVybiBwIGluc3RhbmNlb2YgZD9wOm5ldyBkKGZ1bmN0aW9uKG0pe20ocCl9KX1pZihiKXJldHVybiBiO2YucHJvdG90eXBlLmFzeW5jRXhlY3V0ZT1mdW5jdGlvbihwKXtpZihudWxsPT10aGlzLmJhdGNoXyl7dGhpcy5iYXRjaF89W107dmFyIG09dGhpczt0aGlzLmFzeW5jRXhlY3V0ZUZ1bmN0aW9uKGZ1bmN0aW9uKCl7bS5leGVjdXRlQmF0Y2hfKCl9KX10aGlzLmJhdGNoXy5wdXNoKHApfTsKdmFyIHQ9d2Iuc2V0VGltZW91dDtmLnByb3RvdHlwZS5hc3luY0V4ZWN1dGVGdW5jdGlvbj1mdW5jdGlvbihwKXt0KHAsMCl9O2YucHJvdG90eXBlLmV4ZWN1dGVCYXRjaF89ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYmF0Y2hfJiZ0aGlzLmJhdGNoXy5sZW5ndGg7KXt2YXIgcD10aGlzLmJhdGNoXzt0aGlzLmJhdGNoXz1bXTtmb3IodmFyIG09MDttPHAubGVuZ3RoOysrbSl7dmFyIG49cFttXTtwW21dPW51bGw7dHJ5e24oKX1jYXRjaChxKXt0aGlzLmFzeW5jVGhyb3dfKHEpfX19dGhpcy5iYXRjaF89bnVsbH07Zi5wcm90b3R5cGUuYXN5bmNUaHJvd189ZnVuY3Rpb24ocCl7dGhpcy5hc3luY0V4ZWN1dGVGdW5jdGlvbihmdW5jdGlvbigpe3Rocm93IHA7fSl9O2QucHJvdG90eXBlLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChxKXtyZXR1cm4gZnVuY3Rpb24odSl7bnx8KG49ITAscS5jYWxsKG0sdSkpfX12YXIgbT10aGlzLG49ITE7cmV0dXJue3Jlc29sdmU6cCh0aGlzLnJlc29sdmVUb18pLApyZWplY3Q6cCh0aGlzLnJlamVjdF8pfX07ZC5wcm90b3R5cGUucmVzb2x2ZVRvXz1mdW5jdGlvbihwKXtwPT09dGhpcz90aGlzLnJlamVjdF8obmV3IFR5cGVFcnJvcigiQSBQcm9taXNlIGNhbm5vdCByZXNvbHZlIHRvIGl0c2VsZiIpKTpwIGluc3RhbmNlb2YgZD90aGlzLnNldHRsZVNhbWVBc1Byb21pc2VfKHApOmgocCk/dGhpcy5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXyhwKTp0aGlzLmZ1bGZpbGxfKHApfTtkLnByb3RvdHlwZS5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXz1mdW5jdGlvbihwKXt2YXIgbT12b2lkIDA7dHJ5e209cC50aGVufWNhdGNoKG4pe3RoaXMucmVqZWN0XyhuKTtyZXR1cm59ImZ1bmN0aW9uIj09dHlwZW9mIG0/dGhpcy5zZXR0bGVTYW1lQXNUaGVuYWJsZV8obSxwKTp0aGlzLmZ1bGZpbGxfKHApfTtkLnByb3RvdHlwZS5yZWplY3RfPWZ1bmN0aW9uKHApe3RoaXMuc2V0dGxlXygyLHApfTtkLnByb3RvdHlwZS5mdWxmaWxsXz1mdW5jdGlvbihwKXt0aGlzLnNldHRsZV8oMSwKcCl9O2QucHJvdG90eXBlLnNldHRsZV89ZnVuY3Rpb24ocCxtKXtpZigwIT10aGlzLnN0YXRlXyl0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiK3ArIiwgIittKyIpOiBQcm9taXNlIGFscmVhZHkgc2V0dGxlZCBpbiBzdGF0ZSIrdGhpcy5zdGF0ZV8pO3RoaXMuc3RhdGVfPXA7dGhpcy5yZXN1bHRfPW07dGhpcy5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXygpfTtkLnByb3RvdHlwZS5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXz1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXyl7Zm9yKHZhciBwPTA7cDx0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ubGVuZ3RoOysrcClsLmFzeW5jRXhlY3V0ZSh0aGlzLm9uU2V0dGxlZENhbGxiYWNrc19bcF0pO3RoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz1udWxsfX07dmFyIGw9bmV3IGY7ZC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzUHJvbWlzZV89ZnVuY3Rpb24ocCl7dmFyIG09dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpOwpwLmNhbGxXaGVuU2V0dGxlZF8obS5yZXNvbHZlLG0ucmVqZWN0KX07ZC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzVGhlbmFibGVfPWZ1bmN0aW9uKHAsbSl7dmFyIG49dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtwLmNhbGwobSxuLnJlc29sdmUsbi5yZWplY3QpfWNhdGNoKHEpe24ucmVqZWN0KHEpfX07ZC5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oQSx5KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgQT9mdW5jdGlvbih3KXt0cnl7cShBKHcpKX1jYXRjaChDKXt1KEMpfX06eX12YXIgcSx1LHg9bmV3IGQoZnVuY3Rpb24oQSx5KXtxPUE7dT15fSk7dGhpcy5jYWxsV2hlblNldHRsZWRfKG4ocCxxKSxuKG0sdSkpO3JldHVybiB4fTtkLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCxwKX07ZC5wcm90b3R5cGUuY2FsbFdoZW5TZXR0bGVkXz1mdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXtzd2l0Y2gocS5zdGF0ZV8pe2Nhc2UgMTpwKHEucmVzdWx0Xyk7CmJyZWFrO2Nhc2UgMjptKHEucmVzdWx0Xyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBzdGF0ZTogIitxLnN0YXRlXyk7fX12YXIgcT10aGlzO251bGw9PXRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz9sLmFzeW5jRXhlY3V0ZShuKTp0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ucHVzaChuKX07ZC5yZXNvbHZlPWs7ZC5yZWplY3Q9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBkKGZ1bmN0aW9uKG0sbil7bihwKX0pfTtkLnJhY2U9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBkKGZ1bmN0aW9uKG0sbil7Zm9yKHZhciBxPWxiKHApLHU9cS5uZXh0KCk7IXUuZG9uZTt1PXEubmV4dCgpKWsodS52YWx1ZSkuY2FsbFdoZW5TZXR0bGVkXyhtLG4pfSl9O2QuYWxsPWZ1bmN0aW9uKHApe3ZhciBtPWxiKHApLG49bS5uZXh0KCk7cmV0dXJuIG4uZG9uZT9rKFtdKTpuZXcgZChmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgodyl7cmV0dXJuIGZ1bmN0aW9uKEMpe0Fbd109Qzt5LS07MD09CnkmJnEoQSl9fXZhciBBPVtdLHk9MDtkbyBBLnB1c2godm9pZCAwKSx5KyssayhuLnZhbHVlKS5jYWxsV2hlblNldHRsZWRfKHgoQS5sZW5ndGgtMSksdSksbj1tLm5leHQoKTt3aGlsZSghbi5kb25lKX0pfTtyZXR1cm4gZH0pO2Z1bmN0aW9uIGFjKGIpe2Z1bmN0aW9uIGQoaCl7cmV0dXJuIGIubmV4dChoKX1mdW5jdGlvbiBmKGgpe3JldHVybiBiLnRocm93KGgpfXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihoLGspe2Z1bmN0aW9uIHQobCl7bC5kb25lP2gobC52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGwudmFsdWUpLnRoZW4oZCxmKS50aGVuKHQsayl9dChiLm5leHQoKSl9KX1mdW5jdGlvbiBoYyhiKXtyZXR1cm4gYWMoYigpKX07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RlcHMuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovL2FuYWx5dGljcy5odG1sLmpzCndpbmRvdy5nYT1mdW5jdGlvbigpe307CgovLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiFmdW5jdGlvbihhLGIpe3ZhciBjPXt9LGQ9e30sZT17fSxmPW51bGw7IWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGE7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifWZ1bmN0aW9uIGQoKXt0aGlzLl9kZWxheT0wLHRoaXMuX2VuZERlbGF5PTAsdGhpcy5fZmlsbD0ibm9uZSIsdGhpcy5faXRlcmF0aW9uU3RhcnQ9MCx0aGlzLl9pdGVyYXRpb25zPTEsdGhpcy5fZHVyYXRpb249MCx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9kaXJlY3Rpb249Im5vcm1hbCIsdGhpcy5fZWFzaW5nPSJsaW5lYXIiLHRoaXMuX2Vhc2luZ0Z1bmN0aW9uPXd9ZnVuY3Rpb24gZSgpe3JldHVybiBhLmlzRGVwcmVjYXRlZCgiSW52YWxpZCB0aW1pbmcgaW5wdXRzIiwiMjAxNi0wMy0wMiIsIlR5cGVFcnJvciBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGluc3RlYWQuIiwhMCl9ZnVuY3Rpb24gZihiLGMsZSl7dmFyIGY9bmV3IGQ7cmV0dXJuIGMmJihmLmZpbGw9ImJvdGgiLGYuZHVyYXRpb249ImF1dG8iKSwibnVtYmVyIiE9dHlwZW9mIGJ8fGlzTmFOKGIpP3ZvaWQgMCE9PWImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoImF1dG8iIT1iW2NdKXtpZigoIm51bWJlciI9PXR5cGVvZiBmW2NdfHwiZHVyYXRpb24iPT1jKSYmKCJudW1iZXIiIT10eXBlb2YgYltjXXx8aXNOYU4oYltjXSkpKXJldHVybjtpZigiZmlsbCI9PWMmJi0xPT11LmluZGV4T2YoYltjXSkpcmV0dXJuO2lmKCJkaXJlY3Rpb24iPT1jJiYtMT09di5pbmRleE9mKGJbY10pKXJldHVybjtpZigicGxheWJhY2tSYXRlIj09YyYmMSE9PWJbY10mJmEuaXNEZXByZWNhdGVkKCJBbmltYXRpb25FZmZlY3RUaW1pbmcucGxheWJhY2tSYXRlIiwiMjAxNC0xMS0yOCIsIlVzZSBBbmltYXRpb24ucGxheWJhY2tSYXRlIGluc3RlYWQuIikpcmV0dXJuO2ZbY109YltjXX19KTpmLmR1cmF0aW9uPWIsZn1mdW5jdGlvbiBnKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYSYmKGE9aXNOYU4oYSk/e2R1cmF0aW9uOjB9OntkdXJhdGlvbjphfSksYX1mdW5jdGlvbiBoKGIsYyl7cmV0dXJuIGI9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYiksZihiLGMpfWZ1bmN0aW9uIGkoYSxiLGMsZCl7cmV0dXJuIDA+YXx8YT4xfHwwPmN8fGM+MT93OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGYoYSxiLGMpe3JldHVybiAzKmEqKDEtYykqKDEtYykqYyszKmIqKDEtYykqYypjK2MqYypjfWlmKDA9PWV8fDE9PWUpcmV0dXJuIGU7Zm9yKHZhciBnPTAsaD0xOzspe3ZhciBpPShnK2gpLzIsaj1mKGEsYyxpKTtpZihNYXRoLmFicyhlLWopPDFlLTQpcmV0dXJuIGYoYixkLGkpO2U+aj9nPWk6aD1pfX19ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjPj0xKXJldHVybiAxO3ZhciBkPTEvYTtyZXR1cm4gYys9YipkLGMtYyVkfX1mdW5jdGlvbiBrKGEpe0J8fChCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlKSxCLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uPSIiLEIuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249YTt2YXIgYj1CLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uO2lmKCIiPT1iJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcihhKyIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIGVhc2luZyIpO3ZhciBjPUQuZXhlYyhiKTtpZihjKXJldHVybiBpLmFwcGx5KHRoaXMsYy5zbGljZSgxKS5tYXAoTnVtYmVyKSk7dmFyIGQ9RS5leGVjKGIpO2lmKGQpcmV0dXJuIGooTnVtYmVyKGRbMV0pLHtzdGFydDp4LG1pZGRsZTp5LGVuZDp6fVtkWzJdXSk7dmFyIGY9QVtiXTtyZXR1cm4gZj9mOnd9ZnVuY3Rpb24gbChhKXtyZXR1cm4gTWF0aC5hYnMobShhKS9hLnBsYXliYWNrUmF0ZSl9ZnVuY3Rpb24gbShhKXtyZXR1cm4gYS5kdXJhdGlvbiphLml0ZXJhdGlvbnN9ZnVuY3Rpb24gbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/RjpiPGMuZGVsYXk/RzpiPj1jLmRlbGF5K2E/SDpJfWZ1bmN0aW9uIG8oYSxiLGMsZCxlKXtzd2l0Y2goZCl7Y2FzZSBHOnJldHVybiJiYWNrd2FyZHMiPT1ifHwiYm90aCI9PWI/MDpudWxsO2Nhc2UgSTpyZXR1cm4gYy1lO2Nhc2UgSDpyZXR1cm4iZm9yd2FyZHMiPT1ifHwiYm90aCI9PWI/YTpudWxsO2Nhc2UgRjpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gcChhLGIsYyxkKXtyZXR1cm4oZC5wbGF5YmFja1JhdGU8MD9iLWE6YikqZC5wbGF5YmFja1JhdGUrY31mdW5jdGlvbiBxKGEsYixjLGQsZSl7cmV0dXJuIGM9PT0xLzB8fGM9PT0tKDEvMCl8fGMtZD09YiYmZS5pdGVyYXRpb25zJiYoZS5pdGVyYXRpb25zK2UuaXRlcmF0aW9uU3RhcnQpJTE9PTA/YTpjJWF9ZnVuY3Rpb24gcihhLGIsYyxkKXtyZXR1cm4gMD09PWM/MDpiPT1hP2QuaXRlcmF0aW9uU3RhcnQrZC5pdGVyYXRpb25zLTE6TWF0aC5mbG9vcihjL2EpfWZ1bmN0aW9uIHMoYSxiLGMsZCl7dmFyIGU9YSUyPj0xLGY9Im5vcm1hbCI9PWQuZGlyZWN0aW9ufHxkLmRpcmVjdGlvbj09KGU/ImFsdGVybmF0ZS1yZXZlcnNlIjoiYWx0ZXJuYXRlIiksZz1mP2M6Yi1jLGg9Zy9iO3JldHVybiBiKmQuX2Vhc2luZ0Z1bmN0aW9uKGgpfWZ1bmN0aW9uIHQoYSxiLGMpe3ZhciBkPW4oYSxiLGMpLGU9byhhLGMuZmlsbCxiLGQsYy5kZWxheSk7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7aWYoMD09PWEpcmV0dXJuIGQ9PT1HPzA6MTt2YXIgZj1jLml0ZXJhdGlvblN0YXJ0KmMuZHVyYXRpb24sZz1wKGEsZSxmLGMpLGg9cShjLmR1cmF0aW9uLG0oYyksZyxmLGMpLGk9cihjLmR1cmF0aW9uLGgsZyxjKTtyZXR1cm4gcyhpLGMuZHVyYXRpb24saCxjKS9jLmR1cmF0aW9ufXZhciB1PSJiYWNrd2FyZHN8Zm9yd2FyZHN8Ym90aHxub25lIi5zcGxpdCgifCIpLHY9InJldmVyc2V8YWx0ZXJuYXRlfGFsdGVybmF0ZS1yZXZlcnNlIi5zcGxpdCgifCIpLHc9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2QucHJvdG90eXBlPXtfc2V0TWVtYmVyOmZ1bmN0aW9uKGIsYyl7dGhpc1siXyIrYl09Yyx0aGlzLl9lZmZlY3QmJih0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0W2JdPWMsdGhpcy5fZWZmZWN0Ll90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dCh0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0KSx0aGlzLl9lZmZlY3QuYWN0aXZlRHVyYXRpb249YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbih0aGlzLl9lZmZlY3QuX3RpbWluZyksdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24mJnRoaXMuX2VmZmVjdC5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBkZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImRlbGF5IixhKX0sZ2V0IGRlbGF5KCl7cmV0dXJuIHRoaXMuX2RlbGF5fSxzZXQgZW5kRGVsYXkoYSl7dGhpcy5fc2V0TWVtYmVyKCJlbmREZWxheSIsYSl9LGdldCBlbmREZWxheSgpe3JldHVybiB0aGlzLl9lbmREZWxheX0sc2V0IGZpbGwoYSl7dGhpcy5fc2V0TWVtYmVyKCJmaWxsIixhKX0sZ2V0IGZpbGwoKXtyZXR1cm4gdGhpcy5fZmlsbH0sc2V0IGl0ZXJhdGlvblN0YXJ0KGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvblN0YXJ0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLCByZWNlaXZlZDogIit0aW1pbmcuaXRlcmF0aW9uU3RhcnQpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9uU3RhcnQiLGEpfSxnZXQgaXRlcmF0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy5faXRlcmF0aW9uU3RhcnR9LHNldCBkdXJhdGlvbihhKXtpZigiYXV0byIhPWEmJihpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoImR1cmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZlIG9yIGF1dG8sIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiZHVyYXRpb24iLGEpfSxnZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb259LHNldCBkaXJlY3Rpb24oYSl7dGhpcy5fc2V0TWVtYmVyKCJkaXJlY3Rpb24iLGEpfSxnZXQgZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0IGVhc2luZyhhKXt0aGlzLl9lYXNpbmdGdW5jdGlvbj1rKGEpLHRoaXMuX3NldE1lbWJlcigiZWFzaW5nIixhKX0sZ2V0IGVhc2luZygpe3JldHVybiB0aGlzLl9lYXNpbmd9LHNldCBpdGVyYXRpb25zKGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvbnMgbXVzdCBiZSBub24tbmVnYXRpdmUsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9ucyIsYSl9LGdldCBpdGVyYXRpb25zKCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvbnN9fTt2YXIgeD0xLHk9LjUsej0wLEE9e2Vhc2U6aSguMjUsLjEsLjI1LDEpLCJlYXNlLWluIjppKC40MiwwLDEsMSksImVhc2Utb3V0IjppKDAsMCwuNTgsMSksImVhc2UtaW4tb3V0IjppKC40MiwwLC41OCwxKSwic3RlcC1zdGFydCI6aigxLHgpLCJzdGVwLW1pZGRsZSI6aigxLHkpLCJzdGVwLWVuZCI6aigxLHopfSxCPW51bGwsQz0iXFxzKigtP1xcZCtcXC4/XFxkKnwtP1xcLlxcZCspXFxzKiIsRD1uZXcgUmVnRXhwKCJjdWJpYy1iZXppZXJcXCgiK0MrIiwiK0MrIiwiK0MrIiwiK0MrIlxcKSIpLEU9L3N0ZXBzXChccyooXGQrKVxzKixccyooc3RhcnR8bWlkZGxlfGVuZClccypcKS8sRj0wLEc9MSxIPTIsST0zO2EuY2xvbmVUaW1pbmdJbnB1dD1jLGEubWFrZVRpbWluZz1mLGEubnVtZXJpY1RpbWluZ1RvT2JqZWN0PWcsYS5ub3JtYWxpemVUaW1pbmdJbnB1dD1oLGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb249bCxhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbj10LGEuY2FsY3VsYXRlUGhhc2U9bixhLnRvVGltaW5nRnVuY3Rpb249a30oYyxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYSBpbiBqP2pbYV1bYl18fGI6Yn1mdW5jdGlvbiBkKGEsYixkKXt2YXIgZT1nW2FdO2lmKGUpe2guc3R5bGVbYV09Yjtmb3IodmFyIGYgaW4gZSl7dmFyIGk9ZVtmXSxqPWguc3R5bGVbaV07ZFtpXT1jKGksail9fWVsc2UgZFthXT1jKGEsYil9ZnVuY3Rpb24gZShhKXt2YXIgYj1bXTtmb3IodmFyIGMgaW4gYSlpZighKGMgaW5bImVhc2luZyIsIm9mZnNldCIsImNvbXBvc2l0ZSJdKSl7dmFyIGQ9YVtjXTtBcnJheS5pc0FycmF5KGQpfHwoZD1bZF0pO2Zvcih2YXIgZSxmPWQubGVuZ3RoLGc9MDtmPmc7ZysrKWU9e30sIm9mZnNldCJpbiBhP2Uub2Zmc2V0PWEub2Zmc2V0OjE9PWY/ZS5vZmZzZXQ9MTplLm9mZnNldD1nLyhmLTEpLCJlYXNpbmciaW4gYSYmKGUuZWFzaW5nPWEuZWFzaW5nKSwiY29tcG9zaXRlImluIGEmJihlLmNvbXBvc2l0ZT1hLmNvbXBvc2l0ZSksZVtjXT1kW2ddLGIucHVzaChlKX1yZXR1cm4gYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEub2Zmc2V0LWIub2Zmc2V0fSksYn1mdW5jdGlvbiBmKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYT1jLmxlbmd0aDtudWxsPT1jW2EtMV0ub2Zmc2V0JiYoY1thLTFdLm9mZnNldD0xKSxhPjEmJm51bGw9PWNbMF0ub2Zmc2V0JiYoY1swXS5vZmZzZXQ9MCk7Zm9yKHZhciBiPTAsZD1jWzBdLm9mZnNldCxlPTE7YT5lO2UrKyl7dmFyIGY9Y1tlXS5vZmZzZXQ7aWYobnVsbCE9Zil7Zm9yKHZhciBnPTE7ZS1iPmc7ZysrKWNbYitnXS5vZmZzZXQ9ZCsoZi1kKSpnLyhlLWIpO2I9ZSxkPWZ9fX1pZihudWxsPT1hKXJldHVybltdO3dpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmFbU3ltYm9sLml0ZXJhdG9yXSYmKGE9QXJyYXkuZnJvbShhKSksQXJyYXkuaXNBcnJheShhKXx8KGE9ZShhKSk7Zm9yKHZhciBjPWEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKXt2YXIgZT1hW2NdO2lmKCJvZmZzZXQiPT1jKXtpZihudWxsIT1lJiYoZT1OdW1iZXIoZSksIWlzRmluaXRlKGUpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJrZXlmcmFtZSBvZmZzZXRzIG11c3QgYmUgbnVtYmVycy4iKX1lbHNle2lmKCJjb21wb3NpdGUiPT1jKXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLG5hbWU6Ik5vdFN1cHBvcnRlZEVycm9yIixtZXNzYWdlOiJhZGQgY29tcG9zaXRpbmcgaXMgbm90IHN1cHBvcnRlZCJ9O2U9IiIrZX1kKGMsZSxiKX1yZXR1cm4gdm9pZCAwPT1iLm9mZnNldCYmKGIub2Zmc2V0PW51bGwpLGJ9KSxmPSEwLGc9LSgxLzApLGg9MDtoPGMubGVuZ3RoO2grKyl7dmFyIGk9Y1toXS5vZmZzZXQ7aWYobnVsbCE9aSl7aWYoZz5pKXRocm93e2NvZGU6RE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUixuYW1lOiJJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3IiLG1lc3NhZ2U6IktleWZyYW1lcyBhcmUgbm90IGxvb3NlbHkgc29ydGVkIGJ5IG9mZnNldC4gU29ydCBvciBzcGVjaWZ5IG9mZnNldHMuIn07Zz1pfWVsc2UgZj0hMX1yZXR1cm4gYz1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXQ+PTAmJmEub2Zmc2V0PD0xfSksZnx8YigpLGN9dmFyIGc9e2JhY2tncm91bmQ6WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kQXR0YWNobWVudCIsImJhY2tncm91bmRPcmlnaW4iLCJiYWNrZ3JvdW5kQ2xpcCIsImJhY2tncm91bmRDb2xvciJdLGJvcmRlcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRXaWR0aCJdLGJvcmRlckJvdHRvbTpbImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21Db2xvciJdLGJvcmRlckNvbG9yOlsiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiXSxib3JkZXJMZWZ0OlsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyUmFkaXVzOlsiYm9yZGVyVG9wTGVmdFJhZGl1cyIsImJvcmRlclRvcFJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIl0sYm9yZGVyUmlnaHQ6WyJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0Q29sb3IiXSxib3JkZXJUb3A6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wQ29sb3IiXSxib3JkZXJXaWR0aDpbImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIl0sZmxleDpbImZsZXhHcm93IiwiZmxleFNocmluayIsImZsZXhCYXNpcyJdLGZvbnQ6WyJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250U3R5bGUiLCJmb250VmFyaWFudCIsImZvbnRXZWlnaHQiLCJsaW5lSGVpZ2h0Il0sbWFyZ2luOlsibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5MZWZ0Il0sb3V0bGluZTpbIm91dGxpbmVDb2xvciIsIm91dGxpbmVTdHlsZSIsIm91dGxpbmVXaWR0aCJdLHBhZGRpbmc6WyJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0Il19LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IiksaT17dGhpbjoiMXB4IixtZWRpdW06IjNweCIsdGhpY2s6IjVweCJ9LGo9e2JvcmRlckJvdHRvbVdpZHRoOmksYm9yZGVyTGVmdFdpZHRoOmksYm9yZGVyUmlnaHRXaWR0aDppLGJvcmRlclRvcFdpZHRoOmksZm9udFNpemU6eyJ4eC1zbWFsbCI6IjYwJSIsIngtc21hbGwiOiI3NSUiLHNtYWxsOiI4OSUiLG1lZGl1bToiMTAwJSIsbGFyZ2U6IjEyMCUiLCJ4LWxhcmdlIjoiMTUwJSIsInh4LWxhcmdlIjoiMjAwJSJ9LGZvbnRXZWlnaHQ6e25vcm1hbDoiNDAwIixib2xkOiI3MDAifSxvdXRsaW5lV2lkdGg6aSx0ZXh0U2hhZG93Ontub25lOiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9LGJveFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggMHB4IHRyYW5zcGFyZW50In19O2EuY29udmVydFRvQXJyYXlGb3JtPWUsYS5ub3JtYWxpemVLZXlmcmFtZXM9Zn0oYyxmKSxmdW5jdGlvbihhKXt2YXIgYj17fTthLmlzRGVwcmVjYXRlZD1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyIsZz1uZXcgRGF0ZSxoPW5ldyBEYXRlKGMpO3JldHVybiBoLnNldE1vbnRoKGguZ2V0TW9udGgoKSszKSxoPmc/KGEgaW4gYnx8Y29uc29sZS53YXJuKCJXZWIgQW5pbWF0aW9uczogIithKyIgIitmKyIgZGVwcmVjYXRlZCBhbmQgd2lsbCBzdG9wIHdvcmtpbmcgb24gIitoLnRvRGF0ZVN0cmluZygpKyIuICIrZCksYlthXT0hMCwhMSk6ITB9LGEuZGVwcmVjYXRlZD1mdW5jdGlvbihiLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyI7aWYoYS5pc0RlcHJlY2F0ZWQoYixjLGQsZSkpdGhyb3cgbmV3IEVycm9yKGIrIiAiK2YrIiBubyBsb25nZXIgc3VwcG9ydGVkLiAiK2QpfX0oYyksZnVuY3Rpb24oKXtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYW5pbWF0ZSl7dmFyIGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUoW10sMCksYj0hMDtpZihhJiYoYj0hMSwicGxheXxjdXJyZW50VGltZXxwYXVzZXxyZXZlcnNlfHBsYXliYWNrUmF0ZXxjYW5jZWx8ZmluaXNofHN0YXJ0VGltZXxwbGF5U3RhdGUiLnNwbGl0KCJ8IikuZm9yRWFjaChmdW5jdGlvbihjKXt2b2lkIDA9PT1hW2NdJiYoYj0hMCl9KSksIWIpcmV0dXJufSFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBhW2NdKWlmKCJvZmZzZXQiIT1kJiYiZWFzaW5nIiE9ZCYmImNvbXBvc2l0ZSIhPWQpe3ZhciBlPXtvZmZzZXQ6YVtjXS5vZmZzZXQsZWFzaW5nOmFbY10uZWFzaW5nLHZhbHVlOmFbY11bZF19O2JbZF09YltkXXx8W10sYltkXS5wdXNoKGUpfWZvcih2YXIgZiBpbiBiKXt2YXIgZz1iW2ZdO2lmKDAhPWdbMF0ub2Zmc2V0fHwxIT1nW2cubGVuZ3RoLTFdLm9mZnNldCl0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiUGFydGlhbCBrZXlmcmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQifX1yZXR1cm4gYn1mdW5jdGlvbiBlKGMpe3ZhciBkPVtdO2Zvcih2YXIgZSBpbiBjKWZvcih2YXIgZj1jW2VdLGc9MDtnPGYubGVuZ3RoLTE7ZysrKXt2YXIgaD1mW2ddLm9mZnNldCxpPWZbZysxXS5vZmZzZXQsaj1mW2ddLnZhbHVlLGs9ZltnKzFdLnZhbHVlLGw9ZltnXS5lYXNpbmc7aD09aSYmKDE9PWk/aj1rOms9aiksZC5wdXNoKHtzdGFydFRpbWU6aCxlbmRUaW1lOmksZWFzaW5nOmEudG9UaW1pbmdGdW5jdGlvbihsP2w6ImxpbmVhciIpLHByb3BlcnR5OmUsaW50ZXJwb2xhdGlvbjpiLnByb3BlcnR5SW50ZXJwb2xhdGlvbihlLGosayl9KX1yZXR1cm4gZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3RhcnRUaW1lLWIuc3RhcnRUaW1lfSksZH1iLmNvbnZlcnRFZmZlY3RJbnB1dD1mdW5jdGlvbihjKXt2YXIgZj1hLm5vcm1hbGl6ZUtleWZyYW1lcyhjKSxnPWQoZiksaD1lKGcpO3JldHVybiBmdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpaC5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIDA+PWMmJjA9PWEuc3RhcnRUaW1lfHxjPj0xJiYxPT1hLmVuZFRpbWV8fGM+PWEuc3RhcnRUaW1lJiZjPD1hLmVuZFRpbWV9KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWMtZC5zdGFydFRpbWUsZj1kLmVuZFRpbWUtZC5zdGFydFRpbWUsZz0wPT1mPzA6ZC5lYXNpbmcoZS9mKTtiLmFwcGx5KGEsZC5wcm9wZXJ0eSxkLmludGVycG9sYXRpb24oZykpfSk7ZWxzZSBmb3IodmFyIGQgaW4gZykib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kJiZiLmNsZWFyKGEsZCl9fX0oYyxkLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KX1mdW5jdGlvbiBlKGEsYixjKXtoW2NdPWhbY118fFtdLGhbY10ucHVzaChbYSxiXSl9ZnVuY3Rpb24gZihhLGIsYyl7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe3ZhciBnPWNbZl07ZShhLGIsZChnKSl9fWZ1bmN0aW9uIGcoYyxlLGYpe3ZhciBnPWM7Ly0vLnRlc3QoYykmJiFhLmlzRGVwcmVjYXRlZCgiSHlwaGVuYXRlZCBwcm9wZXJ0eSBuYW1lcyIsIjIwMTYtMDMtMjIiLCJVc2UgY2FtZWxDYXNlIGluc3RlYWQuIiwhMCkmJihnPWQoYykpLCJpbml0aWFsIiE9ZSYmImluaXRpYWwiIT1mfHwoImluaXRpYWwiPT1lJiYoZT1pW2ddKSwiaW5pdGlhbCI9PWYmJihmPWlbZ10pKTtmb3IodmFyIGo9ZT09Zj9bXTpoW2ddLGs9MDtqJiZrPGoubGVuZ3RoO2srKyl7dmFyIGw9altrXVswXShlKSxtPWpba11bMF0oZik7aWYodm9pZCAwIT09bCYmdm9pZCAwIT09bSl7dmFyIG49altrXVsxXShsLG0pO2lmKG4pe3ZhciBvPWIuSW50ZXJwb2xhdGlvbi5hcHBseShudWxsLG4pO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gMD09YT9lOjE9PWE/ZjpvKGEpfX19fXJldHVybiBiLkludGVycG9sYXRpb24oITEsITAsZnVuY3Rpb24oYSl7cmV0dXJuIGE/ZjplfSl9dmFyIGg9e307Yi5hZGRQcm9wZXJ0aWVzSGFuZGxlcj1mO3ZhciBpPXtiYWNrZ3JvdW5kQ29sb3I6InRyYW5zcGFyZW50IixiYWNrZ3JvdW5kUG9zaXRpb246IjAlIDAlIixib3JkZXJCb3R0b21Db2xvcjoiY3VycmVudENvbG9yIixib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIzcHgiLGJvcmRlckxlZnRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJMZWZ0V2lkdGg6IjNweCIsYm9yZGVyUmlnaHRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJSaWdodFdpZHRoOiIzcHgiLGJvcmRlclNwYWNpbmc6IjJweCIsYm9yZGVyVG9wQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyVG9wTGVmdFJhZGl1czoiMHB4Iixib3JkZXJUb3BSaWdodFJhZGl1czoiMHB4Iixib3JkZXJUb3BXaWR0aDoiM3B4Iixib3R0b206ImF1dG8iLGNsaXA6InJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KSIsY29sb3I6ImJsYWNrIixmb250U2l6ZToiMTAwJSIsZm9udFdlaWdodDoiNDAwIixoZWlnaHQ6ImF1dG8iLGxlZnQ6ImF1dG8iLGxldHRlclNwYWNpbmc6Im5vcm1hbCIsbGluZUhlaWdodDoiMTIwJSIsbWFyZ2luQm90dG9tOiIwcHgiLG1hcmdpbkxlZnQ6IjBweCIsbWFyZ2luUmlnaHQ6IjBweCIsbWFyZ2luVG9wOiIwcHgiLG1heEhlaWdodDoibm9uZSIsbWF4V2lkdGg6Im5vbmUiLG1pbkhlaWdodDoiMHB4IixtaW5XaWR0aDoiMHB4IixvcGFjaXR5OiIxLjAiLG91dGxpbmVDb2xvcjoiaW52ZXJ0IixvdXRsaW5lT2Zmc2V0OiIwcHgiLG91dGxpbmVXaWR0aDoiM3B4IixwYWRkaW5nQm90dG9tOiIwcHgiLHBhZGRpbmdMZWZ0OiIwcHgiLHBhZGRpbmdSaWdodDoiMHB4IixwYWRkaW5nVG9wOiIwcHgiLHJpZ2h0OiJhdXRvIix0ZXh0SW5kZW50OiIwcHgiLHRleHRTaGFkb3c6IjBweCAwcHggMHB4IHRyYW5zcGFyZW50Iix0b3A6ImF1dG8iLHRyYW5zZm9ybToiIix2ZXJ0aWNhbEFsaWduOiIwcHgiLHZpc2liaWxpdHk6InZpc2libGUiLHdpZHRoOiJhdXRvIix3b3JkU3BhY2luZzoibm9ybWFsIix6SW5kZXg6ImF1dG8ifTtiLnByb3BlcnR5SW50ZXJwb2xhdGlvbj1nfShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dmFyIGM9YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihiKSxkPWZ1bmN0aW9uKGQpe3JldHVybiBhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihjLGQsYil9O3JldHVybiBkLl90b3RhbER1cmF0aW9uPWIuZGVsYXkrYytiLmVuZERlbGF5LGQuX2lzQ3VycmVudD1mdW5jdGlvbihkKXt2YXIgZT1hLmNhbGN1bGF0ZVBoYXNlKGMsZCxiKTtyZXR1cm4gZT09PVBoYXNlQWN0aXZlfHxlPT09UGhhc2VCZWZvcmV9LGR9Yi5LZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihjLGUsZixnKXt2YXIgaCxpPWQoYS5ub3JtYWxpemVUaW1pbmdJbnB1dChmKSksaj1iLmNvbnZlcnRFZmZlY3RJbnB1dChlKSxrPWZ1bmN0aW9uKCl7aihjLGgpfTtyZXR1cm4gay5fdXBkYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBoPWkoYSksbnVsbCE9PWh9LGsuX2NsZWFyPWZ1bmN0aW9uKCl7aihjLG51bGwpfSxrLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBjPT09YX0say5faXNDdXJyZW50PWkuX2lzQ3VycmVudCxrLl90b3RhbER1cmF0aW9uPWkuX3RvdGFsRHVyYXRpb24say5faWQ9ZyxrfSxiLk51bGxFZmZlY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oKXthJiYoYSgpLGE9bnVsbCl9O3JldHVybiBiLl91cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sYi5fdG90YWxEdXJhdGlvbj0wLGIuX2lzQ3VycmVudD1mdW5jdGlvbigpe3JldHVybiExfSxiLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LGJ9fShjLGQsZiksZnVuY3Rpb24oYSxiKXthLmFwcGx5PWZ1bmN0aW9uKGIsYyxkKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT1kfSxhLmNsZWFyPWZ1bmN0aW9uKGIsYyl7Yi5zdHlsZVthLnByb3BlcnR5TmFtZShjKV09IiJ9fShkLGYpLGZ1bmN0aW9uKGEpe3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGEudGltZWxpbmUuX3BsYXkoYS5LZXlmcmFtZUVmZmVjdCh0aGlzLGIsYyxkKSl9fShkKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGQpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmIm51bWJlciI9PXR5cGVvZiBiKXJldHVybiBhKigxLWQpK2IqZDtpZigiYm9vbGVhbiI9PXR5cGVvZiBhJiYiYm9vbGVhbiI9PXR5cGVvZiBiKXJldHVybi41PmQ/YTpiO2lmKGEubGVuZ3RoPT1iLmxlbmd0aCl7Zm9yKHZhciBlPVtdLGY9MDtmPGEubGVuZ3RoO2YrKyllLnB1c2goYyhhW2ZdLGJbZl0sZCkpO3JldHVybiBlfXRocm93Ik1pc21hdGNoZWQgaW50ZXJwb2xhdGlvbiBhcmd1bWVudHMgIithKyI6IitifWEuSW50ZXJwb2xhdGlvbj1mdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBkKGMoYSxiLGUpKX19fShkLGYpLGZ1bmN0aW9uKGEsYixjKXthLnNlcXVlbmNlTnVtYmVyPTA7dmFyIGQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJmaW5pc2giLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX07Yi5BbmltYXRpb249ZnVuY3Rpb24oYil7dGhpcy5pZD0iIixiJiZiLl9pZCYmKHRoaXMuaWQ9Yi5faWQpLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9jdXJyZW50VGltZT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9pblRpbWVsaW5lPSEwLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMCx0aGlzLm9uZmluaXNoPW51bGwsdGhpcy5fZmluaXNoSGFuZGxlcnM9W10sdGhpcy5fZWZmZWN0PWIsdGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoMCksdGhpcy5faWRsZT0hMCx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITF9LGIuQW5pbWF0aW9uLnByb3RvdHlwZT17X2Vuc3VyZUFsaXZlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGU8MCYmMD09PXRoaXMuY3VycmVudFRpbWU/dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoLTEpOnRoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKHRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2luVGltZWxpbmV8fCF0aGlzLl9pbkVmZmVjdCYmdGhpcy5fZmluaXNoZWRGbGFnfHwodGhpcy5faW5UaW1lbGluZT0hMCxiLnRpbWVsaW5lLl9hbmltYXRpb25zLnB1c2godGhpcykpfSxfdGlja0N1cnJlbnRUaW1lOmZ1bmN0aW9uKGEsYil7YSE9dGhpcy5fY3VycmVudFRpbWUmJih0aGlzLl9jdXJyZW50VGltZT1hLHRoaXMuX2lzRmluaXNoZWQmJiFiJiYodGhpcy5fY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowKSx0aGlzLl9lbnN1cmVBbGl2ZSgpKX0sZ2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX2lkbGV8fHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz9udWxsOnRoaXMuX2N1cnJlbnRUaW1lfSxzZXQgY3VycmVudFRpbWUoYSl7YT0rYSxpc05hTihhKXx8KGIucmVzdGFydCgpLHRoaXMuX3BhdXNlZHx8bnVsbD09dGhpcy5fc3RhcnRUaW1lfHwodGhpcy5fc3RhcnRUaW1lPXRoaXMuX3RpbWVsaW5lLmN1cnJlbnRUaW1lLWEvdGhpcy5fcGxheWJhY2tSYXRlKSx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fY3VycmVudFRpbWUhPWEmJih0aGlzLl90aWNrQ3VycmVudFRpbWUoYSwhMCksYi5pbnZhbGlkYXRlRWZmZWN0cygpKSl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX3N0YXJ0VGltZT1hLHRoaXMuX3RpY2tDdXJyZW50VGltZSgodGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSksYi5pbnZhbGlkYXRlRWZmZWN0cygpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7aWYoYSE9dGhpcy5fcGxheWJhY2tSYXRlKXt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX3BsYXliYWNrUmF0ZT1hLHRoaXMuX3N0YXJ0VGltZT1udWxsLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9YiYmKHRoaXMuY3VycmVudFRpbWU9Yil9fSxnZXQgX2lzRmluaXNoZWQoKXtyZXR1cm4hdGhpcy5faWRsZSYmKHRoaXMuX3BsYXliYWNrUmF0ZT4wJiZ0aGlzLl9jdXJyZW50VGltZT49dGhpcy5fdG90YWxEdXJhdGlvbnx8dGhpcy5fcGxheWJhY2tSYXRlPDAmJnRoaXMuX2N1cnJlbnRUaW1lPD0wKX0sZ2V0IF90b3RhbER1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdC5fdG90YWxEdXJhdGlvbn0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9pZGxlPyJpZGxlIjpudWxsPT10aGlzLl9zdGFydFRpbWUmJiF0aGlzLl9wYXVzZWQmJjAhPXRoaXMucGxheWJhY2tSYXRlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/InBlbmRpbmciOnRoaXMuX3BhdXNlZD8icGF1c2VkIjp0aGlzLl9pc0ZpbmlzaGVkPyJmaW5pc2hlZCI6InJ1bm5pbmcifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSExLCh0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9pZGxlKSYmKHRoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wPzA6dGhpcy5fdG90YWxEdXJhdGlvbix0aGlzLl9zdGFydFRpbWU9bnVsbCksdGhpcy5fZmluaXNoZWRGbGFnPSExLHRoaXMuX2lkbGU9ITEsdGhpcy5fZW5zdXJlQWxpdmUoKSxiLmludmFsaWRhdGVFZmZlY3RzKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fcGF1c2VkfHx0aGlzLl9pZGxlfHwodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSEwKSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9wYXVzZWQ9ITB9LGZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX2lkbGV8fCh0aGlzLmN1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wP3RoaXMuX3RvdGFsRHVyYXRpb246MCx0aGlzLl9zdGFydFRpbWU9dGhpcy5fdG90YWxEdXJhdGlvbi10aGlzLmN1cnJlbnRUaW1lLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLl9pbkVmZmVjdCYmKHRoaXMuX2luRWZmZWN0PSExLHRoaXMuX2lkbGU9ITAsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMuY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9lZmZlY3QuX3VwZGF0ZShudWxsKSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGUqPS0xLHRoaXMucGxheSgpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJmaW5pc2giPT1hJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5wdXNoKGIpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7aWYoImZpbmlzaCI9PWEpe3ZhciBjPXRoaXMuX2ZpbmlzaEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fZmluaXNoSGFuZGxlcnMuc3BsaWNlKGMsMSl9fSxfZmlyZUV2ZW50czpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0ZpbmlzaGVkKXtpZighdGhpcy5fZmluaXNoZWRGbGFnKXt2YXIgYj1uZXcgZCh0aGlzLHRoaXMuX2N1cnJlbnRUaW1lLGEpLGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuY29uY2F0KHRoaXMub25maW5pc2g/W3RoaXMub25maW5pc2hdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChiLnRhcmdldCxiKX0pfSwwKSx0aGlzLl9maW5pc2hlZEZsYWc9ITB9fWVsc2UgdGhpcy5fZmluaXNoZWRGbGFnPSExfSxfdGljazpmdW5jdGlvbihhLGIpe3RoaXMuX2lkbGV8fHRoaXMuX3BhdXNlZHx8KG51bGw9PXRoaXMuX3N0YXJ0VGltZT9iJiYodGhpcy5zdGFydFRpbWU9YS10aGlzLl9jdXJyZW50VGltZS90aGlzLnBsYXliYWNrUmF0ZSk6dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fdGlja0N1cnJlbnRUaW1lKChhLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5wbGF5YmFja1JhdGUpKSxiJiYodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLHRoaXMuX2ZpcmVFdmVudHMoYSkpfSxnZXQgX25lZWRzVGljaygpe3JldHVybiB0aGlzLnBsYXlTdGF0ZSBpbntwZW5kaW5nOjEscnVubmluZzoxfXx8IXRoaXMuX2ZpbmlzaGVkRmxhZ319fShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9ajtqPVtdLGE8cC5jdXJyZW50VGltZSYmKGE9cC5jdXJyZW50VGltZSksaChhLCEwKSxiLmZvckVhY2goZnVuY3Rpb24oYil7YlsxXShhKX0pLGcoKSxsPXZvaWQgMH1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGEuX3NlcXVlbmNlTnVtYmVyLWIuX3NlcXVlbmNlTnVtYmVyfWZ1bmN0aW9uIGYoKXt0aGlzLl9hbmltYXRpb25zPVtdLHRoaXMuY3VycmVudFRpbWU9d2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCk6MH1mdW5jdGlvbiBnKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EoKX0pLG8ubGVuZ3RoPTB9ZnVuY3Rpb24gaChhLGMpe249ITE7dmFyIGQ9Yi50aW1lbGluZTtkLmN1cnJlbnRUaW1lPWEsZC5fYW5pbWF0aW9ucy5zb3J0KGUpLG09ITE7dmFyIGY9ZC5fYW5pbWF0aW9ucztkLl9hbmltYXRpb25zPVtdO3ZhciBnPVtdLGg9W107Zj1mLmZpbHRlcihmdW5jdGlvbihiKXtiLl90aWNrKGEsYyksYi5faW5FZmZlY3Q/aC5wdXNoKGIuX2VmZmVjdCk6Zy5wdXNoKGIuX2VmZmVjdCksYi5fbmVlZHNUaWNrJiYobT0hMCk7dmFyIGQ9Yi5faW5FZmZlY3R8fGIuX25lZWRzVGljaztyZXR1cm4gYi5faW5UaW1lbGluZT1kLGR9KSxvLnB1c2guYXBwbHkobyxnKSxvLnB1c2guYXBwbHkobyxoKSxkLl9hbmltYXRpb25zLnB1c2guYXBwbHkoZC5fYW5pbWF0aW9ucyxmKSxtJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt9KX12YXIgaT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLGo9W10saz0wO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7dmFyIGI9aysrO3JldHVybiAwPT1qLmxlbmd0aCYmaShkKSxqLnB1c2goW2IsYV0pLGJ9LHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZT1mdW5jdGlvbihhKXtqLmZvckVhY2goZnVuY3Rpb24oYil7YlswXT09YSYmKGJbMV09ZnVuY3Rpb24oKXt9KX0pfSxmLnByb3RvdHlwZT17X3BsYXk6ZnVuY3Rpb24oYyl7Yy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy50aW1pbmcpO3ZhciBkPW5ldyBiLkFuaW1hdGlvbihjKTtyZXR1cm4gZC5faWRsZT0hMSxkLl90aW1lbGluZT10aGlzLHRoaXMuX2FuaW1hdGlvbnMucHVzaChkKSxiLnJlc3RhcnQoKSxiLmludmFsaWRhdGVFZmZlY3RzKCksZH19O3ZhciBsPXZvaWQgMCxtPSExLG49ITE7Yi5yZXN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG18fChtPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLG49ITApLG59LGIuaW52YWxpZGF0ZUVmZmVjdHM9ZnVuY3Rpb24oKXtoKGIudGltZWxpbmUuY3VycmVudFRpbWUsITEpLGcoKX07dmFyIG89W10scD1uZXcgZjtiLnRpbWVsaW5lPXB9KGMsZCxmKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9YS5leGVjKGIpO3JldHVybiBjPyhjPWEuaWdub3JlQ2FzZT9jWzBdLnRvTG93ZXJDYXNlKCk6Y1swXSxbYyxiLnN1YnN0cihjLmxlbmd0aCldKTp2b2lkIDB9ZnVuY3Rpb24gYyhhLGIpe2I9Yi5yZXBsYWNlKC9eXHMqLywiIik7dmFyIGM9YShiKTtyZXR1cm4gYz9bY1swXSxjWzFdLnJlcGxhY2UoL15ccyovLCIiKV06dm9pZCAwfWZ1bmN0aW9uIGQoYSxkLGUpe2E9Yy5iaW5kKG51bGwsYSk7Zm9yKHZhciBmPVtdOzspe3ZhciBnPWEoZSk7aWYoIWcpcmV0dXJuW2YsZV07aWYoZi5wdXNoKGdbMF0pLGU9Z1sxXSxnPWIoZCxlKSwhZ3x8IiI9PWdbMV0pcmV0dXJuW2YsZV07ZT1nWzFdfX1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGgmJighL1xzfCwvLnRlc3QoYltkXSl8fDAhPWMpO2QrKylpZigiKCI9PWJbZF0pYysrO2Vsc2UgaWYoIikiPT1iW2RdJiYoYy0tLDA9PWMmJmQrKywwPj1jKSlicmVhazt2YXIgZT1hKGIuc3Vic3RyKDAsZCkpO3JldHVybiB2b2lkIDA9PWU/dm9pZCAwOltlLGIuc3Vic3RyKGQpXX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPWEsZD1iO2MmJmQ7KWM+ZD9jJT1kOmQlPWM7cmV0dXJuIGM9YSpiLyhjK2QpfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWEoYik7cmV0dXJuIGMmJihjWzBdPXZvaWQgMCksY319ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD1hKGMpO3JldHVybiBkP2Q6W2IsY119fWZ1bmN0aW9uIGkoYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8Yi5sZW5ndGg7ZSsrKXt2YXIgZj1hLmNvbnN1bWVUcmltbWVkKGJbZV0sYyk7aWYoIWZ8fCIiPT1mWzBdKXJldHVybjt2b2lkIDAhPT1mWzBdJiZkLnB1c2goZlswXSksYz1mWzFdfXJldHVybiIiPT1jP2Q6dm9pZCAwfWZ1bmN0aW9uIGooYSxiLGMsZCxlKXtmb3IodmFyIGc9W10saD1bXSxpPVtdLGo9ZihkLmxlbmd0aCxlLmxlbmd0aCksaz0wO2o+aztrKyspe3ZhciBsPWIoZFtrJWQubGVuZ3RoXSxlW2slZS5sZW5ndGhdKTtpZighbClyZXR1cm47Zy5wdXNoKGxbMF0pLGgucHVzaChsWzFdKSxpLnB1c2gobFsyXSl9cmV0dXJuW2csaCxmdW5jdGlvbihiKXt2YXIgZD1iLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiBpW2JdKGEpfSkuam9pbihjKTtyZXR1cm4gYT9hKGQpOmR9XX1mdW5jdGlvbiBrKGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPVtdLGc9MCxoPTA7aDxjLmxlbmd0aDtoKyspaWYoImZ1bmN0aW9uIj09dHlwZW9mIGNbaF0pe3ZhciBpPWNbaF0oYVtnXSxiW2crK10pO2QucHVzaChpWzBdKSxlLnB1c2goaVsxXSksZi5wdXNoKGlbMl0pfWVsc2UhZnVuY3Rpb24oYSl7ZC5wdXNoKCExKSxlLnB1c2goITEpLGYucHVzaChmdW5jdGlvbigpe3JldHVybiBjW2FdfSl9KGgpO3JldHVybltkLGUsZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1mW2NdKGFbY10pO3JldHVybiBifV19YS5jb25zdW1lVG9rZW49YixhLmNvbnN1bWVUcmltbWVkPWMsYS5jb25zdW1lUmVwZWF0ZWQ9ZCxhLmNvbnN1bWVQYXJlbnRoZXNpc2VkPWUsYS5pZ25vcmU9ZyxhLm9wdGlvbmFsPWgsYS5jb25zdW1lTGlzdD1pLGEubWVyZ2VOZXN0ZWRSZXBlYXRlZD1qLmJpbmQobnVsbCxudWxsKSxhLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkPWosYS5tZXJnZUxpc3Q9a30oZCksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmdW5jdGlvbiBjKGIpe3ZhciBjPWEuY29uc3VtZVRva2VuKC9eaW5zZXQvaSxiKTtpZihjKXJldHVybiBkLmluc2V0PSEwLGM7dmFyIGM9YS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50KGIpO2lmKGMpcmV0dXJuIGQubGVuZ3Rocy5wdXNoKGNbMF0pLGM7dmFyIGM9YS5jb25zdW1lQ29sb3IoYik7cmV0dXJuIGM/KGQuY29sb3I9Y1swXSxjKTp2b2lkIDB9dmFyIGQ9e2luc2V0OiExLGxlbmd0aHM6W10sY29sb3I6bnVsbH0sZT1hLmNvbnN1bWVSZXBlYXRlZChjLC9eLyxiKTtyZXR1cm4gZSYmZVswXS5sZW5ndGg/W2QsZVsxXV06dm9pZCAwfWZ1bmN0aW9uIGMoYyl7dmFyIGQ9YS5jb25zdW1lUmVwZWF0ZWQoYiwvXiwvLGMpO3JldHVybiBkJiYiIj09ZFsxXT9kWzBdOnZvaWQgMH1mdW5jdGlvbiBkKGIsYyl7Zm9yKDtiLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWIubGVuZ3Rocy5wdXNoKHtweDowfSk7Zm9yKDtjLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWMubGVuZ3Rocy5wdXNoKHtweDowfSk7aWYoYi5pbnNldD09Yy5pbnNldCYmISFiLmNvbG9yPT0hIWMuY29sb3Ipe2Zvcih2YXIgZCxlPVtdLGY9W1tdLDBdLGc9W1tdLDBdLGg9MDtoPGIubGVuZ3Rocy5sZW5ndGg7aCsrKXt2YXIgaT1hLm1lcmdlRGltZW5zaW9ucyhiLmxlbmd0aHNbaF0sYy5sZW5ndGhzW2hdLDI9PWgpO2ZbMF0ucHVzaChpWzBdKSxnWzBdLnB1c2goaVsxXSksZS5wdXNoKGlbMl0pfWlmKGIuY29sb3ImJmMuY29sb3Ipe3ZhciBqPWEubWVyZ2VDb2xvcnMoYi5jb2xvcixjLmNvbG9yKTtmWzFdPWpbMF0sZ1sxXT1qWzFdLGQ9alsyXX1yZXR1cm5bZixnLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1iLmluc2V0PyJpbnNldCAiOiIgIixmPTA7ZjxlLmxlbmd0aDtmKyspYys9ZVtmXShhWzBdW2ZdKSsiICI7cmV0dXJuIGQmJihjKz1kKGFbMV0pKSxjfV19fWZ1bmN0aW9uIGUoYixjLGQsZSl7ZnVuY3Rpb24gZihhKXtyZXR1cm57aW5zZXQ6YSxjb2xvcjpbMCwwLDAsMF0sbGVuZ3Roczpbe3B4OjB9LHtweDowfSx7cHg6MH0se3B4OjB9XX19Zm9yKHZhciBnPVtdLGg9W10saT0wO2k8ZC5sZW5ndGh8fGk8ZS5sZW5ndGg7aSsrKXt2YXIgaj1kW2ldfHxmKGVbaV0uaW5zZXQpLGs9ZVtpXXx8ZihkW2ldLmluc2V0KTtnLnB1c2goaiksaC5wdXNoKGspfXJldHVybiBhLm1lcmdlTmVzdGVkUmVwZWF0ZWQoYixjLGcsaCl9dmFyIGY9ZS5iaW5kKG51bGwsZCwiLCAiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZixbImJveC1zaGFkb3ciLCJ0ZXh0LXNoYWRvdyJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBhLnRvRml4ZWQoMykucmVwbGFjZSgiLjAwMCIsIiIpfWZ1bmN0aW9uIGQoYSxiLGMpe3JldHVybiBNYXRoLm1pbihiLE1hdGgubWF4KGEsYykpfWZ1bmN0aW9uIGUoYSl7cmV0dXJuL15ccypbLStdPyhcZCpcLik/XGQrXHMqJC8udGVzdChhKT9OdW1iZXIoYSk6dm9pZCAwfWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm5bYSxiLGNdfWZ1bmN0aW9uIGcoYSxiKXtyZXR1cm4gMCE9YT9pKDAsMS8wKShhLGIpOnZvaWQgMH1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChkKDEsMS8wLGEpKX1dfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm5bZSxmLGZ1bmN0aW9uKGUpe3JldHVybiBjKGQoYSxiLGUpKX1dfX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuW2EsYixNYXRoLnJvdW5kXX1hLmNsYW1wPWQsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxLzApLFsiYm9yZGVyLWltYWdlLXdpZHRoIiwibGluZS1oZWlnaHQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxKSxbIm9wYWNpdHkiLCJzaGFwZS1pbWFnZS10aHJlc2hvbGQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGcsWyJmbGV4LWdyb3ciLCJmbGV4LXNocmluayJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaCxbIm9ycGhhbnMiLCJ3aWRvd3MiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ6LWluZGV4Il0pLGEucGFyc2VOdW1iZXI9ZSxhLm1lcmdlTnVtYmVycz1mLGEubnVtYmVyVG9TdHJpbmc9Y30oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4idmlzaWJsZSI9PWF8fCJ2aXNpYmxlIj09Yj9bMCwxLGZ1bmN0aW9uKGMpe3JldHVybiAwPj1jP2E6Yz49MT9iOiJ2aXNpYmxlIn1dOnZvaWQgMH1hLmFkZFByb3BlcnRpZXNIYW5kbGVyKFN0cmluZyxjLFsidmlzaWJpbGl0eSJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2E9YS50cmltKCksZi5maWxsU3R5bGU9IiMwMDAiLGYuZmlsbFN0eWxlPWE7dmFyIGI9Zi5maWxsU3R5bGU7aWYoZi5maWxsU3R5bGU9IiNmZmYiLGYuZmlsbFN0eWxlPWEsYj09Zi5maWxsU3R5bGUpe2YuZmlsbFJlY3QoMCwwLDEsMSk7dmFyIGM9Zi5nZXRJbWFnZURhdGEoMCwwLDEsMSkuZGF0YTtmLmNsZWFyUmVjdCgwLDAsMSwxKTt2YXIgZD1jWzNdLzI1NTtyZXR1cm5bY1swXSpkLGNbMV0qZCxjWzJdKmQsZF19fWZ1bmN0aW9uIGQoYixjKXtyZXR1cm5bYixjLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LGEpKX1pZihiWzNdKWZvcih2YXIgZD0wOzM+ZDtkKyspYltkXT1NYXRoLnJvdW5kKGMoYltkXS9iWzNdKSk7cmV0dXJuIGJbM109YS5udW1iZXJUb1N0cmluZyhhLmNsYW1wKDAsMSxiWzNdKSksInJnYmEoIitiLmpvaW4oIiwiKSsiKSJ9XX12YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKTtlLndpZHRoPWUuaGVpZ2h0PTE7dmFyIGY9ZS5nZXRDb250ZXh0KCIyZCIpO2EuYWRkUHJvcGVydGllc0hhbmRsZXIoYyxkLFsiYmFja2dyb3VuZC1jb2xvciIsImJvcmRlci1ib3R0b20tY29sb3IiLCJib3JkZXItbGVmdC1jb2xvciIsImJvcmRlci1yaWdodC1jb2xvciIsImJvcmRlci10b3AtY29sb3IiLCJjb2xvciIsIm91dGxpbmUtY29sb3IiLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiXSksYS5jb25zdW1lQ29sb3I9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsYyksYS5tZXJnZUNvbG9ycz1kfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGI9Yi50cmltKCkudG9Mb3dlckNhc2UoKSwiMCI9PWImJiJweCIuc2VhcmNoKGEpPj0wKXJldHVybntweDowfTtpZigvXlteKF0qJHxeY2FsYy8udGVzdChiKSl7Yj1iLnJlcGxhY2UoL2NhbGNcKC9nLCIoIik7dmFyIGM9e307Yj1iLnJlcGxhY2UoYSxmdW5jdGlvbihhKXtyZXR1cm4gY1thXT1udWxsLCJVIithfSk7Zm9yKHZhciBkPSJVKCIrYS5zb3VyY2UrIikiLGU9Yi5yZXBsYWNlKC9bLStdPyhcZCpcLik/XGQrL2csIk4iKS5yZXBsYWNlKG5ldyBSZWdFeHAoIk4iK2QsImciKSwiRCIpLnJlcGxhY2UoL1xzWystXVxzL2csIk8iKS5yZXBsYWNlKC9ccy9nLCIiKSxmPVsvTlwqKEQpL2csLyhOfEQpWypcL11OL2csLyhOfEQpT1wxL2csL1woKE58RClcKS9nXSxnPTA7ZzxmLmxlbmd0aDspZltnXS50ZXN0KGUpPyhlPWUucmVwbGFjZShmW2ddLCIkMSIpLGc9MCk6ZysrO2lmKCJEIj09ZSl7Zm9yKHZhciBoIGluIGMpe3ZhciBpPWV2YWwoYi5yZXBsYWNlKG5ldyBSZWdFeHAoIlUiK2gsImciKSwiIikucmVwbGFjZShuZXcgUmVnRXhwKGQsImciKSwiKjAiKSk7aWYoIWlzRmluaXRlKGkpKXJldHVybjtjW2hdPWl9cmV0dXJuIGN9fX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGUoYSxiLCEwKX1mdW5jdGlvbiBlKGIsYyxkKXt2YXIgZSxmPVtdO2ZvcihlIGluIGIpZi5wdXNoKGUpO2ZvcihlIGluIGMpZi5pbmRleE9mKGUpPDAmJmYucHVzaChlKTtyZXR1cm4gYj1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYlthXXx8MH0pLGM9Zi5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV18fDB9KSxbYixjLGZ1bmN0aW9uKGIpe3ZhciBjPWIubWFwKGZ1bmN0aW9uKGMsZSl7cmV0dXJuIDE9PWIubGVuZ3RoJiZkJiYoYz1NYXRoLm1heChjLDApKSxhLm51bWJlclRvU3RyaW5nKGMpK2ZbZV19KS5qb2luKCIgKyAiKTtyZXR1cm4gYi5sZW5ndGg+MT8iY2FsYygiK2MrIikiOmN9XX12YXIgZj0icHh8ZW18ZXh8Y2h8cmVtfHZ3fHZofHZtaW58dm1heHxjbXxtbXxpbnxwdHxwYyIsZz1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYsImciKSksaD1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYrInwlIiwiZyIpKSxpPWMuYmluZChudWxsLC9kZWd8cmFkfGdyYWR8dHVybi9nKTthLnBhcnNlTGVuZ3RoPWcsYS5wYXJzZUxlbmd0aE9yUGVyY2VudD1oLGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudD1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxoKSxhLnBhcnNlQW5nbGU9aSxhLm1lcmdlRGltZW5zaW9ucz1lO3ZhciBqPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGcpLGs9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaiwvXi8pLGw9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaywvXiwvKTthLmNvbnN1bWVTaXplUGFpckxpc3Q9bDt2YXIgbT1mdW5jdGlvbihhKXt2YXIgYj1sKGEpO3JldHVybiBiJiYiIj09YlsxXT9iWzBdOnZvaWQgMH0sbj1hLm1lcmdlTmVzdGVkUmVwZWF0ZWQuYmluZCh2b2lkIDAsZCwiICIpLG89YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLG4sIiwiKTthLm1lcmdlTm9uTmVnYXRpdmVTaXplUGFpcj1uLGEuYWRkUHJvcGVydGllc0hhbmRsZXIobSxvLFsiYmFja2dyb3VuZC1zaXplIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaCxkLFsiYm9yZGVyLWJvdHRvbS13aWR0aCIsImJvcmRlci1pbWFnZS13aWR0aCIsImJvcmRlci1sZWZ0LXdpZHRoIiwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwiYm9yZGVyLXRvcC13aWR0aCIsImZsZXgtYmFzaXMiLCJmb250LXNpemUiLCJoZWlnaHQiLCJsaW5lLWhlaWdodCIsIm1heC1oZWlnaHQiLCJtYXgtd2lkdGgiLCJvdXRsaW5lLXdpZHRoIiwid2lkdGgiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihoLGUsWyJib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIiwiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLCJib3JkZXItdG9wLWxlZnQtcmFkaXVzIiwiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMiLCJib3R0b20iLCJsZWZ0IiwibGV0dGVyLXNwYWNpbmciLCJtYXJnaW4tYm90dG9tIiwibWFyZ2luLWxlZnQiLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW4tdG9wIiwibWluLWhlaWdodCIsIm1pbi13aWR0aCIsIm91dGxpbmUtb2Zmc2V0IiwicGFkZGluZy1ib3R0b20iLCJwYWRkaW5nLWxlZnQiLCJwYWRkaW5nLXJpZ2h0IiwicGFkZGluZy10b3AiLCJwZXJzcGVjdGl2ZSIsInJpZ2h0Iiwic2hhcGUtbWFyZ2luIiwidGV4dC1pbmRlbnQiLCJ0b3AiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndvcmQtc3BhY2luZyJdKX0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYil7cmV0dXJuIGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudChiKXx8YS5jb25zdW1lVG9rZW4oL15hdXRvLyxiKX1mdW5jdGlvbiBkKGIpe3ZhciBkPWEuY29uc3VtZUxpc3QoW2EuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXnJlY3QvKSksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCgvKSksYS5jb25zdW1lUmVwZWF0ZWQuYmluZChudWxsLGMsL14sLyksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCkvKSldLGIpO3JldHVybiBkJiY0PT1kWzBdLmxlbmd0aD9kWzBdOnZvaWQgMH1mdW5jdGlvbiBlKGIsYyl7cmV0dXJuImF1dG8iPT1ifHwiYXV0byI9PWM/WyEwLCExLGZ1bmN0aW9uKGQpe3ZhciBlPWQ/YjpjO2lmKCJhdXRvIj09ZSlyZXR1cm4iYXV0byI7dmFyIGY9YS5tZXJnZURpbWVuc2lvbnMoZSxlKTtyZXR1cm4gZlsyXShmWzBdKX1dOmEubWVyZ2VEaW1lbnNpb25zKGIsYyl9ZnVuY3Rpb24gZihhKXtyZXR1cm4icmVjdCgiK2ErIikifXZhciBnPWEubWVyZ2VXcmFwcGVkTmVzdGVkUmVwZWF0ZWQuYmluZChudWxsLGYsZSwiLCAiKTthLnBhcnNlQm94PWQsYS5tZXJnZUJveGVzPWcsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihkLGcsWyJjbGlwIl0pfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9MDtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1rP2JbYysrXTphfSl9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gZShiKXtpZihiPWIudG9Mb3dlckNhc2UoKS50cmltKCksIm5vbmUiPT1iKXJldHVybltdO2Zvcih2YXIgYyxkPS9ccyooXHcrKVwoKFteKV0qKVwpL2csZT1bXSxmPTA7Yz1kLmV4ZWMoYik7KXtpZihjLmluZGV4IT1mKXJldHVybjtmPWMuaW5kZXgrY1swXS5sZW5ndGg7dmFyIGc9Y1sxXSxoPW5bZ107aWYoIWgpcmV0dXJuO3ZhciBpPWNbMl0uc3BsaXQoIiwiKSxqPWhbMF07aWYoai5sZW5ndGg8aS5sZW5ndGgpcmV0dXJuO2Zvcih2YXIgaz1bXSxvPTA7bzxqLmxlbmd0aDtvKyspe3ZhciBwLHE9aVtvXSxyPWpbb107aWYocD1xP3tBOmZ1bmN0aW9uKGIpe3JldHVybiIwIj09Yi50cmltKCk/bTphLnBhcnNlQW5nbGUoYil9LE46YS5wYXJzZU51bWJlcixUOmEucGFyc2VMZW5ndGhPclBlcmNlbnQsTDphLnBhcnNlTGVuZ3RofVtyLnRvVXBwZXJDYXNlKCldKHEpOnthOm0sbjprWzBdLHQ6bH1bcl0sdm9pZCAwPT09cClyZXR1cm47ay5wdXNoKHApfWlmKGUucHVzaCh7dDpnLGQ6a30pLGQubGFzdEluZGV4PT1iLmxlbmd0aClyZXR1cm4gZX19ZnVuY3Rpb24gZihhKXtyZXR1cm4gYS50b0ZpeGVkKDYpLnJlcGxhY2UoIi4wMDAwMDAiLCIiKX1mdW5jdGlvbiBnKGIsYyl7aWYoYi5kZWNvbXBvc2l0aW9uUGFpciE9PWMpe2IuZGVjb21wb3NpdGlvblBhaXI9Yzt2YXIgZD1hLm1ha2VNYXRyaXhEZWNvbXBvc2l0aW9uKGIpfWlmKGMuZGVjb21wb3NpdGlvblBhaXIhPT1iKXtjLmRlY29tcG9zaXRpb25QYWlyPWI7dmFyIGU9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihjKX1yZXR1cm4gbnVsbD09ZFswXXx8bnVsbD09ZVswXT9bWyExXSxbITBdLGZ1bmN0aW9uKGEpe3JldHVybiBhP2NbMF0uZDpiWzBdLmR9XTooZFswXS5wdXNoKDApLGVbMF0ucHVzaCgxKSxbZCxlLGZ1bmN0aW9uKGIpe3ZhciBjPWEucXVhdChkWzBdWzNdLGVbMF1bM10sYls1XSksZz1hLmNvbXBvc2VNYXRyaXgoYlswXSxiWzFdLGJbMl0sYyxiWzRdKSxoPWcubWFwKGYpLmpvaW4oIiwiKTtyZXR1cm4gaH1dKX1mdW5jdGlvbiBoKGEpe3JldHVybiBhLnJlcGxhY2UoL1t4eV0vLCIiKX1mdW5jdGlvbiBpKGEpe3JldHVybiBhLnJlcGxhY2UoLyh4fHl8enwzZCk/JC8sIjNkIil9ZnVuY3Rpb24gaihiLGMpe3ZhciBkPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24mJiEwLGU9ITE7aWYoIWIubGVuZ3RofHwhYy5sZW5ndGgpe2IubGVuZ3RofHwoZT0hMCxiPWMsYz1bXSk7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqPWJbZl0udCxrPWJbZl0uZCxsPSJzY2FsZSI9PWouc3Vic3RyKDAsNSk/MTowO2MucHVzaCh7dDpqLGQ6ay5tYXAoZnVuY3Rpb24oYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiBsO3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109bDtyZXR1cm4gYn0pfSl9fXZhciBtPWZ1bmN0aW9uKGEsYil7cmV0dXJuInBlcnNwZWN0aXZlIj09YSYmInBlcnNwZWN0aXZlIj09Ynx8KCJtYXRyaXgiPT1hfHwibWF0cml4M2QiPT1hKSYmKCJtYXRyaXgiPT1ifHwibWF0cml4M2QiPT1iKX0sbz1bXSxwPVtdLHE9W107aWYoYi5sZW5ndGghPWMubGVuZ3RoKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXX1lbHNlIGZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKXt2YXIgaixzPWJbZl0udCx0PWNbZl0udCx1PWJbZl0uZCx2PWNbZl0uZCx3PW5bc10seD1uW3RdO2lmKG0ocyx0KSl7aWYoIWQpcmV0dXJuO3ZhciByPWcoW2JbZl1dLFtjW2ZdXSk7by5wdXNoKHJbMF0pLHAucHVzaChyWzFdKSxxLnB1c2goWyJtYXRyaXgiLFtyWzJdXV0pfWVsc2V7aWYocz09dClqPXM7ZWxzZSBpZih3WzJdJiZ4WzJdJiZoKHMpPT1oKHQpKWo9aChzKSx1PXdbMl0odSksdj14WzJdKHYpO2Vsc2V7aWYoIXdbMV18fCF4WzFdfHxpKHMpIT1pKHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXTticmVha31qPWkocyksdT13WzFdKHUpLHY9eFsxXSh2KX1mb3IodmFyIHk9W10sej1bXSxBPVtdLEI9MDtCPHUubGVuZ3RoO0IrKyl7dmFyIEM9Im51bWJlciI9PXR5cGVvZiB1W0JdP2EubWVyZ2VOdW1iZXJzOmEubWVyZ2VEaW1lbnNpb25zLHI9Qyh1W0JdLHZbQl0pO3lbQl09clswXSx6W0JdPXJbMV0sQS5wdXNoKHJbMl0pfW8ucHVzaCh5KSxwLnB1c2goeikscS5wdXNoKFtqLEFdKX19aWYoZSl7dmFyIEQ9bztvPXAscD1EfXJldHVybltvLHAsZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS5tYXAoZnVuY3Rpb24oYSxjKXtyZXR1cm4gcVtiXVsxXVtjXShhKX0pLmpvaW4oIiwiKTtyZXR1cm4ibWF0cml4Ij09cVtiXVswXSYmMTY9PWMuc3BsaXQoIiwiKS5sZW5ndGgmJihxW2JdWzBdPSJtYXRyaXgzZCIpLHFbYl1bMF0rIigiK2MrIikifSkuam9pbigiICIpfV19dmFyIGs9bnVsbCxsPXtweDowfSxtPXtkZWc6MH0sbj17bWF0cml4OlsiTk5OTk5OIixbayxrLDAsMCxrLGssMCwwLDAsMCwxLDAsayxrLDAsMV0sZF0sbWF0cml4M2Q6WyJOTk5OTk5OTk5OTk5OTk5OIixkXSxyb3RhdGU6WyJBIl0scm90YXRleDpbIkEiXSxyb3RhdGV5OlsiQSJdLHJvdGF0ZXo6WyJBIl0scm90YXRlM2Q6WyJOTk5BIl0scGVyc3BlY3RpdmU6WyJMIl0sc2NhbGU6WyJObiIsYyhbayxrLDFdKSxkXSxzY2FsZXg6WyJOIixjKFtrLDEsMV0pLGMoW2ssMV0pXSxzY2FsZXk6WyJOIixjKFsxLGssMV0pLGMoWzEsa10pXSxzY2FsZXo6WyJOIixjKFsxLDEsa10pXSxzY2FsZTNkOlsiTk5OIixkXSxza2V3OlsiQWEiLG51bGwsZF0sc2tld3g6WyJBIixudWxsLGMoW2ssbV0pXSxza2V3eTpbIkEiLG51bGwsYyhbbSxrXSldLHRyYW5zbGF0ZTpbIlR0IixjKFtrLGssbF0pLGRdLHRyYW5zbGF0ZXg6WyJUIixjKFtrLGwsbF0pLGMoW2ssbF0pXSx0cmFuc2xhdGV5OlsiVCIsYyhbbCxrLGxdKSxjKFtsLGtdKV0sdHJhbnNsYXRlejpbIkwiLGMoW2wsbCxrXSldLHRyYW5zbGF0ZTNkOlsiVFRMIixkXX07YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ0cmFuc2Zvcm0iXSl9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5jb25jYXQoW2FdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiYoZFthXT1iKX0pfXZhciBkPXt9O2MoInRyYW5zZm9ybSIsWyJ3ZWJraXRUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxjKCJ0cmFuc2Zvcm1PcmlnaW4iLFsid2Via2l0VHJhbnNmb3JtT3JpZ2luIl0pLGMoInBlcnNwZWN0aXZlIixbIndlYmtpdFBlcnNwZWN0aXZlIl0pLGMoInBlcnNwZWN0aXZlT3JpZ2luIixbIndlYmtpdFBlcnNwZWN0aXZlT3JpZ2luIl0pLGEucHJvcGVydHlOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBkW2FdfHxhfX0oZCxmKX0oKSwhZnVuY3Rpb24oKXtpZih2b2lkIDA9PT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5hbmltYXRlKFtdKS5vbmNhbmNlbCl7dmFyIGE7aWYod2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3cpdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCl9O2Vsc2UgdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX07dmFyIGI9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJjYW5jZWwiLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX0sYz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihkLGUpe3ZhciBmPWMuY2FsbCh0aGlzLGQsZSk7Zi5fY2FuY2VsSGFuZGxlcnM9W10sZi5vbmNhbmNlbD1udWxsO3ZhciBnPWYuY2FuY2VsO2YuY2FuY2VsPWZ1bmN0aW9uKCl7Zy5jYWxsKHRoaXMpO3ZhciBjPW5ldyBiKHRoaXMsbnVsbCxhKCkpLGQ9dGhpcy5fY2FuY2VsSGFuZGxlcnMuY29uY2F0KHRoaXMub25jYW5jZWw/W3RoaXMub25jYW5jZWxdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChjLnRhcmdldCxjKX0pfSwwKX07dmFyIGg9Zi5hZGRFdmVudExpc3RlbmVyO2YuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiYiY2FuY2VsIj09YT90aGlzLl9jYW5jZWxIYW5kbGVycy5wdXNoKGIpOmguY2FsbCh0aGlzLGEsYil9O3ZhciBpPWYucmVtb3ZlRXZlbnRMaXN0ZW5lcjtyZXR1cm4gZi5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7aWYoImNhbmNlbCI9PWEpe3ZhciBjPXRoaXMuX2NhbmNlbEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fY2FuY2VsSGFuZGxlcnMuc3BsaWNlKGMsMSl9ZWxzZSBpLmNhbGwodGhpcyxhLGIpfSxmfX19KCksZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGM9bnVsbCxkPSExO3RyeXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKGIpLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKSxmPSIwIj09ZT8iMSI6IjAiO2M9Yi5hbmltYXRlKHtvcGFjaXR5OltmLGZdfSx7ZHVyYXRpb246MX0pLGMuY3VycmVudFRpbWU9MCxkPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpPT1mfWNhdGNoKGcpe31maW5hbGx5e2MmJmMuY2FuY2VsKCl9aWYoIWQpe3ZhciBoPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHdpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmJbU3ltYm9sLml0ZXJhdG9yXSYmKGI9QXJyYXkuZnJvbShiKSksQXJyYXkuaXNBcnJheShiKXx8bnVsbD09PWJ8fChiPWEuY29udmVydFRvQXJyYXlGb3JtKGIpKSxoLmNhbGwodGhpcyxiLGMpfX19KGMpLCFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj13aW5kb3cuZG9jdW1lbnQudGltZWxpbmU7Yi5jdXJyZW50VGltZT1hLGIuX2Rpc2NhcmRBbmltYXRpb25zKCksMD09Yi5fYW5pbWF0aW9ucy5sZW5ndGg/Zj0hMTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCk7Cn12YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoZnVuY3Rpb24oYil7d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSxhKGIpLHdpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCl9KX0sYi5BbmltYXRpb25UaW1lbGluZT1mdW5jdGlvbigpe3RoaXMuX2FuaW1hdGlvbnM9W10sdGhpcy5jdXJyZW50VGltZT12b2lkIDB9LGIuQW5pbWF0aW9uVGltZWxpbmUucHJvdG90eXBlPXtnZXRBbmltYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc2NhcmRBbmltYXRpb25zKCksdGhpcy5fYW5pbWF0aW9ucy5zbGljZSgpfSxfdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzOmZ1bmN0aW9uKCl7Yi5hbmltYXRpb25zV2l0aFByb21pc2VzPWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuX3VwZGF0ZVByb21pc2VzKCl9KX0sX2Rpc2NhcmRBbmltYXRpb25zOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksdGhpcy5fYW5pbWF0aW9ucz10aGlzLl9hbmltYXRpb25zLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZmluaXNoZWQiIT1hLnBsYXlTdGF0ZSYmImlkbGUiIT1hLnBsYXlTdGF0ZX0pfSxfcGxheTpmdW5jdGlvbihhKXt2YXIgYz1uZXcgYi5BbmltYXRpb24oYSx0aGlzKTtyZXR1cm4gdGhpcy5fYW5pbWF0aW9ucy5wdXNoKGMpLGIucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaygpLGMuX3VwZGF0ZVByb21pc2VzKCksYy5fYW5pbWF0aW9uLnBsYXkoKSxjLl91cGRhdGVQcm9taXNlcygpLGN9LHBsYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEucmVtb3ZlKCksdGhpcy5fcGxheShhKX19O3ZhciBmPSExO2IucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaz1mdW5jdGlvbigpe2Z8fChmPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShkKSl9O3ZhciBnPW5ldyBiLkFuaW1hdGlvblRpbWVsaW5lO2IudGltZWxpbmU9Zzt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5kb2N1bWVudCwidGltZWxpbmUiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGd9fSl9Y2F0Y2goaCl7fXRyeXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmU9Z31jYXRjaChoKXt9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1bXSxiLkFuaW1hdGlvbj1mdW5jdGlvbihiLGMpe2lmKHRoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLmVmZmVjdD1iLGImJihiLl9hbmltYXRpb249dGhpcyksIWMpdGhyb3cgbmV3IEVycm9yKCJBbmltYXRpb24gd2l0aCBudWxsIHRpbWVsaW5lIGlzIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLl90aW1lbGluZT1jLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9ob2xkVGltZT0wLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9pc0dyb3VwPSExLHRoaXMuX2FuaW1hdGlvbj1udWxsLHRoaXMuX2NoaWxkQW5pbWF0aW9ucz1bXSx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX29sZFBsYXlTdGF0ZT0iaWRsZSIsdGhpcy5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfdXBkYXRlUHJvbWlzZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vbGRQbGF5U3RhdGUsYj10aGlzLnBsYXlTdGF0ZTtyZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlKCksdGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCk6InBlbmRpbmciPT1hP3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKToicGVuZGluZyI9PWImJih0aGlzLl9yZWFkeVByb21pc2U9dm9pZCAwKSksdGhpcy5fZmluaXNoZWRQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlKCksdGhpcy5fZmluaXNoZWRQcm9taXNlPXZvaWQgMCk6ImZpbmlzaGVkIj09Yj90aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk6ImZpbmlzaGVkIj09YSYmKHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApKSx0aGlzLl9vbGRQbGF5U3RhdGU9dGhpcy5wbGF5U3RhdGUsdGhpcy5fcmVhZHlQcm9taXNlfHx0aGlzLl9maW5pc2hlZFByb21pc2V9LF9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGEsYyxkLGUsZj0hIXRoaXMuX2FuaW1hdGlvbjtmJiYoYT10aGlzLnBsYXliYWNrUmF0ZSxjPXRoaXMuX3BhdXNlZCxkPXRoaXMuc3RhcnRUaW1lLGU9dGhpcy5jdXJyZW50VGltZSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uLl93cmFwcGVyPW51bGwsdGhpcy5fYW5pbWF0aW9uPW51bGwpLCghdGhpcy5lZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LktleWZyYW1lRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcykpLCh0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8dGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuR3JvdXBFZmZlY3QpJiYodGhpcy5fYW5pbWF0aW9uPWIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvckdyb3VwKHRoaXMuZWZmZWN0KSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cCh0aGlzKSksdGhpcy5lZmZlY3QmJnRoaXMuZWZmZWN0Ll9vbnNhbXBsZSYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KHRoaXMpLGYmJigxIT1hJiYodGhpcy5wbGF5YmFja1JhdGU9YSksbnVsbCE9PWQ/dGhpcy5zdGFydFRpbWU9ZDpudWxsIT09ZT90aGlzLmN1cnJlbnRUaW1lPWU6bnVsbCE9PXRoaXMuX2hvbGRUaW1lJiYodGhpcy5jdXJyZW50VGltZT10aGlzLl9ob2xkVGltZSksYyYmdGhpcy5wYXVzZSgpKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxfdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihjKXt0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oYyxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMuZWZmZWN0KSl9LmJpbmQodGhpcykpfX0sX3NldEV4dGVybmFsQW5pbWF0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKWZvcih2YXIgYj0wO2I8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoO2IrKyl0aGlzLmVmZmVjdC5jaGlsZHJlbltiXS5fYW5pbWF0aW9uPWEsdGhpcy5fY2hpbGRBbmltYXRpb25zW2JdLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKXt2YXIgYT10aGlzLmVmZmVjdC5fdGltaW5nLmRlbGF5O3RoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuZWZmZWN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl9wbGF5KGMpO3RoaXMuX2NoaWxkQW5pbWF0aW9ucy5wdXNoKGQpLGQucGxheWJhY2tSYXRlPXRoaXMucGxheWJhY2tSYXRlLHRoaXMuX3BhdXNlZCYmZC5wYXVzZSgpLGMuX2FuaW1hdGlvbj10aGlzLmVmZmVjdC5fYW5pbWF0aW9uLHRoaXMuX2FycmFuZ2VDaGlsZHJlbihkLGEpLHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0JiYoYSs9Yi5ncm91cENoaWxkRHVyYXRpb24oYykpfS5iaW5kKHRoaXMpKX19LF9hcnJhbmdlQ2hpbGRyZW46ZnVuY3Rpb24oYSxiKXtudWxsPT09dGhpcy5zdGFydFRpbWU/YS5jdXJyZW50VGltZT10aGlzLmN1cnJlbnRUaW1lLWIvdGhpcy5wbGF5YmFja1JhdGU6YS5zdGFydFRpbWUhPT10aGlzLnN0YXJ0VGltZStiL3RoaXMucGxheWJhY2tSYXRlJiYoYS5zdGFydFRpbWU9dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSl9LGdldCB0aW1lbGluZSgpe3JldHVybiB0aGlzLl90aW1lbGluZX0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb24/dGhpcy5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSJ9LGdldCBmaW5pc2hlZCgpe3JldHVybiB3aW5kb3cuUHJvbWlzZT8odGhpcy5fZmluaXNoZWRQcm9taXNlfHwoLTE9PWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5pbmRleE9mKHRoaXMpJiZiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMucHVzaCh0aGlzKSx0aGlzLl9maW5pc2hlZFByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXt0aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7YSh0aGlzKX0sdGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7Yih7dHlwZTpET01FeGNlcHRpb24uQUJPUlRfRVJSLG5hbWU6IkFib3J0RXJyb3IifSl9fS5iaW5kKHRoaXMpKSwiZmluaXNoZWQiPT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpKSx0aGlzLl9maW5pc2hlZFByb21pc2UpOihjb25zb2xlLndhcm4oIkFuaW1hdGlvbiBQcm9taXNlcyByZXF1aXJlIEphdmFTY3JpcHQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpLG51bGwpfSxnZXQgcmVhZHkoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX3JlYWR5UHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fcmVhZHlQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZVJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdFJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksInBlbmRpbmciIT09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKSksdGhpcy5fcmVhZHlQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IG9uZmluaXNoKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaH0sc2V0IG9uZmluaXNoKGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBhP3RoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1mdW5jdGlvbihiKXtiLnRhcmdldD10aGlzLGEuY2FsbCh0aGlzLGIpfS5iaW5kKHRoaXMpOnRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1hfSxnZXQgb25jYW5jZWwoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsfSxzZXQgb25jYW5jZWwoYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGE/dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWZ1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWF9LGdldCBjdXJyZW50VGltZSgpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lO3JldHVybiB0aGlzLl91cGRhdGVQcm9taXNlcygpLGF9LHNldCBjdXJyZW50VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5jdXJyZW50VGltZT1pc0Zpbml0ZShhKT9hOk1hdGguc2lnbihhKSpOdW1iZXIuTUFYX1ZBTFVFLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIsYyl7Yi5jdXJyZW50VGltZT1hLWN9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWV9LHNldCBzdGFydFRpbWUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uc3RhcnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLnN0YXJ0VGltZT1hK2N9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGU9YSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYil7Yi5wbGF5YmFja1JhdGU9YX0pLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9PWImJih0aGlzLmN1cnJlbnRUaW1lPWIpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9hbmltYXRpb24ucGxheSgpLC0xPT10aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5pbmRleE9mKHRoaXMpJiZ0aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpLHRoaXMuX3JlZ2lzdGVyKCksYi5hd2FpdFN0YXJ0VGltZSh0aGlzKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50VGltZTthLnBsYXkoKSxhLmN1cnJlbnRUaW1lPWJ9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5jdXJyZW50VGltZSYmKHRoaXMuX2hvbGRUaW1lPXRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2FuaW1hdGlvbi5wYXVzZSgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5maW5pc2goKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucmV2ZXJzZSgpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnJldmVyc2UoKX0pLG51bGwhPT1hJiYodGhpcy5jdXJyZW50VGltZT1hKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YjsiZnVuY3Rpb24iPT10eXBlb2YgYiYmKGM9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9dGhpcyxiLmNhbGwodGhpcyxhKX0uYmluZCh0aGlzKSxiLl93cmFwcGVyPWMpLHRoaXMuX2FuaW1hdGlvbi5hZGRFdmVudExpc3RlbmVyKGEsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLl9hbmltYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGImJmIuX3dyYXBwZXJ8fGIpfSxfcmVtb3ZlQ2hpbGRBbmltYXRpb25zOmZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9jaGlsZEFuaW1hdGlvbnMubGVuZ3RoOyl0aGlzLl9jaGlsZEFuaW1hdGlvbnMucG9wKCkuY2FuY2VsKCl9LF9mb3JFYWNoQ2hpbGQ6ZnVuY3Rpb24oYil7dmFyIGM9MDtpZih0aGlzLmVmZmVjdC5jaGlsZHJlbiYmdGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDx0aGlzLmVmZmVjdC5jaGlsZHJlbi5sZW5ndGgmJnRoaXMuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLHRoaXMuX2NoaWxkQW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2IuY2FsbCh0aGlzLGEsYyksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihjKz1hLmVmZmVjdC5hY3RpdmVEdXJhdGlvbil9LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBkPXRoaXMuZWZmZWN0Ll90aW1pbmcsZT10aGlzLmN1cnJlbnRUaW1lO251bGwhPT1lJiYoZT1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGQpLGUsZCkpLChudWxsPT1lfHxpc05hTihlKSkmJnRoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpfX19LHdpbmRvdy5BbmltYXRpb249Yi5BbmltYXRpb259KGMsZSxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChiKXt0aGlzLl9mcmFtZXM9YS5ub3JtYWxpemVLZXlmcmFtZXMoYil9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgYT0hMTtpLmxlbmd0aDspe3ZhciBiPWkuc2hpZnQoKTtiLl91cGRhdGVDaGlsZHJlbigpLGE9ITB9cmV0dXJuIGF9dmFyIGY9ZnVuY3Rpb24oYSl7aWYoYS5fYW5pbWF0aW9uPXZvaWQgMCxhIGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0fHxhIGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KWZvcih2YXIgYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7YisrKWYoYS5jaGlsZHJlbltiXSl9O2IucmVtb3ZlTXVsdGk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtkLl9wYXJlbnQ/KC0xPT1iLmluZGV4T2YoZC5fcGFyZW50KSYmYi5wdXNoKGQuX3BhcmVudCksZC5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShkLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihkKSwxKSxkLl9wYXJlbnQ9bnVsbCxmKGQpKTpkLl9hbmltYXRpb24mJmQuX2FuaW1hdGlvbi5lZmZlY3Q9PWQmJihkLl9hbmltYXRpb24uY2FuY2VsKCksZC5fYW5pbWF0aW9uLmVmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSksZC5fYW5pbWF0aW9uLl9jYWxsYmFjayYmKGQuX2FuaW1hdGlvbi5fY2FsbGJhY2suX2FuaW1hdGlvbj1udWxsKSxkLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksZihkKSl9Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLl9yZWJ1aWxkKCl9LGIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYixjLGUsZil7cmV0dXJuIHRoaXMudGFyZ2V0PWIsdGhpcy5fcGFyZW50PW51bGwsZT1hLm51bWVyaWNUaW1pbmdUb09iamVjdChlKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoZSksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoZSksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGUsITEsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBjPyhhLmRlcHJlY2F0ZWQoIkN1c3RvbSBLZXlmcmFtZUVmZmVjdCIsIjIwMTUtMDYtMjIiLCJVc2UgS2V5ZnJhbWVFZmZlY3Qub25zYW1wbGUgaW5zdGVhZC4iKSx0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPWMpOnRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM9bmV3IGQoYyksdGhpcy5fa2V5ZnJhbWVzPWMsdGhpcy5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX3RpbWluZyksdGhpcy5faWQ9Zix0aGlzfSxiLktleWZyYW1lRWZmZWN0LnByb3RvdHlwZT17Z2V0RnJhbWVzOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM/dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lczp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLl9mcmFtZXN9LHNldCBvbnNhbXBsZShhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgb25zYW1wbGUgb24gY3VzdG9tIGVmZmVjdCBLZXlmcmFtZUVmZmVjdCBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuX29uc2FtcGxlPWEsdGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxjbG9uZTpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmdldEZyYW1lcygpKXRocm93IG5ldyBFcnJvcigiQ2xvbmluZyBjdXN0b20gZWZmZWN0cyBpcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciBiPW5ldyBLZXlmcmFtZUVmZmVjdCh0aGlzLnRhcmdldCxbXSxhLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLHRoaXMuX2lkKTtyZXR1cm4gYi5fbm9ybWFsaXplZEtleWZyYW1lcz10aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLGIuX2tleWZyYW1lcz10aGlzLl9rZXlmcmFtZXMsYn0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX07dmFyIGc9RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTtFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGIudGltZWxpbmUuX3BsYXkobmV3IGIuS2V5ZnJhbWVFZmZlY3QodGhpcyxhLGMsZCkpfTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKTtiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1hLnRhcmdldHx8aCxjPWEuX2tleWZyYW1lczsiZnVuY3Rpb24iPT10eXBlb2YgYyYmKGM9W10pO3ZhciBkPWEuX3RpbWluZ0lucHV0O2QuaWQ9YS5faWR9ZWxzZSB2YXIgYj1oLGM9W10sZD0wO3JldHVybiBnLmFwcGx5KGIsW2MsZF0pfSxiLmJpbmRBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXthLmVmZmVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZWZmZWN0Ll9ub3JtYWxpemVkS2V5ZnJhbWVzJiZiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3QoYSl9O3ZhciBpPVtdO2IuYXdhaXRTdGFydFRpbWU9ZnVuY3Rpb24oYSl7bnVsbD09PWEuc3RhcnRUaW1lJiZhLl9pc0dyb3VwJiYoMD09aS5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZShlKSxpLnB1c2goYSkpfTt2YXIgaj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJnZXRDb21wdXRlZFN0eWxlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpO3ZhciBhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBlKCkmJihhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpKSx3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLGF9fSksd2luZG93LktleWZyYW1lRWZmZWN0PWIuS2V5ZnJhbWVFZmZlY3Qsd2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEFuaW1hdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQudGltZWxpbmUuZ2V0QW5pbWF0aW9ucygpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEuZWZmZWN0JiZhLmVmZmVjdC50YXJnZXQ9PXRoaXN9LmJpbmQodGhpcykpfX0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2EuX3JlZ2lzdGVyZWR8fChhLl9yZWdpc3RlcmVkPSEwLGcucHVzaChhKSxofHwoaD0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSkpKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWc7Zz1bXSxiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9KSxiPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe2EoKTt2YXIgYj1hLl9hbmltYXRpb24/YS5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSI7cmV0dXJuInJ1bm5pbmciIT1iJiYicGVuZGluZyIhPWImJihhLl9yZWdpc3RlcmVkPSExKSxhLl9yZWdpc3RlcmVkfSksZy5wdXNoLmFwcGx5KGcsYiksZy5sZW5ndGg/KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKTpoPSExfXZhciBmPShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKSwwKTtiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3Q9ZnVuY3Rpb24oYil7dmFyIGMsZT1iLmVmZmVjdC50YXJnZXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgYi5lZmZlY3QuZ2V0RnJhbWVzKCk7Yz1nP2IuZWZmZWN0LmdldEZyYW1lcygpOmIuZWZmZWN0Ll9vbnNhbXBsZTt2YXIgaD1iLmVmZmVjdC50aW1pbmcsaT1udWxsO2g9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChoKTt2YXIgaj1mdW5jdGlvbigpe3ZhciBkPWouX2FuaW1hdGlvbj9qLl9hbmltYXRpb24uY3VycmVudFRpbWU6bnVsbDtudWxsIT09ZCYmKGQ9YS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihoKSxkLGgpLGlzTmFOKGQpJiYoZD1udWxsKSksZCE9PWkmJihnP2MoZCxlLGIuZWZmZWN0KTpjKGQsYi5lZmZlY3QsYi5lZmZlY3QuX2FuaW1hdGlvbikpLGk9ZH07ai5fYW5pbWF0aW9uPWIsai5fcmVnaXN0ZXJlZD0hMSxqLl9zZXF1ZW5jZU51bWJlcj1mKyssYi5fY2FsbGJhY2s9aixkKGopfTt2YXIgZz1bXSxoPSExO2IuQW5pbWF0aW9uLnByb3RvdHlwZS5fcmVnaXN0ZXI9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFjayYmZCh0aGlzLl9jYWxsYmFjayl9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEuX3RpbWluZy5kZWxheSthLmFjdGl2ZUR1cmF0aW9uK2EuX3RpbWluZy5lbmREZWxheX1mdW5jdGlvbiBlKGIsYyxkKXt0aGlzLl9pZD1kLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49Ynx8W10sdGhpcy5fcmVwYXJlbnQodGhpcy5jaGlsZHJlbiksYz1hLm51bWVyaWNUaW1pbmdUb09iamVjdChjKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoYyksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYywhMCksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGMsITAsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJhdXRvIj09PXRoaXMuX3RpbWluZy5kdXJhdGlvbiYmKHRoaXMuX3RpbWluZy5kdXJhdGlvbj10aGlzLmFjdGl2ZUR1cmF0aW9uKX13aW5kb3cuU2VxdWVuY2VFZmZlY3Q9ZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2luZG93Lkdyb3VwRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlPXtfaXNBbmNlc3RvcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9wYXJlbnR9cmV0dXJuITF9LF9yZWJ1aWxkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXM7YTspImF1dG8iPT09YS50aW1pbmcuZHVyYXRpb24mJihhLl90aW1pbmcuZHVyYXRpb249YS5hY3RpdmVEdXJhdGlvbiksYT1hLl9wYXJlbnQ7dGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LF9yZXBhcmVudDpmdW5jdGlvbihhKXtiLnJlbW92ZU11bHRpKGEpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX3BhcmVudD10aGlzfSxfcHV0Q2hpbGQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yj8iQ2Fubm90IGFwcGVuZCBhbiBhbmNlc3RvciBvciBzZWxmIjoiQ2Fubm90IHByZXBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuX2lzQW5jZXN0b3IoYVtkXSkpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLG5hbWU6IkhpZXJhcmNoeVJlcXVlc3RFcnJvciIsbWVzc2FnZTpjfTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyliP3RoaXMuY2hpbGRyZW4ucHVzaChhW2RdKTp0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYVtkXSk7dGhpcy5fcmVwYXJlbnQoYSksdGhpcy5fcmVidWlsZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wdXRDaGlsZChhcmd1bWVudHMsITApfSxwcmVwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCExKX0sZ2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnR9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY2hpbGRyZW5bMF06bnVsbH0sZ2V0IGxhc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdOm51bGx9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWEuY2xvbmVUaW1pbmdJbnB1dCh0aGlzLl90aW1pbmdJbnB1dCksYz1bXSxkPTA7ZDx0aGlzLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5wdXNoKHRoaXMuY2hpbGRyZW5bZF0uY2xvbmUoKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBHcm91cEVmZmVjdD9uZXcgR3JvdXBFZmZlY3QoYyxiKTpuZXcgU2VxdWVuY2VFZmZlY3QoYyxiKX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX0sd2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YSs9ZChiKX0pLE1hdGgubWF4KGEsMCl9fSksd2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YT1NYXRoLm1heChhLGQoYikpfSksYX19KSxiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihjKXt2YXIgZCxlPW51bGwsZj1mdW5jdGlvbihiKXt2YXIgYz1kLl93cmFwcGVyO3JldHVybiBjJiYicGVuZGluZyIhPWMucGxheVN0YXRlJiZjLmVmZmVjdD9udWxsPT1iP3ZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCk6MD09YiYmYy5wbGF5YmFja1JhdGU8MCYmKGV8fChlPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy5lZmZlY3QudGltaW5nKSksYj1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGUpLC0xLGUpLGlzTmFOKGIpfHxudWxsPT1iKT8oYy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EuY3VycmVudFRpbWU9LTF9KSx2b2lkIGMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpKTp2b2lkIDA6dm9pZCAwfSxnPW5ldyBLZXlmcmFtZUVmZmVjdChudWxsLFtdLGMuX3RpbWluZyxjLl9pZCk7cmV0dXJuIGcub25zYW1wbGU9ZixkPWIudGltZWxpbmUuX3BsYXkoZyl9LGIuYmluZEFuaW1hdGlvbkZvckdyb3VwPWZ1bmN0aW9uKGEpe2EuX2FuaW1hdGlvbi5fd3JhcHBlcj1hLGEuX2lzR3JvdXA9ITAsYi5hd2FpdFN0YXJ0VGltZShhKSxhLl9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnMoKSxhLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sYi5ncm91cENoaWxkRHVyYXRpb249ZH0oYyxlLGYpLGJbInRydWUiXT1hfSh7fSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpKTsKCi8qKgpAbGljZW5zZSBAbm9jb21waWxlCkNvcHlyaWdodCAoYykgMjAxOCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCihmdW5jdGlvbigpey8qCgogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwondXNlIHN0cmljdCc7dmFyIG4scD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09dGhpcz90aGlzOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOnRoaXMsYWE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7YSE9QXJyYXkucHJvdG90eXBlJiZhIT1PYmplY3QucHJvdG90eXBlJiYoYVtiXT1jLnZhbHVlKX07ZnVuY3Rpb24gYmEoKXtiYT1mdW5jdGlvbigpe307cC5TeW1ib2x8fChwLlN5bWJvbD1jYSl9dmFyIGNhPWZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImpzY29tcF9zeW1ib2xfIisoYnx8IiIpK2ErK319KCk7CmZ1bmN0aW9uIGRhKCl7YmEoKTt2YXIgYT1wLlN5bWJvbC5pdGVyYXRvcjthfHwoYT1wLlN5bWJvbC5pdGVyYXRvcj1wLlN5bWJvbCgiaXRlcmF0b3IiKSk7ImZ1bmN0aW9uIiE9dHlwZW9mIEFycmF5LnByb3RvdHlwZVthXSYmYWEoQXJyYXkucHJvdG90eXBlLGEse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlYSh0aGlzKX19KTtkYT1mdW5jdGlvbigpe319ZnVuY3Rpb24gZWEoYSl7dmFyIGI9MDtyZXR1cm4gZmEoZnVuY3Rpb24oKXtyZXR1cm4gYjxhLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTphW2IrK119Ontkb25lOiEwfX0pfWZ1bmN0aW9uIGZhKGEpe2RhKCk7YT17bmV4dDphfTthW3AuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4gYX1mdW5jdGlvbiBpYShhKXtkYSgpO3ZhciBiPWFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYj9iLmNhbGwoYSk6ZWEoYSl9CmZ1bmN0aW9uIGphKGEpe2Zvcih2YXIgYixjPVtdOyEoYj1hLm5leHQoKSkuZG9uZTspYy5wdXNoKGIudmFsdWUpO3JldHVybiBjfQooZnVuY3Rpb24oKXtpZighZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTthLmluaXRFdmVudCgiZm9vIiwhMCwhMCk7YS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBhLmRlZmF1bHRQcmV2ZW50ZWR9KCkpe3ZhciBhPUV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdDtFdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGFibGUmJihhLmNhbGwodGhpcyksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRlZmF1bHRQcmV2ZW50ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29uZmlndXJhYmxlOiEwfSkpfX12YXIgYj0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZighd2luZG93LkN1c3RvbUV2ZW50fHxiJiYiZnVuY3Rpb24iIT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCl3aW5kb3cuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpOwpjLmluaXRDdXN0b21FdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIuZGV0YWlsKTtyZXR1cm4gY30sd2luZG93LkN1c3RvbUV2ZW50LnByb3RvdHlwZT13aW5kb3cuRXZlbnQucHJvdG90eXBlO2lmKCF3aW5kb3cuRXZlbnR8fGImJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LkV2ZW50KXt2YXIgYz13aW5kb3cuRXZlbnQ7d2luZG93LkV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtjLmluaXRFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlKTtyZXR1cm4gY307aWYoYylmb3IodmFyIGQgaW4gYyl3aW5kb3cuRXZlbnRbZF09Y1tkXTt3aW5kb3cuRXZlbnQucHJvdG90eXBlPWMucHJvdG90eXBlfWlmKCF3aW5kb3cuTW91c2VFdmVudHx8YiYmImZ1bmN0aW9uIiE9PXR5cGVvZiB3aW5kb3cuTW91c2VFdmVudCl7Yj13aW5kb3cuTW91c2VFdmVudDt3aW5kb3cuTW91c2VFdmVudD1mdW5jdGlvbihhLApiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7Yy5pbml0TW91c2VFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIudmlld3x8d2luZG93LGIuZGV0YWlsLGIuc2NyZWVuWCxiLnNjcmVlblksYi5jbGllbnRYLGIuY2xpZW50WSxiLmN0cmxLZXksYi5hbHRLZXksYi5zaGlmdEtleSxiLm1ldGFLZXksYi5idXR0b24sYi5yZWxhdGVkVGFyZ2V0KTtyZXR1cm4gY307aWYoYilmb3IoZCBpbiBiKXdpbmRvdy5Nb3VzZUV2ZW50W2RdPWJbZF07d2luZG93Lk1vdXNlRXZlbnQucHJvdG90eXBlPWIucHJvdG90eXBlfUFycmF5LmZyb218fChBcnJheS5mcm9tPWZ1bmN0aW9uKGEpe3JldHVybltdLnNsaWNlLmNhbGwoYSl9KTtPYmplY3QuYXNzaWdufHwoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxkPTAsZTtkPGMubGVuZ3RoO2QrKylpZihlPWNbZF0pZm9yKHZhciBmPQphLG09ZSxxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG0pLHg9MDt4PHEubGVuZ3RoO3grKyllPXFbeF0sZltlXT1tW2VdO3JldHVybiBhfSl9KSh3aW5kb3cuV2ViQ29tcG9uZW50cyk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31mdW5jdGlvbiBiKGEsYil7aWYoIWEuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuW107c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOnJldHVybiB1YS5jYWxsKGEsYik7Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6cmV0dXJuIGxiLmNhbGwoYSxiKTtkZWZhdWx0OnJldHVybiBVLmNhbGwoYSxiKX19dmFyIGM9InVuZGVmaW5lZCI9PT10eXBlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCxkPSEoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmNsb25lTm9kZSgpaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSxlPSExOy9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3IodmFyIGQ7ZD1hLmZpcnN0Q2hpbGQ7KWMuY2FsbCh0aGlzLGQsYik7ZWxzZSBjLmNhbGwodGhpcywKYSxiKTtyZXR1cm4gYX1lPSEwO3ZhciBiPU5vZGUucHJvdG90eXBlLmNsb25lTm9kZTtOb2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9ZnVuY3Rpb24oYSl7YT1iLmNhbGwodGhpcyxhKTt0aGlzIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGEuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYX07RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbD1IVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbDtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yPUhUTUxFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHtub2RlVHlwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERX0sY29uZmlndXJhYmxlOiEwfSxsb2NhbE5hbWU6e2dldDpmdW5jdGlvbigpe30sCmNvbmZpZ3VyYWJsZTohMH0sbm9kZU5hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiIjZG9jdW1lbnQtZnJhZ21lbnQifSxjb25maWd1cmFibGU6ITB9fSk7dmFyIGM9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlO05vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZT1hO3ZhciBkPU5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkO05vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGIpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P2EuY2FsbCh0aGlzLGIsbnVsbCk6ZC5jYWxsKHRoaXMsYik7cmV0dXJuIGJ9O3ZhciBmPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGc9Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkO05vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZD1mdW5jdGlvbihiLGMpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50PyhhLmNhbGwodGhpcyxiLGMpLGYuY2FsbCh0aGlzLGMpKTpnLmNhbGwodGhpcyxiLGMpO3JldHVybiBjfTtEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD0KZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNyZWF0ZUVsZW1lbnQoImRmIik7YS5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGU7cmV0dXJuIGF9O3ZhciBoPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlO0RvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7Yj1oLmNhbGwodGhpcyxhLGJ8fCExKTthIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGIuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYn19KCk7dmFyIGY9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlLGc9RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsaD1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZSxrPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGw9Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsbT1Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQscT1ET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZywKeD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpfHx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5pbm5lckhUTUw9YX19LE09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsImNoaWxkTm9kZXMiKXx8e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9fSxVPUVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsdWE9RG9jdW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsbGI9RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxtYj1mdW5jdGlvbigpe2lmKCFjKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtiLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwphLmNvbnRlbnQuYXBwZW5kQ2hpbGQoYik7YT1hLmNsb25lTm9kZSghMCk7cmV0dXJuIDA9PT1hLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fDA9PT1hLmNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50LmNoaWxkTm9kZXMubGVuZ3RofHxkfX0oKTtpZihjKXt2YXIgUz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoInRlbXBsYXRlIiksQz0hMCxWPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Vi50ZXh0Q29udGVudD0idGVtcGxhdGV7ZGlzcGxheTpub25lO30iO3ZhciBoYT1kb2N1bWVudC5oZWFkO2hhLmluc2VydEJlZm9yZShWLGhhLmZpcnN0RWxlbWVudENoaWxkKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSk7dmFyIHZhPSFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5oYXNPd25Qcm9wZXJ0eSgiaW5uZXJIVE1MIik7YS5HPWZ1bmN0aW9uKGIpe2lmKCFiLmNvbnRlbnQmJmIubmFtZXNwYWNlVVJJPT09CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkpe2IuY29udGVudD1TLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IodmFyIGM7Yz1iLmZpcnN0Q2hpbGQ7KWwuY2FsbChiLmNvbnRlbnQsYyk7aWYodmEpYi5fX3Byb3RvX189YS5wcm90b3R5cGU7ZWxzZSBpZihiLmNsb25lTm9kZT1mdW5jdGlvbihiKXtyZXR1cm4gYS5hKHRoaXMsYil9LEMpdHJ5e1AoYiksVyhiKX1jYXRjaChUZyl7Qz0hMX1hLkMoYi5jb250ZW50KX19O3ZhciBYPXtvcHRpb246WyJzZWxlY3QiXSx0aGVhZDpbInRhYmxlIl0sY29sOlsiY29sZ3JvdXAiLCJ0YWJsZSJdLHRyOlsidGJvZHkiLCJ0YWJsZSJdLHRoOlsidHIiLCJ0Ym9keSIsInRhYmxlIl0sdGQ6WyJ0ciIsInRib2R5IiwidGFibGUiXX0sUD1mdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiaW5uZXJIVE1MIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5iKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYil7dmFyIGM9WFsoLzwoW2Etel1bXi9cMD5ceDIwXHRcclxuXGZdKykvaS5leGVjKGIpfHwKWyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV07aWYoYylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyliPSI8IitjW2RdKyI+IitiKyI8LyIrY1tkXSsiPiI7Uy5ib2R5LmlubmVySFRNTD1iO2ZvcihhLkMoUyk7dGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7KWsuY2FsbCh0aGlzLmNvbnRlbnQsdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQpO2I9Uy5ib2R5O2lmKGMpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyliPWIubGFzdENoaWxkO2Zvcig7Yi5maXJzdENoaWxkOylsLmNhbGwodGhpcy5jb250ZW50LGIuZmlyc3RDaGlsZCl9LGNvbmZpZ3VyYWJsZTohMH0pfSxXPWZ1bmN0aW9uKGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJvdXRlckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iPHRlbXBsYXRlPiIrdGhpcy5pbm5lckhUTUwrIjwvdGVtcGxhdGU+In0sc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMucGFyZW50Tm9kZSl7Uy5ib2R5LmlubmVySFRNTD1hO2ZvcihhPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Uy5ib2R5LmZpcnN0Q2hpbGQ7KWwuY2FsbChhLApTLmJvZHkuZmlyc3RDaGlsZCk7bS5jYWxsKHRoaXMucGFyZW50Tm9kZSxhLHRoaXMpfWVsc2UgdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBzZXQgdGhlICdvdXRlckhUTUwnIHByb3BlcnR5IG9uICdFbGVtZW50JzogVGhpcyBlbGVtZW50IGhhcyBubyBwYXJlbnQgbm9kZS4iKTt9LGNvbmZpZ3VyYWJsZTohMH0pfTtQKGEucHJvdG90eXBlKTtXKGEucHJvdG90eXBlKTthLkM9ZnVuY3Rpb24oYyl7Yz1iKGMsInRlbXBsYXRlIik7Zm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmO2Q8ZSYmKGY9Y1tkXSk7ZCsrKWEuRyhmKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXthLkMoZG9jdW1lbnQpfSk7RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYj1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsidGVtcGxhdGUiPT09Yi5sb2NhbE5hbWUmJmEuRyhiKTtyZXR1cm4gYn07RE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmc9CmZ1bmN0aW9uKCl7dmFyIGI9cS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YS5DKGIpO3JldHVybiBifTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmIodGhpcyl9LHNldDpmdW5jdGlvbihiKXt4LnNldC5jYWxsKHRoaXMsYik7YS5DKHRoaXMpfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO3ZhciBWZT0vWyZcdTAwQTAiXS9nLHljPS9bJlx1MDBBMDw+XS9nLHpjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICImIjpyZXR1cm4iJmFtcDsiO2Nhc2UgIjwiOnJldHVybiImbHQ7IjtjYXNlICI+IjpyZXR1cm4iJmd0OyI7Y2FzZSAnIic6cmV0dXJuIiZxdW90OyI7Y2FzZSAiXHUwMGEwIjpyZXR1cm4iJm5ic3A7In19O1Y9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKyliW2FbY11dPSEwO3JldHVybiBifTt2YXIgV2U9VigiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnIiLnNwbGl0KCIgIikpLApYZT1WKCJzdHlsZSBzY3JpcHQgeG1wIGlmcmFtZSBub2VtYmVkIG5vZnJhbWVzIHBsYWludGV4dCBub3NjcmlwdCIuc3BsaXQoIiAiKSksbmI9ZnVuY3Rpb24oYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOk0uZ2V0LmNhbGwoYSksZT0wLGY9ZC5sZW5ndGgsZztlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hO3ZhciBsPWI7c3dpdGNoKGgubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Zm9yKHZhciBQPWgubG9jYWxOYW1lLG09IjwiK1AsVz1oLmF0dHJpYnV0ZXMscT0wO2s9V1txXTtxKyspbSs9IiAiK2submFtZSsnPSInK2sudmFsdWUucmVwbGFjZShWZSx6YykrJyInO20rPSI+IjtoPVdlW1BdP206bStuYihoLGwpKyI8LyIrUCsiPiI7YnJlYWsgYTtjYXNlIE5vZGUuVEVYVF9OT0RFOmg9aC5kYXRhO2g9ayYmWGVbay5sb2NhbE5hbWVdP2g6aC5yZXBsYWNlKHljLHpjKTticmVhayBhOwpjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO319Yys9aH1yZXR1cm4gY319aWYoY3x8bWIpe2EuYT1mdW5jdGlvbihhLGIpe3ZhciBjPWYuY2FsbChhLCExKTt0aGlzLkcmJnRoaXMuRyhjKTtiJiYobC5jYWxsKGMuY29udGVudCxmLmNhbGwoYS5jb250ZW50LCEwKSksb2IoYy5jb250ZW50LGEuY29udGVudCkpO3JldHVybiBjfTt2YXIgb2I9ZnVuY3Rpb24oYyxkKXtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwmJihkPWIoZCwidGVtcGxhdGUiKSwwIT09ZC5sZW5ndGgpKXtjPWIoYywidGVtcGxhdGUiKTtmb3IodmFyIGU9MCxmPWMubGVuZ3RoLGcsaDtlPGY7ZSsrKWg9ZFtlXSxnPWNbZV0sYSYmYS5HJiZhLkcoaCksbS5jYWxsKGcucGFyZW50Tm9kZSxZZS5jYWxsKGgsITApLGcpfX0sWWU9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPQpmdW5jdGlvbihiKXtpZighZSYmZCYmdGhpcyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpaWYoYil2YXIgYz1aZS5jYWxsKHRoaXMub3duZXJEb2N1bWVudCx0aGlzLCEwKTtlbHNlIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Vsc2UgdGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiYidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUmJnRoaXMubmFtZXNwYWNlVVJJPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJP2M9YS5hKHRoaXMsYik6Yz1mLmNhbGwodGhpcyxiKTtiJiZvYihjLHRoaXMpO3JldHVybiBjfSxaZT1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZT1mdW5jdGlvbihjLGQpe2Q9ZHx8ITE7aWYoInRlbXBsYXRlIj09PWMubG9jYWxOYW1lKXJldHVybiBhLmEoYyxkKTt2YXIgZT1oLmNhbGwodGhpcyxjLGQpO2lmKGQpe29iKGUsYyk7Yz1iKGUsJ3NjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXScpOwpmb3IodmFyIGYsaz0wO2s8Yy5sZW5ndGg7aysrKXtmPWNba107ZD1nLmNhbGwoZG9jdW1lbnQsInNjcmlwdCIpO2QudGV4dENvbnRlbnQ9Zi50ZXh0Q29udGVudDtmb3IodmFyIGw9Zi5hdHRyaWJ1dGVzLFA9MCxXO1A8bC5sZW5ndGg7UCsrKVc9bFtQXSxkLnNldEF0dHJpYnV0ZShXLm5hbWUsVy52YWx1ZSk7bS5jYWxsKGYucGFyZW50Tm9kZSxkLGYpfX1yZXR1cm4gZX19YyYmKHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50PWEpfSkoKTt2YXIga2E9c2V0VGltZW91dDtmdW5jdGlvbiBsYSgpe31mdW5jdGlvbiBtYShhLGIpe3JldHVybiBmdW5jdGlvbigpe2EuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiByKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldyIpO2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSBmdW5jdGlvbiIpO3RoaXMudT0wO3RoaXMubWE9ITE7dGhpcy5oPXZvaWQgMDt0aGlzLkk9W107bmEoYSx0aGlzKX0KZnVuY3Rpb24gb2EoYSxiKXtmb3IoOzM9PT1hLnU7KWE9YS5oOzA9PT1hLnU/YS5JLnB1c2goYik6KGEubWE9ITAscGEoZnVuY3Rpb24oKXt2YXIgYz0xPT09YS51P2IuTmE6Yi5PYTtpZihudWxsPT09YykoMT09PWEudT9xYTpyYSkoYi5nYSxhLmgpO2Vsc2V7dHJ5e3ZhciBkPWMoYS5oKX1jYXRjaChlKXtyYShiLmdhLGUpO3JldHVybn1xYShiLmdhLGQpfX0pKX1mdW5jdGlvbiBxYShhLGIpe3RyeXtpZihiPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLiIpO2lmKGImJigib2JqZWN0Ij09PXR5cGVvZiBifHwiZnVuY3Rpb24iPT09dHlwZW9mIGIpKXt2YXIgYz1iLnRoZW47aWYoYiBpbnN0YW5jZW9mIHIpe2EudT0zO2EuaD1iO3NhKGEpO3JldHVybn1pZigiZnVuY3Rpb24iPT09dHlwZW9mIGMpe25hKG1hKGMsYiksYSk7cmV0dXJufX1hLnU9MTthLmg9YjtzYShhKX1jYXRjaChkKXtyYShhLGQpfX0KZnVuY3Rpb24gcmEoYSxiKXthLnU9MjthLmg9YjtzYShhKX1mdW5jdGlvbiBzYShhKXsyPT09YS51JiYwPT09YS5JLmxlbmd0aCYmcGEoZnVuY3Rpb24oKXthLm1hfHwidW5kZWZpbmVkIiE9PXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLGEuaCl9KTtmb3IodmFyIGI9MCxjPWEuSS5sZW5ndGg7YjxjO2IrKylvYShhLGEuSVtiXSk7YS5JPW51bGx9ZnVuY3Rpb24gdGEoYSxiLGMpe3RoaXMuTmE9ImZ1bmN0aW9uIj09PXR5cGVvZiBhP2E6bnVsbDt0aGlzLk9hPSJmdW5jdGlvbiI9PT10eXBlb2YgYj9iOm51bGw7dGhpcy5nYT1jfWZ1bmN0aW9uIG5hKGEsYil7dmFyIGM9ITE7dHJ5e2EoZnVuY3Rpb24oYSl7Y3x8KGM9ITAscWEoYixhKSl9LGZ1bmN0aW9uKGEpe2N8fChjPSEwLHJhKGIsYSkpfSl9Y2F0Y2goZCl7Y3x8KGM9ITAscmEoYixkKSl9fQpyLnByb3RvdHlwZVsiY2F0Y2giXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9O3IucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihsYSk7b2EodGhpcyxuZXcgdGEoYSxiLGMpKTtyZXR1cm4gY307ci5wcm90b3R5cGVbImZpbmFsbHkiXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGIucmVzb2x2ZShhKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY30pfSxmdW5jdGlvbihjKXtyZXR1cm4gYi5yZXNvbHZlKGEoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBiLnJlamVjdChjKX0pfSl9OwpmdW5jdGlvbiB3YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtmdW5jdGlvbiBkKGEsZyl7dHJ5e2lmKGcmJigib2JqZWN0Ij09PXR5cGVvZiBnfHwiZnVuY3Rpb24iPT09dHlwZW9mIGcpKXt2YXIgaD1nLnRoZW47aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBoKXtoLmNhbGwoZyxmdW5jdGlvbihiKXtkKGEsYil9LGMpO3JldHVybn19ZVthXT1nOzA9PT0tLWYmJmIoZSl9Y2F0Y2gobSl7YyhtKX19aWYoIWF8fCJ1bmRlZmluZWQiPT09dHlwZW9mIGEubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2UuYWxsIGFjY2VwdHMgYW4gYXJyYXkiKTt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGIoW10pO2Zvcih2YXIgZj1lLmxlbmd0aCxnPTA7ZzxlLmxlbmd0aDtnKyspZChnLGVbZ10pfSl9CmZ1bmN0aW9uIHhhKGEpe3JldHVybiBhJiYib2JqZWN0Ij09PXR5cGVvZiBhJiZhLmNvbnN0cnVjdG9yPT09cj9hOm5ldyByKGZ1bmN0aW9uKGIpe2IoYSl9KX1mdW5jdGlvbiB5YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtjKGEpfSl9ZnVuY3Rpb24gemEoYSl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWFbZF0udGhlbihiLGMpfSl9dmFyIHBhPSJmdW5jdGlvbiI9PT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZmdW5jdGlvbihhKXtzZXRJbW1lZGlhdGUoYSl9fHxmdW5jdGlvbihhKXtrYShhLDApfTsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KaWYoIXdpbmRvdy5Qcm9taXNlKXt3aW5kb3cuUHJvbWlzZT1yO3IucHJvdG90eXBlLnRoZW49ci5wcm90b3R5cGUudGhlbjtyLmFsbD13YTtyLnJhY2U9emE7ci5yZXNvbHZlPXhhO3IucmVqZWN0PXlhO3ZhciBBYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksQmE9W107KG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPUJhLmxlbmd0aCxiPTA7YjxhO2IrKylCYVtiXSgpO0JhLnNwbGljZSgwLGEpfSkpLm9ic2VydmUoQWEse2NoYXJhY3RlckRhdGE6ITB9KTtwYT1mdW5jdGlvbihhKXtCYS5wdXNoKGEpO0FhLnRleHRDb250ZW50PTA8QWEudGV4dENvbnRlbnQubGVuZ3RoPyIiOiJhIn19OyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQpcmV0dXJuIG5ldyBDdXN0b21FdmVudChhLGIpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpO2MuaW5pdEN1c3RvbUV2ZW50KGEsISFiLmJ1YmJsZXMsISFiLmNhbmNlbGFibGUsYi5kZXRhaWwpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSl7aWYoTSlyZXR1cm4gYS5vd25lckRvY3VtZW50IT09ZG9jdW1lbnQ/YS5vd25lckRvY3VtZW50Om51bGw7dmFyIGI9YS5fX2ltcG9ydERvYztpZighYiYmYS5wYXJlbnROb2RlKXtiPWEucGFyZW50Tm9kZTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGIuY2xvc2VzdCliPWIuY2xvc2VzdCgibGlua1tyZWw9aW1wb3J0XSIpO2Vsc2UgZm9yKDshaChiKSYmKGI9Yi5wYXJlbnROb2RlKTspO2EuX19pbXBvcnREb2M9Yn1yZXR1cm4gYn1mdW5jdGlvbiBkKGEpe3ZhciBiPW0oZG9jdW1lbnQsImxpbmtbcmVsPWltcG9ydF06bm90KFtpbXBvcnQtZGVwZW5kZW5jeV0pIiksCmM9Yi5sZW5ndGg7Yz9xKGIsZnVuY3Rpb24oYil7cmV0dXJuIGcoYixmdW5jdGlvbigpezA9PT0tLWMmJmEoKX0pfSk6YSgpfWZ1bmN0aW9uIGUoYSl7ZnVuY3Rpb24gYigpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGUmJmRvY3VtZW50LmJvZHkmJihkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixiKSxhKCkpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGIpO2IoKX1mdW5jdGlvbiBmKGEpe2UoZnVuY3Rpb24oKXtyZXR1cm4gZChmdW5jdGlvbigpe3JldHVybiBhJiZhKCl9KX0pfWZ1bmN0aW9uIGcoYSxiKXtpZihhLl9fbG9hZGVkKWImJmIoKTtlbHNlIGlmKCJzY3JpcHQiPT09YS5sb2NhbE5hbWUmJiFhLnNyY3x8InN0eWxlIj09PWEubG9jYWxOYW1lJiYhYS5maXJzdENoaWxkKWEuX19sb2FkZWQ9ITAsYiYmYigpO2Vsc2V7dmFyIGM9ZnVuY3Rpb24oZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKGQudHlwZSwKYyk7YS5fX2xvYWRlZD0hMDtiJiZiKCl9O2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYyk7aGEmJiJzdHlsZSI9PT1hLmxvY2FsTmFtZXx8YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmImxpbmsiPT09YS5sb2NhbE5hbWUmJiJpbXBvcnQiPT09YS5yZWx9ZnVuY3Rpb24gaygpe3ZhciBhPXRoaXM7dGhpcy5hPXt9O3RoaXMuYj0wO3RoaXMuYz1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtyZXR1cm4gYS5KYShiKX0pO3RoaXMuYy5vYnNlcnZlKGRvY3VtZW50LmhlYWQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7dGhpcy5sb2FkSW1wb3J0cyhkb2N1bWVudCl9ZnVuY3Rpb24gbChhKXtxKG0oYSwidGVtcGxhdGUiKSxmdW5jdGlvbihhKXtxKG0oYS5jb250ZW50LCdzY3JpcHQ6bm90KFt0eXBlXSksc2NyaXB0W3R5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0idGV4dC9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9Im1vZHVsZSJdJyksCmZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3EoYS5hdHRyaWJ1dGVzLGZ1bmN0aW9uKGEpe3JldHVybiBiLnNldEF0dHJpYnV0ZShhLm5hbWUsYS52YWx1ZSl9KTtiLnRleHRDb250ZW50PWEudGV4dENvbnRlbnQ7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLGEpfSk7bChhLmNvbnRlbnQpfSl9ZnVuY3Rpb24gbShhLGIpe3JldHVybiBhLmNoaWxkTm9kZXMubGVuZ3RoP2EucXVlcnlTZWxlY3RvckFsbChiKTpVfWZ1bmN0aW9uIHEoYSxiLGMpe3ZhciBkPWE/YS5sZW5ndGg6MCxlPWM/LTE6MTtmb3IoYz1jP2QtMTowO2M8ZCYmMDw9YztjKz1lKWIoYVtjXSxjKX12YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIiksTT0iaW1wb3J0ImluIHgsVT14LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSx1YT1udWxsOyExPT09ImN1cnJlbnRTY3JpcHQiaW4gZG9jdW1lbnQmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwiY3VycmVudFNjcmlwdCIsCntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdWF8fCgiY29tcGxldGUiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9kb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoLTFdOm51bGwpfSxjb25maWd1cmFibGU6ITB9KTt2YXIgbGI9Lyh1cmxcKCkoW14pXSopKFwpKS9nLG1iPS8oQGltcG9ydFtcc10rKD8hdXJsXCgpKShbXjtdKikoOykvZyxTPS8oPGxpbmtbXj5dKikocmVsPVsnfCJdP3N0eWxlc2hlZXRbJ3wiXT9bXj5dKj4pL2csQz17RWE6ZnVuY3Rpb24oYSxiKXthLmhyZWYmJmEuc2V0QXR0cmlidXRlKCJocmVmIixDLlgoYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSk7YS5zcmMmJmEuc2V0QXR0cmlidXRlKCJzcmMiLEMuWChhLmdldEF0dHJpYnV0ZSgic3JjIiksYikpO2lmKCJzdHlsZSI9PT1hLmxvY2FsTmFtZSl7dmFyIGM9Qy5xYShhLnRleHRDb250ZW50LGIsbGIpO2EudGV4dENvbnRlbnQ9Qy5xYShjLGIsbWIpfX0scWE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlcGxhY2UoYywKZnVuY3Rpb24oYSxjLGQsZSl7YT1kLnJlcGxhY2UoL1siJ10vZywiIik7YiYmKGE9Qy5YKGEsYikpO3JldHVybiBjKyInIithKyInIitlfSl9LFg6ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1DLmFhKXtDLmFhPSExO3RyeXt2YXIgYz1uZXcgVVJMKCJiIiwiaHR0cDovL2EiKTtjLnBhdGhuYW1lPSJjJTIwZCI7Qy5hYT0iaHR0cDovL2EvYyUyMGQiPT09Yy5ocmVmfWNhdGNoKHljKXt9fWlmKEMuYWEpcmV0dXJuKG5ldyBVUkwoYSxiKSkuaHJlZjtjPUMueGE7Y3x8KGM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJ0ZW1wIiksQy54YT1jLGMuamE9Yy5jcmVhdGVFbGVtZW50KCJiYXNlIiksYy5oZWFkLmFwcGVuZENoaWxkKGMuamEpLGMuaWE9Yy5jcmVhdGVFbGVtZW50KCJhIikpO2MuamEuaHJlZj1iO2MuaWEuaHJlZj1hO3JldHVybiBjLmlhLmhyZWZ8fGF9fSxWPXthc3luYzohMCxsb2FkOmZ1bmN0aW9uKGEsYixjKXtpZihhKWlmKGEubWF0Y2goL15kYXRhOi8pKXthPQphLnNwbGl0KCIsIik7dmFyIGQ9YVsxXTtkPS0xPGFbMF0uaW5kZXhPZigiO2Jhc2U2NCIpP2F0b2IoZCk6ZGVjb2RlVVJJQ29tcG9uZW50KGQpO2IoZCl9ZWxzZXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vcGVuKCJHRVQiLGEsVi5hc3luYyk7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1lLnJlc3BvbnNlVVJMfHxlLmdldFJlc3BvbnNlSGVhZGVyKCJMb2NhdGlvbiIpO2EmJjA9PT1hLmluZGV4T2YoIi8iKSYmKGE9KGxvY2F0aW9uLm9yaWdpbnx8bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KSthKTt2YXIgZD1lLnJlc3BvbnNlfHxlLnJlc3BvbnNlVGV4dDszMDQ9PT1lLnN0YXR1c3x8MD09PWUuc3RhdHVzfHwyMDA8PWUuc3RhdHVzJiYzMDA+ZS5zdGF0dXM/YihkLGEpOmMoZCl9O2Uuc2VuZCgpfWVsc2UgYygiZXJyb3I6IGhyZWYgbXVzdCBiZSBzcGVjaWZpZWQiKX19LGhhPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwvRWRnZVwvXGQuL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKay5wcm90b3R5cGUubG9hZEltcG9ydHM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthPW0oYSwibGlua1tyZWw9aW1wb3J0XSIpO3EoYSxmdW5jdGlvbihhKXtyZXR1cm4gYi5nKGEpfSl9O2sucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEuaHJlZjtpZih2b2lkIDAhPT10aGlzLmFbY10pe3ZhciBkPXRoaXMuYVtjXTtkJiZkLl9fbG9hZGVkJiYoYS5fX2ltcG9ydD1kLHRoaXMuZihhKSl9ZWxzZSB0aGlzLmIrKyx0aGlzLmFbY109InBlbmRpbmciLFYubG9hZChjLGZ1bmN0aW9uKGEsZCl7YT1iLkthKGEsZHx8Yyk7Yi5hW2NdPWE7Yi5iLS07Yi5sb2FkSW1wb3J0cyhhKTtiLmwoKX0sZnVuY3Rpb24oKXtiLmFbY109bnVsbDtiLmItLTtiLmwoKX0pfTtrLnByb3RvdHlwZS5LYT1mdW5jdGlvbihhLGIpe2lmKCFhKXJldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aGEmJihhPWEucmVwbGFjZShTLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4tMT09PQphLmluZGV4T2YoInR5cGU9Iik/YisiIHR5cGU9aW1wb3J0LWRpc2FibGUgIitjOmF9KSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtjLmlubmVySFRNTD1hO2lmKGMuY29udGVudClhPWMuY29udGVudCxsKGEpO2Vsc2UgZm9yKGE9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2MuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChjLmZpcnN0Q2hpbGQpO2lmKGM9YS5xdWVyeVNlbGVjdG9yKCJiYXNlIikpYj1DLlgoYy5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSxjLnJlbW92ZUF0dHJpYnV0ZSgiaHJlZiIpO2M9bShhLCdsaW5rW3JlbD1pbXBvcnRdLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdW3R5cGU9aW1wb3J0LWRpc2FibGVdLHN0eWxlOm5vdChbdHlwZV0pLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdOm5vdChbdHlwZV0pLHNjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0ibW9kdWxlIl0nKTsKdmFyIGQ9MDtxKGMsZnVuY3Rpb24oYSl7ZyhhKTtDLkVhKGEsYik7YS5zZXRBdHRyaWJ1dGUoImltcG9ydC1kZXBlbmRlbmN5IiwiIik7aWYoInNjcmlwdCI9PT1hLmxvY2FsTmFtZSYmIWEuc3JjJiZhLnRleHRDb250ZW50KXtpZigibW9kdWxlIj09PWEudHlwZSl0aHJvdyBFcnJvcigiSW5saW5lIG1vZHVsZSBzY3JpcHRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEhUTUwgSW1wb3J0cy4iKTthLnNldEF0dHJpYnV0ZSgic3JjIiwiZGF0YTp0ZXh0L2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChhLnRleHRDb250ZW50KygiXG4vLyMgc291cmNlVVJMPSIrYisoZD8iLSIrZDoiIikrIi5qc1xuIikpKTthLnRleHRDb250ZW50PSIiO2QrK319KTtyZXR1cm4gYX07ay5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYoIXRoaXMuYil7dGhpcy5jLmRpc2Nvbm5lY3QoKTt0aGlzLmZsYXR0ZW4oZG9jdW1lbnQpO3ZhciBiPSExLGM9ITEsZD1mdW5jdGlvbigpe2MmJgpiJiYoYS5sb2FkSW1wb3J0cyhkb2N1bWVudCksYS5ifHwoYS5jLm9ic2VydmUoZG9jdW1lbnQuaGVhZCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxhLmRhKCkpKX07dGhpcy5NYShmdW5jdGlvbigpe2M9ITA7ZCgpfSk7dGhpcy5MYShmdW5jdGlvbigpe2I9ITA7ZCgpfSl9fTtrLnByb3RvdHlwZS5mbGF0dGVuPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT1tKGEsImxpbmtbcmVsPWltcG9ydF0iKTtxKGEsZnVuY3Rpb24oYSl7dmFyIGM9Yi5hW2EuaHJlZl07KGEuX19pbXBvcnQ9YykmJmMubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihiLmFbYS5ocmVmXT1hLGEucmVhZHlTdGF0ZT0ibG9hZGluZyIsYS5fX2ltcG9ydD1hLGIuZmxhdHRlbihjKSxhLmFwcGVuZENoaWxkKGMpKX0pfTtrLnByb3RvdHlwZS5MYT1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGUpe2lmKGU8ZCl7dmFyIGY9Y1tlXSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2YucmVtb3ZlQXR0cmlidXRlKCJpbXBvcnQtZGVwZW5kZW5jeSIpOwpxKGYuYXR0cmlidXRlcyxmdW5jdGlvbihhKXtyZXR1cm4gaC5zZXRBdHRyaWJ1dGUoYS5uYW1lLGEudmFsdWUpfSk7dWE9aDtmLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsZik7ZyhoLGZ1bmN0aW9uKCl7dWE9bnVsbDtiKGUrMSl9KX1lbHNlIGEoKX12YXIgYz1tKGRvY3VtZW50LCJzY3JpcHRbaW1wb3J0LWRlcGVuZGVuY3ldIiksZD1jLmxlbmd0aDtiKDApfTtrLnByb3RvdHlwZS5NYT1mdW5jdGlvbihhKXt2YXIgYj1tKGRvY3VtZW50LCJzdHlsZVtpbXBvcnQtZGVwZW5kZW5jeV0sbGlua1tyZWw9c3R5bGVzaGVldF1baW1wb3J0LWRlcGVuZGVuY3ldIiksZD1iLmxlbmd0aDtpZihkKXt2YXIgZT1oYSYmISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJsaW5rW3JlbD1zdHlsZXNoZWV0XVtocmVmXVt0eXBlPWltcG9ydC1kaXNhYmxlXSIpO3EoYixmdW5jdGlvbihiKXtnKGIsZnVuY3Rpb24oKXtiLnJlbW92ZUF0dHJpYnV0ZSgiaW1wb3J0LWRlcGVuZGVuY3kiKTswPT09LS1kJiYKYSgpfSk7aWYoZSYmYi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChiLmxvY2FsTmFtZSk7Zi5fX2FwcGxpZWRFbGVtZW50PWI7Zi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJpbXBvcnQtcGxhY2Vob2xkZXIiKTtiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7Zm9yKGY9YyhiKTtmJiZjKGYpOylmPWMoZik7Zi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCYmKGY9bnVsbCk7ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYixmKTtiLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpfX0pfWVsc2UgYSgpfTtrLnByb3RvdHlwZS5kYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIik7cShiLGZ1bmN0aW9uKGIpe3JldHVybiBhLmYoYil9LCEwKX07ay5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXthLl9fbG9hZGVkfHwoYS5fX2xvYWRlZD0hMCxhLmltcG9ydCYmKGEuaW1wb3J0LnJlYWR5U3RhdGU9CiJjb21wbGV0ZSIpLGEuZGlzcGF0Y2hFdmVudChiKGEuaW1wb3J0PyJsb2FkIjoiZXJyb3IiLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITEsZGV0YWlsOnZvaWQgMH0pKSl9O2sucHJvdG90eXBlLkphPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7cShhLGZ1bmN0aW9uKGEpe3JldHVybiBxKGEuYWRkZWROb2RlcyxmdW5jdGlvbihhKXthJiZhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJihoKGEpP2IuZyhhKTpiLmxvYWRJbXBvcnRzKGEpKX0pfSl9O3ZhciB2YT1udWxsO2lmKE0peD1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIikscSh4LGZ1bmN0aW9uKGEpe2EuaW1wb3J0JiYibG9hZGluZyI9PT1hLmltcG9ydC5yZWFkeVN0YXRlfHwoYS5fX2xvYWRlZD0hMCl9KSx4PWZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7aChhKSYmKGEuX19sb2FkZWQ9ITApfSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix4LCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCngsITApO2Vsc2V7dmFyIFg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwiYmFzZVVSSSIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgoIVh8fFguY29uZmlndXJhYmxlP05vZGU6RWxlbWVudCkucHJvdG90eXBlLCJiYXNlVVJJIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9aCh0aGlzKT90aGlzOmModGhpcyk7cmV0dXJuIGE/YS5ocmVmOlgmJlguZ2V0P1guZ2V0LmNhbGwodGhpcyk6KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJhc2UiKXx8d2luZG93LmxvY2F0aW9uKS5ocmVmfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MTGlua0VsZW1lbnQucHJvdG90eXBlLCJpbXBvcnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ltcG9ydHx8bnVsbH0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KTtlKGZ1bmN0aW9uKCl7dmE9bmV3IGt9KX1mKGZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYigiSFRNTEltcG9ydHNMb2FkZWQiLAp7Y2FuY2VsYWJsZTohMCxidWJibGVzOiEwLGRldGFpbDp2b2lkIDB9KSl9KTthLnVzZU5hdGl2ZT1NO2Eud2hlblJlYWR5PWY7YS5pbXBvcnRGb3JFbGVtZW50PWM7YS5sb2FkSW1wb3J0cz1mdW5jdGlvbihhKXt2YSYmdmEubG9hZEltcG9ydHMoYSl9fSkod2luZG93LkhUTUxJbXBvcnRzPXdpbmRvdy5IVE1MSW1wb3J0c3x8e30pOy8qCgogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwp3aW5kb3cuV2ViQ29tcG9uZW50cz13aW5kb3cuV2ViQ29tcG9uZW50c3x8e2ZsYWdzOnt9fTt2YXIgQ2E9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9IndlYmNvbXBvbmVudHMtbGl0ZS5qcyJdJyksRGE9L3djLSguKykvLHQ9e307aWYoIXQubm9PcHRzKXtsb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2E9YS5zcGxpdCgiPSIpO3ZhciBiO2FbMF0mJihiPWFbMF0ubWF0Y2goRGEpKSYmKHRbYlsxXV09YVsxXXx8ITApfSk7aWYoQ2EpZm9yKHZhciBFYT0wLEZhPXZvaWQgMDtGYT1DYS5hdHRyaWJ1dGVzW0VhXTtFYSsrKSJzcmMiIT09RmEubmFtZSYmKHRbRmEubmFtZV09RmEudmFsdWV8fCEwKTtpZih0LmxvZyYmdC5sb2cuc3BsaXQpe3ZhciBHYT10LmxvZy5zcGxpdCgiLCIpO3QubG9nPXt9O0dhLmZvckVhY2goZnVuY3Rpb24oYSl7dC5sb2dbYV09ITB9KX1lbHNlIHQubG9nPXt9fQp3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncz10O3ZhciBIYT10LnNoYWR5ZG9tO0hhJiYod2luZG93LlNoYWR5RE9NPXdpbmRvdy5TaGFkeURPTXx8e30sd2luZG93LlNoYWR5RE9NLmZvcmNlPUhhKTt2YXIgSWE9dC5yZWdpc3Rlcnx8dC5jZTtJYSYmd2luZG93LmN1c3RvbUVsZW1lbnRzJiYod2luZG93LmN1c3RvbUVsZW1lbnRzLmZvcmNlUG9seWZpbGw9SWEpOy8qCgpDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dApDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwpzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwpmdW5jdGlvbiBKYSgpe3RoaXMucGE9dGhpcy5yb290PW51bGw7dGhpcy5UPSExO3RoaXMuRD10aGlzLlA9dGhpcy5jYT10aGlzLmFzc2lnbmVkU2xvdD10aGlzLmFzc2lnbmVkTm9kZXM9dGhpcy5IPW51bGw7dGhpcy5jaGlsZE5vZGVzPXRoaXMubmV4dFNpYmxpbmc9dGhpcy5wcmV2aW91c1NpYmxpbmc9dGhpcy5sYXN0Q2hpbGQ9dGhpcy5maXJzdENoaWxkPXRoaXMucGFyZW50Tm9kZT10aGlzLks9dm9pZCAwO3RoaXMua2E9dGhpcy5sYT0hMTt0aGlzLk89e319SmEucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt9fTtmdW5jdGlvbiB1KGEpe2EuX19zaGFkeXx8KGEuX19zaGFkeT1uZXcgSmEpO3JldHVybiBhLl9fc2hhZHl9ZnVuY3Rpb24gdihhKXtyZXR1cm4gYSYmYS5fX3NoYWR5fTt2YXIgdz13aW5kb3cuU2hhZHlET018fHt9O3cuR2E9ISghRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93fHwhTm9kZS5wcm90b3R5cGUuZ2V0Um9vdE5vZGUpO3ZhciBLYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJmaXJzdENoaWxkIik7dy5tPSEhKEthJiZLYS5jb25maWd1cmFibGUmJkthLmdldCk7dy5lYT13LmZvcmNlfHwhdy5HYTt3Lko9dy5ub1BhdGNofHwhMTt3Lm9hPXcucHJlZmVyUGVyZm9ybWFuY2U7ZnVuY3Rpb24geShhKXtyZXR1cm4oYT12KGEpKSYmdm9pZCAwIT09YS5maXJzdENoaWxkfWZ1bmN0aW9uIHooYSl7cmV0dXJuIlNoYWR5Um9vdCI9PT1hLnphfWZ1bmN0aW9uIExhKGEpe3JldHVybihhPShhPXYoYSkpJiZhLnJvb3QpJiZNYShhKX0KdmFyIE5hPUVsZW1lbnQucHJvdG90eXBlLE9hPU5hLm1hdGNoZXN8fE5hLm1hdGNoZXNTZWxlY3Rvcnx8TmEubW96TWF0Y2hlc1NlbGVjdG9yfHxOYS5tc01hdGNoZXNTZWxlY3Rvcnx8TmEub01hdGNoZXNTZWxlY3Rvcnx8TmEud2Via2l0TWF0Y2hlc1NlbGVjdG9yLFBhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxRYT0wLFJhPVtdOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe2Zvcig7UmEubGVuZ3RoOyl0cnl7UmEuc2hpZnQoKSgpfWNhdGNoKGEpe3Rocm93IFBhLnRleHRDb250ZW50PVFhKyssYTt9fSkpLm9ic2VydmUoUGEse2NoYXJhY3RlckRhdGE6ITB9KTtmdW5jdGlvbiBTYShhKXtSYS5wdXNoKGEpO1BhLnRleHRDb250ZW50PVFhKyt9dmFyIFRhPSEhZG9jdW1lbnQuY29udGFpbnM7ZnVuY3Rpb24gVWEoYSxiKXtmb3IoO2I7KXtpZihiPT1hKXJldHVybiEwO2I9Yi5fX3NoYWR5X3BhcmVudE5vZGV9cmV0dXJuITF9CmZ1bmN0aW9uIFZhKGEpe2Zvcih2YXIgYj1hLmxlbmd0aC0xOzA8PWI7Yi0tKXt2YXIgYz1hW2JdLGQ9Yy5nZXRBdHRyaWJ1dGUoImlkIil8fGMuZ2V0QXR0cmlidXRlKCJuYW1lIik7ZCYmImxlbmd0aCIhPT1kJiZpc05hTihkKSYmKGFbZF09Yyl9YS5pdGVtPWZ1bmN0aW9uKGIpe3JldHVybiBhW2JdfTthLm5hbWVkSXRlbT1mdW5jdGlvbihiKXtpZigibGVuZ3RoIiE9PWImJmlzTmFOKGIpJiZhW2JdKXJldHVybiBhW2JdO2Zvcih2YXIgYz1pYShhKSxkPWMubmV4dCgpOyFkLmRvbmU7ZD1jLm5leHQoKSlpZihkPWQudmFsdWUsKGQuZ2V0QXR0cmlidXRlKCJpZCIpfHxkLmdldEF0dHJpYnV0ZSgibmFtZSIpKT09YilyZXR1cm4gZDtyZXR1cm4gbnVsbH07cmV0dXJuIGF9CmZ1bmN0aW9uIEEoYSxiLGMsZCl7Yz12b2lkIDA9PT1jPyIiOmM7Zm9yKHZhciBlIGluIGIpe3ZhciBmPWJbZV07aWYoIShkJiYwPD1kLmluZGV4T2YoZSkpKXtmLmNvbmZpZ3VyYWJsZT0hMDt2YXIgZz1jK2U7aWYoZi52YWx1ZSlhW2ddPWYudmFsdWU7ZWxzZSB0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZyxmKX1jYXRjaChoKXt9fX19ZnVuY3Rpb24gQihhKXt2YXIgYj17fTtPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2JbY109T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLGMpfSk7cmV0dXJuIGJ9O3ZhciBXYT1bXSxYYTtmdW5jdGlvbiBZYShhKXtYYXx8KFhhPSEwLFNhKFphKSk7V2EucHVzaChhKX1mdW5jdGlvbiBaYSgpe1hhPSExO2Zvcih2YXIgYT0hIVdhLmxlbmd0aDtXYS5sZW5ndGg7KVdhLnNoaWZ0KCkoKTtyZXR1cm4gYX1aYS5saXN0PVdhO2Z1bmN0aW9uICRhKCl7dGhpcy5hPSExO3RoaXMuYWRkZWROb2Rlcz1bXTt0aGlzLnJlbW92ZWROb2Rlcz1bXTt0aGlzLlM9bmV3IFNldH1mdW5jdGlvbiBhYihhKXthLmF8fChhLmE9ITAsU2EoZnVuY3Rpb24oKXthLmZsdXNoKCl9KSl9JGEucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5hKXt0aGlzLmE9ITE7dmFyIGE9dGhpcy50YWtlUmVjb3JkcygpO2EubGVuZ3RoJiZ0aGlzLlMuZm9yRWFjaChmdW5jdGlvbihiKXtiKGEpfSl9fTskYS5wcm90b3R5cGUudGFrZVJlY29yZHM9ZnVuY3Rpb24oKXtpZih0aGlzLmFkZGVkTm9kZXMubGVuZ3RofHx0aGlzLnJlbW92ZWROb2Rlcy5sZW5ndGgpe3ZhciBhPVt7YWRkZWROb2Rlczp0aGlzLmFkZGVkTm9kZXMscmVtb3ZlZE5vZGVzOnRoaXMucmVtb3ZlZE5vZGVzfV07dGhpcy5hZGRlZE5vZGVzPVtdO3RoaXMucmVtb3ZlZE5vZGVzPVtdO3JldHVybiBhfXJldHVybltdfTsKZnVuY3Rpb24gYmIoYSxiKXt2YXIgYz11KGEpO2MuSHx8KGMuSD1uZXcgJGEpO2MuSC5TLmFkZChiKTt2YXIgZD1jLkg7cmV0dXJue3lhOmIsRjpkLEFhOmEsdGFrZVJlY29yZHM6ZnVuY3Rpb24oKXtyZXR1cm4gZC50YWtlUmVjb3JkcygpfX19ZnVuY3Rpb24gY2IoYSl7dmFyIGI9YSYmYS5GO2ImJihiLlMuZGVsZXRlKGEueWEpLGIuUy5zaXplfHwodShhLkFhKS5IPW51bGwpKX0KZnVuY3Rpb24gZGIoYSxiKXt2YXIgYz1iLmdldFJvb3ROb2RlKCk7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPWM9PT1hLnRhcmdldC5nZXRSb290Tm9kZSgpO2lmKGImJmEuYWRkZWROb2Rlcyl7aWYoYj1BcnJheS5mcm9tKGEuYWRkZWROb2RlcykuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBjPT09YS5nZXRSb290Tm9kZSgpfSksYi5sZW5ndGgpcmV0dXJuIGE9T2JqZWN0LmNyZWF0ZShhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiYWRkZWROb2RlcyIse3ZhbHVlOmIsY29uZmlndXJhYmxlOiEwfSksYX1lbHNlIGlmKGIpcmV0dXJuIGF9KS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KX07dmFyIGViPS9bJlx1MDBBMCJdL2csZmI9L1smXHUwMEEwPD5dL2c7ZnVuY3Rpb24gZ2IoYSl7c3dpdGNoKGEpe2Nhc2UgIiYiOnJldHVybiImYW1wOyI7Y2FzZSAiPCI6cmV0dXJuIiZsdDsiO2Nhc2UgIj4iOnJldHVybiImZ3Q7IjtjYXNlICciJzpyZXR1cm4iJnF1b3Q7IjtjYXNlICJcdTAwYTAiOnJldHVybiImbmJzcDsifX1mdW5jdGlvbiBoYihhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIGliPWhiKCJhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdiciIuc3BsaXQoIiAiKSksamI9aGIoInN0eWxlIHNjcmlwdCB4bXAgaWZyYW1lIG5vZW1iZWQgbm9mcmFtZXMgcGxhaW50ZXh0IG5vc2NyaXB0Ii5zcGxpdCgiICIpKTsKZnVuY3Rpb24ga2IoYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOmEuY2hpbGROb2RlcyxlPTAsZj1kLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hLGw9Yjtzd2l0Y2goaC5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTprPWgubG9jYWxOYW1lO2Zvcih2YXIgbT0iPCIrayxxPWguYXR0cmlidXRlcyx4PTAsTTtNPXFbeF07eCsrKW0rPSIgIitNLm5hbWUrJz0iJytNLnZhbHVlLnJlcGxhY2UoZWIsZ2IpKyciJzttKz0iPiI7aD1pYltrXT9tOm0ra2IoaCxsKSsiPC8iK2srIj4iO2JyZWFrIGE7Y2FzZSBOb2RlLlRFWFRfTk9ERTpoPWguZGF0YTtoPWsmJmpiW2subG9jYWxOYW1lXT9oOmgucmVwbGFjZShmYixnYik7YnJlYWsgYTtjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksCkVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTt9fWMrPWh9cmV0dXJuIGN9O3ZhciBwYj13Lm0scWI9e3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvcihhKX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9xdWVyeVNlbGVjdG9yQWxsKGEpfX0scmI9e307ZnVuY3Rpb24gc2IoYSl7cmJbYV09ZnVuY3Rpb24oYil7cmV0dXJuIGJbIl9fc2hhZHlfbmF0aXZlXyIrYV19fWZ1bmN0aW9uIHRiKGEsYil7QShhLGIsIl9fc2hhZHlfbmF0aXZlXyIpO2Zvcih2YXIgYyBpbiBiKXNiKGMpfWZ1bmN0aW9uIEQoYSxiKXtiPXZvaWQgMD09PWI/W106Yjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXSxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSxkKTtlJiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fc2hhZHlfbmF0aXZlXyIrZCxlKSxlLnZhbHVlP3FiW2RdfHwocWJbZF09ZS52YWx1ZSk6c2IoZCkpfX0KdmFyIEU9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfQUxMLG51bGwsITEpLEY9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxudWxsLCExKSx1Yj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0Iik7ZnVuY3Rpb24gdmIoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkOylhLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGIpfXZhciB3Yj1bImZpcnN0RWxlbWVudENoaWxkIiwibGFzdEVsZW1lbnRDaGlsZCIsImNoaWxkcmVuIiwiY2hpbGRFbGVtZW50Q291bnQiXSx4Yj1bInF1ZXJ5U2VsZWN0b3IiLCJxdWVyeVNlbGVjdG9yQWxsIl07CmZ1bmN0aW9uIHliKCl7dmFyIGE9WyJkaXNwYXRjaEV2ZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiXTt3aW5kb3cuRXZlbnRUYXJnZXQ/RCh3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlLGEpOihEKE5vZGUucHJvdG90eXBlLGEpLEQoV2luZG93LnByb3RvdHlwZSxhKSk7cGI/RChOb2RlLnByb3RvdHlwZSwicGFyZW50Tm9kZSBmaXJzdENoaWxkIGxhc3RDaGlsZCBwcmV2aW91c1NpYmxpbmcgbmV4dFNpYmxpbmcgY2hpbGROb2RlcyBwYXJlbnRFbGVtZW50IHRleHRDb250ZW50Ii5zcGxpdCgiICIpKTp0YihOb2RlLnByb3RvdHlwZSx7cGFyZW50Tm9kZTp7Z2V0OmZ1bmN0aW9uKCl7RS5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBFLnBhcmVudE5vZGUoKX19LGZpcnN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5maXJzdENoaWxkKCl9fSxsYXN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9CnRoaXM7cmV0dXJuIEUubGFzdENoaWxkKCl9fSxwcmV2aW91c1NpYmxpbmc6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5wcmV2aW91c1NpYmxpbmcoKX19LG5leHRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtFLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEUubmV4dFNpYmxpbmcoKX19LGNoaWxkTm9kZXM6e2dldDpmdW5jdGlvbigpe3ZhciBhPVtdO0UuY3VycmVudE5vZGU9dGhpcztmb3IodmFyIGM9RS5maXJzdENoaWxkKCk7YzspYS5wdXNoKGMpLGM9RS5uZXh0U2libGluZygpO3JldHVybiBhfX0scGFyZW50RWxlbWVudDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnBhcmVudE5vZGUoKX19LHRleHRDb250ZW50OntnZXQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpmb3IodmFyIGE9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLApOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLCExKSxjPSIiLGQ7ZD1hLm5leHROb2RlKCk7KWMrPWQubm9kZVZhbHVlO3JldHVybiBjO2RlZmF1bHQ6cmV0dXJuIHRoaXMubm9kZVZhbHVlfX0sc2V0OmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGF8fG51bGw9PT1hKWE9IiI7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6dmIodGhpcyk7KDA8YS5sZW5ndGh8fHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJnRoaXMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX19fSk7RChOb2RlLnByb3RvdHlwZSwiYXBwZW5kQ2hpbGQgaW5zZXJ0QmVmb3JlIHJlbW92ZUNoaWxkIHJlcGxhY2VDaGlsZCBjbG9uZU5vZGUgY29udGFpbnMiLnNwbGl0KCIgIikpOwphPXtmaXJzdEVsZW1lbnRDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLmZpcnN0Q2hpbGQoKX19LGxhc3RFbGVtZW50Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0YuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRi5sYXN0Q2hpbGQoKX19LGNoaWxkcmVuOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtGLmN1cnJlbnROb2RlPXRoaXM7Zm9yKHZhciBjPUYuZmlyc3RDaGlsZCgpO2M7KWEucHVzaChjKSxjPUYubmV4dFNpYmxpbmcoKTtyZXR1cm4gVmEoYSl9fSxjaGlsZEVsZW1lbnRDb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4/dGhpcy5jaGlsZHJlbi5sZW5ndGg6MH19fTtwYj8oRChFbGVtZW50LnByb3RvdHlwZSx3YiksRChFbGVtZW50LnByb3RvdHlwZSxbInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLCJpbm5lckhUTUwiXSksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsCiJjaGlsZHJlbiIpJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImNoaWxkcmVuIl0pLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSYmRChIVE1MRWxlbWVudC5wcm90b3R5cGUsWyJpbm5lckhUTUwiXSkpOih0YihFbGVtZW50LnByb3RvdHlwZSxhKSx0YihFbGVtZW50LnByb3RvdHlwZSx7cHJldmlvdXNFbGVtZW50U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnByZXZpb3VzU2libGluZygpfX0sbmV4dEVsZW1lbnRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtGLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEYubmV4dFNpYmxpbmcoKX19LGlubmVySFRNTDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGtiKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuX19zaGFkeV9uYXRpdmVfY2hpbGROb2Rlc30pfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lPwp0aGlzLmNvbnRlbnQ6dGhpczt2YihiKTt2YXIgZD10aGlzLmxvY2FsTmFtZXx8ImRpdiI7ZD10aGlzLm5hbWVzcGFjZVVSSSYmdGhpcy5uYW1lc3BhY2VVUkkhPT11Yi5uYW1lc3BhY2VVUkk/dWIuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLGQpOnViLmNyZWF0ZUVsZW1lbnQoZCk7ZC5pbm5lckhUTUw9YTtmb3IoYT0idGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWU/ZC5jb250ZW50OmQ7ZD1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGQsdm9pZCAwKX19fSkpO0QoRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUgaGFzQXR0cmlidXRlIHJlbW92ZUF0dHJpYnV0ZSBmb2N1cyBibHVyIi5zcGxpdCgiICIpKTtEKEVsZW1lbnQucHJvdG90eXBlLHhiKTtEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImZvY3VzIiwiYmx1ciIsImNvbnRhaW5zIl0pO3BiJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKWyJwYXJlbnRFbGVtZW50IiwiY2hpbGRyZW4iLCJpbm5lckhUTUwiXSk7d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQmJkQod2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQucHJvdG90eXBlLFsiaW5uZXJIVE1MIl0pO3BiP0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUsd2IpOnRiKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLGEpO0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUseGIpO3BiPyhEKERvY3VtZW50LnByb3RvdHlwZSx3YiksRChEb2N1bWVudC5wcm90b3R5cGUsWyJhY3RpdmVFbGVtZW50Il0pKTp0YihEb2N1bWVudC5wcm90b3R5cGUsYSk7RChEb2N1bWVudC5wcm90b3R5cGUsWyJpbXBvcnROb2RlIiwiZ2V0RWxlbWVudEJ5SWQiXSk7RChEb2N1bWVudC5wcm90b3R5cGUseGIpfTt2YXIgemI9Qih7Z2V0IGNoaWxkTm9kZXMoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NoaWxkTm9kZXN9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdENoaWxkfSxnZXQgbGFzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9sYXN0Q2hpbGR9LGdldCB0ZXh0Q29udGVudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXt0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnQ9YX0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZEVsZW1lbnRDb3VudH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZHJlbn0sZ2V0IGZpcnN0RWxlbWVudENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdEVsZW1lbnRDaGlsZH0sZ2V0IGxhc3RFbGVtZW50Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2xhc3RFbGVtZW50Q2hpbGR9LGdldCBpbm5lckhUTUwoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2lubmVySFRNTH0sCnNldCBpbm5lckhUTUwoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9pbm5lckhUTUw9YX0sZ2V0IHNoYWRvd1Jvb3QoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3NoYWRvd1Jvb3R9fSksQWI9Qih7Z2V0IHBhcmVudEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3BhcmVudEVsZW1lbnR9LGdldCBwYXJlbnROb2RlKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wYXJlbnROb2RlfSxnZXQgbmV4dFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRTaWJsaW5nfSxnZXQgcHJldmlvdXNTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9LGdldCBuZXh0RWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ30sZ2V0IHByZXZpb3VzRWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3ByZXZpb3VzRWxlbWVudFNpYmxpbmd9LGdldCBjbGFzc05hbWUoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NsYXNzTmFtZX0sCnNldCBjbGFzc05hbWUoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9jbGFzc05hbWU9YX19KSxCYjtmb3IoQmIgaW4gemIpemJbQmJdLmVudW1lcmFibGU9ITE7Zm9yKHZhciBDYiBpbiBBYilBYltDYl0uZW51bWVyYWJsZT0hMTt2YXIgRGI9dy5tfHx3LkosRWI9RGI/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKGEpe3ZhciBiPXUoYSk7Yi5sYXx8KGIubGE9ITAsQShhLEFiKSl9LEZiPURiP2Z1bmN0aW9uKCl7fTpmdW5jdGlvbihhKXt2YXIgYj11KGEpO2Iua2F8fChiLmthPSEwLEEoYSx6YikpfTt2YXIgR2I9Il9fZXZlbnRXcmFwcGVycyIrRGF0ZS5ub3coKSxIYj1mdW5jdGlvbigpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXZlbnQucHJvdG90eXBlLCJjb21wb3NlZCIpO3JldHVybiBhP2Z1bmN0aW9uKGIpe3JldHVybiBhLmdldC5jYWxsKGIpfTpudWxsfSgpLEliPXtibHVyOiEwLGZvY3VzOiEwLGZvY3VzaW46ITAsZm9jdXNvdXQ6ITAsY2xpY2s6ITAsZGJsY2xpY2s6ITAsbW91c2Vkb3duOiEwLG1vdXNlZW50ZXI6ITAsbW91c2VsZWF2ZTohMCxtb3VzZW1vdmU6ITAsbW91c2VvdXQ6ITAsbW91c2VvdmVyOiEwLG1vdXNldXA6ITAsd2hlZWw6ITAsYmVmb3JlaW5wdXQ6ITAsaW5wdXQ6ITAsa2V5ZG93bjohMCxrZXl1cDohMCxjb21wb3NpdGlvbnN0YXJ0OiEwLGNvbXBvc2l0aW9udXBkYXRlOiEwLGNvbXBvc2l0aW9uZW5kOiEwLHRvdWNoc3RhcnQ6ITAsdG91Y2hlbmQ6ITAsdG91Y2htb3ZlOiEwLHRvdWNoY2FuY2VsOiEwLHBvaW50ZXJvdmVyOiEwLApwb2ludGVyZW50ZXI6ITAscG9pbnRlcmRvd246ITAscG9pbnRlcm1vdmU6ITAscG9pbnRlcnVwOiEwLHBvaW50ZXJjYW5jZWw6ITAscG9pbnRlcm91dDohMCxwb2ludGVybGVhdmU6ITAsZ290cG9pbnRlcmNhcHR1cmU6ITAsbG9zdHBvaW50ZXJjYXB0dXJlOiEwLGRyYWdzdGFydDohMCxkcmFnOiEwLGRyYWdlbnRlcjohMCxkcmFnbGVhdmU6ITAsZHJhZ292ZXI6ITAsZHJvcDohMCxkcmFnZW5kOiEwLERPTUFjdGl2YXRlOiEwLERPTUZvY3VzSW46ITAsRE9NRm9jdXNPdXQ6ITAsa2V5cHJlc3M6ITB9LEpiPXtET01BdHRyTW9kaWZpZWQ6ITAsRE9NQXR0cmlidXRlTmFtZUNoYW5nZWQ6ITAsRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkOiEwLERPTUVsZW1lbnROYW1lQ2hhbmdlZDohMCxET01Ob2RlSW5zZXJ0ZWQ6ITAsRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50OiEwLERPTU5vZGVSZW1vdmVkOiEwLERPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50OiEwLERPTVN1YnRyZWVNb2RpZmllZDohMH07CmZ1bmN0aW9uIEtiKGEpe3JldHVybiBhIGluc3RhbmNlb2YgTm9kZT9hLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTphfWZ1bmN0aW9uIExiKGEsYil7dmFyIGM9W10sZD1hO2ZvcihhPUtiKGEpO2Q7KWMucHVzaChkKSxkLl9fc2hhZHlfYXNzaWduZWRTbG90P2Q9ZC5fX3NoYWR5X2Fzc2lnbmVkU2xvdDpkLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZkLmhvc3QmJihifHxkIT09YSk/ZD1kLmhvc3Q6ZD1kLl9fc2hhZHlfcGFyZW50Tm9kZTtjW2MubGVuZ3RoLTFdPT09ZG9jdW1lbnQmJmMucHVzaCh3aW5kb3cpO3JldHVybiBjfWZ1bmN0aW9uIE1iKGEpe2EuX19jb21wb3NlZFBhdGh8fChhLl9fY29tcG9zZWRQYXRoPUxiKGEudGFyZ2V0LCEwKSk7cmV0dXJuIGEuX19jb21wb3NlZFBhdGh9CmZ1bmN0aW9uIE5iKGEsYil7aWYoIXopcmV0dXJuIGE7YT1MYihhLCEwKTtmb3IodmFyIGM9MCxkLGU9dm9pZCAwLGYsZz12b2lkIDA7YzxiLmxlbmd0aDtjKyspaWYoZD1iW2NdLGY9S2IoZCksZiE9PWUmJihnPWEuaW5kZXhPZihmKSxlPWYpLCF6KGYpfHwtMTxnKXJldHVybiBkfWZ1bmN0aW9uIE9iKGEpe2Z1bmN0aW9uIGIoYixkKXtiPW5ldyBhKGIsZCk7Yi5fX2NvbXBvc2VkPWQmJiEhZC5jb21wb3NlZDtyZXR1cm4gYn1iLl9fcHJvdG9fXz1hO2IucHJvdG90eXBlPWEucHJvdG90eXBlO3JldHVybiBifXZhciBQYj17Zm9jdXM6ITAsYmx1cjohMH07ZnVuY3Rpb24gUWIoYSl7cmV0dXJuIGEuX190YXJnZXQhPT1hLnRhcmdldHx8YS5fX3JlbGF0ZWRUYXJnZXQhPT1hLnJlbGF0ZWRUYXJnZXR9CmZ1bmN0aW9uIFJiKGEsYixjKXtpZihjPWIuX19oYW5kbGVycyYmYi5fX2hhbmRsZXJzW2EudHlwZV0mJmIuX19oYW5kbGVyc1thLnR5cGVdW2NdKWZvcih2YXIgZD0wLGU7KGU9Y1tkXSkmJighUWIoYSl8fGEudGFyZ2V0IT09YS5yZWxhdGVkVGFyZ2V0KSYmKGUuY2FsbChiLGEpLCFhLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKTtkKyspO30KZnVuY3Rpb24gU2IoYSl7dmFyIGI9YS5jb21wb3NlZFBhdGgoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiY3VycmVudFRhcmdldCIse2dldDpmdW5jdGlvbigpe3JldHVybiBkfSxjb25maWd1cmFibGU6ITB9KTtmb3IodmFyIGM9Yi5sZW5ndGgtMTswPD1jO2MtLSl7dmFyIGQ9YltjXTtSYihhLGQsImNhcHR1cmUiKTtpZihhLlopcmV0dXJufU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJldmVudFBoYXNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEV2ZW50LkFUX1RBUkdFVH19KTt2YXIgZTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXtkPWJbY107dmFyIGY9dihkKTtmPWYmJmYucm9vdDtpZigwPT09Y3x8ZiYmZj09PWUpaWYoUmIoYSxkLCJidWJibGUiKSxkIT09d2luZG93JiYoZT1kLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKSksYS5aKWJyZWFrfX0KZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgaD1hW2ddLGs9aC50eXBlLGw9aC5jYXB0dXJlLG09aC5vbmNlLHE9aC5wYXNzaXZlO2lmKGI9PT1oLm5vZGUmJmM9PT1rJiZkPT09bCYmZT09PW0mJmY9PT1xKXJldHVybiBnfXJldHVybi0xfQpmdW5jdGlvbiBVYihhLGIsYyl7aWYoYil7dmFyIGQ9dHlwZW9mIGI7aWYoImZ1bmN0aW9uIj09PWR8fCJvYmplY3QiPT09ZClpZigib2JqZWN0IiE9PWR8fGIuaGFuZGxlRXZlbnQmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5oYW5kbGVFdmVudCl7aWYoSmJbYV0pcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyk7aWYoYyYmIm9iamVjdCI9PT10eXBlb2YgYyl7dmFyIGU9ISFjLmNhcHR1cmU7dmFyIGY9ISFjLm9uY2U7dmFyIGc9ISFjLnBhc3NpdmV9ZWxzZSBlPSEhYyxnPWY9ITE7dmFyIGg9YyYmYy4kfHx0aGlzLGs9YltHYl07aWYoayl7aWYoLTE8VGIoayxoLGEsZSxmLGcpKXJldHVybn1lbHNlIGJbR2JdPVtdO2s9ZnVuY3Rpb24oZSl7ZiYmdGhpcy5fX3NoYWR5X3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2UuX190YXJnZXR8fFZiKGUpO2lmKGghPT10aGlzKXt2YXIgZz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsImN1cnJlbnRUYXJnZXQiKTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImN1cnJlbnRUYXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaH0sY29uZmlndXJhYmxlOiEwfSl9ZS5fX3ByZXZpb3VzQ3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQ7aWYoIXooaCl8fC0xIT1lLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YoaCkpaWYoZS5jb21wb3NlZHx8LTE8ZS5jb21wb3NlZFBhdGgoKS5pbmRleE9mKGgpKWlmKFFiKGUpJiZlLnRhcmdldD09PWUucmVsYXRlZFRhcmdldCllLmV2ZW50UGhhc2U9PT1FdmVudC5CVUJCTElOR19QSEFTRSYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtlbHNlIGlmKGUuZXZlbnRQaGFzZT09PUV2ZW50LkNBUFRVUklOR19QSEFTRXx8ZS5idWJibGVzfHxlLnRhcmdldD09PWh8fGggaW5zdGFuY2VvZiBXaW5kb3cpe3ZhciBrPSJmdW5jdGlvbiI9PT1kP2IuY2FsbChoLGUpOmIuaGFuZGxlRXZlbnQmJmIuaGFuZGxlRXZlbnQoZSk7aCE9PXRoaXMmJihnPyhPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwKImN1cnJlbnRUYXJnZXQiLGcpLGc9bnVsbCk6ZGVsZXRlIGUuY3VycmVudFRhcmdldCk7cmV0dXJuIGt9fTtiW0diXS5wdXNoKHtub2RlOmgsdHlwZTphLGNhcHR1cmU6ZSxvbmNlOmYscGFzc2l2ZTpnLFlhOmt9KTtQYlthXT8odGhpcy5fX2hhbmRsZXJzPXRoaXMuX19oYW5kbGVyc3x8e30sdGhpcy5fX2hhbmRsZXJzW2FdPXRoaXMuX19oYW5kbGVyc1thXXx8e2NhcHR1cmU6W10sYnViYmxlOltdfSx0aGlzLl9faGFuZGxlcnNbYV1bZT8iY2FwdHVyZSI6ImJ1YmJsZSJdLnB1c2goaykpOnRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGssYyl9fX0KZnVuY3Rpb24gV2IoYSxiLGMpe2lmKGIpe2lmKEpiW2FdKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2lmKGMmJiJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBkPSEhYy5jYXB0dXJlO3ZhciBlPSEhYy5vbmNlO3ZhciBmPSEhYy5wYXNzaXZlfWVsc2UgZD0hIWMsZj1lPSExO3ZhciBnPWMmJmMuJHx8dGhpcyxoPXZvaWQgMDt2YXIgaz1udWxsO3RyeXtrPWJbR2JdfWNhdGNoKGwpe31rJiYoZT1UYihrLGcsYSxkLGUsZiksLTE8ZSYmKGg9ay5zcGxpY2UoZSwxKVswXS5ZYSxrLmxlbmd0aHx8KGJbR2JdPXZvaWQgMCkpKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxofHxiLGMpO2gmJlBiW2FdJiZ0aGlzLl9faGFuZGxlcnMmJnRoaXMuX19oYW5kbGVyc1thXSYmKGE9dGhpcy5fX2hhbmRsZXJzW2FdW2Q/ImNhcHR1cmUiOiJidWJibGUiXSxoPWEuaW5kZXhPZihoKSwtMTxoJiZhLnNwbGljZShoLDEpKX19CmZ1bmN0aW9uIFhiKCl7Zm9yKHZhciBhIGluIFBiKXdpbmRvdy5fX3NoYWR5X25hdGl2ZV9hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7YS5fX3RhcmdldHx8KFZiKGEpLFNiKGEpKX0sITApfQp2YXIgWWI9Qih7Z2V0IGNvbXBvc2VkKCl7dm9pZCAwPT09dGhpcy5fX2NvbXBvc2VkJiYoSGI/dGhpcy5fX2NvbXBvc2VkPSJmb2N1c2luIj09PXRoaXMudHlwZXx8ImZvY3Vzb3V0Ij09PXRoaXMudHlwZXx8SGIodGhpcyk6ITEhPT10aGlzLmlzVHJ1c3RlZCYmKHRoaXMuX19jb21wb3NlZD1JYlt0aGlzLnR5cGVdKSk7cmV0dXJuIHRoaXMuX19jb21wb3NlZHx8ITF9LGNvbXBvc2VkUGF0aDpmdW5jdGlvbigpe3RoaXMuX19jb21wb3NlZFBhdGh8fCh0aGlzLl9fY29tcG9zZWRQYXRoPUxiKHRoaXMuX190YXJnZXQsdGhpcy5jb21wb3NlZCkpO3JldHVybiB0aGlzLl9fY29tcG9zZWRQYXRofSxnZXQgdGFyZ2V0KCl7cmV0dXJuIE5iKHRoaXMuY3VycmVudFRhcmdldHx8dGhpcy5fX3ByZXZpb3VzQ3VycmVudFRhcmdldCx0aGlzLmNvbXBvc2VkUGF0aCgpKX0sZ2V0IHJlbGF0ZWRUYXJnZXQoKXtpZighdGhpcy5fX3JlbGF0ZWRUYXJnZXQpcmV0dXJuIG51bGw7dGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGh8fAoodGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGg9TGIodGhpcy5fX3JlbGF0ZWRUYXJnZXQsITApKTtyZXR1cm4gTmIodGhpcy5jdXJyZW50VGFyZ2V0fHx0aGlzLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0LHRoaXMuX19yZWxhdGVkVGFyZ2V0Q29tcG9zZWRQYXRoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj0hMH0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj10aGlzLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPSEwfX0pOwpmdW5jdGlvbiBWYihhKXthLl9fdGFyZ2V0PWEudGFyZ2V0O2EuX19yZWxhdGVkVGFyZ2V0PWEucmVsYXRlZFRhcmdldDtpZih3Lm0pe3ZhciBiPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtpZighT2JqZWN0Lmhhc093blByb3BlcnR5KGIsIl9fc2hhZHlfcGF0Y2hlZFByb3RvIikpe3ZhciBjPU9iamVjdC5jcmVhdGUoYik7Yy5fX3NoYWR5X3NvdXJjZVByb3RvPWI7QShjLFliKTtiLl9fc2hhZHlfcGF0Y2hlZFByb3RvPWN9YS5fX3Byb3RvX189Yi5fX3NoYWR5X3BhdGNoZWRQcm90b31lbHNlIEEoYSxZYil9dmFyIFpiPU9iKEV2ZW50KSwkYj1PYihDdXN0b21FdmVudCksYWM9T2IoTW91c2VFdmVudCk7CmZ1bmN0aW9uIGJjKCl7aWYoIUhiJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV2ZW50LnByb3RvdHlwZSwiaXNUcnVzdGVkIikpe3ZhciBhPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IE1vdXNlRXZlbnQoImNsaWNrIix7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNvbXBvc2VkOiEwfSk7dGhpcy5fX3NoYWR5X2Rpc3BhdGNoRXZlbnQoYSl9O0VsZW1lbnQucHJvdG90eXBlLmNsaWNrP0VsZW1lbnQucHJvdG90eXBlLmNsaWNrPWE6SFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrJiYoSFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrPWEpfX12YXIgY2M9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRG9jdW1lbnQucHJvdG90eXBlKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIm9uIj09PWEuc3Vic3RyaW5nKDAsMil9KTtmdW5jdGlvbiBkYyhhLGIpe3JldHVybntpbmRleDphLEw6W10sUjpifX0KZnVuY3Rpb24gZWMoYSxiLGMsZCl7dmFyIGU9MCxmPTAsZz0wLGg9MCxrPU1hdGgubWluKGItZSxkLWYpO2lmKDA9PWUmJjA9PWYpYTp7Zm9yKGc9MDtnPGs7ZysrKWlmKGFbZ10hPT1jW2ddKWJyZWFrIGE7Zz1rfWlmKGI9PWEubGVuZ3RoJiZkPT1jLmxlbmd0aCl7aD1hLmxlbmd0aDtmb3IodmFyIGw9Yy5sZW5ndGgsbT0wO208ay1nJiZmYyhhWy0taF0sY1stLWxdKTspbSsrO2g9bX1lKz1nO2YrPWc7Yi09aDtkLT1oO2lmKDA9PWItZSYmMD09ZC1mKXJldHVybltdO2lmKGU9PWIpe2ZvcihiPWRjKGUsMCk7ZjxkOyliLkwucHVzaChjW2YrK10pO3JldHVybltiXX1pZihmPT1kKXJldHVybltkYyhlLGItZSldO2s9ZTtnPWY7ZD1kLWcrMTtoPWItaysxO2I9QXJyYXkoZCk7Zm9yKGw9MDtsPGQ7bCsrKWJbbF09QXJyYXkoaCksYltsXVswXT1sO2ZvcihsPTA7bDxoO2wrKyliWzBdW2xdPWw7Zm9yKGw9MTtsPGQ7bCsrKWZvcihtPTE7bTxoO20rKylpZihhW2srbS0xXT09PWNbZytsLTFdKWJbbF1bbV09CmJbbC0xXVttLTFdO2Vsc2V7dmFyIHE9YltsLTFdW21dKzEseD1iW2xdW20tMV0rMTtiW2xdW21dPXE8eD9xOnh9az1iLmxlbmd0aC0xO2c9YlswXS5sZW5ndGgtMTtkPWJba11bZ107Zm9yKGE9W107MDxrfHwwPGc7KTA9PWs/KGEucHVzaCgyKSxnLS0pOjA9PWc/KGEucHVzaCgzKSxrLS0pOihoPWJbay0xXVtnLTFdLGw9YltrLTFdW2ddLG09YltrXVtnLTFdLHE9bDxtP2w8aD9sOmg6bTxoP206aCxxPT1oPyhoPT1kP2EucHVzaCgwKTooYS5wdXNoKDEpLGQ9aCksay0tLGctLSk6cT09bD8oYS5wdXNoKDMpLGstLSxkPWwpOihhLnB1c2goMiksZy0tLGQ9bSkpO2EucmV2ZXJzZSgpO2I9dm9pZCAwO2s9W107Zm9yKGc9MDtnPGEubGVuZ3RoO2crKylzd2l0Y2goYVtnXSl7Y2FzZSAwOmImJihrLnB1c2goYiksYj12b2lkIDApO2UrKztmKys7YnJlYWs7Y2FzZSAxOmJ8fChiPWRjKGUsMCkpO2IuUisrO2UrKztiLkwucHVzaChjW2ZdKTtmKys7YnJlYWs7Y2FzZSAyOmJ8fChiPWRjKGUsMCkpOwpiLlIrKztlKys7YnJlYWs7Y2FzZSAzOmJ8fChiPWRjKGUsMCkpLGIuTC5wdXNoKGNbZl0pLGYrK31iJiZrLnB1c2goYik7cmV0dXJuIGt9ZnVuY3Rpb24gZmMoYSxiKXtyZXR1cm4gYT09PWJ9O2Z1bmN0aW9uIGdjKGEsYixjKXtFYihhKTtjPWN8fG51bGw7dmFyIGQ9dShhKSxlPXUoYiksZj1jP3UoYyk6bnVsbDtkLnByZXZpb3VzU2libGluZz1jP2YucHJldmlvdXNTaWJsaW5nOmIuX19zaGFkeV9sYXN0Q2hpbGQ7aWYoZj12KGQucHJldmlvdXNTaWJsaW5nKSlmLm5leHRTaWJsaW5nPWE7aWYoZj12KGQubmV4dFNpYmxpbmc9YykpZi5wcmV2aW91c1NpYmxpbmc9YTtkLnBhcmVudE5vZGU9YjtjP2M9PT1lLmZpcnN0Q2hpbGQmJihlLmZpcnN0Q2hpbGQ9YSk6KGUubGFzdENoaWxkPWEsZS5maXJzdENoaWxkfHwoZS5maXJzdENoaWxkPWEpKTtlLmNoaWxkTm9kZXM9bnVsbH0KZnVuY3Rpb24gaGMoYSxiLGMpe0ZiKGIpO3ZhciBkPXUoYik7dm9pZCAwIT09ZC5maXJzdENoaWxkJiYoZC5jaGlsZE5vZGVzPW51bGwpO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2Q9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspZ2MoZFtlXSxiLGMpO2E9dShhKTtiPXZvaWQgMCE9PWEuZmlyc3RDaGlsZD9udWxsOnZvaWQgMDthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YjthLmNoaWxkTm9kZXM9Yn1lbHNlIGdjKGEsYixjKX0KZnVuY3Rpb24gaWMoYSxiKXt2YXIgYz11KGEpO2I9dShiKTthPT09Yi5maXJzdENoaWxkJiYoYi5maXJzdENoaWxkPWMubmV4dFNpYmxpbmcpO2E9PT1iLmxhc3RDaGlsZCYmKGIubGFzdENoaWxkPWMucHJldmlvdXNTaWJsaW5nKTthPWMucHJldmlvdXNTaWJsaW5nO3ZhciBkPWMubmV4dFNpYmxpbmc7YSYmKHUoYSkubmV4dFNpYmxpbmc9ZCk7ZCYmKHUoZCkucHJldmlvdXNTaWJsaW5nPWEpO2MucGFyZW50Tm9kZT1jLnByZXZpb3VzU2libGluZz1jLm5leHRTaWJsaW5nPXZvaWQgMDt2b2lkIDAhPT1iLmNoaWxkTm9kZXMmJihiLmNoaWxkTm9kZXM9bnVsbCl9CmZ1bmN0aW9uIGpjKGEpe3ZhciBiPXUoYSk7aWYodm9pZCAwPT09Yi5maXJzdENoaWxkKXtiLmNoaWxkTm9kZXM9bnVsbDt2YXIgYz1iLmZpcnN0Q2hpbGQ9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkfHxudWxsO2IubGFzdENoaWxkPWEuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfHxudWxsO0ZiKGEpO2I9Yztmb3IoYz12b2lkIDA7YjtiPWIuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmcpe3ZhciBkPXUoYik7ZC5wYXJlbnROb2RlPWE7ZC5uZXh0U2libGluZz1iLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nfHxudWxsO2QucHJldmlvdXNTaWJsaW5nPWN8fG51bGw7Yz1iO0ViKGIpfX19O3ZhciBrYz1udWxsO2Z1bmN0aW9uIEcoKXtrY3x8KGtjPXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKTtyZXR1cm4ga2N8fG51bGx9ZnVuY3Rpb24gbGMoYSxiKXt2YXIgYz1HKCk7YyYmYy51bnNjb3BlTm9kZShhLGIpfWZ1bmN0aW9uIG1jKGEsYil7dmFyIGM9RygpO2lmKCFjKXJldHVybiEwO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2M9ITA7YT1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGQ9MDtjJiZkPGEubGVuZ3RoO2QrKyljPWMmJm1jKGFbZF0sYik7cmV0dXJuIGN9cmV0dXJuIGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERT8hMDpjLmN1cnJlbnRTY29wZUZvck5vZGUoYSk9PT1ifWZ1bmN0aW9uIG5jKGEpe2lmKGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4iIjt2YXIgYj1HKCk7cmV0dXJuIGI/Yi5jdXJyZW50U2NvcGVGb3JOb2RlKGEpOiIifQpmdW5jdGlvbiBvYyhhLGIpe2lmKGEpe2Eubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYihhKTthPWEuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgYz0wLGQ7YzxhLmxlbmd0aDtjKyspZD1hW2NdLGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmb2MoZCxiKX19O3ZhciBwYz13aW5kb3cuZG9jdW1lbnQscWM9dy5vYSxyYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJpc0Nvbm5lY3RlZCIpLHNjPXJjJiZyYy5nZXQ7ZnVuY3Rpb24gdGMoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KWEuX19zaGFkeV9yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiB1YyhhKXt2YXIgYj12KGEpO2lmKGImJnZvaWQgMCE9PWIuSyl7Yj1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkPWIubGVuZ3RoLGU9dm9pZCAwO2M8ZCYmKGU9YltjXSk7YysrKXVjKGUpfWlmKGE9dihhKSlhLks9dm9pZCAwfWZ1bmN0aW9uIHZjKGEpe3ZhciBiPWE7YSYmInNsb3QiPT09YS5sb2NhbE5hbWUmJihiPShiPShiPXYoYSkpJiZiLkQpJiZiLmxlbmd0aD9iWzBdOnZjKGEuX19zaGFkeV9uZXh0U2libGluZykpO3JldHVybiBifQpmdW5jdGlvbiB3YyhhLGIsYyl7aWYoYT0oYT12KGEpKSYmYS5IKWImJmEuYWRkZWROb2Rlcy5wdXNoKGIpLGMmJmEucmVtb3ZlZE5vZGVzLnB1c2goYyksYWIoYSl9CnZhciBDYz1CKHtnZXQgcGFyZW50Tm9kZSgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLnBhcmVudE5vZGU7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGV9LGdldCBmaXJzdENoaWxkKCl7dmFyIGE9dih0aGlzKTthPWEmJmEuZmlyc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZH0sZ2V0IGxhc3RDaGlsZCgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLmxhc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfSxnZXQgbmV4dFNpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5uZXh0U2libGluZztyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmd9LGdldCBwcmV2aW91c1NpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5wcmV2aW91c1NpYmxpbmc7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3ByZXZpb3VzU2libGluZ30sCmdldCBjaGlsZE5vZGVzKCl7aWYoeSh0aGlzKSl7dmFyIGE9dih0aGlzKTtpZighYS5jaGlsZE5vZGVzKXthLmNoaWxkTm9kZXM9W107Zm9yKHZhciBiPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2I7Yj1iLl9fc2hhZHlfbmV4dFNpYmxpbmcpYS5jaGlsZE5vZGVzLnB1c2goYil9dmFyIGM9YS5jaGlsZE5vZGVzfWVsc2UgYz10aGlzLl9fc2hhZHlfbmF0aXZlX2NoaWxkTm9kZXM7Yy5pdGVtPWZ1bmN0aW9uKGEpe3JldHVybiBjW2FdfTtyZXR1cm4gY30sZ2V0IHBhcmVudEVsZW1lbnQoKXt2YXIgYT12KHRoaXMpOyhhPWEmJmEucGFyZW50Tm9kZSkmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGE9bnVsbCk7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudEVsZW1lbnR9LGdldCBpc0Nvbm5lY3RlZCgpe2lmKHNjJiZzYy5jYWxsKHRoaXMpKXJldHVybiEwO2lmKHRoaXMubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlyZXR1cm4hMTsKdmFyIGE9dGhpcy5vd25lckRvY3VtZW50O2lmKFRhKXtpZihhLl9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwfWVsc2UgaWYoYS5kb2N1bWVudEVsZW1lbnQmJmEuZG9jdW1lbnRFbGVtZW50Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwO2ZvcihhPXRoaXM7YSYmIShhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEuX19zaGFkeV9wYXJlbnROb2RlfHwoeihhKT9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hIShhJiZhIGluc3RhbmNlb2YgRG9jdW1lbnQpfSxnZXQgdGV4dENvbnRlbnQoKXtpZih5KHRoaXMpKXtmb3IodmFyIGE9W10sYj0wLGM9dGhpcy5fX3NoYWR5X2NoaWxkTm9kZXMsZDtkPWNbYl07YisrKWQubm9kZVR5cGUhPT1Ob2RlLkNPTU1FTlRfTk9ERSYmYS5wdXNoKGQuX19zaGFkeV90ZXh0Q29udGVudCk7cmV0dXJuIGEuam9pbigiIil9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXtpZigidW5kZWZpbmVkIj09PQp0eXBlb2YgYXx8bnVsbD09PWEpYT0iIjtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTppZigheSh0aGlzKSYmdy5tKXt2YXIgYj10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDsoYiE9dGhpcy5fX3NoYWR5X2xhc3RDaGlsZHx8YiYmYi5ub2RlVHlwZSE9Tm9kZS5URVhUX05PREUpJiZ0Yyh0aGlzKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3RleHRDb250ZW50PWF9ZWxzZSB0Yyh0aGlzKSwoMDxhLmxlbmd0aHx8dGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKSYmdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vd25lckRvY3VtZW50IT09cGMmJmEub3duZXJEb2N1bWVudCE9PXBjKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShhLApiKSxhO2lmKGE9PT10aGlzKXRocm93IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXBwZW5kQ2hpbGQnIG9uICdOb2RlJzogVGhlIG5ldyBjaGlsZCBlbGVtZW50IGNvbnRhaW5zIHRoZSBwYXJlbnQuIik7aWYoYil7dmFyIGM9dihiKTtjPWMmJmMucGFyZW50Tm9kZTtpZih2b2lkIDAhPT1jJiZjIT09dGhpc3x8dm9pZCAwPT09YyYmYi5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2luc2VydEJlZm9yZScgb24gJ05vZGUnOiBUaGUgbm9kZSBiZWZvcmUgd2hpY2ggdGhlIG5ldyBub2RlIGlzIHRvIGJlIGluc2VydGVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4iKTt9aWYoYj09PWEpcmV0dXJuIGE7dmFyIGQ9W10sZT0oYz14Yyh0aGlzKSk/Yy5ob3N0LmxvY2FsTmFtZTpuYyh0aGlzKSxmPWEuX19zaGFkeV9wYXJlbnROb2RlO2lmKGYpe3ZhciBnPW5jKGEpO2YuX19zaGFkeV9yZW1vdmVDaGlsZChhLCEhY3x8CiF4YyhhKSl9Zj0hMDt2YXIgaD0oIXFjfHx2b2lkIDA9PT1hLl9fbm9JbnNlcnRpb25Qb2ludCkmJiFtYyhhLGUpLGs9YyYmIWEuX19ub0luc2VydGlvblBvaW50JiYoIXFjfHxhLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKTtpZihrfHxoKWgmJihnPWd8fG5jKGEpKSxvYyhhLGZ1bmN0aW9uKGEpe2smJiJzbG90Ij09PWEubG9jYWxOYW1lJiZkLnB1c2goYSk7aWYoaCl7dmFyIGI9ZztHKCkmJihiJiZsYyhhLGIpLChiPUcoKSkmJmIuc2NvcGVOb2RlKGEsZSkpfX0pO2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lfHxkLmxlbmd0aClkLmxlbmd0aCYmKGMuYz1jLmN8fFtdLGMuYT1jLmF8fFtdLGMuYj1jLmJ8fHt9LGMuYy5wdXNoLmFwcGx5KGMuYyxkIGluc3RhbmNlb2YgQXJyYXk/ZDpqYShpYShkKSkpKSxjJiZBYyhjKTt5KHRoaXMpJiYoaGMoYSx0aGlzLGIpLGM9dih0aGlzKSxMYSh0aGlzKT8oQWMoYy5yb290KSxmPSExKTpjLnJvb3QmJihmPSExKSk7Zj8KKGM9eih0aGlzKT90aGlzLmhvc3Q6dGhpcyxiPyhiPXZjKGIpLGMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGEsYikpOmMuX19zaGFkeV9uYXRpdmVfYXBwZW5kQ2hpbGQoYSkpOmEub3duZXJEb2N1bWVudCE9PXRoaXMub3duZXJEb2N1bWVudCYmdGhpcy5vd25lckRvY3VtZW50LmFkb3B0Tm9kZShhKTt3Yyh0aGlzLGEpO3JldHVybiBhfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/ITE6YjtpZih0aGlzLm93bmVyRG9jdW1lbnQhPT1wYylyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChhKTtpZihhLl9fc2hhZHlfcGFyZW50Tm9kZSE9PXRoaXMpdGhyb3cgRXJyb3IoIlRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlOiAiK2EpO3ZhciBjPXhjKGEpLGQ9YyYmQmMoYyxhKSxlPXYodGhpcyk7CmlmKHkodGhpcykmJihpYyhhLHRoaXMpLExhKHRoaXMpKSl7QWMoZS5yb290KTt2YXIgZj0hMH1pZihHKCkmJiFiJiZjKXt2YXIgZz1uYyhhKTtvYyhhLGZ1bmN0aW9uKGEpe2xjKGEsZyl9KX11YyhhKTtjJiYoKGI9dGhpcyYmInNsb3QiPT09dGhpcy5sb2NhbE5hbWUpJiYoZj0hMCksKGR8fGIpJiZBYyhjKSk7Znx8KGY9eih0aGlzKT90aGlzLmhvc3Q6dGhpcywoIWUucm9vdCYmInNsb3QiIT09YS5sb2NhbE5hbWV8fGY9PT1hLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUpJiZmLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGEpKTt3Yyh0aGlzLG51bGwsYSk7cmV0dXJuIGF9LHJlcGxhY2VDaGlsZDpmdW5jdGlvbihhLGIpe3RoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSxiKTt0aGlzLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGF9LGNsb25lTm9kZTpmdW5jdGlvbihhKXtpZigidGVtcGxhdGUiPT10aGlzLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9jbG9uZU5vZGUoYSk7CnZhciBiPXRoaXMuX19zaGFkeV9uYXRpdmVfY2xvbmVOb2RlKCExKTtpZihhJiZiLm5vZGVUeXBlIT09Tm9kZS5BVFRSSUJVVEVfTk9ERSl7YT10aGlzLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkO2M8YS5sZW5ndGg7YysrKWQ9YVtjXS5fX3NoYWR5X2Nsb25lTm9kZSghMCksYi5fX3NoYWR5X2FwcGVuZENoaWxkKGQpfXJldHVybiBifSxnZXRSb290Tm9kZTpmdW5jdGlvbihhKXtpZih0aGlzJiZ0aGlzLm5vZGVUeXBlKXt2YXIgYj11KHRoaXMpLGM9Yi5LO3ZvaWQgMD09PWMmJih6KHRoaXMpPyhjPXRoaXMsYi5LPWMpOihjPShjPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlKT9jLl9fc2hhZHlfZ2V0Um9vdE5vZGUoYSk6dGhpcyxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuX19zaGFkeV9uYXRpdmVfY29udGFpbnModGhpcykmJihiLks9YykpKTtyZXR1cm4gY319LGNvbnRhaW5zOmZ1bmN0aW9uKGEpe3JldHVybiBVYSh0aGlzLGEpfX0pO2Z1bmN0aW9uIERjKGEsYixjKXt2YXIgZD1bXTtFYyhhLl9fc2hhZHlfY2hpbGROb2RlcyxiLGMsZCk7cmV0dXJuIGR9ZnVuY3Rpb24gRWMoYSxiLGMsZCl7Zm9yKHZhciBlPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWFbZV0pO2UrKyl7dmFyIGg7aWYoaD1nLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe2g9Zzt2YXIgaz1iLGw9YyxtPWQscT1rKGgpO3EmJm0ucHVzaChoKTtsJiZsKHEpP2g9cTooRWMoaC5fX3NoYWR5X2NoaWxkTm9kZXMsayxsLG0pLGg9dm9pZCAwKX1pZihoKWJyZWFrfX0KdmFyIEZjPUIoe2dldCBmaXJzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5maXJzdENoaWxkKXtmb3IoYT10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X25leHRTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2ZpcnN0RWxlbWVudENoaWxkfSxnZXQgbGFzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5sYXN0Q2hpbGQpe2ZvcihhPXRoaXMuX19zaGFkeV9sYXN0Q2hpbGQ7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9wcmV2aW91c1NpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdEVsZW1lbnRDaGlsZH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHkodGhpcyk/VmEoQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHRoaXMuX19zaGFkeV9jaGlsZE5vZGVzLApmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfSkpOnRoaXMuX19zaGFkeV9uYXRpdmVfY2hpbGRyZW59LGdldCBjaGlsZEVsZW1lbnRDb3VudCgpe3ZhciBhPXRoaXMuX19zaGFkeV9jaGlsZHJlbjtyZXR1cm4gYT9hLmxlbmd0aDowfX0pLEdjPUIoe3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIERjKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIE9hLmNhbGwoYixhKX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oYSxiKXtpZihiKXtiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvckFsbChhKSk7dmFyIGM9dGhpcy5fX3NoYWR5X2dldFJvb3ROb2RlKCk7cmV0dXJuIGIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKT09Y30pfXJldHVybiBEYyh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBPYS5jYWxsKGIsCmEpfSl9fSksSGM9dy5vYT9PYmplY3QuYXNzaWduKHt9LEZjKTpGYztPYmplY3QuYXNzaWduKEZjLEdjKTt2YXIgSWM9Qih7Z2V0RWxlbWVudEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIiI9PT1hP251bGw6RGModGhpcyxmdW5jdGlvbihiKXtyZXR1cm4gYi5pZD09YX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9fSk7dmFyIEpjPUIoe2dldCBhY3RpdmVFbGVtZW50KCl7dmFyIGE9dy5tP2RvY3VtZW50Ll9fc2hhZHlfbmF0aXZlX2FjdGl2ZUVsZW1lbnQ6ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighYXx8IWEubm9kZVR5cGUpcmV0dXJuIG51bGw7dmFyIGI9ISF6KHRoaXMpO2lmKCEodGhpcz09PWRvY3VtZW50fHxiJiZ0aGlzLmhvc3QhPT1hJiZ0aGlzLmhvc3QuX19zaGFkeV9uYXRpdmVfY29udGFpbnMoYSkpKXJldHVybiBudWxsO2ZvcihiPXhjKGEpO2ImJmIhPT10aGlzOylhPWIuaG9zdCxiPXhjKGEpO3JldHVybiB0aGlzPT09ZG9jdW1lbnQ/Yj9udWxsOmE6Yj09PXRoaXM/YTpudWxsfX0pO3ZhciBLYz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0IiksTGM9Qih7Z2V0IGlubmVySFRNTCgpe3JldHVybiB5KHRoaXMpP2tiKCJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZT90aGlzLmNvbnRlbnQ6dGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3NoYWR5X2NoaWxkTm9kZXN9KTp0aGlzLl9fc2hhZHlfbmF0aXZlX2lubmVySFRNTH0sc2V0IGlubmVySFRNTChhKXtpZigidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUpdGhpcy5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUw9YTtlbHNle3RjKHRoaXMpO3ZhciBiPXRoaXMubG9jYWxOYW1lfHwiZGl2IjtiPXRoaXMubmFtZXNwYWNlVVJJJiZ0aGlzLm5hbWVzcGFjZVVSSSE9PUtjLm5hbWVzcGFjZVVSST9LYy5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksYik6S2MuY3JlYXRlRWxlbWVudChiKTtmb3Iody5tP2IuX19zaGFkeV9uYXRpdmVfaW5uZXJIVE1MPWE6Yi5pbm5lckhUTUw9CmE7YT1iLl9fc2hhZHlfZmlyc3RDaGlsZDspdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX19fSk7dmFyIE1jPUIoe2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpeyJvYmplY3QiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO2MuJD10aGlzO3RoaXMuaG9zdC5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYixjKXsib2JqZWN0IiE9PXR5cGVvZiBjJiYoYz17Y2FwdHVyZTohIWN9KTtjLiQ9dGhpczt0aGlzLmhvc3QuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX19KTtmdW5jdGlvbiBOYyhhLGIpe0EoYSxNYyxiKTtBKGEsSmMsYik7QShhLExjLGIpO0EoYSxGYyxiKTt3LkomJiFiPyhBKGEsQ2MsYiksQShhLEljLGIpKTp3Lm18fChBKGEsQWIpLEEoYSx6YikpfTt2YXIgT2M9e30sUGM9dy5kZWZlckNvbm5lY3Rpb25DYWxsYmFja3MmJiJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUsUWM7ZnVuY3Rpb24gUmMoYSl7dmFyIGI9W107ZG8gYi51bnNoaWZ0KGEpO3doaWxlKGE9YS5fX3NoYWR5X3BhcmVudE5vZGUpO3JldHVybiBifQpmdW5jdGlvbiBTYyhhLGIsYyl7aWYoYSE9PU9jKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt0aGlzLnphPSJTaGFkeVJvb3QiO3RoaXMuaG9zdD1iO3RoaXMubW9kZT1jJiZjLm1vZGU7amMoYik7YT11KGIpO2Eucm9vdD10aGlzO2EucGE9ImNsb3NlZCIhPT10aGlzLm1vZGU/dGhpczpudWxsO2E9dSh0aGlzKTthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YS5wYXJlbnROb2RlPWEubmV4dFNpYmxpbmc9YS5wcmV2aW91c1NpYmxpbmc9bnVsbDthLmNoaWxkTm9kZXM9W107dGhpcy5iYT10aGlzLkI9ITE7dGhpcy5jPXRoaXMuYj10aGlzLmE9bnVsbDtpZih3LnByZWZlclBlcmZvcm1hbmNlKWZvcig7YT1iLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYSk7ZWxzZSBBYyh0aGlzKX1mdW5jdGlvbiBBYyhhKXthLkJ8fChhLkI9ITAsWWEoZnVuY3Rpb24oKXtyZXR1cm4gVGMoYSl9KSl9CmZ1bmN0aW9uIFRjKGEpe3ZhciBiO2lmKGI9YS5CKXtmb3IodmFyIGM7YTspYTp7YS5CJiYoYz1hKSxiPWE7YT1iLmhvc3QuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkmJihiPXYoYi5ob3N0KSkmJjA8Yi5OKWJyZWFrIGE7YT12b2lkIDB9Yj1jfShjPWIpJiZjLl9yZW5kZXJTZWxmKCl9ClNjLnByb3RvdHlwZS5fcmVuZGVyU2VsZj1mdW5jdGlvbigpe3ZhciBhPVBjO1BjPSEwO3RoaXMuQj0hMTtpZih0aGlzLmEpe1VjKHRoaXMpO2Zvcih2YXIgYj0wLGM7Yjx0aGlzLmEubGVuZ3RoO2IrKyl7Yz10aGlzLmFbYl07dmFyIGQ9dihjKSxlPWQuYXNzaWduZWROb2RlcztkLmFzc2lnbmVkTm9kZXM9W107ZC5EPVtdO2lmKGQuY2E9ZSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj12KGVbZF0pO2YuUD1mLmFzc2lnbmVkU2xvdDtmLmFzc2lnbmVkU2xvdD09PWMmJihmLmFzc2lnbmVkU2xvdD1udWxsKX19Zm9yKGI9dGhpcy5ob3N0Ll9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKVZjKHRoaXMsYik7Zm9yKGI9MDtiPHRoaXMuYS5sZW5ndGg7YisrKXtjPXRoaXMuYVtiXTtlPXYoYyk7aWYoIWUuYXNzaWduZWROb2Rlcy5sZW5ndGgpZm9yKGQ9Yy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7ZDtkPWQuX19zaGFkeV9uZXh0U2libGluZylWYyh0aGlzLApkLGMpOyhkPShkPXYoYy5fX3NoYWR5X3BhcmVudE5vZGUpKSYmZC5yb290KSYmKE1hKGQpfHxkLkIpJiZkLl9yZW5kZXJTZWxmKCk7V2ModGhpcyxlLkQsZS5hc3NpZ25lZE5vZGVzKTtpZihkPWUuY2Epe2ZvcihmPTA7ZjxkLmxlbmd0aDtmKyspdihkW2ZdKS5QPW51bGw7ZS5jYT1udWxsO2QubGVuZ3RoPmUuYXNzaWduZWROb2Rlcy5sZW5ndGgmJihlLlQ9ITApfWUuVCYmKGUuVD0hMSxYYyh0aGlzLGMpKX1jPXRoaXMuYTtiPVtdO2ZvcihlPTA7ZTxjLmxlbmd0aDtlKyspZD1jW2VdLl9fc2hhZHlfcGFyZW50Tm9kZSwoZj12KGQpKSYmZi5yb290fHwhKDA+Yi5pbmRleE9mKGQpKXx8Yi5wdXNoKGQpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2Y9YltjXTtlPWY9PT10aGlzP3RoaXMuaG9zdDpmO2Q9W107Zj1mLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIGg9ZltnXTtpZigic2xvdCI9PWgubG9jYWxOYW1lKXtoPXYoaCkuRDtmb3IodmFyIGs9CjA7azxoLmxlbmd0aDtrKyspZC5wdXNoKGhba10pfWVsc2UgZC5wdXNoKGgpfWY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5fX3NoYWR5X25hdGl2ZV9jaGlsZE5vZGVzKTtnPWVjKGQsZC5sZW5ndGgsZixmLmxlbmd0aCk7az1oPTA7Zm9yKHZhciBsPXZvaWQgMDtoPGcubGVuZ3RoJiYobD1nW2hdKTtoKyspe2Zvcih2YXIgbT0wLHE9dm9pZCAwO208bC5MLmxlbmd0aCYmKHE9bC5MW21dKTttKyspcS5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlPT09ZSYmZS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChxKSxmLnNwbGljZShsLmluZGV4K2ssMSk7ay09bC5SfWs9MDtmb3IobD12b2lkIDA7azxnLmxlbmd0aCYmKGw9Z1trXSk7aysrKWZvcihoPWZbbC5pbmRleF0sbT1sLmluZGV4O208bC5pbmRleCtsLlI7bSsrKXE9ZFttXSxlLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShxLGgpLGYuc3BsaWNlKG0sMCxxKX19aWYoIXcucHJlZmVyUGVyZm9ybWFuY2UmJiF0aGlzLmJhKWZvcihiPQp0aGlzLmhvc3QuX19zaGFkeV9jaGlsZE5vZGVzLGM9MCxlPWIubGVuZ3RoO2M8ZTtjKyspZD1iW2NdLGY9dihkKSxkLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUhPT10aGlzLmhvc3R8fCJzbG90IiE9PWQubG9jYWxOYW1lJiZmLmFzc2lnbmVkU2xvdHx8dGhpcy5ob3N0Ll9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGQpO3RoaXMuYmE9ITA7UGM9YTtRYyYmUWMoKX07ZnVuY3Rpb24gVmMoYSxiLGMpe3ZhciBkPXUoYiksZT1kLlA7ZC5QPW51bGw7Y3x8KGM9KGE9YS5iW2IuX19zaGFkeV9zbG90fHwiX19jYXRjaGFsbCJdKSYmYVswXSk7Yz8odShjKS5hc3NpZ25lZE5vZGVzLnB1c2goYiksZC5hc3NpZ25lZFNsb3Q9Yyk6ZC5hc3NpZ25lZFNsb3Q9dm9pZCAwO2UhPT1kLmFzc2lnbmVkU2xvdCYmZC5hc3NpZ25lZFNsb3QmJih1KGQuYXNzaWduZWRTbG90KS5UPSEwKX0KZnVuY3Rpb24gV2MoYSxiLGMpe2Zvcih2YXIgZD0wLGU9dm9pZCAwO2Q8Yy5sZW5ndGgmJihlPWNbZF0pO2QrKylpZigic2xvdCI9PWUubG9jYWxOYW1lKXt2YXIgZj12KGUpLmFzc2lnbmVkTm9kZXM7ZiYmZi5sZW5ndGgmJldjKGEsYixmKX1lbHNlIGIucHVzaChjW2RdKX1mdW5jdGlvbiBYYyhhLGIpe2IuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInNsb3RjaGFuZ2UiKSk7Yj12KGIpO2IuYXNzaWduZWRTbG90JiZYYyhhLGIuYXNzaWduZWRTbG90KX0KZnVuY3Rpb24gVWMoYSl7aWYoYS5jJiZhLmMubGVuZ3RoKXtmb3IodmFyIGI9YS5jLGMsZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgZT1iW2RdO2pjKGUpO3ZhciBmPWUuX19zaGFkeV9wYXJlbnROb2RlO2pjKGYpO2Y9dihmKTtmLk49KGYuTnx8MCkrMTtmPVljKGUpO2EuYltmXT8oYz1jfHx7fSxjW2ZdPSEwLGEuYltmXS5wdXNoKGUpKTphLmJbZl09W2VdO2EuYS5wdXNoKGUpfWlmKGMpZm9yKHZhciBnIGluIGMpYS5iW2ddPVpjKGEuYltnXSk7YS5jPVtdfX1mdW5jdGlvbiBZYyhhKXt2YXIgYj1hLm5hbWV8fGEuZ2V0QXR0cmlidXRlKCJuYW1lIil8fCJfX2NhdGNoYWxsIjtyZXR1cm4gYS53YT1ifQpmdW5jdGlvbiBaYyhhKXtyZXR1cm4gYS5zb3J0KGZ1bmN0aW9uKGEsYyl7YT1SYyhhKTtmb3IodmFyIGI9UmMoYyksZT0wO2U8YS5sZW5ndGg7ZSsrKXtjPWFbZV07dmFyIGY9YltlXTtpZihjIT09ZilyZXR1cm4gYT1BcnJheS5mcm9tKGMuX19zaGFkeV9wYXJlbnROb2RlLl9fc2hhZHlfY2hpbGROb2RlcyksYS5pbmRleE9mKGMpLWEuaW5kZXhPZihmKX19KX0KZnVuY3Rpb24gQmMoYSxiKXtpZihhLmEpe1VjKGEpO3ZhciBjPWEuYixkO2ZvcihkIGluIGMpZm9yKHZhciBlPWNbZF0sZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdO2lmKFVhKGIsZykpe2Uuc3BsaWNlKGYsMSk7dmFyIGg9YS5hLmluZGV4T2YoZyk7MDw9aCYmKGEuYS5zcGxpY2UoaCwxKSwoaD12KGcuX19zaGFkeV9wYXJlbnROb2RlKSkmJmguTiYmaC5OLS0pO2YtLTtnPXYoZyk7aWYoaD1nLkQpZm9yKHZhciBrPTA7azxoLmxlbmd0aDtrKyspe3ZhciBsPWhba10sbT1sLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGU7bSYmbS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChsKX1nLkQ9W107Zy5hc3NpZ25lZE5vZGVzPVtdO2g9ITB9fXJldHVybiBofX1mdW5jdGlvbiBNYShhKXtVYyhhKTtyZXR1cm4hKCFhLmF8fCFhLmEubGVuZ3RoKX0KKGZ1bmN0aW9uKGEpe2EuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO05jKGEsIl9fc2hhZHlfIik7TmMoYSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSx7bm9kZVR5cGU6e3ZhbHVlOk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSxjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOnt2YWx1ZToiI2RvY3VtZW50LWZyYWdtZW50Iixjb25maWd1cmFibGU6ITB9LG5vZGVWYWx1ZTp7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9fSk7WyJsb2NhbE5hbWUiLCJuYW1lc3BhY2VVUkkiLCJwcmVmaXgiXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOnZvaWQgMCxjb25maWd1cmFibGU6ITB9KX0pO1sib3duZXJEb2N1bWVudCIsImJhc2VVUkkiLCJpc0Nvbm5lY3RlZCJdLmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFtiXX0sCmNvbmZpZ3VyYWJsZTohMH0pfSl9KShTYy5wcm90b3R5cGUpOwppZih3aW5kb3cuY3VzdG9tRWxlbWVudHMmJncuZWEmJiF3LnByZWZlclBlcmZvcm1hbmNlKXt2YXIgJGM9bmV3IE1hcDtRYz1mdW5jdGlvbigpe3ZhciBhPVtdOyRjLmZvckVhY2goZnVuY3Rpb24oYixjKXthLnB1c2goW2MsYl0pfSk7JGMuY2xlYXIoKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXVswXTthW2JdWzFdP2MudWEoKTpjLnZhKCl9fTtQYyYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24oKXtQYz0hMTtRYygpfSx7b25jZTohMH0pO3ZhciBhZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9MCxlPSJfX2lzQ29ubmVjdGVkIitkKys7aWYoYnx8YylhLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1hLnByb3RvdHlwZS51YT1mdW5jdGlvbigpe1BjPyRjLnNldCh0aGlzLCEwKTp0aGlzW2VdfHwodGhpc1tlXT0hMCxiJiZiLmNhbGwodGhpcykpfSxhLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaz0KYS5wcm90b3R5cGUudmE9ZnVuY3Rpb24oKXtQYz90aGlzLmlzQ29ubmVjdGVkfHwkYy5zZXQodGhpcywhMSk6dGhpc1tlXSYmKHRoaXNbZV09ITEsYyYmYy5jYWxsKHRoaXMpKX07cmV0dXJuIGF9LGJkPXdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnkucHJvdG90eXBlLCJkZWZpbmUiLHt2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWIucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrLGQ9Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s7YmQuY2FsbCh3aW5kb3cuY3VzdG9tRWxlbWVudHMsYSxhZChiLGMsZCkpO2IucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWM7Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZH19KX1mdW5jdGlvbiB4YyhhKXthPWEuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkpcmV0dXJuIGF9O2Z1bmN0aW9uIGNkKGEpe3RoaXMubm9kZT1hfW49Y2QucHJvdG90eXBlO24uYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfTtuLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX07bi5hcHBlbmRDaGlsZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXBwZW5kQ2hpbGQoYSl9O24uaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2luc2VydEJlZm9yZShhLGIpfTtuLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVDaGlsZChhKX07bi5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVwbGFjZUNoaWxkKGEsYil9OwpuLmNsb25lTm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2xvbmVOb2RlKGEpfTtuLmdldFJvb3ROb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRSb290Tm9kZShhKX07bi5jb250YWlucz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY29udGFpbnMoYSl9O24uZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZGlzcGF0Y2hFdmVudChhKX07bi5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiKXt0aGlzLm5vZGUuX19zaGFkeV9zZXRBdHRyaWJ1dGUoYSxiKX07bi5nZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25hdGl2ZV9nZXRBdHRyaWJ1dGUoYSl9O24uaGFzQXR0cmlidXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uYXRpdmVfaGFzQXR0cmlidXRlKGEpfTtuLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVBdHRyaWJ1dGUoYSl9OwpuLmF0dGFjaFNoYWRvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXR0YWNoU2hhZG93KGEpfTtuLmZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2ZvY3VzKCl9O24uYmx1cj1mdW5jdGlvbigpe3RoaXMubm9kZS5fX3NoYWR5X2JsdXIoKX07bi5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbXBvcnROb2RlKGEsYil9O24uZ2V0RWxlbWVudEJ5SWQ9ZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRFbGVtZW50QnlJZChhKX07bi5xdWVyeVNlbGVjdG9yPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9xdWVyeVNlbGVjdG9yKGEpfTsKbi5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3F1ZXJ5U2VsZWN0b3JBbGwoYSxiKX07bi5hc3NpZ25lZE5vZGVzPWZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubm9kZS5sb2NhbE5hbWUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Fzc2lnbmVkTm9kZXMoYSl9OwpwLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNkLnByb3RvdHlwZSx7YWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoeih0aGlzLm5vZGUpfHx0aGlzLm5vZGUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX05PREUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FjdGl2ZUVsZW1lbnR9fSxfYWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlRWxlbWVudH19LGhvc3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHoodGhpcy5ub2RlKSlyZXR1cm4gdGhpcy5ub2RlLmhvc3R9fSxwYXJlbnROb2RlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50Tm9kZX19LGZpcnN0Q2hpbGQ6e2NvbmZpZ3VyYWJsZTohMCwKZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RDaGlsZH19LGxhc3RDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2xhc3RDaGlsZH19LG5leHRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmV4dFNpYmxpbmd9fSxwcmV2aW91c1NpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9fSxjaGlsZE5vZGVzOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGROb2Rlc319LHBhcmVudEVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLApnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50RWxlbWVudH19LGZpcnN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RFbGVtZW50Q2hpbGR9fSxsYXN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbGFzdEVsZW1lbnRDaGlsZH19LG5leHRFbGVtZW50U2libGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ319LHByZXZpb3VzRWxlbWVudFNpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfX0sCmNoaWxkcmVuOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGRyZW59fSxjaGlsZEVsZW1lbnRDb3VudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NoaWxkRWxlbWVudENvdW50fX0sc2hhZG93Um9vdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3NoYWRvd1Jvb3R9fSxhc3NpZ25lZFNsb3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hc3NpZ25lZFNsb3R9fSxpc0Nvbm5lY3RlZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lzQ29ubmVjdGVkfX0saW5uZXJIVE1MOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTD1hfX0sdGV4dENvbnRlbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV90ZXh0Q29udGVudH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3RleHRDb250ZW50PWF9fSxzbG90Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfc2xvdH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3Nsb3Q9YX19fSk7CmNjLmZvckVhY2goZnVuY3Rpb24oYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLnByb3RvdHlwZSxhLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlWyJfX3NoYWR5XyIrYV19LHNldDpmdW5jdGlvbihiKXt0aGlzLm5vZGVbIl9fc2hhZHlfIithXT1ifSxjb25maWd1cmFibGU6ITB9KX0pO3ZhciBkZD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlZChhKXtpZih6KGEpfHxhIGluc3RhbmNlb2YgY2QpcmV0dXJuIGE7dmFyIGI9ZGQuZ2V0KGEpO2J8fChiPW5ldyBjZChhKSxkZC5zZXQoYSxiKSk7cmV0dXJuIGJ9O3ZhciBmZD1CKHtkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGEpe1phKCk7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChhKX0sYWRkRXZlbnRMaXN0ZW5lcjpVYixyZW1vdmVFdmVudExpc3RlbmVyOldifSk7dmFyIGdkPUIoe2dldCBhc3NpZ25lZFNsb3QoKXt2YXIgYT10aGlzLl9fc2hhZHlfcGFyZW50Tm9kZTsoYT1hJiZhLl9fc2hhZHlfc2hhZG93Um9vdCkmJlRjKGEpO3JldHVybihhPXYodGhpcykpJiZhLmFzc2lnbmVkU2xvdHx8bnVsbH19KTt2YXIgaGQ9d2luZG93LmRvY3VtZW50O2Z1bmN0aW9uIGlkKGEsYil7aWYoInNsb3QiPT09YilhPWEuX19zaGFkeV9wYXJlbnROb2RlLExhKGEpJiZBYyh2KGEpLnJvb3QpO2Vsc2UgaWYoInNsb3QiPT09YS5sb2NhbE5hbWUmJiJuYW1lIj09PWImJihiPXhjKGEpKSl7aWYoYi5hKXtVYyhiKTt2YXIgYz1hLndhLGQ9WWMoYSk7aWYoZCE9PWMpe2M9Yi5iW2NdO3ZhciBlPWMuaW5kZXhPZihhKTswPD1lJiZjLnNwbGljZShlLDEpO2M9Yi5iW2RdfHwoYi5iW2RdPVtdKTtjLnB1c2goYSk7MTxjLmxlbmd0aCYmKGIuYltkXT1aYyhjKSl9fUFjKGIpfX0KdmFyIGpkPUIoe2dldCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLnByZXZpb3VzU2libGluZyl7Zm9yKGE9dGhpcy5fX3NoYWR5X3ByZXZpb3VzU2libGluZzthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X3ByZXZpb3VzU2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfSxnZXQgbmV4dEVsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLm5leHRTaWJsaW5nKXtmb3IoYT10aGlzLl9fc2hhZHlfbmV4dFNpYmxpbmc7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9uZXh0U2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9uZXh0RWxlbWVudFNpYmxpbmd9LGdldCBzbG90KCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJzbG90Iil9LApzZXQgc2xvdChhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJzbG90IixhKX0sZ2V0IHNoYWRvd1Jvb3QoKXt2YXIgYT12KHRoaXMpO3JldHVybiBhJiZhLnBhfHxudWxsfSxnZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sc2V0IGNsYXNzTmFtZShhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJjbGFzcyIsYSl9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMub3duZXJEb2N1bWVudCE9PWhkKXRoaXMuX19zaGFkeV9uYXRpdmVfc2V0QXR0cmlidXRlKGEsYik7ZWxzZXt2YXIgYzsoYz1HKCkpJiYiY2xhc3MiPT09YT8oYy5zZXRFbGVtZW50Q2xhc3ModGhpcyxiKSxjPSEwKTpjPSExO2N8fCh0aGlzLl9fc2hhZHlfbmF0aXZlX3NldEF0dHJpYnV0ZShhLGIpLGlkKHRoaXMsYSkpfX0scmVtb3ZlQXR0cmlidXRlOmZ1bmN0aW9uKGEpe3RoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQXR0cmlidXRlKGEpO2lkKHRoaXMsCmEpfSxhdHRhY2hTaGFkb3c6ZnVuY3Rpb24oYSl7aWYoIXRoaXMpdGhyb3cgRXJyb3IoIk11c3QgcHJvdmlkZSBhIGhvc3QuIik7aWYoIWEpdGhyb3cgRXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzLiIpO3JldHVybiBuZXcgU2MoT2MsdGhpcyxhKX19KTt2YXIga2Q9Qih7Ymx1cjpmdW5jdGlvbigpe3ZhciBhPXYodGhpcyk7KGE9KGE9YSYmYS5yb290KSYmYS5hY3RpdmVFbGVtZW50KT9hLl9fc2hhZHlfYmx1cigpOnRoaXMuX19zaGFkeV9uYXRpdmVfYmx1cigpfX0pO2NjLmZvckVhY2goZnVuY3Rpb24oYSl7a2RbYV09e3NldDpmdW5jdGlvbihiKXt2YXIgYz11KHRoaXMpLGQ9YS5zdWJzdHJpbmcoMik7Yy5PW2FdJiZ0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCxjLk9bYV0pO3RoaXMuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGQsYik7Yy5PW2FdPWJ9LGdldDpmdW5jdGlvbigpe3ZhciBiPXYodGhpcyk7cmV0dXJuIGImJmIuT1thXX0sY29uZmlndXJhYmxlOiEwfX0pO3ZhciBsZD1CKHthc3NpZ25lZE5vZGVzOmZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lKXt2YXIgYj10aGlzLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtiJiZ6KGIpJiZUYyhiKTtyZXR1cm4oYj12KHRoaXMpKT8oYSYmYS5mbGF0dGVuP2IuRDpiLmFzc2lnbmVkTm9kZXMpfHxbXTpbXX19fSk7dmFyIG1kPXdpbmRvdy5kb2N1bWVudCxuZD1CKHtpbXBvcnROb2RlOmZ1bmN0aW9uKGEsYil7aWYoYS5vd25lckRvY3VtZW50IT09bWR8fCJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsYik7dmFyIGM9dGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsITEpO2lmKGIpe2E9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Yj0wO2Zvcih2YXIgZDtiPGEubGVuZ3RoO2IrKylkPXRoaXMuX19zaGFkeV9pbXBvcnROb2RlKGFbYl0sITApLGMuX19zaGFkeV9hcHBlbmRDaGlsZChkKX1yZXR1cm4gY319KTt2YXIgb2Q9Qih7YWRkRXZlbnRMaXN0ZW5lcjpVYi5iaW5kKHdpbmRvdykscmVtb3ZlRXZlbnRMaXN0ZW5lcjpXYi5iaW5kKHdpbmRvdyl9KTt2YXIgcGQ9e307T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsInBhcmVudEVsZW1lbnQiKSYmKHBkLnBhcmVudEVsZW1lbnQ9Q2MucGFyZW50RWxlbWVudCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNvbnRhaW5zIikmJihwZC5jb250YWlucz1DYy5jb250YWlucyk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNoaWxkcmVuIikmJihwZC5jaGlsZHJlbj1GYy5jaGlsZHJlbik7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpJiYocGQuaW5uZXJIVE1MPUxjLmlubmVySFRNTCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNsYXNzTmFtZSIpJiYocGQuY2xhc3NOYW1lPWpkLmNsYXNzTmFtZSk7CnZhciBxZD17RXZlbnRUYXJnZXQ6W2ZkXSxOb2RlOltDYyx3aW5kb3cuRXZlbnRUYXJnZXQ/bnVsbDpmZF0sVGV4dDpbZ2RdLEVsZW1lbnQ6W2pkLEZjLGdkLCF3Lm18fCJpbm5lckhUTUwiaW4gRWxlbWVudC5wcm90b3R5cGU/TGM6bnVsbCx3aW5kb3cuSFRNTFNsb3RFbGVtZW50P251bGw6bGRdLEhUTUxFbGVtZW50OltrZCxwZF0sSFRNTFNsb3RFbGVtZW50OltsZF0sRG9jdW1lbnRGcmFnbWVudDpbSGMsSWNdLERvY3VtZW50OltuZCxIYyxJYyxKY10sV2luZG93OltvZF19LHJkPXcubT9udWxsOlsiaW5uZXJIVE1MIiwidGV4dENvbnRlbnQiXTtmdW5jdGlvbiBzZChhKXt2YXIgYj1hP251bGw6cmQsYz17fSxkO2ZvcihkIGluIHFkKWMuVz13aW5kb3dbZF0mJndpbmRvd1tkXS5wcm90b3R5cGUscWRbZF0uZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGMuVyYmZCYmQShjLlcsZCxhLGIpfX0oYykpLGM9e1c6Yy5XfX07aWYody5lYSl7dmFyIFNoYWR5RE9NPXtpblVzZTp3LmVhLHBhdGNoOmZ1bmN0aW9uKGEpe0ZiKGEpO0ViKGEpO3JldHVybiBhfSxpc1NoYWR5Um9vdDp6LGVucXVldWU6WWEsZmx1c2g6WmEsZmx1c2hJbml0aWFsOmZ1bmN0aW9uKGEpeyFhLmJhJiZhLkImJlRjKGEpfSxzZXR0aW5nczp3LGZpbHRlck11dGF0aW9uczpkYixvYnNlcnZlQ2hpbGRyZW46YmIsdW5vYnNlcnZlQ2hpbGRyZW46Y2IsZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzOncuZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzLHByZWZlclBlcmZvcm1hbmNlOncucHJlZmVyUGVyZm9ybWFuY2UsaGFuZGxlc0R5bmFtaWNTY29waW5nOiEwLHdyYXA6dy5KP2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxXcmFwcGVyOmNkLGNvbXBvc2VkUGF0aDpNYixub1BhdGNoOncuSixuYXRpdmVNZXRob2RzOnFiLG5hdGl2ZVRyZWU6cmJ9O3dpbmRvdy5TaGFkeURPTT1TaGFkeURPTTt5YigpO3NkKCJfX3NoYWR5XyIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwKIl9hY3RpdmVFbGVtZW50IixKYy5hY3RpdmVFbGVtZW50KTtBKFdpbmRvdy5wcm90b3R5cGUsb2QsIl9fc2hhZHlfIik7dy5KfHwoc2QoKSxiYygpKTtYYigpO3dpbmRvdy5FdmVudD1aYjt3aW5kb3cuQ3VzdG9tRXZlbnQ9JGI7d2luZG93Lk1vdXNlRXZlbnQ9YWM7d2luZG93LlNoYWRvd1Jvb3Q9U2N9O3ZhciB0ZD1uZXcgU2V0KCJhbm5vdGF0aW9uLXhtbCBjb2xvci1wcm9maWxlIGZvbnQtZmFjZSBmb250LWZhY2Utc3JjIGZvbnQtZmFjZS11cmkgZm9udC1mYWNlLWZvcm1hdCBmb250LWZhY2UtbmFtZSBtaXNzaW5nLWdseXBoIi5zcGxpdCgiICIpKTtmdW5jdGlvbiB1ZChhKXt2YXIgYj10ZC5oYXMoYSk7YT0vXlthLXpdWy4wLTlfYS16XSotW1wtLjAtOV9hLXpdKiQvLnRlc3QoYSk7cmV0dXJuIWImJmF9ZnVuY3Rpb24gSChhKXt2YXIgYj1hLmlzQ29ubmVjdGVkO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7Zm9yKDthJiYhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEucGFyZW50Tm9kZXx8KHdpbmRvdy5TaGFkb3dSb290JiZhIGluc3RhbmNlb2YgU2hhZG93Um9vdD9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hKCFhfHwhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpKX0KZnVuY3Rpb24gdmQoYSxiKXtmb3IoO2ImJmIhPT1hJiYhYi5uZXh0U2libGluZzspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGImJmIhPT1hP2IubmV4dFNpYmxpbmc6bnVsbH0KZnVuY3Rpb24gd2QoYSxiLGMpe2M9dm9pZCAwPT09Yz9uZXcgU2V0OmM7Zm9yKHZhciBkPWE7ZDspe2lmKGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGU9ZDtiKGUpO3ZhciBmPWUubG9jYWxOYW1lO2lmKCJsaW5rIj09PWYmJiJpbXBvcnQiPT09ZS5nZXRBdHRyaWJ1dGUoInJlbCIpKXtkPWUuaW1wb3J0O2lmKGQgaW5zdGFuY2VvZiBOb2RlJiYhYy5oYXMoZCkpZm9yKGMuYWRkKGQpLGQ9ZC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKXdkKGQsYixjKTtkPXZkKGEsZSk7Y29udGludWV9ZWxzZSBpZigidGVtcGxhdGUiPT09Zil7ZD12ZChhLGUpO2NvbnRpbnVlfWlmKGU9ZS5fX0NFX3NoYWRvd1Jvb3QpZm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKXdkKGUsYixjKX1kPWQuZmlyc3RDaGlsZD9kLmZpcnN0Q2hpbGQ6dmQoYSxkKX19ZnVuY3Rpb24gSShhLGIsYyl7YVtiXT1jfTtmdW5jdGlvbiB4ZCgpe3RoaXMuYT1uZXcgTWFwO3RoaXMuZz1uZXcgTWFwO3RoaXMuZj1bXTt0aGlzLmM9ITF9ZnVuY3Rpb24geWQoYSxiLGMpe2EuYS5zZXQoYixjKTthLmcuc2V0KGMuY29uc3RydWN0b3JGdW5jdGlvbixjKX1mdW5jdGlvbiB6ZChhLGIpe2EuYz0hMDthLmYucHVzaChiKX1mdW5jdGlvbiBBZChhLGIpe2EuYyYmd2QoYixmdW5jdGlvbihiKXtyZXR1cm4gYS5iKGIpfSl9eGQucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7aWYodGhpcy5jJiYhYS5fX0NFX3BhdGNoZWQpe2EuX19DRV9wYXRjaGVkPSEwO2Zvcih2YXIgYj0wO2I8dGhpcy5mLmxlbmd0aDtiKyspdGhpcy5mW2JdKGEpfX07ZnVuY3Rpb24gSihhLGIpe3ZhciBjPVtdO3dkKGIsZnVuY3Rpb24oYSl7cmV0dXJuIGMucHVzaChhKX0pO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07MT09PWQuX19DRV9zdGF0ZT9hLmNvbm5lY3RlZENhbGxiYWNrKGQpOkJkKGEsZCl9fQpmdW5jdGlvbiBLKGEsYil7dmFyIGM9W107d2QoYixmdW5jdGlvbihhKXtyZXR1cm4gYy5wdXNoKGEpfSk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTsxPT09ZC5fX0NFX3N0YXRlJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrKGQpfX0KZnVuY3Rpb24gTChhLGIsYyl7Yz12b2lkIDA9PT1jP3t9OmM7dmFyIGQ9Yy5YYXx8bmV3IFNldCxlPWMuWXx8ZnVuY3Rpb24oYil7cmV0dXJuIEJkKGEsYil9LGY9W107d2QoYixmdW5jdGlvbihiKXtpZigibGluayI9PT1iLmxvY2FsTmFtZSYmImltcG9ydCI9PT1iLmdldEF0dHJpYnV0ZSgicmVsIikpe3ZhciBjPWIuaW1wb3J0O2MgaW5zdGFuY2VvZiBOb2RlJiYoYy5fX0NFX2lzSW1wb3J0RG9jdW1lbnQ9ITAsYy5fX0NFX2hhc1JlZ2lzdHJ5PSEwKTtjJiYiY29tcGxldGUiPT09Yy5yZWFkeVN0YXRlP2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwOmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXt2YXIgYz1iLmltcG9ydDtpZighYy5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQpe2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwO3ZhciBmPW5ldyBTZXQoZCk7Zi5kZWxldGUoYyk7TChhLGMse1hhOmYsWTplfSl9fSl9ZWxzZSBmLnB1c2goYil9LGQpO2lmKGEuYylmb3IoYj0KMDtiPGYubGVuZ3RoO2IrKylhLmIoZltiXSk7Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyllKGZbYl0pfQpmdW5jdGlvbiBCZChhLGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGM9Yi5vd25lckRvY3VtZW50O2lmKGMuZGVmYXVsdFZpZXd8fGMuX19DRV9pc0ltcG9ydERvY3VtZW50JiZjLl9fQ0VfaGFzUmVnaXN0cnkpaWYoYz1hLmEuZ2V0KGIubG9jYWxOYW1lKSl7Yy5jb25zdHJ1Y3Rpb25TdGFjay5wdXNoKGIpO3ZhciBkPWMuY29uc3RydWN0b3JGdW5jdGlvbjt0cnl7dHJ5e2lmKG5ldyBkIT09Yil0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yIGRpZCBub3QgcHJvZHVjZSB0aGUgZWxlbWVudCBiZWluZyB1cGdyYWRlZC4iKTt9ZmluYWxseXtjLmNvbnN0cnVjdGlvblN0YWNrLnBvcCgpfX1jYXRjaChnKXt0aHJvdyBiLl9fQ0Vfc3RhdGU9MixnO31iLl9fQ0Vfc3RhdGU9MTtiLl9fQ0VfZGVmaW5pdGlvbj1jO2lmKGMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKWZvcihjPWMub2JzZXJ2ZWRBdHRyaWJ1dGVzLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9CmNbZF0sZj1iLmdldEF0dHJpYnV0ZShlKTtudWxsIT09ZiYmYS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYixlLG51bGwsZixudWxsKX1IKGIpJiZhLmNvbm5lY3RlZENhbGxiYWNrKGIpfX19eGQucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuY29ubmVjdGVkQ2FsbGJhY2smJmIuY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07eGQucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuZGlzY29ubmVjdGVkQ2FsbGJhY2smJmIuZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07CnhkLnByb3RvdHlwZS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLl9fQ0VfZGVmaW5pdGlvbjtmLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmLTE8Zi5vYnNlcnZlZEF0dHJpYnV0ZXMuaW5kZXhPZihiKSYmZi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2suY2FsbChhLGIsYyxkLGUpfTtmdW5jdGlvbiBDZChhKXt2YXIgYj1kb2N1bWVudDt0aGlzLmI9YTt0aGlzLmE9Yjt0aGlzLkY9dm9pZCAwO0wodGhpcy5iLHRoaXMuYSk7ImxvYWRpbmciPT09dGhpcy5hLnJlYWR5U3RhdGUmJih0aGlzLkY9bmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5jLmJpbmQodGhpcykpLHRoaXMuRi5vYnNlcnZlKHRoaXMuYSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSl9ZnVuY3Rpb24gRGQoYSl7YS5GJiZhLkYuZGlzY29ubmVjdCgpfUNkLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYS5yZWFkeVN0YXRlOyJpbnRlcmFjdGl2ZSIhPT1iJiYiY29tcGxldGUiIT09Ynx8RGQodGhpcyk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IodmFyIGM9YVtiXS5hZGRlZE5vZGVzLGQ9MDtkPGMubGVuZ3RoO2QrKylMKHRoaXMuYixjW2RdKX07ZnVuY3Rpb24gRWQoKXt2YXIgYT10aGlzO3RoaXMuYT10aGlzLmg9dm9pZCAwO3RoaXMuYj1uZXcgUHJvbWlzZShmdW5jdGlvbihiKXthLmE9YjthLmgmJmIoYS5oKX0pfUVkLnByb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuaCl0aHJvdyBFcnJvcigiQWxyZWFkeSByZXNvbHZlZC4iKTt0aGlzLmg9YTt0aGlzLmEmJnRoaXMuYShhKX07ZnVuY3Rpb24gTihhKXt0aGlzLmM9ITE7dGhpcy5hPWE7dGhpcy5sPW5ldyBNYXA7dGhpcy5mPWZ1bmN0aW9uKGEpe3JldHVybiBhKCl9O3RoaXMuYj0hMTt0aGlzLmc9W107dGhpcy5kYT1uZXcgQ2QoYSl9bj1OLnByb3RvdHlwZTsKbi5zYT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7aWYoIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoIkN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9ycyBtdXN0IGJlIGZ1bmN0aW9ucy4iKTtpZighdWQoYSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJUaGUgZWxlbWVudCBuYW1lICciK2ErIicgaXMgbm90IHZhbGlkLiIpO2lmKHRoaXMuYS5hLmdldChhKSl0aHJvdyBFcnJvcigiQSBjdXN0b20gZWxlbWVudCB3aXRoIG5hbWUgJyIrYSsiJyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIik7aWYodGhpcy5jKXRocm93IEVycm9yKCJBIGN1c3RvbSBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgZGVmaW5lZC4iKTt0aGlzLmM9ITA7dHJ5e3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWVbYV07aWYodm9pZCAwIT09YiYmIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IEVycm9yKCJUaGUgJyIrYSsiJyBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24uIik7CnJldHVybiBifSxlPWIucHJvdG90eXBlO2lmKCEoZSBpbnN0YW5jZW9mIE9iamVjdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIGlzIG5vdCBhbiBvYmplY3QuIik7dmFyIGY9ZCgiY29ubmVjdGVkQ2FsbGJhY2siKTt2YXIgZz1kKCJkaXNjb25uZWN0ZWRDYWxsYmFjayIpO3ZhciBoPWQoImFkb3B0ZWRDYWxsYmFjayIpO3ZhciBrPWQoImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayIpO3ZhciBsPWIub2JzZXJ2ZWRBdHRyaWJ1dGVzfHxbXX1jYXRjaChtKXtyZXR1cm59ZmluYWxseXt0aGlzLmM9ITF9Yj17bG9jYWxOYW1lOmEsY29uc3RydWN0b3JGdW5jdGlvbjpiLGNvbm5lY3RlZENhbGxiYWNrOmYsZGlzY29ubmVjdGVkQ2FsbGJhY2s6ZyxhZG9wdGVkQ2FsbGJhY2s6aCxhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s6ayxvYnNlcnZlZEF0dHJpYnV0ZXM6bCxjb25zdHJ1Y3Rpb25TdGFjazpbXX07eWQodGhpcy5hLAphLGIpO3RoaXMuZy5wdXNoKGIpO3RoaXMuYnx8KHRoaXMuYj0hMCx0aGlzLmYoZnVuY3Rpb24oKXtyZXR1cm4gRmQoYyl9KSl9O24uWT1mdW5jdGlvbihhKXtMKHRoaXMuYSxhKX07CmZ1bmN0aW9uIEZkKGEpe2lmKCExIT09YS5iKXthLmI9ITE7Zm9yKHZhciBiPWEuZyxjPVtdLGQ9bmV3IE1hcCxlPTA7ZTxiLmxlbmd0aDtlKyspZC5zZXQoYltlXS5sb2NhbE5hbWUsW10pO0woYS5hLGRvY3VtZW50LHtZOmZ1bmN0aW9uKGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGU9Yi5sb2NhbE5hbWUsZj1kLmdldChlKTtmP2YucHVzaChiKTphLmEuYS5nZXQoZSkmJmMucHVzaChiKX19fSk7Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKylCZChhLmEsY1tlXSk7Zm9yKDswPGIubGVuZ3RoOyl7dmFyIGY9Yi5zaGlmdCgpO2U9Zi5sb2NhbE5hbWU7Zj1kLmdldChmLmxvY2FsTmFtZSk7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspQmQoYS5hLGZbZ10pOyhlPWEubC5nZXQoZSkpJiZlLnJlc29sdmUodm9pZCAwKX19fW4uZ2V0PWZ1bmN0aW9uKGEpe2lmKGE9dGhpcy5hLmEuZ2V0KGEpKXJldHVybiBhLmNvbnN0cnVjdG9yRnVuY3Rpb259OwpuLnRhPWZ1bmN0aW9uKGEpe2lmKCF1ZChhKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN5bnRheEVycm9yKCInIithKyInIGlzIG5vdCBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUuIikpO3ZhciBiPXRoaXMubC5nZXQoYSk7aWYoYilyZXR1cm4gYi5iO2I9bmV3IEVkO3RoaXMubC5zZXQoYSxiKTt0aGlzLmEuYS5nZXQoYSkmJiF0aGlzLmcuc29tZShmdW5jdGlvbihiKXtyZXR1cm4gYi5sb2NhbE5hbWU9PT1hfSkmJmIucmVzb2x2ZSh2b2lkIDApO3JldHVybiBiLmJ9O24uUGE9ZnVuY3Rpb24oYSl7RGQodGhpcy5kYSk7dmFyIGI9dGhpcy5mO3RoaXMuZj1mdW5jdGlvbihjKXtyZXR1cm4gYShmdW5jdGlvbigpe3JldHVybiBiKGMpfSl9fTt3aW5kb3cuQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5PU47Ti5wcm90b3R5cGUuZGVmaW5lPU4ucHJvdG90eXBlLnNhO04ucHJvdG90eXBlLnVwZ3JhZGU9Ti5wcm90b3R5cGUuWTtOLnByb3RvdHlwZS5nZXQ9Ti5wcm90b3R5cGUuZ2V0OwpOLnByb3RvdHlwZS53aGVuRGVmaW5lZD1OLnByb3RvdHlwZS50YTtOLnByb3RvdHlwZS5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrPU4ucHJvdG90eXBlLlBhO3ZhciBHZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsSGQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50TlMsSWQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlLEpkPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUucHJlcGVuZCxLZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmFwcGVuZCxMZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucHJlcGVuZCxNZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuYXBwZW5kLE5kPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGUsT2Q9d2luZG93Lk5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkLFBkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsUWQ9d2luZG93Lk5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLFJkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQsU2Q9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsCiJ0ZXh0Q29udGVudCIpLFRkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3csVWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpLFZkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUsV2Q9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSxYZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLFlkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVOUyxaZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMsJGQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TLGFlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQsYmU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTCxjZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucHJlcGVuZCwKZGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFwcGVuZCxlZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYmVmb3JlLGZlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hZnRlcixnZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVwbGFjZVdpdGgsaGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSxpZT13aW5kb3cuSFRNTEVsZW1lbnQsamU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSxrZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxsZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTDt2YXIgbWU9bmV3IGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBuZSgpe3ZhciBhPW9lO3dpbmRvdy5IVE1MRWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yLGQ9YS5nLmdldChiKTtpZighZCl0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGJlaW5nIGNvbnN0cnVjdGVkIHdhcyBub3QgcmVnaXN0ZXJlZCB3aXRoIGBjdXN0b21FbGVtZW50c2AuIik7dmFyIGU9ZC5jb25zdHJ1Y3Rpb25TdGFjaztpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGU9R2QuY2FsbChkb2N1bWVudCxkLmxvY2FsTmFtZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsYi5wcm90b3R5cGUpLGUuX19DRV9zdGF0ZT0xLGUuX19DRV9kZWZpbml0aW9uPWQsYS5iKGUpLGU7ZD1lLmxlbmd0aC0xO3ZhciBmPWVbZF07aWYoZj09PW1lKXRocm93IEVycm9yKCJUaGUgSFRNTEVsZW1lbnQgY29uc3RydWN0b3Igd2FzIGVpdGhlciBjYWxsZWQgcmVlbnRyYW50bHkgZm9yIHRoaXMgY29uc3RydWN0b3Igb3IgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiIpOwplW2RdPW1lO09iamVjdC5zZXRQcm90b3R5cGVPZihmLGIucHJvdG90eXBlKTthLmIoZik7cmV0dXJuIGZ9Yi5wcm90b3R5cGU9aWUucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSwiY29uc3RydWN0b3IiLHt3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpifSk7cmV0dXJuIGJ9KCl9O2Z1bmN0aW9uIHBlKGEsYixjKXtmdW5jdGlvbiBkKGIpe3JldHVybiBmdW5jdGlvbihjKXtmb3IodmFyIGQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDsrK2UpZFtlXT1hcmd1bWVudHNbZV07ZT1bXTtmb3IodmFyIGY9W10sbD0wO2w8ZC5sZW5ndGg7bCsrKXt2YXIgbT1kW2xdO20gaW5zdGFuY2VvZiBFbGVtZW50JiZIKG0pJiZmLnB1c2gobSk7aWYobSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKG09bS5maXJzdENoaWxkO207bT1tLm5leHRTaWJsaW5nKWUucHVzaChtKTtlbHNlIGUucHVzaChtKX1iLmFwcGx5KHRoaXMsZCk7Zm9yKGQ9MDtkPGYubGVuZ3RoO2QrKylLKGEsZltkXSk7aWYoSCh0aGlzKSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKWY9ZVtkXSxmIGluc3RhbmNlb2YgRWxlbWVudCYmSihhLGYpfX12b2lkIDAhPT1jLlYmJihiLnByZXBlbmQ9ZChjLlYpKTt2b2lkIDAhPT1jLmFwcGVuZCYmKGIuYXBwZW5kPWQoYy5hcHBlbmQpKX07ZnVuY3Rpb24gcWUoKXt2YXIgYT1vZTtJKERvY3VtZW50LnByb3RvdHlwZSwiY3JlYXRlRWxlbWVudCIsZnVuY3Rpb24oYil7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5KXt2YXIgYz1hLmEuZ2V0KGIpO2lmKGMpcmV0dXJuIG5ldyBjLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1HZC5jYWxsKHRoaXMsYik7YS5iKGIpO3JldHVybiBifSk7SShEb2N1bWVudC5wcm90b3R5cGUsImltcG9ydE5vZGUiLGZ1bmN0aW9uKGIsYyl7Yj1JZC5jYWxsKHRoaXMsYiwhIWMpO3RoaXMuX19DRV9oYXNSZWdpc3RyeT9MKGEsYik6QWQoYSxiKTtyZXR1cm4gYn0pO0koRG9jdW1lbnQucHJvdG90eXBlLCJjcmVhdGVFbGVtZW50TlMiLGZ1bmN0aW9uKGIsYyl7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5JiYobnVsbD09PWJ8fCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PWIpKXt2YXIgZD1hLmEuZ2V0KGMpO2lmKGQpcmV0dXJuIG5ldyBkLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1IZC5jYWxsKHRoaXMsCmIsYyk7YS5iKGIpO3JldHVybiBifSk7cGUoYSxEb2N1bWVudC5wcm90b3R5cGUse1Y6SmQsYXBwZW5kOktkfSl9O2Z1bmN0aW9uIHJlKCl7ZnVuY3Rpb24gYShhLGQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJ0ZXh0Q29udGVudCIse2VudW1lcmFibGU6ZC5lbnVtZXJhYmxlLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZC5nZXQsc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSlkLnNldC5jYWxsKHRoaXMsYSk7ZWxzZXt2YXIgYz12b2lkIDA7aWYodGhpcy5maXJzdENoaWxkKXt2YXIgZT10aGlzLmNoaWxkTm9kZXMsaD1lLmxlbmd0aDtpZigwPGgmJkgodGhpcykpe2M9QXJyYXkoaCk7Zm9yKHZhciBrPTA7azxoO2srKyljW2tdPWVba119fWQuc2V0LmNhbGwodGhpcyxhKTtpZihjKWZvcihhPTA7YTxjLmxlbmd0aDthKyspSyhiLGNbYV0pfX19KX12YXIgYj1vZTtJKE5vZGUucHJvdG90eXBlLCJpbnNlcnRCZWZvcmUiLGZ1bmN0aW9uKGEsZCl7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhLmNoaWxkTm9kZXMpOwphPVBkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylKKGIsY1tkXSk7cmV0dXJuIGF9Yz1IKGEpO2Q9UGQuY2FsbCh0aGlzLGEsZCk7YyYmSyhiLGEpO0godGhpcykmJkooYixhKTtyZXR1cm4gZH0pO0koTm9kZS5wcm90b3R5cGUsImFwcGVuZENoaWxkIixmdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGEuY2hpbGROb2Rlcyk7YT1PZC5jYWxsKHRoaXMsYSk7aWYoSCh0aGlzKSlmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKylKKGIsY1tlXSk7cmV0dXJuIGF9Yz1IKGEpO2U9T2QuY2FsbCh0aGlzLGEpO2MmJksoYixhKTtIKHRoaXMpJiZKKGIsYSk7cmV0dXJuIGV9KTtJKE5vZGUucHJvdG90eXBlLCJjbG9uZU5vZGUiLGZ1bmN0aW9uKGEpe2E9TmQuY2FsbCh0aGlzLCEhYSk7dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk/TChiLGEpOgpBZChiLGEpO3JldHVybiBhfSk7SShOb2RlLnByb3RvdHlwZSwicmVtb3ZlQ2hpbGQiLGZ1bmN0aW9uKGEpe3ZhciBjPUgoYSksZT1RZC5jYWxsKHRoaXMsYSk7YyYmSyhiLGEpO3JldHVybiBlfSk7SShOb2RlLnByb3RvdHlwZSwicmVwbGFjZUNoaWxkIixmdW5jdGlvbihhLGQpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTthPVJkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKEsoYixkKSxkPTA7ZDxjLmxlbmd0aDtkKyspSihiLGNbZF0pO3JldHVybiBhfWM9SChhKTt2YXIgZj1SZC5jYWxsKHRoaXMsYSxkKSxnPUgodGhpcyk7ZyYmSyhiLGQpO2MmJksoYixhKTtnJiZKKGIsYSk7cmV0dXJuIGZ9KTtTZCYmU2QuZ2V0P2EoTm9kZS5wcm90b3R5cGUsU2QpOnpkKGIsZnVuY3Rpb24oYil7YShiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9MDtiPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7YisrKWEucHVzaCh0aGlzLmNoaWxkTm9kZXNbYl0udGV4dENvbnRlbnQpO3JldHVybiBhLmpvaW4oIiIpfSxzZXQ6ZnVuY3Rpb24oYSl7Zm9yKDt0aGlzLmZpcnN0Q2hpbGQ7KVFkLmNhbGwodGhpcyx0aGlzLmZpcnN0Q2hpbGQpO09kLmNhbGwodGhpcyxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSl9fSl9KX07ZnVuY3Rpb24gc2UoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gZnVuY3Rpb24oYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7KytlKWRbZV09YXJndW1lbnRzW2VdO2U9W107Zm9yKHZhciBoPVtdLGs9MDtrPGQubGVuZ3RoO2srKyl7dmFyIGw9ZFtrXTtsIGluc3RhbmNlb2YgRWxlbWVudCYmSChsKSYmaC5wdXNoKGwpO2lmKGwgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihsPWwuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZyllLnB1c2gobCk7ZWxzZSBlLnB1c2gobCl9Yi5hcHBseSh0aGlzLGQpO2ZvcihkPTA7ZDxoLmxlbmd0aDtkKyspSyhhLGhbZF0pO2lmKEgodGhpcykpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyloPWVbZF0saCBpbnN0YW5jZW9mIEVsZW1lbnQmJkooYSxoKX19dmFyIGM9RWxlbWVudC5wcm90b3R5cGU7dm9pZCAwIT09ZWUmJihjLmJlZm9yZT1iKGVlKSk7dm9pZCAwIT09ZWUmJihjLmFmdGVyPWIoZmUpKTt2b2lkIDAhPT1nZSYmCkkoYywicmVwbGFjZVdpdGgiLGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2RdPWFyZ3VtZW50c1tkXTtkPVtdO2Zvcih2YXIgZz1bXSxoPTA7aDxjLmxlbmd0aDtoKyspe3ZhciBrPWNbaF07ayBpbnN0YW5jZW9mIEVsZW1lbnQmJkgoaykmJmcucHVzaChrKTtpZihrIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3Ioaz1rLmZpcnN0Q2hpbGQ7aztrPWsubmV4dFNpYmxpbmcpZC5wdXNoKGspO2Vsc2UgZC5wdXNoKGspfWg9SCh0aGlzKTtnZS5hcHBseSh0aGlzLGMpO2ZvcihjPTA7YzxnLmxlbmd0aDtjKyspSyhhLGdbY10pO2lmKGgpZm9yKEsoYSx0aGlzKSxjPTA7YzxkLmxlbmd0aDtjKyspZz1kW2NdLGcgaW5zdGFuY2VvZiBFbGVtZW50JiZKKGEsZyl9KTt2b2lkIDAhPT1oZSYmSShjLCJyZW1vdmUiLGZ1bmN0aW9uKCl7dmFyIGI9SCh0aGlzKTtoZS5jYWxsKHRoaXMpO2ImJksoYSx0aGlzKX0pfTtmdW5jdGlvbiB0ZSgpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiaW5uZXJIVE1MIix7ZW51bWVyYWJsZTpiLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpiLmdldCxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxlPXZvaWQgMDtIKHRoaXMpJiYoZT1bXSx3ZCh0aGlzLGZ1bmN0aW9uKGEpe2EhPT1jJiZlLnB1c2goYSl9KSk7Yi5zZXQuY2FsbCh0aGlzLGEpO2lmKGUpZm9yKHZhciBmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl07MT09PWcuX19DRV9zdGF0ZSYmZC5kaXNjb25uZWN0ZWRDYWxsYmFjayhnKX10aGlzLm93bmVyRG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT9MKGQsdGhpcyk6QWQoZCx0aGlzKTtyZXR1cm4gYX19KX1mdW5jdGlvbiBiKGEsYil7SShhLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLGZ1bmN0aW9uKGEsYyl7dmFyIGU9SChjKTthPWIuY2FsbCh0aGlzLGEsYyk7ZSYmSyhkLGMpO0goYSkmJkooZCxjKTtyZXR1cm4gYX0pfQpmdW5jdGlvbiBjKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2Zvcih2YXIgYz1bXTthIT09YjthPWEubmV4dFNpYmxpbmcpYy5wdXNoKGEpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspTChkLGNbYl0pfUkoYSwiaW5zZXJ0QWRqYWNlbnRIVE1MIixmdW5jdGlvbihhLGQpe2E9YS50b0xvd2VyQ2FzZSgpO2lmKCJiZWZvcmViZWdpbiI9PT1hKXt2YXIgZT10aGlzLnByZXZpb3VzU2libGluZztiLmNhbGwodGhpcyxhLGQpO2MoZXx8dGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsdGhpcyl9ZWxzZSBpZigiYWZ0ZXJiZWdpbiI9PT1hKWU9dGhpcy5maXJzdENoaWxkLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLmZpcnN0Q2hpbGQsZSk7ZWxzZSBpZigiYmVmb3JlZW5kIj09PWEpZT10aGlzLmxhc3RDaGlsZCxiLmNhbGwodGhpcyxhLGQpLGMoZXx8dGhpcy5maXJzdENoaWxkLG51bGwpO2Vsc2UgaWYoImFmdGVyZW5kIj09PWEpZT10aGlzLm5leHRTaWJsaW5nLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLm5leHRTaWJsaW5nLAplKTtlbHNlIHRocm93IG5ldyBTeW50YXhFcnJvcigiVGhlIHZhbHVlIHByb3ZpZGVkICgiK1N0cmluZyhhKSsiKSBpcyBub3Qgb25lIG9mICdiZWZvcmViZWdpbicsICdhZnRlcmJlZ2luJywgJ2JlZm9yZWVuZCcsIG9yICdhZnRlcmVuZCcuIik7fSl9dmFyIGQ9b2U7VGQmJkkoRWxlbWVudC5wcm90b3R5cGUsImF0dGFjaFNoYWRvdyIsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19DRV9zaGFkb3dSb290PWE9VGQuY2FsbCh0aGlzLGEpfSk7VWQmJlVkLmdldD9hKEVsZW1lbnQucHJvdG90eXBlLFVkKTpqZSYmamUuZ2V0P2EoSFRNTEVsZW1lbnQucHJvdG90eXBlLGplKTp6ZChkLGZ1bmN0aW9uKGIpe2EoYix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5kLmNhbGwodGhpcywhMCkuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lLGM9Yj90aGlzLmNvbnRlbnQ6dGhpcyxkPUhkLmNhbGwoZG9jdW1lbnQsCnRoaXMubmFtZXNwYWNlVVJJLHRoaXMubG9jYWxOYW1lKTtmb3IoZC5pbm5lckhUTUw9YTswPGMuY2hpbGROb2Rlcy5sZW5ndGg7KVFkLmNhbGwoYyxjLmNoaWxkTm9kZXNbMF0pO2ZvcihhPWI/ZC5jb250ZW50OmQ7MDxhLmNoaWxkTm9kZXMubGVuZ3RoOylPZC5jYWxsKGMsYS5jaGlsZE5vZGVzWzBdKX19KX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSIsZnVuY3Rpb24oYSxiKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBXZC5jYWxsKHRoaXMsYSxiKTt2YXIgYz1WZC5jYWxsKHRoaXMsYSk7V2QuY2FsbCh0aGlzLGEsYik7Yj1WZC5jYWxsKHRoaXMsYSk7ZC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGMsYixudWxsKX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZU5TIixmdW5jdGlvbihhLGIsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gWmQuY2FsbCh0aGlzLGEsYixjKTt2YXIgZT1ZZC5jYWxsKHRoaXMsYSwKYik7WmQuY2FsbCh0aGlzLGEsYixjKTtjPVlkLmNhbGwodGhpcyxhLGIpO2QuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixlLGMsYSl9KTtJKEVsZW1lbnQucHJvdG90eXBlLCJyZW1vdmVBdHRyaWJ1dGUiLGZ1bmN0aW9uKGEpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIFhkLmNhbGwodGhpcyxhKTt2YXIgYj1WZC5jYWxsKHRoaXMsYSk7WGQuY2FsbCh0aGlzLGEpO251bGwhPT1iJiZkLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGEsYixudWxsLG51bGwpfSk7SShFbGVtZW50LnByb3RvdHlwZSwicmVtb3ZlQXR0cmlidXRlTlMiLGZ1bmN0aW9uKGEsYil7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gJGQuY2FsbCh0aGlzLGEsYik7dmFyIGM9WWQuY2FsbCh0aGlzLGEsYik7JGQuY2FsbCh0aGlzLGEsYik7dmFyIGU9WWQuY2FsbCh0aGlzLGEsYik7YyE9PWUmJmQuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixjLGUsYSl9KTtrZT9iKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKa2UpOmFlP2IoRWxlbWVudC5wcm90b3R5cGUsYWUpOmNvbnNvbGUud2FybigiQ3VzdG9tIEVsZW1lbnRzOiBgRWxlbWVudCNpbnNlcnRBZGphY2VudEVsZW1lbnRgIHdhcyBub3QgcGF0Y2hlZC4iKTtsZT9jKEhUTUxFbGVtZW50LnByb3RvdHlwZSxsZSk6YmU/YyhFbGVtZW50LnByb3RvdHlwZSxiZSk6Y29uc29sZS53YXJuKCJDdXN0b20gRWxlbWVudHM6IGBFbGVtZW50I2luc2VydEFkamFjZW50SFRNTGAgd2FzIG5vdCBwYXRjaGVkLiIpO3BlKGQsRWxlbWVudC5wcm90b3R5cGUse1Y6Y2UsYXBwZW5kOmRlfSk7c2UoZCl9O3ZhciB1ZT13aW5kb3cuY3VzdG9tRWxlbWVudHM7aWYoIXVlfHx1ZS5mb3JjZVBvbHlmaWxsfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZGVmaW5lfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZ2V0KXt2YXIgb2U9bmV3IHhkO25lKCk7cWUoKTtwZShvZSxEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx7VjpMZCxhcHBlbmQ6TWR9KTtyZSgpO3RlKCk7ZG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT0hMDt2YXIgY3VzdG9tRWxlbWVudHM9bmV3IE4ob2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImN1c3RvbUVsZW1lbnRzIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y3VzdG9tRWxlbWVudHN9KX07ZnVuY3Rpb24gdmUoKXt0aGlzLmVuZD10aGlzLnN0YXJ0PTA7dGhpcy5ydWxlcz10aGlzLnBhcmVudD10aGlzLnByZXZpb3VzPW51bGw7dGhpcy5jc3NUZXh0PXRoaXMucGFyc2VkQ3NzVGV4dD0iIjt0aGlzLmF0UnVsZT0hMTt0aGlzLnR5cGU9MDt0aGlzLnBhcnNlZFNlbGVjdG9yPXRoaXMuc2VsZWN0b3I9dGhpcy5rZXlmcmFtZXNOYW1lPSIifQpmdW5jdGlvbiB3ZShhKXthPWEucmVwbGFjZSh4ZSwiIikucmVwbGFjZSh5ZSwiIik7dmFyIGI9emUsYz1hLGQ9bmV3IHZlO2Quc3RhcnQ9MDtkLmVuZD1jLmxlbmd0aDtmb3IodmFyIGU9ZCxmPTAsZz1jLmxlbmd0aDtmPGc7ZisrKWlmKCJ7Ij09PWNbZl0pe2UucnVsZXN8fChlLnJ1bGVzPVtdKTt2YXIgaD1lLGs9aC5ydWxlc1toLnJ1bGVzLmxlbmd0aC0xXXx8bnVsbDtlPW5ldyB2ZTtlLnN0YXJ0PWYrMTtlLnBhcmVudD1oO2UucHJldmlvdXM9aztoLnJ1bGVzLnB1c2goZSl9ZWxzZSJ9Ij09PWNbZl0mJihlLmVuZD1mKzEsZT1lLnBhcmVudHx8ZCk7cmV0dXJuIGIoZCxhKX0KZnVuY3Rpb24gemUoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPUFlKGMpLGM9Yy5yZXBsYWNlKEJlLCIgIiksYz1jLnN1YnN0cmluZyhjLmxhc3RJbmRleE9mKCI7IikrMSksYz1hLnBhcnNlZFNlbGVjdG9yPWEuc2VsZWN0b3I9Yy50cmltKCksYS5hdFJ1bGU9MD09PWMuaW5kZXhPZigiQCIpLGEuYXRSdWxlPzA9PT1jLmluZGV4T2YoIkBtZWRpYSIpP2EudHlwZT1DZTpjLm1hdGNoKERlKSYmKGEudHlwZT1FZSxhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdChCZSkucG9wKCkpOmEudHlwZT0wPT09Yy5pbmRleE9mKCItLSIpP0ZlOkdlKTtpZihjPWEucnVsZXMpZm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmPXZvaWQgMDtkPGUmJihmPWNbZF0pO2QrKyl6ZShmLApiKTtyZXR1cm4gYX1mdW5jdGlvbiBBZShhKXtyZXR1cm4gYS5yZXBsYWNlKC9cXChbMC05YS1mXXsxLDZ9KVxzL2dpLGZ1bmN0aW9uKGEsYyl7YT1jO2ZvcihjPTYtYS5sZW5ndGg7Yy0tOylhPSIwIithO3JldHVybiJcXCIrYX0pfQpmdW5jdGlvbiBIZShhLGIsYyl7Yz12b2lkIDA9PT1jPyIiOmM7dmFyIGQ9IiI7aWYoYS5jc3NUZXh0fHxhLnJ1bGVzKXt2YXIgZT1hLnJ1bGVzLGY7aWYoZj1lKWY9ZVswXSxmPSEoZiYmZi5zZWxlY3RvciYmMD09PWYuc2VsZWN0b3IuaW5kZXhPZigiLS0iKSk7aWYoZil7Zj0wO2Zvcih2YXIgZz1lLmxlbmd0aCxoPXZvaWQgMDtmPGcmJihoPWVbZl0pO2YrKylkPUhlKGgsYixkKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKEllLCIiKS5yZXBsYWNlKEplLCIiKSxiPWIucmVwbGFjZShLZSwiIikucmVwbGFjZShMZSwiIikpLChkPWIudHJpbSgpKSYmKGQ9IiAgIitkKyJcbiIpfWQmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWQsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEdlPTEsRWU9NyxDZT00LEZlPTFFMyx4ZT0vXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvL2dpbSx5ZT0vQGltcG9ydFteO10qOy9naW0sSWU9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/KD86Wztcbl18JCkvZ2ltLEplPS8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qP3tbXn1dKj99KD86Wztcbl18JCk/L2dpbSxLZT0vQGFwcGx5XHMqXCg/W14pO10qXCk/XHMqKD86Wztcbl18JCk/L2dpbSxMZT0vW147Ol0qPzpbXjtdKj92YXJcKFteO10qXCkoPzpbO1xuXXwkKT8vZ2ltLERlPS9eQFteXHNdKmtleWZyYW1lcy8sQmU9L1xzKy9nO3ZhciBPPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLE1lO2Z1bmN0aW9uIE5lKGEpe01lPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6T3x8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgT2U7d2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQmJihPZT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciBQZT0hKCF3aW5kb3cuU2hhZHlDU1N8fCF3aW5kb3cuU2hhZHlDU1MuZGlzYWJsZVJ1bnRpbWUpOwp3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M/TWU9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KE5lKHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6TmUod2luZG93LldlYkNvbXBvbmVudHMmJndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzKTt2YXIgUT1NZSxRZT1PZTt2YXIgUmU9Lyg/Ol58Wztcc3tdXHMqKSgtLVtcdy1dKj8pXHMqOlxzKig/OigoPzonKD86XFwnfC4pKj8nfCIoPzpcXCJ8LikqPyJ8XChbXildKj9cKXxbXn07e10pKyl8XHsoW159XSopXH0oPzooPz1bO1xzfV0pfCQpKS9naSxTZT0vKD86XnxcVyspQGFwcGx5XHMqXCg/KFteKTtcbl0qKVwpPy9naSxUZT0vKC0tW1x3LV0rKVxzKihbOiw7KV18JCkvZ2ksVWU9LyhhbmltYXRpb25ccyo6KXwoYW5pbWF0aW9uLW5hbWVccyo6KS8sJGU9L0BtZWRpYVxzKC4qKS8sYWY9L1x7W159XSpcfS9nO3ZhciBiZj1uZXcgU2V0O2Z1bmN0aW9uIGNmKGEsYil7aWYoIWEpcmV0dXJuIiI7InN0cmluZyI9PT10eXBlb2YgYSYmKGE9d2UoYSkpO2ImJmRmKGEsYik7cmV0dXJuIEhlKGEsUSl9ZnVuY3Rpb24gZWYoYSl7IWEuX19jc3NSdWxlcyYmYS50ZXh0Q29udGVudCYmKGEuX19jc3NSdWxlcz13ZShhLnRleHRDb250ZW50KSk7cmV0dXJuIGEuX19jc3NSdWxlc3x8bnVsbH1mdW5jdGlvbiBmZihhKXtyZXR1cm4hIWEucGFyZW50JiZhLnBhcmVudC50eXBlPT09RWV9ZnVuY3Rpb24gZGYoYSxiLGMsZCl7aWYoYSl7dmFyIGU9ITEsZj1hLnR5cGU7aWYoZCYmZj09PUNlKXt2YXIgZz1hLnNlbGVjdG9yLm1hdGNoKCRlKTtnJiYod2luZG93Lm1hdGNoTWVkaWEoZ1sxXSkubWF0Y2hlc3x8KGU9ITApKX1mPT09R2U/YihhKTpjJiZmPT09RWU/YyhhKTpmPT09RmUmJihlPSEwKTtpZigoYT1hLnJ1bGVzKSYmIWUpZm9yKGU9MCxmPWEubGVuZ3RoLGc9dm9pZCAwO2U8ZiYmKGc9YVtlXSk7ZSsrKWRmKGcsYixjLGQpfX0KZnVuY3Rpb24gZ2YoYSxiLGMsZCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiJiZlLnNldEF0dHJpYnV0ZSgic2NvcGUiLGIpO2UudGV4dENvbnRlbnQ9YTtoZihlLGMsZCk7cmV0dXJuIGV9dmFyIGpmPW51bGw7ZnVuY3Rpb24ga2YoYSl7YT1kb2N1bWVudC5jcmVhdGVDb21tZW50KCIgU2hhZHkgRE9NIHN0eWxlcyBmb3IgIithKyIgIik7dmFyIGI9ZG9jdW1lbnQuaGVhZDtiLmluc2VydEJlZm9yZShhLChqZj9qZi5uZXh0U2libGluZzpudWxsKXx8Yi5maXJzdENoaWxkKTtyZXR1cm4gamY9YX1mdW5jdGlvbiBoZihhLGIsYyl7Yj1ifHxkb2N1bWVudC5oZWFkO2IuaW5zZXJ0QmVmb3JlKGEsYyYmYy5uZXh0U2libGluZ3x8Yi5maXJzdENoaWxkKTtqZj9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGpmKT09PU5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HJiYoamY9YSk6amY9YX0KZnVuY3Rpb24gbGYoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2I8ZDtiKyspaWYoIigiPT09YVtiXSljKys7ZWxzZSBpZigiKSI9PT1hW2JdJiYwPT09LS1jKXJldHVybiBiO3JldHVybi0xfWZ1bmN0aW9uIG1mKGEsYil7dmFyIGM9YS5pbmRleE9mKCJ2YXIoIik7aWYoLTE9PT1jKXJldHVybiBiKGEsIiIsIiIsIiIpO3ZhciBkPWxmKGEsYyszKSxlPWEuc3Vic3RyaW5nKGMrNCxkKTtjPWEuc3Vic3RyaW5nKDAsYyk7YT1tZihhLnN1YnN0cmluZyhkKzEpLGIpO2Q9ZS5pbmRleE9mKCIsIik7cmV0dXJuLTE9PT1kP2IoYyxlLnRyaW0oKSwiIixhKTpiKGMsZS5zdWJzdHJpbmcoMCxkKS50cmltKCksZS5zdWJzdHJpbmcoZCsxKS50cmltKCksYSl9ZnVuY3Rpb24gbmYoYSxiKXtPP2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsYik6d2luZG93LlNoYWR5RE9NLm5hdGl2ZU1ldGhvZHMuc2V0QXR0cmlidXRlLmNhbGwoYSwiY2xhc3MiLGIpfQp2YXIgb2Y9d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00ud3JhcHx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2Z1bmN0aW9uIHBmKGEpe3ZhciBiPWEubG9jYWxOYW1lLGM9IiI7Yj8tMTxiLmluZGV4T2YoIi0iKXx8KGM9YixiPWEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZSgiaXMiKXx8IiIpOihiPWEuaXMsYz1hLmV4dGVuZHMpO3JldHVybntpczpiLE06Y319ZnVuY3Rpb24gcWYoYSl7Zm9yKHZhciBiPVtdLGM9IiIsZD0wOzA8PWQmJmQ8YS5sZW5ndGg7ZCsrKWlmKCIoIj09PWFbZF0pe3ZhciBlPWxmKGEsZCk7Yys9YS5zbGljZShkLGUrMSk7ZD1lfWVsc2UiLCI9PT1hW2RdPyhiLnB1c2goYyksYz0iIik6Yys9YVtkXTtjJiZiLnB1c2goYyk7cmV0dXJuIGJ9CmZ1bmN0aW9uIHJmKGEpe2lmKHZvaWQgMCE9PVFlKXJldHVybiBRZTtpZih2b2lkIDA9PT1hLl9fY3NzQnVpbGQpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJjc3MtYnVpbGQiKTtpZihiKWEuX19jc3NCdWlsZD1iO2Vsc2V7YTp7Yj0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2lmKGIgaW5zdGFuY2VvZiBDb21tZW50JiYoYj1iLnRleHRDb250ZW50LnRyaW0oKS5zcGxpdCgiOiIpLCJjc3MtYnVpbGQiPT09YlswXSkpe2I9YlsxXTticmVhayBhfWI9IiJ9aWYoIiIhPT1iKXt2YXIgYz0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKX1hLl9fY3NzQnVpbGQ9Yn19cmV0dXJuIGEuX19jc3NCdWlsZHx8IiJ9CmZ1bmN0aW9uIHNmKGEpe2E9dm9pZCAwPT09YT8iIjphO3JldHVybiIiIT09YSYmUT9PPyJzaGFkb3ciPT09YToic2hhZHkiPT09YTohMX07ZnVuY3Rpb24gdGYoKXt9ZnVuY3Rpb24gdWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIil9KX1mdW5jdGlvbiB2ZihhLGIsYyl7Yi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZjKGIpO3ZhciBkOyJ0ZW1wbGF0ZSI9PT1iLmxvY2FsTmFtZT9kPShiLmNvbnRlbnR8fGIuX2NvbnRlbnR8fGIpLmNoaWxkTm9kZXM6ZD1iLmNoaWxkcmVufHxiLmNoaWxkTm9kZXM7aWYoZClmb3IoYj0wO2I8ZC5sZW5ndGg7YisrKXZmKGEsZFtiXSxjKX0KZnVuY3Rpb24gd2YoYSxiLGMpe2lmKGIpaWYoYS5jbGFzc0xpc3QpYz8oYS5jbGFzc0xpc3QucmVtb3ZlKCJzdHlsZS1zY29wZSIpLGEuY2xhc3NMaXN0LnJlbW92ZShiKSk6KGEuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSxhLmNsYXNzTGlzdC5hZGQoYikpO2Vsc2UgaWYoYS5nZXRBdHRyaWJ1dGUpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpO2M/ZCYmKGI9ZC5yZXBsYWNlKCJzdHlsZS1zY29wZSIsIiIpLnJlcGxhY2UoYiwiIiksbmYoYSxiKSk6bmYoYSwoZD9kKyIgIjoiIikrInN0eWxlLXNjb3BlICIrYil9fWZ1bmN0aW9uIHhmKGEsYixjKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxiLCEwKTt3ZihhLGMpfSl9ZnVuY3Rpb24geWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIiwhMCl9KX0KZnVuY3Rpb24gemYoYSxiLGMsZCxlKXt2YXIgZj1SO2U9dm9pZCAwPT09ZT8iIjplOyIiPT09ZSYmKE98fCJzaGFkeSI9PT0odm9pZCAwPT09ZD8iIjpkKT9lPWNmKGIsYyk6KGE9cGYoYSksZT1BZihmLGIsYS5pcyxhLk0sYykrIlxuXG4iKSk7cmV0dXJuIGUudHJpbSgpfWZ1bmN0aW9uIEFmKGEsYixjLGQsZSl7dmFyIGY9QmYoYyxkKTtjPWM/Ii4iK2M6IiI7cmV0dXJuIGNmKGIsZnVuY3Rpb24oYil7Yi5jfHwoYi5zZWxlY3Rvcj1iLmo9Q2YoYSxiLGEuYixjLGYpLGIuYz0hMCk7ZSYmZShiLGMsZil9KX1mdW5jdGlvbiBCZihhLGIpe3JldHVybiBiPyJbaXM9IithKyJdIjphfQpmdW5jdGlvbiBDZihhLGIsYyxkLGUpe3ZhciBmPXFmKGIuc2VsZWN0b3IpO2lmKCFmZihiKSl7Yj0wO2Zvcih2YXIgZz1mLmxlbmd0aCxoPXZvaWQgMDtiPGcmJihoPWZbYl0pO2IrKylmW2JdPWMuY2FsbChhLGgsZCxlKX1yZXR1cm4gZi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuISFhfSkuam9pbigiLCIpfWZ1bmN0aW9uIERmKGEpe3JldHVybiBhLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxjLGQpey0xPGQuaW5kZXhPZigiKyIpP2Q9ZC5yZXBsYWNlKC9cKy9nLCJfX18iKTotMTxkLmluZGV4T2YoIl9fXyIpJiYoZD1kLnJlcGxhY2UoL19fXy9nLCIrIikpO3JldHVybiI6IitjKyIoIitkKyIpIn0pfQpmdW5jdGlvbiBGZihhKXtmb3IodmFyIGI9W10sYztjPWEubWF0Y2goR2YpOyl7dmFyIGQ9Yy5pbmRleCxlPWxmKGEsZCk7aWYoLTE9PT1lKXRocm93IEVycm9yKGMuaW5wdXQrIiBzZWxlY3RvciBtaXNzaW5nICcpJyIpO2M9YS5zbGljZShkLGUrMSk7YT1hLnJlcGxhY2UoYywiXHVlMDAwIik7Yi5wdXNoKGMpfXJldHVybntoYTphLG1hdGNoZXM6Yn19ZnVuY3Rpb24gSGYoYSxiKXt2YXIgYz1hLnNwbGl0KCJcdWUwMDAiKTtyZXR1cm4gYi5yZWR1Y2UoZnVuY3Rpb24oYSxiLGYpe3JldHVybiBhK2IrY1tmKzFdfSxjWzBdKX0KdGYucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSExO2E9YS50cmltKCk7dmFyIGU9RWYudGVzdChhKTtlJiYoYT1hLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxiLGMpe3JldHVybiI6IitiKyIoIitjLnJlcGxhY2UoL1xzL2csIiIpKyIpIn0pLGE9RGYoYSkpO3ZhciBmPUdmLnRlc3QoYSk7aWYoZil7dmFyIGc9RmYoYSk7YT1nLmhhO2c9Zy5tYXRjaGVzfWE9YS5yZXBsYWNlKElmLCI6aG9zdCAkMSIpO2E9YS5yZXBsYWNlKEpmLGZ1bmN0aW9uKGEsZSxmKXtkfHwoYT1LZihmLGUsYixjKSxkPWR8fGEuc3RvcCxlPWEuQ2EsZj1hLnZhbHVlKTtyZXR1cm4gZStmfSk7ZiYmKGE9SGYoYSxnKSk7ZSYmKGE9RGYoYSkpO3JldHVybiBhfTsKZnVuY3Rpb24gS2YoYSxiLGMsZCl7dmFyIGU9YS5pbmRleE9mKCI6OnNsb3R0ZWQiKTswPD1hLmluZGV4T2YoIjpob3N0Iik/YT1MZihhLGQpOjAhPT1lJiYoYT1jP01mKGEsYyk6YSk7Yz0hMTswPD1lJiYoYj0iIixjPSEwKTtpZihjKXt2YXIgZj0hMDtjJiYoYT1hLnJlcGxhY2UoTmYsZnVuY3Rpb24oYSxiKXtyZXR1cm4iID4gIitifSkpfWE9YS5yZXBsYWNlKE9mLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4nW2Rpcj0iJytjKyciXSAnK2IrIiwgIitiKydbZGlyPSInK2MrJyJdJ30pO3JldHVybnt2YWx1ZTphLENhOmIsc3RvcDpmfX0KZnVuY3Rpb24gTWYoYSxiKXthPWEuc3BsaXQoLyhcWy4rP1xdKS8pO2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspaWYoMT09PWQlMiljLnB1c2goYVtkXSk7ZWxzZXt2YXIgZT1hW2RdO2lmKCIiIT09ZXx8ZCE9PWEubGVuZ3RoLTEpZT1lLnNwbGl0KCI6IiksZVswXSs9YixjLnB1c2goZS5qb2luKCI6IikpfXJldHVybiBjLmpvaW4oIiIpfWZ1bmN0aW9uIExmKGEsYil7dmFyIGM9YS5tYXRjaChQZik7cmV0dXJuKGM9YyYmY1syXS50cmltKCl8fCIiKT9jWzBdLm1hdGNoKFFmKT9hLnJlcGxhY2UoUGYsZnVuY3Rpb24oYSxjLGYpe3JldHVybiBiK2Z9KTpjLnNwbGl0KFFmKVswXT09PWI/Yzoic2hvdWxkX25vdF9tYXRjaCI6YS5yZXBsYWNlKCI6aG9zdCIsYil9ZnVuY3Rpb24gUmYoYSl7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSJodG1sIil9CnRmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLm1hdGNoKCI6aG9zdCIpPyIiOmEubWF0Y2goIjo6c2xvdHRlZCIpP3RoaXMuYihhLCI6bm90KC5zdHlsZS1zY29wZSkiKTpNZihhLnRyaW0oKSwiOm5vdCguc3R5bGUtc2NvcGUpIil9O3AuT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGYucHJvdG90eXBlLHthOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ic3R5bGUtc2NvcGUifX19KTsKdmFyIEVmPS86KG50aFstXHddKylcKChbXildKylcKS8sSmY9LyhefFtccz4rfl0rKSgoPzpcWy4rP1xdfFteXHM+K349W10pKykvZyxRZj0vW1suOiMqXS8sSWY9L14oOjpzbG90dGVkKS8sUGY9Lyg6aG9zdCkoPzpcKCgoPzpcKFteKShdKlwpfFteKShdKikrPylcKSkvLE5mPS8oPzo6OnNsb3R0ZWQpKD86XCgoKD86XChbXikoXSpcKXxbXikoXSopKz8pXCkpLyxPZj0vKC4qKTpkaXJcKCg/OihsdHJ8cnRsKSlcKS8sR2Y9LzooPzptYXRjaGVzfGFueXwtKD86d2Via2l0fG1veiktYW55KS8sUj1uZXcgdGY7ZnVuY3Rpb24gU2YoYSxiLGMsZCxlKXt0aGlzLkE9YXx8bnVsbDt0aGlzLmI9Ynx8bnVsbDt0aGlzLmZhPWN8fFtdO3RoaXMubz1udWxsO3RoaXMuY3NzQnVpbGQ9ZXx8IiI7dGhpcy5NPWR8fCIiO3RoaXMuYT10aGlzLnM9dGhpcy53PW51bGx9ZnVuY3Rpb24gVChhKXtyZXR1cm4gYT9hLl9fc3R5bGVJbmZvOm51bGx9ZnVuY3Rpb24gVGYoYSxiKXtyZXR1cm4gYS5fX3N0eWxlSW5mbz1ifVNmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX07U2YucHJvdG90eXBlLl9nZXRTdHlsZVJ1bGVzPVNmLnByb3RvdHlwZS5jO2Z1bmN0aW9uIFVmKGEpe3ZhciBiPXRoaXMubWF0Y2hlc3x8dGhpcy5tYXRjaGVzU2VsZWN0b3J8fHRoaXMubW96TWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm1zTWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm9NYXRjaGVzU2VsZWN0b3J8fHRoaXMud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBiJiZiLmNhbGwodGhpcyxhKX12YXIgVmY9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiVHJpZGVudCIpO2Z1bmN0aW9uIFdmKCl7fWZ1bmN0aW9uIFhmKGEpe3ZhciBiPXt9LGM9W10sZD0wO2RmKGEsZnVuY3Rpb24oYSl7WWYoYSk7YS5pbmRleD1kKys7YT1hLmkuY3NzVGV4dDtmb3IodmFyIGM7Yz1UZS5leGVjKGEpOyl7dmFyIGU9Y1sxXTsiOiIhPT1jWzJdJiYoYltlXT0hMCl9fSxmdW5jdGlvbihhKXtjLnB1c2goYSl9KTthLmI9YzthPVtdO2Zvcih2YXIgZSBpbiBiKWEucHVzaChlKTtyZXR1cm4gYX0KZnVuY3Rpb24gWWYoYSl7aWYoIWEuaSl7dmFyIGI9e30sYz17fTtaZihhLGMpJiYoYi52PWMsYS5ydWxlcz1udWxsKTtiLmNzc1RleHQ9YS5wYXJzZWRDc3NUZXh0LnJlcGxhY2UoYWYsIiIpLnJlcGxhY2UoUmUsIiIpO2EuaT1ifX1mdW5jdGlvbiBaZihhLGIpe3ZhciBjPWEuaTtpZihjKXtpZihjLnYpcmV0dXJuIE9iamVjdC5hc3NpZ24oYixjLnYpLCEwfWVsc2V7Yz1hLnBhcnNlZENzc1RleHQ7Zm9yKHZhciBkO2E9UmUuZXhlYyhjKTspe2Q9KGFbMl18fGFbM10pLnRyaW0oKTtpZigiaW5oZXJpdCIhPT1kfHwidW5zZXQiIT09ZCliW2FbMV0udHJpbSgpXT1kO2Q9ITB9cmV0dXJuIGR9fQpmdW5jdGlvbiAkZihhLGIsYyl7YiYmKGI9MDw9Yi5pbmRleE9mKCI7Iik/YWcoYSxiLGMpOm1mKGIsZnVuY3Rpb24oYixlLGYsZyl7aWYoIWUpcmV0dXJuIGIrZzsoZT0kZihhLGNbZV0sYykpJiYiaW5pdGlhbCIhPT1lPyJhcHBseS1zaGltLWluaGVyaXQiPT09ZSYmKGU9ImluaGVyaXQiKTplPSRmKGEsY1tmXXx8ZixjKXx8ZjtyZXR1cm4gYisoZXx8IiIpK2d9KSk7cmV0dXJuIGImJmIudHJpbSgpfHwiIn0KZnVuY3Rpb24gYWcoYSxiLGMpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgZD0wLGUsZjtkPGIubGVuZ3RoO2QrKylpZihlPWJbZF0pe1NlLmxhc3RJbmRleD0wO2lmKGY9U2UuZXhlYyhlKSllPSRmKGEsY1tmWzFdXSxjKTtlbHNlIGlmKGY9ZS5pbmRleE9mKCI6IiksLTEhPT1mKXt2YXIgZz1lLnN1YnN0cmluZyhmKTtnPWcudHJpbSgpO2c9JGYoYSxnLGMpfHxnO2U9ZS5zdWJzdHJpbmcoMCxmKStnfWJbZF09ZSYmZS5sYXN0SW5kZXhPZigiOyIpPT09ZS5sZW5ndGgtMT9lLnNsaWNlKDAsLTEpOmV8fCIifXJldHVybiBiLmpvaW4oIjsiKX0KZnVuY3Rpb24gYmcoYSxiKXt2YXIgYz17fSxkPVtdO2RmKGEsZnVuY3Rpb24oYSl7YS5pfHxZZihhKTt2YXIgZT1hLmp8fGEucGFyc2VkU2VsZWN0b3I7YiYmYS5pLnYmJmUmJlVmLmNhbGwoYixlKSYmKFpmKGEsYyksYT1hLmluZGV4LGU9cGFyc2VJbnQoYS8zMiwxMCksZFtlXT0oZFtlXXx8MCl8MTw8YSUzMil9LG51bGwsITApO3JldHVybnt2OmMsa2V5OmR9fQpmdW5jdGlvbiBjZyhhLGIsYyxkKXtiLml8fFlmKGIpO2lmKGIuaS52KXt2YXIgZT1wZihhKTthPWUuaXM7ZT1lLk07ZT1hP0JmKGEsZSk6Imh0bWwiO3ZhciBmPWIucGFyc2VkU2VsZWN0b3IsZz0iOmhvc3QgPiAqIj09PWZ8fCJodG1sIj09PWYsaD0wPT09Zi5pbmRleE9mKCI6aG9zdCIpJiYhZzsic2hhZHkiPT09YyYmKGc9Zj09PWUrIiA+ICouIitlfHwtMSE9PWYuaW5kZXhPZigiaHRtbCIpLGg9IWcmJjA9PT1mLmluZGV4T2YoZSkpO2lmKGd8fGgpYz1lLGgmJihiLmp8fChiLmo9Q2YoUixiLFIuYixhPyIuIithOiIiLGUpKSxjPWIuanx8ZSksZCh7aGE6YyxJYTpoLFphOmd9KX19ZnVuY3Rpb24gZGcoYSxiLGMpe3ZhciBkPXt9LGU9e307ZGYoYixmdW5jdGlvbihiKXtjZyhhLGIsYyxmdW5jdGlvbihjKXtVZi5jYWxsKGEuX2VsZW1lbnR8fGEsYy5oYSkmJihjLklhP1pmKGIsZCk6WmYoYixlKSl9KX0sbnVsbCwhMCk7cmV0dXJue1JhOmUsSGE6ZH19CmZ1bmN0aW9uIGVnKGEsYixjLGQpe3ZhciBlPXBmKGIpLGY9QmYoZS5pcyxlLk0pLGc9bmV3IFJlZ0V4cCgiKD86XnxbXi4jWzpdKSIrKGIuZXh0ZW5kcz8iXFwiK2Yuc2xpY2UoMCwtMSkrIlxcXSI6ZikrIigkfFsuOltcXHM+K35dKSIpLGg9VChiKTtlPWguQTtoPWguY3NzQnVpbGQ7dmFyIGs9ZmcoZSxkKTtyZXR1cm4gemYoYixlLGZ1bmN0aW9uKGIpe3ZhciBlPSIiO2IuaXx8WWYoYik7Yi5pLmNzc1RleHQmJihlPWFnKGEsYi5pLmNzc1RleHQsYykpO2IuY3NzVGV4dD1lO2lmKCFPJiYhZmYoYikmJmIuY3NzVGV4dCl7dmFyIGg9ZT1iLmNzc1RleHQ7bnVsbD09Yi5uYSYmKGIubmE9VWUudGVzdChlKSk7aWYoYi5uYSlpZihudWxsPT1iLlUpe2IuVT1bXTtmb3IodmFyIGwgaW4gayloPWtbbF0saD1oKGUpLGUhPT1oJiYoZT1oLGIuVS5wdXNoKGwpKX1lbHNle2ZvcihsPTA7bDxiLlUubGVuZ3RoOysrbCloPWtbYi5VW2xdXSxlPWgoZSk7aD1lfWIuY3NzVGV4dD1oO2Iuaj1iLmp8fApiLnNlbGVjdG9yO2U9Ii4iK2Q7bD1xZihiLmopO2g9MDtmb3IodmFyIE09bC5sZW5ndGgsVT12b2lkIDA7aDxNJiYoVT1sW2hdKTtoKyspbFtoXT1VLm1hdGNoKGcpP1UucmVwbGFjZShmLGUpOmUrIiAiK1U7Yi5zZWxlY3Rvcj1sLmpvaW4oIiwiKX19LGgpfWZ1bmN0aW9uIGZnKGEsYil7YT1hLmI7dmFyIGM9e307aWYoIU8mJmEpZm9yKHZhciBkPTAsZT1hW2RdO2Q8YS5sZW5ndGg7ZT1hWysrZF0pe3ZhciBmPWUsZz1iO2YuZj1uZXcgUmVnRXhwKCJcXGIiK2Yua2V5ZnJhbWVzTmFtZSsiKD8hXFxCfC0pIiwiZyIpO2YuYT1mLmtleWZyYW1lc05hbWUrIi0iK2c7Zi5qPWYuanx8Zi5zZWxlY3RvcjtmLnNlbGVjdG9yPWYuai5yZXBsYWNlKGYua2V5ZnJhbWVzTmFtZSxmLmEpO2NbZS5rZXlmcmFtZXNOYW1lXT1nZyhlKX1yZXR1cm4gY31mdW5jdGlvbiBnZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIucmVwbGFjZShhLmYsYS5hKX19CmZ1bmN0aW9uIGhnKGEsYil7dmFyIGM9aWcsZD1lZihhKTthLnRleHRDb250ZW50PWNmKGQsZnVuY3Rpb24oYSl7dmFyIGQ9YS5jc3NUZXh0PWEucGFyc2VkQ3NzVGV4dDthLmkmJmEuaS5jc3NUZXh0JiYoZD1kLnJlcGxhY2UoSWUsIiIpLnJlcGxhY2UoSmUsIiIpLGEuY3NzVGV4dD1hZyhjLGQsYikpfSl9cC5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZi5wcm90b3R5cGUse2E6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJ4LXNjb3BlIn19fSk7dmFyIGlnPW5ldyBXZjt2YXIgamc9e30sa2c9d2luZG93LmN1c3RvbUVsZW1lbnRzO2lmKGtnJiYhTyYmIVBlKXt2YXIgbGc9a2cuZGVmaW5lO2tnLmRlZmluZT1mdW5jdGlvbihhLGIsYyl7amdbYV18fChqZ1thXT1rZihhKSk7bGcuY2FsbChrZyxhLGIsYyl9fTtmdW5jdGlvbiBtZygpe3RoaXMuY2FjaGU9e319bWcucHJvdG90eXBlLnN0b3JlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuY2FjaGVbYV18fFtdO2UucHVzaCh7djpiLHN0eWxlRWxlbWVudDpjLHM6ZH0pOzEwMDxlLmxlbmd0aCYmZS5zaGlmdCgpO3RoaXMuY2FjaGVbYV09ZX07ZnVuY3Rpb24gbmcoKXt9dmFyIG9nPW5ldyBSZWdFeHAoUi5hKyJcXHMqKFteXFxzXSopIik7ZnVuY3Rpb24gcGcoYSl7cmV0dXJuKGE9KGEuY2xhc3NMaXN0JiZhLmNsYXNzTGlzdC52YWx1ZT9hLmNsYXNzTGlzdC52YWx1ZTphLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpLm1hdGNoKG9nKSk/YVsxXToiIn1mdW5jdGlvbiBxZyhhKXt2YXIgYj1vZihhKS5nZXRSb290Tm9kZSgpO3JldHVybiBiPT09YXx8Yj09PWEub3duZXJEb2N1bWVudD8iIjooYT1iLmhvc3QpP3BmKGEpLmlzOiIifQpmdW5jdGlvbiByZyhhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXTtpZihjLnRhcmdldCE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmYy50YXJnZXQhPT1kb2N1bWVudC5oZWFkKWZvcih2YXIgZD0wO2Q8Yy5hZGRlZE5vZGVzLmxlbmd0aDtkKyspe3ZhciBlPWMuYWRkZWROb2Rlc1tkXTtpZihlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBmPWUuZ2V0Um9vdE5vZGUoKSxnPXBnKGUpO2lmKGcmJmY9PT1lLm93bmVyRG9jdW1lbnQmJigic3R5bGUiIT09ZS5sb2NhbE5hbWUmJiJ0ZW1wbGF0ZSIhPT1lLmxvY2FsTmFtZXx8IiI9PT1yZihlKSkpeWYoZSxnKTtlbHNlIGlmKGYgaW5zdGFuY2VvZiBTaGFkb3dSb290KWZvcihmPXFnKGUpLGYhPT1nJiZ4ZihlLGcsZiksZT13aW5kb3cuU2hhZHlET00ubmF0aXZlTWV0aG9kcy5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZSwiOm5vdCguIitSLmErIikiKSxnPTA7ZzxlLmxlbmd0aDtnKyspe2Y9ZVtnXTsKdmFyIGg9cWcoZik7aCYmd2YoZixoKX19fX19CmlmKCEoT3x8d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaGFuZGxlc0R5bmFtaWNTY29waW5nKSl7dmFyIHNnPW5ldyBNdXRhdGlvbk9ic2VydmVyKHJnKSx0Zz1mdW5jdGlvbihhKXtzZy5vYnNlcnZlKGEse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9O2lmKHdpbmRvdy5jdXN0b21FbGVtZW50cyYmIXdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXRnKGRvY3VtZW50KTtlbHNle3ZhciB1Zz1mdW5jdGlvbigpe3RnKGRvY3VtZW50LmJvZHkpfTt3aW5kb3cuSFRNTEltcG9ydHM/d2luZG93LkhUTUxJbXBvcnRzLndoZW5SZWFkeSh1Zyk6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7aWYoImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSl7dmFyIGE9ZnVuY3Rpb24oKXt1ZygpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGEpfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwKYSl9ZWxzZSB1ZygpfSl9bmc9ZnVuY3Rpb24oKXtyZyhzZy50YWtlUmVjb3JkcygpKX19dmFyIHZnPW5nO3ZhciB3Zz17fTt2YXIgeGc9UHJvbWlzZS5yZXNvbHZlKCk7ZnVuY3Rpb24geWcoYSl7aWYoYT13Z1thXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gemcoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gQWcoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAseGcudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBCZz17fSxDZz1uZXcgbWc7ZnVuY3Rpb24gWSgpe3RoaXMubD17fTt0aGlzLmM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBhPW5ldyB2ZTthLnJ1bGVzPVtdO3RoaXMuZj1UZih0aGlzLmMsbmV3IFNmKGEpKTt0aGlzLmc9ITE7dGhpcy5iPXRoaXMuYT1udWxsfW49WS5wcm90b3R5cGU7bi5mbHVzaD1mdW5jdGlvbigpe3ZnKCl9O24uRmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGVmKGEpfTtuLlZhPWZ1bmN0aW9uKGEpe3JldHVybiBjZihhKX07bi5wcmVwYXJlVGVtcGxhdGU9ZnVuY3Rpb24oYSxiLGMpe3RoaXMucHJlcGFyZVRlbXBsYXRlRG9tKGEsYik7dGhpcy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfTsKbi5wcmVwYXJlVGVtcGxhdGVTdHlsZXM9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhLl9wcmVwYXJlZCYmIVBlKXtPfHxqZ1tiXXx8KGpnW2JdPWtmKGIpKTthLl9wcmVwYXJlZD0hMDthLm5hbWU9YjthLmV4dGVuZHM9Yzt3Z1tiXT1hO3ZhciBkPXJmKGEpLGU9c2YoZCk7Yz17aXM6YixleHRlbmRzOmN9O2Zvcih2YXIgZj1bXSxnPWEuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpLGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihrLmhhc0F0dHJpYnV0ZSgic2hhZHktdW5zY29wZWQiKSl7aWYoIU8pe3ZhciBsPWsudGV4dENvbnRlbnQ7YmYuaGFzKGwpfHwoYmYuYWRkKGwpLGw9ay5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCkpO2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKX19ZWxzZSBmLnB1c2goay50ZXh0Q29udGVudCksay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGspfWY9Zi5qb2luKCIiKS50cmltKCkrKEJnW2JdfHwiIik7CkRnKHRoaXMpO2lmKCFlKXtpZihnPSFkKWc9U2UudGVzdChmKXx8UmUudGVzdChmKSxTZS5sYXN0SW5kZXg9MCxSZS5sYXN0SW5kZXg9MDtoPXdlKGYpO2cmJlEmJnRoaXMuYSYmdGhpcy5hLnRyYW5zZm9ybVJ1bGVzKGgsYik7YS5fc3R5bGVBc3Q9aH1nPVtdO1F8fChnPVhmKGEuX3N0eWxlQXN0KSk7aWYoIWcubGVuZ3RofHxRKWg9Tz9hLmNvbnRlbnQ6bnVsbCxiPWpnW2JdfHxudWxsLGQ9emYoYyxhLl9zdHlsZUFzdCxudWxsLGQsZT9mOiIiKSxkPWQubGVuZ3RoP2dmKGQsYy5pcyxoLGIpOm51bGwsYS5fc3R5bGU9ZDthLmE9Z319O24uUWE9ZnVuY3Rpb24oYSxiKXtCZ1tiXT1hLmpvaW4oIiAiKX07bi5wcmVwYXJlVGVtcGxhdGVEb209ZnVuY3Rpb24oYSxiKXtpZighUGUpe3ZhciBjPXJmKGEpO098fCJzaGFkeSI9PT1jfHxhLl9kb21QcmVwYXJlZHx8KGEuX2RvbVByZXBhcmVkPSEwLHVmKGEuY29udGVudCxiKSl9fTsKZnVuY3Rpb24gRWcoYSl7dmFyIGI9cGYoYSksYz1iLmlzO2I9Yi5NO3ZhciBkPWpnW2NdfHxudWxsLGU9d2dbY107aWYoZSl7Yz1lLl9zdHlsZUFzdDt2YXIgZj1lLmE7ZT1yZihlKTtiPW5ldyBTZihjLGQsZixiLGUpO1RmKGEsYik7cmV0dXJuIGJ9fWZ1bmN0aW9uIEZnKGEpeyFhLmImJndpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlJiYoYS5iPXdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSxhLmIudHJhbnNmb3JtQ2FsbGJhY2s9ZnVuY3Rpb24oYil7YS5yYShiKX0sYS5iLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXsoYS5iLmVucXVldWVkfHxhLmcpJiZhLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX0pfQpmdW5jdGlvbiBEZyhhKXshYS5hJiZ3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0mJihhLmE9d2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbSxhLmEuaW52YWxpZENhbGxiYWNrPXlnKTtGZyhhKX0Kbi5mbHVzaEN1c3RvbVN0eWxlcz1mdW5jdGlvbigpe2lmKCFQZSYmKERnKHRoaXMpLHRoaXMuYikpe3ZhciBhPXRoaXMuYi5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5iLmVucXVldWVkJiYhc2YodGhpcy5mLmNzc0J1aWxkKSl7aWYoUSl7aWYoIXRoaXMuZi5jc3NCdWlsZClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5iLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7aWYoYyYmUSYmdGhpcy5hKXt2YXIgZD1lZihjKTtEZyh0aGlzKTt0aGlzLmEudHJhbnNmb3JtUnVsZXMoZCk7Yy50ZXh0Q29udGVudD1jZihkKX19fWVsc2V7R2codGhpcyx0aGlzLmMsdGhpcy5mKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKShjPXRoaXMuYi5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKGFbYl0pKSYmaGcoYyx0aGlzLmYudyk7dGhpcy5nJiZ0aGlzLnN0eWxlRG9jdW1lbnQoKX10aGlzLmIuZW5xdWV1ZWQ9ITF9fX07Cm4uc3R5bGVFbGVtZW50PWZ1bmN0aW9uKGEsYil7aWYoUGUpe2lmKGIpe1QoYSl8fFRmKGEsbmV3IFNmKG51bGwpKTt2YXIgYz1UKGEpO2Mubz1jLm98fHt9O09iamVjdC5hc3NpZ24oYy5vLGIpO0hnKHRoaXMsYSxjKX19ZWxzZSBpZihjPVQoYSl8fEVnKGEpKWlmKGEhPT10aGlzLmMmJih0aGlzLmc9ITApLGImJihjLm89Yy5vfHx7fSxPYmplY3QuYXNzaWduKGMubyxiKSksUSlIZyh0aGlzLGEsYyk7ZWxzZSBpZih0aGlzLmZsdXNoKCksR2codGhpcyxhLGMpLGMuZmEmJmMuZmEubGVuZ3RoKXtiPXBmKGEpLmlzO3ZhciBkO2E6e2lmKGQ9Q2cuY2FjaGVbYl0pZm9yKHZhciBlPWQubGVuZ3RoLTE7MDw9ZTtlLS0pe3ZhciBmPWRbZV07Yjp7dmFyIGc9Yy5mYTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihmLnZba10hPT1jLndba10pe2c9ITE7YnJlYWsgYn19Zz0hMH1pZihnKXtkPWY7YnJlYWsgYX19ZD12b2lkIDB9Zz1kP2Quc3R5bGVFbGVtZW50Om51bGw7CmU9Yy5zOyhmPWQmJmQucyl8fChmPXRoaXMubFtiXT0odGhpcy5sW2JdfHwwKSsxLGY9YisiLSIrZik7Yy5zPWY7Zj1jLnM7aD1pZztoPWc/Zy50ZXh0Q29udGVudHx8IiI6ZWcoaCxhLGMudyxmKTtrPVQoYSk7dmFyIGw9ay5hO2wmJiFPJiZsIT09ZyYmKGwuX3VzZUNvdW50LS0sMD49bC5fdXNlQ291bnQmJmwucGFyZW50Tm9kZSYmbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGwpKTtPP2suYT8oay5hLnRleHRDb250ZW50PWgsZz1rLmEpOmgmJihnPWdmKGgsZixhLnNoYWRvd1Jvb3Qsay5iKSk6Zz9nLnBhcmVudE5vZGV8fChWZiYmLTE8aC5pbmRleE9mKCJAbWVkaWEiKSYmKGcudGV4dENvbnRlbnQ9aCksaGYoZyxudWxsLGsuYikpOmgmJihnPWdmKGgsZixudWxsLGsuYikpO2cmJihnLl91c2VDb3VudD1nLl91c2VDb3VudHx8MCxrLmEhPWcmJmcuX3VzZUNvdW50Kyssay5hPWcpO2Y9ZztPfHwoZz1jLnMsaz1oPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIixlJiYoaz1oLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFxzKngtc2NvcGVcXHMqIisKZSsiXFxzKiIsImciKSwiICIpKSxrKz0oaz8iICI6IiIpKyJ4LXNjb3BlICIrZyxoIT09ayYmbmYoYSxrKSk7ZHx8Q2cuc3RvcmUoYixjLncsZixjLnMpfX07CmZ1bmN0aW9uIEhnKGEsYixjKXt2YXIgZD1wZihiKS5pcztpZihjLm8pe3ZhciBlPWMubyxmO2ZvcihmIGluIGUpbnVsbD09PWY/Yi5zdHlsZS5yZW1vdmVQcm9wZXJ0eShmKTpiLnN0eWxlLnNldFByb3BlcnR5KGYsZVtmXSl9ZT13Z1tkXTtpZighKCFlJiZiIT09YS5jfHxlJiYiIiE9PXJmKGUpKSYmZSYmZS5fc3R5bGUmJiF6ZyhlKSl7aWYoemcoZSl8fGUuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uIT09ZS5fYXBwbHlTaGltTmV4dFZlcnNpb24pRGcoYSksYS5hJiZhLmEudHJhbnNmb3JtUnVsZXMoZS5fc3R5bGVBc3QsZCksZS5fc3R5bGUudGV4dENvbnRlbnQ9emYoYixjLkEpLEFnKGUpO08mJihhPWIuc2hhZG93Um9vdCkmJihhPWEucXVlcnlTZWxlY3Rvcigic3R5bGUiKSkmJihhLnRleHRDb250ZW50PXpmKGIsYy5BKSk7Yy5BPWUuX3N0eWxlQXN0fX0KZnVuY3Rpb24gSWcoYSxiKXtyZXR1cm4oYj1vZihiKS5nZXRSb290Tm9kZSgpLmhvc3QpP1QoYil8fEVnKGIpP2I6SWcoYSxiKTphLmN9ZnVuY3Rpb24gR2coYSxiLGMpe3ZhciBkPUlnKGEsYiksZT1UKGQpLGY9ZS53O2Q9PT1hLmN8fGZ8fChHZyhhLGQsZSksZj1lLncpO2E9T2JqZWN0LmNyZWF0ZShmfHxudWxsKTtkPWRnKGIsYy5BLGMuY3NzQnVpbGQpO2I9YmcoZS5BLGIpLnY7T2JqZWN0LmFzc2lnbihhLGQuSGEsYixkLlJhKTtiPWMubztmb3IodmFyIGcgaW4gYilpZigoZT1iW2ddKXx8MD09PWUpYVtnXT1lO2c9aWc7Yj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKTtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWQ9YltlXSxhW2RdPSRmKGcsYVtkXSxhKTtjLnc9YX1uLnN0eWxlRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dGhpcy5zdHlsZVN1YnRyZWUodGhpcy5jLGEpfTsKbi5zdHlsZVN1YnRyZWU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKSxkPWMuc2hhZG93Um9vdDsoZHx8YT09PXRoaXMuYykmJnRoaXMuc3R5bGVFbGVtZW50KGEsYik7aWYoYT1kJiYoZC5jaGlsZHJlbnx8ZC5jaGlsZE5vZGVzKSlmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuc3R5bGVTdWJ0cmVlKGFbY10pO2Vsc2UgaWYoYz1jLmNoaWxkcmVufHxjLmNoaWxkTm9kZXMpZm9yKGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLnN0eWxlU3VidHJlZShjW2FdKX07Cm4ucmE9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPXJmKGEpO2MhPT10aGlzLmYuY3NzQnVpbGQmJih0aGlzLmYuY3NzQnVpbGQ9Yyk7aWYoIXNmKGMpKXt2YXIgZD1lZihhKTtkZihkLGZ1bmN0aW9uKGEpe2lmKE8pUmYoYSk7ZWxzZXt2YXIgZD1SO2Euc2VsZWN0b3I9YS5wYXJzZWRTZWxlY3RvcjtSZihhKTthLnNlbGVjdG9yPWEuaj1DZihkLGEsZC5jLHZvaWQgMCx2b2lkIDApfVEmJiIiPT09YyYmKERnKGIpLGIuYSYmYi5hLnRyYW5zZm9ybVJ1bGUoYSkpfSk7UT9hLnRleHRDb250ZW50PWNmKGQpOnRoaXMuZi5BLnJ1bGVzLnB1c2goZCl9fTtuLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1mdW5jdGlvbihhLGIpe3ZhciBjO1F8fChjPShUKGEpfHxUKElnKHRoaXMsYSkpKS53W2JdKTtyZXR1cm4oYz1jfHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9jLnRyaW0oKToiIn07Cm4uVWE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKS5nZXRSb290Tm9kZSgpO2I9Yj9iLnNwbGl0KC9ccy8pOltdO2M9Yy5ob3N0JiZjLmhvc3QubG9jYWxOYW1lO2lmKCFjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTtpZihkKXtkPWQuc3BsaXQoL1xzLyk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspaWYoZFtlXT09PVIuYSl7Yz1kW2UrMV07YnJlYWt9fX1jJiZiLnB1c2goUi5hLGMpO1F8fChjPVQoYSkpJiZjLnMmJmIucHVzaChpZy5hLGMucyk7bmYoYSxiLmpvaW4oIiAiKSl9O24uQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIFQoYSl9O24uVGE9ZnVuY3Rpb24oYSxiKXt3ZihhLGIpfTtuLldhPWZ1bmN0aW9uKGEsYil7d2YoYSxiLCEwKX07bi5TYT1mdW5jdGlvbihhKXtyZXR1cm4gcWcoYSl9O24uRGE9ZnVuY3Rpb24oYSl7cmV0dXJuIHBnKGEpfTtZLnByb3RvdHlwZS5mbHVzaD1ZLnByb3RvdHlwZS5mbHVzaDtZLnByb3RvdHlwZS5wcmVwYXJlVGVtcGxhdGU9WS5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlOwpZLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVFbGVtZW50O1kucHJvdG90eXBlLnN0eWxlRG9jdW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVEb2N1bWVudDtZLnByb3RvdHlwZS5zdHlsZVN1YnRyZWU9WS5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlO1kucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1ZLnByb3RvdHlwZS5nZXRDb21wdXRlZFN0eWxlVmFsdWU7WS5wcm90b3R5cGUuc2V0RWxlbWVudENsYXNzPVkucHJvdG90eXBlLlVhO1kucHJvdG90eXBlLl9zdHlsZUluZm9Gb3JOb2RlPVkucHJvdG90eXBlLkJhO1kucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlRm9yRG9jdW1lbnQ9WS5wcm90b3R5cGUucmE7WS5wcm90b3R5cGUuZ2V0U3R5bGVBc3Q9WS5wcm90b3R5cGUuRmE7WS5wcm90b3R5cGUuc3R5bGVBc3RUb1N0cmluZz1ZLnByb3RvdHlwZS5WYTtZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlcz1ZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlczsKWS5wcm90b3R5cGUuc2NvcGVOb2RlPVkucHJvdG90eXBlLlRhO1kucHJvdG90eXBlLnVuc2NvcGVOb2RlPVkucHJvdG90eXBlLldhO1kucHJvdG90eXBlLnNjb3BlRm9yTm9kZT1ZLnByb3RvdHlwZS5TYTtZLnByb3RvdHlwZS5jdXJyZW50U2NvcGVGb3JOb2RlPVkucHJvdG90eXBlLkRhO1kucHJvdG90eXBlLnByZXBhcmVBZG9wdGVkQ3NzVGV4dD1ZLnByb3RvdHlwZS5RYTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhZLnByb3RvdHlwZSx7bmF0aXZlU2hhZG93OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gT319LG5hdGl2ZUNzczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9fX0pO3ZhciBaPW5ldyBZLEpnLEtnO3dpbmRvdy5TaGFkeUNTUyYmKEpnPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0sS2c9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlKTsKd2luZG93LlNoYWR5Q1NTPXtTY29waW5nU2hpbTpaLHByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIsYyl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1oucHJlcGFyZVRlbXBsYXRlKGEsYixjKX0scHJlcGFyZVRlbXBsYXRlRG9tOmZ1bmN0aW9uKGEsYil7Wi5wcmVwYXJlVGVtcGxhdGVEb20oYSxiKX0scHJlcGFyZVRlbXBsYXRlU3R5bGVzOmZ1bmN0aW9uKGEsYixjKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfSxzdHlsZVN1YnRyZWU6ZnVuY3Rpb24oYSxiKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZVN1YnRyZWUoYSxiKX0sc3R5bGVFbGVtZW50OmZ1bmN0aW9uKGEpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnN0eWxlRWxlbWVudChhKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZURvY3VtZW50KGEpfSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe1ouZmx1c2hDdXN0b21TdHlsZXMoKX0sCmdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBaLmdldENvbXB1dGVkU3R5bGVWYWx1ZShhLGIpfSxuYXRpdmVDc3M6USxuYXRpdmVTaGFkb3c6Tyxjc3NCdWlsZDpRZSxkaXNhYmxlUnVudGltZTpQZX07SmcmJih3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPUpnKTtLZyYmKHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT1LZyk7dmFyIExnPXdpbmRvdy5jdXN0b21FbGVtZW50cyxNZz13aW5kb3cuSFRNTEltcG9ydHMsTmc9d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQ7d2luZG93LldlYkNvbXBvbmVudHM9d2luZG93LldlYkNvbXBvbmVudHN8fHt9O2lmKExnJiZMZy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXt2YXIgT2csUGc9ZnVuY3Rpb24oKXtpZihPZyl7TmcuQyYmTmcuQyh3aW5kb3cuZG9jdW1lbnQpO3ZhciBhPU9nO09nPW51bGw7YSgpO3JldHVybiEwfX0sUWc9TWcud2hlblJlYWR5O0xnLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2soZnVuY3Rpb24oYSl7T2c9YTtRZyhQZyl9KTtNZy53aGVuUmVhZHk9ZnVuY3Rpb24oYSl7UWcoZnVuY3Rpb24oKXtQZygpP01nLndoZW5SZWFkeShhKTphKCl9KX19Ck1nLndoZW5SZWFkeShmdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3dpbmRvdy5XZWJDb21wb25lbnRzLnJlYWR5PSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJXZWJDb21wb25lbnRzUmVhZHkiLHtidWJibGVzOiEwfSkpfSl9KTt2YXIgUmc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtSZy50ZXh0Q29udGVudD0iYm9keSB7dHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluIDAuMnM7IH0gXG5ib2R5W3VucmVzb2x2ZWRdIHtvcGFjaXR5OiAwOyBkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB9IFxuIjt2YXIgU2c9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO1NnLmluc2VydEJlZm9yZShSZyxTZy5maXJzdENoaWxkKTt9KS5jYWxsKHRoaXMpOwoKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBsPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLHA7ZnVuY3Rpb24gcihhKXtwPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6bHx8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgdDt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKHQ9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgYWE9ISghd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTsKd2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP3A9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KHIod2luZG93LlNoYWR5Q1NTKSx3aW5kb3cuU2hhZHlDU1M9dm9pZCAwKTpyKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIHU9cCx2PXQ7ZnVuY3Rpb24gdygpe3RoaXMuZW5kPXRoaXMuc3RhcnQ9MDt0aGlzLnJ1bGVzPXRoaXMucGFyZW50PXRoaXMucHJldmlvdXM9bnVsbDt0aGlzLmNzc1RleHQ9dGhpcy5wYXJzZWRDc3NUZXh0PSIiO3RoaXMuYXRSdWxlPSExO3RoaXMudHlwZT0wO3RoaXMucGFyc2VkU2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj10aGlzLmtleWZyYW1lc05hbWU9IiJ9CmZ1bmN0aW9uIHgoYSl7YT1hLnJlcGxhY2UoYmEsIiIpLnJlcGxhY2UoY2EsIiIpO3ZhciBiPXksYz1hLGU9bmV3IHc7ZS5zdGFydD0wO2UuZW5kPWMubGVuZ3RoO2Zvcih2YXIgZD1lLGY9MCxnPWMubGVuZ3RoO2Y8ZztmKyspaWYoInsiPT09Y1tmXSl7ZC5ydWxlc3x8KGQucnVsZXM9W10pO3ZhciBoPWQsaz1oLnJ1bGVzW2gucnVsZXMubGVuZ3RoLTFdfHxudWxsO2Q9bmV3IHc7ZC5zdGFydD1mKzE7ZC5wYXJlbnQ9aDtkLnByZXZpb3VzPWs7aC5ydWxlcy5wdXNoKGQpfWVsc2UifSI9PT1jW2ZdJiYoZC5lbmQ9ZisxLGQ9ZC5wYXJlbnR8fGUpO3JldHVybiBiKGUsYSl9CmZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPWRhKGMpLGM9Yy5yZXBsYWNlKHosIiAiKSxjPWMuc3Vic3RyaW5nKGMubGFzdEluZGV4T2YoIjsiKSsxKSxjPWEucGFyc2VkU2VsZWN0b3I9YS5zZWxlY3Rvcj1jLnRyaW0oKSxhLmF0UnVsZT0wPT09Yy5pbmRleE9mKCJAIiksYS5hdFJ1bGU/MD09PWMuaW5kZXhPZigiQG1lZGlhIik/YS50eXBlPUE6Yy5tYXRjaChlYSkmJihhLnR5cGU9QixhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdCh6KS5wb3AoKSk6YS50eXBlPTA9PT1jLmluZGV4T2YoIi0tIik/QzpEKTtpZihjPWEucnVsZXMpZm9yKHZhciBlPTAsZD1jLmxlbmd0aCxmPXZvaWQgMDtlPGQmJihmPWNbZV0pO2UrKyl5KGYsYik7CnJldHVybiBhfWZ1bmN0aW9uIGRhKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcKFswLTlhLWZdezEsNn0pXHMvZ2ksZnVuY3Rpb24oYSxjKXthPWM7Zm9yKGM9Ni1hLmxlbmd0aDtjLS07KWE9IjAiK2E7cmV0dXJuIlxcIithfSl9CmZ1bmN0aW9uIEUoYSxiLGMpe2M9dm9pZCAwPT09Yz8iIjpjO3ZhciBlPSIiO2lmKGEuY3NzVGV4dHx8YS5ydWxlcyl7dmFyIGQ9YS5ydWxlcyxmO2lmKGY9ZClmPWRbMF0sZj0hKGYmJmYuc2VsZWN0b3ImJjA9PT1mLnNlbGVjdG9yLmluZGV4T2YoIi0tIikpO2lmKGYpe2Y9MDtmb3IodmFyIGc9ZC5sZW5ndGgsaD12b2lkIDA7ZjxnJiYoaD1kW2ZdKTtmKyspZT1FKGgsYixlKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKGZhLCIiKS5yZXBsYWNlKGhhLCIiKSxiPWIucmVwbGFjZShpYSwiIikucmVwbGFjZShqYSwiIikpLChlPWIudHJpbSgpKSYmKGU9IiAgIitlKyJcbiIpfWUmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWUsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEQ9MSxCPTcsQT00LEM9MUUzLGJhPS9cL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8vZ2ltLGNhPS9AaW1wb3J0W147XSo7L2dpbSxmYT0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj8oPzpbO1xuXXwkKS9naW0saGE9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/e1tefV0qP30oPzpbO1xuXXwkKT8vZ2ltLGlhPS9AYXBwbHlccypcKD9bXik7XSpcKT9ccyooPzpbO1xuXXwkKT8vZ2ltLGphPS9bXjs6XSo/OlteO10qP3ZhclwoW147XSpcKSg/Ols7XG5dfCQpPy9naW0sZWE9L15AW15cc10qa2V5ZnJhbWVzLyx6PS9ccysvZzt2YXIgRz0vKD86XnxbO1xze11ccyopKC0tW1x3LV0qPylccyo6XHMqKD86KCg/OicoPzpcXCd8LikqPyd8Iig/OlxcInwuKSo/InxcKFteKV0qP1wpfFtefTt7XSkrKXxceyhbXn1dKilcfSg/Oig/PVs7XHN9XSl8JCkpL2dpLEg9Lyg/Ol58XFcrKUBhcHBseVxzKlwoPyhbXik7XG5dKilcKT8vZ2ksa2E9L0BtZWRpYVxzKC4qKS87dmFyIEk9bmV3IFNldDtmdW5jdGlvbiBKKGEpe2lmKCFhKXJldHVybiIiOyJzdHJpbmciPT09dHlwZW9mIGEmJihhPXgoYSkpO3JldHVybiBFKGEsdSl9ZnVuY3Rpb24gSyhhKXshYS5fX2Nzc1J1bGVzJiZhLnRleHRDb250ZW50JiYoYS5fX2Nzc1J1bGVzPXgoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gTChhLGIsYyxlKXtpZihhKXt2YXIgZD0hMSxmPWEudHlwZTtpZihlJiZmPT09QSl7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaChrYSk7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChkPSEwKSl9Zj09PUQ/YihhKTpjJiZmPT09Qj9jKGEpOmY9PT1DJiYoZD0hMCk7aWYoKGE9YS5ydWxlcykmJiFkKWZvcihkPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtkPGYmJihnPWFbZF0pO2QrKylMKGcsYixjLGUpfX0KZnVuY3Rpb24gTShhLGIpe3ZhciBjPWEuaW5kZXhPZigidmFyKCIpO2lmKC0xPT09YylyZXR1cm4gYihhLCIiLCIiLCIiKTthOnt2YXIgZT0wO3ZhciBkPWMrMztmb3IodmFyIGY9YS5sZW5ndGg7ZDxmO2QrKylpZigiKCI9PT1hW2RdKWUrKztlbHNlIGlmKCIpIj09PWFbZF0mJjA9PT0tLWUpYnJlYWsgYTtkPS0xfWU9YS5zdWJzdHJpbmcoYys0LGQpO2M9YS5zdWJzdHJpbmcoMCxjKTthPU0oYS5zdWJzdHJpbmcoZCsxKSxiKTtkPWUuaW5kZXhPZigiLCIpO3JldHVybi0xPT09ZD9iKGMsZS50cmltKCksIiIsYSk6YihjLGUuc3Vic3RyaW5nKDAsZCkudHJpbSgpLGUuc3Vic3RyaW5nKGQrMSkudHJpbSgpLGEpfQpmdW5jdGlvbiBOKGEpe2lmKHZvaWQgMCE9PXYpcmV0dXJuIHY7aWYodm9pZCAwPT09YS5fX2Nzc0J1aWxkKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgiY3NzLWJ1aWxkIik7aWYoYilhLl9fY3NzQnVpbGQ9YjtlbHNle2E6e2I9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtpZihiIGluc3RhbmNlb2YgQ29tbWVudCYmKGI9Yi50ZXh0Q29udGVudC50cmltKCkuc3BsaXQoIjoiKSwiY3NzLWJ1aWxkIj09PWJbMF0pKXtiPWJbMV07YnJlYWsgYX1iPSIifWlmKCIiIT09Yil7dmFyIGM9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9YS5fX2Nzc0J1aWxkPWJ9fXJldHVybiBhLl9fY3NzQnVpbGR8fCIifTt2YXIgbGE9LztccyovbSxtYT0vXlxzKihpbml0aWFsKXwoaW5oZXJpdClccyokLyxPPS9ccyohaW1wb3J0YW50LztmdW5jdGlvbiBQKCl7dGhpcy5hPXt9fVAucHJvdG90eXBlLnNldD1mdW5jdGlvbihhLGIpe2E9YS50cmltKCk7dGhpcy5hW2FdPXtoOmIsaTp7fX19O1AucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXthPWEudHJpbSgpO3JldHVybiB0aGlzLmFbYV18fG51bGx9O3ZhciBRPW51bGw7ZnVuY3Rpb24gUigpe3RoaXMuYj10aGlzLmM9bnVsbDt0aGlzLmE9bmV3IFB9Ui5wcm90b3R5cGUubz1mdW5jdGlvbihhKXthPUgudGVzdChhKXx8Ry50ZXN0KGEpO0gubGFzdEluZGV4PTA7Ry5sYXN0SW5kZXg9MDtyZXR1cm4gYX07ClIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1hLl9nYXRoZXJlZFN0eWxlKXt2YXIgYz1bXTtmb3IodmFyIGU9YS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIiksZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj1lW2RdO2lmKGYuaGFzQXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIpKXtpZighbCl7dmFyIGc9Zi50ZXh0Q29udGVudDtJLmhhcyhnKXx8KEkuYWRkKGcpLGc9Zi5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZykpO2YucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmKX19ZWxzZSBjLnB1c2goZi50ZXh0Q29udGVudCksZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfShjPWMuam9pbigiIikudHJpbSgpKT8oZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGUudGV4dENvbnRlbnQ9YyxhLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGUsYS5jb250ZW50LmZpcnN0Q2hpbGQpLGM9ZSk6Yz1udWxsO2EuX2dhdGhlcmVkU3R5bGU9CmN9cmV0dXJuKGE9YS5fZ2F0aGVyZWRTdHlsZSk/dGhpcy5qKGEsYik6bnVsbH07Ui5wcm90b3R5cGUuaj1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8iIjpiO3ZhciBjPUsoYSk7dGhpcy5sKGMsYik7YS50ZXh0Q29udGVudD1KKGMpO3JldHVybiBjfTtSLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1LKGEpO0woYyxmdW5jdGlvbihhKXsiOnJvb3QiPT09YS5zZWxlY3RvciYmKGEuc2VsZWN0b3I9Imh0bWwiKTtiLmcoYSl9KTthLnRleHRDb250ZW50PUooYyk7cmV0dXJuIGN9O1IucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuYz1iO0woYSxmdW5jdGlvbihhKXtjLmcoYSl9KTt0aGlzLmM9bnVsbH07Ui5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthLmNzc1RleHQ9bmEodGhpcyxhLnBhcnNlZENzc1RleHQsYSk7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSI6aG9zdCA+ICoiKX07CmZ1bmN0aW9uIG5hKGEsYixjKXtiPWIucmVwbGFjZShHLGZ1bmN0aW9uKGIsZCxmLGcpe3JldHVybiBvYShhLGIsZCxmLGcsYyl9KTtyZXR1cm4gUyhhLGIsYyl9ZnVuY3Rpb24gcGEoYSxiKXtmb3IodmFyIGM9YjtjLnBhcmVudDspYz1jLnBhcmVudDt2YXIgZT17fSxkPSExO0woYyxmdW5jdGlvbihjKXsoZD1kfHxjPT09Yil8fGMuc2VsZWN0b3I9PT1iLnNlbGVjdG9yJiZPYmplY3QuYXNzaWduKGUsVChhLGMucGFyc2VkQ3NzVGV4dCkpfSk7cmV0dXJuIGV9CmZ1bmN0aW9uIFMoYSxiLGMpe2Zvcih2YXIgZTtlPUguZXhlYyhiKTspe3ZhciBkPWVbMF0sZj1lWzFdO2U9ZS5pbmRleDt2YXIgZz1iLnNsaWNlKDAsZStkLmluZGV4T2YoIkBhcHBseSIpKTtiPWIuc2xpY2UoZStkLmxlbmd0aCk7dmFyIGg9Yz9wYShhLGMpOnt9O09iamVjdC5hc3NpZ24oaCxUKGEsZykpO2Q9dm9pZCAwO3ZhciBrPWE7Zj1mLnJlcGxhY2UobGEsIiIpO3ZhciBuPVtdO3ZhciBtPWsuYS5nZXQoZik7bXx8KGsuYS5zZXQoZix7fSksbT1rLmEuZ2V0KGYpKTtpZihtKXtrLmMmJihtLmlbay5jXT0hMCk7dmFyIHE9bS5oO2ZvcihkIGluIHEpaz1oJiZoW2RdLG09W2QsIjogdmFyKCIsZiwiXy1fIixkXSxrJiZtLnB1c2goIiwiLGsucmVwbGFjZShPLCIiKSksbS5wdXNoKCIpIiksTy50ZXN0KHFbZF0pJiZtLnB1c2goIiAhaW1wb3J0YW50Iiksbi5wdXNoKG0uam9pbigiIikpfWQ9bi5qb2luKCI7ICIpO2I9ZytkK2I7SC5sYXN0SW5kZXg9ZStkLmxlbmd0aH1yZXR1cm4gYn0KZnVuY3Rpb24gVChhLGIsYyl7Yz12b2lkIDA9PT1jPyExOmM7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBlLGQsZj17fSxnPTAsaDtnPGIubGVuZ3RoO2crKylpZihlPWJbZ10paWYoaD1lLnNwbGl0KCI6IiksMTxoLmxlbmd0aCl7ZT1oWzBdLnRyaW0oKTtkPWguc2xpY2UoMSkuam9pbigiOiIpO2lmKGMpe3ZhciBrPWE7aD1lO3ZhciBuPW1hLmV4ZWMoZCk7biYmKG5bMV0/KGsuYnx8KGsuYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhIiksay5iLnNldEF0dHJpYnV0ZSgiYXBwbHktc2hpbS1tZWFzdXJlIiwiIiksay5iLnN0eWxlLmFsbD0iaW5pdGlhbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrLmIpKSxoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGsuYikuZ2V0UHJvcGVydHlWYWx1ZShoKSk6aD0iYXBwbHktc2hpbS1pbmhlcml0IixkPWgpfWZbZV09ZH1yZXR1cm4gZn1mdW5jdGlvbiBxYShhLGIpe2lmKFEpZm9yKHZhciBjIGluIGIuaSljIT09YS5jJiZRKGMpfQpmdW5jdGlvbiBvYShhLGIsYyxlLGQsZil7ZSYmTShlLGZ1bmN0aW9uKGIsYyl7YyYmYS5hLmdldChjKSYmKGQ9IkBhcHBseSAiK2MrIjsiKX0pO2lmKCFkKXJldHVybiBiO3ZhciBnPVMoYSwiIitkLGYpO2Y9Yi5zbGljZSgwLGIuaW5kZXhPZigiLS0iKSk7dmFyIGg9Zz1UKGEsZywhMCksaz1hLmEuZ2V0KGMpLG49ayYmay5oO24/aD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobiksZyk6YS5hLnNldChjLGgpO3ZhciBtPVtdLHEsWj0hMTtmb3IocSBpbiBoKXt2YXIgRj1nW3FdO3ZvaWQgMD09PUYmJihGPSJpbml0aWFsIik7IW58fHEgaW4gbnx8KFo9ITApO20ucHVzaChjKyJfLV8iK3ErIjogIitGKX1aJiZxYShhLGspO2smJihrLmg9aCk7ZSYmKGY9YisiOyIrZik7cmV0dXJuIGYrbS5qb2luKCI7ICIpKyI7In1SLnByb3RvdHlwZS5kZXRlY3RNaXhpbj1SLnByb3RvdHlwZS5vO1IucHJvdG90eXBlLnRyYW5zZm9ybVN0eWxlPVIucHJvdG90eXBlLmo7ClIucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlPVIucHJvdG90eXBlLmY7Ui5wcm90b3R5cGUudHJhbnNmb3JtUnVsZXM9Ui5wcm90b3R5cGUubDtSLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlPVIucHJvdG90eXBlLmc7Ui5wcm90b3R5cGUudHJhbnNmb3JtVGVtcGxhdGU9Ui5wcm90b3R5cGUubTtSLnByb3RvdHlwZS5fc2VwYXJhdG9yPSJfLV8iO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSLnByb3RvdHlwZSwiaW52YWxpZENhbGxiYWNrIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9LHNldDpmdW5jdGlvbihhKXtRPWF9fSk7dmFyIFU9e307dmFyIHJhPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIHNhKGEpe2lmKGE9VVthXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gdWEoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAscmEudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBWPW5ldyBSO2Z1bmN0aW9uIFcoKXt0aGlzLmE9bnVsbDtWLmludmFsaWRDYWxsYmFjaz1zYX1mdW5jdGlvbiBYKGEpeyFhLmEmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSYmKGEuYT13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UsYS5hLnRyYW5zZm9ybUNhbGxiYWNrPWZ1bmN0aW9uKGEpe1YuZihhKX0sYS5hLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXthLmEuZW5xdWV1ZWQmJmEuZmx1c2hDdXN0b21TdHlsZXMoKX0pfSl9Vy5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTsiIj09PU4oYSkmJihVW2JdPWEsYj1WLm0oYSxiKSxhLl9zdHlsZUFzdD1iKX07ClcucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzPWZ1bmN0aW9uKCl7WCh0aGlzKTtpZih0aGlzLmEpe3ZhciBhPXRoaXMuYS5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5hLmVucXVldWVkKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5hLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7YyYmVi5mKGMpfXRoaXMuYS5lbnF1ZXVlZD0hMX19fTsKVy5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTtpZihiKWZvcih2YXIgYyBpbiBiKW51bGw9PT1jP2Euc3R5bGUucmVtb3ZlUHJvcGVydHkoYyk6YS5zdHlsZS5zZXRQcm9wZXJ0eShjLGJbY10pO2lmKGEuc2hhZG93Um9vdClmb3IodGhpcy5zdHlsZUVsZW1lbnQoYSksYT1hLnNoYWRvd1Jvb3QuY2hpbGRyZW58fGEuc2hhZG93Um9vdC5jaGlsZE5vZGVzLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLnN0eWxlU3VidHJlZShhW2JdKTtlbHNlIGZvcihhPWEuY2hpbGRyZW58fGEuY2hpbGROb2RlcyxiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5zdHlsZVN1YnRyZWUoYVtiXSl9OwpXLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7WCh0aGlzKTt2YXIgYj1hLmxvY2FsTmFtZSxjO2I/LTE8Yi5pbmRleE9mKCItIik/Yz1iOmM9YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJpcyIpfHwiIjpjPWEuaXM7Yj1VW2NdO2lmKCEoYiYmIiIhPT1OKGIpfHwhYnx8dGEoYikpKXtpZih0YShiKXx8Yi5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb24hPT1iLl9hcHBseVNoaW1OZXh0VmVyc2lvbil0aGlzLnByZXBhcmVUZW1wbGF0ZShiLGMpLHVhKGIpO2lmKGE9YS5zaGFkb3dSb290KWlmKGE9YS5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpKWEuX19jc3NSdWxlcz1iLl9zdHlsZUFzdCxhLnRleHRDb250ZW50PUooYi5fc3R5bGVBc3QpfX07Vy5wcm90b3R5cGUuc3R5bGVEb2N1bWVudD1mdW5jdGlvbihhKXtYKHRoaXMpO3RoaXMuc3R5bGVTdWJ0cmVlKGRvY3VtZW50LmJvZHksYSl9OwppZighd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKXt2YXIgWT1uZXcgVyx2YT13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTt3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnByZXBhcmVUZW1wbGF0ZShhLGIpfSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oYSxiLGMpe3dpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUoYSxiLGMpfSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnN0eWxlU3VidHJlZShhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7WS5mbHVzaEN1c3RvbVN0eWxlcygpO1kuc3R5bGVFbGVtZW50KGEpfSxzdHlsZURvY3VtZW50OmZ1bmN0aW9uKGEpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTsKWS5zdHlsZURvY3VtZW50KGEpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9hLnRyaW0oKToiIn0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCl9LG5hdGl2ZUNzczp1LG5hdGl2ZVNoYWRvdzpsLGNzc0J1aWxkOnYsZGlzYWJsZVJ1bnRpbWU6YWF9O3ZhJiYod2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXZhKX13aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPVY7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IHVzZXJQb2x5bWVyID0gd2luZG93LlBvbHltZXI7CgogIC8qKgogICAqIEBuYW1lc3BhY2UgUG9seW1lcgogICAqIEBzdW1tYXJ5IFBvbHltZXIgaXMgYSBsaWdodHdlaWdodCBsaWJyYXJ5IGJ1aWx0IG9uIHRvcCBvZiB0aGUgd2ViCiAgICogICBzdGFuZGFyZHMtYmFzZWQgV2ViIENvbXBvbmVudHMgQVBJJ3MsIGFuZCBtYWtlcyBpdCBlYXN5IHRvIGJ1aWxkIHlvdXIKICAgKiAgIG93biBjdXN0b20gSFRNTCBlbGVtZW50cy4KICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBQcm90b3R5cGUgZm9yIHRoZSBjdXN0b20gZWxlbWVudC4gSXQgbXVzdCBjb250YWluCiAgICogICBhbiBgaXNgIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIGVsZW1lbnQgbmFtZS4gT3RoZXIgcHJvcGVydGllcyBwb3B1bGF0ZQogICAqICAgdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGUgYHByb3BlcnRpZXNgLCBgb2JzZXJ2ZXJzYCwgYGhvc3RBdHRyaWJ1dGVzYCwKICAgKiAgIGFuZCBgbGlzdGVuZXJzYCBwcm9wZXJ0aWVzIGFyZSBwcm9jZXNzZWQgdG8gY3JlYXRlIGVsZW1lbnQgZmVhdHVyZXMuCiAgICogQHJldHVybiB7IU9iamVjdH0gUmV0dXJucyBhIGN1c3RvbSBlbGVtZW50IGNsYXNzIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZWQKICAgKiAgIHByb3RvdHlwZSBgaW5mb2Agb2JqZWN0LiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpZiBnaXZlbiBieSBgaW5mby5pc2AuCiAgICovCiAgd2luZG93LlBvbHltZXIgPSBmdW5jdGlvbihpbmZvKSB7CiAgICByZXR1cm4gd2luZG93LlBvbHltZXIuX3BvbHltZXJGbihpbmZvKTsKICB9OwoKICAvLyBzdXBwb3J0IHVzZXIgc2V0dGluZ3Mgb24gdGhlIFBvbHltZXIgb2JqZWN0CiAgaWYgKHVzZXJQb2x5bWVyKSB7CiAgICBPYmplY3QuYXNzaWduKFBvbHltZXIsIHVzZXJQb2x5bWVyKTsKICB9CgogIC8vIFRvIGJlIHBsdWdnZWQgYnkgbGVnYWN5IGltcGxlbWVudGF0aW9uIGlmIGxvYWRlZAogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUHJvdG90eXBlIGZvciB0aGUgY3VzdG9tIGVsZW1lbnQuIEl0IG11c3QgY29udGFpbgogICAqICAgYW4gYGlzYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBlbGVtZW50IG5hbWUuIE90aGVyIHByb3BlcnRpZXMgcG9wdWxhdGUKICAgKiAgIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhlIGBwcm9wZXJ0aWVzYCwgYG9ic2VydmVyc2AsIGBob3N0QXR0cmlidXRlc2AsCiAgICogICBhbmQgYGxpc3RlbmVyc2AgcHJvcGVydGllcyBhcmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBlbGVtZW50IGZlYXR1cmVzLgogICAqIEByZXR1cm4geyFPYmplY3R9IFJldHVybnMgYSBjdXN0b20gZWxlbWVudCBjbGFzcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVkCiAgICogICBwcm90b3R5cGUgYGluZm9gIG9iamVjdC4gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaWYgZ2l2ZW4gYnkgYGluZm8uaXNgLgogICAqLwogIHdpbmRvdy5Qb2x5bWVyLl9wb2x5bWVyRm4gPSBmdW5jdGlvbihpbmZvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgIHRocm93IG5ldyBFcnJvcignTG9hZCBwb2x5bWVyLmh0bWwgdG8gdXNlIHRoZSBQb2x5bWVyKCkgZnVuY3Rpb24uJyk7CiAgfTsKICAvKiBlc2xpbnQtZW5hYmxlICovCgogIHdpbmRvdy5Qb2x5bWVyLnZlcnNpb24gPSAnMi43LjAnOwoKICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogIC8qCiAgV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzIHJlcGxhY2VkIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XQogIFdlIGNhbm5vdCBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWUgYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLgogICovCiAgd2luZG93LkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSBmdW5jdGlvbihwcm9wLCBvYmopIHsKICAgIHJldHVybiBwcm9wOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSAqLwoKfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IENTU19VUkxfUlggPSAvKHVybFwoKShbXildKikoXCkpL2c7CiAgICBsZXQgQUJTX1VSTCA9IC8oXlwvKXwoXiMpfCheW1x3LVxkXSo6KS87CiAgICBsZXQgd29ya2luZ1VSTDsKICAgIGxldCByZXNvbHZlRG9jOwogICAgLyoqCiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJMIGFnYWluc3QgdGhlIHByb3ZpZGVkIGBiYXNlVXJpJy4KICAgICAqIAogICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgKiB3aXRoIGAvYCAoYWJzb2x1dGUgVVJMcykgb3IgYCNgIChoYXNoIGlkZW50aWZpZXJzKS4gIEZvciBnZW5lcmFsIHB1cnBvc2UKICAgICAqIFVSTCByZXNvbHV0aW9uLCB1c2UgYHdpbmRvdy5VUkxgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHJlc29sdmUKICAgICAqIEBwYXJhbSB7P3N0cmluZz19IGJhc2VVUkkgQmFzZSBVUkkgdG8gcmVzb2x2ZSB0aGUgVVJMIGFnYWluc3QKICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmVzb2x2ZWQgVVJMCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVVcmwodXJsLCBiYXNlVVJJKSB7CiAgICAgIGlmICh1cmwgJiYgQUJTX1VSTC50ZXN0KHVybCkpIHsKICAgICAgICByZXR1cm4gdXJsOwogICAgICB9CiAgICAgIC8vIExhenkgZmVhdHVyZSBkZXRlY3Rpb24uCiAgICAgIGlmICh3b3JraW5nVVJMID09PSB1bmRlZmluZWQpIHsKICAgICAgICB3b3JraW5nVVJMID0gZmFsc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKCdiJywgJ2h0dHA6Ly9hJyk7CiAgICAgICAgICB1LnBhdGhuYW1lID0gJ2MlMjBkJzsKICAgICAgICAgIHdvcmtpbmdVUkwgPSAodS5ocmVmID09PSAnaHR0cDovL2EvYyUyMGQnKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAvLyBzaWxlbnRseSBmYWlsCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghYmFzZVVSSSkgewogICAgICAgIGJhc2VVUkkgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICB9CiAgICAgIGlmICh3b3JraW5nVVJMKSB7CiAgICAgICAgcmV0dXJuIChuZXcgVVJMKHVybCwgYmFzZVVSSSkpLmhyZWY7CiAgICAgIH0KICAgICAgLy8gRmFsbGJhY2sgdG8gY3JlYXRpbmcgYW4gYW5jaG9yIGludG8gYSBkaXNjb25uZWN0ZWQgZG9jdW1lbnQuCiAgICAgIGlmICghcmVzb2x2ZURvYykgewogICAgICAgIHJlc29sdmVEb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ3RlbXAnKTsKICAgICAgICByZXNvbHZlRG9jLmJhc2UgPSByZXNvbHZlRG9jLmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKTsKICAgICAgICByZXNvbHZlRG9jLmhlYWQuYXBwZW5kQ2hpbGQocmVzb2x2ZURvYy5iYXNlKTsKICAgICAgICByZXNvbHZlRG9jLmFuY2hvciA9IHJlc29sdmVEb2MuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgIHJlc29sdmVEb2MuYm9keS5hcHBlbmRDaGlsZChyZXNvbHZlRG9jLmFuY2hvcik7CiAgICAgIH0KICAgICAgcmVzb2x2ZURvYy5iYXNlLmhyZWYgPSBiYXNlVVJJOwogICAgICByZXNvbHZlRG9jLmFuY2hvci5ocmVmID0gdXJsOwogICAgICByZXR1cm4gcmVzb2x2ZURvYy5hbmNob3IuaHJlZiB8fCB1cmw7CgogICAgfQoKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYW55IHJlbGF0aXZlIFVSTCdzIGluIHRoZSBnaXZlbiBDU1MgdGV4dCBhZ2FpbnN0IHRoZSBwcm92aWRlZAogICAgICogYG93bmVyRG9jdW1lbnRgJ3MgYGJhc2VVUklgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0IENTUyB0ZXh0IHRvIHByb2Nlc3MKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFByb2Nlc3NlZCBDU1MgdGV4dCB3aXRoIHJlc29sdmVkIFVSTCdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICByZXR1cm4gY3NzVGV4dC5yZXBsYWNlKENTU19VUkxfUlgsIGZ1bmN0aW9uKG0sIHByZSwgdXJsLCBwb3N0KSB7CiAgICAgICAgcmV0dXJuIHByZSArICdcJycgKwogICAgICAgICAgcmVzb2x2ZVVybCh1cmwucmVwbGFjZSgvWyInXS9nLCAnJyksIGJhc2VVUkkpICsKICAgICAgICAgICdcJycgKyBwb3N0OwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBwYXRoIGZyb20gYSBnaXZlbiBgdXJsYC4gVGhlIHBhdGggaW5jbHVkZXMgdGhlIHRyYWlsaW5nCiAgICAgKiBgL2AgZnJvbSB0aGUgdXJsLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHRyYW5zZm9ybQogICAgICogQHJldHVybiB7c3RyaW5nfSByZXNvbHZlZCBwYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhdGhGcm9tVXJsKHVybCkgewogICAgICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgfQoKICAgIC8qKgogICAgICogTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgVVJMJ3MuCiAgICAgKgogICAgICogQG5hbWVzcGFjZQogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdW1tYXJ5IE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSTCdzLgogICAgICovCiAgICBQb2x5bWVyLlJlc29sdmVVcmwgPSB7CiAgICAgIHJlc29sdmVDc3M6IHJlc29sdmVDc3MsCiAgICAgIHJlc29sdmVVcmw6IHJlc29sdmVVcmwsCiAgICAgIHBhdGhGcm9tVXJsOiBwYXRoRnJvbVVybAogICAgfTsKCiAgfSkoKTsKCgoKLyoqIEBzdXBwcmVzcyB7ZGVwcmVjYXRlZH0gKi8KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsLCBsZWdhY3kgc2V0dGluZ3MuCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIFBvbHltZXIuU2V0dGluZ3MgPSBQb2x5bWVyLlNldHRpbmdzIHx8IHt9OwoKICBQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyA9ICEod2luZG93LlNoYWR5RE9NKTsKICBQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZUNTU1Byb3BlcnRpZXMgPQogICAgQm9vbGVhbighd2luZG93LlNoYWR5Q1NTIHx8IHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3MpOwogIFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlQ3VzdG9tRWxlbWVudHMgPQogICAgISh3aW5kb3cuY3VzdG9tRWxlbWVudHMucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayk7CgoKICAvKioKICAgKiBHbG9iYWxseSBzZXR0YWJsZSBwcm9wZXJ0eSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8KICAgKiBgUG9seW1lci5FbGVtZW50TWl4aW5gIGluc3RhbmNlcywgdXNlZnVsIGZvciBiaW5kaW5nIGluIHRlbXBsYXRlcyB0bwogICAqIG1ha2UgVVJMJ3MgcmVsYXRpdmUgdG8gYW4gYXBwbGljYXRpb24ncyByb290LiAgRGVmYXVsdHMgdG8gdGhlIG1haW4KICAgKiBkb2N1bWVudCBVUkwsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1c2Vycy4gIEl0IG1heSBiZSB1c2VmdWwgdG8gc2V0CiAgICogYFBvbHltZXIucm9vdFBhdGhgIHRvIHByb3ZpZGUgYSBzdGFibGUgYXBwbGljYXRpb24gbW91bnQgcGF0aCB3aGVuCiAgICogdXNpbmcgY2xpZW50IHNpZGUgcm91dGluZy4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5yb290UGF0aCA9IFBvbHltZXIucm9vdFBhdGggfHwKICAgIFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsIHJvb3RQYXRoIHByb3BlcnR5IHVzZWQgYnkgYFBvbHltZXIuRWxlbWVudE1peGluYCBhbmQKICAgKiBhdmFpbGFibGUgdmlhIGBQb2x5bWVyLnJvb3RQYXRoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIG5ldyByb290IHBhdGgKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuc2V0Um9vdFBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICBQb2x5bWVyLnJvb3RQYXRoID0gcGF0aDsKICB9OwoKICAvKioKICAgKiBBIGdsb2JhbCBjYWxsYmFjayB1c2VkIHRvIHNhbml0aXplIGFueSB2YWx1ZSBiZWZvcmUgaW5zZXJ0aW5nIGl0IGludG8gdGhlIERPTS4gVGhlIGNhbGxiYWNrIHNpZ25hdHVyZSBpczoKICAgKgogICAqICAgICBQb2x5bWVyID0gewogICAqICAgICAgIHNhbml0aXplRE9NVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBuYW1lLCB0eXBlLCBub2RlKSB7IC4uLiB9CiAgICogICAgIH0KICAgKgogICAqIFdoZXJlOgogICAqCiAgICogYHZhbHVlYCBpcyB0aGUgdmFsdWUgdG8gc2FuaXRpemUuCiAgICogYG5hbWVgIGlzIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBvciBwcm9wZXJ0eSAoZm9yIGV4YW1wbGUsIGhyZWYpLgogICAqIGB0eXBlYCBpbmRpY2F0ZXMgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkOiBvbmUgb2YgcHJvcGVydHksIGF0dHJpYnV0ZSwgb3IgdGV4dC4KICAgKiBgbm9kZWAgaXMgdGhlIG5vZGUgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkLgogICAqCiAgICogQHR5cGUgeyhmdW5jdGlvbigqLHN0cmluZyxzdHJpbmcsTm9kZSk6Kil8dW5kZWZpbmVkfQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlIHx8IG51bGw7CgogIC8qKgogICAqIFNldHMgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGF2YWlsYWJsZSB2aWEgYFBvbHltZXIuc2FuaXRpemVET01WYWx1ZWAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KGZ1bmN0aW9uKCosc3RyaW5nLHN0cmluZyxOb2RlKToqKXx1bmRlZmluZWR9IG5ld1Nhbml0aXplRE9NVmFsdWUgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGNhbGxiYWNrCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFNhbml0aXplRE9NVmFsdWUgPSBmdW5jdGlvbihuZXdTYW5pdGl6ZURPTVZhbHVlKSB7CiAgICBQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUgPSBuZXdTYW5pdGl6ZURPTVZhbHVlOwogIH07CgogIC8qKgogICAqIEdsb2JhbGx5IHNldHRhYmxlIHByb3BlcnR5IHRvIG1ha2UgUG9seW1lciBHZXN0dXJlcyB1c2UgcGFzc2l2ZSBUb3VjaEV2ZW50IGxpc3RlbmVycyB3aGVuIHJlY29nbml6aW5nIGdlc3R1cmVzLgogICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgZ2VzdHVyZXMgbWFkZSBmcm9tIHRvdWNoIHdpbGwgbm90IGJlIGFibGUgdG8gcHJldmVudCBzY3JvbGxpbmcsIGFsbG93aW5nIGZvciBzbW9vdGhlcgogICAqIHNjcm9sbGluZyBwZXJmb3JtYW5jZS4KICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IFBvbHltZXIucGFzc2l2ZVRvdWNoR2VzdHVyZXMgfHwgZmFsc2U7CgogIC8qKgogICAqIFNldHMgYHBhc3NpdmVUb3VjaEdlc3R1cmVzYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzIHVzaW5nIFBvbHltZXIgR2VzdHVyZXMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlUGFzc2l2ZSBlbmFibGUgb3IgZGlzYWJsZSBwYXNzaXZlIHRvdWNoIGdlc3R1cmVzIGdsb2JhbGx5CiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFBhc3NpdmVUb3VjaEdlc3R1cmVzID0gZnVuY3Rpb24odXNlUGFzc2l2ZSkgewogICAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IHVzZVBhc3NpdmU7CiAgfTsKCiAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zIHx8CiAgICAgIHdpbmRvdy5Qb2x5bWVyU2V0dGluZ3MgJiYgd2luZG93LlBvbHltZXJTZXR0aW5ncy5sZWdhY3lPcHRpbWl6YXRpb25zIHx8IGZhbHNlOwoKICAvKioKICAgKiBTZXRzIGBsZWdhY3lPcHRpbWl6YXRpb25zYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzLiBFbmFibGVzCiAgICogb3B0aW1pemF0aW9ucyB3aGVuIG9ubHkgbGVnYWN5IFBvbHltZXIoKSBzdHlsZSBlbGVtZW50cyBhcmUgdXNlZC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtib29sZWFufSB1c2VMZWdhY3lPcHRpbWl6YXRpb25zIGVuYWJsZSBvciBkaXNhYmxlIGxlZ2FjeSBvcHRpbWl6YXRpb25zIGdsb2JhbGx5LgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5zZXRMZWdhY3lPcHRpbWl6YXRpb25zID0gZnVuY3Rpb24odXNlTGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gdXNlTGVnYWN5T3B0aW1pemF0aW9uczsKICB9Owp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5pcXVlIGdsb2JhbCBpZCBmb3IgZGVkdXBpbmcgbWl4aW5zLgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtGdW5jdGlvbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIE1peGluRnVuY3Rpb24oKXt9CiAgLyoqIEB0eXBlIHsoV2Vha01hcCB8IHVuZGVmaW5lZCl9ICovCiAgTWl4aW5GdW5jdGlvbi5wcm90b3R5cGUuX19taXhpbkFwcGxpY2F0aW9uczsKICAvKiogQHR5cGUgeyhPYmplY3QgfCB1bmRlZmluZWQpfSAqLwogIE1peGluRnVuY3Rpb24ucHJvdG90eXBlLl9fbWl4aW5TZXQ7CgogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogV3JhcHMgYW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gc3VjaCB0aGF0IHRoZSBtaXhpbiBpcyBvbmx5IGFwcGxpZWQKICAgKiBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhcHBsaWVkIGl0cyBiYXNlIGFyZ3VtZW50LiBBbHNvIG1lbW9pemVzIG1peGluCiAgICogYXBwbGljYXRpb25zLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAdGVtcGxhdGUgVAogICAqIEBwYXJhbSB7VH0gbWl4aW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gdG8gd3JhcAogICAqIEByZXR1cm4ge1R9CiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgUG9seW1lci5kZWR1cGluZ01peGluID0gZnVuY3Rpb24obWl4aW4pIHsKICAgIGxldCBtaXhpbkFwcGxpY2F0aW9ucyA9IC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zOwogICAgaWYgKCFtaXhpbkFwcGxpY2F0aW9ucykgewogICAgICBtaXhpbkFwcGxpY2F0aW9ucyA9IG5ldyBXZWFrTWFwKCk7CiAgICAgIC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zID0gbWl4aW5BcHBsaWNhdGlvbnM7CiAgICB9CiAgICAvLyBtYWludGFpbiBhIHVuaXF1ZSBpZCBmb3IgZWFjaCBtaXhpbgogICAgbGV0IG1peGluRGVkdXBlSWQgPSBkZWR1cGVJZCsrOwogICAgZnVuY3Rpb24gZGVkdXBpbmdNaXhpbihiYXNlKSB7CiAgICAgIGxldCBiYXNlU2V0ID0gLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oYmFzZSkuX19taXhpblNldDsKICAgICAgaWYgKGJhc2VTZXQgJiYgYmFzZVNldFttaXhpbkRlZHVwZUlkXSkgewogICAgICAgIHJldHVybiBiYXNlOwogICAgICB9CiAgICAgIGxldCBtYXAgPSBtaXhpbkFwcGxpY2F0aW9uczsKICAgICAgbGV0IGV4dGVuZGVkID0gbWFwLmdldChiYXNlKTsKICAgICAgaWYgKCFleHRlbmRlZCkgewogICAgICAgIGV4dGVuZGVkID0gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovKG1peGluKShiYXNlKTsKICAgICAgICBtYXAuc2V0KGJhc2UsIGV4dGVuZGVkKTsKICAgICAgfQogICAgICAvLyBjb3B5IGluaGVyaXRlZCBtaXhpbiBzZXQgZnJvbSB0aGUgZXh0ZW5kZWQgY2xhc3MsIG9yIHRoZSBiYXNlIGNsYXNzCiAgICAgIC8vIE5PVEU6IHdlIGF2b2lkIHVzZSBvZiBTZXQgaGVyZSBiZWNhdXNlIHNvbWUgYnJvd3NlciAoSUUxMSkKICAgICAgLy8gY2Fubm90IGV4dGVuZCBhIGJhc2UgU2V0IHZpYSB0aGUgY29uc3RydWN0b3IuCiAgICAgIGxldCBtaXhpblNldCA9IE9iamVjdC5jcmVhdGUoLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oZXh0ZW5kZWQpLl9fbWl4aW5TZXQgfHwgYmFzZVNldCB8fCBudWxsKTsKICAgICAgbWl4aW5TZXRbbWl4aW5EZWR1cGVJZF0gPSB0cnVlOwogICAgICAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhleHRlbmRlZCkuX19taXhpblNldCA9IG1peGluU2V0OwogICAgICByZXR1cm4gZXh0ZW5kZWQ7CiAgICB9CgogICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGRlZHVwaW5nTWl4aW4pOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgTU9EVUxFX1NUWUxFX0xJTktfU0VMRUNUT1IgPSAnbGlua1tyZWw9aW1wb3J0XVt0eXBlfj1jc3NdJzsKICBjb25zdCBJTkNMVURFX0FUVFIgPSAnaW5jbHVkZSc7CiAgY29uc3QgU0hBRFlfVU5TQ09QRURfQVRUUiA9ICdzaGFkeS11bnNjb3BlZCc7CgogIGZ1bmN0aW9uIGltcG9ydE1vZHVsZShtb2R1bGVJZCkgewogICAgY29uc3QgLyoqIFBvbHltZXIuRG9tTW9kdWxlICovIFBvbHltZXJEb21Nb2R1bGUgPSBjdXN0b21FbGVtZW50cy5nZXQoJ2RvbS1tb2R1bGUnKTsKICAgIGlmICghUG9seW1lckRvbU1vZHVsZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBQb2x5bWVyRG9tTW9kdWxlLmltcG9ydChtb2R1bGVJZCk7CiAgfQoKICBmdW5jdGlvbiBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpIHsKICAgIC8vIE5PVEU6IHBvbHlmaWxsIGFmZm9yZGFuY2UuCiAgICAvLyB1bmRlciB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwsIHRoZXJlIHdpbGwgYmUgbm8gJ2JvZHknLAogICAgLy8gYnV0IHRoZSBpbXBvcnQgcHNldWRvLWRvYyBjYW4gYmUgdXNlZCBkaXJlY3RseS4KICAgIGxldCBjb250YWluZXIgPSBpbXBvcnREb2MuYm9keSA/IGltcG9ydERvYy5ib2R5IDogaW1wb3J0RG9jOwogICAgY29uc3QgaW1wb3J0Q3NzID0gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY29udGFpbmVyLnRleHRDb250ZW50LAogICAgICBpbXBvcnREb2MuYmFzZVVSSSk7CiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGltcG9ydENzczsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIC8qKiBAdHlwZWRlZiB7e2Fzc2V0cGF0aDogc3RyaW5nfX0gKi8KICBsZXQgdGVtcGxhdGVXaXRoQXNzZXRQYXRoOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29sbGVjdGlvbiBDU1MgdGV4dCBmcm9tIGA8dGVtcGxhdGVzPmAsIGV4dGVybmFsCiAgICogc3R5bGVzaGVldHMsIGFuZCBgZG9tLW1vZHVsZWBzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciBjb2xsZWN0aW9uIENTUyB0ZXh0IGZyb20gdmFyaW91cyBzb3VyY2VzLgogICAqLwogIGNvbnN0IFN0eWxlR2F0aGVyID0gewoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZHMgTGlzdCBvZiBkb20tbW9kdWxlIGlkJ3Mgd2l0aGluIHdoaWNoIHRvCiAgICAgKiBzZWFyY2ggZm9yIGNzcy4KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCA8c3R5bGU+IGVsZW1lbnRzCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlcyhtb2R1bGVJZHMpIHsKICAgICAgY29uc3QgbW9kdWxlcyA9IG1vZHVsZUlkcy50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICBjb25zdCBzdHlsZXMgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuc3R5bGVzRnJvbU1vZHVsZShtb2R1bGVzW2ldKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlczsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiA8c3R5bGU+IGVsZW1lbnRzIGluIGEgZ2l2ZW4gYGRvbS1tb2R1bGVgLgogICAgICogU3R5bGVzIGluIGEgYGRvbS1tb2R1bGVgIGNhbiBjb21lIGVpdGhlciBmcm9tIGA8c3R5bGU+YHMgd2l0aGluIHRoZQogICAgICogZmlyc3QgYDx0ZW1wbGF0ZT5gLCBvciBlbHNlIGZyb20gb25lIG9yIG1vcmUKICAgICAqIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIG91dHNpZGUgdGhlIHRlbXBsYXRlLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgZG9tLW1vZHVsZSBpZCB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIHN0eWxlc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgY29uc3QgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CgogICAgICBpZiAoIW0pIHsKICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmaW5kIHN0eWxlIGRhdGEgaW4gbW9kdWxlIG5hbWVkJywgbW9kdWxlSWQpOwogICAgICAgIHJldHVybiBbXTsKICAgICAgfQoKICAgICAgaWYgKG0uX3N0eWxlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3Qgc3R5bGVzID0gW107CiAgICAgICAgLy8gbW9kdWxlIGltcG9ydHM6IDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPgogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuX3N0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG0pKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgICBzdHlsZXMucHVzaCguLi50aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCkpOwogICAgICAgIH0KCiAgICAgICAgbS5fc3R5bGVzID0gc3R5bGVzOwogICAgICB9CgogICAgICByZXR1cm4gbS5fc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGA8c3R5bGU+YCBlbGVtZW50cyB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gZ2F0aGVyIHN0eWxlcyBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBiYXNlVVJJIGZvciBzdHlsZSBjb250ZW50CiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBzdHlsZXMKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKSB7CiAgICAgIGlmICghdGVtcGxhdGUuX3N0eWxlcykgewogICAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgICBjb25zdCBlJCA9IHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKTsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBlJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGUgPSBlJFtpXTsKICAgICAgICAgIC8vIHN1cHBvcnQgc3R5bGUgc2hhcmluZyBieSBhbGxvd2luZyBzdHlsZXMgdG8gImluY2x1ZGUiCiAgICAgICAgICAvLyBvdGhlciBkb20tbW9kdWxlcyB0aGF0IGNvbnRhaW4gc3R5bGluZwogICAgICAgICAgbGV0IGluY2x1ZGUgPSBlLmdldEF0dHJpYnV0ZShJTkNMVURFX0FUVFIpOwogICAgICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICAgICAgc3R5bGVzLnB1c2goLi4udGhpcy5zdHlsZXNGcm9tTW9kdWxlcyhpbmNsdWRlKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgaW5kZXgsIHNlbGYpIHsKICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbmRleE9mKGl0ZW0pID09PSBpbmRleDsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJhc2VVUkkpIHsKICAgICAgICAgICAgZS50ZXh0Q29udGVudCA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlQ3NzKGUudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGVzLnB1c2goZSk7CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlLl9zdHlsZXMgPSBzdHlsZXM7CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXBsYXRlLl9zdHlsZXM7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyAgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIElkIG9mIGBkb20tbW9kdWxlYCB0byBnYXRoZXIgQ1NTIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtb2R1bGVJZCkgewogICAgICBsZXQgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CiAgICAgIHJldHVybiBtID8gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobSkgOiBbXTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIHN0eWxlcwogICAgICovCiAgICBfc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKSB7CiAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICBjb25zdCBwJCA9IG1vZHVsZS5xdWVyeVNlbGVjdG9yQWxsKE1PRFVMRV9TVFlMRV9MSU5LX1NFTEVDVE9SKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcCQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgcCA9IHAkW2ldOwogICAgICAgIGlmIChwLmltcG9ydCkgewogICAgICAgICAgY29uc3QgaW1wb3J0RG9jID0gcC5pbXBvcnQ7CiAgICAgICAgICBjb25zdCB1bnNjb3BlZCA9IHAuaGFzQXR0cmlidXRlKFNIQURZX1VOU0NPUEVEX0FUVFIpOwogICAgICAgICAgaWYgKHVuc2NvcGVkICYmICFpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUpIHsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpOwogICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoU0hBRFlfVU5TQ09QRURfQVRUUiwgJycpOwogICAgICAgICAgICBpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUgPSBzdHlsZTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWltcG9ydERvYy5fc3R5bGUpIHsKICAgICAgICAgICAgaW1wb3J0RG9jLl9zdHlsZSA9IHN0eWxlRm9ySW1wb3J0KGltcG9ydERvYyk7CiAgICAgICAgICB9CiAgICAgICAgICBzdHlsZXMucHVzaCh1bnNjb3BlZCA/IGltcG9ydERvYy5fdW5zY29wZWRTdHlsZSA6IGltcG9ydERvYy5fc3R5bGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlc0Zyb21Nb2R1bGVzYCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkcyBMaXN0IG9mIGRvbS1tb2R1bGUgaWQncyB3aXRoaW4gd2hpY2ggdG8KICAgICAqIHNlYXJjaCBmb3IgY3NzLgogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgcwogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICAgY3NzRnJvbU1vZHVsZXMobW9kdWxlSWRzKSB7CiAgICAgIGxldCBtb2R1bGVzID0gbW9kdWxlSWRzLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgIGxldCBjc3NUZXh0ID0gJyc7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjc3NUZXh0ICs9IHRoaXMuY3NzRnJvbU1vZHVsZShtb2R1bGVzW2ldKTsKICAgICAgfQogICAgICByZXR1cm4gY3NzVGV4dDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIGdpdmVuIGBkb20tbW9kdWxlYC4gIENTUyBpbiBhIGBkb20tbW9kdWxlYAogICAgICogY2FuIGNvbWUgZWl0aGVyIGZyb20gYDxzdHlsZT5gcyB3aXRoaW4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCwgb3IgZWxzZQogICAgICogZnJvbSBvbmUgb3IgbW9yZSBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBsaW5rcyBvdXRzaWRlIHRoZQogICAgICogdGVtcGxhdGUuCiAgICAgKgogICAgICogQW55IGA8c3R5bGVzPmAgcHJvY2Vzc2VkIGFyZSByZW1vdmVkIGZyb20gdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24uCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlRnJvbU1vZHVsZWAgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCBkb20tbW9kdWxlIGlkIHRvIGdhdGhlciBzdHlsZXMgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgbGV0IG0gPSBpbXBvcnRNb2R1bGUobW9kdWxlSWQpOwogICAgICBpZiAobSAmJiBtLl9jc3NUZXh0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBtb2R1bGUgaW1wb3J0czogPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+CiAgICAgICAgbGV0IGNzc1RleHQgPSB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgbGV0IHQgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHQpIHsKICAgICAgICAgIGNzc1RleHQgKz0gdGhpcy5jc3NGcm9tVGVtcGxhdGUodCwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCk7CiAgICAgICAgfQogICAgICAgIG0uX2Nzc1RleHQgPSBjc3NUZXh0IHx8IG51bGw7CiAgICAgIH0KICAgICAgaWYgKCFtKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCcsIG1vZHVsZUlkKTsKICAgICAgfQogICAgICByZXR1cm4gbSAmJiBtLl9jc3NUZXh0IHx8ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgb2YgYDxzdHlsZXM+YCB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBBbnkgYDxzdHlsZXM+YCBwcm9jZXNzZWQgYXJlIHJlbW92ZWQgZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbi4KICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZSBgc3R5bGVGcm9tVGVtcGxhdGVgIGluc3RlYWQuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIHNwZWNpZmllZCB0ZW1wbGF0ZQogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICBjc3NGcm9tVGVtcGxhdGUodGVtcGxhdGUsIGJhc2VVUkkpIHsKICAgICAgbGV0IGNzc1RleHQgPSAnJzsKICAgICAgY29uc3QgZSQgPSB0aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgYmFzZVVSSSk7CiAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZSQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZSA9IGUkW2ldOwogICAgICAgIGlmIChlLnBhcmVudE5vZGUpIHsKICAgICAgICAgIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTsKICAgICAgICB9CiAgICAgICAgY3NzVGV4dCArPSBlLnRleHRDb250ZW50OwogICAgICB9CiAgICAgIHJldHVybiBjc3NUZXh0OwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gCiAgICAgKiBsaW5rcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBgZG9tLW1vZHVsZWAuCiAgICAgKgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0c2AgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgSWQgb2YgYGRvbS1tb2R1bGVgIHRvIGdhdGhlciBDU1MgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZUlkKSB7CiAgICAgIGxldCBtID0gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKTsKICAgICAgcmV0dXJuIG0gPyB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKSA6ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiB0aGUgZG9tLW1vZHVsZQogICAgICovCiAgICAgX2Nzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZSkgewogICAgICBsZXQgY3NzVGV4dCA9ICcnOwogICAgICBsZXQgc3R5bGVzID0gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY3NzVGV4dCArPSBzdHlsZXNbaV0udGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICB9CiAgfTsKCiAgUG9seW1lci5TdHlsZUdhdGhlciA9IFN0eWxlR2F0aGVyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBtb2R1bGVzID0ge307CiAgbGV0IGxjTW9kdWxlcyA9IHt9OwogIGZ1bmN0aW9uIHNldE1vZHVsZShpZCwgbW9kdWxlKSB7CiAgICAvLyBzdG9yZSBpZCBzZXBhcmF0ZSBmcm9tIGxvd2VyY2FzZWQgaWQgc28gdGhhdAogICAgLy8gaW4gYWxsIGNhc2VzIG1peGVkQ2FzZSBpZCB3aWxsIHN0b3JlZCBkaXN0aW5jdGx5CiAgICAvLyBhbmQgbG93ZXJjYXNlIHZlcnNpb24gaXMgYSBmYWxsYmFjawogICAgbW9kdWxlc1tpZF0gPSBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV0gPSBtb2R1bGU7CiAgfQogIGZ1bmN0aW9uIGZpbmRNb2R1bGUoaWQpIHsKICAgIHJldHVybiBtb2R1bGVzW2lkXSB8fCBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV07CiAgfQoKICBmdW5jdGlvbiBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKGluc3QpIHsKICAgIGlmIChpbnN0LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpIHsKICAgICAgY29uc29sZS53YXJuKCdkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlJywgaW5zdC5pZCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGUgYGRvbS1tb2R1bGVgIGVsZW1lbnQgcmVnaXN0ZXJzIHRoZSBkb20gaXQgY29udGFpbnMgdG8gdGhlIG5hbWUgZ2l2ZW4KICAgKiBieSB0aGUgbW9kdWxlJ3MgaWQgYXR0cmlidXRlLiBJdCBwcm92aWRlcyBhIHVuaWZpZWQgZGF0YWJhc2Ugb2YgZG9tCiAgICogYWNjZXNzaWJsZSB2aWEgaXRzIHN0YXRpYyBgaW1wb3J0YCBBUEkuCiAgICoKICAgKiBBIGtleSB1c2UgY2FzZSBvZiBgZG9tLW1vZHVsZWAgaXMgZm9yIHByb3ZpZGluZyBjdXN0b20gZWxlbWVudCBgPHRlbXBsYXRlPmBzCiAgICogdmlhIEhUTUwgaW1wb3J0cyB0aGF0IGFyZSBwYXJzZWQgYnkgdGhlIG5hdGl2ZSBIVE1MIHBhcnNlciwgdGhhdCBjYW4gYmUKICAgKiByZWxvY2F0ZWQgZHVyaW5nIGEgYnVuZGxpbmcgcGFzcyBhbmQgc3RpbGwgbG9va2VkIHVwIGJ5IGBpZGAuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIDxkb20tbW9kdWxlIGlkPSJmb28iPgogICAqICAgICAgIDxpbWcgc3JjPSJzdHVmZi5wbmciPgogICAqICAgICA8L2RvbS1tb2R1bGU+CiAgICoKICAgKiBUaGVuIGluIGNvZGUgaW4gc29tZSBvdGhlciBsb2NhdGlvbiB0aGF0IGNhbm5vdCBhY2Nlc3MgdGhlIGRvbS1tb2R1bGUgYWJvdmUKICAgKgogICAqICAgICBsZXQgaW1nID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdkb20tbW9kdWxlJykuaW1wb3J0KCdmb28nLCAnaW1nJyk7CiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IHByb3ZpZGVzIGEgcmVnaXN0cnkgb2YgcmVsb2NhdGFibGUgRE9NIGNvbnRlbnQKICAgKiAgIGJ5IGBpZGAgdGhhdCBpcyBhZ25vc3RpYyB0byBidW5kbGluZy4KICAgKiBAdW5yZXN0cmljdGVkCiAgICovCiAgY2xhc3MgRG9tTW9kdWxlIGV4dGVuZHMgSFRNTEVsZW1lbnQgewoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydpZCddOyB9CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBjc3MgYHNlbGVjdG9yYCBpbiB0aGUgbW9kdWxlCiAgICAgKiByZWdpc3RlcmVkIGJ5IGBpZGAuIEZvciBleGFtcGxlLCB0aGlzLmltcG9ydCgnZm9vJywgJ2ltZycpOwogICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgZG9tLW1vZHVsZSBpbiB3aGljaCB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yIFRoZSBjc3Mgc2VsZWN0b3IgYnkgd2hpY2ggdG8gZmluZCB0aGUgZWxlbWVudC4KICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IFJldHVybnMgdGhlIGVsZW1lbnQgd2hpY2ggbWF0Y2hlcyBgc2VsZWN0b3JgIGluIHRoZQogICAgICogbW9kdWxlIHJlZ2lzdGVyZWQgYXQgdGhlIHNwZWNpZmllZCBgaWRgLgogICAgICovCiAgICBzdGF0aWMgaW1wb3J0KGlkLCBzZWxlY3RvcikgewogICAgICBpZiAoaWQpIHsKICAgICAgICBsZXQgbSA9IGZpbmRNb2R1bGUoaWQpOwogICAgICAgIGlmIChtICYmIHNlbGVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gbS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBDdXJyZW50IHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgIGlmIChvbGQgIT09IHZhbHVlKSB7CiAgICAgICAgdGhpcy5yZWdpc3RlcigpOwogICAgICB9CiAgICB9CiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1hcmdzICovCgogICAgLyoqCiAgICAgKiBUaGUgYWJzb2x1dGUgVVJMIG9mIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiBvZiB0aGlzIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBUaGlzIHZhbHVlIHdpbGwgZGlmZmVyIGZyb20gdGhpcyBlbGVtZW50J3MgYG93bmVyRG9jdW1lbnRgIGluIHRoZQogICAgICogZm9sbG93aW5nIHdheXM6CiAgICAgKiAtIFRha2VzIGludG8gYWNjb3VudCBhbnkgYGFzc2V0cGF0aGAgYXR0cmlidXRlIGFkZGVkIGR1cmluZyBidW5kbGluZwogICAgICogICB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYWwgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGJ1bmRsZWQgbG9jYXRpb24KICAgICAqIC0gVXNlcyB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwncyBgaW1wb3J0Rm9yRWxlbWVudGAgQVBJIHRvIGVuc3VyZQogICAgICogICB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgaW1wb3J0IGRvY3VtZW50J3MgbG9jYXRpb24gc2luY2UKICAgICAqICAgYG93bmVyRG9jdW1lbnRgIGlzIG5vdCBjdXJyZW50bHkgcG9seWZpbGxlZAogICAgICovCiAgICBnZXQgYXNzZXRwYXRoKCkgewogICAgICAvLyBEb24ndCBvdmVycmlkZSBleGlzdGluZyBhc3NldHBhdGguCiAgICAgIGlmICghdGhpcy5fX2Fzc2V0cGF0aCkgewogICAgICAgIC8vIG5vdGU6IGFzc2V0cGF0aCBzZXQgdmlhIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoaXMKICAgICAgICAvLyBlbGVtZW50J3MgbG9jYXRpb247IGFjY29tb2RhdGUgcG9seWZpbGxlZCBIVE1MSW1wb3J0cwogICAgICAgIGNvbnN0IG93bmVyID0gd2luZG93LkhUTUxJbXBvcnRzICYmIEhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQgPwogICAgICAgICAgSFRNTEltcG9ydHMuaW1wb3J0Rm9yRWxlbWVudCh0aGlzKSB8fCBkb2N1bWVudCA6IHRoaXMub3duZXJEb2N1bWVudDsKICAgICAgICBjb25zdCB1cmwgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCgKICAgICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdhc3NldHBhdGgnKSB8fCAnJywgb3duZXIuYmFzZVVSSSk7CiAgICAgICAgdGhpcy5fX2Fzc2V0cGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybCh1cmwpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9fYXNzZXRwYXRoOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIHRoZSBkb20tbW9kdWxlIGF0IGEgZ2l2ZW4gaWQuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAogICAgICogd2hlbiBhIGRvbS1tb2R1bGUgaXMgaW1wZXJhdGl2ZWx5IGNyZWF0ZWQuIEZvcgogICAgICogZXhhbXBsZSwgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RvbS1tb2R1bGUnKS5yZWdpc3RlcignZm9vJylgLgogICAgICogQHBhcmFtIHtzdHJpbmc9fSBpZCBUaGUgaWQgYXQgd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGRvbS1tb2R1bGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZWdpc3RlcihpZCkgewogICAgICBpZCA9IGlkIHx8IHRoaXMuaWQ7CiAgICAgIGlmIChpZCkgewogICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCByZWplY3QgYW5kIG51bGwgb3V0IGFueSByZS1yZWdpc3RlcmVkCiAgICAgICAgLy8gZG9tLW1vZHVsZSBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMgd2hldGhlciBmaXJzdC1pbiBvciBsYXN0LWluIGlzIHRydXN0ZWQgCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgZmluZE1vZHVsZShpZCkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgc2V0TW9kdWxlKGlkLCBudWxsKTsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGRvbS1tb2R1bGUgJHtpZH0gcmUtcmVnaXN0ZXJlZGApOwogICAgICAgIH0KICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgc2V0TW9kdWxlKGlkLCB0aGlzKTsKICAgICAgICBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICBEb21Nb2R1bGUucHJvdG90eXBlWydtb2R1bGVzJ10gPSBtb2R1bGVzOwoKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ2RvbS1tb2R1bGUnLCBEb21Nb2R1bGUpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5Eb21Nb2R1bGUgPSBEb21Nb2R1bGU7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIHN0cnVjdHVyZWQgZGF0YSBwYXRoIHN0cmluZ3MuCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCBzdHJpbmdzLgogICAqLwogIGNvbnN0IFBhdGggPSB7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHN0cnVjdHVyZWQgZGF0YSBwYXRoIChoYXMgZG90cykuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc1BhdGgoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzUGF0aCgnZm9vJykgICAgICAgICAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBjb250YWluZWQgb25lIG9yIG1vcmUgZG90cwogICAgICovCiAgICBpc1BhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZignLicpID49IDA7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcm9vdCBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gcGF0aC4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLnJvb3QoJ2Zvby5iYXIuYmF6JykgLy8gJ2ZvbycKICAgICAqIFBvbHltZXIuUGF0aC5yb290KCdmb28nKSAgICAgICAgIC8vICdmb28nCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5QYXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZwogICAgICogQHJldHVybiB7c3RyaW5nfSBSb290IHByb3BlcnR5IG5hbWUKICAgICAqLwogICAgcm9vdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBsZXQgZG90SW5kZXggPSBwYXRoLmluZGV4T2YoJy4nKTsKICAgICAgaWYgKGRvdEluZGV4ID09PSAtMSkgewogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGRvdEluZGV4KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBHaXZlbiBgYmFzZWAgaXMgYGZvby5iYXJgLCBgZm9vYCBpcyBhbiBhbmNlc3RvciwgYGZvby5iYXJgIGlzIG5vdAogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwYXRoIGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBiYXNlIHBhdGguCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhcicpICAgICAvLyBmYWxzZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhci5iYXonKSAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgUGF0aCBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdC4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYHBhdGhgIGlzIGFuIGFuY2VzdG9yIG9mIGBiYXNlYC4KICAgICAqLwogICAgaXNBbmNlc3RvcjogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICAvLyAgICAgYmFzZS5zdGFydHNXaXRoKHBhdGggKyAnLicpOwogICAgICByZXR1cm4gYmFzZS5pbmRleE9mKHBhdGggKyAnLicpID09PSAwOwogICAgfSwKCiAgICAvKioKICAgICAqIEdpdmVuIGBiYXNlYCBpcyBgZm9vLmJhcmAsIGBmb28uYmFyLmJhemAgaXMgYW4gZGVzY2VuZGFudAogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28uYmFyJykgICAgIC8vIGZhbHNlCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nIHRvIHRlc3QuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBwYXRoYCBpcyBhIGRlc2NlbmRhbnQgb2YgYGJhc2VgLgogICAgICovCiAgICBpc0Rlc2NlbmRhbnQ6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsKICAgICAgLy8gICAgIHBhdGguc3RhcnRzV2l0aChiYXNlICsgJy4nKTsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZihiYXNlICsgJy4nKSA9PT0gMDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBhIHByZXZpb3VzIGJhc2UgcGF0aCB3aXRoIGEgbmV3IGJhc2UgcGF0aCwgcHJlc2VydmluZyB0aGUKICAgICAqIHJlbWFpbmRlciBvZiB0aGUgcGF0aC4KICAgICAqCiAgICAgKiBVc2VyIG11c3QgZW5zdXJlIGBwYXRoYCBoYXMgYSBwcmVmaXggb2YgYGJhc2VgLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGgudHJhbnNsYXRlKCdmb28uYmFyJywgJ3pvdCcsICdmb28uYmFyLmJheicpIC8vICd6b3QuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgQ3VycmVudCBiYXNlIHN0cmluZyB0byByZW1vdmUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdCYXNlIE5ldyBiYXNlIHN0cmluZyB0byByZXBsYWNlIHdpdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdHJhbnNsYXRlCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRyYW5zbGF0ZWQgc3RyaW5nCiAgICAgKi8KICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24oYmFzZSwgbmV3QmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gbmV3QmFzZSArIHBhdGguc2xpY2UoYmFzZS5sZW5ndGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdAogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgcGF0aGAgaXMgZXF1YWwgdG8gYGJhc2VgCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgbWF0Y2hlczogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gKGJhc2UgPT09IHBhdGgpIHx8CiAgICAgICAgICAgICB0aGlzLmlzQW5jZXN0b3IoYmFzZSwgcGF0aCkgfHwKICAgICAgICAgICAgIHRoaXMuaXNEZXNjZW5kYW50KGJhc2UsIHBhdGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGFycmF5LWJhc2VkIHBhdGhzIHRvIGZsYXR0ZW5lZCBwYXRoLiAgU3RyaW5nLWJhc2VkIHBhdGhzCiAgICAgKiBhcmUgcmV0dXJuZWQgYXMtaXMuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5ub3JtYWxpemUoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gJ2Zvby5iYXIuMC5iYXonCiAgICAgKiBQb2x5bWVyLlBhdGgubm9ybWFsaXplKCdmb28uYmFyLjAuYmF6JykgICAgICAgIC8vICdmb28uYmFyLjAuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7c3RyaW5nfSBGbGF0dGVuZWQgcGF0aAogICAgICovCiAgICBub3JtYWxpemU6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGFyZ3MgPSBwYXRoW2ldLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgICAgICAgIGZvciAobGV0IGo9MDsgajxhcmdzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHBhcnRzLnB1c2goYXJnc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBTcGxpdHMgYSBwYXRoIGludG8gYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuIEFjY2VwdHMgZWl0aGVyIGFycmF5cwogICAgICogb2YgcGF0aCBwYXJ0cyBvciBzdHJpbmdzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguc3BsaXQoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gWydmb28nLCAnYmFyJywgJzAnLCAnYmF6J10KICAgICAqIFBvbHltZXIuUGF0aC5zcGxpdCgnZm9vLmJhci4wLmJheicpICAgICAgICAvLyBbJ2ZvbycsICdiYXInLCAnMCcsICdiYXonXQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7IUFycmF5PHN0cmluZz59IEFycmF5IG9mIHBhdGggcGFydHMKICAgICAqIEB0aGlzIHtQYXRofQogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzfQogICAgICovCiAgICBzcGxpdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZShwYXRoKS5zcGxpdCgnLicpOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gYSBwYXRoLiAgSWYgYW55IHN1Yi1wcm9wZXJ0eSBpbiB0aGUgcGF0aCBpcyBgdW5kZWZpbmVkYCwKICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAgKHdpbGwgbmV2ZXIgdGhyb3cuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtPYmplY3R9IHJvb3QgT2JqZWN0IGZyb20gd2hpY2ggdG8gZGVyZWZlcmVuY2UgcGF0aCBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIHJlYWQKICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaW5mbyBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgdG8gYGluZm9gLCB0aGUgbm9ybWFsaXplZAogICAgICogIChmbGF0dGVuZWQpIHBhdGggd2lsbCBiZSBzZXQgdG8gYGluZm8ucGF0aGAuCiAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSBhdCBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcGF0aCBjb3VsZCBub3QgYmUKICAgICAqICBmdWxseSBkZXJlZmVyZW5jZWQuCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgZ2V0OiBmdW5jdGlvbihyb290LCBwYXRoLCBpbmZvKSB7CiAgICAgIGxldCBwcm9wID0gcm9vdDsKICAgICAgbGV0IHBhcnRzID0gdGhpcy5zcGxpdChwYXRoKTsKICAgICAgLy8gTG9vcCBvdmVyIHBhdGggcGFydHNbMC4ubi0xXSBhbmQgZGVyZWZlcmVuY2UKICAgICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKCFwcm9wKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBwYXJ0ID0gcGFydHNbaV07CiAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgIH0KICAgICAgaWYgKGluZm8pIHsKICAgICAgICBpbmZvLnBhdGggPSBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHByb3A7CiAgICB9LAoKICAgIC8qKgogICAgICogU2V0cyBhIHZhbHVlIHRvIGEgcGF0aC4gIElmIGFueSBzdWItcHJvcGVydHkgaW4gdGhlIHBhdGggaXMgYHVuZGVmaW5lZGAsCiAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIG5vLW9wLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290IE9iamVjdCBmcm9tIHdoaWNoIHRvIGRlcmVmZXJlbmNlIHBhdGggZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBzZXQKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IHRvIHBhdGgKICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQgcGF0aAogICAgICogQHRoaXMge1BhdGh9CiAgICAgKi8KICAgIHNldDogZnVuY3Rpb24ocm9vdCwgcGF0aCwgdmFsdWUpIHsKICAgICAgbGV0IHByb3AgPSByb290OwogICAgICBsZXQgcGFydHMgPSB0aGlzLnNwbGl0KHBhdGgpOwogICAgICBsZXQgbGFzdCA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTsKICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAvLyBMb29wIG92ZXIgcGF0aCBwYXJ0c1swLi5uLTJdIGFuZCBkZXJlZmVyZW5jZQogICAgICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGgtMTsgaSsrKSB7CiAgICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldOwogICAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgICAgICBpZiAoIXByb3ApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBTZXQgdmFsdWUgdG8gb2JqZWN0IGF0IGVuZCBvZiBwYXRoCiAgICAgICAgcHJvcFtsYXN0XSA9IHZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNpbXBsZSBwcm9wZXJ0eSBzZXQKICAgICAgICBwcm9wW3BhdGhdID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJy4nKTsKICAgIH0KCiAgfTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCAoaGFzIGRvdHMpLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiAgVXNlIGBQb2x5bWVyLlBhdGguaXNQYXRoYCBpbnN0ZWFkLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYAogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgKiBgYGAKICAgKgogICAqIEBkZXByZWNhdGVkCiAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5lZCBvbmUgb3IgbW9yZSBkb3RzCiAgICovCiAgUGF0aC5pc0RlZXAgPSBQYXRoLmlzUGF0aDsKCiAgUG9seW1lci5QYXRoID0gUGF0aDsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgY2FzZU1hcCA9IHt9OwogIGNvbnN0IERBU0hfVE9fQ0FNRUwgPSAvLVthLXpdL2c7CiAgY29uc3QgQ0FNRUxfVE9fREFTSCA9IC8oW0EtWl0pL2c7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29udmVydGluZyBiZXR3ZWVuICJkYXNoLWNhc2UiIGFuZCAiY2FtZWxDYXNlIgogICAqIGlkZW50aWZpZXJzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHRoYXQgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gImRhc2gtY2FzZSIKICAgKiAgIGFuZCAiY2FtZWxDYXNlIi4KICAgKi8KICBjb25zdCBDYXNlTWFwID0gewoKICAgIC8qKgogICAgICogQ29udmVydHMgImRhc2gtY2FzZSIgaWRlbnRpZmllciAoZS5nLiBgZm9vLWJhci1iYXpgKSB0byAiY2FtZWxDYXNlIgogICAgICogKGUuZy4gYGZvb0JhckJhemApLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkNhc2VNYXAKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXNoIERhc2gtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENhbWVsLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlkZW50aWZpZXIKICAgICAqLwogICAgZGFzaFRvQ2FtZWxDYXNlKGRhc2gpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbZGFzaF0gfHwgKAogICAgICAgIGNhc2VNYXBbZGFzaF0gPSBkYXNoLmluZGV4T2YoJy0nKSA8IDAgPyBkYXNoIDogZGFzaC5yZXBsYWNlKERBU0hfVE9fQ0FNRUwsCiAgICAgICAgICAobSkgPT4gbVsxXS50b1VwcGVyQ2FzZSgpCiAgICAgICAgKQogICAgICApOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzICJjYW1lbENhc2UiIGlkZW50aWZpZXIgKGUuZy4gYGZvb0JhckJhemApIHRvICJkYXNoLWNhc2UiCiAgICAgKiAoZS5nLiBgZm9vLWJhci1iYXpgKS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5DYXNlTWFwCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FtZWwgQ2FtZWwtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IERhc2gtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWRlbnRpZmllcgogICAgICovCiAgICBjYW1lbFRvRGFzaENhc2UoY2FtZWwpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbY2FtZWxdIHx8ICgKICAgICAgICBjYXNlTWFwW2NhbWVsXSA9IGNhbWVsLnJlcGxhY2UoQ0FNRUxfVE9fREFTSCwgJy0kMScpLnRvTG93ZXJDYXNlKCkKICAgICAgKTsKICAgIH0KCiAgfTsKCiAgUG9seW1lci5DYXNlTWFwID0gQ2FzZU1hcDsKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gTWljcm90YXNrIGltcGxlbWVudGVkIHVzaW5nIE11dGF0aW9uIE9ic2VydmVyCiAgbGV0IG1pY3JvdGFza0N1cnJIYW5kbGUgPSAwOwogIGxldCBtaWNyb3Rhc2tMYXN0SGFuZGxlID0gMDsKICBsZXQgbWljcm90YXNrQ2FsbGJhY2tzID0gW107CiAgbGV0IG1pY3JvdGFza05vZGVDb250ZW50ID0gMDsKICBsZXQgbWljcm90YXNrTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICBuZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIobWljcm90YXNrRmx1c2gpLm9ic2VydmUobWljcm90YXNrTm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsKCiAgZnVuY3Rpb24gbWljcm90YXNrRmx1c2goKSB7CiAgICBjb25zdCBsZW4gPSBtaWNyb3Rhc2tDYWxsYmFja3MubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBsZXQgY2IgPSBtaWNyb3Rhc2tDYWxsYmFja3NbaV07CiAgICAgIGlmIChjYikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYigpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlOyB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1pY3JvdGFza0NhbGxiYWNrcy5zcGxpY2UoMCwgbGVuKTsKICAgIG1pY3JvdGFza0xhc3RIYW5kbGUgKz0gbGVuOwogIH0KCiAgLyoqCiAgICogTW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc3RyYXRlZ2llcyBmb3IgZW5xdWV1aW5nIGFzeW5jaHJvbm91cwogICAqIHRhc2tzLiAgRWFjaCBzdWItbW9kdWxlIHByb3ZpZGVzIGEgc3RhbmRhcmQgYHJ1bihmbilgIGludGVyZmFjZSB0aGF0IHJldHVybnMgYQogICAqIGhhbmRsZSwgYW5kIGEgYGNhbmNlbChoYW5kbGUpYCBpbnRlcmZhY2UgZm9yIGNhbmNlbGluZyBhc3luYyB0YXNrcyBiZWZvcmUKICAgKiB0aGV5IHJ1bi4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSB0aGF0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0cmF0ZWdpZXMgZm9yIGVucXVldWluZyBhc3luY2hyb25vdXMKICAgKiB0YXNrcy4KICAgKi8KICBQb2x5bWVyLkFzeW5jID0gewoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqLwogICAgdGltZU91dDogewogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIHN1Yi1tb2R1bGUgd2l0aCB0aGUgYXN5bmMgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgcHJvdmlkZWQKICAgICAgICogZGVsYXkuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLnRpbWVPdXQKICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgY2FsbGJhY2tzIGluIG1zCiAgICAgICAqIEByZXR1cm4geyFBc3luY0ludGVyZmFjZX0gQW4gYXN5bmMgdGltZW91dCBpbnRlcmZhY2UKICAgICAgICovCiAgICAgIGFmdGVyKGRlbGF5KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJ1bihmbikgeyByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsgfSwKICAgICAgICAgIGNhbmNlbChoYW5kbGUpIHsKICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyBhIGZ1bmN0aW9uIGNhbGxlZCBpbiB0aGUgbmV4dCB0YXNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy50aW1lT3V0CiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBmbiBDYWxsYmFjayB0byBydW4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBEZWxheSBpbiBtaWxsaXNlY29uZHMKICAgICAgICogQHJldHVybiB7bnVtYmVyfSBIYW5kbGUgdXNlZCBmb3IgY2FuY2VsaW5nIHRhc2sKICAgICAgICovCiAgICAgIHJ1bihmbiwgZGVsYXkpIHsKICAgICAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGVucXVldWVkIGB0aW1lT3V0YCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMudGltZU91dAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICovCiAgICBhbmltYXRpb25GcmFtZTogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgdGltaW5nLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6dm9pZH0gZm4gQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oZm4pIHsKICAgICAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgYW5pbWF0aW9uRnJhbWVgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4gIEZhbGxzIGJhY2sgdG8KICAgICAqIGBzZXRUaW1lb3V0YCBvbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqLwogICAgaWRsZVBlcmlvZDogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMuaWRsZVBlcmlvZAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFJZGxlRGVhZGxpbmUpOnZvaWR9IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrID8KICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuKSA6CiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmbiwgMTYpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYGlkbGVQZXJpb2RgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5pZGxlUGVyaW9kCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgd2luZG93LmNhbmNlbElkbGVDYWxsYmFjayA/CiAgICAgICAgICB3aW5kb3cuY2FuY2VsSWRsZUNhbGxiYWNrKGhhbmRsZSkgOgogICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIGZvciBlbnF1ZXVpbmcgY2FsbGJhY2tzIHRoYXQgcnVuIGF0IG1pY3JvdGFzayB0aW1pbmcuCiAgICAgKgogICAgICogTm90ZSB0aGF0IG1pY3JvdGFzayB0aW1pbmcgaXMgYWNoaWV2ZWQgdmlhIGEgc2luZ2xlIGBNdXRhdGlvbk9ic2VydmVyYCwKICAgICAqIGFuZCB0aHVzIGNhbGxiYWNrcyBlbnF1ZXVlZCB3aXRoIHRoaXMgQVBJIHdpbGwgYWxsIHJ1biBpbiBhIHNpbmdsZQogICAgICogYmF0Y2gsIGFuZCBub3QgaW50ZXJsZWF2ZWQgd2l0aCBvdGhlciBtaWNyb3Rhc2tzIHN1Y2ggYXMgcHJvbWlzZXMuCiAgICAgKiBQcm9taXNlcyBhcmUgYXZvaWRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBjaG9pY2UgZm9yIHRoZSB0aW1lIGJlaW5nCiAgICAgKiBkdWUgdG8gU2FmYXJpIGJ1Z3MgdGhhdCBjYXVzZSBQcm9taXNlcyB0byBsYWNrIG1pY3JvdGFzayBndWFyYW50ZWVzLgogICAgICoKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jCiAgICAgKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2UgZm9yIGVucXVldWluZyBjYWxsYmFja3MgdGhhdCBydW4gYXQgbWljcm90YXNrCiAgICAgKiAgIHRpbWluZy4KICAgICAqLwogICAgbWljcm9UYXNrOiB7CgogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgbWljcm90YXNrIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9uPX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oY2FsbGJhY2spIHsKICAgICAgICBtaWNyb3Rhc2tOb2RlLnRleHRDb250ZW50ID0gbWljcm90YXNrTm9kZUNvbnRlbnQrKzsKICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIG1pY3JvdGFza0N1cnJIYW5kbGUrKzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgbWljcm9UYXNrYCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgY29uc3QgaWR4ID0gaGFuZGxlIC0gbWljcm90YXNrTGFzdEhhbmRsZTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgIGlmICghbWljcm90YXNrQ2FsbGJhY2tzW2lkeF0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFzeW5jIGhhbmRsZTogJyArIGhhbmRsZSk7CiAgICAgICAgICB9CiAgICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3NbaWR4XSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgfQogIH07Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uICgpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqIEBjb25zdCB7IUFzeW5jSW50ZXJmYWNlfSAqLwogICAgY29uc3QgbWljcm90YXNrID0gUG9seW1lci5Bc3luYy5taWNyb1Rhc2s7CgogICAgLyoqCiAgICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgbWV0YS1wcm9ncmFtbWluZyBmb3IgY3JlYXRpbmcgb25lCiAgICAgKiBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycyAoZ2V0dGVyL3NldHRlciBwYWlyKSB0aGF0IGVucXVldWUgYW4gYXN5bmMKICAgICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAqCiAgICAgKiBGb3IgYmFzaWMgdXNhZ2Ugb2YgdGhpcyBtaXhpbiwgY2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzKHByb3BzKWAKICAgICAqIG9uY2UgYXQgY2xhc3MgZGVmaW5pdGlvbiB0aW1lIHRvIGNyZWF0ZSBwcm9wZXJ0eSBhY2Nlc3NvcnMgZm9yIHByb3BlcnRpZXMKICAgICAqIG5hbWVkIGluIHByb3BzLCBpbXBsZW1lbnQgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgdG8gcmVhY3QgYXMgZGVzaXJlZCB0bwogICAgICogcHJvcGVydHkgY2hhbmdlcywgYW5kIGltcGxlbWVudCBgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKWAgYW5kCiAgICAgKiBpbmNsdWRlIGxvd2VyY2FzZSB2ZXJzaW9ucyBvZiBhbnkgcHJvcGVydHkgbmFtZXMgdGhhdCBzaG91bGQgYmUgc2V0IGZyb20KICAgICAqIGF0dHJpYnV0ZXMuIExhc3QsIGNhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncwogICAgICogYGNvbm5lY3RlZENhbGxiYWNrYCB0byBlbmFibGUgdGhlIGFjY2Vzc29ycy4KICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIGZvciByZWFjdGluZyB0byBwcm9wZXJ0eSBjaGFuZ2VzIGZyb20KICAgICAqICAgZ2VuZXJhdGVkIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAqLwogICAgUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAgIC8qKgogICAgICAgKiBAcG9seW1lcgogICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAgKiBAZXh0ZW5kcyB7c3VwZXJDbGFzc30KICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAgICovCiAgICAgIGNsYXNzIFByb3BlcnRpZXNDaGFuZ2VkIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgcHJvcGVydHkgYWNjZXNzb3JzIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBwcm9wcyBPYmplY3Qgd2hvc2Uga2V5cyBhcmUgbmFtZXMgb2YgYWNjZXNzb3JzLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcykgewogICAgICAgICAgICAvLyBkb24ndCBzdG9tcCBhbiBleGlzdGluZyBhY2Nlc3NvcgogICAgICAgICAgICBpZiAoIShwcm9wIGluIHByb3RvKSkgewogICAgICAgICAgICAgIHByb3RvLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyB0aGUgbG93ZXJjYXNlZCBwcm9wZXJ0eSBuYW1lLiBPdmVycmlkZSB0bwogICAgICAgICAqIGN1c3RvbWl6ZSB0aGlzIG1hcHBpbmcuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRvIGNvbnZlcnQKICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBhdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGUgcG9pbnQgdG8gcHJvdmlkZSBhIHR5cGUgdG8gd2hpY2ggdG8gZGVzZXJpYWxpemUgYSB2YWx1ZSB0bwogICAgICAgICAqIGEgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyB0eXBlRm9yUHJvcGVydHkobmFtZSkgeyB9IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2V0dGVyL2dldHRlciBwYWlyIGZvciB0aGUgbmFtZWQgcHJvcGVydHkgd2l0aCBpdHMgb3duCiAgICAgICAgICogbG9jYWwgc3RvcmFnZS4gIFRoZSBnZXR0ZXIgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGxvY2FsIHN0b3JhZ2UsCiAgICAgICAgICogYW5kIHRoZSBzZXR0ZXIgY2FsbHMgYF9zZXRQcm9wZXJ0eWAsIHdoaWNoIHVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UKICAgICAgICAgKiBmb3IgdGhlIHByb3BlcnR5IGFuZCBlbnF1ZXVlcyBhIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBvbiBhIHByb3RvdHlwZSBvciBhbiBpbnN0YW5jZS4gIENhbGxpbmcKICAgICAgICAgKiB0aGlzIG1ldGhvZCBtYXkgb3ZlcndyaXRlIGEgcHJvcGVydHkgdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbgogICAgICAgICAqIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgYnkgY3JlYXRpbmcgdGhlIGFjY2Vzc29yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZDsgdGhlCiAgICAgICAgICogICBwcm90ZWN0ZWQgYF9zZXRQcm9wZXJ0eWAgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIHNldCB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpOwogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFIYXNBY2Nlc3NvcicpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0pIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0gPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIHRoZSBnaXZlbiBgcHJvcGVydHlgIHRvIGEgbWFwIG1hdGNoaW5nIGF0dHJpYnV0ZSBuYW1lcwogICAgICAgICAqIHRvIHByb3BlcnR5IG5hbWVzLCB1c2luZyBgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5YC4gVGhpcyBtYXAgaXMKICAgICAgICAgKiB1c2VkIHdoZW4gZGVzZXJpYWxpemluZyBhdHRyaWJ1dGUgdmFsdWVzIHRvIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKi8KICAgICAgICBfYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChwcm9wZXJ0eSkgewogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFBdHRyaWJ1dGVzJykpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW3Byb3BlcnR5XSkgewogICAgICAgICAgICBjb25zdCBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgICAgICB0aGlzLl9fZGF0YUF0dHJpYnV0ZXNbYXR0cl0gPSBwcm9wZXJ0eTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmluZXMgYSBwcm9wZXJ0eSBhY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlYWRPbmx5IFdoZW4gdHJ1ZSwgbm8gc2V0dGVyIGlzIGNyZWF0ZWQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgICBfZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwgewogICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICAgICAgICAvKiogQHRoaXMge1Byb3BlcnRpZXNDaGFuZ2VkfSAqLwogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoqIEB0aGlzIHtQcm9wZXJ0aWVzQ2hhbmdlZH0gKi8KICAgICAgICAgICAgc2V0OiByZWFkT25seSA/IGZ1bmN0aW9uICgpIHt9IDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgIHRoaXMuX19kYXRhRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7CiAgICAgICAgICB0aGlzLl9fZGF0YSA9IHt9OwogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gcHJvcGVydGllcyBhcmUgZW5hYmxlZCB2aWEKICAgICAgICAgKiBgX2VuYWJsZVByb3BlcnRpZXNgLgogICAgICAgICAqCiAgICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50IGJlaGF2aW9yIHRoYXQgaXMKICAgICAgICAgKiBkZXBlbmRlbnQgb24gdGhlIGVsZW1lbnQgaGF2aW5nIGl0cyBwcm9wZXJ0eSBkYXRhIGluaXRpYWxpemVkLCBlLmcuCiAgICAgICAgICogZnJvbSBkZWZhdWx0cyAoaW5pdGlhbGl6ZWQgZnJvbSBgY29uc3RydWN0b3JgLCBgX2luaXRpYWxpemVQcm9wZXJ0aWVzYCksCiAgICAgICAgICogYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AsIG9yIHZhbHVlcyBwcm9wYWdhdGVkIGZyb20gaG9zdCBlLmcuIHZpYQogICAgICAgICAqIGJpbmRpbmdzLiAgYHN1cGVyLnJlYWR5KClgIG11c3QgYmUgY2FsbGVkIHRvIGVuc3VyZSB0aGUgZGF0YSBzeXN0ZW0KICAgICAgICAgKiBiZWNvbWVzIGVuYWJsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSB0cnVlOwogICAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsaXplcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgICAqCiAgICAgICAgICogUHJvdmlkZWQgYXMgYW4gb3ZlcnJpZGUgcG9pbnQgZm9yIHBlcmZvcm1pbmcgYW55IHNldHVwIHdvcmsgcHJpb3IKICAgICAgICAgKiB0byBpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5IGFjY2Vzc29yIHN5c3RlbS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgIC8vIENhcHR1cmUgaW5zdGFuY2UgcHJvcGVydGllczsgdGhlc2Ugd2lsbCBiZSBzZXQgaW50byBhY2Nlc3NvcnMKICAgICAgICAgIC8vIGR1cmluZyBmaXJzdCBmbHVzaC4gRG9uJ3Qgc2V0IHRoZW0gaGVyZSwgc2luY2Ugd2Ugd2FudAogICAgICAgICAgLy8gdGhlc2UgdG8gb3ZlcndyaXRlIGRlZmF1bHRzL2NvbnN0cnVjdG9yIGFzc2lnbm1lbnRzCiAgICAgICAgICBmb3IgKGxldCBwIGluIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgfHwge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzW3BdID0gdGhpc1twXTsKICAgICAgICAgICAgICBkZWxldGUgdGhpc1twXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIGF0IHJlYWR5IHRpbWUgd2l0aCBiYWcgb2YgaW5zdGFuY2UgcHJvcGVydGllcyB0aGF0IG92ZXJ3cm90ZQogICAgICAgICAqIGFjY2Vzc29ycyB3aGVuIHRoZSBlbGVtZW50IHVwZ3JhZGVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICAgKiBzZXR0ZXIgYXQgcmVhZHkgdGltZS4gIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlCiAgICAgICAgICogcG9pbnQgZm9yIGN1c3RvbWl6aW5nIG9yIHByb3ZpZGluZyBtb3JlIGVmZmljaWVudCBpbml0aWFsaXphdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgcHJvcGVydHkgdmFsdWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbgogICAgICAgICAqICAgd2hlbiBjcmVhdGluZyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcHMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgYSBwcm9wZXJ0eSAodmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YCkKICAgICAgICAgKiBhbmQgZW5xdWV1ZXMgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpKSB7CiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICAgICAgICogQHJldHVybiB7Kn0gVmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgfQoKICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHksIHJlY29yZHMgdGhlIHByZXZpb3VzIHZhbHVlLAogICAgICAgICAqIGFuZCBhZGRzIGl0IHRvIHRoZSBzZXQgb2YgInBlbmRpbmcgY2hhbmdlcyIgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4gIFRoaXMgbWV0aG9kIGRvZXMgbm90IGVucXVldWUgdGhlCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGV4dCBOb3QgdXNlZCBoZXJlOyBhZmZvcmRhbmNlIGZvciBjbG9zdXJlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlLCBleHQpIHsKICAgICAgICAgIGxldCBvbGQgPSB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKTsKICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFQZW5kaW5nKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0ge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFbnN1cmUgb2xkIGlzIGNhcHR1cmVkIGZyb20gdGhlIGxhc3QgdHVybgogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFPbGQgJiYgIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YU9sZFtwcm9wZXJ0eV0gPSBvbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgICAgIH0KICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCgogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBwcm9wZXJ0aWVzIGFzIGludmFsaWQsIGFuZCBlbnF1ZXVlcyBhbiBhc3luYwogICAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUludmFsaWQgJiYgdGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSB0cnVlOwogICAgICAgICAgICBtaWNyb3Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnZhbGlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsIHRvIGVuYWJsZSBwcm9wZXJ0eSBhY2Nlc3NvciBwcm9jZXNzaW5nLiBCZWZvcmUgdGhpcyBtZXRob2QgaXMKICAgICAgICAgKiBjYWxsZWQgYWNjZXNzb3IgdmFsdWVzIHdpbGwgYmUgc2V0IGJ1dCBzaWRlIGVmZmVjdHMgYXJlCiAgICAgICAgICogcXVldWVkLiBXaGVuIGNhbGxlZCwgYW55IHBlbmRpbmcgc2lkZSBlZmZlY3RzIG9jY3VyIGltbWVkaWF0ZWx5LgogICAgICAgICAqIEZvciBlbGVtZW50cywgZ2VuZXJhbGx5IGBjb25uZWN0ZWRDYWxsYmFja2AgaXMgYSBub3JtYWwgc3BvdCB0byBkbyBzby4KICAgICAgICAgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seSB0dXJucyBvbgogICAgICAgICAqIHByb3BlcnR5IGFjY2Vzc29ycyBvbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2VuYWJsZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhRW5hYmxlZCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKSB7CiAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyh0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMpOwogICAgICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZWFkeSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbHMgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mCiAgICAgICAgICogcGVuZGluZyBjaGFuZ2VzIChhbmQgb2xkIHZhbHVlcyByZWNvcmRlZCB3aGVuIHBlbmRpbmcgY2hhbmdlcyB3ZXJlCiAgICAgICAgICogc2V0KSwgYW5kIHJlc2V0cyB0aGUgcGVuZGluZyBzZXQgb2YgY2hhbmdlcy4gR2VuZXJhbGx5LCB0aGlzIG1ldGhvZAogICAgICAgICAqIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHVzZXIgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuX19kYXRhOwogICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BzID0gdGhpcy5fX2RhdGFQZW5kaW5nOwogICAgICAgICAgY29uc3Qgb2xkID0gdGhpcy5fX2RhdGFPbGQ7CiAgICAgICAgICBpZiAodGhpcy5fc2hvdWxkUHJvcGVydGllc0NoYW5nZShwcm9wcywgY2hhbmdlZFByb3BzLCBvbGQpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBpbiBgX2ZsdXNoUHJvcGVydGllc2AgdG8gZGV0ZXJtaW5lIGlmIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogc2hvdWxkIGJlIGNhbGxlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmCiAgICAgICAgICogcHJvcGVydGllcyBhcmUgcGVuZGluZy4gT3ZlcnJpZGUgdG8gY3VzdG9taXplIHdoZW4KICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBpcyBjYWxsZWQuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50UHJvcHMgQmFnIG9mIGFsbCBjdXJyZW50IGFjY2Vzc29yIHZhbHVlcwogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICAgKiAgIGNhbGwgdG8gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBjaGFuZ2VkUHJvcHMgaXMgdHJ1dGh5CiAgICAgICAgICovCiAgICAgICAgX3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICAgIHJldHVybiBCb29sZWFuKGNoYW5nZWRQcm9wcyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiBhbnkgcHJvcGVydGllcyB3aXRoIGFjY2Vzc29ycyBjcmVhdGVkIHZpYQogICAgICAgICAqIGBfY3JlYXRlUHJvcGVydHlBY2Nlc3NvcmAgaGF2ZSBiZWVuIHNldC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY3VycmVudFByb3BzIEJhZyBvZiBhbGwgY3VycmVudCBhY2Nlc3NvciB2YWx1ZXMKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0aWVzQ2hhbmdlZChjdXJyZW50UHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTWV0aG9kIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZQogICAgICAgICAqIGNvbnNpZGVyZWQgYXMgYSBjaGFuZ2UgYW5kIGNhdXNlIHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIHRvIGJlIGVucXVldWVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBgdHJ1ZWAgaWYgYSBzdHJpY3QgZXF1YWxpdHkKICAgICAgICAgKiBjaGVjayBmYWlscy4gVGhlIG1ldGhvZCBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgYE5hTmAuCiAgICAgICAgICoKICAgICAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBlLmcuIHByb3ZpZGUgc3RyaWN0ZXIgY2hlY2tpbmcgZm9yCiAgICAgICAgICogT2JqZWN0cy9BcnJheXMgd2hlbiB1c2luZyBpbW11dGFibGUgcGF0dGVybnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHsqfSBvbGQgUHJldmlvdXMgcHJvcGVydHkgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgICAqICAgYW5kIGVucXVldWUgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjawogICAgICAgICAgICAob2xkICE9PSB2YWx1ZSAmJgogICAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyAob2xkPT1OYU4sIHZhbHVlPT1OYU4pIGFsd2F5cyByZXR1cm5zIGZhbHNlCiAgICAgICAgICAgICAgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpCiAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSkgewogICAgICAgICAgaWYgKG9sZCAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKSB7CiAgICAgICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzZXJpYWxpemVzIGFuIGF0dHJpYnV0ZSB0byBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBgX2Rlc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBzdHJpbmcgdG8KICAgICAgICAgKiBhIHR5cGVkIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBOYW1lIG9mIGF0dHJpYnV0ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAgICogQHBhcmFtIHsqPX0gdHlwZSB0eXBlIHRvIGRlc2VyaWFsaXplIHRvLCBkZWZhdWx0cyB0byB0aGUgdmFsdWUKICAgICAgICAgKiByZXR1cm5lZCBmcm9tIGB0eXBlRm9yUHJvcGVydHlgCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfYXR0cmlidXRlVG9Qcm9wZXJ0eShhdHRyaWJ1dGUsIHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19zZXJpYWxpemluZykgewogICAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9fZGF0YUF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gbWFwICYmIG1hcFthdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTsKICAgICAgICAgICAgdGhpc1twcm9wZXJ0eV0gPSB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlIHx8CiAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci50eXBlRm9yUHJvcGVydHkocHJvcGVydHkpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAgICoKICAgICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gQ2xvc3VyZSBjYW4ndCBmaWd1cmUgb3V0IGB0aGlzYCBpcyBhbiBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0IHRvLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHJlZmVjdC4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSB0cnVlOwogICAgICAgICAgdmFsdWUgPSAoYXJndW1lbnRzLmxlbmd0aCA8IDMpID8gdGhpc1twcm9wZXJ0eV0gOiB2YWx1ZTsKICAgICAgICAgIHRoaXMuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKSwgdmFsdWUsCiAgICAgICAgICAgIGF0dHJpYnV0ZSB8fCB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSkpOwogICAgICAgICAgdGhpcy5fX3NlcmlhbGl6aW5nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGEgdHlwZWQgdmFsdWUgdG8gYW4gSFRNTCBhdHRyaWJ1dGUgb24gYSBub2RlLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSB0eXBlZAogICAgICAgICAqIHZhbHVlIHRvIGEgc3RyaW5nLiAgSWYgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLAogICAgICAgICAqIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBib29sZWFuCiAgICAgICAgICogdHlwZSBgZmFsc2VgKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfdmFsdWVUb05vZGVBdHRyaWJ1dGUobm9kZSwgdmFsdWUsIGF0dHJpYnV0ZSkgewogICAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHN0cik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBzZXR0aW5nIEpTIHByb3BlcnR5IHZhbHVlcyB0bwogICAgICAgICAqIEhUTUwgYXR0cmlidXRlcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogc2VyaWFsaXphdGlvbiBmb3IgY3VzdG9tIHR5cGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZAogICAgICAgICAqIHByb3BlcnR5ICB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBfc2VyaWFsaXplVmFsdWUodmFsdWUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/ICcnIDogdW5kZWZpbmVkOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHJlYWRpbmcgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzIHRvCiAgICAgICAgICogSlMgcHJvcGVydGllcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gVHlwZXMgZm9yIGBCb29sZWFuYCwgYFN0cmluZ2AsCiAgICAgICAgICogYW5kIGBOdW1iZXJgIGNvbnZlcnQgYXR0cmlidXRlcyB0byB0aGUgZXhwZWN0ZWQgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgICAqIEByZXR1cm4geyp9IFR5cGVkIHZhbHVlIGRlc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlIEJvb2xlYW46CiAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAhPT0gbnVsbCk7CiAgICAgICAgICAgIGNhc2UgTnVtYmVyOgogICAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gUHJvcGVydGllc0NoYW5nZWQ7CiAgICB9KTsKCgogIH0pKCk7CgoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgY2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gU2F2ZSBtYXAgb2YgbmF0aXZlIHByb3BlcnRpZXM7IHRoaXMgZm9ybXMgYSBibGFja2xpc3Qgb3IgcHJvcGVydGllcwogIC8vIHRoYXQgd29uJ3QgaGF2ZSB0aGVpciB2YWx1ZXMgInNhdmVkIiBieSBgc2F2ZUFjY2Vzc29yVmFsdWVgLCBzaW5jZQogIC8vIHJlYWRpbmcgZnJvbSBhbiBIVE1MRWxlbWVudCBhY2Nlc3NvciBmcm9tIHRoZSBjb250ZXh0IG9mIGEgcHJvdG90eXBlIHRocm93cwogIGNvbnN0IG5hdGl2ZVByb3BlcnRpZXMgPSB7fTsKICBsZXQgcHJvdG8gPSBIVE1MRWxlbWVudC5wcm90b3R5cGU7CiAgd2hpbGUgKHByb3RvKSB7CiAgICBsZXQgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90byk7CiAgICBmb3IgKGxldCBpPTA7IGk8cHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgbmF0aXZlUHJvcGVydGllc1twcm9wc1tpXV0gPSB0cnVlOwogICAgfQogICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogIH0KCiAgLyoqCiAgICogVXNlZCB0byBzYXZlIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGgKICAgKiBhbiBhY2Nlc3Nvci4gSWYgdGhlIGBtb2RlbGAgaXMgYSBwcm90b3R5cGUsIHRoZSB2YWx1ZXMgd2lsbCBiZSBzYXZlZAogICAqIGluIGBfX2RhdGFQcm90b2AsIGFuZCBpdCdzIHVwIHRvIHRoZSB1c2VyIChvciBkb3duc3RyZWFtIG1peGluKSB0bwogICAqIGRlY2lkZSBob3cvd2hlbiB0byBzZXQgdGhlc2UgdmFsdWVzIGJhY2sgaW50byB0aGUgYWNjZXNzb3JzLgogICAqIElmIGBtb2RlbGAgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSAoaXQgaGFzIGEgYF9fZGF0YWAgcHJvcGVydHkpLCB0aGVuCiAgICogdGhlIHZhbHVlIHdpbGwgYmUgc2V0IGFzIGEgcGVuZGluZyBwcm9wZXJ0eSwgbWVhbmluZyB0aGUgdXNlciBzaG91bGQKICAgKiBjYWxsIGBfaW52YWxpZGF0ZVByb3BlcnRpZXNgIG9yIGBfZmx1c2hQcm9wZXJ0aWVzYCB0byB0YWtlIGVmZmVjdAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIFByb3RvdHlwZSBvciBpbnN0YW5jZQogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNhdmVBY2Nlc3NvclZhbHVlKG1vZGVsLCBwcm9wZXJ0eSkgewogICAgLy8gRG9uJ3QgcmVhZC9zdG9yZSB2YWx1ZSBmb3IgYW55IG5hdGl2ZSBwcm9wZXJ0aWVzIHNpbmNlIHRoZXkgY291bGQgdGhyb3cKICAgIGlmICghbmF0aXZlUHJvcGVydGllc1twcm9wZXJ0eV0pIHsKICAgICAgbGV0IHZhbHVlID0gbW9kZWxbcHJvcGVydHldOwogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChtb2RlbC5fX2RhdGEpIHsKICAgICAgICAgIC8vIEFkZGluZyBhY2Nlc3NvciB0byBpbnN0YW5jZTsgdXBkYXRlIHRoZSBwcm9wZXJ0eQogICAgICAgICAgLy8gSXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsIF9mbHVzaFByb3BlcnRpZXMKICAgICAgICAgIG1vZGVsLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQWRkaW5nIGFjY2Vzc29yIHRvIHByb3RvOyBzYXZlIHByb3RvJ3MgdmFsdWUgZm9yIGluc3RhbmNlLXRpbWUgdXNlCiAgICAgICAgICBpZiAoIW1vZGVsLl9fZGF0YVByb3RvKSB7CiAgICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvID0ge307CiAgICAgICAgICB9IGVsc2UgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX2RhdGFQcm90bycsIG1vZGVsKSkpIHsKICAgICAgICAgICAgbW9kZWwuX19kYXRhUHJvdG8gPSBPYmplY3QuY3JlYXRlKG1vZGVsLl9fZGF0YVByb3RvKTsKICAgICAgICAgIH0KICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIGJhc2ljIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIGNyZWF0aW5nIG9uZQogICAqIG9yIG1vcmUgcHJvcGVydHkgYWNjZXNzb3JzIChnZXR0ZXIvc2V0dGVyIHBhaXIpIHRoYXQgZW5xdWV1ZSBhbiBhc3luYwogICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgKgogICAqIEZvciBiYXNpYyB1c2FnZSBvZiB0aGlzIG1peGluOgogICAqIAogICAqIC0gICBEZWNsYXJlIGF0dHJpYnV0ZXMgdG8gb2JzZXJ2ZSB2aWEgdGhlIHN0YW5kYXJkIGBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpYC4gVXNlCiAgICogICAgIGBkYXNoLWNhc2VgIGF0dHJpYnV0ZSBuYW1lcyB0byByZXByZXNlbnQgYGNhbWVsQ2FzZWAgcHJvcGVydHkgbmFtZXMuIAogICAqIC0gICBJbXBsZW1lbnQgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIG9uIHRoZSBjbGFzcy4KICAgKiAtICAgQ2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpYCAqKm9uY2UqKiBvbiB0aGUgY2xhc3MgdG8gZ2VuZXJhdGUgCiAgICogICAgIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgZWFjaCBvYnNlcnZlZCBhdHRyaWJ1dGUuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCAKICAgKiAgICAgaW5zdGFuY2UgaXMgY3JlYXRlZCwgZm9yIGV4YW1wbGUsIGJ5IGNhbGxpbmcgaXQgYmVmb3JlIGNhbGxpbmcgYGN1c3RvbUVsZW1lbnRzLmRlZmluZWAuCiAgICogICAgIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBsYXppbHkgZnJvbSB0aGUgZWxlbWVudCdzIGBjb25zdHJ1Y3RvcmAsIGFzIGxvbmcgYXMgaXQncyBndWFyZGVkIHNvCiAgICogICAgIHRoYXQgdGhlIGNhbGwgaXMgb25seSBtYWRlIG9uY2UsIHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIGlzIGNyZWF0ZWQuCiAgICogLSAgIENhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncyBgY29ubmVjdGVkQ2FsbGJhY2tgIHRvIGVuYWJsZSAKICAgKiAgICAgdGhlIGFjY2Vzc29ycy4KICAgKgogICAqIEFueSBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKICAgKiBkZXNlcmlhbGl6ZWQgdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIGFuZCBzZXQgdG8gdGhlIGFzc29jaWF0ZWQKICAgKiBwcm9wZXJ0eSB1c2luZyBgZGFzaC1jYXNlYC10by1gY2FtZWxDYXNlYCBjb252ZW50aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiBmb3IgcmVhY3RpbmcgdG8gcHJvcGVydHkgY2hhbmdlcyBmcm9tCiAgICogICBnZW5lcmF0ZWQgcHJvcGVydHkgYWNjZXNzb3JzLgogICAqLwogIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtzdXBlckNsYXNzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICAgY29uc3QgYmFzZSA9IFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQoc3VwZXJDbGFzcyk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnR5QWNjZXNzb3JzIGV4dGVuZHMgYmFzZSB7CgogICAgICAvKioKICAgICAgICogR2VuZXJhdGVzIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIHN0YW5kYXJkCiAgICAgICAqIHN0YXRpYyBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBhcnJheS4KICAgICAgICoKICAgICAgICogQXR0cmlidXRlIG5hbWVzIGFyZSBtYXBwZWQgdG8gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIGBkYXNoLWNhc2VgIHRvCiAgICAgICAqIGBjYW1lbENhc2VgIGNvbnZlbnRpb24KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpIHsKICAgICAgICBsZXQgYSQgPSB0aGlzLm9ic2VydmVkQXR0cmlidXRlczsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBhJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IoY2FzZU1hcC5kYXNoVG9DYW1lbENhc2UoYSRbaV0pKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKiBCeSBkZWZhdWx0LCBjb252ZXJ0cyBjYW1lbCB0byBkYXNoIGNhc2UsIGUuZy4gYGZvb0JhcmAgdG8gYGZvby1iYXJgLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gY29udmVydAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIGNhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBQcm9wZXJ0aWVzQ2hhbmdlZCBpbXBsZW1lbnRhdGlvbiB0byBpbml0aWFsaXplIHZhbHVlcyBmb3IKICAgICAgICogYWNjZXNzb3JzIGNyZWF0ZWQgZm9yIHZhbHVlcyB0aGF0IGFscmVhZHkgZXhpc3RlZCBvbiB0aGUgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGUuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBpZiAodGhpcy5fX2RhdGFQcm90bykgewogICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyh0aGlzLl9fZGF0YVByb3RvKTsKICAgICAgICAgIHRoaXMuX19kYXRhUHJvdG8gPSBudWxsOwogICAgICAgIH0KICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCBhdCBpbnN0YW5jZSB0aW1lIHdpdGggYmFnIG9mIHByb3BlcnRpZXMgdGhhdCB3ZXJlIG92ZXJ3cml0dGVuCiAgICAgICAqIGJ5IGFjY2Vzc29ycyBvbiB0aGUgcHJvdG90eXBlIHdoZW4gYWNjZXNzb3JzIHdlcmUgY3JlYXRlZC4KICAgICAgICoKICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICogc2V0dGVyIGF0IGluc3RhbmNlIHRpbWUuICBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhbiBvdmVycmlkZQogICAgICAgKiBwb2ludCBmb3IgY3VzdG9taXppbmcgb3IgcHJvdmlkaW5nIG1vcmUgZWZmaWNpZW50IGluaXRpYWxpemF0aW9uLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIHByb3BlcnR5IHZhbHVlcyB0aGF0IHdlcmUgb3ZlcndyaXR0ZW4KICAgICAgICogICB3aGVuIGNyZWF0aW5nIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwLCBwcm9wc1twXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5zdXJlcyB0aGUgZWxlbWVudCBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4gSWYgaXQgZG9lcyBub3QsCiAgICAgICAqIGFzc2lnbnMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGNhbid0IGZpZ3VyZSBvdXQgYHRoaXNgIGlzIGluZmFjdCBhbiBlbGVtZW50CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgTmFtZSBvZiBhdHRyaWJ1dGUgdG8gZW5zdXJlIGlzIHNldC4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZW5zdXJlQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICBjb25zdCBlbCA9IC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKTsKICAgICAgICBpZiAoIWVsLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7CiAgICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZShlbCwgdmFsdWUsIGF0dHJpYnV0ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIFByb3BlcnRpZXNDaGFuZ2VkIGltcGxlbWVudGlvbiB0byBzZXJpYWxpemUgb2JqZWN0cyBhcyBKU09OLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSB2YWx1ZS4KICAgICAgICovCiAgICAgIF9zZXJpYWxpemVWYWx1ZSh2YWx1ZSkgewogICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWZhbGx0aHJvdWdoICovCiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKICAgICAgICAgIGNhc2UgJ29iamVjdCc6CiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpOwogICAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBzdXBlci5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFBvbHltZXIgd2hlbiByZWFkaW5nIEhUTUwgYXR0cmlidXRlIHZhbHVlcyB0bwogICAgICAgKiBKUyBwcm9wZXJ0aWVzLiAgVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9uIFBvbHltZXIgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGVzIHRvIHByb3ZpZGUgZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gIE5vdGUsCiAgICAgICAqIHRoZSBgdHlwZWAgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBgdHlwZWAgZmllbGQgcHJvdmlkZWQgaW4gdGhlCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgYSBnaXZlbiBwcm9wZXJ0eSwgYW5kIGlzCiAgICAgICAqIGJ5IGNvbnZlbnRpb24gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICoKICAgICAgICoKICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUgdG8gZGVzZXJpYWxpemUuCiAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlZCB2YWx1ZSBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nLgogICAgICAgKi8KICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAdHlwZSB7Kn0KICAgICAgICAgKi8KICAgICAgICBsZXQgb3V0VmFsdWU7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlIE9iamVjdDoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IEpTT04ucGFyc2UoLyoqIEB0eXBlIHtzdHJpbmd9ICovKHZhbHVlKSk7CiAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgIC8vIGFsbG93IG5vbi1KU09OIGxpdGVyYWxzIGxpa2UgU3RyaW5ncyBhbmQgTnVtYmVycwogICAgICAgICAgICAgIG91dFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIEFycmF5OgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIG91dFZhbHVlID0gSlNPTi5wYXJzZSgvKiogQHR5cGUge3N0cmluZ30gKi8odmFsdWUpKTsKICAgICAgICAgICAgfSBjYXRjaCh4KSB7CiAgICAgICAgICAgICAgb3V0VmFsdWUgPSBudWxsOwogICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUG9seW1lcjo6QXR0cmlidXRlczogY291bGRuJ3QgZGVjb2RlIEFycmF5IGFzIEpTT046ICR7dmFsdWV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIERhdGU6CiAgICAgICAgICAgIG91dFZhbHVlID0gaXNOYU4odmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIG91dFZhbHVlID0gbmV3IERhdGUob3V0VmFsdWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG91dFZhbHVlID0gc3VwZXIuX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dFZhbHVlOwogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tZmFsbHRocm91Z2ggKi8KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgUHJvcGVydGllc0NoYW5nZWQgaW1wbGVtZW50YXRpb24gdG8gc2F2ZSBleGlzdGluZyBwcm90b3R5cGUKICAgICAgICogcHJvcGVydHkgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgcmVzZXQuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZWFkT25seSBXaGVuIHRydWUsIG5vIHNldHRlciBpcyBjcmVhdGVkCiAgICAgICAqCiAgICAgICAqIFdoZW4gY2FsbGluZyBvbiBhIHByb3RvdHlwZSwgYW55IG92ZXJ3cml0dGVuIHZhbHVlcyBhcmUgc2F2ZWQgaW4KICAgICAgICogYF9fZGF0YVByb3RvYCwgYW5kIGl0IGlzIHVwIHRvIHRoZSBzdWJjbGFzc2VyIHRvIGRlY2lkZSBob3cvd2hlbgogICAgICAgKiB0byBzZXQgdGhvc2UgcHJvcGVydGllcyBiYWNrIGludG8gdGhlIGFjY2Vzc29yLiAgV2hlbiBjYWxsaW5nIG9uIGFuCiAgICAgICAqIGluc3RhbmNlLCB0aGUgb3ZlcndyaXR0ZW4gdmFsdWUgaXMgc2V0IHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWAsCiAgICAgICAqIGFuZCB0aGUgdXNlciBzaG91bGQgY2FsbCBgX2ludmFsaWRhdGVQcm9wZXJ0aWVzYCBvciBgX2ZsdXNoUHJvcGVydGllc2AKICAgICAgICogZm9yIHRoZSB2YWx1ZXMgdG8gdGFrZSBlZmZlY3QuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSkgewogICAgICAgIHNhdmVBY2Nlc3NvclZhbHVlKHRoaXMsIHByb3BlcnR5KTsKICAgICAgICBzdXBlci5fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlicmFyeSBjcmVhdGVkIGFuIGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW4gYWNjZXNzb3Igd2FzIGNyZWF0ZWQKICAgICAgICovCiAgICAgIF9oYXNBY2Nlc3Nvcihwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yICYmIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcHJvcGVydHldOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGEgcGVuZGluZyBjaGFuZ2UuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBwcm9wZXJ0eSBoYXMgYSBwZW5kaW5nIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaXNQcm9wZXJ0eVBlbmRpbmcocHJvcCkgewogICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX19kYXRhUGVuZGluZyAmJiAocHJvcCBpbiB0aGlzLl9fZGF0YVBlbmRpbmcpKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gUHJvcGVydHlBY2Nlc3NvcnM7CgogIH0pOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCwgTm9kZUZpbHRlci5TSE9XX0FMTCwKICAgICAgbnVsbCwgZmFsc2UpOwoKICAvLyAxLnggYmFja3dhcmRzLWNvbXBhdGlibGUgYXV0by13cmFwcGVyIGZvciB0ZW1wbGF0ZSB0eXBlIGV4dGVuc2lvbnMKICAvLyBUaGlzIGlzIGEgY2xlYXIgbGF5ZXJpbmcgdmlvbGF0aW9uIGFuZCBnaXZlcyBmYXZvcmVkLW5hdGlvbiBzdGF0dXMgdG8KICAvLyBkb20taWYgYW5kIGRvbS1yZXBlYXQgdGVtcGxhdGVzLiAgVGhpcyBpcyBhIGNvbmNlaXQgd2UncmUgY2hvb3NpbmcgdG8ga2VlcAogIC8vIGEuKSB0byBlYXNlIDEueCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBkdWUgdG8gbG9zcyBvZiBgaXNgLCBhbmQKICAvLyBiLikgdG8gbWFpbnRhaW4gaWYvcmVwZWF0IGNhcGFiaWxpdHkgaW4gcGFyc2VyLWNvbnN0cmFpbmVkIGVsZW1lbnRzCiAgLy8gICAgIChlLmcuIHRhYmxlLCBzZWxlY3QpIGluIGxpZXUgb2YgbmF0aXZlIENFIHR5cGUgZXh0ZW5zaW9ucyB3aXRob3V0CiAgLy8gICAgIG1hc3NpdmUgbmV3IGludmVudGlvbiBpbiB0aGlzIHNwYWNlIChlLmcuIGRpcmVjdGl2ZSBzeXN0ZW0pCiAgY29uc3QgdGVtcGxhdGVFeHRlbnNpb25zID0gewogICAgJ2RvbS1pZic6IHRydWUsCiAgICAnZG9tLXJlcGVhdCc6IHRydWUKICB9OwogIGZ1bmN0aW9uIHdyYXBUZW1wbGF0ZUV4dGVuc2lvbihub2RlKSB7CiAgICBsZXQgaXMgPSBub2RlLmdldEF0dHJpYnV0ZSgnaXMnKTsKICAgIGlmIChpcyAmJiB0ZW1wbGF0ZUV4dGVuc2lvbnNbaXNdKSB7CiAgICAgIGxldCB0ID0gbm9kZTsKICAgICAgdC5yZW1vdmVBdHRyaWJ1dGUoJ2lzJyk7CiAgICAgIG5vZGUgPSB0Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChpcyk7CiAgICAgIHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgdCk7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodCk7CiAgICAgIHdoaWxlKHQuYXR0cmlidXRlcy5sZW5ndGgpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSwgdC5hdHRyaWJ1dGVzWzBdLnZhbHVlKTsKICAgICAgICB0LnJlbW92ZUF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gZmluZFRlbXBsYXRlTm9kZShyb290LCBub2RlSW5mbykgewogICAgLy8gcmVjdXJzaXZlbHkgYXNjZW5kIHRyZWUgdW50aWwgd2UgaGl0IHJvb3QKICAgIGxldCBwYXJlbnQgPSBub2RlSW5mby5wYXJlbnRJbmZvICYmIGZpbmRUZW1wbGF0ZU5vZGUocm9vdCwgbm9kZUluZm8ucGFyZW50SW5mbyk7CiAgICAvLyB1bndpbmQgdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIGluZGV4ZWQgbm9kZSBhdCBlYWNoIGxldmVsCiAgICBpZiAocGFyZW50KSB7CiAgICAgIC8vIG5vdGU6IG1hcmdpbmFsbHkgZmFzdGVyIHRoYW4gaW5kZXhpbmcgdmlhIGNoaWxkTm9kZXMKICAgICAgLy8gKGh0dHA6Ly9qc3BlcmYuY29tL2NoaWxkbm9kZXMtbG9va3VwKQogICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBwYXJlbnQ7CiAgICAgIGZvciAobGV0IG49d2Fsa2VyLmZpcnN0Q2hpbGQoKSwgaT0wOyBuOyBuPXdhbGtlci5uZXh0U2libGluZygpKSB7CiAgICAgICAgaWYgKG5vZGVJbmZvLnBhcmVudEluZGV4ID09PSBpKyspIHsKICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgfQoKICAvLyBjb25zdHJ1Y3QgYCRgIG1hcCAoZnJvbSBpZCBhbm5vdGF0aW9ucykKICBmdW5jdGlvbiBhcHBseUlkVG9NYXAoaW5zdCwgbWFwLCBub2RlLCBub2RlSW5mbykgewogICAgaWYgKG5vZGVJbmZvLmlkKSB7CiAgICAgIG1hcFtub2RlSW5mby5pZF0gPSBub2RlOwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBldmVudCBsaXN0ZW5lcnMgKGZyb20gZXZlbnQgYW5ub3RhdGlvbnMpCiAgZnVuY3Rpb24gYXBwbHlFdmVudExpc3RlbmVyKGluc3QsIG5vZGUsIG5vZGVJbmZvKSB7CiAgICBpZiAobm9kZUluZm8uZXZlbnRzICYmIG5vZGVJbmZvLmV2ZW50cy5sZW5ndGgpIHsKICAgICAgZm9yIChsZXQgaj0wLCBlJD1ub2RlSW5mby5ldmVudHMsIGU7IChqPGUkLmxlbmd0aCkgJiYgKGU9ZSRbal0pOyBqKyspIHsKICAgICAgICBpbnN0Ll9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGUubmFtZSwgZS52YWx1ZSwgaW5zdCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIHB1c2ggY29uZmlndXJhdGlvbiByZWZlcmVuY2VzIGF0IGNvbmZpZ3VyZSB0aW1lCiAgZnVuY3Rpb24gYXBwbHlUZW1wbGF0ZUNvbnRlbnQoaW5zdCwgbm9kZSwgbm9kZUluZm8pIHsKICAgIGlmIChub2RlSW5mby50ZW1wbGF0ZUluZm8pIHsKICAgICAgbm9kZS5fdGVtcGxhdGVJbmZvID0gbm9kZUluZm8udGVtcGxhdGVJbmZvOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlTm9kZUV2ZW50SGFuZGxlcihjb250ZXh0LCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgIC8vIEluc3RhbmNlcyBjYW4gb3B0aW9uYWxseSBoYXZlIGEgX21ldGhvZEhvc3Qgd2hpY2ggYWxsb3dzIHJlZGlyZWN0aW5nIHdoZXJlCiAgICAvLyB0byBmaW5kIG1ldGhvZHMuIEN1cnJlbnRseSB1c2VkIGJ5IGB0ZW1wbGF0aXplYC4KICAgIGNvbnRleHQgPSBjb250ZXh0Ll9tZXRob2RIb3N0IHx8IGNvbnRleHQ7CiAgICBsZXQgaGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGNvbnRleHRbbWV0aG9kTmFtZV0pIHsKICAgICAgICBjb250ZXh0W21ldGhvZE5hbWVdKGUsIGUuZGV0YWlsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2xpc3RlbmVyIG1ldGhvZCBgJyArIG1ldGhvZE5hbWUgKyAnYCBub3QgZGVmaW5lZCcpOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGhhbmRsZXI7CiAgfQoKICAvKioKICAgKiBFbGVtZW50IG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgdGVtcGxhdGUgcGFyc2luZyBhbmQgc3RhbXBpbmcsIGluY2x1ZGluZwogICAqIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUtcmVsYXRlZCBmZWF0dXJlcyBmb3Igc3RhbXBlZCB0ZW1wbGF0ZXM6CiAgICoKICAgKiAtIERlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyAoYG9uLWV2ZW50bmFtZT0ibGlzdGVuZXIiYCkKICAgKiAtIE1hcCBvZiBub2RlIGlkJ3MgdG8gc3RhbXBlZCBub2RlIGluc3RhbmNlcyAoYHRoaXMuJC5pZGApCiAgICogLSBOZXN0ZWQgdGVtcGxhdGUgY29udGVudCBjYWNoaW5nL3JlbW92YWwgYW5kIHJlLWluc3RhbGxhdGlvbiAocGVyZm9ybWFuY2UKICAgKiAgIG9wdGltaXphdGlvbikKICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBiYXNpYyB0ZW1wbGF0ZSBwYXJzaW5nIGFuZCBzdGFtcGluZwogICAqLwogIFBvbHltZXIuVGVtcGxhdGVTdGFtcCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfVGVtcGxhdGVTdGFtcH0KICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVTdGFtcCBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgLyoqCiAgICAgICAqIFNjYW5zIGEgdGVtcGxhdGUgdG8gcHJvZHVjZSB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGUtc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHJldHVybmVkLCBhbmQgbm9kZS0KICAgICAgICogc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiBvYmplY3RzIGluIGl0cyBmbGF0dGVuZWQgYG5vZGVJbmZvTGlzdGAKICAgICAgICogYXJyYXkuICBPbmx5IG5vZGVzIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IHdlcmUgcGFyc2VkIGFzIG5vZGVzIG9mCiAgICAgICAqIGludGVyZXN0IGNvbnRhaW4gYW4gb2JqZWN0IGluIGBub2RlSW5mb0xpc3RgLiAgRWFjaCBgbm9kZUluZm9gIG9iamVjdAogICAgICAgKiBjb250YWlucyBhbiBgaW5kZXhgIChgY2hpbGROb2Rlc2AgaW5kZXggaW4gcGFyZW50KSBhbmQgb3B0aW9uYWxseQogICAgICAgKiBgcGFyZW50YCwgd2hpY2ggcG9pbnRzIHRvIG5vZGUgaW5mbyBvZiBpdHMgcGFyZW50IChpbmNsdWRpbmcgaXRzIGluZGV4KS4KICAgICAgICoKICAgICAgICogVGhlIHRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGhhcyB0aGUgZm9sbG93aW5nCiAgICAgICAqIHN0cnVjdHVyZSAobWFueSBmaWVsZHMgb3B0aW9uYWwpOgogICAgICAgKgogICAgICAgKiBgYGBqcwogICAgICAgKiAgIHsKICAgICAgICogICAgIC8vIEZsYXR0ZW5lZCBsaXN0IG9mIG5vZGUgbWV0YWRhdGEgKGZvciBub2RlcyB0aGF0IGdlbmVyYXRlZCBtZXRhZGF0YSkKICAgICAgICogICAgIG5vZGVJbmZvTGlzdDogWwogICAgICAgKiAgICAgICB7CiAgICAgICAqICAgICAgICAgLy8gYGlkYCBhdHRyaWJ1dGUgZm9yIGFueSBub2RlcyB3aXRoIGlkJ3MgZm9yIGdlbmVyYXRpbmcgYCRgIG1hcAogICAgICAgKiAgICAgICAgIGlkOiB7c3RyaW5nfSwKICAgICAgICogICAgICAgICAvLyBgb24tZXZlbnQ9ImhhbmRsZXIiYCBtZXRhZGF0YQogICAgICAgKiAgICAgICAgIGV2ZW50czogWwogICAgICAgKiAgICAgICAgICAgewogICAgICAgKiAgICAgICAgICAgICBuYW1lOiB7c3RyaW5nfSwgICAvLyBldmVudCBuYW1lCiAgICAgICAqICAgICAgICAgICAgIHZhbHVlOiB7c3RyaW5nfSwgIC8vIGhhbmRsZXIgbWV0aG9kIG5hbWUKICAgICAgICogICAgICAgICAgIH0sIC4uLgogICAgICAgKiAgICAgICAgIF0sCiAgICAgICAqICAgICAgICAgLy8gTm90ZXMgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbmVkIGEgYDxzbG90PmAgZm9yIHNoYWR5IERPTQogICAgICAgKiAgICAgICAgIC8vIG9wdGltaXphdGlvbiBwdXJwb3NlcwogICAgICAgKiAgICAgICAgIGhhc0luc2VydGlvblBvaW50OiB7Ym9vbGVhbn0sCiAgICAgICAqICAgICAgICAgLy8gRm9yIG5lc3RlZCBgPHRlbXBsYXRlPmBgIG5vZGVzLCBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICB0ZW1wbGF0ZUluZm86IHtvYmplY3R9LCAvLyBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICAvLyBNZXRhZGF0YSB0byBhbGxvdyBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGluc3RhbmNlZCBub2RlCiAgICAgICAqICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGlzIG1ldGFkYXRhCiAgICAgICAqICAgICAgICAgcGFyZW50SW5mbzoge251bWJlcn0sICAgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBub2RlSW5mbz4KICAgICAgICogICAgICAgICBwYXJlbnRJbmRleDoge251bWJlcn0sICAvLyBpbmRleCBpbiBwYXJlbnQncyBgY2hpbGROb2Rlc2AgY29sbGVjdGlvbgogICAgICAgKiAgICAgICAgIGluZm9JbmRleDoge251bWJlcn0sICAgIC8vIGluZGV4IG9mIHRoaXMgYG5vZGVJbmZvYCBpbiBgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdGAKICAgICAgICogICAgICAgfSwKICAgICAgICogICAgICAgLi4uCiAgICAgICAqICAgICBdLAogICAgICAgKiAgICAgLy8gV2hlbiB0cnVlLCB0aGUgdGVtcGxhdGUgaGFkIHRoZSBgc3RyaXAtd2hpdGVzcGFjZWAgYXR0cmlidXRlCiAgICAgICAqICAgICAvLyBvciB3YXMgbmVzdGVkIGluIGEgdGVtcGxhdGUgd2l0aCB0aGF0IHNldHRpbmcKICAgICAgICogICAgIHN0cmlwV2hpdGVzcGFjZToge2Jvb2xlYW59LAogICAgICAgKiAgICAgLy8gRm9yIG5lc3RlZCB0ZW1wbGF0ZXMsIG5lc3RlZCB0ZW1wbGF0ZSBjb250ZW50IGlzIG1vdmVkIGludG8KICAgICAgICogICAgIC8vIGEgZG9jdW1lbnQgZnJhZ21lbnQgc3RvcmVkIGhlcmU7IHRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRvCiAgICAgICAqICAgICAvLyBhdm9pZCB0aGUgY29zdCBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xvbmluZwogICAgICAgKiAgICAgY29udGVudDoge0RvY3VtZW50RnJhZ21lbnR9CiAgICAgICAqICAgfQogICAgICAgKiBgYGAKICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qga2lja3Mgb2ZmIGEgcmVjdXJzaXZlIHRyZWV3YWxrIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKiAgICBfcGFyc2VUZW1wbGF0ZSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgKiAgICAgIF9wYXJzZVRlbXBsYXRlQ29udGVudCAgICAgICAgICAgICAgfAogICAgICAgKiAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlICA8LS0tLS0tLS0tLS0tfC0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlIC0tKyAgfAogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMgLS0tLS0tLS0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzCiAgICAgICAqICAgICAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlCiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiBUaGVzZSBtZXRob2RzIG1heSBiZSBvdmVycmlkZGVuIHRvIGFkZCBjdXN0b20gbWV0YWRhdGEgYWJvdXQgdGVtcGxhdGVzCiAgICAgICAqIHRvIGVpdGhlciBgdGVtcGxhdGVJbmZvYCBvciBgbm9kZUluZm9gLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGRlc3RydWN0aXZlIHRvIHRoZSB0ZW1wbGF0ZSwgaW4gdGhhdAogICAgICAgKiBlLmcuIGV2ZW50IGFubm90YXRpb25zIG1heSBiZSByZW1vdmVkIGFmdGVyIGJlaW5nIG5vdGVkIGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm89fSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmcm9tIHRoZSBvdXRlcgogICAgICAgKiAgIHRlbXBsYXRlLCBmb3IgcGFyc2luZyBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFBhcnNlZCB0ZW1wbGF0ZSBtZXRhZGF0YQogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlKHRlbXBsYXRlLCBvdXRlclRlbXBsYXRlSW5mbykgewogICAgICAgIC8vIHNpbmNlIGEgdGVtcGxhdGUgbWF5IGJlIHJlLXVzZWQsIG1lbW8taXplIG1ldGFkYXRhCiAgICAgICAgaWYgKCF0ZW1wbGF0ZS5fdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGUuX3RlbXBsYXRlSW5mbyA9IHt9OwogICAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdCA9IFtdOwogICAgICAgICAgdGVtcGxhdGVJbmZvLnN0cmlwV2hpdGVTcGFjZSA9IFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyB8fAogICAgICAgICAgICAob3V0ZXJUZW1wbGF0ZUluZm8gJiYgb3V0ZXJUZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlKSB8fAogICAgICAgICAgICB0ZW1wbGF0ZS5oYXNBdHRyaWJ1dGUoJ3N0cmlwLXdoaXRlc3BhY2UnKTsKICAgICAgICAgIHRoaXMuX3BhcnNlVGVtcGxhdGVDb250ZW50KHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIHtwYXJlbnQ6IG51bGx9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLl90ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGUodGVtcGxhdGUuY29udGVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgbm9kZSBhbmQgYWRkcyB0ZW1wbGF0ZSBhbmQgbm9kZSBtZXRhZGF0YSBiYXNlZCBvbgogICAgICAgKiB0aGUgY3VycmVudCBub2RlLCBhbmQgaXRzIGBjaGlsZE5vZGVzYCBhbmQgYGF0dHJpYnV0ZXNgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhZGQgY3VzdG9tIG5vZGUgb3IgdGVtcGxhdGUgc3BlY2lmaWMKICAgICAgICogbWV0YWRhdGEgYmFzZWQgb24gdGhpcyBub2RlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZDsKICAgICAgICBsZXQgZWxlbWVudCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSk7CiAgICAgICAgaWYgKGVsZW1lbnQubG9jYWxOYW1lID09ICd0ZW1wbGF0ZScgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdwcmVzZXJ2ZS1jb250ZW50JykpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT09ICdzbG90JykgewogICAgICAgICAgLy8gRm9yIFNoYWR5RG9tIG9wdGltaXphdGlvbiwgaW5kaWNhdGluZyB0aGVyZSBpcyBhbiBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgIHRlbXBsYXRlSW5mby5oYXNJbnNlcnRpb25Qb2ludCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGVsZW1lbnQ7CiAgICAgICAgaWYgKHdhbGtlci5maXJzdENoaWxkKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMoZWxlbWVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZXMgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgY2hpbGQgbm9kZXMgZm9yIHRoZSBnaXZlbiByb290IG5vZGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGFsc28gd3JhcHMgd2hpdGVsaXN0ZWQgbGVnYWN5IHRlbXBsYXRlIGV4dGVuc2lvbnMKICAgICAgICogKGBpcz0iZG9tLWlmImAgYW5kIGBpcz0iZG9tLXJlcGVhdCJgKSB3aXRoIHRoZWlyIGVxdWl2YWxlbnQgZWxlbWVudAogICAgICAgKiB3cmFwcGVycywgY29sbGFwc2VzIHRleHQgbm9kZXMsIGFuZCBzdHJpcHMgd2hpdGVzcGFjZSBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBpZiB0aGUgYHRlbXBsYXRlSW5mby5zdHJpcFdoaXRlc3BhY2VgIHNldHRpbmcgd2FzIHByb3ZpZGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IHJvb3QgUm9vdCBub2RlIHdob3NlIGBjaGlsZE5vZGVzYCB3aWxsIGJlIHBhcnNlZAogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMocm9vdCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGlmIChyb290LmxvY2FsTmFtZSA9PT0gJ3NjcmlwdCcgfHwgcm9vdC5sb2NhbE5hbWUgPT09ICdzdHlsZScpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gcm9vdDsKICAgICAgICBmb3IgKGxldCBub2RlPXdhbGtlci5maXJzdENoaWxkKCksIHBhcmVudEluZGV4PTAsIG5leHQ7IG5vZGU7IG5vZGU9bmV4dCkgewogICAgICAgICAgLy8gV3JhcCB0ZW1wbGF0ZXMKICAgICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PSAndGVtcGxhdGUnKSB7CiAgICAgICAgICAgIG5vZGUgPSB3cmFwVGVtcGxhdGVFeHRlbnNpb24obm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBjb2xsYXBzZSBhZGphY2VudCB0ZXh0Tm9kZXM6IGZpeGVzIGFuIElFIGlzc3VlIHRoYXQgY2FuIGNhdXNlCiAgICAgICAgICAvLyB0ZXh0IG5vZGVzIHRvIGJlIGluZXhwbGljYWJseSBzcGxpdCA9KAogICAgICAgICAgLy8gbm90ZSB0aGF0IHJvb3Qubm9ybWFsaXplKCkgc2hvdWxkIHdvcmsgYnV0IGRvZXMgbm90IHNvIHdlIGRvIHRoaXMKICAgICAgICAgIC8vIG1hbnVhbGx5LgogICAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gbm9kZTsKICAgICAgICAgIG5leHQgPSB3YWxrZXIubmV4dFNpYmxpbmcoKTsKICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICBsZXQgLyoqIE5vZGUgKi8gbiA9IG5leHQ7CiAgICAgICAgICAgIHdoaWxlIChuICYmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkpIHsKICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ICs9IG4udGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgbmV4dCA9IHdhbGtlci5uZXh0U2libGluZygpOwogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobik7CiAgICAgICAgICAgICAgbiA9IG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBzdHJpcCB3aGl0ZXNwYWNlCiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlICYmICFub2RlLnRleHRDb250ZW50LnRyaW0oKSkgewogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCBjaGlsZEluZm8gPSB7IHBhcmVudEluZGV4LCBwYXJlbnRJbmZvOiBub2RlSW5mbyB9OwogICAgICAgICAgaWYgKHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgY2hpbGRJbmZvKSkgewogICAgICAgICAgICBjaGlsZEluZm8uaW5mb0luZGV4ID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdC5wdXNoKC8qKiBAdHlwZSB7IU5vZGVJbmZvfSAqLyhjaGlsZEluZm8pKSAtIDE7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbmNyZW1lbnQgaWYgbm90IHJlbW92ZWQKICAgICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IG5vZGU7CiAgICAgICAgICBpZiAod2Fsa2VyLnBhcmVudE5vZGUoKSkgewogICAgICAgICAgICBwYXJlbnRJbmRleCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBjb250ZW50IGZvciB0aGUgZ2l2ZW4gbmVzdGVkIGA8dGVtcGxhdGU+YC4KICAgICAgICoKICAgICAgICogTmVzdGVkIHRlbXBsYXRlIGluZm8gaXMgc3RvcmVkIGFzIGB0ZW1wbGF0ZUluZm9gIGluIHRoZSBjdXJyZW50IG5vZGUncwogICAgICAgKiBgbm9kZUluZm9gLiBgdGVtcGxhdGUuY29udGVudGAgaXMgcmVtb3ZlZCBhbmQgc3RvcmVkIGluIGB0ZW1wbGF0ZUluZm9gLgogICAgICAgKiBJdCB3aWxsIHRoZW4gYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBob3N0IHRvIHNldCBpdCBiYWNrIHRvIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBhbmQgZm9yIHVzZXJzIHN0YW1waW5nIG5lc3RlZCB0ZW1wbGF0ZXMgdG8gdXNlIHRoZQogICAgICAgKiBgX2NvbnRlbnRGb3JUZW1wbGF0ZWAgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IGZvciB0aGlzIHRlbXBsYXRlCiAgICAgICAqIChhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQgdGhlIGNvc3Qgb2YgY2xvbmluZyBuZXN0ZWQgdGVtcGxhdGUgY29udGVudCkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlIChhIDx0ZW1wbGF0ZT4pCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiAgIHRoYXQgaW5jbHVkZXMgdGhlIHRlbXBsYXRlIGBub2RlYAogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCB0ZW1wbGF0ZUluZm8gPSB0aGlzLl9wYXJzZVRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvKTsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50ID0KICAgICAgICAgIG5vZGUuY29udGVudC5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKG5vZGUuY29udGVudCk7CiAgICAgICAgbm9kZUluZm8udGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRlbXBsYXRlIG5vZGUgYXR0cmlidXRlcyBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogZm9yIG5vZGVzIG9mIGludGVyZXN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcyhub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgLy8gTWFrZSBjb3B5IG9mIG9yaWdpbmFsIGF0dHJpYnV0ZSBsaXN0LCBzaW5jZSB0aGUgb3JkZXIgbWF5IGNoYW5nZQogICAgICAgIC8vIGFzIGF0dHJpYnV0ZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkCiAgICAgICAgbGV0IG5vdGVkID0gZmFsc2U7CiAgICAgICAgbGV0IGF0dHJzID0gQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpOwogICAgICAgIGZvciAobGV0IGk9YXR0cnMubGVuZ3RoLTEsIGE7IChhPWF0dHJzW2ldKTsgaS0tKSB7CiAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGEubmFtZSwgYS52YWx1ZSkgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RlZDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyBhIHNpbmdsZSB0ZW1wbGF0ZSBub2RlIGF0dHJpYnV0ZSBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvCiAgICAgICAqIGBub2RlSW5mb2AgZm9yIGF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QuCiAgICAgICAqCiAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWRkcyBtZXRhZGF0YSBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiBhbmQgYGlkYCBhdHRyaWJ1dGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBuYW1lLCB2YWx1ZSkgewogICAgICAgIC8vIGV2ZW50cyAob24tKikKICAgICAgICBpZiAobmFtZS5zbGljZSgwLCAzKSA9PT0gJ29uLScpIHsKICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzID0gbm9kZUluZm8uZXZlbnRzIHx8IFtdOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzLnB1c2goewogICAgICAgICAgICBuYW1lOiBuYW1lLnNsaWNlKDMpLAogICAgICAgICAgICB2YWx1ZQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gc3RhdGljIGlkCiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2lkJykgewogICAgICAgICAgbm9kZUluZm8uaWQgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBgY29udGVudGAgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEZvciBuZXN0ZWQgdGVtcGxhdGVzLCBQb2x5bWVyIHBlcmZvcm1zIGFuIG9wdGltaXphdGlvbiB0byBjYWNoZSBuZXN0ZWQKICAgICAgICogdGVtcGxhdGUgY29udGVudCB0byBhdm9pZCB0aGUgY29zdCBvZiBjbG9uaW5nIGRlZXBseSBuZXN0ZWQgdGVtcGxhdGVzLgogICAgICAgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgdGhlIGNhY2hlZCBjb250ZW50IGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHJldHJpZXZlIGBjb250ZW50YCBmb3IKICAgICAgICogQHJldHVybiB7RG9jdW1lbnRGcmFnbWVudH0gQ29udGVudCBmcmFnbWVudAogICAgICAgKi8KICAgICAgc3RhdGljIF9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50V2l0aEluZm99ICovICh0ZW1wbGF0ZSkuX3RlbXBsYXRlSW5mbzsKICAgICAgICByZXR1cm4gKHRlbXBsYXRlSW5mbyAmJiB0ZW1wbGF0ZUluZm8uY29udGVudCkgfHwgdGVtcGxhdGUuY29udGVudDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsb25lcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgY29udGVudCBhbmQgcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAqIGNvbnRhaW5pbmcgdGhlIGNsb25lZCBkb20uCiAgICAgICAqCiAgICAgICAqIFRoZSB0ZW1wbGF0ZSBpcyBwYXJzZWQgKG9uY2UgYW5kIG1lbW9pemVkKSB1c2luZyB0aGlzIGxpYnJhcnkncwogICAgICAgKiB0ZW1wbGF0ZSBwYXJzaW5nIGZlYXR1cmVzLCBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS1hZGRlZAogICAgICAgKiBmZWF0dXJlczoKICAgICAgICogKiBBZGRzIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiAqIEdlbmVyYXRlcyBhbiAiaWQgbWFwIiBmb3IgYWxsIG5vZGVzIHdpdGggaWQncyB1bmRlciBgJGAgb24gcmV0dXJuZWQKICAgICAgICogICBkb2N1bWVudCBmcmFnbWVudAogICAgICAgKiAqIFBhc3NlcyB0ZW1wbGF0ZSBpbmZvIGluY2x1ZGluZyBgY29udGVudGAgYmFjayB0byB0ZW1wbGF0ZXMgYXMKICAgICAgICogICBgX3RlbXBsYXRlSW5mb2AgKGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIGF2b2lkIGRlZXAgdGVtcGxhdGUKICAgICAgICogICBjbG9uaW5nKQogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhlIG1lbW9pemVkIHRlbXBsYXRlIHBhcnNpbmcgcHJvY2VzcyBpcyBkZXN0cnVjdGl2ZSB0byB0aGUKICAgICAgICogdGVtcGxhdGU6IGF0dHJpYnV0ZXMgZm9yIGJpbmRpbmdzIGFuZCBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgYXJlCiAgICAgICAqIHJlbW92ZWQgYWZ0ZXIgYmVpbmcgbm90ZWQgaW4gbm90ZXMsIGFuZCBhbnkgbmVzdGVkIGA8dGVtcGxhdGU+LmNvbnRlbnRgCiAgICAgICAqIGlzIHJlbW92ZWQgYW5kIHN0b3JlZCBpbiBub3RlcyBhcyB3ZWxsLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBQb2x5ZmlsbCBzdXBwb3J0OiBib290c3RyYXAgdGhlIHRlbXBsYXRlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuCiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5jb250ZW50ICYmCiAgICAgICAgICAgIHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50ICYmIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUpIHsKICAgICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUodGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IG5vZGVJbmZvID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdDsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50IHx8IHRlbXBsYXRlLmNvbnRlbnQ7CiAgICAgICAgbGV0IGRvbSA9IC8qKiBAdHlwZSB7RG9jdW1lbnRGcmFnbWVudH0gKi8gKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIC8vIE5PVEU6IFNoYWR5RG9tIG9wdGltaXphdGlvbiBpbmRpY2F0aW5nIHRoZXJlIGlzIGFuIGluc2VydGlvbiBwb2ludAogICAgICAgIGRvbS5fX25vSW5zZXJ0aW9uUG9pbnQgPSAhdGVtcGxhdGVJbmZvLmhhc0luc2VydGlvblBvaW50OwogICAgICAgIGxldCBub2RlcyA9IGRvbS5ub2RlTGlzdCA9IG5ldyBBcnJheShub2RlSW5mby5sZW5ndGgpOwogICAgICAgIGRvbS4kID0ge307CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPW5vZGVJbmZvLmxlbmd0aCwgaW5mbzsgKGk8bCkgJiYgKGluZm89bm9kZUluZm9baV0pOyBpKyspIHsKICAgICAgICAgIGxldCBub2RlID0gbm9kZXNbaV0gPSBmaW5kVGVtcGxhdGVOb2RlKGRvbSwgaW5mbyk7CiAgICAgICAgICBhcHBseUlkVG9NYXAodGhpcywgZG9tLiQsIG5vZGUsIGluZm8pOwogICAgICAgICAgYXBwbHlUZW1wbGF0ZUNvbnRlbnQodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgICBhcHBseUV2ZW50TGlzdGVuZXIodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgfQogICAgICAgIGRvbSA9IC8qKiBAdHlwZSB7IVN0YW1wZWRUZW1wbGF0ZX0gKi8oZG9tKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IG1ldGhvZCBuYW1lIGZvciB0aGUgZXZlbnQgcHJvdmlkZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBhIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBsb29rcyB1cCB0aGUgbWV0aG9kCiAgICAgICAqIG5hbWUgYXQgaGFuZGxpbmcgdGltZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBtZXRob2QKICAgICAgICogQHBhcmFtIHsqPX0gY29udGV4dCBDb250ZXh0IHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gKGRlZmF1bHRzCiAgICAgICAqICAgdG8gYG5vZGVgKQogICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gR2VuZXJhdGVkIGhhbmRsZXIgZnVuY3Rpb24KICAgICAgICovCiAgICAgIF9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSwgY29udGV4dCkgewogICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IG5vZGU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBjcmVhdGVOb2RlRXZlbnRIYW5kbGVyKGNvbnRleHQsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSk7CiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIHJldHVybiBoYW5kbGVyOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIHJlbW92ZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gVGVtcGxhdGVTdGFtcDsKCiAgfSk7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKiogQGNvbnN0IHtPYmplY3R9ICovCiAgY29uc3QgQ2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHVuaXF1ZSBJRCB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cyB0cmlnZ2VyZWQKICAvLyBmcm9tIG11bHRpcGxlIHByb3BlcnRpZXMgaW4gdGhlIHNhbWUgdHVybgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIFByb3BlcnR5IGVmZmVjdCB0eXBlczsgZWZmZWN0cyBhcmUgc3RvcmVkIG9uIHRoZSBwcm90b3R5cGUgdXNpbmcgdGhlc2Uga2V5cwogICAqIEBlbnVtIHtzdHJpbmd9CiAgICovCiAgY29uc3QgVFlQRVMgPSB7CiAgICBDT01QVVRFOiAnX19jb21wdXRlRWZmZWN0cycsCiAgICBSRUZMRUNUOiAnX19yZWZsZWN0RWZmZWN0cycsCiAgICBOT1RJRlk6ICdfX25vdGlmeUVmZmVjdHMnLAogICAgUFJPUEFHQVRFOiAnX19wcm9wYWdhdGVFZmZlY3RzJywKICAgIE9CU0VSVkU6ICdfX29ic2VydmVFZmZlY3RzJywKICAgIFJFQURfT05MWTogJ19fcmVhZE9ubHknCiAgfTsKCiAgLyoqIEBjb25zdCB7UmVnRXhwfSAqLwogIGNvbnN0IGNhcGl0YWxBdHRyaWJ1dGVSZWdleCA9IC9bQS1aXS87CgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogbmFtZTogKHN0cmluZyB8IHVuZGVmaW5lZCksCiAgICogc3RydWN0dXJlZDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLAogICAqIHdpbGRjYXJkOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhVHJpZ2dlcjsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogaW5mbzogPywKICAgKiB0cmlnZ2VyOiAoIURhdGFUcmlnZ2VyIHwgdW5kZWZpbmVkKSwKICAgKiBmbjogKCFGdW5jdGlvbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhRWZmZWN0OyAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgbGV0IFByb3BlcnR5RWZmZWN0c1R5cGU7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAvKioKICAgKiBFbnN1cmVzIHRoYXQgdGhlIG1vZGVsIGhhcyBhbiBvd24tcHJvcGVydHkgbWFwIG9mIGVmZmVjdHMgZm9yIHRoZSBnaXZlbiB0eXBlLgogICAqIFRoZSBtb2RlbCBtYXkgYmUgYSBwcm90b3R5cGUgb3IgYW4gaW5zdGFuY2UuCiAgICoKICAgKiBQcm9wZXJ0eSBlZmZlY3RzIGFyZSBzdG9yZWQgYXMgYXJyYXlzIG9mIGVmZmVjdHMgYnkgcHJvcGVydHkgaW4gYSBtYXAsCiAgICogYnkgbmFtZWQgdHlwZSBvbiB0aGUgbW9kZWwuIGUuZy4KICAgKgogICAqICAgX19jb21wdXRlRWZmZWN0czogewogICAqICAgICBmb286IFsgLi4uIF0sCiAgICogICAgIGJhcjogWyAuLi4gXQogICAqICAgfQogICAqCiAgICogSWYgdGhlIG1vZGVsIGRvZXMgbm90IHlldCBoYXZlIGFuIGVmZmVjdCBtYXAgZm9yIHRoZSB0eXBlLCBvbmUgaXMgY3JlYXRlZAogICAqIGFuZCByZXR1cm5lZC4gIElmIGl0IGRvZXMsIGJ1dCBpdCBpcyBub3QgYW4gb3duIHByb3BlcnR5IChpLmUuIHRoZQogICAqIHByb3RvdHlwZSBoYWQgZWZmZWN0cyksIHRoZSB0aGUgbWFwIGlzIGRlZXBseSBjbG9uZWQgYW5kIHRoZSBjb3B5IGlzCiAgICogc2V0IG9uIHRoZSBtb2RlbCBhbmQgcmV0dXJuZWQsIHJlYWR5IGZvciBuZXcgZWZmZWN0cyB0byBiZSBhZGRlZC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBQcm9wZXJ0eSBlZmZlY3QgdHlwZQogICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG93bi1wcm9wZXJ0eSBtYXAgb2YgZWZmZWN0cyBmb3IgdGhlIGdpdmVuIHR5cGUKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGVuc3VyZU93bkVmZmVjdE1hcChtb2RlbCwgdHlwZSkgewogICAgbGV0IGVmZmVjdHMgPSBtb2RlbFt0eXBlXTsKICAgIGlmICghZWZmZWN0cykgewogICAgICBlZmZlY3RzID0gbW9kZWxbdHlwZV0gPSB7fTsKICAgIH0gZWxzZSBpZiAoIW1vZGVsLmhhc093blByb3BlcnR5KHR5cGUpKSB7CiAgICAgIGVmZmVjdHMgPSBtb2RlbFt0eXBlXSA9IE9iamVjdC5jcmVhdGUobW9kZWxbdHlwZV0pOwogICAgICBmb3IgKGxldCBwIGluIGVmZmVjdHMpIHsKICAgICAgICBsZXQgcHJvdG9GeCA9IGVmZmVjdHNbcF07CiAgICAgICAgbGV0IGluc3RGeCA9IGVmZmVjdHNbcF0gPSBBcnJheShwcm90b0Z4Lmxlbmd0aCk7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHByb3RvRngubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGluc3RGeFtpXSA9IHByb3RvRnhbaV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWZmZWN0czsKICB9CgogIC8vIC0tIGVmZmVjdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBSdW5zIGFsbCBlZmZlY3RzIG9mIGEgZ2l2ZW4gdHlwZSBmb3IgdGhlIGdpdmVuIHNldCBvZiBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogb24gYW4gaW5zdGFuY2UuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB3aXRoIGVmZmVjdHMgdG8gcnVuCiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdHMgT2JqZWN0IG1hcCBvZiBwcm9wZXJ0eS10by1BcnJheSBvZiBlZmZlY3RzCiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdD19IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHMoaW5zdCwgZWZmZWN0cywgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBpZiAoZWZmZWN0cykgewogICAgICBsZXQgcmFuID0gZmFsc2U7CiAgICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICBpZiAocnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGVmZmVjdHMsIGlkLCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzLCBleHRyYUFyZ3MpKSB7CiAgICAgICAgICByYW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmFuOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogUnVucyBhIGxpc3Qgb2YgZWZmZWN0cyBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHdpdGggZWZmZWN0cyB0byBydW4KICAgKiBAcGFyYW0ge09iamVjdH0gZWZmZWN0cyBPYmplY3QgbWFwIG9mIHByb3BlcnR5LXRvLUFycmF5IG9mIGVmZmVjdHMKICAgKiBAcGFyYW0ge251bWJlcn0gZGVkdXBlSWQgQ291bnRlciB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cwogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE5hbWUgb2YgY2hhbmdlZCBwcm9wZXJ0eQogICAqIEBwYXJhbSB7Kn0gcHJvcHMgQ2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHsqfSBvbGRQcm9wcyBPbGQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHNGb3JQcm9wZXJ0eShpbnN0LCBlZmZlY3RzLCBkZWR1cGVJZCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBsZXQgcmFuID0gZmFsc2U7CiAgICBsZXQgcm9vdFByb3BlcnR5ID0gaGFzUGF0aHMgPyBQb2x5bWVyLlBhdGgucm9vdChwcm9wKSA6IHByb3A7CiAgICBsZXQgZnhzID0gZWZmZWN0c1tyb290UHJvcGVydHldOwogICAgaWYgKGZ4cykgewogICAgICBmb3IgKGxldCBpPTAsIGw9ZnhzLmxlbmd0aCwgZng7IChpPGwpICYmIChmeD1meHNbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKCFmeC5pbmZvIHx8IGZ4LmluZm8ubGFzdFJ1biAhPT0gZGVkdXBlSWQpICYmCiAgICAgICAgICAgICghaGFzUGF0aHMgfHwgcGF0aE1hdGNoZXNUcmlnZ2VyKHByb3AsIGZ4LnRyaWdnZXIpKSkgewogICAgICAgICAgaWYgKGZ4LmluZm8pIHsKICAgICAgICAgICAgZnguaW5mby5sYXN0UnVuID0gZGVkdXBlSWQ7CiAgICAgICAgICB9CiAgICAgICAgICBmeC5mbihpbnN0LCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGZ4LmluZm8sIGhhc1BhdGhzLCBleHRyYUFyZ3MpOwogICAgICAgICAgcmFuID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByYW47CiAgfQoKICAvKioKICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwcm9wZXJ0eS9wYXRoIHRoYXQgaGFzIGNoYW5nZWQgbWF0Y2hlcyB0aGUgdHJpZ2dlcgogICAqIGNyaXRlcmlhIGZvciBhbiBlZmZlY3QuICBBIHRyaWdnZXIgaXMgYSBkZXNjcmlwdG9yIHdpdGggdGhlIGZvbGxvd2luZwogICAqIHN0cnVjdHVyZSwgd2hpY2ggbWF0Y2hlcyB0aGUgZGVzY3JpcHRvcnMgcmV0dXJuZWQgZnJvbSBgcGFyc2VBcmdgLgogICAqIGUuZy4gZm9yIGBmb28uYmFyLipgOgogICAqIGBgYAogICAqIHRyaWdnZXI6IHsKICAgKiAgIG5hbWU6ICdhLmInLAogICAqICAgc3RydWN0dXJlZDogdHJ1ZSwKICAgKiAgIHdpbGRjYXJkOiB0cnVlCiAgICogfQogICAqIGBgYAogICAqIElmIG5vIHRyaWdnZXIgaXMgZ2l2ZW4sIHRoZSBwYXRoIGlzIGRlZW1lZCB0byBtYXRjaC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggb3IgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCiAgICogQHBhcmFtIHtEYXRhVHJpZ2dlcn0gdHJpZ2dlciBEZXNjcmlwdG9yCiAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcGF0aCBtYXRjaGVkIHRoZSB0cmlnZ2VyCiAgICovCiAgZnVuY3Rpb24gcGF0aE1hdGNoZXNUcmlnZ2VyKHBhdGgsIHRyaWdnZXIpIHsKICAgIGlmICh0cmlnZ2VyKSB7CiAgICAgIGxldCB0cmlnZ2VyUGF0aCA9IHRyaWdnZXIubmFtZTsKICAgICAgcmV0dXJuICh0cmlnZ2VyUGF0aCA9PSBwYXRoKSB8fAogICAgICAgICh0cmlnZ2VyLnN0cnVjdHVyZWQgJiYgUG9seW1lci5QYXRoLmlzQW5jZXN0b3IodHJpZ2dlclBhdGgsIHBhdGgpKSB8fAogICAgICAgICh0cmlnZ2VyLndpbGRjYXJkICYmIFBvbHltZXIuUGF0aC5pc0Rlc2NlbmRhbnQodHJpZ2dlclBhdGgsIHBhdGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgIm9ic2VydmVyIiBlZmZlY3QuCiAgICoKICAgKiBDYWxscyB0aGUgbWV0aG9kIHdpdGggYGluZm8ubWV0aG9kTmFtZWAgb24gdGhlIGluc3RhbmNlLCBwYXNzaW5nIHRoZQogICAqIG5ldyBhbmQgb2xkIHZhbHVlcy4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuT2JzZXJ2ZXJFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgbGV0IGZuID0gdHlwZW9mIGluZm8ubWV0aG9kID09PSAic3RyaW5nIiA/IGluc3RbaW5mby5tZXRob2RdIDogaW5mby5tZXRob2Q7CiAgICBsZXQgY2hhbmdlZFByb3AgPSBpbmZvLnByb3BlcnR5OwogICAgaWYgKGZuKSB7CiAgICAgIGZuLmNhbGwoaW5zdCwgaW5zdC5fX2RhdGFbY2hhbmdlZFByb3BdLCBvbGRQcm9wc1tjaGFuZ2VkUHJvcF0pOwogICAgfSBlbHNlIGlmICghaW5mby5keW5hbWljRm4pIHsKICAgICAgY29uc29sZS53YXJuKCdvYnNlcnZlciBtZXRob2QgYCcgKyBpbmZvLm1ldGhvZCArICdgIG5vdCBkZWZpbmVkJyk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSdW5zICJub3RpZnkiIGVmZmVjdHMgZm9yIGEgc2V0IG9mIGNoYW5nZWQgcHJvcGVydGllcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSB0aGUgZ2VuZXJpYyBgcnVuRWZmZWN0c2AgbWV0aG9kIGluIHRoYXQgaXQKICAgKiB3aWxsIGRpc3BhdGNoIHBhdGggbm90aWZpY2F0aW9uIGV2ZW50cyBpbiB0aGUgY2FzZSB0aGF0IHRoZSBwcm9wZXJ0eQogICAqIGNoYW5nZWQgd2FzIGEgcGF0aCBhbmQgdGhlIHJvb3QgcHJvcGVydHkgZm9yIHRoYXQgcGF0aCBkaWRuJ3QgaGF2ZSBhCiAgICogIm5vdGlmeSIgZWZmZWN0LiAgVGhpcyBpcyB0byBtYWludGFpbiAxLjAgYmVoYXZpb3IgdGhhdCBkaWQgbm90IHJlcXVpcmUKICAgKiBgbm90aWZ5OiB0cnVlYCB0byBlbnN1cmUgb2JqZWN0IHN1Yi1wcm9wZXJ0eSBub3RpZmljYXRpb25zIHdlcmUKICAgKiBzZW50LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2l0aCBlZmZlY3RzIHRvIHJ1bgogICAqIEBwYXJhbSB7T2JqZWN0fSBub3RpZnlQcm9wcyBCYWcgb2YgcHJvcGVydGllcyB0byBub3RpZnkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bk5vdGlmeUVmZmVjdHMoaW5zdCwgbm90aWZ5UHJvcHMsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgIC8vIE5vdGlmeQogICAgbGV0IGZ4cyA9IGluc3RbVFlQRVMuTk9USUZZXTsKICAgIGxldCBub3RpZmllZDsKICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAvLyBUcnkgbm9ybWFsIG5vdGlmeSBlZmZlY3RzOyBpZiBub25lLCBmYWxsIGJhY2sgdG8gdHJ5IHBhdGggbm90aWZpY2F0aW9uCiAgICBmb3IgKGxldCBwcm9wIGluIG5vdGlmeVByb3BzKSB7CiAgICAgIGlmIChub3RpZnlQcm9wc1twcm9wXSkgewogICAgICAgIGlmIChmeHMgJiYgcnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGZ4cywgaWQsIHByb3AsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpKSB7CiAgICAgICAgICBub3RpZmllZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChoYXNQYXRocyAmJiBub3RpZnlQYXRoKGluc3QsIHByb3AsIHByb3BzKSkgewogICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gRmx1c2ggaG9zdCBpZiB3ZSBhY3R1YWxseSBub3RpZmllZCBhbmQgaG9zdCB3YXMgYmF0Y2hpbmcKICAgIC8vIEFuZCB0aGUgaG9zdCBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBjbGllbnRzOyB0aGlzIHByZXZlbnRzCiAgICAvLyBhbiBpc3N1ZSB3aXRoIGEgaG9zdCBvYnNlcnZpbmcgZGF0YSBjaGFuZ2VzIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgIGxldCBob3N0OwogICAgaWYgKG5vdGlmaWVkICYmIChob3N0ID0gaW5zdC5fX2RhdGFIb3N0KSAmJiBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcykgewogICAgICBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgfQogIH0KCiAgLyoqCiAgICogRGlzcGF0Y2hlcyB7cHJvcGVydHl9LWNoYW5nZWQgZXZlbnRzIHdpdGggcGF0aCBpbmZvcm1hdGlvbiBpbiB0aGUgZGV0YWlsCiAgICogb2JqZWN0IHRvIGluZGljYXRlIGEgc3ViLXBhdGggb2YgdGhlIHByb3BlcnR5IHdhcyBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdGhhdCB3YXMgY2hhbmdlZAogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIHdhcyBub3RpZmllZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5UGF0aChpbnN0LCBwYXRoLCBwcm9wcykgewogICAgbGV0IHJvb3RQcm9wZXJ0eSA9IFBvbHltZXIuUGF0aC5yb290KHBhdGgpOwogICAgaWYgKHJvb3RQcm9wZXJ0eSAhPT0gcGF0aCkgewogICAgICBsZXQgZXZlbnROYW1lID0gUG9seW1lci5DYXNlTWFwLmNhbWVsVG9EYXNoQ2FzZShyb290UHJvcGVydHkpICsgJy1jaGFuZ2VkJzsKICAgICAgZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHByb3BzW3BhdGhdLCBwYXRoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKioKICAgKiBEaXNwYXRjaGVzIHtwcm9wZXJ0eX0tY2hhbmdlZCBldmVudHMgdG8gaW5kaWNhdGUgYSBwcm9wZXJ0eSAob3IgcGF0aCkKICAgKiBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZCAoJ3twcm9wZXJ0eX0tY2hhbmdlZCcpCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGNoYW5nZWQgcHJvcGVydHkKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHBhdGggSWYgYSBzdWItcGF0aCBvZiB0aGlzIHByb3BlcnR5IGNoYW5nZWQsIHRoZSBwYXRoCiAgICogICB0aGF0IGNoYW5nZWQgKG9wdGlvbmFsKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgZnVuY3Rpb24gZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHZhbHVlLCBwYXRoKSB7CiAgICBsZXQgZGV0YWlsID0gewogICAgICB2YWx1ZTogdmFsdWUsCiAgICAgIHF1ZXVlUHJvcGVydHk6IHRydWUKICAgIH07CiAgICBpZiAocGF0aCkgewogICAgICBkZXRhaWwucGF0aCA9IHBhdGg7CiAgICB9CiAgICAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdCkuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGRldGFpbCB9KSk7CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAibm90aWZ5IiBlZmZlY3QuCiAgICoKICAgKiBEaXNwYXRjaGVzIGEgbm9uLWJ1YmJsaW5nIGV2ZW50IG5hbWVkIGBpbmZvLmV2ZW50TmFtZWAgb24gdGhlIGluc3RhbmNlCiAgICogd2l0aCBhIGRldGFpbCBvYmplY3QgY29udGFpbmluZyB0aGUgbmV3IGB2YWx1ZWAuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Ob3RpZnlFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMpIHsKICAgIGxldCByb290UHJvcGVydHkgPSBoYXNQYXRocyA/IFBvbHltZXIuUGF0aC5yb290KHByb3BlcnR5KSA6IHByb3BlcnR5OwogICAgbGV0IHBhdGggPSByb290UHJvcGVydHkgIT0gcHJvcGVydHkgPyBwcm9wZXJ0eSA6IG51bGw7CiAgICBsZXQgdmFsdWUgPSBwYXRoID8gUG9seW1lci5QYXRoLmdldChpbnN0LCBwYXRoKSA6IGluc3QuX19kYXRhW3Byb3BlcnR5XTsKICAgIGlmIChwYXRoICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFsdWUgPSBwcm9wc1twcm9wZXJ0eV07ICAvLyBzcGVjaWZpY2FsbHkgZm9yIC5zcGxpY2VzCiAgICB9CiAgICBkaXNwYXRjaE5vdGlmeUV2ZW50KGluc3QsIGluZm8uZXZlbnROYW1lLCB2YWx1ZSwgcGF0aCk7CiAgfQoKICAvKioKICAgKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciAyLXdheSBub3RpZmljYXRpb24gZXZlbnRzLiBSZWNlaXZlcyBjb250ZXh0CiAgICogaW5mb3JtYXRpb24gY2FwdHVyZWQgaW4gdGhlIGBhZGROb3RpZnlMaXN0ZW5lcmAgY2xvc3VyZSBmcm9tIHRoZQogICAqIGBfX25vdGlmeUxpc3RlbmVyc2AgbWV0YWRhdGEuCiAgICoKICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbm90aWZpZWQgcHJvcGVydHkgdG8gdGhlIGhvc3QgcHJvcGVydHkgb3IgcGF0aC4gIElmCiAgICogdGhlIGV2ZW50IGNvbnRhaW5lZCBwYXRoIGluZm9ybWF0aW9uLCB0cmFuc2xhdGUgdGhhdCBwYXRoIHRvIHRoZSBob3N0CiAgICogc2NvcGUncyBuYW1lIGZvciB0aGF0IHBhdGggZmlyc3QuCiAgICoKICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBOb3RpZmljYXRpb24gZXZlbnQgKGUuZy4gJzxwcm9wZXJ0eT4tY2hhbmdlZCcpCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBIb3N0IGVsZW1lbnQgaW5zdGFuY2UgaGFuZGxpbmcgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tUHJvcCBDaGlsZCBlbGVtZW50IHByb3BlcnR5IHRoYXQgd2FzIGJvdW5kCiAgICogQHBhcmFtIHtzdHJpbmd9IHRvUGF0aCBIb3N0IHByb3BlcnR5L3BhdGggdGhhdCB3YXMgYm91bmQKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZ2F0ZSBXaGV0aGVyIHRoZSBiaW5kaW5nIHdhcyBuZWdhdGVkCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGhhbmRsZU5vdGlmaWNhdGlvbihldmVudCwgaW5zdCwgZnJvbVByb3AsIHRvUGF0aCwgbmVnYXRlKSB7CiAgICBsZXQgdmFsdWU7CiAgICBsZXQgZGV0YWlsID0gLyoqIEB0eXBlIHtPYmplY3R9ICovKGV2ZW50LmRldGFpbCk7CiAgICBsZXQgZnJvbVBhdGggPSBkZXRhaWwgJiYgZGV0YWlsLnBhdGg7CiAgICBpZiAoZnJvbVBhdGgpIHsKICAgICAgdG9QYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShmcm9tUHJvcCwgdG9QYXRoLCBmcm9tUGF0aCk7CiAgICAgIHZhbHVlID0gZGV0YWlsICYmIGRldGFpbC52YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlID0gZXZlbnQuY3VycmVudFRhcmdldFtmcm9tUHJvcF07CiAgICB9CiAgICB2YWx1ZSA9IG5lZ2F0ZSA/ICF2YWx1ZSA6IHZhbHVlOwogICAgaWYgKCFpbnN0W1RZUEVTLlJFQURfT05MWV0gfHwgIWluc3RbVFlQRVMuUkVBRF9PTkxZXVt0b1BhdGhdKSB7CiAgICAgIGlmIChpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodG9QYXRoLCB2YWx1ZSwgdHJ1ZSwgQm9vbGVhbihmcm9tUGF0aCkpCiAgICAgICAgJiYgKCFkZXRhaWwgfHwgIWRldGFpbC5xdWV1ZVByb3BlcnR5KSkgewogICAgICAgIGluc3QuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIEltcGxlbWVudHMgdGhlICJyZWZsZWN0IiBlZmZlY3QuCiAgICoKICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYGluZm8uYXR0ck5hbWVgIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuUmVmbGVjdEVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvKSB7CiAgICBsZXQgdmFsdWUgPSBpbnN0Ll9fZGF0YVtwcm9wZXJ0eV07CiAgICBpZiAoUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKSB7CiAgICAgIHZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKHZhbHVlLCBpbmZvLmF0dHJOYW1lLCAnYXR0cmlidXRlJywgLyoqIEB0eXBlIHtOb2RlfSAqLyhpbnN0KSk7CiAgICB9CiAgICBpbnN0Ll9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBpbmZvLmF0dHJOYW1lLCB2YWx1ZSk7CiAgfQoKICAvKioKICAgKiBSdW5zICJjb21wdXRlZCIgZWZmZWN0cyBmb3IgYSBzZXQgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzLgogICAqCiAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIHRoZSBnZW5lcmljIGBydW5FZmZlY3RzYCBtZXRob2QgaW4gdGhhdCBpdAogICAqIGNvbnRpbnVlcyB0byBydW4gY29tcHV0ZWQgZWZmZWN0cyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIGVhY2ggcGFzcyB1bnRpbAogICAqIHRoZXJlIGFyZSBubyBtb3JlIG5ld2x5IGNvbXB1dGVkIHByb3BlcnRpZXMuICBUaGlzIGVuc3VyZXMgdGhhdCBhbGwKICAgKiBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSBjb21wdXRlZCBieSB0aGUgaW5pdGlhbCBzZXQgb2YgY2hhbmdlcyBhcmUKICAgKiBjb21wdXRlZCBiZWZvcmUgb3RoZXIgZWZmZWN0cyAoYmluZGluZyBwcm9wYWdhdGlvbiwgb2JzZXJ2ZXJzLCBhbmQgbm90aWZ5KQogICAqIHJ1bi4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0cyhpbnN0LCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykgewogICAgbGV0IGNvbXB1dGVFZmZlY3RzID0gaW5zdFtUWVBFUy5DT01QVVRFXTsKICAgIGlmIChjb21wdXRlRWZmZWN0cykgewogICAgICBsZXQgaW5wdXRQcm9wcyA9IGNoYW5nZWRQcm9wczsKICAgICAgd2hpbGUgKHJ1bkVmZmVjdHMoaW5zdCwgY29tcHV0ZUVmZmVjdHMsIGlucHV0UHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykpIHsKICAgICAgICBPYmplY3QuYXNzaWduKG9sZFByb3BzLCBpbnN0Ll9fZGF0YU9sZCk7CiAgICAgICAgT2JqZWN0LmFzc2lnbihjaGFuZ2VkUHJvcHMsIGluc3QuX19kYXRhUGVuZGluZyk7CiAgICAgICAgaW5wdXRQcm9wcyA9IGluc3QuX19kYXRhUGVuZGluZzsKICAgICAgICBpbnN0Ll9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiY29tcHV0ZWQgcHJvcGVydHkiIGVmZmVjdCBieSBydW5uaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUKICAgKiB2YWx1ZXMgb2YgdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gdGhlIGBpbmZvYCBvYmplY3QgYW5kIHNldHRpbmcgdGhlCiAgICogcmV0dXJuIHZhbHVlIHRvIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBzcGVjaWZpZWQuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgIGxldCByZXN1bHQgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbyk7CiAgICBsZXQgY29tcHV0ZWRQcm9wID0gaW5mby5tZXRob2RJbmZvOwogICAgaWYgKGluc3QuX19kYXRhSGFzQWNjZXNzb3IgJiYgaW5zdC5fX2RhdGFIYXNBY2Nlc3Nvcltjb21wdXRlZFByb3BdKSB7CiAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eShjb21wdXRlZFByb3AsIHJlc3VsdCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpbnN0W2NvbXB1dGVkUHJvcF0gPSByZXN1bHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBDb21wdXRlcyBwYXRoIGNoYW5nZXMgYmFzZWQgb24gcGF0aCBsaW5rcyBzZXQgdXAgdXNpbmcgdGhlIGBsaW5rUGF0aHNgCiAgICogQVBJLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2hvc2UgcHJvcHMgYXJlIGNoYW5naW5nCiAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8KHN0cmluZ3xudW1iZXIpPn0gcGF0aCBQYXRoIHRoYXQgaGFzIGNoYW5nZWQKICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIGNoYW5nZWQgcGF0aAogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBjb21wdXRlTGlua2VkUGF0aHMoaW5zdCwgcGF0aCwgdmFsdWUpIHsKICAgIGxldCBsaW5rcyA9IGluc3QuX19kYXRhTGlua2VkUGF0aHM7CiAgICBpZiAobGlua3MpIHsKICAgICAgbGV0IGxpbms7CiAgICAgIGZvciAobGV0IGEgaW4gbGlua3MpIHsKICAgICAgICBsZXQgYiA9IGxpbmtzW2FdOwogICAgICAgIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGEsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShhLCBiLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGIsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShiLCBhLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLSBiaW5kaW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICAqIEFkZHMgYmluZGluZyBtZXRhZGF0YSB0byB0aGUgY3VycmVudCBgbm9kZUluZm9gLCBhbmQgYmluZGluZyBlZmZlY3RzCiAgICogZm9yIGFsbCBwYXJ0IGRlcGVuZGVuY2llcyB0byBgdGVtcGxhdGVJbmZvYC4KICAgKgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIENsYXNzIHRoYXQgYF9wYXJzZVRlbXBsYXRlYCBpcyBjdXJyZW50bHkKICAgKiAgIHJ1bm5pbmcgb24KICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICogQHBhcmFtIHtzdHJpbmd9IGtpbmQgQmluZGluZyBraW5kLCBlaXRoZXIgJ3Byb3BlcnR5JywgJ2F0dHJpYnV0ZScsIG9yICd0ZXh0JwogICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgVGFyZ2V0IHByb3BlcnR5IG5hbWUKICAgKiBAcGFyYW0geyFBcnJheTwhQmluZGluZ1BhcnQ+fSBwYXJ0cyBBcnJheSBvZiBiaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge3N0cmluZz19IGxpdGVyYWwgTGl0ZXJhbCB0ZXh0IHN1cnJvdW5kaW5nIGJpbmRpbmcgcGFydHMgKHNwZWNpZmllZAogICAqICAgb25seSBmb3IgJ3Byb3BlcnR5JyBiaW5kaW5ncywgc2luY2UgdGhlc2UgbXVzdCBiZSBpbml0aWFsaXplZCBhcyBwYXJ0CiAgICogICBvZiBib290LXVwKQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGRCaW5kaW5nKGNvbnN0cnVjdG9yLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBraW5kLCB0YXJnZXQsIHBhcnRzLCBsaXRlcmFsKSB7CiAgICAvLyBDcmVhdGUgYmluZGluZyBtZXRhZGF0YSBhbmQgYWRkIHRvIG5vZGVJbmZvCiAgICBub2RlSW5mby5iaW5kaW5ncyA9IG5vZGVJbmZvLmJpbmRpbmdzIHx8IFtdOwogICAgbGV0IC8qKiBCaW5kaW5nICovIGJpbmRpbmcgPSB7IGtpbmQsIHRhcmdldCwgcGFydHMsIGxpdGVyYWwsIGlzQ29tcG91bmQ6IChwYXJ0cy5sZW5ndGggIT09IDEpIH07CiAgICBub2RlSW5mby5iaW5kaW5ncy5wdXNoKGJpbmRpbmcpOwogICAgLy8gQWRkIGxpc3RlbmVyIGluZm8gdG8gYmluZGluZyBtZXRhZGF0YQogICAgaWYgKHNob3VsZEFkZExpc3RlbmVyKGJpbmRpbmcpKSB7CiAgICAgIGxldCB7ZXZlbnQsIG5lZ2F0ZX0gPSBiaW5kaW5nLnBhcnRzWzBdOwogICAgICBiaW5kaW5nLmxpc3RlbmVyRXZlbnQgPSBldmVudCB8fCAoQ2FzZU1hcC5jYW1lbFRvRGFzaENhc2UodGFyZ2V0KSArICctY2hhbmdlZCcpOwogICAgICBiaW5kaW5nLmxpc3RlbmVyTmVnYXRlID0gbmVnYXRlOwogICAgfQogICAgLy8gQWRkICJwcm9wYWdhdGUiIHByb3BlcnR5IGVmZmVjdHMgdG8gdGVtcGxhdGVJbmZvCiAgICBsZXQgaW5kZXggPSB0ZW1wbGF0ZUluZm8ubm9kZUluZm9MaXN0Lmxlbmd0aDsKICAgIGZvciAobGV0IGk9MDsgaTxiaW5kaW5nLnBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1tpXTsKICAgICAgcGFydC5jb21wb3VuZEluZGV4ID0gaTsKICAgICAgYWRkRWZmZWN0Rm9yQmluZGluZ1BhcnQoY29uc3RydWN0b3IsIHRlbXBsYXRlSW5mbywgYmluZGluZywgcGFydCwgaW5kZXgpOwogICAgfQogIH0KCiAgLyoqCiAgICogQWRkcyBwcm9wZXJ0eSBlZmZlY3RzIHRvIHRoZSBnaXZlbiBgdGVtcGxhdGVJbmZvYCBmb3IgdGhlIGdpdmVuIGJpbmRpbmcKICAgKiBwYXJ0LgogICAqCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQ2xhc3MgdGhhdCBgX3BhcnNlVGVtcGxhdGVgIGlzIGN1cnJlbnRseQogICAqICAgcnVubmluZyBvbgogICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggaW50byBgbm9kZUluZm9MaXN0YCBmb3IgdGhpcyBub2RlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBmdW5jdGlvbiBhZGRFZmZlY3RGb3JCaW5kaW5nUGFydChjb25zdHJ1Y3RvciwgdGVtcGxhdGVJbmZvLCBiaW5kaW5nLCBwYXJ0LCBpbmRleCkgewogICAgaWYgKCFwYXJ0LmxpdGVyYWwpIHsKICAgICAgaWYgKGJpbmRpbmcua2luZCA9PT0gJ2F0dHJpYnV0ZScgJiYgYmluZGluZy50YXJnZXRbMF0gPT09ICctJykgewogICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNldCBhdHRyaWJ1dGUgJyArIGJpbmRpbmcudGFyZ2V0ICsKICAgICAgICAgICcgYmVjYXVzZSAiLSIgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlIHN0YXJ0aW5nIGNoYXJhY3RlcicpOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBkZXBlbmRlbmNpZXMgPSBwYXJ0LmRlcGVuZGVuY2llczsKICAgICAgICBsZXQgaW5mbyA9IHsgaW5kZXgsIGJpbmRpbmcsIHBhcnQsIGV2YWx1YXRvcjogY29uc3RydWN0b3IgfTsKICAgICAgICBmb3IgKGxldCBqPTA7IGo8ZGVwZW5kZW5jaWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBsZXQgdHJpZ2dlciA9IGRlcGVuZGVuY2llc1tqXTsKICAgICAgICAgIGlmICh0eXBlb2YgdHJpZ2dlciA9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0cmlnZ2VyID0gcGFyc2VBcmcodHJpZ2dlcik7CiAgICAgICAgICAgIHRyaWdnZXIud2lsZGNhcmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3RydWN0b3IuX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCB0cmlnZ2VyLnJvb3RQcm9wZXJ0eSwgewogICAgICAgICAgICBmbjogcnVuQmluZGluZ0VmZmVjdCwKICAgICAgICAgICAgaW5mbywgdHJpZ2dlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiYmluZGluZyIgKHByb3BlcnR5L3BhdGggYmluZGluZykgZWZmZWN0LgogICAqCiAgICogTm90ZSB0aGF0IGJpbmRpbmcgc3ludGF4IGlzIG92ZXJyaWRhYmxlIHZpYSBgX3BhcnNlQmluZGluZ3NgIGFuZAogICAqIGBfZXZhbHVhdGVCaW5kaW5nYC4gIFRoaXMgbWV0aG9kIHdpbGwgY2FsbCBgX2V2YWx1YXRlQmluZGluZ2AgZm9yIGFueQogICAqIG5vbi1saXRlcmFsIHBhcnRzIHJldHVybmVkIGZyb20gYF9wYXJzZUJpbmRpbmdzYC4gIEhvd2V2ZXIsCiAgICogdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgX3BhdGhfIGJpbmRpbmdzIHZpYSBjdXN0b20gYmluZGluZyBwYXJ0cywKICAgKiBhcyB0aGlzIGlzIHNwZWNpZmljIHRvIFBvbHltZXIncyBwYXRoIGJpbmRpbmcgc3ludGF4LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEBwYXJhbSB7QXJyYXl9IG5vZGVMaXN0IExpc3Qgb2Ygbm9kZXMgYXNzb2NpYXRlZCB3aXRoIGBub2RlSW5mb0xpc3RgIHRlbXBsYXRlCiAgICogICBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5CaW5kaW5nRWZmZWN0KGluc3QsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMsIG5vZGVMaXN0KSB7CiAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2luZm8uaW5kZXhdOwogICAgbGV0IGJpbmRpbmcgPSBpbmZvLmJpbmRpbmc7CiAgICBsZXQgcGFydCA9IGluZm8ucGFydDsKICAgIC8vIFN1YnBhdGggbm90aWZpY2F0aW9uOiB0cmFuc2Zvcm0gcGF0aCBhbmQgc2V0IHRvIGNsaWVudAogICAgLy8gZS5nLjogZm9vPSJ7e29iai5zdWJ9fSIsIHBhdGg6ICdvYmouc3ViLnByb3AnLCBzZXQgJ2Zvby5wcm9wJz1vYmouc3ViLnByb3AKICAgIGlmIChoYXNQYXRocyAmJiBwYXJ0LnNvdXJjZSAmJiAocGF0aC5sZW5ndGggPiBwYXJ0LnNvdXJjZS5sZW5ndGgpICYmCiAgICAgICAgKGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSAmJiAhYmluZGluZy5pc0NvbXBvdW5kICYmCiAgICAgICAgbm9kZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ICYmCiAgICAgICAgbm9kZS5fX2RhdGFIYXNBY2Nlc3NvciAmJiBub2RlLl9fZGF0YUhhc0FjY2Vzc29yW2JpbmRpbmcudGFyZ2V0XSkgewogICAgICBsZXQgdmFsdWUgPSBwcm9wc1twYXRoXTsKICAgICAgcGF0aCA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUocGFydC5zb3VyY2UsIGJpbmRpbmcudGFyZ2V0LCBwYXRoKTsKICAgICAgaWYgKG5vZGUuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCB2YWx1ZSwgZmFsc2UsIHRydWUpKSB7CiAgICAgICAgaW5zdC5fZW5xdWV1ZUNsaWVudChub2RlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGV0IHZhbHVlID0gaW5mby5ldmFsdWF0b3IuX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgLy8gUHJvcGFnYXRlIHZhbHVlIHRvIGNoaWxkCiAgICAgIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKTsKICAgIH0KICB9CgogIC8qKgogICAqIFNldHMgdGhlIHZhbHVlIGZvciBhbiAiYmluZGluZyIgKGJpbmRpbmcpIGVmZmVjdCB0byBhIG5vZGUsCiAgICogZWl0aGVyIGFzIGEgcHJvcGVydHkgb3IgYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugb3duaW5nIHRoZSBiaW5kaW5nIGVmZmVjdAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUYXJnZXQgbm9kZSBmb3IgYmluZGluZwogICAqIEBwYXJhbSB7IUJpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEBwYXJhbSB7IUJpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKSB7CiAgICB2YWx1ZSA9IGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpOwogICAgaWYgKFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSkgewogICAgICB2YWx1ZSA9IFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSh2YWx1ZSwgYmluZGluZy50YXJnZXQsIGJpbmRpbmcua2luZCwgbm9kZSk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kID09ICdhdHRyaWJ1dGUnKSB7CiAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5nCiAgICAgIGluc3QuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSksIHZhbHVlLCBiaW5kaW5nLnRhcmdldCk7CiAgICB9IGVsc2UgewogICAgICAvLyBQcm9wZXJ0eSBiaW5kaW5nCiAgICAgIGxldCBwcm9wID0gYmluZGluZy50YXJnZXQ7CiAgICAgIGlmIChub2RlLl9faXNQcm9wZXJ0eUVmZmVjdHNDbGllbnQgJiYKICAgICAgICAgIG5vZGUuX19kYXRhSGFzQWNjZXNzb3IgJiYgbm9kZS5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wXSkgewogICAgICAgIGlmICghbm9kZVtUWVBFUy5SRUFEX09OTFldIHx8ICFub2RlW1RZUEVTLlJFQURfT05MWV1bcHJvcF0pIHsKICAgICAgICAgIGlmIChub2RlLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcCwgdmFsdWUpKSB7CiAgICAgICAgICAgIGluc3QuX2VucXVldWVDbGllbnQobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgIHsKICAgICAgICBpbnN0Ll9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIFRyYW5zZm9ybXMgYW4gImJpbmRpbmciIGVmZmVjdCB2YWx1ZSBiYXNlZCBvbiBjb21wb3VuZCAmIG5lZ2F0aW9uCiAgICogZWZmZWN0IG1ldGFkYXRhLCBhcyB3ZWxsIGFzIGhhbmRsaW5nIGZvciBzcGVjaWFsLWNhc2UgcHJvcGVydGllcwogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHsqfSBUcmFuc2Zvcm1lZCB2YWx1ZSB0byBzZXQKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgbGV0IHN0b3JhZ2UgPSBub2RlLl9fZGF0YUNvbXBvdW5kU3RvcmFnZVtiaW5kaW5nLnRhcmdldF07CiAgICAgIHN0b3JhZ2VbcGFydC5jb21wb3VuZEluZGV4XSA9IHZhbHVlOwogICAgICB2YWx1ZSA9IHN0b3JhZ2Uuam9pbignJyk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kICE9PSAnYXR0cmlidXRlJykgewogICAgICAvLyBTb21lIGJyb3dzZXJzIHNlcmlhbGl6ZSBgdW5kZWZpbmVkYCB0byBgInVuZGVmaW5lZCJgCiAgICAgIGlmIChiaW5kaW5nLnRhcmdldCA9PT0gJ3RleHRDb250ZW50JyB8fAogICAgICAgICAgKGJpbmRpbmcudGFyZ2V0ID09PSAndmFsdWUnICYmCiAgICAgICAgICAgIChub2RlLmxvY2FsTmFtZSA9PT0gJ2lucHV0JyB8fCBub2RlLmxvY2FsTmFtZSA9PT0gJ3RleHRhcmVhJykpKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PSB1bmRlZmluZWQgPyAnJyA6IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgYSBiaW5kaW5nJ3MgbWV0YWRhdGEgbWVldHMgYWxsIHRoZSByZXF1aXJlbWVudHMgdG8gYWxsb3cKICAgKiAyLXdheSBiaW5kaW5nLCBhbmQgdGhlcmVmb3JlIGEgYDxwcm9wZXJ0eT4tY2hhbmdlZGAgZXZlbnQgbGlzdGVuZXIgc2hvdWxkIGJlCiAgICogYWRkZWQ6CiAgICogLSB1c2VkIGN1cmx5IGJyYWNlcwogICAqIC0gaXMgYSBwcm9wZXJ0eSAobm90IGF0dHJpYnV0ZSkgYmluZGluZwogICAqIC0gaXMgbm90IGEgdGV4dENvbnRlbnQgYmluZGluZwogICAqIC0gaXMgbm90IGNvbXBvdW5kCiAgICoKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIDItd2F5IGxpc3RlbmVyIHNob3VsZCBiZSBhZGRlZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gc2hvdWxkQWRkTGlzdGVuZXIoYmluZGluZykgewogICAgcmV0dXJuIEJvb2xlYW4oYmluZGluZy50YXJnZXQpICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICdhdHRyaWJ1dGUnICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICd0ZXh0JyAmJgogICAgICAgICAgICFiaW5kaW5nLmlzQ29tcG91bmQgJiYKICAgICAgICAgICBiaW5kaW5nLnBhcnRzWzBdLm1vZGUgPT09ICd7JzsKICB9CgogIC8qKgogICAqIFNldHVwIGNvbXBvdW5kIGJpbmRpbmcgc3RvcmFnZSBzdHJ1Y3R1cmVzLCBub3RpZnkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QKICAgKiByZWZlcmVuY2VzIG9udG8gdGhlIGJvdW5kIG5vZGVMaXN0LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBJbnN0YW5jZSB0aGF0IGJhcyBiZWVuIHByZXZpb3VzbHkgYm91bmQKICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQmluZGluZ3MoaW5zdCwgdGVtcGxhdGVJbmZvKSB7CiAgICAvLyBTZXR1cCBjb21wb3VuZCBzdG9yYWdlLCBkYXRhSG9zdCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnMKICAgIGxldCB7bm9kZUxpc3QsIG5vZGVJbmZvTGlzdH0gPSB0ZW1wbGF0ZUluZm87CiAgICBpZiAobm9kZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICBmb3IgKGxldCBpPTA7IGkgPCBub2RlSW5mb0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgaW5mbyA9IG5vZGVJbmZvTGlzdFtpXTsKICAgICAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2ldOwogICAgICAgIGxldCBiaW5kaW5ncyA9IGluZm8uYmluZGluZ3M7CiAgICAgICAgaWYgKGJpbmRpbmdzKSB7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8YmluZGluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGJpbmRpbmcgPSBiaW5kaW5nc1tpXTsKICAgICAgICAgICAgc2V0dXBDb21wb3VuZFN0b3JhZ2Uobm9kZSwgYmluZGluZyk7CiAgICAgICAgICAgIGFkZE5vdGlmeUxpc3RlbmVyKG5vZGUsIGluc3QsIGJpbmRpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub2RlLl9fZGF0YUhvc3QgPSBpbnN0OwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbml0aWFsaXplcyBgX19kYXRhQ29tcG91bmRTdG9yYWdlYCBsb2NhbCBzdG9yYWdlIG9uIGEgYm91bmQgbm9kZSB3aXRoCiAgICogaW5pdGlhbCBsaXRlcmFsIGRhdGEgZm9yIGNvbXBvdW5kIGJpbmRpbmdzLCBhbmQgc2V0cyB0aGUgam9pbmVkCiAgICogbGl0ZXJhbCBwYXJ0cyB0byB0aGUgYm91bmQgcHJvcGVydHkuCiAgICoKICAgKiBXaGVuIGNoYW5nZXMgdG8gY29tcG91bmQgcGFydHMgb2NjdXIsIHRoZXkgYXJlIGZpcnN0IHNldCBpbnRvIHRoZSBjb21wb3VuZAogICAqIHN0b3JhZ2UgYXJyYXkgZm9yIHRoYXQgcHJvcGVydHksIGFuZCB0aGVuIHRoZSBhcnJheSBpcyBqb2luZWQgdG8gcmVzdWx0IGluCiAgICogdGhlIGZpbmFsIHZhbHVlIHNldCB0byB0aGUgcHJvcGVydHkvYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIEJvdW5kIG5vZGUgdG8gaW5pdGlhbGl6ZQogICAqIEBwYXJhbSB7QmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQ29tcG91bmRTdG9yYWdlKG5vZGUsIGJpbmRpbmcpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgLy8gQ3JlYXRlIGNvbXBvdW5kIHN0b3JhZ2UgbWFwCiAgICAgIGxldCBzdG9yYWdlID0gbm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgfHwKICAgICAgICAobm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB7fSk7CiAgICAgIGxldCBwYXJ0cyA9IGJpbmRpbmcucGFydHM7CiAgICAgIC8vIENvcHkgbGl0ZXJhbHMgZnJvbSBwYXJ0cyBpbnRvIHN0b3JhZ2UgZm9yIHRoaXMgYmluZGluZwogICAgICBsZXQgbGl0ZXJhbHMgPSBuZXcgQXJyYXkocGFydHMubGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaj0wOyBqPHBhcnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgbGl0ZXJhbHNbal0gPSBwYXJ0c1tqXS5saXRlcmFsOwogICAgICB9CiAgICAgIGxldCB0YXJnZXQgPSBiaW5kaW5nLnRhcmdldDsKICAgICAgc3RvcmFnZVt0YXJnZXRdID0gbGl0ZXJhbHM7CiAgICAgIC8vIENvbmZpZ3VyZSBwcm9wZXJ0aWVzIHdpdGggdGhlaXIgbGl0ZXJhbCBwYXJ0cwogICAgICBpZiAoYmluZGluZy5saXRlcmFsICYmIGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSB7CiAgICAgICAgbm9kZVt0YXJnZXRdID0gYmluZGluZy5saXRlcmFsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBBZGRzIGEgMi13YXkgYmluZGluZyBub3RpZmljYXRpb24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgc3BlY2lmaWVkCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gbm9kZSBDaGlsZCBlbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0bwogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSG9zdCBlbGVtZW50IGluc3RhbmNlIHRvIGhhbmRsZSBub3RpZmljYXRpb24gZXZlbnQKICAgKiBAcGFyYW0ge0JpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGROb3RpZnlMaXN0ZW5lcihub2RlLCBpbnN0LCBiaW5kaW5nKSB7CiAgICBpZiAoYmluZGluZy5saXN0ZW5lckV2ZW50KSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1swXTsKICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGJpbmRpbmcubGlzdGVuZXJFdmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihlLCBpbnN0LCBiaW5kaW5nLnRhcmdldCwgcGFydC5zb3VyY2UsIHBhcnQubmVnYXRlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICAvLyAtLSBmb3IgbWV0aG9kLWJhc2VkIGVmZmVjdHMgKGNvbXBsZXhPYnNlcnZlciAmIGNvbXB1dGVkKSAtLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBBZGRzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGVhY2ggYXJndW1lbnQgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUgKGFuZAogICAqIG9wdGlvbmFsbHksIGZvciB0aGUgbWV0aG9kIG5hbWUgaWYgYGR5bmFtaWNgIGlzIHRydWUpIHRoYXQgY2FsbHMgdGhlCiAgICogcHJvdmlkZWQgZWZmZWN0IGZ1bmN0aW9uLgogICAqCiAgICogQHBhcmFtIHtFbGVtZW50IHwgT2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0geyFNZXRob2RTaWduYXR1cmV9IHNpZyBNZXRob2Qgc2lnbmF0dXJlIG1ldGFkYXRhCiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVHlwZSBvZiBwcm9wZXJ0eSBlZmZlY3QgdG8gYWRkCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWZmZWN0Rm4gRnVuY3Rpb24gdG8gcnVuIHdoZW4gYXJndW1lbnRzIGNoYW5nZQogICAqIEBwYXJhbSB7Kj19IG1ldGhvZEluZm8gRWZmZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGJlIGluY2x1ZGVkIGluCiAgICogICBtZXRob2QgZWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICogICBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LiBOb3RlLAogICAqICAgZGVmYXVsdHMgdG8gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIGlzIHN0YXRpYyAoc2lnLnN0YXRpYyBpcyB0cnVlKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRWZmZWN0KG1vZGVsLCBzaWcsIHR5cGUsIGVmZmVjdEZuLCBtZXRob2RJbmZvLCBkeW5hbWljRm4pIHsKICAgIGR5bmFtaWNGbiA9IHNpZy5zdGF0aWMgfHwgKGR5bmFtaWNGbiAmJgogICAgICAodHlwZW9mIGR5bmFtaWNGbiAhPT0gJ29iamVjdCcgfHwgZHluYW1pY0ZuW3NpZy5tZXRob2ROYW1lXSkpOwogICAgbGV0IGluZm8gPSB7CiAgICAgIG1ldGhvZE5hbWU6IHNpZy5tZXRob2ROYW1lLAogICAgICBhcmdzOiBzaWcuYXJncywKICAgICAgbWV0aG9kSW5mbywKICAgICAgZHluYW1pY0ZuCiAgICB9OwogICAgZm9yIChsZXQgaT0wLCBhcmc7IChpPHNpZy5hcmdzLmxlbmd0aCkgJiYgKGFyZz1zaWcuYXJnc1tpXSk7IGkrKykgewogICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KGFyZy5yb290UHJvcGVydHksIHR5cGUsIHsKICAgICAgICAgIGZuOiBlZmZlY3RGbiwgaW5mbzogaW5mbywgdHJpZ2dlcjogYXJnCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChkeW5hbWljRm4pIHsKICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KHNpZy5tZXRob2ROYW1lLCB0eXBlLCB7CiAgICAgICAgZm46IGVmZmVjdEZuLCBpbmZvOiBpbmZvCiAgICAgIH0pOwogICAgfQogIH0KCiAgLyoqCiAgICogQ2FsbHMgYSBtZXRob2Qgd2l0aCBhcmd1bWVudHMgbWFyc2hhbGVkIGZyb20gcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UKICAgKiBiYXNlZCBvbiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBjb250YWluZWQgaW4gdGhlIGVmZmVjdCBtZXRhZGF0YS4KICAgKgogICAqIE11bHRpLXByb3BlcnR5IG9ic2VydmVycywgY29tcHV0ZWQgcHJvcGVydGllcywgYW5kIGlubGluZSBjb21wdXRpbmcKICAgKiBmdW5jdGlvbnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGludm9rZSB0aGUgbWV0aG9kLCB0aGVuIHVzZSB0aGUgcmV0dXJuCiAgICogdmFsdWUgYWNjb3JkaW5nbHkuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIG1ldGhvZCBpbnZvY2F0aW9uCiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgLy8gSW5zdGFuY2VzIGNhbiBvcHRpb25hbGx5IGhhdmUgYSBfbWV0aG9kSG9zdCB3aGljaCBhbGxvd3MgcmVkaXJlY3Rpbmcgd2hlcmUKICAgIC8vIHRvIGZpbmQgbWV0aG9kcy4gQ3VycmVudGx5IHVzZWQgYnkgYHRlbXBsYXRpemVgLgogICAgbGV0IGNvbnRleHQgPSBpbnN0Ll9tZXRob2RIb3N0IHx8IGluc3Q7CiAgICBsZXQgZm4gPSBjb250ZXh0W2luZm8ubWV0aG9kTmFtZV07CiAgICBpZiAoZm4pIHsKICAgICAgbGV0IGFyZ3MgPSBpbnN0Ll9tYXJzaGFsQXJncyhpbmZvLmFyZ3MsIHByb3BlcnR5LCBwcm9wcyk7CiAgICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgIH0gZWxzZSBpZiAoIWluZm8uZHluYW1pY0ZuKSB7CiAgICAgIGNvbnNvbGUud2FybignbWV0aG9kIGAnICsgaW5mby5tZXRob2ROYW1lICsgJ2Agbm90IGRlZmluZWQnKTsKICAgIH0KICB9CgogIGNvbnN0IGVtcHR5QXJyYXkgPSBbXTsKCiAgLy8gUmVndWxhciBleHByZXNzaW9ucyB1c2VkIGZvciBiaW5kaW5nCiAgY29uc3QgSURFTlQgID0gJyg/OicgKyAnW2EtekEtWl8kXVtcXHcuOiRcXC0qXSonICsgJyknOwogIGNvbnN0IE5VTUJFUiA9ICcoPzonICsgJ1stK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/JyArICcpJzsKICBjb25zdCBTUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnXCcoPzpbXlwnXFxcXF18XFxcXC4pKlwnJyArICcpJzsKICBjb25zdCBEUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnIig/OlteIlxcXFxdfFxcXFwuKSoiJyArICcpJzsKICBjb25zdCBTVFJJTkcgPSAnKD86JyArIFNRVU9URV9TVFJJTkcgKyAnfCcgKyBEUVVPVEVfU1RSSU5HICsgJyknOwogIGNvbnN0IEFSR1VNRU5UID0gJyg/OignICsgSURFTlQgKyAnfCcgKyBOVU1CRVIgKyAnfCcgKyAgU1RSSU5HICsgJylcXHMqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVFMgPSAnKD86JyArIEFSR1VNRU5UICsgJyg/OixcXHMqJyArIEFSR1VNRU5UICsgJykqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVF9MSVNUID0gJyg/OicgKyAnXFwoXFxzKicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoPzonICsgQVJHVU1FTlRTICsgJz8nICsgJyknICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcKVxccyonICsgJyknOwogIGNvbnN0IEJJTkRJTkcgPSAnKCcgKyBJREVOVCArICdcXHMqJyArIEFSR1VNRU5UX0xJU1QgKyAnPycgKyAnKSc7IC8vIEdyb3VwIDMKICBjb25zdCBPUEVOX0JSQUNLRVQgPSAnKFxcW1xcW3x7eyknICsgJ1xccyonOwogIGNvbnN0IENMT1NFX0JSQUNLRVQgPSAnKD86XV18fX0pJzsKICBjb25zdCBORUdBVEUgPSAnKD86KCEpXFxzKik/JzsgLy8gR3JvdXAgMgogIGNvbnN0IEVYUFJFU1NJT04gPSBPUEVOX0JSQUNLRVQgKyBORUdBVEUgKyBCSU5ESU5HICsgQ0xPU0VfQlJBQ0tFVDsKICBjb25zdCBiaW5kaW5nUmVnZXggPSBuZXcgUmVnRXhwKEVYUFJFU1NJT04sICJnIik7CgogIC8qKgogICAqIENyZWF0ZSBhIHN0cmluZyBmcm9tIGJpbmRpbmcgcGFydHMgb2YgYWxsIHRoZSBsaXRlcmFsIHBhcnRzCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxCaW5kaW5nUGFydD59IHBhcnRzIEFsbCBwYXJ0cyB0byBzdHJpbmdpZnkKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFN0cmluZyBtYWRlIGZyb20gdGhlIGxpdGVyYWwgcGFydHMKICAgKi8KICBmdW5jdGlvbiBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKSB7CiAgICBsZXQgcyA9ICcnOwogICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBsaXRlcmFsID0gcGFydHNbaV0ubGl0ZXJhbDsKICAgICAgcyArPSBsaXRlcmFsIHx8ICcnOwogICAgfQogICAgcmV0dXJuIHM7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYW4gZXhwcmVzc2lvbiBzdHJpbmcgZm9yIGEgbWV0aG9kIHNpZ25hdHVyZSwgYW5kIHJldHVybnMgYSBtZXRhZGF0YQogICAqIGRlc2NyaWJpbmcgdGhlIG1ldGhvZCBpbiB0ZXJtcyBvZiBgbWV0aG9kTmFtZWAsIGBzdGF0aWNgICh3aGV0aGVyIGFsbCB0aGUKICAgKiBhcmd1bWVudHMgYXJlIGxpdGVyYWxzKSwgYW5kIGFuIGFycmF5IG9mIGBhcmdzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gcGFyc2UKICAgKiBAcmV0dXJuIHs/TWV0aG9kU2lnbmF0dXJlfSBUaGUgbWV0aG9kIG1ldGFkYXRhIG9iamVjdCBpZiBhIG1ldGhvZCBleHByZXNzaW9uIHdhcwogICAqICAgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VNZXRob2QoZXhwcmVzc2lvbikgewogICAgLy8gdHJpZXMgdG8gbWF0Y2ggdmFsaWQgamF2YXNjcmlwdCBwcm9wZXJ0eSBuYW1lcwogICAgbGV0IG0gPSBleHByZXNzaW9uLm1hdGNoKC8oW15cc10rPylcKChbXHNcU10qKVwpLyk7CiAgICBpZiAobSkgewogICAgICBsZXQgbWV0aG9kTmFtZSA9IG1bMV07CiAgICAgIGxldCBzaWcgPSB7IG1ldGhvZE5hbWUsIHN0YXRpYzogdHJ1ZSwgYXJnczogZW1wdHlBcnJheSB9OwogICAgICBpZiAobVsyXS50cmltKCkpIHsKICAgICAgICAvLyByZXBsYWNlIGVzY2FwZWQgY29tbWFzIHdpdGggY29tbWEgZW50aXR5LCBzcGxpdCBvbiB1bi1lc2NhcGVkIGNvbW1hcwogICAgICAgIGxldCBhcmdzID0gbVsyXS5yZXBsYWNlKC9cXCwvZywgJyZjb21tYTsnKS5zcGxpdCgnLCcpOwogICAgICAgIHJldHVybiBwYXJzZUFyZ3MoYXJncywgc2lnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc2lnOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBhcnJheSBvZiBhcmd1bWVudHMgYW5kIHNldHMgdGhlIGBhcmdzYCBwcm9wZXJ0eSBvZiB0aGUgc3VwcGxpZWQKICAgKiBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0LiBTZXRzIHRoZSBgc3RhdGljYCBwcm9wZXJ0eSB0byBmYWxzZSBpZiBhbnkKICAgKiBhcmd1bWVudCBpcyBhIG5vbi1saXRlcmFsLgogICAqCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gYXJnTGlzdCBBcnJheSBvZiBhcmd1bWVudCBuYW1lcwogICAqIEBwYXJhbSB7IU1ldGhvZFNpZ25hdHVyZX0gc2lnIE1ldGhvZCBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0CiAgICogQHJldHVybiB7IU1ldGhvZFNpZ25hdHVyZX0gVGhlIHVwZGF0ZWQgc2lnbmF0dXJlIG1ldGFkYXRhIG9iamVjdAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ0xpc3QsIHNpZykgewogICAgc2lnLmFyZ3MgPSBhcmdMaXN0Lm1hcChmdW5jdGlvbihyYXdBcmcpIHsKICAgICAgbGV0IGFyZyA9IHBhcnNlQXJnKHJhd0FyZyk7CiAgICAgIGlmICghYXJnLmxpdGVyYWwpIHsKICAgICAgICBzaWcuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIGFyZzsKICAgIH0sIHRoaXMpOwogICAgcmV0dXJuIHNpZzsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBpbmRpdmlkdWFsIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBhcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOgogICAqCiAgICogICB7CiAgICogICAgIHZhbHVlOiAncHJvcCcsICAgICAgICAvLyBwcm9wZXJ0eS9wYXRoIG9yIGxpdGVyYWwgdmFsdWUKICAgKiAgICAgbGl0ZXJhbDogZmFsc2UsICAgICAgIC8vIHdoZXRoZXIgYXJndW1lbnQgaXMgYSBsaXRlcmFsCiAgICogICAgIHN0cnVjdHVyZWQ6IGZhbHNlLCAgICAvLyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBhIHBhdGgKICAgKiAgICAgcm9vdFByb3BlcnR5OiAncHJvcCcsIC8vIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoCiAgICogICAgIHdpbGRjYXJkOiBmYWxzZSAgICAgICAvLyB3aGV0aGVyIHRoZSBhcmd1bWVudCB3YXMgYSB3aWxkY2FyZCAnLionIHBhdGgKICAgKiAgIH0KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSByYXdBcmcgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXJndW1lbnQKICAgKiBAcmV0dXJuIHshTWV0aG9kQXJnfSBBcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHBhcnNlQXJnKHJhd0FyZykgewogICAgLy8gY2xlYW4gdXAgd2hpdGVzcGFjZQogICAgbGV0IGFyZyA9IHJhd0FyZy50cmltKCkKICAgICAgLy8gcmVwbGFjZSBjb21tYSBlbnRpdHkgd2l0aCBjb21tYQogICAgICAucmVwbGFjZSgvJmNvbW1hOy9nLCAnLCcpCiAgICAgIC8vIHJlcGFpciBleHRyYSBlc2NhcGUgc2VxdWVuY2VzOyBub3RlIG9ubHkgY29tbWFzIHN0cmljdGx5IG5lZWQKICAgICAgLy8gZXNjYXBpbmcsIGJ1dCB3ZSBhbGxvdyBhbnkgb3RoZXIgY2hhciB0byBiZSBlc2NhcGVkIHNpbmNlIGl0cwogICAgICAvLyBsaWtlbHkgdXNlcnMgd2lsbCBkbyB0aGlzCiAgICAgIC5yZXBsYWNlKC9cXCguKS9nLCAnXCQxJykKICAgICAgOwogICAgLy8gYmFzaWMgYXJndW1lbnQgZGVzY3JpcHRvcgogICAgbGV0IGEgPSB7CiAgICAgIG5hbWU6IGFyZywKICAgICAgdmFsdWU6ICcnLAogICAgICBsaXRlcmFsOiBmYWxzZQogICAgfTsKICAgIC8vIGRldGVjdCBsaXRlcmFsIHZhbHVlIChtdXN0IGJlIFN0cmluZyBvciBOdW1iZXIpCiAgICBsZXQgZmMgPSBhcmdbMF07CiAgICBpZiAoZmMgPT09ICctJykgewogICAgICBmYyA9IGFyZ1sxXTsKICAgIH0KICAgIGlmIChmYyA+PSAnMCcgJiYgZmMgPD0gJzknKSB7CiAgICAgIGZjID0gJyMnOwogICAgfQogICAgc3dpdGNoKGZjKSB7CiAgICAgIGNhc2UgIiciOgogICAgICBjYXNlICciJzoKICAgICAgICBhLnZhbHVlID0gYXJnLnNsaWNlKDEsIC0xKTsKICAgICAgICBhLmxpdGVyYWwgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcjJzoKICAgICAgICBhLnZhbHVlID0gTnVtYmVyKGFyZyk7CiAgICAgICAgYS5saXRlcmFsID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgIH0KICAgIC8vIGlmIG5vdCBsaXRlcmFsLCBsb29rIGZvciBzdHJ1Y3R1cmVkIHBhdGgKICAgIGlmICghYS5saXRlcmFsKSB7CiAgICAgIGEucm9vdFByb3BlcnR5ID0gUG9seW1lci5QYXRoLnJvb3QoYXJnKTsKICAgICAgLy8gZGV0ZWN0IHN0cnVjdHVyZWQgcGF0aCAoaGFzIGRvdHMpCiAgICAgIGEuc3RydWN0dXJlZCA9IFBvbHltZXIuUGF0aC5pc1BhdGgoYXJnKTsKICAgICAgaWYgKGEuc3RydWN0dXJlZCkgewogICAgICAgIGEud2lsZGNhcmQgPSAoYXJnLnNsaWNlKC0yKSA9PSAnLionKTsKICAgICAgICBpZiAoYS53aWxkY2FyZCkgewogICAgICAgICAgYS5uYW1lID0gYXJnLnNsaWNlKDAsIC0yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhOwogIH0KCiAgLy8gZGF0YSBhcGkKCiAgLyoqCiAgICogU2VuZHMgYXJyYXkgc3BsaWNlIG5vdGlmaWNhdGlvbnMgKGAuc3BsaWNlc2AgYW5kIGAubGVuZ3RoYCkKICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7QXJyYXl9IHNwbGljZXMgQXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgc3BsaWNlcykgewogICAgbGV0IHNwbGljZXNQYXRoID0gcGF0aCArICcuc3BsaWNlcyc7CiAgICBpbnN0Lm5vdGlmeVBhdGgoc3BsaWNlc1BhdGgsIHsgaW5kZXhTcGxpY2VzOiBzcGxpY2VzIH0pOwogICAgaW5zdC5ub3RpZnlQYXRoKHBhdGggKyAnLmxlbmd0aCcsIGFycmF5Lmxlbmd0aCk7CiAgICAvLyBOdWxsIGhlcmUgdG8gYWxsb3cgcG90ZW50aWFsbHkgbGFyZ2Ugc3BsaWNlIHJlY29yZHMgdG8gYmUgR0MnZWQuCiAgICBpbnN0Ll9fZGF0YVtzcGxpY2VzUGF0aF0gPSB7aW5kZXhTcGxpY2VzOiBudWxsfTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzcGxpY2UgcmVjb3JkIGFuZCBzZW5kcyBhbiBhcnJheSBzcGxpY2Ugbm90aWZpY2F0aW9uIGZvcgogICAqIHRoZSBkZXNjcmliZWQgbXV0YXRpb24KICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBhdCB3aGljaCB0aGUgYXJyYXkgbXV0YXRpb24gb2NjdXJyZWQKICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZWRDb3VudCBOdW1iZXIgb2YgYWRkZWQgaXRlbXMKICAgKiBAcGFyYW0ge0FycmF5fSByZW1vdmVkIEFycmF5IG9mIHJlbW92ZWQgaXRlbXMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlKGluc3QsIGFycmF5LCBwYXRoLCBpbmRleCwgYWRkZWRDb3VudCwgcmVtb3ZlZCkgewogICAgbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgW3sKICAgICAgaW5kZXg6IGluZGV4LAogICAgICBhZGRlZENvdW50OiBhZGRlZENvdW50LAogICAgICByZW1vdmVkOiByZW1vdmVkLAogICAgICBvYmplY3Q6IGFycmF5LAogICAgICB0eXBlOiAnc3BsaWNlJwogICAgfV0pOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhbiB1cHBlci1jYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBTdHJpbmcgdG8gdXBwZXJjYXNlCiAgICogQHJldHVybiB7c3RyaW5nfSBVcHBlcmNhc2VkIHN0cmluZwogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gdXBwZXIobmFtZSkgewogICAgcmV0dXJuIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIFBvbHltZXIncyB0ZW1wbGF0ZQogICAqIGJpbmRpbmcgYW5kIGRhdGEgb2JzZXJ2YXRpb24gKGNvbGxlY3RpdmVseSwgInByb3BlcnR5IGVmZmVjdHMiKSBzeXN0ZW0uCiAgICoKICAgKiBUaGlzIG1peGluIHVzZXMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBrZXkgc3RhdGljIG1ldGhvZHMgZm9yIGFkZGluZwogICAqIHByb3BlcnR5IGVmZmVjdHMgdG8gYW4gZWxlbWVudCBjbGFzczoKICAgKiAtIGBhZGRQcm9wZXJ0eUVmZmVjdGAKICAgKiAtIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU1ldGhvZE9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5YAogICAqIC0gYGNyZWF0ZVJlYWRPbmx5UHJvcGVydHlgCiAgICogLSBgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHlgCiAgICogLSBgY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eWAKICAgKiAtIGBiaW5kVGVtcGxhdGVgCiAgICoKICAgKiBFYWNoIG1ldGhvZCBjcmVhdGVzIG9uZSBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycywgYWxvbmcgd2l0aCBtZXRhZGF0YQogICAqIHVzZWQgYnkgdGhpcyBtaXhpbidzIGltcGxlbWVudGF0aW9uIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHRvIHBlcmZvcm0KICAgKiB0aGUgcHJvcGVydHkgZWZmZWN0cy4KICAgKgogICAqIFVuZGVyc2NvcmVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBtZXRob2RzIGFsc28gZXhpc3Qgb24gdGhlIGVsZW1lbnQKICAgKiBwcm90b3R5cGUgZm9yIGFkZGluZyBwcm9wZXJ0eSBlZmZlY3RzIG9uIGluc3RhbmNlcyBhdCBydW50aW1lLgogICAqCiAgICogTm90ZSB0aGF0IHRoaXMgbWl4aW4gb3ZlcnJpZGVzIHNldmVyYWwgYFByb3BlcnR5QWNjZXNzb3JzYCBtZXRob2RzLCBpbgogICAqIG1hbnkgY2FzZXMgdG8gbWFpbnRhaW4gZ3VhcmFudGVlcyBwcm92aWRlZCBieSB0aGUgUG9seW1lciAxLnggZmVhdHVyZXM7CiAgICogbm90YWJseSBpdCBjaGFuZ2VzIHByb3BlcnR5IGFjY2Vzc29ycyB0byBiZSBzeW5jaHJvbm91cyBieSBkZWZhdWx0CiAgICogd2hlcmVhcyB0aGUgZGVmYXVsdCB3aGVuIHVzaW5nIGBQcm9wZXJ0eUFjY2Vzc29yc2Agc3RhbmRhbG9uZSBpcyB0byBiZQogICAqIGFzeW5jIGJ5IGRlZmF1bHQuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlRlbXBsYXRlU3RhbXAKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBtZXRhLXByb2dyYW1taW5nIGZvciBQb2x5bWVyJ3MKICAgKiB0ZW1wbGF0ZSBiaW5kaW5nIGFuZCBkYXRhIG9ic2VydmF0aW9uIHN5c3RlbS4KICAgKi8KICBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUFjY2Vzc29yc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1RlbXBsYXRlU3RhbXB9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBwcm9wZXJ0eUVmZmVjdHNCYXNlID0gUG9seW1lci5UZW1wbGF0ZVN0YW1wKFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMoc3VwZXJDbGFzcykpOwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7cHJvcGVydHlFZmZlY3RzQmFzZX0KICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgUHJvcGVydHlFZmZlY3RzIGV4dGVuZHMgcHJvcGVydHlFZmZlY3RzQmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICAvLyBVc2VkIHRvIGlkZW50aWZ5IHVzZXJzIG9mIHRoaXMgbWl4aW4sIGFsYSBpbnN0YW5jZW9mCiAgICAgICAgdGhpcy5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ID0gdHJ1ZTsKICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8KICAgICAgICAvLyBOT1RFOiB1c2VkIHRvIHRyYWNrIHJlLWVudHJhbnQgY2FsbHMgdG8gYF9mbHVzaFByb3BlcnRpZXNgCiAgICAgICAgLy8gcGF0aCBjaGFuZ2VzIGRpcnR5IGNoZWNrIGFnYWluc3QgYF9fZGF0YVRlbXBgIG9ubHkgZHVyaW5nIG9uZSAidHVybiIKICAgICAgICAvLyBhbmQgYXJlIGNsZWFyZWQgd2hlbiBgX19kYXRhQ291bnRlcmAgcmV0dXJucyB0byAwLgogICAgICAgIHRoaXMuX19kYXRhQ291bnRlciA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5OwogICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovCiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2U7CiAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gKi8KICAgICAgICB0aGlzLl9fZGF0YUhvc3Q7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhVGVtcDsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzSW5pdGlhbGl6ZWQ7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmc7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhT2xkOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19jb21wdXRlRWZmZWN0czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fcmVmbGVjdEVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX25vdGlmeUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX3Byb3BhZ2F0ZUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX29ic2VydmVFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19yZWFkT25seTsKICAgICAgICAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovCiAgICAgICAgdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgZ2V0IFBST1BFUlRZX0VGRkVDVF9UWVBFUygpIHsKICAgICAgICByZXR1cm4gVFlQRVM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIGhvc3RTdGFjay5yZWdpc3Rlckhvc3QodGhpcyk7CiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkgPSBmYWxzZTsKICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gZmFsc2U7CiAgICAgICAgLy8gTWF5IGJlIHNldCBvbiBpbnN0YW5jZSBwcmlvciB0byB1cGdyYWRlCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB0aGlzLl9fZGF0YUNvbXBvdW5kU3RvcmFnZSB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhSG9zdCA9IHRoaXMuX19kYXRhSG9zdCB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYQogICAgICAgKiBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBpbml0aWFsaXppbmcgcHJvcGVydGllcyBmcm9tCiAgICAgICAqIHRoZSBwcm90b3R5cGUgb24gdGhlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIHRoaXMuX19kYXRhID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29yc2AgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgc2V0dGluZwogICAgICAgKiBgX3NldFByb3BlcnR5YCdzIGBzaG91bGROb3RpZnk6IHRydWVgLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgaW5zdGFuY2UKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplSW5zdGFuY2VQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgbGV0IHJlYWRPbmx5ID0gdGhpc1tUWVBFUy5SRUFEX09OTFldOwogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIGlmICghcmVhZE9ubHkgfHwgIXJlYWRPbmx5W3Byb3BdKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IHRoaXMuX19kYXRhUGVuZGluZyB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB0aGlzLl9fZGF0YU9sZCB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcF0gPSB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcF0gPSBwcm9wc1twcm9wXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFByb3RvdHlwZSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGFkZFByb3BlcnR5RWZmZWN0YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgdHlwZSA9PSBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIC8vIGVmZmVjdHMgYXJlIGFjY3VtdWxhdGVkIGludG8gYXJyYXlzIHBlciBwcm9wZXJ0eSBiYXNlZCBvbiB0eXBlCiAgICAgICAgbGV0IGVmZmVjdHMgPSBlbnN1cmVPd25FZmZlY3RNYXAodGhpcywgdHlwZSlbcHJvcGVydHldOwogICAgICAgIGlmICghZWZmZWN0cykgewogICAgICAgICAgZWZmZWN0cyA9IHRoaXNbdHlwZV1bcHJvcGVydHldID0gW107CiAgICAgICAgfQogICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcHJvcGVydHkgZWZmZWN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdGhlIGVmZmVjdCB3YXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVmZmVjdCB0eXBlLCBmcm9tIHRoaXMuUFJPUEVSVFlfRUZGRUNUX1RZUEVTCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QgdG8gcmVtb3ZlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVtb3ZlUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgIGxldCBlZmZlY3RzID0gZW5zdXJlT3duRWZmZWN0TWFwKHRoaXMsIHR5cGUpW3Byb3BlcnR5XTsKICAgICAgICBsZXQgaWR4ID0gZWZmZWN0cy5pbmRleE9mKGVmZmVjdCk7CiAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICBlZmZlY3RzLnNwbGljZShpZHgsIDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgcHJvcGVydHkgZWZmZWN0CiAgICAgICAqIG9mIGEgY2VydGFpbiB0eXBlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IHR5cGUgRWZmZWN0IHR5cGUsIGZyb20gdGhpcy5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSkgewogICAgICAgIGxldCBlZmZlY3RzID0gdGhpc1t0eXBlXTsKICAgICAgICByZXR1cm4gQm9vbGVhbihlZmZlY3RzICYmIGVmZmVjdHNbcHJvcGVydHldKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgInJlYWQgb25seSIKICAgICAgICogYWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNSZWFkT25seUVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgIm5vdGlmeSIKICAgICAgICogcHJvcGVydHkgZWZmZWN0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMgdHlwZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaGFzTm90aWZ5RWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5OT1RJRlkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAicmVmbGVjdCB0byBhdHRyaWJ1dGUiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc1JlZmxlY3RFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLlJFRkxFQ1QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAiY29tcHV0ZWQiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc0NvbXB1dGVkRWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5DT01QVVRFKTsKICAgICAgfQoKICAgICAgLy8gUnVudGltZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogU2V0cyBhIHBlbmRpbmcgcHJvcGVydHkgb3IgcGF0aC4gIElmIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoIGluCiAgICAgICAqIHF1ZXN0aW9uIGhhZCBubyBhY2Nlc3NvciwgdGhlIHBhdGggaXMgc2V0LCBvdGhlcndpc2UgaXQgaXMgZW5xdWV1ZWQKICAgICAgICogdmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YC4KICAgICAgICoKICAgICAgICogVGhpcyBmdW5jdGlvbiBpc29sYXRlcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZSBmdW5jdGlvbmFsaXR5IG5lY2Vzc2FyeQogICAgICAgKiBmb3IgdGhlIHB1YmxpYyBBUEkgKGBzZXRgLCBgc2V0UHJvcGVydGllc2AsIGBub3RpZnlQYXRoYCwgYW5kIHByb3BlcnR5CiAgICAgICAqIGNoYW5nZSBsaXN0ZW5lcnMgdmlhIHt7Li4ufX0gYmluZGluZ3MpLCBzdWNoIHRoYXQgaXQgaXMgb25seSBkb25lCiAgICAgICAqIHdoZW4gcGF0aHMgZW50ZXIgdGhlIHN5c3RlbSwgYW5kIG5vdCBhdCBldmVyeSBwcm9wYWdhdGlvbiBzdGVwLiAgSXQKICAgICAgICogYWxzbyBzZXRzIGEgYF9fZGF0YUhhc1BhdGhzYCBmbGFnIG9uIHRoZSBpbnN0YW5jZSB3aGljaCBpcyB1c2VkIHRvCiAgICAgICAqIGZhc3QtcGF0aCBzbG93ZXIgcGF0aC1tYXRjaGluZyBjb2RlIGluIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIGhvc3QgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIGBwYXRoYCBjYW4gYmUgYSBwYXRoIHN0cmluZyBvciBhcnJheSBvZiBwYXRoIHBhcnRzIGFzIGFjY2VwdGVkIGJ5IHRoZQogICAgICAgKiBwdWJsaWMgQVBJLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxudW1iZXJ8c3RyaW5nPn0gcGF0aCBQYXRoIHRvIHNldAogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGROb3RpZnkgU2V0IHRvIHRydWUgaWYgdGhpcyBjaGFuZ2Ugc2hvdWxkCiAgICAgICAqICBjYXVzZSBhIHByb3BlcnR5IG5vdGlmaWNhdGlvbiBldmVudCBkaXNwYXRjaAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBpc1BhdGhOb3RpZmljYXRpb24gSWYgdGhlIHBhdGggYmVpbmcgc2V0IGlzIGEgcGF0aAogICAgICAgKiAgIG5vdGlmaWNhdGlvbiBvZiBhbiBhbHJlYWR5IGNoYW5nZWQgdmFsdWUsIGFzIG9wcG9zZWQgdG8gYSByZXF1ZXN0CiAgICAgICAqICAgdG8gc2V0IGFuZCBub3RpZnkgdGhlIGNoYW5nZS4gIEluIHRoZSBsYXR0ZXIgYGZhbHNlYCBjYXNlLCBhIGRpcnR5CiAgICAgICAqICAgY2hlY2sgaXMgcGVyZm9ybWVkIGFuZCB0aGVuIHRoZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHBhdGggYmVmb3JlCiAgICAgICAqICAgZW5xdWV1aW5nIHRoZSBwZW5kaW5nIHByb3BlcnR5IGNoYW5nZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eS9wYXRoIHdhcyBlbnF1ZXVlZCBpbgogICAgICAgKiAgIHRoZSBwZW5kaW5nIGNoYW5nZXMgYmFnLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCBzaG91bGROb3RpZnksIGlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgIGlmIChpc1BhdGhOb3RpZmljYXRpb24gfHwKICAgICAgICAgICAgUG9seW1lci5QYXRoLnJvb3QoQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGhbMF0gOiBwYXRoKSAhPT0gcGF0aCkgewogICAgICAgICAgLy8gRGlydHkgY2hlY2sgY2hhbmdlcyBiZWluZyBzZXQgdG8gYSBwYXRoIGFnYWluc3QgdGhlIGFjdHVhbCBvYmplY3QsCiAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgcGF0aHMgaW50byB0aGUgc3lzdGVtOyBmcm9tIGhlcmUKICAgICAgICAgIC8vIHRoZSBvbmx5IGRpcnR5IGNoZWNrcyBhcmUgYWdhaW5zdCB0aGUgYF9fZGF0YVRlbXBgIGNhY2hlIHRvIHByZXZlbnQKICAgICAgICAgIC8vIGR1cGxpY2F0ZSB3b3JrIGluIHRoZSBzYW1lIHR1cm4gb25seS4gTm90ZSwgaWYgdGhpcyB3YXMgYSBub3RpZmljYXRpb24KICAgICAgICAgIC8vIG9mIGEgY2hhbmdlIGFscmVhZHkgc2V0IHRvIGEgcGF0aCAoaXNQYXRoTm90aWZpY2F0aW9uOiB0cnVlKSwKICAgICAgICAgIC8vIHdlIGFsd2F5cyBsZXQgdGhlIGNoYW5nZSB0aHJvdWdoIGFuZCBza2lwIHRoZSBgc2V0YCBzaW5jZSBpdCB3YXMKICAgICAgICAgIC8vIGFscmVhZHkgZGlydHkgY2hlY2tlZCBhdCB0aGUgcG9pbnQgb2YgZW50cnkgYW5kIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAvLyBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCiAgICAgICAgICBpZiAoIWlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgICAgICBsZXQgb2xkID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoKTsKICAgICAgICAgICAgcGF0aCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoUG9seW1lci5QYXRoLnNldCh0aGlzLCBwYXRoLCB2YWx1ZSkpOwogICAgICAgICAgICAvLyBVc2UgcHJvcGVydHktYWNjZXNzb3IncyBzaW1wbGVyIGRpcnR5IGNoZWNrCiAgICAgICAgICAgIGlmICghcGF0aCB8fCAhc3VwZXIuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHBhdGgsIHZhbHVlLCBvbGQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gdHJ1ZTsKICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoLyoqQHR5cGV7c3RyaW5nfSovKHBhdGgpLCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSkgewogICAgICAgICAgICBjb21wdXRlTGlua2VkUGF0aHModGhpcywgcGF0aCwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgJiYgdGhpcy5fX2RhdGFIYXNBY2Nlc3NvcltwYXRoXSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KC8qKkB0eXBle3N0cmluZ30qLyhwYXRoKSwgdmFsdWUsIHNob3VsZE5vdGlmeSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzW3BhdGhdID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFwcGxpZXMgYSB2YWx1ZSB0byBhIG5vbi1Qb2x5bWVyIGVsZW1lbnQvbm9kZSdzIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMgYSBiZXN0LWVmZm9ydCBhdCBiaW5kaW5nIGludGVyb3A6CiAgICAgICAqIFNvbWUgbmF0aXZlIGVsZW1lbnQgcHJvcGVydGllcyBoYXZlIHNpZGUtZWZmZWN0cyB3aGVuCiAgICAgICAqIHJlLXNldHRpbmcgdGhlIHNhbWUgdmFsdWUgKGUuZy4gc2V0dGluZyBgPGlucHV0Pi52YWx1ZWAgcmVzZXRzIHRoZQogICAgICAgKiBjdXJzb3IgcG9zaXRpb24pLCBzbyB3ZSBkbyBhIGRpcnR5LWNoZWNrIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZS4KICAgICAgICogSG93ZXZlciwgZm9yIGJldHRlciBpbnRlcm9wIHdpdGggbm9uLVBvbHltZXIgY3VzdG9tIGVsZW1lbnRzIHRoYXQKICAgICAgICogYWNjZXB0IG9iamVjdHMsIHdlIGV4cGxpY2l0bHkgcmUtc2V0IG9iamVjdCBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQogICAgICAgKiBQb2x5bWVyIHdvcmxkICh3aGljaCBtYXkgaW5jbHVkZSBkZWVwIG9iamVjdCBjaGFuZ2VzIHdpdGhvdXQgdGhlCiAgICAgICAqIHRvcCByZWZlcmVuY2UgY2hhbmdpbmcpLCBlcnJpbmcgb24gdGhlIHNpZGUgb2YgcHJvdmlkaW5nIG1vcmUKICAgICAgICogaW5mb3JtYXRpb24uCiAgICAgICAqCiAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFsdGVybmF0ZSBhcHByb2FjaGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIFRoZSBub2RlIHRvIHNldCBhIHByb3BlcnR5IG9uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSkgewogICAgICAgIC8vIEl0IGlzIGEganVkZ21lbnQgY2FsbCB0aGF0IHJlc2V0dGluZyBwcmltaXRpdmVzIGlzCiAgICAgICAgLy8gImJhZCIgYW5kIHJlc2V0dGluZ3Mgb2JqZWN0cyBpcyBhbHNvICJnb29kIjsgYWx0ZXJuYXRpdmVseSB3ZSBjb3VsZAogICAgICAgIC8vIGltcGxlbWVudCBhIHdoaXRlbGlzdCBvZiB0YWcgJiBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBzaG91bGQgbmV2ZXIKICAgICAgICAvLyBiZSByZXNldCAoZS5nLiA8aW5wdXQ+LnZhbHVlICYmIDxzZWxlY3Q+LnZhbHVlKQogICAgICAgIGlmICh2YWx1ZSAhPT0gbm9kZVtwcm9wXSB8fCB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHsKICAgICAgICAgIG5vZGVbcHJvcF0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgaW1wbGVtZW50YXRpb24gdG8gaW50cm9kdWNlIHNwZWNpYWwKICAgICAgICogZGlydHkgY2hlY2sgbG9naWMgZGVwZW5kaW5nIG9uIHRoZSBwcm9wZXJ0eSAmIHZhbHVlIGJlaW5nIHNldDoKICAgICAgICoKICAgICAgICogMS4gQW55IHZhbHVlIHNldCB0byBhIHBhdGggKGUuZy4gJ29iai5wcm9wJzogNDIgb3IgJ29iai5wcm9wJzogey4uLn0pCiAgICAgICAqICAgIFN0b3JlZCBpbiBgX19kYXRhVGVtcGAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhVGVtcGAKICAgICAgICogMi4gT2JqZWN0IHNldCB0byBzaW1wbGUgcHJvcGVydHkgKGUuZy4gJ3Byb3AnOiB7Li4ufSkKICAgICAgICogICAgU3RvcmVkIGluIGBfX2RhdGFUZW1wYCBhbmQgYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdAogICAgICAgKiAgICBgX19kYXRhVGVtcGAgYnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgX3Nob3VsZFByb3BlcnR5Q2hhbmdlYAogICAgICAgKiAzLiBQcmltaXRpdmUgdmFsdWUgc2V0IHRvIHNpbXBsZSBwcm9wZXJ0eSAoZS5nLiAncHJvcCc6IDQyKQogICAgICAgKiAgICBTdG9yZWQgaW4gYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhYAogICAgICAgKgogICAgICAgKiBUaGUgZGlydHktY2hlY2sgaXMgaW1wb3J0YW50IHRvIHByZXZlbnQgY3ljbGVzIGR1ZSB0byB0d28td2F5CiAgICAgICAqIG5vdGlmaWNhdGlvbiwgYnV0IHBhdGhzIGFuZCBvYmplY3RzIGFyZSBvbmx5IGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBhbnkKICAgICAgICogcHJldmlvdXMgdmFsdWUgc2V0IGR1cmluZyB0aGlzIHR1cm4gdmlhIGEgInRlbXBvcmFyeSBjYWNoZSIgdGhhdCBpcwogICAgICAgKiBjbGVhcmVkIHdoZW4gdGhlIGxhc3QgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgZXhpdHMuIFRoaXMgaXMgc286CiAgICAgICAqIGEuIGFueSBjYWNoZWQgYXJyYXkgcGF0aHMgKGUuZy4gJ2FycmF5LjMucHJvcCcpIG1heSBiZSBpbnZhbGlkYXRlZAogICAgICAgKiAgICBkdWUgdG8gYXJyYXkgbXV0YXRpb25zIGxpa2Ugc2hpZnQvdW5zaGlmdC9zcGxpY2U7IHRoaXMgaXMgZmluZQogICAgICAgKiAgICBzaW5jZSBwYXRoIGNoYW5nZXMgYXJlIGRpcnR5LWNoZWNrZWQgYXQgdXNlciBlbnRyeSBwb2ludHMgbGlrZSBgc2V0YAogICAgICAgKiBiLiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBvbmx5IGxhc3RzIG9uZSB0dXJuIHRvIGFsbG93IHRoZSB1c2VyCiAgICAgICAqICAgIHRvIG11dGF0ZSB0aGUgb2JqZWN0IGluLXBsYWNlIGFuZCByZS1zZXQgaXQgd2l0aCB0aGUgc2FtZSBpZGVudGl0eQogICAgICAgKiAgICBhbmQgaGF2ZSBhbGwgc3ViLXByb3BlcnRpZXMgcmUtcHJvcGFnYXRlZCBpbiBhIHN1YnNlcXVlbnQgdHVybi4KICAgICAgICoKICAgICAgICogVGhlIHRlbXAgY2FjaGUgaXMgbm90IG5lY2Vzc2FyaWx5IHN1ZmZpY2llbnQgdG8gcHJldmVudCBpbnZhbGlkIGFycmF5CiAgICAgICAqIHBhdGhzLCBzaW5jZSBhIHNwbGljZSBjYW4gaGFwcGVuIGR1cmluZyB0aGUgc2FtZSB0dXJuICh3aXRoIHBhdGhvbG9naWNhbAogICAgICAgKiB1c2VyIGNvZGUpOyB3ZSBjb3VsZCBpbnRyb2R1Y2UgYSAiZml4dXAiIGZvciB0ZW1wb3JhcmlseSBjYWNoZWQgYXJyYXkKICAgICAgICogcGF0aHMgaWYgbmVlZGVkOiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9wb2x5bWVyL2lzc3Vlcy80MjI3CiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkTm90aWZ5IFRydWUgaWYgcHJvcGVydHkgc2hvdWxkIGZpcmUgbm90aWZpY2F0aW9uCiAgICAgICAqICAgZXZlbnQgKGFwcGxpZXMgb25seSBmb3IgYG5vdGlmeTogdHJ1ZWAgcHJvcGVydGllcykKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSB7CiAgICAgICAgbGV0IGlzUGF0aCA9IHRoaXMuX19kYXRhSGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwcm9wZXJ0eSk7CiAgICAgICAgbGV0IHByZXZQcm9wcyA9IGlzUGF0aCA/IHRoaXMuX19kYXRhVGVtcCA6IHRoaXMuX19kYXRhOwogICAgICAgIGlmICh0aGlzLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIHByZXZQcm9wc1twcm9wZXJ0eV0pKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEVuc3VyZSBvbGQgaXMgY2FwdHVyZWQgZnJvbSB0aGUgbGFzdCB0dXJuCiAgICAgICAgICBpZiAoIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGRbcHJvcGVydHldID0gdGhpcy5fX2RhdGFbcHJvcGVydHldOwogICAgICAgICAgfQogICAgICAgICAgLy8gUGF0aHMgYXJlIHN0b3JlZCBpbiB0ZW1wb3JhcnkgY2FjaGUgKGNsZWFyZWQgYXQgZW5kIG9mIHR1cm4pLAogICAgICAgICAgLy8gd2hpY2ggaXMgdXNlZCBmb3IgZGlydHktY2hlY2tpbmcsIGFsbCBvdGhlcnMgc3RvcmVkIGluIF9fZGF0YQogICAgICAgICAgaWYgKGlzUGF0aCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9fZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFsbCBjaGFuZ2VzIGdvIGludG8gcGVuZGluZyBwcm9wZXJ0eSBiYWcsIHBhc3NlZCB0byBfcHJvcGVydGllc0NoYW5nZWQKICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIC8vIFRyYWNrIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgbm90aWZ5IHNlcGFyYXRlbHkKICAgICAgICAgIGlmIChpc1BhdGggfHwgKHRoaXNbVFlQRVMuTk9USUZZXSAmJiB0aGlzW1RZUEVTLk5PVElGWV1bcHJvcGVydHldKSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gdGhpcy5fX2RhdGFUb05vdGlmeSB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeVtwcm9wZXJ0eV0gPSBzaG91bGROb3RpZnk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gZW5zdXJlIGFsbCBhY2Nlc3NvcnMgc2V0IGBzaG91bGROb3RpZnlgCiAgICAgICAqIHRvIHRydWUsIGZvciBwZXItcHJvcGVydHkgbm90aWZpY2F0aW9uIHRyYWNraW5nLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHRydWUpKSB7CiAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcmAncyBkZWZhdWx0IGFzeW5jIHF1ZXVpbmcgb2YKICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGA6IGlmIGBfX2RhdGFSZWFkeWAgaXMgZmFsc2UgKGhhcyBub3QgeWV0IGJlZW4KICAgICAgICogbWFudWFsbHkgZmx1c2hlZCksIHRoZSBmdW5jdGlvbiBuby1vcHM7IG90aGVyd2lzZSBmbHVzaGVzCiAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIHN5bmNocm9ub3VzbHkuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyB0aGUgZ2l2ZW4gY2xpZW50IG9uIGEgbGlzdCBvZiBwZW5kaW5nIGNsaWVudHMsIHdob3NlCiAgICAgICAqIHBlbmRpbmcgcHJvcGVydHkgY2hhbmdlcyBjYW4gbGF0ZXIgYmUgZmx1c2hlZCB2aWEgYSBjYWxsIHRvCiAgICAgICAqIGBfZmx1c2hDbGllbnRzYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNsaWVudCBQcm9wZXJ0eUVmZmVjdHMgY2xpZW50IHRvIGVucXVldWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2VucXVldWVDbGllbnQoY2xpZW50KSB7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMgfHwgW107CiAgICAgICAgaWYgKGNsaWVudCAhPT0gdGhpcykgewogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cy5wdXNoKGNsaWVudCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24uCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgdGhpcy5fX2RhdGFDb3VudGVyKys7CiAgICAgICAgc3VwZXIuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIHRoaXMuX19kYXRhQ291bnRlci0tOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmx1c2hlcyBhbnkgY2xpZW50cyBwcmV2aW91c2x5IGVucXVldWVkIHZpYSBgX2VucXVldWVDbGllbnRgLCBjYXVzaW5nCiAgICAgICAqIHRoZWlyIGBfZmx1c2hQcm9wZXJ0aWVzYCBtZXRob2QgdG8gcnVuLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfZmx1c2hDbGllbnRzKCkgewogICAgICAgIGlmICghdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkpIHsKICAgICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5ID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX3JlYWR5Q2xpZW50cygpOwogICAgICAgICAgLy8gT3ZlcnJpZGUgcG9pbnQgd2hlcmUgYWNjZXNzb3JzIGFyZSB0dXJuZWQgb247IGltcG9ydGFudGx5LAogICAgICAgICAgLy8gdGhpcyBpcyBhZnRlciBjbGllbnRzIGhhdmUgZnVsbHkgcmVhZGllZCwgcHJvdmlkaW5nIGEgZ3VhcmFudGVlCiAgICAgICAgICAvLyB0aGF0IGFueSBwcm9wZXJ0eSBlZmZlY3RzIG9jY3VyIG9ubHkgYWZ0ZXIgYWxsIGNsaWVudHMgYXJlIHJlYWR5LgogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gTk9URTogV2UgZW5zdXJlIGNsaWVudHMgZWl0aGVyIGVuYWJsZSBvciBmbHVzaCBhcyBhcHByb3ByaWF0ZS4gVGhpcwogICAgICAvLyBoYW5kbGVzIHR3byBjb3JuZXIgY2FzZXM6CiAgICAgIC8vICgxKSBjbGllbnRzIGZsdXNoIHByb3Blcmx5IHdoZW4gY29ubmVjdGVkL2VuYWJsZWQgYmVmb3JlIHRoZSBob3N0CiAgICAgIC8vIGVuYWJsZXM7IGUuZy4KICAgICAgLy8gICAoYSkgVGVtcGxhdGl6ZSBzdGFtcHMgd2l0aCBubyBwcm9wZXJ0aWVzIGFuZCBkb2VzIG5vdCBmbHVzaCBhbmQKICAgICAgLy8gICAoYikgdGhlIGluc3RhbmNlIGlzIGluc2VydGVkIGludG8gZG9tIGFuZAogICAgICAvLyAgIChjKSB0aGVuIHRoZSBpbnN0YW5jZSBmbHVzaGVzLgogICAgICAvLyAoMikgY2xpZW50cyBlbmFibGUgcHJvcGVybHkgd2hlbiBub3QgY29ubmVjdGVkL2VuYWJsZWQgd2hlbiB0aGUgaG9zdAogICAgICAvLyBmbHVzaGVzOyBlLmcuCiAgICAgIC8vICAgKGEpIGEgdGVtcGxhdGUgaXMgcnVudGltZSBzdGFtcGVkIGFuZCBub3QgeWV0IGNvbm5lY3RlZC9lbmFibGVkCiAgICAgIC8vICAgKGIpIGEgaG9zdCBzZXRzIGEgcHJvcGVydHksIGNhdXNpbmcgc3RhbXBlZCBkb20gdG8gZmx1c2gKICAgICAgLy8gICAoYykgdGhlIHN0YW1wZWQgZG9tIGVuYWJsZXMuCiAgICAgIF9fZW5hYmxlT3JGbHVzaENsaWVudHMoKSB7CiAgICAgICAgbGV0IGNsaWVudHMgPSB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzOwogICAgICAgIGlmIChjbGllbnRzKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGNsaWVudCA9IGNsaWVudHNbaV07CiAgICAgICAgICAgIGlmICghY2xpZW50Ll9fZGF0YUVuYWJsZWQpIHsKICAgICAgICAgICAgICBjbGllbnQuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICAgIGNsaWVudC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQZXJmb3JtIGFueSBpbml0aWFsIHNldHVwIG9uIGNsaWVudCBkb20uIENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0CiAgICAgICAqIGBfZmx1c2hQcm9wZXJ0aWVzYCBjYWxsIG9uIGNsaWVudCBkb20gYW5kIGJlZm9yZSBhbnkgZWxlbWVudAogICAgICAgKiBvYnNlcnZlcnMgYXJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICB0aGlzLl9fZW5hYmxlT3JGbHVzaENsaWVudHMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSBiYWcgb2YgcHJvcGVydHkgY2hhbmdlcyB0byB0aGlzIGluc3RhbmNlLCBhbmQKICAgICAgICogc3luY2hyb25vdXNseSBwcm9jZXNzZXMgYWxsIGVmZmVjdHMgb2YgdGhlIHByb3BlcnRpZXMgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBzaW1wbGUgcHJvcGVydGllcywgbm90IHBhdGhzLiAgQmF0Y2hlZAogICAgICAgKiBwYXRoIHByb3BhZ2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2Ygb25lIG9yIG1vcmUga2V5LXZhbHVlIHBhaXJzIHdob3NlIGtleSBpcwogICAgICAgKiAgIGEgcHJvcGVydHkgYW5kIHZhbHVlIGlzIHRoZSBuZXcgdmFsdWUgdG8gc2V0IGZvciB0aGF0IHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXRSZWFkT25seSBXaGVuIHRydWUsIGFueSBwcml2YXRlIHZhbHVlcyBzZXQgaW4KICAgICAgICogICBgcHJvcHNgIHdpbGwgYmUgc2V0LiBCeSBkZWZhdWx0LCBgc2V0UHJvcGVydGllc2Agd2lsbCBub3Qgc2V0CiAgICAgICAqICAgYHJlYWRPbmx5OiB0cnVlYCByb290IHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNldFByb3BlcnRpZXMocHJvcHMsIHNldFJlYWRPbmx5KSB7CiAgICAgICAgZm9yIChsZXQgcGF0aCBpbiBwcm9wcykgewogICAgICAgICAgaWYgKHNldFJlYWRPbmx5IHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV0gfHwgIXRoaXNbVFlQRVMuUkVBRF9PTkxZXVtwYXRoXSkgewogICAgICAgICAgICAvL1RPRE8oa3NjaGFhZik6IGV4cGxpY2l0bHkgZGlzYWxsb3cgcGF0aHMgaW4gc2V0UHJvcGVydHk/CiAgICAgICAgICAgIC8vIHdpbGRjYXJkIG9ic2VydmVycyBjdXJyZW50bHkgb25seSBwYXNzIHRoZSBmaXJzdCBjaGFuZ2VkIHBhdGgKICAgICAgICAgICAgLy8gaW4gdGhlIGBpbmZvYCBvYmplY3QsIGFuZCB5b3UgY291bGQgZG8gc29tZSBvZGQgdGhpbmdzIGJhdGNoaW5nCiAgICAgICAgICAgIC8vIHBhdGhzLCBlLmcuIHsnZm9vLmJhcic6IHsuLi59LCAnZm9vJzogbnVsbH0KICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHByb3BzW3BhdGhdLCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcnNgIHNvIHRoYXQgcHJvcGVydHkgYWNjZXNzb3IKICAgICAgICogc2lkZSBlZmZlY3RzIGFyZSBub3QgZW5hYmxlZCB1bnRpbCBhZnRlciBjbGllbnQgZG9tIGlzIGZ1bGx5IHJlYWR5LgogICAgICAgKiBBbHNvIGNhbGxzIGBfZmx1c2hDbGllbnRzYCBjYWxsYmFjayB0byBlbnN1cmUgY2xpZW50IGRvbSBpcyBlbmFibGVkCiAgICAgICAqIHRoYXQgd2FzIG5vdCBlbmFibGVkIGFzIGEgcmVzdWx0IG9mIGZsdXNoaW5nIHByb3BlcnRpZXMuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgYHN1cGVyLnJlYWR5KClgIGlzIG5vdCBjYWxsZWQgaGVyZSBhcyBpdAogICAgICAgIC8vIGltbWVkaWF0ZWx5IHR1cm5zIG9uIGFjY2Vzc29ycy4gSW5zdGVhZCwgd2Ugd2FpdCB1bnRpbCBgcmVhZHlDbGllbnRzYAogICAgICAgIC8vIHRvIGVuYWJsZSBhY2Nlc3NvcnMgdG8gcHJvdmlkZSBhIGd1YXJhbnRlZSB0aGF0IGNsaWVudHMgYXJlIHJlYWR5CiAgICAgICAgLy8gYmVmb3JlIHByb2Nlc3NpbmcgYW55IGFjY2Vzc29ycyBzaWRlIGVmZmVjdHMuCiAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gSWYgbm8gZGF0YSB3YXMgcGVuZGluZywgYF9mbHVzaFByb3BlcnRpZXNgIHdpbGwgbm90IGBmbHVzaENsaWVudHNgCiAgICAgICAgLy8gc28gZW5zdXJlIHRoaXMgaXMgZG9uZS4KICAgICAgICBpZiAoIXRoaXMuX19kYXRhQ2xpZW50c1JlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICB9CiAgICAgICAgLy8gQmVmb3JlIHJlYWR5LCBjbGllbnQgbm90aWZpY2F0aW9ucyBkbyBub3QgdHJpZ2dlciBfZmx1c2hQcm9wZXJ0aWVzLgogICAgICAgIC8vIFRoZXJlZm9yZSBhIGZsdXNoIGlzIG5lY2Vzc2FyeSBoZXJlIGlmIGRhdGEgaGFzIGJlZW4gc2V0LgogICAgICAgIGlmICh0aGlzLl9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5QWNjZXNzb3JzYCdzIHByb3BlcnRpZXMgY2hhbmdlZCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogUnVucyBlYWNoIGNsYXNzIG9mIGVmZmVjdHMgZm9yIHRoZSBiYXRjaCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgaW4KICAgICAgICogYSBzcGVjaWZpYyBvcmRlciAoY29tcHV0ZSwgcHJvcGFnYXRlLCByZWZsZWN0LCBvYnNlcnZlLCBub3RpZnkpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGN1cnJlbnRQcm9wcyBCYWcgb2YgYWxsIGN1cnJlbnQgYWNjZXNzb3IgdmFsdWVzCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgZWFjaCBwcm9wZXJ0eQogICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcHJvcGVydGllc0NoYW5nZWQoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vIGxldCBjID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY2hhbmdlZFByb3BzIHx8IHt9KTsKICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gaWYgKHdpbmRvdy5kZWJ1ZykgeyBkZWJ1Z2dlcjsgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBsZXQgaGFzUGF0aHMgPSB0aGlzLl9fZGF0YUhhc1BhdGhzOwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHMgPSBmYWxzZTsKICAgICAgICAvLyBDb21wdXRlIHByb3BlcnRpZXMKICAgICAgICBydW5Db21wdXRlZEVmZmVjdHModGhpcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIENsZWFyIG5vdGlmeSBwcm9wZXJ0aWVzIHByaW9yIHRvIHBvc3NpYmxlIHJlZW50cnkgKHByb3BhZ2F0ZSwgb2JzZXJ2ZSksCiAgICAgICAgLy8gYnV0IGFmdGVyIGNvbXB1dGluZyBlZmZlY3RzIGhhdmUgYSBjaGFuY2UgdG8gYWRkIHRvIHRoZW0KICAgICAgICBsZXQgbm90aWZ5UHJvcHMgPSB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnkgPSBudWxsOwogICAgICAgIC8vIFByb3BhZ2F0ZSBwcm9wZXJ0aWVzIHRvIGNsaWVudHMKICAgICAgICB0aGlzLl9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIEZsdXNoIGNsaWVudHMKICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICAvLyBSZWZsZWN0IHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUkVGTEVDVF0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBPYnNlcnZlIHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuT0JTRVJWRV0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBOb3RpZnkgcHJvcGVydGllcyB0byBob3N0CiAgICAgICAgaWYgKG5vdGlmeVByb3BzKSB7CiAgICAgICAgICBydW5Ob3RpZnlFZmZlY3RzKHRoaXMsIG5vdGlmeVByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIHRlbXBvcmFyeSBjYWNoZSBhdCBlbmQgb2YgdHVybgogICAgICAgIGlmICh0aGlzLl9fZGF0YUNvdW50ZXIgPT0gMSkgewogICAgICAgICAgdGhpcy5fX2RhdGFUZW1wID0ge307CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cEVuZCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHByb3BhZ2F0ZSBhbnkgcHJvcGVydHkgY2hhbmdlcyB0byBzdGFtcGVkIHRlbXBsYXRlIG5vZGVzCiAgICAgICAqIG1hbmFnZWQgYnkgdGhpcyBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgICAgICBpZiAodGhpc1tUWVBFUy5QUk9QQUdBVEVdKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUFJPUEFHQVRFXSwgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgICB3aGlsZSAodGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsCiAgICAgICAgICAgIGhhc1BhdGhzLCB0ZW1wbGF0ZUluZm8ubm9kZUxpc3QpOwogICAgICAgICAgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm87CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQWxpYXNlcyBvbmUgZGF0YSBwYXRoIGFzIGFub3RoZXIsIHN1Y2ggdGhhdCBwYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSBvbmUKICAgICAgICogYXJlIHJvdXRlZCB0byB0aGUgb3RoZXIuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSB0byBUYXJnZXQgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gZnJvbSBTb3VyY2UgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBsaW5rUGF0aHModG8sIGZyb20pIHsKICAgICAgICB0byA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUodG8pOwogICAgICAgIGZyb20gPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKGZyb20pOwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzIHx8IHt9OwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHNbdG9dID0gZnJvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYSBkYXRhIHBhdGggYWxpYXMgcHJldmlvdXNseSBlc3RhYmxpc2hlZCB3aXRoIGBfbGlua1BhdGhzYC4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhlIHBhdGggdG8gdW5saW5rIHNob3VsZCBiZSB0aGUgdGFyZ2V0IChgdG9gKSB1c2VkIHdoZW4KICAgICAgICogbGlua2luZyB0aGUgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFRhcmdldCBwYXRoIHRvIHVubGluay4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgdW5saW5rUGF0aHMocGF0aCkgewogICAgICAgIHBhdGggPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKHBhdGgpOwogICAgICAgIGlmICh0aGlzLl9fZGF0YUxpbmtlZFBhdGhzKSB7CiAgICAgICAgICBkZWxldGUgdGhpcy5fX2RhdGFMaW5rZWRQYXRoc1twYXRoXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOb3RpZnkgdGhhdCBhbiBhcnJheSBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbXMgPSBbIHtuYW1lOiAnSmltJ30sIHtuYW1lOiAnVG9kZCd9LCB7bmFtZTogJ0JpbGwnfSBdOwogICAgICAgKiAgICAgLi4uCiAgICAgICAqICAgICB0aGlzLml0ZW1zLnNwbGljZSgxLCAxLCB7bmFtZTogJ1NhbSd9KTsKICAgICAgICogICAgIHRoaXMuaXRlbXMucHVzaCh7bmFtZTogJ0JvYid9KTsKICAgICAgICogICAgIHRoaXMubm90aWZ5U3BsaWNlcygnaXRlbXMnLCBbCiAgICAgICAqICAgICAgIHsgaW5kZXg6IDEsIHJlbW92ZWQ6IFt7bmFtZTogJ1RvZGQnfV0sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZScgfSwKICAgICAgICogICAgICAgeyBpbmRleDogMywgcmVtb3ZlZDogW10sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZSd9CiAgICAgICAqICAgICBdKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHtBcnJheX0gc3BsaWNlcyBBcnJheSBvZiBzcGxpY2UgcmVjb3JkcyBpbmRpY2F0aW5nIG9yZGVyZWQKICAgICAgICogICBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQgdG8gdGhlIGFycmF5LiBFYWNoIHJlY29yZCBzaG91bGQgaGF2ZSB0aGUKICAgICAgICogICBmb2xsb3dpbmcgZmllbGRzOgogICAgICAgKiAgICAqIGluZGV4OiBpbmRleCBhdCB3aGljaCB0aGUgY2hhbmdlIG9jY3VycmVkCiAgICAgICAqICAgICogcmVtb3ZlZDogYXJyYXkgb2YgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGlzIGluZGV4CiAgICAgICAqICAgICogYWRkZWRDb3VudDogbnVtYmVyIG9mIG5ldyBpdGVtcyBhZGRlZCBhdCB0aGlzIGluZGV4CiAgICAgICAqICAgICogb2JqZWN0OiBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgaW4gcXVlc3Rpb24KICAgICAgICogICAgKiB0eXBlOiB0aGUgc3RyaW5nIGxpdGVyYWwgJ3NwbGljZScKICAgICAgICoKICAgICAgICogICBOb3RlIHRoYXQgc3BsaWNlIHJlY29yZHMgX211c3RfIGJlIG5vcm1hbGl6ZWQgc3VjaCB0aGF0IHRoZXkgYXJlCiAgICAgICAqICAgcmVwb3J0ZWQgaW4gaW5kZXggb3JkZXIgKHJhdyByZXN1bHRzIGZyb20gYE9iamVjdC5vYnNlcnZlYCBhcmUgbm90CiAgICAgICAqICAgb3JkZXJlZCBhbmQgbXVzdCBiZSBub3JtYWxpemVkL21lcmdlZCBiZWZvcmUgbm90aWZ5aW5nKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlTcGxpY2VzKHBhdGgsIHNwbGljZXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbm90aWZ5U3BsaWNlcyh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzcGxpY2VzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgcmVhZGluZyBhIHZhbHVlIGZyb20gYSBwYXRoLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiBhbnkgcGFydCBpbiB0aGUgcGF0aCBpcyB1bmRlZmluZWQsIHRoaXMgbWV0aG9kIHJldHVybnMKICAgICAgICogYHVuZGVmaW5lZGAgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4gZGVyZWZlcmVuY2luZyB1bmRlZmluZWQKICAgICAgICogcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gcmVhZC4gIFRoZSBwYXRoIG1heSBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKGUuZy4gYGZvby5iYXIuYmF6YCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgdXNlcnMuMTIubmFtZWAgb3IgYFsndXNlcnMnLCAxMiwgJ25hbWUnXWApLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHJvb3QgUm9vdCBvYmplY3QgZnJvbSB3aGljaCB0aGUgcGF0aCBpcyBldmFsdWF0ZWQuCiAgICAgICAqIEByZXR1cm4geyp9IFZhbHVlIGF0IHRoZSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aAogICAgICAgKiAgIGlzIHVuZGVmaW5lZC4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgZ2V0KHBhdGgsIHJvb3QpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5QYXRoLmdldChyb290IHx8IHRoaXMsIHBhdGgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgdmFsdWUgdG8gYSBwYXRoIGFuZCBub3RpZnlpbmcgYW55CiAgICAgICAqIGVsZW1lbnRzIGJvdW5kIHRvIHRoZSBzYW1lIHBhdGguCiAgICAgICAqCiAgICAgICAqIE5vdGUsIGlmIGFueSBwYXJ0IGluIHRoZSBwYXRoIGV4Y2VwdCBmb3IgdGhlIGxhc3QgaXMgdW5kZWZpbmVkLAogICAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4KICAgICAgICogZGVyZWZlcmVuY2luZyB1bmRlZmluZWQgcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gd3JpdGUuICBUaGUgcGF0aCBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChlLmcuIGAnZm9vLmJhci5iYXonYCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgJ3VzZXJzLjEyLm5hbWUnYCBvciBgWyd1c2VycycsIDEyLCAnbmFtZSddYCkuCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSByb290IFJvb3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHBhdGggaXMgZXZhbHVhdGVkLgogICAgICAgKiAgIFdoZW4gc3BlY2lmaWVkLCBubyBub3RpZmljYXRpb24gd2lsbCBvY2N1ci4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBzZXQocGF0aCwgdmFsdWUsIHJvb3QpIHsKICAgICAgICBpZiAocm9vdCkgewogICAgICAgICAgUG9seW1lci5QYXRoLnNldChyb290LCBwYXRoLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghdGhpc1tUWVBFUy5SRUFEX09OTFldIHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV1bLyoqIEB0eXBlIHtzdHJpbmd9ICovKHBhdGgpXSkgewogICAgICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCB0cnVlKSkgewogICAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGl0ZW1zIG9udG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wdXNoYC4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgb3RoZXIgcGF0aHMgdG8gdGhlIHNhbWUgYXJyYXkgdGhhdCBhCiAgICAgICAqIHNwbGljZSBvY2N1cnJlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gYXJyYXkuCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gaXRlbXMgSXRlbXMgdG8gcHVzaCBvbnRvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHB1c2gocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0qLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgbGVuID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wdXNoKC4uLml0ZW1zKTsKICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgbGVuLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wb3BgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHJldHVybiB7Kn0gSXRlbSB0aGF0IHdhcyByZW1vdmVkLgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBwb3AocGF0aCkgewogICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICBsZXQgYXJyYXkgPSAvKiogQHR5cGUge0FycmF5fSAqLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgaGFkTGVuZ3RoID0gQm9vbGVhbihhcnJheS5sZW5ndGgpOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wb3AoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgYXJyYXkubGVuZ3RoLCAwLCBbcmV0XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdGFydGluZyBmcm9tIHRoZSBzdGFydCBpbmRleCBzcGVjaWZpZWQsIHJlbW92ZXMgMCBvciBtb3JlIGl0ZW1zCiAgICAgICAqIGZyb20gdGhlIGFycmF5IGFuZCBpbnNlcnRzIDAgb3IgbW9yZSBuZXcgaXRlbXMgaW4gdGhlaXIgcGxhY2UuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgSW5kZXggZnJvbSB3aGljaCB0byBzdGFydCByZW1vdmluZy9pbnNlcnRpbmcuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxldGVDb3VudCBOdW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlLgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbnRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgcmVtb3ZlZCBpdGVtcy4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgc3BsaWNlKHBhdGgsIHN0YXJ0LCBkZWxldGVDb3VudCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoIDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIC8vIE5vcm1hbGl6ZSBmYW5jeSBuYXRpdmUgc3BsaWNlIGhhbmRsaW5nIG9mIGNyYXp5IHN0YXJ0IHZhbHVlcwogICAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICAgIHN0YXJ0ID0gYXJyYXkubGVuZ3RoIC0gTWF0aC5mbG9vcigtc3RhcnQpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhcnQpIHsKICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCk7CiAgICAgICAgfQogICAgICAgIC8vIGFycmF5LnNwbGljZSBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKICAgICAgICAvLyB5b3UgcGFzcyBpbi4gVGhlcmVmb3JlLCBhcnJheS5zcGxpY2UoMCkgYW5kIGFycmF5LnNwbGljZSgwLCB1bmRlZmluZWQpCiAgICAgICAgLy8gZG8gZGlmZmVyZW50IHRoaW5ncy4gSW4gdGhlIGZvcm1lciwgdGhlIHdob2xlIGFycmF5IGlzIGNsZWFyZWQuIEluIHRoZQogICAgICAgIC8vIGxhdHRlciwgbm8gaXRlbXMgYXJlIHJlbW92ZWQuCiAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZGV0ZWN0IHdoZXRoZXIgMS4gb25lIG9mIHRoZSBhcmd1bWVudHMKICAgICAgICAvLyBpcyBhY3R1YWxseSBwYXNzZWQgaW4gYW5kIHRoZW4gMi4gZGV0ZXJtaW5lIGhvdyBtYW55IGFyZ3VtZW50cwogICAgICAgIC8vIHdlIHNob3VsZCBwYXNzIG9uIHRvIHRoZSBuYXRpdmUgYXJyYXkuc3BsaWNlCiAgICAgICAgLy8KICAgICAgICBsZXQgcmV0OwogICAgICAgIC8vIE9taXQgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGlmIHRoZXkgd2VyZSBub3QgcGFzc2VkIGluCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIHJldCA9IGFycmF5LnNwbGljZShzdGFydCk7CiAgICAgICAgLy8gRWl0aGVyIHN0YXJ0IHdhcyB1bmRlZmluZWQgYW5kIHRoZSBvdGhlcnMgd2VyZSBkZWZpbmVkLCBidXQgaW4gdGhpcwogICAgICAgIC8vIGNhc2Ugd2UgY2FuIHNhZmVseSBwYXNzIG9uIGFsbCBhcmd1bWVudHMKICAgICAgICAvLwogICAgICAgIC8vIE5vdGU6IHRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbm9uZSBvZiB0aGUgYXJndW1lbnRzIHdlcmUgcGFzc2VkIGluLAogICAgICAgIC8vIGUuZy4gdGhpcy5zcGxpY2UoJ2FycmF5JykuIEhvd2V2ZXIsIGlmIGJvdGggc3RhcnQgYW5kIGRlbGV0ZUNvdW50CiAgICAgICAgLy8gYXJlIHVuZGVmaW5lZCwgYXJyYXkuc3BsaWNlIHdpbGwgbm90IG1vZGlmeSB0aGUgYXJyYXkgKGFzIGV4cGVjdGVkKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5pdGVtcyk7CiAgICAgICAgfQogICAgICAgIC8vIEF0IHRoZSBlbmQsIGNoZWNrIHdoZXRoZXIgYW55IGl0ZW1zIHdlcmUgcGFzc2VkIGluIChlLmcuIGluc2VydGlvbnMpCiAgICAgICAgLy8gb3IgaWYgdGhlIHJldHVybiBhcnJheSBjb250YWlucyBpdGVtcyAoZS5nLiBkZWxldGlvbnMpLgogICAgICAgIC8vIE9ubHkgbm90aWZ5IGlmIGl0ZW1zIHdlcmUgYWRkZWQgb3IgZGVsZXRlZC4KICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIHx8IHJldC5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzdGFydCwgaXRlbXMubGVuZ3RoLCByZXQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSBhdCB0aGUgcGF0aCBzcGVjaWZpZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnBvcGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIHRoYXQgd2FzIHJlbW92ZWQuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNoaWZ0KHBhdGgpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IGhhZExlbmd0aCA9IEJvb2xlYW4oYXJyYXkubGVuZ3RoKTsKICAgICAgICBsZXQgcmV0ID0gYXJyYXkuc2hpZnQoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgMCwgMCwgW3JldF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQWRkcyBpdGVtcyBvbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICoKICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucHVzaGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbmZvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHVuc2hpZnQocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IHJldCA9IGFycmF5LnVuc2hpZnQoLi4uaXRlbXMpOwogICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCAwLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5vdGlmeSB0aGF0IGEgcGF0aCBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbS51c2VyLm5hbWUgPSAnQm9iJzsKICAgICAgICogICAgIHRoaXMubm90aWZ5UGF0aCgnaXRlbS51c2VyLm5hbWUnKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHsqPX0gdmFsdWUgVmFsdWUgYXQgdGhlIHBhdGggKG9wdGlvbmFsKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlQYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgbGV0IHByb3BQYXRoOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIEdldCB2YWx1ZSBpZiBub3Qgc3VwcGxpZWQKICAgICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICAgIHZhbHVlID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKTsKICAgICAgICAgIHByb3BQYXRoID0gaW5mby5wYXRoOwogICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggaWYgbmVlZGVkCiAgICAgICAgICBwcm9wUGF0aCA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUocGF0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByb3BQYXRoID0gLyoqIEB0eXBle3N0cmluZ30gKi8ocGF0aCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcFBhdGgsIHZhbHVlLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eWAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHByb3RlY3RlZFNldHRlciBDcmVhdGVzIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIKICAgICAgICogICB3aGVuIGB0cnVlYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcikgewogICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIGlmIChwcm90ZWN0ZWRTZXR0ZXIpIHsKICAgICAgICAgIHRoaXNbJ19zZXQnICsgdXBwZXIocHJvcGVydHkpXSA9IC8qKiBAdGhpcyB7UHJvcGVydHlFZmZlY3RzfSAqL2Z1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oKiwqKX0gbWV0aG9kIEZ1bmN0aW9uIG9yIG5hbWUgb2Ygb2JzZXJ2ZXIgbWV0aG9kIHRvIGNhbGwKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZHluYW1pY0ZuIFdoZXRoZXIgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBhcwogICAgICAgKiAgIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pIHsKICAgICAgICBsZXQgaW5mbyA9IHsgcHJvcGVydHksIG1ldGhvZCwgZHluYW1pY0ZuOiBCb29sZWFuKGR5bmFtaWNGbikgfTsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuT0JTRVJWRSwgewogICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogcHJvcGVydHl9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGR5bmFtaWNGbikgewogICAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QoLyoqIEB0eXBlIHtzdHJpbmd9ICovKG1ldGhvZCksIFRZUEVTLk9CU0VSVkUsIHsKICAgICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogbWV0aG9kfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZU1ldGhvZE9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgb2JzZXJ2ZXIgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5PQlNFUlZFLCBydW5NZXRob2RFZmZlY3QsIG51bGwsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlTm90aWZ5aW5nUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuTk9USUZZLCB7CiAgICAgICAgICBmbjogcnVuTm90aWZ5RWZmZWN0LAogICAgICAgICAgaW5mbzogewogICAgICAgICAgICBldmVudE5hbWU6IENhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KSArICctY2hhbmdlZCcsCiAgICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgbGV0IGF0dHIgPSB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgaWYgKGF0dHJbMF0gPT09ICctJykgewogICAgICAgICAgY29uc29sZS53YXJuKCdQcm9wZXJ0eSAnICsgcHJvcGVydHkgKyAnIGNhbm5vdCBiZSByZWZsZWN0ZWQgdG8gYXR0cmlidXRlICcgKwogICAgICAgICAgICBhdHRyICsgJyBiZWNhdXNlICItIiBpcyBub3QgYSB2YWxpZCBzdGFydGluZyBhdHRyaWJ1dGUgbmFtZS4gVXNlIGEgbG93ZXJjYXNlIGZpcnN0IGxldHRlciBmb3IgdGhlIHByb3BlcnR5IGluc3RlYWQuJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUZMRUNULCB7CiAgICAgICAgICAgIGZuOiBydW5SZWZsZWN0RWZmZWN0LAogICAgICAgICAgICBpbmZvOiB7CiAgICAgICAgICAgICAgYXR0ck5hbWU6IGF0dHIKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZUNvbXB1dGVkUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgY29tcHV0ZWQgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5DT01QVVRFLCBydW5Db21wdXRlZEVmZmVjdCwgcHJvcGVydHksIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBHYXRoZXIgdGhlIGFyZ3VtZW50IHZhbHVlcyBmb3IgYSBtZXRob2Qgc3BlY2lmaWVkIGluIHRoZSBwcm92aWRlZCBhcnJheQogICAgICAgKiBvZiBhcmd1bWVudCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGhlIGBwYXRoYCBhbmQgYHZhbHVlYCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gZmlsbCBpbiB3aWxkY2FyZCBkZXNjcmlwdG9yCiAgICAgICAqIHdoZW4gdGhlIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYXMgYSByZXN1bHQgb2YgYSBwYXRoIG5vdGlmaWNhdGlvbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshQXJyYXk8IU1ldGhvZEFyZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgbWV0YWRhdGEKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUHJvcGVydHkvcGF0aCBuYW1lIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXRob2QgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEByZXR1cm4ge0FycmF5PCo+fSBBcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9tYXJzaGFsQXJncyhhcmdzLCBwYXRoLCBwcm9wcykgewogICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9fZGF0YTsKICAgICAgICBsZXQgdmFsdWVzID0gW107CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPWFyZ3MubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgbGV0IGFyZyA9IGFyZ3NbaV07CiAgICAgICAgICBsZXQgbmFtZSA9IGFyZy5uYW1lOwogICAgICAgICAgbGV0IHY7CiAgICAgICAgICBpZiAoYXJnLmxpdGVyYWwpIHsKICAgICAgICAgICAgdiA9IGFyZy52YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhcmcuc3RydWN0dXJlZCkgewogICAgICAgICAgICAgIHYgPSBQb2x5bWVyLlBhdGguZ2V0KGRhdGEsIG5hbWUpOwogICAgICAgICAgICAgIC8vIHdoZW4gZGF0YSBpcyBub3Qgc3RvcmVkIGUuZy4gYHNwbGljZXNgCiAgICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdiA9IHByb3BzW25hbWVdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2ID0gZGF0YVtuYW1lXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGFyZy53aWxkY2FyZCkgewogICAgICAgICAgICAvLyBPbmx5IHNlbmQgdGhlIGFjdHVhbCBwYXRoIGNoYW5nZWQgaW5mbyBpZiB0aGUgY2hhbmdlIHRoYXQKICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSBvYnNlcnZlciB0byBydW4gbWF0Y2hlZCB0aGUgd2lsZGNhcmQKICAgICAgICAgICAgbGV0IGJhc2VDaGFuZ2VkID0gKG5hbWUuaW5kZXhPZihwYXRoICsgJy4nKSA9PT0gMCk7CiAgICAgICAgICAgIGxldCBtYXRjaGVzID0gKHBhdGguaW5kZXhPZihuYW1lKSA9PT0gMCAmJiAhYmFzZUNoYW5nZWQpOwogICAgICAgICAgICB2YWx1ZXNbaV0gPSB7CiAgICAgICAgICAgICAgcGF0aDogbWF0Y2hlcyA/IHBhdGggOiBuYW1lLAogICAgICAgICAgICAgIHZhbHVlOiBtYXRjaGVzID8gcHJvcHNbcGF0aF0gOiB2LAogICAgICAgICAgICAgIGJhc2U6IHYKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgIH0KCiAgICAgIC8vIC0tIHN0YXRpYyBjbGFzcyBtZXRob2RzIC0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVuc3VyZXMgYW4gYWNjZXNzb3IgZXhpc3RzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LCBhbmQgYWRkcwogICAgICAgKiB0byBhIGxpc3Qgb2YgInByb3BlcnR5IGVmZmVjdHMiIHRoYXQgd2lsbCBydW4gd2hlbiB0aGUgYWNjZXNzb3IgZm9yCiAgICAgICAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgc2V0LiAgRWZmZWN0cyBhcmUgZ3JvdXBlZCBieSAidHlwZSIsIHdoaWNoCiAgICAgICAqIHJvdWdobHkgY29ycmVzcG9uZHMgdG8gYSBwaGFzZSBpbiBlZmZlY3QgcHJvY2Vzc2luZy4gIFRoZSBlZmZlY3QKICAgICAgICogbWV0YWRhdGEgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybToKICAgICAgICoKICAgICAgICogICAgIHsKICAgICAgICogICAgICAgZm46IGVmZmVjdEZ1bmN0aW9uLCAvLyBSZWZlcmVuY2UgdG8gZnVuY3Rpb24gdG8gY2FsbCB0byBwZXJmb3JtIGVmZmVjdAogICAgICAgKiAgICAgICBpbmZvOiB7IC4uLiB9ICAgICAgIC8vIEVmZmVjdCBtZXRhZGF0YSBwYXNzZWQgdG8gZnVuY3Rpb24KICAgICAgICogICAgICAgdHJpZ2dlcjogeyAgICAgICAgICAvLyBPcHRpb25hbCB0cmlnZ2VyaW5nIG1ldGFkYXRhOyBpZiBub3QgcHJvdmlkZWQKICAgICAgICogICAgICAgICBuYW1lOiBzdHJpbmcgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgdHJlYXRlZCBhcyBhIHdpbGRjYXJkCiAgICAgICAqICAgICAgICAgc3RydWN0dXJlZDogYm9vbGVhbgogICAgICAgKiAgICAgICAgIHdpbGRjYXJkOiBib29sZWFuCiAgICAgICAqICAgICAgIH0KICAgICAgICogICAgIH0KICAgICAgICoKICAgICAgICogRWZmZWN0cyBhcmUgY2FsbGVkIGZyb20gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBieQogICAgICAgKiB0eXBlOgogICAgICAgKgogICAgICAgKiAxLiBDT01QVVRFCiAgICAgICAqIDIuIFBST1BBR0FURQogICAgICAgKiAzLiBSRUZMRUNUCiAgICAgICAqIDQuIE9CU0VSVkUKICAgICAgICogNS4gTk9USUZZCiAgICAgICAqCiAgICAgICAqIEVmZmVjdCBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgogICAgICAgKgogICAgICAgKiAgICAgZWZmZWN0RnVuY3Rpb24oaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBpbmZvLCBoYXNQYXRocykKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBhZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCB0eXBlLCBlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIHNpbmdsZS1wcm9wZXJ0eSBvYnNlcnZlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbigqLCopfSBtZXRob2QgRnVuY3Rpb24gb3IgbmFtZSBvZiBvYnNlcnZlciBtZXRob2QgdG8gY2FsbAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBkeW5hbWljRm4gV2hldGhlciB0aGUgbWV0aG9kIG5hbWUgc2hvdWxkIGJlIGluY2x1ZGVkIGFzCiAgICAgICAqICAgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgbXVsdGktcHJvcGVydHkgIm1ldGhvZCBvYnNlcnZlciIgYmFzZWQgb24gdGhlIHByb3ZpZGVkCiAgICAgICAqIGV4cHJlc3Npb24sIHdoaWNoIHNob3VsZCBiZSBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiBhIG5vcm1hbCBKYXZhU2NyaXB0CiAgICAgICAqIGZ1bmN0aW9uIHNpZ25hdHVyZTogYCdtZXRob2ROYW1lKGFyZzEsIFsuLi4sIGFyZ25dKSdgLiAgRWFjaCBhcmd1bWVudAogICAgICAgKiBzaG91bGQgY29ycmVzcG9uZCB0byBhIHByb3BlcnR5IG9yIHBhdGggaW4gdGhlIGNvbnRleHQgb2YgdGhpcwogICAgICAgKiBwcm90b3R5cGUgKG9yIGluc3RhbmNlKSwgb3IgbWF5IGJlIGEgbGl0ZXJhbCBzdHJpbmcgb3IgbnVtYmVyLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBNZXRob2QgZXhwcmVzc2lvbgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW58T2JqZWN0PX0gZHluYW1pY0ZuIEJvb2xlYW4gb3Igb2JqZWN0IG1hcCBpbmRpY2F0aW5nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqICAgd2hldGhlciBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlTWV0aG9kT2JzZXJ2ZXIoZXhwcmVzc2lvbiwgZHluYW1pY0ZuKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIGRpc3BhdGNoIGA8cHJvcGVydHk+LWNoYW5nZWRgCiAgICAgICAqIGV2ZW50cyB0byBub3RpZnkgb2YgY2hhbmdlcyB0byB0aGUgcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIFRvIHNldCB0aGUgcHJvcGVydHksIHVzZSB0aGUgcHJvdGVjdGVkIGBfc2V0UHJvcGVydHlgIEFQSS4KICAgICAgICogVG8gY3JlYXRlIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIgKGUuZy4gYF9zZXRNeVByb3AoKWAgZm9yCiAgICAgICAqIHByb3BlcnR5IGBteVByb3BgKSwgcGFzcyBgdHJ1ZWAgZm9yIGBwcm90ZWN0ZWRTZXR0ZXJgLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiB0aGUgcHJvcGVydHkgd2lsbCBoYXZlIG90aGVyIHByb3BlcnR5IGVmZmVjdHMsIHRoaXMgbWV0aG9kCiAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhZGRpbmcgb3RoZXIgZWZmZWN0cy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcHJvdGVjdGVkU2V0dGVyIENyZWF0ZXMgYSBjdXN0b20gcHJvdGVjdGVkIHNldHRlcgogICAgICAgKiAgIHdoZW4gYHRydWVgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShwcm9wZXJ0eSwgcHJvdGVjdGVkU2V0dGVyKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIHJlZmxlY3QgdGhlIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIHRvIGEgKGRhc2gtY2FzZWQpIGF0dHJpYnV0ZSBvZiB0aGUgc2FtZSBuYW1lLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIHNldCB0byB0aGUgcmVzdWx0IG9mIHRoZQogICAgICAgKiBtZXRob2QgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBgZXhwcmVzc2lvbmAgZWFjaCB0aW1lIG9uZSBvciBtb3JlCiAgICAgICAqIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kIGNoYW5nZXMuICBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgYSBzdHJpbmcKICAgICAgICogaW4gdGhlIGZvcm0gb2YgYSBub3JtYWwgSmF2YVNjcmlwdCBmdW5jdGlvbiBzaWduYXR1cmU6CiAgICAgICAqIGAnbWV0aG9kTmFtZShhcmcxLCBbLi4uLCBhcmduXSknYAogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICAgICAqICAgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KHByb3BlcnR5LCBleHByZXNzaW9uLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSB0byBlbnN1cmUgYmluZGluZyBlZmZlY3RzIGFyZSBjcmVhdGVkCiAgICAgICAqIGZvciB0aGVtLCBhbmQgdGhlbiBlbnN1cmVzIHByb3BlcnR5IGFjY2Vzc29ycyBhcmUgY3JlYXRlZCBmb3IgYW55CiAgICAgICAqIGRlcGVuZGVudCBwcm9wZXJ0aWVzIGluIHRoZSB0ZW1wbGF0ZS4gIEJpbmRpbmcgZWZmZWN0cyBmb3IgYm91bmQKICAgICAgICogdGVtcGxhdGVzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBvbiB0aGUgaW5zdGFuY2Ugc28gdGhhdAogICAgICAgKiB0ZW1wbGF0ZXMgY2FuIGJlIGVmZmljaWVudGx5IHN0YW1wZWQgYW5kIHVuc3RhbXBlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgY29udGFpbmluZyBiaW5kaW5nCiAgICAgICAqICAgYmluZGluZ3MKICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBiaW5kVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgIH0KCiAgICAgIC8vIC0tIGJpbmRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBiaW5kVGVtcGxhdGVgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG9uIHRoZSBwcm90b3R5cGUgKGZvciBwcm90b3R5cGljYWwgdGVtcGxhdGUKICAgICAgICogYmluZGluZywgdG8gYXZvaWQgY3JlYXRpbmcgYWNjZXNzb3JzIGV2ZXJ5IGluc3RhbmNlKSBvbmNlIHBlciBwcm90b3R5cGUsCiAgICAgICAqIGFuZCB3aWxsIGJlIGNhbGxlZCB3aXRoIGBydW50aW1lQmluZGluZzogdHJ1ZWAgYnkgYF9zdGFtcFRlbXBsYXRlYCB0bwogICAgICAgKiBjcmVhdGUgYW5kIGxpbmsgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhCiAgICAgICAqIHBhcnRpY3VsYXIgc3RhbXBpbmcuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIGNvbnRhaW5pbmcgYmluZGluZwogICAgICAgKiAgIGJpbmRpbmdzCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGluc3RhbmNlQmluZGluZyBXaGVuIGZhbHNlIChkZWZhdWx0KSwgcGVyZm9ybXMKICAgICAgICogICAicHJvdG90eXBpY2FsIiBiaW5kaW5nIG9mIHRoZSB0ZW1wbGF0ZSBhbmQgb3ZlcndyaXRlcyBhbnkgcHJldmlvdXNseQogICAgICAgKiAgIGJvdW5kIHRlbXBsYXRlIGZvciB0aGUgY2xhc3MuIFdoZW4gdHJ1ZSAoYXMgcGFzc2VkIGZyb20KICAgICAgICogICBgX3N0YW1wVGVtcGxhdGVgKSwgdGhlIHRlbXBsYXRlIGluZm8gaXMgaW5zdGFuY2VkIGFuZCBsaW5rZWQgaW50bwogICAgICAgKiAgIHRoZSBsaXN0IG9mIGJvdW5kIHRlbXBsYXRlcy4KICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0OyBmb3IgYHJ1bnRpbWVCaW5kaW5nYCwKICAgICAgICogICB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBwcm90b3R5cGljYWwgdGVtcGxhdGUgaW5mbwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfYmluZFRlbXBsYXRlKHRlbXBsYXRlLCBpbnN0YW5jZUJpbmRpbmcpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IHdhc1ByZUJvdW5kID0gdGhpcy5fX3RlbXBsYXRlSW5mbyA9PSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBzaW5jZSB0aGlzIGlzIGNhbGxlZCB0d2ljZSBmb3IgcHJvdG8tYm91bmQgdGVtcGxhdGVzLAogICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gcmVjcmVhdGUgYWNjZXNzb3JzIGlmIHRoaXMgdGVtcGxhdGUgd2FzIHByZS1ib3VuZAogICAgICAgIGlmICghd2FzUHJlQm91bmQpIHsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gdGVtcGxhdGVJbmZvLnByb3BlcnR5RWZmZWN0cykgewogICAgICAgICAgICB0aGlzLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaW5zdGFuY2VCaW5kaW5nKSB7CiAgICAgICAgICAvLyBGb3IgaW5zdGFuY2UtdGltZSBiaW5kaW5nLCBjcmVhdGUgaW5zdGFuY2Ugb2YgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICAgIC8vIGFuZCBsaW5rIGludG8gbGlzdCBvZiB0ZW1wbGF0ZXMgaWYgbmVjZXNzYXJ5CiAgICAgICAgICB0ZW1wbGF0ZUluZm8gPSAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovKE9iamVjdC5jcmVhdGUodGVtcGxhdGVJbmZvKSk7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ud2FzUHJlQm91bmQgPSB3YXNQcmVCb3VuZDsKICAgICAgICAgIGlmICghd2FzUHJlQm91bmQgJiYgdGhpcy5fX3RlbXBsYXRlSW5mbykgewogICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0IHx8IHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgICAgICAgIHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0ID0gbGFzdC5uZXh0VGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8gPSBsYXN0OwogICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVJbmZvOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX3RlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgYSBwcm9wZXJ0eSBlZmZlY3QgdG8gdGhlIGdpdmVuIHRlbXBsYXRlIG1ldGFkYXRhLCB3aGljaCBpcyBydW4KICAgICAgICogYXQgdGhlICJwcm9wYWdhdGUiIHN0YWdlIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHdoZW4gdGhlIHRlbXBsYXRlCiAgICAgICAqIGhhcyBiZWVuIGJvdW5kIHRvIHRoZSBlbGVtZW50IHZpYSBgX2JpbmRUZW1wbGF0ZWAuCiAgICAgICAqCiAgICAgICAqIFRoZSBgZWZmZWN0YCBvYmplY3Qgc2hvdWxkIG1hdGNoIHRoZSBmb3JtYXQgaW4gYF9hZGRQcm9wZXJ0eUVmZmVjdGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgdG8gYWRkIGVmZmVjdCB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCBwcm9wLCBlZmZlY3QpIHsKICAgICAgICBsZXQgaG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgfHwge307CiAgICAgICAgaG9zdFByb3BzW3Byb3BdID0gdHJ1ZTsKICAgICAgICBsZXQgZWZmZWN0cyA9IHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMgPSB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzIHx8IHt9OwogICAgICAgIGxldCBwcm9wRWZmZWN0cyA9IGVmZmVjdHNbcHJvcF0gPSBlZmZlY3RzW3Byb3BdIHx8IFtdOwogICAgICAgIHByb3BFZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFN0YW1wcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgYW5kIHBlcmZvcm1zIGluc3RhbmNlLXRpbWUgc2V0dXAgZm9yCiAgICAgICAqIFBvbHltZXIgdGVtcGxhdGUgZmVhdHVyZXMsIGluY2x1ZGluZyBkYXRhIGJpbmRpbmdzLCBkZWNsYXJhdGl2ZSBldmVudAogICAgICAgKiBsaXN0ZW5lcnMsIGFuZCB0aGUgYHRoaXMuJGAgbWFwIG9mIGBpZGAncyB0byBub2Rlcy4gIEEgZG9jdW1lbnQgZnJhZ21lbnQKICAgICAgICogaXMgcmV0dXJuZWQgY29udGFpbmluZyB0aGUgc3RhbXBlZCBET00sIHJlYWR5IGZvciBpbnNlcnRpb24gaW50byB0aGUKICAgICAgICogRE9NLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlOyBob3dldmVyIG5vdGUgdGhhdCBkdWUgdG8KICAgICAgICogYHNoYWR5Y3NzYCBwb2x5ZmlsbCBsaW1pdGF0aW9ucywgb25seSBzdHlsZXMgZnJvbSB0ZW1wbGF0ZXMgcHJlcGFyZWQKICAgICAgICogdXNpbmcgYFNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZWAgd2lsbCBiZSBjb3JyZWN0bHkgcG9seWZpbGxlZCAoc2NvcGVkCiAgICAgICAqIHRvIHRoZSBzaGFkb3cgcm9vdCBhbmQgc3VwcG9ydCBDU1MgY3VzdG9tIHByb3BlcnRpZXMpLCBhbmQgbm90ZSB0aGF0CiAgICAgICAqIGBTaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVgIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBlbGVtZW50LiBBcyBzdWNoLAogICAgICAgKiBhbnkgc3R5bGVzIHJlcXVpcmVkIGJ5IGluIHJ1bnRpbWUtc3RhbXBlZCB0ZW1wbGF0ZXMgbXVzdCBiZSBpbmNsdWRlZAogICAgICAgKiBpbiB0aGUgbWFpbiBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBFbnN1cmVzIHRoYXQgY3JlYXRlZCBkb20gaXMgYF9lbnF1ZXVlQ2xpZW50YCdkIHRvIHRoaXMgZWxlbWVudCBzbwogICAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIGZsdXNoZWQgb24gbmV4dCBjYWxsIHRvIGBfZmx1c2hQcm9wZXJ0aWVzYAogICAgICAgIGhvc3RTdGFjay5iZWdpbkhvc3RpbmcodGhpcyk7CiAgICAgICAgbGV0IGRvbSA9IHN1cGVyLl9zdGFtcFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICBob3N0U3RhY2suZW5kSG9zdGluZyh0aGlzKTsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLyh0aGlzLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUsIHRydWUpKTsKICAgICAgICAvLyBBZGQgdGVtcGxhdGUtaW5zdGFuY2Utc3BlY2lmaWMgZGF0YSB0byBpbnN0YW5jZWQgdGVtcGxhdGVJbmZvCiAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVMaXN0ID0gZG9tLm5vZGVMaXN0OwogICAgICAgIC8vIENhcHR1cmUgY2hpbGQgbm9kZXMgdG8gYWxsb3cgdW5zdGFtcGluZyBvZiBub24tcHJvdG90eXBpY2FsIHRlbXBsYXRlcwogICAgICAgIGlmICghdGVtcGxhdGVJbmZvLndhc1ByZUJvdW5kKSB7CiAgICAgICAgICBsZXQgbm9kZXMgPSB0ZW1wbGF0ZUluZm8uY2hpbGROb2RlcyA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj1kb20uZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIG5vZGVzLnB1c2gobik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRvbS50ZW1wbGF0ZUluZm8gPSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gU2V0dXAgY29tcG91bmQgc3RvcmFnZSwgMi13YXkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QgZm9yIGJpbmRpbmdzCiAgICAgICAgc2V0dXBCaW5kaW5ncyh0aGlzLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIC8vIEZsdXNoIHByb3BlcnRpZXMgaW50byB0ZW1wbGF0ZSBub2RlcyBpZiBhbHJlYWR5IGJvb3RlZAogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIHRoaXMuX19kYXRhLCBudWxsLAogICAgICAgICAgICBmYWxzZSwgdGVtcGxhdGVJbmZvLm5vZGVMaXN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW5kIHVuYmluZHMgdGhlIG5vZGVzIHByZXZpb3VzbHkgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZAogICAgICAgKiBEb2N1bWVudEZyYWdtZW50IHJldHVybmVkIGZyb20gYF9zdGFtcFRlbXBsYXRlYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshU3RhbXBlZFRlbXBsYXRlfSBkb20gRG9jdW1lbnRGcmFnbWVudCBwcmV2aW91c2x5IHJldHVybmVkCiAgICAgICAqICAgZnJvbSBgX3N0YW1wVGVtcGxhdGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfcmVtb3ZlQm91bmREb20oZG9tKSB7CiAgICAgICAgLy8gVW5saW5rIHRlbXBsYXRlIGluZm8KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gZG9tLnRlbXBsYXRlSW5mbzsKICAgICAgICBpZiAodGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8ubmV4dFRlbXBsYXRlSW5mbyA9CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8pIHsKICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0KICAgICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRlSW5mb0xhc3QgPT0gdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0aGlzLl9fdGVtcGxhdGVJbmZvTGFzdCA9IHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbzsKICAgICAgICB9CiAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8gPSBudWxsOwogICAgICAgIC8vIFJlbW92ZSBzdGFtcGVkIG5vZGVzCiAgICAgICAgbGV0IG5vZGVzID0gdGVtcGxhdGVJbmZvLmNoaWxkTm9kZXM7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogcGFyc2luZyBiaW5kaW5ncyBmcm9tIGBUZXh0Tm9kZWAncycgYHRleHRDb250ZW50YC4gIEEgYGJpbmRpbmdzYAogICAgICAgKiBhcnJheSBpcyBhZGRlZCB0byBgbm9kZUluZm9gIGFuZCBwb3B1bGF0ZWQgd2l0aCBiaW5kaW5nIG1ldGFkYXRhCiAgICAgICAqIHdpdGggaW5mb3JtYXRpb24gY2FwdHVyaW5nIHRoZSBiaW5kaW5nIHRhcmdldCwgYW5kIGEgYHBhcnRzYCBhcnJheQogICAgICAgKiB3aXRoIG9uZSBvciBtb3JlIG1ldGFkYXRhIG9iamVjdHMgY2FwdHVyaW5nIHRoZSBzb3VyY2Uocykgb2YgdGhlCiAgICAgICAqIGJpbmRpbmcuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgbGV0IHBhcnRzID0gdGhpcy5fcGFyc2VCaW5kaW5ncyhub2RlLnRleHRDb250ZW50LCB0ZW1wbGF0ZUluZm8pOwogICAgICAgICAgaWYgKHBhcnRzKSB7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHRDb250ZW50IHdpdGggYW55IGxpdGVyYWwgcGFydHMKICAgICAgICAgICAgLy8gTk9URTogZGVmYXVsdCB0byBhIHNwYWNlIGhlcmUgc28gdGhlIHRleHROb2RlIHJlbWFpbnM7IHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgLy8gKElFKSBvbWl0IGFuIGVtcHR5IHRleHROb2RlIGZvbGxvd2luZyBjbG9uZU5vZGUvaW1wb3J0Tm9kZS4KICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpIHx8ICcgJzsKICAgICAgICAgICAgYWRkQmluZGluZyh0aGlzLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCAndGV4dCcsICd0ZXh0Q29udGVudCcsIHBhcnRzKTsKICAgICAgICAgICAgbm90ZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAqIHBhcnNpbmcgYmluZGluZ3MgZnJvbSBhdHRyaWJ1dGVzLiAgQSBgYmluZGluZ3NgCiAgICAgICAqIGFycmF5IGlzIGFkZGVkIHRvIGBub2RlSW5mb2AgYW5kIHBvcHVsYXRlZCB3aXRoIGJpbmRpbmcgbWV0YWRhdGEKICAgICAgICogd2l0aCBpbmZvcm1hdGlvbiBjYXB0dXJpbmcgdGhlIGJpbmRpbmcgdGFyZ2V0LCBhbmQgYSBgcGFydHNgIGFycmF5CiAgICAgICAqIHdpdGggb25lIG9yIG1vcmUgbWV0YWRhdGEgb2JqZWN0cyBjYXB0dXJpbmcgdGhlIHNvdXJjZShzKSBvZiB0aGUKICAgICAgICogYmluZGluZy4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEF0dHJpYnV0ZSBuYW1lCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpIHsKICAgICAgICBsZXQgcGFydHMgPSB0aGlzLl9wYXJzZUJpbmRpbmdzKHZhbHVlLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIGlmIChwYXJ0cykgewogICAgICAgICAgLy8gQXR0cmlidXRlIG9yIHByb3BlcnR5CiAgICAgICAgICBsZXQgb3JpZ05hbWUgPSBuYW1lOwogICAgICAgICAgbGV0IGtpbmQgPSAncHJvcGVydHknOwogICAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHdlIHNlZSBhIGNhcGl0YWwgbGV0dGVyIGhlcmUgaXMgaWYgdGhlIGF0dHIgaGFzCiAgICAgICAgICAvLyBhIGNhcGl0YWwgbGV0dGVyIGluIGl0IHBlciBzcGVjLiBJbiB0aGlzIGNhc2UsIHRvIG1ha2Ugc3VyZQogICAgICAgICAgLy8gdGhpcyBiaW5kaW5nIHdvcmtzLCB3ZSBnbyBhaGVhZCBhbmQgbWFrZSB0aGUgYmluZGluZyB0byB0aGUgYXR0cmlidXRlLgogICAgICAgICAgaWYgKGNhcGl0YWxBdHRyaWJ1dGVSZWdleC50ZXN0KG5hbWUpKSB7CiAgICAgICAgICAgIGtpbmQgPSAnYXR0cmlidXRlJzsKICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVtuYW1lLmxlbmd0aC0xXSA9PSAnJCcpIHsKICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgLTEpOwogICAgICAgICAgICBraW5kID0gJ2F0dHJpYnV0ZSc7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbml0aWFsaXplIGF0dHJpYnV0ZSBiaW5kaW5ncyB3aXRoIGFueSBsaXRlcmFsIHBhcnRzCiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpOwogICAgICAgICAgaWYgKGxpdGVyYWwgJiYga2luZCA9PSAnYXR0cmlidXRlJykgewogICAgICAgICAgICAvLyBFbnN1cmUgYSBTaGFkeUNTUyB0ZW1wbGF0ZSBzY29wZWQgc3R5bGUgaXMgbm90IHJlbW92ZWQKICAgICAgICAgICAgLy8gd2hlbiBhIGNsYXNzJCBiaW5kaW5nJ3MgaW5pdGlhbCBsaXRlcmFsIHZhbHVlIGlzIHNldC4KICAgICAgICAgICAgaWYgKG5hbWUgPT0gJ2NsYXNzJyAmJiBub2RlLmhhc0F0dHJpYnV0ZSgnY2xhc3MnKSkgewogICAgICAgICAgICAgIGxpdGVyYWwgKz0gJyAnICsgbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgbGl0ZXJhbCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDbGVhciBhdHRyaWJ1dGUgYmVmb3JlIHJlbW92aW5nLCBzaW5jZSBJRSB3b24ndCBhbGxvdyByZW1vdmluZwogICAgICAgICAgLy8gYHZhbHVlYCBhdHRyaWJ1dGUgaWYgaXQgcHJldmlvdXNseSBoYWQgYSB2YWx1ZSAoY2FuJ3QKICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSBzZXQgJycgYmVmb3JlIHJlbW92aW5nIHNpbmNlIGF0dHJpYnV0ZXMgd2l0aCBgJGAKICAgICAgICAgIC8vIGNhbid0IGJlIHNldCB1c2luZyBzZXRBdHRyaWJ1dGUpCiAgICAgICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT09ICdpbnB1dCcgJiYgb3JpZ05hbWUgPT09ICd2YWx1ZScpIHsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUob3JpZ05hbWUsICcnKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFJlbW92ZSBhbm5vdGF0aW9uCiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShvcmlnTmFtZSk7CiAgICAgICAgICAvLyBDYXNlIGhhY2tlcnk6IGF0dHJpYnV0ZXMgYXJlIGxvd2VyLWNhc2UsIGJ1dCBiaW5kIHRhcmdldHMKICAgICAgICAgIC8vIChwcm9wZXJ0aWVzKSBhcmUgY2FzZSBzZW5zaXRpdmUuIEdhbWJpdCBpcyB0byBtYXAgZGFzaC1jYXNlIHRvCiAgICAgICAgICAvLyBjYW1lbC1jYXNlOiBgZm9vLWJhcmAgYmVjb21lcyBgZm9vQmFyYC4KICAgICAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5ncyBhcmUgZXhjZXB0ZWQuCiAgICAgICAgICBpZiAoa2luZCA9PT0gJ3Byb3BlcnR5JykgewogICAgICAgICAgICBuYW1lID0gUG9seW1lci5DYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywga2luZCwgbmFtZSwgcGFydHMsIGxpdGVyYWwpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBzdXBlci5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogYmluZGluZyB0aGUgcHJvcGVydGllcyB0aGF0IGEgbmVzdGVkIHRlbXBsYXRlIGRlcGVuZHMgb24gdG8gdGhlIHRlbXBsYXRlCiAgICAgICAqIGFzIGBfaG9zdF88cHJvcGVydHk+YC4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKTsKICAgICAgICAvLyBNZXJnZSBob3N0IHByb3BzIGludG8gb3V0ZXIgdGVtcGxhdGUgYW5kIGFkZCBiaW5kaW5ncwogICAgICAgIGxldCBob3N0UHJvcHMgPSBub2RlSW5mby50ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgIGxldCBtb2RlID0gJ3snOwogICAgICAgIGZvciAobGV0IHNvdXJjZSBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgIGxldCBwYXJ0cyA9IFt7IG1vZGUsIHNvdXJjZSwgZGVwZW5kZW5jaWVzOiBbc291cmNlXSB9XTsKICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgJ3Byb3BlcnR5JywgJ19ob3N0XycgKyBzb3VyY2UsIHBhcnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHBhcnNlIHRleHQgaW4gYSB0ZW1wbGF0ZSAoZWl0aGVyIGF0dHJpYnV0ZSB2YWx1ZXMgb3IKICAgICAgICogdGV4dENvbnRlbnQpIGludG8gYmluZGluZyBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQW55IG92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIGJpbmRpbmcgcGFydAogICAgICAgKiBtZXRhZGF0YSAgcmVwcmVzZW50aW5nIG9uZSBvciBtb3JlIGJpbmRpbmdzIGZvdW5kIGluIHRoZSBwcm92aWRlZCB0ZXh0CiAgICAgICAqIGFuZCBhbnkgImxpdGVyYWwiIHRleHQgaW4gYmV0d2Vlbi4gIEFueSBub24tbGl0ZXJhbCBwYXJ0cyB3aWxsIGJlIHBhc3NlZAogICAgICAgKiB0byBgX2V2YWx1YXRlQmluZGluZ2Agd2hlbiBhbnkgZGVwZW5kZW5jaWVzIGNoYW5nZS4gIFRoZSBvbmx5IHJlcXVpcmVkCiAgICAgICAqIGZpZWxkcyBvZiBlYWNoICJwYXJ0IiBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgYXJlIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIC0gYGRlcGVuZGVuY2llc2AgLSBBcnJheSBjb250YWluaW5nIHRyaWdnZXIgbWV0YWRhdGEgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICogICB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBiaW5kaW5nIHRvIHVwZGF0ZQogICAgICAgKiAtIGBsaXRlcmFsYCAtIFN0cmluZyBjb250YWluaW5nIHRleHQgaWYgdGhlIHBhcnQgcmVwcmVzZW50cyBhIGxpdGVyYWw7CiAgICAgICAqICAgaW4gdGhpcyBjYXNlIG5vIGBkZXBlbmRlbmNpZXNgIGFyZSBuZWVkZWQKICAgICAgICoKICAgICAgICogQWRkaXRpb25hbCBtZXRhZGF0YSBmb3IgdXNlIGJ5IGBfZXZhbHVhdGVCaW5kaW5nYCBtYXkgYmUgcHJvdmlkZWQgaW4KICAgICAgICogZWFjaCBwYXJ0IG9iamVjdCBhcyBuZWVkZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRsZXMgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBiaW5kaW5ncwogICAgICAgKiAob25lIG9yIG1vcmUgbWF5IGJlIGludGVybWl4ZWQgd2l0aCBsaXRlcmFsIHN0cmluZ3MpOgogICAgICAgKiAtIFByb3BlcnR5IGJpbmRpbmc6IGBbW3Byb3BdXWAKICAgICAgICogLSBQYXRoIGJpbmRpbmc6IGBbW29iamVjdC5wcm9wXV1gCiAgICAgICAqIC0gTmVnYXRlZCBwcm9wZXJ0eSBvciBwYXRoIGJpbmRpbmdzOiBgW1shcHJvcF1dYCBvciBgW1shb2JqZWN0LnByb3BdXWAKICAgICAgICogLSBUd28td2F5IHByb3BlcnR5IG9yIHBhdGggYmluZGluZ3MgKHN1cHBvcnRzIG5lZ2F0aW9uKToKICAgICAgICogICBge3twcm9wfX1gLCBge3tvYmplY3QucHJvcH19YCwgYHt7IXByb3B9fWAgb3IgYHt7IW9iamVjdC5wcm9wfX1gCiAgICAgICAqIC0gSW5saW5lIGNvbXB1dGVkIG1ldGhvZCAoc3VwcG9ydHMgbmVnYXRpb24pOgogICAgICAgKiAgIGBbW2NvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYCwgYFtbIWNvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYAogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBiZXN0CiAgICAgICAqIHBlcmZvcm1hbmNlLiBIb3dldmVyLCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZXMgYSB3aGl0ZS1saXN0IG9mCiAgICAgICAqIGFsbG93ZWQgY2hhcmFjdGVycyBpbiBhIGRhdGEtYmluZGluZywgd2hpY2ggY2F1c2VzIHByb2JsZW1zIGZvcgogICAgICAgKiBkYXRhLWJpbmRpbmdzIHRoYXQgZG8gdXNlIGNoYXJhY3RlcnMgbm90IGluIHRoaXMgd2hpdGUtbGlzdC4KICAgICAgICoKICAgICAgICogSW5zdGVhZCBvZiB1cGRhdGluZyB0aGUgd2hpdGUtbGlzdCB3aXRoIGFsbCBhbGxvd2VkIGNoYXJhY3RlcnMsCiAgICAgICAqIHRoZXJlIGlzIGEgU3RyaWN0QmluZGluZ1BhcnNlciAoc2VlIGxpYi9taXhpbnMvc3RyaWN0LWJpbmRpbmctcGFyc2VyKQogICAgICAgKiB0aGF0IHVzZXMgYSBzdGF0ZSBtYWNoaW5lIGluc3RlYWQuIFRoaXMgc3RhdGUgbWFjaGluZSBpcyBhYmxlIHRvIGhhbmRsZQogICAgICAgKiBhbGwgY2hhcmFjdGVycy4gSG93ZXZlciwgaXQgaXMgc2xpZ2h0bHkgbGVzcyBwZXJmb3JtYW50LCB0aGVyZWZvcmUgd2UKICAgICAgICogZXh0cmFjdGVkIGl0IGludG8gYSBzZXBhcmF0ZSBvcHRpb25hbCBtaXhpbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGV4dCB0byBwYXJzZSBmcm9tIGF0dHJpYnV0ZSBvciB0ZXh0Q29udGVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGVJbmZvIEN1cnJlbnQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogQHJldHVybiB7QXJyYXk8IUJpbmRpbmdQYXJ0Pn0gQXJyYXkgb2YgYmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VCaW5kaW5ncyh0ZXh0LCB0ZW1wbGF0ZUluZm8pIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBsZXQgbGFzdEluZGV4ID0gMDsKICAgICAgICBsZXQgbTsKICAgICAgICAvLyBFeGFtcGxlOiAibGl0ZXJhbDF7e3Byb3B9fWxpdGVyYWwyW1shY29tcHV0ZShmb28sYmFyKV1dZmluYWwiCiAgICAgICAgLy8gUmVnZXggbWF0Y2hlczoKICAgICAgICAvLyAgICAgICAgSXRlcmF0aW9uIDE6ICBJdGVyYXRpb24gMjoKICAgICAgICAvLyBtWzFdOiAne3snICAgICAgICAgICdbWycKICAgICAgICAvLyBtWzJdOiAnJyAgICAgICAgICAgICchJwogICAgICAgIC8vIG1bM106ICdwcm9wJyAgICAgICAgJ2NvbXB1dGUoZm9vLGJhciknCiAgICAgICAgd2hpbGUgKChtID0gYmluZGluZ1JlZ2V4LmV4ZWModGV4dCkpICE9PSBudWxsKSB7CiAgICAgICAgICAvLyBBZGQgbGl0ZXJhbCBwYXJ0CiAgICAgICAgICBpZiAobS5pbmRleCA+IGxhc3RJbmRleCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHtsaXRlcmFsOiB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgbS5pbmRleCl9KTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFkZCBiaW5kaW5nIHBhcnQKICAgICAgICAgIGxldCBtb2RlID0gbVsxXVswXTsKICAgICAgICAgIGxldCBuZWdhdGUgPSBCb29sZWFuKG1bMl0pOwogICAgICAgICAgbGV0IHNvdXJjZSA9IG1bM10udHJpbSgpOwogICAgICAgICAgbGV0IGN1c3RvbUV2ZW50ID0gZmFsc2UsIG5vdGlmeUV2ZW50ID0gJycsIGNvbG9uID0gLTE7CiAgICAgICAgICBpZiAobW9kZSA9PSAneycgJiYgKGNvbG9uID0gc291cmNlLmluZGV4T2YoJzo6JykpID4gMCkgewogICAgICAgICAgICBub3RpZnlFdmVudCA9IHNvdXJjZS5zdWJzdHJpbmcoY29sb24gKyAyKTsKICAgICAgICAgICAgc291cmNlID0gc291cmNlLnN1YnN0cmluZygwLCBjb2xvbik7CiAgICAgICAgICAgIGN1c3RvbUV2ZW50ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBzaWduYXR1cmUgPSBwYXJzZU1ldGhvZChzb3VyY2UpOwogICAgICAgICAgbGV0IGRlcGVuZGVuY2llcyA9IFtdOwogICAgICAgICAgaWYgKHNpZ25hdHVyZSkgewogICAgICAgICAgICAvLyBJbmxpbmUgY29tcHV0ZWQgZnVuY3Rpb24KICAgICAgICAgICAgbGV0IHthcmdzLCBtZXRob2ROYW1lfSA9IHNpZ25hdHVyZTsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgYXJnID0gYXJnc1tpXTsKICAgICAgICAgICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChhcmcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zOwogICAgICAgICAgICBpZiAoZHluYW1pY0ZucyAmJiBkeW5hbWljRm5zW21ldGhvZE5hbWVdIHx8IHNpZ25hdHVyZS5zdGF0aWMpIHsKICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChtZXRob2ROYW1lKTsKICAgICAgICAgICAgICBzaWduYXR1cmUuZHluYW1pY0ZuID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUHJvcGVydHkgb3IgcGF0aAogICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChzb3VyY2UpOwogICAgICAgICAgfQogICAgICAgICAgcGFydHMucHVzaCh7CiAgICAgICAgICAgIHNvdXJjZSwgbW9kZSwgbmVnYXRlLCBjdXN0b21FdmVudCwgc2lnbmF0dXJlLCBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIGV2ZW50OiBub3RpZnlFdmVudAogICAgICAgICAgfSk7CiAgICAgICAgICBsYXN0SW5kZXggPSBiaW5kaW5nUmVnZXgubGFzdEluZGV4OwogICAgICAgIH0KICAgICAgICAvLyBBZGQgYSBmaW5hbCBsaXRlcmFsIHBhcnQKICAgICAgICBpZiAobGFzdEluZGV4ICYmIGxhc3RJbmRleCA8IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IHRleHQuc3Vic3RyaW5nKGxhc3RJbmRleCk7CiAgICAgICAgICBpZiAobGl0ZXJhbCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHsKICAgICAgICAgICAgICBsaXRlcmFsOiBsaXRlcmFsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydHMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gcGFydHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB0byBldmFsdWF0ZSBhIHByZXZpb3VzbHkgcGFyc2VkIGJpbmRpbmcgcGFydCBiYXNlZCBvbiBhIHNldCBvZgogICAgICAgKiBvbmUgb3IgbW9yZSBjaGFuZ2VkIGRlcGVuZGVuY2llcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHt0aGlzfSBpbnN0IEVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBzY29wZSBmb3IKICAgICAgICogICBiaW5kaW5nIGRlcGVuZGVuY2llcwogICAgICAgKiBAcGFyYW0ge0JpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQcm9wZXJ0eS9wYXRoIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSB0aGUgYmluZGluZyBwYXJ0IGV2YWx1YXRlZCB0bwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAgICAgbGV0IHZhbHVlOwogICAgICAgIGlmIChwYXJ0LnNpZ25hdHVyZSkgewogICAgICAgICAgdmFsdWUgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBwYXJ0LnNpZ25hdHVyZSk7CiAgICAgICAgfSBlbHNlIGlmIChwYXRoICE9IHBhcnQuc291cmNlKSB7CiAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGFydC5zb3VyY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwYXRoKSkgewogICAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZSA9IGluc3QuX19kYXRhW3BhdGhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydC5uZWdhdGUpIHsKICAgICAgICAgIHZhbHVlID0gIXZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KCiAgICB9CgogICAgLy8gbWFrZSBhIHR5cGluZyBmb3IgY2xvc3VyZSA6UAogICAgUHJvcGVydHlFZmZlY3RzVHlwZSA9IFByb3BlcnR5RWZmZWN0czsKCiAgICByZXR1cm4gUHJvcGVydHlFZmZlY3RzOwogIH0pOwoKICAvKioKICAgKiBIZWxwZXIgYXBpIGZvciBlbnF1ZXVpbmcgY2xpZW50IGRvbSBjcmVhdGVkIGJ5IGEgaG9zdCBlbGVtZW50LgogICAqCiAgICogQnkgZGVmYXVsdCBlbGVtZW50cyBhcmUgZmx1c2hlZCB2aWEgYF9mbHVzaFByb3BlcnRpZXNgIHdoZW4KICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGNhbGxlZC4gRWxlbWVudHMgYXR0YWNoIHRoZWlyIGNsaWVudCBkb20gdG8KICAgKiB0aGVtc2VsdmVzIGF0IGByZWFkeWAgdGltZSB3aGljaCByZXN1bHRzIGZyb20gdGhpcyBmaXJzdCBmbHVzaC4KICAgKiBUaGlzIHByb3ZpZGVzIGFuIG9yZGVyaW5nIGd1YXJhbnRlZSB0aGF0IHRoZSBjbGllbnQgZG9tIGFuIGVsZW1lbnQKICAgKiBjcmVhdGVzIGlzIGZsdXNoZWQgYmVmb3JlIHRoZSBlbGVtZW50IGl0c2VsZiAoaS5lLiBjbGllbnQgYHJlYWR5YAogICAqIGZpcmVzIGJlZm9yZSBob3N0IGByZWFkeWApLgogICAqCiAgICogSG93ZXZlciwgaWYgYF9mbHVzaFByb3BlcnRpZXNgIGlzIGNhbGxlZCAqYmVmb3JlKiBhbiBlbGVtZW50IGlzIGNvbm5lY3RlZCwKICAgKiBhcyBmb3IgZXhhbXBsZSBgVGVtcGxhdGl6ZWAgZG9lcywgdGhpcyBvcmRlcmluZyBndWFyYW50ZWUgY2Fubm90IGJlCiAgICogc2F0aXNmaWVkIGJlY2F1c2Ugbm8gZWxlbWVudHMgYXJlIGNvbm5lY3RlZC4gKE5vdGU6IEJvdW5kIGVsZW1lbnRzIHRoYXQKICAgKiByZWNlaXZlIGRhdGEgZG8gYmVjb21lIGVucXVldWVkIGNsaWVudHMgYW5kIGFyZSBwcm9wZXJseSBvcmRlcmVkIGJ1dAogICAqIHVuYm91bmQgZWxlbWVudHMgYXJlIG5vdC4pCiAgICoKICAgKiBUbyBtYWludGFpbiB0aGUgZGVzaXJlZCAiY2xpZW50IGJlZm9yZSBob3N0IiBvcmRlcmluZyBndWFyYW50ZWUgZm9yIHRoaXMKICAgKiBjYXNlIHdlIHJlbHkgb24gdGhlICJob3N0IHN0YWNrLiBDbGllbnQgbm9kZXMgcmVnaXN0ZXJzIHRoZW1zZWx2ZXMgd2l0aAogICAqIHRoZSBjcmVhdGluZyBob3N0IGVsZW1lbnQgd2hlbiBjcmVhdGVkLiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgY2xpZW50IGRvbQogICAqIGlzIHJlYWRpZWQgaW4gdGhlIHByb3BlciBvcmRlciwgbWFpbnRhaW5pbmcgdGhlIGRlc2lyZWQgZ3VhcmFudGVlLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KICBsZXQgaG9zdFN0YWNrID0gewoKICAgIHN0YWNrOiBbXSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7Kn0gaW5zdCBJbnN0YW5jZSB0byBhZGQgdG8gaG9zdFN0YWNrCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge2hvc3RTdGFja30KICAgICAqLwogICAgcmVnaXN0ZXJIb3N0KGluc3QpIHsKICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB7CiAgICAgICAgbGV0IGhvc3QgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdOwogICAgICAgIGhvc3QuX2VucXVldWVDbGllbnQoaW5zdCk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gYmVnaW4gaG9zdGluZwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtob3N0U3RhY2t9CiAgICAgKi8KICAgIGJlZ2luSG9zdGluZyhpbnN0KSB7CiAgICAgIHRoaXMuc3RhY2sucHVzaChpbnN0KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gZW5kIGhvc3RpbmcKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7aG9zdFN0YWNrfQogICAgICovCiAgICBlbmRIb3N0aW5nKGluc3QpIHsKICAgICAgbGV0IHN0YWNrTGVuID0gdGhpcy5zdGFjay5sZW5ndGg7CiAgICAgIGlmIChzdGFja0xlbiAmJiB0aGlzLnN0YWNrW3N0YWNrTGVuLTFdID09IGluc3QpIHsKICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICB9CiAgICB9CgogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIFByb3ZpZGVzIGJhc2ljIHRyYWNraW5nIG9mIGVsZW1lbnQgZGVmaW5pdGlvbnMgKHJlZ2lzdHJhdGlvbnMpIGFuZAogICAqIGluc3RhbmNlIGNvdW50cy4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAc3VtbWFyeSBQcm92aWRlcyBiYXNpYyB0cmFja2luZyBvZiBlbGVtZW50IGRlZmluaXRpb25zIChyZWdpc3RyYXRpb25zKSBhbmQKICAgKiBpbnN0YW5jZSBjb3VudHMuCiAgICovCiAgUG9seW1lci50ZWxlbWV0cnkgPSB7CiAgICAvKioKICAgICAqIFRvdGFsIG51bWJlciBvZiBQb2x5bWVyIGVsZW1lbnQgaW5zdGFuY2VzIGNyZWF0ZWQuCiAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICovCiAgICBpbnN0YW5jZUNvdW50OiAwLAogICAgLyoqCiAgICAgKiBBcnJheSBvZiBQb2x5bWVyIGVsZW1lbnQgY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBmaW5hbGl6ZWQuCiAgICAgKiBAdHlwZSB7QXJyYXk8UG9seW1lci5FbGVtZW50Pn0KICAgICAqLwogICAgcmVnaXN0cmF0aW9uczogW10sCiAgICAvKioKICAgICAqIEBwYXJhbSB7IVBvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byBsb2cKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3JlZ0xvZzogZnVuY3Rpb24ocHJvdG90eXBlKSB7CiAgICAgIGNvbnNvbGUubG9nKCdbJyArIHByb3RvdHlwZS5pcyArICddOiByZWdpc3RlcmVkJyk7CiAgICB9LAogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBjbGFzcyBwcm90b3R5cGUgZm9yIHRlbGVtZXRyeSBwdXJwb3Nlcy4KICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byByZWdpc3RlcgogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihwcm90b3R5cGUpIHsKICAgICAgdGhpcy5yZWdpc3RyYXRpb25zLnB1c2gocHJvdG90eXBlKTsKICAgICAgUG9seW1lci5sb2cgJiYgdGhpcy5fcmVnTG9nKHByb3RvdHlwZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBMb2dzIGFsbCBlbGVtZW50cyByZWdpc3RlcmVkIHdpdGggYW4gYGlzYCB0byB0aGUgY29uc29sZS4KICAgICAqIEBwdWJsaWMKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICovCiAgICBkdW1wUmVnaXN0cmF0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMucmVnaXN0cmF0aW9ucy5mb3JFYWNoKHRoaXMuX3JlZ0xvZyk7CiAgICB9CiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGNvcHkgb2YgYHByb3BzYCB3aXRoIGVhY2ggcHJvcGVydHkgbm9ybWFsaXplZCBzdWNoIHRoYXQKICAgKiB1cGdyYWRlZCBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBhIHR5cGUgcHJvcGVydHkgeyB0eXBlOiBUeXBlfS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIG5vcm1hbGl6ZQogICAqIEByZXR1cm4ge09iamVjdH0gQ29weSBvZiBpbnB1dCBgcHJvcHNgIHdpdGggbm9ybWFsaXplZCBwcm9wZXJ0aWVzIHRoYXQKICAgKiBhcmUgaW4gdGhlIGZvcm0ge3R5cGU6IFR5cGV9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICBjb25zdCBvdXRwdXQgPSB7fTsKICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgY29uc3QgbyA9IHByb3BzW3BdOwogICAgICBvdXRwdXRbcF0gPSAodHlwZW9mIG8gPT09ICdmdW5jdGlvbicpID8ge3R5cGU6IG99IDogbzsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQoKICAvKioKICAgKiBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCB0byB1c2luZyB0aGUgUHJvcGVydGllc0NoYW5nZWQKICAgKiBtaXhpbiBieSBwcm92aWRpbmcgYSBtZWNoYW5pc20gdG8gZGVjbGFyZSBwcm9wZXJ0aWVzIGluIGEgc3RhdGljCiAgICogZ2V0dGVyIChlLmcuIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsgcmV0dXJuIHsgZm9vOiBTdHJpbmcgfSB9KS4gQ2hhbmdlcwogICAqIGFyZSByZXBvcnRlZCB2aWEgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZC4KICAgKgogICAqIFRoaXMgbWl4aW4gcHJvdmlkZXMgbm8gc3BlY2lmaWMgc3VwcG9ydCBmb3IgcmVuZGVyaW5nLiBVc2VycyBhcmUgZXhwZWN0ZWQKICAgKiB0byBjcmVhdGUgYSBTaGFkb3dSb290IGFuZCBwdXQgY29udGVudCBpbnRvIGl0IGFuZCB1cGRhdGUgaXQgaW4gd2hhdGV2ZXIKICAgKiB3YXkgbWFrZXMgc2Vuc2UuIFRoaXMgY2FuIGJlIGRvbmUgaW4gcmVhY3Rpb24gdG8gcHJvcGVydGllcyBjaGFuZ2luZyBieQogICAqIGltcGxlbWVudGluZyBgX3Byb3BlcnRpZXNDaGFuZ2VkYC4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1peGluIHRoYXQgcHJvdmlkZXMgYSBtaW5pbWFsIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZwogICAqIHRoZSBQcm9wZXJ0aWVzQ2hhbmdlZCBtaXhpbiBieSBwcm92aWRpbmcgYSBkZWNsYXJhdGl2ZSBgcHJvcGVydGllc2Agb2JqZWN0LgogICAqLwogICBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzQ2hhbmdlZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnRpZXNDaGFuZ2VkKHN1cGVyQ2xhc3MpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiBjbGFzcywgaWYgaXQgaXMgYW4KICAgICAqIGluc3RhbmNlIG9mIHRoZSBQcm9wZXJ0aWVzTWl4aW4uCiAgICAgKgogICAgICogQHBhcmFtIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIFByb3BlcnRpZXNNaXhpbiBjb25zdHJ1Y3RvcgogICAgICogQHJldHVybiB7UHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IFN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cGVyUHJvcGVydGllc0NsYXNzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGNvbnN0IHN1cGVyQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvcik7CgogICAgICAvLyBOb3RlLCB0aGUgYFByb3BlcnRpZXNNaXhpbmAgY2xhc3MgYmVsb3cgb25seSByZWZlcnMgdG8gdGhlIGNsYXNzCiAgICAgIC8vIGdlbmVyYXRlZCBieSB0aGlzIGNhbGwgdG8gdGhlIG1peGluOyB0aGUgaW5zdGFuY2VvZiB0ZXN0IG9ubHkgd29ya3MKICAgICAgLy8gYmVjYXVzZSB0aGUgbWl4aW4gaXMgZGVkdXBlZCBhbmQgZ3VhcmFudGVlZCBvbmx5IHRvIGFwcGx5IG9uY2UsIGhlbmNlCiAgICAgIC8vIGFsbCBjb25zdHJ1Y3RvcnMgaW4gYSBwcm90byBjaGFpbiB3aWxsIHNlZSB0aGUgc2FtZSBgUHJvcGVydGllc01peGluYAogICAgICByZXR1cm4gKHN1cGVyQ3Rvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBQcm9wZXJ0aWVzTWl4aW4pID8KICAgICAgICAvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyAoc3VwZXJDdG9yKSA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYHByb3BlcnRpZXNgIG9iamVjdCBmb3IgdGhlCiAgICAgKiBnaXZlbiBjbGFzcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvIGF0CiAgICAgKiBsZWFzdCB7dHlwZX0uCiAgICAgKgogICAgICogQHBhcmFtIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgUHJvcGVydGllc01peGluIGNvbnN0cnVjdG9yCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE1lbW9pemVkIHByb3BlcnRpZXMgb2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG93blByb3BlcnRpZXMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293blByb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgbGV0IHByb3BzID0gbnVsbDsKCiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gY29uc3RydWN0b3IucHJvcGVydGllczsKICAgICAgICAgIAogICAgICAgICAgaWYgKHByb3BlcnRpZXMpIHsKICAgICAgICAgICAgcHJvcHMgPSBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzID0gcHJvcHM7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duUHJvcGVydGllczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnRpZXNNaXhpbiBleHRlbmRzIGJhc2UgewoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgc3RhbmRhcmQgY3VzdG9tIGVsZW1lbnRzIGdldHRlciB0byBvYnNlcnZlcyB0aGUgYXR0cmlidXRlcwogICAgICAgKiBsaXN0ZWQgaW4gYHByb3BlcnRpZXNgLgogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19vYnNlcnZlZEF0dHJpYnV0ZXMnKSkgewogICAgICAgICAgUG9seW1lci50ZWxlbWV0cnkucmVnaXN0ZXIodGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzOwogICAgICAgICAgdGhpcy5fX29ic2VydmVkQXR0cmlidXRlcyA9IHByb3BzID8gT2JqZWN0LmtleXMocHJvcHMpLm1hcChwID0+IHRoaXMuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHApKSA6IFtdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX29ic2VydmVkQXR0cmlidXRlczsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZpbmFsaXplcyBhbiBlbGVtZW50IGRlZmluaXRpb24sIGluY2x1ZGluZyBlbnN1cmluZyBhbnkgc3VwZXIgY2xhc3NlcwogICAgICAgKiBhcmUgYWxzbyBmaW5hbGl6ZWQuIFRoaXMgaW5jbHVkZXMgZW5zdXJpbmcgcHJvcGVydHkKICAgICAgICogYWNjZXNzb3JzIGV4aXN0IG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhpcyBtZXRob2QgY2FsbHMKICAgICAgICogYF9maW5hbGl6ZUNsYXNzYCB0byBmaW5hbGl6ZSBlYWNoIGNvbnN0cnVjdG9yIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZmluYWxpemVkJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICBpZiAoc3VwZXJDdG9yKSB7CiAgICAgICAgICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2ZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICB0aGlzLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRmluYWxpemUgYW4gZWxlbWVudCBjbGFzcy4gVGhpcyBpbmNsdWRlcyBlbnN1cmluZyBwcm9wZXJ0eQogICAgICAgKiBhY2Nlc3NvcnMgZXhpc3Qgb24gdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKICAgICAgICogYGZpbmFsaXplYCBhbmQgZmluYWxpemVzIHRoZSBjbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIGNvbnN0IHByb3BzID0gb3duUHJvcGVydGllcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBtZW1vaXplZCB2ZXJzaW9uIG9mIGFsbCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhvc2UgaW5oZXJpdGVkCiAgICAgICAqIGZyb20gc3VwZXIgY2xhc3Nlcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvCiAgICAgICAqIGF0IGxlYXN0IHt0eXBlfS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgX3Byb3BlcnRpZXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KAogICAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0aWVzJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICB0aGlzLl9fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sCiAgICAgICAgICAgIHN1cGVyQ3RvciAmJiBzdXBlckN0b3IuX3Byb3BlcnRpZXMsCiAgICAgICAgICAgIG93blByb3BlcnRpZXMoLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX19wcm9wZXJ0aWVzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgbWV0aG9kIHRvIHJldHVybiB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICogc3RhdGljIGBwcm9wZXJ0aWVzYCBvYmplY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlIHRvIHdoaWNoIHRvIGRlc2VyaWFsaXplIGF0dHJpYnV0ZQogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHsKICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5fcHJvcGVydGllc1tuYW1lXTsKICAgICAgICByZXR1cm4gaW5mbyAmJiBpbmZvLnR5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnRpZXNDaGFuZ2VkYCBtZXRob2QgYW5kIGFkZHMgYSBjYWxsIHRvCiAgICAgICAqIGBmaW5hbGl6ZWAgd2hpY2ggbGF6aWx5IGNvbmZpZ3VyZXMgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIFBvbHltZXIudGVsZW1ldHJ5Lmluc3RhbmNlQ291bnQrKzsKICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmZpbmFsaXplKCk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhZGRlZCB0byBhIGRvY3VtZW50LgogICAgICAgKiBDYWxscyBgX2VuYWJsZVByb3BlcnRpZXNgIHRvIHR1cm4gb24gcHJvcGVydHkgc3lzdGVtIGZyb20KICAgICAgICogYFByb3BlcnRpZXNDaGFuZ2VkYC4KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gYSBkb2N1bWVudAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBpZiAoc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBQcm9wZXJ0aWVzTWl4aW47CgogIH0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgYnVpbHRDU1MgPSB3aW5kb3cuU2hhZHlDU1MgJiYgd2luZG93LlNoYWR5Q1NTWydjc3NCdWlsZCddOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBTdWJjbGFzc2VycyBtYXkgcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBnZXR0ZXJzIHRvIHJldHVybiBtZXRhZGF0YQogICAqIHVzZWQgdG8gY29uZmlndXJlIFBvbHltZXIncyBmZWF0dXJlcyBmb3IgdGhlIGNsYXNzOgogICAqCiAgICogLSBgc3RhdGljIGdldCBpcygpYDogV2hlbiB0aGUgdGVtcGxhdGUgaXMgcHJvdmlkZWQgdmlhIGEgYGRvbS1tb2R1bGVgLAogICAqICAgdXNlcnMgc2hvdWxkIHJldHVybiB0aGUgYGRvbS1tb2R1bGVgIGlkIGZyb20gYSBzdGF0aWMgYGlzYCBnZXR0ZXIuICBJZgogICAqICAgbm8gdGVtcGxhdGUgaXMgbmVlZGVkIG9yIHRoZSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCBkaXJlY3RseSB2aWEgdGhlCiAgICogICBgdGVtcGxhdGVgIGdldHRlciwgdGhlcmUgaXMgbm8gbmVlZCB0byBkZWZpbmUgYGlzYCBmb3IgdGhlIGVsZW1lbnQuCiAgICoKICAgKiAtIGBzdGF0aWMgZ2V0IHRlbXBsYXRlKClgOiBVc2VycyBtYXkgcHJvdmlkZSB0aGUgdGVtcGxhdGUgZGlyZWN0bHkgKGFzCiAgICogICBvcHBvc2VkIHRvIHZpYSBgZG9tLW1vZHVsZWApIGJ5IGltcGxlbWVudGluZyBhIHN0YXRpYyBgdGVtcGxhdGVgIGdldHRlci4KICAgKiAgIFRoZSBnZXR0ZXIgbWF5IHJldHVybiBhbiBgSFRNTFRlbXBsYXRlRWxlbWVudGAgb3IgYSBzdHJpbmcsIHdoaWNoIHdpbGwKICAgKiAgIGF1dG9tYXRpY2FsbHkgYmUgcGFyc2VkIGludG8gYSB0ZW1wbGF0ZS4KICAgKgogICAqIC0gYHN0YXRpYyBnZXQgcHJvcGVydGllcygpYDogU2hvdWxkIHJldHVybiBhbiBvYmplY3QgZGVzY3JpYmluZwogICAqICAgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIgZmVhdHVyZXMgKGtleTogcHJvcGVydHkgbmFtZQogICAqICAgdmFsdWU6IG9iamVjdCBjb250YWluaW5nIHByb3BlcnR5IG1ldGFkYXRhKS4gVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkKICAgKiAgIG1ldGFkYXRhIGluY2x1ZGU6CiAgICogICAtIGB0eXBlYCAoU3RyaW5nfE51bWJlcnxPYmplY3R8QXJyYXl8Li4uKTogVXNlZCBieQogICAqICAgICBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0byBkZXRlcm1pbmUgaG93IHN0cmluZy1iYXNlZCBhdHRyaWJ1dGVzCiAgICogICAgIGFyZSBkZXNlcmlhbGl6ZWQgdG8gSmF2YVNjcmlwdCBwcm9wZXJ0eSB2YWx1ZXMuCiAgICogICAtIGBub3RpZnlgIChib29sZWFuKTogQ2F1c2VzIGEgY2hhbmdlIGluIHRoZSBwcm9wZXJ0eSB0byBmaXJlIGEKICAgKiAgICAgbm9uLWJ1YmJsaW5nIGV2ZW50IGNhbGxlZCBgPHByb3BlcnR5Pi1jaGFuZ2VkYC4gRWxlbWVudHMgdGhhdCBoYXZlCiAgICogICAgIGVuYWJsZWQgdHdvLXdheSBiaW5kaW5nIHRvIHRoZSBwcm9wZXJ0eSB1c2UgdGhpcyBldmVudCB0byBvYnNlcnZlIGNoYW5nZXMuCiAgICogICAtIGByZWFkT25seWAgKGJvb2xlYW4pOiBDcmVhdGVzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIGJ1dCBubyBzZXR0ZXIuCiAgICogICAgIFRvIHNldCBhIHJlYWQtb25seSBwcm9wZXJ0eSwgdXNlIHRoZSBwcml2YXRlIHNldHRlciBtZXRob2QKICAgKiAgICAgYF9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpYC4KICAgKiAgIC0gYG9ic2VydmVyYCAoc3RyaW5nKTogT2JzZXJ2ZXIgbWV0aG9kIG5hbWUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCiAgICogICAgIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlCiAgICogICAgIGAodmFsdWUsIHByZXZpb3VzVmFsdWUpYC4KICAgKiAgIC0gYGNvbXB1dGVkYCAoc3RyaW5nKTogU3RyaW5nIGRlc2NyaWJpbmcgbWV0aG9kIGFuZCBkZXBlbmRlbnQgcHJvcGVydGllcwogICAqICAgICBmb3IgY29tcHV0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IChlLmcuIGAnY29tcHV0ZUZvbyhiYXIsIHpvdCknYCkuCiAgICogICAgIENvbXB1dGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBieSBkZWZhdWx0IGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkCiAgICogICAgIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjb21wdXRpbmcgbWV0aG9kLgogICAqCiAgICogLSBgc3RhdGljIGdldCBvYnNlcnZlcnMoKWA6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eQogICAqICAgb2JzZXJ2ZXIgbWV0aG9kcyBhbmQgdGhlaXIgZGVwZW5kZW50IHByb3BlcnRpZXMgKGUuZy4KICAgKiAgIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgKgogICAqIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHN0YW5kYXJkCiAgICogY3VzdG9tIGVsZW1lbnQgbGlmZWN5Y2xlIGNhbGxiYWNrczsgdXNlcnMgbWF5IG92ZXJyaWRlIHRoZXNlLCBidXQgc2hvdWxkCiAgICogY2FsbCB0aGUgc3VwZXIgbWV0aG9kIHRvIGVuc3VyZQogICAqIC0gYGNvbnN0cnVjdG9yYDogUnVuIHdoZW4gdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBvciB1cGdyYWRlZAogICAqIC0gYGNvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlCiAgICogICBkb2N1bWVudAogICAqIC0gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQgZnJvbQogICAqICAgdGhlIGRvY3VtZW50CiAgICogLSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSBhbiBhdHRyaWJ1dGUgaW4KICAgKiAgIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGlzIHNldCBvciByZW1vdmVkIChub3RlOiB0aGlzIGVsZW1lbnQncyBkZWZhdWx0CiAgICogICBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBpbXBsZW1lbnRhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0dXJuIGFuIGFycmF5CiAgICogICBvZiBkYXNoLWNhc2VkIGF0dHJpYnV0ZXMgYmFzZWQgb24gYHByb3BlcnRpZXNgKQogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc01peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcHJvcGVydHkgcm9vdFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiBgUG9seW1lci5yb290UGF0aGAsCiAgICogICB3aGljaCBkZWZhdWx0cyB0byB0aGUgbWFpbiBkb2N1bWVudCBwYXRoCiAgICogQHByb3BlcnR5IGltcG9ydFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY2xhc3MncyBzdGF0aWMKICAgKiAgIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSwgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIHBhdGggb2YgdGhpcyBlbGVtZW50J3MKICAgKiAgIGBkb20tbW9kdWxlYCAod2hlbiBgaXNgIGlzIHVzZWQpLCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gZm9yIG90aGVyCiAgICogICBpbXBvcnQgc3RyYXRlZ2llcy4KICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MKICAgKiBtZXRhLXByb2dyYW1taW5nIGZlYXR1cmVzLgogICAqLwogIFBvbHltZXIuRWxlbWVudE1peGluID0gUG9seW1lci5kZWR1cGluZ01peGluKGJhc2UgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNNaXhpbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IHBvbHltZXJFbGVtZW50QmFzZSA9IFBvbHltZXIuUHJvcGVydGllc01peGluKFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKGJhc2UpKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHByb3BlcnRpZXMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KICAgICAqIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGFzIGFuIG9wdGltaXphdGlvbiBzaW5jZSBpdCBpcyBhIHN1YnNldCBvZgogICAgICogdGhlIGxpc3QgcmV0dXJuZWQgZnJvbSBgX3Byb3BlcnRpZXNgLgogICAgICogVGhpcyBsaXN0IGlzIHVzZWQgaW4gYF9pbml0aWFsaXplUHJvcGVydGllc2AgdG8gc2V0IHByb3BlcnR5IGRlZmF1bHRzLgogICAgICoKICAgICAqIEBwYXJhbSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgRWxlbWVudCBjbGFzcwogICAgICogQHJldHVybiB7UG9seW1lckVsZW1lbnRQcm9wZXJ0aWVzfSBGbGF0dGVuZWQgcHJvcGVydGllcyBmb3IgdGhpcyBjbGFzcwogICAgICogICB0aGF0IGhhdmUgZGVmYXVsdCB2YWx1ZXMKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BlcnR5RGVmYXVsdHMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX3Byb3BlcnR5RGVmYXVsdHMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzID0gbnVsbDsKICAgICAgICBsZXQgcHJvcHMgPSBjb25zdHJ1Y3Rvci5fcHJvcGVydGllczsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICBsZXQgaW5mbyA9IHByb3BzW3BdOwogICAgICAgICAgaWYgKCd2YWx1ZScgaW4gaW5mbykgewogICAgICAgICAgICBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgPSBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgfHwge307CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLl9fcHJvcGVydHlEZWZhdWx0c1twXSA9IGluZm87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYG9ic2VydmVyc2AgYXJyYXkuCiAgICAgKiBAcGFyYW0ge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIEVsZW1lbnQgY2xhc3MKICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIG93biBvYnNlcnZlcnMgZm9yIHRoZSBnaXZlbiBjbGFzcwogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBvd25PYnNlcnZlcnMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293bk9ic2VydmVycycsIGNvbnN0cnVjdG9yKSkpIHsKICAgICAgICAgIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzID0KICAgICAgICAgIGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ29ic2VydmVycycsIGNvbnN0cnVjdG9yKSkgPwogICAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAoY29uc3RydWN0b3IpLm9ic2VydmVycyA6IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBlZmZlY3RzIGZvciBhIHByb3BlcnR5LgogICAgICoKICAgICAqIE5vdGUsIG9uY2UgYSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8KICAgICAqIGByZWFkT25seWAsIGBjb21wdXRlZGAsIGByZWZsZWN0VG9BdHRyaWJ1dGVgLCBvciBgbm90aWZ5YAogICAgICogdGhlc2UgdmFsdWVzIG1heSBub3QgYmUgY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGEgc3ViY2xhc3MgY2Fubm90CiAgICAgKiBhbHRlciB0aGVzZSBzZXR0aW5ncy4gSG93ZXZlciwgYWRkaXRpb25hbCBgb2JzZXJ2ZXJzYCBtYXkgYmUgYWRkZWQKICAgICAqIGJ5IHN1YmNsYXNzZXMuCiAgICAgKgogICAgICogVGhlIGluZm8gb2JqZWN0IHNob3VsZCBjb250YWluIHByb3BlcnR5IG1ldGFkYXRhIGFzIGZvbGxvd3M6CiAgICAgKgogICAgICogKiBgdHlwZWA6IHtmdW5jdGlvbn0gdHlwZSB0byB3aGljaCBhbiBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIHByb3BlcnR5CiAgICAgKiBpcyBkZXNlcmlhbGl6ZWQuIE5vdGUgdGhlIHByb3BlcnR5IGlzIGNhbWVsLWNhc2VkIGZyb20gYSBkYXNoLWNhc2VkCiAgICAgKiBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCAnZm9vLWJhcicgYXR0cmlidXRlIGlzIGRlc2VyaWFsaXplZCB0byBhCiAgICAgKiBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJy4KICAgICAqCiAgICAgKiAqIGByZWFkT25seWA6IHtib29sZWFufSBjcmVhdGVzIGEgcmVhZE9ubHkgcHJvcGVydHkgYW5kCiAgICAgKiBtYWtlcyBhIHByaXZhdGUgc2V0dGVyIGZvciB0aGUgcHJpdmF0ZSBvZiB0aGUgZm9ybSAnX3NldEZvbycgZm9yIGEKICAgICAqIHByb3BlcnR5ICdmb28nLAogICAgICoKICAgICAqICogYGNvbXB1dGVkYDoge3N0cmluZ30gY3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5LiBBIGNvbXB1dGVkIHByb3BlcnR5CiAgICAgKiBpcyBhbHNvIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGByZWFkT25seTogdHJ1ZWAuIFRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVkCiAgICAgKiBieSBydW5uaW5nIGEgbWV0aG9kIGFuZCBhcmd1bWVudHMgcGFyc2VkIGZyb20gdGhlIGdpdmVuIHN0cmluZy4gRm9yCiAgICAgKiBleGFtcGxlICdjb21wdXRlKGZvbyknIHdpbGwgY29tcHV0ZSBhIGdpdmVuIHByb3BlcnR5IHdoZW4gdGhlCiAgICAgKiAnZm9vJyBwcm9wZXJ0eSBjaGFuZ2VzIGJ5IGV4ZWN1dGluZyB0aGUgJ2NvbXB1dGUnIG1ldGhvZC4gVGhpcyBtZXRob2QKICAgICAqIG11c3QgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZS4KICAgICAqCiAgICAgKiAqIGByZWZsZWN0VG9BdHRyaWJ1dGVgOiB7Ym9vbGVhbn0gSWYgdHJ1ZSwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJlZmxlY3RlZAogICAgICogdG8gYW4gYXR0cmlidXRlIG9mIHRoZSBzYW1lIG5hbWUuIE5vdGUsIHRoZSBhdHRyaWJ1dGUgaXMgZGFzaC1jYXNlZAogICAgICogc28gYSBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJyBpcyByZWZsZWN0ZWQgYXMgJ2Zvby1iYXInLgogICAgICoKICAgICAqICogYG5vdGlmeWA6IHtib29sZWFufSBzZW5kcyBhIG5vbi1idWJibGluZyBub3RpZmljYXRpb24gZXZlbnQgd2hlbgogICAgICogdGhlIHByb3BlcnR5IGNoYW5nZXMuIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWVkICdmb28nIHNlbmRzIGFuCiAgICAgKiBldmVudCBuYW1lZCAnZm9vLWNoYW5nZWQnIHdpdGggYGV2ZW50LmRldGFpbGAgc2V0IHRvIHRoZSB2YWx1ZSBvZgogICAgICogdGhlIHByb3BlcnR5LgogICAgICoKICAgICAqICogb2JzZXJ2ZXI6IHtzdHJpbmd9IG5hbWUgb2YgYSBtZXRob2QgdGhhdCBydW5zIHdoZW4gdGhlIHByb3BlcnR5CiAgICAgKiBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlICh2YWx1ZSwgcHJldmlvdXNWYWx1ZSkuCiAgICAgKgogICAgICogTm90ZTogVXNlcnMgbWF5IHdhbnQgY29udHJvbCBvdmVyIG1vZGlmeWluZyBwcm9wZXJ0eQogICAgICogZWZmZWN0cyB2aWEgc3ViY2xhc3NpbmcuIEZvciBleGFtcGxlLCBhIHVzZXIgbWlnaHQgd2FudCB0byBtYWtlIGEKICAgICAqIHJlZmxlY3RUb0F0dHJpYnV0ZSBwcm9wZXJ0eSBub3QgZG8gc28gaW4gYSBzdWJjbGFzcy4gV2UndmUgY2hvc2VuIHRvCiAgICAgKiBkaXNhYmxlIHRoaXMgYmVjYXVzZSBpdCBsZWFkcyB0byBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbi4KICAgICAqIEZvciBleGFtcGxlLCBhIHJlYWRPbmx5IGVmZmVjdCBnZW5lcmF0ZXMgYSBzcGVjaWFsIHNldHRlci4gSWYgYSBzdWJjbGFzcwogICAgICogZGlzYWJsZXMgdGhlIGVmZmVjdCwgdGhlIHNldHRlciB3b3VsZCBmYWlsIHVuZXhwZWN0ZWRseS4KICAgICAqIEJhc2VkIG9uIGZlZWRiYWNrLCB3ZSBtYXkgd2FudCB0byB0cnkgdG8gbWFrZSBlZmZlY3RzIG1vcmUgbWFsbGVhYmxlCiAgICAgKiBhbmQvb3IgcHJvdmlkZSBhbiBhZHZhbmNlZCBhcGkgZm9yIG1hbmlwdWxhdGluZyB0aGVtLgogICAgICogQWxzbyBjb25zaWRlciBhZGRpbmcgd2FybmluZ3Mgd2hlbiBhbiBlZmZlY3QgY2Fubm90IGJlIGNoYW5nZWQuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckVsZW1lbnR9IHByb3RvIEVsZW1lbnQgY2xhc3MgcHJvdG90eXBlIHRvIGFkZCBhY2Nlc3NvcnMKICAgICAqICAgYW5kIGVmZmVjdHMgdG8KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5LgogICAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gSW5mbyBvYmplY3QgZnJvbSB3aGljaCB0byBjcmVhdGUgcHJvcGVydHkgZWZmZWN0cy4KICAgICAqIFN1cHBvcnRlZCBrZXlzOgogICAgICogQHBhcmFtIHtPYmplY3R9IGFsbFByb3BzIEZsYXR0ZW5lZCBtYXAgb2YgYWxsIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzCiAgICAgKiAgIGVsZW1lbnQgKGluY2x1ZGluZyBpbmhlcml0ZWQgcHJvcGVydGllcykKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUZyb21Db25maWcocHJvdG8sIG5hbWUsIGluZm8sIGFsbFByb3BzKSB7CiAgICAgIC8vIGNvbXB1dGVkIGZvcmNlcyByZWFkT25seS4uLgogICAgICBpZiAoaW5mby5jb21wdXRlZCkgewogICAgICAgIGluZm8ucmVhZE9ubHkgPSB0cnVlOwogICAgICB9CiAgICAgIC8vIE5vdGUsIHNpbmNlIGFsbCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSByZWFkT25seSwgdGhpcyBwcmV2ZW50cwogICAgICAvLyBhZGRpbmcgYWRkaXRpb25hbCBjb21wdXRlZCBwcm9wZXJ0eSBlZmZlY3RzICh3aGljaCBsZWFkcyB0byBhIGNvbmZ1c2luZwogICAgICAvLyBzZXR1cCB3aGVyZSBtdWx0aXBsZSB0cmlnZ2VycyBmb3Igc2V0dGluZyBhIHByb3BlcnR5KQogICAgICAvLyBXaGlsZSB3ZSBkbyBoYXZlIGBoYXNDb21wdXRlZEVmZmVjdGAgdGhpcyBpcyBzZXQgb24gdGhlIHByb3BlcnR5J3MKICAgICAgLy8gZGVwZW5kZW5jaWVzIHJhdGhlciB0aGFuIGl0c2VsZi4KICAgICAgaWYgKGluZm8uY29tcHV0ZWQgJiYgIXByb3RvLl9oYXNSZWFkT25seUVmZmVjdChuYW1lKSkgewogICAgICAgIHByb3RvLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KG5hbWUsIGluZm8uY29tcHV0ZWQsIGFsbFByb3BzKTsKICAgICAgfQogICAgICBpZiAoaW5mby5yZWFkT25seSAmJiAhcHJvdG8uX2hhc1JlYWRPbmx5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkobmFtZSwgIWluZm8uY29tcHV0ZWQpOwogICAgICB9CiAgICAgIGlmIChpbmZvLnJlZmxlY3RUb0F0dHJpYnV0ZSAmJiAhcHJvdG8uX2hhc1JlZmxlY3RFZmZlY3QobmFtZSkpIHsKICAgICAgICBwcm90by5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkobmFtZSk7CiAgICAgIH0KICAgICAgaWYgKGluZm8ubm90aWZ5ICYmICFwcm90by5faGFzTm90aWZ5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KG5hbWUpOwogICAgICB9CiAgICAgIC8vIGFsd2F5cyBhZGQgb2JzZXJ2ZXIKICAgICAgaWYgKGluZm8ub2JzZXJ2ZXIpIHsKICAgICAgICBwcm90by5fY3JlYXRlUHJvcGVydHlPYnNlcnZlcihuYW1lLCBpbmZvLm9ic2VydmVyLCBhbGxQcm9wc1tpbmZvLm9ic2VydmVyXSk7CiAgICAgIH0KICAgICAgLy8gYWx3YXlzIGNyZWF0ZSB0aGUgbWFwcGluZyBmcm9tIGF0dHJpYnV0ZSBiYWNrIHRvIHByb3BlcnR5IGZvciBkZXNlcmlhbGl6YXRpb24uCiAgICAgIHByb3RvLl9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogUHJvY2VzcyBhbGwgc3R5bGUgZWxlbWVudHMgaW4gdGhlIGVsZW1lbnQgdGVtcGxhdGUuIFN0eWxlcyB3aXRoIHRoZQogICAgICogYGluY2x1ZGVgIGF0dHJpYnV0ZSBhcmUgcHJvY2Vzc2VkIHN1Y2ggdGhhdCBhbnkgc3R5bGVzIGluCiAgICAgKiB0aGUgYXNzb2NpYXRlZCAic3R5bGUgbW9kdWxlcyIgYXJlIGluY2x1ZGVkIGluIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICogQHBhcmFtIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSBrbGFzcyBFbGVtZW50IGNsYXNzCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBwcm9jZXNzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaXMgTmFtZSBvZiBlbGVtZW50CiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSBmb3IgZWxlbWVudAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcHJvY2Vzc0VsZW1lbnRTdHlsZXMoa2xhc3MsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSkgewogICAgICBpZiAoIWJ1aWx0Q1NTKSB7CiAgICAgICAgY29uc3QgdGVtcGxhdGVTdHlsZXMgPSB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7CiAgICAgICAgY29uc3Qgc3R5bGVzV2l0aEltcG9ydHMgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgLy8gaW5zZXJ0IHN0eWxlcyBmcm9tIDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPiBhdCB0aGUgdG9wIG9mIHRoZSB0ZW1wbGF0ZQogICAgICAgIGNvbnN0IGxpbmtlZFN0eWxlcyA9IFBvbHltZXIuU3R5bGVHYXRoZXIuc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMoaXMpOwogICAgICAgIGNvbnN0IGZpcnN0VGVtcGxhdGVDaGlsZCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7CiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgbGlua2VkU3R5bGVzLmxlbmd0aDsgaWR4KyspIHsKICAgICAgICAgIGxldCBzID0gbGlua2VkU3R5bGVzW2lkeF07CiAgICAgICAgICBzLnRleHRDb250ZW50ID0ga2xhc3MuX3Byb2Nlc3NTdHlsZVRleHQocy50ZXh0Q29udGVudCwgYmFzZVVSSSk7CiAgICAgICAgICB0ZW1wbGF0ZS5jb250ZW50Lmluc2VydEJlZm9yZShzLCBmaXJzdFRlbXBsYXRlQ2hpbGQpOwogICAgICAgIH0KICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0ICJjb25jcmV0ZSIgc3R5bGUgaW4gdGhlIHRlbXBsYXRlIHdlIGhhdmUgZW5jb3VudGVyZWQKICAgICAgICBsZXQgdGVtcGxhdGVTdHlsZUluZGV4ID0gMDsKICAgICAgICAvLyBlbnN1cmUgYWxsIGdhdGhlcmVkIHN0eWxlcyBhcmUgYWN0dWFsbHkgaW4gdGhpcyB0ZW1wbGF0ZS4KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlc1dpdGhJbXBvcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHN0eWxlc1dpdGhJbXBvcnRzW2ldOwogICAgICAgICAgbGV0IHRlbXBsYXRlU3R5bGUgPSB0ZW1wbGF0ZVN0eWxlc1t0ZW1wbGF0ZVN0eWxlSW5kZXhdOwogICAgICAgICAgLy8gaWYgdGhlIHN0eWxlIGlzIG5vdCBpbiB0aGlzIHRlbXBsYXRlLCBpdCdzIGJlZW4gImluY2x1ZGVkIiBhbmQKICAgICAgICAgIC8vIHdlIHB1dCBhIGNsb25lIG9mIGl0IGluIHRoZSB0ZW1wbGF0ZSBiZWZvcmUgdGhlIHN0eWxlIHRoYXQgaW5jbHVkZWQgaXQKICAgICAgICAgIGlmICh0ZW1wbGF0ZVN0eWxlICE9PSBzKSB7CiAgICAgICAgICAgIHMgPSBzLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgdGVtcGxhdGVTdHlsZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzLCB0ZW1wbGF0ZVN0eWxlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRlbXBsYXRlU3R5bGVJbmRleCsrOwogICAgICAgICAgfQogICAgICAgICAgcy50ZXh0Q29udGVudCA9IGtsYXNzLl9wcm9jZXNzU3R5bGVUZXh0KHMudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgICAgd2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgaXMpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBMb29rIHVwIHRlbXBsYXRlIGZyb20gZG9tLW1vZHVsZSBmb3IgZWxlbWVudAogICAgICoKICAgICAqIEBwYXJhbSB7IXN0cmluZ30gaXMgRWxlbWVudCBuYW1lIHRvIGxvb2sgdXAKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBUZW1wbGF0ZSBmb3VuZCBpbiBkb20gbW9kdWxlLCBvcgogICAgICogICB1bmRlZmluZWQgaWYgbm90IGZvdW5kCiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRlbXBsYXRlRnJvbURvbU1vZHVsZShpcykgewogICAgICBsZXQgdGVtcGxhdGUgPSBudWxsOwogICAgICBpZiAoaXMgJiYgUG9seW1lci5Eb21Nb2R1bGUpIHsKICAgICAgICB0ZW1wbGF0ZSA9IFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydChpcywgJ3RlbXBsYXRlJyk7CiAgICAgICAgLy8gVW5kZXIgc3RyaWN0VGVtcGxhdGVQb2xpY3ksIHJlcXVpcmUgYW55IGVsZW1lbnQgd2l0aCBhbiBgaXNgCiAgICAgICAgLy8gc3BlY2lmaWVkIHRvIGhhdmUgYSBkb20tbW9kdWxlCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0cmljdFRlbXBsYXRlUG9saWN5OiBleHBlY3RpbmcgZG9tLW1vZHVsZSBvciBudWxsIHRlbXBsYXRlIGZvciAke2lzfWApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICB9CgogIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKi8KICAgIGNsYXNzIFBvbHltZXJFbGVtZW50IGV4dGVuZHMgcG9seW1lckVsZW1lbnRCYXNlIHsKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZSBvZiBQcm9wZXJ0aWVzTWl4aW4gX2ZpbmFsaXplQ2xhc3MgdG8gY3JlYXRlIG9ic2VydmVycyBhbmQKICAgICAgICogZmluZCB0aGUgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgY29uc3Qgb2JzZXJ2ZXJzID0gb3duT2JzZXJ2ZXJzKHRoaXMpOwogICAgICAgIGlmIChvYnNlcnZlcnMpIHsKICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKG9ic2VydmVycywgdGhpcy5fcHJvcGVydGllcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICB9CgogICAgICBzdGF0aWMgX3ByZXBhcmVUZW1wbGF0ZSgpIHsKICAgICAgICAvLyBub3RlOiBjcmVhdGUgIndvcmtpbmciIHRlbXBsYXRlIHRoYXQgaXMgZmluYWxpemVkIGF0IGluc3RhbmNlIHRpbWUKICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9ICovICh0aGlzKS50ZW1wbGF0ZTsKICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGxldCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgdGVtcGxhdGUgPSB0OwogICAgICAgICAgfSBlbHNlIGlmICghUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgb2YgUHJvcGVydGllc0NoYW5nZWQgY3JlYXRlUHJvcGVydGllcyB0byBjcmVhdGUgYWNjZXNzb3JzCiAgICAgICAqIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIGZvciBhbGwgb2YgdGhlIHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgICAgIGNyZWF0ZVByb3BlcnR5RnJvbUNvbmZpZyh0aGlzLnByb3RvdHlwZSwgcCwgcHJvcHNbcF0sIHByb3BzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIG9ic2VydmVycyBmb3IgdGhlIGdpdmVuIGBvYnNlcnZlcnNgIGFycmF5LgogICAgICAgKiBMZXZlcmFnZXMgYFByb3BlcnR5RWZmZWN0c2AgdG8gY3JlYXRlIG9ic2VydmVycy4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVycyBBcnJheSBvZiBvYnNlcnZlciBkZXNjcmlwdG9ycyBmb3IKICAgICAgICogICB0aGlzIGNsYXNzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkeW5hbWljRm5zIE9iamVjdCBjb250YWluaW5nIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzCiAgICAgICAqICAgdGhhdCBhcmUgZnVuY3Rpb25zIGFuZCBzaG91bGQgdHJpZ2dlciB0aGUgZWZmZWN0IHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAqICAgcmVmZXJlbmNlIGlzIGNoYW5nZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZU9ic2VydmVycyhvYnNlcnZlcnMsIGR5bmFtaWNGbnMpIHsKICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG9ic2VydmVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcHJvdG8uX2NyZWF0ZU1ldGhvZE9ic2VydmVyKG9ic2VydmVyc1tpXSwgZHluYW1pY0Zucyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGlzIGVsZW1lbnQncyBzaGFkb3cgcm9vdC4KICAgICAgICoKICAgICAgICogSWYgYSBgc3RhdGljIGdldCBpcygpYCBnZXR0ZXIgaXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICogd2lsbCByZXR1cm4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCBpbiBhIGBkb20tbW9kdWxlYCB3aG9zZSBgaWRgCiAgICAgICAqIG1hdGNoZXMgdGhpcyBlbGVtZW50J3MgYGlzYC4KICAgICAgICoKICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZ2V0dGVyIHRvIHJldHVybiBhbiBhcmJpdHJhcnkgdGVtcGxhdGUKICAgICAgICogKGluIHdoaWNoIGNhc2UgdGhlIGBpc2AgZ2V0dGVyIGlzIHVubmVjZXNzYXJ5KS4gVGhlIHRlbXBsYXRlIHJldHVybmVkCiAgICAgICAqIG1heSBiZSBlaXRoZXIgYW4gYEhUTUxUZW1wbGF0ZUVsZW1lbnRgIG9yIGEgc3RyaW5nIHRoYXQgd2lsbCBiZQogICAgICAgKiBhdXRvbWF0aWNhbGx5IHBhcnNlZCBpbnRvIGEgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhhdCB3aGVuIHN1YmNsYXNzaW5nLCBpZiB0aGUgc3VwZXIgY2xhc3Mgb3ZlcnJvZGUgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzdWJjbGFzcyB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRlCiAgICAgICAqIHRlbXBsYXRlIHZpYSBhIGBkb20tbW9kdWxlYCwgaXQgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZ2V0dGVyIGFuZAogICAgICAgKiByZXR1cm4gYFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCh0aGlzLmlzLCAndGVtcGxhdGUnKWAuCiAgICAgICAqCiAgICAgICAqIElmIGEgc3ViY2xhc3Mgd291bGQgbGlrZSB0byBtb2RpZnkgdGhlIHN1cGVyIGNsYXNzIHRlbXBsYXRlLCBpdCBzaG91bGQKICAgICAgICogY2xvbmUgaXQgcmF0aGVyIHRoYW4gbW9kaWZ5IGl0IGluIHBsYWNlLiAgSWYgdGhlIGdldHRlciBkb2VzIGV4cGVuc2l2ZQogICAgICAgKiB3b3JrIHN1Y2ggYXMgY2xvbmluZy9tb2RpZnlpbmcgYSB0ZW1wbGF0ZSwgaXQgc2hvdWxkIG1lbW9pemUgdGhlCiAgICAgICAqIHRlbXBsYXRlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlOgogICAgICAgKgogICAgICAgKiAgIGxldCBtZW1vaXplZFRlbXBsYXRlOwogICAgICAgKiAgIGNsYXNzIE15U3ViQ2xhc3MgZXh0ZW5kcyBNeVN1cGVyQ2xhc3MgewogICAgICAgKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsKICAgICAgICogICAgICAgaWYgKCFtZW1vaXplZFRlbXBsYXRlKSB7CiAgICAgICAqICAgICAgICAgbWVtb2l6ZWRUZW1wbGF0ZSA9IE15U3VwZXJDbGFzcy50ZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAqICAgICAgICAgbGV0IHN1YkNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICogICAgICAgICBzdWJDb250ZW50LnRleHRDb250ZW50ID0gJ1RoaXMgY2FtZSBmcm9tIE15U3ViQ2xhc3MnOwogICAgICAgKiAgICAgICAgIG1lbW9pemVkVGVtcGxhdGUuY29udGVudC5hcHBlbmRDaGlsZChzdWJDb250ZW50KTsKICAgICAgICogICAgICAgfQogICAgICAgKiAgICAgICByZXR1cm4gbWVtb2l6ZWRUZW1wbGF0ZTsKICAgICAgICogICAgIH0KICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge0hUTUxUZW1wbGF0ZUVsZW1lbnR8c3RyaW5nfSBUZW1wbGF0ZSB0byBiZSBzdGFtcGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgIC8vIEV4cGxhbmF0aW9uIG9mIHRlbXBsYXRlLXJlbGF0ZWQgcHJvcGVydGllczoKICAgICAgICAvLyAtIGNvbnN0cnVjdG9yLnRlbXBsYXRlICh0aGlzIGdldHRlcik6IHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGNsYXNzLgogICAgICAgIC8vICAgICBUaGlzIGNhbiBjb21lIGZyb20gdGhlIHByb3RvdHlwZSAoZm9yIGxlZ2FjeSBlbGVtZW50cyksIGZyb20gYQogICAgICAgIC8vICAgICBkb20tbW9kdWxlLCBvciBmcm9tIHRoZSBzdXBlciBjbGFzcydzIHRlbXBsYXRlIChvciBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgIC8vICAgICBhbHRvZ2V0aGVyIGJ5IHRoZSB1c2VyKQogICAgICAgIC8vIC0gY29uc3RydWN0b3IuX3RlbXBsYXRlOiBtZW1vaXplZCB2ZXJzaW9uIG9mIGNvbnN0cnVjdG9yLnRlbXBsYXRlCiAgICAgICAgLy8gLSBwcm90b3R5cGUuX3RlbXBsYXRlOiB3b3JraW5nIHRlbXBsYXRlIGZvciB0aGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZQogICAgICAgIC8vICAgICBwYXJzZWQgYW5kIG1vZGlmaWVkIGluIHBsYWNlLiBJdCBpcyBhIGNsb25lZCB2ZXJzaW9uIG9mCiAgICAgICAgLy8gICAgIGNvbnN0cnVjdG9yLnRlbXBsYXRlLCBzYXZlZCBpbiBfZmluYWxpemVDbGFzcygpLiBOb3RlIHRoYXQgYmVmb3JlCiAgICAgICAgLy8gICAgIHRoaXMgZ2V0dGVyIGlzIGNhbGxlZCwgZm9yIGxlZ2FjeSBlbGVtZW50cyB0aGlzIGNvdWxkIGJlIGZyb20gYQogICAgICAgIC8vICAgICBfdGVtcGxhdGUgZmllbGQgb24gdGhlIGluZm8gb2JqZWN0IHBhc3NlZCB0byBQb2x5bWVyKCksIGEgYmVoYXZpb3IsCiAgICAgICAgLy8gICAgIG9yIHNldCBpbiByZWdpc3RlcmVkKCk7IG9uY2UgdGhlIHN0YXRpYyBnZXR0ZXIgcnVucywgYSBjbG9uZSBvZiBpdAogICAgICAgIC8vICAgICB3aWxsIG92ZXJ3cml0ZSBpdCBvbiB0aGUgcHJvdG90eXBlIGFzIHRoZSB3b3JraW5nIHRlbXBsYXRlLgogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzKSkpIHsKICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0KICAgICAgICAgICAgLy8gSWYgdXNlciBoYXMgcHV0IHRlbXBsYXRlIG9uIHByb3RvdHlwZSAoZS5nLiBpbiBsZWdhY3kgdmlhIHJlZ2lzdGVyZWQKICAgICAgICAgICAgLy8gY2FsbGJhY2sgb3IgaW5mbyBvYmplY3QpLCBwcmVmZXIgdGhhdCBmaXJzdAogICAgICAgICAgICB0aGlzLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzLnByb3RvdHlwZSkpID8KICAgICAgICAgICAgdGhpcy5wcm90b3R5cGUuX3RlbXBsYXRlIDoKICAgICAgICAgICAgLy8gTG9vayBpbiBkb20tbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQncyBpcwogICAgICAgICAgICAoZ2V0VGVtcGxhdGVGcm9tRG9tTW9kdWxlKC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0qLyAodGhpcykuaXMpIHx8CiAgICAgICAgICAgIC8vIE5leHQgbG9vayBmb3Igc3VwZXJjbGFzcyB0ZW1wbGF0ZSAoY2FsbCB0aGUgc3VwZXIgaW1wbCB0aGlzCiAgICAgICAgICAgIC8vIHdheSBzbyB0aGF0IGB0aGlzYCBwb2ludHMgdG8gdGhlIHN1cGVyY2xhc3MpCiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IudGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXQgdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fHN0cmluZ30gdmFsdWUgVGVtcGxhdGUgdG8gc2V0LgogICAgICAgKi8KICAgICAgc3RhdGljIHNldCB0ZW1wbGF0ZSh2YWx1ZSkgewogICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXRoIG1hdGNoaW5nIHRoZSB1cmwgZnJvbSB3aGljaCB0aGUgZWxlbWVudCB3YXMgaW1wb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgcGF0aCBpcyB1c2VkIHRvIHJlc29sdmUgdXJsJ3MgaW4gdGVtcGxhdGUgc3R5bGUgY3NzVGV4dC4KICAgICAgICogVGhlIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSBpcyBhbHNvIHNldCBvbiBlbGVtZW50IGluc3RhbmNlcyBhbmQgY2FuIGJlCiAgICAgICAqIHVzZWQgdG8gY3JlYXRlIGJpbmRpbmdzIHJlbGF0aXZlIHRvIHRoZSBpbXBvcnQgcGF0aC4KICAgICAgICoKICAgICAgICogRm9yIGVsZW1lbnRzIGRlZmluZWQgaW4gRVMgbW9kdWxlcywgdXNlcnMgc2hvdWxkIGltcGxlbWVudAogICAgICAgKiBgc3RhdGljIGdldCBpbXBvcnRNZXRhKCkgeyByZXR1cm4gaW1wb3J0Lm1ldGE7IH1gLCBhbmQgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gb2YgYGltcG9ydFBhdGhgIHdpbGwgIHJldHVybiBgaW1wb3J0Lm1ldGEudXJsYCdzIHBhdGguCiAgICAgICAqIEZvciBlbGVtZW50cyBkZWZpbmVkIGluIEhUTUwgaW1wb3J0cywgdGhpcyBnZXR0ZXIgd2lsbCByZXR1cm4gdGhlIHBhdGgKICAgICAgICogdG8gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBgZG9tLW1vZHVsZWAgZWxlbWVudCBtYXRjaGluZyB0aGlzCiAgICAgICAqIGVsZW1lbnQncyBzdGF0aWMgYGlzYCBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhpcyBwYXRoIHNob3VsZCBjb250YWluIGEgdHJhaWxpbmcgYC9gLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbXBvcnQgcGF0aCBmb3IgdGhpcyBlbGVtZW50IGNsYXNzCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9CiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydFBhdGgoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19pbXBvcnRQYXRoJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5pbXBvcnRNZXRhOwogICAgICAgICAgaWYgKG1ldGEpIHsKICAgICAgICAgICAgdGhpcy5faW1wb3J0UGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChtZXRhLnVybCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBQb2x5bWVyLkRvbU1vZHVsZSAmJiBQb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAodGhpcykuaXMpOwogICAgICAgICAgICB0aGlzLl9pbXBvcnRQYXRoID0gKG1vZHVsZSAmJiBtb2R1bGUuYXNzZXRwYXRoKSB8fAogICAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IuaW1wb3J0UGF0aDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgIH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLwogICAgICAgIHRoaXMuX3RlbXBsYXRlOwogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgdGhpcy5yb290UGF0aDsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLmltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtTdGFtcGVkVGVtcGxhdGUgfCBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3R9ICovCiAgICAgICAgdGhpcy5yb290OwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdDxzdHJpbmcsICFFbGVtZW50Pn0gKi8KICAgICAgICB0aGlzLiQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIHRvIGVuc3VyZSBjbGFzcwogICAgICAgKiBtZXRhcHJvZ3JhbW1pbmcgcmVsYXRlZCB0byBwcm9wZXJ0eSBhY2Nlc3NvcnMgYW5kIGVmZmVjdHMgaGFzCiAgICAgICAqIGNvbXBsZXRlZCAoY2FsbHMgYGZpbmFsaXplYCkuCiAgICAgICAqCiAgICAgICAqIEl0IGFsc28gaW5pdGlhbGl6ZXMgYW55IHByb3BlcnR5IGRlZmF1bHRzIHByb3ZpZGVkIHZpYSBgdmFsdWVgIGluCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHRoaXMuY29uc3RydWN0b3IuZmluYWxpemUoKTsKICAgICAgICAvLyBub3RlOiBmaW5hbGl6ZSB0ZW1wbGF0ZSB3aGVuIHdlIGhhdmUgYWNjZXNzIHRvIGBsb2NhbE5hbWVgIHRvCiAgICAgICAgLy8gYXZvaWQgZGVwZW5kZW5jZSBvbiBgaXNgIGZvciBwb2x5ZmlsbGluZyBzdHlsaW5nLgogICAgICAgIHRoaXMuY29uc3RydWN0b3IuX2ZpbmFsaXplVGVtcGxhdGUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLmxvY2FsTmFtZSk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gc2V0IHBhdGggZGVmYXVsdHMKICAgICAgICB0aGlzLnJvb3RQYXRoID0gUG9seW1lci5yb290UGF0aDsKICAgICAgICB0aGlzLmltcG9ydFBhdGggPSB0aGlzLmNvbnN0cnVjdG9yLmltcG9ydFBhdGg7CiAgICAgICAgLy8gYXBwbHkgcHJvcGVydHkgZGVmYXVsdHMuLi4KICAgICAgICBsZXQgcCQgPSBwcm9wZXJ0eURlZmF1bHRzKHRoaXMuY29uc3RydWN0b3IpOwogICAgICAgIGlmICghcCQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgcCBpbiBwJCkgewogICAgICAgICAgbGV0IGluZm8gPSBwJFtwXTsKICAgICAgICAgIC8vIERvbid0IHNldCBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb3duIHByb3BlcnR5LCB3aGljaAogICAgICAgICAgLy8gaGFwcGVucyB3aGVuIGEgYHByb3BlcnRpZXNgIHByb3BlcnR5IHdpdGggZGVmYXVsdCBidXQgbm8gZWZmZWN0cyBoYWQKICAgICAgICAgIC8vIGEgcHJvcGVydHkgc2V0IChlLmcuIGJvdW5kKSBieSBpdHMgaG9zdCBiZWZvcmUgdXBncmFkZQogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHApKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHR5cGVvZiBpbmZvLnZhbHVlID09ICdmdW5jdGlvbicgPwogICAgICAgICAgICAgIGluZm8udmFsdWUuY2FsbCh0aGlzKSA6CiAgICAgICAgICAgICAgaW5mby52YWx1ZTsKICAgICAgICAgICAgLy8gU2V0IHZpYSBgX3NldFByb3BlcnR5YCBpZiB0aGVyZSBpcyBhbiBhY2Nlc3NvciwgdG8gZW5hYmxlCiAgICAgICAgICAgIC8vIGluaXRpYWxpemluZyByZWFkT25seSBwcm9wZXJ0eSBkZWZhdWx0cwogICAgICAgICAgICBpZiAodGhpcy5faGFzQWNjZXNzb3IocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocCwgdmFsdWUsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXNbcF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEdhdGhlciBzdHlsZSB0ZXh0IGZvciBhIHN0eWxlIGVsZW1lbnQgaW4gdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3NzVGV4dCBUZXh0IGNvbnRhaW5pbmcgc3R5bGluZyB0byBwcm9jZXNzCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlYmFzZSBDU1MgcGF0aHMgYWdhaW5zdAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9jZXNzZWQgQ1NTIHRleHQKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAqIENvbmZpZ3VyZXMgYW4gZWxlbWVudCBgcHJvdG9gIHRvIGZ1bmN0aW9uIHdpdGggYSBnaXZlbiBgdGVtcGxhdGVgLgogICAgICAqIFRoZSBlbGVtZW50IG5hbWUgYGlzYCBhbmQgZXh0ZW5kcyBgZXh0YCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgU2hhZHlDU1MKICAgICAgKiBzdHlsZSBzY29waW5nLgogICAgICAqCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlzIFRhZyBuYW1lIChvciB0eXBlIGV4dGVuc2lvbiBuYW1lKSBmb3IgdGhpcyBlbGVtZW50CiAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICovCiAgICAgIHN0YXRpYyBfZmluYWxpemVUZW1wbGF0ZShpcykgewogICAgICAgIC8qKiBAY29uc3Qge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGU7CiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5fX3BvbHltZXJGaW5hbGl6ZWQpIHsKICAgICAgICAgIHRlbXBsYXRlLl9fcG9seW1lckZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGhpcy5pbXBvcnRQYXRoOwogICAgICAgICAgY29uc3QgYmFzZVVSSSA9IGltcG9ydFBhdGggPyBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybChpbXBvcnRQYXRoKSA6ICcnOwogICAgICAgICAgLy8gZS5nLiBzdXBwb3J0IGBpbmNsdWRlPSJtb2R1bGUtbmFtZSJgLCBhbmQgU2hhZHlDU1MKICAgICAgICAgIHByb2Nlc3NFbGVtZW50U3R5bGVzKHRoaXMsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSk7CiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0YW5kYXJkIEN1c3RvbSBFbGVtZW50cwogICAgICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgLgogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBlbmFibGVzIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIHN5c3RlbSBhbmQKICAgICAgICogZmx1c2hlcyBhbnkgcGVuZGluZyBwcm9wZXJ0aWVzLCBhbmQgdXBkYXRlcyBzaGltbWVkIENTUyBwcm9wZXJ0aWVzCiAgICAgICAqIHdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcvY3VzdG9tIHByb3BlcnRpZXMgcG9seWZpbGwuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXMsIGludmFsaWRDYXN0c30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudCgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykpOwogICAgICAgIH0KICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3RhbXBzIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0aGlzLl90ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICB9CiAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5RWZmZWN0c2AncyBgX3JlYWR5Q2xpZW50c2AgY2FsbC4gQXR0YWNoZXMKICAgICAgICogZWxlbWVudCBkb20gYnkgY2FsbGluZyBgX2F0dGFjaERvbWAgd2l0aCB0aGUgZG9tIHN0YW1wZWQgZnJvbSB0aGUKICAgICAgICogZWxlbWVudCdzIHRlbXBsYXRlIHZpYSBgX3N0YW1wVGVtcGxhdGVgLiBOb3RlIHRoYXQgdGhpcyBhbGxvd3MKICAgICAgICogY2xpZW50IGRvbSB0byBiZSBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCBwcmlvciB0byBhbnkgb2JzZXJ2ZXJzCiAgICAgICAqIHJ1bm5pbmcuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX2F0dGFjaERvbSgvKiogQHR5cGUge1N0YW1wZWRUZW1wbGF0ZX0gKi8odGhpcy5yb290KSk7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSBzdXBlci5fcmVhZHlDbGllbnRzIGhlcmUgc2V0cyB0aGUgY2xpZW50cyBpbml0aWFsaXplZCBmbGFnLgogICAgICAgIC8vIFdlIG11c3Qgd2FpdCB0byBkbyB0aGlzIHVudGlsIGFmdGVyIGNsaWVudCBkb20gaXMgY3JlYXRlZC9hdHRhY2hlZAogICAgICAgIC8vIHNvIHRoYXQgdGhpcyBmbGFnIGNhbiBiZSBjaGVja2VkIHRvIHByZXZlbnQgbm90aWZpY2F0aW9ucyBmaXJlZAogICAgICAgIC8vIGR1cmluZyB0aGlzIHByb2Nlc3MgZnJvbSBiZWluZyBoYW5kbGVkIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgICAgICBzdXBlci5fcmVhZHlDbGllbnRzKCk7CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogQXR0YWNoZXMgYW4gZWxlbWVudCdzIHN0YW1wZWQgZG9tIHRvIGl0c2VsZi4gQnkgZGVmYXVsdCwKICAgICAgICogdGhpcyBtZXRob2QgY3JlYXRlcyBhIGBzaGFkb3dSb290YCBhbmQgYWRkcyB0aGUgZG9tIHRvIGl0LgogICAgICAgKiBIb3dldmVyLCB0aGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhbGxvdyBhbiBlbGVtZW50CiAgICAgICAqIHRvIHB1dCBpdHMgZG9tIGluIGFub3RoZXIgbG9jYXRpb24uCiAgICAgICAqCiAgICAgICAqIEB0aHJvd3Mge0Vycm9yfQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdSZXR1cm59CiAgICAgICAqIEBwYXJhbSB7U3RhbXBlZFRlbXBsYXRlfSBkb20gdG8gYXR0YWNoIHRvIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtTaGFkb3dSb290fSBub2RlIHRvIHdoaWNoIHRoZSBkb20gaGFzIGJlZW4gYXR0YWNoZWQuCiAgICAgICAqLwogICAgICBfYXR0YWNoRG9tKGRvbSkgewogICAgICAgIGlmICh0aGlzLmF0dGFjaFNoYWRvdykgewogICAgICAgICAgaWYgKGRvbSkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCkgewogICAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHttb2RlOiAnb3Blbid9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoZG9tKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRvd0RPTSBub3QgYXZhaWxhYmxlLiAnICsKICAgICAgICAgICAgLy8gVE9ETyhzb3J2ZWxsKTogbW92ZSB0byBjb21waWxlLXRpbWUgY29uZGl0aW9uYWwgd2hlbiBzdXBwb3J0ZWQKICAgICAgICAgICdQb2x5bWVyLkVsZW1lbnQgY2FuIGNyZWF0ZSBkb20gYXMgY2hpbGRyZW4gaW5zdGVhZCBvZiBpbiAnICsKICAgICAgICAgICdTaGFkb3dET00gYnkgc2V0dGluZyBgdGhpcy5yb290ID0gdGhpcztcYCBiZWZvcmUgXGByZWFkeVxgLicpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcgYW5kIGN1c3RvbSBwcm9wZXJ0eSBzaGltLCBjYXVzZXMgYWxsCiAgICAgICAqIHNoaW1tZWQgc3R5bGVzIGluIHRoaXMgZWxlbWVudCAoYW5kIGl0cyBzdWJ0cmVlKSB0byBiZSB1cGRhdGVkCiAgICAgICAqIGJhc2VkIG9uIGN1cnJlbnQgY3VzdG9tIHByb3BlcnR5IHZhbHVlcy4KICAgICAgICoKICAgICAgICogVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvdmVycmlkZXMgaW5saW5lIGN1c3RvbSBwcm9wZXJ0eSBzdHlsZXMgd2l0aCBhbgogICAgICAgKiBvYmplY3Qgb2YgcHJvcGVydGllcyB3aGVyZSB0aGUga2V5cyBhcmUgQ1NTIHByb3BlcnRpZXMsIGFuZCB0aGUgdmFsdWVzCiAgICAgICAqIGFyZSBzdHJpbmdzLgogICAgICAgKgogICAgICAgKiBFeGFtcGxlOiBgdGhpcy51cGRhdGVTdHlsZXMoeyctLWNvbG9yJzogJ2JsdWUnfSlgCiAgICAgICAqCiAgICAgICAqIFRoZXNlIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkIHVubGVzcyBhIHZhbHVlIG9mIGBudWxsYCBpcyBzZXQuCiAgICAgICAqCiAgICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCB1cGRhdGluZyBDU1MgbWl4aW5zLgogICAgICAgKiBZb3UgY2FuIG5vdCBkeW5hbWljYWxseSBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFuIGBAYXBwbHlgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICAgICAqICAgYXBwbHkgdG8gdGhpcyBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIHVwZGF0ZVN0eWxlcyhwcm9wZXJ0aWVzKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnRpZXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJld3JpdGVzIGEgZ2l2ZW4gVVJMIHJlbGF0aXZlIHRvIGEgYmFzZSBVUkwuIFRoZSBiYXNlIFVSTCBkZWZhdWx0cyB0bwogICAgICAgKiB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIGBkb20tbW9kdWxlYCBmb3IKICAgICAgICogdGhpcyBlbGVtZW50LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2FtZSBVUkwgYmVmb3JlIGFuZCBhZnRlcgogICAgICAgKiBidW5kbGluZy4KICAgICAgICoKICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgICAqIHdpdGggYC9gIChhYnNvbHV0ZSBVUkxzKSBvciBgI2AgKGhhc2ggaWRlbnRpZmllcnMpLiAgRm9yIGdlbmVyYWwgcHVycG9zZQogICAgICAgKiBVUkwgcmVzb2x1dGlvbiwgdXNlIGB3aW5kb3cuVVJMYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgdG8gcmVzb2x2ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBiYXNlIE9wdGlvbmFsIGJhc2UgVVJMIHRvIHJlc29sdmUgYWdhaW5zdCwgZGVmYXVsdHMKICAgICAgICogdG8gdGhlIGVsZW1lbnQncyBgaW1wb3J0UGF0aGAKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBSZXdyaXR0ZW4gVVJMIHJlbGF0aXZlIHRvIGJhc2UKICAgICAgICovCiAgICAgIHJlc29sdmVVcmwodXJsLCBiYXNlKSB7CiAgICAgICAgaWYgKCFiYXNlICYmIHRoaXMuaW1wb3J0UGF0aCkgewogICAgICAgICAgYmFzZSA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlVXJsKHRoaXMuaW1wb3J0UGF0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCh1cmwsIGJhc2UpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0eUFjY2Vzc29yc2AgdG8gYWRkIG1hcCBvZiBkeW5hbWljIGZ1bmN0aW9ucyBvbgogICAgICAgKiB0ZW1wbGF0ZSBpbmZvLCBmb3IgY29uc3VtcHRpb24gYnkgYFByb3BlcnR5RWZmZWN0c2AgdGVtcGxhdGUgYmluZGluZwogICAgICAgKiBjb2RlLiBUaGlzIG1hcCBkZXRlcm1pbmVzIHdoaWNoIG1ldGhvZCB0ZW1wbGF0ZXMgc2hvdWxkIGhhdmUgYWNjZXNzb3JzCiAgICAgICAqIGNyZWF0ZWQgZm9yIHRoZW0uCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zIHx8IHRoaXMuX3Byb3BlcnRpZXM7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9wYXJzZVRlbXBsYXRlQ29udGVudCh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIFBvbHltZXJFbGVtZW50OwogIH0pOwoKICAvKioKICAgKiBXaGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydHkgc2hpbSwgY2F1c2VzIGFsbAogICAqIHNoaW1tZWQgYHN0eWxlc2AgKHZpYSBgY3VzdG9tLXN0eWxlYCkgaW4gdGhlIGRvY3VtZW50IChhbmQgaXRzIHN1YnRyZWUpCiAgICogdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBjdXJyZW50IGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIG92ZXJyaWRlcyBpbmxpbmUgY3VzdG9tIHByb3BlcnR5IHN0eWxlcyB3aXRoIGFuCiAgICogb2JqZWN0IG9mIHByb3BlcnRpZXMgd2hlcmUgdGhlIGtleXMgYXJlIENTUyBwcm9wZXJ0aWVzLCBhbmQgdGhlIHZhbHVlcwogICAqIGFyZSBzdHJpbmdzLgogICAqCiAgICogRXhhbXBsZTogYFBvbHltZXIudXBkYXRlU3R5bGVzKHsnLS1jb2xvcic6ICdibHVlJ30pYAogICAqCiAgICogVGhlc2UgcHJvcGVydGllcyBhcmUgcmV0YWluZWQgdW5sZXNzIGEgdmFsdWUgb2YgYG51bGxgIGlzIHNldC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0PX0gcHJvcHMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICogICBhcHBseSB0byB0aGUgZG9jdW1lbnQuCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnVwZGF0ZVN0eWxlcyA9IGZ1bmN0aW9uKHByb3BzKSB7CiAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZURvY3VtZW50KHByb3BzKTsKICAgIH0KICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAc3VtbWFyeSBDb2xsYXBzZSBtdWx0aXBsZSBjYWxsYmFja3MgaW50byBvbmUgaW52b2NhdGlvbiBhZnRlciBhIHRpbWVyLgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgY2xhc3MgRGVib3VuY2VyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLl9hc3luY01vZHVsZSA9IG51bGw7CiAgICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbDsKICAgICAgdGhpcy5fdGltZXIgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzY2hlZHVsZXI7IHRoYXQgaXMsIGEgbW9kdWxlIHdpdGggdGhlIEFzeW5jIGludGVyZmFjZSwKICAgICAqIGEgY2FsbGJhY2sgYW5kIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHJ1biBmdW5jdGlvbgogICAgICogZnJvbSB0aGUgYXN5bmMgbW9kdWxlLgogICAgICoKICAgICAqIEBwYXJhbSB7IUFzeW5jSW50ZXJmYWNlfSBhc3luY01vZHVsZSBPYmplY3Qgd2l0aCBBc3luYyBpbnRlcmZhY2UuCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgdGhpcy5fYXN5bmNNb2R1bGUgPSBhc3luY01vZHVsZTsKICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgdGhpcy5fdGltZXIgPSB0aGlzLl9hc3luY01vZHVsZS5ydW4oKCkgPT4gewogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ2FuY2VscyBhbiBhY3RpdmUgZGVib3VuY2VyIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjYW5jZWwoKSB7CiAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHsKICAgICAgICB0aGlzLl9hc3luY01vZHVsZS5jYW5jZWwodGhpcy5fdGltZXIpOwogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFuIGFjdGl2ZSBkZWJvdW5jZXIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgogICAgICoKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFjdGl2ZS4KICAgICAqLwogICAgaXNBY3RpdmUoKSB7CiAgICAgIHJldHVybiB0aGlzLl90aW1lciAhPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VyIGlmIG5vIGRlYm91bmNlciBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIKICAgICAqIG9yIGl0IGNhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlciBvdGhlcndpc2UuIFRoZSBmb2xsb3dpbmcKICAgICAqIGV4YW1wbGUgc2hvd3MgaG93IGEgZGVib3VuY2VyIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEKICAgICAqIG1pY3JvdGFzayBhbmQgImRlYm91bmNlZCIgc3VjaCB0aGF0IHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcwogICAgICogY2FsbGVkIG9uY2UuIEFkZCB0aGlzIG1ldGhvZCB0byBhIGN1c3RvbSBlbGVtZW50OgogICAgICoKICAgICAqIF9kZWJvdW5jZVdvcmsoKSB7CiAgICAgKiAgIHRoaXMuX2RlYm91bmNlSm9iID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UodGhpcy5fZGVib3VuY2VKb2IsCiAgICAgKiAgICAgICBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzaywgKCkgPT4gewogICAgICogICAgIHRoaXMuX2RvV29yaygpOwogICAgICogICB9KTsKICAgICAqIH0KICAgICAqCiAgICAgKiBJZiB0aGUgYF9kZWJvdW5jZVdvcmtgIG1ldGhvZCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lCiAgICAgKiBtaWNyb3Rhc2ssIHRoZSBgX2RvV29ya2AgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIGF0IHRoZSBuZXh0CiAgICAgKiBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBOb3RlOiBJbiB0ZXN0aW5nIGl0IGlzIG9mdGVuIGNvbnZlbmllbnQgdG8gYXZvaWQgYXN5bmNocm9ueS4gVG8gYWNjb21wbGlzaAogICAgICogdGhpcyB3aXRoIGEgZGVib3VuY2VyLCB5b3UgY2FuIHVzZSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYCBhbmQKICAgICAqIGBQb2x5bWVyLmZsdXNoYC4gRm9yIGV4YW1wbGUsIGV4dGVuZCB0aGUgYWJvdmUgZXhhbXBsZSBieSBhZGRpbmcKICAgICAqIGBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIodGhpcy5fZGVib3VuY2VKb2IpYCBhdCB0aGUgZW5kIG9mIHRoZQogICAgICogYF9kZWJvdW5jZVdvcmtgIG1ldGhvZC4gVGhlbiBpbiBhIHRlc3QsIGNhbGwgYFBvbHltZXIuZmx1c2hgIHRvIGVuc3VyZQogICAgICogdGhlIGRlYm91bmNlciBoYXMgY29tcGxldGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7RGVib3VuY2VyP30gZGVib3VuY2VyIERlYm91bmNlciBvYmplY3QuCiAgICAgKiBAcGFyYW0geyFBc3luY0ludGVyZmFjZX0gYXN5bmNNb2R1bGUgT2JqZWN0IHdpdGggQXN5bmMgaW50ZXJmYWNlCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4geyFEZWJvdW5jZXJ9IFJldHVybnMgYSBkZWJvdW5jZXIgb2JqZWN0LgogICAgICovCiAgICBzdGF0aWMgZGVib3VuY2UoZGVib3VuY2VyLCBhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgaWYgKGRlYm91bmNlciBpbnN0YW5jZW9mIERlYm91bmNlcikgewogICAgICAgIGRlYm91bmNlci5jYW5jZWwoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWJvdW5jZXIgPSBuZXcgRGVib3VuY2VyKCk7CiAgICAgIH0KICAgICAgZGVib3VuY2VyLnNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spOwogICAgICByZXR1cm4gZGVib3VuY2VyOwogICAgfQogIH0KCiAgLyoqIEBjb25zdCAqLwogIFBvbHltZXIuRGVib3VuY2VyID0gRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBkZXRlY3QgbmF0aXZlIHRvdWNoIGFjdGlvbiBzdXBwb3J0CiAgbGV0IEhBU19OQVRJVkVfVEEgPSB0eXBlb2YgZG9jdW1lbnQuaGVhZC5zdHlsZS50b3VjaEFjdGlvbiA9PT0gJ3N0cmluZyc7CiAgbGV0IEdFU1RVUkVfS0VZID0gJ19fcG9seW1lckdlc3R1cmVzJzsKICBsZXQgSEFORExFRF9PQkogPSAnX19wb2x5bWVyR2VzdHVyZXNIYW5kbGVkJzsKICBsZXQgVE9VQ0hfQUNUSU9OID0gJ19fcG9seW1lckdlc3R1cmVzVG91Y2hBY3Rpb24nOwogIC8vIHJhZGl1cyBmb3IgdGFwIGFuZCB0cmFjawogIGxldCBUQVBfRElTVEFOQ0UgPSAyNTsKICBsZXQgVFJBQ0tfRElTVEFOQ0UgPSA1OwogIC8vIG51bWJlciBvZiBsYXN0IE4gdHJhY2sgcG9zaXRpb25zIHRvIGtlZXAKICBsZXQgVFJBQ0tfTEVOR1RIID0gMjsKCiAgLy8gRGlzYWJsaW5nICJtb3VzZSIgaGFuZGxlcnMgZm9yIDI1MDBtcyBpcyBlbm91Z2gKICBsZXQgTU9VU0VfVElNRU9VVCA9IDI1MDA7CiAgbGV0IE1PVVNFX0VWRU5UUyA9IFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ2NsaWNrJ107CiAgLy8gYW4gYXJyYXkgb2YgYml0bWFzayB2YWx1ZXMgZm9yIG1hcHBpbmcgTW91c2VFdmVudC53aGljaCB0byBNb3VzZUV2ZW50LmJ1dHRvbnMKICBsZXQgTU9VU0VfV0hJQ0hfVE9fQlVUVE9OUyA9IFswLCAxLCA0LCAyXTsKICBsZXQgTU9VU0VfSEFTX0JVVFRPTlMgPSAoZnVuY3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gbmV3IE1vdXNlRXZlbnQoJ3Rlc3QnLCB7YnV0dG9uczogMX0pLmJ1dHRvbnMgPT09IDE7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9KSgpOwoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQb3NzaWJsZSBtb3VzZSBldmVudCBuYW1lCiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBtb3VzZSBldmVudCwgZmFsc2UgaWYgbm90CiAgICovCiAgZnVuY3Rpb24gaXNNb3VzZUV2ZW50KG5hbWUpIHsKICAgIHJldHVybiBNT1VTRV9FVkVOVFMuaW5kZXhPZihuYW1lKSA+IC0xOwogIH0KCiAgLyogZXNsaW50IG5vLWVtcHR5OiBbImVycm9yIiwgeyAiYWxsb3dFbXB0eUNhdGNoIjogdHJ1ZSB9XSAqLwogIC8vIGNoZWNrIGZvciBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycwogIGxldCBTVVBQT1JUU19QQVNTSVZFID0gZmFsc2U7CiAgKGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgbGV0IG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge2dldCgpIHtTVVBQT1JUU19QQVNTSVZFID0gdHJ1ZTt9fSk7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICB9IGNhdGNoKGUpIHt9CiAgfSkoKTsKCiAgLyoqCiAgICogR2VuZXJhdGUgc2V0dGluZ3MgZm9yIGV2ZW50IGxpc3RlbmVycywgZGVwZW5kYW50IG9uIGBQb2x5bWVyLnBhc3NpdmVUb3VjaEdlc3R1cmVzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBFdmVudCBuYW1lIHRvIGRldGVybWluZSBpZiBge3Bhc3NpdmV9YCBvcHRpb24gaXMgbmVlZGVkCiAgICogQHJldHVybiB7e3Bhc3NpdmU6IGJvb2xlYW59IHwgdW5kZWZpbmVkfSBPcHRpb25zIHRvIHVzZSBmb3IgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAqLwogIGZ1bmN0aW9uIFBBU1NJVkVfVE9VQ0goZXZlbnROYW1lKSB7CiAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50TmFtZSkgfHwgZXZlbnROYW1lID09PSAndG91Y2hlbmQnKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChIQVNfTkFUSVZFX1RBICYmIFNVUFBPUlRTX1BBU1NJVkUgJiYgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcykgewogICAgICByZXR1cm4ge3Bhc3NpdmU6IHRydWV9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KCiAgLy8gQ2hlY2sgZm9yIHRvdWNoLW9ubHkgZGV2aWNlcwogIGxldCBJU19UT1VDSF9PTkxZID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKXxBbmRyb2lkLyk7CgogIGxldCBHZXN0dXJlUmVjb2duaXplciA9IGZ1bmN0aW9uKCl7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTogdm9pZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUucmVzZXQ7CiAgLyoqIEB0eXBlIHtmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vkb3duOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vtb3ZlOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2V1cDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihUb3VjaEV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLnRvdWNoc3RhcnQ7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaG1vdmU7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaGVuZDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLmNsaWNrOwoKICAvLyBrZWVwIHRyYWNrIG9mIGFueSBsYWJlbHMgaGl0IGJ5IHRoZSBtb3VzZUNhbmNlbGxlcgogIC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gKi8KICBjb25zdCBjbGlja2VkTGFiZWxzID0gW107CgogIC8qKiBAdHlwZSB7IU9iamVjdDxib29sZWFuPn0gKi8KICBjb25zdCBsYWJlbGxhYmxlID0gewogICAgJ2J1dHRvbic6IHRydWUsCiAgICAnaW5wdXQnOiB0cnVlLAogICAgJ2tleWdlbic6IHRydWUsCiAgICAnbWV0ZXInOiB0cnVlLAogICAgJ291dHB1dCc6IHRydWUsCiAgICAndGV4dGFyZWEnOiB0cnVlLAogICAgJ3Byb2dyZXNzJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlCiAgfTsKCiAgLy8gRGVmaW5lZCBhdCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNlbmFibGluZy1hbmQtZGlzYWJsaW5nLWZvcm0tY29udHJvbHM6LXRoZS1kaXNhYmxlZC1hdHRyaWJ1dGUKICAvKiogQHR5cGUgeyFPYmplY3Q8Ym9vbGVhbj59ICovCiAgY29uc3QgY2FuQmVEaXNhYmxlZCA9IHsKICAgICdidXR0b24nOiB0cnVlLAogICAgJ2NvbW1hbmQnOiB0cnVlLAogICAgJ2ZpZWxkc2V0JzogdHJ1ZSwKICAgICdpbnB1dCc6IHRydWUsCiAgICAna2V5Z2VuJzogdHJ1ZSwKICAgICdvcHRncm91cCc6IHRydWUsCiAgICAnb3B0aW9uJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlLAogICAgJ3RleHRhcmVhJzogdHJ1ZQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdG8gY2hlY2sgbGFiZWxsaW5nIHN0YXR1cwogICAqIEByZXR1cm4ge2Jvb2xlYW59IGVsZW1lbnQgY2FuIGhhdmUgbGFiZWxzCiAgICovCiAgZnVuY3Rpb24gY2FuQmVMYWJlbGxlZChlbCkgewogICAgcmV0dXJuIGxhYmVsbGFibGVbZWwubG9jYWxOYW1lXSB8fCBmYWxzZTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdGhhdCBtYXkgYmUgbGFiZWxsZWQuCiAgICogQHJldHVybiB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gUmVsZXZhbnQgbGFiZWwgZm9yIGBlbGAKICAgKi8KICBmdW5jdGlvbiBtYXRjaGluZ0xhYmVscyhlbCkgewogICAgbGV0IGxhYmVscyA9IEFycmF5LmZyb20oLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyhlbCkubGFiZWxzIHx8IFtdKTsKICAgIC8vIElFIGRvZXNuJ3QgaGF2ZSBgbGFiZWxzYCBhbmQgU2FmYXJpIGRvZXNuJ3QgcG9wdWxhdGUgYGxhYmVsc2AKICAgIC8vIGlmIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3dyb290LgogICAgLy8gSW4gdGhpcyBpbnN0YW5jZSwgZmluZGluZyB0aGUgbm9uLWFuY2VzdG9yIGxhYmVscyBpcyBlbm91Z2gsCiAgICAvLyBhcyB0aGUgbW91c2VDYW5jZWxsb3IgY29kZSB3aWxsIGhhbmRsZSBhbmNzdG9yIGxhYmVscwogICAgaWYgKCFsYWJlbHMubGVuZ3RoKSB7CiAgICAgIGxhYmVscyA9IFtdOwogICAgICBsZXQgcm9vdCA9IGVsLmdldFJvb3ROb2RlKCk7CiAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlkIG9uIGBlbGAsIGNoZWNrIGZvciBhbGwgbGFiZWxzIHdpdGggYSBtYXRjaGluZyBgZm9yYCBhdHRyaWJ1dGUKICAgICAgaWYgKGVsLmlkKSB7CiAgICAgICAgbGV0IG1hdGNoaW5nID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKGBsYWJlbFtmb3IgPSAke2VsLmlkfV1gKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsYWJlbHMucHVzaCgvKiogQHR5cGUgeyFIVE1MTGFiZWxFbGVtZW50fSAqLyhtYXRjaGluZ1tpXSkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGxhYmVsczsKICB9CgogIC8vIHRvdWNoIHdpbGwgbWFrZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgLy8gYHByZXZlbnREZWZhdWx0YCBvbiB0b3VjaGVuZCB3aWxsIGNhbmNlbCB0aGVtLAogIC8vIGJ1dCB0aGlzIGJyZWFrcyBgPGlucHV0PmAgZm9jdXMgYW5kIGxpbmsgY2xpY2tzCiAgLy8gZGlzYWJsZSBtb3VzZSBoYW5kbGVycyBmb3IgTU9VU0VfVElNRU9VVCBtcyBhZnRlcgogIC8vIGEgdG91Y2hlbmQgdG8gaWdub3JlIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICBsZXQgbW91c2VDYW5jZWxsZXIgPSBmdW5jdGlvbihtb3VzZUV2ZW50KSB7CiAgICAvLyBDaGVjayBmb3Igc291cmNlQ2FwYWJpbGl0aWVzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIHN5bnRoZXRpYyBldmVudHMKICAgIC8vIGlmIG1vdXNlRXZlbnQgZGlkIG5vdCBjb21lIGZyb20gYSBkZXZpY2UgdGhhdCBmaXJlcyB0b3VjaCBldmVudHMsCiAgICAvLyBpdCB3YXMgbWFkZSBieSBhIHJlYWwgbW91c2UgYW5kIHNob3VsZCBiZSBjb3VudGVkCiAgICAvLyBodHRwOi8vd2ljZy5naXRodWIuaW8vSW5wdXREZXZpY2VDYXBhYmlsaXRpZXMvI2RvbS1pbnB1dGRldmljZWNhcGFiaWxpdGllcy1maXJlc3RvdWNoZXZlbnRzCiAgICBsZXQgc2MgPSBtb3VzZUV2ZW50LnNvdXJjZUNhcGFiaWxpdGllczsKICAgIGlmIChzYyAmJiAhc2MuZmlyZXNUb3VjaEV2ZW50cykgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBza2lwIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICAgIG1vdXNlRXZlbnRbSEFORExFRF9PQkpdID0ge3NraXA6IHRydWV9OwogICAgLy8gZGlzYWJsZSAiZ2hvc3QgY2xpY2tzIgogICAgaWYgKG1vdXNlRXZlbnQudHlwZSA9PT0gJ2NsaWNrJykgewogICAgICBsZXQgY2xpY2tGcm9tTGFiZWwgPSBmYWxzZTsKICAgICAgbGV0IHBhdGggPSBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCAmJiBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICBpZiAocGF0aCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHBhdGhbaV0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIGlmIChwYXRoW2ldLmxvY2FsTmFtZSA9PT0gJ2xhYmVsJykgewogICAgICAgICAgICAgIGNsaWNrZWRMYWJlbHMucHVzaChwYXRoW2ldKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5CZUxhYmVsbGVkKHBhdGhbaV0pKSB7CiAgICAgICAgICAgICAgbGV0IG93bmVyTGFiZWxzID0gbWF0Y2hpbmdMYWJlbHMocGF0aFtpXSk7CiAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9mIHRoZSBjbGlja2VkIGxhYmVscyBpcyBsYWJlbGxpbmcgdGhpcyBlbGVtZW50CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25lckxhYmVscy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgY2xpY2tGcm9tTGFiZWwgPSBjbGlja0Zyb21MYWJlbCB8fCBjbGlja2VkTGFiZWxzLmluZGV4T2Yob3duZXJMYWJlbHNbal0pID4gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGF0aFtpXSA9PT0gUE9JTlRFUlNUQVRFLm1vdXNlLnRhcmdldCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGlmIG9uZSBvZiB0aGUgY2xpY2tlZCBsYWJlbHMgd2FzIGxhYmVsbGluZyB0aGUgdGFyZ2V0IGVsZW1lbnQsCiAgICAgIC8vIHRoaXMgaXMgbm90IGEgZ2hvc3QgY2xpY2sKICAgICAgaWYgKGNsaWNrRnJvbUxhYmVsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgbW91c2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXR1cCBUcnVlIHRvIGFkZCwgZmFsc2UgdG8gcmVtb3ZlLgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgZnVuY3Rpb24gc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHNldHVwKSB7CiAgICBsZXQgZXZlbnRzID0gSVNfVE9VQ0hfT05MWSA/IFsnY2xpY2snXSA6IE1PVVNFX0VWRU5UUzsKICAgIGZvciAobGV0IGkgPSAwLCBlbjsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewogICAgICBlbiA9IGV2ZW50c1tpXTsKICAgICAgaWYgKHNldHVwKSB7CiAgICAgICAgLy8gcmVzZXQgY2xpY2tMYWJlbHMgYXJyYXkKICAgICAgICBjbGlja2VkTGFiZWxzLmxlbmd0aCA9IDA7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlbiwgbW91c2VDYW5jZWxsZXIsIHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZW4sIG1vdXNlQ2FuY2VsbGVyLCB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaWdub3JlTW91c2UoZSkgewogICAgaWYgKCFQT0lOVEVSU1RBVEUubW91c2UubW91c2VJZ25vcmVKb2IpIHsKICAgICAgc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHRydWUpOwogICAgfQogICAgbGV0IHVuc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcigpOwogICAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gbnVsbDsKICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iID0gbnVsbDsKICAgIH07CiAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gZS5jb21wb3NlZFBhdGgoKVswXTsKICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYiA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iCiAgICAgICAgLCBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuYWZ0ZXIoTU9VU0VfVElNRU9VVCkKICAgICAgICAsIHVuc2V0KTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXYgZXZlbnQgdG8gdGVzdCBmb3IgbGVmdCBtb3VzZSBidXR0b24gZG93bgogICAqIEByZXR1cm4ge2Jvb2xlYW59IGhhcyBsZWZ0IG1vdXNlIGJ1dHRvbiBkb3duCiAgICovCiAgZnVuY3Rpb24gaGFzTGVmdE1vdXNlQnV0dG9uKGV2KSB7CiAgICBsZXQgdHlwZSA9IGV2LnR5cGU7CiAgICAvLyBleGl0IGVhcmx5IGlmIHRoZSBldmVudCBpcyBub3QgYSBtb3VzZSBldmVudAogICAgaWYgKCFpc01vdXNlRXZlbnQodHlwZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gZXYuYnV0dG9uIGlzIG5vdCByZWxpYWJsZSBmb3IgbW91c2Vtb3ZlICgwIGlzIG92ZXJsb2FkZWQgYXMgYm90aCBsZWZ0IGJ1dHRvbiBhbmQgbm8gYnV0dG9ucykKICAgIC8vIGluc3RlYWQgd2UgdXNlIGV2LmJ1dHRvbnMgKGJpdG1hc2sgb2YgYnV0dG9ucykgb3IgZmFsbCBiYWNrIHRvIGV2LndoaWNoIChkZXByZWNhdGVkLCAwIGZvciBubyBidXR0b25zLCAxIGZvciBsZWZ0IGJ1dHRvbikKICAgIGlmICh0eXBlID09PSAnbW91c2Vtb3ZlJykgewogICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZm9yIHRlc3RpbmcgZXZlbnRzCiAgICAgIGxldCBidXR0b25zID0gZXYuYnV0dG9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IGV2LmJ1dHRvbnM7CiAgICAgIGlmICgoZXYgaW5zdGFuY2VvZiB3aW5kb3cuTW91c2VFdmVudCkgJiYgIU1PVVNFX0hBU19CVVRUT05TKSB7CiAgICAgICAgYnV0dG9ucyA9IE1PVVNFX1dISUNIX1RPX0JVVFRPTlNbZXYud2hpY2hdIHx8IDA7CiAgICAgIH0KICAgICAgLy8gYnV0dG9ucyBpcyBhIGJpdG1hc2ssIGNoZWNrIHRoYXQgdGhlIGxlZnQgYnV0dG9uIGJpdCBpcyBzZXQgKDEpCiAgICAgIHJldHVybiBCb29sZWFuKGJ1dHRvbnMgJiAxKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGFsbG93IHVuZGVmaW5lZCBmb3IgdGVzdGluZyBldmVudHMKICAgICAgbGV0IGJ1dHRvbiA9IGV2LmJ1dHRvbiA9PT0gdW5kZWZpbmVkID8gMCA6IGV2LmJ1dHRvbjsKICAgICAgLy8gZXYuYnV0dG9uIGlzIDAgaW4gbW91c2Vkb3duL21vdXNldXAvY2xpY2sgZm9yIGxlZnQgYnV0dG9uIGFjdGl2YXRpb24KICAgICAgcmV0dXJuIGJ1dHRvbiA9PT0gMDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzU3ludGhldGljQ2xpY2soZXYpIHsKICAgIGlmIChldi50eXBlID09PSAnY2xpY2snKSB7CiAgICAgIC8vIGV2LmRldGFpbCBpcyAwIGZvciBIVE1MRWxlbWVudC5jbGljayBpbiBtb3N0IGJyb3dzZXJzCiAgICAgIGlmIChldi5kZXRhaWwgPT09IDApIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICAvLyBpbiB0aGUgd29yc3QgY2FzZSwgY2hlY2sgdGhhdCB0aGUgeC95IHBvc2l0aW9uIG9mIHRoZSBjbGljayBpcyB3aXRoaW4KICAgICAgLy8gdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudAogICAgICAvLyBUaGFua3MgSUUgMTAgPjooCiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChldik7CiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBpcyBhbiBlbGVtZW50IHNvIHdlIGNhbiB1c2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0LAogICAgICAvLyBpZiBub3QsIGp1c3QgYXNzdW1lIGl0IGlzIGEgc3ludGhldGljIGNsaWNrCiAgICAgIGlmICghdC5ub2RlVHlwZSB8fCAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCBiY3IgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAvLyB1c2UgcGFnZSB4L3kgdG8gYWNjb3VudCBmb3Igc2Nyb2xsaW5nCiAgICAgIGxldCB4ID0gZXYucGFnZVgsIHkgPSBldi5wYWdlWTsKICAgICAgLy8gZXYgaXMgYSBzeW50aGV0aWMgY2xpY2sgaWYgdGhlIHBvc2l0aW9uIGlzIG91dHNpZGUgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0CiAgICAgIHJldHVybiAhKCh4ID49IGJjci5sZWZ0ICYmIHggPD0gYmNyLnJpZ2h0KSAmJiAoeSA+PSBiY3IudG9wICYmIHkgPD0gYmNyLmJvdHRvbSkpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgbGV0IFBPSU5URVJTVEFURSA9IHsKICAgIG1vdXNlOiB7CiAgICAgIHRhcmdldDogbnVsbCwKICAgICAgbW91c2VJZ25vcmVKb2I6IG51bGwKICAgIH0sCiAgICB0b3VjaDogewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICBpZDogLTEsCiAgICAgIHNjcm9sbERlY2lkZWQ6IGZhbHNlCiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gZmlyc3RUb3VjaEFjdGlvbihldikgewogICAgbGV0IHRhID0gJ2F1dG8nOwogICAgbGV0IHBhdGggPSBldi5jb21wb3NlZFBhdGggJiYgZXYuY29tcG9zZWRQYXRoKCk7CiAgICBpZiAocGF0aCkgewogICAgICBmb3IgKGxldCBpID0gMCwgbjsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICBuID0gcGF0aFtpXTsKICAgICAgICBpZiAobltUT1VDSF9BQ1RJT05dKSB7CiAgICAgICAgICB0YSA9IG5bVE9VQ0hfQUNUSU9OXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhOwogIH0KCiAgZnVuY3Rpb24gdHJhY2tEb2N1bWVudChzdGF0ZU9iaiwgbW92ZWZuLCB1cGZuKSB7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBtb3ZlZm47CiAgICBzdGF0ZU9iai51cGZuID0gdXBmbjsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdmVmbik7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdXBmbik7CiAgfQoKICBmdW5jdGlvbiB1bnRyYWNrRG9jdW1lbnQoc3RhdGVPYmopIHsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0YXRlT2JqLm1vdmVmbik7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc3RhdGVPYmoudXBmbik7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBudWxsOwogICAgc3RhdGVPYmoudXBmbiA9IG51bGw7CiAgfQoKICAvLyB1c2UgYSBkb2N1bWVudC13aWRlIHRvdWNoZW5kIGxpc3RlbmVyIHRvIHN0YXJ0IHRoZSBnaG9zdC1jbGljayBwcmV2ZW50aW9uIG1lY2hhbmlzbQogIC8vIFVzZSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycywgaWYgc3VwcG9ydGVkLCB0byBub3QgYWZmZWN0IHNjcm9sbGluZyBwZXJmb3JtYW5jZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaWdub3JlTW91c2UsIFNVUFBPUlRTX1BBU1NJVkUgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZSk7CgogIC8qKgogICAqIE1vZHVsZSBmb3IgYWRkaW5nIGxpc3RlbmVycyB0byBhIG5vZGUgZm9yIHRoZSBmb2xsb3dpbmcgbm9ybWFsaXplZAogICAqIGNyb3NzLXBsYXRmb3JtICJnZXN0dXJlIiBldmVudHM6CiAgICogLSBgZG93bmAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IGRvd24KICAgKiAtIGB1cGAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IHVwCiAgICogLSBgdGFwYCAtIG1vdXNlIGNsaWNrIG9yIGZpbmdlciB0YXAKICAgKiAtIGB0cmFja2AgLSBtb3VzZSBkcmFnIG9yIHRvdWNoIG1vdmUKICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSBmb3IgYWRkaW5nIGNyb3NzLXBsYXRmb3JtIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJzLgogICAqLwogIGNvbnN0IEdlc3R1cmVzID0gewogICAgZ2VzdHVyZXM6IHt9LAogICAgcmVjb2duaXplcnM6IFtdLAoKICAgIC8qKgogICAgICogRmluZHMgdGhlIGVsZW1lbnQgcmVuZGVyZWQgb24gdGhlIHNjcmVlbiBhdCB0aGUgcHJvdmlkZWQgY29vcmRpbmF0ZXMuCiAgICAgKgogICAgICogU2ltaWxhciB0byBgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludGAsIGJ1dCBwaWVyY2VzIHRocm91Z2gKICAgICAqIHNoYWRvdyByb290cy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHtudW1iZXJ9IHggSG9yaXpvbnRhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBWZXJ0aWNhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBkZWVwZXN0IHNoYWRvd1Jvb3QgaW5jbHVzaXZlIGVsZW1lbnQKICAgICAqIGZvdW5kIGF0IHRoZSBzY3JlZW4gcG9zaXRpb24gZ2l2ZW4uCiAgICAgKi8KICAgIGRlZXBUYXJnZXRGaW5kOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKICAgICAgbGV0IG5leHQgPSBub2RlOwogICAgICAvLyB0aGlzIGNvZGUgcGF0aCBpcyBvbmx5IHRha2VuIHdoZW4gbmF0aXZlIFNoYWRvd0RPTSBpcyB1c2VkCiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgc2hhZG93cm9vdCwgaXQgbWF5IGhhdmUgYSBub2RlIGF0IHgveQogICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYSBzaGFkb3dyb290LCBleGl0IHRoZSBsb29wCiAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQuc2hhZG93Um9vdCAmJiAhd2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBub2RlIGF0IHgveSBpbiB0aGUgc2hhZG93cm9vdCwgbG9vayBkZWVwZXIKICAgICAgICBsZXQgb2xkTmV4dCA9IG5leHQ7CiAgICAgICAgbmV4dCA9IG5leHQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgICAgIC8vIG9uIFNhZmFyaSwgZWxlbWVudEZyb21Qb2ludCBtYXkgcmV0dXJuIHRoZSBzaGFkb3dSb290IGhvc3QKICAgICAgICBpZiAob2xkTmV4dCA9PT0gbmV4dCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICBub2RlID0gbmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LAogICAgLyoqCiAgICAgKiBhIGNoZWFwZXIgY2hlY2sgdGhhbiBldi5jb21wb3NlZFBhdGgoKVswXTsKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHtFdmVudFRhcmdldH0gUmV0dXJucyB0aGUgZXZlbnQgdGFyZ2V0LgogICAgICovCiAgICBfZmluZE9yaWdpbmFsVGFyZ2V0OiBmdW5jdGlvbihldikgewogICAgICAvLyBzaGFkb3dkb20KICAgICAgaWYgKGV2LmNvbXBvc2VkUGF0aCkgewogICAgICAgIGNvbnN0IHRhcmdldHMgPSAvKiogQHR5cGUgeyFBcnJheTwhRXZlbnRUYXJnZXQ+fSAqLyhldi5jb21wb3NlZFBhdGgoKSk7CiAgICAgICAgLy8gSXQgc2hvdWxkbid0IGJlLCBidXQgc29tZXRpbWVzIHRhcmdldHMgaXMgZW1wdHkgKHdpbmRvdyBvbiBTYWZhcmkpLgogICAgICAgIHJldHVybiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzWzBdIDogZXYudGFyZ2V0OwogICAgICB9CiAgICAgIC8vIHNoYWR5ZG9tCiAgICAgIHJldHVybiBldi50YXJnZXQ7CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2hhbmRsZU5hdGl2ZTogZnVuY3Rpb24oZXYpIHsKICAgICAgbGV0IGhhbmRsZWQ7CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgbGV0IG5vZGUgPSBldi5jdXJyZW50VGFyZ2V0OwogICAgICBsZXQgZ29iaiA9IG5vZGVbR0VTVFVSRV9LRVldOwogICAgICBpZiAoIWdvYmopIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGdzID0gZ29ialt0eXBlXTsKICAgICAgaWYgKCFncykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWV2W0hBTkRMRURfT0JKXSkgewogICAgICAgIGV2W0hBTkRMRURfT0JKXSA9IHt9OwogICAgICAgIGlmICh0eXBlLnNsaWNlKDAsIDUpID09PSAndG91Y2gnKSB7CiAgICAgICAgICBldiA9IC8qKiBAdHlwZSB7VG91Y2hFdmVudH0gKi8oZXYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICBsZXQgdCA9IGV2LmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgICAgICAvLyBvbmx5IGhhbmRsZSB0aGUgZmlyc3QgZmluZ2VyCiAgICAgICAgICAgIGlmIChldi50b3VjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5pZCA9IHQuaWRlbnRpZmllcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKFBPSU5URVJTVEFURS50b3VjaC5pZCAhPT0gdC5pZGVudGlmaWVyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghSEFTX05BVElWRV9UQSkgewogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IHR5cGUgPT09ICd0b3VjaG1vdmUnKSB7CiAgICAgICAgICAgICAgR2VzdHVyZXMuX2hhbmRsZVRvdWNoQWN0aW9uKGV2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBoYW5kbGVkID0gZXZbSEFORExFRF9PQkpdOwogICAgICAvLyB1c2VkIHRvIGlnbm9yZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgICAgIGlmIChoYW5kbGVkLnNraXApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gcmVzZXQgcmVjb2duaXplciBzdGF0ZQogICAgICBmb3IgKGxldCBpID0gMCwgcjsgaSA8IEdlc3R1cmVzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IEdlc3R1cmVzLnJlY29nbml6ZXJzW2ldOwogICAgICAgIGlmIChnc1tyLm5hbWVdICYmICFoYW5kbGVkW3IubmFtZV0pIHsKICAgICAgICAgIGlmIChyLmZsb3cgJiYgci5mbG93LnN0YXJ0LmluZGV4T2YoZXYudHlwZSkgPiAtMSAmJiByLnJlc2V0KSB7CiAgICAgICAgICAgIHIucmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gZW5mb3JjZSBnZXN0dXJlIHJlY29nbml6ZXIgb3JkZXIKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCBHZXN0dXJlcy5yZWNvZ25pemVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHIgPSBHZXN0dXJlcy5yZWNvZ25pemVyc1tpXTsKICAgICAgICBpZiAoZ3Nbci5uYW1lXSAmJiAhaGFuZGxlZFtyLm5hbWVdKSB7CiAgICAgICAgICBoYW5kbGVkW3IubmFtZV0gPSB0cnVlOwogICAgICAgICAgclt0eXBlXShldik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfaGFuZGxlVG91Y2hBY3Rpb246IGZ1bmN0aW9uKGV2KSB7CiAgICAgIGxldCB0ID0gZXYuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC54ID0gdC5jbGllbnRYOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC55ID0gdC5jbGllbnRZOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5zY3JvbGxEZWNpZGVkID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RvdWNobW92ZScpIHsKICAgICAgICBpZiAoUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQgPSB0cnVlOwogICAgICAgIGxldCB0YSA9IGZpcnN0VG91Y2hBY3Rpb24oZXYpOwogICAgICAgIGxldCBwcmV2ZW50ID0gZmFsc2U7CiAgICAgICAgbGV0IGR4ID0gTWF0aC5hYnMoUE9JTlRFUlNUQVRFLnRvdWNoLnggLSB0LmNsaWVudFgpOwogICAgICAgIGxldCBkeSA9IE1hdGguYWJzKFBPSU5URVJTVEFURS50b3VjaC55IC0gdC5jbGllbnRZKTsKICAgICAgICBpZiAoIWV2LmNhbmNlbGFibGUpIHsKICAgICAgICAgIC8vIHNjcm9sbGluZyBpcyBoYXBwZW5pbmcKICAgICAgICB9IGVsc2UgaWYgKHRhID09PSAnbm9uZScpIHsKICAgICAgICAgIHByZXZlbnQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teCcpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeSA+IGR4OwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teScpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeCA+IGR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJldmVudCkgewogICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndHJhY2snKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgbm9kZSBmb3IgdGhlIGdpdmVuIGdlc3R1cmUgdHlwZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiB0byBjYWxsCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyBhZGRlZC4KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKG5vZGUsIGV2VHlwZSwgaGFuZGxlcikgewogICAgICBpZiAodGhpcy5nZXN0dXJlc1tldlR5cGVdKSB7CiAgICAgICAgdGhpcy5fYWRkKG5vZGUsIGV2VHlwZSwgaGFuZGxlcik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhIG5vZGUgZm9yIHRoZSBnaXZlbiBnZXN0dXJlIHR5cGUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byByZW1vdmUgbGlzdGVuZXIgZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiBwcmV2aW91c2x5IHBhc3NlZCB0bwogICAgICogIGBhZGRMaXN0ZW5lcmAuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGlmICh0aGlzLmdlc3R1cmVzW2V2VHlwZV0pIHsKICAgICAgICB0aGlzLl9yZW1vdmUobm9kZSwgZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgdGhlIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG5hdGl2ZSBldmVudHMKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG5vZGUgTm9kZSBvbiB3aGljaCB0byBhZGQgdGhlIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBFdmVudCB0eXBlIHRvIGFkZC4KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KX0gaGFuZGxlciBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgX2FkZDogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGxldCByZWNvZ25pemVyID0gdGhpcy5nZXN0dXJlc1tldlR5cGVdOwogICAgICBsZXQgZGVwcyA9IHJlY29nbml6ZXIuZGVwczsKICAgICAgbGV0IG5hbWUgPSByZWNvZ25pemVyLm5hbWU7CiAgICAgIGxldCBnb2JqID0gbm9kZVtHRVNUVVJFX0tFWV07CiAgICAgIGlmICghZ29iaikgewogICAgICAgIG5vZGVbR0VTVFVSRV9LRVldID0gZ29iaiA9IHt9OwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBkZXAsIGdkOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykgewogICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgLy8gZG9uJ3QgYWRkIG1vdXNlIGhhbmRsZXJzIG9uIGlPUyBiZWNhdXNlIHRoZXkgY2F1c2UgZ3JheSBzZWxlY3Rpb24gb3ZlcmxheXMKICAgICAgICBpZiAoSVNfVE9VQ0hfT05MWSAmJiBpc01vdXNlRXZlbnQoZGVwKSAmJiBkZXAgIT09ICdjbGljaycpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICBpZiAoIWdkKSB7CiAgICAgICAgICBnb2JqW2RlcF0gPSBnZCA9IHtfY291bnQ6IDB9OwogICAgICAgIH0KICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZGVwLCB0aGlzLl9oYW5kbGVOYXRpdmUsIFBBU1NJVkVfVE9VQ0goZGVwKSk7CiAgICAgICAgfQogICAgICAgIGdkW25hbWVdID0gKGdkW25hbWVdIHx8IDApICsgMTsKICAgICAgICBnZC5fY291bnQgPSAoZ2QuX2NvdW50IHx8IDApICsgMTsKICAgICAgfQogICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgaWYgKHJlY29nbml6ZXIudG91Y2hBY3Rpb24pIHsKICAgICAgICB0aGlzLnNldFRvdWNoQWN0aW9uKG5vZGUsIHJlY29nbml6ZXIudG91Y2hBY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgZXZlbnQgbGlzdGVuZXIgcmVtb3ZhbCBmb3IgbmF0aXZlIGV2ZW50cwogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gbm9kZSBOb2RlIG9uIHdoaWNoIHRvIHJlbW92ZSB0aGUgZXZlbnQuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZUeXBlIEV2ZW50IHR5cGUgdG8gcmVtb3ZlLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihFdmVudD8pfSBoYW5kbGVyIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfcmVtb3ZlOiBmdW5jdGlvbihub2RlLCBldlR5cGUsIGhhbmRsZXIpIHsKICAgICAgbGV0IHJlY29nbml6ZXIgPSB0aGlzLmdlc3R1cmVzW2V2VHlwZV07CiAgICAgIGxldCBkZXBzID0gcmVjb2duaXplci5kZXBzOwogICAgICBsZXQgbmFtZSA9IHJlY29nbml6ZXIubmFtZTsKICAgICAgbGV0IGdvYmogPSBub2RlW0dFU1RVUkVfS0VZXTsKICAgICAgaWYgKGdvYmopIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgZGVwLCBnZDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICAgIGlmIChnZCAmJiBnZFtuYW1lXSkgewogICAgICAgICAgICBnZFtuYW1lXSA9IChnZFtuYW1lXSB8fCAxKSAtIDE7CiAgICAgICAgICAgIGdkLl9jb3VudCA9IChnZC5fY291bnQgfHwgMSkgLSAxOwogICAgICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGRlcCwgdGhpcy5faGFuZGxlTmF0aXZlLCBQQVNTSVZFX1RPVUNIKGRlcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldlR5cGUsIGhhbmRsZXIpOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIG5ldyBnZXN0dXJlIGV2ZW50IHJlY29nbml6ZXIgZm9yIGFkZGluZyBuZXcgY3VzdG9tCiAgICAgKiBnZXN0dXJlIGV2ZW50IHR5cGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcGFyYW0geyFHZXN0dXJlUmVjb2duaXplcn0gcmVjb2cgR2VzdHVyZSByZWNvZ25pemVyIGRlc2NyaXB0b3IKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihyZWNvZykgewogICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2cpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29nLmVtaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXN0dXJlc1tyZWNvZy5lbWl0c1tpXV0gPSByZWNvZzsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZOYW1lIEV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdlc3R1cmUgZm9yIHRoZSBnaXZlbiBldmVudCBuYW1lLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfZmluZFJlY29nbml6ZXJCeUV2ZW50OiBmdW5jdGlvbihldk5hbWUpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCB0aGlzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IHRoaXMucmVjb2duaXplcnNbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIG47IGogPCByLmVtaXRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBuID0gci5lbWl0c1tqXTsKICAgICAgICAgIGlmIChuID09PSBldk5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICAvKioKICAgICAqIFNldHMgc2Nyb2xsaW5nIGRpcmVjdGlvbiBvbiBub2RlLgogICAgICoKICAgICAqIFRoaXMgdmFsdWUgaXMgY2hlY2tlZCBvbiBmaXJzdCBtb3ZlLCB0aHVzIGl0IHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8KICAgICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG5vZGUgTm9kZSB0byBzZXQgdG91Y2ggYWN0aW9uIHNldHRpbmcgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUb3VjaCBhY3Rpb24gdmFsdWUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldFRvdWNoQWN0aW9uOiBmdW5jdGlvbihub2RlLCB2YWx1ZSkgewogICAgICBpZiAoSEFTX05BVElWRV9UQSkgewogICAgICAgIC8vIE5PVEU6IGFkZCB0b3VjaEFjdGlvbiBhc3luYyBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQgaW4KICAgICAgICAvLyBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcnMuIE90aGVyd2lzZSB3ZSBydW4gYWZvdWwgb2YgY3VzdG9tCiAgICAgICAgLy8gZWxlbWVudHMgcmVzdHJpY3Rpb24gYWdhaW5zdCBzZXR0aW5ncyBhdHRyaWJ1dGVzIChzdHlsZSkgaW4gdGhlCiAgICAgICAgLy8gY29uc3RydWN0b3IuCiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgIG5vZGUuc3R5bGUudG91Y2hBY3Rpb24gPSB2YWx1ZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBub2RlW1RPVUNIX0FDVElPTl0gPSB2YWx1ZTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9uIHRoZSBgdGFyZ2V0YCBlbGVtZW50IG9mIGB0eXBlYCB3aXRoIHRoZSBnaXZlbgogICAgICogYGRldGFpbGAuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IHRhcmdldCBUaGUgZWxlbWVudCBvbiB3aGljaCB0byBmaXJlIGFuIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gZmlyZS4KICAgICAqIEBwYXJhbSB7IU9iamVjdD19IGRldGFpbCBUaGUgZGV0YWlsIG9iamVjdCB0byBwb3B1bGF0ZSBvbiB0aGUgZXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odGFyZ2V0LCB0eXBlLCBkZXRhaWwpIHsKICAgICAgbGV0IGV2ID0gbmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSk7CiAgICAgIGV2LmRldGFpbCA9IGRldGFpbDsKICAgICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXYpOwogICAgICAvLyBmb3J3YXJkIGBwcmV2ZW50RGVmYXVsdGAgaW4gYSBjbGVhbiB3YXkKICAgICAgaWYgKGV2LmRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICBsZXQgcHJldmVudGVyID0gZGV0YWlsLnByZXZlbnRlciB8fCBkZXRhaWwuc291cmNlRXZlbnQ7CiAgICAgICAgaWYgKHByZXZlbnRlciAmJiBwcmV2ZW50ZXIucHJldmVudERlZmF1bHQpIHsKICAgICAgICAgIHByZXZlbnRlci5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFByZXZlbnRzIHRoZSBkaXNwYXRjaCBhbmQgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGdpdmVuIGV2ZW50IG5hbWUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldk5hbWUgRXZlbnQgbmFtZS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHByZXZlbnQ6IGZ1bmN0aW9uKGV2TmFtZSkgewogICAgICBsZXQgcmVjb2duaXplciA9IHRoaXMuX2ZpbmRSZWNvZ25pemVyQnlFdmVudChldk5hbWUpOwogICAgICBpZiAocmVjb2duaXplci5pbmZvKSB7CiAgICAgICAgcmVjb2duaXplci5pbmZvLnByZXZlbnQgPSB0cnVlOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogUmVzZXQgdGhlIDI1MDBtcyB0aW1lb3V0IG9uIHByb2Nlc3NpbmcgbW91c2UgaW5wdXQgYWZ0ZXIgZGV0ZWN0aW5nIHRvdWNoIGlucHV0LgogICAgICoKICAgICAqIFRvdWNoIGlucHV0cyBjcmVhdGUgc3ludGhlc2l6ZWQgbW91c2UgaW5wdXRzIGFueXdoZXJlIGZyb20gMCB0byAyMDAwbXMgYWZ0ZXIgdGhlIHRvdWNoLgogICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0ZXN0aW5nIHdpdGggc2ltdWxhdGVkIHRvdWNoIGlucHV0cy4KICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaW4gcHJvZHVjdGlvbiBtYXkgY2F1c2UgZHVwbGljYXRlIHRhcHMgb3Igb3RoZXIgR2VzdHVyZXMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0TW91c2VDYW5jZWxsZXI6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iKSB7CiAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iLmZsdXNoKCk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAnZG93bnVwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ21vdXNldXAnLCAndG91Y2hlbmQnXQogICAgfSwKICAgIGVtaXRzOiBbJ2Rvd24nLCAndXAnXSwKCiAgICBpbmZvOiB7CiAgICAgIG1vdmVmbjogbnVsbCwKICAgICAgdXBmbjogbnVsbAogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdW50cmFja0RvY3VtZW50KHRoaXMuaW5mbyk7CiAgICB9LAoKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBtb3VzZWRvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgc2VsZiA9IHRoaXM7CiAgICAgIGxldCBtb3ZlZm4gPSBmdW5jdGlvbiBtb3ZlZm4oZSkgewogICAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICBzZWxmLl9maXJlKCd1cCcsIHQsIGUpOwogICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgIHNlbGYuX2ZpcmUoJ3VwJywgdCwgZSk7CiAgICAgICAgfQogICAgICAgIHVudHJhY2tEb2N1bWVudChzZWxmLmluZm8pOwogICAgICB9OwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5fZmlyZSgnZG93bicsIHQsIGUpOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuX2ZpcmUoJ2Rvd24nLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hlbmQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgdGhpcy5fZmlyZSgndXAnLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudAogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJldmVudGVyCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odHlwZSwgdGFyZ2V0LCBldmVudCwgcHJldmVudGVyKSB7CiAgICAgIEdlc3R1cmVzLl9maXJlKHRhcmdldCwgdHlwZSwgewogICAgICAgIHg6IGV2ZW50LmNsaWVudFgsCiAgICAgICAgeTogZXZlbnQuY2xpZW50WSwKICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsCiAgICAgICAgcHJldmVudGVyOiBwcmV2ZW50ZXIsCiAgICAgICAgcHJldmVudDogZnVuY3Rpb24oZSkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLnByZXZlbnQoZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKCiAgR2VzdHVyZXMucmVnaXN0ZXIoewogICAgbmFtZTogJ3RyYWNrJywKICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsCiAgICBkZXBzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCddLAogICAgZmxvdzogewogICAgICBzdGFydDogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLAogICAgICBlbmQ6IFsnbW91c2V1cCcsICd0b3VjaGVuZCddCiAgICB9LAogICAgZW1pdHM6IFsndHJhY2snXSwKCiAgICBpbmZvOiB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHN0YXRlOiAnc3RhcnQnLAogICAgICBzdGFydGVkOiBmYWxzZSwKICAgICAgbW92ZXM6IFtdLAogICAgICAvKiogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfSAqLwogICAgICBhZGRNb3ZlOiBmdW5jdGlvbihtb3ZlKSB7CiAgICAgICAgaWYgKHRoaXMubW92ZXMubGVuZ3RoID4gVFJBQ0tfTEVOR1RIKSB7CiAgICAgICAgICB0aGlzLm1vdmVzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubW92ZXMucHVzaChtb3ZlKTsKICAgICAgfSwKICAgICAgbW92ZWZuOiBudWxsLAogICAgICB1cGZuOiBudWxsLAogICAgICBwcmV2ZW50OiBmYWxzZQogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5pbmZvLnN0YXRlID0gJ3N0YXJ0JzsKICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pbmZvLm1vdmVzID0gW107CiAgICAgIHRoaXMuaW5mby54ID0gMDsKICAgICAgdGhpcy5pbmZvLnkgPSAwOwogICAgICB0aGlzLmluZm8ucHJldmVudCA9IGZhbHNlOwogICAgICB1bnRyYWNrRG9jdW1lbnQodGhpcy5pbmZvKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge251bWJlcn0geAogICAgICogQHBhcmFtIHtudW1iZXJ9IHkKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGhhc01vdmVkRW5vdWdoOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGlmICh0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodGhpcy5pbmZvLnN0YXJ0ZWQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgZHggPSBNYXRoLmFicyh0aGlzLmluZm8ueCAtIHgpOwogICAgICBsZXQgZHkgPSBNYXRoLmFicyh0aGlzLmluZm8ueSAtIHkpOwogICAgICByZXR1cm4gKGR4ID49IFRSQUNLX0RJU1RBTkNFIHx8IGR5ID49IFRSQUNLX0RJU1RBTkNFKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbW91c2Vkb3duOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IHNlbGYgPSB0aGlzOwogICAgICBsZXQgbW92ZWZuID0gZnVuY3Rpb24gbW92ZWZuKGUpIHsKICAgICAgICBsZXQgeCA9IGUuY2xpZW50WCwgeSA9IGUuY2xpZW50WTsKICAgICAgICBpZiAoc2VsZi5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgICAgLy8gZmlyc3QgbW92ZSBpcyAnc3RhcnQnLCBzdWJzZXF1ZW50IG1vdmVzIGFyZSAnbW92ZScsIG1vdXNldXAgaXMgJ2VuZCcKICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9IHNlbGYuaW5mby5zdGFydGVkID8gKGUudHlwZSA9PT0gJ21vdXNldXAnID8gJ2VuZCcgOiAndHJhY2snKSA6ICdzdGFydCc7CiAgICAgICAgICBpZiAoc2VsZi5pbmZvLnN0YXRlID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndGFwJyk7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxmLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgICAgLy8gYWx3YXlzIF9maXJlICJlbmQiCiAgICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgICAgICB1bnRyYWNrRG9jdW1lbnQoc2VsZi5pbmZvKTsKICAgICAgICAgIH0KICAgICAgICAgIHNlbGYuX2ZpcmUodCwgZSk7CiAgICAgICAgICBzZWxmLmluZm8uc3RhcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChzZWxmLmluZm8uc3RhcnRlZCkgewogICAgICAgICAgbW92ZWZuKGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgbGlzdGVuZXJzCiAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgIH07CiAgICAgIC8vIGFkZCB0ZW1wb3JhcnkgZG9jdW1lbnQgbGlzdGVuZXJzIGFzIG1vdXNlIHJldGFyZ2V0cwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5pbmZvLnggPSBlLmNsaWVudFg7CiAgICAgIHRoaXMuaW5mby55ID0gZS5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCBjdCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIHRoaXMuaW5mby54ID0gY3QuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBjdC5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaG1vdmU6IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgY3QgPSBlLmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICBsZXQgeCA9IGN0LmNsaWVudFgsIHkgPSBjdC5jbGllbnRZOwogICAgICBpZiAodGhpcy5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgIGlmICh0aGlzLmluZm8uc3RhdGUgPT09ICdzdGFydCcpIHsKICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgIEdlc3R1cmVzLnByZXZlbnQoJ3RhcCcpOwogICAgICAgIH0KICAgICAgICB0aGlzLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgIHRoaXMuX2ZpcmUodCwgY3QpOwogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICd0cmFjayc7CiAgICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSB0cnVlOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IGN0ID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgLy8gb25seSB0cmFja2VuZCBpZiB0cmFjayB3YXMgc3RhcnRlZCBhbmQgbm90IGFib3J0ZWQKICAgICAgaWYgKHRoaXMuaW5mby5zdGFydGVkKSB7CiAgICAgICAgLy8gcmVzZXQgc3RhcnRlZCBzdGF0ZSBvbiB1cAogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgIHRoaXMuaW5mby5hZGRNb3ZlKHt4OiBjdC5jbGllbnRYLCB5OiBjdC5jbGllbnRZfSk7CiAgICAgICAgdGhpcy5fZmlyZSh0LCBjdCwgZSk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2ZpcmU6IGZ1bmN0aW9uKHRhcmdldCwgdG91Y2gpIHsKICAgICAgbGV0IHNlY29uZGxhc3QgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDJdOwogICAgICBsZXQgbGFzdG1vdmUgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDFdOwogICAgICBsZXQgZHggPSBsYXN0bW92ZS54IC0gdGhpcy5pbmZvLng7CiAgICAgIGxldCBkeSA9IGxhc3Rtb3ZlLnkgLSB0aGlzLmluZm8ueTsKICAgICAgbGV0IGRkeCwgZGR5ID0gMDsKICAgICAgaWYgKHNlY29uZGxhc3QpIHsKICAgICAgICBkZHggPSBsYXN0bW92ZS54IC0gc2Vjb25kbGFzdC54OwogICAgICAgIGRkeSA9IGxhc3Rtb3ZlLnkgLSBzZWNvbmRsYXN0Lnk7CiAgICAgIH0KICAgICAgR2VzdHVyZXMuX2ZpcmUodGFyZ2V0LCAndHJhY2snLCB7CiAgICAgICAgc3RhdGU6IHRoaXMuaW5mby5zdGF0ZSwKICAgICAgICB4OiB0b3VjaC5jbGllbnRYLAogICAgICAgIHk6IHRvdWNoLmNsaWVudFksCiAgICAgICAgZHg6IGR4LAogICAgICAgIGR5OiBkeSwKICAgICAgICBkZHg6IGRkeCwKICAgICAgICBkZHk6IGRkeSwKICAgICAgICBzb3VyY2VFdmVudDogdG91Y2gsCiAgICAgICAgaG92ZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLmRlZXBUYXJnZXRGaW5kKHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogIH0pOwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAndGFwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ2NsaWNrJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ2NsaWNrJywgJ3RvdWNoZW5kJ10KICAgIH0sCiAgICBlbWl0czogWyd0YXAnXSwKICAgIGluZm86IHsKICAgICAgeDogTmFOLAogICAgICB5OiBOYU4sCiAgICAgIHByZXZlbnQ6IGZhbHNlCiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaW5mby54ID0gTmFOOwogICAgICB0aGlzLmluZm8ueSA9IE5hTjsKICAgICAgdGhpcy5pbmZvLnByZXZlbnQgPSBmYWxzZTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgc2F2ZTogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLmluZm8ueCA9IGUuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBlLmNsaWVudFk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIG1vdXNlZG93bjogZnVuY3Rpb24oZSkgewogICAgICBpZiAoaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgdGhpcy5zYXZlKGUpOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICB0aGlzLmZvcndhcmQoZSk7CiAgICAgIH0KICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLnNhdmUoZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuZm9yd2FyZChlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7RXZlbnQgfCBUb3VjaH0gZQogICAgICogQHBhcmFtIHtFdmVudD19IHByZXZlbnRlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZm9yd2FyZDogZnVuY3Rpb24oZSwgcHJldmVudGVyKSB7CiAgICAgIGxldCBkeCA9IE1hdGguYWJzKGUuY2xpZW50WCAtIHRoaXMuaW5mby54KTsKICAgICAgbGV0IGR5ID0gTWF0aC5hYnMoZS5jbGllbnRZIC0gdGhpcy5pbmZvLnkpOwogICAgICAvLyBmaW5kIG9yaWdpbmFsIHRhcmdldCBmcm9tIGBwcmV2ZW50ZXJgIGZvciBUb3VjaEV2ZW50cywgb3IgYGVgIGZvciBNb3VzZUV2ZW50cwogICAgICBsZXQgdCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQoLyoqIEB0eXBlIHtFdmVudH0gKi8ocHJldmVudGVyIHx8IGUpKTsKICAgICAgaWYgKCF0IHx8IChjYW5CZURpc2FibGVkWy8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0KS5sb2NhbE5hbWVdICYmIHQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBkeCxkeSBjYW4gYmUgTmFOIGlmIGBjbGlja2AgaGFzIGJlZW4gc2ltdWxhdGVkIGFuZCB0aGVyZSB3YXMgbm8gYGRvd25gIGZvciBgc3RhcnRgCiAgICAgIGlmIChpc05hTihkeCkgfHwgaXNOYU4oZHkpIHx8IChkeCA8PSBUQVBfRElTVEFOQ0UgJiYgZHkgPD0gVEFQX0RJU1RBTkNFKSB8fCBpc1N5bnRoZXRpY0NsaWNrKGUpKSB7CiAgICAgICAgLy8gcHJldmVudCB0YXBzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGlmIGFuIGV2ZW50IGhhcyBjYW5jZWxlZCB0aGVtCiAgICAgICAgaWYgKCF0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgICAgR2VzdHVyZXMuX2ZpcmUodCwgJ3RhcCcsIHsKICAgICAgICAgICAgeDogZS5jbGllbnRYLAogICAgICAgICAgICB5OiBlLmNsaWVudFksCiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBlLAogICAgICAgICAgICBwcmV2ZW50ZXI6IHByZXZlbnRlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSk7CgogIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldDsKCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuYWRkID0gR2VzdHVyZXMuYWRkTGlzdGVuZXI7CgogIC8qKiBAZGVwcmVjYXRlZCAqLwogIEdlc3R1cmVzLnJlbW92ZSA9IEdlc3R1cmVzLnJlbW92ZUxpc3RlbmVyOwoKICBQb2x5bWVyLkdlc3R1cmVzID0gR2VzdHVyZXM7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAY29uc3Qge1BvbHltZXIuR2VzdHVyZXN9CiAgICovCiAgY29uc3QgZ2VzdHVyZXMgPSBQb2x5bWVyLkdlc3R1cmVzOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMuCiAgICoKICAgKiBUaGUgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdmVycmlkZSBwb2ludHMgaW1wbGVtZW50ZWQKICAgKiBpbiBgUG9seW1lci5UZW1wbGF0ZVN0YW1wYCBzdWNoIHRoYXQgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzIGluCiAgICogdGVtcGxhdGVzIHdpbGwgc3VwcG9ydCBnZXN0dXJlIGV2ZW50cyB3aGVuIHRoaXMgbWl4aW4gaXMgYXBwbGllZCBhbG9uZyB3aXRoCiAgICogYFBvbHltZXIuVGVtcGxhdGVTdGFtcGAuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMKICAgKi8KICBQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfR2VzdHVyZUV2ZW50TGlzdGVuZXJzfQogICAgICovCiAgICBjbGFzcyBHZXN0dXJlRXZlbnRMaXN0ZW5lcnMgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIC8qKgogICAgICAgKiBBZGQgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIGlmIGl0IGlzIGEgZ2VzdHVyZXMgZXZlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIGFkZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5hZGRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSB0aGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgaWYgaXQgaXMgYSBnZXN0dXJlcyBldmVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5yZW1vdmVMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBHZXN0dXJlRXZlbnRMaXN0ZW5lcnM7CgogIH0pOwoKfSkoKTsKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBjb25zdCBIT1NUX0RJUiA9IC86aG9zdFwoOmRpclwoKGx0cnxydGwpXClcKS9nOwogICAgY29uc3QgSE9TVF9ESVJfUkVQTEFDTUVOVCA9ICc6aG9zdChbZGlyPSIkMSJdKSc7CgogICAgY29uc3QgRUxfRElSID0gLyhbXHNcdy0jXC5cW1xdXCpdKik6ZGlyXCgobHRyfHJ0bClcKS9nOwogICAgY29uc3QgRUxfRElSX1JFUExBQ01FTlQgPSAnOmhvc3QoW2Rpcj0iJDIiXSkgJDEnOwoKICAgIGNvbnN0IERJUl9DSEVDSyA9IC86ZGlyXCgoPzpsdHJ8cnRsKVwpLzsKICAgIAogICAgY29uc3QgU0hJTV9TSEFET1cgPSBCb29sZWFuKHdpbmRvd1snU2hhZHlET00nXSAmJiB3aW5kb3dbJ1NoYWR5RE9NJ11bJ2luVXNlJ10pOwoKICAgIC8qKgogICAgICogQHR5cGUgeyFBcnJheTwhUG9seW1lcl9EaXJNaXhpbj59CiAgICAgKi8KICAgIGNvbnN0IERJUl9JTlNUQU5DRVMgPSBbXTsKCiAgICAvKiogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9ICovCiAgICBsZXQgb2JzZXJ2ZXIgPSBudWxsOwoKICAgIGxldCBET0NVTUVOVF9ESVIgPSAnJzsKCiAgICBmdW5jdGlvbiBnZXRSVEwoKSB7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lcl9EaXJNaXhpbn0gaW5zdGFuY2UgSW5zdGFuY2UgdG8gc2V0IFJUTCBzdGF0dXMgb24KICAgICAqLwogICAgZnVuY3Rpb24gc2V0UlRMKGluc3RhbmNlKSB7CiAgICAgIGlmICghaW5zdGFuY2UuX19hdXRvRGlyT3B0T3V0KSB7CiAgICAgICAgY29uc3QgZWwgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdGFuY2UpOwogICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGlyJywgRE9DVU1FTlRfRElSKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURpcmVjdGlvbigpIHsKICAgICAgZ2V0UlRMKCk7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERJUl9JTlNUQU5DRVMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzZXRSVEwoRElSX0lOU1RBTkNFU1tpXSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0YWtlUmVjb3JkcygpIHsKICAgICAgaWYgKG9ic2VydmVyICYmIG9ic2VydmVyLnRha2VSZWNvcmRzKCkubGVuZ3RoKSB7CiAgICAgICAgdXBkYXRlRGlyZWN0aW9uKCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBhbGxvd3MgZWxlbWVudHMgdG8gdXNlIHRoZSBgOmRpcmAgQ1NTIFNlbGVjdG9yIHRvIGhhdmUKICAgICAqIHRleHQgZGlyZWN0aW9uIHNwZWNpZmljIHN0eWxpbmcuCiAgICAgKgogICAgICogV2l0aCB0aGlzIG1peGluLCBhbnkgc3R5bGVzaGVldCBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCB0cmFuc2Zvcm0gYDpkaXJgIGludG8KICAgICAqIGA6aG9zdChbZGlyXSlgIGFuZCBzeW5jIGRpcmVjdGlvbiB3aXRoIHRoZSBwYWdlIHZpYSB0aGUgZWxlbWVudCdzIGBkaXJgIGF0dHJpYnV0ZS4KICAgICAqCiAgICAgKiBFbGVtZW50cyBjYW4gb3B0IG91dCBvZiB0aGUgZ2xvYmFsIHBhZ2UgdGV4dCBkaXJlY3Rpb24gYnkgc2V0dGluZyB0aGUgYGRpcmAgYXR0cmlidXRlCiAgICAgKiBkaXJlY3RseSBpbiBgcmVhZHkoKWAgb3IgaW4gSFRNTC4KICAgICAqCiAgICAgKiBDYXZlYXRzOgogICAgICogLSBBcHBsaWNhdGlvbnMgbXVzdCBzZXQgYDxodG1sIGRpcj0ibHRyIj5gIG9yIGA8aHRtbCBkaXI9InJ0bCI+YCB0byBzeW5jIGRpcmVjdGlvbgogICAgICogLSBBdXRvbWF0aWMgbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0IHN0eWxpbmcgaXMgc3luYydkIHdpdGggdGhlIGA8aHRtbD5gIGVsZW1lbnQgb25seS4KICAgICAqIC0gQ2hhbmdpbmcgYGRpcmAgYXQgcnVudGltZSBpcyBzdXBwb3J0ZWQuCiAgICAgKiAtIE9wdGluZyBvdXQgb2YgdGhlIGdsb2JhbCBkaXJlY3Rpb24gc3R5bGluZyBpcyBwZXJtYW5lbnQKICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29ycwogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqLwogICAgUG9seW1lci5EaXJNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgICAgaWYgKCFTSElNX1NIQURPVykgewogICAgICAgIGlmICghb2JzZXJ2ZXIpIHsKICAgICAgICAgIGdldFJUTCgpOwogICAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVEaXJlY3Rpb24pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHthdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnZGlyJ119KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgY29uc3QgZWxlbWVudEJhc2UgPSBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzKGJhc2UpOwoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICAgKi8KICAgICAgY2xhc3MgRGlyIGV4dGVuZHMgZWxlbWVudEJhc2UgewoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3Byb2Nlc3NTdHlsZVRleHQoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICAgICAgY3NzVGV4dCA9IHN1cGVyLl9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpOwogICAgICAgICAgaWYgKCFTSElNX1NIQURPVyAmJiBESVJfQ0hFQ0sudGVzdChjc3NUZXh0KSkgewogICAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5fcmVwbGFjZURpckluQ3NzVGV4dChjc3NUZXh0KTsKICAgICAgICAgICAgdGhpcy5fX2FjdGl2YXRlRGlyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjc3NUZXh0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZSBgOmRpcmAgaW4gdGhlIGdpdmVuIENTUyB0ZXh0CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBDU1MgdGV4dCB0byByZXBsYWNlIERJUgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTW9kaWZpZWQgQ1NTCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIF9yZXBsYWNlRGlySW5Dc3NUZXh0KHRleHQpIHsKICAgICAgICAgIGxldCByZXBsYWNlZFRleHQgPSB0ZXh0OwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoSE9TVF9ESVIsIEhPU1RfRElSX1JFUExBQ01FTlQpOwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoRUxfRElSLCBFTF9ESVJfUkVQTEFDTUVOVCk7CiAgICAgICAgICByZXR1cm4gcmVwbGFjZWRUZXh0OwogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IGB0aGlzYCBpcyBhbiBIVE1MRWxlbWVudAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykuaGFzQXR0cmlidXRlKCdkaXInKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICB0YWtlUmVjb3JkcygpOwogICAgICAgICAgICBESVJfSU5TVEFOQ0VTLnB1c2godGhpcyk7CiAgICAgICAgICAgIHNldFJUTCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICBjb25zdCBpZHggPSBESVJfSU5TVEFOQ0VTLmluZGV4T2YodGhpcyk7CiAgICAgICAgICAgIGlmIChpZHggPiAtMSkgewogICAgICAgICAgICAgIERJUl9JTlNUQU5DRVMuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIERpci5fX2FjdGl2YXRlRGlyID0gZmFsc2U7CgogICAgICByZXR1cm4gRGlyOwogICAgfSk7CiAgfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIC8vIHJ1biBhIGNhbGxiYWNrIHdoZW4gSFRNTEltcG9ydHMgYXJlIHJlYWR5IG9yIGltbWVkaWF0ZWx5IGlmCiAgLy8gdGhpcyBhcGkgaXMgbm90IGF2YWlsYWJsZS4KICBmdW5jdGlvbiB3aGVuSW1wb3J0c1JlYWR5KGNiKSB7CiAgICBpZiAod2luZG93LkhUTUxJbXBvcnRzKSB7CiAgICAgIEhUTUxJbXBvcnRzLndoZW5SZWFkeShjYik7CiAgICB9IGVsc2UgewogICAgICBjYigpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbXBvcnRpbmcgYW4gSFRNTCBkb2N1bWVudCBpbXBlcmF0aXZlbHkuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IGA8bGluayByZWw9ImltcG9ydCI+YCBlbGVtZW50IHdpdGgKICAgKiB0aGUgcHJvdmlkZWQgVVJMIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCB0byBzdGFydCBsb2FkaW5nLgogICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgKiBlbGVtZW50IHdpbGwgY29udGFpbiB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQgY29udGVudHMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIFVSTCB0byBkb2N1bWVudCB0byBsb2FkLgogICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFdmVudCk6dm9pZD19IG9ubG9hZCBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQgc3VjY2Vzc2Z1bGx5CiAgICogICBsb2FkZWQuCiAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUVycm9yRXZlbnQpOnZvaWQ9fSBvbmVycm9yIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydAogICAqICAgdW5zdWNjZXNzZnVsbHkgbG9hZGVkLgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICogICBEZWZhdWx0cyB0byBgZmFsc2VgLgogICAqIEByZXR1cm4geyFIVE1MTGlua0VsZW1lbnR9IFRoZSBsaW5rIGVsZW1lbnQgZm9yIHRoZSBVUkwgdG8gYmUgbG9hZGVkLgogICAqLwogIFBvbHltZXIuaW1wb3J0SHJlZiA9IGZ1bmN0aW9uKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsKICAgIGxldCBsaW5rID0gLyoqIEB0eXBlIHtIVE1MTGlua0VsZW1lbnR9ICovCiAgICAgIChkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj0iJyArIGhyZWYgKyAnIl1baW1wb3J0LWhyZWZdJykpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIGxpbmsgPSAvKiogQHR5cGUge0hUTUxMaW5rRWxlbWVudH0gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKSk7CiAgICAgIGxpbmsucmVsID0gJ2ltcG9ydCc7CiAgICAgIGxpbmsuaHJlZiA9IGhyZWY7CiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdpbXBvcnQtaHJlZicsICcnKTsKICAgIH0KICAgIC8vIGFsd2F5cyBlbnN1cmUgbGluayBoYXMgYGFzeW5jYCBhdHRyaWJ1dGUgaWYgdXNlciBzcGVjaWZpZWQgb25lLAogICAgLy8gZXZlbiBpZiBpdCB3YXMgcHJldmlvdXNseSBub3QgYXN5bmMuIFRoaXMgaXMgY29uc2lkZXJlZCBsZXNzIGNvbmZ1c2luZy4KICAgIGlmIChvcHRBc3luYykgewogICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnYXN5bmMnLCAnJyk7CiAgICB9CiAgICAvLyBOT1RFOiB0aGUgbGluayBtYXkgbm93IGJlIGluIDMgc3RhdGVzOiAoMSkgcGVuZGluZyBpbnNlcnRpb24sCiAgICAvLyAoMikgaW5mbGlnaHQsICgzKSBhbHJlYWR5IGxvYWRlZC4gSW4gZWFjaCBjYXNlLCB3ZSBuZWVkIHRvIGFkZAogICAgLy8gZXZlbnQgbGlzdGVuZXJzIHRvIHByb2Nlc3MgY2FsbGJhY2tzLgogICAgbGV0IGNsZWFudXAgPSBmdW5jdGlvbigpIHsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgbG9hZExpc3RlbmVyKTsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgfTsKICAgIGxldCBsb2FkTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYSBzdWNjZXNzZnVsIGxvYWQsIGNhY2hlIHRoZSBsb2FkIGV2ZW50IG9uIHRoZSBsaW5rIHNvCiAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gc2hvcnQtY2lyY3VpdCB0aGlzIG1ldGhvZCBpbiB0aGUgZnV0dXJlIHdoZW4KICAgICAgLy8gaXQgaXMgY2FsbGVkIHdpdGggdGhlIHNhbWUgaHJlZiBwYXJhbS4KICAgICAgbGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQgPSB0cnVlOwogICAgICBpZiAob25sb2FkKSB7CiAgICAgICAgd2hlbkltcG9ydHNSZWFkeSgoKSA9PiB7CiAgICAgICAgICBvbmxvYWQoZXZlbnQpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgbGV0IGVycm9yTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHJlbW92ZSB0aGUgbGluayBmcm9tIHRoZSBkb2N1bWVudCBzbyB0aGF0IGl0CiAgICAgIC8vIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgYGltcG9ydEhyZWZgIGlzCiAgICAgIC8vIGNhbGxlZC4KICAgICAgaWYgKGxpbmsucGFyZW50Tm9kZSkgewogICAgICAgIGxpbmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5rKTsKICAgICAgfQogICAgICBpZiAob25lcnJvcikgewogICAgICAgIHdoZW5JbXBvcnRzUmVhZHkoKCkgPT4gewogICAgICAgICAgb25lcnJvcihldmVudCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkTGlzdGVuZXIpOwogICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgaWYgKGxpbmsucGFyZW50Tm9kZSA9PSBudWxsKSB7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7CiAgICAvLyBpZiB0aGUgbGluayBhbHJlYWR5IGxvYWRlZCwgZGlzcGF0Y2ggYSBmYWtlIGxvYWQgZXZlbnQKICAgIC8vIHNvIHRoYXQgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYW5kIGdldCBhIHByb3BlciBldmVudCBhcmd1bWVudC4KICAgIH0gZWxzZSBpZiAobGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQpIHsKICAgICAgbGluay5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZCcpKTsKICAgIH0KICAgIHJldHVybiBsaW5rOwogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IGJlZm9yZVJlbmRlclF1ZXVlID0gW107CiAgbGV0IGFmdGVyUmVuZGVyUXVldWUgPSBbXTsKCiAgZnVuY3Rpb24gc2NoZWR1bGUoKSB7CiAgICBzY2hlZHVsZWQgPSB0cnVlOwogICAgLy8gYmVmb3JlIG5leHQgcmVuZGVyCiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7CiAgICAgIHNjaGVkdWxlZCA9IGZhbHNlOwogICAgICBmbHVzaFF1ZXVlKGJlZm9yZVJlbmRlclF1ZXVlKTsKICAgICAgLy8gYWZ0ZXIgdGhlIHJlbmRlcgogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHJ1blF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hRdWV1ZShxdWV1ZSkgewogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewogICAgICBjYWxsTWV0aG9kKHF1ZXVlLnNoaWZ0KCkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcnVuUXVldWUocXVldWUpIHsKICAgIGZvciAobGV0IGk9MCwgbD1xdWV1ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgY2FsbE1ldGhvZChxdWV1ZS5zaGlmdCgpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhbGxNZXRob2QoaW5mbykgewogICAgY29uc3QgY29udGV4dCA9IGluZm9bMF07CiAgICBjb25zdCBjYWxsYmFjayA9IGluZm9bMV07CiAgICBjb25zdCBhcmdzID0gaW5mb1syXTsKICAgIHRyeSB7CiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwogICAgfSBjYXRjaChlKSB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRocm93IGU7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmx1c2goKSB7CiAgICB3aGlsZSAoYmVmb3JlUmVuZGVyUXVldWUubGVuZ3RoIHx8IGFmdGVyUmVuZGVyUXVldWUubGVuZ3RoKSB7CiAgICAgIGZsdXNoUXVldWUoYmVmb3JlUmVuZGVyUXVldWUpOwogICAgICBmbHVzaFF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgfQogICAgc2NoZWR1bGVkID0gZmFsc2U7CiAgfQoKICAvKioKICAgKiBNb2R1bGUgZm9yIHNjaGVkdWxpbmcgZmx1c2hhYmxlIHByZS1yZW5kZXIgYW5kIHBvc3QtcmVuZGVyIHRhc2tzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBzY2hlZHVsaW5nIGZsdXNoYWJsZSBwcmUtcmVuZGVyIGFuZCBwb3N0LXJlbmRlciB0YXNrcy4KICAgKi8KICBQb2x5bWVyLlJlbmRlclN0YXR1cyA9IHsKCiAgICAvKioKICAgICAqIEVucXVldWVzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBuZXh0IHJlbmRlciwgYXQKICAgICAqIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRpbWluZy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGVucXVldWluZyB3b3JrIHRoYXQgcmVxdWlyZXMgRE9NIG1lYXN1cmVtZW50LAogICAgICogc2luY2UgbWVhc3VyZW1lbnQgbWF5IG5vdCBiZSByZWxpYWJsZSBpbiBjdXN0b20gZWxlbWVudCBjYWxsYmFja3MgYmVmb3JlCiAgICAgKiB0aGUgZmlyc3QgcmVuZGVyLCBhcyB3ZWxsIGFzIGZvciBiYXRjaGluZyBtZWFzdXJlbWVudCB0YXNrcyBpbiBnZW5lcmFsLgogICAgICoKICAgICAqIFRhc2tzIGluIHRoaXMgcXVldWUgbWF5IGJlIGZsdXNoZWQgYnkgY2FsbGluZyBgUG9seW1lci5SZW5kZXJTdGF0dXMuZmx1c2goKWAuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBvYmplY3QgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgYm91bmQgdG8KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oLi4uKik6dm9pZH0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7IUFycmF5PX0gYXJncyBBbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgYmVmb3JlTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGJlZm9yZVJlbmRlclF1ZXVlLnB1c2goW2NvbnRleHQsIGNhbGxiYWNrLCBhcmdzXSk7CiAgICB9LAoKICAgIC8qKgogICAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB3aGljaCB3aWxsIGJlIHJ1biBhZnRlciB0aGUgbmV4dCByZW5kZXIsIGVxdWl2YWxlbnQKICAgICAqIHRvIG9uZSB0YXNrIChgc2V0VGltZW91dGApIGFmdGVyIHRoZSBuZXh0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgdHVuaW5nIHRoZSBmaXJzdC1yZW5kZXIgcGVyZm9ybWFuY2Ugb2YgYW4KICAgICAqIGVsZW1lbnQgb3IgYXBwbGljYXRpb24gYnkgZGVmZXJyaW5nIG5vbi1jcml0aWNhbCB3b3JrIHVudGlsIGFmdGVyIHRoZQogICAgICogZmlyc3QgcGFpbnQuICBUeXBpY2FsIG5vbi1yZW5kZXItY3JpdGljYWwgd29yayBtYXkgaW5jbHVkZSBhZGRpbmcgVUkKICAgICAqIGV2ZW50IGxpc3RlbmVycyBhbmQgYXJpYSBhdHRyaWJ1dGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlbmRlclN0YXR1cwogICAgICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGJvdW5kIHRvCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLiopOnZvaWR9IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0geyFBcnJheT19IGFyZ3MgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGgKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGFmdGVyTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGFmdGVyUmVuZGVyUXVldWUucHVzaChbY29udGV4dCwgY2FsbGJhY2ssIGFyZ3NdKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFsbCBgYmVmb3JlTmV4dFJlbmRlcmAgdGFza3MsIGZvbGxvd2VkIGJ5IGFsbCBgYWZ0ZXJOZXh0UmVuZGVyYAogICAgICogdGFza3MuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmbHVzaDogZmx1c2gKCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5yZXNvbHZlZAoKICBmdW5jdGlvbiByZXNvbHZlKCkgewogICAgZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoJ3VucmVzb2x2ZWQnKTsKICB9CgogIGlmICh3aW5kb3cuV2ViQ29tcG9uZW50cykgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ1dlYkNvbXBvbmVudHNSZWFkeScsIHJlc29sdmUpOwogIH0gZWxzZSB7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICAgIHJlc29sdmUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcmVzb2x2ZSk7CiAgICB9CiAgfQoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gbmV3U3BsaWNlKGluZGV4LCByZW1vdmVkLCBhZGRlZENvdW50KSB7CiAgICByZXR1cm4gewogICAgICBpbmRleDogaW5kZXgsCiAgICAgIHJlbW92ZWQ6IHJlbW92ZWQsCiAgICAgIGFkZGVkQ291bnQ6IGFkZGVkQ291bnQKICAgIH07CiAgfQoKICBjb25zdCBFRElUX0xFQVZFID0gMDsKICBjb25zdCBFRElUX1VQREFURSA9IDE7CiAgY29uc3QgRURJVF9BREQgPSAyOwogIGNvbnN0IEVESVRfREVMRVRFID0gMzsKCiAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBpcyAqYmFzZWQqIG9uIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgTGV2ZW5zaHRlaW4KICAvLyAiZWRpdCIgZGlzdGFuY2UuIFRoZSBvbmUgY2hhbmdlIGlzIHRoYXQgInVwZGF0ZXMiIGFyZSB0cmVhdGVkIGFzIHR3bwogIC8vIGVkaXRzIC0gbm90IG9uZS4gV2l0aCBBcnJheSBzcGxpY2VzLCBhbiB1cGRhdGUgaXMgcmVhbGx5IGEgZGVsZXRlCiAgLy8gZm9sbG93ZWQgYnkgYW4gYWRkLiBCeSByZXRhaW5pbmcgdGhpcywgd2Ugb3B0aW1pemUgZm9yICJrZWVwaW5nIiB0aGUKICAvLyBtYXhpbXVtIGFycmF5IGl0ZW1zIGluIHRoZSBvcmlnaW5hbCBhcnJheS4gRm9yIGV4YW1wbGU6CiAgLy8KICAvLyAgICd4eHh4MTIzJyAtPiAnMTIzeXl5eScKICAvLwogIC8vIFdpdGggMS1lZGl0IHVwZGF0ZXMsIHRoZSBzaG9ydGVzdCBwYXRoIHdvdWxkIGJlIGp1c3QgdG8gdXBkYXRlIGFsbCBzZXZlbgogIC8vIGNoYXJhY3RlcnMuIFdpdGggMi1lZGl0IHVwZGF0ZXMsIHdlIGRlbGV0ZSA0LCBsZWF2ZSAzLCBhbmQgYWRkIDQuIFRoaXMKICAvLyBsZWF2ZXMgdGhlIHN1YnN0cmluZyAnMTIzJyBpbnRhY3QuCiAgZnVuY3Rpb24gY2FsY0VkaXREaXN0YW5jZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpIHsKICAgIC8vICJEZWxldGlvbiIgY29sdW1ucwogICAgbGV0IHJvd0NvdW50ID0gb2xkRW5kIC0gb2xkU3RhcnQgKyAxOwogICAgbGV0IGNvbHVtbkNvdW50ID0gY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCArIDE7CiAgICBsZXQgZGlzdGFuY2VzID0gbmV3IEFycmF5KHJvd0NvdW50KTsKCiAgICAvLyAiQWRkaXRpb24iIHJvd3MuIEluaXRpYWxpemUgbnVsbCBjb2x1bW4uCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKICAgICAgZGlzdGFuY2VzW2ldID0gbmV3IEFycmF5KGNvbHVtbkNvdW50KTsKICAgICAgZGlzdGFuY2VzW2ldWzBdID0gaTsKICAgIH0KCiAgICAvLyBJbml0aWFsaXplIG51bGwgcm93CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspCiAgICAgIGRpc3RhbmNlc1swXVtqXSA9IGo7CgogICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dDb3VudDsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewogICAgICAgIGlmIChlcXVhbHMoY3VycmVudFtjdXJyZW50U3RhcnQgKyBqIC0gMV0sIG9sZFtvbGRTdGFydCArIGkgLSAxXSkpCiAgICAgICAgICBkaXN0YW5jZXNbaV1bal0gPSBkaXN0YW5jZXNbaSAtIDFdW2ogLSAxXTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGxldCBub3J0aCA9IGRpc3RhbmNlc1tpIC0gMV1bal0gKyAxOwogICAgICAgICAgbGV0IHdlc3QgPSBkaXN0YW5jZXNbaV1baiAtIDFdICsgMTsKICAgICAgICAgIGRpc3RhbmNlc1tpXVtqXSA9IG5vcnRoIDwgd2VzdCA/IG5vcnRoIDogd2VzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZGlzdGFuY2VzOwogIH0KCiAgLy8gVGhpcyBzdGFydHMgYXQgdGhlIGZpbmFsIHdlaWdodCwgYW5kIHdhbGtzICJiYWNrd2FyZCIgYnkgZmluZGluZwogIC8vIHRoZSBtaW5pbXVtIHByZXZpb3VzIHdlaWdodCByZWN1cnNpdmVseSB1bnRpbCB0aGUgb3JpZ2luIG9mIHRoZSB3ZWlnaHQKICAvLyBtYXRyaXguCiAgZnVuY3Rpb24gc3BsaWNlT3BlcmF0aW9uc0Zyb21FZGl0RGlzdGFuY2VzKGRpc3RhbmNlcykgewogICAgbGV0IGkgPSBkaXN0YW5jZXMubGVuZ3RoIC0gMTsKICAgIGxldCBqID0gZGlzdGFuY2VzWzBdLmxlbmd0aCAtIDE7CiAgICBsZXQgY3VycmVudCA9IGRpc3RhbmNlc1tpXVtqXTsKICAgIGxldCBlZGl0cyA9IFtdOwogICAgd2hpbGUgKGkgPiAwIHx8IGogPiAwKSB7CiAgICAgIGlmIChpID09IDApIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGogPT0gMCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgbm9ydGhXZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07CiAgICAgIGxldCB3ZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqXTsKICAgICAgbGV0IG5vcnRoID0gZGlzdGFuY2VzW2ldW2ogLSAxXTsKCiAgICAgIGxldCBtaW47CiAgICAgIGlmICh3ZXN0IDwgbm9ydGgpCiAgICAgICAgbWluID0gd2VzdCA8IG5vcnRoV2VzdCA/IHdlc3QgOiBub3J0aFdlc3Q7CiAgICAgIGVsc2UKICAgICAgICBtaW4gPSBub3J0aCA8IG5vcnRoV2VzdCA/IG5vcnRoIDogbm9ydGhXZXN0OwoKICAgICAgaWYgKG1pbiA9PSBub3J0aFdlc3QpIHsKICAgICAgICBpZiAobm9ydGhXZXN0ID09IGN1cnJlbnQpIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9MRUFWRSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9VUERBVEUpOwogICAgICAgICAgY3VycmVudCA9IG5vcnRoV2VzdDsKICAgICAgICB9CiAgICAgICAgaS0tOwogICAgICAgIGotLTsKICAgICAgfSBlbHNlIGlmIChtaW4gPT0gd2VzdCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjdXJyZW50ID0gd2VzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY3VycmVudCA9IG5vcnRoOwogICAgICB9CiAgICB9CgogICAgZWRpdHMucmV2ZXJzZSgpOwogICAgcmV0dXJuIGVkaXRzOwogIH0KCiAgLyoqCiAgICogU3BsaWNlIFByb2plY3Rpb24gZnVuY3Rpb25zOgogICAqCiAgICogQSBzcGxpY2UgbWFwIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgaG93IGEgcHJldmlvdXMgYXJyYXkgb2YgaXRlbXMKICAgKiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIG5ldyBhcnJheSBvZiBpdGVtcy4gQ29uY2VwdHVhbGx5IGl0IGlzIGEgbGlzdCBvZgogICAqIHR1cGxlcyBvZgogICAqCiAgICogICA8aW5kZXgsIHJlbW92ZWQsIGFkZGVkQ291bnQ+CiAgICoKICAgKiB3aGljaCBhcmUga2VwdCBpbiBhc2NlbmRpbmcgaW5kZXggb3JkZXIgb2YuIFRoZSB0dXBsZSByZXByZXNlbnRzIHRoYXQgYXQKICAgKiB0aGUgfGluZGV4fCwgfHJlbW92ZWR8IHNlcXVlbmNlIG9mIGl0ZW1zIHdlcmUgcmVtb3ZlZCwgYW5kIGNvdW50aW5nIGZvcndhcmQKICAgKiBmcm9tIHxpbmRleHwsIHxhZGRlZENvdW50fCBpdGVtcyB3ZXJlIGFkZGVkLgogICAqLwoKICAvKioKICAgKiBMYWNraW5nIGluZGl2aWR1YWwgc3BsaWNlIG11dGF0aW9uIGluZm9ybWF0aW9uLCB0aGUgbWluaW1hbCBzZXQgb2YKICAgKiBzcGxpY2VzIGNhbiBiZSBzeW50aGVzaXplZCBnaXZlbiB0aGUgcHJldmlvdXMgc3RhdGUgYW5kIGZpbmFsIHN0YXRlIG9mIGFuCiAgICogYXJyYXkuIFRoZSBiYXNpYyBhcHByb2FjaCBpcyB0byBjYWxjdWxhdGUgdGhlIGVkaXQgZGlzdGFuY2UgbWF0cml4IGFuZAogICAqIGNob29zZSB0aGUgc2hvcnRlc3QgcGF0aCB0aHJvdWdoIGl0LgogICAqCiAgICogQ29tcGxleGl0eTogTyhsICogcCkKICAgKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXkKICAgKiAgIHA6IFRoZSBsZW5ndGggb2YgdGhlIG9sZCBhcnJheQogICAqCiAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlIGN1cnJlbnQgImNoYW5nZWQiIGFycmF5IGZvciB3aGljaCB0bwogICAqIGNhbGN1bGF0ZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RhcnQgU3RhcnRpbmcgaW5kZXggaW4gdGhlIGBjdXJyZW50YCBhcnJheSBmb3IKICAgKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50RW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYGN1cnJlbnRgIGFycmF5IGZvcgogICAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuCiAgICogQHBhcmFtIHshQXJyYXl9IG9sZCBUaGUgb3JpZ2luYWwgInVuY2hhbmdlZCIgYXJyYXkgdG8gY29tcGFyZSBgY3VycmVudGAKICAgKiBhZ2FpbnN0IHRvIGRldGVybWluZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBvbGRTdGFydCBTdGFydGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcGFyYW0ge251bWJlcn0gb2xkRW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICogY29udGFpbnM6IGBpbmRleGAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzcGxpY2Ugb2NjdXJyZWQ7IGByZW1vdmVkYAogICAqIHRoZSBhcnJheSBvZiByZW1vdmVkIGl0ZW1zIGZyb20gdGhpcyBsb2NhdGlvbjsgYGFkZGVkQ291bnRgIHRoZSBudW1iZXIKICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAqLwogIGZ1bmN0aW9uIGNhbGNTcGxpY2VzKGN1cnJlbnQsIGN1cnJlbnRTdGFydCwgY3VycmVudEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSB7CiAgICBsZXQgcHJlZml4Q291bnQgPSAwOwogICAgbGV0IHN1ZmZpeENvdW50ID0gMDsKICAgIGxldCBzcGxpY2U7CgogICAgbGV0IG1pbkxlbmd0aCA9IE1hdGgubWluKGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQsIG9sZEVuZCAtIG9sZFN0YXJ0KTsKICAgIGlmIChjdXJyZW50U3RhcnQgPT0gMCAmJiBvbGRTdGFydCA9PSAwKQogICAgICBwcmVmaXhDb3VudCA9IHNoYXJlZFByZWZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCk7CgogICAgaWYgKGN1cnJlbnRFbmQgPT0gY3VycmVudC5sZW5ndGggJiYgb2xkRW5kID09IG9sZC5sZW5ndGgpCiAgICAgIHN1ZmZpeENvdW50ID0gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgbWluTGVuZ3RoIC0gcHJlZml4Q291bnQpOwoKICAgIGN1cnJlbnRTdGFydCArPSBwcmVmaXhDb3VudDsKICAgIG9sZFN0YXJ0ICs9IHByZWZpeENvdW50OwogICAgY3VycmVudEVuZCAtPSBzdWZmaXhDb3VudDsKICAgIG9sZEVuZCAtPSBzdWZmaXhDb3VudDsKCiAgICBpZiAoY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCA9PSAwICYmIG9sZEVuZCAtIG9sZFN0YXJ0ID09IDApCiAgICAgIHJldHVybiBbXTsKCiAgICBpZiAoY3VycmVudFN0YXJ0ID09IGN1cnJlbnRFbmQpIHsKICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIDApOwogICAgICB3aGlsZSAob2xkU3RhcnQgPCBvbGRFbmQpCiAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkU3RhcnQrK10pOwoKICAgICAgcmV0dXJuIFsgc3BsaWNlIF07CiAgICB9IGVsc2UgaWYgKG9sZFN0YXJ0ID09IG9sZEVuZCkKICAgICAgcmV0dXJuIFsgbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQpIF07CgogICAgbGV0IG9wcyA9IHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcygKICAgICAgICBjYWxjRWRpdERpc3RhbmNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpKTsKCiAgICBzcGxpY2UgPSB1bmRlZmluZWQ7CiAgICBsZXQgc3BsaWNlcyA9IFtdOwogICAgbGV0IGluZGV4ID0gY3VycmVudFN0YXJ0OwogICAgbGV0IG9sZEluZGV4ID0gb2xkU3RhcnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewogICAgICBzd2l0Y2gob3BzW2ldKSB7CiAgICAgICAgY2FzZSBFRElUX0xFQVZFOgogICAgICAgICAgaWYgKHNwbGljZSkgewogICAgICAgICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTsKICAgICAgICAgICAgc3BsaWNlID0gdW5kZWZpbmVkOwogICAgICAgICAgfQoKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFRElUX1VQREFURToKICAgICAgICAgIGlmICghc3BsaWNlKQogICAgICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoaW5kZXgsIFtdLCAwKTsKCiAgICAgICAgICBzcGxpY2UuYWRkZWRDb3VudCsrOwogICAgICAgICAgaW5kZXgrKzsKCiAgICAgICAgICBzcGxpY2UucmVtb3ZlZC5wdXNoKG9sZFtvbGRJbmRleF0pOwogICAgICAgICAgb2xkSW5kZXgrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRURJVF9BREQ6CiAgICAgICAgICBpZiAoIXNwbGljZSkKICAgICAgICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGluZGV4LCBbXSwgMCk7CgogICAgICAgICAgc3BsaWNlLmFkZGVkQ291bnQrKzsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVESVRfREVMRVRFOgogICAgICAgICAgaWYgKCFzcGxpY2UpCiAgICAgICAgICAgIHNwbGljZSA9IG5ld1NwbGljZShpbmRleCwgW10sIDApOwoKICAgICAgICAgIHNwbGljZS5yZW1vdmVkLnB1c2gob2xkW29sZEluZGV4XSk7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3BsaWNlKSB7CiAgICAgIHNwbGljZXMucHVzaChzcGxpY2UpOwogICAgfQogICAgcmV0dXJuIHNwbGljZXM7CiAgfQoKICBmdW5jdGlvbiBzaGFyZWRQcmVmaXgoY3VycmVudCwgb2xkLCBzZWFyY2hMZW5ndGgpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoTGVuZ3RoOyBpKyspCiAgICAgIGlmICghZXF1YWxzKGN1cnJlbnRbaV0sIG9sZFtpXSkpCiAgICAgICAgcmV0dXJuIGk7CiAgICByZXR1cm4gc2VhcmNoTGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgc2VhcmNoTGVuZ3RoKSB7CiAgICBsZXQgaW5kZXgxID0gY3VycmVudC5sZW5ndGg7CiAgICBsZXQgaW5kZXgyID0gb2xkLmxlbmd0aDsKICAgIGxldCBjb3VudCA9IDA7CiAgICB3aGlsZSAoY291bnQgPCBzZWFyY2hMZW5ndGggJiYgZXF1YWxzKGN1cnJlbnRbLS1pbmRleDFdLCBvbGRbLS1pbmRleDJdKSkKICAgICAgY291bnQrKzsKCiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBmdW5jdGlvbiBjYWxjdWxhdGVTcGxpY2VzKGN1cnJlbnQsIHByZXZpb3VzKSB7CiAgICByZXR1cm4gY2FsY1NwbGljZXMoY3VycmVudCwgMCwgY3VycmVudC5sZW5ndGgsIHByZXZpb3VzLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubGVuZ3RoKTsKICB9CgogIGZ1bmN0aW9uIGVxdWFscyhjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpIHsKICAgIHJldHVybiBjdXJyZW50VmFsdWUgPT09IHByZXZpb3VzVmFsdWU7CiAgfQoKICAvKioKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgdGhhdCBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGRpZmZpbmcgYXJyYXlzLgogICAqLwogIFBvbHltZXIuQXJyYXlTcGxpY2UgPSB7CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMgaW5kaWNhdGluZyB0aGUgbWluaW11bSBlZGl0cyByZXF1aXJlZAogICAgICogdG8gdHJhbnNmb3JtIHRoZSBgcHJldmlvdXNgIGFycmF5IGludG8gdGhlIGBjdXJyZW50YCBhcnJheS4KICAgICAqCiAgICAgKiBTcGxpY2UgcmVjb3JkcyBhcmUgb3JkZXJlZCBieSBpbmRleCBhbmQgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKICAgICAqIC0gYGluZGV4YDogaW5kZXggd2hlcmUgZWRpdCBzdGFydGVkCiAgICAgKiAtIGByZW1vdmVkYDogYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgaW5kZXgKICAgICAqIC0gYGFkZGVkQ291bnRgOiBudW1iZXIgb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBpbmRleAogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gdGhlIExldmVuc2h0ZWluICJtaW5pbXVtIGVkaXQgZGlzdGFuY2UiCiAgICAgKiBhbGdvcml0aG0uIE5vdGUgdGhhdCB1cGRhdGVzIGFyZSB0cmVhdGVkIGFzIHJlbW92YWwgZm9sbG93ZWQgYnkgYWRkaXRpb24uCiAgICAgKgogICAgICogVGhlIHdvcnN0LWNhc2UgdGltZSBjb21wbGV4aXR5IG9mIHRoaXMgYWxnb3JpdGhtIGlzIGBPKGwgKiBwKWAKICAgICAqICAgbDogVGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBhcnJheQogICAgICogICBwOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmV2aW91cyBhcnJheQogICAgICoKICAgICAqIEhvd2V2ZXIsIHRoZSB3b3JzdC1jYXNlIGNvbXBsZXhpdHkgaXMgcmVkdWNlZCBieSBhbiBgTyhuKWAgb3B0aW1pemF0aW9uCiAgICAgKiB0byBkZXRlY3QgYW55IHNoYXJlZCBwcmVmaXggJiBzdWZmaXggYmV0d2VlbiB0aGUgdHdvIGFycmF5cyBhbmQgb25seQogICAgICogcGVyZm9ybSB0aGUgbW9yZSBleHBlbnNpdmUgbWluaW11bSBlZGl0IGRpc3RhbmNlIGNhbGN1bGF0aW9uIG92ZXIgdGhlCiAgICAgKiBub24tc2hhcmVkIHBvcnRpb25zIG9mIHRoZSBhcnJheXMuCiAgICAgKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5BcnJheVNwbGljZQogICAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlICJjaGFuZ2VkIiBhcnJheSBmb3Igd2hpY2ggc3BsaWNlcyB3aWxsIGJlCiAgICAgKiBjYWxjdWxhdGVkLgogICAgICogQHBhcmFtIHshQXJyYXl9IHByZXZpb3VzIFRoZSAidW5jaGFuZ2VkIiBvcmlnaW5hbCBhcnJheSB0byBjb21wYXJlCiAgICAgKiBgY3VycmVudGAgYWdhaW5zdCB0byBkZXRlcm1pbmUgdGhlIHNwbGljZXMuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICAgKiBjb250YWluczogYGluZGV4YCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHNwbGljZSBvY2N1cnJlZDsgYHJlbW92ZWRgCiAgICAgKiB0aGUgYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgbG9jYXRpb247IGBhZGRlZENvdW50YCB0aGUgbnVtYmVyCiAgICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAgICovCiAgICBjYWxjdWxhdGVTcGxpY2VzCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIGBub2RlYCBpcyBhIHNsb3QgZWxlbWVudAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHRlc3QuCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgbm9kZWAgaXMgYSBzbG90CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBpc1Nsb3Qobm9kZSkgewogICAgcmV0dXJuIChub2RlLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKTsKICB9CgogIC8qKgogICAqIENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLiBUaGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgY29uc2lzdHMKICAgKiBvZiBhIG5vZGUncyBjaGlsZHJlbiBhbmQsIGZvciBhbnkgY2hpbGRyZW4gdGhhdCBhcmUgYDxzbG90PmAgZWxlbWVudHMsCiAgICogdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9ic2VydmVkIG5vZGUgaGFzIGNoaWxkcmVuIGA8YT48L2E+PHNsb3Q+PC9zbG90PjxiPjwvYj5gCiAgICogYW5kIHRoZSBgPHNsb3Q+YCBoYXMgb25lIGA8ZGl2PmAgYXNzaWduZWQgdG8gaXQsIHRoZW4gdGhlIGZsYXR0ZW5lZAogICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICogYDxzbG90PmAgZWxlbWVudHMgYXNzaWduZWQgdG8gaXQsIHRoZXNlIGFyZSBmbGF0dGVuZWQgYXMgd2VsbC4KICAgKgogICAqIFRoZSBwcm92aWRlZCBgY2FsbGJhY2tgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgY2hhbmdlIHRvIHRoaXMgbGlzdAogICAqIG9mIGZsYXR0ZW5lZCBub2RlcyBvY2N1cnMsIHdoZXJlIGFuIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYSBub2RlIGlzCiAgICogY29uc2lkZXJlZCBhIGNoYW5nZS4gVGhlIGBjYWxsYmFja2AgaXMgY2FsbGVkIHdpdGggb25lIGFyZ3VtZW50LCBhbiBvYmplY3QKICAgKiBjb250YWluaW5nIGFuIGFycmF5IG9mIGFueSBgYWRkZWROb2Rlc2AgYW5kIGByZW1vdmVkTm9kZXNgLgogICAqCiAgICogTm90ZTogdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBhc3luY2hyb25vdXMgdG8gYW55IGNoYW5nZXMKICAgKiBhdCBhIG1pY3JvdGFzayBjaGVja3BvaW50LiBUaGlzIGlzIGJlY2F1c2Ugb2JzZXJ2YXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nCiAgICogYE11dGF0aW9uT2JzZXJ2ZXJgIGFuZCB0aGUgYDxzbG90PmAgZWxlbWVudCdzIGBzbG90Y2hhbmdlYCBldmVudCB3aGljaAogICAqIGFyZSBhc3luY2hyb25vdXMuCiAgICoKICAgKiBBbiBleGFtcGxlOgogICAqIGBgYGpzCiAgICogY2xhc3MgVGVzdFNlbGZPYnNlcnZlIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAndGVzdC1zZWxmLW9ic2VydmUnO30KICAgKiAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcywgKGluZm8pID0+IHsKICAgKiAgICAgICB0aGlzLmluZm8gPSBpbmZvOwogICAqICAgICB9KTsKICAgKiAgIH0KICAgKiAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICogICB9CiAgICogfQogICAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZShUZXN0U2VsZk9ic2VydmUuaXMsIFRlc3RTZWxmT2JzZXJ2ZSk7CiAgICogYGBgCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLgogICAqLwogIGNsYXNzIEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIgewoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgZm9yIHRoZSBnaXZlbiBgbm9kZWAuCiAgICAgKiBUaGlzIGxpc3QgY29uc2lzdHMgb2YgYSBub2RlJ3MgY2hpbGRyZW4gYW5kLCBmb3IgYW55IGNoaWxkcmVuCiAgICAgKiB0aGF0IGFyZSBgPHNsb3Q+YCBlbGVtZW50cywgdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2ZWQgbm9kZSBoYXMgY2hpbGRyZW4gYDxhPjwvYT48c2xvdD48L3Nsb3Q+PGI+PC9iPmAKICAgICAqIGFuZCB0aGUgYDxzbG90PmAgaGFzIG9uZSBgPGRpdj5gIGFzc2lnbmVkIHRvIGl0LCB0aGVuIHRoZSBmbGF0dGVuZWQKICAgICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICAgKiBgPHNsb3Q+YCBlbGVtZW50cyBhc3NpZ25lZCB0byBpdCwgdGhlc2UgYXJlIGZsYXR0ZW5lZCBhcyB3ZWxsLgogICAgICoKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8SFRNTFNsb3RFbGVtZW50fSBub2RlIFRoZSBub2RlIGZvciB3aGljaCB0byByZXR1cm4gdGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzLgogICAgICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2RlcyBmb3IgdGhlIGdpdmVuIGBub2RlYC4KICAgICovCiAgICBzdGF0aWMgZ2V0RmxhdHRlbmVkTm9kZXMobm9kZSkgewogICAgICBpZiAoaXNTbG90KG5vZGUpKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7SFRNTFNsb3RFbGVtZW50fSAqLyhub2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLm1hcCgobm9kZSkgPT4gewogICAgICAgICAgaWYgKGlzU2xvdChub2RlKSkgewogICAgICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtIVE1MU2xvdEVsZW1lbnR9ICovKG5vZGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBbbm9kZV07CiAgICAgICAgICB9CiAgICAgICAgfSkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBOb2RlIG9uIHdoaWNoIHRvIGxpc3RlbiBmb3IgY2hhbmdlcy4KICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgYWRkaXRpb25zCiAgICAgKiBvciByZW1vdmFscyBmcm9tIHRoZSB0YXJnZXQncyBsaXN0IG9mIGZsYXR0ZW5lZCBub2Rlcy4KICAgICovCiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIGNhbGxiYWNrKSB7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciA9IG51bGw7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgLyoqCiAgICAgICAqIEB0eXBlIHtFbGVtZW50fQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gW107CiAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDsKICAgICAgdGhpcy5fc2NoZWR1bGVkID0gZmFsc2U7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX2JvdW5kU2NoZWR1bGUgPSAoKSA9PiB7CiAgICAgICAgdGhpcy5fc2NoZWR1bGUoKTsKICAgICAgfTsKICAgICAgdGhpcy5jb25uZWN0KCk7CiAgICAgIHRoaXMuX3NjaGVkdWxlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBY3RpdmF0ZXMgYW4gb2JzZXJ2ZXIuIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4KICAgICAqIGEgYEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJgIGlzIGNyZWF0ZWQuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0bwogICAgICogcmUtYWN0aXZhdGUgYW4gb2JzZXJ2ZXIgdGhhdCBoYXMgYmVlbiBkZWFjdGl2YXRlZCB2aWEgdGhlIGBkaXNjb25uZWN0YCBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdCgpIHsKICAgICAgaWYgKGlzU2xvdCh0aGlzLl90YXJnZXQpKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOwogICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhcmdldC5jaGlsZHJlbikgewogICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSkgewogICAgICAgICAgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyID0KICAgICAgICAgICAgU2hhZHlET00ub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3RhcmdldCwgKG11dGF0aW9ucykgPT4gewogICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPQogICAgICAgICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl90YXJnZXQsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIERlYWN0aXZhdGVzIHRoZSBmbGF0dGVuZWQgbm9kZXMgb2JzZXJ2ZXIuIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QKICAgICAqIHRoZSBvYnNlcnZlciBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiBjaGFuZ2VzIHRvIGZsYXR0ZW5lZCBub2RlcwogICAgICogb2NjdXIuIFRoZSBgY29ubmVjdGAgbWV0aG9kIG1heSBiZSBzdWJzZXF1ZW50bHkgY2FsbGVkIHRvIHJlYWN0aXZhdGUKICAgICAqIHRoZSBvYnNlcnZlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBkaXNjb25uZWN0KCkgewogICAgICBpZiAoaXNTbG90KHRoaXMuX3RhcmdldCkpIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKFt0aGlzLl90YXJnZXRdKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXJnZXQuY2hpbGRyZW4pIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICAgIFNoYWR5RE9NLnVub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcik7CiAgICAgICAgICB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3NjaGVkdWxlKCkgewogICAgICBpZiAoIXRoaXMuX3NjaGVkdWxlZCkgewogICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHRoaXMuZmx1c2goKSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXk8TXV0YXRpb25SZWNvcmQ+fSBtdXRhdGlvbnMgTXV0YXRpb25zIHNpZ25hbGVkIGJ5IHRoZSBtdXRhdGlvbiBvYnNlcnZlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF9wcm9jZXNzTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgICB0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICB0aGlzLmZsdXNoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0FycmF5PE11dGF0aW9uUmVjb3JkPn0gbXV0YXRpb25zIE11dGF0aW9ucyBzaWduYWxlZCBieSB0aGUgbXV0YXRpb24gb2JzZXJ2ZXIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfcHJvY2Vzc1Nsb3RNdXRhdGlvbnMobXV0YXRpb25zKSB7CiAgICAgIGlmIChtdXRhdGlvbnMpIHsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTsKICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKG11dGF0aW9uLmFkZGVkTm9kZXMpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2RlcykgewogICAgICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGbHVzaGVzIHRoZSBvYnNlcnZlciBjYXVzaW5nIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gYmUgaW1tZWRpYXRlbHkKICAgICAqIGRlbGl2ZXJlZCB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2suIEJ5IGRlZmF1bHQgdGhlc2UgY2hhbmdlcyBhcmUgZGVsaXZlcmVkCiAgICAgKiBhc3luY2hyb25vdXNseSBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBlbmRpbmcgY2hhbmdlcyBjYXVzZWQgdGhlIG9ic2VydmVyCiAgICAgKiBjYWxsYmFjayB0byBydW4uCiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgU2hhZHlET00uZmx1c2goKTsKICAgICAgfQogICAgICBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgIHRoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpOwogICAgICB9CiAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IGZhbHNlOwogICAgICBsZXQgaW5mbyA9IHsKICAgICAgICB0YXJnZXQ6IHRoaXMuX3RhcmdldCwKICAgICAgICBhZGRlZE5vZGVzOiBbXSwKICAgICAgICByZW1vdmVkTm9kZXM6IFtdCiAgICAgIH07CiAgICAgIGxldCBuZXdOb2RlcyA9IHRoaXMuY29uc3RydWN0b3IuZ2V0RmxhdHRlbmVkTm9kZXModGhpcy5fdGFyZ2V0KTsKICAgICAgbGV0IHNwbGljZXMgPSBQb2x5bWVyLkFycmF5U3BsaWNlLmNhbGN1bGF0ZVNwbGljZXMobmV3Tm9kZXMsCiAgICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMpOwogICAgICAvLyBwcm9jZXNzIHJlbW92YWxzCiAgICAgIGZvciAobGV0IGk9MCwgczsgKGk8c3BsaWNlcy5sZW5ndGgpICYmIChzPXNwbGljZXNbaV0pOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqPTAsIG47IChqIDwgcy5yZW1vdmVkLmxlbmd0aCkgJiYgKG49cy5yZW1vdmVkW2pdKTsgaisrKSB7CiAgICAgICAgICBpbmZvLnJlbW92ZWROb2Rlcy5wdXNoKG4pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBwcm9jZXNzIGFkZHMKICAgICAgZm9yIChsZXQgaT0wLCBzOyAoaTxzcGxpY2VzLmxlbmd0aCkgJiYgKHM9c3BsaWNlc1tpXSk7IGkrKykgewogICAgICAgIGZvciAobGV0IGo9cy5pbmRleDsgaiA8IHMuaW5kZXggKyBzLmFkZGVkQ291bnQ7IGorKykgewogICAgICAgICAgaW5mby5hZGRlZE5vZGVzLnB1c2gobmV3Tm9kZXNbal0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB1cGRhdGUgY2FjaGUKICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMgPSBuZXdOb2RlczsKICAgICAgbGV0IGRpZEZsdXNoID0gZmFsc2U7CiAgICAgIGlmIChpbmZvLmFkZGVkTm9kZXMubGVuZ3RoIHx8IGluZm8ucmVtb3ZlZE5vZGVzLmxlbmd0aCkgewogICAgICAgIGRpZEZsdXNoID0gdHJ1ZTsKICAgICAgICB0aGlzLmNhbGxiYWNrLmNhbGwodGhpcy5fdGFyZ2V0LCBpbmZvKTsKICAgICAgfQogICAgICByZXR1cm4gZGlkRmx1c2g7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFBcnJheTxFbGVtZW50fE5vZGU+fCFOb2RlTGlzdDxOb2RlPn0gbm9kZUxpc3QgTm9kZXMgdGhhdCBjb3VsZCBjaGFuZ2UKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfbGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshQXJyYXk8RWxlbWVudHxOb2RlPnwhTm9kZUxpc3Q8Tm9kZT59IG5vZGVMaXN0IE5vZGVzIHRoYXQgY291bGQgY2hhbmdlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3VubGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICB9CgogIFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlciA9IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXI7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBkZWJvdW5jZXJRdWV1ZSA9IFtdOwoKICAvKioKICAgKiBBZGRzIGEgYFBvbHltZXIuRGVib3VuY2VyYCB0byBhIGxpc3Qgb2YgZ2xvYmFsbHkgZmx1c2hhYmxlIHRhc2tzLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIgPSBmdW5jdGlvbihkZWJvdW5jZXIpIHsKICAgIGRlYm91bmNlclF1ZXVlLnB1c2goZGVib3VuY2VyKTsKICB9OwoKICBmdW5jdGlvbiBmbHVzaERlYm91bmNlcnMoKSB7CiAgICBjb25zdCBkaWRGbHVzaCA9IEJvb2xlYW4oZGVib3VuY2VyUXVldWUubGVuZ3RoKTsKICAgIHdoaWxlIChkZWJvdW5jZXJRdWV1ZS5sZW5ndGgpIHsKICAgICAgdHJ5IHsKICAgICAgICBkZWJvdW5jZXJRdWV1ZS5zaGlmdCgpLmZsdXNoKCk7CiAgICAgIH0gY2F0Y2goZSkgewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRpZEZsdXNoOwogIH0KCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgZW5xdWV1ZURlYm91bmNlcmAKICAgKiAtIFNoYWR5RE9NIGRpc3RyaWJ1dGlvbgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuZmx1c2ggPSBmdW5jdGlvbigpIHsKICAgIGxldCBzaGFkeURPTSwgZGVib3VuY2VyczsKICAgIGRvIHsKICAgICAgc2hhZHlET00gPSB3aW5kb3cuU2hhZHlET00gJiYgU2hhZHlET00uZmx1c2goKTsKICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0pIHsKICAgICAgICB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0uZmx1c2goKTsKICAgICAgfQogICAgICBkZWJvdW5jZXJzID0gZmx1c2hEZWJvdW5jZXJzKCk7CiAgICB9IHdoaWxlIChzaGFkeURPTSB8fCBkZWJvdW5jZXJzKTsKICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBwID0gRWxlbWVudC5wcm90b3R5cGU7CiAgLyoqCiAgICogQGNvbnN0IHtmdW5jdGlvbih0aGlzOk5vZGUsIHN0cmluZyk6IGJvb2xlYW59CiAgICovCiAgY29uc3Qgbm9ybWFsaXplZE1hdGNoZXNTZWxlY3RvciA9IHAubWF0Y2hlcyB8fCBwLm1hdGNoZXNTZWxlY3RvciB8fAogICAgcC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgcC5tc01hdGNoZXNTZWxlY3RvciB8fAogICAgcC5vTWF0Y2hlc1NlbGVjdG9yIHx8IHAud2Via2l0TWF0Y2hlc1NlbGVjdG9yOwoKICAvKioKICAgKiBDcm9zcy1wbGF0Zm9ybSBgZWxlbWVudC5tYXRjaGVzYCBzaGltLgogICAqCiAgICogQGZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBjaGVjayBzZWxlY3RvciBhZ2FpbnN0CiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIG1hdGNoCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBub2RlIG1hdGNoZWQgc2VsZWN0b3IKICAgKi8KICBjb25zdCBtYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbihub2RlLCBzZWxlY3RvcikgewogICAgcmV0dXJuIG5vcm1hbGl6ZWRNYXRjaGVzU2VsZWN0b3IuY2FsbChub2RlLCBzZWxlY3Rvcik7CiAgfTsKCiAgLyoqCiAgICogTm9kZSBBUEkgd3JhcHBlciBjbGFzcyByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmRvbS4odGFyZ2V0KWAgd2hlbgogICAqIGB0YXJnZXRgIGlzIGEgYE5vZGVgLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKi8KICBjbGFzcyBEb21BcGkgewoKICAgIC8qKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIFBvbHltZXIuZG9tIGhlbHBlciBvYmplY3QuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5vZGUpIHsKICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcmAgdGhhdAogICAgICogbGlzdGVucyBmb3Igbm9kZSBjaGFuZ2VzIG9uIHRoaXMgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBDYWxsZWQgd2hlbiBkaXJlY3Qgb3IgZGlzdHJpYnV0ZWQgY2hpbGRyZW4KICAgICAqICAgb2YgdGhpcyBlbGVtZW50IGNoYW5nZXMKICAgICAqIEByZXR1cm4geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IE9ic2VydmVyIGluc3RhbmNlCiAgICAgKi8KICAgIG9ic2VydmVOb2RlcyhjYWxsYmFjaykgewogICAgICByZXR1cm4gbmV3IFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcih0aGlzLm5vZGUsIGNhbGxiYWNrKTsKICAgIH0KCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGFuIG9ic2VydmVyIHByZXZpb3VzbHkgY3JlYXRlZCB2aWEgYG9ic2VydmVOb2Rlc2AKICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IG9ic2VydmVySGFuZGxlIE9ic2VydmVyIGluc3RhbmNlCiAgICAgKiAgIHRvIGRpc2Nvbm5lY3QuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB1bm9ic2VydmVOb2RlcyhvYnNlcnZlckhhbmRsZSkgewogICAgICBvYnNlcnZlckhhbmRsZS5kaXNjb25uZWN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm92aWRlZCBhcyBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIEFQSSBvbmx5LiAgVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbm90aWZ5T2JzZXJ2ZXIoKSB7fQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBub2RlIGlzIGNvbnRhaW5lZCB3aXRoIHRoaXMgZWxlbWVudCdzCiAgICAgKiBsaWdodC1ET00gY2hpbGRyZW4gb3Igc2hhZG93IHJvb3QsIGluY2x1ZGluZyBhbnkgbmVzdGVkIHNoYWRvdyByb290cwogICAgICogb2YgY2hpbGRyZW4gdGhlcmVpbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byB0ZXN0CiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBub2RlYCBpcyBjb250YWluZWQgd2l0aGluCiAgICAgKiAgIHRoaXMgZWxlbWVudCdzIGxpZ2h0IG9yIHNoYWRvdyBET00uCiAgICAgKi8KICAgIGRlZXBDb250YWlucyhub2RlKSB7CiAgICAgIGlmICh0aGlzLm5vZGUuY29udGFpbnMobm9kZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbiA9IG5vZGU7CiAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7CiAgICAgIC8vIHdhbGsgZnJvbSBub2RlIHRvIGB0aGlzYCBvciBgZG9jdW1lbnRgCiAgICAgIHdoaWxlIChuICYmIG4gIT09IGRvYyAmJiBuICE9PSB0aGlzLm5vZGUpIHsKICAgICAgICAvLyB1c2UgbG9naWNhbCBwYXJlbnRub2RlLCBvciBuYXRpdmUgU2hhZG93Um9vdCBob3N0CiAgICAgICAgbiA9IG4ucGFyZW50Tm9kZSB8fCBuLmhvc3Q7CiAgICAgIH0KICAgICAgcmV0dXJuIG4gPT09IHRoaXMubm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIG5vZGUuICBFcXVpdmFsZW50IHRvIGBnZXRSb29kTm9kZSgpYC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtOb2RlfSBUb3AgbW9zdCBlbGVtZW50IGluIHRoZSBkb20gdHJlZSBpbiB3aGljaCB0aGUgbm9kZQogICAgICogZXhpc3RzLiBJZiB0aGUgbm9kZSBpcyBjb25uZWN0ZWQgdG8gYSBkb2N1bWVudCB0aGlzIGlzIGVpdGhlciBhCiAgICAgKiBzaGFkb3dSb290IG9yIHRoZSBkb2N1bWVudDsgb3RoZXJ3aXNlLCBpdCBtYXkgYmUgdGhlIG5vZGUKICAgICAqIGl0c2VsZiBvciBhIG5vZGUgb3IgZG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyBpdC4KICAgICAqLwogICAgZ2V0T3duZXJSb290KCkgewogICAgICByZXR1cm4gdGhpcy5ub2RlLmdldFJvb3ROb2RlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3Igc2xvdCBlbGVtZW50cywgcmV0dXJucyB0aGUgbm9kZXMgYXNzaWduZWQgdG8gdGhlIHNsb3Q7IG90aGVyd2lzZQogICAgICogYW4gZW1wdHkgYXJyYXkuIEl0IGlzIGVxdWl2YWxlbnQgdG8gYDxzbG90Pi5hZGRpZ25lZE5vZGVzKHtmbGF0dGVuOnRydWV9KWAuCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gQXJyYXkgb2YgYXNzaWduZWQgbm9kZXMKICAgICAqLwogICAgZ2V0RGlzdHJpYnV0ZWROb2RlcygpIHsKICAgICAgcmV0dXJuICh0aGlzLm5vZGUubG9jYWxOYW1lID09PSAnc2xvdCcpID8KICAgICAgICB0aGlzLm5vZGUuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjogdHJ1ZX0pIDoKICAgICAgICBbXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHNsb3RzIHRoaXMgZWxlbWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU2xvdEVsZW1lbnQ+fSBEZXNjcmlwdGlvbgogICAgICovCiAgICBnZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cygpIHsKICAgICAgbGV0IGlwJCA9IFtdOwogICAgICBsZXQgbiA9IHRoaXMubm9kZS5hc3NpZ25lZFNsb3Q7CiAgICAgIHdoaWxlIChuKSB7CiAgICAgICAgaXAkLnB1c2gobik7CiAgICAgICAgbiA9IG4uYXNzaWduZWRTbG90OwogICAgICB9CiAgICAgIHJldHVybiBpcCQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxscyBgaW1wb3J0Tm9kZWAgb24gdGhlIGBvd25lckRvY3VtZW50YCBmb3IgdGhpcyBub2RlLgogICAgICoKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBpbXBvcnQKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVlcCBUcnVlIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbG9uZWQgZGVlcGx5IGR1cmluZwogICAgICogICBpbXBvcnQKICAgICAqIEByZXR1cm4ge05vZGV9IENsb25lIG9mIGdpdmVuIG5vZGUgaW1wb3J0ZWQgdG8gdGhpcyBvd25lciBkb2N1bWVudAogICAgICovCiAgICBpbXBvcnROb2RlKG5vZGUsIGRlZXApIHsKICAgICAgbGV0IGRvYyA9IHRoaXMubm9kZSBpbnN0YW5jZW9mIERvY3VtZW50ID8gdGhpcy5ub2RlIDoKICAgICAgICB0aGlzLm5vZGUub3duZXJEb2N1bWVudDsKICAgICAgcmV0dXJuIGRvYy5pbXBvcnROb2RlKG5vZGUsIGRlZXApOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gUmV0dXJucyBhIGZsYXR0ZW5lZCBsaXN0IG9mIGFsbCBjaGlsZCBub2RlcyBhbmQKICAgICAqIG5vZGVzIGFzc2lnbmVkIHRvIGNoaWxkIHNsb3RzLgogICAgICovCiAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICByZXR1cm4gUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMubm9kZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBmbGF0dGVuZWQgY2hpbGQgZWxlbWVudHMgZm9yIHRoaXMgZWxlbWVudCBiYXNlZAogICAgICogb24gdGhlIGdpdmVuIHNlbGVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBmaWx0ZXIgbm9kZXMgYWdhaW5zdAogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MRWxlbWVudD59IExpc3Qgb2YgZmxhdHRlbmVkIGNoaWxkIGVsZW1lbnRzCiAgICAgKi8KICAgIHF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3RvcikgewogICAgICBsZXQgYyQgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgbGV0IGxpc3QgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wLCBsPWMkLmxlbmd0aCwgYzsgKGk8bCkgJiYgKGM9YyRbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKGMubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJgogICAgICAgICAgICBtYXRjaGVzU2VsZWN0b3IoYywgc2VsZWN0b3IpKSB7CiAgICAgICAgICBsaXN0LnB1c2goYyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qKgogICAgICogRm9yIHNoYWRvdyByb290cywgcmV0dXJucyB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCB3aXRoaW4gdGhpcwogICAgICogc2hhZG93IHJvb3QuCiAgICAgKgogICAgICogQHJldHVybiB7Tm9kZXx1bmRlZmluZWR9IEN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnQKICAgICAqLwogICAgZ2V0IGFjdGl2ZUVsZW1lbnQoKSB7CiAgICAgIGxldCBub2RlID0gdGhpcy5ub2RlOwogICAgICByZXR1cm4gbm9kZS5fYWN0aXZlRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gbm9kZS5fYWN0aXZlRWxlbWVudCA6IG5vZGUuYWN0aXZlRWxlbWVudDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRNZXRob2RzKHByb3RvLCBtZXRob2RzKSB7CiAgICBmb3IgKGxldCBpPTA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RzW2ldOwogICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICBwcm90b1ttZXRob2RdID0gLyoqIEB0aGlzIHtEb21BcGl9ICovIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5vZGVbbWV0aG9kXS5hcHBseSh0aGlzLm5vZGUsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICAgIC8qIGVzbGludC1lbmFibGUgKi8KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRSZWFkT25seVByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZm9yd2FyZFByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgLyoqIEB0eXBlIHtEb21BcGl9ICovICh0aGlzKS5ub2RlW25hbWVdID0gdmFsdWU7CiAgICAgICAgfSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfQoKICBmb3J3YXJkTWV0aG9kcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAnY2xvbmVOb2RlJywgJ2FwcGVuZENoaWxkJywgJ2luc2VydEJlZm9yZScsICdyZW1vdmVDaGlsZCcsCiAgICAncmVwbGFjZUNoaWxkJywgJ3NldEF0dHJpYnV0ZScsICdyZW1vdmVBdHRyaWJ1dGUnLAogICAgJ3F1ZXJ5U2VsZWN0b3InLCAncXVlcnlTZWxlY3RvckFsbCcKICBdKTsKCiAgZm9yd2FyZFJlYWRPbmx5UHJvcGVydGllcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAncGFyZW50Tm9kZScsICdmaXJzdENoaWxkJywgJ2xhc3RDaGlsZCcsCiAgICAnbmV4dFNpYmxpbmcnLCAncHJldmlvdXNTaWJsaW5nJywgJ2ZpcnN0RWxlbWVudENoaWxkJywKICAgICdsYXN0RWxlbWVudENoaWxkJywgJ25leHRFbGVtZW50U2libGluZycsICdwcmV2aW91c0VsZW1lbnRTaWJsaW5nJywKICAgICdjaGlsZE5vZGVzJywgJ2NoaWxkcmVuJywgJ2NsYXNzTGlzdCcKICBdKTsKCiAgZm9yd2FyZFByb3BlcnRpZXMoRG9tQXBpLnByb3RvdHlwZSwgWwogICAgJ3RleHRDb250ZW50JywgJ2lubmVySFRNTCcKICBdKTsKCgogIC8qKgogICAqIEV2ZW50IEFQSSB3cmFwcGVyIGNsYXNzIHJldHVybmVkIGZyb20gYFBvbHltZXIuZG9tLih0YXJnZXQpYCB3aGVuCiAgICogYHRhcmdldGAgaXMgYW4gYEV2ZW50YC4KICAgKi8KICBjbGFzcyBFdmVudEFwaSB7CiAgICBjb25zdHJ1Y3RvcihldmVudCkgewogICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9uIHRoZSBgY29tcG9zZWRQYXRoYCBvZiB0aGlzIGV2ZW50LgogICAgICoKICAgICAqIEByZXR1cm4geyFFdmVudFRhcmdldH0gVGhlIG5vZGUgdGhpcyBldmVudCB3YXMgZGlzcGF0Y2hlZCB0bwogICAgICovCiAgICBnZXQgcm9vdFRhcmdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY29tcG9zZWRQYXRoKClbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHshRXZlbnRUYXJnZXR9IFRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqLwogICAgZ2V0IGxvY2FsVGFyZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5ldmVudC50YXJnZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBgY29tcG9zZWRQYXRoYCBmb3IgdGhpcyBldmVudC4KICAgICAqIEByZXR1cm4geyFBcnJheTwhRXZlbnRUYXJnZXQ+fSBUaGUgbm9kZXMgdGhpcyBldmVudCBwcm9wYWdhdGVkIHRocm91Z2gKICAgICAqLwogICAgZ2V0IHBhdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgfQogIH0KCiAgUG9seW1lci5Eb21BcGkgPSBEb21BcGk7CgogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGRlZXAKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuY2xvbmVOb2RlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ7CiAgLyoqCiAgICogQGZ1bmN0aW9uCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcGFyYW0ge05vZGV9IHJlZkNoaWxkCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLmluc2VydEJlZm9yZTsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0geyFOb2RlfSBub2RlCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnJlbW92ZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG9sZENoaWxkCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVwbGFjZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuc2V0QXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4gez9FbGVtZW50fQogICAqLwogIFBvbHltZXIuRG9tQXBpLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4geyFOb2RlTGlzdDwhRWxlbWVudD59CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7CgogIC8qKgogICAqIExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8gYWJzdHJhY3QKICAgKiBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NIiB3aGVuIHBvbHlmaWxsaW5nIG9uCiAgICogb2xkZXIgYnJvd3NlcnMuCiAgICoKICAgKiBOb3RlIHRoYXQgaW4gUG9seW1lciAyLnggdXNlIG9mIGBQb2x5bWVyLmRvbWAgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZAogICAqIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcyBzaW1wbHkgZmFjYWRlcyBkaXJlY3RseSB0byB0aGUgc3RhbmRhcmQgbmF0aXZlCiAgICogQVBJLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBzdW1tYXJ5IExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8KICAgKiBhYnN0cmFjdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NLiIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KE5vZGV8RXZlbnQpPX0gb2JqIE5vZGUgb3IgZXZlbnQgdG8gb3BlcmF0ZSBvbgogICAqIEByZXR1cm4geyFEb21BcGl8IUV2ZW50QXBpfSBXcmFwcGVyIHByb3ZpZGluZyBlaXRoZXIgbm9kZSBBUEkgb3IgZXZlbnQgQVBJCiAgICovCiAgUG9seW1lci5kb20gPSBmdW5jdGlvbihvYmopIHsKICAgIG9iaiA9IG9iaiB8fCBkb2N1bWVudDsKICAgIGlmICghb2JqLl9fZG9tQXBpKSB7CiAgICAgIGxldCBoZWxwZXI7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFdmVudCkgewogICAgICAgIGhlbHBlciA9IG5ldyBFdmVudEFwaShvYmopOwogICAgICB9IGVsc2UgewogICAgICAgIGhlbHBlciA9IG5ldyBEb21BcGkob2JqKTsKICAgICAgfQogICAgICBvYmouX19kb21BcGkgPSBoZWxwZXI7CiAgICB9CiAgICByZXR1cm4gb2JqLl9fZG9tQXBpOwogIH07CgogIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvciA9IG1hdGNoZXNTZWxlY3RvcjsKCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYAogICAqIC0gU2hhZHlET00gZGlzdHJpYnV0aW9uCiAgICoKICAgKiBUaGlzIG1ldGhvZCBmYWNhZGVzIHRvIGBQb2x5bWVyLmZsdXNoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqLwogIFBvbHltZXIuZG9tLmZsdXNoID0gUG9seW1lci5mbHVzaDsKCiAgLyoqCiAgICogQWRkcyBhIGBQb2x5bWVyLkRlYm91bmNlcmAgdG8gYSBsaXN0IG9mIGdsb2JhbGx5IGZsdXNoYWJsZSB0YXNrcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGZhY2FkZXMgdG8gYFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcmAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lci5kb20KICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICovCiAgUG9seW1lci5kb20uYWRkRGVib3VuY2VyID0gUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc3R5bGVJbnRlcmZhY2UgPSB3aW5kb3cuU2hhZHlDU1M7CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBQb2x5bWVyJ3MgImxlZ2FjeSIgQVBJIGludGVuZGVkIHRvIGJlCiAgICogYmFja3dhcmQtY29tcGF0aWJsZSB0byB0aGUgZ3JlYXRlc3QgZXh0ZW50IHBvc3NpYmxlIHdpdGggdGhlIEFQSQogICAqIGZvdW5kIG9uIHRoZSBQb2x5bWVyIDEueCBgUG9seW1lci5CYXNlYCBwcm90b3R5cGUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMKICAgKiBkZWZpbmVkIHVzaW5nIHRoZSBgUG9seW1lcih7Li4ufSlgIGZ1bmN0aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5FbGVtZW50TWl4aW4KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzCiAgICogQHByb3BlcnR5IGlzQXR0YWNoZWQge2Jvb2xlYW59IFNldCB0byBgdHJ1ZWAgaW4gdGhpcyBlbGVtZW50J3MKICAgKiAgIGBjb25uZWN0ZWRDYWxsYmFja2AgYW5kIGBmYWxzZWAgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIFBvbHltZXIncyAibGVnYWN5IiBBUEkKICAgKi8KICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0VsZW1lbnRNaXhpbn0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0dlc3R1cmVFdmVudExpc3RlbmVyc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgbGVnYWN5RWxlbWVudEJhc2UgPSBQb2x5bWVyLkRpck1peGluKFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKFBvbHltZXIuRWxlbWVudE1peGluKGJhc2UpKSk7CgogICAgLyoqCiAgICAgKiBNYXAgb2Ygc2ltcGxlIG5hbWVzIHRvIHRvdWNoIGFjdGlvbiBuYW1lcwogICAgICogQGRpY3QKICAgICAqLwogICAgY29uc3QgRElSRUNUSU9OX01BUCA9IHsKICAgICAgJ3gnOiAncGFuLXgnLAogICAgICAneSc6ICdwYW4teScsCiAgICAgICdub25lJzogJ25vbmUnLAogICAgICAnYWxsJzogJ2F1dG8nCiAgICB9OwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAZXh0ZW5kcyB7bGVnYWN5RWxlbWVudEJhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9MZWdhY3lFbGVtZW50TWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIExlZ2FjeUVsZW1lbnQgZXh0ZW5kcyBsZWdhY3lFbGVtZW50QmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICB0aGlzLmlzQXR0YWNoZWQ7CiAgICAgICAgLyoqIEB0eXBlIHtXZWFrTWFwPCFFbGVtZW50LCAhT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPj59ICovCiAgICAgICAgdGhpcy5fX2JvdW5kTGlzdGVuZXJzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgRnVuY3Rpb24+fSAqLwogICAgICAgIHRoaXMuX2RlYm91bmNlcnM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBgaW1wb3J0TWV0YWAgZnJvbSB0aGUgcHJvdG90eXBlIChpLmUuIGZyb20gdGhlIGluZm8gb2JqZWN0CiAgICAgICAqIHBhc3NlZCB0byBgUG9seW1lcih7Li4ufSlgKSB0byB0aGUgc3RhdGljIEFQSS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IU9iamVjdH0gVGhlIGBpbXBvcnQubWV0YWAgb2JqZWN0IHNldCBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGB0aGlzYCBpcyBhbHdheXMgaW4gdGhlIGluc3RhbmNlIGluCiAgICAgICAqICBjbG9zdXJlIGZvciBzb21lIHJlYXNvbiBldmVuIGluIGEgc3RhdGljIG1ldGhvZCwgcmF0aGVyIHRoYW4gdGhlIGNsYXNzCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydE1ldGEoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmltcG9ydE1ldGE7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyB0aGUgYGNvbnN0cnVjdG9yYCwgZm9yIG92ZXJyaWRpbmcKICAgICAgICogYnkgdGhlIHVzZXIuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjcmVhdGVkKCkge30KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgY29ubmVjdGVkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgUG9seW1lciBsZWdhY3kgQVBJJ3MgYGF0dGFjaGVkYCBtZXRob2QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB0aGlzLmlzQXR0YWNoZWQgPSB0cnVlOwogICAgICAgIHRoaXMuYXR0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgYXR0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAgICogd2hpY2ggYWRkcyBQb2x5bWVyIGxlZ2FjeSBBUEkncyBgZGV0YWNoZWRgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIHRoaXMuaXNBdHRhY2hlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZGV0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGV0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIG92ZXJyaWRlIGltcGxlbWVudGF0aW9uIG9mIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgdGhlIFBvbHltZXIgbGVnYWN5IEFQSSdzIGBhdHRyaWJ1dGVDaGFuZ2VkYCBtZXRob2QuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBBdHRyaWJ1dGUgbmFtZXNwYWNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAob2xkICE9PSB2YWx1ZSkgewogICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWQobmFtZSwgb2xkLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogTGVnYWN5IGNhbGxiYWNrIGNhbGxlZCBkdXJpbmcgYGF0dHJpYnV0ZUNoYW5nZWRDaGFsbGJhY2tgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgQ3VycmVudCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkKG5hbWUsIG9sZCwgdmFsdWUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBpbXBsZW1lbnRhdGlvbiB0bwogICAgICAgKiBhZGQgc3VwcG9ydCBmb3IgY2xhc3MgaW5pdGlhbGl6YXRpb24gdmlhIHRoZSBgX3JlZ2lzdGVyZWRgIGNhbGxiYWNrLgogICAgICAgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBsZXQgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICAgICAgaWYgKCFwcm90by5oYXNPd25Qcm9wZXJ0eSgnX19oYXNSZWdpc3RlckZpbmlzaGVkJykpIHsKICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWQoKTsKICAgICAgICAgIC8vIGJhY2tzdG9wIGluIGNhc2UgdGhlIGBfcmVnaXN0ZXJlZGAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2V0IHRoaXMKICAgICAgICAgIHByb3RvLl9faGFzUmVnaXN0ZXJGaW5pc2hlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIHRoaXMucm9vdCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovKHRoaXMpOwogICAgICAgIHRoaXMuY3JlYXRlZCgpOwogICAgICAgIC8vIEVuc3VyZSBsaXN0ZW5lcnMgYXJlIGFwcGxpZWQgaW1tZWRpYXRlbHkgc28gdGhhdCB0aGV5IGFyZQogICAgICAgIC8vIGFkZGVkIGJlZm9yZSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMuIFRoaXMgYWxsb3dzIGFuIGVsZW1lbnQgdG8KICAgICAgICAvLyBkZWNvcmF0ZSBpdHNlbGYgdmlhIGFuIGV2ZW50IHByaW9yIHRvIGFueSBkZWNsYXJhdGl2ZSBsaXN0ZW5lcnMKICAgICAgICAvLyBzZWVpbmcgdGhlIGV2ZW50LiBOb3RlLCB0aGlzIGVuc3VyZXMgY29tcGF0aWJpbGl0eSB3aXRoIDEueCBvcmRlcmluZy4KICAgICAgICB0aGlzLl9hcHBseUxpc3RlbmVycygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBlbGVtZW50IGlzIGluaXRpYWxpemluZy4KICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gY2xhc3MgcmVnaXN0cmF0aW9uIHRpbWUKICAgICAgICogd29yay4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBlbnN1cmUgdGhlIHdvcmsgaXMgcGVyZm9ybWVkCiAgICAgICAqIG9ubHkgb25jZSBmb3IgdGhlIGNsYXNzLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVnaXN0ZXJlZCgpIHt9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgaW1wbGVtZW50YXRpb24gdG8KICAgICAgICogYWRkIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgYGhvc3RBdHRyaWJ1dGVzYCBhbmQgYGxpc3RlbmVyc2AuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgdGhpcy5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIGFuIGVsZW1lbnQgaGFzIHJlcXVpcmVkIGF0dHJpYnV0ZXMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0byBzZXQgdGhlCiAgICAgICAqIGVsZW1lbnQncyByZXF1aXJlZCBhdHRyaWJ1dGVzLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHN1cmUKICAgICAgICogdG8gY2hlY2sgYW5kIG5vdCBvdmVycmlkZSBleGlzdGluZyBhdHRyaWJ1dGVzIGFkZGVkIGJ5CiAgICAgICAqIHRoZSB1c2VyIG9mIHRoZSBlbGVtZW50LiBUeXBpY2FsbHksIHNldHRpbmcgYXR0cmlidXRlcyBzaG91bGQgYmUgbGVmdAogICAgICAgKiB0byB0aGUgZWxlbWVudCB1c2VyIGFuZCBub3QgZG9uZSBoZXJlOyByZWFzb25hYmxlIGV4Y2VwdGlvbnMgaW5jbHVkZQogICAgICAgKiBzZXR0aW5nIGFyaWEgcm9sZXMgYW5kIGZvY3VzYWJpbGl0eS4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2Vuc3VyZUF0dHJpYnV0ZXMoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgZWxlbWVudCBldmVudCBsaXN0ZW5lcnMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0bwogICAgICAgKiBhZGQgYW55IHJlcXVpcmVkIGVsZW1lbnQgZXZlbnQgbGlzdGVuZXJzLgogICAgICAgKiBJbiBwZXJmb3JtYW5jZSBjcml0aWNhbCBlbGVtZW50cywgdGhlIHdvcmsgZG9uZSBoZXJlIHNob3VsZCBiZSBrZXB0CiAgICAgICAqIHRvIGEgbWluaW11bSBzaW5jZSBpdCBpcyBkb25lIGJlZm9yZSB0aGUgZWxlbWVudCBpcyByZW5kZXJlZC4gSW4KICAgICAgICogdGhlc2UgZWxlbWVudHMsIGNvbnNpZGVyIGFkZGluZyBsaXN0ZW5lcnMgYXN5bmNocm9ub3VzbHkgc28gYXMgbm90IHRvCiAgICAgICAqIGJsb2NrIHJlbmRlci4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FwcGx5TGlzdGVuZXJzKCkge30KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLiBUbyBjdXN0b21pemUKICAgICAgICogaG93IHByb3BlcnRpZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYXR0cmlidXRlcyBmb3IgYXR0cmlidXRlIGJpbmRpbmdzIGFuZAogICAgICAgKiBgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlYCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgdGhpcyBtZXRob2QsIG92ZXJyaWRlCiAgICAgICAqIHRoZSBgX3NlcmlhbGl6ZVZhbHVlYCBtZXRob2QgcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU2VyaWFsaXplZCB2YWx1ZQogICAgICAgKi8KICAgICAgc2VyaWFsaXplKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuICBUbyBjdXN0b21pemUKICAgICAgICogaG93IGF0dHJpYnV0ZXMgYXJlIGRlc2VyaWFsaXplZCB0byBwcm9wZXJ0aWVzIGZvciBpbgogICAgICAgKiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCwgb3ZlcnJpZGUgYF9kZXNlcmlhbGl6ZVZhbHVlYCBtZXRob2QKICAgICAgICogcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgU3RyaW5nIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEBwYXJhbSB7Kn0gdHlwZSBUeXBlIHRvIGRlc2VyaWFsaXplIHRoZSBzdHJpbmcgdG8KICAgICAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgZGVzZXJpYWxpemVkIHZhbHVlIGluIHRoZSBgdHlwZWAgZ2l2ZW4uCiAgICAgICAqLwogICAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgdHlwZSkgewogICAgICAgIHJldHVybiB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0geyo9fSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byByZWZsZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVmbGVjdFByb3BlcnR5VG9BdHRyaWJ1dGUocHJvcGVydHksIGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICB0aGlzLl9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSB0eXBlZCB2YWx1ZSB0byBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBhIG5vZGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzZXJpYWxpemVWYWx1ZVRvQXR0cmlidXRlKHZhbHVlLCBhdHRyaWJ1dGUsIG5vZGUpIHsKICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpLCB2YWx1ZSwgYXR0cmlidXRlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvcGllcyBvd24gcHJvcGVydGllcyAoaW5jbHVkaW5nIGFjY2Vzc29yIGRlc2NyaXB0b3JzKSBmcm9tIGEgc291cmNlCiAgICAgICAqIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcGkgU291cmNlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS4KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBwcm90b3R5cGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudC4KICAgICAgICovCiAgICAgIGV4dGVuZChwcm90b3R5cGUsIGFwaSkgewogICAgICAgIGlmICghKHByb3RvdHlwZSAmJiBhcGkpKSB7CiAgICAgICAgICByZXR1cm4gcHJvdG90eXBlIHx8IGFwaTsKICAgICAgICB9CiAgICAgICAgbGV0IG4kID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXBpKTsKICAgICAgICBmb3IgKGxldCBpPTAsIG47IChpPG4kLmxlbmd0aCkgJiYgKG49biRbaV0pOyBpKyspIHsKICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXBpLCBuKTsKICAgICAgICAgIGlmIChwZCkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBuLCBwZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm90b3R5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb3BpZXMgcHJvcHMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSB0YXJnZXQgb2JqZWN0LgogICAgICAgKgogICAgICAgKiBOb3RlLCB0aGlzIG1ldGhvZCB1c2VzIGEgc2ltcGxlIGBmb3IuLi5pbmAgc3RyYXRlZ3kgZm9yIGVudW1lcmF0aW5nCiAgICAgICAqIHByb3BlcnRpZXMuICBUbyBlbnN1cmUgb25seSBgb3duUHJvcGVydGllc2AgYXJlIGNvcGllZCBmcm9tIHNvdXJjZQogICAgICAgKiB0byB0YXJnZXQgYW5kIHRoYXQgYWNjZXNzb3IgaW1wbGVtZW50YXRpb25zIGFyZSBjb3BpZWQsIHVzZSBgZXh0ZW5kYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshT2JqZWN0fSB0YXJnZXQgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gc291cmNlIFNvdXJjZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uCiAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IFRhcmdldCBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGFzIGZpcnN0IGFyZ3VtZW50LgogICAgICAgKi8KICAgICAgbWl4aW4odGFyZ2V0LCBzb3VyY2UpIHsKICAgICAgICBmb3IgKGxldCBpIGluIHNvdXJjZSkgewogICAgICAgICAgdGFyZ2V0W2ldID0gc291cmNlW2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgcHJvdG90eXBlIG9mIGFuIG9iamVjdC4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCBvbiB3aGljaCB0byBzZXQgdGhlIHByb3RvdHlwZS4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgcHJvdG90eXBlIHRoYXQgd2lsbCBiZSBzZXQgb24gdGhlIGdpdmVuCiAgICAgICAqIGBvYmplY3RgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdpdmVuIGBvYmplY3RgIHdpdGggaXRzIHByb3RvdHlwZSBzZXQKICAgICAgICogdG8gdGhlIGdpdmVuIGBwcm90b3R5cGVgIG9iamVjdC4KICAgICAgICovCiAgICAgIGNoYWluT2JqZWN0KG9iamVjdCwgcHJvdG90eXBlKSB7CiAgICAgICAgaWYgKG9iamVjdCAmJiBwcm90b3R5cGUgJiYgb2JqZWN0ICE9PSBwcm90b3R5cGUpIHsKICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gVGVtcGxhdGUgKioqKiAqLwoKICAgICAgLyoqCiAgICAgICAqIENhbGxzIGBpbXBvcnROb2RlYCBvbiB0aGUgYGNvbnRlbnRgIG9mIHRoZSBgdGVtcGxhdGVgIHNwZWNpZmllZCBhbmQKICAgICAgICogcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkIGNvbnRlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgSFRNTCB0ZW1wbGF0ZSBlbGVtZW50IHRvIGluc3RhbmNlLgogICAgICAgKiBAcmV0dXJuIHshRG9jdW1lbnRGcmFnbWVudH0gRG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyB0aGUgaW1wb3J0ZWQKICAgICAgICogICB0ZW1wbGF0ZSBjb250ZW50LgogICAgICAqLwogICAgICBpbnN0YW5jZVRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLmNvbnN0cnVjdG9yLl9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIGxldCBkb20gPSAvKiogQHR5cGUgeyFEb2N1bWVudEZyYWdtZW50fSAqLwogICAgICAgICAgKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gRXZlbnRzICoqKiogKi8KCgoKICAgICAgLyoqCiAgICAgICAqIERpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWwgdmFsdWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE5hbWUgb2YgZXZlbnQgdHlwZS4KICAgICAgICogQHBhcmFtIHsqPX0gZGV0YWlsIERldGFpbCB2YWx1ZSBjb250YWluaW5nIGV2ZW50LXNwZWNpZmljCiAgICAgICAqICAgcGF5bG9hZC4KICAgICAgICogQHBhcmFtIHt7IGJ1YmJsZXM6IChib29sZWFufHVuZGVmaW5lZCksIGNhbmNlbGFibGU6IChib29sZWFufHVuZGVmaW5lZCksIGNvbXBvc2VkOiAoYm9vbGVhbnx1bmRlZmluZWQpIH09fQogICAgICAgKiAgb3B0aW9ucyBPYmplY3Qgc3BlY2lmeWluZyBvcHRpb25zLiAgVGhlc2UgbWF5IGluY2x1ZGU6CiAgICAgICAqICBgYnViYmxlc2AgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGB0cnVlYCksCiAgICAgICAqICBgY2FuY2VsYWJsZWAgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGZhbHNlKSwgYW5kCiAgICAgICAqICBgbm9kZWAgb24gd2hpY2ggdG8gZmlyZSB0aGUgZXZlbnQgKEhUTUxFbGVtZW50LCBkZWZhdWx0cyB0byBgdGhpc2ApLgogICAgICAgKiBAcmV0dXJuIHshRXZlbnR9IFRoZSBuZXcgZXZlbnQgdGhhdCB3YXMgZmlyZWQuCiAgICAgICAqLwogICAgICBmaXJlKHR5cGUsIGRldGFpbCwgb3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIGRldGFpbCA9IChkZXRhaWwgPT09IG51bGwgfHwgZGV0YWlsID09PSB1bmRlZmluZWQpID8ge30gOiBkZXRhaWw7CiAgICAgICAgbGV0IGV2ZW50ID0gbmV3IEV2ZW50KHR5cGUsIHsKICAgICAgICAgIGJ1YmJsZXM6IG9wdGlvbnMuYnViYmxlcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuYnViYmxlcywKICAgICAgICAgIGNhbmNlbGFibGU6IEJvb2xlYW4ob3B0aW9ucy5jYW5jZWxhYmxlKSwKICAgICAgICAgIGNvbXBvc2VkOiBvcHRpb25zLmNvbXBvc2VkID09PSB1bmRlZmluZWQgPyB0cnVlOiBvcHRpb25zLmNvbXBvc2VkCiAgICAgICAgfSk7CiAgICAgICAgZXZlbnQuZGV0YWlsID0gZGV0YWlsOwogICAgICAgIGxldCBub2RlID0gb3B0aW9ucy5ub2RlIHx8IHRoaXM7CiAgICAgICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICByZXR1cm4gZXZlbnQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIGFuIGV2ZW50IGxpc3RlbmVyIG9uIGEgZ2l2ZW4gZWxlbWVudCwKICAgICAgICogbGF0ZSBib3VuZCB0byBhIG5hbWVkIG1ldGhvZCBvbiB0aGlzIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIGFkZCBldmVudCBsaXN0ZW5lciB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgaGFuZGxlciBtZXRob2Qgb24gYHRoaXNgIHRvIGNhbGwuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBsaXN0ZW4obm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgIGxldCBoYmwgPSB0aGlzLl9fYm91bmRMaXN0ZW5lcnMgfHwKICAgICAgICAgICh0aGlzLl9fYm91bmRMaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpKTsKICAgICAgICBsZXQgYmwgPSBoYmwuZ2V0KG5vZGUpOwogICAgICAgIGlmICghYmwpIHsKICAgICAgICAgIGJsID0ge307CiAgICAgICAgICBoYmwuc2V0KG5vZGUsIGJsKTsKICAgICAgICB9CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgaWYgKCFibFtrZXldKSB7CiAgICAgICAgICBibFtrZXldID0gdGhpcy5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZSgKICAgICAgICAgICAgbm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lLCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYSBnaXZlbiBlbGVtZW50LAogICAgICAgKiBsYXRlIGJvdW5kIHRvIGEgbmFtZWQgbWV0aG9kIG9uIHRoaXMgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIEVsZW1lbnQgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudCB0byBzdG9wIGxpc3RlbmluZyB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBoYW5kbGVyIG1ldGhvZCBvbiBgdGhpc2AgdG8gbm90IGNhbGwKICAgICAgIGFueW1vcmUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB1bmxpc3Rlbihub2RlLCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgbGV0IGJsID0gdGhpcy5fX2JvdW5kTGlzdGVuZXJzICYmIHRoaXMuX19ib3VuZExpc3RlbmVycy5nZXQobm9kZSk7CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBibCAmJiBibFtrZXldOwogICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICB0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIGJsW2tleV0gPSBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHNjcm9sbGluZyBiZWhhdmlvciB0byBhbGwgZGlyZWN0aW9uLCBvbmUgZGlyZWN0aW9uLCBvciBub25lLgogICAgICAgKgogICAgICAgKiBWYWxpZCBzY3JvbGwgZGlyZWN0aW9uczoKICAgICAgICogICAtICdhbGwnOiBzY3JvbGwgaW4gYW55IGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3gnOiBzY3JvbGwgb25seSBpbiB0aGUgJ3gnIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3knOiBzY3JvbGwgb25seSBpbiB0aGUgJ3knIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ25vbmUnOiBkaXNhYmxlIHNjcm9sbGluZyBmb3IgdGhpcyBub2RlCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBhbGxvdyBzY3JvbGxpbmcKICAgICAgICogRGVmYXVsdHMgdG8gYGFsbGAuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSBzY3JvbGwgZGlyZWN0aW9uIHNldHRpbmcuCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNldFNjcm9sbERpcmVjdGlvbihkaXJlY3Rpb24sIG5vZGUpIHsKICAgICAgICBQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyksIERJUkVDVElPTl9NQVBbZGlyZWN0aW9uXSB8fCAnYXV0bycpOwogICAgICB9CiAgICAgIC8qICoqKiogRW5kIEV2ZW50cyAqKioqICovCgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJ1biBgcXVlcnlTZWxlY3RvcmAgb24gdGhpcyBsb2NhbCBET00gc2NvcGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgYFBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcihzbGN0cilgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2xjdHIgU2VsZWN0b3IgdG8gcnVuIG9uIHRoaXMgbG9jYWwgRE9NIHNjb3BlCiAgICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IEVsZW1lbnQgZm91bmQgYnkgdGhlIHNlbGVjdG9yLCBvciBudWxsIGlmIG5vdCBmb3VuZC4KICAgICAgICovCiAgICAgICQkKHNsY3RyKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKHNsY3RyKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybiB0aGUgZWxlbWVudCB3aG9zZSBsb2NhbCBkb20gd2l0aGluIHdoaWNoIHRoaXMgZWxlbWVudAogICAgICAgKiBpcyBjb250YWluZWQuIFRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yCiAgICAgICAqIGB0aGlzLmdldFJvb3ROb2RlKCkuaG9zdGAuCiAgICAgICAqIEB0aGlzIHtFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0IGRvbUhvc3QoKSB7CiAgICAgICAgbGV0IHJvb3QgPSB0aGlzLmdldFJvb3ROb2RlKCk7CiAgICAgICAgcmV0dXJuIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkgPyAvKiogQHR5cGUge1NoYWRvd1Jvb3R9ICovIChyb290KS5ob3N0IDogcm9vdDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcmNlIHRoaXMgZWxlbWVudCB0byBkaXN0cmlidXRlIGl0cyBjaGlsZHJlbiB0byBpdHMgbG9jYWwgZG9tLgogICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGFzIG9mIFBvbHltZXIgMi4wLjIgYW5kIGlzIHByb3ZpZGVkIG9ubHkKICAgICAgICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGlzdHJpYnV0ZUNvbnRlbnQoKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLnNoYWRvd1Jvb3QpIHsKICAgICAgICAgIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZE5vZGVzLiBUaGUgZWZmZWN0aXZlCiAgICAgICAqIGNoaWxkTm9kZXMgbGlzdCBpcyB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCdzIGNoaWxkTm9kZXMgZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIG5vZGVzIGRpc3RyaWJ1dGVkCiAgICAgICAqIHRvIHRoZSBgPGNvbnRlbnQ+YCwgdGhlIHJlc3VsdCBvZiBpdHMgYGdldERpc3RyaWJ1dGVkTm9kZXNgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGQgbm9kZXMuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuIEhUTUxFbGVtZW50CiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICAgIGNvbnN0IHRoaXNFbCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKHRoaXMpOwogICAgICAgIGNvbnN0IGRvbUFwaSA9IC8qKiBAdHlwZSB7UG9seW1lci5Eb21BcGl9ICovKFBvbHltZXIuZG9tKHRoaXNFbCkpOwogICAgICAgIHJldHVybiBkb21BcGkuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgZGlzdHJpYnV0ZWQgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0IG1hdGNoCiAgICAgICAqIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGRyZW4gb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQgdG8KICAgICAgICogY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBkaXN0cmlidXRlZCBlbGVtZW50cyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gTGVnYWN5RWxlbWVudE1peGluIG11c3QgYmUgYXBwbGllZCB0byBhbiBIVE1MRWxlbWVudAogICAgICAgKi8KICAgICAgcXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKSB7CiAgICAgICAgY29uc3QgdGhpc0VsID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAodGhpcyk7CiAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20odGhpc0VsKSk7CiAgICAgICAgcmV0dXJuIGRvbUFwaS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZHJlbi4gVGhlIGVmZmVjdGl2ZQogICAgICAgKiBjaGlsZHJlbiBsaXN0IGlzIHRoZSBzYW1lIGFzIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4gZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIGVsZW1lbnRzCiAgICAgICAqIGRpc3RyaWJ1dGVkIHRvIHRoZSBgPGNvbnRlbnQ+YC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGRyZW4uCiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZHJlbigpIHsKICAgICAgICBsZXQgbGlzdCA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbigvKiogQHR5cGUgeyFOb2RlfSAqLyBuKSB7CiAgICAgICAgICByZXR1cm4gKG4ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgb2YgdGV4dCBjb250ZW50IHRoYXQgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlCiAgICAgICAqIHRleHQgY29udGVudCdzIG9mIHRoZSBlbGVtZW50J3MgZWZmZWN0aXZlIGNoaWxkTm9kZXMgKHRoZSBlbGVtZW50cwogICAgICAgKiByZXR1cm5lZCBieSA8YSBocmVmPSIjZ2V0RWZmZWN0aXZlQ2hpbGROb2Rlcz5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzPC9hPi4KICAgICAgICoKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZHJlbi4KICAgICAgICovCiAgICAgIGdldEVmZmVjdGl2ZVRleHRDb250ZW50KCkgewogICAgICAgIGxldCBjbiA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIGxldCB0YyA9IFtdOwogICAgICAgIGZvciAobGV0IGk9MCwgYzsgKGMgPSBjbltpXSk7IGkrKykgewogICAgICAgICAgaWYgKGMubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIHRjLnB1c2goYy50ZXh0Q29udGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0Yy5qb2luKCcnKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVmZmVjdGl2ZSBjaGlsZE5vZGUgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0CiAgICAgICAqIG1hdGNoIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGQgbm9kZXMgb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQKICAgICAgICogdG8gY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7Tm9kZX0gRmlyc3QgZWZmZWN0aXZlIGNoaWxkIG5vZGUgdGhhdCBtYXRjaGVzIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIGxldCBlJCA9IHRoaXMucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKTsKICAgICAgICByZXR1cm4gZSQgJiYgZSRbMF07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBlZmZlY3RpdmUgY2hpbGROb2RlcyB3aXRoaW4gdGhpcyBlbGVtZW50IHRoYXQKICAgICAgICogbWF0Y2ggYHNlbGVjdG9yYC4gVGhlc2UgY2FuIGJlIGRvbSBjaGlsZCBub2RlcyBvciBlbGVtZW50cyBkaXN0cmlidXRlZAogICAgICAgKiB0byBjaGlsZHJlbiB0aGF0IGFyZSBpbnNlcnRpb24gcG9pbnRzLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gcnVuLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZCBub2RlcyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlBbGxFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3Rvcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBub2RlcyBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzIGxvY2FsIERPTSwKICAgICAgICogYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQgY29udGVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBzbGN0ciBDU1Mgc2VsZWN0b3IgdG8gY2hvb3NlIHRoZSBkZXNpcmVkCiAgICAgICAqICAgYDxzbG90PmAuICBEZWZhdWx0cyB0byBgY29udGVudGAuCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZGlzdHJpYnV0ZWQgbm9kZXMgZm9yIHRoZSBgPHNsb3Q+YC4KICAgICAgICovCiAgICAgIGdldENvbnRlbnRDaGlsZE5vZGVzKHNsY3RyKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcihzbGN0ciB8fCAnc2xvdCcpOwogICAgICAgIHJldHVybiBjb250ZW50ID8gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20oY29udGVudCkpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSA6IFtdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudCBjaGlsZHJlbiBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncwogICAgICAgKiBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzCiAgICAgICAqIGxvY2FsIERPTSwgYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQKICAgICAgICogY29udGVudC4gIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgZ2V0Q29udGVudENoaWxkTm9kZXNgIGluIHRoYXQgb25seQogICAgICAgKiBlbGVtZW50cyBhcmUgcmV0dXJuZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2xjdHIgQ1NTIHNlbGVjdG9yIHRvIGNob29zZSB0aGUgZGVzaXJlZAogICAgICAgKiAgIGA8Y29udGVudD5gLiAgRGVmYXVsdHMgdG8gYGNvbnRlbnRgLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gTGlzdCBvZiBkaXN0cmlidXRlZCBub2RlcyBmb3IgdGhlCiAgICAgICAqICAgYDxzbG90PmAuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgZ2V0Q29udGVudENoaWxkcmVuKHNsY3RyKSB7CiAgICAgICAgbGV0IGNoaWxkcmVuID0gLyoqIEB0eXBlIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gKi8odGhpcy5nZXRDb250ZW50Q2hpbGROb2RlcyhzbGN0cikuZmlsdGVyKGZ1bmN0aW9uKG4pIHsKICAgICAgICAgIHJldHVybiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gY2hpbGRyZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IGlzIGluIHRoaXMgZWxlbWVudCdzIGxpZ2h0IERPTSB0cmVlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0gez9Ob2RlfSBub2RlIFRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbm9kZSBpcyBpbiB0aGlzIGVsZW1lbnQncyBsaWdodCBET00gdHJlZS4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGlzTGlnaHREZXNjZW5kYW50KG5vZGUpIHsKICAgICAgICBjb25zdCB0aGlzTm9kZSA9IC8qKiBAdHlwZSB7Tm9kZX0gKi8gKHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzTm9kZSAhPT0gbm9kZSAmJiB0aGlzTm9kZS5jb250YWlucyhub2RlKSAmJgogICAgICAgICAgdGhpc05vZGUuZ2V0Um9vdE5vZGUoKSA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBpbiB0aGlzIGVsZW1lbnQncyBsb2NhbCBET00gdHJlZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gbm9kZSBUaGUgZWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG5vZGUgaXMgaW4gdGhpcyBlbGVtZW50J3MgbG9jYWwgRE9NIHRyZWUuCiAgICAgICAqLwogICAgICBpc0xvY2FsRGVzY2VuZGFudChub2RlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdCA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTm8tb3AgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHNob3VsZCBub3cgYmUgaGFuZGxlZCBieQogICAgICAgKiBTaGFkeUNzcyBsaWJyYXJ5LgogICAgICAgKiBAcGFyYW0gIHsqfSBjb250YWluZXIgVW51c2VkCiAgICAgICAqIEBwYXJhbSAgeyp9IHNob3VsZE9ic2VydmUgVW51c2VkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzY29wZVN1YnRyZWUoY29udGFpbmVyLCBzaG91bGRPYnNlcnZlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGNvbXB1dGVkIHN0eWxlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgY3NzIHByb3BlcnR5IG5hbWUuCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgY29tcHV0ZWQgY3NzIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZ2l2ZW4KICAgICAgICogYHByb3BlcnR5YC4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGdldENvbXB1dGVkU3R5bGVWYWx1ZShwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiBzdHlsZUludGVyZmFjZS5nZXRDb21wdXRlZFN0eWxlVmFsdWUoLyoqIEB0eXBlIHshRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLy8gZGVib3VuY2UKCiAgICAgIC8qKgogICAgICAgKiBDYWxsIGBkZWJvdW5jZWAgdG8gY29sbGFwc2UgbXVsdGlwbGUgcmVxdWVzdHMgZm9yIGEgbmFtZWQgdGFzayBpbnRvCiAgICAgICAqIG9uZSBpbnZvY2F0aW9uIHdoaWNoIGlzIG1hZGUgYWZ0ZXIgdGhlIHdhaXQgdGltZSBoYXMgZWxhcHNlZCB3aXRoCiAgICAgICAqIG5vIG5ldyByZXF1ZXN0LiAgSWYgbm8gd2FpdCB0aW1lIGlzIGdpdmVuLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQKICAgICAgICogYXQgbWljcm90YXNrIHRpbWluZyAoZ3VhcmFudGVlZCBiZWZvcmUgcGFpbnQpLgogICAgICAgKgogICAgICAgKiAgICAgZGVib3VuY2VkQ2xpY2tBY3Rpb24oZSkgewogICAgICAgKiAgICAgICAvLyB3aWxsIG5vdCBjYWxsIGBwcm9jZXNzQ2xpY2tgIG1vcmUgdGhhbiBvbmNlIHBlciAxMDBtcwogICAgICAgKiAgICAgICB0aGlzLmRlYm91bmNlKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgKiAgICAgICAgdGhpcy5wcm9jZXNzQ2xpY2soKTsKICAgICAgICogICAgICAgfSAxMDApOwogICAgICAgKiAgICAgfQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBTdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGRlYm91bmNlIGpvYi4KICAgICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkICh3aXRoIGB0aGlzYAogICAgICAgKiAgIGNvbnRleHQpIHdoZW4gdGhlIHdhaXQgdGltZSBlbGFwc2VzLgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBPcHRpb25hbCB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzIChtcykgYWZ0ZXIgdGhlCiAgICAgICAqICAgbGFzdCBzaWduYWwgdGhhdCBtdXN0IGVsYXBzZSBiZWZvcmUgaW52b2tpbmcgYGNhbGxiYWNrYAogICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBSZXR1cm5zIGEgZGVib3VuY2VyIG9iamVjdCBvbiB3aGljaCBleGlzdHMgdGhlCiAgICAgICAqIGZvbGxvd2luZyBtZXRob2RzOiBgaXNBY3RpdmUoKWAgcmV0dXJucyB0cnVlIGlmIHRoZSBkZWJvdW5jZXIgaXMKICAgICAgICogYWN0aXZlOyBgY2FuY2VsKClgIGNhbmNlbHMgdGhlIGRlYm91bmNlciBpZiBpdCBpcyBhY3RpdmU7CiAgICAgICAqIGBmbHVzaCgpYCBpbW1lZGlhdGVseSBpbnZva2VzIHRoZSBkZWJvdW5jZWQgY2FsbGJhY2sgaWYgdGhlIGRlYm91bmNlcgogICAgICAgKiBpcyBhY3RpdmUuCiAgICAgICAqLwogICAgICBkZWJvdW5jZShqb2JOYW1lLCBjYWxsYmFjaywgd2FpdCkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgICAgdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXQogICAgICAgICAgICAsIHdhaXQgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LmFmdGVyKHdhaXQpIDogUG9seW1lci5Bc3luYy5taWNyb1Rhc2sKICAgICAgICAgICAgLCBjYWxsYmFjay5iaW5kKHRoaXMpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciBhIG5hbWVkIGRlYm91bmNlciBpcyBhY3RpdmUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZSAoaGFzIG5vdCB5ZXQgZmlyZWQpLgogICAgICAgKi8KICAgICAgaXNEZWJvdW5jZXJBY3RpdmUoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIHJldHVybiAhIShkZWJvdW5jZXIgJiYgZGVib3VuY2VyLmlzQWN0aXZlKCkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSW1tZWRpYXRlbHkgY2FsbHMgdGhlIGRlYm91bmNlciBgY2FsbGJhY2tgIGFuZCBpbmFjdGl2YXRlcyBpdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZmx1c2hEZWJvdW5jZXIoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIGlmIChkZWJvdW5jZXIpIHsKICAgICAgICAgIGRlYm91bmNlci5mbHVzaCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlci4gIFRoZSBgY2FsbGJhY2tgIHdpbGwgbm90IGJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsRGVib3VuY2VyKGpvYk5hbWUpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICBsZXQgZGVib3VuY2VyID0gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXTsKICAgICAgICBpZiAoZGVib3VuY2VyKSB7CiAgICAgICAgICBkZWJvdW5jZXIuY2FuY2VsKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUnVucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LgogICAgICAgKgogICAgICAgKiBCeSBkZWZhdWx0IChpZiBubyB3YWl0VGltZSBpcyBzcGVjaWZpZWQpLCBhc3luYyBjYWxsYmFja3MgYXJlIHJ1biBhdAogICAgICAgKiBtaWNyb3Rhc2sgdGltaW5nLCB3aGljaCB3aWxsIG9jY3VyIGJlZm9yZSBwYWludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4sIGJvdW5kIHRvIGB0aGlzYC4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSB3YWl0VGltZSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgdGhlCiAgICAgICAqICAgYGNhbGxiYWNrYC4gIElmIHVuc3BlY2lmaWVkIG9yIDAsIHRoZSBjYWxsYmFjayB3aWxsIGJlIHJ1biBhdCBtaWNyb3Rhc2sKICAgICAgICogICB0aW1pbmcgKGJlZm9yZSBwYWludCkuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHRoYXQgbWF5IGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBhc3luYyBqb2IuCiAgICAgICAqLwogICAgICBhc3luYyhjYWxsYmFjaywgd2FpdFRpbWUpIHsKICAgICAgICByZXR1cm4gd2FpdFRpbWUgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LnJ1bihjYWxsYmFjay5iaW5kKHRoaXMpLCB3YWl0VGltZSkgOgogICAgICAgICAgICB+UG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKGNhbGxiYWNrLmJpbmQodGhpcykpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhbiBhc3luYyBvcGVyYXRpb24gc3RhcnRlZCB3aXRoIGBhc3luY2AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gb3JpZ2luYWwgYGFzeW5jYCBjYWxsIHRvCiAgICAgICAqICAgY2FuY2VsLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsQXN5bmMoaGFuZGxlKSB7CiAgICAgICAgaGFuZGxlIDwgMCA/IFBvbHltZXIuQXN5bmMubWljcm9UYXNrLmNhbmNlbCh+aGFuZGxlKSA6CiAgICAgICAgICAgIFBvbHltZXIuQXN5bmMudGltZU91dC5jYW5jZWwoaGFuZGxlKTsKICAgICAgfQoKICAgICAgLy8gb3RoZXIKCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGVsZW1lbnQgYW5kIGNvbmZpZ3VyaW5nIGl0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIEhUTUwgZWxlbWVudCB0YWcgdG8gY3JlYXRlLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BzIE9iamVjdCBvZiBwcm9wZXJ0aWVzIHRvIGNvbmZpZ3VyZSBvbiB0aGUKICAgICAgICogICAgaW5zdGFuY2UuCiAgICAgICAqIEByZXR1cm4geyFFbGVtZW50fSBOZXdseSBjcmVhdGVkIGFuZCBjb25maWd1cmVkIGVsZW1lbnQuCiAgICAgICAqLwogICAgICBjcmVhdGUodGFnLCBwcm9wcykgewogICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICBpZiAoZWx0LnNldFByb3BlcnRpZXMpIHsKICAgICAgICAgICAgZWx0LnNldFByb3BlcnRpZXMocHJvcHMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgbiBpbiBwcm9wcykgewogICAgICAgICAgICAgIGVsdFtuXSA9IHByb3BzW25dOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGltcG9ydGluZyBhbiBIVE1MIGRvY3VtZW50IGltcGVyYXRpdmVseS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBgPGxpbmsgcmVsPSJpbXBvcnQiPmAgZWxlbWVudCB3aXRoCiAgICAgICAqIHRoZSBwcm92aWRlZCBVUkwgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGRvY3VtZW50IHRvIHN0YXJ0IGxvYWRpbmcuCiAgICAgICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgICAgICogZWxlbWVudCB3aWxsIGNvbnRhaW4gdGhlIGltcG9ydGVkIGRvY3VtZW50IGNvbnRlbnRzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBVUkwgdG8gZG9jdW1lbnQgdG8gbG9hZC4KICAgICAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUV2ZW50KTp2b2lkPX0gb25sb2FkIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydCBzdWNjZXNzZnVsbHkKICAgICAgICogICBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFcnJvckV2ZW50KTp2b2lkPX0gb25lcnJvciBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQKICAgICAgICogICB1bnN1Y2Nlc3NmdWxseSBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICAgICAqICAgRGVmYXVsdHMgdG8gYGZhbHNlYC4KICAgICAgICogQHJldHVybiB7IUhUTUxMaW5rRWxlbWVudH0gVGhlIGxpbmsgZWxlbWVudCBmb3IgdGhlIFVSTCB0byBiZSBsb2FkZWQuCiAgICAgICAqLwogICAgICBpbXBvcnRIcmVmKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIGxldCBsb2FkRm4gPSBvbmxvYWQgPyBvbmxvYWQuYmluZCh0aGlzKSA6IG51bGw7CiAgICAgICAgbGV0IGVycm9yRm4gPSBvbmVycm9yID8gb25lcnJvci5iaW5kKHRoaXMpIDogbnVsbDsKICAgICAgICByZXR1cm4gUG9seW1lci5pbXBvcnRIcmVmKGhyZWYsIGxvYWRGbiwgZXJyb3JGbiwgb3B0QXN5bmMpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUG9seWZpbGwgZm9yIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMsIHdoaWNoIGlzIHNvbWV0aW1lcyBzdGlsbAogICAgICAgKiBwcmVmaXhlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHRlc3QuCiAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnQ9fSBub2RlIEVsZW1lbnQgdG8gdGVzdCB0aGUgc2VsZWN0b3IgYWdhaW5zdC4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4KICAgICAgICovCiAgICAgIGVsZW1lbnRNYXRjaGVzKHNlbGVjdG9yLCBub2RlKSB7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvcigvKiogQHR5cGUgeyFFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKSwgc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEhUTUwgYXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gYm9vbCBCb29sZWFuIHRvIGZvcmNlIHRoZSBhdHRyaWJ1dGUgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHJldmVyc2VkLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIE5vZGUgdG8gdGFyZ2V0LiAgRGVmYXVsdHMgdG8gYHRoaXNgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdG9nZ2xlQXR0cmlidXRlKG5hbWUsIGJvb2wsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBib29sID0gIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpOwogICAgICAgIH0KICAgICAgICBpZiAoYm9vbCkgewogICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICB9CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhIENTUyBjbGFzcyBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBjbGFzcyBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGJvb2wgQm9vbGVhbiB0byBmb3JjZSB0aGUgY2xhc3Mgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgcmV2ZXJzZWQuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgTm9kZSB0byB0YXJnZXQuICBEZWZhdWx0cyB0byBgdGhpc2AuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0b2dnbGVDbGFzcyhuYW1lLCBib29sLCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgICAgYm9vbCA9ICFub2RlLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJvb2wpIHsKICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKG5hbWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3Igc2V0dGluZyBhbiBlbGVtZW50J3MgQ1NTIGB0cmFuc2Zvcm1gIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNmb3JtVGV4dCBUcmFuc2Zvcm0gc2V0dGluZy4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdHJhbnNmb3JtKHRyYW5zZm9ybVRleHQsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBub2RlLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybVRleHQ7CiAgICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZXh0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBzZXR0aW5nIGFuIGVsZW1lbnQncyBDU1MgYHRyYW5zbGF0ZTNkYAogICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHggWCBvZmZzZXQuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFkgb2Zmc2V0LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0geiBaIG9mZnNldC4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRyYW5zbGF0ZTNkKHgsIHksIHosIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICB0aGlzLnRyYW5zZm9ybSgndHJhbnNsYXRlM2QoJyArIHggKyAnLCcgKyB5ICsgJywnICsgeiArICcpJywgbm9kZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSBhbiBhcnJheSwgaWYgaXQgZXhpc3RzLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgc3BlY2lmaWVkIGJ5IHBhdGgsIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcwogICAgICAgKiBnZW5lcmF0ZWQsIHNvIHRoYXQgb2JzZXJ2ZXJzLCBkYXRhIGJpbmRpbmdzIGFuZCBjb21wdXRlZAogICAgICAgKiBwcm9wZXJ0aWVzIHdhdGNoaW5nIHRoYXQgcGF0aCBjYW4gdXBkYXRlLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgcGFzc2VkIGRpcmVjdGx5LCAqKm5vIGNoYW5nZQogICAgICAgKiBub3RpZmljYXRpb24gaXMgZ2VuZXJhdGVkKiouCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PG51bWJlcnxzdHJpbmc+fSBhcnJheU9yUGF0aCBQYXRoIHRvIGFycmF5IGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBpdGVtCiAgICAgICAqICAgKG9yIHRoZSBhcnJheSBpdHNlbGYpLgogICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSB0byByZW1vdmUuCiAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIGl0ZW0gcmVtb3ZlZC4KICAgICAgICovCiAgICAgIGFycmF5RGVsZXRlKGFycmF5T3JQYXRoLCBpdGVtKSB7CiAgICAgICAgbGV0IGluZGV4OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5T3JQYXRoKSkgewogICAgICAgICAgaW5kZXggPSBhcnJheU9yUGF0aC5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5T3JQYXRoLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxldCBhcnIgPSBQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIGFycmF5T3JQYXRoKTsKICAgICAgICAgIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpY2UoYXJyYXlPclBhdGgsIGluZGV4LCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIC8vIGxvZ2dpbmcKCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLmxvZ2AvYHdhcm5gL2BlcnJvcmAgYXMgb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbCBPbmUgb2YgJ2xvZycsICd3YXJuJywgJ2Vycm9yJwogICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2dnZXIobGV2ZWwsIGFyZ3MpIHsKICAgICAgICAvLyBhY2NlcHQgWydmb28nLCAnYmFyJ10gYW5kIFtbJ2ZvbycsICdiYXInXV0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7CiAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoKGxldmVsKSB7CiAgICAgICAgICBjYXNlICdsb2cnOgogICAgICAgICAgY2FzZSAnd2Fybic6CiAgICAgICAgICBjYXNlICdlcnJvcic6CiAgICAgICAgICAgIGNvbnNvbGVbbGV2ZWxdKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZhY2FkZXMgYGNvbnNvbGUubG9nYCBhcyBhbiBvdmVycmlkZSBwb2ludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2coLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignbG9nJywgYXJncyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLndhcm5gIGFzIGFuIG92ZXJyaWRlIHBvaW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3dhcm4oLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignd2FybicsIGFyZ3MpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmFjYWRlcyBgY29uc29sZS5lcnJvcmAgYXMgYW4gb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZXJyb3IoLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignZXJyb3InLCBhcmdzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcm1hdHMgYSBtZXNzYWdlIHVzaW5nIHRoZSBlbGVtZW50IHR5cGUgYW4gYSBtZXRob2QgbmFtZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gYXNzb2NpYXRlIHdpdGggbWVzc2FnZQogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgd2l0aCBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGZvciBgY29uc29sZWAKICAgICAgICogICBsb2dnaW5nLgogICAgICAgKi8KICAgICAgX2xvZ2YobWV0aG9kTmFtZSwgLi4uYXJncykgewogICAgICAgIHJldHVybiBbJ1slczo6JXNdJywgdGhpcy5pcywgbWV0aG9kTmFtZSwgLi4uYXJnc107CiAgICAgIH0KCiAgICB9CgogICAgTGVnYWN5RWxlbWVudC5wcm90b3R5cGUuaXMgPSAnJzsKCiAgICByZXR1cm4gTGVnYWN5RWxlbWVudDsKCiAgfSk7Cgp9KSgpOwoKCgogIChmdW5jdGlvbigpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgY29uc3QgbGlmZWN5Y2xlUHJvcHMgPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBsaXN0ZW5lcnM6IHRydWUsCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB0cnVlCiAgICB9OwoKICAgIGNvbnN0IGV4Y2x1ZGVPbkluZm8gPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBiZWhhdmlvcnM6IHRydWUsCiAgICAgIF9ub0FjY2Vzc29yczogdHJ1ZQogICAgfTsKCiAgICBjb25zdCBleGNsdWRlT25CZWhhdmlvcnMgPSBPYmplY3QuYXNzaWduKHsKICAgICAgbGlzdGVuZXJzOiB0cnVlLAogICAgICBob3N0QXR0cmlidXRlczogdHJ1ZSwKICAgICAgcHJvcGVydGllczogdHJ1ZSwKICAgICAgb2JzZXJ2ZXJzOiB0cnVlLAogICAgfSwgZXhjbHVkZU9uSW5mbyk7CgogICAgZnVuY3Rpb24gY29weVByb3BlcnRpZXMoc291cmNlLCB0YXJnZXQsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb25zdCBub0FjY2Vzc29ycyA9IHNvdXJjZS5fbm9BY2Nlc3NvcnM7CiAgICAgIGZvciAobGV0IHAgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKCEocCBpbiBleGNsdWRlUHJvcHMpKSB7CiAgICAgICAgICBpZiAobm9BY2Nlc3NvcnMpIHsKICAgICAgICAgICAgdGFyZ2V0W3BdID0gc291cmNlW3BdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHApOwogICAgICAgICAgICBpZiAocGQpIHsKICAgICAgICAgICAgICAvLyBlbnN1cmUgcHJvcGVydHkgaXMgY29uZmlndXJhYmxlIHNvIHRoYXQgYSBsYXRlciBiZWhhdmlvciBjYW4KICAgICAgICAgICAgICAvLyByZS1jb25maWd1cmUgaXQuCiAgICAgICAgICAgICAgcGQuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwLCBwZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFwcGxpZXMgYSAibGVnYWN5IiBiZWhhdmlvciBvciBhcnJheSBvZiBiZWhhdmlvcnMgdG8gdGhlIHByb3ZpZGVkIGNsYXNzLgogICAgICoKICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBhbHNvIGFwcGx5IHRoZSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gCiAgICAgKiB0byBlbnN1cmUgdGhhdCBhbnkgbGVnYWN5IGJlaGF2aW9ycyBjYW4gcmVseSBvbiBsZWdhY3kgUG9seW1lciBBUEkgb24KICAgICAqIHRoZSB1bmRlcmx5aW5nIGVsZW1lbnQuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7IU9iamVjdHwhQXJyYXk8IU9iamVjdD59IGJlaGF2aW9ycyBCZWhhdmlvciBvYmplY3Qgb3IgYXJyYXkgb2YgYmVoYXZpb3JzLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IGtsYXNzIEVsZW1lbnQgY2xhc3MuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IFJldHVybnMgYSBuZXcgRWxlbWVudCBjbGFzcyBleHRlbmRlZCBieSB0aGUKICAgICAqIHBhc3NlZCBpbiBgYmVoYXZpb3JzYCBhbmQgYWxzbyBieSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gLgogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICBmdW5jdGlvbiBtaXhpbkJlaGF2aW9ycyhiZWhhdmlvcnMsIGtsYXNzKSB7CiAgICAgIHJldHVybiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oe30sIFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKGtsYXNzKSwgYmVoYXZpb3JzKTsKICAgIH0KCiAgICAvLyBOT1RFOgogICAgLy8gMS54CiAgICAvLyBCZWhhdmlvcnMgd2VyZSBtaXhlZCBpbiAqaW4gcmV2ZXJzZSBvcmRlciogYW5kIGRlLWR1cGVkIG9uIHRoZSBmbHkuCiAgICAvLyBUaGUgcnVsZSB3YXMgdGhhdCBiZWhhdmlvciBwcm9wZXJ0aWVzIHdlcmUgY29waWVkIG9udG8gdGhlIGVsZW1lbnQKICAgIC8vIHByb3RvdHlwZSBpZiBhbmQgb25seSBpZiB0aGUgcHJvcGVydHkgZGlkIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgLy8gR2l2ZW46IFBvbHltZXJ7IGJlaGF2aW9yczogW0EsIEIsIEMsIEEsIEJdfSwgcHJvcGVydHkgY29weSBvcmRlciB3YXM6CiAgICAvLyAoMSksIEIsICgyKSwgQSwgKDMpIEMuIFRoaXMgbWVhbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgd2luIG92ZXIKICAgIC8vIEIgcHJvcGVydGllcyB3aW4gb3ZlciBBIHdpbiBvdmVyIEMuIFRoaXMgbWlycm9ycyB3aGF0IHdvdWxkIGhhcHBlbgogICAgLy8gd2l0aCBpbmhlcml0YW5jZSBpZiBlbGVtZW50IGV4dGVuZGVkIEIgZXh0ZW5kZWQgQSBleHRlbmRlZCBDLgogICAgLy8KICAgIC8vIEFnYWluIGdpdmVuLCBQb2x5bWVyeyBiZWhhdmlvcnM6IFtBLCBCLCBDLCBBLCBCXX0sIHRoZSByZXN1bHRpbmcKICAgIC8vIGBiZWhhdmlvcnNgIGFycmF5IHdhcyBbQywgQSwgQl0uCiAgICAvLyBCZWhhdmlvciBsaWZlY3ljbGUgbWV0aG9kcyB3ZXJlIGNhbGxlZCBpbiBiZWhhdmlvciBhcnJheSBvcmRlcgogICAgLy8gZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnQsIGUuZy4gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwKICAgIC8vICgzKSBCLmNyZWF0ZWQsICg0KSBlbGVtZW50LmNyZWF0ZWQuIFRoZXJlIHdhcyBubyBzdXBwb3J0IGZvcgogICAgLy8gc3VwZXIsIGFuZCAic3VwZXItYmVoYXZpb3IiIG1ldGhvZHMgd2VyZSBjYWxsYWJsZSBvbmx5IGJ5IG5hbWUpLgogICAgLy8KICAgIC8vIDIueAogICAgLy8gQmVoYXZpb3JzIGFyZSBtYWRlIGludG8gcHJvcGVyIG1peGlucyB3aGljaCBsaXZlIGluIHRoZQogICAgLy8gZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi4gQmVoYXZpb3JzIGFyZSBwbGFjZWQgaW4gdGhlIGVsZW1lbnQgcHJvdG90eXBlCiAgICAvLyBlbGRlc3QgdG8geW91bmdlc3QgYW5kIGRlLWR1cGVkIHlvdW5nZXN0IHRvIG9sZGVzdDoKICAgIC8vIFNvLCBmaXJzdCBbQSwgQiwgQywgQSwgQl0gYmVjb21lcyBbQywgQSwgQl0gdGhlbiwKICAgIC8vIHRoZSBlbGVtZW50IHByb3RvdHlwZSBiZWNvbWVzIChvbGRlc3QpICgxKSBQb2x5bWVyLkVsZW1lbnQsICgyKSBjbGFzcyhDKSwKICAgIC8vICgzKSBjbGFzcyhBKSwgKDQpIGNsYXNzKEIpLCAoNSkgY2xhc3MoUG9seW1lcih7Li4ufSkpLgogICAgLy8gUmVzdWx0OgogICAgLy8gVGhpcyBtZWFucyBlbGVtZW50IHByb3BlcnRpZXMgd2luIG92ZXIgQiBwcm9wZXJ0aWVzIHdpbiBvdmVyIEEgd2luCiAgICAvLyBvdmVyIEMuIChzYW1lIGFzIDEueCkKICAgIC8vIElmIGxpZmVjeWNsZSBpcyBjYWxsZWQgKHN1cGVyIHRoZW4gbWUpLCBvcmRlciBpcwogICAgLy8gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwgKDMpIEIuY3JlYXRlZCwgKDQpIGVsZW1lbnQuY3JlYXRlZAogICAgLy8gKGFnYWluIHNhbWUgYXMgMS54KQogICAgZnVuY3Rpb24gYXBwbHlCZWhhdmlvcnMocHJvdG8sIGJlaGF2aW9ycywgbGlmZWN5Y2xlKSB7CiAgICAgIGZvciAobGV0IGk9MDsgaTxiZWhhdmlvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcHBseUluZm8ocHJvdG8sIGJlaGF2aW9yc1tpXSwgbGlmZWN5Y2xlLCBleGNsdWRlT25CZWhhdmlvcnMpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlJbmZvKHByb3RvLCBpbmZvLCBsaWZlY3ljbGUsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb3B5UHJvcGVydGllcyhpbmZvLCBwcm90bywgZXhjbHVkZVByb3BzKTsKICAgICAgZm9yIChsZXQgcCBpbiBsaWZlY3ljbGVQcm9wcykgewogICAgICAgIGlmIChpbmZvW3BdKSB7CiAgICAgICAgICBsaWZlY3ljbGVbcF0gPSBsaWZlY3ljbGVbcF0gfHwgW107CiAgICAgICAgICBsaWZlY3ljbGVbcF0ucHVzaChpbmZvW3BdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXl9IGJlaGF2aW9ycyBMaXN0IG9mIGJlaGF2aW9ycyB0byBmbGF0dGVuLgogICAgICogQHBhcmFtIHtBcnJheT19IGxpc3QgVGFyZ2V0IGxpc3QgdG8gZmxhdHRlbiBiZWhhdmlvcnMgaW50by4KICAgICAqIEBwYXJhbSB7QXJyYXk9fSBleGNsdWRlIExpc3Qgb2YgYmVoYXZpb3JzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgbGlzdC4KICAgICAqIEByZXR1cm4geyFBcnJheX0gUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgYmVoYXZpb3JzLgogICAgICovCiAgICBmdW5jdGlvbiBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbGlzdCwgZXhjbHVkZSkgewogICAgICBsaXN0ID0gbGlzdCB8fCBbXTsKICAgICAgZm9yIChsZXQgaT1iZWhhdmlvcnMubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgbGV0IGIgPSBiZWhhdmlvcnNbaV07CiAgICAgICAgaWYgKGIpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGIpKSB7CiAgICAgICAgICAgIGZsYXR0ZW5CZWhhdmlvcnMoYiwgbGlzdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBkZWR1cAogICAgICAgICAgICBpZiAobGlzdC5pbmRleE9mKGIpIDwgMCAmJiAoIWV4Y2x1ZGUgfHwgZXhjbHVkZS5pbmRleE9mKGIpIDwgMCkpIHsKICAgICAgICAgICAgICBsaXN0LnVuc2hpZnQoYik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS53YXJuKCdiZWhhdmlvciBpcyBudWxsLCBjaGVjayBmb3IgbWlzc2luZyBvciA0MDQgaW1wb3J0Jyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qIE5vdGUgYWJvdXQgY29uc3RydWN0aW9uIGFuZCBleHRlbnNpb24gb2YgbGVnYWN5IGNsYXNzZXMuCiAgICAgIFtDaGFuZ2VkIGluIFE0IDIwMTggdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuXQoKICAgICAgV2hlbiBjYWxsaW5nIGBQb2x5bWVyYCBvciBgbWl4aW5CZWhhdmlvcnNgLCB0aGUgZ2VuZXJhdGVkIGNsYXNzIGJlbG93IGlzCiAgICAgIG1hZGUuIFRoZSBsaXN0IG9mIGJlaGF2aW9ycyB3YXMgcHJldmlvdXNseSBtYWRlIGludG8gb25lIGdlbmVyYXRlZCBjbGFzcyBwZXIKICAgICAgYmVoYXZpb3IsIGJ1dCB0aGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZSBhcyBiZWhhdmlvcnMgYXJlIG5vdyBjYWxsZWQKICAgICAgbWFudWFsbHkuIE5vdGUsIHRoZXJlIG1heSAqc3RpbGwqIGJlIG11bHRpcGxlIGdlbmVyYXRlZCBjbGFzc2VzIGluIHRoZQogICAgICBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluIGlmIGV4dGVuc2lvbiBpcyB1c2VkIHdpdGggYG1peGluQmVoYXZpb3JzYC4KCiAgICAgIFRoZSBnZW5lcmF0ZWQgY2xhc3MgaXMgZGlyZWN0bHkgdGllZCB0byB0aGUgaW5mbyBvYmplY3QgYW5kIGJlaGF2aW9ycwogICAgICB1c2VkIHRvIGNyZWF0ZSBpdC4gVGhhdCBsaXN0IG9mIGJlaGF2aW9ycyBpcyBmaWx0ZXJlZCBzbyBpdCdzIG9ubHkgdGhlCiAgICAgIGJlaGF2aW9ycyBub3QgYWN0aXZlIG9uIHRoZSBzdXBlcmNsYXNzLiBJbiBvcmRlciB0byBjYWxsIHRocm91Z2ggdG8gdGhlCiAgICAgIGVudGlyZSBsaXN0IG9mIGxpZmVjeWNsZSBtZXRob2RzLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlcmAuCgogICAgICBUaGUgZWxlbWVudCdzIGBwcm9wZXJ0aWVzYCBhbmQgYG9ic2VydmVyc2AgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZSBmaW5hbGl6YXRpb24KICAgICAgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5IGBQcm9wZXJ0aWVzTWl4aW5gLiBgUHJvcGVydGllc2AgYW5kIGBvYnNlcnZlcnNgIGFyZQogICAgICBjb2xsZWN0ZWQgYnkgbWFudWFsbHkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluIGFuZCBtZXJnaW5nLgoKICAgICAgVG8gbGltaXQgY2hhbmdlcywgdGhlIGBfcmVnaXN0ZXJlZGAgbWV0aG9kIGlzIGNhbGxlZCB2aWEgYF9pbml0aWFsaXplUHJvcGVydGllc2AKICAgICAgYW5kIG5vdCBgX2ZpbmFsaXplQ2xhc3NgLgogICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUG9seW1lciBpbmZvIG9iamVjdAogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6SFRNTEVsZW1lbnQpfSBCYXNlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kIHdpdGggaW5mbyBvYmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBiZWhhdmlvcnMgYmVoYXZpb3JzIHRvIGNvcHkgaW50byB0aGUgZWxlbWVudAogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oaW5mbywgQmFzZSwgYmVoYXZpb3JzKSB7CgogICAgICAvLyBtYW5hZ2VzIGJlaGF2aW9yIGFuZCBsaWZlY3ljbGUgcHJvY2Vzc2luZyAoZmlsbGVkIGluIGFmdGVyIGNsYXNzIGRlZmluaXRpb24pCiAgICAgIGxldCBiZWhhdmlvckxpc3Q7CiAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IHt9OwoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGNsYXNzIFBvbHltZXJHZW5lcmF0ZWQgZXh0ZW5kcyBCYXNlIHsKCiAgICAgICAgLy8gZXhwbGljaXRseSBub3QgY2FsbGluZyBzdXBlci5fZmluYWxpemVDbGFzcwogICAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICAgIC8vIGlmIGNhbGxpbmcgdmlhIGEgc3ViY2xhc3MgdGhhdCBoYXNuJ3QgYmVlbiBnZW5lcmF0ZWQsIHBhc3MgdGhyb3VnaCB0byBzdXBlcgogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHdpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdnZW5lcmF0ZWRGcm9tJywgdGhpcykpKSB7CiAgICAgICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBpbnRlcmxlYXZlIHByb3BlcnRpZXMgYW5kIG9ic2VydmVycyBwZXIgYmVoYXZpb3IgYW5kIGBpbmZvYAogICAgICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBiID0gYmVoYXZpb3JMaXN0W2ldOwogICAgICAgICAgICAgICAgaWYgKGIucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMoYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChiLm9ic2VydmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9ic2VydmVycyhiLm9ic2VydmVycywgYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluZm8ucHJvcGVydGllcykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydGllcyhpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmZvLm9ic2VydmVycykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKGluZm8ub2JzZXJ2ZXJzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBwcmVwYXJlIHRoZSBlbGVtZW50IHRlbXBsYXRlCiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogICAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBiZWhhdmlvckxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIGJlaGF2aW9yTGlzdFtpXS5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgICAgIGxldCBvYnNlcnZlcnMgPSBbXTsKICAgICAgICAgIGlmIChiZWhhdmlvckxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgYiA9IGJlaGF2aW9yTGlzdFtpXTsKICAgICAgICAgICAgICBpZiAoYi5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoYi5vYnNlcnZlcnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGluZm8ub2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoaW5mby5vYnNlcnZlcnMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9ic2VydmVyczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlZCgpIHsKICAgICAgICAgIHN1cGVyLmNyZWF0ZWQoKTsKICAgICAgICAgIGNvbnN0IGxpc3QgPSBsaWZlY3ljbGUuY3JlYXRlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX3JlZ2lzdGVyZWQoKSB7CiAgICAgICAgICAvKiBOT1RFOiBgYmVmb3JlUmVnaXN0ZXJgIGlzIGNhbGxlZCBoZXJlIGZvciBiYywgYnV0IHRoZSBiZWhhdmlvcgogICAgICAgICAgICBpcyBkaWZmZXJlbnQgdGhhbiBpbiAxLnguIEluIDEuMCwgdGhlIG1ldGhvZCB3YXMgY2FsbGVkICphZnRlcioKICAgICAgICAgICAgbWl4aW5nIHByb3RvdHlwZXMgdG9nZXRoZXIgYnV0ICpiZWZvcmUqIHByb2Nlc3Npbmcgb2YgbWV0YS1vYmplY3RzLgogICAgICAgICAgICBIb3dldmVyLCBkeW5hbWljIGVmZmVjdHMgY2FuIHN0aWxsIGJlIHNldCBoZXJlIGFuZCBjYW4gYmUgZG9uZSBlaXRoZXIKICAgICAgICAgICAgaW4gYGJlZm9yZVJlZ2lzdGVyYCBvciBgcmVnaXN0ZXJlZGAuIEl0IGlzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBzZXQKICAgICAgICAgICAgYGlzYCBpbiBgYmVmb3JlUmVnaXN0ZXJgIGFzIHlvdSBjb3VsZCBpbiAxLnguCiAgICAgICAgICAqLwogICAgICAgICAgLy8gb25seSBwcm9jZWVkIGlmIHRoZSBnZW5lcmF0ZWQgY2xhc3MnIHByb3RvdHlwZSBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZC4KICAgICAgICAgIGNvbnN0IGdlbmVyYXRlZFByb3RvID0gUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGU7CiAgICAgICAgICBpZiAoIWdlbmVyYXRlZFByb3RvLmhhc093blByb3BlcnR5KCdfX2hhc1JlZ2lzdGVyRmluaXNoZWQnKSkgewogICAgICAgICAgICBnZW5lcmF0ZWRQcm90by5fX2hhc1JlZ2lzdGVyRmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAvLyBlbnN1cmUgc3VwZXJjbGFzcyBpcyByZWdpc3RlcmVkIGZpcnN0LgogICAgICAgICAgICBzdXBlci5fcmVnaXN0ZXJlZCgpOwogICAgICAgICAgICAvLyBjb3B5IHByb3BlcnRpZXMgb250byB0aGUgZ2VuZXJhdGVkIGNsYXNzIGxhemlseSBpZiB3ZSdyZSBvcHRpbWl6aW5nLAogICAgICAgICAgICBpZiAoUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICAgY29weVByb3BlcnRpZXNUb1Byb3RvKGdlbmVyYXRlZFByb3RvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBtYWtlIHN1cmUgbGVnYWN5IGxpZmVjeWNsZSBpcyBjYWxsZWQgb24gdGhlICplbGVtZW50KidzIHByb3RvdHlwZQogICAgICAgICAgICAvLyBhbmQgbm90IHRoZSBnZW5lcmF0ZWQgY2xhc3MgcHJvdG90eXBlOyBpZiB0aGUgZWxlbWVudCBoYXMgYmVlbgogICAgICAgICAgICAvLyBleHRlbmRlZCwgdGhlc2UgYXJlICpub3QqIHRoZSBzYW1lLgogICAgICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTsKICAgICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYmVmb3JlUmVnaXN0ZXI7CiAgICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHByb3RvKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdCA9IGxpZmVjeWNsZS5yZWdpc3RlcmVkOwogICAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGxpc3RbaV0uY2FsbChwcm90byk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9hcHBseUxpc3RlbmVycygpIHsKICAgICAgICAgIHN1cGVyLl9hcHBseUxpc3RlbmVycygpOwogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5saXN0ZW5lcnM7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdFtpXTsKICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBsIGluIGxpc3RlbmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLl9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsIGwsIGxpc3RlbmVyc1tsXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3RlOiBleGNlcHRpb24gdG8gInN1cGVyIHRoZW4gbWUiIHJ1bGU7CiAgICAgICAgLy8gZG8gd29yayBiZWZvcmUgY2FsbGluZyBzdXBlciBzbyB0aGF0IHN1cGVyIGF0dHJpYnV0ZXMKICAgICAgICAvLyBvbmx5IGFwcGx5IGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9lbnN1cmVBdHRyaWJ1dGVzKCkgewogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5ob3N0QXR0cmlidXRlczsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9bGlzdC5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBjb25zdCBob3N0QXR0cmlidXRlcyA9IGxpc3RbaV07CiAgICAgICAgICAgICAgZm9yIChsZXQgYSBpbiBob3N0QXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgICB0aGlzLl9lbnN1cmVBdHRyaWJ1dGUoYSwgaG9zdEF0dHJpYnV0ZXNbYV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzdXBlci5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5yZWFkeTsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICBzdXBlci5hdHRhY2hlZCgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYXR0YWNoZWQ7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRldGFjaGVkKCkgewogICAgICAgICAgc3VwZXIuZGV0YWNoZWQoKTsKICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmRldGFjaGVkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGQsIHZhbHVlKSB7CiAgICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkKCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5hdHRyaWJ1dGVDaGFuZ2VkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzLCBuYW1lLCBvbGQsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gYXBwbHkgYmVoYXZpb3JzLCBub3RlIGFjdHVhbCBjb3B5aW5nIGlzIGRvbmUgbGF6aWx5IGF0IGZpcnN0IGluc3RhbmNlIGNyZWF0aW9uCiAgICAgIGlmIChiZWhhdmlvcnMpIHsKICAgICAgICAvLyBOT1RFOiBlbnN1cmUgdGhlIGJlaGF2aW9yIGlzIGV4dGVuZGluZyBhIGNsYXNzIHdpdGgKICAgICAgICAvLyBsZWdhY3kgZWxlbWVudCBhcGkuIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIGJlaGF2aW9ycyBleHBlY3QgdG8gYmUgYWJsZQogICAgICAgIC8vIHRvIGFjY2VzcyAxLnggbGVnYWN5IGFwaS4KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYmVoYXZpb3JzKSkgewogICAgICAgICAgYmVoYXZpb3JzID0gW2JlaGF2aW9yc107CiAgICAgICAgfQogICAgICAgIGxldCBzdXBlckJlaGF2aW9ycyA9IEJhc2UucHJvdG90eXBlLmJlaGF2aW9yczsKICAgICAgICAvLyBnZXQgZmxhdHRlbmVkLCBkZWR1cGVkIGxpc3Qgb2YgYmVoYXZpb3JzICpub3QqIGFscmVhZHkgb24gc3VwZXIgY2xhc3MKICAgICAgICBiZWhhdmlvckxpc3QgPSBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbnVsbCwgc3VwZXJCZWhhdmlvcnMpOwogICAgICAgIFBvbHltZXJHZW5lcmF0ZWQucHJvdG90eXBlLmJlaGF2aW9ycyA9IHN1cGVyQmVoYXZpb3JzID8KICAgICAgICAgIHN1cGVyQmVoYXZpb3JzLmNvbmNhdChiZWhhdmlvcnMpIDogYmVoYXZpb3JMaXN0OwogICAgICB9CgogICAgICBjb25zdCBjb3B5UHJvcGVydGllc1RvUHJvdG8gPSAocHJvdG8pID0+IHsKICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICBhcHBseUJlaGF2aW9ycyhwcm90bywgYmVoYXZpb3JMaXN0LCBsaWZlY3ljbGUpOwogICAgICAgIH0KICAgICAgICBhcHBseUluZm8ocHJvdG8sIGluZm8sIGxpZmVjeWNsZSwgZXhjbHVkZU9uSW5mbyk7CiAgICAgIH07CgogICAgICAvLyBjb3B5IHByb3BlcnRpZXMgaWYgd2UncmUgbm90IG9wdGltaXppbmcKICAgICAgaWYgKCFQb2x5bWVyLmxlZ2FjeU9wdGltaXphdGlvbnMpIHsKICAgICAgICBjb3B5UHJvcGVydGllc1RvUHJvdG8oUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGUpOwogICAgICB9CgogICAgICBQb2x5bWVyR2VuZXJhdGVkLmdlbmVyYXRlZEZyb20gPSBpbmZvOwoKICAgICAgcmV0dXJuIFBvbHltZXJHZW5lcmF0ZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGV4dGVuZHMgYFBvbHltZXIuTGVnYWN5RWxlbWVudGAgYmFzZWQgb24gdGhlCiAgICAgKiBwcm92aWRlZCBpbmZvIG9iamVjdC4gIE1ldGFkYXRhIG9iamVjdHMgb24gdGhlIGBpbmZvYCBvYmplY3QKICAgICAqIChgcHJvcGVydGllc2AsIGBvYnNlcnZlcnNgLCBgbGlzdGVuZXJzYCwgYGJlaGF2aW9yc2AsIGBpc2ApIGFyZSB1c2VkCiAgICAgKiBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcgc3lzdGVtcywgYW5kIGFueSBmdW5jdGlvbnMgYXJlIGNvcGllZAogICAgICogdG8gdGhlIGdlbmVyYXRlZCBjbGFzcy4KICAgICAqCiAgICAgKiBWYWxpZCAibWV0YWRhdGEiIHZhbHVlcyBhcmUgYXMgZm9sbG93czoKICAgICAqCiAgICAgKiBgaXNgOiBTdHJpbmcgcHJvdmlkaW5nIHRoZSB0YWcgbmFtZSB0byByZWdpc3RlciB0aGUgZWxlbWVudCB1bmRlci4gSW4KICAgICAqIGFkZGl0aW9uLCBpZiBhIGBkb20tbW9kdWxlYCB3aXRoIHRoZSBzYW1lIGlkIGV4aXN0cywgdGhlIGZpcnN0IHRlbXBsYXRlCiAgICAgKiBpbiB0aGF0IGBkb20tbW9kdWxlYCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGUgc2hhZG93IHJvb3Qgb2YgdGhpcyBlbGVtZW50LAogICAgICogd2l0aCBzdXBwb3J0IGZvciBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgKGBvbi0uLi5gKSwgUG9seW1lciBkYXRhCiAgICAgKiBiaW5kaW5ncyAoYFtbLi4uXV1gIGFuZCBge3suLi59fWApLCBhbmQgaWQtYmFzZWQgbm9kZSBmaW5kaW5nIGludG8KICAgICAqIGB0aGlzLiRgLgogICAgICoKICAgICAqIGBwcm9wZXJ0aWVzYDogT2JqZWN0IGRlc2NyaWJpbmcgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIKICAgICAqIGZlYXR1cmVzIChrZXk6IHByb3BlcnR5IG5hbWVzLCB2YWx1ZTogb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydHkgbWV0YWRhdGEpLgogICAgICogVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkgbWV0YWRhdGEgaW5jbHVkZToKICAgICAqIC0gYHR5cGVgIChTdHJpbmd8TnVtYmVyfE9iamVjdHxBcnJheXwuLi4pOiBVc2VkIGJ5CiAgICAgKiAgIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvIGRldGVybWluZSBob3cgc3RyaW5nLWJhc2VkIGF0dHJpYnV0ZXMKICAgICAqICAgYXJlIGRlc2VyaWFsaXplZCB0byBKYXZhU2NyaXB0IHByb3BlcnR5IHZhbHVlcy4KICAgICAqIC0gYG5vdGlmeWAgKGJvb2xlYW4pOiBDYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHByb3BlcnR5IHRvIGZpcmUgYQogICAgICogICBub24tYnViYmxpbmcgZXZlbnQgY2FsbGVkIGA8cHJvcGVydHk+LWNoYW5nZWRgLiBFbGVtZW50cyB0aGF0IGhhdmUKICAgICAqICAgZW5hYmxlZCB0d28td2F5IGJpbmRpbmcgdG8gdGhlIHByb3BlcnR5IHVzZSB0aGlzIGV2ZW50IHRvIG9ic2VydmUgY2hhbmdlcy4KICAgICAqIC0gYHJlYWRPbmx5YCAoYm9vbGVhbik6IENyZWF0ZXMgYSBnZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgYnV0IG5vIHNldHRlci4KICAgICAqICAgVG8gc2V0IGEgcmVhZC1vbmx5IHByb3BlcnR5LCB1c2UgdGhlIHByaXZhdGUgc2V0dGVyIG1ldGhvZAogICAgICogICBgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSlgLgogICAgICogLSBgb2JzZXJ2ZXJgIChzdHJpbmcpOiBPYnNlcnZlciBtZXRob2QgbmFtZSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KICAgICAqICAgdGhlIHByb3BlcnR5IGNoYW5nZXMuIFRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZCBhcmUKICAgICAqICAgYCh2YWx1ZSwgcHJldmlvdXNWYWx1ZSlgLgogICAgICogLSBgY29tcHV0ZWRgIChzdHJpbmcpOiBTdHJpbmcgZGVzY3JpYmluZyBtZXRob2QgYW5kIGRlcGVuZGVudCBwcm9wZXJ0aWVzCiAgICAgKiAgIGZvciBjb21wdXRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgKGUuZy4gYCdjb21wdXRlRm9vKGJhciwgem90KSdgKS4KICAgICAqICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGJ5IGRlZmF1bHQgYW5kIGNhbiBvbmx5IGJlIGNoYW5nZWQKICAgICAqICAgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNvbXB1dGluZyBtZXRob2QuCiAgICAgKgogICAgICogYG9ic2VydmVyc2A6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eSBvYnNlcnZlciBtZXRob2RzCiAgICAgKiAgYW5kIHRoZWlyIGRlcGVuZGVudCBwcm9wZXJ0aWVzIChlLmcuIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgICAqCiAgICAgKiBgbGlzdGVuZXJzYDogT2JqZWN0IGRlc2NyaWJpbmcgZXZlbnQgbGlzdGVuZXJzIHRvIGJlIGFkZGVkIHRvIGVhY2gKICAgICAqICBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQgKGtleTogZXZlbnQgbmFtZSwgdmFsdWU6IG1ldGhvZCBuYW1lKS4KICAgICAqCiAgICAgKiBgYmVoYXZpb3JzYDogQXJyYXkgb2YgYWRkaXRpb25hbCBgaW5mb2Agb2JqZWN0cyBjb250YWluaW5nIG1ldGFkYXRhCiAgICAgKiBhbmQgY2FsbGJhY2tzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgYGluZm9gIG9iamVjdCBoZXJlIHdoaWNoIGFyZQogICAgICogbWVyZ2VkIGludG8gdGhpcyBlbGVtZW50LgogICAgICoKICAgICAqIGBob3N0QXR0cmlidXRlc2A6IE9iamVjdCBsaXN0aW5nIGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZCB0byB0aGUgaG9zdAogICAgICogIG9uY2UgY3JlYXRlZCAoa2V5OiBhdHRyaWJ1dGUgbmFtZSwgdmFsdWU6IGF0dHJpYnV0ZSB2YWx1ZSkuICBWYWx1ZXMKICAgICAqICBhcmUgc2VyaWFsaXplZCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuICBIb3N0IGF0dHJpYnV0ZXMgc2hvdWxkCiAgICAgKiAgZ2VuZXJhbGx5IGJlIGxpbWl0ZWQgdG8gYXR0cmlidXRlcyBzdWNoIGFzIGB0YWJJbmRleGAgYW5kIGBhcmlhLS4uLmAuCiAgICAgKiAgQXR0cmlidXRlcyBpbiBgaG9zdEF0dHJpYnV0ZXNgIGFyZSBvbmx5IGFwcGxpZWQgaWYgYSB1c2VyLXN1cHBsaWVkCiAgICAgKiAgYXR0cmlidXRlIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgKGF0dHJpYnV0ZXMgaW4gbWFya3VwIG92ZXJyaWRlCiAgICAgKiAgYGhvc3RBdHRyaWJ1dGVzYCkuCiAgICAgKgogICAgICogSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgUG9seW1lci1zcGVjaWZpYyBjYWxsYmFja3MgbWF5IGJlIHByb3ZpZGVkOgogICAgICogLSBgcmVnaXN0ZXJlZGA6IGNhbGxlZCBhZnRlciBmaXJzdCBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQsCiAgICAgKiAtIGBjcmVhdGVkYDogY2FsbGVkIGR1cmluZyBgY29uc3RydWN0b3JgCiAgICAgKiAtIGBhdHRhY2hlZGA6IGNhbGxlZCBkdXJpbmcgYGNvbm5lY3RlZENhbGxiYWNrYAogICAgICogLSBgZGV0YWNoZWRgOiBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAqIC0gYHJlYWR5YDogY2FsbGVkIGJlZm9yZSBmaXJzdCBgYXR0YWNoZWRgLCBhZnRlciBhbGwgcHJvcGVydGllcyBvZgogICAgICogICB0aGlzIGVsZW1lbnQgaGF2ZSBiZWVuIHByb3BhZ2F0ZWQgdG8gaXRzIHRlbXBsYXRlIGFuZCBhbGwgb2JzZXJ2ZXJzCiAgICAgKiAgIGhhdmUgcnVuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gT2JqZWN0IGNvbnRhaW5pbmcgUG9seW1lciBtZXRhZGF0YSBhbmQgZnVuY3Rpb25zCiAgICAgKiAgIHRvIGJlY29tZSBjbGFzcyBtZXRob2RzLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oVCk6VH0gbWl4aW4gT3B0aW9uYWwgbWl4aW4gdG8gYXBwbHkgdG8gbGVnYWN5IGJhc2UgY2xhc3MKICAgICAqICAgYmVmb3JlIGV4dGVuZGluZyB3aXRoIFBvbHltZXIgbWV0YXByb2dyYW1taW5nLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICovCiAgICBQb2x5bWVyLkNsYXNzID0gZnVuY3Rpb24oaW5mbywgbWl4aW4pIHsKICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdQb2x5bWVyLkNsYXNzIHJlcXVpcmVzIGBpbmZvYCBhcmd1bWVudCcpOwogICAgICB9CiAgICAgIGxldCBrbGFzcyA9IG1peGluID8gbWl4aW4oUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW4oSFRNTEVsZW1lbnQpKSA6CiAgICAgICAgICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CiAgICAgIGtsYXNzID0gR2VuZXJhdGVDbGFzc0Zyb21JbmZvKGluZm8sIGtsYXNzLCBpbmZvLmJlaGF2aW9ycyk7CiAgICAgIGlmIChpbmZvLl9lbmFibGVEaXNhYmxlVXBncmFkZSkgewogICAgICAgIGtsYXNzID0gUG9seW1lci5EaXNhYmxlVXBncmFkZU1peGluKGtsYXNzKTsKICAgICAgfQogICAgICAvLyBkZWNvcmF0ZSBrbGFzcyB3aXRoIHJlZ2lzdHJhdGlvbiBpbmZvCiAgICAgIGtsYXNzLmlzID0ga2xhc3MucHJvdG90eXBlLmlzID0gaW5mby5pczsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICBQb2x5bWVyLm1peGluQmVoYXZpb3JzID0gbWl4aW5CZWhhdmlvcnM7CgogIH0pKCk7CgoKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvKioKICAgICAqIExlZ2FjeSBjbGFzcyBmYWN0b3J5IGFuZCByZWdpc3RyYXRpb24gaGVscGVyIGZvciBkZWZpbmluZyBQb2x5bWVyCiAgICAgKiBlbGVtZW50cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAgICAgKiBgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGluZm8uaXMsIFBvbHltZXIuQ2xhc3MoaW5mbykpO2AKICAgICAqCiAgICAgKiBTZWUgYFBvbHltZXIuQ2xhc3NgIGZvciBkZXRhaWxzIG9uIHZhbGlkIGxlZ2FjeSBtZXRhZGF0YSBmb3JtYXQgZm9yIGBpbmZvYC4KICAgICAqCiAgICAgKiBAZ2xvYmFsCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBmdW5jdGlvbiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBPYmplY3QgY29udGFpbmluZyBQb2x5bWVyIG1ldGFkYXRhIGFuZCBmdW5jdGlvbnMKICAgICAqICAgdG8gYmVjb21lIGNsYXNzIG1ldGhvZHMuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6IEhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2R1cGxpY2F0ZSwgaW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICB3aW5kb3cuUG9seW1lci5fcG9seW1lckZuID0gZnVuY3Rpb24oaW5mbykgewogICAgICAvLyBpZiBpbnB1dCBpcyBhIGBjbGFzc2AgKGFrYSBhIGZ1bmN0aW9uIHdpdGggYSBwcm90b3R5cGUpLCB1c2UgdGhlIHByb3RvdHlwZQogICAgICAvLyByZW1lbWJlciB0aGF0IHRoZSBgY29uc3RydWN0b3JgIHdpbGwgbmV2ZXIgYmUgY2FsbGVkCiAgICAgIGxldCBrbGFzczsKICAgICAgaWYgKHR5cGVvZiBpbmZvID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAga2xhc3MgPSBpbmZvOwogICAgICB9IGVsc2UgewogICAgICAgIGtsYXNzID0gUG9seW1lci5DbGFzcyhpbmZvKTsKICAgICAgfQogICAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoa2xhc3MuaXMsIC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyhrbGFzcykpOwogICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICB9KSgpOwoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBDb21tb24gaW1wbGVtZW50YXRpb24gZm9yIG1peGluICYgYmVoYXZpb3IKICBmdW5jdGlvbiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UoaW5zdCwgcHJvcGVydHksIHZhbHVlLCBvbGQsIG11dGFibGVEYXRhKSB7CiAgICBsZXQgaXNPYmplY3Q7CiAgICBpZiAobXV0YWJsZURhdGEpIHsKICAgICAgaXNPYmplY3QgPSAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCk7CiAgICAgIC8vIFB1bGwgYG9sZGAgZm9yIE9iamVjdHMgZnJvbSB0ZW1wIGNhY2hlLCBidXQgdHJlYXQgYG51bGxgIGFzIGEgcHJpbWl0aXZlCiAgICAgIGlmIChpc09iamVjdCkgewogICAgICAgIG9sZCA9IGluc3QuX19kYXRhVGVtcFtwcm9wZXJ0eV07CiAgICAgIH0KICAgIH0KICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjaywgYnV0IHJldHVybiBmYWxzZSBmb3IgTmFOPT09TmFOCiAgICBsZXQgc2hvdWxkQ2hhbmdlID0gKG9sZCAhPT0gdmFsdWUgJiYgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpOwogICAgLy8gT2JqZWN0cyBhcmUgc3RvcmVkIGluIHRlbXBvcmFyeSBjYWNoZSAoY2xlYXJlZCBhdCBlbmQgb2YKICAgIC8vIHR1cm4pLCB3aGljaCBpcyB1c2VkIGZvciBkaXJ0eS1jaGVja2luZwogICAgaWYgKGlzT2JqZWN0ICYmIHNob3VsZENoYW5nZSkgewogICAgICBpbnN0Ll9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gc2hvdWxkQ2hhbmdlOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLCBmb3IgdXNlIG9uIGVsZW1lbnRzIHV0aWxpemluZwogICAqIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AKICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgY2F1c2UgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGFwcGx5IHRoaXMgbWl4aW4gb3IgZW5hYmxlIHRoZQogICAqIGBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFgIG1peGluLgogICAqCiAgICogSW4gb3JkZXIgdG8gbWFrZSB0aGUgZGlydHkgY2hlY2sgc3RyYXRlZ3kgY29uZmlndXJhYmxlLCBzZWUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cwogICAqICAgYW5kIGFycmF5cwogICAqLwogIFBvbHltZXIuTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICovCiAgICBjbGFzcyBNdXRhYmxlRGF0YSBleHRlbmRzIHN1cGVyQ2xhc3MgewogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBwdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAKICAgICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAgICogY2FjaGUgaXMgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIGEgdHVybiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MKICAgICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAgICogY3ljbGVzIGR1ZSB0byAyLXdheSBub3RpZmljYXRpb24pLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0cnVlKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gTXV0YWJsZURhdGE7CgogIH0pOwoKCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBhZGQgdGhlIG9wdGlvbmFsIGFiaWxpdHkgdG8gc2tpcCBzdHJpY3QKICAgKiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZQogICAqICJkaXJ0eSIpIGJ5IHNldHRpbmcgYSBgbXV0YWJsZS1kYXRhYCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCBpbnN0YW5jZS4KICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgYWxsb3cgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGVuYWJsZSB0aGlzIG1peGluIG9yIGFwcGx5IHRoZQogICAqIGBQb2x5bWVyLk11dGFibGVEYXRhYCBtaXhpbi4KICAgKgogICAqIFdoaWxlIHRoaXMgbWl4aW4gYWRkcyB0aGUgYWJpbGl0eSB0byBmb3JnbyBPYmplY3QvQXJyYXkgZGlydHkgY2hlY2tpbmcsCiAgICogdGhlIGBtdXRhYmxlRGF0YWAgZmxhZyBkZWZhdWx0cyB0byBmYWxzZSBhbmQgbXVzdCBiZSBzZXQgb24gdGhlIGluc3RhbmNlLgogICAqCiAgICogTm90ZSwgdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBwcm9wYWdhdGluZyBsYXJnZSBvYmplY3QgZ3JhcGhzCiAgICogd2lsbCBiZSB3b3JzZSBieSByZWx5aW5nIG9uIGBtdXRhYmxlRGF0YTogdHJ1ZWAgYXMgb3Bwb3NlZCB0byB1c2luZwogICAqIHN0cmljdCBkaXJ0eSBjaGVja2luZyB3aXRoIGltbXV0YWJsZSBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24KICAgKiBBUEkuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcKICAgKiAgIGZvciBvYmplY3RzIGFuZCBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQHBvbHltZXIKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKi8KICAgIGNsYXNzIE9wdGlvbmFsTXV0YWJsZURhdGEgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICAgICAqIGZvciB0aGlzIGVsZW1lbnQuICBXaGVuIHRydWUsIE9iamVjdHMgYW5kIEFycmF5cyB3aWxsIHNraXAgZGlydHkKICAgICAgICAgICAqIGNoZWNraW5nLCBvdGhlcndpc2Ugc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nIHdpbGwgYmUgdXNlZC4KICAgICAgICAgICAqLwogICAgICAgICAgbXV0YWJsZURhdGE6IEJvb2xlYW4KICAgICAgICB9OwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBXaGVuIGB0aGlzLm11dGFibGVEYXRhYCBpcyB0cnVlIG9uIHRoaXMgaW5zdGFuY2UsIHRoaXMgbWV0aG9kCiAgICAgICAqIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICAgKiAocmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBgX19kYXRhYCBjYWNoZSkgZm9yIE9iamVjdHMuICBTaW5jZSB0aGUgdGVtcAogICAgICAgKiBjYWNoZSBpcyBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgYSB0dXJuLCB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cwogICAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAgICogc2FtZSBvYmplY3QgKHVzaW5nIHRoZSB0ZW1wIGNhY2hlIGFzIGFuIGluLXR1cm4gYmFja3N0b3AgdG8gcHJldmVudAogICAgICAgKiBjeWNsZXMgZHVlIHRvIDItd2F5IG5vdGlmaWNhdGlvbikuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgY2hhbmdlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICAgIHJldHVybiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UodGhpcywgcHJvcGVydHksIHZhbHVlLCBvbGQsIHRoaXMubXV0YWJsZURhdGEpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIE9wdGlvbmFsTXV0YWJsZURhdGE7CgogIH0pOwoKICAvLyBFeHBvcnQgZm9yIHVzZSBieSBsZWdhY3kgYmVoYXZpb3IKICBQb2x5bWVyLk11dGFibGVEYXRhLl9tdXRhYmxlUHJvcGVydHlDaGFuZ2UgPSBtdXRhYmxlUHJvcGVydHlDaGFuZ2U7Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEJhc2UgY2xhc3MgZm9yIEhUTUxUZW1wbGF0ZUVsZW1lbnQgZXh0ZW5zaW9uIHRoYXQgaGFzIHByb3BlcnR5IGVmZmVjdHMKICAgIC8vIG1hY2hpbmVyeSBmb3IgcHJvcGFnYXRpbmcgaG9zdCBwcm9wZXJ0aWVzIHRvIGNoaWxkcmVuLiBUaGlzIGlzIGFuIEVTNQogICAgLy8gY2xhc3Mgb25seSBiZWNhdXNlIEJhYmVsIChpbmNvcnJlY3RseSkgcmVxdWlyZXMgc3VwZXIoKSBpbiB0aGUgY2xhc3MKICAgIC8vIGNvbnN0cnVjdG9yIGV2ZW4gdGhvdWdoIG5vIGB0aGlzYCBpcyB1c2VkIGFuZCBpdCByZXR1cm5zIGFuIGluc3RhbmNlLgogICAgbGV0IG5ld0luc3RhbmNlID0gbnVsbDsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge0hUTUxUZW1wbGF0ZUVsZW1lbnR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uKCkgeyByZXR1cm4gbmV3SW5zdGFuY2U7IH0KICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShIVE1MVGVtcGxhdGVFbGVtZW50LnByb3RvdHlwZSwgewogICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgIHZhbHVlOiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uLAogICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7SFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IERhdGFUZW1wbGF0ZSA9IFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9NdXRhYmxlRGF0YX0KICAgICAqIEBleHRlbmRzIHtEYXRhVGVtcGxhdGV9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBNdXRhYmxlRGF0YVRlbXBsYXRlID0gUG9seW1lci5NdXRhYmxlRGF0YShEYXRhVGVtcGxhdGUpOwoKICAgIC8vIEFwcGxpZXMgYSBEYXRhVGVtcGxhdGUgc3ViY2xhc3MgdG8gYSA8dGVtcGxhdGU+IGluc3RhbmNlCiAgICBmdW5jdGlvbiB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGNvbnN0cnVjdG9yKSB7CiAgICAgIG5ld0luc3RhbmNlID0gdGVtcGxhdGU7CiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0ZW1wbGF0ZSwgY29uc3RydWN0b3IucHJvdG90eXBlKTsKICAgICAgbmV3IGNvbnN0cnVjdG9yKCk7CiAgICAgIG5ld0luc3RhbmNlID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEJhc2UgY2xhc3MgZm9yIFRlbXBsYXRlSW5zdGFuY2UuCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhjbGFzcyB7fSk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQGN1c3RvbUVsZW1lbnQKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVJbnN0YW5jZUJhc2UgZXh0ZW5kcyBiYXNlIHsKICAgICAgY29uc3RydWN0b3IocHJvcHMpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX2NvbmZpZ3VyZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUodGhpcy5fX2RhdGFIb3N0KTsKICAgICAgICAvLyBTYXZlIGxpc3Qgb2Ygc3RhbXBlZCBjaGlsZHJlbgogICAgICAgIGxldCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgICAgICBmb3IgKGxldCBuID0gdGhpcy5yb290LmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgY2hpbGRyZW4ucHVzaChuKTsKICAgICAgICAgIG4uX190ZW1wbGF0aXplSW5zdGFuY2UgPSB0aGlzOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRpemVPd25lciAmJgogICAgICAgICAgdGhpcy5fX3RlbXBsYXRpemVPd25lci5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pIHsKICAgICAgICAgIHRoaXMuX3Nob3dIaWRlQ2hpbGRyZW4odHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8vIEZsdXNoIHByb3BzIG9ubHkgd2hlbiBwcm9wcyBhcmUgcGFzc2VkIGlmIGluc3RhbmNlIHByb3BzIGV4aXN0CiAgICAgICAgLy8gb3Igd2hlbiB0aGVyZSBpc24ndCBpbnN0YW5jZSBwcm9wcy4KICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMuX190ZW1wbGF0aXplT3B0aW9uczsKICAgICAgICBpZiAoKHByb3BzICYmIG9wdGlvbnMuaW5zdGFuY2VQcm9wcykgfHwgIW9wdGlvbnMuaW5zdGFuY2VQcm9wcykgewogICAgICAgICAgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ29uZmlndXJlIHRoZSBnaXZlbiBgcHJvcHNgIGJ5IGNhbGxpbmcgYF9zZXRQZW5kaW5nUHJvcGVydHlgLiBBbHNvCiAgICAgICAqIHNldHMgYW55IHByb3BlcnRpZXMgc3RvcmVkIGluIGBfX2hvc3RQcm9wc2AuCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBPYmplY3Qgb2YgcHJvcGVydHkgbmFtZS12YWx1ZSBwYWlycyB0byBzZXQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfY29uZmlndXJlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCkgewogICAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gdGhpcy5fX2hvc3RQcm9wcykgewogICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaHByb3AsIHRoaXMuX19kYXRhSG9zdFsnX2hvc3RfJyArIGhwcm9wXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEFueSBpbnN0YW5jZSBwcm9wcyBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHdpbGwgb3ZlcndyaXRlIGhvc3QgcHJvcHM7CiAgICAgICAgLy8gbm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBhIHVzZXIgZXJyb3IgYnV0IHdlIGRvbid0IHNwZWNpZmljYWxseSBmaWx0ZXIgdGhlbQogICAgICAgIGZvciAobGV0IGlwcm9wIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaXByb3AsIHByb3BzW2lwcm9wXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBhIGhvc3QgcHJvcGVydHkgdG8gdGhpcyBpbnN0YW5jZS4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZQogICAgICAgKiBjYWxsZWQgb24gaW5zdGFuY2VzIGZyb20gdGhlIGBvcHRpb25zLmZvcndhcmRIb3N0UHJvcGAgY2FsbGJhY2sKICAgICAgICogdG8gcHJvcGFnYXRlIGNoYW5nZXMgb2YgaG9zdCBwcm9wZXJ0aWVzIHRvIGVhY2ggaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgZW5xdWV1ZXMgdGhlIGNoYW5nZSwgd2hpY2ggYXJlIGZsdXNoZWQgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgb3IgcGF0aCBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGZvcndhcmQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGZvcndhcmRIb3N0UHJvcChwcm9wLCB2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcCwgdmFsdWUsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5fX2RhdGFIb3N0Ll9lbnF1ZXVlQ2xpZW50KHRoaXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHBvaW50IGZvciBhZGRpbmcgY3VzdG9tIG9yIHNpbXVsYXRlZCBldmVudCBoYW5kbGluZy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBldmVudCBsaXN0ZW5lciB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYWRkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBpZiAodGhpcy5fbWV0aG9kSG9zdCAmJiB0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnMucGFyZW50TW9kZWwpIHsKICAgICAgICAgIC8vIElmIHRoaXMgaW5zdGFuY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwYXJlbnQgbW9kZWwsIGRlY29yYXRlCiAgICAgICAgICAvLyBldmVudHMgdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZSBhcyBgbW9kZWxgCiAgICAgICAgICB0aGlzLl9tZXRob2RIb3N0Ll9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgKGUpID0+IHsKICAgICAgICAgICAgZS5tb2RlbCA9IHRoaXM7CiAgICAgICAgICAgIGhhbmRsZXIoZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gT3RoZXJ3aXNlIGRlbGVnYXRlIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QgKHdoaWNoIGNvdWxkIGJlKQogICAgICAgICAgLy8gYW5vdGhlciB0ZW1wbGF0ZSBpbnN0YW5jZQogICAgICAgICAgbGV0IHRlbXBsYXRlSG9zdCA9IHRoaXMuX19kYXRhSG9zdC5fX2RhdGFIb3N0OwogICAgICAgICAgaWYgKHRlbXBsYXRlSG9zdCkgewogICAgICAgICAgICB0ZW1wbGF0ZUhvc3QuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICAgKiB0ZXh0IG5vZGVzLCBgdGV4dENvbnRlbnRgIGlzIHJlbW92ZWQgd2hpbGUgImhpZGRlbiIgYW5kIHJlcGxhY2VkIHdoZW4KICAgICAgICogInNob3duLiIKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoaWRlIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICAgKiBzZXQgdG8gZmFsc2UgdG8gc2hvdyB0aGVtLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvd0hpZGVDaGlsZHJlbihoaWRlKSB7CiAgICAgICAgbGV0IGMgPSB0aGlzLmNoaWxkcmVuOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxjLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbiA9IGNbaV07CiAgICAgICAgICAvLyBJZ25vcmUgbm9uLWNoYW5nZXMKICAgICAgICAgIGlmIChCb29sZWFuKGhpZGUpICE9IEJvb2xlYW4obi5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pKSB7CiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lclRleHRDb250ZW50X18gPSBuLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgbi50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gbi5fX3BvbHltZXJUZXh0Q29udGVudF9fOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVtb3ZlIGFuZCByZXBsYWNlIHNsb3QKICAgICAgICAgICAgfSBlbHNlIGlmIChuLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKSB7CiAgICAgICAgICAgICAgaWYgKGhpZGUpIHsKICAgICAgICAgICAgICAgIG4uX19wb2x5bWVyUmVwbGFjZWRfXyA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ2hpZGRlbi1zbG90Jyk7CiAgICAgICAgICAgICAgICBuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4uX19wb2x5bWVyUmVwbGFjZWRfXywgbik7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2UgPSBuLl9fcG9seW1lclJlcGxhY2VkX187CiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgewogICAgICAgICAgICAgICAgICByZXBsYWNlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4sIHJlcGxhY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSBpZiAobi5zdHlsZSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lckRpc3BsYXlfXyA9IG4uc3R5bGUuZGlzcGxheTsKICAgICAgICAgICAgICAgIG4uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbi5zdHlsZS5kaXNwbGF5ID0gbi5fX3BvbHltZXJEaXNwbGF5X187CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBuLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyA9IGhpZGU7CiAgICAgICAgICBpZiAobi5fc2hvd0hpZGVDaGlsZHJlbikgewogICAgICAgICAgICBuLl9zaG93SGlkZUNoaWxkcmVuKGhpZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgcHJvcGVydHktZWZmZWN0cyBpbXBsZW1lbnRhdGlvbiB0byBpbnRlcmNlcHQKICAgICAgICogdGV4dENvbnRlbnQgYmluZGluZ3Mgd2hpbGUgY2hpbGRyZW4gYXJlICJoaWRkZW4iIGFuZCBjYWNoZSBpbgogICAgICAgKiBwcml2YXRlIHN0b3JhZ2UgZm9yIGxhdGVyIHJldHJpZXZhbC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBUaGUgbm9kZSB0byBzZXQgYSBwcm9wZXJ0eSBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgICAgICBpZiAobm9kZS5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18gJiYKICAgICAgICAgICAgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBwcm9wID09ICd0ZXh0Q29udGVudCcpIHsKICAgICAgICAgIG5vZGUuX19wb2x5bWVyVGV4dENvbnRlbnRfXyA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdXBlci5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuICBUaGUgcGFyZW50IG1vZGVsCiAgICAgICAqIGlzIGVpdGhlciBhbm90aGVyIHRlbXBsYXRpemUgaW5zdGFuY2UgdGhhdCBoYWQgb3B0aW9uIGBwYXJlbnRNb2RlbDogdHJ1ZWAsCiAgICAgICAqIG9yIGVsc2UgdGhlIGhvc3QgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBUaGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgaW5zdGFuY2UKICAgICAgICovCiAgICAgIGdldCBwYXJlbnRNb2RlbCgpIHsKICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLl9fcGFyZW50TW9kZWw7CiAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgbGV0IG9wdGlvbnM7CiAgICAgICAgICBtb2RlbCA9IHRoaXM7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIC8vIEEgdGVtcGxhdGUgaW5zdGFuY2UncyBgX19kYXRhSG9zdGAgaXMgYSA8dGVtcGxhdGU+CiAgICAgICAgICAgIC8vIGBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3RgIGlzIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICAgICAgbW9kZWwgPSBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3Q7CiAgICAgICAgICB9IHdoaWxlICgob3B0aW9ucyA9IG1vZGVsLl9fdGVtcGxhdGl6ZU9wdGlvbnMpICYmICFvcHRpb25zLnBhcmVudE1vZGVsKTsKICAgICAgICAgIHRoaXMuX19wYXJlbnRNb2RlbCA9IG1vZGVsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdHViIG9mIEhUTUxFbGVtZW50J3MgYGRpc3BhdGNoRXZlbnRgLCBzbyB0aGF0IGVmZmVjdHMgdGhhdCBtYXkKICAgICAgICogZGlzcGF0Y2ggZXZlbnRzIHNhZmVseSBuby1vcC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgRXZlbnQgdG8gZGlzcGF0Y2gKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gQWx3YXlzIHRydWUuCiAgICAgICAqLwogICAgICAgZGlzcGF0Y2hFdmVudChldmVudCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgLyoqIEB0eXBlIHshRGF0YVRlbXBsYXRlfSAqLwogICAgVGVtcGxhdGVJbnN0YW5jZUJhc2UucHJvdG90eXBlLl9fZGF0YUhvc3Q7CiAgICAvKiogQHR5cGUgeyFUZW1wbGF0aXplT3B0aW9uc30gKi8KICAgIFRlbXBsYXRlSW5zdGFuY2VCYXNlLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgLyoqIEB0eXBlIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX21ldGhvZEhvc3Q7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXI7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX19ob3N0UHJvcHM7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5NdXRhYmxlRGF0YShUZW1wbGF0ZUluc3RhbmNlQmFzZSk7CgogICAgZnVuY3Rpb24gZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICBsZXQgdGVtcGxhdGVIb3N0ID0gdGVtcGxhdGUuX19kYXRhSG9zdDsKICAgICAgcmV0dXJuIHRlbXBsYXRlSG9zdCAmJiB0ZW1wbGF0ZUhvc3QuX21ldGhvZEhvc3QgfHwgdGVtcGxhdGVIb3N0OwogICAgfQoKICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgICAvKioKICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGNsYXNzLnByb3RvdHlwZSBpcyBub3QgZGVmaW5lZCBmb3Igc29tZSByZWFzb24KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIC8vIEFub255bW91cyBjbGFzcyBjcmVhdGVkIGJ5IHRoZSB0ZW1wbGF0aXplCiAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/CiAgICAgICAgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgIC8vIEFmZm9yZGFuY2UgZm9yIGdsb2JhbCBtaXhpbnMgb250byBUZW1wbGF0aXplSW5zdGFuY2UKICAgICAgaWYgKFBvbHltZXIuVGVtcGxhdGl6ZS5taXhpbikgewogICAgICAgIGJhc2UgPSBQb2x5bWVyLlRlbXBsYXRpemUubWl4aW4oYmFzZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGxldCBrbGFzcyA9IGNsYXNzIGV4dGVuZHMgYmFzZSB7IH07CiAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zID0gb3B0aW9uczsKICAgICAga2xhc3MucHJvdG90eXBlLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gY2xhc3MucHJvdG90eXBlIGlzIG5vdCBkZWZpbmVkIGZvciBzb21lIHJlYXNvbgogICAgICovCiAgICBmdW5jdGlvbiBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpIHsKICAgICAgbGV0IHVzZXJGb3J3YXJkSG9zdFByb3AgPSBvcHRpb25zLmZvcndhcmRIb3N0UHJvcDsKICAgICAgaWYgKHVzZXJGb3J3YXJkSG9zdFByb3ApIHsKICAgICAgICAvLyBQcm92aWRlIGRhdGEgQVBJIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIG9uIG1lbW9pemVkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgbGV0IGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzOwogICAgICAgIGlmICgha2xhc3MpIHsKICAgICAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/IE11dGFibGVEYXRhVGVtcGxhdGUgOiBEYXRhVGVtcGxhdGU7CiAgICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICAgIGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzID0KICAgICAgICAgICAgY2xhc3MgVGVtcGxhdGl6ZWRUZW1wbGF0ZSBleHRlbmRzIGJhc2Uge307CiAgICAgICAgICAvLyBBZGQgdGVtcGxhdGUgLSA+aW5zdGFuY2VzIGVmZmVjdHMKICAgICAgICAgIC8vIGFuZCBob3N0IDwtIHRlbXBsYXRlIGVmZmVjdHMKICAgICAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdCgnX2hvc3RfJyArIHByb3AsCiAgICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLlBST1BFUlRZX0VGRkVDVF9UWVBFUy5QUk9QQUdBVEUsCiAgICAgICAgICAgICAge2ZuOiBjcmVhdGVGb3J3YXJkSG9zdFByb3BFZmZlY3QocHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCl9KTsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eSgnX2hvc3RfJyArIHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGtsYXNzKTsKICAgICAgICAvLyBNaXggYW55IHByZS1ib3VuZCBkYXRhIGludG8gX19kYXRhOyBubyBuZWVkIHRvIGZsdXNoIHRoaXMgdG8KICAgICAgICAvLyBpbnN0YW5jZXMgc2luY2UgdGhleSBwdWxsIGZyb20gdGhlIHRlbXBsYXRlIGF0IGluc3RhbmNlLXRpbWUKICAgICAgICBpZiAodGVtcGxhdGUuX19kYXRhUHJvdG8pIHsKICAgICAgICAgIC8vIE5vdGUsIGdlbmVyYWxseSBgX19kYXRhUHJvdG9gIGNvdWxkIGJlIGNoYWluZWQsIGJ1dCBpdCdzIGd1YXJhbnRlZWQKICAgICAgICAgIC8vIHRvIG5vdCBiZSBzaW5jZSB0aGlzIGlzIGEgdmFuaWxsYSB0ZW1wbGF0ZSB3ZSBqdXN0IGFkZGVkIGVmZmVjdHMgdG8KICAgICAgICAgIE9iamVjdC5hc3NpZ24odGVtcGxhdGUuX19kYXRhLCB0ZW1wbGF0ZS5fX2RhdGFQcm90byk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIGFueSBwZW5kaW5nIGRhdGEgZm9yIHBlcmZvcm1hbmNlCiAgICAgICAgdGVtcGxhdGUuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRlbXBsYXRlLl9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICAgIHRlbXBsYXRlLl9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgdGVtcGxhdGUuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgfQogICAgfQogICAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKICAgIGZ1bmN0aW9uIGNyZWF0ZUZvcndhcmRIb3N0UHJvcEVmZmVjdChob3N0UHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gZm9yd2FyZEhvc3RQcm9wKHRlbXBsYXRlLCBwcm9wLCBwcm9wcykgewogICAgICAgIHVzZXJGb3J3YXJkSG9zdFByb3AuY2FsbCh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIHByb3Auc3Vic3RyaW5nKCdfaG9zdF8nLmxlbmd0aCksIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9OwogICAgICBmb3IgKGxldCBpcHJvcCBpbiBvcHRpb25zLmluc3RhbmNlUHJvcHMpIHsKICAgICAgICBkZWxldGUgaG9zdFByb3BzW2lwcm9wXTsKICAgICAgICBsZXQgdXNlck5vdGlmeUluc3RhbmNlUHJvcCA9IG9wdGlvbnMubm90aWZ5SW5zdGFuY2VQcm9wOwogICAgICAgIGlmICh1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGlwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlJbnN0YW5jZVByb3BFZmZlY3QoaXByb3AsIHVzZXJOb3RpZnlJbnN0YW5jZVByb3ApfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCAmJiB0ZW1wbGF0ZS5fX2RhdGFIb3N0KSB7CiAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGhwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTm90aWZ5SW5zdGFuY2VQcm9wRWZmZWN0KGluc3RQcm9wLCB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBub3RpZnlJbnN0YW5jZVByb3AoaW5zdCwgcHJvcCwgcHJvcHMpIHsKICAgICAgICB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wLmNhbGwoaW5zdC5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIGluc3QsIHByb3AsIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5vdGlmeUhvc3RQcm9wKGluc3QsIHByb3AsIHByb3BzKSB7CiAgICAgICAgaW5zdC5fX2RhdGFIb3N0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoJ19ob3N0XycgKyBwcm9wLCBwcm9wc1twcm9wXSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBNb2R1bGUgZm9yIHByZXBhcmluZyBhbmQgc3RhbXBpbmcgaW5zdGFuY2VzIG9mIHRlbXBsYXRlcyB0aGF0IHV0aWxpemUKICAgICAqIFBvbHltZXIncyBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVyIGZlYXR1cmVzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIC8vIEdldCBhIHRlbXBsYXRlIGZyb20gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKTsKICAgICAqICAgICAvLyBQcmVwYXJlIHRoZSB0ZW1wbGF0ZQogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUpOwogICAgICogICAgIC8vIEluc3RhbmNlIHRoZSB0ZW1wbGF0ZSB3aXRoIGFuIGluaXRpYWwgZGF0YSBtb2RlbAogICAgICogICAgIGxldCBpbnN0YW5jZSA9IG5ldyBUZW1wbGF0ZUNsYXNzKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGVsZW1lbnQncyBzaGFkb3cgRE9NCiAgICAgKiAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVGhlIGBvcHRpb25zYCBkaWN0aW9uYXJ5IHBhc3NlZCB0byBgdGVtcGxhdGl6ZWAgYWxsb3dzIGZvciBjdXN0b21pemluZwogICAgICogZmVhdHVyZXMgb2YgdGhlIGdlbmVyYXRlZCB0ZW1wbGF0ZSBjbGFzcywgaW5jbHVkaW5nIGhvdyBvdXRlci1zY29wZSBob3N0CiAgICAgKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBmb3J3YXJkZWQgaW50byB0ZW1wbGF0ZSBpbnN0YW5jZXMsIGhvdyBhbnkgaW5zdGFuY2UKICAgICAqIHByb3BlcnRpZXMgYWRkZWQgaW50byB0aGUgdGVtcGxhdGUncyBzY29wZSBzaG91bGQgYmUgbm90aWZpZWQgb3V0IHRvCiAgICAgKiB0aGUgaG9zdCwgYW5kIHdoZXRoZXIgdGhlIGluc3RhbmNlIHNob3VsZCBiZSBkZWNvcmF0ZWQgYXMgYSAicGFyZW50IG1vZGVsIgogICAgICogb2YgYW55IGV2ZW50IGhhbmRsZXJzLgogICAgICoKICAgICAqICAgICAvLyBDdXN0b21pemUgcHJvcGVydHkgZm9yd2FyZGluZyBhbmQgZXZlbnQgbW9kZWwgZGVjb3JhdGlvbgogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAqICAgICAgIHBhcmVudE1vZGVsOiB0cnVlLAogICAgICogICAgICAgZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSkgey4uLn0sCiAgICAgKiAgICAgICBpbnN0YW5jZVByb3BzOiB7Li4ufSwKICAgICAqICAgICAgIG5vdGlmeUluc3RhbmNlUHJvcChpbnN0YW5jZSwgcHJvcGVydHksIHZhbHVlKSB7Li4ufSwKICAgICAqICAgICB9KTsKICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBwcmVwYXJpbmcgYW5kIHN0YW1waW5nIGluc3RhbmNlcyBvZiB0ZW1wbGF0ZXMKICAgICAqICAgdXRpbGl6aW5nIFBvbHltZXIgdGVtcGxhdGluZyBmZWF0dXJlcy4KICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplID0gewoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYW4gYW5vbnltb3VzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgY2xhc3MgYm91bmQgdG8gdGhlCiAgICAgICAqIGA8dGVtcGxhdGU+YCBwcm92aWRlZC4gIEluc3RhbmNpbmcgdGhlIGNsYXNzIHdpbGwgcmVzdWx0IGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBiZWluZyBzdGFtcGVkIGludG8gYSBkb2N1bWVudCBmcmFnbWVudCBzdG9yZWQgYXMgdGhlIGluc3RhbmNlJ3MKICAgICAgICogYHJvb3RgIHByb3BlcnR5LCBhZnRlciB3aGljaCBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIERPTS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGVzIG1heSB1dGlsaXplIGFsbCBQb2x5bWVyIGRhdGEtYmluZGluZyBmZWF0dXJlcyBhcyB3ZWxsIGFzCiAgICAgICAqIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycy4gIEV2ZW50IGxpc3RlbmVycyBhbmQgaW5saW5lIGNvbXB1dGluZwogICAgICAgKiBmdW5jdGlvbnMgaW4gdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBob3N0IG9mIHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogVGhlIGNvbnN0cnVjdG9yIHJldHVybmVkIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IGRpY3Rpb25hcnkgb2YgaW5pdGlhbAogICAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMgdG8gcHJvcGFnYXRlIGludG8gdGVtcGxhdGUgYmluZGluZ3MuICBBZGRpdGlvbmFsbHkKICAgICAgICogaG9zdCBwcm9wZXJ0aWVzIGNhbiBiZSBmb3J3YXJkZWQgaW4sIGFuZCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGNhbiBiZQogICAgICAgKiBub3RpZmllZCBvdXQgYnkgcHJvdmlkaW5nIG9wdGlvbmFsIGNhbGxiYWNrcyBpbiB0aGUgYG9wdGlvbnNgIGRpY3Rpb25hcnkuCiAgICAgICAqCiAgICAgICAqIFZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gYG9wdGlvbnNgIGFyZSBhcyBmb2xsb3dzOgogICAgICAgKgogICAgICAgKiAtIGBmb3J3YXJkSG9zdFByb3AocHJvcGVydHksIHZhbHVlKWA6IENhbGxlZCB3aGVuIGEgcHJvcGVydHkgcmVmZXJlbmNlZAogICAgICAgKiAgIGluIHRoZSB0ZW1wbGF0ZSBjaGFuZ2VkIG9uIHRoZSB0ZW1wbGF0ZSdzIGhvc3QuIEFzIHRoaXMgbGlicmFyeSBkb2VzCiAgICAgICAqICAgbm90IHJldGFpbiByZWZlcmVuY2VzIHRvIHRlbXBsYXRlcyBpbnN0YW5jZWQgYnkgdGhlIHVzZXIsIGl0IGlzIHRoZQogICAgICAgKiAgIHRlbXBsYXRpemUgb3duZXIncyByZXNwb25zaWJpbGl0eSB0byBmb3J3YXJkIGhvc3QgcHJvcGVydHkgY2hhbmdlcyBpbnRvCiAgICAgICAqICAgdXNlci1zdGFtcGVkIGluc3RhbmNlcy4gIFRoZSBgaW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSlgCiAgICAgICAqICAgIG1ldGhvZCBvbiB0aGUgZ2VuZXJhdGVkIGNsYXNzIHNob3VsZCBiZSBjYWxsZWQgdG8gZm9yd2FyZCBob3N0CiAgICAgICAqICAgcHJvcGVydGllcyBpbnRvIHRoZSB0ZW1wbGF0ZSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHByb3BlcnR5LWNoYW5nZWQKICAgICAgICogICBub3RpZmljYXRpb25zLiBBbnkgcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGFyZSBub3QKICAgICAgICogICBkZWZpbmVkIGluIGBpbnN0YW5jZVByb3BzYCB3aWxsIGJlIG5vdGlmaWVkIHVwIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICogICBhdXRvbWF0aWNhbGx5LgogICAgICAgKiAtIGBpbnN0YW5jZVByb3BzYDogRGljdGlvbmFyeSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdpbGwgYmUgYWRkZWQKICAgICAgICogICB0byB0aGUgaW5zdGFuY2UgYnkgdGhlIHRlbXBsYXRpemUgb3duZXIuICBUaGVzZSBwcm9wZXJ0aWVzIHNoYWRvdyBhbnkKICAgICAgICogICBob3N0IHByb3BlcnRpZXMsIGFuZCBjaGFuZ2VzIHdpdGhpbiB0aGUgdGVtcGxhdGUgdG8gdGhlc2UgcHJvcGVydGllcwogICAgICAgKiAgIHdpbGwgcmVzdWx0IGluIGBub3RpZnlJbnN0YW5jZVByb3BgIGJlaW5nIGNhbGxlZC4KICAgICAgICogLSBgbXV0YWJsZURhdGFgOiBXaGVuIGB0cnVlYCwgdGhlIGdlbmVyYXRlZCBjbGFzcyB3aWxsIHNraXAgc3RyaWN0CiAgICAgICAqICAgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgICAgICogICAiZGlydHkiKS4KICAgICAgICogLSBgbm90aWZ5SW5zdGFuY2VQcm9wKGluc3RhbmNlLCBwcm9wZXJ0eSwgdmFsdWUpYDogQ2FsbGVkIHdoZW4KICAgICAgICogICBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBjaGFuZ2VzLiAgVXNlcnMgbWF5IGNob29zZSB0byBjYWxsIGBub3RpZnlQYXRoYAogICAgICAgKiAgIG9uIGUuZy4gdGhlIG93bmVyIHRvIG5vdGlmeSB0aGUgY2hhbmdlLgogICAgICAgKiAtIGBwYXJlbnRNb2RlbGA6IFdoZW4gYHRydWVgLCBldmVudHMgaGFuZGxlZCBieSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMKICAgICAgICogICAoYG9uLWV2ZW50PSJoYW5kbGVyImApIHdpbGwgYmUgZGVjb3JhdGVkIHdpdGggYSBgbW9kZWxgIHByb3BlcnR5IHBvaW50aW5nCiAgICAgICAqICAgdG8gdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRoYXQgc3RhbXBlZCBpdC4gIEl0IHdpbGwgYWxzbyBiZSByZXR1cm5lZAogICAgICAgKiAgIGZyb20gYGluc3RhbmNlLnBhcmVudE1vZGVsYCBpbiBjYXNlcyB3aGVyZSB0ZW1wbGF0ZSBpbnN0YW5jZSBuZXN0aW5nCiAgICAgICAqICAgY2F1c2VzIGFuIGlubmVyIG1vZGVsIHRvIHNoYWRvdyBhbiBvdXRlciBtb2RlbC4KICAgICAgICoKICAgICAgICogQWxsIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGJvdW5kIHRvIHRoZSBgb3duZXJgLiBBbnkgY29udGV4dAogICAgICAgKiBuZWVkZWQgZm9yIHRoZSBjYWxsYmFja3MgKHN1Y2ggYXMgcmVmZXJlbmNlcyB0byBgaW5zdGFuY2VzYCBzdGFtcGVkKQogICAgICAgKiBzaG91bGQgYmUgc3RvcmVkIG9uIHRoZSBgb3duZXJgIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgdmlhCiAgICAgICAqIGB0aGlzYC4KICAgICAgICoKICAgICAgICogV2hlbiBgb3B0aW9ucy5mb3J3YXJkSG9zdFByb3BgIGlzIGRlY2xhcmVkIGFzIGFuIG9wdGlvbiwgYW55IHByb3BlcnRpZXMKICAgICAgICogcmVmZXJlbmNlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCBmcm9tIHRoZSBob3N0IG9mCiAgICAgICAqIHRoZSBgPHRlbXBsYXRlPmAgdG8gaW5zdGFuY2VzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYW55IHByb3BlcnRpZXMgbGlzdGVkIGluCiAgICAgICAqIHRoZSBgb3B0aW9ucy5pbnN0YW5jZVByb3BzYCBvYmplY3QuICBgaW5zdGFuY2VQcm9wc2AgYXJlIGFzc3VtZWQgdG8gYmUKICAgICAgICogbWFuYWdlZCBieSB0aGUgb3duZXIgb2YgdGhlIGluc3RhbmNlcywgZWl0aGVyIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvcgogICAgICAgKiBvciBzZXQgYWZ0ZXIgdGhlIGZhY3QuICBOb3RlLCBhbnkgcHJvcGVydGllcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2lsbAogICAgICAgKiBhbHdheXMgYmUgc2V0IHRvIHRoZSBpbnN0YW5jZSAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd291bGQgbm9ybWFsbHkKICAgICAgICogYmUgZm9yd2FyZGVkIGZyb20gdGhlIGhvc3QpLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgYHRlbXBsYXRpemUoKWAgY2FuIGJlIHJ1biBvbmx5IG9uY2UgZm9yIGEgZ2l2ZW4gYDx0ZW1wbGF0ZT5gLgogICAgICAgKiBGdXJ0aGVyIGNhbGxzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiBBbHNvLCB0aGVyZSBpcyBhIHNwZWNpYWwKICAgICAgICogYmVoYXZpb3IgaWYgdGhlIHRlbXBsYXRlIHdhcyBkdXBsaWNhdGVkIHRocm91Z2ggYSBtZWNoYW5pc20gc3VjaCBhcwogICAgICAgKiBgPGRvbS1yZXBlYXQ+YCBvciBgPHRlc3QtZml4dHVyZT5gLiBJbiB0aGlzIGNhc2UsIGFsbCBjYWxscyB0bwogICAgICAgKiBgdGVtcGxhdGl6ZSgpYCByZXR1cm4gdGhlIHNhbWUgY2xhc3MgZm9yIGFsbCBkdXBsaWNhdGVzIG9mIGEgdGVtcGxhdGUuCiAgICAgICAqIFRoZSBjbGFzcyByZXR1cm5lZCBmcm9tIGB0ZW1wbGF0aXplKClgIGlzIGdlbmVyYXRlZCBvbmx5IG9uY2UgdXNpbmcKICAgICAgICogdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBmaXJzdCBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgYW55IGBvcHRpb25zYAogICAgICAgKiBwcm92aWRlZCB0byBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgYmUgaWdub3JlZC4gVGhlcmVmb3JlLCBpdCBpcyB2ZXJ5CiAgICAgICAqIGltcG9ydGFudCBub3QgdG8gY2xvc2Ugb3ZlciBhbnkgdmFyaWFibGVzIGluc2lkZSB0aGUgY2FsbGJhY2tzLiBBbHNvLAogICAgICAgKiBhcnJvdyBmdW5jdGlvbnMgbXVzdCBiZSBhdm9pZGVkIGJlY2F1c2UgdGhleSBiaW5kIHRoZSBvdXRlciBgdGhpc2AuCiAgICAgICAqIEluc2lkZSB0aGUgY2FsbGJhY2tzLCBhbnkgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBjYW4gYmUgYWNjZXNzZWQKICAgICAgICogdGhyb3VnaCBgdGhpc2AsIHdoaWNoIHBvaW50cyB0byB0aGUgYG93bmVyYC4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuVGVtcGxhdGl6ZQogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byB0ZW1wbGF0aXplCiAgICAgICAqIEBwYXJhbSB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHM9fSBvd25lciBPd25lciBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2VzOwogICAgICAgKiAgIGFueSBvcHRpb25hbCBjYWxsYmFja3Mgd2lsbCBiZSBib3VuZCB0byB0aGlzIG93bmVyLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBkaWN0aW9uYXJ5IChzZWUgc3VtbWFyeSBmb3IgZGV0YWlscykKICAgICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlRlbXBsYXRlSW5zdGFuY2VCYXNlKX0gR2VuZXJhdGVkIGNsYXNzIGJvdW5kIHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgKiAgIHByb3ZpZGVkCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgb3duZXIsIG9wdGlvbnMpIHsKICAgICAgICAvLyBVbmRlciBzdHJpY3RUZW1wbGF0ZVBvbGljeSwgdGhlIHRlbXBsYXRpemVkIGVsZW1lbnQgbXVzdCBiZSBvd25lZAogICAgICAgIC8vIGJ5IGEgKHRydXN0ZWQpIFBvbHltZXIgZWxlbWVudCwgaW5kaWNhdGVkIGJ5IGV4aXN0ZW5jZSBvZiBfbWV0aG9kSG9zdDsKICAgICAgICAvLyBlLmcuIGZvciBkb20taWYgJiBkb20tcmVwZWF0IGluIG1haW4gZG9jdW1lbnQsIF9tZXRob2RIb3N0IGlzIG51bGwKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSAmJiAhZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmljdFRlbXBsYXRlUG9saWN5OiB0ZW1wbGF0ZSBvd25lciBub3QgdHJ1c3RlZCcpOwogICAgICAgIH0KICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshVGVtcGxhdGl6ZU9wdGlvbnN9ICovKG9wdGlvbnMgfHwge30pOwogICAgICAgIGlmICh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lcikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIDx0ZW1wbGF0ZT4gY2FuIG9ubHkgYmUgdGVtcGxhdGl6ZWQgb25jZScpOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGNvbnN0IGN0b3IgPSBvd25lciA/IG93bmVyLmNvbnN0cnVjdG9yIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IGN0b3IuX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIC8vIEdldCBtZW1vaXplZCBiYXNlIGNsYXNzIGZvciB0aGUgcHJvdG90eXBpY2FsIHRlbXBsYXRlLCB3aGljaAogICAgICAgIC8vIGluY2x1ZGVzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGJpbmRpbmcgdGVtcGxhdGUgJiBmb3J3YXJkaW5nCiAgICAgICAgbGV0IGJhc2VDbGFzcyA9IHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzczsKICAgICAgICBpZiAoIWJhc2VDbGFzcykgewogICAgICAgICAgYmFzZUNsYXNzID0gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgICAgIHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzcyA9IGJhc2VDbGFzczsKICAgICAgICB9CiAgICAgICAgLy8gSG9zdCBwcm9wZXJ0eSBmb3J3YXJkaW5nIG11c3QgYmUgaW5zdGFsbGVkIG9udG8gdGVtcGxhdGUgaW5zdGFuY2UKICAgICAgICBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpOwogICAgICAgIC8vIFN1YmNsYXNzIGJhc2UgY2xhc3MgYW5kIGFkZCByZWZlcmVuY2UgZm9yIHRoaXMgc3BlY2lmaWMgdGVtcGxhdGUKICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICBsZXQga2xhc3MgPSBjbGFzcyBUZW1wbGF0ZUluc3RhbmNlIGV4dGVuZHMgYmFzZUNsYXNzIHt9OwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fbWV0aG9kSG9zdCA9IGZpbmRNZXRob2RIb3N0KHRlbXBsYXRlKTsKICAgICAgICBrbGFzcy5wcm90b3R5cGUuX19kYXRhSG9zdCA9IHRlbXBsYXRlOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX2hvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHM7CiAgICAgICAga2xhc3MgPSAvKiogQHR5cGUge2Z1bmN0aW9uKG5ldzpUZW1wbGF0ZUluc3RhbmNlQmFzZSl9ICovKGtsYXNzKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlICJtb2RlbCIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCwgd2hpY2gKICAgICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAgICogY29udGFpbmVkIGluLiBBIHRlbXBsYXRlIG1vZGVsIGlzIGFuIGluc3RhbmNlIG9mCiAgICAgICAqIGBUZW1wbGF0ZUluc3RhbmNlQmFzZWAsIGFuZCBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEKICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIEV4YW1wbGU6CiAgICAgICAqCiAgICAgICAqICAgbGV0IG1vZGVsID0gbW9kZWxGb3JFbGVtZW50KGVsKTsKICAgICAgICogICBpZiAobW9kZWwuaW5kZXggPCAxMCkgewogICAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlRlbXBsYXRpemUKICAgICAgICogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUaGUgbW9kZWwgd2lsbCBiZSByZXR1cm5lZCBmb3IKICAgICAgICogICBlbGVtZW50cyBzdGFtcGVkIGZyb20gdGhpcyB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0ge05vZGU9fSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIHJldHVybiBhIHRlbXBsYXRlIG1vZGVsLgogICAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0gVGVtcGxhdGUgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZQogICAgICAgKiAgIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBlbGVtZW50CiAgICAgICAqLwogICAgICBtb2RlbEZvckVsZW1lbnQodGVtcGxhdGUsIG5vZGUpIHsKICAgICAgICBsZXQgbW9kZWw7CiAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgIC8vIEFuIGVsZW1lbnQgd2l0aCBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIG1hcmtzIHRoZSB0b3AgYm91bmRhcnkKICAgICAgICAgIC8vIG9mIGEgc2NvcGU7IHdhbGsgdXAgdW50aWwgd2UgZmluZCBvbmUsIGFuZCB0aGVuIGVuc3VyZSB0aGF0CiAgICAgICAgICAvLyBpdHMgX19kYXRhSG9zdCBtYXRjaGVzIGB0aGlzYCwgbWVhbmluZyB0aGlzIGRvbS1yZXBlYXQgc3RhbXBlZCBpdAogICAgICAgICAgaWYgKChtb2RlbCA9IG5vZGUuX190ZW1wbGF0aXplSW5zdGFuY2UpKSB7CiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGVsZW1lbnQgc3RhbXBlZCBieSBhbm90aGVyIHRlbXBsYXRlOyBrZWVwIHdhbGtpbmcgdXAKICAgICAgICAgICAgLy8gZnJvbSBpdHMgX19kYXRhSG9zdAogICAgICAgICAgICBpZiAobW9kZWwuX19kYXRhSG9zdCAhPSB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgIG5vZGUgPSBtb2RlbC5fX2RhdGFIb3N0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU3RpbGwgaW4gYSB0ZW1wbGF0ZSBzY29wZSwga2VlcCBnb2luZyB1cCB1bnRpbAogICAgICAgICAgICAvLyBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIGlzIGZvdW5kCiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwoKICAgIFBvbHltZXIuVGVtcGxhdGVJbnN0YW5jZUJhc2UgPSBUZW1wbGF0ZUluc3RhbmNlQmFzZTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAgIC8qKgogICAgICogQHR5cGVkZWYge3sKICAgICAqICAgX3RlbXBsYXRpemVyVGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQsCiAgICAgKiAgIF9wYXJlbnRNb2RlbDogYm9vbGVhbiwKICAgICAqICAgX2luc3RhbmNlUHJvcHM6IE9iamVjdCwKICAgICAqICAgX2ZvcndhcmRIb3N0UHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgX25vdGlmeUluc3RhbmNlUHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgY3RvcjogVGVtcGxhdGVJbnN0YW5jZUJhc2UKICAgICAqIH19CiAgICAgKi8KICAgIGxldCBUZW1wbGF0aXplclVzZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKCiAgICAvKioKICAgICAqIFRoZSBgUG9seW1lci5UZW1wbGF0aXplcmAgYmVoYXZpb3IgYWRkcyBtZXRob2RzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZgogICAgICogdGVtcGxhdGVzIHRoYXQgYXJlIGVhY2ggbWFuYWdlZCBieSBhbiBhbm9ueW1vdXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYAogICAgICogaW5zdGFuY2Ugd2hlcmUgZGF0YS1iaW5kaW5ncyBpbiB0aGUgc3RhbXBlZCB0ZW1wbGF0ZSBjb250ZW50IGFyZSBib3VuZCB0bwogICAgICogYWNjZXNzb3JzIG9uIGl0c2VsZi4KICAgICAqCiAgICAgKiBUaGlzIGJlaGF2aW9yIGlzIHByb3ZpZGVkIGluIFBvbHltZXIgMi54IGFzIGEgaHlicmlkLWVsZW1lbnQgY29udmVuaWVuY2UKICAgICAqIG9ubHkuICBGb3Igbm9uLWh5YnJpZCB1c2FnZSwgdGhlIGBQb2x5bWVyLlRlbXBsYXRpemVgIGxpYnJhcnkKICAgICAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgLy8gR2V0IGEgdGVtcGxhdGUgZnJvbSBzb21ld2hlcmUsIGUuZy4gbGlnaHQgRE9NCiAgICAgKiAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICogICAgIC8vIFByZXBhcmUgdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgdGhpcy50ZW1wbGF0aXplKHRlbXBsYXRlKTsKICAgICAqICAgICAvLyBJbnN0YW5jZSB0aGUgdGVtcGxhdGUgd2l0aCBhbiBpbml0aWFsIGRhdGEgbW9kZWwKICAgICAqICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLnN0YW1wKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVXNlcnMgb2YgYFRlbXBsYXRpemVyYCBtYXkgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBhYnN0cmFjdAogICAgICogQVBJJ3MgdG8gZGV0ZXJtaW5lIGhvdyBwcm9wZXJ0aWVzIGFuZCBwYXRocyBmcm9tIHRoZSBob3N0IHNob3VsZCBiZQogICAgICogZm9yd2FyZGVkIGludG8gdG8gaW5zdGFuY2VzOgogICAgICoKICAgICAqICAgICBfZm9yd2FyZEhvc3RQcm9wVjI6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKQogICAgICoKICAgICAqIExpa2V3aXNlLCB1c2VycyBtYXkgaW1wbGVtZW50IHRoZXNlIGFkZGl0aW9uYWwgYWJzdHJhY3QgQVBJJ3MgdG8gZGV0ZXJtaW5lCiAgICAgKiBob3cgaW5zdGFuY2Utc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNoYW5nZSBvbiB0aGUgaW5zdGFuY2Ugc2hvdWxkIGJlCiAgICAgKiBmb3J3YXJkZWQgb3V0IHRvIHRoZSBob3N0LCBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogICAgIF9ub3RpZnlJbnN0YW5jZVByb3BWMjogZnVuY3Rpb24oaW5zdCwgcHJvcCwgdmFsdWUpCiAgICAgKgogICAgICogSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluc3RhbmNlLXNwZWNpZmljIGFuZCByZXF1aXJlCiAgICAgKiBjdXN0b20gbm90aWZpY2F0aW9uIHZpYSBgX25vdGlmeUluc3RhbmNlUHJvcGAsIGRlZmluZSBhbiBgX2luc3RhbmNlUHJvcHNgCiAgICAgKiBvYmplY3QgY29udGFpbmluZyBrZXlzIGZvciBlYWNoIGluc3RhbmNlIHByb3AsIGZvciBleGFtcGxlOgogICAgICoKICAgICAqICAgICBfaW5zdGFuY2VQcm9wczogewogICAgICogICAgICAgaXRlbTogdHJ1ZSwKICAgICAqICAgICAgIGluZGV4OiB0cnVlCiAgICAgKiAgICAgfQogICAgICoKICAgICAqIEFueSBwcm9wZXJ0aWVzIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIF9pbnN0YW5jZVByb3AKICAgICAqIHdpbGwgYmUgZm9yd2FyZGVkIG91dCB0byB0aGUgVGVtcGxhdGl6ZSBgb3duZXJgIGF1dG9tYXRpY2FsbHkuCiAgICAgKgogICAgICogVXNlcnMgbWF5IGFsc28gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgYWJzdHJhY3QgZnVuY3Rpb24gdG8gc2hvdyBvcgogICAgICogaGlkZSBhbnkgRE9NIGdlbmVyYXRlZCB1c2luZyBgc3RhbXBgOgogICAgICoKICAgICAqICAgICBfc2hvd0hpZGVDaGlsZHJlbjogZnVuY3Rpb24oc2hvdWxkSGlkZSkKICAgICAqCiAgICAgKiBOb3RlIHRoYXQgc29tZSBjYWxsYmFja3MgYXJlIHN1ZmZpeGVkIHdpdGggYFYyYCBpbiB0aGUgUG9seW1lciAyLnggYmVoYXZpb3IKICAgICAqIGFzIHRoZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIGRpZmZlciBmcm9tIHRoZSBjYWxsYmFja3MgcmVxdWlyZWQKICAgICAqIGJ5IHRoZSAxLnggVGVtcGxhdGl6ZXIgQVBJIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBgVGVtcGxhdGVJbnN0YW5jZWAgQVBJCiAgICAgKiBiZXR3ZWVuIHZlcnNpb25zIDEueCBhbmQgMi54LgogICAgICoKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplciA9IHsKCiAgICAgIC8qKgogICAgICAgKiBHZW5lcmF0ZXMgYW4gYW5vbnltb3VzIGBUZW1wbGF0ZUluc3RhbmNlYCBjbGFzcyAoc3RvcmVkIGFzIGB0aGlzLmN0b3JgKQogICAgICAgKiBmb3IgdGhlIHByb3ZpZGVkIHRlbXBsYXRlLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlcgogICAgICAgKiB0ZW1wbGF0ZSB0byBwcmVwYXJlIGFuIGVsZW1lbnQgZm9yIHN0YW1waW5nIHRoZSB0ZW1wbGF0ZSwgZm9sbG93ZWQKICAgICAgICogYnkgYHN0YW1wYCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGUgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHByZXBhcmUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gbXV0YWJsZURhdGEgV2hlbiBgdHJ1ZWAsIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBza2lwCiAgICAgICAqICAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvCiAgICAgICAqICAgYmUgImRpcnR5IikuIERlZmF1bHRzIHRvIGZhbHNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAdGhpcyB7VGVtcGxhdGl6ZXJVc2VyfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgbXV0YWJsZURhdGEpIHsKICAgICAgICB0aGlzLl90ZW1wbGF0aXplclRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgdGhpcy5jdG9yID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgIG11dGFibGVEYXRhOiBCb29sZWFuKG11dGFibGVEYXRhKSwKICAgICAgICAgIHBhcmVudE1vZGVsOiB0aGlzLl9wYXJlbnRNb2RlbCwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IHRoaXMuX2luc3RhbmNlUHJvcHMsCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IHRoaXMuX2ZvcndhcmRIb3N0UHJvcFYyLAogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiB0aGlzLl9ub3RpZnlJbnN0YW5jZVByb3BWMgogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIHByZXBhcmVkIGJ5IGB0ZW1wbGF0aXplYC4gIFRoZSBvYmplY3QKICAgICAgICogcmV0dXJuZWQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFub255bW91cyBjbGFzcyBnZW5lcmF0ZWQgYnkgYHRlbXBsYXRpemVgCiAgICAgICAqIHdob3NlIGByb290YCBwcm9wZXJ0eSBpcyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgbmV3bHkgY2xvbmVkCiAgICAgICAqIHRlbXBsYXRlIGNvbnRlbnQsIGFuZCB3aGljaCBoYXMgcHJvcGVydHkgYWNjZXNzb3JzIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgICogcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRlbXBsYXRlIGJpbmRpbmdzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG1vZGVsIE9iamVjdCBjb250YWluaW5nIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzIHRvCiAgICAgICAqICAgcG9wdWxhdGUgaW50byB0aGUgdGVtcGxhdGUgYmluZGluZ3MuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBSZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlIG9mCiAgICAgICAqIHRoZSB0ZW1wbGF0ZSBwcmVwYXJlZCBieSBgdGVtcGxhdGl6ZWAuCiAgICAgICAqIEB0aGlzIHtUZW1wbGF0aXplclVzZXJ9CiAgICAgICAqLwogICAgICBzdGFtcChtb2RlbCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jdG9yKG1vZGVsKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSAibW9kZWwiIChgVGVtcGxhdGVJbnN0YW5jZWApIGFzc29jaWF0ZWQgd2l0aAogICAgICAgKiBhIGdpdmVuIGVsZW1lbnQsIHdoaWNoIHNlcnZlcyBhcyB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIHRlbXBsYXRlCiAgICAgICAqIGluc3RhbmNlIHRoZSBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbi4gIEEgdGVtcGxhdGUgbW9kZWwgc2hvdWxkIGJlIHVzZWQKICAgICAgICogdG8gbWFuaXB1bGF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAgICogQHJldHVybiB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9IE1vZGVsIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBzY29wZSBmb3IKICAgICAgICogICB0aGUgZWxlbWVudC4KICAgICAgICogQHRoaXMge1RlbXBsYXRpemVyVXNlcn0KICAgICAgICovCiAgICAgIG1vZGVsRm9yRWxlbWVudChlbCkgewogICAgICAgIHJldHVybiBQb2x5bWVyLlRlbXBsYXRpemUubW9kZWxGb3JFbGVtZW50KHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsIGVsKTsKICAgICAgfQogICAgfTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9HZXN0dXJlRXZlbnRMaXN0ZW5lcnN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBkb21CaW5kQmFzZSA9CiAgICAgIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKAogICAgICAgIFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YSgKICAgICAgICAgIFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxFbGVtZW50KSkpOwoKICAgIC8qKgogICAgICogQ3VzdG9tIGVsZW1lbnQgdG8gYWxsb3cgdXNpbmcgUG9seW1lcidzIHRlbXBsYXRlIGZlYXR1cmVzIChkYXRhIGJpbmRpbmcsCiAgICAgKiBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMsIGV0Yy4pIGluIHRoZSBtYWluIGRvY3VtZW50IHdpdGhvdXQgZGVmaW5pbmcKICAgICAqIGEgbmV3IGN1c3RvbSBlbGVtZW50LgogICAgICoKICAgICAqIGA8dGVtcGxhdGU+YCB0YWdzIHV0aWxpemluZyBiaW5kaW5ncyBtYXkgYmUgd3JhcHBlZCB3aXRoIHRoZSBgPGRvbS1iaW5kPmAKICAgICAqIGVsZW1lbnQsIHdoaWNoIHdpbGwgaW1tZWRpYXRlbHkgc3RhbXAgdGhlIHdyYXBwZWQgdGVtcGxhdGUgaW50byB0aGUgbWFpbgogICAgICogZG9jdW1lbnQgYW5kIGJpbmQgZWxlbWVudHMgdG8gdGhlIGBkb20tYmluZGAgZWxlbWVudCBpdHNlbGYgYXMgdGhlCiAgICAgKiBiaW5kaW5nIHNjb3BlLgogICAgICoKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAY3VzdG9tRWxlbWVudAogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cwogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5HZXN0dXJlRXZlbnRMaXN0ZW5lcnMKICAgICAqIEBleHRlbmRzIHtkb21CaW5kQmFzZX0KICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0byBhbGxvdyB1c2luZyBQb2x5bWVyJ3MgdGVtcGxhdGUgZmVhdHVyZXMgKGRhdGEKICAgICAqICAgYmluZGluZywgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLCBldGMuKSBpbiB0aGUgbWFpbiBkb2N1bWVudC4KICAgICAqLwogICAgY2xhc3MgRG9tQmluZCBleHRlbmRzIGRvbUJpbmRCYXNlIHsKCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydtdXRhYmxlLWRhdGEnXTsgfQoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLWJpbmQgbm90IGFsbG93ZWRgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yb290ID0gbnVsbDsKICAgICAgICB0aGlzLiQgPSBudWxsOwogICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IG51bGw7CiAgICAgIH0KCiAgICAgIC8qKiBAcmV0dXJuIHt2b2lkfSAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soKSB7CiAgICAgICAgLy8gYXNzdW1lcyBvbmx5IG9uZSBvYnNlcnZlZCBhdHRyaWJ1dGUKICAgICAgICB0aGlzLm11dGFibGVEYXRhID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLyoqIEByZXR1cm4ge3ZvaWR9ICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICB9CgogICAgICAvKiogQHJldHVybiB7dm9pZH0gKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgdGhpcy5fX3JlbW92ZUNoaWxkcmVuKCk7CiAgICAgIH0KCiAgICAgIF9faW5zZXJ0Q2hpbGRyZW4oKSB7CiAgICAgICAgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnJvb3QsIHRoaXMpOwogICAgICB9CgogICAgICBfX3JlbW92ZUNoaWxkcmVuKCkgewogICAgICAgIGlmICh0aGlzLl9fY2hpbGRyZW4pIHsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuX19jaGlsZHJlbltpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gVGhpcyBpcyB0eXBpY2FsbHkgb25seQogICAgICAgKiBuZWNlc3NhcnkgdG8gY2FsbCBpZiBIVE1MSW1wb3J0cyB3aXRoIHRoZSBhc3luYyBhdHRyaWJ1dGUgYXJlIHVzZWQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZW5kZXIoKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlOwogICAgICAgIGlmICghdGhpcy5fX2NoaWxkcmVuKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGVtcGxhdGUgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICAgIGlmICghdGVtcGxhdGUpIHsKICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBjaGlsZExpc3QgY2hhbmdlcyBhbmQgdGVtcGxhdGUgc2hvdWxkIGJlIHRoZXJlIGJ5IHRoZW4KICAgICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICAgIHRlbXBsYXRlID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykpOwogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb20tYmluZCByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj10aGlzLnJvb3QuZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIHRoaXMuX19jaGlsZHJlblt0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoXSA9IG47CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnNlcnRDaGlsZHJlbigpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KCiAgICB9CgogICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkb20tYmluZCcsIERvbUJpbmQpOwoKICAgIC8qKiBAY29uc3QgKi8KICAgIFBvbHltZXIuRG9tQmluZCA9IERvbUJpbmQ7CgogIH0pKCk7CgoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qKgogICAgICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc3RhdGljIHN0cmluZyB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIKICAgICAqIHN0cmluZ3MgYnkgYXNzZXRpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIHZpYSB0aGlzIGNsYXNzLiBUaGUKICAgICAqIGB2YWx1ZWAgcHJvcGVydHkgcmV0dXJucyB0aGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgKi8KICAgIGNsYXNzIExpdGVyYWxTdHJpbmcgewogICAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLnZhbHVlID0gc3RyaW5nLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTGl0ZXJhbFN0cmluZyBzdHJpbmcgdmFsdWUKICAgICAgICovCiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE9iamVjdCB0byBzdHJpbmdpZnkgaW50byBIVE1MCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5naWZpZWQgZm9ybSBvZiBgb2JqYAogICAgICovCiAgICBmdW5jdGlvbiBsaXRlcmFsVmFsdWUodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGl0ZXJhbFN0cmluZykgewogICAgICAgIHJldHVybiAvKiogQHR5cGUgeyFMaXRlcmFsU3RyaW5nfSAqLyh2YWx1ZSkudmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tbGl0ZXJhbCB2YWx1ZSBwYXNzZWQgdG8gUG9seW1lci5odG1sTGl0ZXJhbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTAogICAgICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamAKICAgICAqLwogICAgZnVuY3Rpb24gaHRtbFZhbHVlKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudCB9ICovKHZhbHVlKS5pbm5lckhUTUw7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXRlcmFsU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIGxpdGVyYWxWYWx1ZSh2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tdGVtcGxhdGUgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIuaHRtbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0aGF0IGNyZWF0ZXMgYW4gSFRNTCA8dGVtcGxhdGU+IGVsZW1lbnQgZnJvbSB0aGUKICAgICAqIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcuCiAgICAgKgogICAgICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIGEgUG9seW1lciBUZW1wbGF0ZSBpbiBKYXZhU2NyaXB0LgogICAgICoKICAgICAqIFRlbXBsYXRlcyBjYW4gYmUgY29tcG9zZWQgYnkgaW50ZXJwb2xhdGluZyBgSFRNTFRlbXBsYXRlRWxlbWVudGBzIGluCiAgICAgKiBleHByZXNzaW9ucyBpbiB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLiBUaGUgbmVzdGVkIHRlbXBsYXRlJ3MKICAgICAqIGBpbm5lckhUTUxgIGlzIGluY2x1ZGVkIGluIHRoZSBjb250YWluaW5nIHRlbXBsYXRlLiAgVGhlIG9ubHkgb3RoZXIKICAgICAqIHZhbHVlcyBhbGxvd2VkIGluIGV4cHJlc3Npb25zIGFyZSB0aG9zZSByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmh0bWxMaXRlcmFsYAogICAgICogd2hpY2ggZW5zdXJlcyBvbmx5IGxpdGVyYWwgdmFsdWVzIGZyb20gSlMgc291cmNlIGV2ZXIgcmVhY2ggdGhlIEhUTUwsIHRvCiAgICAgKiBndWFyZCBhZ2FpbnN0IFhTUyByaXNrcy4KICAgICAqCiAgICAgKiBBbGwgb3RoZXIgdmFsdWVzIGFyZSBkaXNhbGxvd2VkIGluIGV4cHJlc3Npb25zIHRvIGhlbHAgcHJldmVudCBYU1MKICAgICAqIGF0dGFja3M7IGhvd2V2ZXIsIGBQb2x5bWVyLmh0bWxMaXRlcmFsYCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIHN0YXRpYwogICAgICogc3RyaW5nIHZhbHVlcyBpbnRvIHRlbXBsYXRlcy4gVGhpcyBpcyB1c2VmdWwgdG8gY29tcG9zZSBzdHJpbmdzIGludG8KICAgICAqIHBsYWNlcyB0aGF0IGRvIG5vdCBhY2NlcHQgaHRtbCwgbGlrZSB0aGUgY3NzIHRleHQgb2YgYSBgc3R5bGVgCiAgICAgKiBlbGVtZW50LgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgKiAgICAgICByZXR1cm4gUG9seW1lci5odG1sYAogICAgICogICAgICAgICA8c3R5bGU+Omhvc3R7IGNvbnRlbnQ6Ii4uLiIgfTwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3RoaXMucGFydGlhbFRlbXBsYXRlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBwYXJ0aWFsVGVtcGxhdGUoKSB7IHJldHVybiBQb2x5bWVyLmh0bWxgPHNwYW4+UGFydGlhbCE8L3NwYW4+YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBDb25zdHJ1Y3RlZCBIVE1MVGVtcGxhdGVFbGVtZW50CiAgICAgKi8KICAgIFBvbHltZXIuaHRtbCA9IGZ1bmN0aW9uIGh0bWwoc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIGNvbnN0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8oZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKSk7CiAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PgogICAgICAgICAgYWNjICsgaHRtbFZhbHVlKHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSk7CiAgICAgIHJldHVybiB0ZW1wbGF0ZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBBbiBodG1sIGxpdGVyYWwgdGFnIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBgUG9seW1lci5odG1sYCB0byBjb21wb3NlLgogICAgICogYSBsaXRlcmFsIHN0cmluZy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICogICAgICAgcmV0dXJuIFBvbHltZXIuaHRtbGAKICAgICAqICAgICAgICAgPHN0eWxlPgogICAgICogICAgICAgICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0KICAgICAqICAgICAgICAgICAke3N0eWxlVGVtcGxhdGV9CiAgICAgKiAgICAgICAgIDwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3N0YXRpY1ZhbHVlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBzdHlsZVRlbXBsYXRlKCkgeyByZXR1cm4gUG9seW1lci5odG1sTGl0ZXJhbGAuc2hhZG93ZWQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFMaXRlcmFsU3RyaW5nfSBDb25zdHJ1Y3RlZCBsaXRlcmFsIHN0cmluZwogICAgICovCiAgICBQb2x5bWVyLmh0bWxMaXRlcmFsID0gZnVuY3Rpb24oc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZyh2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT4KICAgICAgICAgIGFjYyArIGxpdGVyYWxWYWx1ZSh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pKTsKICAgIH07CiAgfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBCYXNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzCiAgICogICBrZXkgbWV0YS1wcm9ncmFtbWluZyBmZWF0dXJlcyBpbmNsdWRpbmcgdGVtcGxhdGUgc3RhbXBpbmcsIGRhdGEtYmluZGluZywKICAgKiAgIGF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24sIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24KICAgKi8KICBQb2x5bWVyLkVsZW1lbnQgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAqIEBleHRlbmRzIHtQb2x5bWVyLkVsZW1lbnR9CiAgICogQHByaXZhdGUKICAgKi8KICBjb25zdCBkb21SZXBlYXRCYXNlID0gUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhKFBvbHltZXIuRWxlbWVudCk7CgogIC8qKgogICAqIFRoZSBgPGRvbS1yZXBlYXQ+YCBlbGVtZW50IHdpbGwgYXV0b21hdGljYWxseSBzdGFtcCBhbmQgYmluZHMgb25lIGluc3RhbmNlCiAgICogb2YgdGVtcGxhdGUgY29udGVudCB0byBlYWNoIG9iamVjdCBpbiBhIHVzZXItcHJvdmlkZWQgYXJyYXkuCiAgICogYGRvbS1yZXBlYXRgIGFjY2VwdHMgYW4gYGl0ZW1zYCBwcm9wZXJ0eSwgYW5kIG9uZSBpbnN0YW5jZSBvZiB0aGUgdGVtcGxhdGUKICAgKiBpcyBzdGFtcGVkIGZvciBlYWNoIGl0ZW0gaW50byB0aGUgRE9NIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgYGRvbS1yZXBlYXRgCiAgICogZWxlbWVudC4gIFRoZSBgaXRlbWAgcHJvcGVydHkgd2lsbCBiZSBzZXQgb24gZWFjaCBpbnN0YW5jZSdzIGJpbmRpbmcKICAgKiBzY29wZSwgdGh1cyB0ZW1wbGF0ZXMgc2hvdWxkIGJpbmQgdG8gc3ViLXByb3BlcnRpZXMgb2YgYGl0ZW1gLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYGh0bWwKICAgKiA8ZG9tLW1vZHVsZSBpZD0iZW1wbG95ZWUtbGlzdCI+CiAgICoKICAgKiAgIDx0ZW1wbGF0ZT4KICAgKgogICAqICAgICA8ZGl2PiBFbXBsb3llZSBsaXN0OiA8L2Rpdj4KICAgKiAgICAgPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBXaXRoIHRoZSBmb2xsb3dpbmcgY3VzdG9tIGVsZW1lbnQgZGVmaW5pdGlvbjoKICAgKgogICAqIGBgYGpzCiAgICogY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZW1wbG95ZWUtbGlzdCc7IH0KICAgKiAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgKiAgICAgcmV0dXJuIHsKICAgKiAgICAgICBlbXBsb3llZXM6IHsKICAgKiAgICAgICAgIHZhbHVlKCkgewogICAqICAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAgIHtmaXJzdDogJ0JvYicsIGxhc3Q6ICdTbWl0aCd9LAogICAqICAgICAgICAgICAgIHtmaXJzdDogJ1NhbGx5JywgbGFzdDogJ0pvaG5zb24nfSwKICAgKiAgICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICAgXTsKICAgKiAgICAgICAgIH0KICAgKiAgICAgICB9CiAgICogICAgIH07CiAgICogICB9CiAgICogfQogICAqIGBgYAogICAqCiAgICogTm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlcyB0byBpdGVtcyBzdWItcHJvcGVydGllcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0ZW1wbGF0ZQogICAqIGluc3RhbmNlcywgd2hpY2ggd2lsbCB1cGRhdGUgdmlhIHRoZSBub3JtYWwgc3RydWN0dXJlZCBkYXRhIG5vdGlmaWNhdGlvbiBzeXN0ZW0uCiAgICoKICAgKiBNdXRhdGlvbnMgdG8gdGhlIGBpdGVtc2AgYXJyYXkgaXRzZWxmIHNob3VsZCBiZSBtYWRlIHVzaW5nIHRoZSBBcnJheQogICAqIG11dGF0aW9uIEFQSSdzIG9uIGBQb2x5bWVyLkJhc2VgIChgcHVzaGAsIGBwb3BgLCBgc3BsaWNlYCwgYHNoaWZ0YCwKICAgKiBgdW5zaGlmdGApLCBhbmQgdGVtcGxhdGUgaW5zdGFuY2VzIHdpbGwgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGRhdGEgaW4gdGhlCiAgICogYXJyYXkuCiAgICoKICAgKiBFdmVudHMgY2F1Z2h0IGJ5IGV2ZW50IGhhbmRsZXJzIHdpdGhpbiB0aGUgYGRvbS1yZXBlYXRgIHRlbXBsYXRlIHdpbGwgYmUKICAgKiBkZWNvcmF0ZWQgd2l0aCBhIGBtb2RlbGAgcHJvcGVydHksIHdoaWNoIHJlcHJlc2VudHMgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICogZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZS4gIFRoZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBQb2x5bWVyLkJhc2UsIGFuZCBzaG91bGQKICAgKiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgZGF0YSBvbiB0aGUgaW5zdGFuY2UsIGZvciBleGFtcGxlCiAgICogYGV2ZW50Lm1vZGVsLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7YC4KICAgKgogICAqIEFsdGVybmF0aXZlbHksIHRoZSBtb2RlbCBmb3IgYSB0ZW1wbGF0ZSBpbnN0YW5jZSBmb3IgYW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICogYSBgZG9tLXJlcGVhdGAgY2FuIGJlIG9idGFpbmVkIHVzaW5nIHRoZSBgbW9kZWxGb3JFbGVtZW50YCBBUEkgb24gdGhlCiAgICogYGRvbS1yZXBlYXRgIHRoYXQgc3RhbXBlZCBpdCwgZm9yIGV4YW1wbGUKICAgKiBgdGhpcy4kLmRvbVJlcGVhdC5tb2RlbEZvckVsZW1lbnQoZXZlbnQudGFyZ2V0KS5zZXQoJ2l0ZW0uY2hlY2tlZCcsIHRydWUpO2AuCiAgICogVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBtYW5pcHVsYXRpbmcgaW5zdGFuY2UgZGF0YSBvZiBldmVudCB0YXJnZXRzIG9idGFpbmVkCiAgICogYnkgZXZlbnQgaGFuZGxlcnMgb24gcGFyZW50cyBvZiB0aGUgYGRvbS1yZXBlYXRgIChldmVudCBkZWxlZ2F0aW9uKS4KICAgKgogICAqIEEgdmlldy1zcGVjaWZpYyBmaWx0ZXIvc29ydCBtYXkgYmUgYXBwbGllZCB0byBlYWNoIGBkb20tcmVwZWF0YCBieSBzdXBwbHlpbmcgYQogICAqIGBmaWx0ZXJgIGFuZC9vciBgc29ydGAgcHJvcGVydHkuICBUaGlzIG1heSBiZSBhIHN0cmluZyB0aGF0IG5hbWVzIGEgZnVuY3Rpb24gb24KICAgKiB0aGUgaG9zdCwgb3IgYSBmdW5jdGlvbiBtYXkgYmUgYXNzaWduZWQgdG8gdGhlIHByb3BlcnR5IGRpcmVjdGx5LiAgVGhlIGZ1bmN0aW9ucwogICAqIHNob3VsZCBpbXBsZW1lbnRlZCBmb2xsb3dpbmcgdGhlIHN0YW5kYXJkIGBBcnJheWAgZmlsdGVyL3NvcnQgQVBJLgogICAqCiAgICogSW4gb3JkZXIgdG8gcmUtcnVuIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbnMgYmFzZWQgb24gY2hhbmdlcyB0byBzdWItZmllbGRzCiAgICogb2YgYGl0ZW1zYCwgdGhlIGBvYnNlcnZlYCBwcm9wZXJ0eSBtYXkgYmUgc2V0IGFzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YKICAgKiBgaXRlbWAgc3ViLWZpZWxkcyB0aGF0IHNob3VsZCBjYXVzZSBhIHJlLWZpbHRlci9zb3J0IHdoZW4gbW9kaWZpZWQuICBJZgogICAqIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbiBkZXBlbmRzIG9uIHByb3BlcnRpZXMgbm90IGNvbnRhaW5lZCBpbiBgaXRlbXNgLAogICAqIHRoZSB1c2VyIHNob3VsZCBvYnNlcnZlIGNoYW5nZXMgdG8gdGhvc2UgcHJvcGVydGllcyBhbmQgY2FsbCBgcmVuZGVyYCB0byB1cGRhdGUKICAgKiB0aGUgdmlldyBiYXNlZCBvbiB0aGUgZGVwZW5kZW5jeSBjaGFuZ2UuCiAgICoKICAgKiBGb3IgZXhhbXBsZSwgZm9yIGFuIGBkb20tcmVwZWF0YCB3aXRoIGEgZmlsdGVyIG9mIHRoZSBmb2xsb3dpbmc6CiAgICoKICAgKiBgYGBqcwogICAqIGlzRW5naW5lZXIoaXRlbSkgewogICAqICAgcmV0dXJuIGl0ZW0udHlwZSA9PSAnZW5naW5lZXInIHx8IGl0ZW0ubWFuYWdlci50eXBlID09ICdlbmdpbmVlcic7CiAgICogfQogICAqIGBgYAogICAqCiAgICogVGhlbiB0aGUgYG9ic2VydmVgIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmVkIGFzIGZvbGxvd3M6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIGZpbHRlcj0iaXNFbmdpbmVlciIgb2JzZXJ2ZT0idHlwZSBtYW5hZ2VyLnR5cGUiPgogICAqIGBgYAogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGV4dGVuZHMge2RvbVJlcGVhdEJhc2V9CiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3Igc3RhbXBpbmcgaW5zdGFuY2Ugb2YgYSB0ZW1wbGF0ZSBib3VuZCB0bwogICAqICAgaXRlbXMgaW4gYW4gYXJyYXkuCiAgICovCiAgY2xhc3MgRG9tUmVwZWF0IGV4dGVuZHMgZG9tUmVwZWF0QmFzZSB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLXJlcGVhdCc7IH0KCiAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgeyByZXR1cm4gbnVsbDsgfQoKICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuZXZlciBET00gaXMgYWRkZWQgb3IgcmVtb3ZlZCBieSB0aGlzIHRlbXBsYXRlIChieQogICAgICAgKiBkZWZhdWx0LCByZW5kZXJpbmcgb2NjdXJzIGxhemlseSkuICBUbyBmb3JjZSBpbW1lZGlhdGUgcmVuZGVyaW5nLCBjYWxsCiAgICAgICAqIGByZW5kZXJgLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgZG9tLWNoYW5nZQogICAgICAgKi8KICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyBpdGVtcyBkZXRlcm1pbmluZyBob3cgbWFueSBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlCiAgICAgICAgICogdG8gc3RhbXAgYW5kIHRoYXQgdGhhdCBlYWNoIHRlbXBsYXRlIGluc3RhbmNlIHNob3VsZCBiaW5kIHRvLgogICAgICAgICAqLwogICAgICAgIGl0ZW1zOiB7CiAgICAgICAgICB0eXBlOiBBcnJheQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBhZGQgdG8gdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBhcnJheQogICAgICAgICAqIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgYXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbScKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIHdpdGggdGhlIGluZGV4CiAgICAgICAgICogb2YgdGhlIGluc3RhbmNlIGluIHRoZSBzb3J0ZWQgYW5kIGZpbHRlcmVkIGxpc3Qgb2YgcmVuZGVyZWQgaXRlbXMuCiAgICAgICAgICogTm90ZSwgZm9yIHRoZSBpbmRleCBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LCB1c2UgdGhlIHZhbHVlIG9mIHRoZQogICAgICAgICAqIGBpdGVtc0luZGV4QXNgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIGluZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaW5kZXgnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGFkZCB0byB0aGUgYmluZGluZyBzY29wZSB3aXRoIHRoZSBpbmRleAogICAgICAgICAqIG9mIHRoZSBpbnN0YW5jZSBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LiBOb3RlLCBmb3IgdGhlIGluZGV4IG9mCiAgICAgICAgICogdGhpcyBpbnN0YW5jZSBpbiB0aGUgc29ydGVkIGFuZCBmaWx0ZXJlZCBsaXN0IG9mIHJlbmRlcmVkIGl0ZW1zLAogICAgICAgICAqIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGBpbmRleEFzYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBpdGVtc0luZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbXNJbmRleCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGRldGVybWluZSB0aGUgc29ydCBvcmRlciBvZiB0aGUgaXRlbXMuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LnNvcnRgLgogICAgICAgICAqIFVzaW5nIGEgc29ydCBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSB1bmRlcmx5aW5nIGBpdGVtc2AgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgc29ydDogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fc29ydENoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBpdGVtcyBvdXQgb2YgdGhlIHZpZXcuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LmZpbHRlcmAuCiAgICAgICAgICogVXNpbmcgYSBmaWx0ZXIgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgdW5kZXJseWluZyBgaXRlbXNgIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGZpbHRlcjogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fZmlsdGVyQ2hhbmdlZCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHVzaW5nIGEgYGZpbHRlcmAgb3IgYHNvcnRgIGZ1bmN0aW9uLCB0aGUgYG9ic2VydmVgIHByb3BlcnR5CiAgICAgICAgICogc2hvdWxkIGJlIHNldCB0byBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiBpdGVtCiAgICAgICAgICogc3ViLWZpZWxkcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgcmUtc29ydCBvciByZS1maWx0ZXIgd2hlbiBjaGFuZ2VkLgogICAgICAgICAqIFRoZXNlIHNob3VsZCBnZW5lcmFsbHkgYmUgZmllbGRzIG9mIGBpdGVtYCB0aGF0IHRoZSBzb3J0IG9yIGZpbHRlcgogICAgICAgICAqIGZ1bmN0aW9uIGRlcGVuZHMgb24uCiAgICAgICAgICovCiAgICAgICAgb2JzZXJ2ZTogewogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX29ic2VydmVDaGFuZ2VkJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gdXNpbmcgYSBgZmlsdGVyYCBvciBgc29ydGAgZnVuY3Rpb24sIHRoZSBgZGVsYXlgIHByb3BlcnR5CiAgICAgICAgICogZGV0ZXJtaW5lcyBhIGRlYm91bmNlIHRpbWUgaW4gbXMgYWZ0ZXIgYSBjaGFuZ2UgdG8gb2JzZXJ2ZWQgaXRlbQogICAgICAgICAqIHByb3BlcnRpZXMgdGhhdCBtdXN0IHBhc3MgYmVmb3JlIHRoZSBmaWx0ZXIgb3Igc29ydCBpcyByZS1ydW4uCiAgICAgICAgICogVGhpcyBpcyB1c2VmdWwgaW4gcmF0ZS1saW1pdGluZyBzaHVmZmxpbmcgb2YgdGhlIHZpZXcgd2hlbgogICAgICAgICAqIGl0ZW0gY2hhbmdlcyBtYXkgYmUgZnJlcXVlbnQuCiAgICAgICAgICovCiAgICAgICAgZGVsYXk6IE51bWJlciwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnQgb2YgY3VycmVudGx5IHJlbmRlcmVkIGl0ZW1zIGFmdGVyIGBmaWx0ZXJgIChpZiBhbnkpIGhhcyBiZWVuIGFwcGxpZWQuCiAgICAgICAgICogSWYgImNodW5raW5nIG1vZGUiIGlzIGVuYWJsZWQsIGByZW5kZXJlZEl0ZW1Db3VudGAgaXMgdXBkYXRlZCBlYWNoIHRpbWUgYQogICAgICAgICAqIHNldCBvZiB0ZW1wbGF0ZSBpbnN0YW5jZXMgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICByZW5kZXJlZEl0ZW1Db3VudDogewogICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgcmVhZE9ubHk6IHRydWUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGFuIGluaXRpYWwgY291bnQgb2YgdGVtcGxhdGUgaW5zdGFuY2VzIHRvIHJlbmRlciBhZnRlciBzZXR0aW5nCiAgICAgICAgICogdGhlIGBpdGVtc2AgYXJyYXksIGJlZm9yZSB0aGUgbmV4dCBwYWludCwgYW5kIHB1dHMgdGhlIGBkb20tcmVwZWF0YAogICAgICAgICAqIGludG8gImNodW5raW5nIG1vZGUiLiAgVGhlIHJlbWFpbmluZyBpdGVtcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJlbmRlcmVkCiAgICAgICAgICogaW5jcmVtZW50YWxseSBhdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSB0aGVyb2YgdW50aWwgYWxsIGluc3RhbmNlcyBoYXZlCiAgICAgICAgICogYmVlbiByZW5kZXJlZC4KICAgICAgICAgKi8KICAgICAgICBpbml0aWFsQ291bnQ6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIG9ic2VydmVyOiAnX19pbml0aWFsaXplQ2h1bmtpbmcnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBgaW5pdGlhbENvdW50YCBpcyB1c2VkLCB0aGlzIHByb3BlcnR5IGRlZmluZXMgYSBmcmFtZSByYXRlIChpbgogICAgICAgICAqIGZwcykgdG8gdGFyZ2V0IGJ5IHRocm90dGxpbmcgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgcmVuZGVyZWQgZWFjaAogICAgICAgICAqIGZyYW1lIHRvIG5vdCBleGNlZWQgdGhlIGJ1ZGdldCBmb3IgdGhlIHRhcmdldCBmcmFtZSByYXRlLiAgVGhlCiAgICAgICAgICogZnJhbWVyYXRlIGlzIGVmZmVjdGl2ZWx5IHRoZSBudW1iZXIgb2YgYHJlcXVlc3RBbmltYXRpb25GcmFtZWBzIHRoYXQKICAgICAgICAgKiBpdCB0cmllcyB0byBhbGxvdyB0byBhY3R1YWxseSBmaXJlIGluIGEgZ2l2ZW4gc2Vjb25kLiBJdCBkb2VzIHRoaXMKICAgICAgICAgKiBieSBtZWFzdXJpbmcgdGhlIHRpbWUgYmV0d2VlbiBgckFGYHMgYW5kIGNvbnRpbnVvdXNseSBhZGp1c3RpbmcgdGhlCiAgICAgICAgICogbnVtYmVyIG9mIGl0ZW1zIGNyZWF0ZWQgZWFjaCBgckFGYCB0byBtYWludGFpbiB0aGUgdGFyZ2V0IGZyYW1lcmF0ZS4KICAgICAgICAgKiBTZXR0aW5nIHRoaXMgdG8gYSBoaWdoZXIgbnVtYmVyIGFsbG93cyBsb3dlciBsYXRlbmN5IGFuZCBoaWdoZXIKICAgICAgICAgKiB0aHJvdWdocHV0IGZvciBldmVudCBoYW5kbGVycyBhbmQgb3RoZXIgdGFza3MsIGJ1dCByZXN1bHRzIGluIGEKICAgICAgICAgKiBsb25nZXIgdGltZSBmb3IgdGhlIHJlbWFpbmluZyBpdGVtcyB0byBjb21wbGV0ZSByZW5kZXJpbmcuCiAgICAgICAgICovCiAgICAgICAgdGFyZ2V0RnJhbWVyYXRlOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICB2YWx1ZTogMjAKICAgICAgICB9LAoKICAgICAgICBfdGFyZ2V0RnJhbWVUaW1lOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICBjb21wdXRlZDogJ19fY29tcHV0ZUZyYW1lVGltZSh0YXJnZXRGcmFtZXJhdGUpJwogICAgICAgIH0KCiAgICAgIH07CgogICAgfQoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICByZXR1cm4gWyAnX19pdGVtc0NoYW5nZWQoaXRlbXMuKiknIF07CiAgICB9CgogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuX19pbnN0YW5jZXMgPSBbXTsKICAgICAgdGhpcy5fX2xpbWl0ID0gSW5maW5pdHk7CiAgICAgIHRoaXMuX19wb29sID0gW107CiAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBudWxsOwogICAgICB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHggPSB7fTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBudWxsOwogICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IG51bGw7CiAgICAgIHRoaXMuX19zb3J0Rm4gPSBudWxsOwogICAgICB0aGlzLl9fZmlsdGVyRm4gPSBudWxsOwogICAgICB0aGlzLl9fb2JzZXJ2ZVBhdGhzID0gbnVsbDsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IHRydWU7CiAgICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuX19pc0RldGFjaGVkID0gdHJ1ZTsKICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzLl9fZGV0YWNoSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIC8vIG9ubHkgcGVyZm9ybSBhdHRhY2htZW50IGlmIHRoZSBlbGVtZW50IHdhcyBwcmV2aW91c2x5IGRldGFjaGVkLgogICAgICBpZiAodGhpcy5fX2lzRGV0YWNoZWQpIHsKICAgICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IGZhbHNlOwogICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuX19hdHRhY2hJbnN0YW5jZShpLCBwYXJlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlVGVtcGxhdGl6ZWQoKSB7CiAgICAgIC8vIFRlbXBsYXRpemluZyAoZ2VuZXJhdGluZyB0aGUgaW5zdGFuY2UgY29uc3RydWN0b3IpIG5lZWRzIHRvIHdhaXQKICAgICAgLy8gdW50aWwgcmVhZHksIHNpbmNlIHdvbid0IGhhdmUgaXRzIHRlbXBsYXRlIGNvbnRlbnQgaGFuZGVkIGJhY2sgdG8KICAgICAgLy8gaXQgdW50aWwgdGhlbgogICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAvLyAvLyBXYWl0IHVudGlsIGNoaWxkTGlzdCBjaGFuZ2VzIGFuZCB0ZW1wbGF0ZSBzaG91bGQgYmUgdGhlcmUgYnkgdGhlbgogICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgIHRoaXMuX19yZW5kZXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RvbS1yZXBlYXQgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIFRlbXBsYXRlIGluc3RhbmNlIHByb3BzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gZm9yd2FyZGluZwogICAgICAgIGxldCBpbnN0YW5jZVByb3BzID0ge307CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmFzXSA9IHRydWU7CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmluZGV4QXNdID0gdHJ1ZTsKICAgICAgICBpbnN0YW5jZVByb3BzW3RoaXMuaXRlbXNJbmRleEFzXSA9IHRydWU7CiAgICAgICAgdGhpcy5fX2N0b3IgPSBQb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgdGhpcywgewogICAgICAgICAgbXV0YWJsZURhdGE6IHRoaXMubXV0YWJsZURhdGEsCiAgICAgICAgICBwYXJlbnRNb2RlbDogdHJ1ZSwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IGluc3RhbmNlUHJvcHMsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gc2V0CiAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCBwcm9wZXJ0eSB0bwogICAgICAgICAgICovCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7CiAgICAgICAgICAgIGxldCBpJCA9IHRoaXMuX19pbnN0YW5jZXM7CiAgICAgICAgICAgIGZvciAobGV0IGk9MCwgaW5zdDsgKGk8aSQubGVuZ3RoKSAmJiAoaW5zdD1pJFtpXSk7IGkrKykgewogICAgICAgICAgICAgIGluc3QuZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8qKgogICAgICAgICAgICogQHRoaXMge3RoaXN9CiAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5zdCBJbnN0YW5jZSB0byBub3RpZnkKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IHRvIG5vdGlmeQogICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBub3RpZnkKICAgICAgICAgICAqLwogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiBmdW5jdGlvbihpbnN0LCBwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICBpZiAoUG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcywgcHJvcCkpIHsKICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5zdFt0aGlzLml0ZW1zSW5kZXhBc107CiAgICAgICAgICAgICAgaWYgKHByb3AgPT0gdGhpcy5hcykgewogICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpZHhdID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxldCBwYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZSh0aGlzLmFzLCAnaXRlbXMuJyArIGlkeCwgcHJvcCk7CiAgICAgICAgICAgICAgdGhpcy5ub3RpZnlQYXRoKHBhdGgsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIF9fZ2V0TWV0aG9kSG9zdCgpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICByZXR1cm4gdGhpcy5fX2RhdGFIb3N0Ll9tZXRob2RIb3N0IHx8IHRoaXMuX19kYXRhSG9zdDsKICAgIH0KCiAgICBfX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUoZnVuY3Rpb25Pck1ldGhvZE5hbWUpIHsKICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbk9yTWV0aG9kTmFtZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICBsZXQgbWV0aG9kTmFtZSA9IGZ1bmN0aW9uT3JNZXRob2ROYW1lOwogICAgICAgIGxldCBvYmogPSB0aGlzLl9fZ2V0TWV0aG9kSG9zdCgpOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIG9ialttZXRob2ROYW1lXS5hcHBseShvYmosIGFyZ3VtZW50cyk7IH07CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbk9yTWV0aG9kTmFtZTsKICAgIH0KCiAgICBfX3NvcnRDaGFuZ2VkKHNvcnQpIHsKICAgICAgdGhpcy5fX3NvcnRGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKHNvcnQpOwogICAgICBpZiAodGhpcy5pdGVtcykgeyB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7IH0KICAgIH0KCiAgICBfX2ZpbHRlckNoYW5nZWQoZmlsdGVyKSB7CiAgICAgIHRoaXMuX19maWx0ZXJGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKGZpbHRlcik7CiAgICAgIGlmICh0aGlzLml0ZW1zKSB7IHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsgfQogICAgfQoKICAgIF9fY29tcHV0ZUZyYW1lVGltZShyYXRlKSB7CiAgICAgIHJldHVybiBNYXRoLmNlaWwoMTAwMC9yYXRlKTsKICAgIH0KCiAgICBfX2luaXRpYWxpemVDaHVua2luZygpIHsKICAgICAgaWYgKHRoaXMuaW5pdGlhbENvdW50KSB7CiAgICAgICAgdGhpcy5fX2xpbWl0ID0gdGhpcy5pbml0aWFsQ291bnQ7CiAgICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSB0aGlzLmluaXRpYWxDb3VudDsKICAgICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICB9CgogICAgX190cnlSZW5kZXJDaHVuaygpIHsKICAgICAgLy8gRGVib3VuY2VkIHNvIHRoYXQgbXVsdGlwbGUgY2FsbHMgdGhyb3VnaCBgX3JlbmRlcmAgYmV0d2VlbiBhbmltYXRpb24KICAgICAgLy8gZnJhbWVzIG9ubHkgcXVldWUgb25lIG5ldyByQUYgKGUuZy4gYXJyYXkgbXV0YXRpb24gJiBjaHVua2VkIHJlbmRlcikKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5fX2xpbWl0IDwgdGhpcy5pdGVtcy5sZW5ndGgpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlcXVlc3RSZW5kZXJDaHVuayk7CiAgICAgIH0KICAgIH0KCiAgICBfX3JlcXVlc3RSZW5kZXJDaHVuaygpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9fcmVuZGVyQ2h1bmsoKSk7CiAgICB9CgogICAgX19yZW5kZXJDaHVuaygpIHsKICAgICAgLy8gU2ltcGxlIGF1dG8gY2h1bmtTaXplIHRocm90dGxpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIGZlZWRiYWNrIGxvb3A6CiAgICAgIC8vIG1lYXN1cmUgYWN0dWFsIHRpbWUgYmV0d2VlbiBmcmFtZXMgYW5kIHNjYWxlIGNodW5rIGNvdW50IGJ5IHJhdGlvCiAgICAgIC8vIG9mIHRhcmdldC9hY3R1YWwgZnJhbWUgdGltZQogICAgICBsZXQgY3VyckNodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICBsZXQgcmF0aW8gPSB0aGlzLl90YXJnZXRGcmFtZVRpbWUgLyAoY3VyckNodW5rVGltZSAtIHRoaXMuX19sYXN0Q2h1bmtUaW1lKTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBNYXRoLnJvdW5kKHRoaXMuX19jaHVua0NvdW50ICogcmF0aW8pIHx8IDE7CiAgICAgIHRoaXMuX19saW1pdCArPSB0aGlzLl9fY2h1bmtDb3VudDsKICAgICAgdGhpcy5fX2xhc3RDaHVua1RpbWUgPSBjdXJyQ2h1bmtUaW1lOwogICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7CiAgICB9CgogICAgX19vYnNlcnZlQ2hhbmdlZCgpIHsKICAgICAgdGhpcy5fX29ic2VydmVQYXRocyA9IHRoaXMub2JzZXJ2ZSAmJgogICAgICAgIHRoaXMub2JzZXJ2ZS5yZXBsYWNlKCcuKicsICcuJykuc3BsaXQoJyAnKTsKICAgIH0KCiAgICBfX2l0ZW1zQ2hhbmdlZChjaGFuZ2UpIHsKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5pdGVtcykpIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2RvbS1yZXBlYXQgZXhwZWN0ZWQgYXJyYXkgZm9yIGBpdGVtc2AsIGZvdW5kJywgdGhpcy5pdGVtcyk7CiAgICAgIH0KICAgICAgLy8gSWYgcGF0aCB3YXMgdG8gYW4gaXRlbSAoZS5nLiAnaXRlbXMuMycgb3IgJ2l0ZW1zLjMuZm9vJyksIGZvcndhcmQgdGhlCiAgICAgIC8vIHBhdGggdG8gdGhhdCBpbnN0YW5jZSBzeW5jaHJvbm91c2x5IChyZXR1cm5zIGZhbHNlIGZvciBub24taXRlbSBwYXRocykKICAgICAgaWYgKCF0aGlzLl9faGFuZGxlSXRlbVBhdGgoY2hhbmdlLnBhdGgsIGNoYW5nZS52YWx1ZSkpIHsKICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBhcnJheSB3YXMgcmVzZXQgKCdpdGVtcycpIG9yIHNwbGljZWQgKCdpdGVtcy5zcGxpY2VzJyksCiAgICAgICAgLy8gc28gcXVldWUgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZUNodW5raW5nKCk7CiAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOwogICAgICB9CiAgICB9CgogICAgX19oYW5kbGVPYnNlcnZlZFBhdGhzKHBhdGgpIHsKICAgICAgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIHBhdGggY2hhbmdlcyBzaG91bGQgY2F1c2UgYSByZS1zb3J0L2ZpbHRlcgogICAgICBpZiAodGhpcy5fX3NvcnRGbiB8fCB0aGlzLl9fZmlsdGVyRm4pIHsKICAgICAgICBpZiAoIXBhdGgpIHsKICAgICAgICAgIC8vIEFsd2F5cyByZS1yZW5kZXIgaWYgdGhlIGl0ZW0gaXRzZWxmIGNoYW5nZWQKICAgICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLCB0aGlzLmRlbGF5KTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYnNlcnZlUGF0aHMpIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmUtcmVuZGVyIGlmIHRoZSBwYXRoIGNoYW5nZWQgbWF0Y2hlcyBhbiBvYnNlcnZlZCBwYXRoCiAgICAgICAgICBsZXQgcGF0aHMgPSB0aGlzLl9fb2JzZXJ2ZVBhdGhzOwogICAgICAgICAgZm9yIChsZXQgaT0wOyBpPHBhdGhzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YocGF0aHNbaV0pID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIsIHRoaXMuZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHRoaXM6RG9tUmVwZWF0KX0gZm4gRnVuY3Rpb24gdG8gZGVib3VuY2UuCiAgICAgKiBAcGFyYW0ge251bWJlcj19IGRlbGF5IERlbGF5IGluIG1zIHRvIGRlYm91bmNlIGJ5LgogICAgICovCiAgICBfX2RlYm91bmNlUmVuZGVyKGZuLCBkZWxheSA9IDApIHsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIGRlbGF5ID4gMCA/IFBvbHltZXIuQXN5bmMudGltZU91dC5hZnRlcihkZWxheSkgOiBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzawogICAgICAgICAgLCBmbi5iaW5kKHRoaXMpKTsKICAgICAgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIpOwogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIC8vIFF1ZXVlIHRoaXMgcmVwZWF0ZXIsIHRoZW4gZmx1c2ggYWxsIGluIG9yZGVyCiAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsKICAgICAgUG9seW1lci5mbHVzaCgpOwogICAgfQoKICAgIF9fcmVuZGVyKCkgewogICAgICBpZiAoIXRoaXMuX19lbnN1cmVUZW1wbGF0aXplZCgpKSB7CiAgICAgICAgLy8gTm8gdGVtcGxhdGUgZm91bmQgeWV0CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX19hcHBseUZ1bGxSZWZyZXNoKCk7CiAgICAgIC8vIFJlc2V0IHRoZSBwb29sCiAgICAgIC8vIFRPRE8oa3NjaGFhZik6IFJldXNlIHBvb2wgYWNyb3NzIHR1cm5zIGFuZCBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgIC8vIE5vdyB0aGF0IG9iamVjdHMvYXJyYXlzIGFyZSByZS1ldmFsdWF0ZWQgd2hlbiBzZXQsIHdlIGNhbiBzYWZlbHkKICAgICAgLy8gcmV1c2UgcG9vbGVkIGluc3RhbmNlcyBhY3Jvc3MgdHVybnMsIGhvd2V2ZXIgd2Ugc3RpbGwgbmVlZCB0byBkZWNpZGUKICAgICAgLy8gc2VtYW50aWNzIHJlZ2FyZGluZyBob3cgbG9uZyB0byBob2xkLCBob3cgbWFueSB0byBob2xkLCBldGMuCiAgICAgIHRoaXMuX19wb29sLmxlbmd0aCA9IDA7CiAgICAgIC8vIFNldCByZW5kZXJlZCBpdGVtIGNvdW50CiAgICAgIHRoaXMuX3NldFJlbmRlcmVkSXRlbUNvdW50KHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoKTsKICAgICAgLy8gTm90aWZ5IHVzZXJzCiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmRlciBtb3JlIGl0ZW1zCiAgICAgIHRoaXMuX190cnlSZW5kZXJDaHVuaygpOwogICAgfQoKICAgIF9fYXBwbHlGdWxsUmVmcmVzaCgpIHsKICAgICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcyB8fCBbXTsKICAgICAgbGV0IGlzbnRJZHhUb0l0ZW1zSWR4ID0gbmV3IEFycmF5KGl0ZW1zLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlzbnRJZHhUb0l0ZW1zSWR4W2ldID0gaTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIGZpbHRlcgogICAgICBpZiAodGhpcy5fX2ZpbHRlckZuKSB7CiAgICAgICAgaXNudElkeFRvSXRlbXNJZHggPSBpc250SWR4VG9JdGVtc0lkeC5maWx0ZXIoKGksIGlkeCwgYXJyYXkpID0+CiAgICAgICAgICB0aGlzLl9fZmlsdGVyRm4oaXRlbXNbaV0sIGlkeCwgYXJyYXkpKTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIHNvcnQKICAgICAgaWYgKHRoaXMuX19zb3J0Rm4pIHsKICAgICAgICBpc250SWR4VG9JdGVtc0lkeC5zb3J0KChhLCBiKSA9PiB0aGlzLl9fc29ydEZuKGl0ZW1zW2FdLCBpdGVtc1tiXSkpOwogICAgICB9CiAgICAgIC8vIGl0ZW1zLT5pbnN0IG1hcCBrZXB0IGZvciBpdGVtIHBhdGggZm9yd2FyZGluZwogICAgICBjb25zdCBpdGVtc0lkeFRvSW5zdElkeCA9IHRoaXMuX19pdGVtc0lkeFRvSW5zdElkeCA9IHt9OwogICAgICBsZXQgaW5zdElkeCA9IDA7CiAgICAgIC8vIEdlbmVyYXRlIGluc3RhbmNlcyBhbmQgYXNzaWduIGl0ZW1zCiAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oaXNudElkeFRvSXRlbXNJZHgubGVuZ3RoLCB0aGlzLl9fbGltaXQpOwogICAgICBmb3IgKDsgaW5zdElkeDxsaW1pdDsgaW5zdElkeCsrKSB7CiAgICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2luc3RJZHhdOwogICAgICAgIGxldCBpdGVtSWR4ID0gaXNudElkeFRvSXRlbXNJZHhbaW5zdElkeF07CiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpdGVtSWR4XTsKICAgICAgICBpdGVtc0lkeFRvSW5zdElkeFtpdGVtSWR4XSA9IGluc3RJZHg7CiAgICAgICAgaWYgKGluc3QpIHsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmFzLCBpdGVtKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmluZGV4QXMsIGluc3RJZHgpOwogICAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICAgIGluc3QuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9faW5zZXJ0SW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgaW5zdGFuY2VzIGZyb20gcHJldmlvdXMgc3RhdGUKICAgICAgZm9yIChsZXQgaT10aGlzLl9faW5zdGFuY2VzLmxlbmd0aC0xOyBpPj1pbnN0SWR4OyBpLS0pIHsKICAgICAgICB0aGlzLl9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICBfX2RldGFjaEluc3RhbmNlKGlkeCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgZm9yIChsZXQgaT0wOyBpPGluc3QuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZWwgPSBpbnN0LmNoaWxkcmVuW2ldOwogICAgICAgIGluc3Qucm9vdC5hcHBlbmRDaGlsZChlbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluc3Q7CiAgICB9CgogICAgX19hdHRhY2hJbnN0YW5jZShpZHgsIHBhcmVudCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShpbnN0LnJvb3QsIHRoaXMpOwogICAgfQoKICAgIF9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaWR4KSB7CiAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2RldGFjaEluc3RhbmNlKGlkeCk7CiAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgdGhpcy5fX3Bvb2wucHVzaChpbnN0KTsKICAgICAgfQogICAgICB0aGlzLl9faW5zdGFuY2VzLnNwbGljZShpZHgsIDEpOwogICAgfQoKICAgIF9fc3RhbXBJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KSB7CiAgICAgIGxldCBtb2RlbCA9IHt9OwogICAgICBtb2RlbFt0aGlzLmFzXSA9IGl0ZW07CiAgICAgIG1vZGVsW3RoaXMuaW5kZXhBc10gPSBpbnN0SWR4OwogICAgICBtb2RlbFt0aGlzLml0ZW1zSW5kZXhBc10gPSBpdGVtSWR4OwogICAgICByZXR1cm4gbmV3IHRoaXMuX19jdG9yKG1vZGVsKTsKICAgIH0KCiAgICBfX2luc2VydEluc3RhbmNlKGl0ZW0sIGluc3RJZHgsIGl0ZW1JZHgpIHsKICAgICAgbGV0IGluc3QgPSB0aGlzLl9fcG9vbC5wb3AoKTsKICAgICAgaWYgKGluc3QpIHsKICAgICAgICAvLyBUT0RPKGtzY2hhYWYpOiBJZiB0aGUgcG9vbCBpcyBzaGFyZWQgYWNyb3NzIHR1cm5zLCBob3N0UHJvcHMKICAgICAgICAvLyBuZWVkIHRvIGJlIHJlLXNldCB0byByZXVzZWQgaW5zdGFuY2VzIGluIGFkZGl0aW9uIHRvIGl0ZW0KICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5hcywgaXRlbSk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaW5kZXhBcywgaW5zdElkeCk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnN0ID0gdGhpcy5fX3N0YW1wSW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgIH0KICAgICAgbGV0IGJlZm9yZVJvdyA9IHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeCArIDFdOwogICAgICBsZXQgYmVmb3JlTm9kZSA9IGJlZm9yZVJvdyA/IGJlZm9yZVJvdy5jaGlsZHJlblswXSA6IHRoaXM7CiAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaW5zdC5yb290LCBiZWZvcmVOb2RlKTsKICAgICAgdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XSA9IGluc3Q7CiAgICAgIHJldHVybiBpbnN0OwogICAgfQoKICAgIC8vIEltcGxlbWVudHMgZXh0ZW5zaW9uIHBvaW50IGZyb20gVGVtcGxhdGl6ZSBtaXhpbgogICAgLyoqCiAgICAgKiBTaG93cyBvciBoaWRlcyB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdG9wIGxldmVsIGNoaWxkIGVsZW1lbnRzLiBGb3IKICAgICAqIHRleHQgbm9kZXMsIGB0ZXh0Q29udGVudGAgaXMgcmVtb3ZlZCB3aGlsZSAiaGlkZGVuIiBhbmQgcmVwbGFjZWQgd2hlbgogICAgICogInNob3duLiIKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGlkZGVuIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICogc2V0IHRvIGZhbHNlIHRvIHNob3cgdGhlbS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG93SGlkZUNoaWxkcmVuKGhpZGRlbikgewogICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHRoaXMuX19pbnN0YW5jZXNbaV0uX3Nob3dIaWRlQ2hpbGRyZW4oaGlkZGVuKTsKICAgICAgfQogICAgfQoKICAgIC8vIENhbGxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgaG9zdCBpdGVtcy48a2V5Pi48cGF0aD4gcGF0aCBjaGFuZ2UsCiAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90aWZ5aW5nIGl0ZW0uPHBhdGg+IGNoYW5nZXMgdG8gaW5zdCBmb3Iga2V5CiAgICBfX2hhbmRsZUl0ZW1QYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgIGxldCBpdGVtc1BhdGggPSBwYXRoLnNsaWNlKDYpOyAvLyAnaXRlbXMuJy5sZW5ndGggPT0gNgogICAgICBsZXQgZG90ID0gaXRlbXNQYXRoLmluZGV4T2YoJy4nKTsKICAgICAgbGV0IGl0ZW1zSWR4ID0gZG90IDwgMCA/IGl0ZW1zUGF0aCA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoMCwgZG90KTsKICAgICAgLy8gSWYgcGF0aCB3YXMgaW5kZXggaW50byBhcnJheS4uLgogICAgICBpZiAoaXRlbXNJZHggPT0gcGFyc2VJbnQoaXRlbXNJZHgsIDEwKSkgewogICAgICAgIGxldCBpdGVtU3ViUGF0aCA9IGRvdCA8IDAgPyAnJyA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoZG90KzEpOwogICAgICAgIC8vIElmIHRoZSBwYXRoIGlzIG9ic2VydmVkLCBpdCB3aWxsIHRyaWdnZXIgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faGFuZGxlT2JzZXJ2ZWRQYXRocyhpdGVtU3ViUGF0aCk7CiAgICAgICAgLy8gTm90ZSwgZXZlbiBpZiBhIHJ1bGwgcmVmcmVzaCBpcyB0cmlnZ2VyZWQsIGFsd2F5cyBkbyB0aGUgcGF0aAogICAgICAgIC8vIG5vdGlmaWNhdGlvbiBiZWNhdXNlIHVubGVzcyBtdXRhYmxlRGF0YSBpcyB1c2VkIGZvciBkb20tcmVwZWF0CiAgICAgICAgLy8gYW5kIGFsbCBlbGVtZW50cyBpbiB0aGUgaW5zdGFuY2Ugc3VidHJlZSwgYSBmdWxsIHJlZnJlc2ggbWF5CiAgICAgICAgLy8gbm90IHRyaWdnZXIgdGhlIHByb3BlciB1cGRhdGUuCiAgICAgICAgbGV0IGluc3RJZHggPSB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHhbaXRlbXNJZHhdOwogICAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XTsKICAgICAgICBpZiAoaW5zdCkgewogICAgICAgICAgbGV0IGl0ZW1QYXRoID0gdGhpcy5hcyArIChpdGVtU3ViUGF0aCA/ICcuJyArIGl0ZW1TdWJQYXRoIDogJycpOwogICAgICAgICAgLy8gVGhpcyBpcyBlZmZlY3RpdmVseSBgbm90aWZ5UGF0aGAsIGJ1dCBhdm9pZHMgc29tZSBvZiB0aGUgb3ZlcmhlYWQKICAgICAgICAgIC8vIG9mIHRoZSBwdWJsaWMgQVBJCiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoaXRlbVBhdGgsIHZhbHVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICAgKiB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqCiAgICAgKiBOb3RlLCB0byBtb2RpZnkgc3ViLXByb3BlcnRpZXMgb2YgdGhlIGl0ZW0sCiAgICAgKiBgbW9kZWxGb3JFbGVtZW50KGVsKS5zZXQoJ2l0ZW0uPHN1Yi1wcm9wPicsIHZhbHVlKWAKICAgICAqIHNob3VsZCBiZSB1c2VkLgogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gdGhlIGl0ZW0uCiAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudC4KICAgICAqLwogICAgaXRlbUZvckVsZW1lbnQoZWwpIHsKICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5tb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2VbdGhpcy5hc107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnN0IGluZGV4IGZvciBhIGdpdmVuIGVsZW1lbnQgc3RhbXBlZCBieSB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqIElmIGBzb3J0YCBpcyBwcm92aWRlZCwgdGhlIGluZGV4IHdpbGwgcmVmbGVjdCB0aGUgc29ydGVkIG9yZGVyIChyYXRoZXIKICAgICAqIHRoYW4gdGhlIG9yaWdpbmFsIGFycmF5IG9yZGVyKS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBpbmRleC4KICAgICAqIEByZXR1cm4gez9udW1iZXJ9IFJvdyBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgKG5vdGUgdGhpcyBtYXkKICAgICAqICAgbm90IGNvcnJlc3BvbmQgdG8gdGhlIGFycmF5IGluZGV4IGlmIGEgdXNlciBgc29ydGAgaXMgYXBwbGllZCkuCiAgICAgKi8KICAgIGluZGV4Rm9yRWxlbWVudChlbCkgewogICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLm1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVt0aGlzLmluZGV4QXNdOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBlbGVtZW50LCB3aGljaAogICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAqIGNvbnRhaW5lZCBpbi4gQSB0ZW1wbGF0ZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBgUG9seW1lci5CYXNlYCwgYW5kCiAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgIGxldCBtb2RlbCA9IG1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgKiAgIGlmIChtb2RlbC5pbmRleCA8IDEwKSB7CiAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAqICAgfQogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBNb2RlbCByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICAgKiAgIHRoZSBlbGVtZW50LgogICAgICovCiAgICBtb2RlbEZvckVsZW1lbnQoZWwpIHsKICAgICAgcmV0dXJuIFBvbHltZXIuVGVtcGxhdGl6ZS5tb2RlbEZvckVsZW1lbnQodGhpcy50ZW1wbGF0ZSwgZWwpOwogICAgfQoKICB9CgogIGN1c3RvbUVsZW1lbnRzLmRlZmluZShEb21SZXBlYXQuaXMsIERvbVJlcGVhdCk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbVJlcGVhdCA9IERvbVJlcGVhdDsKCn0pKCk7CgoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBUaGUgYDxkb20taWY+YCBlbGVtZW50IHdpbGwgc3RhbXAgYSBsaWdodC1kb20gYDx0ZW1wbGF0ZT5gIGNoaWxkIHdoZW4KICAgKiB0aGUgYGlmYCBwcm9wZXJ0eSBiZWNvbWVzIHRydXRoeSwgYW5kIHRoZSB0ZW1wbGF0ZSBjYW4gdXNlIFBvbHltZXIKICAgKiBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGZlYXR1cmVzIHdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZgogICAqIGEgUG9seW1lciBlbGVtZW50J3MgdGVtcGxhdGUuCiAgICoKICAgKiBXaGVuIGBpZmAgYmVjb21lcyBmYWxzeSwgdGhlIHN0YW1wZWQgY29udGVudCBpcyBoaWRkZW4gYnV0IG5vdAogICAqIHJlbW92ZWQgZnJvbSBkb20uIFdoZW4gYGlmYCBzdWJzZXF1ZW50bHkgYmVjb21lcyB0cnV0aHkgYWdhaW4sIHRoZSBjb250ZW50CiAgICogaXMgc2ltcGx5IHJlLXNob3duLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZHVlIHRvIGl0cyBmYXZvcmFibGUgcGVyZm9ybWFuY2UKICAgKiBjaGFyYWN0ZXJpc3RpY3M6IHRoZSBleHBlbnNlIG9mIGNyZWF0aW5nIHRlbXBsYXRlIGNvbnRlbnQgaXMgcGFpZCBvbmx5CiAgICogb25jZSBhbmQgbGF6aWx5LgogICAqCiAgICogU2V0IHRoZSBgcmVzdGFtcGAgcHJvcGVydHkgdG8gdHJ1ZSB0byBmb3JjZSB0aGUgc3RhbXBlZCBjb250ZW50IHRvIGJlCiAgICogY3JlYXRlZCAvIGRlc3Ryb3llZCB3aGVuIHRoZSBgaWZgIGNvbmRpdGlvbiBjaGFuZ2VzLgogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBleHRlbmRzIFBvbHltZXIuRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBjb25kaXRpb25hbGx5IHN0YW1wcyBhbmQgaGlkZXMgb3IgcmVtb3ZlcwogICAqICAgdGVtcGxhdGUgY29udGVudCBiYXNlZCBvbiBhIGJvb2xlYW4gZmxhZy4KICAgKi8KICBjbGFzcyBEb21JZiBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLWlmJzsgfQoKICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7IHJldHVybiBudWxsOyB9CgogICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewoKICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbmV2ZXIgRE9NIGlzIGFkZGVkIG9yIHJlbW92ZWQvaGlkZGVuIGJ5IHRoaXMgdGVtcGxhdGUgKGJ5CiAgICAgICAgICogZGVmYXVsdCwgcmVuZGVyaW5nIG9jY3VycyBsYXppbHkpLiAgVG8gZm9yY2UgaW1tZWRpYXRlIHJlbmRlcmluZywgY2FsbAogICAgICAgICAqIGByZW5kZXJgLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IGRvbS1jaGFuZ2UKICAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHRlbXBsYXRlIHNob3VsZCBzdGFtcC4KICAgICAgICAgKi8KICAgICAgICBpZjogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHRydWUsIGVsZW1lbnRzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIERPTSBhbmQgZGlzY2FyZGVkIHdoZW4gYGlmYAogICAgICAgICAqIGJlY29tZXMgZmFsc2UgYW5kIHJlLWNyZWF0ZWQgYW5kIGFkZGVkIGJhY2sgdG8gdGhlIERPTSB3aGVuIGBpZmAKICAgICAgICAgKiBiZWNvbWVzIHRydWUuICBCeSBkZWZhdWx0LCBzdGFtcGVkIGVsZW1lbnRzIHdpbGwgYmUgaGlkZGVuIGJ1dCBsZWZ0CiAgICAgICAgICogaW4gdGhlIERPTSB3aGVuIGBpZmAgYmVjb21lcyBmYWxzZSwgd2hpY2ggaXMgZ2VuZXJhbGx5IHJlc3VsdHMKICAgICAgICAgKiBpbiBiZXR0ZXIgcGVyZm9ybWFuY2UuCiAgICAgICAgICovCiAgICAgICAgcmVzdGFtcDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9CgogICAgICB9OwoKICAgIH0KCiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IG51bGw7CiAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICB0aGlzLl9faW5zdGFuY2UgPSBudWxsOwogICAgICB0aGlzLl9sYXN0SWYgPSBmYWxzZTsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgfQoKICAgIF9fZGVib3VuY2VSZW5kZXIoKSB7CiAgICAgIC8vIFJlbmRlciBpcyBhc3luYyBmb3IgMiByZWFzb25zOgogICAgICAvLyAxLiBUbyBlbGltaW5hdGUgZG9tIGNyZWF0aW9uIHRyYXNoaW5nIGlmIHVzZXIgY29kZSB0aHJhc2hlcyBgaWZgIGluIHRoZQogICAgICAvLyAgICBzYW1lIHR1cm4uIFRoaXMgd2FzIG1vcmUgY29tbW9uIGluIDEueCB3aGVyZSBhIGNvbXBvdW5kIGNvbXB1dGVkCiAgICAgIC8vICAgIHByb3BlcnR5IGNvdWxkIHJlc3VsdCBpbiB0aGUgcmVzdWx0IGNoYW5naW5nIG11bHRpcGxlIHRpbWVzLCBidXQgaXMKICAgICAgLy8gICAgbWl0aWdhdGVkIHRvIGEgbGFyZ2UgZXh0ZW50IGJ5IGJhdGNoZWQgcHJvcGVydHkgcHJvY2Vzc2luZyBpbiAyLnguCiAgICAgIC8vIDIuIFRvIGF2b2lkIGRvdWJsZSBvYmplY3QgcHJvcGFnYXRpb24gd2hlbiBhIGJhZyBpbmNsdWRpbmcgdmFsdWVzIGJvdW5kCiAgICAgIC8vICAgIHRvIHRoZSBgaWZgIHByb3BlcnR5IGFzIHdlbGwgYXMgb25lIG9yIG1vcmUgaG9zdFByb3BzIGNvdWxkIGVucXVldWUKICAgICAgLy8gICAgdGhlIDxkb20taWY+IHRvIGZsdXNoIGJlZm9yZSB0aGUgPHRlbXBsYXRlPidzIGhvc3QgcHJvcGVydHkKICAgICAgLy8gICAgZm9yd2FyZGluZy4gSW4gdGhhdCBzY2VuYXJpbyBjcmVhdGluZyBhbiBpbnN0YW5jZSB3b3VsZCByZXN1bHQgaW4KICAgICAgLy8gICAgdGhlIGhvc3QgcHJvcHMgYmVpbmcgc2V0IG9uY2UsIGFuZCB0aGVuIHRoZSBlbnF1ZXVlZCBjaGFuZ2VzIG9uIHRoZQogICAgICAvLyAgICB0ZW1wbGF0ZSB3b3VsZCBzZXQgcHJvcGVydGllcyBhIHNlY29uZCB0aW1lLCBwb3RlbnRpYWxseSBjYXVzaW5nIGFuCiAgICAgIC8vICAgIG9iamVjdCB0byBiZSBzZXQgdG8gYW4gaW5zdGFuY2UgbW9yZSB0aGFuIG9uY2UuICBDcmVhdGluZyB0aGUKICAgICAgLy8gICAgaW5zdGFuY2UgYXN5bmMgZnJvbSBmbHVzaGluZyBkYXRhIGVuc3VyZXMgdGhpcyBkb2Vzbid0IGhhcHBlbi4gSWYKICAgICAgLy8gICAgd2Ugd2FudGVkIGEgc3luYyBvcHRpb24gaW4gdGhlIGZ1dHVyZSwgc2ltcGx5IGhhdmluZyA8ZG9tLWlmPiBmbHVzaAogICAgICAvLyAgICAob3IgY2xlYXIpIGl0cyB0ZW1wbGF0ZSdzIHBlbmRpbmcgaG9zdCBwcm9wZXJ0aWVzIGJlZm9yZSBjcmVhdGluZwogICAgICAvLyAgICB0aGUgaW5zdGFuY2Ugd291bGQgYWxzbyBhdm9pZCB0aGUgcHJvYmxlbS4KICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAgICAsICgpID0+IHRoaXMuX19yZW5kZXIoKSk7CiAgICAgIFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9fcmVuZGVyRGVib3VuY2VyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAoIXRoaXMucGFyZW50Tm9kZSB8fAogICAgICAgICAgKHRoaXMucGFyZW50Tm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgJiYKICAgICAgICAgICAhdGhpcy5wYXJlbnROb2RlLmhvc3QpKSB7CiAgICAgICAgdGhpcy5fX3RlYXJkb3duSW5zdGFuY2UoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIFBvbHltZXIuZmx1c2goKTsKICAgIH0KCiAgICBfX3JlbmRlcigpIHsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICBpZiAoIXRoaXMuX19lbnN1cmVJbnN0YW5jZSgpKSB7CiAgICAgICAgICAvLyBObyB0ZW1wbGF0ZSBmb3VuZCB5ZXQKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdGFtcCkgewogICAgICAgIHRoaXMuX190ZWFyZG93bkluc3RhbmNlKCk7CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLnJlc3RhbXAgJiYgdGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlmICE9IHRoaXMuX2xhc3RJZikgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fbGFzdElmID0gdGhpcy5pZjsKICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlSW5zdGFuY2UoKSB7CiAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5wYXJlbnROb2RlOwogICAgICAvLyBHdWFyZCBhZ2FpbnN0IGVsZW1lbnQgYmVpbmcgZGV0YWNoZWQgd2hpbGUgcmVuZGVyIHdhcyBxdWV1ZWQKICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgY2hpbGRMaXN0IGNoYW5nZXMgYW5kIHRlbXBsYXRlIHNob3VsZCBiZSB0aGVyZSBieSB0aGVuCiAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9fcmVuZGVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9tLWlmIHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywge2NoaWxkTGlzdDogdHJ1ZX0pOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fY3RvciA9IFBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRlbXBsYXRlLCB0aGlzLCB7CiAgICAgICAgICAgIC8vIGRvbS1pZiB0ZW1wbGF0aXplciBpbnN0YW5jZXMgcmVxdWlyZSBgbXV0YWJsZTogdHJ1ZWAsIGFzCiAgICAgICAgICAgIC8vIGBfX3N5bmNIb3N0UHJvcGVydGllc2AgcmVsaWVzIG9uIHRoYXQgYmVoYXZpb3IgdG8gc3luYyBvYmplY3RzCiAgICAgICAgICAgIG11dGFibGVEYXRhOiB0cnVlLAogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gZm9yd2FyZAogICAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIHByb3BlcnR5CiAgICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm9yd2FyZEhvc3RQcm9wOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlmKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5mb3J3YXJkSG9zdFByb3AocHJvcCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbnN0YW5jZSBidXQgYXJlIHNxdWVsY2hpbmcgaG9zdCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkaW5nIGR1ZSB0byBpZiBiZWluZyBmYWxzZSwgbm90ZSB0aGUgaW52YWxpZGF0ZWQKICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBzbyBgX19zeW5jSG9zdFByb3BlcnRpZXNgIGNhbiBzeW5jIHRoZW0gdGhlIG5leHQKICAgICAgICAgICAgICAgICAgLy8gdGltZSBgaWZgIGJlY29tZXMgdHJ1ZQogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzID0gdGhpcy5fX2ludmFsaWRQcm9wcyB8fCBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzW1BvbHltZXIuUGF0aC5yb290KHByb3ApXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyB0aGlzLl9fY3RvcigpOwogICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fX2luc3RhbmNlLnJvb3QsIHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9fc3luY0hvc3RQcm9wZXJ0aWVzKCk7CiAgICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgICBpZiAoYyQgJiYgYyQubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIERldGVjdCBjYXNlIHdoZXJlIGRvbS1pZiB3YXMgcmUtYXR0YWNoZWQgaW4gbmV3IHBvc2l0aW9uCiAgICAgICAgICAgIGxldCBsYXN0Q2hpbGQgPSB0aGlzLnByZXZpb3VzU2libGluZzsKICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAhPT0gYyRbYyQubGVuZ3RoLTFdKSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCB0aGlzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgX19zeW5jSG9zdFByb3BlcnRpZXMoKSB7CiAgICAgIGxldCBwcm9wcyA9IHRoaXMuX19pbnZhbGlkUHJvcHM7CiAgICAgIGlmIChwcm9wcykgewogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3AsIHRoaXMuX19kYXRhSG9zdFtwcm9wXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KCiAgICBfX3RlYXJkb3duSW5zdGFuY2UoKSB7CiAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgaWYgKGMkICYmIGMkLmxlbmd0aCkgewogICAgICAgICAgLy8gdXNlIGZpcnN0IGNoaWxkIHBhcmVudCwgZm9yIGNhc2Ugd2hlbiBkb20taWYgbWF5IGhhdmUgYmVlbiBkZXRhY2hlZAogICAgICAgICAgbGV0IHBhcmVudCA9IGMkWzBdLnBhcmVudE5vZGU7CiAgICAgICAgICAvLyBJbnN0YW5jZSBjaGlsZHJlbiBtYXkgYmUgZGlzY29ubmVjdGVkIGZyb20gcGFyZW50cyB3aGVuIGRvbS1pZgogICAgICAgICAgLy8gZGV0YWNoZXMgaWYgYSB0cmVlIHdhcyBpbm5lckhUTUwnZWQKICAgICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG4pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG51bGw7CiAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICogdGV4dCBub2RlcywgYHRleHRDb250ZW50YCBpcyByZW1vdmVkIHdoaWxlICJoaWRkZW4iIGFuZCByZXBsYWNlZCB3aGVuCiAgICAgKiAic2hvd24uIgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqLwogICAgX3Nob3dIaWRlQ2hpbGRyZW4oKSB7CiAgICAgIGxldCBoaWRkZW4gPSB0aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyB8fCAhdGhpcy5pZjsKICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZSkgewogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2hvd0hpZGVDaGlsZHJlbihoaWRkZW4pOwogICAgICB9CiAgICB9CgogIH0KCiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKERvbUlmLmlzLCBEb21JZik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbUlmID0gRG9tSWY7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIEVsZW1lbnQgbWl4aW4gZm9yIHJlY29yZGluZyBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYQogICAqIG1hc3RlciBgaXRlbXNgIGFycmF5IGFuZCBhIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUKICAgKiBtYXN0ZXIgYXJyYXkgKGF0IHRoZSBob3N0KSBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUKICAgKiBjb3JyZWN0bHkgcHJvcGFnYXRlZCB0byBpdGVtcyBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEBwb2x5bWVyCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IG1peGluIGZvciByZWNvcmRpbmcgZHluYW1pYyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBpdGVtIHBhdGhzIGluIGEKICAgKiBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYSBgc2VsZWN0ZWRgIGFycmF5CiAgICovCiAgbGV0IEFycmF5U2VsZWN0b3JNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBsZXQgZWxlbWVudEJhc2UgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihzdXBlckNsYXNzKTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfQXJyYXlTZWxlY3Rvck1peGlufQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBBcnJheVNlbGVjdG9yTWl4aW4gZXh0ZW5kcyBlbGVtZW50QmFzZSB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICAgIHJldHVybiB7CgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIGl0ZW1zIGZyb20gd2hpY2ggc2VsZWN0aW9uIHdpbGwgYmUgbWFkZS4KICAgICAgICAgICAqLwogICAgICAgICAgaXRlbXM6IHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgdHJ1ZWAsIG11bHRpcGxlIGl0ZW1zIG1heSBiZSBzZWxlY3RlZCBhdCBvbmNlIChpbiB0aGlzIGNhc2UsCiAgICAgICAgICAgKiBgc2VsZWN0ZWRgIGlzIGFuIGFycmF5IG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcykuICBXaGVuIGBmYWxzZWAsCiAgICAgICAgICAgKiBvbmx5IG9uZSBpdGVtIG1heSBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCiAgICAgICAgICAgKi8KICAgICAgICAgIG11bHRpOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGBtdWx0aWAgaXMgdHJ1ZSwgdGhpcyBpcyBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGFueSBzZWxlY3RlZC4KICAgICAgICAgICAqIFdoZW4gYG11bHRpYCBpcyBmYWxzZSwgdGhpcyBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIG9yIGBudWxsYAogICAgICAgICAgICogaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KICAgICAgICAgICAqIEB0eXBlIHs/KE9iamVjdHxBcnJheTwhT2JqZWN0Pil9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgb3IgYG51bGxgCiAgICAgICAgICAgKiBpZiBubyBpdGVtIGlzIHNlbGVjdGVkLgogICAgICAgICAgICogQHR5cGUgez9PYmplY3R9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkSXRlbTogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gYHRydWVgLCBjYWxsaW5nIGBzZWxlY3RgIG9uIGFuIGl0ZW0gdGhhdCBpcyBhbHJlYWR5IHNlbGVjdGVkCiAgICAgICAgICAgKiB3aWxsIGRlc2VsZWN0IHRoZSBpdGVtLgogICAgICAgICAgICovCiAgICAgICAgICB0b2dnbGU6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9CgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbJ19fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtcy4qKSddOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBudWxsOwogICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBudWxsOwogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG51bGw7CiAgICAgIH0KCiAgICAgIF9fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtc0luZm8pIHsKICAgICAgICBsZXQgcGF0aCA9IGl0ZW1zSW5mby5wYXRoOwogICAgICAgIGlmIChwYXRoID09ICdpdGVtcycpIHsKICAgICAgICAgIC8vIENhc2UgMSAtIGl0ZW1zIGFycmF5IGNoYW5nZWQsIHNvIGRpZmYgYWdhaW5zdCBwcmV2aW91cyBhcnJheSBhbmQKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgbGV0IG5ld0l0ZW1zID0gaXRlbXNJbmZvLmJhc2UgfHwgW107CiAgICAgICAgICBsZXQgbGFzdEl0ZW1zID0gdGhpcy5fX2xhc3RJdGVtczsKICAgICAgICAgIGxldCBsYXN0TXVsdGkgPSB0aGlzLl9fbGFzdE11bHRpOwogICAgICAgICAgaWYgKG11bHRpICE9PSBsYXN0TXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxhc3RJdGVtcykgewogICAgICAgICAgICBsZXQgc3BsaWNlcyA9IFBvbHltZXIuQXJyYXlTcGxpY2UuY2FsY3VsYXRlU3BsaWNlcyhuZXdJdGVtcywgbGFzdEl0ZW1zKTsKICAgICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhzcGxpY2VzKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBuZXdJdGVtczsKICAgICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBtdWx0aTsKICAgICAgICB9IGVsc2UgaWYgKGl0ZW1zSW5mby5wYXRoID09ICdpdGVtcy5zcGxpY2VzJykgewogICAgICAgICAgLy8gQ2FzZSAyIC0gZ290IHNwZWNpZmljIHNwbGljZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBhcnJheSBtdXRhdGlvbjoKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhpdGVtc0luZm8udmFsdWUuaW5kZXhTcGxpY2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQ2FzZSAzIC0gYW4gYXJyYXkgZWxlbWVudCB3YXMgY2hhbmdlZCwgc28gZGVzZWxlY3QgdGhlIHByZXZpb3VzCiAgICAgICAgICAvLyBpdGVtIGZvciB0aGF0IGluZGV4IGlmIGl0IHdhcyBwcmV2aW91c2x5IHNlbGVjdGVkCiAgICAgICAgICBsZXQgcGFydCA9IHBhdGguc2xpY2UoJ2l0ZW1zLicubGVuZ3RoKTsKICAgICAgICAgIGxldCBpZHggPSBwYXJzZUludChwYXJ0LCAxMCk7CiAgICAgICAgICBpZiAoKHBhcnQuaW5kZXhPZignLicpIDwgMCkgJiYgcGFydCA9PSBpZHgpIHsKICAgICAgICAgICAgdGhpcy5fX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19hcHBseVNwbGljZXMoc3BsaWNlcykgewogICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuX19zZWxlY3RlZE1hcDsKICAgICAgICAvLyBBZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcyBhbmQgbWFyayByZW1vdmFscwogICAgICAgIGZvciAobGV0IGk9MDsgaTxzcGxpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHNwbGljZXNbaV07CiAgICAgICAgICBzZWxlY3RlZC5mb3JFYWNoKChpZHgsIGl0ZW0pID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA8IHMuaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UKICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPj0gcy5pbmRleCArIHMucmVtb3ZlZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAvLyBhZGp1c3QgaW5kZXgKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQoaXRlbSwgaWR4ICsgcy5hZGRlZENvdW50IC0gcy5yZW1vdmVkLmxlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluZGV4CiAgICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KGl0ZW0sIC0xKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8cy5hZGRlZENvdW50OyBqKyspIHsKICAgICAgICAgICAgbGV0IGlkeCA9IHMuaW5kZXggKyBqOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQuaGFzKHRoaXMuaXRlbXNbaWR4XSkpIHsKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQodGhpcy5pdGVtc1tpZHhdLCBpZHgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgcGF0aHMKICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgaXRlbXMgYXJyYXkKICAgICAgICBsZXQgc2lkeCA9IDA7CiAgICAgICAgc2VsZWN0ZWQuZm9yRWFjaCgoaWR4LCBpdGVtKSA9PiB7CiAgICAgICAgICBpZiAoaWR4IDwgMCkgewogICAgICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZWN0ZWQuZGVsZXRlKGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2lkeCsrOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBfX3VwZGF0ZUxpbmtzKCkgewogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgbGV0IHNpZHggPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goaWR4ID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ2l0ZW1zLicgKyBpZHgsICdzZWxlY3RlZC4nICsgc2lkeCsrKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKGlkeCA9PiB7CiAgICAgICAgICAgIHRoaXMubGlua1BhdGhzKCdzZWxlY3RlZCcsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ3NlbGVjdGVkSXRlbScsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsZWFycyB0aGUgc2VsZWN0aW9uIHN0YXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7CiAgICAgICAgLy8gVW5iaW5kIHByZXZpb3VzIHNlbGVjdGlvbgogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICAvLyBUaGUgc2VsZWN0ZWQgbWFwIHN0b3JlcyAzIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKICAgICAgICAvLyBrZXk6IGl0ZW1zIGFycmF5IG9iamVjdAogICAgICAgIC8vIHZhbHVlOiBpdGVtcyBhcnJheSBpbmRleAogICAgICAgIC8vIG9yZGVyOiBzZWxlY3RlZCBhcnJheSBpbmRleAogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbgogICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLm11bHRpID8gW10gOiBudWxsOwogICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byB0ZXN0CiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQKICAgICAgICovCiAgICAgIGlzU2VsZWN0ZWQoaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLl9fc2VsZWN0ZWRNYXAuaGFzKGl0ZW0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeCBJbmRleCBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gdGVzdAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGlzIHNlbGVjdGVkCiAgICAgICAqLwogICAgICBpc0luZGV4U2VsZWN0ZWQoaWR4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2lkeF0pOwogICAgICB9CgogICAgICBfX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpIHsKICAgICAgICBsZXQgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgaWYgKHNpZHggPj0gMCkgewogICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgICBpZiAoc2lkeCA9PSBpKyspIHsKICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0KGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleChpZHgpIHsKICAgICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzWydpdGVtcy4nICsgaWR4XTsKICAgICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChzZWxlY3RlZC5zbGljZSgnc2VsZWN0ZWQuJy5sZW5ndGgpLCAxMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRGVzZWxlY3RzIHRoZSBnaXZlbiBpdGVtIGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBkZXNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGVzZWxlY3QoaXRlbSkgewogICAgICAgIGxldCBpZHggPSB0aGlzLl9fc2VsZWN0ZWRNYXAuZ2V0KGl0ZW0pOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmRlbGV0ZShpdGVtKTsKICAgICAgICAgIGxldCBzaWR4OwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBEZXNlbGVjdHMgdGhlIGdpdmVuIGluZGV4IGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIGRlc2VsZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkZXNlbGVjdEluZGV4KGlkeCkgewogICAgICAgIHRoaXMuZGVzZWxlY3QodGhpcy5pdGVtc1tpZHhdKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGVjdHMgdGhlIGdpdmVuIGl0ZW0uICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBzZWxlY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNlbGVjdChpdGVtKSB7CiAgICAgICAgdGhpcy5zZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gaW5kZXguICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIHNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2VsZWN0SW5kZXgoaWR4KSB7CiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLml0ZW1zW2lkeF07CiAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWQoaXRlbSkpIHsKICAgICAgICAgIGlmICghdGhpcy5tdWx0aSkgewogICAgICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAuY2xlYXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5zZXQoaXRlbSwgaWR4KTsKICAgICAgICAgIHRoaXMuX191cGRhdGVMaW5rcygpOwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5wdXNoKCdzZWxlY3RlZCcsIGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMudG9nZ2xlKSB7CiAgICAgICAgICB0aGlzLmRlc2VsZWN0SW5kZXgoaWR4KTsKICAgICAgICB9CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIEFycmF5U2VsZWN0b3JNaXhpbjsKCiAgfSk7CgogIC8vIGV4cG9ydCBtaXhpbgogIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluID0gQXJyYXlTZWxlY3Rvck1peGluOwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7UG9seW1lci5FbGVtZW50fQogICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0FycmF5U2VsZWN0b3JNaXhpbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGxldCBiYXNlQXJyYXlTZWxlY3RvciA9IEFycmF5U2VsZWN0b3JNaXhpbihQb2x5bWVyLkVsZW1lbnQpOwoKICAvKioKICAgKiBFbGVtZW50IGltcGxlbWVudGluZyB0aGUgYFBvbHltZXIuQXJyYXlTZWxlY3RvcmAgbWl4aW4sIHdoaWNoIHJlY29yZHMKICAgKiBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYSBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYQogICAqIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUgbWFzdGVyIGFycmF5IChhdCB0aGUgaG9zdCkKICAgKiBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUgY29ycmVjdGx5IHByb3BhZ2F0ZWQgdG8gaXRlbXMKICAgKiBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1tb2R1bGUgaWQ9ImVtcGxveWVlLWxpc3QiPgogICAqCiAgICogICA8dGVtcGxhdGU+CiAgICoKICAgKiAgICAgPGRpdj4gRW1wbG95ZWUgbGlzdDogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGlkPSJlbXBsb3llZUxpc3QiIGl0ZW1zPSJ7e2VtcGxveWVlc319Ij4KICAgKiAgICAgICA8dGVtcGxhdGU+CiAgICogICAgICAgICA8ZGl2PkZpcnN0IG5hbWU6IDxzcGFuPnt7aXRlbS5maXJzdH19PC9zcGFuPjwvZGl2PgogICAqICAgICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICAgICAgPGJ1dHRvbiBvbi1jbGljaz0idG9nZ2xlU2VsZWN0aW9uIj5TZWxlY3Q8L2J1dHRvbj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgICAgPGFycmF5LXNlbGVjdG9yIGlkPSJzZWxlY3RvciIgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkfX0iIG11bHRpIHRvZ2dsZT48L2FycmF5LXNlbGVjdG9yPgogICAqCiAgICogICAgIDxkaXY+IFNlbGVjdGVkIGVtcGxveWVlczogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e3NlbGVjdGVkfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBgYGBqcwogICAqY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdlbXBsb3llZS1saXN0JzsgfQogICAqICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICogICAgcmV0dXJuIHsKICAgKiAgICAgIGVtcGxveWVlczogewogICAqICAgICAgICB2YWx1ZSgpIHsKICAgKiAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAge2ZpcnN0OiAnQm9iJywgbGFzdDogJ1NtaXRoJ30sCiAgICogICAgICAgICAgICB7Zmlyc3Q6ICdTYWxseScsIGxhc3Q6ICdKb2huc29uJ30sCiAgICogICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICBdOwogICAqICAgICAgICB9CiAgICogICAgICB9CiAgICogICAgfTsKICAgKiAgfQogICAqICB0b2dnbGVTZWxlY3Rpb24oZSkgewogICAqICAgIGxldCBpdGVtID0gdGhpcy4kLmVtcGxveWVlTGlzdC5pdGVtRm9yRWxlbWVudChlLnRhcmdldCk7CiAgICogICAgdGhpcy4kLnNlbGVjdG9yLnNlbGVjdChpdGVtKTsKICAgKiAgfQogICAqfQogICAqIGBgYAogICAqCiAgICogQHBvbHltZXIKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIHtiYXNlQXJyYXlTZWxlY3Rvcn0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IGxpbmtzIHBhdGhzIGJldHdlZW4gYW4gaW5wdXQgYGl0ZW1zYCBhcnJheSBhbmQKICAgKiAgIGFuIG91dHB1dCBgc2VsZWN0ZWRgIGl0ZW0gb3IgYXJyYXkgYmFzZWQgb24gY2FsbHMgdG8gaXRzIHNlbGVjdGlvbiBBUEkuCiAgICovCiAgY2xhc3MgQXJyYXlTZWxlY3RvciBleHRlbmRzIGJhc2VBcnJheVNlbGVjdG9yIHsKICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2FycmF5LXNlbGVjdG9yJzsgfQogIH0KICBjdXN0b21FbGVtZW50cy5kZWZpbmUoQXJyYXlTZWxlY3Rvci5pcywgQXJyYXlTZWxlY3Rvcik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkFycmF5U2VsZWN0b3IgPSBBcnJheVNlbGVjdG9yOwoKfSkoKTsKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBjPW51bGwsZj13aW5kb3cuSFRNTEltcG9ydHMmJndpbmRvdy5IVE1MSW1wb3J0cy53aGVuUmVhZHl8fG51bGwsZztmdW5jdGlvbiBoKGEpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2Y/ZihhKTooY3x8KGM9bmV3IFByb21pc2UoZnVuY3Rpb24oYSl7Zz1hfSksImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/ZygpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKCl7ImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJmcoKX0pKSxjLnRoZW4oZnVuY3Rpb24oKXthJiZhKCl9KSl9KX07dmFyIGs9bnVsbCxsPW51bGw7ZnVuY3Rpb24gbSgpe3RoaXMuY3VzdG9tU3R5bGVzPVtdO3RoaXMuZW5xdWV1ZWQ9ITE7aChmdW5jdGlvbigpe3dpbmRvdy5TaGFkeUNTUy5mbHVzaEN1c3RvbVN0eWxlcyYmd2luZG93LlNoYWR5Q1NTLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX1mdW5jdGlvbiBuKGEpeyFhLmVucXVldWVkJiZsJiYoYS5lbnF1ZXVlZD0hMCxoKGwpKX1tLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2EuX19zZWVuQnlTaGFkeUNTU3x8KGEuX19zZWVuQnlTaGFkeUNTUz0hMCx0aGlzLmN1c3RvbVN0eWxlcy5wdXNoKGEpLG4odGhpcykpfTttLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe2lmKGEuX19zaGFkeUNTU0NhY2hlZFN0eWxlKXJldHVybiBhLl9fc2hhZHlDU1NDYWNoZWRTdHlsZTt2YXIgYjthLmdldFN0eWxlP2I9YS5nZXRTdHlsZSgpOmI9YTtyZXR1cm4gYn07Cm0ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5jdXN0b21TdHlsZXMsYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdO2lmKCFkLl9fc2hhZHlDU1NDYWNoZWRTdHlsZSl7dmFyIGU9dGhpcy5iKGQpO2UmJihlPWUuX19hcHBsaWVkRWxlbWVudHx8ZSxrJiZrKGUpLGQuX19zaGFkeUNTU0NhY2hlZFN0eWxlPWUpfX1yZXR1cm4gYX07bS5wcm90b3R5cGUuYWRkQ3VzdG9tU3R5bGU9bS5wcm90b3R5cGUuYzttLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlPW0ucHJvdG90eXBlLmI7bS5wcm90b3R5cGUucHJvY2Vzc1N0eWxlcz1tLnByb3RvdHlwZS5hOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhtLnByb3RvdHlwZSx7dHJhbnNmb3JtQ2FsbGJhY2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBrfSxzZXQ6ZnVuY3Rpb24oYSl7az1hfX0sdmFsaWRhdGVDYWxsYmFjazp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGx9LHNldDpmdW5jdGlvbihhKXt2YXIgYj0hMTtsfHwoYj0hMCk7bD1hO2ImJm4odGhpcyl9fX0pO2Z1bmN0aW9uIHAoYSxiKXtmb3IodmFyIGQgaW4gYiludWxsPT09ZD9hLnN0eWxlLnJlbW92ZVByb3BlcnR5KGQpOmEuc3R5bGUuc2V0UHJvcGVydHkoZCxiW2RdKX07dmFyIHE9ISh3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSkscjtmdW5jdGlvbiB0KGEpe3I9YSYmYS5zaGltY3NzcHJvcGVydGllcz8hMTpxfHwhKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC82MDF8RWRnZVwvMTUvKXx8IXdpbmRvdy5DU1N8fCFDU1Muc3VwcG9ydHN8fCFDU1Muc3VwcG9ydHMoImJveC1zaGFkb3ciLCIwIDAgMCB2YXIoLS1mb28pIikpfXZhciB1O3dpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkJiYodT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciB2PSEoIXdpbmRvdy5TaGFkeUNTU3x8IXdpbmRvdy5TaGFkeUNTUy5kaXNhYmxlUnVudGltZSk7CndpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzcz9yPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyh0KHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6dCh3aW5kb3cuV2ViQ29tcG9uZW50cyYmd2luZG93LldlYkNvbXBvbmVudHMuZmxhZ3MpO3ZhciB3PXIseD11O3ZhciB5PW5ldyBtO3dpbmRvdy5TaGFkeUNTU3x8KHdpbmRvdy5TaGFkeUNTUz17cHJlcGFyZVRlbXBsYXRlOmZ1bmN0aW9uKCl7fSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHByZXBhcmVUZW1wbGF0ZVN0eWxlczpmdW5jdGlvbigpe30sc3R5bGVTdWJ0cmVlOmZ1bmN0aW9uKGEsYil7eS5hKCk7cChhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oKXt5LmEoKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXt5LmEoKTtwKGRvY3VtZW50LmJvZHksYSl9LGdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybihhPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLmdldFByb3BlcnR5VmFsdWUoYikpP2EudHJpbSgpOiIifSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe30sbmF0aXZlQ3NzOncsbmF0aXZlU2hhZG93OnEsY3NzQnVpbGQ6eCxkaXNhYmxlUnVudGltZTp2fSk7d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXk7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IGF0dHIgPSAnaW5jbHVkZSc7CgogIGNvbnN0IEN1c3RvbVN0eWxlSW50ZXJmYWNlID0gd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlOwoKICAvKioKICAgKiBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuIHRha2UKICAgKiBhZHZhbnRhZ2Ugb2YgW3NoYWR5IERPTV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MpIHNoaW1zCiAgICogZm9yIHN0eWxlIGVuY2Fwc3VsYXRpb24sIGN1c3RvbSBwcm9wZXJ0aWVzLCBhbmQgY3VzdG9tIG1peGlucy4KICAgKgogICAqIC0gRG9jdW1lbnQgc3R5bGVzIGRlZmluZWQgaW4gYSBgPGN1c3RvbS1zdHlsZT5gIGFyZSBzaGltbWVkIHRvIGVuc3VyZSB0aGV5CiAgICogICBkbyBub3QgbGVhayBpbnRvIGxvY2FsIERPTSB3aGVuIHJ1bm5pbmcgb24gYnJvd3NlcnMgd2l0aG91dCBuYXRpdmUKICAgKiAgIFNoYWRvdyBET00uCiAgICogLSBDdXN0b20gcHJvcGVydGllcyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAuIFVzZSB0aGUgYGh0bWxgIHNlbGVjdG9yCiAgICogICB0byBkZWZpbmUgY3VzdG9tIHByb3BlcnRpZXMgdGhhdCBhcHBseSB0byBhbGwgY3VzdG9tIGVsZW1lbnRzLgogICAqIC0gQ3VzdG9tIG1peGlucyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAsIGlmIHlvdSBpbXBvcnQgdGhlIG9wdGlvbmFsCiAgICogICBbYXBwbHkgc2hpbV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MjYWJvdXQtYXBwbHlzaGltKQogICAqICAgKGBzaGFkeWNzcy9hcHBseS1zaGltLmh0bWxgKS4KICAgKgogICAqIFRvIHVzZToKICAgKgogICAqIC0gSW1wb3J0IGBjdXN0b20tc3R5bGUuaHRtbGAuCiAgICogLSBQbGFjZSBhIGA8Y3VzdG9tLXN0eWxlPmAgZWxlbWVudCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgd3JhcHBpbmcgYW4gaW5saW5lIGA8c3R5bGU+YCB0YWcgdGhhdAogICAqICAgY29udGFpbnMgdGhlIENTUyBydWxlcyB5b3Ugd2FudCB0byBzaGltLgogICAqCiAgICogRm9yIGV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPCEtLSBpbXBvcnQgYXBwbHkgc2hpbS0tb25seSByZXF1aXJlZCBpZiB1c2luZyBtaXhpbnMgLS0+CiAgICogPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvc2hhZHljc3MvYXBwbHktc2hpbS5odG1sIj4KICAgKiA8IS0tIGltcG9ydCBjdXN0b20tc3R5bGUgZWxlbWVudCAtLT4KICAgKiA8bGluayByZWw9ImltcG9ydCIgaHJlZj0iYm93ZXJfY29tcG9uZW50cy9wb2x5bWVyL2xpYi9lbGVtZW50cy9jdXN0b20tc3R5bGUuaHRtbCI+CiAgICoKICAgKiA8Y3VzdG9tLXN0eWxlPgogICAqICAgPHN0eWxlPgogICAqICAgICBodG1sIHsKICAgKiAgICAgICAtLWN1c3RvbS1jb2xvcjogYmx1ZTsKICAgKiAgICAgICAtLWN1c3RvbS1taXhpbjogewogICAqICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICogICAgICAgICBjb2xvcjogcmVkOwogICAqICAgICAgIH07CiAgICogICAgIH0KICAgKiAgIDwvc3R5bGU+CiAgICogPC9jdXN0b20tc3R5bGU+CiAgICogYGBgCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuCiAgICogICB0YWtlIGFkdmFudGFnZSBvZiBQb2x5bWVyJ3Mgc3R5bGUgc2NvcGluZyBhbmQgY3VzdG9tIHByb3BlcnRpZXMgc2hpbXMuCiAgICovCiAgY2xhc3MgQ3VzdG9tU3R5bGUgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fc3R5bGUgPSBudWxsOwogICAgICBDdXN0b21TdHlsZUludGVyZmFjZS5hZGRDdXN0b21TdHlsZSh0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlnaHQtRE9NIGA8c3R5bGU+YCBjaGlsZCB0aGlzIGVsZW1lbnQgd3JhcHMuICBVcG9uIGZpcnN0CiAgICAgKiBjYWxsIGFueSBzdHlsZSBtb2R1bGVzIHJlZmVyZW5jZWQgdmlhIHRoZSBgaW5jbHVkZWAgYXR0cmlidXRlIHdpbGwgYmUKICAgICAqIGNvbmNhdGVuYXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHN0eWxlPmAuCiAgICAgKgogICAgICogQHJldHVybiB7SFRNTFN0eWxlRWxlbWVudH0gVGhpcyBlbGVtZW50J3MgbGlnaHQtRE9NIGA8c3R5bGU+YAogICAgICovCiAgICBnZXRTdHlsZSgpIHsKICAgICAgaWYgKHRoaXMuX3N0eWxlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlOwogICAgICB9CiAgICAgIGNvbnN0IHN0eWxlID0gLyoqIEB0eXBlIHtIVE1MU3R5bGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpOwogICAgICBpZiAoIXN0eWxlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5fc3R5bGUgPSBzdHlsZTsKICAgICAgY29uc3QgaW5jbHVkZSA9IHN0eWxlLmdldEF0dHJpYnV0ZShhdHRyKTsKICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLmNzc0Zyb21Nb2R1bGVzKGluY2x1ZGUpICsgc3R5bGUudGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgLyoKICAgICAgSFRNTCBJbXBvcnRzIHN0eWxpbmcgdGhlIG1haW4gZG9jdW1lbnQgYXJlIGRlcHJlY2F0ZWQgaW4gQ2hyb21lCiAgICAgIGh0dHBzOi8vY3JidWcuY29tLzUyMzk1MgoKICAgICAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgdGhlbiBpdCBtdXN0IGJlIGluIGFuIEhUTUwgSW1wb3J0IGRvY3VtZW50LgogICAgICBJbiB0aGF0IGNhc2UsIG1vdmUgdGhlIGN1c3RvbSBzdHlsZSB0byB0aGUgbWFpbiBkb2N1bWVudC4KCiAgICAgIFRoZSBvcmRlcmluZyBvZiBgPGN1c3RvbS1zdHlsZT5gIHNob3VsZCBzdGF5IHRoZSBzYW1lIGFzIHdoZW4gbG9hZGVkIGJ5IEhUTUwgSW1wb3J0cywgYnV0IHRoZXJlIG1heSBiZSBvZGQKICAgICAgY2FzZXMgb2Ygb3JkZXJpbmcgdy5yLnQgdGhlIG1haW4gZG9jdW1lbnQgc3R5bGVzLgogICAgICAqLwogICAgICBpZiAodGhpcy5vd25lckRvY3VtZW50ICE9PSB3aW5kb3cuZG9jdW1lbnQpIHsKICAgICAgICB3aW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fc3R5bGU7CiAgICB9CiAgfQoKICB3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjdXN0b20tc3R5bGUnLCBDdXN0b21TdHlsZSk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkN1c3RvbVN0eWxlID0gQ3VzdG9tU3R5bGU7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IG11dGFibGVQcm9wZXJ0eUNoYW5nZTsKICAvKiogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gKi8KICAoKCkgPT4gewogICAgbXV0YWJsZVByb3BlcnR5Q2hhbmdlID0gUG9seW1lci5NdXRhYmxlRGF0YS5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlOwogIH0pKCk7CgogIC8qKgogICAqIExlZ2FjeSBlbGVtZW50IGJlaGF2aW9yIHRvIHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMsCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpIGZvciB1c2Ugb24gbGVnYWN5IEFQSSBQb2x5bWVyIGVsZW1lbnRzLgogICAqCiAgICogQnkgZGVmYXVsdCwgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBwZXJmb3JtcyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgb24KICAgKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGFueSBkZWVwIG1vZGlmaWNhdGlvbnMgdG8gYW4gb2JqZWN0IG9yIGFycmF5IHdpbGwKICAgKiBub3QgYmUgcHJvcGFnYXRlZCB1bmxlc3MgImltbXV0YWJsZSIgZGF0YSBwYXR0ZXJucyBhcmUgdXNlZCAoaS5lLiBhbGwgb2JqZWN0CiAgICogcmVmZXJlbmNlcyBmcm9tIHRoZSByb290IHRvIHRoZSBtdXRhdGlvbiB3ZXJlIGNoYW5nZWQpLgogICAqCiAgICogUG9seW1lciBhbHNvIHByb3ZpZGVzIGEgcHJvcHJpZXRhcnkgZGF0YSBtdXRhdGlvbiBhbmQgcGF0aCBub3RpZmljYXRpb24gQVBJCiAgICogKGUuZy4gYG5vdGlmeVBhdGhgLCBgc2V0YCwgYW5kIGFycmF5IG11dGF0aW9uIEFQSSdzKSB0aGF0IGFsbG93IGVmZmljaWVudAogICAqIG11dGF0aW9uIGFuZCBub3RpZmljYXRpb24gb2YgZGVlcCBjaGFuZ2VzIGluIGFuIG9iamVjdCBncmFwaCB0byBhbGwgZWxlbWVudHMKICAgKiBib3VuZCB0byB0aGUgc2FtZSBvYmplY3QgZ3JhcGguCiAgICoKICAgKiBJbiBjYXNlcyB3aGVyZSBuZWl0aGVyIGltbXV0YWJsZSBwYXR0ZXJucyBub3IgdGhlIGRhdGEgbXV0YXRpb24gQVBJIGNhbiBiZQogICAqIHVzZWQsIGFwcGx5aW5nIHRoaXMgbWl4aW4gd2lsbCBjYXVzZSBQb2x5bWVyIHRvIHNraXAgZGlydHkgY2hlY2tpbmcgZm9yCiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKS4gIFRoaXMgYWxsb3dzIGEKICAgKiB1c2VyIHRvIG1ha2UgYSBkZWVwIG1vZGlmaWNhdGlvbiB0byBhIGJvdW5kIG9iamVjdCBncmFwaCwgYW5kIHRoZW4gZWl0aGVyCiAgICogc2ltcGx5IHJlLXNldCB0aGUgb2JqZWN0IChlLmcuIGB0aGlzLml0ZW1zID0gdGhpcy5pdGVtc2ApIG9yIGNhbGwgYG5vdGlmeVBhdGhgCiAgICogKGUuZy4gYHRoaXMubm90aWZ5UGF0aCgnaXRlbXMnKWApIHRvIHVwZGF0ZSB0aGUgdHJlZS4gIE5vdGUgdGhhdCBhbGwKICAgKiBlbGVtZW50cyB0aGF0IHdpc2ggdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBkZWVwIG11dGF0aW9ucyBtdXN0IGFwcGx5IHRoaXMKICAgKiBtaXhpbiBvciBvdGhlcndpc2Ugc2tpcCBzdHJpY3QgZGlydHkgY2hlY2tpbmcgZm9yIG9iamVjdHMvYXJyYXlzLgogICAqIFNwZWNpZmljYWxseSwgYW55IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIHRyZWUgYmV0d2VlbiB0aGUgc291cmNlIG9mIGEKICAgKiBtdXRhdGlvbiBhbmQgdGhlIGNvbnN1bXB0aW9uIG9mIGl0IG11c3QgYXBwbHkgdGhpcyBiZWhhdmlvciBvciBlbmFibGUgdGhlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIGRpcnR5IGNoZWNrIHN0cmF0ZWd5IGNvbmZpZ3VyYWJsZSwgc2VlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQHBvbHltZXJCZWhhdmlvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQmVoYXZpb3IgdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk11dGFibGVEYXRhQmVoYXZpb3IgPSB7CgogICAgLyoqCiAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCB0byBwcm92aWRlIG9wdGlvbiBmb3Igc2tpcHBpbmcKICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYAogICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdHJ1ZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogTGVnYWN5IGVsZW1lbnQgYmVoYXZpb3IgdG8gYWRkIHRoZSBvcHRpb25hbCBhYmlsaXR5IHRvIHNraXAgc3RyaWN0CiAgICogZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgKiAiZGlydHkiKSBieSBzZXR0aW5nIGEgYG11dGFibGUtZGF0YWAgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgaW5zdGFuY2UuCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBlbmFibGUgdGhpcyBiZWhhdmlvciBvciBhcHBseSB0aGUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JgLgogICAqCiAgICogV2hpbGUgdGhpcyBiZWhhdmlvciBhZGRzIHRoZSBhYmlsaXR5IHRvIGZvcmdvIE9iamVjdC9BcnJheSBkaXJ0eSBjaGVja2luZywKICAgKiB0aGUgYG11dGFibGVEYXRhYCBmbGFnIGRlZmF1bHRzIHRvIGZhbHNlIGFuZCBtdXN0IGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCiAgICoKICAgKiBOb3RlLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIHByb3BhZ2F0aW5nIGxhcmdlIG9iamVjdCBncmFwaHMKICAgKiB3aWxsIGJlIHdvcnNlIGJ5IHJlbHlpbmcgb24gYG11dGFibGVEYXRhOiB0cnVlYCBhcyBvcHBvc2VkIHRvIHVzaW5nCiAgICogc3RyaWN0IGRpcnR5IGNoZWNraW5nIHdpdGggaW1tdXRhYmxlIHBhdHRlcm5zIG9yIFBvbHltZXIncyBwYXRoIG5vdGlmaWNhdGlvbgogICAqIEFQSS4KICAgKgogICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEJlaGF2aW9yIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvciA9IHsKCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIC8qKgogICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICogZm9yIHRoaXMgZWxlbWVudC4gIFdoZW4gdHJ1ZSwgT2JqZWN0cyBhbmQgQXJyYXlzIHdpbGwgc2tpcCBkaXJ0eQogICAgICAgKiBjaGVja2luZywgb3RoZXJ3aXNlIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyB3aWxsIGJlIHVzZWQuCiAgICAgICAqLwogICAgICBtdXRhYmxlRGF0YTogQm9vbGVhbgogICAgfSwKCiAgICAvKioKICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHNraXAgc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nCiAgICAgKiBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICogKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0aGlzLm11dGFibGVEYXRhKTsKICAgIH0KICB9OwoKfSkoKTsKCgoKICAvLyBiYwogIFBvbHltZXIuQmFzZSA9IFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKEhUTUxFbGVtZW50KS5wcm90b3R5cGU7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1mbGV4LWxheW91dC9pcm9uLWZsZXgtbGF5b3V0Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiLnRleHRDb250ZW50PSJbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChiKX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IvaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKHcsQyl7dmFyIEc9IiI7aWYodylpZih3PXcudG9Mb3dlckNhc2UoKSwiICI9PT13fHxBLnRlc3QodykpRz0ic3BhY2UiO2Vsc2UgaWYoeS50ZXN0KHcpKUc9ImVzYyI7ZWxzZSBpZigxPT13Lmxlbmd0aCl7aWYoIUN8fHEudGVzdCh3KSlHPXd9ZWxzZSBHPXgudGVzdCh3KT93LnJlcGxhY2UoImFycm93IiwiIik6Im11bHRpcGx5Ij09dz8iKiI6dztyZXR1cm4gR31mdW5jdGlvbiBkKHcpe3ZhciBDPSIiO3cmJih3IGluIHA/Qz1wW3ddOnUudGVzdCh3KT8odz1wYXJzZUludCh3LnJlcGxhY2UoIlUrIiwiMHgiKSwxNiksQz1TdHJpbmcuZnJvbUNoYXJDb2RlKHcpLnRvTG93ZXJDYXNlKCkpOkM9dy50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gQ31mdW5jdGlvbiBmKHcpe3ZhciBDPSIiO051bWJlcih3KSYmKEM9NjU8PXcmJjkwPj13P1N0cmluZy5mcm9tQ2hhckNvZGUoMzIrdyk6MTEyPD13JiYxMjM+PXc/ImYiKyh3LTExMisxKTo0ODw9dyYmNTc+PXc/ClN0cmluZyh3LTQ4KTo5Njw9dyYmMTA1Pj13P1N0cmluZyh3LTk2KTptW3ddKTtyZXR1cm4gQ31mdW5jdGlvbiBoKHcsQyl7cmV0dXJuIHcua2V5P2Iody5rZXksQyk6dy5kZXRhaWwmJncuZGV0YWlsLmtleT9iKHcuZGV0YWlsLmtleSxDKTpkKHcua2V5SWRlbnRpZmllcil8fGYody5rZXlDb2RlKXx8IiJ9ZnVuY3Rpb24gayh3LEMpe3JldHVybiBoKEMsdy5oYXNNb2RpZmllcnMpPT09dy5rZXkmJighdy5oYXNNb2RpZmllcnN8fCEhQy5zaGlmdEtleT09PSEhdy5zaGlmdEtleSYmISFDLmN0cmxLZXk9PT0hIXcuY3RybEtleSYmISFDLmFsdEtleT09PSEhdy5hbHRLZXkmJiEhQy5tZXRhS2V5PT09ISF3Lm1ldGFLZXkpfWZ1bmN0aW9uIHQodyl7cmV0dXJuIDE9PT13Lmxlbmd0aD97Y29tYm86dyxrZXk6dyxldmVudDoia2V5ZG93biJ9Oncuc3BsaXQoIisiKS5yZWR1Y2UoZnVuY3Rpb24oQyxHKXt2YXIgRD1HLnNwbGl0KCI6Iik7Rz1EWzBdO0Q9RFsxXTtHIGluIG4/KENbbltHXV09ITAsCkMuaGFzTW9kaWZpZXJzPSEwKTooQy5rZXk9RyxDLmV2ZW50PUR8fCJrZXlkb3duIik7cmV0dXJuIEN9LHtjb21ibzp3LnNwbGl0KCI6Iikuc2hpZnQoKX0pfWZ1bmN0aW9uIGwodyl7cmV0dXJuIHcudHJpbSgpLnNwbGl0KCIgIikubWFwKGZ1bmN0aW9uKEMpe3JldHVybiB0KEMpfSl9dmFyIHA9eyJVKzAwMDgiOiJiYWNrc3BhY2UiLCJVKzAwMDkiOiJ0YWIiLCJVKzAwMUIiOiJlc2MiLCJVKzAwMjAiOiJzcGFjZSIsIlUrMDA3RiI6ImRlbCJ9LG09ezg6ImJhY2tzcGFjZSIsOToidGFiIiwxMzoiZW50ZXIiLDI3OiJlc2MiLDMzOiJwYWdldXAiLDM0OiJwYWdlZG93biIsMzU6ImVuZCIsMzY6ImhvbWUiLDMyOiJzcGFjZSIsMzc6ImxlZnQiLDM4OiJ1cCIsMzk6InJpZ2h0Iiw0MDoiZG93biIsNDY6ImRlbCIsMTA2OiIqIn0sbj17c2hpZnQ6InNoaWZ0S2V5IixjdHJsOiJjdHJsS2V5IixhbHQ6ImFsdEtleSIsbWV0YToibWV0YUtleSJ9LHE9L1thLXowLTkqXS8sdT0vVVwrLyx4PS9eYXJyb3cvLApBPS9ec3BhY2UoYmFyKT8vLHk9L15lc2NhcGUkLztQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntrZXlFdmVudFRhcmdldDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LHN0b3BLZXlib2FyZEV2ZW50UHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kS2V5SGFuZGxlcnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9pbXBlcmF0aXZlS2V5QmluZGluZ3M6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoa2V5RXZlbnRUYXJnZXQsIF9ib3VuZEtleUhhbmRsZXJzKSJdLGtleUJpbmRpbmdzOnt9LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sCmFkZE93bktleUJpbmRpbmc6ZnVuY3Rpb24odyxDKXt0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3Nbd109Qzt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKTt0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCl9LHJlbW92ZU93bktleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzPXt9O3RoaXMuX3ByZXBLZXlCaW5kaW5ncygpO3RoaXMuX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoKX0sa2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzOmZ1bmN0aW9uKHcsQyl7Qz1sKEMpO2Zvcih2YXIgRz0wO0c8Qy5sZW5ndGg7KytHKWlmKGsoQ1tHXSx3KSlyZXR1cm4hMDtyZXR1cm4hMX0sX2NvbGxlY3RLZXlCaW5kaW5nczpmdW5jdGlvbigpe3ZhciB3PXRoaXMuYmVoYXZpb3JzLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gQy5rZXlCaW5kaW5nc30pOy0xPT09dy5pbmRleE9mKHRoaXMua2V5QmluZGluZ3MpJiZ3LnB1c2godGhpcy5rZXlCaW5kaW5ncyk7cmV0dXJuIHd9LApfcHJlcEtleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5fa2V5QmluZGluZ3M9e307dGhpcy5fY29sbGVjdEtleUJpbmRpbmdzKCkuZm9yRWFjaChmdW5jdGlvbihHKXtmb3IodmFyIEQgaW4gRyl0aGlzLl9hZGRLZXlCaW5kaW5nKEQsR1tEXSl9LHRoaXMpO2Zvcih2YXIgdyBpbiB0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3MpdGhpcy5fYWRkS2V5QmluZGluZyh3LHRoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5nc1t3XSk7Zm9yKHZhciBDIGluIHRoaXMuX2tleUJpbmRpbmdzKXRoaXMuX2tleUJpbmRpbmdzW0NdLnNvcnQoZnVuY3Rpb24oRyxEKXtHPUdbMF0uaGFzTW9kaWZpZXJzO3JldHVybiBHPT09RFswXS5oYXNNb2RpZmllcnM/MDpHPy0xOjF9KX0sX2FkZEtleUJpbmRpbmc6ZnVuY3Rpb24odyxDKXtsKHcpLmZvckVhY2goZnVuY3Rpb24oRyl7dGhpcy5fa2V5QmluZGluZ3NbRy5ldmVudF09dGhpcy5fa2V5QmluZGluZ3NbRy5ldmVudF18fFtdO3RoaXMuX2tleUJpbmRpbmdzW0cuZXZlbnRdLnB1c2goW0csCkNdKX0sdGhpcyl9LF9yZXNldEtleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdW5saXN0ZW5LZXlFdmVudExpc3RlbmVycygpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5rZXlFdmVudFRhcmdldCYmT2JqZWN0LmtleXModGhpcy5fa2V5QmluZGluZ3MpLmZvckVhY2goZnVuY3Rpb24odyl7dmFyIEM9dGhpcy5fb25LZXlCaW5kaW5nRXZlbnQuYmluZCh0aGlzLHRoaXMuX2tleUJpbmRpbmdzW3ddKTt0aGlzLl9ib3VuZEtleUhhbmRsZXJzLnB1c2goW3RoaXMua2V5RXZlbnRUYXJnZXQsdyxDXSk7dGhpcy5rZXlFdmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHcsQyl9LHRoaXMpfSxfdW5saXN0ZW5LZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe2Zvcih2YXIgdyxDLEc7dGhpcy5fYm91bmRLZXlIYW5kbGVycy5sZW5ndGg7KXc9dGhpcy5fYm91bmRLZXlIYW5kbGVycy5wb3AoKSwKQz13WzBdLEc9d1sxXSx3PXdbMl0sQy5yZW1vdmVFdmVudExpc3RlbmVyKEcsdyl9LF9vbktleUJpbmRpbmdFdmVudDpmdW5jdGlvbih3LEMpe3RoaXMuc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbiYmQy5zdG9wUHJvcGFnYXRpb24oKTtpZighQy5kZWZhdWx0UHJldmVudGVkKWZvcih2YXIgRz0wO0c8dy5sZW5ndGg7RysrKXt2YXIgRD13W0ddWzBdLEI9d1tHXVsxXTtpZihrKEQsQykmJih0aGlzLl90cmlnZ2VyS2V5SGFuZGxlcihELEIsQyksQy5kZWZhdWx0UHJldmVudGVkKSlicmVha319LF90cmlnZ2VyS2V5SGFuZGxlcjpmdW5jdGlvbih3LEMsRyl7dmFyIEQ9T2JqZWN0LmNyZWF0ZSh3KTtELmtleWJvYXJkRXZlbnQ9Rzt3PW5ldyBDdXN0b21FdmVudCh3LmV2ZW50LHtkZXRhaWw6RCxjYW5jZWxhYmxlOiEwfSk7dGhpc1tDXS5jYWxsKHRoaXMsdyk7dy5kZWZhdWx0UHJldmVudGVkJiZHLnByZXZlbnREZWZhdWx0KCl9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1jb250cm9sLXN0YXRlLmh0bWwuanMKUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlPXtwcm9wZXJ0aWVzOntmb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX29sZFRhYkluZGV4Ont0eXBlOlN0cmluZ30sX2JvdW5kRm9jdXNCbHVySGFuZGxlcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb2N1c0JsdXJIYW5kbGVyLmJpbmQodGhpcyl9fSxfX2hhbmRsZUV2ZW50UmV0YXJnZXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLnNoYWRvd1Jvb3QmJiFQb2x5bWVyLkVsZW1lbnR9fX0sb2JzZXJ2ZXJzOlsiX2NoYW5nZWRDb250cm9sU3RhdGUoZm9jdXNlZCwgZGlzYWJsZWQpIl0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwKdGhpcy5fYm91bmRGb2N1c0JsdXJIYW5kbGVyLCEwKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwhMCl9LF9mb2N1c0JsdXJIYW5kbGVyOmZ1bmN0aW9uKGIpe2lmKFBvbHltZXIuRWxlbWVudCl0aGlzLl9zZXRGb2N1c2VkKCJmb2N1cyI9PT1iLnR5cGUpO2Vsc2UgaWYoYi50YXJnZXQ9PT10aGlzKXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWIudHlwZSk7ZWxzZSBpZih0aGlzLl9faGFuZGxlRXZlbnRSZXRhcmdldGluZyl7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8dGhpcy5maXJlKGIudHlwZSx7c291cmNlRXZlbnQ6Yn0se25vZGU6dGhpcyxidWJibGVzOmIuYnViYmxlcyxjYW5jZWxhYmxlOmIuY2FuY2VsYWJsZX0pfX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsYj8idHJ1ZSI6ImZhbHNlIik7CnRoaXMuc3R5bGUucG9pbnRlckV2ZW50cz1iPyJub25lIjoiIjtiPyh0aGlzLl9vbGRUYWJJbmRleD10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLnRhYkluZGV4PS0xLHRoaXMuYmx1cigpKTp2b2lkIDAhPT10aGlzLl9vbGRUYWJJbmRleCYmKG51bGw9PT10aGlzLl9vbGRUYWJJbmRleD90aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKTp0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLHRoaXMuX29sZFRhYkluZGV4KSl9LF9jaGFuZ2VkQ29udHJvbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1idXR0b24tc3RhdGUuaHRtbC5qcwpQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGw9e3Byb3BlcnRpZXM6e3ByZXNzZWQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9wcmVzc2VkQ2hhbmdlZCJ9LHRvZ2dsZXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHBvaW50ZXJEb3duOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITF9LHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMH0sYXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtcHJlc3NlZCIsb2JzZXJ2ZXI6Il9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZCJ9fSxsaXN0ZW5lcnM6e2Rvd246Il9kb3duSGFuZGxlciIsdXA6Il91cEhhbmRsZXIiLHRhcDoiX3RhcEhhbmRsZXIifSwKb2JzZXJ2ZXJzOlsiX2ZvY3VzQ2hhbmdlZChmb2N1c2VkKSIsIl9hY3RpdmVDaGFuZ2VkKGFjdGl2ZSwgYXJpYUFjdGl2ZUF0dHJpYnV0ZSkiXSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfYXN5bmNDbGljayIsInNwYWNlOmtleWRvd24iOiJfc3BhY2VLZXlEb3duSGFuZGxlciIsInNwYWNlOmtleXVwIjoiX3NwYWNlS2V5VXBIYW5kbGVyIn0sX21vdXNlRXZlbnRSZTovXm1vdXNlLyxfdGFwSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMudG9nZ2xlcz90aGlzLl91c2VyQWN0aXZhdGUoIXRoaXMuYWN0aXZlKTp0aGlzLmFjdGl2ZT0hMX0sX2ZvY3VzQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9kZXRlY3RLZXlib2FyZEZvY3VzKGIpO2J8fHRoaXMuX3NldFByZXNzZWQoITEpfSxfZGV0ZWN0S2V5Ym9hcmRGb2N1czpmdW5jdGlvbihiKXt0aGlzLl9zZXRSZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKCF0aGlzLnBvaW50ZXJEb3duJiZiKX0sX3VzZXJBY3RpdmF0ZTpmdW5jdGlvbihiKXt0aGlzLmFjdGl2ZSE9PQpiJiYodGhpcy5hY3RpdmU9Yix0aGlzLmZpcmUoImNoYW5nZSIpKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITApO3RoaXMuX3NldFByZXNzZWQoITApO3RoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoITEpfSxfdXBIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITEpO3RoaXMuX3NldFByZXNzZWQoITEpfSxfc3BhY2VLZXlEb3duSGFuZGxlcjpmdW5jdGlvbihiKXtiPWIuZGV0YWlsLmtleWJvYXJkRXZlbnQ7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8KGIucHJldmVudERlZmF1bHQoKSxiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuX3NldFByZXNzZWQoITApKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGIpe2I9UG9seW1lci5kb20oYi5kZXRhaWwua2V5Ym9hcmRFdmVudCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChiKXx8Cih0aGlzLnByZXNzZWQmJnRoaXMuX2FzeW5jQ2xpY2soKSx0aGlzLl9zZXRQcmVzc2VkKCExKSl9LF9hc3luY0NsaWNrOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuY2xpY2soKX0sMSl9LF9wcmVzc2VkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYW5nZWRCdXR0b25TdGF0ZSgpfSxfYXJpYUFjdGl2ZUF0dHJpYnV0ZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiZkIT1iJiZ0aGlzLmhhc0F0dHJpYnV0ZShkKSYmdGhpcy5yZW1vdmVBdHRyaWJ1dGUoZCl9LF9hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMudG9nZ2xlcz90aGlzLnNldEF0dHJpYnV0ZSh0aGlzLmFyaWFBY3RpdmVBdHRyaWJ1dGUsYj8idHJ1ZSI6ImZhbHNlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlKTt0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NvbnRyb2xTdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkP3RoaXMuX3NldFByZXNzZWQoITEpOgp0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NoYW5nZWRCdXR0b25TdGF0ZTpmdW5jdGlvbigpe3RoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCYmdGhpcy5fYnV0dG9uU3RhdGVDaGFuZ2VkKCl9fTtQb2x5bWVyLklyb25CdXR0b25TdGF0ZT1bUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJpcHBsZS9wYXBlci1yaXBwbGUuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGgpe3RoaXMuZWxlbWVudD1oO3RoaXMud2lkdGg9dGhpcy5ib3VuZGluZ1JlY3Qud2lkdGg7dGhpcy5oZWlnaHQ9dGhpcy5ib3VuZGluZ1JlY3QuaGVpZ2h0O3RoaXMuc2l6ZT1NYXRoLm1heCh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX1mdW5jdGlvbiBkKGgpe3RoaXMuZWxlbWVudD1oO3RoaXMuY29sb3I9d2luZG93LmdldENvbXB1dGVkU3R5bGUoaCkuY29sb3I7dGhpcy53YXZlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMud2F2ZUNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLndhdmUuc3R5bGUuYmFja2dyb3VuZENvbG9yPXRoaXMuY29sb3I7dGhpcy53YXZlLmNsYXNzTGlzdC5hZGQoIndhdmUiKTt0aGlzLndhdmVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgid2F2ZS1jb250YWluZXIiKTtQb2x5bWVyLmRvbSh0aGlzLndhdmVDb250YWluZXIpLmFwcGVuZENoaWxkKHRoaXMud2F2ZSk7dGhpcy5yZXNldEludGVyYWN0aW9uU3RhdGUoKX0KdmFyIGY9e2Rpc3RhbmNlOmZ1bmN0aW9uKGgsayx0LGwpe2gtPXQ7ay09bDtyZXR1cm4gTWF0aC5zcXJ0KGgqaCtrKmspfSxub3c6d2luZG93LnBlcmZvcm1hbmNlJiZ3aW5kb3cucGVyZm9ybWFuY2Uubm93P3dpbmRvdy5wZXJmb3JtYW5jZS5ub3cuYmluZCh3aW5kb3cucGVyZm9ybWFuY2UpOkRhdGUubm93fTtiLnByb3RvdHlwZT17Z2V0IGJvdW5kaW5nUmVjdCgpe3JldHVybiB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9LGZ1cnRoZXN0Q29ybmVyRGlzdGFuY2VGcm9tOmZ1bmN0aW9uKGgsayl7dmFyIHQ9Zi5kaXN0YW5jZShoLGssMCwwKSxsPWYuZGlzdGFuY2UoaCxrLHRoaXMud2lkdGgsMCkscD1mLmRpc3RhbmNlKGgsaywwLHRoaXMuaGVpZ2h0KTtoPWYuZGlzdGFuY2UoaCxrLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO3JldHVybiBNYXRoLm1heCh0LGwscCxoKX19O2QuTUFYX1JBRElVUz0zMDA7ZC5wcm90b3R5cGU9e2dldCByZWNlbnRlcnMoKXtyZXR1cm4gdGhpcy5lbGVtZW50LnJlY2VudGVyc30sCmdldCBjZW50ZXIoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmNlbnRlcn0sZ2V0IG1vdXNlRG93bkVsYXBzZWQoKXtpZighdGhpcy5tb3VzZURvd25TdGFydClyZXR1cm4gMDt2YXIgaD1mLm5vdygpLXRoaXMubW91c2VEb3duU3RhcnQ7dGhpcy5tb3VzZVVwU3RhcnQmJihoLT10aGlzLm1vdXNlVXBFbGFwc2VkKTtyZXR1cm4gaH0sZ2V0IG1vdXNlVXBFbGFwc2VkKCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P2Yubm93KCktdGhpcy5tb3VzZVVwU3RhcnQ6MH0sZ2V0IG1vdXNlRG93bkVsYXBzZWRTZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VEb3duRWxhcHNlZC8xRTN9LGdldCBtb3VzZVVwRWxhcHNlZFNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZVVwRWxhcHNlZC8xRTN9LGdldCBtb3VzZUludGVyYWN0aW9uU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlRG93bkVsYXBzZWRTZWNvbmRzK3RoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzfSxnZXQgaW5pdGlhbE9wYWNpdHkoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmluaXRpYWxPcGFjaXR5fSwKZ2V0IG9wYWNpdHlEZWNheVZlbG9jaXR5KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5vcGFjaXR5RGVjYXlWZWxvY2l0eX0sZ2V0IHJhZGl1cygpe3ZhciBoPTEuMSpNYXRoLm1pbihNYXRoLnNxcnQodGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoKnRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCt0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KnRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQpLGQuTUFYX1JBRElVUykrNTtyZXR1cm4gTWF0aC5hYnMoaCooMS1NYXRoLnBvdyg4MCwtKHRoaXMubW91c2VJbnRlcmFjdGlvblNlY29uZHMvKDEuMS1oL2QuTUFYX1JBRElVUyouMikpKSkpfSxnZXQgb3BhY2l0eSgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD9NYXRoLm1heCgwLHRoaXMuaW5pdGlhbE9wYWNpdHktdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHMqdGhpcy5vcGFjaXR5RGVjYXlWZWxvY2l0eSk6dGhpcy5pbml0aWFsT3BhY2l0eX0sZ2V0IG91dGVyT3BhY2l0eSgpe3JldHVybiBNYXRoLm1heCgwLApNYXRoLm1pbiguMyp0aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kcyx0aGlzLm9wYWNpdHkpKX0sZ2V0IGlzT3BhY2l0eUZ1bGx5RGVjYXllZCgpe3JldHVybi4wMT50aGlzLm9wYWNpdHkmJnRoaXMucmFkaXVzPj1NYXRoLm1pbih0aGlzLm1heFJhZGl1cyxkLk1BWF9SQURJVVMpfSxnZXQgaXNSZXN0aW5nQXRNYXhSYWRpdXMoKXtyZXR1cm4gdGhpcy5vcGFjaXR5Pj10aGlzLmluaXRpYWxPcGFjaXR5JiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsZC5NQVhfUkFESVVTKX0sZ2V0IGlzQW5pbWF0aW9uQ29tcGxldGUoKXtyZXR1cm4gdGhpcy5tb3VzZVVwU3RhcnQ/dGhpcy5pc09wYWNpdHlGdWxseURlY2F5ZWQ6dGhpcy5pc1Jlc3RpbmdBdE1heFJhZGl1c30sZ2V0IHRyYW5zbGF0aW9uRnJhY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4oMSx0aGlzLnJhZGl1cy90aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSoyL01hdGguc3FydCgyKSl9LGdldCB4Tm93KCl7cmV0dXJuIHRoaXMueEVuZD8KdGhpcy54U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnhFbmQtdGhpcy54U3RhcnQpOnRoaXMueFN0YXJ0fSxnZXQgeU5vdygpe3JldHVybiB0aGlzLnlFbmQ/dGhpcy55U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnlFbmQtdGhpcy55U3RhcnQpOnRoaXMueVN0YXJ0fSxnZXQgaXNNb3VzZURvd24oKXtyZXR1cm4gdGhpcy5tb3VzZURvd25TdGFydCYmIXRoaXMubW91c2VVcFN0YXJ0fSxyZXNldEludGVyYWN0aW9uU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLnNsaWRlRGlzdGFuY2U9dGhpcy55RW5kPXRoaXMueEVuZD10aGlzLnlTdGFydD10aGlzLnhTdGFydD10aGlzLm1vdXNlVXBTdGFydD10aGlzLm1vdXNlRG93blN0YXJ0PXRoaXMubWF4UmFkaXVzPTA7dGhpcy5jb250YWluZXJNZXRyaWNzPW5ldyBiKHRoaXMuZWxlbWVudCl9LGRyYXc6ZnVuY3Rpb24oKXt0aGlzLndhdmUuc3R5bGUub3BhY2l0eT10aGlzLm9wYWNpdHk7dmFyIGg9dGhpcy5yYWRpdXMvCih0aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZS8yKTt2YXIgaz10aGlzLnhOb3ctdGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzI7dmFyIHQ9dGhpcy55Tm93LXRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMjt0aGlzLndhdmVDb250YWluZXIuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJ0cmFuc2xhdGUoIitrKyJweCwgIit0KyJweCkiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIraysicHgsICIrdCsicHgsIDApIjt0aGlzLndhdmUuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZSgiK2grIiwiK2grIikiO3RoaXMud2F2ZS5zdHlsZS50cmFuc2Zvcm09InNjYWxlM2QoIitoKyIsIitoKyIsMSkifSxkb3duQWN0aW9uOmZ1bmN0aW9uKGgpe3ZhciBrPXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yLHQ9dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yO3RoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCk7dGhpcy5tb3VzZURvd25TdGFydD0KZi5ub3coKTt0aGlzLmNlbnRlcj8odGhpcy54U3RhcnQ9ayx0aGlzLnlTdGFydD10LHRoaXMuc2xpZGVEaXN0YW5jZT1mLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKToodGhpcy54U3RhcnQ9aD9oLmRldGFpbC54LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QubGVmdDp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMix0aGlzLnlTdGFydD1oP2guZGV0YWlsLnktdGhpcy5jb250YWluZXJNZXRyaWNzLmJvdW5kaW5nUmVjdC50b3A6dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yKTt0aGlzLnJlY2VudGVycyYmKHRoaXMueEVuZD1rLHRoaXMueUVuZD10LHRoaXMuc2xpZGVEaXN0YW5jZT1mLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKTt0aGlzLm1heFJhZGl1cz10aGlzLmNvbnRhaW5lck1ldHJpY3MuZnVydGhlc3RDb3JuZXJEaXN0YW5jZUZyb20odGhpcy54U3RhcnQsCnRoaXMueVN0YXJ0KTt0aGlzLndhdmVDb250YWluZXIuc3R5bGUudG9wPSh0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKS8yKyJweCI7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLmxlZnQ9KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSsicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4In0sdXBBY3Rpb246ZnVuY3Rpb24oKXt0aGlzLmlzTW91c2VEb3duJiYodGhpcy5tb3VzZVVwU3RhcnQ9Zi5ub3coKSl9LHJlbW92ZTpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMud2F2ZUNvbnRhaW5lci5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZCh0aGlzLndhdmVDb250YWluZXIpfX07UG9seW1lcih7aXM6InBhcGVyLXJpcHBsZSIsCmJlaGF2aW9yczpbUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl0scHJvcGVydGllczp7aW5pdGlhbE9wYWNpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi4yNX0sb3BhY2l0eURlY2F5VmVsb2NpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi44fSxyZWNlbnRlcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJpcHBsZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LGFuaW1hdGluZzp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0saG9sZERvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hvbGREb3duQ2hhbmdlZCJ9LG5vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hbmltYXRpbmc6e3R5cGU6Qm9vbGVhbn0sX2JvdW5kQW5pbWF0ZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFuaW1hdGUuYmluZCh0aGlzKX19fSwKZ2V0IHRhcmdldCgpe3JldHVybiB0aGlzLmtleUV2ZW50VGFyZ2V0fSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfb25FbnRlcktleWRvd24iLCJzcGFjZTprZXlkb3duIjoiX29uU3BhY2VLZXlkb3duIiwic3BhY2U6a2V5dXAiOiJfb25TcGFjZUtleXVwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgaD10aGlzLmtleUV2ZW50VGFyZ2V0PTExPT10aGlzLnBhcmVudE5vZGUubm9kZVR5cGU/UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCkuaG9zdDp0aGlzLnBhcmVudE5vZGU7dGhpcy5saXN0ZW4oaCwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy5saXN0ZW4oaCwiZG93biIsInVpRG93bkFjdGlvbiIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5rZXlFdmVudFRhcmdldCwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy51bmxpc3Rlbih0aGlzLmtleUV2ZW50VGFyZ2V0LCJkb3duIiwidWlEb3duQWN0aW9uIik7dGhpcy5rZXlFdmVudFRhcmdldD0KbnVsbH0sZ2V0IHNob3VsZEtlZXBBbmltYXRpbmcoKXtmb3IodmFyIGg9MDtoPHRoaXMucmlwcGxlcy5sZW5ndGg7KytoKWlmKCF0aGlzLnJpcHBsZXNbaF0uaXNBbmltYXRpb25Db21wbGV0ZSlyZXR1cm4hMDtyZXR1cm4hMX0sc2ltdWxhdGVkUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5kb3duQWN0aW9uKG51bGwpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLnVwQWN0aW9uKCl9LDEpfSx1aURvd25BY3Rpb246ZnVuY3Rpb24oaCl7dGhpcy5ub2lua3x8dGhpcy5kb3duQWN0aW9uKGgpfSxkb3duQWN0aW9uOmZ1bmN0aW9uKGgpe3RoaXMuaG9sZERvd24mJjA8dGhpcy5yaXBwbGVzLmxlbmd0aHx8KHRoaXMuYWRkUmlwcGxlKCkuZG93bkFjdGlvbihoKSx0aGlzLl9hbmltYXRpbmd8fCh0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpKX0sdWlVcEFjdGlvbjpmdW5jdGlvbihoKXt0aGlzLm5vaW5rfHx0aGlzLnVwQWN0aW9uKGgpfSx1cEFjdGlvbjpmdW5jdGlvbihoKXt0aGlzLmhvbGREb3dufHwKKHRoaXMucmlwcGxlcy5mb3JFYWNoKGZ1bmN0aW9uKGspe2sudXBBY3Rpb24oaCl9KSx0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpfSxvbkFuaW1hdGlvbkNvbXBsZXRlOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW5nPSExO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj1udWxsO3RoaXMuZmlyZSgidHJhbnNpdGlvbmVuZCIpfSxhZGRSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgaD1uZXcgZCh0aGlzKTtQb2x5bWVyLmRvbSh0aGlzLiQud2F2ZXMpLmFwcGVuZENoaWxkKGgud2F2ZUNvbnRhaW5lcik7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZENvbG9yPWguY29sb3I7dGhpcy5yaXBwbGVzLnB1c2goaCk7dGhpcy5fc2V0QW5pbWF0aW5nKCEwKTtyZXR1cm4gaH0scmVtb3ZlUmlwcGxlOmZ1bmN0aW9uKGgpe3ZhciBrPXRoaXMucmlwcGxlcy5pbmRleE9mKGgpOzA+a3x8KHRoaXMucmlwcGxlcy5zcGxpY2UoaywxKSxoLnJlbW92ZSgpLAp0aGlzLnJpcHBsZXMubGVuZ3RofHx0aGlzLl9zZXRBbmltYXRpbmcoITEpKX0sYW5pbWF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX2FuaW1hdGluZyl7dmFyIGg7Zm9yKGg9MDtoPHRoaXMucmlwcGxlcy5sZW5ndGg7KytoKXt2YXIgaz10aGlzLnJpcHBsZXNbaF07ay5kcmF3KCk7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUub3BhY2l0eT1rLm91dGVyT3BhY2l0eTtrLmlzT3BhY2l0eUZ1bGx5RGVjYXllZCYmIWsuaXNSZXN0aW5nQXRNYXhSYWRpdXMmJnRoaXMucmVtb3ZlUmlwcGxlKGspfWlmKHRoaXMuc2hvdWxkS2VlcEFuaW1hdGluZ3x8MCE9PXRoaXMucmlwcGxlcy5sZW5ndGgpd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9ib3VuZEFuaW1hdGUpO2Vsc2UgdGhpcy5vbkFuaW1hdGlvbkNvbXBsZXRlKCl9fSxfb25FbnRlcktleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpO3RoaXMuYXN5bmModGhpcy51aVVwQWN0aW9uLDEpfSxfb25TcGFjZUtleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpfSwKX29uU3BhY2VLZXl1cDpmdW5jdGlvbigpe3RoaXMudWlVcEFjdGlvbigpfSxfaG9sZERvd25DaGFuZ2VkOmZ1bmN0aW9uKGgsayl7dm9pZCAwIT09ayYmKGg/dGhpcy5kb3duQWN0aW9uKCk6dGhpcy51cEFjdGlvbigpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLXJpcHBsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcj17cHJvcGVydGllczp7bm9pbms6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX25vaW5rQ2hhbmdlZCJ9LF9yaXBwbGVDb250YWluZXI6e3R5cGU6T2JqZWN0fX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZm9jdXNlZCYmdGhpcy5lbnN1cmVSaXBwbGUoKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fZG93bkhhbmRsZXIuY2FsbCh0aGlzLGIpO3RoaXMucHJlc3NlZCYmdGhpcy5lbnN1cmVSaXBwbGUoYil9LGVuc3VyZVJpcHBsZTpmdW5jdGlvbihiKXtpZighdGhpcy5oYXNSaXBwbGUoKSl7dGhpcy5fcmlwcGxlPXRoaXMuX2NyZWF0ZVJpcHBsZSgpO3RoaXMuX3JpcHBsZS5ub2luaz10aGlzLm5vaW5rO3ZhciBkPXRoaXMuX3JpcHBsZUNvbnRhaW5lcnx8dGhpcy5yb290O2QmJlBvbHltZXIuZG9tKGQpLmFwcGVuZENoaWxkKHRoaXMuX3JpcHBsZSk7aWYoYil7ZD0KUG9seW1lci5kb20odGhpcy5fcmlwcGxlQ29udGFpbmVyfHx0aGlzKTt2YXIgZj1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0O2QuZGVlcENvbnRhaW5zKGYpJiZ0aGlzLl9yaXBwbGUudWlEb3duQWN0aW9uKGIpfX19LGdldFJpcHBsZTpmdW5jdGlvbigpe3RoaXMuZW5zdXJlUmlwcGxlKCk7cmV0dXJuIHRoaXMuX3JpcHBsZX0saGFzUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9yaXBwbGV9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItcmlwcGxlIil9LF9ub2lua0NoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5ub2luaz1iKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJlaGF2aW9ycy9wYXBlci1idXR0b24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxyZWFkT25seTohMH19LG9ic2VydmVyczpbIl9jYWxjdWxhdGVFbGV2YXRpb24oZm9jdXNlZCwgZGlzYWJsZWQsIGFjdGl2ZSwgcHJlc3NlZCwgcmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiLCJfY29tcHV0ZUtleWJvYXJkQ2xhc3MocmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiXSxob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIix0YWJpbmRleDoiMCIsYW5pbWF0ZWQ6ITB9LF9jYWxjdWxhdGVFbGV2YXRpb246ZnVuY3Rpb24oKXt2YXIgYj0xO3RoaXMuZGlzYWJsZWQ/Yj0wOnRoaXMuYWN0aXZlfHx0aGlzLnByZXNzZWQ/Yj00OnRoaXMucmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCYmKGI9Myk7dGhpcy5fc2V0RWxldmF0aW9uKGIpfSxfY29tcHV0ZUtleWJvYXJkQ2xhc3M6ZnVuY3Rpb24oYil7dGhpcy50b2dnbGVDbGFzcygia2V5Ym9hcmQtZm9jdXMiLApiKX0sX3NwYWNlS2V5RG93bkhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uQnV0dG9uU3RhdGVJbXBsLl9zcGFjZUtleURvd25IYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLmhhc1JpcHBsZSgpJiYxPnRoaXMuZ2V0UmlwcGxlKCkucmlwcGxlcy5sZW5ndGgmJnRoaXMuX3JpcHBsZS51aURvd25BY3Rpb24oKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fc3BhY2VLZXlVcEhhbmRsZXIuY2FsbCh0aGlzLGIpO3RoaXMuaGFzUmlwcGxlKCkmJnRoaXMuX3JpcHBsZS51aVVwQWN0aW9uKCl9fTtQb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IsUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYnV0dG9uL3BhcGVyLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1idXR0b24iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntyYWlzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jYWxjdWxhdGVFbGV2YXRpb24ifX0sX2NhbGN1bGF0ZUVsZXZhdGlvbjpmdW5jdGlvbigpe3RoaXMucmFpc2VkP1BvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvckltcGwuX2NhbGN1bGF0ZUVsZXZhdGlvbi5hcHBseSh0aGlzKTp0aGlzLl9zZXRFbGV2YXRpb24oMCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1tZXRhL2lyb24tbWV0YS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbk1ldGE9ZnVuY3Rpb24oZCl7UG9seW1lci5Jcm9uTWV0YVsiICJdKGQpO3RoaXMudHlwZT1kJiZkLnR5cGV8fCJkZWZhdWx0Ijt0aGlzLmtleT1kJiZkLmtleTtkJiYidmFsdWUiaW4gZCYmKHRoaXMudmFsdWU9ZC52YWx1ZSl9O1BvbHltZXIuSXJvbk1ldGFbIiAiXT1mdW5jdGlvbigpe307UG9seW1lci5Jcm9uTWV0YS50eXBlcz17fTtQb2x5bWVyLklyb25NZXRhLnByb3RvdHlwZT17Z2V0IHZhbHVlKCl7dmFyIGQ9dGhpcy50eXBlLGY9dGhpcy5rZXk7aWYoZCYmZilyZXR1cm4gUG9seW1lci5Jcm9uTWV0YS50eXBlc1tkXSYmUG9seW1lci5Jcm9uTWV0YS50eXBlc1tkXVtmXX0sc2V0IHZhbHVlKGQpe3ZhciBmPXRoaXMudHlwZSxoPXRoaXMua2V5O2YmJmgmJihmPVBvbHltZXIuSXJvbk1ldGEudHlwZXNbZl09UG9seW1lci5Jcm9uTWV0YS50eXBlc1tmXXx8e30sbnVsbD09ZD9kZWxldGUgZltoXTpmW2hdPWQpfSxnZXQgbGlzdCgpe2lmKHRoaXMudHlwZSl7dmFyIGQ9ClBvbHltZXIuSXJvbk1ldGEudHlwZXNbdGhpcy50eXBlXTtyZXR1cm4gZD9PYmplY3Qua2V5cyhkKS5tYXAoZnVuY3Rpb24oZil7cmV0dXJuIGJbdGhpcy50eXBlXVtmXX0sdGhpcyk6W119fSxieUtleTpmdW5jdGlvbihkKXt0aGlzLmtleT1kO3JldHVybiB0aGlzLnZhbHVlfX07dmFyIGI9UG9seW1lci5Jcm9uTWV0YS50eXBlcztQb2x5bWVyKHtpczoiaXJvbi1tZXRhIixwcm9wZXJ0aWVzOnt0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiZGVmYXVsdCJ9LGtleTp7dHlwZTpTdHJpbmd9LHZhbHVlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGY6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX3NlbGZDaGFuZ2VkIn0sX19tZXRhOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9fY29tcHV0ZU1ldGEodHlwZSwga2V5LCB2YWx1ZSkifX0saG9zdEF0dHJpYnV0ZXM6e2hpZGRlbjohMH0sX19jb21wdXRlTWV0YTpmdW5jdGlvbihkLGYsaCl7ZD1uZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZTpkLAprZXk6Zn0pO3ZvaWQgMCE9PWgmJmghPT1kLnZhbHVlP2QudmFsdWU9aDp0aGlzLnZhbHVlIT09ZC52YWx1ZSYmKHRoaXMudmFsdWU9ZC52YWx1ZSk7cmV0dXJuIGR9LGdldCBsaXN0KCl7cmV0dXJuIHRoaXMuX19tZXRhJiZ0aGlzLl9fbWV0YS5saXN0fSxfc2VsZkNoYW5nZWQ6ZnVuY3Rpb24oZCl7ZCYmKHRoaXMudmFsdWU9dGhpcyl9LGJ5S2V5OmZ1bmN0aW9uKGQpe3JldHVybihuZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZTp0aGlzLnR5cGUsa2V5OmR9KSkudmFsdWV9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tdmFsaWRhdGFibGUtYmVoYXZpb3IvaXJvbi12YWxpZGF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhPW51bGw7ClBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3ZhbGlkYXRvcjp7dHlwZTpTdHJpbmd9LGludmFsaWQ6e25vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaW52YWxpZENoYW5nZWQifX0scmVnaXN0ZXJlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJ2YWxpZGF0b3IifSl9LF9pbnZhbGlkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuaW52YWxpZD90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWludmFsaWQiKX0sZ2V0IF92YWxpZGF0b3IoKXtyZXR1cm4gUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvck1ldGEmJlBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhLmJ5S2V5KHRoaXMudmFsaWRhdG9yKX0saGFzVmFsaWRhdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPQp0aGlzLl92YWxpZGF0b3J9LHZhbGlkYXRlOmZ1bmN0aW9uKGIpe3RoaXMuaW52YWxpZD12b2lkIDA9PT1iJiZ2b2lkIDAhPT10aGlzLnZhbHVlPyF0aGlzLl9nZXRWYWxpZGl0eSh0aGlzLnZhbHVlKTohdGhpcy5fZ2V0VmFsaWRpdHkoYik7cmV0dXJuIXRoaXMuaW52YWxpZH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmhhc1ZhbGlkYXRvcigpP3RoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZShiKTohMH19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZm9ybS1lbGVtZW50LWJlaGF2aW9yL2lyb24tZm9ybS1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcj17cHJvcGVydGllczp7bmFtZTp7dHlwZTpTdHJpbmd9LHZhbHVlOntub3RpZnk6ITAsdHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wYXJlbnRGb3JtOnt0eXBlOk9iamVjdH19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5FbGVtZW50fHx0aGlzLmZpcmUoImlyb24tZm9ybS1lbGVtZW50LXJlZ2lzdGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7IVBvbHltZXIuRWxlbWVudCYmdGhpcy5fcGFyZW50Rm9ybSYmdGhpcy5fcGFyZW50Rm9ybS5maXJlKCJpcm9uLWZvcm0tZWxlbWVudC11bnJlZ2lzdGVyIix7dGFyZ2V0OnRoaXN9KX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e2NoZWNrZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsbm90aWZ5OiEwLG9ic2VydmVyOiJfY2hlY2tlZENoYW5nZWQifSx0b2dnbGVzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9uIixvYnNlcnZlcjoiX3ZhbHVlQ2hhbmdlZCJ9fSxvYnNlcnZlcnM6WyJfcmVxdWlyZWRDaGFuZ2VkKHJlcXVpcmVkKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNJcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj0hMH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCF0aGlzLnJlcXVpcmVkfHx0aGlzLmNoZWNrZWR9LF9yZXF1aXJlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlcXVpcmVkP3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXJlcXVpcmVkIiwKInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIpfSxfY2hlY2tlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZT10aGlzLmNoZWNrZWQ7dGhpcy5maXJlKCJpcm9uLWNoYW5nZSIpfSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpcy52YWx1ZXx8bnVsbD09PXRoaXMudmFsdWUpdGhpcy52YWx1ZT0ib24ifX07UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj1bUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1iZWhhdmlvcnMvcGFwZXItaW5reS1mb2N1cy1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvckltcGw9e29ic2VydmVyczpbIl9mb2N1c2VkQ2hhbmdlZChyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSJdLF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbihiKXtiJiZ0aGlzLmVuc3VyZVJpcHBsZSgpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuaG9sZERvd249Yil9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2NyZWF0ZVJpcHBsZSgpO2IuaWQ9ImluayI7Yi5zZXRBdHRyaWJ1dGUoImNlbnRlciIsIiIpO2IuY2xhc3NMaXN0LmFkZCgiY2lyY2xlIik7cmV0dXJuIGJ9fTtQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IsUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLWNoZWNrZWQtZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbD17X2NoZWNrZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGwuX2NoZWNrZWRDaGFuZ2VkLmNhbGwodGhpcyk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuY2hlY2tlZD90aGlzLl9yaXBwbGUuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiIik6dGhpcy5fcmlwcGxlLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpKX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe1BvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvci5fYnV0dG9uU3RhdGVDaGFuZ2VkLmNhbGwodGhpcyk7IXRoaXMuZGlzYWJsZWQmJnRoaXMuaXNBdHRhY2hlZCYmKHRoaXMuY2hlY2tlZD10aGlzLmFjdGl2ZSl9fTsKUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3I9W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcixQb2x5bWVyLklyb25DaGVja2VkRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItY2hlY2tib3gvcGFwZXItY2hlY2tib3guaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItY2hlY2tib3giLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJjaGVja2JveCIsImFyaWEtY2hlY2tlZCI6ITEsdGFiaW5kZXg6MH0scHJvcGVydGllczp7YXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtY2hlY2tlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSIpLnRyaW0oKSl7dmFyIGI9dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplIikudHJpbSgpLGQ9InB4IixmPWIubWF0Y2goL1tBLVphLXpdKyQvKTtudWxsIT09ZiYmKGQ9ZlswXSk7Yj1wYXJzZUZsb2F0KGIpOwpmPTgvMypiOyJweCI9PT1kJiYoZj1NYXRoLmZsb29yKGYpLGYlMiE9PWIlMiYmZisrKTt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUiOmYrZH0pfX0pfSxfY29tcHV0ZUNoZWNrYm94Q2xhc3M6ZnVuY3Rpb24oYixkKXt2YXIgZj0iIjtiJiYoZis9ImNoZWNrZWQgIik7ZCYmKGYrPSJpbnZhbGlkIik7cmV0dXJuIGZ9LF9jb21wdXRlQ2hlY2ttYXJrQ2xhc3M6ZnVuY3Rpb24oYil7cmV0dXJuIGI/IiI6ImhpZGRlbiJ9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLmNoZWNrYm94Q29udGFpbmVyO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWljb24vaXJvbi1pY29uLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24taWNvbiIscHJvcGVydGllczp7aWNvbjp7dHlwZTpTdHJpbmd9LHRoZW1lOnt0eXBlOlN0cmluZ30sc3JjOnt0eXBlOlN0cmluZ30sX21ldGE6e3ZhbHVlOlBvbHltZXIuQmFzZS5jcmVhdGUoImlyb24tbWV0YSIse3R5cGU6Imljb25zZXQifSl9fSxvYnNlcnZlcnM6WyJfdXBkYXRlSWNvbihfbWV0YSwgaXNBdHRhY2hlZCkiLCJfdXBkYXRlSWNvbih0aGVtZSwgaXNBdHRhY2hlZCkiLCJfc3JjQ2hhbmdlZChzcmMsIGlzQXR0YWNoZWQpIiwiX2ljb25DaGFuZ2VkKGljb24sIGlzQXR0YWNoZWQpIl0sX0RFRkFVTFRfSUNPTlNFVDoiaWNvbnMiLF9pY29uQ2hhbmdlZDpmdW5jdGlvbihiKXtiPShifHwiIikuc3BsaXQoIjoiKTt0aGlzLl9pY29uTmFtZT1iLnBvcCgpO3RoaXMuX2ljb25zZXROYW1lPWIucG9wKCl8fHRoaXMuX0RFRkFVTFRfSUNPTlNFVDt0aGlzLl91cGRhdGVJY29uKCl9LF9zcmNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWNvbigpfSwKX3VzZXNJY29uc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWNvbnx8IXRoaXMuc3JjfSxfdXBkYXRlSWNvbjpmdW5jdGlvbigpe3RoaXMuX3VzZXNJY29uc2V0KCk/KHRoaXMuX2ltZyYmdGhpcy5faW1nLnBhcmVudE5vZGUmJlBvbHltZXIuZG9tKHRoaXMucm9vdCkucmVtb3ZlQ2hpbGQodGhpcy5faW1nKSwiIj09PXRoaXMuX2ljb25OYW1lP3RoaXMuX2ljb25zZXQmJnRoaXMuX2ljb25zZXQucmVtb3ZlSWNvbih0aGlzKTp0aGlzLl9pY29uc2V0TmFtZSYmdGhpcy5fbWV0YSYmKCh0aGlzLl9pY29uc2V0PXRoaXMuX21ldGEuYnlLZXkodGhpcy5faWNvbnNldE5hbWUpKT8odGhpcy5faWNvbnNldC5hcHBseUljb24odGhpcyx0aGlzLl9pY29uTmFtZSx0aGlzLnRoZW1lKSx0aGlzLnVubGlzdGVuKHdpbmRvdywiaXJvbi1pY29uc2V0LWFkZGVkIiwiX3VwZGF0ZUljb24iKSk6dGhpcy5saXN0ZW4od2luZG93LCJpcm9uLWljb25zZXQtYWRkZWQiLCJfdXBkYXRlSWNvbiIpKSk6KHRoaXMuX2ljb25zZXQmJgp0aGlzLl9pY29uc2V0LnJlbW92ZUljb24odGhpcyksdGhpcy5faW1nfHwodGhpcy5faW1nPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLHRoaXMuX2ltZy5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5faW1nLnN0eWxlLmhlaWdodD0iMTAwJSIsdGhpcy5faW1nLmRyYWdnYWJsZT0hMSksdGhpcy5faW1nLnNyYz10aGlzLnNyYyxQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLmFwcGVuZENoaWxkKHRoaXMuX2ltZykpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYTExeS1hbm5vdW5jZXIvaXJvbi1hMTF5LWFubm91bmNlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXI9ZnVuY3Rpb24oKXt9O1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXI9UG9seW1lcih7aXM6Imlyb24tYTExeS1hbm5vdW5jZXIiLHByb3BlcnRpZXM6e21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwb2xpdGUifSxfdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZXx8KFBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9dGhpcyk7ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJpcm9uLWFubm91bmNlIix0aGlzLl9vbklyb25Bbm5vdW5jZS5iaW5kKHRoaXMpKX0sYW5ub3VuY2U6ZnVuY3Rpb24oYil7dGhpcy5fdGV4dD0iIjt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fdGV4dD1ifSwxMDApfSxfb25Jcm9uQW5ub3VuY2U6ZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLnRleHQmJnRoaXMuYW5ub3VuY2UoYi5kZXRhaWwudGV4dCl9fSk7ClBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9bnVsbDtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHk9ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlfHwoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLWExMXktYW5ub3VuY2VyIikpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZSl9fSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWlucHV0L2lyb24taW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1pbnB1dCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntiaW5kVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSx2YWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVmFsdWUoYmluZFZhbHVlKSJ9LGFsbG93ZWRQYXR0ZXJuOnt0eXBlOlN0cmluZ30sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbnB1dEVsZW1lbnQ6T2JqZWN0fSxvYnNlcnZlcnM6WyJfYmluZFZhbHVlQ2hhbmdlZChiaW5kVmFsdWUsIF9pbnB1dEVsZW1lbnQpIl0sbGlzdGVuZXJzOntpbnB1dDoiX29uSW5wdXQiLGtleXByZXNzOiJfb25LZXlwcmVzcyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKTt0aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ9IiI7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPQpQb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoZnVuY3Rpb24oKXt0aGlzLl9pbml0U2xvdHRlZElucHV0KCl9LmJpbmQodGhpcykpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiYoUG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpLHRoaXMuX29ic2VydmVyPW51bGwpfSxnZXQgaW5wdXRFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudH0sX2luaXRTbG90dGVkSW5wdXQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEVsZW1lbnQ9dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpWzBdO3RoaXMuaW5wdXRFbGVtZW50JiZ0aGlzLmlucHV0RWxlbWVudC52YWx1ZSYmKHRoaXMuYmluZFZhbHVlPXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlKTt0aGlzLmZpcmUoImlyb24taW5wdXQtcmVhZHkiKX0sZ2V0IF9wYXR0ZXJuUmVnRXhwKCl7aWYodGhpcy5hbGxvd2VkUGF0dGVybil2YXIgYj1uZXcgUmVnRXhwKHRoaXMuYWxsb3dlZFBhdHRlcm4pOwplbHNlIHN3aXRjaCh0aGlzLmlucHV0RWxlbWVudC50eXBlKXtjYXNlICJudW1iZXIiOmI9L1swLTkuLGUtXS99cmV0dXJuIGJ9LF9iaW5kVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmKHZvaWQgMD09PWI/ZC52YWx1ZT1udWxsOmIhPT1kLnZhbHVlJiYodGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9YiksdGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOmJ9KSl9LF9vbklucHV0OmZ1bmN0aW9uKCl7IXRoaXMuYWxsb3dlZFBhdHRlcm58fHRoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZHx8dGhpcy5fY2hlY2tQYXR0ZXJuVmFsaWRpdHkoKXx8KHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBzdHJpbmcgb2YgY2hhcmFjdGVycyBub3QgZW50ZXJlZC4iKSx0aGlzLmlucHV0RWxlbWVudC52YWx1ZT10aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQpO3RoaXMuYmluZFZhbHVlPXRoaXMuX3ByZXZpb3VzVmFsaWRJbnB1dD0KdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxfaXNQcmludGFibGU6ZnVuY3Rpb24oYil7dmFyIGQ9MTk9PWIua2V5Q29kZXx8MjA9PWIua2V5Q29kZXx8NDU9PWIua2V5Q29kZXx8NDY9PWIua2V5Q29kZXx8MTQ0PT1iLmtleUNvZGV8fDE0NT09Yi5rZXlDb2RlfHwzMjxiLmtleUNvZGUmJjQxPmIua2V5Q29kZXx8MTExPGIua2V5Q29kZSYmMTI0PmIua2V5Q29kZTtyZXR1cm4hKDg9PWIua2V5Q29kZXx8OT09Yi5rZXlDb2RlfHwxMz09Yi5rZXlDb2RlfHwyNz09Yi5rZXlDb2RlKSYmISgwPT1iLmNoYXJDb2RlJiZkKX0sX29uS2V5cHJlc3M6ZnVuY3Rpb24oYil7aWYodGhpcy5hbGxvd2VkUGF0dGVybnx8Im51bWJlciI9PT10aGlzLmlucHV0RWxlbWVudC50eXBlKXt2YXIgZD10aGlzLl9wYXR0ZXJuUmVnRXhwO2lmKGQmJiEoYi5tZXRhS2V5fHxiLmN0cmxLZXl8fGIuYWx0S2V5KSl7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPQohMDt2YXIgZj1TdHJpbmcuZnJvbUNoYXJDb2RlKGIuY2hhckNvZGUpO3RoaXMuX2lzUHJpbnRhYmxlKGIpJiYhZC50ZXN0KGYpJiYoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBjaGFyYWN0ZXIgIitmKyIgbm90IGVudGVyZWQuIikpfX19LF9jaGVja1BhdHRlcm5WYWxpZGl0eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX3BhdHRlcm5SZWdFeHA7aWYoIWIpcmV0dXJuITA7Zm9yKHZhciBkPTA7ZDx0aGlzLmlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGg7ZCsrKWlmKCFiLnRlc3QodGhpcy5pbnB1dEVsZW1lbnQudmFsdWVbZF0pKXJldHVybiExO3JldHVybiEwfSx2YWxpZGF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmlucHV0RWxlbWVudClyZXR1cm4gdGhpcy5pbnZhbGlkPSExLCEwO3ZhciBiPXRoaXMuaW5wdXRFbGVtZW50LmNoZWNrVmFsaWRpdHkoKTtiJiYodGhpcy5yZXF1aXJlZCYmIiI9PT10aGlzLmJpbmRWYWx1ZT9iPSExOgp0aGlzLmhhc1ZhbGlkYXRvcigpJiYoYj1Qb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLmJpbmRWYWx1ZSkpKTt0aGlzLmludmFsaWQ9IWI7dGhpcy5maXJlKCJpcm9uLWlucHV0LXZhbGlkYXRlIik7cmV0dXJuIGJ9LF9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXI6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDpifSl9LF9jb21wdXRlVmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIGJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXI9e307UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRMYWJlbElEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRBZGRvbklEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRJbnB1dElEPTE7ClBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7bGFiZWw6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LHR5cGU6e3R5cGU6U3RyaW5nfSxsaXN0Ont0eXBlOlN0cmluZ30scGF0dGVybjp7dHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGVycm9yTWVzc2FnZTp7dHlwZTpTdHJpbmd9LGNoYXJDb3VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vTGFiZWxGbG9hdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxhdXRvY29tcGxldGU6e3R5cGU6U3RyaW5nLAp2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9hdXRvZm9jdXNDaGFuZ2VkIn0saW5wdXRtb2RlOnt0eXBlOlN0cmluZ30sbWlubGVuZ3RoOnt0eXBlOk51bWJlcn0sbWF4bGVuZ3RoOnt0eXBlOk51bWJlcn0sbWluOnt0eXBlOlN0cmluZ30sbWF4Ont0eXBlOlN0cmluZ30sc3RlcDp7dHlwZTpTdHJpbmd9LG5hbWU6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHJlYWRvbmx5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNpemU6e3R5cGU6TnVtYmVyfSxhdXRvY2FwaXRhbGl6ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im5vbmUifSxhdXRvY29ycmVjdDp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZiJ9LGF1dG9zYXZlOnt0eXBlOlN0cmluZ30scmVzdWx0czp7dHlwZTpOdW1iZXJ9LGFjY2VwdDp7dHlwZTpTdHJpbmd9LG11bHRpcGxlOnt0eXBlOkJvb2xlYW59LF9hcmlhRGVzY3JpYmVkQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSwKX2FyaWFMYWJlbGxlZEJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2lucHV0SWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sbGlzdGVuZXJzOnsiYWRkb24tYXR0YWNoZWQiOiJfb25BZGRvbkF0dGFjaGVkIn0sa2V5QmluZGluZ3M6eyJzaGlmdCt0YWI6a2V5ZG93biI6Il9vblNoaWZ0VGFiRG93biJ9LGhvc3RBdHRyaWJ1dGVzOnt0YWJpbmRleDowfSxnZXQgaW5wdXRFbGVtZW50KCl7dGhpcy4kfHwodGhpcy4kPXt9KTt0aGlzLiQuaW5wdXR8fCh0aGlzLl9nZW5lcmF0ZUlucHV0SWQoKSx0aGlzLiQuaW5wdXQ9dGhpcy4kJCgiIyIrdGhpcy5faW5wdXRJZCkpO3JldHVybiB0aGlzLiQuaW5wdXR9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudH0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3R5cGVzVGhhdEhhdmVUZXh0PSJkYXRlIGRhdGV0aW1lIGRhdGV0aW1lLWxvY2FsIG1vbnRoIHRpbWUgd2VlayBmaWxlIi5zcGxpdCgiICIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCk7CiFQb2x5bWVyLkVsZW1lbnQmJnRoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy5pbnB1dEVsZW1lbnQudHlwZSkmJih0aGlzLmFsd2F5c0Zsb2F0TGFiZWw9ITApfSxfYXBwZW5kU3RyaW5nV2l0aFNwYWNlOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/YisiICIrZDpkfSxfb25BZGRvbkF0dGFjaGVkOmZ1bmN0aW9uKGIpe2I9UG9seW1lci5kb20oYikucm9vdFRhcmdldDtpZihiLmlkKXRoaXMuX2FyaWFEZXNjcmliZWRCeT10aGlzLl9hcHBlbmRTdHJpbmdXaXRoU3BhY2UodGhpcy5fYXJpYURlc2NyaWJlZEJ5LGIuaWQpO2Vsc2V7dmFyIGQ9InBhcGVyLWlucHV0LWFkZC1vbi0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0QWRkb25JRCsrO2IuaWQ9ZDt0aGlzLl9hcmlhRGVzY3JpYmVkQnk9dGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSxkKX19LHZhbGlkYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnZhbGlkYXRlKCl9LApfZm9jdXNCbHVySGFuZGxlcjpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25Db250cm9sU3RhdGUuX2ZvY3VzQmx1ckhhbmRsZXIuY2FsbCh0aGlzLGIpO3RoaXMuZm9jdXNlZCYmIXRoaXMuX3NoaWZ0VGFiUHJlc3NlZCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfSxfb25TaGlmdFRhYkRvd246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITA7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixiKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfaGFuZGxlQXV0b1ZhbGlkYXRlOmZ1bmN0aW9uKCl7dGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKX0sdXBkYXRlVmFsdWVBbmRQcmVzZXJ2ZUNhcmV0OmZ1bmN0aW9uKGIpe3RyeXt2YXIgZD0KdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7dGhpcy52YWx1ZT1iO3RoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0PWQ7dGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kPWR9Y2F0Y2goZil7dGhpcy52YWx1ZT1ifX0sX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGR8fGJ9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigibGFiZWwiKTtpZihiKXtpZihiLmlkKXZhciBkPWIuaWQ7ZWxzZSBkPSJwYXBlci1pbnB1dC1sYWJlbC0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0TGFiZWxJRCsrLGIuaWQ9ZDt0aGlzLl9hcmlhTGFiZWxsZWRCeT1kfWVsc2UgdGhpcy5fYXJpYUxhYmVsbGVkQnk9IiJ9LF9nZW5lcmF0ZUlucHV0SWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dElkJiYiIiE9PXRoaXMuX2lucHV0SWR8fCh0aGlzLl9pbnB1dElkPQoiaW5wdXQtIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dElucHV0SUQrKyl9LF9vbkNoYW5nZTpmdW5jdGlvbihiKXt0aGlzLnNoYWRvd1Jvb3QmJnRoaXMuZmlyZShiLnR5cGUse3NvdXJjZUV2ZW50OmJ9LHtub2RlOnRoaXMsYnViYmxlczpiLmJ1YmJsZXMsY2FuY2VsYWJsZTpiLmNhbmNlbGFibGV9KX0sX2F1dG9mb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLmF1dG9mb2N1cyYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCl7dmFyIGI9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtiIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmIhPT1kb2N1bWVudC5ib2R5JiZiIT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx0aGlzLl9mb2N1c2FibGVFbGVtZW50LmZvY3VzKCl9fX07UG9seW1lci5QYXBlcklucHV0QmVoYXZpb3I9W1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYWRkb24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yPXthdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiYWRkb24tYXR0YWNoZWQiKX0sdXBkYXRlOmZ1bmN0aW9uKCl7fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWNoYXItY291bnRlciIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntfY2hhckNvdW50ZXJTdHI6e3R5cGU6U3RyaW5nLHZhbHVlOiIwIn19LHVwZGF0ZTpmdW5jdGlvbihiKXtpZihiLmlucHV0RWxlbWVudCl7Yi52YWx1ZT1iLnZhbHVlfHwiIjt2YXIgZD1iLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoLnRvU3RyaW5nKCk7Yi5pbnB1dEVsZW1lbnQuaGFzQXR0cmlidXRlKCJtYXhsZW5ndGgiKSYmKGQrPSIvIitiLmlucHV0RWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1heGxlbmd0aCIpKTt0aGlzLl9jaGFyQ291bnRlclN0cj1kfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pbnB1dC9wYXBlci1pbnB1dC1jb250YWluZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtY29udGFpbmVyIixwcm9wZXJ0aWVzOntub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhdHRyRm9yVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJiaW5kLXZhbHVlIn0sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGludmFsaWQ6e29ic2VydmVyOiJfaW52YWxpZENoYW5nZWQiLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZm9jdXNlZDp7cmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sX2FkZG9uczp7dHlwZTpBcnJheX0sX2lucHV0SGFzQ29udGVudDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5wdXRTZWxlY3Rvcjp7dHlwZTpTdHJpbmcsdmFsdWU6ImlucHV0LGlyb24taW5wdXQsdGV4dGFyZWEsLnBhcGVyLWlucHV0LWlucHV0In0sX2JvdW5kT25Gb2N1czp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbkZvY3VzLmJpbmQodGhpcyl9fSwKX2JvdW5kT25CbHVyOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uQmx1ci5iaW5kKHRoaXMpfX0sX2JvdW5kT25JbnB1dDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbklucHV0LmJpbmQodGhpcyl9fSxfYm91bmRWYWx1ZUNoYW5nZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25WYWx1ZUNoYW5nZWQuYmluZCh0aGlzKX19fSxsaXN0ZW5lcnM6eyJhZGRvbi1hdHRhY2hlZCI6Il9vbkFkZG9uQXR0YWNoZWQiLCJpcm9uLWlucHV0LXZhbGlkYXRlIjoiX29uSXJvbklucHV0VmFsaWRhdGUifSxnZXQgX3ZhbHVlQ2hhbmdlZEV2ZW50KCl7cmV0dXJuIHRoaXMuYXR0ckZvclZhbHVlKyItY2hhbmdlZCJ9LGdldCBfcHJvcGVydHlGb3JWYWx1ZSgpe3JldHVybiBQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclZhbHVlKX0sZ2V0IF9pbnB1dEVsZW1lbnQoKXtyZXR1cm4gUG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3Rvcih0aGlzLl9pbnB1dFNlbGVjdG9yKX0sCmdldCBfaW5wdXRFbGVtZW50VmFsdWUoKXtyZXR1cm4gdGhpcy5faW5wdXRFbGVtZW50W3RoaXMuX3Byb3BlcnR5Rm9yVmFsdWVdfHx0aGlzLl9pbnB1dEVsZW1lbnQudmFsdWV9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZT0hMDt0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2JvdW5kT25Gb2N1cywhMCk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9ib3VuZE9uQmx1ciwhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5hdHRyRm9yVmFsdWU/dGhpcy5faW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5fdmFsdWVDaGFuZ2VkRXZlbnQsdGhpcy5fYm91bmRWYWx1ZUNoYW5nZWQpOnRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHRoaXMuX29uSW5wdXQpO3RoaXMuX2lucHV0RWxlbWVudFZhbHVlJiYiIiE9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU/CnRoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudCk6dGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KX0sX29uQWRkb25BdHRhY2hlZDpmdW5jdGlvbihiKXt0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pO2I9Yi50YXJnZXQ7LTE9PT10aGlzLl9hZGRvbnMuaW5kZXhPZihiKSYmKHRoaXMuX2FkZG9ucy5wdXNoKGIpLHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KSl9LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Rm9jdXNlZCghMCl9LF9vbkJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRGb2N1c2VkKCExKTt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnQpfSxfb25JbnB1dDpmdW5jdGlvbihiKXt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZShiLnRhcmdldCl9LF9vblZhbHVlQ2hhbmdlZDpmdW5jdGlvbihiKXt2YXIgZD0KYi50YXJnZXQ7aWYodGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZSYmKHRoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGU9ITEsdm9pZCAwPT09ZC52YWx1ZXx8IiI9PT1kLnZhbHVlKSlyZXR1cm47dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUoYi50YXJnZXQpfSxfaGFuZGxlVmFsdWU6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU7ZHx8MD09PWR8fCJudW1iZXIiPT09Yi50eXBlJiYhYi5jaGVja1ZhbGlkaXR5KCk/dGhpcy5faW5wdXRIYXNDb250ZW50PSEwOnRoaXMuX2lucHV0SGFzQ29udGVudD0hMTt0aGlzLnVwZGF0ZUFkZG9ucyh7aW5wdXRFbGVtZW50OmIsdmFsdWU6ZCxpbnZhbGlkOnRoaXMuaW52YWxpZH0pfSxfaGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGU6ZnVuY3Rpb24oYil7dGhpcy5hdXRvVmFsaWRhdGUmJmImJih0aGlzLmludmFsaWQ9IShiLnZhbGlkYXRlP2IudmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50VmFsdWUpOmIuY2hlY2tWYWxpZGl0eSgpKSk7CnRoaXMuX2hhbmRsZVZhbHVlKGIpfSxfb25Jcm9uSW5wdXRWYWxpZGF0ZTpmdW5jdGlvbigpe3RoaXMuaW52YWxpZD10aGlzLl9pbnB1dEVsZW1lbnQuaW52YWxpZH0sX2ludmFsaWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fYWRkb25zJiZ0aGlzLnVwZGF0ZUFkZG9ucyh7aW52YWxpZDp0aGlzLmludmFsaWR9KX0sdXBkYXRlQWRkb25zOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZCxmPTA7ZD10aGlzLl9hZGRvbnNbZl07ZisrKWQudXBkYXRlKGIpfSxfY29tcHV0ZUlucHV0Q29udGVudENsYXNzOmZ1bmN0aW9uKGIsZCxmLGgsayl7dmFyIHQ9ImlucHV0LWNvbnRlbnQiO2I/KGsmJih0Kz0iIGxhYmVsLWlzLWhpZGRlbiIpLGgmJih0Kz0iIGlzLWludmFsaWQiKSk6KGI9dGhpcy5xdWVyeVNlbGVjdG9yKCJsYWJlbCIpLGR8fGs/KHQrPSIgbGFiZWwtaXMtZmxvYXRpbmciLHRoaXMuJC5sYWJlbEFuZElucHV0Q29udGFpbmVyLnN0eWxlLnBvc2l0aW9uPSJzdGF0aWMiLGg/dCs9IiBpcy1pbnZhbGlkIjoKZiYmKHQrPSIgbGFiZWwtaXMtaGlnaGxpZ2h0ZWQiKSk6KGImJih0aGlzLiQubGFiZWxBbmRJbnB1dENvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoJiYodCs9IiBpcy1pbnZhbGlkIikpKTtmJiYodCs9IiBmb2N1c2VkIik7cmV0dXJuIHR9LF9jb21wdXRlVW5kZXJsaW5lQ2xhc3M6ZnVuY3Rpb24oYixkKXt2YXIgZj0idW5kZXJsaW5lIjtkP2YrPSIgaXMtaW52YWxpZCI6YiYmKGYrPSIgaXMtaGlnaGxpZ2h0ZWQiKTtyZXR1cm4gZn0sX2NvbXB1dGVBZGRPbkNvbnRlbnRDbGFzczpmdW5jdGlvbihiLGQpe3ZhciBmPSJhZGQtb24tY29udGVudCI7ZD9mKz0iIGlzLWludmFsaWQiOmImJihmKz0iIGlzLWhpZ2hsaWdodGVkIik7cmV0dXJuIGZ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtZXJyb3IuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtZXJyb3IiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcl0scHJvcGVydGllczp7aW52YWxpZDp7cmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbn19LHVwZGF0ZTpmdW5jdGlvbihiKXt0aGlzLl9zZXRJbnZhbGlkKGIuaW52YWxpZCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QmVoYXZpb3IsUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcl0scHJvcGVydGllczp7dmFsdWU6e3R5cGU6U3RyaW5nfX0sYmVmb3JlUmVnaXN0ZXI6ZnVuY3Rpb24oKXt2YXIgYj0iZnVuY3Rpb24iPT10eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1pbnB1dCIpLl9pbml0U2xvdHRlZElucHV0PyJ2MSI6InYwIixkPVBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCgicGFwZXItaW5wdXQiLCJ0ZW1wbGF0ZSIpO2I9UG9seW1lci5Eb21Nb2R1bGUuaW1wb3J0KCJwYXBlci1pbnB1dCIsInRlbXBsYXRlIyIrYik7KGQ9ZC5jb250ZW50LnF1ZXJ5U2VsZWN0b3IoIiN0ZW1wbGF0ZS1wbGFjZWhvbGRlciIpKSYmZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLmNvbnRlbnQsZCl9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiBQb2x5bWVyLkVsZW1lbnQ/dGhpcy5pbnB1dEVsZW1lbnQuX2lucHV0RWxlbWVudDoKdGhpcy5pbnB1dEVsZW1lbnR9LGxpc3RlbmVyczp7Imlyb24taW5wdXQtcmVhZHkiOiJfb25Jcm9uSW5wdXRSZWFkeSJ9LF9vbklyb25JbnB1dFJlYWR5OmZ1bmN0aW9uKCl7dGhpcy4kLm5hdGl2ZUlucHV0fHwodGhpcy4kLm5hdGl2ZUlucHV0PXRoaXMuJCQoImlucHV0IikpO3RoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy4kLm5hdGl2ZUlucHV0LnR5cGUpJiYodGhpcy5hbHdheXNGbG9hdExhYmVsPSEwKTt0aGlzLmlucHV0RWxlbWVudC5iaW5kVmFsdWUmJnRoaXMuJC5jb250YWluZXIuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuaW5wdXRFbGVtZW50KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWZpdC1iZWhhdmlvci9pcm9uLWZpdC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkZpdEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzaXppbmdUYXJnZXQ6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSxmaXRJbnRvOnt0eXBlOk9iamVjdCx2YWx1ZTp3aW5kb3d9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxwb3NpdGlvblRhcmdldDp7dHlwZTpFbGVtZW50fSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nfSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZ30sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGF1dG9GaXRPbkF0dGFjaDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZml0SW5mbzp7dHlwZTpPYmplY3R9fSxnZXQgX2ZpdFdpZHRoKCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz90aGlzLmZpdEludG8uaW5uZXJXaWR0aDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGh9LApnZXQgX2ZpdEhlaWdodCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/dGhpcy5maXRJbnRvLmlubmVySGVpZ2h0OnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHR9LGdldCBfZml0TGVmdCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/MDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0sZ2V0IF9maXRUb3AoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93PzA6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH0sZ2V0IF9kZWZhdWx0UG9zaXRpb25UYXJnZXQoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO2ImJmIubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihiPWIuaG9zdCk7cmV0dXJuIGJ9LGdldCBfbG9jYWxlSG9yaXpvbnRhbEFsaWduKCl7aWYodGhpcy5faXNSVEwpe2lmKCJyaWdodCI9PT10aGlzLmhvcml6b250YWxBbGlnbilyZXR1cm4ibGVmdCI7CmlmKCJsZWZ0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduKXJldHVybiJyaWdodCJ9cmV0dXJuIHRoaXMuaG9yaXpvbnRhbEFsaWdufSxnZXQgX19zaG91bGRQb3NpdGlvbigpe3JldHVybih0aGlzLmhvcml6b250YWxBbGlnbnx8dGhpcy52ZXJ0aWNhbEFsaWduKSYmdGhpcy5wb3NpdGlvblRhcmdldH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXsidW5kZWZpbmVkIj09PXR5cGVvZiB0aGlzLl9pc1JUTCYmKHRoaXMuX2lzUlRMPSJydGwiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb24pO3RoaXMucG9zaXRpb25UYXJnZXQ9dGhpcy5wb3NpdGlvblRhcmdldHx8dGhpcy5fZGVmYXVsdFBvc2l0aW9uVGFyZ2V0O3RoaXMuYXV0b0ZpdE9uQXR0YWNoJiYoIm5vbmUiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlzcGxheT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5maXQoKX0uYmluZCh0aGlzKSk6KHdpbmRvdy5TaGFkeURPTSYmU2hhZHlET00uZmx1c2goKSwKdGhpcy5maXQoKSkpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX19kZWZlcnJlZEZpdCYmKGNsZWFyVGltZW91dCh0aGlzLl9fZGVmZXJyZWRGaXQpLHRoaXMuX19kZWZlcnJlZEZpdD1udWxsKX0sZml0OmZ1bmN0aW9uKCl7dGhpcy5wb3NpdGlvbigpO3RoaXMuY29uc3RyYWluKCk7dGhpcy5jZW50ZXIoKX0sX2Rpc2NvdmVySW5mbzpmdW5jdGlvbigpe2lmKCF0aGlzLl9maXRJbmZvKXt2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKSxkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuc2l6aW5nVGFyZ2V0KTt0aGlzLl9maXRJbmZvPXtpbmxpbmVTdHlsZTp7dG9wOnRoaXMuc3R5bGUudG9wfHwiIixsZWZ0OnRoaXMuc3R5bGUubGVmdHx8IiIscG9zaXRpb246dGhpcy5zdHlsZS5wb3NpdGlvbnx8IiJ9LHNpemVySW5saW5lU3R5bGU6e21heFdpZHRoOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heFdpZHRofHwiIixtYXhIZWlnaHQ6dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4SGVpZ2h0fHwKIiIsYm94U2l6aW5nOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZ3x8IiJ9LHBvc2l0aW9uZWRCeTp7dmVydGljYWxseToiYXV0byIhPT1iLnRvcD8idG9wIjoiYXV0byIhPT1iLmJvdHRvbT8iYm90dG9tIjpudWxsLGhvcml6b250YWxseToiYXV0byIhPT1iLmxlZnQ/ImxlZnQiOiJhdXRvIiE9PWIucmlnaHQ/InJpZ2h0IjpudWxsfSxzaXplZEJ5OntoZWlnaHQ6Im5vbmUiIT09ZC5tYXhIZWlnaHQsd2lkdGg6Im5vbmUiIT09ZC5tYXhXaWR0aCxtaW5XaWR0aDpwYXJzZUludChkLm1pbldpZHRoLDEwKXx8MCxtaW5IZWlnaHQ6cGFyc2VJbnQoZC5taW5IZWlnaHQsMTApfHwwfSxtYXJnaW46e3RvcDpwYXJzZUludChiLm1hcmdpblRvcCwxMCl8fDAscmlnaHQ6cGFyc2VJbnQoYi5tYXJnaW5SaWdodCwxMCl8fDAsYm90dG9tOnBhcnNlSW50KGIubWFyZ2luQm90dG9tLDEwKXx8MCxsZWZ0OnBhcnNlSW50KGIubWFyZ2luTGVmdCwxMCl8fDB9fX19LHJlc2V0Rml0OmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuX2ZpdEluZm98fHt9LGQ7Zm9yKGQgaW4gYi5zaXplcklubGluZVN0eWxlKXRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlW2RdPWIuc2l6ZXJJbmxpbmVTdHlsZVtkXTtmb3IoZCBpbiBiLmlubGluZVN0eWxlKXRoaXMuc3R5bGVbZF09Yi5pbmxpbmVTdHlsZVtkXTt0aGlzLl9maXRJbmZvPW51bGx9LHJlZml0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsTGVmdCxkPXRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbFRvcDt0aGlzLnJlc2V0Rml0KCk7dGhpcy5maXQoKTt0aGlzLnNpemluZ1RhcmdldC5zY3JvbGxMZWZ0PWI7dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsVG9wPWR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fX3Nob3VsZFBvc2l0aW9uKXt0aGlzLl9kaXNjb3ZlckluZm8oKTt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Ijt0aGlzLnN0eWxlLmxlZnQ9IjBweCI7CnRoaXMuc3R5bGUudG9wPSIwcHgiO3ZhciBiPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5wb3NpdGlvblRhcmdldCksZj10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKSxoPXRoaXMuX2ZpdEluZm8ubWFyZ2luLGs9dGhpcy5fX2dldFBvc2l0aW9uKHRoaXMuX2xvY2FsZUhvcml6b250YWxBbGlnbix0aGlzLnZlcnRpY2FsQWxpZ24se3dpZHRoOmIud2lkdGgraC5sZWZ0K2gucmlnaHQsaGVpZ2h0OmIuaGVpZ2h0K2gudG9wK2guYm90dG9tfSxiLGQsZik7ZD1rLmxlZnQraC5sZWZ0O2s9ay50b3AraC50b3A7dmFyIHQ9TWF0aC5taW4oZi5yaWdodC1oLnJpZ2h0LGQrYi53aWR0aCksbD1NYXRoLm1pbihmLmJvdHRvbS1oLmJvdHRvbSxrK2IuaGVpZ2h0KTtkPU1hdGgubWF4KGYubGVmdCtoLmxlZnQsTWF0aC5taW4oZCx0LXRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkpO2s9TWF0aC5tYXgoZi50b3ArCmgudG9wLE1hdGgubWluKGssbC10aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KSk7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4V2lkdGg9TWF0aC5tYXgodC1kLHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkrInB4Ijt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhIZWlnaHQ9TWF0aC5tYXgobC1rLHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5IZWlnaHQpKyJweCI7dGhpcy5zdHlsZS5sZWZ0PWQtYi5sZWZ0KyJweCI7dGhpcy5zdHlsZS50b3A9ay1iLnRvcCsicHgifX0sY29uc3RyYWluOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIGI9dGhpcy5fZml0SW5mbztiLnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLHRoaXMuc3R5bGUudG9wPSIwcHgiKTtiLnBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHl8fCh0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsCnRoaXMuc3R5bGUubGVmdD0iMHB4Iik7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Ijt2YXIgZD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Iuc2l6ZWRCeS5oZWlnaHR8fHRoaXMuX19zaXplRGltZW5zaW9uKGQsYi5wb3NpdGlvbmVkQnkudmVydGljYWxseSwidG9wIiwiYm90dG9tIiwiSGVpZ2h0Iik7Yi5zaXplZEJ5LndpZHRofHx0aGlzLl9fc2l6ZURpbWVuc2lvbihkLGIucG9zaXRpb25lZEJ5Lmhvcml6b250YWxseSwibGVmdCIsInJpZ2h0IiwiV2lkdGgiKX19LF9zaXplRGltZW5zaW9uOmZ1bmN0aW9uKGIsZCxmLGgsayl7dGhpcy5fX3NpemVEaW1lbnNpb24oYixkLGYsaCxrKX0sX19zaXplRGltZW5zaW9uOmZ1bmN0aW9uKGIsZCxmLGgsayl7dmFyIHQ9dGhpcy5fZml0SW5mbyxsPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pO2w9IldpZHRoIj09PWs/bC53aWR0aDpsLmhlaWdodDtkPWQ9PT1oO3ZhciBwPQoib2Zmc2V0IitrO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlWyJtYXgiK2tdPWwtdC5tYXJnaW5bZD9mOmhdLShkP2wtYltoXTpiW2ZdKS0odGhpc1twXS10aGlzLnNpemluZ1RhcmdldFtwXSkrInB4In0sY2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIGI9dGhpcy5fZml0SW5mby5wb3NpdGlvbmVkQnk7aWYoIWIudmVydGljYWxseXx8IWIuaG9yaXpvbnRhbGx5KXt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Yi52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9IjBweCIpO2IuaG9yaXpvbnRhbGx5fHwodGhpcy5zdHlsZS5sZWZ0PSIwcHgiKTt2YXIgZD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byk7Yi52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9Zi50b3AtZC50b3ArKGYuaGVpZ2h0LWQuaGVpZ2h0KS8yKyJweCIpO2IuaG9yaXpvbnRhbGx5fHwKKHRoaXMuc3R5bGUubGVmdD1mLmxlZnQtZC5sZWZ0KyhmLndpZHRoLWQud2lkdGgpLzIrInB4Iil9fX0sX19nZXROb3JtYWxpemVkUmVjdDpmdW5jdGlvbihiKXtyZXR1cm4gYj09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8Yj09PXdpbmRvdz97dG9wOjAsbGVmdDowLHdpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHQscmlnaHQ6d2luZG93LmlubmVyV2lkdGgsYm90dG9tOndpbmRvdy5pbm5lckhlaWdodH06Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0sX19nZXRPZmZzY3JlZW5BcmVhOmZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4gTWF0aC5hYnMoTWF0aC5taW4oMCxiLnRvcCkrTWF0aC5taW4oMCxmLmJvdHRvbS0oYi50b3ArZC5oZWlnaHQpKSkqZC53aWR0aCtNYXRoLmFicyhNYXRoLm1pbigwLGIubGVmdCkrTWF0aC5taW4oMCxmLnJpZ2h0LShiLmxlZnQrZC53aWR0aCkpKSpkLmhlaWdodH0sX19nZXRQb3NpdGlvbjpmdW5jdGlvbihiLGQsCmYsaCxrLHQpe3ZhciBsPVt7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDprLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmsudG9wK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLnJpZ2h0LWYud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSx7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDprLmJvdHRvbS1mLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmsuYm90dG9tLWYuaGVpZ2h0LXRoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLnJpZ2h0LWYud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fV07CmlmKHRoaXMubm9PdmVybGFwKXtmb3IodmFyIHA9MCxtPWwubGVuZ3RoO3A8bTtwKyspe3ZhciBuPXt9LHE7Zm9yKHEgaW4gbFtwXSluW3FdPWxbcF1bcV07bC5wdXNoKG4pfWxbMF0udG9wPWxbMV0udG9wKz1rLmhlaWdodDtsWzJdLnRvcD1sWzNdLnRvcC09ay5oZWlnaHQ7bFs0XS5sZWZ0PWxbNl0ubGVmdCs9ay53aWR0aDtsWzVdLmxlZnQ9bFs3XS5sZWZ0LT1rLndpZHRofWQ9ImF1dG8iPT09ZD9udWxsOmQ7Yj0iYXV0byI9PT1iP251bGw6YjtiJiYiY2VudGVyIiE9PWJ8fChsLnB1c2goe3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDprLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0Kyh0aGlzLm5vT3ZlcmxhcD9rLmhlaWdodDowKSxsZWZ0OmsubGVmdC1oLndpZHRoLzIray53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pLGwucHVzaCh7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOmsuYm90dG9tLQpmLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LSh0aGlzLm5vT3ZlcmxhcD9rLmhlaWdodDowKSxsZWZ0OmsubGVmdC1oLndpZHRoLzIray53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pKTtkJiYibWlkZGxlIiE9PWR8fChsLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJsZWZ0Iix0b3A6ay50b3AtaC5oZWlnaHQvMitrLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLmxlZnQrdGhpcy5ob3Jpem9udGFsT2Zmc2V0Kyh0aGlzLm5vT3ZlcmxhcD9rLndpZHRoOjApfSksbC5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoicmlnaHQiLHRvcDprLnRvcC1oLmhlaWdodC8yK2suaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsucmlnaHQtZi53aWR0aC10aGlzLmhvcml6b250YWxPZmZzZXQtKHRoaXMubm9PdmVybGFwP2sud2lkdGg6MCl9KSk7Im1pZGRsZSI9PT1kJiYiY2VudGVyIj09PQpiJiZsLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDprLnRvcC1oLmhlaWdodC8yK2suaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsubGVmdC1oLndpZHRoLzIray53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pO2ZvcihwPTA7cDxsLmxlbmd0aDtwKyspe2g9bFtwXTtrPWgudmVydGljYWxBbGlnbj09PWQ7bT1oLmhvcml6b250YWxBbGlnbj09PWI7aWYoIXRoaXMuZHluYW1pY0FsaWduJiYhdGhpcy5ub092ZXJsYXAmJmsmJm0pe3ZhciB1PWg7YnJlYWt9bj0oIWR8fGspJiYoIWJ8fG0pO2lmKHRoaXMuZHluYW1pY0FsaWdufHxuKXtoLm9mZnNjcmVlbkFyZWE9dGhpcy5fX2dldE9mZnNjcmVlbkFyZWEoaCxmLHQpO2lmKDA9PT1oLm9mZnNjcmVlbkFyZWEmJm4pe3U9aDticmVha311PXV8fGg7bj1oLm9mZnNjcmVlbkFyZWEtdS5vZmZzY3JlZW5BcmVhO2lmKDA+bnx8MD09PW4mJihrfHxtKSl1PWh9fXJldHVybiB1fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1yZXNpemFibGUtYmVoYXZpb3IvaXJvbi1yZXNpemFibGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcj17cHJvcGVydGllczp7X3BhcmVudFJlc2l6YWJsZTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9wYXJlbnRSZXNpemFibGVDaGFuZ2VkIn0sX25vdGlmeWluZ0Rlc2NlbmRhbnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGxpc3RlbmVyczp7Imlyb24tcmVxdWVzdC1yZXNpemUtbm90aWZpY2F0aW9ucyI6Il9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcz1bXTt0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZT10aGlzLm5vdGlmeVJlc2l6ZS5iaW5kKHRoaXMpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50UmVzaXphYmxlP3RoaXMuX3BhcmVudFJlc2l6YWJsZS5zdG9wUmVzaXplTm90aWZpY2F0aW9uc0Zvcih0aGlzKTp3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwKdGhpcy5fYm91bmROb3RpZnlSZXNpemUpO3RoaXMuX3BhcmVudFJlc2l6YWJsZT1udWxsfSxub3RpZnlSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3RoaXMucmVzaXplclNob3VsZE5vdGlmeShiKSYmdGhpcy5fbm90aWZ5RGVzY2VuZGFudChiKX0sdGhpcyksdGhpcy5fZmlyZVJlc2l6ZSgpKX0sYXNzaWduUGFyZW50UmVzaXphYmxlOmZ1bmN0aW9uKGIpe3RoaXMuX3BhcmVudFJlc2l6YWJsZT1ifSxzdG9wUmVzaXplTm90aWZpY2F0aW9uc0ZvcjpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKGIpOy0xPGQmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5zcGxpY2UoZCwxKSx0aGlzLnVubGlzdGVuKGIsImlyb24tcmVzaXplIiwiX29uRGVzY2VuZGFudElyb25SZXNpemUiKSl9LHJlc2l6ZXJTaG91bGROb3RpZnk6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplOmZ1bmN0aW9uKGIpe3RoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ/Yi5zdG9wUHJvcGFnYXRpb24oKTpQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvd3x8dGhpcy5fZmlyZVJlc2l6ZSgpfSxfZmlyZVJlc2l6ZTpmdW5jdGlvbigpe3RoaXMuZmlyZSgiaXJvbi1yZXNpemUiLG51bGwse25vZGU6dGhpcyxidWJibGVzOiExfSl9LF9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9uczpmdW5jdGlvbihiKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0O2QhPT10aGlzJiYoLTE9PT10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKGQpJiYodGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMucHVzaChkKSx0aGlzLmxpc3RlbihkLCJpcm9uLXJlc2l6ZSIsIl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplIikpLGQuYXNzaWduUGFyZW50UmVzaXphYmxlKHRoaXMpLHRoaXMuX25vdGlmeURlc2NlbmRhbnQoZCksYi5zdG9wUHJvcGFnYXRpb24oKSl9LApfcGFyZW50UmVzaXphYmxlQ2hhbmdlZDpmdW5jdGlvbihiKXtiJiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSl9LF9ub3RpZnlEZXNjZW5kYW50OmZ1bmN0aW9uKGIpe3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ9ITAsYi5ub3RpZnlSZXNpemUoKSx0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50PSExKX0sX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkKWlmKCJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpe3ZhciBiPXRoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zLmJpbmQodGhpcyk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24gZigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGYpO2IoKX0pfWVsc2UgdGhpcy5maXJlKCJpcm9uLXJlcXVlc3QtcmVzaXplLW5vdGlmaWNhdGlvbnMiLApudWxsLHtub2RlOnRoaXMsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSksdGhpcy5fcGFyZW50UmVzaXphYmxlfHwod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5fYm91bmROb3RpZnlSZXNpemUpLHRoaXMubm90aWZ5UmVzaXplKCkpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iYWNrZHJvcC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJpcm9uLW92ZXJsYXktYmFja2Ryb3AiLHByb3BlcnRpZXM6e29wZW5lZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uZW5kIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCl9LHByZXBhcmU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMucGFyZW50Tm9kZSYmUG9seW1lci5kb20oZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcyl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sY29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZHx8dGhpcy5wYXJlbnROb2RlIT09CmRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcyl9LF9vblRyYW5zaXRpb25lbmQ6ZnVuY3Rpb24oYil7YiYmYi50YXJnZXQ9PT10aGlzJiZ0aGlzLmNvbXBsZXRlKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2I/dGhpcy5wcmVwYXJlKCk6KGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyksIjBzIiE9PWIudHJhbnNpdGlvbkR1cmF0aW9uJiYwIT1iLm9wYWNpdHl8fHRoaXMuY29tcGxldGUoKSk7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fX29wZW5lZFJhZiYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fb3BlbmVkUmFmKSx0aGlzLl9fb3BlbmVkUmFmPW51bGwpLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX19vcGVuZWRSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbDt0aGlzLnRvZ2dsZUNsYXNzKCJvcGVuZWQiLAp0aGlzLm9wZW5lZCl9LmJpbmQodGhpcykpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1tYW5hZ2VyLmh0bWwuanMKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcz1mdW5jdGlvbigpe3RoaXMuX292ZXJsYXlzPVtdO3RoaXMuX21pbmltdW1aPTEwMTt0aGlzLl9iYWNrZHJvcEVsZW1lbnQ9bnVsbDtQb2x5bWVyLkdlc3R1cmVzLmFkZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsInRhcCIsZnVuY3Rpb24oKXt9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLHRoaXMuX29uQ2FwdHVyZUNsaWNrLmJpbmQodGhpcyksITApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9vbkNhcHR1cmVGb2N1cy5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLl9vbkNhcHR1cmVLZXlEb3duLmJpbmQodGhpcyksITApfTsKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlBvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyQ2xhc3MsZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3RoaXMuX2JhY2tkcm9wRWxlbWVudHx8KHRoaXMuX2JhY2tkcm9wRWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLW92ZXJsYXktYmFja2Ryb3AiKSk7cmV0dXJuIHRoaXMuX2JhY2tkcm9wRWxlbWVudH0sZ2V0IGRlZXBBY3RpdmVFbGVtZW50KCl7dmFyIGI9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtiJiYhMSE9PWIgaW5zdGFuY2VvZiBFbGVtZW50fHwoYj1kb2N1bWVudC5ib2R5KTtmb3IoO2Iucm9vdCYmUG9seW1lci5kb20oYi5yb290KS5hY3RpdmVFbGVtZW50OyliPVBvbHltZXIuZG9tKGIucm9vdCkuYWN0aXZlRWxlbWVudDtyZXR1cm4gYn0sX2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250OmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX292ZXJsYXlzW2JdO2lmKGQpe3ZhciBmPQp0aGlzLl9vdmVybGF5cy5sZW5ndGgtMSxoPXRoaXMuX292ZXJsYXlzW2ZdO2gmJnRoaXMuX3Nob3VsZEJlQmVoaW5kT3ZlcmxheShkLGgpJiZmLS07aWYoIShiPj1mKSl7aD1NYXRoLm1heCh0aGlzLmN1cnJlbnRPdmVybGF5WigpLHRoaXMuX21pbmltdW1aKTtmb3IodGhpcy5fZ2V0WihkKTw9aCYmdGhpcy5fYXBwbHlPdmVybGF5WihkLGgpO2I8ZjspdGhpcy5fb3ZlcmxheXNbYl09dGhpcy5fb3ZlcmxheXNbYisxXSxiKys7dGhpcy5fb3ZlcmxheXNbZl09ZH19fSxhZGRPclJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYil7Yi5vcGVuZWQ/dGhpcy5hZGRPdmVybGF5KGIpOnRoaXMucmVtb3ZlT3ZlcmxheShiKX0sYWRkT3ZlcmxheTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9vdmVybGF5cy5pbmRleE9mKGIpO2lmKDA8PWQpdGhpcy5fYnJpbmdPdmVybGF5QXRJbmRleFRvRnJvbnQoZCk7ZWxzZXtkPXRoaXMuX292ZXJsYXlzLmxlbmd0aDt2YXIgZj10aGlzLl9vdmVybGF5c1tkLTFdLGg9Ck1hdGgubWF4KHRoaXMuX2dldFooZiksdGhpcy5fbWluaW11bVopLGs9dGhpcy5fZ2V0WihiKTtmJiZ0aGlzLl9zaG91bGRCZUJlaGluZE92ZXJsYXkoYixmKSYmKHRoaXMuX2FwcGx5T3ZlcmxheVooZixoKSxkLS0saD1NYXRoLm1heCh0aGlzLl9nZXRaKHRoaXMuX292ZXJsYXlzW2QtMV0pLHRoaXMuX21pbmltdW1aKSk7azw9aCYmdGhpcy5fYXBwbHlPdmVybGF5WihiLGgpO3RoaXMuX292ZXJsYXlzLnNwbGljZShkLDAsYil9dGhpcy50cmFja0JhY2tkcm9wKCl9LHJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYil7Yj10aGlzLl9vdmVybGF5cy5pbmRleE9mKGIpOy0xIT09YiYmKHRoaXMuX292ZXJsYXlzLnNwbGljZShiLDEpLHRoaXMudHJhY2tCYWNrZHJvcCgpKX0sY3VycmVudE92ZXJsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3ZlcmxheXNbdGhpcy5fb3ZlcmxheXMubGVuZ3RoLTFdfSxjdXJyZW50T3ZlcmxheVo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0Wih0aGlzLmN1cnJlbnRPdmVybGF5KCkpfSwKZW5zdXJlTWluaW11bVo6ZnVuY3Rpb24oYil7dGhpcy5fbWluaW11bVo9TWF0aC5tYXgodGhpcy5fbWluaW11bVosYil9LGZvY3VzT3ZlcmxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuY3VycmVudE92ZXJsYXkoKTtiJiZiLl9hcHBseUZvY3VzKCl9LHRyYWNrQmFja2Ryb3A6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9vdmVybGF5V2l0aEJhY2tkcm9wKCk7aWYoYnx8dGhpcy5fYmFja2Ryb3BFbGVtZW50KXRoaXMuYmFja2Ryb3BFbGVtZW50LnN0eWxlLnpJbmRleD10aGlzLl9nZXRaKGIpLTEsdGhpcy5iYWNrZHJvcEVsZW1lbnQub3BlbmVkPSEhYix0aGlzLmJhY2tkcm9wRWxlbWVudC5wcmVwYXJlKCl9LGdldEJhY2tkcm9wczpmdW5jdGlvbigpe2Zvcih2YXIgYj1bXSxkPTA7ZDx0aGlzLl9vdmVybGF5cy5sZW5ndGg7ZCsrKXRoaXMuX292ZXJsYXlzW2RdLndpdGhCYWNrZHJvcCYmYi5wdXNoKHRoaXMuX292ZXJsYXlzW2RdKTtyZXR1cm4gYn0sYmFja2Ryb3BaOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFoodGhpcy5fb3ZlcmxheVdpdGhCYWNrZHJvcCgpKS0KMX0sX292ZXJsYXlXaXRoQmFja2Ryb3A6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5fb3ZlcmxheXMubGVuZ3RoLTE7MDw9YjtiLS0paWYodGhpcy5fb3ZlcmxheXNbYl0ud2l0aEJhY2tkcm9wKXJldHVybiB0aGlzLl9vdmVybGF5c1tiXX0sX2dldFo6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fbWluaW11bVo7YiYmKGI9TnVtYmVyKGIuc3R5bGUuekluZGV4fHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiKS56SW5kZXgpLGI9PT1iJiYoZD1iKSk7cmV0dXJuIGR9LF9zZXRaOmZ1bmN0aW9uKGIsZCl7Yi5zdHlsZS56SW5kZXg9ZH0sX2FwcGx5T3ZlcmxheVo6ZnVuY3Rpb24oYixkKXt0aGlzLl9zZXRaKGIsZCsyKX0sX292ZXJsYXlJblBhdGg6ZnVuY3Rpb24oYil7Yj1ifHxbXTtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKylpZihiW2RdLl9tYW5hZ2VyPT09dGhpcylyZXR1cm4gYltkXX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX292ZXJsYXlzLmxlbmd0aC0KMTtpZigtMSE9PWQpZm9yKHZhciBmPVBvbHltZXIuZG9tKGIpLnBhdGgsaDsoaD10aGlzLl9vdmVybGF5c1tkXSkmJnRoaXMuX292ZXJsYXlJblBhdGgoZikhPT1oOylpZihoLl9vbkNhcHR1cmVDbGljayhiKSxoLmFsbG93Q2xpY2tUaHJvdWdoKWQtLTtlbHNlIGJyZWFrfSxfb25DYXB0dXJlRm9jdXM6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2QmJmQuX29uQ2FwdHVyZUZvY3VzKGIpfSxfb25DYXB0dXJlS2V5RG93bjpmdW5jdGlvbihiKXt2YXIgZD10aGlzLmN1cnJlbnRPdmVybGF5KCk7ZCYmKFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3Iua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGIsImVzYyIpP2QuX29uQ2FwdHVyZUVzYyhiKTpQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ0YWIiKSYmZC5fb25DYXB0dXJlVGFiKGIpKX0sX3Nob3VsZEJlQmVoaW5kT3ZlcmxheTpmdW5jdGlvbihiLGQpe3JldHVybiFiLmFsd2F5c09uVG9wJiYKZC5hbHdheXNPblRvcH19O1BvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyPW5ldyBQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlckNsYXNzOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tb3ZlcmxheS1iZWhhdmlvci9pcm9uLXNjcm9sbC1tYW5hZ2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9MCxkPTAsZj1udWxsLGg9W10saz1bIndoZWVsIiwibW91c2V3aGVlbCIsIkRPTU1vdXNlU2Nyb2xsIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSJdO1BvbHltZXIuSXJvblNjcm9sbE1hbmFnZXI9e2dldCBjdXJyZW50TG9ja2luZ0VsZW1lbnQoKXtyZXR1cm4gdGhpcy5fbG9ja2luZ0VsZW1lbnRzW3RoaXMuX2xvY2tpbmdFbGVtZW50cy5sZW5ndGgtMV19LGVsZW1lbnRJc1Njcm9sbExvY2tlZDpmdW5jdGlvbih0KXt2YXIgbD10aGlzLmN1cnJlbnRMb2NraW5nRWxlbWVudDtpZih2b2lkIDA9PT1sKXJldHVybiExO2lmKHRoaXMuX2hhc0NhY2hlZExvY2tlZEVsZW1lbnQodCkpcmV0dXJuITA7aWYodGhpcy5faGFzQ2FjaGVkVW5sb2NrZWRFbGVtZW50KHQpKXJldHVybiExOyhsPSEhbCYmbCE9PXQmJiF0aGlzLl9jb21wb3NlZFRyZWVDb250YWlucyhsLHQpKT90aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUucHVzaCh0KTp0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5wdXNoKHQpOwpyZXR1cm4gbH0scHVzaFNjcm9sbExvY2s6ZnVuY3Rpb24odCl7MDw9dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmluZGV4T2YodCl8fCgwPT09dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmxlbmd0aCYmdGhpcy5fbG9ja1Njcm9sbEludGVyYWN0aW9ucygpLHRoaXMuX2xvY2tpbmdFbGVtZW50cy5wdXNoKHQpLHRoaXMuX2xvY2tlZEVsZW1lbnRDYWNoZT1bXSx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZT1bXSl9LHJlbW92ZVNjcm9sbExvY2s6ZnVuY3Rpb24odCl7dD10aGlzLl9sb2NraW5nRWxlbWVudHMuaW5kZXhPZih0KTstMSE9PXQmJih0aGlzLl9sb2NraW5nRWxlbWVudHMuc3BsaWNlKHQsMSksdGhpcy5fbG9ja2VkRWxlbWVudENhY2hlPVtdLHRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlPVtdLDA9PT10aGlzLl9sb2NraW5nRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl91bmxvY2tTY3JvbGxJbnRlcmFjdGlvbnMoKSl9LF9sb2NraW5nRWxlbWVudHM6W10sX2xvY2tlZEVsZW1lbnRDYWNoZTpudWxsLApfdW5sb2NrZWRFbGVtZW50Q2FjaGU6bnVsbCxfaGFzQ2FjaGVkTG9ja2VkRWxlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4tMTx0aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUuaW5kZXhPZih0KX0sX2hhc0NhY2hlZFVubG9ja2VkRWxlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4tMTx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5pbmRleE9mKHQpfSxfY29tcG9zZWRUcmVlQ29udGFpbnM6ZnVuY3Rpb24odCxsKXt2YXIgcCxtO2lmKHQuY29udGFpbnMobCkpcmV0dXJuITA7dD1Qb2x5bWVyLmRvbSh0KS5xdWVyeVNlbGVjdG9yQWxsKCJjb250ZW50LHNsb3QiKTtmb3IocD0wO3A8dC5sZW5ndGg7KytwKXt2YXIgbj1Qb2x5bWVyLmRvbSh0W3BdKS5nZXREaXN0cmlidXRlZE5vZGVzKCk7Zm9yKG09MDttPG4ubGVuZ3RoOysrbSlpZihuW21dLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJnRoaXMuX2NvbXBvc2VkVHJlZUNvbnRhaW5zKG5bbV0sbCkpcmV0dXJuITB9cmV0dXJuITF9LF9zY3JvbGxJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dC5jYW5jZWxhYmxlJiYKdGhpcy5fc2hvdWxkUHJldmVudFNjcm9sbGluZyh0KSYmdC5wcmV2ZW50RGVmYXVsdCgpO3QudGFyZ2V0VG91Y2hlcyYmKHQ9dC50YXJnZXRUb3VjaGVzWzBdLGI9dC5wYWdlWCxkPXQucGFnZVkpfSxfbG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe3RoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj10aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fHRoaXMuX3Njcm9sbEludGVyYWN0aW9uSGFuZGxlci5iaW5kKHRoaXMpO2Zvcih2YXIgdD0wLGw9ay5sZW5ndGg7dDxsO3QrKylkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGtbdF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sX3VubG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGw9ay5sZW5ndGg7dDxsO3QrKylkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGtbdF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sCl9zaG91bGRQcmV2ZW50U2Nyb2xsaW5nOmZ1bmN0aW9uKHQpe3ZhciBsPVBvbHltZXIuZG9tKHQpLnJvb3RUYXJnZXQ7InRvdWNobW92ZSIhPT10LnR5cGUmJmYhPT1sJiYoZj1sLGg9dGhpcy5fZ2V0U2Nyb2xsYWJsZU5vZGVzKFBvbHltZXIuZG9tKHQpLnBhdGgpKTtpZighaC5sZW5ndGgpcmV0dXJuITA7aWYoInRvdWNoc3RhcnQiPT09dC50eXBlKXJldHVybiExO3Q9dGhpcy5fZ2V0U2Nyb2xsSW5mbyh0KTtyZXR1cm4hdGhpcy5fZ2V0U2Nyb2xsaW5nTm9kZShoLHQuZGVsdGFYLHQuZGVsdGFZKX0sX2dldFNjcm9sbGFibGVOb2RlczpmdW5jdGlvbih0KXtmb3IodmFyIGw9W10scD10LmluZGV4T2YodGhpcy5jdXJyZW50TG9ja2luZ0VsZW1lbnQpLG09MDttPD1wO20rKylpZih0W21dLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBuPXRbbV0scT1uLnN0eWxlOyJzY3JvbGwiIT09cS5vdmVyZmxvdyYmImF1dG8iIT09cS5vdmVyZmxvdyYmKHE9d2luZG93LmdldENvbXB1dGVkU3R5bGUobikpOwoic2Nyb2xsIiE9PXEub3ZlcmZsb3cmJiJhdXRvIiE9PXEub3ZlcmZsb3d8fGwucHVzaChuKX1yZXR1cm4gbH0sX2dldFNjcm9sbGluZ05vZGU6ZnVuY3Rpb24odCxsLHApe2lmKGx8fHApZm9yKHZhciBtPU1hdGguYWJzKHApPj1NYXRoLmFicyhsKSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBxPXRbbl07aWYobT8wPnA/MDxxLnNjcm9sbFRvcDpxLnNjcm9sbFRvcDxxLnNjcm9sbEhlaWdodC1xLmNsaWVudEhlaWdodDowPmw/MDxxLnNjcm9sbExlZnQ6cS5zY3JvbGxMZWZ0PHEuc2Nyb2xsV2lkdGgtcS5jbGllbnRXaWR0aClyZXR1cm4gcX19LF9nZXRTY3JvbGxJbmZvOmZ1bmN0aW9uKHQpe3ZhciBsPXtkZWx0YVg6dC5kZWx0YVgsZGVsdGFZOnQuZGVsdGFZfTsiZGVsdGFYImluIHR8fCgid2hlZWxEZWx0YVgiaW4gdCYmIndoZWVsRGVsdGFZImluIHQ/KGwuZGVsdGFYPS10LndoZWVsRGVsdGFYLGwuZGVsdGFZPS10LndoZWVsRGVsdGFZKToid2hlZWxEZWx0YSJpbiB0PyhsLmRlbHRhWD0KMCxsLmRlbHRhWT0tdC53aGVlbERlbHRhKToiYXhpcyJpbiB0PyhsLmRlbHRhWD0xPT09dC5heGlzP3QuZGV0YWlsOjAsbC5kZWx0YVk9Mj09PXQuYXhpcz90LmRldGFpbDowKTp0LnRhcmdldFRvdWNoZXMmJih0PXQudGFyZ2V0VG91Y2hlc1swXSxsLmRlbHRhWD1iLXQucGFnZVgsbC5kZWx0YVk9ZC10LnBhZ2VZKSk7cmV0dXJuIGx9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tZm9jdXNhYmxlcy1oZWxwZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj1FbGVtZW50LnByb3RvdHlwZSxkPWIubWF0Y2hlc3x8Yi5tYXRjaGVzU2VsZWN0b3J8fGIubW96TWF0Y2hlc1NlbGVjdG9yfHxiLm1zTWF0Y2hlc1NlbGVjdG9yfHxiLm9NYXRjaGVzU2VsZWN0b3J8fGIud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1BvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXI9e2dldFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZil7dmFyIGg9W107cmV0dXJuIHRoaXMuX2NvbGxlY3RUYWJiYWJsZU5vZGVzKGYsaCk/dGhpcy5fc29ydEJ5VGFiSW5kZXgoaCk6aH0saXNGb2N1c2FibGU6ZnVuY3Rpb24oZil7cmV0dXJuIGQuY2FsbChmLCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBvYmplY3QiKT9kLmNhbGwoZiwiOm5vdChbZGlzYWJsZWRdKSIpOmQuY2FsbChmLCJhW2hyZWZdLCBhcmVhW2hyZWZdLCBpZnJhbWUsIFt0YWJpbmRleF0sIFtjb250ZW50RWRpdGFibGVdIil9LGlzVGFiYmFibGU6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuaXNGb2N1c2FibGUoZikmJgpkLmNhbGwoZiwnOm5vdChbdGFiaW5kZXhceDNkIi0xIl0pJykmJnRoaXMuX2lzVmlzaWJsZShmKX0sX25vcm1hbGl6ZWRUYWJJbmRleDpmdW5jdGlvbihmKXtyZXR1cm4gdGhpcy5pc0ZvY3VzYWJsZShmKT8oZj1mLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKXx8MCxOdW1iZXIoZikpOi0xfSxfY29sbGVjdFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZixoKXtpZihmLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREV8fCF0aGlzLl9pc1Zpc2libGUoZikpcmV0dXJuITE7dmFyIGs9dGhpcy5fbm9ybWFsaXplZFRhYkluZGV4KGYpLHQ9MDxrOzA8PWsmJmgucHVzaChmKTtmPSJjb250ZW50Ij09PWYubG9jYWxOYW1lfHwic2xvdCI9PT1mLmxvY2FsTmFtZT9Qb2x5bWVyLmRvbShmKS5nZXREaXN0cmlidXRlZE5vZGVzKCk6UG9seW1lci5kb20oZi5yb290fHxmKS5jaGlsZHJlbjtmb3Ioaz0wO2s8Zi5sZW5ndGg7aysrKXQ9dGhpcy5fY29sbGVjdFRhYmJhYmxlTm9kZXMoZltrXSxoKXx8dDsKcmV0dXJuIHR9LF9pc1Zpc2libGU6ZnVuY3Rpb24oZil7dmFyIGg9Zi5zdHlsZTtyZXR1cm4iaGlkZGVuIiE9PWgudmlzaWJpbGl0eSYmIm5vbmUiIT09aC5kaXNwbGF5PyhoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYpLCJoaWRkZW4iIT09aC52aXNpYmlsaXR5JiYibm9uZSIhPT1oLmRpc3BsYXkpOiExfSxfc29ydEJ5VGFiSW5kZXg6ZnVuY3Rpb24oZil7dmFyIGg9Zi5sZW5ndGg7aWYoMj5oKXJldHVybiBmO3ZhciBrPU1hdGguY2VpbChoLzIpO2g9dGhpcy5fc29ydEJ5VGFiSW5kZXgoZi5zbGljZSgwLGspKTtmPXRoaXMuX3NvcnRCeVRhYkluZGV4KGYuc2xpY2UoaykpO3JldHVybiB0aGlzLl9tZXJnZVNvcnRCeVRhYkluZGV4KGgsZil9LF9tZXJnZVNvcnRCeVRhYkluZGV4OmZ1bmN0aW9uKGYsaCl7Zm9yKHZhciBrPVtdOzA8Zi5sZW5ndGgmJjA8aC5sZW5ndGg7KXRoaXMuX2hhc0xvd2VyVGFiT3JkZXIoZlswXSxoWzBdKT9rLnB1c2goaC5zaGlmdCgpKTprLnB1c2goZi5zaGlmdCgpKTsKcmV0dXJuIGsuY29uY2F0KGYsaCl9LF9oYXNMb3dlclRhYk9yZGVyOmZ1bmN0aW9uKGYsaCl7Zj1NYXRoLm1heChmLnRhYkluZGV4LDApO2g9TWF0aC5tYXgoaC50YWJJbmRleCwwKTtyZXR1cm4gMD09PWZ8fDA9PT1oP2g+ZjpmPmh9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iZWhhdmlvci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e29wZW5lZDp7b2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIix0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxjYW5jZWxlZDp7b2JzZXJ2ZXI6Il9jYW5jZWxlZENoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sd2l0aEJhY2tkcm9wOntvYnNlcnZlcjoiX3dpdGhCYWNrZHJvcENoYW5nZWQiLHR5cGU6Qm9vbGVhbn0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9DYW5jZWxPbkVzY0tleTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0NhbmNlbE9uT3V0c2lkZUNsaWNrOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNsb3NpbmdSZWFzb246e3R5cGU6T2JqZWN0fSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsbG93Q2xpY2tUaHJvdWdoOnt0eXBlOkJvb2xlYW59LGFsd2F5c09uVG9wOnt0eXBlOkJvb2xlYW59LApzY3JvbGxBY3Rpb246e3R5cGU6U3RyaW5nfSxfbWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6UG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJ9LF9mb2N1c2VkQ2hpbGQ6e3R5cGU6T2JqZWN0fX0sbGlzdGVuZXJzOnsiaXJvbi1yZXNpemUiOiJfb25Jcm9uUmVzaXplIn0sb2JzZXJ2ZXJzOlsiX191cGRhdGVTY3JvbGxPYnNlcnZlcnMoaXNBdHRhY2hlZCwgb3BlbmVkLCBzY3JvbGxBY3Rpb24pIl0sZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3JldHVybiB0aGlzLl9tYW5hZ2VyLmJhY2tkcm9wRWxlbWVudH0sZ2V0IF9mb2N1c05vZGUoKXtyZXR1cm4gdGhpcy5fZm9jdXNlZENoaWxkfHxQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJbYXV0b2ZvY3VzXSIpfHx0aGlzfSxnZXQgX2ZvY3VzYWJsZU5vZGVzKCl7cmV0dXJuIFBvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXIuZ2V0VGFiYmFibGVOb2Rlcyh0aGlzKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9CnRoaXMuX19pc0FuaW1hdGluZz0hMTt0aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlPXRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZT1udWxsO3RoaXMuX19yYWZzPXt9O3RoaXMuX19zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbExlZnQ9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbDt0aGlzLl9fb25DYXB0dXJlU2Nyb2xsPXRoaXMuX19vbkNhcHR1cmVTY3JvbGwuYmluZCh0aGlzKTt0aGlzLl9fcm9vdE5vZGVzPW51bGw7dGhpcy5fZW5zdXJlU2V0dXAoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCk7dGhpcy5fb2JzZXJ2ZXI9UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX29uTm9kZXNDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKTt0aGlzLl9vYnNlcnZlcj1udWxsO2Zvcih2YXIgYiBpbiB0aGlzLl9fcmFmcyludWxsIT09CnRoaXMuX19yYWZzW2JdJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fcmFmc1tiXSk7dGhpcy5fX3JhZnM9e307dGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpO3RoaXMuX19pc0FuaW1hdGluZyYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOih0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCkpKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpO3RoaXMub3BlbmVkPSF0aGlzLm9wZW5lZH0sb3BlbjpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKTt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSk7dGhpcy5vcGVuZWQ9ITF9LGNhbmNlbDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1jYW5jZWxlZCIsYix7Y2FuY2VsYWJsZTohMH0pLmRlZmF1bHRQcmV2ZW50ZWR8fCh0aGlzLl9zZXRDYW5jZWxlZCghMCksdGhpcy5vcGVuZWQ9CiExKX0saW52YWxpZGF0ZVRhYmJhYmxlczpmdW5jdGlvbigpe3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlPW51bGx9LF9lbnN1cmVTZXR1cDpmdW5jdGlvbigpe3RoaXMuX292ZXJsYXlTZXR1cHx8KHRoaXMuX292ZXJsYXlTZXR1cD0hMCx0aGlzLnN0eWxlLm91dGxpbmU9Im5vbmUiLHRoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihiKXtiP3RoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpOnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKTt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9faXNBbmltYXRpbmc9ITAsdGhpcy5fX2RlcmFmKCJfX29wZW5lZENoYW5nZWQiLHRoaXMuX19vcGVuZWRDaGFuZ2VkKSl9LF9jYW5jZWxlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsb3NpbmdSZWFzb249dGhpcy5jbG9zaW5nUmVhc29ufHx7fTt0aGlzLmNsb3NpbmdSZWFzb24uY2FuY2VsZWQ9CnRoaXMuY2FuY2VsZWR9LF93aXRoQmFja2Ryb3BDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy53aXRoQmFja2Ryb3AmJiF0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT8odGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKSx0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9ITApOnRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleCYmKHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpLHRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0hMSk7dGhpcy5vcGVuZWQmJnRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbWFuYWdlci50cmFja0JhY2tkcm9wKCl9LF9wcmVwYXJlUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDt0aGlzLl9wcmVwYXJlUG9zaXRpb25pbmcoKTt0aGlzLnJlZml0KCk7dGhpcy5fZmluaXNoUG9zaXRpb25pbmcoKTt0aGlzLm5vQXV0b0ZvY3VzJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09CnRoaXMuX2ZvY3VzTm9kZSYmKHRoaXMuX2ZvY3VzTm9kZS5ibHVyKCksdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGUuZm9jdXMoKSl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfZmluaXNoUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5ub3RpZnlSZXNpemUoKTt0aGlzLl9faXNBbmltYXRpbmc9ITE7dGhpcy5maXJlKCJpcm9uLW92ZXJsYXktb3BlbmVkIil9LF9maW5pc2hSZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuc3R5bGUuekluZGV4PSIiO3RoaXMubm90aWZ5UmVzaXplKCk7dGhpcy5fX2lzQW5pbWF0aW5nPSExO3RoaXMuZmlyZSgiaXJvbi1vdmVybGF5LWNsb3NlZCIsdGhpcy5jbG9zaW5nUmVhc29uKX0sX3ByZXBhcmVQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvbj0KdGhpcy5zdHlsZS53ZWJraXRUcmFuc2l0aW9uPSJub25lIjt0aGlzLnN0eWxlLnRyYW5zZm9ybT10aGlzLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0ibm9uZSI7dGhpcy5zdHlsZS5kaXNwbGF5PSIifSxfZmluaXNoUG9zaXRpb25pbmc6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wO3RoaXMuc3R5bGUudHJhbnNpdGlvbj10aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb249IiI7dGhpcy5zdHlsZS50cmFuc2Zvcm09dGhpcy5zdHlsZS53ZWJraXRUcmFuc2Zvcm09IiI7dGhpcy5zdHlsZS5kaXNwbGF5PSIiO3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wfSxfYXBwbHlGb2N1czpmdW5jdGlvbigpe2lmKHRoaXMub3BlbmVkKXRoaXMubm9BdXRvRm9jdXN8fHRoaXMuX2ZvY3VzTm9kZS5mb2N1cygpO2Vsc2V7dGhpcy5fZm9jdXNOb2RlLmJsdXIoKTt0aGlzLl9mb2N1c2VkQ2hpbGQ9bnVsbDtpZih0aGlzLnJlc3RvcmVGb2N1c09uQ2xvc2UmJgp0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZSl7dmFyIGI9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDsoYj09PWRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMpLmRlZXBDb250YWlucyhiKSkmJnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlLmZvY3VzKCl9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbDsoYj10aGlzLl9tYW5hZ2VyLmN1cnJlbnRPdmVybGF5KCkpJiZ0aGlzIT09YiYmYi5fYXBwbHlGb2N1cygpfX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGIpe3RoaXMubm9DYW5jZWxPbk91dHNpZGVDbGlja3x8dGhpcy5jYW5jZWwoYil9LF9vbkNhcHR1cmVGb2N1czpmdW5jdGlvbihiKXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dmFyIGQ9UG9seW1lci5kb20oYikucGF0aDstMT09PWQuaW5kZXhPZih0aGlzKT8oYi5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9hcHBseUZvY3VzKCkpOnRoaXMuX2ZvY3VzZWRDaGlsZD1kWzBdfX0sX29uQ2FwdHVyZUVzYzpmdW5jdGlvbihiKXt0aGlzLm5vQ2FuY2VsT25Fc2NLZXl8fAp0aGlzLmNhbmNlbChiKX0sX29uQ2FwdHVyZVRhYjpmdW5jdGlvbihiKXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dGhpcy5fX2Vuc3VyZUZpcnN0TGFzdEZvY3VzYWJsZXMoKTt2YXIgZD1iLnNoaWZ0S2V5LGY9ZD90aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlOnRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZTtkPWQ/dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlOnRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU7aWYoZj09PWQpZj0hMDtlbHNle3ZhciBoPXRoaXMuX21hbmFnZXIuZGVlcEFjdGl2ZUVsZW1lbnQ7Zj1oPT09Znx8aD09PXRoaXN9ZiYmKGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9mb2N1c2VkQ2hpbGQ9ZCx0aGlzLl9hcHBseUZvY3VzKCkpfX0sX29uSXJvblJlc2l6ZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiYhdGhpcy5fX2lzQW5pbWF0aW5nJiZ0aGlzLl9fZGVyYWYoInJlZml0Iix0aGlzLnJlZml0KX0sX29uTm9kZXNDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMuX19pc0FuaW1hdGluZyYmCih0aGlzLmludmFsaWRhdGVUYWJiYWJsZXMoKSx0aGlzLm5vdGlmeVJlc2l6ZSgpKX0sX19lbnN1cmVGaXJzdExhc3RGb2N1c2FibGVzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGV8fCF0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGUpe3ZhciBiPXRoaXMuX2ZvY3VzYWJsZU5vZGVzO3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9YlswXTt0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9YltiLmxlbmd0aC0xXX19LF9fb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMub3BlbmVkPyh0aGlzLl9wcmVwYXJlUmVuZGVyT3BlbmVkKCksdGhpcy5fbWFuYWdlci5hZGRPdmVybGF5KHRoaXMpLHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9yZW5kZXJPcGVuZWQoKSk6KHRoaXMuX21hbmFnZXIucmVtb3ZlT3ZlcmxheSh0aGlzKSx0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fcmVuZGVyQ2xvc2VkKCkpfSxfX2RlcmFmOmZ1bmN0aW9uKGIsZCl7dmFyIGY9dGhpcy5fX3JhZnM7Cm51bGwhPT1mW2JdJiZjYW5jZWxBbmltYXRpb25GcmFtZShmW2JdKTtmW2JdPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2ZbYl09bnVsbDtkLmNhbGwodGhpcyl9LmJpbmQodGhpcykpfSxfX3VwZGF0ZVNjcm9sbE9ic2VydmVyczpmdW5jdGlvbihiLGQsZil7YiYmZCYmdGhpcy5fX2lzVmFsaWRTY3JvbGxBY3Rpb24oZik/KCJsb2NrIj09PWYmJih0aGlzLl9fc2F2ZVNjcm9sbFBvc2l0aW9uKCksUG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlci5wdXNoU2Nyb2xsTG9jayh0aGlzKSksdGhpcy5fX2FkZFNjcm9sbExpc3RlbmVycygpKTooUG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlci5yZW1vdmVTY3JvbGxMb2NrKHRoaXMpLHRoaXMuX19yZW1vdmVTY3JvbGxMaXN0ZW5lcnMoKSl9LF9fYWRkU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19yb290Tm9kZXMpe3RoaXMuX19yb290Tm9kZXM9W107aWYoUG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpZm9yKHZhciBiPQp0aGlzO2I7KWIubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJmIuaG9zdCYmdGhpcy5fX3Jvb3ROb2Rlcy5wdXNoKGIpLGI9Yi5ob3N0fHxiLmFzc2lnbmVkU2xvdHx8Yi5wYXJlbnROb2RlO3RoaXMuX19yb290Tm9kZXMucHVzaChkb2N1bWVudCl9dGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0sdGhpcyl9LF9fcmVtb3ZlU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fX3Jvb3ROb2RlcyYmdGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0sdGhpcyk7dGhpcy5pc0F0dGFjaGVkfHwodGhpcy5fX3Jvb3ROb2Rlcz1udWxsKX0sX19pc1ZhbGlkU2Nyb2xsQWN0aW9uOmZ1bmN0aW9uKGIpe3JldHVybiJsb2NrIj09PQpifHwicmVmaXQiPT09Ynx8ImNhbmNlbCI9PT1ifSxfX29uQ2FwdHVyZVNjcm9sbDpmdW5jdGlvbihiKXtpZighKHRoaXMuX19pc0FuaW1hdGluZ3x8MDw9UG9seW1lci5kb20oYikucGF0aC5pbmRleE9mKHRoaXMpKSlzd2l0Y2godGhpcy5zY3JvbGxBY3Rpb24pe2Nhc2UgImxvY2siOnRoaXMuX19yZXN0b3JlU2Nyb2xsUG9zaXRpb24oKTticmVhaztjYXNlICJyZWZpdCI6dGhpcy5fX2RlcmFmKCJyZWZpdCIsdGhpcy5yZWZpdCk7YnJlYWs7Y2FzZSAiY2FuY2VsIjp0aGlzLmNhbmNlbChiKX19LF9fc2F2ZVNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudD8odGhpcy5fX3Njcm9sbFRvcD1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcCx0aGlzLl9fc2Nyb2xsTGVmdD1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbExlZnQpOih0aGlzLl9fc2Nyb2xsVG9wPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsCmRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSx0aGlzLl9fc2Nyb2xsTGVmdD1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpKX0sX19yZXN0b3JlU2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50Pyhkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcD10aGlzLl9fc2Nyb2xsVG9wLGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdD10aGlzLl9fc2Nyb2xsTGVmdCk6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbFRvcCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdD1kb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ9dGhpcy5fX3Njcm9sbExlZnQpfX07UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yPVtQb2x5bWVyLklyb25GaXRCZWhhdmlvcixQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvciwKUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbF19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL25lb24tYW5pbWF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcj17cHJvcGVydGllczp7YW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sZW50cnlBbmltYXRpb246e29ic2VydmVyOiJfZW50cnlBbmltYXRpb25DaGFuZ2VkIix0eXBlOlN0cmluZ30sZXhpdEFuaW1hdGlvbjp7b2JzZXJ2ZXI6Il9leGl0QW5pbWF0aW9uQ2hhbmdlZCIsdHlwZTpTdHJpbmd9fSxfZW50cnlBbmltYXRpb25DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25Db25maWc9dGhpcy5hbmltYXRpb25Db25maWd8fHt9O3RoaXMuYW5pbWF0aW9uQ29uZmlnLmVudHJ5PVt7bmFtZTp0aGlzLmVudHJ5QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfZXhpdEFuaW1hdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkNvbmZpZz10aGlzLmFuaW1hdGlvbkNvbmZpZ3x8e307dGhpcy5hbmltYXRpb25Db25maWcuZXhpdD1be25hbWU6dGhpcy5leGl0QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfY29weVByb3BlcnRpZXM6ZnVuY3Rpb24oYiwKZCl7Zm9yKHZhciBmIGluIGQpYltmXT1kW2ZdfSxfY2xvbmVDb25maWc6ZnVuY3Rpb24oYil7dmFyIGQ9e2lzQ2xvbmU6ITB9O3RoaXMuX2NvcHlQcm9wZXJ0aWVzKGQsYik7cmV0dXJuIGR9LF9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmU6ZnVuY3Rpb24oYixkLGYpe2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnKWlmKHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlKXRoaXMuX3dhcm4odGhpcy5fbG9nZigicGxheUFuaW1hdGlvbiIsIlBsZWFzZSBwdXQgJ2FuaW1hdGlvbkNvbmZpZycgaW5zaWRlIG9mIHlvdXIgY29tcG9uZW50cyAncHJvcGVydGllcycgb2JqZWN0IGluc3RlYWQgb2Ygb3V0c2lkZSBvZiBpdC4iKSk7ZWxzZXt2YXIgaD1iP3RoaXMuYW5pbWF0aW9uQ29uZmlnW2JdOnRoaXMuYW5pbWF0aW9uQ29uZmlnO0FycmF5LmlzQXJyYXkoaCl8fChoPVtoXSk7aWYoaClmb3IodmFyIGssdD0wO2s9CmhbdF07dCsrKWlmKGsuYW5pbWF0YWJsZSlrLmFuaW1hdGFibGUuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShrLnR5cGV8fGIsZCxmKTtlbHNlIGlmKGsuaWQpe3ZhciBsPWRbay5pZF07bD8obC5pc0Nsb25lfHwoZFtrLmlkXT10aGlzLl9jbG9uZUNvbmZpZyhsKSxsPWRbay5pZF0pLHRoaXMuX2NvcHlQcm9wZXJ0aWVzKGwsaykpOmRbay5pZF09a31lbHNlIGYucHVzaChrKX19LGdldEFuaW1hdGlvbkNvbmZpZzpmdW5jdGlvbihiKXt2YXIgZD17fSxmPVtdO3RoaXMuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShiLGQsZik7Zm9yKHZhciBoIGluIGQpZi5wdXNoKGRbaF0pO3JldHVybiBmfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbmVvbi1hbmltYXRpb24vbmVvbi1hbmltYXRpb24tcnVubmVyLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JJbXBsPXtfY29uZmlndXJlQW5pbWF0aW9uczpmdW5jdGlvbihiKXt2YXIgZD1bXSxmPVtdO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBoLGs9MDtoPWJba107aysrKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGgubmFtZSk7aWYodC5pc05lb25BbmltYXRpb24pe3ZhciBsPW51bGw7dC5jb25maWd1cmV8fCh0LmNvbmZpZ3VyZT1mdW5jdGlvbigpe3JldHVybiBudWxsfSk7bD10LmNvbmZpZ3VyZShoKTtmLnB1c2goe3Jlc3VsdDpsLGNvbmZpZzpofSl9ZWxzZSBjb25zb2xlLndhcm4odGhpcy5pcysiOiIsaC5uYW1lLCJub3QgZm91bmQhIil9Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyl7bD1mW2JdLnJlc3VsdDtoPWZbYl0uY29uZmlnO3RyeXsiZnVuY3Rpb24iIT10eXBlb2YgbC5jYW5jZWwmJihsPWRvY3VtZW50LnRpbWVsaW5lLnBsYXkobCkpfWNhdGNoKHApe2w9bnVsbCxjb25zb2xlLndhcm4oIkNvdWxkbnQgcGxheSIsCiIoIixoLm5hbWUsIikuIixwKX1sJiZkLnB1c2goe25lb25BbmltYXRpb246dCxjb25maWc6aCxhbmltYXRpb246bH0pfXJldHVybiBkfSxfc2hvdWxkQ29tcGxldGU6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPSEwLGY9MDtmPGIubGVuZ3RoO2YrKylpZigiZmluaXNoZWQiIT1iW2ZdLmFuaW1hdGlvbi5wbGF5U3RhdGUpe2Q9ITE7YnJlYWt9cmV0dXJuIGR9LF9jb21wbGV0ZTpmdW5jdGlvbihiKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdLm5lb25BbmltYXRpb24uY29tcGxldGUoYltkXS5jb25maWcpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYltkXS5hbmltYXRpb24uY2FuY2VsKCl9LHBsYXlBbmltYXRpb246ZnVuY3Rpb24oYixkKXt2YXIgZj10aGlzLmdldEFuaW1hdGlvbkNvbmZpZyhiKTtpZihmKXt0aGlzLl9hY3RpdmU9dGhpcy5fYWN0aXZlfHx7fTt0aGlzLl9hY3RpdmVbYl0mJih0aGlzLl9jb21wbGV0ZSh0aGlzLl9hY3RpdmVbYl0pLGRlbGV0ZSB0aGlzLl9hY3RpdmVbYl0pOwp2YXIgaD10aGlzLl9jb25maWd1cmVBbmltYXRpb25zKGYpO2lmKDA9PWgubGVuZ3RoKXRoaXMuZmlyZSgibmVvbi1hbmltYXRpb24tZmluaXNoIixkLHtidWJibGVzOiExfSk7ZWxzZSBmb3IodGhpcy5fYWN0aXZlW2JdPWgsZj0wO2Y8aC5sZW5ndGg7ZisrKWhbZl0uYW5pbWF0aW9uLm9uZmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5fc2hvdWxkQ29tcGxldGUoaCkmJih0aGlzLl9jb21wbGV0ZShoKSxkZWxldGUgdGhpcy5fYWN0aXZlW2JdLHRoaXMuZmlyZSgibmVvbi1hbmltYXRpb24tZmluaXNoIixkLHtidWJibGVzOiExfSkpfS5iaW5kKHRoaXMpfX0sY2FuY2VsQW5pbWF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBiIGluIHRoaXMuX2FjdGl2ZSl7dmFyIGQ9dGhpcy5fYWN0aXZlW2JdLGY7Zm9yKGYgaW4gZClkW2ZdLmFuaW1hdGlvbi5jYW5jZWwoKX10aGlzLl9hY3RpdmU9e319fTsKUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3I9W1BvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZHJvcGRvd24vaXJvbi1kcm9wZG93bi1zY3JvbGwtbWFuYWdlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkRyb3Bkb3duU2Nyb2xsTWFuYWdlcj1Qb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWRyb3Bkb3duL2lyb24tZHJvcGRvd24uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoiaXJvbi1kcm9wZG93biIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3IsUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JdLHByb3BlcnRpZXM6e2hvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxmb2N1c1RhcmdldDp7dHlwZTpPYmplY3R9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbGxvd091dHNpZGVTY3JvbGw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2FsbG93T3V0c2lkZVNjcm9sbENoYW5nZWQifX0sCmxpc3RlbmVyczp7Im5lb24tYW5pbWF0aW9uLWZpbmlzaCI6Il9vbk5lb25BbmltYXRpb25GaW5pc2gifSxvYnNlcnZlcnM6WyJfdXBkYXRlT3ZlcmxheVBvc2l0aW9uKHBvc2l0aW9uVGFyZ2V0LCB2ZXJ0aWNhbEFsaWduLCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsT2Zmc2V0LCBob3Jpem9udGFsT2Zmc2V0KSJdLGdldCBjb250YWluZWRFbGVtZW50KCl7Zm9yKHZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZD0wLGY9Yi5sZW5ndGg7ZDxmO2QrKylpZihiW2RdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGJbZF19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxBY3Rpb258fCh0aGlzLnNjcm9sbEFjdGlvbj10aGlzLmFsbG93T3V0c2lkZVNjcm9sbD8icmVmaXQiOiJsb2NrIik7dGhpcy5fcmVhZGllZD0hMH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNpemluZ1RhcmdldCYmdGhpcy5zaXppbmdUYXJnZXQhPT0KdGhpc3x8KHRoaXMuc2l6aW5nVGFyZ2V0PXRoaXMuY29udGFpbmVkRWxlbWVudHx8dGhpcyl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxBbmltYXRpb24oKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5kaXNhYmxlZD90aGlzLmNhbmNlbCgpOih0aGlzLmNhbmNlbEFuaW1hdGlvbigpLHRoaXMuX3VwZGF0ZUFuaW1hdGlvbkNvbmZpZygpLFBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcub3Blbj8odGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoImFuaW1hdGluZyIpLHRoaXMucGxheUFuaW1hdGlvbigib3BlbiIpKTpQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9yZW5kZXJPcGVuZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSwKX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcuY2xvc2U/KHRoaXMuJC5jb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKCJhbmltYXRpbmciKSx0aGlzLnBsYXlBbmltYXRpb24oImNsb3NlIikpOlBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX3JlbmRlckNsb3NlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgiYW5pbWF0aW5nIik7dGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9LF91cGRhdGVBbmltYXRpb25Db25maWc6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5jb250YWluZWRFbGVtZW50LGQ9W10uY29uY2F0KHRoaXMub3BlbkFuaW1hdGlvbkNvbmZpZ3x8W10pLmNvbmNhdCh0aGlzLmNsb3NlQW5pbWF0aW9uQ29uZmlnfHwKW10pLGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLm5vZGU9Yjt0aGlzLmFuaW1hdGlvbkNvbmZpZz17b3Blbjp0aGlzLm9wZW5BbmltYXRpb25Db25maWcsY2xvc2U6dGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZ319LF91cGRhdGVPdmVybGF5UG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJnRoaXMubm90aWZ5UmVzaXplKCl9LF9hbGxvd091dHNpZGVTY3JvbGxDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX3JlYWRpZWQmJihiP3RoaXMuc2Nyb2xsQWN0aW9uJiYibG9jayIhPT10aGlzLnNjcm9sbEFjdGlvbnx8KHRoaXMuc2Nyb2xsQWN0aW9uPSJyZWZpdCIpOnRoaXMuc2Nyb2xsQWN0aW9uPSJsb2NrIil9LF9hcHBseUZvY3VzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5mb2N1c1RhcmdldHx8dGhpcy5jb250YWluZWRFbGVtZW50O2ImJnRoaXMub3BlbmVkJiYhdGhpcy5ub0F1dG9Gb2N1cz9iLmZvY3VzKCk6UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fYXBwbHlGb2N1cy5hcHBseSh0aGlzLAphcmd1bWVudHMpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9uZW9uLWFuaW1hdGlvbi1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthbmltYXRpb25UaW1pbmc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2R1cmF0aW9uOjUwMCxlYXNpbmc6ImN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSkiLGZpbGw6ImJvdGgifX19fSxpc05lb25BbmltYXRpb246ITAsY3JlYXRlZDpmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYW5pbWF0ZXx8Y29uc29sZS53YXJuKCJObyB3ZWIgYW5pbWF0aW9ucyBkZXRlY3RlZC4gVGhpcyBlbGVtZW50IHdpbGwgbm90IGZ1bmN0aW9uIHdpdGhvdXQgYSB3ZWIgYW5pbWF0aW9ucyBwb2x5ZmlsbC4iKX0sdGltaW5nRnJvbUNvbmZpZzpmdW5jdGlvbihiKXtpZihiLnRpbWluZylmb3IodmFyIGQgaW4gYi50aW1pbmcpdGhpcy5hbmltYXRpb25UaW1pbmdbZF09Yi50aW1pbmdbZF07cmV0dXJuIHRoaXMuYW5pbWF0aW9uVGltaW5nfSxzZXRQcmVmaXhlZFByb3BlcnR5OmZ1bmN0aW9uKGIsZCxmKXtmb3IodmFyIGg9Cnt0cmFuc2Zvcm06WyJ3ZWJraXRUcmFuc2Zvcm0iXSx0cmFuc2Zvcm1PcmlnaW46WyJtb3pUcmFuc2Zvcm1PcmlnaW4iLCJ3ZWJraXRUcmFuc2Zvcm1PcmlnaW4iXX1bZF0sayx0PTA7az1oW3RdO3QrKyliLnN0eWxlW2tdPWY7Yi5zdHlsZVtkXT1mfSxjb21wbGV0ZTpmdW5jdGlvbigpe319OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL2FuaW1hdGlvbnMvZmFkZS1pbi1hbmltYXRpb24uaHRtbC5qcwpQb2x5bWVyKHtpczoiZmFkZS1pbi1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChiLm5vZGUsW3tvcGFjaXR5OiIwIn0se29wYWNpdHk6IjEifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9hbmltYXRpb25zL2ZhZGUtb3V0LWFuaW1hdGlvbi5odG1sLmpzClBvbHltZXIoe2lzOiJmYWRlLW91dC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChiLm5vZGUsW3tvcGFjaXR5OiIxIn0se29wYWNpdHk6IjAifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tZW51LWJ1dHRvbi9wYXBlci1tZW51LWJ1dHRvbi1hbmltYXRpb25zLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLW1lbnUtZ3Jvdy1oZWlnaHQtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoZCxbe2hlaWdodDpmLzIrInB4In0se2hlaWdodDpmKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pO1BvbHltZXIoe2lzOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7d2lkdGg6Zi8yKyJweCJ9LHt3aWR0aDpmKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7d2lkdGg6ZisicHgifSx7d2lkdGg6Zi1mLzIwKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGIpe3ZhciBkPWIubm9kZSxmPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3RoaXMuc2V0UHJlZml4ZWRQcm9wZXJ0eShkLCJ0cmFuc2Zvcm1PcmlnaW4iLCIwIDAiKTtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7aGVpZ2h0OmYrInB4Iix0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSx7aGVpZ2h0OmYvMisicHgiLHRyYW5zZm9ybToidHJhbnNsYXRlWSgtMjBweCkifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tZW51LWJ1dHRvbi9wYXBlci1tZW51LWJ1dHRvbi5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtBTklNQVRJT05fQ1VCSUNfQkVaSUVSOiJjdWJpYy1iZXppZXIoLjMsLjk1LC41LDEpIixNQVhfQU5JTUFUSU9OX1RJTUVfTVM6NDAwfTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbj1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLnJlZ2lzdGVyZWQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5hZGRPd25LZXlCaW5kaW5nPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUucmVtb3ZlT3duS2V5QmluZGluZ3M9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXM9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fY29sbGVjdEtleUJpbmRpbmdzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3ByZXBLZXlCaW5kaW5ncz0KZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fYWRkS2V5QmluZGluZz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fb25LZXlCaW5kaW5nRXZlbnQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fdHJpZ2dlcktleUhhbmRsZXI9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fZm9jdXNCbHVySGFuZGxlcj1mdW5jdGlvbihkKXtpZihQb2x5bWVyLkVsZW1lbnQpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09CmQudHlwZSk7ZWxzZSBpZihkLnRhcmdldD09PXRoaXMpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09ZC50eXBlKTtlbHNlIGlmKHRoaXMuX19oYW5kbGVFdmVudFJldGFyZ2V0aW5nKXt2YXIgZj1Qb2x5bWVyLmRvbShkKS5sb2NhbFRhcmdldDt0aGlzLmlzTGlnaHREZXNjZW5kYW50KGYpfHx0aGlzLmZpcmUoZC50eXBlLHtzb3VyY2VFdmVudDpkfSx7bm9kZTp0aGlzLGJ1YmJsZXM6ZC5idWJibGVzLGNhbmNlbGFibGU6ZC5jYW5jZWxhYmxlfSl9fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2NoYW5nZWRDb250cm9sU3RhdGU9ZnVuY3Rpb24oKXt0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkJiZ0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkKCl9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fc2V0Rm9jdXNlZD1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b249UG9seW1lcih7aXM6InBhcGVyLW1lbnUtYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsClBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZV0scHJvcGVydGllczp7b3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxkeW5hbWljQWxpZ246e3R5cGU6Qm9vbGVhbn0saG9yaXpvbnRhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHZlcnRpY2FsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbm9PdmVybGFwOnt0eXBlOkJvb2xlYW59LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpZ25vcmVTZWxlY3Q6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2VPbkFjdGl2YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG9wZW5BbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LAp2YWx1ZTpmdW5jdGlvbigpe3JldHVyblt7bmFtZToiZmFkZS1pbi1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjIwMH19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjoxNTAsZWFzaW5nOmIuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246Mjc1LGVhc2luZzpiLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fV19fSxjbG9zZUFuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5be25hbWU6ImZhZGUtb3V0LWFuaW1hdGlvbiIsdGltaW5nOntkdXJhdGlvbjoxNTB9fSx7bmFtZToicGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjo1MCxlYXNpbmc6Yi5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX0sCntuYW1lOiJwYXBlci1tZW51LXNocmluay1oZWlnaHQtYW5pbWF0aW9uIix0aW1pbmc6e2R1cmF0aW9uOjIwMCxlYXNpbmc6ImVhc2UtaW4ifX1dfX0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2Ryb3Bkb3duQ29udGVudDp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9LGxpc3RlbmVyczp7Imlyb24tYWN0aXZhdGUiOiJfb25Jcm9uQWN0aXZhdGUiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QifSxnZXQgY29udGVudEVsZW1lbnQoKXtmb3IodmFyIGQ9UG9seW1lci5kb20odGhpcy4kLmNvbnRlbnQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSxmPTAsaD1kLmxlbmd0aDtmPGg7ZisrKWlmKGRbZl0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gZFtmXX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/CnRoaXMuY2xvc2UoKTp0aGlzLm9wZW4oKX0sb3BlbjpmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWR8fHRoaXMuJC5kcm9wZG93bi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLmRyb3Bkb3duLmNsb3NlKCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZVNlbGVjdHx8dGhpcy5jbG9zZSgpfSxfb25Jcm9uQWN0aXZhdGU6ZnVuY3Rpb24oKXt0aGlzLmNsb3NlT25BY3RpdmF0ZSYmdGhpcy5jbG9zZSgpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihkLGYpe2Q/KHRoaXMuX2Ryb3Bkb3duQ29udGVudD10aGlzLmNvbnRlbnRFbGVtZW50LHRoaXMuZmlyZSgicGFwZXItZHJvcGRvd24tb3BlbiIpKTpudWxsIT1mJiZ0aGlzLmZpcmUoInBhcGVyLWRyb3Bkb3duLWNsb3NlIil9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oZCl7UG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLl9kaXNhYmxlZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2QmJnRoaXMub3BlbmVkJiYKdGhpcy5jbG9zZSgpfSxfX29uSXJvbk92ZXJsYXlDYW5jZWxlZDpmdW5jdGlvbihkKXt2YXIgZj10aGlzLiQudHJpZ2dlcjstMTxQb2x5bWVyLmRvbShkLmRldGFpbCkucGF0aC5pbmRleE9mKGYpJiZkLnByZXZlbnREZWZhdWx0KCl9fSk7T2JqZWN0LmtleXMoYikuZm9yRWFjaChmdW5jdGlvbihkKXtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbltkXT1iW2RdfSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24taWNvbnNldC1zdmcvaXJvbi1pY29uc2V0LXN2Zy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWljb25zZXQtc3ZnIixwcm9wZXJ0aWVzOntuYW1lOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX25hbWVDaGFuZ2VkIn0sc2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MjR9LHJ0bE1pcnJvcmluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx1c2VHbG9iYWxSdGxBdHRyaWJ1dGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJpY29uc2V0IixrZXk6bnVsbCx2YWx1ZTpudWxsfSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZ2V0SWNvbk5hbWVzOmZ1bmN0aW9uKCl7dGhpcy5faWNvbnM9dGhpcy5fY3JlYXRlSWNvbk1hcCgpO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9pY29ucykubWFwKGZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm5hbWUrIjoiK2J9LHRoaXMpfSxhcHBseUljb246ZnVuY3Rpb24oYixkKXt0aGlzLnJlbW92ZUljb24oYik7CmlmKGQ9dGhpcy5fY2xvbmVJY29uKGQsdGhpcy5ydGxNaXJyb3JpbmcmJnRoaXMuX3RhcmdldElzUlRMKGIpKSl7dmFyIGY9UG9seW1lci5kb20oYi5yb290fHxiKTtmLmluc2VydEJlZm9yZShkLGYuY2hpbGROb2Rlc1swXSk7cmV0dXJuIGIuX3N2Z0ljb249ZH1yZXR1cm4gbnVsbH0scmVtb3ZlSWNvbjpmdW5jdGlvbihiKXtiLl9zdmdJY29uJiYoUG9seW1lci5kb20oYi5yb290fHxiKS5yZW1vdmVDaGlsZChiLl9zdmdJY29uKSxiLl9zdmdJY29uPW51bGwpfSxfdGFyZ2V0SXNSVEw6ZnVuY3Rpb24oYil7bnVsbD09dGhpcy5fX3RhcmdldElzUlRMJiYodGhpcy51c2VHbG9iYWxSdGxBdHRyaWJ1dGU/dGhpcy5fX3RhcmdldElzUlRMPSJydGwiPT09KGRvY3VtZW50LmJvZHkmJmRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkaXIiKT9kb2N1bWVudC5ib2R5OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0QXR0cmlidXRlKCJkaXIiKTooYiYmYi5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFJiYKKGI9Yi5ob3N0KSx0aGlzLl9fdGFyZ2V0SXNSVEw9YiYmInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiKS5kaXJlY3Rpb24pKTtyZXR1cm4gdGhpcy5fX3RhcmdldElzUlRMfSxfbmFtZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhLnZhbHVlPW51bGw7dGhpcy5fbWV0YS5rZXk9dGhpcy5uYW1lO3RoaXMuX21ldGEudmFsdWU9dGhpczt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5maXJlKCJpcm9uLWljb25zZXQtYWRkZWQiLHRoaXMse25vZGU6d2luZG93fSl9KX0sX2NyZWF0ZUljb25NYXA6ZnVuY3Rpb24oKXt2YXIgYj1PYmplY3QuY3JlYXRlKG51bGwpO1BvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2JbZC5pZF09ZH0pO3JldHVybiBifSxfY2xvbmVJY29uOmZ1bmN0aW9uKGIsZCl7dGhpcy5faWNvbnM9dGhpcy5faWNvbnN8fHRoaXMuX2NyZWF0ZUljb25NYXAoKTtyZXR1cm4gdGhpcy5fcHJlcGFyZVN2Z0Nsb25lKHRoaXMuX2ljb25zW2JdLAp0aGlzLnNpemUsZCl9LF9wcmVwYXJlU3ZnQ2xvbmU6ZnVuY3Rpb24oYixkLGYpe2lmKGIpe2I9Yi5jbG9uZU5vZGUoITApO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJzdmciKTtkPWIuZ2V0QXR0cmlidXRlKCJ2aWV3Qm94Iil8fCIwIDAgIitkKyIgIitkO3ZhciBrPSJwb2ludGVyLWV2ZW50czogbm9uZTsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IjtmJiZiLmhhc0F0dHJpYnV0ZSgibWlycm9yLWluLXJ0bCIpJiYoays9Ii13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC0xLDEpO3RyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjsiKTtoLnNldEF0dHJpYnV0ZSgidmlld0JveCIsZCk7aC5zZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0Iik7aC5zZXRBdHRyaWJ1dGUoImZvY3VzYWJsZSIsImZhbHNlIik7aC5zdHlsZS5jc3NUZXh0PQprO2guYXBwZW5kQ2hpbGQoYikucmVtb3ZlQXR0cmlidXRlKCJpZCIpO3JldHVybiBofXJldHVybiBudWxsfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRyb3Bkb3duLW1lbnUvcGFwZXItZHJvcGRvd24tbWVudS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJwYXBlci1kcm9wZG93bi1tZW51IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlbGVjdGVkSXRlbUxhYmVsOnt0eXBlOlN0cmluZyxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxsYWJlbDp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30sZXJyb3JNZXNzYWdlOnt0eXBlOlN0cmluZ30sb3BlbmVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJyaWdodCJ9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AifSx2ZXJ0aWNhbE9mZnNldDpOdW1iZXIsZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dGFwOiJfb25UYXAifSxrZXlCaW5kaW5nczp7InVwIGRvd24iOiJvcGVuIixlc2M6ImNsb3NlIn0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImNvbWJvYm94IiwiYXJpYS1hdXRvY29tcGxldGUiOiJub25lIiwiYXJpYS1oYXNwb3B1cCI6InRydWUifSxvYnNlcnZlcnM6WyJfc2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0pIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5jb250ZW50RWxlbWVudDtiJiZiLnNlbGVjdGVkSXRlbSYmdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIuc2VsZWN0ZWRJdGVtKX0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZD0wLGY9Yi5sZW5ndGg7ZDxmO2QrKylpZihiW2RdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGJbZF19LG9wZW46ZnVuY3Rpb24oKXt0aGlzLiQubWVudUJ1dHRvbi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24uY2xvc2UoKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbihiKXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0oYi5kZXRhaWwuaXRlbSl9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKX0sX29uVGFwOmZ1bmN0aW9uKGIpe1BvbHltZXIuR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0KGIpPT09dGhpcyYmCnRoaXMub3BlbigpfSxfc2VsZWN0ZWRJdGVtQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnZhbHVlPWI9Yj9iLmxhYmVsfHxiLmdldEF0dHJpYnV0ZSgibGFiZWwiKXx8Yi50ZXh0Q29udGVudC50cmltKCk6IiI7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtTGFiZWwoYil9LF9jb21wdXRlTWVudVZlcnRpY2FsT2Zmc2V0OmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGQ/ZDpiPy00Ojh9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5yZXF1aXJlZHx8dGhpcy5yZXF1aXJlZCYmISF0aGlzLnZhbHVlfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3BlbmVkPyJ0cnVlIjoiZmFsc2UiLGQ9dGhpcy5jb250ZW50RWxlbWVudDtkJiZkLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3Rpb24uaHRtbC5qcwpQb2x5bWVyLklyb25TZWxlY3Rpb249ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3Rpb249W107dGhpcy5zZWxlY3RDYWxsYmFjaz1ifTsKUG9seW1lci5Jcm9uU2VsZWN0aW9uLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGk/dGhpcy5zZWxlY3Rpb24uc2xpY2UoKTp0aGlzLnNlbGVjdGlvblswXX0sY2xlYXI6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3Rpb24uc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGQpeyghYnx8MD5iLmluZGV4T2YoZCkpJiZ0aGlzLnNldEl0ZW1TZWxlY3RlZChkLCExKX0sdGhpcyl9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYil9LHNldEl0ZW1TZWxlY3RlZDpmdW5jdGlvbihiLGQpe2lmKG51bGwhPWImJmQhPT10aGlzLmlzU2VsZWN0ZWQoYikpe2lmKGQpdGhpcy5zZWxlY3Rpb24ucHVzaChiKTtlbHNle3ZhciBmPXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYik7MDw9ZiYmdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGYsMSl9dGhpcy5zZWxlY3RDYWxsYmFjayYmdGhpcy5zZWxlY3RDYWxsYmFjayhiLGQpfX0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMubXVsdGk/CnRoaXMudG9nZ2xlKGIpOnRoaXMuZ2V0KCkhPT1iJiYodGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwhMSksdGhpcy5zZXRJdGVtU2VsZWN0ZWQoYiwhMCkpfSx0b2dnbGU6ZnVuY3Rpb24oYil7dGhpcy5zZXRJdGVtU2VsZWN0ZWQoYiwhdGhpcy5pc1NlbGVjdGVkKGIpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHNlbGVjdGVkOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxhY3RpdmF0ZUV2ZW50Ont0eXBlOlN0cmluZyx2YWx1ZToidGFwIixvYnNlcnZlcjoiX2FjdGl2YXRlRXZlbnRDaGFuZ2VkIn0sc2VsZWN0YWJsZTpTdHJpbmcsc2VsZWN0ZWRDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6Imlyb24tc2VsZWN0ZWQifSxzZWxlY3RlZEF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZmFsbGJhY2tTZWxlY3Rpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX2V4Y2x1ZGVkTG9jYWxOYW1lczp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dGVtcGxhdGU6MSwKImRvbS1iaW5kIjoxLCJkb20taWYiOjEsImRvbS1yZXBlYXQiOjF9fX19LG9ic2VydmVyczpbIl91cGRhdGVBdHRyRm9yU2VsZWN0ZWQoYXR0ckZvclNlbGVjdGVkKSIsIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZCkiLCJfY2hlY2tGYWxsYmFjayhmYWxsYmFja1NlbGVjdGlvbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYmluZEZpbHRlckl0ZW09dGhpcy5fZmlsdGVySXRlbS5iaW5kKHRoaXMpO3RoaXMuX3NlbGVjdGlvbj1uZXcgUG9seW1lci5Jcm9uU2VsZWN0aW9uKHRoaXMuX2FwcGx5U2VsZWN0aW9uLmJpbmQodGhpcykpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmVJdGVtcyh0aGlzKTt0aGlzLl9hZGRMaXN0ZW5lcih0aGlzLmFjdGl2YXRlRXZlbnQpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZQb2x5bWVyLmRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlcik7dGhpcy5fcmVtb3ZlTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KX0sCmluZGV4T2Y6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuaXRlbXM/dGhpcy5pdGVtcy5pbmRleE9mKGIpOi0xfSxzZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZD1ifSxzZWxlY3RQcmV2aW91czpmdW5jdGlvbigpe3ZhciBiPXRoaXMuaXRlbXMubGVuZ3RoO2I9KE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpLTErYiklYjt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShiKX0sc2VsZWN0TmV4dDpmdW5jdGlvbigpe3ZhciBiPShOdW1iZXIodGhpcy5fdmFsdWVUb0luZGV4KHRoaXMuc2VsZWN0ZWQpKSsxKSV0aGlzLml0ZW1zLmxlbmd0aDt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShiKX0sc2VsZWN0SW5kZXg6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3QodGhpcy5faW5kZXhUb1ZhbHVlKGIpKX0sZm9yY2VTeW5jaHJvbm91c0l0ZW1VcGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLl9vYnNlcnZlci5mbHVzaD8KdGhpcy5fb2JzZXJ2ZXIuZmx1c2goKTp0aGlzLl91cGRhdGVJdGVtcygpfSxnZXQgX3Nob3VsZFVwZGF0ZVNlbGVjdGlvbigpe3JldHVybiBudWxsIT10aGlzLnNlbGVjdGVkfSxfY2hlY2tGYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLmxpc3Rlbih0aGlzLGIsIl9hY3RpdmF0ZUhhbmRsZXIiKX0sX3JlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGIpe3RoaXMudW5saXN0ZW4odGhpcyxiLCJfYWN0aXZhdGVIYW5kbGVyIil9LF9hY3RpdmF0ZUV2ZW50Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuX3JlbW92ZUxpc3RlbmVyKGQpO3RoaXMuX2FkZExpc3RlbmVyKGIpfSxfdXBkYXRlSXRlbXM6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModGhpcy5zZWxlY3RhYmxlfHwiKiIpO2I9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGIsdGhpcy5fYmluZEZpbHRlckl0ZW0pOwp0aGlzLl9zZXRJdGVtcyhiKX0sX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWRJdGVtJiYodGhpcy5zZWxlY3RlZD10aGlzLl92YWx1ZUZvckl0ZW0odGhpcy5zZWxlY3RlZEl0ZW0pKX0sX3VwZGF0ZVNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5fc2VsZWN0U2VsZWN0ZWQodGhpcy5zZWxlY3RlZCl9LF9zZWxlY3RTZWxlY3RlZDpmdW5jdGlvbigpe2lmKHRoaXMuaXRlbXMpe3ZhciBiPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2I/dGhpcy5fc2VsZWN0aW9uLnNlbGVjdChiKTp0aGlzLl9zZWxlY3Rpb24uY2xlYXIoKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiZ0aGlzLml0ZW1zLmxlbmd0aCYmdm9pZCAwPT09dGhpcy5fc2VsZWN0aW9uLmdldCgpJiYodGhpcy5zZWxlY3RlZD10aGlzLmZhbGxiYWNrU2VsZWN0aW9uKX19LF9maWx0ZXJJdGVtOmZ1bmN0aW9uKGIpe3JldHVybiF0aGlzLl9leGNsdWRlZExvY2FsTmFtZXNbYi5sb2NhbE5hbWVdfSwKX3ZhbHVlVG9JdGVtOmZ1bmN0aW9uKGIpe3JldHVybiBudWxsPT1iP251bGw6dGhpcy5pdGVtc1t0aGlzLl92YWx1ZVRvSW5kZXgoYildfSxfdmFsdWVUb0luZGV4OmZ1bmN0aW9uKGIpe2lmKHRoaXMuYXR0ckZvclNlbGVjdGVkKWZvcih2YXIgZD0wLGY7Zj10aGlzLml0ZW1zW2RdO2QrKyl7aWYodGhpcy5fdmFsdWVGb3JJdGVtKGYpPT1iKXJldHVybiBkfWVsc2UgcmV0dXJuIE51bWJlcihiKX0sX2luZGV4VG9WYWx1ZTpmdW5jdGlvbihiKXtpZih0aGlzLmF0dHJGb3JTZWxlY3RlZCl7aWYoYj10aGlzLml0ZW1zW2JdKXJldHVybiB0aGlzLl92YWx1ZUZvckl0ZW0oYil9ZWxzZSByZXR1cm4gYn0sX3ZhbHVlRm9ySXRlbTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4gbnVsbDtpZighdGhpcy5hdHRyRm9yU2VsZWN0ZWQpcmV0dXJuIGI9dGhpcy5pbmRleE9mKGIpLC0xPT09Yj9udWxsOmI7dmFyIGQ9YltQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclNlbGVjdGVkKV07CnJldHVybiB2b2lkIDAhPWQ/ZDpiLmdldEF0dHJpYnV0ZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCl9LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbihiLGQpe3RoaXMuc2VsZWN0ZWRDbGFzcyYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MsZCxiKTt0aGlzLnNlbGVjdGVkQXR0cmlidXRlJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkQXR0cmlidXRlLGQsYik7dGhpcy5fc2VsZWN0aW9uQ2hhbmdlKCk7dGhpcy5maXJlKCJpcm9uLSIrKGQ/InNlbGVjdCI6ImRlc2VsZWN0Iikse2l0ZW06Yn0pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHRoaXMuX3NlbGVjdGlvbi5nZXQoKSl9LF9vYnNlcnZlSXRlbXM6ZnVuY3Rpb24oYil7cmV0dXJuIFBvbHltZXIuZG9tKGIpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihkKXt0aGlzLl91cGRhdGVJdGVtcygpO3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCk7dGhpcy5maXJlKCJpcm9uLWl0ZW1zLWNoYW5nZWQiLApkLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KX0pfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKGIpe2I9Yi50YXJnZXQ7Zm9yKHZhciBkPXRoaXMuaXRlbXM7YiYmYiE9dGhpczspe3ZhciBmPWQuaW5kZXhPZihiKTtpZigwPD1mKXtkPXRoaXMuX2luZGV4VG9WYWx1ZShmKTt0aGlzLl9pdGVtQWN0aXZhdGUoZCxiKTticmVha31iPWIucGFyZW50Tm9kZX19LF9pdGVtQWN0aXZhdGU6ZnVuY3Rpb24oYixkKXt0aGlzLmZpcmUoImlyb24tYWN0aXZhdGUiLHtzZWxlY3RlZDpiLGl0ZW06ZH0se2NhbmNlbGFibGU6ITB9KS5kZWZhdWx0UHJldmVudGVkfHx0aGlzLnNlbGVjdChiKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1tdWx0aS1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOnttdWx0aTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJtdWx0aUNoYW5nZWQifSxzZWxlY3RlZFZhbHVlczp7dHlwZTpBcnJheSxub3RpZnk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNlbGVjdGVkSXRlbXM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVNlbGVjdGVkKHNlbGVjdGVkVmFsdWVzLnNwbGljZXMpIl0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMubXVsdGk/dGhpcy5fdG9nZ2xlU2VsZWN0ZWQoYik6dGhpcy5zZWxlY3RlZD1ifSxtdWx0aUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fc2VsZWN0aW9uLm11bHRpPWI7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKX0sZ2V0IF9zaG91bGRVcGRhdGVTZWxlY3Rpb24oKXtyZXR1cm4gbnVsbCE9dGhpcy5zZWxlY3RlZHx8Cm51bGwhPXRoaXMuc2VsZWN0ZWRWYWx1ZXMmJnRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSxfdXBkYXRlQXR0ckZvclNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJjA8dGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCYmKHRoaXMuc2VsZWN0ZWRWYWx1ZXM9dGhpcy5zZWxlY3RlZEl0ZW1zLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5faW5kZXhUb1ZhbHVlKHRoaXMuaW5kZXhPZihiKSl9LHRoaXMpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gbnVsbCE9Yn0sdGhpcykpOlBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fdXBkYXRlQXR0ckZvclNlbGVjdGVkLmFwcGx5KHRoaXMpfSxfdXBkYXRlU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLm11bHRpP3RoaXMuX3NlbGVjdE11bHRpKHRoaXMuc2VsZWN0ZWRWYWx1ZXMpOnRoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0TXVsdGk6ZnVuY3Rpb24oYil7Yj0KYnx8W107Yj0odGhpcy5fdmFsdWVzVG9JdGVtcyhiKXx8W10pLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4gbnVsbCE9PWYmJnZvaWQgMCE9PWZ9KTt0aGlzLl9zZWxlY3Rpb24uY2xlYXIoYik7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspdGhpcy5fc2VsZWN0aW9uLnNldEl0ZW1TZWxlY3RlZChiW2RdLCEwKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiYhdGhpcy5fc2VsZWN0aW9uLmdldCgpLmxlbmd0aCYmdGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5mYWxsYmFja1NlbGVjdGlvbikmJnRoaXMuc2VsZWN0KHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fc2VsZWN0aW9uLmdldCgpO3RoaXMubXVsdGk/KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoYiksdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIubGVuZ3RoP2JbMF06bnVsbCkpOm51bGwhPT1iJiZ2b2lkIDAhPT1iPyh0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKFtiXSksCnRoaXMuX3NldFNlbGVjdGVkSXRlbShiKSk6KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoW10pLHRoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKSl9LF90b2dnbGVTZWxlY3RlZDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLnNlbGVjdGVkVmFsdWVzLmluZGV4T2YoYik7MD5kP3RoaXMucHVzaCgic2VsZWN0ZWRWYWx1ZXMiLGIpOnRoaXMuc3BsaWNlKCJzZWxlY3RlZFZhbHVlcyIsZCwxKX0sX3ZhbHVlc1RvSXRlbXM6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PWI/bnVsbDpiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5fdmFsdWVUb0l0ZW0oZCl9LHRoaXMpfX07UG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3I9W1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntmb2N1c2VkSXRlbTp7b2JzZXJ2ZXI6Il9mb2N1c2VkSXRlbUNoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6T2JqZWN0fSxhdHRyRm9ySXRlbVRpdGxlOnt0eXBlOlN0cmluZ30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxfTU9ESUZJRVJfS0VZUzoiQWx0IEFsdEdyYXBoIENhcHNMb2NrIENvbnRyb2wgRm4gRm5Mb2NrIEh5cGVyIE1ldGEgTnVtTG9jayBPUyBTY3JvbGxMb2NrIFNoaWZ0IFN1cGVyIFN5bWJvbCBTeW1ib2xMb2NrIi5zcGxpdCgiICIpLF9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUzoxRTMsX3ByZXZpb3VzVGFiSW5kZXg6MCxob3N0QXR0cmlidXRlczp7cm9sZToibWVudSJ9LG9ic2VydmVyczpbIl91cGRhdGVNdWx0aXNlbGVjdGFibGUobXVsdGkpIl0sbGlzdGVuZXJzOntmb2N1czoiX29uRm9jdXMiLGtleWRvd246Il9vbktleWRvd24iLAoiaXJvbi1pdGVtcy1jaGFuZ2VkIjoiX29uSXJvbkl0ZW1zQ2hhbmdlZCJ9LGtleUJpbmRpbmdzOnt1cDoiX29uVXBLZXkiLGRvd246Il9vbkRvd25LZXkiLGVzYzoiX29uRXNjS2V5Iiwic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0VGFiaW5kaWNlcygpfSxzZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKTt2YXIgZD10aGlzLl92YWx1ZVRvSXRlbShiKTtkJiZkLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8KHRoaXMuX3NldEZvY3VzZWRJdGVtKGQpLFBvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9ySW1wbC5zZWxlY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3Jlc2V0VGFiaW5kaWNlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubXVsdGk/CnRoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGQ9PT1iPyIwIjoiLTEiKX0sdGhpcyl9LF91cGRhdGVNdWx0aXNlbGVjdGFibGU6ZnVuY3Rpb24oYil7Yj90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbXVsdGlzZWxlY3RhYmxlIil9LF9mb2N1c1dpdGhLZXlib2FyZEV2ZW50OmZ1bmN0aW9uKGIpe2lmKC0xPT09dGhpcy5fTU9ESUZJRVJfS0VZUy5pbmRleE9mKGIua2V5KSl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoIl9jbGVhclNlYXJjaFRleHQiKTt2YXIgZD10aGlzLl9zZWFyY2hUZXh0fHwiIjtkKz0oYi5rZXkmJjE9PWIua2V5Lmxlbmd0aD9iLmtleTpTdHJpbmcuZnJvbUNoYXJDb2RlKGIua2V5Q29kZSkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7CmI9ZC5sZW5ndGg7Zm9yKHZhciBmPTAsaDtoPXRoaXMuaXRlbXNbZl07ZisrKWlmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9dGhpcy5hdHRyRm9ySXRlbVRpdGxlfHwidGV4dENvbnRlbnQiO2s9KGhba118fGguZ2V0QXR0cmlidXRlKGspfHwiIikudHJpbSgpO2lmKCEoay5sZW5ndGg8YikmJmsuc2xpY2UoMCxiKS50b0xvY2FsZUxvd2VyQ2FzZSgpPT1kKXt0aGlzLl9zZXRGb2N1c2VkSXRlbShoKTticmVha319dGhpcy5fc2VhcmNoVGV4dD1kO3RoaXMuZGVib3VuY2UoIl9jbGVhclNlYXJjaFRleHQiLHRoaXMuX2NsZWFyU2VhcmNoVGV4dCx0aGlzLl9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUyl9fSxfY2xlYXJTZWFyY2hUZXh0OmZ1bmN0aW9uKCl7dGhpcy5fc2VhcmNoVGV4dD0iIn0sX2ZvY3VzUHJldmlvdXM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5pdGVtcy5sZW5ndGgsZD1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxmPTE7ZjwKYisxO2YrKyl7dmFyIGg9dGhpcy5pdGVtc1soZC1mK2IpJWJdO2lmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9UG9seW1lci5kb20oaCkuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O3RoaXMuX3NldEZvY3VzZWRJdGVtKGgpO2lmKFBvbHltZXIuZG9tKGspLmFjdGl2ZUVsZW1lbnQ9PWgpYnJlYWt9fX0sX2ZvY3VzTmV4dDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aCxkPU51bWJlcih0aGlzLmluZGV4T2YodGhpcy5mb2N1c2VkSXRlbSkpLGY9MTtmPGIrMTtmKyspe3ZhciBoPXRoaXMuaXRlbXNbKGQrZiklYl07aWYoIWguaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXt2YXIgaz1Qb2x5bWVyLmRvbShoKS5nZXRPd25lclJvb3QoKXx8ZG9jdW1lbnQ7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oaCk7aWYoUG9seW1lci5kb20oaykuYWN0aXZlRWxlbWVudD09aClicmVha319fSxfYXBwbHlTZWxlY3Rpb246ZnVuY3Rpb24oYixkKXtkP2Iuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwKInRydWUiKTpiLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIpO1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fYXBwbHlTZWxlY3Rpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfZm9jdXNlZEl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmZC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTshYnx8Yi5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fHRoaXMuZGlzYWJsZWR8fChiLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIiksYi5mb2N1cygpKX0sX29uSXJvbkl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihiKXtiLmRldGFpbC5hZGRlZE5vZGVzLmxlbmd0aCYmdGhpcy5fcmVzZXRUYWJpbmRpY2VzKCl9LF9vblNoaWZ0VGFiRG93bjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMDt0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKTt0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLAoiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixiKTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfb25Gb2N1czpmdW5jdGlvbihiKXshUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkJiYoYj1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0LGI9PT10aGlzfHwidW5kZWZpbmVkIj09PXR5cGVvZiBiLnRhYkluZGV4fHx0aGlzLmlzTGlnaHREZXNjZW5kYW50KGIpKSYmKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt2YXIgZD10aGlzLm11bHRpP3RoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuX3NldEZvY3VzZWRJdGVtKG51bGwpO2Q/dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oZCk6dGhpcy5pdGVtc1swXSYmdGhpcy5fZm9jdXNOZXh0KCl9KSl9LF9vblVwS2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzUHJldmlvdXMoKTsKYi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzTmV4dCgpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRXNjS2V5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5mb2N1c2VkSXRlbTtiJiZiLmJsdXIoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihiKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ1cCBkb3duIGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KGIpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yLl9hY3RpdmF0ZUhhbmRsZXIuY2FsbCh0aGlzLGIpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7Yj8odGhpcy5fcHJldmlvdXNUYWJJbmRleD10aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT90aGlzLnRhYkluZGV4OgowLHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpKTp0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4Iix0aGlzLl9wcmV2aW91c1RhYkluZGV4KX19O1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3I9W1BvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItbGlzdGJveC9wYXBlci1saXN0Ym94Lmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InBhcGVyLWxpc3Rib3giLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uTWVudUJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToibGlzdGJveCJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToib3B0aW9uIix0YWJpbmRleDoiMCJ9fTtQb2x5bWVyLlBhcGVySXRlbUJlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlckl0ZW1CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pdGVtIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JdfSk7CgovKgoKIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz4KIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanMuZm91bmRhdGlvbi8+CiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPgogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCiovCihmdW5jdGlvbigpe3ZhciB1bmRlZmluZWQ7dmFyIFZFUlNJT049IjQuMTcuNSI7dmFyIExBUkdFX0FSUkFZX1NJWkU9MjAwO3ZhciBDT1JFX0VSUk9SX1RFWFQ9IlVuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xXHgzZHBvbnlmaWxsLiIsRlVOQ19FUlJPUl9URVhUPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjt2YXIgSEFTSF9VTkRFRklORUQ9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO3ZhciBNQVhfTUVNT0laRV9TSVpFPTUwMDt2YXIgUExBQ0VIT0xERVI9Il9fbG9kYXNoX3BsYWNlaG9sZGVyX18iO3ZhciBDTE9ORV9ERUVQX0ZMQUc9MSxDTE9ORV9GTEFUX0ZMQUc9MixDTE9ORV9TWU1CT0xTX0ZMQUc9NDt2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUc9MSxDT01QQVJFX1VOT1JERVJFRF9GTEFHPTI7dmFyIFdSQVBfQklORF9GTEFHPTEsV1JBUF9CSU5EX0tFWV9GTEFHPTIsV1JBUF9DVVJSWV9CT1VORF9GTEFHPTQsV1JBUF9DVVJSWV9GTEFHPQo4LFdSQVBfQ1VSUllfUklHSFRfRkxBRz0xNixXUkFQX1BBUlRJQUxfRkxBRz0zMixXUkFQX1BBUlRJQUxfUklHSFRfRkxBRz02NCxXUkFQX0FSWV9GTEFHPTEyOCxXUkFQX1JFQVJHX0ZMQUc9MjU2LFdSQVBfRkxJUF9GTEFHPTUxMjt2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEg9MzAsREVGQVVMVF9UUlVOQ19PTUlTU0lPTj0iLi4uIjt2YXIgSE9UX0NPVU5UPTgwMCxIT1RfU1BBTj0xNjt2YXIgTEFaWV9GSUxURVJfRkxBRz0xLExBWllfTUFQX0ZMQUc9MixMQVpZX1dISUxFX0ZMQUc9Mzt2YXIgSU5GSU5JVFk9MS8wLE1BWF9TQUZFX0lOVEVHRVI9OTAwNzE5OTI1NDc0MDk5MSxNQVhfSU5URUdFUj0xLjc5NzY5MzEzNDg2MjMxNTdFMzA4LE5BTj0wLzA7dmFyIE1BWF9BUlJBWV9MRU5HVEg9NDI5NDk2NzI5NSxNQVhfQVJSQVlfSU5ERVg9TUFYX0FSUkFZX0xFTkdUSC0xLEhBTEZfTUFYX0FSUkFZX0xFTkdUSD1NQVhfQVJSQVlfTEVOR1RIPj4+MTt2YXIgd3JhcEZsYWdzPVtbImFyeSIsCldSQVBfQVJZX0ZMQUddLFsiYmluZCIsV1JBUF9CSU5EX0ZMQUddLFsiYmluZEtleSIsV1JBUF9CSU5EX0tFWV9GTEFHXSxbImN1cnJ5IixXUkFQX0NVUlJZX0ZMQUddLFsiY3VycnlSaWdodCIsV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxbImZsaXAiLFdSQVBfRkxJUF9GTEFHXSxbInBhcnRpYWwiLFdSQVBfUEFSVElBTF9GTEFHXSxbInBhcnRpYWxSaWdodCIsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFsicmVhcmciLFdSQVBfUkVBUkdfRkxBR11dO3ZhciBhcmdzVGFnPSJbb2JqZWN0IEFyZ3VtZW50c10iLGFycmF5VGFnPSJbb2JqZWN0IEFycmF5XSIsYXN5bmNUYWc9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLGJvb2xUYWc9IltvYmplY3QgQm9vbGVhbl0iLGRhdGVUYWc9IltvYmplY3QgRGF0ZV0iLGRvbUV4Y1RhZz0iW29iamVjdCBET01FeGNlcHRpb25dIixlcnJvclRhZz0iW29iamVjdCBFcnJvcl0iLGZ1bmNUYWc9IltvYmplY3QgRnVuY3Rpb25dIixnZW5UYWc9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIiwKbWFwVGFnPSJbb2JqZWN0IE1hcF0iLG51bWJlclRhZz0iW29iamVjdCBOdW1iZXJdIixudWxsVGFnPSJbb2JqZWN0IE51bGxdIixvYmplY3RUYWc9IltvYmplY3QgT2JqZWN0XSIscHJvbWlzZVRhZz0iW29iamVjdCBQcm9taXNlXSIscHJveHlUYWc9IltvYmplY3QgUHJveHldIixyZWdleHBUYWc9IltvYmplY3QgUmVnRXhwXSIsc2V0VGFnPSJbb2JqZWN0IFNldF0iLHN0cmluZ1RhZz0iW29iamVjdCBTdHJpbmddIixzeW1ib2xUYWc9IltvYmplY3QgU3ltYm9sXSIsdW5kZWZpbmVkVGFnPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHdlYWtNYXBUYWc9IltvYmplY3QgV2Vha01hcF0iLHdlYWtTZXRUYWc9IltvYmplY3QgV2Vha1NldF0iO3ZhciBhcnJheUJ1ZmZlclRhZz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGRhdGFWaWV3VGFnPSJbb2JqZWN0IERhdGFWaWV3XSIsZmxvYXQzMlRhZz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixmbG9hdDY0VGFnPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLAppbnQ4VGFnPSJbb2JqZWN0IEludDhBcnJheV0iLGludDE2VGFnPSJbb2JqZWN0IEludDE2QXJyYXldIixpbnQzMlRhZz0iW29iamVjdCBJbnQzMkFycmF5XSIsdWludDhUYWc9IltvYmplY3QgVWludDhBcnJheV0iLHVpbnQ4Q2xhbXBlZFRhZz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLHVpbnQxNlRhZz0iW29iamVjdCBVaW50MTZBcnJheV0iLHVpbnQzMlRhZz0iW29iamVjdCBVaW50MzJBcnJheV0iO3ZhciByZUVtcHR5U3RyaW5nTGVhZGluZz0vXGJfX3AgXCs9ICcnOy9nLHJlRW1wdHlTdHJpbmdNaWRkbGU9L1xiKF9fcCBcKz0pICcnIFwrL2cscmVFbXB0eVN0cmluZ1RyYWlsaW5nPS8oX19lXCguKj9cKXxcYl9fdFwpKSBcK1xuJyc7L2c7dmFyIHJlRXNjYXBlZEh0bWw9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLHJlVW5lc2NhcGVkSHRtbD0vWyY8PiInXS9nLHJlSGFzRXNjYXBlZEh0bWw9UmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxyZUhhc1VuZXNjYXBlZEh0bWw9ClJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTt2YXIgcmVFc2NhcGU9LzwlLShbXHNcU10rPyklPi9nLHJlRXZhbHVhdGU9LzwlKFtcc1xTXSs/KSU+L2cscmVJbnRlcnBvbGF0ZT0vPCU9KFtcc1xTXSs/KSU+L2c7dmFyIHJlSXNEZWVwUHJvcD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxyZUlzUGxhaW5Qcm9wPS9eXHcqJC8scmVQcm9wTmFtZT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZzt2YXIgcmVSZWdFeHBDaGFyPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxyZUhhc1JlZ0V4cENoYXI9UmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO3ZhciByZVRyaW09L15ccyt8XHMrJC9nLHJlVHJpbVN0YXJ0PS9eXHMrLyxyZVRyaW1FbmQ9L1xzKyQvO3ZhciByZVdyYXBDb21tZW50PS9ceyg/OlxuXC9cKiBcW3dyYXBwZWQgd2l0aCAuK1xdIFwqXC8pP1xuPy8sCnJlV3JhcERldGFpbHM9L1x7XG5cL1wqIFxbd3JhcHBlZCB3aXRoICguKylcXSBcKi8scmVTcGxpdERldGFpbHM9Lyw/ICYgLzt2YXIgcmVBc2NpaVdvcmQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZzt2YXIgcmVFc2NhcGVDaGFyPS9cXChcXCk/L2c7dmFyIHJlRXNUZW1wbGF0ZT0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2c7dmFyIHJlRmxhZ3M9L1x3KiQvO3ZhciByZUlzQmFkSGV4PS9eWy0rXTB4WzAtOWEtZl0rJC9pO3ZhciByZUlzQmluYXJ5PS9eMGJbMDFdKyQvaTt2YXIgcmVJc0hvc3RDdG9yPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvO3ZhciByZUlzT2N0YWw9L14wb1swLTddKyQvaTt2YXIgcmVJc1VpbnQ9L14oPzowfFsxLTldXGQqKSQvO3ZhciByZUxhdGluPS9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZzt2YXIgcmVOb01hdGNoPS8oJF4pLzt2YXIgcmVVbmVzY2FwZWRTdHJpbmc9Ci9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZzt2YXIgcnNBc3RyYWxSYW5nZT0iXFx1ZDgwMC1cXHVkZmZmIixyc0NvbWJvTWFya3NSYW5nZT0iXFx1MDMwMC1cXHUwMzZmIixyZUNvbWJvSGFsZk1hcmtzUmFuZ2U9IlxcdWZlMjAtXFx1ZmUyZiIscnNDb21ib1N5bWJvbHNSYW5nZT0iXFx1MjBkMC1cXHUyMGZmIixyc0NvbWJvUmFuZ2U9cnNDb21ib01hcmtzUmFuZ2UrcmVDb21ib0hhbGZNYXJrc1JhbmdlK3JzQ29tYm9TeW1ib2xzUmFuZ2UscnNEaW5nYmF0UmFuZ2U9IlxcdTI3MDAtXFx1MjdiZiIscnNMb3dlclJhbmdlPSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixyc01hdGhPcFJhbmdlPSJcXHhhY1xceGIxXFx4ZDdcXHhmNyIscnNOb25DaGFyUmFuZ2U9IlxceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmIixyc1B1bmN0dWF0aW9uUmFuZ2U9IlxcdTIwMDAtXFx1MjA2ZiIscnNTcGFjZVJhbmdlPSIgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLApyc1VwcGVyUmFuZ2U9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLHJzVmFyUmFuZ2U9IlxcdWZlMGVcXHVmZTBmIixyc0JyZWFrUmFuZ2U9cnNNYXRoT3BSYW5nZStyc05vbkNoYXJSYW5nZStyc1B1bmN0dWF0aW9uUmFuZ2UrcnNTcGFjZVJhbmdlO3ZhciByc0Fwb3M9IlsnXHUyMDE5XSIscnNBc3RyYWw9IlsiK3JzQXN0cmFsUmFuZ2UrIl0iLHJzQnJlYWs9IlsiK3JzQnJlYWtSYW5nZSsiXSIscnNDb21ibz0iWyIrcnNDb21ib1JhbmdlKyJdIixyc0RpZ2l0cz0iXFxkKyIscnNEaW5nYmF0PSJbIityc0RpbmdiYXRSYW5nZSsiXSIscnNMb3dlcj0iWyIrcnNMb3dlclJhbmdlKyJdIixyc01pc2M9IlteIityc0FzdHJhbFJhbmdlK3JzQnJlYWtSYW5nZStyc0RpZ2l0cytyc0RpbmdiYXRSYW5nZStyc0xvd2VyUmFuZ2UrcnNVcHBlclJhbmdlKyJdIixyc0ZpdHo9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIscnNNb2RpZmllcj0iKD86Iityc0NvbWJvKyJ8Iityc0ZpdHorIikiLHJzTm9uQXN0cmFsPQoiW14iK3JzQXN0cmFsUmFuZ2UrIl0iLHJzUmVnaW9uYWw9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHJzU3VyclBhaXI9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLHJzVXBwZXI9IlsiK3JzVXBwZXJSYW5nZSsiXSIscnNaV0o9IlxcdTIwMGQiO3ZhciByc01pc2NMb3dlcj0iKD86Iityc0xvd2VyKyJ8Iityc01pc2MrIikiLHJzTWlzY1VwcGVyPSIoPzoiK3JzVXBwZXIrInwiK3JzTWlzYysiKSIscnNPcHRDb250ckxvd2VyPSIoPzoiK3JzQXBvcysiKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIscnNPcHRDb250clVwcGVyPSIoPzoiK3JzQXBvcysiKD86RHxMTHxNfFJFfFN8VHxWRSkpPyIscmVPcHRNb2Q9cnNNb2RpZmllcisiPyIscnNPcHRWYXI9IlsiK3JzVmFyUmFuZ2UrIl0/Iixyc09wdEpvaW49Iig/OiIrcnNaV0orIig/OiIrW3JzTm9uQXN0cmFsLHJzUmVnaW9uYWwscnNTdXJyUGFpcl0uam9pbigifCIpKyIpIityc09wdFZhcityZU9wdE1vZCsKIikqIixyc09yZExvd2VyPSJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD9ceDNkXFxifFtBLVpfXSkiLHJzT3JkVXBwZXI9IlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoP1x4M2RcXGJ8W2Etel9dKSIscnNTZXE9cnNPcHRWYXIrcmVPcHRNb2QrcnNPcHRKb2luLHJzRW1vamk9Iig/OiIrW3JzRGluZ2JhdCxyc1JlZ2lvbmFsLHJzU3VyclBhaXJdLmpvaW4oInwiKSsiKSIrcnNTZXEscnNTeW1ib2w9Iig/OiIrW3JzTm9uQXN0cmFsK3JzQ29tYm8rIj8iLHJzQ29tYm8scnNSZWdpb25hbCxyc1N1cnJQYWlyLHJzQXN0cmFsXS5qb2luKCJ8IikrIikiO3ZhciByZUFwb3M9UmVnRXhwKHJzQXBvcywiZyIpO3ZhciByZUNvbWJvTWFyaz1SZWdFeHAocnNDb21ibywiZyIpO3ZhciByZVVuaWNvZGU9UmVnRXhwKHJzRml0eisiKD9ceDNkIityc0ZpdHorIil8Iityc1N5bWJvbCtyc1NlcSwiZyIpO3ZhciByZVVuaWNvZGVXb3JkPVJlZ0V4cChbcnNVcHBlcisiPyIrCnJzTG93ZXIrIisiK3JzT3B0Q29udHJMb3dlcisiKD9ceDNkIitbcnNCcmVhayxyc1VwcGVyLCIkIl0uam9pbigifCIpKyIpIixyc01pc2NVcHBlcisiKyIrcnNPcHRDb250clVwcGVyKyIoP1x4M2QiK1tyc0JyZWFrLHJzVXBwZXIrcnNNaXNjTG93ZXIsIiQiXS5qb2luKCJ8IikrIikiLHJzVXBwZXIrIj8iK3JzTWlzY0xvd2VyKyIrIityc09wdENvbnRyTG93ZXIscnNVcHBlcisiKyIrcnNPcHRDb250clVwcGVyLHJzT3JkVXBwZXIscnNPcmRMb3dlcixyc0RpZ2l0cyxyc0Vtb2ppXS5qb2luKCJ8IiksImciKTt2YXIgcmVIYXNVbmljb2RlPVJlZ0V4cCgiWyIrcnNaV0orcnNBc3RyYWxSYW5nZStyc0NvbWJvUmFuZ2UrcnNWYXJSYW5nZSsiXSIpO3ZhciByZUhhc1VuaWNvZGVXb3JkPS9bYS16XVtBLVpdfFtBLVpdezIsfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLzt2YXIgY29udGV4dFByb3BzPVsiQXJyYXkiLCJCdWZmZXIiLCJEYXRhVmlldyIsCiJEYXRlIiwiRXJyb3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJGdW5jdGlvbiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiTWFwIiwiTWF0aCIsIk9iamVjdCIsIlByb21pc2UiLCJSZWdFeHAiLCJTZXQiLCJTdHJpbmciLCJTeW1ib2wiLCJUeXBlRXJyb3IiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiV2Vha01hcCIsIl8iLCJjbGVhclRpbWVvdXQiLCJpc0Zpbml0ZSIsInBhcnNlSW50Iiwic2V0VGltZW91dCJdO3ZhciB0ZW1wbGF0ZUNvdW50ZXI9LTE7dmFyIHR5cGVkQXJyYXlUYWdzPXt9O3R5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddPXR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddPXR5cGVkQXJyYXlUYWdzW2ludDhUYWddPXR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXT10eXBlZEFycmF5VGFnc1tpbnQzMlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDhUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ109CnR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXT10cnVlO3R5cGVkQXJyYXlUYWdzW2FyZ3NUYWddPXR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXT10eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ109dHlwZWRBcnJheVRhZ3NbYm9vbFRhZ109dHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddPXR5cGVkQXJyYXlUYWdzW2RhdGVUYWddPXR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXT10eXBlZEFycmF5VGFnc1tmdW5jVGFnXT10eXBlZEFycmF5VGFnc1ttYXBUYWddPXR5cGVkQXJyYXlUYWdzW251bWJlclRhZ109dHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXT10eXBlZEFycmF5VGFnc1tyZWdleHBUYWddPXR5cGVkQXJyYXlUYWdzW3NldFRhZ109dHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXT10eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgY2xvbmVhYmxlVGFncz17fTtjbG9uZWFibGVUYWdzW2FyZ3NUYWddPWNsb25lYWJsZVRhZ3NbYXJyYXlUYWddPQpjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXT1jbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXT1jbG9uZWFibGVUYWdzW2Jvb2xUYWddPWNsb25lYWJsZVRhZ3NbZGF0ZVRhZ109Y2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXT1jbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddPWNsb25lYWJsZVRhZ3NbaW50OFRhZ109Y2xvbmVhYmxlVGFnc1tpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1tpbnQzMlRhZ109Y2xvbmVhYmxlVGFnc1ttYXBUYWddPWNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXT1jbG9uZWFibGVUYWdzW29iamVjdFRhZ109Y2xvbmVhYmxlVGFnc1tyZWdleHBUYWddPWNsb25lYWJsZVRhZ3Nbc2V0VGFnXT1jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ109Y2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddPWNsb25lYWJsZVRhZ3NbdWludDhUYWddPWNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXT1jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1t1aW50MzJUYWddPXRydWU7CmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddPWNsb25lYWJsZVRhZ3NbZnVuY1RhZ109Y2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgZGVidXJyZWRMZXR0ZXJzPXsiXHUwMGMwIjoiQSIsIlx1MDBjMSI6IkEiLCJcdTAwYzIiOiJBIiwiXHUwMGMzIjoiQSIsIlx1MDBjNCI6IkEiLCJcdTAwYzUiOiJBIiwiXHUwMGUwIjoiYSIsIlx1MDBlMSI6ImEiLCJcdTAwZTIiOiJhIiwiXHUwMGUzIjoiYSIsIlx1MDBlNCI6ImEiLCJcdTAwZTUiOiJhIiwiXHUwMGM3IjoiQyIsIlx1MDBlNyI6ImMiLCJcdTAwZDAiOiJEIiwiXHUwMGYwIjoiZCIsIlx1MDBjOCI6IkUiLCJcdTAwYzkiOiJFIiwiXHUwMGNhIjoiRSIsIlx1MDBjYiI6IkUiLCJcdTAwZTgiOiJlIiwiXHUwMGU5IjoiZSIsIlx1MDBlYSI6ImUiLCJcdTAwZWIiOiJlIiwiXHUwMGNjIjoiSSIsIlx1MDBjZCI6IkkiLCJcdTAwY2UiOiJJIiwiXHUwMGNmIjoiSSIsIlx1MDBlYyI6ImkiLCJcdTAwZWQiOiJpIiwiXHUwMGVlIjoiaSIsCiJcdTAwZWYiOiJpIiwiXHUwMGQxIjoiTiIsIlx1MDBmMSI6Im4iLCJcdTAwZDIiOiJPIiwiXHUwMGQzIjoiTyIsIlx1MDBkNCI6Ik8iLCJcdTAwZDUiOiJPIiwiXHUwMGQ2IjoiTyIsIlx1MDBkOCI6Ik8iLCJcdTAwZjIiOiJvIiwiXHUwMGYzIjoibyIsIlx1MDBmNCI6Im8iLCJcdTAwZjUiOiJvIiwiXHUwMGY2IjoibyIsIlx1MDBmOCI6Im8iLCJcdTAwZDkiOiJVIiwiXHUwMGRhIjoiVSIsIlx1MDBkYiI6IlUiLCJcdTAwZGMiOiJVIiwiXHUwMGY5IjoidSIsIlx1MDBmYSI6InUiLCJcdTAwZmIiOiJ1IiwiXHUwMGZjIjoidSIsIlx1MDBkZCI6IlkiLCJcdTAwZmQiOiJ5IiwiXHUwMGZmIjoieSIsIlx1MDBjNiI6IkFlIiwiXHUwMGU2IjoiYWUiLCJcdTAwZGUiOiJUaCIsIlx1MDBmZSI6InRoIiwiXHUwMGRmIjoic3MiLCJcdTAxMDAiOiJBIiwiXHUwMTAyIjoiQSIsIlx1MDEwNCI6IkEiLCJcdTAxMDEiOiJhIiwiXHUwMTAzIjoiYSIsIlx1MDEwNSI6ImEiLCJcdTAxMDYiOiJDIiwiXHUwMTA4IjoiQyIsCiJcdTAxMGEiOiJDIiwiXHUwMTBjIjoiQyIsIlx1MDEwNyI6ImMiLCJcdTAxMDkiOiJjIiwiXHUwMTBiIjoiYyIsIlx1MDEwZCI6ImMiLCJcdTAxMGUiOiJEIiwiXHUwMTEwIjoiRCIsIlx1MDEwZiI6ImQiLCJcdTAxMTEiOiJkIiwiXHUwMTEyIjoiRSIsIlx1MDExNCI6IkUiLCJcdTAxMTYiOiJFIiwiXHUwMTE4IjoiRSIsIlx1MDExYSI6IkUiLCJcdTAxMTMiOiJlIiwiXHUwMTE1IjoiZSIsIlx1MDExNyI6ImUiLCJcdTAxMTkiOiJlIiwiXHUwMTFiIjoiZSIsIlx1MDExYyI6IkciLCJcdTAxMWUiOiJHIiwiXHUwMTIwIjoiRyIsIlx1MDEyMiI6IkciLCJcdTAxMWQiOiJnIiwiXHUwMTFmIjoiZyIsIlx1MDEyMSI6ImciLCJcdTAxMjMiOiJnIiwiXHUwMTI0IjoiSCIsIlx1MDEyNiI6IkgiLCJcdTAxMjUiOiJoIiwiXHUwMTI3IjoiaCIsIlx1MDEyOCI6IkkiLCJcdTAxMmEiOiJJIiwiXHUwMTJjIjoiSSIsIlx1MDEyZSI6IkkiLCJcdTAxMzAiOiJJIiwiXHUwMTI5IjoiaSIsIlx1MDEyYiI6ImkiLAoiXHUwMTJkIjoiaSIsIlx1MDEyZiI6ImkiLCJcdTAxMzEiOiJpIiwiXHUwMTM0IjoiSiIsIlx1MDEzNSI6ImoiLCJcdTAxMzYiOiJLIiwiXHUwMTM3IjoiayIsIlx1MDEzOCI6ImsiLCJcdTAxMzkiOiJMIiwiXHUwMTNiIjoiTCIsIlx1MDEzZCI6IkwiLCJcdTAxM2YiOiJMIiwiXHUwMTQxIjoiTCIsIlx1MDEzYSI6ImwiLCJcdTAxM2MiOiJsIiwiXHUwMTNlIjoibCIsIlx1MDE0MCI6ImwiLCJcdTAxNDIiOiJsIiwiXHUwMTQzIjoiTiIsIlx1MDE0NSI6Ik4iLCJcdTAxNDciOiJOIiwiXHUwMTRhIjoiTiIsIlx1MDE0NCI6Im4iLCJcdTAxNDYiOiJuIiwiXHUwMTQ4IjoibiIsIlx1MDE0YiI6Im4iLCJcdTAxNGMiOiJPIiwiXHUwMTRlIjoiTyIsIlx1MDE1MCI6Ik8iLCJcdTAxNGQiOiJvIiwiXHUwMTRmIjoibyIsIlx1MDE1MSI6Im8iLCJcdTAxNTQiOiJSIiwiXHUwMTU2IjoiUiIsIlx1MDE1OCI6IlIiLCJcdTAxNTUiOiJyIiwiXHUwMTU3IjoiciIsIlx1MDE1OSI6InIiLCJcdTAxNWEiOiJTIiwKIlx1MDE1YyI6IlMiLCJcdTAxNWUiOiJTIiwiXHUwMTYwIjoiUyIsIlx1MDE1YiI6InMiLCJcdTAxNWQiOiJzIiwiXHUwMTVmIjoicyIsIlx1MDE2MSI6InMiLCJcdTAxNjIiOiJUIiwiXHUwMTY0IjoiVCIsIlx1MDE2NiI6IlQiLCJcdTAxNjMiOiJ0IiwiXHUwMTY1IjoidCIsIlx1MDE2NyI6InQiLCJcdTAxNjgiOiJVIiwiXHUwMTZhIjoiVSIsIlx1MDE2YyI6IlUiLCJcdTAxNmUiOiJVIiwiXHUwMTcwIjoiVSIsIlx1MDE3MiI6IlUiLCJcdTAxNjkiOiJ1IiwiXHUwMTZiIjoidSIsIlx1MDE2ZCI6InUiLCJcdTAxNmYiOiJ1IiwiXHUwMTcxIjoidSIsIlx1MDE3MyI6InUiLCJcdTAxNzQiOiJXIiwiXHUwMTc1IjoidyIsIlx1MDE3NiI6IlkiLCJcdTAxNzciOiJ5IiwiXHUwMTc4IjoiWSIsIlx1MDE3OSI6IloiLCJcdTAxN2IiOiJaIiwiXHUwMTdkIjoiWiIsIlx1MDE3YSI6InoiLCJcdTAxN2MiOiJ6IiwiXHUwMTdlIjoieiIsIlx1MDEzMiI6IklKIiwiXHUwMTMzIjoiaWoiLCJcdTAxNTIiOiJPZSIsCiJcdTAxNTMiOiJvZSIsIlx1MDE0OSI6IiduIiwiXHUwMTdmIjoicyJ9O3ZhciBodG1sRXNjYXBlcz17Ilx4MjYiOiJceDI2YW1wOyIsIlx4M2MiOiJceDI2bHQ7IiwiXHgzZSI6Ilx4MjZndDsiLCciJzoiXHgyNnF1b3Q7IiwiJyI6Ilx4MjYjMzk7In07dmFyIGh0bWxVbmVzY2FwZXM9eyJceDI2YW1wOyI6Ilx4MjYiLCJceDI2bHQ7IjoiXHgzYyIsIlx4MjZndDsiOiJceDNlIiwiXHgyNnF1b3Q7IjonIicsIlx4MjYjMzk7IjoiJyJ9O3ZhciBzdHJpbmdFc2NhcGVzPXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9O3ZhciBmcmVlUGFyc2VGbG9hdD1wYXJzZUZsb2F0LGZyZWVQYXJzZUludD1wYXJzZUludDt2YXIgZnJlZUdsb2JhbD10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWw7dmFyIGZyZWVTZWxmPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmCnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmO3ZhciByb290PWZyZWVHbG9iYWx8fGZyZWVTZWxmfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO3ZhciBmcmVlRXhwb3J0cz10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzO3ZhciBmcmVlTW9kdWxlPWZyZWVFeHBvcnRzJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGU7dmFyIG1vZHVsZUV4cG9ydHM9ZnJlZU1vZHVsZSYmZnJlZU1vZHVsZS5leHBvcnRzPT09ZnJlZUV4cG9ydHM7dmFyIGZyZWVQcm9jZXNzPW1vZHVsZUV4cG9ydHMmJmZyZWVHbG9iYWwucHJvY2Vzczt2YXIgbm9kZVV0aWw9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGZyZWVQcm9jZXNzJiZmcmVlUHJvY2Vzcy5iaW5kaW5nJiZmcmVlUHJvY2Vzcy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2goZSl7fX0oKTt2YXIgbm9kZUlzQXJyYXlCdWZmZXI9bm9kZVV0aWwmJgpub2RlVXRpbC5pc0FycmF5QnVmZmVyLG5vZGVJc0RhdGU9bm9kZVV0aWwmJm5vZGVVdGlsLmlzRGF0ZSxub2RlSXNNYXA9bm9kZVV0aWwmJm5vZGVVdGlsLmlzTWFwLG5vZGVJc1JlZ0V4cD1ub2RlVXRpbCYmbm9kZVV0aWwuaXNSZWdFeHAsbm9kZUlzU2V0PW5vZGVVdGlsJiZub2RlVXRpbC5pc1NldCxub2RlSXNUeXBlZEFycmF5PW5vZGVVdGlsJiZub2RlVXRpbC5pc1R5cGVkQXJyYXk7ZnVuY3Rpb24gYXBwbHkoZnVuYyx0aGlzQXJnLGFyZ3Mpe3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7Y2FzZSAxOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdKTtjYXNlIDI6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSl9cmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZyxhcmdzKX1mdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksCnNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtzZXR0ZXIoYWNjdW11bGF0b3IsdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGFycmF5KX1yZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk9PT1mYWxzZSlicmVhaztyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSxsZW5ndGgsYXJyYXkpPT09ZmFsc2UpYnJlYWs7CnJldHVybiBhcnJheX1mdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZighcHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsYXJyYXkpKXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmJhc2VJbmRleE9mKGFycmF5LAp2YWx1ZSwwKT4tMX1mdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSx2YWx1ZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGNvbXBhcmF0b3IodmFsdWUsYXJyYXlbaW5kZXhdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1pdGVyYXRlZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXMubGVuZ3RoLG9mZnNldD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJyYXlbb2Zmc2V0K2luZGV4XT0KdmFsdWVzW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5WysraW5kZXhdO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFjY3VtdWxhdG9yPWl0ZXJhdGVlKGFjY3VtdWxhdG9yLGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5Wy0tbGVuZ3RoXTt3aGlsZShsZW5ndGgtLSlhY2N1bXVsYXRvcj1pdGVyYXRlZShhY2N1bXVsYXRvcixhcnJheVtsZW5ndGhdLGxlbmd0aCxhcnJheSk7CnJldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKHByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX12YXIgYXNjaWlTaXplPWJhc2VQcm9wZXJ0eSgibGVuZ3RoIik7ZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZyl7cmV0dXJuIHN0cmluZy5zcGxpdCgiIil9ZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpfHxbXX1mdW5jdGlvbiBiYXNlRmluZEtleShjb2xsZWN0aW9uLHByZWRpY2F0ZSxlYWNoRnVuYyl7dmFyIHJlc3VsdDtlYWNoRnVuYyhjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsa2V5LGNvbGxlY3Rpb24pKXtyZXN1bHQ9a2V5OwpyZXR1cm4gZmFsc2V9fSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tSW5kZXgrKGZyb21SaWdodD8xOi0xKTt3aGlsZShmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aClpZihwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXtyZXR1cm4gdmFsdWU9PT12YWx1ZT9zdHJpY3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCk6YmFzZUZpbmRJbmRleChhcnJheSxiYXNlSXNOYU4sZnJvbUluZGV4KX1mdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksdmFsdWUsZnJvbUluZGV4LGNvbXBhcmF0b3Ipe3ZhciBpbmRleD1mcm9tSW5kZXgtMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8Cmxlbmd0aClpZihjb21wYXJhdG9yKGFycmF5W2luZGV4XSx2YWx1ZSkpcmV0dXJuIGluZGV4O3JldHVybi0xfWZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSl7cmV0dXJuIHZhbHVlIT09dmFsdWV9ZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU3VtKGFycmF5LGl0ZXJhdGVlKS9sZW5ndGg6TkFOfWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtLGVhY2hGdW5jKXtlYWNoRnVuYyhjb2xsZWN0aW9uLApmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXthY2N1bXVsYXRvcj1pbml0QWNjdW0/KGluaXRBY2N1bT1mYWxzZSx2YWx1ZSk6aXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsY29sbGVjdGlvbil9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSxjb21wYXJlcil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7YXJyYXkuc29ydChjb21wYXJlcik7d2hpbGUobGVuZ3RoLS0pYXJyYXlbbGVuZ3RoXT1hcnJheVtsZW5ndGhdLnZhbHVlO3JldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlU3VtKGFycmF5LGl0ZXJhdGVlKXt2YXIgcmVzdWx0LGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBjdXJyZW50PWl0ZXJhdGVlKGFycmF5W2luZGV4XSk7aWYoY3VycmVudCE9PXVuZGVmaW5lZClyZXN1bHQ9cmVzdWx0PT09dW5kZWZpbmVkP2N1cnJlbnQ6cmVzdWx0K2N1cnJlbnR9cmV0dXJuIHJlc3VsdH0KZnVuY3Rpb24gYmFzZVRpbWVzKG4saXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobik7d2hpbGUoKytpbmRleDxuKXJlc3VsdFtpbmRleF09aXRlcmF0ZWUoaW5kZXgpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlNYXAocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm5ba2V5LG9iamVjdFtrZXldXX0pfWZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jKHZhbHVlKX19ZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheU1hcChwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Rba2V5XX0pfWZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLGtleSl7cmV0dXJuIGNhY2hlLmhhcyhrZXkpfWZ1bmN0aW9uIGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9c3RyU3ltYm9scy5sZW5ndGg7CndoaWxlKCsraW5kZXg8bGVuZ3RoJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD1zdHJTeW1ib2xzLmxlbmd0aDt3aGlsZShpbmRleC0tJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LHBsYWNlaG9sZGVyKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9MDt3aGlsZShsZW5ndGgtLSlpZihhcnJheVtsZW5ndGhdPT09cGxhY2Vob2xkZXIpKytyZXN1bHQ7cmV0dXJuIHJlc3VsdH12YXIgZGVidXJyTGV0dGVyPWJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7dmFyIGVzY2FwZUh0bWxDaGFyPWJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocil7cmV0dXJuIlxcIisKc3RyaW5nRXNjYXBlc1tjaHJdfWZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfWZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKXtyZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpe3JldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3Ipe3ZhciBkYXRhLHJlc3VsdD1bXTt3aGlsZSghKGRhdGE9aXRlcmF0b3IubmV4dCgpKS5kb25lKXJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWFwVG9BcnJheShtYXApe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobWFwLnNpemUpO21hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLGtleSl7cmVzdWx0WysraW5kZXhdPVtrZXksdmFsdWVdfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsCnRyYW5zZm9ybSl7cmV0dXJuIGZ1bmN0aW9uKGFyZyl7cmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpfX1mdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSxwbGFjZWhvbGRlcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYodmFsdWU9PT1wbGFjZWhvbGRlcnx8dmFsdWU9PT1QTEFDRUhPTERFUil7YXJyYXlbaW5kZXhdPVBMQUNFSE9MREVSO3Jlc3VsdFtyZXNJbmRleCsrXT1pbmRleH19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCxrZXkpe3JldHVybiBrZXk9PSJfX3Byb3RvX18iP3VuZGVmaW5lZDpvYmplY3Rba2V5XX1mdW5jdGlvbiBzZXRUb0FycmF5KHNldCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShzZXQuc2l6ZSk7c2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpe3Jlc3VsdFsrK2luZGV4XT12YWx1ZX0pOwpyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KHNldC5zaXplKTtzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPVt2YWx1ZSx2YWx1ZV19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4KzE7d2hpbGUoaW5kZXgtLSlpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuIGluZGV4fWZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVTaXplKHN0cmluZyk6CmFzY2lpU2l6ZShzdHJpbmcpfWZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVUb0FycmF5KHN0cmluZyk6YXNjaWlUb0FycmF5KHN0cmluZyl9dmFyIHVuZXNjYXBlSHRtbENoYXI9YmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7ZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKXt2YXIgcmVzdWx0PXJlVW5pY29kZS5sYXN0SW5kZXg9MDt3aGlsZShyZVVuaWNvZGUudGVzdChzdHJpbmcpKSsrcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSl8fFtdfWZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCl8fFtdfXZhciBydW5JbkNvbnRleHQ9ZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpe2NvbnRleHQ9Y29udGV4dD09bnVsbD9yb290Ol8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwKY29udGV4dCxfLnBpY2socm9vdCxjb250ZXh0UHJvcHMpKTt2YXIgQXJyYXk9Y29udGV4dC5BcnJheSxEYXRlPWNvbnRleHQuRGF0ZSxFcnJvcj1jb250ZXh0LkVycm9yLEZ1bmN0aW9uPWNvbnRleHQuRnVuY3Rpb24sTWF0aD1jb250ZXh0Lk1hdGgsT2JqZWN0PWNvbnRleHQuT2JqZWN0LFJlZ0V4cD1jb250ZXh0LlJlZ0V4cCxTdHJpbmc9Y29udGV4dC5TdHJpbmcsVHlwZUVycm9yPWNvbnRleHQuVHlwZUVycm9yO3ZhciBhcnJheVByb3RvPUFycmF5LnByb3RvdHlwZSxmdW5jUHJvdG89RnVuY3Rpb24ucHJvdG90eXBlLG9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGU7dmFyIGNvcmVKc0RhdGE9Y29udGV4dFsiX19jb3JlLWpzX3NoYXJlZF9fIl07dmFyIGZ1bmNUb1N0cmluZz1mdW5jUHJvdG8udG9TdHJpbmc7dmFyIGhhc093blByb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5O3ZhciBpZENvdW50ZXI9MDt2YXIgbWFza1NyY0tleT1mdW5jdGlvbigpe3ZhciB1aWQ9Ci9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSYmY29yZUpzRGF0YS5rZXlzJiZjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdWlkPyJTeW1ib2woc3JjKV8xLiIrdWlkOiIifSgpO3ZhciBuYXRpdmVPYmplY3RUb1N0cmluZz1vYmplY3RQcm90by50b1N0cmluZzt2YXIgb2JqZWN0Q3RvclN0cmluZz1mdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO3ZhciBvbGREYXNoPXJvb3QuXzt2YXIgcmVJc05hdGl2ZT1SZWdFeHAoIl4iK2Z1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgQnVmZmVyPW1vZHVsZUV4cG9ydHM/Y29udGV4dC5CdWZmZXI6dW5kZWZpbmVkLFN5bWJvbD1jb250ZXh0LlN5bWJvbCxVaW50OEFycmF5PWNvbnRleHQuVWludDhBcnJheSxhbGxvY1Vuc2FmZT0KQnVmZmVyP0J1ZmZlci5hbGxvY1Vuc2FmZTp1bmRlZmluZWQsZ2V0UHJvdG90eXBlPW92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksb2JqZWN0Q3JlYXRlPU9iamVjdC5jcmVhdGUscHJvcGVydHlJc0VudW1lcmFibGU9b2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsc3BsaWNlPWFycmF5UHJvdG8uc3BsaWNlLHNwcmVhZGFibGVTeW1ib2w9U3ltYm9sP1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGU6dW5kZWZpbmVkLHN5bUl0ZXJhdG9yPVN5bWJvbD9TeW1ib2wuaXRlcmF0b3I6dW5kZWZpbmVkLHN5bVRvU3RyaW5nVGFnPVN5bWJvbD9TeW1ib2wudG9TdHJpbmdUYWc6dW5kZWZpbmVkO3ZhciBkZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbigpe3RyeXt2YXIgZnVuYz1nZXROYXRpdmUoT2JqZWN0LCJkZWZpbmVQcm9wZXJ0eSIpO2Z1bmMoe30sIiIse30pO3JldHVybiBmdW5jfWNhdGNoKGUpe319KCk7dmFyIGN0eENsZWFyVGltZW91dD1jb250ZXh0LmNsZWFyVGltZW91dCE9PQpyb290LmNsZWFyVGltZW91dCYmY29udGV4dC5jbGVhclRpbWVvdXQsY3R4Tm93PURhdGUmJkRhdGUubm93IT09cm9vdC5EYXRlLm5vdyYmRGF0ZS5ub3csY3R4U2V0VGltZW91dD1jb250ZXh0LnNldFRpbWVvdXQhPT1yb290LnNldFRpbWVvdXQmJmNvbnRleHQuc2V0VGltZW91dDt2YXIgbmF0aXZlQ2VpbD1NYXRoLmNlaWwsbmF0aXZlRmxvb3I9TWF0aC5mbG9vcixuYXRpdmVHZXRTeW1ib2xzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsbmF0aXZlSXNCdWZmZXI9QnVmZmVyP0J1ZmZlci5pc0J1ZmZlcjp1bmRlZmluZWQsbmF0aXZlSXNGaW5pdGU9Y29udGV4dC5pc0Zpbml0ZSxuYXRpdmVKb2luPWFycmF5UHJvdG8uam9pbixuYXRpdmVLZXlzPW92ZXJBcmcoT2JqZWN0LmtleXMsT2JqZWN0KSxuYXRpdmVNYXg9TWF0aC5tYXgsbmF0aXZlTWluPU1hdGgubWluLG5hdGl2ZU5vdz1EYXRlLm5vdyxuYXRpdmVQYXJzZUludD1jb250ZXh0LnBhcnNlSW50LG5hdGl2ZVJhbmRvbT0KTWF0aC5yYW5kb20sbmF0aXZlUmV2ZXJzZT1hcnJheVByb3RvLnJldmVyc2U7dmFyIERhdGFWaWV3PWdldE5hdGl2ZShjb250ZXh0LCJEYXRhVmlldyIpLE1hcD1nZXROYXRpdmUoY29udGV4dCwiTWFwIiksUHJvbWlzZT1nZXROYXRpdmUoY29udGV4dCwiUHJvbWlzZSIpLFNldD1nZXROYXRpdmUoY29udGV4dCwiU2V0IiksV2Vha01hcD1nZXROYXRpdmUoY29udGV4dCwiV2Vha01hcCIpLG5hdGl2ZUNyZWF0ZT1nZXROYXRpdmUoT2JqZWN0LCJjcmVhdGUiKTt2YXIgbWV0YU1hcD1XZWFrTWFwJiZuZXcgV2Vha01hcDt2YXIgcmVhbE5hbWVzPXt9O3ZhciBkYXRhVmlld0N0b3JTdHJpbmc9dG9Tb3VyY2UoRGF0YVZpZXcpLG1hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoTWFwKSxwcm9taXNlQ3RvclN0cmluZz10b1NvdXJjZShQcm9taXNlKSxzZXRDdG9yU3RyaW5nPXRvU291cmNlKFNldCksd2Vha01hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoV2Vha01hcCk7dmFyIHN5bWJvbFByb3RvPVN5bWJvbD8KU3ltYm9sLnByb3RvdHlwZTp1bmRlZmluZWQsc3ltYm9sVmFsdWVPZj1zeW1ib2xQcm90bz9zeW1ib2xQcm90by52YWx1ZU9mOnVuZGVmaW5lZCxzeW1ib2xUb1N0cmluZz1zeW1ib2xQcm90bz9zeW1ib2xQcm90by50b1N0cmluZzp1bmRlZmluZWQ7ZnVuY3Rpb24gbG9kYXNoKHZhbHVlKXtpZihpc09iamVjdExpa2UodmFsdWUpJiYhaXNBcnJheSh2YWx1ZSkmJiEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpe2lmKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcilyZXR1cm4gdmFsdWU7aWYoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwiX193cmFwcGVkX18iKSlyZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKX1yZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUpfXZhciBiYXNlQ3JlYXRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb2JqZWN0KCl7fXJldHVybiBmdW5jdGlvbihwcm90byl7aWYoIWlzT2JqZWN0KHByb3RvKSlyZXR1cm57fTtpZihvYmplY3RDcmVhdGUpcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7Cm9iamVjdC5wcm90b3R5cGU9cHJvdG87dmFyIHJlc3VsdD1uZXcgb2JqZWN0O29iamVjdC5wcm90b3R5cGU9dW5kZWZpbmVkO3JldHVybiByZXN1bHR9fSgpO2Z1bmN0aW9uIGJhc2VMb2Rhc2goKXt9ZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSxjaGFpbkFsbCl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19jaGFpbl9fPSEhY2hhaW5BbGw7dGhpcy5fX2luZGV4X189MDt0aGlzLl9fdmFsdWVzX189dW5kZWZpbmVkfWxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzPXsiZXNjYXBlIjpyZUVzY2FwZSwiZXZhbHVhdGUiOnJlRXZhbHVhdGUsImludGVycG9sYXRlIjpyZUludGVycG9sYXRlLCJ2YXJpYWJsZSI6IiIsImltcG9ydHMiOnsiXyI6bG9kYXNofX07bG9kYXNoLnByb3RvdHlwZT1iYXNlTG9kYXNoLnByb3RvdHlwZTtsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPWxvZGFzaDtMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZT1iYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTsKTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3I9TG9kYXNoV3JhcHBlcjtmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19kaXJfXz0xO3RoaXMuX19maWx0ZXJlZF9fPWZhbHNlO3RoaXMuX19pdGVyYXRlZXNfXz1bXTt0aGlzLl9fdGFrZUNvdW50X189TUFYX0FSUkFZX0xFTkdUSDt0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBsYXp5Q2xvbmUoKXt2YXIgcmVzdWx0PW5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO3Jlc3VsdC5fX2Rpcl9fPXRoaXMuX19kaXJfXztyZXN1bHQuX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fO3Jlc3VsdC5fX2l0ZXJhdGVlc19fPWNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO3Jlc3VsdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXzsKcmVzdWx0Ll9fdmlld3NfXz1jb3B5QXJyYXkodGhpcy5fX3ZpZXdzX18pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbGF6eVJldmVyc2UoKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHJlc3VsdD1uZXcgTGF6eVdyYXBwZXIodGhpcyk7cmVzdWx0Ll9fZGlyX189LTE7cmVzdWx0Ll9fZmlsdGVyZWRfXz10cnVlfWVsc2V7cmVzdWx0PXRoaXMuY2xvbmUoKTtyZXN1bHQuX19kaXJfXyo9LTF9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsYXp5VmFsdWUoKXt2YXIgYXJyYXk9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGRpcj10aGlzLl9fZGlyX18saXNBcnI9aXNBcnJheShhcnJheSksaXNSaWdodD1kaXI8MCxhcnJMZW5ndGg9aXNBcnI/YXJyYXkubGVuZ3RoOjAsdmlldz1nZXRWaWV3KDAsYXJyTGVuZ3RoLHRoaXMuX192aWV3c19fKSxzdGFydD12aWV3LnN0YXJ0LGVuZD12aWV3LmVuZCxsZW5ndGg9ZW5kLXN0YXJ0LGluZGV4PWlzUmlnaHQ/ZW5kOnN0YXJ0LTEsaXRlcmF0ZWVzPXRoaXMuX19pdGVyYXRlZXNfXywKaXRlckxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoLHJlc0luZGV4PTAsdGFrZUNvdW50PW5hdGl2ZU1pbihsZW5ndGgsdGhpcy5fX3Rha2VDb3VudF9fKTtpZighaXNBcnJ8fCFpc1JpZ2h0JiZhcnJMZW5ndGg9PWxlbmd0aCYmdGFrZUNvdW50PT1sZW5ndGgpcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUoYXJyYXksdGhpcy5fX2FjdGlvbnNfXyk7dmFyIHJlc3VsdD1bXTtvdXRlcjp3aGlsZShsZW5ndGgtLSYmcmVzSW5kZXg8dGFrZUNvdW50KXtpbmRleCs9ZGlyO3ZhciBpdGVySW5kZXg9LTEsdmFsdWU9YXJyYXlbaW5kZXhdO3doaWxlKCsraXRlckluZGV4PGl0ZXJMZW5ndGgpe3ZhciBkYXRhPWl0ZXJhdGVlc1tpdGVySW5kZXhdLGl0ZXJhdGVlPWRhdGEuaXRlcmF0ZWUsdHlwZT1kYXRhLnR5cGUsY29tcHV0ZWQ9aXRlcmF0ZWUodmFsdWUpO2lmKHR5cGU9PUxBWllfTUFQX0ZMQUcpdmFsdWU9Y29tcHV0ZWQ7ZWxzZSBpZighY29tcHV0ZWQpaWYodHlwZT09TEFaWV9GSUxURVJfRkxBRyljb250aW51ZSBvdXRlcjsKZWxzZSBicmVhayBvdXRlcn1yZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1MYXp5V3JhcHBlci5wcm90b3R5cGU9YmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxhenlXcmFwcGVyO2Z1bmN0aW9uIEhhc2goZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBoYXNoQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPW5hdGl2ZUNyZWF0ZT9uYXRpdmVDcmVhdGUobnVsbCk6e307dGhpcy5zaXplPTB9ZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpe3ZhciByZXN1bHQ9dGhpcy5oYXMoa2V5KSYmZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7CnJldHVybiByZXN1bHR9ZnVuY3Rpb24gaGFzaEdldChrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYobmF0aXZlQ3JlYXRlKXt2YXIgcmVzdWx0PWRhdGFba2V5XTtyZXR1cm4gcmVzdWx0PT09SEFTSF9VTkRFRklORUQ/dW5kZWZpbmVkOnJlc3VsdH1yZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLGtleSk/ZGF0YVtrZXldOnVuZGVmaW5lZH1mdW5jdGlvbiBoYXNoSGFzKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztyZXR1cm4gbmF0aXZlQ3JlYXRlP2RhdGFba2V5XSE9PXVuZGVmaW5lZDpoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsa2V5KX1mdW5jdGlvbiBoYXNoU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXzt0aGlzLnNpemUrPXRoaXMuaGFzKGtleSk/MDoxO2RhdGFba2V5XT1uYXRpdmVDcmVhdGUmJnZhbHVlPT09dW5kZWZpbmVkP0hBU0hfVU5ERUZJTkVEOnZhbHVlO3JldHVybiB0aGlzfUhhc2gucHJvdG90eXBlLmNsZWFyPWhhc2hDbGVhcjsKSGFzaC5wcm90b3R5cGVbImRlbGV0ZSJdPWhhc2hEZWxldGU7SGFzaC5wcm90b3R5cGUuZ2V0PWhhc2hHZXQ7SGFzaC5wcm90b3R5cGUuaGFzPWhhc2hIYXM7SGFzaC5wcm90b3R5cGUuc2V0PWhhc2hTZXQ7ZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPVtdO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtpZihpbmRleDwwKXJldHVybiBmYWxzZTt2YXIgbGFzdEluZGV4PWRhdGEubGVuZ3RoLTE7aWYoaW5kZXg9PWxhc3RJbmRleClkYXRhLnBvcCgpOwplbHNlIHNwbGljZS5jYWxsKGRhdGEsaW5kZXgsMSk7LS10aGlzLnNpemU7cmV0dXJuIHRydWV9ZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO3JldHVybiBpbmRleDwwP3VuZGVmaW5lZDpkYXRhW2luZGV4XVsxXX1mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KXtyZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sa2V5KT4tMX1mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7aWYoaW5kZXg8MCl7Kyt0aGlzLnNpemU7ZGF0YS5wdXNoKFtrZXksdmFsdWVdKX1lbHNlIGRhdGFbaW5kZXhdWzFdPXZhbHVlO3JldHVybiB0aGlzfUxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXI9bGlzdENhY2hlQ2xlYXI7TGlzdENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl09bGlzdENhY2hlRGVsZXRlO0xpc3RDYWNoZS5wcm90b3R5cGUuZ2V0PQpsaXN0Q2FjaGVHZXQ7TGlzdENhY2hlLnByb3RvdHlwZS5oYXM9bGlzdENhY2hlSGFzO0xpc3RDYWNoZS5wcm90b3R5cGUuc2V0PWxpc3RDYWNoZVNldDtmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM9PW51bGw/MDplbnRyaWVzLmxlbmd0aDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKXt0aGlzLnNpemU9MDt0aGlzLl9fZGF0YV9fPXsiaGFzaCI6bmV3IEhhc2gsIm1hcCI6bmV3IChNYXB8fExpc3RDYWNoZSksInN0cmluZyI6bmV3IEhhc2h9fWZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSl7dmFyIHJlc3VsdD1nZXRNYXBEYXRhKHRoaXMsa2V5KVsiZGVsZXRlIl0oa2V5KTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpe3JldHVybiBnZXRNYXBEYXRhKHRoaXMsCmtleSkuZ2V0KGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSkuaGFzKGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT1nZXRNYXBEYXRhKHRoaXMsa2V5KSxzaXplPWRhdGEuc2l6ZTtkYXRhLnNldChrZXksdmFsdWUpO3RoaXMuc2l6ZSs9ZGF0YS5zaXplPT1zaXplPzA6MTtyZXR1cm4gdGhpc31NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXI9bWFwQ2FjaGVDbGVhcjtNYXBDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdPW1hcENhY2hlRGVsZXRlO01hcENhY2hlLnByb3RvdHlwZS5nZXQ9bWFwQ2FjaGVHZXQ7TWFwQ2FjaGUucHJvdG90eXBlLmhhcz1tYXBDYWNoZUhhcztNYXBDYWNoZS5wcm90b3R5cGUuc2V0PW1hcENhY2hlU2V0O2Z1bmN0aW9uIFNldENhY2hlKHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXM9PW51bGw/MDp2YWx1ZXMubGVuZ3RoO3RoaXMuX19kYXRhX189bmV3IE1hcENhY2hlOwp3aGlsZSgrK2luZGV4PGxlbmd0aCl0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKX1mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSl7dGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsSEFTSF9VTkRFRklORUQpO3JldHVybiB0aGlzfWZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpfVNldENhY2hlLnByb3RvdHlwZS5hZGQ9U2V0Q2FjaGUucHJvdG90eXBlLnB1c2g9c2V0Q2FjaGVBZGQ7U2V0Q2FjaGUucHJvdG90eXBlLmhhcz1zZXRDYWNoZUhhcztmdW5jdGlvbiBTdGFjayhlbnRyaWVzKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fPW5ldyBMaXN0Q2FjaGUoZW50cmllcyk7dGhpcy5zaXplPWRhdGEuc2l6ZX1mdW5jdGlvbiBzdGFja0NsZWFyKCl7dGhpcy5fX2RhdGFfXz1uZXcgTGlzdENhY2hlO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxyZXN1bHQ9ZGF0YVsiZGVsZXRlIl0oa2V5KTsKdGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0YWNrR2V0KGtleSl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSl9ZnVuY3Rpb24gc3RhY2tIYXMoa2V5KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KX1mdW5jdGlvbiBzdGFja1NldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSl7dmFyIHBhaXJzPWRhdGEuX19kYXRhX187aWYoIU1hcHx8cGFpcnMubGVuZ3RoPExBUkdFX0FSUkFZX1NJWkUtMSl7cGFpcnMucHVzaChba2V5LHZhbHVlXSk7dGhpcy5zaXplPSsrZGF0YS5zaXplO3JldHVybiB0aGlzfWRhdGE9dGhpcy5fX2RhdGFfXz1uZXcgTWFwQ2FjaGUocGFpcnMpfWRhdGEuc2V0KGtleSx2YWx1ZSk7dGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gdGhpc31TdGFjay5wcm90b3R5cGUuY2xlYXI9c3RhY2tDbGVhcjtTdGFjay5wcm90b3R5cGVbImRlbGV0ZSJdPXN0YWNrRGVsZXRlOwpTdGFjay5wcm90b3R5cGUuZ2V0PXN0YWNrR2V0O1N0YWNrLnByb3RvdHlwZS5oYXM9c3RhY2tIYXM7U3RhY2sucHJvdG90eXBlLnNldD1zdGFja1NldDtmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLGluaGVyaXRlZCl7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpLGlzQXJnPSFpc0FyciYmaXNBcmd1bWVudHModmFsdWUpLGlzQnVmZj0haXNBcnImJiFpc0FyZyYmaXNCdWZmZXIodmFsdWUpLGlzVHlwZT0haXNBcnImJiFpc0FyZyYmIWlzQnVmZiYmaXNUeXBlZEFycmF5KHZhbHVlKSxza2lwSW5kZXhlcz1pc0Fycnx8aXNBcmd8fGlzQnVmZnx8aXNUeXBlLHJlc3VsdD1za2lwSW5kZXhlcz9iYXNlVGltZXModmFsdWUubGVuZ3RoLFN0cmluZyk6W10sbGVuZ3RoPXJlc3VsdC5sZW5ndGg7Zm9yKHZhciBrZXkgaW4gdmFsdWUpaWYoKGluaGVyaXRlZHx8aGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxrZXkpKSYmIShza2lwSW5kZXhlcyYmKGtleT09Imxlbmd0aCJ8fGlzQnVmZiYmKGtleT09CiJvZmZzZXQifHxrZXk9PSJwYXJlbnQiKXx8aXNUeXBlJiYoa2V5PT0iYnVmZmVyInx8a2V5PT0iYnl0ZUxlbmd0aCJ8fGtleT09ImJ5dGVPZmZzZXQiKXx8aXNJbmRleChrZXksbGVuZ3RoKSkpKXJlc3VsdC5wdXNoKGtleSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9hcnJheVtiYXNlUmFuZG9tKDAsbGVuZ3RoLTEpXTp1bmRlZmluZWR9ZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LG4pe3JldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9ZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KXtyZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSl9ZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXtpZih2YWx1ZSE9PXVuZGVmaW5lZCYmIWVxKG9iamVjdFtrZXldLHZhbHVlKXx8CnZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKWJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKX1mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXt2YXIgb2JqVmFsdWU9b2JqZWN0W2tleV07aWYoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZlcShvYmpWYWx1ZSx2YWx1ZSkpfHx2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KSliYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl9ZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LGtleSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoZXEoYXJyYXlbbGVuZ3RoXVswXSxrZXkpKXJldHVybiBsZW5ndGg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbixzZXR0ZXIsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe3NldHRlcihhY2N1bXVsYXRvciwKdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGNvbGxlY3Rpb24pfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdCYmY29weU9iamVjdChzb3VyY2Usa2V5cyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3QmJmNvcHlPYmplY3Qoc291cmNlLGtleXNJbihzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpe2lmKGtleT09Il9fcHJvdG9fXyImJmRlZmluZVByb3BlcnR5KWRlZmluZVByb3BlcnR5KG9iamVjdCxrZXkseyJjb25maWd1cmFibGUiOnRydWUsImVudW1lcmFibGUiOnRydWUsInZhbHVlIjp2YWx1ZSwid3JpdGFibGUiOnRydWV9KTtlbHNlIG9iamVjdFtrZXldPXZhbHVlfWZ1bmN0aW9uIGJhc2VBdChvYmplY3QscGF0aHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aHMubGVuZ3RoLHJlc3VsdD0KQXJyYXkobGVuZ3RoKSxza2lwPW9iamVjdD09bnVsbDt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHRbaW5kZXhdPXNraXA/dW5kZWZpbmVkOmdldChvYmplY3QscGF0aHNbaW5kZXhdKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsbG93ZXIsdXBwZXIpe2lmKG51bWJlcj09PW51bWJlcil7aWYodXBwZXIhPT11bmRlZmluZWQpbnVtYmVyPW51bWJlcjw9dXBwZXI/bnVtYmVyOnVwcGVyO2lmKGxvd2VyIT09dW5kZWZpbmVkKW51bWJlcj1udW1iZXI+PWxvd2VyP251bWJlcjpsb3dlcn1yZXR1cm4gbnVtYmVyfWZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsa2V5LG9iamVjdCxzdGFjayl7dmFyIHJlc3VsdCxpc0RlZXA9Yml0bWFzayZDTE9ORV9ERUVQX0ZMQUcsaXNGbGF0PWJpdG1hc2smQ0xPTkVfRkxBVF9GTEFHLGlzRnVsbD1iaXRtYXNrJkNMT05FX1NZTUJPTFNfRkxBRztpZihjdXN0b21pemVyKXJlc3VsdD1vYmplY3Q/CmN1c3RvbWl6ZXIodmFsdWUsa2V5LG9iamVjdCxzdGFjayk6Y3VzdG9taXplcih2YWx1ZSk7aWYocmVzdWx0IT09dW5kZWZpbmVkKXJldHVybiByZXN1bHQ7aWYoIWlzT2JqZWN0KHZhbHVlKSlyZXR1cm4gdmFsdWU7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpO2lmKGlzQXJyKXtyZXN1bHQ9aW5pdENsb25lQXJyYXkodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSxyZXN1bHQpfWVsc2V7dmFyIHRhZz1nZXRUYWcodmFsdWUpLGlzRnVuYz10YWc9PWZ1bmNUYWd8fHRhZz09Z2VuVGFnO2lmKGlzQnVmZmVyKHZhbHVlKSlyZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsaXNEZWVwKTtpZih0YWc9PW9iamVjdFRhZ3x8dGFnPT1hcmdzVGFnfHxpc0Z1bmMmJiFvYmplY3Qpe3Jlc3VsdD1pc0ZsYXR8fGlzRnVuYz97fTppbml0Q2xvbmVPYmplY3QodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGlzRmxhdD9jb3B5U3ltYm9sc0luKHZhbHVlLGJhc2VBc3NpZ25JbihyZXN1bHQsCnZhbHVlKSk6Y29weVN5bWJvbHModmFsdWUsYmFzZUFzc2lnbihyZXN1bHQsdmFsdWUpKX1lbHNle2lmKCFjbG9uZWFibGVUYWdzW3RhZ10pcmV0dXJuIG9iamVjdD92YWx1ZTp7fTtyZXN1bHQ9aW5pdENsb25lQnlUYWcodmFsdWUsdGFnLGlzRGVlcCl9fXN0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTt2YXIgc3RhY2tlZD1zdGFjay5nZXQodmFsdWUpO2lmKHN0YWNrZWQpcmV0dXJuIHN0YWNrZWQ7c3RhY2suc2V0KHZhbHVlLHJlc3VsdCk7aWYoaXNTZXQodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKXtyZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3ViVmFsdWUsdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9aWYoaXNNYXAodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7cmVzdWx0LnNldChrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsCnN0YWNrKSl9KTtyZXR1cm4gcmVzdWx0fXZhciBrZXlzRnVuYz1pc0Z1bGw/aXNGbGF0P2dldEFsbEtleXNJbjpnZXRBbGxLZXlzOmlzRmxhdD9rZXlzSW46a2V5czt2YXIgcHJvcHM9aXNBcnI/dW5kZWZpbmVkOmtleXNGdW5jKHZhbHVlKTthcnJheUVhY2gocHJvcHN8fHZhbHVlLGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7aWYocHJvcHMpe2tleT1zdWJWYWx1ZTtzdWJWYWx1ZT12YWx1ZVtrZXldfWFzc2lnblZhbHVlKHJlc3VsdCxrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUNvbmZvcm1zKHNvdXJjZSl7dmFyIHByb3BzPWtleXMoc291cmNlKTtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSxwcm9wcyl9fWZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2UscHJvcHMpe3ZhciBsZW5ndGg9cHJvcHMubGVuZ3RoOwppZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cHJvcHNbbGVuZ3RoXSxwcmVkaWNhdGU9c291cmNlW2tleV0sdmFsdWU9b2JqZWN0W2tleV07aWYodmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCl8fCFwcmVkaWNhdGUodmFsdWUpKXJldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBiYXNlRGVsYXkoZnVuYyx3YWl0LGFyZ3Mpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2Z1bmMuYXBwbHkodW5kZWZpbmVkLGFyZ3MpfSx3YWl0KX1mdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGluY2x1ZGVzPWFycmF5SW5jbHVkZXMsaXNDb21tb249dHJ1ZSxsZW5ndGg9YXJyYXkubGVuZ3RoLApyZXN1bHQ9W10sdmFsdWVzTGVuZ3RoPXZhbHVlcy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4gcmVzdWx0O2lmKGl0ZXJhdGVlKXZhbHVlcz1hcnJheU1hcCh2YWx1ZXMsYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7aWYoY29tcGFyYXRvcil7aW5jbHVkZXM9YXJyYXlJbmNsdWRlc1dpdGg7aXNDb21tb249ZmFsc2V9ZWxzZSBpZih2YWx1ZXMubGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXtpbmNsdWRlcz1jYWNoZUhhcztpc0NvbW1vbj1mYWxzZTt2YWx1ZXM9bmV3IFNldENhY2hlKHZhbHVlcyl9b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU9PW51bGw/dmFsdWU6aXRlcmF0ZWUodmFsdWUpO3ZhbHVlPWNvbXBhcmF0b3J8fHZhbHVlIT09MD92YWx1ZTowO2lmKGlzQ29tbW9uJiZjb21wdXRlZD09PWNvbXB1dGVkKXt2YXIgdmFsdWVzSW5kZXg9dmFsdWVzTGVuZ3RoO3doaWxlKHZhbHVlc0luZGV4LS0paWYodmFsdWVzW3ZhbHVlc0luZGV4XT09PQpjb21wdXRlZCljb250aW51ZSBvdXRlcjtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXModmFsdWVzLGNvbXB1dGVkLGNvbXBhcmF0b3IpKXJlc3VsdC5wdXNoKHZhbHVlKX1yZXR1cm4gcmVzdWx0fXZhciBiYXNlRWFjaD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTt2YXIgYmFzZUVhY2hSaWdodD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsdHJ1ZSk7ZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgcmVzdWx0PXRydWU7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtyZXN1bHQ9ISFwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIHJlc3VsdH0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9CmFycmF5W2luZGV4XSxjdXJyZW50PWl0ZXJhdGVlKHZhbHVlKTtpZihjdXJyZW50IT1udWxsJiYoY29tcHV0ZWQ9PT11bmRlZmluZWQ/Y3VycmVudD09PWN1cnJlbnQmJiFpc1N5bWJvbChjdXJyZW50KTpjb21wYXJhdG9yKGN1cnJlbnQsY29tcHV0ZWQpKSl2YXIgY29tcHV0ZWQ9Y3VycmVudCxyZXN1bHQ9dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3N0YXJ0PXRvSW50ZWdlcihzdGFydCk7aWYoc3RhcnQ8MClzdGFydD0tc3RhcnQ+bGVuZ3RoPzA6bGVuZ3RoK3N0YXJ0O2VuZD1lbmQ9PT11bmRlZmluZWR8fGVuZD5sZW5ndGg/bGVuZ3RoOnRvSW50ZWdlcihlbmQpO2lmKGVuZDwwKWVuZCs9bGVuZ3RoO2VuZD1zdGFydD5lbmQ/MDp0b0xlbmd0aChlbmQpO3doaWxlKHN0YXJ0PGVuZClhcnJheVtzdGFydCsrXT12YWx1ZTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLApwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbikpcmVzdWx0LnB1c2godmFsdWUpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSxkZXB0aCxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtwcmVkaWNhdGV8fChwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZSk7cmVzdWx0fHwocmVzdWx0PVtdKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihkZXB0aD4wJiZwcmVkaWNhdGUodmFsdWUpKWlmKGRlcHRoPjEpYmFzZUZsYXR0ZW4odmFsdWUsZGVwdGgtMSxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KTtlbHNlIGFycmF5UHVzaChyZXN1bHQsdmFsdWUpO2Vsc2UgaWYoIWlzU3RyaWN0KXJlc3VsdFtyZXN1bHQubGVuZ3RoXT0KdmFsdWV9cmV0dXJuIHJlc3VsdH12YXIgYmFzZUZvcj1jcmVhdGVCYXNlRm9yKCk7dmFyIGJhc2VGb3JSaWdodD1jcmVhdGVCYXNlRm9yKHRydWUpO2Z1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yKG9iamVjdCxpdGVyYXRlZSxrZXlzKX1mdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yUmlnaHQob2JqZWN0LGl0ZXJhdGVlLGtleXMpfWZ1bmN0aW9uIGJhc2VGdW5jdGlvbnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSl9KX1mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9MCxsZW5ndGg9cGF0aC5sZW5ndGg7d2hpbGUob2JqZWN0IT1udWxsJiZpbmRleDxsZW5ndGgpb2JqZWN0PW9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07CnJldHVybiBpbmRleCYmaW5kZXg9PWxlbmd0aD9vYmplY3Q6dW5kZWZpbmVkfWZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzRnVuYyxzeW1ib2xzRnVuYyl7dmFyIHJlc3VsdD1rZXlzRnVuYyhvYmplY3QpO3JldHVybiBpc0FycmF5KG9iamVjdCk/cmVzdWx0OmFycmF5UHVzaChyZXN1bHQsc3ltYm9sc0Z1bmMob2JqZWN0KSl9ZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSl7aWYodmFsdWU9PW51bGwpcmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkP3VuZGVmaW5lZFRhZzpudWxsVGFnO3JldHVybiBzeW1Ub1N0cmluZ1RhZyYmc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKT9nZXRSYXdUYWcodmFsdWUpOm9iamVjdFRvU3RyaW5nKHZhbHVlKX1mdW5jdGlvbiBiYXNlR3QodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT5vdGhlcn1mdW5jdGlvbiBiYXNlSGFzKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LAprZXkpfWZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3Qsa2V5KXtyZXR1cm4gb2JqZWN0IT1udWxsJiZrZXkgaW4gT2JqZWN0KG9iamVjdCl9ZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7cmV0dXJuIG51bWJlcj49bmF0aXZlTWluKHN0YXJ0LGVuZCkmJm51bWJlcjxuYXRpdmVNYXgoc3RhcnQsZW5kKX1mdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5jbHVkZXM9Y29tcGFyYXRvcj9hcnJheUluY2x1ZGVzV2l0aDphcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheXNbMF0ubGVuZ3RoLG90aExlbmd0aD1hcnJheXMubGVuZ3RoLG90aEluZGV4PW90aExlbmd0aCxjYWNoZXM9QXJyYXkob3RoTGVuZ3RoKSxtYXhMZW5ndGg9SW5maW5pdHkscmVzdWx0PVtdO3doaWxlKG90aEluZGV4LS0pe3ZhciBhcnJheT1hcnJheXNbb3RoSW5kZXhdO2lmKG90aEluZGV4JiZpdGVyYXRlZSlhcnJheT1hcnJheU1hcChhcnJheSwKYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7bWF4TGVuZ3RoPW5hdGl2ZU1pbihhcnJheS5sZW5ndGgsbWF4TGVuZ3RoKTtjYWNoZXNbb3RoSW5kZXhdPSFjb21wYXJhdG9yJiYoaXRlcmF0ZWV8fGxlbmd0aD49MTIwJiZhcnJheS5sZW5ndGg+PTEyMCk/bmV3IFNldENhY2hlKG90aEluZGV4JiZhcnJheSk6dW5kZWZpbmVkfWFycmF5PWFycmF5c1swXTt2YXIgaW5kZXg9LTEsc2Vlbj1jYWNoZXNbMF07b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgmJnJlc3VsdC5sZW5ndGg8bWF4TGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZighKHNlZW4/Y2FjaGVIYXMoc2Vlbixjb21wdXRlZCk6aW5jbHVkZXMocmVzdWx0LGNvbXB1dGVkLGNvbXBhcmF0b3IpKSl7b3RoSW5kZXg9b3RoTGVuZ3RoO3doaWxlKC0tb3RoSW5kZXgpe3ZhciBjYWNoZT1jYWNoZXNbb3RoSW5kZXhdOwppZighKGNhY2hlP2NhY2hlSGFzKGNhY2hlLGNvbXB1dGVkKTppbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLGNvbXB1dGVkLGNvbXBhcmF0b3IpKSljb250aW51ZSBvdXRlcn1pZihzZWVuKXNlZW4ucHVzaChjb21wdXRlZCk7cmVzdWx0LnB1c2godmFsdWUpfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXtiYXNlRm9yT3duKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxrZXksb2JqZWN0KXtzZXR0ZXIoYWNjdW11bGF0b3IsaXRlcmF0ZWUodmFsdWUpLGtleSxvYmplY3QpfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7b2JqZWN0PXBhcmVudChvYmplY3QscGF0aCk7dmFyIGZ1bmM9b2JqZWN0PT1udWxsP29iamVjdDpvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO3JldHVybiBmdW5jPT1udWxsP3VuZGVmaW5lZDoKYXBwbHkoZnVuYyxvYmplY3QsYXJncyl9ZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWFyZ3NUYWd9ZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09YXJyYXlCdWZmZXJUYWd9ZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1kYXRlVGFnfWZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl7aWYodmFsdWU9PT1vdGhlcilyZXR1cm4gdHJ1ZTtpZih2YWx1ZT09bnVsbHx8b3RoZXI9PW51bGx8fCFpc09iamVjdExpa2UodmFsdWUpJiYhaXNPYmplY3RMaWtlKG90aGVyKSlyZXR1cm4gdmFsdWUhPT12YWx1ZSYmb3RoZXIhPT1vdGhlcjtyZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLApvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsYmFzZUlzRXF1YWwsc3RhY2spfWZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIG9iaklzQXJyPWlzQXJyYXkob2JqZWN0KSxvdGhJc0Fycj1pc0FycmF5KG90aGVyKSxvYmpUYWc9b2JqSXNBcnI/YXJyYXlUYWc6Z2V0VGFnKG9iamVjdCksb3RoVGFnPW90aElzQXJyP2FycmF5VGFnOmdldFRhZyhvdGhlcik7b2JqVGFnPW9ialRhZz09YXJnc1RhZz9vYmplY3RUYWc6b2JqVGFnO290aFRhZz1vdGhUYWc9PWFyZ3NUYWc/b2JqZWN0VGFnOm90aFRhZzt2YXIgb2JqSXNPYmo9b2JqVGFnPT1vYmplY3RUYWcsb3RoSXNPYmo9b3RoVGFnPT1vYmplY3RUYWcsaXNTYW1lVGFnPW9ialRhZz09b3RoVGFnO2lmKGlzU2FtZVRhZyYmaXNCdWZmZXIob2JqZWN0KSl7aWYoIWlzQnVmZmVyKG90aGVyKSlyZXR1cm4gZmFsc2U7b2JqSXNBcnI9dHJ1ZTtvYmpJc09iaj0KZmFsc2V9aWYoaXNTYW1lVGFnJiYhb2JqSXNPYmope3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gb2JqSXNBcnJ8fGlzVHlwZWRBcnJheShvYmplY3QpP2VxdWFsQXJyYXlzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTplcXVhbEJ5VGFnKG9iamVjdCxvdGhlcixvYmpUYWcsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl9aWYoIShiaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHKSl7dmFyIG9iaklzV3JhcHBlZD1vYmpJc09iaiYmaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIl9fd3JhcHBlZF9fIiksb3RoSXNXcmFwcGVkPW90aElzT2JqJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCJfX3dyYXBwZWRfXyIpO2lmKG9iaklzV3JhcHBlZHx8b3RoSXNXcmFwcGVkKXt2YXIgb2JqVW53cmFwcGVkPW9iaklzV3JhcHBlZD9vYmplY3QudmFsdWUoKTpvYmplY3Qsb3RoVW53cmFwcGVkPW90aElzV3JhcHBlZD9vdGhlci52YWx1ZSgpOgpvdGhlcjtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7cmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsb3RoVW53cmFwcGVkLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl9fWlmKCFpc1NhbWVUYWcpcmV0dXJuIGZhbHNlO3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKX1mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZnZXRUYWcodmFsdWUpPT1tYXBUYWd9ZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxtYXRjaERhdGEsY3VzdG9taXplcil7dmFyIGluZGV4PW1hdGNoRGF0YS5sZW5ndGgsbGVuZ3RoPWluZGV4LG5vQ3VzdG9taXplcj0hY3VzdG9taXplcjtpZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUoaW5kZXgtLSl7dmFyIGRhdGE9bWF0Y2hEYXRhW2luZGV4XTsKaWYobm9DdXN0b21pemVyJiZkYXRhWzJdP2RhdGFbMV0hPT1vYmplY3RbZGF0YVswXV06IShkYXRhWzBdaW4gb2JqZWN0KSlyZXR1cm4gZmFsc2V9d2hpbGUoKytpbmRleDxsZW5ndGgpe2RhdGE9bWF0Y2hEYXRhW2luZGV4XTt2YXIga2V5PWRhdGFbMF0sb2JqVmFsdWU9b2JqZWN0W2tleV0sc3JjVmFsdWU9ZGF0YVsxXTtpZihub0N1c3RvbWl6ZXImJmRhdGFbMl0pe2lmKG9ialZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKXJldHVybiBmYWxzZX1lbHNle3ZhciBzdGFjaz1uZXcgU3RhY2s7aWYoY3VzdG9taXplcil2YXIgcmVzdWx0PWN1c3RvbWl6ZXIob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCxzb3VyY2Usc3RhY2spO2lmKCEocmVzdWx0PT09dW5kZWZpbmVkP2Jhc2VJc0VxdWFsKHNyY1ZhbHVlLG9ialZhbHVlLENPTVBBUkVfUEFSVElBTF9GTEFHfENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsY3VzdG9taXplcixzdGFjayk6cmVzdWx0KSlyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfQpmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpe2lmKCFpc09iamVjdCh2YWx1ZSl8fGlzTWFza2VkKHZhbHVlKSlyZXR1cm4gZmFsc2U7dmFyIHBhdHRlcm49aXNGdW5jdGlvbih2YWx1ZSk/cmVJc05hdGl2ZTpyZUlzSG9zdEN0b3I7cmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpfWZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1yZWdleHBUYWd9ZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmZ2V0VGFnKHZhbHVlKT09c2V0VGFnfWZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpJiYhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXX1mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09ImZ1bmN0aW9uIilyZXR1cm4gdmFsdWU7CmlmKHZhbHVlPT1udWxsKXJldHVybiBpZGVudGl0eTtpZih0eXBlb2YgdmFsdWU9PSJvYmplY3QiKXJldHVybiBpc0FycmF5KHZhbHVlKT9iYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLHZhbHVlWzFdKTpiYXNlTWF0Y2hlcyh2YWx1ZSk7cmV0dXJuIHByb3BlcnR5KHZhbHVlKX1mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3Qpe2lmKCFpc1Byb3RvdHlwZShvYmplY3QpKXJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7dmFyIHJlc3VsdD1bXTtmb3IodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSlpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZrZXkhPSJjb25zdHJ1Y3RvciIpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KXtpZighaXNPYmplY3Qob2JqZWN0KSlyZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7dmFyIGlzUHJvdG89aXNQcm90b3R5cGUob2JqZWN0KSxyZXN1bHQ9W107Zm9yKHZhciBrZXkgaW4gb2JqZWN0KWlmKCEoa2V5PT0KImNvbnN0cnVjdG9yIiYmKGlzUHJvdG98fCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpKSkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPG90aGVyfWZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGluZGV4PS0xLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7cmVzdWx0WysraW5kZXhdPWl0ZXJhdGVlKHZhbHVlLGtleSxjb2xsZWN0aW9uKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKXt2YXIgbWF0Y2hEYXRhPWdldE1hdGNoRGF0YShzb3VyY2UpO2lmKG1hdGNoRGF0YS5sZW5ndGg9PTEmJm1hdGNoRGF0YVswXVsyXSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLAptYXRjaERhdGFbMF1bMV0pO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PT1zb3VyY2V8fGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsbWF0Y2hEYXRhKX19ZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLHNyY1ZhbHVlKXtpZihpc0tleShwYXRoKSYmaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksc3JjVmFsdWUpO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3ZhciBvYmpWYWx1ZT1nZXQob2JqZWN0LHBhdGgpO3JldHVybiBvYmpWYWx1ZT09PXVuZGVmaW5lZCYmb2JqVmFsdWU9PT1zcmNWYWx1ZT9oYXNJbihvYmplY3QscGF0aCk6YmFzZUlzRXF1YWwoc3JjVmFsdWUsb2JqVmFsdWUsQ09NUEFSRV9QQVJUSUFMX0ZMQUd8Q09NUEFSRV9VTk9SREVSRURfRkxBRyl9fWZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIsc3RhY2spe2lmKG9iamVjdD09PQpzb3VyY2UpcmV0dXJuO2Jhc2VGb3Ioc291cmNlLGZ1bmN0aW9uKHNyY1ZhbHVlLGtleSl7aWYoaXNPYmplY3Qoc3JjVmFsdWUpKXtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7YmFzZU1lcmdlRGVlcChvYmplY3Qsc291cmNlLGtleSxzcmNJbmRleCxiYXNlTWVyZ2UsY3VzdG9taXplcixzdGFjayl9ZWxzZXt2YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LGtleSksc3JjVmFsdWUsa2V5KyIiLG9iamVjdCxzb3VyY2Usc3RhY2spOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCluZXdWYWx1ZT1zcmNWYWx1ZTthc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpfX0sa2V5c0luKX1mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCxzb3VyY2Usa2V5LHNyY0luZGV4LG1lcmdlRnVuYyxjdXN0b21pemVyLHN0YWNrKXt2YXIgb2JqVmFsdWU9c2FmZUdldChvYmplY3Qsa2V5KSxzcmNWYWx1ZT1zYWZlR2V0KHNvdXJjZSwKa2V5KSxzdGFja2VkPXN0YWNrLmdldChzcmNWYWx1ZSk7aWYoc3RhY2tlZCl7YXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHN0YWNrZWQpO3JldHVybn12YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKG9ialZhbHVlLHNyY1ZhbHVlLGtleSsiIixvYmplY3Qsc291cmNlLHN0YWNrKTp1bmRlZmluZWQ7dmFyIGlzQ29tbW9uPW5ld1ZhbHVlPT09dW5kZWZpbmVkO2lmKGlzQ29tbW9uKXt2YXIgaXNBcnI9aXNBcnJheShzcmNWYWx1ZSksaXNCdWZmPSFpc0FyciYmaXNCdWZmZXIoc3JjVmFsdWUpLGlzVHlwZWQ9IWlzQXJyJiYhaXNCdWZmJiZpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO25ld1ZhbHVlPXNyY1ZhbHVlO2lmKGlzQXJyfHxpc0J1ZmZ8fGlzVHlwZWQpaWYoaXNBcnJheShvYmpWYWx1ZSkpbmV3VmFsdWU9b2JqVmFsdWU7ZWxzZSBpZihpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpbmV3VmFsdWU9Y29weUFycmF5KG9ialZhbHVlKTtlbHNlIGlmKGlzQnVmZil7aXNDb21tb249CmZhbHNlO25ld1ZhbHVlPWNsb25lQnVmZmVyKHNyY1ZhbHVlLHRydWUpfWVsc2UgaWYoaXNUeXBlZCl7aXNDb21tb249ZmFsc2U7bmV3VmFsdWU9Y2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLHRydWUpfWVsc2UgbmV3VmFsdWU9W107ZWxzZSBpZihpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKXx8aXNBcmd1bWVudHMoc3JjVmFsdWUpKXtuZXdWYWx1ZT1vYmpWYWx1ZTtpZihpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpbmV3VmFsdWU9dG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7ZWxzZSBpZighaXNPYmplY3Qob2JqVmFsdWUpfHxzcmNJbmRleCYmaXNGdW5jdGlvbihvYmpWYWx1ZSkpbmV3VmFsdWU9aW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKX1lbHNlIGlzQ29tbW9uPWZhbHNlfWlmKGlzQ29tbW9uKXtzdGFjay5zZXQoc3JjVmFsdWUsbmV3VmFsdWUpO21lcmdlRnVuYyhuZXdWYWx1ZSxzcmNWYWx1ZSxzcmNJbmRleCxjdXN0b21pemVyLHN0YWNrKTtzdGFja1siZGVsZXRlIl0oc3JjVmFsdWUpfWFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LAprZXksbmV3VmFsdWUpfWZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksbil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm47bis9bjwwP2xlbmd0aDowO3JldHVybiBpc0luZGV4KG4sbGVuZ3RoKT9hcnJheVtuXTp1bmRlZmluZWR9ZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbixpdGVyYXRlZXMsb3JkZXJzKXt2YXIgaW5kZXg9LTE7aXRlcmF0ZWVzPWFycmF5TWFwKGl0ZXJhdGVlcy5sZW5ndGg/aXRlcmF0ZWVzOltpZGVudGl0eV0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTt2YXIgcmVzdWx0PWJhc2VNYXAoY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7dmFyIGNyaXRlcmlhPWFycmF5TWFwKGl0ZXJhdGVlcyxmdW5jdGlvbihpdGVyYXRlZSl7cmV0dXJuIGl0ZXJhdGVlKHZhbHVlKX0pO3JldHVybnsiY3JpdGVyaWEiOmNyaXRlcmlhLCJpbmRleCI6KytpbmRleCwidmFsdWUiOnZhbHVlfX0pO3JldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwKZnVuY3Rpb24ob2JqZWN0LG90aGVyKXtyZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCxvdGhlcixvcmRlcnMpfSl9ZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LHBhdGhzKXtyZXR1cm4gYmFzZVBpY2tCeShvYmplY3QscGF0aHMsZnVuY3Rpb24odmFsdWUscGF0aCl7cmV0dXJuIGhhc0luKG9iamVjdCxwYXRoKX0pfWZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LHBhdGhzLHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRocy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGF0aD1wYXRoc1tpbmRleF0sdmFsdWU9YmFzZUdldChvYmplY3QscGF0aCk7aWYocHJlZGljYXRlKHZhbHVlLHBhdGgpKWJhc2VTZXQocmVzdWx0LGNhc3RQYXRoKHBhdGgsb2JqZWN0KSx2YWx1ZSl9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlR2V0KG9iamVjdCxwYXRoKX19CmZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LHZhbHVlcyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXhPZj1jb21wYXJhdG9yP2Jhc2VJbmRleE9mV2l0aDpiYXNlSW5kZXhPZixpbmRleD0tMSxsZW5ndGg9dmFsdWVzLmxlbmd0aCxzZWVuPWFycmF5O2lmKGFycmF5PT09dmFsdWVzKXZhbHVlcz1jb3B5QXJyYXkodmFsdWVzKTtpZihpdGVyYXRlZSlzZWVuPWFycmF5TWFwKGFycmF5LGJhc2VVbmFyeShpdGVyYXRlZSkpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZnJvbUluZGV4PTAsdmFsdWU9dmFsdWVzW2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7d2hpbGUoKGZyb21JbmRleD1pbmRleE9mKHNlZW4sY29tcHV0ZWQsZnJvbUluZGV4LGNvbXBhcmF0b3IpKT4tMSl7aWYoc2VlbiE9PWFycmF5KXNwbGljZS5jYWxsKHNlZW4sZnJvbUluZGV4LDEpO3NwbGljZS5jYWxsKGFycmF5LGZyb21JbmRleCwxKX19cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VQdWxsQXQoYXJyYXksCmluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk/aW5kZXhlcy5sZW5ndGg6MCxsYXN0SW5kZXg9bGVuZ3RoLTE7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07aWYobGVuZ3RoPT1sYXN0SW5kZXh8fGluZGV4IT09cHJldmlvdXMpe3ZhciBwcmV2aW91cz1pbmRleDtpZihpc0luZGV4KGluZGV4KSlzcGxpY2UuY2FsbChhcnJheSxpbmRleCwxKTtlbHNlIGJhc2VVbnNldChhcnJheSxpbmRleCl9fXJldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKXtyZXR1cm4gbG93ZXIrbmF0aXZlRmxvb3IobmF0aXZlUmFuZG9tKCkqKHVwcGVyLWxvd2VyKzEpKX1mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQtc3RhcnQpLyhzdGVwfHwxKSksMCkscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUobGVuZ3RoLS0pe3Jlc3VsdFtmcm9tUmlnaHQ/Cmxlbmd0aDorK2luZGV4XT1zdGFydDtzdGFydCs9c3RlcH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VSZXBlYXQoc3RyaW5nLG4pe3ZhciByZXN1bHQ9IiI7aWYoIXN0cmluZ3x8bjwxfHxuPk1BWF9TQUZFX0lOVEVHRVIpcmV0dXJuIHJlc3VsdDtkb3tpZihuJTIpcmVzdWx0Kz1zdHJpbmc7bj1uYXRpdmVGbG9vcihuLzIpO2lmKG4pc3RyaW5nKz1zdHJpbmd9d2hpbGUobik7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUmVzdChmdW5jLHN0YXJ0KXtyZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYyxzdGFydCxpZGVudGl0eSksZnVuYysiIil9ZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKXtyZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4pe3ZhciBhcnJheT12YWx1ZXMoY29sbGVjdGlvbik7cmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9CmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIG9iamVjdDtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLGxhc3RJbmRleD1sZW5ndGgtMSxuZXN0ZWQ9b2JqZWN0O3doaWxlKG5lc3RlZCE9bnVsbCYmKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9dG9LZXkocGF0aFtpbmRleF0pLG5ld1ZhbHVlPXZhbHVlO2lmKGluZGV4IT1sYXN0SW5kZXgpe3ZhciBvYmpWYWx1ZT1uZXN0ZWRba2V5XTtuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqVmFsdWUsa2V5LG5lc3RlZCk6dW5kZWZpbmVkO2lmKG5ld1ZhbHVlPT09dW5kZWZpbmVkKW5ld1ZhbHVlPWlzT2JqZWN0KG9ialZhbHVlKT9vYmpWYWx1ZTppc0luZGV4KHBhdGhbaW5kZXgrMV0pP1tdOnt9fWFzc2lnblZhbHVlKG5lc3RlZCxrZXksbmV3VmFsdWUpO25lc3RlZD1uZXN0ZWRba2V5XX1yZXR1cm4gb2JqZWN0fQp2YXIgYmFzZVNldERhdGE9IW1ldGFNYXA/aWRlbnRpdHk6ZnVuY3Rpb24oZnVuYyxkYXRhKXttZXRhTWFwLnNldChmdW5jLGRhdGEpO3JldHVybiBmdW5jfTt2YXIgYmFzZVNldFRvU3RyaW5nPSFkZWZpbmVQcm9wZXJ0eT9pZGVudGl0eTpmdW5jdGlvbihmdW5jLHN0cmluZyl7cmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsInRvU3RyaW5nIix7ImNvbmZpZ3VyYWJsZSI6dHJ1ZSwiZW51bWVyYWJsZSI6ZmFsc2UsInZhbHVlIjpjb25zdGFudChzdHJpbmcpLCJ3cml0YWJsZSI6dHJ1ZX0pfTtmdW5jdGlvbiBiYXNlU2h1ZmZsZShjb2xsZWN0aW9uKXtyZXR1cm4gc2h1ZmZsZVNlbGYodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksc3RhcnQsZW5kKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtpZihzdGFydDwwKXN0YXJ0PS1zdGFydD5sZW5ndGg/MDpsZW5ndGgrc3RhcnQ7ZW5kPWVuZD5sZW5ndGg/bGVuZ3RoOmVuZDtpZihlbmQ8MCllbmQrPQpsZW5ndGg7bGVuZ3RoPXN0YXJ0PmVuZD8wOmVuZC1zdGFydD4+PjA7c3RhcnQ+Pj49MDt2YXIgcmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1hcnJheVtpbmRleCtzdGFydF07cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLHByZWRpY2F0ZSl7dmFyIHJlc3VsdDtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe3Jlc3VsdD1wcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIXJlc3VsdH0pO3JldHVybiEhcmVzdWx0fWZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSxyZXRIaWdoZXN0KXt2YXIgbG93PTAsaGlnaD1hcnJheT09bnVsbD9sb3c6YXJyYXkubGVuZ3RoO2lmKHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPT09dmFsdWUmJmhpZ2g8PUhBTEZfTUFYX0FSUkFZX0xFTkdUSCl7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9CmxvdytoaWdoPj4+MSxjb21wdXRlZD1hcnJheVttaWRdO2lmKGNvbXB1dGVkIT09bnVsbCYmIWlzU3ltYm9sKGNvbXB1dGVkKSYmKHJldEhpZ2hlc3Q/Y29tcHV0ZWQ8PXZhbHVlOmNvbXB1dGVkPHZhbHVlKSlsb3c9bWlkKzE7ZWxzZSBoaWdoPW1pZH1yZXR1cm4gaGlnaH1yZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaWRlbnRpdHkscmV0SGlnaGVzdCl9ZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUscmV0SGlnaGVzdCl7dmFsdWU9aXRlcmF0ZWUodmFsdWUpO3ZhciBsb3c9MCxoaWdoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHZhbElzTmFOPXZhbHVlIT09dmFsdWUsdmFsSXNOdWxsPXZhbHVlPT09bnVsbCx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSksdmFsSXNVbmRlZmluZWQ9dmFsdWU9PT11bmRlZmluZWQ7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9bmF0aXZlRmxvb3IoKGxvdytoaWdoKS8yKSxjb21wdXRlZD0KaXRlcmF0ZWUoYXJyYXlbbWlkXSksb3RoSXNEZWZpbmVkPWNvbXB1dGVkIT09dW5kZWZpbmVkLG90aElzTnVsbD1jb21wdXRlZD09PW51bGwsb3RoSXNSZWZsZXhpdmU9Y29tcHV0ZWQ9PT1jb21wdXRlZCxvdGhJc1N5bWJvbD1pc1N5bWJvbChjb21wdXRlZCk7aWYodmFsSXNOYU4pdmFyIHNldExvdz1yZXRIaWdoZXN0fHxvdGhJc1JlZmxleGl2ZTtlbHNlIGlmKHZhbElzVW5kZWZpbmVkKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmKHJldEhpZ2hlc3R8fG90aElzRGVmaW5lZCk7ZWxzZSBpZih2YWxJc051bGwpc2V0TG93PW90aElzUmVmbGV4aXZlJiZvdGhJc0RlZmluZWQmJihyZXRIaWdoZXN0fHwhb3RoSXNOdWxsKTtlbHNlIGlmKHZhbElzU3ltYm9sKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmb3RoSXNEZWZpbmVkJiYhb3RoSXNOdWxsJiYocmV0SGlnaGVzdHx8IW90aElzU3ltYm9sKTtlbHNlIGlmKG90aElzTnVsbHx8b3RoSXNTeW1ib2wpc2V0TG93PWZhbHNlO2Vsc2Ugc2V0TG93PQpyZXRIaWdoZXN0P2NvbXB1dGVkPD12YWx1ZTpjb21wdXRlZDx2YWx1ZTtpZihzZXRMb3cpbG93PW1pZCsxO2Vsc2UgaGlnaD1taWR9cmV0dXJuIG5hdGl2ZU1pbihoaWdoLE1BWF9BUlJBWV9JTkRFWCl9ZnVuY3Rpb24gYmFzZVNvcnRlZFVuaXEoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTtpZighaW5kZXh8fCFlcShjb21wdXRlZCxzZWVuKSl7dmFyIHNlZW49Y29tcHV0ZWQ7cmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlPT09MD8wOnZhbHVlfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VUb051bWJlcih2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ibnVtYmVyIilyZXR1cm4gdmFsdWU7aWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47cmV0dXJuK3ZhbHVlfQpmdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyIpcmV0dXJuIHZhbHVlO2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBhcnJheU1hcCh2YWx1ZSxiYXNlVG9TdHJpbmcpKyIiO2lmKGlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gc3ltYm9sVG9TdHJpbmc/c3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSk6IiI7dmFyIHJlc3VsdD12YWx1ZSsiIjtyZXR1cm4gcmVzdWx0PT0iMCImJjEvdmFsdWU9PS1JTkZJTklUWT8iLTAiOnJlc3VsdH1mdW5jdGlvbiBiYXNlVW5pcShhcnJheSxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsaW5jbHVkZXM9YXJyYXlJbmNsdWRlcyxsZW5ndGg9YXJyYXkubGVuZ3RoLGlzQ29tbW9uPXRydWUscmVzdWx0PVtdLHNlZW49cmVzdWx0O2lmKGNvbXBhcmF0b3Ipe2lzQ29tbW9uPWZhbHNlO2luY2x1ZGVzPWFycmF5SW5jbHVkZXNXaXRofWVsc2UgaWYobGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXt2YXIgc2V0PQppdGVyYXRlZT9udWxsOmNyZWF0ZVNldChhcnJheSk7aWYoc2V0KXJldHVybiBzZXRUb0FycmF5KHNldCk7aXNDb21tb249ZmFsc2U7aW5jbHVkZXM9Y2FjaGVIYXM7c2Vlbj1uZXcgU2V0Q2FjaGV9ZWxzZSBzZWVuPWl0ZXJhdGVlP1tdOnJlc3VsdDtvdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7dmFsdWU9Y29tcGFyYXRvcnx8dmFsdWUhPT0wP3ZhbHVlOjA7aWYoaXNDb21tb24mJmNvbXB1dGVkPT09Y29tcHV0ZWQpe3ZhciBzZWVuSW5kZXg9c2Vlbi5sZW5ndGg7d2hpbGUoc2VlbkluZGV4LS0paWYoc2VlbltzZWVuSW5kZXhdPT09Y29tcHV0ZWQpY29udGludWUgb3V0ZXI7aWYoaXRlcmF0ZWUpc2Vlbi5wdXNoKGNvbXB1dGVkKTtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXMoc2Vlbixjb21wdXRlZCxjb21wYXJhdG9yKSl7aWYoc2VlbiE9PXJlc3VsdClzZWVuLnB1c2goY29tcHV0ZWQpOwpyZXN1bHQucHVzaCh2YWx1ZSl9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTtvYmplY3Q9cGFyZW50KG9iamVjdCxwYXRoKTtyZXR1cm4gb2JqZWN0PT1udWxsfHxkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXX1mdW5jdGlvbiBiYXNlVXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIsY3VzdG9taXplcil7cmV0dXJuIGJhc2VTZXQob2JqZWN0LHBhdGgsdXBkYXRlcihiYXNlR2V0KG9iamVjdCxwYXRoKSksY3VzdG9taXplcil9ZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LHByZWRpY2F0ZSxpc0Ryb3AsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tUmlnaHQ/bGVuZ3RoOi0xO3doaWxlKChmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aCkmJnByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKTtyZXR1cm4gaXNEcm9wP2Jhc2VTbGljZShhcnJheSwKZnJvbVJpZ2h0PzA6aW5kZXgsZnJvbVJpZ2h0P2luZGV4KzE6bGVuZ3RoKTpiYXNlU2xpY2UoYXJyYXksZnJvbVJpZ2h0P2luZGV4KzE6MCxmcm9tUmlnaHQ/bGVuZ3RoOmluZGV4KX1mdW5jdGlvbiBiYXNlV3JhcHBlclZhbHVlKHZhbHVlLGFjdGlvbnMpe3ZhciByZXN1bHQ9dmFsdWU7aWYocmVzdWx0IGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpcmVzdWx0PXJlc3VsdC52YWx1ZSgpO3JldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLGZ1bmN0aW9uKHJlc3VsdCxhY3Rpb24pe3JldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZyxhcnJheVB1c2goW3Jlc3VsdF0sYWN0aW9uLmFyZ3MpKX0scmVzdWx0KX1mdW5jdGlvbiBiYXNlWG9yKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgbGVuZ3RoPWFycmF5cy5sZW5ndGg7aWYobGVuZ3RoPDIpcmV0dXJuIGxlbmd0aD9iYXNlVW5pcShhcnJheXNbMF0pOltdO3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobGVuZ3RoKTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBhcnJheT1hcnJheXNbaW5kZXhdLG90aEluZGV4PS0xO3doaWxlKCsrb3RoSW5kZXg8bGVuZ3RoKWlmKG90aEluZGV4IT1pbmRleClyZXN1bHRbaW5kZXhdPWJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF18fGFycmF5LGFycmF5c1tvdGhJbmRleF0saXRlcmF0ZWUsY29tcGFyYXRvcil9cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwxKSxpdGVyYXRlZSxjb21wYXJhdG9yKX1mdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLHZhbHVlcyxhc3NpZ25GdW5jKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXByb3BzLmxlbmd0aCx2YWxzTGVuZ3RoPXZhbHVlcy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9aW5kZXg8dmFsc0xlbmd0aD92YWx1ZXNbaW5kZXhdOnVuZGVmaW5lZDthc3NpZ25GdW5jKHJlc3VsdCxwcm9wc1tpbmRleF0sdmFsdWUpfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY2FzdEFycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKT8KdmFsdWU6W119ZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0iZnVuY3Rpb24iP3ZhbHVlOmlkZW50aXR5fWZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLG9iamVjdCl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIHZhbHVlO3JldHVybiBpc0tleSh2YWx1ZSxvYmplY3QpP1t2YWx1ZV06c3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSl9dmFyIGNhc3RSZXN0PWJhc2VSZXN0O2Z1bmN0aW9uIGNhc3RTbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO2VuZD1lbmQ9PT11bmRlZmluZWQ/bGVuZ3RoOmVuZDtyZXR1cm4hc3RhcnQmJmVuZD49bGVuZ3RoP2FycmF5OmJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfXZhciBjbGVhclRpbWVvdXQ9Y3R4Q2xlYXJUaW1lb3V0fHxmdW5jdGlvbihpZCl7cmV0dXJuIHJvb3QuY2xlYXJUaW1lb3V0KGlkKX07ZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLGlzRGVlcCl7aWYoaXNEZWVwKXJldHVybiBidWZmZXIuc2xpY2UoKTsKdmFyIGxlbmd0aD1idWZmZXIubGVuZ3RoLHJlc3VsdD1hbGxvY1Vuc2FmZT9hbGxvY1Vuc2FmZShsZW5ndGgpOm5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtidWZmZXIuY29weShyZXN1bHQpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcil7dmFyIHJlc3VsdD1uZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7KG5ldyBVaW50OEFycmF5KHJlc3VsdCkpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldyxpc0RlZXApe3ZhciBidWZmZXI9aXNEZWVwP2Nsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKTpkYXRhVmlldy5idWZmZXI7cmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsZGF0YVZpZXcuYnl0ZU9mZnNldCxkYXRhVmlldy5ieXRlTGVuZ3RoKX1mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApe3ZhciByZXN1bHQ9Cm5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSxyZUZsYWdzLmV4ZWMocmVnZXhwKSk7cmVzdWx0Lmxhc3RJbmRleD1yZWdleHAubGFzdEluZGV4O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKXtyZXR1cm4gc3ltYm9sVmFsdWVPZj9PYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpOnt9fWZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LGlzRGVlcCl7dmFyIGJ1ZmZlcj1pc0RlZXA/Y2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcik6dHlwZWRBcnJheS5idWZmZXI7cmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlcix0eXBlZEFycmF5LmJ5dGVPZmZzZXQsdHlwZWRBcnJheS5sZW5ndGgpfWZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsb3RoZXIpe2lmKHZhbHVlIT09b3RoZXIpe3ZhciB2YWxJc0RlZmluZWQ9dmFsdWUhPT11bmRlZmluZWQsdmFsSXNOdWxsPXZhbHVlPT09Cm51bGwsdmFsSXNSZWZsZXhpdmU9dmFsdWU9PT12YWx1ZSx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSk7dmFyIG90aElzRGVmaW5lZD1vdGhlciE9PXVuZGVmaW5lZCxvdGhJc051bGw9b3RoZXI9PT1udWxsLG90aElzUmVmbGV4aXZlPW90aGVyPT09b3RoZXIsb3RoSXNTeW1ib2w9aXNTeW1ib2wob3RoZXIpO2lmKCFvdGhJc051bGwmJiFvdGhJc1N5bWJvbCYmIXZhbElzU3ltYm9sJiZ2YWx1ZT5vdGhlcnx8dmFsSXNTeW1ib2wmJm90aElzRGVmaW5lZCYmb3RoSXNSZWZsZXhpdmUmJiFvdGhJc051bGwmJiFvdGhJc1N5bWJvbHx8dmFsSXNOdWxsJiZvdGhJc0RlZmluZWQmJm90aElzUmVmbGV4aXZlfHwhdmFsSXNEZWZpbmVkJiZvdGhJc1JlZmxleGl2ZXx8IXZhbElzUmVmbGV4aXZlKXJldHVybiAxO2lmKCF2YWxJc051bGwmJiF2YWxJc1N5bWJvbCYmIW90aElzU3ltYm9sJiZ2YWx1ZTxvdGhlcnx8b3RoSXNTeW1ib2wmJnZhbElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmUmJiF2YWxJc051bGwmJgohdmFsSXNTeW1ib2x8fG90aElzTnVsbCYmdmFsSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZXx8IW90aElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmV8fCFvdGhJc1JlZmxleGl2ZSlyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LG90aGVyLG9yZGVycyl7dmFyIGluZGV4PS0xLG9iakNyaXRlcmlhPW9iamVjdC5jcml0ZXJpYSxvdGhDcml0ZXJpYT1vdGhlci5jcml0ZXJpYSxsZW5ndGg9b2JqQ3JpdGVyaWEubGVuZ3RoLG9yZGVyc0xlbmd0aD1vcmRlcnMubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcmVzdWx0PWNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLG90aENyaXRlcmlhW2luZGV4XSk7aWYocmVzdWx0KXtpZihpbmRleD49b3JkZXJzTGVuZ3RoKXJldHVybiByZXN1bHQ7dmFyIG9yZGVyPW9yZGVyc1tpbmRleF07cmV0dXJuIHJlc3VsdCoob3JkZXI9PSJkZXNjIj8tMToxKX19cmV0dXJuIG9iamVjdC5pbmRleC0Kb3RoZXIuaW5kZXh9ZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPWFyZ3MubGVuZ3RoLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgsbGVmdEluZGV4PS0xLGxlZnRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLHJhbmdlTGVuZ3RoPW5hdGl2ZU1heChhcmdzTGVuZ3RoLWhvbGRlcnNMZW5ndGgsMCkscmVzdWx0PUFycmF5KGxlZnRMZW5ndGgrcmFuZ2VMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKytsZWZ0SW5kZXg8bGVmdExlbmd0aClyZXN1bHRbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKCsrYXJnc0luZGV4PGhvbGRlcnNMZW5ndGgpaWYoaXNVbmN1cnJpZWR8fGFyZ3NJbmRleDxhcmdzTGVuZ3RoKXJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dPWFyZ3NbYXJnc0luZGV4XTt3aGlsZShyYW5nZUxlbmd0aC0tKXJlc3VsdFtsZWZ0SW5kZXgrK109CmFyZ3NbYXJnc0luZGV4KytdO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLHBhcnRpYWxzLGhvbGRlcnMsaXNDdXJyaWVkKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9YXJncy5sZW5ndGgsaG9sZGVyc0luZGV4PS0xLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgscmlnaHRJbmRleD0tMSxyaWdodExlbmd0aD1wYXJ0aWFscy5sZW5ndGgscmFuZ2VMZW5ndGg9bmF0aXZlTWF4KGFyZ3NMZW5ndGgtaG9sZGVyc0xlbmd0aCwwKSxyZXN1bHQ9QXJyYXkocmFuZ2VMZW5ndGgrcmlnaHRMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKythcmdzSW5kZXg8cmFuZ2VMZW5ndGgpcmVzdWx0W2FyZ3NJbmRleF09YXJnc1thcmdzSW5kZXhdO3ZhciBvZmZzZXQ9YXJnc0luZGV4O3doaWxlKCsrcmlnaHRJbmRleDxyaWdodExlbmd0aClyZXN1bHRbb2Zmc2V0K3JpZ2h0SW5kZXhdPXBhcnRpYWxzW3JpZ2h0SW5kZXhdO3doaWxlKCsraG9sZGVyc0luZGV4PApob2xkZXJzTGVuZ3RoKWlmKGlzVW5jdXJyaWVkfHxhcmdzSW5kZXg8YXJnc0xlbmd0aClyZXN1bHRbb2Zmc2V0K2hvbGRlcnNbaG9sZGVyc0luZGV4XV09YXJnc1thcmdzSW5kZXgrK107cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXNvdXJjZS5sZW5ndGg7YXJyYXl8fChhcnJheT1BcnJheShsZW5ndGgpKTt3aGlsZSgrK2luZGV4PGxlbmd0aClhcnJheVtpbmRleF09c291cmNlW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UscHJvcHMsb2JqZWN0LGN1c3RvbWl6ZXIpe3ZhciBpc05ldz0hb2JqZWN0O29iamVjdHx8KG9iamVjdD17fSk7dmFyIGluZGV4PS0xLGxlbmd0aD1wcm9wcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9cHJvcHNbaW5kZXhdO3ZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqZWN0W2tleV0sc291cmNlW2tleV0sCmtleSxvYmplY3Qsc291cmNlKTp1bmRlZmluZWQ7aWYobmV3VmFsdWU9PT11bmRlZmluZWQpbmV3VmFsdWU9c291cmNlW2tleV07aWYoaXNOZXcpYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpO2Vsc2UgYXNzaWduVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSl9cmV0dXJuIG9iamVjdH1mdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9scyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9sc0luKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcixpbml0aWFsaXplcil7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlBZ2dyZWdhdG9yOmJhc2VBZ2dyZWdhdG9yLGFjY3VtdWxhdG9yPQppbml0aWFsaXplcj9pbml0aWFsaXplcigpOnt9O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sc2V0dGVyLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLGFjY3VtdWxhdG9yKX19ZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpe3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3Qsc291cmNlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1zb3VyY2VzLmxlbmd0aCxjdXN0b21pemVyPWxlbmd0aD4xP3NvdXJjZXNbbGVuZ3RoLTFdOnVuZGVmaW5lZCxndWFyZD1sZW5ndGg+Mj9zb3VyY2VzWzJdOnVuZGVmaW5lZDtjdXN0b21pemVyPWFzc2lnbmVyLmxlbmd0aD4zJiZ0eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj8obGVuZ3RoLS0sY3VzdG9taXplcik6dW5kZWZpbmVkO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLHNvdXJjZXNbMV0sZ3VhcmQpKXtjdXN0b21pemVyPWxlbmd0aDwzP3VuZGVmaW5lZDpjdXN0b21pemVyO2xlbmd0aD0xfW9iamVjdD1PYmplY3Qob2JqZWN0KTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBzb3VyY2U9c291cmNlc1tpbmRleF07aWYoc291cmNlKWFzc2lnbmVyKG9iamVjdCxzb3VyY2UsaW5kZXgsY3VzdG9taXplcil9cmV0dXJuIG9iamVjdH0pfWZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuIGNvbGxlY3Rpb247aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLGl0ZXJhdGVlKTt2YXIgbGVuZ3RoPWNvbGxlY3Rpb24ubGVuZ3RoLGluZGV4PWZyb21SaWdodD9sZW5ndGg6LTEsaXRlcmFibGU9T2JqZWN0KGNvbGxlY3Rpb24pO3doaWxlKGZyb21SaWdodD9pbmRleC0tOisraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSxpbmRleCxpdGVyYWJsZSk9PT1mYWxzZSlicmVhaztyZXR1cm4gY29sbGVjdGlvbn19ZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpe3JldHVybiBmdW5jdGlvbihvYmplY3QsCml0ZXJhdGVlLGtleXNGdW5jKXt2YXIgaW5kZXg9LTEsaXRlcmFibGU9T2JqZWN0KG9iamVjdCkscHJvcHM9a2V5c0Z1bmMob2JqZWN0KSxsZW5ndGg9cHJvcHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXt2YXIga2V5PXByb3BzW2Zyb21SaWdodD9sZW5ndGg6KytpbmRleF07aWYoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpPT09ZmFsc2UpYnJlYWt9cmV0dXJuIG9iamVjdH19ZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLGJpdG1hc2ssdGhpc0FyZyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGZuPXRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcj9DdG9yOmZ1bmM7cmV0dXJuIGZuLmFwcGx5KGlzQmluZD90aGlzQXJnOnRoaXMsYXJndW1lbnRzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7c3RyaW5nPQp0b1N0cmluZyhzdHJpbmcpO3ZhciBzdHJTeW1ib2xzPWhhc1VuaWNvZGUoc3RyaW5nKT9zdHJpbmdUb0FycmF5KHN0cmluZyk6dW5kZWZpbmVkO3ZhciBjaHI9c3RyU3ltYm9scz9zdHJTeW1ib2xzWzBdOnN0cmluZy5jaGFyQXQoMCk7dmFyIHRyYWlsaW5nPXN0clN5bWJvbHM/Y2FzdFNsaWNlKHN0clN5bWJvbHMsMSkuam9pbigiIik6c3RyaW5nLnNsaWNlKDEpO3JldHVybiBjaHJbbWV0aG9kTmFtZV0oKSt0cmFpbGluZ319ZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjayl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCIiKSksY2FsbGJhY2ssIiIpfX1mdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3Ipe3JldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cztzd2l0Y2goYXJncy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IEN0b3I7Y2FzZSAxOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTsKY2FzZSAyOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7Y2FzZSA1OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pO2Nhc2UgNjpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pO2Nhc2UgNzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSl9dmFyIHRoaXNCaW5kaW5nPWJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLHJlc3VsdD1DdG9yLmFwcGx5KHRoaXNCaW5kaW5nLGFyZ3MpO3JldHVybiBpc09iamVjdChyZXN1bHQpP3Jlc3VsdDp0aGlzQmluZGluZ319ZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywKYml0bWFzayxhcml0eSl7dmFyIEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVuZ3RoKSxpbmRleD1sZW5ndGgscGxhY2Vob2xkZXI9Z2V0SG9sZGVyKHdyYXBwZXIpO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTt2YXIgaG9sZGVycz1sZW5ndGg8MyYmYXJnc1swXSE9PXBsYWNlaG9sZGVyJiZhcmdzW2xlbmd0aC0xXSE9PXBsYWNlaG9sZGVyP1tdOnJlcGxhY2VIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpO2xlbmd0aC09aG9sZGVycy5sZW5ndGg7aWYobGVuZ3RoPGFyaXR5KXJldHVybiBjcmVhdGVSZWN1cnJ5KGZ1bmMsYml0bWFzayxjcmVhdGVIeWJyaWQsd3JhcHBlci5wbGFjZWhvbGRlcix1bmRlZmluZWQsYXJncyxob2xkZXJzLHVuZGVmaW5lZCx1bmRlZmluZWQsYXJpdHktbGVuZ3RoKTt2YXIgZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZgp3cmFwcGVyP0N0b3I6ZnVuYztyZXR1cm4gYXBwbHkoZm4sdGhpcyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpe3JldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBpdGVyYWJsZT1PYmplY3QoY29sbGVjdGlvbik7aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXt2YXIgaXRlcmF0ZWU9Z2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpO2NvbGxlY3Rpb249a2V5cyhjb2xsZWN0aW9uKTtwcmVkaWNhdGU9ZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpfX12YXIgaW5kZXg9ZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpO3JldHVybiBpbmRleD4tMT9pdGVyYWJsZVtpdGVyYXRlZT9jb2xsZWN0aW9uW2luZGV4XTppbmRleF06dW5kZWZpbmVkfX1mdW5jdGlvbiBjcmVhdGVGbG93KGZyb21SaWdodCl7cmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmNzKXt2YXIgbGVuZ3RoPQpmdW5jcy5sZW5ndGgsaW5kZXg9bGVuZ3RoLHByZXJlcT1Mb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O2lmKGZyb21SaWdodClmdW5jcy5yZXZlcnNlKCk7d2hpbGUoaW5kZXgtLSl7dmFyIGZ1bmM9ZnVuY3NbaW5kZXhdO2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtpZihwcmVyZXEmJiF3cmFwcGVyJiZnZXRGdW5jTmFtZShmdW5jKT09IndyYXBwZXIiKXZhciB3cmFwcGVyPW5ldyBMb2Rhc2hXcmFwcGVyKFtdLHRydWUpfWluZGV4PXdyYXBwZXI/aW5kZXg6bGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtmdW5jPWZ1bmNzW2luZGV4XTt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksZGF0YT1mdW5jTmFtZT09IndyYXBwZXIiP2dldERhdGEoZnVuYyk6dW5kZWZpbmVkO2lmKGRhdGEmJmlzTGF6aWFibGUoZGF0YVswXSkmJmRhdGFbMV09PShXUkFQX0FSWV9GTEFHfFdSQVBfQ1VSUllfRkxBR3xXUkFQX1BBUlRJQUxfRkxBR3wKV1JBUF9SRUFSR19GTEFHKSYmIWRhdGFbNF0ubGVuZ3RoJiZkYXRhWzldPT0xKXdyYXBwZXI9d3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlcixkYXRhWzNdKTtlbHNlIHdyYXBwZXI9ZnVuYy5sZW5ndGg9PTEmJmlzTGF6aWFibGUoZnVuYyk/d3JhcHBlcltmdW5jTmFtZV0oKTp3cmFwcGVyLnRocnUoZnVuYyl9cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHZhbHVlPWFyZ3NbMF07aWYod3JhcHBlciYmYXJncy5sZW5ndGg9PTEmJmlzQXJyYXkodmFsdWUpKXJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO3ZhciBpbmRleD0wLHJlc3VsdD1sZW5ndGg/ZnVuY3NbaW5kZXhdLmFwcGx5KHRoaXMsYXJncyk6dmFsdWU7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0PWZ1bmNzW2luZGV4XS5jYWxsKHRoaXMscmVzdWx0KTtyZXR1cm4gcmVzdWx0fX0pfWZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLGJpdG1hc2ssdGhpc0FyZywKcGFydGlhbHMsaG9sZGVycyxwYXJ0aWFsc1JpZ2h0LGhvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNBcnk9Yml0bWFzayZXUkFQX0FSWV9GTEFHLGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRyxpc0N1cnJpZWQ9Yml0bWFzayYoV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRyksaXNGbGlwPWJpdG1hc2smV1JBUF9GTElQX0ZMQUcsQ3Rvcj1pc0JpbmRLZXk/dW5kZWZpbmVkOmNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBsZW5ndGg9YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KGxlbmd0aCksaW5kZXg9bGVuZ3RoO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTtpZihpc0N1cnJpZWQpdmFyIHBsYWNlaG9sZGVyPWdldEhvbGRlcih3cmFwcGVyKSxob2xkZXJzQ291bnQ9Y291bnRIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpOwppZihwYXJ0aWFscylhcmdzPWNvbXBvc2VBcmdzKGFyZ3MscGFydGlhbHMsaG9sZGVycyxpc0N1cnJpZWQpO2lmKHBhcnRpYWxzUmlnaHQpYXJncz1jb21wb3NlQXJnc1JpZ2h0KGFyZ3MscGFydGlhbHNSaWdodCxob2xkZXJzUmlnaHQsaXNDdXJyaWVkKTtsZW5ndGgtPWhvbGRlcnNDb3VudDtpZihpc0N1cnJpZWQmJmxlbmd0aDxhcml0eSl7dmFyIG5ld0hvbGRlcnM9cmVwbGFjZUhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7cmV0dXJuIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLGNyZWF0ZUh5YnJpZCx3cmFwcGVyLnBsYWNlaG9sZGVyLHRoaXNBcmcsYXJncyxuZXdIb2xkZXJzLGFyZ1BvcyxhcnksYXJpdHktbGVuZ3RoKX12YXIgdGhpc0JpbmRpbmc9aXNCaW5kP3RoaXNBcmc6dGhpcyxmbj1pc0JpbmRLZXk/dGhpc0JpbmRpbmdbZnVuY106ZnVuYztsZW5ndGg9YXJncy5sZW5ndGg7aWYoYXJnUG9zKWFyZ3M9cmVvcmRlcihhcmdzLGFyZ1Bvcyk7ZWxzZSBpZihpc0ZsaXAmJmxlbmd0aD4KMSlhcmdzLnJldmVyc2UoKTtpZihpc0FyeSYmYXJ5PGxlbmd0aClhcmdzLmxlbmd0aD1hcnk7aWYodGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKWZuPUN0b3J8fGNyZWF0ZUN0b3IoZm4pO3JldHVybiBmbi5hcHBseSh0aGlzQmluZGluZyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsdG9JdGVyYXRlZSl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLHt9KX19ZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvcixkZWZhdWx0VmFsdWUpe3JldHVybiBmdW5jdGlvbih2YWx1ZSxvdGhlcil7dmFyIHJlc3VsdDtpZih2YWx1ZT09PXVuZGVmaW5lZCYmb3RoZXI9PT11bmRlZmluZWQpcmV0dXJuIGRlZmF1bHRWYWx1ZTtpZih2YWx1ZSE9PXVuZGVmaW5lZClyZXN1bHQ9dmFsdWU7aWYob3RoZXIhPT0KdW5kZWZpbmVkKXtpZihyZXN1bHQ9PT11bmRlZmluZWQpcmV0dXJuIG90aGVyO2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyJ8fHR5cGVvZiBvdGhlcj09InN0cmluZyIpe3ZhbHVlPWJhc2VUb1N0cmluZyh2YWx1ZSk7b3RoZXI9YmFzZVRvU3RyaW5nKG90aGVyKX1lbHNle3ZhbHVlPWJhc2VUb051bWJlcih2YWx1ZSk7b3RoZXI9YmFzZVRvTnVtYmVyKG90aGVyKX1yZXN1bHQ9b3BlcmF0b3IodmFsdWUsb3RoZXIpfXJldHVybiByZXN1bHR9fWZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKXtyZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKXtpdGVyYXRlZXM9YXJyYXlNYXAoaXRlcmF0ZWVzLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciB0aGlzQXJnPXRoaXM7cmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsZnVuY3Rpb24oaXRlcmF0ZWUpe3JldHVybiBhcHBseShpdGVyYXRlZSx0aGlzQXJnLGFyZ3MpfSl9KX0pfQpmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCxjaGFycyl7Y2hhcnM9Y2hhcnM9PT11bmRlZmluZWQ/IiAiOmJhc2VUb1N0cmluZyhjaGFycyk7dmFyIGNoYXJzTGVuZ3RoPWNoYXJzLmxlbmd0aDtpZihjaGFyc0xlbmd0aDwyKXJldHVybiBjaGFyc0xlbmd0aD9iYXNlUmVwZWF0KGNoYXJzLGxlbmd0aCk6Y2hhcnM7dmFyIHJlc3VsdD1iYXNlUmVwZWF0KGNoYXJzLG5hdGl2ZUNlaWwobGVuZ3RoL3N0cmluZ1NpemUoY2hhcnMpKSk7cmV0dXJuIGhhc1VuaWNvZGUoY2hhcnMpP2Nhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksMCxsZW5ndGgpLmpvaW4oIiIpOnJlc3VsdC5zbGljZSgwLGxlbmd0aCl9ZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPQphcmd1bWVudHMubGVuZ3RoLGxlZnRJbmRleD0tMSxsZWZ0TGVuZ3RoPXBhcnRpYWxzLmxlbmd0aCxhcmdzPUFycmF5KGxlZnRMZW5ndGgrYXJnc0xlbmd0aCksZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyP0N0b3I6ZnVuYzt3aGlsZSgrK2xlZnRJbmRleDxsZWZ0TGVuZ3RoKWFyZ3NbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKGFyZ3NMZW5ndGgtLSlhcmdzW2xlZnRJbmRleCsrXT1hcmd1bWVudHNbKythcmdzSW5kZXhdO3JldHVybiBhcHBseShmbixpc0JpbmQ/dGhpc0FyZzp0aGlzLGFyZ3MpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LGVuZCxzdGVwKXtpZihzdGVwJiZ0eXBlb2Ygc3RlcCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0YXJ0LGVuZCxzdGVwKSllbmQ9c3RlcD11bmRlZmluZWQ7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PQp1bmRlZmluZWQpe2VuZD1zdGFydDtzdGFydD0wfWVsc2UgZW5kPXRvRmluaXRlKGVuZCk7c3RlcD1zdGVwPT09dW5kZWZpbmVkP3N0YXJ0PGVuZD8xOi0xOnRvRmluaXRlKHN0ZXApO3JldHVybiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KX19ZnVuY3Rpb24gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihvcGVyYXRvcil7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtpZighKHR5cGVvZiB2YWx1ZT09InN0cmluZyImJnR5cGVvZiBvdGhlcj09InN0cmluZyIpKXt2YWx1ZT10b051bWJlcih2YWx1ZSk7b3RoZXI9dG9OdW1iZXIob3RoZXIpfXJldHVybiBvcGVyYXRvcih2YWx1ZSxvdGhlcil9fWZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLHdyYXBGdW5jLHBsYWNlaG9sZGVyLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNDdXJyeT1iaXRtYXNrJldSQVBfQ1VSUllfRkxBRyxuZXdIb2xkZXJzPWlzQ3Vycnk/CmhvbGRlcnM6dW5kZWZpbmVkLG5ld0hvbGRlcnNSaWdodD1pc0N1cnJ5P3VuZGVmaW5lZDpob2xkZXJzLG5ld1BhcnRpYWxzPWlzQ3Vycnk/cGFydGlhbHM6dW5kZWZpbmVkLG5ld1BhcnRpYWxzUmlnaHQ9aXNDdXJyeT91bmRlZmluZWQ6cGFydGlhbHM7Yml0bWFza3w9aXNDdXJyeT9XUkFQX1BBUlRJQUxfRkxBRzpXUkFQX1BBUlRJQUxfUklHSFRfRkxBRztiaXRtYXNrJj1+KGlzQ3Vycnk/V1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUc6V1JBUF9QQVJUSUFMX0ZMQUcpO2lmKCEoYml0bWFzayZXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKWJpdG1hc2smPX4oV1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHKTt2YXIgbmV3RGF0YT1bZnVuYyxiaXRtYXNrLHRoaXNBcmcsbmV3UGFydGlhbHMsbmV3SG9sZGVycyxuZXdQYXJ0aWFsc1JpZ2h0LG5ld0hvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5XTt2YXIgcmVzdWx0PXdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCxuZXdEYXRhKTtpZihpc0xhemlhYmxlKGZ1bmMpKXNldERhdGEocmVzdWx0LApuZXdEYXRhKTtyZXN1bHQucGxhY2Vob2xkZXI9cGxhY2Vob2xkZXI7cmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsZnVuYyxiaXRtYXNrKX1mdW5jdGlvbiBjcmVhdGVSb3VuZChtZXRob2ROYW1lKXt2YXIgZnVuYz1NYXRoW21ldGhvZE5hbWVdO3JldHVybiBmdW5jdGlvbihudW1iZXIscHJlY2lzaW9uKXtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtwcmVjaXNpb249cHJlY2lzaW9uPT1udWxsPzA6bmF0aXZlTWluKHRvSW50ZWdlcihwcmVjaXNpb24pLDI5Mik7aWYocHJlY2lzaW9uKXt2YXIgcGFpcj0odG9TdHJpbmcobnVtYmVyKSsiZSIpLnNwbGl0KCJlIiksdmFsdWU9ZnVuYyhwYWlyWzBdKyJlIisoK3BhaXJbMV0rcHJlY2lzaW9uKSk7cGFpcj0odG9TdHJpbmcodmFsdWUpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKHBhaXJbMF0rImUiKygrcGFpclsxXS1wcmVjaXNpb24pKX1yZXR1cm4gZnVuYyhudW1iZXIpfX12YXIgY3JlYXRlU2V0PSEoU2V0JiYxL3NldFRvQXJyYXkobmV3IFNldChbLAotMF0pKVsxXT09SU5GSU5JVFkpP25vb3A6ZnVuY3Rpb24odmFsdWVzKXtyZXR1cm4gbmV3IFNldCh2YWx1ZXMpfTtmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXt2YXIgdGFnPWdldFRhZyhvYmplY3QpO2lmKHRhZz09bWFwVGFnKXJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7aWYodGFnPT1zZXRUYWcpcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtyZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LGtleXNGdW5jKG9iamVjdCkpfX1mdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMsYXJnUG9zLGFyeSxhcml0eSl7dmFyIGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRztpZighaXNCaW5kS2V5JiZ0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7dmFyIGxlbmd0aD1wYXJ0aWFscz9wYXJ0aWFscy5sZW5ndGg6CjA7aWYoIWxlbmd0aCl7Yml0bWFzayY9fihXUkFQX1BBUlRJQUxfRkxBR3xXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9YXJ5PWFyeT09PXVuZGVmaW5lZD9hcnk6bmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLDApO2FyaXR5PWFyaXR5PT09dW5kZWZpbmVkP2FyaXR5OnRvSW50ZWdlcihhcml0eSk7bGVuZ3RoLT1ob2xkZXJzP2hvbGRlcnMubGVuZ3RoOjA7aWYoYml0bWFzayZXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyl7dmFyIHBhcnRpYWxzUmlnaHQ9cGFydGlhbHMsaG9sZGVyc1JpZ2h0PWhvbGRlcnM7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9dmFyIGRhdGE9aXNCaW5kS2V5P3VuZGVmaW5lZDpnZXREYXRhKGZ1bmMpO3ZhciBuZXdEYXRhPVtmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzLHBhcnRpYWxzUmlnaHQsaG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHldO2lmKGRhdGEpbWVyZ2VEYXRhKG5ld0RhdGEsCmRhdGEpO2Z1bmM9bmV3RGF0YVswXTtiaXRtYXNrPW5ld0RhdGFbMV07dGhpc0FyZz1uZXdEYXRhWzJdO3BhcnRpYWxzPW5ld0RhdGFbM107aG9sZGVycz1uZXdEYXRhWzRdO2FyaXR5PW5ld0RhdGFbOV09bmV3RGF0YVs5XT09PXVuZGVmaW5lZD9pc0JpbmRLZXk/MDpmdW5jLmxlbmd0aDpuYXRpdmVNYXgobmV3RGF0YVs5XS1sZW5ndGgsMCk7aWYoIWFyaXR5JiZiaXRtYXNrJihXUkFQX0NVUlJZX0ZMQUd8V1JBUF9DVVJSWV9SSUdIVF9GTEFHKSliaXRtYXNrJj1+KFdSQVBfQ1VSUllfRkxBR3xXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpO2lmKCFiaXRtYXNrfHxiaXRtYXNrPT1XUkFQX0JJTkRfRkxBRyl2YXIgcmVzdWx0PWNyZWF0ZUJpbmQoZnVuYyxiaXRtYXNrLHRoaXNBcmcpO2Vsc2UgaWYoYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxiaXRtYXNrPT1XUkFQX0NVUlJZX1JJR0hUX0ZMQUcpcmVzdWx0PWNyZWF0ZUN1cnJ5KGZ1bmMsYml0bWFzayxhcml0eSk7ZWxzZSBpZigoYml0bWFzaz09CldSQVBfUEFSVElBTF9GTEFHfHxiaXRtYXNrPT0oV1JBUF9CSU5EX0ZMQUd8V1JBUF9QQVJUSUFMX0ZMQUcpKSYmIWhvbGRlcnMubGVuZ3RoKXJlc3VsdD1jcmVhdGVQYXJ0aWFsKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzKTtlbHNlIHJlc3VsdD1jcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLG5ld0RhdGEpO3ZhciBzZXR0ZXI9ZGF0YT9iYXNlU2V0RGF0YTpzZXREYXRhO3JldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCxuZXdEYXRhKSxmdW5jLGJpdG1hc2spfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzQXNzaWduSW4ob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCl7aWYob2JqVmFsdWU9PT11bmRlZmluZWR8fGVxKG9ialZhbHVlLG9iamVjdFByb3RvW2tleV0pJiYhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSlyZXR1cm4gc3JjVmFsdWU7cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsCmtleSxvYmplY3Qsc291cmNlLHN0YWNrKXtpZihpc09iamVjdChvYmpWYWx1ZSkmJmlzT2JqZWN0KHNyY1ZhbHVlKSl7c3RhY2suc2V0KHNyY1ZhbHVlLG9ialZhbHVlKTtiYXNlTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsdW5kZWZpbmVkLGN1c3RvbURlZmF1bHRzTWVyZ2Usc3RhY2spO3N0YWNrWyJkZWxldGUiXShzcmNWYWx1ZSl9cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSl7cmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpP3VuZGVmaW5lZDp2YWx1ZX1mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXt2YXIgaXNQYXJ0aWFsPWJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsYXJyTGVuZ3RoPWFycmF5Lmxlbmd0aCxvdGhMZW5ndGg9b3RoZXIubGVuZ3RoO2lmKGFyckxlbmd0aCE9b3RoTGVuZ3RoJiYhKGlzUGFydGlhbCYmb3RoTGVuZ3RoPmFyckxlbmd0aCkpcmV0dXJuIGZhbHNlOwp2YXIgc3RhY2tlZD1zdGFjay5nZXQoYXJyYXkpO2lmKHN0YWNrZWQmJnN0YWNrLmdldChvdGhlcikpcmV0dXJuIHN0YWNrZWQ9PW90aGVyO3ZhciBpbmRleD0tMSxyZXN1bHQ9dHJ1ZSxzZWVuPWJpdG1hc2smQ09NUEFSRV9VTk9SREVSRURfRkxBRz9uZXcgU2V0Q2FjaGU6dW5kZWZpbmVkO3N0YWNrLnNldChhcnJheSxvdGhlcik7c3RhY2suc2V0KG90aGVyLGFycmF5KTt3aGlsZSgrK2luZGV4PGFyckxlbmd0aCl7dmFyIGFyclZhbHVlPWFycmF5W2luZGV4XSxvdGhWYWx1ZT1vdGhlcltpbmRleF07aWYoY3VzdG9taXplcil2YXIgY29tcGFyZWQ9aXNQYXJ0aWFsP2N1c3RvbWl6ZXIob3RoVmFsdWUsYXJyVmFsdWUsaW5kZXgsb3RoZXIsYXJyYXksc3RhY2spOmN1c3RvbWl6ZXIoYXJyVmFsdWUsb3RoVmFsdWUsaW5kZXgsYXJyYXksb3RoZXIsc3RhY2spO2lmKGNvbXBhcmVkIT09dW5kZWZpbmVkKXtpZihjb21wYXJlZCljb250aW51ZTtyZXN1bHQ9ZmFsc2U7YnJlYWt9aWYoc2Vlbil7aWYoIWFycmF5U29tZShvdGhlciwKZnVuY3Rpb24ob3RoVmFsdWUsb3RoSW5kZXgpe2lmKCFjYWNoZUhhcyhzZWVuLG90aEluZGV4KSYmKGFyclZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhhcnJWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spKSlyZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KX0pKXtyZXN1bHQ9ZmFsc2U7YnJlYWt9fWVsc2UgaWYoIShhcnJWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMoYXJyVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKSkpe3Jlc3VsdD1mYWxzZTticmVha319c3RhY2tbImRlbGV0ZSJdKGFycmF5KTtzdGFja1siZGVsZXRlIl0ob3RoZXIpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3Qsb3RoZXIsdGFnLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3N3aXRjaCh0YWcpe2Nhc2UgZGF0YVZpZXdUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fG9iamVjdC5ieXRlT2Zmc2V0IT0Kb3RoZXIuYnl0ZU9mZnNldClyZXR1cm4gZmFsc2U7b2JqZWN0PW9iamVjdC5idWZmZXI7b3RoZXI9b3RoZXIuYnVmZmVyO2Nhc2UgYXJyYXlCdWZmZXJUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fCFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSxuZXcgVWludDhBcnJheShvdGhlcikpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOmNhc2UgbnVtYmVyVGFnOnJldHVybiBlcSgrb2JqZWN0LCtvdGhlcik7Y2FzZSBlcnJvclRhZzpyZXR1cm4gb2JqZWN0Lm5hbWU9PW90aGVyLm5hbWUmJm9iamVjdC5tZXNzYWdlPT1vdGhlci5tZXNzYWdlO2Nhc2UgcmVnZXhwVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBvYmplY3Q9PW90aGVyKyIiO2Nhc2UgbWFwVGFnOnZhciBjb252ZXJ0PW1hcFRvQXJyYXk7Y2FzZSBzZXRUYWc6dmFyIGlzUGFydGlhbD1iaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHO2NvbnZlcnR8fAooY29udmVydD1zZXRUb0FycmF5KTtpZihvYmplY3Quc2l6ZSE9b3RoZXIuc2l6ZSYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZClyZXR1cm4gc3RhY2tlZD09b3RoZXI7Yml0bWFza3w9Q09NUEFSRV9VTk9SREVSRURfRkxBRztzdGFjay5zZXQob2JqZWN0LG90aGVyKTt2YXIgcmVzdWx0PWVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSxjb252ZXJ0KG90aGVyKSxiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTtzdGFja1siZGVsZXRlIl0ob2JqZWN0KTtyZXR1cm4gcmVzdWx0O2Nhc2Ugc3ltYm9sVGFnOmlmKHN5bWJvbFZhbHVlT2YpcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpPT1zeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpfXJldHVybiBmYWxzZX1mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3ZhciBpc1BhcnRpYWw9CmJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsb2JqUHJvcHM9Z2V0QWxsS2V5cyhvYmplY3QpLG9iakxlbmd0aD1vYmpQcm9wcy5sZW5ndGgsb3RoUHJvcHM9Z2V0QWxsS2V5cyhvdGhlciksb3RoTGVuZ3RoPW90aFByb3BzLmxlbmd0aDtpZihvYmpMZW5ndGghPW90aExlbmd0aCYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIGluZGV4PW9iakxlbmd0aDt3aGlsZShpbmRleC0tKXt2YXIga2V5PW9ialByb3BzW2luZGV4XTtpZighKGlzUGFydGlhbD9rZXkgaW4gb3RoZXI6aGFzT3duUHJvcGVydHkuY2FsbChvdGhlcixrZXkpKSlyZXR1cm4gZmFsc2V9dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZCYmc3RhY2suZ2V0KG90aGVyKSlyZXR1cm4gc3RhY2tlZD09b3RoZXI7dmFyIHJlc3VsdD10cnVlO3N0YWNrLnNldChvYmplY3Qsb3RoZXIpO3N0YWNrLnNldChvdGhlcixvYmplY3QpO3ZhciBza2lwQ3Rvcj1pc1BhcnRpYWw7d2hpbGUoKytpbmRleDxvYmpMZW5ndGgpe2tleT0Kb2JqUHJvcHNbaW5kZXhdO3ZhciBvYmpWYWx1ZT1vYmplY3Rba2V5XSxvdGhWYWx1ZT1vdGhlcltrZXldO2lmKGN1c3RvbWl6ZXIpdmFyIGNvbXBhcmVkPWlzUGFydGlhbD9jdXN0b21pemVyKG90aFZhbHVlLG9ialZhbHVlLGtleSxvdGhlcixvYmplY3Qsc3RhY2spOmN1c3RvbWl6ZXIob2JqVmFsdWUsb3RoVmFsdWUsa2V5LG9iamVjdCxvdGhlcixzdGFjayk7aWYoIShjb21wYXJlZD09PXVuZGVmaW5lZD9vYmpWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMob2JqVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKTpjb21wYXJlZCkpe3Jlc3VsdD1mYWxzZTticmVha31za2lwQ3Rvcnx8KHNraXBDdG9yPWtleT09ImNvbnN0cnVjdG9yIil9aWYocmVzdWx0JiYhc2tpcEN0b3Ipe3ZhciBvYmpDdG9yPW9iamVjdC5jb25zdHJ1Y3RvcixvdGhDdG9yPW90aGVyLmNvbnN0cnVjdG9yO2lmKG9iakN0b3IhPW90aEN0b3ImJigiY29uc3RydWN0b3IiaW4gb2JqZWN0JiYiY29uc3RydWN0b3IiaW4Kb3RoZXIpJiYhKHR5cGVvZiBvYmpDdG9yPT0iZnVuY3Rpb24iJiZvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciYmdHlwZW9mIG90aEN0b3I9PSJmdW5jdGlvbiImJm90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSlyZXN1bHQ9ZmFsc2V9c3RhY2tbImRlbGV0ZSJdKG9iamVjdCk7c3RhY2tbImRlbGV0ZSJdKG90aGVyKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpe3JldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLHVuZGVmaW5lZCxmbGF0dGVuKSxmdW5jKyIiKX1mdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCl7cmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzLGdldFN5bWJvbHMpfWZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3Qpe3JldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3Qsa2V5c0luLGdldFN5bWJvbHNJbil9dmFyIGdldERhdGE9IW1ldGFNYXA/bm9vcDpmdW5jdGlvbihmdW5jKXtyZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyl9OwpmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKXt2YXIgcmVzdWx0PWZ1bmMubmFtZSsiIixhcnJheT1yZWFsTmFtZXNbcmVzdWx0XSxsZW5ndGg9aGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMscmVzdWx0KT9hcnJheS5sZW5ndGg6MDt3aGlsZShsZW5ndGgtLSl7dmFyIGRhdGE9YXJyYXlbbGVuZ3RoXSxvdGhlckZ1bmM9ZGF0YS5mdW5jO2lmKG90aGVyRnVuYz09bnVsbHx8b3RoZXJGdW5jPT1mdW5jKXJldHVybiBkYXRhLm5hbWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBnZXRIb2xkZXIoZnVuYyl7dmFyIG9iamVjdD1oYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaCwicGxhY2Vob2xkZXIiKT9sb2Rhc2g6ZnVuYztyZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyfWZ1bmN0aW9uIGdldEl0ZXJhdGVlKCl7dmFyIHJlc3VsdD1sb2Rhc2guaXRlcmF0ZWV8fGl0ZXJhdGVlO3Jlc3VsdD1yZXN1bHQ9PT1pdGVyYXRlZT9iYXNlSXRlcmF0ZWU6cmVzdWx0O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPwpyZXN1bHQoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6cmVzdWx0fWZ1bmN0aW9uIGdldE1hcERhdGEobWFwLGtleSl7dmFyIGRhdGE9bWFwLl9fZGF0YV9fO3JldHVybiBpc0tleWFibGUoa2V5KT9kYXRhW3R5cGVvZiBrZXk9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06ZGF0YS5tYXB9ZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCl7dmFyIHJlc3VsdD1rZXlzKG9iamVjdCksbGVuZ3RoPXJlc3VsdC5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cmVzdWx0W2xlbmd0aF0sdmFsdWU9b2JqZWN0W2tleV07cmVzdWx0W2xlbmd0aF09W2tleSx2YWx1ZSxpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3Qsa2V5KXt2YXIgdmFsdWU9Z2V0VmFsdWUob2JqZWN0LGtleSk7cmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk/dmFsdWU6dW5kZWZpbmVkfWZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSl7dmFyIGlzT3duPQpoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLHN5bVRvU3RyaW5nVGFnKSx0YWc9dmFsdWVbc3ltVG9TdHJpbmdUYWddO3RyeXt2YWx1ZVtzeW1Ub1N0cmluZ1RhZ109dW5kZWZpbmVkO3ZhciB1bm1hc2tlZD10cnVlfWNhdGNoKGUpe312YXIgcmVzdWx0PW5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO2lmKHVubWFza2VkKWlmKGlzT3duKXZhbHVlW3N5bVRvU3RyaW5nVGFnXT10YWc7ZWxzZSBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO3JldHVybiByZXN1bHR9dmFyIGdldFN5bWJvbHM9IW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7aWYob2JqZWN0PT1udWxsKXJldHVybltdO29iamVjdD1PYmplY3Qob2JqZWN0KTtyZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLGZ1bmN0aW9uKHN5bWJvbCl7cmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LHN5bWJvbCl9KX07dmFyIGdldFN5bWJvbHNJbj0KIW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7dmFyIHJlc3VsdD1bXTt3aGlsZShvYmplY3Qpe2FycmF5UHVzaChyZXN1bHQsZ2V0U3ltYm9scyhvYmplY3QpKTtvYmplY3Q9Z2V0UHJvdG90eXBlKG9iamVjdCl9cmV0dXJuIHJlc3VsdH07dmFyIGdldFRhZz1iYXNlR2V0VGFnO2lmKERhdGFWaWV3JiZnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1kYXRhVmlld1RhZ3x8TWFwJiZnZXRUYWcobmV3IE1hcCkhPW1hcFRhZ3x8UHJvbWlzZSYmZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSE9cHJvbWlzZVRhZ3x8U2V0JiZnZXRUYWcobmV3IFNldCkhPXNldFRhZ3x8V2Vha01hcCYmZ2V0VGFnKG5ldyBXZWFrTWFwKSE9d2Vha01hcFRhZylnZXRUYWc9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9YmFzZUdldFRhZyh2YWx1ZSksQ3Rvcj1yZXN1bHQ9PW9iamVjdFRhZz92YWx1ZS5jb25zdHJ1Y3Rvcjp1bmRlZmluZWQsY3RvclN0cmluZz0KQ3Rvcj90b1NvdXJjZShDdG9yKToiIjtpZihjdG9yU3RyaW5nKXN3aXRjaChjdG9yU3RyaW5nKXtjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzpyZXR1cm4gZGF0YVZpZXdUYWc7Y2FzZSBtYXBDdG9yU3RyaW5nOnJldHVybiBtYXBUYWc7Y2FzZSBwcm9taXNlQ3RvclN0cmluZzpyZXR1cm4gcHJvbWlzZVRhZztjYXNlIHNldEN0b3JTdHJpbmc6cmV0dXJuIHNldFRhZztjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOnJldHVybiB3ZWFrTWFwVGFnfXJldHVybiByZXN1bHR9O2Z1bmN0aW9uIGdldFZpZXcoc3RhcnQsZW5kLHRyYW5zZm9ybXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dHJhbnNmb3Jtcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBkYXRhPXRyYW5zZm9ybXNbaW5kZXhdLHNpemU9ZGF0YS5zaXplO3N3aXRjaChkYXRhLnR5cGUpe2Nhc2UgImRyb3AiOnN0YXJ0Kz1zaXplO2JyZWFrO2Nhc2UgImRyb3BSaWdodCI6ZW5kLT1zaXplO2JyZWFrO2Nhc2UgInRha2UiOmVuZD1uYXRpdmVNaW4oZW5kLApzdGFydCtzaXplKTticmVhaztjYXNlICJ0YWtlUmlnaHQiOnN0YXJ0PW5hdGl2ZU1heChzdGFydCxlbmQtc2l6ZSk7YnJlYWt9fXJldHVybnsic3RhcnQiOnN0YXJ0LCJlbmQiOmVuZH19ZnVuY3Rpb24gZ2V0V3JhcERldGFpbHMoc291cmNlKXt2YXIgbWF0Y2g9c291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO3JldHVybiBtYXRjaD9tYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscyk6W119ZnVuY3Rpb24gaGFzUGF0aChvYmplY3QscGF0aCxoYXNGdW5jKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLHJlc3VsdD1mYWxzZTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGtleT10b0tleShwYXRoW2luZGV4XSk7aWYoIShyZXN1bHQ9b2JqZWN0IT1udWxsJiZoYXNGdW5jKG9iamVjdCxrZXkpKSlicmVhaztvYmplY3Q9b2JqZWN0W2tleV19aWYocmVzdWx0fHwrK2luZGV4IT1sZW5ndGgpcmV0dXJuIHJlc3VsdDtsZW5ndGg9Cm9iamVjdD09bnVsbD8wOm9iamVjdC5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmlzTGVuZ3RoKGxlbmd0aCkmJmlzSW5kZXgoa2V5LGxlbmd0aCkmJihpc0FycmF5KG9iamVjdCl8fGlzQXJndW1lbnRzKG9iamVjdCkpfWZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9bmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7aWYobGVuZ3RoJiZ0eXBlb2YgYXJyYXlbMF09PSJzdHJpbmciJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCJpbmRleCIpKXtyZXN1bHQuaW5kZXg9YXJyYXkuaW5kZXg7cmVzdWx0LmlucHV0PWFycmF5LmlucHV0fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCl7cmV0dXJuIHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFpc1Byb3RvdHlwZShvYmplY3QpP2Jhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpOnt9fWZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwKdGFnLGlzRGVlcCl7dmFyIEN0b3I9b2JqZWN0LmNvbnN0cnVjdG9yO3N3aXRjaCh0YWcpe2Nhc2UgYXJyYXlCdWZmZXJUYWc6cmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOnJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtjYXNlIGRhdGFWaWV3VGFnOnJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCxpc0RlZXApO2Nhc2UgZmxvYXQzMlRhZzpjYXNlIGZsb2F0NjRUYWc6Y2FzZSBpbnQ4VGFnOmNhc2UgaW50MTZUYWc6Y2FzZSBpbnQzMlRhZzpjYXNlIHVpbnQ4VGFnOmNhc2UgdWludDhDbGFtcGVkVGFnOmNhc2UgdWludDE2VGFnOmNhc2UgdWludDMyVGFnOnJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LGlzRGVlcCk7Y2FzZSBtYXBUYWc6cmV0dXJuIG5ldyBDdG9yO2Nhc2UgbnVtYmVyVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBuZXcgQ3RvcihvYmplY3QpO2Nhc2UgcmVnZXhwVGFnOnJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpOwpjYXNlIHNldFRhZzpyZXR1cm4gbmV3IEN0b3I7Y2FzZSBzeW1ib2xUYWc6cmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCl9fWZ1bmN0aW9uIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSxkZXRhaWxzKXt2YXIgbGVuZ3RoPWRldGFpbHMubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuIHNvdXJjZTt2YXIgbGFzdEluZGV4PWxlbmd0aC0xO2RldGFpbHNbbGFzdEluZGV4XT0obGVuZ3RoPjE/Ilx4MjYgIjoiIikrZGV0YWlsc1tsYXN0SW5kZXhdO2RldGFpbHM9ZGV0YWlscy5qb2luKGxlbmd0aD4yPyIsICI6IiAiKTtyZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwie1xuLyogW3dyYXBwZWQgd2l0aCAiK2RldGFpbHMrIl0gKi9cbiIpfWZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpe3JldHVybiBpc0FycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpfHwhIShzcHJlYWRhYmxlU3ltYm9sJiZ2YWx1ZSYmdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pfWZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsCmxlbmd0aCl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO2xlbmd0aD1sZW5ndGg9PW51bGw/TUFYX1NBRkVfSU5URUdFUjpsZW5ndGg7cmV0dXJuISFsZW5ndGgmJih0eXBlPT0ibnVtYmVyInx8dHlwZSE9InN5bWJvbCImJnJlSXNVaW50LnRlc3QodmFsdWUpKSYmKHZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTxsZW5ndGgpfWZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLGluZGV4LG9iamVjdCl7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIGZhbHNlO3ZhciB0eXBlPXR5cGVvZiBpbmRleDtpZih0eXBlPT0ibnVtYmVyIj9pc0FycmF5TGlrZShvYmplY3QpJiZpc0luZGV4KGluZGV4LG9iamVjdC5sZW5ndGgpOnR5cGU9PSJzdHJpbmciJiZpbmRleCBpbiBvYmplY3QpcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sdmFsdWUpO3JldHVybiBmYWxzZX1mdW5jdGlvbiBpc0tleSh2YWx1ZSxvYmplY3Qpe2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdHlwZT10eXBlb2YgdmFsdWU7CmlmKHR5cGU9PSJudW1iZXIifHx0eXBlPT0ic3ltYm9sInx8dHlwZT09ImJvb2xlYW4ifHx2YWx1ZT09bnVsbHx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB0cnVlO3JldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpfHwhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpfHxvYmplY3QhPW51bGwmJnZhbHVlIGluIE9iamVjdChvYmplY3QpfWZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB0eXBlPT0ic3RyaW5nInx8dHlwZT09Im51bWJlciJ8fHR5cGU9PSJzeW1ib2wifHx0eXBlPT0iYm9vbGVhbiI/dmFsdWUhPT0iX19wcm90b19fIjp2YWx1ZT09PW51bGx9ZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKXt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksb3RoZXI9bG9kYXNoW2Z1bmNOYW1lXTtpZih0eXBlb2Ygb3RoZXIhPSJmdW5jdGlvbiJ8fCEoZnVuY05hbWUgaW4gTGF6eVdyYXBwZXIucHJvdG90eXBlKSlyZXR1cm4gZmFsc2U7CmlmKGZ1bmM9PT1vdGhlcilyZXR1cm4gdHJ1ZTt2YXIgZGF0YT1nZXREYXRhKG90aGVyKTtyZXR1cm4hIWRhdGEmJmZ1bmM9PT1kYXRhWzBdfWZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpe3JldHVybiEhbWFza1NyY0tleSYmbWFza1NyY0tleSBpbiBmdW5jfXZhciBpc01hc2thYmxlPWNvcmVKc0RhdGE/aXNGdW5jdGlvbjpzdHViRmFsc2U7ZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpe3ZhciBDdG9yPXZhbHVlJiZ2YWx1ZS5jb25zdHJ1Y3Rvcixwcm90bz10eXBlb2YgQ3Rvcj09ImZ1bmN0aW9uIiYmQ3Rvci5wcm90b3R5cGV8fG9iamVjdFByb3RvO3JldHVybiB2YWx1ZT09PXByb3RvfWZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dmFsdWUmJiFpc09iamVjdCh2YWx1ZSl9ZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LHNyY1ZhbHVlKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtpZihvYmplY3Q9PW51bGwpcmV0dXJuIGZhbHNlOwpyZXR1cm4gb2JqZWN0W2tleV09PT1zcmNWYWx1ZSYmKHNyY1ZhbHVlIT09dW5kZWZpbmVkfHxrZXkgaW4gT2JqZWN0KG9iamVjdCkpfX1mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpe3ZhciByZXN1bHQ9bWVtb2l6ZShmdW5jLGZ1bmN0aW9uKGtleSl7aWYoY2FjaGUuc2l6ZT09PU1BWF9NRU1PSVpFX1NJWkUpY2FjaGUuY2xlYXIoKTtyZXR1cm4ga2V5fSk7dmFyIGNhY2hlPXJlc3VsdC5jYWNoZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLHNvdXJjZSl7dmFyIGJpdG1hc2s9ZGF0YVsxXSxzcmNCaXRtYXNrPXNvdXJjZVsxXSxuZXdCaXRtYXNrPWJpdG1hc2t8c3JjQml0bWFzayxpc0NvbW1vbj1uZXdCaXRtYXNrPChXUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUd8V1JBUF9BUllfRkxBRyk7dmFyIGlzQ29tYm89c3JjQml0bWFzaz09V1JBUF9BUllfRkxBRyYmYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxzcmNCaXRtYXNrPT1XUkFQX0FSWV9GTEFHJiYKYml0bWFzaz09V1JBUF9SRUFSR19GTEFHJiZkYXRhWzddLmxlbmd0aDw9c291cmNlWzhdfHxzcmNCaXRtYXNrPT0oV1JBUF9BUllfRkxBR3xXUkFQX1JFQVJHX0ZMQUcpJiZzb3VyY2VbN10ubGVuZ3RoPD1zb3VyY2VbOF0mJmJpdG1hc2s9PVdSQVBfQ1VSUllfRkxBRztpZighKGlzQ29tbW9ufHxpc0NvbWJvKSlyZXR1cm4gZGF0YTtpZihzcmNCaXRtYXNrJldSQVBfQklORF9GTEFHKXtkYXRhWzJdPXNvdXJjZVsyXTtuZXdCaXRtYXNrfD1iaXRtYXNrJldSQVBfQklORF9GTEFHPzA6V1JBUF9DVVJSWV9CT1VORF9GTEFHfXZhciB2YWx1ZT1zb3VyY2VbM107aWYodmFsdWUpe3ZhciBwYXJ0aWFscz1kYXRhWzNdO2RhdGFbM109cGFydGlhbHM/Y29tcG9zZUFyZ3MocGFydGlhbHMsdmFsdWUsc291cmNlWzRdKTp2YWx1ZTtkYXRhWzRdPXBhcnRpYWxzP3JlcGxhY2VIb2xkZXJzKGRhdGFbM10sUExBQ0VIT0xERVIpOnNvdXJjZVs0XX12YWx1ZT1zb3VyY2VbNV07aWYodmFsdWUpe3BhcnRpYWxzPQpkYXRhWzVdO2RhdGFbNV09cGFydGlhbHM/Y29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscyx2YWx1ZSxzb3VyY2VbNl0pOnZhbHVlO2RhdGFbNl09cGFydGlhbHM/cmVwbGFjZUhvbGRlcnMoZGF0YVs1XSxQTEFDRUhPTERFUik6c291cmNlWzZdfXZhbHVlPXNvdXJjZVs3XTtpZih2YWx1ZSlkYXRhWzddPXZhbHVlO2lmKHNyY0JpdG1hc2smV1JBUF9BUllfRkxBRylkYXRhWzhdPWRhdGFbOF09PW51bGw/c291cmNlWzhdOm5hdGl2ZU1pbihkYXRhWzhdLHNvdXJjZVs4XSk7aWYoZGF0YVs5XT09bnVsbClkYXRhWzldPXNvdXJjZVs5XTtkYXRhWzBdPXNvdXJjZVswXTtkYXRhWzFdPW5ld0JpdG1hc2s7cmV0dXJuIGRhdGF9ZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCl7dmFyIHJlc3VsdD1bXTtpZihvYmplY3QhPW51bGwpZm9yKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKXtyZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSl9CmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsc3RhcnQsdHJhbnNmb3JtKXtzdGFydD1uYXRpdmVNYXgoc3RhcnQ9PT11bmRlZmluZWQ/ZnVuYy5sZW5ndGgtMTpzdGFydCwwKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChhcmdzLmxlbmd0aC1zdGFydCwwKSxhcnJheT1BcnJheShsZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFycmF5W2luZGV4XT1hcmdzW3N0YXJ0K2luZGV4XTtpbmRleD0tMTt2YXIgb3RoZXJBcmdzPUFycmF5KHN0YXJ0KzEpO3doaWxlKCsraW5kZXg8c3RhcnQpb3RoZXJBcmdzW2luZGV4XT1hcmdzW2luZGV4XTtvdGhlckFyZ3Nbc3RhcnRdPXRyYW5zZm9ybShhcnJheSk7cmV0dXJuIGFwcGx5KGZ1bmMsdGhpcyxvdGhlckFyZ3MpfX1mdW5jdGlvbiBwYXJlbnQob2JqZWN0LHBhdGgpe3JldHVybiBwYXRoLmxlbmd0aDwyP29iamVjdDpiYXNlR2V0KG9iamVjdCxiYXNlU2xpY2UocGF0aCwwLC0xKSl9CmZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksaW5kZXhlcyl7dmFyIGFyckxlbmd0aD1hcnJheS5sZW5ndGgsbGVuZ3RoPW5hdGl2ZU1pbihpbmRleGVzLmxlbmd0aCxhcnJMZW5ndGgpLG9sZEFycmF5PWNvcHlBcnJheShhcnJheSk7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07YXJyYXlbbGVuZ3RoXT1pc0luZGV4KGluZGV4LGFyckxlbmd0aCk/b2xkQXJyYXlbaW5kZXhdOnVuZGVmaW5lZH1yZXR1cm4gYXJyYXl9dmFyIHNldERhdGE9c2hvcnRPdXQoYmFzZVNldERhdGEpO3ZhciBzZXRUaW1lb3V0PWN0eFNldFRpbWVvdXR8fGZ1bmN0aW9uKGZ1bmMsd2FpdCl7cmV0dXJuIHJvb3Quc2V0VGltZW91dChmdW5jLHdhaXQpfTt2YXIgc2V0VG9TdHJpbmc9c2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlcixyZWZlcmVuY2UsYml0bWFzayl7dmFyIHNvdXJjZT1yZWZlcmVuY2UrIiI7cmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsCmluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSx1cGRhdGVXcmFwRGV0YWlscyhnZXRXcmFwRGV0YWlscyhzb3VyY2UpLGJpdG1hc2spKSl9ZnVuY3Rpb24gc2hvcnRPdXQoZnVuYyl7dmFyIGNvdW50PTAsbGFzdENhbGxlZD0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBzdGFtcD1uYXRpdmVOb3coKSxyZW1haW5pbmc9SE9UX1NQQU4tKHN0YW1wLWxhc3RDYWxsZWQpO2xhc3RDYWxsZWQ9c3RhbXA7aWYocmVtYWluaW5nPjApe2lmKCsrY291bnQ+PUhPVF9DT1VOVClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgY291bnQ9MDtyZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsYXJndW1lbnRzKX19ZnVuY3Rpb24gc2h1ZmZsZVNlbGYoYXJyYXksc2l6ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgsbGFzdEluZGV4PWxlbmd0aC0xO3NpemU9c2l6ZT09PXVuZGVmaW5lZD9sZW5ndGg6c2l6ZTt3aGlsZSgrK2luZGV4PHNpemUpe3ZhciByYW5kPWJhc2VSYW5kb20oaW5kZXgsbGFzdEluZGV4KSwKdmFsdWU9YXJyYXlbcmFuZF07YXJyYXlbcmFuZF09YXJyYXlbaW5kZXhdO2FycmF5W2luZGV4XT12YWx1ZX1hcnJheS5sZW5ndGg9c2l6ZTtyZXR1cm4gYXJyYXl9dmFyIHN0cmluZ1RvUGF0aD1tZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZyl7dmFyIHJlc3VsdD1bXTtpZihzdHJpbmcuY2hhckNvZGVBdCgwKT09PTQ2KXJlc3VsdC5wdXNoKCIiKTtzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLGZ1bmN0aW9uKG1hdGNoLG51bWJlcixxdW90ZSxzdWJTdHJpbmcpe3Jlc3VsdC5wdXNoKHF1b3RlP3N1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwiJDEiKTpudW1iZXJ8fG1hdGNoKX0pO3JldHVybiByZXN1bHR9KTtmdW5jdGlvbiB0b0tleSh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nInx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTt2YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZPyItMCI6cmVzdWx0fQpmdW5jdGlvbiB0b1NvdXJjZShmdW5jKXtpZihmdW5jIT1udWxsKXt0cnl7cmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpfWNhdGNoKGUpe310cnl7cmV0dXJuIGZ1bmMrIiJ9Y2F0Y2goZSQwKXt9fXJldHVybiIifWZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsYml0bWFzayl7YXJyYXlFYWNoKHdyYXBGbGFncyxmdW5jdGlvbihwYWlyKXt2YXIgdmFsdWU9Il8uIitwYWlyWzBdO2lmKGJpdG1hc2smcGFpclsxXSYmIWFycmF5SW5jbHVkZXMoZGV0YWlscyx2YWx1ZSkpZGV0YWlscy5wdXNoKHZhbHVlKX0pO3JldHVybiBkZXRhaWxzLnNvcnQoKX1mdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcil7aWYod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKXJldHVybiB3cmFwcGVyLmNsb25lKCk7dmFyIHJlc3VsdD1uZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLHdyYXBwZXIuX19jaGFpbl9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pOwpyZXN1bHQuX19pbmRleF9fPXdyYXBwZXIuX19pbmRleF9fO3Jlc3VsdC5fX3ZhbHVlc19fPXdyYXBwZXIuX192YWx1ZXNfXztyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNodW5rKGFycmF5LHNpemUsZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGFycmF5LHNpemUsZ3VhcmQpOnNpemU9PT11bmRlZmluZWQpc2l6ZT0xO2Vsc2Ugc2l6ZT1uYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLDApO3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aHx8c2l6ZTwxKXJldHVybltdO3ZhciBpbmRleD0wLHJlc0luZGV4PTAscmVzdWx0PUFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoL3NpemUpKTt3aGlsZShpbmRleDxsZW5ndGgpcmVzdWx0W3Jlc0luZGV4KytdPWJhc2VTbGljZShhcnJheSxpbmRleCxpbmRleCs9c2l6ZSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb21wYWN0KGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLApyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZSlyZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb25jYXQoKXt2YXIgbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTt2YXIgYXJncz1BcnJheShsZW5ndGgtMSksYXJyYXk9YXJndW1lbnRzWzBdLGluZGV4PWxlbmd0aDt3aGlsZShpbmRleC0tKWFyZ3NbaW5kZXgtMV09YXJndW1lbnRzW2luZGV4XTtyZXR1cm4gYXJyYXlQdXNoKGlzQXJyYXkoYXJyYXkpP2NvcHlBcnJheShhcnJheSk6W2FycmF5XSxiYXNlRmxhdHRlbihhcmdzLDEpKX12YXIgZGlmZmVyZW5jZT1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSk/YmFzZURpZmZlcmVuY2UoYXJyYXksYmFzZUZsYXR0ZW4odmFsdWVzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpOgpbXX0pO3ZhciBkaWZmZXJlbmNlQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgaXRlcmF0ZWU9bGFzdCh2YWx1ZXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgZGlmZmVyZW5jZVdpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgY29tcGFyYXRvcj1sYXN0KHZhbHVlcyk7aWYoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpY29tcGFyYXRvcj11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gZHJvcChhcnJheSxuLGd1YXJkKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LG48MD8wOm4sbGVuZ3RoKX1mdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksbixndWFyZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO249Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7bj1sZW5ndGgtbjtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLHRydWUsdHJ1ZSk6W119ZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiYKYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksdHJ1ZSk6W119ZnVuY3Rpb24gZmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihzdGFydCYmdHlwZW9mIHN0YXJ0IT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoYXJyYXksdmFsdWUsc3RhcnQpKXtzdGFydD0wO2VuZD1sZW5ndGh9cmV0dXJuIGJhc2VGaWxsKGFycmF5LHZhbHVlLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9ZnJvbUluZGV4PT1udWxsPzA6dG9JbnRlZ2VyKGZyb21JbmRleCk7aWYoaW5kZXg8MClpbmRleD1uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApO3JldHVybiBiYXNlRmluZEluZGV4KGFycmF5LApnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgpfWZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1sZW5ndGgtMTtpZihmcm9tSW5kZXghPT11bmRlZmluZWQpe2luZGV4PXRvSW50ZWdlcihmcm9tSW5kZXgpO2luZGV4PWZyb21JbmRleDwwP25hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk6bmF0aXZlTWluKGluZGV4LGxlbmd0aC0xKX1yZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgsdHJ1ZSl9ZnVuY3Rpb24gZmxhdHRlbihhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LDEpOltdfWZ1bmN0aW9uIGZsYXR0ZW5EZWVwKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoOwpyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LElORklOSVRZKTpbXX1mdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksZGVwdGgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtkZXB0aD1kZXB0aD09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihkZXB0aCk7cmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LGRlcHRoKX1mdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGFpcj1wYWlyc1tpbmRleF07cmVzdWx0W3BhaXJbMF1dPXBhaXJbMV19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBoZWFkKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9hcnJheVswXTp1bmRlZmluZWR9ZnVuY3Rpb24gaW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PQpudWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuLTE7dmFyIGluZGV4PWZyb21JbmRleD09bnVsbD8wOnRvSW50ZWdlcihmcm9tSW5kZXgpO2lmKGluZGV4PDApaW5kZXg9bmF0aXZlTWF4KGxlbmd0aCtpbmRleCwwKTtyZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpfWZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMCwtMSk6W119dmFyIGludGVyc2VjdGlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO3JldHVybiBtYXBwZWQubGVuZ3RoJiZtYXBwZWRbMF09PT1hcnJheXNbMF0/YmFzZUludGVyc2VjdGlvbihtYXBwZWQpOltdfSk7dmFyIGludGVyc2VjdGlvbkJ5PWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGl0ZXJhdGVlPWxhc3QoYXJyYXlzKSwKbWFwcGVkPWFycmF5TWFwKGFycmF5cyxjYXN0QXJyYXlMaWtlT2JqZWN0KTtpZihpdGVyYXRlZT09PWxhc3QobWFwcGVkKSlpdGVyYXRlZT11bmRlZmluZWQ7ZWxzZSBtYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgaW50ZXJzZWN0aW9uV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKSxtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PSJmdW5jdGlvbiI/Y29tcGFyYXRvcjp1bmRlZmluZWQ7aWYoY29tcGFyYXRvciltYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gam9pbihhcnJheSxzZXBhcmF0b3Ipe3JldHVybiBhcnJheT09bnVsbD8iIjpuYXRpdmVKb2luLmNhbGwoYXJyYXksc2VwYXJhdG9yKX1mdW5jdGlvbiBsYXN0KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YXJyYXlbbGVuZ3RoLTFdOnVuZGVmaW5lZH1mdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9bGVuZ3RoO2lmKGZyb21JbmRleCE9PXVuZGVmaW5lZCl7aW5kZXg9dG9JbnRlZ2VyKGZyb21JbmRleCk7aW5kZXg9aW5kZXg8MD9uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApOm5hdGl2ZU1pbihpbmRleCxsZW5ndGgtMSl9cmV0dXJuIHZhbHVlPT09dmFsdWU/c3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpOmJhc2VGaW5kSW5kZXgoYXJyYXksCmJhc2VJc05hTixpbmRleCx0cnVlKX1mdW5jdGlvbiBudGgoYXJyYXksbil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZU50aChhcnJheSx0b0ludGVnZXIobikpOnVuZGVmaW5lZH12YXIgcHVsbD1iYXNlUmVzdChwdWxsQWxsKTtmdW5jdGlvbiBwdWxsQWxsKGFycmF5LHZhbHVlcyl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMpOmFycmF5fWZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoJiZ2YWx1ZXMmJnZhbHVlcy5sZW5ndGg/YmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTphcnJheX1mdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSx2YWx1ZXMsY29tcGFyYXRvcil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSwKdmFsdWVzLHVuZGVmaW5lZCxjb21wYXJhdG9yKTphcnJheX12YXIgcHVsbEF0PWZsYXRSZXN0KGZ1bmN0aW9uKGFycmF5LGluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PWJhc2VBdChhcnJheSxpbmRleGVzKTtiYXNlUHVsbEF0KGFycmF5LGFycmF5TWFwKGluZGV4ZXMsZnVuY3Rpb24oaW5kZXgpe3JldHVybiBpc0luZGV4KGluZGV4LGxlbmd0aCk/K2luZGV4OmluZGV4fSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIHJlbW92ZShhcnJheSxwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm4gcmVzdWx0O3ZhciBpbmRleD0tMSxpbmRleGVzPVtdLGxlbmd0aD1hcnJheS5sZW5ndGg7cHJlZGljYXRlPWdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsCmluZGV4LGFycmF5KSl7cmVzdWx0LnB1c2godmFsdWUpO2luZGV4ZXMucHVzaChpbmRleCl9fWJhc2VQdWxsQXQoYXJyYXksaW5kZXhlcyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiByZXZlcnNlKGFycmF5KXtyZXR1cm4gYXJyYXk9PW51bGw/YXJyYXk6bmF0aXZlUmV2ZXJzZS5jYWxsKGFycmF5KX1mdW5jdGlvbiBzbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihlbmQmJnR5cGVvZiBlbmQhPSJudW1iZXIiJiZpc0l0ZXJhdGVlQ2FsbChhcnJheSxzdGFydCxlbmQpKXtzdGFydD0wO2VuZD1sZW5ndGh9ZWxzZXtzdGFydD1zdGFydD09bnVsbD8wOnRvSW50ZWdlcihzdGFydCk7ZW5kPWVuZD09PXVuZGVmaW5lZD9sZW5ndGg6dG9JbnRlZ2VyKGVuZCl9cmV0dXJuIGJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfWZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LHZhbHVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LAp2YWx1ZSl9ZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX1mdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LHZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGxlbmd0aCl7dmFyIGluZGV4PWJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSk7aWYoaW5kZXg8bGVuZ3RoJiZlcShhcnJheVtpbmRleF0sdmFsdWUpKXJldHVybiBpbmRleH1yZXR1cm4tMX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksdmFsdWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUsdHJ1ZSl9ZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSx0cnVlKX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwKdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYobGVuZ3RoKXt2YXIgaW5kZXg9YmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlLHRydWUpLTE7aWYoZXEoYXJyYXlbaW5kZXhdLHZhbHVlKSlyZXR1cm4gaW5kZXh9cmV0dXJuLTF9ZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXkpOltdfWZ1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdfWZ1bmN0aW9uIHRhaWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMSxsZW5ndGgpOltdfWZ1bmN0aW9uIHRha2UoYXJyYXksbixndWFyZCl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTsKbj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gdGFrZVJpZ2h0KGFycmF5LG4sZ3VhcmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO249bGVuZ3RoLW47cmV0dXJuIGJhc2VTbGljZShhcnJheSxuPDA/MDpuLGxlbmd0aCl9ZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGZhbHNlLHRydWUpOltdfWZ1bmN0aW9uIHRha2VXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpOltdfXZhciB1bmlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3JldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsCjEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpfSk7dmFyIHVuaW9uQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX0pO3ZhciB1bmlvbldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSksdW5kZWZpbmVkLGNvbXBhcmF0b3IpfSk7ZnVuY3Rpb24gdW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVVuaXEoYXJyYXkpOgpbXX1mdW5jdGlvbiB1bmlxQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX1mdW5jdGlvbiB1bmlxV2l0aChhcnJheSxjb21wYXJhdG9yKXtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LHVuZGVmaW5lZCxjb21wYXJhdG9yKTpbXX1mdW5jdGlvbiB1bnppcChhcnJheSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgbGVuZ3RoPTA7YXJyYXk9YXJyYXlGaWx0ZXIoYXJyYXksZnVuY3Rpb24oZ3JvdXApe2lmKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSl7bGVuZ3RoPW5hdGl2ZU1heChncm91cC5sZW5ndGgsbGVuZ3RoKTtyZXR1cm4gdHJ1ZX19KTtyZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCxmdW5jdGlvbihpbmRleCl7cmV0dXJuIGFycmF5TWFwKGFycmF5LApiYXNlUHJvcGVydHkoaW5kZXgpKX0pfWZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSxpdGVyYXRlZSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgcmVzdWx0PXVuemlwKGFycmF5KTtpZihpdGVyYXRlZT09bnVsbClyZXR1cm4gcmVzdWx0O3JldHVybiBhcnJheU1hcChyZXN1bHQsZnVuY3Rpb24oZ3JvdXApe3JldHVybiBhcHBseShpdGVyYXRlZSx1bmRlZmluZWQsZ3JvdXApfSl9dmFyIHdpdGhvdXQ9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LHZhbHVlcyk6W119KTt2YXIgeG9yPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7cmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLGlzQXJyYXlMaWtlT2JqZWN0KSl9KTt2YXIgeG9yQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT0KdW5kZWZpbmVkO3JldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cyxpc0FycmF5TGlrZU9iamVjdCksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfSk7dmFyIHhvcldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsaXNBcnJheUxpa2VPYmplY3QpLHVuZGVmaW5lZCxjb21wYXJhdG9yKX0pO3ZhciB6aXA9YmFzZVJlc3QodW56aXApO2Z1bmN0aW9uIHppcE9iamVjdChwcm9wcyx2YWx1ZXMpe3JldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzfHxbXSx2YWx1ZXN8fFtdLGFzc2lnblZhbHVlKX1mdW5jdGlvbiB6aXBPYmplY3REZWVwKHByb3BzLHZhbHVlcyl7cmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHN8fFtdLHZhbHVlc3x8W10sYmFzZVNldCl9dmFyIHppcFdpdGg9CmJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGxlbmd0aD1hcnJheXMubGVuZ3RoLGl0ZXJhdGVlPWxlbmd0aD4xP2FycmF5c1tsZW5ndGgtMV06dW5kZWZpbmVkO2l0ZXJhdGVlPXR5cGVvZiBpdGVyYXRlZT09ImZ1bmN0aW9uIj8oYXJyYXlzLnBvcCgpLGl0ZXJhdGVlKTp1bmRlZmluZWQ7cmV0dXJuIHVuemlwV2l0aChhcnJheXMsaXRlcmF0ZWUpfSk7ZnVuY3Rpb24gY2hhaW4odmFsdWUpe3ZhciByZXN1bHQ9bG9kYXNoKHZhbHVlKTtyZXN1bHQuX19jaGFpbl9fPXRydWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0YXAodmFsdWUsaW50ZXJjZXB0b3Ipe2ludGVyY2VwdG9yKHZhbHVlKTtyZXR1cm4gdmFsdWV9ZnVuY3Rpb24gdGhydSh2YWx1ZSxpbnRlcmNlcHRvcil7cmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKX12YXIgd3JhcHBlckF0PWZsYXRSZXN0KGZ1bmN0aW9uKHBhdGhzKXt2YXIgbGVuZ3RoPXBhdGhzLmxlbmd0aCxzdGFydD1sZW5ndGg/cGF0aHNbMF06MCx2YWx1ZT0KdGhpcy5fX3dyYXBwZWRfXyxpbnRlcmNlcHRvcj1mdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlQXQob2JqZWN0LHBhdGhzKX07aWYobGVuZ3RoPjF8fHRoaXMuX19hY3Rpb25zX18ubGVuZ3RofHwhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpfHwhaXNJbmRleChzdGFydCkpcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7dmFsdWU9dmFsdWUuc2xpY2Uoc3RhcnQsK3N0YXJ0KyhsZW5ndGg/MTowKSk7dmFsdWUuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybihuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSx0aGlzLl9fY2hhaW5fXykpLnRocnUoZnVuY3Rpb24oYXJyYXkpe2lmKGxlbmd0aCYmIWFycmF5Lmxlbmd0aClhcnJheS5wdXNoKHVuZGVmaW5lZCk7cmV0dXJuIGFycmF5fSl9KTtmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKXtyZXR1cm4gY2hhaW4odGhpcyl9ZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpe3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksCnRoaXMuX19jaGFpbl9fKX1mdW5jdGlvbiB3cmFwcGVyTmV4dCgpe2lmKHRoaXMuX192YWx1ZXNfXz09PXVuZGVmaW5lZCl0aGlzLl9fdmFsdWVzX189dG9BcnJheSh0aGlzLnZhbHVlKCkpO3ZhciBkb25lPXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoLHZhbHVlPWRvbmU/dW5kZWZpbmVkOnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXTtyZXR1cm57ImRvbmUiOmRvbmUsInZhbHVlIjp2YWx1ZX19ZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKXtyZXR1cm4gdGhpc31mdW5jdGlvbiB3cmFwcGVyUGxhbnQodmFsdWUpe3ZhciByZXN1bHQscGFyZW50PXRoaXM7d2hpbGUocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCl7dmFyIGNsb25lPXdyYXBwZXJDbG9uZShwYXJlbnQpO2Nsb25lLl9faW5kZXhfXz0wO2Nsb25lLl9fdmFsdWVzX189dW5kZWZpbmVkO2lmKHJlc3VsdClwcmV2aW91cy5fX3dyYXBwZWRfXz1jbG9uZTtlbHNlIHJlc3VsdD1jbG9uZTsKdmFyIHByZXZpb3VzPWNsb25lO3BhcmVudD1wYXJlbnQuX193cmFwcGVkX199cHJldmlvdXMuX193cmFwcGVkX189dmFsdWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpe3ZhciB2YWx1ZT10aGlzLl9fd3JhcHBlZF9fO2lmKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpe3ZhciB3cmFwcGVkPXZhbHVlO2lmKHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKXdyYXBwZWQ9bmV3IExhenlXcmFwcGVyKHRoaXMpO3dyYXBwZWQ9d3JhcHBlZC5yZXZlcnNlKCk7d3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHsiZnVuYyI6dGhydSwiYXJncyI6W3JldmVyc2VdLCJ0aGlzQXJnIjp1bmRlZmluZWR9KTtyZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlZCx0aGlzLl9fY2hhaW5fXyl9cmV0dXJuIHRoaXMudGhydShyZXZlcnNlKX1mdW5jdGlvbiB3cmFwcGVyVmFsdWUoKXtyZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfQp2YXIgY291bnRCeT1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LGtleSkpKytyZXN1bHRba2V5XTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LDEpfSk7ZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFdmVyeTpiYXNlRXZlcnk7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKSlwcmVkaWNhdGU9dW5kZWZpbmVkO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKX1mdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlGaWx0ZXI6YmFzZUZpbHRlcjtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSl9dmFyIGZpbmQ9CmNyZWF0ZUZpbmQoZmluZEluZGV4KTt2YXIgZmluZExhc3Q9Y3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3JldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbixpdGVyYXRlZSksMSl9ZnVuY3Rpb24gZmxhdE1hcERlZXAoY29sbGVjdGlvbixpdGVyYXRlZSl7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSxJTkZJTklUWSl9ZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24saXRlcmF0ZWUsZGVwdGgpe2RlcHRoPWRlcHRoPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKGRlcHRoKTtyZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpLGRlcHRoKX1mdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFYWNoOmJhc2VFYWNoO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpKX1mdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUVhY2hSaWdodDpiYXNlRWFjaFJpZ2h0O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfXZhciBncm91cEJ5PWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsa2V5KSlyZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LFt2YWx1ZV0pfSk7ZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbix2YWx1ZSxmcm9tSW5kZXgsZ3VhcmQpe2NvbGxlY3Rpb249aXNBcnJheUxpa2UoY29sbGVjdGlvbik/Y29sbGVjdGlvbjp2YWx1ZXMoY29sbGVjdGlvbik7ZnJvbUluZGV4PWZyb21JbmRleCYmIWd1YXJkP3RvSW50ZWdlcihmcm9tSW5kZXgpOjA7dmFyIGxlbmd0aD1jb2xsZWN0aW9uLmxlbmd0aDsKaWYoZnJvbUluZGV4PDApZnJvbUluZGV4PW5hdGl2ZU1heChsZW5ndGgrZnJvbUluZGV4LDApO3JldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKT9mcm9tSW5kZXg8PWxlbmd0aCYmY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLGZyb21JbmRleCk+LTE6ISFsZW5ndGgmJmJhc2VJbmRleE9mKGNvbGxlY3Rpb24sdmFsdWUsZnJvbUluZGV4KT4tMX12YXIgaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24scGF0aCxhcmdzKXt2YXIgaW5kZXg9LTEsaXNGdW5jPXR5cGVvZiBwYXRoPT0iZnVuY3Rpb24iLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPWlzRnVuYz9hcHBseShwYXRoLHZhbHVlLGFyZ3MpOmJhc2VJbnZva2UodmFsdWUscGF0aCxhcmdzKX0pO3JldHVybiByZXN1bHR9KTt2YXIga2V5Qnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsCnZhbHVlLGtleSl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksdmFsdWUpfSk7ZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlNYXA6YmFzZU1hcDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBvcmRlckJ5KGNvbGxlY3Rpb24saXRlcmF0ZWVzLG9yZGVycyxndWFyZCl7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm5bXTtpZighaXNBcnJheShpdGVyYXRlZXMpKWl0ZXJhdGVlcz1pdGVyYXRlZXM9PW51bGw/W106W2l0ZXJhdGVlc107b3JkZXJzPWd1YXJkP3VuZGVmaW5lZDpvcmRlcnM7aWYoIWlzQXJyYXkob3JkZXJzKSlvcmRlcnM9b3JkZXJzPT1udWxsP1tdOltvcmRlcnNdO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMpfXZhciBwYXJ0aXRpb249Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsCmtleSl7cmVzdWx0W2tleT8wOjFdLnB1c2godmFsdWUpfSxmdW5jdGlvbigpe3JldHVybltbXSxbXV19KTtmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVJlZHVjZTpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2gpfWZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlSZWR1Y2VSaWdodDpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2hSaWdodCl9ZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sCnByZWRpY2F0ZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUZpbHRlcjpiYXNlRmlsdGVyO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSkpfWZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlOmJhc2VTYW1wbGU7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbil9ZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4sZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sbixndWFyZCk6bj09PXVuZGVmaW5lZCluPTE7ZWxzZSBuPXRvSW50ZWdlcihuKTt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlU2l6ZTpiYXNlU2FtcGxlU2l6ZTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLG4pfWZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNodWZmbGU6CmJhc2VTaHVmZmxlO3JldHVybiBmdW5jKGNvbGxlY3Rpb24pfWZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbil7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm4gMDtpZihpc0FycmF5TGlrZShjb2xsZWN0aW9uKSlyZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbik/c3RyaW5nU2l6ZShjb2xsZWN0aW9uKTpjb2xsZWN0aW9uLmxlbmd0aDt2YXIgdGFnPWdldFRhZyhjb2xsZWN0aW9uKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtyZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RofWZ1bmN0aW9uIHNvbWUoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTb21lOmJhc2VTb21lO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCkpcHJlZGljYXRlPXVuZGVmaW5lZDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwKMykpfXZhciBzb3J0Qnk9YmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZXMpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuW107dmFyIGxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoO2lmKGxlbmd0aD4xJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLGl0ZXJhdGVlc1swXSxpdGVyYXRlZXNbMV0pKWl0ZXJhdGVlcz1bXTtlbHNlIGlmKGxlbmd0aD4yJiZpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0saXRlcmF0ZWVzWzFdLGl0ZXJhdGVlc1syXSkpaXRlcmF0ZWVzPVtpdGVyYXRlZXNbMF1dO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywxKSxbXSl9KTt2YXIgbm93PWN0eE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4gcm9vdC5EYXRlLm5vdygpfTtmdW5jdGlvbiBhZnRlcihuLGZ1bmMpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtuPXRvSW50ZWdlcihuKTsKcmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPDEpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBhcnkoZnVuYyxuLGd1YXJkKXtuPWd1YXJkP3VuZGVmaW5lZDpuO249ZnVuYyYmbj09bnVsbD9mdW5jLmxlbmd0aDpuO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9BUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsbil9ZnVuY3Rpb24gYmVmb3JlKG4sZnVuYyl7dmFyIHJlc3VsdDtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7bj10b0ludGVnZXIobik7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPjApcmVzdWx0PWZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG48PTEpZnVuYz11bmRlZmluZWQ7cmV0dXJuIHJlc3VsdH19dmFyIGJpbmQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyx0aGlzQXJnLHBhcnRpYWxzKXt2YXIgYml0bWFzaz1XUkFQX0JJTkRfRkxBRzsKaWYocGFydGlhbHMubGVuZ3RoKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIoYmluZCkpO2JpdG1hc2t8PVdSQVBfUEFSVElBTF9GTEFHfXJldHVybiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIGJpbmRLZXk9YmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LGtleSxwYXJ0aWFscyl7dmFyIGJpdG1hc2s9V1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHO2lmKHBhcnRpYWxzLmxlbmd0aCl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKGJpbmRLZXkpKTtiaXRtYXNrfD1XUkFQX1BBUlRJQUxfRkxBR31yZXR1cm4gY3JlYXRlV3JhcChrZXksYml0bWFzayxvYmplY3QscGFydGlhbHMsaG9sZGVycyl9KTtmdW5jdGlvbiBjdXJyeShmdW5jLGFyaXR5LGd1YXJkKXthcml0eT1ndWFyZD91bmRlZmluZWQ6YXJpdHk7dmFyIHJlc3VsdD1jcmVhdGVXcmFwKGZ1bmMsCldSQVBfQ1VSUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGFyaXR5KTtyZXN1bHQucGxhY2Vob2xkZXI9Y3VycnkucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsYXJpdHksZ3VhcmQpe2FyaXR5PWd1YXJkP3VuZGVmaW5lZDphcml0eTt2YXIgcmVzdWx0PWNyZWF0ZVdyYXAoZnVuYyxXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxhcml0eSk7cmVzdWx0LnBsYWNlaG9sZGVyPWN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBkZWJvdW5jZShmdW5jLHdhaXQsb3B0aW9ucyl7dmFyIGxhc3RBcmdzLGxhc3RUaGlzLG1heFdhaXQscmVzdWx0LHRpbWVySWQsbGFzdENhbGxUaW1lLGxhc3RJbnZva2VUaW1lPTAsbGVhZGluZz1mYWxzZSxtYXhpbmc9ZmFsc2UsdHJhaWxpbmc9dHJ1ZTsKaWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3dhaXQ9dG9OdW1iZXIod2FpdCl8fDA7aWYoaXNPYmplY3Qob3B0aW9ucykpe2xlYWRpbmc9ISFvcHRpb25zLmxlYWRpbmc7bWF4aW5nPSJtYXhXYWl0ImluIG9wdGlvbnM7bWF4V2FpdD1tYXhpbmc/bmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCl8fDAsd2FpdCk6bWF4V2FpdDt0cmFpbGluZz0idHJhaWxpbmciaW4gb3B0aW9ucz8hIW9wdGlvbnMudHJhaWxpbmc6dHJhaWxpbmd9ZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKXt2YXIgYXJncz1sYXN0QXJncyx0aGlzQXJnPWxhc3RUaGlzO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtsYXN0SW52b2tlVGltZT10aW1lO3Jlc3VsdD1mdW5jLmFwcGx5KHRoaXNBcmcsYXJncyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKXtsYXN0SW52b2tlVGltZT10aW1lO3RpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsCndhaXQpO3JldHVybiBsZWFkaW5nP2ludm9rZUZ1bmModGltZSk6cmVzdWx0fWZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSl7dmFyIHRpbWVTaW5jZUxhc3RDYWxsPXRpbWUtbGFzdENhbGxUaW1lLHRpbWVTaW5jZUxhc3RJbnZva2U9dGltZS1sYXN0SW52b2tlVGltZSx0aW1lV2FpdGluZz13YWl0LXRpbWVTaW5jZUxhc3RDYWxsO3JldHVybiBtYXhpbmc/bmF0aXZlTWluKHRpbWVXYWl0aW5nLG1heFdhaXQtdGltZVNpbmNlTGFzdEludm9rZSk6dGltZVdhaXRpbmd9ZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpe3ZhciB0aW1lU2luY2VMYXN0Q2FsbD10aW1lLWxhc3RDYWxsVGltZSx0aW1lU2luY2VMYXN0SW52b2tlPXRpbWUtbGFzdEludm9rZVRpbWU7cmV0dXJuIGxhc3RDYWxsVGltZT09PXVuZGVmaW5lZHx8dGltZVNpbmNlTGFzdENhbGw+PXdhaXR8fHRpbWVTaW5jZUxhc3RDYWxsPDB8fG1heGluZyYmdGltZVNpbmNlTGFzdEludm9rZT49bWF4V2FpdH1mdW5jdGlvbiB0aW1lckV4cGlyZWQoKXt2YXIgdGltZT0Kbm93KCk7aWYoc2hvdWxkSW52b2tlKHRpbWUpKXJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7dGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCxyZW1haW5pbmdXYWl0KHRpbWUpKX1mdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSl7dGltZXJJZD11bmRlZmluZWQ7aWYodHJhaWxpbmcmJmxhc3RBcmdzKXJldHVybiBpbnZva2VGdW5jKHRpbWUpO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNhbmNlbCgpe2lmKHRpbWVySWQhPT11bmRlZmluZWQpY2xlYXJUaW1lb3V0KHRpbWVySWQpO2xhc3RJbnZva2VUaW1lPTA7bGFzdEFyZ3M9bGFzdENhbGxUaW1lPWxhc3RUaGlzPXRpbWVySWQ9dW5kZWZpbmVkfWZ1bmN0aW9uIGZsdXNoKCl7cmV0dXJuIHRpbWVySWQ9PT11bmRlZmluZWQ/cmVzdWx0OnRyYWlsaW5nRWRnZShub3coKSl9ZnVuY3Rpb24gZGVib3VuY2VkKCl7dmFyIHRpbWU9bm93KCksaXNJbnZva2luZz1zaG91bGRJbnZva2UodGltZSk7Cmxhc3RBcmdzPWFyZ3VtZW50cztsYXN0VGhpcz10aGlzO2xhc3RDYWxsVGltZT10aW1lO2lmKGlzSW52b2tpbmcpe2lmKHRpbWVySWQ9PT11bmRlZmluZWQpcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7aWYobWF4aW5nKXt0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHdhaXQpO3JldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSl9fWlmKHRpbWVySWQ9PT11bmRlZmluZWQpdGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCx3YWl0KTtyZXR1cm4gcmVzdWx0fWRlYm91bmNlZC5jYW5jZWw9Y2FuY2VsO2RlYm91bmNlZC5mbHVzaD1mbHVzaDtyZXR1cm4gZGVib3VuY2VkfXZhciBkZWZlcj1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3JldHVybiBiYXNlRGVsYXkoZnVuYywxLGFyZ3MpfSk7dmFyIGRlbGF5PWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsd2FpdCxhcmdzKXtyZXR1cm4gYmFzZURlbGF5KGZ1bmMsdG9OdW1iZXIod2FpdCl8fDAsYXJncyl9KTsKZnVuY3Rpb24gZmxpcChmdW5jKXtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfRkxJUF9GTEFHKX1mdW5jdGlvbiBtZW1vaXplKGZ1bmMscmVzb2x2ZXIpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24ifHxyZXNvbHZlciE9bnVsbCYmdHlwZW9mIHJlc29sdmVyIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt2YXIgbWVtb2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsa2V5PXJlc29sdmVyP3Jlc29sdmVyLmFwcGx5KHRoaXMsYXJncyk6YXJnc1swXSxjYWNoZT1tZW1vaXplZC5jYWNoZTtpZihjYWNoZS5oYXMoa2V5KSlyZXR1cm4gY2FjaGUuZ2V0KGtleSk7dmFyIHJlc3VsdD1mdW5jLmFwcGx5KHRoaXMsYXJncyk7bWVtb2l6ZWQuY2FjaGU9Y2FjaGUuc2V0KGtleSxyZXN1bHQpfHxjYWNoZTtyZXR1cm4gcmVzdWx0fTttZW1vaXplZC5jYWNoZT1uZXcgKG1lbW9pemUuQ2FjaGV8fE1hcENhY2hlKTtyZXR1cm4gbWVtb2l6ZWR9Cm1lbW9pemUuQ2FjaGU9TWFwQ2FjaGU7ZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSl7aWYodHlwZW9mIHByZWRpY2F0ZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzO3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSk7Y2FzZSAyOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKX1yZXR1cm4hcHJlZGljYXRlLmFwcGx5KHRoaXMsYXJncyl9fWZ1bmN0aW9uIG9uY2UoZnVuYyl7cmV0dXJuIGJlZm9yZSgyLGZ1bmMpfXZhciBvdmVyQXJncz1jYXN0UmVzdChmdW5jdGlvbihmdW5jLHRyYW5zZm9ybXMpe3RyYW5zZm9ybXM9dHJhbnNmb3Jtcy5sZW5ndGg9PQoxJiZpc0FycmF5KHRyYW5zZm9ybXNbMF0pP2FycmF5TWFwKHRyYW5zZm9ybXNbMF0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTphcnJheU1hcChiYXNlRmxhdHRlbih0cmFuc2Zvcm1zLDEpLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7dmFyIGZ1bmNzTGVuZ3RoPXRyYW5zZm9ybXMubGVuZ3RoO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1pbihhcmdzLmxlbmd0aCxmdW5jc0xlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJnc1tpbmRleF09dHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLGFyZ3NbaW5kZXhdKTtyZXR1cm4gYXBwbHkoZnVuYyx0aGlzLGFyZ3MpfSl9KTt2YXIgcGFydGlhbD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHBhcnRpYWxzKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIocGFydGlhbCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX0ZMQUcsCnVuZGVmaW5lZCxwYXJ0aWFscyxob2xkZXJzKX0pO3ZhciBwYXJ0aWFsUmlnaHQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyxwYXJ0aWFscyl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIHJlYXJnPWZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsaW5kZXhlcyl7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1JFQVJHX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsaW5kZXhlcyl9KTtmdW5jdGlvbiByZXN0KGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09PXVuZGVmaW5lZD9zdGFydDp0b0ludGVnZXIoc3RhcnQpO3JldHVybiBiYXNlUmVzdChmdW5jLHN0YXJ0KX0KZnVuY3Rpb24gc3ByZWFkKGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09bnVsbD8wOm5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLDApO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgYXJyYXk9YXJnc1tzdGFydF0sb3RoZXJBcmdzPWNhc3RTbGljZShhcmdzLDAsc3RhcnQpO2lmKGFycmF5KWFycmF5UHVzaChvdGhlckFyZ3MsYXJyYXkpO3JldHVybiBhcHBseShmdW5jLHRoaXMsb3RoZXJBcmdzKX0pfWZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsd2FpdCxvcHRpb25zKXt2YXIgbGVhZGluZz10cnVlLHRyYWlsaW5nPXRydWU7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO2lmKGlzT2JqZWN0KG9wdGlvbnMpKXtsZWFkaW5nPSJsZWFkaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLmxlYWRpbmc6CmxlYWRpbmc7dHJhaWxpbmc9InRyYWlsaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLnRyYWlsaW5nOnRyYWlsaW5nfXJldHVybiBkZWJvdW5jZShmdW5jLHdhaXQseyJsZWFkaW5nIjpsZWFkaW5nLCJtYXhXYWl0Ijp3YWl0LCJ0cmFpbGluZyI6dHJhaWxpbmd9KX1mdW5jdGlvbiB1bmFyeShmdW5jKXtyZXR1cm4gYXJ5KGZ1bmMsMSl9ZnVuY3Rpb24gd3JhcCh2YWx1ZSx3cmFwcGVyKXtyZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksdmFsdWUpfWZ1bmN0aW9uIGNhc3RBcnJheSgpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltdO3ZhciB2YWx1ZT1hcmd1bWVudHNbMF07cmV0dXJuIGlzQXJyYXkodmFsdWUpP3ZhbHVlOlt2YWx1ZV19ZnVuY3Rpb24gY2xvbmUodmFsdWUpe3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfU1lNQk9MU19GTEFHKX1mdW5jdGlvbiBjbG9uZVdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09CiJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKXtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcpfWZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY29uZm9ybXNUbyhvYmplY3Qsc291cmNlKXtyZXR1cm4gc291cmNlPT1udWxsfHxiYXNlQ29uZm9ybXNUbyhvYmplY3Qsc291cmNlLGtleXMoc291cmNlKSl9ZnVuY3Rpb24gZXEodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT09PW90aGVyfHx2YWx1ZSE9PXZhbHVlJiYKb3RoZXIhPT1vdGhlcn12YXIgZ3Q9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlR3QpO3ZhciBndGU9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPj1vdGhlcn0pO3ZhciBpc0FyZ3VtZW50cz1iYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9iYXNlSXNBcmd1bWVudHM6ZnVuY3Rpb24odmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCJjYWxsZWUiKSYmIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsImNhbGxlZSIpfTt2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5O3ZhciBpc0FycmF5QnVmZmVyPW5vZGVJc0FycmF5QnVmZmVyP2Jhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcik6YmFzZUlzQXJyYXlCdWZmZXI7ZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmaXNMZW5ndGgodmFsdWUubGVuZ3RoKSYmCiFpc0Z1bmN0aW9uKHZhbHVlKX1mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmlzQXJyYXlMaWtlKHZhbHVlKX1mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpe3JldHVybiB2YWx1ZT09PXRydWV8fHZhbHVlPT09ZmFsc2V8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1ib29sVGFnfXZhciBpc0J1ZmZlcj1uYXRpdmVJc0J1ZmZlcnx8c3R1YkZhbHNlO3ZhciBpc0RhdGU9bm9kZUlzRGF0ZT9iYXNlVW5hcnkobm9kZUlzRGF0ZSk6YmFzZUlzRGF0ZTtmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZ2YWx1ZS5ub2RlVHlwZT09PTEmJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKXtpZih2YWx1ZT09bnVsbClyZXR1cm4gdHJ1ZTtpZihpc0FycmF5TGlrZSh2YWx1ZSkmJihpc0FycmF5KHZhbHVlKXx8dHlwZW9mIHZhbHVlPT0KInN0cmluZyJ8fHR5cGVvZiB2YWx1ZS5zcGxpY2U9PSJmdW5jdGlvbiJ8fGlzQnVmZmVyKHZhbHVlKXx8aXNUeXBlZEFycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpKSlyZXR1cm4hdmFsdWUubGVuZ3RoO3ZhciB0YWc9Z2V0VGFnKHZhbHVlKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIXZhbHVlLnNpemU7aWYoaXNQcm90b3R5cGUodmFsdWUpKXJldHVybiFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO2Zvcih2YXIga2V5IGluIHZhbHVlKWlmKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsa2V5KSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9ZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSxvdGhlcil7cmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyKX1mdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSxvdGhlcixjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3ZhciByZXN1bHQ9CmN1c3RvbWl6ZXI/Y3VzdG9taXplcih2YWx1ZSxvdGhlcik6dW5kZWZpbmVkO3JldHVybiByZXN1bHQ9PT11bmRlZmluZWQ/YmFzZUlzRXF1YWwodmFsdWUsb3RoZXIsdW5kZWZpbmVkLGN1c3RvbWl6ZXIpOiEhcmVzdWx0fWZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpe2lmKCFpc09iamVjdExpa2UodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PWVycm9yVGFnfHx0YWc9PWRvbUV4Y1RhZ3x8dHlwZW9mIHZhbHVlLm1lc3NhZ2U9PSJzdHJpbmciJiZ0eXBlb2YgdmFsdWUubmFtZT09InN0cmluZyImJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJm5hdGl2ZUlzRmluaXRlKHZhbHVlKX1mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKXtpZighaXNPYmplY3QodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PQpmdW5jVGFnfHx0YWc9PWdlblRhZ3x8dGFnPT1hc3luY1RhZ3x8dGFnPT1wcm94eVRhZ31mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJudW1iZXIiJiZ2YWx1ZT09dG9JbnRlZ2VyKHZhbHVlKX1mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTw9TUFYX1NBRkVfSU5URUdFUn1mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB2YWx1ZSE9bnVsbCYmKHR5cGU9PSJvYmplY3QifHx0eXBlPT0iZnVuY3Rpb24iKX1mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmdHlwZW9mIHZhbHVlPT0ib2JqZWN0In12YXIgaXNNYXA9bm9kZUlzTWFwP2Jhc2VVbmFyeShub2RlSXNNYXApOmJhc2VJc01hcDtmdW5jdGlvbiBpc01hdGNoKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3Q9PT0Kc291cmNlfHxiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLGdldE1hdGNoRGF0YShzb3VyY2UpKX1mdW5jdGlvbiBpc01hdGNoV2l0aChvYmplY3Qsc291cmNlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsZ2V0TWF0Y2hEYXRhKHNvdXJjZSksY3VzdG9taXplcil9ZnVuY3Rpb24gaXNOYU4odmFsdWUpe3JldHVybiBpc051bWJlcih2YWx1ZSkmJnZhbHVlIT0rdmFsdWV9ZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpe2lmKGlzTWFza2FibGUodmFsdWUpKXRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO3JldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpfWZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09bnVsbH1mdW5jdGlvbiBpc05pbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsfWZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0KIm51bWJlciJ8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1udW1iZXJUYWd9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSl7aWYoIWlzT2JqZWN0TGlrZSh2YWx1ZSl8fGJhc2VHZXRUYWcodmFsdWUpIT1vYmplY3RUYWcpcmV0dXJuIGZhbHNlO3ZhciBwcm90bz1nZXRQcm90b3R5cGUodmFsdWUpO2lmKHByb3RvPT09bnVsbClyZXR1cm4gdHJ1ZTt2YXIgQ3Rvcj1oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCJjb25zdHJ1Y3RvciIpJiZwcm90by5jb25zdHJ1Y3RvcjtyZXR1cm4gdHlwZW9mIEN0b3I9PSJmdW5jdGlvbiImJkN0b3IgaW5zdGFuY2VvZiBDdG9yJiZmdW5jVG9TdHJpbmcuY2FsbChDdG9yKT09b2JqZWN0Q3RvclN0cmluZ312YXIgaXNSZWdFeHA9bm9kZUlzUmVnRXhwP2Jhc2VVbmFyeShub2RlSXNSZWdFeHApOmJhc2VJc1JlZ0V4cDtmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSYmdmFsdWU+PQotTUFYX1NBRkVfSU5URUdFUiYmdmFsdWU8PU1BWF9TQUZFX0lOVEVHRVJ9dmFyIGlzU2V0PW5vZGVJc1NldD9iYXNlVW5hcnkobm9kZUlzU2V0KTpiYXNlSXNTZXQ7ZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzdHJpbmcifHwhaXNBcnJheSh2YWx1ZSkmJmlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1zdHJpbmdUYWd9ZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzeW1ib2wifHxpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09c3ltYm9sVGFnfXZhciBpc1R5cGVkQXJyYXk9bm9kZUlzVHlwZWRBcnJheT9iYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSk6YmFzZUlzVHlwZWRBcnJheTtmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkfWZ1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJgpnZXRUYWcodmFsdWUpPT13ZWFrTWFwVGFnfWZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT13ZWFrU2V0VGFnfXZhciBsdD1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7dmFyIGx0ZT1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU8PW90aGVyfSk7ZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSl7aWYoIXZhbHVlKXJldHVybltdO2lmKGlzQXJyYXlMaWtlKHZhbHVlKSlyZXR1cm4gaXNTdHJpbmcodmFsdWUpP3N0cmluZ1RvQXJyYXkodmFsdWUpOmNvcHlBcnJheSh2YWx1ZSk7aWYoc3ltSXRlcmF0b3ImJnZhbHVlW3N5bUl0ZXJhdG9yXSlyZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTt2YXIgdGFnPWdldFRhZyh2YWx1ZSksZnVuYz10YWc9PW1hcFRhZz9tYXBUb0FycmF5OnRhZz09c2V0VGFnP3NldFRvQXJyYXk6CnZhbHVlcztyZXR1cm4gZnVuYyh2YWx1ZSl9ZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpe2lmKCF2YWx1ZSlyZXR1cm4gdmFsdWU9PT0wP3ZhbHVlOjA7dmFsdWU9dG9OdW1iZXIodmFsdWUpO2lmKHZhbHVlPT09SU5GSU5JVFl8fHZhbHVlPT09LUlORklOSVRZKXt2YXIgc2lnbj12YWx1ZTwwPy0xOjE7cmV0dXJuIHNpZ24qTUFYX0lOVEVHRVJ9cmV0dXJuIHZhbHVlPT09dmFsdWU/dmFsdWU6MH1mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpe3ZhciByZXN1bHQ9dG9GaW5pdGUodmFsdWUpLHJlbWFpbmRlcj1yZXN1bHQlMTtyZXR1cm4gcmVzdWx0PT09cmVzdWx0P3JlbWFpbmRlcj9yZXN1bHQtcmVtYWluZGVyOnJlc3VsdDowfWZ1bmN0aW9uIHRvTGVuZ3RoKHZhbHVlKXtyZXR1cm4gdmFsdWU/YmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksMCxNQVhfQVJSQVlfTEVOR1RIKTowfWZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJudW1iZXIiKXJldHVybiB2YWx1ZTsKaWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47aWYoaXNPYmplY3QodmFsdWUpKXt2YXIgb3RoZXI9dHlwZW9mIHZhbHVlLnZhbHVlT2Y9PSJmdW5jdGlvbiI/dmFsdWUudmFsdWVPZigpOnZhbHVlO3ZhbHVlPWlzT2JqZWN0KG90aGVyKT9vdGhlcisiIjpvdGhlcn1pZih0eXBlb2YgdmFsdWUhPSJzdHJpbmciKXJldHVybiB2YWx1ZT09PTA/dmFsdWU6K3ZhbHVlO3ZhbHVlPXZhbHVlLnJlcGxhY2UocmVUcmltLCIiKTt2YXIgaXNCaW5hcnk9cmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtyZXR1cm4gaXNCaW5hcnl8fHJlSXNPY3RhbC50ZXN0KHZhbHVlKT9mcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksaXNCaW5hcnk/Mjo4KTpyZUlzQmFkSGV4LnRlc3QodmFsdWUpP05BTjordmFsdWV9ZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSl7cmV0dXJuIGNvcHlPYmplY3QodmFsdWUsa2V5c0luKHZhbHVlKSl9ZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSl7cmV0dXJuIHZhbHVlPwpiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwtTUFYX1NBRkVfSU5URUdFUixNQVhfU0FGRV9JTlRFR0VSKTp2YWx1ZT09PTA/dmFsdWU6MH1mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsPyIiOmJhc2VUb1N0cmluZyh2YWx1ZSl9dmFyIGFzc2lnbj1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlKXtpZihpc1Byb3RvdHlwZShzb3VyY2UpfHxpc0FycmF5TGlrZShzb3VyY2UpKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0KTtyZXR1cm59Zm9yKHZhciBrZXkgaW4gc291cmNlKWlmKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpYXNzaWduVmFsdWUob2JqZWN0LGtleSxzb3VyY2Vba2V5XSl9KTt2YXIgYXNzaWduSW49Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSl7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0KX0pO3ZhciBhc3NpZ25JbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LApzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcil7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGFzc2lnbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGF0PWZsYXRSZXN0KGJhc2VBdCk7ZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSxwcm9wZXJ0aWVzKXt2YXIgcmVzdWx0PWJhc2VDcmVhdGUocHJvdG90eXBlKTtyZXR1cm4gcHJvcGVydGllcz09bnVsbD9yZXN1bHQ6YmFzZUFzc2lnbihyZXN1bHQscHJvcGVydGllcyl9dmFyIGRlZmF1bHRzPWJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxzb3VyY2VzKXtvYmplY3Q9T2JqZWN0KG9iamVjdCk7dmFyIGluZGV4PS0xO3ZhciBsZW5ndGg9c291cmNlcy5sZW5ndGg7dmFyIGd1YXJkPWxlbmd0aD4yP3NvdXJjZXNbMl06CnVuZGVmaW5lZDtpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSxzb3VyY2VzWzFdLGd1YXJkKSlsZW5ndGg9MTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHNvdXJjZT1zb3VyY2VzW2luZGV4XTt2YXIgcHJvcHM9a2V5c0luKHNvdXJjZSk7dmFyIHByb3BzSW5kZXg9LTE7dmFyIHByb3BzTGVuZ3RoPXByb3BzLmxlbmd0aDt3aGlsZSgrK3Byb3BzSW5kZXg8cHJvcHNMZW5ndGgpe3ZhciBrZXk9cHJvcHNbcHJvcHNJbmRleF07dmFyIHZhbHVlPW9iamVjdFtrZXldO2lmKHZhbHVlPT09dW5kZWZpbmVkfHxlcSh2YWx1ZSxvYmplY3RQcm90b1trZXldKSYmIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpb2JqZWN0W2tleV09c291cmNlW2tleV19fXJldHVybiBvYmplY3R9KTt2YXIgZGVmYXVsdHNEZWVwPWJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe2FyZ3MucHVzaCh1bmRlZmluZWQsY3VzdG9tRGVmYXVsdHNNZXJnZSk7cmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwKdW5kZWZpbmVkLGFyZ3MpfSk7ZnVuY3Rpb24gZmluZEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duKX1mdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duUmlnaHQpfWZ1bmN0aW9uIGZvckluKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvcihvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksa2V5c0luKX1mdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvclJpZ2h0KG9iamVjdCxnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSxrZXlzSW4pfWZ1bmN0aW9uIGZvck93bihvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JPd24ob2JqZWN0LApnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSl9ZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yT3duUmlnaHQob2JqZWN0LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXMob2JqZWN0KSl9ZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXNJbihvYmplY3QpKX1mdW5jdGlvbiBnZXQob2JqZWN0LHBhdGgsZGVmYXVsdFZhbHVlKXt2YXIgcmVzdWx0PW9iamVjdD09bnVsbD91bmRlZmluZWQ6YmFzZUdldChvYmplY3QscGF0aCk7cmV0dXJuIHJlc3VsdD09PXVuZGVmaW5lZD9kZWZhdWx0VmFsdWU6cmVzdWx0fWZ1bmN0aW9uIGhhcyhvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdCE9bnVsbCYmaGFzUGF0aChvYmplY3QsCnBhdGgsYmFzZUhhcyl9ZnVuY3Rpb24gaGFzSW4ob2JqZWN0LHBhdGgpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc1BhdGgob2JqZWN0LHBhdGgsYmFzZUhhc0luKX12YXIgaW52ZXJ0PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7cmVzdWx0W3ZhbHVlXT1rZXl9LGNvbnN0YW50KGlkZW50aXR5KSk7dmFyIGludmVydEJ5PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsdmFsdWUpKXJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO2Vsc2UgcmVzdWx0W3ZhbHVlXT1ba2V5XX0sCmdldEl0ZXJhdGVlKTt2YXIgaW52b2tlPWJhc2VSZXN0KGJhc2VJbnZva2UpO2Z1bmN0aW9uIGtleXMob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCk6YmFzZUtleXMob2JqZWN0KX1mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCx0cnVlKTpiYXNlS2V5c0luKG9iamVjdCl9ZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyk7YmFzZUZvck93bihvYmplY3QsZnVuY3Rpb24odmFsdWUsa2V5LG9iamVjdCl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxpdGVyYXRlZSh2YWx1ZSxrZXksb2JqZWN0KSx2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpO2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe2Jhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LGl0ZXJhdGVlKHZhbHVlLGtleSxvYmplY3QpKX0pO3JldHVybiByZXN1bHR9dmFyIG1lcmdlPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgpe2Jhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4KX0pO3ZhciBtZXJnZVdpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtiYXNlTWVyZ2Uob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKX0pO3ZhciBvbWl0PWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7dmFyIHJlc3VsdD17fTtpZihvYmplY3Q9PW51bGwpcmV0dXJuIHJlc3VsdDt2YXIgaXNEZWVwPWZhbHNlO3BhdGhzPWFycmF5TWFwKHBhdGhzLGZ1bmN0aW9uKHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO2lzRGVlcHx8Cihpc0RlZXA9cGF0aC5sZW5ndGg+MSk7cmV0dXJuIHBhdGh9KTtjb3B5T2JqZWN0KG9iamVjdCxnZXRBbGxLZXlzSW4ob2JqZWN0KSxyZXN1bHQpO2lmKGlzRGVlcClyZXN1bHQ9YmFzZUNsb25lKHJlc3VsdCxDTE9ORV9ERUVQX0ZMQUd8Q0xPTkVfRkxBVF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21PbWl0Q2xvbmUpO3ZhciBsZW5ndGg9cGF0aHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKWJhc2VVbnNldChyZXN1bHQscGF0aHNbbGVuZ3RoXSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIG9taXRCeShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gcGlja0J5KG9iamVjdCxuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpfXZhciBwaWNrPWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7cmV0dXJuIG9iamVjdD09bnVsbD97fTpiYXNlUGljayhvYmplY3QscGF0aHMpfSk7ZnVuY3Rpb24gcGlja0J5KG9iamVjdCxwcmVkaWNhdGUpe2lmKG9iamVjdD09bnVsbClyZXR1cm57fTsKdmFyIHByb3BzPWFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLGZ1bmN0aW9uKHByb3Ape3JldHVybltwcm9wXX0pO3ByZWRpY2F0ZT1nZXRJdGVyYXRlZShwcmVkaWNhdGUpO3JldHVybiBiYXNlUGlja0J5KG9iamVjdCxwcm9wcyxmdW5jdGlvbih2YWx1ZSxwYXRoKXtyZXR1cm4gcHJlZGljYXRlKHZhbHVlLHBhdGhbMF0pfSl9ZnVuY3Rpb24gcmVzdWx0KG9iamVjdCxwYXRoLGRlZmF1bHRWYWx1ZSl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRoLmxlbmd0aDtpZighbGVuZ3RoKXtsZW5ndGg9MTtvYmplY3Q9dW5kZWZpbmVkfXdoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9b2JqZWN0PT1udWxsP3VuZGVmaW5lZDpvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtpZih2YWx1ZT09PXVuZGVmaW5lZCl7aW5kZXg9bGVuZ3RoO3ZhbHVlPWRlZmF1bHRWYWx1ZX1vYmplY3Q9aXNGdW5jdGlvbih2YWx1ZSk/dmFsdWUuY2FsbChvYmplY3QpOgp2YWx1ZX1yZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIHNldChvYmplY3QscGF0aCx2YWx1ZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSl9ZnVuY3Rpb24gc2V0V2l0aChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil9dmFyIHRvUGFpcnM9Y3JlYXRlVG9QYWlycyhrZXlzKTt2YXIgdG9QYWlyc0luPWNyZWF0ZVRvUGFpcnMoa2V5c0luKTtmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgaXNBcnI9aXNBcnJheShvYmplY3QpLGlzQXJyTGlrZT1pc0Fycnx8aXNCdWZmZXIob2JqZWN0KXx8aXNUeXBlZEFycmF5KG9iamVjdCk7aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjQpO2lmKGFjY3VtdWxhdG9yPT1udWxsKXt2YXIgQ3Rvcj1vYmplY3QmJm9iamVjdC5jb25zdHJ1Y3RvcjtpZihpc0Fyckxpa2UpYWNjdW11bGF0b3I9aXNBcnI/bmV3IEN0b3I6W107ZWxzZSBpZihpc09iamVjdChvYmplY3QpKWFjY3VtdWxhdG9yPWlzRnVuY3Rpb24oQ3Rvcik/YmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSk6e307ZWxzZSBhY2N1bXVsYXRvcj17fX0oaXNBcnJMaWtlP2FycmF5RWFjaDpiYXNlRm9yT3duKShvYmplY3QsZnVuY3Rpb24odmFsdWUsaW5kZXgsb2JqZWN0KXtyZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsb2JqZWN0KX0pO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiB1bnNldChvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdD09bnVsbD90cnVlOmJhc2VVbnNldChvYmplY3QscGF0aCl9ZnVuY3Rpb24gdXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VVcGRhdGUob2JqZWN0LApwYXRoLGNhc3RGdW5jdGlvbih1cGRhdGVyKSl9ZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QscGF0aCx1cGRhdGVyLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVVwZGF0ZShvYmplY3QscGF0aCxjYXN0RnVuY3Rpb24odXBkYXRlciksY3VzdG9taXplcil9ZnVuY3Rpb24gdmFsdWVzKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzKG9iamVjdCkpfWZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzSW4ob2JqZWN0KSl9ZnVuY3Rpb24gY2xhbXAobnVtYmVyLGxvd2VyLHVwcGVyKXtpZih1cHBlcj09PXVuZGVmaW5lZCl7dXBwZXI9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKHVwcGVyIT09dW5kZWZpbmVkKXt1cHBlcj0KdG9OdW1iZXIodXBwZXIpO3VwcGVyPXVwcGVyPT09dXBwZXI/dXBwZXI6MH1pZihsb3dlciE9PXVuZGVmaW5lZCl7bG93ZXI9dG9OdW1iZXIobG93ZXIpO2xvd2VyPWxvd2VyPT09bG93ZXI/bG93ZXI6MH1yZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksbG93ZXIsdXBwZXIpfWZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PXVuZGVmaW5lZCl7ZW5kPXN0YXJ0O3N0YXJ0PTB9ZWxzZSBlbmQ9dG9GaW5pdGUoZW5kKTtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtyZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gcmFuZG9tKGxvd2VyLHVwcGVyLGZsb2F0aW5nKXtpZihmbG9hdGluZyYmdHlwZW9mIGZsb2F0aW5nIT0iYm9vbGVhbiImJmlzSXRlcmF0ZWVDYWxsKGxvd2VyLHVwcGVyLGZsb2F0aW5nKSl1cHBlcj1mbG9hdGluZz11bmRlZmluZWQ7aWYoZmxvYXRpbmc9PT11bmRlZmluZWQpaWYodHlwZW9mIHVwcGVyPT0KImJvb2xlYW4iKXtmbG9hdGluZz11cHBlcjt1cHBlcj11bmRlZmluZWR9ZWxzZSBpZih0eXBlb2YgbG93ZXI9PSJib29sZWFuIil7ZmxvYXRpbmc9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKGxvd2VyPT09dW5kZWZpbmVkJiZ1cHBlcj09PXVuZGVmaW5lZCl7bG93ZXI9MDt1cHBlcj0xfWVsc2V7bG93ZXI9dG9GaW5pdGUobG93ZXIpO2lmKHVwcGVyPT09dW5kZWZpbmVkKXt1cHBlcj1sb3dlcjtsb3dlcj0wfWVsc2UgdXBwZXI9dG9GaW5pdGUodXBwZXIpfWlmKGxvd2VyPnVwcGVyKXt2YXIgdGVtcD1sb3dlcjtsb3dlcj11cHBlcjt1cHBlcj10ZW1wfWlmKGZsb2F0aW5nfHxsb3dlciUxfHx1cHBlciUxKXt2YXIgcmFuZD1uYXRpdmVSYW5kb20oKTtyZXR1cm4gbmF0aXZlTWluKGxvd2VyK3JhbmQqKHVwcGVyLWxvd2VyK2ZyZWVQYXJzZUZsb2F0KCIxZS0iKygocmFuZCsiIikubGVuZ3RoLTEpKSksdXBwZXIpfXJldHVybiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKX12YXIgY2FtZWxDYXNlPQpjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXt3b3JkPXdvcmQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcmVzdWx0KyhpbmRleD9jYXBpdGFsaXplKHdvcmQpOndvcmQpfSk7ZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpe3JldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gZGVidXJyKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmc3RyaW5nLnJlcGxhY2UocmVMYXRpbixkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssIiIpfWZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZyx0YXJnZXQscG9zaXRpb24pe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTt2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGg7cG9zaXRpb249cG9zaXRpb249PT11bmRlZmluZWQ/bGVuZ3RoOmJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLAowLGxlbmd0aCk7dmFyIGVuZD1wb3NpdGlvbjtwb3NpdGlvbi09dGFyZ2V0Lmxlbmd0aDtyZXR1cm4gcG9zaXRpb24+PTAmJnN0cmluZy5zbGljZShwb3NpdGlvbixlbmQpPT10YXJnZXR9ZnVuY3Rpb24gZXNjYXBlKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsZXNjYXBlSHRtbENoYXIpOnN0cmluZ31mdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc1JlZ0V4cENoYXIudGVzdChzdHJpbmcpP3N0cmluZy5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpOnN0cmluZ312YXIga2ViYWJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyItIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7CnZhciBsb3dlckNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt3b3JkLnRvTG93ZXJDYXNlKCl9KTt2YXIgbG93ZXJGaXJzdD1jcmVhdGVDYXNlRmlyc3QoInRvTG93ZXJDYXNlIik7ZnVuY3Rpb24gcGFkKHN0cmluZyxsZW5ndGgsY2hhcnMpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2xlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtpZighbGVuZ3RofHxzdHJMZW5ndGg+PWxlbmd0aClyZXR1cm4gc3RyaW5nO3ZhciBtaWQ9KGxlbmd0aC1zdHJMZW5ndGgpLzI7cmV0dXJuIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSxjaGFycykrc3RyaW5nK2NyZWF0ZVBhZGRpbmcobmF0aXZlQ2VpbChtaWQpLGNoYXJzKX1mdW5jdGlvbiBwYWRFbmQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7Cmxlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtyZXR1cm4gbGVuZ3RoJiZzdHJMZW5ndGg8bGVuZ3RoP3N0cmluZytjcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpOnN0cmluZ31mdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsbGVuZ3RoLGNoYXJzKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtsZW5ndGg9dG9JbnRlZ2VyKGxlbmd0aCk7dmFyIHN0ckxlbmd0aD1sZW5ndGg/c3RyaW5nU2l6ZShzdHJpbmcpOjA7cmV0dXJuIGxlbmd0aCYmc3RyTGVuZ3RoPGxlbmd0aD9jcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpK3N0cmluZzpzdHJpbmd9ZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLHJhZGl4LGd1YXJkKXtpZihndWFyZHx8cmFkaXg9PW51bGwpcmFkaXg9MDtlbHNlIGlmKHJhZGl4KXJhZGl4PStyYWRpeDtyZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LAoiIikscmFkaXh8fDApfWZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsbixndWFyZCl7aWYoZ3VhcmQ/aXNJdGVyYXRlZUNhbGwoc3RyaW5nLG4sZ3VhcmQpOm49PT11bmRlZmluZWQpbj0xO2Vsc2Ugbj10b0ludGVnZXIobik7cmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSxuKX1mdW5jdGlvbiByZXBsYWNlKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHN0cmluZz10b1N0cmluZyhhcmdzWzBdKTtyZXR1cm4gYXJncy5sZW5ndGg8Mz9zdHJpbmc6c3RyaW5nLnJlcGxhY2UoYXJnc1sxXSxhcmdzWzJdKX12YXIgc25ha2VDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyJfIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gc3BsaXQoc3RyaW5nLHNlcGFyYXRvcixsaW1pdCl7aWYobGltaXQmJnR5cGVvZiBsaW1pdCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0cmluZyxzZXBhcmF0b3IsbGltaXQpKXNlcGFyYXRvcj0KbGltaXQ9dW5kZWZpbmVkO2xpbWl0PWxpbWl0PT09dW5kZWZpbmVkP01BWF9BUlJBWV9MRU5HVEg6bGltaXQ+Pj4wO2lmKCFsaW1pdClyZXR1cm5bXTtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJih0eXBlb2Ygc2VwYXJhdG9yPT0ic3RyaW5nInx8c2VwYXJhdG9yIT1udWxsJiYhaXNSZWdFeHAoc2VwYXJhdG9yKSkpe3NlcGFyYXRvcj1iYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtpZighc2VwYXJhdG9yJiZoYXNVbmljb2RlKHN0cmluZykpcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksMCxsaW1pdCl9cmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsbGltaXQpfXZhciBzdGFydENhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt1cHBlckZpcnN0KHdvcmQpfSk7ZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsdGFyZ2V0LHBvc2l0aW9uKXtzdHJpbmc9CnRvU3RyaW5nKHN0cmluZyk7cG9zaXRpb249cG9zaXRpb249PW51bGw/MDpiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwwLHN0cmluZy5sZW5ndGgpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTtyZXR1cm4gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLHBvc2l0aW9uK3RhcmdldC5sZW5ndGgpPT10YXJnZXR9ZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpe3ZhciBzZXR0aW5ncz1sb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpKW9wdGlvbnM9dW5kZWZpbmVkO3N0cmluZz10b1N0cmluZyhzdHJpbmcpO29wdGlvbnM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMsc2V0dGluZ3MsY3VzdG9tRGVmYXVsdHNBc3NpZ25Jbik7dmFyIGltcG9ydHM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMuaW1wb3J0cyxzZXR0aW5ncy5pbXBvcnRzLGN1c3RvbURlZmF1bHRzQXNzaWduSW4pLGltcG9ydHNLZXlzPQprZXlzKGltcG9ydHMpLGltcG9ydHNWYWx1ZXM9YmFzZVZhbHVlcyhpbXBvcnRzLGltcG9ydHNLZXlzKTt2YXIgaXNFc2NhcGluZyxpc0V2YWx1YXRpbmcsaW5kZXg9MCxpbnRlcnBvbGF0ZT1vcHRpb25zLmludGVycG9sYXRlfHxyZU5vTWF0Y2gsc291cmNlPSJfX3AgK1x4M2QgJyI7dmFyIHJlRGVsaW1pdGVycz1SZWdFeHAoKG9wdGlvbnMuZXNjYXBlfHxyZU5vTWF0Y2gpLnNvdXJjZSsifCIraW50ZXJwb2xhdGUuc291cmNlKyJ8IisoaW50ZXJwb2xhdGU9PT1yZUludGVycG9sYXRlP3JlRXNUZW1wbGF0ZTpyZU5vTWF0Y2gpLnNvdXJjZSsifCIrKG9wdGlvbnMuZXZhbHVhdGV8fHJlTm9NYXRjaCkuc291cmNlKyJ8JCIsImciKTt2YXIgc291cmNlVVJMPSIvLyMgc291cmNlVVJMXHgzZCIrKCJzb3VyY2VVUkwiaW4gb3B0aW9ucz9vcHRpb25zLnNvdXJjZVVSTDoibG9kYXNoLnRlbXBsYXRlU291cmNlc1siKyArK3RlbXBsYXRlQ291bnRlcisiXSIpKyJcbiI7c3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLApmdW5jdGlvbihtYXRjaCxlc2NhcGVWYWx1ZSxpbnRlcnBvbGF0ZVZhbHVlLGVzVGVtcGxhdGVWYWx1ZSxldmFsdWF0ZVZhbHVlLG9mZnNldCl7aW50ZXJwb2xhdGVWYWx1ZXx8KGludGVycG9sYXRlVmFsdWU9ZXNUZW1wbGF0ZVZhbHVlKTtzb3VyY2UrPXN0cmluZy5zbGljZShpbmRleCxvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsZXNjYXBlU3RyaW5nQ2hhcik7aWYoZXNjYXBlVmFsdWUpe2lzRXNjYXBpbmc9dHJ1ZTtzb3VyY2UrPSInICtcbl9fZSgiK2VzY2FwZVZhbHVlKyIpICtcbicifWlmKGV2YWx1YXRlVmFsdWUpe2lzRXZhbHVhdGluZz10cnVlO3NvdXJjZSs9Iic7XG4iK2V2YWx1YXRlVmFsdWUrIjtcbl9fcCArXHgzZCAnIn1pZihpbnRlcnBvbGF0ZVZhbHVlKXNvdXJjZSs9IicgK1xuKChfX3QgXHgzZCAoIitpbnRlcnBvbGF0ZVZhbHVlKyIpKSBceDNkXHgzZCBudWxsID8gJycgOiBfX3QpICtcbiciO2luZGV4PW9mZnNldCttYXRjaC5sZW5ndGg7cmV0dXJuIG1hdGNofSk7CnNvdXJjZSs9Iic7XG4iO3ZhciB2YXJpYWJsZT1vcHRpb25zLnZhcmlhYmxlO2lmKCF2YXJpYWJsZSlzb3VyY2U9IndpdGggKG9iaikge1xuIitzb3VyY2UrIlxufVxuIjtzb3VyY2U9KGlzRXZhbHVhdGluZz9zb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywiIik6c291cmNlKS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsIiQxIikucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsIiQxOyIpO3NvdXJjZT0iZnVuY3Rpb24oIisodmFyaWFibGV8fCJvYmoiKSsiKSB7XG4iKyh2YXJpYWJsZT8iIjoib2JqIHx8IChvYmogXHgzZCB7fSk7XG4iKSsidmFyIF9fdCwgX19wIFx4M2QgJyciKyhpc0VzY2FwaW5nPyIsIF9fZSBceDNkIF8uZXNjYXBlIjoiIikrKGlzRXZhbHVhdGluZz8iLCBfX2ogXHgzZCBBcnJheS5wcm90b3R5cGUuam9pbjtcbiIrImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgK1x4M2QgX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrc291cmNlKwoicmV0dXJuIF9fcFxufSI7dmFyIHJlc3VsdD1hdHRlbXB0KGZ1bmN0aW9uKCl7cmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLHNvdXJjZVVSTCsicmV0dXJuICIrc291cmNlKS5hcHBseSh1bmRlZmluZWQsaW1wb3J0c1ZhbHVlcyl9KTtyZXN1bHQuc291cmNlPXNvdXJjZTtpZihpc0Vycm9yKHJlc3VsdCkpdGhyb3cgcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSl7cmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpe3JldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiB0cmltKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7CnZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxjaHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoY2hhcnMpLHN0YXJ0PWNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scykrMTtyZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsc3RhcnQsZW5kKS5qb2luKCIiKX1mdW5jdGlvbiB0cmltRW5kKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7dmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpKzE7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLAowLGVuZCkuam9pbigiIil9ZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsIiIpO2lmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpcmV0dXJuIHN0cmluZzt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyksc3RhcnQ9Y2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpO3JldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scyxzdGFydCkuam9pbigiIil9ZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLG9wdGlvbnMpe3ZhciBsZW5ndGg9REVGQVVMVF9UUlVOQ19MRU5HVEgsb21pc3Npb249REVGQVVMVF9UUlVOQ19PTUlTU0lPTjtpZihpc09iamVjdChvcHRpb25zKSl7dmFyIHNlcGFyYXRvcj0ic2VwYXJhdG9yImluIG9wdGlvbnM/Cm9wdGlvbnMuc2VwYXJhdG9yOnNlcGFyYXRvcjtsZW5ndGg9Imxlbmd0aCJpbiBvcHRpb25zP3RvSW50ZWdlcihvcHRpb25zLmxlbmd0aCk6bGVuZ3RoO29taXNzaW9uPSJvbWlzc2lvbiJpbiBvcHRpb25zP2Jhc2VUb1N0cmluZyhvcHRpb25zLm9taXNzaW9uKTpvbWlzc2lvbn1zdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTt2YXIgc3RyTGVuZ3RoPXN0cmluZy5sZW5ndGg7aWYoaGFzVW5pY29kZShzdHJpbmcpKXt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyk7c3RyTGVuZ3RoPXN0clN5bWJvbHMubGVuZ3RofWlmKGxlbmd0aD49c3RyTGVuZ3RoKXJldHVybiBzdHJpbmc7dmFyIGVuZD1sZW5ndGgtc3RyaW5nU2l6ZShvbWlzc2lvbik7aWYoZW5kPDEpcmV0dXJuIG9taXNzaW9uO3ZhciByZXN1bHQ9c3RyU3ltYm9scz9jYXN0U2xpY2Uoc3RyU3ltYm9scywwLGVuZCkuam9pbigiIik6c3RyaW5nLnNsaWNlKDAsZW5kKTtpZihzZXBhcmF0b3I9PT11bmRlZmluZWQpcmV0dXJuIHJlc3VsdCsKb21pc3Npb247aWYoc3RyU3ltYm9scyllbmQrPXJlc3VsdC5sZW5ndGgtZW5kO2lmKGlzUmVnRXhwKHNlcGFyYXRvcikpe2lmKHN0cmluZy5zbGljZShlbmQpLnNlYXJjaChzZXBhcmF0b3IpKXt2YXIgbWF0Y2gsc3Vic3RyaW5nPXJlc3VsdDtpZighc2VwYXJhdG9yLmdsb2JhbClzZXBhcmF0b3I9UmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpKyJnIik7c2VwYXJhdG9yLmxhc3RJbmRleD0wO3doaWxlKG1hdGNoPXNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpdmFyIG5ld0VuZD1tYXRjaC5pbmRleDtyZXN1bHQ9cmVzdWx0LnNsaWNlKDAsbmV3RW5kPT09dW5kZWZpbmVkP2VuZDpuZXdFbmQpfX1lbHNlIGlmKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLGVuZCkhPWVuZCl7dmFyIGluZGV4PXJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO2lmKGluZGV4Pi0xKXJlc3VsdD1yZXN1bHQuc2xpY2UoMCxpbmRleCl9cmV0dXJuIHJlc3VsdCsKb21pc3Npb259ZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLHVuZXNjYXBlSHRtbENoYXIpOnN0cmluZ312YXIgdXBwZXJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyIgIjoiIikrd29yZC50b1VwcGVyQ2FzZSgpfSk7dmFyIHVwcGVyRmlyc3Q9Y3JlYXRlQ2FzZUZpcnN0KCJ0b1VwcGVyQ2FzZSIpO2Z1bmN0aW9uIHdvcmRzKHN0cmluZyxwYXR0ZXJuLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtwYXR0ZXJuPWd1YXJkP3VuZGVmaW5lZDpwYXR0ZXJuO2lmKHBhdHRlcm49PT11bmRlZmluZWQpcmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZyk/dW5pY29kZVdvcmRzKHN0cmluZyk6YXNjaWlXb3JkcyhzdHJpbmcpO3JldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybil8fApbXX12YXIgYXR0ZW1wdD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3RyeXtyZXR1cm4gYXBwbHkoZnVuYyx1bmRlZmluZWQsYXJncyl9Y2F0Y2goZSl7cmV0dXJuIGlzRXJyb3IoZSk/ZTpuZXcgRXJyb3IoZSl9fSk7dmFyIGJpbmRBbGw9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LG1ldGhvZE5hbWVzKXthcnJheUVhY2gobWV0aG9kTmFtZXMsZnVuY3Rpb24oa2V5KXtrZXk9dG9LZXkoa2V5KTtiYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSxiaW5kKG9iamVjdFtrZXldLG9iamVjdCkpfSk7cmV0dXJuIG9iamVjdH0pO2Z1bmN0aW9uIGNvbmQocGFpcnMpe3ZhciBsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgsdG9JdGVyYXRlZT1nZXRJdGVyYXRlZSgpO3BhaXJzPSFsZW5ndGg/W106YXJyYXlNYXAocGFpcnMsZnVuY3Rpb24ocGFpcil7aWYodHlwZW9mIHBhaXJbMV0hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3JldHVyblt0b0l0ZXJhdGVlKHBhaXJbMF0pLApwYWlyWzFdXX0pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTE7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYWlyPXBhaXJzW2luZGV4XTtpZihhcHBseShwYWlyWzBdLHRoaXMsYXJncykpcmV0dXJuIGFwcGx5KHBhaXJbMV0sdGhpcyxhcmdzKX19KX1mdW5jdGlvbiBjb25mb3Jtcyhzb3VyY2Upe3JldHVybiBiYXNlQ29uZm9ybXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHZhbHVlfX1mdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsZGVmYXVsdFZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGx8fHZhbHVlIT09dmFsdWU/ZGVmYXVsdFZhbHVlOnZhbHVlfXZhciBmbG93PWNyZWF0ZUZsb3coKTt2YXIgZmxvd1JpZ2h0PWNyZWF0ZUZsb3codHJ1ZSk7ZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpe3JldHVybiB2YWx1ZX1mdW5jdGlvbiBpdGVyYXRlZShmdW5jKXtyZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jPT0KImZ1bmN0aW9uIj9mdW5jOmJhc2VDbG9uZShmdW5jLENMT05FX0RFRVBfRkxBRykpfWZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKXtyZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCxzcmNWYWx1ZSl7cmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCxiYXNlQ2xvbmUoc3JjVmFsdWUsQ0xPTkVfREVFUF9GTEFHKSl9dmFyIG1ldGhvZD1iYXNlUmVzdChmdW5jdGlvbihwYXRoLGFyZ3Mpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO3ZhciBtZXRob2RPZj1iYXNlUmVzdChmdW5jdGlvbihvYmplY3QsYXJncyl7cmV0dXJuIGZ1bmN0aW9uKHBhdGgpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO2Z1bmN0aW9uIG1peGluKG9iamVjdCxzb3VyY2Usb3B0aW9ucyl7dmFyIHByb3BzPWtleXMoc291cmNlKSwKbWV0aG9kTmFtZXM9YmFzZUZ1bmN0aW9ucyhzb3VyY2UscHJvcHMpO2lmKG9wdGlvbnM9PW51bGwmJiEoaXNPYmplY3Qoc291cmNlKSYmKG1ldGhvZE5hbWVzLmxlbmd0aHx8IXByb3BzLmxlbmd0aCkpKXtvcHRpb25zPXNvdXJjZTtzb3VyY2U9b2JqZWN0O29iamVjdD10aGlzO21ldGhvZE5hbWVzPWJhc2VGdW5jdGlvbnMoc291cmNlLGtleXMoc291cmNlKSl9dmFyIGNoYWluPSEoaXNPYmplY3Qob3B0aW9ucykmJiJjaGFpbiJpbiBvcHRpb25zKXx8ISFvcHRpb25zLmNoYWluLGlzRnVuYz1pc0Z1bmN0aW9uKG9iamVjdCk7YXJyYXlFYWNoKG1ldGhvZE5hbWVzLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe3ZhciBmdW5jPXNvdXJjZVttZXRob2ROYW1lXTtvYmplY3RbbWV0aG9kTmFtZV09ZnVuYztpZihpc0Z1bmMpb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciBjaGFpbkFsbD10aGlzLl9fY2hhaW5fXztpZihjaGFpbnx8Y2hhaW5BbGwpe3ZhciByZXN1bHQ9Cm9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxhY3Rpb25zPXJlc3VsdC5fX2FjdGlvbnNfXz1jb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7YWN0aW9ucy5wdXNoKHsiZnVuYyI6ZnVuYywiYXJncyI6YXJndW1lbnRzLCJ0aGlzQXJnIjpvYmplY3R9KTtyZXN1bHQuX19jaGFpbl9fPWNoYWluQWxsO3JldHVybiByZXN1bHR9cmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSxhcmd1bWVudHMpKX19KTtyZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIG5vQ29uZmxpY3QoKXtpZihyb290Ll89PT10aGlzKXJvb3QuXz1vbGREYXNoO3JldHVybiB0aGlzfWZ1bmN0aW9uIG5vb3AoKXt9ZnVuY3Rpb24gbnRoQXJnKG4pe249dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXtyZXR1cm4gYmFzZU50aChhcmdzLG4pfSl9dmFyIG92ZXI9Y3JlYXRlT3ZlcihhcnJheU1hcCk7dmFyIG92ZXJFdmVyeT1jcmVhdGVPdmVyKGFycmF5RXZlcnkpOwp2YXIgb3ZlclNvbWU9Y3JlYXRlT3ZlcihhcnJheVNvbWUpO2Z1bmN0aW9uIHByb3BlcnR5KHBhdGgpe3JldHVybiBpc0tleShwYXRoKT9iYXNlUHJvcGVydHkodG9LZXkocGF0aCkpOmJhc2VQcm9wZXJ0eURlZXAocGF0aCl9ZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihwYXRoKXtyZXR1cm4gb2JqZWN0PT1udWxsP3VuZGVmaW5lZDpiYXNlR2V0KG9iamVjdCxwYXRoKX19dmFyIHJhbmdlPWNyZWF0ZVJhbmdlKCk7dmFyIHJhbmdlUmlnaHQ9Y3JlYXRlUmFuZ2UodHJ1ZSk7ZnVuY3Rpb24gc3R1YkFycmF5KCl7cmV0dXJuW119ZnVuY3Rpb24gc3R1YkZhbHNlKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHN0dWJPYmplY3QoKXtyZXR1cm57fX1mdW5jdGlvbiBzdHViU3RyaW5nKCl7cmV0dXJuIiJ9ZnVuY3Rpb24gc3R1YlRydWUoKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiB0aW1lcyhuLGl0ZXJhdGVlKXtuPXRvSW50ZWdlcihuKTtpZihuPDF8fG4+TUFYX1NBRkVfSU5URUdFUilyZXR1cm5bXTsKdmFyIGluZGV4PU1BWF9BUlJBWV9MRU5HVEgsbGVuZ3RoPW5hdGl2ZU1pbihuLE1BWF9BUlJBWV9MRU5HVEgpO2l0ZXJhdGVlPWdldEl0ZXJhdGVlKGl0ZXJhdGVlKTtuLT1NQVhfQVJSQVlfTEVOR1RIO3ZhciByZXN1bHQ9YmFzZVRpbWVzKGxlbmd0aCxpdGVyYXRlZSk7d2hpbGUoKytpbmRleDxuKWl0ZXJhdGVlKGluZGV4KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGFycmF5TWFwKHZhbHVlLHRvS2V5KTtyZXR1cm4gaXNTeW1ib2wodmFsdWUpP1t2YWx1ZV06Y29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKX1mdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpe3ZhciBpZD0rK2lkQ291bnRlcjtyZXR1cm4gdG9TdHJpbmcocHJlZml4KStpZH12YXIgYWRkPWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLGFkZGVuZCl7cmV0dXJuIGF1Z2VuZCthZGRlbmR9LDApO3ZhciBjZWlsPWNyZWF0ZVJvdW5kKCJjZWlsIik7CnZhciBkaXZpZGU9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihkaXZpZGVuZCxkaXZpc29yKXtyZXR1cm4gZGl2aWRlbmQvZGl2aXNvcn0sMSk7dmFyIGZsb29yPWNyZWF0ZVJvdW5kKCJmbG9vciIpO2Z1bmN0aW9uIG1heChhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VHdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1heEJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUd0KTp1bmRlZmluZWR9ZnVuY3Rpb24gbWVhbihhcnJheSl7cmV0dXJuIGJhc2VNZWFuKGFycmF5LGlkZW50aXR5KX1mdW5jdGlvbiBtZWFuQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBiYXNlTWVhbihhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSl9ZnVuY3Rpb24gbWluKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD8KYmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VMdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1pbkJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUx0KTp1bmRlZmluZWR9dmFyIG11bHRpcGx5PWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obXVsdGlwbGllcixtdWx0aXBsaWNhbmQpe3JldHVybiBtdWx0aXBsaWVyKm11bHRpcGxpY2FuZH0sMSk7dmFyIHJvdW5kPWNyZWF0ZVJvdW5kKCJyb3VuZCIpO3ZhciBzdWJ0cmFjdD1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsc3VidHJhaGVuZCl7cmV0dXJuIG1pbnVlbmQtc3VidHJhaGVuZH0sMCk7ZnVuY3Rpb24gc3VtKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU3VtKGFycmF5LGlkZW50aXR5KTowfWZ1bmN0aW9uIHN1bUJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJgphcnJheS5sZW5ndGg/YmFzZVN1bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6MH1sb2Rhc2guYWZ0ZXI9YWZ0ZXI7bG9kYXNoLmFyeT1hcnk7bG9kYXNoLmFzc2lnbj1hc3NpZ247bG9kYXNoLmFzc2lnbkluPWFzc2lnbkluO2xvZGFzaC5hc3NpZ25JbldpdGg9YXNzaWduSW5XaXRoO2xvZGFzaC5hc3NpZ25XaXRoPWFzc2lnbldpdGg7bG9kYXNoLmF0PWF0O2xvZGFzaC5iZWZvcmU9YmVmb3JlO2xvZGFzaC5iaW5kPWJpbmQ7bG9kYXNoLmJpbmRBbGw9YmluZEFsbDtsb2Rhc2guYmluZEtleT1iaW5kS2V5O2xvZGFzaC5jYXN0QXJyYXk9Y2FzdEFycmF5O2xvZGFzaC5jaGFpbj1jaGFpbjtsb2Rhc2guY2h1bms9Y2h1bms7bG9kYXNoLmNvbXBhY3Q9Y29tcGFjdDtsb2Rhc2guY29uY2F0PWNvbmNhdDtsb2Rhc2guY29uZD1jb25kO2xvZGFzaC5jb25mb3Jtcz1jb25mb3Jtcztsb2Rhc2guY29uc3RhbnQ9Y29uc3RhbnQ7bG9kYXNoLmNvdW50Qnk9Y291bnRCeTtsb2Rhc2guY3JlYXRlPQpjcmVhdGU7bG9kYXNoLmN1cnJ5PWN1cnJ5O2xvZGFzaC5jdXJyeVJpZ2h0PWN1cnJ5UmlnaHQ7bG9kYXNoLmRlYm91bmNlPWRlYm91bmNlO2xvZGFzaC5kZWZhdWx0cz1kZWZhdWx0cztsb2Rhc2guZGVmYXVsdHNEZWVwPWRlZmF1bHRzRGVlcDtsb2Rhc2guZGVmZXI9ZGVmZXI7bG9kYXNoLmRlbGF5PWRlbGF5O2xvZGFzaC5kaWZmZXJlbmNlPWRpZmZlcmVuY2U7bG9kYXNoLmRpZmZlcmVuY2VCeT1kaWZmZXJlbmNlQnk7bG9kYXNoLmRpZmZlcmVuY2VXaXRoPWRpZmZlcmVuY2VXaXRoO2xvZGFzaC5kcm9wPWRyb3A7bG9kYXNoLmRyb3BSaWdodD1kcm9wUmlnaHQ7bG9kYXNoLmRyb3BSaWdodFdoaWxlPWRyb3BSaWdodFdoaWxlO2xvZGFzaC5kcm9wV2hpbGU9ZHJvcFdoaWxlO2xvZGFzaC5maWxsPWZpbGw7bG9kYXNoLmZpbHRlcj1maWx0ZXI7bG9kYXNoLmZsYXRNYXA9ZmxhdE1hcDtsb2Rhc2guZmxhdE1hcERlZXA9ZmxhdE1hcERlZXA7bG9kYXNoLmZsYXRNYXBEZXB0aD1mbGF0TWFwRGVwdGg7CmxvZGFzaC5mbGF0dGVuPWZsYXR0ZW47bG9kYXNoLmZsYXR0ZW5EZWVwPWZsYXR0ZW5EZWVwO2xvZGFzaC5mbGF0dGVuRGVwdGg9ZmxhdHRlbkRlcHRoO2xvZGFzaC5mbGlwPWZsaXA7bG9kYXNoLmZsb3c9Zmxvdztsb2Rhc2guZmxvd1JpZ2h0PWZsb3dSaWdodDtsb2Rhc2guZnJvbVBhaXJzPWZyb21QYWlycztsb2Rhc2guZnVuY3Rpb25zPWZ1bmN0aW9ucztsb2Rhc2guZnVuY3Rpb25zSW49ZnVuY3Rpb25zSW47bG9kYXNoLmdyb3VwQnk9Z3JvdXBCeTtsb2Rhc2guaW5pdGlhbD1pbml0aWFsO2xvZGFzaC5pbnRlcnNlY3Rpb249aW50ZXJzZWN0aW9uO2xvZGFzaC5pbnRlcnNlY3Rpb25CeT1pbnRlcnNlY3Rpb25CeTtsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aD1pbnRlcnNlY3Rpb25XaXRoO2xvZGFzaC5pbnZlcnQ9aW52ZXJ0O2xvZGFzaC5pbnZlcnRCeT1pbnZlcnRCeTtsb2Rhc2guaW52b2tlTWFwPWludm9rZU1hcDtsb2Rhc2guaXRlcmF0ZWU9aXRlcmF0ZWU7bG9kYXNoLmtleUJ5PQprZXlCeTtsb2Rhc2gua2V5cz1rZXlzO2xvZGFzaC5rZXlzSW49a2V5c0luO2xvZGFzaC5tYXA9bWFwO2xvZGFzaC5tYXBLZXlzPW1hcEtleXM7bG9kYXNoLm1hcFZhbHVlcz1tYXBWYWx1ZXM7bG9kYXNoLm1hdGNoZXM9bWF0Y2hlcztsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5PW1hdGNoZXNQcm9wZXJ0eTtsb2Rhc2gubWVtb2l6ZT1tZW1vaXplO2xvZGFzaC5tZXJnZT1tZXJnZTtsb2Rhc2gubWVyZ2VXaXRoPW1lcmdlV2l0aDtsb2Rhc2gubWV0aG9kPW1ldGhvZDtsb2Rhc2gubWV0aG9kT2Y9bWV0aG9kT2Y7bG9kYXNoLm1peGluPW1peGluO2xvZGFzaC5uZWdhdGU9bmVnYXRlO2xvZGFzaC5udGhBcmc9bnRoQXJnO2xvZGFzaC5vbWl0PW9taXQ7bG9kYXNoLm9taXRCeT1vbWl0Qnk7bG9kYXNoLm9uY2U9b25jZTtsb2Rhc2gub3JkZXJCeT1vcmRlckJ5O2xvZGFzaC5vdmVyPW92ZXI7bG9kYXNoLm92ZXJBcmdzPW92ZXJBcmdzO2xvZGFzaC5vdmVyRXZlcnk9b3ZlckV2ZXJ5O2xvZGFzaC5vdmVyU29tZT0Kb3ZlclNvbWU7bG9kYXNoLnBhcnRpYWw9cGFydGlhbDtsb2Rhc2gucGFydGlhbFJpZ2h0PXBhcnRpYWxSaWdodDtsb2Rhc2gucGFydGl0aW9uPXBhcnRpdGlvbjtsb2Rhc2gucGljaz1waWNrO2xvZGFzaC5waWNrQnk9cGlja0J5O2xvZGFzaC5wcm9wZXJ0eT1wcm9wZXJ0eTtsb2Rhc2gucHJvcGVydHlPZj1wcm9wZXJ0eU9mO2xvZGFzaC5wdWxsPXB1bGw7bG9kYXNoLnB1bGxBbGw9cHVsbEFsbDtsb2Rhc2gucHVsbEFsbEJ5PXB1bGxBbGxCeTtsb2Rhc2gucHVsbEFsbFdpdGg9cHVsbEFsbFdpdGg7bG9kYXNoLnB1bGxBdD1wdWxsQXQ7bG9kYXNoLnJhbmdlPXJhbmdlO2xvZGFzaC5yYW5nZVJpZ2h0PXJhbmdlUmlnaHQ7bG9kYXNoLnJlYXJnPXJlYXJnO2xvZGFzaC5yZWplY3Q9cmVqZWN0O2xvZGFzaC5yZW1vdmU9cmVtb3ZlO2xvZGFzaC5yZXN0PXJlc3Q7bG9kYXNoLnJldmVyc2U9cmV2ZXJzZTtsb2Rhc2guc2FtcGxlU2l6ZT1zYW1wbGVTaXplO2xvZGFzaC5zZXQ9c2V0O2xvZGFzaC5zZXRXaXRoPQpzZXRXaXRoO2xvZGFzaC5zaHVmZmxlPXNodWZmbGU7bG9kYXNoLnNsaWNlPXNsaWNlO2xvZGFzaC5zb3J0Qnk9c29ydEJ5O2xvZGFzaC5zb3J0ZWRVbmlxPXNvcnRlZFVuaXE7bG9kYXNoLnNvcnRlZFVuaXFCeT1zb3J0ZWRVbmlxQnk7bG9kYXNoLnNwbGl0PXNwbGl0O2xvZGFzaC5zcHJlYWQ9c3ByZWFkO2xvZGFzaC50YWlsPXRhaWw7bG9kYXNoLnRha2U9dGFrZTtsb2Rhc2gudGFrZVJpZ2h0PXRha2VSaWdodDtsb2Rhc2gudGFrZVJpZ2h0V2hpbGU9dGFrZVJpZ2h0V2hpbGU7bG9kYXNoLnRha2VXaGlsZT10YWtlV2hpbGU7bG9kYXNoLnRhcD10YXA7bG9kYXNoLnRocm90dGxlPXRocm90dGxlO2xvZGFzaC50aHJ1PXRocnU7bG9kYXNoLnRvQXJyYXk9dG9BcnJheTtsb2Rhc2gudG9QYWlycz10b1BhaXJzO2xvZGFzaC50b1BhaXJzSW49dG9QYWlyc0luO2xvZGFzaC50b1BhdGg9dG9QYXRoO2xvZGFzaC50b1BsYWluT2JqZWN0PXRvUGxhaW5PYmplY3Q7bG9kYXNoLnRyYW5zZm9ybT0KdHJhbnNmb3JtO2xvZGFzaC51bmFyeT11bmFyeTtsb2Rhc2gudW5pb249dW5pb247bG9kYXNoLnVuaW9uQnk9dW5pb25CeTtsb2Rhc2gudW5pb25XaXRoPXVuaW9uV2l0aDtsb2Rhc2gudW5pcT11bmlxO2xvZGFzaC51bmlxQnk9dW5pcUJ5O2xvZGFzaC51bmlxV2l0aD11bmlxV2l0aDtsb2Rhc2gudW5zZXQ9dW5zZXQ7bG9kYXNoLnVuemlwPXVuemlwO2xvZGFzaC51bnppcFdpdGg9dW56aXBXaXRoO2xvZGFzaC51cGRhdGU9dXBkYXRlO2xvZGFzaC51cGRhdGVXaXRoPXVwZGF0ZVdpdGg7bG9kYXNoLnZhbHVlcz12YWx1ZXM7bG9kYXNoLnZhbHVlc0luPXZhbHVlc0luO2xvZGFzaC53aXRob3V0PXdpdGhvdXQ7bG9kYXNoLndvcmRzPXdvcmRzO2xvZGFzaC53cmFwPXdyYXA7bG9kYXNoLnhvcj14b3I7bG9kYXNoLnhvckJ5PXhvckJ5O2xvZGFzaC54b3JXaXRoPXhvcldpdGg7bG9kYXNoLnppcD16aXA7bG9kYXNoLnppcE9iamVjdD16aXBPYmplY3Q7bG9kYXNoLnppcE9iamVjdERlZXA9CnppcE9iamVjdERlZXA7bG9kYXNoLnppcFdpdGg9emlwV2l0aDtsb2Rhc2guZW50cmllcz10b1BhaXJzO2xvZGFzaC5lbnRyaWVzSW49dG9QYWlyc0luO2xvZGFzaC5leHRlbmQ9YXNzaWduSW47bG9kYXNoLmV4dGVuZFdpdGg9YXNzaWduSW5XaXRoO21peGluKGxvZGFzaCxsb2Rhc2gpO2xvZGFzaC5hZGQ9YWRkO2xvZGFzaC5hdHRlbXB0PWF0dGVtcHQ7bG9kYXNoLmNhbWVsQ2FzZT1jYW1lbENhc2U7bG9kYXNoLmNhcGl0YWxpemU9Y2FwaXRhbGl6ZTtsb2Rhc2guY2VpbD1jZWlsO2xvZGFzaC5jbGFtcD1jbGFtcDtsb2Rhc2guY2xvbmU9Y2xvbmU7bG9kYXNoLmNsb25lRGVlcD1jbG9uZURlZXA7bG9kYXNoLmNsb25lRGVlcFdpdGg9Y2xvbmVEZWVwV2l0aDtsb2Rhc2guY2xvbmVXaXRoPWNsb25lV2l0aDtsb2Rhc2guY29uZm9ybXNUbz1jb25mb3Jtc1RvO2xvZGFzaC5kZWJ1cnI9ZGVidXJyO2xvZGFzaC5kZWZhdWx0VG89ZGVmYXVsdFRvO2xvZGFzaC5kaXZpZGU9ZGl2aWRlO2xvZGFzaC5lbmRzV2l0aD0KZW5kc1dpdGg7bG9kYXNoLmVxPWVxO2xvZGFzaC5lc2NhcGU9ZXNjYXBlO2xvZGFzaC5lc2NhcGVSZWdFeHA9ZXNjYXBlUmVnRXhwO2xvZGFzaC5ldmVyeT1ldmVyeTtsb2Rhc2guZmluZD1maW5kO2xvZGFzaC5maW5kSW5kZXg9ZmluZEluZGV4O2xvZGFzaC5maW5kS2V5PWZpbmRLZXk7bG9kYXNoLmZpbmRMYXN0PWZpbmRMYXN0O2xvZGFzaC5maW5kTGFzdEluZGV4PWZpbmRMYXN0SW5kZXg7bG9kYXNoLmZpbmRMYXN0S2V5PWZpbmRMYXN0S2V5O2xvZGFzaC5mbG9vcj1mbG9vcjtsb2Rhc2guZm9yRWFjaD1mb3JFYWNoO2xvZGFzaC5mb3JFYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5mb3JJbj1mb3JJbjtsb2Rhc2guZm9ySW5SaWdodD1mb3JJblJpZ2h0O2xvZGFzaC5mb3JPd249Zm9yT3duO2xvZGFzaC5mb3JPd25SaWdodD1mb3JPd25SaWdodDtsb2Rhc2guZ2V0PWdldDtsb2Rhc2guZ3Q9Z3Q7bG9kYXNoLmd0ZT1ndGU7bG9kYXNoLmhhcz1oYXM7bG9kYXNoLmhhc0luPWhhc0luOwpsb2Rhc2guaGVhZD1oZWFkO2xvZGFzaC5pZGVudGl0eT1pZGVudGl0eTtsb2Rhc2guaW5jbHVkZXM9aW5jbHVkZXM7bG9kYXNoLmluZGV4T2Y9aW5kZXhPZjtsb2Rhc2guaW5SYW5nZT1pblJhbmdlO2xvZGFzaC5pbnZva2U9aW52b2tlO2xvZGFzaC5pc0FyZ3VtZW50cz1pc0FyZ3VtZW50cztsb2Rhc2guaXNBcnJheT1pc0FycmF5O2xvZGFzaC5pc0FycmF5QnVmZmVyPWlzQXJyYXlCdWZmZXI7bG9kYXNoLmlzQXJyYXlMaWtlPWlzQXJyYXlMaWtlO2xvZGFzaC5pc0FycmF5TGlrZU9iamVjdD1pc0FycmF5TGlrZU9iamVjdDtsb2Rhc2guaXNCb29sZWFuPWlzQm9vbGVhbjtsb2Rhc2guaXNCdWZmZXI9aXNCdWZmZXI7bG9kYXNoLmlzRGF0ZT1pc0RhdGU7bG9kYXNoLmlzRWxlbWVudD1pc0VsZW1lbnQ7bG9kYXNoLmlzRW1wdHk9aXNFbXB0eTtsb2Rhc2guaXNFcXVhbD1pc0VxdWFsO2xvZGFzaC5pc0VxdWFsV2l0aD1pc0VxdWFsV2l0aDtsb2Rhc2guaXNFcnJvcj1pc0Vycm9yO2xvZGFzaC5pc0Zpbml0ZT0KaXNGaW5pdGU7bG9kYXNoLmlzRnVuY3Rpb249aXNGdW5jdGlvbjtsb2Rhc2guaXNJbnRlZ2VyPWlzSW50ZWdlcjtsb2Rhc2guaXNMZW5ndGg9aXNMZW5ndGg7bG9kYXNoLmlzTWFwPWlzTWFwO2xvZGFzaC5pc01hdGNoPWlzTWF0Y2g7bG9kYXNoLmlzTWF0Y2hXaXRoPWlzTWF0Y2hXaXRoO2xvZGFzaC5pc05hTj1pc05hTjtsb2Rhc2guaXNOYXRpdmU9aXNOYXRpdmU7bG9kYXNoLmlzTmlsPWlzTmlsO2xvZGFzaC5pc051bGw9aXNOdWxsO2xvZGFzaC5pc051bWJlcj1pc051bWJlcjtsb2Rhc2guaXNPYmplY3Q9aXNPYmplY3Q7bG9kYXNoLmlzT2JqZWN0TGlrZT1pc09iamVjdExpa2U7bG9kYXNoLmlzUGxhaW5PYmplY3Q9aXNQbGFpbk9iamVjdDtsb2Rhc2guaXNSZWdFeHA9aXNSZWdFeHA7bG9kYXNoLmlzU2FmZUludGVnZXI9aXNTYWZlSW50ZWdlcjtsb2Rhc2guaXNTZXQ9aXNTZXQ7bG9kYXNoLmlzU3RyaW5nPWlzU3RyaW5nO2xvZGFzaC5pc1N5bWJvbD1pc1N5bWJvbDtsb2Rhc2guaXNUeXBlZEFycmF5PQppc1R5cGVkQXJyYXk7bG9kYXNoLmlzVW5kZWZpbmVkPWlzVW5kZWZpbmVkO2xvZGFzaC5pc1dlYWtNYXA9aXNXZWFrTWFwO2xvZGFzaC5pc1dlYWtTZXQ9aXNXZWFrU2V0O2xvZGFzaC5qb2luPWpvaW47bG9kYXNoLmtlYmFiQ2FzZT1rZWJhYkNhc2U7bG9kYXNoLmxhc3Q9bGFzdDtsb2Rhc2gubGFzdEluZGV4T2Y9bGFzdEluZGV4T2Y7bG9kYXNoLmxvd2VyQ2FzZT1sb3dlckNhc2U7bG9kYXNoLmxvd2VyRmlyc3Q9bG93ZXJGaXJzdDtsb2Rhc2gubHQ9bHQ7bG9kYXNoLmx0ZT1sdGU7bG9kYXNoLm1heD1tYXg7bG9kYXNoLm1heEJ5PW1heEJ5O2xvZGFzaC5tZWFuPW1lYW47bG9kYXNoLm1lYW5CeT1tZWFuQnk7bG9kYXNoLm1pbj1taW47bG9kYXNoLm1pbkJ5PW1pbkJ5O2xvZGFzaC5zdHViQXJyYXk9c3R1YkFycmF5O2xvZGFzaC5zdHViRmFsc2U9c3R1YkZhbHNlO2xvZGFzaC5zdHViT2JqZWN0PXN0dWJPYmplY3Q7bG9kYXNoLnN0dWJTdHJpbmc9c3R1YlN0cmluZztsb2Rhc2guc3R1YlRydWU9CnN0dWJUcnVlO2xvZGFzaC5tdWx0aXBseT1tdWx0aXBseTtsb2Rhc2gubnRoPW50aDtsb2Rhc2gubm9Db25mbGljdD1ub0NvbmZsaWN0O2xvZGFzaC5ub29wPW5vb3A7bG9kYXNoLm5vdz1ub3c7bG9kYXNoLnBhZD1wYWQ7bG9kYXNoLnBhZEVuZD1wYWRFbmQ7bG9kYXNoLnBhZFN0YXJ0PXBhZFN0YXJ0O2xvZGFzaC5wYXJzZUludD1wYXJzZUludDtsb2Rhc2gucmFuZG9tPXJhbmRvbTtsb2Rhc2gucmVkdWNlPXJlZHVjZTtsb2Rhc2gucmVkdWNlUmlnaHQ9cmVkdWNlUmlnaHQ7bG9kYXNoLnJlcGVhdD1yZXBlYXQ7bG9kYXNoLnJlcGxhY2U9cmVwbGFjZTtsb2Rhc2gucmVzdWx0PXJlc3VsdDtsb2Rhc2gucm91bmQ9cm91bmQ7bG9kYXNoLnJ1bkluQ29udGV4dD1ydW5JbkNvbnRleHQ7bG9kYXNoLnNhbXBsZT1zYW1wbGU7bG9kYXNoLnNpemU9c2l6ZTtsb2Rhc2guc25ha2VDYXNlPXNuYWtlQ2FzZTtsb2Rhc2guc29tZT1zb21lO2xvZGFzaC5zb3J0ZWRJbmRleD1zb3J0ZWRJbmRleDtsb2Rhc2guc29ydGVkSW5kZXhCeT0Kc29ydGVkSW5kZXhCeTtsb2Rhc2guc29ydGVkSW5kZXhPZj1zb3J0ZWRJbmRleE9mO2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXg9c29ydGVkTGFzdEluZGV4O2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXhCeT1zb3J0ZWRMYXN0SW5kZXhCeTtsb2Rhc2guc29ydGVkTGFzdEluZGV4T2Y9c29ydGVkTGFzdEluZGV4T2Y7bG9kYXNoLnN0YXJ0Q2FzZT1zdGFydENhc2U7bG9kYXNoLnN0YXJ0c1dpdGg9c3RhcnRzV2l0aDtsb2Rhc2guc3VidHJhY3Q9c3VidHJhY3Q7bG9kYXNoLnN1bT1zdW07bG9kYXNoLnN1bUJ5PXN1bUJ5O2xvZGFzaC50ZW1wbGF0ZT10ZW1wbGF0ZTtsb2Rhc2gudGltZXM9dGltZXM7bG9kYXNoLnRvRmluaXRlPXRvRmluaXRlO2xvZGFzaC50b0ludGVnZXI9dG9JbnRlZ2VyO2xvZGFzaC50b0xlbmd0aD10b0xlbmd0aDtsb2Rhc2gudG9Mb3dlcj10b0xvd2VyO2xvZGFzaC50b051bWJlcj10b051bWJlcjtsb2Rhc2gudG9TYWZlSW50ZWdlcj10b1NhZmVJbnRlZ2VyO2xvZGFzaC50b1N0cmluZz0KdG9TdHJpbmc7bG9kYXNoLnRvVXBwZXI9dG9VcHBlcjtsb2Rhc2gudHJpbT10cmltO2xvZGFzaC50cmltRW5kPXRyaW1FbmQ7bG9kYXNoLnRyaW1TdGFydD10cmltU3RhcnQ7bG9kYXNoLnRydW5jYXRlPXRydW5jYXRlO2xvZGFzaC51bmVzY2FwZT11bmVzY2FwZTtsb2Rhc2gudW5pcXVlSWQ9dW5pcXVlSWQ7bG9kYXNoLnVwcGVyQ2FzZT11cHBlckNhc2U7bG9kYXNoLnVwcGVyRmlyc3Q9dXBwZXJGaXJzdDtsb2Rhc2guZWFjaD1mb3JFYWNoO2xvZGFzaC5lYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5maXJzdD1oZWFkO21peGluKGxvZGFzaCxmdW5jdGlvbigpe3ZhciBzb3VyY2U9e307YmFzZUZvck93bihsb2Rhc2gsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXtpZighaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLG1ldGhvZE5hbWUpKXNvdXJjZVttZXRob2ROYW1lXT1mdW5jfSk7cmV0dXJuIHNvdXJjZX0oKSx7ImNoYWluIjpmYWxzZX0pO2xvZGFzaC5WRVJTSU9OPQpWRVJTSU9OO2FycmF5RWFjaChbImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe2xvZGFzaFttZXRob2ROYW1lXS5wbGFjZWhvbGRlcj1sb2Rhc2h9KTthcnJheUVhY2goWyJkcm9wIiwidGFrZSJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbihuKXtuPW49PT11bmRlZmluZWQ/MTpuYXRpdmVNYXgodG9JbnRlZ2VyKG4pLDApO3ZhciByZXN1bHQ9dGhpcy5fX2ZpbHRlcmVkX18mJiFpbmRleD9uZXcgTGF6eVdyYXBwZXIodGhpcyk6dGhpcy5jbG9uZSgpO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18pcmVzdWx0Ll9fdGFrZUNvdW50X189bmF0aXZlTWluKG4scmVzdWx0Ll9fdGFrZUNvdW50X18pO2Vsc2UgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHsic2l6ZSI6bmF0aXZlTWluKG4sTUFYX0FSUkFZX0xFTkdUSCksCiJ0eXBlIjptZXRob2ROYW1lKyhyZXN1bHQuX19kaXJfXzwwPyJSaWdodCI6IiIpfSk7cmV0dXJuIHJlc3VsdH07TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUrIlJpZ2h0Il09ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKX19KTthcnJheUVhY2goWyJmaWx0ZXIiLCJtYXAiLCJ0YWtlV2hpbGUiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgdHlwZT1pbmRleCsxLGlzRmlsdGVyPXR5cGU9PUxBWllfRklMVEVSX0ZMQUd8fHR5cGU9PUxBWllfV0hJTEVfRkxBRztMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oaXRlcmF0ZWUpe3ZhciByZXN1bHQ9dGhpcy5jbG9uZSgpO3Jlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goeyJpdGVyYXRlZSI6Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksInR5cGUiOnR5cGV9KTtyZXN1bHQuX19maWx0ZXJlZF9fPXJlc3VsdC5fX2ZpbHRlcmVkX198fAppc0ZpbHRlcjtyZXR1cm4gcmVzdWx0fX0pO2FycmF5RWFjaChbImhlYWQiLCJsYXN0Il0sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7dmFyIHRha2VOYW1lPSJ0YWtlIisoaW5kZXg/IlJpZ2h0IjoiIik7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF19fSk7YXJyYXlFYWNoKFsiaW5pdGlhbCIsInRhaWwiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgZHJvcE5hbWU9ImRyb3AiKyhpbmRleD8iIjoiUmlnaHQiKTtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IExhenlXcmFwcGVyKHRoaXMpOnRoaXNbZHJvcE5hbWVdKDEpfX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKGlkZW50aXR5KX07TGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmQ9CmZ1bmN0aW9uKHByZWRpY2F0ZSl7cmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsYXJncyl7aWYodHlwZW9mIHBhdGg9PSJmdW5jdGlvbiIpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcih0aGlzKTtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpe3JldHVybiBiYXNlSW52b2tlKHZhbHVlLHBhdGgsYXJncyl9KX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKX07TGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHN0YXJ0LGVuZCl7c3RhcnQ9dG9JbnRlZ2VyKHN0YXJ0KTsKdmFyIHJlc3VsdD10aGlzO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18mJihzdGFydD4wfHxlbmQ8MCkpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO2lmKHN0YXJ0PDApcmVzdWx0PXJlc3VsdC50YWtlUmlnaHQoLXN0YXJ0KTtlbHNlIGlmKHN0YXJ0KXJlc3VsdD1yZXN1bHQuZHJvcChzdGFydCk7aWYoZW5kIT09dW5kZWZpbmVkKXtlbmQ9dG9JbnRlZ2VyKGVuZCk7cmVzdWx0PWVuZDwwP3Jlc3VsdC5kcm9wUmlnaHQoLWVuZCk6cmVzdWx0LnRha2UoZW5kLXN0YXJ0KX1yZXR1cm4gcmVzdWx0fTtMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoTUFYX0FSUkFZX0xFTkdUSCl9O2Jhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLApmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe3ZhciBjaGVja0l0ZXJhdGVlPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG1ldGhvZE5hbWUpLGlzVGFrZXI9L14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxsb2Rhc2hGdW5jPWxvZGFzaFtpc1Rha2VyPyJ0YWtlIisobWV0aG9kTmFtZT09Imxhc3QiPyJSaWdodCI6IiIpOm1ldGhvZE5hbWVdLHJldFVud3JhcHBlZD1pc1Rha2VyfHwvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7aWYoIWxvZGFzaEZ1bmMpcmV0dXJuO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgdmFsdWU9dGhpcy5fX3dyYXBwZWRfXyxhcmdzPWlzVGFrZXI/WzFdOmFyZ3VtZW50cyxpc0xhenk9dmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixpdGVyYXRlZT1hcmdzWzBdLHVzZUxhenk9aXNMYXp5fHxpc0FycmF5KHZhbHVlKTt2YXIgaW50ZXJjZXB0b3I9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9CmxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLGFycmF5UHVzaChbdmFsdWVdLGFyZ3MpKTtyZXR1cm4gaXNUYWtlciYmY2hhaW5BbGw/cmVzdWx0WzBdOnJlc3VsdH07aWYodXNlTGF6eSYmY2hlY2tJdGVyYXRlZSYmdHlwZW9mIGl0ZXJhdGVlPT0iZnVuY3Rpb24iJiZpdGVyYXRlZS5sZW5ndGghPTEpaXNMYXp5PXVzZUxhenk9ZmFsc2U7dmFyIGNoYWluQWxsPXRoaXMuX19jaGFpbl9fLGlzSHlicmlkPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsaXNVbndyYXBwZWQ9cmV0VW53cmFwcGVkJiYhY2hhaW5BbGwsb25seUxhenk9aXNMYXp5JiYhaXNIeWJyaWQ7aWYoIXJldFVud3JhcHBlZCYmdXNlTGF6eSl7dmFsdWU9b25seUxhenk/dmFsdWU6bmV3IExhenlXcmFwcGVyKHRoaXMpO3ZhciByZXN1bHQ9ZnVuYy5hcHBseSh2YWx1ZSxhcmdzKTtyZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsCmNoYWluQWxsKX1pZihpc1Vud3JhcHBlZCYmb25seUxhenkpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmdzKTtyZXN1bHQ9dGhpcy50aHJ1KGludGVyY2VwdG9yKTtyZXR1cm4gaXNVbndyYXBwZWQ/aXNUYWtlcj9yZXN1bHQudmFsdWUoKVswXTpyZXN1bHQudmFsdWUoKTpyZXN1bHR9fSk7YXJyYXlFYWNoKFsicG9wIiwicHVzaCIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSxmdW5jdGlvbihtZXRob2ROYW1lKXt2YXIgZnVuYz1hcnJheVByb3RvW21ldGhvZE5hbWVdLGNoYWluTmFtZT0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk/InRhcCI6InRocnUiLHJldFVud3JhcHBlZD0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7aWYocmV0VW53cmFwcGVkJiYhdGhpcy5fX2NoYWluX18pe3ZhciB2YWx1ZT10aGlzLnZhbHVlKCk7CnJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfXJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfSl9fSk7YmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXt2YXIgbG9kYXNoRnVuYz1sb2Rhc2hbbWV0aG9kTmFtZV07aWYobG9kYXNoRnVuYyl7dmFyIGtleT1sb2Rhc2hGdW5jLm5hbWUrIiIsbmFtZXM9cmVhbE5hbWVzW2tleV18fChyZWFsTmFtZXNba2V5XT1bXSk7bmFtZXMucHVzaCh7Im5hbWUiOm1ldGhvZE5hbWUsImZ1bmMiOmxvZGFzaEZ1bmN9KX19KTtyZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCxXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdPVt7Im5hbWUiOiJ3cmFwcGVyIiwiZnVuYyI6dW5kZWZpbmVkfV07TGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lPWxhenlDbG9uZTsKTGF6eVdyYXBwZXIucHJvdG90eXBlLnJldmVyc2U9bGF6eVJldmVyc2U7TGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlPWxhenlWYWx1ZTtsb2Rhc2gucHJvdG90eXBlLmF0PXdyYXBwZXJBdDtsb2Rhc2gucHJvdG90eXBlLmNoYWluPXdyYXBwZXJDaGFpbjtsb2Rhc2gucHJvdG90eXBlLmNvbW1pdD13cmFwcGVyQ29tbWl0O2xvZGFzaC5wcm90b3R5cGUubmV4dD13cmFwcGVyTmV4dDtsb2Rhc2gucHJvdG90eXBlLnBsYW50PXdyYXBwZXJQbGFudDtsb2Rhc2gucHJvdG90eXBlLnJldmVyc2U9d3JhcHBlclJldmVyc2U7bG9kYXNoLnByb3RvdHlwZS50b0pTT049bG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mPWxvZGFzaC5wcm90b3R5cGUudmFsdWU9d3JhcHBlclZhbHVlO2xvZGFzaC5wcm90b3R5cGUuZmlyc3Q9bG9kYXNoLnByb3RvdHlwZS5oZWFkO2lmKHN5bUl0ZXJhdG9yKWxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdPXdyYXBwZXJUb0l0ZXJhdG9yO3JldHVybiBsb2Rhc2h9Owp2YXIgXz1ydW5JbkNvbnRleHQoKTtpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZGVmaW5lLmFtZD09Im9iamVjdCImJmRlZmluZS5hbWQpe3Jvb3QuXz1fO2RlZmluZShmdW5jdGlvbigpe3JldHVybiBffSl9ZWxzZSBpZihmcmVlTW9kdWxlKXsoZnJlZU1vZHVsZS5leHBvcnRzPV8pLl89XztmcmVlRXhwb3J0cy5fPV99ZWxzZSByb290Ll89X30pLmNhbGwodGhpcyk7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1zb3J0aW5nL3NvcnRpbmcuanMKdmFyIHJjOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChrLHQpe2xldCBsOyhmdW5jdGlvbihtKXttW20uTkFUVVJBTD0wXT0iTkFUVVJBTCI7bVttLlJFQUw9MV09IlJFQUwiO21bbS5FWFBPTkVOVF9TSUdOPTJdPSJFWFBPTkVOVF9TSUdOIjttW20uRVhQT05FTlQ9M109IkVYUE9ORU5UIn0pKGx8fChsPXt9KSk7bGV0IHA9bC5OQVRVUkFMO2Zvcig7dDxrLmxlbmd0aDt0KyspaWYocD09PWwuTkFUVVJBTClpZigiLiI9PT1rW3RdKXA9bC5SRUFMO2Vsc2UgaWYoImUiPT09a1t0XXx8IkUiPT09a1t0XSlwPWwuRVhQT05FTlRfU0lHTjtlbHNle2lmKCFmKGtbdF0pKWJyZWFrfWVsc2UgaWYocD09PWwuUkVBTClpZigiZSI9PT1rW3RdfHwiRSI9PT1rW3RdKXA9bC5FWFBPTkVOVF9TSUdOO2Vsc2V7aWYoIWYoa1t0XSkpYnJlYWt9ZWxzZSBpZihwPT09bC5FWFBPTkVOVF9TSUdOKWlmKGYoa1t0XSl8fCIrIj09PWtbdF18fCItIj09PWtbdF0pcD1sLkVYUE9ORU5UO2Vsc2UgYnJlYWs7ZWxzZSBpZihwPT09bC5FWFBPTkVOVCYmCiFmKGtbdF0pKWJyZWFrO3JldHVybiB0fWZ1bmN0aW9uIGYoayl7cmV0dXJuIjAiPD1rJiYiOSI+PWt9ZnVuY3Rpb24gaChrKXtyZXR1cm4iLyI9PT1rfHwiXyI9PT1rfHxmKGspfWIuY29tcGFyZVRhZ05hbWVzPWZ1bmN0aW9uKGssdCl7bGV0IGw9MCxwPTA7Zm9yKDs7KXtpZihsPT09ay5sZW5ndGgpcmV0dXJuIHA9PT10Lmxlbmd0aD8wOi0xO2lmKHA9PT10Lmxlbmd0aClyZXR1cm4gMTtpZihmKGtbbF0pJiZmKHRbcF0pKXt2YXIgbT1sLG49cDtsPWQoayxsKzEpO3A9ZCh0LHArMSk7bT1wYXJzZUZsb2F0KGsuc2xpY2UobSxsKSk7bj1wYXJzZUZsb2F0KHQuc2xpY2UobixwKSk7aWYobTxuKXJldHVybi0xO2lmKG0+bilyZXR1cm4gMX1lbHNle2lmKGgoa1tsXSkpe2lmKCFoKHRbcF0pKXJldHVybi0xfWVsc2V7aWYoaCh0W3BdKSlyZXR1cm4gMTtpZihrW2xdPHRbcF0pcmV0dXJuLTE7aWYoa1tsXT50W3BdKXJldHVybiAxfWwrKztwKyt9fX19KShyY3x8KHJjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9yZXF1ZXN0TWFuYWdlci5qcwp2YXIgdmM7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHEsdSx4LEEpe2NvbnN0IHk9bmV3IFhNTEh0dHBSZXF1ZXN0O3kub3BlbihxLHUpO3gmJih5LndpdGhDcmVkZW50aWFscz14KTtBJiZ5LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsQSk7cmV0dXJuIHl9ZnVuY3Rpb24gZihxKXtjb25zdCB1PW5ldyBtO2lmKCFxKXJldHVybiB1Lm1ldGhvZFR5cGU9cC5HRVQsdTt1Lm1ldGhvZFR5cGU9cC5QT1NUO3UuYm9keT1oKHEpO3JldHVybiB1fWZ1bmN0aW9uIGgocSl7Y29uc3QgdT1uZXcgRm9ybURhdGE7Zm9yKGxldCB4IGluIHEpeCYmdS5hcHBlbmQoeCxxW3hdKTtyZXR1cm4gdX1jbGFzcyBrIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMubmFtZT0iUmVxdWVzdENhbmNlbGxhdGlvbkVycm9yIn19Yi5SZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3I9aztjbGFzcyB0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IocSl7c3VwZXIocSk7dGhpcy5uYW1lPQoiSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3IiO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQucHJvdG90eXBlKX19Yi5JbnZhbGlkUmVxdWVzdE9wdGlvbnNFcnJvcj10O2NsYXNzIGwgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihxLHUpe3N1cGVyKCk7dGhpcy5tZXNzYWdlPWBSZXF1ZXN0TmV0d29ya0Vycm9yOiAke3Euc3RhdHVzfSBhdCAke3V9YDt0aGlzLm5hbWU9IlJlcXVlc3ROZXR3b3JrRXJyb3IiO3RoaXMucmVxPXE7dGhpcy51cmw9dX19Yi5SZXF1ZXN0TmV0d29ya0Vycm9yPWw7bGV0IHA7KGZ1bmN0aW9uKHEpe3EuR0VUPSJHRVQiO3EuUE9TVD0iUE9TVCJ9KShwPWIuSHR0cE1ldGhvZFR5cGV8fChiLkh0dHBNZXRob2RUeXBlPXt9KSk7Y2xhc3MgbXt2YWxpZGF0ZSgpe2lmKHRoaXMubWV0aG9kVHlwZT09PXAuR0VUJiZ0aGlzLmJvZHkpdGhyb3cgbmV3IHQoImJvZHkgbXVzdCBiZSBtaXNzaW5nIGZvciBhIEdFVCByZXF1ZXN0LiIpO319Yi5SZXF1ZXN0T3B0aW9ucz0KbTtjbGFzcyBue2NvbnN0cnVjdG9yKHE9MUUzLHU9Myl7dGhpcy5fcXVldWU9W107dGhpcy5fbkFjdGl2ZVJlcXVlc3RzPTA7dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzPXE7dGhpcy5fbWF4UmV0cmllcz11fXJlcXVlc3QocSx1KXt1PWYodSk7cmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKHEsdSl9cmVxdWVzdFdpdGhPcHRpb25zKHEsdSl7dS52YWxpZGF0ZSgpO3JldHVybihuZXcgUHJvbWlzZSgoeCxBKT0+e3RoaXMuX3F1ZXVlLnB1c2goe3Jlc29sdmU6eCxyZWplY3Q6QX0pO3RoaXMubGF1bmNoUmVxdWVzdHMoKX0pKS50aGVuKCgpPT50aGlzLnByb21pc2VXaXRoUmV0cmllcyhxLHRoaXMuX21heFJldHJpZXMsdSkpLnRoZW4oeD0+e3RoaXMuX25BY3RpdmVSZXF1ZXN0cy0tO3RoaXMubGF1bmNoUmVxdWVzdHMoKTtyZXR1cm4geH0seD0+eyJSZXF1ZXN0TmV0d29ya0Vycm9yIj09PXgubmFtZSYmKHRoaXMuX25BY3RpdmVSZXF1ZXN0cy0tLHRoaXMubGF1bmNoUmVxdWVzdHMoKSk7CnJldHVybiBQcm9taXNlLnJlamVjdCh4KX0pfWZldGNoKHEsdSl7cmV0dXJuKG5ldyBQcm9taXNlKCh4LEEpPT57dGhpcy5fcXVldWUucHVzaCh7cmVzb2x2ZTp4LHJlamVjdDpBfSk7dGhpcy5sYXVuY2hSZXF1ZXN0cygpfSkpLnRoZW4oKCk9PntsZXQgeD0xO3JldHVybiBuZXcgUHJvbWlzZShBPT57Y29uc3QgeT0oKT0+e2ZldGNoKHEsdSkudGhlbih3PT57IXcub2smJnRoaXMuX21heFJldHJpZXM+eD8oeCsrLHkoKSk6KEEodyksdGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS0sdGhpcy5sYXVuY2hSZXF1ZXN0cygpKX0pfTt5KCl9KX0pfWNsZWFyUXVldWUoKXtmb3IoOzA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9xdWV1ZS5wb3AoKS5yZWplY3QobmV3IGsoIlJlcXVlc3QgY2FuY2VsbGVkIGJ5IGNsZWFyUXVldWUiKSl9YWN0aXZlUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzfW91dHN0YW5kaW5nUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKwp0aGlzLl9xdWV1ZS5sZW5ndGh9bGF1bmNoUmVxdWVzdHMoKXtmb3IoO3RoaXMuX25BY3RpdmVSZXF1ZXN0czx0aGlzLl9uU2ltdWx0YW5lb3VzUmVxdWVzdHMmJjA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9uQWN0aXZlUmVxdWVzdHMrKyx0aGlzLl9xdWV1ZS5wb3AoKS5yZXNvbHZlKCl9cHJvbWlzZVdpdGhSZXRyaWVzKHEsdSx4KXtyZXR1cm4gdGhpcy5fcHJvbWlzZUZyb21VcmwocSx4KS50aGVuKEE9PkEsQT0+MDx1P3RoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHEsdS0xLHgpOlByb21pc2UucmVqZWN0KEEpKX1fcHJvbWlzZUZyb21VcmwocSx1KXtyZXR1cm4gbmV3IFByb21pc2UoKHgsQSk9Pntjb25zdCB5PWQodS5tZXRob2RUeXBlLHEsdS53aXRoQ3JlZGVudGlhbHMsdS5jb250ZW50VHlwZSk7eS5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PT15LnN0YXR1cz94KEpTT04ucGFyc2UoeS5yZXNwb25zZVRleHQpKTpBKG5ldyBsKHkscSkpfTt5Lm9uZXJyb3I9ZnVuY3Rpb24oKXtBKG5ldyBsKHksCnEpKX07dS5ib2R5P3kuc2VuZCh1LmJvZHkpOnkuc2VuZCgpfSl9fWIuUmVxdWVzdE1hbmFnZXI9bn0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3VybFBhdGhIZWxwZXJzLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZikucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5Iil9Yi5hZGRQYXJhbXM9ZnVuY3Rpb24oZixoKXt2YXIgaz1PYmplY3Qua2V5cyhoKS5zb3J0KCkuZmlsdGVyKGw9PnZvaWQgMCE9PWhbbF0pO2lmKCFrLmxlbmd0aClyZXR1cm4gZjtjb25zdCB0PS0xIT09Zi5pbmRleE9mKCI/Iik/Ilx4MjYiOiI/IjtrPVtdLmNvbmNhdCguLi5rLm1hcChsPT57Y29uc3QgcD1oW2xdO3JldHVybihBcnJheS5pc0FycmF5KHApP3A6W3BdKS5tYXAobT0+YCR7bH09JHtkKG0pfWApfSkpLmpvaW4oIlx4MjYiKTtyZXR1cm4gZit0K2t9fSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcm91dGVyLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHQ9ImRhdGEiLGw9bmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSl7Ii8iPT09dFt0Lmxlbmd0aC0xXSYmKHQ9dC5zbGljZSgwLHQubGVuZ3RoLTEpKTtyZXR1cm57ZW52aXJvbm1lbnQ6KCk9PmYodCwiL2Vudmlyb25tZW50IiksZXhwZXJpbWVudHM6KCk9PmYodCwiL2V4cGVyaW1lbnRzIikscGx1Z2luUm91dGU6KHAsbSxuKT0+Zih0KyIvcGx1Z2luIixgLyR7cH0ke219YCxuKSxwbHVnaW5zTGlzdGluZzooKT0+Zih0LCIvcGx1Z2luc19saXN0aW5nIixoKHtbImV4cGVyaW1lbnRhbFBsdWdpbiJdOmwuZ2V0QWxsKCJleHBlcmltZW50YWxQbHVnaW4iKX0pKSxydW5zOigpPT5mKHQsIi9ydW5zIikscnVuc0ZvckV4cGVyaW1lbnQ6cD0+Zih0LCIvZXhwZXJpbWVudF9ydW5zIixoKHtleHBlcmltZW50OlN0cmluZyhwKX0pKX19ZnVuY3Rpb24gZih0LGwscD1uZXcgVVJMU2VhcmNoUGFyYW1zKXt0Kz1sO1N0cmluZyhwKSYmCihsPWwuaW5jbHVkZXMoIj8iKT8iXHgyNiI6Ij8iLHQrPWwrU3RyaW5nKHApKTtyZXR1cm4gdH1mdW5jdGlvbiBoKHQ9e30pe2NvbnN0IGw9T2JqZWN0LmtleXModCkuc29ydCgpLmZpbHRlcihtPT50W21dKSxwPW5ldyBVUkxTZWFyY2hQYXJhbXM7bC5mb3JFYWNoKG09Pntjb25zdCBuPXRbbV07KEFycmF5LmlzQXJyYXkobik/bjpbbl0pLmZvckVhY2gocT0+cC5hcHBlbmQobSxxKSl9KTtyZXR1cm4gcH1sZXQgaz1kKCk7Yi5jcmVhdGVSb3V0ZXI9ZDtiLmdldFJvdXRlcj1mdW5jdGlvbigpe3JldHVybiBrfTtiLnNldFJvdXRlcj1mdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IEVycm9yKCJSb3V0ZXIgcmVxdWlyZWQsIGJ1dCBnb3Q6ICIrdCk7az10fTtiLmNyZWF0ZVNlYXJjaFBhcmFtPWh9KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9iYXNlU3RvcmUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3IoaCl7dGhpcy5saXN0ZW5lcj1ofX1iLkxpc3RlbktleT1kO2NsYXNzIGZ7Y29uc3RydWN0b3IoKXt0aGlzLnJlcXVlc3RNYW5hZ2VyPW5ldyBiLlJlcXVlc3RNYW5hZ2VyKDEpO3RoaXMuX2xpc3RlbmVycz1uZXcgU2V0O3RoaXMuaW5pdGlhbGl6ZWQ9ITF9cmVmcmVzaCgpe3JldHVybiB0aGlzLmxvYWQoKS50aGVuKCgpPT57dGhpcy5pbml0aWFsaXplZD0hMH0pfWFkZExpc3RlbmVyKGgpe2g9bmV3IGQoaCk7dGhpcy5fbGlzdGVuZXJzLmFkZChoKTtyZXR1cm4gaH1yZW1vdmVMaXN0ZW5lckJ5S2V5KGgpe3RoaXMuX2xpc3RlbmVycy5kZWxldGUoaCl9ZW1pdENoYW5nZSgpe3RoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGg9Pnt0cnl7aC5saXN0ZW5lcigpfWNhdGNoKGspe319KX19Yi5CYXNlU3RvcmU9Zn0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2Vudmlyb25tZW50U3RvcmUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBiLkJhc2VTdG9yZXtsb2FkKCl7Y29uc3QgZj1iLmdldFJvdXRlcigpLmVudmlyb25tZW50KCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9Pntjb25zdCBrPXtkYXRhTG9jYXRpb246aC5kYXRhX2xvY2F0aW9uLHdpbmRvd1RpdGxlOmgud2luZG93X3RpdGxlfTt2b2lkIDAhPT1oLmV4cGVyaW1lbnRfbmFtZSYmKGsuZXhwZXJpbWVudE5hbWU9aC5leHBlcmltZW50X25hbWUpO3ZvaWQgMCE9PWguZXhwZXJpbWVudF9kZXNjcmlwdGlvbiYmKGsuZXhwZXJpbWVudERlc2NyaXB0aW9uPWguZXhwZXJpbWVudF9kZXNjcmlwdGlvbik7dm9pZCAwIT09aC5jcmVhdGlvbl90aW1lJiYoay5jcmVhdGlvblRpbWU9aC5jcmVhdGlvbl90aW1lKTtfLmlzRXF1YWwodGhpcy5lbnZpcm9ubWVudCxrKXx8KHRoaXMuZW52aXJvbm1lbnQ9ayx0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXREYXRhTG9jYXRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD8KdGhpcy5lbnZpcm9ubWVudC5kYXRhTG9jYXRpb246IiJ9Z2V0V2luZG93VGl0bGUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LndpbmRvd1RpdGxlOiIifWdldEV4cGVyaW1lbnROYW1lKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5leHBlcmltZW50TmFtZToiIn1nZXRFeHBlcmltZW50RGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmV4cGVyaW1lbnREZXNjcmlwdGlvbjoiIn1nZXRDcmVhdGlvblRpbWUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmNyZWF0aW9uVGltZTpudWxsfX1iLkVudmlyb25tZW50U3RvcmU9ZDtiLmVudmlyb25tZW50U3RvcmU9bmV3IGR9KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9leHBlcmltZW50c1N0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX2V4cGVyaW1lbnRzPVtdfWxvYWQoKXtjb25zdCBmPWIuZ2V0Um91dGVyKCkuZXhwZXJpbWVudHMoKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGYpLnRoZW4oaD0+e18uaXNFcXVhbCh0aGlzLl9leHBlcmltZW50cyxoKXx8KHRoaXMuX2V4cGVyaW1lbnRzPWgsdGhpcy5lbWl0Q2hhbmdlKCkpfSl9Z2V0RXhwZXJpbWVudHMoKXtyZXR1cm4gdGhpcy5fZXhwZXJpbWVudHMuc2xpY2UoKX19Yi5FeHBlcmltZW50c1N0b3JlPWQ7Yi5leHBlcmltZW50c1N0b3JlPW5ldyBkfSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcnVuc1N0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX3J1bnM9W119bG9hZCgpe2NvbnN0IGY9Yi5nZXRSb3V0ZXIoKS5ydW5zKCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9PntfLmlzRXF1YWwodGhpcy5fcnVucyxoKXx8KHRoaXMuX3J1bnM9aCx0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXRSdW5zKCl7cmV0dXJuIHRoaXMuX3J1bnMuc2xpY2UoKX19Yi5SdW5zU3RvcmU9ZDtiLnJ1bnNTdG9yZT1uZXcgZH0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2JhY2tlbmQuanMKKGZ1bmN0aW9uKGIpe2IuVFlQRVM9W107Yi5nZXRSdW5zTmFtZWQ9ZnVuY3Rpb24oZCl7cmV0dXJuIF8ua2V5cyhkKS5zb3J0KHJjLmNvbXBhcmVUYWdOYW1lcyl9O2IuZ2V0VGFncz1mdW5jdGlvbihkKXtyZXR1cm4gXy51bmlvbi5hcHBseShudWxsLF8udmFsdWVzKGQpKS5zb3J0KHJjLmNvbXBhcmVUYWdOYW1lcyl9O2IuZmlsdGVyVGFncz1mdW5jdGlvbihkLGYpe2xldCBoPVtdO2YuZm9yRWFjaChrPT5oPWguY29uY2F0KGRba10pKTtyZXR1cm4gXy51bmlxKGgpLnNvcnQocmMuY29tcGFyZVRhZ05hbWVzKX19KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9jYW5jZWxsZXIuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLmNhbmNlbGxhdGlvbkNvdW50PTB9Y2FuY2VsbGFibGUoZil7Y29uc3QgaD10aGlzLmNhbmNlbGxhdGlvbkNvdW50O3JldHVybiBrPT5mKHt2YWx1ZTprLGNhbmNlbGxlZDp0aGlzLmNhbmNlbGxhdGlvbkNvdW50IT09aH0pfWNhbmNlbEFsbCgpe3RoaXMuY2FuY2VsbGF0aW9uQ291bnQrK319Yi5DYW5jZWxsZXI9ZH0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3RmLWJhY2tlbmQtcG9seW1lci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLWJhY2tlbmQiLF90ZW1wbGF0ZTpudWxsLHRmX2JhY2tlbmQ6Yn0pfSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNhdGVnb3JpemF0aW9uLXV0aWxzL2NhdGVnb3JpemF0aW9uVXRpbHMuanMKdmFyICRjOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChtLG4pe2NvbnN0IHE9KCgpPT57dHJ5e3JldHVybiBuZXcgUmVnRXhwKG4pfWNhdGNoKHUpe3JldHVybiBudWxsfX0pKCk7cmV0dXJue25hbWU6bixtZXRhZGF0YTp7dHlwZTpwLlNFQVJDSF9SRVNVTFRTLHZhbGlkUmVnZXg6ISFxLHVuaXZlcnNhbFJlZ2V4OiIuKiI9PT1ufSxpdGVtczpxP20uZmlsdGVyKHU9PnUubWF0Y2gocSkpOltdfX1mdW5jdGlvbiBmKG0sbj0iLyIpe2NvbnN0IHE9W10sdT17fTttLmZvckVhY2goeD0+e3ZhciBBPXguaW5kZXhPZihuKTtBPTA8PUE/eC5zbGljZSgwLEEpOng7aWYoIXVbQV0pe2NvbnN0IHk9e25hbWU6QSxtZXRhZGF0YTp7dHlwZTpwLlBSRUZJWF9HUk9VUH0saXRlbXM6W119O3VbQV09eTtxLnB1c2goeSl9dVtBXS5pdGVtcy5wdXNoKHgpfSk7cmV0dXJuIHF9ZnVuY3Rpb24gaChtLG49IiIpe249W2QobSxuKV07bT1mKG0pO3JldHVybltdLmNvbmNhdChuLG0pfWZ1bmN0aW9uIGsobSxuLHEpe2NvbnN0IHU9CnZjLmdldFRhZ3MobSk7cT1oKHUscSk7Y29uc3QgeD10KF8ucGljayhtLG4pKTtyZXR1cm4gcS5tYXAoKHtuYW1lOkEsbWV0YWRhdGE6eSxpdGVtczp3fSk9Pih7bmFtZTpBLG1ldGFkYXRhOnksaXRlbXM6dy5tYXAoQz0+KHt0YWc6QyxydW5zOih4LmdldChDKXx8W10pLnNsaWNlKCl9KSl9KSl9ZnVuY3Rpb24gdChtKXtjb25zdCBuPW5ldyBNYXA7T2JqZWN0LmtleXMobSkuZm9yRWFjaChxPT57bVtxXS5mb3JFYWNoKHU9Pntjb25zdCB4PW4uZ2V0KHUpfHxbXTt4LnB1c2gocSk7bi5zZXQodSx4KX0pfSk7cmV0dXJuIG59ZnVuY3Rpb24gbChtLG4pe2NvbnN0IHE9cmMuY29tcGFyZVRhZ05hbWVzKG0udGFnLG4udGFnKTtyZXR1cm4gMCE9cT9xOnJjLmNvbXBhcmVUYWdOYW1lcyhtLnJ1bixuLnJ1bil9bGV0IHA7KGZ1bmN0aW9uKG0pe21bbS5TRUFSQ0hfUkVTVUxUUz0wXT0iU0VBUkNIX1JFU1VMVFMiO21bbS5QUkVGSVhfR1JPVVA9MV09IlBSRUZJWF9HUk9VUCJ9KShwPWIuQ2F0ZWdvcnlUeXBlfHwKKGIuQ2F0ZWdvcnlUeXBlPXt9KSk7Yi5jYXRlZ29yaXplQnlTZWFyY2hRdWVyeT1kO2IuY2F0ZWdvcml6ZUJ5UHJlZml4PWY7Yi5jYXRlZ29yaXplPWg7Yi5jYXRlZ29yaXplVGFncz1rO2IuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucz1mdW5jdGlvbihtLG4scSl7cmV0dXJuIGsobSxuLHEpLm1hcChmdW5jdGlvbih1KXtjb25zdCB4PV8uZmxhdHRlbih1Lml0ZW1zLm1hcCgoe3RhZzpBLHJ1bnM6eX0pPT55Lm1hcCh3PT4oe3RhZzpBLHJ1bjp3fSkpKSk7eC5zb3J0KGwpO3JldHVybntuYW1lOnUubmFtZSxtZXRhZGF0YTp1Lm1ldGFkYXRhLGl0ZW1zOnh9fSl9fSkoJGN8fCgkYz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdsb2JhbHMvZ2xvYmFscy5qcwp2YXIgYWQ7KGZ1bmN0aW9uKGIpe2xldCBkPSExO2Iuc2V0VXNlSGFzaD1mdW5jdGlvbihoKXtkPWh9O2IudXNlSGFzaD1mdW5jdGlvbigpe3JldHVybiBkfTtsZXQgZj0iIjtiLnNldEZha2VIYXNoPWZ1bmN0aW9uKGgpe2Y9aH07Yi5nZXRGYWtlSGFzaD1mdW5jdGlvbigpe3JldHVybiBmfX0pKGFkfHwoYWQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1nbG9iYWxzL2dsb2JhbHMtcG9seW1lci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLWdsb2JhbHMiLF90ZW1wbGF0ZTpudWxsLHRmX2dsb2JhbHM6Yn0pfSkoYWR8fChhZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXN0b3JhZ2UvbGlzdGVuZXJzLmpzCnZhciBwZDsKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3Ioayl7dGhpcy5saXN0ZW5lcj1rfX1iLkxpc3RlbktleT1kO2NvbnN0IGY9bmV3IFNldCxoPW5ldyBTZXQ7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCgpPT57Zi5mb3JFYWNoKGs9PmsubGlzdGVuZXIoKSl9KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic3RvcmFnZSIsKCk9PntoLmZvckVhY2goaz0+ay5saXN0ZW5lcigpKX0pO2IuYWRkSGFzaExpc3RlbmVyPWZ1bmN0aW9uKGspe2s9bmV3IGQoayk7Zi5hZGQoayk7cmV0dXJuIGt9O2IuYWRkU3RvcmFnZUxpc3RlbmVyPWZ1bmN0aW9uKGspe2s9bmV3IGQoayk7aC5hZGQoayk7cmV0dXJuIGt9O2IuZmlyZVN0b3JhZ2VDaGFuZ2VkPWZ1bmN0aW9uKCl7aC5mb3JFYWNoKGs9PmsubGlzdGVuZXIoKSl9O2IucmVtb3ZlSGFzaExpc3RlbmVyQnlLZXk9ZnVuY3Rpb24oayl7Zi5kZWxldGUoayl9O2IucmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXk9ZnVuY3Rpb24oayl7aC5kZWxldGUoayl9fSkocGR8fAoocGQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zdG9yYWdlL3N0b3JhZ2UuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobixxKXtmdW5jdGlvbiB1KHcsQz17fSl7Y29uc3Qge2RlZmF1bHRWYWx1ZTpHLHVzZUxvY2FsU3RvcmFnZTpEPSExfT1DO3c9RD93aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odyk6bChoKCkpW3ddO3JldHVybiB2b2lkIDA9PXc/Xy5jbG9uZURlZXAoRyk6bih3KX1mdW5jdGlvbiB4KHcsQyxHPXt9KXtjb25zdCB7ZGVmYXVsdFZhbHVlOkQsdXNlTG9jYWxTdG9yYWdlOkI9ITEsdXNlTG9jYXRpb25SZXBsYWNlOkk9ITF9PUc7Rz1xKEMpO0I/KHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh3LEcpLGIuZmlyZVN0b3JhZ2VDaGFuZ2VkKCkpOl8uaXNFcXVhbChDLHUodyx7dXNlTG9jYWxTdG9yYWdlOkJ9KSl8fChfLmlzRXF1YWwoQyxEKT9wKHcpOihDPWwoaCgpKSxDW3ddPUcsayh0KEMpLEkpKSl9Y29uc3QgQT1bXSx5PVtdO3JldHVybntnZXQ6dSxzZXQ6eCxnZXRJbml0aWFsaXplcjpmdW5jdGlvbih3LEMpe2NvbnN0IEc9T2JqZWN0LmFzc2lnbih7ZGVmYXVsdFZhbHVlOkMuZGVmYXVsdFZhbHVlLApwb2x5bWVyUHJvcGVydHk6dyx1c2VMb2NhbFN0b3JhZ2U6ITF9LEMpO3JldHVybiBmdW5jdGlvbigpe2NvbnN0IEQ9Zih0aGlzLHcpLEI9KCk9Pntjb25zdCBOPXUoRCxHKTtfLmlzRXF1YWwoTix0aGlzW0cucG9seW1lclByb3BlcnR5XSl8fCh0aGlzW0cucG9seW1lclByb3BlcnR5XT1OKX0sST0oRy51c2VMb2NhbFN0b3JhZ2U/Yi5hZGRTdG9yYWdlTGlzdGVuZXI6Yi5hZGRIYXNoTGlzdGVuZXIpKCgpPT5CKCkpO0cudXNlTG9jYWxTdG9yYWdlP3kucHVzaChJKTpBLnB1c2goSSk7QigpO3JldHVybiB0aGlzW0cucG9seW1lclByb3BlcnR5XX19LGdldE9ic2VydmVyOmZ1bmN0aW9uKHcsQyl7Y29uc3QgRz1PYmplY3QuYXNzaWduKHtkZWZhdWx0VmFsdWU6Qy5kZWZhdWx0VmFsdWUscG9seW1lclByb3BlcnR5OncsdXNlTG9jYWxTdG9yYWdlOiExfSxDKTtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBEPWYodGhpcyx3KTt4KEQsdGhpc1tHLnBvbHltZXJQcm9wZXJ0eV0sRyl9fSxkaXNwb3NlQmluZGluZzpmdW5jdGlvbigpe0EuZm9yRWFjaCh3PT4KYi5yZW1vdmVIYXNoTGlzdGVuZXJCeUtleSh3KSk7eS5mb3JFYWNoKHc9PmIucmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXkodykpfX19ZnVuY3Rpb24gZihuLHEpe249bltiLkRJU0FNQklHVUFUT1JdO3JldHVybihudWxsPT1uP1txXTpbbixxXSkuam9pbigiLiIpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gYWQudXNlSGFzaCgpP3dpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpOmFkLmdldEZha2VIYXNoKCl9ZnVuY3Rpb24gayhuLHE9ITEpe2FkLnVzZUhhc2goKT9xP3dpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCIjIituKTp3aW5kb3cubG9jYXRpb24uaGFzaD1uOmFkLnNldEZha2VIYXNoKG4pfWZ1bmN0aW9uIHQobil7bGV0IHE9IiI7dm9pZCAwIT09bltiLlRBQl0mJihxKz1uW2IuVEFCXSk7Y29uc3QgdT1PYmplY3Qua2V5cyhuKS5tYXAoeD0+W3gsblt4XV0pLmZpbHRlcih4PT54WzBdIT09Yi5UQUIpLm1hcCh4PT5lbmNvZGVVUklDb21wb25lbnQoeFswXSkrIlx4M2QiK2VuY29kZVVSSUNvbXBvbmVudCh4WzFdKSkuam9pbigiXHgyNiIpOwpyZXR1cm4gMDx1Lmxlbmd0aD9xKyJceDI2Iit1OnF9ZnVuY3Rpb24gbChuKXtjb25zdCBxPXt9O24uc3BsaXQoIlx4MjYiKS5mb3JFYWNoKHU9Pnt1PXUuc3BsaXQoIlx4M2QiKTsxPT09dS5sZW5ndGg/cVtiLlRBQl09dVswXToyPT09dS5sZW5ndGgmJihxW2RlY29kZVVSSUNvbXBvbmVudCh1WzBdKV09ZGVjb2RlVVJJQ29tcG9uZW50KHVbMV0pKX0pO3JldHVybiBxfWZ1bmN0aW9uIHAobil7Y29uc3QgcT1sKGgoKSk7ZGVsZXRlIHFbbl07ayh0KHEpKX1iLlRBQj0iX190YWJfXyI7Yi5ESVNBTUJJR1VBVE9SPSJkaXNhbWJpZ3VhdG9yIjtiLnVybERpY3Q9bChoKCkpO2IuYWRkSGFzaExpc3RlbmVyKCgpPT57Yi51cmxEaWN0PWwoaCgpKX0pO3ZhciBtPWQobj0+bixuPT5uKTtiLmdldFN0cmluZz1tLmdldDtiLnNldFN0cmluZz1tLnNldDtiLmdldFN0cmluZ0luaXRpYWxpemVyPW0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXRTdHJpbmdPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZVN0cmluZ0JpbmRpbmc9Cm0uZGlzcG9zZUJpbmRpbmc7bT1kKG49PiJ0cnVlIj09PW4/ITA6ImZhbHNlIj09PW4/ITE6dm9pZCAwLG49Pm4udG9TdHJpbmcoKSk7Yi5nZXRCb29sZWFuPW0uZ2V0O2Iuc2V0Qm9vbGVhbj1tLnNldDtiLmdldEJvb2xlYW5Jbml0aWFsaXplcj1tLmdldEluaXRpYWxpemVyO2IuZ2V0Qm9vbGVhbk9ic2VydmVyPW0uZ2V0T2JzZXJ2ZXI7Yi5kaXNwb3NlQm9vbGVhbkJpbmRpbmc9bS5kaXNwb3NlQmluZGluZzttPWQobj0+K24sbj0+bi50b1N0cmluZygpKTtiLmdldE51bWJlcj1tLmdldDtiLnNldE51bWJlcj1tLnNldDtiLmdldE51bWJlckluaXRpYWxpemVyPW0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXROdW1iZXJPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZU51bWJlckJpbmRpbmc9bS5kaXNwb3NlQmluZGluZzttPWQobj0+SlNPTi5wYXJzZShhdG9iKG4pKSxuPT5idG9hKEpTT04uc3RyaW5naWZ5KG4pKSk7Yi5nZXRPYmplY3Q9bS5nZXQ7Yi5zZXRPYmplY3Q9bS5zZXQ7Yi5nZXRPYmplY3RJbml0aWFsaXplcj0KbS5nZXRJbml0aWFsaXplcjtiLmdldE9iamVjdE9ic2VydmVyPW0uZ2V0T2JzZXJ2ZXI7Yi5kaXNwb3NlT2JqZWN0QmluZGluZz1tLmRpc3Bvc2VCaW5kaW5nO2IubWFrZUJpbmRpbmdzPWQ7Yi5taWdyYXRlTGVnYWN5VVJMU2NoZW1lPWZ1bmN0aW9uKCl7Y29uc3Qgbj1uZXcgU2V0KCJleGFtcGxlc1BhdGggaGlkZU1vZGVsUGFuZTIgbW9kZWxOYW1lMSBtb2RlbE5hbWUyIGluZmVyZW5jZUFkZHJlc3MxIGluZmVyZW5jZUFkZHJlc3MyIG1vZGVsVHlwZSBtb2RlbFZlcnNpb24xIG1vZGVsVmVyc2lvbjIgbW9kZWxTaWduYXR1cmUxIG1vZGVsU2lnbmF0dXJlMiBtYXhFeGFtcGxlcyBsYWJlbFZvY2FiUGF0aCBtdWx0aUNsYXNzIHNlcXVlbmNlRXhhbXBsZXMgbWF4Q2xhc3Nlc1RvRGlzcGxheSBzYW1wbGluZ09kZHMgdXNlUHJlZGljdEFwaSBwcmVkaWN0SW5wdXRUZW5zb3IgcHJlZGljdE91dHB1dFRlbnNvciIuc3BsaXQoIiAiKSkscT1sKGgoKSk7aWYoIndoYXRpZiI9PT1xW2IuVEFCXSlmb3IobGV0IHUgb2Ygbil1IGluCnEmJihxW2BwLndoYXRpZi4ke3V9YF09cVt1XSk7ayh0KHEpKTt0aGlzLnVybERpY3Q9cX19KShwZHx8KHBkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc3RvcmFnZS90Zi1zdG9yYWdlLXBvbHltZXIuanMKKGZ1bmN0aW9uKGIpe1BvbHltZXIoe2lzOiJ0Zi1zdG9yYWdlIixfdGVtcGxhdGU6bnVsbCx0Zl9zdG9yYWdlOmJ9KX0pKHBkfHwocGQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXRlZ29yaXphdGlvbi11dGlscy90Zi10YWctZmlsdGVyZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGFnLWZpbHRlcmVyIixwcm9wZXJ0aWVzOnt0YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLG5vdGlmeTohMCxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIoX3RhZ0ZpbHRlcikifSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZTpwZC5nZXRTdHJpbmdJbml0aWFsaXplcigidGFnRmlsdGVyIix7ZGVmYXVsdFZhbHVlOiIiLHVzZUxvY2FsU3RvcmFnZTohMSxwb2x5bWVyUHJvcGVydHk6Il90YWdGaWx0ZXIifSksb2JzZXJ2ZXI6Il90YWdGaWx0ZXJPYnNlcnZlciJ9fSxfdGFnRmlsdGVyT2JzZXJ2ZXI6cGQuZ2V0U3RyaW5nT2JzZXJ2ZXIoInRhZ0ZpbHRlciIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITEscG9seW1lclByb3BlcnR5OiJfdGFnRmlsdGVyIn0pLF9jb21wdXRlVGFnRmlsdGVyKCl7cmV0dXJuIHRoaXMuX3RhZ0ZpbHRlcn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kYXNoYm9hcmQtY29tbW9uL2FycmF5LXVwZGF0ZS1oZWxwZXIuanMKdmFyIHFkOyhmdW5jdGlvbihiKXtiLkFycmF5VXBkYXRlSGVscGVyPXt1cGRhdGVBcnJheVByb3AoZCxmLGgpe2xldCBrPXRoaXMuZ2V0KGQpO2lmKCFBcnJheS5pc0FycmF5KGYpKXRocm93IFJhbmdlRXJyb3IoYEV4cGVjdGVkIG5ldyB2YWx1ZSB0byAnJHtkfScgdG8gYmUgYW4gYXJyYXkuYCk7QXJyYXkuaXNBcnJheShrKXx8KGs9W10sdGhpcy5zZXQoZCxrKSk7Y29uc3QgdD1uZXcgU2V0KGYubWFwKChtLG4pPT5oKG0sbikpKTtsZXQgbD0wLHA9MDtmb3IoO2w8ay5sZW5ndGgmJnA8Zi5sZW5ndGg7KXQuaGFzKGgoa1tsXSxsKSk/KGgoa1tsXSxsKT09aChmW3BdLHApP3RoaXMuc2V0KGAke2R9LiR7bH1gLGZbcF0pOnRoaXMuc3BsaWNlKGQsbCwwLGZbcF0pLHArKyxsKyspOnRoaXMuc3BsaWNlKGQsbCwxKTtsPGsubGVuZ3RoJiZ0aGlzLnNwbGljZShkLGwpO3A8Zi5sZW5ndGgmJnRoaXMucHVzaChkLC4uLmYuc2xpY2UocCkpfX19KShxZHx8KHFkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1kYXNoYm9hcmQtbGF5b3V0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRhc2hib2FyZC1sYXlvdXQifSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1vcHRpb24tc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtb3B0aW9uLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntuYW1lOlN0cmluZyxzZWxlY3RlZElkOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWxlY3RlZElkQ2hhbmdlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLmxpc3RlbihiLCJ0YXAiLCJfc2VsZWN0VGFyZ2V0Iil9LmJpbmQodGhpcykpfSl9LF9zZWxlY3RUYXJnZXQ6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZElkPWIuY3VycmVudFRhcmdldC5pZH0sX3NlbGVjdGVkSWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCIjIit0aGlzLnNlbGVjdGVkSWQpO2ImJih0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihkKXtkLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIil9KSxiLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tY29sbGFwc2UvaXJvbi1jb2xsYXBzZS5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWNvbGxhcHNlIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ob3Jpem9udGFsQ2hhbmdlZCJ9LG9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSx0cmFuc2l0aW9uaW5nOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxub0FuaW1hdGlvbjp7dHlwZTpCb29sZWFufSxfZGVzaXJlZFNpemU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sZ2V0IGRpbWVuc2lvbigpe3JldHVybiB0aGlzLmhvcml6b250YWw/IndpZHRoIjoiaGVpZ2h0In0sZ2V0IF9kaW1lbnNpb25NYXgoKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJtYXhXaWR0aCI6Im1heEhlaWdodCJ9LGdldCBfZGltZW5zaW9uTWF4Q3NzKCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8ibWF4LXdpZHRoIjoKIm1heC1oZWlnaHQifSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhpZGRlbiI6InRydWUifSxsaXN0ZW5lcnM6e3RyYW5zaXRpb25lbmQ6Il9vblRyYW5zaXRpb25FbmQifSx0b2dnbGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hdGhpcy5vcGVuZWR9LHNob3c6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0saGlkZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPSExfSx1cGRhdGVTaXplOmZ1bmN0aW9uKGIsZCl7Yj0iYXV0byI9PT1iPyIiOmI7ZD1kJiYhdGhpcy5ub0FuaW1hdGlvbiYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9kZXNpcmVkU2l6ZSE9PWI7dGhpcy5fZGVzaXJlZFNpemU9Yjt0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKTtkJiYoZD10aGlzLl9jYWxjU2l6ZSgpLCIiPT09YiYmKHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT0iIixiPXRoaXMuX2NhbGNTaXplKCkpLHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT1kLHRoaXMuc2Nyb2xsVG9wPQp0aGlzLnNjcm9sbFRvcCx0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCEwKSxkPWIhPT1kKTt0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09YjtkfHx0aGlzLl90cmFuc2l0aW9uRW5kKCl9LGVuYWJsZVRyYW5zaXRpb246ZnVuY3Rpb24oYil7UG9seW1lci5CYXNlLl93YXJuKCJgZW5hYmxlVHJhbnNpdGlvbigpYCBpcyBkZXByZWNhdGVkLCB1c2UgYG5vQW5pbWF0aW9uYCBpbnN0ZWFkLiIpO3RoaXMubm9BbmltYXRpb249IWJ9LF91cGRhdGVUcmFuc2l0aW9uOmZ1bmN0aW9uKGIpe3RoaXMuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWImJiF0aGlzLm5vQW5pbWF0aW9uPyIiOiIwcyJ9LF9ob3Jpem9udGFsQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5PXRoaXMuX2RpbWVuc2lvbk1heENzczt0aGlzLnN0eWxlWyJtYXhXaWR0aCI9PT10aGlzLl9kaW1lbnNpb25NYXg/Im1heEhlaWdodCI6Im1heFdpZHRoIl09IiI7dGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPwoiYXV0byI6IjBweCIsITEpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsIXRoaXMub3BlbmVkKTt0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCEwKTt0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLWNsb3NlZCIsITEpO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2Utb3BlbmVkIiwhMSk7dGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPyJhdXRvIjoiMHB4IiwhMCk7dGhpcy5vcGVuZWQmJnRoaXMuZm9jdXMoKX0sX3RyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09dGhpcy5fZGVzaXJlZFNpemU7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1jbG9zZWQiLCF0aGlzLm9wZW5lZCk7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1vcGVuZWQiLHRoaXMub3BlbmVkKTt0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKTt0aGlzLm5vdGlmeVJlc2l6ZSgpOwp0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCExKX0sX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihiKXtQb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0PT09dGhpcyYmdGhpcy5fdHJhbnNpdGlvbkVuZCgpfSxfY2FsY1NpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0aGlzLmRpbWVuc2lvbl0rInB4In19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wYWdpbmF0ZWQtdmlldy90Zi1kb20tcmVwZWF0Lmh0bWwuanMKdmFyIEpkOwooZnVuY3Rpb24oYil7Yi5UZkRvbVJlcGVhdEJlaGF2aW9yPVtxZC5BcnJheVVwZGF0ZUhlbHBlcix7cHJvcGVydGllczp7YXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0sX2NvbnRlbnRBY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2RvbUJvb3RzdHJhcHBlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY3Rvcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+bnVsbH0sX3JlbmRlcmVkSXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfcmVuZGVyZWRUZW1wbGF0ZUluc3Q6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfbHJ1Q2FjaGVkSXRlbXM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfY2FjaGVTaXplOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2dldEl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmQ9PkpTT04uc3RyaW5naWZ5KGQpfX0sb2JzZXJ2ZXJzOlsiX2Jvb3RzdHJhcERvbShfaXRlbXNSZW5kZXJlZCwgaXNBdHRhY2hlZCkiLCJfdXBkYXRlRG9tKF9yZW5kZXJlZEl0ZW1zLiosIF9kb21Cb290c3RyYXBwZWQpIiwKIl91cGRhdGVBY3RpdmUoX2NvbnRlbnRBY3RpdmUpIiwiX3RyaW1DYWNoZShfY2FjaGVTaXplKSJdLHNldENhY2hlU2l6ZShkKXt0aGlzLl9jYWNoZVNpemU9ZH0sc2V0R2V0SXRlbUtleShkKXt0aGlzLl9nZXRJdGVtS2V5PWR9LHVwZGF0ZURvbShkKXt0aGlzLnVwZGF0ZUFycmF5UHJvcCgiX3JlbmRlcmVkSXRlbXMiLGQsdGhpcy5fZ2V0SXRlbUtleSl9LF9lbnN1cmVUZW1wbGF0aXplZCgpe2lmKCF0aGlzLmlzQXR0YWNoZWQpcmV0dXJuITE7dGhpcy5fY3Rvcnx8KHRoaXMuX2N0b3I9UG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGhpcy5xdWVyeVNlbGVjdG9yKCJ0ZW1wbGF0ZSIpLHRoaXMse3BhcmVudE1vZGVsOiEwLGluc3RhbmNlUHJvcHM6e1t0aGlzLmFzXTohMCxhY3RpdmU6dGhpcy5fY29udGVudEFjdGl2ZX0sZm9yd2FyZEhvc3RQcm9wOmZ1bmN0aW9uKGQsZil7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZm9yRWFjaChoPT57aC5mb3J3YXJkSG9zdFByb3AoZCwKZil9KX19KSk7cmV0dXJuITB9LF9ib290c3RyYXBEb20oKXt0aGlzLl9pdGVtc1JlbmRlcmVkJiZ0aGlzLl9lbnN1cmVUZW1wbGF0aXplZCgpJiYhdGhpcy5fZG9tQm9vdHN0cmFwcGVkJiYoQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKS5mb3JFYWNoKGQ9PntQb2x5bWVyLmRvbSh0aGlzKS5yZW1vdmVDaGlsZChkKX0pLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmNsZWFyKCksdGhpcy5fcmVuZGVyZWRJdGVtcy5mb3JFYWNoKChkLGYpPT50aGlzLl9pbnNlcnRJdGVtKGQsZikpLHRoaXMuX2RvbUJvb3RzdHJhcHBlZD0hMCl9LF91cGRhdGVBY3RpdmUoKXt0aGlzLl9kb21Cb290c3RyYXBwZWQmJkFycmF5LmZyb20odGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QudmFsdWVzKCkpLmZvckVhY2goZD0+e2Qubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKX0pfSxfdXBkYXRlRG9tKGQpe2lmKHRoaXMuX2RvbUJvb3RzdHJhcHBlZCYmIl9yZW5kZXJlZEl0ZW1zIiE9ZC5wYXRoJiYKIl9yZW5kZXJlZEl0ZW1zLmxlbmd0aCIhPWQucGF0aClpZigiX3JlbmRlcmVkSXRlbXMuc3BsaWNlcyI9PT1kLnBhdGgpZC52YWx1ZS5pbmRleFNwbGljZXMuZm9yRWFjaChmPT57Y29uc3QgaD1mLmluZGV4LGs9Zi5hZGRlZENvdW50LHQ9Zi5vYmplY3Q7Zi5yZW1vdmVkLmZvckVhY2gobD0+e3RoaXMuX3JlbW92ZUl0ZW0obCx0aGlzLmNoaWxkcmVuW2hdKX0pO3Quc2xpY2UoaCxoK2spLmZvckVhY2goKGwscCk9PnRoaXMuX2luc2VydEl0ZW0obCxoK3ApKTt0aGlzLl90cmltQ2FjaGUoKX0pO2Vsc2V7Y29uc3QgZj10aGlzLl9nZXRJdGVtS2V5KGQudmFsdWUpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmhhcyhmKT90aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoZikubm90aWZ5UGF0aCh0aGlzLmFzLGQudmFsdWUpOmNvbnNvbGUud2FybihgRXhwZWN0ZWQgJyR7Zn0nIHRvIGV4aXN0IGluIHRoZSBET00gYnV0IGArImNvdWxkIG5vdCBmaW5kIG9uZS4iKX19LF9pbnNlcnRJdGVtKGQsCmYpe2lmKCF0aGlzLl9lbnN1cmVUZW1wbGF0aXplZCgpKXRocm93IEVycm9yKCJFeHBlY3RlZCB0ZW1wbGF0aXplZCBiZWZvcmUgaW5zZXJ0aW5nIGFuIGl0ZW0iKTtjb25zdCBoPXRoaXMuX2dldEl0ZW1LZXkoZCk7aWYodGhpcy5fbHJ1Q2FjaGVkSXRlbXMuaGFzKGgpKWQ9dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZ2V0KGgpLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmRlbGV0ZShoKSx0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoaCkubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKTtlbHNle2NvbnN0IGs9bmV3IHRoaXMuX2N0b3Ioe1t0aGlzLmFzXTpkLGFjdGl2ZTp0aGlzLl9jb250ZW50QWN0aXZlfSk7ZD1rLnJvb3Q7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3Quc2V0KGgsayl9dGhpcy5jaGlsZHJlbltmXT9Qb2x5bWVyLmRvbSh0aGlzKS5pbnNlcnRCZWZvcmUoZCx0aGlzLmNoaWxkcmVuW2ZdKTooKGQubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERT8KQXJyYXkuZnJvbShkLmNoaWxkcmVuKTpbZF0pLmZvckVhY2goaz0+ay5zZXRBdHRyaWJ1dGUoInNsb3QiLCJpdGVtcyIpKSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChkKSl9LF9yZW1vdmVJdGVtKGQsZil7UG9seW1lci5kb20oZi5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZChmKTtkPXRoaXMuX2dldEl0ZW1LZXkoZCk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuc2V0KGQsZik7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KGQpLm5vdGlmeVBhdGgoImFjdGl2ZSIsITEpfSxfdHJpbUNhY2hlKCl7Zm9yKDt0aGlzLl9scnVDYWNoZWRJdGVtcy5zaXplPnRoaXMuX2NhY2hlU2l6ZTspe2NvbnN0IFtkXT10aGlzLl9scnVDYWNoZWRJdGVtcy5rZXlzKCk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZGVsZXRlKGQpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmRlbGV0ZShkKX19fV19KShKZHx8KEpkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGFnaW5hdGVkLXZpZXcvcGFnaW5hdGVkVmlld1N0b3JlLmpzCnZhciBuZTsKKGZ1bmN0aW9uKGIpe2xldCBkPW51bGw7Y29uc3QgZj1uZXcgU2V0O2IuYWRkTGltaXRMaXN0ZW5lcj1mdW5jdGlvbihoKXtmLmFkZChoKX07Yi5yZW1vdmVMaW1pdExpc3RlbmVyPWZ1bmN0aW9uKGgpe2YuZGVsZXRlKGgpfTtiLmdldExpbWl0PWZ1bmN0aW9uKCl7bnVsbD09ZCYmKGQ9cGQuZ2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0Iix7dXNlTG9jYWxTdG9yYWdlOiEwfSksbnVsbD09ZHx8IWlzRmluaXRlKGQpfHwwPj1kKSYmKGQ9MTIpO3JldHVybiBkfTtiLnNldExpbWl0PWZ1bmN0aW9uKGgpe2lmKGghPT1NYXRoLmZsb29yKGgpKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBnb3Q6ICR7aH1gKTtpZigwPj1oKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlLCBidXQgZ290OiAke2h9YCk7aCE9PWQmJihkPWgscGQuc2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0IixkLAp7dXNlTG9jYWxTdG9yYWdlOiEwfSksZi5mb3JFYWNoKGs9PntrKCl9KSl9fSkobmV8fChuZT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3RmLXBhZ2luYXRlZC12aWV3LXN0b3JlLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXBhZ2luYXRlZC12aWV3LXN0b3JlIixfdGVtcGxhdGU6bnVsbCx0Zl9wYWdpbmF0ZWRfdmlldzpuZX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Iixwcm9wZXJ0aWVzOntjYXRlZ29yeTpPYmplY3QsaW5pdGlhbE9wZW5lZDpCb29sZWFuLG9wZW5lZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMH0sX2NvbnRlbnRBY3RpdmU6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVDb250ZW50QWN0aXZlKG9wZW5lZCkifSxkaXNhYmxlUGFnaW5hdGlvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY291bnQ6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUNvdW50KGNhdGVnb3J5Lml0ZW1zLiopIn0sX2hhc011bHRpcGxlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzTXVsdGlwbGUoX2NvdW50KSJ9LF9wYW5lUmVuZGVyZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVQYW5lUmVuZGVyZWQoY2F0ZWdvcnkpIixvYnNlcnZlcjoiX29uUGFuZVJlbmRlcmVkQ2hhbmdlZCJ9LF9pdGVtc1JlbmRlcmVkOnt0eXBlOkJvb2xlYW4sCmNvbXB1dGVkOiJfY29tcHV0ZUl0ZW1zUmVuZGVyZWQob3BlbmVkLCBfcGFuZVJlbmRlcmVkKSJ9LF9pc1NlYXJjaFJlc3VsdHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEudHlwZSkifSxfaXNJbnZhbGlkU2VhcmNoUmVzdWx0czp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUlzSW52YWxpZFNlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEpIn0sX2lzVW5pdmVyc2FsU2VhcmNoUXVlcnk6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5KGNhdGVnb3J5Lm1ldGFkYXRhKSJ9LGdldENhdGVnb3J5SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Yj0+SlNPTi5zdHJpbmdpZnkoYiksb2JzZXJ2ZXI6Il9nZXRDYXRlZ29yeUl0ZW1LZXlDaGFuZ2VkIn0sX2xpbWl0Ont0eXBlOk51bWJlcix2YWx1ZToxMixvYnNlcnZlcjoiX2xpbWl0Q2hhbmdlZCJ9LApfYWN0aXZlSW5kZXg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9jdXJyZW50UGFnZTp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFBhZ2UoX2xpbWl0LCBfYWN0aXZlSW5kZXgpIn0sX3BhZ2VDb3VudDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlUGFnZUNvdW50KGNhdGVnb3J5Lml0ZW1zLiosIF9saW1pdCkifSxfbXVsdGlwbGVQYWdlc0V4aXN0Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlTXVsdGlwbGVQYWdlc0V4aXN0KF9wYWdlQ291bnQsIGRpc2FibGVQYWdpbmF0aW9uKSJ9LF9oYXNQcmV2aW91c1BhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNQcmV2aW91c1BhZ2UoX2N1cnJlbnRQYWdlKSJ9LF9oYXNOZXh0UGFnZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc05leHRQYWdlKF9jdXJyZW50UGFnZSwgX3BhZ2VDb3VudCkifSxfaW5wdXRXaWR0aDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlSW5wdXRXaWR0aChfcGFnZUNvdW50KSIsCm9ic2VydmVyOiJfdXBkYXRlSW5wdXRXaWR0aCJ9LF9wYWdlSW5wdXRWYWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUGFnZUlucHV0VmFsdWUoX3BhZ2VJbnB1dEZvY3VzZWQsIF9wYWdlSW5wdXRSYXdWYWx1ZSwgX2N1cnJlbnRQYWdlKSIsb2JzZXJ2ZXI6Il91cGRhdGVQYWdlSW5wdXRWYWx1ZSJ9LF9wYWdlSW5wdXRSYXdWYWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9wYWdlSW5wdXRGb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfY2xhbXBBY3RpdmVJbmRleChjYXRlZ29yeS5pdGVtcy4qKSIsIl91cGRhdGVSZW5kZXJlZEl0ZW1zKF9pdGVtc1JlbmRlcmVkLCBjYXRlZ29yeS5pdGVtcy4qLCBfbGltaXQsIF9hY3RpdmVJbmRleCwgX3BhZ2VDb3VudCwgZGlzYWJsZVBhZ2luYXRpb24pIl0sYmVoYXZpb3JzOltKZC5UZkRvbVJlcGVhdEJlaGF2aW9yXSxfY29tcHV0ZUNvdW50KCl7cmV0dXJuIHRoaXMuY2F0ZWdvcnkuaXRlbXMubGVuZ3RofSwKX2NvbXB1dGVIYXNNdWx0aXBsZSgpe3JldHVybiAxPHRoaXMuX2NvdW50fSxfdG9nZ2xlUGFuZSgpe3RoaXMuX3NldE9wZW5lZCghdGhpcy5vcGVuZWQpfSxfY29tcHV0ZUNvbnRlbnRBY3RpdmUoKXtyZXR1cm4gdGhpcy5vcGVuZWR9LF9vblBhbmVSZW5kZXJlZENoYW5nZWQoYixkKXtiJiZiIT09ZCYmdGhpcy4kLmlmUmVuZGVyZWQucmVuZGVyKCl9LF9jb21wdXRlUGFuZVJlbmRlcmVkKGIpe3JldHVybiEoYi5tZXRhZGF0YS50eXBlPT09JGMuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTJiYiIj09PWIubmFtZSl9LF9jb21wdXRlSXRlbXNSZW5kZXJlZCgpe3JldHVybiB0aGlzLl9wYW5lUmVuZGVyZWQmJnRoaXMub3BlbmVkfSxfY29tcHV0ZUlzU2VhcmNoUmVzdWx0cyhiKXtyZXR1cm4gYj09PSRjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUU30sX2NvbXB1dGVJc0ludmFsaWRTZWFyY2hSZXN1bHRzKGIpe3JldHVybiBiLnR5cGU9PT0kYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFMmJgohYi52YWxpZFJlZ2V4fSxfY29tcHV0ZUlzVW5pdmVyc2FsU2VhcmNoUXVlcnkoYil7cmV0dXJuIGIudHlwZT09PSRjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUyYmYi51bml2ZXJzYWxSZWdleH0sX2lzQ29tcG9zaXRlU2VhcmNoKCl7Y29uc3QgYj10aGlzLmNhdGVnb3J5Lm1ldGFkYXRhLnR5cGU7cmV0dXJuIHRoaXMuY2F0ZWdvcnkubWV0YWRhdGEuY29tcG9zaXRlU2VhcmNoJiZiPT09JGMuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTfSxyZWFkeSgpe3RoaXMuX3NldE9wZW5lZChudWxsPT10aGlzLmluaXRpYWxPcGVuZWQ/ITA6dGhpcy5pbml0aWFsT3BlbmVkKTt0aGlzLl9saW1pdExpc3RlbmVyPSgpPT57dGhpcy5zZXQoIl9saW1pdCIsbmUuZ2V0TGltaXQoKSl9O25lLmFkZExpbWl0TGlzdGVuZXIodGhpcy5fbGltaXRMaXN0ZW5lcik7dGhpcy5fbGltaXRMaXN0ZW5lcigpfSxkZXRhY2hlZCgpe25lLnJlbW92ZUxpbWl0TGlzdGVuZXIodGhpcy5fbGltaXRMaXN0ZW5lcil9LApfdXBkYXRlUmVuZGVyZWRJdGVtcyhiLGQsZixoLGssdCl7YiYmKGI9TWF0aC5mbG9vcihoL2YpLGQ9dGhpcy5jYXRlZ29yeS5pdGVtc3x8W10sdGhpcy51cGRhdGVEb20odD9kOmQuc2xpY2UoYipmLChiKzEpKmYpLHRoaXMuZ2V0Q2F0ZWdvcnlJdGVtS2V5KSl9LF9saW1pdENoYW5nZWQoYil7dGhpcy5zZXRDYWNoZVNpemUoMipiKX0sX2dldENhdGVnb3J5SXRlbUtleUNoYW5nZWQoKXt0aGlzLnNldEdldEl0ZW1LZXkodGhpcy5nZXRDYXRlZ29yeUl0ZW1LZXkpfSxfY29tcHV0ZUN1cnJlbnRQYWdlKGIsZCl7cmV0dXJuIE1hdGguZmxvb3IoZC9iKSsxfSxfY29tcHV0ZVBhZ2VDb3VudChiLGQpe3JldHVybiB0aGlzLmNhdGVnb3J5P01hdGguY2VpbCh0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aC9kKTowfSxfY29tcHV0ZU11bHRpcGxlUGFnZXNFeGlzdChiLGQpe3JldHVybiFkJiYxPGJ9LF9jb21wdXRlSGFzUHJldmlvdXNQYWdlKGIpe3JldHVybiAxPGJ9LF9jb21wdXRlSGFzTmV4dFBhZ2UoYiwKZCl7cmV0dXJuIGI8ZH0sX2NvbXB1dGVJbnB1dFdpZHRoKGIpe3JldHVybmBjYWxjKCR7Yi50b1N0cmluZygpLmxlbmd0aH1lbSArIDIwcHgpYH0sX3NldEFjdGl2ZUluZGV4KGIpe2NvbnN0IGQ9KHRoaXMuY2F0ZWdvcnkuaXRlbXN8fFtdKS5sZW5ndGgtMTtiPmQmJihiPWQpOzA+YiYmKGI9MCk7dGhpcy5zZXQoIl9hY3RpdmVJbmRleCIsYil9LF9jbGFtcEFjdGl2ZUluZGV4KCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgpfSxfcGVyZm9ybVByZXZpb3VzUGFnZSgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4LXRoaXMuX2xpbWl0KX0sX3BlcmZvcm1OZXh0UGFnZSgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4K3RoaXMuX2xpbWl0KX0sX2NvbXB1dGVQYWdlSW5wdXRWYWx1ZShiLGQsZil7cmV0dXJuIGI/ZDpmLnRvU3RyaW5nKCl9LF9oYW5kbGVQYWdlSW5wdXRFdmVudChiKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIiwKYi50YXJnZXQudmFsdWUpO2I9TnVtYmVyKGIudGFyZ2V0LnZhbHVlfHxOYU4pO2lzTmFOKGIpfHx0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9saW1pdCooTWF0aC5tYXgoMSxNYXRoLm1pbihiLHRoaXMuX3BhZ2VDb3VudCkpLTEpKX0sX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLHRoaXMuX2N1cnJlbnRQYWdlLnRvU3RyaW5nKCkpfSxfaGFuZGxlUGFnZUZvY3VzRXZlbnQoKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIix0aGlzLl9wYWdlSW5wdXRWYWx1ZSk7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMCl9LF9oYW5kbGVQYWdlQmx1ckV2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMSl9LF91cGRhdGVQYWdlSW5wdXRWYWx1ZShiKXtjb25zdCBkPXRoaXMuJCQoIiNwYWdlLWlucHV0IGlucHV0Iik7ZCYmKGQudmFsdWU9Yil9LF91cGRhdGVJbnB1dFdpZHRoKCl7dGhpcy51cGRhdGVTdHlsZXMoeyItLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgiOnRoaXMuX2lucHV0V2lkdGh9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1kaWFsb2ctYmVoYXZpb3IvcGFwZXItZGlhbG9nLWJlaGF2aW9yLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbD17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImRpYWxvZyIsdGFiaW5kZXg6Ii0xIn0scHJvcGVydGllczp7bW9kYWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX19yZWFkaWVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfbW9kYWxDaGFuZ2VkKG1vZGFsLCBfX3JlYWRpZWQpIl0sbGlzdGVuZXJzOnt0YXA6Il9vbkRpYWxvZ0NsaWNrIn0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrO3RoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXk7dGhpcy5fX3ByZXZXaXRoQmFja2Ryb3A9dGhpcy53aXRoQmFja2Ryb3A7dGhpcy5fX3JlYWRpZWQ9ITB9LF9tb2RhbENoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiYoYj8odGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrPQp0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2ssdGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleSx0aGlzLl9fcHJldldpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCx0aGlzLndpdGhCYWNrZHJvcD10aGlzLm5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPSEwKToodGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayYmdGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrLHRoaXMubm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXkmJnRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleSx0aGlzLndpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCYmdGhpcy5fX3ByZXZXaXRoQmFja2Ryb3ApKX0sX3VwZGF0ZUNsb3NpbmdSZWFzb25Db25maXJtZWQ6ZnVuY3Rpb24oYil7dGhpcy5jbG9zaW5nUmVhc29uPXRoaXMuY2xvc2luZ1JlYXNvbnx8Cnt9O3RoaXMuY2xvc2luZ1JlYXNvbi5jb25maXJtZWQ9Yn0sX29uRGlhbG9nQ2xpY2s6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPVBvbHltZXIuZG9tKGIpLnBhdGgsZj0wLGg9ZC5pbmRleE9mKHRoaXMpO2Y8aDtmKyspe3ZhciBrPWRbZl07aWYoay5oYXNBdHRyaWJ1dGUmJihrLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWRpc21pc3MiKXx8ay5oYXNBdHRyaWJ1dGUoImRpYWxvZy1jb25maXJtIikpKXt0aGlzLl91cGRhdGVDbG9zaW5nUmVhc29uQ29uZmlybWVkKGsuaGFzQXR0cmlidXRlKCJkaWFsb2ctY29uZmlybSIpKTt0aGlzLmNsb3NlKCk7Yi5zdG9wUHJvcGFnYXRpb24oKTticmVha319fX07UG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9yPVtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3IsUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbF19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRpYWxvZy9wYXBlci1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItZGlhbG9nIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvcl0sbGlzdGVuZXJzOnsibmVvbi1hbmltYXRpb24tZmluaXNoIjoiX29uTmVvbkFuaW1hdGlvbkZpbmlzaCJ9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEFuaW1hdGlvbigpO3RoaXMucGxheUFuaW1hdGlvbigiZW50cnkiKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCk7dGhpcy5wbGF5QW5pbWF0aW9uKCJleGl0Iil9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKTp0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKX19KTsKCi8vIGh0dHBzOi8vZDNqcy5vcmcgdjUuNy4wIENvcHlyaWdodCAyMDE4IE1pa2UgQm9zdG9jawohZnVuY3Rpb24odCxuKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sbik6bih0LmQzPXQuZDN8fHt9KX0odGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBlKHQpe3ZhciBlO3JldHVybiAxPT09dC5sZW5ndGgmJihlPXQsdD1mdW5jdGlvbih0LHIpe3JldHVybiBuKGUodCkscil9KSx7bGVmdDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPDA/cj1vKzE6aT1vfXJldHVybiByfSxyaWdodDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPjA/aT1vOnI9bysxfXJldHVybiByfX19dmFyIHI9ZShuKSxpPXIucmlnaHQsbz1yLmxlZnQ7ZnVuY3Rpb24gYSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIHUodCl7cmV0dXJuIG51bGw9PT10P05hTjordH1mdW5jdGlvbiBmKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89MCxhPS0xLGY9MCxjPTA7aWYobnVsbD09bilmb3IoOysrYTxpOylpc05hTihlPXUodFthXSkpfHwoYys9KHI9ZS1mKSooZS0oZis9ci8rK28pKSk7ZWxzZSBmb3IoOysrYTxpOylpc05hTihlPXUobih0W2FdLGEsdCkpKXx8KGMrPShyPWUtZikqKGUtKGYrPXIvKytvKSkpO2lmKG8+MSlyZXR1cm4gYy8oby0xKX1mdW5jdGlvbiBjKHQsbil7dmFyIGU9Zih0LG4pO3JldHVybiBlP01hdGguc3FydChlKTplfWZ1bmN0aW9uIHModCxuKXt2YXIgZSxyLGksbz10Lmxlbmd0aCxhPS0xO2lmKG51bGw9PW4pe2Zvcig7KythPG87KWlmKG51bGwhPShlPXRbYV0pJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9dFthXSkmJihyPmUmJihyPWUpLGk8ZSYmKGk9ZSkpfWVsc2UgZm9yKDsrK2E8bzspaWYobnVsbCE9KGU9bih0W2FdLGEsdCkpJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9bih0W2FdLGEsdCkpJiYocj5lJiYocj1lKSxpPGUmJihpPWUpKTtyZXR1cm5bcixpXX12YXIgbD1BcnJheS5wcm90b3R5cGUsaD1sLnNsaWNlLGQ9bC5tYXA7ZnVuY3Rpb24gcCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdih0KXtyZXR1cm4gdH1mdW5jdGlvbiBnKHQsbixlKXt0PSt0LG49K24sZT0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhuPXQsdD0wLDEpOmk8Mz8xOitlO2Zvcih2YXIgcj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKG4tdCkvZSkpLG89bmV3IEFycmF5KGkpOysrcjxpOylvW3JdPXQrciplO3JldHVybiBvfXZhciB5PU1hdGguc3FydCg1MCksXz1NYXRoLnNxcnQoMTApLGI9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIG0odCxuLGUpe3ZhciByLGksbyxhLHU9LTE7aWYoZT0rZSwodD0rdCk9PT0obj0rbikmJmU+MClyZXR1cm5bdF07aWYoKHI9bjx0KSYmKGk9dCx0PW4sbj1pKSwwPT09KGE9eCh0LG4sZSkpfHwhaXNGaW5pdGUoYSkpcmV0dXJuW107aWYoYT4wKWZvcih0PU1hdGguY2VpbCh0L2EpLG49TWF0aC5mbG9vcihuL2EpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKG4tdCsxKSk7Kyt1PGk7KW9bdV09KHQrdSkqYTtlbHNlIGZvcih0PU1hdGguZmxvb3IodCphKSxuPU1hdGguY2VpbChuKmEpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKHQtbisxKSk7Kyt1PGk7KW9bdV09KHQtdSkvYTtyZXR1cm4gciYmby5yZXZlcnNlKCksb31mdW5jdGlvbiB4KHQsbixlKXt2YXIgcj0obi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApLG89ci9NYXRoLnBvdygxMCxpKTtyZXR1cm4gaT49MD8obz49eT8xMDpvPj1fPzU6bz49Yj8yOjEpKk1hdGgucG93KDEwLGkpOi1NYXRoLnBvdygxMCwtaSkvKG8+PXk/MTA6bz49Xz81Om8+PWI/MjoxKX1mdW5jdGlvbiB3KHQsbixlKXt2YXIgcj1NYXRoLmFicyhuLXQpL01hdGgubWF4KDAsZSksaT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4xMCkpLG89ci9pO3JldHVybiBvPj15P2kqPTEwOm8+PV8/aSo9NTpvPj1iJiYoaSo9Miksbjx0Py1pOml9ZnVuY3Rpb24gTSh0KXtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMikrMX1mdW5jdGlvbiBBKHQsbixlKXtpZihudWxsPT1lJiYoZT11KSxyPXQubGVuZ3RoKXtpZigobj0rbik8PTB8fHI8MilyZXR1cm4rZSh0WzBdLDAsdCk7aWYobj49MSlyZXR1cm4rZSh0W3ItMV0sci0xLHQpO3ZhciByLGk9KHItMSkqbixvPU1hdGguZmxvb3IoaSksYT0rZSh0W29dLG8sdCk7cmV0dXJuIGErKCtlKHRbbysxXSxvKzEsdCktYSkqKGktbyl9fWZ1bmN0aW9uIFQodCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmZT5yJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+ciYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTih0KXtmb3IodmFyIG4sZSxyLGk9dC5sZW5ndGgsbz0tMSxhPTA7KytvPGk7KWErPXRbb10ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKTstLWk+PTA7KWZvcihuPShyPXRbaV0pLmxlbmd0aDstLW4+PTA7KWVbLS1hXT1yW25dO3JldHVybiBlfWZ1bmN0aW9uIFModCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmcj5lJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJnI+ZSYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gRSh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgbj0tMSxlPVModCxrKSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBpLG89LTEsYT1yW25dPW5ldyBBcnJheShpKTsrK288aTspYVtvXT10W29dW25dO3JldHVybiByfWZ1bmN0aW9uIGsodCl7cmV0dXJuIHQubGVuZ3RofXZhciBDPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBQKHQpe3JldHVybiB0fXZhciB6PTEsUj0yLEw9MyxEPTQsVT0xZS02O2Z1bmN0aW9uIHEodCl7cmV0dXJuInRyYW5zbGF0ZSgiKyh0Ky41KSsiLDApIn1mdW5jdGlvbiBPKHQpe3JldHVybiJ0cmFuc2xhdGUoMCwiKyh0Ky41KSsiKSJ9ZnVuY3Rpb24gWSgpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiBCKHQsbil7dmFyIGU9W10scj1udWxsLGk9bnVsbCxvPTYsYT02LHU9MyxmPXQ9PT16fHx0PT09RD8tMToxLGM9dD09PUR8fHQ9PT1SPyJ4IjoieSIscz10PT09enx8dD09PUw/cTpPO2Z1bmN0aW9uIGwobCl7dmFyIGg9bnVsbD09cj9uLnRpY2tzP24udGlja3MuYXBwbHkobixlKTpuLmRvbWFpbigpOnIsZD1udWxsPT1pP24udGlja0Zvcm1hdD9uLnRpY2tGb3JtYXQuYXBwbHkobixlKTpQOmkscD1NYXRoLm1heChvLDApK3Usdj1uLnJhbmdlKCksZz0rdlswXSsuNSx5PSt2W3YubGVuZ3RoLTFdKy41LF89KG4uYmFuZHdpZHRoP2Z1bmN0aW9uKHQpe3ZhciBuPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihuPU1hdGgucm91bmQobikpLGZ1bmN0aW9uKGUpe3JldHVybit0KGUpK259fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuK3Qobil9fSkobi5jb3B5KCkpLGI9bC5zZWxlY3Rpb24/bC5zZWxlY3Rpb24oKTpsLG09Yi5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSkseD1iLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsbikub3JkZXIoKSx3PXguZXhpdCgpLE09eC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwidGljayIpLEE9eC5zZWxlY3QoImxpbmUiKSxUPXguc2VsZWN0KCJ0ZXh0Iik7bT1tLm1lcmdlKG0uZW50ZXIoKS5pbnNlcnQoInBhdGgiLCIudGljayIpLmF0dHIoImNsYXNzIiwiZG9tYWluIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikpLHg9eC5tZXJnZShNKSxBPUEubWVyZ2UoTS5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMrIjIiLGYqbykpLFQ9VC5tZXJnZShNLmFwcGVuZCgidGV4dCIpLmF0dHIoImZpbGwiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMsZipwKS5hdHRyKCJkeSIsdD09PXo/IjBlbSI6dD09PUw/IjAuNzFlbSI6IjAuMzJlbSIpKSxsIT09YiYmKG09bS50cmFuc2l0aW9uKGwpLHg9eC50cmFuc2l0aW9uKGwpLEE9QS50cmFuc2l0aW9uKGwpLFQ9VC50cmFuc2l0aW9uKGwpLHc9dy50cmFuc2l0aW9uKGwpLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9Xyh0KSk/cyh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSxNLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7dmFyIG49dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gcyhuJiZpc0Zpbml0ZShuPW4odCkpP246Xyh0KSl9KSksdy5yZW1vdmUoKSxtLmF0dHIoImQiLHQ9PT1EfHx0PT1SP2E/Ik0iK2YqYSsiLCIrZysiSDAuNVYiK3krIkgiK2YqYToiTTAuNSwiK2crIlYiK3k6YT8iTSIrZysiLCIrZiphKyJWMC41SCIreSsiViIrZiphOiJNIitnKyIsMC41SCIreSkseC5hdHRyKCJvcGFjaXR5IiwxKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBzKF8odCkpfSksQS5hdHRyKGMrIjIiLGYqbyksVC5hdHRyKGMsZipwKS50ZXh0KGQpLGIuZmlsdGVyKFkpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigiZm9udC1zaXplIiwxMCkuYXR0cigiZm9udC1mYW1pbHkiLCJzYW5zLXNlcmlmIikuYXR0cigidGV4dC1hbmNob3IiLHQ9PT1SPyJzdGFydCI6dD09PUQ/ImVuZCI6Im1pZGRsZSIpLGIuZWFjaChmdW5jdGlvbigpe3RoaXMuX19heGlzPV99KX1yZXR1cm4gbC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGwpOm59LGwudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gZT1DLmNhbGwoYXJndW1lbnRzKSxsfSxsLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9bXTpDLmNhbGwodCksbCk6ZS5zbGljZSgpfSxsLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOkMuY2FsbCh0KSxsKTpyJiZyLnNsaWNlKCl9LGwudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGwpOml9LGwudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89YT0rdCxsKTpvfSxsLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsbCk6b30sbC50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LGwpOmF9LGwudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3QsbCk6dX0sbH12YXIgRj17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBJKCl7Zm9yKHZhciB0LG49MCxlPWFyZ3VtZW50cy5sZW5ndGgscj17fTtuPGU7KytuKXtpZighKHQ9YXJndW1lbnRzW25dKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBIKHIpfWZ1bmN0aW9uIEgodCl7dGhpcy5fPXR9ZnVuY3Rpb24gaih0LG4pe2Zvcih2YXIgZSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChlPXRbcl0pLm5hbWU9PT1uKXJldHVybiBlLnZhbHVlfWZ1bmN0aW9uIFgodCxuLGUpe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZih0W3JdLm5hbWU9PT1uKXt0W3JdPUYsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPWUmJnQucHVzaCh7bmFtZTpuLHZhbHVlOmV9KSx0fUgucHJvdG90eXBlPUkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXRoaXMuXyxvPShyPWksKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtpZihlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHQmJiFyLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKSxhPS0xLHU9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK2E8dTspaWYoZT0odD1vW2FdKS50eXBlKWlbZV09WChpW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gaSlpW2VdPVgoaVtlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK2E8dTspaWYoKGU9KHQ9b1thXSkudHlwZSkmJihlPWooaVtlXSx0Lm5hbWUpKSlyZXR1cm4gZX0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LG49dGhpcy5fO2Zvcih2YXIgZSBpbiBuKXRbZV09bltlXS5zbGljZSgpO3JldHVybiBuZXcgSCh0KX0sY2FsbDpmdW5jdGlvbih0LG4pe2lmKChlPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIGUscixpPW5ldyBBcnJheShlKSxvPTA7bzxlOysrbylpW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxlPShyPXRoaXMuX1t0XSkubGVuZ3RoO288ZTsrK28pcltvXS52YWx1ZS5hcHBseShuLGkpfSxhcHBseTpmdW5jdGlvbih0LG4sZSl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIHI9dGhpcy5fW3RdLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpcltpXS52YWx1ZS5hcHBseShuLGUpfX07dmFyIEc9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLFY9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkcseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiAkKHQpe3ZhciBuPXQrPSIiLGU9bi5pbmRleE9mKCI6Iik7cmV0dXJuIGU+PTAmJiJ4bWxucyIhPT0obj10LnNsaWNlKDAsZSkpJiYodD10LnNsaWNlKGUrMSkpLFYuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOlZbbl0sbG9jYWw6dH06dH1mdW5jdGlvbiBXKHQpe3ZhciBuPSQodCk7cmV0dXJuKG4ubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09RyYmbi5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09Rz9uLmNyZWF0ZUVsZW1lbnQodCk6bi5jcmVhdGVFbGVtZW50TlMoZSx0KX19KShuKX1mdW5jdGlvbiBaKCl7fWZ1bmN0aW9uIFEodCl7cmV0dXJuIG51bGw9PXQ/WjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIEooKXtyZXR1cm5bXX1mdW5jdGlvbiBLKHQpe3JldHVybiBudWxsPT10P0o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX12YXIgdHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBudD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7aWYoIW50Lm1hdGNoZXMpe3ZhciBldD1udC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG50Lm1zTWF0Y2hlc1NlbGVjdG9yfHxudC5tb3pNYXRjaGVzU2VsZWN0b3J8fG50Lm9NYXRjaGVzU2VsZWN0b3I7dHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV0LmNhbGwodGhpcyx0KX19fX12YXIgcnQ9dHQ7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gb3QodCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59b3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvdCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LG4pfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fTt2YXIgYXQ9IiQiO2Z1bmN0aW9uIHV0KHQsbixlLHIsaSxvKXtmb3IodmFyIGEsdT0wLGY9bi5sZW5ndGgsYz1vLmxlbmd0aDt1PGM7Kyt1KShhPW5bdV0pPyhhLl9fZGF0YV9fPW9bdV0sclt1XT1hKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcig7dTxmOysrdSkoYT1uW3VdKSYmKGlbdV09YSl9ZnVuY3Rpb24gZnQodCxuLGUscixpLG8sYSl7dmFyIHUsZixjLHM9e30sbD1uLmxlbmd0aCxoPW8ubGVuZ3RoLGQ9bmV3IEFycmF5KGwpO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmKGRbdV09Yz1hdCthLmNhbGwoZixmLl9fZGF0YV9fLHUsbiksYyBpbiBzP2lbdV09ZjpzW2NdPWYpO2Zvcih1PTA7dTxoOysrdSkoZj1zW2M9YXQrYS5jYWxsKHQsb1t1XSx1LG8pXSk/KHJbdV09ZixmLl9fZGF0YV9fPW9bdV0sc1tjXT1udWxsKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmc1tkW3VdXT09PWYmJihpW3VdPWYpfWZ1bmN0aW9uIGN0KHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfWZ1bmN0aW9uIHN0KHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBsdCh0LG4pe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobil8fHN0KHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfWZ1bmN0aW9uIGh0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBwdCh0KX1mdW5jdGlvbiBwdCh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9aHQodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiB2dCh0LG4pe2Zvcih2YXIgZT1kdCh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUuYWRkKG5bcl0pfWZ1bmN0aW9uIGd0KHQsbil7Zm9yKHZhciBlPWR0KHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24geXQoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIF90KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gYnQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gbXQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiB4dCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIHd0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gTXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMSksdGhpcy5uZXh0U2libGluZyl9ZnVuY3Rpb24gQXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMCksdGhpcy5uZXh0U2libGluZyl9cHQucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgVHQ9e307KHQuZXZlbnQ9bnVsbCwidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KSYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoVHQ9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO2Z1bmN0aW9uIE50KHQsbixlKXtyZXR1cm4gdD1TdCh0LG4sZSksZnVuY3Rpb24obil7dmFyIGU9bi5yZWxhdGVkVGFyZ2V0O2UmJihlPT09dGhpc3x8OCZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIFN0KG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG89dC5ldmVudDt0LmV2ZW50PWk7dHJ5e24uY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxyKX1maW5hbGx5e3QuZXZlbnQ9b319fWZ1bmN0aW9uIEV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMuX19vbjtpZihuKXtmb3IodmFyIGUscj0wLGk9LTEsbz1uLmxlbmd0aDtyPG87KytyKWU9bltyXSx0LnR5cGUmJmUudHlwZSE9PXQudHlwZXx8ZS5uYW1lIT09dC5uYW1lP25bKytpXT1lOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsZS5saXN0ZW5lcixlLmNhcHR1cmUpOysraT9uLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBrdCh0LG4sZSl7dmFyIHI9VHQuaGFzT3duUHJvcGVydHkodC50eXBlKT9OdDpTdDtyZXR1cm4gZnVuY3Rpb24oaSxvLGEpe3ZhciB1LGY9dGhpcy5fX29uLGM9cihuLG8sYSk7aWYoZilmb3IodmFyIHM9MCxsPWYubGVuZ3RoO3M8bDsrK3MpaWYoKHU9ZltzXSkudHlwZT09PXQudHlwZSYmdS5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXIsdS5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXI9Yyx1LmNhcHR1cmU9ZSksdm9pZCh1LnZhbHVlPW4pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxlKSx1PXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTpuLGxpc3RlbmVyOmMsY2FwdHVyZTplfSxmP2YucHVzaCh1KTp0aGlzLl9fb249W3VdfX1mdW5jdGlvbiBDdChuLGUscixpKXt2YXIgbz10LmV2ZW50O24uc291cmNlRXZlbnQ9dC5ldmVudCx0LmV2ZW50PW47dHJ5e3JldHVybiBlLmFwcGx5KHIsaSl9ZmluYWxseXt0LmV2ZW50PW99fWZ1bmN0aW9uIFB0KHQsbixlKXt2YXIgcj1zdCh0KSxpPXIuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aT1uZXcgaShuLGUpOihpPXIuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZT8oaS5pbml0RXZlbnQobixlLmJ1YmJsZXMsZS5jYW5jZWxhYmxlKSxpLmRldGFpbD1lLmRldGFpbCk6aS5pbml0RXZlbnQobiwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChpKX12YXIgenQ9W251bGxdO2Z1bmN0aW9uIFJ0KHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIEx0KCl7cmV0dXJuIG5ldyBSdChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLHp0KX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgUnQoW1t0XV0senQpfVJ0LnByb3RvdHlwZT1MdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlJ0LHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9USh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhLHU9bltpXSxmPXUubGVuZ3RoLGM9cltpXT1uZXcgQXJyYXkoZikscz0wO3M8ZjsrK3MpKG89dVtzXSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18scyx1KSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1tzXT1hKTtyZXR1cm4gbmV3IFJ0KHIsdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Syh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9W10saT1bXSxvPTA7bzxlOysrbylmb3IodmFyIGEsdT1uW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpKGE9dVtjXSkmJihyLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHUpKSxpLnB1c2goYSkpO3JldHVybiBuZXcgUnQocixpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ydCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxmPXJbaV09W10sYz0wO2M8dTsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmZi5wdXNoKG8pO3JldHVybiBuZXcgUnQocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlLHI9bj9mdDp1dCxpPXRoaXMuX3BhcmVudHMsbz10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihlPXQsdD1mdW5jdGlvbigpe3JldHVybiBlfSk7Zm9yKHZhciBhPW8ubGVuZ3RoLHU9bmV3IEFycmF5KGEpLGY9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHM9MDtzPGE7KytzKXt2YXIgbD1pW3NdLGg9b1tzXSxkPWgubGVuZ3RoLHA9dC5jYWxsKGwsbCYmbC5fX2RhdGFfXyxzLGkpLHY9cC5sZW5ndGgsZz1mW3NdPW5ldyBBcnJheSh2KSx5PXVbc109bmV3IEFycmF5KHYpO3IobCxoLGcseSxjW3NdPW5ldyBBcnJheShkKSxwLG4pO2Zvcih2YXIgXyxiLG09MCx4PTA7bTx2OysrbSlpZihfPWdbbV0pe2ZvcihtPj14JiYoeD1tKzEpOyEoYj15W3hdKSYmKyt4PHY7KTtfLl9uZXh0PWJ8fG51bGx9fXJldHVybih1PW5ldyBSdCh1LGkpKS5fZW50ZXI9Zix1Ll9leGl0PWMsdX0sZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJ0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKGl0KSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbigpe3JldHVybiBuZXcgUnQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChpdCksdGhpcy5fcGFyZW50cyl9LG1lcmdlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBSdChhLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSxhPWlbb107LS1vPj0wOykocj1pW29dKSYmKGEmJmEhPT1yLm5leHRTaWJsaW5nJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsYSksYT1yKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4sZSl7cmV0dXJuIG4mJmU/dChuLl9fZGF0YV9fLGUuX19kYXRhX18pOiFuLSFlfXR8fCh0PWN0KTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkociksbz0wO288cjsrK28pe2Zvcih2YXIgYSx1PWVbb10sZj11Lmxlbmd0aCxjPWlbb109bmV3IEFycmF5KGYpLHM9MDtzPGY7KytzKShhPXVbc10pJiYoY1tzXT1hKTtjLnNvcnQobil9cmV0dXJuIG5ldyBSdChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxuPS0xO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0Wysrbl09dGhpc30pLHR9LG5vZGU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByPXRbbl0saT0wLG89ci5sZW5ndGg7aTxvOysraSl7dmFyIGE9cltpXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Kyt0fSksdH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPTAscj1uLmxlbmd0aDtlPHI7KytlKWZvcih2YXIgaSxvPW5bZV0sYT0wLHU9by5sZW5ndGg7YTx1OysrYSkoaT1vW2FdKSYmdC5jYWxsKGksaS5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9JCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciByPXRoaXMubm9kZSgpO3JldHVybiBlLmxvY2FsP3IuZ2V0QXR0cmlidXRlTlMoZS5zcGFjZSxlLmxvY2FsKTpyLmdldEF0dHJpYnV0ZShlKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2UubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19OmUubG9jYWw/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19KShlLG4pKX0sc3R5bGU6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1uP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxyLGUpfX06ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxuLGUpfX0pKHQsbixudWxsPT1lPyIiOmUpKTpsdCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19OiJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09bn19KSh0LG4pKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbih0LG4pe3ZhciBlPWh0KHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByPWR0KHRoaXMubm9kZSgpKSxpPS0xLG89ZS5sZW5ndGg7KytpPG87KWlmKCFyLmNvbnRhaW5zKGVbaV0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7KG4uYXBwbHkodGhpcyxhcmd1bWVudHMpP3Z0Omd0KSh0aGlzLHQpfX06bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2dCh0aGlzLHQpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Z3QodGhpcyx0KX19KShlLG4pKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD95dDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fSkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P190OigiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX0pKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChidCl9LGxvd2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChtdCl9LGFwcGVuZDpmdW5jdGlvbih0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlcodCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Vyh0KSxyPW51bGw9PW4/eHQ6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRKG4pO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaCh3dCl9LGNsb25lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P0F0Ok10KX0sZGF0dW06ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx7dHlwZTp0LG5hbWU6bn19KX0odCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2Zvcih1PW4/a3Q6RXQsbnVsbD09ZSYmKGU9ITEpLHI9MDtyPGE7KytyKXRoaXMuZWFjaCh1KG9bcl0sbixlKSk7cmV0dXJuIHRoaXN9dmFyIHU9dGhpcy5ub2RlKCkuX19vbjtpZih1KWZvcih2YXIgZixjPTAscz11Lmxlbmd0aDtjPHM7KytjKWZvcihyPTAsZj11W2NdO3I8YTsrK3IpaWYoKGk9b1tyXSkudHlwZT09PWYudHlwZSYmaS5uYW1lPT09Zi5uYW1lKXJldHVybiBmLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMsdCxuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQsbil9fSkodCxuKSl9fTt2YXIgVXQ9MDtmdW5jdGlvbiBxdCgpe3JldHVybiBuZXcgT3R9ZnVuY3Rpb24gT3QoKXt0aGlzLl89IkAiKygrK1V0KS50b1N0cmluZygzNil9ZnVuY3Rpb24gWXQoKXtmb3IodmFyIG4sZT10LmV2ZW50O249ZS5zb3VyY2VFdmVudDspZT1uO3JldHVybiBlfWZ1bmN0aW9uIEJ0KHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFksWyhyPXIubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24gRnQodCl7dmFyIG49WXQoKTtyZXR1cm4gbi5jaGFuZ2VkVG91Y2hlcyYmKG49bi5jaGFuZ2VkVG91Y2hlc1swXSksQnQodCxuKX1mdW5jdGlvbiBJdCh0LG4sZSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoZT1uLG49WXQoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciByLGk9MCxvPW4/bi5sZW5ndGg6MDtpPG87KytpKWlmKChyPW5baV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBCdCh0LHIpO3JldHVybiBudWxsfWZ1bmN0aW9uIEh0KCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBqdCgpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIFh0KHQpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9RHQodCkub24oImRyYWdzdGFydC5kcmFnIixqdCwhMCk7Im9uc2VsZWN0c3RhcnQiaW4gbj9lLm9uKCJzZWxlY3RzdGFydC5kcmFnIixqdCwhMCk6KG4uX19ub3NlbGVjdD1uLnN0eWxlLk1velVzZXJTZWxlY3Qsbi5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gR3QodCxuKXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPUR0KHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7biYmKHIub24oImNsaWNrLmRyYWciLGp0LCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5vbigiY2xpY2suZHJhZyIsbnVsbCl9LDApKSwib25zZWxlY3RzdGFydCJpbiBlP3Iub24oInNlbGVjdHN0YXJ0LmRyYWciLG51bGwpOihlLnN0eWxlLk1velVzZXJTZWxlY3Q9ZS5fX25vc2VsZWN0LGRlbGV0ZSBlLl9fbm9zZWxlY3QpfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiAkdCh0LG4sZSxyLGksbyxhLHUsZixjKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc3ViamVjdD1lLHRoaXMuaWRlbnRpZmllcj1yLHRoaXMuYWN0aXZlPWksdGhpcy54PW8sdGhpcy55PWEsdGhpcy5keD11LHRoaXMuZHk9Zix0aGlzLl89Y31mdW5jdGlvbiBXdCgpe3JldHVybiF0LmV2ZW50LmJ1dHRvbn1mdW5jdGlvbiBadCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gUXQobil7cmV0dXJuIG51bGw9PW4/e3g6dC5ldmVudC54LHk6dC5ldmVudC55fTpufWZ1bmN0aW9uIEp0KCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIEt0KHQsbixlKXt0LnByb3RvdHlwZT1uLnByb3RvdHlwZT1lLGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiB0bih0LG4pe3ZhciBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgciBpbiBuKWVbcl09bltyXTtyZXR1cm4gZX1mdW5jdGlvbiBubigpe31PdC5wcm90b3R5cGU9cXQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPdCxnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuXzshKG4gaW4gdCk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdFtuXX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbdGhpcy5fXT1ufSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuXyBpbiB0JiZkZWxldGUgdFt0aGlzLl9dfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fSwkdC5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl8ub24uYXBwbHkodGhpcy5fLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT10aGlzLl8/dGhpczp0fTt2YXIgZW49IlxccyooWystXT9cXGQrKVxccyoiLHJuPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLG9uPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixhbj0vXiMoWzAtOWEtZl17M30pJC8sdW49L14jKFswLTlhLWZdezZ9KSQvLGZuPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tlbixlbixlbl0rIlxcKSQiKSxjbj1uZXcgUmVnRXhwKCJecmdiXFwoIitbb24sb24sb25dKyJcXCkkIiksc249bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tlbixlbixlbixybl0rIlxcKSQiKSxsbj1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW29uLG9uLG9uLHJuXSsiXFwpJCIpLGhuPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tybixvbixvbl0rIlxcKSQiKSxkbj1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW3JuLG9uLG9uLHJuXSsiXFwpJCIpLHBuPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIHZuKHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1hbi5leGVjKHQpKT9uZXcgbW4oKG49cGFyc2VJbnQoblsxXSwxNikpPj44JjE1fG4+PjQmMjQwLG4+PjQmMTV8MjQwJm4sKDE1Jm4pPDw0fDE1Jm4sMSk6KG49dW4uZXhlYyh0KSk/Z24ocGFyc2VJbnQoblsxXSwxNikpOihuPWZuLmV4ZWModCkpP25ldyBtbihuWzFdLG5bMl0sblszXSwxKToobj1jbi5leGVjKHQpKT9uZXcgbW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsMSk6KG49c24uZXhlYyh0KSk/eW4oblsxXSxuWzJdLG5bM10sbls0XSk6KG49bG4uZXhlYyh0KSk/eW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsbls0XSk6KG49aG4uZXhlYyh0KSk/d24oblsxXSxuWzJdLzEwMCxuWzNdLzEwMCwxKToobj1kbi5leGVjKHQpKT93bihuWzFdLG5bMl0vMTAwLG5bM10vMTAwLG5bNF0pOnBuLmhhc093blByb3BlcnR5KHQpP2duKHBuW3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgbW4oTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBnbih0KXtyZXR1cm4gbmV3IG1uKHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiB5bih0LG4sZSxyKXtyZXR1cm4gcjw9MCYmKHQ9bj1lPU5hTiksbmV3IG1uKHQsbixlLHIpfWZ1bmN0aW9uIF9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSx0P25ldyBtbigodD10LnJnYigpKS5yLHQuZyx0LmIsdC5vcGFjaXR5KTpuZXcgbW59ZnVuY3Rpb24gYm4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP19uKHQpOm5ldyBtbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gbW4odCxuLGUscil7dGhpcy5yPSt0LHRoaXMuZz0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIHhuKHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24gd24odCxuLGUscil7cmV0dXJuIHI8PTA/dD1uPWU9TmFOOmU8PTB8fGU+PTE/dD1uPU5hTjpuPD0wJiYodD1OYU4pLG5ldyBBbih0LG4sZSxyKX1mdW5jdGlvbiBNbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEFuKXJldHVybiBuZXcgQW4odC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSwhdClyZXR1cm4gbmV3IEFuO2lmKHQgaW5zdGFuY2VvZiBBbilyZXR1cm4gdDt2YXIgbj0odD10LnJnYigpKS5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9TWF0aC5taW4obixlLHIpLG89TWF0aC5tYXgobixlLHIpLGE9TmFOLHU9by1pLGY9KG8raSkvMjtyZXR1cm4gdT8oYT1uPT09bz8oZS1yKS91KzYqKGU8cik6ZT09PW8/KHItbikvdSsyOihuLWUpL3UrNCx1Lz1mPC41P28raToyLW8taSxhKj02MCk6dT1mPjAmJmY8MT8wOmEsbmV3IEFuKGEsdSxmLHQub3BhY2l0eSl9KHQpOm5ldyBBbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gQW4odCxuLGUscil7dGhpcy5oPSt0LHRoaXMucz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIFRuKHQsbixlKXtyZXR1cm4gMjU1Kih0PDYwP24rKGUtbikqdC82MDp0PDE4MD9lOnQ8MjQwP24rKGUtbikqKDI0MC10KS82MDpuKX1LdChubix2bix7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5oZXgoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn19KSxLdChtbixibix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IG1uKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBtbih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9dGhpcy5yJiZ0aGlzLnI8PTI1NSYmMDw9dGhpcy5nJiZ0aGlzLmc8PTI1NSYmMDw9dGhpcy5iJiZ0aGlzLmI8PTI1NSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpmdW5jdGlvbigpe3JldHVybiIjIit4bih0aGlzLnIpK3huKHRoaXMuZykreG4odGhpcy5iKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksS3QoQW4sTW4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksbj1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxyPWUrKGU8LjU/ZToxLWUpKm4saT0yKmUtcjtyZXR1cm4gbmV3IG1uKFRuKHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLFRuKHQsaSxyKSxUbih0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgTm49TWF0aC5QSS8xODAsU249MTgwL01hdGguUEksRW49Ljk2NDIyLGtuPTEsQ249LjgyNTIxLFBuPTQvMjksem49Ni8yOSxSbj0zKnpuKnpuLExuPXpuKnpuKnpuO2Z1bmN0aW9uIERuKHQpe2lmKHQgaW5zdGFuY2VvZiBxbilyZXR1cm4gbmV3IHFuKHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGpuKXtpZihpc05hTih0LmgpKXJldHVybiBuZXcgcW4odC5sLDAsMCx0Lm9wYWNpdHkpO3ZhciBuPXQuaCpObjtyZXR1cm4gbmV3IHFuKHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIG1ufHwodD1fbih0KSk7dmFyIGUscixpPUZuKHQuciksbz1Gbih0LmcpLGE9Rm4odC5iKSx1PU9uKCguMjIyNTA0NSppKy43MTY4Nzg2Km8rLjA2MDYxNjkqYSkva24pO3JldHVybiBpPT09byYmbz09PWE/ZT1yPXU6KGU9T24oKC40MzYwNzQ3KmkrLjM4NTA2NDkqbysuMTQzMDgwNCphKS9Fbikscj1PbigoLjAxMzkzMjIqaSsuMDk3MTA0NSpvKy43MTQxNzMzKmEpL0NuKSksbmV3IHFuKDExNip1LTE2LDUwMCooZS11KSwyMDAqKHUtciksdC5vcGFjaXR5KX1mdW5jdGlvbiBVbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/RG4odCk6bmV3IHFuKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBxbih0LG4sZSxyKXt0aGlzLmw9K3QsdGhpcy5hPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gT24odCl7cmV0dXJuIHQ+TG4/TWF0aC5wb3codCwxLzMpOnQvUm4rUG59ZnVuY3Rpb24gWW4odCl7cmV0dXJuIHQ+em4/dCp0KnQ6Um4qKHQtUG4pfWZ1bmN0aW9uIEJuKHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gRm4odCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gSW4odCl7aWYodCBpbnN0YW5jZW9mIGpuKXJldHVybiBuZXcgam4odC5oLHQuYyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgcW58fCh0PURuKHQpKSwwPT09dC5hJiYwPT09dC5iKXJldHVybiBuZXcgam4oTmFOLDAsdC5sLHQub3BhY2l0eSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpTbjtyZXR1cm4gbmV3IGpuKG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIEhuKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGpuKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1LdChxbixVbix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBxbih0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHFuKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LG49aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxlPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBtbihCbigzLjEzMzg1NjEqKG49RW4qWW4obikpLTEuNjE2ODY2NyoodD1rbipZbih0KSktLjQ5MDYxNDYqKGU9Q24qWW4oZSkpKSxCbigtLjk3ODc2ODQqbisxLjkxNjE0MTUqdCsuMDMzNDU0KmUpLEJuKC4wNzE5NDUzKm4tLjIyODk5MTQqdCsxLjQwNTI0MjcqZSksdGhpcy5vcGFjaXR5KX19KSksS3Qoam4sSG4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgam4odGhpcy5oLHRoaXMuYyx0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBqbih0aGlzLmgsdGhpcy5jLHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzKS5yZ2IoKX19KSk7dmFyIFhuPS0uMTQ4NjEsR249MS43ODI3NyxWbj0tLjI5MjI3LCRuPS0uOTA2NDksV249MS45NzI5NCxabj1XbiokbixRbj1XbipHbixKbj1HbipWbi0kbipYbjtmdW5jdGlvbiBLbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIHRlKXJldHVybiBuZXcgdGUodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgbW58fCh0PV9uKHQpKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT0oSm4qcitabipuLVFuKmUpLyhKbitabi1Rbiksbz1yLWksYT0oV24qKGUtaSktVm4qbykvJG4sdT1NYXRoLnNxcnQoYSphK28qbykvKFduKmkqKDEtaSkpLGY9dT9NYXRoLmF0YW4yKGEsbykqU24tMTIwOk5hTjtyZXR1cm4gbmV3IHRlKGY8MD9mKzM2MDpmLHUsaSx0Lm9wYWNpdHkpfSh0KTpuZXcgdGUodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIHRlKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBuZSh0LG4sZSxyLGkpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSpuKyg0LTYqbyszKmEpKmUrKDErMyp0KzMqby0zKmEpKnIrYSppKS82fWZ1bmN0aW9uIGVlKHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sYT1yPjA/dFtyLTFdOjIqaS1vLHU9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBuZSgoZS1yL24pKm4sYSxpLG8sdSl9fWZ1bmN0aW9uIHJlKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1NYXRoLmZsb29yKCgoZSU9MSk8MD8rK2U6ZSkqbiksaT10WyhyK24tMSklbl0sbz10W3Ilbl0sYT10WyhyKzEpJW5dLHU9dFsocisyKSVuXTtyZXR1cm4gbmUoKGUtci9uKSpuLGksbyxhLHUpfX1mdW5jdGlvbiBpZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gb2UodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiBhZSh0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9vZSh0LGU+MTgwfHxlPC0xODA/ZS0zNjAqTWF0aC5yb3VuZChlLzM2MCk6ZSk6aWUoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiB1ZSh0KXtyZXR1cm4gMT09KHQ9K3QpP2ZlOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGUtbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9TWF0aC5wb3codCxlKSxuPU1hdGgucG93KG4sZSktdCxlPTEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5wb3codCtyKm4sZSl9fShuLGUsdCk6aWUoaXNOYU4obik/ZTpuKX19ZnVuY3Rpb24gZmUodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/b2UodCxlKTppZShpc05hTih0KT9uOnQpfUt0KHRlLEtuLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKk5uLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBtbigyNTUqKG4rZSooWG4qcitHbippKSksMjU1KihuK2UqKFZuKnIrJG4qaSkpLDI1NSoobitlKihXbipyKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIGNlPWZ1bmN0aW9uIHQobil7dmFyIGU9dWUobik7ZnVuY3Rpb24gcih0LG4pe3ZhciByPWUoKHQ9Ym4odCkpLnIsKG49Ym4obikpLnIpLGk9ZSh0Lmcsbi5nKSxvPWUodC5iLG4uYiksYT1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1yKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT1hKG4pLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0oMSk7ZnVuY3Rpb24gc2UodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlLHIsaT1uLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKTtmb3IoZT0wO2U8aTsrK2Upcj1ibihuW2VdKSxvW2VdPXIucnx8MCxhW2VdPXIuZ3x8MCx1W2VdPXIuYnx8MDtyZXR1cm4gbz10KG8pLGE9dChhKSx1PXQodSksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz1hKHQpLHIuYj11KHQpLHIrIiJ9fX12YXIgbGU9c2UoZWUpLGhlPXNlKHJlKTtmdW5jdGlvbiBkZSh0LG4pe3ZhciBlLHI9bj9uLmxlbmd0aDowLGk9dD9NYXRoLm1pbihyLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxpOysrZSlvW2VdPW1lKHRbZV0sbltlXSk7Zm9yKDtlPHI7KytlKWFbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGU9MDtlPGk7KytlKWFbZV09b1tlXSh0KTtyZXR1cm4gYX19ZnVuY3Rpb24gcGUodCxuKXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gbi09dD0rdCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX1mdW5jdGlvbiB2ZSh0LG4pe3JldHVybiBuLT10PSt0LGZ1bmN0aW9uKGUpe3JldHVybiB0K24qZX19ZnVuY3Rpb24gZ2UodCxuKXt2YXIgZSxyPXt9LGk9e307Zm9yKGUgaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1uJiYib2JqZWN0Ij09dHlwZW9mIG58fChuPXt9KSxuKWUgaW4gdD9yW2VdPW1lKHRbZV0sbltlXSk6aVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZSBpbiByKWlbZV09cltlXSh0KTtyZXR1cm4gaX19dmFyIHllPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxfZT1uZXcgUmVnRXhwKHllLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGJlKHQsbil7dmFyIGUscixpLG89eWUubGFzdEluZGV4PV9lLmxhc3RJbmRleD0wLGE9LTEsdT1bXSxmPVtdO2Zvcih0Kz0iIixuKz0iIjsoZT15ZS5leGVjKHQpKSYmKHI9X2UuZXhlYyhuKSk7KShpPXIuaW5kZXgpPm8mJihpPW4uc2xpY2UobyxpKSx1W2FdP3VbYV0rPWk6dVsrK2FdPWkpLChlPWVbMF0pPT09KHI9clswXSk/dVthXT91W2FdKz1yOnVbKythXT1yOih1WysrYV09bnVsbCxmLnB1c2goe2k6YSx4OnZlKGUscil9KSksbz1fZS5sYXN0SW5kZXg7cmV0dXJuIG88bi5sZW5ndGgmJihpPW4uc2xpY2UobyksdVthXT91W2FdKz1pOnVbKythXT1pKSx1Lmxlbmd0aDwyP2ZbMF0/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifX0oZlswXS54KTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KG4pOihuPWYubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPTA7cjxuOysrcil1WyhlPWZbcl0pLmldPWUueCh0KTtyZXR1cm4gdS5qb2luKCIiKX0pfWZ1bmN0aW9uIG1lKHQsbil7dmFyIGUscj10eXBlb2YgbjtyZXR1cm4gbnVsbD09bnx8ImJvb2xlYW4iPT09cj9pZShuKTooIm51bWJlciI9PT1yP3ZlOiJzdHJpbmciPT09cj8oZT12bihuKSk/KG49ZSxjZSk6YmU6biBpbnN0YW5jZW9mIHZuP2NlOm4gaW5zdGFuY2VvZiBEYXRlP3BlOkFycmF5LmlzQXJyYXkobik/ZGU6ImZ1bmN0aW9uIiE9dHlwZW9mIG4udmFsdWVPZiYmImZ1bmN0aW9uIiE9dHlwZW9mIG4udG9TdHJpbmd8fGlzTmFOKG4pP2dlOnZlKSh0LG4pfWZ1bmN0aW9uIHhlKHQsbil7cmV0dXJuIG4tPXQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQodCtuKmUpfX12YXIgd2UsTWUsQWUsVGUsTmU9MTgwL01hdGguUEksU2U9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX07ZnVuY3Rpb24gRWUodCxuLGUscixpLG8pe3ZhciBhLHUsZjtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K24qbikpJiYodC89YSxuLz1hKSwoZj10KmUrbipyKSYmKGUtPXQqZixyLT1uKmYpLCh1PU1hdGguc3FydChlKmUrcipyKSkmJihlLz11LHIvPXUsZi89dSksdCpyPG4qZSYmKHQ9LXQsbj0tbixmPS1mLGE9LWEpLHt0cmFuc2xhdGVYOmksdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKG4sdCkqTmUsc2tld1g6TWF0aC5hdGFuKGYpKk5lLHNjYWxlWDphLHNjYWxlWTp1fX1mdW5jdGlvbiBrZSh0LG4sZSxyKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgdT1bXSxmPVtdO3JldHVybiBvPXQobyksYT10KGEpLGZ1bmN0aW9uKHQscixpLG8sYSx1KXtpZih0IT09aXx8ciE9PW8pe3ZhciBmPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxuLG51bGwsZSk7dS5wdXNoKHtpOmYtNCx4OnZlKHQsaSl9LHtpOmYtMix4OnZlKHIsbyl9KX1lbHNlKGl8fG8pJiZhLnB1c2goInRyYW5zbGF0ZSgiK2krbitvK2UpfShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVksdSxmKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj8odC1uPjE4MD9uKz0zNjA6bi10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOmUucHVzaChpKGUpKyJyb3RhdGUoIixudWxsLHIpLTIseDp2ZSh0LG4pfSkpOm4mJmUucHVzaChpKGUpKyJyb3RhdGUoIituK3IpfShvLnJvdGF0ZSxhLnJvdGF0ZSx1LGYpLGZ1bmN0aW9uKHQsbixlLG8pe3QhPT1uP28ucHVzaCh7aTplLnB1c2goaShlKSsic2tld1goIixudWxsLHIpLTIseDp2ZSh0LG4pfSk6biYmZS5wdXNoKGkoZSkrInNrZXdYKCIrbityKX0oby5za2V3WCxhLnNrZXdYLHUsZiksZnVuY3Rpb24odCxuLGUscixvLGEpe2lmKHQhPT1lfHxuIT09cil7dmFyIHU9by5wdXNoKGkobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO2EucHVzaCh7aTp1LTQseDp2ZSh0LGUpfSx7aTp1LTIseDp2ZShuLHIpfSl9ZWxzZSAxPT09ZSYmMT09PXJ8fG8ucHVzaChpKG8pKyJzY2FsZSgiK2UrIiwiK3IrIikiKX0oby5zY2FsZVgsby5zY2FsZVksYS5zY2FsZVgsYS5zY2FsZVksdSxmKSxvPWE9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPWYubGVuZ3RoOysrZTxyOyl1WyhuPWZbZV0pLmldPW4ueCh0KTtyZXR1cm4gdS5qb2luKCIiKX19fXZhciBDZT1rZShmdW5jdGlvbih0KXtyZXR1cm4ibm9uZSI9PT10P1NlOih3ZXx8KHdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLE1lPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxBZT1kb2N1bWVudC5kZWZhdWx0Vmlldyksd2Uuc3R5bGUudHJhbnNmb3JtPXQsdD1BZS5nZXRDb21wdXRlZFN0eWxlKE1lLmFwcGVuZENoaWxkKHdlKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxNZS5yZW1vdmVDaGlsZCh3ZSksRWUoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0sInB4LCAiLCJweCkiLCJkZWcpIiksUGU9a2UoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/U2U6KFRlfHwoVGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksVGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PVRlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP0VlKCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOlNlKX0sIiwgIiwiKSIsIikiKSx6ZT1NYXRoLlNRUlQyLFJlPTIsTGU9NCxEZT0xZS0xMjtmdW5jdGlvbiBVZSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBxZSh0LG4pe3ZhciBlLHIsaT10WzBdLG89dFsxXSxhPXRbMl0sdT1uWzBdLGY9blsxXSxjPW5bMl0scz11LWksbD1mLW8saD1zKnMrbCpsO2lmKGg8RGUpcj1NYXRoLmxvZyhjL2EpL3plLGU9ZnVuY3Rpb24odCl7cmV0dXJuW2krdCpzLG8rdCpsLGEqTWF0aC5leHAoemUqdCpyKV19O2Vsc2V7dmFyIGQ9TWF0aC5zcXJ0KGgpLHA9KGMqYy1hKmErTGUqaCkvKDIqYSpSZSpkKSx2PShjKmMtYSphLUxlKmgpLygyKmMqUmUqZCksZz1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLHk9TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KTtyPSh5LWcpL3plLGU9ZnVuY3Rpb24odCl7dmFyIG4sZT10KnIsdT1VZShnKSxmPWEvKFJlKmQpKih1KihuPXplKmUrZywoKG49TWF0aC5leHAoMipuKSktMSkvKG4rMSkpLWZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfShnKSk7cmV0dXJuW2krZipzLG8rZipsLGEqdS9VZSh6ZSplK2cpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPU1uKG4pKS5oLChlPU1uKGUpKS5oKSxpPWZlKG4ucyxlLnMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgWWU9T2UoYWUpLEJlPU9lKGZlKTtmdW5jdGlvbiBGZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPUhuKG4pKS5oLChlPUhuKGUpKS5oKSxpPWZlKG4uYyxlLmMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgSWU9RmUoYWUpLEhlPUZlKGZlKTtmdW5jdGlvbiBqZSh0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj1LbihuKSkuaCwocj1LbihyKSkuaCksbz1mZShuLnMsci5zKSxhPWZlKG4ubCxyLmwpLHU9ZmUobi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9YShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9dSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9dmFyIFhlPWplKGFlKSxHZT1qZShmZSk7dmFyIFZlLCRlLFdlPTAsWmU9MCxRZT0wLEplPTFlMyxLZT0wLHRyPTAsbnI9MCxlcj0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxycj0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBpcigpe3JldHVybiB0cnx8KHJyKG9yKSx0cj1lci5ub3coKStucil9ZnVuY3Rpb24gb3IoKXt0cj0wfWZ1bmN0aW9uIGFyKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiB1cih0LG4sZSl7dmFyIHI9bmV3IGFyO3JldHVybiByLnJlc3RhcnQodCxuLGUpLHJ9ZnVuY3Rpb24gZnIoKXtpcigpLCsrV2U7Zm9yKHZhciB0LG49VmU7bjspKHQ9dHItbi5fdGltZSk+PTAmJm4uX2NhbGwuY2FsbChudWxsLHQpLG49bi5fbmV4dDstLVdlfWZ1bmN0aW9uIGNyKCl7dHI9KEtlPWVyLm5vdygpKStucixXZT1aZT0wO3RyeXtmcigpfWZpbmFsbHl7V2U9MCxmdW5jdGlvbigpe3ZhciB0LG4sZT1WZSxyPTEvMDtmb3IoO2U7KWUuX2NhbGw/KHI+ZS5fdGltZSYmKHI9ZS5fdGltZSksdD1lLGU9ZS5fbmV4dCk6KG49ZS5fbmV4dCxlLl9uZXh0PW51bGwsZT10P3QuX25leHQ9bjpWZT1uKTskZT10LGxyKHIpfSgpLHRyPTB9fWZ1bmN0aW9uIHNyKCl7dmFyIHQ9ZXIubm93KCksbj10LUtlO24+SmUmJihuci09bixLZT10KX1mdW5jdGlvbiBscih0KXtXZXx8KFplJiYoWmU9Y2xlYXJUaW1lb3V0KFplKSksdC10cj4yND8odDwxLzAmJihaZT1zZXRUaW1lb3V0KGNyLHQtZXIubm93KCktbnIpKSxRZSYmKFFlPWNsZWFySW50ZXJ2YWwoUWUpKSk6KFFlfHwoS2U9ZXIubm93KCksUWU9c2V0SW50ZXJ2YWwoc3IsSmUpKSxXZT0xLHJyKGNyKSkpfWZ1bmN0aW9uIGhyKHQsbixlKXt2YXIgcj1uZXcgYXI7cmV0dXJuIG49bnVsbD09bj8wOituLHIucmVzdGFydChmdW5jdGlvbihlKXtyLnN0b3AoKSx0KGUrbil9LG4sZSkscn1hci5wcm90b3R5cGU9dXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphcixyZXN0YXJ0OmZ1bmN0aW9uKHQsbixlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO2U9KG51bGw9PWU/aXIoKTorZSkrKG51bGw9PW4/MDorbiksdGhpcy5fbmV4dHx8JGU9PT10aGlzfHwoJGU/JGUuX25leHQ9dGhpczpWZT10aGlzLCRlPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPWUsbHIoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsbHIoKSl9fTt2YXIgZHI9SSgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSxwcj1bXSx2cj0wLGdyPTEseXI9Mixfcj0zLGJyPTQsbXI9NSx4cj02O2Z1bmN0aW9uIHdyKHQsbixlLHIsaSxvKXt2YXIgYT10Ll9fdHJhbnNpdGlvbjtpZihhKXtpZihlIGluIGEpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307IWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpPXQuX190cmFuc2l0aW9uO2Z1bmN0aW9uIG8oZil7dmFyIGMscyxsLGg7aWYoZS5zdGF0ZSE9PWdyKXJldHVybiB1KCk7Zm9yKGMgaW4gaSlpZigoaD1pW2NdKS5uYW1lPT09ZS5uYW1lKXtpZihoLnN0YXRlPT09X3IpcmV0dXJuIGhyKG8pO2guc3RhdGU9PT1icj8oaC5zdGF0ZT14cixoLnRpbWVyLnN0b3AoKSxoLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGguaW5kZXgsaC5ncm91cCksZGVsZXRlIGlbY10pOitjPG4mJihoLnN0YXRlPXhyLGgudGltZXIuc3RvcCgpLGRlbGV0ZSBpW2NdKX1pZihocihmdW5jdGlvbigpe2Uuc3RhdGU9PT1fciYmKGUuc3RhdGU9YnIsZS50aW1lci5yZXN0YXJ0KGEsZS5kZWxheSxlLnRpbWUpLGEoZikpfSksZS5zdGF0ZT15cixlLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxlLnN0YXRlPT09eXIpe2ZvcihlLnN0YXRlPV9yLHI9bmV3IEFycmF5KGw9ZS50d2Vlbi5sZW5ndGgpLGM9MCxzPS0xO2M8bDsrK2MpKGg9ZS50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApKSYmKHJbKytzXT1oKTtyLmxlbmd0aD1zKzF9fWZ1bmN0aW9uIGEobil7Zm9yKHZhciBpPW48ZS5kdXJhdGlvbj9lLmVhc2UuY2FsbChudWxsLG4vZS5kdXJhdGlvbik6KGUudGltZXIucmVzdGFydCh1KSxlLnN0YXRlPW1yLDEpLG89LTEsYT1yLmxlbmd0aDsrK288YTspcltvXS5jYWxsKG51bGwsaSk7ZS5zdGF0ZT09PW1yJiYoZS5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLHUoKSl9ZnVuY3Rpb24gdSgpe2Zvcih2YXIgciBpbiBlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLGRlbGV0ZSBpW25dLGkpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1pW25dPWUsZS50aW1lcj11cihmdW5jdGlvbih0KXtlLnN0YXRlPWdyLGUudGltZXIucmVzdGFydChvLGUuZGVsYXksZS50aW1lKSxlLmRlbGF5PD10JiZvKHQtZS5kZWxheSl9LDAsZS50aW1lKX0odCxlLHtuYW1lOm4saW5kZXg6cixncm91cDppLG9uOmRyLHR3ZWVuOnByLHRpbWU6by50aW1lLGRlbGF5Om8uZGVsYXksZHVyYXRpb246by5kdXJhdGlvbixlYXNlOm8uZWFzZSx0aW1lcjpudWxsLHN0YXRlOnZyfSl9ZnVuY3Rpb24gTXIodCxuKXt2YXIgZT1Ucih0LG4pO2lmKGUuc3RhdGU+dnIpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBBcih0LG4pe3ZhciBlPVRyKHQsbik7aWYoZS5zdGF0ZT55cil0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBUcih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBlfWZ1bmN0aW9uIE5yKHQsbil7dmFyIGUscixpLG89dC5fX3RyYW5zaXRpb24sYT0hMDtpZihvKXtmb3IoaSBpbiBuPW51bGw9PW4/bnVsbDpuKyIiLG8pKGU9b1tpXSkubmFtZT09PW4/KHI9ZS5zdGF0ZT55ciYmZS5zdGF0ZTxtcixlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLHImJmUub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxkZWxldGUgb1tpXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIFNyKHQsbixlKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9QXIodGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiBUcih0LHIpLnZhbHVlW25dfX1mdW5jdGlvbiBFcih0LG4pe3ZhciBlO3JldHVybigibnVtYmVyIj09dHlwZW9mIG4/dmU6biBpbnN0YW5jZW9mIHZuP2NlOihlPXZuKG4pKT8obj1lLGNlKTpiZSkodCxuKX12YXIga3I9THQucHJvdG90eXBlLmNvbnN0cnVjdG9yO3ZhciBDcj0wO2Z1bmN0aW9uIFByKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiB6cih0KXtyZXR1cm4gTHQoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIFJyKCl7cmV0dXJuKytDcn12YXIgTHI9THQucHJvdG90eXBlO2Z1bmN0aW9uIERyKHQpe3JldHVybigodCo9Mik8PTE/dCp0Oi0tdCooMi10KSsxKS8yfWZ1bmN0aW9uIFVyKHQpe3JldHVybigodCo9Mik8PTE/dCp0KnQ6KHQtPTIpKnQqdCsyKS8yfVByLnByb3RvdHlwZT16ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlByLHNlbGVjdDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVEodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPTA7YTxpOysrYSlmb3IodmFyIHUsZixjPXJbYV0scz1jLmxlbmd0aCxsPW9bYV09bmV3IEFycmF5KHMpLGg9MDtoPHM7KytoKSh1PWNbaF0pJiYoZj10LmNhbGwodSx1Ll9fZGF0YV9fLGgsYykpJiYoIl9fZGF0YV9fImluIHUmJihmLl9fZGF0YV9fPXUuX19kYXRhX18pLGxbaF09Zix3cihsW2hdLG4sZSxoLGwsVHIodSxlKSkpO3JldHVybiBuZXcgUHIobyx0aGlzLl9wYXJlbnRzLG4sZSl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUsodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPVtdLGE9W10sdT0wO3U8aTsrK3UpZm9yKHZhciBmLGM9clt1XSxzPWMubGVuZ3RoLGw9MDtsPHM7KytsKWlmKGY9Y1tsXSl7Zm9yKHZhciBoLGQ9dC5jYWxsKGYsZi5fX2RhdGFfXyxsLGMpLHA9VHIoZixlKSx2PTAsZz1kLmxlbmd0aDt2PGc7Kyt2KShoPWRbdl0pJiZ3cihoLG4sZSx2LGQscCk7by5wdXNoKGQpLGEucHVzaChmKX1yZXR1cm4gbmV3IFByKG8sYSxuLGUpfSxmaWx0ZXI6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXJ0KHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLGE9bltpXSx1PWEubGVuZ3RoLGY9cltpXT1bXSxjPTA7Yzx1OysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZmLnB1c2gobyk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uKHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBQcihhLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiBuZXcga3IodGhpcy5fZ3JvdXBzLHRoaXMuX3BhcmVudHMpfSx0cmFuc2l0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsbj10aGlzLl9pZCxlPVJyKCkscj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIGEsdT1yW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpaWYoYT11W2NdKXt2YXIgcz1UcihhLG4pO3dyKGEsdCxlLGMsdSx7dGltZTpzLnRpbWUrcy5kZWxheStzLmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246cy5kdXJhdGlvbixlYXNlOnMuZWFzZX0pfXJldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHQsZSl9LGNhbGw6THIuY2FsbCxub2RlczpMci5ub2Rlcyxub2RlOkxyLm5vZGUsc2l6ZTpMci5zaXplLGVtcHR5OkxyLmVtcHR5LGVhY2g6THIuZWFjaCxvbjpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/VHIodGhpcy5ub2RlKCksZSkub24ub24odCk6dGhpcy5lYWNoKGZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG89ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KXt2YXIgbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKHQ9dC5zbGljZSgwLG4pKSwhdHx8InN0YXJ0Ij09PXR9KX0obik/TXI6QXI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9byh0aGlzLHQpLHU9YS5vbjt1IT09ciYmKGk9KHI9dSkuY29weSgpKS5vbihuLGUpLGEub249aX19KGUsdCxuKSl9LGF0dHI6ZnVuY3Rpb24odCxuKXt2YXIgZT0kKHQpLHI9InRyYW5zZm9ybSI9PT1lP1BlOkVyO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuPyhlLmxvY2FsP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdT1lKHRoaXMpO2lmKG51bGwhPXUpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpKT09PXU/bnVsbDphPT09ciYmdT09PWk/bzpvPW4ocj1hLGk9dSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSx1PWUodGhpcyk7aWYobnVsbCE9dSlyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT11P251bGw6YT09PXImJnU9PT1pP286bz1uKHI9YSxpPXUpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX0pKGUscixTcih0aGlzLCJhdHRyLiIrdCxuKSk6bnVsbD09bj8oZS5sb2NhbD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19KShlKTooZS5sb2NhbD9mdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0pKGUscixuKyIiKSl9LGF0dHJUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9JCh0KTtyZXR1cm4gdGhpcy50d2VlbihlLChyLmxvY2FsP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9OmZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGUodCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX0pKHIsbikpfSxzdHlsZTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9InRyYW5zZm9ybSI9PSh0Kz0iIik/Q2U6RXI7cmV0dXJuIG51bGw9PW4/dGhpcy5zdHlsZVR3ZWVuKHQsZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89bHQodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGx0KHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1lJiZhPT09cj9pOmk9bihlPW8scj1hKX19KHQscikpLm9uKCJlbmQuc3R5bGUuIit0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1sdCh0aGlzLHQpLHU9ZSh0aGlzKTtyZXR1cm4gbnVsbD09dSYmKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksdT1sdCh0aGlzLHQpKSxhPT09dT9udWxsOmE9PT1yJiZ1PT09aT9vOm89bihyPWEsaT11KX19KHQscixTcih0aGlzLCJzdHlsZS4iK3QsbikpOmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWx0KHRoaXMsdCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0odCxyLG4rIiIpLGUpfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLGZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn0odCxuLG51bGw9PWU/IiI6ZSkpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX0oU3IodGhpcywidGV4dCIsdCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KG51bGw9PXQ/IiI6dCsiIikpfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsKHQ9dGhpcy5faWQsZnVuY3Rpb24oKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBlIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtlIT09dClyZXR1cm47biYmbi5yZW1vdmVDaGlsZCh0aGlzKX0pKTt2YXIgdH0sdHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcixpPVRyKHRoaXMubm9kZSgpLGUpLnR3ZWVuLG89MCxhPWkubGVuZ3RoO288YTsrK28paWYoKHI9aVtvXSkubmFtZT09PXQpcmV0dXJuIHIudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0LG4pe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9QXIodGhpcyx0KSxvPWkudHdlZW47aWYobyE9PWUpZm9yKHZhciBhPTAsdT0ocj1lPW8pLmxlbmd0aDthPHU7KythKWlmKHJbYV0ubmFtZT09PW4peyhyPXIuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9aS50d2Vlbj1yfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPUFyKHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1yKXtpPShyPWEpLnNsaWNlKCk7Zm9yKHZhciB1PXtuYW1lOm4sdmFsdWU6ZX0sZj0wLGM9aS5sZW5ndGg7ZjxjOysrZilpZihpW2ZdLm5hbWU9PT1uKXtpW2ZdPXU7YnJlYWt9Zj09PWMmJmkucHVzaCh1KX1vLnR3ZWVuPWl9fSkoZSx0LG4pKX0sZGVsYXk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kdXJhdGlvbn0sZWFzZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7QXIodGhpcyx0KS5lYXNlPW59fShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5lYXNlfX07dmFyIHFyPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5wb3codCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksT3I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksWXI9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3codCxuKToyLU1hdGgucG93KDItdCxuKSkvMn1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksQnI9TWF0aC5QSSxGcj1Cci8yO2Z1bmN0aW9uIElyKHQpe3JldHVybigxLU1hdGguY29zKEJyKnQpKS8yfWZ1bmN0aW9uIEhyKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3coMiwxMCp0LTEwKToyLU1hdGgucG93KDIsMTAtMTAqdCkpLzJ9ZnVuY3Rpb24ganIodCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9dmFyIFhyPTQvMTEsR3I9Ni8xMSxWcj04LzExLCRyPS43NSxXcj05LzExLFpyPTEwLzExLFFyPS45Mzc1LEpyPTIxLzIyLEtyPTYzLzY0LHRpPTEvWHIvWHI7ZnVuY3Rpb24gbmkodCl7cmV0dXJuKHQ9K3QpPFhyP3RpKnQqdDp0PFZyP3RpKih0LT1HcikqdCskcjp0PFpyP3RpKih0LT1XcikqdCtRcjp0aSoodC09SnIpKnQrS3J9dmFyIGVpPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCkscmk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybi0tdCp0KigobisxKSp0K24pKzF9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSgxLjcwMTU4KSxpaT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKG4rMSkqdC1uKToodC09MikqdCooKG4rMSkqdCtuKSsyKS8yfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksb2k9MipNYXRoLlBJLGFpPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9pKTtmdW5jdGlvbiBpKHQpe3JldHVybiBuKk1hdGgucG93KDIsMTAqLS10KSpNYXRoLnNpbigoci10KS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksdWk9ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89b2kpO2Z1bmN0aW9uIGkodCl7cmV0dXJuIDEtbipNYXRoLnBvdygyLC0xMCoodD0rdCkpKk1hdGguc2luKCh0K3IpL2UpfXJldHVybiBpLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqb2kpfSxpLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxpfSgxLC4zKSxmaT1mdW5jdGlvbiB0KG4sZSl7dmFyIHI9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1vaSk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4oKHQ9Mip0LTEpPDA/bipNYXRoLnBvdygyLDEwKnQpKk1hdGguc2luKChyLXQpL2UpOjItbipNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigocit0KS9lKSkvMn1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksY2k9e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOlVyfTtmdW5jdGlvbiBzaSh0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBjaS50aW1lPWlyKCksY2k7cmV0dXJuIGV9THQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TnIodGhpcyx0KX0pfSxMdC5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBQcj8obj10Ll9pZCx0PXQuX25hbWUpOihuPVJyKCksKGU9Y2kpLnRpbWU9aXIoKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKShhPXVbY10pJiZ3cihhLHQsbixjLHUsZXx8c2koYSxuKSk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdCxuKX07dmFyIGxpPVtudWxsXTtmdW5jdGlvbiBoaSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gZGkodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zZWxlY3Rpb249ZX1mdW5jdGlvbiBwaSgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gdmkoKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX12YXIgZ2k9e25hbWU6ImRyYWcifSx5aT17bmFtZToic3BhY2UifSxfaT17bmFtZToiaGFuZGxlIn0sYmk9e25hbWU6ImNlbnRlciJ9LG1pPXtuYW1lOiJ4IixoYW5kbGVzOlsiZSIsInciXS5tYXAoRWkpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbdFswXSxuWzBdWzFdXSxbdFsxXSxuWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSx4aT17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW25bMF1bMF0sdFswXV0sW25bMV1bMF0sdFsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzFdLHRbMV1bMV1dfX0sd2k9e25hbWU6Inh5IixoYW5kbGVzOlsibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sTWk9e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LEFpPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxUaT17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0sTmk9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sU2k9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX07ZnVuY3Rpb24gRWkodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24ga2koKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gQ2koKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gUGkodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiB6aSh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIFJpKG4pe3ZhciBlLHI9Q2ksaT1raSxvPUkodSwic3RhcnQiLCJicnVzaCIsImVuZCIpLGE9NjtmdW5jdGlvbiB1KHQpe3ZhciBlPXQucHJvcGVydHkoIl9fYnJ1c2giLGgpLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFtFaSgib3ZlcmxheSIpXSk7ZS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KS5tZXJnZShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UGkodGhpcykuZXh0ZW50O0R0KHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pLHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbRWkoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsTWkuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIHI9dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKG4uaGFuZGxlcyxmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSk7ci5leGl0KCkucmVtb3ZlKCksci5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KS5hdHRyKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiBNaVt0LnR5cGVdfSksdC5lYWNoKGYpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsbCl9ZnVuY3Rpb24gZigpe3ZhciB0PUR0KHRoaXMpLG49UGkodGhpcykuc2VsZWN0aW9uO24/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLG5bMF1bMF0pLmF0dHIoInkiLG5bMF1bMV0pLmF0dHIoIndpZHRoIixuWzFdWzBdLW5bMF1bMF0pLmF0dHIoImhlaWdodCIsblsxXVsxXS1uWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLWEvMjpuWzBdWzBdLWEvMn0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9uWzFdWzFdLWEvMjpuWzBdWzFdLWEvMn0pLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4ibiI9PT10LnR5cGV8fCJzIj09PXQudHlwZT9uWzFdWzBdLW5bMF1bMF0rYTphfSkuYXR0cigiaGVpZ2h0IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0rYTphfSkpOnQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJ4IixudWxsKS5hdHRyKCJ5IixudWxsKS5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKX1mdW5jdGlvbiBjKHQsbil7cmV0dXJuIHQuX19icnVzaC5lbWl0dGVyfHxuZXcgcyh0LG4pfWZ1bmN0aW9uIHModCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLnN0YXRlPXQuX19icnVzaCx0aGlzLmFjdGl2ZT0wfWZ1bmN0aW9uIGwoKXtpZih0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuIHZpKCl9ZWxzZSBpZihlKXJldHVybjtpZihpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHIsbyxhLHUscyxsLGgsZCxwLHYsZyx5LF8sYj10aGlzLG09dC5ldmVudC50YXJnZXQuX19kYXRhX18udHlwZSx4PSJzZWxlY3Rpb24iPT09KHQuZXZlbnQubWV0YUtleT9tPSJvdmVybGF5IjptKT9naTp0LmV2ZW50LmFsdEtleT9iaTpfaSx3PW49PT14aT9udWxsOk5pW21dLE09bj09PW1pP251bGw6U2lbbV0sQT1QaShiKSxUPUEuZXh0ZW50LE49QS5zZWxlY3Rpb24sUz1UWzBdWzBdLEU9VFswXVsxXSxrPVRbMV1bMF0sQz1UWzFdWzFdLFA9dyYmTSYmdC5ldmVudC5zaGlmdEtleSx6PUZ0KGIpLFI9eixMPWMoYixhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09bT9BLnNlbGVjdGlvbj1OPVtbcj1uPT09eGk/Uzp6WzBdLGE9bj09PW1pP0U6elsxXV0sW3M9bj09PXhpP2s6cixoPW49PT1taT9DOmFdXToocj1OWzBdWzBdLGE9TlswXVsxXSxzPU5bMV1bMF0saD1OWzFdWzFdKSxvPXIsdT1hLGw9cyxkPWg7dmFyIEQ9RHQoYikuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksVT1ELnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLE1pW21dKTtpZih0LmV2ZW50LnRvdWNoZXMpRC5vbigidG91Y2htb3ZlLmJydXNoIixPLCEwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLEIsITApO2Vsc2V7dmFyIHE9RHQodC5ldmVudC52aWV3KS5vbigia2V5ZG93bi5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlA9dyYmTTticmVhaztjYXNlIDE4Ong9PT1faSYmKHcmJihzPWwtcCp3LHI9bytwKncpLE0mJihoPWQtdipNLGE9dSt2Kk0pLHg9YmksWSgpKTticmVhaztjYXNlIDMyOnghPT1faSYmeCE9PWJpfHwodzwwP3M9bC1wOnc+MCYmKHI9by1wKSxNPDA/aD1kLXY6TT4wJiYoYT11LXYpLHg9eWksVS5hdHRyKCJjdXJzb3IiLE1pLnNlbGVjdGlvbiksWSgpKTticmVhaztkZWZhdWx0OnJldHVybn12aSgpfSwhMCkub24oImtleXVwLmJydXNoIixmdW5jdGlvbigpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6UCYmKHk9Xz1QPSExLFkoKSk7YnJlYWs7Y2FzZSAxODp4PT09YmkmJih3PDA/cz1sOnc+MCYmKHI9byksTTwwP2g9ZDpNPjAmJihhPXUpLHg9X2ksWSgpKTticmVhaztjYXNlIDMyOng9PT15aSYmKHQuZXZlbnQuYWx0S2V5Pyh3JiYocz1sLXAqdyxyPW8rcCp3KSxNJiYoaD1kLXYqTSxhPXUrdipNKSx4PWJpKToodzwwP3M9bDp3PjAmJihyPW8pLE08MD9oPWQ6TT4wJiYoYT11KSx4PV9pKSxVLmF0dHIoImN1cnNvciIsTWlbbV0pLFkoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dmkoKX0sITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLE8sITApLm9uKCJtb3VzZXVwLmJydXNoIixCLCEwKTtYdCh0LmV2ZW50LnZpZXcpfXBpKCksTnIoYiksZi5jYWxsKGIpLEwuc3RhcnQoKX1mdW5jdGlvbiBPKCl7dmFyIHQ9RnQoYik7IVB8fHl8fF98fChNYXRoLmFicyh0WzBdLVJbMF0pPk1hdGguYWJzKHRbMV0tUlsxXSk/Xz0hMDp5PSEwKSxSPXQsZz0hMCx2aSgpLFkoKX1mdW5jdGlvbiBZKCl7dmFyIHQ7c3dpdGNoKHA9UlswXS16WzBdLHY9UlsxXS16WzFdLHgpe2Nhc2UgeWk6Y2FzZSBnaTp3JiYocD1NYXRoLm1heChTLXIsTWF0aC5taW4oay1zLHApKSxvPXIrcCxsPXMrcCksTSYmKHY9TWF0aC5tYXgoRS1hLE1hdGgubWluKEMtaCx2KSksdT1hK3YsZD1oK3YpO2JyZWFrO2Nhc2UgX2k6dzwwPyhwPU1hdGgubWF4KFMtcixNYXRoLm1pbihrLXIscCkpLG89citwLGw9cyk6dz4wJiYocD1NYXRoLm1heChTLXMsTWF0aC5taW4oay1zLHApKSxvPXIsbD1zK3ApLE08MD8odj1NYXRoLm1heChFLWEsTWF0aC5taW4oQy1hLHYpKSx1PWErdixkPWgpOk0+MCYmKHY9TWF0aC5tYXgoRS1oLE1hdGgubWluKEMtaCx2KSksdT1hLGQ9aCt2KTticmVhaztjYXNlIGJpOncmJihvPU1hdGgubWF4KFMsTWF0aC5taW4oayxyLXAqdykpLGw9TWF0aC5tYXgoUyxNYXRoLm1pbihrLHMrcCp3KSkpLE0mJih1PU1hdGgubWF4KEUsTWF0aC5taW4oQyxhLXYqTSkpLGQ9TWF0aC5tYXgoRSxNYXRoLm1pbihDLGgrdipNKSkpfWw8byYmKHcqPS0xLHQ9cixyPXMscz10LHQ9byxvPWwsbD10LG0gaW4gQWkmJlUuYXR0cigiY3Vyc29yIixNaVttPUFpW21dXSkpLGQ8dSYmKE0qPS0xLHQ9YSxhPWgsaD10LHQ9dSx1PWQsZD10LG0gaW4gVGkmJlUuYXR0cigiY3Vyc29yIixNaVttPVRpW21dXSkpLEEuc2VsZWN0aW9uJiYoTj1BLnNlbGVjdGlvbikseSYmKG89TlswXVswXSxsPU5bMV1bMF0pLF8mJih1PU5bMF1bMV0sZD1OWzFdWzFdKSxOWzBdWzBdPT09byYmTlswXVsxXT09PXUmJk5bMV1bMF09PT1sJiZOWzFdWzFdPT09ZHx8KEEuc2VsZWN0aW9uPVtbbyx1XSxbbCxkXV0sZi5jYWxsKGIpLEwuYnJ1c2goKSl9ZnVuY3Rpb24gQigpe2lmKHBpKCksdC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSw1MDApLEQub24oInRvdWNobW92ZS5icnVzaCB0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsbnVsbCl9ZWxzZSBHdCh0LmV2ZW50LnZpZXcsZykscS5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7RC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLFUuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KSxBLnNlbGVjdGlvbiYmKE49QS5zZWxlY3Rpb24pLHppKE4pJiYoQS5zZWxlY3Rpb249bnVsbCxmLmNhbGwoYikpLEwuZW5kKCl9fWZ1bmN0aW9uIGgoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZGltPW4sdH1yZXR1cm4gdS5tb3ZlPWZ1bmN0aW9uKHQsZSl7dC5zZWxlY3Rpb24/dC5vbigic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuZW5kKCl9KS50d2VlbigiYnJ1c2giLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPXQuX19icnVzaCxpPWModCxhcmd1bWVudHMpLG89ci5zZWxlY3Rpb24sYT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsci5leHRlbnQpLHU9bWUobyxhKTtmdW5jdGlvbiBzKG4pe3Iuc2VsZWN0aW9uPTE9PT1uJiZ6aShhKT9udWxsOnUobiksZi5jYWxsKHQpLGkuYnJ1c2goKX1yZXR1cm4gbyYmYT9zOnMoMSl9KTp0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMscj10aGlzLl9fYnJ1c2gsaT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyx0KTplLHIuZXh0ZW50KSxvPWModGhpcyx0KS5iZWZvcmVzdGFydCgpO05yKHRoaXMpLHIuc2VsZWN0aW9uPW51bGw9PWl8fHppKGkpP251bGw6aSxmLmNhbGwodGhpcyksby5zdGFydCgpLmJydXNoKCkuZW5kKCl9KX0scy5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nJiYodGhpcy5zdGFydGluZz0hMSx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtDdChuZXcgZGkodSx0LG4ub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksby5hcHBseSxvLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHUuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHUpOnJ9LHUuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoISF0KSx1KTppfSx1LmhhbmRsZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsdSk6YX0sdS5vbj1mdW5jdGlvbigpe3ZhciB0PW8ub24uYXBwbHkobyxhcmd1bWVudHMpO3JldHVybiB0PT09bz91OnR9LHV9dmFyIExpPU1hdGguY29zLERpPU1hdGguc2luLFVpPU1hdGguUEkscWk9VWkvMixPaT0yKlVpLFlpPU1hdGgubWF4O3ZhciBCaT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gRmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBJaT1NYXRoLlBJLEhpPTIqSWksamk9SGktMWUtNjtmdW5jdGlvbiBYaSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIEdpKCl7cmV0dXJuIG5ldyBYaX1mdW5jdGlvbiBWaSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gJGkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIFdpKHQpe3JldHVybiB0LnJhZGl1c31mdW5jdGlvbiBaaSh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIFFpKHQpe3JldHVybiB0LmVuZEFuZ2xlfVhpLnByb3RvdHlwZT1HaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlhpLG1vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbil9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStuKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArbisiLCIrKHRoaXMuX3gxPStlKSsiLCIrKHRoaXMuX3kxPStyKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK24rIiwiKyArZSsiLCIrICtyKyIsIisodGhpcy5feDE9K2kpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LG4sZSxyLGkpe3Q9K3Qsbj0rbixlPStlLHI9K3IsaT0raTt2YXIgbz10aGlzLl94MSxhPXRoaXMuX3kxLHU9ZS10LGY9ci1uLGM9by10LHM9YS1uLGw9YypjK3MqcztpZihpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIraSk7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2UgaWYobD4xZS02KWlmKE1hdGguYWJzKHMqdS1mKmMpPjFlLTYmJmkpe3ZhciBoPWUtbyxkPXItYSxwPXUqdStmKmYsdj1oKmgrZCpkLGc9TWF0aC5zcXJ0KHApLHk9TWF0aC5zcXJ0KGwpLF89aSpNYXRoLnRhbigoSWktTWF0aC5hY29zKChwK2wtdikvKDIqZyp5KSkpLzIpLGI9Xy95LG09Xy9nO01hdGguYWJzKGItMSk+MWUtNiYmKHRoaXMuXys9IkwiKyh0K2IqYykrIiwiKyhuK2IqcykpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhzKmg+YypkKSsiLCIrKHRoaXMuX3gxPXQrbSp1KSsiLCIrKHRoaXMuX3kxPW4rbSpmKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2U7fSxhcmM6ZnVuY3Rpb24odCxuLGUscixpLG8pe3Q9K3Qsbj0rbjt2YXIgYT0oZT0rZSkqTWF0aC5jb3MociksdT1lKk1hdGguc2luKHIpLGY9dCthLGM9bit1LHM9MV5vLGw9bz9yLWk6aS1yO2lmKGU8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitlKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrZisiLCIrYzooTWF0aC5hYnModGhpcy5feDEtZik+MWUtNnx8TWF0aC5hYnModGhpcy5feTEtYyk+MWUtNikmJih0aGlzLl8rPSJMIitmKyIsIitjKSxlJiYobDwwJiYobD1sJUhpK0hpKSxsPmppP3RoaXMuXys9IkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodC1hKSsiLCIrKG4tdSkrIkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodGhpcy5feDE9ZikrIiwiKyh0aGlzLl95MT1jKTpsPjFlLTYmJih0aGlzLl8rPSJBIitlKyIsIitlKyIsMCwiKyArKGw+PUlpKSsiLCIrcysiLCIrKHRoaXMuX3gxPXQrZSpNYXRoLmNvcyhpKSkrIiwiKyh0aGlzLl95MT1uK2UqTWF0aC5zaW4oaSkpKSl9LHJlY3Q6ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKSsiaCIrICtlKyJ2IisgK3IrImgiKy1lKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07ZnVuY3Rpb24gSmkoKXt9ZnVuY3Rpb24gS2kodCxuKXt2YXIgZT1uZXcgSmk7aWYodCBpbnN0YW5jZW9mIEppKXQuZWFjaChmdW5jdGlvbih0LG4pe2Uuc2V0KG4sdCl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciByLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytpPG87KWUuc2V0KGksdFtpXSk7ZWxzZSBmb3IoOysraTxvOyllLnNldChuKHI9dFtpXSxpLHQpLHIpfWVsc2UgaWYodClmb3IodmFyIGEgaW4gdCllLnNldChhLHRbYV0pO3JldHVybiBlfWZ1bmN0aW9uIHRvKCl7cmV0dXJue319ZnVuY3Rpb24gbm8odCxuLGUpe3Rbbl09ZX1mdW5jdGlvbiBlbygpe3JldHVybiBLaSgpfWZ1bmN0aW9uIHJvKHQsbixlKXt0LnNldChuLGUpfWZ1bmN0aW9uIGlvKCl7fUppLnByb3RvdHlwZT1LaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkppLGhhczpmdW5jdGlvbih0KXtyZXR1cm4iJCIrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbIiQiK3RdfSxzZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpc1siJCIrdF09bix0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49IiQiK3Q7cmV0dXJuIG4gaW4gdGhpcyYmZGVsZXRlIHRoaXNbbl19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpIiQiPT09dFswXSYmZGVsZXRlIHRoaXNbdF19LGtleXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2gobi5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh0aGlzW25dKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh7a2V5Om4uc2xpY2UoMSksdmFsdWU6dGhpc1tuXX0pO3JldHVybiB0fSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYoIiQiPT09dFswXSlyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0KHRoaXNbbl0sbi5zbGljZSgxKSx0aGlzKX19O3ZhciBvbz1LaS5wcm90b3R5cGU7ZnVuY3Rpb24gYW8odCxuKXt2YXIgZT1uZXcgaW87aWYodCBpbnN0YW5jZW9mIGlvKXQuZWFjaChmdW5jdGlvbih0KXtlLmFkZCh0KX0pO2Vsc2UgaWYodCl7dmFyIHI9LTEsaT10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytyPGk7KWUuYWRkKHRbcl0pO2Vsc2UgZm9yKDsrK3I8aTspZS5hZGQobih0W3JdLHIsdCkpfXJldHVybiBlfWlvLnByb3RvdHlwZT1hby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmlvLGhhczpvby5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIisodCs9IiIpXT10LHRoaXN9LHJlbW92ZTpvby5yZW1vdmUsY2xlYXI6b28uY2xlYXIsdmFsdWVzOm9vLmtleXMsc2l6ZTpvby5zaXplLGVtcHR5Om9vLmVtcHR5LGVhY2g6b28uZWFjaH07dmFyIHVvPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBmbyh0LG4pe3JldHVybiB0LW59ZnVuY3Rpb24gY28odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHNvKHQsbil7Zm9yKHZhciBlLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspaWYoZT1sbyh0LG5bcl0pKXJldHVybiBlO3JldHVybiAwfWZ1bmN0aW9uIGxvKHQsbil7Zm9yKHZhciBlPW5bMF0scj1uWzFdLGk9LTEsbz0wLGE9dC5sZW5ndGgsdT1hLTE7bzxhO3U9bysrKXt2YXIgZj10W29dLGM9ZlswXSxzPWZbMV0sbD10W3VdLGg9bFswXSxkPWxbMV07aWYoaG8oZixsLG4pKXJldHVybiAwO3M+ciE9ZD5yJiZlPChoLWMpKihyLXMpLyhkLXMpK2MmJihpPS1pKX1yZXR1cm4gaX1mdW5jdGlvbiBobyh0LG4sZSl7dmFyIHIsaSxvLGE7cmV0dXJuIGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKT09KGVbMF0tdFswXSkqKG5bMV0tdFsxXSl9KHQsbixlKSYmKGk9dFtyPSsodFswXT09PW5bMF0pXSxvPWVbcl0sYT1uW3JdLGk8PW8mJm88PWF8fGE8PW8mJm88PWkpfWZ1bmN0aW9uIHBvKCl7fXZhciB2bz1bW10sW1tbMSwxLjVdLFsuNSwxXV1dLFtbWzEuNSwxXSxbMSwxLjVdXV0sW1tbMS41LDFdLFsuNSwxXV1dLFtbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLDEuNV0sWy41LDFdXSxbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLC41XSxbMSwxLjVdXV0sW1tbMSwuNV0sWy41LDFdXV0sW1tbLjUsMV0sWzEsLjVdXV0sW1tbMSwxLjVdLFsxLC41XV1dLFtbWy41LDFdLFsxLC41XV0sW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbMSwuNV1dXSxbW1suNSwxXSxbMS41LDFdXV0sW1tbMSwxLjVdLFsxLjUsMV1dXSxbW1suNSwxXSxbMSwxLjVdXV0sW11dO2Z1bmN0aW9uIGdvKCl7dmFyIHQ9MSxuPTEsZT1NLHI9dTtmdW5jdGlvbiBpKHQpe3ZhciBuPWUodCk7aWYoQXJyYXkuaXNBcnJheShuKSluPW4uc2xpY2UoKS5zb3J0KGZvKTtlbHNle3ZhciByPXModCksaT1yWzBdLGE9clsxXTtuPXcoaSxhLG4pLG49ZyhNYXRoLmZsb29yKGkvbikqbixNYXRoLmZsb29yKGEvbikqbixuKX1yZXR1cm4gbi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG8odCxuKX0pfWZ1bmN0aW9uIG8oZSxpKXt2YXIgbz1bXSx1PVtdO3JldHVybiBmdW5jdGlvbihlLHIsaSl7dmFyIG8sdSxmLGMscyxsLGg9bmV3IEFycmF5LGQ9bmV3IEFycmF5O289dT0tMSxjPWVbMF0+PXIsdm9bYzw8MV0uZm9yRWFjaChwKTtmb3IoOysrbzx0LTE7KWY9YyxjPWVbbysxXT49cix2b1tmfGM8PDFdLmZvckVhY2gocCk7dm9bYzw8MF0uZm9yRWFjaChwKTtmb3IoOysrdTxuLTE7KXtmb3Iobz0tMSxjPWVbdSp0K3RdPj1yLHM9ZVt1KnRdPj1yLHZvW2M8PDF8czw8Ml0uZm9yRWFjaChwKTsrK288dC0xOylmPWMsYz1lW3UqdCt0K28rMV0+PXIsbD1zLHM9ZVt1KnQrbysxXT49cix2b1tmfGM8PDF8czw8MnxsPDwzXS5mb3JFYWNoKHApO3ZvW2N8czw8M10uZm9yRWFjaChwKX1vPS0xLHM9ZVt1KnRdPj1yLHZvW3M8PDJdLmZvckVhY2gocCk7Zm9yKDsrK288dC0xOylsPXMscz1lW3UqdCtvKzFdPj1yLHZvW3M8PDJ8bDw8M10uZm9yRWFjaChwKTtmdW5jdGlvbiBwKHQpe3ZhciBuLGUscj1bdFswXVswXStvLHRbMF1bMV0rdV0sZj1bdFsxXVswXStvLHRbMV1bMV0rdV0sYz1hKHIpLHM9YShmKTsobj1kW2NdKT8oZT1oW3NdKT8oZGVsZXRlIGRbbi5lbmRdLGRlbGV0ZSBoW2Uuc3RhcnRdLG49PT1lPyhuLnJpbmcucHVzaChmKSxpKG4ucmluZykpOmhbbi5zdGFydF09ZFtlLmVuZF09e3N0YXJ0Om4uc3RhcnQsZW5kOmUuZW5kLHJpbmc6bi5yaW5nLmNvbmNhdChlLnJpbmcpfSk6KGRlbGV0ZSBkW24uZW5kXSxuLnJpbmcucHVzaChmKSxkW24uZW5kPXNdPW4pOihuPWhbc10pPyhlPWRbY10pPyhkZWxldGUgaFtuLnN0YXJ0XSxkZWxldGUgZFtlLmVuZF0sbj09PWU/KG4ucmluZy5wdXNoKGYpLGkobi5yaW5nKSk6aFtlLnN0YXJ0XT1kW24uZW5kXT17c3RhcnQ6ZS5zdGFydCxlbmQ6bi5lbmQscmluZzplLnJpbmcuY29uY2F0KG4ucmluZyl9KTooZGVsZXRlIGhbbi5zdGFydF0sbi5yaW5nLnVuc2hpZnQociksaFtuLnN0YXJ0PWNdPW4pOmhbY109ZFtzXT17c3RhcnQ6YyxlbmQ6cyxyaW5nOltyLGZdfX12b1tzPDwzXS5mb3JFYWNoKHApfShlLGksZnVuY3Rpb24odCl7cih0LGUsaSksZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aCxyPXRbZS0xXVsxXSp0WzBdWzBdLXRbZS0xXVswXSp0WzBdWzFdOysrbjxlOylyKz10W24tMV1bMV0qdFtuXVswXS10W24tMV1bMF0qdFtuXVsxXTtyZXR1cm4gcn0odCk+MD9vLnB1c2goW3RdKTp1LnB1c2godCl9KSx1LmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPW8ubGVuZ3RoO2U8cjsrK2UpaWYoLTEhPT1zbygobj1vW2VdKVswXSx0KSlyZXR1cm4gdm9pZCBuLnB1c2godCl9KSx7dHlwZToiTXVsdGlQb2x5Z29uIix2YWx1ZTppLGNvb3JkaW5hdGVzOm99fWZ1bmN0aW9uIGEobil7cmV0dXJuIDIqblswXStuWzFdKih0KzEpKjR9ZnVuY3Rpb24gdShlLHIsaSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBvLGE9ZVswXSx1PWVbMV0sZj0wfGEsYz0wfHUscz1yW2MqdCtmXTthPjAmJmE8dCYmZj09PWEmJihvPXJbYyp0K2YtMV0sZVswXT1hKyhpLW8pLyhzLW8pLS41KSx1PjAmJnU8biYmYz09PXUmJihvPXJbKGMtMSkqdCtmXSxlWzFdPXUrKGktbykvKHMtbyktLjUpfSl9cmV0dXJuIGkuY29udG91cj1vLGkuc2l6ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bdCxuXTt2YXIgcj1NYXRoLmNlaWwoZVswXSksbz1NYXRoLmNlaWwoZVsxXSk7aWYoIShyPjAmJm8+MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gdD1yLG49byxpfSxpLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP2NvKHVvLmNhbGwodCkpOmNvKHQpLGkpOmV9LGkuc21vb3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQ/dTpwbyxpKTpyPT09dX0saX1mdW5jdGlvbiB5byh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPGk7KythKWZvcih2YXIgdT0wLGY9MDt1PHIrZTsrK3UpdTxyJiYoZis9dC5kYXRhW3UrYSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbdS1vK2Eqcl0pLG4uZGF0YVt1LWUrYSpyXT1mL01hdGgubWluKHUrMSxyLTErby11LG8pKX1mdW5jdGlvbiBfbyh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPHI7KythKWZvcih2YXIgdT0wLGY9MDt1PGkrZTsrK3UpdTxpJiYoZis9dC5kYXRhW2ErdSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbYSsodS1vKSpyXSksbi5kYXRhW2ErKHUtZSkqcl09Zi9NYXRoLm1pbih1KzEsaS0xK28tdSxvKSl9ZnVuY3Rpb24gYm8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gbW8odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24geG8oKXtyZXR1cm4gMX12YXIgd289e30sTW89e30sQW89MzQsVG89MTAsTm89MTM7ZnVuY3Rpb24gU28odCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisiXSJ9KS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiBFbyh0KXt2YXIgbj1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxlPXQuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiByKHQsbil7dmFyIHIsaT1bXSxvPXQubGVuZ3RoLGE9MCx1PTAsZj1vPD0wLGM9ITE7ZnVuY3Rpb24gcygpe2lmKGYpcmV0dXJuIE1vO2lmKGMpcmV0dXJuIGM9ITEsd287dmFyIG4scixpPWE7aWYodC5jaGFyQ29kZUF0KGkpPT09QW8pe2Zvcig7YSsrPG8mJnQuY2hhckNvZGVBdChhKSE9PUFvfHx0LmNoYXJDb2RlQXQoKythKT09PUFvOyk7cmV0dXJuKG49YSk+PW8/Zj0hMDoocj10LmNoYXJDb2RlQXQoYSsrKSk9PT1Ubz9jPSEwOnI9PT1ObyYmKGM9ITAsdC5jaGFyQ29kZUF0KGEpPT09VG8mJisrYSksdC5zbGljZShpKzEsbi0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPG87KXtpZigocj10LmNoYXJDb2RlQXQobj1hKyspKT09PVRvKWM9ITA7ZWxzZSBpZihyPT09Tm8pYz0hMCx0LmNoYXJDb2RlQXQoYSk9PT1UbyYmKythO2Vsc2UgaWYociE9PWUpY29udGludWU7cmV0dXJuIHQuc2xpY2UoaSxuKX1yZXR1cm4gZj0hMCx0LnNsaWNlKGksbyl9Zm9yKHQuY2hhckNvZGVBdChvLTEpPT09VG8mJi0tbyx0LmNoYXJDb2RlQXQoby0xKT09PU5vJiYtLW87KHI9cygpKSE9PU1vOyl7Zm9yKHZhciBsPVtdO3IhPT13byYmciE9PU1vOylsLnB1c2gocikscj1zKCk7biYmbnVsbD09KGw9bihsLHUrKykpfHxpLnB1c2gobCl9cmV0dXJuIGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbi5tYXAobykuam9pbih0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsPT10PyIiOm4udGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvIi9nLCciIicpKyciJzp0fXJldHVybntwYXJzZTpmdW5jdGlvbih0LG4pe3ZhciBlLGksbz1yKHQsZnVuY3Rpb24odCxyKXtpZihlKXJldHVybiBlKHQsci0xKTtpPXQsZT1uP2Z1bmN0aW9uKHQsbil7dmFyIGU9U28odCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIG4oZShyKSxpLHQpfX0odCxuKTpTbyh0KX0pO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOnIsZm9ybWF0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIG51bGw9PWUmJihlPWZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfShuKSksW2UubWFwKG8pLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG8oblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGkpLmpvaW4oIlxuIil9fX12YXIga289RW8oIiwiKSxDbz1rby5wYXJzZSxQbz1rby5wYXJzZVJvd3Msem89a28uZm9ybWF0LFJvPWtvLmZvcm1hdFJvd3MsTG89RW8oIlx0IiksRG89TG8ucGFyc2UsVW89TG8ucGFyc2VSb3dzLHFvPUxvLmZvcm1hdCxPbz1Mby5mb3JtYXRSb3dzO2Z1bmN0aW9uIFlvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5ibG9iKCl9ZnVuY3Rpb24gQm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmFycmF5QnVmZmVyKCl9ZnVuY3Rpb24gRm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LnRleHQoKX1mdW5jdGlvbiBJbyh0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oRm8pfWZ1bmN0aW9uIEhvKHQpe3JldHVybiBmdW5jdGlvbihuLGUscil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPXZvaWQgMCksSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiB0KG4scil9KX19dmFyIGpvPUhvKENvKSxYbz1IbyhEbyk7ZnVuY3Rpb24gR28odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0Lmpzb24oKX1mdW5jdGlvbiBWbyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybihuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcobix0KX0pfX12YXIgJG89Vm8oImFwcGxpY2F0aW9uL3htbCIpLFdvPVZvKCJ0ZXh0L2h0bWwiKSxabz1WbygiaW1hZ2Uvc3ZnK3htbCIpO2Z1bmN0aW9uIFFvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBKbygpe3JldHVybiAxZS02KihNYXRoLnJhbmRvbSgpLS41KX1mdW5jdGlvbiBLbyh0LG4sZSxyKXtpZihpc05hTihuKXx8aXNOYU4oZSkpcmV0dXJuIHQ7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQ9dC5fcm9vdCxwPXtkYXRhOnJ9LHY9dC5feDAsZz10Ll95MCx5PXQuX3gxLF89dC5feTE7aWYoIWQpcmV0dXJuIHQuX3Jvb3Q9cCx0O2Zvcig7ZC5sZW5ndGg7KWlmKChjPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChzPWU+PShhPShnK18pLzIpKT9nPWE6Xz1hLGk9ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiBpW2xdPXAsdDtpZih1PSt0Ll94LmNhbGwobnVsbCxkLmRhdGEpLGY9K3QuX3kuY2FsbChudWxsLGQuZGF0YSksbj09PXUmJmU9PT1mKXJldHVybiBwLm5leHQ9ZCxpP2lbbF09cDp0Ll9yb290PXAsdDtkb3tpPWk/aVtsXT1uZXcgQXJyYXkoNCk6dC5fcm9vdD1uZXcgQXJyYXkoNCksKGM9bj49KG89KHYreSkvMikpP3Y9bzp5PW8sKHM9ZT49KGE9KGcrXykvMikpP2c9YTpfPWF9d2hpbGUoKGw9czw8MXxjKT09KGg9KGY+PWEpPDwxfHU+PW8pKTtyZXR1cm4gaVtoXT1kLGlbbF09cCx0fWZ1bmN0aW9uIHRhKHQsbixlLHIsaSl7dGhpcy5ub2RlPXQsdGhpcy54MD1uLHRoaXMueTA9ZSx0aGlzLngxPXIsdGhpcy55MT1pfWZ1bmN0aW9uIG5hKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGVhKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHJhKHQsbixlKXt2YXIgcj1uZXcgaWEobnVsbD09bj9uYTpuLG51bGw9PWU/ZWE6ZSxOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P3I6ci5hZGRBbGwodCl9ZnVuY3Rpb24gaWEodCxuLGUscixpLG8pe3RoaXMuX3g9dCx0aGlzLl95PW4sdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBvYSh0KXtmb3IodmFyIG49e2RhdGE6dC5kYXRhfSxlPW47dD10Lm5leHQ7KWU9ZS5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIG59dmFyIGFhPXJhLnByb3RvdHlwZT1pYS5wcm90b3R5cGU7ZnVuY3Rpb24gdWEodCl7cmV0dXJuIHQueCt0LnZ4fWZ1bmN0aW9uIGZhKHQpe3JldHVybiB0LnkrdC52eX1mdW5jdGlvbiBjYSh0KXtyZXR1cm4gdC5pbmRleH1mdW5jdGlvbiBzYSh0LG4pe3ZhciBlPXQuZ2V0KG4pO2lmKCFlKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIituKTtyZXR1cm4gZX1mdW5jdGlvbiBsYSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIGhhKHQpe3JldHVybiB0Lnl9YWEuY29weT1mdW5jdGlvbigpe3ZhciB0LG4sZT1uZXcgaWEodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxyPXRoaXMuX3Jvb3Q7aWYoIXIpcmV0dXJuIGU7aWYoIXIubGVuZ3RoKXJldHVybiBlLl9yb290PW9hKHIpLGU7Zm9yKHQ9W3tzb3VyY2U6cix0YXJnZXQ6ZS5fcm9vdD1uZXcgQXJyYXkoNCl9XTtyPXQucG9wKCk7KWZvcih2YXIgaT0wO2k8NDsrK2kpKG49ci5zb3VyY2VbaV0pJiYobi5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6bix0YXJnZXQ6ci50YXJnZXRbaV09bmV3IEFycmF5KDQpfSk6ci50YXJnZXRbaV09b2EobikpO3JldHVybiBlfSxhYS5hZGQ9ZnVuY3Rpb24odCl7dmFyIG49K3RoaXMuX3guY2FsbChudWxsLHQpLGU9K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBLbyh0aGlzLmNvdmVyKG4sZSksbixlLHQpfSxhYS5hZGRBbGw9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSx1PW5ldyBBcnJheShvKSxmPTEvMCxjPTEvMCxzPS0xLzAsbD0tMS8wO2ZvcihlPTA7ZTxvOysrZSlpc05hTihyPSt0aGlzLl94LmNhbGwobnVsbCxuPXRbZV0pKXx8aXNOYU4oaT0rdGhpcy5feS5jYWxsKG51bGwsbikpfHwoYVtlXT1yLHVbZV09aSxyPGYmJihmPXIpLHI+cyYmKHM9ciksaTxjJiYoYz1pKSxpPmwmJihsPWkpKTtmb3IoczxmJiYoZj10aGlzLl94MCxzPXRoaXMuX3gxKSxsPGMmJihjPXRoaXMuX3kwLGw9dGhpcy5feTEpLHRoaXMuY292ZXIoZixjKS5jb3ZlcihzLGwpLGU9MDtlPG87KytlKUtvKHRoaXMsYVtlXSx1W2VdLHRbZV0pO3JldHVybiB0aGlzfSxhYS5jb3Zlcj1mdW5jdGlvbih0LG4pe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihuPStuKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLl94MCxyPXRoaXMuX3kwLGk9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihlKSlpPShlPU1hdGguZmxvb3IodCkpKzEsbz0ocj1NYXRoLmZsb29yKG4pKSsxO2Vsc2V7aWYoIShlPnR8fHQ+aXx8cj5ufHxuPm8pKXJldHVybiB0aGlzO3ZhciBhLHUsZj1pLWUsYz10aGlzLl9yb290O3N3aXRjaCh1PShuPChyK28pLzIpPDwxfHQ8KGUraSkvMil7Y2FzZSAwOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSx0PihpPWUrZil8fG4+byk7YnJlYWs7Y2FzZSAxOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSwoZT1pLWYpPnR8fG4+byk7YnJlYWs7Y2FzZSAyOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSx0PihpPWUrZil8fHI+bik7YnJlYWs7Y2FzZSAzOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSwoZT1pLWYpPnR8fHI+bil9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1lLHRoaXMuX3kwPXIsdGhpcy5feDE9aSx0aGlzLl95MT1vLHRoaXN9LGFhLmRhdGE9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97dC5wdXNoKG4uZGF0YSl9d2hpbGUobj1uLm5leHQpfSksdH0sYWEuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK3RbMF1bMF0sK3RbMF1bMV0pLmNvdmVyKCt0WzFdWzBdLCt0WzFdWzFdKTppc05hTih0aGlzLl94MCk/dm9pZCAwOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfSxhYS5maW5kPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYSx1LGYsYyxzPXRoaXMuX3gwLGw9dGhpcy5feTAsaD10aGlzLl94MSxkPXRoaXMuX3kxLHA9W10sdj10aGlzLl9yb290O2Zvcih2JiZwLnB1c2gobmV3IHRhKHYscyxsLGgsZCkpLG51bGw9PWU/ZT0xLzA6KHM9dC1lLGw9bi1lLGg9dCtlLGQ9bitlLGUqPWUpO2Y9cC5wb3AoKTspaWYoISghKHY9Zi5ub2RlKXx8KGk9Zi54MCk+aHx8KG89Zi55MCk+ZHx8KGE9Zi54MSk8c3x8KHU9Zi55MSk8bCkpaWYodi5sZW5ndGgpe3ZhciBnPShpK2EpLzIseT0obyt1KS8yO3AucHVzaChuZXcgdGEodlszXSxnLHksYSx1KSxuZXcgdGEodlsyXSxpLHksZyx1KSxuZXcgdGEodlsxXSxnLG8sYSx5KSxuZXcgdGEodlswXSxpLG8sZyx5KSksKGM9KG4+PXkpPDwxfHQ+PWcpJiYoZj1wW3AubGVuZ3RoLTFdLHBbcC5sZW5ndGgtMV09cFtwLmxlbmd0aC0xLWNdLHBbcC5sZW5ndGgtMS1jXT1mKX1lbHNle3ZhciBfPXQtK3RoaXMuX3guY2FsbChudWxsLHYuZGF0YSksYj1uLSt0aGlzLl95LmNhbGwobnVsbCx2LmRhdGEpLG09XypfK2IqYjtpZihtPGUpe3ZhciB4PU1hdGguc3FydChlPW0pO3M9dC14LGw9bi14LGg9dCt4LGQ9bit4LHI9di5kYXRhfX1yZXR1cm4gcn0sYWEucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKG89K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4oYT0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBuLGUscixpLG8sYSx1LGYsYyxzLGwsaCxkPXRoaXMuX3Jvb3QscD10aGlzLl94MCx2PXRoaXMuX3kwLGc9dGhpcy5feDEseT10aGlzLl95MTtpZighZClyZXR1cm4gdGhpcztpZihkLmxlbmd0aClmb3IoOzspe2lmKChjPW8+PSh1PShwK2cpLzIpKT9wPXU6Zz11LChzPWE+PShmPSh2K3kpLzIpKT92PWY6eT1mLG49ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiB0aGlzO2lmKCFkLmxlbmd0aClicmVhazsobltsKzEmM118fG5bbCsyJjNdfHxuW2wrMyYzXSkmJihlPW4saD1sKX1mb3IoO2QuZGF0YSE9PXQ7KWlmKHI9ZCwhKGQ9ZC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4oaT1kLm5leHQpJiZkZWxldGUgZC5uZXh0LHI/KGk/ci5uZXh0PWk6ZGVsZXRlIHIubmV4dCx0aGlzKTpuPyhpP25bbF09aTpkZWxldGUgbltsXSwoZD1uWzBdfHxuWzFdfHxuWzJdfHxuWzNdKSYmZD09PShuWzNdfHxuWzJdfHxuWzFdfHxuWzBdKSYmIWQubGVuZ3RoJiYoZT9lW2hdPWQ6dGhpcy5fcm9vdD1kKSx0aGlzKToodGhpcy5fcm9vdD1pLHRoaXMpfSxhYS5yZW1vdmVBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKXRoaXMucmVtb3ZlKHRbbl0pO3JldHVybiB0aGlzfSxhYS5yb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LGFhLnNpemU9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKG4pe2lmKCFuLmxlbmd0aClkb3srK3R9d2hpbGUobj1uLm5leHQpfSksdH0sYWEudmlzaXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU9W10sZj10aGlzLl9yb290O2ZvcihmJiZ1LnB1c2gobmV3IHRhKGYsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPXUucG9wKCk7KWlmKCF0KGY9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLGE9bi55MSkmJmYubGVuZ3RoKXt2YXIgYz0ocitvKS8yLHM9KGkrYSkvMjsoZT1mWzNdKSYmdS5wdXNoKG5ldyB0YShlLGMscyxvLGEpKSwoZT1mWzJdKSYmdS5wdXNoKG5ldyB0YShlLHIscyxjLGEpKSwoZT1mWzFdKSYmdS5wdXNoKG5ldyB0YShlLGMsaSxvLHMpKSwoZT1mWzBdKSYmdS5wdXNoKG5ldyB0YShlLHIsaSxjLHMpKX1yZXR1cm4gdGhpc30sYWEudmlzaXRBZnRlcj1mdW5jdGlvbih0KXt2YXIgbixlPVtdLHI9W107Zm9yKHRoaXMuX3Jvb3QmJmUucHVzaChuZXcgdGEodGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249ZS5wb3AoKTspe3ZhciBpPW4ubm9kZTtpZihpLmxlbmd0aCl7dmFyIG8sYT1uLngwLHU9bi55MCxmPW4ueDEsYz1uLnkxLHM9KGErZikvMixsPSh1K2MpLzI7KG89aVswXSkmJmUucHVzaChuZXcgdGEobyxhLHUscyxsKSksKG89aVsxXSkmJmUucHVzaChuZXcgdGEobyxzLHUsZixsKSksKG89aVsyXSkmJmUucHVzaChuZXcgdGEobyxhLGwscyxjKSksKG89aVszXSkmJmUucHVzaChuZXcgdGEobyxzLGwsZixjKSl9ci5wdXNoKG4pfWZvcig7bj1yLnBvcCgpOyl0KG4ubm9kZSxuLngwLG4ueTAsbi54MSxuLnkxKTtyZXR1cm4gdGhpc30sYWEueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feD10LHRoaXMpOnRoaXMuX3h9LGFhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fTt2YXIgZGE9MTAscGE9TWF0aC5QSSooMy1NYXRoLnNxcnQoNSkpO2Z1bmN0aW9uIHZhKHQsbil7aWYoKGU9KHQ9bj90LnRvRXhwb25lbnRpYWwobi0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLHI9dC5zbGljZSgwLGUpO3JldHVybltyLmxlbmd0aD4xP3JbMF0rci5zbGljZSgyKTpyLCt0LnNsaWNlKGUrMSldfWZ1bmN0aW9uIGdhKHQpe3JldHVybih0PXZhKE1hdGguYWJzKHQpKSk/dFsxXTpOYU59dmFyIHlhLF9hPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIGJhKHQpe3JldHVybiBuZXcgbWEodCl9ZnVuY3Rpb24gbWEodCl7aWYoIShuPV9hLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIG47dGhpcy5maWxsPW5bMV18fCIgIix0aGlzLmFsaWduPW5bMl18fCI+Iix0aGlzLnNpZ249blszXXx8Ii0iLHRoaXMuc3ltYm9sPW5bNF18fCIiLHRoaXMuemVybz0hIW5bNV0sdGhpcy53aWR0aD1uWzZdJiYrbls2XSx0aGlzLmNvbW1hPSEhbls3XSx0aGlzLnByZWNpc2lvbj1uWzhdJiYrbls4XS5zbGljZSgxKSx0aGlzLnRyaW09ISFuWzldLHRoaXMudHlwZT1uWzEwXXx8IiJ9ZnVuY3Rpb24geGEodCxuKXt2YXIgZT12YSh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfWJhLnByb3RvdHlwZT1tYS5wcm90b3R5cGUsbWEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKG51bGw9PXRoaXMud2lkdGg/IiI6TWF0aC5tYXgoMSwwfHRoaXMud2lkdGgpKSsodGhpcy5jb21tYT8iLCI6IiIpKyhudWxsPT10aGlzLnByZWNpc2lvbj8iIjoiLiIrTWF0aC5tYXgoMCwwfHRoaXMucHJlY2lzaW9uKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07dmFyIHdhPXsiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiB4YSgxMDAqdCxuKX0scjp4YSxzOmZ1bmN0aW9uKHQsbil7dmFyIGU9dmEodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXSxvPWktKHlhPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGkvMykpKSkrMSxhPXIubGVuZ3RoO3JldHVybiBvPT09YT9yOm8+YT9yK25ldyBBcnJheShvLWErMSkuam9pbigiMCIpOm8+MD9yLnNsaWNlKDAsbykrIi4iK3Iuc2xpY2Uobyk6IjAuIituZXcgQXJyYXkoMS1vKS5qb2luKCIwIikrdmEodCxNYXRoLm1heCgwLG4rby0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX07ZnVuY3Rpb24gTWEodCl7cmV0dXJuIHR9dmFyIEFhLFRhPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBOYSh0KXt2YXIgbixlLHI9dC5ncm91cGluZyYmdC50aG91c2FuZHM/KG49dC5ncm91cGluZyxlPXQudGhvdXNhbmRzLGZ1bmN0aW9uKHQscil7Zm9yKHZhciBpPXQubGVuZ3RoLG89W10sYT0wLHU9blswXSxmPTA7aT4wJiZ1PjAmJihmK3UrMT5yJiYodT1NYXRoLm1heCgxLHItZikpLG8ucHVzaCh0LnN1YnN0cmluZyhpLT11LGkrdSkpLCEoKGYrPXUrMSk+cikpOyl1PW5bYT0oYSsxKSVuLmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oZSl9KTpNYSxpPXQuY3VycmVuY3ksbz10LmRlY2ltYWwsYT10Lm51bWVyYWxzP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0WytuXX0pfX0odC5udW1lcmFscyk6TWEsdT10LnBlcmNlbnR8fCIlIjtmdW5jdGlvbiBmKHQpe3ZhciBuPSh0PWJhKHQpKS5maWxsLGU9dC5hbGlnbixmPXQuc2lnbixjPXQuc3ltYm9sLHM9dC56ZXJvLGw9dC53aWR0aCxoPXQuY29tbWEsZD10LnByZWNpc2lvbixwPXQudHJpbSx2PXQudHlwZTsibiI9PT12PyhoPSEwLHY9ImciKTp3YVt2XXx8KG51bGw9PWQmJihkPTEyKSxwPSEwLHY9ImciKSwoc3x8IjAiPT09biYmIj0iPT09ZSkmJihzPSEwLG49IjAiLGU9Ij0iKTt2YXIgZz0iJCI9PT1jP2lbMF06IiMiPT09YyYmL1tib3hYXS8udGVzdCh2KT8iMCIrdi50b0xvd2VyQ2FzZSgpOiIiLHk9IiQiPT09Yz9pWzFdOi9bJXBdLy50ZXN0KHYpP3U6IiIsXz13YVt2XSxiPS9bZGVmZ3BycyVdLy50ZXN0KHYpO2Z1bmN0aW9uIG0odCl7dmFyIGksdSxjLG09Zyx4PXk7aWYoImMiPT09dil4PV8odCkreCx0PSIiO2Vsc2V7dmFyIHc9KHQ9K3QpPDA7aWYodD1fKE1hdGguYWJzKHQpLGQpLHAmJih0PWZ1bmN0aW9uKHQpe3Q6Zm9yKHZhciBuLGU9dC5sZW5ndGgscj0xLGk9LTE7cjxlOysrcilzd2l0Y2godFtyXSl7Y2FzZSIuIjppPW49cjticmVhaztjYXNlIjAiOjA9PT1pJiYoaT1yKSxuPXI7YnJlYWs7ZGVmYXVsdDppZihpPjApe2lmKCErdFtyXSlicmVhayB0O2k9MH19cmV0dXJuIGk+MD90LnNsaWNlKDAsaSkrdC5zbGljZShuKzEpOnR9KHQpKSx3JiYwPT0rdCYmKHc9ITEpLG09KHc/IigiPT09Zj9mOiItIjoiLSI9PT1mfHwiKCI9PT1mPyIiOmYpK20seD0oInMiPT09dj9UYVs4K3lhLzNdOiIiKSt4Kyh3JiYiKCI9PT1mPyIpIjoiIiksYilmb3IoaT0tMSx1PXQubGVuZ3RoOysraTx1OylpZig0OD4oYz10LmNoYXJDb2RlQXQoaSkpfHxjPjU3KXt4PSg0Nj09PWM/byt0LnNsaWNlKGkrMSk6dC5zbGljZShpKSkreCx0PXQuc2xpY2UoMCxpKTticmVha319aCYmIXMmJih0PXIodCwxLzApKTt2YXIgTT1tLmxlbmd0aCt0Lmxlbmd0aCt4Lmxlbmd0aCxBPU08bD9uZXcgQXJyYXkobC1NKzEpLmpvaW4obik6IiI7c3dpdGNoKGgmJnMmJih0PXIoQSt0LEEubGVuZ3RoP2wteC5sZW5ndGg6MS8wKSxBPSIiKSxlKXtjYXNlIjwiOnQ9bSt0K3grQTticmVhaztjYXNlIj0iOnQ9bStBK3QreDticmVhaztjYXNlIl4iOnQ9QS5zbGljZSgwLE09QS5sZW5ndGg+PjEpK20rdCt4K0Euc2xpY2UoTSk7YnJlYWs7ZGVmYXVsdDp0PUErbSt0K3h9cmV0dXJuIGEodCl9cmV0dXJuIGQ9bnVsbD09ZD82Oi9bZ3Byc10vLnRlc3Qodik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxkKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxkKSksbS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxtfXJldHVybntmb3JtYXQ6Zixmb3JtYXRQcmVmaXg6ZnVuY3Rpb24odCxuKXt2YXIgZT1mKCgodD1iYSh0KSkudHlwZT0iZiIsdCkpLHI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKSxpPU1hdGgucG93KDEwLC1yKSxvPVRhWzgrci8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUoaSp0KStvfX19fWZ1bmN0aW9uIFNhKG4pe3JldHVybiBBYT1OYShuKSx0LmZvcm1hdD1BYS5mb3JtYXQsdC5mb3JtYXRQcmVmaXg9QWEuZm9ybWF0UHJlZml4LEFhfWZ1bmN0aW9uIEVhKHQpe3JldHVybiBNYXRoLm1heCgwLC1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKS1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIENhKHQsbil7cmV0dXJuIHQ9TWF0aC5hYnModCksbj1NYXRoLmFicyhuKS10LE1hdGgubWF4KDAsZ2EobiktZ2EodCkpKzF9ZnVuY3Rpb24gUGEoKXtyZXR1cm4gbmV3IHphfWZ1bmN0aW9uIHphKCl7dGhpcy5yZXNldCgpfVNhKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pLHphLnByb3RvdHlwZT17Y29uc3RydWN0b3I6emEscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXtMYShSYSx0LHRoaXMudCksTGEodGhpcyxSYS5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9UmEudDp0aGlzLnM9UmEudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgUmE9bmV3IHphO2Z1bmN0aW9uIExhKHQsbixlKXt2YXIgcj10LnM9bitlLGk9ci1uLG89ci1pO3QudD1uLW8rKGUtaSl9dmFyIERhPTFlLTYsVWE9MWUtMTIscWE9TWF0aC5QSSxPYT1xYS8yLFlhPXFhLzQsQmE9MipxYSxGYT0xODAvcWEsSWE9cWEvMTgwLEhhPU1hdGguYWJzLGphPU1hdGguYXRhbixYYT1NYXRoLmF0YW4yLEdhPU1hdGguY29zLFZhPU1hdGguY2VpbCwkYT1NYXRoLmV4cCxXYT1NYXRoLmxvZyxaYT1NYXRoLnBvdyxRYT1NYXRoLnNpbixKYT1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sS2E9TWF0aC5zcXJ0LHR1PU1hdGgudGFuO2Z1bmN0aW9uIG51KHQpe3JldHVybiB0PjE/MDp0PC0xP3FhOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBldSh0KXtyZXR1cm4gdD4xP09hOnQ8LTE/LU9hOk1hdGguYXNpbih0KX1mdW5jdGlvbiBydSh0KXtyZXR1cm4odD1RYSh0LzIpKSp0fWZ1bmN0aW9uIGl1KCl7fWZ1bmN0aW9uIG91KHQsbil7dCYmdXUuaGFzT3duUHJvcGVydHkodC50eXBlKSYmdXVbdC50eXBlXSh0LG4pfXZhciBhdT17RmVhdHVyZTpmdW5jdGlvbih0LG4pe291KHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylvdShlW3JdLmdlb21ldHJ5LG4pfX0sdXU9e1NwaGVyZTpmdW5jdGlvbih0LG4pe24uc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsbil7dD10LmNvb3JkaW5hdGVzLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl0PWVbcl0sbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmdSh0LmNvb3JkaW5hdGVzLG4sMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspZnUoZVtyXSxuLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Y3UodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyljdShlW3JdLG4pfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspb3UoZVtyXSxuKX19O2Z1bmN0aW9uIGZ1KHQsbixlKXt2YXIgcixpPS0xLG89dC5sZW5ndGgtZTtmb3Iobi5saW5lU3RhcnQoKTsrK2k8bzspcj10W2ldLG4ucG9pbnQoclswXSxyWzFdLHJbMl0pO24ubGluZUVuZCgpfWZ1bmN0aW9uIGN1KHQsbil7dmFyIGU9LTEscj10Lmxlbmd0aDtmb3Iobi5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZnUodFtlXSxuLDEpO24ucG9seWdvbkVuZCgpfWZ1bmN0aW9uIHN1KHQsbil7dCYmYXUuaGFzT3duUHJvcGVydHkodC50eXBlKT9hdVt0LnR5cGVdKHQsbik6b3UodCxuKX12YXIgbHUsaHUsZHUscHUsdnUsZ3U9UGEoKSx5dT1QYSgpLF91PXtwb2ludDppdSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtndS5yZXNldCgpLF91LmxpbmVTdGFydD1idSxfdS5saW5lRW5kPW11fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K2d1O3l1LmFkZCh0PDA/QmErdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1pdX0sc3BoZXJlOmZ1bmN0aW9uKCl7eXUuYWRkKEJhKX19O2Z1bmN0aW9uIGJ1KCl7X3UucG9pbnQ9eHV9ZnVuY3Rpb24gbXUoKXt3dShsdSxodSl9ZnVuY3Rpb24geHUodCxuKXtfdS5wb2ludD13dSxsdT10LGh1PW4sZHU9dCo9SWEscHU9R2Eobj0obio9SWEpLzIrWWEpLHZ1PVFhKG4pfWZ1bmN0aW9uIHd1KHQsbil7dmFyIGU9KHQqPUlhKS1kdSxyPWU+PTA/MTotMSxpPXIqZSxvPUdhKG49KG4qPUlhKS8yK1lhKSxhPVFhKG4pLHU9dnUqYSxmPXB1Km8rdSpHYShpKSxjPXUqcipRYShpKTtndS5hZGQoWGEoYyxmKSksZHU9dCxwdT1vLHZ1PWF9ZnVuY3Rpb24gTXUodCl7cmV0dXJuW1hhKHRbMV0sdFswXSksZXUodFsyXSldfWZ1bmN0aW9uIEF1KHQpe3ZhciBuPXRbMF0sZT10WzFdLHI9R2EoZSk7cmV0dXJuW3IqR2EobikscipRYShuKSxRYShlKV19ZnVuY3Rpb24gVHUodCxuKXtyZXR1cm4gdFswXSpuWzBdK3RbMV0qblsxXSt0WzJdKm5bMl19ZnVuY3Rpb24gTnUodCxuKXtyZXR1cm5bdFsxXSpuWzJdLXRbMl0qblsxXSx0WzJdKm5bMF0tdFswXSpuWzJdLHRbMF0qblsxXS10WzFdKm5bMF1dfWZ1bmN0aW9uIFN1KHQsbil7dFswXSs9blswXSx0WzFdKz1uWzFdLHRbMl0rPW5bMl19ZnVuY3Rpb24gRXUodCxuKXtyZXR1cm5bdFswXSpuLHRbMV0qbix0WzJdKm5dfWZ1bmN0aW9uIGt1KHQpe3ZhciBuPUthKHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1uLHRbMV0vPW4sdFsyXS89bn12YXIgQ3UsUHUsenUsUnUsTHUsRHUsVXUscXUsT3UsWXUsQnUsRnUsSXUsSHUsanUsWHUsR3UsVnUsJHUsV3UsWnUsUXUsSnUsS3UsdGYsbmYsZWY9UGEoKSxyZj17cG9pbnQ6b2YsbGluZVN0YXJ0OnVmLGxpbmVFbmQ6ZmYscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7cmYucG9pbnQ9Y2YscmYubGluZVN0YXJ0PXNmLHJmLmxpbmVFbmQ9bGYsZWYucmVzZXQoKSxfdS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe191LnBvbHlnb25FbmQoKSxyZi5wb2ludD1vZixyZi5saW5lU3RhcnQ9dWYscmYubGluZUVuZD1mZixndTwwPyhDdT0tKHp1PTE4MCksUHU9LShSdT05MCkpOmVmPkRhP1J1PTkwOmVmPC1EYSYmKFB1PS05MCksWXVbMF09Q3UsWXVbMV09enV9fTtmdW5jdGlvbiBvZih0LG4pe091LnB1c2goWXU9W0N1PXQsenU9dF0pLG48UHUmJihQdT1uKSxuPlJ1JiYoUnU9bil9ZnVuY3Rpb24gYWYodCxuKXt2YXIgZT1BdShbdCpJYSxuKklhXSk7aWYocXUpe3ZhciByPU51KHF1LGUpLGk9TnUoW3JbMV0sLXJbMF0sMF0scik7a3UoaSksaT1NdShpKTt2YXIgbyxhPXQtTHUsdT1hPjA/MTotMSxmPWlbMF0qRmEqdSxjPUhhKGEpPjE4MDtjXih1Kkx1PGYmJmY8dSp0KT8obz1pWzFdKkZhKT5SdSYmKFJ1PW8pOmNeKHUqTHU8KGY9KGYrMzYwKSUzNjAtMTgwKSYmZjx1KnQpPyhvPS1pWzFdKkZhKTxQdSYmKFB1PW8pOihuPFB1JiYoUHU9biksbj5SdSYmKFJ1PW4pKSxjP3Q8THU/aGYoQ3UsdCk+aGYoQ3UsenUpJiYoenU9dCk6aGYodCx6dSk+aGYoQ3UsenUpJiYoQ3U9dCk6enU+PUN1Pyh0PEN1JiYoQ3U9dCksdD56dSYmKHp1PXQpKTp0Pkx1P2hmKEN1LHQpPmhmKEN1LHp1KSYmKHp1PXQpOmhmKHQsenUpPmhmKEN1LHp1KSYmKEN1PXQpfWVsc2UgT3UucHVzaChZdT1bQ3U9dCx6dT10XSk7bjxQdSYmKFB1PW4pLG4+UnUmJihSdT1uKSxxdT1lLEx1PXR9ZnVuY3Rpb24gdWYoKXtyZi5wb2ludD1hZn1mdW5jdGlvbiBmZigpe1l1WzBdPUN1LFl1WzFdPXp1LHJmLnBvaW50PW9mLHF1PW51bGx9ZnVuY3Rpb24gY2YodCxuKXtpZihxdSl7dmFyIGU9dC1MdTtlZi5hZGQoSGEoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBEdT10LFV1PW47X3UucG9pbnQodCxuKSxhZih0LG4pfWZ1bmN0aW9uIHNmKCl7X3UubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbGYoKXtjZihEdSxVdSksX3UubGluZUVuZCgpLEhhKGVmKT5EYSYmKEN1PS0oenU9MTgwKSksWXVbMF09Q3UsWXVbMV09enUscXU9bnVsbH1mdW5jdGlvbiBoZih0LG4pe3JldHVybihuLT10KTwwP24rMzYwOm59ZnVuY3Rpb24gZGYodCxuKXtyZXR1cm4gdFswXS1uWzBdfWZ1bmN0aW9uIHBmKHQsbil7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgdmY9e3NwaGVyZTppdSxwb2ludDpnZixsaW5lU3RhcnQ6X2YsbGluZUVuZDp4Zixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt2Zi5saW5lU3RhcnQ9d2YsdmYubGluZUVuZD1NZn0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZmLmxpbmVTdGFydD1fZix2Zi5saW5lRW5kPXhmfX07ZnVuY3Rpb24gZ2YodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSk7eWYoZSpHYSh0KSxlKlFhKHQpLFFhKG4pKX1mdW5jdGlvbiB5Zih0LG4sZSl7SXUrPSh0LUl1KS8rK0J1LEh1Kz0obi1IdSkvQnUsanUrPShlLWp1KS9CdX1mdW5jdGlvbiBfZigpe3ZmLnBvaW50PWJmfWZ1bmN0aW9uIGJmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx2Zi5wb2ludD1tZix5ZihLdSx0ZixuZil9ZnVuY3Rpb24gbWYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9WGEoS2EoKGE9dGYqby1uZippKSphKyhhPW5mKnItS3UqbykqYSsoYT1LdSppLXRmKnIpKmEpLEt1KnIrdGYqaStuZipvKTtGdSs9YSxYdSs9YSooS3UrKEt1PXIpKSxHdSs9YSoodGYrKHRmPWkpKSxWdSs9YSoobmYrKG5mPW8pKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24geGYoKXt2Zi5wb2ludD1nZn1mdW5jdGlvbiB3Zigpe3ZmLnBvaW50PUFmfWZ1bmN0aW9uIE1mKCl7VGYoUXUsSnUpLHZmLnBvaW50PWdmfWZ1bmN0aW9uIEFmKHQsbil7UXU9dCxKdT1uLHQqPUlhLG4qPUlhLHZmLnBvaW50PVRmO3ZhciBlPUdhKG4pO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24gVGYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9dGYqby1uZippLHU9bmYqci1LdSpvLGY9S3UqaS10ZipyLGM9S2EoYSphK3UqdStmKmYpLHM9ZXUoYyksbD1jJiYtcy9jOyR1Kz1sKmEsV3UrPWwqdSxadSs9bCpmLEZ1Kz1zLFh1Kz1zKihLdSsoS3U9cikpLEd1Kz1zKih0ZisodGY9aSkpLFZ1Kz1zKihuZisobmY9bykpLHlmKEt1LHRmLG5mKX1mdW5jdGlvbiBOZih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gU2YodCxuKXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9dChlLHIpLG4oZVswXSxlWzFdKX1yZXR1cm4gdC5pbnZlcnQmJm4uaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4oZT1uLmludmVydChlLHIpKSYmdC5pbnZlcnQoZVswXSxlWzFdKX0pLGV9ZnVuY3Rpb24gRWYodCxuKXtyZXR1cm5bdD5xYT90LUJhOnQ8LXFhP3QrQmE6dCxuXX1mdW5jdGlvbiBrZih0LG4sZSl7cmV0dXJuKHQlPUJhKT9ufHxlP1NmKFBmKHQpLHpmKG4sZSkpOlBmKHQpOm58fGU/emYobixlKTpFZn1mdW5jdGlvbiBDZih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm5bKG4rPXQpPnFhP24tQmE6bjwtcWE/bitCYTpuLGVdfX1mdW5jdGlvbiBQZih0KXt2YXIgbj1DZih0KTtyZXR1cm4gbi5pbnZlcnQ9Q2YoLXQpLG59ZnVuY3Rpb24gemYodCxuKXt2YXIgZT1HYSh0KSxyPVFhKHQpLGk9R2Eobiksbz1RYShuKTtmdW5jdGlvbiBhKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyplK3UqcjtyZXR1cm5bWGEoZippLXMqbyx1KmUtYypyKSxldShzKmkrZipvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyppLWYqbztyZXR1cm5bWGEoZippK2Mqbyx1KmUrcypyKSxldShzKmUtdSpyKV19LGF9ZnVuY3Rpb24gUmYodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4obj10KG5bMF0qSWEsblsxXSpJYSkpWzBdKj1GYSxuWzFdKj1GYSxufXJldHVybiB0PWtmKHRbMF0qSWEsdFsxXSpJYSx0Lmxlbmd0aD4yP3RbMl0qSWE6MCksbi5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuKG49dC5pbnZlcnQoblswXSpJYSxuWzFdKklhKSlbMF0qPUZhLG5bMV0qPUZhLG59LG59ZnVuY3Rpb24gTGYodCxuLGUscixpLG8pe2lmKGUpe3ZhciBhPUdhKG4pLHU9UWEobiksZj1yKmU7bnVsbD09aT8oaT1uK3IqQmEsbz1uLWYvMik6KGk9RGYoYSxpKSxvPURmKGEsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqQmEpKTtmb3IodmFyIGMscz1pO3I+MD9zPm86czxvO3MtPWYpYz1NdShbYSwtdSpHYShzKSwtdSpRYShzKV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gRGYodCxuKXsobj1BdShuKSlbMF0tPXQsa3Uobik7dmFyIGU9bnUoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStCYS1EYSklQmF9ZnVuY3Rpb24gVWYoKXt2YXIgdCxuPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihuLGUpe3QucHVzaChbbixlXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ucHVzaCh0PVtdKX0sbGluZUVuZDppdSxyZWpvaW46ZnVuY3Rpb24oKXtuLmxlbmd0aD4xJiZuLnB1c2gobi5wb3AoKS5jb25jYXQobi5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPW47cmV0dXJuIG49W10sdD1udWxsLGV9fX1mdW5jdGlvbiBxZih0LG4pe3JldHVybiBIYSh0WzBdLW5bMF0pPERhJiZIYSh0WzFdLW5bMV0pPERhfWZ1bmN0aW9uIE9mKHQsbixlLHIpe3RoaXMueD10LHRoaXMuej1uLHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gWWYodCxuLGUscixpKXt2YXIgbyxhLHU9W10sZj1bXTtpZih0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoISgobj10Lmxlbmd0aC0xKTw9MCkpe3ZhciBuLGUscj10WzBdLGE9dFtuXTtpZihxZihyLGEpKXtmb3IoaS5saW5lU3RhcnQoKSxvPTA7bzxuOysrbylpLnBvaW50KChyPXRbb10pWzBdLHJbMV0pO2kubGluZUVuZCgpfWVsc2UgdS5wdXNoKGU9bmV3IE9mKHIsdCxudWxsLCEwKSksZi5wdXNoKGUubz1uZXcgT2YocixudWxsLGUsITEpKSx1LnB1c2goZT1uZXcgT2YoYSx0LG51bGwsITEpKSxmLnB1c2goZS5vPW5ldyBPZihhLG51bGwsZSwhMCkpfX0pLHUubGVuZ3RoKXtmb3IoZi5zb3J0KG4pLEJmKHUpLEJmKGYpLG89MCxhPWYubGVuZ3RoO288YTsrK28pZltvXS5lPWU9IWU7Zm9yKHZhciBjLHMsbD11WzBdOzspe2Zvcih2YXIgaD1sLGQ9ITA7aC52OylpZigoaD1oLm4pPT09bClyZXR1cm47Yz1oLnosaS5saW5lU3RhcnQoKTtkb3tpZihoLnY9aC5vLnY9ITAsaC5lKXtpZihkKWZvcihvPTAsYT1jLmxlbmd0aDtvPGE7KytvKWkucG9pbnQoKHM9Y1tvXSlbMF0sc1sxXSk7ZWxzZSByKGgueCxoLm4ueCwxLGkpO2g9aC5ufWVsc2V7aWYoZClmb3IoYz1oLnAueixvPWMubGVuZ3RoLTE7bz49MDstLW8paS5wb2ludCgocz1jW29dKVswXSxzWzFdKTtlbHNlIHIoaC54LGgucC54LC0xLGkpO2g9aC5wfWM9KGg9aC5vKS56LGQ9IWR9d2hpbGUoIWgudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBCZih0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1FZi5pbnZlcnQ9RWY7dmFyIEZmPVBhKCk7ZnVuY3Rpb24gSWYodCxuKXt2YXIgZT1uWzBdLHI9blsxXSxpPVFhKHIpLG89W1FhKGUpLC1HYShlKSwwXSxhPTAsdT0wO0ZmLnJlc2V0KCksMT09PWk/cj1PYStEYTotMT09PWkmJihyPS1PYS1EYSk7Zm9yKHZhciBmPTAsYz10Lmxlbmd0aDtmPGM7KytmKWlmKGw9KHM9dFtmXSkubGVuZ3RoKWZvcih2YXIgcyxsLGg9c1tsLTFdLGQ9aFswXSxwPWhbMV0vMitZYSx2PVFhKHApLGc9R2EocCkseT0wO3k8bDsrK3ksZD1iLHY9eCxnPXcsaD1fKXt2YXIgXz1zW3ldLGI9X1swXSxtPV9bMV0vMitZYSx4PVFhKG0pLHc9R2EobSksTT1iLWQsQT1NPj0wPzE6LTEsVD1BKk0sTj1UPnFhLFM9dip4O2lmKEZmLmFkZChYYShTKkEqUWEoVCksZyp3K1MqR2EoVCkpKSxhKz1OP00rQSpCYTpNLE5eZD49ZV5iPj1lKXt2YXIgRT1OdShBdShoKSxBdShfKSk7a3UoRSk7dmFyIGs9TnUobyxFKTtrdShrKTt2YXIgQz0oTl5NPj0wPy0xOjEpKmV1KGtbMl0pOyhyPkN8fHI9PT1DJiYoRVswXXx8RVsxXSkpJiYodSs9Tl5NPj0wPzE6LTEpfX1yZXR1cm4oYTwtRGF8fGE8RGEmJkZmPC1EYSleMSZ1fWZ1bmN0aW9uIEhmKHQsbixlLHIpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgbyxhLHUsZj1uKGkpLGM9VWYoKSxzPW4oYyksbD0hMSxoPXtwb2ludDpkLGxpbmVTdGFydDp2LGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtoLnBvaW50PXksaC5saW5lU3RhcnQ9XyxoLmxpbmVFbmQ9YixhPVtdLG89W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtoLnBvaW50PWQsaC5saW5lU3RhcnQ9dixoLmxpbmVFbmQ9ZyxhPU4oYSk7dmFyIHQ9SWYobyxyKTthLmxlbmd0aD8obHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksWWYoYSxYZix0LGUsaSkpOnQmJihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGwmJihpLnBvbHlnb25FbmQoKSxsPSExKSxhPW89bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKG4sZSl7dChuLGUpJiZpLnBvaW50KG4sZSl9ZnVuY3Rpb24gcCh0LG4pe2YucG9pbnQodCxuKX1mdW5jdGlvbiB2KCl7aC5wb2ludD1wLGYubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2gucG9pbnQ9ZCxmLmxpbmVFbmQoKX1mdW5jdGlvbiB5KHQsbil7dS5wdXNoKFt0LG5dKSxzLnBvaW50KHQsbil9ZnVuY3Rpb24gXygpe3MubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiBiKCl7eSh1WzBdWzBdLHVbMF1bMV0pLHMubGluZUVuZCgpO3ZhciB0LG4sZSxyLGY9cy5jbGVhbigpLGg9Yy5yZXN1bHQoKSxkPWgubGVuZ3RoO2lmKHUucG9wKCksby5wdXNoKHUpLHU9bnVsbCxkKWlmKDEmZil7aWYoKG49KGU9aFswXSkubGVuZ3RoLTEpPjApe2ZvcihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLHQ9MDt0PG47Kyt0KWkucG9pbnQoKHI9ZVt0XSlbMF0sclsxXSk7aS5saW5lRW5kKCl9fWVsc2UgZD4xJiYyJmYmJmgucHVzaChoLnBvcCgpLmNvbmNhdChoLnNoaWZ0KCkpKSxhLnB1c2goaC5maWx0ZXIoamYpKX1yZXR1cm4gaH19ZnVuY3Rpb24gamYodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gWGYodCxuKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tT2EtRGE6T2EtdFsxXSktKChuPW4ueClbMF08MD9uWzFdLU9hLURhOk9hLW5bMV0pfXZhciBHZj1IZihmdW5jdGlvbigpe3JldHVybiEwfSxmdW5jdGlvbih0KXt2YXIgbixlPU5hTixyPU5hTixpPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxuPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHU9bz4wP3FhOi1xYSxmPUhhKG8tZSk7SGEoZi1xYSk8RGE/KHQucG9pbnQoZSxyPShyK2EpLzI+MD9PYTotT2EpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQodSxyKSx0LnBvaW50KG8sciksbj0wKTppIT09dSYmZj49cWEmJihIYShlLWkpPERhJiYoZS09aSpEYSksSGEoby11KTxEYSYmKG8tPXUqRGEpLHI9ZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhPVFhKHQtZSk7cmV0dXJuIEhhKGEpPkRhP2phKChRYShuKSoobz1HYShyKSkqUWEoZSktUWEocikqKGk9R2EobikpKlFhKHQpKS8oaSpvKmEpKToobityKS8yfShlLHIsbyxhKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksbj0wKSx0LnBvaW50KGU9byxyPWEpLGk9dX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fSxmdW5jdGlvbih0LG4sZSxyKXt2YXIgaTtpZihudWxsPT10KWk9ZSpPYSxyLnBvaW50KC1xYSxpKSxyLnBvaW50KDAsaSksci5wb2ludChxYSxpKSxyLnBvaW50KHFhLDApLHIucG9pbnQocWEsLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtcWEsLWkpLHIucG9pbnQoLXFhLDApLHIucG9pbnQoLXFhLGkpO2Vsc2UgaWYoSGEodFswXS1uWzBdKT5EYSl7dmFyIG89dFswXTxuWzBdP3FhOi1xYTtpPWUqby8yLHIucG9pbnQoLW8saSksci5wb2ludCgwLGkpLHIucG9pbnQobyxpKX1lbHNlIHIucG9pbnQoblswXSxuWzFdKX0sWy1xYSwtT2FdKTtmdW5jdGlvbiBWZih0KXt2YXIgbj1HYSh0KSxlPTYqSWEscj1uPjAsaT1IYShuKT5EYTtmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIEdhKHQpKkdhKGUpPm59ZnVuY3Rpb24gYSh0LGUscil7dmFyIGk9WzEsMCwwXSxvPU51KEF1KHQpLEF1KGUpKSxhPVR1KG8sbyksdT1vWzBdLGY9YS11KnU7aWYoIWYpcmV0dXJuIXImJnQ7dmFyIGM9biphL2Yscz0tbip1L2YsbD1OdShpLG8pLGg9RXUoaSxjKTtTdShoLEV1KG8scykpO3ZhciBkPWwscD1UdShoLGQpLHY9VHUoZCxkKSxnPXAqcC12KihUdShoLGgpLTEpO2lmKCEoZzwwKSl7dmFyIHk9S2EoZyksXz1FdShkLCgtcC15KS92KTtpZihTdShfLGgpLF89TXUoXyksIXIpcmV0dXJuIF87dmFyIGIsbT10WzBdLHg9ZVswXSx3PXRbMV0sTT1lWzFdO3g8bSYmKGI9bSxtPXgseD1iKTt2YXIgQT14LW0sVD1IYShBLXFhKTxEYTtpZighVCYmTTx3JiYoYj13LHc9TSxNPWIpLFR8fEE8RGE/VD93K00+MF5fWzFdPChIYShfWzBdLW0pPERhP3c6TSk6dzw9X1sxXSYmX1sxXTw9TTpBPnFhXihtPD1fWzBdJiZfWzBdPD14KSl7dmFyIE49RXUoZCwoLXAreSkvdik7cmV0dXJuIFN1KE4saCksW18sTXUoTildfX19ZnVuY3Rpb24gdShuLGUpe3ZhciBpPXI/dDpxYS10LG89MDtyZXR1cm4gbjwtaT9vfD0xOm4+aSYmKG98PTIpLGU8LWk/b3w9NDplPmkmJihvfD04KSxvfXJldHVybiBIZihvLGZ1bmN0aW9uKHQpe3ZhciBuLGUsZixjLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9Zj0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGwsaCl7dmFyIGQscD1bbCxoXSx2PW8obCxoKSxnPXI/dj8wOnUobCxoKTp2P3UobCsobDwwP3FhOi1xYSksaCk6MDtpZighbiYmKGM9Zj12KSYmdC5saW5lU3RhcnQoKSx2IT09ZiYmKCEoZD1hKG4scCkpfHxxZihuLGQpfHxxZihwLGQpKSYmKHBbMF0rPURhLHBbMV0rPURhLHY9byhwWzBdLHBbMV0pKSx2IT09ZilzPTAsdj8odC5saW5lU3RhcnQoKSxkPWEocCxuKSx0LnBvaW50KGRbMF0sZFsxXSkpOihkPWEobixwKSx0LnBvaW50KGRbMF0sZFsxXSksdC5saW5lRW5kKCkpLG49ZDtlbHNlIGlmKGkmJm4mJnJedil7dmFyIHk7ZyZlfHwhKHk9YShwLG4sITApKXx8KHM9MCxyPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoeVswXVswXSx5WzBdWzFdKSx0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSkpKX0hdnx8biYmcWYobixwKXx8dC5wb2ludChwWzBdLHBbMV0pLG49cCxmPXYsZT1nfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZiYmdC5saW5lRW5kKCksbj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChjJiZmKTw8MX19fSxmdW5jdGlvbihuLHIsaSxvKXtMZihvLHQsZSxpLG4scil9LHI/WzAsLXRdOlstcWEsdC1xYV0pfXZhciAkZj0xZTksV2Y9LSRmO2Z1bmN0aW9uIFpmKHQsbixlLHIpe2Z1bmN0aW9uIGkoaSxvKXtyZXR1cm4gdDw9aSYmaTw9ZSYmbjw9byYmbzw9cn1mdW5jdGlvbiBvKGksbyx1LGMpe3ZhciBzPTAsbD0wO2lmKG51bGw9PWl8fChzPWEoaSx1KSkhPT0obD1hKG8sdSkpfHxmKGksbyk8MF51PjApZG97Yy5wb2ludCgwPT09c3x8Mz09PXM/dDplLHM+MT9yOm4pfXdoaWxlKChzPShzK3UrNCklNCkhPT1sKTtlbHNlIGMucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiBhKHIsaSl7cmV0dXJuIEhhKHJbMF0tdCk8RGE/aT4wPzA6MzpIYShyWzBdLWUpPERhP2k+MD8yOjE6SGEoclsxXS1uKTxEYT9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gdSh0LG4pe3JldHVybiBmKHQueCxuLngpfWZ1bmN0aW9uIGYodCxuKXt2YXIgZT1hKHQsMSkscj1hKG4sMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT9uWzFdLXRbMV06MT09PWU/dFswXS1uWzBdOjI9PT1lP3RbMV0tblsxXTpuWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBmLGMscyxsLGgsZCxwLHYsZyx5LF8sYj1hLG09VWYoKSx4PXtwb2ludDp3LGxpbmVTdGFydDpmdW5jdGlvbigpe3gucG9pbnQ9TSxjJiZjLnB1c2gocz1bXSk7eT0hMCxnPSExLHA9dj1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmJiYoTShsLGgpLGQmJmcmJm0ucmVqb2luKCksZi5wdXNoKG0ucmVzdWx0KCkpKTt4LnBvaW50PXcsZyYmYi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2I9bSxmPVtdLGM9W10sXz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsZT0wLGk9Yy5sZW5ndGg7ZTxpOysrZSlmb3IodmFyIG8sYSx1PWNbZV0sZj0xLHM9dS5sZW5ndGgsbD11WzBdLGg9bFswXSxkPWxbMV07ZjxzOysrZilvPWgsYT1kLGw9dVtmXSxoPWxbMF0sZD1sWzFdLGE8PXI/ZD5yJiYoaC1vKSooci1hKT4oZC1hKSoodC1vKSYmKytuOmQ8PXImJihoLW8pKihyLWEpPChkLWEpKih0LW8pJiYtLW47cmV0dXJuIG59KCksZT1fJiZuLGk9KGY9TihmKSkubGVuZ3RoOyhlfHxpKSYmKGEucG9seWdvblN0YXJ0KCksZSYmKGEubGluZVN0YXJ0KCksbyhudWxsLG51bGwsMSxhKSxhLmxpbmVFbmQoKSksaSYmWWYoZix1LG4sbyxhKSxhLnBvbHlnb25FbmQoKSk7Yj1hLGY9Yz1zPW51bGx9fTtmdW5jdGlvbiB3KHQsbil7aSh0LG4pJiZiLnBvaW50KHQsbil9ZnVuY3Rpb24gTShvLGEpe3ZhciB1PWkobyxhKTtpZihjJiZzLnB1c2goW28sYV0pLHkpbD1vLGg9YSxkPXUseT0hMSx1JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSkpO2Vsc2UgaWYodSYmZyliLnBvaW50KG8sYSk7ZWxzZXt2YXIgZj1bcD1NYXRoLm1heChXZixNYXRoLm1pbigkZixwKSksdj1NYXRoLm1heChXZixNYXRoLm1pbigkZix2KSldLG09W289TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsbykpLGE9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsYSkpXTshZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciBhLHU9dFswXSxmPXRbMV0sYz0wLHM9MSxsPW5bMF0tdSxoPW5bMV0tZjtpZihhPWUtdSxsfHwhKGE+MCkpe2lmKGEvPWwsbDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihsPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPWktdSxsfHwhKGE8MCkpe2lmKGEvPWwsbDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihsPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1pZihhPXItZixofHwhKGE+MCkpe2lmKGEvPWgsaDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihoPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPW8tZixofHwhKGE8MCkpe2lmKGEvPWgsaDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihoPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1yZXR1cm4gYz4wJiYodFswXT11K2MqbCx0WzFdPWYrYypoKSxzPDEmJihuWzBdPXUrcypsLG5bMV09ZitzKmgpLCEwfX19fX0oZixtLHQsbixlLHIpP3UmJihiLmxpbmVTdGFydCgpLGIucG9pbnQobyxhKSxfPSExKTooZ3x8KGIubGluZVN0YXJ0KCksYi5wb2ludChmWzBdLGZbMV0pKSxiLnBvaW50KG1bMF0sbVsxXSksdXx8Yi5saW5lRW5kKCksXz0hMSl9cD1vLHY9YSxnPXV9cmV0dXJuIHh9fXZhciBRZixKZixLZix0Yz1QYSgpLG5jPXtzcGhlcmU6aXUscG9pbnQ6aXUsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bmMucG9pbnQ9cmMsbmMubGluZUVuZD1lY30sbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6aXUscG9seWdvbkVuZDppdX07ZnVuY3Rpb24gZWMoKXtuYy5wb2ludD1uYy5saW5lRW5kPWl1fWZ1bmN0aW9uIHJjKHQsbil7UWY9dCo9SWEsSmY9UWEobio9SWEpLEtmPUdhKG4pLG5jLnBvaW50PWljfWZ1bmN0aW9uIGljKHQsbil7dCo9SWE7dmFyIGU9UWEobio9SWEpLHI9R2EobiksaT1IYSh0LVFmKSxvPUdhKGkpLGE9cipRYShpKSx1PUtmKmUtSmYqcipvLGY9SmYqZStLZipyKm87dGMuYWRkKFhhKEthKGEqYSt1KnUpLGYpKSxRZj10LEpmPWUsS2Y9cn1mdW5jdGlvbiBvYyh0KXtyZXR1cm4gdGMucmVzZXQoKSxzdSh0LG5jKSwrdGN9dmFyIGFjPVtudWxsLG51bGxdLHVjPXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczphY307ZnVuY3Rpb24gZmModCxuKXtyZXR1cm4gYWNbMF09dCxhY1sxXT1uLG9jKHVjKX12YXIgY2M9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbGModC5nZW9tZXRyeSxuKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0uZ2VvbWV0cnksbikpcmV0dXJuITA7cmV0dXJuITF9fSxzYz17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGhjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGhjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZGModC5jb29yZGluYXRlcyxuKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihkYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHBjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYocGMoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBsYyh0LG4pe3JldHVybiEoIXR8fCFzYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmc2NbdC50eXBlXSh0LG4pfWZ1bmN0aW9uIGhjKHQsbil7cmV0dXJuIDA9PT1mYyh0LG4pfWZ1bmN0aW9uIGRjKHQsbil7dmFyIGU9ZmModFswXSx0WzFdKTtyZXR1cm4gZmModFswXSxuKStmYyhuLHRbMV0pPD1lK0RhfWZ1bmN0aW9uIHBjKHQsbil7cmV0dXJuISFJZih0Lm1hcCh2YyksZ2MobikpfWZ1bmN0aW9uIHZjKHQpe3JldHVybih0PXQubWFwKGdjKSkucG9wKCksdH1mdW5jdGlvbiBnYyh0KXtyZXR1cm5bdFswXSpJYSx0WzFdKklhXX1mdW5jdGlvbiB5Yyh0LG4sZSl7dmFyIHI9Zyh0LG4tRGEsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gX2ModCxuLGUpe3ZhciByPWcodCxuLURhLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGJjKCl7dmFyIHQsbixlLHIsaSxvLGEsdSxmLGMscyxsLGg9MTAsZD1oLHA9OTAsdj0zNjAseT0yLjU7ZnVuY3Rpb24gXygpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmIoKX19ZnVuY3Rpb24gYigpe3JldHVybiBnKFZhKHIvcCkqcCxlLHApLm1hcChzKS5jb25jYXQoZyhWYSh1L3YpKnYsYSx2KS5tYXAobCkpLmNvbmNhdChnKFZhKG4vaCkqaCx0LGgpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gSGEodCVwKT5EYX0pLm1hcChmKSkuY29uY2F0KGcoVmEoby9kKSpkLGksZCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBIYSh0JXYpPkRhfSkubWFwKGMpKX1yZXR1cm4gXy5saW5lcz1mdW5jdGlvbigpe3JldHVybiBiKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fX0pfSxfLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3MocikuY29uY2F0KGwoYSkuc2xpY2UoMSkscyhlKS5yZXZlcnNlKCkuc2xpY2UoMSksbCh1KS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LF8uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6Xy5leHRlbnRNaW5vcigpfSxfLmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sdT0rdFswXVsxXSxhPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSx1PmEmJih0PXUsdT1hLGE9dCksXy5wcmVjaXNpb24oeSkpOltbcix1XSxbZSxhXV19LF8uZXh0ZW50TWlub3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF1bMF0sdD0rZVsxXVswXSxvPStlWzBdWzFdLGk9K2VbMV1bMV0sbj50JiYoZT1uLG49dCx0PWUpLG8+aSYmKGU9byxvPWksaT1lKSxfLnByZWNpc2lvbih5KSk6W1tuLG9dLFt0LGldXX0sXy5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTpfLnN0ZXBNaW5vcigpfSxfLnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSx2PSt0WzFdLF8pOltwLHZdfSxfLnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLF8pOltoLGRdfSxfLnByZWNpc2lvbj1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0raCxmPXljKG8saSw5MCksYz1fYyhuLHQseSkscz15Yyh1LGEsOTApLGw9X2MocixlLHkpLF8pOnl9LF8uZXh0ZW50TWFqb3IoW1stMTgwLC05MCtEYV0sWzE4MCw5MC1EYV1dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLURhXSxbMTgwLDgwK0RhXV0pfWZ1bmN0aW9uIG1jKHQpe3JldHVybiB0fXZhciB4Yyx3YyxNYyxBYyxUYz1QYSgpLE5jPVBhKCksU2M9e3BvaW50Oml1LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1NjLmxpbmVTdGFydD1FYyxTYy5saW5lRW5kPVBjfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7U2MubGluZVN0YXJ0PVNjLmxpbmVFbmQ9U2MucG9pbnQ9aXUsVGMuYWRkKEhhKE5jKSksTmMucmVzZXQoKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9VGMvMjtyZXR1cm4gVGMucmVzZXQoKSx0fX07ZnVuY3Rpb24gRWMoKXtTYy5wb2ludD1rY31mdW5jdGlvbiBrYyh0LG4pe1NjLnBvaW50PUNjLHhjPU1jPXQsd2M9QWM9bn1mdW5jdGlvbiBDYyh0LG4pe05jLmFkZChBYyp0LU1jKm4pLE1jPXQsQWM9bn1mdW5jdGlvbiBQYygpe0NjKHhjLHdjKX12YXIgemM9MS8wLFJjPXpjLExjPS16YyxEYz1MYyxVYz17cG9pbnQ6ZnVuY3Rpb24odCxuKXt0PHpjJiYoemM9dCk7dD5MYyYmKExjPXQpO248UmMmJihSYz1uKTtuPkRjJiYoRGM9bil9LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDppdSxwb2x5Z29uRW5kOml1LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbemMsUmNdLFtMYyxEY11dO3JldHVybiBMYz1EYz0tKFJjPXpjPTEvMCksdH19O3ZhciBxYyxPYyxZYyxCYyxGYz0wLEljPTAsSGM9MCxqYz0wLFhjPTAsR2M9MCxWYz0wLCRjPTAsV2M9MCxaYz17cG9pbnQ6UWMsbGluZVN0YXJ0OkpjLGxpbmVFbmQ6bnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WmMubGluZVN0YXJ0PWVzLFpjLmxpbmVFbmQ9cnN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtaYy5wb2ludD1RYyxaYy5saW5lU3RhcnQ9SmMsWmMubGluZUVuZD1uc30scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9V2M/W1ZjL1djLCRjL1djXTpHYz9bamMvR2MsWGMvR2NdOkhjP1tGYy9IYyxJYy9IY106W05hTixOYU5dO3JldHVybiBGYz1JYz1IYz1qYz1YYz1HYz1WYz0kYz1XYz0wLHR9fTtmdW5jdGlvbiBRYyh0LG4pe0ZjKz10LEljKz1uLCsrSGN9ZnVuY3Rpb24gSmMoKXtaYy5wb2ludD1LY31mdW5jdGlvbiBLYyh0LG4pe1pjLnBvaW50PXRzLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gdHModCxuKXt2YXIgZT10LVljLHI9bi1CYyxpPUthKGUqZStyKnIpO2pjKz1pKihZYyt0KS8yLFhjKz1pKihCYytuKS8yLEdjKz1pLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gbnMoKXtaYy5wb2ludD1RY31mdW5jdGlvbiBlcygpe1pjLnBvaW50PWlzfWZ1bmN0aW9uIHJzKCl7b3MocWMsT2MpfWZ1bmN0aW9uIGlzKHQsbil7WmMucG9pbnQ9b3MsUWMocWM9WWM9dCxPYz1CYz1uKX1mdW5jdGlvbiBvcyh0LG4pe3ZhciBlPXQtWWMscj1uLUJjLGk9S2EoZSplK3Iqcik7amMrPWkqKFljK3QpLzIsWGMrPWkqKEJjK24pLzIsR2MrPWksVmMrPShpPUJjKnQtWWMqbikqKFljK3QpLCRjKz1pKihCYytuKSxXYys9MyppLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gYXModCl7dGhpcy5fY29udGV4dD10fWFzLnByb3RvdHlwZT17X3JhZGl1czo0LjUscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhZGl1cz10LHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTticmVhaztkZWZhdWx0OnRoaXMuX2NvbnRleHQubW92ZVRvKHQrdGhpcy5fcmFkaXVzLG4pLHRoaXMuX2NvbnRleHQuYXJjKHQsbix0aGlzLl9yYWRpdXMsMCxCYSl9fSxyZXN1bHQ6aXV9O3ZhciB1cyxmcyxjcyxzcyxscyxocz1QYSgpLGRzPXtwb2ludDppdSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtkcy5wb2ludD1wc30sbGluZUVuZDpmdW5jdGlvbigpe3VzJiZ2cyhmcyxjcyksZHMucG9pbnQ9aXV9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3VzPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dXM9bnVsbH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9K2hzO3JldHVybiBocy5yZXNldCgpLHR9fTtmdW5jdGlvbiBwcyh0LG4pe2RzLnBvaW50PXZzLGZzPXNzPXQsY3M9bHM9bn1mdW5jdGlvbiB2cyh0LG4pe3NzLT10LGxzLT1uLGhzLmFkZChLYShzcypzcytscypscykpLHNzPXQsbHM9bn1mdW5jdGlvbiBncygpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiB5cyh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBfcyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bmV3IGJzO2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXTtyZXR1cm4gZS5zdHJlYW09bixlfX1mdW5jdGlvbiBicygpe31mdW5jdGlvbiBtcyh0LG4sZSl7dmFyIHI9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9ciYmdC5jbGlwRXh0ZW50KG51bGwpLHN1KGUsdC5zdHJlYW0oVWMpKSxuKFVjLnJlc3VsdCgpKSxudWxsIT1yJiZ0LmNsaXBFeHRlbnQociksdH1mdW5jdGlvbiB4cyh0LG4sZSl7cmV0dXJuIG1zKHQsZnVuY3Rpb24oZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89TWF0aC5taW4oci8oZVsxXVswXS1lWzBdWzBdKSxpLyhlWzFdWzFdLWVbMF1bMV0pKSxhPStuWzBdWzBdKyhyLW8qKGVbMV1bMF0rZVswXVswXSkpLzIsdT0rblswXVsxXSsoaS1vKihlWzFdWzFdK2VbMF1bMV0pKS8yO3Quc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSx1XSl9LGUpfWZ1bmN0aW9uIHdzKHQsbixlKXtyZXR1cm4geHModCxbWzAsMF0sbl0sZSl9ZnVuY3Rpb24gTXModCxuLGUpe3JldHVybiBtcyh0LGZ1bmN0aW9uKGUpe3ZhciByPStuLGk9ci8oZVsxXVswXS1lWzBdWzBdKSxvPShyLWkqKGVbMV1bMF0rZVswXVswXSkpLzIsYT0taSplWzBdWzFdO3Quc2NhbGUoMTUwKmkpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIEFzKHQsbixlKXtyZXR1cm4gbXModCxmdW5jdGlvbihlKXt2YXIgcj0rbixpPXIvKGVbMV1bMV0tZVswXVsxXSksbz0taSplWzBdWzBdLGE9KHItaSooZVsxXVsxXStlWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCppKS50cmFuc2xhdGUoW28sYV0pfSxlKX1ncy5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6eXMoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixuKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT15cyh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbix0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LGJzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YnMscG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIFRzPTE2LE5zPUdhKDMwKklhKTtmdW5jdGlvbiBTcyh0LG4pe3JldHVybituP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShyLGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGcpe3ZhciB5PWMtcixfPXMtaSxiPXkqeStfKl87aWYoYj40Km4mJnYtLSl7dmFyIG09YStoLHg9dStkLHc9ZitwLE09S2EobSptK3gqeCt3KncpLEE9ZXUody89TSksVD1IYShIYSh3KS0xKTxEYXx8SGEoby1sKTxEYT8obytsKS8yOlhhKHgsbSksTj10KFQsQSksUz1OWzBdLEU9TlsxXSxrPVMtcixDPUUtaSxQPV8qay15KkM7KFAqUC9iPm58fEhhKCh5KmsrXypDKS9iLS41KT4uM3x8YSpoK3UqZCtmKnA8TnMpJiYoZShyLGksbyxhLHUsZixTLEUsVCxtLz1NLHgvPU0sdyx2LGcpLGcucG9pbnQoUyxFKSxlKFMsRSxULG0seCx3LGMscyxsLGgsZCxwLHYsZykpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsaSxvLGEsdSxmLGMscyxsLGgsZCxwLHY9e3BvaW50OmcsbGluZVN0YXJ0OnksbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksdi5saW5lU3RhcnQ9bX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLHYubGluZVN0YXJ0PXl9fTtmdW5jdGlvbiBnKGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHkoKXtzPU5hTix2LnBvaW50PV8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKHIsaSl7dmFyIG89QXUoW3IsaV0pLGE9dChyLGkpO2UocyxsLGMsaCxkLHAscz1hWzBdLGw9YVsxXSxjPXIsaD1vWzBdLGQ9b1sxXSxwPW9bMl0sVHMsbiksbi5wb2ludChzLGwpfWZ1bmN0aW9uIGIoKXt2LnBvaW50PWcsbi5saW5lRW5kKCl9ZnVuY3Rpb24gbSgpe3koKSx2LnBvaW50PXgsdi5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LG4pe18ocj10LG4pLGk9cyxvPWwsYT1oLHU9ZCxmPXAsdi5wb2ludD1ffWZ1bmN0aW9uIHcoKXtlKHMsbCxjLGgsZCxwLGksbyxyLGEsdSxmLFRzLG4pLHYubGluZUVuZD1iLGIoKX1yZXR1cm4gdn19KHQsbik6ZnVuY3Rpb24odCl7cmV0dXJuIF9zKHtwb2ludDpmdW5jdGlvbihuLGUpe249dChuLGUpLHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9KHQpfXZhciBFcz1fcyh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KklhLG4qSWEpfX0pO2Z1bmN0aW9uIGtzKHQsbixlLHIpe3ZhciBpPUdhKHIpLG89UWEociksYT1pKnQsdT1vKnQsZj1pL3QsYz1vL3Qscz0obyplLWkqbikvdCxsPShvKm4raSplKS90O2Z1bmN0aW9uIGgodCxyKXtyZXR1cm5bYSp0LXUqcituLGUtdSp0LWEqcl19cmV0dXJuIGguaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW2YqdC1jKm4rcyxsLWMqdC1mKm5dfSxofWZ1bmN0aW9uIENzKHQpe3JldHVybiBQcyhmdW5jdGlvbigpe3JldHVybiB0fSkoKX1mdW5jdGlvbiBQcyh0KXt2YXIgbixlLHIsaSxvLGEsdSxmLGMscyxsPTE1MCxoPTQ4MCxkPTI1MCxwPTAsdj0wLGc9MCx5PTAsXz0wLGI9MCxtPW51bGwseD1HZix3PW51bGwsTT1tYyxBPS41O2Z1bmN0aW9uIFQodCl7cmV0dXJuIGYodFswXSpJYSx0WzFdKklhKX1mdW5jdGlvbiBOKHQpe3JldHVybih0PWYuaW52ZXJ0KHRbMF0sdFsxXSkpJiZbdFswXSpGYSx0WzFdKkZhXX1mdW5jdGlvbiBTKCl7dmFyIHQ9a3MobCwwLDAsYikuYXBwbHkobnVsbCxuKHAsdikpLHI9KGI/a3M6ZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHIocixpKXtyZXR1cm5bbit0KnIsZS10KmldfXJldHVybiByLmludmVydD1mdW5jdGlvbihyLGkpe3JldHVyblsoci1uKS90LChlLWkpL3RdfSxyfSkobCxoLXRbMF0sZC10WzFdLGIpO3JldHVybiBlPWtmKGcseSxfKSx1PVNmKG4sciksZj1TZihlLHUpLGE9U3ModSxBKSxFKCl9ZnVuY3Rpb24gRSgpe3JldHVybiBjPXM9bnVsbCxUfXJldHVybiBULnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gYyYmcz09PXQ/YzpjPUVzKGZ1bmN0aW9uKHQpe3JldHVybiBfcyh7cG9pbnQ6ZnVuY3Rpb24obixlKXt2YXIgcj10KG4sZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sclsxXSl9fSl9KGUpKHgoYShNKHM9dCkpKSkpfSxULnByZWNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9dCxtPXZvaWQgMCxFKCkpOnh9LFQucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09dCx3PXI9aT1vPW51bGwsRSgpKTpNfSxULmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD0rdD9WZihtPXQqSWEpOihtPW51bGwsR2YpLEUoKSk6bSpGYX0sVC5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPW51bGw9PXQ/KHc9cj1pPW89bnVsbCxtYyk6WmYodz0rdFswXVswXSxyPSt0WzBdWzFdLGk9K3RbMV1bMF0sbz0rdFsxXVsxXSksRSgpKTpudWxsPT13P251bGw6W1t3LHJdLFtpLG9dXX0sVC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0rdCxTKCkpOmx9LFQudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0WzBdLGQ9K3RbMV0sUygpKTpbaCxkXX0sVC5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9dFswXSUzNjAqSWEsdj10WzFdJTM2MCpJYSxTKCkpOltwKkZhLHYqRmFdfSxULnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz10WzBdJTM2MCpJYSx5PXRbMV0lMzYwKklhLF89dC5sZW5ndGg+Mj90WzJdJTM2MCpJYTowLFMoKSk6W2cqRmEseSpGYSxfKkZhXX0sVC5hbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10JTM2MCpJYSxTKCkpOmIqRmF9LFQucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPVNzKHUsQT10KnQpLEUoKSk6S2EoQSl9LFQuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKFQsdCxuKX0sVC5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKFQsdCxuKX0sVC5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhULHQsbil9LFQuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKFQsdCxuKX0sZnVuY3Rpb24oKXtyZXR1cm4gbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxULmludmVydD1uLmludmVydCYmTixTKCl9fWZ1bmN0aW9uIHpzKHQpe3ZhciBuPTAsZT1xYS8zLHI9UHModCksaT1yKG4sZSk7cmV0dXJuIGkucGFyYWxsZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Iobj10WzBdKklhLGU9dFsxXSpJYSk6W24qRmEsZSpGYV19LGl9ZnVuY3Rpb24gUnModCxuKXt2YXIgZT1RYSh0KSxyPShlK1FhKG4pKS8yO2lmKEhhKHIpPERhKXJldHVybiBmdW5jdGlvbih0KXt2YXIgbj1HYSh0KTtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuW3QqbixRYShlKS9uXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdC9uLGV1KGUqbildfSxlfSh0KTt2YXIgaT0xK2UqKDIqci1lKSxvPUthKGkpL3I7ZnVuY3Rpb24gYSh0LG4pe3ZhciBlPUthKGktMipyKlFhKG4pKS9yO3JldHVybltlKlFhKHQqPXIpLG8tZSpHYSh0KV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uO3JldHVybltYYSh0LEhhKGUpKS9yKkphKGUpLGV1KChpLSh0KnQrZSplKSpyKnIpLygyKnIpKV19LGF9ZnVuY3Rpb24gTHMoKXtyZXR1cm4genMoUnMpLnNjYWxlKDE1NS40MjQpLmNlbnRlcihbMCwzMy42NDQyXSl9ZnVuY3Rpb24gRHMoKXtyZXR1cm4gTHMoKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApLnRyYW5zbGF0ZShbNDgwLDI1MF0pLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKX1mdW5jdGlvbiBVcyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1HYShuKSxpPUdhKGUpLG89dChyKmkpO3JldHVybltvKmkqUWEobiksbypRYShlKV19fWZ1bmN0aW9uIHFzKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPUthKG4qbitlKmUpLGk9dChyKSxvPVFhKGkpLGE9R2EoaSk7cmV0dXJuW1hhKG4qbyxyKmEpLGV1KHImJmUqby9yKV19fXZhciBPcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4gS2EoMi8oMSt0KSl9KTtPcy5pbnZlcnQ9cXMoZnVuY3Rpb24odCl7cmV0dXJuIDIqZXUodC8yKX0pO3ZhciBZcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4odD1udSh0KSkmJnQvUWEodCl9KTtmdW5jdGlvbiBCcyh0LG4pe3JldHVyblt0LFdhKHR1KChPYStuKS8yKSldfWZ1bmN0aW9uIEZzKHQpe3ZhciBuLGUscixpPUNzKHQpLG89aS5jZW50ZXIsYT1pLnNjYWxlLHU9aS50cmFuc2xhdGUsZj1pLmNsaXBFeHRlbnQsYz1udWxsO2Z1bmN0aW9uIHMoKXt2YXIgbz1xYSphKCksdT1pKFJmKGkucm90YXRlKCkpLmludmVydChbMCwwXSkpO3JldHVybiBmKG51bGw9PWM/W1t1WzBdLW8sdVsxXS1vXSxbdVswXStvLHVbMV0rb11dOnQ9PT1Ccz9bW01hdGgubWF4KHVbMF0tbyxjKSxuXSxbTWF0aC5taW4odVswXStvLGUpLHJdXTpbW2MsTWF0aC5tYXgodVsxXS1vLG4pXSxbZSxNYXRoLm1pbih1WzFdK28scildXSl9cmV0dXJuIGkuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEodCkscygpKTphKCl9LGkudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1KHQpLHMoKSk6dSgpfSxpLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obyh0KSxzKCkpOm8oKX0saS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2M9bj1lPXI9bnVsbDooYz0rdFswXVswXSxuPSt0WzBdWzFdLGU9K3RbMV1bMF0scj0rdFsxXVsxXSkscygpKTpudWxsPT1jP251bGw6W1tjLG5dLFtlLHJdXX0scygpfWZ1bmN0aW9uIElzKHQpe3JldHVybiB0dSgoT2ErdCkvMil9ZnVuY3Rpb24gSHModCxuKXt2YXIgZT1HYSh0KSxyPXQ9PT1uP1FhKHQpOldhKGUvR2EobikpL1dhKElzKG4pL0lzKHQpKSxpPWUqWmEoSXModCkscikvcjtpZighcilyZXR1cm4gQnM7ZnVuY3Rpb24gbyh0LG4pe2k+MD9uPC1PYStEYSYmKG49LU9hK0RhKTpuPk9hLURhJiYobj1PYS1EYSk7dmFyIGU9aS9aYShJcyhuKSxyKTtyZXR1cm5bZSpRYShyKnQpLGktZSpHYShyKnQpXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW4sbz1KYShyKSpLYSh0KnQrZSplKTtyZXR1cm5bWGEodCxIYShlKSkvcipKYShlKSwyKmphKFphKGkvbywxL3IpKS1PYV19LG99ZnVuY3Rpb24ganModCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBYcyh0LG4pe3ZhciBlPUdhKHQpLHI9dD09PW4/UWEodCk6KGUtR2EobikpLyhuLXQpLGk9ZS9yK3Q7aWYoSGEocik8RGEpcmV0dXJuIGpzO2Z1bmN0aW9uIG8odCxuKXt2YXIgZT1pLW4sbz1yKnQ7cmV0dXJuW2UqUWEobyksaS1lKkdhKG8pXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW47cmV0dXJuW1hhKHQsSGEoZSkpL3IqSmEoZSksaS1KYShyKSpLYSh0KnQrZSplKV19LG99WXMuaW52ZXJ0PXFzKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksQnMuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QsMipqYSgkYShuKSktT2FdfSxqcy5pbnZlcnQ9anM7dmFyIEdzPTEuMzQwMjY0LFZzPS0uMDgxMTA2LCRzPTg5M2UtNixXcz0uMDAzNzk2LFpzPUthKDMpLzI7ZnVuY3Rpb24gUXModCxuKXt2YXIgZT1ldShacypRYShuKSkscj1lKmUsaT1yKnIqcjtyZXR1cm5bdCpHYShlKS8oWnMqKEdzKzMqVnMqcitpKig3KiRzKzkqV3MqcikpKSxlKihHcytWcypyK2kqKCRzK1dzKnIpKV19ZnVuY3Rpb24gSnModCxuKXt2YXIgZT1HYShuKSxyPUdhKHQpKmU7cmV0dXJuW2UqUWEodCkvcixRYShuKS9yXX1mdW5jdGlvbiBLcyh0LG4sZSxyKXtyZXR1cm4gMT09PXQmJjE9PT1uJiYwPT09ZSYmMD09PXI/bWM6X3Moe3BvaW50OmZ1bmN0aW9uKGksbyl7dGhpcy5zdHJlYW0ucG9pbnQoaSp0K2UsbypuK3IpfX0pfWZ1bmN0aW9uIHRsKHQsbil7dmFyIGU9bipuLHI9ZSplO3JldHVyblt0KiguODcwNy0uMTMxOTc5KmUrcioociooLjAwMzk3MSplLS4wMDE1MjkqciktLjAxMzc5MSkpLG4qKDEuMDA3MjI2K2UqKC4wMTUwODUrciooLjAyODg3NCplLS4wNDQ0NzUtLjAwNTkxNipyKSkpXX1mdW5jdGlvbiBubCh0LG4pe3JldHVybltHYShuKSpRYSh0KSxRYShuKV19ZnVuY3Rpb24gZWwodCxuKXt2YXIgZT1HYShuKSxyPTErR2EodCkqZTtyZXR1cm5bZSpRYSh0KS9yLFFhKG4pL3JdfWZ1bmN0aW9uIHJsKHQsbil7cmV0dXJuW1dhKHR1KChPYStuKS8yKSksLXRdfWZ1bmN0aW9uIGlsKHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIG9sKHQsbil7cmV0dXJuIHQrbi54fWZ1bmN0aW9uIGFsKHQsbil7cmV0dXJuIE1hdGgubWF4KHQsbi55KX1mdW5jdGlvbiB1bCh0KXt2YXIgbj0wLGU9dC5jaGlsZHJlbixyPWUmJmUubGVuZ3RoO2lmKHIpZm9yKDstLXI+PTA7KW4rPWVbcl0udmFsdWU7ZWxzZSBuPTE7dC52YWx1ZT1ufWZ1bmN0aW9uIGZsKHQsbil7dmFyIGUscixpLG8sYSx1PW5ldyBobCh0KSxmPSt0LnZhbHVlJiYodS52YWx1ZT10LnZhbHVlKSxjPVt1XTtmb3IobnVsbD09biYmKG49Y2wpO2U9Yy5wb3AoKTspaWYoZiYmKGUudmFsdWU9K2UuZGF0YS52YWx1ZSksKGk9bihlLmRhdGEpKSYmKGE9aS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheShhKSxvPWEtMTtvPj0wOy0tbyljLnB1c2gocj1lLmNoaWxkcmVuW29dPW5ldyBobChpW29dKSksci5wYXJlbnQ9ZSxyLmRlcHRoPWUuZGVwdGgrMTtyZXR1cm4gdS5lYWNoQmVmb3JlKGxsKX1mdW5jdGlvbiBjbCh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBzbCh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gbGwodCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiBobCh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1Rcy5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscj1uLGk9cipyLG89aSppKmksYT0wO2E8MTImJihvPShpPShyLT1lPShyKihHcytWcyppK28qKCRzK1dzKmkpKS1uKS8oR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkpKnIpKmkqaSwhKEhhKGUpPFVhKSk7KythKTtyZXR1cm5bWnMqdCooR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkvR2EociksZXUoUWEocikvWnMpXX0sSnMuaW52ZXJ0PXFzKGphKSx0bC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPW4saT0yNTtkb3t2YXIgbz1yKnIsYT1vKm87ci09ZT0ociooMS4wMDcyMjYrbyooLjAxNTA4NSthKiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KmEpKSktbikvKDEuMDA3MjI2K28qKC4wNDUyNTUrYSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSphKSkpfXdoaWxlKEhhKGUpPkRhJiYtLWk+MCk7cmV0dXJuW3QvKC44NzA3KyhvPXIqcikqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLHJdfSxubC5pbnZlcnQ9cXMoZXUpLGVsLmludmVydD1xcyhmdW5jdGlvbih0KXtyZXR1cm4gMipqYSh0KX0pLHJsLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblstbiwyKmphKCRhKHQpKS1PYV19LGhsLnByb3RvdHlwZT1mbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmhsLGNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKHVsKX0sZWFjaDpmdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsYT1bb107ZG97Zm9yKG49YS5yZXZlcnNlKCksYT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKWEucHVzaChlW3JdKX13aGlsZShhLmxlbmd0aCk7cmV0dXJuIHRoaXN9LGVhY2hBZnRlcjpmdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSxhPVtdO2k9by5wb3AoKTspaWYoYS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPWEucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LGVhY2hCZWZvcmU6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj10aGlzLGk9W3JdO3I9aS5wb3AoKTspaWYodChyKSxuPXIuY2hpbGRyZW4pZm9yKGU9bi5sZW5ndGgtMTtlPj0wOy0tZSlpLnB1c2gobltlXSk7cmV0dXJuIHRoaXN9LHN1bTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obil7Zm9yKHZhciBlPSt0KG4uZGF0YSl8fDAscj1uLmNoaWxkcmVuLGk9ciYmci5sZW5ndGg7LS1pPj0wOyllKz1yW2ldLnZhbHVlO24udmFsdWU9ZX0pfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LHBhdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMsZT1mdW5jdGlvbih0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9KG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3QucHVzaChuKX0pLHR9LGxlYXZlczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gZmwodGhpcykuZWFjaEJlZm9yZShzbCl9fTt2YXIgZGw9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIHBsKHQpe2Zvcih2YXIgbixlLHI9MCxpPSh0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dC5sZW5ndGg7cjspZT1NYXRoLnJhbmRvbSgpKnItLXwwLG49dFtyXSx0W3JdPXRbZV0sdFtlXT1uO3JldHVybiB0fShkbC5jYWxsKHQpKSkubGVuZ3RoLG89W107cjxpOyluPXRbcl0sZSYmeWwoZSxuKT8rK3I6KGU9Ymwobz12bChvLG4pKSxyPTApO3JldHVybiBlfWZ1bmN0aW9uIHZsKHQsbil7dmFyIGUscjtpZihfbChuLHQpKXJldHVybltuXTtmb3IoZT0wO2U8dC5sZW5ndGg7KytlKWlmKGdsKG4sdFtlXSkmJl9sKG1sKHRbZV0sbiksdCkpcmV0dXJuW3RbZV0sbl07Zm9yKGU9MDtlPHQubGVuZ3RoLTE7KytlKWZvcihyPWUrMTtyPHQubGVuZ3RoOysrcilpZihnbChtbCh0W2VdLHRbcl0pLG4pJiZnbChtbCh0W2VdLG4pLHRbcl0pJiZnbChtbCh0W3JdLG4pLHRbZV0pJiZfbCh4bCh0W2VdLHRbcl0sbiksdCkpcmV0dXJuW3RbZV0sdFtyXSxuXTt0aHJvdyBuZXcgRXJyb3J9ZnVuY3Rpb24gZ2wodCxuKXt2YXIgZT10LnItbi5yLHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU8MHx8ZSplPHIqcitpKml9ZnVuY3Rpb24geWwodCxuKXt2YXIgZT10LnItbi5yKzFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBfbCh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCF5bCh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGJsKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybnt4OihuPXRbMF0pLngseTpuLnkscjpuLnJ9O2Nhc2UgMjpyZXR1cm4gbWwodFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIHhsKHRbMF0sdFsxXSx0WzJdKX12YXIgbn1mdW5jdGlvbiBtbCh0LG4pe3ZhciBlPXQueCxyPXQueSxpPXQucixvPW4ueCxhPW4ueSx1PW4ucixmPW8tZSxjPWEtcixzPXUtaSxsPU1hdGguc3FydChmKmYrYypjKTtyZXR1cm57eDooZStvK2YvbCpzKS8yLHk6KHIrYStjL2wqcykvMixyOihsK2krdSkvMn19ZnVuY3Rpb24geGwodCxuLGUpe3ZhciByPXQueCxpPXQueSxvPXQucixhPW4ueCx1PW4ueSxmPW4ucixjPWUueCxzPWUueSxsPWUucixoPXItYSxkPXItYyxwPWktdSx2PWktcyxnPWYtbyx5PWwtbyxfPXIqcitpKmktbypvLGI9Xy1hKmEtdSp1K2YqZixtPV8tYypjLXMqcytsKmwseD1kKnAtaCp2LHc9KHAqbS12KmIpLygyKngpLXIsTT0odipnLXAqeSkveCxBPShkKmItaCptKS8oMip4KS1pLFQ9KGgqeS1kKmcpL3gsTj1NKk0rVCpULTEsUz0yKihvK3cqTStBKlQpLEU9dyp3K0EqQS1vKm8saz0tKE4/KFMrTWF0aC5zcXJ0KFMqUy00Kk4qRSkpLygyKk4pOkUvUyk7cmV0dXJue3g6cit3K00qayx5OmkrQStUKmsscjprfX1mdW5jdGlvbiB3bCh0LG4sZSl7dmFyIHIsaSxvLGEsdT10Lngtbi54LGY9dC55LW4ueSxjPXUqdStmKmY7Yz8oaT1uLnIrZS5yLGkqPWksYT10LnIrZS5yLGk+KGEqPWEpPyhyPShjK2EtaSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxhL2MtcipyKSksZS54PXQueC1yKnUtbypmLGUueT10LnktcipmK28qdSk6KHI9KGMraS1hKS8oMipjKSxvPU1hdGguc3FydChNYXRoLm1heCgwLGkvYy1yKnIpKSxlLng9bi54K3IqdS1vKmYsZS55PW4ueStyKmYrbyp1KSk6KGUueD1uLngrZS5yLGUueT1uLnkpfWZ1bmN0aW9uIE1sKHQsbil7dmFyIGU9dC5yK24uci0xZS02LHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU+MCYmZSplPnIqcitpKml9ZnVuY3Rpb24gQWwodCl7dmFyIG49dC5fLGU9dC5uZXh0Ll8scj1uLnIrZS5yLGk9KG4ueCplLnIrZS54Km4ucikvcixvPShuLnkqZS5yK2UueSpuLnIpL3I7cmV0dXJuIGkqaStvKm99ZnVuY3Rpb24gVGwodCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIE5sKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIG4sZSxyLGksbyxhLHUsZixjLHMsbDtpZigobj10WzBdKS54PTAsbi55PTAsIShpPjEpKXJldHVybiBuLnI7aWYoZT10WzFdLG4ueD0tZS5yLGUueD1uLnIsZS55PTAsIShpPjIpKXJldHVybiBuLnIrZS5yO3dsKGUsbixyPXRbMl0pLG49bmV3IFRsKG4pLGU9bmV3IFRsKGUpLHI9bmV3IFRsKHIpLG4ubmV4dD1yLnByZXZpb3VzPWUsZS5uZXh0PW4ucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1uO3Q6Zm9yKHU9Mzt1PGk7Kyt1KXt3bChuLl8sZS5fLHI9dFt1XSkscj1uZXcgVGwociksZj1lLm5leHQsYz1uLnByZXZpb3VzLHM9ZS5fLnIsbD1uLl8ucjtkb3tpZihzPD1sKXtpZihNbChmLl8sci5fKSl7ZT1mLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLXU7Y29udGludWUgdH1zKz1mLl8ucixmPWYubmV4dH1lbHNle2lmKE1sKGMuXyxyLl8pKXsobj1jKS5uZXh0PWUsZS5wcmV2aW91cz1uLC0tdTtjb250aW51ZSB0fWwrPWMuXy5yLGM9Yy5wcmV2aW91c319d2hpbGUoZiE9PWMubmV4dCk7Zm9yKHIucHJldmlvdXM9bixyLm5leHQ9ZSxuLm5leHQ9ZS5wcmV2aW91cz1lPXIsbz1BbChuKTsocj1yLm5leHQpIT09ZTspKGE9QWwocikpPG8mJihuPXIsbz1hKTtlPW4ubmV4dH1mb3Iobj1bZS5fXSxyPWU7KHI9ci5uZXh0KSE9PWU7KW4ucHVzaChyLl8pO2ZvcihyPXBsKG4pLHU9MDt1PGk7Kyt1KShuPXRbdV0pLngtPXIueCxuLnktPXIueTtyZXR1cm4gci5yfWZ1bmN0aW9uIFNsKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBFbCgpe3JldHVybiAwfWZ1bmN0aW9uIGtsKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBDbCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIFBsKHQpe3JldHVybiBmdW5jdGlvbihuKXtuLmNoaWxkcmVufHwobi5yPU1hdGgubWF4KDAsK3Qobil8fDApKX19ZnVuY3Rpb24gemwodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYocj1lLmNoaWxkcmVuKXt2YXIgcixpLG8sYT1yLmxlbmd0aCx1PXQoZSkqbnx8MDtpZih1KWZvcihpPTA7aTxhOysraSlyW2ldLnIrPXU7aWYobz1ObChyKSx1KWZvcihpPTA7aTxhOysraSlyW2ldLnItPXU7ZS5yPW8rdX19fWZ1bmN0aW9uIFJsKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uLnBhcmVudDtuLnIqPXQsZSYmKG4ueD1lLngrdCpuLngsbi55PWUueSt0Km4ueSl9fWZ1bmN0aW9uIExsKHQpe3QueDA9TWF0aC5yb3VuZCh0LngwKSx0LnkwPU1hdGgucm91bmQodC55MCksdC54MT1NYXRoLnJvdW5kKHQueDEpLHQueTE9TWF0aC5yb3VuZCh0LnkxKX1mdW5jdGlvbiBEbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKHItbikvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueTA9ZSxvLnkxPWksby54MD1uLG8ueDE9bis9by52YWx1ZSpjfXZhciBVbD0iJCIscWw9e2RlcHRoOi0xfSxPbD17fTtmdW5jdGlvbiBZbCh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBCbCh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBGbCh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBJbCh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bMF06dC50fWZ1bmN0aW9uIEhsKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/bltuLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gamwodCxuLGUpe3ZhciByPWUvKG4uaS10LmkpO24uYy09cixuLnMrPWUsdC5jKz1yLG4ueis9ZSxuLm0rPWV9ZnVuY3Rpb24gWGwodCxuLGUpe3JldHVybiB0LmEucGFyZW50PT09bi5wYXJlbnQ/dC5hOmV9ZnVuY3Rpb24gR2wodCxuKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9bn1mdW5jdGlvbiBWbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueDA9bixvLngxPXIsby55MD1lLG8ueTE9ZSs9by52YWx1ZSpjfUdsLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGhsLnByb3RvdHlwZSk7dmFyICRsPSgxK01hdGguc3FydCg1KSkvMjtmdW5jdGlvbiBXbCh0LG4sZSxyLGksbyl7Zm9yKHZhciBhLHUsZixjLHMsbCxoLGQscCx2LGcseT1bXSxfPW4uY2hpbGRyZW4sYj0wLG09MCx4PV8ubGVuZ3RoLHc9bi52YWx1ZTtiPHg7KXtmPWktZSxjPW8tcjtkb3tzPV9bbSsrXS52YWx1ZX13aGlsZSghcyYmbTx4KTtmb3IobD1oPXMsZz1zKnMqKHY9TWF0aC5tYXgoYy9mLGYvYykvKHcqdCkpLHA9TWF0aC5tYXgoaC9nLGcvbCk7bTx4OysrbSl7aWYocys9dT1fW21dLnZhbHVlLHU8bCYmKGw9dSksdT5oJiYoaD11KSxnPXMqcyp2LChkPU1hdGgubWF4KGgvZyxnL2wpKT5wKXtzLT11O2JyZWFrfXA9ZH15LnB1c2goYT17dmFsdWU6cyxkaWNlOmY8YyxjaGlsZHJlbjpfLnNsaWNlKGIsbSl9KSxhLmRpY2U/RGwoYSxlLHIsaSx3P3IrPWMqcy93Om8pOlZsKGEsZSxyLHc/ZSs9ZipzL3c6aSxvKSx3LT1zLGI9bX1yZXR1cm4geX12YXIgWmw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7V2wobix0LGUscixpLG8pfXJldHVybiBlLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiB0KChuPStuKT4xP246MSl9LGV9KCRsKTt2YXIgUWw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7aWYoKGE9dC5fc3F1YXJpZnkpJiZhLnJhdGlvPT09bilmb3IodmFyIGEsdSxmLGMscyxsPS0xLGg9YS5sZW5ndGgsZD10LnZhbHVlOysrbDxoOyl7Zm9yKGY9KHU9YVtsXSkuY2hpbGRyZW4sYz11LnZhbHVlPTAscz1mLmxlbmd0aDtjPHM7KytjKXUudmFsdWUrPWZbY10udmFsdWU7dS5kaWNlP0RsKHUsZSxyLGkscis9KG8tcikqdS52YWx1ZS9kKTpWbCh1LGUscixlKz0oaS1lKSp1LnZhbHVlL2QsbyksZC09dS52YWx1ZX1lbHNlIHQuX3NxdWFyaWZ5PWE9V2wobix0LGUscixpLG8pLGEucmF0aW89bn1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfSgkbCk7ZnVuY3Rpb24gSmwodCxuKXtyZXR1cm4gdFswXS1uWzBdfHx0WzFdLW5bMV19ZnVuY3Rpb24gS2wodCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89WzAsMV0sYT0yLHU9Mjt1PGk7Kyt1KXtmb3IoO2E+MSYmKG49dFtvW2EtMl1dLGU9dFtvW2EtMV1dLHI9dFt1XSwoZVswXS1uWzBdKSooclsxXS1uWzFdKS0oZVsxXS1uWzFdKSooclswXS1uWzBdKTw9MCk7KS0tYTtvW2ErK109dX1yZXR1cm4gby5zbGljZSgwLGEpfWZ1bmN0aW9uIHRoKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9dmFyIG5oPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiB0PW51bGw9PXQ/MDordCxlPW51bGw9PWU/MTorZSwxPT09YXJndW1lbnRzLmxlbmd0aD8oZT10LHQ9MCk6ZS09dCxmdW5jdGlvbigpe3JldHVybiBuKCkqZSt0fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksZWg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7dmFyIHIsaTtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1yKW89cixyPW51bGw7ZWxzZSBkb3tyPTIqbigpLTEsbz0yKm4oKS0xLGk9cipyK28qb313aGlsZSghaXx8aT4xKTtyZXR1cm4gdCtlKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKGkpL2kpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCkscmg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKCl7dmFyIHQ9ZWguc291cmNlKG4pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGloPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPTA7cjx0OysrcillKz1uKCk7cmV0dXJuIGV9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxvaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7dmFyIGU9aWguc291cmNlKG4pKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKCkvdH19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGFoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1uKCkpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSx1aD1BcnJheS5wcm90b3R5cGUsZmg9dWgubWFwLGNoPXVoLnNsaWNlLHNoPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIGxoKHQpe3ZhciBuPUtpKCksZT1bXSxyPXNoO2Z1bmN0aW9uIGkoaSl7dmFyIG89aSsiIixhPW4uZ2V0KG8pO2lmKCFhKXtpZihyIT09c2gpcmV0dXJuIHI7bi5zZXQobyxhPWUucHVzaChpKSl9cmV0dXJuIHRbKGEtMSkldC5sZW5ndGhdfXJldHVybiB0PW51bGw9PXQ/W106Y2guY2FsbCh0KSxpLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W10sbj1LaSgpO2Zvcih2YXIgcixvLGE9LTEsdT10Lmxlbmd0aDsrK2E8dTspbi5oYXMobz0ocj10W2FdKSsiIil8fG4uc2V0KG8sZS5wdXNoKHIpKTtyZXR1cm4gaX0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1jaC5jYWxsKG4pLGkpOnQuc2xpY2UoKX0saS51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSk6cn0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGxoKCkuZG9tYWluKGUpLnJhbmdlKHQpLnVua25vd24ocil9LGl9ZnVuY3Rpb24gaGgoKXt2YXIgdCxuLGU9bGgoKS51bmtub3duKHZvaWQgMCkscj1lLmRvbWFpbixpPWUucmFuZ2Usbz1bMCwxXSxhPSExLHU9MCxmPTAsYz0uNTtmdW5jdGlvbiBzKCl7dmFyIGU9cigpLmxlbmd0aCxzPW9bMV08b1swXSxsPW9bcy0wXSxoPW9bMS1zXTt0PShoLWwpL01hdGgubWF4KDEsZS11KzIqZiksYSYmKHQ9TWF0aC5mbG9vcih0KSksbCs9KGgtbC10KihlLXUpKSpjLG49dCooMS11KSxhJiYobD1NYXRoLnJvdW5kKGwpLG49TWF0aC5yb3VuZChuKSk7dmFyIGQ9ZyhlKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGwrdCpufSk7cmV0dXJuIGkocz9kLnJldmVyc2UoKTpkKX1yZXR1cm4gZGVsZXRlIGUudW5rbm93bixlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSxzKCkpOnIoKX0sZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1bK3RbMF0sK3RbMV1dLHMoKSk6by5zbGljZSgpfSxlLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG89Wyt0WzBdLCt0WzFdXSxhPSEwLHMoKX0sZS5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gbn0sZS5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGUucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ISF0LHMoKSk6YX0sZS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOnV9LGUucGFkZGluZ0lubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkscygpKTp1fSxlLnBhZGRpbmdPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Zn0sZS5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Y30sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhoKCkuZG9tYWluKHIoKSkucmFuZ2Uobykucm91bmQoYSkucGFkZGluZ0lubmVyKHUpLnBhZGRpbmdPdXRlcihmKS5hbGlnbihjKX0scygpfWZ1bmN0aW9uIGRoKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBwaCh0KXtyZXR1cm4rdH12YXIgdmg9WzAsMV07ZnVuY3Rpb24gZ2godCxuKXtyZXR1cm4obi09dD0rdCk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtdCkvbn06ZGgobil9ZnVuY3Rpb24geWgodCxuLGUscil7dmFyIGk9dFswXSxvPXRbMV0sYT1uWzBdLHU9blsxXTtyZXR1cm4gbzxpPyhpPWUobyxpKSxhPXIodSxhKSk6KGk9ZShpLG8pLGE9cihhLHUpKSxmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19ZnVuY3Rpb24gX2godCxuLGUscil7dmFyIG89TWF0aC5taW4odC5sZW5ndGgsbi5sZW5ndGgpLTEsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksZj0tMTtmb3IodFtvXTx0WzBdJiYodD10LnNsaWNlKCkucmV2ZXJzZSgpLG49bi5zbGljZSgpLnJldmVyc2UoKSk7KytmPG87KWFbZl09ZSh0W2ZdLHRbZisxXSksdVtmXT1yKG5bZl0sbltmKzFdKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9aSh0LG4sMSxvKS0xO3JldHVybiB1W2VdKGFbZV0obikpfX1mdW5jdGlvbiBiaCh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKX1mdW5jdGlvbiBtaCh0LG4pe3ZhciBlLHIsaSxvPXZoLGE9dmgsdT1tZSxmPSExO2Z1bmN0aW9uIGMoKXtyZXR1cm4gZT1NYXRoLm1pbihvLmxlbmd0aCxhLmxlbmd0aCk+Mj9faDp5aCxyPWk9bnVsbCxzfWZ1bmN0aW9uIHMobil7cmV0dXJuKHJ8fChyPWUobyxhLGY/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuPStuLGU9K2UpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDw9bj8wOnQ+PWU/MTpyKHQpfX19KHQpOnQsdSkpKSgrbil9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybihpfHwoaT1lKGEsbyxnaCxmP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/bjp0Pj0xP2U6cih0KX19fShuKTpuKSkpKCt0KX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZmguY2FsbCh0LHBoKSxjKCkpOm8uc2xpY2UoKX0scy5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1jaC5jYWxsKHQpLGMoKSk6YS5zbGljZSgpfSxzLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGE9Y2guY2FsbCh0KSx1PXhlLGMoKX0scy5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXQsYygpKTpmfSxzLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsYygpKTp1fSxjKCl9ZnVuY3Rpb24geGgobil7dmFyIGU9bi5kb21haW47cmV0dXJuIG4udGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiBtKG5bMF0sbltuLmxlbmd0aC0xXSxudWxsPT10PzEwOnQpfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gZnVuY3Rpb24obixlLHIpe3ZhciBpLG89blswXSxhPW5bbi5sZW5ndGgtMV0sdT13KG8sYSxudWxsPT1lPzEwOmUpO3N3aXRjaCgocj1iYShudWxsPT1yPyIsZiI6cikpLnR5cGUpe2Nhc2UicyI6dmFyIGY9TWF0aC5tYXgoTWF0aC5hYnMobyksTWF0aC5hYnMoYSkpO3JldHVybiBudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1rYSh1LGYpKXx8KHIucHJlY2lzaW9uPWkpLHQuZm9ybWF0UHJlZml4KHIsZik7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9Q2EodSxNYXRoLm1heChNYXRoLmFicyhvKSxNYXRoLmFicyhhKSkpKXx8KHIucHJlY2lzaW9uPWktKCJlIj09PXIudHlwZSkpO2JyZWFrO2Nhc2UiZiI6Y2FzZSIlIjpudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1FYSh1KSl8fChyLnByZWNpc2lvbj1pLTIqKCIlIj09PXIudHlwZSkpfXJldHVybiB0LmZvcm1hdChyKX0oZSgpLG4scil9LG4ubmljZT1mdW5jdGlvbih0KXtudWxsPT10JiYodD0xMCk7dmFyIHIsaT1lKCksbz0wLGE9aS5sZW5ndGgtMSx1PWlbb10sZj1pW2FdO3JldHVybiBmPHUmJihyPXUsdT1mLGY9cixyPW8sbz1hLGE9ciksKHI9eCh1LGYsdCkpPjA/cj14KHU9TWF0aC5mbG9vcih1L3IpKnIsZj1NYXRoLmNlaWwoZi9yKSpyLHQpOnI8MCYmKHI9eCh1PU1hdGguY2VpbCh1KnIpL3IsZj1NYXRoLmZsb29yKGYqcikvcix0KSkscj4wPyhpW29dPU1hdGguZmxvb3IodS9yKSpyLGlbYV09TWF0aC5jZWlsKGYvcikqcixlKGkpKTpyPDAmJihpW29dPU1hdGguY2VpbCh1KnIpL3IsaVthXT1NYXRoLmZsb29yKGYqcikvcixlKGkpKSxufSxufWZ1bmN0aW9uIHdoKHQsbil7dmFyIGUscj0wLGk9KHQ9dC5zbGljZSgpKS5sZW5ndGgtMSxvPXRbcl0sYT10W2ldO3JldHVybiBhPG8mJihlPXIscj1pLGk9ZSxlPW8sbz1hLGE9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKGEpLHR9ZnVuY3Rpb24gTWgodCxuKXtyZXR1cm4obj1NYXRoLmxvZyhuL3QpKT9mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5sb2coZS90KS9ufTpkaChuKX1mdW5jdGlvbiBBaCh0LG4pe3JldHVybiB0PDA/ZnVuY3Rpb24oZSl7cmV0dXJuLU1hdGgucG93KC1uLGUpKk1hdGgucG93KC10LDEtZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnBvdyhuLGUpKk1hdGgucG93KHQsMS1lKX19ZnVuY3Rpb24gVGgodCl7cmV0dXJuIGlzRmluaXRlKHQpPysoIjFlIit0KTp0PDA/MDp0fWZ1bmN0aW9uIE5oKHQpe3JldHVybiAxMD09PXQ/VGg6dD09PU1hdGguRT9NYXRoLmV4cDpmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gU2godCl7cmV0dXJuIHQ9PT1NYXRoLkU/TWF0aC5sb2c6MTA9PT10JiZNYXRoLmxvZzEwfHwyPT09dCYmTWF0aC5sb2cyfHwodD1NYXRoLmxvZyh0KSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5sb2cobikvdH0pfWZ1bmN0aW9uIEVoKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4tdCgtbil9fWZ1bmN0aW9uIGtoKHQsbil7cmV0dXJuIHQ8MD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX1mdW5jdGlvbiBDaCgpe3ZhciB0PTEsbj1taChmdW5jdGlvbihuLGUpe3JldHVybihlPWtoKGUsdCktKG49a2gobix0KSkpP2Z1bmN0aW9uKHIpe3JldHVybihraChyLHQpLW4pL2V9OmRoKGUpfSxmdW5jdGlvbihuLGUpe3JldHVybiBlPWtoKGUsdCktKG49a2gobix0KSksZnVuY3Rpb24ocil7cmV0dXJuIGtoKG4rZSpyLDEvdCl9fSksZT1uLmRvbWFpbjtyZXR1cm4gbi5leHBvbmVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixlKGUoKSkpOnR9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBiaChuLENoKCkuZXhwb25lbnQodCkpfSx4aChuKX12YXIgUGg9bmV3IERhdGUsemg9bmV3IERhdGU7ZnVuY3Rpb24gUmgodCxuLGUscil7ZnVuY3Rpb24gaShuKXtyZXR1cm4gdChuPW5ldyBEYXRlKCtuKSksbn1yZXR1cm4gaS5mbG9vcj1pLGkuY2VpbD1mdW5jdGlvbihlKXtyZXR1cm4gdChlPW5ldyBEYXRlKGUtMSkpLG4oZSwxKSx0KGUpLGV9LGkucm91bmQ9ZnVuY3Rpb24odCl7dmFyIG49aSh0KSxlPWkuY2VpbCh0KTtyZXR1cm4gdC1uPGUtdD9uOmV9LGkub2Zmc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odD1uZXcgRGF0ZSgrdCksbnVsbD09ZT8xOk1hdGguZmxvb3IoZSkpLHR9LGkucmFuZ2U9ZnVuY3Rpb24oZSxyLG8pe3ZhciBhLHU9W107aWYoZT1pLmNlaWwoZSksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKGU8ciYmbz4wKSlyZXR1cm4gdTtkb3t1LnB1c2goYT1uZXcgRGF0ZSgrZSkpLG4oZSxvKSx0KGUpfXdoaWxlKGE8ZSYmZTxyKTtyZXR1cm4gdX0saS5maWx0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIFJoKGZ1bmN0aW9uKG4pe2lmKG4+PW4pZm9yKDt0KG4pLCFlKG4pOyluLnNldFRpbWUobi0xKX0sZnVuY3Rpb24odCxyKXtpZih0Pj10KWlmKHI8MClmb3IoOysrcjw9MDspZm9yKDtuKHQsLTEpLCFlKHQpOyk7ZWxzZSBmb3IoOy0tcj49MDspZm9yKDtuKHQsMSksIWUodCk7KTt9KX0sZSYmKGkuY291bnQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gUGguc2V0VGltZSgrbiksemguc2V0VGltZSgrciksdChQaCksdCh6aCksTWF0aC5mbG9vcihlKFBoLHpoKSl9LGkuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9pLmZpbHRlcihyP2Z1bmN0aW9uKG4pe3JldHVybiByKG4pJXQ9PTB9OmZ1bmN0aW9uKG4pe3JldHVybiBpLmNvdW50KDAsbikldD09MH0pOmk6bnVsbH0pLGl9dmFyIExoPVJoKGZ1bmN0aW9uKCl7fSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi10fSk7TGguZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9SaChmdW5jdGlvbihuKXtuLnNldFRpbWUoTWF0aC5mbG9vcihuL3QpKnQpfSxmdW5jdGlvbihuLGUpe24uc2V0VGltZSgrbitlKnQpfSxmdW5jdGlvbihuLGUpe3JldHVybihlLW4pL3R9KTpMaDpudWxsfTt2YXIgRGg9TGgucmFuZ2UsVWg9NmU0LHFoPTYwNDhlNSxPaD1SaChmdW5jdGlvbih0KXt0LnNldFRpbWUoMWUzKk1hdGguZmxvb3IodC8xZTMpKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrMWUzKm4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzFlM30sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDU2Vjb25kcygpfSksWWg9T2gucmFuZ2UsQmg9UmgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKE1hdGguZmxvb3IodC9VaCkqVWgpfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKlVoKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9VaH0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSksRmg9QmgucmFuZ2UsSWg9UmgoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpKlVoJTM2ZTU7bjwwJiYobis9MzZlNSksdC5zZXRUaW1lKDM2ZTUqTWF0aC5mbG9vcigoK3QtbikvMzZlNSkrbil9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pLEhoPUloLnJhbmdlLGpoPVJoKGZ1bmN0aW9uKHQpe3Quc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQtKG4uZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKlVoKS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSxYaD1qaC5yYW5nZTtmdW5jdGlvbiBHaCh0KXtyZXR1cm4gUmgoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpVaCkvcWh9KX12YXIgVmg9R2goMCksJGg9R2goMSksV2g9R2goMiksWmg9R2goMyksUWg9R2goNCksSmg9R2goNSksS2g9R2goNiksdGQ9VmgucmFuZ2UsbmQ9JGgucmFuZ2UsZWQ9V2gucmFuZ2UscmQ9WmgucmFuZ2UsaWQ9UWgucmFuZ2Usb2Q9SmgucmFuZ2UsYWQ9S2gucmFuZ2UsdWQ9UmgoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksZmQ9dWQucmFuZ2UsY2Q9UmgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KTtjZC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1JoKGZ1bmN0aW9uKG4pe24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBzZD1jZC5yYW5nZSxsZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipVaCl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVWh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pLGhkPWxkLnJhbmdlLGRkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTWludXRlcygwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pLHBkPWRkLnJhbmdlLHZkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzg2NGU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pLGdkPXZkLnJhbmdlO2Z1bmN0aW9uIHlkKHQpe3JldHVybiBSaChmdW5jdGlvbihuKXtuLnNldFVUQ0RhdGUobi5nZXRVVENEYXRlKCktKG4uZ2V0VVRDRGF5KCkrNy10KSU3KSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKSs3Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL3FofSl9dmFyIF9kPXlkKDApLGJkPXlkKDEpLG1kPXlkKDIpLHhkPXlkKDMpLHdkPXlkKDQpLE1kPXlkKDUpLEFkPXlkKDYpLFRkPV9kLnJhbmdlLE5kPWJkLnJhbmdlLFNkPW1kLnJhbmdlLEVkPXhkLnJhbmdlLGtkPXdkLnJhbmdlLENkPU1kLnJhbmdlLFBkPUFkLnJhbmdlLHpkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLFJkPXpkLnJhbmdlLExkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSk7TGQuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9SaChmdW5jdGlvbihuKXtuLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRVVENGdWxsWWVhcigpL3QpKnQpLG4uc2V0VVRDTW9udGgoMCwxKSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgRGQ9TGQucmFuZ2U7ZnVuY3Rpb24gVWQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIG4uc2V0RnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIHFkKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gbi5zZXRVVENGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIE9kKHQpe3JldHVybnt5OnQsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjB9fWZ1bmN0aW9uIFlkKHQpe3ZhciBuPXQuZGF0ZVRpbWUsZT10LmRhdGUscj10LnRpbWUsaT10LnBlcmlvZHMsbz10LmRheXMsYT10LnNob3J0RGF5cyx1PXQubW9udGhzLGY9dC5zaG9ydE1vbnRocyxjPVZkKGkpLHM9JGQoaSksbD1WZChvKSxoPSRkKG8pLGQ9VmQoYSkscD0kZChhKSx2PVZkKHUpLGc9JGQodSkseT1WZChmKSxfPSRkKGYpLGI9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gdVt0LmdldE1vbnRoKCldfSxjOm51bGwsZDpwcCxlOnBwLGY6YnAsSDp2cCxJOmdwLGo6eXAsTDpfcCxtOm1wLE06eHAscDpmdW5jdGlvbih0KXtyZXR1cm4gaVsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpXcCxzOlpwLFM6d3AsdTpNcCxVOkFwLFY6VHAsdzpOcCxXOlNwLHg6bnVsbCxYOm51bGwseTpFcCxZOmtwLFo6Q3AsIiUiOiRwfSxtPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBmW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6UHAsZTpQcCxmOlVwLEg6enAsSTpScCxqOkxwLEw6RHAsbTpxcCxNOk9wLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGlbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LFE6V3AsczpacCxTOllwLHU6QnAsVTpGcCxWOklwLHc6SHAsVzpqcCx4Om51bGwsWDpudWxsLHk6WHAsWTpHcCxaOlZwLCIlIjokcH0seD17YTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9ZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9cFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1sLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1oW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXkuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPV9bclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9di5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09Z1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQSh0LG4sZSxyKX0sZDppcCxlOmlwLGY6c3AsSDphcCxJOmFwLGo6b3AsTDpjcCxtOnJwLE06dXAscDpmdW5jdGlvbih0LG4sZSl7dmFyIHI9Yy5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9c1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxROmhwLHM6ZHAsUzpmcCx1OlpkLFU6UWQsVjpKZCx3OldkLFc6S2QseDpmdW5jdGlvbih0LG4scil7cmV0dXJuIEEodCxlLG4scil9LFg6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBBKHQscixuLGUpfSx5Om5wLFk6dHAsWjplcCwiJSI6bHB9O2Z1bmN0aW9uIHcodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvLGE9W10sdT0tMSxmPTAsYz10Lmxlbmd0aDtmb3IoZSBpbnN0YW5jZW9mIERhdGV8fChlPW5ldyBEYXRlKCtlKSk7Kyt1PGM7KTM3PT09dC5jaGFyQ29kZUF0KHUpJiYoYS5wdXNoKHQuc2xpY2UoZix1KSksbnVsbCE9KGk9RmRbcj10LmNoYXJBdCgrK3UpXSk/cj10LmNoYXJBdCgrK3UpOmk9ImUiPT09cj8iICI6IjAiLChvPW5bcl0pJiYocj1vKGUsaSkpLGEucHVzaChyKSxmPXUrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGYsdSkpLGEuam9pbigiIil9fWZ1bmN0aW9uIE0odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvPU9kKDE5MDApO2lmKEEobyx0LGUrPSIiLDApIT1lLmxlbmd0aClyZXR1cm4gbnVsbDtpZigiUSJpbiBvKXJldHVybiBuZXcgRGF0ZShvLlEpO2lmKCJwImluIG8mJihvLkg9by5IJTEyKzEyKm8ucCksIlYiaW4gbyl7aWYoby5WPDF8fG8uVj41MylyZXR1cm4gbnVsbDsidyJpbiBvfHwoby53PTEpLCJaImluIG8/KGk9KHI9cWQoT2Qoby55KSkpLmdldFVUQ0RheSgpLHI9aT40fHwwPT09aT9iZC5jZWlsKHIpOmJkKHIpLHI9dmQub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRVVENGdWxsWWVhcigpLG8ubT1yLmdldFVUQ01vbnRoKCksby5kPXIuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KGk9KHI9bihPZChvLnkpKSkuZ2V0RGF5KCkscj1pPjR8fDA9PT1pPyRoLmNlaWwocik6JGgocikscj1qaC5vZmZzZXQociw3KihvLlYtMSkpLG8ueT1yLmdldEZ1bGxZZWFyKCksby5tPXIuZ2V0TW9udGgoKSxvLmQ9ci5nZXREYXRlKCkrKG8udys2KSU3KX1lbHNlKCJXImluIG98fCJVImluIG8pJiYoInciaW4gb3x8KG8udz0idSJpbiBvP28udSU3OiJXImluIG8/MTowKSxpPSJaImluIG8/cWQoT2Qoby55KSkuZ2V0VVRDRGF5KCk6bihPZChvLnkpKS5nZXREYXkoKSxvLm09MCxvLmQ9IlciaW4gbz8oby53KzYpJTcrNypvLlctKGkrNSklNzpvLncrNypvLlUtKGkrNiklNyk7cmV0dXJuIloiaW4gbz8oby5IKz1vLlovMTAwfDAsby5NKz1vLlolMTAwLHFkKG8pKTpuKG8pfX1mdW5jdGlvbiBBKHQsbixlLHIpe2Zvcih2YXIgaSxvLGE9MCx1PW4ubGVuZ3RoLGY9ZS5sZW5ndGg7YTx1Oyl7aWYocj49ZilyZXR1cm4tMTtpZigzNz09PShpPW4uY2hhckNvZGVBdChhKyspKSl7aWYoaT1uLmNoYXJBdChhKyspLCEobz14W2kgaW4gRmQ/bi5jaGFyQXQoYSsrKTppXSl8fChyPW8odCxlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9cmV0dXJuIGIueD13KGUsYiksYi5YPXcocixiKSxiLmM9dyhuLGIpLG0ueD13KGUsbSksbS5YPXcocixtKSxtLmM9dyhuLG0pLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixiKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQrPSIiLFVkKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixtKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQscWQpO3JldHVybiBuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG59fX12YXIgQmQsRmQ9eyItIjoiIixfOiIgIiwwOiIwIn0sSWQ9L15ccypcZCsvLEhkPS9eJS8samQ9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIFhkKHQsbixlKXt2YXIgcj10PDA/Ii0iOiIiLGk9KHI/LXQ6dCkrIiIsbz1pLmxlbmd0aDtyZXR1cm4gcisobzxlP25ldyBBcnJheShlLW8rMSkuam9pbihuKStpOmkpfWZ1bmN0aW9uIEdkKHQpe3JldHVybiB0LnJlcGxhY2UoamQsIlxcJCYiKX1mdW5jdGlvbiBWZCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoR2QpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiAkZCh0KXtmb3IodmFyIG49e30sZT0tMSxyPXQubGVuZ3RoOysrZTxyOyluW3RbZV0udG9Mb3dlckNhc2UoKV09ZTtyZXR1cm4gbn1mdW5jdGlvbiBXZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBaZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBLZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0cCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KHQueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBucCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQueT0rclswXSsoK3JbMF0+Njg/MTkwMDoyZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVwKHQsbixlKXt2YXIgcj0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuWj1yWzFdPzA6LShyWzJdKyhyWzNdfHwiMDAiKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcnAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGlwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9wKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5tPTAsdC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGZwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5MPU1hdGguZmxvb3IoclswXS8xZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxwKHQsbixlKXt2YXIgcj1IZC5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGhwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlE9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZHAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuUT0xZTMqK3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcHAodCxuKXtyZXR1cm4gWGQodC5nZXREYXRlKCksbiwyKX1mdW5jdGlvbiB2cCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCksbiwyKX1mdW5jdGlvbiBncCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24geXAodCxuKXtyZXR1cm4gWGQoMStqaC5jb3VudChjZCh0KSx0KSxuLDMpfWZ1bmN0aW9uIF9wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBicCh0LG4pe3JldHVybiBfcCh0LG4pKyIwMDAifWZ1bmN0aW9uIG1wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TW9udGgoKSsxLG4sMil9ZnVuY3Rpb24geHAodCxuKXtyZXR1cm4gWGQodC5nZXRNaW51dGVzKCksbiwyKX1mdW5jdGlvbiB3cCh0LG4pe3JldHVybiBYZCh0LmdldFNlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIE1wKHQpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBBcCh0LG4pe3JldHVybiBYZChWaC5jb3VudChjZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFRwKHQsbil7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gdD1lPj00fHwwPT09ZT9RaCh0KTpRaC5jZWlsKHQpLFhkKFFoLmNvdW50KGNkKHQpLHQpKyg0PT09Y2QodCkuZ2V0RGF5KCkpLG4sMil9ZnVuY3Rpb24gTnAodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gU3AodCxuKXtyZXR1cm4gWGQoJGguY291bnQoY2QodCksdCksbiwyKX1mdW5jdGlvbiBFcCh0LG4pe3JldHVybiBYZCh0LmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24ga3AodCxuKXtyZXR1cm4gWGQodC5nZXRGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIENwKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4obj4wPyItIjoobio9LTEsIisiKSkrWGQobi82MHwwLCIwIiwyKStYZChuJTYwLCIwIiwyKX1mdW5jdGlvbiBQcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0RhdGUoKSxuLDIpfWZ1bmN0aW9uIHpwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSxuLDIpfWZ1bmN0aW9uIFJwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBMcCh0LG4pe3JldHVybiBYZCgxK3ZkLmNvdW50KExkKHQpLHQpLG4sMyl9ZnVuY3Rpb24gRHAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIFVwKHQsbil7cmV0dXJuIERwKHQsbikrIjAwMCJ9ZnVuY3Rpb24gcXAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBPcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ01pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIFlwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDU2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gQnAodCl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gMD09PW4/NzpufWZ1bmN0aW9uIEZwKHQsbil7cmV0dXJuIFhkKF9kLmNvdW50KExkKHQpLHQpLG4sMil9ZnVuY3Rpb24gSXAodCxuKXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiB0PWU+PTR8fDA9PT1lP3dkKHQpOndkLmNlaWwodCksWGQod2QuY291bnQoTGQodCksdCkrKDQ9PT1MZCh0KS5nZXRVVENEYXkoKSksbiwyKX1mdW5jdGlvbiBIcCh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiBqcCh0LG4pe3JldHVybiBYZChiZC5jb3VudChMZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFhwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBHcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gVnAoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uICRwKCl7cmV0dXJuIiUifWZ1bmN0aW9uIFdwKHQpe3JldHVybit0fWZ1bmN0aW9uIFpwKHQpe3JldHVybiBNYXRoLmZsb29yKCt0LzFlMyl9ZnVuY3Rpb24gUXAobil7cmV0dXJuIEJkPVlkKG4pLHQudGltZUZvcm1hdD1CZC5mb3JtYXQsdC50aW1lUGFyc2U9QmQucGFyc2UsdC51dGNGb3JtYXQ9QmQudXRjRm9ybWF0LHQudXRjUGFyc2U9QmQudXRjUGFyc2UsQmR9UXAoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgSnA9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX06dC51dGNGb3JtYXQoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpO3ZhciBLcD0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59OnQudXRjUGFyc2UoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpLHR2PTFlMyxudj02MCp0dixldj02MCpudixydj0yNCpldixpdj03KnJ2LG92PTMwKnJ2LGF2PTM2NSpydjtmdW5jdGlvbiB1dih0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gZnYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gY3YodCxuLHIsaSxvLGEsdSxmLGMpe3ZhciBzPW1oKGdoLHZlKSxsPXMuaW52ZXJ0LGg9cy5kb21haW4sZD1jKCIuJUwiKSxwPWMoIjolUyIpLHY9YygiJUk6JU0iKSxnPWMoIiVJICVwIikseT1jKCIlYSAlZCIpLF89YygiJWIgJWQiKSxiPWMoIiVCIiksbT1jKCIlWSIpLHg9W1t1LDEsdHZdLFt1LDUsNSp0dl0sW3UsMTUsMTUqdHZdLFt1LDMwLDMwKnR2XSxbYSwxLG52XSxbYSw1LDUqbnZdLFthLDE1LDE1Km52XSxbYSwzMCwzMCpudl0sW28sMSxldl0sW28sMywzKmV2XSxbbyw2LDYqZXZdLFtvLDEyLDEyKmV2XSxbaSwxLHJ2XSxbaSwyLDIqcnZdLFtyLDEsaXZdLFtuLDEsb3ZdLFtuLDMsMypvdl0sW3QsMSxhdl1dO2Z1bmN0aW9uIE0oZSl7cmV0dXJuKHUoZSk8ZT9kOmEoZSk8ZT9wOm8oZSk8ZT92OmkoZSk8ZT9nOm4oZSk8ZT9yKGUpPGU/eTpfOnQoZSk8ZT9iOm0pKGUpfWZ1bmN0aW9uIEEobixyLGksbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIGE9TWF0aC5hYnMoaS1yKS9uLHU9ZShmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pLnJpZ2h0KHgsYSk7dT09PXgubGVuZ3RoPyhvPXcoci9hdixpL2F2LG4pLG49dCk6dT8obz0odT14W2EveFt1LTFdWzJdPHhbdV1bMl0vYT91LTE6dV0pWzFdLG49dVswXSk6KG89TWF0aC5tYXgodyhyLGksbiksMSksbj1mKX1yZXR1cm4gbnVsbD09bz9uOm4uZXZlcnkobyl9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZShsKHQpKX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChmaC5jYWxsKHQsZnYpKTpoKCkubWFwKHV2KX0scy50aWNrcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9aCgpLGk9clswXSxvPXJbci5sZW5ndGgtMV0sYT1vPGk7cmV0dXJuIGEmJihlPWksaT1vLG89ZSksZT0oZT1BKHQsaSxvLG4pKT9lLnJhbmdlKGksbysxKTpbXSxhP2UucmV2ZXJzZSgpOmV9LHMudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uP006YyhuKX0scy5uaWNlPWZ1bmN0aW9uKHQsbil7dmFyIGU9aCgpO3JldHVybih0PUEodCxlWzBdLGVbZS5sZW5ndGgtMV0sbikpP2god2goZSx0KSk6c30scy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKHMsY3YodCxuLHIsaSxvLGEsdSxmLGMpKX0sc31mdW5jdGlvbiBzdih0KXtmb3IodmFyIG49dC5sZW5ndGgvNnwwLGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KWVbcl09IiMiK3Quc2xpY2UoNipyLDYqKytyKTtyZXR1cm4gZX12YXIgbHY9c3YoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLGh2PXN2KCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKSxkdj1zdigiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2IikscHY9c3YoImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpLHZ2PXN2KCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKSxndj1zdigiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIikseXY9c3YoImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpLF92PXN2KCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKSxidj1zdigiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIik7ZnVuY3Rpb24gbXYodCl7cmV0dXJuIGxlKHRbdC5sZW5ndGgtMV0pfXZhciB4dj1uZXcgQXJyYXkoMykuY29uY2F0KCJkOGIzNjVmNWY1ZjU1YWI0YWMiLCJhNjYxMWFkZmMyN2Q4MGNkYzEwMTg1NzEiLCJhNjYxMWFkZmMyN2RmNWY1ZjU4MGNkYzEwMTg1NzEiLCI4YzUxMGFkOGIzNjVmNmU4YzNjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFkOGIzNjVmNmU4YzNmNWY1ZjVjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiKS5tYXAoc3YpLHd2PW12KHh2KSxNdj1uZXcgQXJyYXkoMykuY29uY2F0KCJhZjhkYzNmN2Y3Zjc3ZmJmN2IiLCI3YjMyOTRjMmE1Y2ZhNmRiYTAwMDg4MzciLCI3YjMyOTRjMmE1Y2ZmN2Y3ZjdhNmRiYTAwMDg4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThmN2Y3ZjdkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiKS5tYXAoc3YpLEF2PW12KE12KSxUdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlOWEzYzlmN2Y3ZjdhMWQ3NmEiLCJkMDFjOGJmMWI2ZGFiOGUxODY0ZGFjMjYiLCJkMDFjOGJmMWI2ZGFmN2Y3ZjdiOGUxODY0ZGFjMjYiLCJjNTFiN2RlOWEzYzlmZGUwZWZlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RlOWEzYzlmZGUwZWZmN2Y3ZjdlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiKS5tYXAoc3YpLE52PW12KFR2KSxTdj1uZXcgQXJyYXkoMykuY29uY2F0KCI5OThlYzNmN2Y3ZjdmMWEzNDAiLCI1ZTNjOTliMmFiZDJmZGI4NjNlNjYxMDEiLCI1ZTNjOTliMmFiZDJmN2Y3ZjdmZGI4NjNlNjYxMDEiLCI1NDI3ODg5OThlYzNkOGRhZWJmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg5OThlYzNkOGRhZWJmN2Y3ZjdmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiKS5tYXAoc3YpLEV2PW12KFN2KSxrdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmN2Y3Zjc2N2E5Y2YiLCJjYTAwMjBmNGE1ODI5MmM1ZGUwNTcxYjAiLCJjYTAwMjBmNGE1ODJmN2Y3Zjc5MmM1ZGUwNTcxYjAiLCJiMjE4MmJlZjhhNjJmZGRiYzdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJlZjhhNjJmZGRiYzdmN2Y3ZjdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiKS5tYXAoc3YpLEN2PW12KGt2KSxQdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmZmZmZmY5OTk5OTkiLCJjYTAwMjBmNGE1ODJiYWJhYmE0MDQwNDAiLCJjYTAwMjBmNGE1ODJmZmZmZmZiYWJhYmE0MDQwNDAiLCJiMjE4MmJlZjhhNjJmZGRiYzdlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJlZjhhNjJmZGRiYzdmZmZmZmZlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiKS5tYXAoc3YpLHp2PW12KFB2KSxSdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWJmZGIiLCJkNzE5MWNmZGFlNjFhYmQ5ZTkyYzdiYjYiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmQ5ZTkyYzdiYjYiLCJkNzMwMjdmYzhkNTlmZWUwOTBlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmYzhkNTlmZWUwOTBmZmZmYmZlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiKS5tYXAoc3YpLEx2PW12KFJ2KSxEdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWNmNjAiLCJkNzE5MWNmZGFlNjFhNmQ5NmExYTk2NDEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhNmQ5NmExYTk2NDEiLCJkNzMwMjdmYzhkNTlmZWUwOGJkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmYzhkNTlmZWUwOGJmZmZmYmZkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciKS5tYXAoc3YpLFV2PW12KER2KSxxdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5OWQ1OTQiLCJkNzE5MWNmZGFlNjFhYmRkYTQyYjgzYmEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmRkYTQyYjgzYmEiLCJkNTNlNGZmYzhkNTlmZWUwOGJlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmYzhkNTlmZWUwOGJmZmZmYmZlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiKS5tYXAoc3YpLE92PW12KHF2KSxZdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1Zjk5OWQ4YzkyY2EyNWYiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyMzhiNDUiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLEJ2PW12KFl2KSxGdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGVjZjQ5ZWJjZGE4ODU2YTciLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODQxOWQiLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ4MTBmN2M0ZDAwNGIiKS5tYXAoc3YpLEl2PW12KEZ2KSxIdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGYzZGJhOGRkYjU0M2EyY2EiLCJmMGY5ZThiYWU0YmM3YmNjYzQyYjhjYmUiLCJmMGY5ZThiYWU0YmM3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODY4YWMwODQwODEiKS5tYXAoc3YpLGp2PW12KEh2KSxYdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU4YzhmZGJiODRlMzRhMzMiLCJmZWYwZDlmZGNjOGFmYzhkNTlkNzMwMWYiLCJmZWYwZDlmZGNjOGFmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWZiMzAwMDA3ZjAwMDAiKS5tYXAoc3YpLEd2PW12KFh2KSxWdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2UyZjBhNmJkZGIxYzkwOTkiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YwMjgxOGEiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTZjNTkwMTQ2MzYiKS5tYXAoc3YpLCR2PW12KFZ2KSxXdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2U3ZjJhNmJkZGIyYjhjYmUiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YwNTcwYjAiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwNDVhOGQwMjM4NTgiKS5tYXAoc3YpLFp2PW12KFd2KSxRdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlN2UxZWZjOTk0YzdkZDFjNzciLCJmMWVlZjZkN2I1ZDhkZjY1YjBjZTEyNTYiLCJmMWVlZjZkN2I1ZDhkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5ODAwNDM2NzAwMWYiKS5tYXAoc3YpLEp2PW12KFF2KSxLdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZGUwZGRmYTlmYjVjNTFiOGEiLCJmZWViZTJmYmI0YjlmNzY4YTFhZTAxN2UiLCJmZWViZTJmYmI0YjlmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzc0OTAwNmEiKS5tYXAoc3YpLHRnPW12KEt2KSxuZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZGY4YjE3ZmNkYmIyYzdmYjgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyMjVlYTgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgyNTM0OTQwODFkNTgiKS5tYXAoc3YpLGVnPW12KG5nKSxyZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmN2ZjYjlhZGRkOGUzMWEzNTQiLCJmZmZmY2NjMmU2OTk3OGM2NzkyMzg0NDMiLCJmZmZmY2NjMmU2OTk3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDY4MzcwMDQ1MjkiKS5tYXAoc3YpLGlnPW12KHJnKSxvZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmY3YmNmZWM0NGZkOTVmMGUiLCJmZmZmZDRmZWQ5OGVmZTk5MjljYzRjMDIiLCJmZmZmZDRmZWQ5OGVmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI5OTM0MDQ2NjI1MDYiKS5tYXAoc3YpLGFnPW12KG9nKSx1Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmVkYTBmZWIyNGNmMDNiMjAiLCJmZmZmYjJmZWNjNWNmZDhkM2NlMzFhMWMiLCJmZmZmYjJmZWNjNWNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiZDAwMjY4MDAwMjYiKS5tYXAoc3YpLGZnPW12KHVnKSxjZz1uZXcgQXJyYXkoMykuY29uY2F0KCJkZWViZjc5ZWNhZTEzMTgyYmQiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYyMTcxYjUiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODUxOWMwODMwNmIiKS5tYXAoc3YpLHNnPW12KGNnKSxsZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1ZTBhMWQ5OWIzMWEzNTQiLCJlZGY4ZTliYWU0YjM3NGM0NzYyMzhiNDUiLCJlZGY4ZTliYWU0YjM3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLGhnPW12KGxnKSxkZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmMGYwZjBiZGJkYmQ2MzYzNjMiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY1MjUyNTIiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUwMDAwMDAiKS5tYXAoc3YpLHBnPW12KGRnKSx2Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZmVkZjViY2JkZGM3NTZiYjEiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg2YTUxYTMiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM1NDI3OGYzZjAwN2QiKS5tYXAoc3YpLGdnPW12KHZnKSx5Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWUwZDJmYzkyNzJkZTJkMjYiLCJmZWU1ZDlmY2FlOTFmYjZhNGFjYjE4MWQiLCJmZWU1ZDlmY2FlOTFmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWRhNTBmMTU2NzAwMGQiKS5tYXAoc3YpLF9nPW12KHlnKSxiZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU2Y2VmZGFlNmJlNjU1MGQiLCJmZWVkZGVmZGJlODVmZDhkM2NkOTQ3MDEiLCJmZWVkZGVmZGJlODVmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDFhNjM2MDM3ZjI3MDQiKS5tYXAoc3YpLG1nPW12KGJnKSx4Zz1HZShLbigzMDAsLjUsMCksS24oLTI0MCwuNSwxKSksd2c9R2UoS24oLTEwMCwuNzUsLjM1KSxLbig4MCwxLjUsLjgpKSxNZz1HZShLbigyNjAsLjc1LC4zNSksS24oODAsMS41LC44KSksQWc9S24oKTt2YXIgVGc9Ym4oKSxOZz1NYXRoLlBJLzMsU2c9MipNYXRoLlBJLzM7ZnVuY3Rpb24gRWcodCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19dmFyIGtnPUVnKHN2KCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksQ2c9RWcoc3YoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxQZz1FZyhzdigiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLHpnPUVnKHN2KCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7ZnVuY3Rpb24gUmcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBMZz1NYXRoLmFicyxEZz1NYXRoLmF0YW4yLFVnPU1hdGguY29zLHFnPU1hdGgubWF4LE9nPU1hdGgubWluLFlnPU1hdGguc2luLEJnPU1hdGguc3FydCxGZz0xZS0xMixJZz1NYXRoLlBJLEhnPUlnLzIsamc9MipJZztmdW5jdGlvbiBYZyh0KXtyZXR1cm4gdD49MT9IZzp0PD0tMT8tSGc6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIEdnKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIFZnKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uICRnKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gV2codCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gWmcodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gUWcodCxuLGUscixpLG8sYSl7dmFyIHU9dC1lLGY9bi1yLGM9KGE/bzotbykvQmcodSp1K2YqZikscz1jKmYsbD0tYyp1LGg9dCtzLGQ9bitsLHA9ZStzLHY9citsLGc9KGgrcCkvMix5PShkK3YpLzIsXz1wLWgsYj12LWQsbT1fKl8rYipiLHg9aS1vLHc9aCp2LXAqZCxNPShiPDA/LTE6MSkqQmcocWcoMCx4KngqbS13KncpKSxBPSh3KmItXypNKS9tLFQ9KC13Kl8tYipNKS9tLE49KHcqYitfKk0pL20sUz0oLXcqXytiKk0pL20sRT1BLWcsaz1ULXksQz1OLWcsUD1TLXk7cmV0dXJuIEUqRStrKms+QypDK1AqUCYmKEE9TixUPVMpLHtjeDpBLGN5OlQseDAxOi1zLHkwMTotbCx4MTE6QSooaS94LTEpLHkxMTpUKihpL3gtMSl9fWZ1bmN0aW9uIEpnKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBLZyh0KXtyZXR1cm4gbmV3IEpnKHQpfWZ1bmN0aW9uIHR5KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG55KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGV5KCl7dmFyIHQ9dHksbj1ueSxlPVJnKCEwKSxyPW51bGwsaT1LZyxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscz1hLmxlbmd0aCxsPSExO2ZvcihudWxsPT1yJiYobz1pKGM9R2koKSkpLHU9MDt1PD1zOysrdSkhKHU8cyYmZShmPWFbdV0sdSxhKSk9PT1sJiYoKGw9IWwpP28ubGluZVN0YXJ0KCk6by5saW5lRW5kKCkpLGwmJm8ucG9pbnQoK3QoZix1LGEpLCtuKGYsdSxhKSk7aWYoYylyZXR1cm4gbz1udWxsLGMrIiJ8fG51bGx9cmV0dXJuIGEueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6bn0sYS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoISF0KSxhKTplfSxhLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbnVsbCE9ciYmKG89aShyKSksYSk6aX0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P3I9bz1udWxsOm89aShyPXQpLGEpOnJ9LGF9ZnVuY3Rpb24gcnkoKXt2YXIgdD10eSxuPW51bGwsZT1SZygwKSxyPW55LGk9UmcoITApLG89bnVsbCxhPUtnLHU9bnVsbDtmdW5jdGlvbiBmKGYpe3ZhciBjLHMsbCxoLGQscD1mLmxlbmd0aCx2PSExLGc9bmV3IEFycmF5KHApLHk9bmV3IEFycmF5KHApO2ZvcihudWxsPT1vJiYodT1hKGQ9R2koKSkpLGM9MDtjPD1wOysrYyl7aWYoIShjPHAmJmkoaD1mW2NdLGMsZikpPT09dilpZih2PSF2KXM9Yyx1LmFyZWFTdGFydCgpLHUubGluZVN0YXJ0KCk7ZWxzZXtmb3IodS5saW5lRW5kKCksdS5saW5lU3RhcnQoKSxsPWMtMTtsPj1zOy0tbCl1LnBvaW50KGdbbF0seVtsXSk7dS5saW5lRW5kKCksdS5hcmVhRW5kKCl9diYmKGdbY109K3QoaCxjLGYpLHlbY109K2UoaCxjLGYpLHUucG9pbnQobj8rbihoLGMsZik6Z1tjXSxyPytyKGgsYyxmKTp5W2NdKSl9aWYoZClyZXR1cm4gdT1udWxsLGQrIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiBleSgpLmRlZmluZWQoaSkuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gZi54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6UmcoK2UpLG49bnVsbCxmKTp0fSxmLngwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm59LGYueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxyPW51bGwsZik6ZX0sZi55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTplfSxmLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpyfSxmLmxpbmVYMD1mLmxpbmVZMD1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KGUpfSxmLmxpbmVZMT1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KHIpfSxmLmxpbmVYMT1mdW5jdGlvbigpe3JldHVybiBjKCkueChuKS55KGUpfSxmLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZyghIXQpLGYpOml9LGYuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxudWxsIT1vJiYodT1hKG8pKSxmKTphfSxmLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz11PW51bGw6dT1hKG89dCksZik6b30sZn1mdW5jdGlvbiBpeSh0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn1mdW5jdGlvbiBveSh0KXtyZXR1cm4gdH1KZy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKX19fTt2YXIgYXk9ZnkoS2cpO2Z1bmN0aW9uIHV5KHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZnkodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IHV5KHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24gY3kodCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oZnkodCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gc3koKXtyZXR1cm4gY3koZXkoKS5jdXJ2ZShheSkpfWZ1bmN0aW9uIGx5KCl7dmFyIHQ9cnkoKS5jdXJ2ZShheSksbj10LmN1cnZlLGU9dC5saW5lWDAscj10LmxpbmVYMSxpPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBjeShlKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gY3kocigpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGN5KGkoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBjeShvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGZ5KHQpKTpuKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIGh5KHQsbil7cmV0dXJuWyhuPStuKSpNYXRoLmNvcyh0LT1NYXRoLlBJLzIpLG4qTWF0aC5zaW4odCldfXV5LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIGR5PUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBweSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gdnkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIGd5KHQpe3ZhciBuPXB5LGU9dnkscj10eSxpPW55LG89bnVsbDtmdW5jdGlvbiBhKCl7dmFyIGEsdT1keS5jYWxsKGFyZ3VtZW50cyksZj1uLmFwcGx5KHRoaXMsdSksYz1lLmFwcGx5KHRoaXMsdSk7aWYob3x8KG89YT1HaSgpKSx0KG8sK3IuYXBwbHkodGhpcywodVswXT1mLHUpKSwraS5hcHBseSh0aGlzLHUpLCtyLmFwcGx5KHRoaXMsKHVbMF09Yyx1KSksK2kuYXBwbHkodGhpcyx1KSksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEuc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsYSk6bn0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6cn0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6dCxhKTpvfSxhfWZ1bmN0aW9uIHl5KHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obj0obityKS8yLGUsbixpLHIsaSl9ZnVuY3Rpb24gX3kodCxuLGUscixpKXt0Lm1vdmVUbyhuLGUpLHQuYmV6aWVyQ3VydmVUbyhuLGU9KGUraSkvMixyLGUscixpKX1mdW5jdGlvbiBieSh0LG4sZSxyLGkpe3ZhciBvPWh5KG4sZSksYT1oeShuLGU9KGUraSkvMiksdT1oeShyLGUpLGY9aHkocixpKTt0Lm1vdmVUbyhvWzBdLG9bMV0pLHQuYmV6aWVyQ3VydmVUbyhhWzBdLGFbMV0sdVswXSx1WzFdLGZbMF0sZlsxXSl9dmFyIG15PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vSWcpO3QubW92ZVRvKGUsMCksdC5hcmMoMCwwLGUsMCxqZyl9fSx4eT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fSx3eT1NYXRoLnNxcnQoMS8zKSxNeT0yKnd5LEF5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTXkpLHI9ZSp3eTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLDApLHQubGluZVRvKDAsZSksdC5saW5lVG8oLXIsMCksdC5jbG9zZVBhdGgoKX19LFR5PU1hdGguc2luKElnLzEwKS9NYXRoLnNpbig3KklnLzEwKSxOeT1NYXRoLnNpbihqZy8xMCkqVHksU3k9LU1hdGguY29zKGpnLzEwKSpUeSxFeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydCguODkwODEzMDkxNTI5Mjg1MipuKSxyPU55KmUsaT1TeSplO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKHIsaSk7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIGE9amcqby81LHU9TWF0aC5jb3MoYSksZj1NYXRoLnNpbihhKTt0LmxpbmVUbyhmKmUsLXUqZSksdC5saW5lVG8odSpyLWYqaSxmKnIrdSppKX10LmNsb3NlUGF0aCgpfX0sa3k9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobikscj0tZS8yO3QucmVjdChyLHIsZSxlKX19LEN5PU1hdGguc3FydCgzKSxQeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPS1NYXRoLnNxcnQobi8oMypDeSkpO3QubW92ZVRvKDAsMiplKSx0LmxpbmVUbygtQ3kqZSwtZSksdC5saW5lVG8oQ3kqZSwtZSksdC5jbG9zZVBhdGgoKX19LHp5PU1hdGguc3FydCgzKS8yLFJ5PTEvTWF0aC5zcXJ0KDEyKSxMeT0zKihSeS8yKzEpLER5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTHkpLHI9ZS8yLGk9ZSpSeSxvPXIsYT1lKlJ5K2UsdT0tbyxmPWE7dC5tb3ZlVG8ocixpKSx0LmxpbmVUbyhvLGEpLHQubGluZVRvKHUsZiksdC5saW5lVG8oLS41KnItenkqaSx6eSpyKy0uNSppKSx0LmxpbmVUbygtLjUqby16eSphLHp5Km8rLS41KmEpLHQubGluZVRvKC0uNSp1LXp5KmYsenkqdSstLjUqZiksdC5saW5lVG8oLS41KnIrenkqaSwtLjUqaS16eSpyKSx0LmxpbmVUbygtLjUqbyt6eSphLC0uNSphLXp5Km8pLHQubGluZVRvKC0uNSp1K3p5KmYsLS41KmYtenkqdSksdC5jbG9zZVBhdGgoKX19LFV5PVtteSx4eSxBeSxreSxFeSxQeSxEeV07ZnVuY3Rpb24gcXkoKXt9ZnVuY3Rpb24gT3kodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIFl5KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBCeSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRnkodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEl5KHQsbil7dGhpcy5fYmFzaXM9bmV3IFl5KHQpLHRoaXMuX2JldGE9bn1ZeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOk95KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0Ok95KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxCeS5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sRnkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sSXkucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoLTE7aWYoZT4wKWZvcih2YXIgcixpPXRbMF0sbz1uWzBdLGE9dFtlXS1pLHU9bltlXS1vLGY9LTE7KytmPD1lOylyPWYvZSx0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbZl0rKDEtdGhpcy5fYmV0YSkqKGkrciphKSx0aGlzLl9iZXRhKm5bZl0rKDEtdGhpcy5fYmV0YSkqKG8rcip1KSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O3ZhciBIeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT1uP25ldyBZeSh0KTpuZXcgSXkodCxuKX1yZXR1cm4gZS5iZXRhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjg1KTtmdW5jdGlvbiBqeSh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIFh5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1YeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6ankodGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0Omp5KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgR3k9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgWHkodCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7ZnVuY3Rpb24gVnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fVZ5LnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyICR5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFZ5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFd5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1XeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFp5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFd5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFF5KHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5GZyl7dmFyIHU9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsZj0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ocip1LXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2YsaT0oaSp1LXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2Z9aWYodC5fbDIzX2E+Rmcpe3ZhciBjPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLHM9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qYyt0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL3MsYT0oYSpjK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvc310Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gSnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1KeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEt5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgSnkodCxuKTpuZXcgWHkodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiB0Xyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufXRfLnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6UXkodGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgbl89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyB0Xyh0LG4pOm5ldyBWeSh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO2Z1bmN0aW9uIGVfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIHJfPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgZV8odCxuKTpuZXcgV3kodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBpXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gb18odCl7cmV0dXJuIHQ8MD8tMToxfWZ1bmN0aW9uIGFfKHQsbixlKXt2YXIgcj10Ll94MS10Ll94MCxpPW4tdC5feDEsbz0odC5feTEtdC5feTApLyhyfHxpPDAmJi0wKSxhPShlLXQuX3kxKS8oaXx8cjwwJiYtMCksdT0obyppK2EqcikvKHIraSk7cmV0dXJuKG9fKG8pK29fKGEpKSpNYXRoLm1pbihNYXRoLmFicyhvKSxNYXRoLmFicyhhKSwuNSpNYXRoLmFicyh1KSl8fDB9ZnVuY3Rpb24gdV8odCxuKXt2YXIgZT10Ll94MS10Ll94MDtyZXR1cm4gZT8oMyoodC5feTEtdC5feTApL2UtbikvMjpufWZ1bmN0aW9uIGZfKHQsbixlKXt2YXIgcj10Ll94MCxpPXQuX3kwLG89dC5feDEsYT10Ll95MSx1PShvLXIpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIrdSxpK3UqbixvLXUsYS11KmUsbyxhKX1mdW5jdGlvbiBjXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gc18odCl7dGhpcy5fY29udGV4dD1uZXcgbF8odCl9ZnVuY3Rpb24gbF8odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGhfKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBkXyh0KXt2YXIgbixlLHI9dC5sZW5ndGgtMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoaVswXT0wLG9bMF09MixhWzBdPXRbMF0rMip0WzFdLG49MTtuPHItMTsrK24paVtuXT0xLG9bbl09NCxhW25dPTQqdFtuXSsyKnRbbisxXTtmb3IoaVtyLTFdPTIsb1tyLTFdPTcsYVtyLTFdPTgqdFtyLTFdK3Rbcl0sbj0xO248cjsrK24pZT1pW25dL29bbi0xXSxvW25dLT1lLGFbbl0tPWUqYVtuLTFdO2ZvcihpW3ItMV09YVtyLTFdL29bci0xXSxuPXItMjtuPj0wOy0tbilpW25dPShhW25dLWlbbisxXSkvb1tuXTtmb3Iob1tyLTFdPSh0W3JdK2lbci0xXSkvMixuPTA7bjxyLTE7KytuKW9bbl09Mip0W24rMV0taVtuKzFdO3JldHVybltpLG9dfWZ1bmN0aW9uIHBfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX3Q9bn1mdW5jdGlvbiB2Xyh0LG4pe2lmKChpPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbz0xLGE9dFtuWzBdXSx1PWEubGVuZ3RoO288aTsrK28pZm9yKHI9YSxhPXRbbltvXV0sZT0wO2U8dTsrK2UpYVtlXVsxXSs9YVtlXVswXT1pc05hTihyW2VdWzFdKT9yW2VdWzBdOnJbZV1bMV19ZnVuY3Rpb24gZ18odCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9bmV3IEFycmF5KG4pOy0tbj49MDspZVtuXT1uO3JldHVybiBlfWZ1bmN0aW9uIHlfKHQsbil7cmV0dXJuIHRbbl19ZnVuY3Rpb24gX18odCl7dmFyIG49dC5tYXAoYl8pO3JldHVybiBnXyh0KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pfWZ1bmN0aW9uIGJfKHQpe2Zvcih2YXIgbixlPTAscj0tMSxpPXQubGVuZ3RoOysrcjxpOykobj0rdFtyXVsxXSkmJihlKz1uKTtyZXR1cm4gZX1mdW5jdGlvbiBtXyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24geF8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gd18odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gTV8oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBBXyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIFRfKHQsbil7dmFyIGU9bixyPW4uUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBOXyh0LG4pe3ZhciBlPW4scj1uLkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gU18odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIEVfKHQsbixlLHIpe3ZhciBpPVtudWxsLG51bGxdLG89Sl8ucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PW4sZSYmQ18oaSx0LG4sZSksciYmQ18oaSxuLHQsciksWl9bdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksWl9bbi5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBrXyh0LG4sZSl7dmFyIHI9W24sZV07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gQ18odCxuLGUscil7dFswXXx8dFsxXT90LmxlZnQ9PT1lP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9bix0LnJpZ2h0PWUpfWZ1bmN0aW9uIFBfKHQsbixlLHIsaSl7dmFyIG8sYT10WzBdLHU9dFsxXSxmPWFbMF0sYz1hWzFdLHM9MCxsPTEsaD11WzBdLWYsZD11WzFdLWM7aWYobz1uLWYsaHx8IShvPjApKXtpZihvLz1oLGg8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoaD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1yLWYsaHx8IShvPDApKXtpZihvLz1oLGg8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoaD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9aWYobz1lLWMsZHx8IShvPjApKXtpZihvLz1kLGQ8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoZD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1pLWMsZHx8IShvPDApKXtpZihvLz1kLGQ8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoZD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9cmV0dXJuIShzPjB8fGw8MSl8fChzPjAmJih0WzBdPVtmK3MqaCxjK3MqZF0pLGw8MSYmKHRbMV09W2YrbCpoLGMrbCpkXSksITApfX19fX1mdW5jdGlvbiB6Xyh0LG4sZSxyLGkpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgYSx1LGY9dFswXSxjPXQubGVmdCxzPXQucmlnaHQsbD1jWzBdLGg9Y1sxXSxkPXNbMF0scD1zWzFdLHY9KGwrZCkvMixnPShoK3ApLzI7aWYocD09PWgpe2lmKHY8bnx8dj49cilyZXR1cm47aWYobD5kKXtpZihmKXtpZihmWzFdPj1pKXJldHVybn1lbHNlIGY9W3YsZV07bz1bdixpXX1lbHNle2lmKGYpe2lmKGZbMV08ZSlyZXR1cm59ZWxzZSBmPVt2LGldO289W3YsZV19fWVsc2UgaWYodT1nLShhPShsLWQpLyhwLWgpKSp2LGE8LTF8fGE+MSlpZihsPmQpe2lmKGYpe2lmKGZbMV0+PWkpcmV0dXJufWVsc2UgZj1bKGUtdSkvYSxlXTtvPVsoaS11KS9hLGldfWVsc2V7aWYoZil7aWYoZlsxXTxlKXJldHVybn1lbHNlIGY9WyhpLXUpL2EsaV07bz1bKGUtdSkvYSxlXX1lbHNlIGlmKGg8cCl7aWYoZil7aWYoZlswXT49cilyZXR1cm59ZWxzZSBmPVtuLGEqbit1XTtvPVtyLGEqcit1XX1lbHNle2lmKGYpe2lmKGZbMF08bilyZXR1cm59ZWxzZSBmPVtyLGEqcit1XTtvPVtuLGEqbit1XX1yZXR1cm4gdFswXT1mLHRbMV09bywhMH1mdW5jdGlvbiBSXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPW4ubGVmdCxpPW4ucmlnaHQ7cmV0dXJuIGU9PT1pJiYoaT1yLHI9ZSksaT9NYXRoLmF0YW4yKGlbMV0tclsxXSxpWzBdLXJbMF0pOihlPT09cj8ocj1uWzFdLGk9blswXSk6KHI9blswXSxpPW5bMV0pLE1hdGguYXRhbjIoclswXS1pWzBdLGlbMV0tclsxXSkpfWZ1bmN0aW9uIExfKHQsbil7cmV0dXJuIG5bKyhuLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBEXyh0LG4pe3JldHVybiBuWysobi5sZWZ0PT09dC5zaXRlKV19aV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6cXksYXJlYUVuZDpxeSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dD0rdCxuPStuLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSl9fSxjXy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6Zl8odGhpcyx0aGlzLl90MCx1Xyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZihuPStuLCh0PSt0KSE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsZl8odGhpcyx1Xyh0aGlzLGU9YV8odGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0OmZfKHRoaXMsdGhpcy5fdDAsZT1hXyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LChzXy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjXy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe2NfLnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sbF8ucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0saF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9ZF8odCksaT1kXyhuKSxvPTAsYT0xO2E8ZTsrK28sKythKXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbYV0sblthXSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX0scF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX0sTV8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNXyxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7aWYodCl7aWYobi5QPXQsbi5OPXQuTix0Lk4mJih0Lk4uUD1uKSx0Lk49bix0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1ufWVsc2UgdC5SPW47ZT10fWVsc2UgdGhpcy5fPyh0PVNfKHRoaXMuXyksbi5QPW51bGwsbi5OPXQsdC5QPXQuTD1uLGU9dCk6KG4uUD1uLk49bnVsbCx0aGlzLl89bixlPW51bGwpO2ZvcihuLkw9bi5SPW51bGwsbi5VPWUsbi5DPSEwLHQ9bjtlJiZlLkM7KWU9PT0ocj1lLlUpLkw/KGk9ci5SKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5SJiYoVF8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsTl8odGhpcyxyKSk6KGk9ci5MKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5MJiYoTl8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsVF8odGhpcyxyKSksZT10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBuLGUscixpPXQuVSxvPXQuTCxhPXQuUjtpZihlPW8/YT9TXyhhKTpvOmEsaT9pLkw9PT10P2kuTD1lOmkuUj1lOnRoaXMuXz1lLG8mJmE/KHI9ZS5DLGUuQz10LkMsZS5MPW8sby5VPWUsZSE9PWE/KGk9ZS5VLGUuVT10LlUsdD1lLlIsaS5MPXQsZS5SPWEsYS5VPWUpOihlLlU9aSxpPWUsdD1lLlIpKToocj10LkMsdD1lKSx0JiYodC5VPWkpLCFyKWlmKHQmJnQuQyl0LkM9ITE7ZWxzZXtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChuPWkuUikuQyYmKG4uQz0hMSxpLkM9ITAsVF8odGhpcyxpKSxuPWkuUiksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5SJiZuLlIuQ3x8KG4uTC5DPSExLG4uQz0hMCxOXyh0aGlzLG4pLG49aS5SKSxuLkM9aS5DLGkuQz1uLlIuQz0hMSxUXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChuPWkuTCkuQyYmKG4uQz0hMSxpLkM9ITAsTl8odGhpcyxpKSxuPWkuTCksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5MJiZuLkwuQ3x8KG4uUi5DPSExLG4uQz0hMCxUXyh0aGlzLG4pLG49aS5MKSxuLkM9aS5DLGkuQz1uLkwuQz0hMSxOXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfW4uQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIFVfLHFfPVtdO2Z1bmN0aW9uIE9fKCl7QV8odGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFlfKHQpe3ZhciBuPXQuUCxlPXQuTjtpZihuJiZlKXt2YXIgcj1uLnNpdGUsaT10LnNpdGUsbz1lLnNpdGU7aWYociE9PW8pe3ZhciBhPWlbMF0sdT1pWzFdLGY9clswXS1hLGM9clsxXS11LHM9b1swXS1hLGw9b1sxXS11LGg9MiooZipsLWMqcyk7aWYoIShoPj0tdGIpKXt2YXIgZD1mKmYrYypjLHA9cypzK2wqbCx2PShsKmQtYypwKS9oLGc9KGYqcC1zKmQpL2gseT1xXy5wb3AoKXx8bmV3IE9fO3kuYXJjPXQseS5zaXRlPWkseS54PXYrYSx5Lnk9KHkuY3k9Zyt1KStNYXRoLnNxcnQodip2K2cqZyksdC5jaXJjbGU9eTtmb3IodmFyIF89bnVsbCxiPVFfLl87YjspaWYoeS55PGIueXx8eS55PT09Yi55JiZ5Lng8PWIueCl7aWYoIWIuTCl7Xz1iLlA7YnJlYWt9Yj1iLkx9ZWxzZXtpZighYi5SKXtfPWI7YnJlYWt9Yj1iLlJ9UV8uaW5zZXJ0KF8seSksX3x8KFVfPXkpfX19fWZ1bmN0aW9uIEJfKHQpe3ZhciBuPXQuY2lyY2xlO24mJihuLlB8fChVXz1uLk4pLFFfLnJlbW92ZShuKSxxXy5wdXNoKG4pLEFfKG4pLHQuY2lyY2xlPW51bGwpfXZhciBGXz1bXTtmdW5jdGlvbiBJXygpe0FfKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBIXyh0KXt2YXIgbj1GXy5wb3AoKXx8bmV3IElfO3JldHVybiBuLnNpdGU9dCxufWZ1bmN0aW9uIGpfKHQpe0JfKHQpLFdfLnJlbW92ZSh0KSxGXy5wdXNoKHQpLEFfKHQpfWZ1bmN0aW9uIFhfKHQpe3ZhciBuPXQuY2lyY2xlLGU9bi54LHI9bi5jeSxpPVtlLHJdLG89dC5QLGE9dC5OLHU9W3RdO2pfKHQpO2Zvcih2YXIgZj1vO2YuY2lyY2xlJiZNYXRoLmFicyhlLWYuY2lyY2xlLngpPEtfJiZNYXRoLmFicyhyLWYuY2lyY2xlLmN5KTxLXzspbz1mLlAsdS51bnNoaWZ0KGYpLGpfKGYpLGY9bzt1LnVuc2hpZnQoZiksQl8oZik7Zm9yKHZhciBjPWE7Yy5jaXJjbGUmJk1hdGguYWJzKGUtYy5jaXJjbGUueCk8S18mJk1hdGguYWJzKHItYy5jaXJjbGUuY3kpPEtfOylhPWMuTix1LnB1c2goYyksal8oYyksYz1hO3UucHVzaChjKSxCXyhjKTt2YXIgcyxsPXUubGVuZ3RoO2ZvcihzPTE7czxsOysrcyljPXVbc10sZj11W3MtMV0sQ18oYy5lZGdlLGYuc2l0ZSxjLnNpdGUsaSk7Zj11WzBdLChjPXVbbC0xXSkuZWRnZT1FXyhmLnNpdGUsYy5zaXRlLG51bGwsaSksWV8oZiksWV8oYyl9ZnVuY3Rpb24gR18odCl7Zm9yKHZhciBuLGUscixpLG89dFswXSxhPXRbMV0sdT1XXy5fO3U7KWlmKChyPVZfKHUsYSktbyk+S18pdT11Lkw7ZWxzZXtpZighKChpPW8tJF8odSxhKSk+S18pKXtyPi1LXz8obj11LlAsZT11KTppPi1LXz8obj11LGU9dS5OKTpuPWU9dTticmVha31pZighdS5SKXtuPXU7YnJlYWt9dT11LlJ9IWZ1bmN0aW9uKHQpe1pfW3QuaW5kZXhdPXtzaXRlOnQsaGFsZmVkZ2VzOltdfX0odCk7dmFyIGY9SF8odCk7aWYoV18uaW5zZXJ0KG4sZiksbnx8ZSl7aWYobj09PWUpcmV0dXJuIEJfKG4pLGU9SF8obi5zaXRlKSxXXy5pbnNlcnQoZixlKSxmLmVkZ2U9ZS5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpLFlfKG4pLHZvaWQgWV8oZSk7aWYoZSl7Ql8obiksQl8oZSk7dmFyIGM9bi5zaXRlLHM9Y1swXSxsPWNbMV0saD10WzBdLXMsZD10WzFdLWwscD1lLnNpdGUsdj1wWzBdLXMsZz1wWzFdLWwseT0yKihoKmctZCp2KSxfPWgqaCtkKmQsYj12KnYrZypnLG09WyhnKl8tZCpiKS95K3MsKGgqYi12Kl8pL3krbF07Q18oZS5lZGdlLGMscCxtKSxmLmVkZ2U9RV8oYyx0LG51bGwsbSksZS5lZGdlPUVfKHQscCxudWxsLG0pLFlfKG4pLFlfKGUpfWVsc2UgZi5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpfX1mdW5jdGlvbiBWXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPWVbMF0saT1lWzFdLG89aS1uO2lmKCFvKXJldHVybiByO3ZhciBhPXQuUDtpZighYSlyZXR1cm4tMS8wO3ZhciB1PShlPWEuc2l0ZSlbMF0sZj1lWzFdLGM9Zi1uO2lmKCFjKXJldHVybiB1O3ZhciBzPXUtcixsPTEvby0xL2MsaD1zL2M7cmV0dXJuIGw/KC1oK01hdGguc3FydChoKmgtMipsKihzKnMvKC0yKmMpLWYrYy8yK2ktby8yKSkpL2wrcjoocit1KS8yfWZ1bmN0aW9uICRfKHQsbil7dmFyIGU9dC5OO2lmKGUpcmV0dXJuIFZfKGUsbik7dmFyIHI9dC5zaXRlO3JldHVybiByWzFdPT09bj9yWzBdOjEvMH12YXIgV18sWl8sUV8sSl8sS189MWUtNix0Yj0xZS0xMjtmdW5jdGlvbiBuYih0LG4pe3JldHVybiBuWzFdLXRbMV18fG5bMF0tdFswXX1mdW5jdGlvbiBlYih0LG4pe3ZhciBlLHIsaSxvPXQuc29ydChuYikucG9wKCk7Zm9yKEpfPVtdLFpfPW5ldyBBcnJheSh0Lmxlbmd0aCksV189bmV3IE1fLFFfPW5ldyBNXzs7KWlmKGk9VV8sbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKW9bMF09PT1lJiZvWzFdPT09cnx8KEdfKG8pLGU9b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO1hfKGkuYXJjKX1pZihmdW5jdGlvbigpe2Zvcih2YXIgdCxuLGUscixpPTAsbz1aXy5sZW5ndGg7aTxvOysraSlpZigodD1aX1tpXSkmJihyPShuPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgYT1uZXcgQXJyYXkociksdT1uZXcgQXJyYXkocik7Zm9yKGU9MDtlPHI7KytlKWFbZV09ZSx1W2VdPVJfKHQsSl9bbltlXV0pO2ZvcihhLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gdVtuXS11W3RdfSksZT0wO2U8cjsrK2UpdVtlXT1uW2FbZV1dO2ZvcihlPTA7ZTxyOysrZSluW2VdPXVbZV19fSgpLG4pe3ZhciBhPStuWzBdWzBdLHU9K25bMF1bMV0sZj0rblsxXVswXSxjPStuWzFdWzFdOyFmdW5jdGlvbih0LG4sZSxyKXtmb3IodmFyIGksbz1KXy5sZW5ndGg7by0tOyl6XyhpPUpfW29dLHQsbixlLHIpJiZQXyhpLHQsbixlLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5LX3x8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5LXyl8fGRlbGV0ZSBKX1tvXX0oYSx1LGYsYyksZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGc9Wl8ubGVuZ3RoLHk9ITA7Zm9yKGk9MDtpPGc7KytpKWlmKG89Wl9baV0pe2ZvcihhPW8uc2l0ZSx1PShmPW8uaGFsZmVkZ2VzKS5sZW5ndGg7dS0tOylKX1tmW3VdXXx8Zi5zcGxpY2UodSwxKTtmb3IodT0wLGM9Zi5sZW5ndGg7dTxjOylwPShkPURfKG8sSl9bZlt1XV0pKVswXSx2PWRbMV0sbD0ocz1MXyhvLEpfW2ZbKyt1JWNdXSkpWzBdLGg9c1sxXSwoTWF0aC5hYnMocC1sKT5LX3x8TWF0aC5hYnModi1oKT5LXykmJihmLnNwbGljZSh1LDAsSl8ucHVzaChrXyhhLGQsTWF0aC5hYnMocC10KTxLXyYmci12PktfP1t0LE1hdGguYWJzKGwtdCk8S18/aDpyXTpNYXRoLmFicyh2LXIpPEtfJiZlLXA+S18/W01hdGguYWJzKGgtcik8S18/bDplLHJdOk1hdGguYWJzKHAtZSk8S18mJnYtbj5LXz9bZSxNYXRoLmFicyhsLWUpPEtfP2g6bl06TWF0aC5hYnModi1uKTxLXyYmcC10PktfP1tNYXRoLmFicyhoLW4pPEtfP2w6dCxuXTpudWxsKSktMSksKytjKTtjJiYoeT0hMSl9aWYoeSl7dmFyIF8sYixtLHg9MS8wO2ZvcihpPTAseT1udWxsO2k8ZzsrK2kpKG89Wl9baV0pJiYobT0oXz0oYT1vLnNpdGUpWzBdLXQpKl8rKGI9YVsxXS1uKSpiKTx4JiYoeD1tLHk9byk7aWYoeSl7dmFyIHc9W3Qsbl0sTT1bdCxyXSxBPVtlLHJdLFQ9W2Usbl07eS5oYWxmZWRnZXMucHVzaChKXy5wdXNoKGtfKGE9eS5zaXRlLHcsTSkpLTEsSl8ucHVzaChrXyhhLE0sQSkpLTEsSl8ucHVzaChrXyhhLEEsVCkpLTEsSl8ucHVzaChrXyhhLFQsdykpLTEpfX1mb3IoaT0wO2k8ZzsrK2kpKG89Wl9baV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgWl9baV0pfShhLHUsZixjKX10aGlzLmVkZ2VzPUpfLHRoaXMuY2VsbHM9Wl8sV189UV89Sl89Wl89bnVsbH1mdW5jdGlvbiByYih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gaWIodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy50cmFuc2Zvcm09ZX1mdW5jdGlvbiBvYih0LG4sZSl7dGhpcy5rPXQsdGhpcy54PW4sdGhpcy55PWV9ZWIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplYixwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKG4pe3ZhciBlPW4uaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTF8obix0W2VdKX0pO3JldHVybiBlLmRhdGE9bi5zaXRlLmRhdGEsZX0pfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxuPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2lmKG89KGk9ZS5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyxhLHUsZixjLHM9ZS5zaXRlLGw9LTEsaD1uW2lbby0xXV0sZD1oLmxlZnQ9PT1zP2gucmlnaHQ6aC5sZWZ0OysrbDxvOylhPWQsZD0oaD1uW2lbbF1dKS5sZWZ0PT09cz9oLnJpZ2h0OmgubGVmdCxhJiZkJiZyPGEuaW5kZXgmJnI8ZC5pbmRleCYmKGY9YSxjPWQsKCh1PXMpWzBdLWNbMF0pKihmWzFdLXVbMV0pLSh1WzBdLWZbMF0pKihjWzFdLXVbMV0pPDApJiZ0LnB1c2goW3MuZGF0YSxhLmRhdGEsZC5kYXRhXSl9KSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSl9LGZpbmQ6ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHU9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbYV0pOylpZigrK2E+PXUpcmV0dXJuIG51bGw7dmFyIGY9dC1pLnNpdGVbMF0sYz1uLWkuc2l0ZVsxXSxzPWYqZitjKmM7ZG97aT1vLmNlbGxzW3I9YV0sYT1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9by5lZGdlc1tlXSx1PXIubGVmdDtpZih1IT09aS5zaXRlJiZ1fHwodT1yLnJpZ2h0KSl7dmFyIGY9dC11WzBdLGM9bi11WzFdLGw9ZipmK2MqYztsPHMmJihzPWwsYT11LmluZGV4KX19KX13aGlsZShudWxsIT09YSk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09ZXx8czw9ZSplP2kuc2l0ZTpudWxsfX0sb2IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvYixzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgb2IodGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LG4pe3JldHVybiAwPT09dCYwPT09bj90aGlzOm5ldyBvYih0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqbil9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciBhYj1uZXcgb2IoMSwwLDApO2Z1bmN0aW9uIHViKHQpe3JldHVybiB0Ll9fem9vbXx8YWJ9ZnVuY3Rpb24gZmIoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGNiKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gc2IoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gbGIoKXt2YXIgdCxuLGU9dGhpcztyZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KGU9ZS5vd25lclNWR0VsZW1lbnR8fGUpLndpZHRoLmJhc2VWYWwudmFsdWUsbj1lLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1lLmNsaWVudFdpZHRoLG49ZS5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxuXV19ZnVuY3Rpb24gaGIoKXtyZXR1cm4gdGhpcy5fX3pvb218fGFifWZ1bmN0aW9uIGRiKCl7cmV0dXJuLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwfWZ1bmN0aW9uIHBiKCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIHZiKHQsbixlKXt2YXIgcj10LmludmVydFgoblswXVswXSktZVswXVswXSxpPXQuaW52ZXJ0WChuWzFdWzBdKS1lWzFdWzBdLG89dC5pbnZlcnRZKG5bMF1bMV0pLWVbMF1bMV0sYT10LmludmVydFkoblsxXVsxXSktZVsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUoaT5yPyhyK2kpLzI6TWF0aC5taW4oMCxyKXx8TWF0aC5tYXgoMCxpKSxhPm8/KG8rYSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLGEpKX11Yi5wcm90b3R5cGU9b2IucHJvdG90eXBlLHQudmVyc2lvbj0iNS43LjAiLHQuYmlzZWN0PWksdC5iaXNlY3RSaWdodD1pLHQuYmlzZWN0TGVmdD1vLHQuYXNjZW5kaW5nPW4sdC5iaXNlY3Rvcj1lLHQuY3Jvc3M9ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbyx1LGY9dC5sZW5ndGgsYz1uLmxlbmd0aCxzPW5ldyBBcnJheShmKmMpO2ZvcihudWxsPT1lJiYoZT1hKSxyPW89MDtyPGY7KytyKWZvcih1PXRbcl0saT0wO2k8YzsrK2ksKytvKXNbb109ZSh1LG5baV0pO3JldHVybiBzfSx0LmRlc2NlbmRpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59LHQuZGV2aWF0aW9uPWMsdC5leHRlbnQ9cyx0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe3ZhciB0PXYsbj1zLGU9TTtmdW5jdGlvbiByKHIpe3ZhciBvLGEsdT1yLmxlbmd0aCxmPW5ldyBBcnJheSh1KTtmb3Iobz0wO288dTsrK28pZltvXT10KHJbb10sbyxyKTt2YXIgYz1uKGYpLHM9Y1swXSxsPWNbMV0saD1lKGYscyxsKTtBcnJheS5pc0FycmF5KGgpfHwoaD13KHMsbCxoKSxoPWcoTWF0aC5jZWlsKHMvaCkqaCxsLGgpKTtmb3IodmFyIGQ9aC5sZW5ndGg7aFswXTw9czspaC5zaGlmdCgpLC0tZDtmb3IoO2hbZC0xXT5sOyloLnBvcCgpLC0tZDt2YXIgcCx2PW5ldyBBcnJheShkKzEpO2ZvcihvPTA7bzw9ZDsrK28pKHA9dltvXT1bXSkueDA9bz4wP2hbby0xXTpzLHAueDE9bzxkP2hbb106bDtmb3Iobz0wO288dTsrK28pczw9KGE9ZltvXSkmJmE8PWwmJnZbaShoLGEsMCxkKV0ucHVzaChyW29dKTtyZXR1cm4gdn1yZXR1cm4gci52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnAobikscik6dH0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpwKFt0WzBdLHRbMV1dKSxyKTpufSxyLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP3AoaC5jYWxsKHQpKTpwKHQpLHIpOmV9LHJ9LHQudGhyZXNob2xkRnJlZWRtYW5EaWFjb25pcz1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9ZC5jYWxsKHQsdSkuc29ydChuKSxNYXRoLmNlaWwoKHItZSkvKDIqKEEodCwuNzUpLUEodCwuMjUpKSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFNjb3R0PWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqYyh0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFN0dXJnZXM9TSx0Lm1heD1ULHQubWVhbj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT1yLG89LTEsYT0wO2lmKG51bGw9PW4pZm9yKDsrK288cjspaXNOYU4oZT11KHRbb10pKT8tLWk6YSs9ZTtlbHNlIGZvcig7KytvPHI7KWlzTmFOKGU9dShuKHRbb10sbyx0KSkpPy0taTphKz1lO2lmKGkpcmV0dXJuIGEvaX0sdC5tZWRpYW49ZnVuY3Rpb24odCxlKXt2YXIgcixpPXQubGVuZ3RoLG89LTEsYT1bXTtpZihudWxsPT1lKWZvcig7KytvPGk7KWlzTmFOKHI9dSh0W29dKSl8fGEucHVzaChyKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKHI9dShlKHRbb10sbyx0KSkpfHxhLnB1c2gocik7cmV0dXJuIEEoYS5zb3J0KG4pLC41KX0sdC5tZXJnZT1OLHQubWluPVMsdC5wYWlycz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPWEpO2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgtMSxpPXRbMF0sbz1uZXcgQXJyYXkocjwwPzA6cik7ZTxyOylvW2VdPW4oaSxpPXRbKytlXSk7cmV0dXJuIG99LHQucGVybXV0ZT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtuW2VdXTtyZXR1cm4gcn0sdC5xdWFudGlsZT1BLHQucmFuZ2U9Zyx0LnNjYW49ZnVuY3Rpb24odCxlKXtpZihyPXQubGVuZ3RoKXt2YXIgcixpLG89MCxhPTAsdT10W2FdO2ZvcihudWxsPT1lJiYoZT1uKTsrK288cjspKGUoaT10W29dLHUpPDB8fDAhPT1lKHUsdSkpJiYodT1pLGE9byk7cmV0dXJuIDA9PT1lKHUsdSk/YTp2b2lkIDB9fSx0LnNodWZmbGU9ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89KG51bGw9PWU/dC5sZW5ndGg6ZSktKG49bnVsbD09bj8wOituKTtvOylpPU1hdGgucmFuZG9tKCkqby0tfDAscj10W28rbl0sdFtvK25dPXRbaStuXSx0W2krbl09cjtyZXR1cm4gdH0sdC5zdW09ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9LTEsbz0wO2lmKG51bGw9PW4pZm9yKDsrK2k8cjspKGU9K3RbaV0pJiYobys9ZSk7ZWxzZSBmb3IoOysraTxyOykoZT0rbih0W2ldLGksdCkpJiYobys9ZSk7cmV0dXJuIG99LHQudGlja3M9bSx0LnRpY2tJbmNyZW1lbnQ9eCx0LnRpY2tTdGVwPXcsdC50cmFuc3Bvc2U9RSx0LnZhcmlhbmNlPWYsdC56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gRShhcmd1bWVudHMpfSx0LmF4aXNUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIEIoeix0KX0sdC5heGlzUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoUix0KX0sdC5heGlzQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBCKEwsdCl9LHQuYXhpc0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoRCx0KX0sdC5icnVzaD1mdW5jdGlvbigpe3JldHVybiBSaSh3aSl9LHQuYnJ1c2hYPWZ1bmN0aW9uKCl7cmV0dXJuIFJpKG1pKX0sdC5icnVzaFk9ZnVuY3Rpb24oKXtyZXR1cm4gUmkoeGkpfSx0LmJydXNoU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9LHQuY2hvcmQ9ZnVuY3Rpb24oKXt2YXIgdD0wLG49bnVsbCxlPW51bGwscj1udWxsO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1LGYsYyxzLGw9aS5sZW5ndGgsaD1bXSxkPWcobCkscD1bXSx2PVtdLHk9di5ncm91cHM9bmV3IEFycmF5KGwpLF89bmV3IEFycmF5KGwqbCk7Zm9yKG89MCxjPS0xOysrYzxsOyl7Zm9yKGE9MCxzPS0xOysrczxsOylhKz1pW2NdW3NdO2gucHVzaChhKSxwLnB1c2goZyhsKSksbys9YX1mb3IobiYmZC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oaFt0XSxoW2VdKX0pLGUmJnAuZm9yRWFjaChmdW5jdGlvbih0LG4pe3Quc29ydChmdW5jdGlvbih0LHIpe3JldHVybiBlKGlbbl1bdF0saVtuXVtyXSl9KX0pLGY9KG89WWkoMCxPaS10KmwpL28pP3Q6T2kvbCxhPTAsYz0tMTsrK2M8bDspe2Zvcih1PWEscz0tMTsrK3M8bDspe3ZhciBiPWRbY10sbT1wW2JdW3NdLHg9aVtiXVttXSx3PWEsTT1hKz14Km87X1ttKmwrYl09e2luZGV4OmIsc3ViaW5kZXg6bSxzdGFydEFuZ2xlOncsZW5kQW5nbGU6TSx2YWx1ZTp4fX15W2JdPXtpbmRleDpiLHN0YXJ0QW5nbGU6dSxlbmRBbmdsZTphLHZhbHVlOmhbYl19LGErPWZ9Zm9yKGM9LTE7KytjPGw7KWZvcihzPWMtMTsrK3M8bDspe3ZhciBBPV9bcypsK2NdLFQ9X1tjKmwrc107KEEudmFsdWV8fFQudmFsdWUpJiZ2LnB1c2goQS52YWx1ZTxULnZhbHVlP3tzb3VyY2U6VCx0YXJnZXQ6QX06e3NvdXJjZTpBLHRhcmdldDpUfSl9cmV0dXJuIHI/di5zb3J0KHIpOnZ9cmV0dXJuIGkucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9WWkoMCxuKSxpKTp0fSxpLnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxpKTpufSxpLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxpKTplfSxpLnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/cj1udWxsOihuPXQscj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX0pLl89dCxpKTpyJiZyLl87dmFyIG59LGl9LHQucmliYm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Vmksbj0kaSxlPVdpLHI9WmksaT1RaSxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHU9QmkuY2FsbChhcmd1bWVudHMpLGY9dC5hcHBseSh0aGlzLHUpLGM9bi5hcHBseSh0aGlzLHUpLHM9K2UuYXBwbHkodGhpcywodVswXT1mLHUpKSxsPXIuYXBwbHkodGhpcyx1KS1xaSxoPWkuYXBwbHkodGhpcyx1KS1xaSxkPXMqTGkobCkscD1zKkRpKGwpLHY9K2UuYXBwbHkodGhpcywodVswXT1jLHUpKSxnPXIuYXBwbHkodGhpcyx1KS1xaSx5PWkuYXBwbHkodGhpcyx1KS1xaTtpZihvfHwobz1hPUdpKCkpLG8ubW92ZVRvKGQscCksby5hcmMoMCwwLHMsbCxoKSxsPT09ZyYmaD09PXl8fChvLnF1YWRyYXRpY0N1cnZlVG8oMCwwLHYqTGkoZyksdipEaShnKSksby5hcmMoMCwwLHYsZyx5KSksby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxkLHApLG8uY2xvc2VQYXRoKCksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOml9LGEuc291cmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sYSk6dH0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX0sdC5uZXN0PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9W10saT1bXTtmdW5jdGlvbiBvKGUsaSxhLHUpe2lmKGk+PXIubGVuZ3RoKXJldHVybiBudWxsIT10JiZlLnNvcnQodCksbnVsbCE9bj9uKGUpOmU7Zm9yKHZhciBmLGMscyxsPS0xLGg9ZS5sZW5ndGgsZD1yW2krK10scD1LaSgpLHY9YSgpOysrbDxoOykocz1wLmdldChmPWQoYz1lW2xdKSsiIikpP3MucHVzaChjKTpwLnNldChmLFtjXSk7cmV0dXJuIHAuZWFjaChmdW5jdGlvbih0LG4pe3UodixuLG8odCxpLGEsdSkpfSksdn1yZXR1cm4gZT17b2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCx0byxubyl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsZW8scm8pfSxlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiB0KGUsbyl7aWYoKytvPnIubGVuZ3RoKXJldHVybiBlO3ZhciBhLHU9aVtvLTFdO3JldHVybiBudWxsIT1uJiZvPj1yLmxlbmd0aD9hPWUuZW50cmllcygpOihhPVtdLGUuZWFjaChmdW5jdGlvbihuLGUpe2EucHVzaCh7a2V5OmUsdmFsdWVzOnQobixvKX0pfSkpLG51bGwhPXU/YS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHUodC5rZXksbi5rZXkpfSk6YX0obyh0LDAsZW8scm8pLDApfSxrZXk6ZnVuY3Rpb24odCl7cmV0dXJuIHIucHVzaCh0KSxlfSxzb3J0S2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaVtyLmxlbmd0aC0xXT10LGV9LHNvcnRWYWx1ZXM6ZnVuY3Rpb24obil7cmV0dXJuIHQ9bixlfSxyb2xsdXA6ZnVuY3Rpb24odCl7cmV0dXJuIG49dCxlfX19LHQuc2V0PWFvLHQubWFwPUtpLHQua2V5cz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goZSk7cmV0dXJuIG59LHQudmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh0W2VdKTtyZXR1cm4gbn0sdC5lbnRyaWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh7a2V5OmUsdmFsdWU6dFtlXX0pO3JldHVybiBufSx0LmNvbG9yPXZuLHQucmdiPWJuLHQuaHNsPU1uLHQubGFiPVVuLHQuaGNsPUhuLHQubGNoPWZ1bmN0aW9uKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4oZSxuLHQsbnVsbD09cj8xOnIpfSx0LmdyYXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IHFuKHQsMCwwLG51bGw9PW4/MTpuKX0sdC5jdWJlaGVsaXg9S24sdC5jb250b3Vycz1nbyx0LmNvbnRvdXJEZW5zaXR5PWZ1bmN0aW9uKCl7dmFyIHQ9Ym8sbj1tbyxlPXhvLHI9OTYwLGk9NTAwLG89MjAsYT0yLHU9MypvLGY9cisyKnU+PmEsYz1pKzIqdT4+YSxzPWNvKDIwKTtmdW5jdGlvbiBsKHIpe3ZhciBpPW5ldyBGbG9hdDMyQXJyYXkoZipjKSxsPW5ldyBGbG9hdDMyQXJyYXkoZipjKTtyLmZvckVhY2goZnVuY3Rpb24ocixvLHMpe3ZhciBsPSt0KHIsbyxzKSt1Pj5hLGg9K24ocixvLHMpK3U+PmEsZD0rZShyLG8scyk7bD49MCYmbDxmJiZoPj0wJiZoPGMmJihpW2wraCpmXSs9ZCl9KSx5byh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0sbz4+YSksX28oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LG8+PmEpLHlvKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSxvPj5hKSxfbyh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0sbz4+YSkseW8oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LG8+PmEpLF9vKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSxvPj5hKTt2YXIgZD1zKGkpO2lmKCFBcnJheS5pc0FycmF5KGQpKXt2YXIgcD1UKGkpO2Q9dygwLHAsZCksKGQ9ZygwLE1hdGguZmxvb3IocC9kKSpkLGQpKS5zaGlmdCgpfXJldHVybiBnbygpLnRocmVzaG9sZHMoZCkuc2l6ZShbZixjXSkoaSkubWFwKGgpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQudmFsdWUqPU1hdGgucG93KDIsLTIqYSksdC5jb29yZGluYXRlcy5mb3JFYWNoKGQpLHR9ZnVuY3Rpb24gZCh0KXt0LmZvckVhY2gocCl9ZnVuY3Rpb24gcCh0KXt0LmZvckVhY2godil9ZnVuY3Rpb24gdih0KXt0WzBdPXRbMF0qTWF0aC5wb3coMixhKS11LHRbMV09dFsxXSpNYXRoLnBvdygyLGEpLXV9ZnVuY3Rpb24geSgpe3JldHVybiBmPXIrMioodT0zKm8pPj5hLGM9aSsyKnU+PmEsbH1yZXR1cm4gbC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y28oK24pLGwpOnR9LGwueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTpufSxsLndlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTplfSxsLnNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3IsaV07dmFyIG49TWF0aC5jZWlsKHRbMF0pLGU9TWF0aC5jZWlsKHRbMV0pO2lmKCEobj49MHx8bj49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gcj1uLGk9ZSx5KCl9LGwuY2VsbFNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIDE8PGE7aWYoISgodD0rdCk+PTEpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjZWxsIHNpemUiKTtyZXR1cm4gYT1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx5KCl9LGwudGhyZXNob2xkcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkFycmF5LmlzQXJyYXkodCk/Y28odW8uY2FsbCh0KSk6Y28odCksbCk6c30sbC5iYW5kd2lkdGg9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIE1hdGguc3FydChvKihvKzEpKTtpZighKCh0PSt0KT49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJhbmR3aWR0aCIpO3JldHVybiBvPU1hdGgucm91bmQoKE1hdGguc3FydCg0KnQqdCsxKS0xKS8yKSx5KCl9LGx9LHQuZGlzcGF0Y2g9SSx0LmRyYWc9ZnVuY3Rpb24oKXt2YXIgbixlLHIsaSxvPVd0LGE9WnQsdT1RdCxmPUp0LGM9e30scz1JKCJzdGFydCIsImRyYWciLCJlbmQiKSxsPTAsaD0wO2Z1bmN0aW9uIGQodCl7dC5vbigibW91c2Vkb3duLmRyYWciLHApLmZpbHRlcihmKS5vbigidG91Y2hzdGFydC5kcmFnIix5KS5vbigidG91Y2htb3ZlLmRyYWciLF8pLm9uKCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWciLGIpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBwKCl7aWYoIWkmJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdT1tKCJtb3VzZSIsYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksRnQsdGhpcyxhcmd1bWVudHMpO3UmJihEdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsdiwhMCkub24oIm1vdXNldXAuZHJhZyIsZywhMCksWHQodC5ldmVudC52aWV3KSxIdCgpLHI9ITEsbj10LmV2ZW50LmNsaWVudFgsZT10LmV2ZW50LmNsaWVudFksdSgic3RhcnQiKSl9fWZ1bmN0aW9uIHYoKXtpZihqdCgpLCFyKXt2YXIgaT10LmV2ZW50LmNsaWVudFgtbixvPXQuZXZlbnQuY2xpZW50WS1lO3I9aSppK28qbz5ofWMubW91c2UoImRyYWciKX1mdW5jdGlvbiBnKCl7RHQodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsciksanQoKSxjLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiB5KCl7aWYoby5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmxlbmd0aDtmb3Iobj0wO248dTsrK24pKGU9bShyW25dLmlkZW50aWZpZXIsaSxJdCx0aGlzLGFyZ3VtZW50cykpJiYoSHQoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gXygpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPWNbcltuXS5pZGVudGlmaWVyXSkmJihqdCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYigpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLG89ci5sZW5ndGg7Zm9yKGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPW51bGx9LDUwMCksbj0wO248bzsrK24pKGU9Y1tyW25dLmlkZW50aWZpZXJdKSYmKEh0KCksZSgiZW5kIikpfWZ1bmN0aW9uIG0obixlLHIsaSxvKXt2YXIgYSxmLGgscD1yKGUsbiksdj1zLmNvcHkoKTtpZihDdChuZXcgJHQoZCwiYmVmb3Jlc3RhcnQiLGEsbixsLHBbMF0scFsxXSwwLDAsdiksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPXUuYXBwbHkoaSxvKSkmJihmPWEueC1wWzBdfHwwLGg9YS55LXBbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQodSl7dmFyIHMsZz1wO3N3aXRjaCh1KXtjYXNlInN0YXJ0IjpjW25dPXQscz1sKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBjW25dLC0tbDtjYXNlImRyYWciOnA9cihlLG4pLHM9bH1DdChuZXcgJHQoZCx1LGEsbixzLHBbMF0rZixwWzFdK2gscFswXS1nWzBdLHBbMV0tZ1sxXSx2KSx2LmFwcGx5LHYsW3UsaSxvXSl9fXJldHVybiBkLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6b30sZC5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTphfSxkLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTp1fSxkLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6Zn0sZC5vbj1mdW5jdGlvbigpe3ZhciB0PXMub24uYXBwbHkocyxhcmd1bWVudHMpO3JldHVybiB0PT09cz9kOnR9LGQuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0odD0rdCkqdCxkKTpNYXRoLnNxcnQoaCl9LGR9LHQuZHJhZ0Rpc2FibGU9WHQsdC5kcmFnRW5hYmxlPUd0LHQuZHN2Rm9ybWF0PUVvLHQuY3N2UGFyc2U9Q28sdC5jc3ZQYXJzZVJvd3M9UG8sdC5jc3ZGb3JtYXQ9em8sdC5jc3ZGb3JtYXRSb3dzPVJvLHQudHN2UGFyc2U9RG8sdC50c3ZQYXJzZVJvd3M9VW8sdC50c3ZGb3JtYXQ9cW8sdC50c3ZGb3JtYXRSb3dzPU9vLHQuZWFzZUxpbmVhcj1mdW5jdGlvbih0KXtyZXR1cm4rdH0sdC5lYXNlUXVhZD1Ecix0LmVhc2VRdWFkSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdH0sdC5lYXNlUXVhZE91dD1mdW5jdGlvbih0KXtyZXR1cm4gdCooMi10KX0sdC5lYXNlUXVhZEluT3V0PURyLHQuZWFzZUN1YmljPVVyLHQuZWFzZUN1YmljSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0fSx0LmVhc2VDdWJpY091dD1mdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LHQuZWFzZUN1YmljSW5PdXQ9VXIsdC5lYXNlUG9seT1Zcix0LmVhc2VQb2x5SW49cXIsdC5lYXNlUG9seU91dD1Pcix0LmVhc2VQb2x5SW5PdXQ9WXIsdC5lYXNlU2luPUlyLHQuZWFzZVNpbkluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguY29zKHQqRnIpfSx0LmVhc2VTaW5PdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqRnIpfSx0LmVhc2VTaW5Jbk91dD1Jcix0LmVhc2VFeHA9SHIsdC5lYXNlRXhwSW49ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqdC0xMCl9LHQuZWFzZUV4cE91dD1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnBvdygyLC0xMCp0KX0sdC5lYXNlRXhwSW5PdXQ9SHIsdC5lYXNlQ2lyY2xlPWpyLHQuZWFzZUNpcmNsZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9LHQuZWFzZUNpcmNsZU91dD1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX0sdC5lYXNlQ2lyY2xlSW5PdXQ9anIsdC5lYXNlQm91bmNlPW5pLHQuZWFzZUJvdW5jZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLW5pKDEtdCl9LHQuZWFzZUJvdW5jZU91dD1uaSx0LmVhc2VCb3VuY2VJbk91dD1mdW5jdGlvbih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtbmkoMS10KTpuaSh0LTEpKzEpLzJ9LHQuZWFzZUJhY2s9aWksdC5lYXNlQmFja0luPWVpLHQuZWFzZUJhY2tPdXQ9cmksdC5lYXNlQmFja0luT3V0PWlpLHQuZWFzZUVsYXN0aWM9dWksdC5lYXNlRWxhc3RpY0luPWFpLHQuZWFzZUVsYXN0aWNPdXQ9dWksdC5lYXNlRWxhc3RpY0luT3V0PWZpLHQuYmxvYj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oWW8pfSx0LmJ1ZmZlcj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oQm8pfSx0LmRzdj1mdW5jdGlvbih0LG4sZSxyKXszPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApO3ZhciBpPUVvKHQpO3JldHVybiBJbyhuLGUpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGkucGFyc2UodCxyKX0pfSx0LmNzdj1qbyx0LnRzdj1Ybyx0LmltYWdlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscil7dmFyIGk9bmV3IEltYWdlO2Zvcih2YXIgbyBpbiBuKWlbb109bltvXTtpLm9uZXJyb3I9cixpLm9ubG9hZD1mdW5jdGlvbigpe2UoaSl9LGkuc3JjPXR9KX0sdC5qc29uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZldGNoKHQsbikudGhlbihHbyl9LHQudGV4dD1Jbyx0LnhtbD0kbyx0Lmh0bWw9V28sdC5zdmc9Wm8sdC5mb3JjZUNlbnRlcj1mdW5jdGlvbih0LG4pe3ZhciBlO2Z1bmN0aW9uIHIoKXt2YXIgcixpLG89ZS5sZW5ndGgsYT0wLHU9MDtmb3Iocj0wO3I8bzsrK3IpYSs9KGk9ZVtyXSkueCx1Kz1pLnk7Zm9yKGE9YS9vLXQsdT11L28tbixyPTA7cjxvOysrcikoaT1lW3JdKS54LT1hLGkueS09dX1yZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09biYmKG49MCksci5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dH0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxyKTpufSxyfSx0LmZvcmNlQ29sbGlkZT1mdW5jdGlvbih0KXt2YXIgbixlLHI9MSxpPTE7ZnVuY3Rpb24gbygpe2Zvcih2YXIgdCxvLHUsZixjLHMsbCxoPW4ubGVuZ3RoLGQ9MDtkPGk7KytkKWZvcihvPXJhKG4sdWEsZmEpLnZpc2l0QWZ0ZXIoYSksdD0wO3Q8aDsrK3QpdT1uW3RdLHM9ZVt1LmluZGV4XSxsPXMqcyxmPXUueCt1LnZ4LGM9dS55K3Uudnksby52aXNpdChwKTtmdW5jdGlvbiBwKHQsbixlLGksbyl7dmFyIGE9dC5kYXRhLGg9dC5yLGQ9cytoO2lmKCFhKXJldHVybiBuPmYrZHx8aTxmLWR8fGU+YytkfHxvPGMtZDtpZihhLmluZGV4PnUuaW5kZXgpe3ZhciBwPWYtYS54LWEudngsdj1jLWEueS1hLnZ5LGc9cCpwK3YqdjtnPGQqZCYmKDA9PT1wJiYoZys9KHA9Sm8oKSkqcCksMD09PXYmJihnKz0odj1KbygpKSp2KSxnPShkLShnPU1hdGguc3FydChnKSkpL2cqcix1LnZ4Kz0ocCo9ZykqKGQ9KGgqPWgpLyhsK2gpKSx1LnZ5Kz0odio9ZykqZCxhLnZ4LT1wKihkPTEtZCksYS52eS09dipkKX19fWZ1bmN0aW9uIGEodCl7aWYodC5kYXRhKXJldHVybiB0LnI9ZVt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgbj10LnI9MDtuPDQ7KytuKXRbbl0mJnRbbl0ucj50LnImJih0LnI9dFtuXS5yKX1mdW5jdGlvbiB1KCl7aWYobil7dmFyIHIsaSxvPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShvKSxyPTA7cjxvOysrcilpPW5bcl0sZVtpLmluZGV4XT0rdChpLHIsbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzE6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LHUoKX0sby5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG8pOml9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbyk6cn0sby5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksdSgpLG8pOnR9LG99LHQuZm9yY2VMaW5rPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sYT1jYSx1PWZ1bmN0aW9uKHQpe3JldHVybiAxL01hdGgubWluKGlbdC5zb3VyY2UuaW5kZXhdLGlbdC50YXJnZXQuaW5kZXhdKX0sZj1RbygzMCksYz0xO2Z1bmN0aW9uIHMocil7Zm9yKHZhciBpPTAsYT10Lmxlbmd0aDtpPGM7KytpKWZvcih2YXIgdSxmLHMsbCxoLGQscCx2PTA7djxhOysrdilmPSh1PXRbdl0pLnNvdXJjZSxsPShzPXUudGFyZ2V0KS54K3MudngtZi54LWYudnh8fEpvKCksaD1zLnkrcy52eS1mLnktZi52eXx8Sm8oKSxsKj1kPSgoZD1NYXRoLnNxcnQobCpsK2gqaCkpLWVbdl0pL2QqcipuW3ZdLGgqPWQscy52eC09bCoocD1vW3ZdKSxzLnZ5LT1oKnAsZi52eCs9bCoocD0xLXApLGYudnkrPWgqcH1mdW5jdGlvbiBsKCl7aWYocil7dmFyIHUsZixjPXIubGVuZ3RoLHM9dC5sZW5ndGgsbD1LaShyLGEpO2Zvcih1PTAsaT1uZXcgQXJyYXkoYyk7dTxzOysrdSkoZj10W3VdKS5pbmRleD11LCJvYmplY3QiIT10eXBlb2YgZi5zb3VyY2UmJihmLnNvdXJjZT1zYShsLGYuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBmLnRhcmdldCYmKGYudGFyZ2V0PXNhKGwsZi50YXJnZXQpKSxpW2Yuc291cmNlLmluZGV4XT0oaVtmLnNvdXJjZS5pbmRleF18fDApKzEsaVtmLnRhcmdldC5pbmRleF09KGlbZi50YXJnZXQuaW5kZXhdfHwwKSsxO2Zvcih1PTAsbz1uZXcgQXJyYXkocyk7dTxzOysrdSlmPXRbdV0sb1t1XT1pW2Yuc291cmNlLmluZGV4XS8oaVtmLnNvdXJjZS5pbmRleF0raVtmLnRhcmdldC5pbmRleF0pO249bmV3IEFycmF5KHMpLGgoKSxlPW5ldyBBcnJheShzKSxkKCl9fWZ1bmN0aW9uIGgoKXtpZihyKWZvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpOysrZSluW2VdPSt1KHRbZV0sZSx0KX1mdW5jdGlvbiBkKCl7aWYocilmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTsrK24pZVtuXT0rZih0W25dLG4sdCl9cmV0dXJuIG51bGw9PXQmJih0PVtdKSxzLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGwoKX0scy5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGwoKSxzKTp0fSxzLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQscyk6YX0scy5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LHMpOmN9LHMuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksaCgpLHMpOnV9LHMuZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksZCgpLHMpOmZ9LHN9LHQuZm9yY2VNYW55Qm9keT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGk9UW8oLTMwKSxvPTEsYT0xLzAsdT0uODE7ZnVuY3Rpb24gZihyKXt2YXIgaSxvPXQubGVuZ3RoLGE9cmEodCxsYSxoYSkudmlzaXRBZnRlcihzKTtmb3IoZT1yLGk9MDtpPG87KytpKW49dFtpXSxhLnZpc2l0KGwpfWZ1bmN0aW9uIGMoKXtpZih0KXt2YXIgbixlLG89dC5sZW5ndGg7Zm9yKHI9bmV3IEFycmF5KG8pLG49MDtuPG87KytuKWU9dFtuXSxyW2UuaW5kZXhdPStpKGUsbix0KX19ZnVuY3Rpb24gcyh0KXt2YXIgbixlLGksbyxhLHU9MCxmPTA7aWYodC5sZW5ndGgpe2ZvcihpPW89YT0wO2E8NDsrK2EpKG49dFthXSkmJihlPU1hdGguYWJzKG4udmFsdWUpKSYmKHUrPW4udmFsdWUsZis9ZSxpKz1lKm4ueCxvKz1lKm4ueSk7dC54PWkvZix0Lnk9by9mfWVsc2V7KG49dCkueD1uLmRhdGEueCxuLnk9bi5kYXRhLnk7ZG97dSs9cltuLmRhdGEuaW5kZXhdfXdoaWxlKG49bi5uZXh0KX10LnZhbHVlPXV9ZnVuY3Rpb24gbCh0LGksZixjKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgcz10Lngtbi54LGw9dC55LW4ueSxoPWMtaSxkPXMqcytsKmw7aWYoaCpoL3U8ZClyZXR1cm4gZDxhJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpLG4udngrPXMqdC52YWx1ZSplL2Qsbi52eSs9bCp0LnZhbHVlKmUvZCksITA7aWYoISh0Lmxlbmd0aHx8ZD49YSkpeyh0LmRhdGEhPT1ufHx0Lm5leHQpJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpKTtkb3t0LmRhdGEhPT1uJiYoaD1yW3QuZGF0YS5pbmRleF0qZS9kLG4udngrPXMqaCxuLnZ5Kz1sKmgpfXdoaWxlKHQ9dC5uZXh0KX19cmV0dXJuIGYuaW5pdGlhbGl6ZT1mdW5jdGlvbihuKXt0PW4sYygpfSxmLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGMoKSxmKTppfSxmLmRpc3RhbmNlTWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQqdCxmKTpNYXRoLnNxcnQobyl9LGYuZGlzdGFuY2VNYXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGYpOk1hdGguc3FydChhKX0sZi50aGV0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10KnQsZik6TWF0aC5zcXJ0KHUpfSxmfSx0LmZvcmNlUmFkaWFsPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYT1RbyguMSk7ZnVuY3Rpb24gdSh0KXtmb3IodmFyIGE9MCx1PXIubGVuZ3RoO2E8dTsrK2Epe3ZhciBmPXJbYV0sYz1mLngtbnx8MWUtNixzPWYueS1lfHwxZS02LGw9TWF0aC5zcXJ0KGMqYytzKnMpLGg9KG9bYV0tbCkqaVthXSp0L2w7Zi52eCs9YypoLGYudnkrPXMqaH19ZnVuY3Rpb24gZigpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKW9bbl09K3QocltuXSxuLHIpLGlbbl09aXNOYU4ob1tuXSk/MDorYShyW25dLG4scil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbygrdCkpLG51bGw9PW4mJihuPTApLG51bGw9PWUmJihlPTApLHUuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZigpfSx1LnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGYoKSx1KTphfSx1LnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlFvKCtuKSxmKCksdSk6dH0sdS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHUpOm59LHUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCx1KTplfSx1fSx0LmZvcmNlU2ltdWxhdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlPTEscj0uMDAxLGk9MS1NYXRoLnBvdyhyLDEvMzAwKSxvPTAsYT0uNix1PUtpKCksZj11cihzKSxjPUkoInRpY2siLCJlbmQiKTtmdW5jdGlvbiBzKCl7bCgpLGMuY2FsbCgidGljayIsbiksZTxyJiYoZi5zdG9wKCksYy5jYWxsKCJlbmQiLG4pKX1mdW5jdGlvbiBsKCl7dmFyIG4scixmPXQubGVuZ3RoO2ZvcihlKz0oby1lKSppLHUuZWFjaChmdW5jdGlvbih0KXt0KGUpfSksbj0wO248ZjsrK24pbnVsbD09KHI9dFtuXSkuZng/ci54Kz1yLnZ4Kj1hOihyLng9ci5meCxyLnZ4PTApLG51bGw9PXIuZnk/ci55Kz1yLnZ5Kj1hOihyLnk9ci5meSxyLnZ5PTApfWZ1bmN0aW9uIGgoKXtmb3IodmFyIG4sZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl7aWYoKG49dFtlXSkuaW5kZXg9ZSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT1kYSpNYXRoLnNxcnQoZSksbz1lKnBhO24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBkKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0KSxufXJldHVybiBudWxsPT10JiYodD1bXSksaCgpLG49e3RpY2s6bCxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIGYucmVzdGFydChzKSxufSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGYuc3RvcCgpLG59LG5vZGVzOmZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsaCgpLHUuZWFjaChkKSxuKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxuKTplfSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOitpfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxuKTpvfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPTEtdCxuKToxLWF9LGZvcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09ZT91LnJlbW92ZSh0KTp1LnNldCh0LGQoZSkpLG4pOnUuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLGEsdSxmLGM9MCxzPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIsYz0wO2M8czsrK2MpKGE9KGk9bi0odT10W2NdKS54KSppKyhvPWUtdS55KSpvKTxyJiYoZj11LHI9YSk7cmV0dXJuIGZ9LG9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oYy5vbih0LGUpLG4pOmMub24odCl9fX0sdC5mb3JjZVg9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGk9UW8oLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciBpLG89MCxhPW4ubGVuZ3RoO288YTsrK28pKGk9bltvXSkudngrPShyW29dLWkueCkqZVtvXSp0fWZ1bmN0aW9uIGEoKXtpZihuKXt2YXIgbyxhPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKSxyPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyllW29dPWlzTmFOKHJbb109K3QobltvXSxvLG4pKT8wOitpKG5bb10sbyxuKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVFvKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGEoKSxvKTppfSxvLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksYSgpLG8pOnR9LG99LHQuZm9yY2VZPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVFvKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ5Kz0ocltvXS1pLnkpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxhKCksbyk6aX0sby55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLGEoKSxvKTp0fSxvfSx0LmZvcm1hdERlZmF1bHRMb2NhbGU9U2EsdC5mb3JtYXRMb2NhbGU9TmEsdC5mb3JtYXRTcGVjaWZpZXI9YmEsdC5wcmVjaXNpb25GaXhlZD1FYSx0LnByZWNpc2lvblByZWZpeD1rYSx0LnByZWNpc2lvblJvdW5kPUNhLHQuZ2VvQXJlYT1mdW5jdGlvbih0KXtyZXR1cm4geXUucmVzZXQoKSxzdSh0LF91KSwyKnl1fSx0Lmdlb0JvdW5kcz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGEsdTtpZihSdT16dT0tKEN1PVB1PTEvMCksT3U9W10sc3UodCxyZiksZT1PdS5sZW5ndGgpe2ZvcihPdS5zb3J0KGRmKSxuPTEsbz1bcj1PdVswXV07bjxlOysrbilwZihyLChpPU91W25dKVswXSl8fHBmKHIsaVsxXSk/KGhmKHJbMF0saVsxXSk+aGYoclswXSxyWzFdKSYmKHJbMV09aVsxXSksaGYoaVswXSxyWzFdKT5oZihyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKGE9LTEvMCxuPTAscj1vW2U9by5sZW5ndGgtMV07bjw9ZTtyPWksKytuKWk9b1tuXSwodT1oZihyWzFdLGlbMF0pKT5hJiYoYT11LEN1PWlbMF0senU9clsxXSl9cmV0dXJuIE91PVl1PW51bGwsQ3U9PT0xLzB8fFB1PT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW0N1LFB1XSxbenUsUnVdXX0sdC5nZW9DZW50cm9pZD1mdW5jdGlvbih0KXtCdT1GdT1JdT1IdT1qdT1YdT1HdT1WdT0kdT1XdT1adT0wLHN1KHQsdmYpO3ZhciBuPSR1LGU9V3Uscj1adSxpPW4qbitlKmUrcipyO3JldHVybiBpPFVhJiYobj1YdSxlPUd1LHI9VnUsRnU8RGEmJihuPUl1LGU9SHUscj1qdSksKGk9bipuK2UqZStyKnIpPFVhKT9bTmFOLE5hTl06W1hhKGUsbikqRmEsZXUoci9LYShpKSkqRmFdfSx0Lmdlb0NpcmNsZT1mdW5jdGlvbigpe3ZhciB0LG4sZT1OZihbMCwwXSkscj1OZig5MCksaT1OZig2KSxvPXtwb2ludDpmdW5jdGlvbihlLHIpe3QucHVzaChlPW4oZSxyKSksZVswXSo9RmEsZVsxXSo9RmF9fTtmdW5jdGlvbiBhKCl7dmFyIGE9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpJYSxmPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKklhO3JldHVybiB0PVtdLG49a2YoLWFbMF0qSWEsLWFbMV0qSWEsMCkuaW52ZXJ0LExmKG8sdSxmLDEpLGE9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOlt0XX0sdD1uPW51bGwsYX1yZXR1cm4gYS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZihbK3RbMF0sK3RbMV1dKSxhKTplfSxhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTpyfSxhLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTppfSxhfSx0Lmdlb0NsaXBBbnRpbWVyaWRpYW49R2YsdC5nZW9DbGlwQ2lyY2xlPVZmLHQuZ2VvQ2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPTAsaT0wLG89OTYwLGE9NTAwO3JldHVybiBlPXtzdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIHQmJm49PT1lP3Q6dD1aZihyLGksbyxhKShuPWUpfSxleHRlbnQ6ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3VbMF1bMF0saT0rdVswXVsxXSxvPSt1WzFdWzBdLGE9K3VbMV1bMV0sdD1uPW51bGwsZSk6W1tyLGldLFtvLGFdXX19fSx0Lmdlb0NsaXBSZWN0YW5nbGU9WmYsdC5nZW9Db250YWlucz1mdW5jdGlvbih0LG4pe3JldHVybih0JiZjYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP2NjW3QudHlwZV06bGMpKHQsbil9LHQuZ2VvRGlzdGFuY2U9ZmMsdC5nZW9HcmF0aWN1bGU9YmMsdC5nZW9HcmF0aWN1bGUxMD1mdW5jdGlvbigpe3JldHVybiBiYygpKCl9LHQuZ2VvSW50ZXJwb2xhdGU9ZnVuY3Rpb24odCxuKXt2YXIgZT10WzBdKklhLHI9dFsxXSpJYSxpPW5bMF0qSWEsbz1uWzFdKklhLGE9R2EociksdT1RYShyKSxmPUdhKG8pLGM9UWEobykscz1hKkdhKGUpLGw9YSpRYShlKSxoPWYqR2EoaSksZD1mKlFhKGkpLHA9MipldShLYShydShvLXIpK2EqZipydShpLWUpKSksdj1RYShwKSxnPXA/ZnVuY3Rpb24odCl7dmFyIG49UWEodCo9cCkvdixlPVFhKHAtdCkvdixyPWUqcytuKmgsaT1lKmwrbipkLG89ZSp1K24qYztyZXR1cm5bWGEoaSxyKSpGYSxYYShvLEthKHIqcitpKmkpKSpGYV19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqRmEscipGYV19O3JldHVybiBnLmRpc3RhbmNlPXAsZ30sdC5nZW9MZW5ndGg9b2MsdC5nZW9QYXRoPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPTQuNTtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJnIucG9pbnRSYWRpdXMoK2kuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxzdSh0LGUocikpKSxyLnJlc3VsdCgpfXJldHVybiBvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShTYykpLFNjLnJlc3VsdCgpfSxvLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShkcykpLGRzLnJlc3VsdCgpfSxvLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gc3UodCxlKFVjKSksVWMucmVzdWx0KCl9LG8uY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShaYykpLFpjLnJlc3VsdCgpfSxvLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09bj8odD1udWxsLG1jKToodD1uKS5zdHJlYW0sbyk6dH0sby5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/KG49bnVsbCxuZXcgZ3MpOm5ldyBhcyhuPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiBpJiZyLnBvaW50UmFkaXVzKGkpLG8pOm59LG8ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooci5wb2ludFJhZGl1cygrdCksK3QpLG8pOml9LG8ucHJvamVjdGlvbih0KS5jb250ZXh0KG4pfSx0Lmdlb0FsYmVycz1Ecyx0Lmdlb0FsYmVyc1VzYT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksbyxhPURzKCksdT1McygpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksZj1McygpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbih0LG4pe289W3Qsbl19fTtmdW5jdGlvbiBzKHQpe3ZhciBuPXRbMF0sYT10WzFdO3JldHVybiBvPW51bGwsZS5wb2ludChuLGEpLG98fChyLnBvaW50KG4sYSksbyl8fChpLnBvaW50KG4sYSksbyl9ZnVuY3Rpb24gbCgpe3JldHVybiB0PW49bnVsbCxzfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1hLnNjYWxlKCksZT1hLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND91Omk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/ZjphKS5pbnZlcnQodCl9LHMuc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OihyPVthLnN0cmVhbShuPWUpLHUuc3RyZWFtKGUpLGYuc3RyZWFtKGUpXSxpPXIubGVuZ3RoLHQ9e3BvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPS0xOysrZTxpOylyW2VdLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25FbmQoKX19KTt2YXIgcixpfSxzLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCksdS5wcmVjaXNpb24odCksZi5wcmVjaXNpb24odCksbCgpKTphLnByZWNpc2lvbigpfSxzLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHUuc2NhbGUoLjM1KnQpLGYuc2NhbGUodCkscy50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0scy50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIG49YS5zY2FsZSgpLG89K3RbMF0scz0rdFsxXTtyZXR1cm4gZT1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1Km4scy0uMjM4Km5dLFtvKy40NTUqbixzKy4yMzgqbl1dKS5zdHJlYW0oYykscj11LnRyYW5zbGF0ZShbby0uMzA3Km4scysuMjAxKm5dKS5jbGlwRXh0ZW50KFtbby0uNDI1Km4rRGEscysuMTIqbitEYV0sW28tLjIxNCpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxpPWYudHJhbnNsYXRlKFtvLS4yMDUqbixzKy4yMTIqbl0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqbitEYSxzKy4xNjYqbitEYV0sW28tLjExNSpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxsKCl9LHMuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKHMsdCxuKX0scy5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKHMsdCxuKX0scy5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhzLHQsbil9LHMuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKHMsdCxuKX0scy5zY2FsZSgxMDcwKX0sdC5nZW9BemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoT3MpLnNjYWxlKDEyNC43NSkuY2xpcEFuZ2xlKDE3OS45OTkpfSx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdz1Pcyx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIENzKFlzKS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnRSYXc9WXMsdC5nZW9Db25pY0NvbmZvcm1hbD1mdW5jdGlvbigpe3JldHVybiB6cyhIcykuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX0sdC5nZW9Db25pY0NvbmZvcm1hbFJhdz1Icyx0Lmdlb0NvbmljRXF1YWxBcmVhPUxzLHQuZ2VvQ29uaWNFcXVhbEFyZWFSYXc9UnMsdC5nZW9Db25pY0VxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHpzKFhzKS5zY2FsZSgxMzEuMTU0KS5jZW50ZXIoWzAsMTMuOTM4OV0pfSx0Lmdlb0NvbmljRXF1aWRpc3RhbnRSYXc9WHMsdC5nZW9FcXVhbEVhcnRoPWZ1bmN0aW9uKCl7cmV0dXJuIENzKFFzKS5zY2FsZSgxNzcuMTU4KX0sdC5nZW9FcXVhbEVhcnRoUmF3PVFzLHQuZ2VvRXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIENzKGpzKS5zY2FsZSgxNTIuNjMpfSx0Lmdlb0VxdWlyZWN0YW5ndWxhclJhdz1qcyx0Lmdlb0dub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKEpzKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSx0Lmdlb0dub21vbmljUmF3PUpzLHQuZ2VvSWRlbnRpdHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpLG8sYT0xLHU9MCxmPTAsYz0xLHM9MSxsPW1jLGg9bnVsbCxkPW1jO2Z1bmN0aW9uIHAoKXtyZXR1cm4gcj1pPW51bGwsb31yZXR1cm4gbz17c3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiByJiZpPT09dD9yOnI9bChkKGk9dCkpfSxwb3N0Y2xpcDpmdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1yLGg9dD1uPWU9bnVsbCxwKCkpOmR9LGNsaXBFeHRlbnQ6ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9bnVsbD09cj8oaD10PW49ZT1udWxsLG1jKTpaZihoPStyWzBdWzBdLHQ9K3JbMF1bMV0sbj0rclsxXVswXSxlPStyWzFdWzFdKSxwKCkpOm51bGw9PWg/bnVsbDpbW2gsdF0sW24sZV1dfSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcygoYT0rdCkqYyxhKnMsdSxmKSxwKCkpOmF9LHRyYW5zbGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSpzLHU9K3RbMF0sZj0rdFsxXSkscCgpKTpbdSxmXX0scmVmbGVjdFg6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSooYz10Py0xOjEpLGEqcyx1LGYpLHAoKSk6YzwwfSxyZWZsZWN0WTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSoocz10Py0xOjEpLHUsZikscCgpKTpzPDB9LGZpdEV4dGVudDpmdW5jdGlvbih0LG4pe3JldHVybiB4cyhvLHQsbil9LGZpdFNpemU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gd3Mobyx0LG4pfSxmaXRXaWR0aDpmdW5jdGlvbih0LG4pe3JldHVybiBNcyhvLHQsbil9LGZpdEhlaWdodDpmdW5jdGlvbih0LG4pe3JldHVybiBBcyhvLHQsbil9fX0sdC5nZW9Qcm9qZWN0aW9uPUNzLHQuZ2VvUHJvamVjdGlvbk11dGF0b3I9UHMsdC5nZW9NZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBGcyhCcykuc2NhbGUoOTYxL0JhKX0sdC5nZW9NZXJjYXRvclJhdz1Ccyx0Lmdlb05hdHVyYWxFYXJ0aDE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3ModGwpLnNjYWxlKDE3NS4yOTUpfSx0Lmdlb05hdHVyYWxFYXJ0aDFSYXc9dGwsdC5nZW9PcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MobmwpLnNjYWxlKDI0OS41KS5jbGlwQW5nbGUoOTArRGEpfSx0Lmdlb09ydGhvZ3JhcGhpY1Jhdz1ubCx0Lmdlb1N0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoZWwpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LHQuZ2VvU3RlcmVvZ3JhcGhpY1Jhdz1lbCx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3ZhciB0PUZzKHJsKSxuPXQuY2VudGVyLGU9dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oWy10WzFdLHRbMF1dKTpbKHQ9bigpKVsxXSwtdFswXV19LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKTpbKHQ9ZSgpKVswXSx0WzFdLHRbMl0tOTBdfSxlKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc9cmwsdC5nZW9Sb3RhdGlvbj1SZix0Lmdlb1N0cmVhbT1zdSx0Lmdlb1RyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOl9zKHQpfX0sdC5jbHVzdGVyPWZ1bmN0aW9uKCl7dmFyIHQ9aWwsbj0xLGU9MSxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYT0wO2kuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe3ZhciBlPW4uY2hpbGRyZW47ZT8obi54PWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZShvbCwwKS90Lmxlbmd0aH0oZSksbi55PWZ1bmN0aW9uKHQpe3JldHVybiAxK3QucmVkdWNlKGFsLDApfShlKSk6KG4ueD1vP2ErPXQobixvKTowLG4ueT0wLG89bil9KTt2YXIgdT1mdW5jdGlvbih0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bMF07cmV0dXJuIHR9KGkpLGY9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uW24ubGVuZ3RoLTFdO3JldHVybiB0fShpKSxjPXUueC10KHUsZikvMixzPWYueCt0KGYsdSkvMjtyZXR1cm4gaS5lYWNoQWZ0ZXIocj9mdW5jdGlvbih0KXt0Lng9KHQueC1pLngpKm4sdC55PShpLnktdC55KSplfTpmdW5jdGlvbih0KXt0Lng9KHQueC1jKS8ocy1jKSpuLHQueT0oMS0oaS55P3QueS9pLnk6MSkpKmV9KX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC5oaWVyYXJjaHk9ZmwsdC5wYWNrPWZ1bmN0aW9uKCl7dmFyIHQ9bnVsbCxuPTEsZT0xLHI9RWw7ZnVuY3Rpb24gaShpKXtyZXR1cm4gaS54PW4vMixpLnk9ZS8yLHQ/aS5lYWNoQmVmb3JlKFBsKHQpKS5lYWNoQWZ0ZXIoemwociwuNSkpLmVhY2hCZWZvcmUoUmwoMSkpOmkuZWFjaEJlZm9yZShQbChDbCkpLmVhY2hBZnRlcih6bChFbCwxKSkuZWFjaEFmdGVyKHpsKHIsaS5yL01hdGgubWluKG4sZSkpKS5lYWNoQmVmb3JlKFJsKE1hdGgubWluKG4sZSkvKDIqaS5yKSkpLGl9cmV0dXJuIGkucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PShlPW4pP251bGw6U2woZSksaSk6dDt2YXIgZX0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0WzBdLGU9K3RbMV0saSk6W24sZV19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtsKCt0KSxpKTpyfSxpfSx0LnBhY2tTaWJsaW5ncz1mdW5jdGlvbih0KXtyZXR1cm4gTmwodCksdH0sdC5wYWNrRW5jbG9zZT1wbCx0LnBhcnRpdGlvbj1mdW5jdGlvbigpe3ZhciB0PTEsbj0xLGU9MCxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG89aS5oZWlnaHQrMTtyZXR1cm4gaS54MD1pLnkwPWUsaS54MT10LGkueTE9bi9vLGkuZWFjaEJlZm9yZShmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihyKXtyLmNoaWxkcmVuJiZEbChyLHIueDAsdCooci5kZXB0aCsxKS9uLHIueDEsdCooci5kZXB0aCsyKS9uKTt2YXIgaT1yLngwLG89ci55MCxhPXIueDEtZSx1PXIueTEtZTthPGkmJihpPWE9KGkrYSkvMiksdTxvJiYobz11PShvK3UpLzIpLHIueDA9aSxyLnkwPW8sci54MT1hLHIueTE9dX19KG4sbykpLHImJmkuZWFjaEJlZm9yZShMbCksaX1yZXR1cm4gaS5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIXQsaSk6cn0saS5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlWzBdLG49K2VbMV0saSk6W3Qsbl19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxpKTplfSxpfSx0LnN0cmF0aWZ5PWZ1bmN0aW9uKCl7dmFyIHQ9WWwsbj1CbDtmdW5jdGlvbiBlKGUpe3ZhciByLGksbyxhLHUsZixjLHM9ZS5sZW5ndGgsbD1uZXcgQXJyYXkocyksaD17fTtmb3IoaT0wO2k8czsrK2kpcj1lW2ldLHU9bFtpXT1uZXcgaGwociksbnVsbCE9KGY9dChyLGksZSkpJiYoZis9IiIpJiYoaFtjPVVsKyh1LmlkPWYpXT1jIGluIGg/T2w6dSk7Zm9yKGk9MDtpPHM7KytpKWlmKHU9bFtpXSxudWxsIT0oZj1uKGVbaV0saSxlKSkmJihmKz0iIikpe2lmKCEoYT1oW1VsK2ZdKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrZik7aWYoYT09PU9sKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2YpO2EuY2hpbGRyZW4/YS5jaGlsZHJlbi5wdXNoKHUpOmEuY2hpbGRyZW49W3VdLHUucGFyZW50PWF9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPXV9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9cWwsby5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLXN9KS5lYWNoQmVmb3JlKGxsKSxvLnBhcmVudD1udWxsLHM+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99cmV0dXJuIGUuaWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9U2wobiksZSk6dH0sZS5wYXJlbnRJZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1TbCh0KSxlKTpufSxlfSx0LnRyZWU9ZnVuY3Rpb24oKXt2YXIgdD1GbCxuPTEsZT0xLHI9bnVsbDtmdW5jdGlvbiBpKGkpe3ZhciBmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHIsaSxvLGE9bmV3IEdsKHQsMCksdT1bYV07bj11LnBvcCgpOylpZihyPW4uXy5jaGlsZHJlbilmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkobz1yLmxlbmd0aCksaT1vLTE7aT49MDstLWkpdS5wdXNoKGU9bi5jaGlsZHJlbltpXT1uZXcgR2wocltpXSxpKSksZS5wYXJlbnQ9bjtyZXR1cm4oYS5wYXJlbnQ9bmV3IEdsKG51bGwsMCkpLmNoaWxkcmVuPVthXSxhfShpKTtpZihmLmVhY2hBZnRlcihvKSxmLnBhcmVudC5tPS1mLnosZi5lYWNoQmVmb3JlKGEpLHIpaS5lYWNoQmVmb3JlKHUpO2Vsc2V7dmFyIGM9aSxzPWksbD1pO2kuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8Yy54JiYoYz10KSx0Lng+cy54JiYocz10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9Yz09PXM/MTp0KGMscykvMixkPWgtYy54LHA9bi8ocy54K2grZCksdj1lLyhsLmRlcHRofHwxKTtpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrZCkqcCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIGl9ZnVuY3Rpb24gbyhuKXt2YXIgZT1uLmNoaWxkcmVuLHI9bi5wYXJlbnQuY2hpbGRyZW4saT1uLmk/cltuLmktMV06bnVsbDtpZihlKXshZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9KG4pO3ZhciBvPShlWzBdLnorZVtlLmxlbmd0aC0xXS56KS8yO2k/KG4uej1pLnordChuLl8saS5fKSxuLm09bi56LW8pOm4uej1vfWVsc2UgaSYmKG4uej1pLnordChuLl8saS5fKSk7bi5wYXJlbnQuQT1mdW5jdGlvbihuLGUscil7aWYoZSl7Zm9yKHZhciBpLG89bixhPW4sdT1lLGY9by5wYXJlbnQuY2hpbGRyZW5bMF0sYz1vLm0scz1hLm0sbD11Lm0saD1mLm07dT1IbCh1KSxvPUlsKG8pLHUmJm87KWY9SWwoZiksKGE9SGwoYSkpLmE9biwoaT11LnorbC1vLnotYyt0KHUuXyxvLl8pKT4wJiYoamwoWGwodSxuLHIpLG4saSksYys9aSxzKz1pKSxsKz11Lm0sYys9by5tLGgrPWYubSxzKz1hLm07dSYmIUhsKGEpJiYoYS50PXUsYS5tKz1sLXMpLG8mJiFJbChmKSYmKGYudD1vLGYubSs9Yy1oLHI9bil9cmV0dXJuIHJ9KG4saSxuLnBhcmVudC5BfHxyWzBdKX1mdW5jdGlvbiBhKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiB1KHQpe3QueCo9bix0Lnk9dC5kZXB0aCplfXJldHVybiBpLnNlcGFyYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITEsbj0rdFswXSxlPSt0WzFdLGkpOnI/bnVsbDpbbixlXX0saS5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMCxuPSt0WzBdLGU9K3RbMV0saSk6cj9bbixlXTpudWxsfSxpfSx0LnRyZWVtYXA9ZnVuY3Rpb24oKXt2YXIgdD1abCxuPSExLGU9MSxyPTEsaT1bMF0sbz1FbCxhPUVsLHU9RWwsZj1FbCxjPUVsO2Z1bmN0aW9uIHModCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9ZSx0LnkxPXIsdC5lYWNoQmVmb3JlKGwpLGk9WzBdLG4mJnQuZWFjaEJlZm9yZShMbCksdH1mdW5jdGlvbiBsKG4pe3ZhciBlPWlbbi5kZXB0aF0scj1uLngwK2Uscz1uLnkwK2UsbD1uLngxLWUsaD1uLnkxLWU7bDxyJiYocj1sPShyK2wpLzIpLGg8cyYmKHM9aD0ocytoKS8yKSxuLngwPXIsbi55MD1zLG4ueDE9bCxuLnkxPWgsbi5jaGlsZHJlbiYmKGU9aVtuLmRlcHRoKzFdPW8obikvMixyKz1jKG4pLWUscys9YShuKS1lLChsLT11KG4pLWUpPHImJihyPWw9KHIrbCkvMiksKGgtPWYobiktZSk8cyYmKHM9aD0ocytoKS8yKSx0KG4scixzLGwsaCkpfXJldHVybiBzLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSEhdCxzKTpufSxzLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxzKTpbZSxyXX0scy50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVNsKG4pLHMpOnR9LHMucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9zLnBhZGRpbmdJbm5lcih0KS5wYWRkaW5nT3V0ZXIodCk6cy5wYWRkaW5nSW5uZXIoKX0scy5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6b30scy5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nVG9wKHQpLnBhZGRpbmdSaWdodCh0KS5wYWRkaW5nQm90dG9tKHQpLnBhZGRpbmdMZWZ0KHQpOnMucGFkZGluZ1RvcCgpfSxzLnBhZGRpbmdUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6YX0scy5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6dX0scy5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmZ9LHMucGFkZGluZ0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6Y30sc30sdC50cmVlbWFwQmluYXJ5PWZ1bmN0aW9uKHQsbixlLHIsaSl7dmFyIG8sYSx1PXQuY2hpbGRyZW4sZj11Lmxlbmd0aCxjPW5ldyBBcnJheShmKzEpO2ZvcihjWzBdPWE9bz0wO288ZjsrK28pY1tvKzFdPWErPXVbb10udmFsdWU7IWZ1bmN0aW9uIHQobixlLHIsaSxvLGEsZil7aWYobj49ZS0xKXt2YXIgcz11W25dO3JldHVybiBzLngwPWkscy55MD1vLHMueDE9YSx2b2lkKHMueTE9Zil9Zm9yKHZhciBsPWNbbl0saD1yLzIrbCxkPW4rMSxwPWUtMTtkPHA7KXt2YXIgdj1kK3A+Pj4xO2Nbdl08aD9kPXYrMTpwPXZ9aC1jW2QtMV08Y1tkXS1oJiZuKzE8ZCYmLS1kO3ZhciBnPWNbZF0tbCx5PXItZztpZihhLWk+Zi1vKXt2YXIgXz0oaSp5K2EqZykvcjt0KG4sZCxnLGksbyxfLGYpLHQoZCxlLHksXyxvLGEsZil9ZWxzZXt2YXIgYj0obyp5K2YqZykvcjt0KG4sZCxnLGksbyxhLGIpLHQoZCxlLHksaSxiLGEsZil9fSgwLGYsdC52YWx1ZSxuLGUscixpKX0sdC50cmVlbWFwRGljZT1EbCx0LnRyZWVtYXBTbGljZT1WbCx0LnRyZWVtYXBTbGljZURpY2U9ZnVuY3Rpb24odCxuLGUscixpKXsoMSZ0LmRlcHRoP1ZsOkRsKSh0LG4sZSxyLGkpfSx0LnRyZWVtYXBTcXVhcmlmeT1abCx0LnRyZWVtYXBSZXNxdWFyaWZ5PVFsLHQuaW50ZXJwb2xhdGU9bWUsdC5pbnRlcnBvbGF0ZUFycmF5PWRlLHQuaW50ZXJwb2xhdGVCYXNpcz1lZSx0LmludGVycG9sYXRlQmFzaXNDbG9zZWQ9cmUsdC5pbnRlcnBvbGF0ZURhdGU9cGUsdC5pbnRlcnBvbGF0ZURpc2NyZXRlPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fSx0LmludGVycG9sYXRlSHVlPWZ1bmN0aW9uKHQsbil7dmFyIGU9YWUoK3QsK24pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1lKHQpO3JldHVybiBuLTM2MCpNYXRoLmZsb29yKG4vMzYwKX19LHQuaW50ZXJwb2xhdGVOdW1iZXI9dmUsdC5pbnRlcnBvbGF0ZU9iamVjdD1nZSx0LmludGVycG9sYXRlUm91bmQ9eGUsdC5pbnRlcnBvbGF0ZVN0cmluZz1iZSx0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPUNlLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9UGUsdC5pbnRlcnBvbGF0ZVpvb209cWUsdC5pbnRlcnBvbGF0ZVJnYj1jZSx0LmludGVycG9sYXRlUmdiQmFzaXM9bGUsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzQ2xvc2VkPWhlLHQuaW50ZXJwb2xhdGVIc2w9WWUsdC5pbnRlcnBvbGF0ZUhzbExvbmc9QmUsdC5pbnRlcnBvbGF0ZUxhYj1mdW5jdGlvbih0LG4pe3ZhciBlPWZlKCh0PVVuKHQpKS5sLChuPVVuKG4pKS5sKSxyPWZlKHQuYSxuLmEpLGk9ZmUodC5iLG4uYiksbz1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fSx0LmludGVycG9sYXRlSGNsPUllLHQuaW50ZXJwb2xhdGVIY2xMb25nPUhlLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXg9WGUsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc9R2UsdC5waWVjZXdpc2U9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoLTEsaT1uWzBdLG89bmV3IEFycmF5KHI8MD8wOnIpO2U8cjspb1tlXT10KGksaT1uWysrZV0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1NYXRoLm1heCgwLE1hdGgubWluKHItMSxNYXRoLmZsb29yKHQqPXIpKSk7cmV0dXJuIG9bbl0odC1uKX19LHQucXVhbnRpemU9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWVbcl09dChyLyhuLTEpKTtyZXR1cm4gZX0sdC5wYXRoPUdpLHQucG9seWdvbkFyZWE9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj10Lmxlbmd0aCxpPXRbci0xXSxvPTA7KytlPHI7KW49aSxpPXRbZV0sbys9blsxXSppWzBdLW5bMF0qaVsxXTtyZXR1cm4gby8yfSx0LnBvbHlnb25DZW50cm9pZD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz0wLGE9MCx1PXRbaS0xXSxmPTA7KytyPGk7KW49dSx1PXRbcl0sZis9ZT1uWzBdKnVbMV0tdVswXSpuWzFdLG8rPShuWzBdK3VbMF0pKmUsYSs9KG5bMV0rdVsxXSkqZTtyZXR1cm5bby8oZio9MyksYS9mXX0sdC5wb2x5Z29uSHVsbD1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KEpsKSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1LbChyKSxhPUtsKGkpLHU9YVswXT09PW9bMF0sZj1hW2EubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxjPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pYy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSt1O248YS5sZW5ndGgtZjsrK24pYy5wdXNoKHRbclthW25dXVsyXV0pO3JldHVybiBjfSx0LnBvbHlnb25Db250YWlucz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1uWzBdLHU9blsxXSxmPW9bMF0sYz1vWzFdLHM9ITEsbD0wO2w8aTsrK2wpZT0obz10W2xdKVswXSwocj1vWzFdKT51IT1jPnUmJmE8KGYtZSkqKHUtcikvKGMtcikrZSYmKHM9IXMpLGY9ZSxjPXI7cmV0dXJuIHN9LHQucG9seWdvbkxlbmd0aD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1vWzBdLHU9b1sxXSxmPTA7KytyPGk7KW49YSxlPXUsbi09YT0obz10W3JdKVswXSxlLT11PW9bMV0sZis9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBmfSx0LnF1YWR0cmVlPXJhLHQucmFuZG9tVW5pZm9ybT1uaCx0LnJhbmRvbU5vcm1hbD1laCx0LnJhbmRvbUxvZ05vcm1hbD1yaCx0LnJhbmRvbUJhdGVzPW9oLHQucmFuZG9tSXJ3aW5IYWxsPWloLHQucmFuZG9tRXhwb25lbnRpYWw9YWgsdC5zY2FsZUJhbmQ9aGgsdC5zY2FsZVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQobil7dmFyIGU9bi5jb3B5O3JldHVybiBuLnBhZGRpbmc9bi5wYWRkaW5nT3V0ZXIsZGVsZXRlIG4ucGFkZGluZ0lubmVyLGRlbGV0ZSBuLnBhZGRpbmdPdXRlcixuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlKCkpfSxufShoaCgpLnBhZGRpbmdJbm5lcigxKSl9LHQuc2NhbGVJZGVudGl0eT1mdW5jdGlvbiB0KCl7dmFyIG49WzAsMV07ZnVuY3Rpb24gZSh0KXtyZXR1cm4rdH1yZXR1cm4gZS5pbnZlcnQ9ZSxlLmRvbWFpbj1lLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWZoLmNhbGwodCxwaCksZSk6bi5zbGljZSgpfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKX0seGgoZSl9LHQuc2NhbGVMaW5lYXI9ZnVuY3Rpb24gdCgpe3ZhciBuPW1oKGdoLHZlKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKG4sdCgpKX0seGgobil9LHQuc2NhbGVMb2c9ZnVuY3Rpb24gbigpe3ZhciBlPW1oKE1oLEFoKS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz1TaCgxMCksYT1OaCgxMCk7ZnVuY3Rpb24gdSgpe3JldHVybiBvPVNoKGkpLGE9TmgoaSkscigpWzBdPDAmJihvPUVoKG8pLGE9RWgoYSkpLGV9cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCx1KCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLHUoKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLHU9ZVswXSxmPWVbZS5sZW5ndGgtMV07KG49Zjx1KSYmKGg9dSx1PWYsZj1oKTt2YXIgYyxzLGwsaD1vKHUpLGQ9byhmKSxwPW51bGw9PXQ/MTA6K3Qsdj1bXTtpZighKGklMSkmJmQtaDxwKXtpZihoPU1hdGgucm91bmQoaCktMSxkPU1hdGgucm91bmQoZCkrMSx1PjApe2Zvcig7aDxkOysraClmb3Iocz0xLGM9YShoKTtzPGk7KytzKWlmKCEoKGw9YypzKTx1KSl7aWYobD5mKWJyZWFrO3YucHVzaChsKX19ZWxzZSBmb3IoO2g8ZDsrK2gpZm9yKHM9aS0xLGM9YShoKTtzPj0xOy0tcylpZighKChsPWMqcyk8dSkpe2lmKGw+ZilicmVhazt2LnB1c2gobCl9fWVsc2Ugdj1tKGgsZCxNYXRoLm1pbihkLWgscCkpLm1hcChhKTtyZXR1cm4gbj92LnJldmVyc2UoKTp2fSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtpZihudWxsPT1yJiYocj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7bnVsbD09biYmKG49MTApO3ZhciB1PU1hdGgubWF4KDEsaSpuL2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10L2EoTWF0aC5yb3VuZChvKHQpKSk7cmV0dXJuIG4qaTxpLS41JiYobio9aSksbjw9dT9yKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHIod2gocigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmZsb29yKG8odCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmNlaWwobyh0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKGUsbigpLmJhc2UoaSkpfSxlfSx0LnNjYWxlT3JkaW5hbD1saCx0LnNjYWxlSW1wbGljaXQ9c2gsdC5zY2FsZVBvdz1DaCx0LnNjYWxlU3FydD1mdW5jdGlvbigpe3JldHVybiBDaCgpLmV4cG9uZW50KC41KX0sdC5zY2FsZVF1YW50aWxlPWZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxyPVtdLG89W107ZnVuY3Rpb24gYSgpe3ZhciB0PTAsbj1NYXRoLm1heCgxLHIubGVuZ3RoKTtmb3Iobz1uZXcgQXJyYXkobi0xKTsrK3Q8bjspb1t0LTFdPUEoZSx0L24pO3JldHVybiB1fWZ1bmN0aW9uIHUodCl7aWYoIWlzTmFOKHQ9K3QpKXJldHVybiByW2kobyx0KV19cmV0dXJuIHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpbbj4wP29bbi0xXTplWzBdLG48by5sZW5ndGg/b1tuXTplW2UubGVuZ3RoLTFdXX0sdS5kb21haW49ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdO2Zvcih2YXIgcixpPTAsbz10Lmxlbmd0aDtpPG87KytpKW51bGw9PShyPXRbaV0pfHxpc05hTihyPStyKXx8ZS5wdXNoKHIpO3JldHVybiBlLnNvcnQobiksYSgpfSx1LnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWNoLmNhbGwodCksYSgpKTpyLnNsaWNlKCl9LHUucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG8uc2xpY2UoKX0sdS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uocil9LHV9LHQuc2NhbGVRdWFudGl6ZT1mdW5jdGlvbiB0KCl7dmFyIG49MCxlPTEscj0xLG89Wy41XSxhPVswLDFdO2Z1bmN0aW9uIHUodCl7aWYodDw9dClyZXR1cm4gYVtpKG8sdCwwLHIpXX1mdW5jdGlvbiBmKCl7dmFyIHQ9LTE7Zm9yKG89bmV3IEFycmF5KHIpOysrdDxyOylvW3RdPSgodCsxKSplLSh0LXIpKm4pLyhyKzEpO3JldHVybiB1fXJldHVybiB1LmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxlPSt0WzFdLGYoKSk6W24sZV19LHUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9KGE9Y2guY2FsbCh0KSkubGVuZ3RoLTEsZigpKTphLnNsaWNlKCl9LHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBpPWEuaW5kZXhPZih0KTtyZXR1cm4gaTwwP1tOYU4sTmFOXTppPDE/W24sb1swXV06aT49cj9bb1tyLTFdLGVdOltvW2ktMV0sb1tpXV19LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKFtuLGVdKS5yYW5nZShhKX0seGgodSl9LHQuc2NhbGVUaHJlc2hvbGQ9ZnVuY3Rpb24gdCgpe3ZhciBuPVsuNV0sZT1bMCwxXSxyPTE7ZnVuY3Rpb24gbyh0KXtpZih0PD10KXJldHVybiBlW2kobix0LDAscildfXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1jaC5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksbyk6bi5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWNoLmNhbGwodCkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSxvKTplLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciByPWUuaW5kZXhPZih0KTtyZXR1cm5bbltyLTFdLG5bcl1dfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKS5yYW5nZShlKX0sb30sdC5zY2FsZVRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoY2QsdWQsVmgsamgsSWgsQmgsT2gsTGgsdC50aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDJlMywwLDEpLG5ldyBEYXRlKDJlMywwLDIpXSl9LHQuc2NhbGVVdGM9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoTGQsemQsX2QsdmQsZGQsbGQsT2gsTGgsdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMmUzLDAsMSksRGF0ZS5VVEMoMmUzLDAsMildKX0sdC5zY2FsZVNlcXVlbnRpYWw9ZnVuY3Rpb24gdChuKXt2YXIgZT0wLHI9MSxpPTEsbz0hMTtmdW5jdGlvbiBhKHQpe3ZhciByPSh0LWUpKmk7cmV0dXJuIG4obz9NYXRoLm1heCgwLE1hdGgubWluKDEscikpOnIpfXJldHVybiBhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLGk9ZT09PXI/MDoxLyhyLWUpLGEpOltlLHJdfSxhLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhdCxhKTpvfSxhLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihbZSxyXSkuY2xhbXAobyl9LHhoKGEpfSx0LnNjYWxlRGl2ZXJnaW5nPWZ1bmN0aW9uIHQobil7dmFyIGU9MCxyPS41LGk9MSxvPTEsYT0xLHU9ITE7ZnVuY3Rpb24gZih0KXt2YXIgZT0uNSsoKHQ9K3QpLXIpKih0PHI/bzphKTtyZXR1cm4gbih1P01hdGgubWF4KDAsTWF0aC5taW4oMSxlKSk6ZSl9cmV0dXJuIGYuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0saT0rdFsyXSxvPWU9PT1yPzA6LjUvKHItZSksYT1yPT09aT8wOi41LyhpLXIpLGYpOltlLHIsaV19LGYuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ISF0LGYpOnV9LGYuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZik6bn0sZi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQobikuZG9tYWluKFtlLHIsaV0pLmNsYW1wKHUpfSx4aChmKX0sdC5zY2hlbWVDYXRlZ29yeTEwPWx2LHQuc2NoZW1lQWNjZW50PWh2LHQuc2NoZW1lRGFyazI9ZHYsdC5zY2hlbWVQYWlyZWQ9cHYsdC5zY2hlbWVQYXN0ZWwxPXZ2LHQuc2NoZW1lUGFzdGVsMj1ndix0LnNjaGVtZVNldDE9eXYsdC5zY2hlbWVTZXQyPV92LHQuc2NoZW1lU2V0Mz1idix0LmludGVycG9sYXRlQnJCRz13dix0LnNjaGVtZUJyQkc9eHYsdC5pbnRlcnBvbGF0ZVBSR249QXYsdC5zY2hlbWVQUkduPU12LHQuaW50ZXJwb2xhdGVQaVlHPU52LHQuc2NoZW1lUGlZRz1Udix0LmludGVycG9sYXRlUHVPcj1Fdix0LnNjaGVtZVB1T3I9U3YsdC5pbnRlcnBvbGF0ZVJkQnU9Q3YsdC5zY2hlbWVSZEJ1PWt2LHQuaW50ZXJwb2xhdGVSZEd5PXp2LHQuc2NoZW1lUmRHeT1Qdix0LmludGVycG9sYXRlUmRZbEJ1PUx2LHQuc2NoZW1lUmRZbEJ1PVJ2LHQuaW50ZXJwb2xhdGVSZFlsR249VXYsdC5zY2hlbWVSZFlsR249RHYsdC5pbnRlcnBvbGF0ZVNwZWN0cmFsPU92LHQuc2NoZW1lU3BlY3RyYWw9cXYsdC5pbnRlcnBvbGF0ZUJ1R249QnYsdC5zY2hlbWVCdUduPVl2LHQuaW50ZXJwb2xhdGVCdVB1PUl2LHQuc2NoZW1lQnVQdT1Gdix0LmludGVycG9sYXRlR25CdT1qdix0LnNjaGVtZUduQnU9SHYsdC5pbnRlcnBvbGF0ZU9yUmQ9R3YsdC5zY2hlbWVPclJkPVh2LHQuaW50ZXJwb2xhdGVQdUJ1R249JHYsdC5zY2hlbWVQdUJ1R249VnYsdC5pbnRlcnBvbGF0ZVB1QnU9WnYsdC5zY2hlbWVQdUJ1PVd2LHQuaW50ZXJwb2xhdGVQdVJkPUp2LHQuc2NoZW1lUHVSZD1Rdix0LmludGVycG9sYXRlUmRQdT10Zyx0LnNjaGVtZVJkUHU9S3YsdC5pbnRlcnBvbGF0ZVlsR25CdT1lZyx0LnNjaGVtZVlsR25CdT1uZyx0LmludGVycG9sYXRlWWxHbj1pZyx0LnNjaGVtZVlsR249cmcsdC5pbnRlcnBvbGF0ZVlsT3JCcj1hZyx0LnNjaGVtZVlsT3JCcj1vZyx0LmludGVycG9sYXRlWWxPclJkPWZnLHQuc2NoZW1lWWxPclJkPXVnLHQuaW50ZXJwb2xhdGVCbHVlcz1zZyx0LnNjaGVtZUJsdWVzPWNnLHQuaW50ZXJwb2xhdGVHcmVlbnM9aGcsdC5zY2hlbWVHcmVlbnM9bGcsdC5pbnRlcnBvbGF0ZUdyZXlzPXBnLHQuc2NoZW1lR3JleXM9ZGcsdC5pbnRlcnBvbGF0ZVB1cnBsZXM9Z2csdC5zY2hlbWVQdXJwbGVzPXZnLHQuaW50ZXJwb2xhdGVSZWRzPV9nLHQuc2NoZW1lUmVkcz15Zyx0LmludGVycG9sYXRlT3Jhbmdlcz1tZyx0LnNjaGVtZU9yYW5nZXM9YmcsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ9eGcsdC5pbnRlcnBvbGF0ZVJhaW5ib3c9ZnVuY3Rpb24odCl7KHQ8MHx8dD4xKSYmKHQtPU1hdGguZmxvb3IodCkpO3ZhciBuPU1hdGguYWJzKHQtLjUpO3JldHVybiBBZy5oPTM2MCp0LTEwMCxBZy5zPTEuNS0xLjUqbixBZy5sPS44LS45Km4sQWcrIiJ9LHQuaW50ZXJwb2xhdGVXYXJtPXdnLHQuaW50ZXJwb2xhdGVDb29sPU1nLHQuaW50ZXJwb2xhdGVTaW5lYm93PWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0PSguNS10KSpNYXRoLlBJLFRnLnI9MjU1KihuPU1hdGguc2luKHQpKSpuLFRnLmc9MjU1KihuPU1hdGguc2luKHQrTmcpKSpuLFRnLmI9MjU1KihuPU1hdGguc2luKHQrU2cpKSpuLFRnKyIifSx0LmludGVycG9sYXRlVmlyaWRpcz1rZyx0LmludGVycG9sYXRlTWFnbWE9Q2csdC5pbnRlcnBvbGF0ZUluZmVybm89UGcsdC5pbnRlcnBvbGF0ZVBsYXNtYT16Zyx0LmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gRHQoVyh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSx0LmNyZWF0b3I9Vyx0LmxvY2FsPXF0LHQubWF0Y2hlcj1ydCx0Lm1vdXNlPUZ0LHQubmFtZXNwYWNlPSQsdC5uYW1lc3BhY2VzPVYsdC5jbGllbnRQb2ludD1CdCx0LnNlbGVjdD1EdCx0LnNlbGVjdEFsbD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFJ0KFtudWxsPT10P1tdOnRdLHp0KX0sdC5zZWxlY3Rpb249THQsdC5zZWxlY3Rvcj1RLHQuc2VsZWN0b3JBbGw9Syx0LnN0eWxlPWx0LHQudG91Y2g9SXQsdC50b3VjaGVzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49WXQoKS50b3VjaGVzKTtmb3IodmFyIGU9MCxyPW4/bi5sZW5ndGg6MCxpPW5ldyBBcnJheShyKTtlPHI7KytlKWlbZV09QnQodCxuW2VdKTtyZXR1cm4gaX0sdC53aW5kb3c9c3QsdC5jdXN0b21FdmVudD1DdCx0LmFyYz1mdW5jdGlvbigpe3ZhciB0PUdnLG49VmcsZT1SZygwKSxyPW51bGwsaT0kZyxvPVdnLGE9WmcsdT1udWxsO2Z1bmN0aW9uIGYoKXt2YXIgZixjLHMsbD0rdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1IZyxwPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLUhnLHY9TGcocC1kKSxnPXA+ZDtpZih1fHwodT1mPUdpKCkpLGg8bCYmKGM9aCxoPWwsbD1jKSxoPkZnKWlmKHY+amctRmcpdS5tb3ZlVG8oaCpVZyhkKSxoKllnKGQpKSx1LmFyYygwLDAsaCxkLHAsIWcpLGw+RmcmJih1Lm1vdmVUbyhsKlVnKHApLGwqWWcocCkpLHUuYXJjKDAsMCxsLHAsZCxnKSk7ZWxzZXt2YXIgeSxfLGI9ZCxtPXAseD1kLHc9cCxNPXYsQT12LFQ9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixOPVQ+RmcmJihyPytyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpCZyhsKmwraCpoKSksUz1PZyhMZyhoLWwpLzIsK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxFPVMsaz1TO2lmKE4+Rmcpe3ZhciBDPVhnKE4vbCpZZyhUKSksUD1YZyhOL2gqWWcoVCkpOyhNLT0yKkMpPkZnPyh4Kz1DKj1nPzE6LTEsdy09Qyk6KE09MCx4PXc9KGQrcCkvMiksKEEtPTIqUCk+Rmc/KGIrPVAqPWc/MTotMSxtLT1QKTooQT0wLGI9bT0oZCtwKS8yKX12YXIgej1oKlVnKGIpLFI9aCpZZyhiKSxMPWwqVWcodyksRD1sKllnKHcpO2lmKFM+Rmcpe3ZhciBVPWgqVWcobSkscT1oKllnKG0pLE89bCpVZyh4KSxZPWwqWWcoeCk7aWYodjxJZyl7dmFyIEI9TT5GZz9mdW5jdGlvbih0LG4sZSxyLGksbyxhLHUpe3ZhciBmPWUtdCxjPXItbixzPWEtaSxsPXUtbyxoPShzKihuLW8pLWwqKHQtaSkpLyhsKmYtcypjKTtyZXR1cm5bdCtoKmYsbitoKmNdfSh6LFIsTyxZLFUscSxMLEQpOltMLERdLEY9ei1CWzBdLEk9Ui1CWzFdLEg9VS1CWzBdLGo9cS1CWzFdLFg9MS9ZZygoKHM9KEYqSCtJKmopLyhCZyhGKkYrSSpJKSpCZyhIKkgraipqKSkpPjE/MDpzPC0xP0lnOk1hdGguYWNvcyhzKSkvMiksRz1CZyhCWzBdKkJbMF0rQlsxXSpCWzFdKTtFPU9nKFMsKGwtRykvKFgtMSkpLGs9T2coUywoaC1HKS8oWCsxKSl9fUE+Rmc/az5GZz8oeT1RZyhPLFkseixSLGgsayxnKSxfPVFnKFUscSxMLEQsaCxrLGcpLHUubW92ZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksazxTP3UuYXJjKHkuY3gseS5jeSxrLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksayxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsaCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksIWcpLHUuYXJjKF8uY3gsXy5jeSxrLERnKF8ueTExLF8ueDExKSxEZyhfLnkwMSxfLngwMSksIWcpKSk6KHUubW92ZVRvKHosUiksdS5hcmMoMCwwLGgsYixtLCFnKSk6dS5tb3ZlVG8oeixSKSxsPkZnJiZNPkZnP0U+Rmc/KHk9UWcoTCxELFUscSxsLC1FLGcpLF89UWcoeixSLE8sWSxsLC1FLGcpLHUubGluZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksRTxTP3UuYXJjKHkuY3gseS5jeSxFLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksRSxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsbCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksZyksdS5hcmMoXy5jeCxfLmN5LEUsRGcoXy55MTEsXy54MTEpLERnKF8ueTAxLF8ueDAxKSwhZykpKTp1LmFyYygwLDAsbCx3LHgsZyk6dS5saW5lVG8oTCxEKX1lbHNlIHUubW92ZVRvKDAsMCk7aWYodS5jbG9zZVBhdGgoKSxmKXJldHVybiB1PW51bGwsZisiInx8bnVsbH1yZXR1cm4gZi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBlPSgrdC5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgraS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1JZy8yO3JldHVybltVZyhyKSplLFlnKHIpKmVdfSxmLmlubmVyUmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6bn0sZi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6ZX0sZi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOnJ9LGYuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTppfSxmLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm99LGYucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6YX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PXQ/bnVsbDp0LGYpOnV9LGZ9LHQuYXJlYT1yeSx0LmxpbmU9ZXksdC5waWU9ZnVuY3Rpb24oKXt2YXIgdD1veSxuPWl5LGU9bnVsbCxyPVJnKDApLGk9UmcoamcpLG89UmcoMCk7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscyxsLGg9YS5sZW5ndGgsZD0wLHA9bmV3IEFycmF5KGgpLHY9bmV3IEFycmF5KGgpLGc9K3IuYXBwbHkodGhpcyxhcmd1bWVudHMpLHk9TWF0aC5taW4oamcsTWF0aC5tYXgoLWpnLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLWcpKSxfPU1hdGgubWluKE1hdGguYWJzKHkpL2gsby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGI9XyooeTwwPy0xOjEpO2Zvcih1PTA7dTxoOysrdSkobD12W3BbdV09dV09K3QoYVt1XSx1LGEpKT4wJiYoZCs9bCk7Zm9yKG51bGwhPW4/cC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odlt0XSx2W2VdKX0pOm51bGwhPWUmJnAuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBlKGFbdF0sYVtuXSl9KSx1PTAsYz1kPyh5LWgqYikvZDowO3U8aDsrK3UsZz1zKWY9cFt1XSxzPWcrKChsPXZbZl0pPjA/bCpjOjApK2IsdltmXT17ZGF0YTphW2ZdLGluZGV4OnUsdmFsdWU6bCxzdGFydEFuZ2xlOmcsZW5kQW5nbGU6cyxwYWRBbmdsZTpffTtyZXR1cm4gdn1yZXR1cm4gYS52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnNvcnRWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlPW51bGwsYSk6bn0sYS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbj1udWxsLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6b30sYX0sdC5hcmVhUmFkaWFsPWx5LHQucmFkaWFsQXJlYT1seSx0LmxpbmVSYWRpYWw9c3ksdC5yYWRpYWxMaW5lPXN5LHQucG9pbnRSYWRpYWw9aHksdC5saW5rSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiBneSh5eSl9LHQubGlua1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIGd5KF95KX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9Z3koYnkpO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHR9LHQuc3ltYm9sPWZ1bmN0aW9uKCl7dmFyIHQ9UmcobXkpLG49UmcoNjQpLGU9bnVsbDtmdW5jdGlvbiByKCl7dmFyIHI7aWYoZXx8KGU9cj1HaSgpKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKS5kcmF3KGUsK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxyKXJldHVybiBlPW51bGwscisiInx8bnVsbH1yZXR1cm4gci50eXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Umcobikscik6dH0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLHIpOm59LHIuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6dCxyKTplfSxyfSx0LnN5bWJvbHM9VXksdC5zeW1ib2xDaXJjbGU9bXksdC5zeW1ib2xDcm9zcz14eSx0LnN5bWJvbERpYW1vbmQ9QXksdC5zeW1ib2xTcXVhcmU9a3ksdC5zeW1ib2xTdGFyPUV5LHQuc3ltYm9sVHJpYW5nbGU9UHksdC5zeW1ib2xXeWU9RHksdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQnkodCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGeSh0KX0sdC5jdXJ2ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWXkodCl9LHQuY3VydmVCdW5kbGU9SHksdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPSR5LHQuY3VydmVDYXJkaW5hbE9wZW49WnksdC5jdXJ2ZUNhcmRpbmFsPUd5LHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPW5fLHQuY3VydmVDYXRtdWxsUm9tT3Blbj1yXyx0LmN1cnZlQ2F0bXVsbFJvbT1LeSx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaV8odCl9LHQuY3VydmVMaW5lYXI9S2csdC5jdXJ2ZU1vbm90b25lWD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGNfKHQpfSx0LmN1cnZlTW9ub3RvbmVZPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgc18odCl9LHQuY3VydmVOYXR1cmFsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaF8odCl9LHQuY3VydmVTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcF8odCwuNSl9LHQuY3VydmVTdGVwQWZ0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwXyh0LDEpfSx0LmN1cnZlU3RlcEJlZm9yZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBfKHQsMCl9LHQuc3RhY2s9ZnVuY3Rpb24oKXt2YXIgdD1SZyhbXSksbj1nXyxlPXZfLHI9eV87ZnVuY3Rpb24gaShpKXt2YXIgbyxhLHU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZj1pLmxlbmd0aCxjPXUubGVuZ3RoLHM9bmV3IEFycmF5KGMpO2ZvcihvPTA7bzxjOysrbyl7Zm9yKHZhciBsLGg9dVtvXSxkPXNbb109bmV3IEFycmF5KGYpLHA9MDtwPGY7KytwKWRbcF09bD1bMCwrcihpW3BdLGgscCxpKV0sbC5kYXRhPWlbcF07ZC5rZXk9aH1mb3Iobz0wLGE9bihzKTtvPGM7KytvKXNbYVtvXV0uaW5kZXg9bztyZXR1cm4gZShzLGEpLHN9cmV0dXJuIGkua2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKGR5LmNhbGwobikpLGkpOnR9LGkudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksaSk6cn0saS5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P2dfOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoZHkuY2FsbCh0KSksaSk6bn0saS5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD92Xzp0LGkpOmV9LGl9LHQuc3RhY2tPZmZzZXRFeHBhbmQ9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsYT10WzBdLmxlbmd0aDtvPGE7KytvKXtmb3IoaT1lPTA7ZTxyOysrZSlpKz10W2VdW29dWzFdfHwwO2lmKGkpZm9yKGU9MDtlPHI7KytlKXRbZV1bb11bMV0vPWl9dl8odCxuKX19LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigodT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG8sYSx1LGY9MCxjPXRbblswXV0ubGVuZ3RoO2Y8YzsrK2YpZm9yKG89YT0wLGU9MDtlPHU7KytlKShpPShyPXRbbltlXV1bZl0pWzFdLXJbMF0pPj0wPyhyWzBdPW8sclsxXT1vKz1pKTppPDA/KHJbMV09YSxyWzBdPWErPWkpOnJbMF09b30sdC5zdGFja09mZnNldE5vbmU9dl8sdC5zdGFja09mZnNldFNpbGhvdWV0dGU9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIGE9MCx1PTA7YTxlOysrYSl1Kz10W2FdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LXUvMn12Xyh0LG4pfX0sdC5zdGFja09mZnNldFdpZ2dsZT1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4wJiYocj0oZT10W25bMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9MTthPHI7KythKXtmb3IodmFyIHU9MCxmPTAsYz0wO3U8aTsrK3Upe2Zvcih2YXIgcz10W25bdV1dLGw9c1thXVsxXXx8MCxoPShsLShzW2EtMV1bMV18fDApKS8yLGQ9MDtkPHU7KytkKXt2YXIgcD10W25bZF1dO2grPShwW2FdWzFdfHwwKS0ocFthLTFdWzFdfHwwKX1mKz1sLGMrPWgqbH1lW2EtMV1bMV0rPWVbYS0xXVswXT1vLGYmJihvLT1jL2YpfWVbYS0xXVsxXSs9ZVthLTFdWzBdPW8sdl8odCxuKX19LHQuc3RhY2tPcmRlckFzY2VuZGluZz1fXyx0LnN0YWNrT3JkZXJEZXNjZW5kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBfXyh0KS5yZXZlcnNlKCl9LHQuc3RhY2tPcmRlckluc2lkZU91dD1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChiXyksbz1nXyh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLGE9MCx1PTAsZj1bXSxjPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sYTx1PyhhKz1pW2VdLGYucHVzaChlKSk6KHUrPWlbZV0sYy5wdXNoKGUpKTtyZXR1cm4gYy5yZXZlcnNlKCkuY29uY2F0KGYpfSx0LnN0YWNrT3JkZXJOb25lPWdfLHQuc3RhY2tPcmRlclJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGdfKHQpLnJldmVyc2UoKX0sdC50aW1lSW50ZXJ2YWw9UmgsdC50aW1lTWlsbGlzZWNvbmQ9TGgsdC50aW1lTWlsbGlzZWNvbmRzPURoLHQudXRjTWlsbGlzZWNvbmQ9TGgsdC51dGNNaWxsaXNlY29uZHM9RGgsdC50aW1lU2Vjb25kPU9oLHQudGltZVNlY29uZHM9WWgsdC51dGNTZWNvbmQ9T2gsdC51dGNTZWNvbmRzPVloLHQudGltZU1pbnV0ZT1CaCx0LnRpbWVNaW51dGVzPUZoLHQudGltZUhvdXI9SWgsdC50aW1lSG91cnM9SGgsdC50aW1lRGF5PWpoLHQudGltZURheXM9WGgsdC50aW1lV2Vlaz1WaCx0LnRpbWVXZWVrcz10ZCx0LnRpbWVTdW5kYXk9VmgsdC50aW1lU3VuZGF5cz10ZCx0LnRpbWVNb25kYXk9JGgsdC50aW1lTW9uZGF5cz1uZCx0LnRpbWVUdWVzZGF5PVdoLHQudGltZVR1ZXNkYXlzPWVkLHQudGltZVdlZG5lc2RheT1aaCx0LnRpbWVXZWRuZXNkYXlzPXJkLHQudGltZVRodXJzZGF5PVFoLHQudGltZVRodXJzZGF5cz1pZCx0LnRpbWVGcmlkYXk9SmgsdC50aW1lRnJpZGF5cz1vZCx0LnRpbWVTYXR1cmRheT1LaCx0LnRpbWVTYXR1cmRheXM9YWQsdC50aW1lTW9udGg9dWQsdC50aW1lTW9udGhzPWZkLHQudGltZVllYXI9Y2QsdC50aW1lWWVhcnM9c2QsdC51dGNNaW51dGU9bGQsdC51dGNNaW51dGVzPWhkLHQudXRjSG91cj1kZCx0LnV0Y0hvdXJzPXBkLHQudXRjRGF5PXZkLHQudXRjRGF5cz1nZCx0LnV0Y1dlZWs9X2QsdC51dGNXZWVrcz1UZCx0LnV0Y1N1bmRheT1fZCx0LnV0Y1N1bmRheXM9VGQsdC51dGNNb25kYXk9YmQsdC51dGNNb25kYXlzPU5kLHQudXRjVHVlc2RheT1tZCx0LnV0Y1R1ZXNkYXlzPVNkLHQudXRjV2VkbmVzZGF5PXhkLHQudXRjV2VkbmVzZGF5cz1FZCx0LnV0Y1RodXJzZGF5PXdkLHQudXRjVGh1cnNkYXlzPWtkLHQudXRjRnJpZGF5PU1kLHQudXRjRnJpZGF5cz1DZCx0LnV0Y1NhdHVyZGF5PUFkLHQudXRjU2F0dXJkYXlzPVBkLHQudXRjTW9udGg9emQsdC51dGNNb250aHM9UmQsdC51dGNZZWFyPUxkLHQudXRjWWVhcnM9RGQsdC50aW1lRm9ybWF0RGVmYXVsdExvY2FsZT1RcCx0LnRpbWVGb3JtYXRMb2NhbGU9WWQsdC5pc29Gb3JtYXQ9SnAsdC5pc29QYXJzZT1LcCx0Lm5vdz1pcix0LnRpbWVyPXVyLHQudGltZXJGbHVzaD1mcix0LnRpbWVvdXQ9aHIsdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IGFyLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/aXIoKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyhhKXthKz1pLHIucmVzdGFydChvLGkrPW4sZSksdChhKX0sbixlKSxyKX0sdC50cmFuc2l0aW9uPXpyLHQuYWN0aXZlPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpZm9yKHIgaW4gbj1udWxsPT1uP251bGw6bisiIixpKWlmKChlPWlbcl0pLnN0YXRlPmdyJiZlLm5hbWU9PT1uKXJldHVybiBuZXcgUHIoW1t0XV0sbGksbiwrcik7cmV0dXJuIG51bGx9LHQuaW50ZXJydXB0PU5yLHQudm9yb25vaT1mdW5jdGlvbigpe3ZhciB0PXhfLG49d18sZT1udWxsO2Z1bmN0aW9uIHIocil7cmV0dXJuIG5ldyBlYihyLm1hcChmdW5jdGlvbihlLGkpe3ZhciBvPVtNYXRoLnJvdW5kKHQoZSxpLHIpL0tfKSpLXyxNYXRoLnJvdW5kKG4oZSxpLHIpL0tfKSpLX107cmV0dXJuIG8uaW5kZXg9aSxvLmRhdGE9ZSxvfSksZSl9cmV0dXJuIHIucG9seWdvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkucG9seWdvbnMoKX0sci5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS5saW5rcygpfSxyLnRyaWFuZ2xlcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS50cmlhbmdsZXMoKX0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246bV8oK24pLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om1fKCt0KSxyKTpufSxyLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6W1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0scik6ZSYmW1tlWzBdWzBdLGVbMF1bMV1dLFtlWzFdWzBdLGVbMV1bMV1dXX0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDpbWzAsMF0sWyt0WzBdLCt0WzFdXV0scik6ZSYmW2VbMV1bMF0tZVswXVswXSxlWzFdWzFdLWVbMF1bMV1dfSxyfSx0Lnpvb209ZnVuY3Rpb24oKXt2YXIgbixlLHI9c2IsaT1sYixvPXZiLGE9ZGIsdT1wYixmPVswLDEvMF0sYz1bWy0xLzAsLTEvMF0sWzEvMCwxLzBdXSxzPTI1MCxsPXFlLGg9W10sZD1JKCJzdGFydCIsInpvb20iLCJlbmQiKSxwPTUwMCx2PTE1MCxnPTA7ZnVuY3Rpb24geSh0KXt0LnByb3BlcnR5KCJfX3pvb20iLGhiKS5vbigid2hlZWwuem9vbSIsQSkub24oIm1vdXNlZG93bi56b29tIixUKS5vbigiZGJsY2xpY2suem9vbSIsTikuZmlsdGVyKHUpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLFMpLm9uKCJ0b3VjaG1vdmUuem9vbSIsRSkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIsaykuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIF8odCxuKXtyZXR1cm4obj1NYXRoLm1heChmWzBdLE1hdGgubWluKGZbMV0sbikpKT09PXQuaz90Om5ldyBvYihuLHQueCx0LnkpfWZ1bmN0aW9uIGIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IG9iKHQuayxyLGkpfWZ1bmN0aW9uIG0odCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24geCh0LG4sZSl7dC5vbigic3RhcnQuem9vbSIsZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIixmdW5jdGlvbigpe3codGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oInpvb20iLGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dyh0aGlzLHQpLG89aS5hcHBseSh0aGlzLHQpLGE9ZXx8bShvKSx1PU1hdGgubWF4KG9bMV1bMF0tb1swXVswXSxvWzFdWzFdLW9bMF1bMV0pLGY9dGhpcy5fX3pvb20sYz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsdCk6bixzPWwoZi5pbnZlcnQoYSkuY29uY2F0KHUvZi5rKSxjLmludmVydChhKS5jb25jYXQodS9jLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1jO2Vsc2V7dmFyIG49cyh0KSxlPXUvblsyXTt0PW5ldyBvYihlLGFbMF0tblswXSplLGFbMV0tblsxXSplKX1yLnpvb20obnVsbCx0KX19KX1mdW5jdGlvbiB3KHQsbil7Zm9yKHZhciBlLHI9MCxpPWgubGVuZ3RoO3I8aTsrK3IpaWYoKGU9aFtyXSkudGhhdD09PXQpcmV0dXJuIGU7cmV0dXJuIG5ldyBNKHQsbil9ZnVuY3Rpb24gTSh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1pLmFwcGx5KHQsbil9ZnVuY3Rpb24gQSgpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD13KHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLGU9TWF0aC5tYXgoZlswXSxNYXRoLm1pbihmWzFdLG4uaypNYXRoLnBvdygyLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLGk9RnQodGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09aVswXSYmdC5tb3VzZVswXVsxXT09PWlbMV18fCh0Lm1vdXNlWzFdPW4uaW52ZXJ0KHQubW91c2VbMF09aSkpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKG4uaz09PWUpcmV0dXJuO3QubW91c2U9W2ksbi5pbnZlcnQoaSldLE5yKHRoaXMpLHQuc3RhcnQoKX1jYigpLHQud2hlZWw9c2V0VGltZW91dChmdW5jdGlvbigpe3Qud2hlZWw9bnVsbCx0LmVuZCgpfSx2KSx0Lnpvb20oIm1vdXNlIixvKGIoXyhuLGUpLHQubW91c2VbMF0sdC5tb3VzZVsxXSksdC5leHRlbnQsYykpfX1mdW5jdGlvbiBUKCl7aWYoIWUmJnIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj13KHRoaXMsYXJndW1lbnRzKSxpPUR0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS56b29tIixmdW5jdGlvbigpe2lmKGNiKCksIW4ubW92ZWQpe3ZhciBlPXQuZXZlbnQuY2xpZW50WC11LHI9dC5ldmVudC5jbGllbnRZLWY7bi5tb3ZlZD1lKmUrcipyPmd9bi56b29tKCJtb3VzZSIsbyhiKG4udGhhdC5fX3pvb20sbi5tb3VzZVswXT1GdChuLnRoYXQpLG4ubW91c2VbMV0pLG4uZXh0ZW50LGMpKX0sITApLm9uKCJtb3VzZXVwLnpvb20iLGZ1bmN0aW9uKCl7aS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsbi5tb3ZlZCksY2IoKSxuLmVuZCgpfSwhMCksYT1GdCh0aGlzKSx1PXQuZXZlbnQuY2xpZW50WCxmPXQuZXZlbnQuY2xpZW50WTtYdCh0LmV2ZW50LnZpZXcpLGZiKCksbi5tb3VzZT1bYSx0aGlzLl9fem9vbS5pbnZlcnQoYSldLE5yKHRoaXMpLG4uc3RhcnQoKX19ZnVuY3Rpb24gTigpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj10aGlzLl9fem9vbSxlPUZ0KHRoaXMpLGE9bi5pbnZlcnQoZSksdT1uLmsqKHQuZXZlbnQuc2hpZnRLZXk/LjU6MiksZj1vKGIoXyhuLHUpLGUsYSksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYyk7Y2IoKSxzPjA/RHQodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKHMpLmNhbGwoeCxmLGUpOkR0KHRoaXMpLmNhbGwoeS50cmFuc2Zvcm0sZil9fWZ1bmN0aW9uIFMoKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGUsaSxvLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYz1mLmxlbmd0aDtmb3IoZmIoKSxpPTA7aTxjOysraSlhPVthPUl0KHRoaXMsZiwobz1mW2ldKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQoYSksby5pZGVudGlmaWVyXSx1LnRvdWNoMD91LnRvdWNoMXx8KHUudG91Y2gxPWEpOih1LnRvdWNoMD1hLGU9ITApO2lmKG4mJihuPWNsZWFyVGltZW91dChuKSwhdS50b3VjaDEpKXJldHVybiB1LmVuZCgpLHZvaWQoKGE9RHQodGhpcykub24oImRibGNsaWNrLnpvb20iKSkmJmEuYXBwbHkodGhpcyxhcmd1bWVudHMpKTtlJiYobj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bj1udWxsfSxwKSxOcih0aGlzKSx1LnN0YXJ0KCkpfX1mdW5jdGlvbiBFKCl7dmFyIGUscixpLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMscz1mLmxlbmd0aDtmb3IoY2IoKSxuJiYobj1jbGVhclRpbWVvdXQobikpLGU9MDtlPHM7KytlKWk9SXQodGhpcyxmLChyPWZbZV0pLmlkZW50aWZpZXIpLHUudG91Y2gwJiZ1LnRvdWNoMFsyXT09PXIuaWRlbnRpZmllcj91LnRvdWNoMFswXT1pOnUudG91Y2gxJiZ1LnRvdWNoMVsyXT09PXIuaWRlbnRpZmllciYmKHUudG91Y2gxWzBdPWkpO2lmKHI9dS50aGF0Ll9fem9vbSx1LnRvdWNoMSl7dmFyIGw9dS50b3VjaDBbMF0saD11LnRvdWNoMFsxXSxkPXUudG91Y2gxWzBdLHA9dS50b3VjaDFbMV0sdj0odj1kWzBdLWxbMF0pKnYrKHY9ZFsxXS1sWzFdKSp2LGc9KGc9cFswXS1oWzBdKSpnKyhnPXBbMV0taFsxXSkqZztyPV8ocixNYXRoLnNxcnQodi9nKSksaT1bKGxbMF0rZFswXSkvMiwobFsxXStkWzFdKS8yXSxhPVsoaFswXStwWzBdKS8yLChoWzFdK3BbMV0pLzJdfWVsc2V7aWYoIXUudG91Y2gwKXJldHVybjtpPXUudG91Y2gwWzBdLGE9dS50b3VjaDBbMV19dS56b29tKCJ0b3VjaCIsbyhiKHIsaSxhKSx1LmV4dGVudCxjKSl9ZnVuY3Rpb24gaygpe3ZhciBuLHIsaT13KHRoaXMsYXJndW1lbnRzKSxvPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYT1vLmxlbmd0aDtmb3IoZmIoKSxlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSxwKSxuPTA7bjxhOysrbilyPW9bbl0saS50b3VjaDAmJmkudG91Y2gwWzJdPT09ci5pZGVudGlmaWVyP2RlbGV0ZSBpLnRvdWNoMDppLnRvdWNoMSYmaS50b3VjaDFbMl09PT1yLmlkZW50aWZpZXImJmRlbGV0ZSBpLnRvdWNoMTtpLnRvdWNoMSYmIWkudG91Y2gwJiYoaS50b3VjaDA9aS50b3VjaDEsZGVsZXRlIGkudG91Y2gxKSxpLnRvdWNoMD9pLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoaS50b3VjaDBbMF0pOmkuZW5kKCl9cmV0dXJuIHkudHJhbnNmb3JtPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O2UucHJvcGVydHkoIl9fem9vbSIsaGIpLHQhPT1lP3godCxuKTplLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKS5lbmQoKX0pfSx5LnNjYWxlQnk9ZnVuY3Rpb24odCxuKXt5LnNjYWxlVG8odCxmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fem9vbS5rKigiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKX0pfSx5LnNjYWxlVG89ZnVuY3Rpb24odCxuKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10aGlzLl9fem9vbSxyPW0odCksYT1lLmludmVydChyKSx1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm47cmV0dXJuIG8oYihfKGUsdSkscixhKSx0LGMpfSl9LHkudHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxuLGUpe3kudHJhbnNmb3JtKHQsZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6biwiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjKX0pfSx5LnRyYW5zbGF0ZVRvPWZ1bmN0aW9uKHQsbixlKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykscj10aGlzLl9fem9vbSxhPW0odCk7cmV0dXJuIG8oYWIudHJhbnNsYXRlKGFbMF0sYVsxXSkuc2NhbGUoci5rKS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/LW4uYXBwbHkodGhpcyxhcmd1bWVudHMpOi1uLCJmdW5jdGlvbiI9PXR5cGVvZiBlPy1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotZSksdCxjKX0pfSxNLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuaW5kZXg9aC5wdXNoKHRoaXMpLTEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGguc3BsaWNlKHRoaXMuaW5kZXgsMSksdGhpcy5pbmRleD0tMSx0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe0N0KG5ldyBpYih5LHQsdGhpcy50aGF0Ll9fem9vbSksZC5hcHBseSxkLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHkud2hlZWxEZWx0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCt0KSx5KTphfSx5LmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCEhdCkseSk6cn0seS50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYighIXQpLHkpOnV9LHkuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cmIoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHkpOml9LHkuc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGZbMF09K3RbMF0sZlsxXT0rdFsxXSx5KTpbZlswXSxmWzFdXX0seS50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGNbMF1bMF09K3RbMF1bMF0sY1sxXVswXT0rdFsxXVswXSxjWzBdWzFdPSt0WzBdWzFdLGNbMV1bMV09K3RbMV1bMV0seSk6W1tjWzBdWzBdLGNbMF1bMV1dLFtjWzFdWzBdLGNbMV1bMV1dXX0seS5jb25zdHJhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCx5KTpvfSx5LmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LHkpOnN9LHkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCx5KTpsfSx5Lm9uPWZ1bmN0aW9uKCl7dmFyIHQ9ZC5vbi5hcHBseShkLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1kP3k6dH0seS5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSh0PSt0KSp0LHkpOk1hdGguc3FydChnKX0seX0sdC56b29tVHJhbnNmb3JtPXViLHQuem9vbUlkZW50aXR5PWFiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL3BhbGV0dGVzLmpzCnZhciBwZjsKKGZ1bmN0aW9uKGIpe2IucGFsZXR0ZXM9e2dvb2dsZVN0YW5kYXJkOiIjZGI0NDM3ICNmZjcwNDMgI2Y0YjQwMCAjMGY5ZDU4ICMwMDc5NmIgIzAwYWNjMSAjNDI4NWY0ICM1YzZiYzAgI2FiNDdiYyIuc3BsaXQoIiAiKSxnb29nbGVDb29sOiIjOWU5ZDI0ICMwZjlkNTggIzAwNzk2YiAjMDBhY2MxICM0Mjg1ZjQgIzVjNmJjMCAjNjA3ZDhiIi5zcGxpdCgiICIpLGdvb2dsZVdhcm06IiM3OTU1NDggI2FiNDdiYyAjZjA2MjkyICNjMjE4NWIgI2RiNDQzNyAjZmY3MDQzICNmNGI0MDAiLnNwbGl0KCIgIiksZ29vZ2xlQ29sb3JCbGluZEFzc2lzdDoiI2ZmNzA0MyAjMDBBQ0MxICNBQjQ3QkMgIzJBNTZDNiAjMGI4MDQzICNGN0NCNEQgI2MwY2EzMyAjNWUzNWIxICNBNTI3MTQiLnNwbGl0KCIgIiksdGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0OiIjZmY3MDQzICMwMDc3YmIgI2NjMzMxMSAjMzNiYmVlICNlZTMzNzcgIzAwOTk4OCAjYmJiYmJiIi5zcGxpdCgiICIpLGNvbG9yQmxpbmRBc3Npc3QxOiIjNDQ3N2FhICM0NGFhYWEgI2FhYWE0NCAjYWE3NzQ0ICNhYTQ0NTUgI2FhNDQ4OCIuc3BsaXQoIiAiKSxjb2xvckJsaW5kQXNzaXN0MjoiIzg4Y2NlZSAjNDRhYTk5ICMxMTc3MzMgIzk5OTkzMyAjZGRjYzc3ICNjYzY2NzcgIzg4MjI1NSAjYWE0NDk5Ii5zcGxpdCgiICIpLApjb2xvckJsaW5kQXNzaXN0MzoiIzMzMjI4OCAjNjY5OWNjICM4OGNjZWUgIzQ0YWE5OSAjMTE3NzMzICM5OTk5MzMgI2RkY2M3NyAjY2M2Njc3ICNhYTQ0NjYgIzg4MjI1NSAjNjYxMTAwICNhYTQ0OTkiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDQ6IiM0NDc3YWEgIzY2Y2NlZSAjMjI4ODMzICNjY2JiNDQgI2VlNjY3NyAjYWEzMzc3ICNiYmJiYmIiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDU6IiNGRjZEQjYgIzkyMDAwMCAjOTI0OTAwICNEQkQxMDAgIzI0RkYyNCAjMDA2RERCICM0OTAwOTIiLnNwbGl0KCIgIiksbWxkYXNoOiIjRTQ3RUFEICNGNDY0MEQgI0ZBQTMwMCAjRjVFNjM2ICMwMEEwNzcgIzAwNzdCOCAjMDBCN0VEIi5zcGxpdCgiICIpfTtiLnN0YW5kYXJkPWIucGFsZXR0ZXMudGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0fSkocGZ8fChwZj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL2NvbG9yU2NhbGUuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoaCxrKXtmdW5jdGlvbiB0KCl7bC5zZXREb21haW4oaygpKX1jb25zdCBsPW5ldyBmO2guYWRkTGlzdGVuZXIodCk7dCgpO3JldHVybiBwPT5sLmdldENvbG9yKHApfWNsYXNzIGZ7Y29uc3RydWN0b3IoaD1iLnN0YW5kYXJkKXt0aGlzLnBhbGV0dGU9aDt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpfXNldERvbWFpbihoKXt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpO2guZm9yRWFjaCgoayx0KT0+e3RoaXMuaWRlbnRpZmllcnMuc2V0KGssdGhpcy5wYWxldHRlW3QldGhpcy5wYWxldHRlLmxlbmd0aF0pfSl9Z2V0Q29sb3IoaCl7aWYoIXRoaXMuaWRlbnRpZmllcnMuaGFzKGgpKXRocm93IEVycm9yKGBTdHJpbmcgJHtofSB3YXMgbm90IGluIHRoZSBkb21haW4uYCk7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnMuZ2V0KGgpfX1iLkNvbG9yU2NhbGU9ZjtiLnJ1bnNDb2xvclNjYWxlPWQodmMucnVuc1N0b3JlLCgpPT52Yy5ydW5zU3RvcmUuZ2V0UnVucygpKTsKYi5leHBlcmltZW50c0NvbG9yU2NhbGU9ZCh2Yy5leHBlcmltZW50c1N0b3JlLCgpPT52Yy5leHBlcmltZW50c1N0b3JlLmdldEV4cGVyaW1lbnRzKCkubWFwKCh7bmFtZTpofSk9PmgpKX0pKHBmfHwocGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pY29uLWJ1dHRvbi9wYXBlci1pY29uLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pY29uLWJ1dHRvbiIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAifSxiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcl0scHJvcGVydGllczp7c3JjOnt0eXBlOlN0cmluZ30saWNvbjp7dHlwZTpTdHJpbmd9LGFsdDp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9hbHRDaGFuZ2VkIn19LF9hbHRDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dmFyIGY9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKTtmJiZkIT1mfHx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1tdWx0aS1jaGVja2JveC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbXVsdGktY2hlY2tib3giLHByb3BlcnRpZXM6e25hbWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sY29sb3Jpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOntnZXRDb2xvcjooKT0+IiJ9fSxyZWdleDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiIifSxfcmVnZXg6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfbWFrZVJlZ2V4KHJlZ2V4KSJ9LG5hbWVzTWF0Y2hpbmdSZWdleDp7dHlwZTpBcnJheSxjb21wdXRlZDoiY29tcHV0ZU5hbWVzTWF0Y2hpbmdSZWdleChuYW1lcy4qLCBfcmVnZXgpIn0sc2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTooKT0+KHt9KX0sb3V0U2VsZWN0ZWQ6e3R5cGU6QXJyYXksbm90aWZ5OiEwLGNvbXB1dGVkOiJjb21wdXRlT3V0U2VsZWN0ZWQobmFtZXNNYXRjaGluZ1JlZ2V4LiosIHNlbGVjdGlvblN0YXRlLiopIn0sbWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDp7dHlwZTpOdW1iZXIsCnZhbHVlOjQwfSxfZGVib3VuY2VkUmVnZXhDaGFuZ2U6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9Xy5kZWJvdW5jZShkPT57dGhpcy5yZWdleD1kfSwxNTAse2xlYWRpbmc6ITF9KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLiQkKCIjbmFtZXMtcmVnZXgiKS52YWx1ZTsiIj09ZD90aGlzLmFzeW5jKCgpPT57dGhpcy5yZWdleD1kfSwzMCk6YihkKX19fX0sb2JzZXJ2ZXJzOlsiX3NldElzb2xhdG9ySWNvbihzZWxlY3Rpb25TdGF0ZSwgbmFtZXMpIl0sX21ha2VSZWdleDpmdW5jdGlvbihiKXt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoYil9Y2F0Y2goZCl7cmV0dXJuIG51bGx9fSxfc2V0SXNvbGF0b3JJY29uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zZWxlY3Rpb25TdGF0ZSxkPV8uZmlsdGVyKF8udmFsdWVzKGIpKS5sZW5ndGg7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pc29sYXRvciIpKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuaWNvbj0KMT09PWQmJmJbZi5uYW1lXT8icmFkaW8tYnV0dG9uLWNoZWNrZWQiOiJyYWRpby1idXR0b24tdW5jaGVja2VkIn0pfSxjb21wdXRlTmFtZXNNYXRjaGluZ1JlZ2V4OmZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLl9yZWdleDtyZXR1cm4gYj90aGlzLm5hbWVzLmZpbHRlcihkPT5iLnRlc3QoZCkpOnRoaXMubmFtZXN9LGNvbXB1dGVPdXRTZWxlY3RlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuc2VsZWN0aW9uU3RhdGUsZD10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5sZW5ndGg8PXRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDtyZXR1cm4gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguZmlsdGVyKGY9Pm51bGw9PWJbZl0/ZDpiW2ZdKX0sc3luY2hyb25pemVDb2xvcnM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRJc29sYXRvckljb24oKTt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgicGFwZXItY2hlY2tib3giKS5mb3JFYWNoKGI9Pntjb25zdCBkPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYi5uYW1lKTsKYi51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IiOmQsIi0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IiOmQsIi0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yIjpkLCItLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IiOmR9KX0pO3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuaXNvbGF0b3IiKS5mb3JFYWNoKGI9Pntjb25zdCBkPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYi5uYW1lKTtiLnN0eWxlLmNvbG9yPWR9KTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy51cGRhdGVTdHlsZXMoKX0pfSxfaXNvbGF0ZU5hbWU6ZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQubmFtZSxmPXt9O3RoaXMubmFtZXMuZm9yRWFjaChmdW5jdGlvbihoKXtmW2hdPWg9PWR9KTt0aGlzLnNlbGVjdGlvblN0YXRlPWZ9LF9jaGVja2JveENoYW5nZTpmdW5jdGlvbihiKXtiPQpQb2x5bWVyLmRvbShiKS5sb2NhbFRhcmdldDtjb25zdCBkPV8uY2xvbmUodGhpcy5zZWxlY3Rpb25TdGF0ZSk7ZFtiLm5hbWVdPWIuY2hlY2tlZDt0aGlzLnNlbGVjdGlvblN0YXRlPWR9LF9pc0NoZWNrZWQ6ZnVuY3Rpb24oYil7cmV0dXJuLTEhPXRoaXMub3V0U2VsZWN0ZWQuaW5kZXhPZihiKX0sdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5zb21lKGY9PnRoaXMub3V0U2VsZWN0ZWQuaW5jbHVkZXMoZikpLGQ9e307dGhpcy5uYW1lcy5mb3JFYWNoKGY9PntkW2ZdPSFifSk7dGhpcy5zZWxlY3Rpb25TdGF0ZT1kfX0pfSkocWR8fChxZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXJ1bnMtc2VsZWN0b3IvdGYtd2JyLXN0cmluZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi13YnItc3RyaW5nIixwcm9wZXJ0aWVzOnt2YWx1ZTpTdHJpbmcsX3BhcnRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVBhcnRzKHZhbHVlKSJ9fSxfY29tcHV0ZVBhcnRzKGIpe2NvbnN0IGQ9W10sZj0vWy89XywtXS87Zm9yKG51bGw9PWImJihiPSIiKTs7KXtjb25zdCBoPWIuc2VhcmNoKGYpO2lmKC0xPT09aCl7ZC5wdXNoKGIpO2JyZWFrfWVsc2UgZC5wdXNoKGIuc2xpY2UoMCxoKzEpKSxiPWIuc2xpY2UoaCsxKX1yZXR1cm4gZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ydW5zLXNlbGVjdG9yL3RmLXJ1bnMtc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcnVucy1zZWxlY3RvciIscHJvcGVydGllczp7cnVuU2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZSIsdmFsdWU6cGQuZ2V0T2JqZWN0SW5pdGlhbGl6ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSl9LHJlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOnBkLmdldFN0cmluZ0luaXRpYWxpemVyKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Il9yZWdleE9ic2VydmVyIn0sc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LG5vdGlmeTohMH0scnVuczpBcnJheSxkYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2NsaXBwZWREYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0Q2xpcHBlZERhdGFMb2NhdGlvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKSJ9LF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoOnt0eXBlOk51bWJlciwKdmFsdWU6MjUwLHJlYWRPbmx5OiEwfSxjb2xvcmluZzp7dHlwZTpPYmplY3QsdmFsdWU6e2dldENvbG9yOnBmLnJ1bnNDb2xvclNjYWxlfX19LGF0dGFjaGVkKCl7dGhpcy5fcnVuU3RvcmVMaXN0ZW5lcj12Yy5ydW5zU3RvcmUuYWRkTGlzdGVuZXIoKCk9Pnt0aGlzLnNldCgicnVucyIsdmMucnVuc1N0b3JlLmdldFJ1bnMoKSl9KTt0aGlzLnNldCgicnVucyIsdmMucnVuc1N0b3JlLmdldFJ1bnMoKSk7dGhpcy5fZW52U3RvcmVMaXN0ZW5lcj12Yy5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsdmMuZW52aXJvbm1lbnRTdG9yZS5nZXREYXRhTG9jYXRpb24oKSl9KTt0aGlzLnNldCgiZGF0YUxvY2F0aW9uIix2Yy5lbnZpcm9ubWVudFN0b3JlLmdldERhdGFMb2NhdGlvbigpKX0sZGV0YWNoZWQoKXt2Yy5ydW5zU3RvcmUucmVtb3ZlTGlzdGVuZXJCeUtleSh0aGlzLl9ydW5TdG9yZUxpc3RlbmVyKTt2Yy5lbnZpcm9ubWVudFN0b3JlLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fZW52U3RvcmVMaXN0ZW5lcil9LApfdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7dGhpcy4kLm11bHRpQ2hlY2tib3gudG9nZ2xlQWxsKCl9LF9nZXRDbGlwcGVkRGF0YUxvY2F0aW9uOmZ1bmN0aW9uKGIsZCl7aWYodm9pZCAwIT09YiYmIShiLmxlbmd0aD5kKSlyZXR1cm4gYn0sX29wZW5EYXRhTG9jYXRpb25EaWFsb2c6ZnVuY3Rpb24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuJCQoIiNkYXRhLWxvY2F0aW9uLWRpYWxvZyIpLm9wZW4oKX0sX3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24oYixkKXtyZXR1cm4gYiYmYi5sZW5ndGg+ZH0sX3N0b3JlUnVuU2VsZWN0aW9uU3RhdGU6cGQuZ2V0T2JqZWN0T2JzZXJ2ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSksX3JlZ2V4T2JzZXJ2ZXI6cGQuZ2V0U3RyaW5nT2JzZXJ2ZXIoInJlZ2V4SW5wdXQiLHtkZWZhdWx0VmFsdWU6IiJ9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3JlZ2lzdHJ5LmpzCnZhciBxZjsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtkLk5PVF9MT0FERUQ9Ik5PVF9MT0FERUQiO2QuTE9BREVEPSJMT0FERUQiO2QuRkFJTEVEPSJGQUlMRUQifSkoYi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlfHwoYi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPXt9KSk7Yi5kYXNoYm9hcmRSZWdpc3RyeT17fTtiLnJlZ2lzdGVyRGFzaGJvYXJkPWZ1bmN0aW9uKCl7dmFyIGQ9e3BsdWdpbjoiYmVob2xkZXIiLGVsZW1lbnROYW1lOiJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiLHNob3VsZFJlbW92ZURvbTohMH07aWYoIWQucGx1Z2luKXRocm93IEVycm9yKCJEYXNoYm9hcmQucGx1Z2luIG11c3QgYmUgcHJlc2VudCIpO2lmKCFkLmVsZW1lbnROYW1lKXRocm93IEVycm9yKCJEYXNoYm9hcmQuZWxlbWVudE5hbWUgbXVzdCBiZSBwcmVzZW50Iik7aWYoZC5wbHVnaW4gaW4gYi5kYXNoYm9hcmRSZWdpc3RyeSl0aHJvdyBFcnJvcihgUGx1Z2luIGFscmVhZHkgcmVnaXN0ZXJlZDogJHtkLnBsdWdpbn1gKTtkLnRhYk5hbWV8fAooZC50YWJOYW1lPWQucGx1Z2luKTtiLmRhc2hib2FyZFJlZ2lzdHJ5W2QucGx1Z2luXT1kfX0pKHFmfHwocWY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi11dGlscy91dGlscy5qcwp2YXIgcmY7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYsaCxrKXtyZXR1cm4gMT09PWY/aDprfWIuYWdncmVnYXRlVGFnSW5mbz1mdW5jdGlvbihmLGgpe2xldCBrPXZvaWQgMDtjb25zdCB0PXt9O09iamVjdC5rZXlzKGYpLmZvckVhY2gocD0+e2NvbnN0IG09ZltwXTt2b2lkIDA9PT1rJiYoaz1tLmRpc3BsYXlOYW1lKTtrIT09bS5kaXNwbGF5TmFtZSYmKGs9bnVsbCk7dm9pZCAwPT09dFttLmRlc2NyaXB0aW9uXSYmKHRbbS5kZXNjcmlwdGlvbl09W10pO3RbbS5kZXNjcmlwdGlvbl0ucHVzaChwKX0pO2g9bnVsbCE9az9rOmg7Y29uc3QgbD0oKCk9Pntjb25zdCBwPU9iamVjdC5rZXlzKHQpO3JldHVybiAwPT09cC5sZW5ndGg/IiI6MT09PXAubGVuZ3RoP3BbMF06YCR7Ilx4M2NwXHgzZVx4M2NzdHJvbmdceDNlTXVsdGlwbGUgZGVzY3JpcHRpb25zOlx4M2Mvc3Ryb25nXHgzZVx4M2MvcFx4M2UifTx1bD4ke3AubWFwKG09Pntjb25zdCBuPXRbbV0ubWFwKHU9PmA8Y29kZT4ke3UucmVwbGFjZSgvPC9nLCJceDI2bHQ7IikucmVwbGFjZSgvPi9nLAoiXHgyNmd0OyIpLnJlcGxhY2UoLyYvZywiXHgyNmFtcDsiKX08L2NvZGU+YCkscT0yPG4ubGVuZ3RoP24uc2xpY2UoMCxuLmxlbmd0aC0xKS5qb2luKCIsICIpKyIsIGFuZCAiK25bbi5sZW5ndGgtMV06bi5qb2luKCIgYW5kICIpO3JldHVybmA8bGk+PHA+Rm9yICR7ZChuLmxlbmd0aCwicnVuIiwicnVucyIpfSAke3F9OjwvcD4ke219PC9saT5gfSkuam9pbigiIil9PC91bD5gfSkoKTtyZXR1cm57ZGlzcGxheU5hbWU6aCxkZXNjcmlwdGlvbjpsfX19KShyZnx8KHJmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItc3Bpbm5lci9wYXBlci1zcGlubmVyLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlclNwaW5uZXJCZWhhdmlvcj17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfX2FjdGl2ZUNoYW5nZWQifSxhbHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJsb2FkaW5nIixvYnNlcnZlcjoiX19hbHRDaGFuZ2VkIn0sX19jb29saW5nRG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sX19jb21wdXRlQ29udGFpbmVyQ2xhc3NlczpmdW5jdGlvbihiLGQpe3JldHVybltifHxkPyJhY3RpdmUiOiIiLGQ/ImNvb2xkb3duIjoiIl0uam9pbigiICIpfSxfX2FjdGl2ZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXt0aGlzLl9fc2V0QXJpYUhpZGRlbighYik7dGhpcy5fX2Nvb2xpbmdEb3duPSFiJiZkfSxfX2FsdENoYW5nZWQ6ZnVuY3Rpb24oYil7ImxvYWRpbmciPT09Yj90aGlzLmFsdD10aGlzLmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpfHxiOih0aGlzLl9fc2V0QXJpYUhpZGRlbigiIj09PQpiKSx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYikpfSxfX3NldEFyaWFIaWRkZW46ZnVuY3Rpb24oYil7Yj90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIil9LF9fcmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9fY29vbGluZ0Rvd249dGhpcy5hY3RpdmU9ITF9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1zcGlubmVyL3BhcGVyLXNwaW5uZXItbGl0ZS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1zcGlubmVyLWxpdGUiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlclNwaW5uZXJCZWhhdmlvcl19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kYXNoYm9hcmQtY29tbW9uL2RhdGEtbG9hZGVyLWJlaGF2aW9yLmpzCihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oZil7ZltmLkxPQURJTkc9MF09IkxPQURJTkciO2ZbZi5MT0FERUQ9MV09IkxPQURFRCJ9KShkfHwoZD17fSkpO2IuRGF0YUxvYWRlckJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthY3RpdmU6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2xvYWREYXRhSWZBY3RpdmUifSxsb2FkS2V5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sZGF0YVRvTG9hZDp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LGdldERhdGFMb2FkTmFtZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Zj0+U3RyaW5nKGYpfSxsb2FkRGF0YUNhbGxiYWNrOkZ1bmN0aW9uLHJlcXVlc3REYXRhOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGY9PnRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0aGlzLmdldERhdGFMb2FkVXJsKGYpKX19LGdldERhdGFMb2FkVXJsOkZ1bmN0aW9uLGRhdGFMb2FkaW5nOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLAp2YWx1ZTohMX0sX2RhdGFMb2FkU3RhdGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX2xvYWREYXRhQXN5bmM6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfZGF0YVRvTG9hZENoYW5nZWQoaXNBdHRhY2hlZCwgZGF0YVRvTG9hZC4qKSJdLG9uTG9hZEZpbmlzaCgpe30scmVsb2FkKCl7dGhpcy5fZGF0YUxvYWRTdGF0ZS5jbGVhcigpO3RoaXMuX2xvYWREYXRhKCl9LHJlc2V0KCl7bnVsbCE9dGhpcy5fbG9hZERhdGFBc3luYyYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz1udWxsKTt0aGlzLl9jYW5jZWxsZXImJnRoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTt0aGlzLl9kYXRhTG9hZFN0YXRlJiZ0aGlzLl9kYXRhTG9hZFN0YXRlLmNsZWFyKCk7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9sb2FkRGF0YSgpfSwKX2RhdGFUb0xvYWRDaGFuZ2VkKCl7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9sb2FkRGF0YSgpfSxjcmVhdGVkKCl7dGhpcy5fbG9hZERhdGE9Xy50aHJvdHRsZSh0aGlzLl9sb2FkRGF0YUltcGwsMTAwLHtsZWFkaW5nOiEwLHRyYWlsaW5nOiEwfSl9LGRldGFjaGVkKCl7bnVsbCE9dGhpcy5fbG9hZERhdGFBc3luYyYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz1udWxsKX0sX2xvYWREYXRhSWZBY3RpdmUoKXt0aGlzLmFjdGl2ZSYmdGhpcy5fbG9hZERhdGEoKX0sX2xvYWREYXRhSW1wbCgpe3RoaXMuYWN0aXZlJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9sb2FkRGF0YUFzeW5jKSx0aGlzLl9sb2FkRGF0YUFzeW5jPXRoaXMuYXN5bmModGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGY9PntpZighZi5jYW5jZWxsZWQpcmV0dXJuIHRoaXMuX3NldERhdGFMb2FkaW5nKCEwKSxmPXRoaXMuZGF0YVRvTG9hZC5maWx0ZXIoaD0+CntoPXRoaXMuZ2V0RGF0YUxvYWROYW1lKGgpO3JldHVybiF0aGlzLl9kYXRhTG9hZFN0YXRlLmhhcyhoKX0pLm1hcChoPT57Y29uc3Qgaz10aGlzLmdldERhdGFMb2FkTmFtZShoKTt0aGlzLl9kYXRhTG9hZFN0YXRlLnNldChrLGQuTE9BRElORyk7cmV0dXJuIHRoaXMucmVxdWVzdERhdGEoaCkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUodD0+e3QuY2FuY2VsbGVkfHwodGhpcy5fZGF0YUxvYWRTdGF0ZS5zZXQoayxkLkxPQURFRCksdGhpcy5sb2FkRGF0YUNhbGxiYWNrKHRoaXMsaCx0LnZhbHVlKSk7cmV0dXJuIGt9KSl9KSxQcm9taXNlLmFsbChmKS50aGVuKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShoPT57aWYoIWguY2FuY2VsbGVkKXtjb25zdCBrPW5ldyBTZXQoaC52YWx1ZSk7aWYodGhpcy5kYXRhVG9Mb2FkLnNvbWUodD0+ay5oYXModGhpcy5nZXREYXRhTG9hZE5hbWUodCkpKSl0aGlzLm9uTG9hZEZpbmlzaCgpfUFycmF5LmZyb20odGhpcy5fZGF0YUxvYWRTdGF0ZS52YWx1ZXMoKSkuc29tZShrPT4Kaz09PWQuTE9BRElORyl8fHRoaXMuX3NldERhdGFMb2FkaW5nKCExKX0pLCgpPT57fSkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHtjYW5jZWxsZWQ6aH0pPT57aHx8KHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCl9KSl9KSkpfX19KShxZHx8KHFkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9wbG90dGFibGUuanMKLyoKIE1JVAogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgdGhlIFNpZ25hdHVyZSBBUEkgdG8gaGVscCBpbiBjb21wYXJpbmcgd2hlbiB0d28KIFBsb3R0YWJsZSBvYmplY3RzIGhhdmUgImNoYW5nZWQiLgoKIE1lbW9pemF0aW9uIGluIFBsb3R0YWJsZSBpcyBjb21wbGljYXRlZCBieSBtdXRhYmxlIHNjYWxlcyBhbmQgZGF0YXNldHMuIFdlIGNhbm5vdCBzaW1wbHkKIHJlZmVyZW5jZSBjb21wYXJlIHR3byBlLmcuIHNjYWxlcyBzaW5jZSBpdCBtYXkgaGF2ZSBpbnRlcm5hbGx5IG11dGF0ZWQuIFRvIHJlc29sdmUgdGhpcywKIHdlIHdyaXRlIGEgcmVjdXJzaXZlIFNpZ25hdHVyZSBpbnRlcmZhY2UgdGhhdCBob2xkcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2Ygd2hhdGV2ZXIKIHN0YXRlIHRoZSBzY2FsZS9kYXRhIHdhcyBpbiBhdCB0aGUgdGltZS4gVGhlbiBvbiBtZW1vaXplZCBmdW5jdGlvbiBpbnZvY2F0aW9uIHdlIHNpZ24gdGhlCiBuZXcgaW5wdXRzIGFuZCBjb21wYXJlIHRoZSBzaWduYXR1cmVzIHRvIGRlY2lkZSBpZiB3ZSBzaG91bGQgcmVjb21wdXRlLgoKIFdlIG11c3QgaGFuZC13cml0ZSBhIHNpZ25hdHVyZSBmb3IgZWFjaCBjdXN0b20gY2xhc3Mgd2Ugd2lzaCB0byBzdXBwb3J0LgogTUlUCgogQGZpbGVvdmVydmlldyBtYW51YWxseSBhZGQgZDMtc2VsZWN0aW9uLW11bHRpIHRvIGQzIGRlZmF1bHQgYnVuZGxlLiBNb3N0IG9mIHRoaXMgY29kZSBpcwogY29waWVkIGZyb20gZDMtc2VsZWN0aW9uLW11bHRpQDEuMC4wLgogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1zZWxlY3Rpb24tbXVsdGkvaXNzdWVzLzExIGZvciB3aHkgd2UgaGF2ZSB0byBkbyB0aGlzCiBNSVQKIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyBhIGNvbnZlbmllbnQgdGh1bmsgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBjb21tb24gY2FzZQogb2YgY3JlYXRpbmcgYSBtZW1vaXplZCBmdW5jdGlvbiB0aGF0IHRha2VzIGl0cyBpbnB1dHMgZnJvbSBtdXRhYmxlIGNsYXNzIHByb3BlcnRpZXMuCiBNSVQKIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyBhIGZ1bmN0aW9uIG1lbW9pemVyIHVzaW5nIHRoZSBTaWduYXR1cmUgQVBJLgogUGxvdHRhYmxlIDMuNy4wIChodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvcGxvdHRhYmxlKQogQ29weXJpZ2h0IDIwMTQtMjAxNyBQYWxhbnRpciBUZWNobm9sb2dpZXMKIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3Bsb3R0YWJsZS9ibG9iL21hc3Rlci9MSUNFTlNFKQogaXMtcGxhaW4tb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1wbGFpbi1vYmplY3Q+CgogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0LgogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogaXNvYmplY3QgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzb2JqZWN0PgoKIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC4KIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KKi8KKGZ1bmN0aW9uKGIsZCl7Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cyYmIm9iamVjdCI9PT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWQocmVxdWlyZSgiZDMiKSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZDMiXSxkKToib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuUGxvdHRhYmxlPWQocmVxdWlyZSgiZDMiKSk6Yi5QbG90dGFibGU9ZChiLmQzKX0pKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYoayl7aWYoaFtrXSlyZXR1cm4gaFtrXS5leHBvcnRzO3ZhciB0PWhba109e2k6ayxsOiExLGV4cG9ydHM6e319O2Rba10uY2FsbCh0LmV4cG9ydHMsdCx0LmV4cG9ydHMsZik7dC5sPSEwO3JldHVybiB0LmV4cG9ydHN9dmFyIGg9e307Zi5tPWQ7Zi5jPWg7Zi5pPWZ1bmN0aW9uKGspe3JldHVybiBrfTtmLmQ9ZnVuY3Rpb24oayx0LGwpe2YubyhrLHQpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywKdCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0Omx9KX07Zi5uPWZ1bmN0aW9uKGspe3ZhciB0PWsmJmsuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBrWyJkZWZhdWx0Il19OmZ1bmN0aW9uKCl7cmV0dXJuIGt9O2YuZCh0LCJhIix0KTtyZXR1cm4gdH07Zi5vPWZ1bmN0aW9uKGssdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChrLHQpfTtmLnA9IiI7cmV0dXJuIGYoZi5zPTE0MCl9KFtmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1kPWgoMTA3KTtmLkFycmF5PWQ7ZD1oKDExMCk7Zi5Db2xvcj1kO2Q9aCg1NSk7Zi5ET009ZDtkPWgoNTYpO2YuTWF0aD1kO2Q9aCgxMTMpO2YuT2JqZWN0PWQ7ZD1oKDU3KTtmLlJUcmVlPWQ7ZD1oKDExNSk7Zi5TdGFja2luZz1kO2Q9aCgzNSk7Zi5XaW5kb3c9ZDtrKGgoMTA4KSk7ayhoKDEwOSkpO2soaCgxMikpOwprKGgoMTExKSk7ayhoKDExMikpO2soaCg1OCkpO2soaCgxMTYpKX0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPWJ9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKEcsRCxCKXt2YXIgST1ELmFjY2Vzc29yO0Q9RC5zY2FsZTtpZihudWxsPT1EKXJldHVybltdO3ZhciBOPUcuZGF0YSgpO251bGwhPUImJihOPU4uZmlsdGVyKGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEIoTyxILEcpfSkpO049Ti5tYXAoZnVuY3Rpb24oTyxIKXtyZXR1cm4gSShPLEgsRyl9KTtyZXR1cm4gRC5leHRlbnRPZlZhbHVlcyhOKX12YXIgdD10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oRyxEKXtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1HfWZvcih2YXIgSSBpbiBEKUQuaGFzT3duUHJvcGVydHkoSSkmJihHW0ldPURbSV0pO0cucHJvdG90eXBlPW51bGw9PT1EP09iamVjdC5jcmVhdGUoRCk6KEIucHJvdG90eXBlPUQucHJvdG90eXBlLG5ldyBCKX0sbD1oKDEpLHA9aCg3KTtkPWgoNCk7dmFyIG09CmgoMTgpLG49aCg2KSxxPWgoOSksdT1oKDIwKSx4PWgoMCksQT1oKDEyKSx5PWgoMTApLHc9aCg1MSksQz1oKDUyKTtmLlJlbmRlcmVyPXkubWFrZUVudW0oWyJzdmciLCJjYW52YXMiXSk7aD1mdW5jdGlvbihHKXtmdW5jdGlvbiBEKCl7dmFyIEI9Ry5jYWxsKHRoaXMpfHx0aGlzO0IuX2RhdGFDaGFuZ2VkPSExO0IuX2F0dHJFeHRlbnRzPXt9O0IuX2FuaW1hdGU9ITE7Qi5fYW5pbWF0b3JzPXt9O0IuX3Byb3BlcnR5RXh0ZW50cz17fTtCLl9yZXNldEVudGl0eVN0b3JlPWZ1bmN0aW9uKCl7Qi5fY2FjaGVkRW50aXR5U3RvcmU9dm9pZCAwfTtCLl9vdmVyZmxvd0hpZGRlbj0hMDtCLmFkZENsYXNzKCJwbG90Iik7Qi5fZGF0YXNldFRvRHJhd2VyPW5ldyB4Lk1hcDtCLl9hdHRyQmluZGluZ3M9bC5tYXAoKTtCLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKE4sTyl7cmV0dXJuIEIuX2luY2x1ZGVkVmFsdWVzRm9yU2NhbGUoTixPKX07Qi5fcmVuZGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gQi5yZW5kZXIoKX07CkIuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEIuX29uRGF0YXNldFVwZGF0ZSgpfTtCLl9wcm9wZXJ0eUJpbmRpbmdzPWwubWFwKCk7dmFyIEk9KG5ldyBwLkVhc2luZykubWF4VG90YWxEdXJhdGlvbihELl9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtCLmFuaW1hdG9yKHcuQW5pbWF0b3IuTUFJTixJKTtCLmFuaW1hdG9yKHcuQW5pbWF0b3IuUkVTRVQsbmV3IHAuTnVsbCk7Qi5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlPXguV2luZG93LmRlYm91bmNlKEMuRGVmZXJyZWRSZW5kZXJlci5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVksQi5fcmVzZXRFbnRpdHlTdG9yZSk7cmV0dXJuIEJ9dChELEcpO0QuZ2V0VG90YWxEcmF3VGltZT1mdW5jdGlvbihCLEkpe3JldHVybiBJLnJlZHVjZShmdW5jdGlvbihOLE8pe3JldHVybiBOK08uYW5pbWF0b3IudG90YWxUaW1lKEIubGVuZ3RoKX0sMCl9O0QuYXBwbHlEcmF3U3RlcHM9ZnVuY3Rpb24oQixJKXtyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTil7dmFyIE89Ck4uYXR0clRvUHJvamVjdG9yLEg9e307T2JqZWN0LmtleXMoTykuZm9yRWFjaChmdW5jdGlvbihLKXtIW0tdPWZ1bmN0aW9uKE0sTCl7cmV0dXJuIE9bS10oTSxMLEkpfX0pO3JldHVybnthdHRyVG9BcHBsaWVkUHJvamVjdG9yOkgsYW5pbWF0b3I6Ti5hbmltYXRvcn19KX07RC5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKEIpe0I9QS5jb2VyY2VFeHRlcm5hbEQzKEIpO0cucHJvdG90eXBlLmFuY2hvci5jYWxsKHRoaXMsQik7dGhpcy5fZGF0YUNoYW5nZWQ9ITA7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMuX3VwZGF0ZUV4dGVudHMoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dmFyIEI9dGhpczt0aGlzLl9pc1NldHVwfHwoRy5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksbnVsbCE9dGhpcy5fY2FudmFzJiZ0aGlzLl9hcHBlbmRDYW52YXNOb2RlKCksdGhpcy5fcmVuZGVyQXJlYT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJyZW5kZXItYXJlYSIsCiEwKSx0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihJKXtyZXR1cm4gQi5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0KEkpfSkpfTtELnByb3RvdHlwZS5fYXBwZW5kQ2FudmFzTm9kZT1mdW5jdGlvbigpe3ZhciBCPXRoaXMuZWxlbWVudCgpLnNlbGVjdCgiLnBsb3QtY2FudmFzLWNvbnRhaW5lciIpO0IuZW1wdHkoKSYmKEI9dGhpcy5lbGVtZW50KCkuYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJwbG90LWNhbnZhcy1jb250YWluZXIiLCEwKSxCLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMubm9kZSgpKSl9O0QucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihCLEksTixPKXtHLnByb3RvdHlwZS5zZXRCb3VuZHMuY2FsbCh0aGlzLEIsSSxOLE8pO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTtudWxsIT10aGlzLl9jYW52YXMmJih0aGlzLl9idWZmZXJDYW52YXMmJiF0aGlzLl9idWZmZXJDYW52YXNWYWxpZCYmKHRoaXMuX2J1ZmZlckNhbnZhcy5hdHRyKCJ3aWR0aCIsCnRoaXMuX2NhbnZhcy5hdHRyKCJ3aWR0aCIpKSx0aGlzLl9idWZmZXJDYW52YXMuYXR0cigiaGVpZ2h0Iix0aGlzLl9jYW52YXMuYXR0cigiaGVpZ2h0IikpLChOPXRoaXMuX2J1ZmZlckNhbnZhcy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSkmJk4uZHJhd0ltYWdlKHRoaXMuX2NhbnZhcy5ub2RlKCksMCwwKSx0aGlzLl9idWZmZXJDYW52YXNWYWxpZD0hMCksTj1udWxsIT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbz93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzoxLHRoaXMuX2NhbnZhcy5hdHRyKCJ3aWR0aCIsQipOKSx0aGlzLl9jYW52YXMuYXR0cigiaGVpZ2h0IixJKk4pLE89dGhpcy5fY2FudmFzLm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpKSYmKE8uc2V0VHJhbnNmb3JtKE4sMCwwLE4sMCwwKSx0aGlzLl9idWZmZXJDYW52YXMmJk8uZHJhd0ltYWdlKHRoaXMuX2J1ZmZlckNhbnZhcy5ub2RlKCksMCwwLEIsSSkpfTtELnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIEI9dGhpczsKRy5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEkub2ZmVXBkYXRlKEIuX3JlbmRlckNhbGxiYWNrKX0pO3RoaXMuZGF0YXNldHMoW10pfTtELnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKEIpe0I9dGhpcy5fZGF0YXNldFRvRHJhd2VyLmdldChCKTsic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9CLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTpCLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpO3JldHVybiBCfTtELnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxLlNWR0RyYXdlcigicGF0aCIsIiIpfSxmdW5jdGlvbihCKXtyZXR1cm4gbmV3IG0uQ2FudmFzRHJhd2VyKEIsZnVuY3Rpb24oKXt9KX0pfTtELnByb3RvdHlwZS5fZ2V0QW5pbWF0b3I9ZnVuY3Rpb24oQil7cmV0dXJuIHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKT8KdGhpcy5fYW5pbWF0b3JzW0JdfHxuZXcgcC5OdWxsOm5ldyBwLk51bGx9O0QucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVFeHRlbnRzKCk7dGhpcy5fZGF0YUNoYW5nZWQ9ITA7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMucmVuZGVyTG93UHJpb3JpdHkoKX07RC5wcm90b3R5cGUuYXR0cj1mdW5jdGlvbihCLEksTil7aWYobnVsbD09SSlyZXR1cm4gdGhpcy5fYXR0ckJpbmRpbmdzLmdldChCKTt0aGlzLl9iaW5kQXR0cihCLEksTik7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX2JpbmRQcm9wZXJ0eT1mdW5jdGlvbihCLEksTixPKXt2YXIgSD10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChCKTtIPW51bGwhPUg/SC5zY2FsZTpudWxsO3RoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KEIse2FjY2Vzc29yOiJmdW5jdGlvbiI9PT10eXBlb2YgST9JOmZ1bmN0aW9uKCl7cmV0dXJuIEl9LHNjYWxlOk4scG9zdFNjYWxlOk99KTsKbnVsbCE9SCYmdGhpcy5fdW5pbnN0YWxsU2NhbGVGb3JLZXkoSCxCKTtudWxsIT1OJiZ0aGlzLl9pbnN0YWxsU2NhbGVGb3JLZXkoTixCKTt0aGlzLl9jbGVhckF0dHJUb1Byb2plY3RvckNhY2hlKCl9O0QucHJvdG90eXBlLl9iaW5kQXR0cj1mdW5jdGlvbihCLEksTil7dmFyIE89dGhpcy5fYXR0ckJpbmRpbmdzLmdldChCKTtPPW51bGwhPU8/Ty5zY2FsZTpudWxsO3RoaXMuX2F0dHJCaW5kaW5ncy5zZXQoQix7YWNjZXNzb3I6ImZ1bmN0aW9uIj09PXR5cGVvZiBJP0k6ZnVuY3Rpb24oKXtyZXR1cm4gSX0sc2NhbGU6Tn0pO251bGwhPU8mJnRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KE8sQik7bnVsbCE9TiYmdGhpcy5faW5zdGFsbFNjYWxlRm9yS2V5KE4sQik7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpfTtELnByb3RvdHlwZS5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZT1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3J9O0QucHJvdG90eXBlLl9nZXRBdHRyVG9Qcm9qZWN0b3I9CmZ1bmN0aW9uKCl7bnVsbD09dGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yJiYodGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yPXRoaXMuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yKCkpO3JldHVybiB4Lk9iamVjdC5hc3NpZ24oe30sdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yKX07RC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIEI9e307dGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goZnVuY3Rpb24oTixPKXtCW09dPUQuX3NjYWxlZEFjY2Vzc29yKE4pfSk7dmFyIEk9dGhpcy5fcHJvcGVydHlQcm9qZWN0b3JzKCk7T2JqZWN0LmtleXMoSSkuZm9yRWFjaChmdW5jdGlvbihOKXtudWxsPT1CW05dJiYoQltOXT1JW05dKX0pO3JldHVybiBCfTtELnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe0cucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5faXNBbmNob3JlZCYmKHRoaXMuX3BhaW50KCksCnRoaXMuX2RhdGFDaGFuZ2VkPSExKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUucmVuZGVyTG93UHJpb3JpdHk9ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJDYWxsYmFjaygpfTtELnByb3RvdHlwZS5hbmltYXRlZD1mdW5jdGlvbihCKXtpZihudWxsPT1CKXJldHVybiB0aGlzLl9hbmltYXRlO3RoaXMuX2FuaW1hdGU9QjtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7Ry5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyk7dGhpcy5fdXBkYXRlRXh0ZW50cygpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5fc2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEI9W107dGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSSl7ST1JLnNjYWxlO251bGwhPUkmJi0xPT09Qi5pbmRleE9mKEkpJiZCLnB1c2goSSl9KTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSSl7ST1JLnNjYWxlO251bGwhPUkmJi0xPT09Qi5pbmRleE9mKEkpJiZCLnB1c2goSSl9KTsKcmV0dXJuIEJ9O0QucHJvdG90eXBlLl91cGRhdGVFeHRlbnRzPWZ1bmN0aW9uKCl7dmFyIEI9dGhpczt0aGlzLl9yZXNldEVudGl0eVN0b3JlKCk7dGhpcy5fc2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihJKXtyZXR1cm4gSS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKEIuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfSl9O0QucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT1mdW5jdGlvbigpe3JldHVybiBudWxsfTtELnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yQXR0cj1mdW5jdGlvbihCKXt2YXIgST10aGlzO251bGw9PXRoaXMuX2F0dHJFeHRlbnRzW0JdJiYodGhpcy5fYXR0ckV4dGVudHNbQl09dS5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiBJLmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIEkuX2F0dHJCaW5kaW5ncy5nZXQoQil9LGZ1bmN0aW9uKE4sTyl7cmV0dXJuIG51bGw9PU98fG51bGw9PU8uYWNjZXNzb3I/bnVsbDpOLm1hcChmdW5jdGlvbihIKXtyZXR1cm4gayhILApPLG51bGwpfSl9KSk7cmV0dXJuIHRoaXMuX2F0dHJFeHRlbnRzW0JdKCl9O0QucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihCKXt2YXIgST10aGlzO251bGw9PXRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXSYmKHRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXT11Lm1lbVRodW5rKGZ1bmN0aW9uKCl7cmV0dXJuIEkuZGF0YXNldHMoKX0sZnVuY3Rpb24oKXtyZXR1cm4gSS5fcHJvcGVydHlCaW5kaW5ncy5nZXQoQil9LGZ1bmN0aW9uKCl7cmV0dXJuIEkuX2ZpbHRlckZvclByb3BlcnR5KEIpfSxmdW5jdGlvbihOLE8sSCl7cmV0dXJuIG51bGw9PU98fG51bGw9PU8uYWNjZXNzb3I/bnVsbDpOLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gayhLLE8sSCl9KX0pKTtyZXR1cm4gdGhpcy5fcHJvcGVydHlFeHRlbnRzW0JdKCl9O0QucHJvdG90eXBlLl9pbmNsdWRlZFZhbHVlc0ZvclNjYWxlPWZ1bmN0aW9uKEIsSSl7dmFyIE49dGhpcztpZighdGhpcy5faXNBbmNob3JlZCYmCiFJKXJldHVybltdO3ZhciBPPVtdO3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEgsSyl7SC5zY2FsZT09PUImJihIPU4uZ2V0RXh0ZW50c0ZvckF0dHIoSyksbnVsbCE9SCYmKE89Ty5jb25jYXQobC5tZXJnZShIKSkpKX0pO3RoaXMuX3Byb3BlcnR5QmluZGluZ3MuZWFjaChmdW5jdGlvbihILEspe0guc2NhbGU9PT1CJiYoSD1OLmdldEV4dGVudHNGb3JQcm9wZXJ0eShLKSxudWxsIT1IJiYoTz1PLmNvbmNhdChsLm1lcmdlKEgpKSkpfSk7cmV0dXJuIE99O0QucHJvdG90eXBlLmFuaW1hdG9yPWZ1bmN0aW9uKEIsSSl7aWYodm9pZCAwPT09SSlyZXR1cm4gdGhpcy5fYW5pbWF0b3JzW0JdO3RoaXMuX2FuaW1hdG9yc1tCXT1JO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5yZW5kZXJlcj1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLl9jYW52YXM/InN2ZyI6ImNhbnZhcyJ9O0QucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oQil7dGhpcy5fYWRkRGF0YXNldChCKTsKdGhpcy5fb25EYXRhc2V0VXBkYXRlKCl9O0QucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX3JlbW92ZURhdGFzZXQoQik7dmFyIEk9dGhpcy5fY3JlYXRlRHJhd2VyKEIpO3RoaXMuX2RhdGFzZXRUb0RyYXdlci5zZXQoQixJKTt0aGlzLl9pc1NldHVwJiZ0aGlzLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQoQik7Qi5vblVwZGF0ZSh0aGlzLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjayk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oQil7dGhpcy5fcmVtb3ZlRGF0YXNldChCKTt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKX07RC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oQil7aWYoLTE9PT10aGlzLmRhdGFzZXRzKCkuaW5kZXhPZihCKSlyZXR1cm4gdGhpczt0aGlzLl9yZW1vdmVEYXRhc2V0Tm9kZXMoQik7Qi5vZmZVcGRhdGUodGhpcy5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2spO3RoaXMuX2RhdGFzZXRUb0RyYXdlci5kZWxldGUoQik7CnJldHVybiB0aGlzfTtELnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEIpe3RoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQoQikucmVtb3ZlKCl9O0QucHJvdG90eXBlLmRhdGFzZXRzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXMsTj1bXTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaChmdW5jdGlvbihPLEgpe3JldHVybiBOLnB1c2goSCl9KTtpZihudWxsPT1CKXJldHVybiBOO04uZm9yRWFjaChmdW5jdGlvbihPKXtyZXR1cm4gSS5fcmVtb3ZlRGF0YXNldChPKX0pO0IuZm9yRWFjaChmdW5jdGlvbihPKXtyZXR1cm4gSS5fYWRkRGF0YXNldChPKX0pO3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgcC5OdWxsfV19O0QucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9CmZ1bmN0aW9uKCl7fTtELnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcz1mdW5jdGlvbihCKXt2YXIgST10aGlzLE49W107Qi5mb3JFYWNoKGZ1bmN0aW9uKE8sSCl7dmFyIEs9SS5fZGF0YXNldFRvRHJhd2VyLmdldChPKSxNPTA7Ty5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbihMLFEpe3ZhciBUPUkuX3BpeGVsUG9pbnQoTCxRLE8pO3guTWF0aC5pc05hTihULngpfHx4Lk1hdGguaXNOYU4oVC55KXx8KE4ucHVzaCh7ZGF0dW06TCxnZXQgcG9zaXRpb24oKXtyZXR1cm4gSS5fcGl4ZWxQb2ludC5jYWxsKEksTCxRLE8pfSxpbmRleDpRLGRhdGFzZXQ6TyxkYXRhc2V0SW5kZXg6SCxjb21wb25lbnQ6SSxkcmF3ZXI6Syx2YWxpZERhdHVtSW5kZXg6TX0pLE0rKyl9KX0pO3JldHVybiBOfTtELnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBCPW5ldyB4Lk1hcDt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihJKXtyZXR1cm4gQi5zZXQoSSwKSS5kYXRhKCkpfSk7cmV0dXJuIEJ9O0QucHJvdG90eXBlLl9wYWludD1mdW5jdGlvbigpe3ZhciBCPXRoaXM7ZGVsZXRlIHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcjt2YXIgST10aGlzLl9nZW5lcmF0ZURyYXdTdGVwcygpLE49dGhpcy5fZ2V0RGF0YVRvRHJhdygpLE89dGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gQi5fZGF0YXNldFRvRHJhd2VyLmdldChLKX0pO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXt2YXIgSD10aGlzLl9jYW52YXMubm9kZSgpO0guZ2V0Q29udGV4dCgiMmQiKS5jbGVhclJlY3QoMCwwLEguY2xpZW50V2lkdGgsSC5jbGllbnRIZWlnaHQpO3RoaXMuX2J1ZmZlckNhbnZhc1ZhbGlkPSExfXRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEssTSl7dmFyIEw9RC5hcHBseURyYXdTdGVwcyhJLEspO09bTV0uZHJhdyhOLmdldChLKSxMKX0pO0g9dGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gRC5nZXRUb3RhbERyYXdUaW1lKE4uZ2V0KEspLApJKX0pO0g9eC5NYXRoLm1heChILDApO3RoaXMuX2FkZGl0aW9uYWxQYWludChIKX07RC5wcm90b3R5cGUuc2VsZWN0aW9ucz1mdW5jdGlvbihCKXt2YXIgST10aGlzO3ZvaWQgMD09PUImJihCPXRoaXMuZGF0YXNldHMoKSk7aWYoImNhbnZhcyI9PT10aGlzLnJlbmRlcmVyKCkpcmV0dXJuIGwuc2VsZWN0QWxsKCk7dmFyIE49W107Qi5mb3JFYWNoKGZ1bmN0aW9uKE8pe089SS5fZGF0YXNldFRvRHJhd2VyLmdldChPKTtudWxsIT1PJiYoTz1PLmdldFZpc3VhbFByaW1pdGl2ZXMoKSxOLnB1c2guYXBwbHkoTixPKSl9KTtyZXR1cm4gbC5zZWxlY3RBbGwoTil9O0QucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7cmV0dXJuIHRoaXMuX2dldEVudGl0eVN0b3JlKEIpLmVudGl0aWVzKCkubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBJLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoTil9KX07RC5wcm90b3R5cGUuX2dldEVudGl0eVN0b3JlPWZ1bmN0aW9uKEIpe2Z1bmN0aW9uIEkoSCl7cmV0dXJuIE4uX2VudGl0eUJvdW5kcyhIKX0KdmFyIE49dGhpcztpZih2b2lkIDAhPT1CKXt2YXIgTz1uZXcgeC5FbnRpdHlTdG9yZTtPLmFkZEFsbCh0aGlzLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzKEIpLEksdGhpcy5fbG9jYWxPcmlnaW5Cb3VuZHMoKSk7cmV0dXJuIE99dm9pZCAwPT09dGhpcy5fY2FjaGVkRW50aXR5U3RvcmUmJihPPW5ldyB4LkVudGl0eVN0b3JlLE8uYWRkQWxsKHRoaXMuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXModGhpcy5kYXRhc2V0cygpKSxJLHRoaXMuX2xvY2FsT3JpZ2luQm91bmRzKCkpLHRoaXMuX2NhY2hlZEVudGl0eVN0b3JlPU8pO3JldHVybiB0aGlzLl9jYWNoZWRFbnRpdHlTdG9yZX07RC5wcm90b3R5cGUuX2xvY2FsT3JpZ2luQm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJue3RvcExlZnQ6e3g6MCx5OjB9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OnRoaXMuaGVpZ2h0KCl9fX07RC5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbihCKXtCPXRoaXMuX3BpeGVsUG9pbnQoQi5kYXR1bSwKQi5pbmRleCxCLmRhdGFzZXQpO3JldHVybnt4OkIueCx5OkIueSx3aWR0aDowLGhlaWdodDowfX07RC5wcm90b3R5cGUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eT1mdW5jdGlvbihCKXtyZXR1cm57Ym91bmRzOnRoaXMuX2VudGl0eUJvdW5kcyhCKSxjb21wb25lbnQ6Qi5jb21wb25lbnQsZGF0YXNldDpCLmRhdGFzZXQsZGF0YXNldEluZGV4OkIuZGF0YXNldEluZGV4LGRhdHVtOkIuZGF0dW0saW5kZXg6Qi5pbmRleCxwb3NpdGlvbjpCLnBvc2l0aW9uLHNlbGVjdGlvbjpsLnNlbGVjdChCLmRyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVzKClbQi52YWxpZERhdHVtSW5kZXhdKX19O0QucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigicGxvdHMgbXVzdCBpbXBsZW1lbnQgZW50aXRpZXNBdCIpO307RC5wcm90b3R5cGUuZW50aXR5TmVhcmVzdD1mdW5jdGlvbihCKXtCPXRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXR5TmVhcmVzdChCKTsKcmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOnRoaXMuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShCKX07RC5wcm90b3R5cGUuZW50aXRpZXNJbj1mdW5jdGlvbihCLEkpe3JldHVybiB0aGlzLmVudGl0aWVzSW5Cb3VuZHMobnVsbD09ST97eDpCLnRvcExlZnQueCx5OkIudG9wTGVmdC55LHdpZHRoOkIuYm90dG9tUmlnaHQueC1CLnRvcExlZnQueCxoZWlnaHQ6Qi5ib3R0b21SaWdodC55LUIudG9wTGVmdC55fTp7eDpCLm1pbix5OkkubWluLHdpZHRoOkIubWF4LUIubWluLGhlaWdodDpJLm1heC1JLm1pbn0pfTtELnByb3RvdHlwZS5lbnRpdGllc0luQm91bmRzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7aWYoQj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5Cb3VuZHMoQikpcmV0dXJuIEIubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBJLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoTil9KX07RC5wcm90b3R5cGUuZW50aXRpZXNJblhCb3VuZHM9CmZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7aWYoQj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5YQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE4pfSl9O0QucHJvdG90eXBlLmVudGl0aWVzSW5ZQm91bmRzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7aWYoQj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5ZQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE4pfSl9O0QucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihCKXtCLm9mZlVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayk7Qi5vZmZVcGRhdGUodGhpcy5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlKTtCLnJlbW92ZUluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcil9OwpELnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKEIpe0Iub25VcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO0Iub25VcGRhdGUodGhpcy5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlKTtCLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcil9O0QucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm57fX07RC5fc2NhbGVkQWNjZXNzb3I9ZnVuY3Rpb24oQil7dmFyIEk9Qi5zY2FsZSxOPUIuYWNjZXNzb3IsTz1CLnBvc3RTY2FsZSxIPW51bGw9PUk/TjpmdW5jdGlvbihLLE0sTCl7cmV0dXJuIEkuc2NhbGUoTihLLE0sTCkpfTtyZXR1cm4gbnVsbD09Tz9IOmZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTyhIKEssTSxMKSxLLE0sTCl9fTtELnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbigpe3JldHVybnt4OjAseTowfX07RC5wcm90b3R5cGUuX2FuaW1hdGVPbk5leHRSZW5kZXI9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGUmJnRoaXMuX2RhdGFDaGFuZ2VkfTtyZXR1cm4gRH0oZC5Db21wb25lbnQpO2guX0FOSU1BVElPTl9NQVhfRFVSQVRJT049NjAwO2YuUGxvdD1ofSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhwKXtmb3IodmFyIG0gaW4gcClmLmhhc093blByb3BlcnR5KG0pfHwoZlttXT1wW21dKX1kPWgoMTA1KTtmLlRpY2tHZW5lcmF0b3JzPWQ7ayhoKDU0KSk7ayhoKDEwMSkpO2soaCgxMDIpKTtrKGgoMTAzKSk7ayhoKDEwNCkpO2soaCgxMDYpKTt2YXIgdD1oKDU0KSxsPWgoMTEpO2YuaXNUcmFuc2Zvcm1hYmxlPWZ1bmN0aW9uKHApe3JldHVybiBwIGluc3RhbmNlb2YgbC5RdWFudGl0YXRpdmVTY2FsZXx8cCBpbnN0YW5jZW9mIHQuQ2F0ZWdvcnl9fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSx0PWgoMzApLGw9aCgwKSxwPWgoMTIpO2Q9aCgxMCk7Zi5YQWxpZ25tZW50PWQubWFrZUVudW0oWyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiXSk7CmYuWUFsaWdubWVudD1kLm1ha2VFbnVtKFsidG9wIiwiY2VudGVyIiwiYm90dG9tIl0pO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBtKCl7dGhpcy5fb3ZlcmZsb3dIaWRkZW49ITE7dGhpcy5fb3JpZ2luPXt4OjAseTowfTt0aGlzLl94QWxpZ25tZW50PSJsZWZ0Ijt0aGlzLl95QWxpZ25tZW50PSJ0b3AiO3RoaXMuX2lzQW5jaG9yZWQ9dGhpcy5faXNTZXR1cD0hMTt0aGlzLl9jc3NDbGFzc2VzPW5ldyBsLlNldDt0aGlzLl9kZXN0cm95ZWQ9ITE7dGhpcy5fb25BbmNob3JDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dGhpcy5fb25EZXRhY2hDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dGhpcy5fY3NzQ2xhc3Nlcy5hZGQoImNvbXBvbmVudCIpfW0ucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihuKXtuPXAuY29lcmNlRXh0ZXJuYWxEMyhuKTtpZih0aGlzLl9kZXN0cm95ZWQpdGhyb3cgRXJyb3IoIkNhbid0IHJldXNlIGRlc3Ryb3koKS1lZCBDb21wb25lbnRzISIpO3RoaXMuaXNSb290KCkmJgoodGhpcy5fcm9vdEVsZW1lbnQ9bix0aGlzLl9yb290RWxlbWVudC5jbGFzc2VkKCJwbG90dGFibGUiLCEwKSk7bnVsbCE9dGhpcy5fZWxlbWVudD9uLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50Lm5vZGUoKSk6KHRoaXMuX2VsZW1lbnQ9bi5hcHBlbmQoImRpdiIpLHRoaXMuX3NldHVwKCkpO3RoaXMuX2lzQW5jaG9yZWQ9ITA7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25BbmNob3I9ZnVuY3Rpb24obil7dGhpcy5faXNBbmNob3JlZCYmbih0aGlzKTt0aGlzLl9vbkFuY2hvckNhbGxiYWNrcy5hZGQobil9O20ucHJvdG90eXBlLm9mZkFuY2hvcj1mdW5jdGlvbihuKXt0aGlzLl9vbkFuY2hvckNhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7dGhpcy5faXNTZXR1cHx8KHRoaXMuX2Nzc0NsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihxKXtuLl9lbGVtZW50LmNsYXNzZWQocSwKITApfSksdGhpcy5fY3NzQ2xhc3Nlcz1uZXcgbC5TZXQsdGhpcy5fYmFja2dyb3VuZENvbnRhaW5lcj10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiYmFja2dyb3VuZC1jb250YWluZXIiLCEwKSx0aGlzLl9jb250ZW50PXRoaXMuX2VsZW1lbnQuYXBwZW5kKCJzdmciKS5jbGFzc2VkKCJjb250ZW50IiwhMCksdGhpcy5fZm9yZWdyb3VuZENvbnRhaW5lcj10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiZm9yZWdyb3VuZC1jb250YWluZXIiLCEwKSx0aGlzLl9vdmVyZmxvd0hpZGRlbj90aGlzLl9jb250ZW50LmNsYXNzZWQoImNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4iLCEwKTp0aGlzLl9jb250ZW50LmNsYXNzZWQoImNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIiwhMCksdGhpcy5faXNTZXR1cD0hMCl9O20ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7cmV0dXJue21pbldpZHRoOjAsbWluSGVpZ2h0OjB9fTttLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbihuLHEsdSl7aWYobnVsbD09bnx8bnVsbD09cXx8bnVsbD09dSl7aWYobnVsbD09dGhpcy5fZWxlbWVudCl0aHJvdyBFcnJvcigiYW5jaG9yKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNvbXB1dGVMYXlvdXQoKSIpO2lmKG51bGwhPXRoaXMuX3Jvb3RFbGVtZW50KW49e3g6MCx5OjB9LHU9dGhpcy5fcm9vdEVsZW1lbnQubm9kZSgpLHE9bC5ET00uZWxlbWVudFdpZHRoKHUpLHU9bC5ET00uZWxlbWVudEhlaWdodCh1KTtlbHNlIHRocm93IEVycm9yKCJudWxsIGFyZ3VtZW50cyBjYW5ub3QgYmUgcGFzc2VkIHRvIGNvbXB1dGVMYXlvdXQoKSBvbiBhIG5vbi1yb290LCB1bmFuY2hvcmVkIG5vZGUiKTt9dmFyIHg9dGhpcy5fc2l6ZUZyb21PZmZlcihxLHUpLEE9eC5oZWlnaHQ7eD14LndpZHRoO3RoaXMuc2V0Qm91bmRzKHgsQSxuLngrKHEteCkqbS5feEFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3hBbGlnbm1lbnRdLG4ueSsodS1BKSptLl95QWxpZ25Ub1Byb3BvcnRpb25bdGhpcy5feUFsaWdubWVudF0pOwpyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuc2V0Qm91bmRzPWZ1bmN0aW9uKG4scSx1LHgpe3ZvaWQgMD09PXUmJih1PTApO3ZvaWQgMD09PXgmJih4PTApO3RoaXMuX3dpZHRoPW47dGhpcy5faGVpZ2h0PXE7dGhpcy5fb3JpZ2luPXt4OnUseTp4fTtudWxsIT10aGlzLl9lbGVtZW50JiZ0aGlzLl9lbGVtZW50LnN0eWxlcyh7bGVmdDp1KyJweCIsaGVpZ2h0OnErInB4Iix0b3A6eCsicHgiLHdpZHRoOm4rInB4In0pO251bGwhPXRoaXMuX3Jlc2l6ZUhhbmRsZXImJnRoaXMuX3Jlc2l6ZUhhbmRsZXIoe3dpZHRoOm4saGVpZ2h0OnF9KX07bS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24obixxKXt2YXIgdT10aGlzLnJlcXVlc3RlZFNwYWNlKG4scSk7cmV0dXJue3dpZHRoOnRoaXMuZml4ZWRXaWR0aCgpP01hdGgubWluKG4sdS5taW5XaWR0aCk6bixoZWlnaHQ6dGhpcy5maXhlZEhlaWdodCgpP01hdGgubWluKHEsdS5taW5IZWlnaHQpOnF9fTttLnByb3RvdHlwZS5yZW5kZXI9CmZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmMDw9dGhpcy53aWR0aCgpJiYwPD10aGlzLmhlaWdodCgpJiZ0LnJlZ2lzdGVyVG9SZW5kZXIodGhpcyk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJlbmRlckxvd1ByaW9yaXR5PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXIoKX07bS5wcm90b3R5cGUuX3NjaGVkdWxlQ29tcHV0ZUxheW91dD1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJnQucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIodGhpcyl9O20ucHJvdG90eXBlLm9uUmVzaXplPWZ1bmN0aW9uKG4pe3RoaXMuX3Jlc2l6ZUhhbmRsZXI9bjtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmKHRoaXMuaXNSb290KCk/dGhpcy5fc2NoZWR1bGVDb21wdXRlTGF5b3V0KCk6CnRoaXMucGFyZW50KCkucmVkcmF3KCkpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt9O20ucHJvdG90eXBlLnJlbmRlclRvPWZ1bmN0aW9uKG4pe3RoaXMuZGV0YWNoKCk7aWYobnVsbCE9bil7bj0ic3RyaW5nIj09PXR5cGVvZiBuP2suc2VsZWN0KG4pOm4gaW5zdGFuY2VvZiBFbGVtZW50P2suc2VsZWN0KG4pOnAuY29lcmNlRXh0ZXJuYWxEMyhuKTtpZighbi5ub2RlKCl8fG51bGw9PW4ubm9kZSgpLm5vZGVOYW1lKXRocm93IEVycm9yKCJQbG90dGFibGUgcmVxdWlyZXMgYSB2YWxpZCBFbGVtZW50IHRvIHJlbmRlclRvIik7aWYoInN2ZyI9PT1uLm5vZGUoKS5ub2RlTmFtZSl0aHJvdyBFcnJvcigiUGxvdHRhYmxlIDMueCBhbmQgbGF0ZXIgY2FuIG9ubHkgcmVuZGVyVG8gYW4gSFRNTCBjb21wb25lbnQ7IHBhc3MgYSBkaXYgaW5zdGVhZCEiKTt0aGlzLmFuY2hvcihuKX1pZihudWxsPT10aGlzLl9lbGVtZW50KXRocm93IEVycm9yKCJJZiBhIENvbXBvbmVudCBoYXMgbmV2ZXIgYmVlbiByZW5kZXJlZCBiZWZvcmUsIHRoZW4gcmVuZGVyVG8gbXVzdCBiZSBnaXZlbiBhIG5vZGUgdG8gcmVuZGVyIHRvLCBvciBhIGQzLlNlbGVjdGlvbiwgb3IgYSBzZWxlY3RvciBzdHJpbmciKTsKdC5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcih0aGlzKTt0LmZsdXNoKCl9O20ucHJvdG90eXBlLnhBbGlnbm1lbnQ9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5feEFsaWdubWVudDtuPW4udG9Mb3dlckNhc2UoKTtpZihudWxsPT1tLl94QWxpZ25Ub1Byb3BvcnRpb25bbl0pdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIituKTt0aGlzLl94QWxpZ25tZW50PW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUueUFsaWdubWVudD1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl95QWxpZ25tZW50O249bi50b0xvd2VyQ2FzZSgpO2lmKG51bGw9PW0uX3lBbGlnblRvUHJvcG9ydGlvbltuXSl0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgYWxpZ25tZW50OiAiK24pO3RoaXMuX3lBbGlnbm1lbnQ9bjt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5oYXNDbGFzcz1mdW5jdGlvbihuKXtyZXR1cm4gbnVsbD09Cm4/ITE6bnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmhhcyhuKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQobil9O20ucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKG4pe251bGwhPW4mJihudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuYWRkKG4pOnRoaXMuX2VsZW1lbnQuY2xhc3NlZChuLCEwKSl9O20ucHJvdG90eXBlLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKG4pe251bGwhPW4mJihudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuZGVsZXRlKG4pOnRoaXMuX2VsZW1lbnQuY2xhc3NlZChuLCExKSl9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMX07bS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX07bS5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQobnVsbCk7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fZWxlbWVudC5yZW1vdmUoKTt0aGlzLl9pc0FuY2hvcmVkPQohMTt0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vbkRldGFjaD1mdW5jdGlvbihuKXt0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5hZGQobil9O20ucHJvdG90eXBlLm9mZkRldGFjaD1mdW5jdGlvbihuKXt0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLnBhcmVudD1mdW5jdGlvbihuKXtpZih2b2lkIDA9PT1uKXJldHVybiB0aGlzLl9wYXJlbnQ7aWYobnVsbCE9PW4mJiFuLmhhcyh0aGlzKSl0aHJvdyBFcnJvcigiUGFzc2VkIGludmFsaWQgcGFyZW50Iik7dGhpcy5fcGFyZW50PW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmJvdW5kcz1mdW5jdGlvbigpe3ZhciBuPXRoaXMub3JpZ2luKCk7cmV0dXJue3RvcExlZnQ6bixib3R0b21SaWdodDp7eDpuLngrdGhpcy53aWR0aCgpLHk6bi55K3RoaXMuaGVpZ2h0KCl9fX07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2Rlc3Ryb3llZD0KITA7dGhpcy5kZXRhY2goKX07bS5wcm90b3R5cGUud2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd2lkdGh9O20ucHJvdG90eXBlLmhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oZWlnaHR9O20ucHJvdG90eXBlLm9yaWdpbj1mdW5jdGlvbigpe3JldHVybnt4OnRoaXMuX29yaWdpbi54LHk6dGhpcy5fb3JpZ2luLnl9fTttLnByb3RvdHlwZS5vcmlnaW5Ub1Jvb3Q9ZnVuY3Rpb24oKXtmb3IodmFyIG49dGhpcy5vcmlnaW4oKSxxPXRoaXMucGFyZW50KCk7bnVsbCE9cTspe3ZhciB1PXEub3JpZ2luKCk7bi54Kz11Lng7bi55Kz11Lnk7cT1xLnBhcmVudCgpfXJldHVybiBufTttLnByb3RvdHlwZS5yb290PWZ1bmN0aW9uKCl7Zm9yKHZhciBuPXRoaXM7IW4uaXNSb290KCk7KW49bi5wYXJlbnQoKTtyZXR1cm4gbn07bS5wcm90b3R5cGUuaXNSb290PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMucGFyZW50KCl9O20ucHJvdG90eXBlLmZvcmVncm91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZm9yZWdyb3VuZENvbnRhaW5lcn07Cm0ucHJvdG90eXBlLmNvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGVudH07bS5wcm90b3R5cGUuZWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGVtZW50fTttLnByb3RvdHlwZS5yb290RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvb3QoKS5fcm9vdEVsZW1lbnR9O20ucHJvdG90eXBlLmJhY2tncm91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbnRhaW5lcn07cmV0dXJuIG19KCk7ZC5feEFsaWduVG9Qcm9wb3J0aW9uPXtsZWZ0OjAsY2VudGVyOi41LHJpZ2h0OjF9O2QuX3lBbGlnblRvUHJvcG9ydGlvbj17dG9wOjAsY2VudGVyOi41LGJvdHRvbToxfTtmLkNvbXBvbmVudD1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoNTkpKTtrKGgoNjIpKTtrKGgoMTMzKSk7ayhoKDIxKSk7ayhoKDY0KSk7ayhoKDY2KSl9LApmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGssdCl7dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeT1rO3RoaXMuX2NhbnZhc0RyYXdlckZhY3Rvcnk9dH1oLnByb3RvdHlwZS51c2VTVkc9ZnVuY3Rpb24oayl7bnVsbCE9dGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKTt2YXIgdD10aGlzLl9zdmdEcmF3ZXJGYWN0b3J5KCk7dC5hdHRhY2hUbyhrKTt0aGlzLl9jdXJyZW50RHJhd2VyPXR9O2gucHJvdG90eXBlLnVzZUNhbnZhcz1mdW5jdGlvbihrKXtudWxsIT10aGlzLl9jdXJyZW50RHJhd2VyJiZ0aGlzLl9jdXJyZW50RHJhd2VyLnJlbW92ZSgpO3RoaXMuX2N1cnJlbnREcmF3ZXI9dGhpcy5fY2FudmFzRHJhd2VyRmFjdG9yeShrLm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpKX07aC5wcm90b3R5cGUuZ2V0RHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXJ9O2gucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe251bGwhPQp0aGlzLl9jdXJyZW50RHJhd2VyJiZ0aGlzLl9jdXJyZW50RHJhd2VyLnJlbW92ZSgpfTtoLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKGssdCl7dGhpcy5fY3VycmVudERyYXdlci5kcmF3KGssdCl9O2gucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudERyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVzKCl9O2gucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleChrKX07cmV0dXJuIGh9KCk7Zi5Qcm94eURyYXdlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoNzApKTtrKGgoNzEpKX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocCl7dm9pZCAwPT09cCYmKHA9Myk7dChwKTtyZXR1cm4gZnVuY3Rpb24obSl7cmV0dXJuIG0udG9GaXhlZChwKX19CmZ1bmN0aW9uIHQocCl7aWYoMD5wfHwyMDxwKXRocm93IG5ldyBSYW5nZUVycm9yKCJGb3JtYXR0ZXIgcHJlY2lzaW9uIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyMCIpO2lmKHAhPT1NYXRoLmZsb29yKHApKXRocm93IG5ldyBSYW5nZUVycm9yKCJGb3JtYXR0ZXIgcHJlY2lzaW9uIG11c3QgYmUgYW4gaW50ZWdlciIpO312YXIgbD1oKDEpO2YuY3VycmVuY3k9ZnVuY3Rpb24ocCxtLG4pe3ZvaWQgMD09PXAmJihwPTIpO3ZvaWQgMD09PW0mJihtPSIkIik7dm9pZCAwPT09biYmKG49ITApO3ZhciBxPWsocCk7cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciB4PXEoTWF0aC5hYnModSkpOyIiIT09eCYmKHg9bj9tK3g6eCttLDA+dSYmKHg9Ii0iK3gpKTtyZXR1cm4geH19O2YuZml4ZWQ9aztmLmdlbmVyYWw9ZnVuY3Rpb24oKXt2YXIgcDt2b2lkIDA9PT1wJiYocD0zKTt0KHApO3JldHVybiBmdW5jdGlvbihtKXtpZigibnVtYmVyIj09PXR5cGVvZiBtKXt2YXIgbj1NYXRoLnBvdygxMCxwKTtyZXR1cm4gU3RyaW5nKE1hdGgucm91bmQobSoKbikvbil9cmV0dXJuIFN0cmluZyhtKX19O2YuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24ocCl7cmV0dXJuIFN0cmluZyhwKX19O2YucGVyY2VudGFnZT1mdW5jdGlvbihwKXt2b2lkIDA9PT1wJiYocD0wKTt2YXIgbT1rKHApO3JldHVybiBmdW5jdGlvbihuKXt2YXIgcT1uLnRvU3RyaW5nKCk7cT1NYXRoLnBvdygxMCxxLmxlbmd0aC0ocS5pbmRleE9mKCIuIikrMSkpO3JldHVybiBtKHBhcnNlSW50KCgxMDAqbipxKS50b1N0cmluZygpLDEwKS9xKSsiJSJ9fTtmLnNpU3VmZml4PWZ1bmN0aW9uKHApe3ZvaWQgMD09PXAmJihwPTMpO3QocCk7cmV0dXJuIGZ1bmN0aW9uKG0pe3JldHVybiBsLmZvcm1hdCgiLiIrcCsicyIpKG0pfX07Zi5zaG9ydFNjYWxlPWZ1bmN0aW9uKHApe3ZvaWQgMD09PXAmJihwPTMpO3QocCk7dmFyIG09bC5mb3JtYXQoIi4iK3ArImUiKSxuPWwuZm9ybWF0KCIuIitwKyJmIikscT1NYXRoLnBvdygxMCwxOCksdT1NYXRoLnBvdygxMCwtcCk7CnJldHVybiBmdW5jdGlvbih4KXt2YXIgQT1NYXRoLmFicyh4KTtpZigoQTx1fHxBPj1xKSYmMCE9PUEpcmV0dXJuIG0oeCk7Zm9yKHZhciB5PS0xO0E+PU1hdGgucG93KDFFMyx5KzIpJiY0Pnk7KXkrKztBPS0xPT09eT9uKHgpOm4oeC9NYXRoLnBvdygxRTMseSsxKSkrIktNQlRRIlt5XTtpZigwPHgmJiIxMDAwIj09PUEuc3Vic3RyKDAsNCl8fDA+eCYmIi0xMDAwIj09PUEuc3Vic3RyKDAsNSkpND55Pyh5KyssQT1uKHgvTWF0aC5wb3coMUUzLHkrMSkpKyJLTUJUUSJbeV0pOkE9bSh4KTtyZXR1cm4gQX19O2YubXVsdGlUaW1lPWZ1bmN0aW9uKCl7dmFyIHA9W3tzcGVjaWZpZXI6Ii4lTCIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXRNaWxsaXNlY29uZHMoKX19LHtzcGVjaWZpZXI6IjolUyIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXRTZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiIlSTolTSIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09Cm0uZ2V0TWludXRlcygpfX0se3NwZWNpZmllcjoiJUkgJXAiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0SG91cnMoKX19LHtzcGVjaWZpZXI6IiVhICVkIixwcmVkaWNhdGU6ZnVuY3Rpb24obSl7cmV0dXJuIDAhPT1tLmdldERheSgpJiYxIT09bS5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiAlZCIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAxIT09bS5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXRNb250aCgpfX1dO3JldHVybiBmdW5jdGlvbihtKXt2YXIgbj1wLmZpbHRlcihmdW5jdGlvbihxKXtyZXR1cm4gcS5wcmVkaWNhdGUobSl9KTtyZXR1cm4gbC50aW1lRm9ybWF0KDA8bi5sZW5ndGg/blswXS5zcGVjaWZpZXI6IiVZIikobSl9fTtmLnRpbWU9ZnVuY3Rpb24ocCl7cmV0dXJuIGwudGltZUZvcm1hdChwKX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpLHQ9aCgwKTsKZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwocCxtKXt0aGlzLl9yb290PWsuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpO3RoaXMuX2NsYXNzTmFtZT1tO3RoaXMuX3N2Z0VsZW1lbnROYW1lPXB9bC5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihwLG0pe3ZhciBuPXRoaXM7dGhpcy5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzKHApO3ZhciBxPTA7bS5mb3JFYWNoKGZ1bmN0aW9uKHUpe3QuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gbi5fZHJhd1N0ZXAodSl9LHEpO3ErPXUuYW5pbWF0b3IudG90YWxUaW1lKHAubGVuZ3RoKX0pfTtsLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzJiYodGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPXRoaXMuX3NlbGVjdGlvbi5ub2RlcygpKTtyZXR1cm4gdGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzfTsKbC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5nZXRWaXN1YWxQcmltaXRpdmVzKClbcF19O2wucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX3Jvb3QucmVtb3ZlKCl9O2wucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKHApe3Aubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX3Jvb3Qubm9kZSgpKX07bC5wcm90b3R5cGUuZ2V0Um9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fTtsLnByb3RvdHlwZS5zZWxlY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdmdFbGVtZW50TmFtZX07bC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXt9O2wucHJvdG90eXBlLl9jcmVhdGVBbmREZXN0cm95RE9NRWxlbWVudHM9ZnVuY3Rpb24ocCl7cD1wLmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4gbnVsbCE9bX0pO3A9dGhpcy5fcm9vdC5zZWxlY3RBbGwodGhpcy5zZWxlY3RvcigpKS5kYXRhKHApOwp0aGlzLl9zZWxlY3Rpb249cC5lbnRlcigpLmFwcGVuZCh0aGlzLl9zdmdFbGVtZW50TmFtZSkubWVyZ2UocCk7cC5leGl0KCkucmVtb3ZlKCk7dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPW51bGw7bnVsbCE9dGhpcy5fY2xhc3NOYW1lJiZ0aGlzLl9zZWxlY3Rpb24uY2xhc3NlZCh0aGlzLl9jbGFzc05hbWUsITApO3RoaXMuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXModGhpcy5fc2VsZWN0aW9uKX07bC5wcm90b3R5cGUuX2RyYXdTdGVwPWZ1bmN0aW9uKHApe3ZhciBtPXRoaXM7WyJmaWxsIiwic3Ryb2tlIl0uZm9yRWFjaChmdW5jdGlvbihuKXtudWxsIT1wLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3Jbbl0mJm0uX3NlbGVjdGlvbi5hdHRyKG4scC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yW25dKX0pO3AuYW5pbWF0b3IuYW5pbWF0ZSh0aGlzLl9zZWxlY3Rpb24scC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yKTtudWxsIT10aGlzLl9jbGFzc05hbWUmJnRoaXMuX3NlbGVjdGlvbi5jbGFzc2VkKHRoaXMuX2NsYXNzTmFtZSwKITApfTtyZXR1cm4gbH0oKTtmLlNWR0RyYXdlcj1kfSxmdW5jdGlvbihkLGYpe2YubWFrZUVudW09ZnVuY3Rpb24oaCl7cmV0dXJuIGgucmVkdWNlKGZ1bmN0aW9uKGssdCl7a1t0XT10O3JldHVybiBrfSx7fSl9fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG0sbil7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bX1mb3IodmFyIHUgaW4gbiluLmhhc093blByb3BlcnR5KHUpJiYobVt1XT1uW3VdKTttLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihxLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcSl9LHQ9aCgxKSxsPWgoMjYpLHA9aCgwKTtkPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIG4oKXt2YXIgcT1tLmNhbGwodGhpcyl8fHRoaXM7cS5fdGlja0dlbmVyYXRvcj1mdW5jdGlvbih1KXtyZXR1cm4gdS5kZWZhdWx0VGlja3MoKX07cS5fcGFkUHJvcG9ydGlvbj0uMDU7cS5fc25hcHBpbmdEb21haW5FbmFibGVkPQohMDtxLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycz1uZXcgcC5TZXQ7cmV0dXJuIHF9ayhuLG0pO24ucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt0aGlzLl9kb21haW5NYXg9dGhpcy5fZG9tYWluTWluPW51bGw7bS5wcm90b3R5cGUuYXV0b0RvbWFpbi5jYWxsKHRoaXMpfTtuLnByb3RvdHlwZS5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuX2RvbWFpbk1pbiYmbnVsbCE9dGhpcy5fZG9tYWluTWF4KXRoaXMuX3NldERvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1heF0pO2Vsc2V7dmFyIHE9dGhpcy5fZ2V0RXh0ZW50KCk7bnVsbCE9dGhpcy5fZG9tYWluTWluPyhxPXFbMV0sdGhpcy5fZG9tYWluTWluPj1xJiYocT10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1pbl0pWzFdKSx0aGlzLl9zZXREb21haW4oW3RoaXMuX2RvbWFpbk1pbixxXSkpOgpudWxsIT10aGlzLl9kb21haW5NYXg/KHE9cVswXSx0aGlzLl9kb21haW5NYXg8PXEmJihxPXRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKFt0aGlzLl9kb21haW5NYXgsdGhpcy5fZG9tYWluTWF4XSlbMF0pLHRoaXMuX3NldERvbWFpbihbcSx0aGlzLl9kb21haW5NYXhdKSk6bS5wcm90b3R5cGUuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUuY2FsbCh0aGlzKX19O24ucHJvdG90eXBlLl9nZXRVbmJvdW5kZWRFeHRlbnQ9ZnVuY3Rpb24ocSl7dm9pZCAwPT09cSYmKHE9ITEpO3E9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMocSk7dmFyIHU9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1xLmxlbmd0aCYmKHE9W3AuTWF0aC5taW4ocSx1WzBdKSxwLk1hdGgubWF4KHEsdVsxXSldLHU9dGhpcy5fcGFkRG9tYWluKHEpKTtyZXR1cm4gdX07bi5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3ZhciBxPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCgpO251bGwhPXRoaXMuX2RvbWFpbk1pbiYmCihxWzBdPXRoaXMuX2RvbWFpbk1pbik7bnVsbCE9dGhpcy5fZG9tYWluTWF4JiYocVsxXT10aGlzLl9kb21haW5NYXgpO3JldHVybiBxfTtuLnByb3RvdHlwZS5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyPWZ1bmN0aW9uKHEpe3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmFkZChxKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCl9O24ucHJvdG90eXBlLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXI9ZnVuY3Rpb24ocSl7dGhpcy5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnMuZGVsZXRlKHEpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKX07bi5wcm90b3R5cGUucGFkUHJvcG9ydGlvbj1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9wYWRQcm9wb3J0aW9uO2lmKDA+cSl0aHJvdyBFcnJvcigicGFkUHJvcG9ydGlvbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpO3RoaXMuX3BhZFByb3BvcnRpb249cTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7CnJldHVybiB0aGlzfTtuLnByb3RvdHlwZS5fcGFkRG9tYWluPWZ1bmN0aW9uKHEpe3ZhciB1PXRoaXM7aWYocVswXS52YWx1ZU9mKCk9PT1xWzFdLnZhbHVlT2YoKSlyZXR1cm4gdGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4ocSk7aWYoMD09PXRoaXMuX3BhZFByb3BvcnRpb24pcmV0dXJuIHE7dmFyIHg9dGhpcy5fcGFkUHJvcG9ydGlvbi8yLEE9cVswXSx5PXFbMV0sdz0hMSxDPSExO3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24oRCl7RCh1KS5mb3JFYWNoKGZ1bmN0aW9uKEIpe0IudmFsdWVPZigpPT09QS52YWx1ZU9mKCkmJih3PSEwKTtCLnZhbHVlT2YoKT09PXkudmFsdWVPZigpJiYoQz0hMCl9KX0pO3ZhciBHPXRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihxKTtxPXc/QTp0aGlzLmludmVydCh0aGlzLnNjYWxlKEEpLSh0aGlzLnNjYWxlKHkpLXRoaXMuc2NhbGUoQSkpKngpO3g9Qz8KeTp0aGlzLmludmVydCh0aGlzLnNjYWxlKHkpKyh0aGlzLnNjYWxlKHkpLXRoaXMuc2NhbGUoQSkpKngpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihHKTtyZXR1cm4gdGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkP3RoaXMuX25pY2VEb21haW4oW3EseF0pOltxLHhdfTtuLnByb3RvdHlwZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9ZnVuY3Rpb24ocSl7bnVsbCE9cSYmKHRoaXMuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD1xLHRoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSl9O24ucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbihxKXtyZXR1cm4gcX07bi5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydCIpO307bi5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKHEpe251bGwhPXEmJih0aGlzLl9kb21haW5NaW49cVswXSx0aGlzLl9kb21haW5NYXg9cVsxXSk7CnJldHVybiBtLnByb3RvdHlwZS5kb21haW4uY2FsbCh0aGlzLHEpfTtuLnByb3RvdHlwZS5kb21haW5NaW49ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5kb21haW4oKVswXTt0aGlzLl9kb21haW5NaW49cTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmRvbWFpbk1heD1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLmRvbWFpbigpWzFdO3RoaXMuX2RvbWFpbk1heD1xO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24ocSl7cT10LmV4dGVudChxLmZpbHRlcihmdW5jdGlvbih1KXtyZXR1cm4gcC5NYXRoLmlzVmFsaWROdW1iZXIoK3UpfSkpO3JldHVybiBudWxsPT1xWzBdfHxudWxsPT1xWzFdP1tdOnF9O24ucHJvdG90eXBlLnpvb209ZnVuY3Rpb24ocSx1KXt2YXIgeD10aGlzO3RoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAoZnVuY3Rpb24oQSl7cmV0dXJuIHguaW52ZXJ0KGwuem9vbU91dChBLApxLHUpKX0pKX07bi5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHEpe3ZhciB1PXRoaXM7dGhpcy5kb21haW4odGhpcy5yYW5nZSgpLm1hcChmdW5jdGlvbih4KXtyZXR1cm4gdS5pbnZlcnQoeCtxKX0pKX07bi5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZVRyYW5zZm9ybWF0aW9uIik7fTtuLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydGVkVHJhbnNmb3JtYXRpb24iKTt9O24ucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGdldFRyYW5zZm9ybWF0aW9uRXh0ZW50Iik7fTtuLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBnZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiIpOwp9O24ucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHNldFRyYW5zZm9ybWF0aW9uRG9tYWluIik7fTtuLnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHUoeCl7cmV0dXJuIHAuTWF0aC5pc05hTih4KXx8SW5maW5pdHk9PT14fHwtSW5maW5pdHk9PT14fXUocVswXSl8fHUocVsxXSk/cC5XaW5kb3cud2FybigiV2FybmluZzogUXVhbnRpdGF0aXZlU2NhbGVzIGNhbm5vdCB0YWtlIE5hTiBvciBJbmZpbml0eSBhcyBhIGRvbWFpbiB2YWx1ZS4gSWdub3JpbmcuIik6bS5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMscSl9O24ucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0RGVmYXVsdFRpY2tzIik7fTtuLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90aWNrR2VuZXJhdG9yKHRoaXMpfTsKbi5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX25pY2VEb21haW4iKTt9O24ucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9kZWZhdWx0RXh0ZW50Iik7fTtuLnByb3RvdHlwZS50aWNrR2VuZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIHE9UGxvdHRhYmxlLlNjYWxlcy5UaWNrR2VuZXJhdG9ycy5pbnRlZ2VyVGlja0dlbmVyYXRvcigpO251bGwhPXEmJih0aGlzLl90aWNrR2VuZXJhdG9yPXEpfTtyZXR1cm4gbn0oaCgxNykuU2NhbGUpO2QuX0RFRkFVTFRfTlVNX1RJQ0tTPTEwO2YuUXVhbnRpdGF0aXZlU2NhbGU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMSk7Zi5jb2VyY2VFeHRlcm5hbEQzPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQuYXR0cnMpe2lmKG51bGw9PXQubm9kZXMpe3ZhciBsPVtdO3QuZWFjaChmdW5jdGlvbigpe2wucHVzaCh0aGlzKX0pOwpyZXR1cm4gay5zZWxlY3RBbGwobCl9cmV0dXJuIGsuc2VsZWN0QWxsKHQubm9kZXMoKSl9cmV0dXJuIHR9fSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoODMpKTtrKGgoODQpKTtrKGgoODUpKX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDQ0KSk7ayhoKDQ1KSk7ayhoKDQ2KSk7ayhoKDE4KSk7ayhoKDYpKTtrKGgoMzMpKTtrKGgoMzQpKTtrKGgoNDcpKTtrKGgoOSkpO2soaCg0OCkpfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKCl7dmFyIGs9dGhpczt0aGlzLl9hbmNob3JDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gay5fYW5jaG9yKHQpfTt0aGlzLl9lbmFibGVkPSEwfWgucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKGspe3RoaXMuX2Rpc2Nvbm5lY3QoKTsKdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbz1rO3RoaXMuX2Nvbm5lY3QoKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuZGV0YWNoRnJvbT1mdW5jdGlvbigpe3RoaXMuZGV0YWNoKCl9O2gucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuX2Rpc2Nvbm5lY3QoKTt0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvPW51bGw7cmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmVuYWJsZWQ9ZnVuY3Rpb24oayl7aWYobnVsbD09aylyZXR1cm4gdGhpcy5fZW5hYmxlZDsodGhpcy5fZW5hYmxlZD1rKT90aGlzLl9jb25uZWN0KCk6dGhpcy5fZGlzY29ubmVjdCgpO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZD0hMH07aC5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZD0hMX07aC5wcm90b3R5cGUuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2U9ZnVuY3Rpb24oayl7dmFyIHQ9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vcmlnaW5Ub1Jvb3QoKTsKcmV0dXJue3g6ay54LXQueCx5OmsueS10Lnl9fTtoLnByb3RvdHlwZS5faXNJbnNpZGVDb21wb25lbnQ9ZnVuY3Rpb24oayl7cmV0dXJuIDA8PWsueCYmMDw9ay55JiZrLng8PXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ud2lkdGgoKSYmay55PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtoLnByb3RvdHlwZS5fY29ubmVjdD1mdW5jdGlvbigpe2lmKHRoaXMuZW5hYmxlZCgpJiZudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiYhdGhpcy5faXNBbmNob3JlZCl0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9uQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKX07aC5wcm90b3R5cGUuX2Rpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl91bmFuY2hvcigpO251bGwhPXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8mJnRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub2ZmQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKX07cmV0dXJuIGh9KCk7CmYuSW50ZXJhY3Rpb249ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMyksbD1oKDApLHA9aCg1MiksbT1oKDIpO2Q9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSgpe3ZhciB1PW4uY2FsbCh0aGlzKXx8dGhpczt1Ll9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSExO3UuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITE7dS5fZGVmZXJyZWRSZW5kZXJpbmc9ITE7dS5fYXBwbHlEZWZlcnJlZFJlbmRlcmluZ1RyYW5zZm9ybT1mdW5jdGlvbih4LEEseSx3KXt1Ll9pc0FuY2hvcmVkJiYobnVsbCE9dS5fcmVuZGVyQXJlYSYmdS5fcmVuZGVyQXJlYS5hdHRyKCJ0cmFuc2Zvcm0iLAoidHJhbnNsYXRlKCIreCsiLCAiK0ErIikgc2NhbGUoIit5KyIsICIrdysiKSIpLG51bGwhPXUuX2NhbnZhcyYmdS5fY2FudmFzLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit4KyJweCwgIitBKyJweCkgc2NhbGUoIit5KyIsICIrdysiKSIpKX07dS5hZGRDbGFzcygieHktcGxvdCIpO3UuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdS5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVgoKX07dS5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiB1Ll9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpfTt1Ll9yZW5kZXJDYWxsYmFjaz1mdW5jdGlvbigpe2lmKHUuZGVmZXJyZWRSZW5kZXJpbmcoKSl7dmFyIHg9dS54KCkmJnUueCgpLnNjYWxlLEE9dS55KCkmJnUueSgpLnNjYWxlO3UuX2RlZmVycmVkUmVuZGVyZXIudXBkYXRlRG9tYWlucyh4LEEpfWVsc2UgdS5yZW5kZXIoKX07CnUuX2RlZmVycmVkUmVuZGVyZXI9bmV3IHAuRGVmZXJyZWRSZW5kZXJlcihmdW5jdGlvbigpe3JldHVybiB1LnJlbmRlcigpfSx1Ll9hcHBseURlZmVycmVkUmVuZGVyaW5nVHJhbnNmb3JtKTtyZXR1cm4gdX1rKHEsbik7cS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5kZWZlcnJlZFJlbmRlcmluZygpJiZ0aGlzLl9kZWZlcnJlZFJlbmRlcmVyLnJlc2V0VHJhbnNmb3JtcygpO3JldHVybiBuLnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKX07cS5wcm90b3R5cGUuZGVmZXJyZWRSZW5kZXJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmZXJyZWRSZW5kZXJpbmd9O3EucHJvdG90eXBlLng9ZnVuY3Rpb24odSx4LEEpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHEuX1hfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkocS5fWF9LRVksdSx4LEEpO3U9dGhpcy53aWR0aCgpO251bGwhPXgmJm51bGwhPXUmJngucmFuZ2UoWzAsdV0pOwp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS55PWZ1bmN0aW9uKHUseCxBKXtpZihudWxsPT11KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChxLl9ZX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHEuX1lfS0VZLHUseCxBKTt1PXRoaXMuaGVpZ2h0KCk7bnVsbCE9eCYmbnVsbCE9dSYmKHggaW5zdGFuY2VvZiB0LkNhdGVnb3J5P3gucmFuZ2UoWzAsdV0pOngucmFuZ2UoW3UsMF0pKTt0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24odSl7cmV0dXJuIngiPT09dSYmdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj90aGlzLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSgieSIpOgoieSI9PT11JiZ0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluP3RoaXMuX21ha2VGaWx0ZXJCeVByb3BlcnR5KCJ4Iik6bnVsbH07cS5wcm90b3R5cGUuX21ha2VGaWx0ZXJCeVByb3BlcnR5PWZ1bmN0aW9uKHUpe3U9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQodSk7aWYobnVsbCE9dSl7dmFyIHg9dS5hY2Nlc3NvcixBPXUuc2NhbGU7aWYobnVsbCE9QSlyZXR1cm4gZnVuY3Rpb24oeSx3LEMpe3ZhciBHPUEucmFuZ2UoKTtyZXR1cm4gbC5NYXRoLmluUmFuZ2UoQS5zY2FsZSh4KHksdyxDKSksR1swXSxHWzFdKX19cmV0dXJuIG51bGx9O3EucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbih1LHgpe24ucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsdSx4KTt1Lm9mZlVwZGF0ZSh4PT09cS5fWF9LRVk/dGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjazp0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKX07CnEucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24odSx4KXtuLnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5LmNhbGwodGhpcyx1LHgpO3Uub25VcGRhdGUoeD09PXEuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9O3EucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy54KCkuc2NhbGUmJnRoaXMueCgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrKTt0aGlzLnkoKS5zY2FsZSYmdGhpcy55KCkuc2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2spO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4/CiJ4Ijp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPyJ5Ijoibm9uZSI7c3dpdGNoKHUpe2Nhc2UgIngiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITA7dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMTt0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpO2JyZWFrO2Nhc2UgInkiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITE7dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMDt0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWCgpO2JyZWFrO2Nhc2UgIm5vbmUiOnRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJJbnZhbGlkIHNjYWxlIG5hbWUgJyIrdSsiJywgbXVzdCBiZSAneCcsICd5JyBvciAnbm9uZSciKTt9cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24odSx4LEEpe24ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLAp1LHgsQSk7dT0odT10aGlzLngoKSkmJnUuc2NhbGU7bnVsbCE9dSYmdS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTt1PSh1PXRoaXMueSgpKSYmdS5zY2FsZTtudWxsIT11JiYodSBpbnN0YW5jZW9mIHQuQ2F0ZWdvcnk/dS5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSk6dS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSkpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy54KCkuc2NhbGU7bnVsbCE9dSYmdS5hdXRvRG9tYWluKCl9O3EucHJvdG90eXBlLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW49ZnVuY3Rpb24oKXt2YXIgdT10aGlzLnkoKS5zY2FsZTtudWxsIT11JiZ1LmF1dG9Eb21haW4oKX07cS5wcm90b3R5cGUuc2hvd0FsbERhdGE9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKTtyZXR1cm4gdGhpc307CnEucHJvdG90eXBlLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWD1mdW5jdGlvbigpe3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpJiZ0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKX07cS5wcm90b3R5cGUuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZPWZ1bmN0aW9uKCl7dGhpcy5fcHJvamVjdG9yc1JlYWR5KCkmJnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4mJnRoaXMuX3VwZGF0ZVhFeHRlbnRzQW5kQXV0b2RvbWFpbigpfTtxLnByb3RvdHlwZS5fcHJvamVjdG9yc1JlYWR5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy54KCkseD10aGlzLnkoKTtyZXR1cm4gbnVsbCE9dSYmbnVsbCE9dS5hY2Nlc3NvciYmbnVsbCE9eCYmbnVsbCE9eC5hY2Nlc3Nvcn07cS5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24odSx4LEEpe3ZhciB5PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHc9bS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7CnJldHVybnt4OnkodSx4LEEpLHk6dyh1LHgsQSl9fTtxLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHUoeSx3LEMpe3ZhciBHPW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC54KCkpKHksdyxDKTt5PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC55KCkpKHksdyxDKTtyZXR1cm4gbC5NYXRoLmlzVmFsaWROdW1iZXIoRykmJmwuTWF0aC5pc1ZhbGlkTnVtYmVyKHkpfXZhciB4PXRoaXMsQT1uLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdy5jYWxsKHRoaXMpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKHkpe0Euc2V0KHksQS5nZXQoeSkuZmlsdGVyKGZ1bmN0aW9uKHcsQyl7cmV0dXJuIHUodyxDLHkpfSkpfSk7cmV0dXJuIEF9O3JldHVybiBxfShtLlBsb3QpO2QuX1hfS0VZPSJ4IjtkLl9ZX0tFWT0ieSI7Zi5YWVBsb3Q9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0KITA7dGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMTt0aGlzLl91cGRhdGVJZD0wO3RoaXMuX2NhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycz1uZXcgay5TZXR9dC5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX07dC5wcm90b3R5cGUuX2dldEFsbEluY2x1ZGVkVmFsdWVzPWZ1bmN0aW9uKGwpe3ZhciBwPXRoaXM7dm9pZCAwPT09bCYmKGw9ITEpO3ZhciBtPVtdO3RoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24obil7bj1uKHAsbCk7bT1tLmNvbmNhdChuKX0pO3JldHVybiBtfTt0LnByb3RvdHlwZS5fZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuW119O3QucHJvdG90eXBlLm9uVXBkYXRlPWZ1bmN0aW9uKGwpe3RoaXMuX2NhbGxiYWNrcy5hZGQobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLm9mZlVwZGF0ZT1mdW5jdGlvbihsKXt0aGlzLl9jYWxsYmFja3MuZGVsZXRlKGwpOwpyZXR1cm4gdGhpc307dC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQrKzt0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX07dC5wcm90b3R5cGUuYXV0b0RvbWFpbj1mdW5jdGlvbigpe3RoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5PSEwO3RoaXMuX3NldERvbWFpbih0aGlzLl9nZXRFeHRlbnQoKSl9O3QucHJvdG90eXBlLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlPWZ1bmN0aW9uKCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHkmJnRoaXMuYXV0b0RvbWFpbigpfTt0LnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZSIpO307dC5wcm90b3R5cGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07dC5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX2dldERvbWFpbigpOwp0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0hMTt0aGlzLl9zZXREb21haW4obCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERvbWFpbiIpO307dC5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihsKXt0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzfHwodGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMCx0aGlzLl9iYWNraW5nU2NhbGVEb21haW4obCksdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKSx0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzPSExKX07dC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfYmFja2luZ0RvbWFpbiIpO307dC5wcm90b3R5cGUucmFuZ2U9ZnVuY3Rpb24obCl7aWYobnVsbD09bClyZXR1cm4gdGhpcy5fZ2V0UmFuZ2UoKTsKdGhpcy5fc2V0UmFuZ2UobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0UmFuZ2UiKTt9O3QucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfc2V0UmFuZ2UiKTt9O3QucHJvdG90eXBlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24obCl7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuYWRkKGwpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUucmVtb3ZlSW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbihsKXt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5kZWxldGUobCk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpfTt0LnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH07CnJldHVybiB0fSgpO2YuU2NhbGU9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocSx1LHgsQSl7Zm9yKHZhciB5PXt9LHc9MDt3PHUubGVuZ3RoO3crKyl7dmFyIEM9dVt3XTtxLmhhc093blByb3BlcnR5KEMpJiYoeVtDXT1xW0NdKHgsQSkpfXJldHVybiB5fWZ1bmN0aW9uIHQocSl7cmV0dXJuKG51bGwhPXFbInN0cm9rZS1vcGFjaXR5Il0/cGFyc2VGbG9hdChxWyJzdHJva2Utb3BhY2l0eSJdKToxKSoobnVsbCE9cS5vcGFjaXR5P3BhcnNlRmxvYXQocS5vcGFjaXR5KToxKX1mdW5jdGlvbiBsKHEpe3JldHVybihudWxsIT1xWyJmaWxsLW9wYWNpdHkiXT9wYXJzZUZsb2F0KHFbImZpbGwtb3BhY2l0eSJdKToxKSoobnVsbCE9cS5vcGFjaXR5P3BhcnNlRmxvYXQocS5vcGFjaXR5KToxKX1mdW5jdGlvbiBwKHEpe3JldHVybiBudWxsIT1xWyJzdHJva2Utd2lkdGgiXT9wYXJzZUZsb2F0KHFbInN0cm9rZS13aWR0aCJdKToxfWZ1bmN0aW9uIG0ocSx1KXtpZih1LnN0cm9rZSl7cS5saW5lV2lkdGg9CnAodSk7dmFyIHg9bi5jb2xvcih1LnN0cm9rZSk7eC5vcGFjaXR5Kj10KHUpO3Euc3Ryb2tlU3R5bGU9eC50b1N0cmluZygpO3Euc3Ryb2tlKCl9dS5maWxsJiYoeD1uLmNvbG9yKHUuZmlsbCkseC5vcGFjaXR5Kj1sKHUpLHEuZmlsbFN0eWxlPXgudG9TdHJpbmcoKSxxLmZpbGwoKSl9dmFyIG49aCgxKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcSh1LHgpe3RoaXMuX2NvbnRleHQ9dTt0aGlzLl9kcmF3U3RlcD14fXEucHJvdG90eXBlLmdldERyYXdTdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYXdTdGVwfTtxLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHUseCl7eD14W3gubGVuZ3RoLTFdLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3I7dGhpcy5fY29udGV4dC5zYXZlKCk7dGhpcy5fZHJhd1N0ZXAodGhpcy5fY29udGV4dCx1LHgpO3RoaXMuX2NvbnRleHQucmVzdG9yZSgpfTtxLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3EucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9CmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9O3EucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe307cmV0dXJuIHF9KCk7Zi5DYW52YXNEcmF3ZXI9ZDtmLkNvbnRleHRTdHlsZUF0dHJzPSJmaWxsLW9wYWNpdHkgZmlsbCBvcGFjaXR5IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCBzdHJva2UiLnNwbGl0KCIgIik7Zi5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXM9ZnVuY3Rpb24ocSx1LHgsQSl7cmV0dXJuIGsocSxmLkNvbnRleHRTdHlsZUF0dHJzLmNvbmNhdCh1KSx4LEEpfTtmLnJlc29sdmVBdHRyaWJ1dGVzPWs7Zi5nZXRTdHJva2VXaWR0aD1wO2YucmVuZGVyQXJlYT1mdW5jdGlvbihxLHUseCxBKXtxLnNhdmUoKTtxLmJlZ2luUGF0aCgpO3UuY29udGV4dChxKTt1KHgpO3EubGluZUpvaW49InJvdW5kIjttKHEsQSk7cS5yZXN0b3JlKCl9O2YucmVuZGVyTGluZT1mdW5jdGlvbihxLHUseCxBKXtxLnNhdmUoKTtxLmJlZ2luUGF0aCgpO3UuY29udGV4dChxKTt1KHgpOwpxLmxpbmVKb2luPSJyb3VuZCI7bShxLEEpO3EucmVzdG9yZSgpfTtmLnJlbmRlclBhdGhXaXRoU3R5bGU9bX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDUwKSk7ayhoKDI3KSk7ayhoKDUxKSk7ayhoKDkzKSk7ayhoKDUzKSk7ayhoKDk0KSk7ayhoKDk1KSk7ayhoKDk2KSk7ayhoKDk3KSk7ayhoKDk4KSk7ayhoKDk5KSk7ayhoKDEwMCkpfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoOTIpKTtrKGgoOTEpKTtkPWgoNDkpO2Yuc2lnbj1kLnNpZ259LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgxMzQpKTtrKGgoMTM1KSk7ayhoKDEzNikpO2soaCgxMzcpKX0sZnVuY3Rpb24oZCwKZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgeCBpbiBxKXEuaGFzT3duUHJvcGVydHkoeCkmJihuW3hdPXFbeF0pO24ucHJvdG90eXBlPW51bGw9PT1xP09iamVjdC5jcmVhdGUocSk6KHUucHJvdG90eXBlPXEucHJvdG90eXBlLG5ldyB1KX0sdD1oKDEpLGw9aCg1KTtkPWgoNCk7dmFyIHA9aCg4KSxtPWgoMCk7aD1oKDEwKTtmLkF4aXNPcmllbnRhdGlvbj1oLm1ha2VFbnVtKFsiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwidG9wIl0pO2g9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSh1LHgpe3ZhciBBPW4uY2FsbCh0aGlzKXx8dGhpcztBLl9lbmRUaWNrTGVuZ3RoPTU7QS5faW5uZXJUaWNrTGVuZ3RoPTU7QS5fdGlja0xhYmVsUGFkZGluZz0xMDtBLl9tYXJnaW49MTU7QS5fc2hvd0VuZFRpY2tMYWJlbHM9ITE7QS5fYW5ub3RhdGlvbnNFbmFibGVkPSExO0EuX2Fubm90YXRpb25UaWVyQ291bnQ9CjE7aWYobnVsbD09dXx8bnVsbD09eCl0aHJvdyBFcnJvcigiQXhpcyByZXF1aXJlcyBhIHNjYWxlIGFuZCBvcmllbnRhdGlvbiIpO0EuX3NjYWxlPXU7QS5vcmllbnRhdGlvbih4KTtBLl9zZXREZWZhdWx0QWxpZ25tZW50KCk7QS5hZGRDbGFzcygiYXhpcyIpO0EuaXNIb3Jpem9udGFsKCk/QS5hZGRDbGFzcygieC1heGlzIik6QS5hZGRDbGFzcygieS1heGlzIik7QS5mb3JtYXR0ZXIocC5pZGVudGl0eSgpKTtBLl9yZXNjYWxlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gQS5fcmVzY2FsZSgpfTtBLl9zY2FsZS5vblVwZGF0ZShBLl9yZXNjYWxlQ2FsbGJhY2spO0EuX2Fubm90YXRlZFRpY2tzPVtdO0EuX2Fubm90YXRpb25Gb3JtYXR0ZXI9cC5pZGVudGl0eSgpO3JldHVybiBBfWsocSxuKTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZXNjYWxlQ2FsbGJhY2spfTsKcS5wcm90b3R5cGUudGlja0xhYmVsRGF0YU9uRWxlbWVudD1mdW5jdGlvbih1KXtpZihudWxsIT11KXtmb3IodmFyIHg7bnVsbCE9dSYmdS5jbGFzc0xpc3QmJnZvaWQgMD09PXg7KXUuY2xhc3NMaXN0LmNvbnRhaW5zKHEuVElDS19MQUJFTF9DTEFTUyk/eD11OnU9dS5wYXJlbnROb2RlO3JldHVybiB2b2lkIDA9PT11P3ZvaWQgMDp0LnNlbGVjdCh1KS5kYXR1bSgpfX07cS5wcm90b3R5cGUuX2NvbXB1dGVXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKX07cS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCl9O3EucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7dmFyIHU9MCx4PTA7aWYodGhpcy5pc0hvcml6b250YWwoKSl7aWYoeD10aGlzLl9jb21wdXRlSGVpZ2h0KCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciBBPQp0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKnEuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORzt4Kz1BKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpfX1lbHNlIHU9dGhpcy5fY29tcHV0ZVdpZHRoKCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkmJihBPXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqcS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HLHUrPUEqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCkpO3JldHVybnttaW5XaWR0aDp1LG1pbkhlaWdodDp4fX07cS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKX07cS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzSG9yaXpvbnRhbCgpfTtxLnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9O3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHUseCxBKXtuLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyx1LHgsQSk7dGhpcy5pc0hvcml6b250YWwoKT90aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLl9zY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHUseCl7dmFyIEE9dGhpcy5yZXF1ZXN0ZWRTcGFjZSh1LHgpO3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbCgpP3t3aWR0aDp1LGhlaWdodDpBLm1pbkhlaWdodH06e2hlaWdodDp4LHdpZHRoOkEubWluV2lkdGh9fTtxLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90aWNrTWFya0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuVElDS19NQVJLX0NMQVNTKyItY29udGFpbmVyIiwhMCk7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyPQp0aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuVElDS19MQUJFTF9DTEFTUysiLWNvbnRhaW5lciIsITApO3RoaXMuX2Jhc2VsaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiwhMCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiwhMCk7dmFyIHU9dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWxhYmVsLWNvbnRhaW5lciIsCiEwKTt1PW5ldyBsLlN2Z0NvbnRleHQodS5ub2RlKCkpO3RoaXMuX2Fubm90YXRpb25NZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHUpO3RoaXMuX2Fubm90YXRpb25Xcml0ZXI9bmV3IGwuV3JpdGVyKHRoaXMuX2Fubm90YXRpb25NZWFzdXJlcix1KX07cS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX07cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdT10aGlzLl9nZXRUaWNrVmFsdWVzKCkseD10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19NQVJLX0NMQVNTKS5kYXRhKHUpLEE9eC5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQocS5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKHgpO0EuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCkpO3Quc2VsZWN0KEEubm9kZXMoKVswXSkuY2xhc3NlZChxLkVORF9USUNLX01BUktfQ0xBU1MsITApLmF0dHJzKHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCghMCkpOwp0LnNlbGVjdChBLm5vZGVzKClbdS5sZW5ndGgtMV0pLmNsYXNzZWQocS5FTkRfVElDS19NQVJLX0NMQVNTLCEwKS5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goITApKTt4LmV4aXQoKS5yZW1vdmUoKTt0aGlzLl9iYXNlbGluZS5hdHRycyh0aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKSk7dGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTp0aGlzLl9yZW1vdmVBbm5vdGF0aW9ucygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hbm5vdGF0ZWRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0ZWRUaWNrc307cS5wcm90b3R5cGUuYW5ub3RhdGlvbkZvcm1hdHRlcj1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9hbm5vdGF0aW9uRm9ybWF0dGVyO3RoaXMuX2Fubm90YXRpb25Gb3JtYXR0ZXI9dTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hbm5vdGF0aW9uc0VuYWJsZWQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25zRW5hYmxlZH07cS5wcm90b3R5cGUuYW5ub3RhdGlvblRpZXJDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uVGllckNvdW50fTtxLnByb3RvdHlwZS5fZHJhd0Fubm90YXRpb25zPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdShhYSl7c3dpdGNoKEMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpjYXNlICJyaWdodCI6cmV0dXJuIHkoYWEpO2Nhc2UgInRvcCI6Y2FzZSAibGVmdCI6cmV0dXJuIHkoYWEpLUQuZ2V0KGFhKS5oZWlnaHR9fWZ1bmN0aW9uIHgoYWEpe3JldHVybiBPLmhhcyhhYSk/ImhpZGRlbiI6InZpc2libGUifWZ1bmN0aW9uIEEoYWEpe3JldHVybiBDLl9zY2FsZS5zY2FsZShhYSl9ZnVuY3Rpb24geShhYSl7c3dpdGNoKEMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpjYXNlICJyaWdodCI6cmV0dXJuIE4uZ2V0KGFhKSpJK0s7Y2FzZSAidG9wIjpjYXNlICJsZWZ0IjpyZXR1cm4gSC0KSy1OLmdldChhYSkqSX19ZnVuY3Rpb24gdyhhYSxsYSxaKXthYT1hYS5zZWxlY3RBbGwoIi4iK1opLmRhdGEoQik7bGE9YWEuZW50ZXIoKS5hcHBlbmQobGEpLmNsYXNzZWQoWiwhMCkubWVyZ2UoYWEpO2FhLmV4aXQoKS5yZW1vdmUoKTtyZXR1cm4gbGF9dmFyIEM9dGhpcyxHPXEuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyxEPW5ldyBtLk1hcCxCPXRoaXMuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXIoKTtCLmZvckVhY2goZnVuY3Rpb24oYWEpe3ZhciBsYT1DLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZShDLmFubm90YXRpb25Gb3JtYXR0ZXIoKShhYSkpO0Quc2V0KGFhLHt3aWR0aDpsYS53aWR0aCsyKkcsaGVpZ2h0OmxhLmhlaWdodCsyKkd9KX0pO3ZhciBJPXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqRyxOPXRoaXMuX2Fubm90YXRpb25Ub1RpZXIoRCksTz1uZXcgbS5TZXQsSD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6CnRoaXMud2lkdGgoKSxLPXRoaXMuX2NvcmVTaXplKCksTT1NYXRoLm1pbih0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSxNYXRoLmZsb29yKChILUspL0kpKTtOLmZvckVhY2goZnVuY3Rpb24oYWEsbGEpeygtMT09PWFhfHxhYT49TSkmJk8uYWRkKGxhKX0pO3N3aXRjaCh0aGlzLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnZhciBMPTA7YnJlYWs7Y2FzZSAidG9wIjpMPXRoaXMuaGVpZ2h0KCk7YnJlYWs7Y2FzZSAibGVmdCI6TD10aGlzLndpZHRoKCl9dmFyIFE9dGhpcy5pc0hvcml6b250YWwoKTt3KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIpLCJsaW5lIixxLkFOTk9UQVRJT05fTElORV9DTEFTUykuYXR0cnMoe3gxOlE/QTpMLHgyOlE/QTp5LHkxOlE/TDpBLHkyOlE/eTpBLHZpc2liaWxpdHk6eH0pO3codGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLWNpcmNsZS1jb250YWluZXIiKSwKImNpcmNsZSIscS5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUykuYXR0cnMoe2N4OlE/QTpMLGN5OlE/TDpBLHI6M30pO3codGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiksInJlY3QiLHEuQU5OT1RBVElPTl9SRUNUX0NMQVNTKS5hdHRycyh7eDpRP0E6dSx5OlE/dTpBLHdpZHRoOlE/ZnVuY3Rpb24oYWEpe3JldHVybiBELmdldChhYSkud2lkdGh9OmZ1bmN0aW9uKGFhKXtyZXR1cm4gRC5nZXQoYWEpLmhlaWdodH0saGVpZ2h0OlE/ZnVuY3Rpb24oYWEpe3JldHVybiBELmdldChhYSkuaGVpZ2h0fTpmdW5jdGlvbihhYSl7cmV0dXJuIEQuZ2V0KGFhKS53aWR0aH0sdmlzaWJpbGl0eTp4fSk7dmFyIFQ9dGhpcy5fYW5ub3RhdGlvbldyaXRlcixYPXRoaXMuYW5ub3RhdGlvbkZvcm1hdHRlcigpO0w9dyh0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdCgiLmFubm90YXRpb24tbGFiZWwtY29udGFpbmVyIiksImciLHEuQU5OT1RBVElPTl9MQUJFTF9DTEFTUyk7Ckwuc2VsZWN0QWxsKCIudGV4dC1jb250YWluZXIiKS5yZW1vdmUoKTtMLmF0dHJzKHt0cmFuc2Zvcm06ZnVuY3Rpb24oYWEpe3ZhciBsYT1RP0EoYWEpOnUoYWEpO2FhPVE/dShhYSk6QShhYSk7cmV0dXJuInRyYW5zbGF0ZSgiK2xhKyIsIithYSsiKSJ9LHZpc2liaWxpdHk6eH0pLmVhY2goZnVuY3Rpb24oYWEpe1Qud3JpdGUoWChhYSksUT9ELmdldChhYSkud2lkdGg6RC5nZXQoYWEpLmhlaWdodCxRP0QuZ2V0KGFhKS5oZWlnaHQ6RC5nZXQoYWEpLndpZHRoLHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIiLHRleHRSb3RhdGlvbjpRPzA6OTB9LHQuc2VsZWN0KHRoaXMpLm5vZGUoKSl9KX07cS5wcm90b3R5cGUuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdT10aGlzLHg9dGhpcy5fc2NhbGUucmFuZ2UoKTtyZXR1cm4gbS5BcnJheS51bmlxKHRoaXMuYW5ub3RhdGVkVGlja3MoKS5maWx0ZXIoZnVuY3Rpb24oQSl7cmV0dXJuIG51bGw9PUE/ITE6bS5NYXRoLmluUmFuZ2UodS5fc2NhbGUuc2NhbGUoQSksCnhbMF0seFsxXSl9KSl9O3EucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB1PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCkseD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX2NvbXB1dGVIZWlnaHQoKTp0aGlzLl9jb21wdXRlV2lkdGgoKTtyZXR1cm4gTWF0aC5taW4oeCx1KX07cS5wcm90b3R5cGUuX2Fubm90YXRpb25UaWVySGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqcS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HfTtxLnByb3RvdHlwZS5fYW5ub3RhdGlvblRvVGllcj1mdW5jdGlvbih1KXt2YXIgeD10aGlzLEE9W1tdXSx5PW5ldyBtLk1hcCx3PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCk7dGhpcy5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcigpLmZvckVhY2goZnVuY3Rpb24oQyl7dmFyIEc9eC5fc2NhbGUuc2NhbGUoQyksCkQ9dS5nZXQoQykud2lkdGg7aWYoMD5HfHxHK0Q+dyl5LnNldChDLC0xKTtlbHNle2Zvcih2YXIgQj1mdW5jdGlvbihOKXtyZXR1cm4gQVtOXS5zb21lKGZ1bmN0aW9uKE8pe3ZhciBIPXguX3NjYWxlLnNjYWxlKE8pO089dS5nZXQoTykud2lkdGg7cmV0dXJuIEcrRD49SCYmRzw9SCtPfSl9LEk9MDtCKEkpOylJKyssQS5sZW5ndGg9PT1JJiZBLnB1c2goW10pO0FbSV0ucHVzaChDKTt5LnNldChDLEkpfX0pO3JldHVybiB5fTtxLnByb3RvdHlwZS5fcmVtb3ZlQW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGluZSIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1jaXJjbGUiKS5yZW1vdmUoKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tcmVjdCIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1sYWJlbCIpLnJlbW92ZSgpfTsKcS5wcm90b3R5cGUuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaD1mdW5jdGlvbigpe3ZhciB1PXt4MTowLHkxOjAseDI6MCx5MjowfTtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dS54Mj10aGlzLndpZHRoKCk7YnJlYWs7Y2FzZSAidG9wIjp1LngyPXRoaXMud2lkdGgoKTt1LnkxPXRoaXMuaGVpZ2h0KCk7dS55Mj10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UgImxlZnQiOnUueDE9dGhpcy53aWR0aCgpO3UueDI9dGhpcy53aWR0aCgpO3UueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlICJyaWdodCI6dS55Mj10aGlzLmhlaWdodCgpfXJldHVybiB1fTtxLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHgodyl7cmV0dXJuIEEuX3NjYWxlLnNjYWxlKHcpfXZhciBBPXRoaXM7dm9pZCAwPT09dSYmKHU9ITEpO3ZhciB5PXt4MTowLHkxOjAseDI6MCx5MjowfTt0aGlzLmlzSG9yaXpvbnRhbCgpPyh5LngxPQp4LHkueDI9eCk6KHkueTE9eCx5LnkyPXgpO3U9dT90aGlzLl9lbmRUaWNrTGVuZ3RoOnRoaXMuX2lubmVyVGlja0xlbmd0aDtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6eS55Mj11O2JyZWFrO2Nhc2UgInRvcCI6eS55MT10aGlzLmhlaWdodCgpO3kueTI9dGhpcy5oZWlnaHQoKS11O2JyZWFrO2Nhc2UgImxlZnQiOnkueDE9dGhpcy53aWR0aCgpO3kueDI9dGhpcy53aWR0aCgpLXU7YnJlYWs7Y2FzZSAicmlnaHQiOnkueDI9dX1yZXR1cm4geX07cS5wcm90b3R5cGUuX3NldERlZmF1bHRBbGlnbm1lbnQ9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dGhpcy55QWxpZ25tZW50KCJ0b3AiKTticmVhaztjYXNlICJ0b3AiOnRoaXMueUFsaWdubWVudCgiYm90dG9tIik7YnJlYWs7Y2FzZSAibGVmdCI6dGhpcy54QWxpZ25tZW50KCJyaWdodCIpO2JyZWFrO2Nhc2UgInJpZ2h0Ijp0aGlzLnhBbGlnbm1lbnQoImxlZnQiKX19OwpxLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4idG9wIj09PXRoaXMuX29yaWVudGF0aW9ufHwiYm90dG9tIj09PXRoaXMuX29yaWVudGF0aW9ufTtxLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX07cS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2Zvcm1hdHRlcjt0aGlzLl9mb3JtYXR0ZXI9dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5pbm5lclRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5uZXJUaWNrTGVuZ3RofTtxLnByb3RvdHlwZS5lbmRUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZFRpY2tMZW5ndGh9O3EucHJvdG90eXBlLl9tYXhMYWJlbFRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaG93RW5kVGlja0xhYmVscygpP01hdGgubWF4KHRoaXMuaW5uZXJUaWNrTGVuZ3RoKCksCnRoaXMuZW5kVGlja0xlbmd0aCgpKTp0aGlzLmlubmVyVGlja0xlbmd0aCgpfTtxLnByb3RvdHlwZS50aWNrTGFiZWxQYWRkaW5nPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBhZGRpbmc7aWYoMD51KXRocm93IEVycm9yKCJ0aWNrIGxhYmVsIHBhZGRpbmcgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX3RpY2tMYWJlbFBhZGRpbmc9dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5tYXJnaW49ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fbWFyZ2luO2lmKDA+dSl0aHJvdyBFcnJvcigibWFyZ2luIHNpemUgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX21hcmdpbj11O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uO3U9dS50b0xvd2VyQ2FzZSgpO2lmKCJ0b3AiIT09dSYmImJvdHRvbSIhPT0KdSYmImxlZnQiIT09dSYmInJpZ2h0IiE9PXUpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIG9yaWVudGF0aW9uIik7dGhpcy5fb3JpZW50YXRpb249dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5zaG93RW5kVGlja0xhYmVscz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93RW5kVGlja0xhYmVsc307cS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTWFya3M9ZnVuY3Rpb24oKXt0aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19NQVJLX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07cS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07CnEucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHg9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKTt4LmVtcHR5KCl8fHguZWFjaChmdW5jdGlvbigpe20uRE9NLmNsaWVudFJlY3RJbnNpZGUodGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx1KXx8dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtxLnByb3RvdHlwZS5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbD1mdW5jdGlvbigpe3ZhciB1PXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX01BUktfQ0xBU1MpLHg9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgQT10LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpOwpyZXR1cm4iaW5oZXJpdCI9PT1BfHwidmlzaWJsZSI9PT1BfSkuZGF0YSgpO3UuZWFjaChmdW5jdGlvbihBKXstMT09PXguaW5kZXhPZihBKSYmdC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHF9KGQuQ29tcG9uZW50KTtoLkVORF9USUNLX01BUktfQ0xBU1M9ImVuZC10aWNrLW1hcmsiO2guVElDS19NQVJLX0NMQVNTPSJ0aWNrLW1hcmsiO2guVElDS19MQUJFTF9DTEFTUz0idGljay1sYWJlbCI7aC5BTk5PVEFUSU9OX0xJTkVfQ0xBU1M9ImFubm90YXRpb24tbGluZSI7aC5BTk5PVEFUSU9OX1JFQ1RfQ0xBU1M9ImFubm90YXRpb24tcmVjdCI7aC5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUz0iYW5ub3RhdGlvbi1jaXJjbGUiO2guQU5OT1RBVElPTl9MQUJFTF9DTEFTUz0KImFubm90YXRpb24tbGFiZWwiO2guX0FOTk9UQVRJT05fTEFCRUxfUEFERElORz00O2YuQXhpcz1ofSxmdW5jdGlvbihkLGYpe2YuU0hPV19XQVJOSU5HUz0hMDtmLkFERF9USVRMRV9FTEVNRU5UUz0hMH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uPXt9O3RoaXMuX2V2ZW50VGFyZ2V0PWRvY3VtZW50O3RoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXQ9e307dGhpcy5fY29ubmVjdGVkPSExfXQucHJvdG90eXBlLl9oYXNOb0NhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgbD1PYmplY3Qua2V5cyh0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0KSxwPTA7cDxsLmxlbmd0aDtwKyspaWYoMCE9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbbFtwXV0uc2l6ZSlyZXR1cm4hMTtyZXR1cm4hMH07dC5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXt2YXIgbD10aGlzOwp0aGlzLl9jb25uZWN0ZWR8fChPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2wuX2V2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIocCxsLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3BdKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMCl9O3QucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLl9jb25uZWN0ZWQmJnRoaXMuX2hhc05vQ2FsbGJhY2tzKCkmJihPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2wuX2V2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIocCxsLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3BdKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMSl9O3QucHJvdG90eXBlLl9hZGRDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGwscCl7bnVsbD09dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXSYmCih0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xdPW5ldyBrLkNhbGxiYWNrU2V0KTt0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xdLmFkZChwKTt0aGlzLl9jb25uZWN0KCl9O3QucHJvdG90eXBlLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGwscCl7bnVsbCE9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXSYmdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXS5kZWxldGUocCk7dGhpcy5fZGlzY29ubmVjdCgpfTt0LnByb3RvdHlwZS5fY2FsbENhbGxiYWNrc0ZvckV2ZW50PWZ1bmN0aW9uKGwpe2Zvcih2YXIgcD1bXSxtPTE7bTxhcmd1bWVudHMubGVuZ3RoO20rKylwW20tMV09YXJndW1lbnRzW21dO209dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXTtudWxsIT1tJiZtLmNhbGxDYWxsYmFja3MuYXBwbHkobSxwKX07cmV0dXJuIHR9KCk7Zi5EaXNwYXRjaGVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fAooZltsXT10W2xdKX1rKGgoODcpKTtrKGgoODgpKTtrKGgoNDApKTtrKGgoODkpKTtrKGgoOTApKTtkPWgoMjYpO2Yuem9vbU91dD1kLnpvb21PdXR9LGZ1bmN0aW9uKGQsZil7ZnVuY3Rpb24gaChuLHEsdSl7cmV0dXJuIHUtKHUtbikqcX1mdW5jdGlvbiBrKG4scSx1KXtyZXR1cm4obipxLXUpLyhxLTEpfWZ1bmN0aW9uIHQobixxLHUseCl7dmFyIEE9MTxxO3U9QT94OnU7aWYobnVsbD09dSlyZXR1cm4gcTtuPW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtyZXR1cm4oQT9NYXRoLm1pbjpNYXRoLm1heCkocSx1L01hdGguYWJzKG5bMV0tblswXSkpfWZ1bmN0aW9uIGwobixxLHUseCxBKXtpZigxPj1xKXJldHVybntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX07aWYobnVsbD09eCYmbnVsbD09QSlyZXR1cm57Y2VudGVyUG9pbnQ6dSx6b29tQW1vdW50OnF9O3ZhciB5PXAobiksdz1tKG4pLEM9dz9JbmZpbml0eTotSW5maW5pdHk7dz13Py1JbmZpbml0eTpJbmZpbml0eTt4PW51bGw9PQp4P0M6eDtBPW51bGw9PUE/dzpBO3c9bi5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpO0M9d1swXTt3PXdbMV07QT1uLnNjYWxlVHJhbnNmb3JtYXRpb24oQSk7dz1uLnNjYWxlVHJhbnNmb3JtYXRpb24odyk7dmFyIEc9aCh3LHEsdSk7eD1uLnNjYWxlVHJhbnNmb3JtYXRpb24oeCk7bj1uLnNjYWxlVHJhbnNmb3JtYXRpb24oQyk7Qz1oKG4scSx1KTtyZXR1cm4gTWF0aC5hYnMoRy1DKT5NYXRoLmFicyhBLXgpPyhxPShBLXgpLyh3LW4pLDEhPT1xP3tjZW50ZXJQb2ludDprKHcscSxBKSx6b29tQW1vdW50OnF9OntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX0pOkc+QSE9eT97Y2VudGVyUG9pbnQ6ayh3LHEsQSksem9vbUFtb3VudDpxfTpDPHghPXk/e2NlbnRlclBvaW50OmsobixxLHgpLHpvb21BbW91bnQ6cX06e2NlbnRlclBvaW50OnUsem9vbUFtb3VudDpxfX1mdW5jdGlvbiBwKG4pe249bi5yYW5nZSgpO3JldHVybiBuWzFdPG5bMF19ZnVuY3Rpb24gbShuKXtuPW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTsKcmV0dXJuIG5bMV08blswXX1mLnpvb21PdXQ9aDtmLmNvbnN0cmFpbmVkWm9vbT1mdW5jdGlvbihuLHEsdSx4LEEseSx3KXtxPXQobixxLHgsQSk7cmV0dXJuIGwobixxLHUseSx3KX07Zi5jb25zdHJhaW5ab29tRXh0ZW50cz10O2YuY29uc3RyYWluWm9vbVZhbHVlcz1sO2YuY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbihuLHEsdSx4KXt2YXIgQT1uLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCkseT1BWzBdLHc9QVsxXTtBPXAobik7MDxxIT09QT8odT14LG51bGwhPXUmJih5PW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih3KSxuPW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxxPShBP01hdGgubWF4Ok1hdGgubWluKSh5K3EsbikteSkpOm51bGwhPXUmJih5PW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih5KSxuPW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxxPShBP01hdGgubWluOk1hdGgubWF4KSh5K3EsbikteSk7cmV0dXJuIHF9fSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhJLApOLE8pe3ZhciBIPUkuc2NhbGU7aWYoSCBpbnN0YW5jZW9mIHkuQ2F0ZWdvcnkpTz1ILnJhbmdlQmFuZCgpO2Vsc2V7dmFyIEs9SS5hY2Nlc3NvcjtJPWwuc2V0KEMuQXJyYXkuZmxhdHRlbihOLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gTS5kYXRhKCkubWFwKGZ1bmN0aW9uKEwsUSl7cmV0dXJuIEsoTCxRLE0pfSkuZmlsdGVyKGZ1bmN0aW9uKEwpe3JldHVybiBudWxsIT1MfSkubWFwKGZ1bmN0aW9uKEwpe3JldHVybiBMLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oTSl7cmV0dXJuK019KTtJLnNvcnQoZnVuY3Rpb24oTSxMKXtyZXR1cm4gTS1MfSk7ST1JLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gSC5zY2FsZShNKX0pO0k9bC5wYWlycyhJKTtPPUMuTWF0aC5taW4oSSxmdW5jdGlvbihNKXtyZXR1cm4gTWF0aC5hYnMoTVsxXS1NWzBdKX0sTypCLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTyk7Tyo9Qi5fQkFSX1RISUNLTkVTU19SQVRJT31yZXR1cm4gT30KdmFyIHQ9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEksTil7ZnVuY3Rpb24gTygpe3RoaXMuY29uc3RydWN0b3I9SX1mb3IodmFyIEggaW4gTilOLmhhc093blByb3BlcnR5KEgpJiYoSVtIXT1OW0hdKTtJLnByb3RvdHlwZT1udWxsPT09Tj9PYmplY3QuY3JlYXRlKE4pOihPLnByb3RvdHlwZT1OLnByb3RvdHlwZSxuZXcgTyl9LGw9aCgxKSxwPWgoNSksbT1oKDcpLG49aCg4KSxxPWgoMTQpLHU9aCg2KSx4PWgoMzQpLEE9aCgyMCkseT1oKDMpLHc9aCgxMSksQz1oKDApO2Q9aCgxMCk7dmFyIEc9aCgxOSksRD1oKDIpO2g9aCgxNik7Zi5CYXJPcmllbnRhdGlvbj1kLm1ha2VFbnVtKFsidmVydGljYWwiLCJob3Jpem9udGFsIl0pO2YuTGFiZWxzUG9zaXRpb249ZC5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIiwib3V0c2lkZSJdKTtmLkJhckFsaWdubWVudD1kLm1ha2VFbnVtKFsic3RhcnQiLCJtaWRkbGUiLCJlbmQiXSk7dmFyIEI9ZnVuY3Rpb24oSSl7ZnVuY3Rpb24gTihPKXt2b2lkIDA9PT0KTyYmKE89InZlcnRpY2FsIik7dmFyIEg9SS5jYWxsKHRoaXMpfHx0aGlzO0guX2xhYmVsRm9ybWF0dGVyPW4uaWRlbnRpdHkoKTtILl9sYWJlbHNFbmFibGVkPSExO0guX2xhYmVsc1Bvc2l0aW9uPWYuTGFiZWxzUG9zaXRpb24uZW5kO0guX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlPSEwO0guX2JhckFsaWdubWVudD0ibWlkZGxlIjtILl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3M9QS5tZW1vaXplKGspO0guX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITA7SC5hZGRDbGFzcygiYmFyLXBsb3QiKTtpZigidmVydGljYWwiIT09TyYmImhvcml6b250YWwiIT09Tyl0aHJvdyBFcnJvcihPKyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIFBsb3RzLkJhciIpO0guX2lzVmVydGljYWw9InZlcnRpY2FsIj09PU87SC5hbmltYXRvcigiYmFzZWxpbmUiLG5ldyBtLk51bGwpO0guYXR0cigiZmlsbCIsKG5ldyB5LkNvbG9yKS5yYW5nZSgpWzBdKTtILmF0dHIoTi5fQkFSX1RISUNLTkVTU19LRVksCmZ1bmN0aW9uKCl7cmV0dXJuIEguX2JhclBpeGVsVGhpY2tuZXNzKCl9KTtILl9sYWJlbENvbmZpZz1uZXcgQy5NYXA7SC5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW0guYmFzZWxpbmVWYWx1ZSgpXX07cmV0dXJuIEh9dChOLEkpO04ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oTyxILEspe0kucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLE8sSCxLKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLng9ZnVuY3Rpb24oTyxIKXtpZihudWxsPT1PKXJldHVybiBJLnByb3RvdHlwZS54LmNhbGwodGhpcyk7bnVsbD09SD9JLnByb3RvdHlwZS54LmNhbGwodGhpcyxPKTpJLnByb3RvdHlwZS54LmNhbGwodGhpcyxPLEgpO3RoaXMuX3VwZGF0ZVRoaWNrbmVzc0F0dHIoKTt0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS55PWZ1bmN0aW9uKE8sSCl7aWYobnVsbD09Ck8pcmV0dXJuIEkucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1IP0kucHJvdG90eXBlLnkuY2FsbCh0aGlzLE8pOkkucHJvdG90eXBlLnkuY2FsbCh0aGlzLE8sSCk7dGhpcy5fdXBkYXRlTGVuZ3RoU2NhbGUoKTtyZXR1cm4gdGhpc307Ti5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCk6dGhpcy54KCl9O04ucHJvdG90eXBlLnBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy54KCk6dGhpcy55KCl9O04ucHJvdG90eXBlLmJhckVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChOLl9CQVJfRU5EX0tFWSl9O04ucHJvdG90eXBlLmJhckFsaWdubWVudD1mdW5jdGlvbihPKXtpZihudWxsPT1PKXJldHVybiB0aGlzLl9iYXJBbGlnbm1lbnQ7dGhpcy5fYmFyQWxpZ25tZW50PU87dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7CnJldHVybiB0aGlzfTtOLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifTtOLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB4LlJlY3RhbmdsZVNWR0RyYXdlcihOLl9CQVJfQVJFQV9DTEFTUyl9LGZ1bmN0aW9uKE8pe3JldHVybiBuZXcgcS5SZWN0YW5nbGVDYW52YXNEcmF3ZXIoTyl9KX07Ti5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7SS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfTtOLnByb3RvdHlwZS5iYXNlbGluZVZhbHVlPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5fYmFzZWxpbmVWYWx1ZSlyZXR1cm4gdGhpcy5fYmFzZWxpbmVWYWx1ZTtpZighdGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpcmV0dXJuIDA7CnZhciBPPXRoaXMubGVuZ3RoKCkuc2NhbGU7cmV0dXJuIE8/TyBpbnN0YW5jZW9mIHkuVGltZT9uZXcgRGF0ZSgwKTowOjB9O04ucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oTyl7SS5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsTyl9O04ucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKE8pe0kucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxPKTtyZXR1cm4gdGhpc307Ti5wcm90b3R5cGUucmVtb3ZlRGF0YXNldD1mdW5jdGlvbihPKXtJLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxPKX07Ti5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oTyl7SS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQuY2FsbCh0aGlzLE8pO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihPKXtpZihudWxsPT1PKXJldHVybiBJLnByb3RvdHlwZS5kYXRhc2V0cy5jYWxsKHRoaXMpO0kucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcywKTyk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oTyxIKXtpZihudWxsPT1PKXJldHVybiB0aGlzLl9sYWJlbHNFbmFibGVkO3RoaXMuX2xhYmVsc0VuYWJsZWQ9TztudWxsIT1IJiYodGhpcy5fbGFiZWxzUG9zaXRpb249SCk7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLmxhYmVsRm9ybWF0dGVyPWZ1bmN0aW9uKE8pe2lmKG51bGw9PU8pcmV0dXJuIHRoaXMuX2xhYmVsRm9ybWF0dGVyO3RoaXMuX2xhYmVsRm9ybWF0dGVyPU87dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24oTyl7dmFyIEg9SS5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsTyksSz10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoTi5fTEFCRUxfQVJFQV9DTEFTUywKITApLE09bmV3IHAuU3ZnQ29udGV4dChLLm5vZGUoKSksTD1uZXcgcC5DYWNoZU1lYXN1cmVyKE0pO009bmV3IHAuV3JpdGVyKEwsTSk7dGhpcy5fbGFiZWxDb25maWcuc2V0KE8se2xhYmVsQXJlYTpLLG1lYXN1cmVyOkwsd3JpdGVyOk19KTtyZXR1cm4gSH07Ti5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihPKXtJLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyxPKTt2YXIgSD10aGlzLl9sYWJlbENvbmZpZy5nZXQoTyk7bnVsbCE9SCYmKEgubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZShPKSl9O04ucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oTyl7dmFyIEg9dGhpcztyZXR1cm4gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gSyhjYSxrYSxZLEVhKXtyZXR1cm4gSC5fcGl4ZWxQb2ludEJhcihhYShjYSxrYSxZKSxsYSxFYSl9CnZhciBNPUguX2lzVmVydGljYWw/Ty54Ok8ueSxMPUguX2lzVmVydGljYWw/Ty55Ok8ueCxRPUguYm91bmRzKCksVD17bWluOjAsbWF4OlEuYm90dG9tUmlnaHQueC1RLnRvcExlZnQueH0sWD17bWluOjAsbWF4OlEuYm90dG9tUmlnaHQueS1RLnRvcExlZnQueX0sYWE9RC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihILmxlbmd0aCgpKSxsYT1ILmxlbmd0aCgpLnNjYWxlLnNjYWxlKEguYmFzZWxpbmVWYWx1ZSgpKSxaPUluZmluaXR5LGJhPUluZmluaXR5LGVhO0guX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGNhKXt2YXIga2E9SC5fZW50aXR5Qm91bmRzKGNhKTtpZihDLkRPTS5pbnRlcnNlY3RzQkJveChULFgsa2EpKXt2YXIgWT0wLEVhPTA7aWYoIUMuRE9NLmludGVyc2VjdHNCQm94KE8ueCxPLnksa2EsLjUpKXtFYT1LKGNhLmRhdHVtLGNhLmluZGV4LGNhLmRhdGFzZXQsa2EpO1k9TWF0aC5hYnMoTS0oSC5faXNWZXJ0aWNhbD9FYS54OkVhLnkpKTsKdmFyIHZhPUguX2lzVmVydGljYWw/a2EueTprYS54O2thPXZhKyhILl9pc1ZlcnRpY2FsP2thLmhlaWdodDprYS53aWR0aCk7RWE9TD49dmEtLjUmJkw8PWthKy41PzA6TWF0aC5hYnMoTC0oSC5faXNWZXJ0aWNhbD9FYS55OkVhLngpKX1pZihZPFp8fFk9PT1aJiZFYTxiYSllYT1jYSxaPVksYmE9RWF9fSk7aWYodm9pZCAwIT09ZWEpcmV0dXJuIEguX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShlYSl9KX07Ti5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbihPKXtyZXR1cm4gdGhpcy5fZW50aXRpZXNJbnRlcnNlY3RpbmcoTy54LE8ueSl9O04ucHJvdG90eXBlLl9lbnRpdGllc0ludGVyc2VjdGluZz1mdW5jdGlvbihPLEgpe3ZhciBLPXRoaXMsTT1bXTt0aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihMKXtDLkRPTS5pbnRlcnNlY3RzQkJveChPLEgsSy5fZW50aXR5Qm91bmRzKEwpKSYmTS5wdXNoKEsuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShMKSl9KTsKcmV0dXJuIE19O04ucHJvdG90eXBlLl91cGRhdGVMZW5ndGhTY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXt2YXIgTz10aGlzLmxlbmd0aCgpLnNjYWxlO08gaW5zdGFuY2VvZiB3LlF1YW50aXRhdGl2ZVNjYWxlJiYoTy5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlciksTy5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcikpfX07Ti5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgTz10aGlzO3RoaXMuX2JhclBpeGVsVGhpY2tuZXNzKCk7cmV0dXJuIHRoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZChmdW5jdGlvbigpe3JldHVybiBJLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKE8pfSl9O04ucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oTyl7dmFyIEg9dGhpcyxLPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpOwpLPXt4MTp0aGlzLl9pc1ZlcnRpY2FsPzA6Syx5MTp0aGlzLl9pc1ZlcnRpY2FsP0s6MCx4Mjp0aGlzLl9pc1ZlcnRpY2FsP3RoaXMud2lkdGgoKTpLLHkyOnRoaXMuX2lzVmVydGljYWw/Szp0aGlzLmhlaWdodCgpfTt0aGlzLl9nZXRBbmltYXRvcigiYmFzZWxpbmUiKS5hbmltYXRlKHRoaXMuX2Jhc2VsaW5lLEspO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKE0pe3JldHVybiBILl9sYWJlbENvbmZpZy5nZXQoTSkubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfSk7dGhpcy5fbGFiZWxzRW5hYmxlZCYmQy5XaW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBILl9kcmF3TGFiZWxzKCl9LE8pfTtOLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oTyl7dmFyIEg9dGhpcyxLPUkucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsTyk7aWYoIngiPT09TyYmdGhpcy5faXNWZXJ0aWNhbClPPXRoaXMueCgpOwplbHNle2lmKCJ5IiE9PU98fHRoaXMuX2lzVmVydGljYWwpcmV0dXJuIEs7Tz10aGlzLnkoKX1pZighKE8mJk8uc2NhbGUmJk8uc2NhbGUgaW5zdGFuY2VvZiB3LlF1YW50aXRhdGl2ZVNjYWxlKSlyZXR1cm4gSzt2YXIgTT1PLnNjYWxlLEw9dGhpcy5fYmFyUGl4ZWxUaGlja25lc3MoKTtyZXR1cm4gSz1LLm1hcChmdW5jdGlvbihRKXtyZXR1cm4gbC5leHRlbnQoW00uaW52ZXJ0KEguX2dldFBvc2l0aW9uQXR0cihNLnNjYWxlKFFbMF0pLEwpKSxNLmludmVydChILl9nZXRQb3NpdGlvbkF0dHIoTS5zY2FsZShRWzBdKSxMKStMKSxNLmludmVydChILl9nZXRQb3NpdGlvbkF0dHIoTS5zY2FsZShRWzFdKSxMKSksTS5pbnZlcnQoSC5fZ2V0UG9zaXRpb25BdHRyKE0uc2NhbGUoUVsxXSksTCkrTCldKX0pfTtOLnByb3RvdHlwZS5fZ2V0UG9zaXRpb25BdHRyPWZ1bmN0aW9uKE8sSCl7dGhpcy5faXNWZXJ0aWNhbHx8KE8tPUgsSCo9LTEpO3N3aXRjaCh0aGlzLl9iYXJBbGlnbm1lbnQpe2Nhc2UgInN0YXJ0IjpyZXR1cm4gTzsKY2FzZSAiZW5kIjpyZXR1cm4gTy1IO2RlZmF1bHQ6cmV0dXJuIE8tSC8yfX07Ti5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgTz10aGlzLEg9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLEs9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTT10aGlzLmRhdGFzZXRzKCkuc29tZShmdW5jdGlvbihMKXtyZXR1cm4gSC5nZXQoTCkuc29tZShmdW5jdGlvbihRLFQpe3JldHVybiBudWxsPT1RPyExOk8uX2RyYXdMYWJlbChRLFQsTCxLKX0pfSk7dGhpcy5faGlkZUJhcnNJZkFueUFyZVRvb1dpZGUmJk0mJnRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe3JldHVybiBPLl9sYWJlbENvbmZpZy5nZXQoTCkubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfSl9O04ucHJvdG90eXBlLl9kcmF3TGFiZWw9ZnVuY3Rpb24oTyxILEssTSl7dmFyIEw9dGhpcy5fbGFiZWxDb25maWcuZ2V0KEspLFE9TC5sYWJlbEFyZWEsVD1MLm1lYXN1cmVyO0w9TC53cml0ZXI7CnZhciBYPXRoaXMubGVuZ3RoKCkuYWNjZXNzb3IsYWE9WChPLEgsSyk7WD10aGlzLmxlbmd0aCgpLnNjYWxlO3ZhciBsYT1udWxsIT1YP1guc2NhbGUoYWEpOmFhLFo9bnVsbCE9WD9YLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTp0aGlzLmJhc2VsaW5lVmFsdWUoKSxiYT17eDpNLngoTyxILEspLHk6TS55KE8sSCxLKX07WD17d2lkdGg6TS53aWR0aChPLEgsSyksaGVpZ2h0Ok0uaGVpZ2h0KE8sSCxLKX07YWE9dGhpcy5fbGFiZWxGb3JtYXR0ZXIoYWEsTyxILEspO1Q9VC5tZWFzdXJlKGFhKTt2YXIgZWE9dGhpcy5fc2hvdWxkU2hvd0xhYmVsT25CYXIoYmEsWCxUKTtiYT10aGlzLl9jYWxjdWxhdGVMYWJlbFByb3BlcnRpZXMoYmEsWCxULGVhLHRoaXMuX2lzVmVydGljYWw/bGE8PVo6bGE8Wik7bGE9YmEuY29udGFpbmVyRGltZW5zaW9ucztaPWJhLmxhYmVsQ29udGFpbmVyT3JpZ2luO2JhPWJhLmFsaWdubWVudDtPPU0uZmlsbChPLEgsSyk7UT10aGlzLl9jcmVhdGVMYWJlbENvbnRhaW5lcihRLApaLGVhLE8pO0wud3JpdGUoYWEsbGEud2lkdGgsbGEuaGVpZ2h0LHt4QWxpZ246YmEueCx5QWxpZ246YmEueX0sUS5ub2RlKCkpO3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP1gud2lkdGg8VC53aWR0aDpYLmhlaWdodDxULmhlaWdodH07Ti5wcm90b3R5cGUuX3Nob3VsZFNob3dMYWJlbE9uQmFyPWZ1bmN0aW9uKE8sSCxLKXtpZih0aGlzLl9sYWJlbHNQb3NpdGlvbj09PWYuTGFiZWxzUG9zaXRpb24ub3V0c2lkZSlyZXR1cm4hMTtPPXRoaXMuX2lzVmVydGljYWw/Ty55Ok8ueDt2YXIgTT10aGlzLl9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGg7SD10aGlzLl9pc1ZlcnRpY2FsP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpO0s9dGhpcy5faXNWZXJ0aWNhbD9LLmhlaWdodDpLLndpZHRoO3ZhciBMPU8rTTtMPkg/TT1ILU86MD5PJiYoTT1MKTtyZXR1cm4gSytOLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjw9TX07Ti5wcm90b3R5cGUuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcz0KZnVuY3Rpb24oTyxILEssTSxMKXtmdW5jdGlvbiBRKGthKXtzd2l0Y2goa2Epe2Nhc2UgInRvcExlZnQiOlo9VC5faXNWZXJ0aWNhbD8idG9wIjoibGVmdCI7ZWErPU4uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSO2NhKz1OLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjticmVhaztjYXNlICJjZW50ZXIiOmNhKz0oYWErbGEpLzI7YnJlYWs7Y2FzZSAiYm90dG9tUmlnaHQiOlo9VC5faXNWZXJ0aWNhbD8iYm90dG9tIjoicmlnaHQiLGVhLT1OLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUixjYSs9YmEtTi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVItbGF9fXZhciBUPXRoaXMsWD10aGlzLl9pc1ZlcnRpY2FsP08ueTpPLngsYWE9dGhpcy5faXNWZXJ0aWNhbD9ILmhlaWdodDpILndpZHRoLGxhPXRoaXMuX2lzVmVydGljYWw/Sy5oZWlnaHQ6Sy53aWR0aCxaPSJjZW50ZXIiLGJhPWFhLGVhPVgsY2E9WDtpZihNKXN3aXRjaCh0aGlzLl9sYWJlbHNQb3NpdGlvbil7Y2FzZSBmLkxhYmVsc1Bvc2l0aW9uLnN0YXJ0Okw/ClEoImJvdHRvbVJpZ2h0Iik6USgidG9wTGVmdCIpO2JyZWFrO2Nhc2UgZi5MYWJlbHNQb3NpdGlvbi5taWRkbGU6USgiY2VudGVyIik7YnJlYWs7Y2FzZSBmLkxhYmVsc1Bvc2l0aW9uLmVuZDpMP1EoInRvcExlZnQiKTpRKCJib3R0b21SaWdodCIpfWVsc2UgTD8oWj10aGlzLl9pc1ZlcnRpY2FsPyJ0b3AiOiJsZWZ0IixiYT1hYStOLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitsYSxlYS09Ti5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrbGEsY2EtPU4uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK2xhKTooWj10aGlzLl9pc1ZlcnRpY2FsPyJib3R0b20iOiJyaWdodCIsYmE9YWErTi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrbGEsY2ErPWFhK04uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSKTtyZXR1cm57Y29udGFpbmVyRGltZW5zaW9uczp7d2lkdGg6dGhpcy5faXNWZXJ0aWNhbD9ILndpZHRoOmJhLGhlaWdodDp0aGlzLl9pc1ZlcnRpY2FsP2JhOkguaGVpZ2h0fSxsYWJlbENvbnRhaW5lck9yaWdpbjp7eDp0aGlzLl9pc1ZlcnRpY2FsPwpPLng6ZWEseTp0aGlzLl9pc1ZlcnRpY2FsP2VhOk8ueX0sbGFiZWxPcmlnaW46e3g6dGhpcy5faXNWZXJ0aWNhbD9PLngrSC53aWR0aC8yLUsud2lkdGgvMjpjYSx5OnRoaXMuX2lzVmVydGljYWw/Y2E6Ty55K0guaGVpZ2h0LzItSy5oZWlnaHQvMn0sYWxpZ25tZW50Ont4OnRoaXMuX2lzVmVydGljYWw/ImNlbnRlciI6Wix5OnRoaXMuX2lzVmVydGljYWw/WjoiY2VudGVyIn19fTtOLnByb3RvdHlwZS5fY3JlYXRlTGFiZWxDb250YWluZXI9ZnVuY3Rpb24oTyxILEssTSl7Tz1PLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0gueCsiLCAiK0gueSsiKSIpO0s/KE8uY2xhc3NlZCgib24tYmFyLWxhYmVsIiwhMCksSz0xLjYqQy5Db2xvci5jb250cmFzdCgid2hpdGUiLE0pPEMuQ29sb3IuY29udHJhc3QoImJsYWNrIixNKSxPLmNsYXNzZWQoSz8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCkpOk8uY2xhc3NlZCgib2ZmLWJhci1sYWJlbCIsITApO3JldHVybiBPfTsKTi5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIE89W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgSD10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxLPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpLE09dGhpcy5faXNWZXJ0aWNhbD8iaGVpZ2h0Ijoid2lkdGgiO0hbdGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiXT1mdW5jdGlvbigpe3JldHVybiBLfTtIW01dPWZ1bmN0aW9uKCl7cmV0dXJuIDB9O08ucHVzaCh7YXR0clRvUHJvamVjdG9yOkgsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoRy5BbmltYXRvci5SRVNFVCl9KX1PLnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihHLkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIE99O04ucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIE8oYmEsCmVhLGNhKXtyZXR1cm4gTWF0aC5hYnMoTS1YKGJhLGVhLGNhKSl9dmFyIEg9dGhpcyxLPUkucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLE09dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksTD10aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIsUT10aGlzLl9pc1ZlcnRpY2FsPyJ4IjoieSIsVD1ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMucG9zaXRpb24oKSksWD1ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMubGVuZ3RoKCkpLGFhPUtbTi5fQkFSX1RISUNLTkVTU19LRVldLGxhPUsuZ2FwLFo9bnVsbD09bGE/YWE6ZnVuY3Rpb24oYmEsZWEsY2Epe3JldHVybiBhYShiYSxlYSxjYSktbGEoYmEsZWEsY2EpfTtLLndpZHRoPXRoaXMuX2lzVmVydGljYWw/WjpPO0suaGVpZ2h0PXRoaXMuX2lzVmVydGljYWw/TzpaO0tbTF09ZnVuY3Rpb24oYmEsZWEsY2Epe2JhPVgoYmEsZWEsY2EpO3JldHVybiBiYT5NP006YmF9OwpLW1FdPWZ1bmN0aW9uKGJhLGVhLGNhKXtyZXR1cm4gSC5fZ2V0UG9zaXRpb25BdHRyKFQoYmEsZWEsY2EpLGFhKGJhLGVhLGNhKSl9O3JldHVybiBLfTtOLnByb3RvdHlwZS5fdXBkYXRlVGhpY2tuZXNzQXR0cj1mdW5jdGlvbigpe3ZhciBPPXRoaXMsSD10aGlzLnBvc2l0aW9uKCksSz10aGlzLmJhckVuZCgpO251bGwhPUgmJm51bGwhPUs/KHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITEsdGhpcy5hdHRyKE4uX0JBUl9USElDS05FU1NfS0VZLGZ1bmN0aW9uKE0sTCxRKXt2YXIgVD1ILmFjY2Vzc29yKE0sTCxRKTtNPUsuYWNjZXNzb3IoTSxMLFEpO1Q9SC5zY2FsZT9ILnNjYWxlLnNjYWxlKFQpOlQ7TT1LLnNjYWxlP0suc2NhbGUuc2NhbGUoTSk6TTtyZXR1cm4gTWF0aC5hYnMoTS1UKX0pKToodGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz0hMCx0aGlzLmF0dHIoTi5fQkFSX1RISUNLTkVTU19LRVksZnVuY3Rpb24oKXtyZXR1cm4gTy5fYmFyUGl4ZWxUaGlja25lc3MoKX0pKX07Ck4ucHJvdG90eXBlLl9iYXJQaXhlbFRoaWNrbmVzcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzP3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpP3RoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcyh0aGlzLnBvc2l0aW9uKCksdGhpcy5kYXRhc2V0cygpLHRoaXMuX2lzVmVydGljYWw/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCkpOjA6MH07Ti5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oTyl7dm9pZCAwPT09TyYmKE89dGhpcy5kYXRhc2V0cygpKTtyZXR1cm4gdGhpcy5fcHJvamVjdG9yc1JlYWR5KCk/SS5wcm90b3R5cGUuZW50aXRpZXMuY2FsbCh0aGlzLE8pOltdfTtOLnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKE8pe3JldHVybiB0aGlzLl9waXhlbEJvdW5kcyhPLmRhdHVtLE8uaW5kZXgsTy5kYXRhc2V0KX07Ti5wcm90b3R5cGUuX3BpeGVsQm91bmRzPWZ1bmN0aW9uKE8sSCxLKXt2YXIgTT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTsKcmV0dXJue3g6TS54KE8sSCxLKSx5Ok0ueShPLEgsSyksd2lkdGg6TS53aWR0aChPLEgsSyksaGVpZ2h0Ok0uaGVpZ2h0KE8sSCxLKX19O04ucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKE8sSCxLKXt2YXIgTT10aGlzLl9waXhlbEJvdW5kcyhPLEgsSyk7Tz0odGhpcy5faXNWZXJ0aWNhbD9ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTpELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSkoTyxILEspO0g9KHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCkuc2NhbGU6dGhpcy54KCkuc2NhbGUpLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTtyZXR1cm4gdGhpcy5fcGl4ZWxQb2ludEJhcihPLEgsTSl9O04ucHJvdG90eXBlLl9waXhlbFBvaW50QmFyPWZ1bmN0aW9uKE8sSCxLKXtpZih0aGlzLl9pc1ZlcnRpY2FsKXt2YXIgTT1LLngrSy53aWR0aC8yO089Tzw9SD9LLnk6Sy55K0suaGVpZ2h0fWVsc2UgTT1PPj1IP0sueCtLLndpZHRoOksueCxPPUsueStLLmhlaWdodC8KMjtyZXR1cm57eDpNLHk6T319O04ucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihPLEgpe0kucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsTyxIKX07Ti5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgTz10aGlzLEg9bmV3IEMuTWFwLEs9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTT10aGlzLndpZHRoKCksTD10aGlzLmhlaWdodCgpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKFEpe3ZhciBUPVEuZGF0YSgpLm1hcChmdW5jdGlvbihYLGFhKXtyZXR1cm4gTy5faXNEYXR1bU9uU2NyZWVuKEssTSxMLFgsYWEsUSk/WDpudWxsfSk7SC5zZXQoUSxUKX0pO3JldHVybiBIfTtOLnByb3RvdHlwZS5faXNEYXR1bU9uU2NyZWVuPWZ1bmN0aW9uKE8sSCxLLE0sTCxRKXt2YXIgVD1PLngoTSxMLFEpLFg9Ty55KE0sTCxRKSxhYT1PLndpZHRoKE0sTCxRKTtPPU8uaGVpZ2h0KE0sTCxRKTtyZXR1cm4gQy5NYXRoLmlzVmFsaWROdW1iZXIoVCkmJgpDLk1hdGguaXNWYWxpZE51bWJlcihYKSYmQy5NYXRoLmlzVmFsaWROdW1iZXIoYWEpJiZDLk1hdGguaXNWYWxpZE51bWJlcihPKT9DLk1hdGguYm91bmRzSW50ZXJzZWN0cyhULFgsYWEsTyxILEspOiExfTtyZXR1cm4gTn0oaC5YWVBsb3QpO0IuX0JBUl9USElDS05FU1NfUkFUSU89Ljk1O0IuX1NJTkdMRV9CQVJfRElNRU5TSU9OX1JBVElPPS40O0IuX0JBUl9BUkVBX0NMQVNTPSJiYXItYXJlYSI7Qi5fQkFSX0VORF9LRVk9ImJhckVuZCI7Qi5fQkFSX1RISUNLTkVTU19LRVk9IndpZHRoIjtCLl9MQUJFTF9BUkVBX0NMQVNTPSJiYXItbGFiZWwtdGV4dC1hcmVhIjtCLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUj0xMDtmLkJhcj1CfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHgsQSl7ZnVuY3Rpb24geSgpe3RoaXMuY29uc3RydWN0b3I9eH1mb3IodmFyIHcgaW4gQSlBLmhhc093blByb3BlcnR5KHcpJiYoeFt3XT1BW3ddKTt4LnByb3RvdHlwZT0KbnVsbD09PUE/T2JqZWN0LmNyZWF0ZShBKTooeS5wcm90b3R5cGU9QS5wcm90b3R5cGUsbmV3IHkpfSx0PWgoMSksbD1oKDUpLHA9aCg4KSxtPWgoMyksbj1oKDApO2Q9aCgxMCk7dmFyIHE9aCgyMik7Zi5UaW1lSW50ZXJ2YWw9ZC5tYWtlRW51bSgic2Vjb25kIG1pbnV0ZSBob3VyIGRheSB3ZWVrIG1vbnRoIHllYXIiLnNwbGl0KCIgIikpO2YuVGltZUF4aXNPcmllbnRhdGlvbj1kLm1ha2VFbnVtKFsidG9wIiwiYm90dG9tIl0pO2YuVGllckxhYmVsUG9zaXRpb249ZC5tYWtlRW51bShbImJldHdlZW4iLCJjZW50ZXIiXSk7aD1mdW5jdGlvbih4KXtmdW5jdGlvbiBBKHksdyl7eT14LmNhbGwodGhpcyx5LHcpfHx0aGlzO3kuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbj1udWxsO3kuX3RpZXJMYWJlbFBvc2l0aW9ucz1bXTt5LmFkZENsYXNzKCJ0aW1lLWF4aXMiKTt5LnRpY2tMYWJlbFBhZGRpbmcoNSk7eS5heGlzQ29uZmlndXJhdGlvbnMoQS5fREVGQVVMVF9USU1FX0FYSVNfQ09ORklHVVJBVElPTlMpOwp5LmFubm90YXRpb25Gb3JtYXR0ZXIocC50aW1lKCIlYSAlYiAlZCwgJVkiKSk7cmV0dXJuIHl9ayhBLHgpO0EucHJvdG90eXBlLnRpZXJMYWJlbFBvc2l0aW9ucz1mdW5jdGlvbih5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnM7aWYoIXkuZXZlcnkoZnVuY3Rpb24odyl7cmV0dXJuImJldHdlZW4iPT09dy50b0xvd2VyQ2FzZSgpfHwiY2VudGVyIj09PXcudG9Mb3dlckNhc2UoKX0pKXRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBwb3NpdGlvbiBmb3IgdGllciBsYWJlbHMiKTt0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnM9eTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtBLnByb3RvdHlwZS5tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb249ZnVuY3Rpb24oeSl7aWYobnVsbD09eSlyZXR1cm4gdGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uO3RoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbj15O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O0EucHJvdG90eXBlLmN1cnJlbnRBeGlzQ29uZmlndXJhdGlvbj0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdfTtBLnByb3RvdHlwZS5heGlzQ29uZmlndXJhdGlvbnM9ZnVuY3Rpb24oeSl7aWYobnVsbCE9eSl7dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zPXk7dGhpcy5fbnVtVGllcnM9bi5NYXRoLm1heCh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubWFwKGZ1bmN0aW9uKEcpe3JldHVybiBHLmxlbmd0aH0pLDApO3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX3NldHVwRG9tRWxlbWVudHMoKTt5PXRoaXMudGllckxhYmVsUG9zaXRpb25zKCk7Zm9yKHZhciB3PVtdLEM9MDtDPHRoaXMuX251bVRpZXJzO0MrKyl3LnB1c2goeVtDXXx8ImJldHdlZW4iKTt0aGlzLnRpZXJMYWJlbFBvc2l0aW9ucyh3KTt0aGlzLnJlZHJhdygpfX07QS5wcm90b3R5cGUuX2dldE1vc3RQcmVjaXNlQ29uZmlndXJhdGlvbkluZGV4PQpmdW5jdGlvbigpe3ZhciB5PXRoaXMsdz10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubGVuZ3RoO3RoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKEMsRyl7Rzx3JiZDLmV2ZXJ5KGZ1bmN0aW9uKEQpe3JldHVybiB5Ll9jaGVja1RpbWVBeGlzVGllckNvbmZpZ3VyYXRpb24oRCl9KSYmKHc9Ryl9KTt3PT09dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmxlbmd0aCYmKG4uV2luZG93Lndhcm4oInpvb21lZCBvdXQgdG9vIGZhcjogY291bGQgbm90IGZpbmQgc3VpdGFibGUgaW50ZXJ2YWwgdG8gZGlzcGxheSBsYWJlbHMiKSwtLXcpO3JldHVybiB3fTtBLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih5KXtpZih5JiYoInJpZ2h0Ij09PXkudG9Mb3dlckNhc2UoKXx8ImxlZnQiPT09eS50b0xvd2VyQ2FzZSgpKSl0aHJvdyBFcnJvcih5KyIgaXMgbm90IGEgc3VwcG9ydGVkIG9yaWVudGF0aW9uIGZvciBUaW1lQXhpcyAtIG9ubHkgaG9yaXpvbnRhbCBvcmllbnRhdGlvbnMgYXJlIHN1cHBvcnRlZCIpOwpyZXR1cm4geC5wcm90b3R5cGUub3JpZW50YXRpb24uY2FsbCh0aGlzLHkpfTtBLnByb3RvdHlwZS5fY29tcHV0ZUhlaWdodD1mdW5jdGlvbigpe3ZhciB5PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQ7dGhpcy5fdGllckhlaWdodHM9W107Zm9yKHZhciB3PTA7dzx0aGlzLl9udW1UaWVyczt3KyspdGhpcy5fdGllckhlaWdodHMucHVzaCh5K3RoaXMudGlja0xhYmVsUGFkZGluZygpKygiYmV0d2VlbiI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbd10/MDp0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSkpO3JldHVybiB0LnN1bSh0aGlzLl90aWVySGVpZ2h0cyl9O0EucHJvdG90eXBlLl9nZXRJbnRlcnZhbExlbmd0aD1mdW5jdGlvbih5KXt2YXIgdz10aGlzLl9zY2FsZS5kb21haW4oKVswXTt5PW0uVGltZS50aW1lSW50ZXJ2YWxUb0QzVGltZSh5LmludGVydmFsKS5vZmZzZXQodyx5LnN0ZXApO3JldHVybiB5PnRoaXMuX3NjYWxlLmRvbWFpbigpWzFdP3RoaXMud2lkdGgoKToKTWF0aC5hYnModGhpcy5fc2NhbGUuc2NhbGUoeSktdGhpcy5fc2NhbGUuc2NhbGUodykpfTtBLnByb3RvdHlwZS5fbWF4V2lkdGhGb3JJbnRlcnZhbD1mdW5jdGlvbih5KXtyZXR1cm4gdGhpcy5fbWVhc3VyZXIubWVhc3VyZSh5LmZvcm1hdHRlcihBLl9MT05HX0RBVEUpKS53aWR0aH07QS5wcm90b3R5cGUuX2NoZWNrVGltZUF4aXNUaWVyQ29uZmlndXJhdGlvbj1mdW5jdGlvbih5KXtpZihudWxsIT10aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb24pe3ZhciB3PUEuX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYW3RoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbl0sQz1BLl9TT1JURURfVElNRV9JTlRFUlZBTF9JTkRFWFt5LmludGVydmFsXTtpZihudWxsIT13JiZudWxsIT1DJiZDPHcpcmV0dXJuITF9dz10aGlzLl9tYXhXaWR0aEZvckludGVydmFsKHkpKzIqdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7cmV0dXJuIE1hdGgubWluKHRoaXMuX2dldEludGVydmFsTGVuZ3RoKHkpLAp0aGlzLndpZHRoKCkpPj13fTtBLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbih5LHcpe3ZhciBDPXgucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyLmNhbGwodGhpcyx5LHcpO3k9dGhpcy5fdGllckhlaWdodHMucmVkdWNlKGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEcrRD5DLmhlaWdodD9HOkcrRH0pO3c9dGhpcy5tYXJnaW4oKSsodGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSp0aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpOjApO0MuaGVpZ2h0PU1hdGgubWluKEMuaGVpZ2h0LHkrdyk7cmV0dXJuIEN9O0EucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3gucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3NldHVwRG9tRWxlbWVudHMoKX07QS5wcm90b3R5cGUuX3NldHVwRG9tRWxlbWVudHM9ZnVuY3Rpb24oKXt0aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoIi4iK0EuVElNRV9BWElTX1RJRVJfQ0xBU1MpLnJlbW92ZSgpOwp0aGlzLl90aWVyTGFiZWxDb250YWluZXJzPVtdO3RoaXMuX3RpZXJNYXJrQ29udGFpbmVycz1bXTt0aGlzLl90aWVyQmFzZWxpbmVzPVtdO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5yZW1vdmUoKTt0aGlzLl9iYXNlbGluZS5yZW1vdmUoKTtmb3IodmFyIHk9MDt5PHRoaXMuX251bVRpZXJzOysreSl7dmFyIHc9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChBLlRJTUVfQVhJU19USUVSX0NMQVNTLCEwKTt0aGlzLl90aWVyTGFiZWxDb250YWluZXJzLnB1c2gody5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX0xBQkVMX0NMQVNTKyItY29udGFpbmVyIiwhMCkpO3RoaXMuX3RpZXJNYXJrQ29udGFpbmVycy5wdXNoKHcuYXBwZW5kKCJnIikuY2xhc3NlZChxLkF4aXMuVElDS19NQVJLX0NMQVNTKyItY29udGFpbmVyIiwhMCkpO3RoaXMuX3RpZXJCYXNlbGluZXMucHVzaCh3LmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCkpfXk9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl90aWVyTGFiZWxDb250YWluZXJzWzBdLm5vZGUoKSk7CnRoaXMuX21lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIoeSl9O0EucHJvdG90eXBlLl9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXM9ZnVuY3Rpb24oeSl7cmV0dXJuIHRoaXMuX3NjYWxlLnRpY2tJbnRlcnZhbCh5LmludGVydmFsLHkuc3RlcCl9O0EucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHk9dGhpcztyZXR1cm4gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdLnJlZHVjZShmdW5jdGlvbih3LEMpe3JldHVybiB3LmNvbmNhdCh5Ll9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXMoQykpfSxbXSl9O0EucHJvdG90eXBlLl9jbGVhblRpZXJzPWZ1bmN0aW9uKCl7Zm9yKHZhciB5PTA7eTx0aGlzLl90aWVyTGFiZWxDb250YWluZXJzLmxlbmd0aDt5KyspdGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbeV0uc2VsZWN0QWxsKCIuIisKcS5BeGlzLlRJQ0tfTUFSS19DTEFTUykucmVtb3ZlKCksdGhpcy5fdGllckJhc2VsaW5lc1t5XS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfTtBLnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb249ZnVuY3Rpb24oeSl7eT10aGlzLl9zY2FsZS50aWNrSW50ZXJ2YWwoeS5pbnRlcnZhbCx5LnN0ZXApO3ZhciB3PXRoaXMuX3NjYWxlLmRvbWFpbigpLEM9eS5tYXAoZnVuY3Rpb24oRyl7cmV0dXJuIEcudmFsdWVPZigpfSk7LTE9PT1DLmluZGV4T2Yod1swXS52YWx1ZU9mKCkpJiZ5LnVuc2hpZnQod1swXSk7LTE9PT1DLmluZGV4T2Yod1sxXS52YWx1ZU9mKCkpJiZ5LnB1c2god1sxXSk7cmV0dXJuIHl9O0EucHJvdG90eXBlLl9yZW5kZXJUaWVyTGFiZWxzPWZ1bmN0aW9uKHksdyxDKXt2YXIgRz10aGlzLEQ9dGhpcy5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb24odyksQj1bXTsiYmV0d2VlbiI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ10mJgoxPT09dy5zdGVwP0QubWFwKGZ1bmN0aW9uKEssTSl7TSsxPj1ELmxlbmd0aHx8Qi5wdXNoKG5ldyBEYXRlKChEW00rMV0udmFsdWVPZigpLURbTV0udmFsdWVPZigpKS8yK0RbTV0udmFsdWVPZigpKSl9KTpCPUQ7eT15LnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEoQixmdW5jdGlvbihLKXtyZXR1cm4gU3RyaW5nKEsudmFsdWVPZigpKX0pO3ZhciBJPXkuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX0xBQkVMX0NMQVNTLCEwKTtJLmFwcGVuZCgidGV4dCIpO3ZhciBOPSJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdfHwxPT09dy5zdGVwPzA6dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7dmFyIE89ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/dC5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxDKzEpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKToiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXT8KdGhpcy5oZWlnaHQoKS10LnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLEMpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKS10aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKTp0aGlzLmhlaWdodCgpLXQuc3VtKHRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsQykpLXRoaXMudGlja0xhYmVsUGFkZGluZygpO0k9eS5tZXJnZShJKTt2YXIgSD1JLnNlbGVjdEFsbCgidGV4dCIpOzA8SC5zaXplKCkmJkguYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTisiLCIrTysiKSIpO3kuZXhpdCgpLnJlbW92ZSgpO0kuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihLKXtyZXR1cm4idHJhbnNsYXRlKCIrRy5fc2NhbGUuc2NhbGUoSykrIiwwKSJ9KTtDPSJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdfHwxPT09dy5zdGVwPyJtaWRkbGUiOiJzdGFydCI7SS5zZWxlY3RBbGwoInRleHQiKS50ZXh0KHcuZm9ybWF0dGVyKS5zdHlsZSgidGV4dC1hbmNob3IiLEMpfTtBLnByb3RvdHlwZS5fcmVuZGVyVGlja01hcmtzPQpmdW5jdGlvbih5LHcpe3k9dGhpcy5fdGllck1hcmtDb250YWluZXJzW3ddLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh5KTt2YXIgQz15LmVudGVyKCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChxLkF4aXMuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZSh5KSxHPXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpLEQ9dGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCx3KS5yZWR1Y2UoZnVuY3Rpb24oQixJKXtyZXR1cm4gQitJfSwwKTsiYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT8oRy55MT1ELEcueTI9RCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbd10/dGhpcy5pbm5lclRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1t3XSkpOihHLnkxPXRoaXMuaGVpZ2h0KCktRCxHLnkyPXRoaXMuaGVpZ2h0KCktKEQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3ddP3RoaXMuaW5uZXJUaWNrTGVuZ3RoKCk6CnRoaXMuX3RpZXJIZWlnaHRzW3ddKSkpO0MuYXR0cnMoRyk7ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/KEcueTE9RCxHLnkyPUQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3ddP3RoaXMuZW5kVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW3ddKSk6KEcueTE9dGhpcy5oZWlnaHQoKS1ELEcueTI9dGhpcy5oZWlnaHQoKS0oRCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbd10/dGhpcy5lbmRUaWNrTGVuZ3RoKCk6dGhpcy5fdGllckhlaWdodHNbd10pKSk7dC5zZWxlY3QoQy5ub2RlcygpWzBdKS5hdHRycyhHKTt0LnNlbGVjdChDLm5vZGVzKClbQy5zaXplKCktMV0pLmF0dHJzKEcpO3Quc2VsZWN0KEMubm9kZXMoKVswXSkuY2xhc3NlZChxLkF4aXMuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCk7dC5zZWxlY3QoQy5ub2RlcygpW0Muc2l6ZSgpLTFdKS5jbGFzc2VkKHEuQXhpcy5FTkRfVElDS19NQVJLX0NMQVNTLCEwKTt5LmV4aXQoKS5yZW1vdmUoKX07CkEucHJvdG90eXBlLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3M9ZnVuY3Rpb24oeSl7eT10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX01BUktfQ0xBU1MpLmRhdGEoeSk7dmFyIHc9eS5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTUFSS19DTEFTUywhMCkubWVyZ2UoeSksQz10aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKTtDLnkyPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMudGlja0xhYmVsUGFkZGluZygpOnRoaXMuaGVpZ2h0KCktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7dy5hdHRycyhDKTt5LmV4aXQoKS5yZW1vdmUoKX07QS5wcm90b3R5cGUuX2dlbmVyYXRlTGFiZWxsZXNzVGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gMT50aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4P1tdOnRoaXMuX2dldFRpY2tJbnRlcnZhbFZhbHVlcyh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleC0KMV1bMF0pfTtBLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB5PXRoaXM7dGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleD10aGlzLl9nZXRNb3N0UHJlY2lzZUNvbmZpZ3VyYXRpb25JbmRleCgpO3ZhciB3PXRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XTt0aGlzLl9jbGVhblRpZXJzKCk7dy5mb3JFYWNoKGZ1bmN0aW9uKEksTil7cmV0dXJuIHkuX3JlbmRlclRpZXJMYWJlbHMoeS5fdGllckxhYmVsQ29udGFpbmVyc1tOXSxJLE4pfSk7Zm9yKHZhciBDPXcubWFwKGZ1bmN0aW9uKEkpe3JldHVybiB5Ll9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbihJKX0pLEc9MCxEPTA7RDxNYXRoLm1heCh3Lmxlbmd0aCwxKTsrK0Qpe3ZhciBCPXRoaXMuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaCgpO0IueTErPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP0c6LUc7Qi55Mj1CLnkxOwp0aGlzLl90aWVyQmFzZWxpbmVzW0RdLmF0dHJzKEIpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpO0crPXRoaXMuX3RpZXJIZWlnaHRzW0RdfUc9W107RD10aGlzLl9zY2FsZS5kb21haW4oKTtEPXRoaXMuX3NjYWxlLnNjYWxlKERbMV0pLXRoaXMuX3NjYWxlLnNjYWxlKERbMF0pOzEuNSp0aGlzLl9nZXRJbnRlcnZhbExlbmd0aCh3WzBdKT49RCYmKEc9dGhpcy5fZ2VuZXJhdGVMYWJlbGxlc3NUaWNrcygpKTt0aGlzLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3MoRyk7dGhpcy5faGlkZU92ZXJmbG93aW5nVGllcnMoKTtmb3IoRD0wO0Q8dy5sZW5ndGg7KytEKXRoaXMuX3JlbmRlclRpY2tNYXJrcyhDW0RdLEQpLHRoaXMuX2hpZGVPdmVybGFwcGluZ0FuZEN1dE9mZkxhYmVscyhEKTt0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpP3RoaXMuX2RyYXdBbm5vdGF0aW9ucygpOnRoaXMuX3JlbW92ZUFubm90YXRpb25zKCk7cmV0dXJuIHRoaXN9O0EucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWVycz0KZnVuY3Rpb24oKXt2YXIgeT10aGlzLHc9dGhpcy5oZWlnaHQoKSxDPTA7dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIitBLlRJTUVfQVhJU19USUVSX0NMQVNTKS5hdHRyKCJ2aXNpYmlsaXR5IixmdW5jdGlvbihHLEQpe0MrPXkuX3RpZXJIZWlnaHRzW0RdO3JldHVybiBDPD13PyJpbmhlcml0IjoiaGlkZGVuIn0pfTtBLnByb3RvdHlwZS5faGlkZU92ZXJsYXBwaW5nQW5kQ3V0T2ZmTGFiZWxzPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHcoSSl7cmV0dXJuIE1hdGguZmxvb3IoRy5sZWZ0KTw9TWF0aC5jZWlsKEkubGVmdCkmJk1hdGguZmxvb3IoRy50b3ApPD1NYXRoLmNlaWwoSS50b3ApJiZNYXRoLmZsb29yKEkucmlnaHQpPD1NYXRoLmNlaWwoRy5sZWZ0K0Mud2lkdGgoKSkmJk1hdGguZmxvb3IoSS5ib3R0b20pPD1NYXRoLmNlaWwoRy50b3ArQy5oZWlnaHQoKSl9dmFyIEM9dGhpcyxHPXRoaXMuZWxlbWVudCgpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxEPXRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iKwpxLkF4aXMuVElDS19NQVJLX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgST10LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpO3JldHVybiJ2aXNpYmxlIj09PUl8fCJpbmhlcml0Ij09PUl9KS5ub2RlcygpLm1hcChmdW5jdGlvbihJKXtyZXR1cm4gSS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pLEI7dGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgST10LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpO3JldHVybiJ2aXNpYmxlIj09PUl8fCJpbmhlcml0Ij09PUl9KS5lYWNoKGZ1bmN0aW9uKEksTil7ST10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBPPXQuc2VsZWN0KHRoaXMpLEg9RFtOXSxLPURbTisxXTtOPW51bGwhPUImJm4uRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChJLEIpO0g9bnVsbCE9SCYmbi5ET00uY2xpZW50UmVjdHNPdmVybGFwKEksCkgpO0s9bnVsbCE9SyYmbi5ET00uY2xpZW50UmVjdHNPdmVybGFwKEksSyk7IXcoSSl8fE58fEh8fEs/Ty5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpOihCPUksTy5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKSl9KX07QS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7eC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIEF9KHEuQXhpcyk7aC5USU1FX0FYSVNfVElFUl9DTEFTUz0idGltZS1heGlzLXRpZXIiO2guX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYPSh1PXt9LHVbZi5UaW1lSW50ZXJ2YWwuc2Vjb25kXT0wLHVbZi5UaW1lSW50ZXJ2YWwubWludXRlXT0xLHVbZi5UaW1lSW50ZXJ2YWwuaG91cl09Mix1W2YuVGltZUludGVydmFsLmRheV09Myx1W2YuVGltZUludGVydmFsLndlZWtdPTQsdVtmLlRpbWVJbnRlcnZhbC5tb250aF09NSx1W2YuVGltZUludGVydmFsLnllYXJdPQo2LHUpO2guX0RFRkFVTFRfVElNRV9BWElTX0NPTkZJR1VSQVRJT05TPVtbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjUsZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjEwLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxNSwKZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjMwLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDo1LGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sClt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MTAsZm9ybWF0dGVyOnAudGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjE1LGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDozMCxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUkgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSwKc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6Myxmb3JtYXR0ZXI6cC50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjYsZm9ybWF0dGVyOnAudGltZSgiJUkgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLmhvdXIsc3RlcDoxMixmb3JtYXR0ZXI6cC50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlYSAlZSIpfSwKe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVlIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJWIiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6Myxmb3JtYXR0ZXI6cC50aW1lKCIlYiIpfSwKe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6Nixmb3JtYXR0ZXI6cC50aW1lKCIlYiIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJXkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjUsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjI1LGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDo1MCxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sClt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEwMCxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MjAwLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDo1MDAsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjFFMyxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV1dO2guX0xPTkdfREFURT1uZXcgRGF0ZSg5OTk5LDgsMjksMTIsNTksOTk5OSk7Zi5UaW1lPWg7dmFyIHV9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPQpwLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgxMik7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKCl7dmFyIG09bC5jYWxsKHRoaXMpfHx0aGlzO20uX2RldGFjaENhbGxiYWNrPWZ1bmN0aW9uKG4pe3JldHVybiBtLnJlbW92ZShuKX07cmV0dXJuIG19ayhwLGwpO3AucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihtKXt2YXIgbj10aGlzO209dC5jb2VyY2VFeHRlcm5hbEQzKG0pO2wucHJvdG90eXBlLmFuY2hvci5jYWxsKHRoaXMsbSk7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gcS5hbmNob3Iobi5lbGVtZW50KCkpfSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RoaXMuX2ZvckVhY2goZnVuY3Rpb24obSl7cmV0dXJuIG0ucmVuZGVyKCl9KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoImhhcygpIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBDb21wb25lbnRDb250YWluZXIiKTt9O3AucHJvdG90eXBlLl9hZG9wdEFuZEFuY2hvcj0KZnVuY3Rpb24obSl7bS5wYXJlbnQodGhpcyk7bS5vbkRldGFjaCh0aGlzLl9kZXRhY2hDYWxsYmFjayk7dGhpcy5faXNBbmNob3JlZCYmbS5hbmNob3IodGhpcy5lbGVtZW50KCkpfTtwLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24obSl7dGhpcy5oYXMobSkmJihtLm9mZkRldGFjaCh0aGlzLl9kZXRhY2hDYWxsYmFjayksdGhpcy5fcmVtb3ZlKG0pLG0uZGV0YWNoKCksdGhpcy5yZWRyYXcoKSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24oKXt9O3AucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIl9mb3JFYWNoKCkgaXMgbm90IGltcGxlbWVudGVkIG9uIENvbXBvbmVudENvbnRhaW5lciIpO307cC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2wucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKG0pe3JldHVybiBtLmRlc3Ryb3koKX0pfTtwLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9CmZ1bmN0aW9uKCl7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihtKXtyZXR1cm4gbS5pbnZhbGlkYXRlQ2FjaGUoKX0pfTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuQ29tcG9uZW50Q29udGFpbmVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKEEpe24uYWRkKEEpO20uYWRkKEEpO3QoKX1mdW5jdGlvbiB0KCl7cXx8KHE9ITAseC5yZW5kZXIoKSl9dmFyIGw9aCgwKTtkPWgoMTApO3ZhciBwPWgoMzkpLG09bmV3IGwuU2V0LG49bmV3IGwuU2V0LHE9ITEsdT0hMTtmLlBvbGljeT1kLm1ha2VFbnVtKFsiaW1tZWRpYXRlIiwiYW5pbWF0aW9uRnJhbWUiLCJ0aW1lb3V0Il0pO3ZhciB4PW5ldyBwLkFuaW1hdGlvbkZyYW1lO2YucmVuZGVyUG9saWN5PWZ1bmN0aW9uKEEpe2lmKG51bGw9PUEpcmV0dXJuIHg7c3dpdGNoKEEpe2Nhc2UgZi5Qb2xpY3kuaW1tZWRpYXRlOng9bmV3IHAuSW1tZWRpYXRlO2JyZWFrO2Nhc2UgZi5Qb2xpY3kuYW5pbWF0aW9uRnJhbWU6eD1uZXcgcC5BbmltYXRpb25GcmFtZTsKYnJlYWs7Y2FzZSBmLlBvbGljeS50aW1lb3V0Ong9bmV3IHAuVGltZW91dDticmVhaztkZWZhdWx0OmwuV2luZG93Lndhcm4oIlVucmVjb2duaXplZCByZW5kZXJQb2xpY3k6ICIrQSl9fTtmLnJlZ2lzdGVyVG9SZW5kZXI9ZnVuY3Rpb24oQSl7dSYmbC5XaW5kb3cud2FybigiUmVnaXN0ZXJlZCB0byByZW5kZXIgd2hpbGUgb3RoZXIgY29tcG9uZW50cyBhcmUgZmx1c2hpbmc6IHJlcXVlc3QgbWF5IGJlIGlnbm9yZWQiKTttLmFkZChBKTt0KCl9O2YucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXI9aztmLnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0PWZ1bmN0aW9uKEEpe2soQSl9O2YuZmx1c2g9ZnVuY3Rpb24oKXtpZihxKXtuLmZvckVhY2goZnVuY3Rpb24oeSl7cmV0dXJuIHkuY29tcHV0ZUxheW91dCgpfSk7bS5mb3JFYWNoKGZ1bmN0aW9uKHkpe3JldHVybiB5LnJlbmRlcigpfSk7dT0hMDt2YXIgQT1uZXcgbC5TZXQ7bS5mb3JFYWNoKGZ1bmN0aW9uKHkpe3RyeXt5LnJlbmRlckltbWVkaWF0ZWx5KCl9Y2F0Y2godyl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB3Owp9LDApLEEuYWRkKHkpfX0pO249bmV3IGwuU2V0O209QTt1PXE9ITF9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMSk7Zi5jaXJjbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbENpcmNsZSkuc2l6ZShNYXRoLlBJKk1hdGgucG93KGwvMiwyKSl9fTtmLnNxdWFyZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sU3F1YXJlKS5zaXplKE1hdGgucG93KGwsMikpfX07Zi5jcm9zcz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sQ3Jvc3MpLnNpemUoNS85Kk1hdGgucG93KGwsMikpfX07Zi5kaWFtb25kPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xEaWFtb25kKS5zaXplKE1hdGgudGFuKE1hdGguUEkvNikqTWF0aC5wb3cobCwyKS8KMil9fTtmLnRyaWFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xUcmlhbmdsZSkuc2l6ZShNYXRoLnNxcnQoMykqTWF0aC5wb3cobC8yLDIpKX19O2Yuc3Rhcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sU3Rhcikuc2l6ZSguODkwODEzMDkxNTI5Mjg1MipNYXRoLnBvdyhsLzIsMikpfX07dmFyIHQ9MyooMS9NYXRoLnNxcnQoMTIpLzIrMSk7Zi53eWU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbFd5ZSkuc2l6ZSh0Kk1hdGgucG93KGwvMi40LDIpKX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHggaW4gcSlxLmhhc093blByb3BlcnR5KHgpJiYoblt4XT0KcVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMjUpLGw9aCgwKSxwPWgoMTIpLG09aCgzNyk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKCl7dmFyIHU9bi5jYWxsKHRoaXMpfHx0aGlzO3UuX2RldGVjdGlvblJhZGl1cz0zO3UuX3Jlc2l6YWJsZT0hMTt1Ll9tb3ZhYmxlPSExO3UuX2hhc0Nvcm5lcnM9ITA7dS5hZGRDbGFzcygiZHJhZy1ib3gtbGF5ZXIiKTt1Ll9kcmFnSW50ZXJhY3Rpb249bmV3IHQuRHJhZzt1Ll9zZXRVcENhbGxiYWNrcygpO3UuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh1KTt1Ll9kcmFnU3RhcnRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dS5fZHJhZ0NhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDt1Ll9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3JldHVybiB1fWsocSxuKTtxLnByb3RvdHlwZS5fc2V0VXBDYWxsYmFja3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB1KEksCk4pezA9PT1CJiZJLng9PT1OLngmJkkueT09PU4ueSYmeS5ib3hWaXNpYmxlKCExKTt5Ll9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeS5ib3VuZHMoKSl9ZnVuY3Rpb24geChJLE4pe3N3aXRjaChCKXtjYXNlIDA6Ry54PU4ueDtHLnk9Ti55O2JyZWFrO2Nhc2UgMTp3LmJvdHRvbT9HLnk9Ti55OncudG9wJiYoQy55PU4ueSk7dy5yaWdodD9HLng9Ti54OncubGVmdCYmKEMueD1OLngpO2JyZWFrO2Nhc2UgMjpJPU4ueC1ELng7dmFyIE89Ti55LUQueTtDLngrPUk7Qy55Kz1PO0cueCs9STtHLnkrPU87RD1OfXkuX3NldEJvdW5kcyh7dG9wTGVmdDpDLGJvdHRvbVJpZ2h0Okd9KTt5Ll94Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnhTY2FsZSgpJiZ5Ll9zZXRYRXh0ZW50KFt5LnhTY2FsZSgpLmludmVydChDLngpLHkueFNjYWxlKCkuaW52ZXJ0KEcueCldKTt5Ll95Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnlTY2FsZSgpJiYKeS5fc2V0WUV4dGVudChbeS55U2NhbGUoKS5pbnZlcnQoQy55KSx5LnlTY2FsZSgpLmludmVydChHLnkpXSk7eS5yZW5kZXIoKTt5Ll9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeS5ib3VuZHMoKSl9ZnVuY3Rpb24gQShJKXt3PXkuX2dldFJlc2l6aW5nRWRnZXMoSSk7dmFyIE49eS5ib3VuZHMoKTtOPU4udG9wTGVmdC54PD1JLngmJkkueDw9Ti5ib3R0b21SaWdodC54JiZOLnRvcExlZnQueTw9SS55JiZJLnk8PU4uYm90dG9tUmlnaHQueTt5LmJveFZpc2libGUoKSYmKHcudG9wfHx3LmJvdHRvbXx8dy5sZWZ0fHx3LnJpZ2h0KT9CPTE6eS5ib3hWaXNpYmxlKCkmJnkubW92YWJsZSgpJiZOP0I9MjooQj0wLHkuX3NldEJvdW5kcyh7dG9wTGVmdDpJLGJvdHRvbVJpZ2h0Okl9KSx5Ll94Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnhTY2FsZSgpJiZ5Ll9zZXRYRXh0ZW50KFt5LnhTY2FsZSgpLmludmVydChJLngpLHkueFNjYWxlKCkuaW52ZXJ0KEkueCldKSwKeS5feUJvdW5kc01vZGU9PT1tLlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9eS55U2NhbGUoKSYmeS5fc2V0WUV4dGVudChbeS55U2NhbGUoKS5pbnZlcnQoSS55KSx5LnlTY2FsZSgpLmludmVydChJLnkpXSkseS5yZW5kZXIoKSk7eS5ib3hWaXNpYmxlKCEwKTtOPXkuYm91bmRzKCk7Qz17eDpOLnRvcExlZnQueCx5Ok4udG9wTGVmdC55fTtHPXt4Ok4uYm90dG9tUmlnaHQueCx5Ok4uYm90dG9tUmlnaHQueX07RD1JO3kuX2RyYWdTdGFydENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKE4pfXZhciB5PXRoaXMsdyxDLEcsRCxCPTA7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KEEpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcoeCk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZCh1KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KEEpO3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHgpOwp5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ0VuZCh1KTt5Ll9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCl9fTtxLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB1KCl7cmV0dXJuIHguX2JveC5hcHBlbmQoImxpbmUiKS5zdHlsZXMoe29wYWNpdHk6MCxzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSl9dmFyIHg9dGhpcztuLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlVD11KCkuY2xhc3NlZCgiZHJhZy1lZGdlLXRiIiwhMCk7dGhpcy5fZGV0ZWN0aW9uRWRnZUI9dSgpLmNsYXNzZWQoImRyYWctZWRnZS10YiIsITApO3RoaXMuX2RldGVjdGlvbkVkZ2VMPXUoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtbHIiLCEwKTt0aGlzLl9kZXRlY3Rpb25FZGdlUj11KCkuY2xhc3NlZCgiZHJhZy1lZGdlLWxyIiwhMCk7aWYodGhpcy5faGFzQ29ybmVycyl7dmFyIEE9ZnVuY3Rpb24oKXtyZXR1cm4geC5fYm94LmFwcGVuZCgiY2lyY2xlIikuc3R5bGVzKHtvcGFjaXR5OjAsCmZpbGw6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVGaWxsIn0pfTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUTD1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdGwiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUj1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdHIiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJCTD1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYmwiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJCUj1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYnIiLCEwKX19O3EucHJvdG90eXBlLl9nZXRSZXNpemluZ0VkZ2VzPWZ1bmN0aW9uKHUpe3ZhciB4PXt0b3A6ITEsYm90dG9tOiExLGxlZnQ6ITEscmlnaHQ6ITF9O2lmKCF0aGlzLnJlc2l6YWJsZSgpKXJldHVybiB4O3ZhciBBPXRoaXMuYm91bmRzKCkseT1BLnRvcExlZnQueSx3PUEuYm90dG9tUmlnaHQueSxDPUEudG9wTGVmdC54O0E9QS5ib3R0b21SaWdodC54O3ZhciBHPXRoaXMuX2RldGVjdGlvblJhZGl1czsKQy1HPD11LngmJnUueDw9QStHJiYoeC50b3A9eS1HPD11LnkmJnUueTw9eStHLHguYm90dG9tPXctRzw9dS55JiZ1Lnk8PXcrRyk7eS1HPD11LnkmJnUueTw9dytHJiYoeC5sZWZ0PUMtRzw9dS54JiZ1Lng8PUMrRyx4LnJpZ2h0PUEtRzw9dS54JiZ1Lng8PUErRyk7cmV0dXJuIHh9O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTtpZih0aGlzLmJveFZpc2libGUoKSl7dmFyIHU9dGhpcy5ib3VuZHMoKSx4PXUudG9wTGVmdC55LEE9dS5ib3R0b21SaWdodC55LHk9dS50b3BMZWZ0Lng7dT11LmJvdHRvbVJpZ2h0Lng7dGhpcy5fZGV0ZWN0aW9uRWRnZVQuYXR0cnMoe3gxOnkseTE6eCx4Mjp1LHkyOngsInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9kZXRlY3Rpb25FZGdlQi5hdHRycyh7eDE6eSx5MTpBLHgyOnUseTI6QSwic3Ryb2tlLXdpZHRoIjoyKgp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9kZXRlY3Rpb25FZGdlTC5hdHRycyh7eDE6eSx5MTp4LHgyOnkseTI6QSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3RoaXMuX2RldGVjdGlvbkVkZ2VSLmF0dHJzKHt4MTp1LHkxOngseDI6dSx5MjpBLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7dGhpcy5faGFzQ29ybmVycyYmKHRoaXMuX2RldGVjdGlvbkNvcm5lclRMLmF0dHJzKHtjeDp5LGN5Ongscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUi5hdHRycyh7Y3g6dSxjeTp4LHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uQ29ybmVyQkwuYXR0cnMoe2N4OnksY3k6QSxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lckJSLmF0dHJzKHtjeDp1LGN5OkEscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSl9cmV0dXJuIHRoaXN9OwpxLnByb3RvdHlwZS5kZXRlY3Rpb25SYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfTtxLnByb3RvdHlwZS5yZXNpemFibGU9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fcmVzaXphYmxlO3RoaXMuX3Jlc2l6YWJsZT11O3RoaXMuX3NldFJlc2l6YWJsZUNsYXNzZXModSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLl9zZXRSZXNpemFibGVDbGFzc2VzPWZ1bmN0aW9uKHUpe3UmJnRoaXMuZW5hYmxlZCgpPyh0aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpLHRoaXMuYWRkQ2xhc3MoInktcmVzaXphYmxlIikpOih0aGlzLnJlbW92ZUNsYXNzKCJ4LXJlc2l6YWJsZSIpLHRoaXMucmVtb3ZlQ2xhc3MoInktcmVzaXphYmxlIikpfTtxLnByb3RvdHlwZS5tb3ZhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vdmFibGV9O3EucHJvdG90eXBlLl9zZXRNb3ZhYmxlQ2xhc3M9ZnVuY3Rpb24oKXt0aGlzLm1vdmFibGUoKSYmdGhpcy5lbmFibGVkKCk/CnRoaXMuYWRkQ2xhc3MoIm1vdmFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJtb3ZhYmxlIil9O3EucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHUpe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5hZGQodSl9O3EucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHUpfTtxLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQodSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodSl9O3EucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZCh1KX07cS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh1KX07cS5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn07CnEucHJvdG90eXBlLmVuYWJsZWQ9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCh1KTt0aGlzLl9zZXRSZXNpemFibGVDbGFzc2VzKHRoaXMucmVzaXphYmxlKCkpO3RoaXMuX3NldE1vdmFibGVDbGFzcygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcztuLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24oeCl7cmV0dXJuIHUuX2RyYWdDYWxsYmFja3MuZGVsZXRlKHgpfSk7dGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHgpe3JldHVybiB1Ll9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh4KX0pO3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbih4KXtyZXR1cm4gdS5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUoeCl9KTsKdGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCl9O3EucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuX3Jlc2V0U3RhdGUoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCk7bi5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbih1KXt1PXAuY29lcmNlRXh0ZXJuYWxEMyh1KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyk7bi5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcyx1KTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX3Jlc2V0U3RhdGU9ZnVuY3Rpb24oKXt0aGlzLmJvdW5kcyh7dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fSl9O3JldHVybiBxfShoKDQzKS5TZWxlY3Rpb25Cb3hMYXllcik7Zi5EcmFnQm94TGF5ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPQpwfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDE4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXtyZXR1cm4gcC5jYWxsKHRoaXMsInBhdGgiLCJsaW5lIil8fHRoaXN9ayhtLHApO20ucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKG4pe24uc3R5bGUoImZpbGwiLCJub25lIil9O20ucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsMCl9O3JldHVybiBtfShoKDkpLlNWR0RyYXdlcik7Zi5MaW5lU1ZHRHJhd2VyPWQ7dmFyIGw9WyJvcGFjaXR5Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2Utd2lkdGgiLCJzdHJva2UiXTtmLm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXA9CmZ1bmN0aW9uKHApe3JldHVybiBmdW5jdGlvbihtLG4scSl7cT10LnJlc29sdmVBdHRyaWJ1dGVzKHEsbCxuWzBdLDApO3QucmVuZGVyTGluZShtLHAoKSxuWzBdLHEpfX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDE4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7dm9pZCAwPT09biYmKG49IiIpO3ZhciBxPXAuY2FsbCh0aGlzLCJyZWN0IiwiIil8fHRoaXM7cS5fcm9vdENsYXNzTmFtZT1uO3EuX3Jvb3QuY2xhc3NlZChxLl9yb290Q2xhc3NOYW1lLCEwKTtyZXR1cm4gcX1rKG0scCk7cmV0dXJuIG19KGgoOSkuU1ZHRHJhd2VyKTtmLlJlY3RhbmdsZVNWR0RyYXdlcj0KZDt2YXIgbD1bIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiXTtmLlJlY3RhbmdsZUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKHAsbSxuKXtwLnNhdmUoKTttLmZvckVhY2goZnVuY3Rpb24ocSx1KXtudWxsIT1xJiYocT10LnJlc29sdmVBdHRyaWJ1dGVzU3Vic2V0V2l0aFN0eWxlcyhuLGwscSx1KSxwLmJlZ2luUGF0aCgpLHAucmVjdChxLngscS55LHEud2lkdGgscS5oZWlnaHQpLHQucmVuZGVyUGF0aFdpdGhTdHlsZShwLHEpKX0pO3AucmVzdG9yZSgpfTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7cmV0dXJuIHAuY2FsbCh0aGlzLG4sZi5SZWN0YW5nbGVDYW52YXNEcmF3U3RlcCl8fHRoaXN9ayhtLHApO3JldHVybiBtfSh0LkNhbnZhc0RyYXdlcik7Zi5SZWN0YW5nbGVDYW52YXNEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocCl7bC5TSE9XX1dBUk5JTkdTJiZjb25zb2xlLndhcm4ocCl9ZnVuY3Rpb24gdChwLG0pe2Zvcih2YXIgbj1bXSxxPTI7cTxhcmd1bWVudHMubGVuZ3RoO3ErKyluW3EtCjJdPWFyZ3VtZW50c1txXTtyZXR1cm4gMD09PW0/KHAobiksLTEpOndpbmRvdy5zZXRUaW1lb3V0KHAsbSxuKX12YXIgbD1oKDIzKTtmLndhcm49aztmLnNldFRpbWVvdXQ9dDtmLmRlYm91bmNlPWZ1bmN0aW9uKHAsbSxuKXtmdW5jdGlvbiBxKCl7bS5hcHBseShuLHgpfXZhciB1PW51bGwseD1bXTtyZXR1cm4gZnVuY3Rpb24oKXt4PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7Y2xlYXJUaW1lb3V0KHUpO3U9dChxLHApfX07Zi5kZXByZWNhdGVkPWZ1bmN0aW9uKHAsbSxuKXt2b2lkIDA9PT1uJiYobj0iIik7aygiTWV0aG9kICIrcCsiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAiK20rIi4gUGxlYXNlIHJlZmVyIHRvIHRoZSByZWxlYXNlIG5vdGVzLiAiK24pfX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrKXt0aGlzLnJ1bGVyPW51bGwhPWsuY3JlYXRlUnVsZXI/ay5jcmVhdGVSdWxlcigpOmt9aC5wcm90b3R5cGUubWVhc3VyZT0KZnVuY3Rpb24oayl7dm9pZCAwPT09ayYmKGs9aC5IRUlHSFRfVEVYVCk7cmV0dXJuIHRoaXMucnVsZXIoayl9O3JldHVybiBofSgpO2QuSEVJR0hUX1RFWFQ9ImJkcHFsIjtmLkFic3RyYWN0TWVhc3VyZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDMyKSk7ayhoKDc0KSk7ayhoKDc1KSk7ayhoKDQxKSk7ayhoKDQyKSk7ayhoKDc2KSk7ayhoKDc3KSk7ayhoKDc4KSk7ayhoKDc5KSk7ayhoKDQzKSk7ayhoKDgwKSk7ayhoKDgxKSk7ayhoKDgyKSl9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGwscCl7dm9pZCAwPT09bCYmKGw9W10pO3ZvaWQgMD09PXAmJihwPXt9KTt0aGlzLl91cGRhdGVJZD0wO3RoaXMuX2RhdGE9bDt0aGlzLl9tZXRhZGF0YT1wO3RoaXMuX2NhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldH10LnByb3RvdHlwZS5vblVwZGF0ZT0KZnVuY3Rpb24obCl7dGhpcy5fY2FsbGJhY2tzLmFkZChsKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUub2ZmVXBkYXRlPWZ1bmN0aW9uKGwpe3RoaXMuX2NhbGxiYWNrcy5kZWxldGUobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmRhdGE9ZnVuY3Rpb24obCl7aWYobnVsbD09bClyZXR1cm4gdGhpcy5fZGF0YTt0aGlzLl9kYXRhPWw7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUubWV0YWRhdGE9ZnVuY3Rpb24obCl7aWYobnVsbD09bClyZXR1cm4gdGhpcy5fbWV0YWRhdGE7dGhpcy5fbWV0YWRhdGE9bDt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH07dC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQrKzt0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX07cmV0dXJuIHR9KCk7CmYuRGF0YXNldD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgwKSx0PWgoMzApO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7fWwucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QuZmx1c2goKX07cmV0dXJuIGx9KCk7Zi5JbW1lZGlhdGU9ZDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe31sLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtrLkRPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCh0LmZsdXNoKX07cmV0dXJuIGx9KCk7Zi5BbmltYXRpb25GcmFtZT1kO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7dGhpcy5fdGltZW91dE1zZWM9ay5ET00uU0NSRUVOX1JFRlJFU0hfUkFURV9NSUxMSVNFQ09ORFN9bC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7c2V0VGltZW91dCh0LmZsdXNoLHRoaXMuX3RpbWVvdXRNc2VjKX07cmV0dXJuIGx9KCk7Zi5UaW1lb3V0PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCwKbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxMyksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPW51bGwhPT1wJiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztuLl9rZXlQcmVzc0NhbGxiYWNrcz17fTtuLl9rZXlSZWxlYXNlQ2FsbGJhY2tzPXt9O24uX21vdXNlTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuITF9O24uX2Rvd25lZEtleXM9bmV3IGwuU2V0O24uX2tleURvd25DYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVLZXlEb3duRXZlbnQocSx1KX07bi5fa2V5VXBDYWxsYmFjaz1mdW5jdGlvbihxKXtyZXR1cm4gbi5faGFuZGxlS2V5VXBFdmVudChxKX07cmV0dXJuIG59ayhtLHApOwptLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKG4pe3AucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLG4pO3RoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlcj10Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl9rZXlEaXNwYXRjaGVyPXQuS2V5LmdldERpc3BhdGNoZXIoKTt0aGlzLl9rZXlEaXNwYXRjaGVyLm9uS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXIub25LZXlVcCh0aGlzLl9rZXlVcENhbGxiYWNrKX07bS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyPW51bGw7CnRoaXMuX2tleURpc3BhdGNoZXIub2ZmS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXIub2ZmS2V5VXAodGhpcy5fa2V5VXBDYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlcj1udWxsfTttLnByb3RvdHlwZS5faGFuZGxlS2V5RG93bkV2ZW50PWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZSh0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIubGFzdE1vdXNlUG9zaXRpb24oKSk7dGhpcy5faXNJbnNpZGVDb21wb25lbnQodSkmJiFxLnJlcGVhdCYmKHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dJiZ0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5jYWxsQ2FsbGJhY2tzKG4pLHRoaXMuX2Rvd25lZEtleXMuYWRkKG4pKX07bS5wcm90b3R5cGUuX2hhbmRsZUtleVVwRXZlbnQ9ZnVuY3Rpb24obil7dGhpcy5fZG93bmVkS2V5cy5oYXMobikmJnRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0mJnRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0uY2FsbENhbGxiYWNrcyhuKTsKdGhpcy5fZG93bmVkS2V5cy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uS2V5UHJlc3M9ZnVuY3Rpb24obixxKXt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXXx8KHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dPW5ldyBsLkNhbGxiYWNrU2V0KTt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5hZGQocSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9mZktleVByZXNzPWZ1bmN0aW9uKG4scSl7dGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl0uZGVsZXRlKHEpOzA9PT10aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5zaXplJiZkZWxldGUgdGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl07cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uS2V5UmVsZWFzZT1mdW5jdGlvbihuLHEpe3RoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl18fCh0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dPW5ldyBsLkNhbGxiYWNrU2V0KTt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dLmFkZChxKTtyZXR1cm4gdGhpc307Cm0ucHJvdG90eXBlLm9mZktleVJlbGVhc2U9ZnVuY3Rpb24obixxKXt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dLmRlbGV0ZShxKTswPT09dGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXS5zaXplJiZkZWxldGUgdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXTtyZXR1cm4gdGhpc307cmV0dXJuIG19KGgoMTUpLkludGVyYWN0aW9uKTtmLktleT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgwKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSl7dm9pZCAwPT09bSYmKG09W10pO3ZhciBuPWwuY2FsbCh0aGlzKXx8dGhpcztuLl9jb21wb25lbnRzPQpbXTtuLmFkZENsYXNzKCJjb21wb25lbnQtZ3JvdXAiKTttLmZvckVhY2goZnVuY3Rpb24ocSl7cmV0dXJuIG4uYXBwZW5kKHEpfSk7cmV0dXJuIG59ayhwLGwpO3AucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKG0pe3RoaXMuY29tcG9uZW50cygpLmZvckVhY2gobSl9O3AucHJvdG90eXBlLmhhcz1mdW5jdGlvbihtKXtyZXR1cm4gMDw9dGhpcy5fY29tcG9uZW50cy5pbmRleE9mKG0pfTtwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbihtLG4pe3ZhciBxPXRoaXMuX2NvbXBvbmVudHMubWFwKGZ1bmN0aW9uKHUpe3JldHVybiB1LnJlcXVlc3RlZFNwYWNlKG0sbil9KTtyZXR1cm57bWluV2lkdGg6dC5NYXRoLm1heChxLGZ1bmN0aW9uKHUpe3JldHVybiB1Lm1pbldpZHRofSwwKSxtaW5IZWlnaHQ6dC5NYXRoLm1heChxLGZ1bmN0aW9uKHUpe3JldHVybiB1Lm1pbkhlaWdodH0sMCl9fTtwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKG0sbixxKXt2YXIgdT0KdGhpcztsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxtLG4scSk7dGhpcy5fZm9yRWFjaChmdW5jdGlvbih4KXt4LmNvbXB1dGVMYXlvdXQoe3g6MCx5OjB9LHUud2lkdGgoKSx1LmhlaWdodCgpKX0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbihtLG4pe3JldHVybnt3aWR0aDptLGhlaWdodDpufX07cC5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uKG0pe3JldHVybiBtLmZpeGVkV2lkdGgoKX0pfTtwLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uKG0pe3JldHVybiBtLmZpeGVkSGVpZ2h0KCl9KX07cC5wcm90b3R5cGUuY29tcG9uZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLnNsaWNlKCl9O3AucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihtKXtudWxsPT0KbXx8dGhpcy5oYXMobSl8fChtLmRldGFjaCgpLHRoaXMuX2NvbXBvbmVudHMucHVzaChtKSx0aGlzLl9hZG9wdEFuZEFuY2hvcihtKSx0aGlzLnJlZHJhdygpKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbihtKXttPXRoaXMuX2NvbXBvbmVudHMuaW5kZXhPZihtKTswPD1tJiZ0aGlzLl9jb21wb25lbnRzLnNwbGljZShtLDEpfTtyZXR1cm4gcH0oaCgyOSkuQ29tcG9uZW50Q29udGFpbmVyKTtmLkdyb3VwPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX07aCgwKTtkPWgoNCk7dmFyIHQ7KGZ1bmN0aW9uKGwpe2xbbC5WQUxVRT0wXT0KIlZBTFVFIjtsW2wuUElYRUw9MV09IlBJWEVMIn0pKHR8fCh0PXt9KSk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0pe3ZhciBuPWwuY2FsbCh0aGlzKXx8dGhpcztuLl9tb2RlPXQuVkFMVUU7aWYobSE9PXAuT1JJRU5UQVRJT05fVkVSVElDQUwmJm0hPT1wLk9SSUVOVEFUSU9OX0hPUklaT05UQUwpdGhyb3cgRXJyb3IobSsiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBHdWlkZUxpbmVMYXllciIpO24uX29yaWVudGF0aW9uPW07bi5fb3ZlcmZsb3dIaWRkZW49ITA7bi5hZGRDbGFzcygiZ3VpZGUtbGluZS1sYXllciIpO24uX2lzVmVydGljYWwoKT9uLmFkZENsYXNzKCJ2ZXJ0aWNhbCIpOm4uYWRkQ2xhc3MoImhvcml6b250YWwiKTtuLl9zY2FsZVVwZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7bi5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO24ucmVuZGVyKCl9O3JldHVybiBufWsocCxsKTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5fZ3VpZGVMaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImd1aWRlLWxpbmUiLCEwKX07cC5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24obSxuKXtyZXR1cm57d2lkdGg6bSxoZWlnaHQ6bn19O3AucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uPT09cC5PUklFTlRBVElPTl9WRVJUSUNBTH07cC5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfTtwLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfTtwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKG0sbixxKXtsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxtLG4scSk7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMuc2NhbGUoKS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLnNjYWxlKCkucmFuZ2UoW3RoaXMuaGVpZ2h0KCksCjBdKSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5fZ3VpZGVMaW5lLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpfSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlPWZ1bmN0aW9uKCl7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fbW9kZT09PXQuVkFMVUUmJm51bGwhPXRoaXMudmFsdWUoKT90aGlzLl9waXhlbFBvc2l0aW9uPQp0aGlzLnNjYWxlKCkuc2NhbGUodGhpcy52YWx1ZSgpKTp0aGlzLl9tb2RlPT09dC5QSVhFTCYmbnVsbCE9dGhpcy5waXhlbFBvc2l0aW9uKCkmJih0aGlzLl92YWx1ZT10aGlzLnNjYWxlKCkuaW52ZXJ0KHRoaXMucGl4ZWxQb3NpdGlvbigpKSkpfTtwLnByb3RvdHlwZS5fc2V0UGl4ZWxQb3NpdGlvbldpdGhvdXRDaGFuZ2luZ01vZGU9ZnVuY3Rpb24obSl7dGhpcy5fcGl4ZWxQb3NpdGlvbj1tO251bGwhPXRoaXMuc2NhbGUoKSYmKHRoaXMuX3ZhbHVlPXRoaXMuc2NhbGUoKS5pbnZlcnQodGhpcy5waXhlbFBvc2l0aW9uKCkpKTt0aGlzLnJlbmRlcigpfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9zY2FsZTt2YXIgbj10aGlzLl9zY2FsZTtudWxsIT1uJiZuLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKTt0aGlzLl9zY2FsZT1tO3RoaXMuX3NjYWxlLm9uVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spOwp0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fdmFsdWU7dGhpcy5fdmFsdWU9bTt0aGlzLl9tb2RlPXQuVkFMVUU7dGhpcy5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnBpeGVsUG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGl4ZWxQb3NpdGlvbn07cC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2wucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtudWxsIT10aGlzLnNjYWxlKCkmJnRoaXMuc2NhbGUoKS5vZmZVcGRhdGUodGhpcy5fc2NhbGVVcGRhdGVDYWxsYmFjayl9O3JldHVybiBwfShkLkNvbXBvbmVudCk7ZC5PUklFTlRBVElPTl9WRVJUSUNBTD0idmVydGljYWwiO2QuT1JJRU5UQVRJT05fSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCI7CmYuR3VpZGVMaW5lTGF5ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMCk7ZD1oKDQpO3ZhciBsOyhmdW5jdGlvbihwKXtwW3AuVkFMVUU9MF09IlZBTFVFIjtwW3AuUElYRUw9MV09IlBJWEVMIn0pKGw9Zi5Qcm9wZXJ0eU1vZGV8fChmLlByb3BlcnR5TW9kZT17fSkpO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPXAuY2FsbCh0aGlzKXx8dGhpcztuLl9ib3hWaXNpYmxlPSExO24uX2JveEJvdW5kcz17dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fTtuLl94Qm91bmRzTW9kZT1sLlBJWEVMO24uX3lCb3VuZHNNb2RlPQpsLlBJWEVMO24uYWRkQ2xhc3MoInNlbGVjdGlvbi1ib3gtbGF5ZXIiKTtuLl9hZGp1c3RCb3VuZHNDYWxsYmFjaz1mdW5jdGlvbigpe24ucmVuZGVyKCl9O24uX292ZXJmbG93SGlkZGVuPSEwO24uX3hFeHRlbnQ9W3ZvaWQgMCx2b2lkIDBdO24uX3lFeHRlbnQ9W3ZvaWQgMCx2b2lkIDBdO3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9ib3g9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic2VsZWN0aW9uLWJveCIsITApLnJlbW92ZSgpO3RoaXMuX2JveEFyZWE9dGhpcy5fYm94LmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInNlbGVjdGlvbi1hcmVhIiwhMCl9O20ucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKG4scSl7cmV0dXJue3dpZHRoOm4saGVpZ2h0OnF9fTttLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fZ2V0Qm91bmRzKCk7CnRoaXMuX3NldEJvdW5kcyhuKTt0aGlzLl95Qm91bmRzTW9kZT10aGlzLl94Qm91bmRzTW9kZT1sLlBJWEVMO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24obil7dGhpcy5fYm94Qm91bmRzPXt0b3BMZWZ0Ont4Ok1hdGgubWluKG4udG9wTGVmdC54LG4uYm90dG9tUmlnaHQueCkseTpNYXRoLm1pbihuLnRvcExlZnQueSxuLmJvdHRvbVJpZ2h0LnkpfSxib3R0b21SaWdodDp7eDpNYXRoLm1heChuLnRvcExlZnQueCxuLmJvdHRvbVJpZ2h0LngpLHk6TWF0aC5tYXgobi50b3BMZWZ0Lnksbi5ib3R0b21SaWdodC55KX19fTttLnByb3RvdHlwZS5fZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJue3RvcExlZnQ6e3g6dGhpcy5feEJvdW5kc01vZGU9PT1sLlBJWEVMP3RoaXMuX2JveEJvdW5kcy50b3BMZWZ0Lng6bnVsbD09dGhpcy5feFNjYWxlPzA6TWF0aC5taW4odGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVswXSksCnRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMV0pKSx5OnRoaXMuX3lCb3VuZHNNb2RlPT09bC5QSVhFTD90aGlzLl9ib3hCb3VuZHMudG9wTGVmdC55Om51bGw9PXRoaXMuX3lTY2FsZT8wOk1hdGgubWluKHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMF0pLHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMV0pKX0sYm90dG9tUmlnaHQ6e3g6dGhpcy5feEJvdW5kc01vZGU9PT1sLlBJWEVMP3RoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC54Om51bGw9PXRoaXMuX3hTY2FsZT8wOk1hdGgubWF4KHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMF0pLHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMV0pKSx5OnRoaXMuX3lCb3VuZHNNb2RlPT09bC5QSVhFTD90aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueTpudWxsPT10aGlzLl95U2NhbGU/MDpNYXRoLm1heCh0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzBdKSwKdGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVsxXSkpfX19O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTtpZih0aGlzLl9ib3hWaXNpYmxlKXt2YXIgbj10aGlzLmJvdW5kcygpLHE9bi50b3BMZWZ0LnksdT1uLmJvdHRvbVJpZ2h0LnkseD1uLnRvcExlZnQueDtuPW4uYm90dG9tUmlnaHQueDtpZighKHQuTWF0aC5pc1ZhbGlkTnVtYmVyKHEpJiZ0Lk1hdGguaXNWYWxpZE51bWJlcih1KSYmdC5NYXRoLmlzVmFsaWROdW1iZXIoeCkmJnQuTWF0aC5pc1ZhbGlkTnVtYmVyKG4pKSl0aHJvdyBFcnJvcigiYm91bmRzIGhhdmUgbm90IGJlZW4gcHJvcGVybHkgc2V0Iik7dGhpcy5fYm94QXJlYS5hdHRycyh7eCx5OnEsd2lkdGg6bi14LGhlaWdodDp1LXF9KTt0aGlzLmNvbnRlbnQoKS5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fYm94Lm5vZGUoKSl9ZWxzZSB0aGlzLl9ib3gucmVtb3ZlKCk7CnJldHVybiB0aGlzfTttLnByb3RvdHlwZS5ib3hWaXNpYmxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2JveFZpc2libGU7dGhpcy5fYm94VmlzaWJsZT1uO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07bS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07bS5wcm90b3R5cGUueFNjYWxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3hTY2FsZTtudWxsIT10aGlzLl94U2NhbGUmJnRoaXMuX3hTY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO3RoaXMuX3hTY2FsZT1uO3RoaXMuX3hCb3VuZHNNb2RlPWwuVkFMVUU7dGhpcy5feFNjYWxlLm9uVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS55U2NhbGU9ZnVuY3Rpb24obil7aWYobnVsbD09Cm4pcmV0dXJuIHRoaXMuX3lTY2FsZTtudWxsIT10aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO3RoaXMuX3lTY2FsZT1uO3RoaXMuX3lCb3VuZHNNb2RlPWwuVkFMVUU7dGhpcy5feVNjYWxlLm9uVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS54RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFhFeHRlbnQoKX07bS5wcm90b3R5cGUuX2dldFhFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feEJvdW5kc01vZGU9PT1sLlZBTFVFP3RoaXMuX3hFeHRlbnQ6bnVsbD09dGhpcy5feFNjYWxlP1t2b2lkIDAsdm9pZCAwXTpbdGhpcy5feFNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMudG9wTGVmdC54KSx0aGlzLl94U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC54KV19O20ucHJvdG90eXBlLl9zZXRYRXh0ZW50PQpmdW5jdGlvbihuKXt0aGlzLl94RXh0ZW50PW59O20ucHJvdG90eXBlLnlFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0WUV4dGVudCgpfTttLnByb3RvdHlwZS5fZ2V0WUV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl95Qm91bmRzTW9kZT09PWwuVkFMVUU/dGhpcy5feUV4dGVudDpudWxsPT10aGlzLl95U2NhbGU/W3ZvaWQgMCx2b2lkIDBdOlt0aGlzLl95U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy50b3BMZWZ0LnkpLHRoaXMuX3lTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0LnkpXX07bS5wcm90b3R5cGUuX3NldFlFeHRlbnQ9ZnVuY3Rpb24obil7dGhpcy5feUV4dGVudD1ufTttLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO251bGwhPXRoaXMuX3hTY2FsZSYmdGhpcy54U2NhbGUoKS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO251bGwhPXRoaXMuX3lTY2FsZSYmCnRoaXMueVNjYWxlKCkub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKX07cmV0dXJuIG19KGQuQ29tcG9uZW50KTtmLlNlbGVjdGlvbkJveExheWVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJwYXRoIiwiYXJjIGZpbGwiKXx8dGhpc31rKGwsdCk7bC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24ocCl7cC5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfTtyZXR1cm4gbH0oaCg5KS5TVkdEcmF3ZXIpO2YuQXJjU1ZHRHJhd2VyPQpkfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3JldHVybiB0LmNhbGwodGhpcywicGF0aCIsImFyYyBvdXRsaW5lIil8fHRoaXN9ayhsLHQpO2wucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHApe3Auc3R5bGUoImZpbGwiLCJub25lIil9O3JldHVybiBsfShoKDkpLlNWR0RyYXdlcik7Zi5BcmNPdXRsaW5lU1ZHRHJhd2VyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxOCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7cmV0dXJuIHAuY2FsbCh0aGlzLCJwYXRoIiwiYXJlYSIpfHx0aGlzfWsobSxwKTttLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbihuKXtuLnN0eWxlKCJzdHJva2UiLCJub25lIil9O20ucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsMCl9O3JldHVybiBtfShoKDkpLlNWR0RyYXdlcik7Zi5BcmVhU1ZHRHJhd2VyPWQ7dmFyIGw9WyJmaWxsIiwib3BhY2l0eSIsImZpbGwtb3BhY2l0eSJdO2YubWFrZUFyZWFDYW52YXNEcmF3U3RlcD1mdW5jdGlvbihwKXtyZXR1cm4gZnVuY3Rpb24obSwKbixxKXtxPXQucmVzb2x2ZUF0dHJpYnV0ZXMocSxsLG5bMF0sMCk7dC5yZW5kZXJBcmVhKG0scCgpLG5bMF0scSl9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHRbbV09bFttXSk7dC5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gdC5jYWxsKHRoaXMsImxpbmUiLCIiKXx8dGhpc31rKGwsdCk7cmV0dXJuIGx9KGgoOSkuU1ZHRHJhd2VyKTtmLlNlZ21lbnRTVkdEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsobixxLHUseCxBKXtyZXR1cm4gMDw9dStBJiZ1LUE8PW4mJjA8PXgrQSYmeC1BPD1xfWZ1bmN0aW9uIHQobixxLHUpe2lmKG51bGw9PW4pcmV0dXJuITE7CmZvcih2YXIgeD0wO3g8dS5sZW5ndGg7eCsrKXt2YXIgQT11W3hdO2lmKG5bQV0hPXFbQV0pcmV0dXJuITF9cmV0dXJuITB9dmFyIGw9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHggaW4gcSlxLmhhc093blByb3BlcnR5KHgpJiYoblt4XT1xW3hdKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHA9aCg4NiksbT1oKDE4KTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXtyZXR1cm4gbi5jYWxsKHRoaXMsInBhdGgiLCJzeW1ib2wiKXx8dGhpc31sKHEsbik7cmV0dXJuIHF9KGgoOSkuU1ZHRHJhd2VyKTtmLlN5bWJvbFNWR0RyYXdlcj1kO2YubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKG4scSx1KXt2YXIgeD10aGlzO3JldHVybiBmdW5jdGlvbihBLHksdyl7dmFyIEM9QS5jYW52YXMsRz1DLmNsaWVudFdpZHRoOwpDPUMuY2xpZW50SGVpZ2h0O2Zvcih2YXIgRD1uZXcgcC5DYW52YXNCdWZmZXIoMCwwKSxCPXEoKSxJPXUoKSxOPW51bGwsTz1udWxsLEg9bnVsbCxLPTA7Szx5Lmxlbmd0aDtLKyspe3ZhciBNPXlbS107aWYobnVsbCE9TSl7dmFyIEw9bS5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXModyxbIngiLCJ5Il0sTSxLKSxRPUkoTSxLLG4pO2lmKGsoRyxDLEwueCxMLnksUSkpe3ZhciBUPXQoTixMLG0uQ29udGV4dFN0eWxlQXR0cnMpO009QihNLEsseC5fZGF0YXNldCk7VCYmSD09USYmTz09TXx8KE49bS5nZXRTdHJva2VXaWR0aChMKSxOPVErTisxLChOPkQuc2NyZWVuV2lkdGh8fE4+RC5zY3JlZW5IZWlnaHQpJiZELnJlc2l6ZShOLE4sITApLEQuY2xlYXIoKSxOPUQuY3R4LE4uYmVnaW5QYXRoKCksTShRKS5jb250ZXh0KE4pKG51bGwpLE4uY2xvc2VQYXRoKCksbS5yZW5kZXJQYXRoV2l0aFN0eWxlKE4sTCksTz1NLEg9USxOPUwpO0QuYmxpdENlbnRlcihBLEwueCxMLnkpfX19fX19LApmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhEKXtyZXR1cm4gRCBpbnN0YW5jZW9mIHk/RDpEIGluc3RhbmNlb2YgRGF0ZT9wKEQudmFsdWVPZigpKTpEIGluc3RhbmNlb2YgQS5TY2FsZT90KEQpOkQgaW5zdGFuY2VvZiB4LkRhdGFzZXQ/bChEKTp1KEQpP24oRCk6QXJyYXkuaXNBcnJheShEKT9tKEQpOnAoRCl9ZnVuY3Rpb24gdChEKXtEPXtkb21haW46RC5kb21haW4oKSxyYW5nZTpELnJhbmdlKCksdXBkYXRlSWQ6RC51cGRhdGVJZCgpLHJlZjpwKEQpfTtyZXR1cm4gbihEKX1mdW5jdGlvbiBsKEQpe0Q9e3JlZjpwKEQpLHVwZGF0ZUlkOkQudXBkYXRlSWQoKX07cmV0dXJuIG4oRCl9ZnVuY3Rpb24gcChEKXtyZXR1cm4gbmV3IEMoRCl9ZnVuY3Rpb24gbShEKXtyZXR1cm4gbmV3IHcoRC5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIGsoQil9KSl9ZnVuY3Rpb24gbihEKXt2YXIgQj17fSxJO2ZvcihJIGluIEQpRC5oYXNPd25Qcm9wZXJ0eShJKSYmKEJbSV09ayhEW0ldKSk7cmV0dXJuIG5ldyBHKEIpfQp2YXIgcT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBJKCl7dGhpcy5jb25zdHJ1Y3Rvcj1EfWZvcih2YXIgTiBpbiBCKUIuaGFzT3duUHJvcGVydHkoTikmJihEW05dPUJbTl0pO0QucHJvdG90eXBlPW51bGw9PT1CP09iamVjdC5jcmVhdGUoQik6KEkucHJvdG90eXBlPUIucHJvdG90eXBlLG5ldyBJKX0sdT1oKDEyOCkseD1oKDM4KSxBPWgoMTcpO2Yuc2lnbj1rO2Yuc2lnblNjYWxlPXQ7Zi5zaWduRGF0YXNldD1sO2Yuc2lnblJlZj1wO2Yuc2lnbkFycmF5PW07Zi5zaWduT2JqPW47dmFyIHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBEKCl7fUQucHJvdG90eXBlLmlzRGlmZmVyZW50PWZ1bmN0aW9uKEIpe3JldHVybiBCIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj90aGlzLmlzU2lnbmF0dXJlRGlmZmVyZW50KEIpOiEwfTtyZXR1cm4gRH0oKTtmLlNpZ25hdHVyZT15O3ZhciB3PWZ1bmN0aW9uKEQpe2Z1bmN0aW9uIEIoSSl7dmFyIE49RC5jYWxsKHRoaXMpfHwKdGhpcztOLmFycmF5PUk7cmV0dXJuIE59cShCLEQpO0IucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50PWZ1bmN0aW9uKEkpe2lmKEkuYXJyYXkubGVuZ3RoIT09dGhpcy5hcnJheS5sZW5ndGgpcmV0dXJuITA7Zm9yKHZhciBOPTA7Tjx0aGlzLmFycmF5Lmxlbmd0aDtOKyspaWYodGhpcy5hcnJheVtOXS5pc0RpZmZlcmVudChJLmFycmF5W05dKSlyZXR1cm4hMDtyZXR1cm4hMX07cmV0dXJuIEJ9KHkpO2YuQXJyYXlTaWduYXR1cmU9dzt2YXIgQz1mdW5jdGlvbihEKXtmdW5jdGlvbiBCKEkpe3ZhciBOPUQuY2FsbCh0aGlzKXx8dGhpcztOLnJlZj1JO3JldHVybiBOfXEoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihJKXtyZXR1cm4gdGhpcy5yZWYhPT1JLnJlZn07cmV0dXJuIEJ9KHkpO2YuUmVmZXJlbmNlU2lnbmF0dXJlPUM7dmFyIEc9ZnVuY3Rpb24oRCl7ZnVuY3Rpb24gQihJKXt2YXIgTj1ELmNhbGwodGhpcyl8fHRoaXM7Ti5vYmo9Ckk7cmV0dXJuIE59cShCLEQpO0IucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50PWZ1bmN0aW9uKEkpe3ZhciBOPU9iamVjdC5rZXlzKHRoaXMub2JqKSxPPU9iamVjdC5rZXlzKEkub2JqKTtpZihOLmxlbmd0aCE9PU8ubGVuZ3RoKXJldHVybiEwO2ZvcihPPTA7TzxOLmxlbmd0aDtPKyspe3ZhciBIPU5bT107aWYoIUkub2JqLmhhc093blByb3BlcnR5KEgpfHx0aGlzLm9ialtIXS5pc0RpZmZlcmVudChJLm9ialtIXSkpcmV0dXJuITB9cmV0dXJuITF9O3JldHVybiBCfSh5KTtmLk9iamVjdFNpZ25hdHVyZT1HfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHksdyl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9eX1mb3IodmFyIEcgaW4gdyl3Lmhhc093blByb3BlcnR5KEcpJiYoeVtHXT13W0ddKTt5LnByb3RvdHlwZT1udWxsPT09dz9PYmplY3QuY3JlYXRlKHcpOihDLnByb3RvdHlwZT13LnByb3RvdHlwZSxuZXcgQyl9LAp0PWgoMSksbD1oKDMpLHA9aCgwKSxtPWgoMTQpLG49aCg0NikscT1oKDYpLHU9aCgzMykseD1oKDE5KTtkPWgoNTMpO3ZhciBBPWgoMik7aD1mdW5jdGlvbih5KXtmdW5jdGlvbiB3KCl7dmFyIEM9eS5jYWxsKHRoaXMpfHx0aGlzO0MuYWRkQ2xhc3MoImFyZWEtcGxvdCIpO0MueTAoMCk7Qy5hdHRyKCJmaWxsLW9wYWNpdHkiLC4yNSk7Qy5hdHRyKCJmaWxsIiwobmV3IGwuQ29sb3IpLnJhbmdlKClbMF0pO0MuX2xpbmVEcmF3ZXJzPW5ldyBwLk1hcDtyZXR1cm4gQ31rKHcseSk7dy5wcm90b3R5cGUueT1mdW5jdGlvbihDLEcpe2lmKG51bGw9PUMpcmV0dXJuIHkucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1HP3kucHJvdG90eXBlLnkuY2FsbCh0aGlzLEMpOnkucHJvdG90eXBlLnkuY2FsbCh0aGlzLEMsRyk7bnVsbCE9RyYmKEM9dGhpcy55MCgpLmFjY2Vzc29yLG51bGwhPUMmJnRoaXMuX2JpbmRQcm9wZXJ0eSh3Ll9ZMF9LRVksQyxHKSx0aGlzLl91cGRhdGVZU2NhbGUoKSk7CnJldHVybiB0aGlzfTt3LnByb3RvdHlwZS55MD1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9ZMF9LRVkpO3ZhciBHPXRoaXMueSgpO3RoaXMuX2JpbmRQcm9wZXJ0eSh3Ll9ZMF9LRVksQyxHJiZHLnNjYWxlKTt0aGlzLl91cGRhdGVZU2NhbGUoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7eS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpO3RoaXMuX3VwZGF0ZVlTY2FsZSgpfTt3LnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihDKXt2YXIgRz10aGlzO3RoaXMuX2xpbmVEcmF3ZXJzLnNldChDLG5ldyBtLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LkxpbmVTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEQpe3JldHVybiBuZXcgbS5DYW52YXNEcmF3ZXIoRCx1Lm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoZnVuY3Rpb24oKXt2YXIgQj0KQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLngoKSksST1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcueSgpKTtyZXR1cm4gRy5fZDNMaW5lRmFjdG9yeShDLEIsSSl9KSl9KSk7eS5wcm90b3R5cGUuX2FkZERhdGFzZXQuY2FsbCh0aGlzLEMpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKEMpe3kucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLEMpO0M9dGhpcy5fbGluZURyYXdlcnMuZ2V0KEMpOyJzdmciPT09dGhpcy5yZW5kZXJlcigpP0MudXNlU1ZHKHRoaXMuX3JlbmRlckFyZWEpOkMudXNlQ2FudmFzKHRoaXMuX2NhbnZhcyk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oQyl7eS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsQyk7dGhpcy5fbGluZURyYXdlcnMuZ2V0KEMpLnJlbW92ZSgpfTt3LnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PQpmdW5jdGlvbigpe3ZhciBDPXRoaXMsRz10aGlzLl9nZW5lcmF0ZUxpbmVEcmF3U3RlcHMoKSxEPXRoaXMuX2dldERhdGFUb0RyYXcoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgST1BLlBsb3QuYXBwbHlEcmF3U3RlcHMoRyxCKTtDLl9saW5lRHJhd2Vycy5nZXQoQikuZHJhdyhELmdldChCKSxJKX0pfTt3LnByb3RvdHlwZS5fZ2VuZXJhdGVMaW5lRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIEM9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgRz10aGlzLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3IoKTtHLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpKTtDLnB1c2goe2F0dHJUb1Byb2plY3RvcjpHLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHguQW5pbWF0b3IuUkVTRVQpfSl9Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yKCksCmFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHguQW5pbWF0b3IuTUFJTil9KTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX2dlbmVyYXRlTGluZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBDPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0MuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbihDKXt2YXIgRz10aGlzO3JldHVybiBuZXcgcS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgbi5BcmVhU1ZHRHJhd2VyfSxmdW5jdGlvbihEKXtyZXR1cm4gbmV3IG0uQ2FudmFzRHJhd2VyKEQsbi5tYWtlQXJlYUNhbnZhc0RyYXdTdGVwKGZ1bmN0aW9uKCl7dmFyIEI9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLngoKSksST1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcueSgpKSwKTj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcueTAoKSk7cmV0dXJuIEcuX2NyZWF0ZUFyZWFHZW5lcmF0b3IoQixJLE4sRy5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihCLEkpLEMpfSkpfSl9O3cucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBDPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7Ry5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3IoQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksdGhpcy5fZ2V0UmVzZXRZRnVuY3Rpb24oKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSkpO0MucHVzaCh7YXR0clRvUHJvamVjdG9yOkcsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoeC5BbmltYXRvci5SRVNFVCl9KX1DLnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLk1BSU4pfSk7CnJldHVybiBDfTt3LnByb3RvdHlwZS5fdXBkYXRlWVNjYWxlPWZ1bmN0aW9uKCl7dmFyIEM9dGhpcy5nZXRFeHRlbnRzRm9yUHJvcGVydHkoInkwIik7Qz1wLkFycmF5LnVuaXEocC5BcnJheS5mbGF0dGVuKEMpKTt2YXIgRz0xPT09Qy5sZW5ndGg/Q1swXTpudWxsO0M9KEM9dGhpcy55KCkpJiZDLnNjYWxlO251bGwhPUMmJihudWxsIT10aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlciYmKEMucmVtb3ZlUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlciksdGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXI9bnVsbCksbnVsbCE9RyYmKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW0ddfSxDLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXIpKSl9O3cucHJvdG90eXBlLl9nZXRSZXNldFlGdW5jdGlvbj0KZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkwKCkpfTt3LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEM9eS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpO0MuZD10aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MCgpKSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpczt2b2lkIDA9PT1DJiYoQz10aGlzLmRhdGFzZXRzKCkpO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiB0LnNlbGVjdEFsbCgpO3ZhciBEPXkucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLEMpLm5vZGVzKCk7Qy5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIEcuX2xpbmVEcmF3ZXJzLmdldChCKX0pLmZpbHRlcihmdW5jdGlvbihCKXtyZXR1cm4gbnVsbCE9CkJ9KS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3JldHVybiBELnB1c2guYXBwbHkoRCxCLmdldFZpc3VhbFByaW1pdGl2ZXMoKSl9KTtyZXR1cm4gdC5zZWxlY3RBbGwoRCl9O3cucHJvdG90eXBlLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yPWZ1bmN0aW9uKEMsRyxEKXt2YXIgQj10aGlzLEk9dGhpcy5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIGZ1bmN0aW9uKE4sTyxIKXtyZXR1cm4gQi5fY3JlYXRlQXJlYUdlbmVyYXRvcihDLEcsRCxJLEgpKE4pfX07dy5wcm90b3R5cGUuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3I9ZnVuY3Rpb24oQyxHKXtyZXR1cm4gZnVuY3Rpb24oRCxCLEkpe3ZhciBOPUMoRCxCLEkpO0Q9RyhELEIsSSk7cmV0dXJuIHAuTWF0aC5pc1ZhbGlkTnVtYmVyKE4pJiZwLk1hdGguaXNWYWxpZE51bWJlcihEKX19O3cucHJvdG90eXBlLl9jcmVhdGVBcmVhR2VuZXJhdG9yPQpmdW5jdGlvbihDLEcsRCxCLEkpe3ZhciBOPXRoaXMuX2dldEN1cnZlRmFjdG9yeSgpO3JldHVybiB0LmFyZWEoKS54KGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEMoTyxILEkpfSkueTEoZnVuY3Rpb24oTyxIKXtyZXR1cm4gRyhPLEgsSSl9KS55MChmdW5jdGlvbihPLEgpe3JldHVybiBEKE8sSCxJKX0pLmN1cnZlKE4pLmRlZmluZWQoZnVuY3Rpb24oTyxIKXtyZXR1cm4gQihPLEgsSSl9KX07cmV0dXJuIHd9KGQuTGluZSk7aC5fWTBfS0VZPSJ5MCI7Zi5BcmVhPWh9LGZ1bmN0aW9uKGQsZil7KGZ1bmN0aW9uKGgpe2guTUFJTj0ibWFpbiI7aC5SRVNFVD0icmVzZXQifSkoZi5BbmltYXRvcnx8KGYuQW5pbWF0b3I9e30pKX0sZnVuY3Rpb24oZCxmKXt2YXIgaD1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt2YXIgdD10aGlzO3RoaXMudHJhbnNsYXRlPXRoaXMuc2NhbGU9MDt0aGlzLmNhY2hlZERvbWFpbj1bbnVsbCxudWxsXTt0aGlzLmxhc3RTZWVuRG9tYWluPVtudWxsLG51bGxdO3RoaXMudXBkYXRlRG9tYWluPQpmdW5jdGlvbihsKXt0Lmxhc3RTZWVuRG9tYWluPWwuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTt2YXIgcD1sLnNjYWxlVHJhbnNmb3JtYXRpb24odC5jYWNoZWREb21haW5bMV0pLWwuc2NhbGVUcmFuc2Zvcm1hdGlvbih0LmNhY2hlZERvbWFpblswXSksbT1sLnNjYWxlVHJhbnNmb3JtYXRpb24odC5sYXN0U2VlbkRvbWFpblsxXSktbC5zY2FsZVRyYW5zZm9ybWF0aW9uKHQubGFzdFNlZW5Eb21haW5bMF0pO3Quc2NhbGU9cC9tfHwxO3QudHJhbnNsYXRlPWwuc2NhbGVUcmFuc2Zvcm1hdGlvbih0LmNhY2hlZERvbWFpblswXSktbC5zY2FsZVRyYW5zZm9ybWF0aW9uKHQubGFzdFNlZW5Eb21haW5bMF0pKnQuc2NhbGV8fDB9fWsucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zY2FsZT0xO3RoaXMudHJhbnNsYXRlPTA7dGhpcy5jYWNoZWREb21haW49dGhpcy5sYXN0U2VlbkRvbWFpbn07ay5wcm90b3R5cGUuc2V0RG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuY2FjaGVkRG9tYWluPQp0LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCl9O3JldHVybiBrfSgpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKHQsbCl7dmFyIHA9dGhpczt0aGlzLnJlbmRlckNhbGxiYWNrPXQ7dGhpcy5hcHBseVRyYW5zZm9ybUNhbGxiYWNrPWw7dGhpcy5kb21haW5UcmFuc2Zvcm1YPW5ldyBoO3RoaXMuZG9tYWluVHJhbnNmb3JtWT1uZXcgaDt0aGlzLnJlbmRlckRlZmVycmVkPWZ1bmN0aW9uKCl7cC5hcHBseVRyYW5zZm9ybSgpO2NsZWFyVGltZW91dChwLnRpbWVvdXRUb2tlbik7cC50aW1lb3V0VG9rZW49c2V0VGltZW91dChmdW5jdGlvbigpe3AucmVuZGVyQ2FsbGJhY2soKX0say5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVkpfX1rLnByb3RvdHlwZS5zZXREb21haW5zPWZ1bmN0aW9uKHQsbCl7dCYmdGhpcy5kb21haW5UcmFuc2Zvcm1YLnNldERvbWFpbih0KTtsJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVkuc2V0RG9tYWluKGwpO3RoaXMucmVuZGVyRGVmZXJyZWQoKX07ay5wcm90b3R5cGUudXBkYXRlRG9tYWlucz0KZnVuY3Rpb24odCxsKXt0JiZ0aGlzLmRvbWFpblRyYW5zZm9ybVgudXBkYXRlRG9tYWluKHQpO2wmJnRoaXMuZG9tYWluVHJhbnNmb3JtWS51cGRhdGVEb21haW4obCk7dGhpcy5yZW5kZXJEZWZlcnJlZCgpfTtrLnByb3RvdHlwZS5yZXNldFRyYW5zZm9ybXM9ZnVuY3Rpb24oKXt0aGlzLmRvbWFpblRyYW5zZm9ybVgucmVzZXQoKTt0aGlzLmRvbWFpblRyYW5zZm9ybVkucmVzZXQoKTt0aGlzLmFwcGx5VHJhbnNmb3JtKCl9O2sucHJvdG90eXBlLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKCl7dGhpcy5hcHBseVRyYW5zZm9ybUNhbGxiYWNrKHRoaXMuZG9tYWluVHJhbnNmb3JtWC50cmFuc2xhdGUsdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnRyYW5zbGF0ZSx0aGlzLmRvbWFpblRyYW5zZm9ybVguc2NhbGUsdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnNjYWxlKX07cmV0dXJuIGt9KCk7ZC5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVk9MjAwO2YuRGVmZXJyZWRSZW5kZXJlcj1kfSxmdW5jdGlvbihkLApmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihDLEcpe2Z1bmN0aW9uIEQoKXt0aGlzLmNvbnN0cnVjdG9yPUN9Zm9yKHZhciBCIGluIEcpRy5oYXNPd25Qcm9wZXJ0eShCKSYmKENbQl09R1tCXSk7Qy5wcm90b3R5cGU9bnVsbD09PUc/T2JqZWN0LmNyZWF0ZShHKTooRC5wcm90b3R5cGU9Ry5wcm90b3R5cGUsbmV3IEQpfSx0PWgoMSksbD1oKDcpLHA9aCgxNCksbT1oKDYpLG49aCgzMykscT1oKDMpLHU9aCgxMSkseD1oKDApO2Q9aCgxMCk7dmFyIEE9aCgxOSkseT1oKDIpO2g9aCgxNik7dmFyIHc9e2xpbmVhcjp0LmN1cnZlTGluZWFyLGxpbmVhckNsb3NlZDp0LmN1cnZlTGluZWFyQ2xvc2VkLHN0ZXA6dC5jdXJ2ZVN0ZXAsc3RlcEJlZm9yZTp0LmN1cnZlU3RlcEJlZm9yZSxzdGVwQWZ0ZXI6dC5jdXJ2ZVN0ZXBBZnRlcixiYXNpczp0LmN1cnZlQmFzaXMsYmFzaXNPcGVuOnQuY3VydmVCYXNpc09wZW4sYmFzaXNDbG9zZWQ6dC5jdXJ2ZUJhc2lzQ2xvc2VkLApidW5kbGU6dC5jdXJ2ZUJ1bmRsZSxjYXJkaW5hbDp0LmN1cnZlQ2FyZGluYWwsY2FyZGluYWxPcGVuOnQuY3VydmVDYXJkaW5hbE9wZW4sY2FyZGluYWxDbG9zZWQ6dC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkLG1vbm90b25lOnQuY3VydmVNb25vdG9uZVh9O2YuQ3VydmVOYW1lPWQubWFrZUVudW0oImxpbmVhciBsaW5lYXJDbG9zZWQgc3RlcCBzdGVwQmVmb3JlIHN0ZXBBZnRlciBiYXNpcyBiYXNpc09wZW4gYmFzaXNDbG9zZWQgYnVuZGxlIGNhcmRpbmFsIGNhcmRpbmFsT3BlbiBjYXJkaW5hbENsb3NlZCBtb25vdG9uZSIuc3BsaXQoIiAiKSk7aD1mdW5jdGlvbihDKXtmdW5jdGlvbiBHKCl7dmFyIEQ9Qy5jYWxsKHRoaXMpfHx0aGlzO0QuX2N1cnZlPSJsaW5lYXIiO0QuX2F1dG9yYW5nZVNtb290aD0hMTtELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD0hMDtELl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQ9ITE7RC5fZG93bnNhbXBsaW5nRW5hYmxlZD0hMTtELmFkZENsYXNzKCJsaW5lLXBsb3QiKTsKdmFyIEI9bmV3IGwuRWFzaW5nO0Iuc3RlcER1cmF0aW9uKHkuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7Qi5lYXNpbmdNb2RlKCJleHBJbk91dCIpO0IubWF4VG90YWxEdXJhdGlvbih5LlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0QuYW5pbWF0b3IoQS5BbmltYXRvci5NQUlOLEIpO0QuYXR0cigic3Ryb2tlIiwobmV3IHEuQ29sb3IpLnJhbmdlKClbMF0pO0QuYXR0cigic3Ryb2tlLXdpZHRoIiwiMnB4Iik7cmV0dXJuIER9ayhHLEMpO0cucHJvdG90eXBlLng9ZnVuY3Rpb24oRCxCLEkpe2lmKG51bGw9PUQpcmV0dXJuIEMucHJvdG90eXBlLnguY2FsbCh0aGlzKTtDLnByb3RvdHlwZS54LmNhbGwodGhpcyxELEIsSSk7dGhpcy5fc2V0U2NhbGVTbmFwcGluZygpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS55PWZ1bmN0aW9uKEQsQixJKXtpZihudWxsPT1EKXJldHVybiBDLnByb3RvdHlwZS55LmNhbGwodGhpcyk7Qy5wcm90b3R5cGUueS5jYWxsKHRoaXMsRCxCLApJKTt0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmF1dG9yYW5nZU1vZGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gQy5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZS5jYWxsKHRoaXMpO0MucHJvdG90eXBlLmF1dG9yYW5nZU1vZGUuY2FsbCh0aGlzLEQpO3RoaXMuX3NldFNjYWxlU25hcHBpbmcoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuYXV0b3JhbmdlU21vb3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F1dG9yYW5nZVNtb290aH07Ry5wcm90b3R5cGUuX3NldFNjYWxlU25hcHBpbmc9ZnVuY3Rpb24oKXsieCI9PT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmdGhpcy54KCkmJnRoaXMueCgpLnNjYWxlJiZ0aGlzLngoKS5zY2FsZSBpbnN0YW5jZW9mIHUuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueCgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSk7InkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJgp0aGlzLnkoKSYmdGhpcy55KCkuc2NhbGUmJnRoaXMueSgpLnNjYWxlIGluc3RhbmNlb2YgdS5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy55KCkuc2NhbGUuc25hcHBpbmdEb21haW5FbmFibGVkKCF0aGlzLmF1dG9yYW5nZVNtb290aCgpKX07Ry5wcm90b3R5cGUuY3VydmU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fY3VydmU7dGhpcy5fY3VydmU9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd25zYW1wbGluZ0VuYWJsZWR9O0cucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkO3RoaXMuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuY29sbGFwc2VEZW5zZUxpbmVzRW5hYmxlZD0KZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkO3RoaXMuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZD1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpcztyZXR1cm4gbmV3IG0uUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uTGluZVNWR0RyYXdlcn0sZnVuY3Rpb24oSSl7cmV0dXJuIG5ldyBwLkNhbnZhc0RyYXdlcihJLG4ubWFrZUxpbmVDYW52YXNEcmF3U3RlcChmdW5jdGlvbigpe3JldHVybiBCLl9kM0xpbmVGYWN0b3J5KEQpfSkpfSl9O0cucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihEKXt2YXIgQj1DLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLEQpO2lmKCF0aGlzLl9hdXRvcmFuZ2VTbW9vdGh8fHRoaXMuYXV0b3JhbmdlTW9kZSgpIT09CkR8fCJ4IiE9PXRoaXMuYXV0b3JhbmdlTW9kZSgpJiYieSIhPT10aGlzLmF1dG9yYW5nZU1vZGUoKSlyZXR1cm4gQjtEPXRoaXMuX2dldEVkZ2VJbnRlcnNlY3Rpb25Qb2ludHMoKTt2YXIgST0ieSI9PT10aGlzLmF1dG9yYW5nZU1vZGUoKT9ELmxlZnQuY29uY2F0KEQucmlnaHQpLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTi55fSk6RC50b3AuY29uY2F0KEQuYm90dG9tKS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4ueH0pO3JldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gdC5leHRlbnQodC5tZXJnZShbTixJXSkpfSl9O0cucHJvdG90eXBlLl9nZXRFZGdlSW50ZXJzZWN0aW9uUG9pbnRzPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcztpZighKHRoaXMueSgpLnNjYWxlIGluc3RhbmNlb2YgdS5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiB1LlF1YW50aXRhdGl2ZVNjYWxlKSlyZXR1cm57bGVmdDpbXSxyaWdodDpbXSx0b3A6W10sYm90dG9tOltdfTsKdmFyIEI9dGhpcy55KCkuc2NhbGUsST10aGlzLngoKS5zY2FsZSxOPXtsZWZ0OltdLHJpZ2h0OltdLHRvcDpbXSxib3R0b206W119LE89SS5zY2FsZShJLmRvbWFpbigpWzBdKSxIPUkuc2NhbGUoSS5kb21haW4oKVsxXSksSz1CLnNjYWxlKEIuZG9tYWluKClbMF0pLE09Qi5zY2FsZShCLmRvbWFpbigpWzFdKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihMKXtmb3IodmFyIFE9TC5kYXRhKCksVCxYLGFhLGxhLFosYmEsZWEsY2E9MTtjYTxRLmxlbmd0aDtjYSsrKWxhPWJhfHxJLnNjYWxlKEQueCgpLmFjY2Vzc29yKFFbY2EtMV0sY2EtMSxMKSksWj1lYXx8Qi5zY2FsZShELnkoKS5hY2Nlc3NvcihRW2NhLTFdLGNhLTEsTCkpLGJhPUkuc2NhbGUoRC54KCkuYWNjZXNzb3IoUVtjYV0sY2EsTCkpLGVhPUIuc2NhbGUoRC55KCkuYWNjZXNzb3IoUVtjYV0sY2EsTCkpLGxhPE89PT1PPD1iYSYmKFQ9Ty1sYSxYPWJhLWxhLGFhPWVhLVosVD1UKmFhL1gsTi5sZWZ0LnB1c2goe3g6TywKeTpCLmludmVydChaK1QpfSkpLGxhPEg9PT1IPD1iYSYmKFQ9SC1sYSxYPWJhLWxhLGFhPWVhLVosVD1UKmFhL1gsTi5yaWdodC5wdXNoKHt4OkgseTpCLmludmVydChaK1QpfSkpLFo8TT09PU08PWVhJiYoWD1iYS1sYSxUPU0tWixhYT1lYS1aLFQ9VCpYL2FhLE4udG9wLnB1c2goe3g6SS5pbnZlcnQobGErVCkseTpNfSkpLFo8Sz09PUs8PWVhJiYoWD1iYS1sYSxUPUstWixhYT1lYS1aLFQ9VCpYL2FhLE4uYm90dG9tLnB1c2goe3g6SS5pbnZlcnQobGErVCkseTpLfSkpfSk7cmV0dXJuIE59O0cucHJvdG90eXBlLl9nZXRSZXNldFlGdW5jdGlvbj1mdW5jdGlvbigpe3ZhciBEPXRoaXMueSgpLnNjYWxlLmRvbWFpbigpLEI9TWF0aC5tYXgoRFswXSxEWzFdKTtEPU1hdGgubWluKERbMF0sRFsxXSk7Qj0wPkImJkJ8fDA8RCYmRHx8MDt2YXIgST10aGlzLnkoKS5zY2FsZS5zY2FsZShCKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gSX19O0cucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz0KZnVuY3Rpb24oKXt2YXIgRD1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBCPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0IuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkpO0QucHVzaCh7YXR0clRvUHJvamVjdG9yOkIsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoQS5BbmltYXRvci5SRVNFVCl9KX1ELnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihBLkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIER9O0cucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBEPUMucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpO09iamVjdC5rZXlzKEQpLmZvckVhY2goZnVuY3Rpb24oQil7aWYoImQiIT09CkIpe3ZhciBJPURbQl07RFtCXT1mdW5jdGlvbihOLE8sSCl7cmV0dXJuIDA8Ti5sZW5ndGg/SShOWzBdLE8sSCk6bnVsbH19fSk7cmV0dXJuIER9O0cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oRCl7RD10aGlzLmVudGl0eU5lYXJlc3RCeVhUaGVuWShEKTtyZXR1cm4gbnVsbCE9RD9bRF06W119O0cucHJvdG90eXBlLmVudGl0eU5lYXJlc3RCeVhUaGVuWT1mdW5jdGlvbihEKXt2YXIgQj1JbmZpbml0eSxJPUluZmluaXR5LE4sTz10aGlzLmJvdW5kcygpO3RoaXMuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEgpe2lmKHguTWF0aC53aXRoaW4oSC5wb3NpdGlvbixPKSl7dmFyIEs9TWF0aC5hYnMoRC54LUgucG9zaXRpb24ueCksTT1NYXRoLmFicyhELnktSC5wb3NpdGlvbi55KTtpZihLPEJ8fEs9PT1CJiZNPEkpTj1ILEI9SyxJPU19fSk7cmV0dXJuIE59O0cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgRD1DLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7CkQuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gRH07Ry5wcm90b3R5cGUuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3I9ZnVuY3Rpb24oRCxCKXt2YXIgST10aGlzO3JldHVybiBmdW5jdGlvbihOLE8sSCl7cmV0dXJuIEkuX2QzTGluZUZhY3RvcnkoSCxELEIpKE4pfX07Ry5wcm90b3R5cGUuX2QzTGluZUZhY3Rvcnk9ZnVuY3Rpb24oRCxCLEkpe2Z1bmN0aW9uIE4oTyxILEspe3ZhciBNPUIoTyxILEspO089SShPLEgsSyk7cmV0dXJuIHguTWF0aC5pc1ZhbGlkTnVtYmVyKE0pJiZ4Lk1hdGguaXNWYWxpZE51bWJlcihPKX12b2lkIDA9PT1CJiYoQj15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSk7dm9pZCAwPT09SSYmKEk9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiB0LmxpbmUoKS54KGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEIoTywKSCxEKX0pLnkoZnVuY3Rpb24oTyxIKXtyZXR1cm4gSShPLEgsRCl9KS5jdXJ2ZSh0aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKSkuZGVmaW5lZChmdW5jdGlvbihPLEgpe3JldHVybiBOKE8sSCxEKX0pfTtHLnByb3RvdHlwZS5fZ2V0Q3VydmVGYWN0b3J5PWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcy5jdXJ2ZSgpO3JldHVybiJzdHJpbmciPT09dHlwZW9mIEQ/KEQ9d1tEXSxudWxsPT1EP3cubGluZWFyOkQpOkR9O0cucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcyxCPW5ldyB4Lk1hcDt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihJKXt2YXIgTj1JLmRhdGEoKTtpZihELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZHx8RC5fZG93bnNhbXBsaW5nRW5hYmxlZCl7dmFyIE89Ti5tYXAoZnVuY3Rpb24oSCxLKXtyZXR1cm4gS30pO0QuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkJiYoTz1ELl9maWx0ZXJDcm9wcGVkUmVuZGVyaW5nKEksTykpO0QuX2Rvd25zYW1wbGluZ0VuYWJsZWQmJgooTz1ELl9maWx0ZXJEb3duc2FtcGxpbmcoSSxPKSk7RC5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkJiYoTz1ELl9maWx0ZXJEZW5zZUxpbmVzKEksTykpO0Iuc2V0KEksW08ubWFwKGZ1bmN0aW9uKEgpe3JldHVybiBOW0hdfSldKX1lbHNlIEIuc2V0KEksW05dKX0pO3JldHVybiBCfTtHLnByb3RvdHlwZS5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZz1mdW5jdGlvbihELEIpe2Z1bmN0aW9uIEkoYWEsbGEpe3JldHVybiB4Lk1hdGguaW5SYW5nZShhYSwwLE4ud2lkdGgoKSkmJnguTWF0aC5pblJhbmdlKGxhLDAsTi5oZWlnaHQoKSl9Zm9yKHZhciBOPXRoaXMsTz15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxIPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEs9RC5kYXRhKCksTT1bXSxMPTA7TDxCLmxlbmd0aDtMKyspe3ZhciBRPU8oS1tCW0xdXSxCW0xdLEQpLFQ9SChLW0JbTF1dLEJbTF0sRCk7UT1JKFEsVCk7aWYoIVEmJm51bGwhPUJbTC0KMV0mJm51bGwhPUtbQltMLTFdXSl7VD1PKEtbQltMLTFdXSxCW0wtMV0sRCk7dmFyIFg9SChLW0JbTC0xXV0sQltMLTFdLEQpO1E9UXx8SShULFgpfVF8fG51bGw9PUJbTCsxXXx8bnVsbD09S1tCW0wrMV1dfHwoVD1PKEtbQltMKzFdXSxCW0wrMV0sRCksWD1IKEtbQltMKzFdXSxCW0wrMV0sRCksUT1RfHxJKFQsWCkpO1EmJk0ucHVzaChCW0xdKX1yZXR1cm4gTX07Ry5wcm90b3R5cGUuX2ZpbHRlckRvd25zYW1wbGluZz1mdW5jdGlvbihELEIpe2Z1bmN0aW9uIEkoZWEsY2Epe3ZhciBrYT1PKE5bQltlYV1dLEJbZWFdLEQpLFk9SChOW0JbZWFdXSxCW2VhXSxEKSxFYT1PKE5bQltlYSsxXV0sQltlYSsxXSxEKTtlYT1IKE5bQltlYSsxXV0sQltlYSsxXSxEKTtyZXR1cm4gSW5maW5pdHk9PT1jYT9NYXRoLmZsb29yKGthKT09PU1hdGguZmxvb3IoRWEpOk1hdGguZmxvb3IoZWEpPT09TWF0aC5mbG9vcihZKyhFYS1rYSkqY2EpfWlmKDA9PT1CLmxlbmd0aClyZXR1cm5bXTtmb3IodmFyIE49CkQuZGF0YSgpLE89eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksSD15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxLPVtCWzBdXSxNPTA7TTxCLmxlbmd0aC0xOyl7dmFyIEw9QltNXSxRPU8oTltCW01dXSxCW01dLEQpLFQ9SChOW0JbTV1dLEJbTV0sRCksWD1PKE5bQltNKzFdXSxCW00rMV0sRCksYWE9SChOW0JbTSsxXV0sQltNKzFdLEQpO2FhPU1hdGguZmxvb3IoUSk9PT1NYXRoLmZsb29yKFgpP0luZmluaXR5OihhYS1UKS8oWC1RKTtYPUJbTV07VD1JbmZpbml0eT09PWFhP1Q6UTtRPVg7Zm9yKHZhciBsYT1ULFo9ITA7TTxCLmxlbmd0aC0xJiYoWnx8SShNLGFhKSk7KXtNKys7Wj0hMTt2YXIgYmE9SW5maW5pdHk9PT1hYT9IKE5bQltNXV0sQltNXSxEKTpPKE5bQltNXV0sQltNXSxEKTtiYT5sYSYmKGxhPWJhLFE9QltNXSk7YmE8VCYmKFQ9YmEsWD1CW01dKX1hYT1CW01dO1ghPT1MJiZLLnB1c2goWCk7USE9PVgmJlEhPT1MJiZLLnB1c2goUSk7YWEhPT0KTCYmYWEhPT1YJiZhYSE9PVEmJksucHVzaChhYSl9cmV0dXJuIEt9O0cucHJvdG90eXBlLl9maWx0ZXJEZW5zZUxpbmVzPWZ1bmN0aW9uKEQsQil7aWYoMD09PUIubGVuZ3RoKXJldHVybltdO3ZhciBJPUQuZGF0YSgpLE49eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksTz15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTtyZXR1cm4gdGhpcy5fYnVja2V0QnlYKEQsQixmdW5jdGlvbihIKXtyZXR1cm4gTihJW0hdLEgsRCl9LGZ1bmN0aW9uKEgpe3JldHVybiBPKElbSF0sSCxEKX0pfTtHLnByb3RvdHlwZS5fYnVja2V0QnlYPWZ1bmN0aW9uKEQsQixJLE4pe3ZhciBPPVtdO0Q9RC5kYXRhKCk7Zm9yKHZhciBIPW51bGwsSz0wO0s8PUIubGVuZ3RoOysrSyl7dmFyIE09QltLXTtpZihudWxsIT1EW01dKXt2YXIgTD1NYXRoLmZsb29yKEkoTSkpLFE9TihNKTtudWxsPT1IP0g9bmV3IHguQnVja2V0KE0sTCxRKTpILmlzSW5CdWNrZXQoTCk/SC5hZGRUb0J1Y2tldChRLApNKTooTy5wdXNoLmFwcGx5KE8sSC5nZXRVbmlxdWVJbmRpY2VzKCkpLEg9bmV3IHguQnVja2V0KE0sTCxRKSl9fW51bGwhPUgmJk8ucHVzaC5hcHBseShPLEguZ2V0VW5pcXVlSW5kaWNlcygpKTtyZXR1cm4gT307cmV0dXJuIEd9KGguWFlQbG90KTtmLkxpbmU9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMSksbD1oKDI2KSxwPWgoMCksbT1bMCwxXTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXt2YXIgdT1uLmNhbGwodGhpcyl8fHRoaXM7dS5fcmFuZ2U9WzAsMV07dS5fZDNTY2FsZT10LnNjYWxlQmFuZCgpO3UuX2QzU2NhbGUucmFuZ2UobSk7CnUuX2QzVHJhbnNmb3JtYXRpb25TY2FsZT10LnNjYWxlTGluZWFyKCk7dS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbihtKTt1Ll9pbm5lclBhZGRpbmc9cS5fY29udmVydFRvUGxvdHRhYmxlSW5uZXJQYWRkaW5nKCk7dS5fb3V0ZXJQYWRkaW5nPXEuX2NvbnZlcnRUb1Bsb3R0YWJsZU91dGVyUGFkZGluZygpO3JldHVybiB1fWsocSxuKTtxLnByb3RvdHlwZS5jbG9uZVdpdGhvdXRQcm92aWRlcnM9ZnVuY3Rpb24oKXt2YXIgdT0obmV3IHEpLmRvbWFpbih0aGlzLmRvbWFpbigpKS5yYW5nZSh0aGlzLnJhbmdlKCkpLmlubmVyUGFkZGluZyh0aGlzLmlubmVyUGFkZGluZygpKS5vdXRlclBhZGRpbmcodGhpcy5vdXRlclBhZGRpbmcoKSk7dS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKCkpO3JldHVybiB1fTtxLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbih1KXtyZXR1cm4gcC5BcnJheS51bmlxKHUpfTsKcS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBwLkFycmF5LnVuaXEodGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKSl9O3EucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbih1KXtyZXR1cm4gbi5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyx1KX07cS5wcm90b3R5cGUuaW52ZXJ0UmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdSx4PXRoaXM7dm9pZCAwPT09dSYmKHU9dGhpcy5yYW5nZSgpKTt2YXIgQT10aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpLHk9dGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHVbMF0pLHc9dGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHVbMV0pO3U9dGhpcy5fZDNTY2FsZS5kb21haW4oKTt2YXIgQz11Lm1hcChmdW5jdGlvbihHKXtyZXR1cm4geC5fZDNTY2FsZShHKStBLzJ9KTt5PXQuYmlzZWN0KEMseSk7dz10LmJpc2VjdChDLHcpO3JldHVybiB1LnNsaWNlKHksdyl9O3EucHJvdG90eXBlLnJhbmdlPWZ1bmN0aW9uKHUpe3JldHVybiBuLnByb3RvdHlwZS5yYW5nZS5jYWxsKHRoaXMsCnUpfTtxLl9jb252ZXJ0VG9QbG90dGFibGVJbm5lclBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMS8uNy0xfTtxLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4uNS8uN307cS5wcm90b3R5cGUuX3NldEJhbmRzPWZ1bmN0aW9uKCl7dmFyIHU9MS0xLygxK3RoaXMuaW5uZXJQYWRkaW5nKCkpLHg9dGhpcy5vdXRlclBhZGRpbmcoKS8oMSt0aGlzLmlubmVyUGFkZGluZygpKTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdJbm5lcih1KTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdPdXRlcih4KX07cS5wcm90b3R5cGUucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkpfTtxLnByb3RvdHlwZS5zdGVwV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzY2FsZUJhbmQodGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSooMSt0aGlzLmlubmVyUGFkZGluZygpKSl9O3EucHJvdG90eXBlLnRpY2tzPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtxLnByb3RvdHlwZS5pbm5lclBhZGRpbmc9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5faW5uZXJQYWRkaW5nO3RoaXMuX2lubmVyUGFkZGluZz11O3RoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5vdXRlclBhZGRpbmc9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fb3V0ZXJQYWRkaW5nO3RoaXMuX291dGVyUGFkZGluZz11O3RoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih1KXt1PXRoaXMuX2QzU2NhbGUodSkrdGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKS8yO3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodSl9O3EucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odSx4KXt2YXIgQT10aGlzOwp0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcChmdW5jdGlvbih5KXtyZXR1cm4gQS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChsLnpvb21PdXQoeSx1LHgpKX0pKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5wYW49ZnVuY3Rpb24odSl7dmFyIHg9dGhpczt0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcChmdW5jdGlvbihBKXtyZXR1cm4geC5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChBK3UpfSkpO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9O3EucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odSl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSh1KX07cS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih1KXtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydCh1KX07CnEucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG19O3EucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4oKX07cS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24odSl7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih1KTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTtxLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4odSk7dGhpcy5fc2V0QmFuZHMoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhbmdlfTsKcS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHUpe3RoaXMuX3JhbmdlPXU7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLnJhbmdlKHUpO3RoaXMuX3NldEJhbmRzKCl9O3EucHJvdG90eXBlLl9yZXNjYWxlQmFuZD1mdW5jdGlvbih1KXtyZXR1cm4gTWF0aC5hYnModGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHUpLXRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSgwKSl9O3JldHVybiBxfShoKDE3KS5TY2FsZSk7Zi5DYXRlZ29yeT1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh3KXt0cnl7dmFyIEM9dy5ub2RlKCkuZ2V0QkJveCgpfWNhdGNoKEcpe0M9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH19cmV0dXJuIEN9ZnVuY3Rpb24gdCh3KXtpZigibnVtYmVyIj09PXR5cGVvZiB3KXJldHVybnttaW46dyxtYXg6d307aWYodyBpbnN0YW5jZW9mIE9iamVjdCYmIm1pbiJpbiB3JiYibWF4ImluIHcpcmV0dXJuIHc7dGhyb3cgRXJyb3IoImlucHV0ICciK3crIicgY2FuJ3QgYmUgcGFyc2VkIGFzIGFuIFJhbmdlIik7Cn1mdW5jdGlvbiBsKHcsQyl7dz13LmdldFByb3BlcnR5VmFsdWUoQyk7cmV0dXJuIHBhcnNlRmxvYXQodyl8fDB9ZnVuY3Rpb24gcCh3KXtpZihudWxsPT13fHwibm9uZSI9PT13KXJldHVybiBudWxsO3c9dy5tYXRjaChBKTtpZihudWxsPT13fHwyPncubGVuZ3RoKXJldHVybiBudWxsO3c9d1sxXS5zcGxpdCh5KS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIHBhcnNlRmxvYXQoQyl9KTtyZXR1cm4gNiE9dy5sZW5ndGg/bnVsbDp3fXZhciBtPWgoMSksbj1NYXRoO2YuY29udGFpbnM9ZnVuY3Rpb24odyxDKXtmb3IoO251bGwhPUMmJkMhPT13OylDPUMucGFyZW50Tm9kZTtyZXR1cm4gQz09PXd9O2YuZWxlbWVudEJCb3g9aztmLmVudGl0eUJvdW5kcz1mdW5jdGlvbih3KXtyZXR1cm4gdyBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/ayhtLnNlbGVjdCh3KSk6dyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50Pyh3PXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse3g6dy5sZWZ0LHk6dy50b3Asd2lkdGg6dy53aWR0aCwKaGVpZ2h0OncuaGVpZ2h0fSk6e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH19O2YuU0NSRUVOX1JFRlJFU0hfUkFURV9NSUxMSVNFQ09ORFM9MUUzLzYwO2YucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGw9ZnVuY3Rpb24odyl7bnVsbCE9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHcpOnNldFRpbWVvdXQodyxmLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTKX07Zi5lbGVtZW50V2lkdGg9ZnVuY3Rpb24odyl7dz13IGluc3RhbmNlb2YgbS5zZWxlY3Rpb24/dy5ub2RlKCk6dzt3PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHcpO3JldHVybiBsKHcsIndpZHRoIikrbCh3LCJwYWRkaW5nLWxlZnQiKStsKHcsInBhZGRpbmctcmlnaHQiKStsKHcsImJvcmRlci1sZWZ0LXdpZHRoIikrbCh3LCJib3JkZXItcmlnaHQtd2lkdGgiKX07Zi5lbGVtZW50SGVpZ2h0PWZ1bmN0aW9uKHcpe3c9dyBpbnN0YW5jZW9mIG0uc2VsZWN0aW9uPwp3Lm5vZGUoKTp3O3c9d2luZG93LmdldENvbXB1dGVkU3R5bGUodyk7cmV0dXJuIGwodywiaGVpZ2h0IikrbCh3LCJwYWRkaW5nLXRvcCIpK2wodywicGFkZGluZy1ib3R0b20iKStsKHcsImJvcmRlci10b3Atd2lkdGgiKStsKHcsImJvcmRlci1ib3R0b20td2lkdGgiKX07dmFyIHE9L3RyYW5zbGF0ZVxzKlwoXHMqKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkoPzooPzooPzpccyssP1xzKil8KD86LFxzKikpKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkpP1xzKlwpLyx1PS9yb3RhdGVccypcKFxzKigoPzpbLStdP1swLTldKlwuP1swLTldKykpXHMqXCkvLHg9L3NjYWxlXHMqXChccyooKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKSg/Oig/Oig/OlxzKyw/XHMqKXwoPzosXHMqKSkoKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKSk/XHMqXCkvO2YuZ2V0VHJhbnNsYXRlVmFsdWVzPWZ1bmN0aW9uKHcpe3c9cS5leGVjKHcuYXR0cigidHJhbnNmb3JtIikpO2lmKG51bGwhPXcpe3ZhciBDPQp3WzJdO3JldHVyblsrd1sxXSwrKHZvaWQgMD09PUM/MDpDKV19cmV0dXJuWzAsMF19O2YuZ2V0Um90YXRlPWZ1bmN0aW9uKHcpe3c9dS5leGVjKHcuYXR0cigidHJhbnNmb3JtIikpO3JldHVybiBudWxsIT13Pyt3WzFdOjB9O2YuZ2V0U2NhbGVWYWx1ZXM9ZnVuY3Rpb24odyl7dmFyIEM9eC5leGVjKHcuYXR0cigidHJhbnNmb3JtIikpO3JldHVybiBudWxsIT1DPyh3PUNbMV0sQz1DWzJdLFsrdyxudWxsPT1DPyt3OitDXSk6WzAsMF19O2YuY2xpZW50UmVjdHNPdmVybGFwPWZ1bmN0aW9uKHcsQyl7cmV0dXJuIG4uZmxvb3Iody5yaWdodCk8PW4uY2VpbChDLmxlZnQpfHxuLmNlaWwody5sZWZ0KT49bi5mbG9vcihDLnJpZ2h0KXx8bi5mbG9vcih3LmJvdHRvbSk8PW4uY2VpbChDLnRvcCl8fG4uY2VpbCh3LnRvcCk+PW4uZmxvb3IoQy5ib3R0b20pPyExOiEwfTtmLmV4cGFuZFJlY3Q9ZnVuY3Rpb24odyxDKXtyZXR1cm57bGVmdDp3LmxlZnQtQyx0b3A6dy50b3AtQyxyaWdodDp3LnJpZ2h0KwpDLGJvdHRvbTp3LmJvdHRvbStDLHdpZHRoOncud2lkdGgrMipDLGhlaWdodDp3LmhlaWdodCsyKkN9fTtmLmNsaWVudFJlY3RJbnNpZGU9ZnVuY3Rpb24odyxDKXtyZXR1cm4gbi5mbG9vcihDLmxlZnQpPD1uLmNlaWwody5sZWZ0KSYmbi5mbG9vcihDLnRvcCk8PW4uY2VpbCh3LnRvcCkmJm4uZmxvb3Iody5yaWdodCk8PW4uY2VpbChDLnJpZ2h0KSYmbi5mbG9vcih3LmJvdHRvbSk8PW4uY2VpbChDLmJvdHRvbSl9O2YuaW50ZXJzZWN0c0JCb3g9ZnVuY3Rpb24odyxDLEcsRCl7dm9pZCAwPT09RCYmKEQ9LjUpO3c9dCh3KTtDPXQoQyk7cmV0dXJuIEcueCtHLndpZHRoPj13Lm1pbi1EJiZHLng8PXcubWF4K0QmJkcueStHLmhlaWdodD49Qy5taW4tRCYmRy55PD1DLm1heCtEfTtmLmdldEh0bWxFbGVtZW50QW5jZXN0b3JzPWZ1bmN0aW9uKHcpe2Zvcih2YXIgQz1bXTt3JiZ3IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7KUMucHVzaCh3KSx3PXcucGFyZW50RWxlbWVudDtyZXR1cm4gQ307CmYuZ2V0RWxlbWVudFRyYW5zZm9ybT1mdW5jdGlvbih3KXt3PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHcsbnVsbCk7dz13LmdldFByb3BlcnR5VmFsdWUoIi13ZWJraXQtdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgiLW1vei10cmFuc2Zvcm0iKXx8dy5nZXRQcm9wZXJ0eVZhbHVlKCItbXMtdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgiLW8tdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIik7cmV0dXJuIHAodyl9O3ZhciBBPS9ebWF0cml4XCgoW14pXSspXCkkLyx5PS9bLCBdKy99LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHUseCl7cmV0dXJuW3VbMF0qeFswXSt1WzJdKnhbMV0sdVsxXSp4WzBdK3VbM10qeFsxXSx1WzBdKnhbMl0rdVsyXSp4WzNdLHVbMV0qeFsyXSt1WzNdKnhbM10sdVswXSp4WzRdK3VbMl0qeFs1XSt1WzRdLHVbMV0qeFs0XSt1WzNdKnhbNV0rdVs1XV19ZnVuY3Rpb24gdCh1LHgpe3JldHVyblt1WzBdLAp1WzFdLHVbMl0sdVszXSx1WzBdKnhbMF0rdVsyXSp4WzFdK3VbNF0sdVsxXSp4WzBdK3VbM10qeFsxXSt1WzVdXX1mdW5jdGlvbiBsKHUpe3ZhciB4PXVbMF0qdVszXS11WzFdKnVbMl07aWYoMD09PXgpdGhyb3cgRXJyb3IoInNpbmd1bGFyIG1hdHJpeCIpO3g9MS94O3JldHVyblt4KnVbM10seCotdVsxXSx4Ki11WzJdLHgqdVswXSx4KigtdVszXSp1WzRdK3VbMl0qdVs1XSkseCoodVsxXSp1WzRdKy11WzBdKnVbNV0pXX12YXIgcD1oKDEpLG09aCg1NSksbj1NYXRoLHE9WzEsMCwwLDEsMCwwXTtmLmluUmFuZ2U9ZnVuY3Rpb24odSx4LEEpe3JldHVybiBuLm1pbih4LEEpPD11JiZ1PD1uLm1heCh4LEEpfTtmLmNsYW1wPWZ1bmN0aW9uKHUseCxBKXtyZXR1cm4gbi5taW4obi5tYXgoeCx1KSxBKX07Zi5tYXg9ZnVuY3Rpb24odSx4LEEpe3ZhciB5PSJmdW5jdGlvbiI9PT10eXBlb2YgeD94Om51bGw7eD1udWxsPT15P3g6QTt1PW51bGw9PXk/cC5tYXgodSk6cC5tYXgodSx5KTtyZXR1cm4gdm9pZCAwIT09CnU/dTp4fTtmLm1pbj1mdW5jdGlvbih1LHgsQSl7dmFyIHk9ImZ1bmN0aW9uIj09PXR5cGVvZiB4P3g6bnVsbDt4PW51bGw9PXk/eDpBO3U9bnVsbD09eT9wLm1pbih1KTpwLm1pbih1LHkpO3JldHVybiB2b2lkIDAhPT11P3U6eH07Zi5pc05hTj1mdW5jdGlvbih1KXtyZXR1cm4gdSE9PXV9O2YuaXNWYWxpZE51bWJlcj1mdW5jdGlvbih1KXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiB1JiYxPnUtdX07Zi5yYW5nZT1mdW5jdGlvbih1LHgsQSl7dm9pZCAwPT09QSYmKEE9MSk7aWYoMD09PUEpdGhyb3cgRXJyb3IoInN0ZXAgY2Fubm90IGJlIDAiKTt4PW4ubWF4KG4uY2VpbCgoeC11KS9BKSwwKTtmb3IodmFyIHk9W10sdz0wO3c8eDsrK3cpeVt3XT11K0EqdztyZXR1cm4geX07Zi5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odSx4KXtyZXR1cm4gbi5wb3coeC55LXUueSwyKStuLnBvdyh4LngtdS54LDIpfTtmLmRlZ3JlZXNUb1JhZGlhbnM9ZnVuY3Rpb24odSl7cmV0dXJuIHUvMzYwKgpuLlBJKjJ9O2Yud2l0aGluPWZ1bmN0aW9uKHUseCl7cmV0dXJuIHgudG9wTGVmdC54PD11LngmJnguYm90dG9tUmlnaHQueD49dS54JiZ4LnRvcExlZnQueTw9dS55JiZ4LmJvdHRvbVJpZ2h0Lnk+PXUueX07Zi5ib3VuZHNJbnRlcnNlY3RzPWZ1bmN0aW9uKHUseCxBLHksdyxDKXtyZXR1cm4gdTw9MCt3JiYwPD11K0EmJng8PTArQyYmMDw9eCt5fTtmLmdldEN1bXVsYXRpdmVUcmFuc2Zvcm09ZnVuY3Rpb24odSl7dT1tLmdldEh0bWxFbGVtZW50QW5jZXN0b3JzKHUpO2Zvcih2YXIgeD1xLEE9bnVsbCx5PTA7eTx1Lmxlbmd0aDt5Kyspe3ZhciB3PXVbeV0sQz1tLmdldEVsZW1lbnRUcmFuc2Zvcm0odyk7aWYobnVsbCE9Qyl7dmFyIEc9dy5jbGllbnRXaWR0aC8yLEQ9dy5jbGllbnRIZWlnaHQvMjt4PXQoeCxbRyxEXSk7eD1rKHgsbChDKSk7eD10KHgsWy1HLC1EXSl9Qz13LnNjcm9sbExlZnQ7Rz13LnNjcm9sbFRvcDtpZihudWxsPT09QXx8dz09PUEpQy09dy5vZmZzZXRMZWZ0K3cuY2xpZW50TGVmdCwKRy09dy5vZmZzZXRUb3Ardy5jbGllbnRUb3AsQT13Lm9mZnNldFBhcmVudDt4PXQoeCxbQyxHXSl9cmV0dXJuIHh9O2YubXVsdGlwbHlNYXRyaXg9aztmLnByZW11bHRpcGx5VHJhbnNsYXRlPWZ1bmN0aW9uKHUseCl7cmV0dXJuW3hbMF0seFsxXSx4WzJdLHhbM10seFs0XSt1WzBdLHhbNV0rdVsxXV19O2YubXVsdGlwbHlUcmFuc2xhdGU9dDtmLmludmVydE1hdHJpeD1sO2YuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24odSx4KXtyZXR1cm57eDp1WzBdKngueCt1WzJdKngueSt1WzRdLHk6dVsxXSp4LngrdVszXSp4LnkrdVs1XX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9bmV3IChoKDExNCkuU3BsaXRTdHJhdGVneUxpbmVhcik7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHAobSxuKXt2b2lkIDA9PT1tJiYobT01KTt2b2lkIDA9PT1uJiYobj1rKTt0aGlzLm1heE5vZGVDaGlsZHJlbj1tO3RoaXMuc3BsaXRTdHJhdGVneT1uO3RoaXMucm9vdD1uZXcgdCghMCk7dGhpcy5zaXplPTB9cC5wcm90b3R5cGUuZ2V0Um9vdD0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290fTtwLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMucm9vdD1uZXcgdCghMCk7dGhpcy5zaXplPTB9O3AucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihtLG4pe2Zvcih2YXIgcT10aGlzLnJvb3Q7IXEubGVhZjspcT1xLnN1YnRyZWUobSk7bT10LnZhbHVlTm9kZShtLG4pO3EuaW5zZXJ0KG0pO2Zvcih0aGlzLnNpemUrPTE7cS5vdmVyZmxvdyh0aGlzLm1heE5vZGVDaGlsZHJlbik7KXE9cS5zcGxpdCh0aGlzLnNwbGl0U3RyYXRlZ3kpLG51bGw9PXEucGFyZW50JiYodGhpcy5yb290PXEpfTtwLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMucXVlcnkoZnVuY3Rpb24obil7cmV0dXJuIG4uY29udGFpbnMobSl9KX07cC5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyhuLG0pfSl9O3AucHJvdG90eXBlLmludGVyc2VjdFg9CmZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcFgobixtKX0pfTtwLnByb3RvdHlwZS5pbnRlcnNlY3RZPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcFkobixtKX0pfTtwLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbihtKXt2YXIgbj1bXTtpZihudWxsIT10aGlzLnJvb3QuYm91bmRzJiYhbSh0aGlzLnJvb3QuYm91bmRzKSlyZXR1cm4gbjtmb3IodmFyIHE9W3RoaXMucm9vdF07MDxxLmxlbmd0aDspZm9yKHZhciB1PXEuc2hpZnQoKSx4PTA7eDx1LmVudHJpZXMubGVuZ3RoO3grKyl7dmFyIEE9dS5lbnRyaWVzW3hdO20oQS5ib3VuZHMpJiYodS5sZWFmP24ucHVzaChBLnZhbHVlKTpxLnB1c2goQSkpfXJldHVybiBufTtyZXR1cm4gcH0oKTtmLlJUcmVlPWQ7dmFyIHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBwKG0pe3RoaXMubGVhZj1tO3RoaXMuYm91bmRzPQpudWxsO3RoaXMuZW50cmllcz1bXTt0aGlzLnZhbHVlPXRoaXMucGFyZW50PW51bGx9cC52YWx1ZU5vZGU9ZnVuY3Rpb24obSxuKXt2YXIgcT1uZXcgcCghMCk7cS5ib3VuZHM9bTtxLnZhbHVlPW47cmV0dXJuIHF9O3AucHJvdG90eXBlLm92ZXJmbG93PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoPm19O3AucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihtKXt0aGlzLmVudHJpZXMucHVzaChtKTttLnBhcmVudD10aGlzO2Zvcih2YXIgbj10aGlzO251bGwhPW47KW4uYm91bmRzPWwudW5pb25BbGwoW24uYm91bmRzLG0uYm91bmRzXSksbj1uLnBhcmVudH07cC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKG0pe209dGhpcy5lbnRyaWVzLmluZGV4T2YobSk7aWYoMDw9bSlmb3IodGhpcy5lbnRyaWVzLnNwbGljZShtLDEpLG09dGhpcztudWxsIT1tOyltLmJvdW5kcz1sLnVuaW9uQWxsKG0uZW50cmllcy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4uYm91bmRzfSkpLAptPW0ucGFyZW50O3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5zdWJ0cmVlPWZ1bmN0aW9uKG0pe2Zvcih2YXIgbj1udWxsLHE9MDtxPHRoaXMuZW50cmllcy5sZW5ndGg7cSsrKXt2YXIgdT10aGlzLmVudHJpZXNbcV0seD11LnVuaW9uQXJlYURpZmZlcmVuY2UobSk7aWYoSW5maW5pdHk+eHx8SW5maW5pdHk9PT14JiZudWxsIT1uJiZ1LmVudHJpZXMubGVuZ3RoPG4uZW50cmllcy5sZW5ndGgpbj11fXJldHVybiBufTtwLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihtKXtudWxsIT10aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpO3ZhciBuPVtuZXcgcCh0aGlzLmxlYWYpLG5ldyBwKHRoaXMubGVhZildO20uc3BsaXQodGhpcy5lbnRyaWVzLG4pO209bnVsbCE9dGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQ6bmV3IHAoITEpO20uaW5zZXJ0KG5bMF0pO20uaW5zZXJ0KG5bMV0pO3JldHVybiBtfTtwLnByb3RvdHlwZS51bmlvbkFyZWFEaWZmZXJlbmNlPWZ1bmN0aW9uKG0pe3JldHVybiBNYXRoLmFicyhsLnVuaW9uKHRoaXMuYm91bmRzLAptKS5hcmVhKCktdGhpcy5ib3VuZHMuYXJlYSgpKX07cC5wcm90b3R5cGUubWF4RGVwdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZWFmPzE6MSt0aGlzLmVudHJpZXMubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBtLm1heERlcHRoKCl9KS5yZWR1Y2UoZnVuY3Rpb24obSxuKXtyZXR1cm4gTWF0aC5tYXgobSxuKX0pfTtyZXR1cm4gcH0oKTtmLlJUcmVlTm9kZT10O3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChtLG4scSx1KXt0aGlzLnhsPW07dGhpcy55bD1uO3RoaXMueGg9cTt0aGlzLnloPXU7dGhpcy53aWR0aD10aGlzLnhoLXRoaXMueGw7dGhpcy5oZWlnaHQ9dGhpcy55aC10aGlzLnlsfXAueHl3aD1mdW5jdGlvbihtLG4scSx1KXtyZXR1cm4gbmV3IHAobSxuLG0rcSxuK3UpfTtwLmVudGl0eUJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gbmV3IHAobS54LG0ueSxtLngrbS53aWR0aCxtLnkrbS5oZWlnaHQpfTtwLmJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gcC5wb2ludFBhaXIobS50b3BMZWZ0LAptLmJvdHRvbVJpZ2h0KX07cC5wb2ludFBhaXI9ZnVuY3Rpb24obSxuKXtyZXR1cm4gbmV3IHAoTWF0aC5taW4obS54LG4ueCksTWF0aC5taW4obS55LG4ueSksTWF0aC5tYXgobS54LG4ueCksTWF0aC5tYXgobS55LG4ueSkpfTtwLnBvaW50cz1mdW5jdGlvbihtKXtpZigyPm0ubGVuZ3RoKXRocm93IEVycm9yKCJuZWVkIGF0IGxlYXN0IDIgcG9pbnRzIHRvIGNyZWF0ZSBib3VuZHMiKTt2YXIgbj1tLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS54fSk7bT1tLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS55fSk7cmV0dXJuIG5ldyBwKG4ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWluKHEsdSl9KSxtLnJlZHVjZShmdW5jdGlvbihxLHUpe3JldHVybiBNYXRoLm1pbihxLHUpfSksbi5yZWR1Y2UoZnVuY3Rpb24ocSx1KXtyZXR1cm4gTWF0aC5tYXgocSx1KX0pLG0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdSl9KSl9O3AudW5pb249ZnVuY3Rpb24obSwKbil7cmV0dXJuIG5ldyBwKE1hdGgubWluKG0ueGwsbi54bCksTWF0aC5taW4obS55bCxuLnlsKSxNYXRoLm1heChtLnhoLG4ueGgpLE1hdGgubWF4KG0ueWgsbi55aCkpfTtwLnVuaW9uQWxsPWZ1bmN0aW9uKG0pe209bS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPW59KTtyZXR1cm4gMD09PW0ubGVuZ3RoP251bGw6bS5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gcC51bmlvbihuLHEpfSl9O3AuaXNCb3VuZHNPdmVybGFwQm91bmRzPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHAuaXNCb3VuZHNPdmVybGFwWChtLG4pJiZwLmlzQm91bmRzT3ZlcmxhcFkobSxuKX07cC5pc0JvdW5kc092ZXJsYXBYPWZ1bmN0aW9uKG0sbil7cmV0dXJuIShtLnhoPG4ueGwpJiYhKG0ueGw+bi54aCl9O3AuaXNCb3VuZHNPdmVybGFwWT1mdW5jdGlvbihtLG4pe3JldHVybiEobS55aDxuLnlsKSYmIShtLnlsPm4ueWgpfTtwLnByb3RvdHlwZS5hcmVhPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5hcmVhQ2FjaGVkJiYKKHRoaXMuYXJlYUNhY2hlZD0odGhpcy54aC10aGlzLnhsKSoodGhpcy55aC10aGlzLnlsKSk7cmV0dXJuIHRoaXMuYXJlYUNhY2hlZH07cC5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMueGw8PW0ueCYmdGhpcy54aD49bS54JiZ0aGlzLnlsPD1tLnkmJnRoaXMueWg+PW0ueX07cmV0dXJuIHB9KCk7Zi5SVHJlZUJvdW5kcz1sfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuU2V0P3RoaXMuX2VzNlNldD1uZXcgd2luZG93LlNldDp0aGlzLl92YWx1ZXM9W107dGhpcy5zaXplPTB9aC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGspe2lmKG51bGwhPXRoaXMuX2VzNlNldClyZXR1cm4gdGhpcy5fZXM2U2V0LmFkZChrKSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsdGhpczt0aGlzLmhhcyhrKXx8KHRoaXMuX3ZhbHVlcy5wdXNoKGspLHRoaXMuc2l6ZT10aGlzLl92YWx1ZXMubGVuZ3RoKTsKcmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihrKXtpZihudWxsIT10aGlzLl9lczZTZXQpcmV0dXJuIGs9dGhpcy5fZXM2U2V0LmRlbGV0ZShrKSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsaztrPXRoaXMuX3ZhbHVlcy5pbmRleE9mKGspO3JldHVybi0xIT09az8odGhpcy5fdmFsdWVzLnNwbGljZShrLDEpLHRoaXMuc2l6ZT10aGlzLl92YWx1ZXMubGVuZ3RoLCEwKTohMX07aC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGspe3JldHVybiBudWxsIT10aGlzLl9lczZTZXQ/dGhpcy5fZXM2U2V0LmhhcyhrKTotMSE9PXRoaXMuX3ZhbHVlcy5pbmRleE9mKGspfTtoLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGssdCl7dmFyIGw9dGhpcztudWxsIT10aGlzLl9lczZTZXQ/dGhpcy5fZXM2U2V0LmZvckVhY2goZnVuY3Rpb24ocCxtKXtyZXR1cm4gay5jYWxsKHQscCxtLGwpfSx0KTp0aGlzLl92YWx1ZXMuZm9yRWFjaChmdW5jdGlvbihwKXtrLmNhbGwodCwKcCxwLGwpfSl9O3JldHVybiBofSgpO2YuU2V0PWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgxMzEpKTtrKGgoMTMwKSl9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0sdD1oKDIxKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2YXIgcT1sLmNhbGwodGhpcyxtLG4pfHx0aGlzO3EuY2FjaGU9bmV3IHQuQ2FjaGUoZnVuY3Rpb24odSl7cmV0dXJuIHEuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGUodSl9KTtyZXR1cm4gcX1rKHAsbCk7cC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGU9CmZ1bmN0aW9uKG0pe3JldHVybiBsLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlci5jYWxsKHRoaXMsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLmNhY2hlLmdldChtKX07cC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlLmNsZWFyKCl9O3JldHVybiBwfShoKDYxKS5DaGFyYWN0ZXJNZWFzdXJlcik7Zi5DYWNoZUNoYXJhY3Rlck1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwKdGhpc31rKGwsdCk7bC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXI9ZnVuY3Rpb24ocCl7cmV0dXJuIHQucHJvdG90eXBlLl9tZWFzdXJlTGluZS5jYWxsKHRoaXMscCl9O2wucHJvdG90eXBlLl9tZWFzdXJlTGluZT1mdW5jdGlvbihwKXt2YXIgbT10aGlzO3A9cC5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBtLl9tZWFzdXJlQ2hhcmFjdGVyKG4pfSk7cmV0dXJue2hlaWdodDpwLnJlZHVjZShmdW5jdGlvbihuLHEpe3JldHVybiBNYXRoLm1heChuLHEuaGVpZ2h0KX0sMCksd2lkdGg6cC5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gbitxLndpZHRofSwwKX19O3JldHVybiBsfShoKDYzKS5NZWFzdXJlcik7Zi5DaGFyYWN0ZXJNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoMzYpKTtrKGgoNjApKTtrKGgoMTMyKSk7ayhoKDYxKSk7ayhoKDYzKSl9LApmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgzNik7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7dm9pZCAwPT09biYmKG49ITEpO209bC5jYWxsKHRoaXMsbSl8fHRoaXM7bS51c2VHdWFyZHM9bjtyZXR1cm4gbX1rKHAsbCk7cC5wcm90b3R5cGUuX2FkZEd1YXJkcz1mdW5jdGlvbihtKXtyZXR1cm4gdC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUK20rdC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUfTtwLnByb3RvdHlwZS5fbWVhc3VyZUxpbmU9ZnVuY3Rpb24obSl7dmFyIG47dm9pZCAwPT09biYmKG49ITEpO249dGhpcy51c2VHdWFyZHN8fApufHwvXltcdCBdJC8udGVzdChtKTttPWwucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLG4/dGhpcy5fYWRkR3VhcmRzKG0pOm0pO20ud2lkdGgtPW4/Mip0aGlzLmdldEd1YXJkV2lkdGgoKTowO3JldHVybiBtfTtwLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKG0pe3ZhciBuPXRoaXM7dm9pZCAwPT09bSYmKG09dC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUKTtpZigiIj09PW0udHJpbSgpKXJldHVybnt3aWR0aDowLGhlaWdodDowfTttPW0udHJpbSgpLnNwbGl0KCJcbiIpLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUxpbmUocSl9KTtyZXR1cm57aGVpZ2h0Om0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIHErdS5oZWlnaHR9LDApLHdpZHRoOm0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdS53aWR0aCl9LDApfX07cC5wcm90b3R5cGUuZ2V0R3VhcmRXaWR0aD1mdW5jdGlvbigpe251bGw9PXRoaXMuZ3VhcmRXaWR0aCYmCih0aGlzLmd1YXJkV2lkdGg9bC5wcm90b3R5cGUubWVhc3VyZS5jYWxsKHRoaXMpLndpZHRoKTtyZXR1cm4gdGhpcy5ndWFyZFdpZHRofTtyZXR1cm4gcH0odC5BYnN0cmFjdE1lYXN1cmVyKTtmLk1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgxMzgpKTtrKGgoNjUpKX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMjEpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5tYXhMaW5lcyhJbmZpbml0eSk7dGhpcy50ZXh0VHJpbW1pbmcoKTt0aGlzLmFsbG93QnJlYWtpbmdXb3JkcygpO3RoaXMuX3Rva2VuaXplcj1uZXcgay5Ub2tlbml6ZXI7dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI9Ii0ifXQucHJvdG90eXBlLm1heExpbmVzPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX21heExpbmVzO3RoaXMuX21heExpbmVzPWw7cmV0dXJuIHRoaXN9Owp0LnByb3RvdHlwZS50ZXh0VHJpbW1pbmc9ZnVuY3Rpb24oKXt0aGlzLl90ZXh0VHJpbW1pbmc9ImVsbGlwc2lzIn07dC5wcm90b3R5cGUuYWxsb3dCcmVha2luZ1dvcmRzPWZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dCcmVha2luZ1dvcmRzPSEwfTt0LnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKGwscCxtLG4pe3ZhciBxPXRoaXM7dm9pZCAwPT09biYmKG49SW5maW5pdHkpO3ZhciB1PXtub0Jyb2tlV29yZHM6MCxub0xpbmVzOjAsb3JpZ2luYWxUZXh0OmwsdHJ1bmNhdGVkVGV4dDoiIix3cmFwcGVkVGV4dDoiIn07bT17YXZhaWxhYmxlTGluZXM6TWF0aC5taW4oTWF0aC5mbG9vcihuL3AubWVhc3VyZSgpLmhlaWdodCksdGhpcy5fbWF4TGluZXMpLGF2YWlsYWJsZVdpZHRoOm0sY2FuRml0VGV4dDohMCxjdXJyZW50TGluZToiIix3cmFwcGluZzp1fTt2YXIgeD1sLnNwbGl0KCJcbiIpO3JldHVybiB4LnJlZHVjZShmdW5jdGlvbihBLHksdyl7cmV0dXJuIHEuYnJlYWtMaW5lVG9GaXRXaWR0aChBLAp5LHchPT14Lmxlbmd0aC0xLHApfSxtKS53cmFwcGluZ307dC5wcm90b3R5cGUuYnJlYWtMaW5lVG9GaXRXaWR0aD1mdW5jdGlvbihsLHAsbSxuKXt2YXIgcT10aGlzO2wuY2FuRml0VGV4dHx8IiI9PT1sLndyYXBwaW5nLnRydW5jYXRlZFRleHR8fChsLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPSJcbiIpO2w9dGhpcy5fdG9rZW5pemVyLnRva2VuaXplKHApLnJlZHVjZShmdW5jdGlvbih1LHgpe3JldHVybiBxLndyYXBOZXh0VG9rZW4oeCx1LG4pfSxsKTtwPWsuU3RyaW5nTWV0aG9kcy50cmltRW5kKGwuY3VycmVudExpbmUpO2wud3JhcHBpbmcubm9MaW5lcys9KygiIiE9PXApO2wud3JhcHBpbmcubm9MaW5lcz09PWwuYXZhaWxhYmxlTGluZXMmJiJub25lIiE9PXRoaXMuX3RleHRUcmltbWluZyYmbT9sLmNhbkZpdFRleHQ9ITE6bC53cmFwcGluZy53cmFwcGVkVGV4dCs9cDtsLmN1cnJlbnRMaW5lPSJcbiI7cmV0dXJuIGx9O3QucHJvdG90eXBlLmNhbkZpdFRva2VuPWZ1bmN0aW9uKGwsCnAsbSl7dmFyIG49dGhpcyxxPXRoaXMuX2FsbG93QnJlYWtpbmdXb3Jkcz9sLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24odSx4KXtyZXR1cm4geCE9PWwubGVuZ3RoLTE/dStuLl9icmVha2luZ0NoYXJhY3Rlcjp1fSk6W2xdO3JldHVybiBtLm1lYXN1cmUobCkud2lkdGg8PXB8fHEuZXZlcnkoZnVuY3Rpb24odSl7cmV0dXJuIG0ubWVhc3VyZSh1KS53aWR0aDw9cH0pfTt0LnByb3RvdHlwZS5hZGRFbGxpcHNpcz1mdW5jdGlvbihsLHAsbSl7aWYoIm5vbmUiPT09dGhpcy5fdGV4dFRyaW1taW5nKXJldHVybntyZW1haW5pbmdUb2tlbjoiIix3cmFwcGVkVG9rZW46bH07dmFyIG49bC5zdWJzdHJpbmcoMCkudHJpbSgpLHE9bS5tZWFzdXJlKG4pLndpZHRoLHU9bS5tZWFzdXJlKCIuLi4iKS53aWR0aCx4PTA8bC5sZW5ndGgmJiJcbiI9PT1sWzBdPyJcbiI6IiI7aWYocDw9dSlyZXR1cm57cmVtYWluaW5nVG9rZW46bCx3cmFwcGVkVG9rZW46eCsiLi4uIi5zdWJzdHIoMCxNYXRoLmZsb29yKHAvCih1LzMpKSl9O2Zvcig7cSt1PnA7KW49ay5TdHJpbmdNZXRob2RzLnRyaW1FbmQobi5zdWJzdHIoMCxuLmxlbmd0aC0xKSkscT1tLm1lYXN1cmUobikud2lkdGg7cmV0dXJue3JlbWFpbmluZ1Rva2VuOmsuU3RyaW5nTWV0aG9kcy50cmltRW5kKGwuc3Vic3RyaW5nKG4ubGVuZ3RoKSwiLSIpLnRyaW0oKSx3cmFwcGVkVG9rZW46eCtuKyIuLi4ifX07dC5wcm90b3R5cGUud3JhcE5leHRUb2tlbj1mdW5jdGlvbihsLHAsbSl7aWYoIXAuY2FuRml0VGV4dHx8cC5hdmFpbGFibGVMaW5lcz09PXAud3JhcHBpbmcubm9MaW5lc3x8IXRoaXMuY2FuRml0VG9rZW4obCxwLmF2YWlsYWJsZVdpZHRoLG0pKXJldHVybiB0aGlzLmZpbmlzaFdyYXBwaW5nKGwscCxtKTtmb3IoO2w7KXt2YXIgbj10aGlzLmJyZWFrVG9rZW5Ub0ZpdEluV2lkdGgobCxwLmN1cnJlbnRMaW5lLHAuYXZhaWxhYmxlV2lkdGgsbSk7cC5jdXJyZW50TGluZT1uLmxpbmU7bD1uLnJlbWFpbmluZ1Rva2VuO2lmKG51bGwhPWwpaWYocC53cmFwcGluZy5ub0Jyb2tlV29yZHMrPQorbi5icmVha1dvcmQsKytwLndyYXBwaW5nLm5vTGluZXMscC5hdmFpbGFibGVMaW5lcz09PXAud3JhcHBpbmcubm9MaW5lcyl7bT10aGlzLmFkZEVsbGlwc2lzKHAuY3VycmVudExpbmUscC5hdmFpbGFibGVXaWR0aCxtKTtwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1tLndyYXBwZWRUb2tlbjtwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPW0ucmVtYWluaW5nVG9rZW4rbDtwLmN1cnJlbnRMaW5lPSJcbiI7YnJlYWt9ZWxzZSBwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1rLlN0cmluZ01ldGhvZHMudHJpbUVuZChwLmN1cnJlbnRMaW5lKSxwLmN1cnJlbnRMaW5lPSJcbiJ9cmV0dXJuIHB9O3QucHJvdG90eXBlLmZpbmlzaFdyYXBwaW5nPWZ1bmN0aW9uKGwscCxtKXtwLmNhbkZpdFRleHQmJnAuYXZhaWxhYmxlTGluZXMhPT1wLndyYXBwaW5nLm5vTGluZXMmJnRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcyYmIm5vbmUiIT09dGhpcy5fdGV4dFRyaW1taW5nPyhtPXRoaXMuYWRkRWxsaXBzaXMocC5jdXJyZW50TGluZSsKbCxwLmF2YWlsYWJsZVdpZHRoLG0pLHAud3JhcHBpbmcud3JhcHBlZFRleHQrPW0ud3JhcHBlZFRva2VuLHAud3JhcHBpbmcudHJ1bmNhdGVkVGV4dCs9bS5yZW1haW5pbmdUb2tlbixwLndyYXBwaW5nLm5vQnJva2VXb3Jkcys9KyhtLnJlbWFpbmluZ1Rva2VuLmxlbmd0aDxsLmxlbmd0aCkscC53cmFwcGluZy5ub0xpbmVzKz0rKDA8bS53cmFwcGVkVG9rZW4ubGVuZ3RoKSxwLmN1cnJlbnRMaW5lPSIiKTpwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPWw7cC5jYW5GaXRUZXh0PSExO3JldHVybiBwfTt0LnByb3RvdHlwZS5icmVha1Rva2VuVG9GaXRJbldpZHRoPWZ1bmN0aW9uKGwscCxtLG4pe2lmKHZvaWQgMD09PXEpdmFyIHE9dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI7aWYobi5tZWFzdXJlKHArbCkud2lkdGg8PW0pcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOnArbCxyZW1haW5pbmdUb2tlbjpudWxsfTtpZigiIj09PWwudHJpbSgpKXJldHVybnticmVha1dvcmQ6ITEsbGluZTpwLApyZW1haW5pbmdUb2tlbjoiIn07aWYoIXRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcylyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6cCxyZW1haW5pbmdUb2tlbjpsfTtmb3IodmFyIHU9MDt1PGwubGVuZ3RoOylpZihuLm1lYXN1cmUocCtsLnN1YnN0cmluZygwLHUrMSkrcSkud2lkdGg8PW0pKyt1O2Vsc2UgYnJlYWs7bT0iIjswPHUmJihtPXEpO3JldHVybnticmVha1dvcmQ6MDx1LGxpbmU6cCtsLnN1YnN0cmluZygwLHUpK20scmVtYWluaW5nVG9rZW46bC5zdWJzdHJpbmcodSl9fTtyZXR1cm4gdH0oKTtmLldyYXBwZXI9ZH0sZnVuY3Rpb24oZCxmLGgpeyhmdW5jdGlvbihrKXtmb3IodmFyIHQgaW4gaylmLmhhc093blByb3BlcnR5KHQpfHwoZlt0XT1rW3RdKX0pKGgoMTM5KSl9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCg3MikpO2soaCg3MykpO2soaCgyOCkpfSxmdW5jdGlvbihkLApmKXtmLnZlcnNpb249IjMuNy4wIn0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodyxDKXtyZXR1cm4gdy5lYWNoKGZ1bmN0aW9uKCl7dmFyIEc9Qy5hcHBseSh0aGlzLGFyZ3VtZW50cyksRD15LnNlbGVjdCh0aGlzKSxCO2ZvcihCIGluIEcpRC5hdHRyKEIsR1tCXSl9KX1mdW5jdGlvbiB0KHcsQyl7Zm9yKHZhciBHIGluIEMpdy5hdHRyKEcsQ1tHXSk7cmV0dXJuIHd9ZnVuY3Rpb24gbCh3LEMsRyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBEPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEI9eS5zZWxlY3QodGhpcyksSTtmb3IoSSBpbiBEKUIuc3R5bGUoSSxEW0ldLEcpfSl9ZnVuY3Rpb24gcCh3LEMsRyl7Zm9yKHZhciBEIGluIEMpdy5zdHlsZShELENbRF0sRyk7cmV0dXJuIHd9ZnVuY3Rpb24gbSh3LEMpe3JldHVybiB3LmVhY2goZnVuY3Rpb24oKXt2YXIgRz1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxEPXkuc2VsZWN0KHRoaXMpLEI7Zm9yKEIgaW4gRylELnByb3BlcnR5KEIsCkdbQl0pfSl9ZnVuY3Rpb24gbih3LEMpe2Zvcih2YXIgRyBpbiBDKXcucHJvcGVydHkoRyxDW0ddKTtyZXR1cm4gd31mdW5jdGlvbiBxKHcsQyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBHPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEQ9eS5zZWxlY3QodGhpcykudHJhbnNpdGlvbih3KSxCO2ZvcihCIGluIEcpRC5hdHRyKEIsR1tCXSl9KX1mdW5jdGlvbiB1KHcsQyl7Zm9yKHZhciBHIGluIEMpdy5hdHRyKEcsQ1tHXSk7cmV0dXJuIHd9ZnVuY3Rpb24geCh3LEMsRyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBEPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEI9eS5zZWxlY3QodGhpcykudHJhbnNpdGlvbih3KSxJO2ZvcihJIGluIEQpQi5zdHlsZShJLERbSV0sRyl9KX1mdW5jdGlvbiBBKHcsQyxHKXtmb3IodmFyIEQgaW4gQyl3LnN0eWxlKEQsQ1tEXSxHKTtyZXR1cm4gd312YXIgeT1kPWgoMSk7eS5zZWxlY3Rpb24ucHJvdG90eXBlLmF0dHJzPWZ1bmN0aW9uKHcpe3JldHVybigiZnVuY3Rpb24iPT09CnR5cGVvZiB3P2s6dCkodGhpcyx3KX07eS5zZWxlY3Rpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbih3KXtyZXR1cm4oImZ1bmN0aW9uIj09PXR5cGVvZiB3P2w6cCkodGhpcyx3LCIiKX07eS5zZWxlY3Rpb24ucHJvdG90eXBlLnByb3BlcnRpZXM9ZnVuY3Rpb24odyl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2Ygdz9tOm4pKHRoaXMsdyl9O2QudHJhbnNpdGlvbi5wcm90b3R5cGUuYXR0cnM9ZnVuY3Rpb24odyl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2Ygdz9xOnUpKHRoaXMsdyl9O2QudHJhbnNpdGlvbi5wcm90b3R5cGUuc3R5bGVzPWZ1bmN0aW9uKHcpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHc/eDpBKSh0aGlzLHcsIiIpfX0sZnVuY3Rpb24oZCxmLGgpe2Q9aCgxMTcpO3ZhciBrPWgoMTIpO2g9aCgxMCk7dmFyIHQ9e2xpbmVhcjpkLmVhc2VMaW5lYXIscXVhZDpkLmVhc2VRdWFkLHF1YWRJbjpkLmVhc2VRdWFkSW4scXVhZE91dDpkLmVhc2VRdWFkT3V0LApxdWFkSW5PdXQ6ZC5lYXNlUXVhZEluT3V0LGN1YmljOmQuZWFzZUN1YmljLGN1YmljSW46ZC5lYXNlQ3ViaWNJbixjdWJpY091dDpkLmVhc2VDdWJpY091dCxjdWJpY0luT3V0OmQuZWFzZUN1YmljSW5PdXQscG9seTpkLmVhc2VQb2x5LHBvbHlJbjpkLmVhc2VQb2x5SW4scG9seU91dDpkLmVhc2VQb2x5T3V0LHBvbHlJbk91dDpkLmVhc2VQb2x5SW5PdXQsc2luOmQuZWFzZVNpbixzaW5JbjpkLmVhc2VTaW5JbixzaW5PdXQ6ZC5lYXNlU2luT3V0LHNpbkluT3V0OmQuZWFzZVNpbkluT3V0LGV4cDpkLmVhc2VFeHAsZXhwSW46ZC5lYXNlRXhwSW4sZXhwT3V0OmQuZWFzZUV4cE91dCxleHBJbk91dDpkLmVhc2VFeHBJbk91dCxjaXJjbGU6ZC5lYXNlQ2lyY2xlLGNpcmNsZUluOmQuZWFzZUNpcmNsZUluLGNpcmNsZU91dDpkLmVhc2VDaXJjbGVPdXQsY2lyY2xlSW5PdXQ6ZC5lYXNlQ2lyY2xlSW5PdXQsYm91bmNlOmQuZWFzZUJvdW5jZSxib3VuY2VJbjpkLmVhc2VCb3VuY2VJbixib3VuY2VPdXQ6ZC5lYXNlQm91bmNlT3V0LApib3VuY2VJbk91dDpkLmVhc2VCb3VuY2VJbk91dCxiYWNrOmQuZWFzZUJhY2ssYmFja0luOmQuZWFzZUJhY2tJbixiYWNrT3V0OmQuZWFzZUJhY2tPdXQsYmFja0luT3V0OmQuZWFzZUJhY2tJbk91dCxlbGFzdGljOmQuZWFzZUVsYXN0aWMsZWxhc3RpY0luOmQuZWFzZUVsYXN0aWNJbixlbGFzdGljT3V0OmQuZWFzZUVsYXN0aWNPdXQsZWxhc3RpY0luT3V0OmQuZWFzZUVsYXN0aWNJbk91dH07Zi5FYXNlTmFtZT1oLm1ha2VFbnVtKCJsaW5lYXIgcXVhZCBxdWFkSW4gcXVhZE91dCBxdWFkSW5PdXQgY3ViaWMgY3ViaWNJbiBjdWJpY091dCBjdWJpY0luT3V0IHBvbHkgcG9seUluIHBvbHlPdXQgcG9seUluT3V0IHNpbiBzaW5JbiBzaW5PdXQgc2luSW5PdXQgZXhwIGV4cEluIGV4cE91dCBleHBJbk91dCBjaXJjbGUgY2lyY2xlSW4gY2lyY2xlT3V0IGNpcmNsZUluT3V0IGJvdW5jZSBib3VuY2VJbiBib3VuY2VPdXQgYm91bmNlSW5PdXQgYmFjayBiYWNrSW4gYmFja091dCBiYWNrSW5PdXQgZWxhc3RpYyBlbGFzdGljSW4gZWxhc3RpY091dCBlbGFzdGljSW5PdXQiLnNwbGl0KCIgIikpOwpoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe3RoaXMuX3N0YXJ0RGVsYXk9bC5fREVGQVVMVF9TVEFSVF9ERUxBWV9NSUxMSVNFQ09ORFM7dGhpcy5fc3RlcER1cmF0aW9uPWwuX0RFRkFVTFRfU1RFUF9EVVJBVElPTl9NSUxMSVNFQ09ORFM7dGhpcy5fc3RlcERlbGF5PWwuX0RFRkFVTFRfSVRFUkFUSVZFX0RFTEFZX01JTExJU0VDT05EUzt0aGlzLl9tYXhUb3RhbER1cmF0aW9uPWwuX0RFRkFVTFRfTUFYX1RPVEFMX0RVUkFUSU9OX01JTExJU0VDT05EUzt0aGlzLl9lYXNpbmdNb2RlPWwuX0RFRkFVTFRfRUFTSU5HX01PREV9bC5wcm90b3R5cGUudG90YWxUaW1lPWZ1bmN0aW9uKHApe3ZhciBtPXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkocCk7cmV0dXJuIHRoaXMuc3RhcnREZWxheSgpK20qTWF0aC5tYXgocC0xLDApK3RoaXMuc3RlcER1cmF0aW9uKCl9O2wucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24ocCxtKXt2YXIgbj10aGlzO3A9ay5jb2VyY2VFeHRlcm5hbEQzKHApOwp2YXIgcT1wLnNpemUoKSx1PXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkocSk7cmV0dXJuIHAudHJhbnNpdGlvbigpLmVhc2UodGhpcy5fZ2V0RWFzZUZhY3RvcnkoKSkuZHVyYXRpb24odGhpcy5zdGVwRHVyYXRpb24oKSkuZGVsYXkoZnVuY3Rpb24oeCxBKXtyZXR1cm4gbi5zdGFydERlbGF5KCkrdSpBfSkuYXR0cnMobSl9O2wucHJvdG90eXBlLnN0YXJ0RGVsYXk9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdGhpcy5fc3RhcnREZWxheTt0aGlzLl9zdGFydERlbGF5PXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnN0ZXBEdXJhdGlvbj1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiBNYXRoLm1pbih0aGlzLl9zdGVwRHVyYXRpb24sdGhpcy5fbWF4VG90YWxEdXJhdGlvbik7dGhpcy5fc3RlcER1cmF0aW9uPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnN0ZXBEZWxheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGVwRGVsYXl9O2wucHJvdG90eXBlLm1heFRvdGFsRHVyYXRpb249CmZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX21heFRvdGFsRHVyYXRpb247dGhpcy5fbWF4VG90YWxEdXJhdGlvbj1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5lYXNpbmdNb2RlPWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX2Vhc2luZ01vZGU7dGhpcy5fZWFzaW5nTW9kZT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5fZ2V0RWFzZUZhY3Rvcnk9ZnVuY3Rpb24oKXt2YXIgcD10aGlzLmVhc2luZ01vZGUoKTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBwPyhwPXRbcF0sbnVsbD09cD90LmxpbmVhcjpwKTpwfTtsLnByb3RvdHlwZS5fZ2V0QWRqdXN0ZWRJdGVyYXRpdmVEZWxheT1mdW5jdGlvbihwKXt2YXIgbT10aGlzLm1heFRvdGFsRHVyYXRpb24oKS10aGlzLnN0ZXBEdXJhdGlvbigpO209TWF0aC5tYXgobSwwKTtwPW0vTWF0aC5tYXgocC0xLDEpO3JldHVybiBNYXRoLm1pbih0aGlzLnN0ZXBEZWxheSgpLHApfTtyZXR1cm4gbH0oKTtoLl9ERUZBVUxUX1NUQVJUX0RFTEFZX01JTExJU0VDT05EUz0KMDtoLl9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTPTMwMDtoLl9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFM9MTU7aC5fREVGQVVMVF9NQVhfVE9UQUxfRFVSQVRJT05fTUlMTElTRUNPTkRTPUluZmluaXR5O2guX0RFRkFVTFRfRUFTSU5HX01PREU9ImV4cE91dCI7Zi5FYXNpbmc9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMTIpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXQucHJvdG90eXBlLnRvdGFsVGltZT1mdW5jdGlvbigpe3JldHVybiAwfTt0LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGwscCl7bD1rLmNvZXJjZUV4dGVybmFsRDMobCk7cmV0dXJuIGwuYXR0cnMocCl9O3JldHVybiB0fSgpO2YuTnVsbD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEsdSl7ZnVuY3Rpb24geCgpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIEEgaW4gdSl1Lmhhc093blByb3BlcnR5KEEpJiYKKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KTooeC5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHgpfSx0PWgoMSksbD1oKDUpLHA9aCg0KSxtPWgoMCksbj1oKDIyKTtkPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHUoeCxBKXt2b2lkIDA9PT1BJiYoQT0iYm90dG9tIik7eD1xLmNhbGwodGhpcyx4LEEpfHx0aGlzO3guX3RpY2tMYWJlbEFuZ2xlPTA7eC5fdGlja0xhYmVsU2hlYXJBbmdsZT0wO3guYWRkQ2xhc3MoImNhdGVnb3J5LWF4aXMiKTtyZXR1cm4geH1rKHUscSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHUucHJvdG90eXBlLCJfd3JhcHBlciIse2dldDpmdW5jdGlvbigpe3ZhciB4PW5ldyBsLldyYXBwZXI7bnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4TGluZXMmJngubWF4TGluZXModGhpcy5fdGlja0xhYmVsTWF4TGluZXMpO3JldHVybiB4fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LnByb3RvdHlwZSwKIl93cml0ZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHRoaXMuX3R5cGVzZXR0ZXJDb250ZXh0LHRoaXMuX3dyYXBwZXIpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO3UucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3EucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3R5cGVzZXR0ZXJDb250ZXh0PW5ldyBsLlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih0aGlzLl90eXBlc2V0dGVyQ29udGV4dCl9O3UucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVkcmF3KCl9O3UucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHgsQSl7dmFyIHk9dGhpcy5pc0hvcml6b250YWwoKT8wOnRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKSx3PXRoaXMuaXNIb3Jpem9udGFsKCk/CnRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKTowO2lmKDA9PT10aGlzLl9zY2FsZS5kb21haW4oKS5sZW5ndGgpcmV0dXJue21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O2lmKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciBDPXRoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCkqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCk7dGhpcy5pc0hvcml6b250YWwoKT93Kz1DOnkrPUN9eD10aGlzLl9tZWFzdXJlVGlja0xhYmVscyh4LEEpO3JldHVybnttaW5XaWR0aDp4LnVzZWRXaWR0aCt5LG1pbkhlaWdodDp4LnVzZWRIZWlnaHQrd319O3UucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB4PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCksQT10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMucmVxdWVzdGVkU3BhY2UodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpLm1pbkhlaWdodDp0aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSwKdGhpcy5oZWlnaHQoKSkubWluV2lkdGgseT10aGlzLm1hcmdpbigpK3RoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCk7cmV0dXJuIE1hdGgubWluKEEteSx4KX07dS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXREb3duc2FtcGxlSW5mbygpLmRvbWFpbn07dS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24oeCxBKXtyZXR1cm4gcC5Db21wb25lbnQucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyLmNhbGwodGhpcyx4LEEpfTt1LnByb3RvdHlwZS5nZXREb3duc2FtcGxlSW5mbz1mdW5jdGlvbih4KXt2YXIgQTt2b2lkIDA9PT14JiYoeD10aGlzLl9zY2FsZSk7dm9pZCAwPT09QSYmKEE9eC5pbnZlcnRSYW5nZSgpKTt2YXIgeT1NYXRoLmNlaWwodS5fTUlOSU1VTV9XSURUSF9QRVJfTEFCRUxfUFgqKDA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT8xOjEvTWF0aC5jb3ModGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZS8xODAqTWF0aC5QSSkpLwp4LnN0ZXBXaWR0aCgpKTtyZXR1cm57ZG9tYWluOkEuZmlsdGVyKGZ1bmN0aW9uKHcsQyl7cmV0dXJuIDA9PT1DJXl9KSxzdGVwV2lkdGg6eSp4LnN0ZXBXaWR0aCgpfX07dS5wcm90b3R5cGUudGlja0xhYmVsQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0xhYmVsQW5nbGU7dGhyb3cgRXJyb3IoIkFuZ2xlIHVuZGVmaW5lZCBub3Qgc3VwcG9ydGVkOyBvbmx5IDAsIDkwLCBhbmQgLTkwIGFyZSB2YWxpZCB2YWx1ZXMiKTt9O3UucHJvdG90eXBlLnRpY2tMYWJlbFNoZWFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZX07dS5wcm90b3R5cGUudGlja0xhYmVsTWF4V2lkdGg9ZnVuY3Rpb24oeCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoO3RoaXMuX3RpY2tMYWJlbE1heFdpZHRoPXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUudGlja0xhYmVsTWF4TGluZXM9CmZ1bmN0aW9uKHgpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90aWNrTGFiZWxNYXhMaW5lczt0aGlzLl90aWNrTGFiZWxNYXhMaW5lcz14O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLl90aWNrU3BhY2VSZXF1aXJlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKX07dS5wcm90b3R5cGUuX2RyYXdUaWNrcz1mdW5jdGlvbih4LEEpe3ZhciB5PXRoaXM7c3dpdGNoKHRoaXMudGlja0xhYmVsQW5nbGUoKSl7Y2FzZSAwOnZhciB3PXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9O3ZhciBDPXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoiYm90dG9tIixib3R0b206InRvcCJ9O2JyZWFrO2Nhc2UgOTA6dz17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6InJpZ2h0Iixib3R0b206ImxlZnQifTsKQz17bGVmdDoidG9wIixyaWdodDoiYm90dG9tIix0b3A6ImNlbnRlciIsYm90dG9tOiJjZW50ZXIifTticmVhaztjYXNlIC05MDp3PXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoibGVmdCIsYm90dG9tOiJyaWdodCJ9LEM9e2xlZnQ6ImJvdHRvbSIscmlnaHQ6InRvcCIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn19QS5lYWNoKGZ1bmN0aW9uKEcpe3ZhciBEPXQuc2VsZWN0KHRoaXMpLEI9eS5pc0hvcml6b250YWwoKT94Onkud2lkdGgoKS15Ll90aWNrU3BhY2VSZXF1aXJlZCgpLEk9eS5pc0hvcml6b250YWwoKT95LmhlaWdodCgpLXkuX3RpY2tTcGFjZVJlcXVpcmVkKCk6eCxOPXt4QWxpZ246d1t5Lm9yaWVudGF0aW9uKCldLHlBbGlnbjpDW3kub3JpZW50YXRpb24oKV0sdGV4dFJvdGF0aW9uOnkudGlja0xhYmVsQW5nbGUoKSx0ZXh0U2hlYXI6eS50aWNrTGFiZWxTaGVhckFuZ2xlKCl9O2lmKG51bGwhPXkuX3RpY2tMYWJlbE1heFdpZHRoKXtpZigibGVmdCI9PT0KeS5vcmllbnRhdGlvbigpJiZCPnkuX3RpY2tMYWJlbE1heFdpZHRoKXt2YXIgTz1CLXkuX3RpY2tMYWJlbE1heFdpZHRoO089RC5hdHRyKCJ0cmFuc2Zvcm0iKSsiIHRyYW5zbGF0ZSgiK08rIiwgMCkiO0QuYXR0cigidHJhbnNmb3JtIixPKX1CPU1hdGgubWluKEIseS5fdGlja0xhYmVsTWF4V2lkdGgpfXkuX3dyaXRlci53cml0ZSh5LmZvcm1hdHRlcigpKEcpLEIsSSxOLEQubm9kZSgpKX0pfTt1LnByb3RvdHlwZS5fbWVhc3VyZVRpY2tMYWJlbHM9ZnVuY3Rpb24oeCxBKXt2YXIgeT10aGlzLHc9dGhpcy5fc2NhbGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzKCkucmFuZ2UoWzAsdGhpcy5pc0hvcml6b250YWwoKT94OkFdKSxDPXRoaXMuZ2V0RG93bnNhbXBsZUluZm8odyk7dz1DLmRvbWFpbjtDPUMuc3RlcFdpZHRoO3ZhciBHPXgtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKTt0aGlzLmlzSG9yaXpvbnRhbCgpJiYoRz1DLDAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKEc9QS10aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpKSwKRz1NYXRoLm1heChHLDApKTt2YXIgRD1DO3RoaXMuaXNIb3Jpem9udGFsKCkmJihEPUEtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSwwIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihEPXgtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSksRD1NYXRoLm1heChELDApKTtudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKEc9TWF0aC5taW4oRyx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO0E9dy5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIHkuX3dyYXBwZXIud3JhcCh5LmZvcm1hdHRlcigpKEIpLHkuX21lYXN1cmVyLEcsRCl9KTt4PXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT90LnN1bTptLk1hdGgubWF4O3c9dGhpcy5pc0hvcml6b250YWwoKSYmMD09PXRoaXMuX3RpY2tMYWJlbEFuZ2xlP20uTWF0aC5tYXg6dC5zdW07eD14KEEsZnVuY3Rpb24oQil7cmV0dXJuIHkuX21lYXN1cmVyLm1lYXN1cmUoQi53cmFwcGVkVGV4dCkud2lkdGh9LDApOwpBPXcoQSxmdW5jdGlvbihCKXtyZXR1cm4geS5fbWVhc3VyZXIubWVhc3VyZShCLndyYXBwZWRUZXh0KS5oZWlnaHR9LDApOzAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKEE9W0EseF0seD1BWzBdLEE9QVsxXSk7cmV0dXJue3VzZWRXaWR0aDp4LHVzZWRIZWlnaHQ6QX19O3UucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHg9dGhpcztxLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciBBPXRoaXMuX3NjYWxlLHk9dGhpcy5nZXREb3duc2FtcGxlSW5mbyhBKSx3PXkuZG9tYWluLEM9eT15LnN0ZXBXaWR0aDt0aGlzLmlzSG9yaXpvbnRhbCgpJiZudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKEM9TWF0aC5taW4oQyx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO3c9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEodyk7dmFyIEc9dy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQobi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsCiEwKS5tZXJnZSh3KTt3LmV4aXQoKS5yZW1vdmUoKTtHLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oRCl7dmFyIEI9QS5zY2FsZShEKS1DLzI7RD14LmlzSG9yaXpvbnRhbCgpP0I6MDtCPXguaXNIb3Jpem9udGFsKCk/MDpCO3JldHVybiJ0cmFuc2xhdGUoIitEKyIsIitCKyIpIn0pO0cudGV4dCgiIik7dGhpcy5fZHJhd1RpY2tzKHksRyk7eT0icmlnaHQiPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDt3PSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDt0aGlzLl90aWNrTGFiZWxDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIreSsiLCIrdysiKSIpO3RoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTt0aGlzLl9zaG93QWxsVGlja0xhYmVscygpO3RoaXMuX2hpZGVUaWNrTWFya3NXaXRob3V0TGFiZWwoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD0KZnVuY3Rpb24oeCxBLHkpe3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHgsQSx5KTt0aGlzLmlzSG9yaXpvbnRhbCgpfHx0aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3EucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiB1fShuLkF4aXMpO2QuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYPTE1O2YuQ2F0ZWdvcnk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciBBIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShBKSYmKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KTooeC5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHgpfSwKdD1oKDEpLGw9aCg1KSxwPWgoOCksbT1oKDApLG49aCgyMik7ZD1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KHgsQSl7eD1xLmNhbGwodGhpcyx4LEEpfHx0aGlzO3guX3RpY2tMYWJlbFBvc2l0aW9uaW5nPSJjZW50ZXIiO3guX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSExO3guZm9ybWF0dGVyKHAuZ2VuZXJhbCgpKTtyZXR1cm4geH1rKHUscSk7dS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHg9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl90aWNrTGFiZWxDb250YWluZXIubm9kZSgpLG4uQXhpcy5USUNLX0xBQkVMX0NMQVNTKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHgpO3RoaXMuX3dyYXBwZXI9KG5ldyBsLldyYXBwZXIpLm1heExpbmVzKDEpfTt1LnByb3RvdHlwZS5fY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24/dGhpcy5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoKCk6CnRoaXMuX2NvbXB1dGVFeGFjdFRleHRXaWR0aCgpO3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkreDpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt4KX07dS5wcm90b3R5cGUuX2NvbXB1dGVFeGFjdFRleHRXaWR0aD1mdW5jdGlvbigpe3ZhciB4PXRoaXMsQT10aGlzLl9nZXRUaWNrVmFsdWVzKCkubWFwKGZ1bmN0aW9uKHkpe3k9eC5mb3JtYXR0ZXIoKSh5KTtyZXR1cm4geC5fbWVhc3VyZXIubWVhc3VyZSh5KS53aWR0aH0pO3JldHVybiBtLk1hdGgubWF4KEEsMCl9O3UucHJvdG90eXBlLl9jb21wdXRlQXBwcm94aW1hdGVUZXh0V2lkdGg9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLEE9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLHk9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgiTSIpLndpZHRoO0E9QS5tYXAoZnVuY3Rpb24odyl7cmV0dXJuIHguZm9ybWF0dGVyKCkodykubGVuZ3RoKgp5fSk7cmV0dXJuIG0uTWF0aC5tYXgoQSwwKX07dS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0O3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkreDpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt4KX07dS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLl9zY2FsZSxBPXguZG9tYWluKCkseT1BWzBdPD1BWzFdP0FbMF06QVsxXSx3PUFbMF0+PUFbMV0/QVswXTpBWzFdO3JldHVybiB4LnRpY2tzKCkuZmlsdGVyKGZ1bmN0aW9uKEMpe3JldHVybiBDPj15JiZDPD13fSl9O3UucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNTZXR1cCl7aWYoIXRoaXMuaXNIb3Jpem9udGFsKCkpe3ZhciB4PQp0aGlzLl9jb21wdXRlV2lkdGgoKTtpZih4PnRoaXMud2lkdGgoKXx8eDx0aGlzLndpZHRoKCktdGhpcy5tYXJnaW4oKSl7dGhpcy5yZWRyYXcoKTtyZXR1cm59fXRoaXMucmVuZGVyKCl9fTt1LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB4PXRoaXM7cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgQT17eDowLHk6MCxkeDoiMGVtIixkeToiMC4zZW0ifSx5PXRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpLHc9dGhpcy50aWNrTGFiZWxQYWRkaW5nKCksQz0ibWlkZGxlIixHPTAsRD0wLEI9MCxJPTA7aWYodGhpcy5pc0hvcml6b250YWwoKSlzd2l0Y2godGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmcpe2Nhc2UgImxlZnQiOkM9ImVuZCI7Rz0tdztJPXc7YnJlYWs7Y2FzZSAiY2VudGVyIjpJPXkrdzticmVhaztjYXNlICJyaWdodCI6Qz0ic3RhcnQiLEk9Rz13fWVsc2Ugc3dpdGNoKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nKXtjYXNlICJ0b3AiOkEuZHk9CiItMC4zZW0iO0I9dztEPS13O2JyZWFrO2Nhc2UgImNlbnRlciI6Qj15K3c7YnJlYWs7Y2FzZSAiYm90dG9tIjpBLmR5PSIxZW0iLEQ9Qj13fXk9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCk7c3dpdGNoKHRoaXMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpBLng9eS54MTtBLmR5PSIwLjk1ZW0iO0Q9eS55MStJO2JyZWFrO2Nhc2UgInRvcCI6QS54PXkueDE7QS5keT0iLS4yNWVtIjtEPXkueTEtSTticmVhaztjYXNlICJsZWZ0IjpDPSJlbmQiO0c9eS54MS1CO0EueT15LnkxO2JyZWFrO2Nhc2UgInJpZ2h0IjpDPSJzdGFydCIsRz15LngxK0IsQS55PXkueTF9Qj10aGlzLl9nZXRUaWNrVmFsdWVzKCk7Qj10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIituLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZGF0YShCKTtCLmV4aXQoKS5yZW1vdmUoKTtCLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuY2xhc3NlZChuLkF4aXMuVElDS19MQUJFTF9DTEFTUywKITApLm1lcmdlKEIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsQykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0IikuYXR0cnMoQSkudGV4dChmdW5jdGlvbihOKXtyZXR1cm4geC5mb3JtYXR0ZXIoKShOKX0pO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitHKyIsICIrRCsiKSIpO3RoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTt0aGlzLnNob3dFbmRUaWNrTGFiZWxzKCl8fHRoaXMuX2hpZGVFbmRUaWNrTGFiZWxzKCk7dGhpcy5faGlkZU92ZXJmbG93aW5nVGlja0xhYmVscygpO3RoaXMuX2hpZGVPdmVybGFwcGluZ1RpY2tMYWJlbHMoKTsiY2VudGVyIiE9PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nJiZ0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnRpY2tMYWJlbFBvc2l0aW9uPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nOwp4PXgudG9Mb3dlckNhc2UoKTtpZih0aGlzLmlzSG9yaXpvbnRhbCgpKXtpZigibGVmdCIhPT14JiYiY2VudGVyIiE9PXgmJiJyaWdodCIhPT14KXRocm93IEVycm9yKHgrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIGhvcml6b250YWwgTnVtZXJpY0F4aXMiKTt9ZWxzZSBpZigidG9wIiE9PXgmJiJjZW50ZXIiIT09eCYmImJvdHRvbSIhPT14KXRocm93IEVycm9yKHgrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIHZlcnRpY2FsIE51bWVyaWNBeGlzIik7dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc9eDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj1mdW5jdGlvbigpe3RoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSEwfTt1LnByb3RvdHlwZS5faGlkZUVuZFRpY2tMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLmVsZW1lbnQoKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCkE9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpO2lmKDAhPT1BLnNpemUoKSl7dmFyIHk9QS5ub2RlcygpWzBdO20uRE9NLmNsaWVudFJlY3RJbnNpZGUoeS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx4KXx8dC5zZWxlY3QoeSkuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTtBPUEubm9kZXMoKVtBLnNpemUoKS0xXTttLkRPTS5jbGllbnRSZWN0SW5zaWRlKEEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseCl8fHQuc2VsZWN0KEEpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9fTt1LnByb3RvdHlwZS5faGlkZU92ZXJsYXBwaW5nVGlja0xhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgeD10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIituLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHc9dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4iaW5oZXJpdCI9PT0Kd3x8InZpc2libGUiPT09d30pLEE9eC5ub2RlcygpLm1hcChmdW5jdGlvbih3KXtyZXR1cm4gdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pLHk9MTshdGhpcy5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbCh5LEEpJiZ5PEEubGVuZ3RoOyl5Kz0xO3guZWFjaChmdW5jdGlvbih3LEMpe3c9dC5zZWxlY3QodGhpcyk7MCE9PUMleSYmdy5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfSl9O3UucHJvdG90eXBlLl9oYXNPdmVybGFwV2l0aEludGVydmFsPWZ1bmN0aW9uKHgsQSl7dmFyIHk9ImNlbnRlciI9PT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZz90aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTozKnRoaXMudGlja0xhYmVsUGFkZGluZygpO0E9QS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIG0uRE9NLmV4cGFuZFJlY3QoQyx5KX0pO2Zvcih2YXIgdz0wO3c8QS5sZW5ndGgteDt3Kz14KWlmKG0uRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChBW3ddLEFbdyt4XSkpcmV0dXJuITE7cmV0dXJuITB9Owp1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gdX0obi5BeGlzKTtmLk51bWVyaWM9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfTtkPWgoNDIpO3ZhciB0PWgoMjUpLGw9aCgwKTtoPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7ZnVuY3Rpb24gcSgpe3cmJih3PSExLHkuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gdShDLEcpe3cmJih5Ll9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZSh5Ll9pc1ZlcnRpY2FsKCk/CkcueDpHLnkpLHkuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24geChDKXtBKEMpJiYodz0hMCx5Ll9kcmFnU3RhcnRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gQShDKXtyZXR1cm4geS5faXNWZXJ0aWNhbCgpJiZ5LnBpeGVsUG9zaXRpb24oKS15LmRldGVjdGlvblJhZGl1cygpPD1DLngmJkMueDw9eS5waXhlbFBvc2l0aW9uKCkreS5kZXRlY3Rpb25SYWRpdXMoKXx8IXkuX2lzVmVydGljYWwoKSYmeS5waXhlbFBvc2l0aW9uKCkteS5kZXRlY3Rpb25SYWRpdXMoKTw9Qy55JiZDLnk8PXkucGl4ZWxQb3NpdGlvbigpK3kuZGV0ZWN0aW9uUmFkaXVzKCl9dmFyIHk9cC5jYWxsKHRoaXMsbil8fHRoaXM7eS5fZGV0ZWN0aW9uUmFkaXVzPTM7eS5fZW5hYmxlZD0hMDt5LmFkZENsYXNzKCJkcmFnLWxpbmUtbGF5ZXIiKTt5LmFkZENsYXNzKCJlbmFibGVkIik7eS5fZHJhZ0ludGVyYWN0aW9uPW5ldyB0LkRyYWc7eS5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHkpOwp2YXIgdz0hMTt5Ll9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoeCk7eS5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyh1KTt5Ll9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKHEpO3kuX2Rpc2Nvbm5lY3RJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnU3RhcnQoeCk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWcodSk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWdFbmQocSk7eS5fZHJhZ0ludGVyYWN0aW9uLmRldGFjaCgpfTt5Ll9kcmFnU3RhcnRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7eS5fZHJhZ0NhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDt5Ll9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3JldHVybiB5fWsobSxwKTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLApzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSkuY2xhc3NlZCgiZHJhZy1lZGdlIiwhMCl9O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXN9OwptLnByb3RvdHlwZS5lbmFibGVkPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2VuYWJsZWQ7KHRoaXMuX2VuYWJsZWQ9bik/dGhpcy5hZGRDbGFzcygiZW5hYmxlZCIpOnRoaXMucmVtb3ZlQ2xhc3MoImVuYWJsZWQiKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZChuKX07bS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKG4pfTsKbS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHEpfSk7dGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShxKX0pO3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gbi5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUocSl9KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX07cmV0dXJuIG19KGQuR3VpZGVMaW5lTGF5ZXIpO2YuRHJhZ0xpbmVMYXllcj1ofSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhsLHAsbSl7dmFyIG49Cnt9O2lmKHZvaWQgMCE9PW0pZm9yKHZhciBxPTA7cTxtLmxlbmd0aDtxKyspblttW3FdXT1tW3EtMV07cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciB4PWwuc2NhbGUodSk7aWYoIXApcmV0dXJuIHg7dmFyIEE7dT12b2lkIDA9PT1uW3VdP3ZvaWQgMDpsLnNjYWxlKG5bdV0pO3ZvaWQgMCE9PXUmJihBPXUrKHgtdSkvMik7cmV0dXJuIEF9fXZhciB0PXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2YXIgcT1sLmNhbGwodGhpcyl8fHRoaXM7cS5hZGRDbGFzcygiZ3JpZGxpbmVzIik7cS5feFNjYWxlPW07cS5feVNjYWxlPW47cS5fcmVuZGVyQ2FsbGJhY2s9CmZ1bmN0aW9uKCl7cmV0dXJuIHEucmVuZGVyKCl9O2lmKHEuX3hTY2FsZSlxLl94U2NhbGUub25VcGRhdGUocS5fcmVuZGVyQ2FsbGJhY2spO2lmKHEuX3lTY2FsZSlxLl95U2NhbGUub25VcGRhdGUocS5fcmVuZGVyQ2FsbGJhY2spO3JldHVybiBxfXQocCxsKTtwLnByb3RvdHlwZS5iZXR3ZWVuWD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iZXR3ZWVuWH07cC5wcm90b3R5cGUuYmV0d2Vlblk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmV0d2Vlbll9O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTt0aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5feExpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtZ3JpZGxpbmVzIiwhMCk7dGhpcy5feUxpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktZ3JpZGxpbmVzIiwhMCl9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9yZWRyYXdYTGluZXMoKTt0aGlzLl9yZWRyYXdZTGluZXMoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihtLG4scSl7bC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsbSxuLHEpO251bGwhPXRoaXMuX3hTY2FsZSYmdGhpcy5feFNjYWxlLnJhbmdlKFswLHRoaXMud2lkdGgoKV0pO251bGwhPXRoaXMuX3lTY2FsZSYmdGhpcy5feVNjYWxlLnJhbmdlKFt0aGlzLmhlaWdodCgpLDBdKTtyZXR1cm4gdGhpc307CnAucHJvdG90eXBlLl9yZWRyYXdYTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLl94U2NhbGUpe3ZhciBtPXRoaXMuYmV0d2VlblgoKSxuPXRoaXMuX3hTY2FsZS50aWNrcygpLnNsaWNlKG0/MTowKTtuPXRoaXMuX3hMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKG4pO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsayh0aGlzLl94U2NhbGUsbSx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkxIiwwKS5hdHRyKCJ4MiIsayh0aGlzLl94U2NhbGUsbSx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkyIix0aGlzLmhlaWdodCgpKS5jbGFzc2VkKCJiZXR3ZWVubGluZSIsbSkuY2xhc3NlZCgiemVyb2xpbmUiLGZ1bmN0aW9uKHEpe3JldHVybiAwPT09cX0pO24uZXhpdCgpLnJlbW92ZSgpfX07cC5wcm90b3R5cGUuX3JlZHJhd1lMaW5lcz1mdW5jdGlvbigpe2lmKHRoaXMuX3lTY2FsZSl7dmFyIG09dGhpcy5iZXR3ZWVuWSgpLApuPXRoaXMuX3lTY2FsZS50aWNrcygpLnNsaWNlKG0/MTowKTtuPXRoaXMuX3lMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKG4pO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsMCkuYXR0cigieTEiLGsodGhpcy5feVNjYWxlLG0sdGhpcy5feVNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ4MiIsdGhpcy53aWR0aCgpKS5hdHRyKCJ5MiIsayh0aGlzLl95U2NhbGUsbSx0aGlzLl95U2NhbGUudGlja3MoKSkpLmNsYXNzZWQoImJldHdlZW5saW5lIixtKS5jbGFzc2VkKCJ6ZXJvbGluZSIsZnVuY3Rpb24ocSl7cmV0dXJuIDA9PT1xfSk7bi5leGl0KCkucmVtb3ZlKCl9fTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuR3JpZGxpbmVzPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgeCBpbiBxKXEuaGFzT3duUHJvcGVydHkoeCkmJgooblt4XT1xW3hdKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHQ9aCg1KSxsPWgoMjMpLHA9aCg4KSxtPWgoMCk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKHUpe3ZhciB4PW4uY2FsbCh0aGlzKXx8dGhpczt4Ll90ZXh0UGFkZGluZz01O2lmKG51bGw9PXUpdGhyb3cgRXJyb3IoIkludGVycG9sYXRlZENvbG9yTGVnZW5kIHJlcXVpcmVzIGEgaW50ZXJwb2xhdGVkQ29sb3JTY2FsZSIpO3guX3NjYWxlPXU7eC5fcmVkcmF3Q2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4geC5yZWRyYXcoKX07eC5fc2NhbGUub25VcGRhdGUoeC5fcmVkcmF3Q2FsbGJhY2spO3guX2Zvcm1hdHRlcj1wLmdlbmVyYWwoKTt4Ll9vcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI7eC5fZXhwYW5kcz0hMTt4LmFkZENsYXNzKCJsZWdlbmQiKTt4LmFkZENsYXNzKCJpbnRlcnBvbGF0ZWQtY29sb3ItbGVnZW5kIik7cmV0dXJuIHh9ayhxLApuKTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayl9O3EucHJvdG90eXBlLmZvcm1hdHRlcj1mdW5jdGlvbih1KXtpZih2b2lkIDA9PT11KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXU7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuZXhwYW5kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHBhbmRzfTtxLl9lbnN1cmVPcmllbnRhdGlvbj1mdW5jdGlvbih1KXt1PXUudG9Mb3dlckNhc2UoKTtpZigiaG9yaXpvbnRhbCI9PT11fHwibGVmdCI9PT11fHwicmlnaHQiPT09dSlyZXR1cm4gdTt0aHJvdyBFcnJvcignIicrdSsnIiBpcyBub3QgYSB2YWxpZCBvcmllbnRhdGlvbiBmb3IgSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQnKTt9O3EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHUpe2lmKG51bGw9PQp1KXJldHVybiB0aGlzLl9vcmllbnRhdGlvbjt0aGlzLl9vcmllbnRhdGlvbj1xLl9lbnN1cmVPcmllbnRhdGlvbih1KTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHx0aGlzLl9pc1ZlcnRpY2FsKCl9O3EucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHwhdGhpcy5faXNWZXJ0aWNhbCgpfTtxLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrcz1mdW5jdGlvbih1KXt2b2lkIDA9PT11JiYodT1xLl9ERUZBVUxUX05VTV9TV0FUQ0hFUyk7dmFyIHg9dGhpcy5fc2NhbGUuZG9tYWluKCk7aWYoMT09PXUpcmV0dXJuW3hbMF1dO2Zvcih2YXIgQT0oeFsxXS14WzBdKS8odS0xKSx5PVtdLHc9MDt3PHU7dysrKXkucHVzaCh4WzBdK0Eqdyk7cmV0dXJuIHl9O3EucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe24ucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwp0aGlzLl9zd2F0Y2hDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic3dhdGNoLWNvbnRhaW5lciIsITApO3RoaXMuX3N3YXRjaEJvdW5kaW5nQm94PXRoaXMuY29udGVudCgpLmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInN3YXRjaC1ib3VuZGluZy1ib3giLCEwKTt0aGlzLl9sb3dlckxhYmVsPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQocS5MRUdFTkRfTEFCRUxfQ0xBU1MsITApO3RoaXMuX3VwcGVyTGFiZWw9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLkxFR0VORF9MQUJFTF9DTEFTUywhMCk7dmFyIHU9bmV3IHQuU3ZnQ29udGV4dCh0aGlzLmNvbnRlbnQoKS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyB0Lk1lYXN1cmVyKHUpO3RoaXMuX3dyYXBwZXI9bmV3IHQuV3JhcHBlcjt0aGlzLl93cml0ZXI9bmV3IHQuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHUsdGhpcy5fd3JhcHBlcil9O3EucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPQpmdW5jdGlvbigpe3ZhciB1PXRoaXMseD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEE9dGhpcy5fc2NhbGUuZG9tYWluKCkubWFwKGZ1bmN0aW9uKEMpe3JldHVybiB1Ll9tZWFzdXJlci5tZWFzdXJlKHUuX2Zvcm1hdHRlcihDKSkud2lkdGh9KSx5PXEuX0RFRkFVTFRfTlVNX1NXQVRDSEVTO2lmKHRoaXMuX2lzVmVydGljYWwoKSl7dmFyIHc9bS5NYXRoLm1heChBLDApO0E9eCt4K3RoaXMuX3RleHRQYWRkaW5nK3crdGhpcy5fdGV4dFBhZGRpbmc7dz15Knh9ZWxzZSB3PXgreCt4LEE9dGhpcy5fdGV4dFBhZGRpbmcrQVswXSt5KngrQVsxXSt0aGlzLl90ZXh0UGFkZGluZztyZXR1cm57bWluV2lkdGg6QSxtaW5IZWlnaHQ6d319O3EucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuImhvcml6b250YWwiIT09dGhpcy5fb3JpZW50YXRpb259O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcztuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpOwp2YXIgeD10aGlzLl9zY2FsZS5kb21haW4oKSxBPXRoaXMuX2Zvcm1hdHRlcih4WzBdKSx5PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoQSkud2lkdGgsdz10aGlzLl9mb3JtYXR0ZXIoeFsxXSk7eD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHcpLndpZHRoO3ZhciBDPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQsRz10aGlzLl90ZXh0UGFkZGluZyxEPTAsQj0wLEk9MCxOPTAsTz17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sSD17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sSz17eDowLHk6MCx3aWR0aDowLGhlaWdodDowfTtpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3ZhciBNPU1hdGguZmxvb3IodGhpcy5oZWlnaHQoKSk7dmFyIEw9TWF0aC5tYXgoeSx4KTt2YXIgUT0odGhpcy53aWR0aCgpLUwtMip0aGlzLl90ZXh0UGFkZGluZykvMjt4PU1hdGgubWF4KHRoaXMud2lkdGgoKS1RLTIqRy1MLDApOwpDPTE7dmFyIFQ9ZnVuY3Rpb24oYWEsbGEpe3JldHVybiB1LmhlaWdodCgpLShsYSsxKX07SC55QWxpZ249InRvcCI7Qj0wO08ueUFsaWduPSJib3R0b20iO049MDtpZigibGVmdCI9PT10aGlzLl9vcmllbnRhdGlvbil7dmFyIFg9ZnVuY3Rpb24oKXtyZXR1cm4gRytMK0d9O0gueEFsaWduPSJyaWdodCI7RD0tKFEreCtHKTtPLnhBbGlnbj0icmlnaHQiO0k9LShRK3grRyl9ZWxzZSBYPWZ1bmN0aW9uKCl7cmV0dXJuIFF9LEgueEFsaWduPSJsZWZ0IixEPVEreCtHLE8ueEFsaWduPSJsZWZ0IixJPVEreCtHO0sud2lkdGg9eDtLLmhlaWdodD1NKkN9ZWxzZSBRPU1hdGgubWF4KEcsKHRoaXMuaGVpZ2h0KCktQykvMiksTT1NYXRoLm1heChNYXRoLmZsb29yKHRoaXMud2lkdGgoKS00KkcteS14KSwwKSx4PTEsQz1NYXRoLm1heCh0aGlzLmhlaWdodCgpLTIqUSwwKSxYPWZ1bmN0aW9uKGFhLGxhKXtyZXR1cm4gTWF0aC5mbG9vcih5KzIqRykrbGF9LFQ9ZnVuY3Rpb24oKXtyZXR1cm4gUX0sCkgueEFsaWduPSJyaWdodCIsRD0tRyxPLnhBbGlnbj0ibGVmdCIsST1HLEsueT1RLEsud2lkdGg9TSp4LEsuaGVpZ2h0PUM7Sy54PVgobnVsbCwwKTt0aGlzLl91cHBlckxhYmVsLnRleHQoIiIpO3RoaXMuX3dyaXRlci53cml0ZSh3LHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLEgsdGhpcy5fdXBwZXJMYWJlbC5ub2RlKCkpO3RoaXMuX3VwcGVyTGFiZWwuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrRCsiLCAiK0IrIikiKTt0aGlzLl9sb3dlckxhYmVsLnRleHQoIiIpO3RoaXMuX3dyaXRlci53cml0ZShBLHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLE8sdGhpcy5fbG93ZXJMYWJlbC5ub2RlKCkpO3RoaXMuX2xvd2VyTGFiZWwuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrSSsiLCAiK04rIikiKTt0aGlzLl9zd2F0Y2hCb3VuZGluZ0JveC5hdHRycyhLKTtBPXRoaXMuX2dlbmVyYXRlVGlja3MoTSk7QT10aGlzLl9zd2F0Y2hDb250YWluZXIuc2VsZWN0QWxsKCJyZWN0LnN3YXRjaCIpLmRhdGEoQSk7Cnc9QS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInN3YXRjaCIsITApO0Q9QS5tZXJnZSh3KTtBLmV4aXQoKS5yZW1vdmUoKTtELmF0dHJzKHtmaWxsOmZ1bmN0aW9uKGFhKXtyZXR1cm4gdS5fc2NhbGUuc2NhbGUoYWEpfSx3aWR0aDp4LGhlaWdodDpDLHg6WCx5OlQsInNoYXBlLXJlbmRlcmluZyI6ImNyaXNwRWRnZXMifSk7bC5BRERfVElUTEVfRUxFTUVOVFMmJncuYXBwZW5kKCJ0aXRsZSIpLnRleHQoZnVuY3Rpb24oYWEpe3JldHVybiB1Ll9mb3JtYXR0ZXIoYWEpfSk7cmV0dXJuIHRoaXN9O3JldHVybiBxfShoKDQpLkNvbXBvbmVudCk7ZC5fREVGQVVMVF9OVU1fU1dBVENIRVM9MTE7ZC5MRUdFTkRfTEFCRUxfQ0xBU1M9ImxlZ2VuZC1sYWJlbCI7Zi5JbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYKKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSx0PWgoNSk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7dm9pZCAwPT09bSYmKG09IiIpO3ZvaWQgMD09PW4mJihuPTApO3ZhciBxPWwuY2FsbCh0aGlzKXx8dGhpcztxLmFkZENsYXNzKCJsYWJlbCIpO3EudGV4dChtKTtxLmFuZ2xlKG4pO3EueEFsaWdubWVudCgiY2VudGVyIikueUFsaWdubWVudCgiY2VudGVyIik7cS5fcGFkZGluZz0wO3JldHVybiBxfWsocCxsKTtwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3ZhciBtPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUodGhpcy5fdGV4dCksbj0oMD09PXRoaXMuYW5nbGUoKT9tLndpZHRoOm0uaGVpZ2h0KSsyKnRoaXMucGFkZGluZygpO209KDA9PT10aGlzLmFuZ2xlKCk/bS5oZWlnaHQ6bS53aWR0aCkrMip0aGlzLnBhZGRpbmcoKTtyZXR1cm57bWluV2lkdGg6biwKbWluSGVpZ2h0Om19fTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90ZXh0Q29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpO3ZhciBtPW5ldyB0LlN2Z0NvbnRleHQodGhpcy5fdGV4dENvbnRhaW5lci5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyB0LkNhY2hlTWVhc3VyZXIobSk7dGhpcy5fd3JhcHBlcj1uZXcgdC5XcmFwcGVyO3RoaXMuX3dyaXRlcj1uZXcgdC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIsbSx0aGlzLl93cmFwcGVyKTt0aGlzLnRleHQodGhpcy5fdGV4dCl9O3AucHJvdG90eXBlLnRleHQ9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fdGV4dDtpZigic3RyaW5nIiE9PXR5cGVvZiBtKXRocm93IEVycm9yKCJMYWJlbC50ZXh0KCkgb25seSB0YWtlcyBzdHJpbmdzIGFzIGlucHV0Iik7dGhpcy5fdGV4dD1tO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLmFuZ2xlPQpmdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9hbmdsZTttJT0zNjA7MTgwPG0/bS09MzYwOi0xODA+bSYmKG0rPTM2MCk7aWYoLTkwPT09bXx8MD09PW18fDkwPT09bSl0aGlzLl9hbmdsZT1tO2Vsc2UgdGhyb3cgRXJyb3IobSsiIGlzIG5vdCBhIHZhbGlkIGFuZ2xlIGZvciBMYWJlbCIpO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnBhZGRpbmc9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fcGFkZGluZzttPSttO2lmKDA+bSl0aHJvdyBFcnJvcihtKyIgaXMgbm90IGEgdmFsaWQgcGFkZGluZyB2YWx1ZS4gQ2Fubm90IGJlIGxlc3MgdGhhbiAwLiIpO3RoaXMuX3BhZGRpbmc9bTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PQpmdW5jdGlvbigpe2wucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fdGV4dENvbnRhaW5lci5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTt2YXIgbT10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHRoaXMuX3RleHQpLG49TWF0aC5tYXgoTWF0aC5taW4oKHRoaXMuaGVpZ2h0KCktbS5oZWlnaHQpLzIsdGhpcy5wYWRkaW5nKCkpLDApO209TWF0aC5tYXgoTWF0aC5taW4oKHRoaXMud2lkdGgoKS1tLndpZHRoKS8yLHRoaXMucGFkZGluZygpKSwwKTt0aGlzLl90ZXh0Q29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK20rIiwiK24rIikiKTttPXRoaXMud2lkdGgoKS0yKm07bj10aGlzLmhlaWdodCgpLTIqbjt2YXIgcT17eEFsaWduOnRoaXMueEFsaWdubWVudCgpLHlBbGlnbjp0aGlzLnlBbGlnbm1lbnQoKSx0ZXh0Um90YXRpb246dGhpcy5hbmdsZSgpfTt0aGlzLl93cml0ZXIud3JpdGUodGhpcy5fdGV4dCxtLG4scSk7cmV0dXJuIHRoaXN9OwpwLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuTGFiZWw9ZDtoPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXttPWwuY2FsbCh0aGlzLG0sbil8fHRoaXM7bS5hZGRDbGFzcyhwLlRJVExFX0xBQkVMX0NMQVNTKTtyZXR1cm4gbX1rKHAsbCk7cmV0dXJuIHB9KGQpO2guVElUTEVfTEFCRUxfQ0xBU1M9InRpdGxlLWxhYmVsIjtmLlRpdGxlTGFiZWw9aDtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXttPWwuY2FsbCh0aGlzLG0sbil8fHRoaXM7bS5hZGRDbGFzcyhwLkFYSVNfTEFCRUxfQ0xBU1MpO3JldHVybiBtfWsocCxsKTtyZXR1cm4gcH0oZCk7ZC5BWElTX0xBQkVMX0NMQVNTPSJheGlzLWxhYmVsIjtmLkF4aXNMYWJlbD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fApmdW5jdGlvbihBLHkpe2Z1bmN0aW9uIHcoKXt0aGlzLmNvbnN0cnVjdG9yPUF9Zm9yKHZhciBDIGluIHkpeS5oYXNPd25Qcm9wZXJ0eShDKSYmKEFbQ109eVtDXSk7QS5wcm90b3R5cGU9bnVsbD09PXk/T2JqZWN0LmNyZWF0ZSh5KToody5wcm90b3R5cGU9eS5wcm90b3R5cGUsbmV3IHcpfSx0PWgoMSksbD1oKDUpLHA9aCgyMyksbT1oKDgpLG49aCgzMSkscT1oKDApO2Q9aCg0KTt2YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoeSx3LEMpe3ZvaWQgMD09PXkmJih5PVtdKTt2b2lkIDA9PT13JiYodz0wKTt2b2lkIDA9PT1DJiYoQz1JbmZpbml0eSk7dGhpcy5jb2x1bW5zPXk7dGhpcy5ib3R0b21QYWRkaW5nPXc7dGhpcy5tYXhXaWR0aD1DfUEucHJvdG90eXBlLmFkZENvbHVtbj1mdW5jdGlvbih5KXt2YXIgdz15LndpZHRoLEM9dGhpcy5nZXRXaWR0aEF2YWlsYWJsZSgpO3kud2lkdGg9TWF0aC5taW4oQyx3KTt0aGlzLmNvbHVtbnMucHVzaCh5KX07QS5wcm90b3R5cGUuZ2V0Qm91bmRzPQpmdW5jdGlvbih5KXtmb3IodmFyIHc9dGhpcy5jb2x1bW5zW3ldLEM9MCxHPTA7Rzx5O0crKylDKz10aGlzLmNvbHVtbnNbR10ud2lkdGg7cmV0dXJue3RvcExlZnQ6e3g6Qyx5OjB9LGJvdHRvbVJpZ2h0Ont4OkMrdy53aWR0aCx5OncuaGVpZ2h0fX19O0EucHJvdG90eXBlLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBxLk1hdGgubWF4KHRoaXMuY29sdW1ucy5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIHkuaGVpZ2h0fSksMCkrdGhpcy5ib3R0b21QYWRkaW5nfTtBLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbih0aGlzLmNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uKHksdyl7cmV0dXJuIHkrdy53aWR0aH0sMCksdGhpcy5tYXhXaWR0aCl9O0EucHJvdG90eXBlLmdldFdpZHRoQXZhaWxhYmxlPWZ1bmN0aW9uKCl7dmFyIHk9dGhpcy5nZXRXaWR0aCgpO3JldHVybiBNYXRoLm1heCh0aGlzLm1heFdpZHRoLXksMCl9O3JldHVybiBBfSgpLHg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBKHksCncsQyxHKXt2b2lkIDA9PT15JiYoeT1JbmZpbml0eSk7dm9pZCAwPT09dyYmKHc9SW5maW5pdHkpO3ZvaWQgMD09PUMmJihDPTApO3ZvaWQgMD09PUcmJihHPVtdKTt0aGlzLm1heFdpZHRoPXk7dGhpcy5tYXhIZWlnaHQ9dzt0aGlzLnBhZGRpbmc9Qzt0aGlzLnJvd3M9R31BLnByb3RvdHlwZS5hZGRSb3c9ZnVuY3Rpb24oeSl7eS5tYXhXaWR0aD10aGlzLm1heFdpZHRoLTIqdGhpcy5wYWRkaW5nO3RoaXMucm93cy5wdXNoKHkpfTtBLnByb3RvdHlwZS5nZXRDb2x1bW5Cb3VuZHM9ZnVuY3Rpb24oeSx3KXt2YXIgQz10aGlzLmdldFJvd0JvdW5kcyh5KTt5PXRoaXMucm93c1t5XS5nZXRCb3VuZHModyk7eS50b3BMZWZ0LngrPUMudG9wTGVmdC54O3kuYm90dG9tUmlnaHQueCs9Qy50b3BMZWZ0Lng7eS50b3BMZWZ0LnkrPUMudG9wTGVmdC55O3kuYm90dG9tUmlnaHQueSs9Qy50b3BMZWZ0Lnk7cmV0dXJuIHl9O0EucHJvdG90eXBlLmdldFJvd0JvdW5kcz1mdW5jdGlvbih5KXtmb3IodmFyIHc9CnRoaXMucGFkZGluZyxDPXRoaXMucGFkZGluZyxHPTA7Rzx5O0crKylDKz10aGlzLnJvd3NbR10uZ2V0SGVpZ2h0KCk7cmV0dXJue3RvcExlZnQ6e3g6dyx5OkN9LGJvdHRvbVJpZ2h0Ont4OncrdGhpcy5yb3dzW3ldLmdldFdpZHRoKCkseTpDK3RoaXMucm93c1t5XS5nZXRIZWlnaHQoKX19fTtBLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5yb3dzLnJlZHVjZShmdW5jdGlvbih5LHcpe3JldHVybiB5K3cuZ2V0SGVpZ2h0KCl9LDApKzIqdGhpcy5wYWRkaW5nLHRoaXMubWF4SGVpZ2h0KX07QS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4ocS5NYXRoLm1heCh0aGlzLnJvd3MubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5LmdldFdpZHRoKCl9KSwwKSsyKnRoaXMucGFkZGluZyx0aGlzLm1heFdpZHRoKX07cmV0dXJuIEF9KCk7ZD1mdW5jdGlvbihBKXtmdW5jdGlvbiB5KHcpe3ZhciBDPUEuY2FsbCh0aGlzKXx8CnRoaXM7Qy5fcGFkZGluZz01O0MuX3Jvd0JvdHRvbVBhZGRpbmc9MztDLmFkZENsYXNzKCJsZWdlbmQiKTtDLm1heEVudHJpZXNQZXJSb3coMSk7aWYobnVsbD09dyl0aHJvdyBFcnJvcigiTGVnZW5kIHJlcXVpcmVzIGEgY29sb3JTY2FsZSIpO0MuX2NvbG9yU2NhbGU9dztDLl9yZWRyYXdDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBDLnJlZHJhdygpfTtDLl9jb2xvclNjYWxlLm9uVXBkYXRlKEMuX3JlZHJhd0NhbGxiYWNrKTtDLl9mb3JtYXR0ZXI9bS5pZGVudGl0eSgpO0MubWF4TGluZXNQZXJFbnRyeSgxKTtDLnhBbGlnbm1lbnQoInJpZ2h0IikueUFsaWdubWVudCgidG9wIik7Qy5jb21wYXJhdG9yKGZ1bmN0aW9uKEcsRCl7dmFyIEI9Qy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLm1hcChmdW5jdGlvbihJKXtyZXR1cm4gQy5fZm9ybWF0dGVyKEkpfSk7cmV0dXJuIEIuaW5kZXhPZihHKS1CLmluZGV4T2YoRCl9KTtDLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gbi5jaXJjbGUoKX07CkMuX3N5bWJvbE9wYWNpdHlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiAxfTtyZXR1cm4gQ31rKHksQSk7eS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7QS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHc9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9ST1dfQ0xBU1MsITApO3cuYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9FTlRSWV9DTEFTUywhMCkuYXBwZW5kKCJ0ZXh0Iik7dz1uZXcgbC5TdmdDb250ZXh0KHcubm9kZSgpLG51bGwscC5BRERfVElUTEVfRUxFTUVOVFMpO3RoaXMuX21lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIodyk7dGhpcy5fd3JhcHBlcj0obmV3IGwuV3JhcHBlcikubWF4TGluZXModGhpcy5tYXhMaW5lc1BlckVudHJ5KCkpO3RoaXMuX3dyaXRlcj1uZXcgbC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIsdyx0aGlzLl93cmFwcGVyKX07eS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHcpe2lmKG51bGw9PQp3KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXc7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUubWF4RW50cmllc1BlclJvdz1mdW5jdGlvbih3KXtpZihudWxsPT13KXJldHVybiB0aGlzLl9tYXhFbnRyaWVzUGVyUm93O3RoaXMuX21heEVudHJpZXNQZXJSb3c9dzt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt5LnByb3RvdHlwZS5tYXhMaW5lc1BlckVudHJ5PWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX21heExpbmVzUGVyRW50cnk7dGhpcy5fbWF4TGluZXNQZXJFbnRyeT13O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3kucHJvdG90eXBlLm1heFdpZHRoPWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX21heFdpZHRoO3RoaXMuX21heFdpZHRoPXc7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuY29tcGFyYXRvcj1mdW5jdGlvbih3KXtudWxsIT13JiYodGhpcy5fY29tcGFyYXRvcj0Kdyx0aGlzLnJlZHJhdygpKX07eS5wcm90b3R5cGUuY29sb3JTY2FsZT1mdW5jdGlvbih3KXtyZXR1cm4gbnVsbCE9dz8odGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spLHRoaXMuX2NvbG9yU2NhbGU9dyx0aGlzLl9jb2xvclNjYWxlLm9uVXBkYXRlKHRoaXMuX3JlZHJhd0NhbGxiYWNrKSx0aGlzLnJlZHJhdygpLHRoaXMpOnRoaXMuX2NvbG9yU2NhbGV9O3kucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfTt5LnByb3RvdHlwZS5fYnVpbGRMZWdlbmRUYWJsZT1mdW5jdGlvbih3LEMpe3ZhciBHPXRoaXMsRD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEI9bmV3IHgodyxDLHRoaXMuX3BhZGRpbmcpO3c9dGhpcy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLnNvcnQoZnVuY3Rpb24oTiwKTyl7cmV0dXJuIEcuX2NvbXBhcmF0b3IoRy5fZm9ybWF0dGVyKE4pLEcuX2Zvcm1hdHRlcihPKSl9KTt2YXIgST1uZXcgdTtCLmFkZFJvdyhJKTtJLmJvdHRvbVBhZGRpbmc9dGhpcy5fcm93Qm90dG9tUGFkZGluZzt3LmZvckVhY2goZnVuY3Rpb24oTil7SS5jb2x1bW5zLmxlbmd0aC8yPT09Ry5tYXhFbnRyaWVzUGVyUm93KCkmJihJPW5ldyB1LEkuYm90dG9tUGFkZGluZz1HLl9yb3dCb3R0b21QYWRkaW5nLEIuYWRkUm93KEkpKTt2YXIgTz1JLmdldFdpZHRoQXZhaWxhYmxlKCksSD1HLl9mb3JtYXR0ZXIoTiksSz1HLl9tZWFzdXJlci5tZWFzdXJlKEgpLndpZHRoOzA+Ty1ELUsmJjE8SS5jb2x1bW5zLmxlbmd0aCYmKEk9bmV3IHUsSS5ib3R0b21QYWRkaW5nPUcuX3Jvd0JvdHRvbVBhZGRpbmcsQi5hZGRSb3coSSkpO0kuYWRkQ29sdW1uKHt3aWR0aDpELGhlaWdodDpELGRhdGE6e25hbWU6Tix0eXBlOiJzeW1ib2wifX0pO089SS5nZXRXaWR0aEF2YWlsYWJsZSgpO089TWF0aC5taW4oTywKSyk7Ry5fd3JhcHBlci5tYXhMaW5lcyhHLm1heExpbmVzUGVyRW50cnkoKSk7SD1HLl93cmFwcGVyLndyYXAoSCxHLl9tZWFzdXJlcixPKS5ub0xpbmVzKkQ7SS5hZGRDb2x1bW4oe3dpZHRoOk8saGVpZ2h0OkgsZGF0YTp7bmFtZTpOLHR5cGU6InRleHQifX0pfSk7cmV0dXJuIEJ9O3kucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHcsQyl7dz10aGlzLl9idWlsZExlZ2VuZFRhYmxlKHEuTWF0aC5taW4oW3RoaXMubWF4V2lkdGgoKSx3XSx3KSxDKTtyZXR1cm57bWluSGVpZ2h0OncuZ2V0SGVpZ2h0KCksbWluV2lkdGg6dy5nZXRXaWR0aCgpfX07eS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih3KXt2YXIgQz10aGlzO2lmKCF0aGlzLl9pc1NldHVwKXJldHVybltdO3ZhciBHPXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3JldHVybiBHLnJvd3MucmVkdWNlKGZ1bmN0aW9uKEQsQixJKXtpZigwIT09RC5sZW5ndGgpcmV0dXJuIEQ7CnZhciBOPUcuZ2V0Um93Qm91bmRzKEkpO3JldHVybiBxLk1hdGgud2l0aGluKHcsTik/Qi5jb2x1bW5zLnJlZHVjZShmdW5jdGlvbihPLEgsSyl7dmFyIE09Ry5nZXRDb2x1bW5Cb3VuZHMoSSxLKTtpZihxLk1hdGgud2l0aGluKHcsTSkpe089Qy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIit5LkxFR0VORF9ST1dfQ0xBU1MpLm5vZGVzKClbSV07Sz10LnNlbGVjdChPKS5zZWxlY3RBbGwoIi4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5ub2RlcygpW01hdGguZmxvb3IoSy8yKV07dmFyIEw9dC5zZWxlY3QoSykuc2VsZWN0KCIuIit5LkxFR0VORF9TWU1CT0xfQ0xBU1MpO009cS5ET00uZ2V0VHJhbnNsYXRlVmFsdWVzKHQuc2VsZWN0KE8pKTtMPXEuRE9NLmdldFRyYW5zbGF0ZVZhbHVlcyhMKTtyZXR1cm5be2JvdW5kczpxLkRPTS5lbGVtZW50QkJveCh0LnNlbGVjdChPKSksZGF0dW06SC5kYXRhLm5hbWUscG9zaXRpb246e3g6TVswXStMWzBdLHk6TVsxXStMWzFdfSxzZWxlY3Rpb246dC5zZWxlY3QoSyksCmNvbXBvbmVudDpDfV19cmV0dXJuIE99LEQpOkR9LFtdKX07eS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciB3PXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3ZhciBDPXRoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX1JPV19DTEFTUykuZGF0YSh3LnJvd3MpLEc9Qy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfUk9XX0NMQVNTLCEwKS5tZXJnZShDKTtDLmV4aXQoKS5yZW1vdmUoKTtHLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oQixJKXtCPXcuZ2V0Um93Qm91bmRzKEkpO3JldHVybiJ0cmFuc2xhdGUoIitCLnRvcExlZnQueCsiLCAiK0IudG9wTGVmdC55KyIpIn0pO3ZhciBEPXRoaXM7Ry5lYWNoKGZ1bmN0aW9uKEIsSSl7Zm9yKHZhciBOPQpbXSxPPTA7TzxCLmNvbHVtbnMubGVuZ3RoO08rPTIpTi5wdXNoKFtCLmNvbHVtbnNbT10sQi5jb2x1bW5zW08rMV1dKTtCPXQuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5kYXRhKE4pO049Qi5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfRU5UUllfQ0xBU1MsITApLm1lcmdlKEIpO04uYXBwZW5kKCJwYXRoIikuYXR0cigiZCIsZnVuY3Rpb24oSCl7SD1IWzBdO3JldHVybiBELnN5bWJvbCgpKEguZGF0YS5uYW1lLEkpKC42KkguaGVpZ2h0KShudWxsKX0pLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oSCl7SD1IWzBdO3JldHVybiJ0cmFuc2xhdGUoIisody5nZXRDb2x1bW5Cb3VuZHMoSSx3LnJvd3NbSV0uY29sdW1ucy5pbmRleE9mKEgpKS50b3BMZWZ0LngrSC53aWR0aC8yKSsiLCAiK0guaGVpZ2h0LzIrIikifSkuYXR0cigiZmlsbCIsZnVuY3Rpb24oSCl7cmV0dXJuIEQuX2NvbG9yU2NhbGUuc2NhbGUoSFswXS5kYXRhLm5hbWUpfSkuYXR0cigib3BhY2l0eSIsCmZ1bmN0aW9uKEgpe3JldHVybiBELnN5bWJvbE9wYWNpdHkoKShIWzBdLmRhdGEubmFtZSxJKX0pLmNsYXNzZWQoeS5MRUdFTkRfU1lNQk9MX0NMQVNTLCEwKTtOLmFwcGVuZCgiZyIpLmNsYXNzZWQoInRleHQtY29udGFpbmVyIiwhMCkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihIKXtyZXR1cm4idHJhbnNsYXRlKCIrdy5nZXRDb2x1bW5Cb3VuZHMoSSx3LnJvd3NbSV0uY29sdW1ucy5pbmRleE9mKEhbMV0pKS50b3BMZWZ0LngrIiwgMCkifSkuZWFjaChmdW5jdGlvbihIKXt2YXIgSz10LnNlbGVjdCh0aGlzKTtIPUhbMV07RC5fd3JpdGVyLndyaXRlKEQuX2Zvcm1hdHRlcihILmRhdGEubmFtZSksSC53aWR0aCxELmhlaWdodCgpLHt4QWxpZ246ImxlZnQiLHlBbGlnbjoidG9wIix0ZXh0Um90YXRpb246MH0sSy5ub2RlKCkpfSk7Qi5leGl0KCkucmVtb3ZlKCl9KTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX3N5bWJvbEZhY3RvcnlBY2Nlc3NvcjsKdGhpcy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yPXc7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sT3BhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zeW1ib2xPcGFjaXR5QWNjZXNzb3J9O3kucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHl9KGQuQ29tcG9uZW50KTtkLkxFR0VORF9ST1dfQ0xBU1M9ImxlZ2VuZC1yb3ciO2QuTEVHRU5EX0VOVFJZX0NMQVNTPSJsZWdlbmQtZW50cnkiO2QuTEVHRU5EX1NZTUJPTF9DTEFTUz0ibGVnZW5kLXN5bWJvbCI7Zi5MZWdlbmQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPQpwfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDIpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXtyZXR1cm4gbnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfWsobSxwKTttLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKG4pe3ZhciBxLHU9SW5maW5pdHk7dGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaChmdW5jdGlvbih4KXt4PXguZW50aXR5TmVhcmVzdChuKTtpZihudWxsIT14KXt2YXIgQT1sLk1hdGguZGlzdGFuY2VTcXVhcmVkKHgucG9zaXRpb24sbik7QTw9dSYmKHU9QSxxPXgpfX0pO3JldHVybiBxfTttLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24obil7aWYobnVsbCE9biYmIShuIGluc3RhbmNlb2YgdC5QbG90KSl0aHJvdyBFcnJvcigiUGxvdCBHcm91cCBvbmx5IGFjY2VwdHMgcGxvdHMiKTsKcC5wcm90b3R5cGUuYXBwZW5kLmNhbGwodGhpcyxuKTtyZXR1cm4gdGhpc307cmV0dXJuIG19KGgoNDEpLkdyb3VwKTtmLlBsb3RHcm91cD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZvaWQgMD09PW4mJihuPVtdKTt2YXIgcT1wLmNhbGwodGhpcyl8fHRoaXM7cS5fcm93UGFkZGluZz0wO3EuX2NvbHVtblBhZGRpbmc9MDtxLl9yb3dzPVtdO3EuX3Jvd1dlaWdodHM9W107cS5fY29sdW1uV2VpZ2h0cz1bXTtxLl9uUm93cz0wO3EuX25Db2xzPTA7cS5fY2FsY3VsYXRlZExheW91dD0KbnVsbDtxLmFkZENsYXNzKCJ0YWJsZSIpO24uZm9yRWFjaChmdW5jdGlvbih1LHgpe3UuZm9yRWFjaChmdW5jdGlvbihBLHkpe251bGwhPUEmJnEuYWRkKEEseCx5KX0pfSk7cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKG4pe2Zvcih2YXIgcT0wO3E8dGhpcy5fblJvd3M7cSsrKWZvcih2YXIgdT0wO3U8dGhpcy5fbkNvbHM7dSsrKW51bGwhPXRoaXMuX3Jvd3NbcV1bdV0mJm4odGhpcy5fcm93c1txXVt1XSl9O20ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKylpZih0aGlzLl9yb3dzW3FdW3VdPT09bilyZXR1cm4hMDtyZXR1cm4hMX07bS5wcm90b3R5cGUuY29tcG9uZW50QXQ9ZnVuY3Rpb24obixxKXtyZXR1cm4gMD5ufHxuPj10aGlzLl9uUm93c3x8MD5xfHxxPj10aGlzLl9uQ29scz9udWxsOnRoaXMuX3Jvd3Nbbl1bcV19O20ucHJvdG90eXBlLmFkZD0KZnVuY3Rpb24obixxLHUpe2lmKG51bGw9PW4pdGhyb3cgRXJyb3IoIkNhbm5vdCBhZGQgbnVsbCB0byBhIHRhYmxlIGNlbGwiKTtpZighdGhpcy5oYXMobikpe2lmKG51bGwhPSh0aGlzLl9yb3dzW3FdJiZ0aGlzLl9yb3dzW3FdW3VdKSl0aHJvdyBFcnJvcigiY2VsbCBpcyBvY2N1cGllZCIpO24uZGV0YWNoKCk7dGhpcy5fblJvd3M9TWF0aC5tYXgocSsxLHRoaXMuX25Sb3dzKTt0aGlzLl9uQ29scz1NYXRoLm1heCh1KzEsdGhpcy5fbkNvbHMpO3RoaXMuX3BhZFRhYmxlVG9TaXplKHRoaXMuX25Sb3dzLHRoaXMuX25Db2xzKTt0aGlzLl9yb3dzW3FdW3VdPW47dGhpcy5fYWRvcHRBbmRBbmNob3Iobik7dGhpcy5yZWRyYXcoKX1yZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKylpZih0aGlzLl9yb3dzW3FdW3VdPT09bil7dGhpcy5fcm93c1txXVt1XT0KbnVsbDtyZXR1cm59fTttLnByb3RvdHlwZS5faXRlcmF0ZUxheW91dD1mdW5jdGlvbihuLHEsdSl7dm9pZCAwPT09dSYmKHU9ITEpO3ZhciB4PXRoaXMuX3Jvd3MsQT10LnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtuLT10aGlzLl9jb2x1bW5QYWRkaW5nKih0aGlzLl9uQ29scy0xKTtxLT10aGlzLl9yb3dQYWRkaW5nKih0aGlzLl9uUm93cy0xKTt4PW0uX2NhbGNDb21wb25lbnRXZWlnaHRzKHRoaXMuX3Jvd1dlaWdodHMseCxmdW5jdGlvbihMKXtyZXR1cm4gbnVsbD09THx8TC5maXhlZEhlaWdodCgpfSk7QT1tLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9jb2x1bW5XZWlnaHRzLEEsZnVuY3Rpb24oTCl7cmV0dXJuIG51bGw9PUx8fEwuZml4ZWRXaWR0aCgpfSk7dmFyIHk9QS5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIDA9PT1MPy41Okx9KSx3PXgubWFwKGZ1bmN0aW9uKEwpe3JldHVybiAwPT09TD8uNTpMfSk7eT1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoeSxuKTt2YXIgQz1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UodywKcSksRz1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fbkNvbHMpLEQ9bC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Sb3dzKTt3PTA7Zm9yKHZhciBCLEksTjs7KXtEPWwuQXJyYXkuYWRkKEQsQyk7eT1sLkFycmF5LmFkZChHLHkpO0I9dGhpcy5fZGV0ZXJtaW5lR3VhcmFudGVlcyh5LEQsdSk7Rz1CLmd1YXJhbnRlZWRXaWR0aHM7RD1CLmd1YXJhbnRlZWRIZWlnaHRzO0k9Qi53YW50c1dpZHRoQXJyLnNvbWUoZnVuY3Rpb24oTCl7cmV0dXJuIEx9KTtOPUIud2FudHNIZWlnaHRBcnIuc29tZShmdW5jdGlvbihMKXtyZXR1cm4gTH0pO3ZhciBPPUssSD1NO3ZhciBLPW4tdC5zdW0oQi5ndWFyYW50ZWVkV2lkdGhzKTt2YXIgTT1xLXQuc3VtKEIuZ3VhcmFudGVlZEhlaWdodHMpO3k9dm9pZCAwO0k/KHk9Qi53YW50c1dpZHRoQXJyLm1hcChmdW5jdGlvbihMKXtyZXR1cm4gTD8uMTowfSkseT1sLkFycmF5LmFkZCh5LEEpKTp5PUE7Qz12b2lkIDA7Tj8oQz1CLndhbnRzSGVpZ2h0QXJyLm1hcChmdW5jdGlvbihMKXtyZXR1cm4gTD8KLjE6MH0pLEM9bC5BcnJheS5hZGQoQyx4KSk6Qz14O3k9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHksSyk7Qz1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoQyxNKTt3Kys7SD0wPE0mJk0hPT1IO2lmKCEoMDxLJiZLIT09T3x8SCkpYnJlYWs7aWYoNTx3KWJyZWFrfUs9bi10LnN1bShCLmd1YXJhbnRlZWRXaWR0aHMpO009cS10LnN1bShCLmd1YXJhbnRlZWRIZWlnaHRzKTt5PW0uX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShBLEspO0M9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHgsTSk7cmV0dXJue2NvbFByb3BvcnRpb25hbFNwYWNlOnkscm93UHJvcG9ydGlvbmFsU3BhY2U6QyxndWFyYW50ZWVkV2lkdGhzOkIuZ3VhcmFudGVlZFdpZHRocyxndWFyYW50ZWVkSGVpZ2h0czpCLmd1YXJhbnRlZWRIZWlnaHRzLHdhbnRzV2lkdGg6SSx3YW50c0hlaWdodDpOfX07bS5wcm90b3R5cGUuX2RldGVybWluZUd1YXJhbnRlZXM9ZnVuY3Rpb24obixxLHUpe3ZvaWQgMD09PXUmJih1PSExKTt2YXIgeD0KbC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Db2xzKSxBPWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uUm93cykseT1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KCExLHRoaXMuX25Db2xzKSx3PWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoITEsdGhpcy5fblJvd3MpO3RoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihDLEcpe0MuZm9yRWFjaChmdW5jdGlvbihELEIpe0Q9bnVsbCE9RD9ELnJlcXVlc3RlZFNwYWNlKG5bQl0scVtHXSk6e21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O3hbQl09TWF0aC5tYXgoeFtCXSx1P01hdGgubWluKEQubWluV2lkdGgsbltCXSk6RC5taW5XaWR0aCk7QVtHXT1NYXRoLm1heChBW0ddLHU/TWF0aC5taW4oRC5taW5IZWlnaHQscVtHXSk6RC5taW5IZWlnaHQpO3ZhciBJPUQubWluV2lkdGg+bltCXTt5W0JdPXlbQl18fEk7Qj1ELm1pbkhlaWdodD5xW0ddO3dbR109d1tHXXx8Qn0pfSk7cmV0dXJue2d1YXJhbnRlZWRXaWR0aHM6eCwKZ3VhcmFudGVlZEhlaWdodHM6QSx3YW50c1dpZHRoQXJyOnksd2FudHNIZWlnaHRBcnI6d319O20ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKG4scSl7dGhpcy5fY2FsY3VsYXRlZExheW91dD10aGlzLl9pdGVyYXRlTGF5b3V0KG4scSk7cmV0dXJue21pbldpZHRoOnQuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZFdpZHRocyksbWluSGVpZ2h0OnQuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpfX07bS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihuLHEsdSl7dmFyIHg9dGhpcztwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxuLHEsdSk7bj10LnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpO3E9dC5zdW0odGhpcy5fY2FsY3VsYXRlZExheW91dC5ndWFyYW50ZWVkSGVpZ2h0cyk7dT10aGlzLl9jYWxjdWxhdGVkTGF5b3V0O2lmKG4+dGhpcy53aWR0aCgpfHwKcT50aGlzLmhlaWdodCgpKXU9dGhpcy5faXRlcmF0ZUxheW91dCh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSwhMCk7dmFyIEE9MCx5PWwuQXJyYXkuYWRkKHUucm93UHJvcG9ydGlvbmFsU3BhY2UsdS5ndWFyYW50ZWVkSGVpZ2h0cyksdz1sLkFycmF5LmFkZCh1LmNvbFByb3BvcnRpb25hbFNwYWNlLHUuZ3VhcmFudGVlZFdpZHRocyk7dGhpcy5fcm93cy5mb3JFYWNoKGZ1bmN0aW9uKEMsRyl7dmFyIEQ9MDtDLmZvckVhY2goZnVuY3Rpb24oQixJKXtudWxsIT1CJiZCLmNvbXB1dGVMYXlvdXQoe3g6RCx5OkF9LHdbSV0seVtHXSk7RCs9d1tJXSt4Ll9jb2x1bW5QYWRkaW5nfSk7QSs9eVtHXSt4Ll9yb3dQYWRkaW5nfSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJvd1BhZGRpbmc9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fcm93UGFkZGluZztpZighbC5NYXRoLmlzVmFsaWROdW1iZXIobil8fDA+bil0aHJvdyBFcnJvcigicm93UGFkZGluZyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpOwp0aGlzLl9yb3dQYWRkaW5nPW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuY29sdW1uUGFkZGluZz1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9jb2x1bW5QYWRkaW5nO2lmKCFsLk1hdGguaXNWYWxpZE51bWJlcihuKXx8MD5uKXRocm93IEVycm9yKCJjb2x1bW5QYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uUGFkZGluZz1uO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJvd1dlaWdodD1mdW5jdGlvbihuLHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX3Jvd1dlaWdodHNbbl07aWYoIWwuTWF0aC5pc1ZhbGlkTnVtYmVyKHEpfHwwPnEpdGhyb3cgRXJyb3IoInJvd1dlaWdodCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3RoaXMuX3Jvd1dlaWdodHNbbl09cTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5jb2x1bW5XZWlnaHQ9CmZ1bmN0aW9uKG4scSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1tuXTtpZighbC5NYXRoLmlzVmFsaWROdW1iZXIocSl8fDA+cSl0aHJvdyBFcnJvcigiY29sdW1uV2VpZ2h0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uV2VpZ2h0c1tuXT1xO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXt2YXIgbj10LnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtyZXR1cm4gbS5fZml4ZWRTcGFjZShuLGZ1bmN0aW9uKHEpe3JldHVybiBudWxsPT1xfHxxLmZpeGVkV2lkdGgoKX0pfTttLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBtLl9maXhlZFNwYWNlKHRoaXMuX3Jvd3MsZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PW58fG4uZml4ZWRIZWlnaHQoKX0pfTttLnByb3RvdHlwZS5fcGFkVGFibGVUb1NpemU9ZnVuY3Rpb24obixxKXtmb3IodmFyIHU9CjA7dTxuO3UrKyl7dm9pZCAwPT09dGhpcy5fcm93c1t1XSYmKHRoaXMuX3Jvd3NbdV09W10sdGhpcy5fcm93V2VpZ2h0c1t1XT1udWxsKTtmb3IodmFyIHg9MDt4PHE7eCsrKXZvaWQgMD09PXRoaXMuX3Jvd3NbdV1beF0mJih0aGlzLl9yb3dzW3VdW3hdPW51bGwpfWZvcih4PTA7eDxxO3grKyl2b2lkIDA9PT10aGlzLl9jb2x1bW5XZWlnaHRzW3hdJiYodGhpcy5fY29sdW1uV2VpZ2h0c1t4XT1udWxsKX07bS5fY2FsY0NvbXBvbmVudFdlaWdodHM9ZnVuY3Rpb24obixxLHUpe3JldHVybiBuLm1hcChmdW5jdGlvbih4LEEpe3JldHVybiBudWxsIT14P3g6cVtBXS5tYXAodSkucmVkdWNlKGZ1bmN0aW9uKHksdyl7cmV0dXJuIHkmJnd9LCEwKT8wOjF9KX07bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlPWZ1bmN0aW9uKG4scSl7dmFyIHU9dC5zdW0obik7cmV0dXJuIDA9PT11P2wuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCxuLmxlbmd0aCk6bi5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHEqCngvdX0pfTttLl9maXhlZFNwYWNlPWZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSh4KXtyZXR1cm4geC5yZWR1Y2UoZnVuY3Rpb24oQSx5KXtyZXR1cm4gQSYmeX0sITApfXJldHVybiB1KG4ubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB1KHgubWFwKHEpKX0pKX07cmV0dXJuIG19KGgoMjkpLkNvbXBvbmVudENvbnRhaW5lcik7Zi5UYWJsZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3ZhciBwPXQuY2FsbCh0aGlzKXx8dGhpcztwLmFkZENsYXNzKCJ4LWRyYWctYm94LWxheWVyIik7cC5faGFzQ29ybmVycz0hMTsKcmV0dXJuIHB9ayhsLHQpO2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24ocCxtLG4pe3QucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHAsbSxuKTt0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24ocCl7dC5wcm90b3R5cGUuX3NldEJvdW5kcy5jYWxsKHRoaXMse3RvcExlZnQ6e3g6cC50b3BMZWZ0LngseTowfSxib3R0b21SaWdodDp7eDpwLmJvdHRvbVJpZ2h0LngseTp0aGlzLmhlaWdodCgpfX0pfTtsLnByb3RvdHlwZS5fc2V0UmVzaXphYmxlQ2xhc3Nlcz1mdW5jdGlvbihwKXtwJiZ0aGlzLmVuYWJsZWQoKT90aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpOnRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIil9O2wucHJvdG90eXBlLnlTY2FsZT1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiB0LnByb3RvdHlwZS55U2NhbGUuY2FsbCh0aGlzKTt0aHJvdyBFcnJvcigieVNjYWxlcyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEcmFnQm94TGF5ZXIiKTsKfTtsLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnlFeHRlbnQuY2FsbCh0aGlzKTt0aHJvdyBFcnJvcigiWERyYWdCb3hMYXllciBoYXMgbm8geUV4dGVudCIpO307cmV0dXJuIGx9KGgoMzIpLkRyYWdCb3hMYXllcik7Zi5YRHJhZ0JveExheWVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7dmFyIHA9dC5jYWxsKHRoaXMpfHx0aGlzO3AuYWRkQ2xhc3MoInktZHJhZy1ib3gtbGF5ZXIiKTtwLl9oYXNDb3JuZXJzPSExO3JldHVybiBwfWsobCx0KTtsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbihwLG0sbil7dC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMscCxtLG4pO3RoaXMuX3NldEJvdW5kcyh0aGlzLmJvdW5kcygpKTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbihwKXt0LnByb3RvdHlwZS5fc2V0Qm91bmRzLmNhbGwodGhpcyx7dG9wTGVmdDp7eDowLHk6cC50b3BMZWZ0Lnl9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OnAuYm90dG9tUmlnaHQueX19KX07bC5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24ocCl7cCYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ5LXJlc2l6YWJsZSIpfTtsLnByb3RvdHlwZS54U2NhbGU9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdC5wcm90b3R5cGUueFNjYWxlLmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoInhTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBZRHJhZ0JveExheWVyIik7Cn07bC5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS54RXh0ZW50LmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoIllEcmFnQm94TGF5ZXIgaGFzIG5vIHhFeHRlbnQiKTt9O3JldHVybiBsfShoKDMyKS5EcmFnQm94TGF5ZXIpO2YuWURyYWdCb3hMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3ZhciBwPXQuY2FsbCh0aGlzKXx8dGhpcztwLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2wuX0tFWURPV05fRVZFTlRfTkFNRV09ZnVuY3Rpb24obSl7cmV0dXJuIHAuX3Byb2Nlc3NLZXlkb3duKG0pfTsKcC5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltsLl9LRVlVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbihtKXtyZXR1cm4gcC5fcHJvY2Vzc0tleXVwKG0pfTtyZXR1cm4gcH1rKGwsdCk7bC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKCl7dmFyIHA9ZG9jdW1lbnRbbC5fRElTUEFUQ0hFUl9LRVldO251bGw9PXAmJihwPW5ldyBsLGRvY3VtZW50W2wuX0RJU1BBVENIRVJfS0VZXT1wKTtyZXR1cm4gcH07bC5wcm90b3R5cGUuX3Byb2Nlc3NLZXlkb3duPWZ1bmN0aW9uKHApe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChsLl9LRVlET1dOX0VWRU5UX05BTUUscC5rZXlDb2RlLHApfTtsLnByb3RvdHlwZS5fcHJvY2Vzc0tleXVwPWZ1bmN0aW9uKHApe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChsLl9LRVlVUF9FVkVOVF9OQU1FLHAua2V5Q29kZSxwKX07bC5wcm90b3R5cGUub25LZXlEb3duPWZ1bmN0aW9uKHApe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQobC5fS0VZRE9XTl9FVkVOVF9OQU1FLApwKX07bC5wcm90b3R5cGUub2ZmS2V5RG93bj1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGwuX0tFWURPV05fRVZFTlRfTkFNRSxwKX07bC5wcm90b3R5cGUub25LZXlVcD1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGwuX0tFWVVQX0VWRU5UX05BTUUscCl9O2wucHJvdG90eXBlLm9mZktleVVwPWZ1bmN0aW9uKHApe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQobC5fS0VZVVBfRVZFTlRfTkFNRSxwKX07cmV0dXJuIGx9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX0tleSI7ZC5fS0VZRE9XTl9FVkVOVF9OQU1FPSJrZXlkb3duIjtkLl9LRVlVUF9FVkVOVF9OQU1FPSJrZXl1cCI7Zi5LZXk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmCihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0sdD1oKDApO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtKXtmdW5jdGlvbiBuKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLCJwYWdlIil9dmFyIHE9bC5jYWxsKHRoaXMpfHx0aGlzO3EuX2xhc3RNb3VzZVBvc2l0aW9uPXt4Oi0xLHk6LTF9O3EuX3RyYW5zbGF0b3I9dC5nZXRUcmFuc2xhdG9yKG0pO3EuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bcC5fTU9VU0VPVkVSX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRU1PVkVfRVZFTlRfTkFNRV09bjtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX01PVVNFT1VUX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRURPV05fRVZFTlRfTkFNRV09CmZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFRE9XTl9FVkVOVF9OQU1FKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRVVQX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFVVBfRVZFTlRfTkFNRSwicGFnZSIpfTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1dIRUVMX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX1dIRUVMX0VWRU5UX05BTUUpfTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX0RCTENMSUNLX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX0RCTENMSUNLX0VWRU5UX05BTUUpfTtyZXR1cm4gcX1rKHAsbCk7cC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKG0pe3ZhciBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCksCnE9bltwLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09cSYmKHE9bmV3IHAobSksbltwLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9O3AucHJvdG90eXBlLm9uTW91c2VNb3ZlPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VNT1ZFX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9mZk1vdXNlTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vbk1vdXNlRG93bj1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFRE9XTl9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZNb3VzZURvd249ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9NT1VTRURPV05fRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25Nb3VzZVVwPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VVUF9FVkVOVF9OQU1FLAptKX07cC5wcm90b3R5cGUub2ZmTW91c2VVcD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFVVBfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25XaGVlbD1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1dIRUVMX0VWRU5UX05BTUUsbSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZldoZWVsPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fV0hFRUxfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25EYmxDbGljaz1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX0RCTENMSUNLX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9mZkRibENsaWNrPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fREJMQ0xJQ0tfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUuX21lYXN1cmVBbmREaXNwYXRjaD1mdW5jdGlvbihtLG4scSwKdSl7dm9pZCAwPT09dSYmKHU9ImVsZW1lbnQiKTtpZigicGFnZSIhPT11JiYiZWxlbWVudCIhPT11KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciK3UrIicsIG11c3QgYmUgJ2VsZW1lbnQnIG9yICdwYWdlJyIpO2lmKCJwYWdlIj09PXV8fHRoaXMuZXZlbnRJbnNpZGUobSxuKSl0aGlzLl9sYXN0TW91c2VQb3NpdGlvbj10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbihuLmNsaWVudFgsbi5jbGllbnRZKSx0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQocSx0aGlzLmxhc3RNb3VzZVBvc2l0aW9uKCksbil9O3AucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHQuVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlKG0sbil9O3AucHJvdG90eXBlLmxhc3RNb3VzZVBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhc3RNb3VzZVBvc2l0aW9ufTtyZXR1cm4gcH0oaCgyNCkuRGlzcGF0Y2hlcik7ZC5fRElTUEFUQ0hFUl9LRVk9Il9fUGxvdHRhYmxlX0Rpc3BhdGNoZXJfTW91c2UiOwpkLl9NT1VTRU9WRVJfRVZFTlRfTkFNRT0ibW91c2VvdmVyIjtkLl9NT1VTRU1PVkVfRVZFTlRfTkFNRT0ibW91c2Vtb3ZlIjtkLl9NT1VTRU9VVF9FVkVOVF9OQU1FPSJtb3VzZW91dCI7ZC5fTU9VU0VET1dOX0VWRU5UX05BTUU9Im1vdXNlZG93biI7ZC5fTU9VU0VVUF9FVkVOVF9OQU1FPSJtb3VzZXVwIjtkLl9XSEVFTF9FVkVOVF9OQU1FPSJ3aGVlbCI7ZC5fREJMQ0xJQ0tfRVZFTlRfTkFNRT0iZGJsY2xpY2siO2YuTW91c2U9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSx0PWgoMCk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0pe3ZhciBuPWwuY2FsbCh0aGlzKXx8CnRoaXM7bi5fdHJhbnNsYXRvcj10LmdldFRyYW5zbGF0b3IobSk7bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSFNUQVJUX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSxxLHAuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSwicGFnZSIpfTtuLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1RPVUNITU9WRV9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0scSxwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfTtuLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1RPVUNIRU5EX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSxxLHAuX1RPVUNIRU5EX0VWRU5UX05BTUUsInBhZ2UiKX07bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0sCnEscC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSwicGFnZSIpfTtyZXR1cm4gbn1rKHAsbCk7cC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKG0pe3ZhciBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCkscT1uW3AuX0RJU1BBVENIRVJfS0VZXTtudWxsPT1xJiYocT1uZXcgcChtKSxuW3AuX0RJU1BBVENIRVJfS0VZXT1xKTtyZXR1cm4gcX07cC5wcm90b3R5cGUub25Ub3VjaFN0YXJ0PWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaFN0YXJ0PWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vblRvdWNoTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNITU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaE1vdmU9ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwKbSl9O3AucHJvdG90eXBlLm9uVG91Y2hFbmQ9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSEVORF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaEVuZD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIRU5EX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9uVG91Y2hDYW5jZWw9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaENhbmNlbD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2g9ZnVuY3Rpb24obSxuLHEsdSl7dm9pZCAwPT09dSYmKHU9ImVsZW1lbnQiKTtpZigicGFnZSIhPT11JiYiZWxlbWVudCIhPT11KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciKwp1KyInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTtpZigiZWxlbWVudCIhPT11fHx0aGlzLmV2ZW50SW5zaWRlKG0sbikpe209bi5jaGFuZ2VkVG91Y2hlczt1PXt9O2Zvcih2YXIgeD1bXSxBPTA7QTxtLmxlbmd0aDtBKyspe3ZhciB5PW1bQV0sdz15LmlkZW50aWZpZXI7eT10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbih5LmNsaWVudFgseS5jbGllbnRZKTtudWxsIT15JiYodVt3XT15LHgucHVzaCh3KSl9MDx4Lmxlbmd0aCYmdGhpcy5fY2FsbENhbGxiYWNrc0ZvckV2ZW50KHEseCx1LG4pfX07cC5wcm90b3R5cGUuZXZlbnRJbnNpZGU9ZnVuY3Rpb24obSxuKXtyZXR1cm4gdC5UcmFuc2xhdG9yLmlzRXZlbnRJbnNpZGUobSxuKX07cmV0dXJuIHB9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX1RvdWNoIjtkLl9UT1VDSFNUQVJUX0VWRU5UX05BTUU9InRvdWNoc3RhcnQiO2QuX1RPVUNITU9WRV9FVkVOVF9OQU1FPQoidG91Y2htb3ZlIjtkLl9UT1VDSEVORF9FVkVOVF9OQU1FPSJ0b3VjaGVuZCI7ZC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRT0idG91Y2hjYW5jZWwiO2YuVG91Y2g9ZH0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQsbCl7dm9pZCAwPT09bCYmKGw9d2luZG93LmRldmljZVBpeGVsUmF0aW8pO3RoaXMuc2NyZWVuV2lkdGg9azt0aGlzLnNjcmVlbkhlaWdodD10O3RoaXMuZGV2aWNlUGl4ZWxSYXRpbz1sO3RoaXMucGl4ZWxXaWR0aD1rKmw7dGhpcy5waXhlbEhlaWdodD10Kmw7dGhpcy5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7dGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTtoLnNpemVQaXhlbHModGhpcy5jdHgsayx0LGwpfWguc2l6ZVBpeGVscz1mdW5jdGlvbihrLHQsbCxwKXt2YXIgbT1rLmNhbnZhczttLndpZHRoPXQqcDttLmhlaWdodD1sKnA7bS5zdHlsZS53aWR0aD10KyJweCI7bS5zdHlsZS5oZWlnaHQ9CmwrInB4IjtrLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7ay5zY2FsZShwLHApfTtoLnByb3RvdHlwZS5ibGl0PWZ1bmN0aW9uKGssdCxsKXt2b2lkIDA9PT10JiYodD0wKTt2b2lkIDA9PT1sJiYobD0wKTtrLmRyYXdJbWFnZSh0aGlzLmNhbnZhcyx0LGwsdGhpcy5zY3JlZW5XaWR0aCx0aGlzLnNjcmVlbkhlaWdodCl9O2gucHJvdG90eXBlLmJsaXRDZW50ZXI9ZnVuY3Rpb24oayx0LGwpe3ZvaWQgMD09PXQmJih0PTApO3ZvaWQgMD09PWwmJihsPTApO3RoaXMuYmxpdChrLE1hdGguZmxvb3IodC10aGlzLnNjcmVlbldpZHRoLzIpLE1hdGguZmxvb3IobC10aGlzLnNjcmVlbkhlaWdodC8yKSl9O2gucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihrLHQsbCl7dm9pZCAwPT09bCYmKGw9ITEpO3ZhciBwPXRoaXMuZGV2aWNlUGl4ZWxSYXRpbzt0aGlzLnNjcmVlbldpZHRoPWs7dGhpcy5zY3JlZW5IZWlnaHQ9dDt0aGlzLnBpeGVsV2lkdGg9aypwO3RoaXMucGl4ZWxIZWlnaHQ9dCpwOwpoLnNpemVQaXhlbHModGhpcy5jdHgsayx0LHApO2wmJnRoaXMuY3R4LnRyYW5zbGF0ZShrLzIsay8yKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oayl7dmFyIHQ9dGhpcy5waXhlbFdpZHRoLGw9dGhpcy5waXhlbEhlaWdodCxwPXRoaXMuY3R4O3Auc2F2ZSgpO3Auc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTtudWxsPT1rP3AuY2xlYXJSZWN0KDAsMCx0LGwpOihwLmZpbGxTdHlsZT1rLHAuZmlsbFJlY3QoMCwwLHQsbCkpO3AucmVzdG9yZSgpO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5nZXRJbWFnZURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnBpeGVsV2lkdGgsdGhpcy5waXhlbEhlaWdodCl9O3JldHVybiBofSgpO2YuQ2FudmFzQnVmZmVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxMyksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPW51bGwhPT1wJiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztuLl9jbGlja2VkRG93bj0hMTtuLl9kb3VibGVDbGlja2luZz0hMTtuLl9vbkNsaWNrQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX29uRG91YmxlQ2xpY2tDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fbW91c2VEb3duQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrRG93bihxKX07bi5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrVXAocSx1KX07bi5fZGJsQ2xpY2tDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVEYmxDbGljayhxLAp1KX07bi5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrRG93bih1W3FbMF1dKX07bi5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrVXAodVtxWzBdXSx4KX07bi5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBuLl9jbGlja2VkRG93bj0hMX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fbW91c2VEaXNwYXRjaGVyPXQuTW91c2UuZ2V0RGlzcGF0Y2hlcihuKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25EYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKTsKdGhpcy5fdG91Y2hEaXNwYXRjaGVyPXQuVG91Y2guZ2V0RGlzcGF0Y2hlcihuKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9O20ucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3AucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZkRibENsaWNrKHRoaXMuX2RibENsaWNrQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O20ucHJvdG90eXBlLl9oYW5kbGVDbGlja0Rvd249ZnVuY3Rpb24obil7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pJiYodGhpcy5fY2xpY2tlZERvd249ITAsdGhpcy5fY2xpY2tlZFBvaW50PW4pfTttLnByb3RvdHlwZS5faGFuZGxlQ2xpY2tVcD1mdW5jdGlvbihuLHEpe3ZhciB1PXRoaXMseD10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2NsaWNrZWREb3duJiZtLl9wb2ludHNFcXVhbCh4LHRoaXMuX2NsaWNrZWRQb2ludCkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXt1Ll9kb3VibGVDbGlja2luZ3x8dS5fb25DbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHgsCnEpfSwwKTt0aGlzLl9jbGlja2VkRG93bj0hMX07bS5wcm90b3R5cGUuX2hhbmRsZURibENsaWNrPWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcztuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2Uobik7dGhpcy5fZG91YmxlQ2xpY2tpbmc9ITA7dGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4scSk7c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB1Ll9kb3VibGVDbGlja2luZz0hMX0sMCl9O20uX3BvaW50c0VxdWFsPWZ1bmN0aW9uKG4scSl7cmV0dXJuIG4ueD09PXEueCYmbi55PT09cS55fTttLnByb3RvdHlwZS5vbkNsaWNrPWZ1bmN0aW9uKG4pe3RoaXMuX29uQ2xpY2tDYWxsYmFja3MuYWRkKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmRlbGV0ZShuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25Eb3VibGVDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzLmFkZChuKX07Cm0ucHJvdG90eXBlLm9mZkRvdWJsZUNsaWNrPWZ1bmN0aW9uKG4pe3RoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuZGVsZXRlKG4pO3JldHVybiB0aGlzfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2YuQ2xpY2s9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMTMpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1udWxsIT09cCYmcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7bi5fZHJhZ2dpbmc9ITE7bi5fY29uc3RyYWluZWRUb0NvbXBvbmVudD0hMDtuLl9tb3VzZUZpbHRlcj1tLl9ERUZBVUxUX01PVVNFX0ZJTFRFUjsKbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX2RyYWdDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fZHJhZ0VuZENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9tb3VzZURvd25DYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9zdGFydERyYWcocSx1KX07bi5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2RvRHJhZyhxKX07bi5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2VuZERyYWcocSx1KX07bi5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHEsdSx4KXtyZXR1cm4gbi5fc3RhcnREcmFnKHVbcVswXV0seCl9O24uX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2RvRHJhZyh1W3FbMF1dKX07bi5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX2VuZERyYWcodVtxWzBdXSx4KX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9CmZ1bmN0aW9uKG4pe3AucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLG4pO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj10Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9dC5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spfTsKbS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbDt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbj0KZnVuY3Rpb24obil7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3JldHVybiB0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50P3t4OmwuTWF0aC5jbGFtcChuLngsMCx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkpLHk6bC5NYXRoLmNsYW1wKG4ueSwwLHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8uaGVpZ2h0KCkpfTpufTttLnByb3RvdHlwZS5fc3RhcnREcmFnPWZ1bmN0aW9uKG4scSl7cSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJiF0aGlzLl9tb3VzZUZpbHRlcihxKXx8KG49dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShuKSx0aGlzLl9pc0luc2lkZUNvbXBvbmVudChuKSYmKHEucHJldmVudERlZmF1bHQoKSx0aGlzLl9kcmFnZ2luZz0hMCx0aGlzLl9kcmFnT3JpZ2luPW4sdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbikpKX07bS5wcm90b3R5cGUuX2RvRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnZ2luZyYmCnRoaXMuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luLHRoaXMuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbihuKSl9O20ucHJvdG90eXBlLl9lbmREcmFnPWZ1bmN0aW9uKG4scSl7cSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJjAhPT1xLmJ1dHRvbnx8IXRoaXMuX2RyYWdnaW5nfHwodGhpcy5fZHJhZ2dpbmc9ITEsdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4sdGhpcy5fdHJhbnNsYXRlQW5kQ29uc3RyYWluKG4pKSl9O20ucHJvdG90eXBlLmNvbnN0cmFpbmVkVG9Db21wb25lbnQ9ZnVuY3Rpb24oKXt0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50PSExfTttLnByb3RvdHlwZS5tb3VzZUZpbHRlcj1mdW5jdGlvbihuKXswIT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX21vdXNlRmlsdGVyPW4pfTttLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuYWRkKG4pfTsKbS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZEcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKG4pfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2QuX0RFRkFVTFRfTU9VU0VfRklMVEVSPWZ1bmN0aW9uKHApe3JldHVybiAwPT09cC5idXR0b259O2YuRHJhZz1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHUseCl7ZnVuY3Rpb24gQSgpe3RoaXMuY29uc3RydWN0b3I9CnV9Zm9yKHZhciB5IGluIHgpeC5oYXNPd25Qcm9wZXJ0eSh5KSYmKHVbeV09eFt5XSk7dS5wcm90b3R5cGU9bnVsbD09PXg/T2JqZWN0LmNyZWF0ZSh4KTooQS5wcm90b3R5cGU9eC5wcm90b3R5cGUsbmV3IEEpfSx0PWgoMSksbD1oKDEzKSxwPWgoMyksbT1oKDApLG49aCgyNSk7ZD1oKDE1KTt2YXIgcT1oKDI2KTtoPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHgoQSx5KXt2YXIgdz11LmNhbGwodGhpcyl8fHRoaXM7dy5fd2hlZWxGaWx0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMH07dy5fd2hlZWxDYWxsYmFjaz1mdW5jdGlvbihDLEcpe3JldHVybiB3Ll9oYW5kbGVXaGVlbEV2ZW50KEMsRyl9O3cuX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihDLEcpe3JldHVybiB3Ll9oYW5kbGVUb3VjaFN0YXJ0KEMsRyl9O3cuX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKEMsRyl7cmV0dXJuIHcuX2hhbmRsZVBpbmNoKEMsRyl9O3cuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24oQyl7cmV0dXJuIHcuX2hhbmRsZVRvdWNoRW5kKEMpfTsKdy5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihDKXtyZXR1cm4gdy5faGFuZGxlVG91Y2hFbmQoQyl9O3cuX3BhbkVuZENhbGxiYWNrcz1uZXcgbS5DYWxsYmFja1NldDt3Ll96b29tRW5kQ2FsbGJhY2tzPW5ldyBtLkNhbGxiYWNrU2V0O3cuX3Bhblpvb21VcGRhdGVDYWxsYmFja3M9bmV3IG0uQ2FsbGJhY2tTZXQ7dy5feFNjYWxlcz1uZXcgbS5TZXQ7dy5feVNjYWxlcz1uZXcgbS5TZXQ7dy5fZHJhZ0ludGVyYWN0aW9uPW5ldyBuLkRyYWc7dy5fc2V0dXBEcmFnSW50ZXJhY3Rpb24oKTt3Ll90b3VjaElkcz10Lm1hcCgpO3cuX21pbkRvbWFpbkV4dGVudHM9bmV3IG0uTWFwO3cuX21heERvbWFpbkV4dGVudHM9bmV3IG0uTWFwO3cuX21pbkRvbWFpblZhbHVlcz1uZXcgbS5NYXA7dy5fbWF4RG9tYWluVmFsdWVzPW5ldyBtLk1hcDtudWxsIT1BJiZ3LmFkZFhTY2FsZShBKTtudWxsIT15JiZ3LmFkZFlTY2FsZSh5KTtyZXR1cm4gd31rKHgsdSk7eC5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259O3gucHJvdG90eXBlLndoZWVsRmlsdGVyPWZ1bmN0aW9uKEEpezAhPT1hcmd1bWVudHMubGVuZ3RoJiYodGhpcy5fd2hlZWxGaWx0ZXI9QSl9O3gucHJvdG90eXBlLnBhbj1mdW5jdGlvbihBKXt2YXIgeT10aGlzO3RoaXMueFNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24odyl7dy5wYW4oeS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbih3LEEueCkpfSk7dGhpcy55U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbih3KXt3LnBhbih5Ll9jb25zdHJhaW5lZFRyYW5zbGF0aW9uKHcsQS55KSl9KTt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKX07eC5wcm90b3R5cGUuem9vbT1mdW5jdGlvbihBLHksdyl7dmFyIEM9dGhpczt2b2lkIDA9PT13JiYodz0hMCk7aWYobnVsbCE9eSl7dmFyIEc9eS54O3ZhciBEPXkueTt3JiYodGhpcy54U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXtCPUMuX2NvbnN0cmFpbmVkWm9vbShCLApBLEcpO0c9Qi5jZW50ZXJQb2ludDtBPUIuem9vbUFtb3VudH0pLHRoaXMueVNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oQil7Qj1DLl9jb25zdHJhaW5lZFpvb20oQixBLEQpO0Q9Qi5jZW50ZXJQb2ludDtBPUIuem9vbUFtb3VudH0pKX10aGlzLnhTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBJPUIucmFuZ2UoKTtCLnpvb20oQSxudWxsPT1HPyhJWzFdK0lbMF0pLzI6Ryl9KTt0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBJPUIucmFuZ2UoKTtCLnpvb20oQSxudWxsPT1EPyhJWzFdK0lbMF0pLzI6RCl9KTt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKTtyZXR1cm57em9vbUFtb3VudDpBLGNlbnRlclZhbHVlOntjZW50ZXJYOkcsY2VudGVyWTpEfX19O3gucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24oQSl7dS5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsQSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKEEpOwp0aGlzLl9tb3VzZURpc3BhdGNoZXI9bC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKHRoaXMuX3doZWVsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1sLlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9O3gucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3UucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKTsKdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1udWxsO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX07eC5wcm90b3R5cGUuX2hhbmRsZVRvdWNoU3RhcnQ9ZnVuY3Rpb24oQSx5KXtmb3IodmFyIHc9MDt3PEEubGVuZ3RoJiYyPnRoaXMuX3RvdWNoSWRzLnNpemUoKTt3Kyspe3ZhciBDPUFbd107dGhpcy5fdG91Y2hJZHMuc2V0KEMudG9TdHJpbmcoKSx0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHlbQ10pKX19Owp4LnByb3RvdHlwZS5faGFuZGxlUGluY2g9ZnVuY3Rpb24oQSx5KXt2YXIgdz10aGlzO2lmKCEoMj50aGlzLl90b3VjaElkcy5zaXplKCkpKXt2YXIgQz10aGlzLl90b3VjaElkcy52YWx1ZXMoKTtpZih0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKENbMF0pKSYmdGhpcy5faXNJbnNpZGVDb21wb25lbnQodGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShDWzFdKSkpe3ZhciBHPXguX3BvaW50RGlzdGFuY2UoQ1swXSxDWzFdKTtpZigwIT09Ryl7QS5mb3JFYWNoKGZ1bmN0aW9uKE8pe3cuX3RvdWNoSWRzLmhhcyhPLnRvU3RyaW5nKCkpJiZ3Ll90b3VjaElkcy5zZXQoTy50b1N0cmluZygpLHcuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoeVtPXSkpfSk7QT10aGlzLl90b3VjaElkcy52YWx1ZXMoKTt2YXIgRD14Ll9wb2ludERpc3RhbmNlKEFbMF0sQVsxXSk7aWYoMCE9PUQpe3ZhciBCPUcvRCxJPUEubWFwKGZ1bmN0aW9uKE8sCkgpe3JldHVybnt4OihPLngtQ1tIXS54KS9CLHk6KE8ueS1DW0hdLnkpL0J9fSk7Rz14LmNlbnRlclBvaW50KENbMF0sQ1sxXSk7Rz10aGlzLnpvb20oQixHKTtBPUcuY2VudGVyVmFsdWU7dmFyIE49Ry56b29tQW1vdW50O0c9QS5jZW50ZXJYO0E9QS5jZW50ZXJZO0Q9Qy5tYXAoZnVuY3Rpb24oTyxIKXtyZXR1cm57eDpJW0hdLngqTitPLngseTpJW0hdLnkqTitPLnl9fSk7dGhpcy5wYW4oe3g6Ry0oRFswXS54K0RbMV0ueCkvMix5OkEtKERbMF0ueStEWzFdLnkpLzJ9KX19fX19O3guY2VudGVyUG9pbnQ9ZnVuY3Rpb24oQSx5KXtyZXR1cm57eDooTWF0aC5taW4oQS54LHkueCkrTWF0aC5tYXgoQS54LHkueCkpLzIseTooTWF0aC5tYXgoQS55LHkueSkrTWF0aC5taW4oQS55LHkueSkpLzJ9fTt4Ll9wb2ludERpc3RhbmNlPWZ1bmN0aW9uKEEseSl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhNYXRoLm1heChBLngseS54KS1NYXRoLm1pbihBLngseS54KSwyKStNYXRoLnBvdyhNYXRoLm1heChBLnksCnkueSktTWF0aC5taW4oQS55LHkueSksMikpfTt4LnByb3RvdHlwZS5faGFuZGxlVG91Y2hFbmQ9ZnVuY3Rpb24oQSl7dmFyIHk9dGhpcztBLmZvckVhY2goZnVuY3Rpb24odyl7eS5fdG91Y2hJZHMucmVtb3ZlKHcudG9TdHJpbmcoKSl9KTswPHRoaXMuX3RvdWNoSWRzLnNpemUoKSYmdGhpcy5fem9vbUVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9O3gucHJvdG90eXBlLl9oYW5kbGVXaGVlbEV2ZW50PWZ1bmN0aW9uKEEseSl7dGhpcy5fd2hlZWxGaWx0ZXIoeSkmJihBPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoQSksdGhpcy5faXNJbnNpZGVDb21wb25lbnQoQSkmJih5LnByZXZlbnREZWZhdWx0KCksdGhpcy56b29tKE1hdGgucG93KDIsKDAhPT15LmRlbHRhWT95LmRlbHRhWTp5LmRlbHRhWCkqKHkuZGVsdGFNb2RlP3guX1BJWEVMU19QRVJfTElORToxKSouMDAyKSxBKSx0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKSkpfTt4LnByb3RvdHlwZS5fY29uc3RyYWluZWRab29tPQpmdW5jdGlvbihBLHksdyl7cmV0dXJuIHEuY29uc3RyYWluZWRab29tKEEseSx3LHRoaXMubWluRG9tYWluRXh0ZW50KEEpLHRoaXMubWF4RG9tYWluRXh0ZW50KEEpLHRoaXMubWluRG9tYWluVmFsdWUoQSksdGhpcy5tYXhEb21haW5WYWx1ZShBKSl9O3gucHJvdG90eXBlLl9jb25zdHJhaW5lZFRyYW5zbGF0aW9uPWZ1bmN0aW9uKEEseSl7cmV0dXJuIHEuY29uc3RyYWluZWRUcmFuc2xhdGlvbihBLHksdGhpcy5taW5Eb21haW5WYWx1ZShBKSx0aGlzLm1heERvbWFpblZhbHVlKEEpKX07eC5wcm90b3R5cGUuX3NldHVwRHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7dmFyIEE9dGhpczt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uY29uc3RyYWluZWRUb0NvbXBvbmVudCgpO3ZhciB5O3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydChmdW5jdGlvbigpe3JldHVybiB5PW51bGx9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKGZ1bmN0aW9uKHcsQyl7Mjw9QS5fdG91Y2hJZHMuc2l6ZSgpfHwKKEEucGFuKHt4OihudWxsPT15P3cueDp5LngpLUMueCx5OihudWxsPT15P3cueTp5LnkpLUMueX0pLHk9Qyl9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKGZ1bmN0aW9uKCl7cmV0dXJuIEEuX3BhbkVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9KX07eC5wcm90b3R5cGUuX25vbkxpbmVhclNjYWxlV2l0aEV4dGVudHM9ZnVuY3Rpb24oQSl7cmV0dXJuIG51bGwhPXRoaXMubWluRG9tYWluRXh0ZW50KEEpJiZudWxsIT10aGlzLm1heERvbWFpbkV4dGVudChBKSYmIShBIGluc3RhbmNlb2YgcC5MaW5lYXIpJiYhKEEgaW5zdGFuY2VvZiBwLlRpbWUpfTt4LnByb3RvdHlwZS54U2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEE9W107dGhpcy5feFNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHkpe0EucHVzaCh5KX0pO3JldHVybiBBfTt4LnByb3RvdHlwZS55U2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEE9W107dGhpcy5feVNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHkpe0EucHVzaCh5KX0pOwpyZXR1cm4gQX07eC5wcm90b3R5cGUuYWRkWFNjYWxlPWZ1bmN0aW9uKEEpe3RoaXMuX3hTY2FsZXMuYWRkKEEpfTt4LnByb3RvdHlwZS5yZW1vdmVYU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feFNjYWxlcy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWF4RG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5hZGRZU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feVNjYWxlcy5hZGQoQSl9O3gucHJvdG90eXBlLnJlbW92ZVlTY2FsZT1mdW5jdGlvbihBKXt0aGlzLl95U2NhbGVzLmRlbGV0ZShBKTt0aGlzLl9taW5Eb21haW5FeHRlbnRzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5FeHRlbnRzLmRlbGV0ZShBKTt0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKEEpO3RoaXMuX21heERvbWFpblZhbHVlcy5kZWxldGUoQSk7CnJldHVybiB0aGlzfTt4LnByb3RvdHlwZS5taW5Eb21haW5FeHRlbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX21pbkRvbWFpbkV4dGVudHMuZ2V0KEEpfTt4LnByb3RvdHlwZS5tYXhEb21haW5FeHRlbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX21heERvbWFpbkV4dGVudHMuZ2V0KEEpfTt4LnByb3RvdHlwZS5taW5Eb21haW5WYWx1ZT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21pbkRvbWFpblZhbHVlcy5nZXQoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLnNldChBLHkpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5tYXhEb21haW5WYWx1ZT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21heERvbWFpblZhbHVlcy5nZXQoQSk7dGhpcy5fbWF4RG9tYWluVmFsdWVzLnNldChBLHkpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5zZXRNaW5NYXhEb21haW5WYWx1ZXNUbz1mdW5jdGlvbihBKXt0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKEEpOwp0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpO3ZhciB5PUEuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSx3PXlbMV07dGhpcy5taW5Eb21haW5WYWx1ZShBLHlbMF0pO3RoaXMubWF4RG9tYWluVmFsdWUoQSx3KTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUub25QYW5FbmQ9ZnVuY3Rpb24oQSl7dGhpcy5fcGFuRW5kQ2FsbGJhY2tzLmFkZChBKX07eC5wcm90b3R5cGUub2ZmUGFuRW5kPWZ1bmN0aW9uKEEpe3RoaXMuX3BhbkVuZENhbGxiYWNrcy5kZWxldGUoQSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLm9uWm9vbUVuZD1mdW5jdGlvbihBKXt0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmFkZChBKX07eC5wcm90b3R5cGUub2ZmWm9vbUVuZD1mdW5jdGlvbihBKXt0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUub25QYW5ab29tVXBkYXRlPWZ1bmN0aW9uKEEpe3RoaXMuX3Bhblpvb21VcGRhdGVDYWxsYmFja3MuYWRkKEEpOwpyZXR1cm4gdGhpc307eC5wcm90b3R5cGUub2ZmUGFuWm9vbVVwZGF0ZT1mdW5jdGlvbihBKXt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307cmV0dXJuIHh9KGQuSW50ZXJhY3Rpb24pO2guX1BJWEVMU19QRVJfTElORT0xMjA7Zi5QYW5ab29tPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDEzKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49bnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO24uX292ZXJDb21wb25lbnQ9ITE7bi5fcG9pbnRlckVudGVyQ2FsbGJhY2tzPQpuZXcgbC5DYWxsYmFja1NldDtuLl9wb2ludGVyTW92ZUNhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9wb2ludGVyRXhpdENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9tb3VzZU1vdmVDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVNb3VzZUV2ZW50KHEsdSl9O24uX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX2hhbmRsZVRvdWNoRXZlbnQodVtxWzBdXSx4KX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fbW91c2VEaXNwYXRjaGVyPXQuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj10LlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX07bS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX2hhbmRsZU1vdXNlRXZlbnQ9ZnVuY3Rpb24obixxKXtxPXRoaXMuX21vdXNlRGlzcGF0Y2hlci5ldmVudEluc2lkZSh0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLHEpO3RoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChuLHEpfTttLnByb3RvdHlwZS5faGFuZGxlVG91Y2hFdmVudD1mdW5jdGlvbihuLHEpe3E9dGhpcy5fdG91Y2hEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sCnEpO3RoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChuLHEpfTttLnByb3RvdHlwZS5faGFuZGxlUG9pbnRlckV2ZW50PWZ1bmN0aW9uKG4scSl7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3ZhciB1PXRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pO3UmJnE/KHRoaXMuX292ZXJDb21wb25lbnR8fHRoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4pLHRoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobikpOnRoaXMuX292ZXJDb21wb25lbnQmJnRoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3Mobik7dGhpcy5fb3ZlckNvbXBvbmVudD11JiZxfTttLnByb3RvdHlwZS5vblBvaW50ZXJFbnRlcj1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuYWRkKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZQb2ludGVyRW50ZXI9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmRlbGV0ZShuKTsKcmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uUG9pbnRlck1vdmU9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZQb2ludGVyTW92ZT1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uUG9pbnRlckV4aXQ9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZQb2ludGVyRXhpdD1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O3JldHVybiBtfShoKDE1KS5JbnRlcmFjdGlvbik7Zi5Qb2ludGVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDIwKTtmLm1lbVRodW5rPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGw9MDtsPGFyZ3VtZW50cy5sZW5ndGg7bCsrKXRbbF09YXJndW1lbnRzW2xdO3ZhciBwPXQuc2xpY2UoMCwKLTEpLG09ay5tZW1vaXplKHRbdC5sZW5ndGgtMV0pO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscT1wLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gdS5hcHBseShuKX0pO3JldHVybiBtLmFwcGx5KHZvaWQgMCxxKX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCg0OSk7Zi5tZW1vaXplPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtmb3IodmFyIHU9W10seD0wO3g8YXJndW1lbnRzLmxlbmd0aDt4KyspdVt4XT1hcmd1bWVudHNbeF07aWYobilyZXR1cm4gbTt4PWsuc2lnbkFycmF5KHUpO3ZvaWQgMD09PXB8fHAuaXNEaWZmZXJlbnQoeCk/KHEmJmNvbnNvbGUubG9nKCJjYWNoZSBtaXNzISBjb21wdXRpbmciKSxwPXgsbT10LmFwcGx5KHRoaXMsdSkpOnEmJmNvbnNvbGUubG9nKCJjYWNoZSBoaXQhIik7cmV0dXJuIG19dmFyIHA9dm9pZCAwLG0sbj0hMSxxPSExO2wuZG9Mb2NrZWQ9ZnVuY3Rpb24odSl7aWYobil0aHJvdyBFcnJvcigiTG9ja2luZyBhbiBhbHJlYWR5IGxvY2tlZCBtZW1vaXplIGZ1bmN0aW9uISIpOwpuPSEwO3U9dS5hcHBseSh0aGlzKTtuPSExO3JldHVybiB1fTtsLmxvZ1BlcmZvcm1hbmNlPWZ1bmN0aW9uKHUpe3ZvaWQgMD09PXUmJih1PSEwKTtxPXU7cmV0dXJuIHRoaXN9O3JldHVybiBsfX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMyksbD1oKDApLHA9aCgyNyksbT1oKDIpO2Q9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSh1KXt2b2lkIDA9PT11JiYodT0idmVydGljYWwiKTt1PW4uY2FsbCh0aGlzLHUpfHx0aGlzO3UuX2NsdXN0ZXJPZmZzZXRzPW5ldyBsLk1hcDtyZXR1cm4gdX1rKHEsbik7cS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPQpmdW5jdGlvbigpe2Z1bmN0aW9uIHUoKXtyZXR1cm4geS5yYW5nZUJhbmQoKX12YXIgeD10aGlzLEE9bi5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcykseT10aGlzLl9tYWtlSW5uZXJTY2FsZSgpO0Eud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD91OkEud2lkdGg7QS5oZWlnaHQ9dGhpcy5faXNWZXJ0aWNhbD9BLmhlaWdodDp1O3ZhciB3PUEueCxDPUEueTtBLng9dGhpcy5faXNWZXJ0aWNhbD9mdW5jdGlvbihHLEQsQil7cmV0dXJuIHcoRyxELEIpK3guX2NsdXN0ZXJPZmZzZXRzLmdldChCKX06ZnVuY3Rpb24oRyxELEIpe3JldHVybiB3KEcsRCxCKX07QS55PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24oRyxELEIpe3JldHVybiBDKEcsRCxCKX06ZnVuY3Rpb24oRyxELEIpe3JldHVybiBDKEcsRCxCKSt4Ll9jbHVzdGVyT2Zmc2V0cy5nZXQoQil9O3JldHVybiBBfTtxLnByb3RvdHlwZS5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHU9CnRoaXMseD10aGlzLl9tYWtlSW5uZXJTY2FsZSgpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEEseSl7cmV0dXJuIHUuX2NsdXN0ZXJPZmZzZXRzLnNldChBLHguc2NhbGUoU3RyaW5nKHkpKS14LnJhbmdlQmFuZCgpLzIpfSl9O3EucHJvdG90eXBlLl9tYWtlSW5uZXJTY2FsZT1mdW5jdGlvbigpe3ZhciB1PW5ldyB0LkNhdGVnb3J5O3UuZG9tYWluKHRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oQSx5KXtyZXR1cm4gU3RyaW5nKHkpfSkpO3ZhciB4PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5hdHRyKHAuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpO3UucmFuZ2UoWzAseChudWxsLDAsbnVsbCldKTtyZXR1cm4gdX07cS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDbHVzdGVyUG9zaXRpb24oKTtyZXR1cm4gbi5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKX07cmV0dXJuIHF9KHAuQmFyKTtmLkNsdXN0ZXJlZEJhcj0KZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihDLEcpe2Z1bmN0aW9uIEQoKXt0aGlzLmNvbnN0cnVjdG9yPUN9Zm9yKHZhciBCIGluIEcpRy5oYXNPd25Qcm9wZXJ0eShCKSYmKENbQl09R1tCXSk7Qy5wcm90b3R5cGU9bnVsbD09PUc/T2JqZWN0LmNyZWF0ZShHKTooRC5wcm90b3R5cGU9Ry5wcm90b3R5cGUsbmV3IEQpfSx0PWgoMSksbD1oKDUpLHA9aCg3KSxtPWgoOCksbj1oKDMpLHE9aCgwKSx1PWgoNDQpLHg9aCg0NSksQT1oKDYpLHk9aCgzNSksdz1oKDIpO2Q9ZnVuY3Rpb24oQyl7ZnVuY3Rpb24gRygpe3ZhciBEPUMuY2FsbCh0aGlzKXx8dGhpcztELl9zdGFydEFuZ2xlPTA7RC5fZW5kQW5nbGU9MipNYXRoLlBJO0QuX2xhYmVsRm9ybWF0dGVyPW0uaWRlbnRpdHkoKTtELl9sYWJlbHNFbmFibGVkPSExO0QuaW5uZXJSYWRpdXMoMCk7RC5vdXRlclJhZGl1cyhmdW5jdGlvbigpe3ZhciBCPUQuX3BpZUNlbnRlcigpO3JldHVybiBNYXRoLm1pbihNYXRoLm1heChELndpZHRoKCktCkIueCxCLngpLE1hdGgubWF4KEQuaGVpZ2h0KCktQi55LEIueSkpfSk7RC5hZGRDbGFzcygicGllLXBsb3QiKTtELmF0dHIoImZpbGwiLGZ1bmN0aW9uKEIsSSl7cmV0dXJuIFN0cmluZyhJKX0sbmV3IG4uQ29sb3IpO0QuX3N0cm9rZURyYXdlcnM9bmV3IHEuTWFwO3JldHVybiBEfWsoRyxDKTtHLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgRD10aGlzO0MucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3N0cm9rZURyYXdlcnMuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gQi5hdHRhY2hUbyhELl9yZW5kZXJBcmVhKX0pfTtHLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKEQsQixJKXtDLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxELEIsSSk7RD10aGlzLl9waWVDZW50ZXIoKTt0aGlzLl9yZW5kZXJBcmVhLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QueCsiLCIrRC55KyIpIik7RD1NYXRoLm1pbihNYXRoLm1heCh0aGlzLndpZHRoKCktCkQueCxELngpLE1hdGgubWF4KHRoaXMuaGVpZ2h0KCktRC55LEQueSkpO251bGwhPXRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZSYmdGhpcy5pbm5lclJhZGl1cygpLnNjYWxlLnJhbmdlKFswLERdKTtudWxsIT10aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUmJnRoaXMub3V0ZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxEXSk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsRCl9O0cucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEQpe2lmKDE9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBxLldpbmRvdy53YXJuKCJPbmx5IG9uZSBkYXRhc2V0IGlzIHN1cHBvcnRlZCBpbiBQaWUgcGxvdHMiKSx0aGlzO3RoaXMuX3VwZGF0ZVBpZUFuZ2xlcygpO3ZhciBCPW5ldyB4LkFyY091dGxpbmVTVkdEcmF3ZXI7dGhpcy5faXNTZXR1cCYmQi5hdHRhY2hUbyh0aGlzLl9yZW5kZXJBcmVhKTsKdGhpcy5fc3Ryb2tlRHJhd2Vycy5zZXQoRCxCKTtDLnByb3RvdHlwZS5fYWRkRGF0YXNldC5jYWxsKHRoaXMsRCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUucmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsRCl9O0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsRCk7dGhpcy5fc3Ryb2tlRHJhd2Vycy5nZXQoRCkucmVtb3ZlKCl9O0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxEKTt0aGlzLl9zdGFydEFuZ2xlcz1bXTt0aGlzLl9lbmRBbmdsZXM9W107cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpczt2b2lkIDA9PT1EJiYoRD10aGlzLmRhdGFzZXRzKCkpO3ZhciBJPUMucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLApEKS5ub2RlcygpO0QuZm9yRWFjaChmdW5jdGlvbihOKXtOPUIuX3N0cm9rZURyYXdlcnMuZ2V0KE4pO251bGwhPU4mJkkucHVzaC5hcHBseShJLE4uZ2V0VmlzdWFsUHJpbWl0aXZlcygpKX0pO3JldHVybiB0LnNlbGVjdEFsbChJKX07Ry5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe0MucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpfTtHLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LkFyY1NWR0RyYXdlcn0sZnVuY3Rpb24oKXt5Lndhcm4oImNhbnZhcyByZW5kZXJlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFBpZSBQbG90ISIpO3JldHVybiBudWxsfSl9O0cucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7dm9pZCAwPT09RCYmKEQ9dGhpcy5kYXRhc2V0cygpKTsKcmV0dXJuIEMucHJvdG90eXBlLmVudGl0aWVzLmNhbGwodGhpcyxEKS5tYXAoZnVuY3Rpb24oSSl7SS5wb3NpdGlvbi54Kz1CLndpZHRoKCkvMjtJLnBvc2l0aW9uLnkrPUIuaGVpZ2h0KCkvMjt2YXIgTj10LnNlbGVjdChCLl9zdHJva2VEcmF3ZXJzLmdldChJLmRhdGFzZXQpLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgoSS5pbmRleCkpO0kuc3Ryb2tlU2VsZWN0aW9uPU47cmV0dXJuIEl9KX07Ry5wcm90b3R5cGUuc2VjdG9yVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRy5fU0VDVE9SX1ZBTFVFX0tFWSl9O0cucHJvdG90eXBlLmlubmVyUmFkaXVzPWZ1bmN0aW9uKEQsQil7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRy5fSU5ORVJfUkFESVVTX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KEcuX0lOTkVSX1JBRElVU19LRVksRCxCKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5vdXRlclJhZGl1cz0KZnVuY3Rpb24oRCxCKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChHLl9PVVRFUl9SQURJVVNfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkoRy5fT1VURVJfUkFESVVTX0tFWSxELEIpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnN0YXJ0QW5nbGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fc3RhcnRBbmdsZTt0aGlzLl9zdGFydEFuZ2xlPUQ7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuZW5kQW5nbGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fZW5kQW5nbGU7dGhpcy5fZW5kQW5nbGU9RDt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5sYWJlbHNFbmFibGVkPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2xhYmVsc0VuYWJsZWQ7CnRoaXMuX2xhYmVsc0VuYWJsZWQ9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5sYWJlbEZvcm1hdHRlcj1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9sYWJlbEZvcm1hdHRlcjt0aGlzLl9sYWJlbEZvcm1hdHRlcj1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpcy53aWR0aCgpLzIsST10aGlzLmhlaWdodCgpLzI7RD10aGlzLl9zbGljZUluZGV4Rm9yUG9pbnQoe3g6RC54LUIseTpELnktSX0pO3JldHVybiBudWxsPT1EP1tdOlt0aGlzLmVudGl0aWVzKClbRF1dfTtHLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcyxCPUMucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKSxJPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKSxOPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5vdXRlclJhZGl1cygpKTsKQi5kPWZ1bmN0aW9uKE8sSCxLKXtyZXR1cm4gdC5hcmMoKS5pbm5lclJhZGl1cyhJKE8sSCxLKSkub3V0ZXJSYWRpdXMoTihPLEgsSykpLnN0YXJ0QW5nbGUoRC5fc3RhcnRBbmdsZXNbSF0pLmVuZEFuZ2xlKEQuX2VuZEFuZ2xlc1tIXSkoTyxIKX07cmV0dXJuIEJ9O0cucHJvdG90eXBlLl91cGRhdGVQaWVBbmdsZXM9ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLnNlY3RvclZhbHVlKCkmJjAhPT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXt2YXIgRD13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSksQj10aGlzLmRhdGFzZXRzKClbMF0sST10aGlzLl9nZXREYXRhVG9EcmF3KCkuZ2V0KEIpO0k9dC5waWUoKS5zb3J0KG51bGwpLnN0YXJ0QW5nbGUodGhpcy5fc3RhcnRBbmdsZSkuZW5kQW5nbGUodGhpcy5fZW5kQW5nbGUpLnZhbHVlKGZ1bmN0aW9uKE4sTyl7cmV0dXJuIEQoTixPLEIpfSkoSSk7dGhpcy5fc3RhcnRBbmdsZXM9SS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4uc3RhcnRBbmdsZX0pOwp0aGlzLl9lbmRBbmdsZXM9SS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4uZW5kQW5nbGV9KX19O0cucHJvdG90eXBlLl9waWVDZW50ZXI9ZnVuY3Rpb24oKXt2YXIgRD10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX3N0YXJ0QW5nbGU6dGhpcy5fZW5kQW5nbGUsQj10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX2VuZEFuZ2xlOnRoaXMuX3N0YXJ0QW5nbGUsST1NYXRoLnNpbihEKTtEPU1hdGguY29zKEQpO3ZhciBOPU1hdGguc2luKEIpO0I9TWF0aC5jb3MoQik7dmFyIE87aWYoMDw9SSYmMDw9TilpZigwPD1EJiYwPD1CKXt2YXIgSD1EO3ZhciBLPU89MDt2YXIgTT1OfWVsc2UgMD5EJiYwPkI/KEg9MCxPPS1CLEs9MCxNPUkpOjA8PUQmJjA+Qj8oSD1ELE89LUIsSz0wLE09SSk6MD5EJiYwPD1CJiYoSz1PPUg9MSxNPU1hdGgubWF4KEksTikpO2Vsc2UgMDw9SSYmMD5OPzA8PUQmJjA8PUI/KEg9TWF0aC5tYXgoRCxCKSxNPUs9Tz0xKTowPkQmJgowPkI/KEg9MCxPPTEsSz0tTixNPUkpOjA8PUQmJjA+Qj8oSD1ELE89MSxLPS1OLE09MSk6MD5EJiYwPD1CJiYoSD1CLEs9Tz0xLE09SSk6MD5JJiYwPD1OPzA8PUQmJjA8PUI/KEg9MSxPPTAsSz0tSSxNPU4pOjA+RCYmMD5CPyhIPTEsTz1NYXRoLm1heCgtRCwtQiksTT1LPTEpOjA8PUQmJjA+Qj8oSD0xLE89LUIsSz0tSSxNPTEpOjA+RCYmMDw9QiYmKEg9MSxPPS1ELEs9MSxNPU4pOjA+SSYmMD5OJiYoMDw9RCYmMDw9Qj8oSD1CLE89MCxLPS1JLE09MCk6MD5EJiYwPkI/KEg9MCxPPS1ELEs9LU4sTT0wKTowPD1EJiYwPkI/KE89SD0xLEs9TWF0aC5tYXgoRCwtQiksTT0xKTowPkQmJjA8PUImJihIPUIsTz0tRCxLPTEsTT0wKSk7cmV0dXJue3g6MD09SytNPzA6Sy8oSytNKSp0aGlzLndpZHRoKCkseTowPT1IK08/MDpILyhIK08pKnRoaXMuaGVpZ2h0KCl9fTtHLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBEPUMucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyk7CmlmKDA9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBEO3ZhciBCPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zZWN0b3JWYWx1ZSgpKSxJPXRoaXMuZGF0YXNldHMoKVswXSxOPUQuZ2V0KEkpLmZpbHRlcihmdW5jdGlvbihPLEgpe3JldHVybiBHLl9pc1ZhbGlkRGF0YShCKE8sSCxJKSl9KTtELnNldChJLE4pO3JldHVybiBEfTtHLl9pc1ZhbGlkRGF0YT1mdW5jdGlvbihEKXtyZXR1cm4gcS5NYXRoLmlzVmFsaWROdW1iZXIoRCkmJjA8PUR9O0cucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKEQsQixJKXt2YXIgTj13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSk7aWYoIUcuX2lzVmFsaWREYXRhKE4oRCxCLEkpKSlyZXR1cm57eDpOYU4seTpOYU59O3ZhciBPPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKShELEIsSSk7RD13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMub3V0ZXJSYWRpdXMoKSkoRCwKQixJKTtPPShPK0QpLzI7RD10LnBpZSgpLnNvcnQobnVsbCkudmFsdWUoZnVuY3Rpb24oSCxLKXtIPU4oSCxLLEkpO3JldHVybiBHLl9pc1ZhbGlkRGF0YShIKT9IOjB9KS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKShJLmRhdGEoKSk7Qj0oRFtCXS5zdGFydEFuZ2xlK0RbQl0uZW5kQW5nbGUpLzI7cmV0dXJue3g6TypNYXRoLnNpbihCKSx5Oi1PKk1hdGguY29zKEIpfX07Ry5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihEKXt2YXIgQj10aGlzO3RoaXMuX3JlbmRlckFyZWEuc2VsZWN0KCIubGFiZWwtYXJlYSIpLnJlbW92ZSgpO3RoaXMuX2xhYmVsc0VuYWJsZWQmJnEuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gQi5fZHJhd0xhYmVscygpfSxEKTt2YXIgST10aGlzLl9nZW5lcmF0ZVN0cm9rZURyYXdTdGVwcygpLE49dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKE8pe3ZhciBIPQp3LlBsb3QuYXBwbHlEcmF3U3RlcHMoSSxPKTtCLl9zdHJva2VEcmF3ZXJzLmdldChPKS5kcmF3KE4uZ2V0KE8pLEgpfSl9O0cucHJvdG90eXBlLl9nZW5lcmF0ZVN0cm9rZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOm5ldyBwLk51bGx9XX07Ry5wcm90b3R5cGUuX3NsaWNlSW5kZXhGb3JQb2ludD1mdW5jdGlvbihEKXt2YXIgQj1NYXRoLnNxcnQoTWF0aC5wb3coRC54LDIpK01hdGgucG93KEQueSwyKSksST1NYXRoLmFjb3MoLUQueS9CKTswPkQueCYmKEk9MipNYXRoLlBJLUkpO2ZvcihEPTA7RDx0aGlzLl9zdGFydEFuZ2xlcy5sZW5ndGg7RCsrKWlmKHRoaXMuX3N0YXJ0QW5nbGVzW0RdPEkmJnRoaXMuX2VuZEFuZ2xlc1tEXT5JKXt2YXIgTj1EO2JyZWFrfWlmKHZvaWQgMCE9PU4pe0Q9dGhpcy5kYXRhc2V0cygpWzBdO3ZhciBPPUQuZGF0YSgpW05dO0k9dGhpcy5pbm5lclJhZGl1cygpLmFjY2Vzc29yKE8sCk4sRCk7RD10aGlzLm91dGVyUmFkaXVzKCkuYWNjZXNzb3IoTyxOLEQpO2lmKEI+SSYmQjxEKXJldHVybiBOfXJldHVybiBudWxsfTtHLnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxJPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLE49bmV3IGwuU3ZnQ29udGV4dChJLm5vZGUoKSksTz1uZXcgbC5DYWNoZU1lYXN1cmVyKE4pLEg9bmV3IGwuV3JpdGVyKE8sTiksSz10aGlzLmRhdGFzZXRzKClbMF07dGhpcy5fZ2V0RGF0YVRvRHJhdygpLmdldChLKS5mb3JFYWNoKGZ1bmN0aW9uKE0sTCl7dmFyIFE9RC5zZWN0b3JWYWx1ZSgpLmFjY2Vzc29yKE0sTCxLKTtpZihxLk1hdGguaXNWYWxpZE51bWJlcihRKSl7UT1ELl9sYWJlbEZvcm1hdHRlcihRLE0sTCxLKTt2YXIgVD1PLm1lYXN1cmUoUSksWD0oRC5fZW5kQW5nbGVzW0xdK0QuX3N0YXJ0QW5nbGVzW0xdKS8KMixhYT1ELm91dGVyUmFkaXVzKCkuYWNjZXNzb3IoTSxMLEspO0Qub3V0ZXJSYWRpdXMoKS5zY2FsZSYmKGFhPUQub3V0ZXJSYWRpdXMoKS5zY2FsZS5zY2FsZShhYSkpO3ZhciBsYT1ELmlubmVyUmFkaXVzKCkuYWNjZXNzb3IoTSxMLEspO0QuaW5uZXJSYWRpdXMoKS5zY2FsZSYmKGxhPUQuaW5uZXJSYWRpdXMoKS5zY2FsZS5zY2FsZShsYSkpO2xhPShhYStsYSkvMjthYT1NYXRoLnNpbihYKSpsYS1ULndpZHRoLzI7bGE9LU1hdGguY29zKFgpKmxhLVQuaGVpZ2h0LzI7dmFyIFo9W3t4OmFhLHk6bGF9LHt4OmFhLHk6bGErVC5oZWlnaHR9LHt4OmFhK1Qud2lkdGgseTpsYX0se3g6YWErVC53aWR0aCx5OmxhK1QuaGVpZ2h0fV07KFg9Wi5ldmVyeShmdW5jdGlvbihiYSl7cmV0dXJuIE1hdGguYWJzKGJhLngpPD1ELndpZHRoKCkvMiYmTWF0aC5hYnMoYmEueSk8PUQuaGVpZ2h0KCkvMn0pKSYmKFg9Wi5tYXAoZnVuY3Rpb24oYmEpe3JldHVybiBELl9zbGljZUluZGV4Rm9yUG9pbnQoYmEpfSkuZXZlcnkoZnVuY3Rpb24oYmEpe3JldHVybiBiYT09PQpMfSkpO009Qi5maWxsKE0sTCxLKTtNPTEuNipxLkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsTSk8cS5Db2xvci5jb250cmFzdCgiYmxhY2siLE0pO2FhPUkuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrYWErIiwiK2xhKyIpIik7YWEuY2xhc3NlZChNPyJkYXJrLWxhYmVsIjoibGlnaHQtbGFiZWwiLCEwKTthYS5zdHlsZSgidmlzaWJpbGl0eSIsWD8iaW5oZXJpdCI6ImhpZGRlbiIpO0gud3JpdGUoUSxULndpZHRoLFQuaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxhYS5ub2RlKCkpfX0pfTtyZXR1cm4gR30ody5QbG90KTtkLl9JTk5FUl9SQURJVVNfS0VZPSJpbm5lci1yYWRpdXMiO2QuX09VVEVSX1JBRElVU19LRVk9Im91dGVyLXJhZGl1cyI7ZC5fU0VDVE9SX1ZBTFVFX0tFWT0ic2VjdG9yLXZhbHVlIjtmLlBpZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHksdyl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9Cnl9Zm9yKHZhciBHIGluIHcpdy5oYXNPd25Qcm9wZXJ0eShHKSYmKHlbR109d1tHXSk7eS5wcm90b3R5cGU9bnVsbD09PXc/T2JqZWN0LmNyZWF0ZSh3KTooQy5wcm90b3R5cGU9dy5wcm90b3R5cGUsbmV3IEMpfSx0PWgoMSksbD1oKDUpLHA9aCg3KSxtPWgoMTQpLG49aCg2KSxxPWgoMzQpLHU9aCgzKSx4PWgoMCksQT1oKDIpO2Q9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24gdygpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLl9sYWJlbHNFbmFibGVkPSExO0MuX2xhYmVsPW51bGw7Qy5hbmltYXRvcigicmVjdGFuZ2xlcyIsbmV3IHAuTnVsbCk7Qy5hZGRDbGFzcygicmVjdGFuZ2xlLXBsb3QiKTtDLmF0dHIoImZpbGwiLChuZXcgdS5Db2xvcikucmFuZ2UoKVswXSk7cmV0dXJuIEN9ayh3LHkpO3cucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHEuUmVjdGFuZ2xlU1ZHRHJhd2VyfSxmdW5jdGlvbihDKXtyZXR1cm4gbmV3IG0uUmVjdGFuZ2xlQ2FudmFzRHJhd2VyKEMpfSl9Owp3LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9eS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxCPUdbdy5fWDJfS0VZXSxJPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLE49R1t3Ll9ZMl9LRVldLE89dGhpcy54KCkuc2NhbGUsSD10aGlzLnkoKS5zY2FsZTtudWxsIT1CPyhHLndpZHRoPWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTWF0aC5hYnMoQihLLE0sTCktRChLLE0sTCkpfSxHLng9ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBNYXRoLm1pbihCKEssTSxMKSxEKEssTSxMKSl9KTooRy53aWR0aD1mdW5jdGlvbigpe3JldHVybiBDLl9yZWN0YW5nbGVXaWR0aChPKX0sRy54PWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gRChLLE0sTCktLjUqRy53aWR0aChLLE0sTCl9KTtudWxsIT1OPyhHLmhlaWdodD1mdW5jdGlvbihLLApNLEwpe3JldHVybiBNYXRoLmFicyhOKEssTSxMKS1JKEssTSxMKSl9LEcueT1mdW5jdGlvbihLLE0sTCl7cmV0dXJuIE1hdGgubWF4KE4oSyxNLEwpLEkoSyxNLEwpKS1HLmhlaWdodChLLE0sTCl9KTooRy5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gQy5fcmVjdGFuZ2xlV2lkdGgoSCl9LEcueT1mdW5jdGlvbihLLE0sTCl7cmV0dXJuIEkoSyxNLEwpLS41KkcuaGVpZ2h0KEssTSxMKX0pO2RlbGV0ZSBHW3cuX1gyX0tFWV07ZGVsZXRlIEdbdy5fWTJfS0VZXTtyZXR1cm4gR307dy5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoInJlY3RhbmdsZXMiKX1dfTt3LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oQyl7cmV0dXJuIngyIj09PUM/eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywKIngiKToieTIiPT09Qz95LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ5Iik6eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcyxDKX07dy5wcm90b3R5cGUueD1mdW5jdGlvbihDLEcsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PUc/eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyxHLEQpO251bGwhPUcmJihEPShDPXRoaXMueDIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHcuX1gyX0tFWSxELEcsQy5wb3N0U2NhbGUpKTtHIGluc3RhbmNlb2YgdS5DYXRlZ29yeSYmRy5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS54Mj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9YMl9LRVkpfTt3LnByb3RvdHlwZS55PWZ1bmN0aW9uKEMsCkcsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PUc/eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyxHLEQpO251bGwhPUcmJihEPShDPXRoaXMueTIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHcuX1kyX0tFWSxELEcsQy5wb3N0U2NhbGUpKTtHIGluc3RhbmNlb2YgdS5DYXRlZ29yeSYmRy5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS55Mj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9ZMl9LRVkpfTt3LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3JldHVybiB0aGlzLmVudGl0aWVzKCkuZmlsdGVyKGZ1bmN0aW9uKEQpe3ZhciBCPUQuZGF0dW0sST1ELmluZGV4LE49RC5kYXRhc2V0O0Q9Ry54KEIsCkksTik7dmFyIE89Ry55KEIsSSxOKSxIPUcud2lkdGgoQixJLE4pO0I9Ry5oZWlnaHQoQixJLE4pO3JldHVybiBEPD1DLngmJkMueDw9RCtIJiZPPD1DLnkmJkMueTw9TytCfSl9O3cucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQyl7cmV0dXJuIHRoaXMuX2VudGl0eUJCb3goQy5kYXR1bSxDLmluZGV4LEMuZGF0YXNldCx0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSl9O3cucHJvdG90eXBlLl9lbnRpdHlCQm94PWZ1bmN0aW9uKEMsRyxELEIpe3JldHVybnt4OkIueChDLEcsRCkseTpCLnkoQyxHLEQpLHdpZHRoOkIud2lkdGgoQyxHLEQpLGhlaWdodDpCLmhlaWdodChDLEcsRCl9fTt3LnByb3RvdHlwZS5sYWJlbD1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9sYWJlbDt0aGlzLl9sYWJlbD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDsKdGhpcy5fbGFiZWxzRW5hYmxlZD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7bnVsbCE9dGhpcy54MigpJiYoQy54Mj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSkpO251bGwhPXRoaXMueTIoKSYmKEMueTI9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpKTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oQyxHLEQpe3ZhciBCPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEk9Qi54KEMsRyxEKSxOPUIueShDLEcsRCksTz1CLndpZHRoKEMsRyxEKTtDPUIuaGVpZ2h0KEMsRyxEKTtyZXR1cm57eDpJK08vMix5Ok4rQy8yfX07dy5wcm90b3R5cGUuX3JlY3RhbmdsZVdpZHRoPWZ1bmN0aW9uKEMpe2lmKEMgaW5zdGFuY2VvZiB1LkNhdGVnb3J5KXJldHVybiBDLnJhbmdlQmFuZCgpOwp2YXIgRz1DPT09dGhpcy54KCkuc2NhbGU/dGhpcy54KCkuYWNjZXNzb3I6dGhpcy55KCkuYWNjZXNzb3IsRD10LnNldCh4LkFycmF5LmZsYXR0ZW4odGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTi5kYXRhKCkubWFwKGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEcoTyxILE4pLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuK059KSxCPXguTWF0aC5taW4oRCwwKTtEPXguTWF0aC5tYXgoRCwwKTt2YXIgST1DLnNjYWxlKEIpO3JldHVybihDLnNjYWxlKEQpLUkpL01hdGguYWJzKEQtQil9O3cucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEM9bmV3IHguTWFwLEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oRCl7dmFyIEI9RC5kYXRhKCkubWFwKGZ1bmN0aW9uKEksTil7cmV0dXJuIHguTWF0aC5pc1ZhbGlkTnVtYmVyKEcueChJLE4sRCkpJiYKeC5NYXRoLmlzVmFsaWROdW1iZXIoRy55KEksTixEKSkmJnguTWF0aC5pc1ZhbGlkTnVtYmVyKEcud2lkdGgoSSxOLEQpKSYmeC5NYXRoLmlzVmFsaWROdW1iZXIoRy5oZWlnaHQoSSxOLEQpKT9JOm51bGx9KTtDLnNldChELEIpfSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdEFsbCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTt0aGlzLl9sYWJlbHNFbmFibGVkJiZudWxsIT10aGlzLmxhYmVsKCkmJnguV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gRy5fZHJhd0xhYmVscygpfSxDKX07dy5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQsQil7cmV0dXJuIEMuX2RyYXdMYWJlbChHLEQsQil9KX07dy5wcm90b3R5cGUuX2RyYXdMYWJlbD0KZnVuY3Rpb24oQyxHLEQpe3ZhciBCPXRoaXMsST10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxOPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLE89bmV3IGwuU3ZnQ29udGV4dChOLm5vZGUoKSksSD1uZXcgbC5DYWNoZU1lYXN1cmVyKE8pLEs9bmV3IGwuV3JpdGVyKEgsTyk7Tz10aGlzLngoKS5zY2FsZS5yYW5nZSgpO3ZhciBNPXRoaXMueSgpLnNjYWxlLnJhbmdlKCksTD1NYXRoLm1pbi5hcHBseShudWxsLE8pLFE9TWF0aC5tYXguYXBwbHkobnVsbCxPKSxUPU1hdGgubWluLmFwcGx5KG51bGwsTSksWD1NYXRoLm1heC5hcHBseShudWxsLE0pO0MuZ2V0KEcpLmZvckVhY2goZnVuY3Rpb24oYWEsbGEpe2lmKG51bGwhPWFhKXt2YXIgWj0iIitCLmxhYmVsKCkoYWEsbGEsRyksYmE9SC5tZWFzdXJlKFopLGVhPUkueChhYSxsYSxHKSxjYT1JLnkoYWEsbGEsRyksa2E9SS53aWR0aChhYSxsYSxHKSxZPUkuaGVpZ2h0KGFhLGxhLEcpOwpiYS5oZWlnaHQ8PVkmJmJhLndpZHRoPD1rYSYmKFk9KFktYmEuaGVpZ2h0KS8yLGVhKz0oa2EtYmEud2lkdGgpLzIsY2ErPVksa2E9e21pbjplYSxtYXg6ZWErYmEud2lkdGh9LFk9e21pbjpjYSxtYXg6Y2ErYmEuaGVpZ2h0fSxrYS5taW48THx8a2EubWF4PlF8fFkubWluPFR8fFkubWF4Plh8fEIuX292ZXJsYXlMYWJlbChrYSxZLGxhLEQsQyl8fChhYT1JLmZpbGwoYWEsbGEsRyksYWE9MS42KnguQ29sb3IuY29udHJhc3QoIndoaXRlIixhYSk8eC5Db2xvci5jb250cmFzdCgiYmxhY2siLGFhKSxlYT1OLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2VhKyIsIitjYSsiKSIpLGVhLmNsYXNzZWQoYWE/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApLEsud3JpdGUoWixiYS53aWR0aCxiYS5oZWlnaHQse3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciJ9LGVhLm5vZGUoKSkpKX19KX07dy5wcm90b3R5cGUuX292ZXJsYXlMYWJlbD1mdW5jdGlvbihDLApHLEQsQixJKXtmb3IodmFyIE49dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTz10aGlzLmRhdGFzZXRzKCksSD1CO0g8Ty5sZW5ndGg7SCsrKWZvcih2YXIgSz1PW0hdLE09SS5nZXQoSyksTD1IPT09Qj9EKzE6MDtMPE0ubGVuZ3RoO0wrKylpZih4LkRPTS5pbnRlcnNlY3RzQkJveChDLEcsdGhpcy5fZW50aXR5QkJveChNW0xdLEwsSyxOKSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiB3fShoKDE2KS5YWVBsb3QpO2QuX1gyX0tFWT0ieDIiO2QuX1kyX0tFWT0ieTIiO2YuUmVjdGFuZ2xlPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oeSx3KXtmdW5jdGlvbiBDKCl7dGhpcy5jb25zdHJ1Y3Rvcj15fWZvcih2YXIgRyBpbiB3KXcuaGFzT3duUHJvcGVydHkoRykmJih5W0ddPXdbR10pO3kucHJvdG90eXBlPW51bGw9PT13P09iamVjdC5jcmVhdGUodyk6KEMucHJvdG90eXBlPXcucHJvdG90eXBlLG5ldyBDKX0sdD1oKDMxKSwKbD1oKDYpLHA9aCg0OCksbT1oKDcpLG49aCgxNCkscT1oKDMpLHU9aCgwKSx4PWgoMTkpLEE9aCgyKTtkPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHcoKXt2YXIgQz15LmNhbGwodGhpcyl8fHRoaXM7Qy5hZGRDbGFzcygic2NhdHRlci1wbG90Iik7dmFyIEc9bmV3IG0uRWFzaW5nO0cuc3RhcnREZWxheSg1KTtHLnN0ZXBEdXJhdGlvbigyNTApO0cubWF4VG90YWxEdXJhdGlvbihBLlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0MuYW5pbWF0b3IoeC5BbmltYXRvci5NQUlOLEcpO0MuYXR0cigib3BhY2l0eSIsLjYpO0MuYXR0cigiZmlsbCIsKG5ldyBxLkNvbG9yKS5yYW5nZSgpWzBdKTtDLnNpemUoNik7dmFyIEQ9dC5jaXJjbGUoKTtDLnN5bWJvbChmdW5jdGlvbigpe3JldHVybiBEfSk7cmV0dXJuIEN9ayh3LHkpO3cucHJvdG90eXBlLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzPWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXM7cmV0dXJuIHkucHJvdG90eXBlLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzLmNhbGwodGhpcywKQykubWFwKGZ1bmN0aW9uKEQpe3ZhciBCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRy5zaXplKCkpKEQuZGF0dW0sRC5pbmRleCxELmRhdGFzZXQpO0QuZGlhbWV0ZXI9QjtyZXR1cm4gRH0pfTt3LnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXM7cmV0dXJuIG5ldyBsLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwLlN5bWJvbFNWR0RyYXdlcn0sZnVuY3Rpb24oRCl7cmV0dXJuIG5ldyBuLkNhbnZhc0RyYXdlcihELHAubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwKEMsZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnN5bWJvbCgpKX0sZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnNpemUoKSl9KSl9KX07dy5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbihDLEcpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHcuX1NJWkVfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkody5fU0laRV9LRVksCkMsRyk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHcuX1NZTUJPTF9LRVkpO3RoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KHcuX1NZTUJPTF9LRVkse2FjY2Vzc29yOkN9KTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgQz1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEQ9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKTtHLmQ9ZnVuY3Rpb24oQixJLE4pe3JldHVybiBEKEIsSSxOKSgwKShudWxsKX07Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6RyxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLlJFU0VUKX0pfUMucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLAphbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksRz1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxEPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpO0MueD1HO0MueT1EO0MudHJhbnNmb3JtPWZ1bmN0aW9uKEIsSSxOKXtyZXR1cm4idHJhbnNsYXRlKCIrRyhCLEksTikrIiwiK0QoQixJLE4pKyIpIn07Qy5kPXRoaXMuX2NvbnN0cnVjdFN5bWJvbEdlbmVyYXRvcigpO3JldHVybiBDfTt3LnByb3RvdHlwZS5fY29uc3RydWN0U3ltYm9sR2VuZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIEM9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKSxHPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpO3JldHVybiBmdW5jdGlvbihELEIsCkkpe3JldHVybiBDKEQsQixJKShHKEQsQixJKSkobnVsbCl9fTt3LnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKEMpe3JldHVybnt4OkMucG9zaXRpb24ueC1DLmRpYW1ldGVyLzIseTpDLnBvc2l0aW9uLnktQy5kaWFtZXRlci8yLHdpZHRoOkMuZGlhbWV0ZXIsaGVpZ2h0OkMuZGlhbWV0ZXJ9fTt3LnByb3RvdHlwZS5fZW50aXR5VmlzaWJsZU9uUGxvdD1mdW5jdGlvbihDLEcpe3ZhciBEPXttaW46Ry50b3BMZWZ0LngsbWF4OkcuYm90dG9tUmlnaHQueH07Rz17bWluOkcudG9wTGVmdC55LG1heDpHLmJvdHRvbVJpZ2h0Lnl9O0M9dGhpcy5fZW50aXR5Qm91bmRzKEMpO3JldHVybiB1LkRPTS5pbnRlcnNlY3RzQkJveChELEcsQyl9O3cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oQyl7dmFyIEc9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpOwpyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcihmdW5jdGlvbihJKXt2YXIgTj1JLmRhdHVtLE89SS5pbmRleCxIPUkuZGF0YXNldDtJPUcoTixPLEgpO3ZhciBLPUQoTixPLEgpO049QihOLE8sSCk7cmV0dXJuIEktTi8yPD1DLngmJkMueDw9SStOLzImJkstTi8yPD1DLnkmJkMueTw9SytOLzJ9KX07cmV0dXJuIHd9KGgoMTYpLlhZUGxvdCk7ZC5fU0laRV9LRVk9InNpemUiO2QuX1NZTUJPTF9LRVk9InN5bWJvbCI7Zi5TY2F0dGVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odSx4KXtmdW5jdGlvbiBBKCl7dGhpcy5jb25zdHJ1Y3Rvcj11fWZvcih2YXIgeSBpbiB4KXguaGFzT3duUHJvcGVydHkoeSkmJih1W3ldPXhbeV0pO3UucHJvdG90eXBlPW51bGw9PT14P09iamVjdC5jcmVhdGUoeCk6KEEucHJvdG90eXBlPXgucHJvdG90eXBlLG5ldyBBKX0sdD1oKDcpLGw9aCg2KSxwPWgoNDcpLG09aCgzKSxuPWgoMzUpLHE9aCgyKTsKZD1mdW5jdGlvbih1KXtmdW5jdGlvbiB4KCl7dmFyIEE9dS5jYWxsKHRoaXMpfHx0aGlzO0EuYWRkQ2xhc3MoInNlZ21lbnQtcGxvdCIpO0EuYXR0cigic3Ryb2tlIiwobmV3IG0uQ29sb3IpLnJhbmdlKClbMF0pO0EuYXR0cigic3Ryb2tlLXdpZHRoIiwiMnB4Iik7cmV0dXJuIEF9ayh4LHUpO3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHAuU2VnbWVudFNWR0RyYXdlcn0sZnVuY3Rpb24oKXtuLndhcm4oImNhbnZhcyByZW5kZXJlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFNlZ21lbnQgUGxvdCEiKTtyZXR1cm4gbnVsbH0pfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgdC5OdWxsfV19O3gucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT0KZnVuY3Rpb24oQSl7cmV0dXJuIngyIj09PUE/dS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieCIpOiJ5MiI9PT1BP3UucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsInkiKTp1LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLEEpfTt4LnByb3RvdHlwZS54PWZ1bmN0aW9uKEEseSl7aWYobnVsbD09QSlyZXR1cm4gdS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PXk/dS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQSk6KHUucHJvdG90eXBlLnguY2FsbCh0aGlzLEEseSksQT0oQT10aGlzLngyKCkpJiZBLmFjY2Vzc29yLG51bGwhPUEmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9YMl9LRVksQSx5KSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLngyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1gyX0tFWSl9O3gucHJvdG90eXBlLnk9ZnVuY3Rpb24oQSx5KXtpZihudWxsPT0KQSlyZXR1cm4gdS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PXk/dS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQSk6KHUucHJvdG90eXBlLnkuY2FsbCh0aGlzLEEseSksQT0oQT10aGlzLnkyKCkpJiZBLmFjY2Vzc29yLG51bGwhPUEmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9ZMl9LRVksQSx5KSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLnkyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1kyX0tFWSl9O3gucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQT11LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7QS54MT1xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTtBLngyPW51bGw9PXRoaXMueDIoKT9xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTpxLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSk7QS55MT1xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTsKQS55Mj1udWxsPT10aGlzLnkyKCk/cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk6cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpO3JldHVybiBBfTt4LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEEpe0E9dGhpcy5lbnRpdHlOZWFyZXN0KEEpO3JldHVybiBudWxsIT1BP1tBXTpbXX07eC5wcm90b3R5cGUuZW50aXRpZXNJbj1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpe3ZhciB3PXttaW46QS50b3BMZWZ0LngsbWF4OkEuYm90dG9tUmlnaHQueH07QT17bWluOkEudG9wTGVmdC55LG1heDpBLmJvdHRvbVJpZ2h0Lnl9fWVsc2Ugdz1BLEE9eTtyZXR1cm4gdGhpcy5fZW50aXRpZXNJbnRlcnNlY3RpbmcodyxBKX07eC5wcm90b3R5cGUuX2VudGl0aWVzSW50ZXJzZWN0aW5nPWZ1bmN0aW9uKEEseSl7dmFyIHc9dGhpcyxDPVtdLEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5lbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24oRCl7dy5fbGluZUludGVyc2VjdHNCb3goRCwKQSx5LEcpJiZDLnB1c2goRCl9KTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzQm94PWZ1bmN0aW9uKEEseSx3LEMpe3ZhciBHPXRoaXMsRD1DLngxKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpLEI9Qy54MihBLmRhdHVtLEEuaW5kZXgsQS5kYXRhc2V0KSxJPUMueTEoQS5kYXR1bSxBLmluZGV4LEEuZGF0YXNldCk7QT1DLnkyKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpO2lmKHkubWluPD1EJiZEPD15Lm1heCYmdy5taW48PUkmJkk8PXcubWF4fHx5Lm1pbjw9QiYmQjw9eS5tYXgmJncubWluPD1BJiZBPD13Lm1heClyZXR1cm4hMDt2YXIgTj17eDpELHk6SX0sTz17eDpCLHk6QX0sSD1be3g6eS5taW4seTp3Lm1pbn0se3g6eS5taW4seTp3Lm1heH0se3g6eS5tYXgseTp3Lm1heH0se3g6eS5tYXgseTp3Lm1pbn1dO3JldHVybiAwPEguZmlsdGVyKGZ1bmN0aW9uKEssTSl7cmV0dXJuIDAhPT1NP0cuX2xpbmVJbnRlcnNlY3RzU2VnbWVudChOLE8sSyxIW00tCjFdKSYmRy5fbGluZUludGVyc2VjdHNTZWdtZW50KEssSFtNLTFdLE4sTyk6ITF9KS5sZW5ndGh9O3gucHJvdG90eXBlLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQ9ZnVuY3Rpb24oQSx5LHcsQyl7ZnVuY3Rpb24gRyhELEIsSSl7cmV0dXJuKEIueC1ELngpKihJLnktQi55KS0oQi55LUQueSkqKEkueC1CLngpfXJldHVybiAwPkcoQSx5LHcpKkcoQSx5LEMpfTtyZXR1cm4geH0oaCgxNikuWFlQbG90KTtkLl9YMl9LRVk9IngyIjtkLl9ZMl9LRVk9InkyIjtmLlNlZ21lbnQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciBBIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShBKSYmKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KTooeC5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHgpfSx0PWgoMSksbD1oKDcpLHA9aCgyMCksbT0KaCgwKTtkPWgoNTApO3ZhciBuPWgoMik7aD1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KCl7dmFyIHg9cS5jYWxsKHRoaXMpfHx0aGlzO3guX3N0YWNraW5nUmVzdWx0PXAubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4geC5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiB4LngoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4geC55KCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHguX3N0YWNraW5nT3JkZXJ9LGZ1bmN0aW9uKEEseSx3LEMpe3JldHVybiBtLlN0YWNraW5nLnN0YWNrKEEseSx3LEMpfSk7eC5fc3RhY2tlZEV4dGVudD1wLm1lbVRodW5rKHguX3N0YWNraW5nUmVzdWx0LGZ1bmN0aW9uKCl7cmV0dXJuIHgueCgpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB4Ll9maWx0ZXJGb3JQcm9wZXJ0eSgieSIpfSxmdW5jdGlvbihBLHksdyl7cmV0dXJuIG0uU3RhY2tpbmcuc3RhY2tlZEV4dGVudChBLHksdyl9KTt4Ll9iYXNlbGluZVZhbHVlPTA7eC5fc3RhY2tpbmdPcmRlcj0KImJvdHRvbXVwIjt4LmFkZENsYXNzKCJzdGFja2VkLWFyZWEtcGxvdCIpO3guYXR0cigiZmlsbC1vcGFjaXR5IiwxKTt4Ll9iYXNlbGluZVZhbHVlUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm5beC5fYmFzZWxpbmVWYWx1ZV19O3guY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQoITEpO3JldHVybiB4fWsodSxxKTt1LnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbih4KXtyZXR1cm4gbnVsbD09eD9xLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMpOng/KG0uV2luZG93Lndhcm4oIldhcm5pbmc6IFN0YWNrZWQgQXJlYSBQbG90IGRvZXMgbm90IHN1cHBvcnQgY3JvcHBlZCByZW5kZXJpbmcuIiksdGhpcyk6cS5wcm90b3R5cGUuY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQuY2FsbCh0aGlzLHgpfTt1LnByb3RvdHlwZS5fZ2V0QW5pbWF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuTnVsbH07dS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CnRoaXMuX2Jhc2VsaW5lPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCEwKX07dS5wcm90b3R5cGUueD1mdW5jdGlvbih4LEEpe2lmKG51bGw9PXgpcmV0dXJuIHEucHJvdG90eXBlLnguY2FsbCh0aGlzKTtudWxsPT1BP3EucHJvdG90eXBlLnguY2FsbCh0aGlzLHgpOnEucHJvdG90eXBlLnguY2FsbCh0aGlzLHgsQSk7dGhpcy5fY2hlY2tTYW1lRG9tYWluKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnk9ZnVuY3Rpb24oeCxBKXtpZihudWxsPT14KXJldHVybiBxLnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09QT9xLnByb3RvdHlwZS55LmNhbGwodGhpcyx4KTpxLnByb3RvdHlwZS55LmNhbGwodGhpcyx4LEEpO3RoaXMuX2NoZWNrU2FtZURvbWFpbigpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS5zdGFja2luZ09yZGVyPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX3N0YWNraW5nT3JkZXI7dGhpcy5fc3RhY2tpbmdPcmRlcj0KeDt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiBxLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkLmNhbGwodGhpcyl9O3UucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLnkoKS5zY2FsZS5zY2FsZSh0aGlzLl9iYXNlbGluZVZhbHVlKTt4PXt4MTowLHkxOngseDI6dGhpcy53aWR0aCgpLHkyOnh9O3RoaXMuX2dldEFuaW1hdG9yKCJiYXNlbGluZSIpLmFuaW1hdGUodGhpcy5fYmFzZWxpbmUseCl9O3UucHJvdG90eXBlLl91cGRhdGVZU2NhbGU9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLnkoKTt4PXgmJnguc2NhbGU7bnVsbCE9eCYmKHguYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpLHguYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpKX07CnUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9jaGVja1NhbWVEb21haW4oKTtxLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbih4KXtyZXR1cm4ieSI9PT14P1t0aGlzLl9zdGFja2VkRXh0ZW50KCldOnEucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMseCl9O3UucHJvdG90eXBlLl9jaGVja1NhbWVEb21haW49ZnVuY3Rpb24oKXtpZih0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSl7dmFyIHg9dGhpcy5kYXRhc2V0cygpLEE9dGhpcy54KCkuYWNjZXNzb3IseT14Lm1hcChmdW5jdGlvbihDKXtyZXR1cm4gdC5zZXQoQy5kYXRhKCkubWFwKGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEEoRyxELEMpLnRvU3RyaW5nKCl9KSkudmFsdWVzKCl9KSx3PXUuX2RvbWFpbktleXMoeCxBKTt5LnNvbWUoZnVuY3Rpb24oQyl7cmV0dXJuIEMubGVuZ3RoIT09CncubGVuZ3RofSkmJm0uV2luZG93Lndhcm4oInRoZSBkb21haW5zIGFjcm9zcyB0aGUgZGF0YXNldHMgYXJlIG5vdCB0aGUgc2FtZS4gUGxvdCBtYXkgcHJvZHVjZSB1bmludGVuZGVkIGJlaGF2aW9yLiIpfX07dS5fZG9tYWluS2V5cz1mdW5jdGlvbih4LEEpe3ZhciB5PXQuc2V0KCk7eC5mb3JFYWNoKGZ1bmN0aW9uKHcpe3cuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oQyxHKXt5LmFkZChBKEMsRyx3KSl9KX0pO3JldHVybiB5LnZhbHVlcygpfTt1LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24geChELEIsSSl7cmV0dXJuIG0uU3RhY2tpbmcubm9ybWFsaXplS2V5KEMoRCxCLEkpKX12YXIgQT10aGlzLHk9cS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLHc9dGhpcy55KCkuYWNjZXNzb3IsQz10aGlzLngoKS5hY2Nlc3NvcixHPXRoaXMuX3N0YWNraW5nUmVzdWx0KCk7eS5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3Iobi5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksCmZ1bmN0aW9uKEQsQixJKXtyZXR1cm4gQS55KCkuc2NhbGUuc2NhbGUoK3coRCxCLEkpK0cuZ2V0KEkpLmdldCh4KEQsQixJKSkub2Zmc2V0KX0sZnVuY3Rpb24oRCxCLEkpe3JldHVybiBBLnkoKS5zY2FsZS5zY2FsZShHLmdldChJKS5nZXQoeChELEIsSSkpLm9mZnNldCl9KTtyZXR1cm4geX07dS5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oeCxBLHkpe3ZhciB3PXEucHJvdG90eXBlLl9waXhlbFBvaW50LmNhbGwodGhpcyx4LEEseSksQz10aGlzLngoKS5hY2Nlc3Nvcih4LEEseSk7eD10aGlzLnkoKS5hY2Nlc3Nvcih4LEEseSk7eT10aGlzLnkoKS5zY2FsZS5zY2FsZSgreCt0aGlzLl9zdGFja2luZ1Jlc3VsdCgpLmdldCh5KS5nZXQobS5TdGFja2luZy5ub3JtYWxpemVLZXkoQykpLm9mZnNldCk7cmV0dXJue3g6dy54LHl9fTtyZXR1cm4gdX0oZC5BcmVhKTtmLlN0YWNrZWRBcmVhPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odSwKeCl7ZnVuY3Rpb24gQSgpe3RoaXMuY29uc3RydWN0b3I9dX1mb3IodmFyIHkgaW4geCl4Lmhhc093blByb3BlcnR5KHkpJiYodVt5XT14W3ldKTt1LnByb3RvdHlwZT1udWxsPT09eD9PYmplY3QuY3JlYXRlKHgpOihBLnByb3RvdHlwZT14LnByb3RvdHlwZSxuZXcgQSl9LHQ9aCg1KSxsPWgoOCkscD1oKDIwKSxtPWgoMCksbj1oKDI3KSxxPWgoMik7ZD1mdW5jdGlvbih1KXtmdW5jdGlvbiB4KEEpe3ZvaWQgMD09PUEmJihBPSJ2ZXJ0aWNhbCIpO3ZhciB5PXUuY2FsbCh0aGlzLEEpfHx0aGlzO3kuX2V4dHJlbWFGb3JtYXR0ZXI9bC5pZGVudGl0eSgpO3kuX3N0YWNraW5nUmVzdWx0PXAubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4geS5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiB5LnBvc2l0aW9uKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkubGVuZ3RoKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuX3N0YWNraW5nT3JkZXJ9LGZ1bmN0aW9uKHcsCkMsRyxEKXtyZXR1cm4gbS5TdGFja2luZy5zdGFjayh3LEMsRyxEKX0pO3kuX3N0YWNrZWRFeHRlbnQ9cC5tZW1UaHVuayh5Ll9zdGFja2luZ1Jlc3VsdCxmdW5jdGlvbigpe3JldHVybiB5LnBvc2l0aW9uKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuX2ZpbHRlckZvclByb3BlcnR5KHkuX2lzVmVydGljYWw/InkiOiJ4Iil9LGZ1bmN0aW9uKHcsQyxHKXtyZXR1cm4gbS5TdGFja2luZy5zdGFja2VkRXh0ZW50KHcsQyxHKX0pO3kuYWRkQ2xhc3MoInN0YWNrZWQtYmFyLXBsb3QiKTt5Ll9zdGFja2luZ09yZGVyPSJib3R0b211cCI7cmV0dXJuIHl9ayh4LHUpO3gucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24oQSl7aWYobnVsbD09QSlyZXR1cm4gdGhpcy5fc3RhY2tpbmdPcmRlcjt0aGlzLl9zdGFja2luZ09yZGVyPUE7dGhpcy5fb25EYXRhc2V0VXBkYXRlKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLmV4dHJlbWFGb3JtYXR0ZXI9ZnVuY3Rpb24oQSl7aWYoMD09PQphcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9leHRyZW1hRm9ybWF0dGVyO3RoaXMuX2V4dHJlbWFGb3JtYXR0ZXI9QTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9sYWJlbEFyZWE9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKG4uQmFyLl9MQUJFTF9BUkVBX0NMQVNTLCEwKTt2YXIgQT1uZXcgdC5TdmdDb250ZXh0KHRoaXMuX2xhYmVsQXJlYS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyB0LkNhY2hlTWVhc3VyZXIoQSk7dGhpcy5fd3JpdGVyPW5ldyB0LldyaXRlcih0aGlzLl9tZWFzdXJlcixBKX07eC5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBKE8sSCl7dmFyIEs9dy5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IoKSxNPXcud2lkdGgoKSxMPXcuaGVpZ2h0KCk7Ty5mb3JFYWNoKGZ1bmN0aW9uKFEpe2lmKFEuZXh0ZW50IT09CkMpe3ZhciBUPXcuZXh0cmVtYUZvcm1hdHRlcigpKFEuZXh0ZW50KSxYPXcuX21lYXN1cmVyLm1lYXN1cmUoVCksYWE9US5zdGFja2VkRGF0dW0sbGE9YWEub3JpZ2luYWxEYXR1bSxaPWFhLm9yaWdpbmFsSW5kZXg7YWE9YWEub3JpZ2luYWxEYXRhc2V0O3cuX2lzRGF0dW1PblNjcmVlbihLLE0sTCxsYSxaLGFhKSYmKGxhPXEuUGxvdC5fc2NhbGVkQWNjZXNzb3Iody5hdHRyKG4uQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKGxhLFosYWEpLFo9RC5zY2FsZShRLmV4dGVudCksUT13Ll9nZXRQb3NpdGlvbkF0dHIoRy5zY2FsZShRLmF4aXNWYWx1ZSksbGEpK2xhLzIsUT1IKHcuX2lzVmVydGljYWw/e3g6USx5Olp9Ont4OloseTpRfSxYLGxhKSxUPXkoVCx7dG9wTGVmdDpRLGJvdHRvbVJpZ2h0Ont4OlEueCtYLndpZHRoLHk6US55K1guaGVpZ2h0fX0sbGEpLE4ucHVzaChUKSl9fSl9ZnVuY3Rpb24geShPLEgsSyl7dmFyIE09SC50b3BMZWZ0LEw9TS54LFE9TS55O009SC5ib3R0b21SaWdodC54LQpILnRvcExlZnQueDtIPUguYm90dG9tUmlnaHQueS1ILnRvcExlZnQueTtLPXcuX2lzVmVydGljYWw/TT5LOkg+SztLfHwoTD13Ll9sYWJlbEFyZWEuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTCsiLCAiK1ErIikiKSxMLmNsYXNzZWQoInN0YWNrZWQtYmFyLWxhYmVsIiwhMCksdy5fd3JpdGVyLndyaXRlKE8sTSxILHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxMLm5vZGUoKSkpO3JldHVybiBLfXZhciB3PXRoaXM7dS5wcm90b3R5cGUuX2RyYXdMYWJlbHMuY2FsbCh0aGlzKTt0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dmFyIEM9K3RoaXMuYmFzZWxpbmVWYWx1ZSgpLEc9dGhpcy5wb3NpdGlvbigpLnNjYWxlLEQ9dGhpcy5sZW5ndGgoKS5zY2FsZSxCPW0uU3RhY2tpbmcuc3RhY2tlZEV4dGVudHModGhpcy5fc3RhY2tpbmdSZXN1bHQoKSksST1CLm1pbmltdW1FeHRlbnRzLE49W107QShCLm1heGltdW1FeHRlbnRzLApmdW5jdGlvbihPLEgpe3ZhciBLPXcuX2lzVmVydGljYWw/SC53aWR0aDpILmhlaWdodDtIPXcuX2lzVmVydGljYWw/SC5oZWlnaHQ6SC53aWR0aDtyZXR1cm57eDp3Ll9pc1ZlcnRpY2FsP08ueC1LLzI6Ty54K3guX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSLHk6dy5faXNWZXJ0aWNhbD9PLnktSDpPLnktSy8yfX0pO0EoSSxmdW5jdGlvbihPLEgpe3ZhciBLPXcuX2lzVmVydGljYWw/SC53aWR0aDpILmhlaWdodDtIPXcuX2lzVmVydGljYWw/SC5oZWlnaHQ6SC53aWR0aDtyZXR1cm57eDp3Ll9pc1ZlcnRpY2FsP08ueC1LLzI6Ty54LUgseTp3Ll9pc1ZlcnRpY2FsP08ueSt4Ll9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUjpPLnktSy8yfX0pO04uc29tZShmdW5jdGlvbihPKXtyZXR1cm4gT30pJiZ0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9O3gucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoTSwKTCxRKXtyZXR1cm4gMD4rTyhNLEwsUSk/QyhNLEwsUSk6dyhNLEwsUSl9ZnVuY3Rpb24geShNLEwsUSl7cmV0dXJuIE1hdGguYWJzKHcoTSxMLFEpLUMoTSxMLFEpKX1mdW5jdGlvbiB3KE0sTCxRKXtyZXR1cm4gTi5zY2FsZSgrTyhNLEwsUSkrSy5nZXQoUSkuZ2V0KEcoTSxMLFEpKS5vZmZzZXQpfWZ1bmN0aW9uIEMoTSxMLFEpe3JldHVybiBOLnNjYWxlKEsuZ2V0KFEpLmdldChHKE0sTCxRKSkub2Zmc2V0KX1mdW5jdGlvbiBHKE0sTCxRKXtyZXR1cm4gbS5TdGFja2luZy5ub3JtYWxpemVLZXkoSChNLEwsUSkpfXZhciBEPXRoaXMsQj11LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSxJPXRoaXMuX2lzVmVydGljYWw/InkiOiJ4IixOPXRoaXMubGVuZ3RoKCkuc2NhbGUsTz10aGlzLmxlbmd0aCgpLmFjY2Vzc29yLEg9dGhpcy5wb3NpdGlvbigpLmFjY2Vzc29yLEs9dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTtCW3RoaXMuX2lzVmVydGljYWw/ImhlaWdodCI6CiJ3aWR0aCJdPXk7QltJXT1mdW5jdGlvbihNLEwsUSl7cmV0dXJuIEQuX2lzVmVydGljYWw/QShNLEwsUSk6QShNLEwsUSkteShNLEwsUSl9O3JldHVybiBCfTt4LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oQSl7cmV0dXJuIEE9PT0odGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiKT9bdGhpcy5fc3RhY2tlZEV4dGVudCgpXTp1LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLEEpfTt4LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4geH0obi5CYXIpO2QuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSPTU7Zi5TdGFja2VkQmFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgwKTtkPWgoMjcpO3ZhciBsPWgoMik7aD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO24uX2Nvbm5lY3RvcnNFbmFibGVkPSExO24uYWRkQ2xhc3MoIndhdGVyZmFsbC1wbG90Iik7cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLmNvbm5lY3RvcnNFbmFibGVkPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2Nvbm5lY3RvcnNFbmFibGVkO3RoaXMuX2Nvbm5lY3RvcnNFbmFibGVkPW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnRvdGFsPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KG0uX1RPVEFMX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KG0uX1RPVEFMX0tFWSwKbixudWxsKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihuKXt2YXIgcT10aGlzO3RoaXMuX2Nvbm5lY3RvckFyZWEuc2VsZWN0QWxsKCJsaW5lIikucmVtb3ZlKCk7dGhpcy5fY29ubmVjdG9yc0VuYWJsZWQmJnQuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gcS5fZHJhd0Nvbm5lY3RvcnMoKX0sbil9O20ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24obil7bj1wLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0LmNhbGwodGhpcyxuKTt0aGlzLl9jb25uZWN0b3JBcmVhPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChtLl9DT05ORUNUT1JfQVJFQV9DTEFTUywhMCk7cmV0dXJuIG59O20ucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihuKXtyZXR1cm4ieSI9PT1uP1t0aGlzLl9leHRlbnRdOnAucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsCm4pfTttLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLHE9cC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksdT10aGlzLnkoKS5zY2FsZSx4PWwuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy50b3RhbCgpKTtudWxsPT10aGlzLmF0dHIoInkiKSYmKHEueT1mdW5jdGlvbihBLHksdyl7dmFyIEM9bi55KCkuYWNjZXNzb3IoQSx5LHcpO2lmKHgoQSx5LHcpKXJldHVybiBNYXRoLm1pbih1LnNjYWxlKEMpLHUuc2NhbGUoMCkpO0E9bi5fc3VidG90YWxzW3ldO2lmKDA9PT15KXJldHVybiAwPkM/dS5zY2FsZShBLUMpOnUuc2NhbGUoQSk7eT1uLl9zdWJ0b3RhbHNbeS0xXTtyZXR1cm4gQT55P3Uuc2NhbGUoQSk6dS5zY2FsZSh5KX0pO251bGw9PXRoaXMuYXR0cigiaGVpZ2h0IikmJihxLmhlaWdodD1mdW5jdGlvbihBLHksdyl7dmFyIEM9eChBLHksdyk7QT1uLnkoKS5hY2Nlc3NvcihBLHksdyk7aWYoQylyZXR1cm4gTWF0aC5hYnModS5zY2FsZShBKS0KdS5zY2FsZSgwKSk7Qz1uLl9zdWJ0b3RhbHNbeV07aWYoMD09PXkpcmV0dXJuIE1hdGguYWJzKHUuc2NhbGUoQyktdS5zY2FsZShDLUEpKTt5PW4uX3N1YnRvdGFsc1t5LTFdO3JldHVybiBNYXRoLmFicyh1LnNjYWxlKEMpLXUuc2NhbGUoeSkpfSk7cVsiY2xhc3MiXT1mdW5jdGlvbihBLHksdyl7dmFyIEM9IiI7bnVsbCE9bi5hdHRyKCJjbGFzcyIpJiYoQz1uLmF0dHIoImNsYXNzIikuYWNjZXNzb3IoQSx5LHcpKyIgIik7aWYoeChBLHksdykpcmV0dXJuIEMrbS5fQkFSX1RPVEFMX0NMQVNTO0E9bi55KCkuYWNjZXNzb3IoQSx5LHcpO3JldHVybiBDKygwPEE/bS5fQkFSX0dST1dUSF9DTEFTUzptLl9CQVJfREVDTElORV9DTEFTUyl9O3JldHVybiBxfTttLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU3VidG90YWxzKCk7cC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50PQpmdW5jdGlvbihuKXt2YXIgcT10aGlzLHU9TnVtYmVyLk1BWF9WQUxVRSx4PU51bWJlci5NSU5fVkFMVUUsQT0wLHk9ITE7bi5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbih3LEMpe3ZhciBHPXEueSgpLmFjY2Vzc29yKHcsQyxuKTsodz1xLnRvdGFsKCkuYWNjZXNzb3IodyxDLG4pKSYmMCE9PUN8fChBKz1HKTtxLl9zdWJ0b3RhbHMucHVzaChBKTtBPHUmJih1PUEpO0E+eCYmKHg9QSk7dyYmKEc8dSYmKHU9RyksRz54JiYoeD1HKSk7aWYoIXkmJncpe0M9Ry1BO2ZvcihHPTA7RzxxLl9zdWJ0b3RhbHMubGVuZ3RoO0crKylxLl9zdWJ0b3RhbHNbR10rPUM7eT0hMDtBKz1DO3UrPUM7eCs9Q319KTt0aGlzLl9leHRlbnQ9W3UseF19O20ucHJvdG90eXBlLl9kcmF3Q29ubmVjdG9ycz1mdW5jdGlvbigpe2Zvcih2YXIgbj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxxPXRoaXMuZGF0YXNldHMoKVswXSx1PTE7dTxxLmRhdGEoKS5sZW5ndGg7dSsrKXt2YXIgeD11LTEsQT1xLmRhdGEoKVt1XSwKeT1xLmRhdGEoKVt4XTt5PW4ueCh5LHgscSk7dmFyIHc9bi54KEEsdSxxKStuLndpZHRoKEEsdSxxKSxDPW4ueShBLHUscSk7aWYoMDx0aGlzLl9zdWJ0b3RhbHNbdV0mJnRoaXMuX3N1YnRvdGFsc1t1XT50aGlzLl9zdWJ0b3RhbHNbeF18fDA+dGhpcy5fc3VidG90YWxzW3VdJiZ0aGlzLl9zdWJ0b3RhbHNbdV0+PXRoaXMuX3N1YnRvdGFsc1t4XSlDPW4ueShBLHUscSkrbi5oZWlnaHQoQSx1LHEpO3RoaXMuX2Nvbm5lY3RvckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChtLl9DT05ORUNUT1JfQ0xBU1MsITApLmF0dHIoIngxIix5KS5hdHRyKCJ4MiIsdykuYXR0cigieTEiLEMpLmF0dHIoInkyIixDKX19O20ucHJvdG90eXBlLl91cGRhdGVTdWJ0b3RhbHM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmRhdGFzZXRzKCk7MDxuLmxlbmd0aCYmKG49bltuLmxlbmd0aC0xXSx0aGlzLl9zdWJ0b3RhbHM9W10sdGhpcy5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50KG4pKX07cmV0dXJuIG19KGQuQmFyKTsKaC5fQkFSX0RFQ0xJTkVfQ0xBU1M9IndhdGVyZmFsbC1kZWNsaW5lIjtoLl9CQVJfR1JPV1RIX0NMQVNTPSJ3YXRlcmZhbGwtZ3Jvd3RoIjtoLl9CQVJfVE9UQUxfQ0xBU1M9IndhdGVyZmFsbC10b3RhbCI7aC5fQ09OTkVDVE9SX0NMQVNTPSJjb25uZWN0b3IiO2guX0NPTk5FQ1RPUl9BUkVBX0NMQVNTPSJjb25uZWN0b3ItYXJlYSI7aC5fVE9UQUxfS0VZPSJ0b3RhbCI7Zi5XYXRlcmZhbGw9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2YXIgcT1wLmNhbGwodGhpcyl8fHRoaXM7CnN3aXRjaChuKXtjYXNlIG51bGw6Y2FzZSB2b2lkIDA6bnVsbD09bS5fcGxvdHRhYmxlQ29sb3JDYWNoZSYmKG0uX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9bS5fZ2V0UGxvdHRhYmxlQ29sb3JzKCkpO249dC5zY2FsZU9yZGluYWwoKS5yYW5nZShtLl9wbG90dGFibGVDb2xvckNhY2hlKTticmVhaztjYXNlICJDYXRlZ29yeTEwIjpjYXNlICJjYXRlZ29yeTEwIjpjYXNlICIxMCI6bj10LnNjYWxlT3JkaW5hbCh0LnNjaGVtZUNhdGVnb3J5MTApO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MjAiOmNhc2UgImNhdGVnb3J5MjAiOmNhc2UgIjIwIjpuPXQuc2NhbGVPcmRpbmFsKHQuc2NoZW1lQ2F0ZWdvcnkyMCk7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMGIiOmNhc2UgImNhdGVnb3J5MjBiIjpjYXNlICIyMGIiOm49dC5zY2FsZU9yZGluYWwodC5zY2hlbWVDYXRlZ29yeTIwYik7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMGMiOmNhc2UgImNhdGVnb3J5MjBjIjpjYXNlICIyMGMiOm49dC5zY2FsZU9yZGluYWwodC5zY2hlbWVDYXRlZ29yeTIwYyk7CmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIENvbG9yU2NhbGUgdHlwZSIpO31xLl9kM1NjYWxlPW47cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBsLkFycmF5LnVuaXEobil9O20ucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbC5BcnJheS51bmlxKHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkpfTttLmludmFsaWRhdGVDb2xvckNhY2hlPWZ1bmN0aW9uKCl7bS5fcGxvdHRhYmxlQ29sb3JDYWNoZT1udWxsfTttLl9nZXRQbG90dGFibGVDb2xvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIG49W10scT10LnNlbGVjdCgiYm9keSIpLmFwcGVuZCgicGxvdHRhYmxlLWNvbG9yLXRlc3RlciIpLHU9bC5Db2xvci5jb2xvclRlc3QocSwiIikseD0wLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0wIik7bnVsbCE9QSYmeDx0aGlzLl9NQVhJTVVNX0NPTE9SU19GUk9NX0NTUyYmCihBIT09dXx8QSE9PW5bbi5sZW5ndGgtMV0pOyluLnB1c2goQSkseCsrLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0iK3gpO3EucmVtb3ZlKCk7cmV0dXJuIG59O20ucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKG4pe3ZhciBxPXRoaXMuX2QzU2NhbGUobik7bj10aGlzLmRvbWFpbigpLmluZGV4T2Yobik7bj1NYXRoLmZsb29yKG4vdGhpcy5yYW5nZSgpLmxlbmd0aCk7cmV0dXJuIGwuQ29sb3IubGlnaHRlbkNvbG9yKHEsTWF0aC5sb2cobiptLl9MT09QX0xJR0hURU5fRkFDVE9SKzEpKX07bS5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07bS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fZ2V0UmFuZ2U9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07bS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKG4pe3RoaXMuX2QzU2NhbGUucmFuZ2Uobil9O3JldHVybiBtfShoKDE3KS5TY2FsZSk7ZC5fTE9PUF9MSUdIVEVOX0ZBQ1RPUj0xLjY7ZC5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1M9MjU2O2YuQ29sb3I9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2b2lkIDA9PT1uJiYobj0ibGluZWFyIik7dmFyIHE9cC5jYWxsKHRoaXMpfHx0aGlzO3N3aXRjaChuKXtjYXNlICJsaW5lYXIiOnEuX2NvbG9yU2NhbGU9CnQuc2NhbGVMaW5lYXIoKTticmVhaztjYXNlICJsb2ciOnEuX2NvbG9yU2NhbGU9dC5zY2FsZUxvZygpO2JyZWFrO2Nhc2UgInNxcnQiOnEuX2NvbG9yU2NhbGU9dC5zY2FsZVNxcnQoKTticmVhaztjYXNlICJwb3ciOnEuX2NvbG9yU2NhbGU9dC5zY2FsZVBvdygpfWlmKG51bGw9PXEuX2NvbG9yU2NhbGUpdGhyb3cgRXJyb3IoInVua25vd24gUXVhbnRpdGF0aXZlU2NhbGUgc2NhbGUgdHlwZSAiK24pO3EucmFuZ2UobS5SRURTKTtyZXR1cm4gcX1rKG0scCk7bS5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24obil7bj10LmV4dGVudChuKTtyZXR1cm4gbnVsbD09blswXXx8bnVsbD09blsxXT9bXTpufTttLnByb3RvdHlwZS5fZDNJbnRlcnBvbGF0ZWRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnJhbmdlKFswLDFdKS5pbnRlcnBvbGF0ZSh0aGlzLl9pbnRlcnBvbGF0ZUNvbG9ycygpKX07bS5wcm90b3R5cGUuX2ludGVycG9sYXRlQ29sb3JzPQpmdW5jdGlvbigpe3ZhciBuPXRoaXMuX2NvbG9yUmFuZ2U7aWYoMj5uLmxlbmd0aCl0aHJvdyBFcnJvcigiQ29sb3Igc2NhbGUgYXJyYXlzIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuIik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHEpe3E9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHEpKTtxKj1uLmxlbmd0aC0xO3ZhciB1PU1hdGguZmxvb3IocSkseD1xLXU7cmV0dXJuIHQuaW50ZXJwb2xhdGVMYWIoblt1XSxuW01hdGguY2VpbChxKV0pKHgpfX19O20ucHJvdG90eXBlLl9yZXNldFNjYWxlPWZ1bmN0aW9uKCl7dGhpcy5fZDNTY2FsZT10aGlzLl9kM0ludGVycG9sYXRlZFNjYWxlKCk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9O20ucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpOzA8bi5sZW5ndGgmJnRoaXMuX3NldERvbWFpbihbbC5NYXRoLm1pbihuLAowKSxsLk1hdGgubWF4KG4sMCldKX07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O20ucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbG9yUmFuZ2V9O20ucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbihuKXt0aGlzLl9jb2xvclJhbmdlPW47dGhpcy5fcmVzZXRTY2FsZSgpfTtyZXR1cm4gbX0oaCgxNykuU2NhbGUpO2QuUkVEUz0iI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7CmQuQkxVRVM9IiNGRkZGRkYgI0NDRkZGRiAjQTVGRkZEICM4NUY3RkIgIzZFRDNFRiAjNTVBN0UwICM0MTdGRDAgIzI1NDVEMyAjMEIwMkUxIi5zcGxpdCgiICIpO2QuUE9TTkVHPSIjMEIwMkUxICMyNTQ1RDMgIzQxN0ZEMCAjNTVBN0UwICM2RUQzRUYgIzg1RjdGQiAjQTVGRkZEICNDQ0ZGRkYgI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7Zi5JbnRlcnBvbGF0ZWRDb2xvcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgxKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAoKXt2YXIgbT0KbC5jYWxsKHRoaXMpfHx0aGlzO20uX2QzU2NhbGU9dC5zY2FsZUxpbmVhcigpO3JldHVybiBtfWsocCxsKTtwLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLDFdfTtwLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24obSl7cmV0dXJuIG1bMF09PT1tWzFdP1ttWzBdLTEsbVsxXSsxXTptfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5fZDNTY2FsZShtKX07cC5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5zY2FsZShtKX07cC5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5pbnZlcnQobSl9O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtwLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbihtKXt0aGlzLmRvbWFpbihtKX07cC5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07cC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtwLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obSl7dGhpcy5fZDNTY2FsZS5yYW5nZShtKX07cC5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydChtKX07cC5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07CnAucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihtKS5uaWNlKG4pLmRvbWFpbigpfTtyZXR1cm4gcH0oaCgxMSkuUXVhbnRpdGF0aXZlU2NhbGUpO2YuTGluZWFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxuKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1tfWZvcih2YXIgdSBpbiBuKW4uaGFzT3duUHJvcGVydHkodSkmJihtW3VdPW5bdV0pO20ucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHEucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBxKX0sdD1oKDEpLGw9aCgwKSxwPWgoMyk7ZD1mdW5jdGlvbihtKXtmdW5jdGlvbiBuKHEpe3ZvaWQgMD09PXEmJihxPTEwKTt2YXIgdT1tLmNhbGwodGhpcyl8fHRoaXM7dS5fZDNTY2FsZT10LnNjYWxlTGluZWFyKCk7dS5fYmFzZT1xO3UuX3Bpdm90PXUuX2Jhc2U7dS5fc2V0RG9tYWluKHUuX2RlZmF1bHRFeHRlbnQoKSk7CmlmKDE+PXEpdGhyb3cgRXJyb3IoIk1vZGlmaWVkTG9nU2NhbGU6IFRoZSBiYXNlIG11c3QgYmUgXHgzZSAxIik7cmV0dXJuIHV9ayhuLG0pO24ucHJvdG90eXBlLl9hZGp1c3RlZExvZz1mdW5jdGlvbihxKXt2YXIgdT0wPnE/LTE6MTtxKj11O3E8dGhpcy5fcGl2b3QmJihxKz0odGhpcy5fcGl2b3QtcSkvdGhpcy5fcGl2b3QpO3E9TWF0aC5sb2cocSkvTWF0aC5sb2codGhpcy5fYmFzZSk7cmV0dXJuIHEqdX07bi5wcm90b3R5cGUuX2ludmVydGVkQWRqdXN0ZWRMb2c9ZnVuY3Rpb24ocSl7dmFyIHU9MD5xPy0xOjE7cT1NYXRoLnBvdyh0aGlzLl9iYXNlLHEqdSk7cTx0aGlzLl9waXZvdCYmKHE9dGhpcy5fcGl2b3QqKHEtMSkvKHRoaXMuX3Bpdm90LTEpKTtyZXR1cm4gcSp1fTtuLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5fZDNTY2FsZSh0aGlzLl9hZGp1c3RlZExvZyhxKSl9O24ucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5faW52ZXJ0ZWRBZGp1c3RlZExvZyh0aGlzLl9kM1NjYWxlLmludmVydChxKSl9OwpuLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLnNjYWxlKHEpfTtuLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLmludmVydChxKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0VW5ib3VuZGVkRXh0ZW50KCEwKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07bi5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24ocSl7dGhpcy5kb21haW4ocSl9O24ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbn07bi5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihxKXt0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluPXE7bS5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMsClt0aGlzLl9hZGp1c3RlZExvZyhxWzBdKSx0aGlzLl9hZGp1c3RlZExvZyhxWzFdKV0pfTtuLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4ocSk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcShHLEQsQil7cmV0dXJuW0csRCxCXS5zb3J0KGZ1bmN0aW9uKEksTil7cmV0dXJuIEktTn0pWzFdfXZhciB1PWwuTWF0aC5taW4odGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSx4PWwuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSxBPXEodSx4LC10aGlzLl9waXZvdCkseT1xKHUseCx0aGlzLl9waXZvdCk7QT10aGlzLl9sb2dUaWNrcygtQSwtdSkubWFwKGZ1bmN0aW9uKEcpe3JldHVybi1HfSkucmV2ZXJzZSgpO3k9dGhpcy5fbG9nVGlja3MoeSx4KTt2YXIgdz1NYXRoLm1heCh1LAotdGhpcy5fcGl2b3QpLEM9TWF0aC5taW4oeCx0aGlzLl9waXZvdCk7dz10LnNjYWxlTGluZWFyKCkuZG9tYWluKFt3LENdKS50aWNrcyh0aGlzLl9ob3dNYW55VGlja3ModyxDKSk7QT1BLmNvbmNhdCh3KS5jb25jYXQoeSk7MT49QS5sZW5ndGgmJihBPXQuc2NhbGVMaW5lYXIoKS5kb21haW4oW3UseF0pLnRpY2tzKCkpO3JldHVybiBBfTtuLnByb3RvdHlwZS5fbG9nVGlja3M9ZnVuY3Rpb24ocSx1KXt2YXIgeD10aGlzLEE9dGhpcy5faG93TWFueVRpY2tzKHEsdSk7aWYoMD09PUEpcmV0dXJuW107dmFyIHk9TWF0aC5mbG9vcihNYXRoLmxvZyhxKS9NYXRoLmxvZyh0aGlzLl9iYXNlKSksdz1NYXRoLmNlaWwoTWF0aC5sb2codSkvTWF0aC5sb2codGhpcy5fYmFzZSkpO0E9dC5yYW5nZSh3LHksLU1hdGguY2VpbCgody15KS9BKSk7eT10LnJhbmdlKHRoaXMuX2Jhc2UsMSwtKHRoaXMuX2Jhc2UtMSkpLm1hcChNYXRoLmZsb29yKTt2YXIgQz1sLkFycmF5LnVuaXEoeSk7QT1BLm1hcChmdW5jdGlvbihHKXtyZXR1cm4gQy5tYXAoZnVuY3Rpb24oRCl7cmV0dXJuIE1hdGgucG93KHguX2Jhc2UsCkctMSkqRH0pfSk7cmV0dXJuIGwuQXJyYXkuZmxhdHRlbihBKS5maWx0ZXIoZnVuY3Rpb24oRyl7cmV0dXJuIHE8PUcmJkc8PXV9KS5zb3J0KGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEctRH0pfTtuLnByb3RvdHlwZS5faG93TWFueVRpY2tzPWZ1bmN0aW9uKHEsdSl7dmFyIHg9dGhpcy5fYWRqdXN0ZWRMb2cobC5NYXRoLm1pbih0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluLDApKSxBPXRoaXMuX2FkanVzdGVkTG9nKGwuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSk7cmV0dXJuIE1hdGguY2VpbCgodGhpcy5fYWRqdXN0ZWRMb2codSktdGhpcy5fYWRqdXN0ZWRMb2cocSkpLyhBLXgpKnAuTW9kaWZpZWRMb2cuX0RFRkFVTFRfTlVNX1RJQ0tTKX07bi5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24ocSl7cmV0dXJuIHF9O24ucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuWzAsdGhpcy5fYmFzZV19O24ucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj0KZnVuY3Rpb24ocSl7cmV0dXJuIHFbMF09PT1xWzFdPyhxPXFbMF0sMDxxP1txL3RoaXMuX2Jhc2UscSp0aGlzLl9iYXNlXTowPT09cT9bLXRoaXMuX2Jhc2UsdGhpcy5fYmFzZV06W3EqdGhpcy5fYmFzZSxxL3RoaXMuX2Jhc2VdKTpxfTtuLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtuLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24ocSl7dGhpcy5fZDNTY2FsZS5yYW5nZShxKX07bi5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07cmV0dXJuIG59KGgoMTEpLlF1YW50aXRhdGl2ZVNjYWxlKTtmLk1vZGlmaWVkTG9nPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2YuaW50ZXJ2YWxUaWNrR2VuZXJhdG9yPWZ1bmN0aW9uKHQpe2lmKDA+PXQpdGhyb3cgRXJyb3IoImludGVydmFsIG11c3QgYmUgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKGwpe2w9CmwuZG9tYWluKCk7dmFyIHA9TWF0aC5taW4obFswXSxsWzFdKTtsPU1hdGgubWF4KGxbMF0sbFsxXSk7dmFyIG09TWF0aC5jZWlsKHAvdCkqdDtwPTA9PT1wJXQ/W106W3BdO3ZhciBuPWsuTWF0aC5yYW5nZSgwLE1hdGguZmxvb3IoKGwtbSkvdCkrMSkubWFwKGZ1bmN0aW9uKHEpe3JldHVybiBtK3EqdH0pO3JldHVybiBwLmNvbmNhdChuKS5jb25jYXQoMD09PWwldD9bXTpbbF0pfX07Zi5pbnRlZ2VyVGlja0dlbmVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbD10LmRlZmF1bHRUaWNrcygpO3JldHVybiBsLmZpbHRlcihmdW5jdGlvbihwLG0pe3JldHVybiAwPT09cCUxfHwwPT09bXx8bT09PWwubGVuZ3RoLTF9KX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTsKcC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDI4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1wLmNhbGwodGhpcyl8fHRoaXM7bi5fZDNTY2FsZT10LnNjYWxlVGltZSgpO24uYXV0b0RvbWFpbigpO3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS50aWNrSW50ZXJ2YWw9ZnVuY3Rpb24obixxKXt2b2lkIDA9PT1xJiYocT0xKTt2YXIgdT10LnNjYWxlVGltZSgpO20udGltZUludGVydmFsVG9EM1RpbWUobikuZXZlcnkocSk7dS5kb21haW4odGhpcy5kb21haW4oKSk7dS5yYW5nZSh0aGlzLnJhbmdlKCkpO3JldHVybiB1LnRpY2tzKCl9O20ucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24obil7aWYoblsxXTxuWzBdKXRocm93IEVycm9yKCJTY2FsZS5UaW1lIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIik7cmV0dXJuIHAucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLApuKX07bS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bbmV3IERhdGUoIjE5NzAtMDEtMDEiKSxuZXcgRGF0ZSgiMTk3MC0wMS0wMiIpXX07bS5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKG4pe3ZhciBxPW5bMF0uZ2V0VGltZSgpLHU9blsxXS5nZXRUaW1lKCk7cmV0dXJuIHE9PT11PyhuPW5ldyBEYXRlKHEpLG4uc2V0RGF0ZShuLmdldERhdGUoKS0xKSx1PW5ldyBEYXRlKHUpLHUuc2V0RGF0ZSh1LmdldERhdGUoKSsxKSxbbix1XSk6bn07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuc2NhbGUobmV3IERhdGUobikpfTttLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmludmVydChuKS5nZXRUaW1lKCl9O20ucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PQpmdW5jdGlvbigpe3ZhciBuPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCk7cmV0dXJuW25bMF0udmFsdWVPZigpLG5bMV0udmFsdWVPZigpXX07bS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmRvbWFpbigpO3JldHVybltuWzBdLnZhbHVlT2YoKSxuWzFdLnZhbHVlT2YoKV19O20ucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKG4pe3RoaXMuZG9tYWluKFtuZXcgRGF0ZShuWzBdKSxuZXcgRGF0ZShuWzFdKV0pfTttLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTttLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4obik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9OwptLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obil7dGhpcy5fZDNTY2FsZS5yYW5nZShuKX07bS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydChuKX07bS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07bS5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihuKS5uaWNlKCkuZG9tYWluKCl9O20udGltZUludGVydmFsVG9EM1RpbWU9ZnVuY3Rpb24obil7c3dpdGNoKG4pe2Nhc2UgbC5UaW1lSW50ZXJ2YWwuc2Vjb25kOnJldHVybiB0LnRpbWVTZWNvbmQ7Y2FzZSBsLlRpbWVJbnRlcnZhbC5taW51dGU6cmV0dXJuIHQudGltZU1pbnV0ZTtjYXNlIGwuVGltZUludGVydmFsLmhvdXI6cmV0dXJuIHQudGltZUhvdXI7Y2FzZSBsLlRpbWVJbnRlcnZhbC5kYXk6cmV0dXJuIHQudGltZURheTsKY2FzZSBsLlRpbWVJbnRlcnZhbC53ZWVrOnJldHVybiB0LnRpbWVXZWVrO2Nhc2UgbC5UaW1lSW50ZXJ2YWwubW9udGg6cmV0dXJuIHQudGltZU1vbnRoO2Nhc2UgbC5UaW1lSW50ZXJ2YWwueWVhcjpyZXR1cm4gdC50aW1lWWVhcjtkZWZhdWx0OnRocm93IEVycm9yKCJUaW1lSW50ZXJ2YWwgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0OiAiK24pO319O3JldHVybiBtfShoKDExKS5RdWFudGl0YXRpdmVTY2FsZSk7Zi5UaW1lPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpLHQ9QXJyYXk7Zi5hZGQ9ZnVuY3Rpb24obCxwKXtpZihsLmxlbmd0aCE9PXAubGVuZ3RoKXRocm93IEVycm9yKCJhdHRlbXB0ZWQgdG8gYWRkIGFycmF5cyBvZiB1bmVxdWFsIGxlbmd0aCIpO3JldHVybiBsLm1hcChmdW5jdGlvbihtLG4pe3JldHVybiBsW25dK3Bbbl19KX07Zi51bmlxPWZ1bmN0aW9uKGwpe3ZhciBwPWsuc2V0KCksbT1bXTtsLmZvckVhY2goZnVuY3Rpb24obil7cC5oYXMoU3RyaW5nKG4pKXx8CihwLmFkZChTdHJpbmcobikpLG0ucHVzaChuKSl9KTtyZXR1cm4gbX07Zi5mbGF0dGVuPWZ1bmN0aW9uKGwpe3JldHVybiB0LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sbCl9O2YuY3JlYXRlRmlsbGVkQXJyYXk9ZnVuY3Rpb24obCxwKXtmb3IodmFyIG09W10sbj0wO248cDtuKyspbVtuXT0iZnVuY3Rpb24iPT09dHlwZW9mIGw/bChuKTpsO3JldHVybiBtfX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQsbCl7dGhpcy5tYXhJbmRleD10aGlzLm1pbkluZGV4PXRoaXMuZXhpdEluZGV4PXRoaXMuZW50cnlJbmRleD1rO3RoaXMuYnVja2V0VmFsdWU9dDt0aGlzLm1heFZhbHVlPXRoaXMubWluVmFsdWU9bH1oLnByb3RvdHlwZS5pc0luQnVja2V0PWZ1bmN0aW9uKGspe3JldHVybiBrPT10aGlzLmJ1Y2tldFZhbHVlfTtoLnByb3RvdHlwZS5hZGRUb0J1Y2tldD1mdW5jdGlvbihrLHQpe2s8dGhpcy5taW5WYWx1ZSYmKHRoaXMubWluVmFsdWU9ayx0aGlzLm1pbkluZGV4PQp0KTtrPnRoaXMubWF4VmFsdWUmJih0aGlzLm1heFZhbHVlPWssdGhpcy5tYXhJbmRleD10KTt0aGlzLmV4aXRJbmRleD10fTtoLnByb3RvdHlwZS5nZXRVbmlxdWVJbmRpY2VzPWZ1bmN0aW9uKCl7dmFyIGs9W3RoaXMuZW50cnlJbmRleCx0aGlzLm1heEluZGV4LHRoaXMubWluSW5kZXgsdGhpcy5leGl0SW5kZXhdO3JldHVybiBrLmZpbHRlcihmdW5jdGlvbih0LGwpe3JldHVybiAwPT1sfHx0IT1rW2wtMV19KX07cmV0dXJuIGh9KCk7Zi5CdWNrZXQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHRbbV09bFttXSk7dC5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gbnVsbCE9PQp0JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKGwsdCk7bC5wcm90b3R5cGUuY2FsbENhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgcD10aGlzLG09W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspbVtuXT1hcmd1bWVudHNbbl07dGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3EuYXBwbHkocCxtKX0pO3JldHVybiB0aGlzfTtyZXR1cm4gbH0oaCg1OCkuU2V0KTtmLkNhbGxiYWNrU2V0PWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHApe2Z1bmN0aW9uIG0odSl7dS89MjU1O3JldHVybi4wMzkyOD49dT91LzEyLjkyOmwucG93KCh1Ky4wNTUpLzEuMDU1LDIuNCl9dmFyIG49dC5yZ2IocCk7cD1tKG4ucik7dmFyIHE9bShuLmcpO249bShuLmIpO3JldHVybi4yMTI2KnArLjcxNTIqcSsuMDcyMipufXZhciB0PWgoMSksbD1NYXRoO2YuY29udHJhc3Q9ZnVuY3Rpb24ocCxtKXtwPWsocCkrLjA1O209ayhtKSsuMDU7cmV0dXJuIHA+bT9wL206bS9wfTtmLmxpZ2h0ZW5Db2xvcj0KZnVuY3Rpb24ocCxtKXtyZXR1cm4gdC5jb2xvcihwKS5icmlnaHRlcihtKS5yZ2IoKS50b1N0cmluZygpfTtmLmNvbG9yVGVzdD1mdW5jdGlvbihwLG0pe3AuY2xhc3NlZChtLCEwKTt2YXIgbj1wLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIik7aWYoInRyYW5zcGFyZW50Ij09PW4pcmV0dXJuIG51bGw7bj0vXCgoLispXCkvLmV4ZWMobik7aWYoIW4pcmV0dXJuIG51bGw7bj1uWzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKHEpe3E9K3E7dmFyIHU9cS50b1N0cmluZygxNik7cmV0dXJuIDE2PnE/IjAiK3U6dX0pO2lmKDQ9PT1uLmxlbmd0aCYmIjAwIj09PW5bM10pcmV0dXJuIG51bGw7bj0iIyIrbi5qb2luKCIiKTtwLmNsYXNzZWQobSwhMSk7cmV0dXJuIG59fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSx0PWgoNTcpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7dGhpcy5fZW50aXRpZXM9W107dGhpcy5fcnRyZWU9bmV3IHQuUlRyZWU7dGhpcy5fdHJlZT1rLnF1YWR0cmVlKCkueChmdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5mbG9vcihwLnBvc2l0aW9uLngpfSkueShmdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5mbG9vcihwLnBvc2l0aW9uLnkpfSl9CmwucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbihwLG0sbil7KHg9dGhpcy5fZW50aXRpZXMpLnB1c2guYXBwbHkoeCxwKTtpZih2b2lkIDAhPT1uKWZvcihuPXQuUlRyZWVCb3VuZHMuYm91bmRzKG4pLHg9MDt4PHAubGVuZ3RoO3grKyl7dmFyIHE9cFt4XSx1PXQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0ocSkpO3QuUlRyZWVCb3VuZHMuaXNCb3VuZHNPdmVybGFwQm91bmRzKG4sdSkmJih0aGlzLl90cmVlLmFkZChxKSx0aGlzLl9ydHJlZS5pbnNlcnQodSxxKSl9ZWxzZSBmb3IodGhpcy5fdHJlZS5hZGRBbGwocCkseD0wO3g8cC5sZW5ndGg7eCsrKXE9cFt4XSx1PXQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0ocSkpLHRoaXMuX3J0cmVlLmluc2VydCh1LHEpO3ZhciB4fTtsLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl90cmVlLmZpbmQocC54LHAueSl9O2wucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuX3J0cmVlLmludGVyc2VjdCh0LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9OwpsLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WCh0LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9O2wucHJvdG90eXBlLmVudGl0aWVzSW5ZQm91bmRzPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3RZKHQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKHApKX07bC5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW50aXRpZXN9O3JldHVybiBsfSgpO2YuRW50aXR5U3RvcmU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoNTYpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuTWFwP3RoaXMuX2VzNk1hcD1uZXcgd2luZG93Lk1hcDp0aGlzLl9rZXlWYWx1ZVBhaXJzPVtdfXQucHJvdG90eXBlLnNldD1mdW5jdGlvbihsLHApe2lmKGsuaXNOYU4obCkpdGhyb3cgRXJyb3IoIk5hTiBtYXkgbm90IGJlIHVzZWQgYXMgYSBrZXkgdG8gdGhlIE1hcCIpOwppZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5zZXQobCxwKSx0aGlzO2Zvcih2YXIgbT0wO208dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7bSsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbbV0ua2V5PT09bClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1ttXS52YWx1ZT1wLHRoaXM7dGhpcy5fa2V5VmFsdWVQYWlycy5wdXNoKHtrZXk6bCx2YWx1ZTpwfSk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmdldD1mdW5jdGlvbihsKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5nZXQobCk7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLnZhbHVlfTt0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24obCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuaGFzKGwpOwpmb3IodmFyIHA9MDtwPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO3ArKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLmtleT09PWwpcmV0dXJuITA7cmV0dXJuITF9O3QucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24obCxwKXt2YXIgbT10aGlzO251bGwhPXRoaXMuX2VzNk1hcD90aGlzLl9lczZNYXAuZm9yRWFjaChmdW5jdGlvbihuLHEpe3JldHVybiBsLmNhbGwocCxuLHEsbSl9LHApOnRoaXMuX2tleVZhbHVlUGFpcnMuZm9yRWFjaChmdW5jdGlvbihuKXtsLmNhbGwocCxuLnZhbHVlLG4ua2V5LG0pfSl9O3QucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihsKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5kZWxldGUobCk7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzLnNwbGljZShwLDEpLCEwO3JldHVybiExfTsKcmV0dXJuIHR9KCk7Zi5NYXA9ZH0sZnVuY3Rpb24oZCxmKXtmLmFzc2lnbj1mdW5jdGlvbigpe2Zvcih2YXIgaD1bXSxrPTA7azxhcmd1bWVudHMubGVuZ3RoO2srKyloW2tdPWFyZ3VtZW50c1trXTtrPXt9O2Zvcih2YXIgdD0wO3Q8aC5sZW5ndGg7dCsrKWZvcih2YXIgbD1oW3RdLHA9MCxtPU9iamVjdC5rZXlzKGwpO3A8bS5sZW5ndGg7cCsrKXt2YXIgbj1tW3BdO2tbbl09bFtuXX1yZXR1cm4ga319LGZ1bmN0aW9uKGQsZil7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oayx0KXtmb3IodmFyIGw9TWF0aC5jZWlsKGsubGVuZ3RoLzIpLHA9MDtwPGw7cCsrKXRbMF0uaW5zZXJ0KGtbcF0pO2ZvcihwPWw7cDxrLmxlbmd0aDtwKyspdFsxXS5pbnNlcnQoa1twXSl9O3JldHVybiBofSgpO2YuU3BsaXRTdHJhdGVneVRyaXZpYWw9ZDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe31oLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihrLHQpe2s9Cmsuc2xpY2UoKTtmb3IodGhpcy5jaG9vc2VGaXJzdFNwbGl0KGssdCk7MDxrLmxlbmd0aDspdGhpcy5hZGROZXh0KGssdCl9O2gucHJvdG90eXBlLmNob29zZUZpcnN0U3BsaXQ9ZnVuY3Rpb24oayx0KXtmb3IodmFyIGw9MCxwPTAsbT1rLmxlbmd0aC0xLG49ay5sZW5ndGgtMSxxPTE7cTxrLmxlbmd0aC0xO3ErKyl7dmFyIHU9a1txXTt1LmJvdW5kcy54bD5rW21dLmJvdW5kcy54bD9tPXE6dS5ib3VuZHMueGg8a1tsXS5ib3VuZHMueGgmJihsPXEpO3UuYm91bmRzLnlsPmtbbl0uYm91bmRzLnlsP249cTp1LmJvdW5kcy55aDxrW3BdLmJvdW5kcy55aCYmKHA9cSl9cD1NYXRoLmFicyhrW2xdLmJvdW5kcy54aC1rW21dLmJvdW5kcy54bCk+TWF0aC5hYnMoa1twXS5ib3VuZHMueWgta1tuXS5ib3VuZHMueWwpP1tsLG1dOltwLG5dO2w9cFswXTtwPXBbMV07bD09PXAmJihsPTAscD1rLmxlbmd0aC0xKTt0WzBdLmluc2VydChrLnNwbGljZShNYXRoLm1heChsLHApLDEpWzBdKTt0WzFdLmluc2VydChrLnNwbGljZShNYXRoLm1pbihsLApwKSwxKVswXSl9O2gucHJvdG90eXBlLmFkZE5leHQ9ZnVuY3Rpb24oayx0KXtmb3IodmFyIGw9bnVsbCxwPW51bGwsbT1udWxsLG49MDtuPGsubGVuZ3RoO24rKyl7dmFyIHE9a1tuXSx1PXRbMF0udW5pb25BcmVhRGlmZmVyZW5jZShxLmJvdW5kcyk7cT10WzFdLnVuaW9uQXJlYURpZmZlcmVuY2UocS5ib3VuZHMpO2lmKHU8cHx8bnVsbD09bClsPW4scD11LG09dFswXTtxPHAmJihsPW4scD1xLG09dFsxXSl9bS5pbnNlcnQoay5zcGxpY2UobCwxKVswXSl9O3JldHVybiBofSgpO2YuU3BsaXRTdHJhdGVneUxpbmVhcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhtKXtyZXR1cm4gU3RyaW5nKG0pfXZhciB0PWgoMSksbD1oKDApO2Q9aCgxMCk7Zi5JU3RhY2tpbmdPcmRlcj1kLm1ha2VFbnVtKFsidG9wZG93biIsImJvdHRvbXVwIl0pO3ZhciBwPU1hdGg7Zi5zdGFjaz1mdW5jdGlvbihtLG4scSx1KXt2b2lkIDA9PT11JiYodT0iYm90dG9tdXAiKTt2YXIgeD10Lm1hcCgpLEE9CnQubWFwKCkseT1uZXcgbC5NYXA7InRvcGRvd24iPT09dSYmKG09bS5zbGljZSgpLG0ucmV2ZXJzZSgpKTttLmZvckVhY2goZnVuY3Rpb24odyl7dmFyIEM9bmV3IGwuTWFwO3cuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oRyxEKXt2YXIgQj1rKG4oRyxELHcpKSxJPStxKEcsRCx3KSxOPTA8PUk/eDpBO2lmKE4uaGFzKEIpKXt2YXIgTz1OLmdldChCKTtOLnNldChCLE8rSSl9ZWxzZSBPPTAsTi5zZXQoQixJKTtDLnNldChCLHtvZmZzZXQ6Tyx2YWx1ZTpJLGF4aXNWYWx1ZTpuKEcsRCx3KSxvcmlnaW5hbERhdHVtOkcsb3JpZ2luYWxEYXRhc2V0Oncsb3JpZ2luYWxJbmRleDpEfSl9KTt5LnNldCh3LEMpfSk7cmV0dXJuIHl9O2Yuc3RhY2tlZEV4dGVudHM9ZnVuY3Rpb24obSl7dmFyIG49bmV3IGwuTWFwLHE9bmV3IGwuTWFwO20uZm9yRWFjaChmdW5jdGlvbih1KXt1LmZvckVhY2goZnVuY3Rpb24oeCxBKXt2YXIgeT1sLk1hdGgubWF4KFt4Lm9mZnNldCt4LnZhbHVlLHgub2Zmc2V0XSwKeC5vZmZzZXQpLHc9bC5NYXRoLm1pbihbeC5vZmZzZXQreC52YWx1ZSx4Lm9mZnNldF0seC5vZmZzZXQpLEM9eC5heGlzVmFsdWU7bi5oYXMoQSk/bi5nZXQoQSkuZXh0ZW50PHkmJm4uc2V0KEEse2V4dGVudDp5LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp4fSk6bi5zZXQoQSx7ZXh0ZW50OnksYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnh9KTtxLmhhcyhBKT9xLmdldChBKS5leHRlbnQ+dyYmcS5zZXQoQSx7ZXh0ZW50OncsYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnh9KTpxLnNldChBLHtleHRlbnQ6dyxheGlzVmFsdWU6QyxzdGFja2VkRGF0dW06eH0pfSl9KTtyZXR1cm57bWF4aW11bUV4dGVudHM6bixtaW5pbXVtRXh0ZW50czpxfX07Zi5zdGFja2VkRXh0ZW50PWZ1bmN0aW9uKG0sbixxKXt2YXIgdT1bXTttLmZvckVhY2goZnVuY3Rpb24oQSx5KXt5LmRhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uKHcsQyl7aWYobnVsbD09cXx8cSh3LEMseSkpdz1BLmdldChrKG4odyxDLHkpKSksCnUucHVzaCh3LnZhbHVlK3cub2Zmc2V0KX0pfSk7bT1sLk1hdGgubWF4KHUsMCk7dmFyIHg9bC5NYXRoLm1pbih1LDApO3JldHVybltwLm1pbih4LDApLHAubWF4KDAsbSldfTtmLm5vcm1hbGl6ZUtleT1rfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgwKTtmLmdldFRyYW5zbGF0b3I9ZnVuY3Rpb24obCl7bD1sLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt2YXIgcD1sLl9fUGxvdHRhYmxlX0NsaWVudFRyYW5zbGF0b3I7bnVsbD09cCYmKHA9bmV3IHQobCksbC5fX1Bsb3R0YWJsZV9DbGllbnRUcmFuc2xhdG9yPXApO3JldHVybiBwfTt2YXIgdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwocCl7dGhpcy5fcm9vdEVsZW1lbnQ9cH1sLnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb249ZnVuY3Rpb24ocCxtKXtwPXt4OnAseTptfTttPWsuTWF0aC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09bT9wOmsuTWF0aC5hcHBseVRyYW5zZm9ybShtLApwKX07bC5pc0V2ZW50SW5zaWRlPWZ1bmN0aW9uKHAsbSl7cmV0dXJuIGsuRE9NLmNvbnRhaW5zKHAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpLG0udGFyZ2V0KX07cmV0dXJuIGx9KCk7Zi5UcmFuc2xhdG9yPXR9LGZ1bmN0aW9uKGQsZixoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGs9aCgxMjQpO2guZChmLCJlYXNlTGluZWFyIixmdW5jdGlvbigpe3JldHVybiBrLmF9KTt2YXIgdD1oKDEyNik7aC5kKGYsImVhc2VRdWFkIixmdW5jdGlvbigpe3JldHVybiB0LmF9KTtoLmQoZiwiZWFzZVF1YWRJbiIsZnVuY3Rpb24oKXtyZXR1cm4gdC5ifSk7aC5kKGYsImVhc2VRdWFkT3V0IixmdW5jdGlvbigpe3JldHVybiB0LmN9KTtoLmQoZiwiZWFzZVF1YWRJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdC5hfSk7dmFyIGw9aCgxMjEpO2guZChmLCJlYXNlQ3ViaWMiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuYX0pO2guZChmLCJlYXNlQ3ViaWNJbiIsCmZ1bmN0aW9uKCl7cmV0dXJuIGwuYn0pO2guZChmLCJlYXNlQ3ViaWNPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuY30pO2guZChmLCJlYXNlQ3ViaWNJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gbC5hfSk7dmFyIHA9aCgxMjUpO2guZChmLCJlYXNlUG9seSIsZnVuY3Rpb24oKXtyZXR1cm4gcC5hfSk7aC5kKGYsImVhc2VQb2x5SW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYn0pO2guZChmLCJlYXNlUG9seU91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcC5jfSk7aC5kKGYsImVhc2VQb2x5SW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYX0pO3ZhciBtPWgoMTI3KTtoLmQoZiwiZWFzZVNpbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5hfSk7aC5kKGYsImVhc2VTaW5JbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5ifSk7aC5kKGYsImVhc2VTaW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uY30pO2guZChmLCJlYXNlU2luSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uYX0pO3ZhciBuPWgoMTIzKTtoLmQoZiwKImVhc2VFeHAiLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYX0pO2guZChmLCJlYXNlRXhwSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYn0pO2guZChmLCJlYXNlRXhwT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmN9KTtoLmQoZiwiZWFzZUV4cEluT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmF9KTt2YXIgcT1oKDEyMCk7aC5kKGYsImVhc2VDaXJjbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYX0pO2guZChmLCJlYXNlQ2lyY2xlSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYn0pO2guZChmLCJlYXNlQ2lyY2xlT3V0IixmdW5jdGlvbigpe3JldHVybiBxLmN9KTtoLmQoZiwiZWFzZUNpcmNsZUluT3V0IixmdW5jdGlvbigpe3JldHVybiBxLmF9KTt2YXIgdT1oKDExOSk7aC5kKGYsImVhc2VCb3VuY2UiLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYX0pO2guZChmLCJlYXNlQm91bmNlSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYn0pO2guZChmLCJlYXNlQm91bmNlT3V0IixmdW5jdGlvbigpe3JldHVybiB1LmF9KTsKaC5kKGYsImVhc2VCb3VuY2VJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdS5jfSk7dmFyIHg9aCgxMTgpO2guZChmLCJlYXNlQmFjayIsZnVuY3Rpb24oKXtyZXR1cm4geC5hfSk7aC5kKGYsImVhc2VCYWNrSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHguYn0pO2guZChmLCJlYXNlQmFja091dCIsZnVuY3Rpb24oKXtyZXR1cm4geC5jfSk7aC5kKGYsImVhc2VCYWNrSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHguYX0pO3ZhciBBPWgoMTIyKTtoLmQoZiwiZWFzZUVsYXN0aWMiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYX0pO2guZChmLCJlYXNlRWxhc3RpY0luIixmdW5jdGlvbigpe3JldHVybiBBLmJ9KTtoLmQoZiwiZWFzZUVsYXN0aWNPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYX0pO2guZChmLCJlYXNlRWxhc3RpY0luT3V0IixmdW5jdGlvbigpe3JldHVybiBBLmN9KX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiBrfSk7aC5kKGYsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KTsKaC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTt2YXIgaz1mdW5jdGlvbiBuKG0pe2Z1bmN0aW9uIHEodSl7cmV0dXJuIHUqdSooKG0rMSkqdS1tKX1tPSttO3Eub3ZlcnNob290PW47cmV0dXJuIHF9KDEuNzAxNTgpLHQ9ZnVuY3Rpb24gcShuKXtmdW5jdGlvbiB1KHgpe3JldHVybi0teCp4KigobisxKSp4K24pKzF9bj0rbjt1Lm92ZXJzaG9vdD1xO3JldHVybiB1fSgxLjcwMTU4KSxsPWZ1bmN0aW9uIHUocSl7ZnVuY3Rpb24geChBKXtyZXR1cm4oMT4oQSo9Mik/QSpBKigocSsxKSpBLXEpOihBLT0yKSpBKigocSsxKSpBK3EpKzIpLzJ9cT0rcTt4Lm92ZXJzaG9vdD11O3JldHVybiB4fSgxLjcwMTU4KX0sZnVuY3Rpb24oZCxmKXtmdW5jdGlvbiBoKHkpe3JldHVybih5PSt5KTxrP0EqeSp5Onk8bD9BKih5LT10KSp5K3A6eTxuP0EqKHktPW0pKnkrcTpBKih5LT11KSp5K3h9Zi5iPWZ1bmN0aW9uKHkpe3JldHVybiAxLWgoMS15KX07Zi5hPWg7Zi5jPWZ1bmN0aW9uKHkpe3JldHVybigxPj0KKHkqPTIpPzEtaCgxLXkpOmgoeS0xKSsxKS8yfTt2YXIgaz00LzExLHQ9Ni8xMSxsPTgvMTEscD0uNzUsbT05LzExLG49MTAvMTEscT0uOTM3NSx1PTIxLzIyLHg9Ljk4NDM3NSxBPTEvay9rfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1oKmgpfTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLWgqaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpPzEtTWF0aC5zcXJ0KDEtaCpoKTpNYXRoLnNxcnQoMS0oaC09MikqaCkrMSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKGgpe3JldHVybiBoKmgqaH07Zi5jPWZ1bmN0aW9uKGgpe3JldHVybi0taCpoKmgrMX07Zi5hPWZ1bmN0aW9uKGgpe3JldHVybigxPj0oaCo9Mik/aCpoKmg6KGgtPTIpKmgqaCsyKS8yfX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiB0fSk7aC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTsKaC5kKGYsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KTt2YXIgaz0yKk1hdGguUEksdD1mdW5jdGlvbiB1KG4scSl7ZnVuY3Rpb24geCh5KXtyZXR1cm4gbipNYXRoLnBvdygyLDEwKi0teSkqTWF0aC5zaW4oKEEteSkvcSl9dmFyIEE9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihxLz1rKTt4LmFtcGxpdHVkZT1mdW5jdGlvbih5KXtyZXR1cm4gdSh5LHEqayl9O3gucGVyaW9kPWZ1bmN0aW9uKHkpe3JldHVybiB1KG4seSl9O3JldHVybiB4fSgxLC4zKSxsPWZ1bmN0aW9uIHgocSx1KXtmdW5jdGlvbiBBKHcpe3JldHVybiAxLXEqTWF0aC5wb3coMiwtMTAqKHc9K3cpKSpNYXRoLnNpbigodyt5KS91KX12YXIgeT1NYXRoLmFzaW4oMS8ocT1NYXRoLm1heCgxLHEpKSkqKHUvPWspO0EuYW1wbGl0dWRlPWZ1bmN0aW9uKHcpe3JldHVybiB4KHcsdSprKX07QS5wZXJpb2Q9ZnVuY3Rpb24odyl7cmV0dXJuIHgocSx3KX07cmV0dXJuIEF9KDEsLjMpLHA9ZnVuY3Rpb24gQSh1LHgpe2Z1bmN0aW9uIHkoQyl7cmV0dXJuKDA+CihDPTIqQy0xKT91Kk1hdGgucG93KDIsMTAqQykqTWF0aC5zaW4oKHctQykveCk6Mi11Kk1hdGgucG93KDIsLTEwKkMpKk1hdGguc2luKCh3K0MpL3gpKS8yfXZhciB3PU1hdGguYXNpbigxLyh1PU1hdGgubWF4KDEsdSkpKSooeC89ayk7eS5hbXBsaXR1ZGU9ZnVuY3Rpb24oQyl7cmV0dXJuIEEoQyx4KmspfTt5LnBlcmlvZD1mdW5jdGlvbihDKXtyZXR1cm4gQSh1LEMpfTtyZXR1cm4geX0oMSwuMyl9LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKGgpe3JldHVybiBNYXRoLnBvdygyLDEwKmgtMTApfTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP01hdGgucG93KDIsMTAqaC0xMCk6Mi1NYXRoLnBvdygyLDEwLTEwKmgpKS8yfX0sZnVuY3Rpb24oZCxmKXtmLmE9ZnVuY3Rpb24oaCl7cmV0dXJuK2h9fSxmdW5jdGlvbihkLGYsaCl7aC5kKGYsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGt9KTtoLmQoZiwKImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KTtoLmQoZiwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pO3ZhciBrPWZ1bmN0aW9uIG4obSl7ZnVuY3Rpb24gcSh1KXtyZXR1cm4gTWF0aC5wb3codSxtKX1tPSttO3EuZXhwb25lbnQ9bjtyZXR1cm4gcX0oMyksdD1mdW5jdGlvbiBxKG4pe2Z1bmN0aW9uIHUoeCl7cmV0dXJuIDEtTWF0aC5wb3coMS14LG4pfW49K247dS5leHBvbmVudD1xO3JldHVybiB1fSgzKSxsPWZ1bmN0aW9uIHUocSl7ZnVuY3Rpb24geChBKXtyZXR1cm4oMT49KEEqPTIpP01hdGgucG93KEEscSk6Mi1NYXRoLnBvdygyLUEscSkpLzJ9cT0rcTt4LmV4cG9uZW50PXU7cmV0dXJuIHh9KDMpfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gaCpofTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIGgqKDItaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP2gqaDotLWgqKDItaCkrMSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKHQpe3JldHVybiAxLQpNYXRoLmNvcyh0KmspfTtmLmM9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqayl9O2YuYT1mdW5jdGlvbih0KXtyZXR1cm4oMS1NYXRoLmNvcyhoKnQpKS8yfTt2YXIgaD1NYXRoLlBJLGs9aC8yfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhsKXtyZXR1cm4hMD09PXQobCkmJiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGwpfXZhciB0PWgoMTI5KTtkLmV4cG9ydHM9ZnVuY3Rpb24obCl7aWYoITE9PT1rKGwpKXJldHVybiExO2w9bC5jb25zdHJ1Y3RvcjtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGwpcmV0dXJuITE7bD1sLnByb3RvdHlwZTtyZXR1cm4hMT09PWsobCl8fCExPT09bC5oYXNPd25Qcm9wZXJ0eSgiaXNQcm90b3R5cGVPZiIpPyExOiEwfX0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPWZ1bmN0aW9uKGYpe3JldHVybiBudWxsIT1mJiYib2JqZWN0Ij09PXR5cGVvZiBmJiYhMT09PUFycmF5LmlzQXJyYXkoZil9fSxmdW5jdGlvbihkLApmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQsbCl7dm9pZCAwPT09dCYmKHQ9MTApO3ZvaWQgMD09PWwmJihsPXt9KTt2YXIgcD10aGlzO3RoaXMuY3R4PWs7dGhpcy5saW5lSGVpZ2h0PXQ7dGhpcy5zdHlsZT1sO3RoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obSl7cC5jdHguZm9udD1wLnN0eWxlLmZvbnQ7cmV0dXJue3dpZHRoOnAuY3R4Lm1lYXN1cmVUZXh0KG0pLndpZHRoLGhlaWdodDpwLmxpbmVIZWlnaHR9fX07dGhpcy5jcmVhdGVQZW49ZnVuY3Rpb24obSxuLHEpe251bGw9PXEmJihxPXAuY3R4KTtxLnNhdmUoKTtxLnRyYW5zbGF0ZShuLnRyYW5zbGF0ZVswXSxuLnRyYW5zbGF0ZVsxXSk7cS5yb3RhdGUobi5yb3RhdGUqTWF0aC5QSS8xODApO3JldHVybiBwLmNyZWF0ZUNhbnZhc1BlbihxKX07dm9pZCAwPT09dGhpcy5zdHlsZS5maWxsJiYodGhpcy5zdHlsZS5maWxsPSIjNDQ0Iil9aC5wcm90b3R5cGUuY3JlYXRlQ2FudmFzUGVuPWZ1bmN0aW9uKGspe3ZhciB0PQp0aGlzO3JldHVybntkZXN0cm95OmZ1bmN0aW9uKCl7ay5yZXN0b3JlKCl9LHdyaXRlOmZ1bmN0aW9uKGwscCxtLG4pe2sudGV4dEFsaWduPXA7bnVsbCE9dC5zdHlsZS5mb250JiYoay5mb250PXQuc3R5bGUuZm9udCk7bnVsbCE9dC5zdHlsZS5maWxsJiYoay5maWxsU3R5bGU9dC5zdHlsZS5maWxsLGsuZmlsbFRleHQobCxtLG4pKTtudWxsIT10LnN0eWxlLnN0cm9rZSYmKGsuc3Ryb2tlU3R5bGU9dC5zdHlsZS5maWxsLGsuc3Ryb2tlVGV4dChsLG0sbikpfX19O3JldHVybiBofSgpO2YuQ2FudmFzQ29udGV4dD1kfSxmdW5jdGlvbihkLGYpe3ZhciBoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaygpe31rLmFwcGVuZD1mdW5jdGlvbih0LGwpe2Zvcih2YXIgcD1bXSxtPTI7bTxhcmd1bWVudHMubGVuZ3RoO20rKylwW20tMl09YXJndW1lbnRzW21dO3A9ay5jcmVhdGUuYXBwbHkoayxbbF0uY29uY2F0KHApKTt0LmFwcGVuZENoaWxkKHApO3JldHVybiBwfTtrLmNyZWF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGw9CltdLHA9MTtwPGFyZ3VtZW50cy5sZW5ndGg7cCsrKWxbcC0xXT1hcmd1bWVudHNbcF07cD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoay5TVkdfTlMsdCk7ay5hZGRDbGFzc2VzLmFwcGx5KGssW3BdLmNvbmNhdChsKSk7cmV0dXJuIHB9O2suYWRkQ2xhc3Nlcz1mdW5jdGlvbih0KXtmb3IodmFyIGw9W10scD0xO3A8YXJndW1lbnRzLmxlbmd0aDtwKyspbFtwLTFdPWFyZ3VtZW50c1twXTtsPWwuZmlsdGVyKGZ1bmN0aW9uKG0pe3JldHVybiBudWxsIT1tfSk7bnVsbCE9dC5jbGFzc0xpc3Q/bC5mb3JFYWNoKGZ1bmN0aW9uKG0pe3QuY2xhc3NMaXN0LmFkZChtKX0pOnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsbC5qb2luKCIgIikpfTtrLmdldERpbWVuc2lvbnM9ZnVuY3Rpb24odCl7aWYodC5nZXRCQm94KXRyeXt2YXIgbD10LmdldEJCb3goKTtyZXR1cm57d2lkdGg6bC53aWR0aCxoZWlnaHQ6bC5oZWlnaHR9fWNhdGNoKHApe31yZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19O3JldHVybiBrfSgpOwpoLlNWR19OUz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2YuU3ZnVXRpbHM9aDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gayh0LGwscCl7dm9pZCAwPT09cCYmKHA9ITEpO3ZhciBtPXRoaXM7dGhpcy5lbGVtZW50PXQ7dGhpcy5jbGFzc05hbWU9bDt0aGlzLmFkZFRpdGxlRWxlbWVudD1wO3RoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXt2YXIgbj1tLmdldFRleHRFbGVtZW50cyhtLmVsZW1lbnQpLHE9bi5wYXJlbnRFbGVtZW50LHU9bi5jb250YWluZXJFbGVtZW50LHg9bi50ZXh0RWxlbWVudDtyZXR1cm4gZnVuY3Rpb24oQSl7cS5hcHBlbmRDaGlsZCh1KTt4LnRleHRDb250ZW50PUE7QT1oLmdldERpbWVuc2lvbnMoeCk7cS5yZW1vdmVDaGlsZCh1KTtyZXR1cm4gQX19O3RoaXMuY3JlYXRlUGVuPWZ1bmN0aW9uKG4scSx1KXtudWxsPT11JiYodT1tLmVsZW1lbnQpO3U9aC5hcHBlbmQodSwiZyIsInRleHQtY29udGFpbmVyIixtLmNsYXNzTmFtZSk7bS5hZGRUaXRsZUVsZW1lbnQmJgooaC5hcHBlbmQodSwidGl0bGUiKS50ZXh0Q29udGVudD1uLHUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsbikpO249aC5hcHBlbmQodSwiZyIsInRleHQtYXJlYSIpO24uc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitxLnRyYW5zbGF0ZVswXSsiLCIrcS50cmFuc2xhdGVbMV0rIilyb3RhdGUoIisocS5yb3RhdGUrIikiKSk7cmV0dXJuIG0uY3JlYXRlU3ZnTGluZVBlbihuKX19ay5wcm90b3R5cGUuc2V0QWRkVGl0bGVFbGVtZW50PWZ1bmN0aW9uKHQpe3RoaXMuYWRkVGl0bGVFbGVtZW50PXR9O2sucHJvdG90eXBlLmNyZWF0ZVN2Z0xpbmVQZW49ZnVuY3Rpb24odCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKGwscCxtLG4pe3ZhciBxPWguYXBwZW5kKHQsInRleHQiLCJ0ZXh0LWxpbmUiKTtxLnRleHRDb250ZW50PWw7cS5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIixwKTtxLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbSsiLCIrbisiKSIpO3Euc2V0QXR0cmlidXRlKCJ5IiwKIi0wLjI1ZW0iKX19fTtrLnByb3RvdHlwZS5nZXRUZXh0RWxlbWVudHM9ZnVuY3Rpb24odCl7aWYoInRleHQiPT09dC50YWdOYW1lKXt2YXIgbD10LnBhcmVudEVsZW1lbnQ7bnVsbD09bCYmKGw9dC5wYXJlbnROb2RlKTtsLnJlbW92ZUNoaWxkKHQpO3JldHVybntjb250YWluZXJFbGVtZW50OnQscGFyZW50RWxlbWVudDpsLHRleHRFbGVtZW50OnR9fXZhciBwPXQucXVlcnlTZWxlY3RvcigidGV4dCIpO2lmKG51bGwhPXApcmV0dXJuIGw9dC5wYXJlbnRFbGVtZW50LG51bGw9PWwmJihsPXQucGFyZW50Tm9kZSksbC5yZW1vdmVDaGlsZCh0KSx7Y29udGFpbmVyRWxlbWVudDp0LHBhcmVudEVsZW1lbnQ6bCx0ZXh0RWxlbWVudDpwfTtsPWguY3JlYXRlKCJ0ZXh0Iix0aGlzLmNsYXNzTmFtZSk7cmV0dXJue2NvbnRhaW5lckVsZW1lbnQ6bCxwYXJlbnRFbGVtZW50OnQsdGV4dEVsZW1lbnQ6bH19O3JldHVybiBrfSgpO2YuU3ZnQ29udGV4dD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9CnRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMjEpLGw9aCgzNik7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZhciBxPXAuY2FsbCh0aGlzLG4pfHx0aGlzO3EuZGltQ2FjaGU9bmV3IHQuQ2FjaGUoZnVuY3Rpb24odSl7cmV0dXJuIHEuX21lYXN1cmVOb3RGcm9tQ2FjaGUodSl9KTtyZXR1cm4gcX1rKG0scCk7bS5wcm90b3R5cGUuX21lYXN1cmVOb3RGcm9tQ2FjaGU9ZnVuY3Rpb24obil7cmV0dXJuIHAucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLG4pfTttLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPWwuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCk7CnJldHVybiB0aGlzLmRpbUNhY2hlLmdldChuKX07bS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmRpbUNhY2hlLmNsZWFyKCk7cC5wcm90b3R5cGUucmVzZXQuY2FsbCh0aGlzKX07cmV0dXJuIG19KGgoNjApLkNhY2hlQ2hhcmFjdGVyTWVhc3VyZXIpO2YuQ2FjaGVNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCg1OSksdD1oKDYyKSxsPWgoNjQpLHA9aCg2Nik7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG0obil7dGhpcy5jb250ZXh0PW47dGhpcy5tZWFzdXJlcj1uZXcgdC5DYWNoZU1lYXN1cmVyKHRoaXMuY29udGV4dCk7dGhpcy53cmFwcGVyPW5ldyBsLldyYXBwZXI7dGhpcy53cml0ZXI9bmV3IHAuV3JpdGVyKHRoaXMubWVhc3VyZXIsdGhpcy5jb250ZXh0LHRoaXMud3JhcHBlcil9bS5zdmc9ZnVuY3Rpb24obixxLHUpe3JldHVybiBuZXcgbShuZXcgay5TdmdDb250ZXh0KG4scSx1KSl9O20uY2FudmFzPWZ1bmN0aW9uKG4scSx1KXtyZXR1cm4gbmV3IG0obmV3IGsuQ2FudmFzQ29udGV4dChuLApxLHUpKX07bS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24obixxLHUseCxBKXt0aGlzLndyaXRlci53cml0ZShuLHEsdSx4LEEpfTttLnByb3RvdHlwZS5jbGVhck1lYXN1cmVyQ2FjaGU9ZnVuY3Rpb24oKXt0aGlzLm1lYXN1cmVyLnJlc2V0KCl9O3JldHVybiBtfSgpO2YuVHlwZXNldHRlcj1kfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGspe3RoaXMuY2FjaGU9e307dGhpcy5jb21wdXRlPWt9aC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGspe3RoaXMuY2FjaGUuaGFzT3duUHJvcGVydHkoayl8fCh0aGlzLmNhY2hlW2tdPXRoaXMuY29tcHV0ZShrKSk7cmV0dXJuIHRoaXMuY2FjaGVba119O2gucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5jYWNoZT17fTtyZXR1cm4gdGhpc307cmV0dXJuIGh9KCk7Zi5DYWNoZT1kfSxmdW5jdGlvbihkLGYpe2YuTWV0aG9kcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5hcnJheUVxPWZ1bmN0aW9uKGssdCl7aWYobnVsbD09Cmt8fG51bGw9PXQpcmV0dXJuIGs9PT10O2lmKGsubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBsPTA7bDxrLmxlbmd0aDtsKyspaWYoa1tsXSE9PXRbbF0pcmV0dXJuITE7cmV0dXJuITB9O2gub2JqRXE9ZnVuY3Rpb24oayx0KXtpZihudWxsPT1rfHxudWxsPT10KXJldHVybiBrPT09dDt2YXIgbD1PYmplY3Qua2V5cyhrKS5zb3J0KCkscD1PYmplY3Qua2V5cyh0KS5zb3J0KCksbT1sLm1hcChmdW5jdGlvbihxKXtyZXR1cm4ga1txXX0pLG49cC5tYXAoZnVuY3Rpb24ocSl7cmV0dXJuIHRbcV19KTtyZXR1cm4gaC5hcnJheUVxKGwscCkmJmguYXJyYXlFcShtLG4pfTtoLnN0cmljdEVxPWZ1bmN0aW9uKGssdCl7cmV0dXJuIGs9PT10fTtoLmRlZmF1bHRzPWZ1bmN0aW9uKGspe2Zvcih2YXIgdD1bXSxsPTE7bDxhcmd1bWVudHMubGVuZ3RoO2wrKyl0W2wtMV09YXJndW1lbnRzW2xdO2lmKG51bGw9PWspdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7CnZhciBwPU9iamVjdChrKTt0LmZvckVhY2goZnVuY3Rpb24obSl7aWYobnVsbCE9bSlmb3IodmFyIG4gaW4gbSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxuKSYmKHBbbl09bVtuXSl9KTtyZXR1cm4gcH07cmV0dXJuIGh9KCl9LGZ1bmN0aW9uKGQsZil7Zi5TdHJpbmdNZXRob2RzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe31oLmNvbWJpbmVXaGl0ZXNwYWNlPWZ1bmN0aW9uKGspe3JldHVybiBrLnJlcGxhY2UoL1sgXHRdKy9nLCIgIil9O2guaXNOb3RFbXB0eVN0cmluZz1mdW5jdGlvbihrKXtyZXR1cm4gayYmIiIhPT1rLnRyaW0oKX07aC50cmltU3RhcnQ9ZnVuY3Rpb24oayx0KXtpZighaylyZXR1cm4gaztrPWsuc3BsaXQoIiIpO3ZhciBsPXQ/ZnVuY3Rpb24ocCl7cmV0dXJuIHAuc3BsaXQodCkuc29tZShoLmlzTm90RW1wdHlTdHJpbmcpfTpoLmlzTm90RW1wdHlTdHJpbmc7cmV0dXJuIGsucmVkdWNlKGZ1bmN0aW9uKHAsbSl7cmV0dXJuIGwocCttKT8KcCttOnB9LCIiKX07aC50cmltRW5kPWZ1bmN0aW9uKGssdCl7aWYoIWspcmV0dXJuIGs7az1rLnNwbGl0KCIiKTtrLnJldmVyc2UoKTtrPWgudHJpbVN0YXJ0KGsuam9pbigiIiksdCkuc3BsaXQoIiIpO2sucmV2ZXJzZSgpO3JldHVybiBrLmpvaW4oIiIpfTtyZXR1cm4gaH0oKX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe3RoaXMuV29yZERpdmlkZXJSZWdFeHA9L1xXLzt0aGlzLldoaXRlc3BhY2VSZWdFeHA9L1xzL31oLnByb3RvdHlwZS50b2tlbml6ZT1mdW5jdGlvbihrKXt2YXIgdD10aGlzO3JldHVybiBrLnNwbGl0KCIiKS5yZWR1Y2UoZnVuY3Rpb24obCxwKXtyZXR1cm4gbC5zbGljZSgwLC0xKS5jb25jYXQodC5zaG91bGRDcmVhdGVOZXdUb2tlbihsW2wubGVuZ3RoLTFdLHApKX0sWyIiXSl9O2gucHJvdG90eXBlLnNob3VsZENyZWF0ZU5ld1Rva2VuPWZ1bmN0aW9uKGssdCl7aWYoIWspcmV0dXJuW3RdO3ZhciBsPWtbay5sZW5ndGgtMV07cmV0dXJuIHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGwpJiYKdGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QodCk/W2srdF06dGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QobCl8fHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KHQpP1trLHRdOnRoaXMuV29yZERpdmlkZXJSZWdFeHAudGVzdChsKXx8dGhpcy5Xb3JkRGl2aWRlclJlZ0V4cC50ZXN0KHQpP2w9PT10P1trK3RdOltrLHRdOltrK3RdfTtyZXR1cm4gaH0oKTtmLlRva2VuaXplcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKGwsdCk7bC5wcm90b3R5cGUud3JhcD0KZnVuY3Rpb24ocCxtLG4scSl7ZnVuY3Rpb24gdShEKXtyZXR1cm4gdC5wcm90b3R5cGUud3JhcC5jYWxsKHgscCxtLEQscSl9dmFyIHg9dGhpczt2b2lkIDA9PT1xJiYocT1JbmZpbml0eSk7aWYoMTxwLnNwbGl0KCJcbiIpLmxlbmd0aCl0aHJvdyBFcnJvcigiU2luZ2xlTGluZVdyYXBwZXIgaXMgZGVzaWduZWQgdG8gd29yayBvbmx5IG9uIHNpbmdsZSBsaW5lIik7dmFyIEE9dShuKTtpZigyPkEubm9MaW5lcylyZXR1cm4gQTtmb3IodmFyIHk9MCx3PTA7dzxsLk5PX1dSQVBfSVRFUkFUSU9OUyYmbj55Oysrdyl7dmFyIEM9KG4reSkvMixHPXUoQyk7dGhpcy5hcmVTYW1lUmVzdWx0cyhBLEcpPyhuPUMsQT1HKTp5PUN9cmV0dXJuIEF9O2wucHJvdG90eXBlLmFyZVNhbWVSZXN1bHRzPWZ1bmN0aW9uKHAsbSl7cmV0dXJuIHAubm9MaW5lcz09PW0ubm9MaW5lcyYmcC50cnVuY2F0ZWRUZXh0PT09bS50cnVuY2F0ZWRUZXh0fTtyZXR1cm4gbH0oaCg2NSkuV3JhcHBlcik7ZC5OT19XUkFQX0lURVJBVElPTlM9CjU7Zi5TaW5nbGVMaW5lV3JhcHBlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgyMSksdD17dGV4dFJvdGF0aW9uOjAsdGV4dFNoZWFyOjAseEFsaWduOiJsZWZ0Iix5QWxpZ246InRvcCJ9O2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKHAsbSxuKXt0aGlzLl9tZWFzdXJlcj1wO3RoaXMuX3BlbkZhY3Rvcnk9bTt0aGlzLl93cmFwcGVyPW59bC5wcm90b3R5cGUubWVhc3VyZXI9ZnVuY3Rpb24ocCl7dGhpcy5fbWVhc3VyZXI9cDtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUud3JhcHBlcj1mdW5jdGlvbihwKXt0aGlzLl93cmFwcGVyPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnBlbkZhY3Rvcnk9ZnVuY3Rpb24ocCl7dGhpcy5fcGVuRmFjdG9yeT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihwLG0sbixxLHUpe3ZvaWQgMD09PXEmJihxPXt9KTtxPWsuTWV0aG9kcy5kZWZhdWx0cyh7fSx0LHEpO2lmKC0xPT09bC5TdXBwb3J0ZWRSb3RhdGlvbi5pbmRleE9mKHEudGV4dFJvdGF0aW9uKSl0aHJvdyBFcnJvcigidW5zdXBwb3J0ZWQgcm90YXRpb24gLSAiKwpxLnRleHRSb3RhdGlvbisiLiBTdXBwb3J0ZWQgcm90YXRpb25zIGFyZSAiK2wuU3VwcG9ydGVkUm90YXRpb24uam9pbigiLCAiKSk7aWYobnVsbCE9cS50ZXh0U2hlYXImJi04MD5xLnRleHRTaGVhcnx8ODA8cS50ZXh0U2hlYXIpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHNoZWFyIGFuZ2xlIC0gIitxLnRleHRTaGVhcisiLiBNdXN0IGJlIGJldHdlZW4gLTgwIGFuZCA4MCIpO3ZhciB4PTQ1PE1hdGguYWJzKE1hdGguYWJzKHEudGV4dFJvdGF0aW9uKS05MCksQT14P206bix5PXg/bjptLHc9cS50ZXh0U2hlYXIsQz13Kk1hdGguUEkvMTgwO3g9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDt2YXIgRz14Kk1hdGgudGFuKEMpO0E9QS9NYXRoLmNvcyhDKS1NYXRoLmFicyhHKTt2YXIgRD15Kk1hdGguY29zKEMpO3k9ay5TdHJpbmdNZXRob2RzLmNvbWJpbmVXaGl0ZXNwYWNlKHApO3k9KHRoaXMuX3dyYXBwZXI/dGhpcy5fd3JhcHBlci53cmFwKHksdGhpcy5fbWVhc3VyZXIsCkEsRCkud3JhcHBlZFRleHQ6eSkuc3BsaXQoIlxuIik7Qz1sLlhPZmZzZXRGYWN0b3JbcS54QWxpZ25dKkEqTWF0aC5zaW4oQyktbC5ZT2Zmc2V0RmFjdG9yW3EueUFsaWduXSooRC15Lmxlbmd0aCp4KTt3PXEudGV4dFJvdGF0aW9uK3c7c3dpdGNoKHEudGV4dFJvdGF0aW9uKXtjYXNlIDkwOm09W20rQywwXTticmVhaztjYXNlIC05MDptPVstQyxuXTticmVhaztjYXNlIDE4MDptPVttLG4rQ107YnJlYWs7ZGVmYXVsdDptPVswLC1DXX1wPXRoaXMuX3BlbkZhY3RvcnkuY3JlYXRlUGVuKHAse3RyYW5zbGF0ZTptLHJvdGF0ZTp3fSx1KTt0aGlzLndyaXRlTGluZXMoeSxwLEEseCxHLHEueEFsaWduKTtudWxsIT1wLmRlc3Ryb3kmJnAuZGVzdHJveSgpfTtsLnByb3RvdHlwZS53cml0ZUxpbmVzPWZ1bmN0aW9uKHAsbSxuLHEsdSx4KXtwLmZvckVhY2goZnVuY3Rpb24oQSx5KXttLndyaXRlKEEsbC5BbmNob3JDb252ZXJ0ZXJbeF0sKDA8dT8oeSsxKSp1OnkqdSkrbipsLlhPZmZzZXRGYWN0b3JbeF0sCih5KzEpKnEpfSl9O3JldHVybiBsfSgpO2QuU3VwcG9ydGVkUm90YXRpb249Wy05MCwwLDE4MCw5MF07ZC5BbmNob3JDb252ZXJ0ZXI9e2NlbnRlcjoibWlkZGxlIixsZWZ0OiJzdGFydCIscmlnaHQ6ImVuZCJ9O2QuWE9mZnNldEZhY3Rvcj17Y2VudGVyOi41LGxlZnQ6MCxyaWdodDoxfTtkLllPZmZzZXRGYWN0b3I9e2JvdHRvbToxLGNlbnRlcjouNSx0b3A6MH07Zi5Xcml0ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9aCg2OSk7ZD1oKDcpO2YuQW5pbWF0b3JzPWQ7ZD1oKDY3KTtmLkF4ZXM9ZDtkPWgoMzcpO2YuQ29tcG9uZW50cz1kO2Q9aCgyMyk7Zi5Db25maWdzPWQ7ZD1oKDgpO2YuRm9ybWF0dGVycz1kO2Q9aCgzMCk7Zi5SZW5kZXJDb250cm9sbGVyPWQ7ZD1oKDM5KTtmLlJlbmRlclBvbGljaWVzPWQ7ZD1oKDMxKTtmLlN5bWJvbEZhY3Rvcmllcz1kO2Q9aCgxMyk7Zi5EaXNwYXRjaGVycz0KZDtkPWgoMTQpO2YuRHJhd2Vycz1kO2Q9aCgyNSk7Zi5JbnRlcmFjdGlvbnM9ZDtkPWgoMTkpO2YuUGxvdHM9ZDtkPWgoMyk7Zi5TY2FsZXM9ZDtkPWgoMCk7Zi5VdGlscz1kO2soaCgyMikpO2Q9aCgyOCk7Zi5UaW1lSW50ZXJ2YWw9ZC5UaW1lSW50ZXJ2YWw7ayhoKDQpKTtrKGgoMjkpKTtrKGgoMzgpKTtkPWgoNjgpO2YudmVyc2lvbj1kLnZlcnNpb247ayhoKDI0KSk7ayhoKDYpKTtrKGgoMTUpKTtrKGgoNDApKTtrKGgoMTYpKTtrKGgoMikpO2soaCgxMSkpO2soaCgxNykpfV0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy9wbG90dGFibGUtaW50ZXJhY3Rpb25zLmpzCnZhciByZzsKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobSl7Y29uc3Qgbj1bXTtmb3IoO20mJm0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudDspaWYobi5wdXNoKG0pLG0uYXNzaWduZWRTbG90KW09bS5hc3NpZ25lZFNsb3Q7ZWxzZSBpZihtLnBhcmVudEVsZW1lbnQpbT1tLnBhcmVudEVsZW1lbnQ7ZWxzZXtjb25zdCBxPW0ucGFyZW50Tm9kZTttPXEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P3EuaG9zdDpxIT09bT9xOm51bGx9cmV0dXJuIG59ZnVuY3Rpb24gZihtKXt2YXIgbj1kKG0pO209aDtsZXQgcT1udWxsO2Zvcihjb25zdCB4IG9mIG4pe249UGxvdHRhYmxlLlV0aWxzLkRPTS5nZXRFbGVtZW50VHJhbnNmb3JtKHgpO2lmKG51bGwhPW4pe3ZhciB1PXguY2xpZW50V2lkdGgvMjtjb25zdCBBPXguY2xpZW50SGVpZ2h0LzI7bT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFt1LEFdKTttPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5TWF0cml4KG0sUGxvdHRhYmxlLlV0aWxzLk1hdGguaW52ZXJ0TWF0cml4KG4pKTsKbT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFstdSwtQV0pfW49eC5zY3JvbGxMZWZ0O3U9eC5zY3JvbGxUb3A7aWYobnVsbD09PXF8fHg9PT1xKW4tPXgub2Zmc2V0TGVmdCt4LmNsaWVudExlZnQsdS09eC5vZmZzZXRUb3AreC5jbGllbnRUb3AscT14Lm9mZnNldFBhcmVudDttPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKG0sW24sdV0pfXJldHVybiBtfWNvbnN0IGg9WzEsMCwwLDEsMCwwXTtjbGFzcyBrIGV4dGVuZHMgUGxvdHRhYmxlLlV0aWxzLlRyYW5zbGF0b3J7Y29tcHV0ZVBvc2l0aW9uKG0sbil7bT17eDptLHk6bn07bj1mKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09bj9tOlBsb3R0YWJsZS5VdGlscy5NYXRoLmFwcGx5VHJhbnNmb3JtKG4sbSl9fWNsYXNzIHQgZXh0ZW5kcyBQbG90dGFibGUuRGlzcGF0Y2hlcnMuTW91c2V7Y29uc3RydWN0b3IobSl7c3VwZXIobSk7dGhpcy5fZXZlbnRUYXJnZXQ9bS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7CnRoaXMuX3RyYW5zbGF0b3I9bmV3IGsobS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKG0pe2NvbnN0IG49bS5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgcT1uW3QuX0RJU1BBVENIRVJfS0VZXTtxfHwocT1uZXcgdChtKSxuW3QuX0RJU1BBVENIRVJfS0VZXT1xKTtyZXR1cm4gcX19Y2xhc3MgbCBleHRlbmRzIFBsb3R0YWJsZS5EaXNwYXRjaGVycy5Ub3VjaHtjb25zdHJ1Y3RvcihtKXtzdXBlcihtKTt0aGlzLl9ldmVudFRhcmdldD1tLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt0aGlzLl90cmFuc2xhdG9yPW5ldyBrKG0ucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKX1zdGF0aWMgZ2V0RGlzcGF0Y2hlcihtKXtjb25zdCBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCk7bGV0IHE9bltsLl9ESVNQQVRDSEVSX0tFWV07cXx8KHE9bmV3IGwobSksbltsLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9fVBsb3R0YWJsZS5JbnRlcmFjdGlvbi5wcm90b3R5cGUuX2lzSW5zaWRlQ29tcG9uZW50PQpmdW5jdGlvbihtKXtyZXR1cm4gMDw9bS54JiYwPD1tLnkmJm0ueDx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJm0ueTx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtjbGFzcyBwIGV4dGVuZHMgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5Qb2ludGVye19hbmNob3IoKXt0aGlzLl9pc0FuY2hvcmVkPSEwO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj10LmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX19Yi5Qb2ludGVySW50ZXJhY3Rpb249cH0pKHJnfHwocmc9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1jaGFydC1oZWxwZXJzL3Z6LWNoYXJ0LWhlbHBlcnMuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoKXtsZXQgdD1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7dC50aWNrR2VuZXJhdG9yKCk7bGV0IGw9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModCwiYm90dG9tIik7bC5mb3JtYXR0ZXIoYi5zdGVwRm9ybWF0dGVyKTtyZXR1cm57c2NhbGU6dCxheGlzOmwsYWNjZXNzb3I6cD0+cC5zdGVwfX1mdW5jdGlvbiBmKCl7bGV0IHQ9bmV3IFBsb3R0YWJsZS5TY2FsZXMuVGltZTtyZXR1cm57c2NhbGU6dCxheGlzOm5ldyBQbG90dGFibGUuQXhlcy5UaW1lKHQsImJvdHRvbSIpLGFjY2Vzc29yOmw9Pmwud2FsbF90aW1lfX1mdW5jdGlvbiBoKCl7bGV0IHQ9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTp0LGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModCwiYm90dG9tIiksYWNjZXNzb3I6Yi5yZWxhdGl2ZUFjY2Vzc29yfX1iLlNZTUJPTFNfTElTVD1be2NoYXJhY3RlcjoiXHUyNWZjIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5zcXVhcmV9LAp7Y2hhcmFjdGVyOiJcdTI1YzYiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLmRpYW1vbmR9LHtjaGFyYWN0ZXI6Ilx1MjViMiIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMudHJpYW5nbGV9LHtjaGFyYWN0ZXI6Ilx1MjYwNSIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuc3Rhcn0se2NoYXJhY3RlcjoiXHUyNzFhIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5jcm9zc31dO2xldCBrOyhmdW5jdGlvbih0KXt0LlNURVA9InN0ZXAiO3QuUkVMQVRJVkU9InJlbGF0aXZlIjt0LldBTExfVElNRT0id2FsbF90aW1lIn0pKGs9Yi5YVHlwZXx8KGIuWFR5cGU9e30pKTtiLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OPTQ7Yi5TVEVQX0ZPUk1BVFRFUl9QUkVDSVNJT049NDtiLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OPTM7Yi5UT09MVElQX1lfUElYRUxfT0ZGU0VUPTIwO2IuVE9PTFRJUF9DSVJDTEVfU0laRT00O2IuTkFOX1NZTUJPTF9TSVpFPQo2O2IubXVsdGlzY2FsZUZvcm1hdHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbD0+e2xldCBwPU1hdGguYWJzKGwpOzFFLTE1PnAmJihwPTApO3JldHVybigxRTQ8PXA/ZDMuZm9ybWF0KCIuIit0KyJ+ZSIpOjA8cCYmLjAxPnA/ZDMuZm9ybWF0KCIuIit0KyJ+ZSIpOmQzLmZvcm1hdCgiLiIrdCsifmciKSkobCl9fTtiLmNvbXB1dGVEb21haW49ZnVuY3Rpb24odCxsKXt0PXQuZmlsdGVyKG49PmlzRmluaXRlKG4pKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuWy0uMSwxLjFdO2w/KHQ9Xy5zb3J0QnkodCksbD1kMy5xdWFudGlsZSh0LC4wNSksdD1kMy5xdWFudGlsZSh0LC45NSkpOihsPWQzLm1pbih0KSx0PWQzLm1heCh0KSk7bGV0IHAsbT10LWw7cD0wPT09bT8xLjEqTWF0aC5hYnMobCkrMS4xOi4yKm07bD1bMDw9bCYmbDxtPy0uMSp0OmwtcCx0K3BdO3JldHVybiBsPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGwpLm5pY2UoKS5kb21haW4oKX07Yi5hY2Nlc3Nvcml6ZT1mdW5jdGlvbih0KXtyZXR1cm4gbD0+CmxbdF19O2Iuc3RlcEZvcm1hdHRlcj1kMy5mb3JtYXQoYC4ke2IuU1RFUF9GT1JNQVRURVJfUFJFQ0lTSU9OfX5zYCk7Yi5zdGVwWD1kO2IudGltZUZvcm1hdHRlcj1QbG90dGFibGUuRm9ybWF0dGVycy50aW1lKCIlYSAlYiAlZSwgJUg6JU06JVMiKTtiLndhbGxYPWY7Yi5yZWxhdGl2ZUFjY2Vzc29yPSh0LGwscCk9PntpZihudWxsIT10LnJlbGF0aXZlKXJldHVybiB0LnJlbGF0aXZlO2w9cC5kYXRhKCk7cmV0dXJuKCt0LndhbGxfdGltZS0oMDxsLmxlbmd0aD8rbFswXS53YWxsX3RpbWU6MCkpLzM2RTV9O2IucmVsYXRpdmVGb3JtYXR0ZXI9dD0+e2xldCBsPSIiLHA9TWF0aC5mbG9vcih0LzI0KTt0LT0yNCpwO3AmJihsKz1wKyJkICIpO2xldCBtPU1hdGguZmxvb3IodCk7dD02MCoodC1tKTtpZihtfHxwKWwrPW0rImggIjtsZXQgbj1NYXRoLmZsb29yKHQpO3Q9NjAqKHQtbik7aWYobnx8bXx8cClsKz1uKyJtICI7cmV0dXJuIGwrTWF0aC5mbG9vcih0KSsicyJ9O2IucmVsYXRpdmVYPQpoO2IuZ2V0WENvbXBvbmVudHM9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2Ugay5TVEVQOnJldHVybiBkKCk7Y2FzZSBrLldBTExfVElNRTpyZXR1cm4gZigpO2Nhc2Ugay5SRUxBVElWRTpyZXR1cm4gaCgpO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImludmFsaWQgeFR5cGU6ICIrdCk7fX19KShyZ3x8KHJnPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy92ei1jaGFydC10b29sdGlwLmpzCnZhciBFaDsKKGZ1bmN0aW9uKGIpe2xldCBkOyhmdW5jdGlvbihoKXtoLkFVVE89ImF1dG8iO2guQk9UVE9NPSJib3R0b20iO2guUklHSFQ9InJpZ2h0In0pKGQ9Yi5Ub29sdGlwUG9zaXRpb258fChiLlRvb2x0aXBQb3NpdGlvbj17fSkpO2NvbnN0IGY9e2JveFNoYWRvdzoiMCAxcHggNHB4IHJnYmEoMCwgMCwgMCwgLjMpIixvcGFjaXR5OjAscG9zaXRpb246ImZpeGVkIix3aWxsQ2hhbmdlOiJ0cmFuc2Zvcm0iLHpJbmRleDo1fTtQb2x5bWVyKHtpczoidnotY2hhcnQtdG9vbHRpcCIsX3RlbXBsYXRlOm51bGwscHJvcGVydGllczp7Y29udGVudENvbXBvbmVudE5hbWU6U3RyaW5nLHBvc2l0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZTpkLkFVVE99LG1pbkRpc3RGcm9tRWRnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTV9fSxyZWFkeSgpe3RoaXMuX3R1bm5lbD10aGlzLl9yYWY9dGhpcy5fc3R5bGVDYWNoZT1udWxsfSxhdHRhY2hlZCgpe3RoaXMuX3R1bm5lbD10aGlzLl9jcmVhdGVUdW5uZWwoKTt0aGlzLl9oaWRlT25CbHVyPQooKT0+e2RvY3VtZW50LmhpZGRlbiYmdGhpcy5oaWRlKCl9O3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9oaWRlT25CbHVyKX0sZGV0YWNoZWQoKXt0aGlzLmhpZGUoKTt0aGlzLl9yZW1vdmVUdW5uZWwodGhpcy5fdHVubmVsKTt0aGlzLl90dW5uZWw9bnVsbDt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdGhpcy5faGlkZU9uQmx1cil9LGNvbnRlbnQoKXtyZXR1cm4gdGhpcy5fdHVubmVsLnNoYWRvd1Jvb3R9LGhpZGUoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmKTt0aGlzLl9zdHlsZUNhY2hlPW51bGw7dGhpcy5fdHVubmVsLnN0eWxlLm9wYWNpdHk9MH0sdXBkYXRlQW5kUG9zaXRpb24oaCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JhZik7dGhpcy5fcmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX3JlcG9zaXRpb25JbXBsKGgpfSl9LApfcmVwb3NpdGlvbkltcGwoaCl7Y29uc3Qgaz10aGlzLl90dW5uZWw7aD1oLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IHQ9ay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxsPXdpbmRvdy5pbm5lckhlaWdodCxwPWRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsbT1oLnRvcCxuPW0raC5oZWlnaHQscT10LmhlaWdodCtyZy5UT09MVElQX1lfUElYRUxfT0ZGU0VUO2xldCB1PW51bGwseD1NYXRoLm1heCh0aGlzLm1pbkRpc3RGcm9tRWRnZSxoLmxlZnQpLEE9bnVsbCx5PW07dGhpcy5wb3NpdGlvbj09ZC5SSUdIVD94PWgucmlnaHQ6KHk9bityZy5UT09MVElQX1lfUElYRUxfT0ZGU0VULHA8eCt0LndpZHRoK3RoaXMubWluRGlzdEZyb21FZGdlJiYoeD1udWxsLEE9dGhpcy5taW5EaXN0RnJvbUVkZ2UpKTt0aGlzLnBvc2l0aW9uPT1kLkFVVE8mJjA8aC50b3AtcSYmbDxoLnRvcCtoLmhlaWdodCtxJiYoeT1udWxsLHU9bC1tK3JnLlRPT0xUSVBfWV9QSVhFTF9PRkZTRVQpO2g9e29wYWNpdHk6MSwKbGVmdDp4P2Ake3h9cHhgOm51bGwscmlnaHQ6QT9gJHtBfXB4YDpudWxsLHRvcDp5P2Ake3l9cHhgOm51bGwsYm90dG9tOnU/YCR7dX1weGA6bnVsbH07Xy5pc0VxdWFsKHRoaXMuX3N0eWxlQ2FjaGUsaCl8fChPYmplY3QuYXNzaWduKGsuc3R5bGUsaCksdGhpcy5fc3R5bGVDYWNoZT1oKX0sX2NyZWF0ZVR1bm5lbCgpe2lmKCF0aGlzLmNvbnRlbnRDb21wb25lbnROYW1lKXRocm93IG5ldyBSYW5nZUVycm9yKCJSZXF1aXJlIGBjb250ZW50Q29tcG9uZW50TmFtZWAgdG8gYmUgYSBuYW1lIG9mIGEgUG9seW1lciBjb21wb25lbnQiKTtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSk7T2JqZWN0LmFzc2lnbihoLnN0eWxlLGYpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7cmV0dXJuIGh9LF9yZW1vdmVUdW5uZWwoaCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChoKX19KX0pKEVofHwoRWg9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0L2RyYWdab29tSW50ZXJhY3Rpb24uanMKdmFyIEZoOwooZnVuY3Rpb24oYil7Y2xhc3MgZCBleHRlbmRzIFBsb3R0YWJsZS5Db21wb25lbnRzLlNlbGVjdGlvbkJveExheWVye2NvbnN0cnVjdG9yKGYsaCxrKXtzdXBlcigpO3RoaXMuZWFzZUZuPWQzLmVhc2VDdWJpY0luT3V0O3RoaXMuX2FuaW1hdGlvblRpbWU9NzUwO3RoaXMueFNjYWxlKGYpO3RoaXMueVNjYWxlKGgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbj1uZXcgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5EcmFnO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb249bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuQ2xpY2s7dGhpcy5zZXR1cENhbGxiYWNrcygpO3RoaXMudW56b29tTWV0aG9kPWs7dGhpcy5vbkRldGFjaCgoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2hGcm9tKCl9KTt0aGlzLm9uQW5jaG9yKCgpPT57dGhpcy5fZG91YmxlQ2xpY2tJbnRlcmFjdGlvbi5hdHRhY2hUbyh0aGlzKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyl9KX1pbnRlcmFjdGlvblN0YXJ0KGYpe3RoaXMub25TdGFydD0KZn1pbnRlcmFjdGlvbkVuZChmKXt0aGlzLm9uRW5kPWZ9ZHJhZ0ludGVyYWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn1zZXR1cENhbGxiYWNrcygpe2xldCBmPSExO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydChoPT57dGhpcy5ib3VuZHMoe3RvcExlZnQ6aCxib3R0b21SaWdodDpofSk7dGhpcy5vblN0YXJ0KCl9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKChoLGspPT57dGhpcy5ib3VuZHMoe3RvcExlZnQ6aCxib3R0b21SaWdodDprfSk7dGhpcy5ib3hWaXNpYmxlKCEwKTtmPSEwfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZCgoaCxrKT0+e3RoaXMuYm94VmlzaWJsZSghMSk7dGhpcy5ib3VuZHMoe3RvcExlZnQ6aCxib3R0b21SaWdodDprfSk7aWYoZil0aGlzLnpvb20oKTtlbHNlIHRoaXMub25FbmQoKTtmPSExfSk7dGhpcy5fZG91YmxlQ2xpY2tJbnRlcmFjdGlvbi5vbkRvdWJsZUNsaWNrKHRoaXMudW56b29tLmJpbmQodGhpcykpfWFuaW1hdGlvblRpbWUoZil7aWYobnVsbD09CmYpcmV0dXJuIHRoaXMuX2FuaW1hdGlvblRpbWU7aWYoMD5mKXRocm93IEVycm9yKCJhbmltYXRpb25UaW1lIGNhbm5vdCBiZSBuZWdhdGl2ZSIpO3RoaXMuX2FuaW1hdGlvblRpbWU9ZjtyZXR1cm4gdGhpc31lYXNlKGYpe2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgZil0aHJvdyBFcnJvcigiZWFzZSBmdW5jdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24iKTswPT09ZigwKSYmMT09PWYoMSl8fFBsb3R0YWJsZS5VdGlscy5XaW5kb3cud2FybigiRWFzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IG1haW50YWluIGludmFyaWFudCBmKDApXHgzZFx4M2QwIFx4MjZceDI2IGYoMSlceDNkXHgzZDEuIEJhZCBiZWhhdmlvciBtYXkgcmVzdWx0LiIpO3RoaXMuZWFzZUZuPWY7cmV0dXJuIHRoaXN9em9vbSgpe2xldCBmPXRoaXMueEV4dGVudCgpWzBdLnZhbHVlT2YoKSxoPXRoaXMueEV4dGVudCgpWzFdLnZhbHVlT2YoKSxrPXRoaXMueUV4dGVudCgpWzFdLnZhbHVlT2YoKSx0PXRoaXMueUV4dGVudCgpWzBdLnZhbHVlT2YoKTsKZiE9PWgmJmshPT10JiZ0aGlzLmludGVycG9sYXRlWm9vbShmLGgsayx0KX11bnpvb20oKXt2YXIgZj10aGlzLnhTY2FsZSgpO2YuX2RvbWFpbk1pbj1udWxsO2YuX2RvbWFpbk1heD1udWxsO2Y9Zi5fZ2V0RXh0ZW50KCk7dGhpcy54U2NhbGUoKS5kb21haW4oZik7dGhpcy51bnpvb21NZXRob2QoKX1pc1pvb21pbmcoZil7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQoIWYpO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uZW5hYmxlZCghZil9aW50ZXJwb2xhdGVab29tKGYsaCxrLHQpe2xldCBsPXRoaXMueFNjYWxlKCkuZG9tYWluKClbMF0udmFsdWVPZigpLHA9dGhpcy54U2NhbGUoKS5kb21haW4oKVsxXS52YWx1ZU9mKCksbT10aGlzLnlTY2FsZSgpLmRvbWFpbigpWzBdLnZhbHVlT2YoKSxuPXRoaXMueVNjYWxlKCkuZG9tYWluKClbMV0udmFsdWVPZigpLHE9dGhpcy5lYXNlRm4sdT0oeSx3LEMpPT5kMy5pbnRlcnBvbGF0ZU51bWJlcih5LHcpKHEoQykpO3RoaXMuaXNab29taW5nKCEwKTsKbGV0IHg9RGF0ZS5ub3coKSxBPSgpPT57dmFyIHk9RGF0ZS5ub3coKS14O3k9MD09PXRoaXMuX2FuaW1hdGlvblRpbWU/MTpNYXRoLm1pbigxLHkvdGhpcy5fYW5pbWF0aW9uVGltZSk7bGV0IHc9dShsLGYseSksQz11KHAsaCx5KSxHPXUobSxrLHkpLEQ9dShuLHQseSk7dGhpcy54U2NhbGUoKS5kb21haW4oW3csQ10pO3RoaXMueVNjYWxlKCkuZG9tYWluKFtHLERdKTsxPnk/UGxvdHRhYmxlLlV0aWxzLkRPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbChBKToodGhpcy5vbkVuZCgpLHRoaXMuaXNab29taW5nKCExKSl9O0EoKX19Yi5EcmFnWm9vbUxheWVyPWR9KShGaHx8KEZoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvcGFuWm9vbURyYWdMYXllci5qcwp2YXIgR2g7CihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oaCl7aFtoLk5PTkU9MF09Ik5PTkUiO2hbaC5EUkFHX1pPT01JTkc9MV09IkRSQUdfWk9PTUlORyI7aFtoLlBBTk5JTkc9Ml09IlBBTk5JTkcifSkoZHx8KGQ9e30pKTtjbGFzcyBmIGV4dGVuZHMgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXB7Y29uc3RydWN0b3IoaCxrLHQpe3N1cGVyKCk7dGhpcy5zdGF0ZT1kLk5PTkU7dGhpcy5wYW5TdGFydENhbGxiYWNrPW5ldyBQbG90dGFibGUuVXRpbHMuQ2FsbGJhY2tTZXQ7dGhpcy5wYW5FbmRDYWxsYmFjaz1uZXcgUGxvdHRhYmxlLlV0aWxzLkNhbGxiYWNrU2V0O3RoaXMucGFuWm9vbT1uZXcgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5QYW5ab29tKGgsayk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm1vdXNlRmlsdGVyKHA9PmYuaXNQYW5LZXkocCkmJjA9PT1wLmJ1dHRvbik7dGhpcy5wYW5ab29tLndoZWVsRmlsdGVyKHRoaXMuY2FuU2Nyb2xsWm9vbSk7dGhpcy5kcmFnWm9vbUxheWVyPW5ldyBGaC5EcmFnWm9vbUxheWVyKGgsCmssdCk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm1vdXNlRmlsdGVyKHA9PiFmLmlzUGFuS2V5KHApJiYwPT09cC5idXR0b24pO3RoaXMuYXBwZW5kKHRoaXMuZHJhZ1pvb21MYXllcik7Y29uc3QgbD10aGlzLm9uV2hlZWwuYmluZCh0aGlzKTt0aGlzLm9uQW5jaG9yKCgpPT57dGhpcy5fbW91c2VEaXNwYXRjaGVyPVBsb3R0YWJsZS5EaXNwYXRjaGVycy5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKGwpO3RoaXMucGFuWm9vbS5hdHRhY2hUbyh0aGlzKX0pO3RoaXMub25EZXRhY2goKCk9Pnt0aGlzLnBhblpvb20uZGV0YWNoRnJvbSgpO3RoaXMuX21vdXNlRGlzcGF0Y2hlciYmKHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbChsKSx0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbCl9KTt0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCk9Pnt0aGlzLnN0YXRlPT1kLk5PTkUmJgp0aGlzLnNldFN0YXRlKGQuUEFOTklORyl9KTt0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnRW5kKCgpPT57dGhpcy5zdGF0ZT09ZC5QQU5OSU5HJiZ0aGlzLnNldFN0YXRlKGQuTk9ORSl9KTt0aGlzLmRyYWdab29tTGF5ZXIuZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCk9Pnt0aGlzLnN0YXRlPT1kLk5PTkUmJnRoaXMuc2V0U3RhdGUoZC5EUkFHX1pPT01JTkcpfSk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ0VuZCgoKT0+e3RoaXMuc3RhdGU9PWQuRFJBR19aT09NSU5HJiZ0aGlzLnNldFN0YXRlKGQuTk9ORSl9KX1vbldoZWVsKGgsayl7aWYoIXRoaXMuY2FuU2Nyb2xsWm9vbShrKSYmKGg9dGhpcy5lbGVtZW50KCksaC5zZWxlY3QoIi5oZWxwIikuZW1wdHkoKSkpe3ZhciB0PWguYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJoZWxwIiwhMCk7dC5hcHBlbmQoInNwYW4iKS50ZXh0KCJBbHQgKyBTY3JvbGwgdG8gWm9vbSIpOwp0Lm9uKCJhbmltYXRpb25lbmQiLCgpPT52b2lkIHQucmVtb3ZlKCkpfX1zdGF0aWMgaXNQYW5LZXkoaCl7cmV0dXJuISFoLmFsdEtleXx8ISFoLnNoaWZ0S2V5fWNhblNjcm9sbFpvb20oaCl7cmV0dXJuIGguYWx0S2V5fXNldFN0YXRlKGgpe2lmKHRoaXMuc3RhdGUhPWgpe3ZhciBrPXRoaXMuc3RhdGU7dGhpcy5zdGF0ZT1oO3RoaXMucm9vdCgpLnJlbW92ZUNsYXNzKHRoaXMuc3RhdGVDbGFzc05hbWUoaykpO3RoaXMucm9vdCgpLmFkZENsYXNzKHRoaXMuc3RhdGVDbGFzc05hbWUoaCkpO2s9PWQuUEFOTklORyYmdGhpcy5wYW5FbmRDYWxsYmFjay5jYWxsQ2FsbGJhY2tzKCk7aD09ZC5QQU5OSU5HJiZ0aGlzLnBhblN0YXJ0Q2FsbGJhY2suY2FsbENhbGxiYWNrcygpfX1zdGF0ZUNsYXNzTmFtZShoKXtzd2l0Y2goaCl7Y2FzZSBkLlBBTk5JTkc6cmV0dXJuInBhbm5pbmciO2Nhc2UgZC5EUkFHX1pPT01JTkc6cmV0dXJuImRyYWctem9vbWluZyI7ZGVmYXVsdDpyZXR1cm4iIn19b25QYW5TdGFydChoKXt0aGlzLnBhblN0YXJ0Q2FsbGJhY2suYWRkKGgpfW9uUGFuRW5kKGgpe3RoaXMucGFuRW5kQ2FsbGJhY2suYWRkKGgpfW9uU2Nyb2xsWm9vbShoKXt0aGlzLnBhblpvb20ub25ab29tRW5kKGgpfW9uRHJhZ1pvb21TdGFydChoKXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25TdGFydChoKX1vbkRyYWdab29tRW5kKGgpe3RoaXMuZHJhZ1pvb21MYXllci5pbnRlcmFjdGlvbkVuZChoKX19CmIuUGFuWm9vbURyYWdMYXllcj1mfSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3RmLXNjYWxlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgUGxvdHRhYmxlLlF1YW50aXRhdGl2ZVNjYWxle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTt0aGlzLl9pZ25vcmVPdXRsaWVyPSExfXNldFZhbHVlUHJvdmlkZXJGb3JEb21haW4oZil7dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj1mfWlnbm9yZU91dGxpZXIoZil7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZj8odGhpcy5faWdub3JlT3V0bGllcj1mLHRoaXMpOnRoaXMuX2lnbm9yZU91dGxpZXJ9X2dldEFsbEluY2x1ZGVkVmFsdWVzKCl7Y29uc3QgZj10aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluP3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4oKTpbXTtyZXR1cm4gdGhpcy5leHRlbnRPZlZhbHVlcyhmKX19Yi5UZlNjYWxlPWR9KShHaHx8KEdoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvbGluZWFyLXNjYWxlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXJ7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX2lnbm9yZU91dGxpZXI9ITE7dGhpcy5wYWRQcm9wb3J0aW9uKC4yKX1zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKGYpe3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW49Zn1fbmljZURvbWFpbihmLGgpe2NvbnN0IFtrLHRdPWYsbD10LWs7Zj0wPT09bD8xLjEqTWF0aC5hYnMoaykrMS4xOmwqdGhpcy5wYWRQcm9wb3J0aW9uKCk7cmV0dXJuIHN1cGVyLl9uaWNlRG9tYWluKFswPD1rJiZrPGw/LS4xKnQ6ay1mLHQrZl0saCl9X2dldFVuYm91bmRlZEV4dGVudChmKXtmPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKGYpO2xldCBoPXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09Zi5sZW5ndGgmJihmPVtQbG90dGFibGUuVXRpbHMuTWF0aC5taW4oZixoWzBdKSxQbG90dGFibGUuVXRpbHMuTWF0aC5tYXgoZixoWzFdKV0saD10aGlzLl9uaWNlRG9tYWluKGYpKTsKcmV0dXJuIGh9X2dldEFsbEluY2x1ZGVkVmFsdWVzKCl7Y29uc3QgZj10aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluP3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4oKTpbXTtyZXR1cm4gdGhpcy5leHRlbnRPZlZhbHVlcyhmKX1leHRlbnRPZlZhbHVlcyhmKXt2YXIgaD1mPWYuZmlsdGVyKGs9PlBsb3R0YWJsZS5VdGlscy5NYXRoLmlzVmFsaWROdW1iZXIoaykpO2lmKHRoaXMuaWdub3JlT3V0bGllcigpKXtoPWYuc29ydCgobCxwKT0+bC1wKTtjb25zdCBrPWQzLnF1YW50aWxlKGgsLjA1KSx0PWQzLnF1YW50aWxlKGgsLjk1KTtoPWYuZmlsdGVyKGw9Pmw+PWsmJmw8PXQpfWY9ZDMuZXh0ZW50KGgpO3JldHVybiBudWxsPT1mWzBdfHxudWxsPT1mWzFdP1tdOmZ9aWdub3JlT3V0bGllcihmKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBmPyh0aGlzLl9pZ25vcmVPdXRsaWVyPWYsdGhpcyk6dGhpcy5faWdub3JlT3V0bGllcn19Yi5MaW5lYXJTY2FsZT1kfSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xvZy1zY2FsZS5qcwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChrKXtyZXR1cm4gTWF0aC5sb2cxMChrKX1mdW5jdGlvbiBmKGspe3JldHVybiBNYXRoLnBvdygxMCxrKX1iLk1JTl9QT1NJVElWRV9WQUxVRT1NYXRoLnBvdygyLC0xMDc0KTtjbGFzcyBoIGV4dGVuZHMgYi5UZlNjYWxle2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9kM0xvZ1NjYWxlPWQzLnNjYWxlTG9nKCk7dGhpcy5wYWRQcm9wb3J0aW9uKC4yKX1zY2FsZShrKXtyZXR1cm4gMD49az9OYU46dGhpcy5fZDNMb2dTY2FsZShrKX1pbnZlcnQoayl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUuaW52ZXJ0KGspfXNjYWxlVHJhbnNmb3JtYXRpb24oayl7cmV0dXJuIHRoaXMuc2NhbGUoayl9aW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbihrKXtyZXR1cm4gdGhpcy5pbnZlcnQoayl9Z2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKXtyZXR1cm4gdGhpcy5kb21haW4oKX1fZ2V0RG9tYWluKCl7cmV0dXJuIHRoaXMuX3VudHJhbnNmb3JtZWREb21haW59X3NldERvbWFpbihrKXt0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluPQprO2NvbnN0IFt0LGxdPWs7c3VwZXIuX3NldERvbWFpbihbTWF0aC5tYXgoYi5NSU5fUE9TSVRJVkVfVkFMVUUsdCksbF0pfV9uaWNlRG9tYWluKGspe2NvbnN0IFt0LGxdPWs7az1NYXRoLm1heChkKGIuTUlOX1BPU0lUSVZFX1ZBTFVFKSxkKHQpKTtjb25zdCBwPWQobCk7dmFyIG09cC1rO209bT9tKnRoaXMucGFkUHJvcG9ydGlvbigpOjE7cmV0dXJuW2YoTWF0aC5tYXgoZChiLk1JTl9QT1NJVElWRV9WQUxVRSksay1tKSksZihwK20pXX1fZ2V0VW5ib3VuZGVkRXh0ZW50KGspe2s9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoayk7bGV0IHQ9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1rLmxlbmd0aCYmKGs9W1Bsb3R0YWJsZS5VdGlscy5NYXRoLm1pbihrLHRbMF0pLFBsb3R0YWJsZS5VdGlscy5NYXRoLm1heChrLHRbMV0pXSx0PXRoaXMuX25pY2VEb21haW4oaykpO3JldHVybiB0fV9nZXRBbGxJbmNsdWRlZFZhbHVlcygpe3JldHVybiBzdXBlci5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKS5tYXAoaz0+CjA8az9rOmIuTUlOX1BPU0lUSVZFX1ZBTFVFKX1fZGVmYXVsdEV4dGVudCgpe3JldHVyblsxLDEwXX1fYmFja2luZ1NjYWxlRG9tYWluKGspe2lmKG51bGw9PWspcmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNMb2dTY2FsZS5kb21haW4oayk7cmV0dXJuIHRoaXN9X2dldFJhbmdlKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUucmFuZ2UoKX1fc2V0UmFuZ2Uoayl7dGhpcy5fZDNMb2dTY2FsZS5yYW5nZShrKX1kZWZhdWx0VGlja3MoKXtyZXR1cm4gdGhpcy5fZDNMb2dTY2FsZS50aWNrcygpfXRpY2tzKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoKX1leHRlbnRPZlZhbHVlcyhrKXtsZXQgdD1rPWsuZmlsdGVyKGw9PlBsb3R0YWJsZS5VdGlscy5NYXRoLmlzVmFsaWROdW1iZXIobCkmJjA8bCk7aWYodGhpcy5pZ25vcmVPdXRsaWVyKCkpe2s9ay5tYXAoZCkuc29ydCgobSxuKT0+bS1uKTtjb25zdCBsPWQzLnF1YW50aWxlKGssLjA1KSxwPWQzLnF1YW50aWxlKGssCi45NSk7dD1rLmZpbHRlcihtPT5tPj1sJiZtPD1wKS5tYXAoZil9az1kMy5leHRlbnQodCk7cmV0dXJuIG51bGw9PWtbMF18fG51bGw9PWtbMV0/W106a319Yi5Mb2dTY2FsZT1ofSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xpbmUtY2hhcnQuanMKKGZ1bmN0aW9uKGIpe2xldCBkOyhmdW5jdGlvbihrKXtrW2suVEVYVD0wXT0iVEVYVCI7a1trLkRPTT0xXT0iRE9NIn0pKGR8fChkPXt9KSk7bGV0IGY7KGZ1bmN0aW9uKGspe2suTE9HPSJsb2ciO2suTElORUFSPSJsaW5lYXIifSkoZnx8KGY9e30pKTtjbGFzcyBoe2NvbnN0cnVjdG9yKGssdCxsLHAsbSxuLHEsdSx4LEEseSl7dGhpcy5zZXJpZXNOYW1lcz1bXTt0aGlzLm5hbWUyZGF0YXNldHM9e307dGhpcy5jb2xvclNjYWxlPXA7dGhpcy50b29sdGlwPW07dGhpcy5kYXRhc2V0cz1bXTt0aGlzLl9pZ25vcmVZT3V0bGllcnM9ITE7dGhpcy5sYXN0UG9pbnRzRGF0YXNldD1uZXcgUGxvdHRhYmxlLkRhdGFzZXQ7dGhpcy5uYW5EYXRhc2V0PW5ldyBQbG90dGFibGUuRGF0YXNldDt0aGlzLnlWYWx1ZUFjY2Vzc29yPXQ7dGhpcy5zeW1ib2xGdW5jdGlvbj1BO3RoaXMub25EYXRhc2V0Q2hhbmdlZD10aGlzLl9vbkRhdGFzZXRDaGFuZ2VkLmJpbmQodGhpcyk7dGhpcy5fZGVmYXVsdFhSYW5nZT0KdTt0aGlzLl9kZWZhdWx0WVJhbmdlPXg7dGhpcy50b29sdGlwQ29sdW1ucz1uO3RoaXMuYnVpbGRDaGFydChrLGwscSx5KX1idWlsZENoYXJ0KGssdCxsLHApe3RoaXMuZGVzdHJveSgpO2s9aygpO3RoaXMueEFjY2Vzc29yPWsuYWNjZXNzb3I7dGhpcy54U2NhbGU9ay5zY2FsZTt0aGlzLnhBeGlzPWsuYXhpczt0aGlzLnhBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDMpO3AmJnRoaXMueEF4aXMuZm9ybWF0dGVyKHApO3RoaXMueVNjYWxlPWguZ2V0WVNjYWxlRnJvbVR5cGUodCk7dGhpcy55U2NhbGUuc2V0VmFsdWVQcm92aWRlckZvckRvbWFpbigoKT0+dGhpcy5nZXRWYWx1ZXNGb3JZQXhpc0RvbWFpbkNvbXB1dGUoKSk7dGhpcy55QXhpcz1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyh0aGlzLnlTY2FsZSwibGVmdCIpO3A9cmcubXVsdGlzY2FsZUZvcm1hdHRlcihyZy5ZX0FYSVNfRk9STUFUVEVSX1BSRUNJU0lPTik7dGhpcy55QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZyg1KS5mb3JtYXR0ZXIocCk7CnRoaXMueUF4aXMudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24oKTt0aGlzLmZpbGxBcmVhPWw7cD1uZXcgYi5QYW5ab29tRHJhZ0xheWVyKHRoaXMueFNjYWxlLHRoaXMueVNjYWxlLCgpPT50aGlzLnJlc2V0RG9tYWluKCkpO3RoaXMudG9vbHRpcEludGVyYWN0aW9uPXRoaXMuY3JlYXRlVG9vbHRpcEludGVyYWN0aW9uKHApO3RoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudD1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudDtsPXRoaXMuYnVpbGRQbG90KHRoaXMueFNjYWxlLHRoaXMueVNjYWxlLGwpO3RoaXMuZ3JpZGxpbmVzPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HcmlkbGluZXModGhpcy54U2NhbGUsdGhpcy55U2NhbGUpO2s9bnVsbDt0IT09Zi5MT0cmJihrPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigiaG9yaXpvbnRhbCIpLGsuc2NhbGUodGhpcy55U2NhbGUpLnZhbHVlKDApKTt0PW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigidmVydGljYWwiKTsKdC5zY2FsZSh0aGlzLnhTY2FsZSkudmFsdWUoMCk7dGhpcy5jZW50ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKFt0aGlzLmdyaWRsaW5lcyxrLHQsbCx0aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQscF0pO3RoaXMuY2VudGVyLmFkZENsYXNzKCJtYWluIik7dGhpcy5vdXRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdChrLHQsbCl7bCYmKHRoaXMubWFyZ2luQXJlYVBsb3Q9bmV3IFBsb3R0YWJsZS5QbG90cy5BcmVhLHRoaXMubWFyZ2luQXJlYVBsb3QueCh0aGlzLnhBY2Nlc3NvcixrKSx0aGlzLm1hcmdpbkFyZWFQbG90LnkobC5oaWdoZXJBY2Nlc3Nvcix0KSx0aGlzLm1hcmdpbkFyZWFQbG90LnkwKGwubG93ZXJBY2Nlc3NvciksdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJmaWxsIiwocSx1LHgpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoeC5tZXRhZGF0YSgpLm5hbWUpKSwKdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoInN0cm9rZS13aWR0aCIsMCkpO3RoaXMuc21vb3RoZWRBY2Nlc3Nvcj1xPT5xLnNtb290aGVkO2w9bmV3IFBsb3R0YWJsZS5QbG90cy5MaW5lO2wueCh0aGlzLnhBY2Nlc3NvcixrKTtsLnkodGhpcy55VmFsdWVBY2Nlc3Nvcix0KTtsLmF0dHIoInN0cm9rZSIsKHEsdSx4KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHgubWV0YWRhdGEoKS5uYW1lKSk7dGhpcy5saW5lUGxvdD1sO3RoaXMuc2V0dXBUb29sdGlwcyhsKTtsZXQgcD1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7cC54KHRoaXMueEFjY2Vzc29yLGspO3AueSh0aGlzLnNtb290aGVkQWNjZXNzb3IsdCk7cC5hdHRyKCJzdHJva2UiLChxLHUseCk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh4Lm1ldGFkYXRhKCkubmFtZSkpO3RoaXMuc21vb3RoTGluZVBsb3Q9cDtpZih0aGlzLnN5bWJvbEZ1bmN0aW9uKXt2YXIgbT0KbmV3IFBsb3R0YWJsZS5QbG90cy5TY2F0dGVyO20ueCh0aGlzLnhBY2Nlc3NvcixrKTttLnkodGhpcy55VmFsdWVBY2Nlc3Nvcix0KTttLmF0dHIoImZpbGwiLChxLHUseCk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh4Lm1ldGFkYXRhKCkubmFtZSkpO20uYXR0cigib3BhY2l0eSIsMSk7bS5zaXplKDIqcmcuVE9PTFRJUF9DSVJDTEVfU0laRSk7bS5zeW1ib2woKHEsdSx4KT0+dGhpcy5zeW1ib2xGdW5jdGlvbih4Lm1ldGFkYXRhKCkubmFtZSkpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90PW19bT1uZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7bS54KHRoaXMueEFjY2Vzc29yLGspO20ueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHQpO20uYXR0cigiZmlsbCIscT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHEubmFtZSkpO20uYXR0cigib3BhY2l0eSIsMSk7bS5zaXplKDIqcmcuVE9PTFRJUF9DSVJDTEVfU0laRSk7bS5kYXRhc2V0cyhbdGhpcy5sYXN0UG9pbnRzRGF0YXNldF0pO3RoaXMuc2NhdHRlclBsb3Q9Cm07bGV0IG49bmV3IFBsb3R0YWJsZS5QbG90cy5TY2F0dGVyO24ueCh0aGlzLnhBY2Nlc3NvcixrKTtuLnkocT0+cS5kaXNwbGF5WSx0KTtuLmF0dHIoImZpbGwiLHE9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShxLm5hbWUpKTtuLmF0dHIoIm9wYWNpdHkiLDEpO24uc2l6ZSgyKnJnLk5BTl9TWU1CT0xfU0laRSk7bi5kYXRhc2V0cyhbdGhpcy5uYW5EYXRhc2V0XSk7bi5zeW1ib2woUGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy50cmlhbmdsZSk7dGhpcy5uYW5EaXNwbGF5PW47az1bbixtLHAsbF07dGhpcy5tYXJnaW5BcmVhUGxvdCYmay5wdXNoKHRoaXMubWFyZ2luQXJlYVBsb3QpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZrLnB1c2godGhpcy5tYXJrZXJzU2NhdHRlclBsb3QpO3JldHVybiBuZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAoayl9X29uRGF0YXNldENoYW5nZWQoayl7dGhpcy5zbW9vdGhpbmdFbmFibGVkJiZ0aGlzLnJlc21vb3RoRGF0YXNldChrKTt0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfWlnbm9yZVlPdXRsaWVycyhrKXtrIT09CnRoaXMuX2lnbm9yZVlPdXRsaWVycyYmKHRoaXMuX2lnbm9yZVlPdXRsaWVycz1rLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCksdGhpcy55U2NhbGUuaWdub3JlT3V0bGllcihrKSx0aGlzLnJlc2V0WURvbWFpbigpKX1nZXRWYWx1ZXNGb3JZQXhpc0RvbWFpbkNvbXB1dGUoKXtjb25zdCBrPXRoaXMuZ2V0QWNjZXNzb3JzRm9yQ29tcHV0aW5nWVJhbmdlKCk7cmV0dXJuIF8uZmxhdHRlbkRlZXAodGhpcy5kYXRhc2V0cy5tYXAodD0+ay5tYXAobD0+dC5kYXRhKCkubWFwKHA9PmwocCwtMSx0KSkpKSkuZmlsdGVyKGlzRmluaXRlKX11cGRhdGVTcGVjaWFsRGF0YXNldHMoKXtjb25zdCBrPXRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpO3ZhciB0PXRoaXMuZGF0YXNldHMubWFwKGw9PntsZXQgcD1udWxsLG09bC5kYXRhKCkuZmlsdGVyKG49PiFpc05hTihrKG4sLTEsbCkpKTswPG0ubGVuZ3RoJiYocD1tW20ubGVuZ3RoLTFdLHAubmFtZT1sLm1ldGFkYXRhKCkubmFtZSxwLnJlbGF0aXZlPQpyZy5yZWxhdGl2ZUFjY2Vzc29yKHAsLTEsbCkpO3JldHVybiBwfSkuZmlsdGVyKGw9Pm51bGwhPWwpO3RoaXMubGFzdFBvaW50c0RhdGFzZXQuZGF0YSh0KTt0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cy5tYXAodGhpcy5jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMpKTt0PV8uZmxhdHRlbih0aGlzLmRhdGFzZXRzLm1hcChsPT57bGV0IHA9bnVsbCxtPWwuZGF0YSgpLG49MDtmb3IoO248bS5sZW5ndGgmJm51bGw9PXA7KWlzTmFOKGsobVtuXSwtMSxsKSl8fChwPWsobVtuXSwtMSxsKSksbisrO251bGw9PXAmJihwPTApO2xldCBxPVtdO2ZvcihuPTA7bjxtLmxlbmd0aDtuKyspaXNOYU4oayhtW25dLC0xLGwpKT8obVtuXS5uYW1lPWwubWV0YWRhdGEoKS5uYW1lLG1bbl0uZGlzcGxheVk9cCxtW25dLnJlbGF0aXZlPXJnLnJlbGF0aXZlQWNjZXNzb3IobVtuXSwtMSxsKSxxLnB1c2gobVtuXSkpOgpwPWsobVtuXSwtMSxsKTtyZXR1cm4gcX0pKTt0aGlzLm5hbkRhdGFzZXQuZGF0YSh0KX1yZXNldERvbWFpbigpe3RoaXMucmVzZXRYRG9tYWluKCk7dGhpcy5yZXNldFlEb21haW4oKX1yZXNldFhEb21haW4oKXtpZihudWxsIT10aGlzLl9kZWZhdWx0WFJhbmdlKXZhciBrPXRoaXMuX2RlZmF1bHRYUmFuZ2U7ZWxzZSBrPXRoaXMueFNjYWxlLGsuX2RvbWFpbk1pbj1udWxsLGsuX2RvbWFpbk1heD1udWxsLGs9ay5fZ2V0RXh0ZW50KCk7dGhpcy54U2NhbGUuZG9tYWluKGspfXJlc2V0WURvbWFpbigpe251bGwhPXRoaXMuX2RlZmF1bHRZUmFuZ2U/dGhpcy55U2NhbGUuZG9tYWluKHRoaXMuX2RlZmF1bHRZUmFuZ2UpOih0aGlzLnlTY2FsZS5hdXRvRG9tYWluKCksdGhpcy55U2NhbGUuZG9tYWluKHRoaXMueVNjYWxlLmRvbWFpbigpKSl9Z2V0QWNjZXNzb3JzRm9yQ29tcHV0aW5nWVJhbmdlKCl7Y29uc3Qgaz1bdGhpcy5nZXRZQXhpc0FjY2Vzc29yKCldO3RoaXMuZmlsbEFyZWEmJmsucHVzaCh0aGlzLmZpbGxBcmVhLmxvd2VyQWNjZXNzb3IsCnRoaXMuZmlsbEFyZWEuaGlnaGVyQWNjZXNzb3IpO3JldHVybiBrfWdldFlBeGlzQWNjZXNzb3IoKXtyZXR1cm4gdGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3Nvcjp0aGlzLnlWYWx1ZUFjY2Vzc29yfWNyZWF0ZVRvb2x0aXBJbnRlcmFjdGlvbihrKXtjb25zdCB0PW5ldyByZy5Qb2ludGVySW50ZXJhY3Rpb24sbD0oKT0+e3QuZW5hYmxlZCghMSk7dGhpcy5oaWRlVG9vbHRpcHMoKX0scD0oKT0+dC5lbmFibGVkKCEwKTtrLm9uUGFuU3RhcnQobCk7ay5vbkRyYWdab29tU3RhcnQobCk7ay5vblBhbkVuZChwKTtrLm9uRHJhZ1pvb21FbmQocCk7ay5vblNjcm9sbFpvb20oKCk9PnRoaXMudXBkYXRlVG9vbHRpcENvbnRlbnQodGhpcy5fbGFzdE1vdXNlUG9zaXRpb24pKTt0Lm9uUG9pbnRlck1vdmUobT0+e3RoaXMuX2xhc3RNb3VzZVBvc2l0aW9uPW07dGhpcy51cGRhdGVUb29sdGlwQ29udGVudChtKX0pO3Qub25Qb2ludGVyRXhpdCgoKT0+dGhpcy5oaWRlVG9vbHRpcHMoKSk7CnJldHVybiB0fXVwZGF0ZVRvb2x0aXBDb250ZW50KGspe3RoaXMubGluZVBsb3QmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKSx0aGlzLl90b29sdGlwVXBkYXRlQW5pbWF0aW9uRnJhbWU9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2xldCB0PXt4OmsueCx5OmsueSxkYXR1bTpudWxsLGRhdGFzZXQ6bnVsbH0sbD10aGlzLmdyaWRsaW5lcy5jb250ZW50KCkubm9kZSgpLmdldEJCb3goKTt2YXIgcD10aGlzLmxpbmVQbG90LmRhdGFzZXRzKCkubWFwKHU9PnRoaXMuZmluZENsb3Nlc3RQb2ludCh0LHUpKS5maWx0ZXIoQm9vbGVhbik7bGV0IG09UGxvdHRhYmxlLlV0aWxzLkRPTS5pbnRlcnNlY3RzQkJveCxuPXAuZmlsdGVyKHU9Pm0odS54LHUueSxsKXx8aXNOYU4odGhpcy55VmFsdWVBY2Nlc3Nvcih1LmRhdHVtLDAsdS5kYXRhc2V0KSkpLHE9bi5maWx0ZXIodT0+IWlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IodS5kYXR1bSwKMCx1LmRhdGFzZXQpKSk7MCE9PXAubGVuZ3RoPyh0aGlzLnNjYXR0ZXJQbG90LmF0dHIoImRpc3BsYXkiLCJub25lIikscD10aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQuY29udGVudCgpLnNlbGVjdEFsbCgiLnBvaW50IikuZGF0YShxLHU9PnUuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpLHAuZW50ZXIoKS5hcHBlbmQoImNpcmNsZSIpLmNsYXNzZWQoInBvaW50IiwhMCkscC5hdHRyKCJyIixyZy5UT09MVElQX0NJUkNMRV9TSVpFKS5hdHRyKCJjeCIsdT0+dS54KS5hdHRyKCJjeSIsdT0+dS55KS5zdHlsZSgic3Ryb2tlIiwibm9uZSIpLmF0dHIoImZpbGwiLHU9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh1LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSkscC5leGl0KCkucmVtb3ZlKCksdGhpcy5kcmF3VG9vbHRpcHMobix0LHRoaXMudG9vbHRpcENvbHVtbnMpKTp0aGlzLmhpZGVUb29sdGlwcygpfSkpfWhpZGVUb29sdGlwcygpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwVXBkYXRlQW5pbWF0aW9uRnJhbWUpOwp0aGlzLnRvb2x0aXAuaGlkZSgpO3RoaXMuc2NhdHRlclBsb3QuYXR0cigiZGlzcGxheSIsImJsb2NrIik7dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LmNvbnRlbnQoKS5zZWxlY3RBbGwoIi5wb2ludCIpLnJlbW92ZSgpfXNldHVwVG9vbHRpcHMoayl7ay5vbkRldGFjaCgoKT0+e3RoaXMudG9vbHRpcEludGVyYWN0aW9uLmRldGFjaEZyb20oKTt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5lbmFibGVkKCExKX0pO2sub25BbmNob3IoKCk9Pnt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5hdHRhY2hUbyhrKTt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5lbmFibGVkKCEwKX0pfWRyYXdUb29sdGlwcyhrLHQsbCl7aWYoay5sZW5ndGgpe3ZhciBwPXRoaXMuY29sb3JTY2FsZTtsPVt7dGl0bGU6IiIsc3RhdGljOiExLGV2YWxUeXBlOmQuRE9NLGV2YWx1YXRlKHkpe2QzLnNlbGVjdCh0aGlzKS5zZWxlY3QoInNwYW4iKS5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsKCk9PnAuc2NhbGUoeS5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpOwpyZXR1cm4iIn0sZW50ZXIoeSl7ZDMuc2VsZWN0KHRoaXMpLmFwcGVuZCgic3BhbiIpLmNsYXNzZWQoInN3YXRjaCIsITApLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIiwoKT0+cC5zY2FsZSh5LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSl9fSwuLi5sXTt2YXIgbT15PT5NYXRoLnBvdyh5LngtdC54LDIpK01hdGgucG93KHkueS10LnksMiksbj1fLm1pbihrLm1hcChtKSkscT10aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5zbW9vdGhlZEFjY2Vzc29yOnRoaXMueVZhbHVlQWNjZXNzb3I7az0iYXNjZW5kaW5nIj09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0Qnkoayx5PT5xKHkuZGF0dW0sLTEseS5kYXRhc2V0KSk6ImRlc2NlbmRpbmciPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9fLnNvcnRCeShrLHk9PnEoeS5kYXR1bSwtMSx5LmRhdGFzZXQpKS5yZXZlcnNlKCk6Im5lYXJlc3QiPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9fLnNvcnRCeShrLG0pOmsuc2xpY2UoMCkucmV2ZXJzZSgpOwp2YXIgdT10aGlzLHg9ZDMuc2VsZWN0KHRoaXMudG9vbHRpcC5jb250ZW50KCkpLnNlbGVjdCgidGFibGUiKSxBPXguc2VsZWN0KCJ0aGVhZCIpLnNlbGVjdEFsbCgidGgiKS5kYXRhKGwseT0+eS50aXRsZSk7QS5lbnRlcigpLmFwcGVuZCgidGgiKS50ZXh0KHk9PnkudGl0bGUpLm5vZGVzKCk7QS5leGl0KCkucmVtb3ZlKCk7az14LnNlbGVjdCgidGJvZHkiKS5zZWxlY3RBbGwoInRyIikuZGF0YShrLHk9PnkuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpO2suY2xhc3NlZCgiZGlzdGFudCIseT0+e3ZhciB3PXkuZGF0YXNldC5kYXRhKClbMF0sQz1fLmxhc3QoeS5kYXRhc2V0LmRhdGEoKSk7dz10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3Nvcih3LDAseS5kYXRhc2V0KSk7Qz10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3NvcihDLDAseS5kYXRhc2V0KSk7eT10aGlzLnNtb290aGluZ0VuYWJsZWQ/eS5kYXR1bS5zbW9vdGhlZDp0aGlzLnlWYWx1ZUFjY2Vzc29yKHkuZGF0dW0sCjAseS5kYXRhc2V0KTtyZXR1cm4gdC54PHd8fHQueD5DfHxpc05hTih5KX0pLmNsYXNzZWQoImNsb3Nlc3QiLHk9Pm0oeSk9PT1uKS5lYWNoKGZ1bmN0aW9uKHkpe3UuZHJhd1Rvb2x0aXBSb3codGhpcyxsLHkpfSkub3JkZXIoKTtrLmV4aXQoKS5yZW1vdmUoKTtrLmVudGVyKCkuYXBwZW5kKCJ0ciIpLmVhY2goZnVuY3Rpb24oeSl7dS5kcmF3VG9vbHRpcFJvdyh0aGlzLGwseSl9KS5ub2RlcygpO3RoaXMudG9vbHRpcC51cGRhdGVBbmRQb3NpdGlvbih0aGlzLnRhcmdldFNWRy5ub2RlKCkpfWVsc2UgdGhpcy50b29sdGlwLmhpZGUoKX1kcmF3VG9vbHRpcFJvdyhrLHQsbCl7Y29uc3QgcD10aGlzO2s9ZDMuc2VsZWN0KGspLnNlbGVjdEFsbCgidGQiKS5kYXRhKHQpO2suZWFjaChmdW5jdGlvbihtKXttLnN0YXRpY3x8cC5kcmF3VG9vbHRpcENvbHVtbi5jYWxsKHAsdGhpcyxtLGwpfSk7ay5lbnRlcigpLmFwcGVuZCgidGQiKS5lYWNoKGZ1bmN0aW9uKG0pe20uZW50ZXImJm0uZW50ZXIuY2FsbCh0aGlzLApsKTtwLmRyYXdUb29sdGlwQ29sdW1uLmNhbGwocCx0aGlzLG0sbCl9KX1kcmF3VG9vbHRpcENvbHVtbihrLHQsbCl7Y29uc3QgcD10aGlzLnNtb290aGluZ0VuYWJsZWQ7dC5ldmFsVHlwZT09ZC5ET00/dC5ldmFsdWF0ZS5jYWxsKGssbCx7c21vb3RoaW5nRW5hYmxlZDpwfSk6ZDMuc2VsZWN0KGspLnRleHQodC5ldmFsdWF0ZS5jYWxsKGssbCx7c21vb3RoaW5nRW5hYmxlZDpwfSkpfWZpbmRDbG9zZXN0UG9pbnQoayx0KXtjb25zdCBsPXQuZGF0YSgpLm1hcCgobixxKT0+dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IobixxLHQpKSk7bGV0IHA9Xy5zb3J0ZWRJbmRleChsLGsueCk7aWYoMD09bC5sZW5ndGgpcmV0dXJuIG51bGw7cD09PWwubGVuZ3RoPy0tcDowIT09cCYmKHA9TWF0aC5hYnMobFtwLTFdLWsueCk8TWF0aC5hYnMobFtwXS1rLngpP3AtMTpwKTtrPXQuZGF0YSgpW3BdO2NvbnN0IG09dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3NvcihrLApwLHQpOnRoaXMueVZhbHVlQWNjZXNzb3IoayxwLHQpO3JldHVybnt4OmxbcF0seTp0aGlzLnlTY2FsZS5zY2FsZShtKSxkYXR1bTprLGRhdGFzZXQ6dH19cmVzbW9vdGhEYXRhc2V0KGspe2xldCB0PWsuZGF0YSgpO2NvbnN0IGw9dGhpcy5zbW9vdGhpbmdXZWlnaHQ7bGV0IHA9MDx0Lmxlbmd0aD8wOk5hTixtPTA7Y29uc3Qgbj10Lm1hcCgodSx4KT0+dGhpcy55VmFsdWVBY2Nlc3Nvcih1LHgsaykpLHE9bi5ldmVyeSh1PT51PT1uWzBdKTt0LmZvckVhY2goKHUseCk9Pnt4PW5beF07cXx8IU51bWJlci5pc0Zpbml0ZSh4KT91LnNtb290aGVkPXg6KHA9cCpsKygxLWwpKngsbSsrLHg9MSwxIT09bCYmKHg9MS1NYXRoLnBvdyhsLG0pKSx1LnNtb290aGVkPXAveCl9KX1nZXREYXRhc2V0KGspe3ZvaWQgMD09PXRoaXMubmFtZTJkYXRhc2V0c1trXSYmKHRoaXMubmFtZTJkYXRhc2V0c1trXT1uZXcgUGxvdHRhYmxlLkRhdGFzZXQoW10se25hbWU6ayxtZXRhOm51bGx9KSk7cmV0dXJuIHRoaXMubmFtZTJkYXRhc2V0c1trXX1zdGF0aWMgZ2V0WVNjYWxlRnJvbVR5cGUoayl7aWYoaz09PQpmLkxPRylyZXR1cm4gbmV3IGIuTG9nU2NhbGU7aWYoaz09PWYuTElORUFSKXJldHVybiBuZXcgYi5MaW5lYXJTY2FsZTt0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIHlTY2FsZSB0eXBlICIrayk7fXNldFZpc2libGVTZXJpZXMoayl7dGhpcy5zZXJpZXNOYW1lcz1rPWsuc29ydCgpO2sucmV2ZXJzZSgpO3RoaXMuZGF0YXNldHMuZm9yRWFjaCh0PT50Lm9mZlVwZGF0ZSh0aGlzLm9uRGF0YXNldENoYW5nZWQpKTt0aGlzLmRhdGFzZXRzPWsubWFwKHQ9PnRoaXMuZ2V0RGF0YXNldCh0KSk7dGhpcy5kYXRhc2V0cy5mb3JFYWNoKHQ9PnQub25VcGRhdGUodGhpcy5vbkRhdGFzZXRDaGFuZ2VkKSk7dGhpcy5saW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTt0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cyk7dGhpcy5tYXJnaW5BcmVhUGxvdCYmdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTsKdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKX1jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMoayl7Y29uc3QgdD1rLmRhdGEoKTtpZigyMD49dC5sZW5ndGgpcmV0dXJuIGs7Y29uc3QgbD1NYXRoLmNlaWwodC5sZW5ndGgvMjApLHA9QXJyYXkoTWF0aC5mbG9vcih0Lmxlbmd0aC9sKSk7Zm9yKGxldCBtPTAsbj0wO208cC5sZW5ndGg7bSsrLG4rPWwpcFttXT10W25dO3JldHVybiBuZXcgUGxvdHRhYmxlLkRhdGFzZXQocCxrLm1ldGFkYXRhKCkpfXNldFNlcmllc0RhdGEoayx0KXt0aGlzLmdldERhdGFzZXQoaykuZGF0YSh0KTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1zZXRTZXJpZXNNZXRhZGF0YShrLHQpe3Q9T2JqZWN0LmFzc2lnbih7fSx0aGlzLmdldERhdGFzZXQoaykubWV0YWRhdGEoKSx7bWV0YTp0fSk7dGhpcy5nZXREYXRhc2V0KGspLm1ldGFkYXRhKHQpfXNtb290aGluZ1VwZGF0ZShrKXt0aGlzLnNtb290aGluZ1dlaWdodD0Kazt0aGlzLmRhdGFzZXRzLmZvckVhY2godD0+dGhpcy5yZXNtb290aERhdGFzZXQodCkpO3RoaXMuc21vb3RoaW5nRW5hYmxlZHx8KHRoaXMubGluZVBsb3QuYWRkQ2xhc3MoImdob3N0IiksdGhpcy5zY2F0dGVyUGxvdC55KHRoaXMuc21vb3RoZWRBY2Nlc3Nvcix0aGlzLnlTY2FsZSksdGhpcy5zbW9vdGhpbmdFbmFibGVkPSEwLHRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cykpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKTt0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfXNtb290aGluZ0Rpc2FibGUoKXt0aGlzLnNtb290aGluZ0VuYWJsZWQmJih0aGlzLmxpbmVQbG90LnJlbW92ZUNsYXNzKCJnaG9zdCIpLHRoaXMuc2NhdHRlclBsb3QueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKFtdKSwKdGhpcy5zbW9vdGhpbmdFbmFibGVkPSExLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCkpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKX1zZXRUb29sdGlwU29ydGluZ01ldGhvZChrKXt0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kPWt9cmVuZGVyVG8oayl7dGhpcy50YXJnZXRTVkc9azt0aGlzLm91dGVyLnJlbmRlclRvKGspO251bGwhPXRoaXMuX2RlZmF1bHRYUmFuZ2UmJnRoaXMucmVzZXRYRG9tYWluKCk7bnVsbCE9dGhpcy5fZGVmYXVsdFlSYW5nZSYmdGhpcy5yZXNldFlEb21haW4oKTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1yZWRyYXcoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTt0aGlzLl9yZWRyYXdSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKTsKdGhpcy5vdXRlci5yZWRyYXcoKX0pfW1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faW52YWxpZGF0ZUxheW91dFJhZik7dGhpcy5faW52YWxpZGF0ZUxheW91dFJhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpfSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKXtpZih0aGlzLl9sYXN0RHJhd0JCb3gpe2NvbnN0IGs9dGhpcy5fbGFzdERyYXdCQm94LndpZHRoLHt3aWR0aDp0fT10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7MD09ayYmazx0JiZ0aGlzLm91dGVyLmludmFsaWRhdGVDYWNoZSgpfXRoaXMuX2xhc3REcmF3QkJveD10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9ZGVzdHJveSgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpOwp3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faW52YWxpZGF0ZUxheW91dFJhZik7dGhpcy5vdXRlciYmdGhpcy5vdXRlci5kZXN0cm95KCl9b25BbmNob3Ioayl7aWYodGhpcy5vdXRlcil0aGlzLm91dGVyLm9uQW5jaG9yKGspfX1iLkxpbmVDaGFydD1ofSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Z6LWxpbmUtY2hhcnQyLmpzCihmdW5jdGlvbihiKXtjb25zdCBkPXJnLm11bHRpc2NhbGVGb3JtYXR0ZXIocmcuWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pLGY9aD0+aXNOYU4oaCk/Ik5hTiI6ZChoKTtiLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TPVt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmg9PmguZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV9LHt0aXRsZToiU21vb3RoZWQiLGV2YWx1YXRlKGgsayl7cmV0dXJuIGYoay5zbW9vdGhpbmdFbmFibGVkP2guZGF0dW0uc21vb3RoZWQ6aC5kYXR1bS5zY2FsYXIpfX0se3RpdGxlOiJWYWx1ZSIsZXZhbHVhdGU6aD0+ZihoLmRhdHVtLnNjYWxhcil9LHt0aXRsZToiU3RlcCIsZXZhbHVhdGU6aD0+cmcuc3RlcEZvcm1hdHRlcihoLmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLGV2YWx1YXRlOmg9PnJnLnRpbWVGb3JtYXR0ZXIoaC5kYXR1bS53YWxsX3RpbWUpfSx7dGl0bGU6IlJlbGF0aXZlIixldmFsdWF0ZTpoPT5yZy5yZWxhdGl2ZUZvcm1hdHRlcihyZy5yZWxhdGl2ZUFjY2Vzc29yKGguZGF0dW0sCi0xLGguZGF0YXNldCkpfV07UG9seW1lcih7aXM6InZ6LWxpbmUtY2hhcnQyIixwcm9wZXJ0aWVzOntjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybihuZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcikucmFuZ2UoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSxzeW1ib2xGdW5jdGlvbjpPYmplY3Qsc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sc21vb3RoaW5nV2VpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTouNn0seFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSx4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0seEF4aXNGb3JtYXR0ZXI6T2JqZWN0LHlWYWx1ZUFjY2Vzc29yOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+aD0+aC5zY2FsYXJ9LHRvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5iLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TfSxmaWxsQXJlYTpPYmplY3QsCmRlZmF1bHRYUmFuZ2U6QXJyYXksZGVmYXVsdFlSYW5nZTpBcnJheSx5U2NhbGVUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToibGluZWFyIn0saWdub3JlWU91dGxpZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHRvb2x0aXBTb3J0aW5nTWV0aG9kOnt0eXBlOlN0cmluZyx2YWx1ZToiZGVmYXVsdCJ9LHRvb2x0aXBQb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6RWguVG9vbHRpcFBvc2l0aW9uLkJPVFRPTX0sX2NoYXJ0Ok9iamVjdCxfdmlzaWJsZVNlcmllc0NhY2hlOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3Nlcmllc0RhdGFDYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9zZXJpZXNNZXRhZGF0YUNhY2hlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZDp7dHlwZTpOdW1iZXIsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9tYWtlQ2hhcnQoeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCwgeFR5cGUsIHlWYWx1ZUFjY2Vzc29yLCB5U2NhbGVUeXBlLCB0b29sdGlwQ29sdW1ucywgY29sb3JTY2FsZSwgaXNBdHRhY2hlZCkiLAoiX3JlbG9hZEZyb21DYWNoZShfY2hhcnQsIF92aXNpYmxlU2VyaWVzQ2FjaGUpIiwiX3Ntb290aGluZ0NoYW5nZWQoc21vb3RoaW5nRW5hYmxlZCwgc21vb3RoaW5nV2VpZ2h0LCBfY2hhcnQpIiwiX3Rvb2x0aXBTb3J0aW5nTWV0aG9kQ2hhbmdlZCh0b29sdGlwU29ydGluZ01ldGhvZCwgX2NoYXJ0KSIsIl9vdXRsaWVyc0NoYW5nZWQoaWdub3JlWU91dGxpZXJzLCBfY2hhcnQpIl0scmVhZHkoKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuY2hhcnRkaXYsITApfSxhdHRhY2hlZCgpe2NvbnN0IGg9e2NhcHR1cmU6ITAscGFzc2l2ZTohMH07dGhpcy5fbGlzdGVuKHRoaXMsIm1vdXNlZG93biIsdGhpcy5fb25Nb3VzZURvd24uYmluZCh0aGlzKSxoKTt0aGlzLl9saXN0ZW4odGhpcywibW91c2V1cCIsdGhpcy5fb25Nb3VzZVVwLmJpbmQodGhpcyksaCk7dGhpcy5fbGlzdGVuKHdpbmRvdywia2V5ZG93biIsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksaCk7dGhpcy5fbGlzdGVuKHdpbmRvdywKImtleXVwIix0aGlzLl9vbktleVVwLmJpbmQodGhpcyksaCl9LGRldGFjaGVkKCl7dGhpcy5jYW5jZWxBc3luYyh0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQpO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5kZXN0cm95KCk7dGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzLmZvckVhY2goKHtub2RlOmgsZXZlbnROYW1lOmssZnVuYzp0LG9wdGlvbjpsfSk9PntoLnJlbW92ZUV2ZW50TGlzdGVuZXIoayx0LGwpfSksdGhpcy5fbGlzdGVuZXJzLmNsZWFyKCkpfSxfbGlzdGVuKGgsayx0LGw9e30pe3RoaXMuX2xpc3RlbmVyc3x8KHRoaXMuX2xpc3RlbmVycz1uZXcgU2V0KTt0aGlzLl9saXN0ZW5lcnMuYWRkKHtub2RlOmgsZXZlbnROYW1lOmssZnVuYzp0LG9wdGlvbjpsfSk7aC5hZGRFdmVudExpc3RlbmVyKGssdCxsKX0sX29uS2V5RG93bihoKXt0aGlzLnRvZ2dsZUNsYXNzKCJwYW5rZXkiLGIuUGFuWm9vbURyYWdMYXllci5pc1BhbktleShoKSl9LF9vbktleVVwKGgpe3RoaXMudG9nZ2xlQ2xhc3MoInBhbmtleSIsCmIuUGFuWm9vbURyYWdMYXllci5pc1BhbktleShoKSl9LF9vbk1vdXNlRG93bigpe3RoaXMudG9nZ2xlQ2xhc3MoIm1vdXNlZG93biIsITApfSxfb25Nb3VzZVVwKCl7dGhpcy50b2dnbGVDbGFzcygibW91c2Vkb3duIiwhMSl9LHNldFZpc2libGVTZXJpZXM6ZnVuY3Rpb24oaCl7Xy5pc0VxdWFsKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSxoKXx8KHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT1oKX0sc2V0U2VyaWVzRGF0YTpmdW5jdGlvbihoLGspe3RoaXMuX3Nlcmllc0RhdGFDYWNoZVtoXT1rO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKGgsayl9LHNldFNlcmllc01ldGFkYXRhKGgsayl7dGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZVtoXT1rO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShoLGspfSxyZXNldERvbWFpbjpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5yZXNldERvbWFpbigpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmCnRoaXMuX2NoYXJ0LnJlZHJhdygpfSxfbWFrZUNoYXJ0OmZ1bmN0aW9uKGgsayx0LGwscCxtKXtrfHxoP2smJihoPSgpPT5yZy5nZXRYQ29tcG9uZW50cyhrKSk6aD1yZy5zdGVwWDtudWxsIT09dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQpLHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsKTt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsO2lmKGgmJnRoaXMueVZhbHVlQWNjZXNzb3ImJnRoaXMudG9vbHRpcENvbHVtbnMpe3ZhciBuPW5ldyBiLkxpbmVDaGFydChoLHRoaXMueVZhbHVlQWNjZXNzb3IsbCxtLHRoaXMuJC50b29sdGlwLHRoaXMudG9vbHRpcENvbHVtbnMsdGhpcy5maWxsQXJlYSx0aGlzLmRlZmF1bHRYUmFuZ2UsdGhpcy5kZWZhdWx0WVJhbmdlLAp0aGlzLnN5bWJvbEZ1bmN0aW9uLHRoaXMueEF4aXNGb3JtYXR0ZXIpLHE9ZDMuc2VsZWN0KHRoaXMuJC5jaGFydGRpdik7bi5yZW5kZXJUbyhxKTt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3RoaXMuX2NoYXJ0PW47dGhpcy5fY2hhcnQub25BbmNob3IoKCk9PnRoaXMuZmlyZSgiY2hhcnQtYXR0YWNoZWQiKSl9fSwzNTApfSxfcmVsb2FkRnJvbUNhY2hlOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUuZm9yRWFjaChoPT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShoLHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtoXXx8W10pfSksdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZpbHRlcihoPT50aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW2hdKS5mb3JFYWNoKGg9Pnt0aGlzLl9jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShoLHRoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbaF0pfSksdGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUpKX0sCl9zbW9vdGhpbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5fY2hhcnQuc21vb3RoaW5nVXBkYXRlKHRoaXMuc21vb3RoaW5nV2VpZ2h0KTp0aGlzLl9jaGFydC5zbW9vdGhpbmdEaXNhYmxlKCkpfSxfb3V0bGllcnNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0Lmlnbm9yZVlPdXRsaWVycyh0aGlzLmlnbm9yZVlPdXRsaWVycyl9LF90b29sdGlwU29ydGluZ01ldGhvZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0VG9vbHRpcFNvcnRpbmdNZXRob2QodGhpcy50b29sdGlwU29ydGluZ01ldGhvZCl9LGdldEV4cG9ydGVyKCl7cmV0dXJuIG5ldyBiLkxpbmVDaGFydEV4cG9ydGVyKHRoaXMuJC5jaGFydGRpdil9fSl9KShHaHx8KEdoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvdnotbGluZS1jaGFydDIuaHRtbC5qcwpQb2x5bWVyKHtpczoidnotbGluZS1jaGFydC10b29sdGlwIn0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xpbmUtY2hhcnQtZXhwb3J0ZXIuanMKKGZ1bmN0aW9uKGIpe2xldCBkOyhmdW5jdGlvbihrKXtrLkdST1VQPSJHIjtrLkRJVj0iRElWIjtrLlNWRz0iU1ZHIjtrLlRFWFQ9IlRFWFQifSkoZHx8KGQ9e30pKTtjbGFzcyBme2NvbnN0cnVjdG9yKGspe3RoaXMudW5pcXVlSWQ9MDt0aGlzLnJvb3Q9a31leHBvcnRBc1N0cmluZygpe2NvbnN0IGs9dGhpcy5jb252ZXJ0KHRoaXMucm9vdCk7aWYoIWspcmV0dXJuIiI7Y29uc3QgdD10aGlzLmNyZWF0ZVJvb3RTdmcoKTt0LmFwcGVuZENoaWxkKGspO3JldHVybiB0Lm91dGVySFRNTH1jcmVhdGVVbmlxdWVJZCgpe3JldHVybmAkeyJjbGlwIn1fJHt0aGlzLnVuaXF1ZUlkKyt9YH1nZXRTaXplKCl7cmV0dXJuIHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jcmVhdGVSb290U3ZnKCl7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdmciKSx0PXRoaXMuZ2V0U2l6ZSgpO2suc2V0QXR0cmlidXRlTlMoInN2ZyIsInZpZXdCb3giLGAwIDAgJHt0LndpZHRofSAke3QuaGVpZ2h0fWApOwprLnNldEF0dHJpYnV0ZSgieG1sbnMiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIpO3JldHVybiBrfWNvbnZlcnQoayl7bGV0IHQ9bnVsbDt2YXIgbD1rLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7aWYoay5ub2RlVHlwZSE9Tm9kZS5FTEVNRU5UX05PREV8fGwhPWQuRElWJiZsIT1kLlNWRyl0PWsuY2xvbmVOb2RlKCk7ZWxzZXt0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZC5HUk9VUCk7dmFyIHA9d2luZG93LmdldENvbXB1dGVkU3R5bGUoayksbT1wYXJzZUludChwLmxlZnQsMTApLG49cGFyc2VJbnQocC50b3AsMTApO2lmKG18fG4pbD10aGlzLmNyZWF0ZVVuaXF1ZUlkKCksdC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke219LCAke259KWApLHQuc2V0QXR0cmlidXRlKCJjbGlwLXBhdGgiLGB1cmwoIyR7bH0pYCksbj1wYXJzZUludChwLmhlaWdodCwxMCksbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJyZWN0IiksbS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKU3RyaW5nKHBhcnNlSW50KHAud2lkdGgsMTApKSksbS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsU3RyaW5nKG4pKSxwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygic3ZnIiwiY2xpcFBhdGgiKSxwLmlkPWwscC5hcHBlbmRDaGlsZChtKSx0LmFwcGVuZENoaWxkKHApfUFycmF5LmZyb20oay5jaGlsZE5vZGVzKS5tYXAocT0+dGhpcy5jb252ZXJ0KHEpKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChxPT50LmFwcGVuZENoaWxkKHEpKTtyZXR1cm4gdC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT1kLkdST1VQJiYhdC5oYXNDaGlsZE5vZGVzKCl8fHRoaXMuc2hvdWxkT21pdE5vZGUoayk/bnVsbDp0aGlzLnN0cmlwQ2xhc3ModGhpcy50cmFuc2ZlclN0eWxlKGssdCkpfXN0cmlwQ2xhc3Moayl7ay5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUmJmsucmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpO3JldHVybiBrfXRyYW5zZmVyU3R5bGUoayx0KXtpZih0Lm5vZGVUeXBlIT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gdDsKY29uc3QgbD10Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7az13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShrKTtsPT1kLlRFWFQmJk9iamVjdC5hc3NpZ24odC5zdHlsZSx7Zm9udEZhbWlseTprLmZvbnRGYW1pbHksZm9udFNpemU6ay5mb250U2l6ZSxmb250V2VpZ2h0OmsuZm9udFdlaWdodH0pO2whPWQuR1JPVVAmJih0LnNldEF0dHJpYnV0ZSgiZmlsbCIsay5maWxsKSx0LnNldEF0dHJpYnV0ZSgic3Ryb2tlIixrLnN0cm9rZSksdC5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsay5zdHJva2VXaWR0aCkpOyIxIiE9ay5vcGFjaXR5JiZ0LnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsay5vcGFjaXR5KTtyZXR1cm4gdH1zaG91bGRPbWl0Tm9kZSgpe3JldHVybiExfX1iLlBsb3R0YWJsZUV4cG9ydGVyPWY7Y2xhc3MgaCBleHRlbmRzIGZ7c2hvdWxkT21pdE5vZGUoayl7cmV0dXJuIGsubm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFP2suY2xhc3NMaXN0LmNvbnRhaW5zKCJzY2F0dGVyLXBsb3QiKToKITF9fWIuTGluZUNoYXJ0RXhwb3J0ZXI9aH0pKEdofHwoR2g9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyL3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIuaHRtbC5qcwooZnVuY3Rpb24oKXtjb25zdCBiPVtdLGQ9ZnVuY3Rpb24oKXtyZXR1cm4gXy50aHJvdHRsZShmdW5jdGlvbiBoKCl7aWYoMCE9Yi5sZW5ndGgpe3ZhciBrPWIuc2hpZnQoKTtrLmFjdGl2ZSYmKGsucmVkcmF3KCksay5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU9ITEpO3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSgwKTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGgpfX0sMTAwKX0oKTtQb2x5bWVyKHtpczoidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIscHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9maXhCYWRTdGF0ZVdoZW5BY3RpdmUifSxkYXRhU2VyaWVzOkFycmF5LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxsb2dTY2FsZUFjdGl2ZTp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfbG9nU2NhbGVDaGFuZ2VkIn0seENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDpPYmplY3QseFR5cGU6U3RyaW5nLHlWYWx1ZUFjY2Vzc29yOk9iamVjdCxmaWxsQXJlYTpPYmplY3QsCnNtb290aGluZ0VuYWJsZWQ6Qm9vbGVhbixzbW9vdGhpbmdXZWlnaHQ6TnVtYmVyLHRvb2x0aXBDb2x1bW5zOkFycmF5LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyx0b29sdGlwUG9zaXRpb246U3RyaW5nLGlnbm9yZVlPdXRsaWVyczpCb29sZWFuLGRlZmF1bHRYUmFuZ2U6QXJyYXksZGVmYXVsdFlSYW5nZTpBcnJheSxzeW1ib2xGdW5jdGlvbjpPYmplY3QsY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NhbGU6cGYucnVuc0NvbG9yU2NhbGV9KX0sX3Jlc2V0RG9tYWluT25OZXh0TG9hZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxiZWhhdmlvcnM6W3FkLkRhdGFMb2FkZXJCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2RhdGFTZXJpZXNDaGFuZ2VkKGRhdGFTZXJpZXMuKikiLCJfbG9hZEtleUNoYW5nZWQobG9hZEtleSkiXSxvbkxvYWRGaW5pc2goKXswPAp0aGlzLmRhdGFUb0xvYWQubGVuZ3RoJiZ0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQmJih0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQ9ITEsdGhpcy4kLmNoYXJ0LnJlc2V0RG9tYWluKCkpO3RoaXMucmVkcmF3KCl9LGRldGFjaGVkKCl7Y2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKX0sZXhwb3J0QXNTdmdTdHJpbmcoKXtyZXR1cm4gdGhpcy4kLmNoYXJ0LmdldEV4cG9ydGVyKCkuZXhwb3J0QXNTdHJpbmcoKX0scmVzZXREb21haW4oKXt0aGlzLiQuY2hhcnQucmVzZXREb21haW4oKX0sc2V0U2VyaWVzRGF0YShmLGgpe3RoaXMuJC5jaGFydC5zZXRTZXJpZXNEYXRhKGYsaCl9LHNldFNlcmllc01ldGFkYXRhKGYsaCl7dGhpcy4kLmNoYXJ0LnNldFNlcmllc01ldGFkYXRhKGYsaCl9LHJlZHJhdygpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZik7dGhpcy5fcmVkcmF3UmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLmFjdGl2ZT8KdGhpcy4kLmNoYXJ0LnJlZHJhdygpOnRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSEwfSl9LF9sb2FkS2V5Q2hhbmdlZCgpe3RoaXMucmVzZXQoKTt0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQ9ITB9LF9kYXRhU2VyaWVzQ2hhbmdlZCgpe3RoaXMuJC5jaGFydC5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuZGF0YVNlcmllcyl9LF9sb2dTY2FsZUNoYW5nZWQoZil7dGhpcy4kLmNoYXJ0LnlTY2FsZVR5cGU9Zj8ibG9nIjoibGluZWFyIjt0aGlzLnJlZHJhdygpfSxfZml4QmFkU3RhdGVXaGVuQWN0aXZlKCl7dGhpcy5hY3RpdmUmJnRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlJiYoYi5wdXNoKHRoaXMpLGQoKSl9LF9vbkNoYXJ0QXR0YWNoZWQoKXt0aGlzLmFjdGl2ZXx8KHRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSEwKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItZGlhbG9nLXNjcm9sbGFibGUvcGFwZXItZGlhbG9nLXNjcm9sbGFibGUuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItZGlhbG9nLXNjcm9sbGFibGUiLHByb3BlcnRpZXM6e2RpYWxvZ0VsZW1lbnQ6e3R5cGU6T2JqZWN0fX0sZ2V0IHNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzLiQuc2Nyb2xsYWJsZX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9lbnN1cmVUYXJnZXQoKTt0aGlzLmNsYXNzTGlzdC5hZGQoIm5vLXBhZGRpbmciKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9lbnN1cmVUYXJnZXQoKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy51cGRhdGVTY3JvbGxTdGF0ZS5iaW5kKHRoaXMpKX0sdXBkYXRlU2Nyb2xsU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNsYXNzKCJpcy1zY3JvbGxlZCIsMDx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3ApO3RoaXMudG9nZ2xlQ2xhc3MoImNhbi1zY3JvbGwiLHRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodDx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxIZWlnaHQpO3RoaXMudG9nZ2xlQ2xhc3MoInNjcm9sbGVkLXRvLWJvdHRvbSIsCnRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCt0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQ+PXRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbEhlaWdodCl9LF9lbnN1cmVUYXJnZXQ6ZnVuY3Rpb24oKXsodGhpcy5kaWFsb2dFbGVtZW50PXRoaXMuZGlhbG9nRWxlbWVudHx8dGhpcy5wYXJlbnRFbGVtZW50KSYmdGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycyYmMDw9dGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycy5pbmRleE9mKFBvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvckltcGwpPyh0aGlzLmRpYWxvZ0VsZW1lbnQuc2l6aW5nVGFyZ2V0PXRoaXMuc2Nyb2xsVGFyZ2V0LHRoaXMuc2Nyb2xsVGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoImZpdCIpKTp0aGlzLmRpYWxvZ0VsZW1lbnQmJnRoaXMuc2Nyb2xsVGFyZ2V0LmNsYXNzTGlzdC5hZGQoImZpdCIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW1hcmtkb3duLXZpZXcvdGYtbWFya2Rvd24tdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1tYXJrZG93bi12aWV3Iixwcm9wZXJ0aWVzOntodG1sOnt0eXBlOlN0cmluZyx2YWx1ZToiIn19LGF0dGFjaGVkKCl7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5tYXJrZG93biwhMCl9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXJkLWhlYWRpbmcvdXRpbC5qcwp2YXIgSGg7KGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoZil7aWYoIWYpcmV0dXJuIG51bGw7bGV0IGg9Zi5tYXRjaCgvXiMoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkkLyk7aWYoIWgpcmV0dXJuIG51bGw7aWYoND09Zi5sZW5ndGgpZm9yKGY9MTszPj1mO2YrKyloW2ZdKz1oW2ZdO3JldHVybltwYXJzZUludChoWzFdLDE2KSxwYXJzZUludChoWzJdLDE2KSxwYXJzZUludChoWzNdLDE2KV19Yi5mb3JtYXREYXRlPWZ1bmN0aW9uKGYpe3JldHVybiBmP2YudG9TdHJpbmcoKS5yZXBsYWNlKC9HTVQtXGQrIFwoKFteKV0rKVwpLywiJDEiKToiIn07Yi5waWNrVGV4dENvbG9yPWZ1bmN0aW9uKGYpe3JldHVybihmPWQoZikpPzEyNTxNYXRoLnJvdW5kKCgyOTkqZlswXSs1ODcqZlsxXSsxMTQqZlsyXSkvMUUzKT8iaW5oZXJpdCI6IiNlZWUiOiJpbmhlcml0In19KShIaHx8KEhoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2FyZC1oZWFkaW5nL3RmLWNhcmQtaGVhZGluZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jYXJkLWhlYWRpbmciLHByb3BlcnRpZXM6e2Rpc3BsYXlOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx0YWc6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHJ1bjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZGVzY3JpcHRpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGNvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfcnVuQmFja2dyb3VuZDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQmFja2dyb3VuZChjb2xvcikiLHJlYWRPbmx5OiEwLG9ic2VydmVyOiJfdXBkYXRlSGVhZGluZ1N0eWxlIn0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihjb2xvcikiLHJlYWRPbmx5OiEwLG9ic2VydmVyOiJfdXBkYXRlSGVhZGluZ1N0eWxlIn0sX25hbWVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlTmFtZUxhYmVsKGRpc3BsYXlOYW1lLCB0YWcpIn0sX3RhZ0xhYmVsOnt0eXBlOlN0cmluZywKY29tcHV0ZWQ6Il9jb21wdXRlVGFnTGFiZWwoZGlzcGxheU5hbWUsIHRhZykifX0sX3VwZGF0ZUhlYWRpbmdTdHlsZSgpe3RoaXMudXBkYXRlU3R5bGVzKHsiLS10Zi1jYXJkLWhlYWRpbmctYmFja2dyb3VuZC1jb2xvciI6dGhpcy5fcnVuQmFja2dyb3VuZCwiLS10Zi1jYXJkLWhlYWRpbmctY29sb3IiOnRoaXMuX3J1bkNvbG9yfSl9LF9jb21wdXRlUnVuQmFja2dyb3VuZChiKXtyZXR1cm4gYnx8Im5vbmUifSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBIaC5waWNrVGV4dENvbG9yKGIpfSxfY29tcHV0ZU5hbWVMYWJlbChiLGQpe3JldHVybiBifHxkfHwiIn0sX2NvbXB1dGVUYWdMYWJlbChiLGQpe3JldHVybiBkJiZkIT09Yj9kOiIifSxfdG9nZ2xlRGVzY3JpcHRpb25EaWFsb2coYil7dGhpcy4kLmRlc2NyaXB0aW9uRGlhbG9nLnBvc2l0aW9uVGFyZ2V0PWIudGFyZ2V0O3RoaXMuJC5kZXNjcmlwdGlvbkRpYWxvZy50b2dnbGUoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kYXNoYm9hcmQtY29tbW9uL3RmLWRvd25sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZG93bmxvYWRlciIscHJvcGVydGllczp7X3J1bjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHJ1bnM6QXJyYXksdGFnOlN0cmluZyx1cmxGbjpGdW5jdGlvbn0sX2NzdlVybChiLGQsZil7cmV0dXJuIGQ/dmMuYWRkUGFyYW1zKGYoYixkKSx7Zm9ybWF0OiJjc3YifSk6IiJ9LF9qc29uVXJsKGIsZCxmKXtyZXR1cm4gZD9mKGIsZCk6IiJ9LF9jc3ZOYW1lKGIsZCl7cmV0dXJuIGQ/YHJ1bi0ke2R9LXRhZy0ke2J9LmNzdmA6IiJ9LF9qc29uTmFtZShiLGQpe3JldHVybiBkP2BydW4tJHtkfS10YWctJHtifS5qc29uYDoiIn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNjYWxhci1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNjYWxhci1jYXJkIixwcm9wZXJ0aWVzOnt0YWc6U3RyaW5nLGRhdGFUb0xvYWQ6QXJyYXkseFR5cGU6U3RyaW5nLGFjdGl2ZTpCb29sZWFuLGlnbm9yZVlPdXRsaWVyczpCb29sZWFuLHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxzaG93RG93bkxpbmtzOkJvb2xlYW4sc21vb3RoaW5nRW5hYmxlZDpCb29sZWFuLHNtb290aGluZ1dlaWdodDpOdW1iZXIsdGFnTWV0YWRhdGE6T2JqZWN0LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyxfbG9hZERhdGFDYWxsYmFjazp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57Zj1mLm1hcChrPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqa1swXSksc3RlcDprWzFdLHNjYWxhcjprWzJdfSkpO2NvbnN0IGg9dGhpcy5fZ2V0U2VyaWVzTmFtZUZyb21EYXR1bShkKTtiLnNldFNlcmllc01ldGFkYXRhKGgsZCk7Yi5zZXRTZXJpZXNEYXRhKGgsCmYpfX0scmVhZE9ubHk6ITB9LGdldERhdGFMb2FkVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKHt0YWc6YixydW46ZH0pPT52Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgic2NhbGFycyIsIi9zY2FsYXJzIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6YixydW46ZH0pKX19LF9kb3dubG9hZFVybEZuOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGIsZCk9PnRoaXMuZ2V0RGF0YUxvYWRVcmwoe3RhZzpiLHJ1bjpkfSl9fSxyZXF1ZXN0RGF0YTpGdW5jdGlvbixfZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGI9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYil9fSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9sb2dTY2FsZUFjdGl2ZTpCb29sZWFuLF90b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe2NvbnN0IGI9CkdoLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TLnNsaWNlKCksZD1iLmZpbmRJbmRleChmPT4iTmFtZSI9PWYudGl0bGUpO2Iuc3BsaWNlKGQsMSx7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmY9PntmPWYuZGF0YXNldC5tZXRhZGF0YSgpLm1ldGE7cmV0dXJuIHRoaXMuX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGYpfX0pO3JldHVybiBifX19LHJlbG9hZCgpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLCF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9LF9yZXNldERvbWFpbigpe2NvbnN0IGI9dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpOwpiJiZiLnJlc2V0RG9tYWluKCl9LF91cGRhdGVEb3dubG9hZExpbmsoKXtjb25zdCBiPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5leHBvcnRBc1N2Z1N0cmluZygpO3RoaXMuJCQoIiNzdmdMaW5rIikuaHJlZj1gZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwke2J0b2EoYil9YH0sX3J1bnNGcm9tRGF0YShiKXtyZXR1cm4gYi5tYXAoZD0+ZC5ydW4pfSxfZ2V0RGF0YVNlcmllcygpe3JldHVybiB0aGlzLmRhdGFUb0xvYWQubWFwKGI9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYikpfSxfZ2V0U2VyaWVzTmFtZUZyb21EYXR1bSh7cnVuOmIsZXhwZXJpbWVudDpkPXtuYW1lOiJfZGVmYXVsdCJ9fSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KFtkLm5hbWUsYl0pfSxfZ2V0U2VyaWVzRGlzcGxheU5hbWVGcm9tRGF0dW0oYil7cmV0dXJuIGIucnVufSxfZ2V0Q29sb3JTY2FsZSgpe3JldHVybiBudWxsIT09dGhpcy5jb2xvclNjYWxlP3RoaXMuY29sb3JTY2FsZToKe3NjYWxlOmI9PntbLGJdPUpTT04ucGFyc2UoYik7cmV0dXJuIHBmLnJ1bnNDb2xvclNjYWxlKGIpfX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1yYW5nZS1iZWhhdmlvci9pcm9uLXJhbmdlLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uUmFuZ2VCZWhhdmlvcj17cHJvcGVydGllczp7dmFsdWU6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sbWluOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbWF4Ont0eXBlOk51bWJlcix2YWx1ZToxMDAsbm90aWZ5OiEwfSxzdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxLG5vdGlmeTohMH0scmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZSh2YWx1ZSwgbWluLCBtYXgsIHN0ZXApIl0sX2NhbGNSYXRpbzpmdW5jdGlvbihiKXtyZXR1cm4odGhpcy5fY2xhbXBWYWx1ZShiKS10aGlzLm1pbikvKHRoaXMubWF4LXRoaXMubWluKX0sX2NsYW1wVmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgubWluKHRoaXMubWF4LE1hdGgubWF4KHRoaXMubWluLHRoaXMuX2NhbGNTdGVwKGIpKSl9LF9jYWxjU3RlcDpmdW5jdGlvbihiKXtiPXBhcnNlRmxvYXQoYik7CmlmKCF0aGlzLnN0ZXApcmV0dXJuIGI7Yj1NYXRoLnJvdW5kKChiLXRoaXMubWluKS90aGlzLnN0ZXApO3JldHVybiAxPnRoaXMuc3RlcD9iLygxL3RoaXMuc3RlcCkrdGhpcy5taW46Yip0aGlzLnN0ZXArdGhpcy5taW59LF92YWxpZGF0ZVZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlKTt0aGlzLnZhbHVlPXRoaXMub2xkVmFsdWU9aXNOYU4oYik/dGhpcy5vbGRWYWx1ZTpiO3JldHVybiB0aGlzLnZhbHVlIT09Yn0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX3ZhbGlkYXRlVmFsdWUoKTt0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMudmFsdWUpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXByb2dyZXNzL3BhcGVyLXByb2dyZXNzLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXByb2dyZXNzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJhbmdlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlY29uZGFyeVByb2dyZXNzOnt0eXBlOk51bWJlcix2YWx1ZTowfSxzZWNvbmRhcnlSYXRpbzp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMH0saW5kZXRlcm1pbmF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfdG9nZ2xlSW5kZXRlcm1pbmF0ZSJ9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfZGlzYWJsZWRDaGFuZ2VkIn19LG9ic2VydmVyczpbIl9wcm9ncmVzc0NoYW5nZWQoc2Vjb25kYXJ5UHJvZ3Jlc3MsIHZhbHVlLCBtaW4sIG1heCwgaW5kZXRlcm1pbmF0ZSkiXSxob3N0QXR0cmlidXRlczp7cm9sZToicHJvZ3Jlc3NiYXIifSxfdG9nZ2xlSW5kZXRlcm1pbmF0ZTpmdW5jdGlvbihiKXt0aGlzLnRvZ2dsZUNsYXNzKCJpbmRldGVybWluYXRlIiwKYix0aGlzLiQucHJpbWFyeVByb2dyZXNzKX0sX3RyYW5zZm9ybVByb2dyZXNzOmZ1bmN0aW9uKGIsZCl7Yi5zdHlsZS50cmFuc2Zvcm09Yi5zdHlsZS53ZWJraXRUcmFuc2Zvcm09InNjYWxlWCgiK2QvMTAwKyIpIn0sX21haW5SYXRpb0NoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnByaW1hcnlQcm9ncmVzcyxiKX0sX3Byb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbihiLGQsZixoLGspe2I9dGhpcy5fY2xhbXBWYWx1ZShiKTtkPXRoaXMuX2NsYW1wVmFsdWUoZCk7dmFyIHQ9MTAwKnRoaXMuX2NhbGNSYXRpbyhiKSxsPTEwMCp0aGlzLl9jYWxjUmF0aW8oZCk7dGhpcy5fc2V0U2Vjb25kYXJ5UmF0aW8odCk7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnNlY29uZGFyeVByb2dyZXNzLHQpO3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsbCk7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz1iO2s/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciKToKdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGQpO3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixmKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsaCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLGI/InRydWUiOiJmYWxzZSIpfSxfaGlkZVNlY29uZGFyeVByb2dyZXNzOmZ1bmN0aW9uKGIpe3JldHVybiAwPT09Yn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1zbGlkZXIvcGFwZXItc2xpZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXNsaWRlciIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3IsUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9yLFBvbHltZXIuSXJvblJhbmdlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NuYXBzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxwaW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LHNlY29uZGFyeVByb2dyZXNzOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMCxvYnNlcnZlcjoiX3NlY29uZGFyeVByb2dyZXNzQ2hhbmdlZCJ9LGVkaXRhYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGltbWVkaWF0ZVZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sbWF4TWFya2Vyczp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGV4cGFuZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfSwKaWdub3JlQmFyVG91Y2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZHJhZ2dpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMCxub3RpZnk6ITB9LHRyYW5zaXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH0sbWFya2Vyczp7dHlwZTpBcnJheSxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl91cGRhdGVLbm9iKHZhbHVlLCBtaW4sIG1heCwgc25hcHMsIHN0ZXApIiwiX3ZhbHVlQ2hhbmdlZCh2YWx1ZSkiLCJfaW1tZWRpYXRlVmFsdWVDaGFuZ2VkKGltbWVkaWF0ZVZhbHVlKSIsIl91cGRhdGVNYXJrZXJzKG1heE1hcmtlcnMsIG1pbiwgbWF4LCBzbmFwcykiXSxob3N0QXR0cmlidXRlczp7cm9sZToic2xpZGVyIix0YWJpbmRleDowfSxrZXlCaW5kaW5nczp7bGVmdDoiX2xlZnRLZXkiLHJpZ2h0OiJfcmlnaHRLZXkiLCJkb3duIHBhZ2Vkb3duIGhvbWUiOiJfZGVjcmVtZW50S2V5IiwidXAgcGFnZXVwIGVuZCI6Il9pbmNyZW1lbnRLZXkifSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZUJhclRvdWNoJiZQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKHRoaXMuJC5zbGlkZXJCYXIsImF1dG8iKX0saW5jcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUrdGhpcy5zdGVwKX0sZGVjcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUtdGhpcy5zdGVwKX0sX3VwZGF0ZUtub2I6ZnVuY3Rpb24oYixkLGYpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixkKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsZik7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGIpO3RoaXMuX3Bvc2l0aW9uS25vYigxMDAqdGhpcy5fY2FsY1JhdGlvKGIpKX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgidmFsdWUtY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2ltbWVkaWF0ZVZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZHJhZ2dpbmc/CnRoaXMuZmlyZSgiaW1tZWRpYXRlLXZhbHVlLWNoYW5nZSIse2NvbXBvc2VkOiEwfSk6dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlfSxfc2Vjb25kYXJ5UHJvZ3Jlc3NDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz10aGlzLl9jbGFtcFZhbHVlKHRoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3MpfSxfZXhwYW5kS25vYjpmdW5jdGlvbigpe3RoaXMuX3NldEV4cGFuZCghMCl9LF9yZXNldEtub2I6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbERlYm91bmNlcigiZXhwYW5kS25vYiIpO3RoaXMuX3NldEV4cGFuZCghMSl9LF9wb3NpdGlvbktub2I6ZnVuY3Rpb24oYil7dGhpcy5fc2V0SW1tZWRpYXRlVmFsdWUodGhpcy5fY2FsY1N0ZXAodGhpcy5fY2FsY0tub2JQb3NpdGlvbihiKSkpO3RoaXMuX3NldFJhdGlvKDEwMCp0aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkpO3RoaXMuJC5zbGlkZXJLbm9iLnN0eWxlLmxlZnQ9dGhpcy5yYXRpbysiJSI7dGhpcy5kcmFnZ2luZyYmCih0aGlzLl9rbm9ic3RhcnR4PXRoaXMucmF0aW8qdGhpcy5fdy8xMDAsdGhpcy50cmFuc2xhdGUzZCgwLDAsMCx0aGlzLiQuc2xpZGVyS25vYikpfSxfY2FsY0tub2JQb3NpdGlvbjpmdW5jdGlvbihiKXtyZXR1cm4odGhpcy5tYXgtdGhpcy5taW4pKmIvMTAwK3RoaXMubWlufSxfb25UcmFjazpmdW5jdGlvbihiKXtiLnN0b3BQcm9wYWdhdGlvbigpO3N3aXRjaChiLmRldGFpbC5zdGF0ZSl7Y2FzZSAic3RhcnQiOnRoaXMuX3RyYWNrU3RhcnQoYik7YnJlYWs7Y2FzZSAidHJhY2siOnRoaXMuX3RyYWNrWChiKTticmVhaztjYXNlICJlbmQiOnRoaXMuX3RyYWNrRW5kKCl9fSxfdHJhY2tTdGFydDpmdW5jdGlvbigpe3RoaXMuX3NldFRyYW5zaXRpbmcoITEpO3RoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDt0aGlzLl9rbm9ic3RhcnR4PXRoaXMuX3N0YXJ0eD10aGlzLl94PXRoaXMucmF0aW8qdGhpcy5fdy8xMDA7dGhpcy5fbWlueD0tdGhpcy5fc3RhcnR4O3RoaXMuX21heHg9CnRoaXMuX3ctdGhpcy5fc3RhcnR4O3RoaXMuJC5zbGlkZXJLbm9iLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIik7dGhpcy5fc2V0RHJhZ2dpbmcoITApfSxfdHJhY2tYOmZ1bmN0aW9uKGIpe3RoaXMuZHJhZ2dpbmd8fHRoaXMuX3RyYWNrU3RhcnQoYik7dGhpcy5feD10aGlzLl9zdGFydHgrTWF0aC5taW4odGhpcy5fbWF4eCxNYXRoLm1heCh0aGlzLl9taW54LGIuZGV0YWlsLmR4Kih0aGlzLl9pc1JUTD8tMToxKSkpO3RoaXMuX3NldEltbWVkaWF0ZVZhbHVlKHRoaXMuX2NhbGNTdGVwKHRoaXMuX2NhbGNLbm9iUG9zaXRpb24odGhpcy5feC90aGlzLl93KjEwMCkpKTt0aGlzLnRyYW5zbGF0ZTNkKHRoaXMuX2NhbGNSYXRpbyh0aGlzLmltbWVkaWF0ZVZhbHVlKSp0aGlzLl93LXRoaXMuX2tub2JzdGFydHgrInB4IiwwLDAsdGhpcy4kLnNsaWRlcktub2IpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuc2xpZGVyS25vYi5zdHlsZTt0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpOwp0aGlzLl9zZXREcmFnZ2luZyghMSk7dGhpcy5fcmVzZXRLbm9iKCk7dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlO2IudHJhbnNmb3JtPWIud2Via2l0VHJhbnNmb3JtPSIiO3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2tub2Jkb3duOmZ1bmN0aW9uKGIpe3RoaXMuX2V4cGFuZEtub2IoKTtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5mb2N1cygpfSxfYmFydHJhY2s6ZnVuY3Rpb24oYil7dGhpcy5fYWxsb3dCYXJFdmVudChiKSYmdGhpcy5fb25UcmFjayhiKX0sX2JhcmNsaWNrOmZ1bmN0aW9uKGIpe3RoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDt2YXIgZD10aGlzLiQuc2xpZGVyQmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Q9KGIuZGV0YWlsLngtZC5sZWZ0KS90aGlzLl93KjEwMDt0aGlzLl9pc1JUTCYmKGQ9MTAwLWQpO3ZhciBmPXRoaXMucmF0aW87dGhpcy5fc2V0VHJhbnNpdGluZyghMCk7dGhpcy5fcG9zaXRpb25Lbm9iKGQpOwpmPT09dGhpcy5yYXRpbyYmdGhpcy5fc2V0VHJhbnNpdGluZyghMSk7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0pO2IucHJldmVudERlZmF1bHQoKTt0aGlzLmZvY3VzKCl9LF9iYXJkb3duOmZ1bmN0aW9uKGIpe3RoaXMuX2FsbG93QmFyRXZlbnQoYikmJih0aGlzLmRlYm91bmNlKCJleHBhbmRLbm9iIix0aGlzLl9leHBhbmRLbm9iLDYwKSx0aGlzLl9iYXJjbGljayhiKSl9LF9rbm9iVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihiKXtiLnRhcmdldD09PXRoaXMuJC5zbGlkZXJLbm9iJiZ0aGlzLl9zZXRUcmFuc2l0aW5nKCExKX0sX3VwZGF0ZU1hcmtlcnM6ZnVuY3Rpb24oYixkLGYsaCl7aHx8dGhpcy5fc2V0TWFya2VycyhbXSk7ZD1NYXRoLnJvdW5kKChmLWQpL3RoaXMuc3RlcCk7ZD5iJiYoZD1iKTtpZigwPmR8fCFpc0Zpbml0ZShkKSlkPTA7dGhpcy5fc2V0TWFya2VycyhBcnJheShkKSl9LF9tZXJnZUNsYXNzZXM6ZnVuY3Rpb24oYil7cmV0dXJuIE9iamVjdC5rZXlzKGIpLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gYltkXX0pLmpvaW4oIiAiKX0sCl9nZXRDbGFzc05hbWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21lcmdlQ2xhc3Nlcyh7ZGlzYWJsZWQ6dGhpcy5kaXNhYmxlZCxwaW46dGhpcy5waW4sc25hcHM6dGhpcy5zbmFwcyxyaW5nOnRoaXMuaW1tZWRpYXRlVmFsdWU8PXRoaXMubWluLGV4cGFuZDp0aGlzLmV4cGFuZCxkcmFnZ2luZzp0aGlzLmRyYWdnaW5nLHRyYW5zaXRpbmc6dGhpcy50cmFuc2l0aW5nLGVkaXRhYmxlOnRoaXMuZWRpdGFibGV9KX0sX2FsbG93QmFyRXZlbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIXRoaXMuaWdub3JlQmFyVG91Y2h8fGIuZGV0YWlsLnNvdXJjZUV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudH0sZ2V0IF9pc1JUTCgpe3ZvaWQgMD09PXRoaXMuX19pc1JUTCYmKHRoaXMuX19pc1JUTD0icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbik7cmV0dXJuIHRoaXMuX19pc1JUTH0sX2xlZnRLZXk6ZnVuY3Rpb24oYil7dGhpcy5faXNSVEw/dGhpcy5faW5jcmVtZW50S2V5KGIpOgp0aGlzLl9kZWNyZW1lbnRLZXkoYil9LF9yaWdodEtleTpmdW5jdGlvbihiKXt0aGlzLl9pc1JUTD90aGlzLl9kZWNyZW1lbnRLZXkoYik6dGhpcy5faW5jcmVtZW50S2V5KGIpfSxfaW5jcmVtZW50S2V5OmZ1bmN0aW9uKGIpe3RoaXMuZGlzYWJsZWR8fCgiZW5kIj09PWIuZGV0YWlsLmtleT90aGlzLnZhbHVlPXRoaXMubWF4OnRoaXMuaW5jcmVtZW50KCksdGhpcy5maXJlKCJjaGFuZ2UiKSxiLnByZXZlbnREZWZhdWx0KCkpfSxfZGVjcmVtZW50S2V5OmZ1bmN0aW9uKGIpe3RoaXMuZGlzYWJsZWR8fCgiaG9tZSI9PT1iLmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1pbjp0aGlzLmRlY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksYi5wcmV2ZW50RGVmYXVsdCgpKX0sX2NoYW5nZVZhbHVlOmZ1bmN0aW9uKGIpe3RoaXMudmFsdWU9Yi50YXJnZXQudmFsdWU7dGhpcy5maXJlKCJjaGFuZ2UiLHtjb21wb3NlZDohMH0pfSxfaW5wdXRLZXlEb3duOmZ1bmN0aW9uKGIpe2Iuc3RvcFByb3BhZ2F0aW9uKCl9LApfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5zbGlkZXJLbm9iO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX0sX2ZvY3VzZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2ImJnRoaXMuZW5zdXJlUmlwcGxlKCk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHRoaXMuX3JpcHBsZS5ob2xkRG93bj1iKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNtb290aGluZy1pbnB1dC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zbW9vdGhpbmctaW5wdXQiLHByb3BlcnRpZXM6e3N0ZXA6TnVtYmVyLG1heDpOdW1iZXIsbWluOk51bWJlcix3ZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOi42LG5vdGlmeTohMH0sX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyOnt0eXBlOk51bWJlcixub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQifSxfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Ont0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkIn19LF91cGRhdGVXZWlnaHQ6Xy5kZWJvdW5jZShmdW5jdGlvbihiKXt0aGlzLndlaWdodD1ifSwyNTApLF9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9dGhpcy5faW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIudG9TdHJpbmcoKTsKdGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyx0aGlzLl9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcil9LF9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkOmZ1bmN0aW9uKCl7MD4rdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0P3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD0iMCI6MTwrdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0JiYodGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PSIxIik7dmFyIGI9K3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dDtpc05hTihiKXx8dGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyxiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNjYWxhci1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc2NhbGFyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3Nob3dEb3dubG9hZExpbmtzOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOnBkLmdldEJvb2xlYW5Jbml0aWFsaXplcigiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLG9ic2VydmVyOiJfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlciJ9LF9zbW9vdGhpbmdXZWlnaHQ6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXROdW1iZXJJbml0aWFsaXplcigiX3Ntb290aGluZ1dlaWdodCIse2RlZmF1bHRWYWx1ZTouNn0pLG9ic2VydmVyOiJfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXIifSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoX3Ntb290aGluZ1dlaWdodCkifSxfaWdub3JlWU91dGxpZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6cGQuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfaWdub3JlWU91dGxpZXJzIiwKe2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyIn0sX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpyZy5YVHlwZS5TVEVQfSxfc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfZ2V0Q2F0ZWdvcnlJdGVtS2V5Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT5iPT5iLnRhZ30sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyKDUwKX19LGJlaGF2aW9yczpbcWQuQXJyYXlVcGRhdGVIZWxwZXJdLG9ic2VydmVyczpbIl91cGRhdGVDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIl0sCl9zaG93RG93bmxvYWRMaW5rc09ic2VydmVyOnBkLmdldEJvb2xlYW5PYnNlcnZlcigiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlcjpwZC5nZXROdW1iZXJPYnNlcnZlcigiX3Ntb290aGluZ1dlaWdodCIse2RlZmF1bHRWYWx1ZTouNn0pLF9pZ25vcmVZT3V0bGllcnNPYnNlcnZlcjpwZC5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKGIpe3JldHVybiAwPGJ9LF9nZXRDYXRlZ29yeUtleShiKXtyZXR1cm4gYi5tZXRhZGF0YS50eXBlPT0kYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFM/IiI6Yi5uYW1lfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT4Ke3RoaXMuX3JlbG9hZENoYXJ0cygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJzY2FsYXJzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5PYmplY3Qua2V5cyhoKSk7Zj12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkQ2hhcnRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXNjYWxhci1jYXJkIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfdXBkYXRlQ2F0ZWdvcmllcyhiLGQsZil7Yj1fLm1hcFZhbHVlcyhiLGg9Pk9iamVjdC5rZXlzKGgpKTsKZD0kYy5jYXRlZ29yaXplVGFncyhiLGQsZik7ZC5mb3JFYWNoKGg9PntoLml0ZW1zPWguaXRlbXMubWFwKGs9Pih7dGFnOmsudGFnLHNlcmllczprLnJ1bnMubWFwKHQ9Pih7cnVuOnQsdGFnOmsudGFnfSkpfSkpfSk7dGhpcy51cGRhdGVBcnJheVByb3AoIl9jYXRlZ29yaWVzIixkLHRoaXMuX2dldENhdGVnb3J5S2V5KX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtjb25zdCBoPWYudGFnLGs9e307Zi5zZXJpZXMuZm9yRWFjaCgoe3J1bjpwfSk9PntrW3BdPWRbcF1baF19KTtmPWgucmVwbGFjZSgvXC9zY2FsYXJfc3VtbWFyeSQvLCIiKTtsZXQge2Rlc2NyaXB0aW9uOnQsZGlzcGxheU5hbWU6bH09cmYuYWdncmVnYXRlVGFnSW5mbyhrLGYpO2IubWV0YWRhdGEudHlwZT09JGMuQ2F0ZWdvcnlUeXBlLlBSRUZJWF9HUk9VUCYmbC5zdGFydHNXaXRoKGIubmFtZSsiLyIpJiYobD1sLnNsaWNlKGIubmFtZS5sZW5ndGgrMSkpO3JldHVybntkZXNjcmlwdGlvbjp0LGRpc3BsYXlOYW1lOmx9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItaGVscGVycy5qcwp2YXIgVGk7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGgsayx0LGwscCl7dGhpcy5ydW49aDt0aGlzLnRhZz1rO3RoaXMubmFtZT10O3RoaXMuc2NhbGFyRGF0YT1sO3RoaXMuc3ltYm9sPXB9Z2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9c2V0RGF0YShoKXt0aGlzLnNjYWxhckRhdGE9aH1nZXREYXRhKCl7cmV0dXJuIHRoaXMuc2NhbGFyRGF0YX1nZXRSdW4oKXtyZXR1cm4gdGhpcy5ydW59Z2V0VGFnKCl7cmV0dXJuIHRoaXMudGFnfWdldFN5bWJvbCgpe3JldHVybiB0aGlzLnN5bWJvbH19Yi5EYXRhU2VyaWVzPWQ7Yi5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lPWZ1bmN0aW9uKGgsayl7cmV0dXJuYCR7a30gKCR7aH0pYH07Y2xhc3MgZntjb25zdHJ1Y3RvcihoKXt0aGlzLnJ1bkJhc2VkQ29sb3JTY2FsZT1ofXNjYWxlKGgpe3JldHVybiB0aGlzLnJ1bkJhc2VkQ29sb3JTY2FsZS5zY2FsZSh0aGlzLnBhcnNlUnVuTmFtZShoKSl9cGFyc2VSdW5OYW1lKGgpe3JldHVybihoPWgubWF0Y2goL1woKC4qKVwpJC8pKT8KaFsxXToiIn19Yi5EYXRhU2VyaWVzQ29sb3JTY2FsZT1mfSkoVGl8fChUaT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCIscHJvcGVydGllczp7cnVuczpBcnJheSx4VHlwZTpTdHJpbmcsYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITB9LHRpdGxlOlN0cmluZyxtYXJnaW5DaGFydFNlcmllczpBcnJheSxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25sb2FkTGlua3M6Qm9vbGVhbix0YWdNZXRhZGF0YTpPYmplY3QsdG9vbHRpcFNvcnRpbmdNZXRob2Q6U3RyaW5nLF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpuZXcgVGkuRGF0YVNlcmllc0NvbG9yU2NhbGUoe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSkscmVhZE9ubHk6ITB9LF90YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRhZ0ZpbHRlcihtYXJnaW5DaGFydFNlcmllcykifSxfdGFnRmlsdGVySW52YWxpZDpCb29sZWFuLF9uYW1lVG9EYXRhU2VyaWVzOnt0eXBlOk9iamVjdCwKdmFsdWU6KCk9Pih7fSl9LF9zZXJpZXNOYW1lczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlU2VyaWVzTmFtZXMoX25hbWVUb0RhdGFTZXJpZXMsIHJ1bnMpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfZGF0YVVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT57Y29uc3QgZD10aGlzLl90YWdGaWx0ZXI7cmV0dXJuIHZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvc2NhbGFycyIpLHt0YWc6ZCxydW46Yn0pfX19LF9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9tYXRjaGVzTGlzdE9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdGl0bGVEaXNwbGF5U3RyaW5nOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcodGl0bGUpIn0sCl9maWxsQXJlYTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6e2xvd2VyQWNjZXNzb3I6Yj0+Yi5sb3dlcixoaWdoZXJBY2Nlc3NvcjpiPT5iLnVwcGVyfX0sX3Rvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7Y29uc3QgYj1yZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKSxkPWY9PmlzTmFOKGYpPyJOYU4iOmIoZik7cmV0dXJuW3t0aXRsZToiTmFtZSIsZXZhbHVhdGU6Zj0+Zi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJWYWx1ZSIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnNjYWxhcil9LHt0aXRsZToiTG93ZXIgTWFyZ2luIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0ubG93ZXIpfSx7dGl0bGU6IlVwcGVyIE1hcmdpbiIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnVwcGVyKX0se3RpdGxlOiJTdGVwIixldmFsdWF0ZTpmPT5yZy5zdGVwRm9ybWF0dGVyKGYuZGF0dW0uc3RlcCl9LHt0aXRsZToiVGltZSIsCmV2YWx1YXRlOmY9PnJnLnRpbWVGb3JtYXR0ZXIoZi5kYXR1bS53YWxsX3RpbWUpfSx7dGl0bGU6IlJlbGF0aXZlIixldmFsdWF0ZTpmPT5yZy5yZWxhdGl2ZUZvcm1hdHRlcihyZy5yZWxhdGl2ZUFjY2Vzc29yKGYuZGF0dW0sLTEsZi5kYXRhc2V0KSl9XX19LF9taXNzaW5nVGFnczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3N0ZXBzTWlzbWF0Y2g6T2JqZWN0fSxvYnNlcnZlcnM6WyJfdXBkYXRlQ2hhcnQoX25hbWVUb0RhdGFTZXJpZXMpIiwiX3JlZnJlc2hEYXRhU2VyaWVzKF90YWdGaWx0ZXIpIl0scmVsb2FkKCl7dGhpcy4kLmxvYWRlci5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kLmxvYWRlci5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwKIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKX0sX3Jlc2V0RG9tYWluKCl7Y29uc3QgYj10aGlzLiQubG9hZGVyO2ImJmIucmVzZXREb21haW4oKX0sX2NzdlVybChiLGQpe2lmKCFkKXJldHVybiIiO2I9dGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCk7cmV0dXJuIHZjLmFkZFBhcmFtcyhiLHtmb3JtYXQ6ImNzdiJ9KX0sX2pzb25VcmwoYixkKXtpZighZClyZXR1cm4iIjtiPXRoaXMuX2Rvd25sb2FkRGF0YVVybChiLGQpO3JldHVybiB2Yy5hZGRQYXJhbXMoYix7Zm9ybWF0OiJqc29uIn0pfSxfZG93bmxvYWREYXRhVXJsKGIsZCl7Yj1iW2RdO2I9e3RhZzpiLmdldFRhZygpLHJ1bjpiLmdldFJ1bigpfTtyZXR1cm4gdmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9kb3dubG9hZF9kYXRhIiksYil9LF9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKGIpe3JldHVybihkLGYsaCk9PntpZihoLnJlZ2V4X3ZhbGlkKXt2YXIgaz1fLmNsb25lKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLAp0PVtdO18uZm9yRWFjaChiLGw9Pnt2YXIgcD0hMSxtPWgudGFnX3RvX2V2ZW50c1tsLnZhbHVlXTtjb25zdCBuPWgudGFnX3RvX2V2ZW50c1tsLmxvd2VyXSxxPWgudGFnX3RvX2V2ZW50c1tsLnVwcGVyXTtfLmlzVW5kZWZpbmVkKG0pJiYodC5wdXNoKGwudmFsdWUpLHA9ITApO18uaXNVbmRlZmluZWQobikmJih0LnB1c2gobC5sb3dlcikscD0hMCk7Xy5pc1VuZGVmaW5lZChxKSYmKHQucHVzaChsLnVwcGVyKSxwPSEwKTtpZighcCl7dmFyIHU9eT0+eVsxXTtpZihwPXRoaXMuX2ZpbmRTdGVwTWlzbWF0Y2gobCxtLm1hcCh1KSxuLm1hcCh1KSxxLm1hcCh1KSkpdGhpcy5zZXQoIl9zdGVwc01pc21hdGNoIixwKTtlbHNle3ZhciB4PXk9PnlbMl07cD1tLm1hcCgoeSx3KT0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKnlbMF0pLHN0ZXA6dSh5KSxzY2FsYXI6eCh5KSxsb3dlcjp4KG5bd10pLHVwcGVyOngocVt3XSl9KSk7bT1UaS5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lKGYsbC52YWx1ZSk7CnZhciBBPWtbbV07QT9BLnNldERhdGEocCk6KGw9dGhpcy5fY3JlYXRlTmV3RGF0YVNlcmllcyhmLGwudmFsdWUsbSxwKSxrW21dPWwpfX19KTt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLGspO2Q9Xy5maW5kSW5kZXgodGhpcy5fbWlzc2luZ1RhZ3MsbD0+bC5ydW49PT1mKTtpZih0Lmxlbmd0aCYmMyE9dC5sZW5ndGgpe2NvbnN0IGw9e3J1bjpmLHRhZ3M6dH07MDw9ZD90aGlzLnNwbGljZSgiX21pc3NpbmdUYWdzIixkLDEsbCk6dGhpcy5wdXNoKCJfbWlzc2luZ1RhZ3MiLGwpfWVsc2UgMDw9ZCYmdGhpcy5zcGxpY2UoIl9taXNzaW5nVGFncyIsZCwxKX1lbHNlIHRoaXMuc2V0KCJfdGFnRmlsdGVySW52YWxpZCIsITApfX0sX2ZpbmRTdGVwTWlzbWF0Y2goYixkLGYsaCl7cmV0dXJuIF8uaXNFcXVhbChmLGQpJiZfLmlzRXF1YWwoaCxkKT9udWxsOntzZXJpZXNPYmplY3Q6Yix2YWx1ZVN0ZXBzOmQsbG93ZXJTdGVwczpmLHVwcGVyU3RlcHM6aH19LF9jcmVhdGVOZXdEYXRhU2VyaWVzKGIsCmQsZixoKXt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtiXXw9MDtkPW5ldyBUaS5EYXRhU2VyaWVzKGIsZCxmLGgscmcuU1lNQk9MU19MSVNUW3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2JdXSk7dGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbYl09KHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2JdKzEpJXJnLlNZTUJPTFNfTElTVC5sZW5ndGg7cmV0dXJuIGR9LF91cGRhdGVDaGFydChiKXtfLmZvck93bihiLGQ9Pnt0aGlzLiQubG9hZGVyLnNldFNlcmllc0RhdGEoZC5nZXROYW1lKCksZC5nZXREYXRhKCkpfSl9LF9jb21wdXRlU2VyaWVzTmFtZXMoKXtjb25zdCBiPW5ldyBTZXQodGhpcy5ydW5zKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5fbmFtZVRvRGF0YVNlcmllcykuZmlsdGVyKChbLGRdKT0+Yi5oYXMoZC5ydW4pKS5tYXAoKFtkXSk9PmQpfSxfZGV0ZXJtaW5lQ29sb3IoYixkKXtyZXR1cm4gYi5zY2FsZShkKX0sCl9yZWZyZXNoRGF0YVNlcmllcygpe3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIse30pfSxfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKXtyZXR1cm4gYj0+dGhpcy5fbmFtZVRvRGF0YVNlcmllc1tiXS5nZXRTeW1ib2woKS5tZXRob2QoKX0sX2RldGVybWluZVN5bWJvbChiLGQpe3JldHVybiBiW2RdLmdldFN5bWJvbCgpLmNoYXJhY3Rlcn0sX2NvbXB1dGVUYWdGaWx0ZXIoYil7cmV0dXJuIF8uZmxhdHRlbihiLm1hcChkPT5bZC52YWx1ZSxkLmxvd2VyLGQudXBwZXJdKSkubWFwKGQ9PiIoIit0aGlzLl9lc2NhcGVSZWdleENoYXJhY3RlcnMoZCkrIikiKS5qb2luKCJ8Iil9LF9lc2NhcGVSZWdleENoYXJhY3RlcnMoYil7cmV0dXJuIGIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csIlxcJFx4MjYiKX0sX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihiKXtyZXR1cm4gYj8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSJ9LF90b2dnbGVNYXRjaGVzT3Blbigpe3RoaXMuc2V0KCJfbWF0Y2hlc0xpc3RPcGVuZWQiLAohdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQpfSxfY29tcHV0ZVRpdGxlRGlzcGxheVN0cmluZyhiKXtyZXR1cm4gYnx8InVudGl0bGVkIn0sX3NlcGFyYXRlV2l0aENvbW1hcyhiKXtyZXR1cm4gYi5qb2luKCIsICIpfSxfdG9nZ2xlTWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW4oKXt0aGlzLnNldCgiX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQiLCF0aGlzLl9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkKX0sX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKCl7Y29uc3QgYj10aGlzLiQkKCIjbWF0Y2gtbGlzdC1yZXBlYXQiKTtiJiZ0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLm1hdGNoLWxpc3QtZW50cnkiKS5mb3JFYWNoKGQ9Pntjb25zdCBmPWIuaXRlbUZvckVsZW1lbnQoZCk7ZC5zdHlsZS5jb2xvcj10aGlzLl9kZXRlcm1pbmVDb2xvcih0aGlzLl9jb2xvclNjYWxlLGYpfSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXkseFR5cGU6U3RyaW5nLGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSx0aXRsZTpTdHJpbmcsdGFnUmVnZXhlczpBcnJheSxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25sb2FkTGlua3M6Qm9vbGVhbixzbW9vdGhpbmdFbmFibGVkOkJvb2xlYW4sc21vb3RoaW5nV2VpZ2h0Ok51bWJlcix0YWdNZXRhZGF0YTpPYmplY3QsdG9vbHRpcFNvcnRpbmdNZXRob2Q6U3RyaW5nLF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpuZXcgVGkuRGF0YVNlcmllc0NvbG9yU2NhbGUoe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSkscmVhZE9ubHk6ITB9LF90YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRhZ0ZpbHRlcih0YWdSZWdleGVzKSJ9LF9uYW1lVG9EYXRhU2VyaWVzOnt0eXBlOk9iamVjdCwKdmFsdWU6KCk9Pih7fSl9LF9zZXJpZXNOYW1lczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlU2VyaWVzTmFtZXMoX25hbWVUb0RhdGFTZXJpZXMsIHJ1bnMpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfZGF0YVVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT57Y29uc3QgZD10aGlzLl90YWdGaWx0ZXI7cmV0dXJuIHZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvc2NhbGFycyIpLHt0YWc6ZCxydW46Yn0pfX19LF9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9tYXRjaGVzTGlzdE9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdGl0bGVEaXNwbGF5U3RyaW5nOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcodGl0bGUpIn19LApvYnNlcnZlcnM6WyJfdXBkYXRlQ2hhcnQoX25hbWVUb0RhdGFTZXJpZXMpIiwiX3JlZnJlc2hEYXRhU2VyaWVzKF90YWdGaWx0ZXIpIl0scmVsb2FkKCl7dGhpcy4kLmxvYWRlci5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kLmxvYWRlci5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwhdGhpcy5fbG9nU2NhbGVBY3RpdmUpfSxfcmVzZXREb21haW4oKXtjb25zdCBiPXRoaXMuJC5sb2FkZXI7YiYmYi5yZXNldERvbWFpbigpfSxfY3N2VXJsKGIsZCl7aWYoIWQpcmV0dXJuIiI7Yj10aGlzLl9kb3dubG9hZERhdGFVcmwoYixkKTtyZXR1cm4gdmMuYWRkUGFyYW1zKGIse2Zvcm1hdDoiY3N2In0pfSxfanNvblVybChiLGQpe2lmKCFkKXJldHVybiIiO2I9dGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCk7cmV0dXJuIHZjLmFkZFBhcmFtcyhiLAp7Zm9ybWF0OiJqc29uIn0pfSxfZG93bmxvYWREYXRhVXJsKGIsZCl7Yj1iW2RdO2I9e3RhZzpiLmdldFRhZygpLHJ1bjpiLmdldFJ1bigpfTtyZXR1cm4gdmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9kb3dubG9hZF9kYXRhIiksYil9LF9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCl7cmV0dXJuKGIsZCxmKT0+e2lmKGYucmVnZXhfdmFsaWQpe2NvbnN0IGg9Xy5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKTtfLmZvck93bihmLnRhZ190b19ldmVudHMsKGssdCk9Pntjb25zdCBsPWsubWFwKG09Pih7d2FsbF90aW1lOm5ldyBEYXRlKDFFMyptWzBdKSxzdGVwOm1bMV0sc2NhbGFyOm1bMl19KSk7az1UaS5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lKGQsdCk7Y29uc3QgcD1oW2tdO3A/cC5zZXREYXRhKGwpOihfLmlzVW5kZWZpbmVkKHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdKSYmKHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdPQowKSx0PW5ldyBUaS5EYXRhU2VyaWVzKGQsdCxrLGwscmcuU1lNQk9MU19MSVNUW3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdXSksaFtrXT10LHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdPSh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtkXSsxKSVyZy5TWU1CT0xTX0xJU1QubGVuZ3RoKX0pO3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIsaCl9fX0sX3VwZGF0ZUNoYXJ0KGIpe09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtkLGZdKT0+e3RoaXMuJC5sb2FkZXIuc2V0U2VyaWVzRGF0YShkLGYuZ2V0RGF0YSgpKX0pfSxfY29tcHV0ZVNlbGVjdGVkUnVuc1NldChiKXtjb25zdCBkPXt9O18uZm9yRWFjaChiLGY9PntkW2ZdPTF9KTtyZXR1cm4gZH0sX2NvbXB1dGVTZXJpZXNOYW1lcygpe2NvbnN0IGI9bmV3IFNldCh0aGlzLnJ1bnMpO3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKS5maWx0ZXIoKFssCmRdKT0+Yi5oYXMoZC5ydW4pKS5tYXAoKFtkXSk9PmQpfSxfZGV0ZXJtaW5lQ29sb3IoYixkKXtyZXR1cm4gYi5zY2FsZShkKX0sX3JlZnJlc2hEYXRhU2VyaWVzKCl7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIix7fSl9LF9jcmVhdGVTeW1ib2xGdW5jdGlvbigpe3JldHVybiBiPT50aGlzLl9uYW1lVG9EYXRhU2VyaWVzW2JdLmdldFN5bWJvbCgpLm1ldGhvZCgpfSxfZGV0ZXJtaW5lU3ltYm9sKGIsZCl7cmV0dXJuIGJbZF0uZ2V0U3ltYm9sKCkuY2hhcmFjdGVyfSxfY29tcHV0ZVRhZ0ZpbHRlcihiKXtyZXR1cm4gMT09PWIubGVuZ3RoP2JbMF06Yi5tYXAoZD0+IigiK2QrIikiKS5qb2luKCJ8Iil9LF9nZXRUb2dnbGVNYXRjaGVzSWNvbihiKXtyZXR1cm4gYj8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSJ9LF90b2dnbGVNYXRjaGVzT3Blbigpe3RoaXMuc2V0KCJfbWF0Y2hlc0xpc3RPcGVuZWQiLCF0aGlzLl9tYXRjaGVzTGlzdE9wZW5lZCl9LF9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKGIpe3JldHVybiBifHwKInVudGl0bGVkIn0sX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKCl7Y29uc3QgYj10aGlzLiQkKCIjbWF0Y2gtbGlzdC1yZXBlYXQiKTtiJiZ0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLm1hdGNoLWxpc3QtZW50cnkiKS5mb3JFYWNoKGQ9Pntjb25zdCBmPWIuaXRlbUZvckVsZW1lbnQoZCk7ZC5zdHlsZS5jb2xvcj10aGlzLl9kZXRlcm1pbmVDb2xvcih0aGlzLl9jb2xvclNjYWxlLGYpfSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQvdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcig1MCl9LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuQ2FuY2VsbGVyfSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9zaG93RG93bmxvYWRMaW5rczp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXIifSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoX3Ntb290aGluZ1dlaWdodCkifSxfc21vb3RoaW5nV2VpZ2h0Ont0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6cGQuZ2V0TnVtYmVySW5pdGlhbGl6ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLAp7ZGVmYXVsdFZhbHVlOi42fSksb2JzZXJ2ZXI6Il9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlciJ9LF9pZ25vcmVZT3V0bGllcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTpwZC5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9pZ25vcmVZT3V0bGllcnNPYnNlcnZlciJ9LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfbGF5b3V0Ok9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfbGF5b3V0KSJ9LF9vcGVuZWRDYXRlZ29yaWVzOnt0eXBlOk9iamVjdH0sX2FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCksZD10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+CntmLmNhbmNlbGxlZHx8KHRoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwhZi52YWx1ZS5jdXN0b21fc2NhbGFycyksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZXRyaWV2ZUxheW91dEFuZERhdGEoKSl9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZCl9LF9yZWxvYWRDaGFydHMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCwgdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9yZXRyaWV2ZUxheW91dEFuZERhdGEoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9sYXlvdXQiKSxkPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT57Zi5jYW5jZWxsZWR8fCh0aGlzLnNldCgiX2xheW91dCIsZi52YWx1ZSksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZWxvYWRDaGFydHMoKSl9KTsKdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfSxfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcjpwZC5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXI6cGQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI6cGQuZ2V0Qm9vbGVhbk9ic2VydmVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChiKXtyZXR1cm4gMDxifSxfbWFrZUNhdGVnb3JpZXMoYil7aWYoIWIuY2F0ZWdvcnkpcmV0dXJuW107bGV0IGQ9ITE7dGhpcy5fb3BlbmVkQ2F0ZWdvcmllc3x8KGQ9ITAsdGhpcy5fb3BlbmVkQ2F0ZWdvcmllcz17fSk7cmV0dXJuIGIuY2F0ZWdvcnkubWFwKGY9Pgp7ZCYmIWYuY2xvc2VkJiYodGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tmLnRpdGxlXT0hMCk7cmV0dXJue25hbWU6Zi50aXRsZSxpdGVtczpmLmNoYXJ0LG1ldGFkYXRhOntvcGVuZWQ6ISF0aGlzLl9vcGVuZWRDYXRlZ29yaWVzW2YudGl0bGVdfX19KX0sX2NhdGVnb3J5T3BlbmVkVG9nZ2xlZChiKXtiPWIudGFyZ2V0O2Iub3BlbmVkP3RoaXMuX29wZW5lZENhdGVnb3JpZXNbYi5jYXRlZ29yeS5uYW1lXT0hMDpkZWxldGUgdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tiLmNhdGVnb3J5Lm5hbWVdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltYWdlLWRhc2hib2FyZC90Zi1pbWFnZS1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaW1hZ2UtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcixvZlNhbXBsZXM6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxhY3R1YWxTaXplOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxicmlnaHRuZXNzQWRqdXN0bWVudDp7dHlwZTpOdW1iZXIsdmFsdWU6LjV9LGNvbnRyYXN0UGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MH0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXRhZGF0YUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9pbWFnZUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LF9zdGVwSW5kZXg6e3R5cGU6TnVtYmVyLApub3RpZnk6ITB9LF9jdXJyZW50U3RlcDp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXAoX3N0ZXBzLCBfc3RlcEluZGV4KSJ9LF9oYXNBdExlYXN0T25lU3RlcDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKF9zdGVwcykifSxfaGFzTXVsdGlwbGVTdGVwczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoX3N0ZXBzKSJ9LF9zdGVwVmFsdWU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVN0ZXBWYWx1ZShfY3VycmVudFN0ZXApIn0sX2N1cnJlbnRXYWxsVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFdhbGxUaW1lKF9jdXJyZW50U3RlcCkifSxfbWF4U3RlcEluZGV4Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhTdGVwSW5kZXgoX3N0ZXBzKSJ9LF9zYW1wbGVUZXh0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTYW1wbGVUZXh0KHNhbXBsZSkifSwKX2hhc011bHRpcGxlU2FtcGxlczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpIn0sX2lzSW1hZ2VMb2FkaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIiwiX3VwZGF0ZUltYWdlVXJsKF9jdXJyZW50U3RlcCwgYnJpZ2h0bmVzc0FkanVzdG1lbnQsIGNvbnRyYXN0UGVyY2VudGFnZSkiXSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChiKXtyZXR1cm4hIWImJjA8Yi5sZW5ndGh9LF9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhiKXtyZXR1cm4hIWImJjE8Yi5sZW5ndGh9LF9jb21wdXRlQ3VycmVudFN0ZXAoYixkKXtyZXR1cm4gYltkXXx8bnVsbH0sX2NvbXB1dGVTdGVwVmFsdWUoYil7cmV0dXJuIGI/Yi5zdGVwOjB9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lKGIpe3JldHVybiBiPwpIaC5mb3JtYXREYXRlKGIud2FsbF90aW1lKToiIn0sX2NvbXB1dGVNYXhTdGVwSW5kZXgoYil7cmV0dXJuIGIubGVuZ3RoLTF9LF9jb21wdXRlU2FtcGxlVGV4dChiKXtyZXR1cm5gJHtiKzF9YH0sX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMoYil7cmV0dXJuIDE8Yn0sX2dldEFyaWFFeHBhbmRlZCgpe3JldHVybiB0aGlzLmFjdHVhbFNpemU/InRydWUiOiJmYWxzZSJ9LGF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITA7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7aWYodGhpcy5fYXR0YWNoZWQpe3RoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBiPXZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL2ltYWdlcyIpLHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVuLHNhbXBsZTp0aGlzLnNhbXBsZX0pLGQ9dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwoZj1mLnZhbHVlLm1hcCh0aGlzLl9jcmVhdGVTdGVwRGF0dW0uYmluZCh0aGlzKSksCnRoaXMuc2V0KCJfc3RlcHMiLGYpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixmLmxlbmd0aC0xKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkKX19LF9jcmVhdGVTdGVwRGF0dW0oYil7bGV0IGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbmRpdmlkdWFsSW1hZ2UiKTtkPXZjLmFkZFBhcmFtcyhkLHt0czpiLndhbGxfdGltZX0pO2QrPSJceDI2IitiLnF1ZXJ5O3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmIud2FsbF90aW1lKSxzdGVwOmIuc3RlcCx1cmw6ZH19LF91cGRhdGVJbWFnZVVybChiLGQsZil7aWYoYil7dmFyIGg9bmV3IEltYWdlO3RoaXMuX2ltYWdlQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO2gub25sb2FkPWgub25lcnJvcj10aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxsYWJsZShrPT57ay5jYW5jZWxsZWR8fChrPXRoaXMuJCQoIiNtYWluLWltYWdlLWNvbnRhaW5lciIpLGsuaW5uZXJIVE1MPSIiLFBvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGgpLAp0aGlzLnNldCgiX2lzSW1hZ2VMb2FkaW5nIiwhMSkpfSkuYmluZCh0aGlzKTtoLnN0eWxlLmZpbHRlcj1gY29udHJhc3QoJHtmfSUpIGA7aC5zdHlsZS5maWx0ZXIrPWBicmlnaHRuZXNzKCR7ZH0pYDt0aGlzLnNldCgiX2lzSW1hZ2VMb2FkaW5nIiwhMCk7aC5zcmM9Yi51cmx9fSxfaGFuZGxlVGFwKCl7dGhpcy5zZXQoImFjdHVhbFNpemUiLCF0aGlzLmFjdHVhbFNpemUpfSxfdG9Mb2NhbGVTdHJpbmcoYil7cmV0dXJuIGIudG9Mb2NhbGVTdHJpbmcoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbWFnZS1kYXNoYm9hcmQvdGYtaW1hZ2UtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWltYWdlLWRhc2hib2FyZCIscHJvcGVydGllczp7X3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX2FjdHVhbFNpemU6Qm9vbGVhbixfZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50Ont0eXBlOk51bWJlcix2YWx1ZToxLHJlYWRPbmx5OiEwfSxfZGVmYXVsdENvbnRyYXN0UGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTAwLHJlYWRPbmx5OiEwfSxfYnJpZ2h0bmVzc0FkanVzdG1lbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9jb250cmFzdFBlcmNlbnRhZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjEwMH0sX3RhZ0ZpbHRlcjpTdHJpbmcsX2JyaWdodG5lc3NJc0RlZmF1bHQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVCcmlnaHRuZXNzSXNEZWZhdWx0KF9icmlnaHRuZXNzQWRqdXN0bWVudCkifSxfY29udHJhc3RJc0RlZmF1bHQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVDb250cmFzdElzRGVmYXVsdChfY29udHJhc3RQZXJjZW50YWdlKSJ9LApfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZEltYWdlcygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJpbWFnZXMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+e2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZj1fLm1hcFZhbHVlcyhkLGg9Pk9iamVjdC5rZXlzKGgpKTtmPXZjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLAowPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkSW1hZ2VzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWltYWdlLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9yZXNldEJyaWdodG5lc3MoKXt0aGlzLl9icmlnaHRuZXNzQWRqdXN0bWVudD10aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnR9LF9yZXNldENvbnRyYXN0KCl7dGhpcy5fY29udHJhc3RQZXJjZW50YWdlPXRoaXMuX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2V9LF9jb21wdXRlQnJpZ2h0bmVzc0lzRGVmYXVsdChiKXtyZXR1cm4gYj09PXRoaXMuX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudH0sX2NvbXB1dGVDb250cmFzdElzRGVmYXVsdChiKXtyZXR1cm4gYj09PXRoaXMuX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2V9LApfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgodCl7Y29uc3QgbD1iW3QucnVuXVt0LnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSx0LHtzYW1wbGU6cCxvZlNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIsdD0+T2JqZWN0LmtleXModCkpO3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaCkpfSkpfSxfdGFnTWV0YWRhdGEoYixkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWF1ZGlvLWRhc2hib2FyZC90Zi1hdWRpby1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtYXVkaW8tbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcix0b3RhbFNhbXBsZXM6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX21ldGFkYXRhQ2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX3N0ZXBzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3N0ZXBJbmRleDpOdW1iZXIsX2hhc0F0TGVhc3RPbmVTdGVwOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKSJ9LF9oYXNNdWx0aXBsZVN0ZXBzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhfc3RlcHMpIn0sX2N1cnJlbnREYXR1bTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudERhdHVtKF9zdGVwcywgX3N0ZXBJbmRleCkifSwKX21heFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4U3RlcEluZGV4KF9zdGVwcykifSxfc2FtcGxlVGV4dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlU2FtcGxlVGV4dChzYW1wbGUpIn0sX2hhc011bHRpcGxlU2FtcGxlczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyh0b3RhbFNhbXBsZXMpIn19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZykiXSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChiKXtyZXR1cm4hIWImJjA8Yi5sZW5ndGh9LF9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhiKXtyZXR1cm4hIWImJjE8Yi5sZW5ndGh9LF9jb21wdXRlTWF4U3RlcEluZGV4KGIpe3JldHVybiBiLmxlbmd0aC0xfSxfY29tcHV0ZUN1cnJlbnREYXR1bShiLGQpe3JldHVybiBiW2RdfSxfY29tcHV0ZVNhbXBsZVRleHQoYil7cmV0dXJuYCR7YisKMX1gfSxfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyhiKXtyZXR1cm4gMTxifSxhdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwO3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2F0dGFjaGVkKXt0aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxBbGwoKTt2YXIgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvYXVkaW8iLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW4sc2FtcGxlOnRoaXMuc2FtcGxlfSkpLGQ9dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwoZj1mLnZhbHVlLm1hcCh0aGlzLl9jcmVhdGVTdGVwRGF0dW0uYmluZCh0aGlzKSksdGhpcy5zZXQoIl9zdGVwcyIsZiksdGhpcy5zZXQoIl9zdGVwSW5kZXgiLGYubGVuZ3RoLTEpKX0pO3RoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfX0sX2NyZWF0ZVN0ZXBEYXR1bShiKXt2YXIgZD0KbmV3IFVSTFNlYXJjaFBhcmFtcyhiLnF1ZXJ5KTtkLmFwcGVuZCgidHMiLGIud2FsbF90aW1lKTtkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJhdWRpbyIsIi9pbmRpdmlkdWFsQXVkaW8iLGQpO3JldHVybnt3YWxsX3RpbWU6SGguZm9ybWF0RGF0ZShuZXcgRGF0ZSgxRTMqYi53YWxsX3RpbWUpKSxzdGVwOmIuc3RlcCxsYWJlbDpiLmxhYmVsLGNvbnRlbnRUeXBlOmIuY29udGVudFR5cGUsdXJsOmR9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWF1ZGlvLWRhc2hib2FyZC90Zi1hdWRpby1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtYXVkaW8tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyKSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZEF1ZGlvKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsCnRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBmPV8ubWFwVmFsdWVzKGQsaD0+T2JqZWN0LmtleXMoaCkpO2Y9dmMuZ2V0VGFncyhmKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCl9fSl9LF9yZWxvYWRBdWRpbygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1hdWRpby1sb2FkZXIiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgodCl7Y29uc3QgbD1iW3QucnVuXVt0LnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSx0LHtzYW1wbGU6cCx0b3RhbFNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIsdD0+T2JqZWN0LmtleXModCkpO3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAodD0+T2JqZWN0LmFzc2lnbih7fSwKdCx7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLHQuaXRlbXMubWFwKGgpKX0pKX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtyZXR1cm4gYltkXVtmXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWF1dG9ncm93LXRleHRhcmVhL2lyb24tYXV0b2dyb3ctdGV4dGFyZWEuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZV0scHJvcGVydGllczp7dmFsdWU6e29ic2VydmVyOiJfdmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LGJpbmRWYWx1ZTp7b2JzZXJ2ZXI6Il9iaW5kVmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjEsb2JzZXJ2ZXI6Il91cGRhdGVDYWNoZWQifSxtYXhSb3dzOnt0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJfdXBkYXRlQ2FjaGVkIn0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyx2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGlucHV0bW9kZTp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30scmVhZG9ubHk6e3R5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFufSwKbWlubGVuZ3RoOnt0eXBlOk51bWJlcn0sbWF4bGVuZ3RoOnt0eXBlOk51bWJlcn0sbGFiZWw6e3R5cGU6U3RyaW5nfX0sbGlzdGVuZXJzOntpbnB1dDoiX29uSW5wdXQifSxnZXQgdGV4dGFyZWEoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhfSxnZXQgc2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0fSxnZXQgc2VsZWN0aW9uRW5kKCl7cmV0dXJuIHRoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25FbmR9LHNldCBzZWxlY3Rpb25TdGFydChiKXt0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQ9Yn0sc2V0IHNlbGVjdGlvbkVuZChiKXt0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uRW5kPWJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKS8pJiYodGhpcy4kLnRleHRhcmVhLnN0eWxlLm1hcmdpbkxlZnQ9Ii0zcHgiKX0sdmFsaWRhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQudGV4dGFyZWEudmFsaWRpdHkudmFsaWQ7CmImJih0aGlzLnJlcXVpcmVkJiYiIj09PXRoaXMudmFsdWU/Yj0hMTp0aGlzLmhhc1ZhbGlkYXRvcigpJiYoYj1Qb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLnZhbHVlKSkpO3RoaXMuaW52YWxpZD0hYjt0aGlzLmZpcmUoImlyb24taW5wdXQtdmFsaWRhdGUiKTtyZXR1cm4gYn0sX2JpbmRWYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy52YWx1ZT1ifSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMudGV4dGFyZWE7ZCYmKGQudmFsdWUhPT1iJiYoZC52YWx1ZT1ifHwwPT09Yj9iOiIiKSx0aGlzLmJpbmRWYWx1ZT1iLHRoaXMuJC5taXJyb3IuaW5uZXJIVE1MPXRoaXMuX3ZhbHVlRm9yTWlycm9yKCksdGhpcy5maXJlKCJiaW5kLXZhbHVlLWNoYW5nZWQiLHt2YWx1ZTp0aGlzLmJpbmRWYWx1ZX0pKX0sX29uSW5wdXQ6ZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20oYikucGF0aDt0aGlzLnZhbHVlPWQ/ZFswXS52YWx1ZToKYi50YXJnZXQudmFsdWV9LF9jb25zdHJhaW46ZnVuY3Rpb24oYil7Yj1ifHxbIiJdO2ZvcihiPTA8dGhpcy5tYXhSb3dzJiZiLmxlbmd0aD50aGlzLm1heFJvd3M/Yi5zbGljZSgwLHRoaXMubWF4Um93cyk6Yi5zbGljZSgwKTswPHRoaXMucm93cyYmYi5sZW5ndGg8dGhpcy5yb3dzOyliLnB1c2goIiIpO3JldHVybiBiLmpvaW4oIlx4M2Nici9ceDNlIikrIlx4MjYjMTYwOyJ9LF92YWx1ZUZvck1pcnJvcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudGV4dGFyZWE7aWYoYilyZXR1cm4gdGhpcy50b2tlbnM9YiYmYi52YWx1ZT9iLnZhbHVlLnJlcGxhY2UoLyYvZ20sIlx4MjZhbXA7IikucmVwbGFjZSgvIi9nbSwiXHgyNnF1b3Q7IikucmVwbGFjZSgvJy9nbSwiXHgyNiMzOTsiKS5yZXBsYWNlKC88L2dtLCJceDI2bHQ7IikucmVwbGFjZSgvPi9nbSwiXHgyNmd0OyIpLnNwbGl0KCJcbiIpOlsiIl0sdGhpcy5fY29uc3RyYWluKHRoaXMudG9rZW5zKX0sX3VwZGF0ZUNhY2hlZDpmdW5jdGlvbigpe3RoaXMuJC5taXJyb3IuaW5uZXJIVE1MPQp0aGlzLl9jb25zdHJhaW4odGhpcy50b2tlbnMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLXRleHRhcmVhLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXRleHRhcmVhIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3JdLHByb3BlcnRpZXM6e19hcmlhTGFiZWxsZWRCeTp7b2JzZXJ2ZXI6Il9hcmlhTGFiZWxsZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSxfYXJpYURlc2NyaWJlZEJ5OntvYnNlcnZlcjoiX2FyaWFEZXNjcmliZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSx2YWx1ZTp7dHlwZTpTdHJpbmd9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LG1heFJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fSxnZXQgc2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0fSxzZXQgc2VsZWN0aW9uU3RhcnQoYil7dGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0PWJ9LGdldCBzZWxlY3Rpb25FbmQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZH0sCnNldCBzZWxlY3Rpb25FbmQoYil7dGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZD1ifSxfYXJpYUxhYmVsbGVkQnlDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLGIpfSxfYXJpYURlc2NyaWJlZEJ5Q2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c2FibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsYil9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudC50ZXh0YXJlYX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b2FzdC9wYXBlci10b2FzdC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPW51bGw7UG9seW1lcih7aXM6InBhcGVyLXRvYXN0IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvcl0scHJvcGVydGllczp7Zml0SW50bzp7dHlwZTpPYmplY3QsdmFsdWU6d2luZG93LG9ic2VydmVyOiJfb25GaXRJbnRvQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQifSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToiYm90dG9tIn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjNFM30sdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dHJhbnNpdGlvbmVuZDoiX19vblRyYW5zaXRpb25FbmQifSxnZXQgdmlzaWJsZSgpe1BvbHltZXIuQmFzZS5fd2FybigiYHZpc2libGVgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgb3BlbmVkYCBpbnN0ZWFkIik7CnJldHVybiB0aGlzLm9wZW5lZH0sZ2V0IF9jYW5BdXRvQ2xvc2UoKXtyZXR1cm4gMDx0aGlzLmR1cmF0aW9uJiZJbmZpbml0eSE9PXRoaXMuZHVyYXRpb259LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdXRvQ2xvc2U9bnVsbDtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKX0sc2hvdzpmdW5jdGlvbihkKXsic3RyaW5nIj09dHlwZW9mIGQmJihkPXt0ZXh0OmR9KTtmb3IodmFyIGYgaW4gZCkwPT09Zi5pbmRleE9mKCJfIik/UG9seW1lci5CYXNlLl93YXJuKCdUaGUgcHJvcGVydHkgIicrZisnIiBpcyBwcml2YXRlIGFuZCB3YXMgbm90IHNldC4nKTpmIGluIHRoaXM/dGhpc1tmXT1kW2ZdOlBvbHltZXIuQmFzZS5fd2FybignVGhlIHByb3BlcnR5ICInK2YrJyIgaXMgbm90IHZhbGlkLicpO3RoaXMub3BlbigpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZSgpfSxfX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihkKXtkJiZkLnRhcmdldD09PQp0aGlzJiYib3BhY2l0eSI9PT1kLnByb3BlcnR5TmFtZSYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOnRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fYXV0b0Nsb3NlJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9hdXRvQ2xvc2UpLHRoaXMuX2F1dG9DbG9zZT1udWxsKTt0aGlzLm9wZW5lZD8oYiYmYiE9PXRoaXMmJmIuY2xvc2UoKSxiPXRoaXMsdGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDp0aGlzLnRleHR9KSx0aGlzLl9jYW5BdXRvQ2xvc2UmJih0aGlzLl9hdXRvQ2xvc2U9dGhpcy5hc3luYyh0aGlzLmNsb3NlLHRoaXMuZHVyYXRpb24pKSk6Yj09PXRoaXMmJihiPW51bGwpO1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJwYXBlci10b2FzdC1vcGVuIil9LApfcmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QucmVtb3ZlKCJwYXBlci10b2FzdC1vcGVuIil9LF9vbkZpdEludG9DaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMucG9zaXRpb25UYXJnZXQ9ZH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItdG9nZ2xlLWJ1dHRvbi9wYXBlci10b2dnbGUtYnV0dG9uLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXRvZ2dsZS1idXR0b24iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJidXR0b24iLCJhcmlhLXByZXNzZWQiOiJmYWxzZSIsdGFiaW5kZXg6MH0scHJvcGVydGllczp7fSxsaXN0ZW5lcnM6e3RyYWNrOiJfb250cmFjayJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5SZW5kZXJTdGF0dXMuYWZ0ZXJOZXh0UmVuZGVyKHRoaXMsZnVuY3Rpb24oKXtQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKHRoaXMsInBhbi15Iil9KX0sX29udHJhY2s6ZnVuY3Rpb24oYil7Yj1iLmRldGFpbDsic3RhcnQiPT09Yi5zdGF0ZT90aGlzLl90cmFja1N0YXJ0KGIpOiJ0cmFjayI9PT1iLnN0YXRlP3RoaXMuX3RyYWNrTW92ZShiKToiZW5kIj09PWIuc3RhdGUmJnRoaXMuX3RyYWNrRW5kKGIpfSxfdHJhY2tTdGFydDpmdW5jdGlvbigpe3RoaXMuX3dpZHRoPXRoaXMuJC50b2dnbGVCYXIub2Zmc2V0V2lkdGgvCjI7dGhpcy5fdHJhY2tDaGVja2VkPXRoaXMuY2hlY2tlZDt0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIil9LF90cmFja01vdmU6ZnVuY3Rpb24oYil7Yj1iLmR4O3RoaXMuX3g9TWF0aC5taW4odGhpcy5fd2lkdGgsTWF0aC5tYXgoMCx0aGlzLl90cmFja0NoZWNrZWQ/dGhpcy5fd2lkdGgrYjpiKSk7dGhpcy50cmFuc2xhdGUzZCh0aGlzLl94KyJweCIsMCwwLHRoaXMuJC50b2dnbGVCdXR0b24pO3RoaXMuX3VzZXJBY3RpdmF0ZSh0aGlzLl94PnRoaXMuX3dpZHRoLzIpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoImRyYWdnaW5nIik7dGhpcy50cmFuc2Zvcm0oIiIsdGhpcy4kLnRvZ2dsZUJ1dHRvbil9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnRvZ2dsZUJ1dHRvbjt2YXIgYj1Qb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2NyZWF0ZVJpcHBsZSgpOwpiLmlkPSJpbmsiO2Iuc2V0QXR0cmlidXRlKCJyZWNlbnRlcnMiLCIiKTtiLmNsYXNzTGlzdC5hZGQoImNpcmNsZSIsInRvZ2dsZS1pbmsiKTtyZXR1cm4gYn19KTsKCihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpbW9kdWxlLmV4cG9ydHM9ZigpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpZGVmaW5lKFtdLGYpO2Vsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiKWc9d2luZG93O2Vsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKWc9Z2xvYmFsO2Vsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIilnPXNlbGY7ZWxzZSBnPXRoaXM7Zy5ncmFwaGxpYj1mKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApOwp2YXIgZj1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixmO312YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgbGliPXJlcXVpcmUoIi4vbGliIik7bW9kdWxlLmV4cG9ydHM9e0dyYXBoOmxpYi5HcmFwaCxqc29uOnJlcXVpcmUoIi4vbGliL2pzb24iKSxhbGc6cmVxdWlyZSgiLi9saWIvYWxnIiksdmVyc2lvbjpsaWIudmVyc2lvbn19LHsiLi9saWIiOjE3LCIuL2xpYi9hbGciOjgsIi4vbGliL2pzb24iOjE4fV0sCjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWNvbXBvbmVudHM7ZnVuY3Rpb24gY29tcG9uZW50cyhnKXt2YXIgdmlzaXRlZD17fSxjbXB0cz1bXSxjbXB0O2Z1bmN0aW9uIGRmcyh2KXtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybjt2aXNpdGVkW3ZdPXRydWU7Y21wdC5wdXNoKHYpO18uZWFjaChnLnN1Y2Nlc3NvcnModiksZGZzKTtfLmVhY2goZy5wcmVkZWNlc3NvcnModiksZGZzKX1fLmVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2NtcHQ9W107ZGZzKHYpO2lmKGNtcHQubGVuZ3RoKWNtcHRzLnB1c2goY21wdCl9KTtyZXR1cm4gY21wdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1kZnM7ZnVuY3Rpb24gZGZzKGcsdnMsb3JkZXIpe2lmKCFfLmlzQXJyYXkodnMpKXZzPQpbdnNdO3ZhciBuYXZpZ2F0aW9uPShnLmlzRGlyZWN0ZWQoKT9nLnN1Y2Nlc3NvcnM6Zy5uZWlnaGJvcnMpLmJpbmQoZyk7dmFyIGFjYz1bXSx2aXNpdGVkPXt9O18uZWFjaCh2cyxmdW5jdGlvbih2KXtpZighZy5oYXNOb2RlKHYpKXRocm93IG5ldyBFcnJvcigiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiAiK3YpO2RvRGZzKGcsdixvcmRlcj09PSJwb3N0Iix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKX0pO3JldHVybiBhY2N9ZnVuY3Rpb24gZG9EZnMoZyx2LHBvc3RvcmRlcix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKXtpZighXy5oYXModmlzaXRlZCx2KSl7dmlzaXRlZFt2XT10cnVlO2lmKCFwb3N0b3JkZXIpYWNjLnB1c2godik7Xy5lYWNoKG5hdmlnYXRpb24odiksZnVuY3Rpb24odyl7ZG9EZnMoZyx3LHBvc3RvcmRlcix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKX0pO2lmKHBvc3RvcmRlcilhY2MucHVzaCh2KX19fSx7Ii4uL2xvZGFzaCI6MTl9XSw0OltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7dmFyIGRpamtzdHJhPXJlcXVpcmUoIi4vZGlqa3N0cmEiKSxfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWRpamtzdHJhQWxsO2Z1bmN0aW9uIGRpamtzdHJhQWxsKGcsd2VpZ2h0RnVuYyxlZGdlRnVuYyl7cmV0dXJuIF8udHJhbnNmb3JtKGcubm9kZXMoKSxmdW5jdGlvbihhY2Msdil7YWNjW3ZdPWRpamtzdHJhKGcsdix3ZWlnaHRGdW5jLGVkZ2VGdW5jKX0se30pfX0seyIuLi9sb2Rhc2giOjE5LCIuL2RpamtzdHJhIjo1fV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksUHJpb3JpdHlRdWV1ZT1yZXF1aXJlKCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIik7bW9kdWxlLmV4cG9ydHM9ZGlqa3N0cmE7dmFyIERFRkFVTFRfV0VJR0hUX0ZVTkM9Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBkaWprc3RyYShnLHNvdXJjZSx3ZWlnaHRGbixlZGdlRm4pe3JldHVybiBydW5EaWprc3RyYShnLApTdHJpbmcoc291cmNlKSx3ZWlnaHRGbnx8REVGQVVMVF9XRUlHSFRfRlVOQyxlZGdlRm58fGZ1bmN0aW9uKHYpe3JldHVybiBnLm91dEVkZ2VzKHYpfSl9ZnVuY3Rpb24gcnVuRGlqa3N0cmEoZyxzb3VyY2Usd2VpZ2h0Rm4sZWRnZUZuKXt2YXIgcmVzdWx0cz17fSxwcT1uZXcgUHJpb3JpdHlRdWV1ZSx2LHZFbnRyeTt2YXIgdXBkYXRlTmVpZ2hib3JzPWZ1bmN0aW9uKGVkZ2Upe3ZhciB3PWVkZ2UudiE9PXY/ZWRnZS52OmVkZ2Uudyx3RW50cnk9cmVzdWx0c1t3XSx3ZWlnaHQ9d2VpZ2h0Rm4oZWRnZSksZGlzdGFuY2U9dkVudHJ5LmRpc3RhbmNlK3dlaWdodDtpZih3ZWlnaHQ8MCl0aHJvdyBuZXcgRXJyb3IoImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gIisiQmFkIGVkZ2U6ICIrZWRnZSsiIFdlaWdodDogIit3ZWlnaHQpO2lmKGRpc3RhbmNlPHdFbnRyeS5kaXN0YW5jZSl7d0VudHJ5LmRpc3RhbmNlPWRpc3RhbmNlO3dFbnRyeS5wcmVkZWNlc3Nvcj0KdjtwcS5kZWNyZWFzZSh3LGRpc3RhbmNlKX19O2cubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpe3ZhciBkaXN0YW5jZT12PT09c291cmNlPzA6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO3Jlc3VsdHNbdl09e2Rpc3RhbmNlOmRpc3RhbmNlfTtwcS5hZGQodixkaXN0YW5jZSl9KTt3aGlsZShwcS5zaXplKCk+MCl7dj1wcS5yZW1vdmVNaW4oKTt2RW50cnk9cmVzdWx0c1t2XTtpZih2RW50cnkuZGlzdGFuY2U9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpYnJlYWs7ZWRnZUZuKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKX1yZXR1cm4gcmVzdWx0c319LHsiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSI6MTUsIi4uL2xvZGFzaCI6MTl9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx0YXJqYW49cmVxdWlyZSgiLi90YXJqYW4iKTttb2R1bGUuZXhwb3J0cz1maW5kQ3ljbGVzO2Z1bmN0aW9uIGZpbmRDeWNsZXMoZyl7cmV0dXJuIF8uZmlsdGVyKHRhcmphbihnKSwKZnVuY3Rpb24oY21wdCl7cmV0dXJuIGNtcHQubGVuZ3RoPjF8fGNtcHQubGVuZ3RoPT09MSYmZy5oYXNFZGdlKGNtcHRbMF0sY21wdFswXSl9KX19LHsiLi4vbG9kYXNoIjoxOSwiLi90YXJqYW4iOjEzfV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9ZmxveWRXYXJzaGFsbDt2YXIgREVGQVVMVF9XRUlHSFRfRlVOQz1fLmNvbnN0YW50KDEpO2Z1bmN0aW9uIGZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbixlZGdlRm4pe3JldHVybiBydW5GbG95ZFdhcnNoYWxsKGcsd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZVTkMsZWRnZUZufHxmdW5jdGlvbih2KXtyZXR1cm4gZy5vdXRFZGdlcyh2KX0pfWZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbixlZGdlRm4pe3ZhciByZXN1bHRzPXt9LG5vZGVzPWcubm9kZXMoKTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHYpe3Jlc3VsdHNbdl09Cnt9O3Jlc3VsdHNbdl1bdl09e2Rpc3RhbmNlOjB9O25vZGVzLmZvckVhY2goZnVuY3Rpb24odyl7aWYodiE9PXcpcmVzdWx0c1t2XVt3XT17ZGlzdGFuY2U6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfX0pO2VkZ2VGbih2KS5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2Upe3ZhciB3PWVkZ2Uudj09PXY/ZWRnZS53OmVkZ2UudixkPXdlaWdodEZuKGVkZ2UpO3Jlc3VsdHNbdl1bd109e2Rpc3RhbmNlOmQscHJlZGVjZXNzb3I6dn19KX0pO25vZGVzLmZvckVhY2goZnVuY3Rpb24oayl7dmFyIHJvd0s9cmVzdWx0c1trXTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciByb3dJPXJlc3VsdHNbaV07bm9kZXMuZm9yRWFjaChmdW5jdGlvbihqKXt2YXIgaWs9cm93SVtrXTt2YXIga2o9cm93S1tqXTt2YXIgaWo9cm93SVtqXTt2YXIgYWx0RGlzdGFuY2U9aWsuZGlzdGFuY2Ura2ouZGlzdGFuY2U7aWYoYWx0RGlzdGFuY2U8aWouZGlzdGFuY2Upe2lqLmRpc3RhbmNlPWFsdERpc3RhbmNlO2lqLnByZWRlY2Vzc29yPQprai5wcmVkZWNlc3Nvcn19KX0pfSk7cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17Y29tcG9uZW50czpyZXF1aXJlKCIuL2NvbXBvbmVudHMiKSxkaWprc3RyYTpyZXF1aXJlKCIuL2RpamtzdHJhIiksZGlqa3N0cmFBbGw6cmVxdWlyZSgiLi9kaWprc3RyYS1hbGwiKSxmaW5kQ3ljbGVzOnJlcXVpcmUoIi4vZmluZC1jeWNsZXMiKSxmbG95ZFdhcnNoYWxsOnJlcXVpcmUoIi4vZmxveWQtd2Fyc2hhbGwiKSxpc0FjeWNsaWM6cmVxdWlyZSgiLi9pcy1hY3ljbGljIikscG9zdG9yZGVyOnJlcXVpcmUoIi4vcG9zdG9yZGVyIikscHJlb3JkZXI6cmVxdWlyZSgiLi9wcmVvcmRlciIpLHByaW06cmVxdWlyZSgiLi9wcmltIiksdGFyamFuOnJlcXVpcmUoIi4vdGFyamFuIiksdG9wc29ydDpyZXF1aXJlKCIuL3RvcHNvcnQiKX19LHsiLi9jb21wb25lbnRzIjoyLCIuL2RpamtzdHJhIjo1LAoiLi9kaWprc3RyYS1hbGwiOjQsIi4vZmluZC1jeWNsZXMiOjYsIi4vZmxveWQtd2Fyc2hhbGwiOjcsIi4vaXMtYWN5Y2xpYyI6OSwiLi9wb3N0b3JkZXIiOjEwLCIuL3ByZW9yZGVyIjoxMSwiLi9wcmltIjoxMiwiLi90YXJqYW4iOjEzLCIuL3RvcHNvcnQiOjE0fV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIHRvcHNvcnQ9cmVxdWlyZSgiLi90b3Bzb3J0Iik7bW9kdWxlLmV4cG9ydHM9aXNBY3ljbGljO2Z1bmN0aW9uIGlzQWN5Y2xpYyhnKXt0cnl7dG9wc29ydChnKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgdG9wc29ydC5DeWNsZUV4Y2VwdGlvbilyZXR1cm4gZmFsc2U7dGhyb3cgZTt9cmV0dXJuIHRydWV9fSx7Ii4vdG9wc29ydCI6MTR9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGRmcz1yZXF1aXJlKCIuL2RmcyIpO21vZHVsZS5leHBvcnRzPXBvc3RvcmRlcjtmdW5jdGlvbiBwb3N0b3JkZXIoZyx2cyl7cmV0dXJuIGRmcyhnLAp2cywicG9zdCIpfX0seyIuL2RmcyI6M31dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZGZzPXJlcXVpcmUoIi4vZGZzIik7bW9kdWxlLmV4cG9ydHM9cHJlb3JkZXI7ZnVuY3Rpb24gcHJlb3JkZXIoZyx2cyl7cmV0dXJuIGRmcyhnLHZzLCJwcmUiKX19LHsiLi9kZnMiOjN9XSwxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGgiKSxQcmlvcml0eVF1ZXVlPXJlcXVpcmUoIi4uL2RhdGEvcHJpb3JpdHktcXVldWUiKTttb2R1bGUuZXhwb3J0cz1wcmltO2Z1bmN0aW9uIHByaW0oZyx3ZWlnaHRGdW5jKXt2YXIgcmVzdWx0PW5ldyBHcmFwaCxwYXJlbnRzPXt9LHBxPW5ldyBQcmlvcml0eVF1ZXVlLHY7ZnVuY3Rpb24gdXBkYXRlTmVpZ2hib3JzKGVkZ2Upe3ZhciB3PWVkZ2Uudj09PXY/ZWRnZS53OmVkZ2Uudixwcmk9cHEucHJpb3JpdHkodyk7aWYocHJpIT09CnVuZGVmaW5lZCl7dmFyIGVkZ2VXZWlnaHQ9d2VpZ2h0RnVuYyhlZGdlKTtpZihlZGdlV2VpZ2h0PHByaSl7cGFyZW50c1t3XT12O3BxLmRlY3JlYXNlKHcsZWRnZVdlaWdodCl9fX1pZihnLm5vZGVDb3VudCgpPT09MClyZXR1cm4gcmVzdWx0O18uZWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7cHEuYWRkKHYsTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtyZXN1bHQuc2V0Tm9kZSh2KX0pO3BxLmRlY3JlYXNlKGcubm9kZXMoKVswXSwwKTt2YXIgaW5pdD1mYWxzZTt3aGlsZShwcS5zaXplKCk+MCl7dj1wcS5yZW1vdmVNaW4oKTtpZihfLmhhcyhwYXJlbnRzLHYpKXJlc3VsdC5zZXRFZGdlKHYscGFyZW50c1t2XSk7ZWxzZSBpZihpbml0KXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogIitnKTtlbHNlIGluaXQ9dHJ1ZTtnLm5vZGVFZGdlcyh2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyl9cmV0dXJuIHJlc3VsdH19LHsiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSI6MTUsCiIuLi9ncmFwaCI6MTYsIi4uL2xvZGFzaCI6MTl9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9dGFyamFuO2Z1bmN0aW9uIHRhcmphbihnKXt2YXIgaW5kZXg9MCxzdGFjaz1bXSx2aXNpdGVkPXt9LHJlc3VsdHM9W107ZnVuY3Rpb24gZGZzKHYpe3ZhciBlbnRyeT12aXNpdGVkW3ZdPXtvblN0YWNrOnRydWUsbG93bGluazppbmRleCxpbmRleDppbmRleCsrfTtzdGFjay5wdXNoKHYpO2cuc3VjY2Vzc29ycyh2KS5mb3JFYWNoKGZ1bmN0aW9uKHcpe2lmKCFfLmhhcyh2aXNpdGVkLHcpKXtkZnModyk7ZW50cnkubG93bGluaz1NYXRoLm1pbihlbnRyeS5sb3dsaW5rLHZpc2l0ZWRbd10ubG93bGluayl9ZWxzZSBpZih2aXNpdGVkW3ddLm9uU3RhY2spZW50cnkubG93bGluaz1NYXRoLm1pbihlbnRyeS5sb3dsaW5rLHZpc2l0ZWRbd10uaW5kZXgpfSk7aWYoZW50cnkubG93bGluaz09PWVudHJ5LmluZGV4KXt2YXIgY21wdD0KW10sdztkb3t3PXN0YWNrLnBvcCgpO3Zpc2l0ZWRbd10ub25TdGFjaz1mYWxzZTtjbXB0LnB1c2godyl9d2hpbGUodiE9PXcpO3Jlc3VsdHMucHVzaChjbXB0KX19Zy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odil7aWYoIV8uaGFzKHZpc2l0ZWQsdikpZGZzKHYpfSk7cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9dG9wc29ydDt0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uPUN5Y2xlRXhjZXB0aW9uO2Z1bmN0aW9uIHRvcHNvcnQoZyl7dmFyIHZpc2l0ZWQ9e30sc3RhY2s9e30scmVzdWx0cz1bXTtmdW5jdGlvbiB2aXNpdChub2RlKXtpZihfLmhhcyhzdGFjayxub2RlKSl0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb247aWYoIV8uaGFzKHZpc2l0ZWQsbm9kZSkpe3N0YWNrW25vZGVdPXRydWU7dmlzaXRlZFtub2RlXT10cnVlO18uZWFjaChnLnByZWRlY2Vzc29ycyhub2RlKSwKdmlzaXQpO2RlbGV0ZSBzdGFja1tub2RlXTtyZXN1bHRzLnB1c2gobm9kZSl9fV8uZWFjaChnLnNpbmtzKCksdmlzaXQpO2lmKF8uc2l6ZSh2aXNpdGVkKSE9PWcubm9kZUNvdW50KCkpdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uO3JldHVybiByZXN1bHRzfWZ1bmN0aW9uIEN5Y2xlRXhjZXB0aW9uKCl7fX0seyIuLi9sb2Rhc2giOjE5fV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPVByaW9yaXR5UXVldWU7ZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpe3RoaXMuX2Fycj1bXTt0aGlzLl9rZXlJbmRpY2VzPXt9fVByaW9yaXR5UXVldWUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXJyLmxlbmd0aH07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB4LmtleX0pfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXM9CmZ1bmN0aW9uKGtleSl7cmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsa2V5KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHk9ZnVuY3Rpb24oa2V5KXt2YXIgaW5kZXg9dGhpcy5fa2V5SW5kaWNlc1trZXldO2lmKGluZGV4IT09dW5kZWZpbmVkKXJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5taW49ZnVuY3Rpb24oKXtpZih0aGlzLnNpemUoKT09PTApdGhyb3cgbmV3IEVycm9yKCJRdWV1ZSB1bmRlcmZsb3ciKTtyZXR1cm4gdGhpcy5fYXJyWzBdLmtleX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGtleSxwcmlvcml0eSl7dmFyIGtleUluZGljZXM9dGhpcy5fa2V5SW5kaWNlcztrZXk9U3RyaW5nKGtleSk7aWYoIV8uaGFzKGtleUluZGljZXMsa2V5KSl7dmFyIGFycj10aGlzLl9hcnI7dmFyIGluZGV4PWFyci5sZW5ndGg7a2V5SW5kaWNlc1trZXldPWluZGV4O2Fyci5wdXNoKHtrZXk6a2V5LApwcmlvcml0eTpwcmlvcml0eX0pO3RoaXMuX2RlY3JlYXNlKGluZGV4KTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLnJlbW92ZU1pbj1mdW5jdGlvbigpe3RoaXMuX3N3YXAoMCx0aGlzLl9hcnIubGVuZ3RoLTEpO3ZhciBtaW49dGhpcy5fYXJyLnBvcCgpO2RlbGV0ZSB0aGlzLl9rZXlJbmRpY2VzW21pbi5rZXldO3RoaXMuX2hlYXBpZnkoMCk7cmV0dXJuIG1pbi5rZXl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmRlY3JlYXNlPWZ1bmN0aW9uKGtleSxwcmlvcml0eSl7dmFyIGluZGV4PXRoaXMuX2tleUluZGljZXNba2V5XTtpZihwcmlvcml0eT50aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5KXRocm93IG5ldyBFcnJvcigiTmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IHByaW9yaXR5LiAiKyJLZXk6ICIra2V5KyIgT2xkOiAiK3RoaXMuX2FycltpbmRleF0ucHJpb3JpdHkrIiBOZXc6ICIrcHJpb3JpdHkpO3RoaXMuX2FycltpbmRleF0ucHJpb3JpdHk9CnByaW9yaXR5O3RoaXMuX2RlY3JlYXNlKGluZGV4KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2hlYXBpZnk9ZnVuY3Rpb24oaSl7dmFyIGFycj10aGlzLl9hcnI7dmFyIGw9MippLHI9bCsxLGxhcmdlc3Q9aTtpZihsPGFyci5sZW5ndGgpe2xhcmdlc3Q9YXJyW2xdLnByaW9yaXR5PGFycltsYXJnZXN0XS5wcmlvcml0eT9sOmxhcmdlc3Q7aWYocjxhcnIubGVuZ3RoKWxhcmdlc3Q9YXJyW3JdLnByaW9yaXR5PGFycltsYXJnZXN0XS5wcmlvcml0eT9yOmxhcmdlc3Q7aWYobGFyZ2VzdCE9PWkpe3RoaXMuX3N3YXAoaSxsYXJnZXN0KTt0aGlzLl9oZWFwaWZ5KGxhcmdlc3QpfX19O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZT1mdW5jdGlvbihpbmRleCl7dmFyIGFycj10aGlzLl9hcnI7dmFyIHByaW9yaXR5PWFycltpbmRleF0ucHJpb3JpdHk7dmFyIHBhcmVudDt3aGlsZShpbmRleCE9PTApe3BhcmVudD1pbmRleD4+MTtpZihhcnJbcGFyZW50XS5wcmlvcml0eTxwcmlvcml0eSlicmVhazsKdGhpcy5fc3dhcChpbmRleCxwYXJlbnQpO2luZGV4PXBhcmVudH19O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9zd2FwPWZ1bmN0aW9uKGksail7dmFyIGFycj10aGlzLl9hcnI7dmFyIGtleUluZGljZXM9dGhpcy5fa2V5SW5kaWNlczt2YXIgb3JpZ0Fyckk9YXJyW2ldO3ZhciBvcmlnQXJySj1hcnJbal07YXJyW2ldPW9yaWdBcnJKO2FycltqXT1vcmlnQXJySTtrZXlJbmRpY2VzW29yaWdBcnJKLmtleV09aTtrZXlJbmRpY2VzW29yaWdBcnJJLmtleV09an19LHsiLi4vbG9kYXNoIjoxOX1dLDE2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPUdyYXBoO3ZhciBERUZBVUxUX0VER0VfTkFNRT0iXHgwMCIsR1JBUEhfTk9ERT0iXHgwMCIsRURHRV9LRVlfREVMSU09Ilx1MDAwMSI7ZnVuY3Rpb24gR3JhcGgob3B0cyl7dGhpcy5faXNEaXJlY3RlZD1fLmhhcyhvcHRzLCJkaXJlY3RlZCIpP29wdHMuZGlyZWN0ZWQ6CnRydWU7dGhpcy5faXNNdWx0aWdyYXBoPV8uaGFzKG9wdHMsIm11bHRpZ3JhcGgiKT9vcHRzLm11bHRpZ3JhcGg6ZmFsc2U7dGhpcy5faXNDb21wb3VuZD1fLmhhcyhvcHRzLCJjb21wb3VuZCIpP29wdHMuY29tcG91bmQ6ZmFsc2U7dGhpcy5fbGFiZWw9dW5kZWZpbmVkO3RoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj1fLmNvbnN0YW50KHVuZGVmaW5lZCk7dGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPV8uY29uc3RhbnQodW5kZWZpbmVkKTt0aGlzLl9ub2Rlcz17fTtpZih0aGlzLl9pc0NvbXBvdW5kKXt0aGlzLl9wYXJlbnQ9e307dGhpcy5fY2hpbGRyZW49e307dGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV09e319dGhpcy5faW49e307dGhpcy5fcHJlZHM9e307dGhpcy5fb3V0PXt9O3RoaXMuX3N1Y3M9e307dGhpcy5fZWRnZU9ianM9e307dGhpcy5fZWRnZUxhYmVscz17fX1HcmFwaC5wcm90b3R5cGUuX25vZGVDb3VudD0wO0dyYXBoLnByb3RvdHlwZS5fZWRnZUNvdW50PTA7R3JhcGgucHJvdG90eXBlLmlzRGlyZWN0ZWQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRGlyZWN0ZWR9O0dyYXBoLnByb3RvdHlwZS5pc011bHRpZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNNdWx0aWdyYXBofTtHcmFwaC5wcm90b3R5cGUuaXNDb21wb3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0NvbXBvdW5kfTtHcmFwaC5wcm90b3R5cGUuc2V0R3JhcGg9ZnVuY3Rpb24obGFiZWwpe3RoaXMuX2xhYmVsPWxhYmVsO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9O0dyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsPWZ1bmN0aW9uKG5ld0RlZmF1bHQpe2lmKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpbmV3RGVmYXVsdD1fLmNvbnN0YW50KG5ld0RlZmF1bHQpO3RoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj1uZXdEZWZhdWx0O3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUubm9kZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVDb3VudH07CkdyYXBoLnByb3RvdHlwZS5ub2Rlcz1mdW5jdGlvbigpe3JldHVybiBfLmtleXModGhpcy5fbm9kZXMpfTtHcmFwaC5wcm90b3R5cGUuc291cmNlcz1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7cmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gXy5pc0VtcHR5KHNlbGYuX2luW3ZdKX0pfTtHcmFwaC5wcm90b3R5cGUuc2lua3M9ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3JldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIF8uaXNFbXB0eShzZWxmLl9vdXRbdl0pfSl9O0dyYXBoLnByb3RvdHlwZS5zZXROb2Rlcz1mdW5jdGlvbih2cyx2YWx1ZSl7dmFyIGFyZ3M9YXJndW1lbnRzO3ZhciBzZWxmPXRoaXM7Xy5lYWNoKHZzLGZ1bmN0aW9uKHYpe2lmKGFyZ3MubGVuZ3RoPjEpc2VsZi5zZXROb2RlKHYsdmFsdWUpO2Vsc2Ugc2VsZi5zZXROb2RlKHYpfSk7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXROb2RlPQpmdW5jdGlvbih2LHZhbHVlKXtpZihfLmhhcyh0aGlzLl9ub2Rlcyx2KSl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXRoaXMuX25vZGVzW3ZdPXZhbHVlO3JldHVybiB0aGlzfXRoaXMuX25vZGVzW3ZdPWFyZ3VtZW50cy5sZW5ndGg+MT92YWx1ZTp0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4odik7aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcGFyZW50W3ZdPUdSQVBIX05PREU7dGhpcy5fY2hpbGRyZW5bdl09e307dGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV1bdl09dHJ1ZX10aGlzLl9pblt2XT17fTt0aGlzLl9wcmVkc1t2XT17fTt0aGlzLl9vdXRbdl09e307dGhpcy5fc3Vjc1t2XT17fTsrK3RoaXMuX25vZGVDb3VudDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLm5vZGU9ZnVuY3Rpb24odil7cmV0dXJuIHRoaXMuX25vZGVzW3ZdfTtHcmFwaC5wcm90b3R5cGUuaGFzTm9kZT1mdW5jdGlvbih2KXtyZXR1cm4gXy5oYXModGhpcy5fbm9kZXMsdil9O0dyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlPQpmdW5jdGlvbih2KXt2YXIgc2VsZj10aGlzO2lmKF8uaGFzKHRoaXMuX25vZGVzLHYpKXt2YXIgcmVtb3ZlRWRnZT1mdW5jdGlvbihlKXtzZWxmLnJlbW92ZUVkZ2Uoc2VsZi5fZWRnZU9ianNbZV0pfTtkZWxldGUgdGhpcy5fbm9kZXNbdl07aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7ZGVsZXRlIHRoaXMuX3BhcmVudFt2XTtfLmVhY2godGhpcy5jaGlsZHJlbih2KSxmdW5jdGlvbihjaGlsZCl7c2VsZi5zZXRQYXJlbnQoY2hpbGQpfSk7ZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3ZdfV8uZWFjaChfLmtleXModGhpcy5faW5bdl0pLHJlbW92ZUVkZ2UpO2RlbGV0ZSB0aGlzLl9pblt2XTtkZWxldGUgdGhpcy5fcHJlZHNbdl07Xy5lYWNoKF8ua2V5cyh0aGlzLl9vdXRbdl0pLHJlbW92ZUVkZ2UpO2RlbGV0ZSB0aGlzLl9vdXRbdl07ZGVsZXRlIHRoaXMuX3N1Y3Nbdl07LS10aGlzLl9ub2RlQ291bnR9cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXRQYXJlbnQ9CmZ1bmN0aW9uKHYscGFyZW50KXtpZighdGhpcy5faXNDb21wb3VuZCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgcGFyZW50IGluIGEgbm9uLWNvbXBvdW5kIGdyYXBoIik7aWYoXy5pc1VuZGVmaW5lZChwYXJlbnQpKXBhcmVudD1HUkFQSF9OT0RFO2Vsc2V7cGFyZW50Kz0iIjtmb3IodmFyIGFuY2VzdG9yPXBhcmVudDshXy5pc1VuZGVmaW5lZChhbmNlc3Rvcik7YW5jZXN0b3I9dGhpcy5wYXJlbnQoYW5jZXN0b3IpKWlmKGFuY2VzdG9yPT09dil0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgIitwYXJlbnQrIiBhcyBwYXJlbnQgb2YgIit2KyIgd291bGQgY3JlYXRlIGEgY3ljbGUiKTt0aGlzLnNldE5vZGUocGFyZW50KX10aGlzLnNldE5vZGUodik7dGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7dGhpcy5fcGFyZW50W3ZdPXBhcmVudDt0aGlzLl9jaGlsZHJlbltwYXJlbnRdW3ZdPXRydWU7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Q9CmZ1bmN0aW9uKHYpe2RlbGV0ZSB0aGlzLl9jaGlsZHJlblt0aGlzLl9wYXJlbnRbdl1dW3ZdfTtHcmFwaC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHYpe2lmKHRoaXMuX2lzQ29tcG91bmQpe3ZhciBwYXJlbnQ9dGhpcy5fcGFyZW50W3ZdO2lmKHBhcmVudCE9PUdSQVBIX05PREUpcmV0dXJuIHBhcmVudH19O0dyYXBoLnByb3RvdHlwZS5jaGlsZHJlbj1mdW5jdGlvbih2KXtpZihfLmlzVW5kZWZpbmVkKHYpKXY9R1JBUEhfTk9ERTtpZih0aGlzLl9pc0NvbXBvdW5kKXt2YXIgY2hpbGRyZW49dGhpcy5fY2hpbGRyZW5bdl07aWYoY2hpbGRyZW4pcmV0dXJuIF8ua2V5cyhjaGlsZHJlbil9ZWxzZSBpZih2PT09R1JBUEhfTk9ERSlyZXR1cm4gdGhpcy5ub2RlcygpO2Vsc2UgaWYodGhpcy5oYXNOb2RlKHYpKXJldHVybltdfTtHcmFwaC5wcm90b3R5cGUucHJlZGVjZXNzb3JzPWZ1bmN0aW9uKHYpe3ZhciBwcmVkc1Y9dGhpcy5fcHJlZHNbdl07aWYocHJlZHNWKXJldHVybiBfLmtleXMocHJlZHNWKX07CkdyYXBoLnByb3RvdHlwZS5zdWNjZXNzb3JzPWZ1bmN0aW9uKHYpe3ZhciBzdWNzVj10aGlzLl9zdWNzW3ZdO2lmKHN1Y3NWKXJldHVybiBfLmtleXMoc3Vjc1YpfTtHcmFwaC5wcm90b3R5cGUubmVpZ2hib3JzPWZ1bmN0aW9uKHYpe3ZhciBwcmVkcz10aGlzLnByZWRlY2Vzc29ycyh2KTtpZihwcmVkcylyZXR1cm4gXy51bmlvbihwcmVkcyx0aGlzLnN1Y2Nlc3NvcnModikpfTtHcmFwaC5wcm90b3R5cGUuaXNMZWFmPWZ1bmN0aW9uKHYpe3ZhciBuZWlnaGJvcnM7aWYodGhpcy5pc0RpcmVjdGVkKCkpbmVpZ2hib3JzPXRoaXMuc3VjY2Vzc29ycyh2KTtlbHNlIG5laWdoYm9ycz10aGlzLm5laWdoYm9ycyh2KTtyZXR1cm4gbmVpZ2hib3JzLmxlbmd0aD09PTB9O0dyYXBoLnByb3RvdHlwZS5maWx0ZXJOb2Rlcz1mdW5jdGlvbihmaWx0ZXIpe3ZhciBjb3B5PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHtkaXJlY3RlZDp0aGlzLl9pc0RpcmVjdGVkLG11bHRpZ3JhcGg6dGhpcy5faXNNdWx0aWdyYXBoLApjb21wb3VuZDp0aGlzLl9pc0NvbXBvdW5kfSk7Y29weS5zZXRHcmFwaCh0aGlzLmdyYXBoKCkpO3ZhciBzZWxmPXRoaXM7Xy5lYWNoKHRoaXMuX25vZGVzLGZ1bmN0aW9uKHZhbHVlLHYpe2lmKGZpbHRlcih2KSljb3B5LnNldE5vZGUodix2YWx1ZSl9KTtfLmVhY2godGhpcy5fZWRnZU9ianMsZnVuY3Rpb24oZSl7aWYoY29weS5oYXNOb2RlKGUudikmJmNvcHkuaGFzTm9kZShlLncpKWNvcHkuc2V0RWRnZShlLHNlbGYuZWRnZShlKSl9KTt2YXIgcGFyZW50cz17fTtmdW5jdGlvbiBmaW5kUGFyZW50KHYpe3ZhciBwYXJlbnQ9c2VsZi5wYXJlbnQodik7aWYocGFyZW50PT09dW5kZWZpbmVkfHxjb3B5Lmhhc05vZGUocGFyZW50KSl7cGFyZW50c1t2XT1wYXJlbnQ7cmV0dXJuIHBhcmVudH1lbHNlIGlmKHBhcmVudCBpbiBwYXJlbnRzKXJldHVybiBwYXJlbnRzW3BhcmVudF07ZWxzZSByZXR1cm4gZmluZFBhcmVudChwYXJlbnQpfWlmKHRoaXMuX2lzQ29tcG91bmQpXy5lYWNoKGNvcHkubm9kZXMoKSwKZnVuY3Rpb24odil7Y29weS5zZXRQYXJlbnQodixmaW5kUGFyZW50KHYpKX0pO3JldHVybiBjb3B5fTtHcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdEVkZ2VMYWJlbD1mdW5jdGlvbihuZXdEZWZhdWx0KXtpZighXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKW5ld0RlZmF1bHQ9Xy5jb25zdGFudChuZXdEZWZhdWx0KTt0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm49bmV3RGVmYXVsdDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmVkZ2VDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlQ291bnR9O0dyYXBoLnByb3RvdHlwZS5lZGdlcz1mdW5jdGlvbigpe3JldHVybiBfLnZhbHVlcyh0aGlzLl9lZGdlT2Jqcyl9O0dyYXBoLnByb3RvdHlwZS5zZXRQYXRoPWZ1bmN0aW9uKHZzLHZhbHVlKXt2YXIgc2VsZj10aGlzLGFyZ3M9YXJndW1lbnRzO18ucmVkdWNlKHZzLGZ1bmN0aW9uKHYsdyl7aWYoYXJncy5sZW5ndGg+MSlzZWxmLnNldEVkZ2Uodix3LHZhbHVlKTtlbHNlIHNlbGYuc2V0RWRnZSh2LAp3KTtyZXR1cm4gd30pO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuc2V0RWRnZT1mdW5jdGlvbigpe3ZhciB2LHcsbmFtZSx2YWx1ZSx2YWx1ZVNwZWNpZmllZD1mYWxzZSxhcmcwPWFyZ3VtZW50c1swXTtpZih0eXBlb2YgYXJnMD09PSJvYmplY3QiJiZhcmcwIT09bnVsbCYmInYiaW4gYXJnMCl7dj1hcmcwLnY7dz1hcmcwLnc7bmFtZT1hcmcwLm5hbWU7aWYoYXJndW1lbnRzLmxlbmd0aD09PTIpe3ZhbHVlPWFyZ3VtZW50c1sxXTt2YWx1ZVNwZWNpZmllZD10cnVlfX1lbHNle3Y9YXJnMDt3PWFyZ3VtZW50c1sxXTtuYW1lPWFyZ3VtZW50c1szXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpe3ZhbHVlPWFyZ3VtZW50c1syXTt2YWx1ZVNwZWNpZmllZD10cnVlfX12PSIiK3Y7dz0iIit3O2lmKCFfLmlzVW5kZWZpbmVkKG5hbWUpKW5hbWU9IiIrbmFtZTt2YXIgZT1lZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7aWYoXy5oYXModGhpcy5fZWRnZUxhYmVscywKZSkpe2lmKHZhbHVlU3BlY2lmaWVkKXRoaXMuX2VkZ2VMYWJlbHNbZV09dmFsdWU7cmV0dXJuIHRoaXN9aWYoIV8uaXNVbmRlZmluZWQobmFtZSkmJiF0aGlzLl9pc011bHRpZ3JhcGgpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IGEgbmFtZWQgZWRnZSB3aGVuIGlzTXVsdGlncmFwaCBceDNkIGZhbHNlIik7dGhpcy5zZXROb2RlKHYpO3RoaXMuc2V0Tm9kZSh3KTt0aGlzLl9lZGdlTGFiZWxzW2VdPXZhbHVlU3BlY2lmaWVkP3ZhbHVlOnRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbih2LHcsbmFtZSk7dmFyIGVkZ2VPYmo9ZWRnZUFyZ3NUb09iaih0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTt2PWVkZ2VPYmoudjt3PWVkZ2VPYmoudztPYmplY3QuZnJlZXplKGVkZ2VPYmopO3RoaXMuX2VkZ2VPYmpzW2VdPWVkZ2VPYmo7aW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fcHJlZHNbd10sdik7aW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fc3Vjc1t2XSx3KTt0aGlzLl9pblt3XVtlXT0KZWRnZU9iajt0aGlzLl9vdXRbdl1bZV09ZWRnZU9iajt0aGlzLl9lZGdlQ291bnQrKztyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmVkZ2U9ZnVuY3Rpb24odix3LG5hbWUpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg9PT0xP2VkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7cmV0dXJuIHRoaXMuX2VkZ2VMYWJlbHNbZV19O0dyYXBoLnByb3RvdHlwZS5oYXNFZGdlPWZ1bmN0aW9uKHYsdyxuYW1lKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPT09MT9lZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO3JldHVybiBfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLGUpfTtHcmFwaC5wcm90b3R5cGUucmVtb3ZlRWRnZT1mdW5jdGlvbih2LHcsbmFtZSl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD09PTE/CmVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSksZWRnZT10aGlzLl9lZGdlT2Jqc1tlXTtpZihlZGdlKXt2PWVkZ2Uudjt3PWVkZ2UudztkZWxldGUgdGhpcy5fZWRnZUxhYmVsc1tlXTtkZWxldGUgdGhpcy5fZWRnZU9ianNbZV07ZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9wcmVkc1t3XSx2KTtkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3N1Y3Nbdl0sdyk7ZGVsZXRlIHRoaXMuX2luW3ddW2VdO2RlbGV0ZSB0aGlzLl9vdXRbdl1bZV07dGhpcy5fZWRnZUNvdW50LS19cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5pbkVkZ2VzPWZ1bmN0aW9uKHYsdSl7dmFyIGluVj10aGlzLl9pblt2XTtpZihpblYpe3ZhciBlZGdlcz1fLnZhbHVlcyhpblYpO2lmKCF1KXJldHVybiBlZGdlcztyZXR1cm4gXy5maWx0ZXIoZWRnZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGVkZ2Uudj09PQp1fSl9fTtHcmFwaC5wcm90b3R5cGUub3V0RWRnZXM9ZnVuY3Rpb24odix3KXt2YXIgb3V0Vj10aGlzLl9vdXRbdl07aWYob3V0Vil7dmFyIGVkZ2VzPV8udmFsdWVzKG91dFYpO2lmKCF3KXJldHVybiBlZGdlcztyZXR1cm4gXy5maWx0ZXIoZWRnZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGVkZ2Uudz09PXd9KX19O0dyYXBoLnByb3RvdHlwZS5ub2RlRWRnZXM9ZnVuY3Rpb24odix3KXt2YXIgaW5FZGdlcz10aGlzLmluRWRnZXModix3KTtpZihpbkVkZ2VzKXJldHVybiBpbkVkZ2VzLmNvbmNhdCh0aGlzLm91dEVkZ2VzKHYsdykpfTtmdW5jdGlvbiBpbmNyZW1lbnRPckluaXRFbnRyeShtYXAsayl7aWYobWFwW2tdKW1hcFtrXSsrO2Vsc2UgbWFwW2tdPTF9ZnVuY3Rpb24gZGVjcmVtZW50T3JSZW1vdmVFbnRyeShtYXAsayl7aWYoIS0tbWFwW2tdKWRlbGV0ZSBtYXBba119ZnVuY3Rpb24gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsdl8sd18sbmFtZSl7dmFyIHY9IiIrdl87dmFyIHc9CiIiK3dfO2lmKCFpc0RpcmVjdGVkJiZ2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9cmV0dXJuIHYrRURHRV9LRVlfREVMSU0rdytFREdFX0tFWV9ERUxJTSsoXy5pc1VuZGVmaW5lZChuYW1lKT9ERUZBVUxUX0VER0VfTkFNRTpuYW1lKX1mdW5jdGlvbiBlZGdlQXJnc1RvT2JqKGlzRGlyZWN0ZWQsdl8sd18sbmFtZSl7dmFyIHY9IiIrdl87dmFyIHc9IiIrd187aWYoIWlzRGlyZWN0ZWQmJnY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH12YXIgZWRnZU9iaj17djp2LHc6d307aWYobmFtZSllZGdlT2JqLm5hbWU9bmFtZTtyZXR1cm4gZWRnZU9ian1mdW5jdGlvbiBlZGdlT2JqVG9JZChpc0RpcmVjdGVkLGVkZ2VPYmope3JldHVybiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCxlZGdlT2JqLnYsZWRnZU9iai53LGVkZ2VPYmoubmFtZSl9fSx7Ii4vbG9kYXNoIjoxOX1dLDE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17R3JhcGg6cmVxdWlyZSgiLi9ncmFwaCIpLAp2ZXJzaW9uOnJlcXVpcmUoIi4vdmVyc2lvbiIpfX0seyIuL2dyYXBoIjoxNiwiLi92ZXJzaW9uIjoyMH1dLDE4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGgiKTttb2R1bGUuZXhwb3J0cz17d3JpdGU6d3JpdGUscmVhZDpyZWFkfTtmdW5jdGlvbiB3cml0ZShnKXt2YXIganNvbj17b3B0aW9uczp7ZGlyZWN0ZWQ6Zy5pc0RpcmVjdGVkKCksbXVsdGlncmFwaDpnLmlzTXVsdGlncmFwaCgpLGNvbXBvdW5kOmcuaXNDb21wb3VuZCgpfSxub2Rlczp3cml0ZU5vZGVzKGcpLGVkZ2VzOndyaXRlRWRnZXMoZyl9O2lmKCFfLmlzVW5kZWZpbmVkKGcuZ3JhcGgoKSkpanNvbi52YWx1ZT1fLmNsb25lKGcuZ3JhcGgoKSk7cmV0dXJuIGpzb259ZnVuY3Rpb24gd3JpdGVOb2RlcyhnKXtyZXR1cm4gXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlVmFsdWU9Zy5ub2RlKHYpLHBhcmVudD0KZy5wYXJlbnQodiksbm9kZT17djp2fTtpZighXy5pc1VuZGVmaW5lZChub2RlVmFsdWUpKW5vZGUudmFsdWU9bm9kZVZhbHVlO2lmKCFfLmlzVW5kZWZpbmVkKHBhcmVudCkpbm9kZS5wYXJlbnQ9cGFyZW50O3JldHVybiBub2RlfSl9ZnVuY3Rpb24gd3JpdGVFZGdlcyhnKXtyZXR1cm4gXy5tYXAoZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlVmFsdWU9Zy5lZGdlKGUpLGVkZ2U9e3Y6ZS52LHc6ZS53fTtpZighXy5pc1VuZGVmaW5lZChlLm5hbWUpKWVkZ2UubmFtZT1lLm5hbWU7aWYoIV8uaXNVbmRlZmluZWQoZWRnZVZhbHVlKSllZGdlLnZhbHVlPWVkZ2VWYWx1ZTtyZXR1cm4gZWRnZX0pfWZ1bmN0aW9uIHJlYWQoanNvbil7dmFyIGc9KG5ldyBHcmFwaChqc29uLm9wdGlvbnMpKS5zZXRHcmFwaChqc29uLnZhbHVlKTtfLmVhY2goanNvbi5ub2RlcyxmdW5jdGlvbihlbnRyeSl7Zy5zZXROb2RlKGVudHJ5LnYsZW50cnkudmFsdWUpO2lmKGVudHJ5LnBhcmVudClnLnNldFBhcmVudChlbnRyeS52LAplbnRyeS5wYXJlbnQpfSk7Xy5lYWNoKGpzb24uZWRnZXMsZnVuY3Rpb24oZW50cnkpe2cuc2V0RWRnZSh7djplbnRyeS52LHc6ZW50cnkudyxuYW1lOmVudHJ5Lm5hbWV9LGVudHJ5LnZhbHVlKX0pO3JldHVybiBnfX0seyIuL2dyYXBoIjoxNiwiLi9sb2Rhc2giOjE5fV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsb2Rhc2g7aWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtsb2Rhc2g9cmVxdWlyZSgibG9kYXNoIil9Y2F0Y2goZSl7fWlmKCFsb2Rhc2gpbG9kYXNoPXdpbmRvdy5fO21vZHVsZS5leHBvcnRzPWxvZGFzaH0seyJsb2Rhc2giOnVuZGVmaW5lZH1dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz0iMi4xLjUifSx7fV19LHt9LFsxXSkoMSl9KTsKKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09Im9iamVjdCImJnR5cGVvZiBtb2R1bGUhPT0idW5kZWZpbmVkIiltb2R1bGUuZXhwb3J0cz1mKCk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZClkZWZpbmUoW10sZik7ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpZz13aW5kb3c7ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09InVuZGVmaW5lZCIpZz1nbG9iYWw7ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiKWc9c2VsZjtlbHNlIGc9dGhpcztnLmRhZ3JlPWYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9Cm5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK28rIiciKTt0aHJvdyBmLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGY7fXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30oezE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXtncmFwaGxpYjpyZXF1aXJlKCIuL2xpYi9ncmFwaGxpYiIpLGxheW91dDpyZXF1aXJlKCIuL2xpYi9sYXlvdXQiKSxkZWJ1ZzpyZXF1aXJlKCIuL2xpYi9kZWJ1ZyIpLHV0aWw6e3RpbWU6cmVxdWlyZSgiLi9saWIvdXRpbCIpLnRpbWUsbm90aW1lOnJlcXVpcmUoIi4vbGliL3V0aWwiKS5ub3RpbWV9LAp2ZXJzaW9uOnJlcXVpcmUoIi4vbGliL3ZlcnNpb24iKX19LHsiLi9saWIvZGVidWciOjYsIi4vbGliL2dyYXBobGliIjo3LCIuL2xpYi9sYXlvdXQiOjksIi4vbGliL3V0aWwiOjI5LCIuL2xpYi92ZXJzaW9uIjozMH1dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksZ3JlZWR5RkFTPXJlcXVpcmUoIi4vZ3JlZWR5LWZhcyIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLHVuZG86dW5kb307ZnVuY3Rpb24gcnVuKGcpe3ZhciBmYXM9Zy5ncmFwaCgpLmFjeWNsaWNlcj09PSJncmVlZHkiP2dyZWVkeUZBUyhnLHdlaWdodEZuKGcpKTpkZnNGQVMoZyk7Xy5mb3JFYWNoKGZhcyxmdW5jdGlvbihlKXt2YXIgbGFiZWw9Zy5lZGdlKGUpO2cucmVtb3ZlRWRnZShlKTtsYWJlbC5mb3J3YXJkTmFtZT1lLm5hbWU7bGFiZWwucmV2ZXJzZWQ9dHJ1ZTtnLnNldEVkZ2UoZS53LGUudixsYWJlbCxfLnVuaXF1ZUlkKCJyZXYiKSl9KTtmdW5jdGlvbiB3ZWlnaHRGbihnKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGcuZWRnZShlKS53ZWlnaHR9fQp9ZnVuY3Rpb24gZGZzRkFTKGcpe3ZhciBmYXM9W10sc3RhY2s9e30sdmlzaXRlZD17fTtmdW5jdGlvbiBkZnModil7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm47dmlzaXRlZFt2XT10cnVlO3N0YWNrW3ZdPXRydWU7Xy5mb3JFYWNoKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7aWYoXy5oYXMoc3RhY2ssZS53KSlmYXMucHVzaChlKTtlbHNlIGRmcyhlLncpfSk7ZGVsZXRlIHN0YWNrW3ZdfV8uZm9yRWFjaChnLm5vZGVzKCksZGZzKTtyZXR1cm4gZmFzfWZ1bmN0aW9uIHVuZG8oZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgbGFiZWw9Zy5lZGdlKGUpO2lmKGxhYmVsLnJldmVyc2VkKXtnLnJlbW92ZUVkZ2UoZSk7dmFyIGZvcndhcmROYW1lPWxhYmVsLmZvcndhcmROYW1lO2RlbGV0ZSBsYWJlbC5yZXZlcnNlZDtkZWxldGUgbGFiZWwuZm9yd2FyZE5hbWU7Zy5zZXRFZGdlKGUudyxlLnYsbGFiZWwsZm9yd2FyZE5hbWUpfX0pfX0seyIuL2dyZWVkeS1mYXMiOjgsCiIuL2xvZGFzaCI6MTB9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9YWRkQm9yZGVyU2VnbWVudHM7ZnVuY3Rpb24gYWRkQm9yZGVyU2VnbWVudHMoZyl7ZnVuY3Rpb24gZGZzKHYpe3ZhciBjaGlsZHJlbj1nLmNoaWxkcmVuKHYpLG5vZGU9Zy5ub2RlKHYpO2lmKGNoaWxkcmVuLmxlbmd0aClfLmZvckVhY2goY2hpbGRyZW4sZGZzKTtpZihfLmhhcyhub2RlLCJtaW5SYW5rIikpe25vZGUuYm9yZGVyTGVmdD1bXTtub2RlLmJvcmRlclJpZ2h0PVtdO2Zvcih2YXIgcmFuaz1ub2RlLm1pblJhbmssbWF4UmFuaz1ub2RlLm1heFJhbmsrMTtyYW5rPG1heFJhbms7KytyYW5rKXthZGRCb3JkZXJOb2RlKGcsImJvcmRlckxlZnQiLCJfYmwiLHYsbm9kZSxyYW5rKTthZGRCb3JkZXJOb2RlKGcsImJvcmRlclJpZ2h0IiwiX2JyIix2LG5vZGUscmFuayl9fX1fLmZvckVhY2goZy5jaGlsZHJlbigpLApkZnMpfWZ1bmN0aW9uIGFkZEJvcmRlck5vZGUoZyxwcm9wLHByZWZpeCxzZyxzZ05vZGUscmFuayl7dmFyIGxhYmVsPXt3aWR0aDowLGhlaWdodDowLHJhbms6cmFuayxib3JkZXJUeXBlOnByb3B9LHByZXY9c2dOb2RlW3Byb3BdW3JhbmstMV0sY3Vycj11dGlsLmFkZER1bW15Tm9kZShnLCJib3JkZXIiLGxhYmVsLHByZWZpeCk7c2dOb2RlW3Byb3BdW3JhbmtdPWN1cnI7Zy5zZXRQYXJlbnQoY3VycixzZyk7aWYocHJldilnLnNldEVkZ2UocHJldixjdXJyLHt3ZWlnaHQ6MX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXthZGp1c3Q6YWRqdXN0LHVuZG86dW5kb307ZnVuY3Rpb24gYWRqdXN0KGcpe3ZhciByYW5rRGlyPWcuZ3JhcGgoKS5yYW5rZGlyLnRvTG93ZXJDYXNlKCk7aWYocmFua0Rpcj09PSJsciJ8fHJhbmtEaXI9PT0icmwiKXN3YXBXaWR0aEhlaWdodChnKX0KZnVuY3Rpb24gdW5kbyhnKXt2YXIgcmFua0Rpcj1nLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO2lmKHJhbmtEaXI9PT0iYnQifHxyYW5rRGlyPT09InJsIilyZXZlcnNlWShnKTtpZihyYW5rRGlyPT09ImxyInx8cmFua0Rpcj09PSJybCIpe3N3YXBYWShnKTtzd2FwV2lkdGhIZWlnaHQoZyl9fWZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodChnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3N3YXBXaWR0aEhlaWdodE9uZShnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtzd2FwV2lkdGhIZWlnaHRPbmUoZy5lZGdlKGUpKX0pfWZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodE9uZShhdHRycyl7dmFyIHc9YXR0cnMud2lkdGg7YXR0cnMud2lkdGg9YXR0cnMuaGVpZ2h0O2F0dHJzLmhlaWdodD13fWZ1bmN0aW9uIHJldmVyc2VZKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7cmV2ZXJzZVlPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksCmZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtfLmZvckVhY2goZWRnZS5wb2ludHMscmV2ZXJzZVlPbmUpO2lmKF8uaGFzKGVkZ2UsInkiKSlyZXZlcnNlWU9uZShlZGdlKX0pfWZ1bmN0aW9uIHJldmVyc2VZT25lKGF0dHJzKXthdHRycy55PS1hdHRycy55fWZ1bmN0aW9uIHN3YXBYWShnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3N3YXBYWU9uZShnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7Xy5mb3JFYWNoKGVkZ2UucG9pbnRzLHN3YXBYWU9uZSk7aWYoXy5oYXMoZWRnZSwieCIpKXN3YXBYWU9uZShlZGdlKX0pfWZ1bmN0aW9uIHN3YXBYWU9uZShhdHRycyl7dmFyIHg9YXR0cnMueDthdHRycy54PWF0dHJzLnk7YXR0cnMueT14fX0seyIuL2xvZGFzaCI6MTB9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1MaXN0O2Z1bmN0aW9uIExpc3QoKXt2YXIgc2VudGluZWw9Cnt9O3NlbnRpbmVsLl9uZXh0PXNlbnRpbmVsLl9wcmV2PXNlbnRpbmVsO3RoaXMuX3NlbnRpbmVsPXNlbnRpbmVsfUxpc3QucHJvdG90eXBlLmRlcXVldWU9ZnVuY3Rpb24oKXt2YXIgc2VudGluZWw9dGhpcy5fc2VudGluZWwsZW50cnk9c2VudGluZWwuX3ByZXY7aWYoZW50cnkhPT1zZW50aW5lbCl7dW5saW5rKGVudHJ5KTtyZXR1cm4gZW50cnl9fTtMaXN0LnByb3RvdHlwZS5lbnF1ZXVlPWZ1bmN0aW9uKGVudHJ5KXt2YXIgc2VudGluZWw9dGhpcy5fc2VudGluZWw7aWYoZW50cnkuX3ByZXYmJmVudHJ5Ll9uZXh0KXVubGluayhlbnRyeSk7ZW50cnkuX25leHQ9c2VudGluZWwuX25leHQ7c2VudGluZWwuX25leHQuX3ByZXY9ZW50cnk7c2VudGluZWwuX25leHQ9ZW50cnk7ZW50cnkuX3ByZXY9c2VudGluZWx9O0xpc3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHN0cnM9W10sc2VudGluZWw9dGhpcy5fc2VudGluZWwsY3Vycj1zZW50aW5lbC5fcHJldjt3aGlsZShjdXJyIT09CnNlbnRpbmVsKXtzdHJzLnB1c2goSlNPTi5zdHJpbmdpZnkoY3VycixmaWx0ZXJPdXRMaW5rcykpO2N1cnI9Y3Vyci5fcHJldn1yZXR1cm4iWyIrc3Rycy5qb2luKCIsICIpKyJdIn07ZnVuY3Rpb24gdW5saW5rKGVudHJ5KXtlbnRyeS5fcHJldi5fbmV4dD1lbnRyeS5fbmV4dDtlbnRyeS5fbmV4dC5fcHJldj1lbnRyeS5fcHJldjtkZWxldGUgZW50cnkuX25leHQ7ZGVsZXRlIGVudHJ5Ll9wcmV2fWZ1bmN0aW9uIGZpbHRlck91dExpbmtzKGssdil7aWYoayE9PSJfbmV4dCImJmshPT0iX3ByZXYiKXJldHVybiB2fX0se31dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9e2RlYnVnT3JkZXJpbmc6ZGVidWdPcmRlcmluZ307ZnVuY3Rpb24gZGVidWdPcmRlcmluZyhnKXt2YXIgbGF5ZXJNYXRyaXg9CnV0aWwuYnVpbGRMYXllck1hdHJpeChnKTt2YXIgaD0obmV3IEdyYXBoKHtjb21wb3VuZDp0cnVlLG11bHRpZ3JhcGg6dHJ1ZX0pKS5zZXRHcmFwaCh7fSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtoLnNldE5vZGUodix7bGFiZWw6dn0pO2guc2V0UGFyZW50KHYsImxheWVyIitnLm5vZGUodikucmFuayl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2guc2V0RWRnZShlLnYsZS53LHt9LGUubmFtZSl9KTtfLmZvckVhY2gobGF5ZXJNYXRyaXgsZnVuY3Rpb24obGF5ZXIsaSl7dmFyIGxheWVyVj0ibGF5ZXIiK2k7aC5zZXROb2RlKGxheWVyVix7cmFuazoic2FtZSJ9KTtfLnJlZHVjZShsYXllcixmdW5jdGlvbih1LHYpe2guc2V0RWRnZSh1LHYse3N0eWxlOiJpbnZpcyJ9KTtyZXR1cm4gdn0pfSk7cmV0dXJuIGh9fSx7Ii4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOX1dLDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBncmFwaGxpYjsKaWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtncmFwaGxpYj1yZXF1aXJlKCJncmFwaGxpYiIpfWNhdGNoKGUpe31pZighZ3JhcGhsaWIpZ3JhcGhsaWI9d2luZG93LmdyYXBobGliO21vZHVsZS5leHBvcnRzPWdyYXBobGlifSx7ImdyYXBobGliIjp1bmRlZmluZWR9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaCxMaXN0PXJlcXVpcmUoIi4vZGF0YS9saXN0Iik7bW9kdWxlLmV4cG9ydHM9Z3JlZWR5RkFTO3ZhciBERUZBVUxUX1dFSUdIVF9GTj1fLmNvbnN0YW50KDEpO2Z1bmN0aW9uIGdyZWVkeUZBUyhnLHdlaWdodEZuKXtpZihnLm5vZGVDb3VudCgpPD0xKXJldHVybltdO3ZhciBzdGF0ZT1idWlsZFN0YXRlKGcsd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZOKTt2YXIgcmVzdWx0cz1kb0dyZWVkeUZBUyhzdGF0ZS5ncmFwaCxzdGF0ZS5idWNrZXRzLApzdGF0ZS56ZXJvSWR4KTtyZXR1cm4gXy5mbGF0dGVuKF8ubWFwKHJlc3VsdHMsZnVuY3Rpb24oZSl7cmV0dXJuIGcub3V0RWRnZXMoZS52LGUudyl9KSx0cnVlKX1mdW5jdGlvbiBkb0dyZWVkeUZBUyhnLGJ1Y2tldHMsemVyb0lkeCl7dmFyIHJlc3VsdHM9W10sc291cmNlcz1idWNrZXRzW2J1Y2tldHMubGVuZ3RoLTFdLHNpbmtzPWJ1Y2tldHNbMF07dmFyIGVudHJ5O3doaWxlKGcubm9kZUNvdW50KCkpe3doaWxlKGVudHJ5PXNpbmtzLmRlcXVldWUoKSlyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5KTt3aGlsZShlbnRyeT1zb3VyY2VzLmRlcXVldWUoKSlyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5KTtpZihnLm5vZGVDb3VudCgpKWZvcih2YXIgaT1idWNrZXRzLmxlbmd0aC0yO2k+MDstLWkpe2VudHJ5PWJ1Y2tldHNbaV0uZGVxdWV1ZSgpO2lmKGVudHJ5KXtyZXN1bHRzPXJlc3VsdHMuY29uY2F0KHJlbW92ZU5vZGUoZyxidWNrZXRzLHplcm9JZHgsCmVudHJ5LHRydWUpKTticmVha319fXJldHVybiByZXN1bHRzfWZ1bmN0aW9uIHJlbW92ZU5vZGUoZyxidWNrZXRzLHplcm9JZHgsZW50cnksY29sbGVjdFByZWRlY2Vzc29ycyl7dmFyIHJlc3VsdHM9Y29sbGVjdFByZWRlY2Vzc29ycz9bXTp1bmRlZmluZWQ7Xy5mb3JFYWNoKGcuaW5FZGdlcyhlbnRyeS52KSxmdW5jdGlvbihlZGdlKXt2YXIgd2VpZ2h0PWcuZWRnZShlZGdlKSx1RW50cnk9Zy5ub2RlKGVkZ2Uudik7aWYoY29sbGVjdFByZWRlY2Vzc29ycylyZXN1bHRzLnB1c2goe3Y6ZWRnZS52LHc6ZWRnZS53fSk7dUVudHJ5Lm91dC09d2VpZ2h0O2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsdUVudHJ5KX0pO18uZm9yRWFjaChnLm91dEVkZ2VzKGVudHJ5LnYpLGZ1bmN0aW9uKGVkZ2Upe3ZhciB3ZWlnaHQ9Zy5lZGdlKGVkZ2UpLHc9ZWRnZS53LHdFbnRyeT1nLm5vZGUodyk7d0VudHJ5WyJpbiJdLT13ZWlnaHQ7YXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCx3RW50cnkpfSk7CmcucmVtb3ZlTm9kZShlbnRyeS52KTtyZXR1cm4gcmVzdWx0c31mdW5jdGlvbiBidWlsZFN0YXRlKGcsd2VpZ2h0Rm4pe3ZhciBmYXNHcmFwaD1uZXcgR3JhcGgsbWF4SW49MCxtYXhPdXQ9MDtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2Zhc0dyYXBoLnNldE5vZGUodix7djp2LCJpbiI6MCxvdXQ6MH0pfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgcHJldldlaWdodD1mYXNHcmFwaC5lZGdlKGUudixlLncpfHwwLHdlaWdodD13ZWlnaHRGbihlKSxlZGdlV2VpZ2h0PXByZXZXZWlnaHQrd2VpZ2h0O2Zhc0dyYXBoLnNldEVkZ2UoZS52LGUudyxlZGdlV2VpZ2h0KTttYXhPdXQ9TWF0aC5tYXgobWF4T3V0LGZhc0dyYXBoLm5vZGUoZS52KS5vdXQrPXdlaWdodCk7bWF4SW49TWF0aC5tYXgobWF4SW4sZmFzR3JhcGgubm9kZShlLncpWyJpbiJdKz13ZWlnaHQpfSk7dmFyIGJ1Y2tldHM9Xy5yYW5nZShtYXhPdXQrbWF4SW4rMykubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMaXN0fSk7CnZhciB6ZXJvSWR4PW1heEluKzE7Xy5mb3JFYWNoKGZhc0dyYXBoLm5vZGVzKCksZnVuY3Rpb24odil7YXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCxmYXNHcmFwaC5ub2RlKHYpKX0pO3JldHVybntncmFwaDpmYXNHcmFwaCxidWNrZXRzOmJ1Y2tldHMsemVyb0lkeDp6ZXJvSWR4fX1mdW5jdGlvbiBhc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LGVudHJ5KXtpZighZW50cnkub3V0KWJ1Y2tldHNbMF0uZW5xdWV1ZShlbnRyeSk7ZWxzZSBpZighZW50cnlbImluIl0pYnVja2V0c1tidWNrZXRzLmxlbmd0aC0xXS5lbnF1ZXVlKGVudHJ5KTtlbHNlIGJ1Y2tldHNbZW50cnkub3V0LWVudHJ5WyJpbiJdK3plcm9JZHhdLmVucXVldWUoZW50cnkpfX0seyIuL2RhdGEvbGlzdCI6NSwiLi9ncmFwaGxpYiI6NywiLi9sb2Rhc2giOjEwfV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxhY3ljbGljPXJlcXVpcmUoIi4vYWN5Y2xpYyIpLApub3JtYWxpemU9cmVxdWlyZSgiLi9ub3JtYWxpemUiKSxyYW5rPXJlcXVpcmUoIi4vcmFuayIpLG5vcm1hbGl6ZVJhbmtzPXJlcXVpcmUoIi4vdXRpbCIpLm5vcm1hbGl6ZVJhbmtzLHBhcmVudER1bW15Q2hhaW5zPXJlcXVpcmUoIi4vcGFyZW50LWR1bW15LWNoYWlucyIpLHJlbW92ZUVtcHR5UmFua3M9cmVxdWlyZSgiLi91dGlsIikucmVtb3ZlRW1wdHlSYW5rcyxuZXN0aW5nR3JhcGg9cmVxdWlyZSgiLi9uZXN0aW5nLWdyYXBoIiksYWRkQm9yZGVyU2VnbWVudHM9cmVxdWlyZSgiLi9hZGQtYm9yZGVyLXNlZ21lbnRzIiksY29vcmRpbmF0ZVN5c3RlbT1yZXF1aXJlKCIuL2Nvb3JkaW5hdGUtc3lzdGVtIiksb3JkZXI9cmVxdWlyZSgiLi9vcmRlciIpLHBvc2l0aW9uPXJlcXVpcmUoIi4vcG9zaXRpb24iKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz1sYXlvdXQ7ZnVuY3Rpb24gbGF5b3V0KGcsb3B0cyl7dmFyIHRpbWU9Cm9wdHMmJm9wdHMuZGVidWdUaW1pbmc/dXRpbC50aW1lOnV0aWwubm90aW1lO3RpbWUoImxheW91dCIsZnVuY3Rpb24oKXt2YXIgbGF5b3V0R3JhcGg9dGltZSgiICBidWlsZExheW91dEdyYXBoIixmdW5jdGlvbigpe3JldHVybiBidWlsZExheW91dEdyYXBoKGcpfSk7dGltZSgiICBydW5MYXlvdXQiLGZ1bmN0aW9uKCl7cnVuTGF5b3V0KGxheW91dEdyYXBoLHRpbWUpfSk7dGltZSgiICB1cGRhdGVJbnB1dEdyYXBoIixmdW5jdGlvbigpe3VwZGF0ZUlucHV0R3JhcGgoZyxsYXlvdXRHcmFwaCl9KX0pfWZ1bmN0aW9uIHJ1bkxheW91dChnLHRpbWUpe3RpbWUoIiAgICBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzIixmdW5jdGlvbigpe21ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZyl9KTt0aW1lKCIgICAgcmVtb3ZlU2VsZkVkZ2VzIixmdW5jdGlvbigpe3JlbW92ZVNlbGZFZGdlcyhnKX0pO3RpbWUoIiAgICBhY3ljbGljIixmdW5jdGlvbigpe2FjeWNsaWMucnVuKGcpfSk7dGltZSgiICAgIG5lc3RpbmdHcmFwaC5ydW4iLApmdW5jdGlvbigpe25lc3RpbmdHcmFwaC5ydW4oZyl9KTt0aW1lKCIgICAgcmFuayIsZnVuY3Rpb24oKXtyYW5rKHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpKX0pO3RpbWUoIiAgICBpbmplY3RFZGdlTGFiZWxQcm94aWVzIixmdW5jdGlvbigpe2luamVjdEVkZ2VMYWJlbFByb3hpZXMoZyl9KTt0aW1lKCIgICAgcmVtb3ZlRW1wdHlSYW5rcyIsZnVuY3Rpb24oKXtyZW1vdmVFbXB0eVJhbmtzKGcpfSk7dGltZSgiICAgIG5lc3RpbmdHcmFwaC5jbGVhbnVwIixmdW5jdGlvbigpe25lc3RpbmdHcmFwaC5jbGVhbnVwKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZVJhbmtzIixmdW5jdGlvbigpe25vcm1hbGl6ZVJhbmtzKGcpfSk7dGltZSgiICAgIGFzc2lnblJhbmtNaW5NYXgiLGZ1bmN0aW9uKCl7YXNzaWduUmFua01pbk1heChnKX0pO3RpbWUoIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzIixmdW5jdGlvbigpe3JlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZyl9KTt0aW1lKCIgICAgbm9ybWFsaXplLnJ1biIsCmZ1bmN0aW9uKCl7bm9ybWFsaXplLnJ1bihnKX0pO3RpbWUoIiAgICBwYXJlbnREdW1teUNoYWlucyIsZnVuY3Rpb24oKXtwYXJlbnREdW1teUNoYWlucyhnKX0pO3RpbWUoIiAgICBhZGRCb3JkZXJTZWdtZW50cyIsZnVuY3Rpb24oKXthZGRCb3JkZXJTZWdtZW50cyhnKX0pO3RpbWUoIiAgICBvcmRlciIsZnVuY3Rpb24oKXtvcmRlcihnKX0pO3RpbWUoIiAgICBpbnNlcnRTZWxmRWRnZXMiLGZ1bmN0aW9uKCl7aW5zZXJ0U2VsZkVkZ2VzKGcpfSk7dGltZSgiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW0iLGZ1bmN0aW9uKCl7Y29vcmRpbmF0ZVN5c3RlbS5hZGp1c3QoZyl9KTt0aW1lKCIgICAgcG9zaXRpb24iLGZ1bmN0aW9uKCl7cG9zaXRpb24oZyl9KTt0aW1lKCIgICAgcG9zaXRpb25TZWxmRWRnZXMiLGZ1bmN0aW9uKCl7cG9zaXRpb25TZWxmRWRnZXMoZyl9KTt0aW1lKCIgICAgcmVtb3ZlQm9yZGVyTm9kZXMiLGZ1bmN0aW9uKCl7cmVtb3ZlQm9yZGVyTm9kZXMoZyl9KTt0aW1lKCIgICAgbm9ybWFsaXplLnVuZG8iLApmdW5jdGlvbigpe25vcm1hbGl6ZS51bmRvKGcpfSk7dGltZSgiICAgIGZpeHVwRWRnZUxhYmVsQ29vcmRzIixmdW5jdGlvbigpe2ZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpfSk7dGltZSgiICAgIHVuZG9Db29yZGluYXRlU3lzdGVtIixmdW5jdGlvbigpe2Nvb3JkaW5hdGVTeXN0ZW0udW5kbyhnKX0pO3RpbWUoIiAgICB0cmFuc2xhdGVHcmFwaCIsZnVuY3Rpb24oKXt0cmFuc2xhdGVHcmFwaChnKX0pO3RpbWUoIiAgICBhc3NpZ25Ob2RlSW50ZXJzZWN0cyIsZnVuY3Rpb24oKXthc3NpZ25Ob2RlSW50ZXJzZWN0cyhnKX0pO3RpbWUoIiAgICByZXZlcnNlUG9pbnRzIixmdW5jdGlvbigpe3JldmVyc2VQb2ludHNGb3JSZXZlcnNlZEVkZ2VzKGcpfSk7dGltZSgiICAgIGFjeWNsaWMudW5kbyIsZnVuY3Rpb24oKXthY3ljbGljLnVuZG8oZyl9KX1mdW5jdGlvbiB1cGRhdGVJbnB1dEdyYXBoKGlucHV0R3JhcGgsbGF5b3V0R3JhcGgpe18uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIGlucHV0TGFiZWw9CmlucHV0R3JhcGgubm9kZSh2KSxsYXlvdXRMYWJlbD1sYXlvdXRHcmFwaC5ub2RlKHYpO2lmKGlucHV0TGFiZWwpe2lucHV0TGFiZWwueD1sYXlvdXRMYWJlbC54O2lucHV0TGFiZWwueT1sYXlvdXRMYWJlbC55O2lmKGxheW91dEdyYXBoLmNoaWxkcmVuKHYpLmxlbmd0aCl7aW5wdXRMYWJlbC53aWR0aD1sYXlvdXRMYWJlbC53aWR0aDtpbnB1dExhYmVsLmhlaWdodD1sYXlvdXRMYWJlbC5oZWlnaHR9fX0pO18uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGlucHV0TGFiZWw9aW5wdXRHcmFwaC5lZGdlKGUpLGxheW91dExhYmVsPWxheW91dEdyYXBoLmVkZ2UoZSk7aW5wdXRMYWJlbC5wb2ludHM9bGF5b3V0TGFiZWwucG9pbnRzO2lmKF8uaGFzKGxheW91dExhYmVsLCJ4Iikpe2lucHV0TGFiZWwueD1sYXlvdXRMYWJlbC54O2lucHV0TGFiZWwueT1sYXlvdXRMYWJlbC55fX0pO2lucHV0R3JhcGguZ3JhcGgoKS53aWR0aD1sYXlvdXRHcmFwaC5ncmFwaCgpLndpZHRoOwppbnB1dEdyYXBoLmdyYXBoKCkuaGVpZ2h0PWxheW91dEdyYXBoLmdyYXBoKCkuaGVpZ2h0fXZhciBncmFwaE51bUF0dHJzPVsibm9kZXNlcCIsImVkZ2VzZXAiLCJyYW5rc2VwIiwibWFyZ2lueCIsIm1hcmdpbnkiXSxncmFwaERlZmF1bHRzPXtyYW5rc2VwOjUwLGVkZ2VzZXA6MjAsbm9kZXNlcDo1MCxyYW5rZGlyOiJ0YiJ9LGdyYXBoQXR0cnM9WyJhY3ljbGljZXIiLCJyYW5rZXIiLCJyYW5rZGlyIiwiYWxpZ24iXSxub2RlTnVtQXR0cnM9WyJ3aWR0aCIsImhlaWdodCJdLG5vZGVEZWZhdWx0cz17d2lkdGg6MCxoZWlnaHQ6MH0sZWRnZU51bUF0dHJzPVsibWlubGVuIiwid2VpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJsYWJlbG9mZnNldCJdLGVkZ2VEZWZhdWx0cz17bWlubGVuOjEsd2VpZ2h0OjEsd2lkdGg6MCxoZWlnaHQ6MCxsYWJlbG9mZnNldDoxMCxsYWJlbHBvczoiciJ9LGVkZ2VBdHRycz1bImxhYmVscG9zIl07ZnVuY3Rpb24gYnVpbGRMYXlvdXRHcmFwaChpbnB1dEdyYXBoKXt2YXIgZz0KbmV3IEdyYXBoKHttdWx0aWdyYXBoOnRydWUsY29tcG91bmQ6dHJ1ZX0pLGdyYXBoPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLmdyYXBoKCkpO2cuc2V0R3JhcGgoXy5tZXJnZSh7fSxncmFwaERlZmF1bHRzLHNlbGVjdE51bWJlckF0dHJzKGdyYXBoLGdyYXBoTnVtQXR0cnMpLF8ucGljayhncmFwaCxncmFwaEF0dHJzKSkpO18uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Y2Fub25pY2FsaXplKGlucHV0R3JhcGgubm9kZSh2KSk7Zy5zZXROb2RlKHYsXy5kZWZhdWx0cyhzZWxlY3ROdW1iZXJBdHRycyhub2RlLG5vZGVOdW1BdHRycyksbm9kZURlZmF1bHRzKSk7Zy5zZXRQYXJlbnQodixpbnB1dEdyYXBoLnBhcmVudCh2KSl9KTtfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLmVkZ2UoZSkpO2cuc2V0RWRnZShlLF8ubWVyZ2Uoe30sZWRnZURlZmF1bHRzLHNlbGVjdE51bWJlckF0dHJzKGVkZ2UsCmVkZ2VOdW1BdHRycyksXy5waWNrKGVkZ2UsZWRnZUF0dHJzKSkpfSk7cmV0dXJuIGd9ZnVuY3Rpb24gbWFrZVNwYWNlRm9yRWRnZUxhYmVscyhnKXt2YXIgZ3JhcGg9Zy5ncmFwaCgpO2dyYXBoLnJhbmtzZXAvPTI7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7ZWRnZS5taW5sZW4qPTI7aWYoZWRnZS5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpIT09ImMiKWlmKGdyYXBoLnJhbmtkaXI9PT0iVEIifHxncmFwaC5yYW5rZGlyPT09IkJUIillZGdlLndpZHRoKz1lZGdlLmxhYmVsb2Zmc2V0O2Vsc2UgZWRnZS5oZWlnaHQrPWVkZ2UubGFiZWxvZmZzZXR9KX1mdW5jdGlvbiBpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2Uud2lkdGgmJmVkZ2UuaGVpZ2h0KXt2YXIgdj1nLm5vZGUoZS52KSx3PWcubm9kZShlLncpLGxhYmVsPXtyYW5rOih3LnJhbmstCnYucmFuaykvMit2LnJhbmssZTplfTt1dGlsLmFkZER1bW15Tm9kZShnLCJlZGdlLXByb3h5IixsYWJlbCwiX2VwIil9fSl9ZnVuY3Rpb24gYXNzaWduUmFua01pbk1heChnKXt2YXIgbWF4UmFuaz0wO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO2lmKG5vZGUuYm9yZGVyVG9wKXtub2RlLm1pblJhbms9Zy5ub2RlKG5vZGUuYm9yZGVyVG9wKS5yYW5rO25vZGUubWF4UmFuaz1nLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLnJhbms7bWF4UmFuaz1fLm1heChtYXhSYW5rLG5vZGUubWF4UmFuayl9fSk7Zy5ncmFwaCgpLm1heFJhbms9bWF4UmFua31mdW5jdGlvbiByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO2lmKG5vZGUuZHVtbXk9PT0iZWRnZS1wcm94eSIpe2cuZWRnZShub2RlLmUpLmxhYmVsUmFuaz1ub2RlLnJhbms7Zy5yZW1vdmVOb2RlKHYpfX0pfQpmdW5jdGlvbiB0cmFuc2xhdGVHcmFwaChnKXt2YXIgbWluWD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbWF4WD0wLG1pblk9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG1heFk9MCxncmFwaExhYmVsPWcuZ3JhcGgoKSxtYXJnaW5YPWdyYXBoTGFiZWwubWFyZ2lueHx8MCxtYXJnaW5ZPWdyYXBoTGFiZWwubWFyZ2lueXx8MDtmdW5jdGlvbiBnZXRFeHRyZW1lcyhhdHRycyl7dmFyIHg9YXR0cnMueCx5PWF0dHJzLnksdz1hdHRycy53aWR0aCxoPWF0dHJzLmhlaWdodDttaW5YPU1hdGgubWluKG1pblgseC13LzIpO21heFg9TWF0aC5tYXgobWF4WCx4K3cvMik7bWluWT1NYXRoLm1pbihtaW5ZLHktaC8yKTttYXhZPU1hdGgubWF4KG1heFkseStoLzIpfV8uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7Z2V0RXh0cmVtZXMoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKF8uaGFzKGVkZ2UsIngiKSlnZXRFeHRyZW1lcyhlZGdlKX0pOwptaW5YLT1tYXJnaW5YO21pblktPW1hcmdpblk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7bm9kZS54LT1taW5YO25vZGUueS09bWluWX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO18uZm9yRWFjaChlZGdlLnBvaW50cyxmdW5jdGlvbihwKXtwLngtPW1pblg7cC55LT1taW5ZfSk7aWYoXy5oYXMoZWRnZSwieCIpKWVkZ2UueC09bWluWDtpZihfLmhhcyhlZGdlLCJ5IikpZWRnZS55LT1taW5ZfSk7Z3JhcGhMYWJlbC53aWR0aD1tYXhYLW1pblgrbWFyZ2luWDtncmFwaExhYmVsLmhlaWdodD1tYXhZLW1pblkrbWFyZ2luWX1mdW5jdGlvbiBhc3NpZ25Ob2RlSW50ZXJzZWN0cyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKSxub2RlVj1nLm5vZGUoZS52KSxub2RlVz1nLm5vZGUoZS53KSxwMSxwMjtpZighZWRnZS5wb2ludHMpe2VkZ2UucG9pbnRzPQpbXTtwMT1ub2RlVztwMj1ub2RlVn1lbHNle3AxPWVkZ2UucG9pbnRzWzBdO3AyPWVkZ2UucG9pbnRzW2VkZ2UucG9pbnRzLmxlbmd0aC0xXX1lZGdlLnBvaW50cy51bnNoaWZ0KHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVixwMSkpO2VkZ2UucG9pbnRzLnB1c2godXRpbC5pbnRlcnNlY3RSZWN0KG5vZGVXLHAyKSl9KX1mdW5jdGlvbiBmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihfLmhhcyhlZGdlLCJ4Iikpe2lmKGVkZ2UubGFiZWxwb3M9PT0ibCJ8fGVkZ2UubGFiZWxwb3M9PT0iciIpZWRnZS53aWR0aC09ZWRnZS5sYWJlbG9mZnNldDtzd2l0Y2goZWRnZS5sYWJlbHBvcyl7Y2FzZSAibCI6ZWRnZS54LT1lZGdlLndpZHRoLzIrZWRnZS5sYWJlbG9mZnNldDticmVhaztjYXNlICJyIjplZGdlLngrPWVkZ2Uud2lkdGgvMitlZGdlLmxhYmVsb2Zmc2V0O2JyZWFrfX19KX1mdW5jdGlvbiByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoZWRnZS5yZXZlcnNlZCllZGdlLnBvaW50cy5yZXZlcnNlKCl9KX1mdW5jdGlvbiByZW1vdmVCb3JkZXJOb2RlcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2lmKGcuY2hpbGRyZW4odikubGVuZ3RoKXt2YXIgbm9kZT1nLm5vZGUodiksdD1nLm5vZGUobm9kZS5ib3JkZXJUb3ApLGI9Zy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKSxsPWcubm9kZShfLmxhc3Qobm9kZS5ib3JkZXJMZWZ0KSkscj1nLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyUmlnaHQpKTtub2RlLndpZHRoPU1hdGguYWJzKHIueC1sLngpO25vZGUuaGVpZ2h0PU1hdGguYWJzKGIueS10LnkpO25vZGUueD1sLngrbm9kZS53aWR0aC8yO25vZGUueT10Lnkrbm9kZS5oZWlnaHQvMn19KTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2lmKGcubm9kZSh2KS5kdW1teT09PSJib3JkZXIiKWcucmVtb3ZlTm9kZSh2KX0pfWZ1bmN0aW9uIHJlbW92ZVNlbGZFZGdlcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXtpZihlLnY9PT1lLncpe3ZhciBub2RlPWcubm9kZShlLnYpO2lmKCFub2RlLnNlbGZFZGdlcylub2RlLnNlbGZFZGdlcz1bXTtub2RlLnNlbGZFZGdlcy5wdXNoKHtlOmUsbGFiZWw6Zy5lZGdlKGUpfSk7Zy5yZW1vdmVFZGdlKGUpfX0pfWZ1bmN0aW9uIGluc2VydFNlbGZFZGdlcyhnKXt2YXIgbGF5ZXJzPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtfLmZvckVhY2gobGF5ZXJzLGZ1bmN0aW9uKGxheWVyKXt2YXIgb3JkZXJTaGlmdD0wO18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LGkpe3ZhciBub2RlPWcubm9kZSh2KTtub2RlLm9yZGVyPWkrb3JkZXJTaGlmdDtfLmZvckVhY2gobm9kZS5zZWxmRWRnZXMsZnVuY3Rpb24oc2VsZkVkZ2Upe3V0aWwuYWRkRHVtbXlOb2RlKGcsInNlbGZlZGdlIix7d2lkdGg6c2VsZkVkZ2UubGFiZWwud2lkdGgsaGVpZ2h0OnNlbGZFZGdlLmxhYmVsLmhlaWdodCxyYW5rOm5vZGUucmFuayxvcmRlcjppKyArK29yZGVyU2hpZnQsCmU6c2VsZkVkZ2UuZSxsYWJlbDpzZWxmRWRnZS5sYWJlbH0sIl9zZSIpfSk7ZGVsZXRlIG5vZGUuc2VsZkVkZ2VzfSl9KX1mdW5jdGlvbiBwb3NpdGlvblNlbGZFZGdlcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmR1bW15PT09InNlbGZlZGdlIil7dmFyIHNlbGZOb2RlPWcubm9kZShub2RlLmUudikseD1zZWxmTm9kZS54K3NlbGZOb2RlLndpZHRoLzIseT1zZWxmTm9kZS55LGR4PW5vZGUueC14LGR5PXNlbGZOb2RlLmhlaWdodC8yO2cuc2V0RWRnZShub2RlLmUsbm9kZS5sYWJlbCk7Zy5yZW1vdmVOb2RlKHYpO25vZGUubGFiZWwucG9pbnRzPVt7eDp4KzIqZHgvMyx5OnktZHl9LHt4OngrNSpkeC82LHk6eS1keX0se3g6eCtkeCx5Onl9LHt4OngrNSpkeC82LHk6eStkeX0se3g6eCsyKmR4LzMseTp5K2R5fV07bm9kZS5sYWJlbC54PW5vZGUueDtub2RlLmxhYmVsLnk9bm9kZS55fX0pfWZ1bmN0aW9uIHNlbGVjdE51bWJlckF0dHJzKG9iaiwKYXR0cnMpe3JldHVybiBfLm1hcFZhbHVlcyhfLnBpY2sob2JqLGF0dHJzKSxOdW1iZXIpfWZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShhdHRycyl7dmFyIG5ld0F0dHJzPXt9O18uZm9yRWFjaChhdHRycyxmdW5jdGlvbih2LGspe25ld0F0dHJzW2sudG9Mb3dlckNhc2UoKV09dn0pO3JldHVybiBuZXdBdHRyc319LHsiLi9hY3ljbGljIjoyLCIuL2FkZC1ib3JkZXItc2VnbWVudHMiOjMsIi4vY29vcmRpbmF0ZS1zeXN0ZW0iOjQsIi4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMCwiLi9uZXN0aW5nLWdyYXBoIjoxMSwiLi9ub3JtYWxpemUiOjEyLCIuL29yZGVyIjoxNywiLi9wYXJlbnQtZHVtbXktY2hhaW5zIjoyMiwiLi9wb3NpdGlvbiI6MjQsIi4vcmFuayI6MjYsIi4vdXRpbCI6Mjl9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGxvZGFzaDtpZih0eXBlb2YgcmVxdWlyZT09PSJmdW5jdGlvbiIpdHJ5e2xvZGFzaD1yZXF1aXJlKCJsb2Rhc2giKX1jYXRjaChlKXt9aWYoIWxvZGFzaClsb2Rhc2g9CndpbmRvdy5fO21vZHVsZS5leHBvcnRzPWxvZGFzaH0seyJsb2Rhc2giOnVuZGVmaW5lZH1dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9e3J1bjpydW4sY2xlYW51cDpjbGVhbnVwfTtmdW5jdGlvbiBydW4oZyl7dmFyIHJvb3Q9dXRpbC5hZGREdW1teU5vZGUoZywicm9vdCIse30sIl9yb290Iik7dmFyIGRlcHRocz10cmVlRGVwdGhzKGcpO3ZhciBoZWlnaHQ9Xy5tYXgoXy52YWx1ZXMoZGVwdGhzKSktMTt2YXIgbm9kZVNlcD0yKmhlaWdodCsxO2cuZ3JhcGgoKS5uZXN0aW5nUm9vdD1yb290O18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7Zy5lZGdlKGUpLm1pbmxlbio9bm9kZVNlcH0pO3ZhciB3ZWlnaHQ9c3VtV2VpZ2h0cyhnKSsxO18uZm9yRWFjaChnLmNoaWxkcmVuKCksZnVuY3Rpb24oY2hpbGQpe2RmcyhnLHJvb3Qsbm9kZVNlcCwKd2VpZ2h0LGhlaWdodCxkZXB0aHMsY2hpbGQpfSk7Zy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yPW5vZGVTZXB9ZnVuY3Rpb24gZGZzKGcscm9vdCxub2RlU2VwLHdlaWdodCxoZWlnaHQsZGVwdGhzLHYpe3ZhciBjaGlsZHJlbj1nLmNoaWxkcmVuKHYpO2lmKCFjaGlsZHJlbi5sZW5ndGgpe2lmKHYhPT1yb290KWcuc2V0RWRnZShyb290LHYse3dlaWdodDowLG1pbmxlbjpub2RlU2VwfSk7cmV0dXJufXZhciB0b3A9dXRpbC5hZGRCb3JkZXJOb2RlKGcsIl9idCIpLGJvdHRvbT11dGlsLmFkZEJvcmRlck5vZGUoZywiX2JiIiksbGFiZWw9Zy5ub2RlKHYpO2cuc2V0UGFyZW50KHRvcCx2KTtsYWJlbC5ib3JkZXJUb3A9dG9wO2cuc2V0UGFyZW50KGJvdHRvbSx2KTtsYWJlbC5ib3JkZXJCb3R0b209Ym90dG9tO18uZm9yRWFjaChjaGlsZHJlbixmdW5jdGlvbihjaGlsZCl7ZGZzKGcscm9vdCxub2RlU2VwLHdlaWdodCxoZWlnaHQsZGVwdGhzLGNoaWxkKTt2YXIgY2hpbGROb2RlPWcubm9kZShjaGlsZCksCmNoaWxkVG9wPWNoaWxkTm9kZS5ib3JkZXJUb3A/Y2hpbGROb2RlLmJvcmRlclRvcDpjaGlsZCxjaGlsZEJvdHRvbT1jaGlsZE5vZGUuYm9yZGVyQm90dG9tP2NoaWxkTm9kZS5ib3JkZXJCb3R0b206Y2hpbGQsdGhpc1dlaWdodD1jaGlsZE5vZGUuYm9yZGVyVG9wP3dlaWdodDoyKndlaWdodCxtaW5sZW49Y2hpbGRUb3AhPT1jaGlsZEJvdHRvbT8xOmhlaWdodC1kZXB0aHNbdl0rMTtnLnNldEVkZ2UodG9wLGNoaWxkVG9wLHt3ZWlnaHQ6dGhpc1dlaWdodCxtaW5sZW46bWlubGVuLG5lc3RpbmdFZGdlOnRydWV9KTtnLnNldEVkZ2UoY2hpbGRCb3R0b20sYm90dG9tLHt3ZWlnaHQ6dGhpc1dlaWdodCxtaW5sZW46bWlubGVuLG5lc3RpbmdFZGdlOnRydWV9KX0pO2lmKCFnLnBhcmVudCh2KSlnLnNldEVkZ2Uocm9vdCx0b3Ase3dlaWdodDowLG1pbmxlbjpoZWlnaHQrZGVwdGhzW3ZdfSl9ZnVuY3Rpb24gdHJlZURlcHRocyhnKXt2YXIgZGVwdGhzPXt9O2Z1bmN0aW9uIGRmcyh2LGRlcHRoKXt2YXIgY2hpbGRyZW49CmcuY2hpbGRyZW4odik7aWYoY2hpbGRyZW4mJmNoaWxkcmVuLmxlbmd0aClfLmZvckVhY2goY2hpbGRyZW4sZnVuY3Rpb24oY2hpbGQpe2RmcyhjaGlsZCxkZXB0aCsxKX0pO2RlcHRoc1t2XT1kZXB0aH1fLmZvckVhY2goZy5jaGlsZHJlbigpLGZ1bmN0aW9uKHYpe2Rmcyh2LDEpfSk7cmV0dXJuIGRlcHRoc31mdW5jdGlvbiBzdW1XZWlnaHRzKGcpe3JldHVybiBfLnJlZHVjZShnLmVkZ2VzKCksZnVuY3Rpb24oYWNjLGUpe3JldHVybiBhY2MrZy5lZGdlKGUpLndlaWdodH0sMCl9ZnVuY3Rpb24gY2xlYW51cChnKXt2YXIgZ3JhcGhMYWJlbD1nLmdyYXBoKCk7Zy5yZW1vdmVOb2RlKGdyYXBoTGFiZWwubmVzdGluZ1Jvb3QpO2RlbGV0ZSBncmFwaExhYmVsLm5lc3RpbmdSb290O18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2UubmVzdGluZ0VkZ2UpZy5yZW1vdmVFZGdlKGUpfSl9fSx7Ii4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOX1dLAoxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLHVuZG86dW5kb307ZnVuY3Rpb24gcnVuKGcpe2cuZ3JhcGgoKS5kdW1teUNoYWlucz1bXTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGVkZ2Upe25vcm1hbGl6ZUVkZ2UoZyxlZGdlKX0pfWZ1bmN0aW9uIG5vcm1hbGl6ZUVkZ2UoZyxlKXt2YXIgdj1lLnYsdlJhbms9Zy5ub2RlKHYpLnJhbmssdz1lLncsd1Jhbms9Zy5ub2RlKHcpLnJhbmssbmFtZT1lLm5hbWUsZWRnZUxhYmVsPWcuZWRnZShlKSxsYWJlbFJhbms9ZWRnZUxhYmVsLmxhYmVsUmFuaztpZih3UmFuaz09PXZSYW5rKzEpcmV0dXJuO2cucmVtb3ZlRWRnZShlKTt2YXIgZHVtbXksYXR0cnMsaTtmb3IoaT0wLCsrdlJhbms7dlJhbms8d1Jhbms7KytpLCsrdlJhbmspe2VkZ2VMYWJlbC5wb2ludHM9W107YXR0cnM9e3dpZHRoOjAsCmhlaWdodDowLGVkZ2VMYWJlbDplZGdlTGFiZWwsZWRnZU9iajplLHJhbms6dlJhbmt9O2R1bW15PXV0aWwuYWRkRHVtbXlOb2RlKGcsImVkZ2UiLGF0dHJzLCJfZCIpO2lmKHZSYW5rPT09bGFiZWxSYW5rKXthdHRycy53aWR0aD1lZGdlTGFiZWwud2lkdGg7YXR0cnMuaGVpZ2h0PWVkZ2VMYWJlbC5oZWlnaHQ7YXR0cnMuZHVtbXk9ImVkZ2UtbGFiZWwiO2F0dHJzLmxhYmVscG9zPWVkZ2VMYWJlbC5sYWJlbHBvc31nLnNldEVkZ2UodixkdW1teSx7d2VpZ2h0OmVkZ2VMYWJlbC53ZWlnaHR9LG5hbWUpO2lmKGk9PT0wKWcuZ3JhcGgoKS5kdW1teUNoYWlucy5wdXNoKGR1bW15KTt2PWR1bW15fWcuc2V0RWRnZSh2LHcse3dlaWdodDplZGdlTGFiZWwud2VpZ2h0fSxuYW1lKX1mdW5jdGlvbiB1bmRvKGcpe18uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLG9yaWdMYWJlbD1ub2RlLmVkZ2VMYWJlbCx3O2cuc2V0RWRnZShub2RlLmVkZ2VPYmosCm9yaWdMYWJlbCk7d2hpbGUobm9kZS5kdW1teSl7dz1nLnN1Y2Nlc3NvcnModilbMF07Zy5yZW1vdmVOb2RlKHYpO29yaWdMYWJlbC5wb2ludHMucHVzaCh7eDpub2RlLngseTpub2RlLnl9KTtpZihub2RlLmR1bW15PT09ImVkZ2UtbGFiZWwiKXtvcmlnTGFiZWwueD1ub2RlLng7b3JpZ0xhYmVsLnk9bm9kZS55O29yaWdMYWJlbC53aWR0aD1ub2RlLndpZHRoO29yaWdMYWJlbC5oZWlnaHQ9bm9kZS5oZWlnaHR9dj13O25vZGU9Zy5ub2RlKHYpfX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9YWRkU3ViZ3JhcGhDb25zdHJhaW50cztmdW5jdGlvbiBhZGRTdWJncmFwaENvbnN0cmFpbnRzKGcsY2csdnMpe3ZhciBwcmV2PXt9LHJvb3RQcmV2O18uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXt2YXIgY2hpbGQ9Zy5wYXJlbnQodikscGFyZW50LApwcmV2Q2hpbGQ7d2hpbGUoY2hpbGQpe3BhcmVudD1nLnBhcmVudChjaGlsZCk7aWYocGFyZW50KXtwcmV2Q2hpbGQ9cHJldltwYXJlbnRdO3ByZXZbcGFyZW50XT1jaGlsZH1lbHNle3ByZXZDaGlsZD1yb290UHJldjtyb290UHJldj1jaGlsZH1pZihwcmV2Q2hpbGQmJnByZXZDaGlsZCE9PWNoaWxkKXtjZy5zZXRFZGdlKHByZXZDaGlsZCxjaGlsZCk7cmV0dXJufWNoaWxkPXBhcmVudH19KX19LHsiLi4vbG9kYXNoIjoxMH1dLDE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1iYXJ5Y2VudGVyO2Z1bmN0aW9uIGJhcnljZW50ZXIoZyxtb3ZhYmxlKXtyZXR1cm4gXy5tYXAobW92YWJsZSxmdW5jdGlvbih2KXt2YXIgaW5WPWcuaW5FZGdlcyh2KTtpZighaW5WLmxlbmd0aClyZXR1cm57djp2fTtlbHNle3ZhciByZXN1bHQ9Xy5yZWR1Y2UoaW5WLGZ1bmN0aW9uKGFjYyxlKXt2YXIgZWRnZT1nLmVkZ2UoZSksCm5vZGVVPWcubm9kZShlLnYpO3JldHVybntzdW06YWNjLnN1bStlZGdlLndlaWdodCpub2RlVS5vcmRlcix3ZWlnaHQ6YWNjLndlaWdodCtlZGdlLndlaWdodH19LHtzdW06MCx3ZWlnaHQ6MH0pO3JldHVybnt2OnYsYmFyeWNlbnRlcjpyZXN1bHQuc3VtL3Jlc3VsdC53ZWlnaHQsd2VpZ2h0OnJlc3VsdC53ZWlnaHR9fX0pfX0seyIuLi9sb2Rhc2giOjEwfV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9YnVpbGRMYXllckdyYXBoO2Z1bmN0aW9uIGJ1aWxkTGF5ZXJHcmFwaChnLHJhbmsscmVsYXRpb25zaGlwKXt2YXIgcm9vdD1jcmVhdGVSb290Tm9kZShnKSxyZXN1bHQ9KG5ldyBHcmFwaCh7Y29tcG91bmQ6dHJ1ZX0pKS5zZXRHcmFwaCh7cm9vdDpyb290fSkuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpfSk7Cl8uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLHBhcmVudD1nLnBhcmVudCh2KTtpZihub2RlLnJhbms9PT1yYW5rfHxub2RlLm1pblJhbms8PXJhbmsmJnJhbms8PW5vZGUubWF4UmFuayl7cmVzdWx0LnNldE5vZGUodik7cmVzdWx0LnNldFBhcmVudCh2LHBhcmVudHx8cm9vdCk7Xy5mb3JFYWNoKGdbcmVsYXRpb25zaGlwXSh2KSxmdW5jdGlvbihlKXt2YXIgdT1lLnY9PT12P2UudzplLnYsZWRnZT1yZXN1bHQuZWRnZSh1LHYpLHdlaWdodD0hXy5pc1VuZGVmaW5lZChlZGdlKT9lZGdlLndlaWdodDowO3Jlc3VsdC5zZXRFZGdlKHUsdix7d2VpZ2h0OmcuZWRnZShlKS53ZWlnaHQrd2VpZ2h0fSl9KTtpZihfLmhhcyhub2RlLCJtaW5SYW5rIikpcmVzdWx0LnNldE5vZGUodix7Ym9yZGVyTGVmdDpub2RlLmJvcmRlckxlZnRbcmFua10sYm9yZGVyUmlnaHQ6bm9kZS5ib3JkZXJSaWdodFtyYW5rXX0pfX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY3JlYXRlUm9vdE5vZGUoZyl7dmFyIHY7CndoaWxlKGcuaGFzTm9kZSh2PV8udW5pcXVlSWQoIl9yb290IikpKTtyZXR1cm4gdn19LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTB9XSwxNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9Y3Jvc3NDb3VudDtmdW5jdGlvbiBjcm9zc0NvdW50KGcsbGF5ZXJpbmcpe3ZhciBjYz0wO2Zvcih2YXIgaT0xO2k8bGF5ZXJpbmcubGVuZ3RoOysraSljYys9dHdvTGF5ZXJDcm9zc0NvdW50KGcsbGF5ZXJpbmdbaS0xXSxsYXllcmluZ1tpXSk7cmV0dXJuIGNjfWZ1bmN0aW9uIHR3b0xheWVyQ3Jvc3NDb3VudChnLG5vcnRoTGF5ZXIsc291dGhMYXllcil7dmFyIHNvdXRoUG9zPV8uemlwT2JqZWN0KHNvdXRoTGF5ZXIsXy5tYXAoc291dGhMYXllcixmdW5jdGlvbih2LGkpe3JldHVybiBpfSkpO3ZhciBzb3V0aEVudHJpZXM9Xy5mbGF0dGVuKF8ubWFwKG5vcnRoTGF5ZXIsZnVuY3Rpb24odil7cmV0dXJuIF8uY2hhaW4oZy5vdXRFZGdlcyh2KSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybntwb3M6c291dGhQb3NbZS53XSwKd2VpZ2h0OmcuZWRnZShlKS53ZWlnaHR9fSkuc29ydEJ5KCJwb3MiKS52YWx1ZSgpfSksdHJ1ZSk7dmFyIGZpcnN0SW5kZXg9MTt3aGlsZShmaXJzdEluZGV4PHNvdXRoTGF5ZXIubGVuZ3RoKWZpcnN0SW5kZXg8PD0xO3ZhciB0cmVlU2l6ZT0yKmZpcnN0SW5kZXgtMTtmaXJzdEluZGV4LT0xO3ZhciB0cmVlPV8ubWFwKG5ldyBBcnJheSh0cmVlU2l6ZSksZnVuY3Rpb24oKXtyZXR1cm4gMH0pO3ZhciBjYz0wO18uZm9yRWFjaChzb3V0aEVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlbnRyeSl7dmFyIGluZGV4PWVudHJ5LnBvcytmaXJzdEluZGV4O3RyZWVbaW5kZXhdKz1lbnRyeS53ZWlnaHQ7dmFyIHdlaWdodFN1bT0wO3doaWxlKGluZGV4PjApe2lmKGluZGV4JTIpd2VpZ2h0U3VtKz10cmVlW2luZGV4KzFdO2luZGV4PWluZGV4LTE+PjE7dHJlZVtpbmRleF0rPWVudHJ5LndlaWdodH1jYys9ZW50cnkud2VpZ2h0KndlaWdodFN1bX0pKTtyZXR1cm4gY2N9fSx7Ii4uL2xvZGFzaCI6MTB9XSwKMTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLGluaXRPcmRlcj1yZXF1aXJlKCIuL2luaXQtb3JkZXIiKSxjcm9zc0NvdW50PXJlcXVpcmUoIi4vY3Jvc3MtY291bnQiKSxzb3J0U3ViZ3JhcGg9cmVxdWlyZSgiLi9zb3J0LXN1YmdyYXBoIiksYnVpbGRMYXllckdyYXBoPXJlcXVpcmUoIi4vYnVpbGQtbGF5ZXItZ3JhcGgiKSxhZGRTdWJncmFwaENvbnN0cmFpbnRzPXJlcXVpcmUoIi4vYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKTttb2R1bGUuZXhwb3J0cz1vcmRlcjtmdW5jdGlvbiBvcmRlcihnKXt2YXIgbWF4UmFuaz11dGlsLm1heFJhbmsoZyksZG93bkxheWVyR3JhcGhzPWJ1aWxkTGF5ZXJHcmFwaHMoZyxfLnJhbmdlKDEsbWF4UmFuaysxKSwiaW5FZGdlcyIpLHVwTGF5ZXJHcmFwaHM9YnVpbGRMYXllckdyYXBocyhnLApfLnJhbmdlKG1heFJhbmstMSwtMSwtMSksIm91dEVkZ2VzIik7dmFyIGxheWVyaW5nPWluaXRPcmRlcihnKTthc3NpZ25PcmRlcihnLGxheWVyaW5nKTt2YXIgYmVzdENDPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxiZXN0O2Zvcih2YXIgaT0wLGxhc3RCZXN0PTA7bGFzdEJlc3Q8NDsrK2ksKytsYXN0QmVzdCl7c3dlZXBMYXllckdyYXBocyhpJTI/ZG93bkxheWVyR3JhcGhzOnVwTGF5ZXJHcmFwaHMsaSU0Pj0yKTtsYXllcmluZz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7dmFyIGNjPWNyb3NzQ291bnQoZyxsYXllcmluZyk7aWYoY2M8YmVzdENDKXtsYXN0QmVzdD0wO2Jlc3Q9Xy5jbG9uZURlZXAobGF5ZXJpbmcpO2Jlc3RDQz1jY319YXNzaWduT3JkZXIoZyxiZXN0KX1mdW5jdGlvbiBidWlsZExheWVyR3JhcGhzKGcscmFua3MscmVsYXRpb25zaGlwKXtyZXR1cm4gXy5tYXAocmFua3MsZnVuY3Rpb24ocmFuayl7cmV0dXJuIGJ1aWxkTGF5ZXJHcmFwaChnLHJhbmsscmVsYXRpb25zaGlwKX0pfQpmdW5jdGlvbiBzd2VlcExheWVyR3JhcGhzKGxheWVyR3JhcGhzLGJpYXNSaWdodCl7dmFyIGNnPW5ldyBHcmFwaDtfLmZvckVhY2gobGF5ZXJHcmFwaHMsZnVuY3Rpb24obGcpe3ZhciByb290PWxnLmdyYXBoKCkucm9vdDt2YXIgc29ydGVkPXNvcnRTdWJncmFwaChsZyxyb290LGNnLGJpYXNSaWdodCk7Xy5mb3JFYWNoKHNvcnRlZC52cyxmdW5jdGlvbih2LGkpe2xnLm5vZGUodikub3JkZXI9aX0pO2FkZFN1YmdyYXBoQ29uc3RyYWludHMobGcsY2csc29ydGVkLnZzKX0pfWZ1bmN0aW9uIGFzc2lnbk9yZGVyKGcsbGF5ZXJpbmcpe18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsaSl7Zy5ub2RlKHYpLm9yZGVyPWl9KX0pfX0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6MjksIi4vYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzIjoxMywiLi9idWlsZC1sYXllci1ncmFwaCI6MTUsIi4vY3Jvc3MtY291bnQiOjE2LAoiLi9pbml0LW9yZGVyIjoxOCwiLi9zb3J0LXN1YmdyYXBoIjoyMH1dLDE4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1pbml0T3JkZXI7ZnVuY3Rpb24gaW5pdE9yZGVyKGcpe3ZhciB2aXNpdGVkPXt9LHNpbXBsZU5vZGVzPV8uZmlsdGVyKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4hZy5jaGlsZHJlbih2KS5sZW5ndGh9KSxtYXhSYW5rPV8ubWF4KF8ubWFwKHNpbXBsZU5vZGVzLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKSxsYXllcnM9Xy5tYXAoXy5yYW5nZShtYXhSYW5rKzEpLGZ1bmN0aW9uKCl7cmV0dXJuW119KTtmdW5jdGlvbiBkZnModil7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm47dmlzaXRlZFt2XT10cnVlO3ZhciBub2RlPWcubm9kZSh2KTtsYXllcnNbbm9kZS5yYW5rXS5wdXNoKHYpO18uZm9yRWFjaChnLnN1Y2Nlc3NvcnModiksZGZzKX12YXIgb3JkZXJlZFZzPQpfLnNvcnRCeShzaW1wbGVOb2RlcyxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KTtfLmZvckVhY2gob3JkZXJlZFZzLGRmcyk7cmV0dXJuIGxheWVyc319LHsiLi4vbG9kYXNoIjoxMH1dLDE5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1yZXNvbHZlQ29uZmxpY3RzO2Z1bmN0aW9uIHJlc29sdmVDb25mbGljdHMoZW50cmllcyxjZyl7dmFyIG1hcHBlZEVudHJpZXM9e307Xy5mb3JFYWNoKGVudHJpZXMsZnVuY3Rpb24oZW50cnksaSl7dmFyIHRtcD1tYXBwZWRFbnRyaWVzW2VudHJ5LnZdPXtpbmRlZ3JlZTowLCJpbiI6W10sb3V0OltdLHZzOltlbnRyeS52XSxpOml9O2lmKCFfLmlzVW5kZWZpbmVkKGVudHJ5LmJhcnljZW50ZXIpKXt0bXAuYmFyeWNlbnRlcj1lbnRyeS5iYXJ5Y2VudGVyO3RtcC53ZWlnaHQ9ZW50cnkud2VpZ2h0fX0pO18uZm9yRWFjaChjZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlbnRyeVY9Cm1hcHBlZEVudHJpZXNbZS52XSxlbnRyeVc9bWFwcGVkRW50cmllc1tlLnddO2lmKCFfLmlzVW5kZWZpbmVkKGVudHJ5VikmJiFfLmlzVW5kZWZpbmVkKGVudHJ5Vykpe2VudHJ5Vy5pbmRlZ3JlZSsrO2VudHJ5Vi5vdXQucHVzaChtYXBwZWRFbnRyaWVzW2Uud10pfX0pO3ZhciBzb3VyY2VTZXQ9Xy5maWx0ZXIobWFwcGVkRW50cmllcyxmdW5jdGlvbihlbnRyeSl7cmV0dXJuIWVudHJ5LmluZGVncmVlfSk7cmV0dXJuIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpfWZ1bmN0aW9uIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpe3ZhciBlbnRyaWVzPVtdO2Z1bmN0aW9uIGhhbmRsZUluKHZFbnRyeSl7cmV0dXJuIGZ1bmN0aW9uKHVFbnRyeSl7aWYodUVudHJ5Lm1lcmdlZClyZXR1cm47aWYoXy5pc1VuZGVmaW5lZCh1RW50cnkuYmFyeWNlbnRlcil8fF8uaXNVbmRlZmluZWQodkVudHJ5LmJhcnljZW50ZXIpfHx1RW50cnkuYmFyeWNlbnRlcj49dkVudHJ5LmJhcnljZW50ZXIpbWVyZ2VFbnRyaWVzKHZFbnRyeSwKdUVudHJ5KX19ZnVuY3Rpb24gaGFuZGxlT3V0KHZFbnRyeSl7cmV0dXJuIGZ1bmN0aW9uKHdFbnRyeSl7d0VudHJ5WyJpbiJdLnB1c2godkVudHJ5KTtpZigtLXdFbnRyeS5pbmRlZ3JlZT09PTApc291cmNlU2V0LnB1c2god0VudHJ5KX19d2hpbGUoc291cmNlU2V0Lmxlbmd0aCl7dmFyIGVudHJ5PXNvdXJjZVNldC5wb3AoKTtlbnRyaWVzLnB1c2goZW50cnkpO18uZm9yRWFjaChlbnRyeVsiaW4iXS5yZXZlcnNlKCksaGFuZGxlSW4oZW50cnkpKTtfLmZvckVhY2goZW50cnkub3V0LGhhbmRsZU91dChlbnRyeSkpfXJldHVybiBfLmNoYWluKGVudHJpZXMpLmZpbHRlcihmdW5jdGlvbihlbnRyeSl7cmV0dXJuIWVudHJ5Lm1lcmdlZH0pLm1hcChmdW5jdGlvbihlbnRyeSl7cmV0dXJuIF8ucGljayhlbnRyeSxbInZzIiwiaSIsImJhcnljZW50ZXIiLCJ3ZWlnaHQiXSl9KS52YWx1ZSgpfWZ1bmN0aW9uIG1lcmdlRW50cmllcyh0YXJnZXQsc291cmNlKXt2YXIgc3VtPTAsd2VpZ2h0PTA7CmlmKHRhcmdldC53ZWlnaHQpe3N1bSs9dGFyZ2V0LmJhcnljZW50ZXIqdGFyZ2V0LndlaWdodDt3ZWlnaHQrPXRhcmdldC53ZWlnaHR9aWYoc291cmNlLndlaWdodCl7c3VtKz1zb3VyY2UuYmFyeWNlbnRlcipzb3VyY2Uud2VpZ2h0O3dlaWdodCs9c291cmNlLndlaWdodH10YXJnZXQudnM9c291cmNlLnZzLmNvbmNhdCh0YXJnZXQudnMpO3RhcmdldC5iYXJ5Y2VudGVyPXN1bS93ZWlnaHQ7dGFyZ2V0LndlaWdodD13ZWlnaHQ7dGFyZ2V0Lmk9TWF0aC5taW4oc291cmNlLmksdGFyZ2V0LmkpO3NvdXJjZS5tZXJnZWQ9dHJ1ZX19LHsiLi4vbG9kYXNoIjoxMH1dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxiYXJ5Y2VudGVyPXJlcXVpcmUoIi4vYmFyeWNlbnRlciIpLHJlc29sdmVDb25mbGljdHM9cmVxdWlyZSgiLi9yZXNvbHZlLWNvbmZsaWN0cyIpLHNvcnQ9cmVxdWlyZSgiLi9zb3J0Iik7bW9kdWxlLmV4cG9ydHM9CnNvcnRTdWJncmFwaDtmdW5jdGlvbiBzb3J0U3ViZ3JhcGgoZyx2LGNnLGJpYXNSaWdodCl7dmFyIG1vdmFibGU9Zy5jaGlsZHJlbih2KSxub2RlPWcubm9kZSh2KSxibD1ub2RlP25vZGUuYm9yZGVyTGVmdDp1bmRlZmluZWQsYnI9bm9kZT9ub2RlLmJvcmRlclJpZ2h0OnVuZGVmaW5lZCxzdWJncmFwaHM9e307aWYoYmwpbW92YWJsZT1fLmZpbHRlcihtb3ZhYmxlLGZ1bmN0aW9uKHcpe3JldHVybiB3IT09YmwmJnchPT1icn0pO3ZhciBiYXJ5Y2VudGVycz1iYXJ5Y2VudGVyKGcsbW92YWJsZSk7Xy5mb3JFYWNoKGJhcnljZW50ZXJzLGZ1bmN0aW9uKGVudHJ5KXtpZihnLmNoaWxkcmVuKGVudHJ5LnYpLmxlbmd0aCl7dmFyIHN1YmdyYXBoUmVzdWx0PXNvcnRTdWJncmFwaChnLGVudHJ5LnYsY2csYmlhc1JpZ2h0KTtzdWJncmFwaHNbZW50cnkudl09c3ViZ3JhcGhSZXN1bHQ7aWYoXy5oYXMoc3ViZ3JhcGhSZXN1bHQsImJhcnljZW50ZXIiKSltZXJnZUJhcnljZW50ZXJzKGVudHJ5LApzdWJncmFwaFJlc3VsdCl9fSk7dmFyIGVudHJpZXM9cmVzb2x2ZUNvbmZsaWN0cyhiYXJ5Y2VudGVycyxjZyk7ZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsc3ViZ3JhcGhzKTt2YXIgcmVzdWx0PXNvcnQoZW50cmllcyxiaWFzUmlnaHQpO2lmKGJsKXtyZXN1bHQudnM9Xy5mbGF0dGVuKFtibCxyZXN1bHQudnMsYnJdLHRydWUpO2lmKGcucHJlZGVjZXNzb3JzKGJsKS5sZW5ndGgpe3ZhciBibFByZWQ9Zy5ub2RlKGcucHJlZGVjZXNzb3JzKGJsKVswXSksYnJQcmVkPWcubm9kZShnLnByZWRlY2Vzc29ycyhicilbMF0pO2lmKCFfLmhhcyhyZXN1bHQsImJhcnljZW50ZXIiKSl7cmVzdWx0LmJhcnljZW50ZXI9MDtyZXN1bHQud2VpZ2h0PTB9cmVzdWx0LmJhcnljZW50ZXI9KHJlc3VsdC5iYXJ5Y2VudGVyKnJlc3VsdC53ZWlnaHQrYmxQcmVkLm9yZGVyK2JyUHJlZC5vcmRlcikvKHJlc3VsdC53ZWlnaHQrMik7cmVzdWx0LndlaWdodCs9Mn19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBleHBhbmRTdWJncmFwaHMoZW50cmllcywKc3ViZ3JhcGhzKXtfLmZvckVhY2goZW50cmllcyxmdW5jdGlvbihlbnRyeSl7ZW50cnkudnM9Xy5mbGF0dGVuKGVudHJ5LnZzLm1hcChmdW5jdGlvbih2KXtpZihzdWJncmFwaHNbdl0pcmV0dXJuIHN1YmdyYXBoc1t2XS52cztyZXR1cm4gdn0pLHRydWUpfSl9ZnVuY3Rpb24gbWVyZ2VCYXJ5Y2VudGVycyh0YXJnZXQsb3RoZXIpe2lmKCFfLmlzVW5kZWZpbmVkKHRhcmdldC5iYXJ5Y2VudGVyKSl7dGFyZ2V0LmJhcnljZW50ZXI9KHRhcmdldC5iYXJ5Y2VudGVyKnRhcmdldC53ZWlnaHQrb3RoZXIuYmFyeWNlbnRlcipvdGhlci53ZWlnaHQpLyh0YXJnZXQud2VpZ2h0K290aGVyLndlaWdodCk7dGFyZ2V0LndlaWdodCs9b3RoZXIud2VpZ2h0fWVsc2V7dGFyZ2V0LmJhcnljZW50ZXI9b3RoZXIuYmFyeWNlbnRlcjt0YXJnZXQud2VpZ2h0PW90aGVyLndlaWdodH19fSx7Ii4uL2xvZGFzaCI6MTAsIi4vYmFyeWNlbnRlciI6MTQsIi4vcmVzb2x2ZS1jb25mbGljdHMiOjE5LCIuL3NvcnQiOjIxfV0sCjIxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKTttb2R1bGUuZXhwb3J0cz1zb3J0O2Z1bmN0aW9uIHNvcnQoZW50cmllcyxiaWFzUmlnaHQpe3ZhciBwYXJ0cz11dGlsLnBhcnRpdGlvbihlbnRyaWVzLGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4gXy5oYXMoZW50cnksImJhcnljZW50ZXIiKX0pO3ZhciBzb3J0YWJsZT1wYXJ0cy5saHMsdW5zb3J0YWJsZT1fLnNvcnRCeShwYXJ0cy5yaHMsZnVuY3Rpb24oZW50cnkpe3JldHVybi1lbnRyeS5pfSksdnM9W10sc3VtPTAsd2VpZ2h0PTAsdnNJbmRleD0wO3NvcnRhYmxlLnNvcnQoY29tcGFyZVdpdGhCaWFzKCEhYmlhc1JpZ2h0KSk7dnNJbmRleD1jb25zdW1lVW5zb3J0YWJsZSh2cyx1bnNvcnRhYmxlLHZzSW5kZXgpO18uZm9yRWFjaChzb3J0YWJsZSxmdW5jdGlvbihlbnRyeSl7dnNJbmRleCs9ZW50cnkudnMubGVuZ3RoO3ZzLnB1c2goZW50cnkudnMpOwpzdW0rPWVudHJ5LmJhcnljZW50ZXIqZW50cnkud2VpZ2h0O3dlaWdodCs9ZW50cnkud2VpZ2h0O3ZzSW5kZXg9Y29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSx2c0luZGV4KX0pO3ZhciByZXN1bHQ9e3ZzOl8uZmxhdHRlbih2cyx0cnVlKX07aWYod2VpZ2h0KXtyZXN1bHQuYmFyeWNlbnRlcj1zdW0vd2VpZ2h0O3Jlc3VsdC53ZWlnaHQ9d2VpZ2h0fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSxpbmRleCl7dmFyIGxhc3Q7d2hpbGUodW5zb3J0YWJsZS5sZW5ndGgmJihsYXN0PV8ubGFzdCh1bnNvcnRhYmxlKSkuaTw9aW5kZXgpe3Vuc29ydGFibGUucG9wKCk7dnMucHVzaChsYXN0LnZzKTtpbmRleCsrfXJldHVybiBpbmRleH1mdW5jdGlvbiBjb21wYXJlV2l0aEJpYXMoYmlhcyl7cmV0dXJuIGZ1bmN0aW9uKGVudHJ5VixlbnRyeVcpe2lmKGVudHJ5Vi5iYXJ5Y2VudGVyPGVudHJ5Vy5iYXJ5Y2VudGVyKXJldHVybi0xO2Vsc2UgaWYoZW50cnlWLmJhcnljZW50ZXI+CmVudHJ5Vy5iYXJ5Y2VudGVyKXJldHVybiAxO3JldHVybiFiaWFzP2VudHJ5Vi5pLWVudHJ5Vy5pOmVudHJ5Vy5pLWVudHJ5Vi5pfX19LHsiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6Mjl9XSwyMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1wYXJlbnREdW1teUNoYWlucztmdW5jdGlvbiBwYXJlbnREdW1teUNoYWlucyhnKXt2YXIgcG9zdG9yZGVyTnVtcz1wb3N0b3JkZXIoZyk7Xy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucyxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodiksZWRnZU9iaj1ub2RlLmVkZ2VPYmoscGF0aERhdGE9ZmluZFBhdGgoZyxwb3N0b3JkZXJOdW1zLGVkZ2VPYmoudixlZGdlT2JqLncpLHBhdGg9cGF0aERhdGEucGF0aCxsY2E9cGF0aERhdGEubGNhLHBhdGhJZHg9MCxwYXRoVj1wYXRoW3BhdGhJZHhdLGFzY2VuZGluZz10cnVlO3doaWxlKHYhPT1lZGdlT2JqLncpe25vZGU9Cmcubm9kZSh2KTtpZihhc2NlbmRpbmcpe3doaWxlKChwYXRoVj1wYXRoW3BhdGhJZHhdKSE9PWxjYSYmZy5ub2RlKHBhdGhWKS5tYXhSYW5rPG5vZGUucmFuaylwYXRoSWR4Kys7aWYocGF0aFY9PT1sY2EpYXNjZW5kaW5nPWZhbHNlfWlmKCFhc2NlbmRpbmcpe3doaWxlKHBhdGhJZHg8cGF0aC5sZW5ndGgtMSYmZy5ub2RlKHBhdGhWPXBhdGhbcGF0aElkeCsxXSkubWluUmFuazw9bm9kZS5yYW5rKXBhdGhJZHgrKztwYXRoVj1wYXRoW3BhdGhJZHhdfWcuc2V0UGFyZW50KHYscGF0aFYpO3Y9Zy5zdWNjZXNzb3JzKHYpWzBdfX0pfWZ1bmN0aW9uIGZpbmRQYXRoKGcscG9zdG9yZGVyTnVtcyx2LHcpe3ZhciB2UGF0aD1bXSx3UGF0aD1bXSxsb3c9TWF0aC5taW4ocG9zdG9yZGVyTnVtc1t2XS5sb3cscG9zdG9yZGVyTnVtc1t3XS5sb3cpLGxpbT1NYXRoLm1heChwb3N0b3JkZXJOdW1zW3ZdLmxpbSxwb3N0b3JkZXJOdW1zW3ddLmxpbSkscGFyZW50LGxjYTtwYXJlbnQ9djtkb3twYXJlbnQ9CmcucGFyZW50KHBhcmVudCk7dlBhdGgucHVzaChwYXJlbnQpfXdoaWxlKHBhcmVudCYmKHBvc3RvcmRlck51bXNbcGFyZW50XS5sb3c+bG93fHxsaW0+cG9zdG9yZGVyTnVtc1twYXJlbnRdLmxpbSkpO2xjYT1wYXJlbnQ7cGFyZW50PXc7d2hpbGUoKHBhcmVudD1nLnBhcmVudChwYXJlbnQpKSE9PWxjYSl3UGF0aC5wdXNoKHBhcmVudCk7cmV0dXJue3BhdGg6dlBhdGguY29uY2F0KHdQYXRoLnJldmVyc2UoKSksbGNhOmxjYX19ZnVuY3Rpb24gcG9zdG9yZGVyKGcpe3ZhciByZXN1bHQ9e30sbGltPTA7ZnVuY3Rpb24gZGZzKHYpe3ZhciBsb3c9bGltO18uZm9yRWFjaChnLmNoaWxkcmVuKHYpLGRmcyk7cmVzdWx0W3ZdPXtsb3c6bG93LGxpbTpsaW0rK319Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSxkZnMpO3JldHVybiByZXN1bHR9fSx7Ii4vbG9kYXNoIjoxMH1dLDIzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD0KcmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKTttb2R1bGUuZXhwb3J0cz17cG9zaXRpb25YOnBvc2l0aW9uWCxmaW5kVHlwZTFDb25mbGljdHM6ZmluZFR5cGUxQ29uZmxpY3RzLGZpbmRUeXBlMkNvbmZsaWN0czpmaW5kVHlwZTJDb25mbGljdHMsYWRkQ29uZmxpY3Q6YWRkQ29uZmxpY3QsaGFzQ29uZmxpY3Q6aGFzQ29uZmxpY3QsdmVydGljYWxBbGlnbm1lbnQ6dmVydGljYWxBbGlnbm1lbnQsaG9yaXpvbnRhbENvbXBhY3Rpb246aG9yaXpvbnRhbENvbXBhY3Rpb24sYWxpZ25Db29yZGluYXRlczphbGlnbkNvb3JkaW5hdGVzLGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50OmZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50LGJhbGFuY2U6YmFsYW5jZX07ZnVuY3Rpb24gZmluZFR5cGUxQ29uZmxpY3RzKGcsbGF5ZXJpbmcpe3ZhciBjb25mbGljdHM9e307ZnVuY3Rpb24gdmlzaXRMYXllcihwcmV2TGF5ZXIsbGF5ZXIpe3ZhciBrMD0wLHNjYW5Qb3M9CjAscHJldkxheWVyTGVuZ3RoPXByZXZMYXllci5sZW5ndGgsbGFzdE5vZGU9Xy5sYXN0KGxheWVyKTtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixpKXt2YXIgdz1maW5kT3RoZXJJbm5lclNlZ21lbnROb2RlKGcsdiksazE9dz9nLm5vZGUodykub3JkZXI6cHJldkxheWVyTGVuZ3RoO2lmKHd8fHY9PT1sYXN0Tm9kZSl7Xy5mb3JFYWNoKGxheWVyLnNsaWNlKHNjYW5Qb3MsaSsxKSxmdW5jdGlvbihzY2FuTm9kZSl7Xy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHNjYW5Ob2RlKSxmdW5jdGlvbih1KXt2YXIgdUxhYmVsPWcubm9kZSh1KSx1UG9zPXVMYWJlbC5vcmRlcjtpZigodVBvczxrMHx8azE8dVBvcykmJiEodUxhYmVsLmR1bW15JiZnLm5vZGUoc2Nhbk5vZGUpLmR1bW15KSlhZGRDb25mbGljdChjb25mbGljdHMsdSxzY2FuTm9kZSl9KX0pO3NjYW5Qb3M9aSsxO2swPWsxfX0pO3JldHVybiBsYXllcn1fLnJlZHVjZShsYXllcmluZyx2aXNpdExheWVyKTtyZXR1cm4gY29uZmxpY3RzfQpmdW5jdGlvbiBmaW5kVHlwZTJDb25mbGljdHMoZyxsYXllcmluZyl7dmFyIGNvbmZsaWN0cz17fTtmdW5jdGlvbiBzY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoRW5kLHByZXZOb3J0aEJvcmRlcixuZXh0Tm9ydGhCb3JkZXIpe3ZhciB2O18uZm9yRWFjaChfLnJhbmdlKHNvdXRoUG9zLHNvdXRoRW5kKSxmdW5jdGlvbihpKXt2PXNvdXRoW2ldO2lmKGcubm9kZSh2KS5kdW1teSlfLmZvckVhY2goZy5wcmVkZWNlc3NvcnModiksZnVuY3Rpb24odSl7dmFyIHVOb2RlPWcubm9kZSh1KTtpZih1Tm9kZS5kdW1teSYmKHVOb2RlLm9yZGVyPHByZXZOb3J0aEJvcmRlcnx8dU5vZGUub3JkZXI+bmV4dE5vcnRoQm9yZGVyKSlhZGRDb25mbGljdChjb25mbGljdHMsdSx2KX0pfSl9ZnVuY3Rpb24gdmlzaXRMYXllcihub3J0aCxzb3V0aCl7dmFyIHByZXZOb3J0aFBvcz0tMSxuZXh0Tm9ydGhQb3Msc291dGhQb3M9MDtfLmZvckVhY2goc291dGgsZnVuY3Rpb24odixzb3V0aExvb2thaGVhZCl7aWYoZy5ub2RlKHYpLmR1bW15PT09CiJib3JkZXIiKXt2YXIgcHJlZGVjZXNzb3JzPWcucHJlZGVjZXNzb3JzKHYpO2lmKHByZWRlY2Vzc29ycy5sZW5ndGgpe25leHROb3J0aFBvcz1nLm5vZGUocHJlZGVjZXNzb3JzWzBdKS5vcmRlcjtzY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoTG9va2FoZWFkLHByZXZOb3J0aFBvcyxuZXh0Tm9ydGhQb3MpO3NvdXRoUG9zPXNvdXRoTG9va2FoZWFkO3ByZXZOb3J0aFBvcz1uZXh0Tm9ydGhQb3N9fXNjYW4oc291dGgsc291dGhQb3Msc291dGgubGVuZ3RoLG5leHROb3J0aFBvcyxub3J0aC5sZW5ndGgpfSk7cmV0dXJuIHNvdXRofV8ucmVkdWNlKGxheWVyaW5nLHZpc2l0TGF5ZXIpO3JldHVybiBjb25mbGljdHN9ZnVuY3Rpb24gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLHYpe2lmKGcubm9kZSh2KS5kdW1teSlyZXR1cm4gXy5maW5kKGcucHJlZGVjZXNzb3JzKHYpLGZ1bmN0aW9uKHUpe3JldHVybiBnLm5vZGUodSkuZHVtbXl9KX1mdW5jdGlvbiBhZGRDb25mbGljdChjb25mbGljdHMsCnYsdyl7aWYodj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXZhciBjb25mbGljdHNWPWNvbmZsaWN0c1t2XTtpZighY29uZmxpY3RzViljb25mbGljdHNbdl09Y29uZmxpY3RzVj17fTtjb25mbGljdHNWW3ddPXRydWV9ZnVuY3Rpb24gaGFzQ29uZmxpY3QoY29uZmxpY3RzLHYsdyl7aWYodj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXJldHVybiBfLmhhcyhjb25mbGljdHNbdl0sdyl9ZnVuY3Rpb24gdmVydGljYWxBbGlnbm1lbnQoZyxsYXllcmluZyxjb25mbGljdHMsbmVpZ2hib3JGbil7dmFyIHJvb3Q9e30sYWxpZ249e30scG9zPXt9O18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsb3JkZXIpe3Jvb3Rbdl09djthbGlnblt2XT12O3Bvc1t2XT1vcmRlcn0pfSk7Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXt2YXIgcHJldklkeD0tMTtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odil7dmFyIHdzPW5laWdoYm9yRm4odik7CmlmKHdzLmxlbmd0aCl7d3M9Xy5zb3J0Qnkod3MsZnVuY3Rpb24odyl7cmV0dXJuIHBvc1t3XX0pO3ZhciBtcD0od3MubGVuZ3RoLTEpLzI7Zm9yKHZhciBpPU1hdGguZmxvb3IobXApLGlsPU1hdGguY2VpbChtcCk7aTw9aWw7KytpKXt2YXIgdz13c1tpXTtpZihhbGlnblt2XT09PXYmJnByZXZJZHg8cG9zW3ddJiYhaGFzQ29uZmxpY3QoY29uZmxpY3RzLHYsdykpe2FsaWduW3ddPXY7YWxpZ25bdl09cm9vdFt2XT1yb290W3ddO3ByZXZJZHg9cG9zW3ddfX19fSl9KTtyZXR1cm57cm9vdDpyb290LGFsaWduOmFsaWdufX1mdW5jdGlvbiBob3Jpem9udGFsQ29tcGFjdGlvbihnLGxheWVyaW5nLHJvb3QsYWxpZ24scmV2ZXJzZVNlcCl7dmFyIHhzPXt9LGJsb2NrRz1idWlsZEJsb2NrR3JhcGgoZyxsYXllcmluZyxyb290LHJldmVyc2VTZXApLGJvcmRlclR5cGU9cmV2ZXJzZVNlcD8iYm9yZGVyTGVmdCI6ImJvcmRlclJpZ2h0IjtmdW5jdGlvbiBpdGVyYXRlKHNldFhzRnVuYyxuZXh0Tm9kZXNGdW5jKXt2YXIgc3RhY2s9CmJsb2NrRy5ub2RlcygpO3ZhciBlbGVtPXN0YWNrLnBvcCgpO3ZhciB2aXNpdGVkPXt9O3doaWxlKGVsZW0pe2lmKHZpc2l0ZWRbZWxlbV0pc2V0WHNGdW5jKGVsZW0pO2Vsc2V7dmlzaXRlZFtlbGVtXT10cnVlO3N0YWNrLnB1c2goZWxlbSk7c3RhY2s9c3RhY2suY29uY2F0KG5leHROb2Rlc0Z1bmMoZWxlbSkpfWVsZW09c3RhY2sucG9wKCl9fWZ1bmN0aW9uIHBhc3MxKGVsZW0pe3hzW2VsZW1dPWJsb2NrRy5pbkVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsZSl7cmV0dXJuIE1hdGgubWF4KGFjYyx4c1tlLnZdK2Jsb2NrRy5lZGdlKGUpKX0sMCl9ZnVuY3Rpb24gcGFzczIoZWxlbSl7dmFyIG1pbj1ibG9ja0cub3V0RWRnZXMoZWxlbSkucmVkdWNlKGZ1bmN0aW9uKGFjYyxlKXtyZXR1cm4gTWF0aC5taW4oYWNjLHhzW2Uud10tYmxvY2tHLmVkZ2UoZSkpfSxOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO3ZhciBub2RlPWcubm9kZShlbGVtKTtpZihtaW4hPT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkmJgpub2RlLmJvcmRlclR5cGUhPT1ib3JkZXJUeXBlKXhzW2VsZW1dPU1hdGgubWF4KHhzW2VsZW1dLG1pbil9aXRlcmF0ZShwYXNzMSxfLmJpbmQoYmxvY2tHLnByZWRlY2Vzc29ycyxibG9ja0cpKTtpdGVyYXRlKHBhc3MyLF8uYmluZChibG9ja0cuc3VjY2Vzc29ycyxibG9ja0cpKTtfLmZvckVhY2goYWxpZ24sZnVuY3Rpb24odil7eHNbdl09eHNbcm9vdFt2XV19KTtyZXR1cm4geHN9ZnVuY3Rpb24gYnVpbGRCbG9ja0dyYXBoKGcsbGF5ZXJpbmcscm9vdCxyZXZlcnNlU2VwKXt2YXIgYmxvY2tHcmFwaD1uZXcgR3JhcGgsZ3JhcGhMYWJlbD1nLmdyYXBoKCksc2VwRm49c2VwKGdyYXBoTGFiZWwubm9kZXNlcCxncmFwaExhYmVsLmVkZ2VzZXAscmV2ZXJzZVNlcCk7Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXt2YXIgdTtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odil7dmFyIHZSb290PXJvb3Rbdl07YmxvY2tHcmFwaC5zZXROb2RlKHZSb290KTtpZih1KXt2YXIgdVJvb3Q9CnJvb3RbdV0scHJldk1heD1ibG9ja0dyYXBoLmVkZ2UodVJvb3QsdlJvb3QpO2Jsb2NrR3JhcGguc2V0RWRnZSh1Um9vdCx2Um9vdCxNYXRoLm1heChzZXBGbihnLHYsdSkscHJldk1heHx8MCkpfXU9dn0pfSk7cmV0dXJuIGJsb2NrR3JhcGh9ZnVuY3Rpb24gZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZyx4c3Mpe3JldHVybiBfLm1pbkJ5KF8udmFsdWVzKHhzcyksZnVuY3Rpb24oeHMpe3ZhciBtYXg9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO3ZhciBtaW49TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO18uZm9ySW4oeHMsZnVuY3Rpb24oeCx2KXt2YXIgaGFsZldpZHRoPXdpZHRoKGcsdikvMjttYXg9TWF0aC5tYXgoeCtoYWxmV2lkdGgsbWF4KTttaW49TWF0aC5taW4oeC1oYWxmV2lkdGgsbWluKX0pO3JldHVybiBtYXgtbWlufSl9ZnVuY3Rpb24gYWxpZ25Db29yZGluYXRlcyh4c3MsYWxpZ25Ubyl7dmFyIGFsaWduVG9WYWxzPV8udmFsdWVzKGFsaWduVG8pLGFsaWduVG9NaW49Cl8ubWluKGFsaWduVG9WYWxzKSxhbGlnblRvTWF4PV8ubWF4KGFsaWduVG9WYWxzKTtfLmZvckVhY2goWyJ1IiwiZCJdLGZ1bmN0aW9uKHZlcnQpe18uZm9yRWFjaChbImwiLCJyIl0sZnVuY3Rpb24oaG9yaXope3ZhciBhbGlnbm1lbnQ9dmVydCtob3Jpeix4cz14c3NbYWxpZ25tZW50XSxkZWx0YTtpZih4cz09PWFsaWduVG8pcmV0dXJuO3ZhciB4c1ZhbHM9Xy52YWx1ZXMoeHMpO2RlbHRhPWhvcml6PT09ImwiP2FsaWduVG9NaW4tXy5taW4oeHNWYWxzKTphbGlnblRvTWF4LV8ubWF4KHhzVmFscyk7aWYoZGVsdGEpeHNzW2FsaWdubWVudF09Xy5tYXBWYWx1ZXMoeHMsZnVuY3Rpb24oeCl7cmV0dXJuIHgrZGVsdGF9KX0pfSl9ZnVuY3Rpb24gYmFsYW5jZSh4c3MsYWxpZ24pe3JldHVybiBfLm1hcFZhbHVlcyh4c3MudWwsZnVuY3Rpb24oaWdub3JlLHYpe2lmKGFsaWduKXJldHVybiB4c3NbYWxpZ24udG9Mb3dlckNhc2UoKV1bdl07ZWxzZXt2YXIgeHM9Xy5zb3J0QnkoXy5tYXAoeHNzLAp2KSk7cmV0dXJuKHhzWzFdK3hzWzJdKS8yfX0pfWZ1bmN0aW9uIHBvc2l0aW9uWChnKXt2YXIgbGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpLGNvbmZsaWN0cz1fLm1lcmdlKGZpbmRUeXBlMUNvbmZsaWN0cyhnLGxheWVyaW5nKSxmaW5kVHlwZTJDb25mbGljdHMoZyxsYXllcmluZykpO3ZhciB4c3M9e30sYWRqdXN0ZWRMYXllcmluZztfLmZvckVhY2goWyJ1IiwiZCJdLGZ1bmN0aW9uKHZlcnQpe2FkanVzdGVkTGF5ZXJpbmc9dmVydD09PSJ1Ij9sYXllcmluZzpfLnZhbHVlcyhsYXllcmluZykucmV2ZXJzZSgpO18uZm9yRWFjaChbImwiLCJyIl0sZnVuY3Rpb24oaG9yaXope2lmKGhvcml6PT09InIiKWFkanVzdGVkTGF5ZXJpbmc9Xy5tYXAoYWRqdXN0ZWRMYXllcmluZyxmdW5jdGlvbihpbm5lcil7cmV0dXJuIF8udmFsdWVzKGlubmVyKS5yZXZlcnNlKCl9KTt2YXIgbmVpZ2hib3JGbj1fLmJpbmQodmVydD09PSJ1Ij9nLnByZWRlY2Vzc29yczpnLnN1Y2Nlc3NvcnMsCmcpO3ZhciBhbGlnbj12ZXJ0aWNhbEFsaWdubWVudChnLGFkanVzdGVkTGF5ZXJpbmcsY29uZmxpY3RzLG5laWdoYm9yRm4pO3ZhciB4cz1ob3Jpem9udGFsQ29tcGFjdGlvbihnLGFkanVzdGVkTGF5ZXJpbmcsYWxpZ24ucm9vdCxhbGlnbi5hbGlnbixob3Jpej09PSJyIik7aWYoaG9yaXo9PT0iciIpeHM9Xy5tYXBWYWx1ZXMoeHMsZnVuY3Rpb24oeCl7cmV0dXJuLXh9KTt4c3NbdmVydCtob3Jpel09eHN9KX0pO3ZhciBzbWFsbGVzdFdpZHRoPWZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcseHNzKTthbGlnbkNvb3JkaW5hdGVzKHhzcyxzbWFsbGVzdFdpZHRoKTtyZXR1cm4gYmFsYW5jZSh4c3MsZy5ncmFwaCgpLmFsaWduKX1mdW5jdGlvbiBzZXAobm9kZVNlcCxlZGdlU2VwLHJldmVyc2VTZXApe3JldHVybiBmdW5jdGlvbihnLHYsdyl7dmFyIHZMYWJlbD1nLm5vZGUodiksd0xhYmVsPWcubm9kZSh3KSxzdW09MCxkZWx0YTtzdW0rPXZMYWJlbC53aWR0aC8yO2lmKF8uaGFzKHZMYWJlbCwKImxhYmVscG9zIikpc3dpdGNoKHZMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKXtjYXNlICJsIjpkZWx0YT0tdkxhYmVsLndpZHRoLzI7YnJlYWs7Y2FzZSAiciI6ZGVsdGE9dkxhYmVsLndpZHRoLzI7YnJlYWt9aWYoZGVsdGEpc3VtKz1yZXZlcnNlU2VwP2RlbHRhOi1kZWx0YTtkZWx0YT0wO3N1bSs9KHZMYWJlbC5kdW1teT9lZGdlU2VwOm5vZGVTZXApLzI7c3VtKz0od0xhYmVsLmR1bW15P2VkZ2VTZXA6bm9kZVNlcCkvMjtzdW0rPXdMYWJlbC53aWR0aC8yO2lmKF8uaGFzKHdMYWJlbCwibGFiZWxwb3MiKSlzd2l0Y2god0xhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpe2Nhc2UgImwiOmRlbHRhPXdMYWJlbC53aWR0aC8yO2JyZWFrO2Nhc2UgInIiOmRlbHRhPS13TGFiZWwud2lkdGgvMjticmVha31pZihkZWx0YSlzdW0rPXJldmVyc2VTZXA/ZGVsdGE6LWRlbHRhO2RlbHRhPTA7cmV0dXJuIHN1bX19ZnVuY3Rpb24gd2lkdGgoZyx2KXtyZXR1cm4gZy5ub2RlKHYpLndpZHRofQp9LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5fV0sMjQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi4vdXRpbCIpLHBvc2l0aW9uWD1yZXF1aXJlKCIuL2JrIikucG9zaXRpb25YO21vZHVsZS5leHBvcnRzPXBvc2l0aW9uO2Z1bmN0aW9uIHBvc2l0aW9uKGcpe2c9dXRpbC5hc05vbkNvbXBvdW5kR3JhcGgoZyk7cG9zaXRpb25ZKGcpO18uZm9yRWFjaChwb3NpdGlvblgoZyksZnVuY3Rpb24oeCx2KXtnLm5vZGUodikueD14fSl9ZnVuY3Rpb24gcG9zaXRpb25ZKGcpe3ZhciBsYXllcmluZz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZykscmFua1NlcD1nLmdyYXBoKCkucmFua3NlcCxwcmV2WT0wO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIG1heEhlaWdodD1fLm1heChfLm1hcChsYXllcixmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLmhlaWdodH0pKTsKXy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS55PXByZXZZK21heEhlaWdodC8yfSk7cHJldlkrPW1heEhlaWdodCtyYW5rU2VwfSl9fSx7Ii4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5LCIuL2JrIjoyM31dLDI1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoLHNsYWNrPXJlcXVpcmUoIi4vdXRpbCIpLnNsYWNrO21vZHVsZS5leHBvcnRzPWZlYXNpYmxlVHJlZTtmdW5jdGlvbiBmZWFzaWJsZVRyZWUoZyl7dmFyIHQ9bmV3IEdyYXBoKHtkaXJlY3RlZDpmYWxzZX0pO3ZhciBzdGFydD1nLm5vZGVzKClbMF0sc2l6ZT1nLm5vZGVDb3VudCgpO3Quc2V0Tm9kZShzdGFydCx7fSk7dmFyIGVkZ2UsZGVsdGE7d2hpbGUodGlnaHRUcmVlKHQsZyk8c2l6ZSl7ZWRnZT1maW5kTWluU2xhY2tFZGdlKHQsZyk7ZGVsdGE9dC5oYXNOb2RlKGVkZ2Uudik/CnNsYWNrKGcsZWRnZSk6LXNsYWNrKGcsZWRnZSk7c2hpZnRSYW5rcyh0LGcsZGVsdGEpfXJldHVybiB0fWZ1bmN0aW9uIHRpZ2h0VHJlZSh0LGcpe2Z1bmN0aW9uIGRmcyh2KXtfLmZvckVhY2goZy5ub2RlRWRnZXModiksZnVuY3Rpb24oZSl7dmFyIGVkZ2VWPWUudix3PXY9PT1lZGdlVj9lLnc6ZWRnZVY7aWYoIXQuaGFzTm9kZSh3KSYmIXNsYWNrKGcsZSkpe3Quc2V0Tm9kZSh3LHt9KTt0LnNldEVkZ2Uodix3LHt9KTtkZnModyl9fSl9Xy5mb3JFYWNoKHQubm9kZXMoKSxkZnMpO3JldHVybiB0Lm5vZGVDb3VudCgpfWZ1bmN0aW9uIGZpbmRNaW5TbGFja0VkZ2UodCxnKXtyZXR1cm4gXy5taW5CeShnLmVkZ2VzKCksZnVuY3Rpb24oZSl7aWYodC5oYXNOb2RlKGUudikhPT10Lmhhc05vZGUoZS53KSlyZXR1cm4gc2xhY2soZyxlKX0pfWZ1bmN0aW9uIHNoaWZ0UmFua3ModCxnLGRlbHRhKXtfLmZvckVhY2godC5ub2RlcygpLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS5yYW5rKz1kZWx0YX0pfQp9LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjh9XSwyNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIHJhbmtVdGlsPXJlcXVpcmUoIi4vdXRpbCIpLGxvbmdlc3RQYXRoPXJhbmtVdGlsLmxvbmdlc3RQYXRoLGZlYXNpYmxlVHJlZT1yZXF1aXJlKCIuL2ZlYXNpYmxlLXRyZWUiKSxuZXR3b3JrU2ltcGxleD1yZXF1aXJlKCIuL25ldHdvcmstc2ltcGxleCIpO21vZHVsZS5leHBvcnRzPXJhbms7ZnVuY3Rpb24gcmFuayhnKXtzd2l0Y2goZy5ncmFwaCgpLnJhbmtlcil7Y2FzZSAibmV0d29yay1zaW1wbGV4IjpuZXR3b3JrU2ltcGxleFJhbmtlcihnKTticmVhaztjYXNlICJ0aWdodC10cmVlIjp0aWdodFRyZWVSYW5rZXIoZyk7YnJlYWs7Y2FzZSAibG9uZ2VzdC1wYXRoIjpsb25nZXN0UGF0aFJhbmtlcihnKTticmVhaztkZWZhdWx0Om5ldHdvcmtTaW1wbGV4UmFua2VyKGcpfX12YXIgbG9uZ2VzdFBhdGhSYW5rZXI9bG9uZ2VzdFBhdGg7CmZ1bmN0aW9uIHRpZ2h0VHJlZVJhbmtlcihnKXtsb25nZXN0UGF0aChnKTtmZWFzaWJsZVRyZWUoZyl9ZnVuY3Rpb24gbmV0d29ya1NpbXBsZXhSYW5rZXIoZyl7bmV0d29ya1NpbXBsZXgoZyl9fSx7Ii4vZmVhc2libGUtdHJlZSI6MjUsIi4vbmV0d29yay1zaW1wbGV4IjoyNywiLi91dGlsIjoyOH1dLDI3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxmZWFzaWJsZVRyZWU9cmVxdWlyZSgiLi9mZWFzaWJsZS10cmVlIiksc2xhY2s9cmVxdWlyZSgiLi91dGlsIikuc2xhY2ssaW5pdFJhbms9cmVxdWlyZSgiLi91dGlsIikubG9uZ2VzdFBhdGgscHJlb3JkZXI9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5hbGcucHJlb3JkZXIscG9zdG9yZGVyPXJlcXVpcmUoIi4uL2dyYXBobGliIikuYWxnLnBvc3RvcmRlcixzaW1wbGlmeT1yZXF1aXJlKCIuLi91dGlsIikuc2ltcGxpZnk7bW9kdWxlLmV4cG9ydHM9bmV0d29ya1NpbXBsZXg7Cm5ldHdvcmtTaW1wbGV4LmluaXRMb3dMaW1WYWx1ZXM9aW5pdExvd0xpbVZhbHVlcztuZXR3b3JrU2ltcGxleC5pbml0Q3V0VmFsdWVzPWluaXRDdXRWYWx1ZXM7bmV0d29ya1NpbXBsZXguY2FsY0N1dFZhbHVlPWNhbGNDdXRWYWx1ZTtuZXR3b3JrU2ltcGxleC5sZWF2ZUVkZ2U9bGVhdmVFZGdlO25ldHdvcmtTaW1wbGV4LmVudGVyRWRnZT1lbnRlckVkZ2U7bmV0d29ya1NpbXBsZXguZXhjaGFuZ2VFZGdlcz1leGNoYW5nZUVkZ2VzO2Z1bmN0aW9uIG5ldHdvcmtTaW1wbGV4KGcpe2c9c2ltcGxpZnkoZyk7aW5pdFJhbmsoZyk7dmFyIHQ9ZmVhc2libGVUcmVlKGcpO2luaXRMb3dMaW1WYWx1ZXModCk7aW5pdEN1dFZhbHVlcyh0LGcpO3ZhciBlLGY7d2hpbGUoZT1sZWF2ZUVkZ2UodCkpe2Y9ZW50ZXJFZGdlKHQsZyxlKTtleGNoYW5nZUVkZ2VzKHQsZyxlLGYpfX1mdW5jdGlvbiBpbml0Q3V0VmFsdWVzKHQsZyl7dmFyIHZzPXBvc3RvcmRlcih0LHQubm9kZXMoKSk7dnM9dnMuc2xpY2UoMCwKdnMubGVuZ3RoLTEpO18uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXthc3NpZ25DdXRWYWx1ZSh0LGcsdil9KX1mdW5jdGlvbiBhc3NpZ25DdXRWYWx1ZSh0LGcsY2hpbGQpe3ZhciBjaGlsZExhYj10Lm5vZGUoY2hpbGQpLHBhcmVudD1jaGlsZExhYi5wYXJlbnQ7dC5lZGdlKGNoaWxkLHBhcmVudCkuY3V0dmFsdWU9Y2FsY0N1dFZhbHVlKHQsZyxjaGlsZCl9ZnVuY3Rpb24gY2FsY0N1dFZhbHVlKHQsZyxjaGlsZCl7dmFyIGNoaWxkTGFiPXQubm9kZShjaGlsZCkscGFyZW50PWNoaWxkTGFiLnBhcmVudCxjaGlsZElzVGFpbD10cnVlLGdyYXBoRWRnZT1nLmVkZ2UoY2hpbGQscGFyZW50KSxjdXRWYWx1ZT0wO2lmKCFncmFwaEVkZ2Upe2NoaWxkSXNUYWlsPWZhbHNlO2dyYXBoRWRnZT1nLmVkZ2UocGFyZW50LGNoaWxkKX1jdXRWYWx1ZT1ncmFwaEVkZ2Uud2VpZ2h0O18uZm9yRWFjaChnLm5vZGVFZGdlcyhjaGlsZCksZnVuY3Rpb24oZSl7dmFyIGlzT3V0RWRnZT1lLnY9PT1jaGlsZCxvdGhlcj0KaXNPdXRFZGdlP2UudzplLnY7aWYob3RoZXIhPT1wYXJlbnQpe3ZhciBwb2ludHNUb0hlYWQ9aXNPdXRFZGdlPT09Y2hpbGRJc1RhaWwsb3RoZXJXZWlnaHQ9Zy5lZGdlKGUpLndlaWdodDtjdXRWYWx1ZSs9cG9pbnRzVG9IZWFkP290aGVyV2VpZ2h0Oi1vdGhlcldlaWdodDtpZihpc1RyZWVFZGdlKHQsY2hpbGQsb3RoZXIpKXt2YXIgb3RoZXJDdXRWYWx1ZT10LmVkZ2UoY2hpbGQsb3RoZXIpLmN1dHZhbHVlO2N1dFZhbHVlKz1wb2ludHNUb0hlYWQ/LW90aGVyQ3V0VmFsdWU6b3RoZXJDdXRWYWx1ZX19fSk7cmV0dXJuIGN1dFZhbHVlfWZ1bmN0aW9uIGluaXRMb3dMaW1WYWx1ZXModHJlZSxyb290KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpcm9vdD10cmVlLm5vZGVzKClbMF07ZGZzQXNzaWduTG93TGltKHRyZWUse30sMSxyb290KX1mdW5jdGlvbiBkZnNBc3NpZ25Mb3dMaW0odHJlZSx2aXNpdGVkLG5leHRMaW0sdixwYXJlbnQpe3ZhciBsb3c9bmV4dExpbSxsYWJlbD10cmVlLm5vZGUodik7CnZpc2l0ZWRbdl09dHJ1ZTtfLmZvckVhY2godHJlZS5uZWlnaGJvcnModiksZnVuY3Rpb24odyl7aWYoIV8uaGFzKHZpc2l0ZWQsdykpbmV4dExpbT1kZnNBc3NpZ25Mb3dMaW0odHJlZSx2aXNpdGVkLG5leHRMaW0sdyx2KX0pO2xhYmVsLmxvdz1sb3c7bGFiZWwubGltPW5leHRMaW0rKztpZihwYXJlbnQpbGFiZWwucGFyZW50PXBhcmVudDtlbHNlIGRlbGV0ZSBsYWJlbC5wYXJlbnQ7cmV0dXJuIG5leHRMaW19ZnVuY3Rpb24gbGVhdmVFZGdlKHRyZWUpe3JldHVybiBfLmZpbmQodHJlZS5lZGdlcygpLGZ1bmN0aW9uKGUpe3JldHVybiB0cmVlLmVkZ2UoZSkuY3V0dmFsdWU8MH0pfWZ1bmN0aW9uIGVudGVyRWRnZSh0LGcsZWRnZSl7dmFyIHY9ZWRnZS52LHc9ZWRnZS53O2lmKCFnLmhhc0VkZ2Uodix3KSl7dj1lZGdlLnc7dz1lZGdlLnZ9dmFyIHZMYWJlbD10Lm5vZGUodiksd0xhYmVsPXQubm9kZSh3KSx0YWlsTGFiZWw9dkxhYmVsLGZsaXA9ZmFsc2U7aWYodkxhYmVsLmxpbT53TGFiZWwubGltKXt0YWlsTGFiZWw9CndMYWJlbDtmbGlwPXRydWV9dmFyIGNhbmRpZGF0ZXM9Xy5maWx0ZXIoZy5lZGdlcygpLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBmbGlwPT09aXNEZXNjZW5kYW50KHQsdC5ub2RlKGVkZ2UudiksdGFpbExhYmVsKSYmZmxpcCE9PWlzRGVzY2VuZGFudCh0LHQubm9kZShlZGdlLncpLHRhaWxMYWJlbCl9KTtyZXR1cm4gXy5taW5CeShjYW5kaWRhdGVzLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBzbGFjayhnLGVkZ2UpfSl9ZnVuY3Rpb24gZXhjaGFuZ2VFZGdlcyh0LGcsZSxmKXt2YXIgdj1lLnYsdz1lLnc7dC5yZW1vdmVFZGdlKHYsdyk7dC5zZXRFZGdlKGYudixmLncse30pO2luaXRMb3dMaW1WYWx1ZXModCk7aW5pdEN1dFZhbHVlcyh0LGcpO3VwZGF0ZVJhbmtzKHQsZyl9ZnVuY3Rpb24gdXBkYXRlUmFua3ModCxnKXt2YXIgcm9vdD1fLmZpbmQodC5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiFnLm5vZGUodikucGFyZW50fSksdnM9cHJlb3JkZXIodCxyb290KTt2cz12cy5zbGljZSgxKTsKXy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe3ZhciBwYXJlbnQ9dC5ub2RlKHYpLnBhcmVudCxlZGdlPWcuZWRnZSh2LHBhcmVudCksZmxpcHBlZD1mYWxzZTtpZighZWRnZSl7ZWRnZT1nLmVkZ2UocGFyZW50LHYpO2ZsaXBwZWQ9dHJ1ZX1nLm5vZGUodikucmFuaz1nLm5vZGUocGFyZW50KS5yYW5rKyhmbGlwcGVkP2VkZ2UubWlubGVuOi1lZGdlLm1pbmxlbil9KX1mdW5jdGlvbiBpc1RyZWVFZGdlKHRyZWUsdSx2KXtyZXR1cm4gdHJlZS5oYXNFZGdlKHUsdil9ZnVuY3Rpb24gaXNEZXNjZW5kYW50KHRyZWUsdkxhYmVsLHJvb3RMYWJlbCl7cmV0dXJuIHJvb3RMYWJlbC5sb3c8PXZMYWJlbC5saW0mJnZMYWJlbC5saW08PXJvb3RMYWJlbC5saW19fSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOSwiLi9mZWFzaWJsZS10cmVlIjoyNSwiLi91dGlsIjoyOH1dLDI4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTsKbW9kdWxlLmV4cG9ydHM9e2xvbmdlc3RQYXRoOmxvbmdlc3RQYXRoLHNsYWNrOnNsYWNrfTtmdW5jdGlvbiBsb25nZXN0UGF0aChnKXt2YXIgdmlzaXRlZD17fTtmdW5jdGlvbiBkZnModil7dmFyIGxhYmVsPWcubm9kZSh2KTtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybiBsYWJlbC5yYW5rO3Zpc2l0ZWRbdl09dHJ1ZTt2YXIgcmFuaz1fLm1pbkJ5KF8ubWFwKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7cmV0dXJuIGRmcyhlLncpLWcuZWRnZShlKS5taW5sZW59KSk7aWYocmFuaz09PU51bWJlci5QT1NJVElWRV9JTkZJTklUWXx8cmFuaz09PXVuZGVmaW5lZHx8cmFuaz09PW51bGwpcmFuaz0wO3JldHVybiBsYWJlbC5yYW5rPXJhbmt9Xy5mb3JFYWNoKGcuc291cmNlcygpLGRmcyl9ZnVuY3Rpb24gc2xhY2soZyxlKXtyZXR1cm4gZy5ub2RlKGUudykucmFuay1nLm5vZGUoZS52KS5yYW5rLWcuZWRnZShlKS5taW5sZW59fSx7Ii4uL2xvZGFzaCI6MTB9XSwyOTpbZnVuY3Rpb24ocmVxdWlyZSwKbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPXthZGREdW1teU5vZGU6YWRkRHVtbXlOb2RlLHNpbXBsaWZ5OnNpbXBsaWZ5LGFzTm9uQ29tcG91bmRHcmFwaDphc05vbkNvbXBvdW5kR3JhcGgsc3VjY2Vzc29yV2VpZ2h0czpzdWNjZXNzb3JXZWlnaHRzLHByZWRlY2Vzc29yV2VpZ2h0czpwcmVkZWNlc3NvcldlaWdodHMsaW50ZXJzZWN0UmVjdDppbnRlcnNlY3RSZWN0LGJ1aWxkTGF5ZXJNYXRyaXg6YnVpbGRMYXllck1hdHJpeCxub3JtYWxpemVSYW5rczpub3JtYWxpemVSYW5rcyxyZW1vdmVFbXB0eVJhbmtzOnJlbW92ZUVtcHR5UmFua3MsYWRkQm9yZGVyTm9kZTphZGRCb3JkZXJOb2RlLG1heFJhbms6bWF4UmFuayxwYXJ0aXRpb246cGFydGl0aW9uLHRpbWU6dGltZSxub3RpbWU6bm90aW1lfTtmdW5jdGlvbiBhZGREdW1teU5vZGUoZyx0eXBlLGF0dHJzLG5hbWUpe3ZhciB2OwpkbyB2PV8udW5pcXVlSWQobmFtZSk7d2hpbGUoZy5oYXNOb2RlKHYpKTthdHRycy5kdW1teT10eXBlO2cuc2V0Tm9kZSh2LGF0dHJzKTtyZXR1cm4gdn1mdW5jdGlvbiBzaW1wbGlmeShnKXt2YXIgc2ltcGxpZmllZD0obmV3IEdyYXBoKS5zZXRHcmFwaChnLmdyYXBoKCkpO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7c2ltcGxpZmllZC5zZXROb2RlKHYsZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIHNpbXBsZUxhYmVsPXNpbXBsaWZpZWQuZWRnZShlLnYsZS53KXx8e3dlaWdodDowLG1pbmxlbjoxfSxsYWJlbD1nLmVkZ2UoZSk7c2ltcGxpZmllZC5zZXRFZGdlKGUudixlLncse3dlaWdodDpzaW1wbGVMYWJlbC53ZWlnaHQrbGFiZWwud2VpZ2h0LG1pbmxlbjpNYXRoLm1heChzaW1wbGVMYWJlbC5taW5sZW4sbGFiZWwubWlubGVuKX0pfSk7cmV0dXJuIHNpbXBsaWZpZWR9ZnVuY3Rpb24gYXNOb25Db21wb3VuZEdyYXBoKGcpe3ZhciBzaW1wbGlmaWVkPQoobmV3IEdyYXBoKHttdWx0aWdyYXBoOmcuaXNNdWx0aWdyYXBoKCl9KSkuc2V0R3JhcGgoZy5ncmFwaCgpKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2lmKCFnLmNoaWxkcmVuKHYpLmxlbmd0aClzaW1wbGlmaWVkLnNldE5vZGUodixnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtzaW1wbGlmaWVkLnNldEVkZ2UoZSxnLmVkZ2UoZSkpfSk7cmV0dXJuIHNpbXBsaWZpZWR9ZnVuY3Rpb24gc3VjY2Vzc29yV2VpZ2h0cyhnKXt2YXIgd2VpZ2h0TWFwPV8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgc3Vjcz17fTtfLmZvckVhY2goZy5vdXRFZGdlcyh2KSxmdW5jdGlvbihlKXtzdWNzW2Uud109KHN1Y3NbZS53XXx8MCkrZy5lZGdlKGUpLndlaWdodH0pO3JldHVybiBzdWNzfSk7cmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSx3ZWlnaHRNYXApfWZ1bmN0aW9uIHByZWRlY2Vzc29yV2VpZ2h0cyhnKXt2YXIgd2VpZ2h0TWFwPV8ubWFwKGcubm9kZXMoKSwKZnVuY3Rpb24odil7dmFyIHByZWRzPXt9O18uZm9yRWFjaChnLmluRWRnZXModiksZnVuY3Rpb24oZSl7cHJlZHNbZS52XT0ocHJlZHNbZS52XXx8MCkrZy5lZGdlKGUpLndlaWdodH0pO3JldHVybiBwcmVkc30pO3JldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksd2VpZ2h0TWFwKX1mdW5jdGlvbiBpbnRlcnNlY3RSZWN0KHJlY3QscG9pbnQpe3ZhciB4PXJlY3QueDt2YXIgeT1yZWN0Lnk7dmFyIGR4PXBvaW50LngteDt2YXIgZHk9cG9pbnQueS15O3ZhciB3PXJlY3Qud2lkdGgvMjt2YXIgaD1yZWN0LmhlaWdodC8yO2lmKCFkeCYmIWR5KXRocm93IG5ldyBFcnJvcigiTm90IHBvc3NpYmxlIHRvIGZpbmQgaW50ZXJzZWN0aW9uIGluc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIik7dmFyIHN4LHN5O2lmKE1hdGguYWJzKGR5KSp3Pk1hdGguYWJzKGR4KSpoKXtpZihkeTwwKWg9LWg7c3g9aCpkeC9keTtzeT1ofWVsc2V7aWYoZHg8MCl3PS13O3N4PXc7c3k9dypkeS9keH1yZXR1cm57eDp4KwpzeCx5Onkrc3l9fWZ1bmN0aW9uIGJ1aWxkTGF5ZXJNYXRyaXgoZyl7dmFyIGxheWVyaW5nPV8ubWFwKF8ucmFuZ2UobWF4UmFuayhnKSsxKSxmdW5jdGlvbigpe3JldHVybltdfSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodikscmFuaz1ub2RlLnJhbms7aWYoIV8uaXNVbmRlZmluZWQocmFuaykpbGF5ZXJpbmdbcmFua11bbm9kZS5vcmRlcl09dn0pO3JldHVybiBsYXllcmluZ31mdW5jdGlvbiBub3JtYWxpemVSYW5rcyhnKXt2YXIgbWluPV8ubWluQnkoXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihfLmhhcyhub2RlLCJyYW5rIikpbm9kZS5yYW5rLT1taW59KX1mdW5jdGlvbiByZW1vdmVFbXB0eVJhbmtzKGcpe3ZhciBvZmZzZXQ9Xy5taW5CeShfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSkpOwp2YXIgbGF5ZXJzPVtdO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHJhbms9Zy5ub2RlKHYpLnJhbmstb2Zmc2V0O2lmKCFsYXllcnNbcmFua10pbGF5ZXJzW3JhbmtdPVtdO2xheWVyc1tyYW5rXS5wdXNoKHYpfSk7dmFyIGRlbHRhPTAsbm9kZVJhbmtGYWN0b3I9Zy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yO18uZm9yRWFjaChsYXllcnMsZnVuY3Rpb24odnMsaSl7aWYoXy5pc1VuZGVmaW5lZCh2cykmJmklbm9kZVJhbmtGYWN0b3IhPT0wKS0tZGVsdGE7ZWxzZSBpZihkZWx0YSlfLmZvckVhY2godnMsZnVuY3Rpb24odil7Zy5ub2RlKHYpLnJhbmsrPWRlbHRhfSl9KX1mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcscHJlZml4LHJhbmssb3JkZXIpe3ZhciBub2RlPXt3aWR0aDowLGhlaWdodDowfTtpZihhcmd1bWVudHMubGVuZ3RoPj00KXtub2RlLnJhbms9cmFuaztub2RlLm9yZGVyPW9yZGVyfXJldHVybiBhZGREdW1teU5vZGUoZywiYm9yZGVyIixub2RlLHByZWZpeCl9CmZ1bmN0aW9uIG1heFJhbmsoZyl7cmV0dXJuIF8ubWF4KF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgcmFuaz1nLm5vZGUodikucmFuaztpZighXy5pc1VuZGVmaW5lZChyYW5rKSlyZXR1cm4gcmFua30pKX1mdW5jdGlvbiBwYXJ0aXRpb24oY29sbGVjdGlvbixmbil7dmFyIHJlc3VsdD17bGhzOltdLHJoczpbXX07Xy5mb3JFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUpe2lmKGZuKHZhbHVlKSlyZXN1bHQubGhzLnB1c2godmFsdWUpO2Vsc2UgcmVzdWx0LnJocy5wdXNoKHZhbHVlKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdGltZShuYW1lLGZuKXt2YXIgc3RhcnQ9Xy5ub3coKTt0cnl7cmV0dXJuIGZuKCl9ZmluYWxseXtjb25zb2xlLmxvZyhuYW1lKyIgdGltZTogIisoXy5ub3coKS1zdGFydCkrIm1zIil9fWZ1bmN0aW9uIG5vdGltZShuYW1lLGZuKXtyZXR1cm4gZm4oKX19LHsiLi9ncmFwaGxpYiI6NywiLi9sb2Rhc2giOjEwfV0sMzA6W2Z1bmN0aW9uKHJlcXVpcmUsCm1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz0iMC44LjIifSx7fV19LHt9LFsxXSkoMSl9KTsKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9hbm5vdGF0aW9uLmpzCnZhciB0ZjsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7KGZ1bmN0aW9uKGgpe2Z1bmN0aW9uIGsocSl7cmV0dXJuKGQucmVuZGVyLkFubm90YXRpb25UeXBlW3FdfHwiIikudG9Mb3dlckNhc2UoKXx8bnVsbH1mdW5jdGlvbiB0KHEsdSl7dS5hbm5vdGF0aW9uVHlwZT09PWQucmVuZGVyLkFubm90YXRpb25UeXBlLlNVTU1BUlk/Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKHEsInVzZSIpLmF0dHIoImNsYXNzIiwic3VtbWFyeSIpLmF0dHIoInhsaW5rOmhyZWYiLCIjc3VtbWFyeS1pY29uIikuYXR0cigiY3Vyc29yIiwicG9pbnRlciIpOihxPWYubm9kZS5idWlsZFNoYXBlKHEsdSxmLkNsYXNzLkFubm90YXRpb24uTk9ERSksZi5zZWxlY3RPckNyZWF0ZUNoaWxkKHEsInRpdGxlIikudGV4dCh1Lm5vZGUubmFtZSkpfWZ1bmN0aW9uIGwocSx1KXtsZXQgeD11Lm5vZGUubmFtZS5zcGxpdCgiLyIpO3JldHVybiBwKHEseFt4Lmxlbmd0aC0xXSx1LG51bGwpfWZ1bmN0aW9uIHAocSx1LAp4LEEpe2xldCB5PWYuQ2xhc3MuQW5ub3RhdGlvbi5MQUJFTDtBJiYoeSs9IiAiK0EpO3E9cS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIseSkuYXR0cigiZHkiLCIuMzVlbSIpLmF0dHIoInRleHQtYW5jaG9yIix4LmlzSW4/ImVuZCI6InN0YXJ0IikudGV4dCh1KTtyZXR1cm4gYi5ncmFwaC5zY2VuZS5ub2RlLmVuZm9yY2VMYWJlbFdpZHRoKHEsLTEpfWZ1bmN0aW9uIG0ocSx1LHgsQSl7cS5vbigibW91c2VvdmVyIix5PT57QS5maXJlKCJhbm5vdGF0aW9uLWhpZ2hsaWdodCIse25hbWU6eS5ub2RlLm5hbWUsaG9zdE5hbWU6dS5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW91dCIseT0+e0EuZmlyZSgiYW5ub3RhdGlvbi11bmhpZ2hsaWdodCIse25hbWU6eS5ub2RlLm5hbWUsaG9zdE5hbWU6dS5ub2RlLm5hbWV9KX0pLm9uKCJjbGljayIseT0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO0EuZmlyZSgiYW5ub3RhdGlvbi1zZWxlY3QiLHtuYW1lOnkubm9kZS5uYW1lLGhvc3ROYW1lOnUubm9kZS5uYW1lfSl9KTsKaWYoeC5hbm5vdGF0aW9uVHlwZSE9PWQucmVuZGVyLkFubm90YXRpb25UeXBlLlNVTU1BUlkmJnguYW5ub3RhdGlvblR5cGUhPT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5DT05TVEFOVClxLm9uKCJjb250ZXh0bWVudSIsZi5jb250ZXh0bWVudS5nZXRNZW51KEEsZi5ub2RlLmdldENvbnRleHRNZW51KHgubm9kZSxBKSkpfWZ1bmN0aW9uIG4ocSx1LHgsQSl7bGV0IHk9ZC5sYXlvdXQuY29tcHV0ZUNYUG9zaXRpb25PZk5vZGVTaGFwZSh1KTt4LnJlbmRlck5vZGVJbmZvJiZ4LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuRUxMSVBTSVMmJmYubm9kZS5zdHlsaXplKHEseC5yZW5kZXJOb2RlSW5mbyxBLGYuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKTt4LmFubm90YXRpb25UeXBlPT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWSYmKHgud2lkdGgrPTEwKTtxLnNlbGVjdCgidGV4dC4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5MQUJFTCkudHJhbnNpdGlvbigpLmF0dHIoIngiLAp5K3guZHgrKHguaXNJbj8tMToxKSooeC53aWR0aC8yK3gubGFiZWxPZmZzZXQpKS5hdHRyKCJ5Iix1LnkreC5keSk7cS5zZWxlY3QoInVzZS5zdW1tYXJ5IikudHJhbnNpdGlvbigpLmF0dHIoIngiLHkreC5keC0zKS5hdHRyKCJ5Iix1LnkreC5keS02KTtmLnBvc2l0aW9uRWxsaXBzZShxLnNlbGVjdCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLk5PREUrIiBlbGxpcHNlIikseSt4LmR4LHUueSt4LmR5LHgud2lkdGgseC5oZWlnaHQpO2YucG9zaXRpb25SZWN0KHEuc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uTk9ERSsiIHJlY3QiKSx5K3guZHgsdS55K3guZHkseC53aWR0aCx4LmhlaWdodCk7Zi5wb3NpdGlvblJlY3QocS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKyIgdXNlIikseSt4LmR4LHUueSt4LmR5LHgud2lkdGgseC5oZWlnaHQpO3Euc2VsZWN0KCJwYXRoLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLkVER0UpLnRyYW5zaXRpb24oKS5hdHRyKCJkIix3PT4Ke3c9dy5wb2ludHMubWFwKEM9Pih7eDpDLmR4K3kseTpDLmR5K3UueX0pKTtyZXR1cm4gZi5lZGdlLmludGVycG9sYXRlKHcpfSl9aC5idWlsZEdyb3VwPWZ1bmN0aW9uKHEsdSx4LEEpe3E9cS5zZWxlY3RBbGwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzfSkuZGF0YSh1Lmxpc3QseT0+eS5ub2RlLm5hbWUpO3EuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJkYXRhLW5hbWUiLHk9Pnkubm9kZS5uYW1lKS5lYWNoKGZ1bmN0aW9uKHkpe2xldCB3PWQzLnNlbGVjdCh0aGlzKTtBLmFkZEFubm90YXRpb25Hcm91cCh5LHgsdyk7bGV0IEM9Zi5DbGFzcy5Bbm5vdGF0aW9uLkVER0UsRz15LnJlbmRlck1ldGFlZGdlSW5mbyYmeS5yZW5kZXJNZXRhZWRnZUluZm8ubWV0YWVkZ2U7RyYmIUcubnVtUmVndWxhckVkZ2VzJiYoQys9IiAiK2YuQ2xhc3MuQW5ub3RhdGlvbi5DT05UUk9MX0VER0UpO0cmJkcubnVtUmVmRWRnZXMmJihDKz0iICIrZi5DbGFzcy5FZGdlLlJFRl9MSU5FKTsKZi5lZGdlLmFwcGVuZEVkZ2Uodyx5LEEsQyk7eS5hbm5vdGF0aW9uVHlwZSE9PWQucmVuZGVyLkFubm90YXRpb25UeXBlLkVMTElQU0lTPyhsKHcseSksdCh3LHkpKTpwKHcseS5ub2RlLm5hbWUseSxmLkNsYXNzLkFubm90YXRpb24uRUxMSVBTSVMpfSkubWVyZ2UocSkuYXR0cigiY2xhc3MiLHk9PmYuQ2xhc3MuQW5ub3RhdGlvbi5HUk9VUCsiICIrayh5LmFubm90YXRpb25UeXBlKSsiICIrZi5ub2RlLm5vZGVDbGFzcyh5KSkuZWFjaChmdW5jdGlvbih5KXtsZXQgdz1kMy5zZWxlY3QodGhpcyk7bih3LHgseSxBKTt5LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuRUxMSVBTSVMmJm0odyx4LHksQSl9KTtxLmV4aXQoKS5lYWNoKGZ1bmN0aW9uKHkpe2xldCB3PWQzLnNlbGVjdCh0aGlzKTtBLnJlbW92ZUFubm90YXRpb25Hcm91cCh5LHgsdyl9KS5yZW1vdmUoKTtyZXR1cm4gcX19KShmLmFubm90YXRpb258fChmLmFubm90YXRpb249e30pKX0pKGQuc2NlbmV8fAooZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vY29sb3JzLmpzCihmdW5jdGlvbihiKXtiLkNPTE9SUz1be25hbWU6Ikdvb2dsZSBCbHVlIixjb2xvcjoiIzQxODRmMyIsYWN0aXZlOiIjM2E1M2M1IixkaXNhYmxlZDoiI2NhZDhmYyJ9LHtuYW1lOiJHb29nbGUgUmVkIixjb2xvcjoiI2RiNDQzNyIsYWN0aXZlOiIjOGYyYTBjIixkaXNhYmxlZDoiI2U4YzZjMSJ9LHtuYW1lOiJHb29nbGUgWWVsbG93Iixjb2xvcjoiI2Y0YjQwMCIsYWN0aXZlOiIjZGI5MjAwIixkaXNhYmxlZDoiI2Y3ZThiMCJ9LHtuYW1lOiJHb29nbGUgR3JlZW4iLGNvbG9yOiIjMGY5ZDU4IixhY3RpdmU6IiM0ODgwNDYiLGRpc2FibGVkOiIjYzJlMWNjIn0se25hbWU6IlB1cnBsZSIsY29sb3I6IiNhYTQ2YmIiLGFjdGl2ZToiIzVjMTM5OCIsZGlzYWJsZWQ6IiNkN2JjZTYifSx7bmFtZToiVGVhbCIsY29sb3I6IiMwMGFiYzAiLGFjdGl2ZToiIzQ3ODI4ZSIsZGlzYWJsZWQ6IiNjMmVhZjIifSx7bmFtZToiRGVlcCBPcmFuZ2UiLGNvbG9yOiIjZmY2ZjQyIixhY3RpdmU6IiNjYTRhMDYiLApkaXNhYmxlZDoiI2YyY2JiYSJ9LHtuYW1lOiJMaW1lIixjb2xvcjoiIzlkOWMyMyIsYWN0aXZlOiIjN2Y3NzFkIixkaXNhYmxlZDoiI2YxZjRjMiJ9LHtuYW1lOiJJbmRpZ28iLGNvbG9yOiIjNWI2YWJmIixhY3RpdmU6IiMzZTQ3YTkiLGRpc2FibGVkOiIjYzVjOGU4In0se25hbWU6IlBpbmsiLGNvbG9yOiIjZWY2MTkxIixhY3RpdmU6IiNjYTFjNjAiLGRpc2FibGVkOiIjZTliOWNlIn0se25hbWU6IkRlZXAgVGVhbCIsY29sb3I6IiMwMDc4NmEiLGFjdGl2ZToiIzJiNGY0MyIsZGlzYWJsZWQ6IiNiZWRlZGEifSx7bmFtZToiRGVlcCBQaW5rIixjb2xvcjoiI2MxMTc1YSIsYWN0aXZlOiIjNzUwODRmIixkaXNhYmxlZDoiI2RlOGNhZSJ9LHtuYW1lOiJHcmF5Iixjb2xvcjoiIzlFOUU5RSIsYWN0aXZlOiIjNDI0MjQyIixkaXNhYmxlZDoiRjVGNUY1In1dLnJlZHVjZSgoZCxmKT0+e2RbZi5uYW1lXT1mO3JldHVybiBkfSx7fSk7Yi5PUF9HUk9VUF9DT0xPUlM9W3tjb2xvcjoiR29vZ2xlIFJlZCIsCmdyb3VwczoiZ2VuX2xlZ2FjeV9vcHMgbGVnYWN5X29wcyBsZWdhY3lfZmxvZ3NfaW5wdXQgbGVnYWN5X2ltYWdlX2lucHV0IGxlZ2FjeV9pbnB1dF9leGFtcGxlX2lucHV0IGxlZ2FjeV9zZXF1ZW5jZV9pbnB1dCBsZWdhY3lfc2V0aV9pbnB1dF9pbnB1dCIuc3BsaXQoIiAiKX0se2NvbG9yOiJEZWVwIE9yYW5nZSIsZ3JvdXBzOlsiY29uc3RhbnRfb3BzIl19LHtjb2xvcjoiSW5kaWdvIixncm91cHM6WyJzdGF0ZV9vcHMiXX0se2NvbG9yOiJQdXJwbGUiLGdyb3VwczpbIm5uX29wcyIsIm5uIl19LHtjb2xvcjoiR29vZ2xlIEdyZWVuIixncm91cHM6WyJtYXRoX29wcyJdfSx7Y29sb3I6IkxpbWUiLGdyb3VwczpbImFycmF5X29wcyJdfSx7Y29sb3I6IlRlYWwiLGdyb3VwczpbImNvbnRyb2xfZmxvd19vcHMiLCJkYXRhX2Zsb3dfb3BzIl19LHtjb2xvcjoiUGluayIsZ3JvdXBzOlsic3VtbWFyeV9vcHMiXX0se2NvbG9yOiJEZWVwIFBpbmsiLGdyb3VwczpbImlvX29wcyJdfV0ucmVkdWNlKChkLApmKT0+e2YuZ3JvdXBzLmZvckVhY2goZnVuY3Rpb24oaCl7ZFtoXT1mLmNvbG9yfSk7cmV0dXJuIGR9LHt9KX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vY29tbW9uLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2YuT1BfR1JBUEg9Im9wX2dyYXBoIjtmLkNPTkNFUFRVQUxfR1JBUEg9ImNvbmNlcHR1YWxfZ3JhcGgiO2YuUFJPRklMRT0icHJvZmlsZSJ9KShkLlNlbGVjdGlvblR5cGV8fChkLlNlbGVjdGlvblR5cGU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2NvbnRleHRtZW51LmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpeyhmdW5jdGlvbihoKXtmdW5jdGlvbiBrKHQpe2xldCBsPTAscD0wO2Zvcig7dCYmMDw9dC5vZmZzZXRMZWZ0JiYwPD10Lm9mZnNldFRvcDspbCs9dC5vZmZzZXRMZWZ0LXQuc2Nyb2xsTGVmdCxwKz10Lm9mZnNldFRvcC10LnNjcm9sbFRvcCx0PXQub2Zmc2V0UGFyZW50O3JldHVybntsZWZ0OmwsdG9wOnB9fWguZ2V0TWVudT1mdW5jdGlvbih0LGwpe2NvbnN0IHA9dC5nZXRDb250ZXh0TWVudSgpLG09ZDMuc2VsZWN0KHQuZ2V0Q29udGV4dE1lbnUoKSk7cmV0dXJuIGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSh5KXt5JiZ5LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKHApfHwobS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKSxkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdSx7Y2FwdHVyZTohMH0pKX1sZXQgeD1kMy5ldmVudDtjb25zdCBBPWsodCk7bS5zdHlsZSgiZGlzcGxheSIsImJsb2NrIikuc3R5bGUoImxlZnQiLAp4LmNsaWVudFgtQS5sZWZ0KzErInB4Iikuc3R5bGUoInRvcCIseC5jbGllbnRZLUEudG9wKzErInB4Iik7eC5wcmV2ZW50RGVmYXVsdCgpO3guc3RvcFByb3BhZ2F0aW9uKCk7ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHUse2NhcHR1cmU6ITB9KTttLmh0bWwoIiIpO20uYXBwZW5kKCJ1bCIpLnNlbGVjdEFsbCgibGkiKS5kYXRhKGwpLmVudGVyKCkuYXBwZW5kKCJsaSIpLm9uKCJjbGljayIseT0+e3kuYWN0aW9uKHRoaXMsbixxKTt1KCl9KS5odG1sKGZ1bmN0aW9uKHkpe3JldHVybiB5LnRpdGxlKG4pfSl9fX0pKGYuY29udGV4dG1lbnV8fChmLmNvbnRleHRtZW51PXt9KSl9KShkLnNjZW5lfHwoZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vZWRnZS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXsoZnVuY3Rpb24oaCl7ZnVuY3Rpb24gayh5KXtyZXR1cm4geS52K2QuRURHRV9LRVlfREVMSU0reS53fWZ1bmN0aW9uIHQoeSx3KXt3PXcuZ2V0Tm9kZUJ5TmFtZSh5LnYpO2lmKG51bGw9PXcub3V0cHV0U2hhcGVzfHxfLmlzRW1wdHkody5vdXRwdXRTaGFwZXMpKXJldHVybiBudWxsO3k9dy5vdXRwdXRTaGFwZXNbeS5vdXRwdXRUZW5zb3JLZXldO3JldHVybiBudWxsPT15P251bGw6MD09PXkubGVuZ3RoPyJzY2FsYXIiOnkubWFwKEM9Pi0xPT09Qz8iPyI6Qykuam9pbigiXHUwMGQ3Iil9ZnVuY3Rpb24gbCh5LHcpe3JldHVybiB3LmVkZ2VMYWJlbEZ1bmN0aW9uP3cuZWRnZUxhYmVsRnVuY3Rpb24oeSx3KToxPHkuYmFzZUVkZ2VMaXN0Lmxlbmd0aD95LmJhc2VFZGdlTGlzdC5sZW5ndGgrIiB0ZW5zb3JzIjp0KHkuYmFzZUVkZ2VMaXN0WzBdLHcpfWZ1bmN0aW9uIHAoeSx3LEMpe2NvbnN0IEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGIuZ3JhcGguc2NlbmUuU1ZHX05BTUVTUEFDRSwKInBhdGgiKTtmb3IobGV0IEQ9MTtEPHkubGVuZ3RoO0QrKylpZihHLnNldEF0dHJpYnV0ZSgiZCIsQyh5LnNsaWNlKDAsRCkpKSxHLmdldFRvdGFsTGVuZ3RoKCk+dylyZXR1cm4gRC0xO3JldHVybiB5Lmxlbmd0aC0xfWZ1bmN0aW9uIG0oeSx3LEMpe3ZhciBHPWQzLmxpbmUoKS54KE49Pk4ueCkueShOPT5OLnkpLEQ9ZDMuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJwYXRoIikpLmF0dHIoImQiLEcoeSkpLEI9K3cuYXR0cigibWFya2VyV2lkdGgiKSxJPXcuYXR0cigidmlld0JveCIpLnNwbGl0KCIgIikubWFwKE51bWJlcik7ST1JWzJdLUlbMF07dz0rdy5hdHRyKCJyZWZYIik7RD1ELm5vZGUoKTtpZihDKXJldHVybiBCKj0xLXcvSSxDPUQuZ2V0UG9pbnRBdExlbmd0aChCKSxHPXAoeSxCLEcpLHlbRy0xXT17eDpDLngseTpDLnl9LHkuc2xpY2UoRy0xKTtDPTEtdy9JO0I9RC5nZXRUb3RhbExlbmd0aCgpLUIqQztDPQpELmdldFBvaW50QXRMZW5ndGgoQik7Rz1wKHksQixHKTt5W0ddPXt4OkMueCx5OkMueX07cmV0dXJuIHkuc2xpY2UoMCxHKzEpfWZ1bmN0aW9uIG4oeSx3LEMsRyl7Rz1HfHxmLkNsYXNzLkVkZ2UuTElORTt3LmxhYmVsJiZ3LmxhYmVsLnN0cnVjdHVyYWwmJihHKz0iICIrZi5DbGFzcy5FZGdlLlNUUlVDVFVSQUwpO3cubGFiZWwmJncubGFiZWwubWV0YWVkZ2UmJncubGFiZWwubWV0YWVkZ2UubnVtUmVmRWRnZXMmJihHKz0iICIrZi5DbGFzcy5FZGdlLlJFRkVSRU5DRV9FREdFKTtDLmhhbmRsZUVkZ2VTZWxlY3RlZCYmKEcrPSIgIitmLkNsYXNzLkVkZ2UuU0VMRUNUQUJMRSk7bGV0IEQ9InBhdGhfIitrKHcpO2lmKEMucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKXZhciBCPUMucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKHcsRyk7ZWxzZSBCPTEsbnVsbCE9dy5sYWJlbCYmbnVsbCE9dy5sYWJlbC5tZXRhZWRnZSYmKEI9dy5sYWJlbC5tZXRhZWRnZS50b3RhbFNpemUpLApCPUMucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZShCKTtHPXkuYXBwZW5kKCJwYXRoIikuYXR0cigiaWQiLEQpLmF0dHIoImNsYXNzIixHKS5zdHlsZSgic3Ryb2tlLXdpZHRoIixCKyJweCIpO3cubGFiZWwmJncubGFiZWwubWV0YWVkZ2UmJih3LmxhYmVsLm1ldGFlZGdlLm51bVJlZkVkZ2VzPyhCPWByZWZlcmVuY2UtYXJyb3doZWFkLSR7QShCKX1gLEcuc3R5bGUoIm1hcmtlci1zdGFydCIsYHVybCgjJHtCfSlgKSx3LmxhYmVsLnN0YXJ0TWFya2VySWQ9Qik6KEI9YGRhdGFmbG93LWFycm93aGVhZC0ke0EoQil9YCxHLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke0J9KWApLHcubGFiZWwuZW5kTWFya2VySWQ9QikpO251bGwhPXcubGFiZWwmJm51bGwhPXcubGFiZWwubWV0YWVkZ2UmJih3PWwody5sYWJlbC5tZXRhZWRnZSxDLnJlbmRlckhpZXJhcmNoeSksbnVsbCE9dyYmeS5hcHBlbmQoInRleHQiKS5hcHBlbmQoInRleHRQYXRoIikuYXR0cigieGxpbms6aHJlZiIsCiIjIitEKS5hdHRyKCJzdGFydE9mZnNldCIsIjUwJSIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigiZG9taW5hbnQtYmFzZWxpbmUiLCJjZW50cmFsIikudGV4dCh3KSl9ZnVuY3Rpb24gcSh5LHcsQyxHLEQpe0c9Qy5sYWJlbDtsZXQgQj1HLmFkam9pbmluZ01ldGFlZGdlLEk9Ry5wb2ludHM7eT15LnNoYWRvd1Jvb3Q7Qy5sYWJlbC5zdGFydE1hcmtlcklkJiYoST1tKEksZDMuc2VsZWN0KHkucXVlcnlTZWxlY3RvcigiIyIrQy5sYWJlbC5zdGFydE1hcmtlcklkKSksITApKTtDLmxhYmVsLmVuZE1hcmtlcklkJiYoST1tKEksZDMuc2VsZWN0KHkucXVlcnlTZWxlY3RvcigiIyIrQy5sYWJlbC5lbmRNYXJrZXJJZCkpLCExKSk7aWYoIUIpcmV0dXJuIGQzLmludGVycG9sYXRlKEQsaC5pbnRlcnBvbGF0ZShJKSk7bGV0IE49Qi5lZGdlR3JvdXAubm9kZSgpLmZpcnN0Q2hpbGQsTz1HLm1ldGFlZGdlLmluYm91bmQ7cmV0dXJuIGZ1bmN0aW9uKCl7bGV0IEg9Ti5nZXRQb2ludEF0TGVuZ3RoKE8/Ck4uZ2V0VG90YWxMZW5ndGgoKTowKS5tYXRyaXhUcmFuc2Zvcm0oTi5nZXRDVE0oKSkubWF0cml4VHJhbnNmb3JtKHcuZ2V0Q1RNKCkuaW52ZXJzZSgpKSxLPU8/MDpJLmxlbmd0aC0xO0lbS10ueD1ILng7SVtLXS55PUgueTtyZXR1cm4gaC5pbnRlcnBvbGF0ZShJKX19ZnVuY3Rpb24gdSh5LHcpe2QzLnNlbGVjdCh3KS5zZWxlY3QoInBhdGguIitmLkNsYXNzLkVkZ2UuTElORSkudHJhbnNpdGlvbigpLmF0dHJUd2VlbigiZCIsZnVuY3Rpb24oQyxHLEQpe3JldHVybiBxKHksdGhpcyxDLEcsRCl9KX1mdW5jdGlvbiB4KHksdyl7eS5jbGFzc2VkKCJmYWRlZCIsdy5sYWJlbC5pc0ZhZGVkT3V0KTt3PXcubGFiZWwubWV0YWVkZ2U7eS5zZWxlY3QoInBhdGguIitmLkNsYXNzLkVkZ2UuTElORSkuY2xhc3NlZCgiY29udHJvbC1kZXAiLHcmJiF3Lm51bVJlZ3VsYXJFZGdlcyl9aC5NSU5fRURHRV9XSURUSD0uNzU7aC5NQVhfRURHRV9XSURUSD0xMjtoLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRT0KZDMuc2NhbGVQb3coKS5leHBvbmVudCguMykuZG9tYWluKFsxLDVFNl0pLnJhbmdlKFtoLk1JTl9FREdFX1dJRFRILGguTUFYX0VER0VfV0lEVEhdKS5jbGFtcCghMCk7bGV0IEE9ZDMuc2NhbGVRdWFudGl6ZSgpLmRvbWFpbihbaC5NSU5fRURHRV9XSURUSCxoLk1BWF9FREdFX1dJRFRIXSkucmFuZ2UoWyJzbWFsbCIsIm1lZGl1bSIsImxhcmdlIiwieGxhcmdlIl0pO2guZ2V0RWRnZUtleT1rO2guYnVpbGRHcm91cD1mdW5jdGlvbih5LHcsQyl7bGV0IEc9W107Rz1fLnJlZHVjZSh3LmVkZ2VzKCksKEQsQik9PntsZXQgST13LmVkZ2UoQik7RC5wdXNoKHt2OkIudix3OkIudyxsYWJlbDpJfSk7cmV0dXJuIER9LEcpO3k9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKHksImciLGYuQ2xhc3MuRWRnZS5DT05UQUlORVIpLnNlbGVjdEFsbChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KS5kYXRhKEcsayk7eS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIixmLkNsYXNzLkVkZ2UuR1JPVVApLmF0dHIoImRhdGEtZWRnZSIsCmspLmVhY2goZnVuY3Rpb24oRCl7bGV0IEI9ZDMuc2VsZWN0KHRoaXMpO0QubGFiZWwuZWRnZUdyb3VwPUI7Qy5fZWRnZUdyb3VwSW5kZXhbayhEKV09QjtpZihDLmhhbmRsZUVkZ2VTZWxlY3RlZClCLm9uKCJjbGljayIsST0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO0MuZmlyZSgiZWRnZS1zZWxlY3QiLHtlZGdlRGF0YTpJLGVkZ2VHcm91cDpCfSl9KTtuKEIsRCxDKX0pLm1lcmdlKHkpLmVhY2goZnVuY3Rpb24oKXt1KEMsdGhpcyl9KS5lYWNoKGZ1bmN0aW9uKEQpe3goZDMuc2VsZWN0KHRoaXMpLEQsQyl9KTt5LmV4aXQoKS5lYWNoKEQ9PntkZWxldGUgQy5fZWRnZUdyb3VwSW5kZXhbayhEKV19KS5yZW1vdmUoKTtyZXR1cm4geX07aC5nZXRMYWJlbEZvckJhc2VFZGdlPXQ7aC5nZXRMYWJlbEZvckVkZ2U9bDtoLmFwcGVuZEVkZ2U9bjtoLmludGVycG9sYXRlPWQzLmxpbmUoKS5jdXJ2ZShkMy5jdXJ2ZUJhc2lzKS54KHk9PnkueCkueSh5PT55LnkpfSkoZi5lZGdlfHwoZi5lZGdlPQp7fSkpfSkoZC5zY2VuZXx8KGQuc2NlbmU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2V4dGVybnMuanMKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vZ3JhcGguanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKEgsSyxNLEwsUSl7cmV0dXJuKE0/TSsiLyI6IiIpKyhIKygidW5kZWZpbmVkIiE9PXR5cGVvZiBMJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBRPyJbIitMKyItIitRKyJdIjoiIyIpK0spfWZ1bmN0aW9uIGgoSCl7aWYoIUgpcmV0dXJuIG51bGw7Zm9yKGxldCBLPTA7SzxILmxlbmd0aDtLKyspe2xldCB7a2V5Ok0sdmFsdWU6TH09SFtLXTtpZigiX291dHB1dF9zaGFwZXMiPT09TSl7aWYoIUwubGlzdC5zaGFwZSlicmVhaztsZXQgUT1MLmxpc3Quc2hhcGUubWFwKFQ9PlQudW5rbm93bl9yYW5rP251bGw6bnVsbD09VC5kaW18fDE9PT1ULmRpbS5sZW5ndGgmJm51bGw9PVQuZGltWzBdLnNpemU/W106VC5kaW0ubWFwKFg9Plguc2l6ZSkpO0guc3BsaWNlKEssMSk7cmV0dXJuIFF9fXJldHVybiBudWxsfWZ1bmN0aW9uIGsoSCl7aWYoIUgpcmV0dXJuIG51bGw7Zm9yKGxldCBLPTA7SzxILmxlbmd0aDtLKyspaWYoIl9YbGFDbHVzdGVyIj09PQpIW0tdLmtleSlyZXR1cm4gSFtLXS52YWx1ZS5zfHxudWxsO3JldHVybiBudWxsfWZ1bmN0aW9uIHQoSCl7bGV0IEs9W107Xy5lYWNoKEgsTT0+e2xldCBMPSJeIj09PU1bMF07TCYmKE09TS5zdWJzdHJpbmcoMSkpO2xldCBRPU0sVD0iMCIsWD1NLm1hdGNoKC8oLiopOihcdys6XGQrKSQvKTtpZihYKVE9WFsxXSxUPVhbMl07ZWxzZSBpZihYPU0ubWF0Y2goLyguKik6KFxkKykkLykpUT1YWzFdLFQ9WFsyXTswIT09Sy5sZW5ndGgmJlE9PT1LW0subGVuZ3RoLTFdLm5hbWV8fEsucHVzaCh7bmFtZTpRLG91dHB1dFRlbnNvcktleTpULGlzQ29udHJvbERlcGVuZGVuY3k6TH0pfSk7cmV0dXJuIEt9ZnVuY3Rpb24gbChILEssTSxMLFEsVCl7SyE9PU0ubmFtZSYmSC5lZGdlcy5wdXNoKHt2OkssdzpNLm5hbWUsb3V0cHV0VGVuc29yS2V5Okwub3V0cHV0VGVuc29yS2V5LGlzQ29udHJvbERlcGVuZGVuY3k6TC5pc0NvbnRyb2xEZXBlbmRlbmN5LGlzUmVmZXJlbmNlRWRnZTohMD09PVEucmVmRWRnZXNbTS5vcCsKIiAiK1RdfSl9ZnVuY3Rpb24gcChILEssTSl7TT1NfHx7fTtsZXQgTD1uZXcgZ3JhcGhsaWIuR3JhcGgoTSk7TC5zZXRHcmFwaCh7bmFtZTpILHJhbmtkaXI6TS5yYW5rZGlyfHwiQlQiLHR5cGU6S30pO3JldHVybiBMfWZ1bmN0aW9uIG0oSCl7cmV0dXJuIGZ1bmN0aW9uKEspe2ZvcihsZXQgTT0wO008SC5sZW5ndGg7TSsrKXtsZXQgTD1uZXcgUmVnRXhwKEhbTV0pO2lmKCJzdHJpbmciPT09dHlwZW9mIEsub3AmJksub3AubWF0Y2goTCkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIG4oSCl7bGV0IEs9SC5zcGxpdChkLk5BTUVTUEFDRV9ERUxJTSk7cmV0dXJuIEgrZC5OQU1FU1BBQ0VfREVMSU0rIigiK0tbSy5sZW5ndGgtMV0rIikifWZ1bmN0aW9uIHEoSCxLKXtsZXQgTT17fSxMPXt9O0guc29ydCgpO2ZvcihsZXQgUT0wO1E8SC5sZW5ndGgtMTsrK1Epe2xldCBUPUhbUV07Xy5lYWNoKHgoVCkuc2xpY2UoMCwtMSksWD0+e0xbWF09ITB9KTtmb3IobGV0IFg9USsxO1g8SC5sZW5ndGg7KytYKXtsZXQgYWE9CkhbWF07aWYoXy5zdGFydHNXaXRoKGFhLFQpKXtpZihhYS5sZW5ndGg+VC5sZW5ndGgmJmFhLmNoYXJBdChULmxlbmd0aCk9PT1kLk5BTUVTUEFDRV9ERUxJTSl7TVtUXT1uKFQpO2JyZWFrfX1lbHNlIGJyZWFrfX1fLmVhY2goSyxRPT57USBpbiBMJiYoTVtRXT1uKFEpKX0pO3JldHVybiBNfWZ1bmN0aW9uIHUoSCl7bGV0IEs9SC5ub2RlcygpLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gSC5uZWlnaGJvcnMoTSkubGVuZ3RofSk7Sy5zb3J0KCk7cmV0dXJuIEt9ZnVuY3Rpb24geChILEspe2xldCBNPVtdLEw9SC5pbmRleE9mKGQuTkFNRVNQQUNFX0RFTElNKTtmb3IoOzA8PUw7KU0ucHVzaChILnN1YnN0cmluZygwLEwpKSxMPUguaW5kZXhPZihkLk5BTUVTUEFDRV9ERUxJTSxMKzEpO0smJihLPUtbSF0pJiZNLnB1c2goSyk7TS5wdXNoKEgpO3JldHVybiBNfWQuTkFNRVNQQUNFX0RFTElNPSIvIjtkLlJPT1RfTkFNRT0iX19yb290X18iO2QuRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWD0KIl9fZnVuY3Rpb25fbGlicmFyeV9fIjtkLkxBUkdFX0FUVFJTX0tFWT0iX3Rvb19sYXJnZV9hdHRycyI7ZC5MSU1JVF9BVFRSX1NJWkU9MTAyNDtkLkVER0VfS0VZX0RFTElNPSItLSI7bGV0IEE7KGZ1bmN0aW9uKEgpe0hbSC5GVUxMPTBdPSJGVUxMIjtIW0guRU1CRURERUQ9MV09IkVNQkVEREVEIjtIW0guTUVUQT0yXT0iTUVUQSI7SFtILlNFUklFUz0zXT0iU0VSSUVTIjtIW0guQ09SRT00XT0iQ09SRSI7SFtILlNIQURPVz01XT0iU0hBRE9XIjtIW0guQlJJREdFPTZdPSJCUklER0UiO0hbSC5FREdFPTddPSJFREdFIn0pKEE9ZC5HcmFwaFR5cGV8fChkLkdyYXBoVHlwZT17fSkpO2xldCB5OyhmdW5jdGlvbihIKXtIW0guTUVUQT0wXT0iTUVUQSI7SFtILk9QPTFdPSJPUCI7SFtILlNFUklFUz0yXT0iU0VSSUVTIjtIW0guQlJJREdFPTNdPSJCUklER0UiO0hbSC5FTExJUFNJUz00XT0iRUxMSVBTSVMifSkoeT1kLk5vZGVUeXBlfHwoZC5Ob2RlVHlwZT17fSkpO2xldCB3OyhmdW5jdGlvbihIKXtIW0guSU5DTFVERT0KMF09IklOQ0xVREUiO0hbSC5FWENMVURFPTFdPSJFWENMVURFIjtIW0guVU5TUEVDSUZJRUQ9Ml09IlVOU1BFQ0lGSUVEIn0pKHc9ZC5JbmNsdXNpb25UeXBlfHwoZC5JbmNsdXNpb25UeXBlPXt9KSk7KGZ1bmN0aW9uKEgpe0hbSC5HUk9VUD0wXT0iR1JPVVAiO0hbSC5VTkdST1VQPTFdPSJVTkdST1VQIn0pKGQuU2VyaWVzR3JvdXBpbmdUeXBlfHwoZC5TZXJpZXNHcm91cGluZ1R5cGU9e30pKTtjbGFzcyBDe2NvbnN0cnVjdG9yKCl7dGhpcy5ub2Rlcz17fTt0aGlzLmVkZ2VzPVtdfX1kLlNsaW1HcmFwaD1DO2NsYXNzIEd7Y29uc3RydWN0b3IoSCl7dGhpcy50eXBlPXkuRUxMSVBTSVM7dGhpcy5pc0dyb3VwTm9kZT0hMTt0aGlzLmNhcmRpbmFsaXR5PTE7dGhpcy5zdGF0cz10aGlzLnBhcmVudE5vZGU9bnVsbDt0aGlzLnNldE51bU1vcmVOb2RlcyhIKTt0aGlzLmluY2x1ZGU9dy5VTlNQRUNJRklFRH1zZXROdW1Nb3JlTm9kZXMoSCl7dGhpcy5udW1Nb3JlTm9kZXM9SDt0aGlzLm5hbWU9CiIuLi4gIitIKyIgbW9yZSJ9fWQuRWxsaXBzaXNOb2RlSW1wbD1HO2NsYXNzIER7Y29uc3RydWN0b3IoSCl7dGhpcy5vcD1ILm9wO3RoaXMubmFtZT1ILm5hbWU7dGhpcy5kZXZpY2U9SC5kZXZpY2U7dGhpcy5hdHRyPUguYXR0cjt0aGlzLmlucHV0cz10KEguaW5wdXQpO3RoaXMub3V0cHV0U2hhcGVzPWgoSC5hdHRyKTt0aGlzLnhsYUNsdXN0ZXI9ayhILmF0dHIpO3RoaXMuY29tcGF0aWJsZT0hMTt0aGlzLnR5cGU9eS5PUDt0aGlzLmlzR3JvdXBOb2RlPSExO3RoaXMuY2FyZGluYWxpdHk9MTt0aGlzLmluRW1iZWRkaW5ncz1bXTt0aGlzLm91dEVtYmVkZGluZ3M9W107dGhpcy5wYXJlbnROb2RlPW51bGw7dGhpcy5pbmNsdWRlPXcuVU5TUEVDSUZJRUQ7dGhpcy5vd25pbmdTZXJpZXM9bnVsbH19ZC5PcE5vZGVJbXBsPUQ7ZC5jcmVhdGVNZXRhbm9kZT1mdW5jdGlvbihILEs9e30pe3JldHVybiBuZXcgSShILEspfTtkLmpvaW5TdGF0c0luZm9XaXRoR3JhcGg9ZnVuY3Rpb24oSCxLLApNKXtfLmVhY2goSC5ub2RlcyxMPT57TC5zdGF0cz1udWxsfSk7Xy5lYWNoKEsuZGV2X3N0YXRzLEw9PntNJiYhTVtMLmRldmljZV18fF8uZWFjaChMLm5vZGVfc3RhdHMsUT0+e2xldCBUPVEubm9kZV9uYW1lIGluIEgubm9kZXM/US5ub2RlX25hbWU6bihRLm5vZGVfbmFtZSk7aWYoVCBpbiBILm5vZGVzKXt2YXIgWD0wO1EubWVtb3J5JiZfLmVhY2goUS5tZW1vcnksbGE9PntsYS50b3RhbF9ieXRlcyYmKDA8bGEudG90YWxfYnl0ZXM/WCs9TnVtYmVyKGxhLnRvdGFsX2J5dGVzKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgbWVtb3J5IGFsbG9jYXRpb24gZm9yICIrVCkpfSk7dmFyIGFhPW51bGw7US5vdXRwdXQmJihhYT1fLm1hcChRLm91dHB1dCxsYT0+Xy5tYXAobGEudGVuc29yX2Rlc2NyaXB0aW9uLnNoYXBlLmRpbSxaPT5OdW1iZXIoWi5zaXplKSkpKTtILm5vZGVzW1RdLmRldmljZT1MLmRldmljZTtudWxsPT1ILm5vZGVzW1RdLnN0YXRzJiYoSC5ub2Rlc1tUXS5zdGF0cz0KbmV3IEIoYWEpKTtILm5vZGVzW1RdLnN0YXRzLmFkZEJ5dGVzQWxsb2NhdGlvbihYKTtRLmFsbF9lbmRfcmVsX21pY3JvcyYmKDA8US5hbGxfZW5kX3JlbF9taWNyb3M/SC5ub2Rlc1tUXS5zdGF0cy5hZGRFeGVjdXRpb25UaW1lKFEuYWxsX3N0YXJ0X21pY3JvcyxRLmFsbF9zdGFydF9taWNyb3MrUS5hbGxfZW5kX3JlbF9taWNyb3MpOmNvbnNvbGUubG9nKCJpZ25vcmluZyBuZWdhdGl2ZSBydW50aW1lIGZvciAiK1QpKX19KX0pfTtjbGFzcyBCe2NvbnN0cnVjdG9yKEgpe3RoaXMudG90YWxCeXRlcz0wO3RoaXMub3V0cHV0U2l6ZT1IfWFkZEV4ZWN1dGlvblRpbWUoSCxLKXt0aGlzLnN0YXJ0VGltZT1udWxsIT10aGlzLnN0YXJ0VGltZT9NYXRoLm1pbih0aGlzLnN0YXJ0VGltZSxIKTpIO3RoaXMuZW5kVGltZT1udWxsIT10aGlzLmVuZFRpbWU/TWF0aC5tYXgodGhpcy5lbmRUaW1lLEspOkt9YWRkQnl0ZXNBbGxvY2F0aW9uKEgpe3RoaXMudG90YWxCeXRlcz1udWxsIT10aGlzLnRvdGFsQnl0ZXM/Ck1hdGgubWF4KHRoaXMudG90YWxCeXRlcyxIKTpIfWNvbWJpbmUoSCl7bnVsbCE9SC50b3RhbEJ5dGVzJiYodGhpcy50b3RhbEJ5dGVzKz1ILnRvdGFsQnl0ZXMpO251bGwhPUguZ2V0VG90YWxNaWNyb3MoKSYmdGhpcy5hZGRFeGVjdXRpb25UaW1lKEguc3RhcnRUaW1lLEguZW5kVGltZSl9Z2V0VG90YWxNaWNyb3MoKXtyZXR1cm4gbnVsbD09dGhpcy5zdGFydFRpbWV8fG51bGw9PXRoaXMuZW5kVGltZT9udWxsOnRoaXMuZW5kVGltZS10aGlzLnN0YXJ0VGltZX19ZC5Ob2RlU3RhdHM9QjtjbGFzcyBJe2NvbnN0cnVjdG9yKEgsSz17fSl7dGhpcy5uYW1lPUg7dGhpcy50eXBlPXkuTUVUQTt0aGlzLmRlcHRoPTE7dGhpcy5pc0dyb3VwTm9kZT0hMDt0aGlzLmNhcmRpbmFsaXR5PTA7dGhpcy5tZXRhZ3JhcGg9cChILEEuTUVUQSxLKTt0aGlzLmJyaWRnZWdyYXBoPW51bGw7dGhpcy5vcEhpc3RvZ3JhbT17fTt0aGlzLmRldmljZUhpc3RvZ3JhbT17fTt0aGlzLnhsYUNsdXN0ZXJIaXN0b2dyYW09Cnt9O3RoaXMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbT17Y29tcGF0aWJsZTowLGluY29tcGF0aWJsZTowfTt0aGlzLnBhcmVudE5vZGU9dGhpcy50ZW1wbGF0ZUlkPW51bGw7dGhpcy5oYXNOb25Db250cm9sRWRnZXM9ITE7dGhpcy5pbmNsdWRlPXcuVU5TUEVDSUZJRUQ7dGhpcy5hc3NvY2lhdGVkRnVuY3Rpb249IiJ9Z2V0Rmlyc3RDaGlsZCgpe3JldHVybiB0aGlzLm1ldGFncmFwaC5ub2RlKHRoaXMubWV0YWdyYXBoLm5vZGVzKClbMF0pfWdldFJvb3RPcCgpe2xldCBIPXRoaXMubmFtZS5zcGxpdCgiLyIpO3JldHVybiB0aGlzLm1ldGFncmFwaC5ub2RlKHRoaXMubmFtZSsiLygiK0hbSC5sZW5ndGgtMV0rIikiKX1sZWF2ZXMoKXtsZXQgSD1bXSxLPVt0aGlzXSxNO2Zvcig7Sy5sZW5ndGg7KXtsZXQgTD1LLnNoaWZ0KCk7TC5pc0dyb3VwTm9kZT8oTT1MLm1ldGFncmFwaCxfLmVhY2goTS5ub2RlcygpLFE9PksucHVzaChNLm5vZGUoUSkpKSk6SC5wdXNoKEwubmFtZSl9cmV0dXJuIEh9fQpkLk1ldGFub2RlSW1wbD1JO2QuY3JlYXRlTWV0YWVkZ2U9ZnVuY3Rpb24oSCxLKXtyZXR1cm4gbmV3IE4oSCxLKX07Y2xhc3MgTntjb25zdHJ1Y3RvcihILEspe3RoaXMudj1IO3RoaXMudz1LO3RoaXMuYmFzZUVkZ2VMaXN0PVtdO3RoaXMuaW5ib3VuZD1udWxsO3RoaXMudG90YWxTaXplPXRoaXMubnVtUmVmRWRnZXM9dGhpcy5udW1Db250cm9sRWRnZXM9dGhpcy5udW1SZWd1bGFyRWRnZXM9MH1hZGRCYXNlRWRnZShILEspe3RoaXMuYmFzZUVkZ2VMaXN0LnB1c2goSCk7SC5pc0NvbnRyb2xEZXBlbmRlbmN5P3RoaXMubnVtQ29udHJvbEVkZ2VzKz0xOnRoaXMubnVtUmVndWxhckVkZ2VzKz0xO0guaXNSZWZlcmVuY2VFZGdlJiYodGhpcy5udW1SZWZFZGdlcys9MSk7dGhpcy50b3RhbFNpemUrPU4uY29tcHV0ZVNpemVPZkVkZ2UoSCxLKTtLLm1heE1ldGFFZGdlU2l6ZT1NYXRoLm1heChLLm1heE1ldGFFZGdlU2l6ZSx0aGlzLnRvdGFsU2l6ZSl9c3RhdGljIGNvbXB1dGVTaXplT2ZFZGdlKEgsCkspe2xldCBNPUsubm9kZShILnYpO2lmKCFNLm91dHB1dFNoYXBlcylyZXR1cm4gMTtLLmhhc1NoYXBlSW5mbz0hMDtIPU9iamVjdC5rZXlzKE0ub3V0cHV0U2hhcGVzKS5tYXAoTD0+TS5vdXRwdXRTaGFwZXNbTF0pLm1hcChMPT5udWxsPT1MPzE6TC5yZWR1Y2UoKFEsVCk9PnstMT09PVQmJihUPTEpO3JldHVybiBRKlR9LDEpKTtyZXR1cm4gXy5zdW0oSCl9fWQuTWV0YWVkZ2VJbXBsPU47ZC5jcmVhdGVTZXJpZXNOb2RlPWZ1bmN0aW9uKEgsSyxNLEwsUSxUKXtyZXR1cm4gbmV3IE8oSCxLLE0sTCxRLFQpfTtkLmdldFNlcmllc05vZGVOYW1lPWY7Y2xhc3MgT3tjb25zdHJ1Y3RvcihILEssTSxMLFEsVCl7dGhpcy5uYW1lPVF8fGYoSCxLLE0pO3RoaXMudHlwZT15LlNFUklFUzt0aGlzLmhhc0xvb3A9ITE7dGhpcy5wcmVmaXg9SDt0aGlzLnN1ZmZpeD1LO3RoaXMuY2x1c3RlcklkPUw7dGhpcy5pZHM9W107dGhpcy5wYXJlbnQ9TTt0aGlzLmlzR3JvdXBOb2RlPSEwO3RoaXMuY2FyZGluYWxpdHk9CjA7dGhpcy5tZXRhZ3JhcGg9cChRLEEuU0VSSUVTLFQpO3RoaXMucGFyZW50Tm9kZT10aGlzLmJyaWRnZWdyYXBoPW51bGw7dGhpcy5kZXZpY2VIaXN0b2dyYW09e307dGhpcy54bGFDbHVzdGVySGlzdG9ncmFtPXt9O3RoaXMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbT17Y29tcGF0aWJsZTowLGluY29tcGF0aWJsZTowfTt0aGlzLmhhc05vbkNvbnRyb2xFZGdlcz0hMTt0aGlzLmluY2x1ZGU9dy5VTlNQRUNJRklFRH19ZC5EZWZhdWx0QnVpbGRQYXJhbXM9e2VuYWJsZUVtYmVkZGluZzohMCxpbkVtYmVkZGluZ1R5cGVzOlsiQ29uc3QiXSxvdXRFbWJlZGRpbmdUeXBlczpbIl5bYS16QS1aXStTdW1tYXJ5JCJdLHJlZkVkZ2VzOnsiQXNzaWduIDAiOiEwLCJBc3NpZ25BZGQgMCI6ITAsIkFzc2lnblN1YiAwIjohMCwiYXNzaWduIDAiOiEwLCJhc3NpZ25fYWRkIDAiOiEwLCJhc3NpZ25fc3ViIDAiOiEwLCJjb3VudF91cF90byAwIjohMCwiU2NhdHRlckFkZCAwIjohMCwiU2NhdHRlclN1YiAwIjohMCwKIlNjYXR0ZXJVcGRhdGUgMCI6ITAsInNjYXR0ZXJfYWRkIDAiOiEwLCJzY2F0dGVyX3N1YiAwIjohMCwic2NhdHRlcl91cGRhdGUgMCI6ITB9fTtkLmJ1aWxkPWZ1bmN0aW9uKEgsSyxNKXtsZXQgTD17fSxRPXt9LFQ9e30sWD1tKEsuaW5FbWJlZGRpbmdUeXBlcyksYWE9bShLLm91dEVtYmVkZGluZ1R5cGVzKSxsYT1bXSxaPUgubm9kZSxiYT1BcnJheShaLmxlbmd0aCk7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIk5vcm1hbGl6aW5nIG5hbWVzIiwzMCwoKT0+e2xldCBlYT1BcnJheShaLmxlbmd0aCksY2E9MDtjb25zdCBrYT1FYT0+e2xldCB2YT1uZXcgRChFYSk7aWYoWCh2YSkpcmV0dXJuIGxhLnB1c2godmEubmFtZSksTFt2YS5uYW1lXT12YTtpZihhYSh2YSkpcmV0dXJuIGxhLnB1c2godmEubmFtZSksUVt2YS5uYW1lXT12YSxfLmVhY2godmEuaW5wdXRzLHhhPT57eGE9eGEubmFtZTtUW3hhXT1UW3hhXXx8W107VFt4YV0ucHVzaCh2YSl9KSx2YTtlYVtjYV09CnZhO2JhW2NhXT12YS5uYW1lO2NhKys7cmV0dXJuIHZhfTtfLmVhY2goWixrYSk7Y29uc3QgWT1FYT0+e2NvbnN0IHZhPWQuRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCtFYS5zaWduYXR1cmUubmFtZTtrYSh7bmFtZTp2YSxpbnB1dDpbXSxkZXZpY2U6IiIsb3A6IiIsYXR0cjpbXX0pO2lmKEVhLnNpZ25hdHVyZS5pbnB1dF9hcmcpe2xldCB5YT0wO3ZhciB4YT1TYT0+e2thKHtuYW1lOnZhK2QuTkFNRVNQQUNFX0RFTElNK1NhLm5hbWUsaW5wdXQ6W10sZGV2aWNlOiIiLG9wOiJpbnB1dF9hcmciLGF0dHI6W3trZXk6IlQiLHZhbHVlOnt0eXBlOlNhLnR5cGV9fV19KS5mdW5jdGlvbklucHV0SW5kZXg9eWE7eWErK307RWEuc2lnbmF0dXJlLmlucHV0X2FyZy5uYW1lP3hhKEVhLnNpZ25hdHVyZS5pbnB1dF9hcmcpOl8uZWFjaChFYS5zaWduYXR1cmUuaW5wdXRfYXJnLHhhKX1sZXQgQWE9MDtjb25zdCBGYT17fTtFYS5zaWduYXR1cmUub3V0cHV0X2FyZyYmKHhhPXlhPT57RmFbdmErCmQuTkFNRVNQQUNFX0RFTElNK3lhLm5hbWVdPUFhO0FhKyt9LEVhLnNpZ25hdHVyZS5vdXRwdXRfYXJnLm5hbWU/eGEoRWEuc2lnbmF0dXJlLm91dHB1dF9hcmcpOl8uZWFjaChFYS5zaWduYXR1cmUub3V0cHV0X2FyZyx4YSkpO18uZWFjaChFYS5ub2RlX2RlZix5YT0+e3lhLm5hbWU9dmErIi8iK3lhLm5hbWU7InN0cmluZyI9PT10eXBlb2YgeWEuaW5wdXQmJih5YS5pbnB1dD1beWEuaW5wdXRdKTtjb25zdCBTYT1rYSh5YSk7Xy5pc051bWJlcihGYVt5YS5uYW1lXSkmJihTYS5mdW5jdGlvbk91dHB1dEluZGV4PUZhW3lhLm5hbWVdKTtfLmVhY2goU2EuaW5wdXRzLFhhPT57WGEubmFtZT12YStkLk5BTUVTUEFDRV9ERUxJTStYYS5uYW1lfSl9KX07SC5saWJyYXJ5JiZILmxpYnJhcnkuZnVuY3Rpb24mJl8uZWFjaChILmxpYnJhcnkuZnVuY3Rpb24sWSk7ZWEuc3BsaWNlKGNhKTtiYS5zcGxpY2UoY2EpO3JldHVybiBlYX0sTSkudGhlbihlYT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiQnVpbGRpbmcgdGhlIGRhdGEgc3RydWN0dXJlIiwKNzAsKCk9PntsZXQgY2E9cShiYSxsYSksa2E9bmV3IEM7Xy5lYWNoKGVhLFk9PntsZXQgRWE9Y2FbWS5uYW1lXXx8WS5uYW1lO2thLm5vZGVzW0VhXT1ZO1kubmFtZSBpbiBUJiYoWS5vdXRFbWJlZGRpbmdzPVRbWS5uYW1lXSxfLmVhY2goWS5vdXRFbWJlZGRpbmdzLHZhPT57dmEubmFtZT1jYVt2YS5uYW1lXXx8dmEubmFtZX0pKTtZLm5hbWU9RWF9KTtfLmVhY2goZWEsWT0+e18uZWFjaChZLmlucHV0cywoRWEsdmEpPT57bGV0IHhhPUVhLm5hbWU7aWYoeGEgaW4gTCl7RWE9TFt4YV07WS5pbkVtYmVkZGluZ3MucHVzaChFYSk7Zm9yKHZhciBBYSBvZiBFYS5pbnB1dHMpbChrYSxjYVtBYS5uYW1lXXx8QWEubmFtZSxZLEFhLEssdmEpfWVsc2UgaWYoeGEgaW4gUSl7QWE9UVt4YV07Zm9yKGxldCBGYSBvZiBBYS5pbnB1dHMpbChrYSxjYVtGYS5uYW1lXXx8RmEubmFtZSxZLEVhLEssdmEpfWVsc2UgbChrYSxjYVt4YV18fHhhLFksRWEsSyx2YSl9KX0pO18uZWFjaChMLFk9PntZLm5hbWU9CmNhW1kubmFtZV18fFkubmFtZX0pO3JldHVybiBrYX0sTSkpfTtkLmNyZWF0ZUdyYXBoPXA7ZC5nZXRTdHJpY3ROYW1lPW47ZC5oYXNTaW1pbGFyRGVncmVlU2VxdWVuY2U9ZnVuY3Rpb24oSCxLKXtIPXUoSCk7Sz11KEspO2ZvcihsZXQgTT0wO008SC5sZW5ndGg7TSsrKWlmKEhbTV0hPT1LW01dKXJldHVybiExO3JldHVybiEwfTtkLmdldEhpZXJhcmNoaWNhbFBhdGg9eDtkLmdldEluY2x1ZGVOb2RlQnV0dG9uU3RyaW5nPWZ1bmN0aW9uKEgpe3JldHVybiBIPT09Yi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU/IkFkZCB0byBtYWluIGdyYXBoIjoiUmVtb3ZlIGZyb20gbWFpbiBncmFwaCJ9O2QuZ2V0R3JvdXBTZXJpZXNOb2RlQnV0dG9uU3RyaW5nPWZ1bmN0aW9uKEgpe3JldHVybiBIPT09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA/IlVuZ3JvdXAgdGhpcyBzZXJpZXMgb2Ygbm9kZXMiOiJHcm91cCB0aGlzIHNlcmllcyBvZiBub2RlcyJ9O2QudG9nZ2xlTm9kZVNlcmllc0dyb3VwPQpmdW5jdGlvbihILEspe0hbS109SyBpbiBIJiZIW0tdIT09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA/Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA6Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUH19KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9oaWVyYXJjaHkuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaCh4LEEseSx3KXtBPXk/eC5pbkVkZ2VzKEEubmFtZSk6eC5vdXRFZGdlcyhBLm5hbWUpO18uZWFjaChBLEM9PntDPXguZWRnZShDKTsoQy5udW1SZWd1bGFyRWRnZXM/dy5yZWd1bGFyOncuY29udHJvbCkucHVzaChDKX0pfWZ1bmN0aW9uIGsoeCxBKXtjb25zdCB5PXt9O18uZWFjaChBLm5vZGVzLHc9PntsZXQgQz1kLmdldEhpZXJhcmNoaWNhbFBhdGgody5uYW1lKSxHPXgucm9vdDtHLmRlcHRoPU1hdGgubWF4KEMubGVuZ3RoLEcuZGVwdGgpO3lbdy5vcF18fCh5W3cub3BdPVtdKTt5W3cub3BdLnB1c2godyk7Zm9yKGxldCBCPTA7QjxDLmxlbmd0aDtCKyspe0cuZGVwdGg9TWF0aC5tYXgoRy5kZXB0aCxDLmxlbmd0aC1CKTtHLmNhcmRpbmFsaXR5Kz13LmNhcmRpbmFsaXR5O0cub3BIaXN0b2dyYW1bdy5vcF09KEcub3BIaXN0b2dyYW1bdy5vcF18fDApKzE7bnVsbCE9dy5kZXZpY2UmJihHLmRldmljZUhpc3RvZ3JhbVt3LmRldmljZV09CihHLmRldmljZUhpc3RvZ3JhbVt3LmRldmljZV18fDApKzEpO251bGwhPXcueGxhQ2x1c3RlciYmKEcueGxhQ2x1c3Rlckhpc3RvZ3JhbVt3LnhsYUNsdXN0ZXJdPShHLnhsYUNsdXN0ZXJIaXN0b2dyYW1bdy54bGFDbHVzdGVyXXx8MCkrMSk7dy5jb21wYXRpYmxlP0cuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxO18uZWFjaCh3LmluRW1iZWRkaW5ncyxOPT57Ti5jb21wYXRpYmxlP0cuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwKMCkrMX0pO18uZWFjaCh3Lm91dEVtYmVkZGluZ3MsTj0+e04uY29tcGF0aWJsZT9HLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Ry5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pO2lmKEI9PT1DLmxlbmd0aC0xKWJyZWFrO3ZhciBEPUNbQl07bGV0IEk9eC5ub2RlKEQpO0l8fChJPWQuY3JlYXRlTWV0YW5vZGUoRCx4LmdyYXBoT3B0aW9ucyksSS5wYXJlbnROb2RlPUcseC5zZXROb2RlKEQsSSksRy5tZXRhZ3JhcGguc2V0Tm9kZShELEkpLDA9PT1ELmluZGV4T2YoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmRy5uYW1lPT09Yi5ncmFwaC5ST09UX05BTUUmJihEPUQuc3Vic3RyaW5nKGIuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWC5sZW5ndGgpLHlbRF18fAooeVtEXT1bXSkseC5saWJyYXJ5RnVuY3Rpb25zW0RdPXtub2RlOkksdXNhZ2VzOnlbRF19LEkuYXNzb2NpYXRlZEZ1bmN0aW9uPUQpKTtHPUl9eC5zZXROb2RlKHcubmFtZSx3KTt3LnBhcmVudE5vZGU9RztHLm1ldGFncmFwaC5zZXROb2RlKHcubmFtZSx3KTtfLmVhY2gody5pbkVtYmVkZGluZ3MsZnVuY3Rpb24oQil7eC5zZXROb2RlKEIubmFtZSxCKTtCLnBhcmVudE5vZGU9d30pO18uZWFjaCh3Lm91dEVtYmVkZGluZ3MsZnVuY3Rpb24oQil7eC5zZXROb2RlKEIubmFtZSxCKTtCLnBhcmVudE5vZGU9d30pfSl9ZnVuY3Rpb24gdCh4LEEpe2xldCB5PXguZ2V0Tm9kZU1hcCgpLHc9W10sQz1bXSxHPShELEIpPT57bGV0IEk9MDtmb3IoO0Q7KUJbSSsrXT1ELm5hbWUsRD1ELnBhcmVudE5vZGU7cmV0dXJuIEktMX07Xy5lYWNoKEEuZWRnZXMsRD0+e3ZhciBCPUcoQS5ub2Rlc1tELnZdLHcpLEk9RyhBLm5vZGVzW0Qud10sQyk7aWYoLTEhPT1CJiYtMSE9PUkpe2Zvcig7d1tCXT09PUNbSV07KWlmKEItLSwKSS0tLDA+Qnx8MD5JKXRocm93IEVycm9yKCJObyBkaWZmZXJlbmNlIGZvdW5kIGJldHdlZW4gYW5jZXN0b3IgcGF0aHMuIik7dmFyIE49eVt3W0IrMV1dO0I9d1tCXTtJPUNbSV07dmFyIE89Ti5tZXRhZ3JhcGguZWRnZShCLEkpO098fChPPWQuY3JlYXRlTWV0YWVkZ2UoQixJKSxOLm1ldGFncmFwaC5zZXRFZGdlKEIsSSxPKSk7Ti5oYXNOb25Db250cm9sRWRnZXN8fEQuaXNDb250cm9sRGVwZW5kZW5jeXx8KE4uaGFzTm9uQ29udHJvbEVkZ2VzPSEwKTtPLmFkZEJhc2VFZGdlKEQseCl9fSl9ZnVuY3Rpb24gbCh4LEEseSx3LEMsRyl7bGV0IEQ9eC5tZXRhZ3JhcGg7Xy5lYWNoKEQubm9kZXMoKSxCPT57Qj1ELm5vZGUoQik7Qi50eXBlPT09Yi5ncmFwaC5Ob2RlVHlwZS5NRVRBJiZsKEIsQSx5LHcsQyxHKX0pO3g9cChEKTt4PShHP246bSkoeCxELEEuZ3JhcGhPcHRpb25zKTtfLmVhY2goeCxmdW5jdGlvbihCLEkpe2xldCBOPUIubWV0YWdyYXBoLm5vZGVzKCk7Xy5lYWNoKE4sTz0+CntPPUQubm9kZShPKTtPLm93bmluZ1Nlcmllc3x8KE8ub3duaW5nU2VyaWVzPUkpfSk7Ti5sZW5ndGg8dyYmIShCLm5hbWUgaW4gQykmJihDW0IubmFtZV09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCk7Qi5uYW1lIGluIEMmJkNbQi5uYW1lXT09PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVB8fChBLnNldE5vZGUoSSxCKSxELnNldE5vZGUoSSxCKSxfLmVhY2goTixPPT57bGV0IEg9RC5ub2RlKE8pO0IubWV0YWdyYXBoLnNldE5vZGUoTyxIKTtCLnBhcmVudE5vZGU9SC5wYXJlbnROb2RlO0IuY2FyZGluYWxpdHkrKztudWxsIT1ILmRldmljZSYmKEIuZGV2aWNlSGlzdG9ncmFtW0guZGV2aWNlXT0oQi5kZXZpY2VIaXN0b2dyYW1bSC5kZXZpY2VdfHwwKSsxKTtudWxsIT1ILnhsYUNsdXN0ZXImJihCLnhsYUNsdXN0ZXJIaXN0b2dyYW1bSC54bGFDbHVzdGVyXT0oQi54bGFDbHVzdGVySGlzdG9ncmFtW0gueGxhQ2x1c3Rlcl18fDApKzEpO0guY29tcGF0aWJsZT8KQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzE7Xy5lYWNoKEguaW5FbWJlZGRpbmdzLEs9PntLLmNvbXBhdGlibGU/Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KTtfLmVhY2goSC5vdXRFbWJlZGRpbmdzLEs9PntLLmNvbXBhdGlibGU/Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9CihCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSk7SC5wYXJlbnROb2RlPUI7eVtPXT1JO0QucmVtb3ZlTm9kZShPKX0pKX0pfWZ1bmN0aW9uIHAoeCl7cmV0dXJuIF8ucmVkdWNlKHgubm9kZXMoKSwoQSx5KT0+e3k9eC5ub2RlKHkpO2lmKHkudHlwZT09PWQuTm9kZVR5cGUuTUVUQSlyZXR1cm4gQTtsZXQgdz15Lm9wO3cmJihBW3ddPUFbd118fFtdLEFbd10ucHVzaCh5Lm5hbWUpKTtyZXR1cm4gQX0se30pfWZ1bmN0aW9uIG0oeCxBLHkpe2xldCB3PXt9O18uZWFjaCh4LGZ1bmN0aW9uKEMsRyl7aWYoISgxPj1DLmxlbmd0aCkpe3ZhciBEPXt9O18uZWFjaChDLGZ1bmN0aW9uKEIpe3ZhciBJPSIqIj09PUIuY2hhckF0KEIubGVuZ3RoLTEpLE49Qi5zcGxpdCgiLyIpLE89TltOLmxlbmd0aC0xXTtOPU4uc2xpY2UoMCxOLmxlbmd0aC0xKS5qb2luKCIvIik7dmFyIEg9Ty5tYXRjaCgvXihcRCopXyhcZCspJC8pO2xldCBLPSIiO0g/KE89SFsxXSxIPUhbMl0pOgooTz1JP08uc3Vic3RyKDAsTy5sZW5ndGgtMSk6TyxIPTAsSz1JPyIqIjoiIik7ST1kLmdldFNlcmllc05vZGVOYW1lKE8sSyxOKTtEW0ldPURbSV18fFtdO0I9ZC5jcmVhdGVTZXJpZXNOb2RlKE8sSyxOLCtILEIseSk7RFtJXS5wdXNoKEIpfSk7Xy5lYWNoKEQsZnVuY3Rpb24oQil7aWYoISgyPkIubGVuZ3RoKSl7Qi5zb3J0KGZ1bmN0aW9uKE4sTyl7cmV0dXJuK04uY2x1c3RlcklkLStPLmNsdXN0ZXJJZH0pO3ZhciBJPVtCWzBdXTtmb3IobGV0IE49MTtOPEIubGVuZ3RoO04rKyl7bGV0IE89QltOXTtPLmNsdXN0ZXJJZD09PUlbSS5sZW5ndGgtMV0uY2x1c3RlcklkKzE/SS5wdXNoKE8pOihxKEksdywrRyxBLHkpLEk9W09dKX1xKEksdywrRyxBLHkpfX0pfX0pO3JldHVybiB3fWZ1bmN0aW9uIG4oeCxBLHkpe2xldCB3PXt9O18uZWFjaCh4LGZ1bmN0aW9uKEMsRyl7aWYoISgxPj1DLmxlbmd0aCkpe3ZhciBEPXt9LEI9e307Xy5lYWNoKEMsZnVuY3Rpb24oTil7bGV0IE89IioiPT09Ck4uY2hhckF0KE4ubGVuZ3RoLTEpO3ZhciBIPU4uc3BsaXQoIi8iKTtsZXQgSz1IW0gubGVuZ3RoLTFdO0g9SC5zbGljZSgwLEgubGVuZ3RoLTEpLmpvaW4oIi8iKTtjb25zdCBNPS8oXGQrKS9nO3ZhciBMO2xldCBRLFQsWCxhYT0wO2Zvcig7TD1NLmV4ZWMoSyk7KSsrYWEsUT1LLnNsaWNlKDAsTC5pbmRleCksVD1MWzBdLEw9Sy5zbGljZShMLmluZGV4K0xbMF0ubGVuZ3RoKSxYPWQuZ2V0U2VyaWVzTm9kZU5hbWUoUSxMLEgpLERbWF09RFtYXSxEW1hdfHwoRFtYXT1kLmNyZWF0ZVNlcmllc05vZGUoUSxMLEgsK1QsTix5KSksRFtYXS5pZHMucHVzaChUKSxCW05dPUJbTl18fFtdLEJbTl0ucHVzaChbWCxUXSk7MT5hYSYmKFE9Tz9LLnN1YnN0cigwLEsubGVuZ3RoLTEpOkssVD0wLEw9Tz8iKiI6IiIsWD1kLmdldFNlcmllc05vZGVOYW1lKFEsTCxIKSxEW1hdPURbWF0sRFtYXXx8KERbWF09ZC5jcmVhdGVTZXJpZXNOb2RlKFEsTCxILCtULE4seSkpLERbWF0uaWRzLnB1c2goVCksQltOXT0KQltOXXx8W10sQltOXS5wdXNoKFtYLFRdKSl9KTt2YXIgST17fTtfLmVhY2goQixmdW5jdGlvbihOLE8pe04uc29ydChmdW5jdGlvbihNLEwpe3JldHVybiBEW0xbMF1dLmlkcy5sZW5ndGgtRFtNWzBdXS5pZHMubGVuZ3RofSk7dmFyIEg9TlswXVswXTtOPU5bMF1bMV07SVtIXT1JW0hdfHxbXTtjb25zdCBLPU8uc3BsaXQoIi8iKTtPPWQuY3JlYXRlU2VyaWVzTm9kZShEW0hdLnByZWZpeCxEW0hdLnN1ZmZpeCxLLnNsaWNlKDAsSy5sZW5ndGgtMSkuam9pbigiLyIpLCtOLE8seSk7SVtIXS5wdXNoKE8pfSk7Xy5lYWNoKEksZnVuY3Rpb24oTil7aWYoISgyPk4ubGVuZ3RoKSl7Ti5zb3J0KGZ1bmN0aW9uKEgsSyl7cmV0dXJuK0guY2x1c3RlcklkLStLLmNsdXN0ZXJJZH0pO3ZhciBPPVtOWzBdXTtmb3IobGV0IEg9MTtIPE4ubGVuZ3RoO0grKyl7bGV0IEs9TltIXTtLLmNsdXN0ZXJJZD09PU9bTy5sZW5ndGgtMV0uY2x1c3RlcklkKzE/Ty5wdXNoKEspOihxKE8sdywrRyxBLHkpLE89CltLXSl9cShPLHcsK0csQSx5KX19KX19KTtyZXR1cm4gd31mdW5jdGlvbiBxKHgsQSx5LHcsQyl7aWYoMTx4Lmxlbmd0aCl7bGV0IEc9ZC5nZXRTZXJpZXNOb2RlTmFtZSh4WzBdLnByZWZpeCx4WzBdLnN1ZmZpeCx4WzBdLnBhcmVudCx4WzBdLmNsdXN0ZXJJZCx4W3gubGVuZ3RoLTFdLmNsdXN0ZXJJZCksRD1kLmNyZWF0ZVNlcmllc05vZGUoeFswXS5wcmVmaXgseFswXS5zdWZmaXgseFswXS5wYXJlbnQseSxHLEMpO18uZWFjaCh4LGZ1bmN0aW9uKEIpe0QuaWRzLnB1c2goQi5jbHVzdGVySWQpO0QubWV0YWdyYXBoLnNldE5vZGUoQi5uYW1lLHcubm9kZShCLm5hbWUpKX0pO0FbR109RH19Y2xhc3MgdXtjb25zdHJ1Y3Rvcih4KXt0aGlzLmhhc1NoYXBlSW5mbz0hMTt0aGlzLm1heE1ldGFFZGdlU2l6ZT0xO3RoaXMuZ3JhcGhPcHRpb25zPXh8fHt9O3RoaXMuZ3JhcGhPcHRpb25zLmNvbXBvdW5kPSEwO3RoaXMucm9vdD1kLmNyZWF0ZU1ldGFub2RlKGQuUk9PVF9OQU1FLHRoaXMuZ3JhcGhPcHRpb25zKTsKdGhpcy5saWJyYXJ5RnVuY3Rpb25zPXt9O3RoaXMueGxhQ2x1c3RlcnM9dGhpcy5kZXZpY2VzPXRoaXMudGVtcGxhdGVzPW51bGw7dGhpcy5pbmRleD17fTt0aGlzLmluZGV4W2QuUk9PVF9OQU1FXT10aGlzLnJvb3Q7dGhpcy5vcmRlcmluZ3M9e319Z2V0Tm9kZU1hcCgpe3JldHVybiB0aGlzLmluZGV4fW5vZGUoeCl7cmV0dXJuIHRoaXMuaW5kZXhbeF19c2V0Tm9kZSh4LEEpe3RoaXMuaW5kZXhbeF09QX1nZXRCcmlkZ2VncmFwaCh4KXt2YXIgQT10aGlzLmluZGV4W3hdO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIGluIGhpZXJhcmNoeTogIit4KTtpZighKCJtZXRhZ3JhcGgiaW4gQSkpcmV0dXJuIG51bGw7aWYoQS5icmlkZ2VncmFwaClyZXR1cm4gQS5icmlkZ2VncmFwaDtsZXQgeT1BLmJyaWRnZWdyYXBoPWQuY3JlYXRlR3JhcGgoIkJSSURHRUdSQVBIIixkLkdyYXBoVHlwZS5CUklER0UsdGhpcy5ncmFwaE9wdGlvbnMpO2lmKCEoQS5wYXJlbnROb2RlJiYKIm1ldGFncmFwaCJpbiBBLnBhcmVudE5vZGUpKXJldHVybiB5O3ZhciB3PUEucGFyZW50Tm9kZTtBPXcubWV0YWdyYXBoO3c9dGhpcy5nZXRCcmlkZ2VncmFwaCh3Lm5hbWUpO18uZWFjaChbQSx3XSxDPT57Qy5lZGdlcygpLmZpbHRlcihHPT5HLnY9PT14fHxHLnc9PT14KS5mb3JFYWNoKEc9PntsZXQgRD1HLnc9PT14LEI9Qy5lZGdlKEcpO18uZWFjaChCLmJhc2VFZGdlTGlzdCxJPT57bGV0IFtOLE9dPUQ/W0kudyxHLnZdOltJLnYsRy53XTt2YXIgSD10aGlzLmdldENoaWxkTmFtZSh4LE4pO0g9e3Y6RD9POkgsdzpEP0g6T307bGV0IEs9eS5lZGdlKEgpO0t8fChLPWQuY3JlYXRlTWV0YWVkZ2UoSC52LEgudyksSy5pbmJvdW5kPUQseS5zZXRFZGdlKEgudixILncsSykpO0suYWRkQmFzZUVkZ2UoSSx0aGlzKX0pfSl9KTtyZXR1cm4geX1nZXRDaGlsZE5hbWUoeCxBKXtsZXQgeT10aGlzLmluZGV4W0FdO2Zvcig7eTspe2lmKHkucGFyZW50Tm9kZSYmeS5wYXJlbnROb2RlLm5hbWU9PT0KeClyZXR1cm4geS5uYW1lO3k9eS5wYXJlbnROb2RlfXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBpbW1lZGlhdGUgY2hpbGQgZm9yIGRlc2NlbmRhbnQ6ICIrQSk7fWdldFByZWRlY2Vzc29ycyh4KXtsZXQgQT10aGlzLmluZGV4W3hdO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit4KTtsZXQgeT10aGlzLmdldE9uZVdheUVkZ2VzKEEsITApO0EuaXNHcm91cE5vZGV8fF8uZWFjaChBLmluRW1iZWRkaW5ncyx3PT57Xy5lYWNoKEEuaW5wdXRzLEM9PntpZihDLm5hbWU9PT13Lm5hbWUpe2xldCBHPW5ldyBkLk1ldGFlZGdlSW1wbCh3Lm5hbWUseCk7Ry5hZGRCYXNlRWRnZSh7aXNDb250cm9sRGVwZW5kZW5jeTpDLmlzQ29udHJvbERlcGVuZGVuY3ksb3V0cHV0VGVuc29yS2V5OkMub3V0cHV0VGVuc29yS2V5LGlzUmVmZXJlbmNlRWRnZTohMSx2OncubmFtZSx3Onh9LHRoaXMpO3kucmVndWxhci5wdXNoKEcpfX0pfSk7cmV0dXJuIHl9Z2V0U3VjY2Vzc29ycyh4KXtsZXQgQT0KdGhpcy5pbmRleFt4XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIreCk7bGV0IHk9dGhpcy5nZXRPbmVXYXlFZGdlcyhBLCExKTtBLmlzR3JvdXBOb2RlfHxfLmVhY2goQS5vdXRFbWJlZGRpbmdzLHc9PntfLmVhY2gody5pbnB1dHMsQz0+e2lmKEMubmFtZT09PXgpe2xldCBHPW5ldyBkLk1ldGFlZGdlSW1wbCh4LHcubmFtZSk7Ry5hZGRCYXNlRWRnZSh7aXNDb250cm9sRGVwZW5kZW5jeTpDLmlzQ29udHJvbERlcGVuZGVuY3ksb3V0cHV0VGVuc29yS2V5OkMub3V0cHV0VGVuc29yS2V5LGlzUmVmZXJlbmNlRWRnZTohMSx2Ongsdzp3Lm5hbWV9LHRoaXMpO3kucmVndWxhci5wdXNoKEcpfX0pfSk7cmV0dXJuIHl9Z2V0T25lV2F5RWRnZXMoeCxBKXtsZXQgeT17Y29udHJvbDpbXSxyZWd1bGFyOltdfTtpZigheC5wYXJlbnROb2RlfHwheC5wYXJlbnROb2RlLmlzR3JvdXBOb2RlKXJldHVybiB5O3ZhciB3PXgucGFyZW50Tm9kZTtsZXQgQz0Kdy5tZXRhZ3JhcGg7dz10aGlzLmdldEJyaWRnZWdyYXBoKHcubmFtZSk7aChDLHgsQSx5KTtoKHcseCxBLHkpO3JldHVybiB5fWdldFRvcG9sb2dpY2FsT3JkZXJpbmcoeCl7dmFyIEE9dGhpcy5pbmRleFt4XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIreCk7aWYoIUEuaXNHcm91cE5vZGUpcmV0dXJuIG51bGw7aWYoeCBpbiB0aGlzLm9yZGVyaW5ncylyZXR1cm4gdGhpcy5vcmRlcmluZ3NbeF07bGV0IHk9e30sdz17fSxDPUEubWV0YWdyYXBoO18uZWFjaChDLmVkZ2VzKCksRD0+e0MuZWRnZShEKS5udW1SZWd1bGFyRWRnZXMmJihELnYgaW4geXx8KHlbRC52XT1bXSkseVtELnZdLnB1c2goRC53KSx3W0Qud109ITApfSk7bGV0IEc9Xy5kaWZmZXJlbmNlKF8ua2V5cyh5KSxfLmtleXModykpO3g9dGhpcy5vcmRlcmluZ3NbeF09e307Zm9yKEE9MDtHLmxlbmd0aDspe2xldCBEPUcuc2hpZnQoKTt4W0RdPUErKztfLmVhY2goeVtEXSxCPT4KRy5wdXNoKEIpKTtkZWxldGUgeVtEXX1yZXR1cm4geH1nZXRUZW1wbGF0ZUluZGV4KCl7bGV0IHg9ZDMua2V5cyh0aGlzLnRlbXBsYXRlcyksQT1kMy5zY2FsZU9yZGluYWwoKS5kb21haW4oeCkucmFuZ2UoZDMucmFuZ2UoMCx4Lmxlbmd0aCkpO3JldHVybiB5PT5BKHkpfX1mLkRlZmF1bHRIaWVyYXJjaHlQYXJhbXM9e3ZlcmlmeVRlbXBsYXRlOiEwLHNlcmllc05vZGVNaW5TaXplOjUsc2VyaWVzTWFwOnt9LHJhbmtEaXJlY3Rpb246IkJUIix1c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zOiExfTtmLmJ1aWxkPWZ1bmN0aW9uKHgsQSx5KXtsZXQgdz1uZXcgdSh7cmFua2RpcjpBLnJhbmtEaXJlY3Rpb259KSxDPXt9O3JldHVybiBiLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJBZGRpbmcgbm9kZXMiLDIwLCgpPT57bGV0IEc9e30sRD17fTtfLmVhY2goeC5ub2RlcyxCPT57Qi5kZXZpY2UmJihHW0IuZGV2aWNlXT0hMCk7Qi54bGFDbHVzdGVyJiYoRFtCLnhsYUNsdXN0ZXJdPSEwKX0pOwp3LmRldmljZXM9Xy5rZXlzKEcpO3cueGxhQ2x1c3RlcnM9Xy5rZXlzKEQpO2sodyx4KX0seSkudGhlbigoKT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiRGV0ZWN0IHNlcmllcyIsMjAsKCk9PnswPEEuc2VyaWVzTm9kZU1pblNpemUmJmwody5yb290LHcsQyxBLnNlcmllc05vZGVNaW5TaXplLEEuc2VyaWVzTWFwLEEudXNlR2VuZXJhbGl6ZWRTZXJpZXNQYXR0ZXJucyl9LHkpKS50aGVuKCgpPT5iLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJBZGRpbmcgZWRnZXMiLDMwLCgpPT57dCh3LHgsQyl9LHkpKS50aGVuKCgpPT5iLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJGaW5kaW5nIHNpbWlsYXIgc3ViZ3JhcGhzIiwzMCwoKT0+e3cudGVtcGxhdGVzPWQudGVtcGxhdGUuZGV0ZWN0KHcsQS52ZXJpZnlUZW1wbGF0ZSl9LHkpKS50aGVuKCgpPT53KX07Zi5qb2luQW5kQWdncmVnYXRlU3RhdHM9ZnVuY3Rpb24oeCl7bGV0IEE9e30seT17fTtfLmVhY2goeC5yb290LmxlYXZlcygpLAp3PT57dz14Lm5vZGUodyk7bnVsbCE9dy5kZXZpY2UmJihBW3cuZGV2aWNlXT0hMCk7bnVsbCE9dy54bGFDbHVzdGVyJiYoeVt3LnhsYUNsdXN0ZXJdPSEwKX0pO3guZGV2aWNlcz1fLmtleXMoQSk7eC54bGFDbHVzdGVycz1fLmtleXMoeSk7Xy5lYWNoKHguZ2V0Tm9kZU1hcCgpLHc9Pnt3LmlzR3JvdXBOb2RlJiYody5zdGF0cz1uZXcgZC5Ob2RlU3RhdHMobnVsbCksdy5kZXZpY2VIaXN0b2dyYW09e30pfSk7Xy5lYWNoKHgucm9vdC5sZWF2ZXMoKSx3PT57bGV0IEM9dz14Lm5vZGUodyk7Zm9yKDtudWxsIT1DLnBhcmVudE5vZGU7KXtpZihudWxsIT13LmRldmljZSl7dmFyIEc9Qy5wYXJlbnROb2RlLmRldmljZUhpc3RvZ3JhbTtHW3cuZGV2aWNlXT0oR1t3LmRldmljZV18fDApKzF9bnVsbCE9dy54bGFDbHVzdGVyJiYoRz1DLnBhcmVudE5vZGUueGxhQ2x1c3Rlckhpc3RvZ3JhbSxHW3cueGxhQ2x1c3Rlcl09KEdbdy54bGFDbHVzdGVyXXx8MCkrMSk7bnVsbCE9dy5zdGF0cyYmQy5wYXJlbnROb2RlLnN0YXRzLmNvbWJpbmUody5zdGF0cyk7CkM9Qy5wYXJlbnROb2RlfX0pfTtmLmdldEluY29tcGF0aWJsZU9wcz1mdW5jdGlvbih4LEEpe2xldCB5PVtdLHc9e307Xy5lYWNoKHgucm9vdC5sZWF2ZXMoKSxDPT57Qz14Lm5vZGUoQyk7aWYoQy50eXBlPT1kLk5vZGVUeXBlLk9QKXtpZighQy5jb21wYXRpYmxlKWlmKEMub3duaW5nU2VyaWVzKWlmKEEmJkEuc2VyaWVzTWFwW0Mub3duaW5nU2VyaWVzXT09PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVApeS5wdXNoKEMpO2Vsc2V7aWYoIXdbQy5vd25pbmdTZXJpZXNdKXtsZXQgRz14Lm5vZGUoQy5vd25pbmdTZXJpZXMpO0cmJih3W0Mub3duaW5nU2VyaWVzXT1HLHkucHVzaChHKSl9fWVsc2UgeS5wdXNoKEMpO18uZWFjaChDLmluRW1iZWRkaW5ncyxHPT57Ry5jb21wYXRpYmxlfHx5LnB1c2goRyl9KTtfLmVhY2goQy5vdXRFbWJlZGRpbmdzLEc9PntHLmNvbXBhdGlibGV8fHkucHVzaChHKX0pfX0pO3JldHVybiB5fX0pKGQuaGllcmFyY2h5fHwoZC5oaWVyYXJjaHk9Cnt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9sYXlvdXQuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaCh3KXt3Lm5vZGUuaXNHcm91cE5vZGUmJnQodyk7dy5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEE/cCh3KTp3Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTJiZtKHcpfWZ1bmN0aW9uIGsodyl7dy5pbmJveFdpZHRoPTA8dy5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoP2YuUEFSQU1TLmFubm90YXRpb25zLmluYm94V2lkdGg6MDt3Lm91dGJveFdpZHRoPTA8dy5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD9mLlBBUkFNUy5hbm5vdGF0aW9ucy5vdXRib3hXaWR0aDowO3cuY29yZUJveC53aWR0aD13LndpZHRoO3cuY29yZUJveC5oZWlnaHQ9dy5oZWlnaHQ7dy53aWR0aD1NYXRoLm1heCh3LmNvcmVCb3gud2lkdGgrdy5pbmJveFdpZHRoK3cub3V0Ym94V2lkdGgsMyp3LmRpc3BsYXlOYW1lLmxlbmd0aCl9ZnVuY3Rpb24gdCh3KXtsZXQgQz13LmNvcmVHcmFwaC5ub2RlcygpLm1hcChHPT4Kdy5jb3JlR3JhcGgubm9kZShHKSkuY29uY2F0KHcuaXNvbGF0ZWRJbkV4dHJhY3Qsdy5pc29sYXRlZE91dEV4dHJhY3Qsdy5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCk7Xy5lYWNoKEMsRz0+e3N3aXRjaChHLm5vZGUudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk9QOl8uZXh0ZW5kKEcsZi5QQVJBTVMubm9kZVNpemUub3ApO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6Xy5leHRlbmQoRyxmLlBBUkFNUy5ub2RlU2l6ZS5icmlkZ2UpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOkcuZXhwYW5kZWQ/aChHKTooXy5leHRlbmQoRyxmLlBBUkFNUy5ub2RlU2l6ZS5tZXRhKSxHLmhlaWdodD1mLlBBUkFNUy5ub2RlU2l6ZS5tZXRhLmhlaWdodChHLm5vZGUuY2FyZGluYWxpdHkpKTticmVhaztjYXNlIGQuTm9kZVR5cGUuU0VSSUVTOkcuZXhwYW5kZWQ/KF8uZXh0ZW5kKEcsZi5QQVJBTVMubm9kZVNpemUuc2VyaWVzLmV4cGFuZGVkKSxoKEcpKTpfLmV4dGVuZChHLEcubm9kZS5oYXNOb25Db250cm9sRWRnZXM/CmYuUEFSQU1TLm5vZGVTaXplLnNlcmllcy52ZXJ0aWNhbDpmLlBBUkFNUy5ub2RlU2l6ZS5zZXJpZXMuaG9yaXpvbnRhbCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitHLm5vZGUudHlwZSk7fUcuZXhwYW5kZWR8fGsoRyk7bihHKX0pfWZ1bmN0aW9uIGwodyxDKXtfLmV4dGVuZCh3LmdyYXBoKCkse25vZGVzZXA6Qy5ub2RlU2VwLHJhbmtzZXA6Qy5yYW5rU2VwLGVkZ2VzZXA6Qy5lZGdlU2VwfSk7bGV0IEc9W10sRD1bXTtfLmVhY2gody5ub2RlcygpLEg9Pnt3Lm5vZGUoSCkubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5CUklER0U/Ry5wdXNoKEgpOkQucHVzaChIKX0pO2lmKCFELmxlbmd0aClyZXR1cm57d2lkdGg6MCxoZWlnaHQ6MH07ZGFncmUubGF5b3V0KHcpO2xldCBCPUluZmluaXR5LEk9SW5maW5pdHksTj0tSW5maW5pdHksTz0tSW5maW5pdHk7Xy5lYWNoKEQsSD0+e0g9dy5ub2RlKEgpO3ZhciBLPS41Kkgud2lkdGgsTT1ILngtCks7Sz1ILngrSztCPU08Qj9NOkI7Tj1LPk4/SzpOO0s9LjUqSC5oZWlnaHQ7TT1ILnktSztIPUgueStLO0k9TTxJP006STtPPUg+Tz9IOk99KTtfLmVhY2gody5lZGdlcygpLEg9PntIPXcuZWRnZShIKTtpZighSC5zdHJ1Y3R1cmFsKXt2YXIgSz13Lm5vZGUoSC5tZXRhZWRnZS52KSxNPXcubm9kZShILm1ldGFlZGdlLncpO2lmKDM9PT1ILnBvaW50cy5sZW5ndGgmJkEoSC5wb2ludHMpKXtpZihudWxsIT1LKXt2YXIgTD1LLmV4cGFuZGVkP0sueDp1KEspO0gucG9pbnRzWzBdLng9TH1udWxsIT1NJiYoTD1NLmV4cGFuZGVkP00ueDp1KE0pLEgucG9pbnRzWzJdLng9TCk7SC5wb2ludHM9W0gucG9pbnRzWzBdLEgucG9pbnRzWzFdXX1MPUgucG9pbnRzW0gucG9pbnRzLmxlbmd0aC0yXTtudWxsIT1NJiYoSC5wb2ludHNbSC5wb2ludHMubGVuZ3RoLTFdPXkoTCxNKSk7TT1ILnBvaW50c1sxXTtudWxsIT1LJiYoSC5wb2ludHNbMF09eShNLEspKTtfLmVhY2goSC5wb2ludHMsUT0+e0I9US54PApCP1EueDpCO049US54Pk4/US54Ok47ST1RLnk8ST9RLnk6STtPPVEueT5PP1EueTpPfSl9fSk7Xy5lYWNoKHcubm9kZXMoKSxIPT57SD13Lm5vZGUoSCk7SC54LT1CO0gueS09SX0pO18uZWFjaCh3LmVkZ2VzKCksSD0+e18uZWFjaCh3LmVkZ2UoSCkucG9pbnRzLEs9PntLLngtPUI7Sy55LT1JfSl9KTtyZXR1cm57d2lkdGg6Ti1CLGhlaWdodDpPLUl9fWZ1bmN0aW9uIHAodyl7bGV0IEM9Zi5QQVJBTVMuc3Vic2NlbmUubWV0YTtfLmV4dGVuZCh3LEMpO18uZXh0ZW5kKHcuY29yZUJveCxsKHcuY29yZUdyYXBoLGYuUEFSQU1TLmdyYXBoLm1ldGEpKTt2YXIgRz13Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aD9fLm1heCh3Lmlzb2xhdGVkSW5FeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7dy5pbkV4dHJhY3RCb3gud2lkdGg9bnVsbCE9Rz9HOjA7dy5pbkV4dHJhY3RCb3guaGVpZ2h0PV8ucmVkdWNlKHcuaXNvbGF0ZWRJbkV4dHJhY3QsKEIsSSxOKT0+e049MDxOP0MuZXh0cmFjdFlPZmZzZXQ6CjA7SS54PTA7SS55PUIrTitJLmhlaWdodC8yO3JldHVybiBCK04rSS5oZWlnaHR9LDApO0c9dy5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoP18ubWF4KHcuaXNvbGF0ZWRPdXRFeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7dy5vdXRFeHRyYWN0Qm94LndpZHRoPW51bGwhPUc/RzowO3cub3V0RXh0cmFjdEJveC5oZWlnaHQ9Xy5yZWR1Y2Uody5pc29sYXRlZE91dEV4dHJhY3QsKEIsSSxOKT0+e049MDxOP0MuZXh0cmFjdFlPZmZzZXQ6MDtJLng9MDtJLnk9QitOK0kuaGVpZ2h0LzI7cmV0dXJuIEIrTitJLmhlaWdodH0sMCk7Rz13LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aD9fLm1heCh3LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7dy5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoPW51bGwhPUc/RzowO3cubGlicmFyeUZ1bmN0aW9uc0JveC5oZWlnaHQ9Xy5yZWR1Y2Uody5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCwoQixJLApOKT0+e049MDxOP0MuZXh0cmFjdFlPZmZzZXQ6MDtJLng9MDtJLnk9QitOK0kuaGVpZ2h0LzI7cmV0dXJuIEIrTitJLmhlaWdodH0sMCk7Rz0wOzA8dy5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGgmJkcrKzswPHcuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aCYmRysrOzA8dy5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgmJkcrKzswPHcuY29yZUdyYXBoLm5vZGVDb3VudCgpJiZHKys7bGV0IEQ9Zi5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldDtHPTE+PUc/MDpHKkQ7dy5jb3JlQm94LndpZHRoKz1NYXRoLm1heChmLk1JTl9BVVhfV0lEVEgsdy5pbkV4dHJhY3RCb3gud2lkdGgrdy5vdXRFeHRyYWN0Qm94LndpZHRoKStHK3cubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aCtHO3cuY29yZUJveC5oZWlnaHQ9Qy5sYWJlbEhlaWdodCtNYXRoLm1heCh3LmluRXh0cmFjdEJveC5oZWlnaHQsdy5jb3JlQm94LmhlaWdodCx3LmxpYnJhcnlGdW5jdGlvbnNCb3guaGVpZ2h0LAp3Lm91dEV4dHJhY3RCb3guaGVpZ2h0KTt3LndpZHRoPXcuY29yZUJveC53aWR0aCtDLnBhZGRpbmdMZWZ0K0MucGFkZGluZ1JpZ2h0O3cuaGVpZ2h0PXcucGFkZGluZ1RvcCt3LmNvcmVCb3guaGVpZ2h0K3cucGFkZGluZ0JvdHRvbX1mdW5jdGlvbiBtKHcpe2xldCBDPXcuY29yZUdyYXBoLEc9Zi5QQVJBTVMuc3Vic2NlbmUuc2VyaWVzO18uZXh0ZW5kKHcsRyk7Xy5leHRlbmQody5jb3JlQm94LGwody5jb3JlR3JhcGgsZi5QQVJBTVMuZ3JhcGguc2VyaWVzKSk7Xy5lYWNoKEMubm9kZXMoKSxEPT57Qy5ub2RlKEQpLmV4Y2x1ZGVkPSExfSk7dy53aWR0aD13LmNvcmVCb3gud2lkdGgrRy5wYWRkaW5nTGVmdCtHLnBhZGRpbmdSaWdodDt3LmhlaWdodD13LmNvcmVCb3guaGVpZ2h0K0cucGFkZGluZ1RvcCtHLnBhZGRpbmdCb3R0b219ZnVuY3Rpb24gbih3KXtpZighdy5leHBhbmRlZCl7dmFyIEM9dy5pbkFubm90YXRpb25zLmxpc3QsRz13Lm91dEFubm90YXRpb25zLmxpc3Q7Xy5lYWNoKEMsCks9PnEoSykpO18uZWFjaChHLEs9PnEoSykpO3ZhciBEPWYuUEFSQU1TLmFubm90YXRpb25zLEI9Xy5yZWR1Y2UoQywoSyxNLEwpPT57TD0wPEw/RC55T2Zmc2V0OjA7TS5keD0tKHcuY29yZUJveC53aWR0aCtNLndpZHRoKS8yLUQueE9mZnNldDtNLmR5PUsrTCtNLmhlaWdodC8yO3JldHVybiBLK0wrTS5oZWlnaHR9LDApO18uZWFjaChDLEs9PntLLmR5LT1CLzI7Sy5sYWJlbE9mZnNldD1ELmxhYmVsT2Zmc2V0fSk7dmFyIEk9Xy5yZWR1Y2UoRywoSyxNLEwpPT57TD0wPEw/RC55T2Zmc2V0OjA7TS5keD0ody5jb3JlQm94LndpZHRoK00ud2lkdGgpLzIrRC54T2Zmc2V0O00uZHk9SytMK00uaGVpZ2h0LzI7cmV0dXJuIEsrTCtNLmhlaWdodH0sMCk7Xy5lYWNoKEcsSz0+e0suZHktPUkvMjtLLmxhYmVsT2Zmc2V0PUQubGFiZWxPZmZzZXR9KTt2YXIgTj1NYXRoLm1pbih3LmhlaWdodC8yLXcucmFkaXVzLEIvMik7Tj0wPk4/MDpOO3ZhciBPPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLApDLmxlbmd0aC0xXSkucmFuZ2UoWy1OLE5dKTtfLmVhY2goQywoSyxNKT0+e0sucG9pbnRzPVt7ZHg6Sy5keCtLLndpZHRoLzIsZHk6Sy5keX0se2R4Oi13LmNvcmVCb3gud2lkdGgvMixkeToxPEMubGVuZ3RoP08oTSk6MH1dfSk7Tj1NYXRoLm1pbih3LmhlaWdodC8yLXcucmFkaXVzLEkvMik7Tj0wPk4/MDpOO3ZhciBIPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLEcubGVuZ3RoLTFdKS5yYW5nZShbLU4sTl0pO18uZWFjaChHLChLLE0pPT57Sy5wb2ludHM9W3tkeDp3LmNvcmVCb3gud2lkdGgvMixkeToxPEcubGVuZ3RoP0goTSk6MH0se2R4OksuZHgtSy53aWR0aC8yLGR5OksuZHl9XX0pO3cuaGVpZ2h0PU1hdGgubWF4KHcuaGVpZ2h0LEIsSSl9fWZ1bmN0aW9uIHEodyl7c3dpdGNoKHcuYW5ub3RhdGlvblR5cGUpe2Nhc2UgZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuQ09OU1RBTlQ6Xy5leHRlbmQodyxmLlBBUkFNUy5jb25zdGFudC5zaXplKTticmVhaztjYXNlIGQucmVuZGVyLkFubm90YXRpb25UeXBlLlNIT1JUQ1VUOmlmKHcubm9kZS50eXBlPT09CmQuTm9kZVR5cGUuT1ApXy5leHRlbmQodyxmLlBBUkFNUy5zaG9ydGN1dFNpemUub3ApO2Vsc2UgaWYody5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEpXy5leHRlbmQodyxmLlBBUkFNUy5zaG9ydGN1dFNpemUubWV0YSk7ZWxzZSBpZih3Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTKV8uZXh0ZW5kKHcsZi5QQVJBTVMuc2hvcnRjdXRTaXplLnNlcmllcyk7ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBub2RlIHR5cGU6ICIrdy5ub2RlLnR5cGUpO2JyZWFrO2Nhc2UgZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWTpfLmV4dGVuZCh3LGYuUEFSQU1TLmNvbnN0YW50LnNpemUpfX1mdW5jdGlvbiB1KHcpe3JldHVybiB3LmV4cGFuZGVkP3cueDp3Lngtdy53aWR0aC8yKyh3LmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg/dy5pbmJveFdpZHRoOjApK3cuY29yZUJveC53aWR0aC8yfWZ1bmN0aW9uIHgodyxDKXtyZXR1cm4gMTgwKk1hdGguYXRhbigoQy55LXcueSkvKEMueC0Kdy54KSkvTWF0aC5QSX1mdW5jdGlvbiBBKHcpe2xldCBDPXgod1swXSx3WzFdKTtmb3IobGV0IEc9MTtHPHcubGVuZ3RoLTE7RysrKXtsZXQgRD14KHdbR10sd1tHKzFdKTtpZigxPE1hdGguYWJzKEQtQykpcmV0dXJuITE7Qz1EfXJldHVybiEwfWZ1bmN0aW9uIHkodyxDKXtsZXQgRz1DLmV4cGFuZGVkP0MueDp1KEMpLEQ9Qy55O3ZhciBCPXcueC1HO3c9dy55LUQ7bGV0IEk9Qy5leHBhbmRlZD9DLndpZHRoOkMuY29yZUJveC53aWR0aCxOPUMuZXhwYW5kZWQ/Qy5oZWlnaHQ6Qy5jb3JlQm94LmhlaWdodDtNYXRoLmFicyh3KSpJLzI+TWF0aC5hYnMoQikqTi8yPygwPncmJihOPS1OKSxDPTA9PT13PzA6Ti8yKkIvdyxCPU4vMik6KDA+QiYmKEk9LUkpLEM9SS8yLEI9MD09PUI/MDpJLzIqdy9CKTtyZXR1cm57eDpHK0MseTpEK0J9fWYuUEFSQU1TPXthbmltYXRpb246e2R1cmF0aW9uOjI1MH0sZ3JhcGg6e21ldGE6e25vZGVTZXA6NSxyYW5rU2VwOjI1LGVkZ2VTZXA6NX0sc2VyaWVzOntub2RlU2VwOjUsCnJhbmtTZXA6MjUsZWRnZVNlcDo1fSxwYWRkaW5nOntwYWRkaW5nVG9wOjQwLHBhZGRpbmdMZWZ0OjIwfX0sc3Vic2NlbmU6e21ldGE6e3BhZGRpbmdUb3A6MTAscGFkZGluZ0JvdHRvbToxMCxwYWRkaW5nTGVmdDoxMCxwYWRkaW5nUmlnaHQ6MTAsbGFiZWxIZWlnaHQ6MjAsZXh0cmFjdFhPZmZzZXQ6MTUsZXh0cmFjdFlPZmZzZXQ6MjB9LHNlcmllczp7cGFkZGluZ1RvcDoxMCxwYWRkaW5nQm90dG9tOjEwLHBhZGRpbmdMZWZ0OjEwLHBhZGRpbmdSaWdodDoxMCxsYWJlbEhlaWdodDoxMH19LG5vZGVTaXplOnttZXRhOntyYWRpdXM6NSx3aWR0aDo2MCxtYXhMYWJlbFdpZHRoOjUyLGhlaWdodDpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSwyMDBdKS5yYW5nZShbMTUsNjBdKS5jbGFtcCghMCksZXhwYW5kQnV0dG9uUmFkaXVzOjN9LG9wOnt3aWR0aDoxNSxoZWlnaHQ6NixyYWRpdXM6MyxsYWJlbE9mZnNldDotOCxtYXhMYWJlbFdpZHRoOjMwfSxzZXJpZXM6e2V4cGFuZGVkOntyYWRpdXM6MTAsCmxhYmVsT2Zmc2V0OjB9LHZlcnRpY2FsOnt3aWR0aDoxNixoZWlnaHQ6MTMsbGFiZWxPZmZzZXQ6LTEzfSxob3Jpem9udGFsOnt3aWR0aDoyNCxoZWlnaHQ6OCxyYWRpdXM6MTAsbGFiZWxPZmZzZXQ6LTEwfX0sYnJpZGdlOnt3aWR0aDoyMCxoZWlnaHQ6MjAscmFkaXVzOjIsbGFiZWxPZmZzZXQ6MH19LHNob3J0Y3V0U2l6ZTp7b3A6e3dpZHRoOjEwLGhlaWdodDo0fSxtZXRhOnt3aWR0aDoxMixoZWlnaHQ6NCxyYWRpdXM6MX0sc2VyaWVzOnt3aWR0aDoxNCxoZWlnaHQ6NH19LGFubm90YXRpb25zOntpbmJveFdpZHRoOjUwLG91dGJveFdpZHRoOjUwLHhPZmZzZXQ6MTAseU9mZnNldDozLGxhYmVsT2Zmc2V0OjIsbWF4TGFiZWxXaWR0aDoxMjB9LGNvbnN0YW50OntzaXplOnt3aWR0aDo0LGhlaWdodDo0fX0sc2VyaWVzOnttYXhTdGFja0NvdW50OjMscGFyYWxsZWxTdGFja09mZnNldFJhdGlvOi4yLHRvd2VyU3RhY2tPZmZzZXRSYXRpbzouNX0sbWluaW1hcDp7c2l6ZToxNTB9fTtmLk1JTl9BVVhfV0lEVEg9CjE0MDtmLmxheW91dFNjZW5lPWg7Zi5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlPXV9KShkLmxheW91dHx8KGQubGF5b3V0PXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9sb2FkZXIuanMKdmFyIFVpPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbihiLGQsZixoKXtyZXR1cm4gbmV3IChmfHwoZj1Qcm9taXNlKSkoZnVuY3Rpb24oayx0KXtmdW5jdGlvbiBsKG4pe3RyeXttKGgubmV4dChuKSl9Y2F0Y2gocSl7dChxKX19ZnVuY3Rpb24gcChuKXt0cnl7bShoWyJ0aHJvdyJdKG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBtKG4pe24uZG9uZT9rKG4udmFsdWUpOihuZXcgZihmdW5jdGlvbihxKXtxKG4udmFsdWUpfSkpLnRoZW4obCxwKX1tKChoPWguYXBwbHkoYixkfHxbXSkpLm5leHQoKSl9KX07CihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2YuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaD1mdW5jdGlvbihoLGssdCxsPW5ldyBkLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcixwPWQuaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXMpe2NvbnN0IG09ZC51dGlsLmdldFN1YnRhc2tUcmFja2VyKGgsMjAsIkdyYXBoIiksbj1kLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoaCw1MCwiTmFtZXNwYWNlIGhpZXJhcmNoeSIpO3JldHVybiBkLnBhcnNlci5mZXRjaEFuZFBhcnNlR3JhcGhEYXRhKGssdCxkLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoaCwzMCwiRGF0YSIpKS50aGVuKGZ1bmN0aW9uKHEpe2lmKCFxLm5vZGUpdGhyb3cgRXJyb3IoIlRoZSBncmFwaCBpcyBlbXB0eS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gVGVuc29yRmxvdyBjb3VsZCBub3QgdHJhY2UgYW55IGdyYXBoLiBQbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5NjEgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7CnJldHVybiBkLmJ1aWxkKHEsZC5EZWZhdWx0QnVpbGRQYXJhbXMsbSl9LCgpPT57dGhyb3cgRXJyb3IoIk1hbGZvcm1lZCBHcmFwaERlZi4gVGhpcyBjYW4gc29tZXRpbWVzIGJlIGNhdXNlZCBieSBhIGJhZCBuZXR3b3JrIGNvbm5lY3Rpb24gb3IgZGlmZmljdWx0eSByZWNvbmNpbGluZyBtdWx0aXBsZSBHcmFwaERlZnM7IGZvciB0aGUgbGF0dGVyIGNhc2UsIHBsZWFzZSByZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTkyOS4iKTt9KS50aGVuKHE9PlVpKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtkLm9wLmNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eShxLGwpO2NvbnN0IHU9eWllbGQgZC5oaWVyYXJjaHkuYnVpbGQocSxwLG4pO3JldHVybntncmFwaDpxLGdyYXBoSGllcmFyY2h5OnV9fSkpLmNhdGNoKHE9PntoLnJlcG9ydEVycm9yKGBHcmFwaCB2aXN1YWxpemF0aW9uIGZhaWxlZC5cblxuJHtxfWAscSk7dGhyb3cgcTsKfSl9fSkoZC5sb2FkZXJ8fChkLmxvYWRlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbm9kZS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXsoZnVuY3Rpb24oaCl7ZnVuY3Rpb24gayhaLGJhLGVhKXtpZihiYS5ub2RlLmlzR3JvdXBOb2RlKXtpZihiYS5leHBhbmRlZClyZXR1cm4gZi5idWlsZEdyb3VwKFosYmEsZWEsZi5DbGFzcy5TdWJzY2VuZS5HUk9VUCk7Zi5zZWxlY3RDaGlsZChaLCJnIixmLkNsYXNzLlN1YnNjZW5lLkdST1VQKS5yZW1vdmUoKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB0KFosYmEpe2xldCBlYT1iYS54LWJhLndpZHRoLzIrYmEucGFkZGluZ0xlZnQ7YmE9YmEueS1iYS5oZWlnaHQvMitiYS5wYWRkaW5nVG9wO1o9Zi5zZWxlY3RDaGlsZChaLCJnIixmLkNsYXNzLlN1YnNjZW5lLkdST1VQKTtmLnRyYW5zbGF0ZShaLGVhLGJhKX1mdW5jdGlvbiBsKFosYmEsZWEpe1o9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImciLGYuQ2xhc3MuTm9kZS5CVVRUT05fQ09OVEFJTkVSKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwiY2lyY2xlIixmLkNsYXNzLk5vZGUuQlVUVE9OX0NJUkNMRSk7CmYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJwYXRoIixmLkNsYXNzLk5vZGUuRVhQQU5EX0JVVFRPTikuYXR0cigiZCIsIk0wLC0yLjIgVjIuMiBNLTIuMiwwIEgyLjIiKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwicGF0aCIsZi5DbGFzcy5Ob2RlLkNPTExBUFNFX0JVVFRPTikuYXR0cigiZCIsIk0tMi4yLDAgSDIuMiIpO1oub24oImNsaWNrIixjYT0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2VhLmZpcmUoIm5vZGUtdG9nZ2xlLWV4cGFuZCIse25hbWU6Y2Eubm9kZS5uYW1lfSl9KTtmLnBvc2l0aW9uQnV0dG9uKFosYmEpfWZ1bmN0aW9uIHAoWixiYSxlYSxjYSl7aWYoY2EpWi5hdHRyKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKTtlbHNle3ZhciBrYT1mLmNvbnRleHRtZW51LmdldE1lbnUoZWEsbShiYS5ub2RlLGVhKSk7Wi5vbigiZGJsY2xpY2siLFk9PntlYS5maXJlKCJub2RlLXRvZ2dsZS1leHBhbmQiLHtuYW1lOlkubm9kZS5uYW1lfSl9KS5vbigibW91c2VvdmVyIiwKWT0+e2VhLmlzTm9kZUV4cGFuZGVkKFkpfHxlYS5maXJlKCJub2RlLWhpZ2hsaWdodCIse25hbWU6WS5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW91dCIsWT0+e2VhLmlzTm9kZUV4cGFuZGVkKFkpfHxlYS5maXJlKCJub2RlLXVuaGlnaGxpZ2h0Iix7bmFtZTpZLm5vZGUubmFtZX0pfSkub24oImNsaWNrIixZPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ZWEuZmlyZSgibm9kZS1zZWxlY3QiLHtuYW1lOlkubm9kZS5uYW1lfSl9KS5vbigiY29udGV4dG1lbnUiLChZLEVhKT0+e2VhLmZpcmUoIm5vZGUtc2VsZWN0Iix7bmFtZTpZLm5vZGUubmFtZX0pO2thLmNhbGwoWSxFYSl9KX19ZnVuY3Rpb24gbShaLGJhKXtsZXQgZWE9W3t0aXRsZTooKT0+ZC5nZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZyhaLmluY2x1ZGUpLGFjdGlvbjooKT0+e2JhLmZpcmUoIm5vZGUtdG9nZ2xlLWV4dHJhY3QiLHtuYW1lOloubmFtZX0pfX1dO2JhLm5vZGVDb250ZXh0TWVudUl0ZW1zJiYoZWE9ZWEuY29uY2F0KGJhLm5vZGVDb250ZXh0TWVudUl0ZW1zKSk7Cm4oWikmJmVhLnB1c2goe3RpdGxlOigpPT54KFopLGFjdGlvbjooKT0+e2JhLmZpcmUoIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIix7bmFtZTpxKFopfSl9fSk7cmV0dXJuIGVhfWZ1bmN0aW9uIG4oWil7cmV0dXJuIG51bGwhPT1xKFopfWZ1bmN0aW9uIHEoWil7cmV0dXJuIFo/Wi50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/Wi5uYW1lOloudHlwZT09PWQuTm9kZVR5cGUuT1A/Wi5vd25pbmdTZXJpZXM6bnVsbDpudWxsfWZ1bmN0aW9uIHUoWil7bGV0IGJhPW51bGw7aWYoIVopcmV0dXJuIG51bGw7Wi50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/YmE9WjpaLnBhcmVudE5vZGUmJloucGFyZW50Tm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMmJihiYT1aLnBhcmVudE5vZGUpO3JldHVybiBiYX1mdW5jdGlvbiB4KFope3JldHVybiBiLmdyYXBoLmdldEdyb3VwU2VyaWVzTm9kZUJ1dHRvblN0cmluZyhudWxsIT09dShaKT9iLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUDoKYi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCl9ZnVuY3Rpb24gQShaLGJhLGVhKXt2YXIgY2E9YmEuZGlzcGxheU5hbWU7bGV0IGthPWJhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQSYmIWJhLmV4cGFuZGVkO1o9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInRleHQiLGYuQ2xhc3MuTm9kZS5MQUJFTCk7bGV0IFk9Wi5ub2RlKCk7WS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKFkpO1ouYXR0cigiZHkiLCIuMzVlbSIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIik7a2EmJihjYS5sZW5ndGg+ZWEubWF4TWV0YW5vZGVMYWJlbExlbmd0aCYmKGNhPWNhLnN1YnN0cigwLGVhLm1heE1ldGFub2RlTGFiZWxMZW5ndGgtMikrIi4uLiIpLGVhPXcoZWEpLFouYXR0cigiZm9udC1zaXplIixlYShjYS5sZW5ndGgpKyJweCIpKTtjYT1aLnRleHQoY2EpO3koY2EsYmEubm9kZS50eXBlLGJhKTtyZXR1cm4gWn1mdW5jdGlvbiB5KFosYmEsZWEpe2xldCBjYT1aLm5vZGUoKTt2YXIga2E9CmNhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO2xldCBZPWNhLnRleHRDb250ZW50LEVhPW51bGw7c3dpdGNoKGJhKXtjYXNlIGQuTm9kZVR5cGUuTUVUQTplYSYmIWVhLmV4cGFuZGVkJiYoRWE9ZC5sYXlvdXQuUEFSQU1TLm5vZGVTaXplLm1ldGEubWF4TGFiZWxXaWR0aCk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLk9QOkVhPWQubGF5b3V0LlBBUkFNUy5ub2RlU2l6ZS5vcC5tYXhMYWJlbFdpZHRoO2JyZWFrO2Nhc2UgLTE6RWE9ZC5sYXlvdXQuUEFSQU1TLmFubm90YXRpb25zLm1heExhYmVsV2lkdGh9aWYoIShudWxsPT09RWF8fGthPD1FYSkpe2ZvcihrYT0xO2NhLmdldFN1YlN0cmluZ0xlbmd0aCgwLGthKTxFYTspa2ErKztiYT1jYS50ZXh0Q29udGVudC5zdWJzdHIoMCxrYSk7ZG8gYmE9YmEuc3Vic3RyKDAsYmEubGVuZ3RoLTEpLGNhLnRleHRDb250ZW50PWJhKyIuLi4iLGthPWNhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO3doaWxlKGthPkVhJiYwPGJhLmxlbmd0aCk7cmV0dXJuIFouYXBwZW5kKCJ0aXRsZSIpLnRleHQoWSl9fQpmdW5jdGlvbiB3KFope2FhfHwoYWE9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW1oubWF4TWV0YW5vZGVMYWJlbExlbmd0aExhcmdlRm9udCxaLm1heE1ldGFub2RlTGFiZWxMZW5ndGhdKS5yYW5nZShbWi5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemUsWi5taW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemVdKS5jbGFtcCghMCkpO3JldHVybiBhYX1mdW5jdGlvbiBDKFosYmEsZWEsY2Epe2Yuc2VsZWN0Q2hpbGQoWiwidGV4dCIsZi5DbGFzcy5Ob2RlLkxBQkVMKS50cmFuc2l0aW9uKCkuYXR0cigieCIsYmEpLmF0dHIoInkiLGVhK2NhKX1mdW5jdGlvbiBHKFosYmEsZWEpe1o9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImciLGVhKTtzd2l0Y2goYmEubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuT1A6YmE9YmEubm9kZTtpZihfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uSW5wdXRJbmRleCl8fF8uaXNOdW1iZXIoYmEuZnVuY3Rpb25PdXRwdXRJbmRleCkpe2Yuc2VsZWN0T3JDcmVhdGVDaGlsZChaLAoicG9seWdvbiIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCk7YnJlYWt9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImVsbGlwc2UiLGYuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6ZWE9ImFubm90YXRpb24iO2JhLmNvcmVHcmFwaCYmKGVhPWJhLm5vZGUuaGFzTm9uQ29udHJvbEVkZ2VzPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiKTtsZXQgY2E9W2YuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVRdO2JhLmlzRmFkZWRPdXQmJmNhLnB1c2goImZhZGVkLWVsbGlwc2UiKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwidXNlIixjYSkuYXR0cigieGxpbms6aHJlZiIsIiNvcC1zZXJpZXMtIitlYSsiLXN0YW1wIik7Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInJlY3QiLGYuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpLmF0dHIoInJ4IixiYS5yYWRpdXMpLmF0dHIoInJ5IixiYS5yYWRpdXMpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosCiJyZWN0IixmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKS5hdHRyKCJyeCIsYmEucmFkaXVzKS5hdHRyKCJyeSIsYmEucmFkaXVzKTticmVhaztjYXNlIGQuTm9kZVR5cGUuTUVUQTpmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwicmVjdCIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLGJhLnJhZGl1cykuYXR0cigicnkiLGJhLnJhZGl1cyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitiYS5ub2RlLnR5cGUpO31yZXR1cm4gWn1mdW5jdGlvbiBEKFope3N3aXRjaChaLm5vZGUudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk9QOnJldHVybiBmLkNsYXNzLk9QTk9ERTtjYXNlIGQuTm9kZVR5cGUuTUVUQTpyZXR1cm4gZi5DbGFzcy5NRVRBTk9ERTtjYXNlIGQuTm9kZVR5cGUuU0VSSUVTOnJldHVybiBmLkNsYXNzLlNFUklFU05PREU7Y2FzZSBkLk5vZGVUeXBlLkJSSURHRTpyZXR1cm4gZi5DbGFzcy5CUklER0VOT0RFO2Nhc2UgZC5Ob2RlVHlwZS5FTExJUFNJUzpyZXR1cm4gZi5DbGFzcy5FTExJUFNJU05PREV9dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrCloubm9kZS50eXBlKTt9ZnVuY3Rpb24gQihaLGJhKXt2YXIgZWE9Zi5zZWxlY3RDaGlsZChaLCJnIixmLkNsYXNzLk5vZGUuU0hBUEUpO2xldCBjYT1kLmxheW91dC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKGJhKTtzd2l0Y2goYmEubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuT1A6e2NvbnN0IGthPWJhLm5vZGU7Xy5pc051bWJlcihrYS5mdW5jdGlvbklucHV0SW5kZXgpfHxfLmlzTnVtYmVyKGthLmZ1bmN0aW9uT3V0cHV0SW5kZXgpPyhlYT1mLnNlbGVjdENoaWxkKGVhLCJwb2x5Z29uIiksZi5wb3NpdGlvblRyaWFuZ2xlKGVhLGJhLngsYmEueSxiYS5jb3JlQm94LndpZHRoLGJhLmNvcmVCb3guaGVpZ2h0KSk6KGVhPWYuc2VsZWN0Q2hpbGQoZWEsImVsbGlwc2UiKSxmLnBvc2l0aW9uRWxsaXBzZShlYSxjYSxiYS55LGJhLmNvcmVCb3gud2lkdGgsYmEuY29yZUJveC5oZWlnaHQpKTtDKFosY2EsYmEueSxiYS5sYWJlbE9mZnNldCk7YnJlYWt9Y2FzZSBkLk5vZGVUeXBlLk1FVEE6ZWE9CmVhLnNlbGVjdEFsbCgicmVjdCIpO2JhLmV4cGFuZGVkPyhmLnBvc2l0aW9uUmVjdChlYSxiYS54LGJhLnksYmEud2lkdGgsYmEuaGVpZ2h0KSx0KFosYmEpLEMoWixjYSxiYS55LC1iYS5oZWlnaHQvMitiYS5sYWJlbEhlaWdodC8yKSk6KGYucG9zaXRpb25SZWN0KGVhLGNhLGJhLnksYmEuY29yZUJveC53aWR0aCxiYS5jb3JlQm94LmhlaWdodCksQyhaLGNhLGJhLnksMCkpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6ZWE9Zi5zZWxlY3RDaGlsZChlYSwidXNlIik7YmEuZXhwYW5kZWQ/KGYucG9zaXRpb25SZWN0KGVhLGJhLngsYmEueSxiYS53aWR0aCxiYS5oZWlnaHQpLHQoWixiYSksQyhaLGNhLGJhLnksLWJhLmhlaWdodC8yK2JhLmxhYmVsSGVpZ2h0LzIpKTooZi5wb3NpdGlvblJlY3QoZWEsY2EsYmEueSxiYS5jb3JlQm94LndpZHRoLGJhLmNvcmVCb3guaGVpZ2h0KSxDKFosY2EsYmEueSxiYS5sYWJlbE9mZnNldCkpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6Wj0KZi5zZWxlY3RDaGlsZChlYSwicmVjdCIpO2YucG9zaXRpb25SZWN0KFosYmEueCxiYS55LGJhLndpZHRoLGJhLmhlaWdodCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitiYS5ub2RlLnR5cGUpO319ZnVuY3Rpb24gSShaLGJhLGVhKXtsZXQgY2E9Yi5ncmFwaC51dGlsLmVzY2FwZVF1ZXJ5U2VsZWN0b3IoWik7aWYoIWVhKXJldHVybmB1cmwoIyR7Y2F9KWA7ZWE9ZDMuc2VsZWN0KGVhKTtsZXQga2E9ZWEuc2VsZWN0KCJkZWZzI19ncmFwaC1ncmFkaWVudHMiKTtrYS5lbXB0eSgpJiYoa2E9ZWEuYXBwZW5kKCJkZWZzIikuYXR0cigiaWQiLCJfZ3JhcGgtZ3JhZGllbnRzIikpO2xldCBZPWthLnNlbGVjdCgibGluZWFyR3JhZGllbnQjIitjYSk7aWYoWS5lbXB0eSgpKXtZPWthLmFwcGVuZCgibGluZWFyR3JhZGllbnQiKS5hdHRyKCJpZCIsWik7WS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtsZXQgRWE9MDtfLmVhY2goYmEsdmE9PntsZXQgeGE9CnZhLmNvbG9yO1kuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixFYSkuYXR0cigic3RvcC1jb2xvciIseGEpO1kuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixFYSt2YS5wcm9wb3J0aW9uKS5hdHRyKCJzdG9wLWNvbG9yIix4YSk7RWErPXZhLnByb3BvcnRpb259KX1yZXR1cm5gdXJsKCMke2NhfSlgfWZ1bmN0aW9uIE4oWixiYSxlYSxjYSxrYSl7bGV0IFk9ZC5yZW5kZXIuTWV0YW5vZGVDb2xvcnM7c3dpdGNoKGJhKXtjYXNlIGxhLlNUUlVDVFVSRTpyZXR1cm4gZWEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBPyhiYT1lYS5ub2RlLnRlbXBsYXRlSWQsbnVsbD09PWJhP1kuVU5LTk9XTjpZLlNUUlVDVFVSRV9QQUxFVFRFKFooYmEpLGNhKSk6ZWEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/Y2E/WS5FWFBBTkRFRF9DT0xPUjoid2hpdGUiOmVhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuQlJJREdFP2VhLnN0cnVjdHVyYWw/IiNmMGUiOmVhLm5vZGUuaW5ib3VuZD8KIiMwZWYiOiIjZmUwIjpfLmlzTnVtYmVyKGVhLm5vZGUuZnVuY3Rpb25JbnB1dEluZGV4KT8iIzc5NTU0OCI6Xy5pc051bWJlcihlYS5ub2RlLmZ1bmN0aW9uT3V0cHV0SW5kZXgpPyIjMDA5Njg4Ijoid2hpdGUiO2Nhc2UgbGEuREVWSUNFOnJldHVybiBudWxsPT1lYS5kZXZpY2VDb2xvcnM/WS5VTktOT1dOOmNhP1kuRVhQQU5ERURfQ09MT1I6SSgiZGV2aWNlLSIrZWEubm9kZS5uYW1lLGVhLmRldmljZUNvbG9ycyxrYSk7Y2FzZSBsYS5YTEFfQ0xVU1RFUjpyZXR1cm4gbnVsbD09ZWEueGxhQ2x1c3RlckNvbG9ycz9ZLlVOS05PV046Y2E/WS5FWFBBTkRFRF9DT0xPUjpJKCJ4bGEtIitlYS5ub2RlLm5hbWUsZWEueGxhQ2x1c3RlckNvbG9ycyxrYSk7Y2FzZSBsYS5DT01QVVRFX1RJTUU6cmV0dXJuIGNhP1kuRVhQQU5ERURfQ09MT1I6ZWEuY29tcHV0ZVRpbWVDb2xvcnx8WS5VTktOT1dOO2Nhc2UgbGEuTUVNT1JZOnJldHVybiBjYT9ZLkVYUEFOREVEX0NPTE9SOmVhLm1lbW9yeUNvbG9yfHwKWS5VTktOT1dOO2Nhc2UgbGEuT1BfQ09NUEFUSUJJTElUWTpyZXR1cm4gbnVsbD09ZWEuY29tcGF0aWJpbGl0eUNvbG9ycz9ZLlVOS05PV046Y2E/WS5FWFBBTkRFRF9DT0xPUjpJKCJvcC1jb21wYXQtIitlYS5ub2RlLm5hbWUsZWEuY29tcGF0aWJpbGl0eUNvbG9ycyxrYSk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5rbm93biBjYXNlIHRvIGNvbG9yIG5vZGVzIGJ5Iik7fX1mdW5jdGlvbiBPKFosYmEsZWEsY2Epe2NhPWNhfHxmLkNsYXNzLk5vZGUuU0hBUEU7bGV0IGthPWVhLmlzTm9kZVNlbGVjdGVkKGJhLm5vZGUubmFtZSksWT1iYS5pc0luRXh0cmFjdHx8YmEuaXNPdXRFeHRyYWN0fHxiYS5pc0xpYnJhcnlGdW5jdGlvbixFYT1iYS5leHBhbmRlZCYmY2EhPT1mLkNsYXNzLkFubm90YXRpb24uTk9ERSx2YT1iYS5pc0ZhZGVkT3V0O1ouY2xhc3NlZCgiaGlnaGxpZ2h0ZWQiLGVhLmlzTm9kZUhpZ2hsaWdodGVkKGJhLm5vZGUubmFtZSkpO1ouY2xhc3NlZCgic2VsZWN0ZWQiLGthKTsKWi5jbGFzc2VkKCJleHRyYWN0IixZKTtaLmNsYXNzZWQoImV4cGFuZGVkIixFYSk7Wi5jbGFzc2VkKCJmYWRlZCIsdmEpO1o9Wi5zZWxlY3QoIi4iK2NhKyIgLiIrZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCk7YmE9TihlYS50ZW1wbGF0ZUluZGV4LGxhW2VhLmNvbG9yQnkudG9VcHBlckNhc2UoKV0sYmEsRWEsZWEuZ2V0R3JhcGhTdmdSb290KCkpO1ouc3R5bGUoImZpbGwiLGJhKTtaLnN0eWxlKCJzdHJva2UiLGthP251bGw6SChiYSkpfWZ1bmN0aW9uIEgoWil7cmV0dXJuInVybCI9PT1aLnN1YnN0cmluZygwLDMpP2QucmVuZGVyLk1ldGFub2RlQ29sb3JzLkdSQURJRU5UX09VVExJTkU6ZDMucmdiKFopLmRhcmtlcigpLnRvU3RyaW5nKCl9ZnVuY3Rpb24gSyhaLGJhKXtsZXQgZWE9W107Wj1iYS5nZXROb2RlQnlOYW1lKFopO2lmKFogaW5zdGFuY2VvZiBiLmdyYXBoLk9wTm9kZUltcGwpcmV0dXJuW1pdLmNvbmNhdChaLmluRW1iZWRkaW5ncyk7Wj1aLm1ldGFncmFwaC5ub2RlcygpOwpfLmVhY2goWixmdW5jdGlvbihjYSl7ZWE9ZWEuY29uY2F0KEsoY2EsYmEpKX0pO3JldHVybiBlYX1mdW5jdGlvbiBNKFosYmEsZWEsY2Epe2lmKGNhW2VhLm5hbWVdKXJldHVybiBjYTtjYVtlYS5uYW1lXT0hMDt2YXIga2E9ZWEuaW5wdXRzO2xldCBZPVgoYmEsZWEpO2QzLnNlbGVjdChaKS5zZWxlY3QoYC5ub2RlW2RhdGEtbmFtZT0iJHtZLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiLCEwKTtsZXQgRWE9e307Xy5lYWNoKGthLGZ1bmN0aW9uKEFhKXtBYT1iYS5nZXROb2RlQnlOYW1lKEFhLm5hbWUpO2lmKHZvaWQgMCE9PUFhKXtBYSBpbnN0YW5jZW9mIGQuTWV0YW5vZGVJbXBsJiYoQWE9Yi5ncmFwaC5nZXRTdHJpY3ROYW1lKEFhLm5hbWUpLEFhPWJhLmdldE5vZGVCeU5hbWUoQWEpKTt2YXIgRmE9WChiYSxBYSkseWE9RWFbRmEubmFtZV07eWE/eWEub3BOb2Rlcy5wdXNoKEFhKTpFYVtGYS5uYW1lXT17dmlzaWJsZVBhcmVudDpGYSxvcE5vZGVzOltBYV19fX0pOwpsZXQgdmE9e30seGE9W1ldO3ZhW1kubmFtZV09e3RyYWNlZDohMSxpbmRleDowLGNvbm5lY3Rpb25FbmRwb2ludHM6W119O2VhPVk7Zm9yKGthPTE7ZWEubmFtZSE9PWIuZ3JhcGguUk9PVF9OQU1FO2thKyspZWE9ZWEucGFyZW50Tm9kZSx2YVtlYS5uYW1lXT17dHJhY2VkOiExLGluZGV4OmthLGNvbm5lY3Rpb25FbmRwb2ludHM6W119LHhhW2thXT1lYTtfLmZvck93bihFYSxmdW5jdGlvbihBYSl7bGV0IEZhPUFhLnZpc2libGVQYXJlbnQ7Xy5lYWNoKEFhLm9wTm9kZXMsZnVuY3Rpb24oeWEpe2NhPU0oWixiYSx5YSxjYSl9KTtGYS5uYW1lIT09WS5uYW1lJiZMKFosRmEsdmEseGEpfSk7cmV0dXJuIGNhfWZ1bmN0aW9uIEwoWixiYSxlYSxjYSl7dmFyIGthPWJhLFk9YmE7Zm9yKGJhPVtdOyFlYVtrYS5uYW1lXTspWS5uYW1lIT09a2EubmFtZSYmYmEucHVzaChbWSxrYV0pLFk9a2Esa2E9a2EucGFyZW50Tm9kZTtlYT1lYVtrYS5uYW1lXS5pbmRleDtsZXQgRWE9Y2FbTWF0aC5tYXgoZWEtCjEsMCldLm5hbWU7WT1rYT1ZLm5hbWU7Y29uc3QgdmE9ZDMuc2VsZWN0KFopO3ZhLnNlbGVjdEFsbChgW2RhdGEtZWRnZT0iJHtZfS0tJHtFYX0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCk7Xy5lYWNoKGJhLGZ1bmN0aW9uKHhhKXt2YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7eGFbMF0ubmFtZX0tLSR7RWF9YCtgfn4ke3hhWzFdLm5hbWV9fn5PVVQiXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9KTtmb3IoWj0xO1o8ZWE7WisrKXZhLnNlbGVjdEFsbChgW2RhdGEtZWRnZT0iJHtrYX1+fiR7Y2FbWl0ubmFtZX1gK2B+fklOLS0ke2NhW1otMV0ubmFtZX0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9ZnVuY3Rpb24gUShaLGJhKXtsZXQgZWE9e307Xy5lYWNoKGJhLGZ1bmN0aW9uKGNhKXtjYT1aLmdldE5vZGVCeU5hbWUoY2EpO2NhPVgoWixjYSk7ZWFbY2EubmFtZV09Y2F9KTtyZXR1cm4gZWF9ZnVuY3Rpb24gVChaLApiYSl7Xy5mb3JPd24oYmEsZnVuY3Rpb24oZWEpe2Zvcig7ZWEubmFtZSE9PWIuZ3JhcGguUk9PVF9OQU1FOyl7Y29uc3QgY2E9ZDMuc2VsZWN0KFopLnNlbGVjdChgLm5vZGVbZGF0YS1uYW1lPSIke2VhLm5hbWV9Il1gKTshY2Eubm9kZXMoKS5sZW5ndGh8fGNhLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIpfHxjYS5jbGFzc2VkKCJzZWxlY3RlZCIpfHxjYS5jbGFzc2VkKCJvcCIpfHxjYS5jbGFzc2VkKCJpbnB1dC1wYXJlbnQiLCEwKTtlYT1lYS5wYXJlbnROb2RlfX0pfWZ1bmN0aW9uIFgoWixiYSl7bGV0IGVhPSExLGNhPWJhO2Zvcig7IWVhOylpZihiYT1jYSxjYT1iYS5wYXJlbnROb2RlLHZvaWQgMD09PWNhKWVhPSEwO2Vsc2V7bGV0IGthPVouZ2V0UmVuZGVyTm9kZUJ5TmFtZShjYS5uYW1lKTtrYSYmKGthLmV4cGFuZGVkfHxjYSBpbnN0YW5jZW9mIGQuT3BOb2RlSW1wbCkmJihlYT0hMCl9cmV0dXJuIGJhfWguYnVpbGRHcm91cD1mdW5jdGlvbihaLGJhLGVhKXtaPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLAoiZyIsZi5DbGFzcy5Ob2RlLkNPTlRBSU5FUikuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEoYmEsY2E9PmNhLm5vZGUubmFtZSsiOiIrY2Eubm9kZS50eXBlKTtaLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIixjYT0+Y2Eubm9kZS5uYW1lKS5lYWNoKGZ1bmN0aW9uKGNhKXtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpO2VhLmFkZE5vZGVHcm91cChjYS5ub2RlLm5hbWUsa2EpfSkubWVyZ2UoWikuYXR0cigiY2xhc3MiLGNhPT5mLkNsYXNzLk5vZGUuR1JPVVArIiAiK0QoY2EpKS5lYWNoKGZ1bmN0aW9uKGNhKXtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpO3ZhciBZPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChrYSwiZyIsZi5DbGFzcy5Bbm5vdGF0aW9uLklOQk9YKTtmLmFubm90YXRpb24uYnVpbGRHcm91cChZLGNhLmluQW5ub3RhdGlvbnMsY2EsZWEpO1k9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKGthLCJnIixmLkNsYXNzLkFubm90YXRpb24uT1VUQk9YKTsKZi5hbm5vdGF0aW9uLmJ1aWxkR3JvdXAoWSxjYS5vdXRBbm5vdGF0aW9ucyxjYSxlYSk7WT1HKGthLGNhLGYuQ2xhc3MuTm9kZS5TSEFQRSk7Y2Eubm9kZS5pc0dyb3VwTm9kZSYmbChZLGNhLGVhKTtwKFksY2EsZWEpO2soa2EsY2EsZWEpO1k9QShrYSxjYSxlYSk7cChZLGNhLGVhLGNhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQSk7TyhrYSxjYSxlYSk7QihrYSxjYSl9KTtaLmV4aXQoKS5lYWNoKGZ1bmN0aW9uKGNhKXtlYS5yZW1vdmVOb2RlR3JvdXAoY2Eubm9kZS5uYW1lKTtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpOzA8Y2EuaW5Bbm5vdGF0aW9ucy5saXN0Lmxlbmd0aCYma2Euc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uSU5CT1gpLnNlbGVjdEFsbCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLkdST1VQKS5lYWNoKFk9PntlYS5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoWSxjYSl9KTswPGNhLm91dEFubm90YXRpb25zLmxpc3QubGVuZ3RoJiZrYS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5PVVRCT1gpLnNlbGVjdEFsbCgiLiIrCmYuQ2xhc3MuQW5ub3RhdGlvbi5HUk9VUCkuZWFjaChZPT57ZWEucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKFksY2EpfSl9KS5yZW1vdmUoKTtyZXR1cm4gWn07aC5nZXRDb250ZXh0TWVudT1tO2guY2FuQmVJblNlcmllcz1uO2guZ2V0U2VyaWVzTmFtZT1xO2guZ2V0R3JvdXBTZXR0aW5nTGFiZWw9eDtoLmVuZm9yY2VMYWJlbFdpZHRoPXk7bGV0IGFhPW51bGw7aC5idWlsZFNoYXBlPUc7aC5ub2RlQ2xhc3M9RDtsZXQgbGE7KGZ1bmN0aW9uKFope1pbWi5TVFJVQ1RVUkU9MF09IlNUUlVDVFVSRSI7WltaLkRFVklDRT0xXT0iREVWSUNFIjtaW1ouWExBX0NMVVNURVI9Ml09IlhMQV9DTFVTVEVSIjtaW1ouQ09NUFVURV9USU1FPTNdPSJDT01QVVRFX1RJTUUiO1pbWi5NRU1PUlk9NF09Ik1FTU9SWSI7WltaLk9QX0NPTVBBVElCSUxJVFk9NV09Ik9QX0NPTVBBVElCSUxJVFkifSkobGE9aC5Db2xvckJ5fHwoaC5Db2xvckJ5PXt9KSk7aC5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zPWZ1bmN0aW9uKFope2QzLnNlbGVjdChaKS5zZWxlY3QoImRlZnMjX2dyYXBoLWdyYWRpZW50cyIpLnJlbW92ZSgpfTsKaC5nZXRGaWxsRm9yTm9kZT1OO2guc3R5bGl6ZT1PO2guZ2V0U3Ryb2tlRm9yRmlsbD1IO2gudXBkYXRlSW5wdXRUcmFjZT1mdW5jdGlvbihaLGJhLGVhLGNhKXtjb25zdCBrYT1kMy5zZWxlY3QoWik7a2Euc2VsZWN0QWxsKCIuaW5wdXQtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0IiwhMSk7a2Euc2VsZWN0QWxsKCIubm9uLWlucHV0IikuY2xhc3NlZCgibm9uLWlucHV0IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtcGFyZW50IikuY2xhc3NlZCgiaW5wdXQtcGFyZW50IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtY2hpbGQiKS5jbGFzc2VkKCJpbnB1dC1jaGlsZCIsITEpO2thLnNlbGVjdEFsbCgiLmlucHV0LWVkZ2UtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKTtrYS5zZWxlY3RBbGwoIi5ub24taW5wdXQtZWRnZS1oaWdobGlnaHQiKS5jbGFzc2VkKCJub24taW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKTtrYS5zZWxlY3RBbGwoIi5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQiKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQiLAohMSk7aWYoYmEmJmNhJiZlYSl7ZWE9SyhlYSxiYSk7dmFyIFk9e307Xy5lYWNoKGVhLGZ1bmN0aW9uKEVhKXtZPU0oWixiYSxFYSxZKX0pO2VhPU9iamVjdC5rZXlzKFkpO2VhPVEoYmEsZWEpO1QoWixlYSk7a2Euc2VsZWN0QWxsKCJnLm5vZGU6bm90KC5zZWxlY3RlZCk6bm90KC5pbnB1dC1oaWdobGlnaHQpOm5vdCguaW5wdXQtcGFyZW50KTpub3QoLmlucHV0LWNoaWxkcmVuKSIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITApLmVhY2goZnVuY3Rpb24oRWEpe2thLnNlbGVjdEFsbChgW2RhdGEtbmFtZT0iJHtFYS5ub2RlLm5hbWV9Il1gKS5jbGFzc2VkKCJub24taW5wdXQiLCEwKX0pO2thLnNlbGVjdEFsbCgiZy5lZGdlOm5vdCguaW5wdXQtZWRnZS1oaWdobGlnaHQpIikuY2xhc3NlZCgibm9uLWlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9fTtoLmdldFZpc2libGVQYXJlbnQ9WH0pKGYubm9kZXx8KGYubm9kZT17fSkpfSkoZC5zY2VuZXx8KGQuc2NlbmU9e30pKX0pKGIuZ3JhcGh8fAooYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9vcC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjbGFzcyBoe2lzTm90VHB1T3Aoayl7cmV0dXJuLTEhPWsudG9Mb3dlckNhc2UoKS5zZWFyY2goImNwdToiKXx8LTEhPWsudG9Mb3dlckNhc2UoKS5zZWFyY2goImdwdToiKT8hMDotMT09ay50b0xvd2VyQ2FzZSgpLnNlYXJjaCgidHB1Iil9b3BWYWxpZChrKXtyZXR1cm4gMD09ay5uYW1lLnNlYXJjaChkLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpfHwhay5vcHx8ay5kZXZpY2UmJnRoaXMuaXNOb3RUcHVPcChrLmRldmljZSl8fGsuZGV2aWNlJiYtMSE9ay5kZXZpY2Uuc2VhcmNoKCJUUFVfU1lTVEVNIik/ITA6Xy5pbmNsdWRlcyhoLldISVRFTElTVCxrLm9wKX19aC5XSElURUxJU1Q9IkFicyBBY29zIEFjb3NoIEFkZCBBZGROIEFkanVzdENvbnRyYXN0djIgQWRqdXN0SHVlIEFkanVzdFNhdHVyYXRpb24gQWxsIEFuZ2xlIEFueSBBcHByb3hpbWF0ZUVxdWFsIEFyZ01heCBBcmdNaW4gQXNpbiBBc2luaCBBc3NlcnQgQXNzaWduQWRkVmFyaWFibGVPcCBBc3NpZ25TdWJWYXJpYWJsZU9wIEFzc2lnblZhcmlhYmxlT3AgQXRhbiBBdGFuMiBBdGFuaCBBdmdQb29sIEF2Z1Bvb2wzRCBBdmdQb29sM0RHcmFkIEF2Z1Bvb2xHcmFkIEJhdGNoTWF0TXVsIEJhdGNoVG9TcGFjZSBCYXRjaFRvU3BhY2VORCBCaWFzQWRkIEJpYXNBZGRHcmFkIEJpYXNBZGRWMSBCaXRjYXN0IEJpdHdpc2VBbmQgQml0d2lzZU9yIEJpdHdpc2VYb3IgQnJvYWRjYXN0QXJncyBCcm9hZGNhc3RHcmFkaWVudEFyZ3MgQnVja2V0aXplIENhc3QgQ2VpbCBDaGVja051bWVyaWNzIENob2xlc2t5IENsaXBCeVZhbHVlIENvbXBsZXggQ29tcGxleEFicyBDb25jYXQgQ29uY2F0T2Zmc2V0IENvbmNhdFYyIENvbmogQ29uanVnYXRlVHJhbnNwb3NlIENvbnN0IENvbnRyb2xUcmlnZ2VyIENvbnYyRCBDb252MkRCYWNrcHJvcEZpbHRlciBDb252MkRCYWNrcHJvcElucHV0IENvbnYzRCBDb252M0RCYWNrcHJvcEZpbHRlclYyIENvbnYzREJhY2twcm9wSW5wdXRWMiBDb3MgQ29zaCBDcm9zcyBDcm9zc1JlcGxpY2FTdW0gQ3VtcHJvZCBDdW1zdW0gRGVwdGhUb1NwYWNlIERlcHRod2lzZUNvbnYyZE5hdGl2ZSBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0IERpYWcgRGlhZ1BhcnQgRGlnYW1tYSBEaXYgRHluYW1pY1N0aXRjaCBFbHUgRWx1R3JhZCBFbXB0eSBFcXVhbCBFcmYgRXJmYyBFeHAgRXhwYW5kRGltcyBFeHBtMSBFeHRyYWN0SW1hZ2VQYXRjaGVzIEZGVCBGRlQyRCBGRlQzRCBGYWtlUXVhbnRXaXRoTWluTWF4QXJncyBGYWtlUXVhbnRXaXRoTWluTWF4QXJnc0dyYWRpZW50IEZha2VRdWFudFdpdGhNaW5NYXhWYXJzIEZha2VRdWFudFdpdGhNaW5NYXhWYXJzR3JhZGllbnQgRmlsbCBGbG9vciBGbG9vckRpdiBGbG9vck1vZCBGdXNlZEJhdGNoTm9ybSBGdXNlZEJhdGNoTm9ybUdyYWQgRnVzZWRCYXRjaE5vcm1HcmFkVjIgRnVzZWRCYXRjaE5vcm1WMiBHYXRoZXIgR2F0aGVyTmQgR2F0aGVyVjIgR2V0SXRlbSBHcmVhdGVyIEdyZWF0ZXJFcXVhbCBIU1ZUb1JHQiBJRkZUIElGRlQyRCBJRkZUM0QgSVJGRlQgSVJGRlQyRCBJUkZGVDNEIElkZW50aXR5IElkZW50aXR5TiBJZiBJbWFnIEluZmVlZERlcXVldWUgSW5mZWVkRGVxdWV1ZVR1cGxlIElucGxhY2VBZGQgSW5wbGFjZVVwZGF0ZSBJbnYgSW52ZXJ0IEludmVydFBlcm11dGF0aW9uIElzRmluaXRlIElzSW5mIElzTmFuIEwyTG9zcyBMUk4gTFJOR3JhZCBMZWZ0U2hpZnQgTGVzcyBMZXNzRXF1YWwgTGdhbW1hIExpblNwYWNlIExpc3REaWZmIExvZyBMb2cxcCBMb2dTb2Z0bWF4IExvZ2ljYWxBbmQgTG9naWNhbE5vdCBMb2dpY2FsT3IgTWF0TXVsIE1hdHJpeEJhbmRQYXJ0IE1hdHJpeERpYWcgTWF0cml4RGlhZ1BhcnQgTWF0cml4U2V0RGlhZyBNYXRyaXhUcmlhbmd1bGFyU29sdmUgTWF4IE1heFBvb2wgTWF4UG9vbDNEIE1heFBvb2wzREdyYWQgTWF4UG9vbDNER3JhZEdyYWQgTWF4UG9vbEdyYWQgTWF4UG9vbEdyYWRHcmFkIE1heFBvb2xHcmFkR3JhZFYyIE1heFBvb2xHcmFkVjIgTWF4UG9vbFYyIE1heGltdW0gTWVhbiBNaW4gTWluaW11bSBNaXJyb3JQYWQgTW9kIE11bCBNdWx0aW5vbWlhbCBOZWcgTm9PcCBOb25NYXhTdXBwcmVzc2lvblY0IE5vdEVxdWFsIE9uZUhvdCBPbmVzTGlrZSBPdXRmZWVkRW5xdWV1ZSBPdXRmZWVkRW5xdWV1ZVR1cGxlIFBhY2sgUGFkIFBhZFYyIFBhcmFsbGVsRHluYW1pY1N0aXRjaCBQbGFjZWhvbGRlcldpdGhEZWZhdWx0IFBvdyBQcmV2ZW50R3JhZGllbnQgUHJvZCBRciBRdWFudGl6ZUFuZERlcXVhbnRpemVWMiBRdWFudGl6ZUFuZERlcXVhbnRpemVWMyBSRkZUIFJGRlQyRCBSRkZUM0QgUkdCVG9IU1YgUmFuZG9tU2h1ZmZsZSBSYW5kb21TdGFuZGFyZE5vcm1hbCBSYW5kb21Vbmlmb3JtIFJhbmRvbVVuaWZvcm1JbnQgUmFuZ2UgUmFuayBSZWFkVmFyaWFibGVPcCBSZWFsIFJlYWxEaXYgUmVjaXByb2NhbCBSZWNpcHJvY2FsR3JhZCBSZWN2VFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMgUmVsdSBSZWx1NiBSZWx1NkdyYWQgUmVsdUdyYWQgUmVzaGFwZSBSZXNpemVCaWxpbmVhciBSZXNpemVCaWxpbmVhckdyYWQgUmVzb3VyY2VBcHBseUFkYU1heCBSZXNvdXJjZUFwcGx5QWRhZGVsdGEgUmVzb3VyY2VBcHBseUFkYWdyYWQgUmVzb3VyY2VBcHBseUFkYWdyYWREQSBSZXNvdXJjZUFwcGx5QWRhbSBSZXNvdXJjZUFwcGx5QWRkU2lnbiBSZXNvdXJjZUFwcGx5Q2VudGVyZWRSTVNQcm9wIFJlc291cmNlQXBwbHlGdHJsIFJlc291cmNlQXBwbHlGdHJsVjIgUmVzb3VyY2VBcHBseUdyYWRpZW50RGVzY2VudCBSZXNvdXJjZUFwcGx5TW9tZW50dW0gUmVzb3VyY2VBcHBseVBvd2VyU2lnbiBSZXNvdXJjZUFwcGx5UHJveGltYWxBZGFncmFkIFJlc291cmNlQXBwbHlQcm94aW1hbEdyYWRpZW50RGVzY2VudCBSZXNvdXJjZUFwcGx5Uk1TUHJvcCBSZXNvdXJjZUdhdGhlciBSZXNvdXJjZVNjYXR0ZXJBZGQgUmVzb3VyY2VTY2F0dGVyRGl2IFJlc291cmNlU2NhdHRlck1heCBSZXNvdXJjZVNjYXR0ZXJNaW4gUmVzb3VyY2VTY2F0dGVyTXVsIFJlc291cmNlU2NhdHRlck5kQWRkIFJlc291cmNlU2NhdHRlck5kVXBkYXRlIFJlc291cmNlU2NhdHRlclN1YiBSZXNvdXJjZVNjYXR0ZXJVcGRhdGUgUmVzb3VyY2VTdHJpZGVkU2xpY2VBc3NpZ24gUmV2ZXJzZSBSZXZlcnNlU2VxdWVuY2UgUmV2ZXJzZVYyIFJpZ2h0U2hpZnQgUmludCBSb3VuZCBSc3FydCBSc3FydEdyYWQgU2NhdHRlck5kIFNlbGVjdCBTZWx1IFNlbHVHcmFkIFNlbmRUUFVFbWJlZGRpbmdHcmFkaWVudHMgU2hhcGUgU2hhcGVOIFNpZ21vaWQgU2lnbW9pZEdyYWQgU2lnbiBTaW4gU2luaCBTaXplIFNsaWNlIFNuYXBzaG90IFNvZnRtYXggU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMgU29mdHBsdXMgU29mdHBsdXNHcmFkIFNvZnRzaWduIFNvZnRzaWduR3JhZCBTcGFjZVRvQmF0Y2ggU3BhY2VUb0JhdGNoTkQgU3BhY2VUb0RlcHRoIFNwYXJzZU1hdE11bCBTcGFyc2VTb2Z0bWF4Q3Jvc3NFbnRyb3B5V2l0aExvZ2l0cyBTcGFyc2VUb0RlbnNlIFNwbGl0IFNwbGl0ViBTcXJ0IFNxcnRHcmFkIFNxdWFyZSBTcXVhcmVkRGlmZmVyZW5jZSBTcXVlZXplIFN0YWNrQ2xvc2VWMiBTdGFja1BvcFYyIFN0YWNrUHVzaFYyIFN0YWNrVjIgU3RhdGVsZXNzSWYgU3RhdGVsZXNzUmFuZG9tTm9ybWFsIFN0YXRlbGVzc1JhbmRvbVVuaWZvcm0gU3RhdGVsZXNzVHJ1bmNhdGVkTm9ybWFsIFN0YXRlbGVzc1doaWxlIFN0b3BHcmFkaWVudCBTdHJpZGVkU2xpY2UgU3RyaWRlZFNsaWNlR3JhZCBTdWIgU3VtIFN5bWJvbGljR3JhZGllbnQgVFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMgVGFuIFRhbmggVGFuaEdyYWQgVGVuc29yQXJyYXlDbG9zZVYzIFRlbnNvckFycmF5Q29uY2F0VjMgVGVuc29yQXJyYXlHYXRoZXJWMyBUZW5zb3JBcnJheUdyYWRWMyBUZW5zb3JBcnJheVJlYWRWMyBUZW5zb3JBcnJheVNjYXR0ZXJWMyBUZW5zb3JBcnJheVNpemVWMyBUZW5zb3JBcnJheVNwbGl0VjMgVGVuc29yQXJyYXlWMyBUZW5zb3JBcnJheVdyaXRlVjMgVGlsZSBUb3BLVjIgVHJhbnNwb3NlIFRydW5jYXRlRGl2IFRydW5jYXRlTW9kIFRydW5jYXRlZE5vcm1hbCBVbnBhY2sgVW5zb3J0ZWRTZWdtZW50TWF4IFVuc29ydGVkU2VnbWVudE1pbiBVbnNvcnRlZFNlZ21lbnRQcm9kIFVuc29ydGVkU2VnbWVudFN1bSBWYXJJc0luaXRpYWxpemVkT3AgVmFyaWFibGVTaGFwZSBXaGlsZSBYbGFEeW5hbWljVXBkYXRlU2xpY2UgWGxhSG9zdENvbXB1dGUgWGxhSWYgWGxhUmVjdiBYbGFSZWR1Y2VXaW5kb3cgWGxhU2VuZCBYbGFTb3J0IFhsYVdoaWxlIFplcm9zTGlrZSBFbnRlciBFeGl0IExvb3BDb25kIE1lcmdlIE5leHRJdGVyYXRpb24gU3dpdGNoIF9BcmcgX1BhcmFsbGVsQ29uY2F0VXBkYXRlIF9SZXR2YWwgX1RQVUNvbXBpbGUgX1RQVUV4ZWN1dGUgVFBVQ29tcGlsYXRpb25SZXN1bHQgVFBVUmVwbGljYXRlZElucHV0IFRQVVJlcGxpY2F0ZWRPdXRwdXQgVFBVUmVwbGljYXRlTWV0YWRhdGEgTWVyZ2VWMkNoZWNrcG9pbnRzIFJlc3RvcmVWMiBTYXZlVjIgQWJvcnQgQXNzZXJ0IEFzc2lnbiBQbGFjZWhvbGRlciBQbGFjZWhvbGRlclYyIFNoYXJkZWRGaWxlbmFtZSBTdHJpbmdKb2luIFZhcmlhYmxlIFZhcmlhYmxlVjIgVmFySGFuZGxlT3AgQXVkaW9TdW1tYXJ5IEF1ZGlvU3VtbWFyeVYyIERlYnVnTnVtZXJpY1N1bW1hcnkgSGlzdG9ncmFtU3VtbWFyeSBJbWFnZVN1bW1hcnkgTWVyZ2VTdW1tYXJ5IFNjYWxhclN1bW1hcnkgU3RhdHNBZ2dyZWdhdG9yU3VtbWFyeSIuc3BsaXQoIiAiKTsKZi5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXI9aDtmLmNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eT1mdW5jdGlvbihrLHQpe2lmKG51bGw9PT10KXRocm93IEVycm9yKCJDb21wYXRpYmlsaXR5IHByb3ZpZGVyIHJlcXVpcmVkLCBidXQgZ290OiAiK3QpO18uZWFjaChrLm5vZGVzLGw9PntsLmNvbXBhdGlibGU9dC5vcFZhbGlkKGwpO18uZWFjaChsLmluRW1iZWRkaW5ncyxwPT57cC5jb21wYXRpYmxlPXQub3BWYWxpZChwKX0pO18uZWFjaChsLm91dEVtYmVkZGluZ3MscD0+e3AuY29tcGF0aWJsZT10Lm9wVmFsaWQocCl9KX0pfX0pKGQub3B8fChkLm9wPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9wYXJzZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaCh1KXtpZigidHJ1ZSI9PT11KXJldHVybiEwO2lmKCJmYWxzZSI9PT11KXJldHVybiExO2lmKCciJz09PXVbMF0pcmV0dXJuIHUuc3Vic3RyaW5nKDEsdS5sZW5ndGgtMSk7bGV0IHg9cGFyc2VGbG9hdCh1KTtyZXR1cm4gaXNOYU4oeCk/dTp4fWZ1bmN0aW9uIGsodSl7cmV0dXJuIG5ldyBQcm9taXNlKCh4LEEpPT57ZmV0Y2godSkudGhlbih5PT57eS5vaz95LmFycmF5QnVmZmVyKCkudGhlbih4LEEpOnkudGV4dCgpLnRoZW4oQSxBKX0pfSl9ZnVuY3Rpb24gdCh1LHgsQT0xRTYseT0iXG4iKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odyxDKXtmdW5jdGlvbiBHKEQsQixJKXt2YXIgTj1JPj11LmJ5dGVMZW5ndGg7Qj1CLnNwbGl0KHkpO0JbMF09RCtCWzBdO2NvbnN0IE89Tj8iIjpCLnBvcCgpO2ZvcihsZXQgSCBvZiBCKXRyeXt4KEgpfWNhdGNoKEspe0MoSyk7cmV0dXJufU4/dyghMCk6CihEPW5ldyBCbG9iKFt1LnNsaWNlKEksSStBKV0pLE49bmV3IEZpbGVSZWFkZXIsTi5vbmxvYWQ9ZnVuY3Rpb24oSCl7RyhPLEgudGFyZ2V0LnJlc3VsdCxJK0EpfSxOLnJlYWRBc1RleHQoRCkpfUcoIiIsIiIsMCl9KX1mdW5jdGlvbiBsKHUpe3JldHVybiBtKHUsbil9ZnVuY3Rpb24gcCh1KXtyZXR1cm4gbSh1LHEpLnRoZW4oeD0+eC5zdGVwX3N0YXRzKX1mdW5jdGlvbiBtKHUseCl7ZnVuY3Rpb24gQShCKXtsZXQgST1CLmluZGV4T2YoIjoiKSxOPUIuc3Vic3RyaW5nKDAsSSkudHJpbSgpO0I9aChCLnN1YnN0cmluZyhJKzIpLnRyaW0oKSk7cmV0dXJue25hbWU6Tix2YWx1ZTpCfX1mdW5jdGlvbiB5KEIsSSxOLE8pe2xldCBIPUJbSV07bnVsbD09SD9CW0ldPU8uam9pbigiLiIpaW4geD9bTl06TjpBcnJheS5pc0FycmF5KEgpP0gucHVzaChOKTpCW0ldPVtILE5dfWxldCB3PXt9LEM9W10sRz1bXSxEPXc7cmV0dXJuIHQodSxmdW5jdGlvbihCKXtpZihCKXN3aXRjaChCPUIudHJpbSgpLApCW0IubGVuZ3RoLTFdKXtjYXNlICJ7IjpCPUIuc3Vic3RyaW5nKDAsQi5sZW5ndGgtMikudHJpbSgpO2xldCBJPXt9O0MucHVzaChEKTtHLnB1c2goQik7eShELEIsSSxHKTtEPUk7YnJlYWs7Y2FzZSAifSI6RD1DLnBvcCgpO0cucG9wKCk7YnJlYWs7ZGVmYXVsdDpCPUEoQikseShELEIubmFtZSxCLnZhbHVlLEcuY29uY2F0KEIubmFtZSkpfX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gd30pfWYuZmV0Y2hQYlR4dD1rO2YuZmV0Y2hBbmRQYXJzZU1ldGFkYXRhPWZ1bmN0aW9uKHUseCl7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5UYXNrKCgpPT5udWxsPT11P1Byb21pc2UucmVzb2x2ZShudWxsKTprKHUpLHgpLnRoZW4oQT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlBhcnNpbmcgbWV0YWRhdGEucGJ0eHQiLDYwLCgpPT5udWxsIT1BP3AoQSk6UHJvbWlzZS5yZXNvbHZlKG51bGwpLHgpKX07Zi5mZXRjaEFuZFBhcnNlR3JhcGhEYXRhPWZ1bmN0aW9uKHUseCxBKXtyZXR1cm4gYi5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlJlYWRpbmcgZ3JhcGggcGJ0eHQiLAo0MCwoKT0+eD9uZXcgUHJvbWlzZShmdW5jdGlvbih5LHcpe2xldCBDPW5ldyBGaWxlUmVhZGVyO0Mub25sb2FkPSgpPT55KEMucmVzdWx0KTtDLm9uZXJyb3I9KCk9PncoQy5lcnJvcik7Qy5yZWFkQXNBcnJheUJ1ZmZlcih4KX0pOmsodSksQSkudGhlbih5PT5iLmdyYXBoLnV0aWwucnVuQXN5bmNQcm9taXNlVGFzaygiUGFyc2luZyBncmFwaC5wYnR4dCIsNjAsKCk9PmwoeSksQSkpfTtmLnN0cmVhbVBhcnNlPXQ7Y29uc3Qgbj17ImxpYnJhcnkuZnVuY3Rpb24iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5pbnB1dCI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ciI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5mIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuZnVuYyI6ITAsCiJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5pIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QucyI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnNoYXBlIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3Quc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QudGVuc29yIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QudHlwZSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUudGVuc29yLnN0cmluZ192YWwiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUudGVuc29yLnRlbnNvcl9zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLnNpZ25hdHVyZS5pbnB1dF9hcmciOiEwLAoibGlicmFyeS5mdW5jdGlvbi5zaWduYXR1cmUub3V0cHV0X2FyZyI6ITAsImxpYnJhcnkudmVyc2lvbnMiOiEwLG5vZGU6ITAsIm5vZGUuaW5wdXQiOiEwLCJub2RlLmF0dHIiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5iIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuZiI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmZ1bmMiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5pIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QucyI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3Quc2hhcGUuZGltIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QudGVuc29yIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QudHlwZSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5zaGFwZS5kaW0iOiEwLCJub2RlLmF0dHIudmFsdWUudGVuc29yLnN0cmluZ192YWwiOiEwLCJub2RlLmF0dHIudmFsdWUudGVuc29yLnRlbnNvcl9zaGFwZS5kaW0iOiEwfSxxPXsic3RlcF9zdGF0cy5kZXZfc3RhdHMiOiEwLAoic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cyI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMub3V0cHV0IjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5tZW1vcnkiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm91dHB1dC50ZW5zb3JfZGVzY3JpcHRpb24uc2hhcGUuZGltIjohMH07Zi5wYXJzZUdyYXBoUGJUeHQ9bDtmLnBhcnNlU3RhdHNQYlR4dD1wfSkoZC5wYXJzZXJ8fChkLnBhcnNlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vcHJvdG8uanMKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vcmVuZGVyLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgoTCxRLFQsWCxhYSl7UT1uZXcgSShRLFQsWCxhYSwhMCk7TC5pbkFubm90YXRpb25zLnB1c2goUSl9ZnVuY3Rpb24gayhMLFEsVCxYLGFhKXtRPW5ldyBJKFEsVCxYLGFhLCExKTtMLm91dEFubm90YXRpb25zLnB1c2goUSl9ZnVuY3Rpb24gdChMLFEpe18uZWFjaChMLm5vZGVzKCksVD0+e1Q9TC5ub2RlKFQpO1QuZXhwYW5kZWQ9MTxRO2lmKDA8USlzd2l0Y2goVC5ub2RlLnR5cGUpe2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOmNhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6bChULFEtMSl9fSl9ZnVuY3Rpb24gbChMLFEpe0wuY29yZUdyYXBoJiZ0KEwuY29yZUdyYXBoLFEpfWZ1bmN0aW9uIHAoTCxRLFQpe2xldCBYPUwubm9kZShRKSxhYT1MLm5vZGUoVCksbGE9TC5lZGdlKFEsVCk7aWYoWC5ub2RlLmluY2x1ZGUhPT1kLkluY2x1c2lvblR5cGUuSU5DTFVERSYmYWEubm9kZS5pbmNsdWRlIT09ZC5JbmNsdXNpb25UeXBlLklOQ0xVREV8fApYLm5vZGUuaW5jbHVkZT09PWQuSW5jbHVzaW9uVHlwZS5FWENMVURFfHxhYS5ub2RlLmluY2x1ZGU9PT1kLkluY2x1c2lvblR5cGUuRVhDTFVERSlrKFgsYWEubm9kZSxhYSxsYSxOLlNIT1JUQ1VUKSxoKGFhLFgubm9kZSxYLGxhLE4uU0hPUlRDVVQpLEwucmVtb3ZlRWRnZShRLFQpfWZ1bmN0aW9uIG0oTCxRLFQpe2xldCBYPUwuY29yZUdyYXBoLGFhPVgubm9kZShRKTthYS5pc091dEV4dHJhY3Q9ITA7Xy5lYWNoKFgucHJlZGVjZXNzb3JzKFEpLGxhPT57cChYLGxhLFEpfSk7KEcuZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlfHxUKSYmXy5lYWNoKFguc3VjY2Vzc29ycyhRKSxsYT0+e3AoWCxRLGxhKX0pOzA9PT1YLm5laWdoYm9ycyhRKS5sZW5ndGgmJihhYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsTC5pc29sYXRlZE91dEV4dHJhY3QucHVzaChhYSksWC5yZW1vdmVOb2RlKFEpKX1mdW5jdGlvbiBuKEwsUSxUKXtsZXQgWD1MLmNvcmVHcmFwaCxhYT0KWC5ub2RlKFEpO2FhLmlzSW5FeHRyYWN0PSEwO18uZWFjaChYLnN1Y2Nlc3NvcnMoUSksbGE9PntwKFgsUSxsYSl9KTsoRy5kZXRhY2hBbGxFZGdlc0ZvckhpZ2hEZWdyZWV8fFQpJiZfLmVhY2goWC5wcmVkZWNlc3NvcnMoUSksbGE9PntwKFgsbGEsUSl9KTswPT09WC5uZWlnaGJvcnMoUSkubGVuZ3RoJiYoYWEubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLEwuaXNvbGF0ZWRJbkV4dHJhY3QucHVzaChhYSksWC5yZW1vdmVOb2RlKFEpKX1mdW5jdGlvbiBxKEwsUSl7aWYoTC50eXBlPT09ZC5Ob2RlVHlwZS5PUClmb3IodmFyIFQ9MDtUPFEubGVuZ3RoO1QrKyl7aWYoTC5vcD09PVFbVF0pcmV0dXJuITB9ZWxzZSBpZihMLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJihMPUwuZ2V0Um9vdE9wKCkpKWZvcihUPTA7VDxRLmxlbmd0aDtUKyspaWYoTC5vcD09PVFbVF0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gdShMKXtsZXQgUT1MLmNvcmVHcmFwaDtfLmVhY2goUS5ub2RlcygpLApUPT57US5ub2RlKFQpLm5vZGUuaW5jbHVkZSE9PWQuSW5jbHVzaW9uVHlwZS5FWENMVURFfHxULnN0YXJ0c1dpdGgoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKXx8KEwuY29yZUdyYXBoLm91dEVkZ2VzKFQpLmxlbmd0aD5MLmNvcmVHcmFwaC5pbkVkZ2VzKFQpLmxlbmd0aD9tKEwsVCwhMCk6bihMLFQsITApKX0pfWZ1bmN0aW9uIHgoTCl7bGV0IFE9TC5jb3JlR3JhcGg7Xy5lYWNoKFEubm9kZXMoKSxUPT57bGV0IFg9US5ub2RlKFQpO1gubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiZxKFgubm9kZSxHLm91dEV4dHJhY3RUeXBlcykmJm0oTCxUKX0pfWZ1bmN0aW9uIEEoTCl7bGV0IFE9TC5jb3JlR3JhcGg7Xy5lYWNoKFEubm9kZXMoKSxUPT57bGV0IFg9US5ub2RlKFQpO1gubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiZxKFgubm9kZSxHLmluRXh0cmFjdFR5cGVzKSYmbihMLFQpfSl9ZnVuY3Rpb24geShMKXtsZXQgUT0KTC5jb3JlR3JhcGgsVD17fSxYPXt9LGFhPTA7Xy5lYWNoKFEubm9kZXMoKSxrYT0+e2lmKFEubm9kZShrYSkubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEKXt2YXIgWT1fLnJlZHVjZShRLnByZWRlY2Vzc29ycyhrYSksKHZhLHhhKT0+e3hhPVEuZWRnZSh4YSxrYSkubWV0YWVkZ2U7cmV0dXJuIHZhKyh4YS5udW1SZWd1bGFyRWRnZXM/MTowKX0sMCk7MD09PVkmJjA8US5wcmVkZWNlc3NvcnMoa2EpLmxlbmd0aCYmKFk9US5wcmVkZWNlc3NvcnMoa2EpLmxlbmd0aCk7dmFyIEVhPV8ucmVkdWNlKFEuc3VjY2Vzc29ycyhrYSksKHZhLHhhKT0+e3hhPVEuZWRnZShrYSx4YSkubWV0YWVkZ2U7cmV0dXJuIHZhKyh4YS5udW1SZWd1bGFyRWRnZXM/MTowKX0sMCk7MD09PUVhJiYwPFEuc3VjY2Vzc29ycyhrYSkubGVuZ3RoJiYoRWE9US5zdWNjZXNzb3JzKGthKS5sZW5ndGgpO1Rba2FdPVk7WFtrYV09RWE7YWErK319KTtpZighKGFhPEcubWluTm9kZUNvdW50Rm9yRXh0cmFjdGlvbikpe3ZhciBsYT0KRy5taW5EZWdyZWVGb3JFeHRyYWN0aW9uLTEsWj1NYXRoLnJvdW5kKC43NSphYSksYmE9TWF0aC5yb3VuZCguMjUqYWEpLGVhPU9iamVjdC5rZXlzKFQpLnNvcnQoKGthLFkpPT5UW2thXS1UW1ldKSxjYT1UW2VhW1pdXTtjYT1jYStjYS1UW2VhW2JhXV07Y2E9TWF0aC5tYXgoY2EsbGEpO2ZvcihsZXQga2E9YWEtMTtUW2VhW2thXV0+Y2E7a2EtLSluKEwsZWFba2FdKTtlYT1PYmplY3Qua2V5cyhYKS5zb3J0KChrYSxZKT0+WFtrYV0tWFtZXSk7Wj1YW2VhW1pdXTtiYT1aKzQqKFotWFtlYVtiYV1dKTtiYT1NYXRoLm1heChiYSxsYSk7Zm9yKGxhPWFhLTE7WFtlYVtsYV1dPmJhO2xhLS0pKFo9US5ub2RlKGVhW2xhXSkpJiYhWi5pc0luRXh0cmFjdCYmbShMLGVhW2xhXSl9fWZ1bmN0aW9uIHcoTCl7bGV0IFE9TC5jb3JlR3JhcGgsVD17fTtfLmVhY2goUS5lZGdlcygpLFg9PntRLmVkZ2UoWCkubWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzfHwoKFRbWC52XT1UW1gudl18fFtdKS5wdXNoKFgpLAooVFtYLnddPVRbWC53XXx8W10pLnB1c2goWCkpfSk7Xy5lYWNoKFQsWD0+e1gubGVuZ3RoPkcubWF4Q29udHJvbERlZ3JlZSYmXy5lYWNoKFgsYWE9PnAoUSxhYS52LGFhLncpKX0pfWZ1bmN0aW9uIEMoTCl7dShMKTtHLm91dEV4dHJhY3RUeXBlcyYmeChMKTtHLmluRXh0cmFjdFR5cGVzJiZBKEwpO3koTCk7Ry5tYXhDb250cm9sRGVncmVlJiZ3KEwpO2xldCBRPUwuY29yZUdyYXBoO18uZWFjaChRLm5vZGVzKCksVD0+e2xldCBYPVEubm9kZShUKTt2YXIgYWE9US5uZWlnaGJvcnMoVCkubGVuZ3RoO2lmKFgubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiYwPT09YWEpe2FhPTA8WC5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aDtsZXQgbGE9MDxYLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg7WC5pc0luRXh0cmFjdD8oTC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSk6ClguaXNPdXRFeHRyYWN0PyhMLmlzb2xhdGVkT3V0RXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSk6Ry5leHRyYWN0SXNvbGF0ZWROb2Rlc1dpdGhBbm5vdGF0aW9uc09uT25lU2lkZSYmKGFhJiYhbGE/KFguaXNJbkV4dHJhY3Q9ITAsTC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSk6bGEmJiFhYSYmKFguaXNPdXRFeHRyYWN0PSEwLEwuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2goWCksWC5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsUS5yZW1vdmVOb2RlKFQpKSl9fSl9Zi5PcE5vZGVDb2xvcnM9e0RFRkFVTFRfRklMTDoiI2ZmZmZmZiIsREVGQVVMVF9TVFJPS0U6IiNiMmIyYjIiLENPTVBBVElCTEU6IiMwZjlkNTgiLElOQ09NUEFUSUJMRToiI2RiNDQzNyJ9O2YuTWV0YW5vZGVDb2xvcnM9CntERUZBVUxUX0ZJTEw6IiNkOWQ5ZDkiLERFRkFVTFRfU1RST0tFOiIjYTZhNmE2IixTQVRVUkFUSU9OOi42LExJR0hUTkVTUzouODUsRVhQQU5ERURfQ09MT1I6IiNmMGYwZjAiLEhVRVM6WzIyMCwxMDAsMTgwLDQwLDIwLDM0MCwyNjAsMzAwLDE0MCw2MF0sU1RSVUNUVVJFX1BBTEVUVEUoTCxRKXt2YXIgVD1mLk1ldGFub2RlQ29sb3JzLkhVRVM7TD1UW0wlVC5sZW5ndGhdO1Q9TWF0aC5zaW4oTCpNYXRoLlBJLzM2MCk7cmV0dXJuIGQzLmhzbChMLC4wMSooUT8zMDo5MC02MCpUKSwuMDEqKFE/OTU6ODApKS50b1N0cmluZygpfSxERVZJQ0VfUEFMRVRURShMKXtyZXR1cm4gZi5NZXRhbm9kZUNvbG9ycy5TVFJVQ1RVUkVfUEFMRVRURShMKX0sWExBX0NMVVNURVJfUEFMRVRURShMKXtyZXR1cm4gZi5NZXRhbm9kZUNvbG9ycy5TVFJVQ1RVUkVfUEFMRVRURShMKX0sVU5LTk9XTjoiI2VlZSIsR1JBRElFTlRfT1VUTElORToiIzg4OCJ9O2YuU2VyaWVzTm9kZUNvbG9ycz17REVGQVVMVF9GSUxMOiJ3aGl0ZSIsCkRFRkFVTFRfU1RST0tFOiIjYjJiMmIyIn07Y29uc3QgRz17ZW5hYmxlRXh0cmFjdGlvbjohMCxtaW5Ob2RlQ291bnRGb3JFeHRyYWN0aW9uOjE1LG1pbkRlZ3JlZUZvckV4dHJhY3Rpb246NSxtYXhDb250cm9sRGVncmVlOjQsbWF4QnJpZGdlUGF0aERlZ3JlZTo0LG91dEV4dHJhY3RUeXBlczpbIk5vT3AiXSxpbkV4dHJhY3RUeXBlczpbXSxkZXRhY2hBbGxFZGdlc0ZvckhpZ2hEZWdyZWU6ITAsZXh0cmFjdElzb2xhdGVkTm9kZXNXaXRoQW5ub3RhdGlvbnNPbk9uZVNpZGU6ITAsZW5hYmxlQnJpZGdlZ3JhcGg6ITAsbWluTWF4Q29sb3JzOlsiI2ZmZjVmMCIsIiNmYjZhNGEiXSxtYXhBbm5vdGF0aW9uczo1fSxEPW5ldyBSZWdFeHAoIl4oPzoiK2IuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCsiKT8oXFx3KylfW2EtejAtOV17OH0oPzpfXFxkKyk/JCIpO2NsYXNzIEJ7Y29uc3RydWN0b3IoTCxRKXt0aGlzLmhpZXJhcmNoeT1MO3RoaXMuZGlzcGxheWluZ1N0YXRzPQpRO3RoaXMuaW5kZXg9e307dGhpcy5yZW5kZXJlZE9wTmFtZXM9W107dGhpcy5jb21wdXRlU2NhbGVzKCk7dGhpcy5oYXNTdWJoaWVyYXJjaHk9e307dGhpcy5yb290PW5ldyBNKEwucm9vdCxMLmdyYXBoT3B0aW9ucyk7dGhpcy5pbmRleFtMLnJvb3QubmFtZV09dGhpcy5yb290O3RoaXMucmVuZGVyZWRPcE5hbWVzLnB1c2goTC5yb290Lm5hbWUpO3RoaXMuYnVpbGRTdWJoaWVyYXJjaHkoTC5yb290Lm5hbWUpO3RoaXMucm9vdC5leHBhbmRlZD0hMDt0aGlzLnRyYWNlSW5wdXRzPSExfWNvbXB1dGVTY2FsZXMoKXt0aGlzLmRldmljZUNvbG9yTWFwPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS5kZXZpY2VzKS5yYW5nZShfLm1hcChkMy5yYW5nZSh0aGlzLmhpZXJhcmNoeS5kZXZpY2VzLmxlbmd0aCksZi5NZXRhbm9kZUNvbG9ycy5ERVZJQ0VfUEFMRVRURSkpO3RoaXMueGxhQ2x1c3RlckNvbG9yTWFwPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS54bGFDbHVzdGVycykucmFuZ2UoXy5tYXAoZDMucmFuZ2UodGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RoKSwKZi5NZXRhbm9kZUNvbG9ycy5YTEFfQ0xVU1RFUl9QQUxFVFRFKSk7bGV0IEw9dGhpcy5oaWVyYXJjaHkucm9vdC5tZXRhZ3JhcGg7dmFyIFE9ZDMubWF4KEwubm9kZXMoKSxUPT57VD1MLm5vZGUoVCk7aWYobnVsbCE9VC5zdGF0cylyZXR1cm4gVC5zdGF0cy50b3RhbEJ5dGVzfSk7dGhpcy5tZW1vcnlVc2FnZVNjYWxlPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLFFdKS5yYW5nZShHLm1pbk1heENvbG9ycyk7UT1kMy5tYXgoTC5ub2RlcygpLFQ9PntUPUwubm9kZShUKTtpZihudWxsIT1ULnN0YXRzKXJldHVybiBULnN0YXRzLmdldFRvdGFsTWljcm9zKCl9KTt0aGlzLmNvbXB1dGVUaW1lU2NhbGU9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsUV0pLnJhbmdlKEcubWluTWF4Q29sb3JzKTt0aGlzLmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZT10aGlzLmhpZXJhcmNoeS5oYXNTaGFwZUluZm8/ZC5zY2VuZS5lZGdlLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRTpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSwKdGhpcy5oaWVyYXJjaHkubWF4TWV0YUVkZ2VTaXplXSkucmFuZ2UoW2Quc2NlbmUuZWRnZS5NSU5fRURHRV9XSURUSCxkLnNjZW5lLmVkZ2UuTUFYX0VER0VfV0lEVEhdKX1nZXRSZW5kZXJOb2RlQnlOYW1lKEwpe3JldHVybiB0aGlzLmluZGV4W0xdfWdldE5vZGVCeU5hbWUoTCl7cmV0dXJuIHRoaXMuaGllcmFyY2h5Lm5vZGUoTCl9Y29sb3JIaXN0b2dyYW0oTCxRKXtpZigwPE9iamVjdC5rZXlzKEwpLmxlbmd0aCl7Y29uc3QgVD1fLnN1bShPYmplY3Qua2V5cyhMKS5tYXAoWD0+TFtYXSkpO3JldHVybiBPYmplY3Qua2V5cyhMKS5tYXAoWD0+KHtjb2xvcjpRKFgpLHByb3BvcnRpb246TFtYXS9UfSkpfWNvbnNvbGUuaW5mbygibm8gcGFpcnMgZm91bmQhIik7cmV0dXJuIG51bGx9Z2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKEwpe2lmKCFMKXJldHVybiBudWxsO2lmKEwgaW4gdGhpcy5pbmRleClyZXR1cm4gdGhpcy5pbmRleFtMXTt2YXIgUT10aGlzLmhpZXJhcmNoeS5ub2RlKEwpOwppZighUSlyZXR1cm4gbnVsbDtsZXQgVD1RLmlzR3JvdXBOb2RlP25ldyBNKFEsdGhpcy5oaWVyYXJjaHkuZ3JhcGhPcHRpb25zKTpuZXcgSChRKTt0aGlzLmluZGV4W0xdPVQ7dGhpcy5yZW5kZXJlZE9wTmFtZXMucHVzaChMKTtRLnN0YXRzJiYoVC5tZW1vcnlDb2xvcj10aGlzLm1lbW9yeVVzYWdlU2NhbGUoUS5zdGF0cy50b3RhbEJ5dGVzKSxULmNvbXB1dGVUaW1lQ29sb3I9dGhpcy5jb21wdXRlVGltZVNjYWxlKFEuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKSkpO1QuaXNGYWRlZE91dD10aGlzLmRpc3BsYXlpbmdTdGF0cyYmIWIuZ3JhcGgudXRpbC5oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cyhRLnN0YXRzKTt2YXIgWD1udWxsLGFhPW51bGwsbGE9bnVsbDtpZihRLmlzR3JvdXBOb2RlKXtYPVEuZGV2aWNlSGlzdG9ncmFtO2FhPVEueGxhQ2x1c3Rlckhpc3RvZ3JhbTt2YXIgWj1RLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZTtRPVEuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7CmlmKDAhPVp8fDAhPVEpbGE9Wi8oWitRKX1lbHNlKFo9VC5ub2RlLmRldmljZSkmJihYPXtbWl06MX0pLChaPVQubm9kZS54bGFDbHVzdGVyKSYmKGFhPXtbWl06MX0pLFQubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5PUCYmKGxhPVQubm9kZS5jb21wYXRpYmxlPzE6MCk7WCYmKFQuZGV2aWNlQ29sb3JzPXRoaXMuY29sb3JIaXN0b2dyYW0oWCx0aGlzLmRldmljZUNvbG9yTWFwKSk7YWEmJihULnhsYUNsdXN0ZXJDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShhYSx0aGlzLnhsYUNsdXN0ZXJDb2xvck1hcCkpO251bGwhPWxhJiYoVC5jb21wYXRpYmlsaXR5Q29sb3JzPVt7Y29sb3I6Yi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEUscHJvcG9ydGlvbjpsYX0se2NvbG9yOmIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5JTkNPTVBBVElCTEUscHJvcG9ydGlvbjoxLWxhfV0pO3JldHVybiB0aGlzLmluZGV4W0xdfWdldE5lYXJlc3RWaXNpYmxlQW5jZXN0b3IoTCl7dmFyIFE9CmQuZ2V0SGllcmFyY2hpY2FsUGF0aChMKTtsZXQgVD0wLFg9bnVsbDtmb3IoO1Q8US5sZW5ndGgmJihMPVFbVF0sWD10aGlzLmdldFJlbmRlck5vZGVCeU5hbWUoTCksWC5leHBhbmRlZCk7VCsrKTtyZXR1cm4gVD09US5sZW5ndGgtMiYmKFE9UVtUKzFdLFguaW5Bbm5vdGF0aW9ucy5ub2RlTmFtZXNbUV18fFgub3V0QW5ub3RhdGlvbnMubm9kZU5hbWVzW1FdKT9ROkx9c2V0RGVwdGgoTCl7bCh0aGlzLnJvb3QsK0wpfWlzTm9kZUF1eGlsaWFyeShMKXtsZXQgUT10aGlzLmdldFJlbmRlck5vZGVCeU5hbWUoTC5ub2RlLnBhcmVudE5vZGUubmFtZSksVD1fLmZpbmQoUS5pc29sYXRlZEluRXh0cmFjdCxYPT5YLm5vZGUubmFtZT09PUwubm9kZS5uYW1lKTtpZihUKXJldHVybiEwO1Q9Xy5maW5kKFEuaXNvbGF0ZWRPdXRFeHRyYWN0LFg9Plgubm9kZS5uYW1lPT09TC5ub2RlLm5hbWUpO3JldHVybiEhVH1nZXROYW1lc09mUmVuZGVyZWRPcHMoKXtyZXR1cm4gdGhpcy5yZW5kZXJlZE9wTmFtZXN9Y2xvbmVBbmRBZGRGdW5jdGlvbk9wTm9kZShMLApRLFQsWCl7dmFyIGFhPVQubmFtZS5yZXBsYWNlKFEsWCk7bGV0IGxhPUwubWV0YWdyYXBoLm5vZGUoYWEpO2lmKGxhKXJldHVybiBsYTtsYT1uZXcgZC5PcE5vZGVJbXBsKHtuYW1lOmFhLGlucHV0OltdLGRldmljZTpULmRldmljZSxvcDpULm9wLGF0dHI6Xy5jbG9uZURlZXAoVC5hdHRyKX0pO2xhLmNhcmRpbmFsaXR5PVQuY2FyZGluYWxpdHk7bGEuaW5jbHVkZT1ULmluY2x1ZGU7bGEub3V0cHV0U2hhcGVzPV8uY2xvbmVEZWVwKFQub3V0cHV0U2hhcGVzKTtsYS54bGFDbHVzdGVyPVQueGxhQ2x1c3RlcjtsYS5mdW5jdGlvbklucHV0SW5kZXg9VC5mdW5jdGlvbklucHV0SW5kZXg7bGEuZnVuY3Rpb25PdXRwdXRJbmRleD1ULmZ1bmN0aW9uT3V0cHV0SW5kZXg7bGEuaW5wdXRzPVQuaW5wdXRzLm1hcChaPT57Y29uc3QgYmE9Xy5jbG9uZShaKTtiYS5uYW1lPVoubmFtZS5yZXBsYWNlKFEsWCk7cmV0dXJuIGJhfSk7bGEucGFyZW50Tm9kZT1MO0wubWV0YWdyYXBoLnNldE5vZGUobGEubmFtZSwKbGEpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUobGEubmFtZSxsYSk7YWE9Wj0+dGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKEwsUSxaLFgpO2xhLmluRW1iZWRkaW5ncz1ULmluRW1iZWRkaW5ncy5tYXAoYWEpO2xhLm91dEVtYmVkZGluZ3M9VC5vdXRFbWJlZGRpbmdzLm1hcChhYSk7cmV0dXJuIGxhfWNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGUoTCxRLFQsWCxhYSl7Y29uc3QgbGE9e307TD10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTCxRLFQsWCxhYSxsYSk7Xy5pc0VtcHR5KGxhKXx8dGhpcy5wYXRjaEVkZ2VzRnJvbUZ1bmN0aW9uT3V0cHV0cyhRLGxhKTtyZXR1cm4gTH1jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKEwsUSxULFgsYWEsbGEpe2NvbnN0IFo9Yi5ncmFwaC5jcmVhdGVNZXRhbm9kZShULm5hbWUucmVwbGFjZShYLGFhKSk7Wi5kZXB0aD1ULmRlcHRoO1ouY2FyZGluYWxpdHk9VC5jYXJkaW5hbGl0eTtaLnRlbXBsYXRlSWQ9ClQudGVtcGxhdGVJZDtaLm9wSGlzdG9ncmFtPV8uY2xvbmUoVC5vcEhpc3RvZ3JhbSk7Wi5kZXZpY2VIaXN0b2dyYW09Xy5jbG9uZShULmRldmljZUhpc3RvZ3JhbSk7Wi54bGFDbHVzdGVySGlzdG9ncmFtPV8uY2xvbmUoVC54bGFDbHVzdGVySGlzdG9ncmFtKTtaLmhhc05vbkNvbnRyb2xFZGdlcz1ULmhhc05vbkNvbnRyb2xFZGdlcztaLmluY2x1ZGU9VC5pbmNsdWRlO1oubm9kZUF0dHJpYnV0ZXM9Xy5jbG9uZShULm5vZGVBdHRyaWJ1dGVzKTtaLmFzc29jaWF0ZWRGdW5jdGlvbj1ULmFzc29jaWF0ZWRGdW5jdGlvbjtfLmVhY2goVC5tZXRhZ3JhcGgubm9kZXMoKSxiYT0+e2JhPVQubWV0YWdyYXBoLm5vZGUoYmEpO3N3aXRjaChiYS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuTUVUQTpiYT10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTCxRLGJhLFgsYWEsbGEpO2JhLnBhcmVudE5vZGU9WjtaLm1ldGFncmFwaC5zZXROb2RlKGJhLm5hbWUsYmEpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUoYmEubmFtZSwKYmEpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5PUDpiYT10aGlzLmNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUoWixYLGJhLGFhKTtfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uSW5wdXRJbmRleCkmJnRoaXMucGF0Y2hFZGdlc0ludG9GdW5jdGlvbklucHV0cyhRLGJhKTtfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uT3V0cHV0SW5kZXgpJiYobGFbYmEuZnVuY3Rpb25PdXRwdXRJbmRleF09YmEpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKGJhLm5hbWUrIiBpcyBvZGRseSBuZWl0aGVyIGEgbWV0YW5vZGUgbm9yIGFuIG9wbm9kZS4iKX19KTt0aGlzLmNsb25lTGlicmFyeU1ldGFub2RlRWRnZXMoVCxaLFgsYWEpO3JldHVybiBafWNsb25lTGlicmFyeU1ldGFub2RlRWRnZXMoTCxRLFQsWCl7Xy5lYWNoKEwubWV0YWdyYXBoLmVkZ2VzKCksYWE9PnthYT1MLm1ldGFncmFwaC5lZGdlKGFhKTtjb25zdCBsYT1hYS52LnJlcGxhY2UoVCxYKSxaPWFhLncucmVwbGFjZShULFgpLGJhPW5ldyBkLk1ldGFlZGdlSW1wbChsYSwKWik7YmEuaW5ib3VuZD1hYS5pbmJvdW5kO2JhLm51bVJlZ3VsYXJFZGdlcz1hYS5udW1SZWd1bGFyRWRnZXM7YmEubnVtQ29udHJvbEVkZ2VzPWFhLm51bUNvbnRyb2xFZGdlcztiYS5udW1SZWZFZGdlcz1hYS5udW1SZWZFZGdlcztiYS50b3RhbFNpemU9YWEudG90YWxTaXplO2FhLmJhc2VFZGdlTGlzdCYmKGJhLmJhc2VFZGdlTGlzdD1hYS5iYXNlRWRnZUxpc3QubWFwKGVhPT57Y29uc3QgY2E9Xy5jbG9uZShlYSk7Y2Eudj1lYS52LnJlcGxhY2UoVCxYKTtjYS53PWVhLncucmVwbGFjZShULFgpO3JldHVybiBjYX0pKTtRLm1ldGFncmFwaC5ub2RlKFopP1EubWV0YWdyYXBoLnNldEVkZ2UobGEsWixiYSk6US5tZXRhZ3JhcGguc2V0RWRnZShaLGxhLGJhKX0pfXBhdGNoRWRnZXNJbnRvRnVuY3Rpb25JbnB1dHMoTCxRKXtsZXQgVD1NYXRoLm1pbihRLmZ1bmN0aW9uSW5wdXRJbmRleCxMLmlucHV0cy5sZW5ndGgtMSk7Zm9yKHZhciBYPV8uY2xvbmUoTC5pbnB1dHNbVF0pO1guaXNDb250cm9sRGVwZW5kZW5jeTspVCsrLApYPUwuaW5wdXRzW1RdO1EuaW5wdXRzLnB1c2goWCk7WD10aGlzLmhpZXJhcmNoeS5nZXRQcmVkZWNlc3NvcnMoTC5uYW1lKTtsZXQgYWEsbGE9MDtfLmVhY2goWC5yZWd1bGFyLFo9PntsYSs9Wi5udW1SZWd1bGFyRWRnZXM7aWYobGE+VClyZXR1cm4gYWE9WiwhMX0pO18uZWFjaChhYS5iYXNlRWRnZUxpc3QsWj0+e1oudz09PUwubmFtZSYmKFoudz1RLm5hbWUpO1oudj09PUwubmFtZSYmKFoudj1RLm5hbWUpfSl9cGF0Y2hFZGdlc0Zyb21GdW5jdGlvbk91dHB1dHMoTCxRKXtjb25zdCBUPXRoaXMuaGllcmFyY2h5LmdldFN1Y2Nlc3NvcnMoTC5uYW1lKTtfLmVhY2goVC5yZWd1bGFyLFg9PntfLmVhY2goWC5iYXNlRWRnZUxpc3QsYWE9Pntjb25zdCBsYT10aGlzLmhpZXJhcmNoeS5ub2RlKGFhLncpO18uZWFjaChsYS5pbnB1dHMsWj0+e1oubmFtZT09PUwubmFtZSYmKFoubmFtZT1RW1oub3V0cHV0VGVuc29yS2V5XS5uYW1lLFoub3V0cHV0VGVuc29yS2V5PWFhLm91dHB1dFRlbnNvcktleSl9KX0pOwpfLmVhY2goWC5iYXNlRWRnZUxpc3QsYWE9PnthYS52PVFbYWEub3V0cHV0VGVuc29yS2V5XS5uYW1lO2FhLm91dHB1dFRlbnNvcktleT0iMCJ9KX0pfWJ1aWxkU3ViaGllcmFyY2h5KEwpe2lmKCEoTCBpbiB0aGlzLmhhc1N1YmhpZXJhcmNoeSkpe3RoaXMuaGFzU3ViaGllcmFyY2h5W0xdPSEwO3ZhciBRPXRoaXMuaW5kZXhbTF07aWYoUS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEF8fFEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMpe3ZhciBUPVEubm9kZS5tZXRhZ3JhcGgsWD1RLmNvcmVHcmFwaCxhYT1bXSxsYT1bXTtfLmlzRW1wdHkodGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucyl8fChfLmVhY2goVC5ub2RlcygpLHhhPT57Y29uc3QgQWE9VC5ub2RlKHhhKSxGYT10aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zW0FhLm9wXTtGYSYmMCE9PXhhLmluZGV4T2YoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmKHhhPXRoaXMuY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZShULApBYSxGYS5ub2RlLEZhLm5vZGUubmFtZSxBYS5uYW1lKSxhYS5wdXNoKEFhKSxsYS5wdXNoKHhhKSl9KSxfLmVhY2gobGEsKHhhLEFhKT0+e0FhPWFhW0FhXTt4YS5wYXJlbnROb2RlPUFhLnBhcmVudE5vZGU7VC5zZXROb2RlKEFhLm5hbWUseGEpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUoQWEubmFtZSx4YSl9KSk7Xy5lYWNoKFQubm9kZXMoKSx4YT0+e2xldCBBYT10aGlzLmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZSh4YSksRmE9QWEubm9kZTtYLnNldE5vZGUoeGEsQWEpO0ZhLmlzR3JvdXBOb2RlfHwoXy5lYWNoKEZhLmluRW1iZWRkaW5ncyx5YT0+e2xldCBTYT1uZXcgSyhudWxsKSxYYT1uZXcgSCh5YSk7aChBYSx5YSxYYSxTYSxOLkNPTlNUQU5UKTt0aGlzLmluZGV4W3lhLm5hbWVdPVhhfSksXy5lYWNoKEZhLm91dEVtYmVkZGluZ3MseWE9PntsZXQgU2E9bmV3IEsobnVsbCksWGE9bmV3IEgoeWEpO2soQWEseWEsWGEsU2EsTi5TVU1NQVJZKTt0aGlzLmluZGV4W3lhLm5hbWVdPQpYYX0pKX0pO18uZWFjaChULmVkZ2VzKCkseGE9Pnt2YXIgQWE9VC5lZGdlKHhhKTtBYT1uZXcgSyhBYSk7QWEuaXNGYWRlZE91dD10aGlzLmluZGV4W3hhLnZdLmlzRmFkZWRPdXR8fHRoaXMuaW5kZXhbeGEud10uaXNGYWRlZE91dDtYLnNldEVkZ2UoeGEudix4YS53LEFhKX0pO0cuZW5hYmxlRXh0cmFjdGlvbiYmUS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJkMoUSk7Xy5pc0VtcHR5KHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMpfHx0aGlzLmJ1aWxkU3ViaGllcmFyY2hpZXNGb3JOZWVkZWRGdW5jdGlvbnMoVCk7TD09PWIuZ3JhcGguUk9PVF9OQU1FJiZfLmZvck93bih0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zLHhhPT57eGE9eGEubm9kZTtjb25zdCBBYT10aGlzLmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZSh4YS5uYW1lKTtRLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LnB1c2goQWEpO0FhLm5vZGUuaW5jbHVkZT1kLkluY2x1c2lvblR5cGUuRVhDTFVERTsKWC5yZW1vdmVOb2RlKHhhLm5hbWUpfSk7dmFyIFo9US5ub2RlLnBhcmVudE5vZGU7aWYoWil7dmFyIGJhPXRoaXMuaW5kZXhbWi5uYW1lXSxlYT0oeGEsLi4uQWEpPT5BYS5jb25jYXQoW3hhPyJJTiI6Ik9VVCJdKS5qb2luKCJ+fiIpLGNhPXRoaXMuaGllcmFyY2h5LmdldEJyaWRnZWdyYXBoKEwpLGthPXt9LFk9e30sRWE9e307Xy5lYWNoKGNhLmVkZ2VzKCkseGE9PntsZXQgQWE9ISFULm5vZGUoeGEudyksRmE9QWE/eGEudjp4YS53O2NhLmVkZ2UoeGEpLm51bVJlZ3VsYXJFZGdlcz9BYT9ZW0ZhXT0oWVtGYV18fDApKzE6a2FbRmFdPShrYVtGYV18fDApKzE6RWFbRmFdPShFYVtGYV18fDApKzF9KTt2YXIgdmE9dGhpcy5oaWVyYXJjaHkuZ2V0Tm9kZU1hcCgpO18uZWFjaChjYS5lZGdlcygpLHhhPT57dmFyIEFhPWNhLmVkZ2UoeGEpO2xldCBGYT0hIVQubm9kZSh4YS53KSxbeWEsU2FdPUZhP1t4YS53LHhhLnZdOlt4YS52LHhhLnddO3ZhciBYYT10aGlzLmluZGV4W3lhXSx1Yj10aGlzLmluZGV4W1NhXSwKQmI9dWI/dWIubm9kZTp2YVtTYV0scWI9IUFhLm51bVJlZ3VsYXJFZGdlcyYmRWFbU2FdPkcubWF4Q29udHJvbERlZ3JlZSxbLHpiXT1GYT9bUS5pbkFubm90YXRpb25zLFhhLmluQW5ub3RhdGlvbnNdOltRLm91dEFubm90YXRpb25zLFhhLm91dEFubm90YXRpb25zXTtsZXQgdmI9KEZhP1k6a2EpW1NhXT5HLm1heEJyaWRnZVBhdGhEZWdyZWU7eGE9bnVsbDt2YXIgR2I9ITE7Ry5lbmFibGVCcmlkZ2VncmFwaCYmIXZiJiYhcWImJlhhLmlzSW5Db3JlKCkmJihHYj1OYj0+YmEuY29yZUdyYXBoLmVkZ2UoRmE/e3Y6TmIsdzpMfTp7djpMLHc6TmJ9KSwoeGE9R2IoU2EpKXx8KHhhPUdiKGVhKEZhLFNhLFoubmFtZSkpKSxHYj0hIXhhKTtYYT0hMTtpZih4YSYmIUFhLm51bVJlZ3VsYXJFZGdlcyl7WGE9eGE7Zm9yKHFiPWJhLm5vZGU7WGEuYWRqb2luaW5nTWV0YWVkZ2U7KVhhPVhhLmFkam9pbmluZ01ldGFlZGdlLHFiPXFiLnBhcmVudE5vZGU7cWI9dGhpcy5oaWVyYXJjaHkuZ2V0VG9wb2xvZ2ljYWxPcmRlcmluZyhxYi5uYW1lKTsKWGE9WGEubWV0YWVkZ2U7WGE9cWJbWGEudl0+cWJbWGEud119R2ImJiFYYT8oQmI9ZWEoRmEsTCksdWI9ZWEoRmEsU2EsTCksemI9WC5ub2RlKHViKSx6Ynx8KEdiPVgubm9kZShCYiksR2J8fChHYj1uZXcgSCh7bmFtZTpCYix0eXBlOmQuTm9kZVR5cGUuQlJJREdFLGlzR3JvdXBOb2RlOiExLGNhcmRpbmFsaXR5OjAscGFyZW50Tm9kZTpudWxsLHN0YXRzOm51bGwsaW5jbHVkZTpkLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQsaW5ib3VuZDpGYSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbQmJdPUdiLFguc2V0Tm9kZShCYixHYikpLHpiPW5ldyBIKHtuYW1lOnViLHR5cGU6ZC5Ob2RlVHlwZS5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOkZhLG5vZGVBdHRyaWJ1dGVzOnt9fSksdGhpcy5pbmRleFt1Yl09emIsWC5zZXROb2RlKHViLAp6YiksWC5zZXRQYXJlbnQodWIsQmIpLEdiLm5vZGUuY2FyZGluYWxpdHkrKyksQWE9bmV3IEsoQWEpLEFhLmFkam9pbmluZ01ldGFlZGdlPXhhLEZhP1guc2V0RWRnZSh1Yix5YSxBYSk6WC5zZXRFZGdlKHlhLHViLEFhKSk6emIucHVzaChuZXcgSShCYix1YixuZXcgSyhBYSksTi5TSE9SVENVVCxGYSkpfSk7Xy5lYWNoKFshMCwhMV0seGE9PntsZXQgQWE9ZWEoeGEsTCksRmE9WC5ub2RlKEFhKTtGYSYmXy5lYWNoKFgubm9kZXMoKSx5YT0+e2lmKFgubm9kZSh5YSkubm9kZS50eXBlIT09ZC5Ob2RlVHlwZS5CUklER0UmJih4YT8hWC5wcmVkZWNlc3NvcnMoeWEpLmxlbmd0aDohWC5zdWNjZXNzb3JzKHlhKS5sZW5ndGgpKXt2YXIgU2E9ZWEoeGEsTCwiU1RSVUNUVVJBTF9UQVJHRVQiKSxYYT1YLm5vZGUoU2EpO1hhfHwoWGE9bmV3IEgoe25hbWU6U2EsdHlwZTpkLk5vZGVUeXBlLkJSSURHRSxpc0dyb3VwTm9kZTohMSxjYXJkaW5hbGl0eToxLHBhcmVudE5vZGU6bnVsbCxzdGF0czpudWxsLAppbmNsdWRlOmQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOnhhLG5vZGVBdHRyaWJ1dGVzOnt9fSksWGEuc3RydWN0dXJhbD0hMCx0aGlzLmluZGV4W1NhXT1YYSxYLnNldE5vZGUoU2EsWGEpLEZhLm5vZGUuY2FyZGluYWxpdHkrKyxYLnNldFBhcmVudChTYSxBYSkpO1hhPW5ldyBLKG51bGwpO1hhLnN0cnVjdHVyYWw9ITA7WGEud2VpZ2h0LS07eGE/WC5zZXRFZGdlKFNhLHlhLFhhKTpYLnNldEVkZ2UoeWEsU2EsWGEpfX0pfSl9fX19YnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyhMKXtfLmVhY2goTC5lZGdlcygpLFE9PntRPUwuZWRnZShRKTtRPW5ldyBLKFEpO18uZm9yRWFjaChRLm1ldGFlZGdlLmJhc2VFZGdlTGlzdCxUPT57dmFyIFg9VC52LnNwbGl0KGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKTtmb3IodmFyIGFhPVgubGVuZ3RoOzA8PWFhO2FhLS0pe1Q9WC5zbGljZSgwLGFhKTtjb25zdCBsYT10aGlzLmhpZXJhcmNoeS5ub2RlKFQuam9pbihiLmdyYXBoLk5BTUVTUEFDRV9ERUxJTSkpOwppZihsYSl7aWYobGEudHlwZT09PWQuTm9kZVR5cGUuT1AmJnRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbbGEub3BdKWZvcihYPTE7WDxULmxlbmd0aDtYKyspKGFhPVQuc2xpY2UoMCxYKS5qb2luKGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSkmJnRoaXMuYnVpbGRTdWJoaWVyYXJjaHkoYWEpO2JyZWFrfX19KX0pfX1mLlJlbmRlckdyYXBoSW5mbz1CO2NsYXNzIEl7Y29uc3RydWN0b3IoTCxRLFQsWCxhYSl7dGhpcy5ub2RlPUw7dGhpcy5yZW5kZXJOb2RlSW5mbz1RO3RoaXMucmVuZGVyTWV0YWVkZ2VJbmZvPVQ7dGhpcy5hbm5vdGF0aW9uVHlwZT1YO3RoaXMuaGVpZ2h0PXRoaXMud2lkdGg9dGhpcy5keT10aGlzLmR4PTA7VCYmVC5tZXRhZWRnZSYmKHRoaXMudj1ULm1ldGFlZGdlLnYsdGhpcy53PVQubWV0YWVkZ2Uudyk7dGhpcy5pc0luPWFhO3RoaXMucG9pbnRzPVtdfX1mLkFubm90YXRpb249STtsZXQgTjsoZnVuY3Rpb24oTCl7TFtMLlNIT1JUQ1VUPTBdPSJTSE9SVENVVCI7CkxbTC5DT05TVEFOVD0xXT0iQ09OU1RBTlQiO0xbTC5TVU1NQVJZPTJdPSJTVU1NQVJZIjtMW0wuRUxMSVBTSVM9M109IkVMTElQU0lTIn0pKE49Zi5Bbm5vdGF0aW9uVHlwZXx8KGYuQW5ub3RhdGlvblR5cGU9e30pKTtjbGFzcyBPe2NvbnN0cnVjdG9yKCl7dGhpcy5saXN0PVtdO3RoaXMubm9kZU5hbWVzPXt9fXB1c2goTCl7aWYoIShMLm5vZGUubmFtZSBpbiB0aGlzLm5vZGVOYW1lcykpaWYodGhpcy5ub2RlTmFtZXNbTC5ub2RlLm5hbWVdPSEwLHRoaXMubGlzdC5sZW5ndGg8Ry5tYXhBbm5vdGF0aW9ucyl0aGlzLmxpc3QucHVzaChMKTtlbHNle3ZhciBRPXRoaXMubGlzdFt0aGlzLmxpc3QubGVuZ3RoLTFdO1EuYW5ub3RhdGlvblR5cGU9PT1OLkVMTElQU0lTPyhMPVEubm9kZSxMLnNldE51bU1vcmVOb2RlcygrK0wubnVtTW9yZU5vZGVzKSk6KFE9bmV3IGIuZ3JhcGguRWxsaXBzaXNOb2RlSW1wbCgxKSx0aGlzLmxpc3QucHVzaChuZXcgSShRLG5ldyBIKFEpLG51bGwsTi5FTExJUFNJUywKTC5pc0luKSkpfX19Zi5Bbm5vdGF0aW9uTGlzdD1PO2NsYXNzIEh7Y29uc3RydWN0b3IoTCl7dGhpcy5ub2RlPUw7dGhpcy5leHBhbmRlZD0hMTt0aGlzLmluQW5ub3RhdGlvbnM9bmV3IE87dGhpcy5vdXRBbm5vdGF0aW9ucz1uZXcgTzt0aGlzLm91dGJveFdpZHRoPXRoaXMuaW5ib3hXaWR0aD10aGlzLmhlaWdodD10aGlzLndpZHRoPXRoaXMueT10aGlzLng9MDt0aGlzLnN0cnVjdHVyYWw9dGhpcy5leGNsdWRlZD0hMTt0aGlzLnBhZGRpbmdCb3R0b209dGhpcy5wYWRkaW5nUmlnaHQ9dGhpcy5wYWRkaW5nTGVmdD10aGlzLnBhZGRpbmdUb3A9dGhpcy5sYWJlbEhlaWdodD10aGlzLnJhZGl1cz10aGlzLmxhYmVsT2Zmc2V0PTA7dGhpcy5pc091dEV4dHJhY3Q9dGhpcy5pc0luRXh0cmFjdD0hMTt0aGlzLmNvcmVCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMuaXNGYWRlZE91dD0hMTt0aGlzLmRpc3BsYXlOYW1lPUwubmFtZS5zdWJzdHJpbmcoTC5uYW1lLmxhc3RJbmRleE9mKGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSsKMSk7TC50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBJiZMLmFzc29jaWF0ZWRGdW5jdGlvbiYmKChMPXRoaXMuZGlzcGxheU5hbWUubWF0Y2goRCkpP3RoaXMuZGlzcGxheU5hbWU9TFsxXTpfLnN0YXJ0c1dpdGgodGhpcy5kaXNwbGF5TmFtZSxiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpJiYodGhpcy5kaXNwbGF5TmFtZT10aGlzLmRpc3BsYXlOYW1lLnN1YnN0cmluZyhiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgubGVuZ3RoKSkpfWlzSW5Db3JlKCl7cmV0dXJuIXRoaXMuaXNJbkV4dHJhY3QmJiF0aGlzLmlzT3V0RXh0cmFjdCYmIXRoaXMuaXNMaWJyYXJ5RnVuY3Rpb259fWYuUmVuZGVyTm9kZUluZm89SDtjbGFzcyBLe2NvbnN0cnVjdG9yKEwpe3RoaXMubWV0YWVkZ2U9TDt0aGlzLmFkam9pbmluZ01ldGFlZGdlPW51bGw7dGhpcy5zdHJ1Y3R1cmFsPSExO3RoaXMud2VpZ2h0PTE7dGhpcy5pc0ZhZGVkT3V0PSExfX1mLlJlbmRlck1ldGFlZGdlSW5mbz0KSztjbGFzcyBNIGV4dGVuZHMgSHtjb25zdHJ1Y3RvcihMLFEpe3N1cGVyKEwpO0w9TC5tZXRhZ3JhcGguZ3JhcGgoKTtRLmNvbXBvdW5kPSEwO3RoaXMuY29yZUdyYXBoPWQuY3JlYXRlR3JhcGgoTC5uYW1lLGQuR3JhcGhUeXBlLkNPUkUsUSk7dGhpcy5pbkV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMub3V0RXh0cmFjdEJveD17d2lkdGg6MCxoZWlnaHQ6MH07dGhpcy5saWJyYXJ5RnVuY3Rpb25zQm94PXt3aWR0aDowLGhlaWdodDowfTt0aGlzLmlzb2xhdGVkSW5FeHRyYWN0PVtdO3RoaXMuaXNvbGF0ZWRPdXRFeHRyYWN0PVtdO3RoaXMubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3Q9W119fWYuUmVuZGVyR3JvdXBOb2RlSW5mbz1NO2YubWFrZUluRXh0cmFjdD1uO2YubWFwSW5kZXhUb0h1ZT1mdW5jdGlvbihMKXtyZXR1cm4gMSs1NzkuMjU2MTY3OTcyNSpMJTM1OH07Zi5leHBhbmRVbnRpbE5vZGVJc1Nob3duPWZ1bmN0aW9uKEwsUSl7dmFyIFQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNjZW5lIik7ClE9US5zcGxpdCgiLyIpO3ZhciBYPVFbUS5sZW5ndGgtMV0ubWF0Y2goLyguKik6XHcrLyk7Mj09PVgubGVuZ3RoJiYoUVtRLmxlbmd0aC0xXT1YWzFdKTtYPVFbMF07bGV0IGFhPUwuZ2V0UmVuZGVyTm9kZUJ5TmFtZShYKTtmb3IobGV0IGxhPTE7bGE8US5sZW5ndGgmJmFhLm5vZGUudHlwZSE9PWIuZ3JhcGguTm9kZVR5cGUuT1A7bGErKylMLmJ1aWxkU3ViaGllcmFyY2h5KFgpLGFhLmV4cGFuZGVkPSEwLFQuc2V0Tm9kZUV4cGFuZGVkKGFhKSxYKz0iLyIrUVtsYV0sYWE9TC5nZXRSZW5kZXJOb2RlQnlOYW1lKFgpO3JldHVybiBhYS5ub2RlLm5hbWV9fSkoZC5yZW5kZXJ8fChkLnJlbmRlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vc2NlbmUuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChxLHUseCxBKXt2YXIgeT1rKHEsdSx4KTtpZigheS5lbXB0eSgpKXJldHVybiB5O3U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdSk7aWYoeCBpbnN0YW5jZW9mIEFycmF5KWZvcih5PTA7eTx4Lmxlbmd0aDt5KyspdS5jbGFzc0xpc3QuYWRkKHhbeV0pO2Vsc2UgdS5jbGFzc0xpc3QuYWRkKHgpO0E/cS5ub2RlKCkuaW5zZXJ0QmVmb3JlKHUsQSk6cS5ub2RlKCkuYXBwZW5kQ2hpbGQodSk7cmV0dXJuIGQzLnNlbGVjdCh1KS5kYXR1bShxLmRhdHVtKCkpfWZ1bmN0aW9uIGsocSx1LHgpe3E9cS5ub2RlKCkuY2hpbGROb2Rlcztmb3IobGV0IEE9MDtBPHEubGVuZ3RoO0ErKyl7bGV0IHk9cVtBXTtpZih5LnRhZ05hbWU9PT11KWlmKHggaW5zdGFuY2VvZiBBcnJheSl7bGV0IHc9ITA7Zm9yKGxldCBDPTA7Qzx4Lmxlbmd0aDtDKyspdz13JiZ5LmNsYXNzTGlzdC5jb250YWlucyh4W0NdKTsKaWYodylyZXR1cm4gZDMuc2VsZWN0KHkpfWVsc2UgaWYoIXh8fHkuY2xhc3NMaXN0LmNvbnRhaW5zKHgpKXJldHVybiBkMy5zZWxlY3QoeSl9cmV0dXJuIGQzLnNlbGVjdChudWxsKX1mdW5jdGlvbiB0KHEsdSl7bGV0IHg9dS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUz8wOmQubGF5b3V0LlBBUkFNUy5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0O2woayhxLCJnIixmLkNsYXNzLlNjZW5lLkNPUkUpLDAseCk7dmFyIEE9MDx1Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCx5PTA8dS5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoO2xldCB3PTA8dS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgsQz1kLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldCxHPTA7QSYmKEcrPXUub3V0RXh0cmFjdEJveC53aWR0aCk7eSYmKEcrPXUub3V0RXh0cmFjdEJveC53aWR0aCk7QSYmKEE9dS5jb3JlQm94LndpZHRoLEE9RzxkLmxheW91dC5NSU5fQVVYX1dJRFRIPwpBLWQubGF5b3V0Lk1JTl9BVVhfV0lEVEgrdS5pbkV4dHJhY3RCb3gud2lkdGgvMjpBLXUuaW5FeHRyYWN0Qm94LndpZHRoLzItdS5vdXRFeHRyYWN0Qm94LndpZHRoLSh5P0M6MCksQT1BLXUubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC0odz9DOjApLGwoayhxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCksQSx4KSk7eSYmKHk9dS5jb3JlQm94LndpZHRoLHk9RzxkLmxheW91dC5NSU5fQVVYX1dJRFRIP3ktZC5sYXlvdXQuTUlOX0FVWF9XSURUSCt1Lm91dEV4dHJhY3RCb3gud2lkdGgvMjp5LXUub3V0RXh0cmFjdEJveC53aWR0aC8yLHk9eS11LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKHc/QzowKSxsKGsocSwiZyIsZi5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKSx5LHgpKTt3JiYodT11LmNvcmVCb3gud2lkdGgtdS5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoLzIsbChrKHEsImciLGYuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksdSx4KSl9ZnVuY3Rpb24gbChxLAp1LHgpe251bGwhPXEuYXR0cigidHJhbnNmb3JtIikmJihxPXEudHJhbnNpdGlvbigicG9zaXRpb24iKSk7cS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit1KyIsIit4KyIpIil9ZnVuY3Rpb24gcChxLHUpe3JldHVybiB1P3EudG9GaXhlZCgwKToxPD1NYXRoLmFicyhxKT9xLnRvRml4ZWQoMSk6cS50b0V4cG9uZW50aWFsKDEpfWZ1bmN0aW9uIG0ocSx1LHgsQSl7bGV0IHk9IkRldmljZTogIitxLmRldmljZV9uYW1lKyJcbiI7eSs9ImR0eXBlOiAiK3EuZHR5cGUrIlxuIjtsZXQgdz0iKHNjYWxhcikiOzA8cS5zaGFwZS5sZW5ndGgmJih3PSIoIitxLnNoYXBlLmpvaW4oIiwiKSsiKSIpO3k9eSsoIlxuc2hhcGU6ICIrdysiXG5cbiMoZWxlbWVudHMpOiAiKSsodSsiXG4iKTtxPVtdO2Zvcih1PTA7dTx4Lmxlbmd0aDt1KyspMDx4W3VdJiZxLnB1c2goIiMoIitmLmhlYWx0aFBpbGxFbnRyaWVzW3VdLmxhYmVsKyIpOiAiK3hbdV0pO3krPXEuam9pbigiLCAiKSsiXG5cbiI7QS5tYXg+PQpBLm1pbiYmKHkrPSJtaW46ICIrQS5taW4rIiwgbWF4OiAiK0EubWF4KyJcbiIseSs9Im1lYW46ICIrQS5tZWFuKyIsIHN0ZGRldjogIitBLnN0ZGRldik7cmV0dXJuIHl9ZnVuY3Rpb24gbihxLHUseCxBLHk9NjAsdz0xMCxDPTAsRyl7ZDMuc2VsZWN0KHEucGFyZW50Tm9kZSkuc2VsZWN0QWxsKCIuaGVhbHRoLXBpbGwiKS5yZW1vdmUoKTtpZih1KXt2YXIgRD11LnZhbHVlLEI9RC5zbGljZSgyLDgpLEk9QlswXSxOPUJbMV0sTz1CWzVdLEg9RFsxXSxLPXttaW46RFs4XSxtYXg6RFs5XSxtZWFuOkRbMTBdLHN0ZGRldjpNYXRoLnNxcnQoRFsxMV0pfTtudWxsPT15JiYoeT02MCk7bnVsbD09dyYmKHc9MTApO251bGw9PUMmJihDPTApO251bGwhPXgmJngubm9kZS50eXBlPT09Yi5ncmFwaC5Ob2RlVHlwZS5PUCYmKHkvPTIsdy89Mik7RD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJnIik7RC5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmLlNWR19OQU1FU1BBQ0UsCiJkZWZzIik7RC5hcHBlbmRDaGlsZChNKTt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJsaW5lYXJHcmFkaWVudCIpO0E9ImhlYWx0aC1waWxsLWdyYWRpZW50LSIrQTtMLnNldEF0dHJpYnV0ZSgiaWQiLEEpO3ZhciBRPTAsVD0iMCUiO2ZvcihsZXQgYWE9MDthYTxCLmxlbmd0aDthYSsrKWlmKEJbYWFdKXtRKz1CW2FhXTt2YXIgWD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJzdG9wIik7WC5zZXRBdHRyaWJ1dGUoIm9mZnNldCIsVCk7WC5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLGYuaGVhbHRoUGlsbEVudHJpZXNbYWFdLmJhY2tncm91bmRfY29sb3IpO0wuYXBwZW5kQ2hpbGQoWCk7VD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJzdG9wIik7WD0xMDAqUS9IKyIlIjtULnNldEF0dHJpYnV0ZSgib2Zmc2V0IixYKTtULnNldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIsZi5oZWFsdGhQaWxsRW50cmllc1thYV0uYmFja2dyb3VuZF9jb2xvcik7CkwuYXBwZW5kQ2hpbGQoVCk7VD1YfU0uYXBwZW5kQ2hpbGQoTCk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJyZWN0Iik7TS5zZXRBdHRyaWJ1dGUoImZpbGwiLCJ1cmwoIyIrQSsiKSIpO00uc2V0QXR0cmlidXRlKCJ3aWR0aCIsU3RyaW5nKHkpKTtNLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixTdHJpbmcodykpO00uc2V0QXR0cmlidXRlKCJ5IixTdHJpbmcoQykpO0QuYXBwZW5kQ2hpbGQoTSk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJ0aXRsZSIpO00udGV4dENvbnRlbnQ9bSh1LEgsQixLKTtELmFwcGVuZENoaWxkKE0pO3U9ITE7aWYobnVsbCE9eCYmKE09eC54LXkvMix3PXgueS13LXguaGVpZ2h0LzItMiwwPngubGFiZWxPZmZzZXQmJih3Kz14LmxhYmVsT2Zmc2V0KSxELnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTSsiLCAiK3crIikiKSwoQlsyXXx8QlszXXx8Qls0XSkmJih4PXgubm9kZS5hdHRyKSYmCngubGVuZ3RoKSlmb3IoQj0wO0I8eC5sZW5ndGg7QisrKWlmKCJUIj09PXhbQl0ua2V5KXt1PSh4PXhbQl0udmFsdWUudHlwZSkmJi9eRFRfKEJPT0x8SU5UfFVJTlQpLy50ZXN0KHgpO2JyZWFrfXg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwidGV4dCIpO2lmKE51bWJlci5pc0Zpbml0ZShLLm1pbikmJk51bWJlci5pc0Zpbml0ZShLLm1heCkpe2lmKEI9cChLLm1pbix1KSxLPXAoSy5tYXgsdSkseC50ZXh0Q29udGVudD0xPEg/QisiIH4gIitLOkIsMDxJfHwwPE58fDA8Tyl4LnRleHRDb250ZW50Kz0iICgiLEg9W10sMDxJJiZILnB1c2goYE5hTlx1MDBkNyR7SX1gKSwwPE4mJkgucHVzaChgLVx1MjIxZVx1MDBkNyR7Tn1gKSwwPE8mJkgucHVzaChgK1x1MjIxZVx1MDBkNyR7T31gKSx4LnRleHRDb250ZW50Kz1ILmpvaW4oIjsgIikrIikifWVsc2UgeC50ZXh0Q29udGVudD0iKE5vIGZpbml0ZSBlbGVtZW50cykiO3guY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwtc3RhdHMiKTsKbnVsbD09RyYmKEc9eS8yKTt4LnNldEF0dHJpYnV0ZSgieCIsU3RyaW5nKEcpKTt4LnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKEMtMikpO0QuYXBwZW5kQ2hpbGQoeCk7UG9seW1lci5kb20ocS5wYXJlbnROb2RlKS5hcHBlbmRDaGlsZChEKX19Zi5TVkdfTkFNRVNQQUNFPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7Zi5DbGFzcz17Tm9kZTp7Q09OVEFJTkVSOiJub2RlcyIsR1JPVVA6Im5vZGUiLFNIQVBFOiJub2Rlc2hhcGUiLENPTE9SX1RBUkdFVDoibm9kZWNvbG9ydGFyZ2V0IixMQUJFTDoibm9kZWxhYmVsIixCVVRUT05fQ09OVEFJTkVSOiJidXR0b25jb250YWluZXIiLEJVVFRPTl9DSVJDTEU6ImJ1dHRvbmNpcmNsZSIsRVhQQU5EX0JVVFRPTjoiZXhwYW5kYnV0dG9uIixDT0xMQVBTRV9CVVRUT046ImNvbGxhcHNlYnV0dG9uIn0sRWRnZTp7Q09OVEFJTkVSOiJlZGdlcyIsR1JPVVA6ImVkZ2UiLExJTkU6ImVkZ2VsaW5lIixSRUZFUkVOQ0VfRURHRToicmVmZXJlbmNlZWRnZSIsClJFRl9MSU5FOiJyZWZsaW5lIixTRUxFQ1RBQkxFOiJzZWxlY3RhYmxlZWRnZSIsU0VMRUNURUQ6InNlbGVjdGVkZWRnZSIsU1RSVUNUVVJBTDoic3RydWN0dXJhbCJ9LEFubm90YXRpb246e09VVEJPWDoib3V0LWFubm90YXRpb25zIixJTkJPWDoiaW4tYW5ub3RhdGlvbnMiLEdST1VQOiJhbm5vdGF0aW9uIixOT0RFOiJhbm5vdGF0aW9uLW5vZGUiLEVER0U6ImFubm90YXRpb24tZWRnZSIsQ09OVFJPTF9FREdFOiJhbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSIsTEFCRUw6ImFubm90YXRpb24tbGFiZWwiLEVMTElQU0lTOiJhbm5vdGF0aW9uLWVsbGlwc2lzIn0sU2NlbmU6e0dST1VQOiJzY2VuZSIsQ09SRToiY29yZSIsRlVOQ1RJT05fTElCUkFSWToiZnVuY3Rpb24tbGlicmFyeSIsSU5FWFRSQUNUOiJpbi1leHRyYWN0IixPVVRFWFRSQUNUOiJvdXQtZXh0cmFjdCJ9LFN1YnNjZW5lOntHUk9VUDoic3Vic2NlbmUifSxPUE5PREU6Im9wIixNRVRBTk9ERToibWV0YSIsU0VSSUVTTk9ERToic2VyaWVzIiwKQlJJREdFTk9ERToiYnJpZGdlIixFTExJUFNJU05PREU6ImVsbGlwc2lzIn07Zi5oZWFsdGhQaWxsRW50cmllcz1be2JhY2tncm91bmRfY29sb3I6IiNDQzJGMkMiLGxhYmVsOiJOYU4ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0ZGOEQwMCIsbGFiZWw6Ii1cdTIyMWUifSx7YmFja2dyb3VuZF9jb2xvcjoiI0VBRUFFQSIsbGFiZWw6Ii0ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0E1QTVBNSIsbGFiZWw6IjAifSx7YmFja2dyb3VuZF9jb2xvcjoiIzI2MjYyNiIsbGFiZWw6IisifSx7YmFja2dyb3VuZF9jb2xvcjoiIzAwM0VENCIsbGFiZWw6IitcdTIyMWUifV07Zi5maXQ9ZnVuY3Rpb24ocSx1LHgsQSl7dmFyIHk9cS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtsZXQgdz1udWxsO3RyeXtpZih3PXUuZ2V0QkJveCgpLDA9PT13LndpZHRoKXJldHVybn1jYXRjaChDKXtyZXR1cm59dT1kLmxheW91dC5QQVJBTVMuZ3JhcGg7eT1kMy56b29tSWRlbnRpdHkuc2NhbGUoLjkqTWF0aC5taW4oeS53aWR0aC8Kdy53aWR0aCx5LmhlaWdodC93LmhlaWdodCwyKSkudHJhbnNsYXRlKHUucGFkZGluZy5wYWRkaW5nTGVmdCx1LnBhZGRpbmcucGFkZGluZ1RvcCk7ZDMuc2VsZWN0KHEpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwoeC50cmFuc2Zvcm0seSkub24oImVuZC5maXR0ZWQiLCgpPT57eC5vbigiZW5kLmZpdHRlZCIsbnVsbCk7QSgpfSl9O2YucGFuVG9Ob2RlPWZ1bmN0aW9uKHEsdSx4LEEpe3g9ZDMuc2VsZWN0KHUpLnNlbGVjdChgW2RhdGEtbmFtZT0iJHtxfSJdYCkubm9kZSgpO2lmKCF4KXJldHVybiBjb25zb2xlLndhcm4oYHBhblRvTm9kZSgpIGZhaWxlZCBmb3Igbm9kZSBuYW1lICIke3F9ImApLCExO3ZhciB5PXguZ2V0QkJveCgpLHc9eC5nZXRTY3JlZW5DVE0oKTtxPXUuY3JlYXRlU1ZHUG9pbnQoKTt4PXUuY3JlYXRlU1ZHUG9pbnQoKTtxLng9eS54O3EueT15Lnk7eC54PXkueCt5LndpZHRoO3gueT15LnkreS5oZWlnaHQ7cT1xLm1hdHJpeFRyYW5zZm9ybSh3KTt4PQp4Lm1hdHJpeFRyYW5zZm9ybSh3KTt3PShHLEQsQixJKT0+IShHPkImJkQ8SSk7eT11LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IEM9eS50b3AreS5oZWlnaHQtMTUwO3JldHVybiB3KHEueCx4LngseS5sZWZ0LHkubGVmdCt5LndpZHRoLTMyMCl8fHcocS55LHgueSx5LnRvcCxDKT8odz15LmxlZnQreS53aWR0aC8yLShxLngreC54KS8yLHE9eS50b3AreS5oZWlnaHQvMi0ocS55K3gueSkvMix4PWQzLnpvb21UcmFuc2Zvcm0odSksZDMuc2VsZWN0KHUpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwoQS50cmFuc2xhdGVCeSx3L3guayxxL3guayksITApOiExfTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQ9aDtmLnNlbGVjdENoaWxkPWs7Zi5idWlsZEdyb3VwPWZ1bmN0aW9uKHEsdSx4LEEpe0E9QXx8Zi5DbGFzcy5TY2VuZS5HUk9VUDtsZXQgeT1rKHEsImciLEEpLmVtcHR5KCk7cT1oKHEsImciLEEpO0E9aChxLCJnIixmLkNsYXNzLlNjZW5lLkNPUkUpO2xldCB3PV8ucmVkdWNlKHUuY29yZUdyYXBoLm5vZGVzKCksCihDLEcpPT57Rz11LmNvcmVHcmFwaC5ub2RlKEcpO0cuZXhjbHVkZWR8fEMucHVzaChHKTtyZXR1cm4gQ30sW10pO3Uubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMmJncucmV2ZXJzZSgpO2YuZWRnZS5idWlsZEdyb3VwKEEsdS5jb3JlR3JhcGgseCk7Zi5ub2RlLmJ1aWxkR3JvdXAoQSx3LHgpOzA8dS5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGg/KEE9aChxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCksZi5ub2RlLmJ1aWxkR3JvdXAoQSx1Lmlzb2xhdGVkSW5FeHRyYWN0LHgpKTprKHEsImciLGYuQ2xhc3MuU2NlbmUuSU5FWFRSQUNUKS5yZW1vdmUoKTswPHUuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aD8oQT1oKHEsImciLGYuQ2xhc3MuU2NlbmUuT1VURVhUUkFDVCksZi5ub2RlLmJ1aWxkR3JvdXAoQSx1Lmlzb2xhdGVkT3V0RXh0cmFjdCx4KSk6ayhxLCJnIixmLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLnJlbW92ZSgpOzA8dS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGg/CihBPWgocSwiZyIsZi5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKSxmLm5vZGUuYnVpbGRHcm91cChBLHUubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QseCkpOmsocSwiZyIsZi5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5yZW1vdmUoKTt0KHEsdSk7eSYmcS5hdHRyKCJvcGFjaXR5IiwwKS50cmFuc2l0aW9uKCkuYXR0cigib3BhY2l0eSIsMSk7cmV0dXJuIHF9O2YuYWRkR3JhcGhDbGlja0xpc3RlbmVyPWZ1bmN0aW9uKHEsdSl7ZDMuc2VsZWN0KHEpLm9uKCJjbGljayIsKCk9Pnt1LmZpcmUoImdyYXBoLXNlbGVjdCIpfSl9O2YudHJhbnNsYXRlPWw7Zi5wb3NpdGlvblJlY3Q9ZnVuY3Rpb24ocSx1LHgsQSx5KXtxLnRyYW5zaXRpb24oKS5hdHRyKCJ4Iix1LUEvMikuYXR0cigieSIseC15LzIpLmF0dHIoIndpZHRoIixBKS5hdHRyKCJoZWlnaHQiLHkpfTtmLnBvc2l0aW9uVHJpYW5nbGU9ZnVuY3Rpb24ocSx1LHgsQSx5KXt5Lz0yO0EvPTI7dT1bW3UseC15XSxbdStBLAp4K3ldLFt1LUEseCt5XV07cS50cmFuc2l0aW9uKCkuYXR0cigicG9pbnRzIix1Lm1hcCh3PT53LmpvaW4oIiwiKSkuam9pbigiICIpKX07Zi5wb3NpdGlvbkJ1dHRvbj1mdW5jdGlvbihxLHUpe2xldCB4PWQubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUodSkrKHUuZXhwYW5kZWQ/dS53aWR0aDp1LmNvcmVCb3gud2lkdGgpLzItNixBPXUueS0odS5leHBhbmRlZD91LmhlaWdodDp1LmNvcmVCb3guaGVpZ2h0KS8yKzY7dS5ub2RlLnR5cGUhPT1kLk5vZGVUeXBlLlNFUklFU3x8dS5leHBhbmRlZHx8KHgrPTEwLEEtPTIpO3U9InRyYW5zbGF0ZSgiK3grIiwiK0ErIikiO3Euc2VsZWN0QWxsKCJwYXRoIikudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsdSk7cS5zZWxlY3QoImNpcmNsZSIpLnRyYW5zaXRpb24oKS5hdHRyKHtjeDp4LGN5OkEscjpkLmxheW91dC5QQVJBTVMubm9kZVNpemUubWV0YS5leHBhbmRCdXR0b25SYWRpdXN9KX07Zi5wb3NpdGlvbkVsbGlwc2U9CmZ1bmN0aW9uKHEsdSx4LEEseSl7cS50cmFuc2l0aW9uKCkuYXR0cigiY3giLHUpLmF0dHIoImN5Iix4KS5hdHRyKCJyeCIsQS8yKS5hdHRyKCJyeSIseS8yKX07Zi5odW1hbml6ZUhlYWx0aFBpbGxTdGF0PXA7Zi5hZGRIZWFsdGhQaWxsPW47Zi5hZGRIZWFsdGhQaWxscz1mdW5jdGlvbihxLHUseCl7aWYodSl7dmFyIEE9MTtkMy5zZWxlY3QocSkuc2VsZWN0QWxsKCJnLm5vZGVzaGFwZSIpLmVhY2goZnVuY3Rpb24oeSl7Y29uc3Qgdz11W3kubm9kZS5uYW1lXTtuKHRoaXMsdz93W3hdOm51bGwseSxBKyspfSl9fX0pKGQuc2NlbmV8fChkLnNjZW5lPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90ZW1wbGF0ZS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKG4pe2xldCBxPV8ubWFwKHtkZXB0aDpuLmRlcHRoLCJ8VnwiOm4ubWV0YWdyYXBoLm5vZGVzKCkubGVuZ3RoLCJ8RXwiOm4ubWV0YWdyYXBoLmVkZ2VzKCkubGVuZ3RofSxmdW5jdGlvbih1LHgpe3JldHVybiB4KyJceDNkIit1fSkuam9pbigiICIpO249Xy5tYXAobi5vcEhpc3RvZ3JhbSxmdW5jdGlvbih1LHgpe3JldHVybiB4KyJceDNkIit1fSkuam9pbigiLCIpO3JldHVybiBxKyIgW29wc10gIitufWZ1bmN0aW9uIGsobil7Y29uc3QgcT1uLmdldE5vZGVNYXAoKTtsZXQgdT1PYmplY3Qua2V5cyhxKS5yZWR1Y2UoKHgsQSk9Pntjb25zdCB5PXFbQV07aWYoeS50eXBlIT09ZC5Ob2RlVHlwZS5NRVRBKXJldHVybiB4O0E9QS5zcGxpdCgiLyIpLmxlbmd0aC0xO2xldCB3PWgoeSksQz14W3ddfHx7bm9kZXM6W10sbGV2ZWw6QX07eFt3XT1DO0Mubm9kZXMucHVzaCh5KTtDLmxldmVsPkEmJihDLmxldmVsPQpBKTtyZXR1cm4geH0se30pO3JldHVybiBPYmplY3Qua2V5cyh1KS5tYXAoeD0+W3gsdVt4XV0pLmZpbHRlcigoWyx4XSk9Pnt4PXgubm9kZXM7aWYoMTx4Lmxlbmd0aClyZXR1cm4hMDt4PXhbMF07cmV0dXJuIHgudHlwZT09PWQuTm9kZVR5cGUuTUVUQSYmeC5hc3NvY2lhdGVkRnVuY3Rpb259KS5zb3J0KChbLHhdKT0+eC5ub2Rlc1swXS5kZXB0aCl9ZnVuY3Rpb24gdChuLHEpe3JldHVybiBfLnJlZHVjZShuLGZ1bmN0aW9uKHUseCl7bGV0IEE9eFswXSx5PVtdO3hbMV0ubm9kZXMuZm9yRWFjaChmdW5jdGlvbih3KXtmb3IobGV0IEM9MDtDPHkubGVuZ3RoO0MrKylpZighcXx8cCh5W0NdLm1ldGFub2RlLm1ldGFncmFwaCx3Lm1ldGFncmFwaCkpe3cudGVtcGxhdGVJZD15W0NdLm1ldGFub2RlLnRlbXBsYXRlSWQ7eVtDXS5tZW1iZXJzLnB1c2gody5uYW1lKTtyZXR1cm59dy50ZW1wbGF0ZUlkPUErIlsiK3kubGVuZ3RoKyJdIjt5LnB1c2goe21ldGFub2RlOncsbWVtYmVyczpbdy5uYW1lXX0pfSk7CnkuZm9yRWFjaChmdW5jdGlvbih3KXt1W3cubWV0YW5vZGUudGVtcGxhdGVJZF09e2xldmVsOnhbMV0ubGV2ZWwsbm9kZXM6dy5tZW1iZXJzfX0pO3JldHVybiB1fSx7fSl9ZnVuY3Rpb24gbChuLHEsdSl7cmV0dXJuIF8uc29ydEJ5KG4sW3g9PnEubm9kZSh4KS5vcCx4PT5xLm5vZGUoeCkudGVtcGxhdGVJZCx4PT5xLm5laWdoYm9ycyh4KS5sZW5ndGgseD0+cS5wcmVkZWNlc3NvcnMoeCkubGVuZ3RoLHg9PnEuc3VjY2Vzc29ycyh4KS5sZW5ndGgseD0+eC5zdWJzdHIodS5sZW5ndGgpXSl9ZnVuY3Rpb24gcChuLHEpe2Z1bmN0aW9uIHUoSSxOKXtsZXQgTz1JLnN1YnN0cih4Lmxlbmd0aCksSD1OLnN1YnN0cihBLmxlbmd0aCk7aWYoeVtPXV53W0hdKXJldHVybiBjb25zb2xlLndhcm4oImRpZmZlcmVudCB2aXNpdCBwYXR0ZXJuIiwiWyIreCsiXSIsTywiWyIrQSsiXSIsSCksITA7eVtPXXx8KHlbT109d1tIXT0hMCxDLnB1c2goe24xOkksbjI6Tn0pKTtyZXR1cm4hMX1pZighYi5ncmFwaC5oYXNTaW1pbGFyRGVncmVlU2VxdWVuY2UobiwKcSkpcmV0dXJuITE7bGV0IHg9bi5ncmFwaCgpLm5hbWUsQT1xLmdyYXBoKCkubmFtZSx5PXt9LHc9e30sQz1bXTt2YXIgRz1uLnNvdXJjZXMoKSxEPXEuc291cmNlcygpO2lmKEcubGVuZ3RoIT09RC5sZW5ndGgpcmV0dXJuIGNvbnNvbGUubG9nKCJkaWZmZXJlbnQgc291cmNlIGxlbmd0aCIpLCExO0c9bChHLG4seCk7RD1sKEQscSxBKTtmb3IodmFyIEI9MDtCPEcubGVuZ3RoO0IrKylpZih1KEdbQl0sRFtCXSkpcmV0dXJuITE7Zm9yKDswPEMubGVuZ3RoOyl7RD1DLnBvcCgpO2lmKCFtKG4ubm9kZShELm4xKSxxLm5vZGUoRC5uMikpKXJldHVybiExO0c9bi5zdWNjZXNzb3JzKEQubjEpO0Q9cS5zdWNjZXNzb3JzKEQubjIpO2lmKEcubGVuZ3RoIT09RC5sZW5ndGgpcmV0dXJuIGNvbnNvbGUubG9nKCIjIG9mIHN1Y2Nlc3NvcnMgbWlzbWF0Y2giLEcsRCksITE7Rz1sKEcsbix4KTtEPWwoRCxxLEEpO2ZvcihCPTA7QjxHLmxlbmd0aDtCKyspaWYodShHW0JdLERbQl0pKXJldHVybiExfXJldHVybiEwfQpmdW5jdGlvbiBtKG4scSl7aWYobi50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBKXJldHVybiBuLnRlbXBsYXRlSWQmJnEudGVtcGxhdGVJZCYmbi50ZW1wbGF0ZUlkPT09cS50ZW1wbGF0ZUlkO2lmKG4udHlwZT09PWQuTm9kZVR5cGUuT1AmJnEudHlwZT09PWQuTm9kZVR5cGUuT1ApcmV0dXJuIG4ub3A9PT1xLm9wO2lmKG4udHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTJiZxLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUyl7bGV0IHU9bi5tZXRhZ3JhcGgubm9kZUNvdW50KCk7cmV0dXJuIHU9PT1xLm1ldGFncmFwaC5ub2RlQ291bnQoKSYmKDA9PT11fHxuLm1ldGFncmFwaC5ub2RlKG4ubWV0YWdyYXBoLm5vZGVzKClbMF0pLm9wPT09cS5tZXRhZ3JhcGgubm9kZShxLm1ldGFncmFwaC5ub2RlcygpWzBdKS5vcCl9cmV0dXJuITF9Zi5kZXRlY3Q9ZnVuY3Rpb24obixxKXtuPWsobik7bGV0IHU9dChuLHEpO3JldHVybiBPYmplY3Qua2V5cyh1KS5zb3J0KHg9PnVbeF0ubGV2ZWwpLnJlZHVjZSgoeCwKQSk9Pnt4W0FdPXVbQV07cmV0dXJuIHh9LHt9KX19KShkLnRlbXBsYXRlfHwoZC50ZW1wbGF0ZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vdXRpbC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmLnRpbWU9ZnVuY3Rpb24oaCxrKXtsZXQgdD1EYXRlLm5vdygpO2s9aygpO2NvbnNvbGUubG9nKGgsIjoiLERhdGUubm93KCktdCwibXMiKTtyZXR1cm4ga307Zi5nZXRUcmFja2VyPWZ1bmN0aW9uKGgpe3JldHVybntzZXRNZXNzYWdlOmZ1bmN0aW9uKGspe2guc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmgucHJvZ3Jlc3MudmFsdWUsbXNnOmt9KX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24oayl7aC5zZXQoInByb2dyZXNzIix7dmFsdWU6aC5wcm9ncmVzcy52YWx1ZStrLG1zZzpoLnByb2dyZXNzLm1zZ30pfSxyZXBvcnRFcnJvcjpmdW5jdGlvbihrLHQpe2NvbnNvbGUuZXJyb3IodC5zdGFjayk7aC5zZXQoInByb2dyZXNzIix7dmFsdWU6aC5wcm9ncmVzcy52YWx1ZSxtc2c6ayxlcnJvcjohMH0pfX19O2YuZ2V0U3VidGFza1RyYWNrZXI9ZnVuY3Rpb24oaCxrLHQpe3JldHVybntzZXRNZXNzYWdlOmZ1bmN0aW9uKGwpe2guc2V0TWVzc2FnZSh0KwoiOiAiK2wpfSx1cGRhdGVQcm9ncmVzczpmdW5jdGlvbihsKXtoLnVwZGF0ZVByb2dyZXNzKGwqay8xMDApfSxyZXBvcnRFcnJvcjpmdW5jdGlvbihsLHApe2gucmVwb3J0RXJyb3IodCsiOiAiK2wscCl9fX07Zi5ydW5UYXNrPWZ1bmN0aW9uKGgsayl7ay5zZXRNZXNzYWdlKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0Iik7dHJ5e2xldCB0PWIuZ3JhcGgudXRpbC50aW1lKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0IixoKTtrLnVwZGF0ZVByb2dyZXNzKDQwKTtyZXR1cm4gdH1jYXRjaCh0KXtrLnJlcG9ydEVycm9yKCJGYWlsZWQgUmVhZGluZyBtZXRhZGF0YSBwYnR4dCIsdCl9fTtmLnJ1bkFzeW5jVGFzaz1mdW5jdGlvbihoLGssdCxsKXtyZXR1cm4gbmV3IFByb21pc2UocD0+e2wuc2V0TWVzc2FnZShoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2xldCBtPWIuZ3JhcGgudXRpbC50aW1lKGgsdCk7bC51cGRhdGVQcm9ncmVzcyhrKTtwKG0pfWNhdGNoKG0pe2wucmVwb3J0RXJyb3IoIkZhaWxlZCAiKwpoLG0pfX0sMjApfSl9O2YucnVuQXN5bmNQcm9taXNlVGFzaz1mdW5jdGlvbihoLGssdCxsKXtyZXR1cm4gbmV3IFByb21pc2UoKHAsbSk9PntmdW5jdGlvbiBuKHEpe2wucmVwb3J0RXJyb3IoIkZhaWxlZCAiK2gscSk7bShxKX1sLnNldE1lc3NhZ2UoaCk7c2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtsZXQgcT1EYXRlLm5vdygpO3QoKS50aGVuKGZ1bmN0aW9uKHUpe2NvbnNvbGUubG9nKGgsIjoiLERhdGUubm93KCktcSwibXMiKTtsLnVwZGF0ZVByb2dyZXNzKGspO3AodSl9KS5jYXRjaChuKX1jYXRjaChxKXtuKHEpfX0sMjApfSl9O2YuZXNjYXBlUXVlcnlTZWxlY3Rvcj1mdW5jdGlvbihoKXtyZXR1cm4gaC5yZXBsYWNlKC8oWzouXFtcXSwvXFxcKFwpXSkvZywiXFwkMSIpfTtmLk1FTU9SWV9VTklUUz1be3N5bWJvbDoiQiJ9LHtzeW1ib2w6IktCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJNQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiR0IiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IlRCIiwKbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiUEIiLG51bVVuaXRzOjEwMjR9XTtmLlRJTUVfVU5JVFM9W3tzeW1ib2w6Ilx1MDBiNXMifSx7c3ltYm9sOiJtcyIsbnVtVW5pdHM6MUUzfSx7c3ltYm9sOiJzIixudW1Vbml0czoxRTN9LHtzeW1ib2w6Im1pbiIsbnVtVW5pdHM6NjB9LHtzeW1ib2w6ImhyIixudW1Vbml0czo2MH0se3N5bWJvbDoiZGF5cyIsbnVtVW5pdHM6MjR9XTtmLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZT1mdW5jdGlvbihoLGssdD0wKXtyZXR1cm4gdCsxPGsubGVuZ3RoJiZoPj1rW3QrMV0ubnVtVW5pdHM/Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShoL2tbdCsxXS5udW1Vbml0cyxrLHQrMSk6TnVtYmVyKGgudG9QcmVjaXNpb24oMykpKyIgIitrW3RdLnN5bWJvbH07Zi5oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cz1mdW5jdGlvbihoKXtyZXR1cm4gaCYmKDA8aC50b3RhbEJ5dGVzfHwwPGguZ2V0VG90YWxNaWNyb3MoKXx8aC5vdXRwdXRTaXplKT8KITA6ITF9O2YucmVtb3ZlQ29tbW9uUHJlZml4PWZ1bmN0aW9uKGgpe2lmKDI+aC5sZW5ndGgpcmV0dXJuIGg7bGV0IGs9MCx0PTAsbD1fLm1pbihfLm1hcChoLHA9PnAubGVuZ3RoKSk7Zm9yKDs7KXtrKys7bGV0IHA9Xy5tYXAoaCxtPT5tLnN1YnN0cmluZygwLGspKTtpZihwLmV2ZXJ5KChtLG4pPT4wPT09bj8hMDptPT09cFtuLTFdKSl7aWYoaz49bClyZXR1cm4gaDt0PWt9ZWxzZSBicmVha31yZXR1cm4gXy5tYXAoaCxwPT5wLnN1YnN0cmluZyh0KSl9O2YuY29tcHV0ZUh1bWFuRnJpZW5kbHlUaW1lPWZ1bmN0aW9uKGgpe2g9K25ldyBEYXRlLStuZXcgRGF0ZShoLzFFMyk7cmV0dXJuIDNFND5oPyJqdXN0IG5vdyI6NkU0Pmg/TWF0aC5mbG9vcihoLzFFMykrIiBzZWNvbmRzIGFnbyI6MTJFND5oPyJhIG1pbnV0ZSBhZ28iOjM2RTU+aD9NYXRoLmZsb29yKGgvNkU0KSsiIG1pbnV0ZXMgYWdvIjoxPT1NYXRoLmZsb29yKGgvMzZFNSk/ImFuIGhvdXIgYWdvIjo4NjRFNT5oP01hdGguZmxvb3IoaC8KMzZFNSkrIiBob3VycyBhZ28iOjE3MjhFNT5oPyJ5ZXN0ZXJkYXkiOk1hdGguZmxvb3IoaC84NjRFNSkrIiBkYXlzIGFnbyJ9fSkoZC51dGlsfHwoZC51dGlsPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9taW5pbWFwLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7Y2xhc3MgZntjb25zdHJ1Y3RvcihoLGssdCxsLHAsbSl7dGhpcy5zdmc9aDt0aGlzLmxhYmVsUGFkZGluZz1tO3RoaXMuem9vbUc9azt0aGlzLm1haW5ab29tPXQ7dGhpcy5tYXhXYW5kSD1wO2g9ZDMuc2VsZWN0KGwuc2hhZG93Um9vdCk7bGV0IG49aC5zZWxlY3QoInN2ZyIpLHE9bi5zZWxlY3QoInJlY3QiKTt0aGlzLnZpZXdwb2ludENvb3JkPXt4OjAseTowfTtrPWQzLmRyYWcoKS5zdWJqZWN0KE9iamVjdCkub24oImRyYWciLCgpPT57dGhpcy52aWV3cG9pbnRDb29yZC54PWQzLmV2ZW50Lng7dGhpcy52aWV3cG9pbnRDb29yZC55PWQzLmV2ZW50Lnk7dGhpcy51cGRhdGVWaWV3cG9pbnQoKX0pO3EuZGF0dW0odGhpcy52aWV3cG9pbnRDb29yZCkuY2FsbChrKTtuLm9uKCJjbGljayIsKCk9PntpZighZDMuZXZlbnQuZGVmYXVsdFByZXZlbnRlZCl7dmFyIHU9TnVtYmVyKHEuYXR0cigid2lkdGgiKSkseD1OdW1iZXIocS5hdHRyKCJoZWlnaHQiKSksCkE9ZDMubW91c2Uobi5ub2RlKCkpO3RoaXMudmlld3BvaW50Q29vcmQueD1BWzBdLXUvMjt0aGlzLnZpZXdwb2ludENvb3JkLnk9QVsxXS14LzI7dGhpcy51cGRhdGVWaWV3cG9pbnQoKX19KTt0aGlzLnZpZXdwb2ludD1xLm5vZGUoKTt0aGlzLm1pbmltYXBTdmc9bi5ub2RlKCk7dGhpcy5taW5pbWFwPWw7dGhpcy5jYW52YXM9aC5zZWxlY3QoImNhbnZhcy5maXJzdCIpLm5vZGUoKTt0aGlzLmNhbnZhc0J1ZmZlcj1oLnNlbGVjdCgiY2FudmFzLnNlY29uZCIpLm5vZGUoKTt0aGlzLmRvd25sb2FkQ2FudmFzPWguc2VsZWN0KCJjYW52YXMuZG93bmxvYWQiKS5ub2RlKCk7ZDMuc2VsZWN0KHRoaXMuZG93bmxvYWRDYW52YXMpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpO3RoaXMudXBkYXRlKCl9dXBkYXRlVmlld3BvaW50KCl7ZDMuc2VsZWN0KHRoaXMudmlld3BvaW50KS5hdHRyKCJ4Iix0aGlzLnZpZXdwb2ludENvb3JkLngpLmF0dHIoInkiLHRoaXMudmlld3BvaW50Q29vcmQueSk7bGV0IGg9Ci10aGlzLnZpZXdwb2ludENvb3JkLngqdGhpcy5zY2FsZU1haW4vdGhpcy5zY2FsZU1pbmltYXAsaz0tdGhpcy52aWV3cG9pbnRDb29yZC55KnRoaXMuc2NhbGVNYWluL3RoaXMuc2NhbGVNaW5pbWFwO2QzLnNlbGVjdCh0aGlzLnN2ZykuY2FsbCh0aGlzLm1haW5ab29tLnRyYW5zZm9ybSxkMy56b29tSWRlbnRpdHkudHJhbnNsYXRlKGgsaykuc2NhbGUodGhpcy5zY2FsZU1haW4pKX11cGRhdGUoKXtsZXQgaD1udWxsO3RyeXtpZihoPXRoaXMuem9vbUcuZ2V0QkJveCgpLDA9PT1oLndpZHRoKXJldHVybn1jYXRjaCh1KXtyZXR1cm59dmFyIGs9ZDMuc2VsZWN0KCIjZ3JhcGhkb3dubG9hZCIpO3RoaXMuZG93bmxvYWQ9ay5ub2RlKCk7ay5vbigiY2xpY2siLCgpPT57VVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLmRvd25sb2FkLmhyZWYpO3ZhciB1PXRoaXMuZG93bmxvYWRDYW52YXMudG9EYXRhVVJMKCJpbWFnZS9wbmciKTtjb25zdCB4PXUuc2xpY2UoMCx1LmluZGV4T2YoIiwiKSk7aWYoeC5lbmRzV2l0aCgiO2Jhc2U2NCIpKXt2YXIgQT0KYXRvYih1LnNsaWNlKHUuaW5kZXhPZigiLCIpKzEpKTt1PShuZXcgVWludDhBcnJheShBLmxlbmd0aCkpLm1hcCgoeSx3KT0+QS5jaGFyQ29kZUF0KHcpKTt0aGlzLmRvd25sb2FkLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdV0se3R5cGU6ImltYWdlL3BuZyJ9KSl9ZWxzZSBjb25zb2xlLndhcm4oYG5vbi1iYXNlNjQgZGF0YSBVUkwgKCR7eH0pOyBjYW5ub3QgdXNlIGJsb2IgZG93bmxvYWRgKSx0aGlzLmRvd25sb2FkLmhyZWY9dX0pO2s9ZDMuc2VsZWN0KHRoaXMuc3ZnKTt2YXIgdD0iIixsPXRoaXMuc3ZnO2w9KGwuZ2V0Um9vdE5vZGU/bC5nZXRSb290Tm9kZSgpOnRoaXMuc3ZnLnBhcmVudE5vZGUpLnN0eWxlU2hlZXRzO2Zvcih2YXIgcD0wO3A8bC5sZW5ndGg7cCsrKXRyeXt2YXIgbT1sW3BdLmNzc1J1bGVzfHxsW3BdLnJ1bGVzO2lmKG51bGwhPW0pZm9yKGxldCB1PTA7dTxtLmxlbmd0aDt1KyspdCs9bVt1XS5jc3NUZXh0LnJlcGxhY2UoLyA/dGYtW1x3LV0rID8vZywKIiIpKyJcbiJ9Y2F0Y2godSl7aWYoIlNlY3VyaXR5RXJyb3IiIT09dS5uYW1lKXRocm93IHU7fW09ay5hcHBlbmQoInN0eWxlIik7bS50ZXh0KHQpO3Q9ZDMuc2VsZWN0KHRoaXMuem9vbUcpO2w9dC5hdHRyKCJ0cmFuc2Zvcm0iKTt0LmF0dHIoInRyYW5zZm9ybSIsbnVsbCk7aC5oZWlnaHQrPWgueTtoLndpZHRoKz1oLng7aC5oZWlnaHQrPTIqdGhpcy5sYWJlbFBhZGRpbmc7aC53aWR0aCs9Mip0aGlzLmxhYmVsUGFkZGluZztrLmF0dHIoIndpZHRoIixoLndpZHRoKS5hdHRyKCJoZWlnaHQiLGguaGVpZ2h0KTt0aGlzLnNjYWxlTWluaW1hcD10aGlzLm1heFdhbmRIL01hdGgubWF4KGgud2lkdGgsaC5oZWlnaHQpO3RoaXMubWluaW1hcFNpemU9e3dpZHRoOmgud2lkdGgqdGhpcy5zY2FsZU1pbmltYXAsaGVpZ2h0OmguaGVpZ2h0KnRoaXMuc2NhbGVNaW5pbWFwfTtkMy5zZWxlY3QodGhpcy5taW5pbWFwU3ZnKS5hdHRyKHRoaXMubWluaW1hcFNpemUpO2QzLnNlbGVjdCh0aGlzLmNhbnZhc0J1ZmZlcikuYXR0cih0aGlzLm1pbmltYXBTaXplKTsKcD1kMy5zZWxlY3QodGhpcy5kb3dubG9hZENhbnZhcyk7cC5zdHlsZSgid2lkdGgiLGgud2lkdGgpO3Auc3R5bGUoImhlaWdodCIsaC5oZWlnaHQpO3AuYXR0cigid2lkdGgiLDMqaC53aWR0aCk7cC5hdHRyKCJoZWlnaHQiLDMqaC5oZWlnaHQpO251bGwhPXRoaXMudHJhbnNsYXRlJiZudWxsIT10aGlzLnpvb20mJnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy56b29tKCkpO2xldCBuPShuZXcgWE1MU2VyaWFsaXplcikuc2VyaWFsaXplVG9TdHJpbmcodGhpcy5zdmcpO20ucmVtb3ZlKCk7ay5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKTt0LmF0dHIoInRyYW5zZm9ybSIsbCk7bGV0IHE9bmV3IEltYWdlO3Eub25sb2FkPSgpPT57dmFyIHU9dGhpcy5jYW52YXNCdWZmZXIuZ2V0Q29udGV4dCgiMmQiKTt1LmNsZWFyUmVjdCgwLDAsdGhpcy5jYW52YXNCdWZmZXIud2lkdGgsdGhpcy5jYW52YXNCdWZmZXIuaGVpZ2h0KTt1LmRyYXdJbWFnZShxLDAsMCx0aGlzLm1pbmltYXBTaXplLndpZHRoLAp0aGlzLm1pbmltYXBTaXplLmhlaWdodCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57ZDMuc2VsZWN0KHRoaXMuY2FudmFzQnVmZmVyKS5zdHlsZSgiZGlzcGxheSIsbnVsbCk7ZDMuc2VsZWN0KHRoaXMuY2FudmFzKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKTtbdGhpcy5jYW52YXMsdGhpcy5jYW52YXNCdWZmZXJdPVt0aGlzLmNhbnZhc0J1ZmZlcix0aGlzLmNhbnZhc119KTt1PXRoaXMuZG93bmxvYWRDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTt1LmNsZWFyUmVjdCgwLDAsdGhpcy5kb3dubG9hZENhbnZhcy53aWR0aCx0aGlzLmRvd25sb2FkQ2FudmFzLmhlaWdodCk7dS5kcmF3SW1hZ2UocSwwLDAsdGhpcy5kb3dubG9hZENhbnZhcy53aWR0aCx0aGlzLmRvd25sb2FkQ2FudmFzLmhlaWdodCl9O3Eub25lcnJvcj0oKT0+e3Euc3JjPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW25dLHt0eXBlOiJpbWFnZS9zdmcreG1sO2NoYXJzZXRceDNkdXRmLTgifSkpfTtxLnNyYz0KImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0XHgzZHV0Zi04LCIrZW5jb2RlVVJJQ29tcG9uZW50KG4pfXpvb20oaCl7aWYobnVsbCE9dGhpcy5zY2FsZU1pbmltYXApe2gmJih0aGlzLnRyYW5zbGF0ZT1baC54LGgueV0sdGhpcy5zY2FsZU1haW49aC5rKTt2YXIgaz10aGlzLnN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0PWQzLnNlbGVjdCh0aGlzLnZpZXdwb2ludCk7dGhpcy52aWV3cG9pbnRDb29yZC54PS10aGlzLnRyYW5zbGF0ZVswXSp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjt0aGlzLnZpZXdwb2ludENvb3JkLnk9LXRoaXMudHJhbnNsYXRlWzFdKnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluO2g9ay53aWR0aCp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtrPWsuaGVpZ2h0KnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluO3QuYXR0cigieCIsdGhpcy52aWV3cG9pbnRDb29yZC54KS5hdHRyKCJ5Iix0aGlzLnZpZXdwb2ludENvb3JkLnkpLmF0dHIoIndpZHRoIiwKaCkuYXR0cigiaGVpZ2h0IixrKTt0PXRoaXMubWluaW1hcFNpemUud2lkdGg7dmFyIGw9dGhpcy5taW5pbWFwU2l6ZS5oZWlnaHQscD10aGlzLnZpZXdwb2ludENvb3JkLngsbT10aGlzLnZpZXdwb2ludENvb3JkLnk7Ljg+KE1hdGgubWluKE1hdGgubWF4KDAscCtoKSx0KS1NYXRoLm1pbihNYXRoLm1heCgwLHApLHQpKSooTWF0aC5taW4oTWF0aC5tYXgoMCxtK2spLGwpLU1hdGgubWluKE1hdGgubWF4KDAsbSksbCkpLyh0KmwpP3RoaXMubWluaW1hcC5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTp0aGlzLm1pbmltYXAuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIil9fX1kLk1pbmltYXA9Zn0pKGIuc2NlbmV8fChiLnNjZW5lPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGgtbWluaW1hcC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1taW5pbWFwIixpbml0OmZ1bmN0aW9uKGIsZCxmLGgsayl7cmV0dXJuIG5ldyB0Zi5zY2VuZS5NaW5pbWFwKGIsZCxmLHRoaXMsaCxrKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC90Zi1ncmFwaC1zY2VuZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1zY2VuZSIscHJvcGVydGllczp7cmVuZGVySGllcmFyY2h5Ok9iamVjdCxuYW1lOlN0cmluZyxjb2xvckJ5OlN0cmluZyx0cmFjZUlucHV0czpCb29sZWFuLF9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZTpCb29sZWFuLF9pc0F0dGFjaGVkOkJvb2xlYW4sX3pvb206T2JqZWN0LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9oaWdobGlnaHRlZE5vZGVDaGFuZ2VkIn0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3NlbGVjdGVkTm9kZUNoYW5nZWQifSxoYW5kbGVFZGdlU2VsZWN0ZWQ6T2JqZWN0LF96b29tZWQ6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX29uWm9vbUNoYW5nZWQiLHZhbHVlOiExfSxfem9vbVN0YXJ0Q29vcmRzOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfem9vbVRyYW5zZm9ybTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX21heFpvb21EaXN0YW5jZUZvckNsaWNrOnt0eXBlOk51bWJlciwKdmFsdWU6MjB9LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb24sbWluaW1hcDpPYmplY3QsX25vZGVHcm91cEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX2Fubm90YXRpb25Hcm91cEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX2VkZ2VHcm91cEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sbWF4TWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo5fSxtaW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjZ9LG1heE1ldGFub2RlTGFiZWxMZW5ndGhMYXJnZUZvbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjExfSxtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoOnt0eXBlOk51bWJlcix2YWx1ZToxOH0scHJvZ3Jlc3M6T2JqZWN0LG5vZGVDb250ZXh0TWVudUl0ZW1zOkFycmF5LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LApoZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcn0sb2JzZXJ2ZXJzOlsiX2NvbG9yQnlDaGFuZ2VkKGNvbG9yQnkpIiwiX3JlbmRlckhpZXJhcmNoeUNoYW5nZWQocmVuZGVySGllcmFyY2h5KSIsIl9hbmltYXRlQW5kRml0KF9pc0F0dGFjaGVkLCByZW5kZXJIaWVyYXJjaHkpIiwiX3VwZGF0ZUhlYWx0aFBpbGxzKG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsIGhlYWx0aFBpbGxTdGVwSW5kZXgpIiwiX3VwZGF0ZUlucHV0VHJhY2UodHJhY2VJbnB1dHMsIHNlbGVjdGVkTm9kZSkiXSxnZXROb2RlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKGIpfSxpc05vZGVFeHBhbmRlZDpmdW5jdGlvbihiKXtyZXR1cm4gYi5leHBhbmRlZH0sc2V0Tm9kZUV4cGFuZGVkOmZ1bmN0aW9uKCl7dGhpcy5fYnVpbGQodGhpcy5yZW5kZXJIaWVyYXJjaHkpO3RoaXMuX3VwZGF0ZUxhYmVscyghdGhpcy5fem9vbWVkKX0scGFuVG9Ob2RlKGIpe3RmLmdyYXBoLnNjZW5lLnBhblRvTm9kZShiLAp0aGlzLiQuc3ZnLHRoaXMuJC5yb290LHRoaXMuX3pvb20pJiYodGhpcy5fem9vbWVkPSEwKX0sZ2V0R3JhcGhTdmdSb290KCl7cmV0dXJuIHRoaXMuJC5zdmd9LGdldENvbnRleHRNZW51KCl7cmV0dXJuIHRoaXMuJC5jb250ZXh0TWVudX0sX3Jlc2V0U3RhdGU6ZnVuY3Rpb24oKXt0aGlzLl9ub2RlR3JvdXBJbmRleD17fTt0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleD17fTt0aGlzLl9lZGdlR3JvdXBJbmRleD17fTt0aGlzLl91cGRhdGVMYWJlbHMoITEpO2QzLnNlbGVjdCh0aGlzLiQuc3ZnKS5zZWxlY3QoIiNyb290Iikuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7dGYuZ3JhcGguc2NlbmUubm9kZS5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zKHRoaXMuJC5zdmcpfSxfYnVpbGQ6ZnVuY3Rpb24oYil7dGhpcy50ZW1wbGF0ZUluZGV4PWIuaGllcmFyY2h5LmdldFRlbXBsYXRlSW5kZXgoKTt0Zi5ncmFwaC51dGlsLnRpbWUoInRmLWdyYXBoLXNjZW5lIChsYXlvdXQpOiIsZnVuY3Rpb24oKXt0Zi5ncmFwaC5sYXlvdXQubGF5b3V0U2NlbmUoYi5yb290LAp0aGlzKX0uYmluZCh0aGlzKSk7dGYuZ3JhcGgudXRpbC50aW1lKCJ0Zi1ncmFwaC1zY2VuZSAoYnVpbGQgc2NlbmUpOiIsZnVuY3Rpb24oKXt0Zi5ncmFwaC5zY2VuZS5idWlsZEdyb3VwKGQzLnNlbGVjdCh0aGlzLiQucm9vdCksYi5yb290LHRoaXMpO3RmLmdyYXBoLnNjZW5lLmFkZEdyYXBoQ2xpY2tMaXN0ZW5lcih0aGlzLiQuc3ZnLHRoaXMpO3RoaXMuX3VwZGF0ZUlucHV0VHJhY2UoKX0uYmluZCh0aGlzKSk7c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWx0aFBpbGxzKHRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxscyx0aGlzLmhlYWx0aFBpbGxTdGVwSW5kZXgpO3RoaXMubWluaW1hcC51cGRhdGUoKX0uYmluZCh0aGlzKSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fem9vbT1kMy56b29tKCkub24oImVuZCIsZnVuY3Rpb24oKXt0aGlzLl96b29tU3RhcnRDb29yZHMmJihNYXRoLnNxcnQoTWF0aC5wb3codGhpcy5fem9vbVN0YXJ0Q29vcmRzLngtCnRoaXMuX3pvb21UcmFuc2Zvcm0ueCwyKStNYXRoLnBvdyh0aGlzLl96b29tU3RhcnRDb29yZHMueS10aGlzLl96b29tVHJhbnNmb3JtLnksMikpPHRoaXMuX21heFpvb21EaXN0YW5jZUZvckNsaWNrP3RoaXMuX2ZpcmVFbmFibGVDbGljaygpOnNldFRpbWVvdXQodGhpcy5fZmlyZUVuYWJsZUNsaWNrLmJpbmQodGhpcyksNTApKTt0aGlzLl96b29tU3RhcnRDb29yZHM9bnVsbH0uYmluZCh0aGlzKSkub24oInpvb20iLGZ1bmN0aW9uKCl7dGhpcy5fem9vbVRyYW5zZm9ybT1kMy5ldmVudC50cmFuc2Zvcm07dGhpcy5fem9vbVN0YXJ0Q29vcmRzfHwodGhpcy5fem9vbVN0YXJ0Q29vcmRzPXRoaXMuX3pvb21UcmFuc2Zvcm0sdGhpcy5maXJlKCJkaXNhYmxlLWNsaWNrIikpO3RoaXMuX3pvb21lZD0hMDtkMy5zZWxlY3QodGhpcy4kLnJvb3QpLmF0dHIoInRyYW5zZm9ybSIsZDMuZXZlbnQudHJhbnNmb3JtKTt0aGlzLm1pbmltYXAuem9vbShkMy5ldmVudC50cmFuc2Zvcm0pfS5iaW5kKHRoaXMpKTsKZDMuc2VsZWN0KHRoaXMuJC5zdmcpLmNhbGwodGhpcy5fem9vbSkub24oImRibGNsaWNrLnpvb20iLG51bGwpO2QzLnNlbGVjdCh3aW5kb3cpLm9uKCJyZXNpemUiLGZ1bmN0aW9uKCl7dGhpcy5taW5pbWFwLnpvb20oKX0uYmluZCh0aGlzKSk7dGhpcy5taW5pbWFwPXRoaXMuJC5taW5pbWFwLmluaXQodGhpcy4kLnN2Zyx0aGlzLiQucm9vdCx0aGlzLl96b29tLHRmLmdyYXBoLmxheW91dC5QQVJBTVMubWluaW1hcC5zaXplLHRmLmdyYXBoLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5sYWJlbEhlaWdodCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMSl9LF9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlPSExO3RoaXMuX3Jlc2V0U3RhdGUoKTt0aGlzLl9idWlsZChiKX0sX2FuaW1hdGVBbmRGaXQ6ZnVuY3Rpb24oYil7IXRoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlJiYKYiYmc2V0VGltZW91dCh0aGlzLmZpdC5iaW5kKHRoaXMpLHRmLmdyYXBoLmxheW91dC5QQVJBTVMuYW5pbWF0aW9uLmR1cmF0aW9uKX0sX3VwZGF0ZUxhYmVsczpmdW5jdGlvbihiKXt2YXIgZD10aGlzLiQkKCIudGl0bGUiKSxmPWQuc3R5bGUsaD10aGlzLiQkKCIuYXV4VGl0bGUiKSxrPWguc3R5bGUsdD10aGlzLiQkKCIuZnVuY3Rpb25MaWJyYXJ5VGl0bGUiKS5zdHlsZTtjb25zdCBsPWQzLnNlbGVjdCh0aGlzLiQuc3ZnKTt2YXIgcD1sLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5DT1JFKS5ub2RlKCk7aWYoYiYmcCYmdGhpcy5wcm9ncmVzcyYmMTAwPT09dGhpcy5wcm9ncmVzcy52YWx1ZSl7Yj1sLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5JTkVYVFJBQ1QpLm5vZGUoKXx8bC5zZWxlY3QoIi4iKwp0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5HUk9VUCsiXHgzZS4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLm5vZGUoKTt2YXIgbT1wLmdldENUTSgpLmU7cD1iP2IuZ2V0Q1RNKCkuZTpudWxsO2YuZGlzcGxheT0iaW5saW5lIjtmLmxlZnQ9bSsicHgiO251bGwhPT1wJiZwIT09bT8oay5kaXNwbGF5PSJpbmxpbmUiLHA9TWF0aC5tYXgobStkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLHApLGsubGVmdD1wKyJweCIpOmsuZGlzcGxheT0ibm9uZSI7ZD0oZD1sLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5ub2RlKCkpP2QuZ2V0Q1RNKCkuZTpudWxsO251bGwhPT1kJiZkIT09cD8odC5kaXNwbGF5PSJpbmxpbmUiLGQ9TWF0aC5tYXgocCtoLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLGQpLHQubGVmdD1kKyJweCIpOgp0LmRpc3BsYXk9Im5vbmUifWVsc2UgZi5kaXNwbGF5PSJub25lIixrLmRpc3BsYXk9Im5vbmUiLHQuZGlzcGxheT0ibm9uZSJ9LF9jb2xvckJ5Q2hhbmdlZDpmdW5jdGlvbigpe251bGwhPXRoaXMucmVuZGVySGllcmFyY2h5JiYoXy5lYWNoKHRoaXMuX25vZGVHcm91cEluZGV4LChiLGQpPT57dGhpcy5fdXBkYXRlTm9kZVN0YXRlKGQpfSksdGhpcy5taW5pbWFwLnVwZGF0ZSgpKX0sZml0OmZ1bmN0aW9uKCl7dGhpcy5faGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2U9ITA7dGYuZ3JhcGguc2NlbmUuZml0KHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSxmdW5jdGlvbigpe3RoaXMuX3pvb21lZD0hMX0uYmluZCh0aGlzKSl9LGlzTm9kZVNlbGVjdGVkOmZ1bmN0aW9uKGIpe3JldHVybiBiPT09dGhpcy5zZWxlY3RlZE5vZGV9LGlzTm9kZUhpZ2hsaWdodGVkOmZ1bmN0aW9uKGIpe3JldHVybiBiPT09dGhpcy5oaWdobGlnaHRlZE5vZGV9LGFkZEFubm90YXRpb25Hcm91cDpmdW5jdGlvbihiLApkLGYpe2I9Yi5ub2RlLm5hbWU7dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYl09dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYl18fHt9O3RoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdW2Qubm9kZS5uYW1lXT1mfSxnZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdfSxyZW1vdmVBbm5vdGF0aW9uR3JvdXA6ZnVuY3Rpb24oYixkKXtkZWxldGUgdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYi5ub2RlLm5hbWVdW2Qubm9kZS5uYW1lXX0sYWRkTm9kZUdyb3VwOmZ1bmN0aW9uKGIsZCl7dGhpcy5fbm9kZUdyb3VwSW5kZXhbYl09ZH0sZ2V0Tm9kZUdyb3VwOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9ub2RlR3JvdXBJbmRleFtiXX0scmVtb3ZlTm9kZUdyb3VwOmZ1bmN0aW9uKGIpe2RlbGV0ZSB0aGlzLl9ub2RlR3JvdXBJbmRleFtiXX0sYWRkRWRnZUdyb3VwOmZ1bmN0aW9uKGIsZCl7dGhpcy5fZWRnZUdyb3VwSW5kZXhbYl09CmR9LGdldEVkZ2VHcm91cDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZWRnZUdyb3VwSW5kZXhbYl19LF91cGRhdGVIZWFsdGhQaWxsczpmdW5jdGlvbihiLGQpe3RmLmdyYXBoLnNjZW5lLmFkZEhlYWx0aFBpbGxzKHRoaXMuJC5zdmcsYixkKX0sX3VwZGF0ZU5vZGVTdGF0ZTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLmdldE5vZGUoYiksZj10aGlzLmdldE5vZGVHcm91cChiKTtmJiZ0Zi5ncmFwaC5zY2VuZS5ub2RlLnN0eWxpemUoZixkLHRoaXMpO2Qubm9kZS50eXBlPT09dGYuZ3JhcGguTm9kZVR5cGUuTUVUQSYmZC5ub2RlLmFzc29jaWF0ZWRGdW5jdGlvbiYmIWQuaXNMaWJyYXJ5RnVuY3Rpb24mJihmPWQzLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKycgZ1tkYXRhLW5hbWVceDNkIicrKHRmLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgrCmQubm9kZS5hc3NvY2lhdGVkRnVuY3Rpb24pKyciXScpLHRmLmdyYXBoLnNjZW5lLm5vZGUuc3R5bGl6ZShmLGQsdGhpcykpO18uZWFjaCh0aGlzLmdldEFubm90YXRpb25Hcm91cHNJbmRleChiKSxoPT57dGYuZ3JhcGguc2NlbmUubm9kZS5zdHlsaXplKGgsZCx0aGlzLHRmLmdyYXBoLnNjZW5lLkNsYXNzLkFubm90YXRpb24uTk9ERSl9KX0sX3NlbGVjdGVkTm9kZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtpZihiIT09ZCYmKGQmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShkKSxiKSl7dGhpcy5taW5pbWFwLnVwZGF0ZSgpO2Q9dGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5Lm5vZGUoYik7Zm9yKHZhciBmPVtdO251bGwhPWQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLm5hbWUhPXRmLmdyYXBoLlJPT1RfTkFNRTspZD1kLnBhcmVudE5vZGUsZi5wdXNoKGQubmFtZSk7dmFyIGg7Xy5mb3JFYWNoUmlnaHQoZixrPT57dGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkoayk7Cms9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShrKTtrLm5vZGUuaXNHcm91cE5vZGUmJiFrLmV4cGFuZGVkJiYoay5leHBhbmRlZD0hMCxofHwoaD1rKSl9KTtoJiYodGhpcy5zZXROb2RlRXhwYW5kZWQoaCksdGhpcy5fem9vbWVkPSEwKTtiJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoYik7c2V0VGltZW91dCgoKT0+e3RoaXMucGFuVG9Ob2RlKGIpfSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9fSxfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2IhPT1kJiYoYiYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKGIpLGQmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShkKSl9LF9vblpvb21DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlTGFiZWxzKCF0aGlzLl96b29tZWQpfSxfZmlyZUVuYWJsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJlbmFibGUtY2xpY2siKX0sX3VwZGF0ZUlucHV0VHJhY2U6ZnVuY3Rpb24oKXt0Zi5ncmFwaC5zY2VuZS5ub2RlLnVwZGF0ZUlucHV0VHJhY2UodGhpcy5nZXRHcmFwaFN2Z1Jvb3QoKSwKdGhpcy5yZW5kZXJIaWVyYXJjaHksdGhpcy5zZWxlY3RlZE5vZGUsdGhpcy50cmFjZUlucHV0cyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGguaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgiLHByb3BlcnRpZXM6e2dyYXBoSGllcmFyY2h5Ont0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9ncmFwaENoYW5nZWQifSxiYXNpY0dyYXBoOk9iamVjdCxzdGF0czpPYmplY3QsZGV2aWNlc0ZvclN0YXRzOk9iamVjdCxoaWVyYXJjaHlQYXJhbXM6T2JqZWN0LHByb2dyZXNzOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHRpdGxlOlN0cmluZyxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWRFZGdlOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LF9sYXN0U2VsZWN0ZWRFZGdlR3JvdXA6T2JqZWN0LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSx0cmFjZUlucHV0czpCb29sZWFuLApub2RlQ29udGV4dE1lbnVJdGVtczpBcnJheSxfcmVuZGVyRGVwdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9hbGxvd0dyYXBoU2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGhlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLGVkZ2VXaWR0aEZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0saGFuZGxlTm9kZVNlbGVjdGVkOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0sZWRnZUxhYmVsRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOiIifSxoYW5kbGVFZGdlU2VsZWN0ZWQ6e3R5cGU6T2JqZWN0LHZhbHVlOiIifX0sb2JzZXJ2ZXJzOlsiX3N0YXRzQ2hhbmdlZChzdGF0cywgZGV2aWNlc0ZvclN0YXRzKSIsIl9idWlsZE5ld1JlbmRlckhpZXJhcmNoeShncmFwaEhpZXJhcmNoeSwgZWRnZVdpZHRoRnVuY3Rpb24sIGhhbmRsZU5vZGVTZWxlY3RlZCwgZWRnZUxhYmVsRnVuY3Rpb24sIGhhbmRsZUVkZ2VTZWxlY3RlZCkiLCJfc2VsZWN0ZWROb2RlQ2hhbmdlZChzZWxlY3RlZE5vZGUpIiwKIl9zZWxlY3RlZEVkZ2VDaGFuZ2VkKHNlbGVjdGVkRWRnZSkiXSxwYW5Ub05vZGUoYil7dGhpcy4kJCgidGYtZ3JhcGgtc2NlbmUiKS5wYW5Ub05vZGUoYil9LF9idWlsZE5ld1JlbmRlckhpZXJhcmNoeShiKXtiJiZ0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeShiKX0sX3N0YXRzQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuZ3JhcGhIaWVyYXJjaHkmJihiJiZkJiYodGYuZ3JhcGguam9pblN0YXRzSW5mb1dpdGhHcmFwaCh0aGlzLmJhc2ljR3JhcGgsYixkKSx0Zi5ncmFwaC5oaWVyYXJjaHkuam9pbkFuZEFnZ3JlZ2F0ZVN0YXRzKHRoaXMuZ3JhcGhIaWVyYXJjaHkpKSx0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KSl9LF9idWlsZFJlbmRlckhpZXJhcmNoeTpmdW5jdGlvbihiKXt0Zi5ncmFwaC51dGlsLnRpbWUoIm5ldyB0Zi5ncmFwaC5yZW5kZXIuSGllcmFyY2h5IixmdW5jdGlvbigpe2Z1bmN0aW9uIGQoaCl7cmV0dXJue21pblZhbHVlOmguZG9tYWluKClbMF0sCm1heFZhbHVlOmguZG9tYWluKClbMV0sc3RhcnRDb2xvcjpoLnJhbmdlKClbMF0sZW5kQ29sb3I6aC5yYW5nZSgpWzFdfX1pZihiLnJvb3QudHlwZT09PXRmLmdyYXBoLk5vZGVUeXBlLk1FVEEpe3ZhciBmPW5ldyB0Zi5ncmFwaC5yZW5kZXIuUmVuZGVyR3JhcGhJbmZvKGIsISF0aGlzLnN0YXRzKTtmLmVkZ2VMYWJlbEZ1bmN0aW9uPXRoaXMuZWRnZUxhYmVsRnVuY3Rpb247Zi5lZGdlV2lkdGhGdW5jdGlvbj10aGlzLmVkZ2VXaWR0aEZ1bmN0aW9uO3RoaXMuX3NldENvbG9yQnlQYXJhbXMoe2NvbXB1dGVfdGltZTpkKGYuY29tcHV0ZVRpbWVTY2FsZSksbWVtb3J5OmQoZi5tZW1vcnlVc2FnZVNjYWxlKSxkZXZpY2U6Xy5tYXAoZi5kZXZpY2VDb2xvck1hcC5kb21haW4oKSxmdW5jdGlvbihoKXtyZXR1cm57ZGV2aWNlOmgsY29sb3I6Zi5kZXZpY2VDb2xvck1hcChoKX19KSx4bGFfY2x1c3RlcjpfLm1hcChmLnhsYUNsdXN0ZXJDb2xvck1hcC5kb21haW4oKSxmdW5jdGlvbihoKXtyZXR1cm57eGxhX2NsdXN0ZXI6aCwKY29sb3I6Zi54bGFDbHVzdGVyQ29sb3JNYXAoaCl9fSl9KTt0aGlzLl9zZXRSZW5kZXJIaWVyYXJjaHkoZik7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuZmlyZSgicmVuZGVyZWQiKX0pfX0uYmluZCh0aGlzKSl9LF9nZXRWaXNpYmxlOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucmVuZGVySGllcmFyY2h5LmdldE5lYXJlc3RWaXNpYmxlQW5jZXN0b3IoYik6Yn0sbGlzdGVuZXJzOnsiZ3JhcGgtc2VsZWN0IjoiX2dyYXBoU2VsZWN0ZWQiLCJkaXNhYmxlLWNsaWNrIjoiX2Rpc2FibGVDbGljayIsImVuYWJsZS1jbGljayI6Il9lbmFibGVDbGljayIsIm5vZGUtdG9nZ2xlLWV4cGFuZCI6Il9ub2RlVG9nZ2xlRXhwYW5kIiwibm9kZS1zZWxlY3QiOiJfbm9kZVNlbGVjdGVkIiwibm9kZS1oaWdobGlnaHQiOiJfbm9kZUhpZ2hsaWdodGVkIiwibm9kZS11bmhpZ2hsaWdodCI6Il9ub2RlVW5oaWdobGlnaHRlZCIsIm5vZGUtdG9nZ2xlLWV4dHJhY3QiOiJfbm9kZVRvZ2dsZUV4dHJhY3QiLAoibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiOiJfbm9kZVRvZ2dsZVNlcmllc0dyb3VwIiwiZWRnZS1zZWxlY3QiOiJfZWRnZVNlbGVjdGVkIiwiYW5ub3RhdGlvbi1zZWxlY3QiOiJfbm9kZVNlbGVjdGVkIiwiYW5ub3RhdGlvbi1oaWdobGlnaHQiOiJfbm9kZUhpZ2hsaWdodGVkIiwiYW5ub3RhdGlvbi11bmhpZ2hsaWdodCI6Il9ub2RlVW5oaWdobGlnaHRlZCJ9LGZpdDpmdW5jdGlvbigpe3RoaXMuJC5zY2VuZS5maXQoKX0sX2dyYXBoQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZ3JhcGgtc2VsZWN0Iil9LF9ncmFwaFNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmKHRoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLG51bGwpLHRoaXMuc2V0KCJzZWxlY3RlZEVkZ2UiLG51bGwpKTt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfSxfZGlzYWJsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMX0sX2VuYWJsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0KITB9LF9zZWxlY3RlZE5vZGVDaGFuZ2VkKGIpe3RoaXMuaGFuZGxlTm9kZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZChiKX0sX3NlbGVjdGVkRWRnZUNoYW5nZWQoYil7dGhpcy5fZGVzZWxlY3RQcmV2aW91c0VkZ2UoKTtiJiYodGhpcy5fbGFzdFNlbGVjdGVkRWRnZUdyb3VwLmNsYXNzZWQodGYuZ3JhcGguc2NlbmUuQ2xhc3MuRWRnZS5TRUxFQ1RFRCwhMCksdGhpcy5fdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UoYikpO3RoaXMuaGFuZGxlRWRnZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZChiKX0sX25vZGVTZWxlY3RlZDpmdW5jdGlvbihiKXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiZ0aGlzLnNldCgic2VsZWN0ZWROb2RlIixiLmRldGFpbC5uYW1lKTt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfSxfZWRnZVNlbGVjdGVkKGIpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJih0aGlzLnNldCgiX2xhc3RTZWxlY3RlZEVkZ2VHcm91cCIsYi5kZXRhaWwuZWRnZUdyb3VwKSwKdGhpcy5zZXQoInNlbGVjdGVkRWRnZSIsYi5kZXRhaWwuZWRnZURhdGEpKTt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfSxfbm9kZUhpZ2hsaWdodGVkOmZ1bmN0aW9uKGIpe3RoaXMuc2V0KCJoaWdobGlnaHRlZE5vZGUiLGIuZGV0YWlsLm5hbWUpfSxfbm9kZVVuaGlnaGxpZ2h0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiaGlnaGxpZ2h0ZWROb2RlIixudWxsKX0sX25vZGVUb2dnbGVFeHBhbmQ6ZnVuY3Rpb24oYil7dGhpcy5fbm9kZVNlbGVjdGVkKGIpO2I9Yi5kZXRhaWwubmFtZTt2YXIgZD10aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKGIpO2Qubm9kZS50eXBlIT09dGYuZ3JhcGguTm9kZVR5cGUuT1AmJih0aGlzLnJlbmRlckhpZXJhcmNoeS5idWlsZFN1YmhpZXJhcmNoeShiKSxkLmV4cGFuZGVkPSFkLmV4cGFuZGVkLHRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLiQuc2NlbmUuc2V0Tm9kZUV4cGFuZGVkKGQpfSw3NSkpfSxfbm9kZVRvZ2dsZUV4dHJhY3Q6ZnVuY3Rpb24oYil7dGhpcy5ub2RlVG9nZ2xlRXh0cmFjdChiLmRldGFpbC5uYW1lKX0sCm5vZGVUb2dnbGVFeHRyYWN0OmZ1bmN0aW9uKGIpe2I9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShiKTtiLm5vZGUuaW5jbHVkZT1iLm5vZGUuaW5jbHVkZT09dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5JTkNMVURFP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERTpiLm5vZGUuaW5jbHVkZT09dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5FWENMVURFP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERTp0aGlzLnJlbmRlckhpZXJhcmNoeS5pc05vZGVBdXhpbGlhcnkoYik/dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5JTkNMVURFOnRmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERTt0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KX0sX25vZGVUb2dnbGVTZXJpZXNHcm91cDpmdW5jdGlvbihiKXt0aGlzLm5vZGVUb2dnbGVTZXJpZXNHcm91cChiLmRldGFpbC5uYW1lKX0sbm9kZVRvZ2dsZVNlcmllc0dyb3VwOmZ1bmN0aW9uKGIpe3RmLmdyYXBoLnRvZ2dsZU5vZGVTZXJpZXNHcm91cCh0aGlzLmhpZXJhcmNoeVBhcmFtcy5zZXJpZXNNYXAsCmIpO3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7dGYuZ3JhcGguaGllcmFyY2h5LmJ1aWxkKHRoaXMuYmFzaWNHcmFwaCx0aGlzLmhpZXJhcmNoeVBhcmFtcyx0Zi5ncmFwaC51dGlsLmdldFN1YnRhc2tUcmFja2VyKHRmLmdyYXBoLnV0aWwuZ2V0VHJhY2tlcih0aGlzKSwxMDAsIk5hbWVzcGFjZSBoaWVyYXJjaHkiKSkudGhlbihmdW5jdGlvbihkKXt0aGlzLnNldCgiZ3JhcGhIaWVyYXJjaHkiLGQpO3RoaXMuX2J1aWxkUmVuZGVySGllcmFyY2h5KHRoaXMuZ3JhcGhIaWVyYXJjaHkpfS5iaW5kKHRoaXMpKX0sX2Rlc2VsZWN0UHJldmlvdXNFZGdlKCl7ZDMuc2VsZWN0KCIuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5FZGdlLlNFTEVDVEVEKS5jbGFzc2VkKHRmLmdyYXBoLnNjZW5lLkNsYXNzLkVkZ2UuU0VMRUNURUQsITEpLmVhY2goYj0+e2lmKGIubGFiZWwpe2NvbnN0IGQ9ZDMuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgicGF0aC5lZGdlbGluZSIpO2IubGFiZWwuc3RhcnRNYXJrZXJJZCYmCmQuc3R5bGUoIm1hcmtlci1zdGFydCIsYHVybCgjJHtiLmxhYmVsLnN0YXJ0TWFya2VySWR9KWApO2IubGFiZWwuZW5kTWFya2VySWQmJmQuc3R5bGUoIm1hcmtlci1lbmQiLGB1cmwoIyR7Yi5sYWJlbC5lbmRNYXJrZXJJZH0pYCl9fSl9LF91cGRhdGVNYXJrZXJPZlNlbGVjdGVkRWRnZShiKXtpZihiLmxhYmVsKXt2YXIgZD1iLmxhYmVsLnN0YXJ0TWFya2VySWR8fGIubGFiZWwuZW5kTWFya2VySWQ7aWYoZCl7Y29uc3QgZj1kLnJlcGxhY2UoImRhdGFmbG93LSIsInNlbGVjdGVkLSIpO2xldCBoPXRoaXMuJCQoIiMiK2YpO2h8fChkPXRoaXMuJC5zY2VuZS5xdWVyeVNlbGVjdG9yKCIjIitkKSxoPWQuY2xvbmVOb2RlKCEwKSxoLnNldEF0dHJpYnV0ZSgiaWQiLGYpLGguY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQtYXJyb3doZWFkIiksZC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGgpKTtiPWIubGFiZWwuc3RhcnRNYXJrZXJJZD8ibWFya2VyLXN0YXJ0IjoibWFya2VyLWVuZCI7dGhpcy5fbGFzdFNlbGVjdGVkRWRnZUdyb3VwLnNlbGVjdEFsbCgicGF0aC5lZGdlbGluZSIpLnN0eWxlKGIsCmB1cmwoIyR7Zn0pYCl9fX0sbm90OmZ1bmN0aW9uKGIpe3JldHVybiFifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWxvYWRlci90Zi1ncmFwaC1sb2FkZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtbG9hZGVyIixfdGVtcGxhdGU6bnVsbCxwcm9wZXJ0aWVzOntkYXRhc2V0czpBcnJheSxzZWxlY3RlZERhdGE6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHNlbGVjdGVkRmlsZTpPYmplY3QsY29tcGF0aWJpbGl0eVByb3ZpZGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGIuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyfSxvdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0scHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sb3V0R3JhcGhIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0R3JhcGg6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0SGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfbG9hZERhdGEoZGF0YXNldHMsIHNlbGVjdGVkRGF0YSwgb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtcywgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSIsCiJfbG9hZEZpbGUoc2VsZWN0ZWRGaWxlLCBvdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIl0sX2xvYWREYXRhKCl7dGhpcy5kZWJvdW5jZSgibG9hZCIsKCk9Pntjb25zdCBmPXRoaXMuZGF0YXNldHNbdGhpcy5zZWxlY3RlZERhdGFdO2YmJnRoaXMuX3BhcnNlQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZi5wYXRoKX0pfSxfcGFyc2VBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChmLGgpe2NvbnN0IGs9dGhpcy5vdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zLHQ9dGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXI7dGhpcy5wcm9ncmVzcz17dmFsdWU6MCxtc2c6IiJ9O2NvbnN0IGw9Yi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcykscD1PYmplY3QuYXNzaWduKHt9LGIuZ3JhcGguaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXMsayk7Yi5ncmFwaC5sb2FkZXIuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChsLApmLGgsdCxwKS50aGVuKCh7Z3JhcGg6bSxncmFwaEhpZXJhcmNoeTpufSk9Pnt0aGlzLl9zZXRPdXRIaWVyYXJjaHlQYXJhbXMocCk7dGhpcy5fc2V0T3V0R3JhcGgobSk7dGhpcy5fc2V0T3V0R3JhcGhIaWVyYXJjaHkobil9KX0sX2xvYWRGaWxlKGYpe2lmKGYpe2Y9Zi50YXJnZXQ7dmFyIGg9Zi5maWxlc1swXTtoJiYoZi52YWx1ZT0iIix0aGlzLl9wYXJzZUFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKG51bGwsaCkpfX19KX0pKGQubG9hZGVyfHwoZC5sb2FkZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL2hlYWx0aC1waWxscy5qcwp2YXIgVmk7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGssdCl7aWYobnVsbD09ayl0aHJvdyBFcnJvcihgTWlzc2luZyByZWZWYWx1ZSBmb3IgY29uZGl0aW9uICgke3R9KS5gKTt9ZnVuY3Rpb24gZihrKXtyZXR1cm4gbnVsbD09a3x8MD09ay5sZW5ndGh8fDEhPT1rWzBdfWNvbnN0IGg9e0lORl9PUl9OQU46e2Rlc2NyaXB0aW9uOiJDb250YWlucyArLy1cdTIyMWUgb3IgTmFOIixwcmVkaWNhdGU6az0+MDxrWzJdfHwwPGtbM118fDA8a1s3XX0sSU5GOntkZXNjcmlwdGlvbjoiQ29udGFpbnMgKy8tXHUyMjFlIixwcmVkaWNhdGU6az0+MDxrWzNdfHwwPGtbN119LE5BTjp7ZGVzY3JpcHRpb246IkNvbnRhaW5zIE5hTiIscHJlZGljYXRlOms9PjA8a1syXX0sTUFYX0dUOntkZXNjcmlwdGlvbjoiTWF4IFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiTUFYX0dUIik7cmV0dXJuIGtbOV0+dH19LE1BWF9MVDp7ZGVzY3JpcHRpb246Ik1heCBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1BWF9MVCIpOwpyZXR1cm4ga1s5XTx0fX0sTUlOX0dUOntkZXNjcmlwdGlvbjoiTWluIFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiTUlOX0dUIik7cmV0dXJuIGtbOF0+dH19LE1JTl9MVDp7ZGVzY3JpcHRpb246Ik1pbiBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1JTl9MVCIpO3JldHVybiBrWzhdPHR9fSxNRUFOX0dUOntkZXNjcmlwdGlvbjoiTWVhbiBceDNlIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1FQU5fR1QiKTtyZXR1cm4ga1sxMF0+dH19LE1FQU5fTFQ6e2Rlc2NyaXB0aW9uOiJNZWFuIFx4M2MiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiTUVBTl9MVCIpO3JldHVybiBrWzEwXTx0fX0sUkFOR0VfR1Q6e2Rlc2NyaXB0aW9uOiJNYXggLSBNaW4gXHgzZSIscHJlZGljYXRlOihrLHQpPT57ZCh0LCJSQU5HRV9HVCIpO3JldHVybiBrWzldLWtbOF0+dH19LFJBTkdFX0xUOntkZXNjcmlwdGlvbjoiTWF4IC0gTWluIFx4M2MiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiUkFOR0VfTFQiKTsKcmV0dXJuIGtbOV0ta1s4XTx0fX0sU1REREVWX0dUOntkZXNjcmlwdGlvbjoiU3RhbmRhcmQgZGV2aWF0aW9uIFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiU1REREVWX0dUIik7cmV0dXJuIE1hdGguc3FydChrWzExXSk+dH19LFNURERFVl9MVDp7ZGVzY3JpcHRpb246IlN0YW5kYXJkIGRldmlhdGlvbiBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIlNURERFVl9MVCIpO3JldHVybiBNYXRoLnNxcnQoa1sxMV0pPHR9fX07Yi50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXk9ZnVuY3Rpb24oayl7Zm9yKGNvbnN0IHQgaW4gaClpZihoLmhhc093blByb3BlcnR5KHQpJiZoW3RdLmRlc2NyaXB0aW9uPT09aylyZXR1cm4gdDtyZXR1cm4gbnVsbH07Yi5jaGVja0hlYWx0aFBpbGxBZ2FpbnN0VGVuc29yQ29uZGl0aW9uS2V5PWZ1bmN0aW9uKGssdCxsKXtpZihmKHQpKXJldHVybiExO2s9aFtrXS5wcmVkaWNhdGU7cmV0dXJuIGsodCxsKX19KShWaXx8KFZpPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1jb250aW51ZS1kaWFsb2ciLHByb3BlcnRpZXM6e2NvbnRpbnVlTnVtOnt0eXBlOk51bWJlcix2YWx1ZTo1fSxzZXNzaW9uUnVuR286RnVuY3Rpb24sdGVuc29yQ29uZGl0aW9uR286RnVuY3Rpb24sZm9yY2VDb250aW51YXRpb25TdG9wOkZ1bmN0aW9uLF9jb250aW51ZUJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiJ9LF9jb250aW51ZUJ1dHRvbkNvbnRpbnVlVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IkNvbnRpbnVlLi4uIixyZWFkb25seTohMH0sX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJTdG9wIENvbnRpbnVhdGlvbiIscmVhZG9ubHk6ITB9LF9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbjpTdHJpbmcsX3RlbnNvckNvbmRpdGlvblJlZlZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sX2lzUmVmVmFsdWVJbnB1dEhpZGRlbjp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLApub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfb25TZWxlY3RlZFRlbnNvckNvbmRpdGlvbkNoYW5nZWQoX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKSJdLG5vdGlmeUNvbnRpbnVhdGlvblN0b3AoKXt0aGlzLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMSl9LF9vcGVuRGlhbG9nKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLm9wZW4oKX0sX2Nsb3NlRGlhbG9nKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLmNsb3NlKCl9LF9jb250aW51ZUJ1dHRvbkNhbGxiYWNrKCl7dGhpcy5fY29udGludWVCdXR0b25UZXh0PT09dGhpcy5fY29udGludWVCdXR0b25TdG9wVGV4dD90aGlzLmZvcmNlQ29udGludWF0aW9uU3RvcCgpOnRoaXMuX29wZW5EaWFsb2coKX0sdXBkYXRlQ29udGludWVCdXR0b25UZXh0KGIpe3RoaXMuc2V0KCJfY29udGludWVCdXR0b25UZXh0IixiP3RoaXMuX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ6dGhpcy5fY29udGludWVCdXR0b25Db250aW51ZVRleHQpfSxfc2Vzc2lvblJ1bkdvQnV0dG9uQ2FsbGJhY2soKXswPAp0aGlzLmNvbnRpbnVlTnVtPyh0aGlzLnNlc3Npb25SdW5Hbyh0aGlzLmNvbnRpbnVlTnVtKSx0aGlzLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMCksdGhpcy5fY2xvc2VEaWFsb2coKSk6dGhpcy5zZXQoImNvbnRpbnVlTnVtIiwxKX0sX3RlbnNvckNvbnRpbnVlR29CdXR0b25DYWxsYmFjaygpe2lmKG51bGwhPXRoaXMuX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKXt2YXIgYj1WaS50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXkodGhpcy5fc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pO251bGw9PWImJmNvbnNvbGUuZXJyb3IoIkludmFsaWQgVGVuc29yIENvbmRpdGlvbiBuYW1lOiIrdGhpcy5fc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pO3ZhciBkPU51bWJlcih0aGlzLl90ZW5zb3JDb25kaXRpb25SZWZWYWx1ZSk7TnVtYmVyLmlzRmluaXRlKGQpPyh0aGlzLnRlbnNvckNvbmRpdGlvbkdvKGIsZCksdGhpcy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApLHRoaXMuX2Nsb3NlRGlhbG9nKCkpOgp0aGlzLnNldCgiX3RlbnNvckNvbmRpdGlvblJlZlZhbHVlIiwwKX19LF9vblNlbGVjdGVkVGVuc29yQ29uZGl0aW9uQ2hhbmdlZChiKXtiPVZpLnRlbnNvckNvbmRpdGlvbkRlc2NyaXB0aW9uMktleShiKTt0aGlzLnNldCgiX2lzUmVmVmFsdWVJbnB1dEhpZGRlbiIsLTEhPT1bIklORl9PUl9OQU4iLCJJTkYiLCJOQU4iXS5pbmRleE9mKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2ciLHByb3BlcnRpZXM6e190aXRsZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2N1c3RvbU1lc3NhZ2U6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9oYXNDdXN0b21NZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzQ3VzdG9tTWVzc2FnZShfY3VzdG9tTWVzc2FnZSkifSxfaG9zdDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3BvcnQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9vcGVuOnt0eXBlOkJvb2xlYW59LF9oaWRkZW46e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIaWRkZW4oX29wZW4pIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvcGVuRGlhbG9nKGIsZCl7dGhpcy5zZXQoIl90aXRsZSIsIkRlYnVnZ2VyIGlzIHdhaXRpbmcgZm9yIFNlc3Npb24ucnVuKCkgY29ubmVjdGlvbnMuLi4iKTt0aGlzLnNldCgiX2N1c3RvbU1lc3NhZ2UiLG51bGwpO3RoaXMuJC5kaWFsb2cub3BlbigpOwpudWxsIT1iJiZudWxsIT1kJiYodGhpcy5zZXQoIl9ob3N0IixiKSx0aGlzLnNldCgiX3BvcnQiLGQpKX0sY2xvc2VEaWFsb2coKXt0aGlzLiQuZGlhbG9nLmNsb3NlKCl9LG9wZW5EaXNhYmxlZERpYWxvZygpe3RoaXMuc2V0KCJfdGl0bGUiLCJEZWJ1Z2dlciBpcyBub3QgZW5hYmxlZCBpbiB0aGlzIFRlbnNvckJvYXJkIGluc3RhbmNlIik7dGhpcy5zZXQoIl9jdXN0b21NZXNzYWdlIiwiVG8gZW5hYmxlIHRoZSBkZWJ1Z2dlciBpbiBUZW5zb3JCb2FyZCwgdXNlIHRoZSBmbGFnOiAtLWRlYnVnZ2VyX3BvcnQgXHgzY3BvcnRfbnVtYmVyXHgzZSIpO3RoaXMuJC5kaWFsb2cub3BlbigpfSxfY29tcHV0ZUhpZGRlbihiKXtyZXR1cm4hYn0sX2NvbXB1dGVIYXNDdXN0b21NZXNzYWdlKGIpe3JldHVybiFfLmlzRW1wdHkoYil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLXJlc2l6ZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItcmVzaXplciIscHJvcGVydGllczp7Y3VycmVudExlbmd0aDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxtaW5MZW5ndGg6TnVtYmVyLG1heExlbmd0aDpOdW1iZXIsaXNIb3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfcmVzaXplcklkZW50aWZpZXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9pc1ZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNWZXJ0aWNhbChpc0hvcml6b250YWwpIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITB9LF9kcmFnU3RhcnRQb3NpdGlvbjpOdW1iZXIsX2RyYWdTdGFydExlbmd0aDpOdW1iZXIsX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2s6T2JqZWN0LF9wcmV2aW91c01vdXNlVXBDYWxsYmFjazpPYmplY3R9LGxpc3RlbmVyczp7bW91c2Vkb3duOiJfaGFuZGxlTW91c2VEb3duIn0sCl9oYW5kbGVNb3VzZURvd24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2VuZERyYWcoKTt0aGlzLl9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrPWQ9PntkLnByZXZlbnREZWZhdWx0KCk7ZD10aGlzLl9kcmFnU3RhcnRMZW5ndGgrKHRoaXMuX2dldFBvc2l0aW9uUmVsYXRpdmVUb1ZpZXdwb3J0KGQpLXRoaXMuX2RyYWdTdGFydFBvc2l0aW9uKTtkPU1hdGgubWF4KGQsdGhpcy5taW5MZW5ndGgpO2Q9TWF0aC5taW4oZCx0aGlzLm1heExlbmd0aCk7dGhpcy5zZXQoImN1cnJlbnRMZW5ndGgiLGQpfTt0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaz1kPT57ZC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2VuZERyYWcoKX07dGhpcy5zZXQoIl9kcmFnU3RhcnRQb3NpdGlvbiIsdGhpcy5fZ2V0UG9zaXRpb25SZWxhdGl2ZVRvVmlld3BvcnQoYikpO3RoaXMuc2V0KCJfZHJhZ1N0YXJ0TGVuZ3RoIix0aGlzLmN1cnJlbnRMZW5ndGgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwKdGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2ssITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2ssITEpfSxfZ2V0UG9zaXRpb25SZWxhdGl2ZVRvVmlld3BvcnQoYil7cmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsP2IuY2xpZW50WTpiLmNsaWVudFh9LF9lbmREcmFnKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaywhMSk7dGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaz1udWxsO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaywhMSk7dGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2s9bnVsbH0sX2NvbXB1dGVJc1ZlcnRpY2FsKGIpe3JldHVybiFifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC9zZWxlY3Rpb24tdHJlZS1ub2RlLmpzCihmdW5jdGlvbihiKXtiLk5PREVfTkFNRV9TRVBBUkFUT1I9Ii8iO2IuREVWSUNFX05BTUVfUEFUVEVSTj0vXlwvam9iOltBLVphLXowLTlfXStcL3JlcGxpY2E6WzAtOV9dK1wvdGFzazpbMC05XStcL2RldmljZTpbQS1aYS16MC05X10rOlswLTldKy87bGV0IGQ7KGZ1bmN0aW9uKGspe2tbay5FTVBUWT0wXT0iRU1QVFkiO2tbay5DSEVDS0VEPTFdPSJDSEVDS0VEIjtrW2suUEFSVElBTD0yXT0iUEFSVElBTCJ9KShkPWIuQ2hlY2tib3hTdGF0ZXx8KGIuQ2hlY2tib3hTdGF0ZT17fSkpO2Iuc3BsaXROb2RlTmFtZT1mdW5jdGlvbihrKXtsZXQgdD1bXTtjb25zdCBsPWsubWF0Y2goYi5ERVZJQ0VfTkFNRV9QQVRURVJOKTtudWxsIT1sJiYodC5wdXNoKGxbMF0pLCIvIiE9PWtbbFswXS5sZW5ndGhdJiZjb25zb2xlLmVycm9yKCdObyBzbGFzaCAoIi8iKSBhZnRlciBkZXZpY2UgbmFtZSBpbiBub2RlIG5hbWU6JyxrKSxrPWsuc2xpY2UobFswXS5sZW5ndGgrMSkpO3JldHVybiB0LmNvbmNhdChrLnNwbGl0KGIuTk9ERV9OQU1FX1NFUEFSQVRPUikpfTsKYi5nZXRDbGVhbk5vZGVOYW1lPWZ1bmN0aW9uKGspe2xldCB0PWs7Y29uc3QgbD1rLm1hdGNoKGIuREVWSUNFX05BTUVfUEFUVEVSTik7bnVsbCE9bD8odC5sZW5ndGg+bFswXS5sZW5ndGgmJiIvIiE9dFtsWzBdLmxlbmd0aF0mJmNvbnNvbGUuZXJyb3IoJ05vIHNsYXNoICgiLyIpIGFmdGVyIGRldmljZSBuYW1lIGluIG5vZGUgbmFtZTonLGspLHQ9dC5zbGljZShsWzBdLmxlbmd0aCsxKSk6Ii8iPT09dFswXSYmKHQ9dC5zbGljZSgxKSk7dC5pbmRleE9mKCIpIik9PT10Lmxlbmd0aC0xJiYodD10LnNsaWNlKDAsdC5pbmRleE9mKCIvKCIpKSk7cmV0dXJuIHR9O2Iuc29ydEFuZEJhc2VFeHBhbmREZWJ1Z1dhdGNoZXM9ZnVuY3Rpb24oayl7ay5zb3J0KChsLHApPT5sLm5vZGVfbmFtZTxwLm5vZGVfbmFtZT8tMTpsLm5vZGVfbmFtZT5wLm5vZGVfbmFtZT8xOmwub3V0cHV0X3Nsb3QtcC5vdXRwdXRfc2xvdCk7Zm9yKGxldCBsPTA7bDxrLmxlbmd0aDsrK2wpe3ZhciB0PWtbbF0ubm9kZV9uYW1lKwoiLyI7bGV0IHA9ITE7Zm9yKGxldCBtPWwrMTttPGsubGVuZ3RoOysrbSlpZigwPT09a1ttXS5ub2RlX25hbWUuaW5kZXhPZih0KSl7cD0hMDticmVha31wJiYodD1rW2xdLm5vZGVfbmFtZS5zcGxpdCgiLyIpLGtbbF0ubm9kZV9uYW1lKz0iLygiK3RbdC5sZW5ndGgtMV0rIikiKX19O2IucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uPWZ1bmN0aW9uKGspe3JldHVybiBrLmVuZHNXaXRoKCIpIik/ay5zbGljZSgwLGsubGFzdEluZGV4T2YoIi8oIikpOmt9O2IuYXNzZW1ibGVEZXZpY2VBbmROb2RlTmFtZXM9ZnVuY3Rpb24oayl7Y29uc3QgdD1bbnVsbCxudWxsXTtpZihrWzBdLm1hdGNoKGIuREVWSUNFX05BTUVfUEFUVEVSTikpe2xldCBsPWtbMF07Ii8iPT09bFtsLmxlbmd0aC0xXSYmKGw9bC5zbGljZSgwLGwubGVuZ3RoLTEpKTt0WzBdPWw7dFsxXT1rLnNsaWNlKDEpLmpvaW4oIi8iKX1lbHNlIHRbMV09ay5qb2luKCIvIik7cmV0dXJuIHR9O2xldCBmOyhmdW5jdGlvbihrKXtrW2suTm9kZU5hbWU9CjBdPSJOb2RlTmFtZSI7a1trLk9wVHlwZT0xXT0iT3BUeXBlIn0pKGY9Yi5EZWJ1Z1dhdGNoRmlsdGVyTW9kZXx8KGIuRGVidWdXYXRjaEZpbHRlck1vZGU9e30pKTtiLmZpbHRlckRlYnVnV2F0Y2hlcz1mdW5jdGlvbihrLHQsbCl7aWYodD09PWYuTm9kZU5hbWUpcmV0dXJuIGsuZmlsdGVyKHA9PnAubm9kZV9uYW1lLm1hdGNoKGwpKTtpZih0PT09Zi5PcFR5cGUpcmV0dXJuIGsuZmlsdGVyKHA9PnAub3BfdHlwZS5tYXRjaChsKSl9O2NsYXNzIGh7Y29uc3RydWN0b3Ioayx0LGwscCl7dGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlPXQ7dGhpcy5kZWJ1Z1dhdGNoPXA7dGhpcy5uYW1lPWs7dGhpcy5kZWJ1Z1dhdGNoPXA7dGhpcy5jaGVja2JveFN0YXRlPWQuRU1QVFk7dGhpcy5wYXJlbnQ9bDt0aGlzLmNoaWxkcmVuPXt9O3RoaXMuY2hlY2tib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItY2hlY2tib3giKTt0aGlzLmNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsKCk9Pgp7dGhpcy5faGFuZGxlQ2hhbmdlKCl9LCExKX1faGFuZGxlQ2hhbmdlKCl7aWYodGhpcy5hdm9pZFByb3BhZ2F0aW9uKXRoaXMuZGVidWdXYXRjaCYmdGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlKHRoaXMuZGVidWdXYXRjaCx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCkpO2Vsc2UgaWYodGhpcy5kZWJ1Z1dhdGNoKXRoaXMuc2V0Q2hlY2tib3hTdGF0ZSh0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCk/ZC5DSEVDS0VEOmQuRU1QVFksITApLHRoaXMuaXNDaGVja2JveENoZWNrZWQoKT90aGlzLnNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKTp0aGlzLnNldE5vZGVzQWJvdmVUb0VtcHR5KCksdGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlKHRoaXMuZGVidWdXYXRjaCx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCkpO2Vsc2UgaWYodGhpcy5zZXRDaGVja2JveFN0YXRlKHRoaXMuaXNDaGVja2JveENoZWNrZWQoKT9kLkNIRUNLRUQ6ZC5FTVBUWSwhMCksdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpKXtjb25zdCB0PV8udmFsdWVzKHRoaXMuY2hpbGRyZW4pOwpmb3IoO3QubGVuZ3RoOyl7dmFyIGs9dC5wb3AoKTtfLmZvckVhY2goay5jaGlsZHJlbixsPT50LnB1c2gobCkpO2suc2V0Q2hlY2tib3hTdGF0ZShkLkNIRUNLRUQsITApfXRoaXMuc2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpfWVsc2V7Y29uc3QgdD1fLnZhbHVlcyh0aGlzLmNoaWxkcmVuKTtmb3IoO3QubGVuZ3RoOylrPXQucG9wKCksXy5mb3JFYWNoKGsuY2hpbGRyZW4sbD0+dC5wdXNoKGwpKSxrLnNldENoZWNrYm94U3RhdGUoZC5FTVBUWSwhMCk7dGhpcy5zZXROb2Rlc0Fib3ZlVG9FbXB0eSgpfX1pc0xlYWYoKXtyZXR1cm4hIXRoaXMuZGVidWdXYXRjaH1zZXRUb0FsbENoZWNrZWRFeHRlcm5hbGx5KCl7dGhpcy5zZXRDaGVja2JveFN0YXRlKGQuQ0hFQ0tFRCk7dGhpcy5faGFuZGxlQ2hhbmdlKCl9c2V0Q2hlY2tib3hTdGF0ZShrLHQpe3RoaXMuYXZvaWRQcm9wYWdhdGlvbj10O3RoaXMuY2hlY2tib3hTdGF0ZT1rO3RoaXMuY2hlY2tib3guY2xhc3NMaXN0LnRvZ2dsZSgicGFydGlhbC1jaGVja2JveCIsCms9PT1kLlBBUlRJQUwpO2s9PT1kLkNIRUNLRUQ/dGhpcy5jaGVja2JveC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIik6dGhpcy5jaGVja2JveC5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKTt0aGlzLmF2b2lkUHJvcGFnYXRpb249ITF9aXNDaGVja2JveENoZWNrZWQoKXtyZXR1cm4gdGhpcy5jaGVja2JveC5oYXNBdHRyaWJ1dGUoImNoZWNrZWQiKX1zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCl7bGV0IGs9dGhpcy5wYXJlbnQsdD0hMTtmb3IoO2s7KXQ/ay5zZXRDaGVja2JveFN0YXRlKGQuUEFSVElBTCwhMCk6KHQ9LTEhPT1fLmZpbmRJbmRleChfLnZhbHVlcyhrLmNoaWxkcmVuKSxsPT5sLmNoZWNrYm94U3RhdGUhPT1kLkNIRUNLRUQpLGsuc2V0Q2hlY2tib3hTdGF0ZSh0P2QuUEFSVElBTDpkLkNIRUNLRUQsITApKSxrPWsucGFyZW50fXNldE5vZGVzQWJvdmVUb0VtcHR5KCl7bGV0IGs9dGhpcy5wYXJlbnQsdD0hMTtmb3IoO2s7KXQ/ay5zZXRDaGVja2JveFN0YXRlKGQuUEFSVElBTCwKITApOih0PS0xIT09Xy5maW5kSW5kZXgoXy52YWx1ZXMoay5jaGlsZHJlbiksbD0+bC5jaGVja2JveFN0YXRlIT09ZC5FTVBUWSksay5zZXRDaGVja2JveFN0YXRlKHQ/ZC5QQVJUSUFMOmQuRU1QVFksITApKSxrPWsucGFyZW50fXNldExldmVsRG9tKGspe3RoaXMubGV2ZWxEb209a319Yi5TZWxlY3Rpb25UcmVlTm9kZT1ofSkoVml8fChWaT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1vcC1zZWxlY3Rvci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1vcC1zZWxlY3RvciIscHJvcGVydGllczp7ZGVidWdXYXRjaGVzOkFycmF5LGRlYnVnV2F0Y2hDaGFuZ2U6T2JqZWN0LG5vZGVDbGlja2VkOkZ1bmN0aW9uLGZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZm9yY2VFeHBhbmROb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfbGV2ZWxOYW1lMkNvbnRhaW5lcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX2xldmVsTmFtZTJOb2RlOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfd2F0Y2hIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVdhdGNoSGllcmFyY2h5KGRlYnVnV2F0Y2hlcywgZGVidWdXYXRjaENoYW5nZSwgX2ZpbHRlck1vZGUsIF9maWx0ZXJJbnB1dCkifSxfZmlsdGVyTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6Ik5vZGUgTmFtZSIsCm5vdGlmeTohMH0sX2ZpbHRlcklucHV0Ont0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LF9pc0xvYWRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2hpZ2hsaWdodGVkTGV2ZWxEb206e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfcmVuZGVySGllcmFyY2h5V2l0aFRpbWVvdXQoX3dhdGNoSGllcmFyY2h5LCBkZWJ1Z1dhdGNoQ2hhbmdlKSIsIl9oYW5kbGVGb3JjZU5vZGVFeHBhbmRBbmRDaGVjayhmb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWUpIiwiX2hhbmRsZUZvcmNlTm9kZUV4cGFuZChmb3JjZUV4cGFuZE5vZGVOYW1lKSJdLF9jb21wdXRlV2F0Y2hIaWVyYXJjaHkoYixkLGYsaCl7aD1oLnRyaW0oKTtsZXQgaz1iO251bGwhPWYmJjA8aC5sZW5ndGgmJihrPVZpLmZpbHRlckRlYnVnV2F0Y2hlcyhiLFZpLkRlYnVnV2F0Y2hGaWx0ZXJNb2RlW2YucmVwbGFjZSgvXHMvZywiIildLG5ldyBSZWdFeHAoaCkpKTtjb25zdCB0PW5ldyBWaS5TZWxlY3Rpb25UcmVlTm9kZSgiIiwKZCk7dC5pc1Jvb3Q9ITA7Xy5mb3JFYWNoKGssbD0+e2NvbnN0IHA9Vmkuc3BsaXROb2RlTmFtZShsLmRldmljZV9uYW1lKyIvIitsLm5vZGVfbmFtZSk7bGV0IG09dDtfLmZvckVhY2gocCwobixxKT0+e3E9PT1wLmxlbmd0aC0xPyhxPW5ldyBWaS5TZWxlY3Rpb25UcmVlTm9kZShuLGQsbSxsKSxtLmNoaWxkcmVuW25dPXEpOihtLmNoaWxkcmVuW25dfHwobS5jaGlsZHJlbltuXT1uZXcgVmkuU2VsZWN0aW9uVHJlZU5vZGUobixkLG0pKSxtPW0uY2hpbGRyZW5bbl0pfSl9KTtyZXR1cm4gdH0sX2NsZWFyU2VsZWN0b3JIaWVyYXJjaHkoKXtjb25zdCBiPXRoaXMuJCQoIiNzZWxlY3Rvci1oaWVyYXJjaHkiKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfSxfcmVuZGVySGllcmFyY2h5V2l0aFRpbWVvdXQoYixkLGYsaCl7dGhpcy5faXNMb2FkaW5nfHwodGhpcy5zZXQoIl9pc0xvYWRpbmciLCEwKSx0aGlzLl9jbGVhclNlbGVjdG9ySGllcmFyY2h5KCksCnNldFRpbWVvdXQoKCk9Pnt0aGlzLl9yZW5kZXJIaWVyYXJjaHkoYixkLGYsaCl9LDEwKSl9LF9yZW5kZXJIaWVyYXJjaHkoYixkKXt0aGlzLnNldCgiX2xldmVsTmFtZTJDb250YWluZXIiLHt9KTt0aGlzLnNldCgiX2xldmVsTmFtZTJOb2RlIix7fSk7Yj10aGlzLl9yZW5kZXJMZXZlbChudWxsLG51bGwsYixkKTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2VsZWN0b3ItaGllcmFyY2h5IikpLmFwcGVuZENoaWxkKGIpO3RoaXMuc2V0KCJfaXNMb2FkaW5nIiwhMSl9LF9yZW5kZXJMZXZlbChiLGQsZixoKXtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO251bGwhPWImJmsuc2V0QXR0cmlidXRlKCJsZXZlbC1uYW1lIixiKTtsZXQgdDt0PW51bGw9PWQ/YjpkKyIvIitiO1BvbHltZXIuZG9tKGspLmNsYXNzTGlzdC5hZGQoImxldmVsLWNvbnRhaW5lciIpO2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1jb2xsYXBzZSIpO2lmKGIpe3RoaXMuX2xldmVsTmFtZTJDb250YWluZXJbdF09Cmw7bC5yZW1vdmVBdHRyaWJ1dGUoIm9wZW5lZCIpO1BvbHltZXIuZG9tKGspLmNsYXNzTGlzdC5hZGQoImluZGVudGVkLWxldmVsLWNvbnRhaW5lciIpO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7UG9seW1lci5kb20oZCkuY2xhc3NMaXN0LmFkZCgibGV2ZWwtdGl0bGUiKTtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7UG9seW1lci5kb20obikuY2xhc3NMaXN0LmFkZCgibm9kZS1leHBhbmQtYnV0dG9uIik7Y29uc3QgcT0oKT0+e24uc2V0QXR0cmlidXRlKCJpY29uIixsLmhhc0F0dHJpYnV0ZSgib3BlbmVkIik/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUiKX07bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntsLmhhc0F0dHJpYnV0ZSgib3BlbmVkIik/bC5yZW1vdmVBdHRyaWJ1dGUoIm9wZW5lZCIpOmwuc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKTtxKCl9LCExKTtxKCk7UG9seW1lci5kb20oZCkuYXBwZW5kQ2hpbGQobik7ClBvbHltZXIuZG9tKGQpLmFwcGVuZENoaWxkKGYuY2hlY2tib3gpO2Yuc2V0TGV2ZWxEb20oZCk7Y29uc3QgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7UG9seW1lci5kb20odSkuY2xhc3NMaXN0LmFkZCgibGV2ZWwtdGl0bGUtdGV4dCIpO3UudGV4dENvbnRlbnQ9YjtQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZCh1KTtQb2x5bWVyLmRvbShrKS5hcHBlbmRDaGlsZChkKTsoYi5tYXRjaChWaS5ERVZJQ0VfTkFNRV9QQVRURVJOKXx8MT09PU9iamVjdC5rZXlzKGYuY2hpbGRyZW4pLmxlbmd0aCkmJmwuc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKX1lbHNlIGwuc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKTtjb25zdCBwPVtdLG09W107UG9seW1lci5kb20obCkuY2xhc3NMaXN0LmFkZCgiY29udGVudC1jb250YWluZXIiKTtfLmZvckVhY2goZi5jaGlsZHJlbiwobixxKT0+e2NvbnN0IHU9bi5kZWJ1Z1dhdGNoO3ZhciB4PXQ7bnVsbD09dCYmKHg9IiIpO3grPSIvIitxOwp0aGlzLl9sZXZlbE5hbWUyTm9kZVt4XT1uO251bGwhPXRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbeF0mJihuLnNldENoZWNrYm94U3RhdGUoVmkuQ2hlY2tib3hTdGF0ZS5DSEVDS0VEKSxuLnNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKSk7aWYodSl7eD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtQb2x5bWVyLmRvbSh4KS5jbGFzc0xpc3QuYWRkKCJvcC1kZXNjcmlwdGlvbiIpO24uY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix5PT57dGhpcy5faGFuZGxlTGVhZk5vZGVTZWxlY3RlZChoLHUseS50YXJnZXQuY2hlY2tlZCl9LCExKTtQb2x5bWVyLmRvbSh4KS5hcHBlbmRDaGlsZChuLmNoZWNrYm94KTtuLnNldExldmVsRG9tKHgpO3ZhciBBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtBLnRleHRDb250ZW50PSJbIit1Lm9wX3R5cGUrIl0iO0Euc2V0QXR0cmlidXRlKCJjbGFzcyIsIm9wLXR5cGUiKTtQb2x5bWVyLmRvbSh4KS5hcHBlbmRDaGlsZChBKTsKQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7QS50ZXh0Q29udGVudD1xO0Euc2V0QXR0cmlidXRlKCJjbGFzcyIsIm9wLXRpdGxlLWxlYWYiKTtBLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e2NvbnN0IHk9dGhpcy5fZ2V0RGV2aWNlQW5kTm9kZU5hbWVzKHEsayk7dGhpcy5ub2RlQ2xpY2tlZCh5WzBdLHlbMV0pfSwhMSk7UG9seW1lci5kb20oeCkuYXBwZW5kQ2hpbGQoQSk7bS5wdXNoKHgpfWVsc2Ugbi5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHk9Pnt0aGlzLl9oYW5kbGVNZXRhTm9kZUNoYW5nZShuLGgseS50YXJnZXQuY2hlY2tlZCl9KSxwLnB1c2godGhpcy5fcmVuZGVyTGV2ZWwocSx0LG4saCkpfSk7Yj1uPT57UG9seW1lci5kb20obCkuYXBwZW5kQ2hpbGQobil9O18uZm9yRWFjaChtLGIpO18uZm9yRWFjaChwLGIpO1BvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGwpO3JldHVybiBrfSxfZ2V0TGVhZkRlYnVnV2F0Y2hlcyhiLGQpe2IuZGVidWdXYXRjaD8KZC5wdXNoKGIuZGVidWdXYXRjaCk6Xy5mb3JFYWNoKGIuY2hpbGRyZW4sZj0+e3RoaXMuX2dldExlYWZEZWJ1Z1dhdGNoZXMoZixkKX0pfSxfZ2V0RGV2aWNlQW5kTm9kZU5hbWVzKGIsZCl7Zm9yKGI9W2JdOzspe2NvbnN0IGY9ZC5nZXRBdHRyaWJ1dGUoImxldmVsLW5hbWUiKTtpZihudWxsPT1mKWJyZWFrO2Vsc2UgYi5wdXNoKGYpO2Q9UG9seW1lci5kb20oZCkucGFyZW50Tm9kZS5wYXJlbnROb2RlfWIucmV2ZXJzZSgpO3JldHVybiBWaS5hc3NlbWJsZURldmljZUFuZE5vZGVOYW1lcyhiKX0sX2hhbmRsZU1ldGFOb2RlQ2hhbmdlKGIsZCxmKXtsZXQgaD1bXTt0aGlzLl9nZXRMZWFmRGVidWdXYXRjaGVzKGIsaCk7Xy5mb3JFYWNoKGgsaz0+e3RoaXMuX2hhbmRsZUxlYWZOb2RlU2VsZWN0ZWQoZCxrLGYpfSl9LF9oYW5kbGVMZWFmTm9kZVNlbGVjdGVkKGIsZCxmKXtjb25zdCBoPWQuZGV2aWNlX25hbWUrIi8iK2Qubm9kZV9uYW1lO2Y/dGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1toXT0KZDpkZWxldGUgdGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1toXTtiKGQsZil9LF9oYW5kbGVGb3JjZU5vZGUoYixkKXt0aGlzLnNldCgiX2ZpbHRlcklucHV0IiwiIik7c2V0VGltZW91dCgoKT0+e2lmKG51bGwhPWImJm51bGwhPXRoaXMuX2xldmVsTmFtZTJDb250YWluZXIpe3ZhciBmPVZpLnNwbGl0Tm9kZU5hbWUoYik7Zm9yKGxldCBrPTE7azw9Zi5sZW5ndGg7KytrKXt2YXIgaD1mLnNsaWNlKDAsaykuam9pbigiLyIpO2NvbnN0IHQ9dGhpcy5fbGV2ZWxOYW1lMk5vZGVbaF07bnVsbCE9dCYmbnVsbCE9dC5sZXZlbERvbSYmdC5sZXZlbERvbS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImNlbnRlciIsYmVoYXZpb3VyOiJzbW9vdGgifSk7azxmLmxlbmd0aD9udWxsIT10aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyW2hdJiZ0aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyW2hdLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCk6KHQuZGVidWdXYXRjaHx8dGhpcy5faGFuZGxlTWV0YU5vZGVDaGFuZ2UodCwKdC5kZWJ1Z1dhdGNoQ2hhbmdlLCEwKSxkJiYodC5zZXRUb0FsbENoZWNrZWRFeHRlcm5hbGx5KCksKGg9dC5kZWJ1Z1dhdGNoKSYmbnVsbD09dGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1toLm5vZGVfbmFtZV0mJih0aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2JdPWgpKSxudWxsIT10aGlzLl9oaWdobGlnaHRlZExldmVsRG9tJiZ0aGlzLl9oaWdobGlnaHRlZExldmVsRG9tLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkIiksdC5sZXZlbERvbS5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZCIpLHRoaXMuc2V0KCJfaGlnaGxpZ2h0ZWRMZXZlbERvbSIsdC5sZXZlbERvbSkpfX19LDIwKX0sX2hhbmRsZUZvcmNlTm9kZUV4cGFuZEFuZENoZWNrKGIpe3RoaXMuX2hhbmRsZUZvcmNlTm9kZShiLCEwKX0sX2hhbmRsZUZvcmNlTm9kZUV4cGFuZChiKXt0aGlzLl9oYW5kbGVGb3JjZU5vZGUoYiwhMSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXNlc3Npb24tcnVucy12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNlc3Npb24tcnVucy12aWV3Iixwcm9wZXJ0aWVzOntsYXRlc3RTZXNzaW9uUnVuOk9iamVjdCxzZXNzaW9uUnVuS2V5VG9EZXZpY2VOYW1lczpPYmplY3Qsc29sZUFjdGl2ZTpCb29sZWFuLG5vZGVPclRlbnNvckNsaWNrZWQ6RnVuY3Rpb24sX3J1bktleTJDb3VudDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9ydW5LZXkyTnVtRGV2aWNlczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9hY3RpdmVSdW5LZXk6U3RyaW5nfSxvYnNlcnZlcnM6WyJyZW5kZXJMYXRlc3QobGF0ZXN0U2Vzc2lvblJ1bikiLCJzZXRTb2xlQWN0aXZlU3RhdHVzKHNvbGVBY3RpdmUpIl0scmVuZGVyTGF0ZXN0KGIpe2I9SlNPTi5zdHJpbmdpZnkoYik7dGhpcy5fcnVuS2V5MkNvdW50W2JdPXZvaWQgMD09PXRoaXMuX3J1bktleTJDb3VudFtiXT8xOnRoaXMuX3J1bktleTJDb3VudFtiXSsxO3ZvaWQgMD09PXRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2JdJiYodGhpcy5fcnVuS2V5Mk51bURldmljZXNbYl09CjApO3RoaXMuX2FjdGl2ZVJ1bktleT1iO3RoaXMuX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpfSx1cGRhdGVOdW1EZXZpY2VzKGIpe251bGwhPXRoaXMuX2FjdGl2ZVJ1bktleSYmKHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW3RoaXMuX2FjdGl2ZVJ1bktleV09Yix0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKSl9LHNldFNvbGVBY3RpdmVTdGF0dXMoKXt0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKX0sX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpe3RoaXMuX2NsZWFyVGFibGUoKTt0aGlzLl9yZW5kZXJIZWFkZXIoKTtsZXQgYjtmb3IoY29uc3QgZiBpbiB0aGlzLl9ydW5LZXkyQ291bnQpaWYodGhpcy5fcnVuS2V5MkNvdW50Lmhhc093blByb3BlcnR5KGYpKXt2YXIgZD1KU09OLnBhcnNlKGYpOyhkPXRoaXMuX3JlbmRlclJvdyhkLHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2ZdLHRoaXMuX3J1bktleTJDb3VudFtmXSx0aGlzLl9hY3RpdmVSdW5LZXk9PT1mLHRoaXMuc29sZUFjdGl2ZSkpJiYKKGI9ZCl9YiYmKFBvbHltZXIuZG9tKHRoaXMuJCQoIiNzZXNzaW9uLXJ1bnMtdGFibGUiKSkucGFyZW50Tm9kZS5wYXJlbnROb2RlLnNjcm9sbFRvcD1iLm9mZnNldFRvcCl9LF9jbGVhclRhYmxlKCl7Y29uc3QgYj10aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIik7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX0sX3JlbmRlckhlYWRlcigpe2NvbnN0IGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7ZC50ZXh0Q29udGVudD0iRmVlZHMiO2NvbnN0IGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtmLnRleHRDb250ZW50PSJGZXRjaGVzIjtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7aC50ZXh0Q29udGVudD0iVGFyZ2V0cyI7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2sudGV4dENvbnRlbnQ9IiMoRGV2aWNlcykiO2NvbnN0IHQ9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7dC50ZXh0Q29udGVudD0iQ291bnQiO2IuYXBwZW5kQ2hpbGQoZCk7Yi5hcHBlbmRDaGlsZChmKTtiLmFwcGVuZENoaWxkKGgpO2IuYXBwZW5kQ2hpbGQoayk7Yi5hcHBlbmRDaGlsZCh0KTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLmFwcGVuZENoaWxkKGIpfSxfcmVuZGVyUm93KGIsZCxmLGgsayl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLGw9dGhpcy5fcmVuZGVyR3JhcGhFbGVtZW50cyhiLmZlZWRzKSxwPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYi5mZXRjaGVzKTtiPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYi50YXJnZXRzKTtjb25zdCBtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7bS50ZXh0Q29udGVudD1kO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtkLnRleHRDb250ZW50PWY7dC5hcHBlbmRDaGlsZChsKTt0LmFwcGVuZENoaWxkKHApOwp0LmFwcGVuZENoaWxkKGIpO3QuYXBwZW5kQ2hpbGQobSk7dC5hcHBlbmRDaGlsZChkKTtoJiYoaz90LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJzb2xlLWFjdGl2ZS1zZXNzaW9uLXJ1biIpOnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsImFjdGl2ZS1zZXNzaW9uLXJ1biIpKTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLmFwcGVuZENoaWxkKHQpO2lmKGgpcmV0dXJuIHR9LF9yZW5kZXJHcmFwaEVsZW1lbnRzKGIpe2NvbnN0IGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtfLmZvckVhY2goYixmPT57Y29uc3QgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnRleHRDb250ZW50PWY7aC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwibm9kZS1vci10ZW5zb3ItZWxlbWVudCIpO2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dGhpcy5ub2RlT3JUZW5zb3JDbGlja2VkKGYpfSk7ZC5hcHBlbmRDaGlsZChoKX0pO3JldHVybiBkfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1zb3VyY2UtY29kZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNvdXJjZS1jb2RlLXZpZXciLHByb3BlcnRpZXM6e3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxmb2N1c05vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfb2xkRm9jdXNOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZGVidWdXYXRjaGVzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxub2RlQ2xpY2tlZDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSxjb250aW51ZVRvTm9kZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSxfaGlnaGxpZ2h0ZWRFbGVtZW50czp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX2ZpbGVQYXRoU2VsZWN0ZWQ6TnVtYmVyLF9mdWxsRmlsZVBhdGhzOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9zaG9ydEZpbGVQYXRoczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfZmlsZUxpbmVzOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9ub2RlTmFtZTJEZXZpY2VOYW1lOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSwKX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfbm9kZU5hbWUyTm9kZUVsZW1lbnRzOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfbm9kZU5hbWUyU3RhY2tUb3BOb2RlRWxlbWVudDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX2Z1bGxTdGFja1Nob3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9mdWxsU3RhY2tOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlbmRlckRlbGF5TWlsbGlzOnt0eXBlOk51bWJlcix2YWx1ZTo1MCxyZWFkb25seTohMH19LG9ic2VydmVyczpbIl9yZW5kZXJGaWxlKF9maWxlUGF0aFNlbGVjdGVkKSIsIl9mb2N1c09uTm9kZShmb2N1c05vZGVOYW1lKSJdLHJlbmRlcihiKXtudWxsIT1iJiZ0aGlzLnNldCgiX2RlYnVnV2F0Y2hlcyIsYik7dGhpcy5fcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoe21vZGU6InBhdGhzIn0pLnRoZW4oZD0+Cnt0aGlzLnNldCgiX2Z1bGxGaWxlUGF0aHMiLGQucGF0aHMpO2NvbnN0IGY9ZC5wYXRocy5tYXAoaD0+KHtpZDpoLG5hbWU6dGhpcy5fc2hvcnRlblBhdGgoaCxkLnBhdGhzKX0pKTt0aGlzLnNldCgiX3Nob3J0RmlsZVBhdGhzIixmKTswPGYubGVuZ3RoJiZ0aGlzLnNldCgiX2ZpbGVQYXRoU2VsZWN0ZWQiLDApfSl9LF9zaG9ydGVuUGF0aChiKXtiPWIucmVwbGFjZSgvXFwvZywiLyIpO2I9Yi5zcGxpdCgiLyIpO3JldHVybiBiW2IubGVuZ3RoLTFdfSxfcmVuZGVyRmlsZShiKXtpZihudWxsIT1iKXt2YXIgZD10aGlzLl9zaG9ydEZpbGVQYXRoc1tiXS5pZDt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToiY29udGVudCIsZmlsZV9wYXRoOmR9KS50aGVuKGY9Pntjb25zdCBoPVtdLGs9Zi5jb250ZW50W2RdLHQ9Zi5saW5lbm9fdG9fb3BfbmFtZV9hbmRfc3RhY2tfcG9zO2Y9e307Zm9yKHZhciBsIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShsKSYmKGZbbF09dFtsXS5sZW5ndGgpOwp0aGlzLl9maWx0ZXJGaWxlVHJhY2ViYWNrc0J5RGVidWdXYXRjaGVzKHQpO2ZvcihsPTA7bDxrLmxlbmd0aDsrK2wpe2NvbnN0IG09bCsxO2gucHVzaCh7bGluZW5vOm0sbnVtTm9kZXM6bnVsbCE9dFttXT9TdHJpbmcodFttXS5sZW5ndGgpKyIvIitTdHJpbmcoZlttXSkrIiBcdTI1YmMiOiIiLHRleHQ6dGhpcy5faHRtbEVzY2FwZShrW2xdKX0pfXRoaXMuc2V0KCJfZmlsZUxpbmVzIixoKTtjb25zdCBwPXRoaXM7c2V0VGltZW91dCgoKT0+e2NvbnN0IG09e30sbj17fTtmb3IoY29uc3QgdSBpbiB0KXtpZighdC5oYXNPd25Qcm9wZXJ0eSh1KSljb250aW51ZTtmb3IodmFyIHE9cC4kJCgiI3NvdXJjZS1saW5lLW5vZGVzLSIrdSk7cS5maXJzdENoaWxkOylxLnJlbW92ZUNoaWxkKHEuZmlyc3RDaGlsZCk7Y29uc3QgeD10W3VdO3guc29ydChmdW5jdGlvbihBLHkpe3JldHVybiBBWzBdPHlbMF0/LTE6QVswXT55WzBdPzE6MH0pO2ZvcihsZXQgQT0wO0E8eC5sZW5ndGg7KytBKXtjb25zdCB5PQp4W0FdWzBdLHc9eFtBXVsxXSxDPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO0cuc2V0QXR0cmlidXRlKCJjbGFzcyIsInNvdXJjZS1saW5lLW5vZGUtZW50dHJ5Iik7Ry5zZXRBdHRyaWJ1dGUoInNvdXJjZUxpbmVubyIsdSk7Ry50ZXh0Q29udGVudD15O0cuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3RoaXMubm9kZUNsaWNrZWQodGhpcy5fbm9kZU5hbWUyRGV2aWNlTmFtZVt5XSx0aGlzLl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZVt5XSwhMCl9KTtjb25zdCBEPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7RC5zZXRBdHRyaWJ1dGUoImljb24iLCJmaWx0ZXItbGlzdCIpO0Quc2V0QXR0cmlidXRlKCJ0aXRsZSIsIlNob3cgc3RhY2siKTtELmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLl9oaWdobGlnaHROb2RlRWxlbWVudHMoeSk7dGhpcy5zZXQoIl9mdWxsU3RhY2tOb2RlTmFtZSIsCnkpO3RoaXMuc2V0KCJfZnVsbFN0YWNrU2hvd24iLCEwKTt0aGlzLl9wb3B1bGF0ZUZ1bGxTdGFjayh5LHRoaXMuX2Z1bGxGaWxlUGF0aHNbdGhpcy5fZmlsZVBhdGhTZWxlY3RlZF0sTnVtYmVyKHUpKX0pO2NvbnN0IEI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTtCLnNldEF0dHJpYnV0ZSgiaWNvbiIsImZvcndhcmQiKTtCLnNldEF0dHJpYnV0ZSgidGl0bGUiLCJDb250aW51ZSB0byIpO0IuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3RoaXMubm9kZUNsaWNrZWQodGhpcy5fbm9kZU5hbWUyRGV2aWNlTmFtZVt5XSx0aGlzLl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZVt5XSwhMCk7Y29uc3QgST10aGlzLl9ub2RlTmFtZTJEZXZpY2VOYW1lW3ldLE49dGhpcy5fbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWVbeV07dGhpcy5zZXQoIl9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQiLEcpO3RoaXMuY29udGludWVUb05vZGUoSSwKTil9KTtDLmFwcGVuZENoaWxkKEQpO0MuYXBwZW5kQ2hpbGQoQik7Qy5hcHBlbmRDaGlsZChHKTtxLmFwcGVuZENoaWxkKEMpO20uaGFzT3duUHJvcGVydHkoeSl8fChtW3ldPVtdKTttW3ldLnB1c2goRyk7bi5oYXNPd25Qcm9wZXJ0eSh5KXx8KG5beV09W0csd10pO3c+blt5XVsxXSYmKG5beV09W0csd10pfXEuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTtxPXAuJCQoIiNzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZS0iK3UpO251bGw9PXEuZ2V0QXR0cmlidXRlKCJ0YXBDYWxsYmFja1NldCIpJiYocS5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57cC5fdG9nZ2xlTGluZU5vZGVzKE51bWJlcih1KSl9KSxxLnNldEF0dHJpYnV0ZSgidGFwQ2FsbGJhY2tTZXQiLCEwKSl9cC5zZXQoIl9ub2RlTmFtZTJOb2RlRWxlbWVudHMiLG0pO2Zvcihjb25zdCB1IGluIG4pbi5oYXNPd25Qcm9wZXJ0eSh1KSYmKG5bdV09blt1XVswXSk7cC5zZXQoIl9ub2RlTmFtZTJTdGFja1RvcE5vZGVFbGVtZW50IiwKbil9LHRoaXMuX3JlbmRlckRlbGF5TWlsbGlzKX0pfX0sX3RvZ2dsZUxpbmVOb2RlcyhiLGQ9ITEpe2I9dGhpcy4kJCgiI3NvdXJjZS1saW5lLW5vZGVzLSIrYik7bnVsbD09Yi5nZXRBdHRyaWJ1dGUoImhpZGRlbiIpJiYhMCE9PWQ/Yi5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsITApOmIucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKX0sX2ZpbHRlckZpbGVUcmFjZWJhY2tzQnlEZWJ1Z1dhdGNoZXMoYil7Y29uc3QgZD10aGlzLmRlYnVnV2F0Y2hlcy5tYXAoaz0+VmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGsubm9kZV9uYW1lKSksZj17fSxoPXt9O2Zvcihjb25zdCBrIG9mIHRoaXMuZGVidWdXYXRjaGVzKXtjb25zdCB0PVZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihrLm5vZGVfbmFtZSk7Zlt0XT1rLmRldmljZV9uYW1lO2hbdF09ay5ub2RlX25hbWV9dGhpcy5zZXQoIl9ub2RlTmFtZTJEZXZpY2VOYW1lIixmKTt0aGlzLnNldCgiX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lIiwKaCk7Zm9yKGNvbnN0IGsgaW4gYiliLmhhc093blByb3BlcnR5KGspJiYoYltrXT1iW2tdLmZpbHRlcih0PT5fLmluY2x1ZGVzKGQsdFswXSkpKX0sX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KGIpe2NvbnN0IGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL3NvdXJjZV9jb2RlIik7Yj12Yy5hZGRQYXJhbXMoZCxiKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpfSxfaHRtbEVzY2FwZShiKXtyZXR1cm4gYi5yZXBsYWNlKC8gL2csIlx1MDBhMCIpfSxfZm9jdXNPbk5vZGUoYil7aWYobnVsbCE9Yil7dmFyIGQ9dGhpcy5fc2hvcnRGaWxlUGF0aHNbdGhpcy5fZmlsZVBhdGhTZWxlY3RlZF0uaWQsZj10aGlzO3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJvcF90cmFjZWJhY2siLG9wX25hbWU6Yn0pLnRoZW4oaD0+e2NvbnN0IGs9aC5vcF90cmFjZWJhY2tbYl07aD1bXTtmb3IobGV0IGw9MDtsPGsubGVuZ3RoOysrbCl7Y29uc3QgcD0Ka1tsXVsxXTtrW2xdWzBdPT09ZCYmaC5wdXNoKHApfWZvcih2YXIgdCBvZiBmLl9oaWdobGlnaHRlZEVsZW1lbnRzKXQuY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQtc291cmNlLWxpbmUiKTt0PVtdO2Zvcihjb25zdCBsIG9mIGgpaD10aGlzLiQkKCIjc291cmNlLWxpbmUtIitsKSx0LnB1c2goaCksaC5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZC1zb3VyY2UtbGluZSIpLGYuX3RvZ2dsZUxpbmVOb2RlcyhsLCEwKTtmLnNldCgiX2hpZ2hsaWdodGVkRWxlbWVudHMiLHQpO3RoaXMuX2hpZ2hsaWdodE5vZGVFbGVtZW50cyhiKX0pfX0sX2hpZ2hsaWdodE5vZGVFbGVtZW50cyhiKXtpZihudWxsIT10aGlzLl9vbGRGb2N1c05vZGVOYW1lKWZvcihjb25zdCBkIG9mIHRoaXMuX25vZGVOYW1lMk5vZGVFbGVtZW50c1t0aGlzLl9vbGRGb2N1c05vZGVOYW1lXSlkLnN0eWxlWyJmb250LXdlaWdodCJdPSJub3JtYWwiO2Zvcihjb25zdCBkIG9mIHRoaXMuX25vZGVOYW1lMk5vZGVFbGVtZW50c1tiXSlkLnN0eWxlWyJmb250LXdlaWdodCJdPQoiYm9sZCI7bnVsbD09dGhpcy5fc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50P3RoaXMuX25vZGVOYW1lMlN0YWNrVG9wTm9kZUVsZW1lbnRbYl0uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJjZW50ZXIiLGJlaGF2aW91cjoic21vb3RoIn0pOnRoaXMuc2V0KCJfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50IixudWxsKTt0aGlzLnNldCgiX29sZEZvY3VzTm9kZU5hbWUiLGIpfSxfcG9wdWxhdGVGdWxsU3RhY2soYixkLGYpe3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJvcF90cmFjZWJhY2siLG9wX25hbWU6Yn0pLnRoZW4oaD0+e2NvbnN0IGs9dGhpcy4kJCgiI2Z1bGwtc3RhY2stY29udGVudCIpO2Zvcig7ay5maXJzdENoaWxkOylrLnJlbW92ZUNoaWxkKGsuZmlyc3RDaGlsZCk7Zm9yKGNvbnN0IHQgb2YgaC5vcF90cmFjZWJhY2tbYl0pe2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxwPXRbMF0sbT1OdW1iZXIodFsxXSk7bC50ZXh0Q29udGVudD0KcCsiOiAiK1N0cmluZyhtKTtfLmluY2x1ZGVzKHRoaXMuX2Z1bGxGaWxlUGF0aHMscCk/KGwuY2xhc3NMaXN0LmFkZCgic3RhY2stZnJhbWUtY2xpY2thYmxlIiksbC5zdHlsZS5jb2xvcj0iYmx1ZSIsbC5zdHlsZVsidGV4dC1kZWNvcmF0aW9uIl09InVuZGVybGluZSIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHA9PT1kJiZtPT09ZiYmKGwuc3R5bGVbImZvbnQtd2VpZ2h0Il09ImJvbGQiKSxsLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLnNldCgiX2ZpbGVQYXRoU2VsZWN0ZWQiLHRoaXMuX2Z1bGxGaWxlUGF0aHMuaW5kZXhPZihwKSk7c2V0VGltZW91dCgoKT0+e3RoaXMuX3RvZ2dsZUxpbmVOb2RlcyhtLCEwKTtmb3IoY29uc3QgbiBvZiB0aGlzLl9ub2RlTmFtZTJOb2RlRWxlbWVudHNbYl0pTnVtYmVyKG4uZ2V0QXR0cmlidXRlKCJzb3VyY2VMaW5lbm8iKSk9PT1OdW1iZXIobSkmJihuLnNjcm9sbEludG9WaWV3KHtibG9jazoiY2VudGVyIixiZWhhdmlvdXI6InNtb290aCJ9KSwKdGhpcy5zZXQoIl9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQiLGwpLHRoaXMuX2hpZ2hsaWdodE5vZGVFbGVtZW50cyhiKSxkPT09cCYmZj09PW18fHRoaXMuX3BvcHVsYXRlRnVsbFN0YWNrKGIscCxtKSl9LDIqdGhpcy5fcmVuZGVyRGVsYXlNaWxsaXMpfSkpOihsLmNsYXNzTGlzdC5hZGQoInN0YWNrLWZyYW1lLW5vbmNsaWNrYWJsZSIpLGwuc3R5bGUuY29sb3I9IiM1NTUiKTtrLmFwcGVuZENoaWxkKGwpfX0pfSxfY2xvc2VGdWxsU3RhY2tEaWFsb2coKXt0aGlzLnNldCgiX2Z1bGxTdGFja1Nob3duIiwhMSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci1kYXRhLXN1bW1hcnkuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGVuc29yLWRhdGEtc3VtbWFyeSIscHJvcGVydGllczp7bGF0ZXN0VGVuc29yRGF0YTpPYmplY3QsZXhwYW5kSGFuZGxlcjpPYmplY3QsY29udGludWVUb0NhbGxiYWNrOkZ1bmN0aW9uLGhpZ2hsaWdodGVkTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHRlbnNvck5hbWVDbGlja2VkOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOm51bGx9LGdldEhlYWx0aFBpbGw6RnVuY3Rpb24sX2hlYWx0aFBpbGxzRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMH0sX3dhdGNoS2V5czp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX3dhdGNoS2V5MkRhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyQ291bnQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyRXhwYW5kSGFuZGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6e319LF93YXRjaEtleTJWYWx1ZVNob3J0Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MlJvdzp7dHlwZTpPYmplY3QsCnZhbHVlOnt9fSxfYWN0aXZlV2F0Y2hLZXk6U3RyaW5nLF9oZWFsdGhQaWxsV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjIwMCxyZWFkb25seTohMH0sX2hlYWx0aFBpbGxIZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOjMyLHJlYWRvbmx5OiEwfX0sb2JzZXJ2ZXJzOlsiX3JlbmRlckxhdGVzdChsYXRlc3RUZW5zb3JEYXRhLCBleHBhbmRIYW5kbGVyKSIsIl9oaWdobGlnaHQoaGlnaGxpZ2h0ZWROb2RlTmFtZSkiXSxsaXN0ZW5lcnM6eyJzaG93LWhlYWx0aC1waWxscy5jaGFuZ2UiOiJfc2hvd0hlYWx0aFBpbGxzQ2hhbmdlZCJ9LHJlYWR5KCl7dGhpcy5fcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpfSxlbmFibGVIZWFsdGhQaWxscygpe3RoaXMuc2V0KCJfaGVhbHRoUGlsbHNFbmFibGVkIiwhMCk7dGhpcy5fcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpfSxfc2hvd0hlYWx0aFBpbGxzQ2hhbmdlZCgpe3RoaXMuX2hlYWx0aFBpbGxzRW5hYmxlZD90aGlzLl9yZW5kZXJIZWFsdGhQaWxsTGVnZW5kKCk6CnRoaXMuX2NsZWFySGVhbHRoUGlsbExlZ2VuZCgpO3RoaXMuX3JlbmRlckFsbCgpfSxfcmVuZGVyQWxsKCl7dGhpcy5fY2xlYXJUZW5zb3JEYXRhVGFibGUoKTtmb3IoY29uc3QgYiBvZiB0aGlzLl93YXRjaEtleXMpdGhpcy5fcmVuZGVyTGF0ZXN0KHRoaXMuX3dhdGNoS2V5MkRhdGFbYl0sdGhpcy5fd2F0Y2hLZXkyRXhwYW5kSGFuZGxlcltiXSl9LF90ZW5zb3JEYXRhMldhdGNoS2V5KGIpe3JldHVybiBiLmRldmljZU5hbWUrIi8iK2IudGVuc29yTmFtZSsiOiIrYi5kZWJ1Z09wfSxfcmVuZGVyTGF0ZXN0KGIsZCl7aWYoYil7dmFyIGY9dGhpcy5fdGVuc29yRGF0YTJXYXRjaEtleShiKSxoPW51bGw7IlVuaW5pdGlhbGl6ZWQiIT09Yi5kdHlwZSYmIlVuc3VwcG9ydGVkIiE9PWIuZHR5cGUmJihoPSgpPT5kKGIpKTt2YXIgaz1udWxsIT1iLnZhbHVlP0pTT04uc3RyaW5naWZ5KGIudmFsdWUsKHQsbCk9PmwudG9GaXhlZD9OdW1iZXIobC50b0ZpeGVkKDMpKTpsKToiKENsaWNrIHRvIHZpZXcpIjsKdGhpcy5fd2F0Y2hLZXkyRGF0YVtmXT1iOy0xPT09dGhpcy5fd2F0Y2hLZXlzLmluZGV4T2YoZik/KHRoaXMuX3dhdGNoS2V5cy5wdXNoKGYpLHRoaXMuX3dhdGNoS2V5MkNvdW50W2ZdPTEpOnRoaXMuX3dhdGNoS2V5MkNvdW50W2ZdKz0xO3RoaXMuX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXJbZl09aDt0aGlzLl93YXRjaEtleTJWYWx1ZVNob3J0W2ZdPWs7dGhpcy5fYWN0aXZlV2F0Y2hLZXk9Zjt0aGlzLl9yZW1vdmVBY3RpdmVTdGF0dXNGcm9tQWxsUm93cygpO3RoaXMuX3JlbmRlclJvdyhmKX19LF9jbGVhclRlbnNvckRhdGFUYWJsZSgpe2Zvcihjb25zdCBiIGluIHRoaXMuX3dhdGNoS2V5MlJvdyl0aGlzLl93YXRjaEtleTJSb3cuaGFzT3duUHJvcGVydHkoYikmJih0aGlzLl93YXRjaEtleTJSb3dbYl0ucmVtb3ZlKCksZGVsZXRlIHRoaXMuX3dhdGNoS2V5MlJvd1tiXSl9LF9jbGVhclRlbnNvckRhdGFSb3coYil7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX0sCl9jbGVhckhlYWx0aFBpbGxMZWdlbmQoKXtjb25zdCBiPXRoaXMuJCQoIiNoZWFsdGgtcGlsbC1sZWdlbmQiKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfSxfcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpe3RoaXMuX2NsZWFySGVhbHRoUGlsbExlZ2VuZCgpO2NvbnN0IGI9dGhpcy4kJCgiI2hlYWx0aC1waWxsLWxlZ2VuZCIpO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QudGV4dENvbnRlbnQ9IkxlZ2VuZDoiO2IuYXBwZW5kQ2hpbGQoZCk7ZC5zdHlsZVsibWFyZ2luLXJpZ2h0Il09IjAuNWVtIjtkLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI7Zm9yKGQ9MDtkPHRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzLmxlbmd0aDsrK2Qpe2NvbnN0IGY9dGYuZ3JhcGguc2NlbmUuaGVhbHRoUGlsbEVudHJpZXNbZF0saD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI7Cmguc3R5bGVbIm1hcmdpbi1yaWdodCJdPSIwLjI1ZW0iO2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2sudGV4dENvbnRlbnQ9Ilx1MjVhMCI7ay5zdHlsZS5jb2xvcj1mLmJhY2tncm91bmRfY29sb3I7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7dC50ZXh0Q29udGVudD1mLmxhYmVsO3Quc3R5bGUuY29sb3I9Zi5iYWNrZ3JvdW5kX2NvbG9yO2guYXBwZW5kQ2hpbGQoayk7aC5hcHBlbmRDaGlsZCh0KTtiLmFwcGVuZENoaWxkKGgpfX0sX3JlbW92ZUFjdGl2ZVN0YXR1c0Zyb21BbGxSb3dzKCl7Zm9yKGNvbnN0IGIgaW4gdGhpcy5fd2F0Y2hLZXkyUm93KXtpZighdGhpcy5fd2F0Y2hLZXkyUm93Lmhhc093blByb3BlcnR5KGIpKWNvbnRpbnVlO2NvbnN0IGQ9dGhpcy5fd2F0Y2hLZXkyUm93W2JdO1BvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZS10ZW5zb3IiKTtQb2x5bWVyLmRvbShkKS5jbGFzc0xpc3QucmVtb3ZlKCJoaWdobGlnaHRlZCIpfX0sCl9yZW5kZXJSb3coYil7bGV0IGQsZj0hMTtudWxsIT10aGlzLl93YXRjaEtleTJSb3dbYl0/KGQ9dGhpcy5fd2F0Y2hLZXkyUm93W2JdLHRoaXMuX2NsZWFyVGVuc29yRGF0YVJvdyhkKSxmPSExKTooZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLGY9ITApO2NvbnN0IGg9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5kZXZpY2VOYW1lLGs9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lLHQ9aCsiLyIrazt2YXIgbD10aGlzLl93YXRjaEtleTJDb3VudFtiXSxwPXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0udGVuc29yTmFtZSxtPXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0uZGVidWdPcCxuPXRoaXMuX3dhdGNoS2V5MlZhbHVlU2hvcnRbYl07Y29uc3QgcT10aGlzLl93YXRjaEtleTJFeHBhbmRIYW5kbGVyW2JdLHU9Yj09PXRoaXMuX2FjdGl2ZVdhdGNoS2V5LHg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtQb2x5bWVyLmRvbSh4KS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3ItbmFtZSIpOwp4LnN0eWxlWyJ0ZXh0LWRlY29yYXRpb24iXT0idW5kZXJsaW5lIjt4LnN0eWxlLmN1cnNvcj0icG9pbnRlciI7eC50ZXh0Q29udGVudD1wO3guYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e251bGwhPXRoaXMudGVuc29yTmFtZUNsaWNrZWQmJnRoaXMudGVuc29yTmFtZUNsaWNrZWQoaCxrKX0pO2NvbnN0IEE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtBLnRleHRDb250ZW50PWw7Y29uc3QgeT10aGlzLl93YXRjaEtleTJEYXRhW2JdLmR0eXBlO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtjb25zdCB3PXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0uc2hhcGU7bC50ZXh0Q29udGVudD15O2NvbnN0IEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtDLnRleHRDb250ZW50PUpTT04uc3RyaW5naWZ5KHcpO2NvbnN0IEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtHLnRleHRDb250ZW50PW47UG9seW1lci5kb20oRykuY2xhc3NMaXN0LmFkZCgidmFsdWUtZXhwYW5zaW9uLWxpbmsiKTsKbnVsbCE9cSYmKEcuYWRkRXZlbnRMaXN0ZW5lcigidGFwIixxLCExKSxHLnN0eWxlWyJ0ZXh0LWRlY29yYXRpb24iXT0idW5kZXJsaW5lIixHLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO249bnVsbDtuPXRoaXMuX2hlYWx0aFBpbGxzRW5hYmxlZD90aGlzLl9yZW5kZXJIZWFsdGhQaWxsKHArIjoiK20se2RldmljZV9uYW1lOmgsbm9kZV9uYW1lOmssZHR5cGU6eSxzaGFwZTp3LHZhbHVlOm51bGx9LHEpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7cD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTttLnNldEF0dHJpYnV0ZSgiaWNvbiIsImZvcndhcmQiKTttLnNldEF0dHJpYnV0ZSgidGl0bGUiLCJDb250aW51ZSB0byIpO20uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dGhpcy5jb250aW51ZVRvQ2FsbGJhY2soaCxrKX0pO3AuYXBwZW5kQ2hpbGQobSk7ZC5hcHBlbmRDaGlsZCh4KTsKZC5hcHBlbmRDaGlsZChBKTtkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoQyk7ZC5hcHBlbmRDaGlsZChHKTtkLmFwcGVuZENoaWxkKG4pO2QuYXBwZW5kQ2hpbGQocCk7ZC5zZXRBdHRyaWJ1dGUoIm5vZGVOYW1lV2l0aERldmljZSIsdCk7dSYmKFBvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZS10ZW5zb3IiKSxQb2x5bWVyLmRvbShkKS5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZCIpKTt0aGlzLl93YXRjaEtleTJSb3dbYl09ZDtmJiZQb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGVuc29yLWRhdGEtdGFibGUgdGJvZHkiKSkuYXBwZW5kQ2hpbGQoZCk7ZC5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImVuZCIsaW5saW5lOiJuZWFyZXN0IixiZWhhdmlvdXI6InNtb290aCJ9KX0sX3JlbmRlckhlYWx0aFBpbGwoYixkLGYpe2NvbnN0IGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtQb2x5bWVyLmRvbShoKS5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpOwpudWxsIT1mJiZoLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsZiwhMSk7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGYuZ3JhcGguc2NlbmUuU1ZHX05BTUVTUEFDRSwic3ZnIik7Zi5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLl9oZWFsdGhQaWxsV2lkdGgpO2Yuc2V0QXR0cmlidXRlKCJoZWlnaHQiLHRoaXMuX2hlYWx0aFBpbGxIZWlnaHQpO2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRmLmdyYXBoLnNjZW5lLlNWR19OQU1FU1BBQ0UsImciKTtmLmFwcGVuZENoaWxkKGspO2guYXBwZW5kQ2hpbGQoZik7Y29uc3QgdD0idGRwLyIrYjt0aGlzLmdldEhlYWx0aFBpbGwoYixkLmRldmljZV9uYW1lLGQubm9kZV9uYW1lLGw9PntudWxsPT1sPyhoLnRleHRDb250ZW50PSJOL0EiLGguc3R5bGUuY29sb3I9ImdyYXkiKTooZC52YWx1ZT1sLHRmLmdyYXBoLnNjZW5lLmFkZEhlYWx0aFBpbGwoayxkLG51bGwsdCx0aGlzLl9oZWFsdGhQaWxsV2lkdGgsdGhpcy5faGVhbHRoUGlsbEhlaWdodC8KMix0aGlzLl9oZWFsdGhQaWxsSGVpZ2h0LzIsMCkpfSk7cmV0dXJuIGh9LF9oaWdobGlnaHQoYil7UG9seW1lci5kb20odGhpcy4kJCgiI3RlbnNvci1kYXRhLXRhYmxlIikpO2NvbnN0IGQ9W107Zm9yKGNvbnN0IGYgaW4gdGhpcy5fd2F0Y2hLZXkyUm93KXtpZighdGhpcy5fd2F0Y2hLZXkyUm93Lmhhc093blByb3BlcnR5KGYpKWNvbnRpbnVlO2NvbnN0IGg9dGhpcy5fd2F0Y2hLZXkyUm93W2ZdO251bGwhPWguZ2V0QXR0cmlidXRlJiYoaC5nZXRBdHRyaWJ1dGUoIm5vZGVOYW1lV2l0aERldmljZSIpPT09Yj9kLnB1c2goaCk6UG9seW1lci5kb20oaCkuY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQiKSl9aWYobnVsbCE9Yilmb3IoYj0wO2I8ZC5sZW5ndGg7KytiKVBvbHltZXIuZG9tKGRbYl0pLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodGVkIiksZFtiXS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImVuZCIsaW5saW5lOiJuZWFyZXN0IixiZWhhdmlvdXI6InNtb290aCJ9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90ZW5zb3Itd2lkZ2V0L3RlbnNvcl93aWRnZXRfYmluYXJ5LmpzCnZhciBXaT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGQsZil7Yj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oaCxrKXtoLl9fcHJvdG9fXz1rfXx8ZnVuY3Rpb24oaCxrKXtmb3IodmFyIHQgaW4gaylrLmhhc093blByb3BlcnR5KHQpJiYoaFt0XT1rW3RdKX07cmV0dXJuIGIoZCxmKX1yZXR1cm4gZnVuY3Rpb24oZCxmKXtmdW5jdGlvbiBoKCl7dGhpcy5jb25zdHJ1Y3Rvcj1kfWIoZCxmKTtkLnByb3RvdHlwZT1udWxsPT09Zj9PYmplY3QuY3JlYXRlKGYpOihoLnByb3RvdHlwZT1mLnByb3RvdHlwZSxuZXcgaCl9fSgpLFhpPXRoaXMmJnRoaXMuX19nZW5lcmF0b3J8fGZ1bmN0aW9uKGIsZCl7ZnVuY3Rpb24gZihuKXtyZXR1cm4gZnVuY3Rpb24ocSl7cmV0dXJuIGgoW24scV0pfX1mdW5jdGlvbiBoKG4pe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpOwpmb3IoO2s7KXRyeXtpZih0PTEsbCYmKHA9blswXSYyP2xbInJldHVybiJdOm5bMF0/bFsidGhyb3ciXXx8KChwPWxbInJldHVybiJdKSYmcC5jYWxsKGwpLDApOmwubmV4dCkmJiEocD1wLmNhbGwobCxuWzFdKSkuZG9uZSlyZXR1cm4gcDtpZihsPTAscCluPVtuWzBdJjIscC52YWx1ZV07c3dpdGNoKG5bMF0pe2Nhc2UgMDpjYXNlIDE6cD1uO2JyZWFrO2Nhc2UgNDpyZXR1cm4gay5sYWJlbCsrLHt2YWx1ZTpuWzFdLGRvbmU6ITF9O2Nhc2UgNTprLmxhYmVsKys7bD1uWzFdO249WzBdO2NvbnRpbnVlO2Nhc2UgNzpuPWsub3BzLnBvcCgpO2sudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEocD1rLnRyeXMscD0wPHAubGVuZ3RoJiZwW3AubGVuZ3RoLTFdKSYmKDY9PT1uWzBdfHwyPT09blswXSkpe2s9MDtjb250aW51ZX1pZigzPT09blswXSYmKCFwfHxuWzFdPnBbMF0mJm5bMV08cFszXSkpay5sYWJlbD1uWzFdO2Vsc2UgaWYoNj09PW5bMF0mJmsubGFiZWw8cFsxXSlrLmxhYmVsPQpwWzFdLHA9bjtlbHNlIGlmKHAmJmsubGFiZWw8cFsyXSlrLmxhYmVsPXBbMl0say5vcHMucHVzaChuKTtlbHNle3BbMl0mJmsub3BzLnBvcCgpO2sudHJ5cy5wb3AoKTtjb250aW51ZX19bj1kLmNhbGwoYixrKX1jYXRjaChxKXtuPVs2LHFdLGw9MH1maW5hbGx5e3Q9cD0wfWlmKG5bMF0mNSl0aHJvdyBuWzFdO3JldHVybnt2YWx1ZTpuWzBdP25bMV06dm9pZCAwLGRvbmU6ITB9fXZhciBrPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZihwWzBdJjEpdGhyb3cgcFsxXTtyZXR1cm4gcFsxXX0sdHJ5czpbXSxvcHM6W119LHQsbCxwLG07cmV0dXJuIG09e25leHQ6ZigwKSwidGhyb3ciOmYoMSksInJldHVybiI6ZigyKX0sImZ1bmN0aW9uIj09PXR5cGVvZiBTeW1ib2wmJihtW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLG19LFlpPXRoaXMmJnRoaXMuX19yZWFkfHxmdW5jdGlvbihiLGQpe3ZhciBmPSJmdW5jdGlvbiI9PT10eXBlb2YgU3ltYm9sJiZiW1N5bWJvbC5pdGVyYXRvcl07CmlmKCFmKXJldHVybiBiO2I9Zi5jYWxsKGIpO3ZhciBoLGs9W107dHJ5e2Zvcig7KHZvaWQgMD09PWR8fDA8ZC0tKSYmIShoPWIubmV4dCgpKS5kb25lOylrLnB1c2goaC52YWx1ZSl9Y2F0Y2gobCl7dmFyIHQ9e2Vycm9yOmx9fWZpbmFsbHl7dHJ5e2gmJiFoLmRvbmUmJihmPWJbInJldHVybiJdKSYmZi5jYWxsKGIpfWZpbmFsbHl7aWYodCl0aHJvdyB0LmVycm9yO319cmV0dXJuIGt9OwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKEgsSyxNLEwpe3JldHVybiBuZXcgKE18fChNPVByb21pc2UpKShmdW5jdGlvbihRLFQpe2Z1bmN0aW9uIFgoWil7dHJ5e2xhKEwubmV4dChaKSl9Y2F0Y2goYmEpe1QoYmEpfX1mdW5jdGlvbiBhYShaKXt0cnl7bGEoTFsidGhyb3ciXShaKSl9Y2F0Y2goYmEpe1QoYmEpfX1mdW5jdGlvbiBsYShaKXtaLmRvbmU/UShaLnZhbHVlKToobmV3IE0oZnVuY3Rpb24oYmEpe2JhKFoudmFsdWUpfSkpLnRoZW4oWCxhYSl9bGEoKEw9TC5hcHBseShILEt8fFtdKSkubmV4dCgpKX0pfWZ1bmN0aW9uIGQoSCl7cmV0dXJuIG51bGwhPT1ILm1hdGNoKC9eaW50WzAtOV0rJC8pfHxudWxsIT09SC5tYXRjaCgvXnVpbnRbMC05XSskLyl9ZnVuY3Rpb24gZihIKXtyZXR1cm4gbnVsbCE9PUgubWF0Y2goL15mbG9hdFswLTldKyQvKXx8bnVsbCE9PUgubWF0Y2goL15iZmxvYXRbMC05XSskLyl9ZnVuY3Rpb24gaChIKXtyZXR1cm4iYm9vbCI9PT1ILnRvTG93ZXJDYXNlKCl8fAoiYm9vbGVhbiI9PT1ILnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gayhIKXtyZXR1cm4ic3RyIj09PUgudG9Mb3dlckNhc2UoKXx8InN0cmluZyI9PT1ILnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gdChIKXt2YXIgSz0xO0guZm9yRWFjaChmdW5jdGlvbihNKXtLKj1NfSk7cmV0dXJuIEt9ZnVuY3Rpb24gbChIKXtyZXR1cm4gMD09PUgubGVuZ3RoPyJzY2FsYXIiOiJbIitIKyJdIn1mdW5jdGlvbiBwKEgpe3ZhciBLPXtzbGljaW5nRGltc0FuZEluZGljZXM6W10sdmlld2luZ0RpbXM6W10sdmVydGljYWxSYW5nZTpudWxsLGhvcml6b250YWxSYW5nZTpudWxsfSxNPUgubGVuZ3RoO2lmKDE9PT1NKUsudmlld2luZ0RpbXM9WzBdO2Vsc2UgaWYoMTxNKXtpZigyPE0pZm9yKHZhciBMPTA7TDxNLTI7KytMKUsuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLnB1c2goe2RpbTpMLGluZGV4OjA9PT1IW0xdP251bGw6MH0pO2ZvcihMPUgubGVuZ3RoLTI7TDxILmxlbmd0aDsrK0wpSy52aWV3aW5nRGltcy5wdXNoKEwpfXJldHVybiBLfQpmdW5jdGlvbiBtKEgsSyl7aWYoSC52aWV3aW5nRGltc1swXSE9PUsudmlld2luZ0RpbXNbMF18fEgudmlld2luZ0RpbXNbMV0hPT1LLnZpZXdpbmdEaW1zWzFdKXJldHVybiExO0s9SC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLmRpbX0pO0suc29ydCgpO0g9SC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLmRpbX0pO0guc29ydCgpO3JldHVybiBKU09OLnN0cmluZ2lmeShLKT09PUpTT04uc3RyaW5naWZ5KEgpfWZ1bmN0aW9uIG4oSCl7cmV0dXJuIDIwPj1ILmxlbmd0aD9IOkguc2xpY2UoMCwxMCkrIi4uLiIrSC5zbGljZShILmxlbmd0aC03LEgubGVuZ3RoKX1mdW5jdGlvbiBxKEgsSyxNLEwpe3ZvaWQgMD09PU0mJihNPTIpO2lmKGlzTmFOKEgpKXJldHVybiJOYU4iO2lmKC1JbmZpbml0eT09PUgpcmV0dXJuIi1cdTIyMWUiO2lmKEluZmluaXR5PT09SClyZXR1cm4iK1x1MjIxZSI7bnVsbD09TCYmKEw9Ck1hdGguYWJzKEgpLEw9MUUzPkwmJi4wMTw9THx8MD09PUw/ImZpeGVkIjoiZXhwb25lbnRpYWwiKTtyZXR1cm4gbnVsbD09THx8ImZpeGVkIj09PUw/Sz8iIitIOkgudG9GaXhlZChNKTpILnRvRXhwb25lbnRpYWwoTSl9ZnVuY3Rpb24gdShILEspe3ZvaWQgMD09PUsmJihLPSEwKTtyZXR1cm4gSD9LPyJUIjoiVHJ1ZSI6Sz8iRiI6IkZhbHNlIn1mdW5jdGlvbiB4KEgsSyl7dm9pZCAwPT09SyYmKEs9NCk7cmV0dXJuIG51bGw9PT1LfHxILmxlbmd0aDw9Sz9IOkguc2xpY2UoMCxLLTEpKyJcdTIwMjYifXZhciBBPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLKXt0aGlzLmlzU2hvd249ITE7dGhpcy5ibHVySGlkZUZ1bmN0aW9uPW51bGw7dGhpcy5kcm9wZG93bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIik7dGhpcy5kcm9wZG93bi5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO3RoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0KIm5vbmUiO0suYXBwZW5kQ2hpbGQodGhpcy5kcm9wZG93bil9SC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbihLLE0sTCl7dmFyIFE9dGhpcztMLmZvckVhY2goZnVuY3Rpb24oWCl7dmFyIGFhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2FhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSIpO2FhLnRleHRDb250ZW50PVguY2FwdGlvbjtRLmRyb3Bkb3duLmFwcGVuZENoaWxkKGFhKTtYLmRpc2FibGVkP2FhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCIpOihhYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24obGEpe2xhLnN0b3BQcm9wYWdhdGlvbigpO1EuZHJvcGRvd24uY2xpY2soKTtpZihudWxsIT09WC5vbkNsaWNrKVgub25DbGljayhsYSk7US5oaWRlKCl9KSxhYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbihsYSl7aWYobnVsbCE9PQpYLm9uSG92ZXIpWC5vbkhvdmVyKGxhKTthYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tYWN0aXZlIil9KSxhYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe2FhLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtpZihudWxsIT09WC5vbkhvdmVyKXtmb3IodmFyIGxhPVtdLFo9MDtaPGFhLmNoaWxkcmVuLmxlbmd0aDsrK1ope3ZhciBiYT1hYS5jaGlsZHJlbltaXTtiYS5jbGFzc0xpc3QuY29udGFpbnMoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIikmJmxhLnB1c2goYmEpfWxhLmZvckVhY2goZnVuY3Rpb24oZWEpe3JldHVybiBhYS5yZW1vdmVDaGlsZChlYSl9KX19KSl9KTt0aGlzLmRyb3Bkb3duLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt0aGlzLmRyb3Bkb3duLnN0eWxlLnRvcD1LKyJweCI7dGhpcy5kcm9wZG93bi5zdHlsZS5sZWZ0PQpNKyJweCI7TD10aGlzLmRyb3Bkb3duLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBUPUwubGVmdC1NO3RoaXMuZHJvcGRvd24uc3R5bGUudG9wPShLLShMLnRvcC1LKSkudG9GaXhlZCgxKSsicHgiO3RoaXMuZHJvcGRvd24uc3R5bGUubGVmdD0oTS1UKS50b0ZpeGVkKDEpKyJweCI7dGhpcy5pc1Nob3duPSEwO3RoaXMuYmx1ckhpZGVGdW5jdGlvbj1mdW5jdGlvbigpe1EuaGlkZSgpfTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsUS5ibHVySGlkZUZ1bmN0aW9uKX0sNTApfTtILnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7Zm9yKHRoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kcm9wZG93bi5maXJzdENoaWxkOyl0aGlzLmRyb3Bkb3duLnJlbW92ZUNoaWxkKHRoaXMuZHJvcGRvd24uZmlyc3RDaGlsZCk7dGhpcy5pc1Nob3duPSExO251bGwhPXRoaXMuYmx1ckhpZGVGdW5jdGlvbiYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5ibHVySGlkZUZ1bmN0aW9uKX07SC5wcm90b3R5cGUuc2hvd249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1Nob3dufTtyZXR1cm4gSH0oKSx5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLLE0pe3ZhciBMPXRoaXM7dGhpcy5jb25maWc9Szt0aGlzLnBhcmVudEVsZW1lbnQ9TTt0aGlzLmJhc2VGbGF0TWVudT1uZXcgQSh0aGlzLnBhcmVudEVsZW1lbnQpO3RoaXMuY3VycmVudENob2ljZVNlbGVjdGlvbnM9e307dGhpcy5jb25maWcuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihRLFQpe251bGwhPVEub3B0aW9ucyYmKEwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbVF09US5kZWZhdWx0U2VsZWN0aW9uKX0pfUgucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oSyxNKXt2YXIgTD10aGlzLFE9W107dGhpcy5jb25maWcuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihULFgpe3ZhciBhYT17Y2FwdGlvbjpULmNhcHRpb24sb25DbGljazpudWxsLG9uSG92ZXI6bnVsbH07aWYobnVsbCE9VC5vcHRpb25zKXt2YXIgbGE9CkwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbWF07YWEub25Ib3Zlcj1mdW5jdGlvbihaKXt2YXIgYmE9Wi50YXJnZXQsZWE9W107VC5vcHRpb25zLmZvckVhY2goZnVuY3Rpb24oY2Esa2Epe2VhLnB1c2goe2NhcHRpb246a2E9PT1sYT9jYSsiIChcdTI3MTMpIjpjYSxvbkNsaWNrOmZ1bmN0aW9uKCl7bGEhPT1rYSYmKEwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbWF09a2EsVC5jYWxsYmFjayhrYSkpfSxvbkhvdmVyOm51bGx9KX0pO1o9bmV3IEEoYmEpO2JhPWJhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1ouc2hvdyhiYS50b3AsYmEucmlnaHQsZWEpfX1lbHNlIGFhLm9uQ2xpY2s9VC5jYWxsYmFjaztudWxsPT1ULmlzRW5hYmxlZHx8VC5pc0VuYWJsZWQoKXx8KGFhLmRpc2FibGVkPSEwKTtRLnB1c2goYWEpfSk7dGhpcy5iYXNlRmxhdE1lbnUuc2hvdyhLLE0sUSl9O0gucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmJhc2VGbGF0TWVudS5oaWRlKCl9O0gucHJvdG90eXBlLnNob3duPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJhc2VGbGF0TWVudS5zaG93bigpfTtyZXR1cm4gSH0oKSx3OyhmdW5jdGlvbihIKXtIW0guVVA9MV09IlVQIjtIW0guRE9XTj0yXT0iRE9XTiI7SFtILkxFRlQ9M109IkxFRlQiO0hbSC5SSUdIVD00XT0iUklHSFQifSkod3x8KHc9e30pKTt2YXIgQz1mdW5jdGlvbigpe2Z1bmN0aW9uIEgoSyxNLEwsUSxULFgpe3RoaXMuc2hhcGU9Szt0aGlzLnNsaWNlRGltcz1bXTt0aGlzLnNsaWNlSW5kaWNlcz1bXTtpZigwPT09dCh0aGlzLnNoYXBlKSl0aHJvdyBFcnJvcigiVGVuc29yRWxlbWVudFNlbGVjdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGVuc29yIHdpdGggemVybyBlbGVtZW50cy4iKTtmb3IoSz0wO0s8TS5zbGljaW5nRGltc0FuZEluZGljZXMubGVuZ3RoOysrSyl7dGhpcy5zbGljZURpbXMucHVzaChNLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tLXS5kaW0pO3ZhciBhYT1NLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tLXS5pbmRleDtpZihudWxsPT09CmFhKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIFRlbnNvckVsZW1lbnRTZWxlY3Rpb24gZHVlIHRvIHVuZGV0ZXJtaW5lZCBzbGljaW5nIGluZGV4IGF0IGRpbWVuc2lvbiAiK0spO3RoaXMuc2xpY2VJbmRpY2VzLnB1c2goYWEpfXRoaXMucmFuaz10aGlzLnNoYXBlLmxlbmd0aDtpZigwPHRoaXMucmFuayYmdGhpcy5zbGljZURpbXMubGVuZ3RoPj10aGlzLnJhbmspdGhyb3cgRXJyb3IoIkV4cGVjdGVkIHNsaWNlRGltcyB0byBoYXZlIGEgbGVuZ3RoIGxlc3MgdGhhbiByYW5rICIrdGhpcy5yYW5rKyIsIGJ1dCBnb3QgbGVuZ3RoICIrdGhpcy5zbGljZURpbXMubGVuZ3RoKTt0aGlzLnZpZXdEaW1zPVtdO2ZvcihLPTA7Szx0aGlzLnJhbms7KytLKS0xPT09dGhpcy5zbGljZURpbXMuaW5kZXhPZihLKSYmdGhpcy52aWV3RGltcy5wdXNoKEspO2lmKDI8dGhpcy52aWV3RGltcy5sZW5ndGgpdGhyb3cgRXJyb3IoIk9ubHkgc2VsZWN0aW9ucyBpbiAxRCBhbmQgMkQgYXJlIHN1cHBvcnRlZC4iKTsKdGhpcy5yb3dTdGFydD1udWxsPT1MPzA6TDt0aGlzLmNvbFN0YXJ0PW51bGw9PVE/MDpRO3RoaXMucm93Q291bnQ9bnVsbD09VD8xOlQ7dGhpcy5jb2xDb3VudD1udWxsPT1YPzE6WH1ILnByb3RvdHlwZS5nZXRFbGVtZW50U3RhdHVzPWZ1bmN0aW9uKEspe2lmKEsubGVuZ3RoIT09dGhpcy5yYW5rKXRocm93IEVycm9yKCJFeHBlY3RlZCBpbmRpY2VzIHRvIGhhdmUgYSByYW5rIG9mICIrdGhpcy5yYW5rKyIsIGJ1dCBnb3QgIisoSy5sZW5ndGgrIiAoWyIrSysiXSkiKSk7Zm9yKHZhciBNPTA7TTxLLmxlbmd0aDsrK00paWYoLTEhPT10aGlzLnNsaWNlRGltcy5pbmRleE9mKE0pJiZLW01dIT09dGhpcy5zbGljZUluZGljZXNbdGhpcy5zbGljZURpbXMuaW5kZXhPZihNKV0pcmV0dXJuIG51bGw7TT1udWxsO3ZhciBMPXRoaXMucm93U3RhcnQrdGhpcy5yb3dDb3VudCxRPXRoaXMuY29sU3RhcnQrdGhpcy5jb2xDb3VudDtpZigwPT09dGhpcy52aWV3RGltcy5sZW5ndGgpMD09PUsubGVuZ3RoJiYKKE09e3RvcEVkZ2U6ITAsYm90dG9tRWRnZTohMCxsZWZ0RWRnZTohMCxyaWdodEVkZ2U6ITB9KTtlbHNlIGlmKDE9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCl7dmFyIFQ9dGhpcy52aWV3RGltc1swXTtLW1RdPj10aGlzLnJvd1N0YXJ0JiZLW1RdPEwmJihNPXt0b3BFZGdlOktbVF09PT10aGlzLnJvd1N0YXJ0LGJvdHRvbUVkZ2U6S1tUXT09PUwtMSxsZWZ0RWRnZTohMCxyaWdodEVkZ2U6ITB9KX1lbHNlIGlmKDI9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCl7VD10aGlzLnZpZXdEaW1zWzBdO3ZhciBYPXRoaXMudmlld0RpbXNbMV07S1tUXT49dGhpcy5yb3dTdGFydCYmS1tUXTxMJiZLW1hdPj10aGlzLmNvbFN0YXJ0JiZLW1hdPFEmJihNPXt0b3BFZGdlOktbVF09PT10aGlzLnJvd1N0YXJ0LGJvdHRvbUVkZ2U6S1tUXT09PUwtMSxsZWZ0RWRnZTpLW1hdPT09dGhpcy5jb2xTdGFydCxyaWdodEVkZ2U6S1tYXT09PVEtMX0pfWVsc2UgdGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgbGVuZ3RoIG9mIHZpZXdEaW1zOiAiKwp0aGlzLnZpZXdEaW1zKTtyZXR1cm4gTX07SC5wcm90b3R5cGUubW92ZT1mdW5jdGlvbihLLE0pe3ZhciBMPW51bGw7aWYoMD09PXRoaXMucmFua3x8MT09PXRoaXMucmFuayYmKEs9PT13LkxFRlR8fEs9PT13LlJJR0hUKSlyZXR1cm4gbnVsbDtpZihudWxsPT09TS52ZXJ0aWNhbFJhbmdlfHxudWxsPT09TS52ZXJ0aWNhbFJhbmdlWzFdKXRocm93IEVycm9yKCJGYWlsZWQgdG8gbW92ZSBkdWUgdG8gdW5kZXRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpO0s9PT13LlVQPzA8dGhpcy5yb3dTdGFydCYmKHRoaXMucm93U3RhcnQtLSxudWxsIT1NLnZlcnRpY2FsUmFuZ2UmJnRoaXMucm93U3RhcnQ8TS52ZXJ0aWNhbFJhbmdlWzBdJiYoTD13LlVQKSk6Sz09PXcuRE9XTj9udWxsIT1NLnZpZXdpbmdEaW1zJiZudWxsIT1NLnZpZXdpbmdEaW1zWzBdJiZ0aGlzLnJvd1N0YXJ0PHRoaXMuc2hhcGVbTS52aWV3aW5nRGltc1swXV0tMSYmKHRoaXMucm93U3RhcnQrKyxudWxsIT1NLnZlcnRpY2FsUmFuZ2UmJgp0aGlzLnJvd1N0YXJ0Pj1NLnZlcnRpY2FsUmFuZ2VbMV0mJihMPXcuRE9XTikpOks9PT13LkxFRlQ/MDx0aGlzLmNvbFN0YXJ0JiYodGhpcy5jb2xTdGFydC0tLG51bGwhPU0uaG9yaXpvbnRhbFJhbmdlJiZ0aGlzLmNvbFN0YXJ0PE0uaG9yaXpvbnRhbFJhbmdlWzBdJiYoTD13LkxFRlQpKTpLPT09dy5SSUdIVCYmbnVsbCE9TS52aWV3aW5nRGltcyYmbnVsbCE9TS52aWV3aW5nRGltc1sxXSYmdGhpcy5jb2xTdGFydDx0aGlzLnNoYXBlW00udmlld2luZ0RpbXNbMV1dLTEmJih0aGlzLmNvbFN0YXJ0KyssbnVsbCE9TS5ob3Jpem9udGFsUmFuZ2UmJnRoaXMuY29sU3RhcnQ+PU0uaG9yaXpvbnRhbFJhbmdlWzFdJiYoTD13LlJJR0hUKSk7dGhpcy5jb2xDb3VudD10aGlzLnJvd0NvdW50PTE7cmV0dXJuIEx9O0gucHJvdG90eXBlLmdldFJvd1N0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm93U3RhcnR9O0gucHJvdG90eXBlLmdldFJvd0NvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm93Q291bnR9OwpILnByb3RvdHlwZS5nZXRDb2xTdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbFN0YXJ0fTtILnByb3RvdHlwZS5nZXRDb2xDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbENvdW50fTtyZXR1cm4gSH0oKSxHPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLLE0sTCl7dm9pZCAwPT09TCYmKEw9ZnVuY3Rpb24oKXt9KTt0aGlzLnJvb3REaXY9Szt0aGlzLnNoYXBlPU07dGhpcy5vblNsaWNpbmdTcGVjQ2hhbmdlPUw7dGhpcy5kaW1Db250cm9scz1bXTt0aGlzLmRpbUlucHV0cz1bXTt0aGlzLmNvbW1hcz1bXTt0aGlzLmRyb3Bkb3ducz1bXTt0aGlzLmJyYWNrZXREaXZzPVtudWxsLG51bGxdO3RoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkPVtdO3RoaXMucmFuaz10aGlzLnNoYXBlLmxlbmd0aDtpZigzPnRoaXMucmFuayl0aHJvdyBFcnJvcigiRGltZW5zaW9uIGNvbnRyb2wgaXMgbm90IGFwcGxpY2FibGUgdG8gdGVuc29yIHNoYXBlcyBsZXNzIHRoYW4gM0Q6IHJlY2VpdmVkICIrCih0aGlzLnJhbmsrIkQgdGVuc29yIHNoYXBlOiAiKSsoSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFwZSkrIi4iKSk7dGhpcy5jcmVhdGVDb21wb25lbnRzKCk7dGhpcy5zbGljaW5nU3BlYz1wKE0pfUgucHJvdG90eXBlLmNyZWF0ZUNvbXBvbmVudHM9ZnVuY3Rpb24oKXtmb3IodmFyIEs9dGhpczt0aGlzLnJvb3REaXYuZmlyc3RDaGlsZDspdGhpcy5yb290RGl2LnJlbW92ZUNoaWxkKHRoaXMucm9vdERpdi5maXJzdENoaWxkKTt0aGlzLmRpbUNvbnRyb2xzPVtdO3RoaXMuZGltSW5wdXRzPVtdO3RoaXMuY29tbWFzPVtdO3RoaXMuZHJvcGRvd25zPVtdO3RoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkPVtdO3RoaXMuYnJhY2tldERpdnNbMF09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5icmFja2V0RGl2c1swXS50ZXh0Q29udGVudD0iU2xpY2luZzogWyI7dGhpcy5icmFja2V0RGl2c1swXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyIpOwp0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQodGhpcy5icmFja2V0RGl2c1swXSk7Zm9yKHZhciBNPTA7TTx0aGlzLnJhbms7KytNKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7TC50aXRsZT0iRGltZW5zaW9uICIrTSsiOiBzaXplXHgzZCIrdGhpcy5zaGFwZVtNXTt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoTCk7dGhpcy5kaW1Db250cm9scy5wdXNoKEwpO3RoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkLnB1c2goITEpO0w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7TC5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoTCk7dGhpcy5kaW1JbnB1dHMucHVzaChMKTtNPHRoaXMucmFuay0xJiYoTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWNvbW1hIiksCkwudGV4dENvbnRlbnQ9IiwiLHRoaXMucm9vdERpdi5hcHBlbmRDaGlsZChMKSx0aGlzLmNvbW1hcy5wdXNoKEwpKTtMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0wuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24iKTtMLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZChMKTt0aGlzLmRyb3Bkb3ducy5wdXNoKEwpfXRoaXMuYnJhY2tldERpdnNbMV09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5icmFja2V0RGl2c1sxXS50ZXh0Q29udGVudD0iXSI7dGhpcy5icmFja2V0RGl2c1sxXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyIpO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZCh0aGlzLmJyYWNrZXREaXZzWzFdKTt0aGlzLnJvb3REaXYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtLLmNsZWFyQWxsRHJvcGRvd25zKCl9KX07SC5wcm90b3R5cGUucmVuZGVyPQpmdW5jdGlvbihLKXtmdW5jdGlvbiBNKGFhKXt2YXIgbGE9WC5kaW1Db250cm9sc1thYV0sWj1YLmRpbUlucHV0c1thYV0sYmE9WC5kcm9wZG93bnNbYWFdO2lmKCJub25lIiE9PVouc3R5bGUuZGlzcGxheSlyZXR1cm4iY29udGludWUiO3ZhciBlYT1YLnNoYXBlW2FhXTtpZigtMSE9PVEuaW5kZXhPZihhYSkpe3ZhciBjYT1UW1EuaW5kZXhPZihhYSldO2xhLnRleHRDb250ZW50PVN0cmluZyhjYSk7Wi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO1oudHlwZT0ibnVtYmVyIjtaLm1pbj0iMCI7Wi5tYXg9U3RyaW5nKGVhLTEpO1oudmFsdWU9U3RyaW5nKGNhKTtYLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFthYV18fChsYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtMLmNsZWFyQWxsRHJvcGRvd25zKCk7bGEuc3R5bGUuZGlzcGxheT0ibm9uZSI7Wi5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2sifSksWi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLApmdW5jdGlvbigpe2lmKG51bGw9PT1MLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgY2hhbmdlIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzcGVjLiIpO3ZhciBrYT1wYXJzZUludChaLnZhbHVlLDEwKTshaXNGaW5pdGUoa2EpfHwwPmthfHxrYT49ZWF8fE1hdGguZmxvb3IoZWEpIT1lYT9aLnZhbHVlPVN0cmluZyhMLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tRLmluZGV4T2YoYWEpXS5pbmRleCk6KEwuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzW1EuaW5kZXhPZihhYSldLmluZGV4PWthLGxhLnRleHRDb250ZW50PVN0cmluZyhrYSksTC5vblNsaWNpbmdTcGVjQ2hhbmdlKEwuc2xpY2luZ1NwZWMpKX0pLFouYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsZnVuY3Rpb24oKXtaLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2xhLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayJ9KSxYLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFthYV09CiEwKX1lbHNle2lmKFguc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1hYSl7aWYobnVsbD09PVguc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZS4iKTtsYS50ZXh0Q29udGVudD0iXHUyMTk1ICIrWC5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdKyI6IitYLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV19ZWxzZXtpZihudWxsPT09WC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZS4iKTtsYS50ZXh0Q29udGVudD0iXHUyMTk0ICIrWC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0rIjoiK1guc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdfWxhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7WC5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbYWFdfHwobGEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGthPQpsYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtMLnJlbmRlckRyb3Bkb3duTWVudUl0ZW1zKGJhLGthLmJvdHRvbSxrYS5sZWZ0LGFhKX0pLFguZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkW2FhXT0hMCl9fXZhciBMPXRoaXM7bnVsbCE9SyYmKHRoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShLKSkpO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgcmVuZGVyaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzbGljaW5nIHNwZWMuIik7dmFyIFE9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKGFhKXtyZXR1cm4gYWEuZGltfSksVD10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oYWEpe3JldHVybiBhYS5pbmRleH0pLFg9dGhpcztmb3IoSz0wO0s8dGhpcy5yYW5rOysrSylNKEspfTtILnByb3RvdHlwZS5yZW5kZXJEcm9wZG93bk1lbnVJdGVtcz0KZnVuY3Rpb24oSyxNLEwsUSl7ZnVuY3Rpb24gVChlYSl7aWYoLTE9PT1hYS5pbmRleE9mKGVhKXx8UT09PWxhLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdJiZlYTw9bGEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF18fFE9PWxhLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdJiZlYT49bGEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV0pcmV0dXJuImNvbnRpbnVlIjt2YXIgY2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Y2EuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtIik7Y2EudGV4dENvbnRlbnQ9IlN3YXAgd2l0aCBkaW1lbnNpb24gIitlYTtLLmFwcGVuZENoaWxkKGNhKTtjYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe2NhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtYLmRpbUNvbnRyb2xzW2VhXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCIpfSk7CmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7Y2EuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpO1guZGltQ29udHJvbHNbZWFdLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIil9KTt2YXIga2E9bGEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1RO2NhLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2lmKG51bGw9PT1YLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJEaW1lbnNpb24gc3dhcHBpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHNsaWNpbmcgc3BlYyIpO3ZhciBZPWFhLmluZGV4T2YoZWEpO1guc2xpY2luZ1NwZWMudmlld2luZ0RpbXNba2E/MDoxXT1lYTtYLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tZXT17ZGltOlEsaW5kZXg6MH07WC5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlPW51bGw7WC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2U9Cm51bGw7aWYoWC5vblNsaWNpbmdTcGVjQ2hhbmdlKVgub25TbGljaW5nU3BlY0NoYW5nZShYLnNsaWNpbmdTcGVjKX0pfXZhciBYPXRoaXM7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIlNsaWNpbmcgY29udHJvbCBjYW5ub3QgcmVuZGVyIGRyb3Bkb3duIG1lbnUgaXRlbXMgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjLiIpO3RoaXMuY2xlYXJBbGxEcm9wZG93bnMoKTtmb3IodmFyIGFhPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihlYSl7cmV0dXJuIGVhLmRpbX0pLGxhPXRoaXMsWj0wO1o8dGhpcy5yYW5rOysrWilUKFopO0suYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtLLnN0eWxlLmRpc3BsYXk9Im5vbmUifSk7aWYoSy5maXJzdENoaWxkKXtLLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Sy5zdHlsZS50b3A9TSsicHgiO0suc3R5bGUubGVmdD1MKyJweCI7Sy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siO1o9Sy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgYmE9Wi5sZWZ0LUw7Sy5zdHlsZS50b3A9KE0tKFoudG9wLU0pKS50b0ZpeGVkKDEpKyJweCI7Sy5zdHlsZS5sZWZ0PShMLWJhKS50b0ZpeGVkKDEpKyJweCJ9fTtILnByb3RvdHlwZS5zZXRTbGljaW5nU3BlYz1mdW5jdGlvbihLKXt0aGlzLnNsaWNpbmdTcGVjPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoSykpO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJDYW5ub3Qgc2V0IHNsaWNpbmcgc3BlYyB0byBudWxsLiIpO3RoaXMucmVuZGVyKHRoaXMuc2xpY2luZ1NwZWMpfTtILnByb3RvdHlwZS5jbGVhckFsbERyb3Bkb3ducz1mdW5jdGlvbigpe3RoaXMuZHJvcGRvd25zLmZvckVhY2goZnVuY3Rpb24oSyl7aWYobnVsbCE9Syl7Zm9yKDtLLmZpcnN0Q2hpbGQ7KUsucmVtb3ZlQ2hpbGQoSy5maXJzdENoaWxkKTtLLnN0eWxlLmRpc3BsYXk9Im5vbmUifX0pfTtyZXR1cm4gSH0oKSxEPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLKXt0aGlzLmNvbmZpZz0KSztpZighaXNGaW5pdGUoSy5taW4pKXRocm93IEVycm9yKCJtaW4gdmFsdWUgKCIrSy5taW4rIikgaXMgbm90IGZpbml0ZSIpO2lmKCFpc0Zpbml0ZShLLm1heCkpdGhyb3cgRXJyb3IoIm1heCB2YWx1ZSAoIitLLm1heCsiKSBpcyBub3QgZmluaXRlIik7aWYoSy5tYXg8Sy5taW4pdGhyb3cgRXJyb3IoIm1heCAoIitLLm1heCsiKSBpcyBceDNjIG1pbiAoIitLLm1pbisiKSIpO31ILnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oSyxNKXtpZih0aGlzLmNvbmZpZy5taW4hPT10aGlzLmNvbmZpZy5tYXgpe3ZhciBMPUsuZ2V0Q29udGV4dCgiMmQiKTtpZihudWxsIT1MKXtmb3IodmFyIFE9Sy53aWR0aC8xMDAsVD1LLmhlaWdodCxYPS42KlQsYWE9MDsxMDA+YWE7KythYSl7dmFyIGxhPVEqYWEsWj0uMipULGJhPVlpKHRoaXMuZ2V0UkdCKGFhLzEwMCoodGhpcy5jb25maWcubWF4LXRoaXMuY29uZmlnLm1pbikrdGhpcy5jb25maWcubWluKSwzKSxlYT1iYVswXSxjYT1iYVsxXTtiYT1iYVsyXTsKTC5iZWdpblBhdGgoKTtMLmZpbGxTdHlsZT0icmdiYSgiK2VhKyIsICIrY2ErIiwgIitiYSsiLCAxKSI7TC5maWxsUmVjdChsYSxaLFEsWCk7TC5zdHJva2UoKX1udWxsIT1NJiZNPj10aGlzLmNvbmZpZy5taW4mJk08PXRoaXMuY29uZmlnLm1heCYmKEs9KE0tdGhpcy5jb25maWcubWluKS8odGhpcy5jb25maWcubWF4LXRoaXMuY29uZmlnLm1pbikqSy53aWR0aCxMLmJlZ2luUGF0aCgpLEwuZmlsbFN0eWxlPSJyZ2JhKDAsIDAsIDAsIDEpIixMLm1vdmVUbyhLLC4yKlQpLEwubGluZVRvKEstNCwwKSxMLmxpbmVUbyhLKzQsMCksTC5maWxsKCksTC5iZWdpblBhdGgoKSxMLm1vdmVUbyhLLC44KlQpLEwubGluZVRvKEstNCxUKSxMLmxpbmVUbyhLKzQsVCksTC5maWxsKCkpfX19O3JldHVybiBIfSgpLEI9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSygpe3JldHVybiBudWxsIT09SCYmSC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9V2koSyxIKTtLLnByb3RvdHlwZS5nZXRSR0I9ZnVuY3Rpb24oTSl7aWYoaXNOYU4oTSkpcmV0dXJuWzI1NSwKMCwwXTtpZighaXNGaW5pdGUoTSkpcmV0dXJuIDA8TT9bMCwwLDI1NV06WzI1NSwxMjcuNSwwXTtNPXRoaXMuY29uZmlnLm1pbj09PXRoaXMuY29uZmlnLm1heD8uNTooTS10aGlzLmNvbmZpZy5taW4pLyh0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKTtNPU1hdGgubWF4KE1hdGgubWluKE0sMSksMCk7cmV0dXJuWzI1NSpNLDI1NSpNLDI1NSpNXX07cmV0dXJuIEt9KEQpO0Q9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSygpe3JldHVybiBudWxsIT09SCYmSC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9V2koSyxIKTtLLnByb3RvdHlwZS5nZXRSR0I9ZnVuY3Rpb24oTSl7aWYoaXNOYU4oTSkpcmV0dXJuWzYzLjc1LDYzLjc1LDYzLjc1XTtpZighaXNGaW5pdGUoTSkpcmV0dXJuIDA+TT9bMTI3LjUsMTI3LjUsMTI3LjVdOlsxOTEuMjUsMTkxLjI1LDE5MS4yNV07dmFyIEw9MCxRPTAsVD0wO009dGhpcy5jb25maWcubWluPT09dGhpcy5jb25maWcubWF4Py41OihNLXRoaXMuY29uZmlnLm1pbikvCih0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKTtNPU1hdGgubWF4KE1hdGgubWluKE0sMSksMCk7LjM1Pj1NPyhRPU0vLjM1LFQ9MSk6LjM1PE0mJi42NT49TT8oTD0oTS0uMzUpLyguNjUtLjM1KSxRPTEsVD0oLjY1LU0pLyguNjUtLjM1KSk6LjY1PE0mJihMPTEsUT0oMS1NKS8uMzUpO3JldHVyblsyNTUqTCwyNTUqUSwyNTUqVF19O3JldHVybiBLfShEKTt2YXIgSTsoZnVuY3Rpb24oSCl7SFtILlRFWFQ9MV09IlRFWFQiO0hbSC5JTUFHRT0yXT0iSU1BR0UifSkoSXx8KEk9e30pKTt2YXIgTj17R3JheXNjYWxlOkIsSmV0OkR9LE89ZnVuY3Rpb24oKXtmdW5jdGlvbiBIKEssTSxMKXt0aGlzLnJvb3RFbGVtZW50PUs7dGhpcy50ZW5zb3JWaWV3PU07dGhpcy5iYXNlUnVsZXJUaWNrPXRoaXMudG9wUnVsZXI9dGhpcy52YWx1ZVNlY3Rpb249dGhpcy5zbGljaW5nU3BlY1Jvb3Q9dGhpcy5tZW51VGh1bWI9dGhpcy5pbmZvU3Vic2VjdGlvbj10aGlzLmhlYWRlclNlY3Rpb249bnVsbDsKdGhpcy50b3BSdWxlclRpY2tzPVtdO3RoaXMubGVmdFJ1bGVyVGlja3M9W107dGhpcy52YWx1ZVJvd3M9W107dGhpcy52YWx1ZURpdnM9W107dGhpcy5zbGljaW5nQ29udHJvbD10aGlzLnZhbHVlVG9vbHRpcD1udWxsO3RoaXMuY29sc0N1dG9mZj10aGlzLnJvd3NDdXRvZmY9ITE7dGhpcy5tZW51PXRoaXMubWVudUNvbmZpZz10aGlzLnNlbGVjdGlvbj1udWxsO3RoaXMuY29sb3JNYXBOYW1lPSJHcmF5c2NhbGUiO3RoaXMuY29sb3JNYXA9bnVsbDt0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0hMTt0aGlzLmltYWdlQ2VsbFNpemU9MTY7dGhpcy5taW5JbWFnZUNlbGxTaXplPTQ7dGhpcy5tYXhJbWFnZUNlbGxTaXplPTQwO3RoaXMuem9vbVN0ZXBSYXRpbz0xLjI7dGhpcy5udW1lcmljU3VtbWFyeT1udWxsO3RoaXMub3B0aW9ucz1MfHx7fTt0aGlzLnNsaWNpbmdTcGVjPXAodGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUpO3RoaXMucmFuaz10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZS5sZW5ndGg7CnRoaXMudmFsdWVSZW5kZXJNb2RlPUkuVEVYVH1ILnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gWGkodGhpcyxmdW5jdGlvbihLKXtzd2l0Y2goSy5sYWJlbCl7Y2FzZSAwOnRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldCIpO3RoaXMucmVuZGVySGVhZGVyKCk7aWYoIShkKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKXx8Zih0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGgodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxrKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSkpdGhyb3cgRXJyb3IoIlJlbmRlcmluZyBkdHlwZSAiK3RoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKyIgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIik7cmV0dXJuWzQsdGhpcy5yZW5kZXJWYWx1ZXMoKV07Y2FzZSAxOnJldHVybiBLLnNlbnQoKSxbMl19fSl9KX07SC5wcm90b3R5cGUucmVuZGVySGVhZGVyPQpmdW5jdGlvbigpe251bGw9PXRoaXMuaGVhZGVyU2VjdGlvbiYmKHRoaXMuaGVhZGVyU2VjdGlvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmhlYWRlclNlY3Rpb24uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1oZWFkZXIiKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGVhZGVyU2VjdGlvbiksdGhpcy5jcmVhdGVNZW51KCkpO3RoaXMucmVuZGVySW5mbygpfTtILnByb3RvdHlwZS5yZW5kZXJJbmZvPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBpbmZvIGZhaWxlZCBkdWUgdG8gbWlzaW5nIGhlYWRlciBzZWN0aW9uIik7bnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbiYmKHRoaXMuaW5mb1N1YnNlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5pbmZvU3Vic2VjdGlvbi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWluZm8iKSwKdGhpcy5oZWFkZXJTZWN0aW9uLmFwcGVuZENoaWxkKHRoaXMuaW5mb1N1YnNlY3Rpb24pKTtmb3IoO3RoaXMuaW5mb1N1YnNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy5pbmZvU3Vic2VjdGlvbi5yZW1vdmVDaGlsZCh0aGlzLmluZm9TdWJzZWN0aW9uLmZpcnN0Q2hpbGQpO3RoaXMucmVuZGVyTmFtZSgpO3RoaXMucmVuZGVyRFR5cGUoKTt0aGlzLnJlbmRlclNoYXBlKCl9O0gucHJvdG90eXBlLnJlbmRlck5hbWU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIG5hbWUgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGluZm8gc3Vic2VjdGlvbi4iKTtpZihudWxsIT10aGlzLm9wdGlvbnMubmFtZSYmMCE9PXRoaXMub3B0aW9ucy5uYW1lLmxlbmd0aCl7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIik7Sy50ZXh0Q29udGVudD0Kbih0aGlzLm9wdGlvbnMubmFtZSk7Sy50aXRsZT10aGlzLm9wdGlvbnMubmFtZTt0aGlzLmluZm9TdWJzZWN0aW9uLmFwcGVuZENoaWxkKEspfX07SC5wcm90b3R5cGUucmVuZGVyRFR5cGU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIGR0eXBlIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBpbmZvIHN1YnNlY3Rpb24uIik7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWR0eXBlIik7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCIpO00udGV4dENvbnRlbnQ9ImR0eXBlOiI7Sy5hcHBlbmRDaGlsZChNKTtNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtNLnRleHRDb250ZW50PXRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlO0suYXBwZW5kQ2hpbGQoTSk7CnRoaXMuaW5mb1N1YnNlY3Rpb24uYXBwZW5kQ2hpbGQoSyl9O0gucHJvdG90eXBlLnJlbmRlclNoYXBlPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBzaGFwZSBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaW5mbyBzdWJzZWN0aW9uLiIpO3ZhciBLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0suY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZSIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCIpO00udGV4dENvbnRlbnQ9InNoYXBlOiI7Sy5hcHBlbmRDaGlsZChNKTtNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZS12YWx1ZSIpO00udGV4dENvbnRlbnQ9bCh0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSk7Sy5hcHBlbmRDaGlsZChNKTsKdGhpcy5pbmZvU3Vic2VjdGlvbi5hcHBlbmRDaGlsZChLKX07SC5wcm90b3R5cGUuY3JlYXRlTWVudT1mdW5jdGlvbigpe3ZhciBLPXRoaXM7dGhpcy5tZW51Q29uZmlnPXtpdGVtczpbXX07aWYoZih0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGQodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxoKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSl0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiU2VsZWN0IGRpc3BsYXkgbW9kZS4uLiIsb3B0aW9uczpbIlRleHQiLCJJbWFnZSJdLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpmdW5jdGlvbihNKXswPT09TT8oSy52YWx1ZVJlbmRlck1vZGU9SS5URVhULEsucmVuZGVyVmFsdWVzKCkpOihLLnZhbHVlUmVuZGVyTW9kZT1JLklNQUdFLEsudGVuc29yVmlldy5nZXROdW1lcmljU3VtbWFyeSgpLnRoZW4oZnVuY3Rpb24oTCl7Sy5udW1lcmljU3VtbWFyeT1MO0sucmVuZGVyVmFsdWVzKCl9KSl9fSksdGhpcy5tZW51Q29uZmlnLml0ZW1zLnB1c2goe2NhcHRpb246IlNlbGVjdCBjb2xvciBtYXAuLi4iLApvcHRpb25zOk9iamVjdC5rZXlzKE4pLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpmdW5jdGlvbihNKXtLLmNvbG9yTWFwTmFtZT1PYmplY3Qua2V5cyhOKVtNXTtLLnJlbmRlclZhbHVlcygpfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gSy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFfX0pLHRoaXMubWVudUNvbmZpZy5pdGVtcy5wdXNoKHtjYXB0aW9uOiJab29tIGluIChJbWFnZSBtb2RlKSIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtLLnpvb21Jbk9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIEsudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRX19KSx0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiWm9vbSBvdXQgKEltYWdlIG1vZGUpIixjYWxsYmFjazpmdW5jdGlvbigpe0suem9vbU91dE9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIEsudmFsdWVSZW5kZXJNb2RlPT09CkkuSU1BR0V9fSk7bnVsbCE9PXRoaXMubWVudUNvbmZpZyYmMDx0aGlzLm1lbnVDb25maWcuaXRlbXMubGVuZ3RoJiYodGhpcy5tZW51PW5ldyB5KHRoaXMubWVudUNvbmZpZyx0aGlzLmhlYWRlclNlY3Rpb24pLHRoaXMucmVuZGVyTWVudVRodW1iKCkpfTtILnByb3RvdHlwZS56b29tSW5PbmVTdGVwQW5kUmVuZGVyVmFsdWVzPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZUNlbGxTaXplKnRoaXMuem9vbVN0ZXBSYXRpbzw9dGhpcy5tYXhJbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplKj10aGlzLnpvb21TdGVwUmF0aW8sdGhpcy5yZW5kZXJWYWx1ZXMoKSl9O0gucHJvdG90eXBlLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZUNlbGxTaXplL3RoaXMuem9vbVN0ZXBSYXRpbz49dGhpcy5taW5JbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplLz10aGlzLnpvb21TdGVwUmF0aW8sdGhpcy5yZW5kZXJWYWx1ZXMoKSl9O0gucHJvdG90eXBlLnJlbmRlck1lbnVUaHVtYj0KZnVuY3Rpb24oKXt2YXIgSz10aGlzO2lmKG51bGw9PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIG1lbnUgdGh1bWIgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGhlYWRlciBzZWN0aW9uLiIpO3RoaXMubWVudVRodW1iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMubWVudVRodW1iLnRleHRDb250ZW50PSJcdTIyZWUiO3RoaXMubWVudVRodW1iLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtbWVudS10aHVtYiIpO3RoaXMuaGVhZGVyU2VjdGlvbi5hcHBlbmRDaGlsZCh0aGlzLm1lbnVUaHVtYik7dGhpcy5tZW51VGh1bWIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7aWYobnVsbCE9PUsubWVudSlpZihLLm1lbnUuc2hvd24oKSlLLm1lbnUuaGlkZSgpO2Vsc2V7dmFyIE09Sy5tZW51VGh1bWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Sy5tZW51LnNob3coTS5ib3R0b20sTS5sZWZ0KX19KX07SC5wcm90b3R5cGUucmVuZGVyVmFsdWVzPQpmdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBLPXRoaXM7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oTSl7c3dpdGNoKE0ubGFiZWwpe2Nhc2UgMDpyZXR1cm4gMjx0aGlzLnJhbmsmJm51bGw9PT10aGlzLnNsaWNpbmdTcGVjUm9vdCYmKHRoaXMuc2xpY2luZ1NwZWNSb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2xpY2luZ1NwZWNSb290LmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zbGljaW5nU3BlY1Jvb3QpKSxudWxsPT10aGlzLnZhbHVlU2VjdGlvbiYmKHRoaXMudmFsdWVTZWN0aW9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudmFsdWVTZWN0aW9uLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy52YWx1ZVNlY3Rpb24pLAp0aGlzLnZhbHVlU2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsZnVuY3Rpb24oTCl7cmV0dXJuIGIoSyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIFE7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oVCl7c3dpdGNoKFQubGFiZWwpe2Nhc2UgMDpRPSExO251bGw9PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXl8fCJjdHJsIj09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXk/UT1MLmN0cmxLZXk6ImFsdCI9PT10aGlzLm9wdGlvbnMud2hlZWxab29tS2V5P1E9TC5hbHRLZXk6InNoaWZ0Ij09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXkmJihRPUwuc2hpZnRLZXkpO2lmKFEmJnRoaXMudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSlyZXR1cm4gTC5zdG9wUHJvcGFnYXRpb24oKSxMLnByZXZlbnREZWZhdWx0KCksMDxMLmRlbHRhWT90aGlzLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCk6dGhpcy56b29tSW5PbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCksWzJdO2lmKG51bGw9PQp0aGlzLnNlbGVjdGlvbilyZXR1cm5bMl07TC5zdG9wUHJvcGFnYXRpb24oKTtMLnByZXZlbnREZWZhdWx0KCk7dGhpcy5oaWRlVmFsdWVUb29sdGlwKCk7cmV0dXJuWzQsdGhpcy5zY3JvbGxVcE9yRG93bigwPEwuZGVsdGFZP3cuRE9XTjp3LlVQKV07Y2FzZSAxOnJldHVybiBULnNlbnQoKSxbMl19fSl9KX0pLHRoaXMudmFsdWVTZWN0aW9uLnRhYkluZGV4PTEwMjQsdGhpcy52YWx1ZVNlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oTCl7dmFyIFE9WzM4LDQwLDM3LDM5XTtpZihudWxsIT1LLnNlbGVjdGlvbiYmLTEhPT1RLmluZGV4T2YoTC5rZXlDb2RlKSl7TC5zdG9wUHJvcGFnYXRpb24oKTtMLnByZXZlbnREZWZhdWx0KCk7Sy5oaWRlVmFsdWVUb29sdGlwKCk7dmFyIFQ9UT1udWxsOzM4PT09TC5rZXlDb2RlP1Q9dy5VUDo0MD09PUwua2V5Q29kZT9UPXcuRE9XTjozNz09PUwua2V5Q29kZT9UPXcuTEVGVDozOT09PUwua2V5Q29kZSYmKFQ9dy5SSUdIVCk7Cm51bGwhPT1UJiYoUT1LLnNlbGVjdGlvbi5tb3ZlKFQsSy5zbGljaW5nU3BlYykpO251bGw9PT1RP0sucmVuZGVyU2VsZWN0aW9uKCk6UT09PXcuVVB8fFE9PT13LkRPV04/Sy5zY3JvbGxVcE9yRG93bihRKTooUT09PXcuTEVGVHx8UT09PXcuUklHSFQpJiZLLnNjcm9sbExlZnRPclJpZ2h0KFEpfX0pKSx0aGlzLmNsZWFyVmFsdWVTZWN0aW9uKCksdGhpcy5jcmVhdGVUb3BSdWxlcigpLHRoaXMuY3JlYXRlTGVmdFJ1bGVyKCksdGhpcy5jcmVhdGVWYWx1ZURpdnMoKSxbNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDE6cmV0dXJuIE0uc2VudCgpLDI8dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nQ29udHJvbD1uZXcgRyh0aGlzLnNsaWNpbmdTcGVjUm9vdCx0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxmdW5jdGlvbihMKXtyZXR1cm4gYihLLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gWGkodGhpcyxmdW5jdGlvbihRKXtzd2l0Y2goUS5sYWJlbCl7Y2FzZSAwOmlmKG0odGhpcy5zbGljaW5nU3BlYywKTCkpcmV0dXJuWzMsMl07dGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKTtyZXR1cm5bNCx0aGlzLnJlbmRlcigpXTtjYXNlIDE6cmV0dXJuIFEuc2VudCgpLFszLDRdO2Nhc2UgMjpyZXR1cm4gdGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKSxbNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDM6US5zZW50KCksUS5sYWJlbD00O2Nhc2UgNDpyZXR1cm5bMl19fSl9KX0pLHRoaXMuc2xpY2luZ0NvbnRyb2wucmVuZGVyKHRoaXMuc2xpY2luZ1NwZWMpKSxbMl19fSl9KX07SC5wcm90b3R5cGUuY2xlYXJWYWx1ZVNlY3Rpb249ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy52YWx1ZVNlY3Rpb24pe2Zvcig7dGhpcy52YWx1ZVNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy52YWx1ZVNlY3Rpb24ucmVtb3ZlQ2hpbGQodGhpcy52YWx1ZVNlY3Rpb24uZmlyc3RDaGlsZCk7dGhpcy50b3BSdWxlcj1udWxsOwp0aGlzLnZhbHVlUm93cz1bXX19O0gucHJvdG90eXBlLmNyZWF0ZVRvcFJ1bGVyPWZ1bmN0aW9uKCl7dmFyIEs9dGhpcztpZihudWxsPT09dGhpcy52YWx1ZVNlY3Rpb24pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgdG9wIHJ1bGVyIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHNlY3Rpb24uIik7bnVsbD09dGhpcy50b3BSdWxlciYmKHRoaXMudG9wUnVsZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy50b3BSdWxlci5jbGFzc0xpc3QuYWRkKCJ0ZW5lc29yLXdpZGdldC10b3AtcnVsZXIiKSx0aGlzLnRvcFJ1bGVyLnN0eWxlLndoaXRlU3BhY2U9Im5vd3JhcCIsdGhpcy52YWx1ZVNlY3Rpb24uYXBwZW5kQ2hpbGQodGhpcy50b3BSdWxlciksdGhpcy50b3BSdWxlclRpY2tzPVtdLHRoaXMudG9wUnVsZXIuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGZ1bmN0aW9uKFgpe3JldHVybiBiKEssdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKGFhKXtzd2l0Y2goYWEubGFiZWwpe2Nhc2UgMDppZihudWxsPT0KdGhpcy5zZWxlY3Rpb24pcmV0dXJuWzJdO1guc3RvcFByb3BhZ2F0aW9uKCk7WC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaGlkZVZhbHVlVG9vbHRpcCgpO3JldHVybls0LHRoaXMuc2Nyb2xsTGVmdE9yUmlnaHQoMDxYLmRlbHRhWT93LlJJR0hUOncuTEVGVCldO2Nhc2UgMTpyZXR1cm4gYWEuc2VudCgpLFsyXX19KX0pfSkpO2Zvcig7dGhpcy50b3BSdWxlci5maXJzdENoaWxkOyl0aGlzLnRvcFJ1bGVyLnJlbW92ZUNoaWxkKHRoaXMudG9wUnVsZXIuZmlyc3RDaGlsZCk7dGhpcy5iYXNlUnVsZXJUaWNrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuYmFzZVJ1bGVyVGljay5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7dGhpcy50b3BSdWxlci5hcHBlbmRDaGlsZCh0aGlzLmJhc2VSdWxlclRpY2spOzI8PXRoaXMucmFuayYmKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlPVswLG51bGxdKTt2YXIgTT0xPj10aGlzLnJhbms/CjE6dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07dmFyIEw9dGhpcy5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDt0aGlzLmNvbHNDdXRvZmY9ITE7Zm9yKHZhciBRPTA7UTxNOysrUSl7dmFyIFQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7VC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoVC5zdHlsZS53aWR0aD10aGlzLmltYWdlQ2VsbFNpemUrInB4Iik7dGhpcy50b3BSdWxlci5hcHBlbmRDaGlsZChUKTt0aGlzLnRvcFJ1bGVyVGlja3MucHVzaChUKTtpZihULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0Pj1MKXtpZigyPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAiKwp0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPVErMTt0aGlzLmNvbHNDdXRvZmY9ITB9YnJlYWt9fWlmKCF0aGlzLmNvbHNDdXRvZmYmJjI8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1NfX07SC5wcm90b3R5cGUuY3JlYXRlTGVmdFJ1bGVyPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMudmFsdWVTZWN0aW9uKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGxlZnQgcnVsZXIgZHVlIHRvIG1pc3NpbmcgdmFsdWUgc2VjdGlvbi4iKTt0aGlzLnZhbHVlUm93cz1bXTt0aGlzLmxlZnRSdWxlclRpY2tzPVtdOzE8PXRoaXMucmFuayYmKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZT0KWzAsbnVsbF0pO3ZhciBLPTA9PT10aGlzLnJhbms/MTp0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnJvd3NDdXRvZmY9ITE7Zm9yKHZhciBNPXRoaXMucm9vdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tLEw9MDtMPEs7KytMKXt2YXIgUT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtRLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtcm93Iik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoUS5zdHlsZS5oZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIsUS5zdHlsZS5saW5lSGVpZ2h0PXRoaXMuaW1hZ2VDZWxsU2l6ZSsicHgiKTt0aGlzLnZhbHVlU2VjdGlvbi5hcHBlbmRDaGlsZChRKTt0aGlzLnZhbHVlUm93cy5wdXNoKFEpO3ZhciBUPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1QuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayIpOwp0aGlzLnZhbHVlUmVuZGVyTW9kZT09PUkuSU1BR0UmJihULnN0eWxlLmhlaWdodD10aGlzLmltYWdlQ2VsbFNpemUrInB4IixULnN0eWxlLmxpbmVIZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIpO1EuYXBwZW5kQ2hpbGQoVCk7dGhpcy5sZWZ0UnVsZXJUaWNrcy5wdXNoKFQpO2lmKFQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tPj1NKXtpZigxPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09TCsxO3RoaXMucm93c0N1dG9mZj0hMH1icmVha319aWYoIXRoaXMucm93c0N1dG9mZiYmMTw9dGhpcy5yYW5rKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiKwp0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1LfX07SC5wcm90b3R5cGUuY3JlYXRlVmFsdWVEaXZzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSyhhYSl7ZnVuY3Rpb24gbGEoYmEpe3ZhciBlYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdiIpO1QudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSYmKGVhLnN0eWxlLndpZHRoPVQuaW1hZ2VDZWxsU2l6ZSsicHgiLGVhLnN0eWxlLmhlaWdodD1ULmltYWdlQ2VsbFNpemUrInB4IixlYS5zdHlsZS5saW5lSGVpZ2h0PVQuaW1hZ2VDZWxsU2l6ZSsicHgiKTtULnZhbHVlUm93c1thYV0uYXBwZW5kQ2hpbGQoZWEpO1QudmFsdWVEaXZzW2FhXS5wdXNoKGVhKTtlYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtNLnNlbGVjdGlvbj1uZXcgQyhNLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxNLnNsaWNpbmdTcGVjLApudWxsPT1NLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2V8fG51bGw9PU0uc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXT8wOk0uc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXSthYSxudWxsPT1NLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZXx8bnVsbD09TS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0/MDpNLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStiYSwxLDEpO00ucmVuZGVyU2VsZWN0aW9uKCl9KTtlYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe3ZhciBjYT1lYS5nZXRBdHRyaWJ1dGUoImRldGFpbGVkLXZhbHVlIik7aWYobnVsbCE9PWNhKXt2YXIga2E9TS5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxZPWVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEVhPVkuYm90dG9tLVkudG9wLHZhPVkucmlnaHQtWS5sZWZ0LHhhPU0uY2FsY3VsYXRlSW5kaWNlcyhhYSxiYSk7TS5kcmF3VmFsdWVUb29sdGlwKHhhLApjYSxZLnRvcC1rYS50b3ArLjgqRWEsWS5sZWZ0LWthLmxlZnQrLjc1KnZhKX19KTtlYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe00uaGlkZVZhbHVlVG9vbHRpcCgpfSl9VC52YWx1ZURpdnNbYWFdPVtdO2Zvcih2YXIgWj0wO1o8TDsrK1opbGEoWil9dmFyIE09dGhpcztpZihudWxsPT09dGhpcy52YWx1ZVJvd3MpdGhyb3cgRXJyb3IoIlZhbHVlIHJvd3MgYXJlIHVuZXhwZWN0ZWRseSB1bmluaXRpYWxpemVkLiIpO3RoaXMudmFsdWVEaXZzPVtdO2Zvcih2YXIgTD10aGlzLnRvcFJ1bGVyVGlja3MubGVuZ3RoLFE9dGhpcy52YWx1ZVJvd3MubGVuZ3RoLFQ9dGhpcyxYPTA7WDxROysrWClLKFgpfTtILnByb3RvdHlwZS5yZW5kZXJUb3BSdWxlcj1mdW5jdGlvbigpe2lmKDI8PXRoaXMucmFuaylmb3IodmFyIEs9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV0sTT0wO008dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aDsrK00pe2lmKG51bGw9PT0KdGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZSBmb3IgIit0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3ZhciBMPXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdK007dGhpcy5zaG93SW5kaWNlc09uVGlja3MmJih0aGlzLnRvcFJ1bGVyVGlja3NbTV0udGV4dENvbnRlbnQ9TDxLPyIiK0w6IiIpfX07SC5wcm90b3R5cGUucmVuZGVyTGVmdFJ1bGVyPWZ1bmN0aW9uKCl7aWYoMTw9dGhpcy5yYW5rKWZvcih2YXIgSz10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXSxNPTA7TTx0aGlzLmxlZnRSdWxlclRpY2tzLmxlbmd0aDsrK00pe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGNpYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt2YXIgTD10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0rCk07dGhpcy5zaG93SW5kaWNlc09uVGlja3MmJih0aGlzLmxlZnRSdWxlclRpY2tzW01dLnRleHRDb250ZW50PUw8Sz8iIitMOiIiKX19O0gucHJvdG90eXBlLnJlbmRlclZhbHVlRGl2cz1mdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBLLE0sTCxRLFQsWCxhYSxsYSxaLGJhLGVhLGNhLGthLFksRWEsdmEseGE7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oQWEpe3N3aXRjaChBYS5sYWJlbCl7Y2FzZSAwOnJldHVybiBLPXRoaXMudmFsdWVEaXZzLmxlbmd0aCxNPXRoaXMudmFsdWVEaXZzWzBdLmxlbmd0aCxbNCx0aGlzLnRlbnNvclZpZXcudmlldyh0aGlzLnNsaWNpbmdTcGVjKV07Y2FzZSAxOkw9QWEuc2VudCgpOzA9PT10aGlzLnJhbms/TD1bW0xdXToxPT09dGhpcy5yYW5rJiYoTD1MLm1hcChmdW5jdGlvbihGYSl7cmV0dXJuW0ZhXX0pKTtRPXRoaXMuZ2V0VmFsdWVDbGFzcygpO1Q9dGhpcy52YWx1ZVJlbmRlck1vZGU7aWYoVD09PQpJLklNQUdFKXtpZihudWxsPT10aGlzLm51bWVyaWNTdW1tYXJ5KXRocm93IEVycm9yKCJGYWlsZWQgdG8gcmVuZGVyIGltYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRlbnNvciBkdWUgdG8gbWlzc2luZyBudW1lcmljIHN1bW1hcnkiKTtYPXRoaXMubnVtZXJpY1N1bW1hcnk7YWE9WC5taW5pbXVtO2xhPVgubWF4aW11bTtpZihudWxsPT1hYXx8bnVsbD09bGEpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byByZW5kZXIgaW1hZ2UgcmVwcmVzZW50YXRpb24gb2YgdGVuc29yIGR1ZSB0byBtaXNzaW5nIG1pbmltdW0gb3IgbWF4aW11bSB2YWx1ZXMgaW4gbnVtZXJpYyBzdW1tYXJ5Iik7Wj17bWluOmFhLG1heDpsYX07dGhpcy5jb2xvck1hcD10aGlzLmNvbG9yTWFwTmFtZSBpbiBOP25ldyBOW3RoaXMuY29sb3JNYXBOYW1lXShaKTpuZXcgQihaKX1mb3IoYmE9MDtiYTxLOysrYmEpZm9yKGVhPTA7ZWE8TTsrK2VhKWNhPXRoaXMudmFsdWVEaXZzW2JhXVtlYV0sYmE8TC5sZW5ndGgmJmVhPExbYmFdLmxlbmd0aD8KKGthPUxbYmFdW2VhXSxUPT09SS5JTUFHRT8oWT1ZaSh0aGlzLmNvbG9yTWFwLmdldFJHQihrYSksMyksRWE9WVswXSx2YT1ZWzFdLHhhPVlbMl0sY2Euc3R5bGUuYmFja2dyb3VuZENvbG9yPSJyZ2IoIitFYSsiLCAiK3ZhKyIsICIreGErIikiKToibnVtZXJpYyI9PT1RP2NhLnRleHRDb250ZW50PXEoa2EsZCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSkpOiJib29sZWFuIj09PVE/Y2EudGV4dENvbnRlbnQ9dShrYSk6InN0cmluZyI9PT1RJiYoY2EudGV4dENvbnRlbnQ9eChrYSkpLGNhLnNldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiLHRoaXMuZ2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmcoa2EpKSk6KGNhLnRleHRDb250ZW50PSIiLGNhLnNldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiLCIiKSk7dGhpcy5yZW5kZXJTZWxlY3Rpb24oKTtyZXR1cm5bMl19fSl9KX07SC5wcm90b3R5cGUuZ2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmc9ZnVuY3Rpb24oSyl7cmV0dXJuImJvb2xlYW4iPT09CnRoaXMuZ2V0VmFsdWVDbGFzcygpP3UoSywhMSk6InN0cmluZyI9PT10aGlzLmdldFZhbHVlQ2xhc3MoKT8iTGVuZ3RoLSIrSy5sZW5ndGgrJyBzdHJpbmc6ICInK3goSyw1MDApKyciJzpTdHJpbmcoSyl9O0gucHJvdG90eXBlLnJlbmRlclNlbGVjdGlvbj1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuc2VsZWN0aW9uKWZvcih2YXIgSz10aGlzLnZhbHVlRGl2cy5sZW5ndGgsTT10aGlzLnZhbHVlRGl2c1swXS5sZW5ndGgsTD0wO0w8SzsrK0wpZm9yKHZhciBRPTA7UTxNOysrUSl7dmFyIFQ9dGhpcy52YWx1ZURpdnNbTF1bUV07VC5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24iKTtULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi10b3AiKTtULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1ib3R0b20iKTtULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0Iik7ClQuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0Iik7dmFyIFg9dGhpcy5jYWxjdWxhdGVJbmRpY2VzKEwsUSk7WD10aGlzLnNlbGVjdGlvbi5nZXRFbGVtZW50U3RhdHVzKFgpO251bGwhPT1YJiYoVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24iKSxYLnRvcEVkZ2UmJlQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCIpLFguYm90dG9tRWRnZSYmVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIiksWC5sZWZ0RWRnZSYmVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tbGVmdCIpLFgucmlnaHRFZGdlJiZULmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCIpKX19O0gucHJvdG90eXBlLmNhbGN1bGF0ZUluZGljZXM9CmZ1bmN0aW9uKEssTSl7Zm9yKHZhciBMPVtdLFE9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKGxhKXtyZXR1cm4gbGEuZGltfSksVD10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24obGEpe3JldHVybiBsYS5pbmRleH0pLFg9MDtYPHRoaXMucmFuazsrK1gpaWYoLTEhPT1RLmluZGV4T2YoWCkpe3ZhciBhYT1UW1EuaW5kZXhPZihYKV07aWYobnVsbD09PWFhKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY2FsY3VsYXRlIGluZGljZXM6IFVuZGV0ZXJtaW5lZCBpbmRleCBhdCBkaW1lbnNpb24gIitYKTtMLnB1c2goYWEpfWVsc2UgaWYoWD09PXRoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF0pe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2V8fG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjYWxjdWxhdGUgaW5kaWNlcyBkdWUgdG8gdW5kZXJ0ZXJtaW5lZCB2ZXJ0aWNhbCByYW5nZS4iKTsKTC5wdXNoKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXStLKX1lbHNlIGlmKFg9PT10aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2V8fG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBpbmRpY2VzIGR1ZSB0byB1bmRlcnRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpO0wucHVzaCh0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStNKX1yZXR1cm4gTH07SC5wcm90b3R5cGUuZHJhd1ZhbHVlVG9vbHRpcD1mdW5jdGlvbihLLE0sTCxRKXtudWxsPT09dGhpcy52YWx1ZVRvb2x0aXAmJih0aGlzLnZhbHVlVG9vbHRpcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnZhbHVlVG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAiKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudmFsdWVUb29sdGlwKSk7CmZvcig7dGhpcy52YWx1ZVRvb2x0aXAuZmlyc3RDaGlsZDspdGhpcy52YWx1ZVRvb2x0aXAucmVtb3ZlQ2hpbGQodGhpcy52YWx1ZVRvb2x0aXAuZmlyc3RDaGlsZCk7dmFyIFQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7VC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtaW5kaWNlcyIpO1QudGV4dENvbnRlbnQ9IkluZGljZXM6ICIrSlNPTi5zdHJpbmdpZnkoSyk7dGhpcy52YWx1ZVRvb2x0aXAuYXBwZW5kQ2hpbGQoVCk7Sz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtLLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSIpO0sudGV4dENvbnRlbnQ9TTt0aGlzLnZhbHVlVG9vbHRpcC5hcHBlbmRDaGlsZChLKTt0aGlzLnZhbHVlVG9vbHRpcC5zdHlsZS50b3A9TCsicHgiO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLmxlZnQ9USsicHgiO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjsKdGhpcy52YWx1ZVJlbmRlck1vZGU9PUkuSU1BR0UmJm51bGwhPXRoaXMuY29sb3JNYXAmJihMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLEwuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIiksdGhpcy52YWx1ZVRvb2x0aXAuYXBwZW5kQ2hpbGQoTCksdGhpcy5jb2xvck1hcC5yZW5kZXIoTCxwYXJzZUZsb2F0KE0pKSl9O0gucHJvdG90eXBlLmhpZGVWYWx1ZVRvb2x0aXA9ZnVuY3Rpb24oKXtudWxsIT10aGlzLnZhbHVlVG9vbHRpcCYmKHRoaXMudmFsdWVUb29sdGlwLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX07SC5wcm90b3R5cGUucmVuZGVyUnVsZXJzQW5kVmFsdWVEaXZzPWZ1bmN0aW9uKCl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oSyl7c3dpdGNoKEsubGFiZWwpe2Nhc2UgMDpyZXR1cm4gbnVsbCE9dGhpcy5zbGljaW5nQ29udHJvbCYmdGhpcy5zbGljaW5nQ29udHJvbC5zZXRTbGljaW5nU3BlYyh0aGlzLnNsaWNpbmdTcGVjKSwKdGhpcy5jYWxjdWxhdGVTaG93SW5kaWNlc09uUnVsZXJUaWNrcygpLHRoaXMucmVuZGVyVG9wUnVsZXIoKSx0aGlzLnJlbmRlckxlZnRSdWxlcigpLFs0LHRoaXMucmVuZGVyVmFsdWVEaXZzKCldO2Nhc2UgMTpyZXR1cm4gSy5zZW50KCksWzJdfX0pfSl9O0gucHJvdG90eXBlLmNhbGN1bGF0ZVNob3dJbmRpY2VzT25SdWxlclRpY2tzPWZ1bmN0aW9uKCl7aWYoMjw9dGhpcy5yYW5rKXt2YXIgSz10aGlzLnRvcFJ1bGVyVGlja3NbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5zaG93SW5kaWNlc09uVGlja3M9Sy5yaWdodC1LLmxlZnQ+OSpNYXRoLmNlaWwoTWF0aC5sb2codGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV0pL01hdGguTE4xMCl9ZWxzZSAxPT09dGhpcy5yYW5rPyhLPXRoaXMubGVmdFJ1bGVyVGlja3NbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5zaG93SW5kaWNlc09uVGlja3M9MTY8Sy5ib3R0b20tCksudG9wKTp0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0hMX07SC5wcm90b3R5cGUuc2Nyb2xsSG9yaXpvbnRhbGx5PWZ1bmN0aW9uKEspe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBNLEw7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oUSl7c3dpdGNoKFEubGFiZWwpe2Nhc2UgMDppZigxPj10aGlzLnJhbmspcmV0dXJuWzJdO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7TT10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdXTtpZigwPkt8fEs+PU0pdGhyb3cgRXJyb3IoIkluZGV4IG91dCBvZiBib3VuZDogIitLKyIgaXMgb3V0c2lkZSBbMCwgIitNKyJdKSIpO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdPUs7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV09CksrdGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aDtMPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPkwmJih0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1MKTtyZXR1cm5bNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDE6cmV0dXJuIFEuc2VudCgpLFsyXX19KX0pfTtILnByb3RvdHlwZS5zY3JvbGxWZXJ0aWNhbGx5PWZ1bmN0aW9uKEspe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBNLEw7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oUSl7c3dpdGNoKFEubGFiZWwpe2Nhc2UgMDppZigwPT09dGhpcy5yYW5rKXJldHVyblsyXTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiK3RoaXMucmFuaysKIkQgdGVuc29yLiIpO2lmKG51bGw9PT10aGlzLnZhbHVlUm93cyl0aHJvdyBFcnJvcigiVmVydGljYWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyB2YWx1ZSByb3dzLiIpO009dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV07aWYoMD5LfHxLPj1NKXRocm93IEVycm9yKCJJbmRleCBvdXQgb2YgYm91bmQ6ICIrSysiIGlzIG91dHNpZGUgWzAsICIrTSsiXSkiKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF09Szt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09Syt0aGlzLnZhbHVlUm93cy5sZW5ndGg7TD10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV0+TCYmKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1MKTtyZXR1cm5bNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTsKY2FzZSAxOnJldHVybiBRLnNlbnQoKSxbMl19fSl9KX07SC5wcm90b3R5cGUuc2Nyb2xsVXBPckRvd249ZnVuY3Rpb24oSyl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIE0sTCxRO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKFQpe3N3aXRjaChULmxhYmVsKXtjYXNlIDA6aWYoMD09PXRoaXMucmFua3x8IXRoaXMucm93c0N1dG9mZilyZXR1cm5bMl07aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZSBmb3IgIit0aGlzLnJhbmsrIkQgdGVuc29yLiIpO2lmKG51bGw9PT10aGlzLnZhbHVlUm93cyl0aHJvdyBFcnJvcigiVmVydGljYWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyB2YWx1ZSByb3dzLiIpO009dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdO2lmKEshPT13LkRPV04pcmV0dXJuWzMsM107TD10aGlzLnZhbHVlUm93cy5sZW5ndGgtCjE7UT10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXS1MO3JldHVybiBNPFE/WzQsdGhpcy5zY3JvbGxWZXJ0aWNhbGx5KE0rMSldOlszLDJdO2Nhc2UgMTpULnNlbnQoKSxULmxhYmVsPTI7Y2FzZSAyOnJldHVyblszLDVdO2Nhc2UgMzpyZXR1cm4gMDw9TS0xP1s0LHRoaXMuc2Nyb2xsVmVydGljYWxseShNLTEpXTpbMyw1XTtjYXNlIDQ6VC5zZW50KCksVC5sYWJlbD01O2Nhc2UgNTpyZXR1cm5bMl19fSl9KX07SC5wcm90b3R5cGUuc2Nyb2xsTGVmdE9yUmlnaHQ9ZnVuY3Rpb24oSyl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIE0sTCxRO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKFQpe3N3aXRjaChULmxhYmVsKXtjYXNlIDA6aWYoMT49dGhpcy5yYW5rfHwhdGhpcy5jb2xzQ3V0b2ZmKXJldHVyblsyXTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIkhvcml6b250YWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBob3Jpem9udGFsIHJhbmdlLiIpOwpNPXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdO2lmKEshPT13LlJJR0hUKXJldHVyblszLDNdO0w9dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aC0xO1E9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV0tTDtyZXR1cm4gTTxRP1s0LHRoaXMuc2Nyb2xsSG9yaXpvbnRhbGx5KE0rMSldOlszLDJdO2Nhc2UgMTpULnNlbnQoKSxULmxhYmVsPTI7Y2FzZSAyOnJldHVyblszLDVdO2Nhc2UgMzpyZXR1cm4gMDw9TS0xP1s0LHRoaXMuc2Nyb2xsSG9yaXpvbnRhbGx5KE0tMSldOlszLDVdO2Nhc2UgNDpULnNlbnQoKSxULmxhYmVsPTU7Y2FzZSA1OnJldHVyblsyXX19KX0pfTtILnByb3RvdHlwZS5uYXZpZ2F0ZVRvSW5kaWNlcz1mdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIm5hdmlnYXRlVG9JbmRpY2VzKCkgaXMgbm90IGltcGxlbWVudGVkIHlldC4iKTsKfSl9KX07SC5wcm90b3R5cGUuZ2V0VmFsdWVDbGFzcz1mdW5jdGlvbigpe3ZhciBLPXRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlO3JldHVybiBkKEspfHxmKEspPyJudW1lcmljIjpoKEspPyJib29sZWFuIjoic3RyaW5nIn07cmV0dXJuIEh9KCk7RD1PYmplY3QuZnJlZXplKHt0ZW5zb3JXaWRnZXQ6ZnVuY3Rpb24oSCxLLE0pe3JldHVybiBuZXcgTyhILEssTSl9LFZFUlNJT046IjAuMC4wIn0pO3dpbmRvdy50ZW5zb3Jfd2lkZ2V0PUR9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1saW5lLWNoYXJ0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiLHByb3BlcnRpZXM6e2RhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9kZWZhdWx0U2VyaWVzTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6Il9fZGVidWdnZXJfZGF0YV9fIixyZWFkb25seTohMH0sX2xpbmVDaGFydFhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOigpPT4oKT0+e2NvbnN0IGI9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTpiLGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoYiwiYm90dG9tIiksYWNjZXNzb3I6ZD0+ZC5zdGVwfX19LF9saW5lQ2hhcnRZVmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PmI9PmIuc2NhbGFyfSxfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6KCk9Plt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmI9Pgoic3RlcFx4M2QiK2IuZGF0dW0uc3RlcCsiOyBzY2FsYXJceDNkICIrYi5kYXR1bS5zY2FsYXJ9XX0sX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9ic2VydmVyczpbInJlbmRlcihkYXRhKSJdLHJlbmRlcihiKXtpZihudWxsIT1iKXt2YXIgZD10aGlzLiQkKCJ2ei1saW5lLWNoYXJ0MiIpO2Quc2V0VmlzaWJsZVNlcmllcyhbdGhpcy5fZGVmYXVsdFNlcmllc05hbWVdKTt2YXIgZj1bXSxoPWIueDtiPWIueTtmb3IobGV0IGs9MDtrPGgubGVuZ3RoOysraylmLnB1c2goe3N0ZXA6aFtrXSxzY2FsYXI6YltrXX0pO2Quc2V0U2VyaWVzRGF0YSh0aGlzLl9kZWZhdWx0U2VyaWVzTmFtZSxmKX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci12YWx1ZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci12YWx1ZS12aWV3Iixwcm9wZXJ0aWVzOnt2aWV3SWQ6U3RyaW5nLHRlbnNvck5hbWU6U3RyaW5nLGRlYnVnT3A6U3RyaW5nLGRldmljZU5hbWU6U3RyaW5nLG1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU6U3RyaW5nLHNsaWNpbmc6U3RyaW5nLHRpbWVJbmRpY2VzOlN0cmluZyxkdHlwZTpTdHJpbmcsc2hhcGU6QXJyYXksY29udGludWVUb0J1dHRvbkNhbGxiYWNrOk9iamVjdCxjbG9zZUJ1dHRvbkNhbGxiYWNrOk9iamVjdCx0ZW5zb3JOYW1lQ2FsbGJhY2s6T2JqZWN0LHRlbnNvcldpZGdldDpPYmplY3QsZ2V0SGVhbHRoUGlsbDpGdW5jdGlvbixfaXNUZW5zb3JWYWx1ZVNjYWxhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaXNUZW5zb3JWYWx1ZUxpbmVDaGFydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaXNUZW5zb3JWYWx1ZUltYWdlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9kYXRhU2NhbGFyOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfSwKX2xpbmVDaGFydERhdGE6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX2RhdGFJbWFnZVNyYzp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyKDEwKX19LG9ic2VydmVyczpbIl91cGRhdGVUaW1lSW5kaWNlc1RvZ2dsZSh0aW1lSW5kaWNlcykiXSxyZW5kZXJUZW5zb3JWYWx1ZSgpe2lmKHRoaXMudGVuc29yTmFtZSlpZihudWxsPT10aGlzLnNsaWNpbmcpe3RoaXMuc2V0KCJfdXNlVGVuc29yV2lkZ2V0IiwhMCk7Y29uc3QgZD17c3BlYzp7ZHR5cGU6dGhpcy5kdHlwZSxzaGFwZTp0aGlzLnNoYXBlfSxnZXQ6KCk9Pnt0aHJvdyBFcnJvcigidGVuc29yVmlldy5nZXQoKSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiIpO30sdmlldzpmPT57Y29uc3QgaD10aGlzO3JldHVybiBoYyhmdW5jdGlvbiooKXtjb25zdCBrPWguc2hhcGUubGVuZ3RoLHQ9Zi5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKG09PgptLmRpbSksbD1mLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAobT0+bS5pbmRleCk7bGV0IHA9IlsiO2ZvcihsZXQgbT0wO208azsrK20pLTEhPT10LmluZGV4T2YobSk/cCs9YCR7bFt0LmluZGV4T2YobSldfWA6Zi52aWV3aW5nRGltc1swXT09PW0/cCs9YCR7Zi52ZXJ0aWNhbFJhbmdlWzBdfToke2YudmVydGljYWxSYW5nZVsxXX1gOmYudmlld2luZ0RpbXNbMV09PT1tJiYocCs9YCR7Zi5ob3Jpem9udGFsUmFuZ2VbMF19OiR7Zi5ob3Jpem9udGFsUmFuZ2VbMV19YCksbTxrLTEmJihwKz0iLCIpO3ArPSJdIjtyZXR1cm4gbmV3IFByb21pc2UoKG0sbik9Pntjb25zdCBxPWguX2dldFRlbnNvckRhdGFVUkwoe3dhdGNoX2tleTpoLnRlbnNvck5hbWUrIjoiK2guZGVidWdPcCxzbGljaW5nOnAsdGltZV9pbmRpY2VzOmgudGltZUluZGljZXMsbWFwcGluZzoibm9uZSJ9KTtoLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHEpLnRoZW4odT0+e251bGw9PXUuZXJyb3I/bSh1LnRlbnNvcl9kYXRhW3UudGVuc29yX2RhdGEubGVuZ3RoLQoxXSk6bih1LmVycm9yKX0pLmNhdGNoKHU9Pm4odSkpfSl9KX0sZ2V0TnVtZXJpY1N1bW1hcnk6KCk9Pntjb25zdCBmPXRoaXM7cmV0dXJuIGhjKGZ1bmN0aW9uKigpe3JldHVybiBuZXcgUHJvbWlzZSgoaCxrKT0+e2NvbnN0IHQ9Zi50ZW5zb3JOYW1lKyI6IitmLmRlYnVnT3A7Zi5nZXRIZWFsdGhQaWxsKHQsZi5kZXZpY2VOYW1lLGYubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxsPT57bnVsbD09bD9rKGBGYWlsZWQgdG8gZ2V0IGhlYWx0aCBwaWxsIGZvciB3YXRjaCBrZXkgJHt0fWApOmgoe2VsZW1lbnRDb3VudDpsWzFdLG1pbmltdW06bFs4XSxtYXhpbXVtOmxbOV19KX0pfSl9KX19O3NldFRpbWVvdXQoKCk9PntudWxsPT10aGlzLnRlbnNvcldpZGdldCYmKHRoaXMudGVuc29yV2lkZ2V0PXRlbnNvcl93aWRnZXQudGVuc29yV2lkZ2V0KHRoaXMuJCQoIiN0ZW5zb3Itd2lkZ2V0IiksZCx7d2hlZWxab29tS2V5OiJhbHQifSkpO3RoaXMudGVuc29yV2lkZ2V0LnJlbmRlcigpfSwKMTApfWVsc2V7dGhpcy5zZXQoIl91c2VUZW5zb3JXaWRnZXQiLCExKTt2YXIgYj10aGlzLl9yYW5rRnJvbVNsaWNpbmcodGhpcy5zbGljaW5nLnRyaW0oKSk7Y29uc3QgZD10aGlzLl9pc1RpbWVJbmRpY2VzU2luZ2xlU3RlcCh0aGlzLnRpbWVJbmRpY2VzKTtsZXQgZj1iO2lmKCFkKXtpZigxPGIpe3RoaXMuX3Nob3dUb2FzdCgiSGlzdG9yeSBmb3IgdGVuc29ycyBceDNlIDFEIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpO3JldHVybn1mKz0xfWI9dGhpcy5fZ2V0VGVuc29yRGF0YVVSTCh7d2F0Y2hfa2V5OnRoaXMudGVuc29yTmFtZSsiOiIrdGhpcy5kZWJ1Z09wLHNsaWNpbmc6dGhpcy5zbGljaW5nLHRpbWVfaW5kaWNlczp0aGlzLnRpbWVJbmRpY2VzLG1hcHBpbmc6Mjw9Zj8iaW1hZ2UvcG5nIjoibm9uZSJ9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oaD0+e3RoaXMuJCQoIiNkZWJ1Zy1vcCIpLnRleHRDb250ZW50PXRoaXMuX2NhbGN1bGF0ZURlYnVnT3BUb0Rpc3BsYXkoKTsKaWYobnVsbCE9aC5lcnJvcil0aGlzLl9zaG93VG9hc3QoaC5lcnJvci50eXBlKyI6ICIraC5lcnJvci5tZXNzYWdlKTtlbHNlIGlmKGg9ZD9oLnRlbnNvcl9kYXRhWzBdOmgudGVuc29yX2RhdGEsMD09PWYpdGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoInNjYWxhciIpLHRoaXMuc2V0KCJfZGF0YVNjYWxhciIsaCk7ZWxzZSBpZigxPT09Zil7dGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoImxpbmVDaGFydCIpO2xldCBrPXt4OltdLHk6aH07Zm9yKGxldCB0PTA7dDxoLmxlbmd0aDsrK3Qpay54LnB1c2godCsxKTt0aGlzLnNldCgiX2xpbmVDaGFydERhdGEiLGspfWVsc2UgMjw9Zj8odGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoImltYWdlIiksdGhpcy5zZXQoIl9kYXRhSW1hZ2VTcmMiLCJkYXRhOmltYWdlL3BuZztiYXNlNjQsIitoKSk6dGhpcy5fc2hvd1RvYXN0KCJWaXN1YWxpemF0aW9uIG9mIHJhbmstIitmKyIgdGVuc29ycyBpcyBub3QgeWV0IHN1cHBvcnRlZC4iKX0pfX0sCnJlZnJlc2goKXt0aGlzLnRlbnNvck5hbWUudHJpbSgpJiZ0aGlzLnJlbmRlclRlbnNvclZhbHVlKCl9LF9nZXRUZW5zb3JEYXRhVVJMKGIpe2NvbnN0IGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL3RlbnNvcl9kYXRhIik7cmV0dXJuIHZjLmFkZFBhcmFtcyhkLGIpfSxfcmFua0Zyb21TbGljaW5nKGIpe2Iuc3RhcnRzV2l0aCgiWyIpJiYoYj1iLnNsaWNlKDEsYi5sZW5ndGgtMSkpO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gMDt7Yj1iLnNwbGl0KCIsIik7bGV0IGQ9Yi5sZW5ndGg7Zm9yKGNvbnN0IGYgb2YgYilpc05hTihOdW1iZXIoZikpfHxkLS07cmV0dXJuIGR9fSxfc2V0VmlzdWFsaXphdGlvblR5cGUoYil7InNjYWxhciI9PT1iPyh0aGlzLnNldCgiX2lzVmFsdWVTY2FsYXIiLCEwKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToibGluZUNoYXJ0Ij09PWI/KHRoaXMuc2V0KCJfaXNWYWx1ZVNjYWxhciIsCiExKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCEwKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToiaW1hZ2UiPT09Yj8odGhpcy5zZXQoIl9pc1ZhbHVlU2NhbGFyIiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlTGluZUNoYXJ0IiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlSW1hZ2UiLCEwKSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCB2aXN1YWxpemF0aW9uVHlwZToiLGIpfSxfdGltZUluZGljZXNUb2dnbGVCdXR0b25DYWxsYmFjaygpeyJmdWxsIGhpc3RvcnkiPT09UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCk/dGhpcy5zZXQoInRpbWVJbmRpY2VzIiwiOiIpOnRoaXMuc2V0KCJ0aW1lSW5kaWNlcyIsIi0xIik7dGhpcy5yZW5kZXJUZW5zb3JWYWx1ZSgpfSxfdXBkYXRlVGltZUluZGljZXNUb2dnbGUoYil7dGhpcy5faXNUaW1lSW5kaWNlc1NpbmdsZVN0ZXAoYik/UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50PQoiRnVsbCBIaXN0b3J5IjpQb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iKSkudGV4dENvbnRlbnQ9IkxhdGVzdCBUaW1lIFBvaW50In0sX2lzVGltZUluZGljZXNTaW5nbGVTdGVwKGIpe2Iuc3RhcnRzV2l0aCgiWyIpJiYoYj1iLnNsaWNlKDEsYi5sZW5ndGgtMSkpO3JldHVybiFpc05hTihOdW1iZXIoYikpfSxfY2FsY3VsYXRlRGVidWdPcFRvRGlzcGxheSgpe3JldHVybiJEZWJ1Z0lkZW50aXR5Ij09PXRoaXMuZGVidWdPcD8iIjp0aGlzLmRlYnVnT3B9LF9zaG93VG9hc3QoYil7dGhpcy4kLnRlbnNvclZhbHVlVG9hc3Quc2V0QXR0cmlidXRlKCJ0ZXh0IixiKTt0aGlzLiQudGVuc29yVmFsdWVUb2FzdC5vcGVuKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Iixwcm9wZXJ0aWVzOntjb250aW51ZVRvQ2FsbGJhY2s6RnVuY3Rpb24sdGVuc29yTmFtZUNsaWNrZWQ6RnVuY3Rpb24sX3RlbnNvclZpZXdDb3VudGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxnZXRIZWFsdGhQaWxsOkZ1bmN0aW9ufSxhZGRWaWV3KGIpe2NvbnN0IGQ9dGhpcy4kJCgiI211bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciIpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGYtdGVuc29yLXZhbHVlLXZpZXciKTtmLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJkZWJ1Z2dlci10ZW5zb3ItdmlldyIpO2Yudmlld0lkPWIudmlld0lkO2YudGVuc29yTmFtZT1iLnRlbnNvck5hbWU7Zi5kZWJ1Z09wPWIuZGVidWdPcDtmLmRldmljZU5hbWU9Yi5kZXZpY2VOYW1lO2YubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZT1iLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU7Zi5kdHlwZT1iLmR0eXBlO2Yuc2hhcGU9Yi5zaGFwZTsKZi5zbGljaW5nPWIuc2xpY2luZztmLnRpbWVJbmRpY2VzPWIudGltZUluZGljZXM7Zi5jbG9zZUJ1dHRvbkNhbGxiYWNrPXRoaXMuX2NyZWF0ZUNsb3NlQnV0dG9uQ2FsbGJhY2soYi52aWV3SWQpO2YuY29udGludWVUb0J1dHRvbkNhbGxiYWNrPSgpPT57dGhpcy5jb250aW51ZVRvQ2FsbGJhY2soYi5kZXZpY2VOYW1lLGIubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSl9O2YudGVuc29yTmFtZUNhbGxiYWNrPSgpPT57dGhpcy50ZW5zb3JOYW1lQ2xpY2tlZChiLmRldmljZU5hbWUsYi5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lKX07Zi5nZXRIZWFsdGhQaWxsPXRoaXMuZ2V0SGVhbHRoUGlsbDtkLmFwcGVuZENoaWxkKGYpO2YucmVmcmVzaCgpfSxnZXRWaWV3cygpe2NvbnN0IGI9W107Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKSxkPT57Yi5wdXNoKHt2aWV3SWQ6ZC52aWV3SWQsdGVuc29yTmFtZTpkLnRlbnNvck5hbWUsCmRlYnVnT3A6ZC5kZWJ1Z09wLHNsaWNpbmc6ZC5zbGljaW5nLHRpbWVJbmRpY2VzOmQudGltZUluZGljZXN9KX0pO3JldHVybiBifSxyZW5kZXJUZW5zb3JWYWx1ZXMoKXtfLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpLGI9PntiLnJlbmRlclRlbnNvclZhbHVlKCl9KX0sX3JlZHJhd1ZpZXdzKGIpe2NvbnN0IGQ9dGhpcy4kJCgiI211bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciIpO18uZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRlYnVnZ2VyLXRlbnNvci12aWV3IiksZj0+e2QucmVtb3ZlQ2hpbGQoZil9KTtfLmZvckVhY2goYixmPT57dGhpcy5hZGRWaWV3KGYpfSl9LF9jcmVhdGVDbG9zZUJ1dHRvbkNhbGxiYWNrKGIpe3JldHVybigpPT57Y29uc3QgZD1bXSxmPXRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKTtmb3IobGV0IGg9MDtoPGYubGVuZ3RoOysraCl7Y29uc3Qgaz0KZltoXTtrLnZpZXdJZCE9PWImJmQucHVzaCh7dmlld0lkOmsudmlld0lkLHRlbnNvck5hbWU6ay50ZW5zb3JOYW1lLGRlYnVnT3A6ay5kZWJ1Z09wLGR0eXBlOmsuZHR5cGUsc2hhcGU6ay5zaGFwZSxzbGljaW5nOmsuc2xpY2luZyx0aW1lSW5kaWNlczprLnRpbWVJbmRpY2VzfSl9dGhpcy5fcmVkcmF3Vmlld3MoZCl9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90ZW5zb3Itc2hhcGUtaGVscGVyLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYsaCl7cmV0dXJuIGY8PWg/Ijo6IjoiOjoiK01hdGguY2VpbChmL2gpfWIuZ2V0RGVmYXVsdFNsaWNpbmc9ZnVuY3Rpb24oZil7cmV0dXJuIDA9PT1mLmxlbmd0aD8iIjoxPT09Zi5sZW5ndGg/IlsiK2QoZlswXSwxRTMpKyJdIjoyPT09Zi5sZW5ndGg/IlsiK2QoZlswXSwyNTApKyIsICIrZChmWzFdLDI1MCkrIl0iOm51bGx9O2IucmFua0Zyb21TbGljaW5nPWZ1bmN0aW9uKGYpe2Yuc3RhcnRzV2l0aCgiWyIpJiYoZj1mLnNsaWNlKDEsZi5sZW5ndGgtMSkpO2lmKDA9PT1mLmxlbmd0aClyZXR1cm4gMDt7Zj1mLnNwbGl0KCIsIik7bGV0IGg9Zi5sZW5ndGg7Zm9yKGNvbnN0IGsgb2YgZilpc05hTihOdW1iZXIoaykpfHxoLS07cmV0dXJuIGh9fX0pKFZpfHwoVmk9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItZGFzaGJvYXJkLmh0bWwuanMKY29uc3QgWmk9KCk9PndpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsSGs9KCk9PndpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsSWs9KFppKCktNzApLzI7ClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e190b3BSaWdodFRhYnM6e3R5cGU6QXJyYXksdmFsdWU6W3tpZDoidGFiLXJ1bnRpbWUtZ3JhcGhzIixuYW1lOiJSdW50aW1lIEdyYXBocyJ9LHtpZDoidGFiLXRlbnNvci12YWx1ZXMiLG5hbWU6IlRlbnNvciBWYWx1ZXMifV0scmVhZG9ubHk6ITB9LF9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdG9wUmlnaHRTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6IjAiLG9ic2VydmVyOiJfdG9wUmlnaHRTZWxlY3RlZENoYW5nZWQifSxfbG9uZ1BvbGxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3N0ZXBCdXR0b25UZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiU3RlcCJ9LF9jb250aW51ZUJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiJ9LApfdGVuc29yVmlld0lkQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saXNSZWxvYWREaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSxhbHJlYWR5U3RhcnRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY3VycmVudFNlc3Npb25SdW5JbmZvOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfc2Vzc2lvblJ1blRvdGFsQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3Nlc3Npb25SdW5Db3VudGVyczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2FjdGl2ZVNlc3Npb25SdW5LZXk6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX2FjdGl2ZVNlc3Npb25SdW5OdW1EZXZpY2VzOnt0eXBlOk51bWJlcix2YWx1ZTotMX0sX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWU6e3R5cGU6U3RyaW5nLAp2YWx1ZTpudWxsLG5vdGlmeTohMH0sX2hpZ2hsaWdodE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY29udGludWVUb1R5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9jb250aW51ZVN0b3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NvbnRpbnVlVG9UYXJnZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXJUYXJnZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOi0xfSxfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lOlN0cmluZyxfZm9yY2VFeHBhbmROb2RlTmFtZTpTdHJpbmcsX3NvdXJjZUZvY3VzTm9kZU5hbWU6U3RyaW5nLF9zb3VyY2VDb2RlU2hvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3Nob3dTb3VyY2VDb2RlQ2hhbmdlZCJ9LF9ncmFwaFByb2dyZXNzOnt0eXBlOk9iamVjdH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+Cm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcig1MCl9LF9idXN5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9sZWZ0UGFuZVdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTpwZC5nZXROdW1iZXJJbml0aWFsaXplcigiX2xlZnRQYW5lV2lkdGgiLHtkZWZhdWx0VmFsdWU6NDUwfSksb2JzZXJ2ZXI6Il9sZWZ0UGFuZVdpZHRoT2JzZXJ2ZXIifSxfbWlubGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6NDUwLHJlYWRPbmx5OiEwfSxfbWF4bGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4bGVmdFBhbmVXaWR0aChfd2luZG93V2lkdGgsIF9tYXhNYWluQ29udGVudFdpZHRoLCBfcmVzaXplcldpZHRoKSJ9LF9tYXhNYWluQ29udGVudFdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTozNTAscmVhZE9ubHk6ITB9LF90b3BSaWdodFF1YWRyYW50SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTpwZC5nZXROdW1iZXJJbml0aWFsaXplcigiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQiLAp7ZGVmYXVsdFZhbHVlOklrfSksb2JzZXJ2ZXI6Il90b3BSaWdodFF1YWRyYW50SGVpZ2h0T2JzZXJ2ZXIifSxfbWluVG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjAwLHJlYWRPbmx5OiEwfSxfbWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodChfd2luZG93SGVpZ2h0LCBfcmVzaXplcldpZHRoKSJ9LF9yZXNpemVyV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjMwLHJlYWRPbmx5OiEwfSxfd2luZG93V2lkdGg6TnVtYmVyLF93aW5kb3dIZWlnaHQ6TnVtYmVyLF9kZWJ1Z1dhdGNoZXM6QXJyYXksX2xhdGVzdFNlc3Npb25SdW46T2JqZWN0fSxvYnNlcnZlcnM6WyJfb25BY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lQ2hhbmdlKF9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lKSIsIl9zaXplRGFzaGJvYXJkUmVnaW9ucyhfbGVmdFBhbmVXaWR0aCwgX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQsIF93aW5kb3dXaWR0aCkiLAoiX2dyYXBoUHJvZ3Jlc3NVcGRhdGVkKF9ncmFwaFByb2dyZXNzKSJdLHJlYWR5KCl7dGhpcy5faGFuZGxlV2luZG93UmVzaXplKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsKCk9Pnt0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemUoKX0sITEpO3RoaXMucmVsb2FkKCl9LGxvbmdfcG9sbCgpe2NvbnN0IGI9e3BvczorK3RoaXMuX2xvbmdQb2xsQ291bnR9O2xldCBkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9jb21tIik7ZD12Yy5hZGRQYXJhbXMoZCxiKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGQpLnRoZW4oZj0+e2NvbnN0IGg9Zi50eXBlO2Y9Zi5kYXRhO2lmKCJtZXRhIj09PWgpe3ZhciBrPWYucnVuX2tleSx0PWtbMF0uc3BsaXQoIiwiKSxsPWtbMV0uc3BsaXQoIiwiKTtjb25zdCBtPWtbMl0uc3BsaXQoIiwiKTt2YXIgcD10aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5O3RoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bktleSIsCmspO3RoaXMuc2V0KCJfbGF0ZXN0U2Vzc2lvblJ1biIse2ZlZWRzOnQsZmV0Y2hlczpsLHRhcmdldHM6bX0pO3RoaXMuc2V0KCJfc2Vzc2lvblJ1blNvbGVBY3RpdmUiLCEwKTt2b2lkIDA9PT10aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2tdPyh0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2tdPVtdLHRoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMiLFtdKSk6dGhpcy5zZXQoIl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcyIsdGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1trXSk7dGhpcy5fY3VycmVudFNlc3Npb25SdW5JbmZvPXQ9IkZlZWRzOiAiK3QrIjsgRmV0Y2hlczogIitsKyI7IFRhcmdldHM6ICIrbTt0aGlzLl9zZXNzaW9uUnVuQ291bnRlcnMuaGFzT3duUHJvcGVydHkodCk/dGhpcy5fc2Vzc2lvblJ1bkNvdW50ZXJzW3RdKz0xOnRoaXMuX3Nlc3Npb25SdW5Db3VudGVyc1t0XT0xO3RoaXMuX3Nlc3Npb25SdW5Ub3RhbENvdW50ZXIrKzsKdGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKTt0aGlzLl9jb250aW51ZVRvVHlwZSYmXy5pc0VxdWFsKHAsayl8fCh0aGlzLl9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoaywhMSksdGhpcy5fYW5ub3VuY2VOZXdTZXNzaW9uUnVuKCkpfWVsc2UidGVuc29yIj09PWg/KGs9Zi5kZXZpY2VfbmFtZSxwPWYubm9kZV9uYW1lLHQ9Zi5tYXliZV9iYXNlX2V4cGFuZGVkX25vZGVfbmFtZSx0aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIT1rP3RoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsayk6IXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZ0aGlzLl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSYmKHRoaXMuX2ZvY3VzT25HcmFwaE5vZGUoayx0KSx0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGsrIi8iK3QpKSx0aGlzLnNldCgiX3Nlc3Npb25SdW5Tb2xlQWN0aXZlIiwhMSksbD1wKyI6IitmLm91dHB1dF9zbG90LHRoaXMuc2V0KCJfbGF0ZXN0VGVuc29yRGF0YSIsCntkZXZpY2VOYW1lOmssdGVuc29yTmFtZTpsLG5vZGVOYW1lOnAsbWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZTp0LGRlYnVnT3A6Zi5kZWJ1Z19vcCxkdHlwZTpmLmR0eXBlLHNoYXBlOmYuc2hhcGUsdmFsdWU6Zi52YWx1ZXN9KSx0aGlzLl9tYXliZVVwZGF0ZVRlbnNvclZhbHVlVmlld3MobCxmLmRlYnVnX29wKSx0aGlzLnNldCgiX2J1c3kiLCExKSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCBsb25nLXBvbGxpbmcgcmVzcG9uc2UgdHlwZTogIixoKTtudWxsIT10aGlzLl9jb250aW51ZVRvVHlwZSYmdGhpcy5fcHJvY2Vzc0NvbnRpbnVlVG8oaCxmKTt0aGlzLmxvbmdfcG9sbCgpfSl9LF9wcm9jZXNzQ29udGludWVUbyhiLGQpe3RoaXMuX2NvbnRpbnVlU3RvcD90aGlzLl9jbGVhckNvbnRpbnVlVG8oKToiU2Vzc2lvblJ1biI9PT10aGlzLl9jb250aW51ZVRvVHlwZT90aGlzLl9wcm9jZXNzQ29udGludWVUb1Nlc3Npb25SdW4oIm1ldGEiPT09Yik6IlRlbnNvckNvbmRpdGlvbiI9PT0KdGhpcy5fY29udGludWVUb1R5cGU/dGhpcy5fc3RlcCgpOiJvcCI9PT10aGlzLl9jb250aW51ZVRvVHlwZT90aGlzLl9wcm9jZXNzQ29udGludWVUb09wKCJtZXRhIj09PWIsZCk6bnVsbCE9dGhpcy5fY29udGludWVUb1R5cGUmJiIiIT09dGhpcy5fY29udGludWVUb1R5cGUmJmNvbnNvbGUuZXJyb3IoIkludmFsaWQgX2NvbnRpbnVlVG9UeXBlOiIsdGhpcy5fY29udGludWVUb1R5cGUpfSxfcHJvY2Vzc0NvbnRpbnVlVG9TZXNzaW9uUnVuKGIpe2ImJnRoaXMuc2V0KCJfY29udGludWVUb0NvdW50ZXIiLHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyKzEpO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyPHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0P3RoaXMuX3N0ZXAoKTp0aGlzLl9jbGVhckNvbnRpbnVlVG8oKX0sX3Byb2Nlc3NDb250aW51ZVRvT3AoYixkKXtiJiZ0aGlzLl9hbm5vdW5jZU5ld1Nlc3Npb25SdW4oKTtiPWQuZGV2aWNlX25hbWU7ZD1kLm1heWJlX2Jhc2VfZXhwYW5kZWRfbm9kZV9uYW1lOwpjb25zdCBmPW51bGw9PWQ/bnVsbDpWaS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZCk7YisiLyIrZD09PXRoaXMuX2NvbnRpbnVlVG9UYXJnZXR8fGIrIi8iK2Y9PT10aGlzLl9jb250aW51ZVRvVGFyZ2V0Pyh0aGlzLl9jbGVhckNvbnRpbnVlVG8oKSx0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsZikpOnRoaXMuX3N0ZXAoKX0sX21heWJlVXBkYXRlVGVuc29yVmFsdWVWaWV3cyhiLGQpe2NvbnN0IGY9dGhpcy4kJCgiI3RlbnNvclZhbHVlTXVsdGlWaWV3Iik7aWYobnVsbCE9Zil7dmFyIGg9ITE7Xy5mb3JFYWNoKGYuZ2V0Vmlld3MoKSxrPT57aWYoay50ZW5zb3JOYW1lPT09YiYmay5kZWJ1Z09wPT09ZClyZXR1cm4gaD0hMCwhMX0pO2gmJmYucmVuZGVyVGVuc29yVmFsdWVzKCl9fSxyZWxvYWQoKXtpZighdGhpcy5hbHJlYWR5U3RhcnRlZCl7dGhpcy5zZXQoImFscmVhZHlTdGFydGVkIiwhMCk7dmFyIGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwKIi9kZWJ1Z2dlcl9ncnBjX2hvc3RfcG9ydCIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57MDxkLnBvcnQ/KHRoaXMuJC5pbml0aWFsRGlhbG9nLm9wZW5EaWFsb2coZC5ob3N0LGQucG9ydCksdGhpcy5sb25nX3BvbGwoKSk6dGhpcy4kLmluaXRpYWxEaWFsb2cub3BlbkRpc2FibGVkRGlhbG9nKCl9KX19LF9zaG93U291cmNlQ29kZUNoYW5nZWQoKXt0aGlzLl9zb3VyY2VDb2RlU2hvd24/KHRoaXMuJCQoIiNub2RlLWVudHJpZXMiKS5zdHlsZS5oZWlnaHQ9IjQwJSIsdGhpcy4kLnNvdXJjZUNvZGVWaWV3LnJlbmRlcigpKTp0aGlzLiQkKCIjbm9kZS1lbnRyaWVzIikuc3R5bGUuaGVpZ2h0PSI4MCUifSxfc2hvd1RvYXN0KGIpe3RoaXMuJC50b2FzdC5zZXRBdHRyaWJ1dGUoInRleHQiLGIpO3RoaXMuJC50b2FzdC5vcGVuKCl9LF9hbm5vdW5jZU5ld1Nlc3Npb25SdW4oKXt0aGlzLl9zaG93VG9hc3QoIlNlc3Npb24ucnVuKCkgIyIrdGhpcy5fc2Vzc2lvblJ1blRvdGFsQ291bnRlcisKIiBpcyBzdGFydGluZy4iKX0sX2Rpc3BsYXlHcmFwaChiLGQpe2I9e3J1bl9rZXk6SlNPTi5zdHJpbmdpZnkoYiksZGV2aWNlX25hbWU6ZH07Yj12Yy5hZGRQYXJhbXMoIi9kYXRhL3BsdWdpbi9kZWJ1Z2dlci9kZWJ1Z2dlcl9ncmFwaCIsYik7dGhpcy4kLmxvYWRlci5kYXRhc2V0cz1be25hbWU6Ii9kZWJ1Z2dlcl9ncmFwaCIscGF0aDpifV07dGhpcy4kLmxvYWRlci5zZXQoInNlbGVjdGVkRGF0YXNldCIsMCl9LF9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoYixkKXtkP2NvbnNvbGUubG9nKCJQb2xsaW5nIGZvciBmaXJzdCBHcmFwaERlZiBmb3IgcnVuIGtleToiLGIpOnRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsbnVsbCk7dmFyIGY9e21vZGU6InJldHJpZXZlX2FsbCIscnVuX2tleTpKU09OLnN0cmluZ2lmeShiKX07Y29uc3QgaD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2Y9dmMuYWRkUGFyYW1zKGgsCmYpO2xldCBrPVtdO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZikudGhlbih0PT57aWYoMD09dC5kZXZpY2VfbmFtZXMubGVuZ3RoKWR8fHRoaXMuX3N0ZXAoKSx0aGlzLl9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoYiwhMCk7ZWxzZXt2YXIgbD1udWxsO2Zvcihjb25zdCBwIGluIHQuZ2F0ZWRfZ3JwY190ZW5zb3JzKWlmKHQuZ2F0ZWRfZ3JwY190ZW5zb3JzLmhhc093blByb3BlcnR5KHApKXstMT09PXRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYl0uaW5kZXhPZihwKSYmKHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYl0ucHVzaChwKSx0aGlzLiQuc2Vzc2lvblJ1bnNWaWV3LnVwZGF0ZU51bURldmljZXModGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1tiXS5sZW5ndGgpKTt0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzIix0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2JdLnNsaWNlKCkpO2w9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNbdGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMubGVuZ3RoLQoxXTtjb25zdCBtPXQuZ2F0ZWRfZ3JwY190ZW5zb3JzW3BdO2ZvcihsZXQgbj0wO248bS5sZW5ndGg7KytuKWsucHVzaCh7ZGV2aWNlX25hbWU6cCxub2RlX25hbWU6bVtuXVswXSxvcF90eXBlOm1bbl1bMV0sb3V0cHV0X3Nsb3Q6bVtuXVsyXSxkZWJ1Z19vcDptW25dWzNdfSl9bnVsbCE9bCYmKHRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsbCksdD1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiKSksbnVsbCE9dCYmdC5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIixsKSk7Vmkuc29ydEFuZEJhc2VFeHBhbmREZWJ1Z1dhdGNoZXMoayk7dGhpcy5zZXQoIl9kZWJ1Z1dhdGNoZXMiLGspO3RoaXMuJC5zb3VyY2VDb2RlVmlldy5yZW5kZXIoayl9fSl9LF9jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpe3JldHVybihiLGQpPT57ZD1kPyJicmVhayI6ImRpc2FibGUiO3RoaXMuX3JlcXVlc3RCcmVha3BvaW50U3RhdGVDaGFuZ2UoVmkuZ2V0Q2xlYW5Ob2RlTmFtZShiLmRldmljZV9uYW1lKwoiLyIrYi5ub2RlX25hbWUpLGIub3V0cHV0X3Nsb3QsYi5kZWJ1Z19vcCxkKX19LF9mb2N1c09uR3JhcGhOb2RlKGIsZCl7bnVsbCE9YiYmdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSE9PWImJnRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsYik7dGhpcy5fc2V0VG9wUmlnaHRSdW50aW1lR3JhcGhzVG9BY3RpdmUoKTtjb25zdCBmPXRoaXMuJCQoIiNncmFwaCIpO2lmKGYuc2VsZWN0ZWROb2RlPT09ZClmLnBhblRvTm9kZShkKTtlbHNle2NvbnN0IGg9Zi5nZXQoInJlbmRlckhpZXJhcmNoeSIpLmhpZXJhcmNoeS5nZXROb2RlTWFwKCk7bnVsbD09aFtkXSYmKGQ9VmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKTtudWxsIT1oW2RdJiZmLnNldCgic2VsZWN0ZWROb2RlIixkKX10aGlzLnNldCgiX2hpZ2hsaWdodE5vZGVOYW1lIixiKyIvIitkKX0sX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpe3JldHVybihiLGQsZik9Pnt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJgohMCE9PWYmJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKTt0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGIsZCk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixiKyIvIitkKX19LF9jcmVhdGVGZWVkRmV0Y2hUYXJnZXRDbGlja2VkSGFuZGxlcigpe3JldHVybiBiPT57bGV0IGQ9YjstMSE9PWQuaW5kZXhPZigiOiIpJiYoZD1kLnNsaWNlKDAsZC5pbmRleE9mKCI6IikpKTtiPV8uZmluZCh0aGlzLl9kZWJ1Z1dhdGNoZXMsZj0+Zi5ub2RlX25hbWU9PT1kfHwwPT09Zi5ub2RlX25hbWUuaW5kZXhPZihkKSYmIigiPT09Zi5ub2RlX25hbWVbZC5sZW5ndGhdKTtudWxsPT1iP3RoaXMuX3Nob3dUb2FzdCgiTm9kZSAnIitkKyInIGlzIG5vdCBpbiB0aGUgcnVudGltZSBncmFwaCBvZiB0aGUgY3VycmVudCBTZXNzaW9uLnJ1biBvciBkb2VzIG5vdCBoYXZlIGEgZGVidWcgb3AgYXR0YWNoZWQuIik6dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShiLmRldmljZV9uYW1lLApkKX19LF9jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpe3JldHVybiBiPT57dGhpcy5fc2V0VG9wUmlnaHRUZW5zb3JWYWx1ZXNUb0FjdGl2ZSgpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLiQkKCIjdGVuc29yVmFsdWVNdWx0aVZpZXciKS5hZGRWaWV3KHt2aWV3SWQ6dGhpcy5fY3JlYXRlVGVuc29yVmlld0lkKCksZGV2aWNlTmFtZTpiLmRldmljZU5hbWUsdGVuc29yTmFtZTpiLnRlbnNvck5hbWUsbm9kZU5hbWU6Yi5ub2RlTmFtZSxtYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lOmIubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxkZWJ1Z09wOmIuZGVidWdPcCxkdHlwZTpiLmR0eXBlLHNoYXBlOmIuc2hhcGUsc2xpY2luZzpWaS5nZXREZWZhdWx0U2xpY2luZyhiLnNoYXBlKSx0aW1lSW5kaWNlczoiLTEifSl9LDEwKX19LF9jcmVhdGVUZW5zb3JWaWV3SWQoKXtjb25zdCBiPSJkZWJ1Z2dlci10ZW5zb3Itdmlldy0iK3RoaXMuX3RlbnNvclZpZXdJZENvdW50ZXI7dGhpcy5fdGVuc29yVmlld0lkQ291bnRlcisrOwpyZXR1cm4gYn0sX2NyZWF0ZU5vZGVDb250ZXh0TWVudUl0ZW1zKCl7cmV0dXJuW3t0aXRsZTooKT0+IkV4cGFuZCBhbmQgaGlnaGxpZ2h0IixhY3Rpb246Yj0+e2NvbnN0IGQ9VmkuZ2V0Q2xlYW5Ob2RlTmFtZShiLm5vZGUubmFtZSk7Yj10aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lKyIvIitiLm5vZGUubmFtZTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGIpO3RoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLGIpO3RoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixWaS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZCkpfX0se3RpdGxlOigpPT4iQWRkIGJyZWFrcG9pbnQiLGFjdGlvbjpiPT57Y29uc3QgZD1WaS5nZXRDbGVhbk5vZGVOYW1lKGIubm9kZS5uYW1lKTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZSIsdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSsKIi8iK2Iubm9kZS5uYW1lKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKX19LHt0aXRsZTooKT0+IkNvbnRpbnVlIHRvIixhY3Rpb246Yj0+ey0xIT09WyJfQXJnIiwiX1JldHZhbCJdLmluZGV4T2YoYi5ub2RlLm9wKT90aGlzLl9zaG93VG9hc3QoJ0Nhbm5vdCBjb250aW51ZSB0byBub2RlICInK2Iubm9kZS5uYW1lKyciLCBkdWUgdG8gb3AgdHlwZSAiJytiLm5vZGUub3ArJyIuJyk6dGhpcy5fY29udGludWVUb05vZGUodGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSxiLm5vZGUubmFtZSl9fV19LF9jcmVhdGVHZXRIZWFsdGhQaWxsKCl7cmV0dXJuKGIsZCxmLGgpPT57dmFyIGs9e3dhdGNoX2tleTpiLHRpbWVfaW5kaWNlczoiLTEiLG1hcHBpbmc6ImhlYWx0aC1waWxsIn07Y29uc3QgdD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLAoiL3RlbnNvcl9kYXRhIik7az12Yy5hZGRQYXJhbXModCxrKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGspLnRoZW4obD0+e2w9bC50ZW5zb3JfZGF0YVswXTtoKGwpO3RoaXMuX2NvbmRpdGlvbmFsSGVhbHRoUGlsbFN0b3AoYixkLGYsbCl9KX19LF9jb25kaXRpb25hbEhlYWx0aFBpbGxTdG9wKGIsZCxmLGgpe2lmKCJUZW5zb3JDb25kaXRpb24iPT09dGhpcy5fY29udGludWVUb1R5cGUmJlZpLmNoZWNrSGVhbHRoUGlsbEFnYWluc3RUZW5zb3JDb25kaXRpb25LZXkodGhpcy5fY29udGludWVUb1RhcmdldCxoLHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0KSl7dGhpcy5zZXQoIl9jb250aW51ZVN0b3AiLCEwKTtoPVZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihmKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsaCk7dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShkLGYpO2NvbnN0IGs9ZCsiLyIrZjt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLAprKTtzZXRUaW1lb3V0KCgpPT57dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsbnVsbCk7dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsayl9LDEwMCk7dGhpcy5fc2hvd1RvYXN0KCdUZW5zb3IgY29uZGl0aW9uICInK3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQrJyIgaXMgbWV0IGJ5IHdhdGNoIGtleTogIicrYisnIi5cblN0b3BwaW5nIGNvbnRpbnVhdGlvbi4nKX19LF9jb250aW51ZVRvTm9kZShiLGQpe2NvbnN0IGY9VmkuZ2V0Q2xlYW5Ob2RlTmFtZShkKTtiPWIrIi8iK2Q7dGhpcy5fcmVxdWVzdEJyZWFrcG9pbnRTdGF0ZUNoYW5nZShmLDAsIkRlYnVnSWRlbnRpdHkiLCJicmVhayIpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lIixiKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGYpKTt0aGlzLl9zZXRDb250aW51ZVRvKCJvcCIsYik7CnRoaXMuJC5jb250aW51ZURpYWxvZy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApO3RoaXMuX3N0ZXAoKX0sX2NyZWF0ZUNvbnRpbnVlVG9Ob2RlSGFuZGxlcigpe3JldHVybihiLGQpPT57dGhpcy5fY29udGludWVUb05vZGUoYixkKX19LF9vbkFjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWVDaGFuZ2UoYil7Y29uc3QgZD1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSIpKTtpZigwPHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmxlbmd0aCl7bGV0IGY7Zj1iKygiIChkZXZpY2UgIisodGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMuaW5kZXhPZihiKSsxKSsiIG9mICIrdGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMubGVuZ3RoKyIpIik7dGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJm51bGwhPWQmJihkLnRleHRDb250ZW50PWYpfWVsc2UgdGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJgpudWxsIT1kJiYoZC50ZXh0Q29udGVudD0iV2FpdGluZyBmb3IgZGV2aWNlLi4uIik7bnVsbCE9YiYmdGhpcy5fZGlzcGxheUdyYXBoKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXksYil9LF9zdGVwKCl7aWYobnVsbCE9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleSl7dGhpcy5zZXQoIl9idXN5IiwhMCk7dmFyIGI9e21vZGU6InJldHJpZXZlX2RldmljZV9uYW1lcyIscnVuX2tleTpKU09OLnN0cmluZ2lmeSh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5KX0sZD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2I9dmMuYWRkUGFyYW1zKGQsYik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGY9PntsZXQgaD0hMTtmb3IobGV0IGs9MDtrPGYuZGV2aWNlX25hbWVzLmxlbmd0aDsrK2spaWYoLTE9PT10aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5pbmRleE9mKGYuZGV2aWNlX25hbWVzW2tdKSl7aD0hMDticmVha31mPQp2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvYWNrIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKCgpPT57aCYmdGhpcy5fcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXksITEpfSl9KX19LF9jcmVhdGVTZXNzaW9uUnVuR28oKXtyZXR1cm4gYj0+e3RoaXMuX3NldENvbnRpbnVlVG8oIlNlc3Npb25SdW4iLHRoaXMuX2N1cnJlbnRTZXNzaW9uUnVuSW5mbyxiKTt0aGlzLl9zdGVwKCl9fSxfY3JlYXRlVGVuc29yQ29uZGl0aW9uR28oKXtyZXR1cm4oYixkKT0+e3RoaXMuX3NldENvbnRpbnVlVG8oIlRlbnNvckNvbmRpdGlvbiIsYixkKTt0aGlzLiQudGVuc29yRGF0YVN1bW1hcnkuZW5hYmxlSGVhbHRoUGlsbHMoKTt0aGlzLl9zdGVwKCl9fSxfY3JlYXRlRm9yY2VDb250aW51YXRpb25TdG9wKCl7cmV0dXJuKCk9Pnt0aGlzLl9zaG93VG9hc3QoJ0NvbnRpbnVhdGlvbiBvZiB0eXBlICInK3RoaXMuX2NvbnRpbnVlVG9UeXBlKwonIiB3YXMgaW50ZXJydXB0ZWQgYnkgdXNlci4nKTt0aGlzLnNldCgiX2NvbnRpbnVlU3RvcCIsITApfX0sX3NldENvbnRpbnVlVG8oYixkLGY9LTEpe3RoaXMuX2NvbnRpbnVlVG9UeXBlPWI7dGhpcy5fY29udGludWVUb1RhcmdldD1kO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0PWY7dGhpcy5fY29udGludWVUb0NvdW50ZXI9MDt0aGlzLl9jb250aW51ZVN0b3A9ITF9LF9jbGVhckNvbnRpbnVlVG8oKXt0aGlzLiQuY29udGludWVEaWFsb2cubm90aWZ5Q29udGludWF0aW9uU3RvcCgpO3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQ9dGhpcy5fY29udGludWVUb1R5cGU9IiI7dGhpcy5fY29udGludWVUb0NvdW50ZXJUYXJnZXQ9LTE7dGhpcy5fY29udGludWVUb0NvdW50ZXI9MDt0aGlzLl9jb250aW51ZVN0b3A9ITE7dGhpcy5zZXQoIl9idXN5IiwhMSl9LF9jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKXtyZXR1cm4oYixkKT0+e3RoaXMuX3NldENvbnRpbnVlVG8oIm9wIixiKyIvIisKZCk7dGhpcy5fc3RlcCgpO3RoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiZ0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGIsZCk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixiKyIvIitkKX19LF90b3BSaWdodFNlbGVjdGVkQ2hhbmdlZChiKXtiPXRoaXMuX3RvcFJpZ2h0VGFic1tiXS5pZDt0aGlzLnNldCgiX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlIiwidGFiLXJ1bnRpbWUtZ3JhcGhzIj09PWIpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsInRhYi10ZW5zb3ItdmFsdWVzIj09PWIpfSxfc2V0VG9wUmlnaHRSdW50aW1lR3JhcGhzVG9BY3RpdmUoKXt0aGlzLnNldCgiX3RvcFJpZ2h0U2VsZWN0ZWQiLCIwIik7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsITApO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsITEpfSxfc2V0VG9wUmlnaHRUZW5zb3JWYWx1ZXNUb0FjdGl2ZSgpe3RoaXMuc2V0KCJfdG9wUmlnaHRTZWxlY3RlZCIsCiIxIik7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsITEpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsITApfSxfcmVxdWVzdEJyZWFrcG9pbnRTdGF0ZUNoYW5nZShiLGQsZixoKXtiPXttb2RlOiJzZXRfc3RhdGUiLG5vZGVfbmFtZTpiLG91dHB1dF9zbG90OmQsZGVidWdfb3A6ZixzdGF0ZTpofTtkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9nYXRlZF9ncnBjIik7Yj12Yy5hZGRQYXJhbXMoZCxiKTt0aGlzLnNldCgiX2J1c3kiLCEwKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oaz0+e3RoaXMuc2V0KCJfYnVzeSIsITEpO2NvbnNvbGUubG9nKCJCcmVha3BvaW50IHNldF9zdGF0ZSByZXNwb25zZTogIixrKX0pfSxfZ3JhcGhQcm9ncmVzc1VwZGF0ZWQoYil7Y29uc3QgZD10aGlzLiQkKCIjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciIpO251bGw9PXRoaXMuX2xhdGVzdFNlc3Npb25SdW4/CihkLnNldEF0dHJpYnV0ZSgidmFsdWUiLDApLHRoaXMuc2V0KCJfYnVzeSIsITEpKTooZC5zZXRBdHRyaWJ1dGUoInZhbHVlIixiLnZhbHVlKSx0aGlzLnNldCgiX2J1c3kiLDEwMD5iLnZhbHVlKSl9LF9oYW5kbGVXaW5kb3dSZXNpemUoKXt0aGlzLnNldCgiX3dpbmRvd1dpZHRoIixIaygpKTt0aGlzLnNldCgiX3dpbmRvd0hlaWdodCIsWmkoKSk7dGhpcy5fc2l6ZURhc2hib2FyZFJlZ2lvbnModGhpcy5fbGVmdFBhbmVXaWR0aCx0aGlzLl90b3BSaWdodFF1YWRyYW50SGVpZ2h0LHRoaXMuX3dpbmRvd1dpZHRoKX0sX2NvbXB1dGVNYXhsZWZ0UGFuZVdpZHRoKGIsZCxmKXtyZXR1cm4gYi1kLWZ9LF9jb21wdXRlTWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodChiLGQpe3JldHVybiBiLWQtNzB9LF9zaXplRGFzaGJvYXJkUmVnaW9ucyhiLGQsZil7dGhpcy4kJCgiI2xlZnQtcGFuZSIpLnN0eWxlLndpZHRoPWIrInB4IjtiPWYtYi10aGlzLl9yZXNpemVyV2lkdGgtODt0aGlzLiQkKCIjY2VudGVyLWNvbnRlbnQiKS5zdHlsZS53aWR0aD0KYisicHgiO2I9ZC10aGlzLl9yZXNpemVyV2lkdGg7dGhpcy4kJCgiI3RvcC1yaWdodC1xdWFkcmFudCIpLnN0eWxlLmhlaWdodD1iKyJweCI7dGhpcy4kJCgiI3RlbnNvci1kYXRhIikuc3R5bGUudG9wPWQrInB4In0sX2xlZnRQYW5lV2lkdGhPYnNlcnZlcjpwZC5nZXROdW1iZXJPYnNlcnZlcigiX2xlZnRQYW5lV2lkdGgiLHtkZWZhdWx0VmFsdWU6NDUwfSksX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHRPYnNlcnZlcjpwZC5nZXROdW1iZXJPYnNlcnZlcigiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQiLHtkZWZhdWx0VmFsdWU6SWt9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLW1hdGVyaWFsL3BhcGVyLW1hdGVyaWFsLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLW1hdGVyaWFsIixwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZToxfSxhbmltYXRlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkL3RmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQiLHByb3BlcnRpZXM6e3JlbmRlckhpZXJhcmNoeTpPYmplY3QsZGVidWdnZXJOdW1lcmljQWxlcnRzOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sbm9kZU5hbWVzVG9IZWFsdGhQaWxsczpPYmplY3QsaGVhbHRoUGlsbFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxlY3RlZE5vZGVJbmNsdWRlOnt0eXBlOk51bWJlcixub3RpZnk6ITB9LGFyZUhlYWx0aFBpbGxzTG9hZGluZzpCb29sZWFuLGhlYWx0aFBpbGxFbnRyaWVzOnt0eXBlOkFycmF5LHZhbHVlOnRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzLHJlYWRPbmx5OiEwfSxoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlOnt0eXBlOkFycmF5LApjb21wdXRlZDoiX2NvbXB1dGVIZWFsdGhQaWxsRm9yTm9kZShub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4LCBzZWxlY3RlZE5vZGUsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIGFyZUhlYWx0aFBpbGxzTG9hZGluZykifSxhbGxTdGVwc01vZGVFbmFibGVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfYmlnZ2VzdFN0ZXBFdmVyU2Vlbjp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlQmlnZ2VzdFN0ZXBFdmVyU2Vlbihub2RlTmFtZXNUb0hlYWx0aFBpbGxzKSJ9LF9tYXhTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFN0ZXBJbmRleChub2RlTmFtZXNUb0hlYWx0aFBpbGxzKSJ9LF9jdXJyZW50U3RlcERpc3BsYXlWYWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXBEaXNwbGF5VmFsdWUobm9kZU5hbWVzVG9IZWFsdGhQaWxscywgaGVhbHRoUGlsbFN0ZXBJbmRleCwgYWxsU3RlcHNNb2RlRW5hYmxlZCwgc3BlY2lmaWNIZWFsdGhQaWxsU3RlcCwgYXJlSGVhbHRoUGlsbHNMb2FkaW5nKSJ9fSwKb2JzZXJ2ZXJzOlsiX3VwZGF0ZUFsZXJ0c0xpc3QoZGVidWdnZXJOdW1lcmljQWxlcnRzKSJdLHJlYWR5OmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5Db250YWluZXIiKSxkPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRmLWRhc2hib2FyZC1sYXlvdXQgLnNjcm9sbGJhciIpO2ImJmQmJihiLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGQuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpfSxfaGVhbHRoUGlsbHNBdmFpbGFibGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYiYmZH0sX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZzpmdW5jdGlvbihiLGQpe3JldHVybiBiP2JbZF0udG9GaXhlZCgwKToiIn0sX2NvbXB1dGVIZWFsdGhQaWxsRm9yTm9kZTpmdW5jdGlvbihiLGQsZixoLGspe2lmKGt8fCFmKXJldHVybiBudWxsO2I9YltmXTtyZXR1cm4gYj8oZD1iW2g/MDpkXSk/ZC52YWx1ZS5zbGljZSgyLDgpOm51bGw6bnVsbH0sX2NvbXB1dGVDdXJyZW50U3RlcERpc3BsYXlWYWx1ZTpmdW5jdGlvbihiLApkLGYsaCxrKXtpZihmKXJldHVybiBoLnRvRml4ZWQoMCk7aWYoaylyZXR1cm4gMDtmb3IobGV0IHQgaW4gYilyZXR1cm4gYlt0XVtkXS5zdGVwLnRvRml4ZWQoMCk7cmV0dXJuIDB9LF9jb21wdXRlQmlnZ2VzdFN0ZXBFdmVyU2VlbjpmdW5jdGlvbihiKXtmb3IobGV0IGQgaW4gYilyZXR1cm4gYj1iW2RdLE1hdGgubWF4KHRoaXMuX2JpZ2dlc3RTdGVwRXZlclNlZW4sYltiLmxlbmd0aC0xXS5zdGVwKTtyZXR1cm4gdGhpcy5fYmlnZ2VzdFN0ZXBFdmVyU2Vlbnx8MH0sX2NvbXB1dGVNYXhTdGVwSW5kZXg6ZnVuY3Rpb24oYil7Zm9yKGxldCBkIGluIGIpcmV0dXJuIGJbZF0ubGVuZ3RoLTE7cmV0dXJuIDB9LF9oYXNEZWJ1Z2dlck51bWVyaWNBbGVydHM6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIubGVuZ3RofSxfdXBkYXRlQWxlcnRzTGlzdDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLiQkKCIjbnVtZXJpYy1hbGVydHMtYm9keSIpO2lmKGQpe2QuaW5uZXJIVE1MPSIiO2Zvcih2YXIgZj0KMDtmPGIubGVuZ3RoO2YrKyl7dmFyIGg9YltmXSxrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO3QuaW5uZXJIVE1MPXRmLmdyYXBoLnV0aWwuY29tcHV0ZUh1bWFuRnJpZW5kbHlUaW1lKGguZmlyc3RfdGltZXN0YW1wKTt0LmNsYXNzTGlzdC5hZGQoImZpcnN0LW9mZmVuc2UtdGQiKTtrLmFwcGVuZENoaWxkKHQpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTt0LmNsYXNzTGlzdC5hZGQoInRlbnNvci1kZXZpY2UtdGQiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoInRlbnNvci1zZWN0aW9uLXdpdGhpbi10YWJsZSIpO2wuaW5uZXJIVE1MPWgudGVuc29yX25hbWU7dGhpcy5fYWRkT3BFeHBhbnNpb25MaXN0ZW5lcihsLGgudGVuc29yX25hbWUpO3QuYXBwZW5kQ2hpbGQobCk7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoImRldmljZS1zZWN0aW9uLXdpdGhpbi10YWJsZSIpOwpsLmlubmVySFRNTD0iKCIraC5kZXZpY2VfbmFtZSsiKSI7dC5hcHBlbmRDaGlsZChsKTtrLmFwcGVuZENoaWxkKHQpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc0xpc3QuYWRkKCJtaW5pLWhlYWx0aC1waWxsIik7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2wuY2xhc3NMaXN0LmFkZCgibWluaS1oZWFsdGgtcGlsbC10ZCIpO2wuYXBwZW5kQ2hpbGQodCk7ay5hcHBlbmRDaGlsZChsKTtoLm5lZ19pbmZfZXZlbnRfY291bnQmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGwuY2xhc3NMaXN0LmFkZCgibmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGwuaW5uZXJIVE1MPWgubmVnX2luZl9ldmVudF9jb3VudCxsLnNldEF0dHJpYnV0ZSgidGl0bGUiLGgubmVnX2luZl9ldmVudF9jb3VudCsiIGV2ZW50cyB3aXRoIC1cdTIyMWUiKSx0LmFwcGVuZENoaWxkKGwpKTtoLnBvc19pbmZfZXZlbnRfY291bnQmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLApsLmNsYXNzTGlzdC5hZGQoInBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24iKSxsLmlubmVySFRNTD1oLnBvc19pbmZfZXZlbnRfY291bnQsbC5zZXRBdHRyaWJ1dGUoInRpdGxlIixoLnBvc19pbmZfZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCArXHUyMjFlIiksdC5hcHBlbmRDaGlsZChsKSk7aC5uYW5fZXZlbnRfY291bnQmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGwuY2xhc3NMaXN0LmFkZCgibmFuLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGwuaW5uZXJIVE1MPWgubmFuX2V2ZW50X2NvdW50LGwuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaC5uYW5fZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCBOYU4iKSx0LmFwcGVuZENoaWxkKGwpKTtQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZChrKX19fSxfYWRkT3BFeHBhbnNpb25MaXN0ZW5lcjpmdW5jdGlvbihiLGQpe2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dmFyIGY9dGYuZ3JhcGgucmVuZGVyLmV4cGFuZFVudGlsTm9kZUlzU2hvd24odGhpcy5yZW5kZXJIaWVyYXJjaHksCmQpLGgsaz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0Zi1ncmFwaC1pbmZvI2dyYXBoLWluZm8iKTtrJiYoaD1rLnNjcm9sbEhlaWdodC1rLnNjcm9sbFRvcCk7dmFyIHQ9dGhpcy5zZWxlY3RlZE5vZGU7dGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsZik7Zj0oKT0+e2suc2Nyb2xsVG9wPWsuc2Nyb2xsSGVpZ2h0LWh9O2smJih0P2YoKTp3aW5kb3cuc2V0VGltZW91dChmLDIwKSl9KX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1zY3JvbGwtdGFyZ2V0LWJlaGF2aW9yL2lyb24tc2Nyb2xsLXRhcmdldC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzY3JvbGxUYXJnZXQ6e3R5cGU6SFRNTEVsZW1lbnQsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmYXVsdFNjcm9sbFRhcmdldH19fSxvYnNlcnZlcnM6WyJfc2Nyb2xsVGFyZ2V0Q2hhbmdlZChzY3JvbGxUYXJnZXQsIGlzQXR0YWNoZWQpIl0sX3Nob3VsZEhhdmVMaXN0ZW5lcjohMCxfc2Nyb2xsVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuX29sZFNjcm9sbFRhcmdldCYmKHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKCExLHRoaXMuX29sZFNjcm9sbFRhcmdldCksdGhpcy5fb2xkU2Nyb2xsVGFyZ2V0PW51bGwpO2QmJigiZG9jdW1lbnQiPT09Yj90aGlzLnNjcm9sbFRhcmdldD10aGlzLl9kb2M6InN0cmluZyI9PT10eXBlb2YgYj90aGlzLnNjcm9sbFRhcmdldD0oZD10aGlzLmRvbUhvc3QpJiZkLiQ/ZC4kW2JdOlBvbHltZXIuZG9tKHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvcigiIyIrCmIpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuX29sZFNjcm9sbFRhcmdldD1iLHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKHRoaXMuX3Nob3VsZEhhdmVMaXN0ZW5lcixiKSkpfSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpe30sZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuX2RvY30sZ2V0IF9kb2MoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudH0sZ2V0IF9zY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5wYWdlWU9mZnNldDp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A6MH0sZ2V0IF9zY3JvbGxMZWZ0KCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cucGFnZVhPZmZzZXQ6dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdDoKMH0sc2V0IF9zY3JvbGxUb3AoYil7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKHdpbmRvdy5wYWdlWE9mZnNldCxiKTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9Yil9LHNldCBfc2Nyb2xsTGVmdChiKXt0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuc2Nyb2xsVG8oYix3aW5kb3cucGFnZVlPZmZzZXQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9Yil9LHNjcm9sbDpmdW5jdGlvbihiLGQpe3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5zY3JvbGxUbyhiLGQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9Yix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9ZCl9LGdldCBfc2Nyb2xsVGFyZ2V0V2lkdGgoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpPwp0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuaW5uZXJXaWR0aDp0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aDowfSxnZXQgX3Njcm9sbFRhcmdldEhlaWdodCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodDowfSxfaXNWYWxpZFNjcm9sbFRhcmdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fSxfdG9nZ2xlU2Nyb2xsTGlzdGVuZXI6ZnVuY3Rpb24oYixkKXtkPWQ9PT10aGlzLl9kb2M/d2luZG93OmQ7Yj90aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fCh0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXI9dGhpcy5fc2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpLGQuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIpKToKdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyJiYoZC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlciksdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyPW51bGwpfSx0b2dnbGVTY3JvbGxMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLl9zaG91bGRIYXZlTGlzdGVuZXI9Yjt0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcihiLHRoaXMuc2Nyb2xsVGFyZ2V0KX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbGlzdC9pcm9uLWxpc3QuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGQ9YiYmODw9YlsxXSxmPW51bGwhPVBvbHltZXIuZmx1c2gsaD1mP1BvbHltZXIuQXN5bmMuYW5pbWF0aW9uRnJhbWU6MCxrPWY/UG9seW1lci5Bc3luYy5pZGxlUGVyaW9kOjEsdD1mP1BvbHltZXIuQXN5bmMubWljcm9UYXNrOjI7UG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3J8fChQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcj17fSk7UG9seW1lcih7aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7aXRlbXM6e3R5cGU6QXJyYXl9LGFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LGluZGV4QXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbmRleCJ9LHNlbGVjdGVkQXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJzZWxlY3RlZCJ9LGdyaWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsCm9ic2VydmVyOiJfZ3JpZENoYW5nZWQifSxzZWxlY3Rpb25FbmFibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3RlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG11bHRpU2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH19LG9ic2VydmVyczpbIl9pdGVtc0NoYW5nZWQoaXRlbXMuKikiLCJfc2VsZWN0aW9uRW5hYmxlZENoYW5nZWQoc2VsZWN0aW9uRW5hYmxlZCkiLCJfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkKG11bHRpU2VsZWN0aW9uKSIsIl9zZXRPdmVyZmxvdyhzY3JvbGxUYXJnZXQsIHNjcm9sbE9mZnNldCkiXSxiZWhhdmlvcnM6W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JdLApfcmF0aW86LjUsX3Njcm9sbGVyUGFkZGluZ1RvcDowLF9zY3JvbGxQb3NpdGlvbjowLF9waHlzaWNhbFNpemU6MCxfcGh5c2ljYWxBdmVyYWdlOjAsX3BoeXNpY2FsQXZlcmFnZUNvdW50OjAsX3BoeXNpY2FsVG9wOjAsX3ZpcnR1YWxDb3VudDowLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCxfcGh5c2ljYWxJdGVtczpudWxsLF9waHlzaWNhbFNpemVzOm51bGwsX2ZpcnN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfbGFzdFZpc2libGVJbmRleFZhbDpudWxsLF9tYXhQYWdlczoyLF9mb2N1c2VkSXRlbTpudWxsLF9mb2N1c2VkVmlydHVhbEluZGV4Oi0xLF9mb2N1c2VkUGh5c2ljYWxJbmRleDotMSxfb2Zmc2NyZWVuRm9jdXNlZEl0ZW06bnVsbCxfZm9jdXNCYWNrZmlsbEl0ZW06bnVsbCxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLF90ZW1wbGF0ZUNvc3Q6MCwKX3BhcmVudE1vZGVsOiEwLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4odGhpcy5ncmlkP3RoaXMuX3BoeXNpY2FsUm93cyp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplKS10aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF9pdGVtc1BhcmVudCgpe3JldHVybiBQb2x5bWVyLmRvbShQb2x5bWVyLmRvbSh0aGlzLl91c2VyVGVtcGxhdGUpLnBhcmVudE5vZGUpfSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fdmlld3BvcnRIZWlnaHQrdGhpcy5fc2Nyb2xsT2Zmc2V0fSwKZ2V0IF9tYXhWaXJ0dWFsU3RhcnQoKXt2YXIgbD10aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KHRoaXMuX3ZpcnR1YWxDb3VudCk7cmV0dXJuIE1hdGgubWF4KDAsbC10aGlzLl9waHlzaWNhbENvdW50KX0sc2V0IF92aXJ0dWFsU3RhcnQobCl7bD10aGlzLl9jbGFtcChsLDAsdGhpcy5fbWF4VmlydHVhbFN0YXJ0KTt0aGlzLmdyaWQmJihsLT1sJXRoaXMuX2l0ZW1zUGVyUm93KTt0aGlzLl92aXJ0dWFsU3RhcnRWYWw9bH0sZ2V0IF92aXJ0dWFsU3RhcnQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0VmFsfHwwfSxzZXQgX3BoeXNpY2FsU3RhcnQobCl7bCU9dGhpcy5fcGh5c2ljYWxDb3VudDswPmwmJihsPXRoaXMuX3BoeXNpY2FsQ291bnQrbCk7dGhpcy5ncmlkJiYobC09bCV0aGlzLl9pdGVtc1BlclJvdyk7dGhpcy5fcGh5c2ljYWxTdGFydFZhbD1sfSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sZ2V0IF9waHlzaWNhbEVuZCgpe3JldHVybih0aGlzLl9waHlzaWNhbFN0YXJ0Kwp0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LHNldCBfcGh5c2ljYWxDb3VudChsKXt0aGlzLl9waHlzaWNhbENvdW50VmFsPWx9LGdldCBfcGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsfHwwfSxnZXQgX29wdFBoeXNpY2FsU2l6ZSgpe3JldHVybiAwPT09dGhpcy5fdmlld3BvcnRIZWlnaHQ/SW5maW5pdHk6dGhpcy5fdmlld3BvcnRIZWlnaHQqdGhpcy5fbWF4UGFnZXN9LGdldCBfaXNWaXNpYmxlKCl7cmV0dXJuISghdGhpcy5vZmZzZXRXaWR0aCYmIXRoaXMub2Zmc2V0SGVpZ2h0KX0sZ2V0IGZpcnN0VmlzaWJsZUluZGV4KCl7dmFyIGw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09bCl7dmFyIHA9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPWw9dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKG0sbil7cCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG0pOwppZihwPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiB0aGlzLmdyaWQ/bi1uJXRoaXMuX2l0ZW1zUGVyUm93Om47aWYodGhpcy5ncmlkJiZ0aGlzLl92aXJ0dWFsQ291bnQtMT09PW4pcmV0dXJuIG4tbiV0aGlzLl9pdGVtc1BlclJvd30pfHwwfXJldHVybiBsfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe3ZhciBsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09bCl7aWYodGhpcy5ncmlkKWw9TWF0aC5taW4odGhpcy5fdmlydHVhbENvdW50LHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgrdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdy0xKTtlbHNle3ZhciBwPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSxuKXtwPHRoaXMuX3Njcm9sbEJvdHRvbSYmKGw9bik7cCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG0pfSl9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1sfXJldHVybiBsfSwKZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXN9LGdldCBfdmlydHVhbFJvd0NvdW50KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aXJ0dWFsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxnZXQgX2VzdFJvd3NJblZpZXcoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpZXdwb3J0SGVpZ2h0L3RoaXMuX3Jvd0hlaWdodCl9LGdldCBfcGh5c2ljYWxSb3dzKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9zY3JvbGxPZmZzZXQoKXtyZXR1cm4gdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3RoaXMuc2Nyb2xsT2Zmc2V0fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2RpZEZvY3VzLmJpbmQodGhpcyksITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsaCk7dGhpcy5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLAoiX3Jlc2l6ZUhhbmRsZXIiKTt0aGlzLmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIik7dGhpcy51bmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LF9zZXRPdmVyZmxvdzpmdW5jdGlvbihsKXt0aGlzLnN0eWxlLndlYmtpdE92ZXJmbG93U2Nyb2xsaW5nPWw9PT10aGlzPyJ0b3VjaCI6IiI7dGhpcy5zdHlsZS5vdmVyZmxvd1k9bD09PXRoaXM/ImF1dG8iOiIiO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt2YXIgbD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9CnRoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcz8wOnBhcnNlSW50KGxbInBhZGRpbmctdG9wIl0sMTApO3RoaXMuX2lzUlRMPSJydGwiPT09bC5kaXJlY3Rpb247dGhpcy5fdmlld3BvcnRXaWR0aD10aGlzLiQuaXRlbXMub2Zmc2V0V2lkdGg7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuZ3JpZCYmdGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKX0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgbD1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxwPWwtdGhpcy5fc2Nyb2xsUG9zaXRpb24sbT0wPD1wO3RoaXMuX3Njcm9sbFBvc2l0aW9uPWw7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO01hdGguYWJzKHApPnRoaXMuX3BoeXNpY2FsU2l6ZSYmMDx0aGlzLl9waHlzaWNhbFNpemU/KHAtPXRoaXMuX3Njcm9sbE9mZnNldCxtPU1hdGgucm91bmQocC8KdGhpcy5fcGh5c2ljYWxBdmVyYWdlKSp0aGlzLl9pdGVtc1BlclJvdyx0aGlzLl92aXJ0dWFsU3RhcnQrPW0sdGhpcy5fcGh5c2ljYWxTdGFydCs9bSx0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcGh5c2ljYWxBdmVyYWdlLHRoaXMuX3VwZGF0ZSgpKTowPHRoaXMuX3BoeXNpY2FsQ291bnQmJihsPXRoaXMuX2dldFJldXNhYmxlcyhtKSxtPyh0aGlzLl9waHlzaWNhbFRvcD1sLnBoeXNpY2FsVG9wLHRoaXMuX3ZpcnR1YWxTdGFydCs9bC5pbmRleGVzLmxlbmd0aCx0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sLmluZGV4ZXMubGVuZ3RoKToodGhpcy5fdmlydHVhbFN0YXJ0LT1sLmluZGV4ZXMubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQtPWwuaW5kZXhlcy5sZW5ndGgpLHRoaXMuX3VwZGF0ZShsLmluZGV4ZXMsbT9udWxsOmwuaW5kZXhlcyksdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsCnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcywwKSx0KSl9LF9nZXRSZXVzYWJsZXM6ZnVuY3Rpb24obCl7dmFyIHA9W10sbT10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSp0aGlzLl9yYXRpbyxuPXRoaXMuX3ZpcnR1YWxTdGFydCxxPXRoaXMuX3ZpcnR1YWxFbmQsdT10aGlzLl9waHlzaWNhbENvdW50LHg9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3ZhciBBPXRoaXMuX3BoeXNpY2FsQm90dG9tK3RoaXMuX3Njcm9sbE9mZnNldDt2YXIgeT10aGlzLl9zY3JvbGxUb3Asdz10aGlzLl9zY3JvbGxCb3R0b207aWYobCl7dmFyIEM9dGhpcy5fcGh5c2ljYWxTdGFydDtBPXkteH1lbHNlIEM9dGhpcy5fcGh5c2ljYWxFbmQsQS09dztmb3IoOzspe3ZhciBHPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChDKTtBLT1HO2lmKHAubGVuZ3RoPj11fHxBPD1tKWJyZWFrO2lmKGwpe2lmKHErcC5sZW5ndGgrMT49dGhpcy5fdmlydHVhbENvdW50KWJyZWFrOwppZih4K0c+PXktdGhpcy5fc2Nyb2xsT2Zmc2V0KWJyZWFrO3AucHVzaChDKTt4Kz1HO0M9KEMrMSkldX1lbHNle2lmKDA+PW4tcC5sZW5ndGgpYnJlYWs7aWYoeCt0aGlzLl9waHlzaWNhbFNpemUtRzw9dylicmVhaztwLnB1c2goQyk7eC09RztDPTA9PT1DP3UtMTpDLTF9fXJldHVybntpbmRleGVzOnAscGh5c2ljYWxUb3A6eC10aGlzLl9zY3JvbGxPZmZzZXR9fSxfdXBkYXRlOmZ1bmN0aW9uKGwscCl7aWYoIShsJiYwPT09bC5sZW5ndGh8fDA9PT10aGlzLl9waHlzaWNhbENvdW50KSl7dGhpcy5fbWFuYWdlRm9jdXMoKTt0aGlzLl9hc3NpZ25Nb2RlbHMobCk7dGhpcy5fdXBkYXRlTWV0cmljcyhsKTtpZihwKWZvcig7cC5sZW5ndGg7KWw9cC5wb3AoKSx0aGlzLl9waHlzaWNhbFRvcC09dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGwpO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKX19LF9jcmVhdGVQb29sOmZ1bmN0aW9uKGwpe3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCk7CnZhciBwLG09QXJyYXkobCk7Zm9yKHA9MDtwPGw7cCsrKXt2YXIgbj10aGlzLnN0YW1wKG51bGwpO21bcF09bi5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChuLnJvb3QpfXJldHVybiBtfSxfaXNDbGllbnRGdWxsOmZ1bmN0aW9uKCl7cmV0dXJuIDAhPXRoaXMuX3Njcm9sbEJvdHRvbSYmdGhpcy5fcGh5c2ljYWxCb3R0b20tMT49dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbFRvcDw9dGhpcy5fc2Nyb2xsUG9zaXRpb259LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbihsKXtsPXRoaXMuX2NsYW1wKHRoaXMuX3BoeXNpY2FsQ291bnQrbCwzLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQpO2w9dGhpcy5fY29udmVydEluZGV4VG9Db21wbGV0ZVJvdyhsKTtpZih0aGlzLmdyaWQpe3ZhciBwPWwldGhpcy5faXRlbXNQZXJSb3c7cCYmbC1wPD10aGlzLl9waHlzaWNhbENvdW50JiYobCs9dGhpcy5faXRlbXNQZXJSb3cpOwpsLT1wfWwtPXRoaXMuX3BoeXNpY2FsQ291bnQ7cD1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpO2lmKCEoMD5sKSl7aWYoMDxsKXtwPXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsSXRlbXMsdGhpcy5fY3JlYXRlUG9vbChsKSk7Zm9yKHZhciBtPTA7bTxsO20rKyl0aGlzLl9waHlzaWNhbFNpemVzLnB1c2goMCk7dGhpcy5fcGh5c2ljYWxDb3VudCs9bDt0aGlzLl9waHlzaWNhbFN0YXJ0PnRoaXMuX3BoeXNpY2FsRW5kJiZ0aGlzLl9pc0luZGV4UmVuZGVyZWQodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkmJnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCk8dGhpcy5fcGh5c2ljYWxFbmQmJih0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sKTt0aGlzLl91cGRhdGUoKTt0aGlzLl90ZW1wbGF0ZUNvc3Q9KHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKS1wKS9sO3A9TWF0aC5yb3VuZCguNSoKdGhpcy5fcGh5c2ljYWxDb3VudCl9dGhpcy5fdmlydHVhbEVuZD49dGhpcy5fdmlydHVhbENvdW50LTF8fDA9PT1wfHwodGhpcy5faXNDbGllbnRGdWxsKCk/dGhpcy5fcGh5c2ljYWxTaXplPHRoaXMuX29wdFBoeXNpY2FsU2l6ZSYmdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLHRoaXMuX2NsYW1wKE1hdGgucm91bmQoNTAvdGhpcy5fdGVtcGxhdGVDb3N0KSwxLHApKSxrKTp0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMscCksdCkpfX0sX3JlbmRlcjpmdW5jdGlvbigpe2lmKHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faXNWaXNpYmxlKWlmKDAhPT10aGlzLl9waHlzaWNhbENvdW50KXt2YXIgbD10aGlzLl9nZXRSZXVzYWJsZXMoITApO3RoaXMuX3BoeXNpY2FsVG9wPWwucGh5c2ljYWxUb3A7dGhpcy5fdmlydHVhbFN0YXJ0Kz0KbC5pbmRleGVzLmxlbmd0aDt0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sLmluZGV4ZXMubGVuZ3RoO3RoaXMuX3VwZGF0ZShsLmluZGV4ZXMpO3RoaXMuX3VwZGF0ZSgpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApfWVsc2UgMDx0aGlzLl92aXJ0dWFsQ291bnQmJih0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDMpKX0sX2Vuc3VyZVRlbXBsYXRpemVkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY3Rvcil7KHRoaXMuX3VzZXJUZW1wbGF0ZT10aGlzLnF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4oInRlbXBsYXRlIikpfHxjb25zb2xlLndhcm4oImlyb24tbGlzdCByZXF1aXJlcyBhIHRlbXBsYXRlIHRvIGJlIHByb3ZpZGVkIGluIGxpZ2h0LWRvbSIpO3ZhciBsPXtfX2tleV9fOiEwfTtsW3RoaXMuYXNdPSEwO2xbdGhpcy5pbmRleEFzXT0hMDtsW3RoaXMuc2VsZWN0ZWRBc109ITA7bC50YWJJbmRleD0hMDt0aGlzLl9pbnN0YW5jZVByb3BzPQpsO3RoaXMudGVtcGxhdGl6ZSh0aGlzLl91c2VyVGVtcGxhdGUsdGhpcy5tdXRhYmxlRGF0YSl9fSxfZ3JpZENoYW5nZWQ6ZnVuY3Rpb24obCxwKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBwJiYodGhpcy5ub3RpZnlSZXNpemUoKSxQb2x5bWVyLmZsdXNoP1BvbHltZXIuZmx1c2goKTpQb2x5bWVyLmRvbS5mbHVzaCgpLGwmJnRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCkpfSxfaXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGwpe2lmKCJpdGVtcyI9PT1sLnBhdGgpdGhpcy5fcGh5c2ljYWxUb3A9dGhpcy5fdmlydHVhbFN0YXJ0PTAsdGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MCx0aGlzLl9jb2xsZWN0aW9uPXRoaXMuaXRlbXMmJlBvbHltZXIuQ29sbGVjdGlvbj9Qb2x5bWVyLkNvbGxlY3Rpb24uZ2V0KHRoaXMuaXRlbXMpOm51bGwsdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fSx0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPQpudWxsLHRoaXMuX3BoeXNpY2FsQ291bnQ9dGhpcy5fcGh5c2ljYWxDb3VudHx8MCx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdLHRoaXMuX3BoeXNpY2FsU2l6ZXM9dGhpcy5fcGh5c2ljYWxTaXplc3x8W10sdGhpcy5fcGh5c2ljYWxTdGFydD0wLHRoaXMuX3Njcm9sbFRvcD50aGlzLl9zY3JvbGxPZmZzZXQmJnRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oMCksdGhpcy5fcmVtb3ZlRm9jdXNlZEl0ZW0oKSx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpO2Vsc2UgaWYoIml0ZW1zLnNwbGljZXMiPT09bC5wYXRoKXt0aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXgobC52YWx1ZS5pbmRleFNwbGljZXMpO3RoaXMuX3ZpcnR1YWxDb3VudD10aGlzLml0ZW1zP3RoaXMuaXRlbXMubGVuZ3RoOjA7aWYobC52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihtKXtyZXR1cm4gMDxtLmFkZGVkQ291bnR8fDA8bS5yZW1vdmVkLmxlbmd0aH0pKXt2YXIgcD0KdGhpcy5fZ2V0QWN0aXZlRWxlbWVudCgpO3RoaXMuY29udGFpbnMocCkmJnAuYmx1cigpfWw9bC52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihtKXtyZXR1cm4gbS5pbmRleCttLmFkZGVkQ291bnQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmbS5pbmRleDw9dGhpcy5fdmlydHVhbEVuZH0sdGhpcyk7dGhpcy5faXNDbGllbnRGdWxsKCkmJiFsfHx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpfWVsc2UiaXRlbXMubGVuZ3RoIiE9PWwucGF0aCYmdGhpcy5fZm9yd2FyZEl0ZW1QYXRoKGwucGF0aCxsLnZhbHVlKX0sX2ZvcndhcmRJdGVtUGF0aDpmdW5jdGlvbihsLHApe2w9bC5zbGljZSg2KTt2YXIgbT1sLmluZGV4T2YoIi4iKTstMT09PW0mJihtPWwubGVuZ3RoKTt2YXIgbixxPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTtpZihmKXt2YXIgdT1wYXJzZUludChsLnN1YnN0cmluZygwLG0pLDEwKTtpZihuPXRoaXMuX2lzSW5kZXhSZW5kZXJlZCh1KSl7dmFyIHg9CnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodSk7dmFyIEE9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t4XSl9ZWxzZSBxJiYoQT1xKTtpZighQXx8QVt0aGlzLmluZGV4QXNdIT09dSlyZXR1cm59ZWxzZSBpZih1PWwuc3Vic3RyaW5nKDAsbSkscSYmcS5fX2tleV9fPT09dSlBPXE7ZWxzZSBpZih4PXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdV0sQT10aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3hdKSwhQXx8QS5fX2tleV9fIT09dSlyZXR1cm47bD1sLnN1YnN0cmluZyhtKzEpO2w9dGhpcy5hcysobD8iLiIrbDoiIik7Zj9BLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgobCxwLCExLCEwKTpBLm5vdGlmeVBhdGgobCxwLCEwKTtBLl9mbHVzaFByb3BlcnRpZXMmJkEuX2ZsdXNoUHJvcGVydGllcyghMCk7biYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW3hdKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCkpfSwKX2FkanVzdFZpcnR1YWxJbmRleDpmdW5jdGlvbihsKXtsLmZvckVhY2goZnVuY3Rpb24ocCl7cC5yZW1vdmVkLmZvckVhY2godGhpcy5fcmVtb3ZlSXRlbSx0aGlzKTtwLmluZGV4PHRoaXMuX3ZpcnR1YWxTdGFydCYmKHA9TWF0aC5tYXgocC5hZGRlZENvdW50LXAucmVtb3ZlZC5sZW5ndGgscC5pbmRleC10aGlzLl92aXJ0dWFsU3RhcnQpLHRoaXMuX3ZpcnR1YWxTdGFydCs9cCwwPD10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiYodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCs9cCkpfSx0aGlzKX0sX3JlbW92ZUl0ZW06ZnVuY3Rpb24obCl7dGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0KGwpO3RoaXMuX2ZvY3VzZWRJdGVtJiZ0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9mb2N1c2VkSXRlbSlbdGhpcy5hc109PT1sJiZ0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKGwscCl7dmFyIG0sbjtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmcClmb3Iobj0KMDtuPHAubGVuZ3RoO24rKyl7dmFyIHE9cFtuXTt2YXIgdT10aGlzLl9jb21wdXRlVmlkeChxKTtpZihudWxsIT0obT1sLmNhbGwodGhpcyxxLHUpKSlyZXR1cm4gbX1lbHNle3E9dGhpcy5fcGh5c2ljYWxTdGFydDtmb3IodT10aGlzLl92aXJ0dWFsU3RhcnQ7cTx0aGlzLl9waHlzaWNhbENvdW50O3ErKyx1KyspaWYobnVsbCE9KG09bC5jYWxsKHRoaXMscSx1KSkpcmV0dXJuIG07Zm9yKHE9MDtxPHRoaXMuX3BoeXNpY2FsU3RhcnQ7cSsrLHUrKylpZihudWxsIT0obT1sLmNhbGwodGhpcyxxLHUpKSlyZXR1cm4gbX19LF9jb21wdXRlVmlkeDpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5fcGh5c2ljYWxTdGFydD90aGlzLl92aXJ0dWFsU3RhcnQrKGwtdGhpcy5fcGh5c2ljYWxTdGFydCk6dGhpcy5fdmlydHVhbFN0YXJ0Kyh0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3BoeXNpY2FsU3RhcnQpK2x9LF9hc3NpZ25Nb2RlbHM6ZnVuY3Rpb24obCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHAsCm0pe3ZhciBuPXRoaXMuX3BoeXNpY2FsSXRlbXNbcF0scT10aGlzLml0ZW1zJiZ0aGlzLml0ZW1zW21dO2lmKG51bGwhPXEpe3ZhciB1PXRoaXMubW9kZWxGb3JFbGVtZW50KG4pO3UuX19rZXlfXz10aGlzLl9jb2xsZWN0aW9uP3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHEpOm51bGw7dGhpcy5fZm9yd2FyZFByb3BlcnR5KHUsdGhpcy5hcyxxKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSx0aGlzLnNlbGVjdGVkQXMsdGhpcy4kLnNlbGVjdG9yLmlzU2VsZWN0ZWQocSkpO3RoaXMuX2ZvcndhcmRQcm9wZXJ0eSh1LHRoaXMuaW5kZXhBcyxtKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSwidGFiSW5kZXgiLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9PT1tPzA6LTEpO3RoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdS5fX2tleV9fXT1wO3UuX2ZsdXNoUHJvcGVydGllcyYmdS5fZmx1c2hQcm9wZXJ0aWVzKCEwKTtuLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIil9ZWxzZSBuLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwKIiIpfSxsKX0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24obCl7UG9seW1lci5mbHVzaD9Qb2x5bWVyLmZsdXNoKCk6UG9seW1lci5kb20uZmx1c2goKTt2YXIgcD0wLG09MCxuPXRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50LHE9dGhpcy5fcGh5c2ljYWxBdmVyYWdlO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbih1KXttKz10aGlzLl9waHlzaWNhbFNpemVzW3VdO3RoaXMuX3BoeXNpY2FsU2l6ZXNbdV09dGhpcy5fcGh5c2ljYWxJdGVtc1t1XS5vZmZzZXRIZWlnaHQ7cCs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XTt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XT8xOjB9LGwpO3RoaXMuZ3JpZD8odGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSx0aGlzLl9waHlzaWNhbFNpemU9TWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCk6KG09MT09PXRoaXMuX2l0ZW1zUGVyUm93P206Ck1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9yb3dIZWlnaHQsdGhpcy5fcGh5c2ljYWxTaXplPXRoaXMuX3BoeXNpY2FsU2l6ZStwLW0sdGhpcy5faXRlbXNQZXJSb3c9MSk7dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQhPT1uJiYodGhpcy5fcGh5c2ljYWxBdmVyYWdlPU1hdGgucm91bmQoKHEqbitwKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCkpfSxfdXBkYXRlR3JpZE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9pdGVtV2lkdGg9MDx0aGlzLl9waHlzaWNhbENvdW50P3RoaXMuX3BoeXNpY2FsSXRlbXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg6MjAwO3RoaXMuX3Jvd0hlaWdodD0wPHRoaXMuX3BoeXNpY2FsQ291bnQ/dGhpcy5fcGh5c2ljYWxJdGVtc1swXS5vZmZzZXRIZWlnaHQ6MjAwO3RoaXMuX2l0ZW1zUGVyUm93PXRoaXMuX2l0ZW1XaWR0aD9NYXRoLmZsb29yKHRoaXMuX3ZpZXdwb3J0V2lkdGgvdGhpcy5faXRlbVdpZHRoKToKdGhpcy5faXRlbXNQZXJSb3d9LF9wb3NpdGlvbkl0ZW1zOmZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKTt2YXIgbD10aGlzLl9waHlzaWNhbFRvcDtpZih0aGlzLmdyaWQpe3ZhciBwPSh0aGlzLl92aWV3cG9ydFdpZHRoLXRoaXMuX2l0ZW1zUGVyUm93KnRoaXMuX2l0ZW1XaWR0aCkvMjt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSxuKXt2YXIgcT1NYXRoLmZsb29yKG4ldGhpcy5faXRlbXNQZXJSb3cqdGhpcy5faXRlbVdpZHRoK3ApO3RoaXMuX2lzUlRMJiYocSo9LTEpO3RoaXMudHJhbnNsYXRlM2QocSsicHgiLGwrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbV0pO3RoaXMuX3Nob3VsZFJlbmRlck5leHRSb3cobikmJihsKz10aGlzLl9yb3dIZWlnaHQpfSl9ZWxzZSB0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSl7dGhpcy50cmFuc2xhdGUzZCgwLGwrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbV0pO2wrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbV19KX0sCl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZ3JpZD90aGlzLl9jb21wdXRlVmlkeChsKSV0aGlzLl9pdGVtc1BlclJvdyE9PXRoaXMuX2l0ZW1zUGVyUm93LTE/MDp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplc1tsXX0sX3Nob3VsZFJlbmRlck5leHRSb3c6ZnVuY3Rpb24obCl7cmV0dXJuIGwldGhpcy5faXRlbXNQZXJSb3c9PT10aGlzLl9pdGVtc1BlclJvdy0xfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgbD0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2lmKDAhPT1sKXt0aGlzLl9waHlzaWNhbFRvcC09bDt2YXIgcD10aGlzLl9zY3JvbGxUb3A7IWQmJjA8cCYmdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbihwLWwpfX0sX3Jlc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24obCl7dGhpcy5zY3JvbGxUYXJnZXQmJgowPD1sJiYodGhpcy5fc2Nyb2xsUG9zaXRpb249dGhpcy5fc2Nyb2xsVG9wPWwpfSxfdXBkYXRlU2Nyb2xsZXJTaXplOmZ1bmN0aW9uKGwpe3RoaXMuX2VzdFNjcm9sbEhlaWdodD10aGlzLmdyaWQ/dGhpcy5fdmlydHVhbFJvd0NvdW50KnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbEJvdHRvbStNYXRoLm1heCh0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsMCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2lmKChsPShsPShsPWx8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fHRoaXMuZ3JpZCYmdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodDx0aGlzLl9lc3RTY3JvbGxIZWlnaHQpfHxNYXRoLmFicyh0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fc2Nyb2xsSGVpZ2h0KT49dGhpcy5fdmlld3BvcnRIZWlnaHQpdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD0KdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KyJweCIsdGhpcy5fc2Nyb2xsSGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodH0sc2Nyb2xsVG9JdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sc2Nyb2xsVG9JbmRleDpmdW5jdGlvbihsKXtpZighKCJudW1iZXIiIT09dHlwZW9mIGx8fDA+bHx8bD50aGlzLml0ZW1zLmxlbmd0aC0xKSYmKFBvbHltZXIuZmx1c2g/UG9seW1lci5mbHVzaCgpOlBvbHltZXIuZG9tLmZsdXNoKCksMCE9PXRoaXMuX3BoeXNpY2FsQ291bnQpKXtsPXRoaXMuX2NsYW1wKGwsMCx0aGlzLl92aXJ0dWFsQ291bnQtMSk7aWYoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZChsKXx8bD49dGhpcy5fbWF4VmlydHVhbFN0YXJ0KXRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLmdyaWQ/bC0yKnRoaXMuX2l0ZW1zUGVyUm93OmwtMTt0aGlzLl9tYW5hZ2VGb2N1cygpO3RoaXMuX2Fzc2lnbk1vZGVscygpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoKTsKdGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIHA9dGhpcy5fcGh5c2ljYWxTdGFydCxtPXRoaXMuX3ZpcnR1YWxTdGFydCxuPTAscT10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTttPGwmJm48PXE7KW4rPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChwKSxwPShwKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsbSsrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0K24pO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbH19LF9yZXNldEF2ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudD0KdGhpcy5fcGh5c2ljYWxBdmVyYWdlPTB9LF9yZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLGZ1bmN0aW9uKCl7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO3RoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCk7dGhpcy5faXNWaXNpYmxlPyh0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCEwKSx0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLl9yZW5kZXIoKSk6dGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMSl9LGgpfSxzZWxlY3RJdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnNlbGVjdEluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHNlbGVjdEluZGV4OmZ1bmN0aW9uKGwpe2lmKCEoMD5sfHxsPj10aGlzLl92aXJ0dWFsQ291bnQpKXshdGhpcy5tdWx0aVNlbGVjdGlvbiYmdGhpcy5zZWxlY3RlZEl0ZW0mJnRoaXMuY2xlYXJTZWxlY3Rpb24oKTtpZih0aGlzLl9pc0luZGV4UmVuZGVyZWQobCkpe3ZhciBwPQp0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldKTtwJiYocFt0aGlzLnNlbGVjdGVkQXNdPSEwKTt0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChsKX10aGlzLiQuc2VsZWN0b3Iuc2VsZWN0SW5kZXg/dGhpcy4kLnNlbGVjdG9yLnNlbGVjdEluZGV4KGwpOnRoaXMuJC5zZWxlY3Rvci5zZWxlY3QodGhpcy5pdGVtc1tsXSl9fSxkZXNlbGVjdEl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZGVzZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YobCkpfSxkZXNlbGVjdEluZGV4OmZ1bmN0aW9uKGwpezA+bHx8bD49dGhpcy5fdmlydHVhbENvdW50fHwodGhpcy5faXNJbmRleFJlbmRlcmVkKGwpJiYodGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KGwpXSlbdGhpcy5zZWxlY3RlZEFzXT0hMSx0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChsKSksdGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0SW5kZXg/CnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdEluZGV4KGwpOnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdCh0aGlzLml0ZW1zW2xdKSl9LHRvZ2dsZVNlbGVjdGlvbkZvckl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMudG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sdG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXg6ZnVuY3Rpb24obCl7KHRoaXMuJC5zZWxlY3Rvci5pc0luZGV4U2VsZWN0ZWQ/dGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZChsKTp0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2xdKSk/dGhpcy5kZXNlbGVjdEluZGV4KGwpOnRoaXMuc2VsZWN0SW5kZXgobCl9LGNsZWFyU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGwpe3RoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbbF0pW3RoaXMuc2VsZWN0ZWRBc109ITF9KTt0aGlzLiQuc2VsZWN0b3IuY2xlYXJTZWxlY3Rpb24oKX0sCl9zZWxlY3Rpb25FbmFibGVkQ2hhbmdlZDpmdW5jdGlvbihsKXsobD90aGlzLmxpc3Rlbjp0aGlzLnVubGlzdGVuKS5jYWxsKHRoaXMsdGhpcywidGFwIiwiX3NlbGVjdGlvbkhhbmRsZXIiKX0sX3NlbGVjdGlvbkhhbmRsZXI6ZnVuY3Rpb24obCl7dmFyIHA9dGhpcy5tb2RlbEZvckVsZW1lbnQobC50YXJnZXQpO2lmKHApe3ZhciBtPVBvbHltZXIuZG9tKGwpLnBhdGhbMF07bD10aGlzLl9nZXRBY3RpdmVFbGVtZW50KCk7dmFyIG49dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHBbdGhpcy5pbmRleEFzXSldO2lmKCJpbnB1dCIhPT1tLmxvY2FsTmFtZSYmImJ1dHRvbiIhPT1tLmxvY2FsTmFtZSYmInNlbGVjdCIhPT1tLmxvY2FsTmFtZSl7bT1wLnRhYkluZGV4O3AudGFiSW5kZXg9LTEwMDt2YXIgcT1sP2wudGFiSW5kZXg6LTE7cC50YWJJbmRleD1tO2wmJm4hPT1sJiZuLmNvbnRhaW5zKGwpJiYtMTAwIT09cXx8dGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJdGVtKHBbdGhpcy5hc10pfX19LApfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkOmZ1bmN0aW9uKGwpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKTt0aGlzLiQuc2VsZWN0b3IubXVsdGk9bH0sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHVwZGF0ZVNpemVGb3JJbmRleDpmdW5jdGlvbihsKXtpZighdGhpcy5faXNJbmRleFJlbmRlcmVkKGwpKXJldHVybiBudWxsO3RoaXMuX3VwZGF0ZU1ldHJpY3MoW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7cmV0dXJuIG51bGx9LF9tYW5hZ2VGb2N1czpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7MDw9bCYmbDx0aGlzLl92aXJ0dWFsQ291bnQ/dGhpcy5faXNJbmRleFJlbmRlcmVkKGwpP3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOnRoaXMuX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtKCk6MDx0aGlzLl92aXJ0dWFsQ291bnQmJgowPHRoaXMuX3BoeXNpY2FsQ291bnQmJih0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9waHlzaWNhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9dGhpcy5fdmlydHVhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fcGh5c2ljYWxTdGFydF0pfSxfY29udmVydEluZGV4VG9Db21wbGV0ZVJvdzpmdW5jdGlvbihsKXt0aGlzLl9pdGVtc1BlclJvdz10aGlzLl9pdGVtc1BlclJvd3x8MTtyZXR1cm4gdGhpcy5ncmlkP01hdGguY2VpbChsL3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9pdGVtc1BlclJvdzpsfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGwpe3JldHVybiBsPj10aGlzLl92aXJ0dWFsU3RhcnQmJmw8PXRoaXMuX3ZpcnR1YWxFbmR9LF9pc0luZGV4VmlzaWJsZTpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5maXJzdFZpc2libGVJbmRleCYmbDw9dGhpcy5sYXN0VmlzaWJsZUluZGV4fSxfZ2V0UGh5c2ljYWxJbmRleDpmdW5jdGlvbihsKXtyZXR1cm4gZj8KKHRoaXMuX3BoeXNpY2FsU3RhcnQrKGwtdGhpcy5fdmlydHVhbFN0YXJ0KSkldGhpcy5fcGh5c2ljYWxDb3VudDp0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5W3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHRoaXMuaXRlbXNbbF0pXX0sZm9jdXNJdGVtOmZ1bmN0aW9uKGwpe3RoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKGwpfSxfZm9jdXNQaHlzaWNhbEl0ZW06ZnVuY3Rpb24obCl7aWYoISgwPmx8fGw+PXRoaXMuX3ZpcnR1YWxDb3VudCkpe3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpO3RoaXMuX2lzSW5kZXhSZW5kZXJlZChsKXx8dGhpcy5zY3JvbGxUb0luZGV4KGwpO3ZhciBwPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChsKV0sbT10aGlzLm1vZGVsRm9yRWxlbWVudChwKSxuO20udGFiSW5kZXg9LTEwMDstMTAwPT09cC50YWJJbmRleCYmKG49cCk7bnx8KG49UG9seW1lci5kb20ocCkucXVlcnlTZWxlY3RvcignW3RhYmluZGV4XHgzZCItMTAwIl0nKSk7Cm0udGFiSW5kZXg9MDt0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4PWw7biYmbi5mb2N1cygpfX0sX3JlbW92ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX2l0ZW1zUGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTt0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbT1udWxsO3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9LTF9LF9jcmVhdGVGb2N1c0JhY2tmaWxsSXRlbTpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4O2lmKCEodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW18fDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe2lmKCF0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSl7dmFyIHA9dGhpcy5zdGFtcChudWxsKTt0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT0KcC5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChwLnJvb3QpfXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbbF07dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pLnRhYkluZGV4PTA7dGhpcy5fcGh5c2ljYWxJdGVtc1tsXT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbTt0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD1sO3RoaXMudHJhbnNsYXRlM2QoMCwiLTEwMDAwcHgiLDAsdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pfX0sX3Jlc3RvcmVGb2N1c2VkSXRlbTpmdW5jdGlvbigpe2lmKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtJiYhKDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe3RoaXMuX2Fzc2lnbk1vZGVscygpO3ZhciBsPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksCnA9dGhpcy5fcGh5c2ljYWxJdGVtc1tsXTtpZihwKXt2YXIgbT10aGlzLm1vZGVsRm9yRWxlbWVudChwKSxuPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTttW3RoaXMuYXNdPT09blt0aGlzLmFzXT8odGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09cCxtLnRhYkluZGV4PS0xLHRoaXMuX3BoeXNpY2FsSXRlbXNbbF09dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy50cmFuc2xhdGUzZCgwLCItMTAwMDBweCIsMCx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSkpOih0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPW51bGwpO3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGx9fX0sX2RpZEZvY3VzOmZ1bmN0aW9uKGwpe2w9dGhpcy5tb2RlbEZvckVsZW1lbnQobC50YXJnZXQpO3ZhciBwPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKSxtPW51bGwhPT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSwKbj10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4O2wmJihwPT09bD90aGlzLl9pc0luZGV4VmlzaWJsZShuKXx8dGhpcy5zY3JvbGxUb0luZGV4KG4pOih0aGlzLl9yZXN0b3JlRm9jdXNlZEl0ZW0oKSxwJiYocC50YWJJbmRleD0tMSksbC50YWJJbmRleD0wLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9bj1sW3RoaXMuaW5kZXhBc10sdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9dGhpcy5fZ2V0UGh5c2ljYWxJbmRleChuKSx0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4XSxtJiYhdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX3VwZGF0ZSgpKSl9LF9rZXlkb3duSGFuZGxlcjpmdW5jdGlvbihsKXtzd2l0Y2gobC5rZXlDb2RlKXtjYXNlIDQwOnRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8dGhpcy5fdmlydHVhbENvdW50LTEmJmwucHJldmVudERlZmF1bHQoKTt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KwoodGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM5OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/LTE6MSkpO2JyZWFrO2Nhc2UgMzg6MDx0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiZsLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleC0odGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM3OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/MTotMSkpO2JyZWFrO2Nhc2UgMTM6dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksdGhpcy5zZWxlY3Rpb25FbmFibGVkJiZ0aGlzLl9zZWxlY3Rpb25IYW5kbGVyKGwpfX0sX2NsYW1wOmZ1bmN0aW9uKGwsCnAsbSl7cmV0dXJuIE1hdGgubWluKG0sTWF0aC5tYXgocCxsKSl9LF9kZWJvdW5jZTpmdW5jdGlvbihsLHAsbSl7Zj8odGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fSx0aGlzLl9kZWJvdW5jZXJzW2xdPVBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcnNbbF0sbSxwLmJpbmQodGhpcykpLFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9kZWJvdW5jZXJzW2xdKSk6UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UobCxwKSl9LF9mb3J3YXJkUHJvcGVydHk6ZnVuY3Rpb24obCxwLG0pe2Y/bC5fc2V0UGVuZGluZ1Byb3BlcnR5KHAsbSk6bFtwXT1tfSxfZm9yd2FyZEhvc3RQcm9wVjI6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJnRoaXMubW9kZWxGb3JFbGVtZW50KG0pLmZvcndhcmRIb3N0UHJvcChsLApwKX0sdGhpcyl9LF9ub3RpZnlJbnN0YW5jZVByb3BWMjpmdW5jdGlvbihsLHAsbSl7UG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcyxwKSYmKGw9bFt0aGlzLmluZGV4QXNdLHA9PXRoaXMuYXMmJih0aGlzLml0ZW1zW2xdPW0pLHRoaXMubm90aWZ5UGF0aChQb2x5bWVyLlBhdGgudHJhbnNsYXRlKHRoaXMuYXMsIml0ZW1zLiIrbCxwKSxtKSl9LF9nZXRTdGFtcGVkQ2hpbGRyZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxJdGVtc30sX2ZvcndhcmRJbnN0YW5jZVBhdGg6ZnVuY3Rpb24obCxwLG0pezA9PT1wLmluZGV4T2YodGhpcy5hcysiLiIpJiZ0aGlzLm5vdGlmeVBhdGgoIml0ZW1zLiIrbC5fX2tleV9fKyIuIitwLnNsaWNlKHRoaXMuYXMubGVuZ3RoKzEpLG0pfSxfZm9yd2FyZFBhcmVudFBhdGg6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJgp0aGlzLm1vZGVsRm9yRWxlbWVudChtKS5ub3RpZnlQYXRoKGwscCwhMCl9LHRoaXMpfSxfZm9yd2FyZFBhcmVudFByb3A6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJih0aGlzLm1vZGVsRm9yRWxlbWVudChtKVtsXT1wKX0sdGhpcyl9LF9nZXRBY3RpdmVFbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5faXRlbXNQYXJlbnQubm9kZS5kb21Ib3N0O3JldHVybiBQb2x5bWVyLmRvbShsP2wucm9vdDpkb2N1bWVudCkuYWN0aXZlRWxlbWVudH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaXRlbS9wYXBlci1pdGVtLWJvZHkuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaXRlbS1ib2R5In0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90Zi1ncmFwaC1pY29uLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2xldCBoOyhmdW5jdGlvbihrKXtrLkNPTlNUPSJDT05TVCI7ay5NRVRBPSJNRVRBIjtrLk9QPSJPUCI7ay5TRVJJRVM9IlNFUklFUyI7ay5TVU1NQVJZPSJTVU1NQVJZIn0pKGg9Zi5HcmFwaEljb25UeXBlfHwoZi5HcmFwaEljb25UeXBlPXt9KSk7UG9seW1lcih7aXM6InRmLWdyYXBoLWljb24iLHByb3BlcnRpZXM6e3R5cGU6U3RyaW5nLHZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGxPdmVycmlkZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sc3Ryb2tlT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LGZhZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9maWxsOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVGaWxsKHR5cGUsIGZpbGxPdmVycmlkZSkifSxfc3Ryb2tlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTdHJva2UodHlwZSwgc3Ryb2tlT3ZlcnJpZGUpIn19LApnZXRTdmdEZWZpbmFibGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuJC5zdmdEZWZzfSxfY29tcHV0ZUZpbGwoayx0KXtpZihudWxsIT10KXJldHVybiB0O3N3aXRjaChrKXtjYXNlIGguTUVUQTpyZXR1cm4gYi5ncmFwaC5yZW5kZXIuTWV0YW5vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2Nhc2UgaC5TRVJJRVM6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLlNlcmllc05vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2RlZmF1bHQ6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX0ZJTEx9fSxfY29tcHV0ZVN0cm9rZShrLHQpe2lmKG51bGwhPXQpcmV0dXJuIHQ7c3dpdGNoKGspe2Nhc2UgaC5NRVRBOnJldHVybiBiLmdyYXBoLnJlbmRlci5NZXRhbm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRTtjYXNlIGguU0VSSUVTOnJldHVybiBiLmdyYXBoLnJlbmRlci5TZXJpZXNOb2RlQ29sb3JzLkRFRkFVTFRfU1RST0tFO2RlZmF1bHQ6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRX19LApfaXNUeXBlKGssdCl7cmV0dXJuIGs9PT10fSxfZmFkZWRDbGFzczpmdW5jdGlvbihrLHQpe3JldHVybiBrPyJmYWRlZC0iK3Q6IiJ9fSl9KShkLmljb258fChkLmljb249e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3RmLW5vZGUtaWNvbi5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWljb24iLHByb3BlcnRpZXM6e25vZGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHJlbmRlckluZm86e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LGNvbG9yQnk6e3R5cGU6T2JqZWN0LHZhbHVlOiJzdHJ1Y3R1cmFsIn0sdGVtcGxhdGVJbmRleDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSx0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx2ZXJ0aWNhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxjb25zdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzdW1tYXJ5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGw6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LF9maWxsT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUZpbGxPdmVycmlkZShub2RlLCByZW5kZXJJbmZvLCBjb2xvckJ5LCB0ZW1wbGF0ZUluZGV4LCBmaWxsKSIsb2JzZXJ2ZXI6Il9vbkZpbGxPdmVycmlkZUNoYW5nZWQifX0sCl9jb21wdXRlRmlsbE92ZXJyaWRlOmZ1bmN0aW9uKGIsZCxmLGgsayl7cmV0dXJuIGImJmQmJmYmJmg/KGI9dGYuZ3JhcGguc2NlbmUubm9kZSxiLmdldEZpbGxGb3JOb2RlKGgsYi5Db2xvckJ5W2YudG9VcHBlckNhc2UoKV0sZCwhMSkpOmt9LF9nZXRTdHJva2VPdmVycmlkZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFN0cm9rZUZvckZpbGwoYik6bnVsbH0sX2dldFR5cGU6ZnVuY3Rpb24oYixkLGYsaCl7Y29uc3Qgaz10Zi5ncmFwaC5pY29uLkdyYXBoSWNvblR5cGU7aWYoYilzd2l0Y2goYi50eXBlKXtjYXNlIHRmLmdyYXBoLk5vZGVUeXBlLk9QOnJldHVybiBiPWIub3AsInN0cmluZyIhPT10eXBlb2YgYj9rLk9QOiJDb25zdCI9PT1ifHxmP2suQ09OU1Q6Yi5lbmRzV2l0aCgiU3VtbWFyeSIpfHxkP2suU1VNTUFSWTprLk9QO2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuTUVUQTpyZXR1cm4gay5NRVRBO2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuU0VSSUVTOnJldHVybiBrLlNFUklFU31yZXR1cm4gaH0sCl9pc1ZlcnRpY2FsOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/Yi5oYXNOb25Db250cm9sRWRnZXM6ISFkfSxfZ2V0RmFkZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuaXNGYWRlZE91dH0sX29uRmlsbE92ZXJyaWRlQ2hhbmdlZChiLGQpe2NvbnN0IGY9dGhpcy5ub2RlLGg9dGhpcy5yZW5kZXJJbmZvLGs9dGhpcy5jb2xvckJ5LHQ9dGhpcy50ZW1wbGF0ZUluZGV4LGw9dGYuZ3JhcGguc2NlbmUubm9kZTtiIT09ZCYmbC5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zKHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSk7ZiYmaCYmayYmdCYmbC5nZXRGaWxsRm9yTm9kZSh0LGwuQ29sb3JCeVtrLnRvVXBwZXJDYXNlKCldLGgsITEsdGhpcy4kLmljb24uZ2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQvdGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtIixwcm9wZXJ0aWVzOntjYXJkTm9kZTpPYmplY3QsaXRlbU5vZGU6T2JqZWN0LGVkZ2VMYWJlbDpTdHJpbmcsaXRlbVJlbmRlckluZm86T2JqZWN0LG5hbWU6U3RyaW5nLGl0ZW1UeXBlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2l0ZW1UeXBlQ2hhbmdlZCJ9LGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6T2JqZWN0LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb259LF9pdGVtVHlwZUNoYW5nZWQ6ZnVuY3Rpb24oKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX0sX25vZGVMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLmZpcmUoIm5vZGUtbGlzdC1pdGVtLSIrYi50eXBlLHtub2RlTmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLml0ZW1UeXBlfSl9LApfZmFkZWRDbGFzczpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LG5vZGVUaXRsZTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9pbmNvbXBhdGlibGVPcE5vZGVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEluY29tcGF0aWJsZU9wTm9kZXMoZ3JhcGhIaWVyYXJjaHksIGhpZXJhcmNoeVBhcmFtcykifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX29wQ29tcGF0U2NvcmU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU9wQ29tcGF0U2NvcmUoZ3JhcGhIaWVyYXJjaHkpIn0sX29wQ29tcGF0U2NvcmVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXRPcENvbXBhdFNjb3JlTGFiZWwoX29wQ29tcGF0U2NvcmUpIn0sCl9vcENvbXBhdENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTp0Zi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEV9LF9vcEluY29tcGF0Q29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOnRmLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuSU5DT01QQVRJQkxFfSxfdG90YWxJbmNvbXBhdE9wczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbEluY29tcGF0aWJsZU9wcyhncmFwaEhpZXJhcmNoeSkifX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihiLGQpe3JldHVybiBkLm5vZGUoYil9LF9nZXRQcmludGFibGVIVE1MTm9kZU5hbWU6ZnVuY3Rpb24oYil7cmV0dXJuKGJ8fCIiKS5yZXBsYWNlKC9cLy9nLCJceDNjd2JyXHgzZS8iKX0sX2dldFJlbmRlckluZm86ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZShiKX0sCl90b2dnbGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2V4cGFuZGVkPSF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYil7cmV0dXJuIGI/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzaXplTGlzdDpmdW5jdGlvbihiKXsoYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGIpKSYmYi5maXJlKCJpcm9uLXJlc2l6ZSIpfSxfZ2V0SW5jb21wYXRpYmxlT3BOb2RlczpmdW5jdGlvbihiLGQpe2lmKGImJmIucm9vdClyZXR1cm4gdGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2luY29tcGF0aWJsZU9wc0xpc3QiKSksdGYuZ3JhcGguaGllcmFyY2h5LmdldEluY29tcGF0aWJsZU9wcyhiLGQpfSxfY29tcHV0ZU9wQ29tcGF0U2NvcmU6ZnVuY3Rpb24oYil7aWYoYiYmYi5yb290KXt2YXIgZD1iLnJvb3Q7Yj1kLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZTtkPWQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7CnJldHVybiAwPT1iJiYwPT1kPzA6TWF0aC5mbG9vcigxMDAqYi8oYitkKSkvMTAwfXJldHVybiAwfSxfZ2V0T3BDb21wYXRTY29yZUxhYmVsOmZ1bmN0aW9uKGIpe3JldHVybiBkMy5mb3JtYXQoIi4wJSIpKGIpfSxfZ2V0VG90YWxJbmNvbXBhdGlibGVPcHM6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIucm9vdD9iLnJvb3QuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU6MH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWxpc3QtaXRlbSIscHJvcGVydGllczp7Y2FyZE5vZGU6T2JqZWN0LGl0ZW1Ob2RlOk9iamVjdCxlZGdlTGFiZWw6U3RyaW5nLGl0ZW1SZW5kZXJJbmZvOk9iamVjdCxuYW1lOlN0cmluZyxpdGVtVHlwZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9pdGVtVHlwZUNoYW5nZWQifSxjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOk9iamVjdCx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9ufSxfaXRlbVR5cGVDaGFuZ2VkOmZ1bmN0aW9uKCl7InN1Ym5vZGUiIT09dGhpcy5pdGVtVHlwZT90aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5hZGQoImNsaWNrYWJsZSIpOnRoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LnJlbW92ZSgiY2xpY2thYmxlIil9LF9ub2RlTGlzdGVuZXI6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJub2RlLWxpc3QtaXRlbS0iK2IudHlwZSx7Y2FyZE5vZGU6dGhpcy5jYXJkTm9kZS5uYW1lLG5vZGVOYW1lOnRoaXMubmFtZSwKdHlwZTp0aGlzLml0ZW1UeXBlfSl9LF9mYWRlZENsYXNzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmlzRmFkZWRPdXQ/ImZhZGVkIjoiIn19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbm9kZS1pbmZvIixwcm9wZXJ0aWVzOntncmFwaE5vZGVOYW1lOlN0cmluZyxncmFwaEhpZXJhcmNoeTpPYmplY3QscmVuZGVySGllcmFyY2h5Ok9iamVjdCxjb2xvckJ5OlN0cmluZyxfdGVtcGxhdGVJbmRleDp7dHlwZTpGdW5jdGlvbixjb21wdXRlZDoiX2dldFRlbXBsYXRlSW5kZXgoZ3JhcGhIaWVyYXJjaHkpIn0sX25vZGU6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Tm9kZShncmFwaE5vZGVOYW1lLCBncmFwaEhpZXJhcmNoeSkiLG9ic2VydmVyOiJfcmVzZXRTdGF0ZSJ9LF9ub2RlU3RhdHM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Tm9kZVN0YXRzKGdyYXBoTm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSIsb2JzZXJ2ZXI6Il9yZXNldFN0YXRlIn0sX2hhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKF9ub2RlU3RhdHMpIn0sX25vZGVTdGF0c0Zvcm1hdHRlZEJ5dGVzOnt0eXBlOlN0cmluZywKY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlcyhfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZShfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzKF9ub2RlU3RhdHMpIn0sbm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG9ic2VydmVyOiJfbm9kZUluY2x1ZGVTdGF0ZUNoYW5nZWQifSxfYXR0cmlidXRlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEF0dHJpYnV0ZXMoX25vZGUpIn0sX2RldmljZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXREZXZpY2UoX25vZGUpIn0sX3N1Y2Nlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0U3VjY2Vzc29ycyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sCl9wcmVkZWNlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0UHJlZGVjZXNzb3JzKF9ub2RlLCBncmFwaEhpZXJhcmNoeSkifSxfZnVuY3Rpb25Vc2FnZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRGdW5jdGlvblVzYWdlcyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sX3N1Ym5vZGVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0U3Vibm9kZXMoX25vZGUpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF90b3RhbFByZWRlY2Vzc29yczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbFByZWQoX3ByZWRlY2Vzc29ycykifSxfdG90YWxTdWNjZXNzb3JzOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2dldFRvdGFsU3VjYyhfc3VjY2Vzc29ycykifSxfb3BlbmVkQ29udHJvbFByZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX29wZW5lZENvbnRyb2xTdWNjOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hdXhCdXR0b25UZXh0OlN0cmluZyxfZ3JvdXBCdXR0b25UZXh0OlN0cmluZ30sCmV4cGFuZE5vZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIl9ub2RlLmV4cGFuZCIsdGhpcy5ub2RlKX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihiLGQpe3JldHVybiBkLm5vZGUoYil9LF9nZXROb2RlU3RhdHM6ZnVuY3Rpb24oYixkKXtyZXR1cm4oYj10aGlzLl9nZXROb2RlKGIsZCkpP2Iuc3RhdHM6bnVsbH0sX2dldFRvdGFsTWljcm9zOmZ1bmN0aW9uKGIpe3JldHVybiBiP2IuZ2V0VG90YWxNaWNyb3MoKTowfSxfZ2V0SGFzRGlzcGxheWFibGVOb2RlU3RhdHM6ZnVuY3Rpb24oYil7cmV0dXJuIHRmLmdyYXBoLnV0aWwuaGFzRGlzcGxheWFibGVOb2RlU3RhdHMoYil9LF9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlczpmdW5jdGlvbihiKXtpZihiJiZiLnRvdGFsQnl0ZXMpcmV0dXJuIHRmLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKGIudG90YWxCeXRlcyx0Zi5ncmFwaC51dGlsLk1FTU9SWV9VTklUUyl9LApfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWU6ZnVuY3Rpb24oYil7aWYoYiYmYi5nZXRUb3RhbE1pY3JvcygpKXJldHVybiB0Zi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShiLmdldFRvdGFsTWljcm9zKCksdGYuZ3JhcGgudXRpbC5USU1FX1VOSVRTKX0sX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzOmZ1bmN0aW9uKGIpe2lmKGImJmIub3V0cHV0U2l6ZSYmYi5vdXRwdXRTaXplLmxlbmd0aClyZXR1cm4gXy5tYXAoYi5vdXRwdXRTaXplLGZ1bmN0aW9uKGQpe3JldHVybiAwPT09ZC5sZW5ndGg/InNjYWxhciI6IlsiK2Quam9pbigiLCAiKSsiXSJ9KX0sX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZTpmdW5jdGlvbihiKXtyZXR1cm4oYnx8IiIpLnJlcGxhY2UoL1wvL2csIlx4M2N3YnJceDNlLyIpfSxfZ2V0UmVuZGVySW5mbzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKGIpfSwKX2dldEF0dHJpYnV0ZXM6ZnVuY3Rpb24oYil7dGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2F0dHJpYnV0ZXNMaXN0IikpO2lmKCFifHwhYi5hdHRyKXJldHVybltdO3ZhciBkPVtdO18uZWFjaChiLmF0dHIsZnVuY3Rpb24oZil7Zi5rZXk9PT10Zi5ncmFwaC5MQVJHRV9BVFRSU19LRVk/ZD1kLmNvbmNhdChmLnZhbHVlLmxpc3Qucy5tYXAoZnVuY3Rpb24oaCl7cmV0dXJue2tleTpoLHZhbHVlOiJUb28gbGFyZ2UgdG8gc2hvdy4uLiJ9fSkpOmQucHVzaCh7a2V5OmYua2V5LHZhbHVlOkpTT04uc3RyaW5naWZ5KGYudmFsdWUpfSl9KTtyZXR1cm4gZH0sX2dldERldmljZTpmdW5jdGlvbihiKXtyZXR1cm4gYj9iLmRldmljZTpudWxsfSxfZ2V0U3VjY2Vzc29ycyhiLGQpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImlucHV0c0xpc3QiKTtyZXR1cm4gYj90aGlzLl9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdChkLmdldFN1Y2Nlc3NvcnMoYi5uYW1lKSwKITEsYi5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRQcmVkZWNlc3NvcnMoYixkKXt0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJvdXRwdXRzTGlzdCIpO3JldHVybiBiP3RoaXMuX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0KGQuZ2V0UHJlZGVjZXNzb3JzKGIubmFtZSksITAsYi5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRGdW5jdGlvblVzYWdlcyhiLGQpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImZ1bmN0aW9uVXNhZ2VzTGlzdCIpO3JldHVybiBiJiZiLnR5cGU9PT10Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBPyhiPWQubGlicmFyeUZ1bmN0aW9uc1tiLmFzc29jaWF0ZWRGdW5jdGlvbl0pP2IudXNhZ2VzOltdOltdfSxfcmVmcmVzaE5vZGVJdGVtTGlzdChiKXt0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLGAjJHtifWApKX0sX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0OmZ1bmN0aW9uKGIsCmQsZil7dmFyIGg9dD0+Xy5tYXAodC5iYXNlRWRnZUxpc3QsbD0+e3ZhciBwPWQ/bC52OmwudztyZXR1cm57bmFtZTpwLG5vZGU6dGhpcy5fZ2V0Tm9kZShwLHRoaXMuZ3JhcGhIaWVyYXJjaHkpLGVkZ2VMYWJlbDp0Zi5ncmFwaC5zY2VuZS5lZGdlLmdldExhYmVsRm9yQmFzZUVkZ2UobCx0aGlzLnJlbmRlckhpZXJhcmNoeSkscmVuZGVySW5mbzp0aGlzLl9nZXRSZW5kZXJJbmZvKHAsdGhpcy5yZW5kZXJIaWVyYXJjaHkpfX0pLGs9ZnVuY3Rpb24odCl7dmFyIGw9W107Xy5lYWNoKHQscD0+e3ZhciBtPWQ/cC52OnAudztmJiYxIT1wLmJhc2VFZGdlTGlzdC5sZW5ndGg/bC5wdXNoKHtuYW1lOm0sbm9kZTp0aGlzLl9nZXROb2RlKG0sdGhpcy5ncmFwaEhpZXJhcmNoeSksZWRnZUxhYmVsOnRmLmdyYXBoLnNjZW5lLmVkZ2UuZ2V0TGFiZWxGb3JFZGdlKHAsdGhpcy5yZW5kZXJIaWVyYXJjaHkpLHJlbmRlckluZm86dGhpcy5fZ2V0UmVuZGVySW5mbyhtLHRoaXMucmVuZGVySGllcmFyY2h5KX0pOgpsPWwuY29uY2F0KGgocCkpfSk7cmV0dXJuIGx9LmJpbmQodGhpcyk7cmV0dXJue3JlZ3VsYXI6ayhiLnJlZ3VsYXIpLGNvbnRyb2w6ayhiLmNvbnRyb2wpfX0sX2dldFN1Ym5vZGVzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLm1ldGFncmFwaD9iLm1ldGFncmFwaC5ub2RlcygpOm51bGx9LF9nZXRUb3RhbFByZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIucmVndWxhci5sZW5ndGgrYi5jb250cm9sLmxlbmd0aH0sX2dldFRvdGFsU3VjYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5yZWd1bGFyLmxlbmd0aCtiLmNvbnRyb2wubGVuZ3RofSxfdG9nZ2xlQ29udHJvbFByZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWRDb250cm9sUHJlZD0hdGhpcy5fb3BlbmVkQ29udHJvbFByZWR9LF90b2dnbGVDb250cm9sU3VjYzpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPSF0aGlzLl9vcGVuZWRDb250cm9sU3VjY30sX3RvZ2dsZUV4cGFuZGVkOmZ1bmN0aW9uKCl7dGhpcy5fZXhwYW5kZWQ9CiF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYil7cmV0dXJuIGI/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzZXRTdGF0ZTpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPXRoaXMuX29wZW5lZENvbnRyb2xQcmVkPSExO3RoaXMuc2V0KCJfZ3JvdXBCdXR0b25UZXh0Iix0Zi5ncmFwaC5zY2VuZS5ub2RlLmdldEdyb3VwU2V0dGluZ0xhYmVsKHRoaXMuX25vZGUpKTt0aGlzLl9ub2RlJiYoUG9seW1lci5kb20odGhpcy4kLm5vZGV0aXRsZSkuaW5uZXJIVE1MPXRoaXMuX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZSh0aGlzLl9ub2RlLm5hbWUpKX0sX3Jlc2l6ZUxpc3Q6ZnVuY3Rpb24oYil7KGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihiKSkmJmIuZmlyZSgiaXJvbi1yZXNpemUiKX0sX3RvZ2dsZUluY2x1ZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIm5vZGUtdG9nZ2xlLWluY2x1c2lvbiIse25hbWU6dGhpcy5ncmFwaE5vZGVOYW1lfSl9LApfbm9kZUluY2x1ZGVTdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZXQoIl9hdXhCdXR0b25UZXh0Iix0Zi5ncmFwaC5nZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZyhiKSl9LF90b2dnbGVHcm91cDpmdW5jdGlvbigpe3ZhciBiPXRmLmdyYXBoLnNjZW5lLm5vZGUuZ2V0U2VyaWVzTmFtZSh0aGlzLl9ub2RlKTt0aGlzLmZpcmUoIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIix7bmFtZTpifSl9LF9pc0xpYnJhcnlGdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5uYW1lLnN0YXJ0c1dpdGgodGYuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCl9LF9pc0luU2VyaWVzOmZ1bmN0aW9uKGIpe3JldHVybiB0Zi5ncmFwaC5zY2VuZS5ub2RlLmNhbkJlSW5TZXJpZXMoYil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWluZm8vdGYtZ3JhcGgtaW5mby5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1pbmZvIixwcm9wZXJ0aWVzOnt0aXRsZTpTdHJpbmcsZ3JhcGhIaWVyYXJjaHk6T2JqZWN0LGdyYXBoOk9iamVjdCxyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGhlYWx0aFBpbGxTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sY29sb3JCeTpTdHJpbmcsY29tcGF0Tm9kZVRpdGxlOlN0cmluZyxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0saGlnaGxpZ2h0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkTm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sZGVidWdnZXJEYXRhRW5hYmxlZDpCb29sZWFufSxsaXN0ZW5lcnM6eyJub2RlLWxpc3QtaXRlbS1jbGljayI6Il9ub2RlTGlzdEl0ZW1DbGlja2VkIiwibm9kZS1saXN0LWl0ZW0tbW91c2VvdmVyIjoiX25vZGVMaXN0SXRlbU1vdXNlb3ZlciIsIm5vZGUtbGlzdC1pdGVtLW1vdXNlb3V0IjoiX25vZGVMaXN0SXRlbU1vdXNlb3V0In0sCl9ub2RlTGlzdEl0ZW1DbGlja2VkOmZ1bmN0aW9uKGIpe3RoaXMuc2VsZWN0ZWROb2RlPWIuZGV0YWlsLm5vZGVOYW1lfSxfbm9kZUxpc3RJdGVtTW91c2VvdmVyOmZ1bmN0aW9uKGIpe3RoaXMuaGlnaGxpZ2h0ZWROb2RlPWIuZGV0YWlsLm5vZGVOYW1lfSxfbm9kZUxpc3RJdGVtTW91c2VvdXQ6ZnVuY3Rpb24oKXt0aGlzLmhpZ2hsaWdodGVkTm9kZT1udWxsfSxfaGVhbHRoUGlsbHNBdmFpbGFibGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYiYmZCYmMDxPYmplY3Qua2V5cyhkKS5sZW5ndGh9LF9lcXVhbHM6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj09PWR9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWJvYXJkL3RmLWdyYXBoLWJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoLWJvYXJkIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTpPYmplY3QsZ3JhcGg6T2JqZWN0LHN0YXRzOk9iamVjdCxwcm9ncmVzczpPYmplY3QsdHJhY2VJbnB1dHM6Qm9vbGVhbixjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxkZWJ1Z2dlckRhdGFFbmFibGVkOkJvb2xlYW4sYXJlSGVhbHRoUGlsbHNMb2FkaW5nOkJvb2xlYW4sZGVidWdnZXJOdW1lcmljQWxlcnRzOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sbm9kZU5hbWVzVG9IZWFsdGhQaWxsczpPYmplY3QsYWxsU3RlcHNNb2RlRW5hYmxlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOjB9LGhlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsCm5vdGlmeTohMH0sY29tcGF0Tm9kZVRpdGxlOnt0eXBlOlN0cmluZyx2YWx1ZToiVFBVIENvbXBhdGliaWxpdHkifSxlZGdlV2lkdGhGdW5jdGlvbjpPYmplY3QsX3NlbGVjdGVkTm9kZUluY2x1ZGU6TnVtYmVyLF9oaWdobGlnaHRlZE5vZGU6U3RyaW5nLGhhbmRsZU5vZGVTZWxlY3RlZDpPYmplY3QsZWRnZUxhYmVsRnVuY3Rpb246T2JqZWN0LGhhbmRsZUVkZ2VTZWxlY3RlZDpPYmplY3R9LG9ic2VydmVyczpbIl91cGRhdGVOb2RlSW5jbHVkZShzZWxlY3RlZE5vZGUsIHJlbmRlckhpZXJhcmNoeSkiXSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLiQuZ3JhcGguZml0KCl9LF9pc05vdENvbXBsZXRlOmZ1bmN0aW9uKGIpe3JldHVybiAxMDA+Yi52YWx1ZX0sX2dldENvbnRhaW5lckNsYXNzOmZ1bmN0aW9uKGIpe3ZhciBkPSJjb250YWluZXIiO2IuZXJyb3ImJihkKz0iIGVycm9yIik7dGhpcy5faXNOb3RDb21wbGV0ZShiKSYmKGQrPSIgbG9hZGluZyIpO3JldHVybiBkfSxfb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZChiKXt0aGlzLiQuZ3JhcGgubm9kZVRvZ2dsZUV4dHJhY3QoYi5kZXRhaWwubmFtZSl9LApfb25Ob2RlU2VyaWVzR3JvdXBUb2dnbGVkKGIpe3RoaXMuJC5ncmFwaC5ub2RlVG9nZ2xlU2VyaWVzR3JvdXAoYi5kZXRhaWwubmFtZSl9LF91cGRhdGVOb2RlSW5jbHVkZSgpe2NvbnN0IGI9dGhpcy5yZW5kZXJIaWVyYXJjaHk/dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0Tm9kZUJ5TmFtZSh0aGlzLnNlbGVjdGVkTm9kZSk6bnVsbDt0aGlzLl9zZWxlY3RlZE5vZGVJbmNsdWRlPWI/Yi5pbmNsdWRlOnRmLmdyYXBoLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1tZW51LWJlaGF2aW9yL2lyb24tbWVudWJhci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGw9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJtZW51YmFyIn0sa2V5QmluZGluZ3M6e2xlZnQ6Il9vbkxlZnRLZXkiLHJpZ2h0OiJfb25SaWdodEtleSJ9LF9vblVwS2V5OmZ1bmN0aW9uKGIpe3RoaXMuZm9jdXNlZEl0ZW0uY2xpY2soKTtiLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24oYil7dGhpcy5mb2N1c2VkSXRlbS5jbGljaygpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sZ2V0IF9pc1JUTCgpe3JldHVybiJydGwiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlyZWN0aW9ufSxfb25MZWZ0S2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2lzUlRMP3RoaXMuX2ZvY3VzTmV4dCgpOnRoaXMuX2ZvY3VzUHJldmlvdXMoKTtiLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2lzUlRMPwp0aGlzLl9mb2N1c1ByZXZpb3VzKCk6dGhpcy5fZm9jdXNOZXh0KCk7Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25LZXlkb3duOmZ1bmN0aW9uKGIpe3RoaXMua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGIsInVwIGRvd24gbGVmdCByaWdodCBlc2MiKXx8dGhpcy5fZm9jdXNXaXRoS2V5Ym9hcmRFdmVudChiKX19O1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvcj1bUG9seW1lci5Jcm9uTWVudUJlaGF2aW9yLFBvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJhZGlvLWJ1dHRvbi9wYXBlci1yYWRpby1idXR0b24uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItcmFkaW8tYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToicmFkaW8iLCJhcmlhLWNoZWNrZWQiOiExLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e2FyaWFBY3RpdmVBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJhcmlhLWNoZWNrZWQifX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnJhZGlvQ29udGFpbmVyfSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUiKS50cmltKCkpe3ZhciBiPXBhcnNlRmxvYXQodGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSIpLnRyaW0oKSksCmQ9TWF0aC5mbG9vcigzKmIpO2QlMiE9PWIlMiYmZCsrO3RoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUiOmQrInB4In0pfX0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJhZGlvLWdyb3VwL3BhcGVyLXJhZGlvLWdyb3VwLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXJhZGlvLWdyb3VwIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InJhZGlvZ3JvdXAifSxwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJuYW1lIn0sc2VsZWN0ZWRBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJjaGVja2VkIn0sc2VsZWN0YWJsZTp7dHlwZTpTdHJpbmcsdmFsdWU6InBhcGVyLXJhZGlvLWJ1dHRvbiJ9LGFsbG93RW1wdHlTZWxlY3Rpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LHNlbGVjdDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl92YWx1ZVRvSXRlbShiKTtpZighZHx8IWQuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXtpZih0aGlzLnNlbGVjdGVkKXtkPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2lmKHRoaXMuc2VsZWN0ZWQ9PWIpaWYodGhpcy5hbGxvd0VtcHR5U2VsZWN0aW9uKWI9IiI7ZWxzZXtkJiYKKGQuY2hlY2tlZD0hMCk7cmV0dXJufWQmJihkLmNoZWNrZWQ9ITEpfVBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5zZWxlY3QuYXBwbHkodGhpcyxbYl0pO3RoaXMuZmlyZSgicGFwZXItcmFkaW8tZ3JvdXAtY2hhbmdlZCIpfX0sX2FjdGl2YXRlRm9jdXNlZEl0ZW06ZnVuY3Rpb24oKXt0aGlzLl9pdGVtQWN0aXZhdGUodGhpcy5fdmFsdWVGb3JJdGVtKHRoaXMuZm9jdXNlZEl0ZW0pLHRoaXMuZm9jdXNlZEl0ZW0pfSxfb25VcEtleTpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c1ByZXZpb3VzKCk7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uRG93bktleTpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c05leHQoKTtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fYWN0aXZhdGVGb2N1c2VkSXRlbSgpfSxfb25MZWZ0S2V5OmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGwuX29uTGVmdEtleS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CnRoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uUmlnaHRLZXk6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uTWVudWJhckJlaGF2aW9ySW1wbC5fb25SaWdodEtleS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5fYWN0aXZhdGVGb2N1c2VkSXRlbSgpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvb2x0aXAvcGFwZXItdG9vbHRpcC5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b29sdGlwIixob3N0QXR0cmlidXRlczp7cm9sZToidG9vbHRpcCIsdGFiaW5kZXg6LTF9LHByb3BlcnRpZXM6e2Zvcjp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9maW5kVGFyZ2V0In0sbWFudWFsTW9kZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfbWFudWFsTW9kZUNoYW5nZWQifSxwb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImJvdHRvbSJ9LGZpdFRvVmlzaWJsZUJvdW5kczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxvZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjE0fSxtYXJnaW5Ub3A6e3R5cGU6TnVtYmVyLHZhbHVlOjE0fSxhbmltYXRpb25EZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwLG9ic2VydmVyOiJfZGVsYXlDaGFuZ2UifSxhbmltYXRpb25FbnRyeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGFuaW1hdGlvbkV4aXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LAp2YWx1ZTpmdW5jdGlvbigpe3JldHVybntlbnRyeTpbe25hbWU6ImZhZGUtaW4tYW5pbWF0aW9uIixub2RlOnRoaXMsdGltaW5nOntkZWxheTowfX1dLGV4aXQ6W3tuYW1lOiJmYWRlLW91dC1hbmltYXRpb24iLG5vZGU6dGhpc31dfX19LF9zaG93aW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxsaXN0ZW5lcnM6e3dlYmtpdEFuaW1hdGlvbkVuZDoiX29uQW5pbWF0aW9uRW5kIn0sZ2V0IHRhcmdldCgpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMpLnBhcmVudE5vZGUsZD1Qb2x5bWVyLmRvbSh0aGlzKS5nZXRPd25lclJvb3QoKTtyZXR1cm4gdGhpcy5mb3I/UG9seW1lci5kb20oZCkucXVlcnlTZWxlY3RvcigiIyIrdGhpcy5mb3IpOmIubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERT9kLmhvc3Q6Yn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5kVGFyZ2V0KCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5tYW51YWxNb2RlfHx0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKX0sCnBsYXlBbmltYXRpb246ZnVuY3Rpb24oYil7ImVudHJ5Ij09PWI/dGhpcy5zaG93KCk6ImV4aXQiPT09YiYmdGhpcy5oaWRlKCl9LGNhbmNlbEFuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImNhbmNlbC1hbmltYXRpb24iKX0sc2hvdzpmdW5jdGlvbigpe2lmKCF0aGlzLl9zaG93aW5nKXtpZigiIj09PVBvbHltZXIuZG9tKHRoaXMpLnRleHRDb250ZW50LnRyaW0oKSl7Zm9yKHZhciBiPSEwLGQ9UG9seW1lci5kb20odGhpcykuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpLGY9MDtmPGQubGVuZ3RoO2YrKylpZigiIiE9PWRbZl0udGV4dENvbnRlbnQudHJpbSgpKXtiPSExO2JyZWFrfWlmKGIpcmV0dXJufXRoaXMuX3Nob3dpbmc9ITA7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiY2FuY2VsLWFuaW1hdGlvbiIpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKTsKdGhpcy51cGRhdGVQb3NpdGlvbigpO3RoaXMuX2FuaW1hdGlvblBsYXlpbmc9ITA7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKX19LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLl9zaG93aW5nJiYodGhpcy5fYW5pbWF0aW9uUGxheWluZz8odGhpcy5fc2hvd2luZz0hMSx0aGlzLl9jYW5jZWxBbmltYXRpb24oKSk6KHRoaXMuX29uQW5pbWF0aW9uRmluaXNoKCksdGhpcy5fc2hvd2luZz0hMSx0aGlzLl9hbmltYXRpb25QbGF5aW5nPSEwKSl9LHVwZGF0ZVBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fdGFyZ2V0JiZ0aGlzLm9mZnNldFBhcmVudCl7dmFyIGI9dGhpcy5vZmZzZXQ7MTQhPXRoaXMubWFyZ2luVG9wJiYxND09dGhpcy5vZmZzZXQmJihiPXRoaXMubWFyZ2luVG9wKTt2YXIgZD10aGlzLm9mZnNldFBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxmPXRoaXMuX3RhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKaD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGs9KGYud2lkdGgtaC53aWR0aCkvMix0PShmLmhlaWdodC1oLmhlaWdodCkvMixsPWYubGVmdC1kLmxlZnQscD1mLnRvcC1kLnRvcDtzd2l0Y2godGhpcy5wb3NpdGlvbil7Y2FzZSAidG9wIjp2YXIgbT1sK2s7dmFyIG49cC1oLmhlaWdodC1iO2JyZWFrO2Nhc2UgImJvdHRvbSI6bT1sK2s7bj1wK2YuaGVpZ2h0K2I7YnJlYWs7Y2FzZSAibGVmdCI6bT1sLWgud2lkdGgtYjtuPXArdDticmVhaztjYXNlICJyaWdodCI6bT1sK2Yud2lkdGgrYixuPXArdH10aGlzLmZpdFRvVmlzaWJsZUJvdW5kcz8oZC5sZWZ0K20raC53aWR0aD53aW5kb3cuaW5uZXJXaWR0aD8odGhpcy5zdHlsZS5yaWdodD0iMHB4Iix0aGlzLnN0eWxlLmxlZnQ9ImF1dG8iKToodGhpcy5zdHlsZS5sZWZ0PU1hdGgubWF4KDAsbSkrInB4Iix0aGlzLnN0eWxlLnJpZ2h0PSJhdXRvIiksZC50b3ArbitoLmhlaWdodD53aW5kb3cuaW5uZXJIZWlnaHQ/KHRoaXMuc3R5bGUuYm90dG9tPQpkLmhlaWdodCsicHgiLHRoaXMuc3R5bGUudG9wPSJhdXRvIik6KHRoaXMuc3R5bGUudG9wPU1hdGgubWF4KC1kLnRvcCxuKSsicHgiLHRoaXMuc3R5bGUuYm90dG9tPSJhdXRvIikpOih0aGlzLnN0eWxlLmxlZnQ9bSsicHgiLHRoaXMuc3R5bGUudG9wPW4rInB4Iil9fSxfYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdGFyZ2V0JiYodGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWVudGVyIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwiZm9jdXMiLCJzaG93IiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWxlYXZlIiwiaGlkZSIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwiYmx1ciIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsInRhcCIsImhpZGUiKSk7dGhpcy5saXN0ZW4odGhpcy4kLnRvb2x0aXAsImFuaW1hdGlvbmVuZCIsIl9vbkFuaW1hdGlvbkVuZCIpO3RoaXMubGlzdGVuKHRoaXMsIm1vdXNlZW50ZXIiLCJoaWRlIil9LApfZmluZFRhcmdldDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk7dGhpcy5fdGFyZ2V0PXRoaXMudGFyZ2V0O3RoaXMubWFudWFsTW9kZXx8dGhpcy5fYWRkTGlzdGVuZXJzKCl9LF9kZWxheUNoYW5nZTpmdW5jdGlvbihiKXs1MDAhPT1iJiZ0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiI6YisibXMifSl9LF9tYW51YWxNb2RlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZT90aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTp0aGlzLl9hZGRMaXN0ZW5lcnMoKX0sX2NhbmNlbEFuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSk7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKTsKdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIil9LF9vbkFuaW1hdGlvbkZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX3Nob3dpbmcmJih0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImVudHJ5IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSkpfSxfb25BbmltYXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9hbmltYXRpb25QbGF5aW5nPSExO3RoaXMuX3Nob3dpbmd8fCh0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIikpfSxfZ2V0QW5pbWF0aW9uVHlwZTpmdW5jdGlvbihiKXtpZigiZW50cnkiPT09YiYmIiIhPT10aGlzLmFuaW1hdGlvbkVudHJ5KXJldHVybiB0aGlzLmFuaW1hdGlvbkVudHJ5OwppZigiZXhpdCI9PT1iJiYiIiE9PXRoaXMuYW5pbWF0aW9uRXhpdClyZXR1cm4gdGhpcy5hbmltYXRpb25FeGl0O2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdJiYic3RyaW5nIj09PXR5cGVvZiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS5uYW1lKXtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS50aW1pbmcmJnRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdWzBdLnRpbWluZy5kZWxheSYmMCE9PXRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdWzBdLnRpbWluZy5kZWxheSl7dmFyIGQ9dGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0udGltaW5nLmRlbGF5OyJlbnRyeSI9PT1iP3RoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci10b29sdGlwLWRlbGF5LWluIjpkKyJtcyJ9KToiZXhpdCI9PT1iJiZ0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQiOmQrIm1zIn0pfXJldHVybiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS5uYW1lfX0sX3JlbW92ZUxpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmCih0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VlbnRlciIsInNob3ciKSx0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwiZm9jdXMiLCJzaG93IiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsIm1vdXNlbGVhdmUiLCJoaWRlIiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsImJsdXIiLCJoaWRlIiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsInRhcCIsImhpZGUiKSk7dGhpcy51bmxpc3Rlbih0aGlzLiQudG9vbHRpcCwiYW5pbWF0aW9uZW5kIiwiX29uQW5pbWF0aW9uRW5kIik7dGhpcy51bmxpc3Rlbih0aGlzLCJtb3VzZWVudGVyIiwiaGlkZSIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW5vZGUtc2VhcmNoL3RmLWdyYXBoLW5vZGUtc2VhcmNoLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoLW5vZGUtc2VhcmNoIixwcm9wZXJ0aWVzOntyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfcmF3UmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9yZWdleElucHV0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSZWdleElucHV0KHJlbmRlckhpZXJhcmNoeSwgX3Jhd1JlZ2V4SW5wdXQpIn0sX3ByZXZpb3VzUmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9zZWFyY2hUaW1lb3V0RGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjE1MCxyZWFkT25seTohMH0sX3NlYXJjaFBlbmRpbmc6Qm9vbGVhbixfbWF4UmVnZXhSZXN1bHRzOnt0eXBlOk51bWJlcix2YWx1ZTo0Mn0sX3JlZ2V4TWF0Y2hlczpBcnJheX0sb2JzZXJ2ZXJzOlsiX3JlZ2V4SW5wdXRDaGFuZ2VkKF9yZWdleElucHV0KSJdLF9jb21wdXRlUmVnZXhJbnB1dChiLGQpe3JldHVybiBkLnRyaW0oKX0sCl9yZWdleElucHV0Q2hhbmdlZCgpe3RoaXMuX3JlcXVlc3RTZWFyY2goKX0sX2NsZWFyU2VhcmNoUmVzdWx0cygpe3RoaXMuc2V0KCJfcmVnZXhNYXRjaGVzIixbXSl9LF9yZXF1ZXN0U2VhcmNoKCl7dGhpcy5fc2VhcmNoUGVuZGluZ3x8KHRoaXMuX3JlZ2V4SW5wdXQ9PT10aGlzLl9wcmV2aW91c1JlZ2V4SW5wdXQ/dGhpcy5fc2VhcmNoUGVuZGluZz0hMToodGhpcy5fc2VhcmNoUGVuZGluZz0hMCx0aGlzLl9leGVjdXRlU2VhcmNoKCksdGhpcy5hc3luYygoKT0+e3RoaXMuX3NlYXJjaFBlbmRpbmc9ITE7dGhpcy5fcmVxdWVzdFNlYXJjaCgpfSx0aGlzLl9zZWFyY2hUaW1lb3V0RGVsYXkpKSl9LF9leGVjdXRlU2VhcmNoKCl7aWYodGhpcy5fcHJldmlvdXNSZWdleElucHV0PXRoaXMuX3JlZ2V4SW5wdXQpe3RyeXt2YXIgYj1uZXcgUmVnRXhwKHRoaXMuX3JlZ2V4SW5wdXQpfWNhdGNoKGYpe3RoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpO3JldHVybn12YXIgZD1bXTtfLmVhY2godGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5LmdldE5vZGVNYXAoKSwKKGYsaCk9PntpZihkLmxlbmd0aD49dGhpcy5fbWF4UmVnZXhSZXN1bHRzKXJldHVybiExO2IudGVzdChoKSYmZC5wdXNoKGgpfSk7dGhpcy5zZXQoIl9yZWdleE1hdGNoZXMiLGQpfWVsc2UgdGhpcy5fY2xlYXJTZWFyY2hSZXN1bHRzKCl9LF9tYXRjaENsaWNrZWQoYil7dGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsYi5tb2RlbC5pdGVtKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb250cm9scy90Zi1ncmFwaC1jb250cm9scy5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjb25zdCBoPS9kZXZpY2U6KFteOl0rOlswLTldKykkLyxrPVt7cmVnZXg6aH1dLHQ9W107bGV0IGw7KGZ1bmN0aW9uKG0pe20uQ09NUFVURV9USU1FPSJjb21wdXRlX3RpbWUiO20uTUVNT1JZPSJtZW1vcnkiO20uU1RSVUNUVVJFPSJzdHJ1Y3R1cmUiO20uWExBX0NMVVNURVI9InhsYV9jbHVzdGVyIjttLk9QX0NPTVBBVElCSUxJVFk9Im9wX2NvbXBhdGliaWxpdHkifSkobD1mLkNvbG9yQnl8fChmLkNvbG9yQnk9e30pKTtjb25zdCBwPW5ldyBTZXQoW2wuQ09NUFVURV9USU1FLGwuTUVNT1JZXSk7UG9seW1lcih7aXM6InRmLWdyYXBoLWNvbnRyb2xzIixwcm9wZXJ0aWVzOntzdGF0czp7dmFsdWU6bnVsbCx0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3N0YXRzQ2hhbmdlZCJ9LGRldmljZXNGb3JTdGF0czp7dmFsdWU6bnVsbCx0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZG9ubHk6ITB9LGNvbG9yQnk6e3R5cGU6U3RyaW5nLAp2YWx1ZTpsLlNUUlVDVFVSRSxub3RpZnk6ITB9LGNvbG9yQnlQYXJhbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxyZWFkb25seTohMH0sZGF0YXNldHM6e3R5cGU6QXJyYXksb2JzZXJ2ZXI6Il9kYXRhc2V0c0NoYW5nZWQiLHZhbHVlOigpPT5bXX0scmVuZGVySGllcmFyY2h5Ont0eXBlOk9iamVjdH0sc2VsZWN0aW9uOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZE9ubHk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlU2VsZWN0aW9uKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgsIF9zZWxlY3RlZEdyYXBoVHlwZSkifSxzZWxlY3RlZEZpbGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sX3NlbGVjdGVkUnVuSW5kZXg6e3R5cGU6TnVtYmVyLHZhbHVlOjAsb2JzZXJ2ZXI6Il9zZWxlY3RlZFJ1bkluZGV4Q2hhbmdlZCJ9LHRyYWNlSW5wdXRzOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxfc2VsZWN0ZWRUYWdJbmRleDp7dHlwZTpOdW1iZXIsCnZhbHVlOjAsb2JzZXJ2ZXI6Il9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCJ9LF9zZWxlY3RlZEdyYXBoVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIfSxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2N1cnJlbnREZXZpY2VzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0Q3VycmVudERldmljZXMoZGV2aWNlc0ZvclN0YXRzKSJ9LF9jdXJyZW50RGV2aWNlUGFyYW1zOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0Q3VycmVudERldmljZVBhcmFtcyhjb2xvckJ5UGFyYW1zKSJ9LF9jdXJyZW50WGxhQ2x1c3RlclBhcmFtczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnRYbGFDbHVzdGVyUGFyYW1zKGNvbG9yQnlQYXJhbXMpIn0sX2N1cnJlbnRHcmFkaWVudFBhcmFtczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXRDdXJyZW50R3JhZGllbnRQYXJhbXMoY29sb3JCeVBhcmFtcywgY29sb3JCeSkifSwKc2hvd1Nlc3Npb25SdW5zRHJvcGRvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sc2hvd1VwbG9hZEJ1dHRvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxoZWFsdGhQaWxsc0ZlYXR1cmVFbmFibGVkOkJvb2xlYW4saGVhbHRoUGlsbHNUb2dnbGVkT246e3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9LF9sZWdlbmRPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LF94bGFDbHVzdGVyc1Byb3ZpZGVkOmZ1bmN0aW9uKG0pe3JldHVybiBtJiZtLmhpZXJhcmNoeSYmMDxtLmhpZXJhcmNoeS54bGFDbHVzdGVycy5sZW5ndGh9LF9zdGF0c0NoYW5nZWQ6ZnVuY3Rpb24obSl7aWYobnVsbCE9bSl7dmFyIG49e307Xy5lYWNoKG0uZGV2X3N0YXRzLGZ1bmN0aW9uKHEpe3ZhciB1PV8uc29tZShrLGZ1bmN0aW9uKEEpe3JldHVybiBBLnJlZ2V4LnRlc3QocS5kZXZpY2UpfSkseD1fLnNvbWUodCxmdW5jdGlvbihBKXtyZXR1cm4gQS5yZWdleC50ZXN0KHEuZGV2aWNlKX0pO3UmJiF4JiYobltxLmRldmljZV09CiEwKX0pO3RoaXMuc2V0KCJkZXZpY2VzRm9yU3RhdHMiLG4pfX0sX2dldEN1cnJlbnREZXZpY2VzOmZ1bmN0aW9uKG0pe3ZhciBuPXRoaXMuc3RhdHM7bj0obj9uLmRldl9zdGF0czpbXSkubWFwKHU9PnUuZGV2aWNlKS5maWx0ZXIodT0+ay5zb21lKHg9PngucmVnZXgudGVzdCh1KSkpO2NvbnN0IHE9Yi5ncmFwaC51dGlsLnJlbW92ZUNvbW1vblByZWZpeChuKTtpZigxPT1xLmxlbmd0aCl7Y29uc3QgdT1xWzBdLm1hdGNoKGgpO3UmJihxWzBdPXVbMV0pfXJldHVybiBuLm1hcCgodSx4KT0+e2xldCBBPW51bGw7dC5mb3JFYWNoKHk9Pnt5LnJlZ2V4LnRlc3QodSkmJihBPXkubXNnKX0pO3JldHVybntkZXZpY2U6dSxzdWZmaXg6cVt4XSx1c2VkOm1bdV0saWdub3JlZE1zZzpBfX0pfSxfZGV2aWNlQ2hlY2tib3hDbGlja2VkOmZ1bmN0aW9uKG0pe209bS50YXJnZXQ7Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LHRoaXMuZGV2aWNlc0ZvclN0YXRzKSxxPW0udmFsdWU7bS5jaGVja2VkPwpuW3FdPSEwOmRlbGV0ZSBuW3FdO3RoaXMuc2V0KCJkZXZpY2VzRm9yU3RhdHMiLG4pfSxfbnVtVGFnczpmdW5jdGlvbihtLG4pe3JldHVybiB0aGlzLl9nZXRUYWdzKG0sbikubGVuZ3RofSxfZ2V0VGFnczpmdW5jdGlvbihtLG4pe3JldHVybiBtJiZtW25dP21bbl0udGFnczpbXX0sX2ZpdDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZml0LXRhcCIpfSxfaXNHcmFkaWVudENvbG9yaW5nOmZ1bmN0aW9uKG0sbil7cmV0dXJuIHAuaGFzKG4pJiZudWxsIT1tfSxfZXF1YWxzOmZ1bmN0aW9uKG0sbil7cmV0dXJuIG09PT1ufSxfZ2V0Q3VycmVudERldmljZVBhcmFtczpmdW5jdGlvbihtKXttPW0uZGV2aWNlLmZpbHRlcih1PT5rLnNvbWUoeD0+eC5yZWdleC50ZXN0KHUuZGV2aWNlKSkpO2NvbnN0IG49Yi5ncmFwaC51dGlsLnJlbW92ZUNvbW1vblByZWZpeChtLm1hcCh1PT51LmRldmljZSkpO2lmKDE9PW4ubGVuZ3RoKXt2YXIgcT1uWzBdLm1hdGNoKGgpO3EmJihuWzBdPXFbMV0pfXJldHVybiBtLm1hcCgodSwKeCk9Pih7ZGV2aWNlOm5beF0sY29sb3I6dS5jb2xvcn0pKX0sX2dldEN1cnJlbnRYbGFDbHVzdGVyUGFyYW1zOmZ1bmN0aW9uKG0pe3JldHVybiBtLnhsYV9jbHVzdGVyfSxfZ2V0Q3VycmVudEdyYWRpZW50UGFyYW1zOmZ1bmN0aW9uKG0sbil7aWYodGhpcy5faXNHcmFkaWVudENvbG9yaW5nKHRoaXMuc3RhdHMsbikpe209bVtuXTt2YXIgcT1tLm1pblZhbHVlLHU9bS5tYXhWYWx1ZTtuPT09bC5NRU1PUlk/KHE9Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShxLGIuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpLHU9Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZSh1LGIuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpKTpuPT09bC5DT01QVVRFX1RJTUUmJihxPWIuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUocSxiLmdyYXBoLnV0aWwuVElNRV9VTklUUyksdT1iLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKHUsCmIuZ3JhcGgudXRpbC5USU1FX1VOSVRTKSk7cmV0dXJue21pblZhbHVlOnEsbWF4VmFsdWU6dSxzdGFydENvbG9yOm0uc3RhcnRDb2xvcixlbmRDb2xvcjptLmVuZENvbG9yfX19LGRvd25sb2FkOmZ1bmN0aW9uKCl7dGhpcy4kLmdyYXBoZG93bmxvYWQuY2xpY2soKX0sX3VwZGF0ZUZpbGVJbnB1dDpmdW5jdGlvbihtKXt2YXIgbj1tLnRhcmdldC5maWxlc1swXTtpZihuKXtuPW4ubmFtZTt2YXIgcT1uLmxhc3RJbmRleE9mKCIuIik7MDw9cSYmKG49bi5zdWJzdHJpbmcoMCxxKSk7cT1uLmxhc3RJbmRleE9mKCIvIik7MDw9cSYmKG49bi5zdWJzdHJpbmcocSsxKSk7dGhpcy5fc2V0RG93bmxvYWRGaWxlbmFtZShuKTt0aGlzLnNldCgic2VsZWN0ZWRGaWxlIixtKX19LF9kYXRhc2V0c0NoYW5nZWQ6ZnVuY3Rpb24obSxuKXtudWxsIT1uJiYodGhpcy5fc2VsZWN0ZWRSdW5JbmRleD0wKX0sX2NvbXB1dGVTZWxlY3Rpb246ZnVuY3Rpb24obSxuLHEsdSl7cmV0dXJuIG1bbl0mJm1bbl0udGFnc1txXT8Ke3J1bjptW25dLm5hbWUsdGFnOm1bbl0udGFnc1txXS50YWcsdHlwZTp1fTpudWxsfSxfc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQ6ZnVuY3Rpb24obSl7dGhpcy5kYXRhc2V0cyYmKHRoaXMuY29sb3JCeT1sLlNUUlVDVFVSRSx0aGlzLl9zZWxlY3RlZFRhZ0luZGV4PTAsdGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGU9dGhpcy5fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKSx0aGlzLnRyYWNlSW5wdXRzPSExLHRoaXMuX3NldERvd25sb2FkRmlsZW5hbWUodGhpcy5kYXRhc2V0c1ttXT90aGlzLmRhdGFzZXRzW21dLm5hbWU6IiIpKX0sX3NlbGVjdGVkVGFnSW5kZXhDaGFuZ2VkKCl7dGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGU9dGhpcy5fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKX0sX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl7Y29uc3QgbT10aGlzLmRhdGFzZXRzLG49dGhpcy5fc2VsZWN0ZWRSdW5JbmRleCxxPXRoaXMuX3NlbGVjdGVkVGFnSW5kZXg7cmV0dXJuIG0mJm1bbl0mJm1bbl0udGFnc1txXSYmCiFtW25dLnRhZ3NbcV0ub3BHcmFwaD9tW25dLnRhZ3NbcV0ucHJvZmlsZT9iLmdyYXBoLlNlbGVjdGlvblR5cGUuUFJPRklMRTptW25dLnRhZ3NbcV0uY29uY2VwdHVhbEdyYXBoP2IuZ3JhcGguU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIOmIuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSDpiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEh9LF9nZXRGaWxlOmZ1bmN0aW9uKCl7dGhpcy4kJCgiI2ZpbGUiKS5jbGljaygpfSxfc2V0RG93bmxvYWRGaWxlbmFtZTpmdW5jdGlvbihtKXt0aGlzLiQuZ3JhcGhkb3dubG9hZC5zZXRBdHRyaWJ1dGUoImRvd25sb2FkIixtKyIucG5nIil9LF9zdGF0c05vdE51bGw6ZnVuY3Rpb24obSl7cmV0dXJuIG51bGwhPT1tfSxfdG9nZ2xlTGVnZW5kT3Blbigpe3RoaXMuc2V0KCJfbGVnZW5kT3BlbmVkIiwhdGhpcy5fbGVnZW5kT3BlbmVkKX0sX2dldFRvZ2dsZVRleHQobSl7cmV0dXJuIG0/IkNsb3NlIGxlZ2VuZC4iOiJFeHBhbmQgbGVnZW5kLiJ9LApfZ2V0VG9nZ2xlTGVnZW5kSWNvbihtKXtyZXR1cm4gbT8iZXhwYW5kLW1vcmUiOiJleHBhbmQtbGVzcyJ9LF9nZXRTZWxlY3Rpb25PcEdyYXBoRGlzYWJsZWQobSxuLHEpe3JldHVybiFtW25dfHwhbVtuXS50YWdzW3FdfHwhbVtuXS50YWdzW3FdLm9wR3JhcGh9LF9nZXRTZWxlY3Rpb25Qcm9maWxlRGlzYWJsZWQobSxuLHEpe3JldHVybiFtW25dfHwhbVtuXS50YWdzW3FdfHwhbVtuXS50YWdzW3FdLnByb2ZpbGV9LF9nZXRTZWxlY3Rpb25Db25jZXB0dWFsR3JhcGhEaXNhYmxlZChtLG4scSl7cmV0dXJuIW1bbl18fCFtW25dLnRhZ3NbcV18fCFtW25dLnRhZ3NbcV0uY29uY2VwdHVhbEdyYXBofX0pfSkoZC5jb250cm9sc3x8KGQuY29udHJvbHM9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtbG9hZGVyL3RmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIuanMKVWk9dGhpcyYmdGhpcy5fX2F3YWl0ZXJ8fGZ1bmN0aW9uKGIsZCxmLGgpe3JldHVybiBuZXcgKGZ8fChmPVByb21pc2UpKShmdW5jdGlvbihrLHQpe2Z1bmN0aW9uIGwobil7dHJ5e20oaC5uZXh0KG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBwKG4pe3RyeXttKGhbInRocm93Il0obikpfWNhdGNoKHEpe3QocSl9fWZ1bmN0aW9uIG0obil7bi5kb25lP2sobi52YWx1ZSk6KG5ldyBmKGZ1bmN0aW9uKHEpe3Eobi52YWx1ZSl9KSkudGhlbihsLHApfW0oKGg9aC5hcHBseShiLGR8fFtdKSkubmV4dCgpKX0pfTsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlciIsX3RlbXBsYXRlOm51bGwscHJvcGVydGllczp7ZGF0YXNldHM6QXJyYXkscHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sc2VsZWN0aW9uOk9iamVjdCxzZWxlY3RlZEZpbGU6T2JqZWN0LGNvbXBhdGliaWxpdHlQcm92aWRlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBiLmdyYXBoLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcn0saGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+Yi5ncmFwaC5oaWVyYXJjaHkuRGVmYXVsdEhpZXJhcmNoeVBhcmFtc30sb3V0R3JhcGhIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0R3JhcGg6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0U3RhdHM6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sCl9ncmFwaFJ1blRhZzpPYmplY3R9LG9ic2VydmVyczpbIl9zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbiwgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSIsIl9zZWxlY3RlZEZpbGVDaGFuZ2VkKHNlbGVjdGVkRmlsZSwgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSJdLF9zZWxlY3Rpb25DaGFuZ2VkKCl7dGhpcy5kZWJvdW5jZSgic2VsZWN0aW9uY2hhbmdlIiwoKT0+e3RoaXMuX2xvYWQodGhpcy5zZWxlY3Rpb24pfSl9LF9sb2FkOmZ1bmN0aW9uKGYpe2NvbnN0IGg9Zi5ydW4saz1mLnRhZztmPWYudHlwZTtzd2l0Y2goZil7Y2FzZSBiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEg6Y2FzZSBiLmdyYXBoLlNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSDp0aGlzLl9zZXRPdXRTdGF0cyhudWxsKTt2YXIgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3Quc2V0KCJydW4iLGgpO3Quc2V0KCJjb25jZXB0dWFsIixTdHJpbmcoZj09PWIuZ3JhcGguU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIKSk7CmsmJnQuc2V0KCJ0YWciLGspO2Y9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ncmFwaCIsdCk7cmV0dXJuIHRoaXMuX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZikudGhlbigoKT0+e3RoaXMuX2dyYXBoUnVuVGFnPXtydW46aCx0YWc6a319KTtjYXNlIGIuZ3JhcGguU2VsZWN0aW9uVHlwZS5QUk9GSUxFOnsoe3RhZ3M6Zn09dGhpcy5kYXRhc2V0cy5maW5kKCh7bmFtZTptfSk9Pm09PT1oKSk7Y29uc3QgbD1mLmZpbmQobT0+bS50YWc9PT1rKS5vcEdyYXBoP2s6bnVsbDtjb25zb2xlLmFzc2VydChmLmZpbmQobT0+bS50YWc9PT1sKSxgUmVxdWlyZWQgdGFnICgke2x9KSBpcyBtaXNzaW5nLmApO2Y9dGhpcy5fZ3JhcGhSdW5UYWcmJnRoaXMuX2dyYXBoUnVuVGFnLnJ1bj09PWgmJnRoaXMuX2dyYXBoUnVuVGFnLnRhZz09PWw/UHJvbWlzZS5yZXNvbHZlKCk6dGhpcy5fbG9hZCh7cnVuOmgsdGFnOmwsdHlwZTpiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEh9KTsKdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3Quc2V0KCJ0YWciLGspO3Quc2V0KCJydW4iLGgpO2NvbnN0IHA9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ydW5fbWV0YWRhdGEiLHQpO3JldHVybiBmLnRoZW4oKCk9PnRoaXMuX3JlYWRBbmRQYXJzZU1ldGFkYXRhKHApKX1kZWZhdWx0OnJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcihgVW5rbm93biBzZWxlY3Rpb24gdHlwZTogJHtmfWApKX19LF9yZWFkQW5kUGFyc2VNZXRhZGF0YTpmdW5jdGlvbihmKXt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pO2IuZ3JhcGgucGFyc2VyLmZldGNoQW5kUGFyc2VNZXRhZGF0YShmLGIuZ3JhcGgudXRpbC5nZXRUcmFja2VyKHRoaXMpKS50aGVuKGg9Pnt0aGlzLl9zZXRPdXRTdGF0cyhoKX0pfSxfZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaDpmdW5jdGlvbihmLGgpe3JldHVybiBVaSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7dGhpcy5zZXQoInByb2dyZXNzIiwKe3ZhbHVlOjAsbXNnOiIifSk7cmV0dXJuIGIuZ3JhcGgubG9hZGVyLmZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoYi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcyksZixoLHRoaXMuY29tcGF0aWJpbGl0eVByb3ZpZGVyLHRoaXMuaGllcmFyY2h5UGFyYW1zKS50aGVuKCh7Z3JhcGg6ayxncmFwaEhpZXJhcmNoeTp0fSk9Pnt0aGlzLl9zZXRPdXRHcmFwaChrKTt0aGlzLl9zZXRPdXRHcmFwaEhpZXJhcmNoeSh0KX0pfSl9LF9zZWxlY3RlZEZpbGVDaGFuZ2VkOmZ1bmN0aW9uKGYpe2lmKGYpe2Y9Zi50YXJnZXQ7dmFyIGg9Zi5maWxlc1swXTtoJiYoZi52YWx1ZT0iIix0aGlzLl9mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKG51bGwsaCkpfX19KX0pKGQubG9hZGVyfHwoZC5sb2FkZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtZGFzaGJvYXJkL3RmLWdyYXBoLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19kYXRhc2V0czp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9kYXRhc2V0c0ZldGNoZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3NlbGVjdGVkRGF0YXNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3JlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX2RlYnVnZ2VyRGF0YUVuYWJsZWQ6Qm9vbGVhbixhbGxTdGVwc01vZGVFbmFibGVkOkJvb2xlYW4sc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saGVhbHRoUGlsbHNUb2dnbGVkT246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZCJ9LApzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2lzQXR0YWNoZWQ6Qm9vbGVhbixfaW5pdGlhbGl6ZWQ6Qm9vbGVhbixfYXJlSGVhbHRoUGlsbHNMb2FkaW5nOkJvb2xlYW4sX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0czp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LF9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2hlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLF9oZWFsdGhQaWxsUmVxdWVzdElkOnt0eXBlOk51bWJlcix2YWx1ZToxfSxfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZDpOdW1iZXIsX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVyRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMCxyZWFkT25seTohMH0scnVuczpBcnJheSxydW46e3R5cGU6U3RyaW5nLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXRTdHJpbmdJbml0aWFsaXplcigicnVuIix7ZGVmYXVsdFZhbHVlOiIiLHVzZUxvY2FsU3RvcmFnZTohMX0pLG9ic2VydmVyOiJfcnVuT2JzZXJ2ZXIifSwKX3NlbGVjdGlvbjp7dHlwZTpPYmplY3R9LF9jb21wYXRpYmlsaXR5UHJvdmlkZXI6T2JqZWN0LF90cmFjZUlucHV0czpCb29sZWFufSxsaXN0ZW5lcnM6eyJub2RlLXRvZ2dsZS1leHBhbmQiOiJfaGFuZGxlTm9kZVRvZ2dsZUV4cGFuZCJ9LG9ic2VydmVyczpbIl9tYXliZUZldGNoSGVhbHRoUGlsbHMoX2RlYnVnZ2VyRGF0YUVuYWJsZWQsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIHNwZWNpZmljSGVhbHRoUGlsbFN0ZXAsIF9zZWxlY3RlZE5vZGUpIiwiX21heWJlSW5pdGlhbGl6ZURhc2hib2FyZChfaXNBdHRhY2hlZCkiLCJfZGV0ZXJtaW5lU2VsZWN0ZWREYXRhc2V0KF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgcnVuKSIsIl91cGRhdGVTZWxlY3RlZERhdGFzZXROYW1lKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgX3NlbGVjdGVkRGF0YXNldCkiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsCiExKX0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5fZGVidWdnZXJEYXRhRW5hYmxlZHx8dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShiPT57Yi5jYW5jZWxsZWR8fGIudmFsdWVbImRlYnVnZ2VyIl0mJnRoaXMuc2V0KCJfZGVidWdnZXJEYXRhRW5hYmxlZCIsITApfSkpO3RoaXMuX21heWJlRmV0Y2hIZWFsdGhQaWxscygpfSxfZml0OmZ1bmN0aW9uKCl7dGhpcy4kJCgiI2dyYXBoYm9hcmQiKS5maXQoKX0sX3J1bk9ic2VydmVyOnBkLmdldFN0cmluZ09ic2VydmVyKCJydW4iLHtkZWZhdWx0VmFsdWU6IiIscG9seW1lclByb3BlcnR5OiJydW4iLHVzZUxvY2FsU3RvcmFnZTohMX0pLF9mZXRjaERhdGFzZXQoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2luZm8iKSl9LF9mZXRjaEhlYWx0aFBpbGxzKGIsCmQpe2I9e25vZGVfbmFtZXM6SlNPTi5zdHJpbmdpZnkoYikscnVuOiJfX2RlYnVnZ2VyX2RhdGFfXyJ9O3ZvaWQgMCE9PWQmJihiLnN0ZXA9ZCk7ZD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvaGVhbHRoX3BpbGxzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZCxiKX0sX2ZldGNoRGVidWdnZXJOdW1lcmljc0FsZXJ0cygpe3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9udW1lcmljc19hbGVydF9yZXBvcnQiKSl9LF9ncmFwaFVybChiLGQsZil7cmV0dXJuIHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvZ3JhcGgiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3J1bjpiLGxpbWl0X2F0dHJfc2l6ZTpkLGxhcmdlX2F0dHJzX2tleTpmfSkpfSxfc2hvdWxkUmVxdWVzdEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWQmJgp0aGlzLmhlYWx0aFBpbGxzVG9nZ2xlZE9uJiZ0aGlzLl9yZW5kZXJIaWVyYXJjaHkmJnRoaXMuX2RhdGFzZXRzU3RhdGUodGhpcy5fZGF0YXNldHNGZXRjaGVkLHRoaXMuX2RhdGFzZXRzLCJQUkVTRU5UIil9LF9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQ6ZnVuY3Rpb24oYil7IXRoaXMuX2luaXRpYWxpemVkJiZiJiYodGhpcy5zZXQoIl9jb21wYXRpYmlsaXR5UHJvdmlkZXIiLG5ldyB0Zi5ncmFwaC5vcC5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXIpLHRoaXMuX2luaXRpYWxpemVkPSEwLHRoaXMuX2ZldGNoRGF0YXNldCgpLnRoZW4oZD0+e3RoaXMuX2RhdGFzZXRzPU9iamVjdC5rZXlzKGQpLnNvcnQocmMuY29tcGFyZVRhZ05hbWVzKS5tYXAoZj0+e2NvbnN0IGg9ZFtmXTt2YXIgaz1PYmplY3Qua2V5cyhoLnRhZ3MpLnNvcnQocmMuY29tcGFyZVRhZ05hbWVzKS5tYXAodD0+aC50YWdzW3RdKS5tYXAoKHt0YWc6dCxjb25jZXB0dWFsX2dyYXBoOmwsb3BfZ3JhcGg6cCxwcm9maWxlOm19KT0+Cih7dGFnOnQsZGlzcGxheU5hbWU6dCxjb25jZXB0dWFsR3JhcGg6bCxvcEdyYXBoOnAscHJvZmlsZTptfSkpO2s9aC5ydW5fZ3JhcGg/W3t0YWc6bnVsbCxkaXNwbGF5TmFtZToiRGVmYXVsdCIsY29uY2VwdHVhbEdyYXBoOiExLG9wR3JhcGg6ITAscHJvZmlsZTohMX0sLi4ua106aztyZXR1cm57bmFtZTpmLHRhZ3M6a319KTt0aGlzLl9kYXRhc2V0c0ZldGNoZWQ9ITB9KSl9LF9kZXRlcm1pbmVTZWxlY3RlZERhdGFzZXQoYixkLGYpe2Y/KGQ9ZC5maW5kSW5kZXgoaD0+aC5uYW1lPT09ZiksLTE9PT1kP2ImJihiPXRoaXMuJCQoIiNlcnJvci1kaWFsb2ciKSxiLnRleHRDb250ZW50PWBObyBkYXRhc2V0IG5hbWVkICIke2Z9IiBjb3VsZCBiZSBmb3VuZC5gLGIub3BlbigpKTp0aGlzLnNldCgiX3NlbGVjdGVkRGF0YXNldCIsZCkpOnRoaXMuc2V0KCJfc2VsZWN0ZWREYXRhc2V0IiwwKX0sX3VwZGF0ZVNlbGVjdGVkRGF0YXNldE5hbWUoYixkLGYpe2ImJihkLmxlbmd0aDw9Znx8dGhpcy5zZXQoInJ1biIsCmRbZl0ubmFtZSkpfSxfcmVxdWVzdEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9hcmVIZWFsdGhQaWxsc0xvYWRpbmciLCEwKTt2YXIgYj0rK3RoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQ7bnVsbCE9PXRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQpLHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9bnVsbCk7dGhpcy5hbGxTdGVwc01vZGVFbmFibGVkP3RoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9bnVsbDt0aGlzLl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHMoYil9LmJpbmQodGhpcyksdGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJEZWxheSk6dGhpcy5faW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzKGIpfSwKX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxsczpmdW5jdGlvbihiKXtpZih0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkPT09Yil7dmFyIGQ9dGhpcy5fZmV0Y2hIZWFsdGhQaWxscyh0aGlzLl9yZW5kZXJIaWVyYXJjaHkuZ2V0TmFtZXNPZlJlbmRlcmVkT3BzKCksdGhpcy5hbGxTdGVwc01vZGVFbmFibGVkP3RoaXMuc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp2b2lkIDApLGY9dGhpcy5fZmV0Y2hEZWJ1Z2dlck51bWVyaWNzQWxlcnRzKCk7UHJvbWlzZS5hbGwoW2QsZl0pLnRoZW4oZnVuY3Rpb24oaCl7dmFyIGs9aFswXTtoPWhbMV07aWYodGhpcy5oZWFsdGhQaWxsc1RvZ2dsZWRPbiYmYj09PXRoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQpe2Zvcih2YXIgdCBpbiBrKXt0aGlzLnNldCgiX2hlYWx0aFBpbGxTdGVwSW5kZXgiLGtbdF0ubGVuZ3RoLTEpO2JyZWFrfXRoaXMuc2V0KCJfZGVidWdnZXJOdW1lcmljQWxlcnRzIixoKTt0aGlzLnNldCgiX25vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLAprKTt0aGlzLnNldCgiX2FyZUhlYWx0aFBpbGxzTG9hZGluZyIsITEpO3RoaXMuc2V0KCJfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCIsbnVsbCl9fS5iaW5kKHRoaXMpKX19LF9kYXRhc2V0c1N0YXRlOmZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4gYj9kJiZkLmxlbmd0aD8iUFJFU0VOVCI9PT1mOiJFTVBUWSI9PT1mOiJOT1RfTE9BREVEIj09PWZ9LF9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5yZWxvYWQoKX0sX2hhbmRsZU5vZGVUb2dnbGVFeHBhbmQ6ZnVuY3Rpb24oKXt0aGlzLl9tYXliZUZldGNoSGVhbHRoUGlsbHMoKX0sX2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZDpmdW5jdGlvbihiKXtiP3RoaXMucmVsb2FkKCk6dGhpcy5zZXQoIl9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix7fSl9LF9tYXliZUZldGNoSGVhbHRoUGlsbHM6ZnVuY3Rpb24oKXt0aGlzLl9zaG91bGRSZXF1ZXN0SGVhbHRoUGlsbHMoKSYmdGhpcy5fcmVxdWVzdEhlYWx0aFBpbGxzKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotZGlzdHJpYnV0aW9uLWNoYXJ0L3Z6LWRpc3RyaWJ1dGlvbi1jaGFydC5qcwp2YXIgSms7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGYsaCl7dGhpcy5ydW4yZGF0YXNldHM9e307dGhpcy5jb2xvclNjYWxlPWg7dGhpcy5idWlsZENoYXJ0KGYpfWdldERhdGFzZXQoZil7dm9pZCAwPT09dGhpcy5ydW4yZGF0YXNldHNbZl0mJih0aGlzLnJ1bjJkYXRhc2V0c1tmXT1uZXcgUGxvdHRhYmxlLkRhdGFzZXQoW10se3J1bjpmfSkpO3JldHVybiB0aGlzLnJ1bjJkYXRhc2V0c1tmXX1idWlsZENoYXJ0KGYpe3RoaXMub3V0ZXImJnRoaXMub3V0ZXIuZGVzdHJveSgpO2Y9cmcuZ2V0WENvbXBvbmVudHMoZik7dGhpcy54QWNjZXNzb3I9Zi5hY2Nlc3Nvcjt0aGlzLnhTY2FsZT1mLnNjYWxlO3RoaXMueEF4aXM9Zi5heGlzO3RoaXMueEF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoMyk7dGhpcy55U2NhbGU9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3RoaXMueUF4aXM9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModGhpcy55U2NhbGUsImxlZnQiKTtmPQpyZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OKTt0aGlzLnlBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDUpLmZvcm1hdHRlcihmKTt0aGlzLnlBeGlzLnVzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uKCk7Zj10aGlzLmJ1aWxkUGxvdCh0aGlzLnhBY2Nlc3Nvcix0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7dGhpcy5ncmlkbGluZXM9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyaWRsaW5lcyh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7dGhpcy5jZW50ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKFt0aGlzLmdyaWRsaW5lcyxmXSk7dGhpcy5vdXRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdChmLGgsayl7bGV0IHQ9WzAsMjI4LDE1ODcsMzA4NSw1RTMsNjkxNSw4NDEzLDk3NzIsMUU0XSxsPV8ucmFuZ2UodC5sZW5ndGgtCjEpLm1hcCh1PT4odFt1KzFdLXRbdV0pLzI1MDApLHA9dC5tYXAoKHUseCk9PkE9PkFbeF1bMV0pLG09cFs0XSxuPV8ucmFuZ2UocC5sZW5ndGgtMSkubWFwKHU9PntsZXQgeD1uZXcgUGxvdHRhYmxlLlBsb3RzLkFyZWE7eC54KGYsaCk7bGV0IEE9NDx1P3BbdV06cFt1KzFdO3gueSg0PHU/cFt1KzFdOnBbdV0sayk7eC55MChBKTt4LmF0dHIoImZpbGwiLCh5LHcsQyk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShDLm1ldGFkYXRhKCkucnVuKSk7eC5hdHRyKCJzdHJva2UiLCh5LHcsQyk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShDLm1ldGFkYXRhKCkucnVuKSk7eC5hdHRyKCJzdHJva2Utd2VpZ2h0IiwoKT0+IjAuNXB4Iik7eC5hdHRyKCJzdHJva2Utb3BhY2l0eSIsKCk9PmxbdV0pO3guYXR0cigiZmlsbC1vcGFjaXR5IiwoKT0+bFt1XSk7cmV0dXJuIHh9KSxxPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtxLngoZixoKTtxLnkobSxrKTtxLmF0dHIoInN0cm9rZSIsKHUseCxBKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKEEucnVuKSk7CnRoaXMucGxvdHM9bjtyZXR1cm4gbmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKG4pfXNldFZpc2libGVTZXJpZXMoZil7dGhpcy5ydW5zPWY7bGV0IGg9Zi5tYXAoaz0+dGhpcy5nZXREYXRhc2V0KGspKTt0aGlzLnBsb3RzLmZvckVhY2goaz0+ay5kYXRhc2V0cyhoKSl9c2V0U2VyaWVzRGF0YShmLGgpe3RoaXMuZ2V0RGF0YXNldChmKS5kYXRhKGgpfXJlbmRlclRvKGYpe3RoaXMudGFyZ2V0U1ZHPWY7dGhpcy5vdXRlci5yZW5kZXJUbyhmKX1yZWRyYXcoKXt0aGlzLm91dGVyLnJlZHJhdygpfWRlc3Ryb3koKXt0aGlzLm91dGVyLmRlc3Ryb3koKX19Yi5EaXN0cmlidXRpb25DaGFydD1kO1BvbHltZXIoe2lzOiJ2ei1kaXN0cmlidXRpb24tY2hhcnQiLHByb3BlcnRpZXM6e2NvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yKS5yYW5nZShkMy5zY2hlbWVDYXRlZ29yeTEwKX19LHhUeXBlOnt0eXBlOlN0cmluZywKdmFsdWU6InN0ZXAifSxfYXR0YWNoZWQ6Qm9vbGVhbixfY2hhcnQ6T2JqZWN0LF92aXNpYmxlU2VyaWVzQ2FjaGU6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9zZXJpZXNEYXRhQ2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fSxfbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX21ha2VDaGFydCh4VHlwZSwgY29sb3JTY2FsZSwgX2F0dGFjaGVkKSIsIl9yZWxvYWRGcm9tQ2FjaGUoX2NoYXJ0KSJdLHNldFZpc2libGVTZXJpZXM6ZnVuY3Rpb24oZil7dGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlPWY7dGhpcy5fY2hhcnQmJih0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKGYpLHRoaXMucmVkcmF3KCkpfSxzZXRTZXJpZXNEYXRhOmZ1bmN0aW9uKGYsaCl7dGhpcy5fc2VyaWVzRGF0YUNhY2hlW2ZdPWg7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoZiwKaCl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0LnJlZHJhdygpfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5jaGFydGRpdiwhMCl9LF9tYWtlQ2hhcnQ6ZnVuY3Rpb24oZixoLGspe251bGw9PT10aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQmJnRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKTt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsO2lmKGspe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5kZXN0cm95KCk7dmFyIHQ9bmV3IGQoZixoKSxsPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnRkaXYpO3QucmVuZGVyVG8obCk7dGhpcy5fY2hhcnQ9dH19LDM1MCl9LF9yZWxvYWRGcm9tQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlKSwKdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZvckVhY2goZnVuY3Rpb24oZil7dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShmLHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtmXXx8W10pfS5iaW5kKHRoaXMpKSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITB9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITF9fSl9KShKa3x8KEprPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC90Zi1kaXN0cmlidXRpb24tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyx0YWdNZXRhZGF0YTpPYmplY3QseFR5cGU6U3RyaW5nLGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGF0YVRvTG9hZChydW4sIHRhZykifSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7cnVuOmJ9KT0+Yn0sZ2V0RGF0YUxvYWRVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7dGFnOmIscnVuOmR9KT0+dmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkaXN0cmlidXRpb25zIiwiL2Rpc3RyaWJ1dGlvbnMiKSx7dGFnOmIscnVuOmR9KX0sbG9hZERhdGFDYWxsYmFjazp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihiLGQsZik9PntiPWYubWFwKGg9Pntjb25zdCBbayx0LGxdPWg7bC53YWxsX3RpbWU9bmV3IERhdGUoMUUzKmspO2wuc3RlcD10O3JldHVybiBsfSk7CmQ9dGhpcy5nZXREYXRhTG9hZE5hbWUoZCk7dGhpcy4kLmNoYXJ0LnNldFNlcmllc0RhdGEoZCxiKTt0aGlzLiQuY2hhcnQuc2V0VmlzaWJsZVNlcmllcyhbZF0pfX19LF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHtzY2FsZTpwZi5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZykiXSxiZWhhdmlvcnM6W3FkLkRhdGFMb2FkZXJCZWhhdmlvcl0sX2NvbXB1dGVEYXRhVG9Mb2FkKGIsZCl7cmV0dXJuW3tydW46Yix0YWc6ZH1dfSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnNjYWxlKGIpfSwKcmVkcmF3KCl7dGhpcy4kLmNoYXJ0LnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC90Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e194VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWREaXN0cmlidXRpb25zKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRpc3RyaWJ1dGlvbnMiLAoiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxrPT5PYmplY3Qua2V5cyhrKSksaD12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09aC5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWciLGYpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkRGlzdHJpYnV0aW9ucygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1kaXN0cmlidXRpb24tbG9hZGVyIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtyZXR1cm4gJGMuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhiLGQsZil9LF90YWdNZXRhZGF0YShiLApkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzL3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLmh0bWwuanMKUG9seW1lcih7aXM6InZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToib2Zmc2V0In0sdGltZVByb3BlcnR5Ont0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LGJpbnM6e3R5cGU6U3RyaW5nLHZhbHVlOiJiaW5zIn0seDp7dHlwZTpTdHJpbmcsdmFsdWU6IngifSxkeDp7dHlwZTpTdHJpbmcsdmFsdWU6ImR4In0seTp7dHlwZTpTdHJpbmcsdmFsdWU6InkifSxjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkMy5zY2FsZU9yZGluYWwoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSxtb2RlVHJhbnNpdGlvbkR1cmF0aW9uOnt0eXBlOk51bWJlcix2YWx1ZTo1MDB9LF9hdHRhY2hlZDpCb29sZWFuLF9uYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfZGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsicmVkcmF3KHRpbWVQcm9wZXJ0eSwgX2F0dGFjaGVkKSIsIl9tb2RlUmVkcmF3KG1vZGUpIl0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLnN2ZywhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITB9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITF9LHNldFNlcmllc0RhdGE6ZnVuY3Rpb24oYixkKXt0aGlzLl9uYW1lPWI7dGhpcy5fZGF0YT1kO3RoaXMucmVkcmF3KCl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2RyYXcoMCl9LF9tb2RlUmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fZHJhdyh0aGlzLm1vZGVUcmFuc2l0aW9uRHVyYXRpb24pfSxfZHJhdzpmdW5jdGlvbihiKXtpZih0aGlzLl9hdHRhY2hlZCYmdGhpcy5fZGF0YSl7aWYodm9pZCAwPT09Yil0aHJvdyBFcnJvcigidnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgX2RyYXcgbmVlZHMgZHVyYXRpb24iKTtpZigwPj10aGlzLl9kYXRhLmxlbmd0aCl0aHJvdyBFcnJvcigiTm90IGVub3VnaCBzdGVwcyBpbiB0aGUgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdLmhhc093blByb3BlcnR5KHRoaXMuYmlucykpdGhyb3cgRXJyb3IoIk5vIGJpbnMgcHJvcGVydHkgb2YgJyIrCnRoaXMuYmlucysiJyBpbiBkYXRhIik7aWYoMD49dGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdLmxlbmd0aCl0aHJvdyBFcnJvcigiTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBiaW4gaW4gYmlucyBpbiBkYXRhIik7aWYoIXRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLngpKXRocm93IEVycm9yKCJObyB4IHByb3BlcnR5ICciK3RoaXMueCsiJyBvbiBiaW5zIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMuZHgpKXRocm93IEVycm9yKCJObyBkeCBwcm9wZXJ0eSAnIit0aGlzLmR4KyInIG9uIGJpbnMgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy55KSl0aHJvdyBFcnJvcigiTm8geSBwcm9wZXJ0eSAnIit0aGlzLnkrIicgb24gYmlucyBkYXRhIik7dmFyIGQ9dGhpcy50aW1lUHJvcGVydHksZj10aGlzLngsaD10aGlzLmJpbnMsaz10aGlzLmR4LAp0PXRoaXMueSxsPXRoaXMuX2RhdGEscD10aGlzLm1vZGUsbT1kMy5oY2wodGhpcy5jb2xvclNjYWxlKHRoaXMuX25hbWUpKSxuPWQzLnNlbGVjdCh0aGlzLiQudG9vbHRpcCkscT1mdW5jdGlvbih5YSl7cmV0dXJuIHlhW2ZdfSx1PWZ1bmN0aW9uKHlhKXtyZXR1cm4geWFbdF19LHg9ZnVuY3Rpb24oeWEpe3JldHVybiB5YVtmXSt5YVtrXX0sQT1mdW5jdGlvbih5YSl7cmV0dXJuIHlhW2RdfTsicmVsYXRpdmUiPT09ZCYmKEE9ZnVuY3Rpb24oeWEpe3JldHVybiB5YS53YWxsX3RpbWUtbFswXS53YWxsX3RpbWV9KTt2YXIgeT10aGlzLiQuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHc9eS53aWR0aCxDPXkuaGVpZ2h0LEc9NTtpZigib2Zmc2V0Ij09PXApe3ZhciBEPUMvMi41O0c9RCs1fWVsc2UgRD1DLUctMjA7dmFyIEI9dy0yNC02MCxJPUMtRy0yMDtkMy5taW4obCxxKTtkMy5tYXgobCx4KTt2YXIgTj1kMy5mb3JtYXQoIi4zbiIpO3k9ZDMuZm9ybWF0KCIuMGYiKTsid2FsbF90aW1lIj09PQpkP3k9ZDMudGltZUZvcm1hdCgiJW0vJWQgJVgiKToicmVsYXRpdmUiPT09ZCYmKHk9ZnVuY3Rpb24oeWEpe3JldHVybiBkMy5mb3JtYXQoIi4xciIpKHlhLzM2RTUpKyJoIn0pO3ZhciBPPWwubWFwKGZ1bmN0aW9uKHlhKXtyZXR1cm5bZDMubWluKHlhW2hdLHEpLGQzLm1heCh5YVtoXSx4KV19KSxIPWwubWFwKGZ1bmN0aW9uKHlhKXtyZXR1cm4gZDMuZXh0ZW50KHlhW2hdLHUpfSksSz1kMy5leHRlbnQobCxBKSxNPSgid2FsbF90aW1lIj09PWQ/ZDMuc2NhbGVUaW1lKCk6ZDMuc2NhbGVMaW5lYXIoKSkuZG9tYWluKEspLnJhbmdlKFswLCJvZmZzZXQiPT09cD9JOjBdKSxMPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLGQzLm1heChsLGZ1bmN0aW9uKHlhLFNhKXtyZXR1cm4gSFtTYV1bMV19KV0pLnJhbmdlKFtELDBdKSxRPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKEwuZG9tYWluKCkpLnJhbmdlKFs1MDAsMF0pLFQ9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW2QzLm1pbihsLGZ1bmN0aW9uKHlhLApTYSl7cmV0dXJuIE9bU2FdWzBdfSksZDMubWF4KGwsZnVuY3Rpb24oeWEsU2Epe3JldHVybiBPW1NhXVsxXX0pXSkubmljZSgpLnJhbmdlKFswLEJdKSxYPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFQuZG9tYWluKCkpLnJhbmdlKFswLDUwMF0pLGFhPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGQzLmV4dGVudChsLEEpKS5yYW5nZShbbS5kYXJrZXIoKSxtLmJyaWdodGVyKCldKS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZUhjbCk7bT1kMy5heGlzQm90dG9tKFQpLnRpY2tzKCk7dmFyIGxhPWQzLmF4aXNSaWdodChNKS50aWNrcygpLnRpY2tGb3JtYXQoeSksWj1kMy5heGlzUmlnaHQoTCkudGlja3MoKS50aWNrU2l6ZShCKzUpLnRpY2tGb3JtYXQoTiksYmE9ZnVuY3Rpb24oeWEpe3JldHVybiB5YVtmXSt5YVtrXS8yfSxlYT1kMy5saW5lKCkueChmdW5jdGlvbih5YSl7cmV0dXJuIFgoYmEoeWEpKX0pLnkoZnVuY3Rpb24oeWEpe3JldHVybiBRKHlhW3RdKX0pLGNhPWZ1bmN0aW9uKHlhKXtyZXR1cm4iTSIrClgoYmEoeWFbMF0pKSsiLCIrUSgwKSsiTCIrZWEoeWEpLnNsaWNlKDEpKyJMIitYKGJhKHlhW3lhLmxlbmd0aC0xXSkpKyIsIitRKDApfSxrYT10aGlzLiQuc3ZnO3k9ZDMuc2VsZWN0KGthKTtiPXkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGIpO3k9eS5zZWxlY3QoImciKS5jbGFzc2VkKCJzbWFsbCIsZnVuY3Rpb24oKXtyZXR1cm4gMDxCJiYxNTA+PUJ9KS5jbGFzc2VkKCJtZWRpdW0iLGZ1bmN0aW9uKCl7cmV0dXJuIDE1MDxCJiYzMDA+PUJ9KS5jbGFzc2VkKCJsYXJnZSIsZnVuY3Rpb24oKXtyZXR1cm4gMzAwPEJ9KTtiPWIuc2VsZWN0KCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDI0LCIrRysiKSIpO3ZhciBZPWQzLmJpc2VjdG9yKHgpLmxlZnQ7Sz15LnNlbGVjdCgiLnN0YWdlIikub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YS5zdHlsZSgib3BhY2l0eSIsMSk7eGEuc3R5bGUoIm9wYWNpdHkiLDEpO0FhLnN0eWxlKCJvcGFjaXR5IiwxKTtGYS5zdHlsZSgib3BhY2l0eSIsCjEpO24uc3R5bGUoIm9wYWNpdHkiLDEpfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhLnN0eWxlKCJvcGFjaXR5IiwwKTt4YS5zdHlsZSgib3BhY2l0eSIsMCk7QWEuc3R5bGUoIm9wYWNpdHkiLDApO0ZhLnN0eWxlKCJvcGFjaXR5IiwwKTt2YS5jbGFzc2VkKCJob3Zlci1jbG9zZXN0IiwhMSk7RWEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsITEpO24uc3R5bGUoIm9wYWNpdHkiLDApfSkub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24oKXtmdW5jdGlvbiB5YShBYil7cmV0dXJuIE1hdGgubWluKEFiW2hdLmxlbmd0aC0xLFkoQWJbaF0sWGEpKX12YXIgU2E9ZDMubW91c2UodGhpcyksWGE9VC5pbnZlcnQoU2FbMF0pO00uaW52ZXJ0KFNhWzFdKTt2YXIgdWIsQmI9SW5maW5pdHkscWI7dmEuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihBYil7dmFyIEhiPXlhKEFiKTtxYj1BYjt2YXIgaWM9VChBYltoXVtIYl1bZl0rQWJbaF1bSGJdW2tdLzIpO0hiPUwoQWJbaF1bSGJdW3RdKTt2YXIgYmM9CiJvZmZzZXQiPT09cD9NKEEoQWIpKS0oRC1IYik6SGI7YmM9TWF0aC5hYnMoU2FbMV0tYmMpO2JjPEJiJiYoQmI9YmMsdWI9QWIpO3JldHVybiJ0cmFuc2xhdGUoIitpYysiLCIrSGIrIikifSk7dmEuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbihBYil7dmFyIEhiPXlhKEFiKTtyZXR1cm4gQWJbaF1bSGJdW3RdfSk7dmEuY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsZnVuY3Rpb24oQWIpe3JldHVybiBBYj09PXVifSk7RWEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsZnVuY3Rpb24oQWIpe3JldHVybiBBYj09PXVifSk7dmFyIHpiPXlhKHFiKTt4YS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK1QocWJbaF1bemJdW2ZdK3FiW2hdW3piXVtrXS8yKSsiLCAiK0krIikifSkuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBOKHFiW2hdW3piXVtmXStxYltoXVt6Yl1ba10vMil9KTt2YXIgdmI9bGEudGlja0Zvcm1hdCgpO0FhLmF0dHIoInRyYW5zZm9ybSIsCmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wP00oQSh1YikpOjApKyIpIn0pLnN0eWxlKCJkaXNwbGF5Iiwib2Zmc2V0Ij09PXA/IiI6Im5vbmUiKS5zZWxlY3QoInRleHQiKS50ZXh0KGZ1bmN0aW9uKCl7cmV0dXJuIHZiKEEodWIpKX0pO3ZhciBHYj1aLnRpY2tGb3JtYXQoKTtGYS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wPzA6TCh1YltoXVt6Yl1bdF0pKSsiKSJ9KS5zdHlsZSgiZGlzcGxheSIsIm9mZnNldCI9PT1wPyJub25lIjoiIikuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBHYih1YltoXVt6Yl1bdF0pfSk7dmFyIE5iPWQzLm1vdXNlKGthKTtuLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisoTmJbMF0rMTUpKyJweCwiKyhOYlsxXS0xNSkrInB4KSIpLnNlbGVjdCgic3BhbiIpLnRleHQoIm9mZnNldCI9PT1wP0diKHViW2hdW3piXVt0XSk6Cigic3RlcCI9PT1kPyJzdGVwICI6IiIpK3ZiKEEodWIpKSl9KTtLLnNlbGVjdCgiLmJhY2tncm91bmQiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoLTI0LCIrLUcrIikiKS5hdHRyKCJ3aWR0aCIsdykuYXR0cigiaGVpZ2h0IixDKTtDPUsuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuZGF0YShsKTtDLmV4aXQoKS5yZW1vdmUoKTt3PUMuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImhpc3RvZ3JhbSIpO0M9dy5tZXJnZShDKS5zb3J0KGZ1bmN0aW9uKHlhLFNhKXtyZXR1cm4gQSh5YSktQShTYSl9KTtHPWIuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih5YSl7cmV0dXJuInRyYW5zbGF0ZSgwLCAiKygib2Zmc2V0Ij09PXA/TShBKHlhKSktRDowKSsiKSJ9KTt3LmFwcGVuZCgibGluZSIpLmF0dHIoImNsYXNzIiwiYmFzZWxpbmUiKTtHLnNlbGVjdCgiLmJhc2VsaW5lIikuc3R5bGUoInN0cm9rZS1vcGFjaXR5IixmdW5jdGlvbigpe3JldHVybiJvZmZzZXQiPT09CnA/LjE6MH0pLmF0dHIoInkxIixEKS5hdHRyKCJ5MiIsRCkuYXR0cigieDIiLEIpO3cuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJvdXRsaW5lIik7dmFyIEVhPUMuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInZlY3Rvci1lZmZlY3QiLCJub24tc2NhbGluZy1zdHJva2UiKS5hdHRyKCJkIixmdW5jdGlvbih5YSl7cmV0dXJuIGNhKHlhW2hdKX0pLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpO0cuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInRyYW5zZm9ybSIsInNjYWxlKCIrQi81MDArIiwgIitELzUwMCsiKSIpLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKHlhKXtyZXR1cm4ib2Zmc2V0Ij09PXA/IndoaXRlIjphYShBKHlhKSl9KS5zdHlsZSgiZmlsbC1vcGFjaXR5IixmdW5jdGlvbigpe3JldHVybiJvZmZzZXQiPT09cD8xOjB9KS5zdHlsZSgiZmlsbCIsZnVuY3Rpb24oeWEpe3JldHVybiBhYShBKHlhKSl9KTt3PXcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJob3ZlciIpLnN0eWxlKCJmaWxsIiwKZnVuY3Rpb24oeWEpe3JldHVybiBhYShBKHlhKSl9KTt2YXIgdmE9Qy5zZWxlY3QoIi5ob3ZlciIpO3cuYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJyIiwyKTt3LmFwcGVuZCgidGV4dCIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoImR4Iiw0KTt3PXkuc2VsZWN0KCIueC1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieCJdKTtDPXcuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIHhhPXcubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtMjApLmF0dHIoInkiLDYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7Qy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDApLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsNik7Qy5hcHBlbmQoInRleHQiKS5hdHRyKCJkeSIsMTgpO3c9eS5zZWxlY3QoIi55LWF4aXMtaG92ZXIiKS5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEoWyJ5Il0pOwpDPXcuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIEFhPXcubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4Iiw4KS5hdHRyKCJ5IiwtNikuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLDE0KTtDLmFwcGVuZCgibGluZSIpLmF0dHIoIngxIiwwKS5hdHRyKCJ4MiIsNikuYXR0cigieTEiLDApLmF0dHIoInkyIiwwKTtDLmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCk7eT15LnNlbGVjdCgiLnktc2xpY2UtYXhpcy1ob3ZlciIpLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YShbInkiXSk7dz15LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciBGYT15Lm1lcmdlKHcpO3cuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7dy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDYpLmF0dHIoInkxIiwKMCkuYXR0cigieTIiLDApO3cuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHgiLDgpLmF0dHIoImR5Iiw0KTtiLnNlbGVjdCgiLnkuYXhpcy5zbGljZSIpLnN0eWxlKCJvcGFjaXR5Iiwib2Zmc2V0Ij09PXA/MDoxKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwgIisoIm9mZnNldCI9PT1wPy1EOjApKyIpIikuY2FsbChaKTtiLnNlbGVjdCgiLnguYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCAiK0krIikiKS5jYWxsKG0pO2Iuc2VsZWN0KCIueS5heGlzIikuc3R5bGUoIm9wYWNpdHkiLCJvZmZzZXQiPT09cD8xOjApLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wPzA6SSkrIikiKS5jYWxsKGxhKTtiLnNlbGVjdEFsbCgiLnRpY2sgdGV4dCIpLmF0dHIoImZpbGwiLCIjYWFhIik7Yi5zZWxlY3RBbGwoIi5heGlzIHBhdGguZG9tYWluIikuYXR0cigic3Ryb2tlIiwibm9uZSIpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL2hpc3RvZ3JhbUNvcmUuanMKdmFyIEtrOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChoKXtjb25zdCBbayx0LGxdPWg7cmV0dXJue3dhbGxfdGltZTprLHN0ZXA6dCxtaW46ZDMubWluKGwubWFwKChbcF0pPT5wKSksbWF4OmQzLm1heChsLm1hcCgoWyxwXSk9PnApKSxidWNrZXRzOmwubWFwKChbcCxtLG5dKT0+KHtsZWZ0OnAscmlnaHQ6bSxjb3VudDpufSkpfX1mdW5jdGlvbiBmKGgsayx0LGw9MzApe3Q9PT1rJiYodD0xLjEqaysxLGs9ay8xLjEtMSk7Y29uc3QgcD0odC1rKS9sO2xldCBtPTA7cmV0dXJuIGQzLnJhbmdlKGssdCxwKS5tYXAobj0+e2NvbnN0IHE9bitwO2xldCB1PTA7Zm9yKDttPGguYnVja2V0cy5sZW5ndGg7KXtjb25zdCBBPU1hdGgubWluKHQsaC5idWNrZXRzW21dLnJpZ2h0KTt2YXIgeD1NYXRoLm1heChrLGguYnVja2V0c1ttXS5sZWZ0KTtjb25zdCB5PU1hdGgubWluKEEscSktTWF0aC5tYXgoeCxuKTt4PXkvKEEteCkqaC5idWNrZXRzW21dLmNvdW50O3UrPTA8eT94OjA7aWYoQT5xKWJyZWFrO20rK31yZXR1cm57eDpuLApkeDpwLHk6dX19KX1iLmJhY2tlbmRUb0ludGVybWVkaWF0ZT1kO2IuaW50ZXJtZWRpYXRlVG9EMz1mO2IuYmFja2VuZFRvVno9ZnVuY3Rpb24oaCl7aD1oLm1hcChkKTtjb25zdCBrPWQzLm1pbihoLGw9PmwubWluKSx0PWQzLm1heChoLGw9PmwubWF4KTtyZXR1cm4gaC5tYXAobD0+KHt3YWxsX3RpbWU6bC53YWxsX3RpbWUsc3RlcDpsLnN0ZXAsYmluczpmKGwsayx0KX0pKX19KShLa3x8KEtrPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaGlzdG9ncmFtLWRhc2hib2FyZC90Zi1oaXN0b2dyYW0tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhpc3RvZ3JhbS1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyxkYXRhVG9Mb2FkOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZURhdGFUb0xvYWQocnVuLCB0YWcpIn0sZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3J1bjpifSk9PmJ9LGdldERhdGFMb2FkVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3RhZzpiLHJ1bjpkfSk9PnZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaGlzdG9ncmFtcyIsIi9oaXN0b2dyYW1zIikse3RhZzpiLHJ1bjpkfSl9LGxvYWREYXRhQ2FsbGJhY2s6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57Yj1Lay5iYWNrZW5kVG9WeihmKTtkPXRoaXMuZ2V0RGF0YUxvYWROYW1lKGQpO3RoaXMuJC5jaGFydC5zZXRTZXJpZXNEYXRhKGQsYil9fX0sdGFnTWV0YWRhdGE6T2JqZWN0LHRpbWVQcm9wZXJ0eTpTdHJpbmcsCmhpc3RvZ3JhbU1vZGU6U3RyaW5nLF9jb2xvclNjYWxlRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5wZi5ydW5zQ29sb3JTY2FsZX0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1biwgdGFnLCByZXF1ZXN0TWFuYWdlcikiXSxiZWhhdmlvcnM6W3FkLkRhdGFMb2FkZXJCZWhhdmlvcl0sX2NvbXB1dGVEYXRhVG9Mb2FkKGIsZCl7cmV0dXJuW3tydW46Yix0YWc6ZH1dfSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24oYil9LHJlZHJhdygpe3RoaXMuJC5jaGFydC5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhpc3RvZ3JhbS1kYXNoYm9hcmQvdGYtaGlzdG9ncmFtLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfaGlzdG9ncmFtTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZnNldCJ9LF90aW1lUHJvcGVydHk6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWc6T2JqZWN0LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOlN0cmluZyxfcmVzdGFtcDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWcsIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfX0sbGlzdGVuZXJzOnsiY29udGVudC12aXNpYmlsaXR5LWNoYW5nZWQiOiJfcmVkcmF3Q2F0ZWdvcnlQYW5lIn0sCl9yZWRyYXdDYXRlZ29yeVBhbmUoYixkKXtkJiZiLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1oaXN0b2dyYW0tbG9hZGVyIikuZm9yRWFjaChmPT5mLnJlZHJhdygpKX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkSGlzdG9ncmFtcygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJoaXN0b2dyYW1zIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxrPT5PYmplY3Qua2V5cyhrKSksaD12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09aC5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWciLGYpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT4Ke3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZEhpc3RvZ3JhbXMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9tYWtlQ2F0ZWdvcmllcyhiLGQsZil7cmV0dXJuICRjLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnMoYixkLGYpfSxfdGFnTWV0YWRhdGEoYixkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX3RleHRzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9fSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9hdHRhY2hlZCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBiPXZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsIi90ZXh0Iikse3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW59KSxkPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT57Zi5jYW5jZWxsZWR8fAooZj1mLnZhbHVlLm1hcChoPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqaC53YWxsX3RpbWUpLHN0ZXA6aC5zdGVwLHRleHQ6aC50ZXh0fSkpLHRoaXMuc2V0KCJfdGV4dHMiLGYuc2xpY2UoKS5yZXZlcnNlKCkpKX0pO3RoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfX0sX2Zvcm1hdFN0ZXAoYil7cmV0dXJuIGQzLmZvcm1hdCgiLCIpKGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRUZXh0cygpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT4Ke2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZykpe3ZhciBmPXZjLmdldFRhZ3MoZCk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZFRleHRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXRleHQtbG9hZGVyIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGIsZCxmKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQvdGYtcHItY3VydmUtY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wci1jdXJ2ZS1jYXJkIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHRhZzpTdHJpbmcsdGFnTWV0YWRhdGE6T2JqZWN0LHJ1blRvU3RlcENhcDpPYmplY3QscmVxdWVzdE1hbmFnZXI6T2JqZWN0LGFjdGl2ZTpCb29sZWFuLF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3J1blRvUHJDdXJ2ZUVudHJ5Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnk6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuc1dpdGhTdGVwQXZhaWxhYmxlOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJ1bnNXaXRoU3RlcEF2YWlsYWJsZShydW5zLCBfcnVuVG9QckN1cnZlRW50cnkpIn0sX3NldE9mUmVsZXZhbnRSdW5zOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVTZXRPZlJlbGV2YW50UnVucyhfcnVuc1dpdGhTdGVwQXZhaWxhYmxlKSJ9LF9ydW5Ub0RhdGFPdmVyVGltZTpPYmplY3QsCl9jb2xvclNjYWxlRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSl9LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuQ2FuY2VsbGVyfSxfYXR0YWNoZWQ6Qm9vbGVhbixfeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PigpPT57Y29uc3QgYj1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7cmV0dXJue3NjYWxlOmIsYXhpczpuZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhiLCJib3R0b20iKSxhY2Nlc3NvcjpkPT5kLnJlY2FsbH19fSxfeVZhbHVlQWNjZXNzb3I6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOigpPT5iPT5iLnByZWNpc2lvbn0sX3Rvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLHZhbHVlOigpPT57Y29uc3QgYj1yZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKSwKZD1mPT5pc05hTihmKT8iTmFOIjpiKGYpO3JldHVyblt7dGl0bGU6IlJ1biIsZXZhbHVhdGU6Zj0+Zi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJUaHJlc2hvbGQiLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS50aHJlc2hvbGRzKX0se3RpdGxlOiJQcmVjaXNpb24iLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS5wcmVjaXNpb24pfSx7dGl0bGU6IlJlY2FsbCIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnJlY2FsbCl9LHt0aXRsZToiVFAiLGV2YWx1YXRlOmY9PmYuZGF0dW0udHJ1ZV9wb3NpdGl2ZXN9LHt0aXRsZToiRlAiLGV2YWx1YXRlOmY9PmYuZGF0dW0uZmFsc2VfcG9zaXRpdmVzfSx7dGl0bGU6IlROIixldmFsdWF0ZTpmPT5mLmRhdHVtLnRydWVfbmVnYXRpdmVzfSx7dGl0bGU6IkZOIixldmFsdWF0ZTpmPT5mLmRhdHVtLmZhbHNlX25lZ2F0aXZlc31dfX0sX3Nlcmllc0RhdGFGaWVsZHM6e3R5cGU6QXJyYXksdmFsdWU6InRocmVzaG9sZHMgcHJlY2lzaW9uIHJlY2FsbCB0cnVlX3Bvc2l0aXZlcyBmYWxzZV9wb3NpdGl2ZXMgdHJ1ZV9uZWdhdGl2ZXMgZmFsc2VfbmVnYXRpdmVzIi5zcGxpdCgiICIpLApyZWFkT25seTohMH0sX2RlZmF1bHRYUmFuZ2U6e3R5cGU6QXJyYXksdmFsdWU6Wy0uMDUsMS4wNV0scmVhZE9ubHk6ITB9LF9kZWZhdWx0WVJhbmdlOnt0eXBlOkFycmF5LHZhbHVlOlstLjA1LDEuMDVdLHJlYWRPbmx5OiEwfSxfZGF0YVVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT57Y29uc3QgZD10aGlzLnRhZztyZXR1cm4gdmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJwcl9jdXJ2ZXMiLCIvcHJfY3VydmVzIikse3RhZzpkLHJ1bjpifSl9fX0sX3Ntb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9ic2VydmVyczpbInJlbG9hZChydW5zLCB0YWcpIiwiX3NldENoYXJ0RGF0YShfcnVuVG9QckN1cnZlRW50cnksIF9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5LCBfc2V0T2ZSZWxldmFudFJ1bnMpIiwiX3VwZGF0ZVJ1blRvUHJDdXJ2ZUVudHJ5KF9ydW5Ub0RhdGFPdmVyVGltZSwgcnVuVG9TdGVwQ2FwKSJdLApfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpe3JldHVybihiLGQsZik9Pnt0aGlzLnNldCgiX3J1blRvRGF0YU92ZXJUaW1lIixPYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvRGF0YU92ZXJUaW1lLGYpKX19LF9jb21wdXRlUnVuQ29sb3IoYil7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbi5zY2FsZShiKX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9hdHRhY2hlZCYmKDA9PT10aGlzLnJ1bnMubGVuZ3RoP3RoaXMuc2V0KCJfcnVuVG9EYXRhT3ZlclRpbWUiLHt9KTp0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVsb2FkKCkpfSxfc2V0Q2hhcnREYXRhKGIsZCxmKXtfLmZvck93bihiLChoLGspPT57Y29uc3QgdD1kW2tdO3QmJmJba10uc3RlcD09PXQuc3RlcHx8KGZba10/dGhpcy5fdXBkYXRlU2VyaWVzRGF0YUZvclJ1bihrLGgpOnRoaXMuX2NsZWFyU2VyaWVzRGF0YShrKSl9KX0sCl91cGRhdGVTZXJpZXNEYXRhRm9yUnVuKGIsZCl7Y29uc3QgZj1fLnJlZHVjZSh0aGlzLl9zZXJpZXNEYXRhRmllbGRzLChrLHQpPT57a1t0XT1kW3RdLnNsaWNlKCkucmV2ZXJzZSgpO3JldHVybiBrfSx7fSksaD1BcnJheShmW3RoaXMuX3Nlcmllc0RhdGFGaWVsZHNbMF1dLmxlbmd0aCk7Zm9yKGxldCBrPTA7azxoLmxlbmd0aDtrKyspaFtrXT1fLm1hcFZhbHVlcyhmLHQ9PnRba10pO3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5zZXRTZXJpZXNEYXRhKGIsaCl9LF9jbGVhclNlcmllc0RhdGEoYil7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnNldFNlcmllc0RhdGEoYixbXSl9LF91cGRhdGVSdW5Ub1ByQ3VydmVFbnRyeShiLGQpe2NvbnN0IGY9e307Xy5mb3JPd24oYiwoaCxrKT0+e2gmJmgubGVuZ3RoJiYoZltrXT10aGlzLl9jb21wdXRlRW50cnlDbG9zZXN0T3JFcXVhbFRvU3RlcENhcChkW2tdLGgpKX0pO3RoaXMuc2V0KCJfcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeSIsCnRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5KTt0aGlzLnNldCgiX3J1blRvUHJDdXJ2ZUVudHJ5IixmKX0sX2NvbXB1dGVFbnRyeUNsb3Nlc3RPckVxdWFsVG9TdGVwQ2FwKGIsZCl7Yj1NYXRoLm1pbihfLnNvcnRlZEluZGV4KGQubWFwKGY9PmYuc3RlcCksYiksZC5sZW5ndGgtMSk7cmV0dXJuIGRbYl19LF9jb21wdXRlUnVuc1dpdGhTdGVwQXZhaWxhYmxlKGIsZCl7cmV0dXJuIF8uZmlsdGVyKGIsZj0+ZFtmXSkuc29ydCgpfSxfY29tcHV0ZVNldE9mUmVsZXZhbnRSdW5zKGIpe2NvbnN0IGQ9e307Xy5mb3JFYWNoKGIsZj0+e2RbZl09ITB9KTtyZXR1cm4gZH0sX2NvbXB1dGVDdXJyZW50U3RlcEZvclJ1bihiLGQpe3JldHVybihiPWJbZF0pP2Iuc3RlcDpudWxsfSxfY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bihiLGQpe3JldHVybihiPWJbZF0pPyhuZXcgRGF0ZSgxRTMqYi53YWxsX3RpbWUpKS50b1N0cmluZygpOm51bGx9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLAohdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF9yZXNldERvbWFpbigpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZXNldERvbWFpbigpfSxyZWRyYXcoKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVkcmF3KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHItY3VydmUtZGFzaGJvYXJkL3RmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXM6T2JqZWN0LHJ1blRvU3RlcDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLGNvbXB1dGVkOiJfY29tcHV0ZVJ1blRvU3RlcChydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBfcnVuVG9TdGVwSW5kZXgpIn0sdGltZURpc3BsYXlUeXBlOlN0cmluZyxfcnVuVG9TdGVwSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuc1dpdGhTbGlkZXJzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJ1bnNXaXRoU2xpZGVycyhydW5zLCBydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzKSJ9fSxvYnNlcnZlcnM6WyJfdXBkYXRlU3RlcHNGb3JOZXdSdW5zKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMpIl0sX2NvbXB1dGVDb2xvckZvclJ1bihiKXtyZXR1cm4gcGYucnVuc0NvbG9yU2NhbGUoYil9LF9jb21wdXRlVGltZVRleHRGb3JSdW4oYiwKZCxmLGgpe2Q9ZFtmXTtpZighXy5pc051bWJlcihkKSlyZXR1cm4iIjtiPWJbZl07aWYoIWIpcmV0dXJuIiI7Yj1iW2RdW2hdO2lmKCJzdGVwIj09PWgpcmV0dXJuYHN0ZXAgJHtifWA7aWYoInJlbGF0aXZlIj09PWgpcmV0dXJuIDE+Yj9gJHsoMUUzKmIpLnRvRml4ZWQoMil9IG1zYDpgJHtiLnRvRml4ZWQoMil9IHNgO2lmKCJ3YWxsX3RpbWUiPT09aClyZXR1cm4obmV3IERhdGUoMUUzKmIpKS50b1N0cmluZygpO3Rocm93IEVycm9yKGBUaGUgZGlzcGxheSB0eXBlIG9mICR7aH0gaXMgbm90IHJlY29nbml6ZWQuYCk7fSxfc2xpZGVyVmFsdWVDaGFuZ2VkKGIpe2NvbnN0IGQ9Yi50YXJnZXQuZGF0YXNldC5ydW4sZj1iLnRhcmdldC5pbW1lZGlhdGVWYWx1ZSxoPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9TdGVwSW5kZXgpO2lzTmFOKGYpP2RlbGV0ZSBoW2RdOmhbZF09Yi50YXJnZXQuaW1tZWRpYXRlVmFsdWU7dGhpcy5fcnVuVG9TdGVwSW5kZXg9aH0sX2NvbXB1dGVNYXhTdGVwSW5kZXhGb3JSdW4oYiwKZCl7cmV0dXJuKGI9YltkXSkmJmIubGVuZ3RoP2IubGVuZ3RoLTE6MH0sX3VwZGF0ZVN0ZXBzRm9yTmV3UnVucyhiKXtjb25zdCBkPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9TdGVwSW5kZXgpO18uZm9yT3duKGIsKGYsaCk9PntfLmlzTnVtYmVyKGRbaF0pfHwoZFtoXT1mLmxlbmd0aC0xKX0pO3RoaXMuX3J1blRvU3RlcEluZGV4PWR9LF9nZXRTdGVwKGIsZCl7cmV0dXJuIHRoaXMuX3J1blRvU3RlcEluZGV4P3RoaXMuX3J1blRvU3RlcEluZGV4W2RdOjB9LF9jb21wdXRlUnVuVG9TdGVwKGIsZCl7Y29uc3QgZj17fTtfLmZvck93bihkLChoLGspPT57Y29uc3QgdD1iW2tdO3QmJihmW2tdPXRbaF0uc3RlcCl9KTtyZXR1cm4gZn0sX2NvbXB1dGVSdW5zV2l0aFNsaWRlcnMoYixkKXtyZXR1cm4gYi5maWx0ZXIoZj0+ZFtmXSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHItY3VydmUtZGFzaGJvYXJkL3RmLXByLWN1cnZlLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e190aW1lRGlzcGxheVR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX3NlbGVjdGVkUnVuczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9ydW5Ub1RhZ0luZm86e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9yZWxldmFudFNlbGVjdGVkUnVuczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVSZWxldmFudFNlbGVjdGVkUnVucyhfc2VsZWN0ZWRSdW5zLCBfcnVuVG9UYWdJbmZvKSJ9LF9ydW5zV2l0aFByQ3VydmVEYXRhOkFycmF5LF9ydW5Ub1N0ZXA6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sCl9nZXRDYXRlZ29yeUl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmI9PmIudGFnfSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7UHJvbWlzZS5hbGwoW3RoaXMuX2ZldGNoVGFncygpLHRoaXMuX2ZldGNoVGltZUVudHJpZXNQZXJSdW4oKV0pLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRDYXJkcygpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJfY3VydmVzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5fLmtleXMoaCkpOwpmPXZjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGQpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9mZXRjaFRpbWVFbnRyaWVzUGVyUnVuKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJfY3VydmVzIiwiL2F2YWlsYWJsZV90aW1lX2VudHJpZXMiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntfLmZvck93bihkLGY9PntfLmZvckVhY2goZixoPT57aC5yZWxhdGl2ZT1oLndhbGxfdGltZS1mWzBdLndhbGxfdGltZX0pfSk7dGhpcy5zZXQoIl9ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzIixkKTtkPV8ua2V5cyhkKS5zbGljZSgpLnNvcnQoKTtfLmlzRXF1YWwoZCx0aGlzLl9ydW5zV2l0aFByQ3VydmVEYXRhKXx8dGhpcy5zZXQoIl9ydW5zV2l0aFByQ3VydmVEYXRhIiwKZCl9KX0sX3JlbG9hZENhcmRzKCl7Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1wci1jdXJ2ZS1jYXJkIiksYj0+e2IucmVsb2FkKCl9KX0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtiPV8ubWFwVmFsdWVzKGIsaD0+T2JqZWN0LmtleXMoaCkpO3JldHVybiAkYy5jYXRlZ29yaXplVGFncyhiLGQsZil9LF9jb21wdXRlQ29sb3JGb3JSdW4oYil7cmV0dXJuIHBmLnJ1bnNDb2xvclNjYWxlKGIpfSxfY29tcHV0ZVJlbGV2YW50U2VsZWN0ZWRSdW5zKGIsZCl7cmV0dXJuIGIuZmlsdGVyKGY9PmRbZl0pfSxfdGFnTWV0YWRhdGEoYixkLGYpe2NvbnN0IGg9e307ZC5mb3JFYWNoKGs9PntoW2tdPWJba11bZl19KTtkPWYucmVwbGFjZSgvXC9wcl9jdXJ2ZXMkLywiIik7cmV0dXJuIHJmLmFnZ3JlZ2F0ZVRhZ0luZm8oaCxkKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZC90Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZCIscHJvcGVydGllczp7X2luc3RhbGxDb21tYW5kOnt0eXBlOlN0cmluZyxyZWFkT25seTohMCx2YWx1ZToicGlwIGluc3RhbGwgLVUgdGVuc29yYm9hcmRfcGx1Z2luX3Byb2ZpbGUifX0sX2NvcHlJbnN0YWxsQ29tbWFuZCgpe2NvbnN0IGI9dGhpcztyZXR1cm4gaGMoZnVuY3Rpb24qKCl7Y29uc3QgZD0oKT0+aGMoZnVuY3Rpb24qKCl7Yi4kLmNvbW1hbmRUZXh0YXJlYS5zZWxlY3QoKTt0cnl7eWllbGQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoYi5faW5zdGFsbENvbW1hbmQpfWNhdGNoKGYpe2lmKCFkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpKXJldHVybiBQcm9taXNlLnJlamVjdCgpfX0pO3RyeXt5aWVsZCBkKCksYi4kLmNvcGllZE1lc3NhZ2UuaW5uZXJUZXh0PSJDb3BpZWQuIn1jYXRjaChmKXtiLiQuY29waWVkTWVzc2FnZS5pbm5lclRleHQ9IkZhaWxlZCB0byBjb3B5IHRvIGNsaXBib2FyZC4ifX0pfSwKX3JlbW92ZUNvcGllZE1lc3NhZ2UoKXt0aGlzLiQuY29waWVkTWVzc2FnZS5pbm5lclRleHQ9IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3BsdWdpbi1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcGx1Z2luLWRpYWxvZyIscHJvcGVydGllczp7X3RpdGxlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY3VzdG9tTWVzc2FnZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX29wZW46e3R5cGU6Qm9vbGVhbn0sX2hpZGRlbjp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhpZGRlbihfb3BlbikiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3VzZU5hdGl2ZUJhY2tkcm9wOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9fSxvcGVuTm9UZW5zb3JGbG93RGlhbG9nKCl7dGhpcy5vcGVuRGlhbG9nKCJUaGlzIHBsdWdpbiBpcyBkaXNhYmxlZCB3aXRob3V0IFRlbnNvckZsb3ciLCdUbyBlbmFibGUgdGhpcyBwbHVnaW4gaW4gVGVuc29yQm9hcmQsIGluc3RhbGwgVGVuc29yRmxvdyB3aXRoICJwaXAgaW5zdGFsbCB0ZW5zb3JmbG93IiBvciBlcXVpdmFsZW50LicpfSxvcGVuT2xkVGVuc29yRmxvd0RpYWxvZyhiKXt0aGlzLm9wZW5EaWFsb2coIlRoaXMgcGx1Z2luIGlzIGRpc2FibGVkIHdpdGhvdXQgVGVuc29yRmxvdyAiKwpiLCJUbyBlbmFibGUgdGhpcyBwbHVnaW4gaW4gVGVuc29yQm9hcmQsIGluc3RhbGwgVGVuc29yRmxvdyAiK2IrJyBvciBncmVhdGVyIHdpdGggInBpcCBpbnN0YWxsIHRlbnNvcmZsb3ciIG9yIGVxdWl2YWxlbnQuJyl9LG9wZW5EaWFsb2coYixkKXt0aGlzLnNldCgiX3RpdGxlIixiKTt0aGlzLnNldCgiX2N1c3RvbU1lc3NhZ2UiLGQpO3RoaXMuJC5kaWFsb2cub3BlbigpfSxjbG9zZURpYWxvZygpe3RoaXMuJC5kaWFsb2cuY2xvc2UoKX0sX2NvbXB1dGVIaWRkZW4oYil7cmV0dXJuIWJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLXZpZGVvLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvYmVob2xkZXItZnJhbWUiKSxkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9waW5nIik7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLXZpZGVvIixwcm9wZXJ0aWVzOntmcHM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfZnBzQ2hhbmdlZCJ9LHBpbmdTbGVlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MUUzfSx4aHJUaW1lb3V0Ont0eXBlOk51bWJlcix2YWx1ZToyNTAwfSxfaW1hZ2VVUkw6e3R5cGU6U3RyaW5nLHZhbHVlOiJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHNceDNkIn0sX3hocjpPYmplY3QsX3RpbWVyOk51bWJlcixfaXNEZWFkOkJvb2xlYW59LGF0dGFjaGVkKCl7dGhpcy5zZXQoIl9pbWFnZVVSTCIsYik7dGhpcy5fcGluZygpfSxkZXRhY2hlZCgpe3RoaXMuX2NsZWFyKCk7CnRoaXMuc2V0KCJfaW1hZ2VVUkwiLCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHNceDNkIil9LF9waW5nKCl7dGhpcy5fY2xlYXIoKTt0aGlzLl94aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3RoaXMuX3hoci5vcGVuKCJHRVQiLGQsITApO3RoaXMuX3hoci50aW1lb3V0PXRoaXMueGhyVGltZW91dDt0aGlzLl94aHIub25sb2FkPXRoaXMuX29uUGluZ0xvYWQuYmluZCh0aGlzKTt0aGlzLl94aHIub25lcnJvcj10aGlzLl9vblBpbmcuYmluZCh0aGlzLCExLHRoaXMucGluZ1NsZWVwKTt0aGlzLl94aHIub250aW1lb3V0PXRoaXMuX29uUGluZy5iaW5kKHRoaXMsITEsMSk7dGhpcy5feGhyLnNlbmQobnVsbCl9LF9vblBpbmdMb2FkKCl7aWYoMjAwPT10aGlzLl94aHIuc3RhdHVzKXtjb25zdCBmPUpTT04ucGFyc2UodGhpcy5feGhyLnJlc3BvbnNlVGV4dCk7dGhpcy5fb25QaW5nKCJhbGl2ZSI9PWYuc3RhdHVzLHRoaXMucGluZ1NsZWVwKX1lbHNlIHRoaXMuX29uUGluZyghMSwKdGhpcy5waW5nU2xlZXApfSxfb25QaW5nKGYsaCl7ZiYmdGhpcy5faXNEZWFkJiZ0aGlzLnNldCgiX2ltYWdlVVJMIixiKyI/dFx4M2QiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpKTt0aGlzLl9pc0RlYWQ9IWY7dGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQoKCk9PnRoaXMuX3BpbmcoKSxoKX0sX2NsZWFyKCl7dGhpcy5fdGltZXImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj1udWxsKTt0aGlzLl94aHImJih0aGlzLl94aHIucmVhZHlTdGF0ZTxYTUxIdHRwUmVxdWVzdC5ET05FJiZ0aGlzLl94aHIuYWJvcnQoKSx0aGlzLl94aHI9bnVsbCl9LF9mcHNDaGFuZ2VkKGYsaCl7MD09Zj90aGlzLl9jbGVhcigpOjA9PWgmJnRoaXMuX3BpbmcoKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9zZWN0aW9uLWluZm8iKTtQb2x5bWVyKHtpczoidGYtYmVob2xkZXItaW5mbyIscHJvcGVydGllczp7ZnBzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2Zwc0NoYW5nZWQifSx4aHJUaW1lb3V0Ont0eXBlOk51bWJlcix2YWx1ZToxRTR9LF9pdGVtczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W3tuYW1lOiJMb2FkaW5nLi4uIn1dfSxfeGhyOk9iamVjdCxfdGltZXI6TnVtYmVyfSxhdHRhY2hlZCgpe3RoaXMuX2xvYWQoKX0sZGV0YWNoZWQoKXt0aGlzLl9jbGVhcigpfSxfbG9hZCgpe3RoaXMuX2NsZWFyKCk7dGhpcy5feGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt0aGlzLl94aHIub3BlbigiR0VUIixiLCEwKTt0aGlzLl94aHIudGltZW91dD10aGlzLnhoclRpbWVvdXQ7dGhpcy5feGhyLm9ubG9hZD10aGlzLl9vbkxvYWQuYmluZCh0aGlzKTt0aGlzLl94aHIub25lcnJvcj0KdGhpcy5fcmV0cnkuYmluZCh0aGlzLHRoaXMuX2dldFNsZWVwKCkpO3RoaXMuX3hoci5vbnRpbWVvdXQ9dGhpcy5fcmV0cnkuYmluZCh0aGlzLDEpO3RoaXMuX3hoci5zZW5kKG51bGwpfSxfb25Mb2FkKCl7aWYoMjAwPT10aGlzLl94aHIuc3RhdHVzKXtjb25zdCBkPUpTT04ucGFyc2UodGhpcy5feGhyLnJlc3BvbnNlVGV4dCk7Y29uc29sZS5hc3NlcnQoQXJyYXkuaXNBcnJheShkKSwiRXhwZWN0ZWQgcmVzcG9uc2UgdG8gYmUgaW4gYW4gYXJyYXkiKTt0aGlzLl9pdGVtcz1kfXRoaXMuX3JldHJ5KHRoaXMuX2dldFNsZWVwKCkpfSxfcmV0cnkoZCl7dGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQodGhpcy5fbG9hZC5iaW5kKHRoaXMpLGQpfSxfZ2V0U2xlZXAoKXtyZXR1cm4gMUUzLygwPT09dGhpcy5mcHM/MTp0aGlzLmZwcyl9LF9jbGVhcigpe3RoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9bnVsbCk7dGhpcy5feGhyJiYKKHRoaXMuX3hoci5yZWFkeVN0YXRlPFhNTEh0dHBSZXF1ZXN0LkRPTkUmJnRoaXMuX3hoci5hYm9ydCgpLHRoaXMuX3hocj1udWxsKX0sX2Zwc0NoYW5nZWQoZCxmKXswPT1kP3RoaXMuX2NsZWFyKCk6MD09ZiYmdGhpcy5fbG9hZCgpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iZWhvbGRlci1kYXNoYm9hcmQvdGYtYmVob2xkZXItZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyKDEwLDApfSxfaXNBdmFpbGFibGU6Qm9vbGVhbixfdmFsdWVzOnt0eXBlOlN0cmluZyx2YWx1ZToidHJhaW5hYmxlX3ZhcmlhYmxlcyIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJ2YXJpYW5jZSIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3NjYWxpbmc6e3R5cGU6U3RyaW5nLHZhbHVlOiJsYXllciIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3dpbmRvd1NpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjE1LG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9wcmV2aW91c0ZQUzp7dHlwZTpOdW1iZXIsdmFsdWU6MzB9LF9GUFM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LApfcmVjb3JkVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YXJ0IHJlY29yZGluZyJ9LF9pc1JlY29yZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9zaG93QWxsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX2NvbG9ybWFwOnt0eXBlOlN0cmluZyx2YWx1ZToibWFnbWEiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9pc19hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfY29udHJvbHNfZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifX0sX3ZhbHVlc05vdEZyYW1lKGIpe3JldHVybiJmcmFtZXMiIT09Yn0sX3ZhcmlhbmNlU2VsZWN0ZWQoYil7cmV0dXJuInZhcmlhbmNlIj09PWJ9LF9jb25maWdDaGFuZ2VkKCl7aWYodGhpcy5faXNfYWN0aXZlJiYhdGhpcy5fY29udHJvbHNfZGlzYWJsZWQpe3ZhciBiPQpbdGhpcy5fdmFsdWVzLHRoaXMuX21vZGUsdGhpcy5fc2NhbGluZyx0aGlzLl93aW5kb3dTaXplLHRoaXMuX0ZQUyx0aGlzLl9pc1JlY29yZGluZyx0aGlzLl9zaG93QWxsLHRoaXMuX2NvbG9ybWFwXSxkO2ZvcihkIG9mIGIpaWYoInVuZGVmaW5lZCI9PT10eXBlb2YgZHx8IiI9PT1kKXJldHVybjtiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9jaGFuZ2UtY29uZmlnIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiLHt2YWx1ZXM6dGhpcy5fdmFsdWVzLG1vZGU6dGhpcy5fbW9kZSxzY2FsaW5nOnRoaXMuX3NjYWxpbmcsd2luZG93X3NpemU6dGhpcy5fd2luZG93U2l6ZSxGUFM6dGhpcy5fRlBTLGlzX3JlY29yZGluZzp0aGlzLl9pc1JlY29yZGluZyxzaG93X2FsbDp0aGlzLl9zaG93QWxsLGNvbG9ybWFwOnRoaXMuX2NvbG9ybWFwfSl9fSxfdG9nZ2xlUmVjb3JkKCl7InN0YXJ0IHJlY29yZGluZyI9PXRoaXMuX3JlY29yZFRleHQ/KHRoaXMuc2V0KCJfcmVjb3JkVGV4dCIsCiJzdG9wIHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCEwKSk6KHRoaXMuc2V0KCJfcmVjb3JkVGV4dCIsInN0YXJ0IHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCExKSk7dGhpcy4kLnJlY29yZF9idXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgiaXMtcmVjb3JkaW5nIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKGI9PnsiYmVob2xkZXIiaW4gYj8odGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKSx0aGlzLnNldCgiX2lzQXZhaWxhYmxlIiwhMCkpOih0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuTm9UZW5zb3JGbG93RGlhbG9nKCksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITEpKX0pfSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2lzQXZhaWxhYmxlKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsCiIvaXMtYWN0aXZlIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9Pnt0aGlzLnNldCgiX2lzX2FjdGl2ZSIsZC5pc19hY3RpdmUpO3RoaXMuc2V0KCJfY29udHJvbHNfZGlzYWJsZWQiLCFkLmlzX2NvbmZpZ193cml0YWJsZSl9KX19fSk7cWYucmVnaXN0ZXJEYXNoYm9hcmQoKX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy11dGlscy90Zi1ocGFyYW1zLXV0aWxzLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChCKXtyZXR1cm4iIiE9PUIuZGlzcGxheU5hbWUmJnZvaWQgMCE9PUIuZGlzcGxheU5hbWU/Qi5kaXNwbGF5TmFtZTpCLm5hbWV9ZnVuY3Rpb24gayhCKXtpZigiIiE9PUIuZGlzcGxheU5hbWUmJnZvaWQgMCE9PUIuZGlzcGxheU5hbWUpcmV0dXJuIEIuZGlzcGxheU5hbWU7bGV0IEk9Qi5uYW1lLmdyb3VwO0I9Qi5uYW1lLnRhZzt2b2lkIDA9PT1JJiYoST0iIik7dm9pZCAwPT09QiYmKEI9IiIpO3JldHVybiIiPT09ST9COkkrIi4iK0J9ZnVuY3Rpb24gdChCKXtyZXR1cm4gQi5ocGFyYW1Db2x1bW5zLmxlbmd0aH1mdW5jdGlvbiBsKEIpe3JldHVybiBCLm1ldHJpY0NvbHVtbnMubGVuZ3RofWZ1bmN0aW9uIHAoQixJKXtyZXR1cm4gQltJXX1mdW5jdGlvbiBtKEIsSSl7cmV0dXJuIEIuZmluZChOPT5fLmlzRXF1YWwoTi5uYW1lLEkpKX1mdW5jdGlvbiBuKEIsSSxOKXtyZXR1cm4gSS5ocGFyYW1zW0IuaHBhcmFtQ29sdW1uc1tOXS5ocGFyYW1JbmZvLm5hbWVdfQpmdW5jdGlvbiBxKEIsSSxOKXtCPW0oSS5tZXRyaWNWYWx1ZXMsQi5tZXRyaWNDb2x1bW5zW05dLm1ldHJpY0luZm8ubmFtZSk7cmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOkIudmFsdWV9ZnVuY3Rpb24gdShCLEksTil7cmV0dXJuIE48Qi5ocGFyYW1Db2x1bW5zLmxlbmd0aD9uKEIsSSxOKTpxKEIsSSxOLUIuaHBhcmFtQ29sdW1ucy5sZW5ndGgpfWZ1bmN0aW9uIHgoQil7cmV0dXJuIEIuaHBhcmFtSW5mb3MubGVuZ3RofWZ1bmN0aW9uIEEoQil7cmV0dXJuIEIubWV0cmljSW5mb3MubGVuZ3RofWZ1bmN0aW9uIHkoQixJLE4pe3JldHVybiBJLmhwYXJhbXNbQi5ocGFyYW1JbmZvc1tOXS5uYW1lXX1mdW5jdGlvbiB3KEIsSSxOKXtCPW0oSS5tZXRyaWNWYWx1ZXMsQi5tZXRyaWNJbmZvc1tOXS5uYW1lKTtyZXR1cm4gdm9pZCAwPT09Qj92b2lkIDA6Qi52YWx1ZX1mdW5jdGlvbiBDKEIsSSxOKXtyZXR1cm4gTjxCLmhwYXJhbUluZm9zLmxlbmd0aD95KEIsSSxOKTp3KEIsSSxOLUIuaHBhcmFtSW5mb3MubGVuZ3RoKX0KZnVuY3Rpb24gRyhCKXtyZXR1cm4gXy5pc051bWJlcihCKT9CLnRvUHJlY2lzaW9uKDUpOnZvaWQgMD09PUI/IiI6Qi50b1N0cmluZygpfWZ1bmN0aW9uIEQoQixJKXtyZXR1cm4gQipCK0kqSX1mLmhwYXJhbU5hbWU9aDtmLm1ldHJpY05hbWU9aztmLnNjaGVtYUNvbHVtbk5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gSTxCLmhwYXJhbUNvbHVtbnMubGVuZ3RoP2goQi5ocGFyYW1Db2x1bW5zW0ldLmhwYXJhbUluZm8pOmsoQi5tZXRyaWNDb2x1bW5zW0ktQi5ocGFyYW1Db2x1bW5zLmxlbmd0aF0ubWV0cmljSW5mbyl9O2YubnVtSFBhcmFtcz10O2YubnVtTWV0cmljcz1sO2YubnVtQ29sdW1ucz1mdW5jdGlvbihCKXtyZXR1cm4gdChCKStsKEIpfTtmLmhwYXJhbVZhbHVlQnlOYW1lPXA7Zi5tZXRyaWNWYWx1ZUJ5TmFtZT1tO2YuaHBhcmFtVmFsdWVCeUluZGV4PW47Zi5tZXRyaWNWYWx1ZUJ5SW5kZXg9cTtmLmNvbHVtblZhbHVlQnlJbmRleD11O2YubnVtZXJpY0NvbHVtbkV4dGVudD0KZnVuY3Rpb24oQixJLE4pe3JldHVybiBkMy5leHRlbnQoSSxPPT51KEIsTyxOKSl9O2YuZ2V0QWJzb2x1dGVDb2x1bW5JbmRleD1mdW5jdGlvbihCLEksTil7aWYoTjxJLmhwYXJhbUluZm9zLmxlbmd0aClCPUIuaHBhcmFtQ29sdW1ucy5maW5kSW5kZXgoTz0+Ty5ocGFyYW1JbmZvLm5hbWU9PT1JLmhwYXJhbUluZm9zW05dLm5hbWUpO2Vsc2V7Y29uc3QgTz1JLm1ldHJpY0luZm9zW04tSS5ocGFyYW1JbmZvcy5sZW5ndGhdLm5hbWU7Qj1CLmhwYXJhbUNvbHVtbnMubGVuZ3RoK0IubWV0cmljQ29sdW1ucy5maW5kSW5kZXgoSD0+SC5tZXRyaWNJbmZvLm5hbWU9PT1PKX1jb25zb2xlLmFzc2VydCgtMSE9PUIpO3JldHVybiBCfTtmLnNjaGVtYVZpc2libGVDb2x1bW5OYW1lPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEk8Qi5ocGFyYW1JbmZvcy5sZW5ndGg/aChCLmhwYXJhbUluZm9zW0ldKTprKEIubWV0cmljSW5mb3NbSS1CLmhwYXJhbUluZm9zLmxlbmd0aF0pfTtmLm51bVZpc2libGVIUGFyYW1zPQp4O2YubnVtVmlzaWJsZU1ldHJpY3M9QTtmLm51bVZpc2libGVDb2x1bW5zPWZ1bmN0aW9uKEIpe3JldHVybiB4KEIpK0EoQil9O2YudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQ9ZnVuY3Rpb24oQixJLE4pe3JldHVybiBkMy5leHRlbnQoSSxPPT5DKEIsTyxOKSl9O2YucHJldHR5UHJpbnRIUGFyYW1WYWx1ZUJ5TmFtZT1mdW5jdGlvbihCLEkpe3JldHVybiBHKHAoQixJKSl9O2YucHJldHR5UHJpbnRNZXRyaWNWYWx1ZUJ5TmFtZT1mdW5jdGlvbihCLEkpe3JldHVybiBHKG0oQixJKSl9O2Yuc2Vzc2lvbkdyb3VwV2l0aE5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gQi5maW5kKE49Pk4ubmFtZT09PUkpfTtmLmhwYXJhbVZhbHVlQnlWaXNpYmxlSW5kZXg9eTtmLm1ldHJpY1ZhbHVlQnlWaXNpYmxlSW5kZXg9dztmLmNvbHVtblZhbHVlQnlWaXNpYmxlSW5kZXg9QztmLnByZXR0eVByaW50PUc7Zi5sMk5vcm1TcXVhcmVkPUQ7Zi5ldWNsaWRlYW5EaXN0PWZ1bmN0aW9uKEIsSSxOLE8pe3JldHVybiBNYXRoLnNxcnQoRChCLQpOLEktTykpfTtmLnBvaW50VG9SZWN0YW5nbGVEaXN0PWZ1bmN0aW9uKEIsSSxOLE8sSCxLKXtpZihCPE4mJkk8TylyZXR1cm4gZi5ldWNsaWRlYW5EaXN0KEIsSSxOLE8pO2lmKE48PUImJkI8SCYmSTxPKXJldHVybiBPLUk7aWYoSDw9QiYmSTxPKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixJLEgsTyk7aWYoQjxOJiZPPD1JJiZJPEspcmV0dXJuIE4tQjtpZihOPD1CJiZCPEgmJk88PUkmJkk8SylyZXR1cm4gMDtpZihIPD1CJiZPPD1JJiZJPEspcmV0dXJuIEItSDtpZihCPE4mJks8PUkpcmV0dXJuIGYuZXVjbGlkZWFuRGlzdChCLEksTixLKTtpZihOPD1CJiZCPEgmJks8PUkpcmV0dXJuIEktSztpZihIPD1CJiZLPD1JKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixJLEgsSyk7dGhyb3ciUG9pbnQgKHgseSkgbXVzdCBiZSBpbiBvbmUgb2YgdGhlIHJlZ2lvbnMgZGVmaW5lZCBhYm92ZS4iO307Zi50cmFuc2xhdGVTdHI9ZnVuY3Rpb24oQixJKXtyZXR1cm4gdm9pZCAwPT09ST8idHJhbnNsYXRlKCIrCkIrIikiOiJ0cmFuc2xhdGUoIitCKyIsIitJKyIpIn07Zi5yb3RhdGVTdHI9ZnVuY3Rpb24oQixJKXtsZXQgTj0icm90YXRlKDkwIjt2b2lkIDAhPT1CJiZ2b2lkIDAhPT1JJiYoTj1OKyIsIitCKyIsIitJKTtyZXR1cm4gTisiKSJ9O2YuaXNOdWxsT3JVbmRlZmluZWQ9ZnVuY3Rpb24oQil7cmV0dXJuIG51bGw9PT1CfHx2b2lkIDA9PT1CfTtmLnF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3Q9ZnVuY3Rpb24oQixJLE4sTyxILEspe0IudmlzaXQoKE0sTCxRLFQsWCk9PntpZih2b2lkIDA9PT1NLmxlbmd0aCl7ZG8gTD1CLngoKShNLmRhdGEpLFE9Qi55KCkoTS5kYXRhKSxJPD1MJiZMPE8mJk48PVEmJlE8SCYmSyhNLmRhdGEpO3doaWxlKE09TS5uZXh0KTtyZXR1cm4hMH1yZXR1cm4gTD49T3x8VDw9SXx8UT49SHx8WDw9Tn0pfTtmLnF1YWRUcmVlVmlzaXRQb2ludHNJbkRpc2s9ZnVuY3Rpb24oQixJLE4sTyxIKXtCLnZpc2l0KChLLE0sTCxRLFQpPT57aWYodm9pZCAwPT09Sy5sZW5ndGgpe2RvIE09CkIueCgpKEsuZGF0YSksTD1CLnkoKShLLmRhdGEpLE09Zi5ldWNsaWRlYW5EaXN0KEksTixNLEwpLE08PU8mJkgoSy5kYXRhLE0pO3doaWxlKEs9Sy5uZXh0KTtyZXR1cm4hMH1yZXR1cm4gZi5wb2ludFRvUmVjdGFuZ2xlRGlzdChJLE4sTSxMLFEsVCk+T30pfTtmLmZpbHRlclNldD1mdW5jdGlvbihCLEkpe2NvbnN0IE49bmV3IFNldDtCLmZvckVhY2goTz0+e0koTykmJk4uYWRkKE8pfSk7cmV0dXJuIE59O2Yuc2V0QXJyYXlPYnNlcnZhYmx5PWZ1bmN0aW9uKEIsSSl7Y29uc3QgTj1CLmdldCgic2Vzc2lvbkdyb3VwcyIsQik7QXJyYXkuaXNBcnJheShOKT9CLnNwbGljZS5hcHBseShCLFsic2Vzc2lvbkdyb3VwcyIsMCxOLmxlbmd0aF0uY29uY2F0KEkpKTpCLnNldCgic2Vzc2lvbkdyb3VwcyIsSSl9O2YuaGFzaE9mU3RyaW5nPWZ1bmN0aW9uKEIpe2xldCBJPTA7Zm9yKGxldCBOPTA7TjxCLmxlbmd0aDsrK04pST0zMSpJK0IuY2hhckNvZGVBdChOKSY0Mjk0OTY3Mjk1O3JldHVybiBJKwpNYXRoLnBvdygyLDMxKX19KShkLnV0aWxzfHwoZC51dGlscz17fSkpfSkoYi5ocGFyYW1zfHwoYi5ocGFyYW1zPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLXNwbGl0LWxheW91dC92YWFkaW4tc3BsaXQtbGF5b3V0Lmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1zcGxpdC1sYXlvdXQiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3ZlcnRpY2FsOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxfcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50czpTdHJpbmcsX3ByZXZpb3VzU2Vjb25kYXJ5UG9pbnRlckV2ZW50czpTdHJpbmd9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXI9UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX3Byb2Nlc3NDaGlsZHJlbil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpfSxfcHJvY2Vzc0NoaWxkcmVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gYi5jbGFzc0xpc3QuY29udGFpbnMoInNwbGl0dGVyLWhhbmRsZSIpPwooUG9seW1lci5kb20oYikuc2V0QXR0cmlidXRlKCJzbG90IiwiaGFuZGxlIiksITEpOiEwfSkuZm9yRWFjaChmdW5jdGlvbihiLGQpezA9PT1kPyh0aGlzLl9wcmltYXJ5Q2hpbGQ9YixQb2x5bWVyLmRvbShiKS5zZXRBdHRyaWJ1dGUoInNsb3QiLCJwcmltYXJ5IikpOjE9PWQ/KHRoaXMuX3NlY29uZGFyeUNoaWxkPWIsUG9seW1lci5kb20oYikuc2V0QXR0cmlidXRlKCJzbG90Iiwic2Vjb25kYXJ5IikpOlBvbHltZXIuZG9tKGIpLnJlbW92ZUF0dHJpYnV0ZSgic2xvdCIpfS5iaW5kKHRoaXMpKX0sX3NldEZsZXhCYXNpczpmdW5jdGlvbihiLGQsZil7ZD1NYXRoLm1heCgwLE1hdGgubWluKGQsZikpOzA9PT1kJiYoZD0xRS02KTtiLnN0eWxlLmZsZXg9IjEgMSAiK2QrInB4In0sX29uSGFuZGxlVHJhY2s6ZnVuY3Rpb24oYil7aWYodGhpcy5fcHJpbWFyeUNoaWxkJiZ0aGlzLl9zZWNvbmRhcnlDaGlsZCl7dmFyIGQ9dGhpcy52ZXJ0aWNhbD8iaGVpZ2h0Ijoid2lkdGgiOyJzdGFydCI9PT0KYi5kZXRhaWwuc3RhdGU/KHRoaXMuX3N0YXJ0U2l6ZT17Y29udGFpbmVyOnRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZF0tdGhpcy4kLnNwbGl0dGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdLHByaW1hcnk6dGhpcy5fcHJpbWFyeUNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdLHNlY29uZGFyeTp0aGlzLl9zZWNvbmRhcnlDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkXX0sdGhpcy5fcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50cz10aGlzLl9wcmltYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cyx0aGlzLl9wcmV2aW91c1NlY29uZGFyeVBvaW50ZXJFdmVudHM9dGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cyx0aGlzLl9wcmltYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsdGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIpOihkPXRoaXMudmVydGljYWw/Yi5kZXRhaWwuZHk6CmIuZGV0YWlsLmR4LHRoaXMuX3NldEZsZXhCYXNpcyh0aGlzLl9wcmltYXJ5Q2hpbGQsdGhpcy5fc3RhcnRTaXplLnByaW1hcnkrZCx0aGlzLl9zdGFydFNpemUuY29udGFpbmVyKSx0aGlzLl9zZXRGbGV4QmFzaXModGhpcy5fc2Vjb25kYXJ5Q2hpbGQsdGhpcy5fc3RhcnRTaXplLnNlY29uZGFyeS1kLHRoaXMuX3N0YXJ0U2l6ZS5jb250YWluZXIpLHRoaXMubm90aWZ5UmVzaXplKCksImVuZCI9PT1iLmRldGFpbC5zdGF0ZSYmKGRlbGV0ZSB0aGlzLl9zdGFydFNpemUsdGhpcy5fcHJpbWFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9dGhpcy5fcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50cyx0aGlzLl9zZWNvbmRhcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzPXRoaXMuX3ByZXZpb3VzU2Vjb25kYXJ5UG9pbnRlckV2ZW50cykpfX0sX3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKGIpe2IucHJldmVudERlZmF1bHQoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUvdGYtaHBhcmFtcy1xdWVyeS1wYW5lLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcXVlcnktcGFuZSIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjaGVtYTp7aHBhcmFtQ29sdW1uczpbXSxtZXRyaWNDb2x1bW5zOltdfSxjb2x1bW5zVmlzaWJpbGl0eTpbXSx2aXNpYmxlU2NoZW1hOntocGFyYW1JbmZvczpbXSxtZXRyaWNJbmZvczpbXX19KSxyZWFkT25seTohMCxub3RpZnk6ITB9LHNlc3Npb25Hcm91cHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sX2V4cGVyaW1lbnQ6T2JqZWN0LF9ocGFyYW1zOkFycmF5LF9tZXRyaWNzOkFycmF5LF9zdGF0dXNlczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W3t2YWx1ZToiU1RBVFVTX1VOS05PV04iLGRpc3BsYXlOYW1lOiJVbmtub3duIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19TVUNDRVNTIixkaXNwbGF5TmFtZToiU3VjY2VzcyIsCmFsbG93ZWQ6ITB9LHt2YWx1ZToiU1RBVFVTX0ZBSUxVUkUiLGRpc3BsYXlOYW1lOiJGYWlsdXJlIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19SVU5OSU5HIixkaXNwbGF5TmFtZToiUnVubmluZyIsYWxsb3dlZDohMH1dfSxfZ2V0RXhwZXJpbWVudFJlc29sdmVkOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZShiPT57dGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQ9Yn0pfX0sX3Jlc29sdmVHZXRFeHBlcmltZW50OkZ1bmN0aW9uLF9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9zb3J0QnlJbmRleDpOdW1iZXIsX3NvcnREaXJlY3Rpb246TnVtYmVyLF9wYWdlU2l6ZUlucHV0Ont0eXBlOk9iamVjdCx2YWx1ZTp7dmFsdWU6IjEwMCIsaW52YWxpZDohMX19LF9wYWdlTnVtYmVySW5wdXQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt2YWx1ZToiMSIsaW52YWxpZDohMX19LApfcGFnZUNvdW50U3RyOnt0eXBlOlN0cmluZyx2YWx1ZToiPyJ9LF90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0cjpTdHJpbmcsX3Nlc3Npb25Hcm91cHNSZXF1ZXN0Ok9iamVjdH0sb2JzZXJ2ZXJzOlsiX2NvbXB1dGVFeHBlcmltZW50QW5kUmVsYXRlZFByb3BzKGJhY2tlbmQsIGV4cGVyaW1lbnROYW1lKSIsIl91cGRhdGVDb25maWd1cmF0aW9uKF9ocGFyYW1zLiosIF9tZXRyaWNzLiopIl0scmVsb2FkKCl7dGhpcy5fcXVlcnlTZXJ2ZXIoKX0sX2NzdlVybChiLGQpe3JldHVybiB0aGlzLl9kb3dubG9hZERhdGFVcmwoYixkLCJjc3YiKX0sX2pzb25VcmwoYixkKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCwianNvbiIpfSxfbGF0ZXhVcmwoYixkKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCwibGF0ZXgiKX0sX2Rvd25sb2FkRGF0YVVybChiLGQsZil7cmV0dXJuIHRoaXMuYmFja2VuZC5nZXREb3dubG9hZFVybChmLGIsZC5jb2x1bW5zVmlzaWJpbGl0eSl9LApfY29tcHV0ZUV4cGVyaW1lbnRBbmRSZWxhdGVkUHJvcHMoKXtjb25zdCBiPXRmLmhwYXJhbXMudXRpbHM7Yi5pc051bGxPclVuZGVmaW5lZCh0aGlzLmJhY2tlbmQpfHxiLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuZXhwZXJpbWVudE5hbWUpfHx0aGlzLmJhY2tlbmQuZ2V0RXhwZXJpbWVudCh7ZXhwZXJpbWVudE5hbWU6dGhpcy5leHBlcmltZW50TmFtZX0pLnRoZW4oZD0+e18uaXNFcXVhbChkLHRoaXMuX2V4cGVyaW1lbnQpfHwodGhpcy5zZXQoIl9leHBlcmltZW50IixkKSx0aGlzLl9jb21wdXRlSFBhcmFtcygpLHRoaXMuX2NvbXB1dGVNZXRyaWNzKCksdGhpcy5fcXVlcnlTZXJ2ZXIoKSx0aGlzLl9yZXNvbHZlR2V0RXhwZXJpbWVudCgpKX0pfSxfY29tcHV0ZUhQYXJhbXMoKXtjb25zdCBiPVtdO3RoaXMuX2V4cGVyaW1lbnQuaHBhcmFtSW5mb3MuZm9yRWFjaCgoZCxmKT0+e2NvbnN0IGg9e2luZm86ZCxkaXNwbGF5ZWQ6NT5mLGZpbHRlcjp7fX07aC5pbmZvLmhhc093blByb3BlcnR5KCJkb21haW5EaXNjcmV0ZSIpPwooaC5maWx0ZXIuZG9tYWluRGlzY3JldGU9W10saC5pbmZvLmRvbWFpbkRpc2NyZXRlLmZvckVhY2goaz0+e2guZmlsdGVyLmRvbWFpbkRpc2NyZXRlLnB1c2goe3ZhbHVlOmssY2hlY2tlZDohMH0pfSkpOiJEQVRBX1RZUEVfQk9PTCI9PT1oLmluZm8udHlwZT9oLmZpbHRlci5kb21haW5EaXNjcmV0ZT1be3ZhbHVlOiExLGNoZWNrZWQ6ITB9LHt2YWx1ZTohMCxjaGVja2VkOiEwfV06IkRBVEFfVFlQRV9GTE9BVDY0Ij09PWguaW5mby50eXBlP2guZmlsdGVyLmludGVydmFsPXttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19OiJEQVRBX1RZUEVfU1RSSU5HIj09PWguaW5mby50eXBlP2guZmlsdGVyLnJlZ2V4cD0iIjpjb25zb2xlLndhcm4oInVua25vd24gaHBhcmFtLmluZm8udHlwZTogJXMiLGguaW5mby50eXBlKTtiLnB1c2goaCl9KTt0aGlzLnNldCgiX2hwYXJhbXMiLGIpfSxfY29tcHV0ZU1ldHJpY3MoKXtjb25zdCBiPVtdO3RoaXMuX2V4cGVyaW1lbnQubWV0cmljSW5mb3MuZm9yRWFjaCgoZCwKZik9PntiLnB1c2goe2luZm86ZCxmaWx0ZXI6e2ludGVydmFsOnttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19fSxkaXNwbGF5ZWQ6NT5mfSl9KTt0aGlzLnNldCgiX21ldHJpY3MiLGIpfSxfY29tcHV0ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9ocGFyYW1zJiZ0aGlzLl9tZXRyaWNzP3tocGFyYW1Db2x1bW5zOnRoaXMuX2hwYXJhbXMubWFwKGI9Pih7aHBhcmFtSW5mbzpiLmluZm99KSksbWV0cmljQ29sdW1uczp0aGlzLl9tZXRyaWNzLm1hcChiPT4oe21ldHJpY0luZm86Yi5pbmZvfSkpfTp7aHBhcmFtQ29sdW1uczpbXSxtZXRyaWNDb2x1bW5zOltdfX0sX3VwZGF0ZUNvbmZpZ3VyYXRpb24oKXt0aGlzLmRlYm91bmNlKCJfdXBkYXRlQ29uZmlndXJhdGlvbiIsKCk9Pnt0aGlzLl9zZXRDb25maWd1cmF0aW9uKHtzY2hlbWE6dGhpcy5fY29tcHV0ZVNjaGVtYSgpLGNvbHVtbnNWaXNpYmlsaXR5OnRoaXMuX2NvbXB1dGVDb2x1bW5zVmlzaWJpbGl0eSgpLAp2aXNpYmxlU2NoZW1hOnRoaXMuX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl9KX0pfSxfY29tcHV0ZUNvbHVtbnNWaXNpYmlsaXR5KCl7cmV0dXJuIHRoaXMuX2hwYXJhbXMmJnRoaXMuX21ldHJpY3M/dGhpcy5faHBhcmFtcy5tYXAoYj0+Yi5kaXNwbGF5ZWQpLmNvbmNhdCh0aGlzLl9tZXRyaWNzLm1hcChiPT5iLmRpc3BsYXllZCkpOltdfSxfY29tcHV0ZVZpc2libGVTY2hlbWEoKXtpZighdGhpcy5faHBhcmFtc3x8IXRoaXMuX21ldHJpY3MpcmV0dXJue2hwYXJhbUluZm9zOltdLG1ldHJpY0luZm9zOltdfTtjb25zdCBiPXRoaXMuX2hwYXJhbXMuZmlsdGVyKGY9PmYuZGlzcGxheWVkKS5tYXAoZj0+Zi5pbmZvKSxkPXRoaXMuX21ldHJpY3MuZmlsdGVyKGY9PmYuZGlzcGxheWVkKS5tYXAoZj0+Zi5pbmZvKTtyZXR1cm57aHBhcmFtSW5mb3M6YixtZXRyaWNJbmZvczpkfX0sX3F1ZXJ5U2VydmVyKCl7dGhpcy5kZWJvdW5jZSgicXVlcnlTZXJ2ZXIiLCgpPT50aGlzLl9xdWVyeVNlcnZlck5vRGVib3VuY2UoKSwKMTAwKX0sX3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpe3JldHVybiB0aGlzLl9zZW5kTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCkudGhlbih0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxsYWJsZSgoe3ZhbHVlOmIsY2FuY2VsbGVkOmR9KT0+e2R8fCgwPD1iLnRvdGFsU2l6ZT8odGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLFN0cmluZyhNYXRoLmNlaWwoYi50b3RhbFNpemUvK3RoaXMuX3BhZ2VTaXplSW5wdXQudmFsdWUpKSksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsYi50b3RhbFNpemUpKToodGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLCI/IiksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsIlVua25vd24iKSksdGYuaHBhcmFtcy51dGlscy5zZXRBcnJheU9ic2VydmFibHkodGhpcyxiLnNlc3Npb25Hcm91cHMpKX0pKX0sX3NlbmRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKXtjb25zdCBiPXRoaXMuX2J1aWxkTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCk7CmlmKG51bGwhPT1iKXJldHVybiB0aGlzLnNldCgiX3Nlc3Npb25Hcm91cHNSZXF1ZXN0IixiKSx0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxBbGwoKSx0aGlzLmJhY2tlbmQubGlzdFNlc3Npb25Hcm91cHMoYil9LF9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2Z1bmN0aW9uIGIobSl7dmFyIG49Zi5nZXQobSsiLm1pbi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PW4pO249IiI9PT1uPyItSW5maW5pdHkiOituO2Yuc2V0KG0rIi5taW4uaW52YWxpZCIsaXNOYU4obikpO2g9aCYmIWlzTmFOKG4pO3ZhciBxPWYuZ2V0KG0rIi5tYXgudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1xKTtxPSIiPT09cT8iSW5maW5pdHkiOitxO2Yuc2V0KG0rIi5tYXguaW52YWxpZCIsaXNOYU4ocSkpO2g9aCYmIWlzTmFOKHEpO3JldHVybiBpc05hTihuKXx8aXNOYU4ocSk/bnVsbDp7bWluVmFsdWU6bixtYXhWYWx1ZTpxfX1mdW5jdGlvbiBkKG0pe3ZhciBuPQpmLmdldChtKyIudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1uKTtuPStuO2NvbnN0IHE9TnVtYmVyLmlzSW50ZWdlcihuKSYmMDxuO2Yuc2V0KG0rIi5pbnZhbGlkIiwhcSk7aD1oJiZxO3JldHVybiBxP246bnVsbH1jb25zdCBmPXRoaXM7bGV0IGg9ITA7Y29uc3Qgaz10aGlzLl9zdGF0dXNlcy5maWx0ZXIobT0+bS5hbGxvd2VkKS5tYXAobT0+bS52YWx1ZSk7bGV0IHQ9W107dGhpcy5faHBhcmFtcy5mb3JFYWNoKChtLG4pPT57bGV0IHE9e2hwYXJhbTptLmluZm8ubmFtZX07aWYobS5maWx0ZXIuZG9tYWluRGlzY3JldGUpcS5maWx0ZXJEaXNjcmV0ZT1bXSxtLmZpbHRlci5kb21haW5EaXNjcmV0ZS5mb3JFYWNoKHU9Pnt1LmNoZWNrZWQmJnEuZmlsdGVyRGlzY3JldGUucHVzaCh1LnZhbHVlKX0pO2Vsc2UgaWYobS5maWx0ZXIuaW50ZXJ2YWwpcS5maWx0ZXJJbnRlcnZhbD1iKCJfaHBhcmFtcy4iK24rIi5maWx0ZXIuaW50ZXJ2YWwiKTtlbHNlIGlmKG0uZmlsdGVyLnJlZ2V4cClxLmZpbHRlclJlZ2V4cD0KbS5maWx0ZXIucmVnZXhwO2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoImhwYXJhbS5maWx0ZXIgd2l0aCBubyBkb21haW5EaXNjcmV0ZSwgaW50ZXJ2YWwgb3IgcmVnZXhwIHByb3BlcnRpZXMgc2V0OiAlcyIsbSksbnVsbDt0LnB1c2gocSl9KTt0aGlzLl9tZXRyaWNzLmZvckVhY2goKG0sbik9PnttPXttZXRyaWM6bS5pbmZvLm5hbWUsZmlsdGVySW50ZXJ2YWw6YigiX21ldHJpY3MuIituKyIuZmlsdGVyLmludGVydmFsIil9O3QucHVzaChtKX0pO2lmKHZvaWQgMCE9PXRoaXMuX3NvcnRCeUluZGV4JiZ2b2lkIDAhPT10aGlzLl9zb3J0RGlyZWN0aW9uKXtpZighKHRoaXMuX3NvcnRCeUluZGV4IGluIHQpKXJldHVybiBjb25zb2xlLmVycm9yKCJObyBjb2x1bW4gaW4gY29sUGFyYW1zIHdpdGggaW5kZXggc29ydEJ5SW5kZXg6ICVzIix0aGlzLl9zb3J0QnlJbmRleCksbnVsbDt0W3RoaXMuX3NvcnRCeUluZGV4XS5vcmRlcj0wPT09dGhpcy5fc29ydERpcmVjdGlvbj8iT1JERVJfQVNDIjoKIk9SREVSX0RFU0MifWNvbnN0IGw9ZCgiX3BhZ2VOdW1iZXJJbnB1dCIpLHA9ZCgiX3BhZ2VTaXplSW5wdXQiKTtyZXR1cm4gaD97ZXhwZXJpbWVudE5hbWU6dGhpcy5leHBlcmltZW50TmFtZSxhbGxvd2VkU3RhdHVzZXM6ayxjb2xQYXJhbXM6dCxzdGFydEluZGV4OnAqKGwtMSksc2xpY2VTaXplOnB9Om51bGx9LF9tZXRyaWNTb3J0QnlJbmRleChiKXtyZXR1cm4gYit0aGlzLl9ocGFyYW1zLmxlbmd0aH0sX2hwYXJhbU5hbWU6dGYuaHBhcmFtcy51dGlscy5ocGFyYW1OYW1lLF9tZXRyaWNOYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZSxfcHJldHR5UHJpbnQ6dGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludH0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tcGFnZXMvaXJvbi1wYWdlcy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLXBhZ2VzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcl0scHJvcGVydGllczp7YWN0aXZhdGVFdmVudDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZWxlY3RlZFBhZ2VDaGFuZ2VkKHNlbGVjdGVkKSJdLF9zZWxlY3RlZFBhZ2VDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyh0aGlzLm5vdGlmeVJlc2l6ZSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaGVhZGVyLXBhbmVsL3BhcGVyLWhlYWRlci1wYW5lbC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtzY3JvbGw6ITB9LGQ9e3N0YW5kYXJkOjIsd2F0ZXJmYWxsOjEsIndhdGVyZmFsbC10YWxsIjoxfSxmPXsid2F0ZXJmYWxsLXRhbGwiOiEwfTtQb2x5bWVyKHtpczoicGFwZXItaGVhZGVyLXBhbmVsIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RhbmRhcmQiLG9ic2VydmVyOiJfbW9kZUNoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sc2hhZG93Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHRhbGxDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6InRhbGwifSxhdFRvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW4oYXRUb3AsIG1vZGUsIHNoYWRvdykiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FkZExpc3RlbmVyKCk7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXIoKX0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxIYW5kbGVyPXRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpO2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sZ2V0IGhlYWRlcigpe3JldHVybiBQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyU2xvdCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdfSxnZXQgc2Nyb2xsZXIoKXtyZXR1cm4gdGhpcy5fZ2V0U2Nyb2xsZXJGb3JNb2RlKHRoaXMubW9kZSl9LGdldCB2aXNpYmxlU2hhZG93KCl7cmV0dXJuIHRoaXMuJC5kcm9wU2hhZG93LmNsYXNzTGlzdC5jb250YWlucygiaGFzLXNoYWRvdyIpfSxfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW46ZnVuY3Rpb24oaCxrKXtrPWRba107dGhpcy5zaGFkb3c/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITAsdGhpcy4kLmRyb3BTaGFkb3cpOjI9PT1rP3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KToKMSE9PWt8fGg/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITEsdGhpcy4kLmRyb3BTaGFkb3cpOnRoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KX0sX2NvbXB1dGVNYWluQ29udGFpbmVyQ2xhc3M6ZnVuY3Rpb24oaCl7dmFyIGs9e307ay5mbGV4PSJjb3ZlciIhPT1oO3JldHVybiBPYmplY3Qua2V5cyhrKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIGtbdF19KS5qb2luKCIgIil9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLnNjcm9sbEhhbmRsZXIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX21vZGVDaGFuZ2VkOmZ1bmN0aW9uKGgsayl7dmFyIHQ9dGhpcy5oZWFkZXI7dCYmKGZba10mJiFmW2hdPyh0LmNsYXNzTGlzdC5yZW1vdmUodGhpcy50YWxsQ2xhc3MpLAp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJhbmltYXRlIil9LDIwMCkpOnRoaXMudG9nZ2xlQ2xhc3MoImFuaW1hdGUiLGZbaF0sdCkpO3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxfa2VlcFNjcm9sbGluZ1N0YXRlOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5zY3JvbGxlcixrPXRoaXMuaGVhZGVyO3RoaXMuX3NldEF0VG9wKDA9PT1oLnNjcm9sbFRvcCk7ayYmdGhpcy50YWxsQ2xhc3MmJmZbdGhpcy5tb2RlXSYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnRhbGxDbGFzcyx0aGlzLmF0VG9wfHxrLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLnRhbGxDbGFzcykmJmguc2Nyb2xsSGVpZ2h0PHRoaXMub2Zmc2V0SGVpZ2h0LGspfSxfc2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCk7dGhpcy5maXJlKCJjb250ZW50LXNjcm9sbCIse3RhcmdldDp0aGlzLnNjcm9sbGVyfSx7YnViYmxlczohMX0pfSxfZ2V0U2Nyb2xsZXJGb3JNb2RlOmZ1bmN0aW9uKGgpe3JldHVybiBiW2hdPwp0aGlzOnRoaXMuJC5tYWluQ29udGFpbmVyfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10YWIiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcl0scHJvcGVydGllczp7bGluazp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0YWIifSxsaXN0ZW5lcnM6e2Rvd246Il91cGRhdGVOb2luayIsdGFwOiJfb25UYXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZU5vaW5rKCl9LGdldCBfcGFyZW50Tm9pbmsoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiEhYiYmISFiLm5vaW5rfSxfdXBkYXRlTm9pbms6ZnVuY3Rpb24oKXt0aGlzLm5vaW5rPSEhdGhpcy5ub2lua3x8ISF0aGlzLl9wYXJlbnROb2lua30sX29uVGFwOmZ1bmN0aW9uKGIpe2lmKHRoaXMubGluayl7dmFyIGQ9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCJhIik7CmQmJmIudGFyZ2V0IT09ZCYmZC5jbGljaygpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYnMuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGFicyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLHByb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxub0Jhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub1NsaWRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZml0Q29udGFpbmVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVEcmFnOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGhpZGVTY3JvbGxCdXR0b25zOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsaWduQm90dG9tOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci10YWIifSxhdXRvc2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9zZWxlY3REZWxheTp7dHlwZTpOdW1iZXIsCnZhbHVlOjB9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2hvbGREZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2xlZnRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3JpZ2h0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wcmV2aW91c1RhYjp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToidGFibGlzdCJ9LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uVGFiU2l6aW5nQ2hhbmdlZCIsImlyb24taXRlbXMtY2hhbmdlZCI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QiLCJpcm9uLWRlc2VsZWN0IjoiX29uSXJvbkRlc2VsZWN0In0sa2V5QmluZGluZ3M6eyJsZWZ0OmtleXVwIHJpZ2h0OmtleXVwIjoiX29uQXJyb3dLZXl1cCJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9ob2xkSm9iPW51bGw7dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT0Kdm9pZCAwO3RoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXI9dGhpcy5fZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9vbkJsdXJDYXB0dXJlLmJpbmQodGhpcyksITApfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2V0U2Nyb2xsRGlyZWN0aW9uKCJ5Iix0aGlzLiQudGFic0NvbnRhaW5lcil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sX25vaW5rQ2hhbmdlZDpmdW5jdGlvbihiKXtQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci10YWIiKS5mb3JFYWNoKGI/dGhpcy5fc2V0Tm9pbmtBdHRyaWJ1dGU6dGhpcy5fcmVtb3ZlTm9pbmtBdHRyaWJ1dGUpfSxfc2V0Tm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24oYil7Yi5zZXRBdHRyaWJ1dGUoIm5vaW5rIiwiIil9LF9yZW1vdmVOb2lua0F0dHJpYnV0ZTpmdW5jdGlvbihiKXtiLnJlbW92ZUF0dHJpYnV0ZSgibm9pbmsiKX0sCl9jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3M6ZnVuY3Rpb24oYixkLGYpe3JldHVybiFkfHxmPyJoaWRkZW4iOmI/Im5vdC12aXNpYmxlIjoiIn0sX2NvbXB1dGVUYWJzQ29udGVudENsYXNzOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/InNjcm9sbGFibGUiKyhkPyIgZml0LWNvbnRhaW5lciI6IiIpOiIgZml0LWNvbnRhaW5lciJ9LF9jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3M6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj8iaGlkZGVuIjpkPyJhbGlnbi1ib3R0b20iOiIifSxfb25UYWJTaXppbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX29uVGFiU2l6aW5nQ2hhbmdlZCIsZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGwoKTt0aGlzLl90YWJDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRJdGVtKX0sMTApfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMuX3RhYkNoYW5nZWQoYi5kZXRhaWwuaXRlbSx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9Yi5kZXRhaWwuaXRlbTsKdGhpcy5jYW5jZWxEZWJvdW5jZXIoInRhYi1jaGFuZ2VkIil9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoInRhYi1jaGFuZ2VkIixmdW5jdGlvbigpe3RoaXMuX3RhYkNoYW5nZWQobnVsbCx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9bnVsbH0sMSl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX2FjdGl2YXRlSGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9zY2hlZHVsZUFjdGl2YXRpb246ZnVuY3Rpb24oYixkKXt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09Yjt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5hc3luYyh0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLGQpfSxfZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtOwp0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXZvaWQgMDtiLmZpcmUodGhpcy5hY3RpdmF0ZUV2ZW50LG51bGwse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pfSxfY2FuY2VsUGVuZGluZ0FjdGl2YXRpb246ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCksdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDApfSxfb25BcnJvd0tleXVwOmZ1bmN0aW9uKCl7dGhpcy5hdXRvc2VsZWN0JiZ0aGlzLl9zY2hlZHVsZUFjdGl2YXRpb24odGhpcy5mb2N1c2VkSXRlbSx0aGlzLmF1dG9zZWxlY3REZWxheSl9LF9vbkJsdXJDYXB0dXJlOmZ1bmN0aW9uKGIpe2IudGFyZ2V0PT09dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtJiZ0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpfSwKZ2V0IF90YWJDb250YWluZXJTY3JvbGxTaXplKCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsV2lkdGgtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgpfSxfc2Nyb2xsOmZ1bmN0aW9uKGIsZCl7dGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9hZmZlY3RTY3JvbGwoZCYmLWQuZGR4fHwwKX0sX2Rvd246ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKX0sMSl9LF9hZmZlY3RTY3JvbGw6ZnVuY3Rpb24oYil7dGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9YjtiPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7dGhpcy5fbGVmdEhpZGRlbj0wPT09Yjt0aGlzLl9yaWdodEhpZGRlbj1iPT09dGhpcy5fdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZX0sCl9vbkxlZnRTY3JvbGxCdXR0b25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsVG9MZWZ0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb0xlZnQuYmluZCh0aGlzKSx0aGlzLl9ob2xkRGVsYXkpfSxfb25SaWdodFNjcm9sbEJ1dHRvbkRvd246ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxUb1JpZ2h0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb1JpZ2h0LmJpbmQodGhpcyksdGhpcy5faG9sZERlbGF5KX0sX29uU2Nyb2xsQnV0dG9uVXA6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuX2hvbGRKb2IpO3RoaXMuX2hvbGRKb2I9bnVsbH0sX3Njcm9sbFRvTGVmdDpmdW5jdGlvbigpe3RoaXMuX2FmZmVjdFNjcm9sbCgtdGhpcy5fc3RlcCl9LF9zY3JvbGxUb1JpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5fYWZmZWN0U2Nyb2xsKHRoaXMuX3N0ZXApfSxfdGFiQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2lmKGIpe3ZhciBmPXRoaXMuJC50YWJzQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKaD1mLndpZHRoLGs9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtmPWsubGVmdC1mLmxlZnQ7dGhpcy5fcG9zPXt3aWR0aDp0aGlzLl9jYWxjUGVyY2VudChrLndpZHRoLGgpLGxlZnQ6dGhpcy5fY2FsY1BlcmNlbnQoZixoKX07aWYodGhpcy5ub1NsaWRlfHxudWxsPT1kKXRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiZXhwYW5kIiksdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCk7ZWxzZXt2YXIgdD1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Q9dGhpcy5pdGVtcy5pbmRleE9mKGQpO2I9dGhpcy5pdGVtcy5pbmRleE9mKGIpO3RoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LmFkZCgiZXhwYW5kIik7Yj1kPGI7dGhpcy5faXNSVEwmJihiPSFiKTtiP3RoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KGsubGVmdCtrLndpZHRoLQp0LmxlZnQsaCktNSx0aGlzLl9sZWZ0KTp0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9jYWxjUGVyY2VudCh0LmxlZnQrdC53aWR0aC1rLmxlZnQsaCktNSx0aGlzLl9jYWxjUGVyY2VudChmLGgpKzUpO3RoaXMuc2Nyb2xsYWJsZSYmdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZElmTmVlZGVkKGsud2lkdGgsZil9fWVsc2UgdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJleHBhbmQiKSx0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImNvbnRyYWN0IiksdGhpcy5fcG9zaXRpb25CYXIoMCwwKX0sX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZDpmdW5jdGlvbihiLGQpe2QtPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7MD5kP3RoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQrPWQ6KGQrPWItdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgsMDxkJiYodGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9ZCkpfSxfY2FsY1BlcmNlbnQ6ZnVuY3Rpb24oYiwKZCl7cmV0dXJuIDEwMCpiL2R9LF9wb3NpdGlvbkJhcjpmdW5jdGlvbihiLGQpe2I9Ynx8MDtkPWR8fDA7dGhpcy5fd2lkdGg9Yjt0aGlzLl9sZWZ0PWQ7dGhpcy50cmFuc2Zvcm0oInRyYW5zbGF0ZVgoIitkKyIlKSBzY2FsZVgoIitiLzEwMCsiKSIsdGhpcy4kLnNlbGVjdGlvbkJhcil9LF9vbkJhclRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdDtiLmNvbnRhaW5zKCJleHBhbmQiKT8oYi5yZW1vdmUoImV4cGFuZCIpLGIuYWRkKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCkpOmIuY29udGFpbnMoImNvbnRyYWN0IikmJmIucmVtb3ZlKCJjb250cmFjdCIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvb2xiYXIvcGFwZXItdG9vbGJhci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b29sYmFyIixob3N0QXR0cmlidXRlczp7cm9sZToidG9vbGJhciJ9LHByb3BlcnRpZXM6e2JvdHRvbUp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxqdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sbWlkZGxlSnVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxyZWFkeTpmdW5jdGlvbigpe2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj10aGlzLl9vYnNlcnZlKHRoaXMpO3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJnRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKX0sX29ic2VydmU6ZnVuY3Rpb24oYil7dmFyIGQ9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpfS5iaW5kKHRoaXMpKTsKZC5vYnNlcnZlKGIse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7cmV0dXJuIGR9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe1BvbHltZXIuZG9tLmZsdXNoKCk7Zm9yKHZhciBiPVtdLGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJzbG90IikpLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoImNvbnRlbnQiKSkpLGYsaD0wO2Y9ZFtoXTtoKyspe2Y9UG9seW1lci5kb20oZikuZ2V0RGlzdHJpYnV0ZWROb2RlcygpO2Zvcih2YXIgayx0PTA7az1mW3RdO3QrKylpZihrLmNsYXNzTGlzdCYmay5jbGFzc0xpc3QuY29udGFpbnMoInRpdGxlIikpaWYoay5pZCliLnB1c2goay5pZCk7ZWxzZXt2YXIgbD0icGFwZXItdG9vbGJhci1sYWJlbC0iK01hdGguZmxvb3IoMUU0Kk1hdGgucmFuZG9tKCkpO2suaWQ9bDtiLnB1c2gobCl9fTA8CmIubGVuZ3RoJiZ0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixiLmpvaW4oIiAiKSl9LF9jb21wdXRlQmFyRXh0cmFDbGFzc2VzOmZ1bmN0aW9uKGIpe3JldHVybiBiP2IrKCJqdXN0aWZpZWQiPT09Yj8iIjoiLWp1c3RpZmllZCIpOiIifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzL3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIixwcm9wZXJ0aWVzOntjb25maWd1cmF0aW9uOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LG9wdGlvbnM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKGNvbmZpZ3VyYXRpb24uKikiLCJfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcyhzZXNzaW9uR3JvdXBzLiopIl0sX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKCl7Y29uc3QgYj10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYSxkPXRoaXMuY29uZmlndXJhdGlvbi5zY2hlbWEsZj17Y29sdW1uczpiLmhwYXJhbUluZm9zLm1hcCgoaCxrKT0+KHtuYW1lOnRmLmhwYXJhbXMudXRpbHMuaHBhcmFtTmFtZShoKSxpbmRleDprLGFic29sdXRlSW5kZXg6dGYuaHBhcmFtcy51dGlscy5nZXRBYnNvbHV0ZUNvbHVtbkluZGV4KGQsYixrKSxzY2FsZTp0aGlzLl9pc051bWVyaWNDb2x1bW4oayk/CiJMSU5FQVIiOiJOT05fTlVNRVJJQyJ9KSkuY29uY2F0KGIubWV0cmljSW5mb3MubWFwKChoLGspPT57ays9Yi5ocGFyYW1JbmZvcy5sZW5ndGg7cmV0dXJue3NjYWxlOiJMSU5FQVIiLG5hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lKGgpLGluZGV4OmssYWJzb2x1dGVJbmRleDp0Zi5ocGFyYW1zLnV0aWxzLmdldEFic29sdXRlQ29sdW1uSW5kZXgoZCxiLGspfX0pKSxtaW5Db2xvcjoiIzAwMDBGRiIsbWF4Q29sb3I6IiNGRjAwMDAiLGNvbmZpZ3VyYXRpb246dGhpcy5jb25maWd1cmF0aW9ufTt0aGlzLnNldCgib3B0aW9ucyIsZik7UG9seW1lci5kb20uZmx1c2goKTt0aGlzLnNldCgib3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgiLHRoaXMuX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKSl9LF91bnNlbGVjdERpc2FibGVkTG9nU2NhbGVzKCl7bnVsbCE9PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmNvbHVtbnMuZm9yRWFjaChiPT57Y29uc3QgZD0ib3B0aW9ucy5jb2x1bW5zLiIrCmIuaW5kZXg7dGhpcy5fYWxsb3dMb2dTY2FsZShiKXx8IkxPRyIhPT1iLnNjYWxlfHx0aGlzLnNldChkKyIuc2NhbGUiLCJMSU5FQVIiKX0pfSxfYWxsb3dMb2dTY2FsZShiKXtpZighdGhpcy5faXNOdW1lcmljQ29sdW1uKGIuaW5kZXgpfHwhdGhpcy5zZXNzaW9uR3JvdXBzKXJldHVybiExO2NvbnN0IFtkLGZdPXRmLmhwYXJhbXMudXRpbHMudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQodGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGIuaW5kZXgpO3JldHVybiAwPGR8fDA+Zn0sX2lzTnVtZXJpY0NvbHVtbihiKXtyZXR1cm4gYj49dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RofHwiREFUQV9UWVBFX0ZMT0FUNjQiPT09dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3NbYl0udHlwZX0sX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKXtpZigwPHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aClyZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RoOwpjb25zdCBiPXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmZpbmRJbmRleChkPT4iREFUQV9UWVBFX0ZMT0FUNjQiPT09ZC50eXBlKTtpZigtMSE9PWIpcmV0dXJuIGJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthY3RpdmVJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6bnVsbH19LGxpc3RlbmVyczp7ImNlbGwtYWN0aXZhdGUiOiJfYWN0aXZhdGVJdGVtIn0sb2JzZXJ2ZXJzOlsiX2FjdGl2ZUl0ZW1DaGFuZ2VkKGFjdGl2ZUl0ZW0pIl0sX2FjdGl2YXRlSXRlbTpmdW5jdGlvbihiKXt2YXIgZD1iLmRldGFpbC5tb2RlbC5pdGVtO3RoaXMuYWN0aXZlSXRlbT10aGlzLmFjdGl2ZUl0ZW0hPT1kP2Q6bnVsbDtiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxfYWN0aXZlSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMmJnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3RoaXMuX3VwZGF0ZUl0ZW0oYixiLml0ZW0pfS5iaW5kKHRoaXMpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7X3ZpZHhPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGlvczp7dHlwZTpCb29sZWFuLHZhbHVlOm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspLykscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxmaXhlZFNlY3Rpb25zOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLGNvbXB1dGVkOiJfaGFzRml4ZWRTZWN0aW9ucyhzY3JvbGxiYXJXaWR0aCkifSxfZnJvemVuQ2VsbHM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNjcm9sbGluZzp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxUYXJnZXQ9dGhpcy4kLnRhYmxlfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMubGlzdGVuKHRoaXMuc2Nyb2xsVGFyZ2V0LCJ3aGVlbCIsCiJfb25XaGVlbCIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5zY3JvbGxUYXJnZXQsIndoZWVsIiwiX29uV2hlZWwiKX0sc2Nyb2xsVG9TY2FsZWRJbmRleDpmdW5jdGlvbihiKXt0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleD1udWxsO3RoaXMuJC5pdGVtcy5zdHlsZS5ib3JkZXJUb3BXaWR0aHx8KHRoaXMuX3BlbmRpbmdTY3JvbGxUb1NjYWxlZEluZGV4PWIpO2I9TWF0aC5taW4oTWF0aC5tYXgoYiwwKSx0aGlzLnNpemUtMSk7dGhpcy4kLnRhYmxlLnNjcm9sbFRvcD1iL3RoaXMuc2l6ZSp0aGlzLiQudGFibGUuc2Nyb2xsSGVpZ2h0O3RoaXMuX3Njcm9sbEhhbmRsZXIoKTt0aGlzLnNjcm9sbFRvSW5kZXgoYi10aGlzLl92aWR4T2Zmc2V0KTt0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3Njcm9sbFBvc2l0aW9uKTt0aGlzLl9zY3JvbGxIYW5kbGVyKCk7dGhpcy5fdmlkeE9mZnNldCt0aGlzLmxhc3RWaXNpYmxlSW5kZXg9PT10aGlzLnNpemUtCjEmJih0aGlzLiQudGFibGUuc2Nyb2xsVG9wPXRoaXMuJC50YWJsZS5zY3JvbGxIZWlnaHQtdGhpcy4kLnRhYmxlLm9mZnNldEhlaWdodCx0aGlzLl9zY3JvbGxIYW5kbGVyKCkpfSxfaGFzRml4ZWRTZWN0aW9uczpmdW5jdGlvbihiKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZS8pJiYwPT09Yn0sX29uV2hlZWw6ZnVuY3Rpb24oYil7aWYoIWIuY3RybEtleSYmIXRoaXMuX2hhc1Njcm9sbGVkQW5jZXN0b3IoYi50YXJnZXQsYi5kZWx0YVgsYi5kZWx0YVkpKXt2YXIgZD10aGlzLiQudGFibGUsZj1iLmRlbHRhWTsxPT09Yi5kZWx0YU1vZGUmJihmKj1ncmlkLiQuc2Nyb2xsZXIuX3BoeXNpY2FsQXZlcmFnZSk7dmFyIGg9TWF0aC5hYnMoYi5kZWx0YVgpK01hdGguYWJzKGYpO3RoaXMuX2NhblNjcm9sbChkLGIuZGVsdGFYLGYpPyhiLnByZXZlbnREZWZhdWx0KCksZC5zY3JvbGxUb3ArPWYsZC5zY3JvbGxMZWZ0Kz1iLmRlbHRhWCx0aGlzLl9zY3JvbGxIYW5kbGVyKCksCnRoaXMuX2hhc1Jlc2lkdWFsTW9tZW50dW09ITAsdGhpcy5faWdub3JlTmV3V2hlZWw9dGhpcy5kZWJvdW5jZSgiaWdub3JlLW5ldy13aGVlbCIsZnVuY3Rpb24oKXt0aGlzLl9pZ25vcmVOZXdXaGVlbD1udWxsfSw1MDApKTp0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtJiZoPD10aGlzLl9wcmV2aW91c01vbWVudHVtfHx0aGlzLl9pZ25vcmVOZXdXaGVlbD9iLnByZXZlbnREZWZhdWx0KCk6aD50aGlzLl9wcmV2aW91c01vbWVudHVtJiYodGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bT0hMSk7dGhpcy5fcHJldmlvdXNNb21lbnR1bT1ofX0sX2hhc1Njcm9sbGVkQW5jZXN0b3I6ZnVuY3Rpb24oYixkLGYpe2lmKHRoaXMuX2NhblNjcm9sbChiLGQsZikpcmV0dXJuITA7aWYoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCIhPT1iLmxvY2FsTmFtZSYmYiE9PXRoaXMmJmIucGFyZW50RWxlbWVudClyZXR1cm4gdGhpcy5faGFzU2Nyb2xsZWRBbmNlc3RvcihiLnBhcmVudEVsZW1lbnQsZCxmKX0sCl9jYW5TY3JvbGw6ZnVuY3Rpb24oYixkLGYpe3JldHVybiAwPGYmJmIuc2Nyb2xsVG9wPGIuc2Nyb2xsSGVpZ2h0LWIub2Zmc2V0SGVpZ2h0fHwwPmYmJjA8Yi5zY3JvbGxUb3B8fDA8ZCYmYi5zY3JvbGxMZWZ0PGIuc2Nyb2xsV2lkdGgtYi5vZmZzZXRXaWR0aHx8MD5kJiYwPGIuc2Nyb2xsTGVmdH0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgYj1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxkPWItdGhpcy5fc2Nyb2xsUG9zaXRpb24sZj10aGlzLl9yYXRpbyxoPTAsaz10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSx0PWYsbD1bXTt0aGlzLl9zY3JvbGxQb3NpdGlvbj1iO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt2YXIgcD10aGlzLl9zY3JvbGxCb3R0b207dmFyIG09dGhpcy5fcGh5c2ljYWxCb3R0b207aWYoTWF0aC5hYnMoZCk+dGhpcy5fcGh5c2ljYWxTaXplKXRoaXMuX3BoeXNpY2FsVG9wKz0KZCxoPU1hdGgucm91bmQoZC90aGlzLl9waHlzaWNhbEF2ZXJhZ2UpO2Vsc2UgaWYoMD5kKXt2YXIgbj1iLXRoaXMuX3BoeXNpY2FsVG9wO2w9dGhpcy5fdmlydHVhbFN0YXJ0O3ZhciBxPVtdO3ZhciB1PXRoaXMuX3BoeXNpY2FsRW5kO2Zvcih0PW4vazt0PGYmJmg8dGhpcy5fcGh5c2ljYWxDb3VudCYmMDxsLWgmJm0tdGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpPnA7KW49dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpLHQrPW4vayxtLT1uLHEucHVzaCh1KSxoKyssdT0wPT09dT90aGlzLl9waHlzaWNhbENvdW50LTE6dS0xO2w9cTtoPS1ofWVsc2UgaWYoMDxkKXt2YXIgeD10aGlzLl92aXJ0dWFsRW5kLEE9dGhpcy5fdmlydHVhbENvdW50LTE7cT1bXTt1PXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHQ9KG0tcCkvazt0PGYmJmg8dGhpcy5fcGh5c2ljYWxDb3VudCYmeCtoPEEmJnRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh1KTwKYjspbj10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodSksdCs9bi9rLHRoaXMuX3BoeXNpY2FsVG9wKz1uLHEucHVzaCh1KSxoKyssdT0odSsxKSV0aGlzLl9waHlzaWNhbENvdW50fXRoaXMuX3ZpcnR1YWxDb3VudDx0aGlzLnNpemUmJnRoaXMuX2FkanVzdFZpcnR1YWxJbmRleE9mZnNldChkKTswPT09aD8obTxwfHx0aGlzLl9waHlzaWNhbFRvcD5iKSYmdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoKToodGhpcy5fdmlydHVhbFN0YXJ0Kz1oLHRoaXMuX3BoeXNpY2FsU3RhcnQrPWgsdGhpcy5fdXBkYXRlKHEsbCkpO3RoaXMuX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpO3RoaXMuaGFzQXR0cmlidXRlKCJyZW9yZGVyaW5nIil8fCh0aGlzLnNjcm9sbGluZz0hMCk7dGhpcy5kZWJvdW5jZSgidmFhZGluLWdyaWQtc2Nyb2xsaW5nIixmdW5jdGlvbigpe3RoaXMuc2Nyb2xsaW5nPSExO3RoaXMuX3Jlb3JkZXJSb3dzKCl9LDEwMCl9LF9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQ6ZnVuY3Rpb24oYil7aWYoMUU0PApNYXRoLmFicyhiKSl0aGlzLl9ub1NjYWxlP3RoaXMuX25vU2NhbGU9ITE6KGI9TWF0aC5yb3VuZCh0aGlzLl9zY3JvbGxQb3NpdGlvbi90aGlzLl9zY3JvbGxIZWlnaHQqMUUzKS8xRTMsdGhpcy5fdmlkeE9mZnNldD1NYXRoLnJvdW5kKGIqdGhpcy5zaXplLWIqdGhpcy5fdmlydHVhbENvdW50KSwwPT09dGhpcy5fc2Nyb2xsVG9wJiZ0aGlzLnNjcm9sbFRvSW5kZXgoMCkpO2Vsc2V7Yj10aGlzLl92aWR4T2Zmc2V0fHwwOzA9PT10aGlzLl9zY3JvbGxUb3A/KHRoaXMuX3ZpZHhPZmZzZXQ9MCxiIT09dGhpcy5fdmlkeE9mZnNldCYmdGhpcy5zY3JvbGxUb0luZGV4KDApKToxRTM+dGhpcy5maXJzdFZpc2libGVJbmRleCYmMDx0aGlzLl92aWR4T2Zmc2V0JiYodGhpcy5fdmlkeE9mZnNldC09TWF0aC5taW4odGhpcy5fdmlkeE9mZnNldCwxMDApLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4KyhiLXRoaXMuX3ZpZHhPZmZzZXQpKzEpLHRoaXMuX25vU2NhbGU9CiEwKTt2YXIgZD10aGlzLnNpemUtdGhpcy5fdmlydHVhbENvdW50O3RoaXMuX3Njcm9sbFRvcD49dGhpcy5fbWF4U2Nyb2xsVG9wPyh0aGlzLl92aWR4T2Zmc2V0PWQsYiE9PXRoaXMuX3ZpZHhPZmZzZXQmJnRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLl92aXJ0dWFsQ291bnQpKTp0aGlzLmZpcnN0VmlzaWJsZUluZGV4PnRoaXMuX3ZpcnR1YWxDb3VudC0xRTMmJnRoaXMuX3ZpZHhPZmZzZXQ8ZCYmKHRoaXMuX3ZpZHhPZmZzZXQrPU1hdGgubWluKGQtdGhpcy5fdmlkeE9mZnNldCwxMDApLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4LSh0aGlzLl92aWR4T2Zmc2V0LWIpKSx0aGlzLl9ub1NjYWxlPSEwKX19LF9yZW9yZGVyUm93czpmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5pdGVtcyksZD1iLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3ciKSxmPWQubGVuZ3RoLShkWzBdLmluZGV4LSh0aGlzLl92aXJ0dWFsU3RhcnQrdGhpcy5fdmlkeE9mZnNldCkpOwppZihmPGQubGVuZ3RoLzIpZm9yKHZhciBoPTA7aDxmO2grKyliLmFwcGVuZENoaWxkKGRbaF0pO2Vsc2UgZm9yKDtmPGQubGVuZ3RoO2YrKyliLmluc2VydEJlZm9yZShkW2ZdLGRbMF0pfSxfZnJvemVuQ2VsbHNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiY2FjaGUtZWxlbWVudHMiLGZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcy5kb21Ib3N0LnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1jZWxsIikuZm9yRWFjaChmdW5jdGlvbihiKXtiLnN0eWxlLnRyYW5zZm9ybT0iIn0pO3RoaXMuX2Zyb3plbkNlbGxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJbZnJvemVuXSIpKTt0aGlzLl90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKX0pO3RoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKX0sX3VwZGF0ZUxhc3RGcm96ZW46ZnVuY3Rpb24oKXtpZih0aGlzLmNvbHVtblRyZWUpe3ZhciBiPQp0aGlzLmNvbHVtblRyZWVbdGhpcy5jb2x1bW5UcmVlLmxlbmd0aC0xXS5zbGljZSgwKTtiLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gZi5fb3JkZXItaC5fb3JkZXJ9KTt2YXIgZD1iLnJlZHVjZShmdW5jdGlvbihmLGgsayl7aC5fbGFzdEZyb3plbj0hMTtyZXR1cm4gaC5mcm96ZW4mJiFoLmhpZGRlbj9rOmZ9LHZvaWQgMCk7dm9pZCAwIT09ZCYmKGJbZF0uX2xhc3RGcm96ZW49ITApfX0sX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50czpmdW5jdGlvbigpe3RoaXMuZml4ZWRTZWN0aW9ucz8odGhpcy4kLml0ZW1zLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoLXRoaXMuX3Njcm9sbExlZnR8fDAsLXRoaXMuX3Njcm9sbFRvcHx8MCksdGhpcy4kLmZvb3Rlci5zdHlsZS50cmFuc2Zvcm09dGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKC10aGlzLl9zY3JvbGxMZWZ0fHwwLDApKTp0aGlzLiQuZm9vdGVyLnN0eWxlLnRyYW5zZm9ybT0KdGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKDAsdGhpcy5fc2Nyb2xsVG9wKTtmb3IodmFyIGI9dGhpcy5fZ2V0VHJhbnNsYXRlKHRoaXMuX3Njcm9sbExlZnQsMCksZD0wO2Q8dGhpcy5fZnJvemVuQ2VsbHMubGVuZ3RoO2QrKyl0aGlzLl9mcm96ZW5DZWxsc1tkXS5zdHlsZS50cmFuc2Zvcm09Yn0sX2dldFRyYW5zbGF0ZTpmdW5jdGlvbihiLGQpe3JldHVybiJ0cmFuc2xhdGUoIitiKyJweCwiK2QrInB4KSJ9fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9yPVtQb2x5bWVyLklyb25TY3JvbGxUYXJnZXRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY2VsbC1jbGljay1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcj17bGlzdGVuZXJzOntjbGljazoiX29uQ2xpY2sifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGIpe2IudGFyZ2V0IT09dGhpcy5fY2VsbENvbnRlbnQmJnRoaXMuZmlyZSgiY2VsbC1jb250ZW50LWZvY3VzIix7Y2VsbDp0aGlzfSl9LmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fY2VsbENvbnRlbnRGb2N1c0hhbmRsZXIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyLCEwKX0sX29uQ2xpY2s6ZnVuY3Rpb24oYil7InZhYWRpbi1ncmlkLXNvcnRlciIhPT10aGlzLmxvY2FsTmFtZSYmdGhpcy5maXJlKCJjZWxsLWZvY3VzIix7Y2VsbDp0aGlzfSk7aWYodGhpcy5fY2VsbENsaWNrKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5sb2NhbFRhcmdldDsKZC5nZXREaXN0cmlidXRlZE5vZGVzJiYoZD1Qb2x5bWVyLmRvbShkKS5nZXREaXN0cmlidXRlZE5vZGVzKClbMF0pO3ZhciBmPVBvbHltZXIuZG9tKGIpLnBhdGg7Zj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmLDAsZi5pbmRleE9mKGQpKzEpO2QuY29udGFpbnModGhpcy50YXJnZXQmJnRoaXMudGFyZ2V0LnJvb3QuYWN0aXZlRWxlbWVudHx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl8fGYuc29tZSh0aGlzLl9pc0ZvY3VzYWJsZSl8fHRoaXMuX2NlbGxDbGljayhiKX19LF9pc0ZvY3VzYWJsZTpmdW5jdGlvbihiKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5wYXJlbnROb2RlO2Q9LTEhPT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGQpLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0YWJpbmRleF0sIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIG9iamVjdCwgaWZyYW1lLCBsYWJlbCwgYVtocmVmXSwgYXJlYVtocmVmXSIpLGIpO3JldHVybiFiLmRpc2FibGVkJiYKZH19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLWNlbGwuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj17cHJvcGVydGllczp7Y29sdW1uOk9iamVjdCxleHBhbmRlZDpCb29sZWFuLGZsZXhHcm93Ok51bWJlcixjb2xTcGFuOk51bWJlcixmb2N1c2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxmcm96ZW46e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGxhc3RGcm96ZW46e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGhpZGRlbjp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0saW5zdGFuY2U6T2JqZWN0LGluZGV4Ok51bWJlcixpdGVtOk9iamVjdCxzZWxlY3RlZDpCb29sZWFuLHRlbXBsYXRlOk9iamVjdCx0YXJnZXQ6T2JqZWN0LHdpZHRoOlN0cmluZyxvcmRlcjpOdW1iZXIscmVvcmRlclN0YXR1czp7dHlwZTpTdHJpbmcscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfY2hpbGRDb2x1bW5zOkFycmF5LF9jZWxsQ29udGVudDpPYmplY3QsX2luc2VydGlvblBvaW50Ok9iamVjdCwKX3RlbXBsYXRpemVyOk9iamVjdH0sb2JzZXJ2ZXJzOiJfY29sdW1uQ2hhbmdlZChjb2x1bW4pO19jZWxsQXR0YWNoZWQoY29sdW1uLCBpc0F0dGFjaGVkKTtfZXhwYW5kZWRDaGFuZ2VkKGV4cGFuZGVkLCBpbnN0YW5jZSk7X2ZsZXhHcm93Q2hhbmdlZChmbGV4R3Jvdyk7X2luZGV4Q2hhbmdlZChpbmRleCwgaW5zdGFuY2UpO19pdGVtQ2hhbmdlZChpdGVtLCBpbnN0YW5jZSk7X2luc3RhbmNlQ2hhbmdlZChpbnN0YW5jZSwgdGFyZ2V0KTtfc2VsZWN0ZWRDaGFuZ2VkKHNlbGVjdGVkLCBpbnN0YW5jZSk7X3RvZ2dsZUNvbnRlbnQoaXNBdHRhY2hlZCwgX2NlbGxDb250ZW50LCBfaW5zZXJ0aW9uUG9pbnQpO190b2dnbGVJbnN0YW5jZShpc0F0dGFjaGVkLCBfdGVtcGxhdGl6ZXIsIGluc3RhbmNlKTtfd2lkdGhDaGFuZ2VkKHdpZHRoKTtfb3JkZXJDaGFuZ2VkKG9yZGVyKTtfdmlzaWJsZUNoaWxkQ29sdW1uc0NoYW5nZWQoX3Zpc2libGVDaGlsZENvbHVtbnMpO19jaGlsZENvbHVtbnNDaGFuZ2VkKF9jaGlsZENvbHVtbnMpIi5zcGxpdCgiOyIpLApyZWFkeTpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQtY2VsbCIpOyExPT09UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cmJih0aGlzLmNsYXNzTGlzdC5hZGQoInN0eWxlLXNjb3BlIiksdGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZCIpKX0sX2NvbHVtbkNoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5mbGV4R3Jvdz1kLmZsZXhHcm93O3RoaXMuZnJvemVuPWQuZnJvemVuO3RoaXMubGFzdEZyb3plbj1kLl9sYXN0RnJvemVuO3RoaXMuaGVhZGVyVGVtcGxhdGU9ZC5oZWFkZXJUZW1wbGF0ZTt0aGlzLmZvb3RlclRlbXBsYXRlPWQuZm9vdGVyVGVtcGxhdGU7dGhpcy50ZW1wbGF0ZT1kLnRlbXBsYXRlO3RoaXMud2lkdGg9ZC53aWR0aDt0aGlzLmhpZGRlbj1kLmhpZGRlbjt0aGlzLnJlc2l6YWJsZT1kLnJlc2l6YWJsZTt0aGlzLl9jaGlsZENvbHVtbnM9ZC5fY2hpbGRDb2x1bW5zO3RoaXMub3JkZXI9ZC5fb3JkZXI7ZC5jb2xTcGFuJiYodGhpcy5jb2xTcGFuPQpkLmNvbFNwYW4pO3RoaXMubGlzdGVuKGQsInByb3BlcnR5LWNoYW5nZWQiLCJfY29sdW1uUHJvcENoYW5nZWQiKX0sX2NlbGxBdHRhY2hlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihmP3RoaXMubGlzdGVuKGQsInByb3BlcnR5LWNoYW5nZWQiLCJfY29sdW1uUHJvcENoYW5nZWQiKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkfHx0aGlzLnVubGlzdGVuKGQsInByb3BlcnR5LWNoYW5nZWQiLCJfY29sdW1uUHJvcENoYW5nZWQiKX0pKX0sX2NvbHVtblByb3BDaGFuZ2VkOmZ1bmN0aW9uKGQpe2QudGFyZ2V0PT10aGlzLmNvbHVtbiYmKHRoaXNbZC5kZXRhaWwucGF0aF09ZC5kZXRhaWwudmFsdWUpfSxfZXhwYW5kZWRDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGYuX19leHBhbmRlZF9fPWQsZi5leHBhbmRlZD1kKX0sX2ZsZXhHcm93Q2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLnN0eWxlLmZsZXhHcm93PQpkfSxfaW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGYuaW5kZXg9ZCl9LF9pdGVtQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihmLml0ZW09ZCl9LF9zZWxlY3RlZENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYoZi5fX3NlbGVjdGVkX189ZCxmLnNlbGVjdGVkPWQpfSxfY2hpbGRDb2x1bW5zQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLmNvbFNwYW49ZC5sZW5ndGh9LF90b2dnbGVDb250ZW50OmZ1bmN0aW9uKGQsZixoKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZ2b2lkIDAhPT1oJiYoZD8oUG9seW1lci5kb20oZikucGFyZW50Tm9kZSE9PXRoaXMudGFyZ2V0JiZQb2x5bWVyLmRvbSh0aGlzLnRhcmdldCkuYXBwZW5kQ2hpbGQoZiksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQoaCkpOnRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWR8fFBvbHltZXIuZG9tKGYpLnBhcmVudE5vZGUhPT0KdGhpcy50YXJnZXR8fFBvbHltZXIuZG9tKHRoaXMudGFyZ2V0KS5yZW1vdmVDaGlsZChmKX0pKX0sX3RvZ2dsZUluc3RhbmNlOmZ1bmN0aW9uKGQsZixoKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZ2b2lkIDAhPT1oJiYoZD9mLmFkZEluc3RhbmNlKGgpOmYucmVtb3ZlSW5zdGFuY2UoaCkpfSxfd2lkdGhDaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMuc3R5bGUud2lkdGg9ZH0sX29yZGVyQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLnN0eWxlLm9yZGVyPWR9LF90ZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5pbnN0YW5jZT1kLnRlbXBsYXRpemVyLmNyZWF0ZUluc3RhbmNlKCk7dGhpcy5fdGVtcGxhdGl6ZXI9ZC50ZW1wbGF0aXplcn0sX2luc3RhbmNlQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJih0aGlzLnN0eWxlLmhlaWdodD0iIix0aGlzLl9jZWxsQ29udGVudD10aGlzLl9jZWxsQ29udGVudHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtY2VsbC1jb250ZW50IiksCmQ9InZhYWRpbi1ncmlkLWNlbGwtY29udGVudC0iKyh2YWFkaW4uZWxlbWVudHMuZ3JpZC5fY29udGVudEluZGV4PXZhYWRpbi5lbGVtZW50cy5ncmlkLl9jb250ZW50SW5kZXgrMXx8MCksdGhpcy5fY2VsbENvbnRlbnQuaW5uZXJIVE1MPSIiLFBvbHltZXIuZG9tKHRoaXMuX2NlbGxDb250ZW50KS5hcHBlbmRDaGlsZCh0aGlzLmluc3RhbmNlLnJvb3QpLHRoaXMuX2NlbGxDb250ZW50LnNldEF0dHJpYnV0ZSgiaWQiLGQpLFBvbHltZXIuRWxlbWVudD8odGhpcy5fY2VsbENvbnRlbnQuc2V0QXR0cmlidXRlKCJzbG90IixkKSx0aGlzLl9pbnNlcnRpb25Qb2ludD10aGlzLl9pbnNlcnRpb25Qb2ludHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2xvdCIpLHRoaXMuX2luc2VydGlvblBvaW50LnNldEF0dHJpYnV0ZSgibmFtZSIsZCkpOih0aGlzLl9pbnNlcnRpb25Qb2ludD10aGlzLl9pbnNlcnRpb25Qb2ludHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY29udGVudCIpLHRoaXMuX2luc2VydGlvblBvaW50LnNldEF0dHJpYnV0ZSgic2VsZWN0IiwKIiMiK2QpKSl9fTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtY2VsbCIsYmVoYXZpb3JzOltiLHZhYWRpbi5lbGVtZW50cy5ncmlkLkNlbGxDbGlja0JlaGF2aW9yXSxvYnNlcnZlcnM6WyJfdGVtcGxhdGVDaGFuZ2VkKHRlbXBsYXRlKSJdLF9jZWxsQ2xpY2s6ZnVuY3Rpb24oZCl7ZC5kZWZhdWx0UHJldmVudGVkfHx0aGlzLmZpcmUoImNlbGwtYWN0aXZhdGUiLHttb2RlbDp0aGlzLmluc3RhbmNlfSl9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1jZWxsIixwcm9wZXJ0aWVzOntoZWFkZXJUZW1wbGF0ZTpPYmplY3QscmVzaXphYmxlOkJvb2xlYW4sY29sdW1uUmVzaXppbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3JdLG9ic2VydmVyczpbIl9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQoaGVhZGVyVGVtcGxhdGUpIiwiX2lzRW1wdHlDaGFuZ2VkKF9pc0VtcHR5LCBpc0F0dGFjaGVkKSIsCiJfcmVzaXphYmxlQ2hhbmdlZChyZXNpemFibGUpIl0sbGlzdGVuZXJzOnttb3VzZWRvd246Il9jYW5jZWxNb3VzZURvd25PblJlc2l6ZSIsbW91c2Vtb3ZlOiJfZW5hYmxlRHJhZyIsbW91c2VvdXQ6Il9kaXNhYmxlRHJhZyIsdG91Y2hzdGFydDoiX29uVG91Y2hTdGFydCIsdG91Y2htb3ZlOiJfb25Ub3VjaE1vdmUiLHRvdWNoZW5kOiJfb25Ub3VjaEVuZCIsY29udGV4dG1lbnU6Il9vbkNvbnRleHRNZW51In0sX29uQ29udGV4dE1lbnU6ZnVuY3Rpb24oZCl7dGhpcy5fcmVvcmRlckdob3N0JiZkLnByZXZlbnREZWZhdWx0KCl9LF9vblRvdWNoU3RhcnQ6ZnVuY3Rpb24oZCl7ZC50YXJnZXQhPT10aGlzLl9yZXNpemVIYW5kbGUmJnRoaXMudGFyZ2V0LmNvbHVtblJlb3JkZXJpbmdBbGxvd2VkJiYodGhpcy5fc3RhcnRSZW9yZGVyVGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX3N0YXJ0UmVvcmRlci5iaW5kKHRoaXMsZCksMTAwKSl9LF9zdGFydFJlb3JkZXI6ZnVuY3Rpb24oZCl7dGhpcy5fcmVvcmRlckdob3N0PQp0aGlzLl9nZXRHaG9zdCgpO3RoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIjt2YXIgZj1uZXcgQ3VzdG9tRXZlbnQoImRyYWdzdGFydCIse2J1YmJsZXM6ITB9KTt0aGlzLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KGYpO3RoaXMuX3Jlb3JkZXJYWT17eDpkLnRvdWNoZXNbMF0uY2xpZW50WC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQseTpkLnRvdWNoZXNbMF0uY2xpZW50WS10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH07dGhpcy5fdXBkYXRlR2hvc3RQb3NpdGlvbihkLnRvdWNoZXNbMF0uY2xpZW50WCxkLnRvdWNoZXNbMF0uY2xpZW50WSl9LF9vblRvdWNoTW92ZTpmdW5jdGlvbihkKXtpZih0aGlzLl9yZW9yZGVyR2hvc3Qpe2QucHJldmVudERlZmF1bHQoKTt2YXIgZj1uZXcgQ3VzdG9tRXZlbnQoImRyYWdvdmVyIix7YnViYmxlczohMH0pO2YuY2xpZW50WD1kLnRvdWNoZXNbMF0uY2xpZW50WDtmLmNsaWVudFk9CmQudG91Y2hlc1swXS5jbGllbnRZO3ZhciBoPXRoaXMuX2NvbnRlbnRGcm9tUG9pbnQoZi5jbGllbnRYLGYuY2xpZW50WSk7aCYmaC5kaXNwYXRjaEV2ZW50KGYpO3RoaXMuX3VwZGF0ZUdob3N0UG9zaXRpb24oZC50b3VjaGVzWzBdLmNsaWVudFgsZC50b3VjaGVzWzBdLmNsaWVudFkpfWVsc2UgY2xlYXJUaW1lb3V0KHRoaXMuX3N0YXJ0UmVvcmRlclRpbWVvdXQpfSxfdXBkYXRlR2hvc3RQb3NpdGlvbjpmdW5jdGlvbihkLGYpe2QtPXRoaXMuX3Jlb3JkZXJYWS54O2Y9Zi10aGlzLl9yZW9yZGVyWFkueS01MDt2YXIgaD1wYXJzZUludCh0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUubGVmdHx8MCksaz1wYXJzZUludCh0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudG9wfHwwKSx0PXRoaXMuX3Jlb3JkZXJHaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUubGVmdD1oLSh0LmxlZnQtZCkrInB4Ijt0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudG9wPQprLSh0LnRvcC1mKSsicHgifSxfb25Ub3VjaEVuZDpmdW5jdGlvbihkKXtjbGVhclRpbWVvdXQodGhpcy5fc3RhcnRSZW9yZGVyVGltZW91dCk7dGhpcy5fcmVvcmRlckdob3N0JiYoZC5wcmV2ZW50RGVmYXVsdCgpLGQ9bmV3IEN1c3RvbUV2ZW50KCJkcmFnZW5kIix7YnViYmxlczohMH0pLHRoaXMuZGlzcGF0Y2hFdmVudChkKSx0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIix0aGlzLl9yZW9yZGVyR2hvc3Q9bnVsbCl9LF9jb250ZW50RnJvbVBvaW50OmZ1bmN0aW9uKGQsZil7aWYoUG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpe3ZhciBoPXRoaXMudGFyZ2V0LiQuc2Nyb2xsZXI7aC50b2dnbGVBdHRyaWJ1dGUoIm5vLWNvbnRlbnQtcG9pbnRlci1ldmVudHMiLCEwKTtkPXRoaXMuZG9tSG9zdC5yb290LmVsZW1lbnRGcm9tUG9pbnQoZCxmKTtoLnRvZ2dsZUF0dHJpYnV0ZSgibm8tY29udGVudC1wb2ludGVyLWV2ZW50cyIsITEpO2lmKGQmJmQuZ2V0Q29udGVudENoaWxkcmVuKXJldHVybiBkLmdldENvbnRlbnRDaGlsZHJlbihQb2x5bWVyLkVsZW1lbnQ/CiJzbG90IjoiY29udGVudCIpWzBdfWVsc2UgcmV0dXJuIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZCxmKX0sX2dldEdob3N0OmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy50YXJnZXQuJC5zY3JvbGxlci4kLnJlb3JkZXJnaG9zdDtkLmlubmVyVGV4dD10aGlzLl9jZWxsQ29udGVudC5pbm5lclRleHQ7dmFyIGY9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fY2VsbENvbnRlbnQpOyJib3hTaXppbmcgZGlzcGxheSB3aWR0aCBoZWlnaHQgYmFja2dyb3VuZCBhbGlnbkl0ZW1zIHBhZGRpbmcgYm9yZGVyIGZsZXgtZGlyZWN0aW9uIG92ZXJmbG93Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oaCl7ZC5zdHlsZVtoXT1mW2hdfSx0aGlzKTtyZXR1cm4gZH0sX2VuYWJsZURyYWc6ZnVuY3Rpb24oKXt0aGlzLl9jZWxsQ29udGVudC5kcmFnZ2FibGU9dGhpcy50YXJnZXQuY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQmJiF3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKX0sX2Rpc2FibGVEcmFnOmZ1bmN0aW9uKCl7dGhpcy5fY2VsbENvbnRlbnQuZHJhZ2dhYmxlPQohMX0sX2NhbmNlbE1vdXNlRG93bk9uUmVzaXplOmZ1bmN0aW9uKGQpe2QudGFyZ2V0PT09dGhpcy5fcmVzaXplSGFuZGxlJiZkLnByZXZlbnREZWZhdWx0KCl9LF9yZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKGQpe2Q/KHRoaXMuX3Jlc2l6ZUhhbmRsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLl9yZXNpemVIYW5kbGUuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGUiKSx0aGlzLmxpc3Rlbih0aGlzLl9yZXNpemVIYW5kbGUsInRyYWNrIiwiX29uVHJhY2siKSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLl9yZXNpemVIYW5kbGUpKTp0aGlzLl9yZXNpemVIYW5kbGUmJih0aGlzLnVubGlzdGVuKHRoaXMuX3Jlc2l6ZUhhbmRsZSwidHJhY2siLCJfb25UcmFjayIpLFBvbHltZXIuZG9tKHRoaXMpLnJlbW92ZUNoaWxkKHRoaXMuX3Jlc2l6ZUhhbmRsZSkpfSxfb25UcmFjazpmdW5jdGlvbihkKXt0aGlzLmNvbHVtblJlc2l6aW5nPQohMDt2YXIgZj10aGlzLmNvbHVtbjsidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWYubG9jYWxOYW1lJiYoZj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmLl9jaGlsZENvbHVtbnMsMCkuc29ydChmdW5jdGlvbih0LGwpe3JldHVybiB0Ll9vcmRlci1sLl9vcmRlcn0pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hdC5oaWRkZW59KS5wb3AoKSk7dmFyIGg9dGhpcy5fZ2V0SGVhZGVyQ2VsbEJ5Q29sdW1uKGYpO2lmKGgub2Zmc2V0V2lkdGgpe3ZhciBrPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGguX2NlbGxDb250ZW50KTtmLndpZHRoPU1hdGgubWF4KDEwK3BhcnNlSW50KGsucGFkZGluZ0xlZnQpK3BhcnNlSW50KGsucGFkZGluZ1JpZ2h0KSxoLm9mZnNldFdpZHRoK2QuZGV0YWlsLngtaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkrInB4IjtmLmZsZXhHcm93PTB9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3c6bGFzdC1jaGlsZCAudmFhZGluLWdyaWQtY2VsbCIpKS5zb3J0KGZ1bmN0aW9uKHQsCmwpe3JldHVybiB0LmNvbHVtbi5fb3JkZXItbC5jb2x1bW4uX29yZGVyfSkuZm9yRWFjaChmdW5jdGlvbih0LGwscCl7bDxwLmluZGV4T2YoaCkmJih0LmNvbHVtbi53aWR0aD10Lm9mZnNldFdpZHRoKyJweCIsdC5jb2x1bW4uZmxleEdyb3c9MCl9KTt0aGlzLmNvbHVtblJlc2l6aW5nJiYiZW5kIj09PWQuZGV0YWlsLnN0YXRlJiYodGhpcy5jb2x1bW5SZXNpemluZz0hMSk7dGhpcy5maXJlKCJjb2x1bW4tcmVzaXppbmciKX0sX2dldEhlYWRlckNlbGxCeUNvbHVtbjpmdW5jdGlvbihkKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKFBvbHltZXIuZG9tKHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwiKSxmdW5jdGlvbihmKXtyZXR1cm4gZi5jb2x1bW49PT1kfSlbMF19LF9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7dm9pZCAwIT09CmQmJihudWxsPT09ZHx8IXRoaXMuX2lzQ29sdW1uUm93JiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiE9PXRoaXMuY29sdW1uLmxvY2FsTmFtZT8odGhpcy5pbnN0YW5jZT17cm9vdDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX0sdGhpcy5faXNFbXB0eT0hMCk6KHRoaXMuaW5zdGFuY2U9ZC50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpLHRoaXMuX3RlbXBsYXRpemVyPWQudGVtcGxhdGl6ZXIsdGhpcy5faXNFbXB0eT0hMSkpfSxfaXNFbXB0eUNoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtmJiZ0aGlzLmZpcmUoImNlbGwtZW1wdHktY2hhbmdlZCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItY2VsbCIscHJvcGVydGllczp7Zm9vdGVyVGVtcGxhdGU6T2JqZWN0fSxiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3JdLG9ic2VydmVyczpbIl9mb290ZXJUZW1wbGF0ZUNoYW5nZWQoZm9vdGVyVGVtcGxhdGUpIiwKIl9pc0VtcHR5Q2hhbmdlZChfaXNFbXB0eSwgaXNBdHRhY2hlZCkiXSxfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGQpe3ZvaWQgMCE9PWQmJihudWxsPT09ZHx8IXRoaXMuX2lzQ29sdW1uUm93JiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiE9PXRoaXMuY29sdW1uLmxvY2FsTmFtZT8odGhpcy5pbnN0YW5jZT17cm9vdDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX0sdGhpcy5faXNFbXB0eT0hMCk6KHRoaXMuaW5zdGFuY2U9ZC50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpLHRoaXMuX3RlbXBsYXRpemVyPWQudGVtcGxhdGl6ZXIsdGhpcy5faXNFbXB0eT0hMSkpfSxfaXNFbXB0eUNoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtmJiZ0aGlzLmZpcmUoImNlbGwtZW1wdHktY2hhbmdlZCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC1zaXplci1jZWxsIixiZWhhdmlvcnM6W2JdfSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXNpemVyLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXNpemVyIixwcm9wZXJ0aWVzOntjb2x1bW5UcmVlOkFycmF5LHRvcDpOdW1iZXIsX2NvbHVtbnM6QXJyYXl9LG9ic2VydmVyczpbIl9jb2x1bW5UcmVlQ2hhbmdlZChjb2x1bW5UcmVlKSIsIl90b3BDaGFuZ2VkKHRvcCkiXSxfY29sdW1uVHJlZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fY29sdW1ucz1iW2IubGVuZ3RoLTFdfSxfdG9wQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnN0eWxlLnRvcD1iKyJweCJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIiLHByb3BlcnRpZXM6e3Njcm9sbFRhcmdldDp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9zY3JvbGxUYXJnZXRDaGFuZ2VkIn0scGFzc3Rocm91Z2g6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITB9fSxsaXN0ZW5lcnM6e3Njcm9sbDoiX3N5bmNTY3JvbGxUYXJnZXQifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMubGlzdGVuKHRoaXMuZG9tSG9zdCwibW91c2Vtb3ZlIiwiX29uTW91c2VNb3ZlIik7dGhpcy5zdHlsZS53ZWJraXRPdmVyZmxvd1Njcm9sbGluZz0idG91Y2gifSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5kb21Ib3N0LCJtb3VzZW1vdmUiLCJfb25Nb3VzZU1vdmUiKX0sX3Njcm9sbFRhcmdldENoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiZ0aGlzLnVubGlzdGVuKGQsInNjcm9sbCIsIl9zeW5jT3V0ZXJTY3JvbGxlciIpO3RoaXMubGlzdGVuKGIsCiJzY3JvbGwiLCJfc3luY091dGVyU2Nyb2xsZXIiKX0sX29uTW91c2VNb3ZlOmZ1bmN0aW9uKGIpe3RoaXMucGFzc3Rocm91Z2g9Yi5vZmZzZXRZPD10aGlzLmNsaWVudEhlaWdodCYmYi5vZmZzZXRYPD10aGlzLmNsaWVudFdpZHRofSxfc3luY091dGVyU2Nyb2xsZXI6ZnVuY3Rpb24oKXt0aGlzLl9zeW5jaW5nU2Nyb2xsVGFyZ2V0fHwodGhpcy5fc3luY2luZ091dGVyU2Nyb2xsZXI9ITAsdGhpcy5zY3JvbGxUb3A9dGhpcy5kb21Ib3N0Ll9zY3JvbGxUb3AsdGhpcy5zY3JvbGxMZWZ0PXRoaXMuZG9tSG9zdC5fc2Nyb2xsTGVmdCk7dGhpcy5fc3luY2luZ1Njcm9sbFRhcmdldD0hMX0sX3N5bmNTY3JvbGxUYXJnZXQ6ZnVuY3Rpb24oKXt0aGlzLl9zeW5jaW5nT3V0ZXJTY3JvbGxlcnx8KHRoaXMuX3N5bmNpbmdTY3JvbGxUYXJnZXQ9ITAsdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9dGhpcy5zY3JvbGxMZWZ0LAp0aGlzLmRvbUhvc3QuX3Njcm9sbEhhbmRsZXIoKSk7dGhpcy5fc3luY2luZ091dGVyU2Nyb2xsZXI9ITF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZm9jdXNhYmxlLWNlbGwtY29udGFpbmVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcj17cHJvcGVydGllczp7Zm9jdXNlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2ZvY3VzZWRSb3c6T2JqZWN0LF9mb2N1c2VkUm93SW5kZXg6TnVtYmVyLF9mb2N1c2VkQ2VsbDpPYmplY3QsX2ZvY3VzZWRDZWxsSW5kZXg6TnVtYmVyLF9sYXN0Rm9jdXNlZENlbGw6T2JqZWN0fSxvYnNlcnZlcnM6WyJfYW5ub3VuY2VGb2N1c2VkQ2VsbChfZm9jdXNlZENlbGwsIGZvY3VzZWQpIiwiX2Rpc3BhdGNoRXZlbnRzKF9mb2N1c2VkQ2VsbCwgZm9jdXNlZCkiLCJfZm9jdXNlZENlbGxDaGFuZ2VkKF9mb2N1c2VkUm93SW5kZXgsIF9mb2N1c2VkQ2VsbEluZGV4KSJdLF9hbm5vdW5jZUZvY3VzZWRDZWxsOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmdGhpcy5kb21Ib3N0Lm5hdmlnYXRpbmcmJmQmJihkPVBvbHltZXIuRWxlbWVudD9iLl9jZWxsQ29udGVudC5nZXRBdHRyaWJ1dGUoInNsb3QiKToKYi5fY2VsbENvbnRlbnQuaWQsInZhYWRpbi1ncmlkLXRhYmxlLWJvZHkiIT09dGhpcy5pc3x8Yi5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIil8fChiPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oYi5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLGIpLGQ9dGhpcy5kb21Ib3N0LiQuaGVhZGVyLmxhc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW5bYl0uX2NlbGxDb250ZW50LmlkKyIgIitkKSx0aGlzLmRvbUhvc3QuJC5mb290ZXJGb2N1c1RyYXAuYWN0aXZlVGFyZ2V0PWQpfSxfZGlzcGF0Y2hFdmVudHM6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5fbGFzdEZvY3VzZWRDZWxsJiYodGhpcy5fbGFzdEZvY3VzZWRDZWxsLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1mb2N1c291dCIpKSx0aGlzLl9sYXN0Rm9jdXNlZENlbGw9dm9pZCAwKSwKZCYmKGIuX2NlbGxDb250ZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWZvY3VzaW4iKSksdGhpcy5fbGFzdEZvY3VzZWRDZWxsPWIpKX0sX2ZvY3VzZWRDZWxsQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3ZvaWQgMCE9PWImJnZvaWQgMCE9PWQmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcykuY2hpbGRyZW4sZnVuY3Rpb24oZixoKXtmLmZvY3VzZWQ9aD09PWI7Zi5mb2N1c2VkJiYodGhpcy5fZm9jdXNlZFJvdz1mLHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9TWF0aC5taW4oZCxmLmNoaWxkcmVuLmxlbmd0aC0xKSx0aGlzLl9mb2N1c2VkQ2VsbD1mLmNoaWxkcmVuW3RoaXMuX2ZvY3VzZWRDZWxsSW5kZXhdKTtmLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oayx0KXtrLmZvY3VzZWQ9dD09PXRoaXMuX2ZvY3VzZWRDZWxsSW5kZXh9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX0sZm9jdXNMZWZ0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGI9CnRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbTWF0aC5tYXgoMCxiLmluZGV4T2YodGhpcy5fZm9jdXNlZENlbGxJbmRleCktMSldKX19LGZvY3VzRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1pbih0aGlzLl9mb2N1c2VkUm93SW5kZXgrMSx0aGlzLmNoaWxkcmVuLmxlbmd0aC0xKX0sX3Zpc2libGVDZWxsSW5kZXhlczpmdW5jdGlvbigpe3ZhciBiPVtdO2lmKHRoaXMuX2ZvY3VzZWRSb3cmJnRoaXMuX2ZvY3VzZWRSb3cuY2hpbGRyZW4pe2Zvcih2YXIgZD10aGlzLl9mb2N1c2VkUm93LmNoaWxkcmVuLGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLmhpZGRlbnx8ZFtmXT09PXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfHxiLnB1c2goZik7Yi5zb3J0KGZ1bmN0aW9uKGgsayl7cmV0dXJuIGRbaF0uY29sdW1uLl9vcmRlcjxkW2tdLmNvbHVtbi5fb3JkZXI/LTE6MX0pfXJldHVybiBifSwKZm9jdXNQYWdlRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1pbih0aGlzLl9mb2N1c2VkUm93SW5kZXgrMTAsdGhpcy5jaGlsZHJlbi5sZW5ndGgtMSl9LGZvY3VzUGFnZVVwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEwKX0sZm9jdXNSaWdodDpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPXRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbTWF0aC5taW4oYi5pbmRleE9mKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpKzEsYi5sZW5ndGgtMSldKX19LGZvY3VzVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMSl9LGZvY3VzSG9tZTpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPQp0aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGIubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1iWzBdKX19LGZvY3VzRW5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGI9dGhpcy5fdmlzaWJsZUNlbGxJbmRleGVzKCk7MDxiLmxlbmd0aCYmKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9YltiLmxlbmd0aC0xXSl9fSxmb2N1c0ZpcnN0OmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PTA7dGhpcy5mb2N1c0hvbWUoKX0sZm9jdXNMYXN0OmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PXRoaXMuY2hpbGRyZW4ubGVuZ3RoLTE7dGhpcy5mb2N1c0VuZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWZvb3Rlci5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtwcm9wZXJ0aWVzOntjb2x1bW5UcmVlOkFycmF5LHRhcmdldDpPYmplY3QsX3Jvd3M6QXJyYXl9LG9ic2VydmVyczpbIl9jb2x1bW5UcmVlQ2hhbmdlZChjb2x1bW5UcmVlLCB0YXJnZXQpIiwiX3Jvd3NDaGFuZ2VkKF9yb3dzKSJdLF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihkLGYpe2lmKHZvaWQgMCE9PWQmJnZvaWQgMCE9PWYpe3RoaXMuX3Jvd3MmJnRoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihsKXtQb2x5bWVyLmRvbShsKS5pbm5lckhUTUw9IiJ9KTtmb3IodmFyIGg9W10saz0wO2s8ZC5sZW5ndGg7aysrKXt2YXIgdD10aGlzLl9jcmVhdGVSb3coKTt0LnRhcmdldD1mO3QuX2lzQ29sdW1uUm93PWs9PWQubGVuZ3RoLTE7dC5jb2x1bW5zPWRba107aC5wdXNoKHQpfXRoaXMuX3Jvd3M9InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciI9PT10aGlzLmxvY2FsTmFtZT9oOmgucmV2ZXJzZSgpfX0sX3Jvd3NDaGFuZ2VkOmZ1bmN0aW9uKGQpe1BvbHltZXIuZG9tKHRoaXMpLmlubmVySFRNTD0KIiI7ZC5mb3JFYWNoKGZ1bmN0aW9uKGYpe1BvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGYpfS5iaW5kKHRoaXMpKX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIiLGJlaGF2aW9yczpbYix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3JdLF9jcmVhdGVSb3c6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IixiZWhhdmlvcnM6W3ZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2Fubm91bmNlRm9jdXNlZFJvdyhfZm9jdXNlZFJvdykiXSxfYW5ub3VuY2VGb2N1c2VkUm93OmZ1bmN0aW9uKGQpe3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6IlJvdyAiKyhkLmluZGV4KzEpKyIgb2YgIisKdGhpcy5kb21Ib3N0LnNpemV9KX0sX21vdmVGb2N1c1RvRGV0YWlsc0NlbGw6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkQ2VsbC5mb2N1c2VkPSExO3RoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsLmZvY3VzZWQ9ITA7dGhpcy5fZm9jdXNlZENlbGw9dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx9LF9mb2N1c2VkUm93SGFzRGV0YWlsc0NlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZm9jdXNlZFJvdyYmdGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGwmJnRoaXMuX2ZvY3VzZWRDZWxsIT09dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx9LGZvY3VzRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dIYXNEZXRhaWxzQ2VsbCgpP3RoaXMuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKTp0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5taW4odGhpcy5fZm9jdXNlZFJvd0luZGV4KzEsdGhpcy5kb21Ib3N0LnNpemUtMSl9LGZvY3VzVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93JiYKdGhpcy5fZm9jdXNlZENlbGw9PT10aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbD90aGlzLl9mb2N1c2VkQ2VsbENoYW5nZWQodGhpcy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpOih0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMSksdGhpcy5fZm9jdXNlZFJvd0hhc0RldGFpbHNDZWxsKCkmJnRoaXMuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKSl9LGZvY3VzTGFzdDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD10aGlzLmRvbUhvc3Quc2l6ZS0xO3RoaXMuZm9jdXNFbmQoKX0sX2ZvY3VzZWRDZWxsQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcykuY2hpbGRyZW4sZnVuY3Rpb24oaCl7aC5mb2N1c2VkPWguaW5kZXg9PT1kO2guaW5kZXg9PT1kJiYodGhpcy5fZm9jdXNlZFJvdz0KaCx0aGlzLl9mb2N1c2VkQ2VsbD1oLmNoaWxkcmVuW2ZdKTtoLml0ZXJhdGVDZWxscyhmdW5jdGlvbihrLHQpe2suZm9jdXNlZD10PT09Zn0pfS5iaW5kKHRoaXMpKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIixiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRm9jdXNhYmxlQ2VsbENvbnRhaW5lckJlaGF2aW9yXSxfY3JlYXRlUm93OmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1yb3ciKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIixob3N0QXR0cmlidXRlczp7cm9sZToiZ3JpZGNlbGwifSxwcm9wZXJ0aWVzOnthY3RpdmVUYXJnZXQ6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfYWN0aXZlVGFyZ2V0Q2hhbmdlZCJ9fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3ByaW1hcnk9UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yKCIucHJpbWFyeSIpO3RoaXMuX3NlY29uZGFyeT1Qb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoIi5zZWNvbmRhcnkiKTtpZihQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvd3x8UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQodGhpcy5fc2Vjb25kYXJ5KSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLl9wcmltYXJ5KX0sZm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkIT09dGhpcy5fcHJpbWFyeT90aGlzLl9wcmltYXJ5LmZvY3VzKCk6CnRoaXMuX3NlY29uZGFyeS5mb2N1cygpfSxfb25CYWl0Rm9jdXM6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNlZD1iLnRhcmdldDt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHl8fCh0aGlzLmZpcmUoImZvY3VzLWdhaW5lZCIpLHRoaXMuX3ByaW1hcnkudGFiSW5kZXg9LTEpfSxfb25CYWl0Qmx1cjpmdW5jdGlvbigpe3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseXx8KHRoaXMuZmlyZSgiZm9jdXMtbG9zdCIpLHRoaXMuX3ByaW1hcnkudGFiSW5kZXg9MCl9LF9hY3RpdmVUYXJnZXRDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMDt0aGlzLl9mb2N1c2VkPT09dGhpcy5fcHJpbWFyeT8odGhpcy5fc2Vjb25kYXJ5LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixiKSx0aGlzLl9zZWNvbmRhcnkuZm9jdXMoKSk6KHRoaXMuX3ByaW1hcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLGIpLHRoaXMuX3ByaW1hcnkuZm9jdXMoKSk7CnRoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMX0sX3JlYW5ub3VuY2U6ZnVuY3Rpb24oKXt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITA7dGhpcy5fZm9jdXNlZD09PXRoaXMuX3ByaW1hcnk/KHRoaXMuX3NlY29uZGFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdGhpcy5hY3RpdmVUYXJnZXQpLHRoaXMuX3NlY29uZGFyeS5mb2N1cygpKToodGhpcy5fcHJpbWFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdGhpcy5hY3RpdmVUYXJnZXQpLHRoaXMuX3ByaW1hcnkuZm9jdXMoKSk7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5PSExfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLXJvdy5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtwcm9wZXJ0aWVzOnthY3RpdmU6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LGNvbHVtbnM6QXJyYXksaW5kZXg6TnVtYmVyLGNlbGxzOnt2YWx1ZTpbXX0sdGFyZ2V0Ok9iamVjdCxleHBhbmRlZDp7dmFsdWU6ITF9LGZvY3VzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGl0ZW06T2JqZWN0LHNlbGVjdGVkOntyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9yb3dEZXRhaWxzQ2VsbDpPYmplY3Qscm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdH0sb2JzZXJ2ZXJzOiJfY29sdW1uc0NoYW5nZWQoY29sdW1ucywgdGFyZ2V0KTtfaW5kZXhDaGFuZ2VkKGluZGV4LCBjZWxscyk7X2l0ZW1DaGFuZ2VkKGl0ZW0sIGNlbGxzKTtfaXRlbUNoYW5nZWRGb3JEZXRhaWxzKGl0ZW0sIF9yb3dEZXRhaWxzQ2VsbCk7X3Jvd0RldGFpbHNDaGFuZ2VkKGV4cGFuZGVkLCByb3dEZXRhaWxzVGVtcGxhdGUsIHRhcmdldCk7X3Jvd0RldGFpbHNDZWxsSW5kZXhDaGFuZ2VkKF9yb3dEZXRhaWxzQ2VsbCwgaW5kZXgpO19yb3dEZXRhaWxzQ2VsbENoYW5nZWQoX3Jvd0RldGFpbHNDZWxsLCB0YXJnZXQpO19zZWxlY3RlZENoYW5nZWQoc2VsZWN0ZWQsIGNlbGxzKTtfc2VsZWN0ZWRDaGFuZ2VkRm9yRGV0YWlscyhzZWxlY3RlZCwgX3Jvd0RldGFpbHNDZWxsKSIuc3BsaXQoIjsiKSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkLXJvdyIpOyExPT09UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cmJih0aGlzLmNsYXNzTGlzdC5hZGQoInN0eWxlLXNjb3BlIiksdGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZCIpKX0saXRlcmF0ZUNlbGxzOmZ1bmN0aW9uKGQpe3RoaXMuY2VsbHMuZm9yRWFjaChkKTt0aGlzLl9yb3dEZXRhaWxzQ2VsbCYmZCh0aGlzLl9yb3dEZXRhaWxzQ2VsbCl9LF9yb3dEZXRhaWxzQ2hhbmdlZDpmdW5jdGlvbihkLGYsaCl7aWYodm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmdm9pZCAwIT09aCl7aWYoZCl7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtY2VsbCIpO2suc2V0QXR0cmlidXRlKCJkZXRhaWxzY2VsbCIsITApO2suZnJvemVuPSEwO2sudGFyZ2V0PWg7ay50ZW1wbGF0ZT1mO2sudG9nZ2xlQXR0cmlidXRlKCJsYXN0Y29sdW1uIiwhMCk7UG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZChrKTsKUG9seW1lci5kb20uZmx1c2goKTt0aGlzLl9yb3dEZXRhaWxzQ2VsbD1rfWVsc2UgdGhpcy5fcm93RGV0YWlsc0NlbGwmJihQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnJlbW92ZUNoaWxkKHRoaXMuX3Jvd0RldGFpbHNDZWxsKSx0aGlzLl9yb3dEZXRhaWxzQ2VsbD1udWxsKTt0aGlzLml0ZXJhdGVDZWxscyhmdW5jdGlvbih0KXt0LmV4cGFuZGVkPWR9KTt0aGlzLnRhcmdldC4kLnNjcm9sbGVyLl9mcm96ZW5DZWxsc0NoYW5nZWQoKX19LF91cGRhdGVSb3dWaXNpYmlsaXR5OmZ1bmN0aW9uKCl7dGhpcy5oaWRkZW49dGhpcy5jZWxscy5ldmVyeShmdW5jdGlvbihkKXtyZXR1cm4gZC5faXNFbXB0eX0pfSxfcm93RGV0YWlsc0NlbGxDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZi4kLnNjcm9sbGVyLl91cGRhdGUoKX0sX3Jvd0RldGFpbHNDZWxsSW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGQ/KGQuaW5kZXg9CmYsUG9seW1lci5kb20uZmx1c2goKSx0aGlzLnVwZGF0ZVJvd0RldGFpbHNDZWxsTWV0cmljcygpKTp0aGlzLnN0eWxlLnBhZGRpbmdCb3R0b209IiIpfSx1cGRhdGVSb3dEZXRhaWxzQ2VsbE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9yb3dEZXRhaWxzQ2VsbCYmKHRoaXMudGFyZ2V0JiZ0aGlzLnRhcmdldC5fb2JzZXJ2ZXImJnRoaXMudGFyZ2V0Ll9vYnNlcnZlci5mbHVzaCYmdGhpcy50YXJnZXQuX29ic2VydmVyLmZsdXNoKCksdGhpcy5fcm93RGV0YWlsc0NlbGwuc3R5bGUuaGVpZ2h0PSIiLHRoaXMuc3R5bGUucGFkZGluZ0JvdHRvbT10aGlzLl9yb3dEZXRhaWxzQ2VsbC5zdHlsZS5oZWlnaHQ9dGhpcy5fcm93RGV0YWlsc0NlbGwuY2xpZW50SGVpZ2h0KyJweCIpfSxfY29sdW1uc0NoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtpZih2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mKXtQb2x5bWVyLmRvbSh0aGlzKS5pbm5lckhUTUw9IiI7dmFyIGg9W107ZC5mb3JFYWNoKGZ1bmN0aW9uKGspe3ZhciB0PQoiXyIrdGhpcy5pcy5yZXBsYWNlKC8tL2csIl8iKSsiX2NlbGxzIjt0PWtbdF09a1t0XXx8W107dmFyIGw9dC5maWx0ZXIoZnVuY3Rpb24obSl7cmV0dXJuIVBvbHltZXIuZG9tKG0pLnBhcmVudE5vZGV9KVswXTtpZighbCl7bD10aGlzLl9jcmVhdGVDZWxsKCk7dmFyIHA9QXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbCh0aGlzLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJkb20tcmVwZWF0IiksZnVuY3Rpb24obSl7cmV0dXJuIW0ucmVzdGFtcH0pOyhwPXB8fCJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItcm93Ij09PXRoaXMuaXN8fCJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93Ij09PXRoaXMuaXMpfHx0LnB1c2gobCl9bC5pbmRleD10aGlzLmluZGV4O2wudGFyZ2V0PXRoaXMudGFyZ2V0O2wuX2lzQ29sdW1uUm93PXRoaXMuX2lzQ29sdW1uUm93O2wuY29sdW1uPWs7bC5leHBhbmRlZD10aGlzLmV4cGFuZGVkO1BvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGwpO2gucHVzaChsKX0uYmluZCh0aGlzKSk7CnRoaXMuY2VsbHM9aH19LF9pbmRleENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmLmZvckVhY2goZnVuY3Rpb24oaCl7aC5pbmRleD1kfSl9LF9pdGVtQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYuZm9yRWFjaChmdW5jdGlvbihoKXtoLml0ZW09ZH0pfSxfaXRlbUNoYW5nZWRGb3JEZXRhaWxzOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZiYmKGYuaXRlbT1kKX0sX3NlbGVjdGVkQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYuZm9yRWFjaChmdW5jdGlvbihoKXtoLnNlbGVjdGVkPWR9KX0sX3NlbGVjdGVkQ2hhbmdlZEZvckRldGFpbHM6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmJiYoZi5zZWxlY3RlZD1kKX0sdXBkYXRlTGFzdENvbHVtbjpmdW5jdGlvbigpe3RoaXMuY2VsbHMuc2xpY2UoMCkuc29ydChmdW5jdGlvbihkLApmKXtyZXR1cm4gZC5jb2x1bW4uX29yZGVyLWYuY29sdW1uLl9vcmRlcn0pLmZvckVhY2goZnVuY3Rpb24oZCxmLGgpe2QudG9nZ2xlQXR0cmlidXRlKCJsYXN0Y29sdW1uIixmPT09aC5sZW5ndGgtMSl9KX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1yb3ciLGJlaGF2aW9yczpbYl0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtY2VsbCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItcm93IixiZWhhdmlvcnM6W2JdLG9ic2VydmVyczpbIl91cGRhdGVSb3dWaXNpYmlsaXR5KGNvbHVtbnMpIl0sbGlzdGVuZXJzOnsiY2VsbC1lbXB0eS1jaGFuZ2VkIjoiX3VwZGF0ZVJvd1Zpc2liaWxpdHkifSxfY3JlYXRlQ2VsbDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItY2VsbCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93IiwKYmVoYXZpb3JzOltiXSxvYnNlcnZlcnM6WyJfdXBkYXRlUm93VmlzaWJpbGl0eShjb2x1bW5zKSJdLGxpc3RlbmVyczp7ImNlbGwtZW1wdHktY2hhbmdlZCI6Il91cGRhdGVSb3dWaXNpYmlsaXR5In0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLWNlbGwiKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcj1mdW5jdGlvbigpe307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyPVBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10ZW1wbGF0aXplciIsYmVoYXZpb3JzOltQb2x5bWVyLlRlbXBsYXRpemVyXSxwcm9wZXJ0aWVzOntkYXRhSG9zdDpPYmplY3QsdGVtcGxhdGU6T2JqZWN0LF90ZW1wbGF0ZUluc3RhbmNlczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3BhcmVudFBhdGhWYWx1ZXM6e3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3RlbXBsYXRlSW5zdGFuY2VzQ2hhbmdlZChfdGVtcGxhdGVJbnN0YW5jZXMuKiwgX3BhcmVudFBhdGhWYWx1ZXMuKikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50TW9kZWw9ITA7dGhpcy5faW5zdGFuY2VQcm9wcz17ZXhwYW5kZWQ6ITAsaW5kZXg6ITAsaXRlbTohMCxzZWxlY3RlZDohMH19LGNyZWF0ZUluc3RhbmNlOmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTt2YXIgYj10aGlzLnN0YW1wKHt9KTsKdGhpcy5hZGRJbnN0YW5jZShiKTtyZXR1cm4gYn0sYWRkSW5zdGFuY2U6ZnVuY3Rpb24oYil7LTE9PT10aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5pbmRleE9mKGIpJiZ0aGlzLnB1c2goIl90ZW1wbGF0ZUluc3RhbmNlcyIsYil9LHJlbW92ZUluc3RhbmNlOmZ1bmN0aW9uKGIpe3RoaXMuc3BsaWNlKCJfdGVtcGxhdGVJbnN0YW5jZXMiLHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmluZGV4T2YoYiksMSl9LF9lbnN1cmVUZW1wbGF0aXplZDpmdW5jdGlvbigpe3RoaXMudGVtcGxhdGUuX3RlbXBsYXRpemVkfHwodGhpcy50ZW1wbGF0ZS5fdGVtcGxhdGl6ZWQ9ITAsdGhpcy50ZW1wbGF0aXplKHRoaXMudGVtcGxhdGUpLHRoaXMuX3BhcmVudFByb3BzPXRoaXMuX3BhcmVudFByb3BzfHx7fSxQb2x5bWVyLkVsZW1lbnR8fE9iamVjdC5rZXlzKHRoaXMuX3BhcmVudFByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uKCl7fSx0aGlzKSl9LF9mb3J3YXJkSW5zdGFuY2VQcm9wOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT0KYlsiX18iK2QrIl9fIl0mJmJbIl9fIitkKyJfXyJdIT09ZiYmdGhpcy5maXJlKCJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIix7cHJvcDpkLHZhbHVlOmYsaW5zdDpifSl9LF9mb3J3YXJkSW5zdGFuY2VQYXRoOmZ1bmN0aW9uKGIsZCxmKXswIT09ZC5pbmRleE9mKCJpdGVtLiIpfHx0aGlzLl9zdXBwcmVzc0l0ZW1DaGFuZ2VFdmVudHx8dGhpcy5maXJlKCJpdGVtLWNoYW5nZWQiLHtpdGVtOmIuaXRlbSxwYXRoOmQuc3Vic3RyaW5nKDUpLHZhbHVlOmZ9KX0sX25vdGlmeUluc3RhbmNlUHJvcFYyOmZ1bmN0aW9uKGIsZCxmKXt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQcm9wKGIsZCxmKTt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQYXRoKGIsZCxmKX0sX2ZvcndhcmRQYXJlbnRQcm9wOmZ1bmN0aW9uKGIsZCl7dGhpcy5fcGFyZW50UGF0aFZhbHVlc1tiXT1kO3RoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oZil7Zi5zZXQoYixkKX0sdGhpcyl9LF9mb3J3YXJkUGFyZW50UGF0aDpmdW5jdGlvbihiLApkKXt0aGlzLnNldChbIl9wYXJlbnRQYXRoVmFsdWVzIixiXSxkKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Yubm90aWZ5UGF0aChiLGQpfSx0aGlzKX0sX2ZvcndhcmRIb3N0UHJvcFYyOmZ1bmN0aW9uKGIsZCl7dGhpcy5fZm9yd2FyZFBhcmVudFByb3AoYixkKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcyYmdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihmKXtmLm5vdGlmeVBhdGgoYixkKX0sdGhpcyl9LF90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQ6ZnVuY3Rpb24oYil7aWYoIl90ZW1wbGF0ZUluc3RhbmNlcyI9PT1iLnBhdGgpe3ZhciBkPTA7dmFyIGY9dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMubGVuZ3RofWVsc2UgaWYoIl90ZW1wbGF0ZUluc3RhbmNlcy5zcGxpY2VzIj09PWIucGF0aClkPWIudmFsdWUuaW5kZXgsZj1iLnZhbHVlLmFkZGVkQ291bnQ7ZWxzZSByZXR1cm47T2JqZWN0LmtleXModGhpcy5fcGFyZW50UGF0aFZhbHVlc3x8Cnt9KS5mb3JFYWNoKGZ1bmN0aW9uKGgpe2Zvcih2YXIgaz1kO2s8ZCtmO2srKyl0aGlzLl90ZW1wbGF0ZUluc3RhbmNlc1trXS5zZXQoaCx0aGlzLl9wYXJlbnRQYXRoVmFsdWVzW2hdKX0sdGhpcyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtcm93LWRldGFpbHMtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuUm93RGV0YWlsc0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntleHBhbmRlZEl0ZW1zOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsidGVtcGxhdGUtaW5zdGFuY2UtY2hhbmdlZCI6Il90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZEV4cGFuZGVkIn0sb2JzZXJ2ZXJzOlsiX2V4cGFuZGVkSXRlbXNDaGFuZ2VkKGV4cGFuZGVkSXRlbXMuKiwgZGF0YVByb3ZpZGVyKSIsIl9yb3dEZXRhaWxzVGVtcGxhdGVDaGFuZ2VkKF9yb3dEZXRhaWxzVGVtcGxhdGUpIl0sX2V4cGFuZGVkSXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmKHRoaXMuX2ZsdXNoSXRlbXNEZWJvdW5jZXIoKSx0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMmJnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuZXhwYW5kZWQ9dGhpcy5faXNFeHBhbmRlZChmLml0ZW0pfS5iaW5kKHRoaXMpKSl9LApfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihiKXt2YXIgZD1uZXcgdmFhZGluLmVsZW1lbnRzLmdyaWQuVGVtcGxhdGl6ZXI7ZC5kYXRhSG9zdD10aGlzLmRhdGFIb3N0O2QuX2luc3RhbmNlUHJvcHM9e2V4cGFuZGVkOiEwLGluZGV4OiEwLGl0ZW06ITAsc2VsZWN0ZWQ6ITB9O1BvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoZCk7ZC50ZW1wbGF0ZT1iO2IudGVtcGxhdGl6ZXI9ZH0sX2lzRXhwYW5kZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuZXhwYW5kZWRJdGVtcyYmLTEhPT10aGlzLmV4cGFuZGVkSXRlbXMuaW5kZXhPZihiKX0sZXhwYW5kSXRlbTpmdW5jdGlvbihiKXt0aGlzLl9pc0V4cGFuZGVkKGIpfHx0aGlzLnB1c2goImV4cGFuZGVkSXRlbXMiLGIpfSxjb2xsYXBzZUl0ZW06ZnVuY3Rpb24oYil7dGhpcy5faXNFeHBhbmRlZChiKSYmdGhpcy5zcGxpY2UoImV4cGFuZGVkSXRlbXMiLHRoaXMuZXhwYW5kZWRJdGVtcy5pbmRleE9mKGIpLDEpfSwKX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkRXhwYW5kZWQ6ZnVuY3Rpb24oYil7ImV4cGFuZGVkIj09PWIuZGV0YWlsLnByb3AmJihiLmRldGFpbC52YWx1ZT90aGlzLmV4cGFuZEl0ZW0oYi5kZXRhaWwuaW5zdC5pdGVtKTp0aGlzLmNvbGxhcHNlSXRlbShiLmRldGFpbC5pbnN0Lml0ZW0pLGIuc3RvcFByb3BhZ2F0aW9uKCkpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5EYXRhUHJvdmlkZXJCZWhhdmlvcj17bGlzdGVuZXJzOnsiaXRlbS1jaGFuZ2VkIjoiX3RlbXBsYXRlSXRlbUNoYW5nZWQifSxwcm9wZXJ0aWVzOntwYWdlU2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAsb2JzZXJ2ZXI6Il9wYWdlU2l6ZUNoYW5nZWQifSxkYXRhUHJvdmlkZXI6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX2RhdGFQcm92aWRlckNoYW5nZWQifSxfbG9hZGluZzpCb29sZWFuLF9jYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9wZW5kaW5nUmVxdWVzdHM6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sX3RlbXBsYXRlSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5kZXRhaWwuaXRlbTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMuJC5pdGVtcykuY2hpbGRyZW4sZnVuY3Rpb24oZil7Zi5pdGVtPT09ZCYmZi5pdGVyYXRlQ2VsbHMoZnVuY3Rpb24oaCl7aC5fdGVtcGxhdGl6ZXIuX3N1cHByZXNzSXRlbUNoYW5nZUV2ZW50PQohMDtoLmluc3RhbmNlLm5vdGlmeVBhdGgoIml0ZW0uIitiLmRldGFpbC5wYXRoLGIuZGV0YWlsLnZhbHVlKTtoLl90ZW1wbGF0aXplci5fc3VwcHJlc3NJdGVtQ2hhbmdlRXZlbnQ9ITF9KX0pfSxfZ2V0Q2FjaGVkSXRlbTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9nZXRQYWdlRm9ySW5kZXgoYiksZj10aGlzLl9jYWNoZSYmdGhpcy5fY2FjaGVbZF07cmV0dXJuIGY/ZltiLWQqdGhpcy5wYWdlU2l6ZV06bnVsbH0sX2dldEl0ZW06ZnVuY3Rpb24oYixkKXt0aGlzLl91cGRhdGVJdGVtKGQsdGhpcy5fZ2V0Q2FjaGVkSXRlbShiKSk7dGhpcy5fZWFnZXJseUxvYWRQYWdlcygpO3ZhciBmPXRoaXMuX3VuY2FjaGVkUGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCk7MDxmLmxlbmd0aCYmKHRoaXMuX2xvYWRpbmc9ITAsdGhpcy5kZWJvdW5jZSgibG9hZCIsZnVuY3Rpb24oKXtmLmZvckVhY2goZnVuY3Rpb24oaCl7dGhpcy5fbG9hZFBhZ2UoaCl9LmJpbmQodGhpcykpfSwxMDApKX0sX2NhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYWdlc0ZvclBoeXNpY2FsSXRlbXMoKS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIHZvaWQgMCE9PQp0aGlzLl9jYWNoZSYmdm9pZCAwIT09dGhpcy5fY2FjaGVbYl19LmJpbmQodGhpcykpfSxfdW5jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCkuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiB2b2lkIDAhPT10aGlzLl9jYWNoZSYmdm9pZCAwPT09dGhpcy5fY2FjaGVbYl19LmJpbmQodGhpcykpfSxfZWFnZXJseUxvYWRQYWdlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2NhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtcygpLnNsaWNlKDApO2lmKDA8Yi5sZW5ndGgpe2Iuc29ydChmdW5jdGlvbihmLGgpe3JldHVybiBmPmh9KTt2YXIgZD1NYXRoLm1pbihiW2IubGVuZ3RoLTFdKzEsTWF0aC5tYXgoMCxNYXRoLmZsb29yKHRoaXMuc2l6ZS90aGlzLnBhZ2VTaXplKS0xKSk7dGhpcy5fbG9hZFBhZ2UoTWF0aC5tYXgoMCxiWzBdLTEpKTt0aGlzLl9sb2FkUGFnZShkKX19LF9wYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5fZ2V0UGFnZUZvckluZGV4KHRoaXMuJC5zY3JvbGxlci5maXJzdFZpc2libGVJbmRleCsKdGhpcy4kLnNjcm9sbGVyLl92aWR4T2Zmc2V0KV0uY29uY2F0KHRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGIuaW5kZXh9KS5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2dldFBhZ2VGb3JJbmRleChiLmluZGV4KX0uYmluZCh0aGlzKSkpLnJlZHVjZShmdW5jdGlvbihiLGQpey0xPT09Yi5pbmRleE9mKGQpJiZiLnB1c2goZCk7cmV0dXJuIGJ9LFtdKX0sX3VwZGF0ZUl0ZW1zOmZ1bmN0aW9uKGIsZCl7Zm9yKHZhciBmPTA7Zjx0aGlzLnBhZ2VTaXplO2YrKyl7dmFyIGg9dGhpcy4kLnNjcm9sbGVyLl92aXJ0dWFsSW5kZXhUb0l0ZW1bYip0aGlzLnBhZ2VTaXplK2ZdO2gmJih0aGlzLl91cGRhdGVJdGVtKGgsZFtmXSksdGhpcy5kZWJvdW5jZSgidXBkYXRlLWhlaWdodHMiLGZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLl91cGRhdGVNZXRyaWNzKCk7dGhpcy4kLnNjcm9sbGVyLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy4kLnNjcm9sbGVyLl91cGRhdGVTY3JvbGxlclNpemUoKX0sCjEpKX19LF9sb2FkUGFnZTpmdW5jdGlvbihiLGQpe2Q9ZHx8dGhpcy5fdXBkYXRlSXRlbXMuYmluZCh0aGlzKTtpZighdGhpcy5fY2FjaGVbYl0mJiF0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYl0mJnRoaXMuZGF0YVByb3ZpZGVyKXt0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYl09ITA7dmFyIGY9e3BhZ2U6YixwYWdlU2l6ZTp0aGlzLnBhZ2VTaXplLHNvcnRPcmRlcnM6dGhpcy5fbWFwU29ydGVycygpLGZpbHRlcnM6dGhpcy5fbWFwRmlsdGVycygpfTt0aGlzLmRhdGFQcm92aWRlcihmLGZ1bmN0aW9uKGgpe3RoaXMuX2NhY2hlW2JdPWg7ZGVsZXRlIHRoaXMuX3BlbmRpbmdSZXF1ZXN0c1tiXTtkKGIsaCk7dGhpcy5fbG9hZGluZz0wPHRoaXMuX3BlbmRpbmdSZXF1ZXN0cy5sZW5ndGg7dGhpcy5kZWJvdW5jZSgiY2hlY2stc2l6ZSIsdGhpcy5fY2hlY2tTaXplLDJFMyl9LmJpbmQodGhpcykpfX0sX2dldFBhZ2VGb3JJbmRleDpmdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5mbG9vcihiL3RoaXMucGFnZVNpemUpfSwKY2xlYXJDYWNoZTpmdW5jdGlvbigpe3RoaXMuX2NhY2hlPXt9O3RoaXMuX3BlbmRpbmdSZXF1ZXN0cz17fTt0aGlzLiQuc2Nyb2xsZXIuaGFzRGF0YSYmdGhpcy4kLnNjcm9sbGVyLl91cGRhdGUoKTt0aGlzLl9mbHVzaEl0ZW1zRGVib3VuY2VyKCl9LF9mbHVzaEl0ZW1zRGVib3VuY2VyOmZ1bmN0aW9uKCl7dGhpcy5mbHVzaERlYm91bmNlcigibG9hZCIpfSxfcGFnZVNpemVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09ZCYmYiE9PWQmJnRoaXMuY2xlYXJDYWNoZSgpfSxfY2hlY2tTaXplOmZ1bmN0aW9uKCl7dm9pZCAwPT09dGhpcy5zaXplJiZjb25zb2xlLndhcm4oJ1RoZSBceDNjdmFhZGluLWdyaWRceDNlIG5lZWRzIGEgdmFsdWUgZm9yICJzaXplIiBwcm9wZXJ0eSBpbiBvcmRlciB0byBkaXNwbGF5IHJvd3MuJyl9LF9kYXRhUHJvdmlkZXJDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09ZCYmdGhpcy5jbGVhckNhY2hlKCk7dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGF8fAoodGhpcy5fbG9hZGluZz0hMCx0aGlzLl9sb2FkUGFnZSgwLGZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGE9ITB9LmJpbmQodGhpcykpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXNlbGVjdGlvbi1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5TZWxlY3Rpb25CZWhhdmlvcj17cHJvcGVydGllczp7c2VsZWN0ZWRJdGVtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGVkSXRlbXNDaGFuZ2VkKHNlbGVjdGVkSXRlbXMuKikiXSxsaXN0ZW5lcnM6eyJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIjoiX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkU2VsZWN0aW9uIn0sX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkU2VsZWN0aW9uOmZ1bmN0aW9uKGIpe2lmKCJzZWxlY3RlZCI9PT1iLmRldGFpbC5wcm9wKXt2YXIgZD1iLmRldGFpbC5pbnN0Lml0ZW07KHRoaXMuX2lzU2VsZWN0ZWQoZCk/dGhpcy5kZXNlbGVjdEl0ZW06dGhpcy5zZWxlY3RJdGVtKS5iaW5kKHRoaXMpKGQpO3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6KHRoaXMuX2lzU2VsZWN0ZWQoZCk/IlNlbGVjdGVkIjoiRGVzZWxlY3RlZCIpKyIgUm93ICIrCihiLmRldGFpbC5pbnN0LmluZGV4KzEpKyIgb2YgIit0aGlzLnNpemV9KTtiLnN0b3BQcm9wYWdhdGlvbigpfX0sX2lzU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcyYmLTE8dGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoYil9LHNlbGVjdEl0ZW06ZnVuY3Rpb24oYil7Yj10aGlzLl90YWtlSXRlbShiKTt0aGlzLl9pc1NlbGVjdGVkKGIpfHx0aGlzLnB1c2goInNlbGVjdGVkSXRlbXMiLGIpfSxkZXNlbGVjdEl0ZW06ZnVuY3Rpb24oYil7Yj10aGlzLl90YWtlSXRlbShiKTtiPXRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGIpOy0xPGImJnRoaXMuc3BsaWNlKCJzZWxlY3RlZEl0ZW1zIixiLDEpfSxfdG9nZ2xlSXRlbTpmdW5jdGlvbihiKXtiPXRoaXMuX3Rha2VJdGVtKGIpOy0xPT09dGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoYik/dGhpcy5zZWxlY3RJdGVtKGIpOnRoaXMuZGVzZWxlY3RJdGVtKGIpfSxfdGFrZUl0ZW06ZnVuY3Rpb24oYil7cmV0dXJuIm51bWJlciI9PT0KdHlwZW9mIGImJjA8PWImJnRoaXMuaXRlbXMmJnRoaXMuaXRlbXMubGVuZ3RoPmI/dGhpcy5pdGVtc1tiXTpifSxfc2VsZWN0ZWRJdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYil7IXRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtc3x8InNlbGVjdGVkSXRlbXMiIT09Yi5wYXRoJiYic2VsZWN0ZWRJdGVtcy5zcGxpY2VzIiE9PWIucGF0aHx8dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5zZWxlY3RlZD10aGlzLl9pc1NlbGVjdGVkKGQuaXRlbSl9LmJpbmQodGhpcykpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQta2V5Ym9hcmQtbmF2aWdhdGlvbi1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToiYXBwbGljYXRpb24iLHRhYmluZGV4OjB9LGtleUJpbmRpbmdzOnsiY3RybCtob21lIjoiX29uQ3RybEhvbWUiLCJjdHJsK2VuZCI6Il9vbkN0cmxFbmQiLGRvd246Il9vbkFycm93RG93biIsZW5kOiJfb25FbmQiLGVudGVyOiJfb25FbnRlciIsZXNjOiJfb25Fc2NhcGUiLGYyOiJfb25GMiIsaG9tZToiX29uSG9tZSIsbGVmdDoiX29uQXJyb3dMZWZ0IixwYWdlZG93bjoiX29uUGFnZURvd24iLHBhZ2V1cDoiX29uUGFnZVVwIixyaWdodDoiX29uQXJyb3dSaWdodCIsc3BhY2U6Il9vblNwYWNlIix0YWI6Il9vblRhYiIsdXA6Il9vbkFycm93VXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIucmVxdWVzdEF2YWlsYWJpbGl0eSgpfSxwcm9wZXJ0aWVzOntfdmlydHVhbEZvY3VzOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3ZpcnR1YWxGb2N1c0NoYW5nZWQifSwKaW50ZXJhY3Rpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LG5hdmlnYXRpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9fSxsaXN0ZW5lcnM6e2ZvY3VzOiJfb25Gb2N1cyIsImNlbGwtZm9jdXMiOiJfb25DZWxsRm9jdXMiLCJjZWxsLWNvbnRlbnQtZm9jdXMiOiJfb25DZWxsQ29udGVudEZvY3VzIn0scmVhZHk6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihiKXs5PT09Yi5rZXlDb2RlJiYodGhpcy5fdGFiYmVkPSEwKTs5PT09Yi5rZXlDb2RlJiZiLnNoaWZ0S2V5JiYodGhpcy5fc2hpZnRUYWJiZWQ9ITApfS5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsZnVuY3Rpb24oYil7OT09PWIua2V5Q29kZSYmKHRoaXMuX3RhYmJlZD0hMSk7OT09PWIua2V5Q29kZSYmYi5zaGlmdEtleSYmKHRoaXMuX3NoaWZ0VGFiYmVkPQohMSl9LmJpbmQodGhpcyksITApfSxfaXNGb290ZXJWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy4kLmZvb3Rlci5fcm93cy5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIWIuaGlkZGVufSkubGVuZ3RofSxfb25Gb2N1czpmdW5jdGlvbigpe3RoaXMuX3RhYmJlZCYmIXRoaXMuX3NoaWZ0VGFiYmVkJiZ0aGlzLl9hY3RpdmF0ZU5hdmlnYXRpb24oKX0sX2FjdGl2YXRlTmF2aWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKX0sX29uRm9jdXNvdXQ6ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW5nPXRoaXMubmF2aWdhdGluZz0hMX0sX29uRm9vdGVyRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLm5hdmlnYXRpbmc9ITA7dGhpcy5pbnRlcmFjdGluZz0hMTt0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy5fdmlydHVhbEZvY3VzfHwodGhpcy5fc2hpZnRUYWJiZWQ/dGhpcy5faXNGb290ZXJWaXNpYmxlKCk/dGhpcy4kLmZvb3Rlcjp0aGlzLiQuaXRlbXM6CnRoaXMuJC5oZWFkZXIpfSxfdmlydHVhbEZvY3VzQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJihkLmZvY3VzZWQ9ITEpO2ImJihiLl9mb2N1c2VkQ2VsbEluZGV4PWIuX2ZvY3VzZWRDZWxsSW5kZXh8fDAsYi5fZm9jdXNlZFJvd0luZGV4PWIuX2ZvY3VzZWRSb3dJbmRleHx8MCxiLmZvY3VzZWQ9ITAsYj09PXRoaXMuJC5pdGVtcyYmdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uVGFiOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmludGVyYWN0aW5nJiZ0aGlzLl92aXJ0dWFsRm9jdXMpaWYodGhpcy5uYXZpZ2F0aW5nKWlmKGIuZGV0YWlsLmtleWJvYXJkRXZlbnQuc2hpZnRLZXkpc3dpdGNoKHRoaXMuX3ZpcnR1YWxGb2N1cyl7Y2FzZSB0aGlzLiQuZm9vdGVyOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaXRlbXM7Yi5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgdGhpcy4kLml0ZW1zOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaGVhZGVyO2IucHJldmVudERlZmF1bHQoKTsKYnJlYWs7Y2FzZSB0aGlzLiQuaGVhZGVyOnRoaXMuZm9jdXMoKSx0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH1lbHNlIHN3aXRjaCh0aGlzLl92aXJ0dWFsRm9jdXMpe2Nhc2UgdGhpcy4kLmhlYWRlcjp0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLml0ZW1zO2IucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIHRoaXMuJC5pdGVtczp0aGlzLl9pc0Zvb3RlclZpc2libGUoKT8odGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuJC5mb290ZXIsYi5wcmV2ZW50RGVmYXVsdCgpKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fdmlydHVhbEZvY3VzPW51bGx9LDEpO2JyZWFrO2Nhc2UgdGhpcy4kLmZvb3Rlcjp0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH1lbHNlIHRoaXMuX2FjdGl2YXRlTmF2aWdhdGlvbigpLGIucHJldmVudERlZmF1bHQoKX0sX2lzQWJvdmVWaWV3cG9ydDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5maXJzdFZpc2libGVJbmRleD5ifSxfb25BcnJvd0Rvd246ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8CihiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0Rvd24oKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfc2Nyb2xsUGFnZURvd246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWQudG9wLWIuYm90dG9tO3RoaXMuJC5zY3JvbGxlci5fc2Nyb2xsSGFuZGxlcigpfSxfb25QYWdlRG93bjpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXM/KGI9dGhpcy4kLnNjcm9sbGVyLmxhc3RWaXNpYmxlSW5kZXgsdGhpcy5fc2Nyb2xsUGFnZURvd24oKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleCs9CnRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LWJ8fHRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSk6dGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzUGFnZURvd24oKSl9LF9zY3JvbGxQYWdlVXA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3AtPWQudG9wLWIuYm90dG9tO3RoaXMuJC5zY3JvbGxlci5fc2Nyb2xsSGFuZGxlcigpfSxfb25QYWdlVXA6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zPyhiPXRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LAp0aGlzLl9zY3JvbGxQYWdlVXAoKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleC09Yi10aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleHx8dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgsdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKTp0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNQYWdlVXAoKSl9LF9vbkFycm93VXA6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzVXAoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25BcnJvd1JpZ2h0OmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1JpZ2h0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sCl9vbkFycm93TGVmdDpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNMZWZ0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uSG9tZTpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNIb21lKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uRW5kOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0VuZCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbC5fY2VsbENvbnRlbnQ7CihiPWIucXVlcnlTZWxlY3RvcigiW2ZvY3VzLXRhcmdldF0iKXx8Yi5maXJzdEVsZW1lbnRDaGlsZCkmJmIuZm9jdXMoKX0sX29uRW50ZXI6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZz8iaW5wdXQiPT09Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC50YXJnZXQubG9jYWxOYW1lJiYidGV4dCI9PT1iLmRldGFpbC5rZXlib2FyZEV2ZW50LnRhcmdldC50eXBlJiZ0aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6KGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0KCkpfSxfb25Fc2NhcGU6ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW5nP3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKTp0aGlzLm5hdmlnYXRpbmcmJih0aGlzLm5hdmlnYXRpbmc9ITEpfSxfb25GMjpmdW5jdGlvbihiKXtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5pbnRlcmFjdGluZz90aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6dGhpcy5fbW92ZUZvY3VzVG9Gb2N1c1RhcmdldCgpfSwKX29uQ3RybEhvbWU6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzRmlyc3QoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25DdHJsRW5kOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0xhc3QoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25TcGFjZTpmdW5jdGlvbihiKXtpZighdGhpcy5pbnRlcmFjdGluZyl7Yi5wcmV2ZW50RGVmYXVsdCgpO2I9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbDt2YXIgZD1iLmdldENvbnRlbnRDaGlsZHJlbihQb2x5bWVyLkVsZW1lbnQ/InNsb3QiOiJjb250ZW50IilbMF0uZmlyc3RFbGVtZW50Q2hpbGQ7ZD9kLmNsaWNrKCk6dGhpcy5uYXZpZ2F0aW5nJiYKdGhpcy5maXJlKCJjZWxsLWFjdGl2YXRlIix7bW9kZWw6Yi5pbnN0YW5jZX0pfX0sX29uQ2VsbENvbnRlbnRGb2N1czpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nPSEwO3RoaXMuX29uQ2VsbEZvY3VzKGIpfSxfb25DZWxsRm9jdXM6ZnVuY3Rpb24oYil7Yj1iLmRldGFpbC5jZWxsO3ZhciBkPWIucGFyZW50RWxlbWVudCxmPWQucGFyZW50RWxlbWVudCxoPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oZikuY2hpbGRyZW4sZCk7Zj09PXRoaXMuJC5pdGVtcyYmKGg9ZC5pbmRleCk7Zi5fZm9jdXNlZFJvd0luZGV4PWg7Zi5fZm9jdXNlZENlbGxJbmRleD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGQpLmNoaWxkcmVuLGIpO3RoaXMuX3ZpcnR1YWxGb2N1cz1mO2IuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpJiYoZi5fZm9jdXNlZENlbGxJbmRleD0wLGYuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKSl9LF9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0OmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuJC5zY3JvbGxlci5fdmlkeE9mZnNldCt0aGlzLiQuc2Nyb2xsZXIuX3ZpcnR1YWxTdGFydCxkPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4O3RoaXMuX3ZpcnR1YWxGb2N1cz09PXRoaXMuJC5pdGVtcyYmKGQ8Ynx8ZD5iK3RoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxDb3VudCkmJih0aGlzLiQuc2Nyb2xsZXIuc2Nyb2xsVG9TY2FsZWRJbmRleChkKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsQ2hhbmdlZChkLHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGxJbmRleCkpO3RoaXMuX2Vuc3VyZUVsZW1lbnRJblZpZXdwb3J0KHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGwpfSxfZW5zdXJlRWxlbWVudEluVmlld3BvcnQ6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZih0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXMpe3ZhciBmPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLApoPXRoaXMuJC5oZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO2QuYm90dG9tPmY/dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wKz1kLmJvdHRvbS1mOmQudG9wPGgmJih0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWQudG9wLWgpfWlmKCFiLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7Yj10aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtmPXRoaXMuJC5zY3JvbGxlci4kLnRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7aWYoaD10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3cucXVlcnlTZWxlY3RvcigiW2xhc3QtZnJvemVuXSIpKWY9aC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtkLnJpZ2h0PmI/dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsTGVmdCs9ZC5yaWdodC1iOmQubGVmdDxmJiYodGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsTGVmdCs9CmQubGVmdC1mKX19fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3I9W3ZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlS2V5Ym9hcmRCZWhhdmlvckltcGwsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY29sdW1uLXJlb3JkZXJpbmctYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5SZW9yZGVyaW5nQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fX07CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntfb3JkZXJCYXNlU2NvcGU6e3R5cGU6TnVtYmVyLHZhbHVlOjFFN319LGxpc3RlbmVyczp7ZHJhZ3N0YXJ0OiJfb25EcmFnU3RhcnQiLGRyYWdvdmVyOiJfb25EcmFnT3ZlciIsZHJhZ2VuZDoiX29uRHJhZ0VuZCJ9LG9ic2VydmVyczpbIl91cGRhdGVPcmRlcnMoY29sdW1uVHJlZSwgY29sdW1uVHJlZS4qKSJdLF91cGRhdGVPcmRlcnM6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiZiWzBdLmZvckVhY2goZnVuY3Rpb24oZixoKXtmLl9vcmRlcj0oaCsxKSp0aGlzLl9vcmRlckJhc2VTY29wZX0sdGhpcyl9LF9vbkRyYWdTdGFydDpmdW5jdGlvbihiKXtpZigidmFhZGluLWdyaWQtY2VsbC1jb250ZW50Ij09PWIudGFyZ2V0LmxvY2FsTmFtZSl7dmFyIGQ9dGhpcy5fZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQoYi50YXJnZXQpO2QmJih0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsCiEwKSx0aGlzLl9kcmFnZ2VkQ29sdW1uPWQuY29sdW1uLHRoaXMuX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1cyh0aGlzLl9kcmFnZ2VkQ29sdW1uLCJhbGxvd2VkIiksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iZHJhZ2dpbmciLGIuZGF0YVRyYW5zZmVyJiYoYi5kYXRhVHJhbnNmZXIuc2V0RGF0YSgidGV4dCIsIiIpLGIuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ9Im1vdmUiKSx0aGlzLl9hdXRvU2Nyb2xsZXIoKSl9fSxfc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzOmZ1bmN0aW9uKGIsZCl7QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKFBvbHltZXIuZG9tKFBvbHltZXIuZG9tKGIpLnBhcmVudE5vZGUpLmNoaWxkcmVuLGZ1bmN0aW9uKGYpe3JldHVybi9jb2x1bW4vLnRlc3QoZi5sb2NhbE5hbWUpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKGYsYil9LHRoaXMpLmZvckVhY2goZnVuY3Rpb24oZil7Zi5fcmVvcmRlclN0YXR1cz1kfSl9LF9vbkRyYWdPdmVyOmZ1bmN0aW9uKGIpe2lmKHRoaXMuX2RyYWdnZWRDb2x1bW4pe3ZhciBkPQooUG9seW1lci5FbGVtZW50P2IuY29tcG9zZWRQYXRoKCk6UG9seW1lci5kb20oYikucGF0aCkuZmlsdGVyKGZ1bmN0aW9uKGYpe3JldHVybiJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiPT09Zi5sb2NhbE5hbWV9KVswXTtkJiYoYi5wcmV2ZW50RGVmYXVsdCgpLGQ9dGhpcy5fZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQoZCksKGQ9dGhpcy5fZ2V0VGFyZ2V0Q29sdW1uKGQsdGhpcy5fZHJhZ2dlZENvbHVtbikpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKHRoaXMuX2RyYWdnZWRDb2x1bW4sZCkmJnRoaXMuX2lzU3dhcHBhYmxlQnlQb3NpdGlvbihkLGIuY2xpZW50WCkmJnRoaXMuX3N3YXBDb2x1bW5PcmRlcnModGhpcy5fZHJhZ2dlZENvbHVtbixkKSx0aGlzLl9sYXN0RHJhZ0NsaWVudFg9Yi5jbGllbnRYKX19LF9hdXRvU2Nyb2xsZXI6ZnVuY3Rpb24oKXtpZih0aGlzLl9sYXN0RHJhZ0NsaWVudFgpe3ZhciBiPXRoaXMuX2xhc3REcmFnQ2xpZW50WC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0Kwo1MCxkPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC10aGlzLl9sYXN0RHJhZ0NsaWVudFgrNTA7MDxiP3RoaXMuJC50YWJsZS5zY3JvbGxMZWZ0Kz1iLzEwOjA8ZCYmKHRoaXMuJC50YWJsZS5zY3JvbGxMZWZ0LT1kLzEwKTt0aGlzLl9zY3JvbGxIYW5kbGVyKCl9dGhpcy5fZHJhZ2dlZENvbHVtbiYmdGhpcy5hc3luYyh0aGlzLl9hdXRvU2Nyb2xsZXIsMTApfSxfb25EcmFnRW5kOmZ1bmN0aW9uKCl7dGhpcy5fZHJhZ2dlZENvbHVtbiYmKHRoaXMudG9nZ2xlQXR0cmlidXRlKCJyZW9yZGVyaW5nIiwhMSksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iIix0aGlzLl9zZXRTaWJsaW5nc1Jlb3JkZXJTdGF0dXModGhpcy5fZHJhZ2dlZENvbHVtbiwiIiksdGhpcy5fbGFzdERyYWdDbGllbnRYPXRoaXMuX2RyYWdnZWRDb2x1bW49bnVsbCl9LF9pc1N3YXBBbGxvd2VkOmZ1bmN0aW9uKGIsZCl7aWYoYiYmZCl7dmFyIGY9Yi5wYXJlbnRFbGVtZW50PT09ZC5wYXJlbnRFbGVtZW50LApoPWIuZnJvemVuPT09ZC5mcm96ZW47cmV0dXJuIGIhPT1kJiZmJiZofX0sX2lzU3dhcHBhYmxlQnlQb3NpdGlvbjpmdW5jdGlvbihiLGQpe3ZhciBmPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyKS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLGZ1bmN0aW9uKGspe3JldHVybiBrLmNvbHVtbj09PWJ9KVswXSxoPXRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvcigiW3Jlb3JkZXItc3RhdHVzXHgzZGRyYWdnaW5nXSIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ+aC5sZWZ0P2Q+Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodC1oLndpZHRoOmQ8Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0K2gud2lkdGh9LF9nZXRDZWxsQnlDZWxsQ29udGVudDpmdW5jdGlvbihiKXtpZihQb2x5bWVyLkVsZW1lbnQpcmV0dXJuIGIuYXNzaWduZWRTbG90LnBhcmVudE5vZGU7CmI9UG9seW1lci5kb20oYikuZ2V0RGVzdGluYXRpb25JbnNlcnRpb25Qb2ludHMoKVswXTtyZXR1cm4gUG9seW1lci5kb20oYikucGFyZW50Tm9kZX0sX3N3YXBDb2x1bW5PcmRlcnM6ZnVuY3Rpb24oYixkKXt2YXIgZj1iLl9vcmRlcjtiLl9vcmRlcj1kLl9vcmRlcjtkLl9vcmRlcj1mO3RoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKTt0aGlzLl91cGRhdGVMYXN0Q29sdW1uKCl9LF9nZXRUYXJnZXRDb2x1bW46ZnVuY3Rpb24oYixkKXtpZihiJiZkKXtmb3IodmFyIGY9Yi5jb2x1bW47Zi5wYXJlbnRFbGVtZW50IT09ZC5wYXJlbnRFbGVtZW50JiZmIT09dGhpcy50YXJnZXQ7KWY9Zi5wYXJlbnRFbGVtZW50O3JldHVybiBmLnBhcmVudEVsZW1lbnQ9PT1kLnBhcmVudEVsZW1lbnQ/ZjpiLmNvbHVtbn19fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC9pcm9uLWxpc3QtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvckltcGw9ZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGQ9YiYmODw9YlsxXTtyZXR1cm57aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7bWF4UGh5c2ljYWxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwfSxhczp7dHlwZTpTdHJpbmcsdmFsdWU6Iml0ZW0ifSxpbmRleEFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaW5kZXgifX0sX3JhdGlvOi41LF9zY3JvbGxlclBhZGRpbmdUb3A6MCxfc2Nyb2xsUG9zaXRpb246MCxfcGh5c2ljYWxTaXplOjAsX3BoeXNpY2FsQXZlcmFnZTowLF9waHlzaWNhbEF2ZXJhZ2VDb3VudDowLF9waHlzaWNhbFRvcDowLF92aXJ0dWFsQ291bnQ6MCxfcGh5c2ljYWxJbmRleEZvcktleTpudWxsLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCwKX3BoeXNpY2FsSXRlbXM6bnVsbCxfcGh5c2ljYWxTaXplczpudWxsLF9maXJzdFZpc2libGVJbmRleFZhbDpudWxsLF9sYXN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfaXRlbXNSZW5kZXJlZDohMSxfbGFzdFBhZ2U6bnVsbCxfbWF4UGFnZXM6MyxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTaXplLXRoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtCnRoaXMuX3ZpZXdwb3J0SGVpZ2h0K3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcH0sX21pblZpcnR1YWxTdGFydDowLGdldCBfbWF4VmlydHVhbFN0YXJ0KCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3BoeXNpY2FsQ291bnQpfSxfdmlydHVhbFN0YXJ0VmFsOjAsc2V0IF92aXJ0dWFsU3RhcnQoZil7dGhpcy5fdmlydHVhbFN0YXJ0VmFsPU1hdGgubWluKHRoaXMuX21heFZpcnR1YWxTdGFydCxNYXRoLm1heCh0aGlzLl9taW5WaXJ0dWFsU3RhcnQsZikpfSxnZXQgX3ZpcnR1YWxTdGFydCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnRWYWx8fDB9LF9waHlzaWNhbFN0YXJ0VmFsOjAsc2V0IF9waHlzaWNhbFN0YXJ0KGYpe3RoaXMuX3BoeXNpY2FsU3RhcnRWYWw9ZiV0aGlzLl9waHlzaWNhbENvdW50OzA+dGhpcy5fcGh5c2ljYWxTdGFydFZhbCYmKHRoaXMuX3BoeXNpY2FsU3RhcnRWYWw9dGhpcy5fcGh5c2ljYWxDb3VudCt0aGlzLl9waHlzaWNhbFN0YXJ0VmFsKTsKdGhpcy5fcGh5c2ljYWxFbmQ9KHRoaXMuX3BoeXNpY2FsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xKSV0aGlzLl9waHlzaWNhbENvdW50fSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sX3BoeXNpY2FsQ291bnRWYWw6MCxzZXQgX3BoeXNpY2FsQ291bnQoZil7dGhpcy5fcGh5c2ljYWxDb3VudFZhbD1mO3RoaXMuX3BoeXNpY2FsRW5kPSh0aGlzLl9waHlzaWNhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMSkldGhpcy5fcGh5c2ljYWxDb3VudH0sZ2V0IF9waHlzaWNhbENvdW50KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsQ291bnRWYWx9LF9waHlzaWNhbEVuZDowLGdldCBfb3B0UGh5c2ljYWxTaXplKCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0SGVpZ2h0KnRoaXMuX21heFBhZ2VzfSxnZXQgX29wdFBoeXNpY2FsQ291bnQoKXtyZXR1cm4gdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9tYXhQYWdlc30sCmdldCBfaXNWaXNpYmxlKCl7cmV0dXJuIHRoaXMuc2Nyb2xsVGFyZ2V0JiYhKCF0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aCYmIXRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodCl9LGdldCBmaXJzdFZpc2libGVJbmRleCgpe2lmKG51bGw9PT10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbCl7dmFyIGY9TWF0aC5mbG9vcih0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3ApO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihoLGspe2YrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKTtpZihmPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiBrfSl8fDB9cmV0dXJuIHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe2lmKG51bGw9PT10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsKXt2YXIgZj10aGlzLl9waHlzaWNhbFRvcDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oaCwKayl7aWYoZjx0aGlzLl9zY3JvbGxCb3R0b20pdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1rO2Vsc2UgcmV0dXJuITA7Zis9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGgpfSl9cmV0dXJuIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWx9LGdldCBfZGVmYXVsdFNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzfSxnZXQgX3ZpcnR1YWxSb3dDb3VudCgpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlydHVhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9lc3RSb3dzSW5WaWV3KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC90aGlzLl9yb3dIZWlnaHQpfSxnZXQgX3BoeXNpY2FsUm93cygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fcGh5c2ljYWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTt0aGlzLl9yZW5kZXIoKTt0aGlzLmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsCiJfcmVzaXplSGFuZGxlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2l0ZW1zUmVuZGVyZWQ9ITE7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIil9LHVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllczpmdW5jdGlvbigpe3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcD10aGlzLnNjcm9sbFRhcmdldD09PXRoaXM/MDpwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKVsicGFkZGluZy10b3AiXXx8MCwxMCk7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0fSxfdXBkYXRlOmZ1bmN0aW9uKGYsaCl7dGhpcy5fYXNzaWduTW9kZWxzKGYpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoZik7aWYoaClmb3IoO2gubGVuZ3RoOylmPWgucG9wKCksdGhpcy5fcGh5c2ljYWxUb3AtPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChmKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCk7CnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCl9LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbigpe2lmKDA9PT10aGlzLl92aWV3cG9ydEhlaWdodClyZXR1cm4hMTt2YXIgZj10aGlzLl9waHlzaWNhbFNpemVzLnJlZHVjZShmdW5jdGlvbihrLHQpe3JldHVybiBrKyh0fHwxMDApfSwwKSxoPWY+dGhpcy5fdmlld3BvcnRIZWlnaHQ7aWYoZj49dGhpcy5fb3B0UGh5c2ljYWxTaXplJiZoKXJldHVybiExO2Y9TWF0aC5mbG9vcih0aGlzLl9waHlzaWNhbFNpemUvdGhpcy5fdmlld3BvcnRIZWlnaHQpOzA9PT1mP3RoaXMuX2RlYm91bmNlVGVtcGxhdGUodGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyxNYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpKSk6dGhpcy5fbGFzdFBhZ2UhPT1mJiZoP1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsdGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyx0aGlzLl9pdGVtc1BlclJvdyksCjE2KSk6dGhpcy5fZGVib3VuY2VUZW1wbGF0ZSh0aGlzLl9pbmNyZWFzZVBvb2wuYmluZCh0aGlzLE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC8odGhpcy5fcGh5c2ljYWxTaXplL3RoaXMuX3BoeXNpY2FsQ291bnQpKnRoaXMuX21heFBhZ2VzLXRoaXMuX3BoeXNpY2FsQ291bnQpfHwxKSk7dGhpcy5fbGFzdFBhZ2U9ZjtyZXR1cm4hMH0sX2RlYm91bmNlVGVtcGxhdGU6ZnVuY3Rpb24oZil7UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UoIl9kZWJvdW5jZVRlbXBsYXRlIixmKSl9LF9pbmNyZWFzZVBvb2w6ZnVuY3Rpb24oZil7dmFyIGg9dGhpcy5fcGh5c2ljYWxDb3VudDtmPU1hdGgubWluKHRoaXMuX3BoeXNpY2FsQ291bnQrZix0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fdmlydHVhbFN0YXJ0LE1hdGgubWF4KHRoaXMubWF4UGh5c2ljYWxDb3VudCwyNSkpLWg7MD49Znx8KFtdLnB1c2guYXBwbHkodGhpcy5fcGh5c2ljYWxJdGVtcyx0aGlzLl9jcmVhdGVQb29sKGYpKSwKW10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbFNpemVzLEFycmF5KGYpKSx0aGlzLl9waHlzaWNhbENvdW50PWgrZix0aGlzLl91cGRhdGUoKSl9LF9yZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZj0wPHRoaXMuX3ZpcnR1YWxDb3VudHx8MDx0aGlzLl9waHlzaWNhbENvdW50O3RoaXMuaXNBdHRhY2hlZCYmIXRoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX2lzVmlzaWJsZSYmZiYmKHRoaXMuX2xhc3RQYWdlPTAsdGhpcy5fdXBkYXRlKCksdGhpcy5faXRlbXNSZW5kZXJlZD0hMCl9LF9pdGVyYXRlSXRlbXM6ZnVuY3Rpb24oZixoKXt2YXIgayx0O2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiZoKWZvcih0PTA7dDxoLmxlbmd0aDt0Kyspe3ZhciBsPWhbdF07dmFyIHA9dGhpcy5fY29tcHV0ZVZpZHgobCk7aWYobnVsbCE9KGs9Zi5jYWxsKHRoaXMsbCxwKSkpcmV0dXJuIGt9ZWxzZXtsPXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHA9dGhpcy5fdmlydHVhbFN0YXJ0O2w8dGhpcy5fcGh5c2ljYWxDb3VudDtsKyssCnArKylpZihudWxsIT0oaz1mLmNhbGwodGhpcyxsLHApKSlyZXR1cm4gaztmb3IobD0wO2w8dGhpcy5fcGh5c2ljYWxTdGFydDtsKysscCsrKWlmKG51bGwhPShrPWYuY2FsbCh0aGlzLGwscCkpKXJldHVybiBrfX0sX2NvbXB1dGVWaWR4OmZ1bmN0aW9uKGYpe3JldHVybiBmPj10aGlzLl9waHlzaWNhbFN0YXJ0P3RoaXMuX3ZpcnR1YWxTdGFydCsoZi10aGlzLl9waHlzaWNhbFN0YXJ0KTp0aGlzLl92aXJ0dWFsU3RhcnQrKHRoaXMuX3BoeXNpY2FsQ291bnQtdGhpcy5fcGh5c2ljYWxTdGFydCkrZn0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24oZil7dGhpcy5zY3JvbGxpbmcmJlBvbHltZXIuZG9tLmZsdXNoKCk7dmFyIGg9MCxrPTAsdD10aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCxsPXRoaXMuX3BoeXNpY2FsQXZlcmFnZTt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocCl7ays9dGhpcy5fcGh5c2ljYWxTaXplc1twXXx8MDt0aGlzLl9waHlzaWNhbFNpemVzW3BdPXRoaXMuX3BoeXNpY2FsSXRlbXNbcF0ub2Zmc2V0SGVpZ2h0OwpoKz10aGlzLl9waHlzaWNhbFNpemVzW3BdO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50Kz10aGlzLl9waHlzaWNhbFNpemVzW3BdPzE6MH0sZik7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuX3BoeXNpY2FsU2l6ZT10aGlzLl9waHlzaWNhbFNpemUraC1rO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50IT09dCYmKHRoaXMuX3BoeXNpY2FsQXZlcmFnZT1NYXRoLnJvdW5kKChsKnQraCkvdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQpKX0sX3Bvc2l0aW9uSXRlbXM6ZnVuY3Rpb24oKXt0aGlzLl9hZGp1c3RTY3JvbGxQb3NpdGlvbigpO3ZhciBmPXRoaXMuX3BoeXNpY2FsVG9wO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihoKXt0aGlzLl9waHlzaWNhbEl0ZW1zW2hdLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoMCxmKTtmKz10aGlzLl9waHlzaWNhbFNpemVzW2hdfSl9LF9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU2l6ZXNbZl19LApfc2hvdWxkUmVuZGVyTmV4dFJvdzpmdW5jdGlvbihmKXtyZXR1cm4gZiV0aGlzLl9pdGVtc1BlclJvdz09PXRoaXMuX2l0ZW1zUGVyUm93LTF9LF9hZGp1c3RTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBmPTA9PT10aGlzLl92aXJ0dWFsU3RhcnQ/dGhpcy5fcGh5c2ljYWxUb3A6TWF0aC5taW4odGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fcGh5c2ljYWxUb3AsMCk7ZiYmKHRoaXMuX3BoeXNpY2FsVG9wLT1mLGR8fDA9PT10aGlzLl9waHlzaWNhbFRvcHx8dGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9zY3JvbGxUb3AtZikpfSxfcmVzZXRTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbihmKXt0aGlzLnNjcm9sbFRhcmdldCYmKHRoaXMuX3Njcm9sbFBvc2l0aW9uPXRoaXMuX3Njcm9sbFRvcD1mKX0sX3VwZGF0ZVNjcm9sbGVyU2l6ZTpmdW5jdGlvbihmKXt0aGlzLl9lc3RTY3JvbGxIZWlnaHQ9dGhpcy5fcGh5c2ljYWxCb3R0b20rTWF0aC5tYXgodGhpcy5fdmlydHVhbENvdW50LQp0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCwwKSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7aWYoKGY9KGY9Znx8MD09PXRoaXMuX3Njcm9sbEhlaWdodCl8fHRoaXMuX3Njcm9sbFBvc2l0aW9uPj10aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fcGh5c2ljYWxTaXplKXx8TWF0aC5hYnModGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3Njcm9sbEhlaWdodCk+PXRoaXMuX29wdFBoeXNpY2FsU2l6ZSl0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodCsicHgiLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHR9LHNjcm9sbFRvSW5kZXg6ZnVuY3Rpb24oZil7UG9seW1lci5kb20uZmx1c2goKTtmPU1hdGgubWluKE1hdGgubWF4KGYsMCksdGhpcy5fdmlydHVhbENvdW50LTEpO2lmKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQoZil8fGY+PXRoaXMuX21heFZpcnR1YWxTdGFydCl0aGlzLl92aXJ0dWFsU3RhcnQ9CmYtMTt0aGlzLl9hc3NpZ25Nb2RlbHMoKTt0aGlzLl91cGRhdGVNZXRyaWNzKCk7dGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIGg9dGhpcy5fcGh5c2ljYWxTdGFydCxrPXRoaXMuX3ZpcnR1YWxTdGFydCx0PTAsbD10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTtrPGYmJnQ8PWw7KXQrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKSxoPShoKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsaysrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3QpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCk7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD0KbnVsbH0sX3Jlc2V0QXZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50PXRoaXMuX3BoeXNpY2FsQXZlcmFnZT0wfSxfcmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpO3RoaXMuX3JlbmRlcigpO3RoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX3BoeXNpY2FsSXRlbXMmJnRoaXMuX2lzVmlzaWJsZSYmKHRoaXMuX3Jlc2V0QXZlcmFnZSgpLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4KSl9LmJpbmQodGhpcyksMSkpfSx1cGRhdGVTaXplRm9ySXRlbTpmdW5jdGlvbihmKXtmPXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbZl07bnVsbCE9ZiYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW2ZdKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCkpfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGYpe3JldHVybiBmPj0KdGhpcy5fdmlydHVhbFN0YXJ0JiZmPD10aGlzLl92aXJ0dWFsRW5kfSxfaXNJbmRleFZpc2libGU6ZnVuY3Rpb24oZil7cmV0dXJuIGY+PXRoaXMuZmlyc3RWaXNpYmxlSW5kZXgmJmY8PXRoaXMubGFzdFZpc2libGVJbmRleH19fSgpO3ZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3I9W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlIixiZWhhdmlvcnM6W3ZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUNvbHVtblJlb3JkZXJpbmdCZWhhdmlvcixQb2x5bWVyLlRlbXBsYXRpemVyXSxwcm9wZXJ0aWVzOntzaXplOk51bWJlcixjb2x1bW5UcmVlOkFycmF5LGJpbmREYXRhOkZ1bmN0aW9uLHJvd0RldGFpbHNUZW1wbGF0ZTpPYmplY3QsY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHNhZmFyaTp7dHlwZTpCb29sZWFuLHZhbHVlOi9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9LHNjcm9sbGJhcldpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpiLnN0eWxlLndpZHRoPSIxMDBweCI7Yi5zdHlsZS5oZWlnaHQ9IjEwMHB4IjtiLnN0eWxlLm92ZXJmbG93PSJzY3JvbGwiO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iLTk5OTlweCI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD1iLm9mZnNldFdpZHRoLWIuY2xpZW50V2lkdGg7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTtyZXR1cm4gZH19LHRhcmdldDpPYmplY3QsaGFzRGF0YTpCb29sZWFufSxvYnNlcnZlcnM6WyJfY29sdW1uVHJlZUNoYW5nZWQoY29sdW1uVHJlZSwgX3BoeXNpY2FsSXRlbXMsIF9waHlzaWNhbENvdW50VmFsKSIsIl9zaXplQ2hhbmdlZChzaXplLCBiaW5kRGF0YSwgaGFzRGF0YSkiLCJfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZChyb3dEZXRhaWxzVGVtcGxhdGUsIF9waHlzaWNhbEl0ZW1zLCBfcGh5c2ljYWxDb3VudFZhbCkiXSxsaXN0ZW5lcnM6eyJwcm9wZXJ0eS1jaGFuZ2VkIjoiX2NvbHVtblByb3BDaGFuZ2VkIiwKYW5pbWF0aW9uZW5kOiJfb25BbmltYXRpb25FbmQiLCJjb2x1bW4tcmVzaXppbmciOiJfb25Db2x1bW5SZXNpemUifSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuJD10aGlzLiR8fHt9O3RoaXMuJC5oZWFkZXI9dGhpcy5kb21Ib3N0LiQuaGVhZGVyO3RoaXMuJC5pdGVtcz10aGlzLmRvbUhvc3QuJC5pdGVtczt0aGlzLiQuZm9vdGVyPXRoaXMuZG9tSG9zdC4kLmZvb3Rlcn0sX29uQ29sdW1uUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImNvbHVtbi1yZXNpemluZyIsdGhpcy4kLmhlYWRlci5xdWVyeVNlbGVjdG9yKCJbY29sdW1uLXJlc2l6aW5nXSIpKTt0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpfSxfb25BbmltYXRpb25FbmQ6ZnVuY3Rpb24oYil7L2FwcGVhci8udGVzdChiLmFuaW1hdGlvbk5hbWUpJiYodGhpcy5fcmVuZGVyKCksdGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljcygpLGIuc3RvcFByb3BhZ2F0aW9uKCkpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oYil7ImhlYWRlclRlbXBsYXRlIj09PQpiLmRldGFpbC5wYXRoJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsITAsdGhpcy4kLmhlYWRlcik7ImZvb3RlclRlbXBsYXRlIj09PWIuZGV0YWlsLnBhdGgmJnRoaXMudG9nZ2xlQXR0cmlidXRlKCJoYXMtdGVtcGxhdGVzIiwhMCx0aGlzLiQuZm9vdGVyKTsvZnJvemVufGhpZGRlbi8udGVzdChiLmRldGFpbC5wYXRoKSYmdGhpcy5fZnJvemVuQ2VsbHNDaGFuZ2VkKCk7ImhpZGRlbiI9PT1iLmRldGFpbC5wYXRoJiZ0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpfSxfaGlkZU91dGVyU2Nyb2xsZXI6ZnVuY3Rpb24oYixkKXtyZXR1cm4gMD09PWImJiFkfSxfaGlkZVRhYmxlT3ZlcmZsb3c6ZnVuY3Rpb24oYixkKXtyZXR1cm4gMD09PWImJmR9LF9yb3dEZXRhaWxzVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT1iJiZkJiZ2b2lkIDAhPT1mJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsZnVuY3Rpb24oaCl7aC5yb3dEZXRhaWxzVGVtcGxhdGU9CmJ9KX0sX2NvbHVtblRyZWVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT1iJiZkJiZ2b2lkIDAhPT1mJiYoUG9seW1lci5SZW5kZXJTdGF0dXMuYWZ0ZXJOZXh0UmVuZGVyKHRoaXMsdGhpcy5fdXBkYXRlKSx0aGlzLl9mcm96ZW5DZWxsc0NoYW5nZWQoKSx0aGlzLl9oYXNUZW1wbGF0ZXNDaGFuZ2VkKGIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCxmdW5jdGlvbihoKXtoLmNvbHVtbnM9YltiLmxlbmd0aC0xXX0pLHRoaXMuX2dyaWRSZXNpemVIYW5kbGVyKCksUG9seW1lci5kb20uZmx1c2godGhpcyksdGhpcy5fdXBkYXRlTGFzdENvbHVtbigpKX0sX3VwZGF0ZUxhc3RDb2x1bW46ZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93IiksZnVuY3Rpb24oYil7Yi51cGRhdGVMYXN0Q29sdW1uKCl9KX0sX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbFNpemVzJiYKUG9seW1lci5kb20uZmx1c2goKTt0aGlzLl91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzU3luYygpO1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLiQuaGVhZGVyLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmMoKTt0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleCYmdGhpcy5zY3JvbGxUb1NjYWxlZEluZGV4KHRoaXMuX3BlbmRpbmdTY3JvbGxUb1NjYWxlZEluZGV4KX0uYmluZCh0aGlzKSl9LF91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzU3luYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJC5oZWFkZXIuY2xpZW50SGVpZ2h0KyJweCIsZD10aGlzLiQuZm9vdGVyLmNsaWVudEhlaWdodCsicHgiO1t0aGlzLiQub3V0ZXJzaXplcix0aGlzLiQuZml4ZWRzaXplcix0aGlzLiQuaXRlbXNdLmZvckVhY2goZnVuY3Rpb24oZil7Zi5zdHlsZS5ib3JkZXJUb3BXaWR0aD1iO2Yuc3R5bGUuYm9yZGVyQm90dG9tV2lkdGg9CmR9KX0sX2hhc1RlbXBsYXRlc0NoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9ITEsZj0hMTtiLmZvckVhY2goZnVuY3Rpb24oaCl7cmV0dXJuIGguZm9yRWFjaChmdW5jdGlvbihrKXtkPWR8fGsuaGVhZGVyVGVtcGxhdGU7Zj1mfHxrLmZvb3RlclRlbXBsYXRlfSl9KTt0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsZCx0aGlzLiQuaGVhZGVyKTt0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsZix0aGlzLiQuZm9vdGVyKX0sX2NyZWF0ZVBvb2w6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPUFycmF5KGIpLGY9MDtmPGI7ZisrKXt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1yb3ciKTtoLnRhcmdldD10aGlzLmRvbUhvc3Q7ZFtmXT1oO2guc2V0QXR0cmlidXRlKCJoaWRkZW4iLCIiKTtQb2x5bWVyLmRvbSh0aGlzLiQuaXRlbXMpLmFwcGVuZENoaWxkKGgpfXJldHVybiBkfSxfc2l6ZUNoYW5nZWQ6ZnVuY3Rpb24oYiwKZCxmKXtpZih2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mKXt2YXIgaD10aGlzLl9zY3JvbGxUb3Asaz10aGlzLmZpcnN0VmlzaWJsZUluZGV4K3RoaXMuX3ZpZHhPZmZzZXQ7dGhpcy5fdmlydHVhbENvdW50PU1hdGgubWluKGIsMUU1KTt0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5PXt9O3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLl92aWR4T2Zmc2V0PTA7dGhpcy5fcGh5c2ljYWxJdGVtc3x8KHRoaXMuX3BoeXNpY2FsQ291bnQ9TWF0aC5tYXgoMSxNYXRoLm1pbigyNSx0aGlzLl92aXJ0dWFsQ291bnQpKSx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX2NyZWF0ZVBvb2wodGhpcy5fcGh5c2ljYWxDb3VudCksdGhpcy5fcGh5c2ljYWxTaXplcz1BcnJheSh0aGlzLl9waHlzaWNhbENvdW50KSk7dGhpcy5faXRlbXNSZW5kZXJlZD0hMTt0aGlzLl9kZWJvdW5jZVRlbXBsYXRlKGZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyKCk7CnRoaXMuX3ZpZXdwb3J0SGVpZ2h0JiYodGhpcy5zY3JvbGxUb1NjYWxlZEluZGV4KE1hdGgubWluKGssdGhpcy5zaXplKSksdGhpcy5fc2Nyb2xsVG9wPWgsdGhpcy5fc2Nyb2xsSGFuZGxlcigpLHRoaXMuZmx1c2hEZWJvdW5jZXIoInZhYWRpbi1ncmlkLXNjcm9sbGluZyIpKX0pfX0sX2Fzc2lnbk1vZGVsczpmdW5jdGlvbihiKXt0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW09dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtfHx7fTt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oZCxmKXtkPXRoaXMuX3BoeXNpY2FsSXRlbXNbZF07ZC5pbmRleCYmZGVsZXRlIHRoaXMuX3ZpcnR1YWxJbmRleFRvSXRlbVtkLmluZGV4XTtkLmluZGV4PWYrdGhpcy5fdmlkeE9mZnNldDt0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW1bZC5pbmRleF09ZDtkLnRvZ2dsZUF0dHJpYnV0ZSgib2RkIixkLmluZGV4JTIpO2QudG9nZ2xlQXR0cmlidXRlKCJsYXN0cm93IixkLmluZGV4PT09dGhpcy5zaXplLTEpO2QudG9nZ2xlQXR0cmlidXRlKCJoaWRkZW4iLApkLmluZGV4Pj10aGlzLnNpemUpO3RoaXMuYmluZERhdGEoZC5pbmRleCxkKX0sYil9LF9ncmlkUmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3MoKTt0aGlzLl9waHlzaWNhbFNpemVzJiYodGhpcy5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IudXBkYXRlUm93RGV0YWlsc0NlbGxNZXRyaWNzKCl9KSx0aGlzLmRlYm91bmNlKCJ2YWFkaW4tZ3JpZC1yZXNpemluZyIsZnVuY3Rpb24oKXt0aGlzLl91cGRhdGUoKX0uYmluZCh0aGlzKSwxKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY29sdW1uLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJhc2VCZWhhdmlvcj17cHJvcGVydGllczp7cmVzaXphYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ZnVuY3Rpb24oKXtpZigidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiE9PXRoaXMubG9jYWxOYW1lKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiBiJiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWIubG9jYWxOYW1lP2IucmVzaXphYmxlfHwhMTohMX19fSxoZWFkZXJUZW1wbGF0ZTp7dHlwZTpPYmplY3R9LGZvb3RlclRlbXBsYXRlOnt0eXBlOk9iamVjdH0sZnJvemVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxoaWRkZW46e3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9LF9sYXN0RnJvemVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxfb3JkZXI6TnVtYmVyLF9yZW9yZGVyU3RhdHVzOkJvb2xlYW59LG9ic2VydmVyczpbIl9mb290ZXJUZW1wbGF0ZUNoYW5nZWQoZm9vdGVyVGVtcGxhdGUpIiwKIl9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQoaGVhZGVyVGVtcGxhdGUpIiwiX2xhc3RGcm96ZW5DaGFuZ2VkKF9sYXN0RnJvemVuKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGQpezA8PWQuYWRkZWROb2Rlcy5sZW5ndGgmJih0aGlzLmhlYWRlclRlbXBsYXRlPXRoaXMuX3ByZXBhcmVIZWFkZXJUZW1wbGF0ZSgpLHRoaXMuZm9vdGVyVGVtcGxhdGU9dGhpcy5fcHJlcGFyZUZvb3RlclRlbXBsYXRlKCksdGhpcy50ZW1wbGF0ZT10aGlzLl9wcmVwYXJlQm9keVRlbXBsYXRlKCkpfXRoaXMuX3RlbXBsYXRlT2JzZXJ2ZXI9UG9seW1lci5FbGVtZW50P25ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcyxiKTpQb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoYil9LF9wcmVwYXJlSGVhZGVyVGVtcGxhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlcGFyZVRlbXBsYXRpemVyKHRoaXMuX2ZpbmRUZW1wbGF0ZSgidGVtcGxhdGUuaGVhZGVyIil8fG51bGwsCnt9KX0sX3ByZXBhcmVGb290ZXJUZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCJ0ZW1wbGF0ZS5mb290ZXIiKXx8bnVsbCx7fSl9LF9wcmVwYXJlQm9keVRlbXBsYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoInRlbXBsYXRlOm5vdCguaGVhZGVyKTpub3QoLmZvb3RlcikiLHt9KSl9LF9wcmVwYXJlVGVtcGxhdGl6ZXI6ZnVuY3Rpb24oYixkKXtpZihiJiYhYi50ZW1wbGF0aXplcil7dmFyIGY9bmV3IHZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyO2YuZGF0YUhvc3Q9dGhpcy5kYXRhSG9zdDtmLl9pbnN0YW5jZVByb3BzPWR8fGYuX2luc3RhbmNlUHJvcHM7Zi50ZW1wbGF0ZT1iO2IudGVtcGxhdGl6ZXI9Zn1yZXR1cm4gYn0sX3NlbGVjdEZpcnN0VGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKGIpLApmdW5jdGlvbihkKXtyZXR1cm4gUG9seW1lci5kb20oZCkucGFyZW50Tm9kZT09PXRoaXN9LmJpbmQodGhpcykpWzBdfSxfZmluZFRlbXBsYXRlOmZ1bmN0aW9uKGIpeyhiPXRoaXMuX3NlbGVjdEZpcnN0VGVtcGxhdGUoYikpJiZ0aGlzLmRhdGFIb3N0JiYoYi5fcm9vdERhdGFIb3N0PXRoaXMuZGF0YUhvc3QuX3Jvb3REYXRhSG9zdHx8dGhpcy5kYXRhSG9zdCk7cmV0dXJuIGJ9LF9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiaGVhZGVyVGVtcGxhdGUiLHZhbHVlOmJ9KX0sX2Zvb3RlclRlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJmb290ZXJUZW1wbGF0ZSIsdmFsdWU6Yn0pfSxfZmxleEdyb3dDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImZsZXhHcm93Iix2YWx1ZTpifSl9LF93aWR0aENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIiwKe3BhdGg6IndpZHRoIix2YWx1ZTpifSl9LF9sYXN0RnJvemVuQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJsYXN0RnJvemVuIix2YWx1ZTpifSl9fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOnt3aWR0aDp7dHlwZTpTdHJpbmcsdmFsdWU6IjEwMHB4In0sZmxleEdyb3c6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LHRlbXBsYXRlOnt0eXBlOk9iamVjdH19LG9ic2VydmVyczoiX2ZsZXhHcm93Q2hhbmdlZChmbGV4R3Jvdyk7X3dpZHRoQ2hhbmdlZCh3aWR0aCk7X3RlbXBsYXRlQ2hhbmdlZCh0ZW1wbGF0ZSk7X2Zyb3plbkNoYW5nZWQoZnJvemVuLCBpc0F0dGFjaGVkKTtfaGlkZGVuQ2hhbmdlZChoaWRkZW4pO19vcmRlckNoYW5nZWQoX29yZGVyKTtfcmVvcmRlclN0YXR1c0NoYW5nZWQoX3Jlb3JkZXJTdGF0dXMpO19yZXNpemFibGVDaGFuZ2VkKHJlc2l6YWJsZSkiLnNwbGl0KCI7IiksX2Zyb3plbkNoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodm9pZCAwPT09dGhpcy5fb2xkRnJvemVuJiYhMT09PWJ8fHRoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJmcm96ZW4iLHZhbHVlOmJ9KSx0aGlzLl9vbGRGcm96ZW49Yil9LF90ZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7YiYmYi50ZW1wbGF0aXplciYmUG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZChiLnRlbXBsYXRpemVyKTt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJ0ZW1wbGF0ZSIsdmFsdWU6Yn0se2J1YmJsZXM6ITF9KX0sX2hpZGRlbkNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiaGlkZGVuIix2YWx1ZTpifSl9LF9vcmRlckNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoib3JkZXIiLHZhbHVlOmJ9KX0sX3Jlb3JkZXJTdGF0dXNDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6InJlb3JkZXJTdGF0dXMiLHZhbHVlOmJ9KX0sX3Jlc2l6YWJsZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIiwKe3BhdGg6InJlc2l6YWJsZSIsdmFsdWU6Yn0pfX07dmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3I9W3ZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJhc2VCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi5odG1sLTIuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLWNvbHVtbiIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CZWhhdmlvcl19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1hcnJheS1kYXRhLXByb3ZpZGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkFycmF5RGF0YVByb3ZpZGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2l0ZW1zOkFycmF5fSxvYnNlcnZlcnM6WyJfaXRlbXNDaGFuZ2VkKGl0ZW1zLCBpdGVtcy4qKSJdLF9pdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5zaXplPShifHxbXSkubGVuZ3RoLHRoaXMuZGF0YVByb3ZpZGVyPXRoaXMuZGF0YVByb3ZpZGVyfHx0aGlzLl9hcnJheURhdGFQcm92aWRlcix0aGlzLmNsZWFyQ2FjaGUoKSl9LF9hcnJheURhdGFQcm92aWRlcjpmdW5jdGlvbihiLGQpe3ZhciBmPSh0aGlzLml0ZW1zfHxbXSkuc2xpY2UoMCk7dGhpcy5fY2hlY2tQYXRocyh0aGlzLl9maWx0ZXJzLCJmaWx0ZXJpbmciLGYpJiYoZj10aGlzLl9maWx0ZXIoZikpO3RoaXMuc2l6ZT1mLmxlbmd0aDtiLnNvcnRPcmRlcnMubGVuZ3RoJiZ0aGlzLl9jaGVja1BhdGhzKHRoaXMuX3NvcnRlcnMsInNvcnRpbmciLGYpJiYoZj1mLnNvcnQodGhpcy5fbXVsdGlTb3J0LmJpbmQodGhpcykpKTsKdmFyIGg9Yi5wYWdlKmIucGFnZVNpemU7ZChmLnNsaWNlKGgsaCtiLnBhZ2VTaXplKSxmLmxlbmd0aCl9LF9jaGVja1BhdGhzOmZ1bmN0aW9uKGIsZCxmKXtpZighZi5sZW5ndGgpcmV0dXJuITE7dmFyIGg9ITAsaztmb3IoayBpbiBiKXt2YXIgdD1iW2tdLnBhdGg7aWYodCYmLTEhPT10LmluZGV4T2YoIi4iKSl7dmFyIGw9dC5yZXBsYWNlKC9cLlteXC5dKiQvLCIiKTt2b2lkIDA9PT1Qb2x5bWVyLkJhc2UuZ2V0KGwsZlswXSkmJihjb25zb2xlLndhcm4oJ1BhdGggIicrdCsnIiB1c2VkIGZvciAnK2QrIiBkb2VzIG5vdCBleGlzdCBpbiBhbGwgb2YgdGhlIGl0ZW1zLCAiK2QrIiBpcyBkaXNhYmxlZC4iKSxoPSExKX19cmV0dXJuIGh9LF9tdWx0aVNvcnQ6ZnVuY3Rpb24oYixkKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoZnVuY3Rpb24oZil7cmV0dXJuImFzYyI9PT1mLmRpcmVjdGlvbj90aGlzLl9jb21wYXJlKFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLGIpLFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLApkKSk6ImRlc2MiPT09Zi5kaXJlY3Rpb24/dGhpcy5fY29tcGFyZShQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxkKSxQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxiKSk6MH0sdGhpcykucmVkdWNlKGZ1bmN0aW9uKGYsaCl7cmV0dXJuIGY/ZjpofSwwKX0sX25vcm1hbGl6ZUVtcHR5VmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PVt2b2lkIDAsbnVsbF0uaW5kZXhPZihiKT8iIjppc05hTihiKT9iLnRvU3RyaW5nKCk6Yn0sX2NvbXBhcmU6ZnVuY3Rpb24oYixkKXtiPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoYik7ZD10aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKGQpO3JldHVybiBiPGQ/LTE6Yj5kPzE6MH0sX2ZpbHRlcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIDA9PT10aGlzLl9maWx0ZXJzLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4tMT09PXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoUG9seW1lci5CYXNlLmdldChmLnBhdGgsZCkpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGYudmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKX0uYmluZCh0aGlzKSkubGVuZ3RofSwKdGhpcyl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1keW5hbWljLWNvbHVtbnMtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuRHluYW1pY0NvbHVtbnNCZWhhdmlvcj17cmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9hZGROb2RlT2JzZXJ2ZXIoKX0sX2hhc0NvbHVtbkdyb3VwczpmdW5jdGlvbihiKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKylpZigidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWJbZF0ubG9jYWxOYW1lKXJldHVybiEwO3JldHVybiExfSxfZ2V0Q2hpbGRDb2x1bW5zOmZ1bmN0aW9uKGIpe3JldHVybiBQb2x5bWVyLmRvbShiKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIil9LF9mbGF0dGVuQ29sdW1uR3JvdXBzOmZ1bmN0aW9uKGIpe3JldHVybiBiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4idmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWQubG9jYWxOYW1lP3RoaXMuX2dldENoaWxkQ29sdW1ucyhkKTpbZF19LHRoaXMpLnJlZHVjZShmdW5jdGlvbihkLApmKXtyZXR1cm4gZC5jb25jYXQoZil9LFtdKX0sX2dldENvbHVtblRyZWU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9W10sZD10aGlzLnF1ZXJ5QWxsRWZmZWN0aXZlQ2hpbGRyZW4oInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIik7Oyl7Yi5wdXNoKGQpO2lmKCF0aGlzLl9oYXNDb2x1bW5Hcm91cHMoZCkpYnJlYWs7ZD10aGlzLl9mbGF0dGVuQ29sdW1uR3JvdXBzKGQpfXJldHVybiBifSxfdXBkYXRlQ29sdW1uVHJlZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2dldENvbHVtblRyZWUoKTt0aGlzLl9hcnJheUVxdWFscyhiLHRoaXMuX2NvbHVtblRyZWUpfHwodGhpcy5fY29sdW1uVHJlZT1iKX0sX2FkZE5vZGVPYnNlcnZlcjpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPVBvbHltZXIuZG9tKHRoaXMpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe3JldHVybiBmLm5vZGVUeXBlPT09Ck5vZGUuRUxFTUVOVF9OT0RFJiYvXnZhYWRpbi1ncmlkLShjb2x1bW58c2VsZWN0aW9uKS9pLnRlc3QoZi5sb2NhbE5hbWUpfSgwPGIuYWRkZWROb2Rlcy5maWx0ZXIoZCkubGVuZ3RofHwwPGIucmVtb3ZlZE5vZGVzLmZpbHRlcihkKS5sZW5ndGgpJiZ0aGlzLl91cGRhdGVDb2x1bW5UcmVlKCk7KFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlU2hhZG93fHxQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdykmJlBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuJC5mb290ZXJGb2N1c1RyYXApO3RoaXMuZGVib3VuY2UoImNoZWNrLWltcG9ydHMiLHRoaXMuX2NoZWNrSW1wb3J0cywyRTMpfS5iaW5kKHRoaXMpKX0sX2FycmF5RXF1YWxzOmZ1bmN0aW9uKGIsZCl7aWYoIWJ8fCFkfHxiLmxlbmd0aCE9ZC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBmPTAsaD1iLmxlbmd0aDtmPGg7ZisrKWlmKGJbZl1pbnN0YW5jZW9mIEFycmF5JiZkW2ZdaW5zdGFuY2VvZiBBcnJheSl7aWYoIXRoaXMuX2FycmF5RXF1YWxzKGJbZl0sCmRbZl0pKXJldHVybiExfWVsc2UgaWYoYltmXSE9ZFtmXSlyZXR1cm4hMTtyZXR1cm4hMH0sX2NoZWNrSW1wb3J0czpmdW5jdGlvbigpe1sidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiwidmFhZGluLWdyaWQtc29ydGVyIiwidmFhZGluLWdyaWQtZmlsdGVyIiwidmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiJdLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvcihiKTshZHx8KFBvbHltZXIuaXNJbnN0YW5jZT9Qb2x5bWVyLmlzSW5zdGFuY2UoZCk6ZCBpbnN0YW5jZW9mIFBvbHltZXIuRWxlbWVudCl8fGNvbnNvbGUud2FybigiTWFrZSBzdXJlIHlvdSBoYXZlIGltcG9ydGVkIHRoZSByZXF1aXJlZCBtb2R1bGUgZm9yIFx4M2MiK2IrIlx4M2UgZWxlbWVudC4iKX0sdGhpcyl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zb3J0LWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlNvcnRCZWhhdmlvcj17cHJvcGVydGllczp7bXVsdGlTb3J0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zb3J0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfcHJldmlvdXNTb3J0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsic29ydGVyLWNoYW5nZWQiOiJfb25Tb3J0ZXJDaGFuZ2VkIn0scmVhZHk6ZnVuY3Rpb24oKXtQb2x5bWVyLkVsZW1lbnQmJiFQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvdyYmdGhpcy5hc3luYyhmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoInZhYWRpbi1ncmlkLXNvcnRlciIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYixmdW5jdGlvbihkKXtkLmZpcmUmJmQuZmlyZSgic29ydGVyLWNoYW5nZWQiKX0pfSl9LF9vblNvcnRlckNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9CmIudGFyZ2V0O3RoaXMuX3JlbW92ZUFycmF5SXRlbSh0aGlzLl9zb3J0ZXJzLGQpO2QuX29yZGVyPW51bGw7dGhpcy5tdWx0aVNvcnQ/KGQuZGlyZWN0aW9uJiZ0aGlzLl9zb3J0ZXJzLnVuc2hpZnQoZCksdGhpcy5fc29ydGVycy5mb3JFYWNoKGZ1bmN0aW9uKGYsaCl7Zi5fb3JkZXI9MTx0aGlzLl9zb3J0ZXJzLmxlbmd0aD9oOm51bGx9LHRoaXMpKToodGhpcy5fc29ydGVycy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuX29yZGVyPW51bGw7Zi5kaXJlY3Rpb249bnVsbH0pLGQuZGlyZWN0aW9uJiYodGhpcy5fc29ydGVycz1bZF0pKTtiLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZKU09OLnN0cmluZ2lmeSh0aGlzLl9wcmV2aW91c1NvcnRlcnMpIT09SlNPTi5zdHJpbmdpZnkodGhpcy5fbWFwU29ydGVycygpKSYmdGhpcy5jbGVhckNhY2hlKCk7dGhpcy5fcHJldmlvdXNTb3J0ZXJzPXRoaXMuX21hcFNvcnRlcnMoKX0sX21hcFNvcnRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoZnVuY3Rpb24oYil7cmV0dXJue3BhdGg6Yi5wYXRoLApkaXJlY3Rpb246Yi5kaXJlY3Rpb259fSl9LF9yZW1vdmVBcnJheUl0ZW06ZnVuY3Rpb24oYixkKXtkPWIuaW5kZXhPZihkKTstMTxkJiZiLnNwbGljZShkLDEpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZmlsdGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuRmlsdGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e19maWx0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsiZmlsdGVyLWNoYW5nZWQiOiJfZmlsdGVyQ2hhbmdlZCJ9LF9maWx0ZXJDaGFuZ2VkOmZ1bmN0aW9uKGIpey0xPT09dGhpcy5fZmlsdGVycy5pbmRleE9mKGIudGFyZ2V0KSYmdGhpcy5fZmlsdGVycy5wdXNoKGIudGFyZ2V0KTtiLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZ0aGlzLmNsZWFyQ2FjaGUoKX0sX21hcEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmlsdGVycy5tYXAoZnVuY3Rpb24oYil7cmV0dXJue3BhdGg6Yi5wYXRoLHZhbHVlOmIudmFsdWV9fSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZCIscHJvcGVydGllczp7X2NvbHVtblRyZWU6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxzaXplOk51bWJlcixfcm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdCxfYmluZERhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldEl0ZW0uYmluZCh0aGlzKX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlJvd0RldGFpbHNCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5EYXRhUHJvdmlkZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5EeW5hbWljQ29sdW1uc0JlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkFycmF5RGF0YVByb3ZpZGVyQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuU2VsZWN0aW9uQmVoYXZpb3IsCnZhYWRpbi5lbGVtZW50cy5ncmlkLlNvcnRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5GaWx0ZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5SZW9yZGVyaW5nQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJwcm9wZXJ0eS1jaGFuZ2VkIjoiX2NvbHVtblByb3BDaGFuZ2VkIiwiaXJvbi1yZXNpemUiOiJfZ3JpZFJlc2l6ZUhhbmRsZXIifSxfdXBkYXRlSXRlbTpmdW5jdGlvbihiLGQpe2Iuc3R5bGUubWluSGVpZ2h0PWQ/IiI6dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEF2ZXJhZ2UrInB4IjtiLml0ZW09ZDtiLnNlbGVjdGVkPXRoaXMuX2lzU2VsZWN0ZWQoZCk7Yi5leHBhbmRlZD10aGlzLl9pc0V4cGFuZGVkKGQpO2IuYWN0aXZlPW51bGwhPT1kJiZkPT10aGlzLmFjdGl2ZUl0ZW07Yi5mb2N1c2VkPWIuaW5kZXg9PT10aGlzLiQuaXRlbXMuX2ZvY3VzZWRSb3dJbmRleH0sX2dldENvbnRlbnRUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpO3RoaXMuX3Jvd0RldGFpbHNUZW1wbGF0ZT1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJ0ZW1wbGF0ZS5yb3ctZGV0YWlscyIpfHx2b2lkIDA7dGhpcy4kLnNjcm9sbGVyLnRhcmdldD10aGlzO251bGw9PT1kb2N1bWVudC5kb2N0eXBlJiZjb25zb2xlLndhcm4oJ1x4M2N2YWFkaW4tZ3JpZFx4M2UgcmVxdWlyZXMgdGhlICJzdGFuZGFyZHMgbW9kZSIgZGVjbGFyYXRpb24uIFBsZWFzZSBhZGQgXHgzYyFET0NUWVBFIGh0bWxceDNlIHRvIHRoZSBIVE1MIGRvY3VtZW50LicpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oYil7Il9jaGlsZENvbHVtbnMiPT09Yi5kZXRhaWwucGF0aCYmdGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9ncmlkUmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuJC5zY3JvbGxlci5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLHZpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cDpPYmplY3QsX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpyZy5YVHlwZS5TVEVQfSxfbm9NdWx0aUV4cGVyaW1lbnRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbmRleE9mU2Vzc2lvbjpPYmplY3QsX3Nlc3Npb25Hcm91cE5hbWVIYXNoOk51bWJlcixfcmVxdWVzdERhdGE6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oe3RhZzpiLHJ1bjpkfSk9PnRoaXMuYmFja2VuZC5saXN0TWV0cmljRXZhbHMoe2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWUsc2Vzc2lvbk5hbWU6ZCxtZXRyaWNOYW1lOmJ9KX19LF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybntzY2FsZTpiPT57Yj1KU09OLnBhcnNlKGIpWzFdOwpiPXRoaXMuX2luZGV4T2ZTZXNzaW9uLmdldChiKTtjb25zdCBkPXBmLnN0YW5kYXJkO3JldHVybiBkWyh0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaCtiKSVkLmxlbmd0aF19fX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6InJlZHJhdyJ9LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBDaGFuZ2VkKHNlc3Npb25Hcm91cC4qKSJdLHJlZHJhdygpe1BvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKGI9PmIucmVkcmF3KCkpfSxfc2Vzc2lvbkdyb3VwQ2hhbmdlZCgpe3RoaXMuc2Vzc2lvbkdyb3VwPyh0aGlzLl9pbmRleE9mU2Vzc2lvbj1uZXcgTWFwKHRoaXMuc2Vzc2lvbkdyb3VwLnNlc3Npb25zLm1hcCgoYixkKT0+W2IubmFtZSxkXSkpLHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoPXRmLmhwYXJhbXMudXRpbHMuaGFzaE9mU3RyaW5nKHRoaXMuc2Vzc2lvbkdyb3VwLm5hbWUpKToKKHRoaXMuX2luZGV4T2ZTZXNzaW9uPW5ldyBNYXAsdGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2g9MCk7UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYj0+e2NvbnN0IGQ9Yi5nZXQoInRhZyIpO2Iuc2V0KCJ0YWciLCIiKTtiLnNldCgidGFnIixkKX0pfSxfaGF2ZU1ldHJpY3MoKXtyZXR1cm4gdGhpcy52aXNpYmxlU2NoZW1hJiZBcnJheS5pc0FycmF5KHRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcykmJjA8dGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aH0sX2hhdmVNZXRyaWNzQW5kU2Vzc2lvbkdyb3VwKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbkdyb3VwJiZ0aGlzLl9oYXZlTWV0cmljcygpfSxfY29tcHV0ZVNlcmllc0ZvclNlc3Npb25Hcm91cE1ldHJpYyhiLGQpe3JldHVybiBudWxsPT09Ynx8bnVsbD09PWQ/W106Yi5zZXNzaW9ucy5maWx0ZXIoZj0+dm9pZCAwIT09dGYuaHBhcmFtcy51dGlscy5tZXRyaWNWYWx1ZUJ5TmFtZShmLm1ldHJpY1ZhbHVlcywKZC5uYW1lKSkubWFwKGY9Pih7dGFnOmQubmFtZSxydW46Zi5uYW1lfSkpfSxfY29tcHV0ZVRhZ01ldGFkYXRhKGIpe3JldHVybntkaXNwbGF5TmFtZTp0Zi5ocGFyYW1zLnV0aWxzLm1ldHJpY05hbWUoYiksZGVzY3JpcHRpb246Yi5kZXNjcmlwdGlvbnx8IiJ9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtdGFibGUtdmlldy90Zi1ocGFyYW1zLXRhYmxlLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy10YWJsZS12aWV3Iixwcm9wZXJ0aWVzOnt2aXNpYmxlU2NoZW1hOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LGVuYWJsZVNob3dNZXRyaWNzOkJvb2xlYW4sYmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nfSxvYnNlcnZlcnM6WyJfdmlzaWJsZVNjaGVtYU9yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodmlzaWJsZVNjaGVtYS4qLCBzZXNzaW9uR3JvdXBzLiopIl0sX3Zpc2libGVTY2hlbWFPclNlc3Npb25Hcm91cHNDaGFuZ2VkKCl7Y29uc3QgYj10aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLmdldCgiZXhwYW5kZWRJdGVtcyIpO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJleHBhbmRlZEl0ZW1zIixbXSk7UG9seW1lci5kb20uZmx1c2goKTtjb25zdCBkPW5ldyBNYXA7dGhpcy5zZXNzaW9uR3JvdXBzLmZvckVhY2goZj0+e2Quc2V0KGYubmFtZSxmKX0pO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJleHBhbmRlZEl0ZW1zIiwKYi5tYXAoZj0+ZC5nZXQoZi5uYW1lKSkuZmlsdGVyKEJvb2xlYW4pKX0sX2hwYXJhbU5hbWU6dGYuaHBhcmFtcy51dGlscy5ocGFyYW1OYW1lLF9tZXRyaWNOYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZSxfc2Vzc2lvbkdyb3VwSFBhcmFtKGIsZCl7cmV0dXJuIG51bGwhPWImJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLmhwYXJhbXMsZCk/dGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludChiLmhwYXJhbXNbZF0pOiIifSxfc2Vzc2lvbkdyb3VwTWV0cmljKGIsZCl7aWYobnVsbD09YilyZXR1cm4gbnVsbDtmb3IobGV0IGY9MDtmPGIubWV0cmljVmFsdWVzLmxlbmd0aDsrK2Ype2xldCBoPWIubWV0cmljVmFsdWVzW2ZdO2lmKGgubmFtZS5ncm91cD09PWQuZ3JvdXAmJmgubmFtZS50YWc9PWQudGFnKXJldHVybiB0Zi5ocGFyYW1zLnV0aWxzLnByZXR0eVByaW50KGgudmFsdWUpfXJldHVybiIifSxfcm93TnVtYmVyKGIpe3JldHVybiBiKzF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiLHByb3BlcnRpZXM6e3Nlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sdmlzaWJsZVNjaGVtYTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LF9wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIHZvaWQgMCE9PWImJm51bGwhPT1iJiZ2b2lkIDAhPT1kJiZudWxsIT09ZH0sX3NpbmdsZXRvblNlc3Npb25Hcm91cHM6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PT1ifHx2b2lkIDA9PT1iP1tdOltiXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L3V0aWxzLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChrLHQsbCl7ZnVuY3Rpb24gcCgpe2lmKDA9PT1rLmxlbmd0aClyZXR1cm5bMSwyXTtjb25zdCBbbSxuXT1kMy5leHRlbnQoayk7cmV0dXJuIG0hPT1uP1ttLG5dOjA8bT9bLjUqbSwxLjUqbV06MD5tP1sxLjUqbSwuNSptXTpbLTEsMV19aWYoIkxJTkVBUiI9PT1sKXJldHVybiBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihwKCkpLnJhbmdlKFt0LDBdKTtpZigiTE9HIj09PWwpcmV0dXJuIGw9cCgpLDA+PWxbMF0mJjA8PWxbMV0/aChrLHQsIkxJTkVBUiIpOmQzLnNjYWxlTG9nKCkuZG9tYWluKGwpLnJhbmdlKFt0LDBdKTtpZigiUVVBTlRJTEUiPT09bClyZXR1cm4gbD1kMy5yYW5nZSgyMCkubWFwKG09PnQtbSp0LzE5KSwwPT09ay5sZW5ndGgmJihrPVsxXSksZDMuc2NhbGVRdWFudGlsZSgpLmRvbWFpbihfLnVuaXEoaykpLnJhbmdlKGwpO2lmKCJOT05fTlVNRVJJQyI9PT1sKXJldHVybiBkMy5zY2FsZVBvaW50KCkuZG9tYWluKF8udW5pcShrLnNvcnQoKSkpLnJhbmdlKFt0LAowXSkucGFkZGluZyguMSk7dGhyb3cgUmFuZ2VFcnJvcigiVW5rbm93biBzY2FsZTogIitsKTt9Zi5maW5kQ2xvc2VzdFBhdGg9ZnVuY3Rpb24oayx0LGwpe2Z1bmN0aW9uIHAoeSx3LEMsRyl7Y29uc3QgRD15LUMsQj13LUc7Qz1tLUM7Rz1uLUc7Y29uc3QgST0oRCpDK0IqRykvKEQqRCtCKkIpO3JldHVybiAwPj1JP2IuaHBhcmFtcy51dGlscy5sMk5vcm1TcXVhcmVkKEMsRyk6MTw9ST9iLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZCh5LW0sdy1uKTpiLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZChDLUkqRCxHLUkqQil9aWYoMj50Lmxlbmd0aClyZXR1cm4gY29uc29sZS5lcnJvcigiTGVzcyB0aGFuIHR3byBheGVzIGluIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QuIiksbnVsbDtjb25zdCBtPWxbMF0sbj1sWzFdO2lmKG08PXRbMF18fG0+PXRbdC5sZW5ndGgtMV0pcmV0dXJuIG51bGw7Y29uc3QgcT1fLnNvcnRlZEluZGV4KHQsbSk7Y29uc29sZS5hc3NlcnQoMDxxKTsKY29uc29sZS5hc3NlcnQocTx0Lmxlbmd0aCk7Y29uc3QgdT1xLTE7bGV0IHg9bnVsbCxBPW51bGw7ay5mb3JFYWNoKHk9Pntjb25zdCB3PXAoeS5jb250cm9sUG9pbnRzW3VdWzBdLHkuY29udHJvbFBvaW50c1t1XVsxXSx5LmNvbnRyb2xQb2ludHNbcV1bMF0seS5jb250cm9sUG9pbnRzW3FdWzFdKTsxMDA8d3x8IShudWxsPT09eHx8dzx4KXx8KHg9dyxBPXkpfSk7cmV0dXJuIEF9O2YucG9pbnRTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHQsbCl7cmV0dXJuIGsuZG9tYWluKCkuZmlsdGVyKHA9PntwPWsocCk7cmV0dXJuIHQ8PXAmJnA8PWx9KX07Zi5xdWFudGlsZVNjYWxlSW52ZXJzZUltYWdlPWZ1bmN0aW9uKGssdCxsKXtjb25zdCBwPWsucmFuZ2UoKSxtPXAuZmlsdGVyKG49PnQ8PW4mJm48PWwpLm1hcChuPT57Y29uc3QgcT1rLmludmVydEV4dGVudChuKTtyZXR1cm4gbj09PXBbcC5sZW5ndGgtMV0/W3FbMF0scVsxXSsxXTpxfSk7cmV0dXJuIDA9PW0ubGVuZ3RoP1swLAowXTpkMy5leHRlbnQoZDMubWVyZ2UobSkpfTtmLmNvbnRpbnVvdXNTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHQsbCl7cmV0dXJuW2suaW52ZXJ0KHQpLGsuaW52ZXJ0KGwpXS5zb3J0KChwLG0pPT5wLW0pfTtmLmNyZWF0ZUF4aXNTY2FsZT1ofSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvYXhlcy5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKHEpe3JldHVybiBudWxsIT09cS5zb3VyY2VFdmVudH1sZXQgazsoZnVuY3Rpb24ocSl7cS5MSU5FQVI9IkxJTkVBUiI7cS5MT0c9IkxPRyI7cS5RVUFOVElMRT0iUVVBTlRJTEUiO3EuTk9OX05VTUVSSUM9Ik5PTl9OVU1FUklDIn0pKGs9Zi5TY2FsZVR5cGV8fChmLlNjYWxlVHlwZT17fSkpO2NsYXNzIHR7aXNQYXNzaW5nKCl7cmV0dXJuITB9fWNsYXNzIGx7Y29uc3RydWN0b3IocSx1LHgsQSl7dGhpcy5fbG93ZXI9cTt0aGlzLl91cHBlcj11O3RoaXMuX2xvd2VyT3Blbj14O3RoaXMuX3VwcGVyT3Blbj1BfWlzUGFzc2luZyhxKXtyZXR1cm4gdGhpcy5fYmVmb3JlKHRoaXMuX2xvd2VyLHEsIXRoaXMuX2xvd2VyT3BlbikmJnRoaXMuX2JlZm9yZShxLHRoaXMuX3VwcGVyLCF0aGlzLl91cHBlck9wZW4pfV9iZWZvcmUocSx1LHgpe3JldHVybiB4P3E8PXU6cTx1fX1jbGFzcyBwe2NvbnN0cnVjdG9yKHEpe3RoaXMuX2RvbWFpblNldD0KcX1pc1Bhc3NpbmcocSl7cmV0dXJuLTEhPT10aGlzLl9kb21haW5TZXQuZmluZEluZGV4KHU9PnU9PT1xKX19Y2xhc3MgbXtjb25zdHJ1Y3RvcihxLHUseCxBKXt0aGlzLl9zdmdQcm9wcz1xO3RoaXMuX3NjaGVtYT11O3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlcj14O3RoaXMuX2NvbEluZGV4PUE7dGhpcy5faXNEaXNwbGF5ZWQ9ITE7dGhpcy5fc2NhbGVUeXBlPXRoaXMuX3lTY2FsZT1udWxsO3RoaXMuc2V0QnJ1c2hTZWxlY3Rpb24obnVsbCl9Y29sSW5kZXgoKXtyZXR1cm4gdGhpcy5fY29sSW5kZXh9eVNjYWxlKCl7cmV0dXJuIHRoaXMuX3lTY2FsZX1zY2FsZVR5cGUoKXtyZXR1cm4gdGhpcy5fc2NhbGVUeXBlfWJydXNoU2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2JydXNoU2VsZWN0aW9ufWlzRGlzcGxheWVkKCl7cmV0dXJuIHRoaXMuX2lzRGlzcGxheWVkfXNldEJydXNoU2VsZWN0aW9uKHEpe3RoaXMuX2JydXNoU2VsZWN0aW9uPXE7dGhpcy5fYnJ1c2hGaWx0ZXI9dGhpcy5fYnVpbGRCcnVzaEZpbHRlcih0aGlzLmJydXNoU2VsZWN0aW9uKCksCnRoaXMuc2NhbGVUeXBlKCksdGhpcy55U2NhbGUoKSl9c2V0RG9tYWluQW5kU2NhbGUocSx1KXt0aGlzLl9zY2FsZVR5cGU9dTt0aGlzLl95U2NhbGU9Yi5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LmNyZWF0ZUF4aXNTY2FsZShxLnNsaWNlKCksdGhpcy5fc3ZnUHJvcHMuaGVpZ2h0LHRoaXMuc2NhbGVUeXBlKCkpO3RoaXMuX2JydXNoRmlsdGVyPXRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLHRoaXMuc2NhbGVUeXBlKCksdGhpcy55U2NhbGUoKSl9YnJ1c2hGaWx0ZXIoKXtyZXR1cm4gdGhpcy5fYnJ1c2hGaWx0ZXJ9dXBkYXRlRE9NKHEpe3ZhciB1PWQzLmF4aXNMZWZ0KHRoaXMueVNjYWxlKCkpO3RoaXMuc2NhbGVUeXBlKCk9PT1rLlFVQU5USUxFJiYodT11LnRpY2tWYWx1ZXModGhpcy55U2NhbGUoKS5xdWFudGlsZXMoKSkudGlja0Zvcm1hdChkMy5mb3JtYXQoIi0uNmciKSkpO3ZhciB4PWQzLnNlbGVjdChxKTt4LnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpOwp4LmFwcGVuZCgiZyIpLmNsYXNzZWQoImF4aXMiLCEwKS5jYWxsKHUpLmFwcGVuZCgidGV4dCIpLmNsYXNzZWQoImF4aXMtdGl0bGUiLCEwKS5zdHlsZSgiY3Vyc29yIiwibW92ZSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoInkiLC05KS50ZXh0KEE9PmIuaHBhcmFtcy51dGlscy5zY2hlbWFDb2x1bW5OYW1lKHRoaXMuX3NjaGVtYSxBKSk7eC5jYWxsKGQzLmRyYWcoKS5vbigic3RhcnQiLCgpPT57cS5zZXRBdHRyaWJ1dGUoImlzLWRyYWdnaW5nIiwiIik7dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZ1N0YXJ0KHRoaXMuY29sSW5kZXgoKSl9KS5vbigiZHJhZyIsKCk9PnRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWcoZDMuZXZlbnQueCkpLm9uKCJlbmQiLCgpPT57dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZ0VuZCgpO3EucmVtb3ZlQXR0cmlidXRlKCJpcy1kcmFnZ2luZyIpfSkpO3U9ZDMuYnJ1c2hZKCkuZXh0ZW50KFtbLTgsMF0sCls4LHRoaXMuX3N2Z1Byb3BzLmhlaWdodCsxXV0pLm9uKCJzdGFydCIsKCk9PntoKGQzLmV2ZW50KSYmKHEuc2V0QXR0cmlidXRlKCJpcy1icnVzaGluZyIsIiIpLHRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkJydXNoQ2hhbmdlZCh0aGlzLmNvbEluZGV4KCkpKX0pLm9uKCJicnVzaCIsKCk9PntpZihoKGQzLmV2ZW50KSl0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKX0pLm9uKCJlbmQiLCgpPT57aChkMy5ldmVudCkmJih0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKSxxLnJlbW92ZUF0dHJpYnV0ZSgiaXMtYnJ1c2hpbmciKSl9KTt4PWQzLnNlbGVjdChxKS5hcHBlbmQoImciKS5jbGFzc2VkKCJicnVzaCIsITApO3guY2FsbCh1KTt1Lm1vdmUoeCx0aGlzLmJydXNoU2VsZWN0aW9uKCkpfXNldERpc3BsYXllZChxKXt0aGlzLl9pc0Rpc3BsYXllZD1xfV9idWlsZEJydXNoRmlsdGVyKHEsCnUseCl7aWYobnVsbD09PXEpcmV0dXJuIG5ldyB0O2lmKG51bGw9PT11KXJldHVybiBjb25zb2xlLmVycm9yKCJTY2FsZSB0eXBlIGlzIG51bGwsIGJ1dCBicnVzaFNlbGVjdGlvbiBpc24ndDogIixxKSxuZXcgdDtzd2l0Y2godSl7Y2FzZSBrLkxJTkVBUjpjYXNlIGsuTE9HOntjb25zdCBbQSx5XT1iLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuY29udGludW91c1NjYWxlSW52ZXJzZUltYWdlKHgscVswXSxxWzFdKTtyZXR1cm4gbmV3IGwoQSx5LCExLCExKX1jYXNlIGsuUVVBTlRJTEU6e2NvbnN0IFtBLHldPWIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5xdWFudGlsZVNjYWxlSW52ZXJzZUltYWdlKHgscVswXSxxWzFdKTtyZXR1cm4gbmV3IGwoQSx5LCExLCEwKX1jYXNlIGsuTk9OX05VTUVSSUM6cmV0dXJuIG5ldyBwKGIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5wb2ludFNjYWxlSW52ZXJzZUltYWdlKHgscVswXSxxWzFdKSl9Y29uc29sZS5lcnJvcigiVW5rbm93biBzY2FsZSB0eXBlOiAiLAp1KTtyZXR1cm4gbmV3IHR9fWYuQXhpcz1tO2NsYXNzIG57Y29uc3RydWN0b3IocSx1LHgpe3RoaXMuX3N2Z1Byb3BzPXE7dGhpcy5fc2NoZW1hPXU7dGhpcy5fYXhlcz10aGlzLl9jcmVhdGVBeGVzKHgpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zPWQzLnNjYWxlUG9pbnQoKS5yYW5nZShbMSx0aGlzLl9zdmdQcm9wcy53aWR0aC0xXSkucGFkZGluZyguNSk7dGhpcy5fZHJhZ2dlZEF4aXM9bnVsbDt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5heGlzLXBhcmVudCIpLnJlbW92ZSgpO3RoaXMuX3BhcmVudHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoIi5heGlzLXBhcmVudCIpfXVwZGF0ZUF4ZXMocSx1KXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTtjb25zdCB4PW5ldyBTZXQ7cS5jb2x1bW5zLmZvckVhY2goeT0+e2NvbnN0IHc9eS5hYnNvbHV0ZUluZGV4O2xldCBDPXRoaXMuX2F4ZXNbd107Qy5zZXREaXNwbGF5ZWQoITApOwpjb25zdCBHPXUubWFwKEQ9PmIuaHBhcmFtcy51dGlscy5jb2x1bW5WYWx1ZUJ5SW5kZXgodGhpcy5fc2NoZW1hLEQsdykpO0Muc2V0RG9tYWluQW5kU2NhbGUoRyx5LnNjYWxlKTt4LmFkZCh3KX0pO3RoaXMuX2F4ZXMuZm9yRWFjaCh5PT57eC5oYXMoeS5jb2xJbmRleCgpKXx8eS5zZXREaXNwbGF5ZWQoITEpfSk7dGhpcy5fdXBkYXRlU3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMoeCk7dGhpcy5fcGFyZW50c1NlbD10aGlzLl9wYXJlbnRzU2VsLmRhdGEoQXJyYXkuZnJvbSh4KSx5PT55KTt0aGlzLl9wYXJlbnRzU2VsLmV4aXQoKS5yZW1vdmUoKTt0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3BhcmVudHNTZWwuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJheGlzLXBhcmVudCIsITApLm1lcmdlKHRoaXMuX3BhcmVudHNTZWwpO2NvbnN0IEE9dGhpczt0aGlzLl9wYXJlbnRzU2VsLmNhbGwoeT0+dGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHkpKS5lYWNoKGZ1bmN0aW9uKHkpe0EuX2F4ZXNbeV0udXBkYXRlRE9NKHRoaXMpfSl9bWFwVmlzaWJsZUF4ZXMocSl7cmV0dXJuIHRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpLm1hcCh1PT4KcSh0aGlzLmdldEF4aXNQb3NpdGlvbih1KSx0aGlzLl9heGVzW3VdKSl9YWxsVmlzaWJsZUF4ZXNTYXRpc2Z5KHEpe3JldHVybiB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5ldmVyeSh1PT5xKHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHUpLHRoaXMuX2F4ZXNbdV0pKX1nZXRBeGlzRm9yQ29sSW5kZXgocSl7cmV0dXJuIHRoaXMuX2F4ZXNbcV19ZHJhZ1N0YXJ0KHEpe2NvbnNvbGUuYXNzZXJ0KCF0aGlzLmlzQXhpc0RyYWdnaW5nKCkpO2NvbnNvbGUuYXNzZXJ0KHRoaXMuX2F4ZXNbcV0uaXNEaXNwbGF5ZWQoKSk7dGhpcy5fZHJhZ2dlZEF4aXM9dGhpcy5fYXhlc1txXTt0aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uPXRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zKHEpfWRyYWcocSl7dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj1xPU1hdGgubWluKE1hdGgubWF4KHEsMCksdGhpcy5fc3ZnUHJvcHMud2lkdGgpO3E9dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCk7CnEuc29ydCgodSx4KT0+dGhpcy5nZXRBeGlzUG9zaXRpb24odSktdGhpcy5nZXRBeGlzUG9zaXRpb24oeCkpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbihxKTt0aGlzLl91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00odGhpcy5fcGFyZW50c1NlbCl9ZHJhZ0VuZCgpe2NvbnNvbGUuYXNzZXJ0KHRoaXMuaXNBeGlzRHJhZ2dpbmcoKSk7dGhpcy5fZHJhZ2dlZEF4aXM9dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj1udWxsO3RoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh0aGlzLl9wYXJlbnRzU2VsLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApKX1pc0F4aXNEcmFnZ2luZygpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXN9Z2V0QXhpc1Bvc2l0aW9uKHEpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXMmJnRoaXMuX2RyYWdnZWRBeGlzLmNvbEluZGV4KCk9PT1xP3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb246dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMocSl9X3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHEpe3ZhciB1PQp0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5maWx0ZXIoeD0+cS5oYXMoeCkpO3U9QXJyYXkuZnJvbShuZXcgU2V0KFsuLi51LC4uLkFycmF5LmZyb20ocSldKSk7dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKHUpfV91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00ocSl7cS5hdHRyKCJ0cmFuc2Zvcm0iLHU9PmIuaHBhcmFtcy51dGlscy50cmFuc2xhdGVTdHIodGhpcy5nZXRBeGlzUG9zaXRpb24odSkpKX1fY3JlYXRlQXhlcyhxKXtyZXR1cm4gZDMucmFuZ2UoYi5ocGFyYW1zLnV0aWxzLm51bUNvbHVtbnModGhpcy5fc2NoZW1hKSkubWFwKHU9Pm5ldyBtKHRoaXMuX3N2Z1Byb3BzLHRoaXMuX3NjaGVtYSxxLHUpKX19Zi5BeGVzQ29sbGVjdGlvbj1ufSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvbGluZXMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7bGV0IGg7KGZ1bmN0aW9uKGwpe2xbbC5GT1JFR1JPVU5EPTBdPSJGT1JFR1JPVU5EIjtsW2wuQkFDS0dST1VORD0xXT0iQkFDS0dST1VORCJ9KShoPWYuTGluZVR5cGV8fChmLkxpbmVUeXBlPXt9KSk7Y2xhc3Mga3tjb25zdHJ1Y3RvcihsKXt2b2lkIDA9PT1sJiYobD1kMy5zZWxlY3RBbGwobnVsbCkpO2NvbnNvbGUuYXNzZXJ0KDE+PWwuc2l6ZSgpKTt0aGlzLl9zZXNzaW9uR3JvdXBTZWw9bH1zZXNzaW9uR3JvdXAoKXtyZXR1cm4gMT09PXRoaXMuX3Nlc3Npb25Hcm91cFNlbC5zaXplKCk/dGhpcy5fc2Vzc2lvbkdyb3VwU2VsLmRhdHVtKCk6bnVsbH1pc051bGwoKXtyZXR1cm4gbnVsbD09PXRoaXMuc2Vzc2lvbkdyb3VwKCl9c2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nlc3Npb25Hcm91cFNlbH1lcXVhbHNUbyhsKXtyZXR1cm4gdGhpcy5pc051bGwoKT9sLmlzTnVsbCgpOmwuaXNOdWxsKCk/ITE6bC5zZXNzaW9uR3JvdXAoKS5uYW1lPT0KdGhpcy5zZXNzaW9uR3JvdXAoKS5uYW1lfX1mLlNlc3Npb25Hcm91cEhhbmRsZT1rO2NsYXNzIHR7Y29uc3RydWN0b3IobCxwLG0pe3RoaXMuX3N2Z1Byb3BzPWw7dGhpcy5fc2NoZW1hPXA7dGhpcy5fYXhlc0NvbGxlY3Rpb249bTt0aGlzLl9zZXNzaW9uR3JvdXBzPVtdO3RoaXMuX3N2Z1Byb3BzLnN2Z0cuc2VsZWN0QWxsKCJnLmJhY2tncm91bmQiKS5yZW1vdmUoKTt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5mb3JlZ3JvdW5kIikucmVtb3ZlKCk7dGhpcy5fYmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImJhY2tncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKTt0aGlzLl9mZ1BhdGhzU2VsPXRoaXMuX3N2Z1Byb3BzLnN2Z0cuYXBwZW5kKCJnIikuY2xhc3NlZCgiZm9yZWdyb3VuZCIsITApLnNlbGVjdEFsbCgicGF0aCIpO3RoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPQpuZXcgazt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZT1uZXcgazt0aGlzLl9kM2xpbmU9ZDMubGluZSgpLmN1cnZlKGQzLmN1cnZlTGluZWFyKX1nZXRTZXNzaW9uR3JvdXBIYW5kbGUobCl7cmV0dXJuIG51bGw9PT1sfHx2b2lkIDA9PT1sP25ldyBrOm5ldyBrKHRoaXMuX2ZnUGF0aHNTZWwuZmlsdGVyKHA9PnAubmFtZT09PWwubmFtZSkpfWhpZGVCYWNrZ3JvdW5kTGluZXMoKXt0aGlzLl9iZ1BhdGhzU2VsLmF0dHIoInZpc2liaWxpdHkiLCJoaWRkZW4iKX1zaG93QmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IixudWxsKX1wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKXtyZXR1cm4gdGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlfXNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlfXJlY29tcHV0ZUNvbnRyb2xQb2ludHMobCxwPTApeyhsPT09aC5GT1JFR1JPVU5EPwp0aGlzLl9mZ1BhdGhzU2VsOnRoaXMuX2JnUGF0aHNTZWwpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihwKS5hdHRyKCJkIixtPT50aGlzLl9wYXRoREF0dHJpYnV0ZShtKSk7bD09PWguRk9SRUdST1VORCYmd2luZG93LnNldFRpbWVvdXQoKCk9Pntjb25zdCBtPXRoaXM7dGhpcy5fZmdQYXRoc1NlbC5lYWNoKGZ1bmN0aW9uKG4pe20uX3NldENvbnRyb2xQb2ludHNQcm9wZXJ0eSh0aGlzLG4pfSl9KX1yZWNvbXB1dGVGb3JlZ3JvdW5kTGluZXNWaXNpYmlsaXR5KCl7dGhpcy5fZmdQYXRoc1NlbC5jbGFzc2VkKCJpbnZpc2libGUtcGF0aCIsbD0+IXRoaXMuX2F4ZXNDb2xsZWN0aW9uLmFsbFZpc2libGVBeGVzU2F0aXNmeSgocCxtKT0+bS5icnVzaEZpbHRlcigpLmlzUGFzc2luZyhiLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxsLG0uY29sSW5kZXgoKSkpKSk7dGhpcy5fdXBkYXRlVmlzaWJsZUZnUGF0aHNTZWwoKX1zZXRGb3JlZ3JvdW5kTGluZXNDb2xvcihsLApwLG0pe2w9dGhpcy5fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24obCxwLG0pO3RoaXMuX2ZnUGF0aHNTZWwuYXR0cigic3Ryb2tlIixsKX1yZWRyYXcobCxwLG0sbil7Y29uc3QgcT10aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCksdT10aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZS5zZXNzaW9uR3JvdXAoKTt0aGlzLl9zZXNzaW9uR3JvdXBzPWw7dGhpcy5fZmdQYXRoc1NlbD10aGlzLl9yZWNvbXB1dGVQYXRoU2VsZWN0aW9uKHRoaXMuX2ZnUGF0aHNTZWwpO3RoaXMuX2JnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9iZ1BhdGhzU2VsKTt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUocSk7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUodSk7dGhpcy5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGguRk9SRUdST1VORCk7CnRoaXMucmVjb21wdXRlQ29udHJvbFBvaW50cyhoLkJBQ0tHUk9VTkQpO3RoaXMucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpO3RoaXMuc2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IocCxtLG4pfXVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cChsKXt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCExKTt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9bDt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCEwKX1jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpe3RoaXMudXBkYXRlUGVha2VkU2Vzc2lvbkdyb3VwKG5ldyBrKX11cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChsKXt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZS5zZWxlY3Rpb24oKS5jbGFzc2VkKCJzZWxlY3RlZC1wYXRoIiwhMSk7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9Cmw7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgic2VsZWN0ZWQtcGF0aCIsITApfWZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKGwscCl7Y29uc3QgbT10aGlzLl9heGVzQ29sbGVjdGlvbi5tYXBWaXNpYmxlQXhlcyhuPT5uKTtsPWIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5maW5kQ2xvc2VzdFBhdGgodGhpcy5fdmlzaWJsZUZnUGF0aHNTZWwubm9kZXMoKSxtLFtsLHBdKTtyZXR1cm4gbnVsbD09PWw/bmV3IGs6bmV3IGsoZDMuc2VsZWN0KGwpKX1fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24obCxwLG0pe2lmKG51bGw9PT1sKXJldHVybigpPT4icmVkIjtjb25zdCBuPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGIuaHBhcmFtcy51dGlscy5udW1lcmljQ29sdW1uRXh0ZW50KHRoaXMuX3NjaGVtYSx0aGlzLl9zZXNzaW9uR3JvdXBzLGwpKS5yYW5nZShbcCxtXSkuaW50ZXJwb2xhdGUoZDMuaW50ZXJwb2xhdGVMYWIpO3JldHVybiBxPT4KbihiLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxxLGwpKX1fcmVjb21wdXRlUGF0aFNlbGVjdGlvbihsKXtsPWwuZGF0YSh0aGlzLl9zZXNzaW9uR3JvdXBzLHA9PnAubmFtZSk7bC5leGl0KCkucmVtb3ZlKCk7cmV0dXJuIGwuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5tZXJnZShsKX1fc2V0Q29udHJvbFBvaW50c1Byb3BlcnR5KGwscCl7bC5jb250cm9sUG9pbnRzPXRoaXMuX2NvbXB1dGVDb250cm9sUG9pbnRzKHApfV9jb21wdXRlQ29udHJvbFBvaW50cyhsKXtyZXR1cm4gdGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMoKHAsbSk9PltwLG0ueVNjYWxlKCkoYi5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsbCxtLmNvbEluZGV4KCkpKV0pfV9wYXRoREF0dHJpYnV0ZShsKXtyZXR1cm4gdGhpcy5fZDNsaW5lKHRoaXMuX2NvbXB1dGVDb250cm9sUG9pbnRzKGwpKX1fdXBkYXRlVmlzaWJsZUZnUGF0aHNTZWwoKXt0aGlzLl92aXNpYmxlRmdQYXRoc1NlbD0KdGhpcy5fZmdQYXRoc1NlbC5maWx0ZXIoIjpub3QoLmludmlzaWJsZS1wYXRoKSIpfX1mLkxpbmVzQ29sbGVjdGlvbj10fSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvaW50ZXJhY3Rpb25fbWFuYWdlci5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjbGFzcyBoe2NvbnN0cnVjdG9yKHQsbCl7dGhpcy5zdmc9ZDMuc2VsZWN0KHQpO3Q9MTAwKmwrMjA7dGhpcy5zdmcuYXR0cigidmlld0JveCIsYDAgMCAke3R9ICR7MjQwfWApO3RoaXMuc3ZnLmF0dHIoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCIpO3RoaXMuc3ZnLnN0eWxlKCJtaW4td2lkdGgiLHQrInB4Iik7dGhpcy5zdmcuc3R5bGUoIm1pbi1oZWlnaHQiLCIyNDBweCIpO3RoaXMud2lkdGg9dC0xMC0xMDt0aGlzLmhlaWdodD0yMDA7dGhpcy5zdmdHPXRoaXMuc3ZnLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsYi5ocGFyYW1zLnV0aWxzLnRyYW5zbGF0ZVN0cigxMCwzMCkpfX1mLlNWR1Byb3BlcnRpZXM9aDtjbGFzcyBre2NvbnN0cnVjdG9yKHQsbCxwLG0pe3RoaXMuX3N2Z1Byb3BzPXQ7dGhpcy5fc2NoZW1hPWw7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCPXA7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0I9Cm07dGhpcy5fYXhlc0NvbGxlY3Rpb249bmV3IGYuQXhlc0NvbGxlY3Rpb24odCxsLHRoaXMpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbj1uZXcgZi5MaW5lc0NvbGxlY3Rpb24odCxsLHRoaXMuX2F4ZXNDb2xsZWN0aW9uKTt0aGlzLl9zdmdQcm9wcy5zdmcub24oImNsaWNrIiwoKT0+dGhpcy5vbkNsaWNrKCkpLm9uKCJtb3VzZW1vdmUgbW91c2VlbnRlciIsKCk9Pntjb25zdCBbbixxXT1kMy5tb3VzZSh0aGlzLl9zdmdQcm9wcy5zdmdHLm5vZGUoKSk7dGhpcy5vbk1vdXNlTW92ZWQobixxKX0pLm9uKCJtb3VzZWxlYXZlIiwoKT0+dGhpcy5vbk1vdXNlTGVhdmUoKSl9b25EcmFnU3RhcnQodCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ1N0YXJ0KHQpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5oaWRlQmFja2dyb3VuZExpbmVzKCl9b25EcmFnKHQpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWcodCk7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZi5MaW5lVHlwZS5GT1JFR1JPVU5EKX1vbkRyYWdFbmQoKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnRW5kKCk7CnRoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGYuTGluZVR5cGUuRk9SRUdST1VORCw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KCgpPT57dGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZi5MaW5lVHlwZS5CQUNLR1JPVU5EKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2hvd0JhY2tncm91bmRMaW5lcygpfSw1MDApfW9uQnJ1c2hDaGFuZ2VkKHQpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmdldEF4aXNGb3JDb2xJbmRleCh0KS5zZXRCcnVzaFNlbGVjdGlvbihkMy5ldmVudC5zZWxlY3Rpb24pO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVGb3JlZ3JvdW5kTGluZXNWaXNpYmlsaXR5KCl9b25Nb3VzZU1vdmVkKHQsbCl7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cCh0aGlzLl9saW5lc0NvbGxlY3Rpb24uZmluZENsb3Nlc3RTZXNzaW9uR3JvdXAodCxsKSk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25Nb3VzZUxlYXZlKCl7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpLmlzTnVsbCgpfHwKKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQihudWxsKSl9b25DbGljaygpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT09PXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpP3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChuZXcgZi5TZXNzaW9uR3JvdXBIYW5kbGUpOnRoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cCh0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpKX1vbk9wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKHQsCmwpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLnVwZGF0ZUF4ZXModCxsKTtjb25zdCBwPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSxtPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWRyYXcobCx2b2lkIDAhPT10LmNvbG9yQnlDb2x1bW5JbmRleD90LmNvbHVtbnNbdC5jb2xvckJ5Q29sdW1uSW5kZXhdLmFic29sdXRlSW5kZXg6bnVsbCx0Lm1pbkNvbG9yLHQubWF4Q29sb3IpO3AuZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKXx8dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSk7bS5lcXVhbHNUbyh0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fAp0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9c2NoZW1hKCl7cmV0dXJuIHRoaXMuX3NjaGVtYX19Zi5JbnRlcmFjdGlvbk1hbmFnZXI9a30pKGQucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChkLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdCIscHJvcGVydGllczp7c2Vzc2lvbkdyb3VwczpBcnJheSxvcHRpb25zOk9iamVjdCxzZWxlY3RlZFNlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbCxyZWFkT25seTohMCxub3RpZnk6ITB9LGNsb3Nlc3RTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxyZWRyYXdDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3ZhbGlkU2Vzc2lvbkdyb3VwczpBcnJheSxfaW50ZXJhY3Rpb25NYW5hZ2VyOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX29wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKG9wdGlvbnMuKiwgc2Vzc2lvbkdyb3Vwcy4qKSJdLF9vcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCgpe2lmKG51bGwhPT10aGlzLm9wdGlvbnMpe3ZhciBiPXRoaXMub3B0aW9ucy5jb25maWd1cmF0aW9uO2lmKHZvaWQgMD09PXRoaXMuX2ludGVyYWN0aW9uTWFuYWdlcnx8CiFfLmlzRXF1YWwodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLnNjaGVtYSgpLGIuc2NoZW1hKSl7ZDMuc2VsZWN0KHRoaXMuJC5zdmcpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO2NvbnN0IGQ9bmV3IHRmLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuU1ZHUHJvcGVydGllcyh0aGlzLiQuc3ZnLHRmLmhwYXJhbXMudXRpbHMubnVtQ29sdW1ucyhiLnNjaGVtYSkpO3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5zdmcsITApO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlcj1uZXcgdGYuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5JbnRlcmFjdGlvbk1hbmFnZXIoZCxiLnNjaGVtYSxmPT50aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKGYpLGY9PnRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkKGYpKX10aGlzLl9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCk7dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uT3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodGhpcy5vcHRpb25zLAp0aGlzLl92YWxpZFNlc3Npb25Hcm91cHMpO3RoaXMucmVkcmF3Q291bnQrK319LGNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKGIpe3RoaXMuX3NldENsb3Nlc3RTZXNzaW9uR3JvdXAoYil9LHNlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZChiKXt0aGlzLl9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChiKX0sX2NvbXB1dGVWYWxpZFNlc3Npb25Hcm91cHMoKXtjb25zdCBiPXRmLmhwYXJhbXMudXRpbHM7aWYodm9pZCAwPT09dGhpcy5zZXNzaW9uR3JvdXBzKXRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz12b2lkIDA7ZWxzZXt2YXIgZD10aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5zY2hlbWE7dGhpcy5fdmFsaWRTZXNzaW9uR3JvdXBzPXRoaXMuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoZj0+e2ZvcihsZXQgaD0wO2g8Yi5udW1Db2x1bW5zKGQpOysraClpZih0aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5jb2x1bW5zVmlzaWJpbGl0eVtoXSYmdm9pZCAwPT09Yi5jb2x1bW5WYWx1ZUJ5SW5kZXgoZCwKZixoKSlyZXR1cm4hMTtyZXR1cm4hMH0pfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXl9LF9jbG9zZXN0T3JTZWxlY3RlZDpmdW5jdGlvbihiLGQpe3JldHVybiBudWxsIT09Yj9iOmR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QvdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLHByb3BlcnRpZXM6e3Zpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXksb3B0aW9uczpPYmplY3Qsc2VsZWN0ZWRTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxjbG9zZXN0U2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sX2NvbnRhaW5lcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3N2Zzp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sd2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX2JydXNoZWRDZWxsSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9icnVzaFNlbGVjdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBzQ2hhbmdlZChzZXNzaW9uR3JvdXBzLiopIiwKIl92aXNpYmxlU2NoZW1hQ2hhbmdlZCh2aXNpYmxlU2NoZW1hLiopIiwiX3JlZHJhdyhvcHRpb25zLiopIl0scmVhZHkoKXt0aGlzLl9jb250YWluZXI9dGhpcy4kLmNvbnRhaW5lcjt0aGlzLl9zdmc9ZDMuc2VsZWN0KHRoaXMuJC5zdmcpO3RoaXMuX3JlZHJhdygpfSxfc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtudWxsIT09dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCYmdGhpcy5fc2V0U2VsZWN0ZWRTZXNzaW9uR3JvdXAodGYuaHBhcmFtcy51dGlscy5zZXNzaW9uR3JvdXBXaXRoTmFtZSh0aGlzLnNlc3Npb25Hcm91cHMsdGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cC5uYW1lKXx8bnVsbCk7dGhpcy5fcmVkcmF3KCl9LF92aXNpYmxlU2NoZW1hQ2hhbmdlZCgpe3RoaXMuX2JydXNoU2VsZWN0aW9uPXRoaXMuX2JydXNoZWRDZWxsSW5kZXg9bnVsbDt0aGlzLl9yZWRyYXcoKX0sX3JlZHJhdygpe3RoaXMuZGVib3VuY2UoIl9yZWRyYXciLCgpPT57Y29uc3QgYj10Zi5ocGFyYW1zLnV0aWxzOwp0aGlzLndpZHRoPU1hdGgubWF4KDE1MCpiLm51bVZpc2libGVDb2x1bW5zKHRoaXMudmlzaWJsZVNjaGVtYSksMTIwMCk7dGhpcy5oZWlnaHQ9TWF0aC5tYXgoMTEyLjUqYi5udW1WaXNpYmxlTWV0cmljcyh0aGlzLnZpc2libGVTY2hlbWEpLDQ4MCk7dGhpcy5fY29udGFpbmVyLnN0eWxlLndpZHRoPXRoaXMud2lkdGgrInB4Ijt0aGlzLl9jb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0KyJweCI7dGhpcy5fc3ZnLmF0dHIoIndpZHRoIix0aGlzLndpZHRoKS5hdHRyKCJoZWlnaHQiLHRoaXMuaGVpZ2h0KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dGhpcy5fZHJhdygpfSwxMDApfSxfZHJhdygpe2Z1bmN0aW9uIGIoa2Epe3JldHVybiJ4LWF4aXMtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gZChrYSl7cmV0dXJuIngtbGFiZWwtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gZihrYSl7cmV0dXJuInktYXhpcy1jbGlwLXBhdGgtIitrYX1mdW5jdGlvbiBoKGthKXtyZXR1cm4ieS1sYWJlbC1jbGlwLXBhdGgtIisKa2F9ZnVuY3Rpb24gayhrYSxZLEVhLHZhLHhhKXtFYT1NYXRoLmZsb29yKEVhL3ZhKTt2YT1ZLnNjYWxlKCk7aWYoIlFVQU5USUxFIj09PXhhKXtsZXQgQWE9dmEucXVhbnRpbGVzKCk7QWE9ZDMucmFuZ2UoMCxBYS5sZW5ndGgsTWF0aC5jZWlsKEFhLmxlbmd0aC9FYSkpLm1hcChGYT0+QWFbRmFdKTtZLnRpY2tWYWx1ZXMoQWEpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCItLjJnIikpfSJMSU5FQVIiIT09eGEmJiJMT0ciIT09eGF8fFkudGlja3MoRWEpO2thLmNhbGwoWSk7a2Euc2VsZWN0QWxsKCIuZG9tYWluIikucmVtb3ZlKCk7a2Euc2VsZWN0QWxsKCIudGljayBsaW5lIikuYXR0cigic3Ryb2tlIiwiI2RkZCIpfWZ1bmN0aW9uIHQoa2EsWSl7cmV0dXJuIE9bWV0ody5fY29sVmFsdWUoa2EsWSkpfWZ1bmN0aW9uIGwoa2EsWSl7cmV0dXJuIEhbWV0ody5fbWV0cmljVmFsdWUoa2EsWSkpfWZ1bmN0aW9uIHAoa2EsWSl7Y29uc3QgRWE9W107VFtrYV1bWV0uZWFjaChmdW5jdGlvbigpe0VhLnB1c2godGhpcyl9KTsKcmV0dXJuIGQzLnF1YWR0cmVlKCkueCh2YT0+ZDMuc2VsZWN0KHZhKS5kYXR1bSgpLngpLnkodmE9PmQzLnNlbGVjdCh2YSkuZGF0dW0oKS55KS5hZGRBbGwoRWEpfWZ1bmN0aW9uIG0oKXtsZXQga2E9bmV3IFNldChRLm5vZGVzKCkpO3goKXx8KGthPW4ody5fYnJ1c2hlZENlbGxJbmRleCx3Ll9icnVzaFNlbGVjdGlvbikpO2QzLnNlbGVjdEFsbChBcnJheS5mcm9tKHkuZmlsdGVyU2V0KGthLFk9PiFaLmhhcyhZKSkpKS5hdHRyKCJmaWxsIixMKTtkMy5zZWxlY3RBbGwoQXJyYXkuZnJvbSh5LmZpbHRlclNldChaLFk9PiFrYS5oYXMoWSkpKSkuYXR0cigiZmlsbCIsIiNkZGQiKTtaPWthfWZ1bmN0aW9uIG4oa2EsWSl7Y29uc29sZS5hc3NlcnQobnVsbCE9PWthKTtjb25zb2xlLmFzc2VydChudWxsIT09WSk7Y29uc3QgW0VhLHZhXT1rYSx4YT1uZXcgU2V0O3kucXVhZFRyZWVWaXNpdFBvaW50c0luUmVjdChhYVtFYV1bdmFdLFlbMF1bMF0sWVswXVsxXSxZWzFdWzBdLFlbMV1bMV0sCkFhPT57ZDMuc2VsZWN0KEFhKS5kYXR1bSgpLnNlc3Npb25Hcm91cE1hcmtlcnMuZm9yRWFjaChGYT0+e3hhLmFkZChGYSl9KX0pO3JldHVybiB4YX1mdW5jdGlvbiBxKGthKXtjb25zdCBZPWQzLmJydXNoU2VsZWN0aW9uKGthKTshdSgpJiZudWxsPT09WXx8dSgpJiZrYT09PWxhLm5vZGUoKSYmXy5pc0VxdWFsKFksdy5fYnJ1c2hTZWxlY3Rpb24pfHwody5fYnJ1c2hTZWxlY3Rpb249WSxudWxsIT09WT8obGE9ZDMuc2VsZWN0KGthKSx3Ll9icnVzaGVkQ2VsbEluZGV4PWxhLmRhdHVtKCkpOihsYT1udWxsLHcuX2JydXNoZWRDZWxsSW5kZXg9bnVsbCksbSgpKX1mdW5jdGlvbiB1KCl7cmV0dXJuIG51bGwhPT13Ll9icnVzaGVkQ2VsbEluZGV4JiZudWxsIT09dy5fYnJ1c2hTZWxlY3Rpb259ZnVuY3Rpb24geCgpe3JldHVybiF1KCl8fHcuX2JydXNoU2VsZWN0aW9uWzBdWzBdPT09dy5fYnJ1c2hTZWxlY3Rpb25bMV1bMF18fHcuX2JydXNoU2VsZWN0aW9uWzBdWzFdPT09dy5fYnJ1c2hTZWxlY3Rpb25bMV1bMV19CmZ1bmN0aW9uIEEoa2EsWSxFYSx2YSx4YSl7bGV0IEFhPUluZmluaXR5LEZhPW51bGw7eS5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrKGFhW2thXVtZXSxFYSx2YSx4YSwoeWEsU2EpPT57Wi5oYXMoeWEpJiZTYTxBYSYmKHlhPWQzLnNlbGVjdCh5YSkuZGF0dW0oKSxBYT1TYSxGYT15YS5zZXNzaW9uR3JvdXApfSk7cmV0dXJuIG51bGw9PT1GYT9udWxsOmQzLnNlbGVjdEFsbChYLmdldChGYSkpfWNvbnN0IHk9dGYuaHBhcmFtcy51dGlscyx3PXRoaXM7aWYodGhpcy5zZXNzaW9uR3JvdXBzJiYwIT10aGlzLnNlc3Npb25Hcm91cHMubGVuZ3RoJiZ0aGlzLnZpc2libGVTY2hlbWEmJjAhPXRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGgpe3ZhciBDPWQzLnJhbmdlKHkubnVtVmlzaWJsZUNvbHVtbnMody52aXNpYmxlU2NoZW1hKSksRz1kMy5yYW5nZSh5Lm51bVZpc2libGVNZXRyaWNzKHcudmlzaWJsZVNjaGVtYSkpLEQ9ZDMuc2NhbGVCYW5kKCkuZG9tYWluKEMpLnJhbmdlKFs4NSwKdGhpcy53aWR0aC0xLTVdKS5wYWRkaW5nSW5uZXIoLjEpLEI9ZDMuc2NhbGVCYW5kKCkuZG9tYWluKEcpLnJhbmdlKFt0aGlzLmhlaWdodC0xLTUtNTAsNV0pLnBhZGRpbmdJbm5lciguMSksST1ELmJhbmR3aWR0aCgpLE49Qi5iYW5kd2lkdGgoKSxPPUMubWFwKGthPT53Ll9jZWxsU2NhbGUoa2EsWzAsSS0xXSkpLEg9Ry5tYXAoa2E9PncuX2NlbGxTY2FsZShrYSt5Lm51bVZpc2libGVIUGFyYW1zKHcudmlzaWJsZVNjaGVtYSksW04tMSwwXSkpLEs9dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLngtYXhpcyIpLmRhdGEoQykuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ4LWF4aXMiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLGthPT55LnRyYW5zbGF0ZVN0cihEKGthKSwwKSk7Sy5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGIpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC01KS5hdHRyKCJ5IiwwKS5hdHRyKCJ3aWR0aCIsSSsxMCkuYXR0cigiaGVpZ2h0Iix3LmhlaWdodC0yNSk7CksuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixkKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwwKS5hdHRyKCJ5Iix3LmhlaWdodC0yNSkuYXR0cigid2lkdGgiLEkpLmF0dHIoImhlaWdodCIsMjUpO0suYXBwZW5kKCJnIikuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIitiKGthKSsiKSIpLmVhY2goZnVuY3Rpb24oa2Epe2QzLnNlbGVjdCh0aGlzKS5jYWxsKGssZDMuYXhpc0JvdHRvbShPW2thXSkudGlja1NpemUody5oZWlnaHQtNTApLEksNDAsdy5vcHRpb25zLmNvbHVtbnNba2FdLnNjYWxlKX0pO0suYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzLWxhYmVsIiwhMCkuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIitkKGthKSsiKSIpLmFwcGVuZCgidGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieCIsSS8yKS5hdHRyKCJ5Iix3LmhlaWdodC0xLTEyLjUpLnRleHQoa2E9Pnkuc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWUody52aXNpYmxlU2NoZW1hLAprYSkpLmFwcGVuZCgidGl0bGUiKS50ZXh0KGthPT55LnNjaGVtYVZpc2libGVDb2x1bW5OYW1lKHcudmlzaWJsZVNjaGVtYSxrYSkpO0s9dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLnktYXhpcyIpLmRhdGEoRykuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWF4aXMiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLGthPT55LnRyYW5zbGF0ZVN0cih3LndpZHRoLTEsQihrYSkpKTtLLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsZikuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLSh3LndpZHRoLTQwLTEpKS5hdHRyKCJ5IiwtNSkuYXR0cigid2lkdGgiLHcud2lkdGgtNDApLmF0dHIoImhlaWdodCIsTisxMCk7Sy5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGgpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0ody53aWR0aC0xKSkuYXR0cigieSIsMCkuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLE4pO0suYXBwZW5kKCJnIikuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIisKZihrYSkrIikiKS5lYWNoKGZ1bmN0aW9uKGthKXtkMy5zZWxlY3QodGhpcykuY2FsbChrLGQzLmF4aXNMZWZ0KEhba2FdKS50aWNrU2l6ZSh3LndpZHRoLTgwKSxOLDIwLHcub3B0aW9ucy5jb2x1bW5zW2thK3kubnVtVmlzaWJsZUhQYXJhbXMody52aXNpYmxlU2NoZW1hKV0uc2NhbGUpfSk7Sy5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWF4aXMtbGFiZWwiLCEwKS5hdHRyKCJjbGlwLXBhdGgiLGthPT4idXJsKCMiK2goa2EpKyIpIikuYXBwZW5kKCJ0ZXh0IikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ4IiwtKHcud2lkdGgtMjAtMSkpLmF0dHIoInkiLE4vMikuYXR0cigidHJhbnNmb3JtIix5LnJvdGF0ZVN0cigtKHcud2lkdGgtMjAtMSksTi8yKSkudGV4dChrYT0+eS5tZXRyaWNOYW1lKHcudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1trYV0pKS5hcHBlbmQoInRpdGxlIikudGV4dChrYT0+eS5tZXRyaWNOYW1lKHcudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1trYV0pKTsKSz10aGlzLl9zdmcuc2VsZWN0QWxsKCIuY2VsbCIpLmRhdGEoZDMuY3Jvc3MoQyxHKSkuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJjZWxsIiwhMCkuYXR0cigidHJhbnNmb3JtIiwoW2thLFldKT0+eS50cmFuc2xhdGVTdHIoRChrYSksQihZKSkpO0suYXBwZW5kKCJnIikuY2xhc3NlZCgiZnJhbWUiLCEwKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtNSkuYXR0cigieSIsLTUpLmF0dHIoIndpZHRoIixJKzEwKS5hdHRyKCJoZWlnaHQiLE4rMTApLmF0dHIoInN0cm9rZSIsIiMwMDAiKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInNoYXBlLXJlbmRlcmluZyIsImNyaXNwRWRnZXMiKTt2YXIgTT1udWxsO3ZvaWQgMCE9PXcub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgmJihNPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKHRoaXMuX2NvbEV4dGVudCh0aGlzLm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4KSkucmFuZ2UoW3RoaXMub3B0aW9ucy5taW5Db2xvcix0aGlzLm9wdGlvbnMubWF4Q29sb3JdKS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZUxhYikpOwp2YXIgTD12b2lkIDA9PT13Lm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4PygpPT4icmVkIjooe3Nlc3Npb25Hcm91cDprYX0pPT5NKHRoaXMuX2NvbFZhbHVlKGthLHcub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgpKSxbUSxULFhdPWZ1bmN0aW9uKGthLFkpe2NvbnN0IEVhPWthLnNlbGVjdEFsbCgiLmRhdGEtbWFya2VyIikuZGF0YSgoW3hhLEFhXSk9Pncuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoRmE9PnZvaWQgMCE9PXcuX2NvbFZhbHVlKEZhLHhhKSYmdm9pZCAwIT09dy5fbWV0cmljVmFsdWUoRmEsQWEpKS5tYXAoRmE9Pih7Y29sOnhhLG1ldHJpYzpBYSxzZXNzaW9uR3JvdXA6RmEseDp0KEZhLHhhKSx5OmwoRmEsQWEpLHNlc3Npb25Hcm91cE1hcmtlcnM6bnVsbH0pKSkuZW50ZXIoKS5hcHBlbmQoImNpcmNsZSIpLmNsYXNzZWQoImRhdGEtbWFya2VyIiwhMCkuYXR0cigiY3giLCh7eDp4YX0pPT54YSkuYXR0cigiY3kiLCh7eTp4YX0pPT54YSkuYXR0cigiciIsMikuYXR0cigiZmlsbCIsClkpLHZhPW5ldyBNYXA7dy5zZXNzaW9uR3JvdXBzLmZvckVhY2goeGE9Pnt2YS5zZXQoeGEsW10pfSk7RWEuZWFjaChmdW5jdGlvbih4YSl7dmEuZ2V0KHhhLnNlc3Npb25Hcm91cCkucHVzaCh0aGlzKX0pO0VhLmVhY2goeGE9Pntjb25zdCBBYT12YS5nZXQoeGEuc2Vzc2lvbkdyb3VwKTt4YS5zZXNzaW9uR3JvdXBNYXJrZXJzPW5ldyBTZXQoQWEpfSk7a2E9Qy5tYXAoeGE9PkcubWFwKEFhPT5FYS5maWx0ZXIoRmE9PkZhLmNvbD09eGEmJkZhLm1ldHJpYz09QWEpKSk7cmV0dXJuW0VhLGthLHZhXX0oSy5hcHBlbmQoImciKSxMKSxhYT1DLm1hcChrYT0+Ry5tYXAoWT0+cChrYSxZKSkpLGxhPW51bGw7dSgpJiYobGE9Sy5maWx0ZXIoa2E9Pl8uaXNFcXVhbChrYSx3Ll9icnVzaGVkQ2VsbEluZGV4KSksY29uc29sZS5hc3NlcnQoMT09bGEuc2l6ZSgpLGxhKSk7dmFyIFo9bmV3IFNldChRLm5vZGVzKCkpO20oKTt2YXIgYmE9ZDMuYnJ1c2goKS5leHRlbnQoW1stNCwtNF0sW0ktMSs1LQoxLE4tMSs1LTFdXSkub24oInN0YXJ0IixmdW5jdGlvbigpe3UoKSYmbGEubm9kZSgpIT10aGlzJiZiYS5tb3ZlKGxhLG51bGwpO3EodGhpcyl9KS5vbigiYnJ1c2giLGZ1bmN0aW9uKCl7cSh0aGlzKX0pLm9uKCJlbmQiLGZ1bmN0aW9uKCl7cSh0aGlzKX0pO0suY2FsbChiYSk7dSgpJiZiYS5tb3ZlKGxhLHcuX2JydXNoU2VsZWN0aW9uKTt2YXIgZWE9bnVsbCxjYT1udWxsO251bGwhPT10aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwJiYoY2E9ZDMuc2VsZWN0QWxsKFguZ2V0KHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXApKS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCEwKSk7Sy5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGthPWVhPT09Y2E/bnVsbDplYTtrYSE9PWNhJiYobnVsbCE9PWNhJiZjYS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCExKSxjYT1rYSxudWxsIT09Y2EmJmNhLmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITApLGthPW51bGw9PT1jYT9udWxsOmNhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwLAp3Ll9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChrYSkpfSkub24oIm1vdXNlbW92ZSBtb3VzZWVudGVyIixmdW5jdGlvbihba2EsWV0pe2NvbnN0IFtFYSx2YV09ZDMubW91c2UodGhpcyk7a2E9QShrYSxZLEVhLHZhLDIwKTtlYSE9PWthJiYobnVsbCE9PWVhJiZlYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGVhPWthLG51bGwhPT1lYT8oZWEuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCEwKSx3Ll9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKGVhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwKSk6dy5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KS5vbigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtudWxsIT09ZWEmJihlYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGVhPW51bGwsdy5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCIqIikuY2xhc3NlZCgidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLCEwKX19LApfY2VsbFNjYWxlKGIsZCl7dmFyIGY9dGhpcy5fY29sRXh0ZW50KGIpO2NvbnN0IGg9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oZikucmFuZ2UoZCk7aWYoIkxJTkVBUiI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1tiXS5zY2FsZSlyZXR1cm4gaDtpZigiTE9HIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXJldHVybiAwPj1mWzBdJiYwPD1mWzFdP2g6ZDMuc2NhbGVMb2coKS5kb21haW4oZikucmFuZ2UoZCk7aWYoIlFVQU5USUxFIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXtjb25zdCBrPShkWzFdLWRbMF0pLzE5O2Y9ZDMucmFuZ2UoMjApLm1hcCh0PT5kWzBdK2sqdCk7cmV0dXJuIGQzLnNjYWxlUXVhbnRpbGUoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAodD0+dGhpcy5fY29sVmFsdWUodCxiKSkpKS5yYW5nZShmKX1pZigiTk9OX05VTUVSSUMiPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbYl0uc2NhbGUpcmV0dXJuIGQzLnNjYWxlUG9pbnQoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAoaz0+CnRoaXMuX2NvbFZhbHVlKGssYikpLnNvcnQoKSkpLnJhbmdlKGQpLnBhZGRpbmcoLjEpO3Rocm93IlVua25vd24gc2NhbGUgZm9yIGNvbHVtbjogIitiKyIuIG9wdGlvbnM6ICIrdGhpcy5vcHRpb25zO30sX2NvbFZhbHVlKGIsZCl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYixkKX0sX21ldHJpY1ZhbHVlKGIsZCl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMubWV0cmljVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYixkKX0sX2NvbEV4dGVudChiKXtyZXR1cm4gdGYuaHBhcmFtcy51dGlscy52aXNpYmxlTnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Iixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheX0sX2Nsb3Nlc3RPclNlbGVjdGVkOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIG51bGwhPT1iP2I6ZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsaGVscFVybDpTdHJpbmcsYnVnUmVwb3J0VXJsOlN0cmluZyxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxfc2VsZWN0ZWRUYWI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyL3RmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyIixoYW5kbGVFdmVudDpmdW5jdGlvbigpe319KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1tYWluL3RmLWhwYXJhbXMtbWFpbi5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLW1haW4iLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyx0cmFja2luZ0lkOlN0cmluZyxoZWxwVXJsOlN0cmluZyxidWdSZXBvcnRVcmw6U3RyaW5nLF9jb25maWd1cmF0aW9uOk9iamVjdCxfc2Vzc2lvbkdyb3VwczpBcnJheSxfdGhyb3R0bGVkU2VuZEV2ZW50VG9HQTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Xy50aHJvdHRsZShmdW5jdGlvbigpe3RoaXMuX2hhbmRsZUdBRXZlbnQoe2RldGFpbDp7aGl0VHlwZToiZXZlbnQiLGV2ZW50Q2F0ZWdvcnk6IlVzZXJJbnRlcmFjdGlvbiIsZXZlbnRMYWJlbDoiRXhwZXJpbWVudDogIit0aGlzLmV4cGVyaW1lbnROYW1lfX0pfSw2RTQse2xlYWRpbmc6ITB9KX19LGxpc3RlbmVyczp7bW91c2Vtb3ZlOiJfc2VuZEV2ZW50VG9HQSIsdGFwOiJfc2VuZEV2ZW50VG9HQSIsImdvb2dsZS1hbmFseXRpY3MtdHJhY2tpbmciOiJfaGFuZGxlR0FFdmVudCJ9LGF0dGFjaGVkKCl7dGhpcy5faGFuZGxlR0FFdmVudCh7ZGV0YWlsOntoaXRUeXBlOiJwYWdldmlldyJ9fSl9LApyZWxvYWQoKXt0aGlzLiRbInF1ZXJ5LXBhbmUiXS5yZWxvYWQoKX0sX3NlbmRFdmVudFRvR0EoKXt0aGlzLl90aHJvdHRsZWRTZW5kRXZlbnRUb0dBKHRoaXMpfSxfaGFuZGxlR0FFdmVudChiKXt0aGlzLiQudHJhY2tlci5oYW5kbGVFdmVudChiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLWJhY2tlbmQvdGYtaHBhcmFtcy1iYWNrZW5kLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtjbGFzcyBme2NvbnN0cnVjdG9yKGgsayx0PSEwKXt0aGlzLl9hcGlVcmw9aDt0aGlzLl9yZXF1ZXN0TWFuYWdlcj1rO3RoaXMuX3VzZUh0dHBHZXQ9dH1nZXRFeHBlcmltZW50KGgpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgiZXhwZXJpbWVudCIsaCl9Z2V0RG93bmxvYWRVcmwoaCxrLHQpe3JldHVybiB0aGlzLl9hcGlVcmwrIi9kb3dubG9hZF9kYXRhPyIrbmV3IFVSTFNlYXJjaFBhcmFtcyh7Zm9ybWF0OmgsY29sdW1uc1Zpc2liaWxpdHk6SlNPTi5zdHJpbmdpZnkodCkscmVxdWVzdDpKU09OLnN0cmluZ2lmeShrKX0pfWxpc3RTZXNzaW9uR3JvdXBzKGgpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgic2Vzc2lvbl9ncm91cHMiLGgpfWxpc3RNZXRyaWNFdmFscyhoKXtyZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3QoIm1ldHJpY19ldmFscyIsaCl9X3NlbmRSZXF1ZXN0KGgsayl7aWYodGhpcy5fdXNlSHR0cEdldClyZXR1cm4gaz1lbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoaykpLAp0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHRoaXMuX2FwaVVybCsiLyIraCsiP3JlcXVlc3RceDNkIitrKTtjb25zdCB0PW5ldyB2Yy5SZXF1ZXN0T3B0aW9uczt0LndpdGhDcmVkZW50aWFscz0hMDt0Lm1ldGhvZFR5cGU9IlBPU1QiO3QuY29udGVudFR5cGU9InRleHQvcGxhaW4iO3QuYm9keT1KU09OLnN0cmluZ2lmeShrKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdFdpdGhPcHRpb25zKHRoaXMuX2FwaVVybCsiLyIraCx0KX19ZC5CYWNrZW5kPWZ9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLWRhc2hib2FyZC90Zi1ocGFyYW1zLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLWRhc2hib2FyZCIscHJvcGVydGllczp7X2JhY2tlbmQ6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdGYuaHBhcmFtcy5CYWNrZW5kKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJocGFyYW1zIiwiIiksbmV3IHZjLlJlcXVlc3RNYW5hZ2VyLCEhKHdpbmRvdy5URU5TT1JCT0FSRF9FTlZ8fHt9KS5JTl9DT0xBQil9fSxyZWxvYWQoKXt0aGlzLiRbImhwYXJhbXMtbWFpbiJdLnJlbG9hZCgpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbXBvcnRzL3RocmVlLmpzCihmdW5jdGlvbihiLGQpeyJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT09dHlwZW9mIG1vZHVsZT9kKGV4cG9ydHMpOiJmdW5jdGlvbiI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImV4cG9ydHMiXSxkKTooYj1ifHxzZWxmLGQoYi5USFJFRT17fSkpfSkodGhpcyxmdW5jdGlvbihiKXtmdW5jdGlvbiBkKCl7fWZ1bmN0aW9uIGYoYSxjKXt0aGlzLng9YXx8MDt0aGlzLnk9Y3x8MH1mdW5jdGlvbiBoKGEsYyxlLGcpe3RoaXMuX3g9YXx8MDt0aGlzLl95PWN8fDA7dGhpcy5fej1lfHwwO3RoaXMuX3c9dm9pZCAwIT09Zz9nOjF9ZnVuY3Rpb24gayhhLGMsZSl7dGhpcy54PWF8fDA7dGhpcy55PWN8fDA7dGhpcy56PWV8fDB9ZnVuY3Rpb24gdCgpe3RoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXTswPGFyZ3VtZW50cy5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9CmZ1bmN0aW9uIGwoYSxjLGUsZyxyLHYseixFLEYsSil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6TmsrK30pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy5pbWFnZT12b2lkIDAhPT1hP2E6bC5ERUZBVUxUX0lNQUdFO3RoaXMubWlwbWFwcz1bXTt0aGlzLm1hcHBpbmc9dm9pZCAwIT09Yz9jOmwuREVGQVVMVF9NQVBQSU5HO3RoaXMud3JhcFM9dm9pZCAwIT09ZT9lOjEwMDE7dGhpcy53cmFwVD12b2lkIDAhPT1nP2c6MTAwMTt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT1yP3I6MTAwNjt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT12P3Y6MTAwODt0aGlzLmFuaXNvdHJvcHk9dm9pZCAwIT09Rj9GOjE7dGhpcy5mb3JtYXQ9dm9pZCAwIT09ej96OjEwMjM7dGhpcy50eXBlPXZvaWQgMCE9PUU/RToxMDA5O3RoaXMub2Zmc2V0PW5ldyBmKDAsMCk7dGhpcy5yZXBlYXQ9bmV3IGYoMSwxKTt0aGlzLmNlbnRlcj1uZXcgZigwLDApOwp0aGlzLnJvdGF0aW9uPTA7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSEwO3RoaXMubWF0cml4PW5ldyB0O3RoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwO3RoaXMucHJlbXVsdGlwbHlBbHBoYT0hMTt0aGlzLmZsaXBZPSEwO3RoaXMudW5wYWNrQWxpZ25tZW50PTQ7dGhpcy5lbmNvZGluZz12b2lkIDAhPT1KP0o6M0UzO3RoaXMudmVyc2lvbj0wO3RoaXMub25VcGRhdGU9bnVsbH1mdW5jdGlvbiBwKGEsYyxlLGcpe3RoaXMueD1hfHwwO3RoaXMueT1jfHwwO3RoaXMuej1lfHwwO3RoaXMudz12b2lkIDAhPT1nP2c6MX1mdW5jdGlvbiBtKGEsYyxlKXt0aGlzLndpZHRoPWE7dGhpcy5oZWlnaHQ9Yzt0aGlzLnNjaXNzb3I9bmV3IHAoMCwwLGEsYyk7dGhpcy5zY2lzc29yVGVzdD0hMTt0aGlzLnZpZXdwb3J0PW5ldyBwKDAsMCxhLGMpO2U9ZXx8e307dGhpcy50ZXh0dXJlPW5ldyBsKHZvaWQgMCx2b2lkIDAsZS53cmFwUyxlLndyYXBULGUubWFnRmlsdGVyLGUubWluRmlsdGVyLGUuZm9ybWF0LGUudHlwZSwKZS5hbmlzb3Ryb3B5LGUuZW5jb2RpbmcpO3RoaXMudGV4dHVyZS5pbWFnZT17fTt0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGg9YTt0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0PWM7dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz12b2lkIDAhPT1lLmdlbmVyYXRlTWlwbWFwcz9lLmdlbmVyYXRlTWlwbWFwczohMTt0aGlzLnRleHR1cmUubWluRmlsdGVyPXZvaWQgMCE9PWUubWluRmlsdGVyP2UubWluRmlsdGVyOjEwMDY7dGhpcy5kZXB0aEJ1ZmZlcj12b2lkIDAhPT1lLmRlcHRoQnVmZmVyP2UuZGVwdGhCdWZmZXI6ITA7dGhpcy5zdGVuY2lsQnVmZmVyPXZvaWQgMCE9PWUuc3RlbmNpbEJ1ZmZlcj9lLnN0ZW5jaWxCdWZmZXI6ITA7dGhpcy5kZXB0aFRleHR1cmU9dm9pZCAwIT09ZS5kZXB0aFRleHR1cmU/ZS5kZXB0aFRleHR1cmU6bnVsbH1mdW5jdGlvbiBuKGEsYyxlKXttLmNhbGwodGhpcyxhLGMsZSk7dGhpcy5zYW1wbGVzPTR9ZnVuY3Rpb24gcSgpe3RoaXMuZWxlbWVudHM9ClsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXTswPGFyZ3VtZW50cy5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9ZnVuY3Rpb24gdShhLGMsZSxnKXt0aGlzLl94PWF8fDA7dGhpcy5feT1jfHwwO3RoaXMuX3o9ZXx8MDt0aGlzLl9vcmRlcj1nfHx1LkRlZmF1bHRPcmRlcn1mdW5jdGlvbiB4KCl7dGhpcy5tYXNrPTF9ZnVuY3Rpb24gQSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOk9rKyt9KTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMudHlwZT0iT2JqZWN0M0QiO3RoaXMucGFyZW50PW51bGw7dGhpcy5jaGlsZHJlbj1bXTt0aGlzLnVwPUEuRGVmYXVsdFVwLmNsb25lKCk7dmFyIGE9bmV3IGssYz1uZXcgdSxlPW5ldyBoLGc9bmV3IGsoMSwxLDEpO2MuX29uQ2hhbmdlKGZ1bmN0aW9uKCl7ZS5zZXRGcm9tRXVsZXIoYywKITEpfSk7ZS5fb25DaGFuZ2UoZnVuY3Rpb24oKXtjLnNldEZyb21RdWF0ZXJuaW9uKGUsdm9pZCAwLCExKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTphfSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y30scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmd9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IHF9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IHR9fSk7dGhpcy5tYXRyaXg9bmV3IHE7dGhpcy5tYXRyaXhXb3JsZD1uZXcgcTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9QS5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZTt0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITE7dGhpcy5sYXllcnM9bmV3IHg7dGhpcy52aXNpYmxlPSEwOwp0aGlzLnJlY2VpdmVTaGFkb3c9dGhpcy5jYXN0U2hhZG93PSExO3RoaXMuZnJ1c3R1bUN1bGxlZD0hMDt0aGlzLnJlbmRlck9yZGVyPTA7dGhpcy51c2VyRGF0YT17fX1mdW5jdGlvbiB5KCl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2NlbmUiO3RoaXMub3ZlcnJpZGVNYXRlcmlhbD10aGlzLmZvZz10aGlzLmJhY2tncm91bmQ9bnVsbDt0aGlzLmF1dG9VcGRhdGU9ITA7InVuZGVmaW5lZCIhPT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1mdW5jdGlvbiB3KGEsYyl7dGhpcy5taW49dm9pZCAwIT09YT9hOm5ldyBrKEluZmluaXR5LEluZmluaXR5LEluZmluaXR5KTt0aGlzLm1heD12b2lkIDAhPT1jP2M6bmV3IGsoLUluZmluaXR5LC1JbmZpbml0eSwtSW5maW5pdHkpfWZ1bmN0aW9uIEMoYSxjLGUsZyxyKXt2YXIgdjt2YXIgej0wO2Zvcih2PWEubGVuZ3RoLQozO3o8PXY7eis9Myl7S2QuZnJvbUFycmF5KGEseik7dmFyIEU9Yy5kb3QoS2QpLEY9ZS5kb3QoS2QpLEo9Zy5kb3QoS2QpO2lmKE1hdGgubWF4KC1NYXRoLm1heChFLEYsSiksTWF0aC5taW4oRSxGLEopKT5yLngqTWF0aC5hYnMoS2QueCkrci55Kk1hdGguYWJzKEtkLnkpK3IueipNYXRoLmFicyhLZC56KSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBHKGEsYyl7dGhpcy5jZW50ZXI9dm9pZCAwIT09YT9hOm5ldyBrO3RoaXMucmFkaXVzPXZvaWQgMCE9PWM/YzowfWZ1bmN0aW9uIEQoYSxjKXt0aGlzLm9yaWdpbj12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5kaXJlY3Rpb249dm9pZCAwIT09Yz9jOm5ldyBrfWZ1bmN0aW9uIEIoYSxjLGUpe3RoaXMuYT12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5iPXZvaWQgMCE9PWM/YzpuZXcgazt0aGlzLmM9dm9pZCAwIT09ZT9lOm5ldyBrfWZ1bmN0aW9uIEkoYSxjLGUpe3JldHVybiB2b2lkIDA9PT1jJiZ2b2lkIDA9PT1lP3RoaXMuc2V0KGEpOgp0aGlzLnNldFJHQihhLGMsZSl9ZnVuY3Rpb24gTihhLGMsZSl7MD5lJiYoZSs9MSk7MTxlJiYtLWU7cmV0dXJuIGU8MS82P2ErNiooYy1hKSplOi41PmU/YzplPDIvMz9hKzYqKGMtYSkqKDIvMy1lKTphfWZ1bmN0aW9uIE8oYSl7cmV0dXJuLjA0MDQ1PmE/LjA3NzM5OTM4MDgqYTpNYXRoLnBvdyguOTQ3ODY3Mjk4NiphKy4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gSChhKXtyZXR1cm4uMDAzMTMwOD5hPzEyLjkyKmE6MS4wNTUqTWF0aC5wb3coYSwuNDE2NjYpLS4wNTV9ZnVuY3Rpb24gSyhhLGMsZSxnLHIsdil7dGhpcy5hPWE7dGhpcy5iPWM7dGhpcy5jPWU7dGhpcy5ub3JtYWw9ZyYmZy5pc1ZlY3RvcjM/ZzpuZXcgazt0aGlzLnZlcnRleE5vcm1hbHM9QXJyYXkuaXNBcnJheShnKT9nOltdO3RoaXMuY29sb3I9ciYmci5pc0NvbG9yP3I6bmV3IEk7dGhpcy52ZXJ0ZXhDb2xvcnM9QXJyYXkuaXNBcnJheShyKT9yOltdO3RoaXMubWF0ZXJpYWxJbmRleD12b2lkIDAhPT12P3Y6MH0KZnVuY3Rpb24gTSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlBrKyt9KTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMudHlwZT0iTWF0ZXJpYWwiO3RoaXMubGlnaHRzPXRoaXMuZm9nPSEwO3RoaXMuYmxlbmRpbmc9MTt0aGlzLnNpZGU9MDt0aGlzLnZlcnRleFRhbmdlbnRzPXRoaXMuZmxhdFNoYWRpbmc9ITE7dGhpcy52ZXJ0ZXhDb2xvcnM9MDt0aGlzLm9wYWNpdHk9MTt0aGlzLnRyYW5zcGFyZW50PSExO3RoaXMuYmxlbmRTcmM9MjA0O3RoaXMuYmxlbmREc3Q9MjA1O3RoaXMuYmxlbmRFcXVhdGlvbj0xMDA7dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmRTcmNBbHBoYT1udWxsO3RoaXMuZGVwdGhGdW5jPTM7dGhpcy5kZXB0aFdyaXRlPXRoaXMuZGVwdGhUZXN0PSEwO3RoaXMuc3RlbmNpbEZ1bmM9NTE5O3RoaXMuc3RlbmNpbFJlZj0wO3RoaXMuc3RlbmNpbE1hc2s9CjI1NTt0aGlzLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxGYWlsPTc2ODA7dGhpcy5zdGVuY2lsV3JpdGU9ITE7dGhpcy5jbGlwcGluZ1BsYW5lcz1udWxsO3RoaXMuY2xpcFNoYWRvd3M9dGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExO3RoaXMuc2hhZG93U2lkZT1udWxsO3RoaXMuY29sb3JXcml0ZT0hMDt0aGlzLnByZWNpc2lvbj1udWxsO3RoaXMucG9seWdvbk9mZnNldD0hMTt0aGlzLnBvbHlnb25PZmZzZXRVbml0cz10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9MDt0aGlzLmRpdGhlcmluZz0hMTt0aGlzLmFscGhhVGVzdD0wO3RoaXMucHJlbXVsdGlwbGllZEFscGhhPSExO3RoaXMudG9uZU1hcHBlZD10aGlzLnZpc2libGU9ITA7dGhpcy51c2VyRGF0YT17fTt0aGlzLm5lZWRzVXBkYXRlPSEwfWZ1bmN0aW9uIEwoYSl7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaEJhc2ljTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEkoMTY3NzcyMTUpO3RoaXMubGlnaHRNYXA9CnRoaXMubWFwPW51bGw7dGhpcy5saWdodE1hcEludGVuc2l0eT0xO3RoaXMuYW9NYXA9bnVsbDt0aGlzLmFvTWFwSW50ZW5zaXR5PTE7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLnNwZWN1bGFyTWFwPW51bGw7dGhpcy5jb21iaW5lPTA7dGhpcy5yZWZsZWN0aXZpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiO3RoaXMubGlnaHRzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gUShhLGMsZSl7aWYoQXJyYXkuaXNBcnJheShhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LiIpO3RoaXMubmFtZT0iIjt0aGlzLmFycmF5PWE7dGhpcy5pdGVtU2l6ZT0KYzt0aGlzLmNvdW50PXZvaWQgMCE9PWE/YS5sZW5ndGgvYzowO3RoaXMubm9ybWFsaXplZD0hMD09PWU7dGhpcy5keW5hbWljPSExO3RoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfTt0aGlzLnZlcnNpb249MH1mdW5jdGlvbiBUKGEsYyxlKXtRLmNhbGwodGhpcyxuZXcgSW50OEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWChhLGMsZSl7US5jYWxsKHRoaXMsbmV3IFVpbnQ4QXJyYXkoYSksYyxlKX1mdW5jdGlvbiBhYShhLGMsZSl7US5jYWxsKHRoaXMsbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gbGEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBJbnQxNkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWihhLGMsZSl7US5jYWxsKHRoaXMsbmV3IFVpbnQxNkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gYmEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBJbnQzMkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gZWEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBVaW50MzJBcnJheShhKSwKYyxlKX1mdW5jdGlvbiBjYShhLGMsZSl7US5jYWxsKHRoaXMsbmV3IEZsb2F0MzJBcnJheShhKSxjLGUpfWZ1bmN0aW9uIGthKGEsYyxlKXtRLmNhbGwodGhpcyxuZXcgRmxvYXQ2NEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWSgpe3RoaXMudmVydGljZXM9W107dGhpcy5ub3JtYWxzPVtdO3RoaXMuY29sb3JzPVtdO3RoaXMudXZzPVtdO3RoaXMudXZzMj1bXTt0aGlzLmdyb3Vwcz1bXTt0aGlzLm1vcnBoVGFyZ2V0cz17fTt0aGlzLnNraW5XZWlnaHRzPVtdO3RoaXMuc2tpbkluZGljZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5ncm91cHNOZWVkVXBkYXRlPXRoaXMudXZzTmVlZFVwZGF0ZT10aGlzLmNvbG9yc05lZWRVcGRhdGU9dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMX1mdW5jdGlvbiBFYShhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuLUluZmluaXR5O2Zvcih2YXIgYz1hWzBdLGU9MSxnPQphLmxlbmd0aDtlPGc7KytlKWFbZV0+YyYmKGM9YVtlXSk7cmV0dXJuIGN9ZnVuY3Rpb24gdmEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpRays9Mn0pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSI7dGhpcy5pbmRleD1udWxsO3RoaXMuYXR0cmlidXRlcz17fTt0aGlzLm1vcnBoQXR0cmlidXRlcz17fTt0aGlzLmdyb3Vwcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLmRyYXdSYW5nZT17c3RhcnQ6MCxjb3VudDpJbmZpbml0eX07dGhpcy51c2VyRGF0YT17fX1mdW5jdGlvbiB4YShhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2giO3RoaXMuZ2VvbWV0cnk9dm9pZCAwIT09YT9hOm5ldyB2YTt0aGlzLm1hdGVyaWFsPXZvaWQgMCE9PWM/YzpuZXcgTCh7Y29sb3I6MTY3NzcyMTUqTWF0aC5yYW5kb20oKX0pO3RoaXMuZHJhd01vZGU9CjA7dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1mdW5jdGlvbiBBYShhLGMsZSxnLHIsdix6LEUpe2lmKG51bGw9PT0oMT09PWMuc2lkZT9nLmludGVyc2VjdFRyaWFuZ2xlKHosdixyLCEwLEUpOmcuaW50ZXJzZWN0VHJpYW5nbGUocix2LHosMiE9PWMuc2lkZSxFKSkpcmV0dXJuIG51bGw7c2cuY29weShFKTtzZy5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCk7Yz1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhzZyk7cmV0dXJuIGM8ZS5uZWFyfHxjPmUuZmFyP251bGw6e2Rpc3RhbmNlOmMscG9pbnQ6c2cuY2xvbmUoKSxvYmplY3Q6YX19ZnVuY3Rpb24gRmEoYSxjLGUsZyxyLHYseixFLEYsSixQKXtMZC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsRik7TWQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLEopO05kLmZyb21CdWZmZXJBdHRyaWJ1dGUocixQKTtyPWEubW9ycGhUYXJnZXRJbmZsdWVuY2VzO2lmKGMubW9ycGhUYXJnZXRzJiZ2JiZyKXtJaC5zZXQoMCwwLDApO0poLnNldCgwLDAsMCk7CktoLnNldCgwLDAsMCk7Zm9yKHZhciBSPTAsUz12Lmxlbmd0aDtSPFM7UisrKXt2YXIgVj1yW1JdLFc9dltSXTswIT09ViYmKCRpLmZyb21CdWZmZXJBdHRyaWJ1dGUoVyxGKSxhai5mcm9tQnVmZmVyQXR0cmlidXRlKFcsSiksYmouZnJvbUJ1ZmZlckF0dHJpYnV0ZShXLFApLEloLmFkZFNjYWxlZFZlY3RvcigkaS5zdWIoTGQpLFYpLEpoLmFkZFNjYWxlZFZlY3Rvcihhai5zdWIoTWQpLFYpLEtoLmFkZFNjYWxlZFZlY3Rvcihiai5zdWIoTmQpLFYpKX1MZC5hZGQoSWgpO01kLmFkZChKaCk7TmQuYWRkKEtoKX1pZihhPUFhKGEsYyxlLGcsTGQsTWQsTmQsc2YpKXomJihvZS5mcm9tQnVmZmVyQXR0cmlidXRlKHosRikscGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh6LEopLHFlLmZyb21CdWZmZXJBdHRyaWJ1dGUoeixQKSxhLnV2PUIuZ2V0VVYoc2YsTGQsTWQsTmQsb2UscGUscWUsbmV3IGYpKSxFJiYob2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLEYpLHBlLmZyb21CdWZmZXJBdHRyaWJ1dGUoRSwKSikscWUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLFApLGEudXYyPUIuZ2V0VVYoc2YsTGQsTWQsTmQsb2UscGUscWUsbmV3IGYpKSx6PW5ldyBLKEYsSixQKSxCLmdldE5vcm1hbChMZCxNZCxOZCx6Lm5vcm1hbCksYS5mYWNlPXo7cmV0dXJuIGF9ZnVuY3Rpb24geWEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpSays9Mn0pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJHZW9tZXRyeSI7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLmNvbG9ycz1bXTt0aGlzLmZhY2VzPVtdO3RoaXMuZmFjZVZlcnRleFV2cz1bW11dO3RoaXMubW9ycGhUYXJnZXRzPVtdO3RoaXMubW9ycGhOb3JtYWxzPVtdO3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmxpbmVEaXN0YW5jZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5ncm91cHNOZWVkVXBkYXRlPXRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGU9CnRoaXMuY29sb3JzTmVlZFVwZGF0ZT10aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudXZzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT10aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZT0hMX1mdW5jdGlvbiBTYShhLGMsZSxnLHIsdil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJveEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOmEsaGVpZ2h0OmMsZGVwdGg6ZSx3aWR0aFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6cixkZXB0aFNlZ21lbnRzOnZ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBYYShhLGMsZSxnLHIsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFhhKGEsYyxlLGcscix2KXtmdW5jdGlvbiB6KFcsaGEsZmEscmEscGEscWEsdWEsb2EsdGEsQmEsVGEpe3ZhciBVYT1xYS90YSxDYT11YS9CYSxIYT1xYS8yLERhPXVhLzIsTWE9b2EvMjt1YT10YSsxO3ZhciBkYj1CYSsxLHRiPXFhPTAsS2EsYmIsamI9bmV3IGs7Zm9yKGJiPQowO2JiPGRiO2JiKyspe3ZhciBFYj1iYipDYS1EYTtmb3IoS2E9MDtLYTx1YTtLYSsrKWpiW1ddPShLYSpVYS1IYSkqcmEsamJbaGFdPUViKnBhLGpiW2ZhXT1NYSxKLnB1c2goamIueCxqYi55LGpiLnopLGpiW1ddPTAsamJbaGFdPTAsamJbZmFdPTA8b2E/MTotMSxQLnB1c2goamIueCxqYi55LGpiLnopLFIucHVzaChLYS90YSksUi5wdXNoKDEtYmIvQmEpLHFhKz0xfWZvcihiYj0wO2JiPEJhO2JiKyspZm9yKEthPTA7S2E8dGE7S2ErKylXPVMrS2ErdWEqKGJiKzEpLGhhPVMrKEthKzEpK3VhKihiYisxKSxmYT1TKyhLYSsxKSt1YSpiYixGLnB1c2goUytLYSt1YSpiYixXLGZhKSxGLnB1c2goVyxoYSxmYSksdGIrPTY7RS5hZGRHcm91cChWLHRiLFRhKTtWKz10YjtTKz1xYX12YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQm94QnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6YyxkZXB0aDplLHdpZHRoU2VnbWVudHM6ZyxoZWlnaHRTZWdtZW50czpyLApkZXB0aFNlZ21lbnRzOnZ9O3ZhciBFPXRoaXM7YT1hfHwxO2M9Y3x8MTtlPWV8fDE7Zz1NYXRoLmZsb29yKGcpfHwxO3I9TWF0aC5mbG9vcihyKXx8MTt2PU1hdGguZmxvb3Iodil8fDE7dmFyIEY9W10sSj1bXSxQPVtdLFI9W10sUz0wLFY9MDt6KCJ6IiwieSIsIngiLC0xLC0xLGUsYyxhLHYsciwwKTt6KCJ6IiwieSIsIngiLDEsLTEsZSxjLC1hLHYsciwxKTt6KCJ4IiwieiIsInkiLDEsMSxhLGUsYyxnLHYsMik7eigieCIsInoiLCJ5IiwxLC0xLGEsZSwtYyxnLHYsMyk7eigieCIsInkiLCJ6IiwxLC0xLGEsYyxlLGcsciw0KTt6KCJ4IiwieSIsInoiLC0xLC0xLGEsYywtZSxnLHIsNSk7dGhpcy5zZXRJbmRleChGKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShKLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoUCwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoUiwyKSl9ZnVuY3Rpb24gdWIoYSl7dmFyIGM9e30sZTtmb3IoZSBpbiBhKXtjW2VdPQp7fTtmb3IodmFyIGcgaW4gYVtlXSl7dmFyIHI9YVtlXVtnXTtjW2VdW2ddPXImJihyLmlzQ29sb3J8fHIuaXNNYXRyaXgzfHxyLmlzTWF0cml4NHx8ci5pc1ZlY3RvcjJ8fHIuaXNWZWN0b3IzfHxyLmlzVmVjdG9yNHx8ci5pc1RleHR1cmUpP3IuY2xvbmUoKTpBcnJheS5pc0FycmF5KHIpP3Iuc2xpY2UoKTpyfX1yZXR1cm4gY31mdW5jdGlvbiBCYihhKXtmb3IodmFyIGM9e30sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz11YihhW2VdKSxyO2ZvcihyIGluIGcpY1tyXT1nW3JdfXJldHVybiBjfWZ1bmN0aW9uIHFiKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYWRlck1hdGVyaWFsIjt0aGlzLmRlZmluZXM9e307dGhpcy51bmlmb3Jtcz17fTt0aGlzLnZlcnRleFNoYWRlcj0idm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59Ijt0aGlzLmZyYWdtZW50U2hhZGVyPQoidm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcbn0iO3RoaXMubGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPXRoaXMuY2xpcHBpbmc9dGhpcy5saWdodHM9dGhpcy5mb2c9ITE7dGhpcy5leHRlbnNpb25zPXtkZXJpdmF0aXZlczohMSxmcmFnRGVwdGg6ITEsZHJhd0J1ZmZlcnM6ITEsc2hhZGVyVGV4dHVyZUxPRDohMX07dGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzPXtjb2xvcjpbMSwxLDFdLHV2OlswLDBdLHV2MjpbMCwwXX07dGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lPXZvaWQgMDt0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMTt2b2lkIDAhPT1hJiYodm9pZCAwIT09YS5hdHRyaWJ1dGVzJiZjb25zb2xlLmVycm9yKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKSwKdGhpcy5zZXRWYWx1ZXMoYSkpfWZ1bmN0aW9uIHpiKCl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2FtZXJhIjt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZT1uZXcgcTt0aGlzLnByb2plY3Rpb25NYXRyaXg9bmV3IHE7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZT1uZXcgcX1mdW5jdGlvbiB2YihhLGMsZSxnKXt6Yi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGVyc3BlY3RpdmVDYW1lcmEiO3RoaXMuZm92PXZvaWQgMCE9PWE/YTo1MDt0aGlzLnpvb209MTt0aGlzLm5lYXI9dm9pZCAwIT09ZT9lOi4xO3RoaXMuZmFyPXZvaWQgMCE9PWc/ZzoyRTM7dGhpcy5mb2N1cz0xMDt0aGlzLmFzcGVjdD12b2lkIDAhPT1jP2M6MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmZpbG1HYXVnZT0zNTt0aGlzLmZpbG1PZmZzZXQ9MDt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBHYihhLGMsZSxnKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDdWJlQ2FtZXJhIjt2YXIgcj1uZXcgdmIoOTAsCjEsYSxjKTtyLnVwLnNldCgwLC0xLDApO3IubG9va0F0KG5ldyBrKDEsMCwwKSk7dGhpcy5hZGQocik7dmFyIHY9bmV3IHZiKDkwLDEsYSxjKTt2LnVwLnNldCgwLC0xLDApO3YubG9va0F0KG5ldyBrKC0xLDAsMCkpO3RoaXMuYWRkKHYpO3ZhciB6PW5ldyB2Yig5MCwxLGEsYyk7ei51cC5zZXQoMCwwLDEpO3oubG9va0F0KG5ldyBrKDAsMSwwKSk7dGhpcy5hZGQoeik7dmFyIEU9bmV3IHZiKDkwLDEsYSxjKTtFLnVwLnNldCgwLDAsLTEpO0UubG9va0F0KG5ldyBrKDAsLTEsMCkpO3RoaXMuYWRkKEUpO3ZhciBGPW5ldyB2Yig5MCwxLGEsYyk7Ri51cC5zZXQoMCwtMSwwKTtGLmxvb2tBdChuZXcgaygwLDAsMSkpO3RoaXMuYWRkKEYpO3ZhciBKPW5ldyB2Yig5MCwxLGEsYyk7Si51cC5zZXQoMCwtMSwwKTtKLmxvb2tBdChuZXcgaygwLDAsLTEpKTt0aGlzLmFkZChKKTtnPWd8fHtmb3JtYXQ6MTAyMixtYWdGaWx0ZXI6MTAwNixtaW5GaWx0ZXI6MTAwNn07dGhpcy5yZW5kZXJUYXJnZXQ9Cm5ldyBOYihlLGUsZyk7dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lPSJDdWJlQ2FtZXJhIjt0aGlzLnVwZGF0ZT1mdW5jdGlvbihQLFIpe251bGw9PT10aGlzLnBhcmVudCYmdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO3ZhciBTPVAuZ2V0UmVuZGVyVGFyZ2V0KCksVj10aGlzLnJlbmRlclRhcmdldCxXPVYudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7Vi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz0hMTtQLnNldFJlbmRlclRhcmdldChWLDApO1AucmVuZGVyKFIscik7UC5zZXRSZW5kZXJUYXJnZXQoViwxKTtQLnJlbmRlcihSLHYpO1Auc2V0UmVuZGVyVGFyZ2V0KFYsMik7UC5yZW5kZXIoUix6KTtQLnNldFJlbmRlclRhcmdldChWLDMpO1AucmVuZGVyKFIsRSk7UC5zZXRSZW5kZXJUYXJnZXQoViw0KTtQLnJlbmRlcihSLEYpO1YudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9VztQLnNldFJlbmRlclRhcmdldChWLDUpO1AucmVuZGVyKFIsSik7UC5zZXRSZW5kZXJUYXJnZXQoUyl9Owp0aGlzLmNsZWFyPWZ1bmN0aW9uKFAsUixTLFYpe2Zvcih2YXIgVz1QLmdldFJlbmRlclRhcmdldCgpLGhhPXRoaXMucmVuZGVyVGFyZ2V0LGZhPTA7Nj5mYTtmYSsrKVAuc2V0UmVuZGVyVGFyZ2V0KGhhLGZhKSxQLmNsZWFyKFIsUyxWKTtQLnNldFJlbmRlclRhcmdldChXKX19ZnVuY3Rpb24gTmIoYSxjLGUpe20uY2FsbCh0aGlzLGEsYyxlKX1mdW5jdGlvbiBBYihhLGMsZSxnLHIsdix6LEUsRixKLFAsUil7bC5jYWxsKHRoaXMsbnVsbCx2LHosRSxGLEosZyxyLFAsUik7dGhpcy5pbWFnZT17ZGF0YTphLHdpZHRoOmMsaGVpZ2h0OmV9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PUY/RjoxMDAzO3RoaXMubWluRmlsdGVyPXZvaWQgMCE9PUo/SjoxMDAzO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITE7dGhpcy51bnBhY2tBbGlnbm1lbnQ9MX1mdW5jdGlvbiBIYihhLGMpe3RoaXMubm9ybWFsPXZvaWQgMCE9PWE/YTpuZXcgaygxLDAsMCk7dGhpcy5jb25zdGFudD12b2lkIDAhPT0KYz9jOjB9ZnVuY3Rpb24gaWMoYSxjLGUsZyxyLHYpe3RoaXMucGxhbmVzPVt2b2lkIDAhPT1hP2E6bmV3IEhiLHZvaWQgMCE9PWM/YzpuZXcgSGIsdm9pZCAwIT09ZT9lOm5ldyBIYix2b2lkIDAhPT1nP2c6bmV3IEhiLHZvaWQgMCE9PXI/cjpuZXcgSGIsdm9pZCAwIT09dj92Om5ldyBIYl19ZnVuY3Rpb24gYmMoKXtmdW5jdGlvbiBhKHIsdil7ITEhPT1lJiYoZyhyLHYpLGMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGEpKX12YXIgYz1udWxsLGU9ITEsZz1udWxsO3JldHVybntzdGFydDpmdW5jdGlvbigpeyEwIT09ZSYmbnVsbCE9PWcmJihjLnJlcXVlc3RBbmltYXRpb25GcmFtZShhKSxlPSEwKX0sc3RvcDpmdW5jdGlvbigpe2U9ITF9LHNldEFuaW1hdGlvbkxvb3A6ZnVuY3Rpb24ocil7Zz1yfSxzZXRDb250ZXh0OmZ1bmN0aW9uKHIpe2M9cn19fWZ1bmN0aW9uIE9kKGEpe2Z1bmN0aW9uIGMocix2KXt2YXIgej1yLmFycmF5LEU9ci5keW5hbWljPzM1MDQ4OjM1MDQ0LEY9YS5jcmVhdGVCdWZmZXIoKTsKYS5iaW5kQnVmZmVyKHYsRik7YS5idWZmZXJEYXRhKHYseixFKTtyLm9uVXBsb2FkQ2FsbGJhY2soKTt2PTUxMjY7eiBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheT92PTUxMjY6eiBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuIik6eiBpbnN0YW5jZW9mIFVpbnQxNkFycmF5P3Y9NTEyMzp6IGluc3RhbmNlb2YgSW50MTZBcnJheT92PTUxMjI6eiBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3Y9NTEyNTp6IGluc3RhbmNlb2YgSW50MzJBcnJheT92PTUxMjQ6eiBpbnN0YW5jZW9mIEludDhBcnJheT92PTUxMjA6eiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJih2PTUxMjEpO3JldHVybntidWZmZXI6Rix0eXBlOnYsYnl0ZXNQZXJFbGVtZW50OnouQllURVNfUEVSX0VMRU1FTlQsdmVyc2lvbjpyLnZlcnNpb259fWZ1bmN0aW9uIGUocix2LHope3ZhciBFPQp2LmFycmF5LEY9di51cGRhdGVSYW5nZTthLmJpbmRCdWZmZXIoeixyKTshMT09PXYuZHluYW1pYz9hLmJ1ZmZlckRhdGEoeixFLDM1MDQ0KTotMT09PUYuY291bnQ/YS5idWZmZXJTdWJEYXRhKHosMCxFKTowPT09Ri5jb3VudD9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWljIFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJhbmdlLmNvdW50IGlzIDAsIGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0aW5nIG1hbnVhbGx5LiIpOihhLmJ1ZmZlclN1YkRhdGEoeixGLm9mZnNldCpFLkJZVEVTX1BFUl9FTEVNRU5ULEUuc3ViYXJyYXkoRi5vZmZzZXQsRi5vZmZzZXQrRi5jb3VudCkpLEYuY291bnQ9LTEpfXZhciBnPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24ocil7ci5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYocj1yLmRhdGEpO3JldHVybiBnLmdldChyKX0sCnJlbW92ZTpmdW5jdGlvbihyKXtyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihyPXIuZGF0YSk7dmFyIHY9Zy5nZXQocik7diYmKGEuZGVsZXRlQnVmZmVyKHYuYnVmZmVyKSxnLmRlbGV0ZShyKSl9LHVwZGF0ZTpmdW5jdGlvbihyLHYpe3IuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKHI9ci5kYXRhKTt2YXIgej1nLmdldChyKTt2b2lkIDA9PT16P2cuc2V0KHIsYyhyLHYpKTp6LnZlcnNpb248ci52ZXJzaW9uJiYoZSh6LmJ1ZmZlcixyLHYpLHoudmVyc2lvbj1yLnZlcnNpb24pfX19ZnVuY3Rpb24gcmQoYSxjLGUsZyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBsYW5lR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6Yyx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IExjKGEsYyxlLGcpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBMYyhhLGMsZSxnKXt2YS5jYWxsKHRoaXMpOwp0aGlzLnR5cGU9IlBsYW5lQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6Yyx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6Z307YT1hfHwxO2M9Y3x8MTt2YXIgcj1hLzIsdj1jLzI7ZT1NYXRoLmZsb29yKGUpfHwxO2c9TWF0aC5mbG9vcihnKXx8MTt2YXIgej1lKzEsRT1nKzEsRj1hL2UsSj1jL2csUD1bXSxSPVtdLFM9W10sVj1bXTtmb3IoYT0wO2E8RTthKyspe3ZhciBXPWEqSi12O2ZvcihjPTA7Yzx6O2MrKylSLnB1c2goYypGLXIsLVcsMCksUy5wdXNoKDAsMCwxKSxWLnB1c2goYy9lKSxWLnB1c2goMS1hL2cpfWZvcihhPTA7YTxnO2ErKylmb3IoYz0wO2M8ZTtjKyspcj1jK3oqKGErMSksdj1jKzEreiooYSsxKSxFPWMrMSt6KmEsUC5wdXNoKGMreiphLHIsRSksUC5wdXNoKHIsdixFKTt0aGlzLnNldEluZGV4KFApO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKFIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLApuZXcgY2EoUywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoViwyKSl9ZnVuY3Rpb24gc2QoYSxjLGUsZyl7ZnVuY3Rpb24gcihSLFMpe2MuYnVmZmVycy5jb2xvci5zZXRDbGVhcihSLnIsUi5nLFIuYixTLGcpfXZhciB2PW5ldyBJKDApLHo9MCxFLEYsSj1udWxsLFA9MDtyZXR1cm57Z2V0Q2xlYXJDb2xvcjpmdW5jdGlvbigpe3JldHVybiB2fSxzZXRDbGVhckNvbG9yOmZ1bmN0aW9uKFIsUyl7di5zZXQoUik7ej12b2lkIDAhPT1TP1M6MTtyKHYseil9LGdldENsZWFyQWxwaGE6ZnVuY3Rpb24oKXtyZXR1cm4gen0sc2V0Q2xlYXJBbHBoYTpmdW5jdGlvbihSKXt6PVI7cih2LHopfSxyZW5kZXI6ZnVuY3Rpb24oUixTLFYsVyl7Uz1TLmJhY2tncm91bmQ7Vj1hLnZyOyhWPVYuZ2V0U2Vzc2lvbiYmVi5nZXRTZXNzaW9uKCkpJiYiYWRkaXRpdmUiPT09Vi5lbnZpcm9ubWVudEJsZW5kTW9kZSYmKFM9bnVsbCk7bnVsbD09PVM/KHIodix6KSxKPW51bGwsUD0wKTpTJiZTLmlzQ29sb3ImJgoocihTLDEpLFc9ITAsSj1udWxsLFA9MCk7KGEuYXV0b0NsZWFyfHxXKSYmYS5jbGVhcihhLmF1dG9DbGVhckNvbG9yLGEuYXV0b0NsZWFyRGVwdGgsYS5hdXRvQ2xlYXJTdGVuY2lsKTtpZihTJiYoUy5pc0N1YmVUZXh0dXJlfHxTLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKSl7dm9pZCAwPT09RiYmKEY9bmV3IHhhKG5ldyBYYSgxLDEsMSksbmV3IHFiKHt0eXBlOiJCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsIix1bmlmb3Jtczp1YihNYy5jdWJlLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6TWMuY3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6TWMuY3ViZS5mcmFnbWVudFNoYWRlcixzaWRlOjEsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEYuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxGLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSgidXYiKSxGLm9uQmVmb3JlUmVuZGVyPWZ1bmN0aW9uKGhhLGZhLHJhKXt0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbihyYS5tYXRyaXhXb3JsZCl9LApPYmplY3QuZGVmaW5lUHJvcGVydHkoRi5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudEN1YmUudmFsdWV9fSksZS51cGRhdGUoRikpO1c9Uy5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT9TLnRleHR1cmU6UztGLm1hdGVyaWFsLnVuaWZvcm1zLnRDdWJlLnZhbHVlPVc7Ri5tYXRlcmlhbC51bmlmb3Jtcy50RmxpcC52YWx1ZT1TLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPzE6LTE7aWYoSiE9PVN8fFAhPT1XLnZlcnNpb24pRi5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxKPVMsUD1XLnZlcnNpb247Ui51bnNoaWZ0KEYsRi5nZW9tZXRyeSxGLm1hdGVyaWFsLDAsMCxudWxsKX1lbHNlIGlmKFMmJlMuaXNUZXh0dXJlKXt2b2lkIDA9PT1FJiYoRT1uZXcgeGEobmV3IExjKDIsMiksbmV3IHFiKHt0eXBlOiJCYWNrZ3JvdW5kTWF0ZXJpYWwiLHVuaWZvcm1zOnViKE1jLmJhY2tncm91bmQudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpNYy5iYWNrZ3JvdW5kLnZlcnRleFNoYWRlciwKZnJhZ21lbnRTaGFkZXI6TWMuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixzaWRlOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEUuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlfX0pLGUudXBkYXRlKEUpKTtFLm1hdGVyaWFsLnVuaWZvcm1zLnQyRC52YWx1ZT1TOyEwPT09Uy5tYXRyaXhBdXRvVXBkYXRlJiZTLnVwZGF0ZU1hdHJpeCgpO0UubWF0ZXJpYWwudW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weShTLm1hdHJpeCk7aWYoSiE9PVN8fFAhPT1TLnZlcnNpb24pRS5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxKPVMsUD1TLnZlcnNpb247Ui51bnNoaWZ0KEUsRS5nZW9tZXRyeSxFLm1hdGVyaWFsLDAsMCxudWxsKX19fX1mdW5jdGlvbiBzYShhLGMsZSxnKXt2YXIgcjt0aGlzLnNldE1vZGU9CmZ1bmN0aW9uKHYpe3I9dn07dGhpcy5yZW5kZXI9ZnVuY3Rpb24odix6KXthLmRyYXdBcnJheXMocix2LHopO2UudXBkYXRlKHoscil9O3RoaXMucmVuZGVySW5zdGFuY2VzPWZ1bmN0aW9uKHYseixFKXtpZihnLmlzV2ViR0wyKXt2YXIgRj1hO3ZhciBKPSJkcmF3QXJyYXlzSW5zdGFuY2VkIn1lbHNlIGlmKEY9Yy5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxKPSJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1GKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4iKTtyZXR1cm59RltKXShyLHosRSx2Lm1heEluc3RhbmNlZENvdW50KTtlLnVwZGF0ZShFLHIsdi5tYXhJbnN0YW5jZWRDb3VudCl9fWZ1bmN0aW9uIE1iKGEsYyxlKXtmdW5jdGlvbiBnKHFhKXtpZigiaGlnaHAiPT09CnFhKXtpZigwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMzLDM2MzM4KS5wcmVjaXNpb24mJjA8YS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzIsMzYzMzgpLnByZWNpc2lvbilyZXR1cm4iaGlnaHAiO3FhPSJtZWRpdW1wIn1yZXR1cm4ibWVkaXVtcCI9PT1xYSYmMDxhLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMywzNjMzNykucHJlY2lzaW9uJiYwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMyLDM2MzM3KS5wcmVjaXNpb24/Im1lZGl1bXAiOiJsb3dwIn12YXIgcix2PSJ1bmRlZmluZWQiIT09dHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQmJmEgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LHo9dm9pZCAwIT09ZS5wcmVjaXNpb24/ZS5wcmVjaXNpb246ImhpZ2hwIixFPWcoeik7RSE9PXomJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6Iix6LCJub3Qgc3VwcG9ydGVkLCB1c2luZyIsRSwiaW5zdGVhZC4iKSwKej1FKTtlPSEwPT09ZS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyO0U9YS5nZXRQYXJhbWV0ZXIoMzQ5MzApO3ZhciBGPWEuZ2V0UGFyYW1ldGVyKDM1NjYwKSxKPWEuZ2V0UGFyYW1ldGVyKDMzNzkpLFA9YS5nZXRQYXJhbWV0ZXIoMzQwNzYpLFI9YS5nZXRQYXJhbWV0ZXIoMzQ5MjEpLFM9YS5nZXRQYXJhbWV0ZXIoMzYzNDcpLFY9YS5nZXRQYXJhbWV0ZXIoMzYzNDgpLFc9YS5nZXRQYXJhbWV0ZXIoMzYzNDkpLGhhPTA8RixmYT12fHwhIWMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdCIpLHJhPWhhJiZmYSxwYT12P2EuZ2V0UGFyYW1ldGVyKDM2MTgzKTowO3JldHVybntpc1dlYkdMMjp2LGdldE1heEFuaXNvdHJvcHk6ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1yKXJldHVybiByO3ZhciBxYT1jLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7cmV0dXJuIHI9bnVsbCE9PXFhP2EuZ2V0UGFyYW1ldGVyKHFhLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCk6MH0sCmdldE1heFByZWNpc2lvbjpnLHByZWNpc2lvbjp6LGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6ZSxtYXhUZXh0dXJlczpFLG1heFZlcnRleFRleHR1cmVzOkYsbWF4VGV4dHVyZVNpemU6SixtYXhDdWJlbWFwU2l6ZTpQLG1heEF0dHJpYnV0ZXM6UixtYXhWZXJ0ZXhVbmlmb3JtczpTLG1heFZhcnlpbmdzOlYsbWF4RnJhZ21lbnRVbmlmb3JtczpXLHZlcnRleFRleHR1cmVzOmhhLGZsb2F0RnJhZ21lbnRUZXh0dXJlczpmYSxmbG9hdFZlcnRleFRleHR1cmVzOnJhLG1heFNhbXBsZXM6cGF9fWZ1bmN0aW9uIHdjKCl7ZnVuY3Rpb24gYSgpe0oudmFsdWUhPT1nJiYoSi52YWx1ZT1nLEoubmVlZHNVcGRhdGU9MDxyKTtlLm51bVBsYW5lcz1yO2UubnVtSW50ZXJzZWN0aW9uPTB9ZnVuY3Rpb24gYyhQLFIsUyxWKXt2YXIgVz1udWxsIT09UD9QLmxlbmd0aDowLGhhPW51bGw7aWYoMCE9PVcpe2hhPUoudmFsdWU7aWYoITAhPT1WfHxudWxsPT09aGEpe1Y9Uys0Klc7Uj1SLm1hdHJpeFdvcmxkSW52ZXJzZTsKRi5nZXROb3JtYWxNYXRyaXgoUik7aWYobnVsbD09PWhhfHxoYS5sZW5ndGg8ViloYT1uZXcgRmxvYXQzMkFycmF5KFYpO2ZvcihWPTA7ViE9PVc7KytWLFMrPTQpRS5jb3B5KFBbVl0pLmFwcGx5TWF0cml4NChSLEYpLEUubm9ybWFsLnRvQXJyYXkoaGEsUyksaGFbUyszXT1FLmNvbnN0YW50fUoudmFsdWU9aGE7Si5uZWVkc1VwZGF0ZT0hMH1lLm51bVBsYW5lcz1XO3JldHVybiBoYX12YXIgZT10aGlzLGc9bnVsbCxyPTAsdj0hMSx6PSExLEU9bmV3IEhiLEY9bmV3IHQsSj17dmFsdWU6bnVsbCxuZWVkc1VwZGF0ZTohMX07dGhpcy51bmlmb3JtPUo7dGhpcy5udW1JbnRlcnNlY3Rpb249dGhpcy5udW1QbGFuZXM9MDt0aGlzLmluaXQ9ZnVuY3Rpb24oUCxSLFMpe3ZhciBWPTAhPT1QLmxlbmd0aHx8Unx8MCE9PXJ8fHY7dj1SO2c9YyhQLFMsMCk7cj1QLmxlbmd0aDtyZXR1cm4gVn07dGhpcy5iZWdpblNoYWRvd3M9ZnVuY3Rpb24oKXt6PSEwO2MobnVsbCl9O3RoaXMuZW5kU2hhZG93cz0KZnVuY3Rpb24oKXt6PSExO2EoKX07dGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihQLFIsUyxWLFcsaGEpe2lmKCF2fHxudWxsPT09UHx8MD09PVAubGVuZ3RofHx6JiYhUyl6P2MobnVsbCk6YSgpO2Vsc2V7Uz16PzA6cjt2YXIgZmE9NCpTLHJhPVcuY2xpcHBpbmdTdGF0ZXx8bnVsbDtKLnZhbHVlPXJhO3JhPWMoUCxWLGZhLGhhKTtmb3IoUD0wO1AhPT1mYTsrK1ApcmFbUF09Z1tQXTtXLmNsaXBwaW5nU3RhdGU9cmE7dGhpcy5udW1JbnRlcnNlY3Rpb249Uj90aGlzLm51bVBsYW5lczowO3RoaXMubnVtUGxhbmVzKz1TfX19ZnVuY3Rpb24gYmQoYSl7dmFyIGM9e307cmV0dXJue2dldDpmdW5jdGlvbihlKXtpZih2b2lkIDAhPT1jW2VdKXJldHVybiBjW2VdO3N3aXRjaChlKXtjYXNlICJXRUJHTF9kZXB0aF90ZXh0dXJlIjp2YXIgZz1hLmdldEV4dGVuc2lvbigiV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHxhLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUiKXx8YS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlIik7CmJyZWFrO2Nhc2UgIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyI6Zz1hLmdldEV4dGVuc2lvbigiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fGEuZ2V0RXh0ZW5zaW9uKCJNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fGEuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7YnJlYWs7Y2FzZSAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiOmc9YS5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGEuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8YS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpO2JyZWFrO2Nhc2UgIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyI6Zz1hLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fAphLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpO2JyZWFrO2RlZmF1bHQ6Zz1hLmdldEV4dGVuc2lvbihlKX1udWxsPT09ZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK2UrIiBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4iKTtyZXR1cm4gY1tlXT1nfX19ZnVuY3Rpb24gdGQoYSxjLGUpe2Z1bmN0aW9uIGcoRSl7dmFyIEY9RS50YXJnZXQ7RT12LmdldChGKTtudWxsIT09RS5pbmRleCYmYy5yZW1vdmUoRS5pbmRleCk7Zm9yKHZhciBKIGluIEUuYXR0cmlidXRlcyljLnJlbW92ZShFLmF0dHJpYnV0ZXNbSl0pO0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZyk7di5kZWxldGUoRik7aWYoSj16LmdldChFKSljLnJlbW92ZShKKSx6LmRlbGV0ZShFKTtlLm1lbW9yeS5nZW9tZXRyaWVzLS19ZnVuY3Rpb24gcihFKXt2YXIgRj1bXSxKPUUuaW5kZXgsUD1FLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbCE9PQpKKXt2YXIgUj1KLmFycmF5O0o9Si52ZXJzaW9uO1A9MDtmb3IodmFyIFM9Ui5sZW5ndGg7UDxTO1ArPTMpe3ZhciBWPVJbUCswXSxXPVJbUCsxXSxoYT1SW1ArMl07Ri5wdXNoKFYsVyxXLGhhLGhhLFYpfX1lbHNlIGZvcihSPVAuYXJyYXksSj1QLnZlcnNpb24sUD0wLFM9Ui5sZW5ndGgvMy0xO1A8UztQKz0zKVY9UCswLFc9UCsxLGhhPVArMixGLnB1c2goVixXLFcsaGEsaGEsVik7Rj1uZXcgKDY1NTM1PEVhKEYpP2VhOlopKEYsMSk7Ri52ZXJzaW9uPUo7Yy51cGRhdGUoRiwzNDk2Myk7KFI9ei5nZXQoRSkpJiZjLnJlbW92ZShSKTt6LnNldChFLEYpfXZhciB2PW5ldyBXZWFrTWFwLHo9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihFLEYpe3ZhciBKPXYuZ2V0KEYpO2lmKEopcmV0dXJuIEo7Ri5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixnKTtGLmlzQnVmZmVyR2VvbWV0cnk/Sj1GOkYuaXNHZW9tZXRyeSYmKHZvaWQgMD09PUYuX2J1ZmZlckdlb21ldHJ5JiYoRi5fYnVmZmVyR2VvbWV0cnk9CihuZXcgdmEpLnNldEZyb21PYmplY3QoRSkpLEo9Ri5fYnVmZmVyR2VvbWV0cnkpO3Yuc2V0KEYsSik7ZS5tZW1vcnkuZ2VvbWV0cmllcysrO3JldHVybiBKfSx1cGRhdGU6ZnVuY3Rpb24oRSl7dmFyIEY9RS5pbmRleCxKPUUuYXR0cmlidXRlcztudWxsIT09RiYmYy51cGRhdGUoRiwzNDk2Myk7Zm9yKHZhciBQIGluIEopYy51cGRhdGUoSltQXSwzNDk2Mik7RT1FLm1vcnBoQXR0cmlidXRlcztmb3IoUCBpbiBFKXtGPUVbUF07Sj0wO2Zvcih2YXIgUj1GLmxlbmd0aDtKPFI7SisrKWMudXBkYXRlKEZbSl0sMzQ5NjIpfX0sZ2V0V2lyZWZyYW1lQXR0cmlidXRlOmZ1bmN0aW9uKEUpe3ZhciBGPXouZ2V0KEUpO2lmKEYpe3ZhciBKPUUuaW5kZXg7bnVsbCE9PUomJkYudmVyc2lvbjxKLnZlcnNpb24mJnIoRSl9ZWxzZSByKEUpO3JldHVybiB6LmdldChFKX19fWZ1bmN0aW9uIHRnKGEsYyxlLGcpe3ZhciByLHYsejt0aGlzLnNldE1vZGU9ZnVuY3Rpb24oRSl7cj1FfTt0aGlzLnNldEluZGV4PQpmdW5jdGlvbihFKXt2PUUudHlwZTt6PUUuYnl0ZXNQZXJFbGVtZW50fTt0aGlzLnJlbmRlcj1mdW5jdGlvbihFLEYpe2EuZHJhd0VsZW1lbnRzKHIsRix2LEUqeik7ZS51cGRhdGUoRixyKX07dGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24oRSxGLEope2lmKGcuaXNXZWJHTDIpe3ZhciBQPWE7dmFyIFI9ImRyYXdFbGVtZW50c0luc3RhbmNlZCJ9ZWxzZSBpZihQPWMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiksUj0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1QKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7cmV0dXJufVBbUl0ocixKLHYsRip6LEUubWF4SW5zdGFuY2VkQ291bnQpO2UudXBkYXRlKEoscixFLm1heEluc3RhbmNlZENvdW50KX19CmZ1bmN0aW9uIFNrKCl7dmFyIGE9e2ZyYW1lOjAsY2FsbHM6MCx0cmlhbmdsZXM6MCxwb2ludHM6MCxsaW5lczowfTtyZXR1cm57bWVtb3J5OntnZW9tZXRyaWVzOjAsdGV4dHVyZXM6MH0scmVuZGVyOmEscHJvZ3JhbXM6bnVsbCxhdXRvUmVzZXQ6ITAscmVzZXQ6ZnVuY3Rpb24oKXthLmZyYW1lKys7YS5jYWxscz0wO2EudHJpYW5nbGVzPTA7YS5wb2ludHM9MDthLmxpbmVzPTB9LHVwZGF0ZTpmdW5jdGlvbihjLGUsZyl7Zz1nfHwxO2EuY2FsbHMrKztzd2l0Y2goZSl7Y2FzZSA0OmEudHJpYW5nbGVzKz1jLzMqZzticmVhaztjYXNlIDU6Y2FzZSA2OmEudHJpYW5nbGVzKz1nKihjLTIpO2JyZWFrO2Nhc2UgMTphLmxpbmVzKz1jLzIqZzticmVhaztjYXNlIDM6YS5saW5lcys9ZyooYy0xKTticmVhaztjYXNlIDI6YS5saW5lcys9ZypjO2JyZWFrO2Nhc2UgMDphLnBvaW50cys9ZypjO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLAplKX19fX1mdW5jdGlvbiBUayhhLGMpe3JldHVybiBNYXRoLmFicyhjWzFdKS1NYXRoLmFicyhhWzFdKX1mdW5jdGlvbiBVayhhKXt2YXIgYz17fSxlPW5ldyBGbG9hdDMyQXJyYXkoOCk7cmV0dXJue3VwZGF0ZTpmdW5jdGlvbihnLHIsdix6KXt2YXIgRT1nLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxGPUUubGVuZ3RoO2c9Y1tyLmlkXTtpZih2b2lkIDA9PT1nKXtnPVtdO2Zvcih2YXIgSj0wO0o8RjtKKyspZ1tKXT1bSiwwXTtjW3IuaWRdPWd9dmFyIFA9di5tb3JwaFRhcmdldHMmJnIubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO3Y9di5tb3JwaE5vcm1hbHMmJnIubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtmb3IoSj0wO0o8RjtKKyspe3ZhciBSPWdbSl07MCE9PVJbMV0mJihQJiZyLnJlbW92ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0opLHYmJnIucmVtb3ZlQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrSikpfWZvcihKPTA7SjxGO0orKylSPWdbSl0sUlswXT1KLFJbMV09RVtKXTtnLnNvcnQoVGspOwpmb3IoSj0wOzg+SjtKKyspe2lmKFI9Z1tKXSlpZihFPVJbMF0sRj1SWzFdKXtQJiZyLmFkZEF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0osUFtFXSk7diYmci5hZGRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIitKLHZbRV0pO2VbSl09Rjtjb250aW51ZX1lW0pdPTB9ei5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGEsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsZSl9fX1mdW5jdGlvbiBWayhhLGMpe3ZhciBlPXt9O3JldHVybnt1cGRhdGU6ZnVuY3Rpb24oZyl7dmFyIHI9Yy5yZW5kZXIuZnJhbWUsdj1nLmdlb21ldHJ5LHo9YS5nZXQoZyx2KTtlW3ouaWRdIT09ciYmKHYuaXNHZW9tZXRyeSYmei51cGRhdGVGcm9tT2JqZWN0KGcpLGEudXBkYXRlKHopLGVbei5pZF09cik7cmV0dXJuIHp9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtlPXt9fX19ZnVuY3Rpb24gY2QoYSxjLGUsZyxyLHYseixFLEYsSil7YT12b2lkIDAhPT1hP2E6W107bC5jYWxsKHRoaXMsYSx2b2lkIDAhPT1jP2M6MzAxLGUsZyxyLHYsCnZvaWQgMCE9PXo/ejoxMDIyLEUsRixKKTt0aGlzLmZsaXBZPSExfWZ1bmN0aW9uIHJlKGEsYyxlLGcpe2wuY2FsbCh0aGlzLG51bGwpO3RoaXMuaW1hZ2U9e2RhdGE6YSx3aWR0aDpjLGhlaWdodDplLGRlcHRoOmd9O3RoaXMubWluRmlsdGVyPXRoaXMubWFnRmlsdGVyPTEwMDM7dGhpcy53cmFwUj0xMDAxO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gc2UoYSxjLGUsZyl7bC5jYWxsKHRoaXMsbnVsbCk7dGhpcy5pbWFnZT17ZGF0YTphLHdpZHRoOmMsaGVpZ2h0OmUsZGVwdGg6Z307dGhpcy5taW5GaWx0ZXI9dGhpcy5tYWdGaWx0ZXI9MTAwMzt0aGlzLndyYXBSPTEwMDE7dGhpcy5mbGlwWT10aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiB0ZShhLGMsZSl7dmFyIGc9YVswXTtpZigwPj1nfHwwPGcpcmV0dXJuIGE7dmFyIHI9YyplLHY9Y2pbcl07dm9pZCAwPT09diYmKHY9bmV3IEZsb2F0MzJBcnJheShyKSxjaltyXT12KTtpZigwIT09Yylmb3IoZy50b0FycmF5KHYsCjApLGc9MSxyPTA7ZyE9PWM7KytnKXIrPWUsYVtnXS50b0FycmF5KHYscik7cmV0dXJuIHZ9ZnVuY3Rpb24gc2MoYSxjKXtpZihhLmxlbmd0aCE9PWMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKylpZihhW2VdIT09Y1tlXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtYyhhLGMpe2Zvcih2YXIgZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKylhW2VdPWNbZV19ZnVuY3Rpb24gZGooYSxjKXt2YXIgZT1laltjXTt2b2lkIDA9PT1lJiYoZT1uZXcgSW50MzJBcnJheShjKSxlaltjXT1lKTtmb3IodmFyIGc9MDtnIT09YzsrK2cpZVtnXT1hLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtyZXR1cm4gZX1mdW5jdGlvbiBXayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7ZVswXSE9PWMmJihhLnVuaWZvcm0xZih0aGlzLmFkZHIsYyksZVswXT1jKX1mdW5jdGlvbiBYayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09CmMueSlhLnVuaWZvcm0yZih0aGlzLmFkZHIsYy54LGMueSksZVswXT1jLngsZVsxXT1jLnl9ZWxzZSBzYyhlLGMpfHwoYS51bmlmb3JtMmZ2KHRoaXMuYWRkcixjKSxtYyhlLGMpKX1mdW5jdGlvbiBZayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09Yy55fHxlWzJdIT09Yy56KWEudW5pZm9ybTNmKHRoaXMuYWRkcixjLngsYy55LGMueiksZVswXT1jLngsZVsxXT1jLnksZVsyXT1jLnp9ZWxzZSBpZih2b2lkIDAhPT1jLnIpe2lmKGVbMF0hPT1jLnJ8fGVbMV0hPT1jLmd8fGVbMl0hPT1jLmIpYS51bmlmb3JtM2YodGhpcy5hZGRyLGMucixjLmcsYy5iKSxlWzBdPWMucixlWzFdPWMuZyxlWzJdPWMuYn1lbHNlIHNjKGUsYyl8fChhLnVuaWZvcm0zZnYodGhpcy5hZGRyLGMpLG1jKGUsYykpfWZ1bmN0aW9uIFprKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTtpZih2b2lkIDAhPT1jLngpe2lmKGVbMF0hPT1jLnh8fGVbMV0hPT1jLnl8fAplWzJdIT09Yy56fHxlWzNdIT09Yy53KWEudW5pZm9ybTRmKHRoaXMuYWRkcixjLngsYy55LGMueixjLncpLGVbMF09Yy54LGVbMV09Yy55LGVbMl09Yy56LGVbM109Yy53fWVsc2Ugc2MoZSxjKXx8KGEudW5pZm9ybTRmdih0aGlzLmFkZHIsYyksbWMoZSxjKSl9ZnVuY3Rpb24gJGsoYSxjKXt2YXIgZT10aGlzLmNhY2hlLGc9Yy5lbGVtZW50czt2b2lkIDA9PT1nP3NjKGUsYyl8fChhLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLGMpLG1jKGUsYykpOnNjKGUsZyl8fChmai5zZXQoZyksYS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxmaiksbWMoZSxnKSl9ZnVuY3Rpb24gYWwoYSxjKXt2YXIgZT10aGlzLmNhY2hlLGc9Yy5lbGVtZW50czt2b2lkIDA9PT1nP3NjKGUsYyl8fChhLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLGMpLG1jKGUsYykpOnNjKGUsZyl8fChnai5zZXQoZyksYS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxnaiksbWMoZSxnKSl9CmZ1bmN0aW9uIGJsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZSxnPWMuZWxlbWVudHM7dm9pZCAwPT09Zz9zYyhlLGMpfHwoYS51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxjKSxtYyhlLGMpKTpzYyhlLGcpfHwoaGouc2V0KGcpLGEudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsaGopLG1jKGUsZykpfWZ1bmN0aW9uIGNsKGEsYyxlKXt2YXIgZz10aGlzLmNhY2hlLHI9ZS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7Z1swXSE9PXImJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsciksZ1swXT1yKTtlLnNhZmVTZXRUZXh0dXJlMkQoY3x8aWoscil9ZnVuY3Rpb24gZGwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUscj1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtnWzBdIT09ciYmKGEudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxnWzBdPXIpO2Uuc2V0VGV4dHVyZTJEQXJyYXkoY3x8ZWwscil9ZnVuY3Rpb24gZmwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUscj1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKZ1swXSE9PXImJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsciksZ1swXT1yKTtlLnNldFRleHR1cmUzRChjfHxnbCxyKX1mdW5jdGlvbiBobChhLGMsZSl7dmFyIGc9dGhpcy5jYWNoZSxyPWUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO2dbMF0hPT1yJiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLHIpLGdbMF09cik7ZS5zYWZlU2V0VGV4dHVyZUN1YmUoY3x8amoscil9ZnVuY3Rpb24gaWwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO2VbMF0hPT1jJiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLGMpLGVbMF09Yyl9ZnVuY3Rpb24gamwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO3NjKGUsYyl8fChhLnVuaWZvcm0yaXYodGhpcy5hZGRyLGMpLG1jKGUsYykpfWZ1bmN0aW9uIGtsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTtzYyhlLGMpfHwoYS51bmlmb3JtM2l2KHRoaXMuYWRkcixjKSxtYyhlLGMpKX1mdW5jdGlvbiBsbChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7c2MoZSxjKXx8KGEudW5pZm9ybTRpdih0aGlzLmFkZHIsCmMpLG1jKGUsYykpfWZ1bmN0aW9uIG1sKGEpe3N3aXRjaChhKXtjYXNlIDUxMjY6cmV0dXJuIFdrO2Nhc2UgMzU2NjQ6cmV0dXJuIFhrO2Nhc2UgMzU2NjU6cmV0dXJuIFlrO2Nhc2UgMzU2NjY6cmV0dXJuIFprO2Nhc2UgMzU2NzQ6cmV0dXJuICRrO2Nhc2UgMzU2NzU6cmV0dXJuIGFsO2Nhc2UgMzU2NzY6cmV0dXJuIGJsO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpyZXR1cm4gY2w7Y2FzZSAzNTY3OTpyZXR1cm4gZmw7Y2FzZSAzNTY4MDpyZXR1cm4gaGw7Y2FzZSAzNjI4OTpyZXR1cm4gZGw7Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIGlsO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gamw7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBrbDtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIGxsfX1mdW5jdGlvbiBubChhLGMpe2EudW5pZm9ybTFmdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gb2woYSxjKXthLnVuaWZvcm0xaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIHBsKGEsCmMpe2EudW5pZm9ybTJpdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gcWwoYSxjKXthLnVuaWZvcm0zaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIHJsKGEsYyl7YS51bmlmb3JtNGl2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBzbChhLGMpe2M9dGUoYyx0aGlzLnNpemUsMik7YS51bmlmb3JtMmZ2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiB0bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsMyk7YS51bmlmb3JtM2Z2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiB1bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsNCk7YS51bmlmb3JtNGZ2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiB2bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsNCk7YS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxjKX1mdW5jdGlvbiB3bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsOSk7YS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxjKX1mdW5jdGlvbiB4bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsMTYpO2EudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsCiExLGMpfWZ1bmN0aW9uIHlsKGEsYyxlKXt2YXIgZz1jLmxlbmd0aCxyPWRqKGUsZyk7YS51bmlmb3JtMWl2KHRoaXMuYWRkcixyKTtmb3IoYT0wO2EhPT1nOysrYSllLnNhZmVTZXRUZXh0dXJlMkQoY1thXXx8aWosclthXSl9ZnVuY3Rpb24gemwoYSxjLGUpe3ZhciBnPWMubGVuZ3RoLHI9ZGooZSxnKTthLnVuaWZvcm0xaXYodGhpcy5hZGRyLHIpO2ZvcihhPTA7YSE9PWc7KythKWUuc2FmZVNldFRleHR1cmVDdWJlKGNbYV18fGpqLHJbYV0pfWZ1bmN0aW9uIEFsKGEpe3N3aXRjaChhKXtjYXNlIDUxMjY6cmV0dXJuIG5sO2Nhc2UgMzU2NjQ6cmV0dXJuIHNsO2Nhc2UgMzU2NjU6cmV0dXJuIHRsO2Nhc2UgMzU2NjY6cmV0dXJuIHVsO2Nhc2UgMzU2NzQ6cmV0dXJuIHZsO2Nhc2UgMzU2NzU6cmV0dXJuIHdsO2Nhc2UgMzU2NzY6cmV0dXJuIHhsO2Nhc2UgMzU2Nzg6cmV0dXJuIHlsO2Nhc2UgMzU2ODA6cmV0dXJuIHpsO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBvbDtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIHBsOwpjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIHFsO2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gcmx9fWZ1bmN0aW9uIEJsKGEsYyxlKXt0aGlzLmlkPWE7dGhpcy5hZGRyPWU7dGhpcy5jYWNoZT1bXTt0aGlzLnNldFZhbHVlPW1sKGMudHlwZSl9ZnVuY3Rpb24ga2ooYSxjLGUpe3RoaXMuaWQ9YTt0aGlzLmFkZHI9ZTt0aGlzLmNhY2hlPVtdO3RoaXMuc2l6ZT1jLnNpemU7dGhpcy5zZXRWYWx1ZT1BbChjLnR5cGUpfWZ1bmN0aW9uIGxqKGEpe3RoaXMuaWQ9YTt0aGlzLnNlcT1bXTt0aGlzLm1hcD17fX1mdW5jdGlvbiBtaihhLGMpe2Euc2VxLnB1c2goYyk7YS5tYXBbYy5pZF09Y31mdW5jdGlvbiBDbChhLGMsZSl7dmFyIGc9YS5uYW1lLHI9Zy5sZW5ndGg7Zm9yKExoLmxhc3RJbmRleD0wOzspe3ZhciB2PUxoLmV4ZWMoZyksej1MaC5sYXN0SW5kZXgsRT12WzFdLEY9dlszXTsiXSI9PT12WzJdJiYoRXw9MCk7aWYodm9pZCAwPT09Rnx8IlsiPT09RiYmeisyPT09cil7bWooZSwKdm9pZCAwPT09Rj9uZXcgQmwoRSxhLGMpOm5ldyBraihFLGEsYykpO2JyZWFrfWVsc2Ugdj1lLm1hcFtFXSx2b2lkIDA9PT12JiYodj1uZXcgbGooRSksbWooZSx2KSksZT12fX1mdW5jdGlvbiB1ZChhLGMpe3RoaXMuc2VxPVtdO3RoaXMubWFwPXt9O2Zvcih2YXIgZT1hLmdldFByb2dyYW1QYXJhbWV0ZXIoYywzNTcxOCksZz0wO2c8ZTsrK2cpe3ZhciByPWEuZ2V0QWN0aXZlVW5pZm9ybShjLGcpO0NsKHIsYS5nZXRVbmlmb3JtTG9jYXRpb24oYyxyLm5hbWUpLHRoaXMpfX1mdW5jdGlvbiBuaihhLGMsZSl7Yz1hLmNyZWF0ZVNoYWRlcihjKTthLnNoYWRlclNvdXJjZShjLGUpO2EuY29tcGlsZVNoYWRlcihjKTtyZXR1cm4gY31mdW5jdGlvbiBEbChhKXthPWEuc3BsaXQoIlxuIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYVtjXT1jKzErIjogIithW2NdO3JldHVybiBhLmpvaW4oIlxuIil9ZnVuY3Rpb24gb2ooYSl7c3dpdGNoKGEpe2Nhc2UgM0UzOnJldHVyblsiTGluZWFyIiwKIiggdmFsdWUgKSJdO2Nhc2UgMzAwMTpyZXR1cm5bInNSR0IiLCIoIHZhbHVlICkiXTtjYXNlIDMwMDI6cmV0dXJuWyJSR0JFIiwiKCB2YWx1ZSApIl07Y2FzZSAzMDA0OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDcuMCApIl07Y2FzZSAzMDA1OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDE2LjAgKSJdO2Nhc2UgMzAwNjpyZXR1cm5bIlJHQkQiLCIoIHZhbHVlLCAyNTYuMCApIl07Y2FzZSAzMDA3OnJldHVyblsiR2FtbWEiLCIoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSJdO2Nhc2UgMzAwMzpyZXR1cm5bIkxvZ0x1diIsIiggdmFsdWUgKSJdO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIGVuY29kaW5nOiAiK2EpO319ZnVuY3Rpb24gcGooYSxjLGUpe3ZhciBnPWEuZ2V0U2hhZGVyUGFyYW1ldGVyKGMsMzU3MTMpLHI9YS5nZXRTaGFkZXJJbmZvTG9nKGMpLnRyaW0oKTtyZXR1cm4gZyYmIiI9PT1yPyIiOiJUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpICIrCmUrIlxuIityK0RsKGEuZ2V0U2hhZGVyU291cmNlKGMpKX1mdW5jdGlvbiB1ZyhhLGMpe2M9b2ooYyk7cmV0dXJuInZlYzQgIithKyIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiAiK2NbMF0rIlRvTGluZWFyIitjWzFdKyI7IH0ifWZ1bmN0aW9uIEVsKGEsYyl7Yz1vaihjKTtyZXR1cm4idmVjNCAiK2ErIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvIitjWzBdK2NbMV0rIjsgfSJ9ZnVuY3Rpb24gRmwoYSxjKXtzd2l0Y2goYyl7Y2FzZSAxOmM9IkxpbmVhciI7YnJlYWs7Y2FzZSAyOmM9IlJlaW5oYXJkIjticmVhaztjYXNlIDM6Yz0iVW5jaGFydGVkMiI7YnJlYWs7Y2FzZSA0OmM9Ik9wdGltaXplZENpbmVvbiI7YnJlYWs7Y2FzZSA1OmM9IkFDRVNGaWxtaWMiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiAiK2MpO31yZXR1cm4idmVjMyAiK2ErIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrYysiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifQpmdW5jdGlvbiBHbChhLGMsZSl7YT1hfHx7fTtyZXR1cm5bYS5kZXJpdmF0aXZlc3x8Yy5lbnZNYXBDdWJlVVZ8fGMuYnVtcE1hcHx8Yy50YW5nZW50U3BhY2VOb3JtYWxNYXB8fGMuY2xlYXJjb2F0Tm9ybWFsTWFwfHxjLmZsYXRTaGFkaW5nPyIjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZSI6IiIsKGEuZnJhZ0RlcHRofHxjLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpJiZlLmdldCgiRVhUX2ZyYWdfZGVwdGgiKT8iI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZSI6IiIsYS5kcmF3QnVmZmVycyYmZS5nZXQoIldFQkdMX2RyYXdfYnVmZmVycyIpPyIjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlIjoiIiwoYS5zaGFkZXJUZXh0dXJlTE9EfHxjLmVudk1hcCkmJmUuZ2V0KCJFWFRfc2hhZGVyX3RleHR1cmVfbG9kIik/IiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZSI6IiJdLmZpbHRlcih1Zikuam9pbigiXG4iKX0KZnVuY3Rpb24gSGwoYSl7dmFyIGM9W10sZTtmb3IoZSBpbiBhKXt2YXIgZz1hW2VdOyExIT09ZyYmYy5wdXNoKCIjZGVmaW5lICIrZSsiICIrZyl9cmV0dXJuIGMuam9pbigiXG4iKX1mdW5jdGlvbiBJbChhLGMpe2Zvcih2YXIgZT17fSxnPWEuZ2V0UHJvZ3JhbVBhcmFtZXRlcihjLDM1NzIxKSxyPTA7cjxnO3IrKyl7dmFyIHY9YS5nZXRBY3RpdmVBdHRyaWIoYyxyKS5uYW1lO2Vbdl09YS5nZXRBdHRyaWJMb2NhdGlvbihjLHYpfXJldHVybiBlfWZ1bmN0aW9uIHVmKGEpe3JldHVybiIiIT09YX1mdW5jdGlvbiBxaihhLGMpe3JldHVybiBhLnJlcGxhY2UoL05VTV9ESVJfTElHSFRTL2csYy5udW1EaXJMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUUy9nLGMubnVtU3BvdExpZ2h0cykucmVwbGFjZSgvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZyxjLm51bVJlY3RBcmVhTGlnaHRzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRTL2csYy5udW1Qb2ludExpZ2h0cykucmVwbGFjZSgvTlVNX0hFTUlfTElHSFRTL2csCmMubnVtSGVtaUxpZ2h0cykucmVwbGFjZSgvTlVNX0RJUl9MSUdIVF9TSEFET1dTL2csYy5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZyxjLm51bVNwb3RMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVF9TSEFET1dTL2csYy5udW1Qb2ludExpZ2h0U2hhZG93cyl9ZnVuY3Rpb24gcmooYSxjKXtyZXR1cm4gYS5yZXBsYWNlKC9OVU1fQ0xJUFBJTkdfUExBTkVTL2csYy5udW1DbGlwcGluZ1BsYW5lcykucmVwbGFjZSgvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csYy5udW1DbGlwcGluZ1BsYW5lcy1jLm51bUNsaXBJbnRlcnNlY3Rpb24pfWZ1bmN0aW9uIE1oKGEpe3JldHVybiBhLnJlcGxhY2UoL15bIFx0XSojaW5jbHVkZSArPChbXHdcZC4vXSspPi9nbSxmdW5jdGlvbihjLGUpe2M9cmJbZV07aWYodm9pZCAwPT09Yyl0aHJvdyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIFx4M2MiK2UrIlx4M2UiKTtyZXR1cm4gTWgoYyl9KX0KZnVuY3Rpb24gc2ooYSl7cmV0dXJuIGEucmVwbGFjZSgvI3ByYWdtYSB1bnJvbGxfbG9vcFtcc10rP2ZvciBcKCBpbnQgaSA9IChcZCspOyBpIDwgKFxkKyk7IGkgXCtcKyBcKSBceyhbXHNcU10rPykoPz1cfSlcfS9nLGZ1bmN0aW9uKGMsZSxnLHIpe2M9IiI7Zm9yKGU9cGFyc2VJbnQoZSk7ZTxwYXJzZUludChnKTtlKyspYys9ci5yZXBsYWNlKC9cWyBpIFxdL2csIlsgIitlKyIgXSIpLnJlcGxhY2UoL1VOUk9MTEVEX0xPT1BfSU5ERVgvZyxlKTtyZXR1cm4gY30pfWZ1bmN0aW9uIEpsKGEsYyxlLGcscix2LHope3ZhciBFPWEuZ2V0Q29udGV4dCgpLEY9Zy5kZWZpbmVzLEo9ci52ZXJ0ZXhTaGFkZXIsUD1yLmZyYWdtZW50U2hhZGVyLFI9IlNIQURPV01BUF9UWVBFX0JBU0lDIjsxPT09di5zaGFkb3dNYXBUeXBlP1I9IlNIQURPV01BUF9UWVBFX1BDRiI6Mj09PXYuc2hhZG93TWFwVHlwZT9SPSJTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCI6Mz09PXYuc2hhZG93TWFwVHlwZSYmKFI9CiJTSEFET1dNQVBfVFlQRV9WU00iKTt2YXIgUz0iRU5WTUFQX1RZUEVfQ1VCRSIsVj0iRU5WTUFQX01PREVfUkVGTEVDVElPTiIsVz0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjtpZih2LmVudk1hcCl7c3dpdGNoKGcuZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAxOmNhc2UgMzAyOlM9IkVOVk1BUF9UWVBFX0NVQkUiO2JyZWFrO2Nhc2UgMzA2OmNhc2UgMzA3OlM9IkVOVk1BUF9UWVBFX0NVQkVfVVYiO2JyZWFrO2Nhc2UgMzAzOmNhc2UgMzA0OlM9IkVOVk1BUF9UWVBFX0VRVUlSRUMiO2JyZWFrO2Nhc2UgMzA1OlM9IkVOVk1BUF9UWVBFX1NQSEVSRSJ9c3dpdGNoKGcuZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAyOmNhc2UgMzA0OlY9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04ifXN3aXRjaChnLmNvbWJpbmUpe2Nhc2UgMDpXPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgMTpXPSJFTlZNQVBfQkxFTkRJTkdfTUlYIjticmVhaztjYXNlIDI6Vz0iRU5WTUFQX0JMRU5ESU5HX0FERCJ9fXZhciBoYT0KMDxhLmdhbW1hRmFjdG9yP2EuZ2FtbWFGYWN0b3I6MSxmYT16LmlzV2ViR0wyPyIiOkdsKGcuZXh0ZW5zaW9ucyx2LGMpLHJhPUhsKEYpLHBhPUUuY3JlYXRlUHJvZ3JhbSgpO2cuaXNSYXdTaGFkZXJNYXRlcmlhbD8oRj1bcmFdLmZpbHRlcih1Zikuam9pbigiXG4iKSwwPEYubGVuZ3RoJiYoRis9IlxuIiksYz1bZmEscmFdLmZpbHRlcih1Zikuam9pbigiXG4iKSwwPGMubGVuZ3RoJiYoYys9IlxuIikpOihGPVsicHJlY2lzaW9uICIrdi5wcmVjaXNpb24rIiBmbG9hdDsiLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGludDsiLCJoaWdocCI9PT12LnByZWNpc2lvbj8iI2RlZmluZSBISUdIX1BSRUNJU0lPTiI6IiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIityLm5hbWUscmEsdi5zdXBwb3J0c1ZlcnRleFRleHR1cmVzPyIjZGVmaW5lIFZFUlRFWF9URVhUVVJFUyI6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIraGEsIiNkZWZpbmUgTUFYX0JPTkVTICIrdi5tYXhCb25lcyx2LnVzZUZvZyYmCnYuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHYudXNlRm9nJiZ2LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHYubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrVjoiIix2LmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsdi5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLHYuZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIix2LmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHYubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdi5ub3JtYWxNYXAmJnYudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHYuY2xlYXJjb2F0Tm9ybWFsTWFwPwoiI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsdi5kaXNwbGFjZW1lbnRNYXAmJnYuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIix2LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHYudmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLHYudmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsdi52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIix2LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix2LnNraW5uaW5nPyIjZGVmaW5lIFVTRV9TS0lOTklORyI6IiIsdi51c2VWZXJ0ZXhUZXh0dXJlPyIjZGVmaW5lIEJPTkVfVEVYVFVSRSI6CiIiLHYubW9ycGhUYXJnZXRzPyIjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMiOiIiLHYubW9ycGhOb3JtYWxzJiYhMT09PXYuZmxhdFNoYWRpbmc/IiNkZWZpbmUgVVNFX01PUlBITk9STUFMUyI6IiIsdi5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLHYuZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIix2LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitSOiIiLHYuc2l6ZUF0dGVudWF0aW9uPyIjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04iOiIiLHYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOiIiLHYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmKHouaXNXZWJHTDJ8fGMuZ2V0KCJFWFRfZnJhZ19kZXB0aCIpKT8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OyIsInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwKInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OyIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLCJhdHRyaWJ1dGUgdmVjMiB1djsiLCIjaWZkZWYgVVNFX1RBTkdFTlQiLCJcdGF0dHJpYnV0ZSB2ZWM0IHRhbmdlbnQ7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9DT0xPUiIsIlx0YXR0cmlidXRlIHZlYzMgY29sb3I7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MjsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsiLCJcdCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTIiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsiLAoiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7IiwiXHQjZWxzZSIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7IiwiXHQjZW5kaWYiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1NLSU5OSU5HIiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OyIsIiNlbmRpZiIsIlxuIl0uZmlsdGVyKHVmKS5qb2luKCJcbiIpLGM9W2ZhLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGZsb2F0OyIsInByZWNpc2lvbiAiK3YucHJlY2lzaW9uKyIgaW50OyIsImhpZ2hwIj09PXYucHJlY2lzaW9uPyIjZGVmaW5lIEhJR0hfUFJFQ0lTSU9OIjoKIiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIityLm5hbWUscmEsdi5hbHBoYVRlc3Q/IiNkZWZpbmUgQUxQSEFURVNUICIrdi5hbHBoYVRlc3QrKHYuYWxwaGFUZXN0JTE/IiI6Ii4wIik6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIraGEsdi51c2VGb2cmJnYuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHYudXNlRm9nJiZ2LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHYubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHYubWF0Y2FwPyIjZGVmaW5lIFVTRV9NQVRDQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrUzoiIix2LmVudk1hcD8iI2RlZmluZSAiK1Y6IiIsdi5lbnZNYXA/IiNkZWZpbmUgIitXOiIiLHYubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIix2LmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsdi5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLHYuYnVtcE1hcD8KIiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHYubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdi5ub3JtYWxNYXAmJnYudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHYuY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIix2LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHYuc2hlZW4/IiNkZWZpbmUgVVNFX1NIRUVOIjoiIix2LnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoKIiIsdi52ZXJ0ZXhDb2xvcnM/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIix2LnZlcnRleFV2cz8iI2RlZmluZSBVU0VfVVYiOiIiLHYuZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIix2LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix2LmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsdi5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsdi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK1I6IiIsdi5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsdi5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz8iI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJgooei5pc1dlYkdMMnx8Yy5nZXQoIkVYVF9mcmFnX2RlcHRoIikpPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLChnLmV4dGVuc2lvbnMmJmcuZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EfHx2LmVudk1hcCkmJih6LmlzV2ViR0wyfHxjLmdldCgiRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCIpKT8iI2RlZmluZSBURVhUVVJFX0xPRF9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwwIT09di50b25lTWFwcGluZz8iI2RlZmluZSBUT05FX01BUFBJTkciOiIiLDAhPT12LnRvbmVNYXBwaW5nP3JiLnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiIsMCE9PXYudG9uZU1hcHBpbmc/RmwoInRvbmVNYXBwaW5nIix2LnRvbmVNYXBwaW5nKToiIix2LmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHYub3V0cHV0RW5jb2Rpbmd8fHYubWFwRW5jb2Rpbmd8fHYubWF0Y2FwRW5jb2Rpbmd8fHYuZW52TWFwRW5jb2Rpbmd8fAp2LmVtaXNzaXZlTWFwRW5jb2Rpbmc/cmIuZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IiIsdi5tYXBFbmNvZGluZz91ZygibWFwVGV4ZWxUb0xpbmVhciIsdi5tYXBFbmNvZGluZyk6IiIsdi5tYXRjYXBFbmNvZGluZz91ZygibWF0Y2FwVGV4ZWxUb0xpbmVhciIsdi5tYXRjYXBFbmNvZGluZyk6IiIsdi5lbnZNYXBFbmNvZGluZz91ZygiZW52TWFwVGV4ZWxUb0xpbmVhciIsdi5lbnZNYXBFbmNvZGluZyk6IiIsdi5lbWlzc2l2ZU1hcEVuY29kaW5nP3VnKCJlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIiLHYuZW1pc3NpdmVNYXBFbmNvZGluZyk6IiIsdi5vdXRwdXRFbmNvZGluZz9FbCgibGluZWFyVG9PdXRwdXRUZXhlbCIsdi5vdXRwdXRFbmNvZGluZyk6IiIsdi5kZXB0aFBhY2tpbmc/IiNkZWZpbmUgREVQVEhfUEFDS0lORyAiK2cuZGVwdGhQYWNraW5nOiIiLCJcbiJdLmZpbHRlcih1Zikuam9pbigiXG4iKSk7Sj1NaChKKTtKPXFqKEosdik7Sj1yaihKLHYpO1A9TWgoUCk7UD1xaihQLAp2KTtQPXJqKFAsdik7Sj1zaihKKTtQPXNqKFApO3ouaXNXZWJHTDImJiFnLmlzUmF3U2hhZGVyTWF0ZXJpYWwmJih6PSExLFI9L15ccyojdmVyc2lvblxzKzMwMFxzK2VzXHMqXG4vLGcuaXNTaGFkZXJNYXRlcmlhbCYmbnVsbCE9PUoubWF0Y2goUikmJm51bGwhPT1QLm1hdGNoKFIpJiYoej0hMCxKPUoucmVwbGFjZShSLCIiKSxQPVAucmVwbGFjZShSLCIiKSksRj0iI3ZlcnNpb24gMzAwIGVzXG5cbiNkZWZpbmUgYXR0cmlidXRlIGluXG4jZGVmaW5lIHZhcnlpbmcgb3V0XG4jZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlXG4iK0YsYz1bIiN2ZXJzaW9uIDMwMCBlc1xuXG4jZGVmaW5lIHZhcnlpbmcgaW4iLHo/IiI6Im91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLHo/IiI6IiNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvciIsIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aFxuI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZVxuI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlXG4jZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2pcbiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2RcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZFxuI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kXG4jZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWRcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkXG4jZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCJdLmpvaW4oIlxuIikrCiJcbiIrYyk7UD1jK1A7Sj1uaihFLDM1NjMzLEYrSik7UD1uaihFLDM1NjMyLFApO0UuYXR0YWNoU2hhZGVyKHBhLEopO0UuYXR0YWNoU2hhZGVyKHBhLFApO3ZvaWQgMCE9PWcuaW5kZXgwQXR0cmlidXRlTmFtZT9FLmJpbmRBdHRyaWJMb2NhdGlvbihwYSwwLGcuaW5kZXgwQXR0cmlidXRlTmFtZSk6ITA9PT12Lm1vcnBoVGFyZ2V0cyYmRS5iaW5kQXR0cmliTG9jYXRpb24ocGEsMCwicG9zaXRpb24iKTtFLmxpbmtQcm9ncmFtKHBhKTtpZihhLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKXthPUUuZ2V0UHJvZ3JhbUluZm9Mb2cocGEpLnRyaW0oKTt2PUUuZ2V0U2hhZGVySW5mb0xvZyhKKS50cmltKCk7ej1FLmdldFNoYWRlckluZm9Mb2coUCkudHJpbSgpO1M9Uj0hMDtpZighMT09PUUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwYSwzNTcxNCkpUj0hMSxWPXBqKEUsSiwidmVydGV4IiksVz1waihFLFAsImZyYWdtZW50IiksY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICIsCkUuZ2V0RXJyb3IoKSwiMzU3MTUiLEUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwYSwzNTcxNSksImdsLmdldFByb2dyYW1JbmZvTG9nIixhLFYsVyk7ZWxzZSBpZigiIiE9PWEpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCkiLGEpO2Vsc2UgaWYoIiI9PT12fHwiIj09PXopUz0hMTtTJiYodGhpcy5kaWFnbm9zdGljcz17cnVubmFibGU6UixtYXRlcmlhbDpnLHByb2dyYW1Mb2c6YSx2ZXJ0ZXhTaGFkZXI6e2xvZzp2LHByZWZpeDpGfSxmcmFnbWVudFNoYWRlcjp7bG9nOnoscHJlZml4OmN9fSl9RS5kZWxldGVTaGFkZXIoSik7RS5kZWxldGVTaGFkZXIoUCk7dmFyIHFhO3RoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXt2b2lkIDA9PT1xYSYmKHFhPW5ldyB1ZChFLHBhKSk7cmV0dXJuIHFhfTt2YXIgdWE7dGhpcy5nZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7dm9pZCAwPT09dWEmJih1YT1JbChFLHBhKSk7cmV0dXJuIHVhfTt0aGlzLmRlc3Ryb3k9CmZ1bmN0aW9uKCl7RS5kZWxldGVQcm9ncmFtKHBhKTt0aGlzLnByb2dyYW09dm9pZCAwfTt0aGlzLm5hbWU9ci5uYW1lO3RoaXMuaWQ9S2wrKzt0aGlzLmNvZGU9ZTt0aGlzLnVzZWRUaW1lcz0xO3RoaXMucHJvZ3JhbT1wYTt0aGlzLnZlcnRleFNoYWRlcj1KO3RoaXMuZnJhZ21lbnRTaGFkZXI9UDtyZXR1cm4gdGhpc31mdW5jdGlvbiBMbChhLGMsZSl7ZnVuY3Rpb24gZyhGKXtGPUYuc2tlbGV0b24uYm9uZXM7aWYoZS5mbG9hdFZlcnRleFRleHR1cmVzKXJldHVybiAxMDI0O3ZhciBKPU1hdGgubWluKE1hdGguZmxvb3IoKGUubWF4VmVydGV4VW5pZm9ybXMtMjApLzQpLEYubGVuZ3RoKTtyZXR1cm4gSjxGLmxlbmd0aD8oY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2VsZXRvbiBoYXMgIitGLmxlbmd0aCsiIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAiK0orIi4iKSwwKTpKfWZ1bmN0aW9uIHIoRixKKXtpZihGKUYuaXNUZXh0dXJlP1A9Ri5lbmNvZGluZzpGLmlzV2ViR0xSZW5kZXJUYXJnZXQmJgooY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksUD1GLnRleHR1cmUuZW5jb2RpbmcpO2Vsc2UgdmFyIFA9M0UzOzNFMz09PVAmJkomJihQPTMwMDcpO3JldHVybiBQfXZhciB2PVtdLHo9e01lc2hEZXB0aE1hdGVyaWFsOiJkZXB0aCIsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ImRpc3RhbmNlUkdCQSIsTWVzaE5vcm1hbE1hdGVyaWFsOiJub3JtYWwiLE1lc2hCYXNpY01hdGVyaWFsOiJiYXNpYyIsTWVzaExhbWJlcnRNYXRlcmlhbDoibGFtYmVydCIsTWVzaFBob25nTWF0ZXJpYWw6InBob25nIixNZXNoVG9vbk1hdGVyaWFsOiJwaG9uZyIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIiwKTGluZUJhc2ljTWF0ZXJpYWw6ImJhc2ljIixMaW5lRGFzaGVkTWF0ZXJpYWw6ImRhc2hlZCIsUG9pbnRzTWF0ZXJpYWw6InBvaW50cyIsU2hhZG93TWF0ZXJpYWw6InNoYWRvdyIsU3ByaXRlTWF0ZXJpYWw6InNwcml0ZSJ9LEU9InByZWNpc2lvbiBzdXBwb3J0c1ZlcnRleFRleHR1cmVzIG1hcCBtYXBFbmNvZGluZyBtYXRjYXAgbWF0Y2FwRW5jb2RpbmcgZW52TWFwIGVudk1hcE1vZGUgZW52TWFwRW5jb2RpbmcgbGlnaHRNYXAgYW9NYXAgZW1pc3NpdmVNYXAgZW1pc3NpdmVNYXBFbmNvZGluZyBidW1wTWFwIG5vcm1hbE1hcCBvYmplY3RTcGFjZU5vcm1hbE1hcCB0YW5nZW50U3BhY2VOb3JtYWxNYXAgY2xlYXJjb2F0Tm9ybWFsTWFwIGRpc3BsYWNlbWVudE1hcCBzcGVjdWxhck1hcCByb3VnaG5lc3NNYXAgbWV0YWxuZXNzTWFwIGdyYWRpZW50TWFwIGFscGhhTWFwIGNvbWJpbmUgdmVydGV4Q29sb3JzIHZlcnRleFRhbmdlbnRzIGZvZyB1c2VGb2cgZm9nRXhwMiBmbGF0U2hhZGluZyBzaXplQXR0ZW51YXRpb24gbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciBza2lubmluZyBtYXhCb25lcyB1c2VWZXJ0ZXhUZXh0dXJlIG1vcnBoVGFyZ2V0cyBtb3JwaE5vcm1hbHMgbWF4TW9ycGhUYXJnZXRzIG1heE1vcnBoTm9ybWFscyBwcmVtdWx0aXBsaWVkQWxwaGEgbnVtRGlyTGlnaHRzIG51bVBvaW50TGlnaHRzIG51bVNwb3RMaWdodHMgbnVtSGVtaUxpZ2h0cyBudW1SZWN0QXJlYUxpZ2h0cyBzaGFkb3dNYXBFbmFibGVkIHNoYWRvd01hcFR5cGUgdG9uZU1hcHBpbmcgcGh5c2ljYWxseUNvcnJlY3RMaWdodHMgYWxwaGFUZXN0IGRvdWJsZVNpZGVkIGZsaXBTaWRlZCBudW1DbGlwcGluZ1BsYW5lcyBudW1DbGlwSW50ZXJzZWN0aW9uIGRlcHRoUGFja2luZyBkaXRoZXJpbmcgc2hlZW4iLnNwbGl0KCIgIik7CnRoaXMuZ2V0UGFyYW1ldGVycz1mdW5jdGlvbihGLEosUCxSLFMsVixXKXt2YXIgaGE9eltGLnR5cGVdLGZhPVcuaXNTa2lubmVkTWVzaD9nKFcpOjAscmE9ZS5wcmVjaXNpb247bnVsbCE9PUYucHJlY2lzaW9uJiYocmE9ZS5nZXRNYXhQcmVjaXNpb24oRi5wcmVjaXNpb24pLHJhIT09Ri5wcmVjaXNpb24mJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6IixGLnByZWNpc2lvbiwibm90IHN1cHBvcnRlZCwgdXNpbmciLHJhLCJpbnN0ZWFkLiIpKTt2YXIgcGE9YS5nZXRSZW5kZXJUYXJnZXQoKTtyZXR1cm57c2hhZGVySUQ6aGEscHJlY2lzaW9uOnJhLHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6ZS52ZXJ0ZXhUZXh0dXJlcyxvdXRwdXRFbmNvZGluZzpyKHBhP3BhLnRleHR1cmU6bnVsbCxhLmdhbW1hT3V0cHV0KSxtYXA6ISFGLm1hcCxtYXBFbmNvZGluZzpyKEYubWFwLGEuZ2FtbWFJbnB1dCksbWF0Y2FwOiEhRi5tYXRjYXAsbWF0Y2FwRW5jb2Rpbmc6cihGLm1hdGNhcCwKYS5nYW1tYUlucHV0KSxlbnZNYXA6ISFGLmVudk1hcCxlbnZNYXBNb2RlOkYuZW52TWFwJiZGLmVudk1hcC5tYXBwaW5nLGVudk1hcEVuY29kaW5nOnIoRi5lbnZNYXAsYS5nYW1tYUlucHV0KSxlbnZNYXBDdWJlVVY6ISFGLmVudk1hcCYmKDMwNj09PUYuZW52TWFwLm1hcHBpbmd8fDMwNz09PUYuZW52TWFwLm1hcHBpbmcpLGxpZ2h0TWFwOiEhRi5saWdodE1hcCxhb01hcDohIUYuYW9NYXAsZW1pc3NpdmVNYXA6ISFGLmVtaXNzaXZlTWFwLGVtaXNzaXZlTWFwRW5jb2Rpbmc6cihGLmVtaXNzaXZlTWFwLGEuZ2FtbWFJbnB1dCksYnVtcE1hcDohIUYuYnVtcE1hcCxub3JtYWxNYXA6ISFGLm5vcm1hbE1hcCxvYmplY3RTcGFjZU5vcm1hbE1hcDoxPT09Ri5ub3JtYWxNYXBUeXBlLHRhbmdlbnRTcGFjZU5vcm1hbE1hcDowPT09Ri5ub3JtYWxNYXBUeXBlLGNsZWFyY29hdE5vcm1hbE1hcDohIUYuY2xlYXJjb2F0Tm9ybWFsTWFwLGRpc3BsYWNlbWVudE1hcDohIUYuZGlzcGxhY2VtZW50TWFwLApyb3VnaG5lc3NNYXA6ISFGLnJvdWdobmVzc01hcCxtZXRhbG5lc3NNYXA6ISFGLm1ldGFsbmVzc01hcCxzcGVjdWxhck1hcDohIUYuc3BlY3VsYXJNYXAsYWxwaGFNYXA6ISFGLmFscGhhTWFwLGdyYWRpZW50TWFwOiEhRi5ncmFkaWVudE1hcCxzaGVlbjohIUYuc2hlZW4sY29tYmluZTpGLmNvbWJpbmUsdmVydGV4VGFuZ2VudHM6Ri5ub3JtYWxNYXAmJkYudmVydGV4VGFuZ2VudHMsdmVydGV4Q29sb3JzOkYudmVydGV4Q29sb3JzLHZlcnRleFV2czohIUYubWFwfHwhIUYuYnVtcE1hcHx8ISFGLm5vcm1hbE1hcHx8ISFGLnNwZWN1bGFyTWFwfHwhIUYuYWxwaGFNYXB8fCEhRi5lbWlzc2l2ZU1hcHx8ISFGLnJvdWdobmVzc01hcHx8ISFGLm1ldGFsbmVzc01hcHx8ISFGLmNsZWFyY29hdE5vcm1hbE1hcCxmb2c6ISFSLHVzZUZvZzpGLmZvZyxmb2dFeHAyOlImJlIuaXNGb2dFeHAyLGZsYXRTaGFkaW5nOkYuZmxhdFNoYWRpbmcsc2l6ZUF0dGVudWF0aW9uOkYuc2l6ZUF0dGVudWF0aW9uLApsb2dhcml0aG1pY0RlcHRoQnVmZmVyOmUubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixza2lubmluZzpGLnNraW5uaW5nJiYwPGZhLG1heEJvbmVzOmZhLHVzZVZlcnRleFRleHR1cmU6ZS5mbG9hdFZlcnRleFRleHR1cmVzLG1vcnBoVGFyZ2V0czpGLm1vcnBoVGFyZ2V0cyxtb3JwaE5vcm1hbHM6Ri5tb3JwaE5vcm1hbHMsbWF4TW9ycGhUYXJnZXRzOmEubWF4TW9ycGhUYXJnZXRzLG1heE1vcnBoTm9ybWFsczphLm1heE1vcnBoTm9ybWFscyxudW1EaXJMaWdodHM6Si5kaXJlY3Rpb25hbC5sZW5ndGgsbnVtUG9pbnRMaWdodHM6Si5wb2ludC5sZW5ndGgsbnVtU3BvdExpZ2h0czpKLnNwb3QubGVuZ3RoLG51bVJlY3RBcmVhTGlnaHRzOkoucmVjdEFyZWEubGVuZ3RoLG51bUhlbWlMaWdodHM6Si5oZW1pLmxlbmd0aCxudW1EaXJMaWdodFNoYWRvd3M6Si5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsbnVtUG9pbnRMaWdodFNoYWRvd3M6Si5wb2ludFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93czpKLnNwb3RTaGFkb3dNYXAubGVuZ3RoLApudW1DbGlwcGluZ1BsYW5lczpTLG51bUNsaXBJbnRlcnNlY3Rpb246VixkaXRoZXJpbmc6Ri5kaXRoZXJpbmcsc2hhZG93TWFwRW5hYmxlZDphLnNoYWRvd01hcC5lbmFibGVkJiZXLnJlY2VpdmVTaGFkb3cmJjA8UC5sZW5ndGgsc2hhZG93TWFwVHlwZTphLnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOkYudG9uZU1hcHBlZD9hLnRvbmVNYXBwaW5nOjAscGh5c2ljYWxseUNvcnJlY3RMaWdodHM6YS5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxwcmVtdWx0aXBsaWVkQWxwaGE6Ri5wcmVtdWx0aXBsaWVkQWxwaGEsYWxwaGFUZXN0OkYuYWxwaGFUZXN0LGRvdWJsZVNpZGVkOjI9PT1GLnNpZGUsZmxpcFNpZGVkOjE9PT1GLnNpZGUsZGVwdGhQYWNraW5nOnZvaWQgMCE9PUYuZGVwdGhQYWNraW5nP0YuZGVwdGhQYWNraW5nOiExfX07dGhpcy5nZXRQcm9ncmFtQ29kZT1mdW5jdGlvbihGLEope3ZhciBQPVtdO0ouc2hhZGVySUQ/UC5wdXNoKEouc2hhZGVySUQpOihQLnB1c2goRi5mcmFnbWVudFNoYWRlciksClAucHVzaChGLnZlcnRleFNoYWRlcikpO2lmKHZvaWQgMCE9PUYuZGVmaW5lcylmb3IodmFyIFIgaW4gRi5kZWZpbmVzKVAucHVzaChSKSxQLnB1c2goRi5kZWZpbmVzW1JdKTtmb3IoUj0wO1I8RS5sZW5ndGg7UisrKVAucHVzaChKW0VbUl1dKTtQLnB1c2goRi5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKSk7UC5wdXNoKGEuZ2FtbWFPdXRwdXQpO1AucHVzaChhLmdhbW1hRmFjdG9yKTtyZXR1cm4gUC5qb2luKCl9O3RoaXMuYWNxdWlyZVByb2dyYW09ZnVuY3Rpb24oRixKLFAsUil7Zm9yKHZhciBTLFY9MCxXPXYubGVuZ3RoO1Y8VztWKyspe3ZhciBoYT12W1ZdO2lmKGhhLmNvZGU9PT1SKXtTPWhhOysrUy51c2VkVGltZXM7YnJlYWt9fXZvaWQgMD09PVMmJihTPW5ldyBKbChhLGMsUixGLEosUCxlKSx2LnB1c2goUykpO3JldHVybiBTfTt0aGlzLnJlbGVhc2VQcm9ncmFtPWZ1bmN0aW9uKEYpezA9PT0tLUYudXNlZFRpbWVzJiYodlt2LmluZGV4T2YoRildPXZbdi5sZW5ndGgtMV0sCnYucG9wKCksRi5kZXN0cm95KCkpfTt0aGlzLnByb2dyYW1zPXZ9ZnVuY3Rpb24gTWwoKXt2YXIgYT1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe3ZhciBlPWEuZ2V0KGMpO3ZvaWQgMD09PWUmJihlPXt9LGEuc2V0KGMsZSkpO3JldHVybiBlfSxyZW1vdmU6ZnVuY3Rpb24oYyl7YS5kZWxldGUoYyl9LHVwZGF0ZTpmdW5jdGlvbihjLGUsZyl7YS5nZXQoYylbZV09Z30sZGlzcG9zZTpmdW5jdGlvbigpe2E9bmV3IFdlYWtNYXB9fX1mdW5jdGlvbiBObChhLGMpe3JldHVybiBhLmdyb3VwT3JkZXIhPT1jLmdyb3VwT3JkZXI/YS5ncm91cE9yZGVyLWMuZ3JvdXBPcmRlcjphLnJlbmRlck9yZGVyIT09Yy5yZW5kZXJPcmRlcj9hLnJlbmRlck9yZGVyLWMucmVuZGVyT3JkZXI6YS5wcm9ncmFtIT09Yy5wcm9ncmFtP2EucHJvZ3JhbS5pZC1jLnByb2dyYW0uaWQ6YS5tYXRlcmlhbC5pZCE9PWMubWF0ZXJpYWwuaWQ/YS5tYXRlcmlhbC5pZC1jLm1hdGVyaWFsLmlkOmEueiE9PQpjLno/YS56LWMuejphLmlkLWMuaWR9ZnVuY3Rpb24gT2woYSxjKXtyZXR1cm4gYS5ncm91cE9yZGVyIT09Yy5ncm91cE9yZGVyP2EuZ3JvdXBPcmRlci1jLmdyb3VwT3JkZXI6YS5yZW5kZXJPcmRlciE9PWMucmVuZGVyT3JkZXI/YS5yZW5kZXJPcmRlci1jLnJlbmRlck9yZGVyOmEueiE9PWMuej9jLnotYS56OmEuaWQtYy5pZH1mdW5jdGlvbiB0aigpe2Z1bmN0aW9uIGEoeixFLEYsSixQLFIpe3ZhciBTPWNbZV07dm9pZCAwPT09Uz8oUz17aWQ6ei5pZCxvYmplY3Q6eixnZW9tZXRyeTpFLG1hdGVyaWFsOkYscHJvZ3JhbTpGLnByb2dyYW18fHYsZ3JvdXBPcmRlcjpKLHJlbmRlck9yZGVyOnoucmVuZGVyT3JkZXIsejpQLGdyb3VwOlJ9LGNbZV09Uyk6KFMuaWQ9ei5pZCxTLm9iamVjdD16LFMuZ2VvbWV0cnk9RSxTLm1hdGVyaWFsPUYsUy5wcm9ncmFtPUYucHJvZ3JhbXx8dixTLmdyb3VwT3JkZXI9SixTLnJlbmRlck9yZGVyPXoucmVuZGVyT3JkZXIsUy56PVAsUy5ncm91cD1SKTsKZSsrO3JldHVybiBTfXZhciBjPVtdLGU9MCxnPVtdLHI9W10sdj17aWQ6LTF9O3JldHVybntvcGFxdWU6Zyx0cmFuc3BhcmVudDpyLGluaXQ6ZnVuY3Rpb24oKXtlPTA7Zy5sZW5ndGg9MDtyLmxlbmd0aD0wfSxwdXNoOmZ1bmN0aW9uKHosRSxGLEosUCxSKXt6PWEoeixFLEYsSixQLFIpOyghMD09PUYudHJhbnNwYXJlbnQ/cjpnKS5wdXNoKHopfSx1bnNoaWZ0OmZ1bmN0aW9uKHosRSxGLEosUCxSKXt6PWEoeixFLEYsSixQLFIpOyghMD09PUYudHJhbnNwYXJlbnQ/cjpnKS51bnNoaWZ0KHopfSxzb3J0OmZ1bmN0aW9uKCl7MTxnLmxlbmd0aCYmZy5zb3J0KE5sKTsxPHIubGVuZ3RoJiZyLnNvcnQoT2wpfX19ZnVuY3Rpb24gUGwoKXtmdW5jdGlvbiBhKGUpe2U9ZS50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKTtjLmRlbGV0ZShlKX12YXIgYz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUsZyl7dmFyIHI9Yy5nZXQoZSk7aWYodm9pZCAwPT09CnIpe3ZhciB2PW5ldyB0ajtjLnNldChlLG5ldyBXZWFrTWFwKTtjLmdldChlKS5zZXQoZyx2KTtlLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpfWVsc2Ugdj1yLmdldChnKSx2b2lkIDA9PT12JiYodj1uZXcgdGosci5zZXQoZyx2KSk7cmV0dXJuIHZ9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtjPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gUWwoKXt2YXIgYT17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe2lmKHZvaWQgMCE9PWFbYy5pZF0pcmV0dXJuIGFbYy5pZF07c3dpdGNoKGMudHlwZSl7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dmFyIGU9e2RpcmVjdGlvbjpuZXcgayxjb2xvcjpuZXcgSSxzaGFkb3c6ITEsc2hhZG93QmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IGZ9O2JyZWFrO2Nhc2UgIlNwb3RMaWdodCI6ZT17cG9zaXRpb246bmV3IGssZGlyZWN0aW9uOm5ldyBrLGNvbG9yOm5ldyBJLGRpc3RhbmNlOjAsY29uZUNvczowLHBlbnVtYnJhQ29zOjAsZGVjYXk6MCwKc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmfTticmVhaztjYXNlICJQb2ludExpZ2h0IjplPXtwb3NpdGlvbjpuZXcgayxjb2xvcjpuZXcgSSxkaXN0YW5jZTowLGRlY2F5OjAsc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmLHNoYWRvd0NhbWVyYU5lYXI6MSxzaGFkb3dDYW1lcmFGYXI6MUUzfTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOmU9e2RpcmVjdGlvbjpuZXcgayxza3lDb2xvcjpuZXcgSSxncm91bmRDb2xvcjpuZXcgSX07YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6ZT17Y29sb3I6bmV3IEkscG9zaXRpb246bmV3IGssaGFsZldpZHRoOm5ldyBrLGhhbGZIZWlnaHQ6bmV3IGt9fXJldHVybiBhW2MuaWRdPWV9fX1mdW5jdGlvbiBSbChhLGMpe3JldHVybihjLmNhc3RTaGFkb3c/MTowKS0oYS5jYXN0U2hhZG93PzE6MCl9ZnVuY3Rpb24gU2woKXtmb3IodmFyIGE9Cm5ldyBRbCxjPXt2ZXJzaW9uOjAsaGFzaDp7ZGlyZWN0aW9uYWxMZW5ndGg6LTEscG9pbnRMZW5ndGg6LTEsc3BvdExlbmd0aDotMSxyZWN0QXJlYUxlbmd0aDotMSxoZW1pTGVuZ3RoOi0xLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGFtYmllbnQ6WzAsMCwwXSxwcm9iZTpbXSxkaXJlY3Rpb25hbDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hcDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDpbXSxzcG90OltdLHNwb3RTaGFkb3dNYXA6W10sc3BvdFNoYWRvd01hdHJpeDpbXSxyZWN0QXJlYTpbXSxwb2ludDpbXSxwb2ludFNoYWRvd01hcDpbXSxwb2ludFNoYWRvd01hdHJpeDpbXSxoZW1pOltdLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGU9MDs5PmU7ZSsrKWMucHJvYmUucHVzaChuZXcgayk7dmFyIGc9bmV3IGsscj1uZXcgcSx2PW5ldyBxO3JldHVybntzZXR1cDpmdW5jdGlvbih6LApFLEYpe2Zvcih2YXIgSj0wLFA9MCxSPTAsUz0wOzk+UztTKyspYy5wcm9iZVtTXS5zZXQoMCwwLDApO3ZhciBWPUU9MCxXPTAsaGE9MCxmYT0wLHJhPTAscGE9MCxxYT0wO0Y9Ri5tYXRyaXhXb3JsZEludmVyc2U7ei5zb3J0KFJsKTtTPTA7Zm9yKHZhciB1YT16Lmxlbmd0aDtTPHVhO1MrKyl7dmFyIG9hPXpbU10sdGE9b2EuY29sb3IsQmE9b2EuaW50ZW5zaXR5LFRhPW9hLmRpc3RhbmNlLFVhPW9hLnNoYWRvdyYmb2Euc2hhZG93Lm1hcD9vYS5zaGFkb3cubWFwLnRleHR1cmU6bnVsbDtpZihvYS5pc0FtYmllbnRMaWdodClKKz10YS5yKkJhLFArPXRhLmcqQmEsUis9dGEuYipCYTtlbHNlIGlmKG9hLmlzTGlnaHRQcm9iZSlmb3IoVWE9MDs5PlVhO1VhKyspYy5wcm9iZVtVYV0uYWRkU2NhbGVkVmVjdG9yKG9hLnNoLmNvZWZmaWNpZW50c1tVYV0sQmEpO2Vsc2UgaWYob2EuaXNEaXJlY3Rpb25hbExpZ2h0KXt2YXIgQ2E9YS5nZXQob2EpO0NhLmNvbG9yLmNvcHkob2EuY29sb3IpLm11bHRpcGx5U2NhbGFyKG9hLmludGVuc2l0eSk7CkNhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpO2cuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLnRhcmdldC5tYXRyaXhXb3JsZCk7Q2EuZGlyZWN0aW9uLnN1YihnKTtDYS5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKEYpO2lmKENhLnNoYWRvdz1vYS5jYXN0U2hhZG93KUJhPW9hLnNoYWRvdyxDYS5zaGFkb3dCaWFzPUJhLmJpYXMsQ2Euc2hhZG93UmFkaXVzPUJhLnJhZGl1cyxDYS5zaGFkb3dNYXBTaXplPUJhLm1hcFNpemUsYy5kaXJlY3Rpb25hbFNoYWRvd01hcFtFXT1VYSxjLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W0VdPW9hLnNoYWRvdy5tYXRyaXgscmErKztjLmRpcmVjdGlvbmFsW0VdPUNhO0UrK31lbHNlIGlmKG9hLmlzU3BvdExpZ2h0KXtDYT1hLmdldChvYSk7Q2EucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLm1hdHJpeFdvcmxkKTtDYS5wb3NpdGlvbi5hcHBseU1hdHJpeDQoRik7Q2EuY29sb3IuY29weSh0YSkubXVsdGlwbHlTY2FsYXIoQmEpOwpDYS5kaXN0YW5jZT1UYTtDYS5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLm1hdHJpeFdvcmxkKTtnLnNldEZyb21NYXRyaXhQb3NpdGlvbihvYS50YXJnZXQubWF0cml4V29ybGQpO0NhLmRpcmVjdGlvbi5zdWIoZyk7Q2EuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihGKTtDYS5jb25lQ29zPU1hdGguY29zKG9hLmFuZ2xlKTtDYS5wZW51bWJyYUNvcz1NYXRoLmNvcyhvYS5hbmdsZSooMS1vYS5wZW51bWJyYSkpO0NhLmRlY2F5PW9hLmRlY2F5O2lmKENhLnNoYWRvdz1vYS5jYXN0U2hhZG93KUJhPW9hLnNoYWRvdyxDYS5zaGFkb3dCaWFzPUJhLmJpYXMsQ2Euc2hhZG93UmFkaXVzPUJhLnJhZGl1cyxDYS5zaGFkb3dNYXBTaXplPUJhLm1hcFNpemUsYy5zcG90U2hhZG93TWFwW1ddPVVhLGMuc3BvdFNoYWRvd01hdHJpeFtXXT1vYS5zaGFkb3cubWF0cml4LHFhKys7Yy5zcG90W1ddPUNhO1crK31lbHNlIGlmKG9hLmlzUmVjdEFyZWFMaWdodClDYT1hLmdldChvYSksCkNhLmNvbG9yLmNvcHkodGEpLm11bHRpcGx5U2NhbGFyKEJhKSxDYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpLENhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChGKSx2LmlkZW50aXR5KCksci5jb3B5KG9hLm1hdHJpeFdvcmxkKSxyLnByZW11bHRpcGx5KEYpLHYuZXh0cmFjdFJvdGF0aW9uKHIpLENhLmhhbGZXaWR0aC5zZXQoLjUqb2Eud2lkdGgsMCwwKSxDYS5oYWxmSGVpZ2h0LnNldCgwLC41Km9hLmhlaWdodCwwKSxDYS5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KHYpLENhLmhhbGZIZWlnaHQuYXBwbHlNYXRyaXg0KHYpLGMucmVjdEFyZWFbaGFdPUNhLGhhKys7ZWxzZSBpZihvYS5pc1BvaW50TGlnaHQpe0NhPWEuZ2V0KG9hKTtDYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpO0NhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChGKTtDYS5jb2xvci5jb3B5KG9hLmNvbG9yKS5tdWx0aXBseVNjYWxhcihvYS5pbnRlbnNpdHkpOwpDYS5kaXN0YW5jZT1vYS5kaXN0YW5jZTtDYS5kZWNheT1vYS5kZWNheTtpZihDYS5zaGFkb3c9b2EuY2FzdFNoYWRvdylCYT1vYS5zaGFkb3csQ2Euc2hhZG93Qmlhcz1CYS5iaWFzLENhLnNoYWRvd1JhZGl1cz1CYS5yYWRpdXMsQ2Euc2hhZG93TWFwU2l6ZT1CYS5tYXBTaXplLENhLnNoYWRvd0NhbWVyYU5lYXI9QmEuY2FtZXJhLm5lYXIsQ2Euc2hhZG93Q2FtZXJhRmFyPUJhLmNhbWVyYS5mYXIsYy5wb2ludFNoYWRvd01hcFtWXT1VYSxjLnBvaW50U2hhZG93TWF0cml4W1ZdPW9hLnNoYWRvdy5tYXRyaXgscGErKztjLnBvaW50W1ZdPUNhO1YrK31lbHNlIG9hLmlzSGVtaXNwaGVyZUxpZ2h0JiYoQ2E9YS5nZXQob2EpLENhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpLENhLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oRiksQ2EuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpLENhLnNreUNvbG9yLmNvcHkob2EuY29sb3IpLm11bHRpcGx5U2NhbGFyKEJhKSwKQ2EuZ3JvdW5kQ29sb3IuY29weShvYS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoQmEpLGMuaGVtaVtmYV09Q2EsZmErKyl9Yy5hbWJpZW50WzBdPUo7Yy5hbWJpZW50WzFdPVA7Yy5hbWJpZW50WzJdPVI7ej1jLmhhc2g7aWYoei5kaXJlY3Rpb25hbExlbmd0aCE9PUV8fHoucG9pbnRMZW5ndGghPT1WfHx6LnNwb3RMZW5ndGghPT1XfHx6LnJlY3RBcmVhTGVuZ3RoIT09aGF8fHouaGVtaUxlbmd0aCE9PWZhfHx6Lm51bURpcmVjdGlvbmFsU2hhZG93cyE9PXJhfHx6Lm51bVBvaW50U2hhZG93cyE9PXBhfHx6Lm51bVNwb3RTaGFkb3dzIT09cWEpYy5kaXJlY3Rpb25hbC5sZW5ndGg9RSxjLnNwb3QubGVuZ3RoPVcsYy5yZWN0QXJlYS5sZW5ndGg9aGEsYy5wb2ludC5sZW5ndGg9VixjLmhlbWkubGVuZ3RoPWZhLGMuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoPXJhLGMucG9pbnRTaGFkb3dNYXAubGVuZ3RoPXBhLGMuc3BvdFNoYWRvd01hcC5sZW5ndGg9cWEsYy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGg9CnJhLGMucG9pbnRTaGFkb3dNYXRyaXgubGVuZ3RoPXBhLGMuc3BvdFNoYWRvd01hdHJpeC5sZW5ndGg9cWEsei5kaXJlY3Rpb25hbExlbmd0aD1FLHoucG9pbnRMZW5ndGg9Vix6LnNwb3RMZW5ndGg9Vyx6LnJlY3RBcmVhTGVuZ3RoPWhhLHouaGVtaUxlbmd0aD1mYSx6Lm51bURpcmVjdGlvbmFsU2hhZG93cz1yYSx6Lm51bVBvaW50U2hhZG93cz1wYSx6Lm51bVNwb3RTaGFkb3dzPXFhLGMudmVyc2lvbj1UbCsrfSxzdGF0ZTpjfX1mdW5jdGlvbiB1aigpe3ZhciBhPW5ldyBTbCxjPVtdLGU9W107cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtjLmxlbmd0aD0wO2UubGVuZ3RoPTB9LHN0YXRlOntsaWdodHNBcnJheTpjLHNoYWRvd3NBcnJheTplLGxpZ2h0czphfSxzZXR1cExpZ2h0czpmdW5jdGlvbihnKXthLnNldHVwKGMsZSxnKX0scHVzaExpZ2h0OmZ1bmN0aW9uKGcpe2MucHVzaChnKX0scHVzaFNoYWRvdzpmdW5jdGlvbihnKXtlLnB1c2goZyl9fX1mdW5jdGlvbiBVbCgpe2Z1bmN0aW9uIGEoZSl7ZT0KZS50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKTtjLmRlbGV0ZShlKX12YXIgYz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUsZyl7aWYoITE9PT1jLmhhcyhlKSl7dmFyIHI9bmV3IHVqO2Muc2V0KGUsbmV3IFdlYWtNYXApO2MuZ2V0KGUpLnNldChnLHIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSl9ZWxzZSExPT09Yy5nZXQoZSkuaGFzKGcpPyhyPW5ldyB1aixjLmdldChlKS5zZXQoZyxyKSk6cj1jLmdldChlKS5nZXQoZyk7cmV0dXJuIHJ9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtjPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gdmQoYSl7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaERlcHRoTWF0ZXJpYWwiO3RoaXMuZGVwdGhQYWNraW5nPTMyMDA7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KMTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIHdkKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hEaXN0YW5jZU1hdGVyaWFsIjt0aGlzLnJlZmVyZW5jZVBvc2l0aW9uPW5ldyBrO3RoaXMubmVhckRpc3RhbmNlPTE7dGhpcy5mYXJEaXN0YW5jZT0xRTM7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIHZqKGEsYyxlKXtmdW5jdGlvbiBnKHRhLEJhKXt2YXIgVGE9Yy51cGRhdGUocmEpO1cudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9CnRhLm1hcC50ZXh0dXJlO1cudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT10YS5tYXBTaXplO1cudW5pZm9ybXMucmFkaXVzLnZhbHVlPXRhLnJhZGl1czthLnNldFJlbmRlclRhcmdldCh0YS5tYXBQYXNzKTthLmNsZWFyKCk7YS5yZW5kZXJCdWZmZXJEaXJlY3QoQmEsbnVsbCxUYSxXLHJhLG51bGwpO2hhLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPXRhLm1hcFBhc3MudGV4dHVyZTtoYS51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPXRhLm1hcFNpemU7aGEudW5pZm9ybXMucmFkaXVzLnZhbHVlPXRhLnJhZGl1czthLnNldFJlbmRlclRhcmdldCh0YS5tYXApO2EuY2xlYXIoKTthLnJlbmRlckJ1ZmZlckRpcmVjdChCYSxudWxsLFRhLGhhLHJhLG51bGwpfWZ1bmN0aW9uIHIodGEsQmEsVGEsVWEsQ2EsSGEpe3ZhciBEYT10YS5nZW9tZXRyeTt2YXIgTWE9UDt2YXIgZGI9dGEuY3VzdG9tRGVwdGhNYXRlcmlhbDtUYS5pc1BvaW50TGlnaHQmJihNYT1SLGRiPXRhLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWwpOwpkYj9NYT1kYjooZGI9ITEsQmEubW9ycGhUYXJnZXRzJiYoRGEmJkRhLmlzQnVmZmVyR2VvbWV0cnk/ZGI9RGEubW9ycGhBdHRyaWJ1dGVzJiZEYS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24mJjA8RGEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDpEYSYmRGEuaXNHZW9tZXRyeSYmKGRiPURhLm1vcnBoVGFyZ2V0cyYmMDxEYS5tb3JwaFRhcmdldHMubGVuZ3RoKSksdGEuaXNTa2lubmVkTWVzaCYmITE9PT1CYS5za2lubmluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Iix0YSksdGE9dGEuaXNTa2lubmVkTWVzaCYmQmEuc2tpbm5pbmcsRGE9MCxkYiYmKERhfD0xKSx0YSYmKERhfD0yKSxNYT1NYVtEYV0pO2EubG9jYWxDbGlwcGluZ0VuYWJsZWQmJiEwPT09QmEuY2xpcFNoYWRvd3MmJjAhPT1CYS5jbGlwcGluZ1BsYW5lcy5sZW5ndGgmJihEYT1NYS51dWlkLApkYj1CYS51dWlkLHRhPVNbRGFdLHZvaWQgMD09PXRhJiYodGE9e30sU1tEYV09dGEpLERhPXRhW2RiXSx2b2lkIDA9PT1EYSYmKERhPU1hLmNsb25lKCksdGFbZGJdPURhKSxNYT1EYSk7TWEudmlzaWJsZT1CYS52aXNpYmxlO01hLndpcmVmcmFtZT1CYS53aXJlZnJhbWU7TWEuc2lkZT0zPT09SGE/bnVsbCE9QmEuc2hhZG93U2lkZT9CYS5zaGFkb3dTaWRlOkJhLnNpZGU6bnVsbCE9QmEuc2hhZG93U2lkZT9CYS5zaGFkb3dTaWRlOlZbQmEuc2lkZV07TWEuY2xpcFNoYWRvd3M9QmEuY2xpcFNoYWRvd3M7TWEuY2xpcHBpbmdQbGFuZXM9QmEuY2xpcHBpbmdQbGFuZXM7TWEuY2xpcEludGVyc2VjdGlvbj1CYS5jbGlwSW50ZXJzZWN0aW9uO01hLndpcmVmcmFtZUxpbmV3aWR0aD1CYS53aXJlZnJhbWVMaW5ld2lkdGg7TWEubGluZXdpZHRoPUJhLmxpbmV3aWR0aDtUYS5pc1BvaW50TGlnaHQmJk1hLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwmJihNYS5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oVGEubWF0cml4V29ybGQpLApNYS5uZWFyRGlzdGFuY2U9VWEsTWEuZmFyRGlzdGFuY2U9Q2EpO3JldHVybiBNYX1mdW5jdGlvbiB2KHRhLEJhLFRhLFVhLENhKXtpZighMSE9PXRhLnZpc2libGUpe2lmKHRhLmxheWVycy50ZXN0KEJhLmxheWVycykmJih0YS5pc01lc2h8fHRhLmlzTGluZXx8dGEuaXNQb2ludHMpJiYodGEuY2FzdFNoYWRvd3x8dGEucmVjZWl2ZVNoYWRvdyYmMz09PUNhKSYmKCF0YS5mcnVzdHVtQ3VsbGVkfHx6LmludGVyc2VjdHNPYmplY3QodGEpKSl7dGEubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoVGEubWF0cml4V29ybGRJbnZlcnNlLHRhLm1hdHJpeFdvcmxkKTt2YXIgSGE9Yy51cGRhdGUodGEpLERhPXRhLm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoRGEpKWZvcih2YXIgTWE9SGEuZ3JvdXBzLGRiPTAsdGI9TWEubGVuZ3RoO2RiPHRiO2RiKyspe3ZhciBLYT1NYVtkYl0sYmI9RGFbS2EubWF0ZXJpYWxJbmRleF07YmImJmJiLnZpc2libGUmJihiYj1yKHRhLGJiLFVhLFRhLm5lYXIsClRhLmZhcixDYSksYS5yZW5kZXJCdWZmZXJEaXJlY3QoVGEsbnVsbCxIYSxiYix0YSxLYSkpfWVsc2UgRGEudmlzaWJsZSYmKGJiPXIodGEsRGEsVWEsVGEubmVhcixUYS5mYXIsQ2EpLGEucmVuZGVyQnVmZmVyRGlyZWN0KFRhLG51bGwsSGEsYmIsdGEsbnVsbCkpfXRhPXRhLmNoaWxkcmVuO0hhPTA7Zm9yKERhPXRhLmxlbmd0aDtIYTxEYTtIYSsrKXYodGFbSGFdLEJhLFRhLFVhLENhKX19dmFyIHo9bmV3IGljLEU9bmV3IGYsRj1uZXcgZixKPW5ldyBwLFA9QXJyYXkoNCksUj1BcnJheSg0KSxTPXt9LFY9ezA6MSwxOjAsMjoyfSxXPW5ldyBxYih7ZGVmaW5lczp7U0FNUExFX1JBVEU6LjI1LEhBTEZfU0FNUExFX1JBVEU6LjEyNX0sdW5pZm9ybXM6e3NoYWRvd19wYXNzOnt2YWx1ZTpudWxsfSxyZXNvbHV0aW9uOnt2YWx1ZTpuZXcgZn0scmFkaXVzOnt2YWx1ZTo0fX0sdmVydGV4U2hhZGVyOiJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsCmZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzcztcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCByYWRpdXM7XG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbnZvaWQgbWFpbigpIHtcbiAgZmxvYXQgbWVhbiBceDNkIDAuMDtcbiAgZmxvYXQgc3F1YXJlZF9tZWFuIFx4M2QgMC4wO1xuICBcblx0ZmxvYXQgZGVwdGggXHgzZCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgICkgLyByZXNvbHV0aW9uICkgKTtcbiAgZm9yICggZmxvYXQgaSBceDNkIC0xLjA7IGkgXHgzYyAxLjAgOyBpICtceDNkIFNBTVBMRV9SQVRFKSB7XG4gICAgI2lmZGVmIEhPUklaT05BTF9QQVNTXG4gICAgICB2ZWMyIGRpc3RyaWJ1dGlvbiBceDNkIGRlY29kZUhhbGZSR0JBICggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG4gICAgICBtZWFuICtceDNkIGRpc3RyaWJ1dGlvbi54O1xuICAgICAgc3F1YXJlZF9tZWFuICtceDNkIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54O1xuICAgICNlbHNlXG4gICAgICBmbG9hdCBkZXB0aCBceDNkIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgIGkgKSAgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuICAgICAgbWVhbiArXHgzZCBkZXB0aDtcbiAgICAgIHNxdWFyZWRfbWVhbiArXHgzZCBkZXB0aCAqIGRlcHRoO1xuICAgICNlbmRpZlxuICB9XG4gIG1lYW4gXHgzZCBtZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgc3F1YXJlZF9tZWFuIFx4M2Qgc3F1YXJlZF9tZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgZmxvYXQgc3RkX2RldiBceDNkIHBvdyggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4sIDAuNSApO1xuICBnbF9GcmFnQ29sb3IgXHgzZCBlbmNvZGVIYWxmUkdCQSggdmVjMiggbWVhbiwgc3RkX2RldiApICk7XG59In0pLApoYT1XLmNsb25lKCk7aGEuZGVmaW5lcy5IT1JJWk9OQUxfUEFTUz0xO3ZhciBmYT1uZXcgdmE7ZmEuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFEobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO3ZhciByYT1uZXcgeGEoZmEsVyk7Zm9yKGZhPTA7NCE9PWZhOysrZmEpe3ZhciBwYT0wIT09KGZhJjEpLHFhPTAhPT0oZmEmMiksdWE9bmV3IHZkKHtkZXB0aFBhY2tpbmc6MzIwMSxtb3JwaFRhcmdldHM6cGEsc2tpbm5pbmc6cWF9KTtQW2ZhXT11YTtwYT1uZXcgd2Qoe21vcnBoVGFyZ2V0czpwYSxza2lubmluZzpxYX0pO1JbZmFdPXBhfXZhciBvYT10aGlzO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmF1dG9VcGRhdGU9ITA7dGhpcy5uZWVkc1VwZGF0ZT0hMTt0aGlzLnR5cGU9MTt0aGlzLnJlbmRlcj1mdW5jdGlvbih0YSxCYSxUYSl7aWYoITEhPT1vYS5lbmFibGVkJiYoITEhPT1vYS5hdXRvVXBkYXRlfHwhMSE9PW9hLm5lZWRzVXBkYXRlKSYmCjAhPT10YS5sZW5ndGgpe3ZhciBVYT1hLmdldFJlbmRlclRhcmdldCgpLENhPWEuZ2V0QWN0aXZlQ3ViZUZhY2UoKSxIYT1hLmdldEFjdGl2ZU1pcG1hcExldmVsKCksRGE9YS5zdGF0ZTtEYS5zZXRCbGVuZGluZygwKTtEYS5idWZmZXJzLmNvbG9yLnNldENsZWFyKDEsMSwxLDEpO0RhLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCk7RGEuc2V0U2Npc3NvclRlc3QoITEpO2Zvcih2YXIgTWE9MCxkYj10YS5sZW5ndGg7TWE8ZGI7TWErKyl7dmFyIHRiPXRhW01hXSxLYT10Yi5zaGFkb3c7aWYodm9pZCAwPT09S2EpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLHRiLCJoYXMgbm8gc2hhZG93LiIpO2Vsc2V7RS5jb3B5KEthLm1hcFNpemUpO3ZhciBiYj1LYS5nZXRGcmFtZUV4dGVudHMoKTtFLm11bHRpcGx5KGJiKTtGLmNvcHkoS2EubWFwU2l6ZSk7aWYoRS54PmV8fEUueT5lKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6Iix0YiwiaGFzIHNoYWRvdyBleGNlZWRpbmcgbWF4IHRleHR1cmUgc2l6ZSwgcmVkdWNpbmciKSwKRS54PmUmJihGLng9TWF0aC5mbG9vcihlL2JiLngpLEUueD1GLngqYmIueCxLYS5tYXBTaXplLng9Ri54KSxFLnk+ZSYmKEYueT1NYXRoLmZsb29yKGUvYmIueSksRS55PUYueSpiYi55LEthLm1hcFNpemUueT1GLnkpO251bGwhPT1LYS5tYXB8fEthLmlzUG9pbnRMaWdodFNoYWRvd3x8MyE9PXRoaXMudHlwZXx8KGJiPXttaW5GaWx0ZXI6MTAwNixtYWdGaWx0ZXI6MTAwNixmb3JtYXQ6MTAyM30sS2EubWFwPW5ldyBtKEUueCxFLnksYmIpLEthLm1hcC50ZXh0dXJlLm5hbWU9dGIubmFtZSsiLnNoYWRvd01hcCIsS2EubWFwUGFzcz1uZXcgbShFLngsRS55LGJiKSxLYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTtudWxsPT09S2EubWFwJiYoYmI9e21pbkZpbHRlcjoxMDAzLG1hZ0ZpbHRlcjoxMDAzLGZvcm1hdDoxMDIzfSxLYS5tYXA9bmV3IG0oRS54LEUueSxiYiksS2EubWFwLnRleHR1cmUubmFtZT10Yi5uYW1lKyIuc2hhZG93TWFwIixLYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTsKYS5zZXRSZW5kZXJUYXJnZXQoS2EubWFwKTthLmNsZWFyKCk7YmI9S2EuZ2V0Vmlld3BvcnRDb3VudCgpO2Zvcih2YXIgamI9MDtqYjxiYjtqYisrKXt2YXIgRWI9S2EuZ2V0Vmlld3BvcnQoamIpO0ouc2V0KEYueCpFYi54LEYueSpFYi55LEYueCpFYi56LEYueSpFYi53KTtEYS52aWV3cG9ydChKKTtLYS51cGRhdGVNYXRyaWNlcyh0YixUYSxqYik7ej1LYS5nZXRGcnVzdHVtKCk7dihCYSxUYSxLYS5jYW1lcmEsdGIsdGhpcy50eXBlKX1LYS5pc1BvaW50TGlnaHRTaGFkb3d8fDMhPT10aGlzLnR5cGV8fGcoS2EsVGEpfX1vYS5uZWVkc1VwZGF0ZT0hMTthLnNldFJlbmRlclRhcmdldChVYSxDYSxIYSl9fX1mdW5jdGlvbiBWbChhLGMsZSxnKXtmdW5jdGlvbiByKGphLEdhLExhKXt2YXIgbmI9bmV3IFVpbnQ4QXJyYXkoNCksVmE9YS5jcmVhdGVUZXh0dXJlKCk7YS5iaW5kVGV4dHVyZShqYSxWYSk7YS50ZXhQYXJhbWV0ZXJpKGphLDEwMjQxLDk3MjgpO2EudGV4UGFyYW1ldGVyaShqYSwKMTAyNDAsOTcyOCk7Zm9yKGphPTA7amE8TGE7amErKylhLnRleEltYWdlMkQoR2EramEsMCw2NDA4LDEsMSwwLDY0MDgsNTEyMSxuYik7cmV0dXJuIFZhfWZ1bmN0aW9uIHYoamEsR2Epe3JhW2phXT0xOzA9PT1wYVtqYV0mJihhLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGphKSxwYVtqYV09MSk7cWFbamFdIT09R2EmJigoZy5pc1dlYkdMMj9hOmMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpW2cuaXNXZWJHTDI/InZlcnRleEF0dHJpYkRpdmlzb3IiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiXShqYSxHYSkscWFbamFdPUdhKX1mdW5jdGlvbiB6KGphKXshMCE9PXVhW2phXSYmKGEuZW5hYmxlKGphKSx1YVtqYV09ITApfWZ1bmN0aW9uIEUoamEpeyExIT09dWFbamFdJiYoYS5kaXNhYmxlKGphKSx1YVtqYV09ITEpfWZ1bmN0aW9uIEYoamEsR2EsTGEsbmIsVmEsaWIsa2IsUWEpe2lmKDA9PT1qYSlCYSYmKEUoMzA0MiksQmE9ITEpO2Vsc2UgaWYoQmF8fCh6KDMwNDIpLApCYT0hMCksNSE9PWphKXtpZihqYSE9PVRhfHxRYSE9PXRiKXtpZigxMDAhPT1VYXx8MTAwIT09RGEpYS5ibGVuZEVxdWF0aW9uKDMyNzc0KSxEYT1VYT0xMDA7aWYoUWEpc3dpdGNoKGphKXtjYXNlIDE6YS5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOmEuYmxlbmRGdW5jKDEsMSk7YnJlYWs7Y2FzZSAzOmEuYmxlbmRGdW5jU2VwYXJhdGUoMCwwLDc2OSw3NzEpO2JyZWFrO2Nhc2UgNDphLmJsZW5kRnVuY1NlcGFyYXRlKDAsNzY4LDAsNzcwKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsamEpfWVsc2Ugc3dpdGNoKGphKXtjYXNlIDE6YS5ibGVuZEZ1bmNTZXBhcmF0ZSg3NzAsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6YS5ibGVuZEZ1bmMoNzcwLDEpO2JyZWFrO2Nhc2UgMzphLmJsZW5kRnVuYygwLDc2OSk7YnJlYWs7Y2FzZSA0OmEuYmxlbmRGdW5jKDAsNzY4KTticmVhazsKZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGphKX1kYj1NYT1IYT1DYT1udWxsO1RhPWphO3RiPVFhfX1lbHNle1ZhPVZhfHxHYTtpYj1pYnx8TGE7a2I9a2J8fG5iO2lmKEdhIT09VWF8fFZhIT09RGEpYS5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoZS5jb252ZXJ0KEdhKSxlLmNvbnZlcnQoVmEpKSxVYT1HYSxEYT1WYTtpZihMYSE9PUNhfHxuYiE9PUhhfHxpYiE9PU1hfHxrYiE9PWRiKWEuYmxlbmRGdW5jU2VwYXJhdGUoZS5jb252ZXJ0KExhKSxlLmNvbnZlcnQobmIpLGUuY29udmVydChpYiksZS5jb252ZXJ0KGtiKSksQ2E9TGEsSGE9bmIsTWE9aWIsZGI9a2I7VGE9amE7dGI9bnVsbH19ZnVuY3Rpb24gSihqYSl7S2EhPT1qYSYmKGphP2EuZnJvbnRGYWNlKDIzMDQpOmEuZnJvbnRGYWNlKDIzMDUpLEthPWphKX1mdW5jdGlvbiBQKGphKXswIT09amE/KHooMjg4NCksamEhPT1iYiYmKDE9PT1qYT9hLmN1bGxGYWNlKDEwMjkpOgoyPT09amE/YS5jdWxsRmFjZSgxMDI4KTphLmN1bGxGYWNlKDEwMzIpKSk6RSgyODg0KTtiYj1qYX1mdW5jdGlvbiBSKGphLEdhLExhKXtpZihqYSl7aWYoeigzMjgyMyksRWIhPT1HYXx8eGIhPT1MYSlhLnBvbHlnb25PZmZzZXQoR2EsTGEpLEViPUdhLHhiPUxhfWVsc2UgRSgzMjgyMyl9ZnVuY3Rpb24gUyhqYSl7dm9pZCAwPT09amEmJihqYT0zMzk4NCtpYS0xKTt6YSE9PWphJiYoYS5hY3RpdmVUZXh0dXJlKGphKSx6YT1qYSl9dmFyIFY9bmV3IGZ1bmN0aW9uKCl7dmFyIGphPSExLEdhPW5ldyBwLExhPW51bGwsbmI9bmV3IHAoMCwwLDAsMCk7cmV0dXJue3NldE1hc2s6ZnVuY3Rpb24oVmEpe0xhPT09VmF8fGphfHwoYS5jb2xvck1hc2soVmEsVmEsVmEsVmEpLExhPVZhKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKFZhKXtqYT1WYX0sc2V0Q2xlYXI6ZnVuY3Rpb24oVmEsaWIsa2IsUWEsZWIpeyEwPT09ZWImJihWYSo9UWEsaWIqPVFhLGtiKj1RYSk7R2Euc2V0KFZhLGliLGtiLFFhKTsKITE9PT1uYi5lcXVhbHMoR2EpJiYoYS5jbGVhckNvbG9yKFZhLGliLGtiLFFhKSxuYi5jb3B5KEdhKSl9LHJlc2V0OmZ1bmN0aW9uKCl7amE9ITE7TGE9bnVsbDtuYi5zZXQoLTEsMCwwLDApfX19LFc9bmV3IGZ1bmN0aW9uKCl7dmFyIGphPSExLEdhPW51bGwsTGE9bnVsbCxuYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKFZhKXtWYT96KDI5MjkpOkUoMjkyOSl9LHNldE1hc2s6ZnVuY3Rpb24oVmEpe0dhPT09VmF8fGphfHwoYS5kZXB0aE1hc2soVmEpLEdhPVZhKX0sc2V0RnVuYzpmdW5jdGlvbihWYSl7aWYoTGEhPT1WYSl7aWYoVmEpc3dpdGNoKFZhKXtjYXNlIDA6YS5kZXB0aEZ1bmMoNTEyKTticmVhaztjYXNlIDE6YS5kZXB0aEZ1bmMoNTE5KTticmVhaztjYXNlIDI6YS5kZXB0aEZ1bmMoNTEzKTticmVhaztjYXNlIDM6YS5kZXB0aEZ1bmMoNTE1KTticmVhaztjYXNlIDQ6YS5kZXB0aEZ1bmMoNTE0KTticmVhaztjYXNlIDU6YS5kZXB0aEZ1bmMoNTE4KTticmVhaztjYXNlIDY6YS5kZXB0aEZ1bmMoNTE2KTsKYnJlYWs7Y2FzZSA3OmEuZGVwdGhGdW5jKDUxNyk7YnJlYWs7ZGVmYXVsdDphLmRlcHRoRnVuYyg1MTUpfWVsc2UgYS5kZXB0aEZ1bmMoNTE1KTtMYT1WYX19LHNldExvY2tlZDpmdW5jdGlvbihWYSl7amE9VmF9LHNldENsZWFyOmZ1bmN0aW9uKFZhKXtuYiE9PVZhJiYoYS5jbGVhckRlcHRoKFZhKSxuYj1WYSl9LHJlc2V0OmZ1bmN0aW9uKCl7amE9ITE7bmI9TGE9R2E9bnVsbH19fSxoYT1uZXcgZnVuY3Rpb24oKXt2YXIgamE9ITEsR2E9bnVsbCxMYT1udWxsLG5iPW51bGwsVmE9bnVsbCxpYj1udWxsLGtiPW51bGwsUWE9bnVsbCxlYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKG1iKXtqYXx8KG1iP3ooMjk2MCk6RSgyOTYwKSl9LHNldE1hc2s6ZnVuY3Rpb24obWIpe0dhPT09bWJ8fGphfHwoYS5zdGVuY2lsTWFzayhtYiksR2E9bWIpfSxzZXRGdW5jOmZ1bmN0aW9uKG1iLHBiLHNiKXtpZihMYSE9PW1ifHxuYiE9PXBifHxWYSE9PXNiKWEuc3RlbmNpbEZ1bmMobWIscGIsCnNiKSxMYT1tYixuYj1wYixWYT1zYn0sc2V0T3A6ZnVuY3Rpb24obWIscGIsc2Ipe2lmKGliIT09bWJ8fGtiIT09cGJ8fFFhIT09c2IpYS5zdGVuY2lsT3AobWIscGIsc2IpLGliPW1iLGtiPXBiLFFhPXNifSxzZXRMb2NrZWQ6ZnVuY3Rpb24obWIpe2phPW1ifSxzZXRDbGVhcjpmdW5jdGlvbihtYil7ZWIhPT1tYiYmKGEuY2xlYXJTdGVuY2lsKG1iKSxlYj1tYil9LHJlc2V0OmZ1bmN0aW9uKCl7amE9ITE7ZWI9UWE9a2I9aWI9VmE9bmI9TGE9R2E9bnVsbH19fSxmYT1hLmdldFBhcmFtZXRlcigzNDkyMSkscmE9bmV3IFVpbnQ4QXJyYXkoZmEpLHBhPW5ldyBVaW50OEFycmF5KGZhKSxxYT1uZXcgVWludDhBcnJheShmYSksdWE9e30sb2E9bnVsbCx0YT1udWxsLEJhPW51bGwsVGE9bnVsbCxVYT1udWxsLENhPW51bGwsSGE9bnVsbCxEYT1udWxsLE1hPW51bGwsZGI9bnVsbCx0Yj0hMSxLYT1udWxsLGJiPW51bGwsamI9bnVsbCxFYj1udWxsLHhiPW51bGwsaWE9YS5nZXRQYXJhbWV0ZXIoMzU2NjEpLApuYT0hMTtmYT0wO2ZhPWEuZ2V0UGFyYW1ldGVyKDc5MzgpOy0xIT09ZmEuaW5kZXhPZigiV2ViR0wiKT8oZmE9cGFyc2VGbG9hdCgvXldlYkdMIChbMC05XSkvLmV4ZWMoZmEpWzFdKSxuYT0xPD1mYSk6LTEhPT1mYS5pbmRleE9mKCJPcGVuR0wgRVMiKSYmKGZhPXBhcnNlRmxvYXQoL15PcGVuR0wgRVMgKFswLTldKS8uZXhlYyhmYSlbMV0pLG5hPTI8PWZhKTt2YXIgemE9bnVsbCxKYT17fSxZYT1uZXcgcCxOYT1uZXcgcCxjYj17fTtjYlszNTUzXT1yKDM1NTMsMzU1MywxKTtjYlszNDA2N109cigzNDA2NywzNDA2OSw2KTtWLnNldENsZWFyKDAsMCwwLDEpO1cuc2V0Q2xlYXIoMSk7aGEuc2V0Q2xlYXIoMCk7eigyOTI5KTtXLnNldEZ1bmMoMyk7SighMSk7UCgxKTt6KDI4ODQpO0YoMCk7cmV0dXJue2J1ZmZlcnM6e2NvbG9yOlYsZGVwdGg6VyxzdGVuY2lsOmhhfSxpbml0QXR0cmlidXRlczpmdW5jdGlvbigpe2Zvcih2YXIgamE9MCxHYT1yYS5sZW5ndGg7amE8R2E7amErKylyYVtqYV09CjB9LGVuYWJsZUF0dHJpYnV0ZTpmdW5jdGlvbihqYSl7dihqYSwwKX0sZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcjp2LGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7Zm9yKHZhciBqYT0wLEdhPXBhLmxlbmd0aDtqYSE9PUdhOysramEpcGFbamFdIT09cmFbamFdJiYoYS5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoamEpLHBhW2phXT0wKX0sZW5hYmxlOnosZGlzYWJsZTpFLGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czpmdW5jdGlvbigpe2lmKG51bGw9PT1vYSYmKG9hPVtdLGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSIpfHxjLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSkpZm9yKHZhciBqYT1hLmdldFBhcmFtZXRlcigzNDQ2NyksR2E9MDtHYTxqYS5sZW5ndGg7R2ErKylvYS5wdXNoKGphW0dhXSk7CnJldHVybiBvYX0sdXNlUHJvZ3JhbTpmdW5jdGlvbihqYSl7cmV0dXJuIHRhIT09amE/KGEudXNlUHJvZ3JhbShqYSksdGE9amEsITApOiExfSxzZXRCbGVuZGluZzpGLHNldE1hdGVyaWFsOmZ1bmN0aW9uKGphLEdhKXsyPT09amEuc2lkZT9FKDI4ODQpOnooMjg4NCk7dmFyIExhPTE9PT1qYS5zaWRlO0dhJiYoTGE9IUxhKTtKKExhKTsxPT09amEuYmxlbmRpbmcmJiExPT09amEudHJhbnNwYXJlbnQ/RigwKTpGKGphLmJsZW5kaW5nLGphLmJsZW5kRXF1YXRpb24samEuYmxlbmRTcmMsamEuYmxlbmREc3QsamEuYmxlbmRFcXVhdGlvbkFscGhhLGphLmJsZW5kU3JjQWxwaGEsamEuYmxlbmREc3RBbHBoYSxqYS5wcmVtdWx0aXBsaWVkQWxwaGEpO1cuc2V0RnVuYyhqYS5kZXB0aEZ1bmMpO1cuc2V0VGVzdChqYS5kZXB0aFRlc3QpO1cuc2V0TWFzayhqYS5kZXB0aFdyaXRlKTtWLnNldE1hc2soamEuY29sb3JXcml0ZSk7R2E9amEuc3RlbmNpbFdyaXRlO2hhLnNldFRlc3QoR2EpO0dhJiYKKGhhLnNldEZ1bmMoamEuc3RlbmNpbEZ1bmMsamEuc3RlbmNpbFJlZixqYS5zdGVuY2lsTWFzayksaGEuc2V0T3AoamEuc3RlbmNpbEZhaWwsamEuc3RlbmNpbFpGYWlsLGphLnN0ZW5jaWxaUGFzcykpO1IoamEucG9seWdvbk9mZnNldCxqYS5wb2x5Z29uT2Zmc2V0RmFjdG9yLGphLnBvbHlnb25PZmZzZXRVbml0cyl9LHNldEZsaXBTaWRlZDpKLHNldEN1bGxGYWNlOlAsc2V0TGluZVdpZHRoOmZ1bmN0aW9uKGphKXtqYSE9PWpiJiYobmEmJmEubGluZVdpZHRoKGphKSxqYj1qYSl9LHNldFBvbHlnb25PZmZzZXQ6UixzZXRTY2lzc29yVGVzdDpmdW5jdGlvbihqYSl7amE/eigzMDg5KTpFKDMwODkpfSxhY3RpdmVUZXh0dXJlOlMsYmluZFRleHR1cmU6ZnVuY3Rpb24oamEsR2Epe251bGw9PT16YSYmUygpO3ZhciBMYT1KYVt6YV07dm9pZCAwPT09TGEmJihMYT17dHlwZTp2b2lkIDAsdGV4dHVyZTp2b2lkIDB9LEphW3phXT1MYSk7aWYoTGEudHlwZSE9PWphfHxMYS50ZXh0dXJlIT09CkdhKWEuYmluZFRleHR1cmUoamEsR2F8fGNiW2phXSksTGEudHlwZT1qYSxMYS50ZXh0dXJlPUdhfSxjb21wcmVzc2VkVGV4SW1hZ2UyRDpmdW5jdGlvbigpe3RyeXthLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChqYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGphKX19LHRleEltYWdlMkQ6ZnVuY3Rpb24oKXt0cnl7YS50ZXhJbWFnZTJELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChqYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGphKX19LHRleEltYWdlM0Q6ZnVuY3Rpb24oKXt0cnl7YS50ZXhJbWFnZTNELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChqYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGphKX19LHNjaXNzb3I6ZnVuY3Rpb24oamEpeyExPT09WWEuZXF1YWxzKGphKSYmKGEuc2Npc3NvcihqYS54LGphLnksamEueixqYS53KSxZYS5jb3B5KGphKSl9LHZpZXdwb3J0OmZ1bmN0aW9uKGphKXshMT09PQpOYS5lcXVhbHMoamEpJiYoYS52aWV3cG9ydChqYS54LGphLnksamEueixqYS53KSxOYS5jb3B5KGphKSl9LHJlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBqYT0wO2phPHBhLmxlbmd0aDtqYSsrKTE9PT1wYVtqYV0mJihhLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShqYSkscGFbamFdPTApO3VhPXt9O3phPW9hPW51bGw7SmE9e307YmI9S2E9VGE9dGE9bnVsbDtWLnJlc2V0KCk7Vy5yZXNldCgpO2hhLnJlc2V0KCl9fX1mdW5jdGlvbiBXbChhLGMsZSxnLHIsdix6KXtmdW5jdGlvbiBFKGlhLG5hKXtyZXR1cm4gYmI/bmV3IE9mZnNjcmVlbkNhbnZhcyhpYSxuYSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIil9ZnVuY3Rpb24gRihpYSxuYSx6YSxKYSl7dmFyIFlhPTE7aWYoaWEud2lkdGg+SmF8fGlhLmhlaWdodD5KYSlZYT1KYS9NYXRoLm1heChpYS53aWR0aCxpYS5oZWlnaHQpO2lmKDE+WWF8fCEwPT09bmEpe2lmKCJ1bmRlZmluZWQiIT09CnR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50JiZpYSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT09dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZpYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9PXR5cGVvZiBJbWFnZUJpdG1hcCYmaWEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcClyZXR1cm4gSmE9bmE/aGIuZmxvb3JQb3dlck9mVHdvOk1hdGguZmxvb3IsbmE9SmEoWWEqaWEud2lkdGgpLFlhPUphKFlhKmlhLmhlaWdodCksdm9pZCAwPT09S2EmJihLYT1FKG5hLFlhKSksemE9emE/RShuYSxZYSk6S2EsemEud2lkdGg9bmEsemEuaGVpZ2h0PVlhLHphLmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKGlhLDAsMCxuYSxZYSksY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoIitpYS53aWR0aCsieCIraWEuaGVpZ2h0KyIpIHRvICgiK25hKyJ4IitZYSsiKS4iKSwKemE7ImRhdGEiaW4gaWEmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogSW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoIitpYS53aWR0aCsieCIraWEuaGVpZ2h0KyIpLiIpfXJldHVybiBpYX1mdW5jdGlvbiBKKGlhKXtyZXR1cm4gaGIuaXNQb3dlck9mVHdvKGlhLndpZHRoKSYmaGIuaXNQb3dlck9mVHdvKGlhLmhlaWdodCl9ZnVuY3Rpb24gUChpYSl7cmV0dXJuIHIuaXNXZWJHTDI/ITE6MTAwMSE9PWlhLndyYXBTfHwxMDAxIT09aWEud3JhcFR8fDEwMDMhPT1pYS5taW5GaWx0ZXImJjEwMDYhPT1pYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUihpYSxuYSl7cmV0dXJuIGlhLmdlbmVyYXRlTWlwbWFwcyYmbmEmJjEwMDMhPT1pYS5taW5GaWx0ZXImJjEwMDYhPT1pYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUyhpYSxuYSx6YSxKYSl7YS5nZW5lcmF0ZU1pcG1hcChpYSk7Zy5nZXQobmEpLl9fbWF4TWlwTGV2ZWw9TWF0aC5sb2coTWF0aC5tYXgoemEsSmEpKSpNYXRoLkxPRzJFfQpmdW5jdGlvbiBWKGlhLG5hKXtpZighci5pc1dlYkdMMilyZXR1cm4gaWE7dmFyIHphPWlhOzY0MDM9PT1pYSYmKDUxMjY9PT1uYSYmKHphPTMzMzI2KSw1MTMxPT09bmEmJih6YT0zMzMyNSksNTEyMT09PW5hJiYoemE9MzMzMjEpKTs2NDA3PT09aWEmJig1MTI2PT09bmEmJih6YT0zNDgzNyksNTEzMT09PW5hJiYoemE9MzQ4NDMpLDUxMjE9PT1uYSYmKHphPTMyODQ5KSk7NjQwOD09PWlhJiYoNTEyNj09PW5hJiYoemE9MzQ4MzYpLDUxMzE9PT1uYSYmKHphPTM0ODQyKSw1MTIxPT09bmEmJih6YT0zMjg1NikpOzMzMzI1PT09emF8fDMzMzI2PT09emF8fDM0ODQyPT09emF8fDM0ODM2PT09emE/Yy5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTooMzQ4NDM9PT16YXx8MzQ4Mzc9PT16YSkmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgUkdCQSBpbnN0ZWFkLiIpOwpyZXR1cm4gemF9ZnVuY3Rpb24gVyhpYSl7cmV0dXJuIDEwMDM9PT1pYXx8MTAwND09PWlhfHwxMDA1PT09aWE/OTcyODo5NzI5fWZ1bmN0aW9uIGhhKGlhKXtpYT1pYS50YXJnZXQ7aWEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaGEpO3JhKGlhKTtpYS5pc1ZpZGVvVGV4dHVyZSYmdGIuZGVsZXRlKGlhKTt6Lm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIGZhKGlhKXtpYT1pYS50YXJnZXQ7aWEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZmEpO3BhKGlhKTt6Lm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIHJhKGlhKXt2YXIgbmE9Zy5nZXQoaWEpO3ZvaWQgMCE9PW5hLl9fd2ViZ2xJbml0JiYoYS5kZWxldGVUZXh0dXJlKG5hLl9fd2ViZ2xUZXh0dXJlKSxnLnJlbW92ZShpYSkpfWZ1bmN0aW9uIHBhKGlhKXt2YXIgbmE9Zy5nZXQoaWEpLHphPWcuZ2V0KGlhLnRleHR1cmUpO2lmKGlhKXt2b2lkIDAhPT16YS5fX3dlYmdsVGV4dHVyZSYmYS5kZWxldGVUZXh0dXJlKHphLl9fd2ViZ2xUZXh0dXJlKTsKaWEuZGVwdGhUZXh0dXJlJiZpYS5kZXB0aFRleHR1cmUuZGlzcG9zZSgpO2lmKGlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKWZvcih6YT0wOzY+emE7emErKylhLmRlbGV0ZUZyYW1lYnVmZmVyKG5hLl9fd2ViZ2xGcmFtZWJ1ZmZlclt6YV0pLG5hLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmYS5kZWxldGVSZW5kZXJidWZmZXIobmEuX193ZWJnbERlcHRoYnVmZmVyW3phXSk7ZWxzZSBhLmRlbGV0ZUZyYW1lYnVmZmVyKG5hLl9fd2ViZ2xGcmFtZWJ1ZmZlciksbmEuX193ZWJnbERlcHRoYnVmZmVyJiZhLmRlbGV0ZVJlbmRlcmJ1ZmZlcihuYS5fX3dlYmdsRGVwdGhidWZmZXIpO2cucmVtb3ZlKGlhLnRleHR1cmUpO2cucmVtb3ZlKGlhKX19ZnVuY3Rpb24gcWEoaWEsbmEpe3ZhciB6YT1nLmdldChpYSk7aWEuaXNWaWRlb1RleHR1cmUmJmRiKGlhKTtpZigwPGlhLnZlcnNpb24mJnphLl9fdmVyc2lvbiE9PWlhLnZlcnNpb24pe3ZhciBKYT1pYS5pbWFnZTtpZih2b2lkIDA9PT1KYSljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpOwplbHNlIGlmKCExPT09SmEuY29tcGxldGUpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlIik7ZWxzZXtUYSh6YSxpYSxuYSk7cmV0dXJufX1lLmFjdGl2ZVRleHR1cmUoMzM5ODQrbmEpO2UuYmluZFRleHR1cmUoMzU1Myx6YS5fX3dlYmdsVGV4dHVyZSl9ZnVuY3Rpb24gdWEoaWEsbmEpe2lmKDY9PT1pYS5pbWFnZS5sZW5ndGgpe3ZhciB6YT1nLmdldChpYSk7aWYoMDxpYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1pYS52ZXJzaW9uKXtCYSh6YSxpYSk7ZS5hY3RpdmVUZXh0dXJlKDMzOTg0K25hKTtlLmJpbmRUZXh0dXJlKDM0MDY3LHphLl9fd2ViZ2xUZXh0dXJlKTthLnBpeGVsU3RvcmVpKDM3NDQwLGlhLmZsaXBZKTt2YXIgSmE9aWEmJmlhLmlzQ29tcHJlc3NlZFRleHR1cmU7bmE9aWEuaW1hZ2VbMF0mJmlhLmltYWdlWzBdLmlzRGF0YVRleHR1cmU7Zm9yKHZhciBZYT1bXSwKTmE9MDs2Pk5hO05hKyspWWFbTmFdPUphfHxuYT9uYT9pYS5pbWFnZVtOYV0uaW1hZ2U6aWEuaW1hZ2VbTmFdOkYoaWEuaW1hZ2VbTmFdLCExLCEwLHIubWF4Q3ViZW1hcFNpemUpO3ZhciBjYj1ZYVswXSxqYT1KKGNiKXx8ci5pc1dlYkdMMixHYT12LmNvbnZlcnQoaWEuZm9ybWF0KSxMYT12LmNvbnZlcnQoaWEudHlwZSksbmI9VihHYSxMYSk7dGEoMzQwNjcsaWEsamEpO2lmKEphKXtmb3IoTmE9MDs2Pk5hO05hKyspe3ZhciBWYT1ZYVtOYV0ubWlwbWFwcztmb3IoSmE9MDtKYTxWYS5sZW5ndGg7SmErKyl7dmFyIGliPVZhW0phXTsxMDIzIT09aWEuZm9ybWF0JiYxMDIyIT09aWEuZm9ybWF0Py0xPGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihHYSk/ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNDA2OStOYSxKYSxuYixpYi53aWR0aCxpYi5oZWlnaHQsMCxpYi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik6CmUudGV4SW1hZ2UyRCgzNDA2OStOYSxKYSxuYixpYi53aWR0aCxpYi5oZWlnaHQsMCxHYSxMYSxpYi5kYXRhKX19emEuX19tYXhNaXBMZXZlbD1WYS5sZW5ndGgtMX1lbHNle1ZhPWlhLm1pcG1hcHM7Zm9yKE5hPTA7Nj5OYTtOYSsrKWlmKG5hKWZvcihlLnRleEltYWdlMkQoMzQwNjkrTmEsMCxuYixZYVtOYV0ud2lkdGgsWWFbTmFdLmhlaWdodCwwLEdhLExhLFlhW05hXS5kYXRhKSxKYT0wO0phPFZhLmxlbmd0aDtKYSsrKWliPVZhW0phXSxpYj1pYi5pbWFnZVtOYV0uaW1hZ2UsZS50ZXhJbWFnZTJEKDM0MDY5K05hLEphKzEsbmIsaWIud2lkdGgsaWIuaGVpZ2h0LDAsR2EsTGEsaWIuZGF0YSk7ZWxzZSBmb3IoZS50ZXhJbWFnZTJEKDM0MDY5K05hLDAsbmIsR2EsTGEsWWFbTmFdKSxKYT0wO0phPFZhLmxlbmd0aDtKYSsrKWliPVZhW0phXSxlLnRleEltYWdlMkQoMzQwNjkrTmEsSmErMSxuYixHYSxMYSxpYi5pbWFnZVtOYV0pO3phLl9fbWF4TWlwTGV2ZWw9VmEubGVuZ3RofVIoaWEsCmphKSYmUygzNDA2NyxpYSxjYi53aWR0aCxjYi5oZWlnaHQpO3phLl9fdmVyc2lvbj1pYS52ZXJzaW9uO2lmKGlhLm9uVXBkYXRlKWlhLm9uVXBkYXRlKGlhKX1lbHNlIGUuYWN0aXZlVGV4dHVyZSgzMzk4NCtuYSksZS5iaW5kVGV4dHVyZSgzNDA2Nyx6YS5fX3dlYmdsVGV4dHVyZSl9fWZ1bmN0aW9uIG9hKGlhLG5hKXtlLmFjdGl2ZVRleHR1cmUoMzM5ODQrbmEpO2UuYmluZFRleHR1cmUoMzQwNjcsZy5nZXQoaWEpLl9fd2ViZ2xUZXh0dXJlKX1mdW5jdGlvbiB0YShpYSxuYSx6YSl7emE/KGEudGV4UGFyYW1ldGVyaShpYSwxMDI0Mix2LmNvbnZlcnQobmEud3JhcFMpKSxhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDMsdi5jb252ZXJ0KG5hLndyYXBUKSksMzI4NzkhPT1pYSYmMzU4NjYhPT1pYXx8YS50ZXhQYXJhbWV0ZXJpKGlhLDMyODgyLHYuY29udmVydChuYS53cmFwUikpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MCx2LmNvbnZlcnQobmEubWFnRmlsdGVyKSksYS50ZXhQYXJhbWV0ZXJpKGlhLAoxMDI0MSx2LmNvbnZlcnQobmEubWluRmlsdGVyKSkpOihhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDIsMzMwNzEpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MywzMzA3MSksMzI4NzkhPT1pYSYmMzU4NjYhPT1pYXx8YS50ZXhQYXJhbWV0ZXJpKGlhLDMyODgyLDMzMDcxKSwxMDAxPT09bmEud3JhcFMmJjEwMDE9PT1uYS53cmFwVHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MCxXKG5hLm1hZ0ZpbHRlcikpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MSxXKG5hLm1pbkZpbHRlcikpLDEwMDMhPT1uYS5taW5GaWx0ZXImJjEwMDYhPT1uYS5taW5GaWx0ZXImJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLiIpKTsKISh6YT1jLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpfHwxMDE1PT09bmEudHlwZSYmbnVsbD09PWMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKXx8MTAxNj09PW5hLnR5cGUmJm51bGw9PT0oci5pc1dlYkdMMnx8Yy5nZXQoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIikpfHwhKDE8bmEuYW5pc290cm9weXx8Zy5nZXQobmEpLl9fY3VycmVudEFuaXNvdHJvcHkpfHwoYS50ZXhQYXJhbWV0ZXJmKGlhLHphLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULE1hdGgubWluKG5hLmFuaXNvdHJvcHksci5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxnLmdldChuYSkuX19jdXJyZW50QW5pc290cm9weT1uYS5hbmlzb3Ryb3B5KX1mdW5jdGlvbiBCYShpYSxuYSl7dm9pZCAwPT09aWEuX193ZWJnbEluaXQmJihpYS5fX3dlYmdsSW5pdD0hMCxuYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixoYSksaWEuX193ZWJnbFRleHR1cmU9YS5jcmVhdGVUZXh0dXJlKCksCnoubWVtb3J5LnRleHR1cmVzKyspfWZ1bmN0aW9uIFRhKGlhLG5hLHphKXt2YXIgSmE9MzU1MztuYS5pc0RhdGFUZXh0dXJlMkRBcnJheSYmKEphPTM1ODY2KTtuYS5pc0RhdGFUZXh0dXJlM0QmJihKYT0zMjg3OSk7QmEoaWEsbmEpO2UuYWN0aXZlVGV4dHVyZSgzMzk4NCt6YSk7ZS5iaW5kVGV4dHVyZShKYSxpYS5fX3dlYmdsVGV4dHVyZSk7YS5waXhlbFN0b3JlaSgzNzQ0MCxuYS5mbGlwWSk7YS5waXhlbFN0b3JlaSgzNzQ0MSxuYS5wcmVtdWx0aXBseUFscGhhKTthLnBpeGVsU3RvcmVpKDMzMTcsbmEudW5wYWNrQWxpZ25tZW50KTt6YT1QKG5hKSYmITE9PT1KKG5hLmltYWdlKTt6YT1GKG5hLmltYWdlLHphLCExLHIubWF4VGV4dHVyZVNpemUpO3ZhciBZYT1KKHphKXx8ci5pc1dlYkdMMixOYT12LmNvbnZlcnQobmEuZm9ybWF0KSxjYj12LmNvbnZlcnQobmEudHlwZSksamE9VihOYSxjYik7dGEoSmEsbmEsWWEpO3ZhciBHYT1uYS5taXBtYXBzO2lmKG5hLmlzRGVwdGhUZXh0dXJlKXtqYT0KNjQwMjtpZigxMDE1PT09bmEudHlwZSl7aWYoIXIuaXNXZWJHTDIpdGhyb3cgRXJyb3IoIkZsb2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAiKTtqYT0zNjAxMn1lbHNlIHIuaXNXZWJHTDImJihqYT0zMzE4OSk7MTAyNj09PW5hLmZvcm1hdCYmNjQwMj09PWphJiYxMDEyIT09bmEudHlwZSYmMTAxNCE9PW5hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4iKSxuYS50eXBlPTEwMTIsY2I9di5jb252ZXJ0KG5hLnR5cGUpKTsxMDI3PT09bmEuZm9ybWF0JiYoamE9MzQwNDEsMTAyMCE9PW5hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksbmEudHlwZT0xMDIwLGNiPQp2LmNvbnZlcnQobmEudHlwZSkpKTtlLnRleEltYWdlMkQoMzU1MywwLGphLHphLndpZHRoLHphLmhlaWdodCwwLE5hLGNiLG51bGwpfWVsc2UgaWYobmEuaXNEYXRhVGV4dHVyZSlpZigwPEdhLmxlbmd0aCYmWWEpe2Zvcih2YXIgTGE9MCxuYj1HYS5sZW5ndGg7TGE8bmI7TGErKylKYT1HYVtMYV0sZS50ZXhJbWFnZTJEKDM1NTMsTGEsamEsSmEud2lkdGgsSmEuaGVpZ2h0LDAsTmEsY2IsSmEuZGF0YSk7bmEuZ2VuZXJhdGVNaXBtYXBzPSExO2lhLl9fbWF4TWlwTGV2ZWw9R2EubGVuZ3RoLTF9ZWxzZSBlLnRleEltYWdlMkQoMzU1MywwLGphLHphLndpZHRoLHphLmhlaWdodCwwLE5hLGNiLHphLmRhdGEpLGlhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKG5hLmlzQ29tcHJlc3NlZFRleHR1cmUpe0xhPTA7Zm9yKG5iPUdhLmxlbmd0aDtMYTxuYjtMYSsrKUphPUdhW0xhXSwxMDIzIT09bmEuZm9ybWF0JiYxMDIyIT09bmEuZm9ybWF0Py0xPGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihOYSk/CmUuY29tcHJlc3NlZFRleEltYWdlMkQoMzU1MyxMYSxqYSxKYS53aWR0aCxKYS5oZWlnaHQsMCxKYS5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTplLnRleEltYWdlMkQoMzU1MyxMYSxqYSxKYS53aWR0aCxKYS5oZWlnaHQsMCxOYSxjYixKYS5kYXRhKTtpYS5fX21heE1pcExldmVsPUdhLmxlbmd0aC0xfWVsc2UgaWYobmEuaXNEYXRhVGV4dHVyZTJEQXJyYXkpZS50ZXhJbWFnZTNEKDM1ODY2LDAsamEsemEud2lkdGgsemEuaGVpZ2h0LHphLmRlcHRoLDAsTmEsY2IsemEuZGF0YSksaWEuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYobmEuaXNEYXRhVGV4dHVyZTNEKWUudGV4SW1hZ2UzRCgzMjg3OSwwLGphLHphLndpZHRoLHphLmhlaWdodCx6YS5kZXB0aCwwLE5hLGNiLHphLmRhdGEpLGlhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKDA8CkdhLmxlbmd0aCYmWWEpe0xhPTA7Zm9yKG5iPUdhLmxlbmd0aDtMYTxuYjtMYSsrKUphPUdhW0xhXSxlLnRleEltYWdlMkQoMzU1MyxMYSxqYSxOYSxjYixKYSk7bmEuZ2VuZXJhdGVNaXBtYXBzPSExO2lhLl9fbWF4TWlwTGV2ZWw9R2EubGVuZ3RoLTF9ZWxzZSBlLnRleEltYWdlMkQoMzU1MywwLGphLE5hLGNiLHphKSxpYS5fX21heE1pcExldmVsPTA7UihuYSxZYSkmJlMoMzU1MyxuYSx6YS53aWR0aCx6YS5oZWlnaHQpO2lhLl9fdmVyc2lvbj1uYS52ZXJzaW9uO2lmKG5hLm9uVXBkYXRlKW5hLm9uVXBkYXRlKG5hKX1mdW5jdGlvbiBVYShpYSxuYSx6YSxKYSl7dmFyIFlhPXYuY29udmVydChuYS50ZXh0dXJlLmZvcm1hdCksTmE9di5jb252ZXJ0KG5hLnRleHR1cmUudHlwZSksY2I9VihZYSxOYSk7ZS50ZXhJbWFnZTJEKEphLDAsY2IsbmEud2lkdGgsbmEuaGVpZ2h0LDAsWWEsTmEsbnVsbCk7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaWEpO2EuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsCnphLEphLGcuZ2V0KG5hLnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlLDApO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIENhKGlhLG5hLHphKXthLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsaWEpO2lmKG5hLmRlcHRoQnVmZmVyJiYhbmEuc3RlbmNpbEJ1ZmZlcil6YT8oemE9TWEobmEpLGEucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHphLDMzMTg5LG5hLndpZHRoLG5hLmhlaWdodCkpOmEucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSwzMzE4OSxuYS53aWR0aCxuYS5oZWlnaHQpLGEuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsaWEpO2Vsc2UgaWYobmEuZGVwdGhCdWZmZXImJm5hLnN0ZW5jaWxCdWZmZXIpemE/KHphPU1hKG5hKSxhLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSx6YSwzNTA1NixuYS53aWR0aCxuYS5oZWlnaHQpKTphLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoMzYxNjEsMzQwNDEsCm5hLndpZHRoLG5hLmhlaWdodCksYS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzMzMwNiwzNjE2MSxpYSk7ZWxzZXtpYT12LmNvbnZlcnQobmEudGV4dHVyZS5mb3JtYXQpO3ZhciBKYT12LmNvbnZlcnQobmEudGV4dHVyZS50eXBlKTtpYT1WKGlhLEphKTt6YT8oemE9TWEobmEpLGEucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHphLGlhLG5hLndpZHRoLG5hLmhlaWdodCkpOmEucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxpYSxuYS53aWR0aCxuYS5oZWlnaHQpfWEuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKX1mdW5jdGlvbiBIYShpYSxuYSl7aWYobmEmJm5hLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKXRocm93IEVycm9yKCJEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkIik7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaWEpO2lmKCFuYS5kZXB0aFRleHR1cmV8fCFuYS5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpdGhyb3cgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTsKZy5nZXQobmEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSYmbmEuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09bmEud2lkdGgmJm5hLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQ9PT1uYS5oZWlnaHR8fChuYS5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGg9bmEud2lkdGgsbmEuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1uYS5oZWlnaHQsbmEuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlPSEwKTtxYShuYS5kZXB0aFRleHR1cmUsMCk7aWE9Zy5nZXQobmEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZigxMDI2PT09bmEuZGVwdGhUZXh0dXJlLmZvcm1hdClhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDk2LDM1NTMsaWEsMCk7ZWxzZSBpZigxMDI3PT09bmEuZGVwdGhUZXh0dXJlLmZvcm1hdClhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsaWEsMCk7ZWxzZSB0aHJvdyBFcnJvcigiVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0Iik7Cn1mdW5jdGlvbiBEYShpYSl7dmFyIG5hPWcuZ2V0KGlhKSx6YT0hMD09PWlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlO2lmKGlhLmRlcHRoVGV4dHVyZSl7aWYoemEpdGhyb3cgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7SGEobmEuX193ZWJnbEZyYW1lYnVmZmVyLGlhKX1lbHNlIGlmKHphKWZvcihuYS5fX3dlYmdsRGVwdGhidWZmZXI9W10semE9MDs2PnphO3phKyspYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbmEuX193ZWJnbEZyYW1lYnVmZmVyW3phXSksbmEuX193ZWJnbERlcHRoYnVmZmVyW3phXT1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLENhKG5hLl9fd2ViZ2xEZXB0aGJ1ZmZlclt6YV0saWEpO2Vsc2UgYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbmEuX193ZWJnbEZyYW1lYnVmZmVyKSxuYS5fX3dlYmdsRGVwdGhidWZmZXI9YS5jcmVhdGVSZW5kZXJidWZmZXIoKSxDYShuYS5fX3dlYmdsRGVwdGhidWZmZXIsCmlhKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKX1mdW5jdGlvbiBNYShpYSl7cmV0dXJuIHIuaXNXZWJHTDImJmlhLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9NYXRoLm1pbihyLm1heFNhbXBsZXMsaWEuc2FtcGxlcyk6MH1mdW5jdGlvbiBkYihpYSl7dmFyIG5hPXoucmVuZGVyLmZyYW1lO3RiLmdldChpYSkhPT1uYSYmKHRiLnNldChpYSxuYSksaWEudXBkYXRlKCkpfXZhciB0Yj1uZXcgV2Vha01hcCxLYSxiYj0idW5kZWZpbmVkIiE9PXR5cGVvZiBPZmZzY3JlZW5DYW52YXMsamI9MCxFYj0hMSx4Yj0hMTt0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQ9ZnVuY3Rpb24oKXt2YXIgaWE9amI7aWE+PXIubWF4VGV4dHVyZXMmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK2lhKyIgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICIrci5tYXhUZXh0dXJlcyk7amIrPTE7cmV0dXJuIGlhfTt0aGlzLnJlc2V0VGV4dHVyZVVuaXRzPQpmdW5jdGlvbigpe2piPTB9O3RoaXMuc2V0VGV4dHVyZTJEPXFhO3RoaXMuc2V0VGV4dHVyZTJEQXJyYXk9ZnVuY3Rpb24oaWEsbmEpe3ZhciB6YT1nLmdldChpYSk7MDxpYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1pYS52ZXJzaW9uP1RhKHphLGlhLG5hKTooZS5hY3RpdmVUZXh0dXJlKDMzOTg0K25hKSxlLmJpbmRUZXh0dXJlKDM1ODY2LHphLl9fd2ViZ2xUZXh0dXJlKSl9O3RoaXMuc2V0VGV4dHVyZTNEPWZ1bmN0aW9uKGlhLG5hKXt2YXIgemE9Zy5nZXQoaWEpOzA8aWEudmVyc2lvbiYmemEuX192ZXJzaW9uIT09aWEudmVyc2lvbj9UYSh6YSxpYSxuYSk6KGUuYWN0aXZlVGV4dHVyZSgzMzk4NCtuYSksZS5iaW5kVGV4dHVyZSgzMjg3OSx6YS5fX3dlYmdsVGV4dHVyZSkpfTt0aGlzLnNldFRleHR1cmVDdWJlPXVhO3RoaXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljPW9hO3RoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oaWEpe3ZhciBuYT1nLmdldChpYSksemE9Zy5nZXQoaWEudGV4dHVyZSk7CmlhLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGZhKTt6YS5fX3dlYmdsVGV4dHVyZT1hLmNyZWF0ZVRleHR1cmUoKTt6Lm1lbW9yeS50ZXh0dXJlcysrO3ZhciBKYT0hMD09PWlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlLFlhPSEwPT09aWEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LE5hPUooaWEpfHxyLmlzV2ViR0wyO2lmKEphKWZvcihuYS5fX3dlYmdsRnJhbWVidWZmZXI9W10sWWE9MDs2PllhO1lhKyspbmEuX193ZWJnbEZyYW1lYnVmZmVyW1lhXT1hLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ZWxzZSBpZihuYS5fX3dlYmdsRnJhbWVidWZmZXI9YS5jcmVhdGVGcmFtZWJ1ZmZlcigpLFlhKWlmKHIuaXNXZWJHTDIpe25hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj1hLmNyZWF0ZUZyYW1lYnVmZmVyKCk7bmEuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyPWEuY3JlYXRlUmVuZGVyYnVmZmVyKCk7YS5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG5hLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcik7CllhPXYuY29udmVydChpYS50ZXh0dXJlLmZvcm1hdCk7dmFyIGNiPXYuY29udmVydChpYS50ZXh0dXJlLnR5cGUpO1lhPVYoWWEsY2IpO2NiPU1hKGlhKTthLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxjYixZYSxpYS53aWR0aCxpYS5oZWlnaHQpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG5hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7YS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCwzNjE2MSxuYS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpO2EuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKTtpYS5kZXB0aEJ1ZmZlciYmKG5hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLENhKG5hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcixpYSwhMCkpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7CmlmKEphKXtlLmJpbmRUZXh0dXJlKDM0MDY3LHphLl9fd2ViZ2xUZXh0dXJlKTt0YSgzNDA2NyxpYS50ZXh0dXJlLE5hKTtmb3IoWWE9MDs2PllhO1lhKyspVWEobmEuX193ZWJnbEZyYW1lYnVmZmVyW1lhXSxpYSwzNjA2NCwzNDA2OStZYSk7UihpYS50ZXh0dXJlLE5hKSYmUygzNDA2NyxpYS50ZXh0dXJlLGlhLndpZHRoLGlhLmhlaWdodCk7ZS5iaW5kVGV4dHVyZSgzNDA2NyxudWxsKX1lbHNlIGUuYmluZFRleHR1cmUoMzU1Myx6YS5fX3dlYmdsVGV4dHVyZSksdGEoMzU1MyxpYS50ZXh0dXJlLE5hKSxVYShuYS5fX3dlYmdsRnJhbWVidWZmZXIsaWEsMzYwNjQsMzU1MyksUihpYS50ZXh0dXJlLE5hKSYmUygzNTUzLGlhLnRleHR1cmUsaWEud2lkdGgsaWEuaGVpZ2h0KSxlLmJpbmRUZXh0dXJlKDM1NTMsbnVsbCk7aWEuZGVwdGhCdWZmZXImJkRhKGlhKX07dGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24oaWEpe3ZhciBuYT1pYS50ZXh0dXJlLHphPUooaWEpfHwKci5pc1dlYkdMMjtpZihSKG5hLHphKSl7emE9aWEuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/MzQwNjc6MzU1Mzt2YXIgSmE9Zy5nZXQobmEpLl9fd2ViZ2xUZXh0dXJlO2UuYmluZFRleHR1cmUoemEsSmEpO1MoemEsbmEsaWEud2lkdGgsaWEuaGVpZ2h0KTtlLmJpbmRUZXh0dXJlKHphLG51bGwpfX07dGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1mdW5jdGlvbihpYSl7aWYoaWEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KWlmKHIuaXNXZWJHTDIpe3ZhciBuYT1nLmdldChpYSk7YS5iaW5kRnJhbWVidWZmZXIoMzYwMDgsbmEuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxuYS5fX3dlYmdsRnJhbWVidWZmZXIpO25hPWlhLndpZHRoO3ZhciB6YT1pYS5oZWlnaHQsSmE9MTYzODQ7aWEuZGVwdGhCdWZmZXImJihKYXw9MjU2KTtpYS5zdGVuY2lsQnVmZmVyJiYoSmF8PTEwMjQpO2EuYmxpdEZyYW1lYnVmZmVyKDAsCjAsbmEsemEsMCwwLG5hLHphLEphLDk3MjgpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIil9O3RoaXMuc2FmZVNldFRleHR1cmUyRD1mdW5jdGlvbihpYSxuYSl7aWEmJmlhLmlzV2ViR0xSZW5kZXJUYXJnZXQmJighMT09PUViJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlMkQ6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksRWI9ITApLGlhPWlhLnRleHR1cmUpO3FhKGlhLG5hKX07dGhpcy5zYWZlU2V0VGV4dHVyZUN1YmU9ZnVuY3Rpb24oaWEsbmEpe2lhJiZpYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSYmKCExPT09eGImJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmVDdWJlOiBkb24ndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksCnhiPSEwKSxpYT1pYS50ZXh0dXJlKTtpYSYmaWEuaXNDdWJlVGV4dHVyZXx8QXJyYXkuaXNBcnJheShpYS5pbWFnZSkmJjY9PT1pYS5pbWFnZS5sZW5ndGg/dWEoaWEsbmEpOm9hKGlhLG5hKX19ZnVuY3Rpb24gd2ooYSxjLGUpe3JldHVybntjb252ZXJ0OmZ1bmN0aW9uKGcpe2lmKDFFMz09PWcpcmV0dXJuIDEwNDk3O2lmKDEwMDE9PT1nKXJldHVybiAzMzA3MTtpZigxMDAyPT09ZylyZXR1cm4gMzM2NDg7aWYoMTAwMz09PWcpcmV0dXJuIDk3Mjg7aWYoMTAwND09PWcpcmV0dXJuIDk5ODQ7aWYoMTAwNT09PWcpcmV0dXJuIDk5ODY7aWYoMTAwNj09PWcpcmV0dXJuIDk3Mjk7aWYoMTAwNz09PWcpcmV0dXJuIDk5ODU7aWYoMTAwOD09PWcpcmV0dXJuIDk5ODc7aWYoMTAwOT09PWcpcmV0dXJuIDUxMjE7aWYoMTAxNz09PWcpcmV0dXJuIDMyODE5O2lmKDEwMTg9PT1nKXJldHVybiAzMjgyMDtpZigxMDE5PT09ZylyZXR1cm4gMzM2MzU7aWYoMTAxMD09PWcpcmV0dXJuIDUxMjA7aWYoMTAxMT09PQpnKXJldHVybiA1MTIyO2lmKDEwMTI9PT1nKXJldHVybiA1MTIzO2lmKDEwMTM9PT1nKXJldHVybiA1MTI0O2lmKDEwMTQ9PT1nKXJldHVybiA1MTI1O2lmKDEwMTU9PT1nKXJldHVybiA1MTI2O2lmKDEwMTY9PT1nKXtpZihlLmlzV2ViR0wyKXJldHVybiA1MTMxO3ZhciByPWMuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Iik7aWYobnVsbCE9PXIpcmV0dXJuIHIuSEFMRl9GTE9BVF9PRVN9aWYoMTAyMT09PWcpcmV0dXJuIDY0MDY7aWYoMTAyMj09PWcpcmV0dXJuIDY0MDc7aWYoMTAyMz09PWcpcmV0dXJuIDY0MDg7aWYoMTAyND09PWcpcmV0dXJuIDY0MDk7aWYoMTAyNT09PWcpcmV0dXJuIDY0MTA7aWYoMTAyNj09PWcpcmV0dXJuIDY0MDI7aWYoMTAyNz09PWcpcmV0dXJuIDM0MDQxO2lmKDEwMjg9PT1nKXJldHVybiA2NDAzO2lmKDEwMD09PWcpcmV0dXJuIDMyNzc0O2lmKDEwMT09PWcpcmV0dXJuIDMyNzc4O2lmKDEwMj09PWcpcmV0dXJuIDMyNzc5O2lmKDIwMD09PWcpcmV0dXJuIDA7CmlmKDIwMT09PWcpcmV0dXJuIDE7aWYoMjAyPT09ZylyZXR1cm4gNzY4O2lmKDIwMz09PWcpcmV0dXJuIDc2OTtpZigyMDQ9PT1nKXJldHVybiA3NzA7aWYoMjA1PT09ZylyZXR1cm4gNzcxO2lmKDIwNj09PWcpcmV0dXJuIDc3MjtpZigyMDc9PT1nKXJldHVybiA3NzM7aWYoMjA4PT09ZylyZXR1cm4gNzc0O2lmKDIwOT09PWcpcmV0dXJuIDc3NTtpZigyMTA9PT1nKXJldHVybiA3NzY7aWYoMzM3NzY9PT1nfHwzMzc3Nz09PWd8fDMzNzc4PT09Z3x8MzM3Nzk9PT1nKWlmKHI9Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIiksbnVsbCE9PXIpe2lmKDMzNzc2PT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO2lmKDMzNzc3PT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDtpZigzMzc3OD09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7aWYoMzM3Nzk9PT1nKXJldHVybiByLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUfWlmKDM1ODQwPT09Cmd8fDM1ODQxPT09Z3x8MzU4NDI9PT1nfHwzNTg0Mz09PWcpaWYocj1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIiksbnVsbCE9PXIpe2lmKDM1ODQwPT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKDM1ODQxPT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKDM1ODQyPT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZigzNTg0Mz09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9aWYoMzYxOTY9PT1nJiYocj1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEiKSxudWxsIT09cikpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtpZigzNzgwOD09PWd8fDM3ODA5PT09Z3x8Mzc4MTA9PT1nfHwzNzgxMT09PWd8fDM3ODEyPT09Z3x8Mzc4MTM9PT1nfHwzNzgxND09PWd8fDM3ODE1PT09Z3x8Mzc4MTY9PT0KZ3x8Mzc4MTc9PT1nfHwzNzgxOD09PWd8fDM3ODE5PT09Z3x8Mzc4MjA9PT1nfHwzNzgyMT09PWcpaWYocj1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxudWxsIT09cilyZXR1cm4gZztpZigxMDM9PT1nfHwxMDQ9PT1nKXtpZihlLmlzV2ViR0wyKXtpZigxMDM9PT1nKXJldHVybiAzMjc3NTtpZigxMDQ9PT1nKXJldHVybiAzMjc3Nn1yPWMuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iik7aWYobnVsbCE9PXIpe2lmKDEwMz09PWcpcmV0dXJuIHIuTUlOX0VYVDtpZigxMDQ9PT1nKXJldHVybiByLk1BWF9FWFR9fWlmKDEwMjA9PT1nKXtpZihlLmlzV2ViR0wyKXJldHVybiAzNDA0MjtyPWMuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIik7aWYobnVsbCE9PXIpcmV0dXJuIHIuVU5TSUdORURfSU5UXzI0XzhfV0VCR0x9cmV0dXJuIDB9fX1mdW5jdGlvbiB1ZSgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikdyb3VwIn1mdW5jdGlvbiB2ZihhKXt2Yi5jYWxsKHRoaXMpOwp0aGlzLmNhbWVyYXM9YXx8W119ZnVuY3Rpb24geGooYSxjLGUpe3lqLnNldEZyb21NYXRyaXhQb3NpdGlvbihjLm1hdHJpeFdvcmxkKTt6ai5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCk7dmFyIGc9eWouZGlzdGFuY2VUbyh6aikscj1jLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsdj1lLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsej1yWzE0XS8oclsxMF0tMSk7ZT1yWzE0XS8oclsxMF0rMSk7dmFyIEU9KHJbOV0rMSkvcls1XSxGPShyWzldLTEpL3JbNV0sSj0ocls4XS0xKS9yWzBdLFA9KHZbOF0rMSkvdlswXTtyPXoqSjt2PXoqUDtQPWcvKC1KK1ApO0o9UCotSjtjLm1hdHJpeFdvcmxkLmRlY29tcG9zZShhLnBvc2l0aW9uLGEucXVhdGVybmlvbixhLnNjYWxlKTthLnRyYW5zbGF0ZVgoSik7YS50cmFuc2xhdGVaKFApO2EubWF0cml4V29ybGQuY29tcG9zZShhLnBvc2l0aW9uLGEucXVhdGVybmlvbixhLnNjYWxlKTthLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKGEubWF0cml4V29ybGQpOwpjPXorUDt6PWUrUDthLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKHItSix2KyhnLUopLEUqZS96KmMsRiplL3oqYyxjLHopfWZ1bmN0aW9uIE5oKGEpe2Z1bmN0aW9uIGMoKXtyZXR1cm4gbnVsbCE9PUomJiEwPT09Si5pc1ByZXNlbnRpbmd9ZnVuY3Rpb24gZSgpe2lmKGMoKSl7dmFyIEhhPUouZ2V0RXllUGFyYW1ldGVycygibGVmdCIpO3o9MipIYS5yZW5kZXJXaWR0aCpoYTtFPUhhLnJlbmRlckhlaWdodCpoYTtUYT1hLmdldFBpeGVsUmF0aW8oKTthLmdldFNpemUoQmEpO2Euc2V0RHJhd2luZ0J1ZmZlclNpemUoeixFLDEpO3VhLnZpZXdwb3J0LnNldCgwLDAsei8yLEUpO29hLnZpZXdwb3J0LnNldCh6LzIsMCx6LzIsRSk7Q2Euc3RhcnQoKTtGLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25zdGFydCJ9KX1lbHNlIEYuZW5hYmxlZCYmYS5zZXREcmF3aW5nQnVmZmVyU2l6ZShCYS53aWR0aCxCYS5oZWlnaHQsVGEpLENhLnN0b3AoKSxGLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9CmZ1bmN0aW9uIGcoSGEpe2Zvcih2YXIgRGE9bmF2aWdhdG9yLmdldEdhbWVwYWRzJiZuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMoKSxNYT0wLGRiPTAsdGI9RGEubGVuZ3RoO01hPHRiO01hKyspe3ZhciBLYT1EYVtNYV07aWYoS2EmJigiRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1LYS5pZHx8IkdlYXIgVlIgQ29udHJvbGxlciI9PT1LYS5pZHx8Ik9jdWx1cyBHbyBDb250cm9sbGVyIj09PUthLmlkfHwiT3BlblZSIEdhbWVwYWQiPT09S2EuaWR8fEthLmlkLnN0YXJ0c1dpdGgoIk9jdWx1cyBUb3VjaCIpfHxLYS5pZC5zdGFydHNXaXRoKCJIVEMgVml2ZSBGb2N1cyIpfHxLYS5pZC5zdGFydHNXaXRoKCJTcGF0aWFsIENvbnRyb2xsZXIiKSkpe2lmKGRiPT09SGEpcmV0dXJuIEthO2RiKyt9fX1mdW5jdGlvbiByKCl7Zm9yKHZhciBIYT0wO0hhPFMubGVuZ3RoO0hhKyspe3ZhciBEYT1TW0hhXSxNYT1nKEhhKTtpZih2b2lkIDAhPT1NYSYmdm9pZCAwIT09TWEucG9zZSl7aWYobnVsbD09PU1hLnBvc2UpYnJlYWs7CnZhciBkYj1NYS5wb3NlOyExPT09ZGIuaGFzUG9zaXRpb24mJkRhLnBvc2l0aW9uLnNldCguMiwtLjYsLS4wNSk7bnVsbCE9PWRiLnBvc2l0aW9uJiZEYS5wb3NpdGlvbi5mcm9tQXJyYXkoZGIucG9zaXRpb24pO251bGwhPT1kYi5vcmllbnRhdGlvbiYmRGEucXVhdGVybmlvbi5mcm9tQXJyYXkoZGIub3JpZW50YXRpb24pO0RhLm1hdHJpeC5jb21wb3NlKERhLnBvc2l0aW9uLERhLnF1YXRlcm5pb24sRGEuc2NhbGUpO0RhLm1hdHJpeC5wcmVtdWx0aXBseShWKTtEYS5tYXRyaXguZGVjb21wb3NlKERhLnBvc2l0aW9uLERhLnF1YXRlcm5pb24sRGEuc2NhbGUpO0RhLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITA7RGEudmlzaWJsZT0hMDtkYj0iRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1NYS5pZD8wOjE7dm9pZCAwPT09VWFbSGFdJiYoVWFbSGFdPSExKTtVYVtIYV0hPT1NYS5idXR0b25zW2RiXS5wcmVzc2VkJiYoVWFbSGFdPU1hLmJ1dHRvbnNbZGJdLnByZXNzZWQsITA9PT1VYVtIYV0/CkRhLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlbGVjdHN0YXJ0In0pOihEYS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZWxlY3RlbmQifSksRGEuZGlzcGF0Y2hFdmVudCh7dHlwZToic2VsZWN0In0pKSl9ZWxzZSBEYS52aXNpYmxlPSExfX1mdW5jdGlvbiB2KEhhLERhKXtudWxsIT09RGEmJjQ9PT1EYS5sZW5ndGgmJkhhLnNldChEYVswXSp6LERhWzFdKkUsRGFbMl0qeixEYVszXSpFKX12YXIgeixFLEY9dGhpcyxKPW51bGwsUD1udWxsLFI9bnVsbCxTPVtdLFY9bmV3IHEsVz1uZXcgcSxoYT0xLGZhPSJsb2NhbC1mbG9vciI7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiYiVlJGcmFtZURhdGEiaW4gd2luZG93JiYoUD1uZXcgd2luZG93LlZSRnJhbWVEYXRhLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixlLCExKSk7dmFyIHJhPW5ldyBxLHBhPW5ldyBoLHFhPW5ldyBrLHVhPW5ldyB2Yjt1YS52aWV3cG9ydD1uZXcgcDt1YS5sYXllcnMuZW5hYmxlKDEpOwp2YXIgb2E9bmV3IHZiO29hLnZpZXdwb3J0PW5ldyBwO29hLmxheWVycy5lbmFibGUoMik7dmFyIHRhPW5ldyB2ZihbdWEsb2FdKTt0YS5sYXllcnMuZW5hYmxlKDEpO3RhLmxheWVycy5lbmFibGUoMik7dmFyIEJhPW5ldyBmLFRhLFVhPVtdO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmdldENvbnRyb2xsZXI9ZnVuY3Rpb24oSGEpe3ZhciBEYT1TW0hhXTt2b2lkIDA9PT1EYSYmKERhPW5ldyB1ZSxEYS5tYXRyaXhBdXRvVXBkYXRlPSExLERhLnZpc2libGU9ITEsU1tIYV09RGEpO3JldHVybiBEYX07dGhpcy5nZXREZXZpY2U9ZnVuY3Rpb24oKXtyZXR1cm4gSn07dGhpcy5zZXREZXZpY2U9ZnVuY3Rpb24oSGEpe3ZvaWQgMCE9PUhhJiYoSj1IYSk7Q2Euc2V0Q29udGV4dChIYSl9O3RoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3Rvcj1mdW5jdGlvbihIYSl7aGE9SGF9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKEhhKXtmYT1IYX07dGhpcy5zZXRQb3NlVGFyZ2V0PWZ1bmN0aW9uKEhhKXt2b2lkIDAhPT0KSGEmJihSPUhhKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24oSGEpe3ZhciBEYT0ibG9jYWwtZmxvb3IiPT09ZmE/MS42OjA7aWYoITE9PT1jKCkpcmV0dXJuIEhhLnBvc2l0aW9uLnNldCgwLERhLDApLEhhLnJvdGF0aW9uLnNldCgwLDAsMCksSGE7Si5kZXB0aE5lYXI9SGEubmVhcjtKLmRlcHRoRmFyPUhhLmZhcjtKLmdldEZyYW1lRGF0YShQKTtpZigibG9jYWwtZmxvb3IiPT09ZmEpe3ZhciBNYT1KLnN0YWdlUGFyYW1ldGVycztNYT9WLmZyb21BcnJheShNYS5zaXR0aW5nVG9TdGFuZGluZ1RyYW5zZm9ybSk6Vi5tYWtlVHJhbnNsYXRpb24oMCxEYSwwKX1EYT1QLnBvc2U7TWE9bnVsbCE9PVI/UjpIYTtNYS5tYXRyaXguY29weShWKTtNYS5tYXRyaXguZGVjb21wb3NlKE1hLnBvc2l0aW9uLE1hLnF1YXRlcm5pb24sTWEuc2NhbGUpO251bGwhPT1EYS5vcmllbnRhdGlvbiYmKHBhLmZyb21BcnJheShEYS5vcmllbnRhdGlvbiksTWEucXVhdGVybmlvbi5tdWx0aXBseShwYSkpO251bGwhPT0KRGEucG9zaXRpb24mJihwYS5zZXRGcm9tUm90YXRpb25NYXRyaXgoVikscWEuZnJvbUFycmF5KERhLnBvc2l0aW9uKSxxYS5hcHBseVF1YXRlcm5pb24ocGEpLE1hLnBvc2l0aW9uLmFkZChxYSkpO01hLnVwZGF0ZU1hdHJpeFdvcmxkKCk7dWEubmVhcj1IYS5uZWFyO29hLm5lYXI9SGEubmVhcjt1YS5mYXI9SGEuZmFyO29hLmZhcj1IYS5mYXI7dWEubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheShQLmxlZnRWaWV3TWF0cml4KTtvYS5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KFAucmlnaHRWaWV3TWF0cml4KTtXLmdldEludmVyc2UoVik7ImxvY2FsLWZsb29yIj09PWZhJiYodWEubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KFcpLG9hLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShXKSk7SGE9TWEucGFyZW50O251bGwhPT1IYSYmKHJhLmdldEludmVyc2UoSGEubWF0cml4V29ybGQpLHVhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShyYSksb2EubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KHJhKSk7CnVhLm1hdHJpeFdvcmxkLmdldEludmVyc2UodWEubWF0cml4V29ybGRJbnZlcnNlKTtvYS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKG9hLm1hdHJpeFdvcmxkSW52ZXJzZSk7dWEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoUC5sZWZ0UHJvamVjdGlvbk1hdHJpeCk7b2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoUC5yaWdodFByb2plY3Rpb25NYXRyaXgpO3hqKHRhLHVhLG9hKTtIYT1KLmdldExheWVycygpO0hhLmxlbmd0aCYmKEhhPUhhWzBdLHYodWEudmlld3BvcnQsSGEubGVmdEJvdW5kcyksdihvYS52aWV3cG9ydCxIYS5yaWdodEJvdW5kcykpO3IoKTtyZXR1cm4gdGF9O3RoaXMuZ2V0U3RhbmRpbmdNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gVn07dGhpcy5pc1ByZXNlbnRpbmc9Yzt2YXIgQ2E9bmV3IGJjO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihIYSl7Q2Euc2V0QW5pbWF0aW9uTG9vcChIYSk7YygpJiZDYS5zdGFydCgpfTt0aGlzLnN1Ym1pdEZyYW1lPQpmdW5jdGlvbigpe2MoKSYmSi5zdWJtaXRGcmFtZSgpfTt0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXsidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixlKX07dGhpcy5zZXRGcmFtZU9mUmVmZXJlbmNlVHlwZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViVlJNYW5hZ2VyOiBzZXRGcmFtZU9mUmVmZXJlbmNlVHlwZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9fWZ1bmN0aW9uIEFqKGEsYyl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09RiYmbnVsbCE9PUp9ZnVuY3Rpb24gZyhxYSl7Zm9yKHZhciB1YT0wO3VhPFMubGVuZ3RoO3VhKyspVlt1YV09PT1xYS5pbnB1dFNvdXJjZSYmU1t1YV0uZGlzcGF0Y2hFdmVudCh7dHlwZTpxYS50eXBlfSl9ZnVuY3Rpb24gcigpe2Euc2V0RnJhbWVidWZmZXIobnVsbCk7YS5zZXRSZW5kZXJUYXJnZXQoYS5nZXRSZW5kZXJUYXJnZXQoKSk7CnBhLnN0b3AoKTtFLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9ZnVuY3Rpb24gdihxYSl7Sj1xYTtwYS5zZXRDb250ZXh0KEYpO3BhLnN0YXJ0KCk7RS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9ZnVuY3Rpb24geihxYSx1YSl7bnVsbD09PXVhP3FhLm1hdHJpeFdvcmxkLmNvcHkocWEubWF0cml4KTpxYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHVhLm1hdHJpeFdvcmxkLHFhLm1hdHJpeCk7cWEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UocWEubWF0cml4V29ybGQpfXZhciBFPXRoaXMsRj1udWxsLEo9bnVsbCxQPSJsb2NhbC1mbG9vciIsUj1udWxsLFM9W10sVj1bXSxXPW5ldyB2YjtXLmxheWVycy5lbmFibGUoMSk7Vy52aWV3cG9ydD1uZXcgcDt2YXIgaGE9bmV3IHZiO2hhLmxheWVycy5lbmFibGUoMik7aGEudmlld3BvcnQ9bmV3IHA7dmFyIGZhPW5ldyB2ZihbVyxoYV0pO2ZhLmxheWVycy5lbmFibGUoMSk7ZmEubGF5ZXJzLmVuYWJsZSgyKTsKdGhpcy5lbmFibGVkPSExO3RoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbihxYSl7dmFyIHVhPVNbcWFdO3ZvaWQgMD09PXVhJiYodWE9bmV3IHVlLHVhLm1hdHJpeEF1dG9VcGRhdGU9ITEsdWEudmlzaWJsZT0hMSxTW3FhXT11YSk7cmV0dXJuIHVhfTt0aGlzLnNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3I9ZnVuY3Rpb24oKXt9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKHFhKXtQPXFhfTt0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gRn07dGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKHFhKXtGPXFhO251bGwhPT1GJiYoRi5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLGcpLEYuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLGcpLEYuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixnKSxGLmFkZEV2ZW50TGlzdGVuZXIoImVuZCIsciksRi51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOm5ldyBYUldlYkdMTGF5ZXIoRixjKX0pLEYucmVxdWVzdFJlZmVyZW5jZVNwYWNlKFApLnRoZW4odiksClY9Ri5pbnB1dFNvdXJjZXMsRi5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLGZ1bmN0aW9uKCl7Vj1GLmlucHV0U291cmNlcztjb25zb2xlLmxvZyhWKTtmb3IodmFyIHVhPTA7dWE8Uy5sZW5ndGg7dWErKylTW3VhXS51c2VyRGF0YS5pbnB1dFNvdXJjZT1WW3VhXX0pKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24ocWEpe2lmKGUoKSl7dmFyIHVhPXFhLnBhcmVudCxvYT1mYS5jYW1lcmFzO3ooZmEsdWEpO2Zvcih2YXIgdGE9MDt0YTxvYS5sZW5ndGg7dGErKyl6KG9hW3RhXSx1YSk7cWEubWF0cml4V29ybGQuY29weShmYS5tYXRyaXhXb3JsZCk7cWE9cWEuY2hpbGRyZW47dGE9MDtmb3IodWE9cWEubGVuZ3RoO3RhPHVhO3RhKyspcWFbdGFdLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt4aihmYSxXLGhhKTtyZXR1cm4gZmF9cmV0dXJuIHFhfTt0aGlzLmlzUHJlc2VudGluZz1lO3ZhciByYT1udWxsLHBhPW5ldyBiYztwYS5zZXRBbmltYXRpb25Mb29wKGZ1bmN0aW9uKHFhLAp1YSl7Uj11YS5nZXRWaWV3ZXJQb3NlKEopO2lmKG51bGwhPT1SKXt2YXIgb2E9Ui52aWV3cyx0YT1GLnJlbmRlclN0YXRlLmJhc2VMYXllcjthLnNldEZyYW1lYnVmZmVyKHRhLmZyYW1lYnVmZmVyKTtmb3IodmFyIEJhPTA7QmE8b2EubGVuZ3RoO0JhKyspe3ZhciBUYT1vYVtCYV0sVWE9dGEuZ2V0Vmlld3BvcnQoVGEpLENhPWZhLmNhbWVyYXNbQmFdO0NhLm1hdHJpeC5mcm9tQXJyYXkoVGEudHJhbnNmb3JtLmludmVyc2UubWF0cml4KS5nZXRJbnZlcnNlKENhLm1hdHJpeCk7Q2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoVGEucHJvamVjdGlvbk1hdHJpeCk7Q2Eudmlld3BvcnQuc2V0KFVhLngsVWEueSxVYS53aWR0aCxVYS5oZWlnaHQpOzA9PT1CYSYmZmEubWF0cml4LmNvcHkoQ2EubWF0cml4KX19Zm9yKEJhPTA7QmE8Uy5sZW5ndGg7QmErKyl7b2E9U1tCYV07aWYodGE9VltCYV0paWYodGE9dWEuZ2V0UG9zZSh0YS50YXJnZXRSYXlTcGFjZSxKKSxudWxsIT09dGEpe29hLm1hdHJpeC5mcm9tQXJyYXkodGEudHJhbnNmb3JtLm1hdHJpeCk7Cm9hLm1hdHJpeC5kZWNvbXBvc2Uob2EucG9zaXRpb24sb2Eucm90YXRpb24sb2Euc2NhbGUpO29hLnZpc2libGU9ITA7Y29udGludWV9b2EudmlzaWJsZT0hMX1yYSYmcmEocWEpfSk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKHFhKXtyYT1xYX07dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7fTt0aGlzLmdldFN0YW5kaW5nTWF0cml4PWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldFN0YW5kaW5nTWF0cml4KCkgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKTtyZXR1cm4gbmV3IHF9O3RoaXMuZ2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RnJhbWVPZlJlZmVyZW5jZVR5cGU9CmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldEZyYW1lT2ZSZWZlcmVuY2VUeXBlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4iKX07dGhpcy5zdWJtaXRGcmFtZT1mdW5jdGlvbigpe319ZnVuY3Rpb24gT2goYSl7dmFyIGM7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsPT09aWI/Y2M6MX1mdW5jdGlvbiBnKCl7TGI9bmV3IGJkKFJhKTtkYz1uZXcgTWIoUmEsTGIsYSk7ZGMuaXNXZWJHTDJ8fChMYi5nZXQoIldFQkdMX2RlcHRoX3RleHR1cmUiKSxMYi5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0IiksTGIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksTGIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpLExiLmdldCgiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIiksTGIuZ2V0KCJPRVNfZWxlbWVudF9pbmRleF91aW50IiksTGIuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpO0xiLmdldCgiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik7Ck5jPW5ldyB3aihSYSxMYixkYyk7eWI9bmV3IFZsKFJhLExiLE5jLGRjKTt5Yi5zY2lzc29yKFNiLmNvcHkodmUpLm11bHRpcGx5U2NhbGFyKGNjKS5mbG9vcigpKTt5Yi52aWV3cG9ydChLYi5jb3B5KHdlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSk7eGQ9bmV3IFNrKFJhKTtlYz1uZXcgTWw7T2M9bmV3IFdsKFJhLExiLHliLGVjLGRjLE5jLHhkKTt2Zz1uZXcgT2QoUmEpO1BoPW5ldyB0ZChSYSx2Zyx4ZCk7eGU9bmV3IFZrKFBoLHhkKTtCaj1uZXcgVWsoUmEpO1BkPW5ldyBMbChqYSxMYixkYyk7d2c9bmV3IFBsO3llPW5ldyBVbDt5ZD1uZXcgc2QoamEseWIseGUsbmEpO0NqPW5ldyBzYShSYSxMYix4ZCxkYyk7RGo9bmV3IHRnKFJhLExiLHhkLGRjKTt4ZC5wcm9ncmFtcz1QZC5wcm9ncmFtcztqYS5jYXBhYmlsaXRpZXM9ZGM7amEuZXh0ZW5zaW9ucz1MYjtqYS5wcm9wZXJ0aWVzPWVjO2phLnJlbmRlckxpc3RzPXdnO2phLnN0YXRlPXliO2phLmluZm89eGR9ZnVuY3Rpb24gcihVKXtVLnByZXZlbnREZWZhdWx0KCk7CmNvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IExvc3QuIik7R2E9ITB9ZnVuY3Rpb24gdigpe2NvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLiIpO0dhPSExO2coKX1mdW5jdGlvbiB6KFUpe1U9VS50YXJnZXQ7VS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIix6KTtFKFUpfWZ1bmN0aW9uIEUoVSl7RihVKTtlYy5yZW1vdmUoVSl9ZnVuY3Rpb24gRihVKXt2YXIgZGE9ZWMuZ2V0KFUpLnByb2dyYW07VS5wcm9ncmFtPXZvaWQgMDt2b2lkIDAhPT1kYSYmUGQucmVsZWFzZVByb2dyYW0oZGEpfWZ1bmN0aW9uIEooVSxkYSl7VS5yZW5kZXIoZnVuY3Rpb24obWEpe2phLnJlbmRlckJ1ZmZlckltbWVkaWF0ZShtYSxkYSl9KX1mdW5jdGlvbiBQKFUsZGEsbWEpe2lmKG1hJiZtYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JiYhZGMuaXNXZWJHTDImJm51bGw9PT1MYi5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSljb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7CmVsc2V7eWIuaW5pdEF0dHJpYnV0ZXMoKTt2YXIgSWE9bWEuYXR0cmlidXRlcztkYT1kYS5nZXRBdHRyaWJ1dGVzKCk7VT1VLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7Zm9yKHZhciBPYSBpbiBkYSl7dmFyIGFiPWRhW09hXTtpZigwPD1hYil7dmFyIFBhPUlhW09hXTtpZih2b2lkIDAhPT1QYSl7dmFyIGZiPVBhLm5vcm1hbGl6ZWQsQ2I9UGEuaXRlbVNpemUsb2I9dmcuZ2V0KFBhKTtpZih2b2lkIDAhPT1vYil7dmFyICRhPW9iLmJ1ZmZlcixQYz1vYi50eXBlO29iPW9iLmJ5dGVzUGVyRWxlbWVudDtpZihQYS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXt2YXIgeGM9UGEuZGF0YSx6ZT14Yy5zdHJpZGU7UGE9UGEub2Zmc2V0O3hjJiZ4Yy5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPyh5Yi5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKGFiLHhjLm1lc2hQZXJBdHRyaWJ1dGUpLHZvaWQgMD09PW1hLm1heEluc3RhbmNlZENvdW50JiYobWEubWF4SW5zdGFuY2VkQ291bnQ9CnhjLm1lc2hQZXJBdHRyaWJ1dGUqeGMuY291bnQpKTp5Yi5lbmFibGVBdHRyaWJ1dGUoYWIpO1JhLmJpbmRCdWZmZXIoMzQ5NjIsJGEpO1JhLnZlcnRleEF0dHJpYlBvaW50ZXIoYWIsQ2IsUGMsZmIsemUqb2IsUGEqb2IpfWVsc2UgUGEuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/KHliLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoYWIsUGEubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09bWEubWF4SW5zdGFuY2VkQ291bnQmJihtYS5tYXhJbnN0YW5jZWRDb3VudD1QYS5tZXNoUGVyQXR0cmlidXRlKlBhLmNvdW50KSk6eWIuZW5hYmxlQXR0cmlidXRlKGFiKSxSYS5iaW5kQnVmZmVyKDM0OTYyLCRhKSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGFiLENiLFBjLGZiLDAsMCl9fWVsc2UgaWYodm9pZCAwIT09VSYmKGZiPVVbT2FdLHZvaWQgMCE9PWZiKSlzd2l0Y2goZmIubGVuZ3RoKXtjYXNlIDI6UmEudmVydGV4QXR0cmliMmZ2KGFiLGZiKTticmVhaztjYXNlIDM6UmEudmVydGV4QXR0cmliM2Z2KGFiLApmYik7YnJlYWs7Y2FzZSA0OlJhLnZlcnRleEF0dHJpYjRmdihhYixmYik7YnJlYWs7ZGVmYXVsdDpSYS52ZXJ0ZXhBdHRyaWIxZnYoYWIsZmIpfX19eWIuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKX19ZnVuY3Rpb24gUihVLGRhLG1hLElhKXtpZighMSE9PVUudmlzaWJsZSl7aWYoVS5sYXllcnMudGVzdChkYS5sYXllcnMpKWlmKFUuaXNHcm91cCltYT1VLnJlbmRlck9yZGVyO2Vsc2UgaWYoVS5pc0xPRCkhMD09PVUuYXV0b1VwZGF0ZSYmVS51cGRhdGUoZGEpO2Vsc2UgaWYoVS5pc0xpZ2h0KWNiLnB1c2hMaWdodChVKSxVLmNhc3RTaGFkb3cmJmNiLnB1c2hTaGFkb3coVSk7ZWxzZSBpZihVLmlzU3ByaXRlKXtpZighVS5mcnVzdHVtQ3VsbGVkfHxRaC5pbnRlcnNlY3RzU3ByaXRlKFUpKXtJYSYmemQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFUubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NCh3Zik7dmFyIE9hPXhlLnVwZGF0ZShVKSxhYj1VLm1hdGVyaWFsO2FiLnZpc2libGUmJk5hLnB1c2goVSwKT2EsYWIsbWEsemQueixudWxsKX19ZWxzZSBpZihVLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0KUlhJiZ6ZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oVS5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KHdmKSxOYS5wdXNoKFUsbnVsbCxVLm1hdGVyaWFsLG1hLHpkLnosbnVsbCk7ZWxzZSBpZihVLmlzTWVzaHx8VS5pc0xpbmV8fFUuaXNQb2ludHMpaWYoVS5pc1NraW5uZWRNZXNoJiZVLnNrZWxldG9uLnVwZGF0ZSgpLCFVLmZydXN0dW1DdWxsZWR8fFFoLmludGVyc2VjdHNPYmplY3QoVSkpaWYoSWEmJnpkLnNldEZyb21NYXRyaXhQb3NpdGlvbihVLm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQod2YpLE9hPXhlLnVwZGF0ZShVKSxhYj1VLm1hdGVyaWFsLEFycmF5LmlzQXJyYXkoYWIpKWZvcih2YXIgUGE9T2EuZ3JvdXBzLGZiPTAsQ2I9UGEubGVuZ3RoO2ZiPENiO2ZiKyspe3ZhciBvYj1QYVtmYl0sJGE9YWJbb2IubWF0ZXJpYWxJbmRleF07JGEmJiRhLnZpc2libGUmJk5hLnB1c2goVSwKT2EsJGEsbWEsemQueixvYil9ZWxzZSBhYi52aXNpYmxlJiZOYS5wdXNoKFUsT2EsYWIsbWEsemQueixudWxsKTtVPVUuY2hpbGRyZW47ZmI9MDtmb3IoQ2I9VS5sZW5ndGg7ZmI8Q2I7ZmIrKylSKFVbZmJdLGRhLG1hLElhKX19ZnVuY3Rpb24gUyhVLGRhLG1hLElhKXtmb3IodmFyIE9hPTAsYWI9VS5sZW5ndGg7T2E8YWI7T2ErKyl7dmFyIFBhPVVbT2FdLGZiPVBhLm9iamVjdCxDYj1QYS5nZW9tZXRyeSxvYj12b2lkIDA9PT1JYT9QYS5tYXRlcmlhbDpJYTtQYT1QYS5ncm91cDtpZihtYS5pc0FycmF5Q2FtZXJhKXtzYj1tYTtmb3IodmFyICRhPW1hLmNhbWVyYXMsUGM9MCx4Yz0kYS5sZW5ndGg7UGM8eGM7UGMrKyl7dmFyIHplPSRhW1BjXTtmYi5sYXllcnMudGVzdCh6ZS5sYXllcnMpJiYoeWIudmlld3BvcnQoS2IuY29weSh6ZS52aWV3cG9ydCkpLGNiLnNldHVwTGlnaHRzKHplKSxWKGZiLGRhLHplLENiLG9iLFBhKSl9fWVsc2Ugc2I9bnVsbCxWKGZiLGRhLG1hLENiLG9iLFBhKX19CmZ1bmN0aW9uIFYoVSxkYSxtYSxJYSxPYSxhYil7VS5vbkJlZm9yZVJlbmRlcihqYSxkYSxtYSxJYSxPYSxhYik7Y2I9eWUuZ2V0KGRhLHNifHxtYSk7VS5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhtYS5tYXRyaXhXb3JsZEludmVyc2UsVS5tYXRyaXhXb3JsZCk7VS5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KFUubW9kZWxWaWV3TWF0cml4KTtVLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0Pyh5Yi5zZXRNYXRlcmlhbChPYSksSWE9aGEobWEsZGEuZm9nLE9hLFUpLGViPWM9bnVsbCxtYj0hMSxKKFUsSWEpKTpqYS5yZW5kZXJCdWZmZXJEaXJlY3QobWEsZGEuZm9nLElhLE9hLFUsYWIpO2NiPXllLmdldChkYSxzYnx8bWEpfWZ1bmN0aW9uIFcoVSxkYSxtYSl7dmFyIElhPWVjLmdldChVKSxPYT1jYi5zdGF0ZS5saWdodHMsYWI9T2Euc3RhdGUudmVyc2lvbjttYT1QZC5nZXRQYXJhbWV0ZXJzKFUsT2Euc3RhdGUsY2Iuc3RhdGUuc2hhZG93c0FycmF5LGRhLHljLm51bVBsYW5lcywKeWMubnVtSW50ZXJzZWN0aW9uLG1hKTt2YXIgUGE9UGQuZ2V0UHJvZ3JhbUNvZGUoVSxtYSksZmI9SWEucHJvZ3JhbSxDYj0hMDtpZih2b2lkIDA9PT1mYilVLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHopO2Vsc2UgaWYoZmIuY29kZSE9PVBhKUYoVSk7ZWxzZXtpZihJYS5saWdodHNTdGF0ZVZlcnNpb24hPT1hYilJYS5saWdodHNTdGF0ZVZlcnNpb249YWI7ZWxzZSBpZih2b2lkIDAhPT1tYS5zaGFkZXJJRClyZXR1cm47Q2I9ITF9Q2ImJihtYS5zaGFkZXJJRD8oUGE9TWNbbWEuc2hhZGVySURdLElhLnNoYWRlcj17bmFtZTpVLnR5cGUsdW5pZm9ybXM6dWIoUGEudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpQYS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6UGEuZnJhZ21lbnRTaGFkZXJ9KTpJYS5zaGFkZXI9e25hbWU6VS50eXBlLHVuaWZvcm1zOlUudW5pZm9ybXMsdmVydGV4U2hhZGVyOlUudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOlUuZnJhZ21lbnRTaGFkZXJ9LApQYT1QZC5nZXRQcm9ncmFtQ29kZShVLG1hKSxmYj1QZC5hY3F1aXJlUHJvZ3JhbShVLElhLnNoYWRlcixtYSxQYSksSWEucHJvZ3JhbT1mYixVLnByb2dyYW09ZmIpO21hPWZiLmdldEF0dHJpYnV0ZXMoKTtpZihVLm1vcnBoVGFyZ2V0cylmb3IoUGE9VS5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHM9MDtQYTxqYS5tYXhNb3JwaFRhcmdldHM7UGErKykwPD1tYVsibW9ycGhUYXJnZXQiK1BhXSYmVS5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMrKztpZihVLm1vcnBoTm9ybWFscylmb3IoUGE9VS5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHM9MDtQYTxqYS5tYXhNb3JwaE5vcm1hbHM7UGErKykwPD1tYVsibW9ycGhOb3JtYWwiK1BhXSYmVS5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMrKzttYT1JYS5zaGFkZXIudW5pZm9ybXM7aWYoIVUuaXNTaGFkZXJNYXRlcmlhbCYmIVUuaXNSYXdTaGFkZXJNYXRlcmlhbHx8ITA9PT1VLmNsaXBwaW5nKUlhLm51bUNsaXBwaW5nUGxhbmVzPXljLm51bVBsYW5lcywKSWEubnVtSW50ZXJzZWN0aW9uPXljLm51bUludGVyc2VjdGlvbixtYS5jbGlwcGluZ1BsYW5lcz15Yy51bmlmb3JtO0lhLmZvZz1kYTtJYS5saWdodHNTdGF0ZVZlcnNpb249YWI7VS5saWdodHMmJihtYS5hbWJpZW50TGlnaHRDb2xvci52YWx1ZT1PYS5zdGF0ZS5hbWJpZW50LG1hLmxpZ2h0UHJvYmUudmFsdWU9T2Euc3RhdGUucHJvYmUsbWEuZGlyZWN0aW9uYWxMaWdodHMudmFsdWU9T2Euc3RhdGUuZGlyZWN0aW9uYWwsbWEuc3BvdExpZ2h0cy52YWx1ZT1PYS5zdGF0ZS5zcG90LG1hLnJlY3RBcmVhTGlnaHRzLnZhbHVlPU9hLnN0YXRlLnJlY3RBcmVhLG1hLnBvaW50TGlnaHRzLnZhbHVlPU9hLnN0YXRlLnBvaW50LG1hLmhlbWlzcGhlcmVMaWdodHMudmFsdWU9T2Euc3RhdGUuaGVtaSxtYS5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZT1PYS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcCxtYS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZT1PYS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeCwKbWEuc3BvdFNoYWRvd01hcC52YWx1ZT1PYS5zdGF0ZS5zcG90U2hhZG93TWFwLG1hLnNwb3RTaGFkb3dNYXRyaXgudmFsdWU9T2Euc3RhdGUuc3BvdFNoYWRvd01hdHJpeCxtYS5wb2ludFNoYWRvd01hcC52YWx1ZT1PYS5zdGF0ZS5wb2ludFNoYWRvd01hcCxtYS5wb2ludFNoYWRvd01hdHJpeC52YWx1ZT1PYS5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCk7VT1JYS5wcm9ncmFtLmdldFVuaWZvcm1zKCk7VT11ZC5zZXFXaXRoVmFsdWUoVS5zZXEsbWEpO0lhLnVuaWZvcm1zTGlzdD1VfWZ1bmN0aW9uIGhhKFUsZGEsbWEsSWEpe09jLnJlc2V0VGV4dHVyZVVuaXRzKCk7dmFyIE9hPWVjLmdldChtYSksYWI9Y2Iuc3RhdGUubGlnaHRzO3hnJiYoUmh8fFUhPT1wYikmJnljLnNldFN0YXRlKG1hLmNsaXBwaW5nUGxhbmVzLG1hLmNsaXBJbnRlcnNlY3Rpb24sbWEuY2xpcFNoYWRvd3MsVSxPYSxVPT09cGImJm1hLmlkPT09UWEpOyExPT09bWEubmVlZHNVcGRhdGUmJih2b2lkIDA9PT1PYS5wcm9ncmFtPwptYS5uZWVkc1VwZGF0ZT0hMDptYS5mb2cmJk9hLmZvZyE9PWRhP21hLm5lZWRzVXBkYXRlPSEwOm1hLmxpZ2h0cyYmT2EubGlnaHRzU3RhdGVWZXJzaW9uIT09YWIuc3RhdGUudmVyc2lvbj9tYS5uZWVkc1VwZGF0ZT0hMDp2b2lkIDA9PT1PYS5udW1DbGlwcGluZ1BsYW5lc3x8T2EubnVtQ2xpcHBpbmdQbGFuZXM9PT15Yy5udW1QbGFuZXMmJk9hLm51bUludGVyc2VjdGlvbj09PXljLm51bUludGVyc2VjdGlvbnx8KG1hLm5lZWRzVXBkYXRlPSEwKSk7bWEubmVlZHNVcGRhdGUmJihXKG1hLGRhLElhKSxtYS5uZWVkc1VwZGF0ZT0hMSk7dmFyIFBhPSExLGZiPWFiPSExLENiPU9hLnByb2dyYW0sb2I9Q2IuZ2V0VW5pZm9ybXMoKSwkYT1PYS5zaGFkZXIudW5pZm9ybXM7eWIudXNlUHJvZ3JhbShDYi5wcm9ncmFtKSYmKGZiPWFiPVBhPSEwKTttYS5pZCE9PVFhJiYoUWE9bWEuaWQsYWI9ITApO2lmKFBhfHxwYiE9PVUpe29iLnNldFZhbHVlKFJhLCJwcm9qZWN0aW9uTWF0cml4IixVLnByb2plY3Rpb25NYXRyaXgpOwpkYy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZvYi5zZXRWYWx1ZShSYSwibG9nRGVwdGhCdWZGQyIsMi8oTWF0aC5sb2coVS5mYXIrMSkvTWF0aC5MTjIpKTtwYiE9PVUmJihwYj1VLGZiPWFiPSEwKTtpZihtYS5pc1NoYWRlck1hdGVyaWFsfHxtYS5pc01lc2hQaG9uZ01hdGVyaWFsfHxtYS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxtYS5lbnZNYXApUGE9b2IubWFwLmNhbWVyYVBvc2l0aW9uLHZvaWQgMCE9PVBhJiZQYS5zZXRWYWx1ZShSYSx6ZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oVS5tYXRyaXhXb3JsZCkpOyhtYS5pc01lc2hQaG9uZ01hdGVyaWFsfHxtYS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fG1hLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fG1hLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fG1hLmlzU2hhZGVyTWF0ZXJpYWx8fG1hLnNraW5uaW5nKSYmb2Iuc2V0VmFsdWUoUmEsInZpZXdNYXRyaXgiLFUubWF0cml4V29ybGRJbnZlcnNlKX1pZihtYS5za2lubmluZyYmKG9iLnNldE9wdGlvbmFsKFJhLApJYSwiYmluZE1hdHJpeCIpLG9iLnNldE9wdGlvbmFsKFJhLElhLCJiaW5kTWF0cml4SW52ZXJzZSIpLFU9SWEuc2tlbGV0b24pKWlmKFBhPVUuYm9uZXMsZGMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyl7aWYodm9pZCAwPT09VS5ib25lVGV4dHVyZSl7UGE9TWF0aC5zcXJ0KDQqUGEubGVuZ3RoKTtQYT1oYi5jZWlsUG93ZXJPZlR3byhQYSk7UGE9TWF0aC5tYXgoUGEsNCk7dmFyIFBjPW5ldyBGbG9hdDMyQXJyYXkoUGEqUGEqNCk7UGMuc2V0KFUuYm9uZU1hdHJpY2VzKTt2YXIgeGM9bmV3IEFiKFBjLFBhLFBhLDEwMjMsMTAxNSk7eGMubmVlZHNVcGRhdGU9ITA7VS5ib25lTWF0cmljZXM9UGM7VS5ib25lVGV4dHVyZT14YztVLmJvbmVUZXh0dXJlU2l6ZT1QYX1vYi5zZXRWYWx1ZShSYSwiYm9uZVRleHR1cmUiLFUuYm9uZVRleHR1cmUsT2MpO29iLnNldFZhbHVlKFJhLCJib25lVGV4dHVyZVNpemUiLFUuYm9uZVRleHR1cmVTaXplKX1lbHNlIG9iLnNldE9wdGlvbmFsKFJhLFUsImJvbmVNYXRyaWNlcyIpOwphYiYmKG9iLnNldFZhbHVlKFJhLCJ0b25lTWFwcGluZ0V4cG9zdXJlIixqYS50b25lTWFwcGluZ0V4cG9zdXJlKSxvYi5zZXRWYWx1ZShSYSwidG9uZU1hcHBpbmdXaGl0ZVBvaW50IixqYS50b25lTWFwcGluZ1doaXRlUG9pbnQpLG1hLmxpZ2h0cyYmdGIoJGEsZmIpLGRhJiZtYS5mb2cmJm9hKCRhLGRhKSxtYS5pc01lc2hCYXNpY01hdGVyaWFsP2ZhKCRhLG1hKTptYS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw/KGZhKCRhLG1hKSx0YSgkYSxtYSkpOm1hLmlzTWVzaFBob25nTWF0ZXJpYWw/KGZhKCRhLG1hKSxtYS5pc01lc2hUb29uTWF0ZXJpYWw/VGEoJGEsbWEpOkJhKCRhLG1hKSk6bWEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD8oZmEoJGEsbWEpLG1hLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw/Q2EoJGEsbWEpOlVhKCRhLG1hKSk6bWEuaXNNZXNoTWF0Y2FwTWF0ZXJpYWw/KGZhKCRhLG1hKSxIYSgkYSxtYSkpOm1hLmlzTWVzaERlcHRoTWF0ZXJpYWw/KGZhKCRhLG1hKSxEYSgkYSwKbWEpKTptYS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhmYSgkYSxtYSksTWEoJGEsbWEpKTptYS5pc01lc2hOb3JtYWxNYXRlcmlhbD8oZmEoJGEsbWEpLGRiKCRhLG1hKSk6bWEuaXNMaW5lQmFzaWNNYXRlcmlhbD8ocmEoJGEsbWEpLG1hLmlzTGluZURhc2hlZE1hdGVyaWFsJiZwYSgkYSxtYSkpOm1hLmlzUG9pbnRzTWF0ZXJpYWw/cWEoJGEsbWEpOm1hLmlzU3ByaXRlTWF0ZXJpYWw/dWEoJGEsbWEpOm1hLmlzU2hhZG93TWF0ZXJpYWwmJigkYS5jb2xvci52YWx1ZS5jb3B5KG1hLmNvbG9yKSwkYS5vcGFjaXR5LnZhbHVlPW1hLm9wYWNpdHkpLHZvaWQgMCE9PSRhLmx0Y18xJiYoJGEubHRjXzEudmFsdWU9V2EuTFRDXzEpLHZvaWQgMCE9PSRhLmx0Y18yJiYoJGEubHRjXzIudmFsdWU9V2EuTFRDXzIpLHVkLnVwbG9hZChSYSxPYS51bmlmb3Jtc0xpc3QsJGEsT2MpKTttYS5pc1NoYWRlck1hdGVyaWFsJiYhMD09PW1hLnVuaWZvcm1zTmVlZFVwZGF0ZSYmKHVkLnVwbG9hZChSYSxPYS51bmlmb3Jtc0xpc3QsCiRhLE9jKSxtYS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpO21hLmlzU3ByaXRlTWF0ZXJpYWwmJm9iLnNldFZhbHVlKFJhLCJjZW50ZXIiLElhLmNlbnRlcik7b2Iuc2V0VmFsdWUoUmEsIm1vZGVsVmlld01hdHJpeCIsSWEubW9kZWxWaWV3TWF0cml4KTtvYi5zZXRWYWx1ZShSYSwibm9ybWFsTWF0cml4IixJYS5ub3JtYWxNYXRyaXgpO29iLnNldFZhbHVlKFJhLCJtb2RlbE1hdHJpeCIsSWEubWF0cml4V29ybGQpO3JldHVybiBDYn1mdW5jdGlvbiBmYShVLGRhKXtVLm9wYWNpdHkudmFsdWU9ZGEub3BhY2l0eTtkYS5jb2xvciYmVS5kaWZmdXNlLnZhbHVlLmNvcHkoZGEuY29sb3IpO2RhLmVtaXNzaXZlJiZVLmVtaXNzaXZlLnZhbHVlLmNvcHkoZGEuZW1pc3NpdmUpLm11bHRpcGx5U2NhbGFyKGRhLmVtaXNzaXZlSW50ZW5zaXR5KTtkYS5tYXAmJihVLm1hcC52YWx1ZT1kYS5tYXApO2RhLmFscGhhTWFwJiYoVS5hbHBoYU1hcC52YWx1ZT1kYS5hbHBoYU1hcCk7ZGEuc3BlY3VsYXJNYXAmJgooVS5zcGVjdWxhck1hcC52YWx1ZT1kYS5zcGVjdWxhck1hcCk7ZGEuZW52TWFwJiYoVS5lbnZNYXAudmFsdWU9ZGEuZW52TWFwLFUuZmxpcEVudk1hcC52YWx1ZT1kYS5lbnZNYXAuaXNDdWJlVGV4dHVyZT8tMToxLFUucmVmbGVjdGl2aXR5LnZhbHVlPWRhLnJlZmxlY3Rpdml0eSxVLnJlZnJhY3Rpb25SYXRpby52YWx1ZT1kYS5yZWZyYWN0aW9uUmF0aW8sVS5tYXhNaXBMZXZlbC52YWx1ZT1lYy5nZXQoZGEuZW52TWFwKS5fX21heE1pcExldmVsKTtkYS5saWdodE1hcCYmKFUubGlnaHRNYXAudmFsdWU9ZGEubGlnaHRNYXAsVS5saWdodE1hcEludGVuc2l0eS52YWx1ZT1kYS5saWdodE1hcEludGVuc2l0eSk7ZGEuYW9NYXAmJihVLmFvTWFwLnZhbHVlPWRhLmFvTWFwLFUuYW9NYXBJbnRlbnNpdHkudmFsdWU9ZGEuYW9NYXBJbnRlbnNpdHkpO2lmKGRhLm1hcCl2YXIgbWE9ZGEubWFwO2Vsc2UgZGEuc3BlY3VsYXJNYXA/bWE9ZGEuc3BlY3VsYXJNYXA6ZGEuZGlzcGxhY2VtZW50TWFwPwptYT1kYS5kaXNwbGFjZW1lbnRNYXA6ZGEubm9ybWFsTWFwP21hPWRhLm5vcm1hbE1hcDpkYS5idW1wTWFwP21hPWRhLmJ1bXBNYXA6ZGEucm91Z2huZXNzTWFwP21hPWRhLnJvdWdobmVzc01hcDpkYS5tZXRhbG5lc3NNYXA/bWE9ZGEubWV0YWxuZXNzTWFwOmRhLmFscGhhTWFwP21hPWRhLmFscGhhTWFwOmRhLmVtaXNzaXZlTWFwJiYobWE9ZGEuZW1pc3NpdmVNYXApO3ZvaWQgMCE9PW1hJiYobWEuaXNXZWJHTFJlbmRlclRhcmdldCYmKG1hPW1hLnRleHR1cmUpLCEwPT09bWEubWF0cml4QXV0b1VwZGF0ZSYmbWEudXBkYXRlTWF0cml4KCksVS51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KG1hLm1hdHJpeCkpfWZ1bmN0aW9uIHJhKFUsZGEpe1UuZGlmZnVzZS52YWx1ZS5jb3B5KGRhLmNvbG9yKTtVLm9wYWNpdHkudmFsdWU9ZGEub3BhY2l0eX1mdW5jdGlvbiBwYShVLGRhKXtVLmRhc2hTaXplLnZhbHVlPWRhLmRhc2hTaXplO1UudG90YWxTaXplLnZhbHVlPWRhLmRhc2hTaXplK2RhLmdhcFNpemU7ClUuc2NhbGUudmFsdWU9ZGEuc2NhbGV9ZnVuY3Rpb24gcWEoVSxkYSl7VS5kaWZmdXNlLnZhbHVlLmNvcHkoZGEuY29sb3IpO1Uub3BhY2l0eS52YWx1ZT1kYS5vcGFjaXR5O1Uuc2l6ZS52YWx1ZT1kYS5zaXplKmNjO1Uuc2NhbGUudmFsdWU9LjUqemM7VS5tYXAudmFsdWU9ZGEubWFwO251bGwhPT1kYS5tYXAmJighMD09PWRhLm1hcC5tYXRyaXhBdXRvVXBkYXRlJiZkYS5tYXAudXBkYXRlTWF0cml4KCksVS51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGRhLm1hcC5tYXRyaXgpKX1mdW5jdGlvbiB1YShVLGRhKXtVLmRpZmZ1c2UudmFsdWUuY29weShkYS5jb2xvcik7VS5vcGFjaXR5LnZhbHVlPWRhLm9wYWNpdHk7VS5yb3RhdGlvbi52YWx1ZT1kYS5yb3RhdGlvbjtVLm1hcC52YWx1ZT1kYS5tYXA7bnVsbCE9PWRhLm1hcCYmKCEwPT09ZGEubWFwLm1hdHJpeEF1dG9VcGRhdGUmJmRhLm1hcC51cGRhdGVNYXRyaXgoKSxVLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoZGEubWFwLm1hdHJpeCkpfQpmdW5jdGlvbiBvYShVLGRhKXtVLmZvZ0NvbG9yLnZhbHVlLmNvcHkoZGEuY29sb3IpO2RhLmlzRm9nPyhVLmZvZ05lYXIudmFsdWU9ZGEubmVhcixVLmZvZ0Zhci52YWx1ZT1kYS5mYXIpOmRhLmlzRm9nRXhwMiYmKFUuZm9nRGVuc2l0eS52YWx1ZT1kYS5kZW5zaXR5KX1mdW5jdGlvbiB0YShVLGRhKXtkYS5lbWlzc2l2ZU1hcCYmKFUuZW1pc3NpdmVNYXAudmFsdWU9ZGEuZW1pc3NpdmVNYXApfWZ1bmN0aW9uIEJhKFUsZGEpe1Uuc3BlY3VsYXIudmFsdWUuY29weShkYS5zcGVjdWxhcik7VS5zaGluaW5lc3MudmFsdWU9TWF0aC5tYXgoZGEuc2hpbmluZXNzLDFFLTQpO2RhLmVtaXNzaXZlTWFwJiYoVS5lbWlzc2l2ZU1hcC52YWx1ZT1kYS5lbWlzc2l2ZU1hcCk7ZGEuYnVtcE1hcCYmKFUuYnVtcE1hcC52YWx1ZT1kYS5idW1wTWFwLFUuYnVtcFNjYWxlLnZhbHVlPWRhLmJ1bXBTY2FsZSwxPT09ZGEuc2lkZSYmKFUuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2RhLm5vcm1hbE1hcCYmKFUubm9ybWFsTWFwLnZhbHVlPQpkYS5ub3JtYWxNYXAsVS5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLm5vcm1hbFNjYWxlKSwxPT09ZGEuc2lkZSYmVS5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSk7ZGEuZGlzcGxhY2VtZW50TWFwJiYoVS5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZGEuZGlzcGxhY2VtZW50TWFwLFUuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZGEuZGlzcGxhY2VtZW50U2NhbGUsVS5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWRhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIFRhKFUsZGEpe0JhKFUsZGEpO2RhLmdyYWRpZW50TWFwJiYoVS5ncmFkaWVudE1hcC52YWx1ZT1kYS5ncmFkaWVudE1hcCl9ZnVuY3Rpb24gVWEoVSxkYSl7VS5yb3VnaG5lc3MudmFsdWU9ZGEucm91Z2huZXNzO1UubWV0YWxuZXNzLnZhbHVlPWRhLm1ldGFsbmVzcztkYS5yb3VnaG5lc3NNYXAmJihVLnJvdWdobmVzc01hcC52YWx1ZT1kYS5yb3VnaG5lc3NNYXApO2RhLm1ldGFsbmVzc01hcCYmKFUubWV0YWxuZXNzTWFwLnZhbHVlPQpkYS5tZXRhbG5lc3NNYXApO2RhLmVtaXNzaXZlTWFwJiYoVS5lbWlzc2l2ZU1hcC52YWx1ZT1kYS5lbWlzc2l2ZU1hcCk7ZGEuYnVtcE1hcCYmKFUuYnVtcE1hcC52YWx1ZT1kYS5idW1wTWFwLFUuYnVtcFNjYWxlLnZhbHVlPWRhLmJ1bXBTY2FsZSwxPT09ZGEuc2lkZSYmKFUuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2RhLm5vcm1hbE1hcCYmKFUubm9ybWFsTWFwLnZhbHVlPWRhLm5vcm1hbE1hcCxVLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZGEubm9ybWFsU2NhbGUpLDE9PT1kYS5zaWRlJiZVLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtkYS5kaXNwbGFjZW1lbnRNYXAmJihVLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxVLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZGEuZGlzcGxhY2VtZW50Qmlhcyk7ZGEuZW52TWFwJiYoVS5lbnZNYXBJbnRlbnNpdHkudmFsdWU9CmRhLmVudk1hcEludGVuc2l0eSl9ZnVuY3Rpb24gQ2EoVSxkYSl7VWEoVSxkYSk7VS5yZWZsZWN0aXZpdHkudmFsdWU9ZGEucmVmbGVjdGl2aXR5O1UuY2xlYXJjb2F0LnZhbHVlPWRhLmNsZWFyY29hdDtVLmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZT1kYS5jbGVhcmNvYXRSb3VnaG5lc3M7ZGEuc2hlZW4mJlUuc2hlZW4udmFsdWUuY29weShkYS5zaGVlbik7ZGEuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoVS5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLmNsZWFyY29hdE5vcm1hbFNjYWxlKSxVLmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1kYS5jbGVhcmNvYXROb3JtYWxNYXAsMT09PWRhLnNpZGUmJlUuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1UudHJhbnNwYXJlbmN5LnZhbHVlPWRhLnRyYW5zcGFyZW5jeX1mdW5jdGlvbiBIYShVLGRhKXtkYS5tYXRjYXAmJihVLm1hdGNhcC52YWx1ZT1kYS5tYXRjYXApO2RhLmJ1bXBNYXAmJihVLmJ1bXBNYXAudmFsdWU9CmRhLmJ1bXBNYXAsVS5idW1wU2NhbGUudmFsdWU9ZGEuYnVtcFNjYWxlLDE9PT1kYS5zaWRlJiYoVS5idW1wU2NhbGUudmFsdWUqPS0xKSk7ZGEubm9ybWFsTWFwJiYoVS5ub3JtYWxNYXAudmFsdWU9ZGEubm9ybWFsTWFwLFUubm9ybWFsU2NhbGUudmFsdWUuY29weShkYS5ub3JtYWxTY2FsZSksMT09PWRhLnNpZGUmJlUubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiBEYShVLGRhKXtkYS5kaXNwbGFjZW1lbnRNYXAmJihVLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxVLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9CmRhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIE1hKFUsZGEpe2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKTtVLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoZGEucmVmZXJlbmNlUG9zaXRpb24pO1UubmVhckRpc3RhbmNlLnZhbHVlPWRhLm5lYXJEaXN0YW5jZTtVLmZhckRpc3RhbmNlLnZhbHVlPWRhLmZhckRpc3RhbmNlfWZ1bmN0aW9uIGRiKFUsZGEpe2RhLmJ1bXBNYXAmJihVLmJ1bXBNYXAudmFsdWU9ZGEuYnVtcE1hcCxVLmJ1bXBTY2FsZS52YWx1ZT1kYS5idW1wU2NhbGUsMT09PWRhLnNpZGUmJihVLmJ1bXBTY2FsZS52YWx1ZSo9LTEpKTtkYS5ub3JtYWxNYXAmJihVLm5vcm1hbE1hcC52YWx1ZT1kYS5ub3JtYWxNYXAsVS5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLm5vcm1hbFNjYWxlKSwKMT09PWRhLnNpZGUmJlUubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiB0YihVLGRhKXtVLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlPWRhO1UubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZT1kYTtVLmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlPWRhO1UucG9pbnRMaWdodHMubmVlZHNVcGRhdGU9ZGE7VS5zcG90TGlnaHRzLm5lZWRzVXBkYXRlPWRhO1UucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGU9ZGE7VS5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlPWRhfWE9YXx8e307dmFyIEthPXZvaWQgMCE9PWEuY2FudmFzP2EuY2FudmFzOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiJjYW52YXMiKSxiYj12b2lkIDAhPT1hLmNvbnRleHQ/YS5jb250ZXh0Om51bGwsamI9dm9pZCAwIT09YS5hbHBoYT9hLmFscGhhOiExLEViPXZvaWQgMCE9PWEuZGVwdGg/YS5kZXB0aDohMCx4Yj12b2lkIDAhPT1hLnN0ZW5jaWw/YS5zdGVuY2lsOiEwLGlhPXZvaWQgMCE9PWEuYW50aWFsaWFzP2EuYW50aWFsaWFzOiExLG5hPXZvaWQgMCE9PWEucHJlbXVsdGlwbGllZEFscGhhP2EucHJlbXVsdGlwbGllZEFscGhhOiEwLHphPXZvaWQgMCE9PWEucHJlc2VydmVEcmF3aW5nQnVmZmVyP2EucHJlc2VydmVEcmF3aW5nQnVmZmVyOiExLEphPXZvaWQgMCE9PWEucG93ZXJQcmVmZXJlbmNlP2EucG93ZXJQcmVmZXJlbmNlOiJkZWZhdWx0IixZYT12b2lkIDAhPT1hLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ/YS5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiExLE5hPW51bGwsY2I9bnVsbDt0aGlzLmRvbUVsZW1lbnQ9S2E7dGhpcy5kZWJ1Zz17Y2hlY2tTaGFkZXJFcnJvcnM6ITB9Owp0aGlzLnNvcnRPYmplY3RzPXRoaXMuYXV0b0NsZWFyU3RlbmNpbD10aGlzLmF1dG9DbGVhckRlcHRoPXRoaXMuYXV0b0NsZWFyQ29sb3I9dGhpcy5hdXRvQ2xlYXI9ITA7dGhpcy5jbGlwcGluZ1BsYW5lcz1bXTt0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkPSExO3RoaXMuZ2FtbWFGYWN0b3I9Mjt0aGlzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzPXRoaXMuZ2FtbWFPdXRwdXQ9dGhpcy5nYW1tYUlucHV0PSExO3RoaXMudG9uZU1hcHBpbmdXaGl0ZVBvaW50PXRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZT10aGlzLnRvbmVNYXBwaW5nPTE7dGhpcy5tYXhNb3JwaFRhcmdldHM9ODt0aGlzLm1heE1vcnBoTm9ybWFscz00O3ZhciBqYT10aGlzLEdhPSExLExhPW51bGwsbmI9MCxWYT0wLGliPW51bGwsa2I9bnVsbCxRYT0tMTt2YXIgZWI9Yz1udWxsO3ZhciBtYj0hMTt2YXIgcGI9bnVsbCxzYj1udWxsLEtiPW5ldyBwLFNiPW5ldyBwLG5jPW51bGwsUWM9S2Eud2lkdGgsemM9S2EuaGVpZ2h0LApjYz0xLHdlPW5ldyBwKDAsMCxRYyx6YyksdmU9bmV3IHAoMCwwLFFjLHpjKSxTaD0hMSxRaD1uZXcgaWMseWM9bmV3IHdjLHhnPSExLFJoPSExLHdmPW5ldyBxLHpkPW5ldyBrO3RyeXtqYj17YWxwaGE6amIsZGVwdGg6RWIsc3RlbmNpbDp4YixhbnRpYWxpYXM6aWEscHJlbXVsdGlwbGllZEFscGhhOm5hLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjp6YSxwb3dlclByZWZlcmVuY2U6SmEsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDpZYSx4ckNvbXBhdGlibGU6ITB9O0thLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHIsITEpO0thLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix2LCExKTt2YXIgUmE9YmJ8fEthLmdldENvbnRleHQoIndlYmdsIixqYil8fEthLmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIsamIpO2lmKG51bGw9PT1SYSl7aWYobnVsbCE9PUthLmdldENvbnRleHQoIndlYmdsIikpdGhyb3cgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIik7CnRocm93IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LiIpO312b2lkIDA9PT1SYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQmJihSYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm57cmFuZ2VNaW46MSxyYW5nZU1heDoxLHByZWNpc2lvbjoxfX0pfWNhdGNoKFUpe3Rocm93IGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6ICIrVS5tZXNzYWdlKSxVO312YXIgTGIsZGMseWIseGQsZWMsT2MsdmcsUGgseGUsUGQsd2cseWUseWQsQmosQ2osRGosTmM7ZygpO3ZhciBkZD0idW5kZWZpbmVkIiE9PXR5cGVvZiBuYXZpZ2F0b3ImJiJ4ciJpbiBuYXZpZ2F0b3ImJiJzdXBwb3J0c1Nlc3Npb24iaW4gbmF2aWdhdG9yLnhyP25ldyBBaihqYSxSYSk6bmV3IE5oKGphKTt0aGlzLnZyPWRkO3ZhciBFaj1uZXcgdmooamEseGUsZGMubWF4VGV4dHVyZVNpemUpO3RoaXMuc2hhZG93TWFwPUVqO3RoaXMuZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiBSYX07CnRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gUmEuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKX07dGhpcy5mb3JjZUNvbnRleHRMb3NzPWZ1bmN0aW9uKCl7dmFyIFU9TGIuZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTtVJiZVLmxvc2VDb250ZXh0KCl9O3RoaXMuZm9yY2VDb250ZXh0UmVzdG9yZT1mdW5jdGlvbigpe3ZhciBVPUxiLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7VSYmVS5yZXN0b3JlQ29udGV4dCgpfTt0aGlzLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4gY2N9O3RoaXMuc2V0UGl4ZWxSYXRpbz1mdW5jdGlvbigpe3ZhciBVPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3ZvaWQgMCE9PVUmJihjYz1VLHRoaXMuc2V0U2l6ZShRYyx6YywhMSkpfTt0aGlzLmdldFNpemU9ZnVuY3Rpb24oVSl7dm9pZCAwPT09VSYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldHNpemUoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3IyIGFzIGFuIGFyZ3VtZW50IiksClU9bmV3IGYpO3JldHVybiBVLnNldChRYyx6Yyl9O3RoaXMuc2V0U2l6ZT1mdW5jdGlvbihVLGRhLG1hKXtkZC5pc1ByZXNlbnRpbmcoKT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IENhbid0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLiIpOihRYz1VLHpjPWRhLEthLndpZHRoPU1hdGguZmxvb3IoVSpjYyksS2EuaGVpZ2h0PU1hdGguZmxvb3IoZGEqY2MpLCExIT09bWEmJihLYS5zdHlsZS53aWR0aD1VKyJweCIsS2Euc3R5bGUuaGVpZ2h0PWRhKyJweCIpLHRoaXMuc2V0Vmlld3BvcnQoVSxkYSkpfTt0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFUpe3ZvaWQgMD09PVUmJihjb25zb2xlLndhcm4oIldlYkdMUmVuZGVyZXI6IC5nZXRkcmF3aW5nQnVmZmVyU2l6ZSgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjIgYXMgYW4gYXJndW1lbnQiKSxVPW5ldyBmKTtyZXR1cm4gVS5zZXQoUWMqY2MsemMqY2MpLmZsb29yKCl9Owp0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFUsZGEsbWEpe1FjPVU7emM9ZGE7Y2M9bWE7S2Eud2lkdGg9TWF0aC5mbG9vcihVKm1hKTtLYS5oZWlnaHQ9TWF0aC5mbG9vcihkYSptYSk7dGhpcy5zZXRWaWV3cG9ydChVLGRhKX07dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQ9ZnVuY3Rpb24oVSl7dm9pZCAwPT09VSYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRWaWV3cG9ydCgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjQgYXMgYW4gYXJndW1lbnQiKSxVPW5ldyBwKTtyZXR1cm4gVS5jb3B5KEtiKX07dGhpcy5nZXRWaWV3cG9ydD1mdW5jdGlvbihVKXtyZXR1cm4gVS5jb3B5KHdlKX07dGhpcy5zZXRWaWV3cG9ydD1mdW5jdGlvbihVLGRhKXsoMCkuaXNWZWN0b3I0P3dlLnNldCgoMCkueCwoMCkueSwoMCkueiwoMCkudyk6d2Uuc2V0KDAsMCxVLGRhKTt5Yi52aWV3cG9ydChLYi5jb3B5KHdlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSl9Owp0aGlzLmdldFNjaXNzb3I9ZnVuY3Rpb24oVSl7cmV0dXJuIFUuY29weSh2ZSl9O3RoaXMuc2V0U2Npc3Nvcj1mdW5jdGlvbihVLGRhLG1hLElhKXtVLmlzVmVjdG9yND92ZS5zZXQoVS54LFUueSxVLnosVS53KTp2ZS5zZXQoVSxkYSxtYSxJYSk7eWIuc2Npc3NvcihTYi5jb3B5KHZlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSl9O3RoaXMuZ2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gU2h9O3RoaXMuc2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oVSl7eWIuc2V0U2Npc3NvclRlc3QoU2g9VSl9O3RoaXMuZ2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3JldHVybiB5ZC5nZXRDbGVhckNvbG9yKCl9O3RoaXMuc2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3lkLnNldENsZWFyQ29sb3IuYXBwbHkoeWQsYXJndW1lbnRzKX07dGhpcy5nZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7cmV0dXJuIHlkLmdldENsZWFyQWxwaGEoKX07dGhpcy5zZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7eWQuc2V0Q2xlYXJBbHBoYS5hcHBseSh5ZCwKYXJndW1lbnRzKX07dGhpcy5jbGVhcj1mdW5jdGlvbihVLGRhLG1hKXt2YXIgSWE9MDtpZih2b2lkIDA9PT1VfHxVKUlhfD0xNjM4NDtpZih2b2lkIDA9PT1kYXx8ZGEpSWF8PTI1NjtpZih2b2lkIDA9PT1tYXx8bWEpSWF8PTEwMjQ7UmEuY2xlYXIoSWEpfTt0aGlzLmNsZWFyQ29sb3I9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCEwLCExLCExKX07dGhpcy5jbGVhckRlcHRoPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMCwhMSl9O3RoaXMuY2xlYXJTdGVuY2lsPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMSwhMCl9O3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe0thLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHIsITEpO0thLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix2LCExKTt3Zy5kaXNwb3NlKCk7eWUuZGlzcG9zZSgpO2VjLmRpc3Bvc2UoKTt4ZS5kaXNwb3NlKCk7ZGQuZGlzcG9zZSgpO3lnLnN0b3AoKX07dGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGU9CmZ1bmN0aW9uKFUsZGEpe3liLmluaXRBdHRyaWJ1dGVzKCk7dmFyIG1hPWVjLmdldChVKTtVLmhhc1Bvc2l0aW9ucyYmIW1hLnBvc2l0aW9uJiYobWEucG9zaXRpb249UmEuY3JlYXRlQnVmZmVyKCkpO1UuaGFzTm9ybWFscyYmIW1hLm5vcm1hbCYmKG1hLm5vcm1hbD1SYS5jcmVhdGVCdWZmZXIoKSk7VS5oYXNVdnMmJiFtYS51diYmKG1hLnV2PVJhLmNyZWF0ZUJ1ZmZlcigpKTtVLmhhc0NvbG9ycyYmIW1hLmNvbG9yJiYobWEuY29sb3I9UmEuY3JlYXRlQnVmZmVyKCkpO2RhPWRhLmdldEF0dHJpYnV0ZXMoKTtVLmhhc1Bvc2l0aW9ucyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbWEucG9zaXRpb24pLFJhLmJ1ZmZlckRhdGEoMzQ5NjIsVS5wb3NpdGlvbkFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoZGEucG9zaXRpb24pLFJhLnZlcnRleEF0dHJpYlBvaW50ZXIoZGEucG9zaXRpb24sMyw1MTI2LCExLDAsMCkpO1UuaGFzTm9ybWFscyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbWEubm9ybWFsKSwKUmEuYnVmZmVyRGF0YSgzNDk2MixVLm5vcm1hbEFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoZGEubm9ybWFsKSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRhLm5vcm1hbCwzLDUxMjYsITEsMCwwKSk7VS5oYXNVdnMmJihSYS5iaW5kQnVmZmVyKDM0OTYyLG1hLnV2KSxSYS5idWZmZXJEYXRhKDM0OTYyLFUudXZBcnJheSwzNTA0OCkseWIuZW5hYmxlQXR0cmlidXRlKGRhLnV2KSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRhLnV2LDIsNTEyNiwhMSwwLDApKTtVLmhhc0NvbG9ycyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbWEuY29sb3IpLFJhLmJ1ZmZlckRhdGEoMzQ5NjIsVS5jb2xvckFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoZGEuY29sb3IpLFJhLnZlcnRleEF0dHJpYlBvaW50ZXIoZGEuY29sb3IsMyw1MTI2LCExLDAsMCkpO3liLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7UmEuZHJhd0FycmF5cyg0LDAsVS5jb3VudCk7VS5jb3VudD0wfTt0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdD0KZnVuY3Rpb24oVSxkYSxtYSxJYSxPYSxhYil7eWIuc2V0TWF0ZXJpYWwoSWEsT2EuaXNNZXNoJiYwPk9hLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkpO3ZhciBQYT1oYShVLGRhLElhLE9hKSxmYj0hMTtpZihjIT09bWEuaWR8fGViIT09UGEuaWR8fG1iIT09KCEwPT09SWEud2lyZWZyYW1lKSljPW1hLmlkLGViPVBhLmlkLG1iPSEwPT09SWEud2lyZWZyYW1lLGZiPSEwO09hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKEJqLnVwZGF0ZShPYSxtYSxJYSxQYSksZmI9ITApO3ZhciBDYj1tYS5pbmRleCxvYj1tYS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2RhPTE7ITA9PT1JYS53aXJlZnJhbWUmJihDYj1QaC5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUobWEpLGRhPTIpO1U9Q2o7aWYobnVsbCE9PUNiKXt2YXIgJGE9dmcuZ2V0KENiKTtVPURqO1Uuc2V0SW5kZXgoJGEpfWZiJiYoUChJYSxQYSxtYSksbnVsbCE9PUNiJiZSYS5iaW5kQnVmZmVyKDM0OTYzLCRhLmJ1ZmZlcikpOyRhPUluZmluaXR5OwpudWxsIT09Q2I/JGE9Q2IuY291bnQ6dm9pZCAwIT09b2ImJigkYT1vYi5jb3VudCk7b2I9bWEuZHJhd1JhbmdlLnN0YXJ0KmRhO1BhPW51bGwhPT1hYj9hYi5zdGFydCpkYTowO0NiPU1hdGgubWF4KG9iLFBhKTthYj1NYXRoLm1heCgwLE1hdGgubWluKCRhLG9iK21hLmRyYXdSYW5nZS5jb3VudCpkYSxQYSsobnVsbCE9PWFiP2FiLmNvdW50KmRhOkluZmluaXR5KSktMS1DYisxKTtpZigwIT09YWIpe2lmKE9hLmlzTWVzaClpZighMD09PUlhLndpcmVmcmFtZSl5Yi5zZXRMaW5lV2lkdGgoSWEud2lyZWZyYW1lTGluZXdpZHRoKmUoKSksVS5zZXRNb2RlKDEpO2Vsc2Ugc3dpdGNoKE9hLmRyYXdNb2RlKXtjYXNlIDA6VS5zZXRNb2RlKDQpO2JyZWFrO2Nhc2UgMTpVLnNldE1vZGUoNSk7YnJlYWs7Y2FzZSAyOlUuc2V0TW9kZSg2KX1lbHNlIE9hLmlzTGluZT8oSWE9SWEubGluZXdpZHRoLHZvaWQgMD09PUlhJiYoSWE9MSkseWIuc2V0TGluZVdpZHRoKElhKmUoKSksT2EuaXNMaW5lU2VnbWVudHM/ClUuc2V0TW9kZSgxKTpPYS5pc0xpbmVMb29wP1Uuc2V0TW9kZSgyKTpVLnNldE1vZGUoMykpOk9hLmlzUG9pbnRzP1Uuc2V0TW9kZSgwKTpPYS5pc1Nwcml0ZSYmVS5zZXRNb2RlKDQpO21hJiZtYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PzA8bWEubWF4SW5zdGFuY2VkQ291bnQmJlUucmVuZGVySW5zdGFuY2VzKG1hLENiLGFiKTpVLnJlbmRlcihDYixhYil9fTt0aGlzLmNvbXBpbGU9ZnVuY3Rpb24oVSxkYSl7Y2I9eWUuZ2V0KFUsZGEpO2NiLmluaXQoKTtVLnRyYXZlcnNlKGZ1bmN0aW9uKG1hKXttYS5pc0xpZ2h0JiYoY2IucHVzaExpZ2h0KG1hKSxtYS5jYXN0U2hhZG93JiZjYi5wdXNoU2hhZG93KG1hKSl9KTtjYi5zZXR1cExpZ2h0cyhkYSk7VS50cmF2ZXJzZShmdW5jdGlvbihtYSl7aWYobWEubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheShtYS5tYXRlcmlhbCkpZm9yKHZhciBJYT0wO0lhPG1hLm1hdGVyaWFsLmxlbmd0aDtJYSsrKVcobWEubWF0ZXJpYWxbSWFdLFUuZm9nLAptYSk7ZWxzZSBXKG1hLm1hdGVyaWFsLFUuZm9nLG1hKX0pfTt2YXIgVGg9bnVsbCx5Zz1uZXcgYmM7eWcuc2V0QW5pbWF0aW9uTG9vcChmdW5jdGlvbihVKXtkZC5pc1ByZXNlbnRpbmcoKXx8VGgmJlRoKFUpfSk7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiZ5Zy5zZXRDb250ZXh0KHdpbmRvdyk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKFUpe1RoPVU7ZGQuc2V0QW5pbWF0aW9uTG9vcChVKTt5Zy5zdGFydCgpfTt0aGlzLnJlbmRlcj1mdW5jdGlvbihVLGRhLG1hLElhKXtpZih2b2lkIDAhPT1tYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcigpOiB0aGUgcmVuZGVyVGFyZ2V0IGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuc2V0UmVuZGVyVGFyZ2V0KCkgaW5zdGVhZC4iKTt2YXIgT2E9bWF9aWYodm9pZCAwIT09SWEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXIoKTogdGhlIGZvcmNlQ2xlYXIgYXJndW1lbnQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5jbGVhcigpIGluc3RlYWQuIik7CnZhciBhYj1JYX1kYSYmZGEuaXNDYW1lcmE/R2F8fChlYj1jPW51bGwsbWI9ITEsUWE9LTEscGI9bnVsbCwhMD09PVUuYXV0b1VwZGF0ZSYmVS51cGRhdGVNYXRyaXhXb3JsZCgpLG51bGw9PT1kYS5wYXJlbnQmJmRhLnVwZGF0ZU1hdHJpeFdvcmxkKCksZGQuZW5hYmxlZCYmKGRhPWRkLmdldENhbWVyYShkYSkpLGNiPXllLmdldChVLGRhKSxjYi5pbml0KCksVS5vbkJlZm9yZVJlbmRlcihqYSxVLGRhLE9hfHxpYiksd2YubXVsdGlwbHlNYXRyaWNlcyhkYS5wcm9qZWN0aW9uTWF0cml4LGRhLm1hdHJpeFdvcmxkSW52ZXJzZSksUWguc2V0RnJvbU1hdHJpeCh3ZiksUmg9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCx4Zz15Yy5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsUmgsZGEpLE5hPXdnLmdldChVLGRhKSxOYS5pbml0KCksUihVLGRhLDAsamEuc29ydE9iamVjdHMpLCEwPT09amEuc29ydE9iamVjdHMmJk5hLnNvcnQoKSx4ZyYmeWMuYmVnaW5TaGFkb3dzKCksRWoucmVuZGVyKGNiLnN0YXRlLnNoYWRvd3NBcnJheSwKVSxkYSksY2Iuc2V0dXBMaWdodHMoZGEpLHhnJiZ5Yy5lbmRTaGFkb3dzKCksdGhpcy5pbmZvLmF1dG9SZXNldCYmdGhpcy5pbmZvLnJlc2V0KCksdm9pZCAwIT09T2EmJnRoaXMuc2V0UmVuZGVyVGFyZ2V0KE9hKSx5ZC5yZW5kZXIoTmEsVSxkYSxhYiksbWE9TmEub3BhcXVlLElhPU5hLnRyYW5zcGFyZW50LFUub3ZlcnJpZGVNYXRlcmlhbD8oT2E9VS5vdmVycmlkZU1hdGVyaWFsLG1hLmxlbmd0aCYmUyhtYSxVLGRhLE9hKSxJYS5sZW5ndGgmJlMoSWEsVSxkYSxPYSkpOihtYS5sZW5ndGgmJlMobWEsVSxkYSksSWEubGVuZ3RoJiZTKElhLFUsZGEpKSxudWxsIT09aWImJihPYy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoaWIpLE9jLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KGliKSkseWIuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSx5Yi5idWZmZXJzLmRlcHRoLnNldE1hc2soITApLHliLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayghMCkseWIuc2V0UG9seWdvbk9mZnNldCghMSksCmRkLmVuYWJsZWQmJmRkLnN1Ym1pdEZyYW1lKCksY2I9TmE9bnVsbCk6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLiIpfTt0aGlzLnNldEZyYW1lYnVmZmVyPWZ1bmN0aW9uKFUpe0xhIT09VSYmUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLFUpO0xhPVV9O3RoaXMuZ2V0QWN0aXZlQ3ViZUZhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gbmJ9O3RoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gVmF9O3RoaXMuZ2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGlifTt0aGlzLnNldFJlbmRlclRhcmdldD1mdW5jdGlvbihVLGRhLG1hKXtpYj1VO25iPWRhO1ZhPW1hO1UmJnZvaWQgMD09PWVjLmdldChVKS5fX3dlYmdsRnJhbWVidWZmZXImJk9jLnNldHVwUmVuZGVyVGFyZ2V0KFUpO3ZhciBJYT1MYSxPYT0hMTtVPyhJYT1lYy5nZXQoVSkuX193ZWJnbEZyYW1lYnVmZmVyLApVLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPyhJYT1JYVtkYXx8MF0sT2E9ITApOklhPVUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0P2VjLmdldChVKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI6SWEsS2IuY29weShVLnZpZXdwb3J0KSxTYi5jb3B5KFUuc2Npc3NvciksbmM9VS5zY2lzc29yVGVzdCk6KEtiLmNvcHkod2UpLm11bHRpcGx5U2NhbGFyKGNjKS5mbG9vcigpLFNiLmNvcHkodmUpLm11bHRpcGx5U2NhbGFyKGNjKS5mbG9vcigpLG5jPVNoKTtrYiE9PUlhJiYoUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLElhKSxrYj1JYSk7eWIudmlld3BvcnQoS2IpO3liLnNjaXNzb3IoU2IpO3liLnNldFNjaXNzb3JUZXN0KG5jKTtPYSYmKFU9ZWMuZ2V0KFUudGV4dHVyZSksUmEuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwNjQsMzQwNjkrKGRhfHwwKSxVLl9fd2ViZ2xUZXh0dXJlLG1hfHwwKSl9O3RoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscz1mdW5jdGlvbihVLApkYSxtYSxJYSxPYSxhYixQYSl7aWYoVSYmVS5pc1dlYkdMUmVuZGVyVGFyZ2V0KXt2YXIgZmI9ZWMuZ2V0KFUpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtVLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlJiZ2b2lkIDAhPT1QYSYmKGZiPWZiW1BhXSk7aWYoZmIpe1BhPSExO2ZiIT09a2ImJihSYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsZmIpLFBhPSEwKTt0cnl7dmFyIENiPVUudGV4dHVyZSxvYj1DYi5mb3JtYXQsJGE9Q2IudHlwZTsxMDIzIT09b2ImJk5jLmNvbnZlcnQob2IpIT09UmEuZ2V0UGFyYW1ldGVyKDM1NzM5KT9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKToxMDA5PT09JGF8fE5jLmNvbnZlcnQoJGEpPT09UmEuZ2V0UGFyYW1ldGVyKDM1NzM4KXx8MTAxNT09PSRhJiYoZGMuaXNXZWJHTDJ8fExiLmdldCgiT0VTX3RleHR1cmVfZmxvYXQiKXx8CkxiLmdldCgiV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IikpfHwxMDE2PT09JGEmJihkYy5pc1dlYkdMMj9MYi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTpMYi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpKT8zNjA1Mz09PVJhLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoMzYxNjApPzA8PWRhJiZkYTw9VS53aWR0aC1JYSYmMDw9bWEmJm1hPD1VLmhlaWdodC1PYSYmUmEucmVhZFBpeGVscyhkYSxtYSxJYSxPYSxOYy5jb252ZXJ0KG9iKSxOYy5jb252ZXJ0KCRhKSxhYik6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKX1maW5hbGx5e1BhJiYKUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLGtiKX19fWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LiIpfTt0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbihVLGRhLG1hKXt2YXIgSWE9ZGEuaW1hZ2Uud2lkdGgsT2E9ZGEuaW1hZ2UuaGVpZ2h0LGFiPU5jLmNvbnZlcnQoZGEuZm9ybWF0KTtPYy5zZXRUZXh0dXJlMkQoZGEsMCk7UmEuY29weVRleEltYWdlMkQoMzU1MyxtYXx8MCxhYixVLngsVS55LElhLE9hLDApfTt0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlPWZ1bmN0aW9uKFUsZGEsbWEsSWEpe3ZhciBPYT1kYS5pbWFnZS53aWR0aCxhYj1kYS5pbWFnZS5oZWlnaHQsUGE9TmMuY29udmVydChtYS5mb3JtYXQpLGZiPU5jLmNvbnZlcnQobWEudHlwZSk7T2Muc2V0VGV4dHVyZTJEKG1hLDApO2RhLmlzRGF0YVRleHR1cmU/ClJhLnRleFN1YkltYWdlMkQoMzU1MyxJYXx8MCxVLngsVS55LE9hLGFiLFBhLGZiLGRhLmltYWdlLmRhdGEpOlJhLnRleFN1YkltYWdlMkQoMzU1MyxJYXx8MCxVLngsVS55LFBhLGZiLGRhLmltYWdlKX07InVuZGVmaW5lZCIhPT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1mdW5jdGlvbiB6ZyhhLGMpe3RoaXMubmFtZT0iIjt0aGlzLmNvbG9yPW5ldyBJKGEpO3RoaXMuZGVuc2l0eT12b2lkIDAhPT1jP2M6Mi41RS00fWZ1bmN0aW9uIEFnKGEsYyxlKXt0aGlzLm5hbWU9IiI7dGhpcy5jb2xvcj1uZXcgSShhKTt0aGlzLm5lYXI9dm9pZCAwIT09Yz9jOjE7dGhpcy5mYXI9dm9pZCAwIT09ZT9lOjFFM31mdW5jdGlvbiBRZChhLGMpe3RoaXMuYXJyYXk9YTt0aGlzLnN0cmlkZT1jO3RoaXMuY291bnQ9dm9pZCAwIT09YT9hLmxlbmd0aC9jOjA7dGhpcy5keW5hbWljPQohMTt0aGlzLnVwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX07dGhpcy52ZXJzaW9uPTB9ZnVuY3Rpb24geGYoYSxjLGUsZyl7dGhpcy5kYXRhPWE7dGhpcy5pdGVtU2l6ZT1jO3RoaXMub2Zmc2V0PWU7dGhpcy5ub3JtYWxpemVkPSEwPT09Z31mdW5jdGlvbiBBZChhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcHJpdGVNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5tYXA9bnVsbDt0aGlzLnJvdGF0aW9uPTA7dGhpcy5zaXplQXR0ZW51YXRpb249ITA7dGhpcy5saWdodHM9ITE7dGhpcy50cmFuc3BhcmVudD0hMDt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiB5ZihhKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcHJpdGUiO2lmKHZvaWQgMD09PUFlKXtBZT1uZXcgdmE7dmFyIGM9bmV3IFFkKG5ldyBGbG9hdDMyQXJyYXkoWy0uNSwtLjUsMCwwLDAsLjUsLS41LDAsMSwwLC41LC41LDAsMSwxLC0uNSwuNSwwLDAsMV0pLDUpO0FlLnNldEluZGV4KFswLAoxLDIsMCwyLDNdKTtBZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgeGYoYywzLDAsITEpKTtBZS5hZGRBdHRyaWJ1dGUoInV2IixuZXcgeGYoYywyLDMsITEpKX10aGlzLmdlb21ldHJ5PUFlO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09YT9hOm5ldyBBZDt0aGlzLmNlbnRlcj1uZXcgZiguNSwuNSl9ZnVuY3Rpb24gQmcoYSxjLGUsZyxyLHYpe0JlLnN1YlZlY3RvcnMoYSxlKS5hZGRTY2FsYXIoLjUpLm11bHRpcGx5KGcpO3ZvaWQgMCE9PXI/KHpmLng9dipCZS54LXIqQmUueSx6Zi55PXIqQmUueCt2KkJlLnkpOnpmLmNvcHkoQmUpO2EuY29weShjKTthLngrPXpmLng7YS55Kz16Zi55O2EuYXBwbHlNYXRyaXg0KEZqKX1mdW5jdGlvbiBBZigpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxPRCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7bGV2ZWxzOntlbnVtZXJhYmxlOiEwLHZhbHVlOltdfX0pO3RoaXMuYXV0b1VwZGF0ZT0hMH1mdW5jdGlvbiBCZihhLGMpe2EmJmEuaXNHZW9tZXRyeSYmCmNvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIik7eGEuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJTa2lubmVkTWVzaCI7dGhpcy5iaW5kTW9kZT0iYXR0YWNoZWQiO3RoaXMuYmluZE1hdHJpeD1uZXcgcTt0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyBxfWZ1bmN0aW9uIENnKGEsYyl7YT1hfHxbXTt0aGlzLmJvbmVzPWEuc2xpY2UoMCk7dGhpcy5ib25lTWF0cmljZXM9bmV3IEZsb2F0MzJBcnJheSgxNip0aGlzLmJvbmVzLmxlbmd0aCk7aWYodm9pZCAwPT09Yyl0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7ZWxzZSBpZih0aGlzLmJvbmVzLmxlbmd0aD09PWMubGVuZ3RoKXRoaXMuYm9uZUludmVyc2VzPWMuc2xpY2UoMCk7ZWxzZSBmb3IoY29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4iKSwKdGhpcy5ib25lSW52ZXJzZXM9W10sYT0wLGM9dGhpcy5ib25lcy5sZW5ndGg7YTxjO2ErKyl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBxKX1mdW5jdGlvbiBVaCgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJvbmUifWZ1bmN0aW9uIEZiKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmxpbmV3aWR0aD0xO3RoaXMubGluZWpvaW49dGhpcy5saW5lY2FwPSJyb3VuZCI7dGhpcy5saWdodHM9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gVmIoYSxjLGUpezE9PT1lJiZjb25zb2xlLmVycm9yKCJUSFJFRS5MaW5lOiBwYXJhbWV0ZXIgVEhSRUUuTGluZVBpZWNlcyBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2UgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuIik7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGluZSI7dGhpcy5nZW9tZXRyeT12b2lkIDAhPT1hP2E6bmV3IHZhO3RoaXMubWF0ZXJpYWw9CnZvaWQgMCE9PWM/YzpuZXcgRmIoe2NvbG9yOjE2Nzc3MjE1Kk1hdGgucmFuZG9tKCl9KX1mdW5jdGlvbiBJYihhLGMpe1ZiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iTGluZVNlZ21lbnRzIn1mdW5jdGlvbiBEZyhhLGMpe1ZiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iTGluZUxvb3AifWZ1bmN0aW9uIEFjKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvaW50c01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLm1hcD1udWxsO3RoaXMuc2l6ZT0xO3RoaXMuc2l6ZUF0dGVudWF0aW9uPSEwO3RoaXMubGlnaHRzPXRoaXMubW9ycGhUYXJnZXRzPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIENlKGEsYyl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUG9pbnRzIjt0aGlzLmdlb21ldHJ5PXZvaWQgMCE9PWE/YTpuZXcgdmE7dGhpcy5tYXRlcmlhbD12b2lkIDAhPT1jP2M6bmV3IEFjKHtjb2xvcjoxNjc3NzIxNSpNYXRoLnJhbmRvbSgpfSk7dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX0KZnVuY3Rpb24gVmgoYSxjLGUsZyxyLHYseil7dmFyIEU9V2guZGlzdGFuY2VTcVRvUG9pbnQoYSk7RTxlJiYoZT1uZXcgayxXaC5jbG9zZXN0UG9pbnRUb1BvaW50KGEsZSksZS5hcHBseU1hdHJpeDQoZyksYT1yLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhlKSxhPHIubmVhcnx8YT5yLmZhcnx8di5wdXNoKHtkaXN0YW5jZTphLGRpc3RhbmNlVG9SYXk6TWF0aC5zcXJ0KEUpLHBvaW50OmUsaW5kZXg6YyxmYWNlOm51bGwsb2JqZWN0Onp9KSl9ZnVuY3Rpb24gWGgoYSxjLGUsZyxyLHYseixFLEYpe2wuY2FsbCh0aGlzLGEsYyxlLGcscix2LHosRSxGKTt0aGlzLmZvcm1hdD12b2lkIDAhPT16P3o6MTAyMjt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT12P3Y6MTAwNjt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT1yP3I6MTAwNjt0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiBEZShhLGMsZSxnLHIsdix6LEUsRixKLFAsUil7bC5jYWxsKHRoaXMsbnVsbCx2LHosRSxGLEosZyxyLFAsClIpO3RoaXMuaW1hZ2U9e3dpZHRoOmMsaGVpZ2h0OmV9O3RoaXMubWlwbWFwcz1hO3RoaXMuZ2VuZXJhdGVNaXBtYXBzPXRoaXMuZmxpcFk9ITF9ZnVuY3Rpb24gQ2YoYSxjLGUsZyxyLHYseixFLEYpe2wuY2FsbCh0aGlzLGEsYyxlLGcscix2LHosRSxGKTt0aGlzLm5lZWRzVXBkYXRlPSEwfWZ1bmN0aW9uIERmKGEsYyxlLGcscix2LHosRSxGLEope0o9dm9pZCAwIT09Sj9KOjEwMjY7aWYoMTAyNiE9PUomJjEwMjchPT1KKXRocm93IEVycm9yKCJEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCIpO3ZvaWQgMD09PWUmJjEwMjY9PT1KJiYoZT0xMDEyKTt2b2lkIDA9PT1lJiYxMDI3PT09SiYmKGU9MTAyMCk7bC5jYWxsKHRoaXMsbnVsbCxnLHIsdix6LEUsSixlLEYpO3RoaXMuaW1hZ2U9e3dpZHRoOmEsaGVpZ2h0OmN9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PXo/ejoxMDAzO3RoaXMubWluRmlsdGVyPQp2b2lkIDAhPT1FP0U6MTAwMzt0aGlzLmdlbmVyYXRlTWlwbWFwcz10aGlzLmZsaXBZPSExfWZ1bmN0aW9uIEVlKGEpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJXaXJlZnJhbWVHZW9tZXRyeSI7dmFyIGM9W10sZSxnLHIsdj1bMCwwXSx6PXt9LEU9WyJhIiwiYiIsImMiXTtpZihhJiZhLmlzR2VvbWV0cnkpe3ZhciBGPWEuZmFjZXM7dmFyIEo9MDtmb3IoZz1GLmxlbmd0aDtKPGc7SisrKXt2YXIgUD1GW0pdO2ZvcihlPTA7Mz5lO2UrKyl7dmFyIFI9UFtFW2VdXTt2YXIgUz1QW0VbKGUrMSklM11dO3ZbMF09TWF0aC5taW4oUixTKTt2WzFdPU1hdGgubWF4KFIsUyk7Uj12WzBdKyIsIit2WzFdO3ZvaWQgMD09PXpbUl0mJih6W1JdPXtpbmRleDE6dlswXSxpbmRleDI6dlsxXX0pfX1mb3IoUiBpbiB6KUo9eltSXSxFPWEudmVydGljZXNbSi5pbmRleDFdLGMucHVzaChFLngsRS55LEUueiksRT1hLnZlcnRpY2VzW0ouaW5kZXgyXSxjLnB1c2goRS54LEUueSxFLnopfWVsc2UgaWYoYSYmCmEuaXNCdWZmZXJHZW9tZXRyeSlpZihFPW5ldyBrLG51bGwhPT1hLmluZGV4KXtGPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtQPWEuaW5kZXg7dmFyIFY9YS5ncm91cHM7MD09PVYubGVuZ3RoJiYoVj1be3N0YXJ0OjAsY291bnQ6UC5jb3VudCxtYXRlcmlhbEluZGV4OjB9XSk7YT0wO2ZvcihyPVYubGVuZ3RoO2E8cjsrK2EpZm9yKEo9VlthXSxlPUouc3RhcnQsZz1KLmNvdW50LEo9ZSxnPWUrZztKPGc7Sis9Mylmb3IoZT0wOzM+ZTtlKyspUj1QLmdldFgoSitlKSxTPVAuZ2V0WChKKyhlKzEpJTMpLHZbMF09TWF0aC5taW4oUixTKSx2WzFdPU1hdGgubWF4KFIsUyksUj12WzBdKyIsIit2WzFdLHZvaWQgMD09PXpbUl0mJih6W1JdPXtpbmRleDE6dlswXSxpbmRleDI6dlsxXX0pO2ZvcihSIGluIHopSj16W1JdLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShGLEouaW5kZXgxKSxjLnB1c2goRS54LEUueSxFLnopLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShGLEouaW5kZXgyKSxjLnB1c2goRS54LApFLnksRS56KX1lbHNlIGZvcihGPWEuYXR0cmlidXRlcy5wb3NpdGlvbixKPTAsZz1GLmNvdW50LzM7SjxnO0orKylmb3IoZT0wOzM+ZTtlKyspej0zKkorZSxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRix6KSxjLnB1c2goRS54LEUueSxFLnopLHo9MypKKyhlKzEpJTMsRS5mcm9tQnVmZmVyQXR0cmlidXRlKEYseiksYy5wdXNoKEUueCxFLnksRS56KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShjLDMpKX1mdW5jdGlvbiBFZihhLGMsZSl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBhcmFtZXRyaWNHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtmdW5jOmEsc2xpY2VzOmMsc3RhY2tzOmV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBGZShhLGMsZSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEZlKGEsYyxlKXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2Z1bmM6YSwKc2xpY2VzOmMsc3RhY2tzOmV9O3ZhciBnPVtdLHI9W10sdj1bXSx6PVtdLEU9bmV3IGssRj1uZXcgayxKPW5ldyBrLFA9bmV3IGssUj1uZXcgayxTLFY7Mz5hLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuUGFyYW1ldHJpY0dlb21ldHJ5OiBGdW5jdGlvbiBtdXN0IG5vdyBtb2RpZnkgYSBWZWN0b3IzIGFzIHRoaXJkIHBhcmFtZXRlci4iKTt2YXIgVz1jKzE7Zm9yKFM9MDtTPD1lO1MrKyl7dmFyIGhhPVMvZTtmb3IoVj0wO1Y8PWM7VisrKXt2YXIgZmE9Vi9jO2EoZmEsaGEsRik7ci5wdXNoKEYueCxGLnksRi56KTswPD1mYS0xRS01PyhhKGZhLTFFLTUsaGEsSiksUC5zdWJWZWN0b3JzKEYsSikpOihhKGZhKzFFLTUsaGEsSiksUC5zdWJWZWN0b3JzKEosRikpOzA8PWhhLTFFLTU/KGEoZmEsaGEtMUUtNSxKKSxSLnN1YlZlY3RvcnMoRixKKSk6KGEoZmEsaGErMUUtNSxKKSxSLnN1YlZlY3RvcnMoSixGKSk7RS5jcm9zc1ZlY3RvcnMoUCxSKS5ub3JtYWxpemUoKTt2LnB1c2goRS54LApFLnksRS56KTt6LnB1c2goZmEsaGEpfX1mb3IoUz0wO1M8ZTtTKyspZm9yKFY9MDtWPGM7VisrKWE9UypXK1YrMSxFPShTKzEpKlcrVisxLEY9KFMrMSkqVytWLGcucHVzaChTKlcrVixhLEYpLGcucHVzaChhLEUsRik7dGhpcy5zZXRJbmRleChnKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShyLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoeiwyKSl9ZnVuY3Rpb24gRmYoYSxjLGUsZyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczphLGluZGljZXM6YyxyYWRpdXM6ZSxkZXRhaWw6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IGpjKGEsYyxlLGcpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBqYyhhLGMsZSxnKXtmdW5jdGlvbiByKFcsaGEsZmEscmEpe3JhPU1hdGgucG93KDIsCnJhKTt2YXIgcGE9W10scWEsdWE7Zm9yKHFhPTA7cWE8PXJhO3FhKyspe3BhW3FhXT1bXTt2YXIgb2E9Vy5jbG9uZSgpLmxlcnAoZmEscWEvcmEpLHRhPWhhLmNsb25lKCkubGVycChmYSxxYS9yYSksQmE9cmEtcWE7Zm9yKHVhPTA7dWE8PUJhO3VhKyspcGFbcWFdW3VhXT0wPT09dWEmJnFhPT09cmE/b2E6b2EuY2xvbmUoKS5sZXJwKHRhLHVhL0JhKX1mb3IocWE9MDtxYTxyYTtxYSsrKWZvcih1YT0wO3VhPDIqKHJhLXFhKS0xO3VhKyspVz1NYXRoLmZsb29yKHVhLzIpLDA9PT11YSUyPyh6KHBhW3FhXVtXKzFdKSx6KHBhW3FhKzFdW1ddKSx6KHBhW3FhXVtXXSkpOih6KHBhW3FhXVtXKzFdKSx6KHBhW3FhKzFdW1crMV0pLHoocGFbcWErMV1bV10pKX1mdW5jdGlvbiB2KCl7Zm9yKHZhciBXPTA7VzxWLmxlbmd0aDtXKz02KXt2YXIgaGE9VltXKzBdLGZhPVZbVysyXSxyYT1WW1crNF0scGE9TWF0aC5taW4oaGEsZmEscmEpOy45PE1hdGgubWF4KGhhLGZhLHJhKSYmLjE+cGEmJiguMj4KaGEmJihWW1crMF0rPTEpLC4yPmZhJiYoVltXKzJdKz0xKSwuMj5yYSYmKFZbVys0XSs9MSkpfX1mdW5jdGlvbiB6KFcpe1MucHVzaChXLngsVy55LFcueil9ZnVuY3Rpb24gRShXLGhhKXtXKj0zO2hhLng9YVtXKzBdO2hhLnk9YVtXKzFdO2hhLno9YVtXKzJdfWZ1bmN0aW9uIEYoKXtmb3IodmFyIFc9bmV3IGssaGE9bmV3IGssZmE9bmV3IGsscmE9bmV3IGsscGE9bmV3IGYscWE9bmV3IGYsdWE9bmV3IGYsb2E9MCx0YT0wO29hPFMubGVuZ3RoO29hKz05LHRhKz02KXtXLnNldChTW29hKzBdLFNbb2ErMV0sU1tvYSsyXSk7aGEuc2V0KFNbb2ErM10sU1tvYSs0XSxTW29hKzVdKTtmYS5zZXQoU1tvYSs2XSxTW29hKzddLFNbb2ErOF0pO3BhLnNldChWW3RhKzBdLFZbdGErMV0pO3FhLnNldChWW3RhKzJdLFZbdGErM10pO3VhLnNldChWW3RhKzRdLFZbdGErNV0pO3JhLmNvcHkoVykuYWRkKGhhKS5hZGQoZmEpLmRpdmlkZVNjYWxhcigzKTt2YXIgQmE9UChyYSk7SihwYSx0YSswLFcsCkJhKTtKKHFhLHRhKzIsaGEsQmEpO0oodWEsdGErNCxmYSxCYSl9fWZ1bmN0aW9uIEooVyxoYSxmYSxyYSl7MD5yYSYmMT09PVcueCYmKFZbaGFdPVcueC0xKTswPT09ZmEueCYmMD09PWZhLnomJihWW2hhXT1yYS8yL01hdGguUEkrLjUpfWZ1bmN0aW9uIFAoVyl7cmV0dXJuIE1hdGguYXRhbjIoVy56LC1XLngpfWZ1bmN0aW9uIFIoVyl7cmV0dXJuIE1hdGguYXRhbjIoLVcueSxNYXRoLnNxcnQoVy54KlcueCtXLnoqVy56KSl9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczphLGluZGljZXM6YyxyYWRpdXM6ZSxkZXRhaWw6Z307ZT1lfHwxO2c9Z3x8MDt2YXIgUz1bXSxWPVtdOyhmdW5jdGlvbihXKXtmb3IodmFyIGhhPW5ldyBrLGZhPW5ldyBrLHJhPW5ldyBrLHBhPTA7cGE8Yy5sZW5ndGg7cGErPTMpRShjW3BhKzBdLGhhKSxFKGNbcGErMV0sZmEpLEUoY1twYSsyXSxyYSkscihoYSxmYSxyYSwKVyl9KShnKTsoZnVuY3Rpb24oVyl7Zm9yKHZhciBoYT1uZXcgayxmYT0wO2ZhPFMubGVuZ3RoO2ZhKz0zKWhhLng9U1tmYSswXSxoYS55PVNbZmErMV0saGEuej1TW2ZhKzJdLGhhLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKFcpLFNbZmErMF09aGEueCxTW2ZhKzFdPWhhLnksU1tmYSsyXT1oYS56fSkoZSk7KGZ1bmN0aW9uKCl7Zm9yKHZhciBXPW5ldyBrLGhhPTA7aGE8Uy5sZW5ndGg7aGErPTMpe1cueD1TW2hhKzBdO1cueT1TW2hhKzFdO1cuej1TW2hhKzJdO3ZhciBmYT1QKFcpLzIvTWF0aC5QSSsuNSxyYT1SKFcpL01hdGguUEkrLjU7Vi5wdXNoKGZhLDEtcmEpfUYoKTt2KCl9KSgpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKFMsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShTLnNsaWNlKCksMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKFYsMikpOzA9PT1nP3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTp0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKX0KZnVuY3Rpb24gR2YoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEdlKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEdlKGEsYyl7amMuY2FsbCh0aGlzLFsxLDEsMSwtMSwtMSwxLC0xLDEsLTEsMSwtMSwtMV0sWzIsMSwwLDAsMywyLDEsMywwLDIsMywxXSxhLGMpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y319ZnVuY3Rpb24gSGYoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgUmQoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUmQoYSxjKXtqYy5jYWxsKHRoaXMsClsxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMV0sWzAsMiw0LDAsNCwzLDAsMyw1LDAsNSwyLDEsMiw1LDEsNSwzLDEsMyw0LDEsNCwyXSxhLGMpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBJZihhLGMpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgSGUoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gSGUoYSxjKXt2YXIgZT0oMStNYXRoLnNxcnQoNSkpLzI7amMuY2FsbCh0aGlzLFstMSxlLDAsMSxlLDAsLTEsLWUsMCwxLC1lLDAsMCwtMSxlLDAsMSxlLDAsLTEsLWUsMCwxLC1lLGUsMCwtMSxlLDAsMSwtZSwwLC0xLC1lLDAsMV0sWzAsMTEsNSwwLDUsMSwwLDEsNywwLDcsMTAsMCwxMCwxMSwKMSw1LDksNSwxMSw0LDExLDEwLDIsMTAsNyw2LDcsMSw4LDMsOSw0LDMsNCwyLDMsMiw2LDMsNiw4LDMsOCw5LDQsOSw1LDIsNCwxMSw2LDIsMTAsOCw2LDcsOSw4LDFdLGEsYyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBKZihhLGMpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJEb2RlY2FoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEllKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEllKGEsYyl7dmFyIGU9KDErTWF0aC5zcXJ0KDUpKS8yLGc9MS9lO2pjLmNhbGwodGhpcyxbLTEsLTEsLTEsLTEsLTEsMSwtMSwxLC0xLC0xLDEsMSwxLC0xLC0xLDEsLTEsMSwxLDEsLTEsMSwxLDEsMCwtZywtZSwwLC1nLGUsMCxnLC1lLDAsZyxlLC1nLC1lLDAsLWcsZSwwLGcsCi1lLDAsZyxlLDAsLWUsMCwtZyxlLDAsLWcsLWUsMCxnLGUsMCxnXSxbMywxMSw3LDMsNywxNSwzLDE1LDEzLDcsMTksMTcsNywxNyw2LDcsNiwxNSwxNyw0LDgsMTcsOCwxMCwxNywxMCw2LDgsMCwxNiw4LDE2LDIsOCwyLDEwLDAsMTIsMSwwLDEsMTgsMCwxOCwxNiw2LDEwLDIsNiwyLDEzLDYsMTMsMTUsMiwxNiwxOCwyLDE4LDMsMiwzLDEzLDE4LDEsOSwxOCw5LDExLDE4LDExLDMsNCwxNCwxMiw0LDEyLDAsNCwwLDgsMTEsOSw1LDExLDUsMTksMTEsMTksNywxOSw1LDE0LDE5LDE0LDQsMTksNCwxNywxLDEyLDE0LDEsMTQsNSwxLDUsOV0sYSxjKTt0aGlzLnR5cGU9IkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBLZihhLGMsZSxnLHIsdil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlR1YmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwYXRoOmEsdHVidWxhclNlZ21lbnRzOmMscmFkaXVzOmUsCnJhZGlhbFNlZ21lbnRzOmcsY2xvc2VkOnJ9O3ZvaWQgMCE9PXYmJmNvbnNvbGUud2FybigiVEhSRUUuVHViZUdlb21ldHJ5OiB0YXBlciBoYXMgYmVlbiByZW1vdmVkLiIpO2E9bmV3IFNkKGEsYyxlLGcscik7dGhpcy50YW5nZW50cz1hLnRhbmdlbnRzO3RoaXMubm9ybWFscz1hLm5vcm1hbHM7dGhpcy5iaW5vcm1hbHM9YS5iaW5vcm1hbHM7dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoYSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gU2QoYSxjLGUsZyxyKXtmdW5jdGlvbiB2KHFhKXtTPWEuZ2V0UG9pbnRBdChxYS9jLFMpO3ZhciB1YT1GLm5vcm1hbHNbcWFdO3FhPUYuYmlub3JtYWxzW3FhXTtmb3IoVz0wO1c8PWc7VysrKXt2YXIgb2E9Vy9nKk1hdGguUEkqMix0YT1NYXRoLnNpbihvYSk7b2E9LU1hdGguY29zKG9hKTtQLng9b2EqdWEueCt0YSpxYS54O1AueT1vYSp1YS55K3RhKnFhLnk7UC56PW9hKnVhLnordGEqcWEuejtQLm5vcm1hbGl6ZSgpO2ZhLnB1c2goUC54LApQLnksUC56KTtKLng9Uy54K2UqUC54O0oueT1TLnkrZSpQLnk7Si56PVMueitlKlAuejtoYS5wdXNoKEoueCxKLnksSi56KX19ZnVuY3Rpb24geigpe2ZvcihXPTE7Vzw9YztXKyspZm9yKFY9MTtWPD1nO1YrKyl7dmFyIHFhPShnKzEpKlcrKFYtMSksdWE9KGcrMSkqVytWLG9hPShnKzEpKihXLTEpK1Y7cGEucHVzaCgoZysxKSooVy0xKSsoVi0xKSxxYSxvYSk7cGEucHVzaChxYSx1YSxvYSl9fWZ1bmN0aW9uIEUoKXtmb3IoVj0wO1Y8PWM7VisrKWZvcihXPTA7Vzw9ZztXKyspUi54PVYvYyxSLnk9Vy9nLHJhLnB1c2goUi54LFIueSl9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlR1YmVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwYXRoOmEsdHVidWxhclNlZ21lbnRzOmMscmFkaXVzOmUscmFkaWFsU2VnbWVudHM6ZyxjbG9zZWQ6cn07Yz1jfHw2NDtlPWV8fDE7Zz1nfHw4O3I9cnx8ITE7dmFyIEY9YS5jb21wdXRlRnJlbmV0RnJhbWVzKGMscik7dGhpcy50YW5nZW50cz0KRi50YW5nZW50czt0aGlzLm5vcm1hbHM9Ri5ub3JtYWxzO3RoaXMuYmlub3JtYWxzPUYuYmlub3JtYWxzO3ZhciBKPW5ldyBrLFA9bmV3IGssUj1uZXcgZixTPW5ldyBrLFYsVyxoYT1bXSxmYT1bXSxyYT1bXSxwYT1bXTsoZnVuY3Rpb24oKXtmb3IoVj0wO1Y8YztWKyspdihWKTt2KCExPT09cj9jOjApO0UoKTt6KCl9KSgpO3RoaXMuc2V0SW5kZXgocGEpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGhhLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoZmEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHJhLDIpKX1mdW5jdGlvbiBMZihhLGMsZSxnLHIsdix6KXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVG9ydXNLbm90R2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsdHViZTpjLHR1YnVsYXJTZWdtZW50czplLHJhZGlhbFNlZ21lbnRzOmcscDpyLHE6dn07dm9pZCAwIT09eiYmY29uc29sZS53YXJuKCJUSFJFRS5Ub3J1c0tub3RHZW9tZXRyeTogaGVpZ2h0U2NhbGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zY2FsZSggeCwgeSwgeiApIGluc3RlYWQuIik7CnRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBKZShhLGMsZSxnLHIsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEplKGEsYyxlLGcscix2KXtmdW5jdGlvbiB6KHRhLEJhLFRhLFVhLENhKXt2YXIgSGE9TWF0aC5zaW4odGEpO0JhPVRhL0JhKnRhO1RhPU1hdGguY29zKEJhKTtDYS54PVVhKigyK1RhKSouNSpNYXRoLmNvcyh0YSk7Q2EueT1VYSooMitUYSkqSGEqLjU7Q2Euej1VYSpNYXRoLnNpbihCYSkqLjV9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHR1YmU6Yyx0dWJ1bGFyU2VnbWVudHM6ZSxyYWRpYWxTZWdtZW50czpnLHA6cixxOnZ9O2E9YXx8MTtjPWN8fC40O2U9TWF0aC5mbG9vcihlKXx8NjQ7Zz1NYXRoLmZsb29yKGcpfHw4O3I9cnx8Mjt2PXZ8fDM7dmFyIEU9W10sRj1bXSxKPVtdLFA9W10sUixTPW5ldyBrLFY9bmV3IGssVz1uZXcgayxoYT1uZXcgayxmYT1uZXcgaywKcmE9bmV3IGsscGE9bmV3IGs7Zm9yKFI9MDtSPD1lOysrUil7dmFyIHFhPVIvZSpyKk1hdGguUEkqMjt6KHFhLHIsdixhLFcpO3oocWErLjAxLHIsdixhLGhhKTtyYS5zdWJWZWN0b3JzKGhhLFcpO3BhLmFkZFZlY3RvcnMoaGEsVyk7ZmEuY3Jvc3NWZWN0b3JzKHJhLHBhKTtwYS5jcm9zc1ZlY3RvcnMoZmEscmEpO2ZhLm5vcm1hbGl6ZSgpO3BhLm5vcm1hbGl6ZSgpO2ZvcihxYT0wO3FhPD1nOysrcWEpe3ZhciB1YT1xYS9nKk1hdGguUEkqMixvYT0tYypNYXRoLmNvcyh1YSk7dWE9YypNYXRoLnNpbih1YSk7Uy54PVcueCsob2EqcGEueCt1YSpmYS54KTtTLnk9Vy55KyhvYSpwYS55K3VhKmZhLnkpO1Muej1XLnorKG9hKnBhLnordWEqZmEueik7Ri5wdXNoKFMueCxTLnksUy56KTtWLnN1YlZlY3RvcnMoUyxXKS5ub3JtYWxpemUoKTtKLnB1c2goVi54LFYueSxWLnopO1AucHVzaChSL2UpO1AucHVzaChxYS9nKX19Zm9yKHFhPTE7cWE8PWU7cWErKylmb3IoUj0xO1I8PWc7UisrKWE9CihnKzEpKnFhKyhSLTEpLGM9KGcrMSkqcWErUixyPShnKzEpKihxYS0xKStSLEUucHVzaCgoZysxKSoocWEtMSkrKFItMSksYSxyKSxFLnB1c2goYSxjLHIpO3RoaXMuc2V0SW5kZXgoRSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoRiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKEosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKFAsMikpfWZ1bmN0aW9uIE1mKGEsYyxlLGcscil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsdHViZTpjLHJhZGlhbFNlZ21lbnRzOmUsdHVidWxhclNlZ21lbnRzOmcsYXJjOnJ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBLZShhLGMsZSxnLHIpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBLZShhLGMsZSxnLHIpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9CntyYWRpdXM6YSx0dWJlOmMscmFkaWFsU2VnbWVudHM6ZSx0dWJ1bGFyU2VnbWVudHM6ZyxhcmM6cn07YT1hfHwxO2M9Y3x8LjQ7ZT1NYXRoLmZsb29yKGUpfHw4O2c9TWF0aC5mbG9vcihnKXx8NjtyPXJ8fDIqTWF0aC5QSTt2YXIgdj1bXSx6PVtdLEU9W10sRj1bXSxKPW5ldyBrLFA9bmV3IGssUj1uZXcgayxTLFY7Zm9yKFM9MDtTPD1lO1MrKylmb3IoVj0wO1Y8PWc7VisrKXt2YXIgVz1WL2cqcixoYT1TL2UqTWF0aC5QSSoyO1AueD0oYStjKk1hdGguY29zKGhhKSkqTWF0aC5jb3MoVyk7UC55PShhK2MqTWF0aC5jb3MoaGEpKSpNYXRoLnNpbihXKTtQLno9YypNYXRoLnNpbihoYSk7ei5wdXNoKFAueCxQLnksUC56KTtKLng9YSpNYXRoLmNvcyhXKTtKLnk9YSpNYXRoLnNpbihXKTtSLnN1YlZlY3RvcnMoUCxKKS5ub3JtYWxpemUoKTtFLnB1c2goUi54LFIueSxSLnopO0YucHVzaChWL2cpO0YucHVzaChTL2UpfWZvcihTPTE7Uzw9ZTtTKyspZm9yKFY9MTtWPD1nO1YrKylhPShnKwoxKSooUy0xKStWLTEsYz0oZysxKSooUy0xKStWLHI9KGcrMSkqUytWLHYucHVzaCgoZysxKSpTK1YtMSxhLHIpLHYucHVzaChhLGMscik7dGhpcy5zZXRJbmRleCh2KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYSh6LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoRSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoRiwyKSl9ZnVuY3Rpb24gR2ooYSxjLGUsZyxyKXtpZihyPT09MDxYbChhLGMsZSxnKSlmb3Iocj1jO3I8ZTtyKz1nKXZhciB2PUhqKHIsYVtyXSxhW3IrMV0sdik7ZWxzZSBmb3Iocj1lLWc7cj49YztyLT1nKXY9SGoocixhW3JdLGFbcisxXSx2KTt2JiZUZCh2LHYubmV4dCkmJihOZih2KSx2PXYubmV4dCk7cmV0dXJuIHZ9ZnVuY3Rpb24gT2YoYSxjKXtpZighYSlyZXR1cm4gYTtjfHwoYz1hKTtkb3t2YXIgZT0hMTtpZihhLnN0ZWluZXJ8fCFUZChhLGEubmV4dCkmJjAhPT1XYihhLnByZXYsYSxhLm5leHQpKWE9YS5uZXh0OwplbHNle05mKGEpO2E9Yz1hLnByZXY7aWYoYT09PWEubmV4dClicmVhaztlPSEwfX13aGlsZShlfHxhIT09Yyk7cmV0dXJuIGN9ZnVuY3Rpb24gUGYoYSxjLGUsZyxyLHYseil7aWYoYSl7IXomJnYmJllsKGEsZyxyLHYpO2Zvcih2YXIgRT1hLEYsSjthLnByZXYhPT1hLm5leHQ7KWlmKEY9YS5wcmV2LEo9YS5uZXh0LHY/WmwoYSxnLHIsdik6JGwoYSkpYy5wdXNoKEYuaS9lKSxjLnB1c2goYS5pL2UpLGMucHVzaChKLmkvZSksTmYoYSksRT1hPUoubmV4dDtlbHNlIGlmKGE9SixhPT09RSl7ej8xPT09ej8oYT1hbShhLGMsZSksUGYoYSxjLGUsZyxyLHYsMikpOjI9PT16JiZibShhLGMsZSxnLHIsdik6UGYoT2YoYSksYyxlLGcscix2LDEpO2JyZWFrfX19ZnVuY3Rpb24gJGwoYSl7dmFyIGM9YS5wcmV2LGU9YS5uZXh0O2lmKDA8PVdiKGMsYSxlKSlyZXR1cm4hMTtmb3IodmFyIGc9YS5uZXh0Lm5leHQ7ZyE9PWEucHJldjspe2lmKExlKGMueCxjLnksYS54LGEueSxlLngsZS55LGcueCwKZy55KSYmMDw9V2IoZy5wcmV2LGcsZy5uZXh0KSlyZXR1cm4hMTtnPWcubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBabChhLGMsZSxnKXt2YXIgcj1hLnByZXYsdj1hLm5leHQ7aWYoMDw9V2IocixhLHYpKXJldHVybiExO3ZhciB6PXIueD5hLng/ci54PnYueD9yLng6di54OmEueD52Lng/YS54OnYueCxFPXIueT5hLnk/ci55PnYueT9yLnk6di55OmEueT52Lnk/YS55OnYueSxGPVloKHIueDxhLng/ci54PHYueD9yLng6di54OmEueDx2Lng/YS54OnYueCxyLnk8YS55P3IueTx2Lnk/ci55OnYueTphLnk8di55P2EueTp2LnksYyxlLGcpO2M9WWgoeixFLGMsZSxnKTtlPWEucHJldlo7Zm9yKGc9YS5uZXh0WjtlJiZlLno+PUYmJmcmJmcuejw9Yzspe2lmKGUhPT1hLnByZXYmJmUhPT1hLm5leHQmJkxlKHIueCxyLnksYS54LGEueSx2Lngsdi55LGUueCxlLnkpJiYwPD1XYihlLnByZXYsZSxlLm5leHQpKXJldHVybiExO2U9ZS5wcmV2WjtpZihnIT09YS5wcmV2JiZnIT09YS5uZXh0JiZMZShyLngsCnIueSxhLngsYS55LHYueCx2LnksZy54LGcueSkmJjA8PVdiKGcucHJldixnLGcubmV4dCkpcmV0dXJuITE7Zz1nLm5leHRafWZvcig7ZSYmZS56Pj1GOyl7aWYoZSE9PWEucHJldiYmZSE9PWEubmV4dCYmTGUoci54LHIueSxhLngsYS55LHYueCx2LnksZS54LGUueSkmJjA8PVdiKGUucHJldixlLGUubmV4dCkpcmV0dXJuITE7ZT1lLnByZXZafWZvcig7ZyYmZy56PD1jOyl7aWYoZyE9PWEucHJldiYmZyE9PWEubmV4dCYmTGUoci54LHIueSxhLngsYS55LHYueCx2LnksZy54LGcueSkmJjA8PVdiKGcucHJldixnLGcubmV4dCkpcmV0dXJuITE7Zz1nLm5leHRafXJldHVybiEwfWZ1bmN0aW9uIGFtKGEsYyxlKXt2YXIgZz1hO2Rve3ZhciByPWcucHJldix2PWcubmV4dC5uZXh0OyFUZChyLHYpJiZJaihyLGcsZy5uZXh0LHYpJiZRZihyLHYpJiZRZih2LHIpJiYoYy5wdXNoKHIuaS9lKSxjLnB1c2goZy5pL2UpLGMucHVzaCh2LmkvZSksTmYoZyksTmYoZy5uZXh0KSxnPWE9dik7Zz1nLm5leHR9d2hpbGUoZyE9PQphKTtyZXR1cm4gZ31mdW5jdGlvbiBibShhLGMsZSxnLHIsdil7dmFyIHo9YTtkb3tmb3IodmFyIEU9ei5uZXh0Lm5leHQ7RSE9PXoucHJldjspe2lmKHouaSE9PUUuaSYmY20oeixFKSl7YT1Kaih6LEUpO3o9T2Yoeix6Lm5leHQpO2E9T2YoYSxhLm5leHQpO1BmKHosYyxlLGcscix2KTtQZihhLGMsZSxnLHIsdik7cmV0dXJufUU9RS5uZXh0fXo9ei5uZXh0fXdoaWxlKHohPT1hKX1mdW5jdGlvbiBkbShhLGMsZSxnKXt2YXIgcj1bXSx2O3ZhciB6PTA7Zm9yKHY9Yy5sZW5ndGg7ejx2O3orKyl7dmFyIEU9Y1t6XSpnO3ZhciBGPXo8di0xP2NbeisxXSpnOmEubGVuZ3RoO0U9R2ooYSxFLEYsZywhMSk7RT09PUUubmV4dCYmKEUuc3RlaW5lcj0hMCk7ci5wdXNoKGVtKEUpKX1yLnNvcnQoZm0pO2Zvcih6PTA7ejxyLmxlbmd0aDt6KyspZ20oclt6XSxlKSxlPU9mKGUsZS5uZXh0KTtyZXR1cm4gZX1mdW5jdGlvbiBmbShhLGMpe3JldHVybiBhLngtYy54fWZ1bmN0aW9uIGdtKGEsYyl7aWYoYz0KaG0oYSxjKSlhPUpqKGMsYSksT2YoYSxhLm5leHQpfWZ1bmN0aW9uIGhtKGEsYyl7dmFyIGU9YyxnPWEueCxyPWEueSx2PS1JbmZpbml0eTtkb3tpZihyPD1lLnkmJnI+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7dmFyIHo9ZS54KyhyLWUueSkqKGUubmV4dC54LWUueCkvKGUubmV4dC55LWUueSk7aWYoejw9ZyYmej52KXt2PXo7aWYoej09PWcpe2lmKHI9PT1lLnkpcmV0dXJuIGU7aWYocj09PWUubmV4dC55KXJldHVybiBlLm5leHR9dmFyIEU9ZS54PGUubmV4dC54P2U6ZS5uZXh0fX1lPWUubmV4dH13aGlsZShlIT09Yyk7aWYoIUUpcmV0dXJuIG51bGw7aWYoZz09PXYpcmV0dXJuIEUucHJldjtjPUU7ej1FLng7dmFyIEY9RS55LEo9SW5maW5pdHk7Zm9yKGU9RS5uZXh0O2UhPT1jOyl7aWYoZz49ZS54JiZlLng+PXomJmchPT1lLngmJkxlKHI8Rj9nOnYscix6LEYscjxGP3Y6ZyxyLGUueCxlLnkpKXt2YXIgUD1NYXRoLmFicyhyLWUueSkvKGctZS54KTsoUDxKfHxQPT09SiYmCmUueD5FLngpJiZRZihlLGEpJiYoRT1lLEo9UCl9ZT1lLm5leHR9cmV0dXJuIEV9ZnVuY3Rpb24gWWwoYSxjLGUsZyl7dmFyIHI9YTtkbyBudWxsPT09ci56JiYoci56PVloKHIueCxyLnksYyxlLGcpKSxyLnByZXZaPXIucHJldixyPXIubmV4dFo9ci5uZXh0O3doaWxlKHIhPT1hKTtyLnByZXZaLm5leHRaPW51bGw7ci5wcmV2Wj1udWxsO2ltKHIpfWZ1bmN0aW9uIGltKGEpe3ZhciBjLGUsZyxyLHY9MTtkb3t2YXIgej1hO3ZhciBFPWE9bnVsbDtmb3IoZT0wO3o7KXtlKys7dmFyIEY9ejtmb3IoYz1nPTA7Yzx2JiYoZysrLEY9Ri5uZXh0WixGKTtjKyspO2ZvcihyPXY7MDxnfHwwPHImJkY7KTAhPT1nJiYoMD09PXJ8fCFGfHx6Lno8PUYueik/KGM9eix6PXoubmV4dFosZy0tKTooYz1GLEY9Ri5uZXh0WixyLS0pLEU/RS5uZXh0Wj1jOmE9YyxjLnByZXZaPUUsRT1jO3o9Rn1FLm5leHRaPW51bGw7dio9Mn13aGlsZSgxPGUpO3JldHVybiBhfWZ1bmN0aW9uIFloKGEsYyxlLGcscil7YT0KMzI3NjcqKGEtZSkqcjtjPTMyNzY3KihjLWcpKnI7YT0oYXxhPDw4KSYxNjcxMTkzNTthPShhfGE8PDQpJjI1MjY0NTEzNTthPShhfGE8PDIpJjg1ODk5MzQ1OTtjPShjfGM8PDgpJjE2NzExOTM1O2M9KGN8Yzw8NCkmMjUyNjQ1MTM1O2M9KGN8Yzw8MikmODU4OTkzNDU5O3JldHVybihhfGE8PDEpJjE0MzE2NTU3NjV8KChjfGM8PDEpJjE0MzE2NTU3NjUpPDwxfWZ1bmN0aW9uIGVtKGEpe3ZhciBjPWEsZT1hO2Rve2lmKGMueDxlLnh8fGMueD09PWUueCYmYy55PGUueSllPWM7Yz1jLm5leHR9d2hpbGUoYyE9PWEpO3JldHVybiBlfWZ1bmN0aW9uIExlKGEsYyxlLGcscix2LHosRSl7cmV0dXJuIDA8PShyLXopKihjLUUpLShhLXopKih2LUUpJiYwPD0oYS16KSooZy1FKS0oZS16KSooYy1FKSYmMDw9KGUteikqKHYtRSktKHIteikqKGctRSl9ZnVuY3Rpb24gY20oYSxjKXtyZXR1cm4gYS5uZXh0LmkhPT1jLmkmJmEucHJldi5pIT09Yy5pJiYham0oYSxjKSYmUWYoYSxjKSYmUWYoYyxhKSYmCmttKGEsYyl9ZnVuY3Rpb24gV2IoYSxjLGUpe3JldHVybihjLnktYS55KSooZS54LWMueCktKGMueC1hLngpKihlLnktYy55KX1mdW5jdGlvbiBUZChhLGMpe3JldHVybiBhLng9PT1jLngmJmEueT09PWMueX1mdW5jdGlvbiBJaihhLGMsZSxnKXtyZXR1cm4gVGQoYSxlKSYmVGQoYyxnKXx8VGQoYSxnKSYmVGQoZSxjKT8hMDowPFdiKGEsYyxlKSE9PTA8V2IoYSxjLGcpJiYwPFdiKGUsZyxhKSE9PTA8V2IoZSxnLGMpfWZ1bmN0aW9uIGptKGEsYyl7dmFyIGU9YTtkb3tpZihlLmkhPT1hLmkmJmUubmV4dC5pIT09YS5pJiZlLmkhPT1jLmkmJmUubmV4dC5pIT09Yy5pJiZJaihlLGUubmV4dCxhLGMpKXJldHVybiEwO2U9ZS5uZXh0fXdoaWxlKGUhPT1hKTtyZXR1cm4hMX1mdW5jdGlvbiBRZihhLGMpe3JldHVybiAwPldiKGEucHJldixhLGEubmV4dCk/MDw9V2IoYSxjLGEubmV4dCkmJjA8PVdiKGEsYS5wcmV2LGMpOjA+V2IoYSxjLGEucHJldil8fDA+V2IoYSxhLm5leHQsYyl9ZnVuY3Rpb24ga20oYSwKYyl7dmFyIGU9YSxnPSExLHI9KGEueCtjLngpLzI7Yz0oYS55K2MueSkvMjtkbyBlLnk+YyE9PWUubmV4dC55PmMmJmUubmV4dC55IT09ZS55JiZyPChlLm5leHQueC1lLngpKihjLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYoZz0hZyksZT1lLm5leHQ7d2hpbGUoZSE9PWEpO3JldHVybiBnfWZ1bmN0aW9uIEpqKGEsYyl7dmFyIGU9bmV3IFpoKGEuaSxhLngsYS55KSxnPW5ldyBaaChjLmksYy54LGMueSkscj1hLm5leHQsdj1jLnByZXY7YS5uZXh0PWM7Yy5wcmV2PWE7ZS5uZXh0PXI7ci5wcmV2PWU7Zy5uZXh0PWU7ZS5wcmV2PWc7di5uZXh0PWc7Zy5wcmV2PXY7cmV0dXJuIGd9ZnVuY3Rpb24gSGooYSxjLGUsZyl7YT1uZXcgWmgoYSxjLGUpO2c/KGEubmV4dD1nLm5leHQsYS5wcmV2PWcsZy5uZXh0LnByZXY9YSxnLm5leHQ9YSk6KGEucHJldj1hLGEubmV4dD1hKTtyZXR1cm4gYX1mdW5jdGlvbiBOZihhKXthLm5leHQucHJldj1hLnByZXY7YS5wcmV2Lm5leHQ9YS5uZXh0O2EucHJldlomJgooYS5wcmV2Wi5uZXh0Wj1hLm5leHRaKTthLm5leHRaJiYoYS5uZXh0Wi5wcmV2Wj1hLnByZXZaKX1mdW5jdGlvbiBaaChhLGMsZSl7dGhpcy5pPWE7dGhpcy54PWM7dGhpcy55PWU7dGhpcy5uZXh0Wj10aGlzLnByZXZaPXRoaXMuej10aGlzLm5leHQ9dGhpcy5wcmV2PW51bGw7dGhpcy5zdGVpbmVyPSExfWZ1bmN0aW9uIFhsKGEsYyxlLGcpe2Zvcih2YXIgcj0wLHY9ZS1nO2M8ZTtjKz1nKXIrPShhW3ZdLWFbY10pKihhW2MrMV0rYVt2KzFdKSx2PWM7cmV0dXJuIHJ9ZnVuY3Rpb24gS2ooYSl7dmFyIGM9YS5sZW5ndGg7MjxjJiZhW2MtMV0uZXF1YWxzKGFbMF0pJiZhLnBvcCgpfWZ1bmN0aW9uIExqKGEsYyl7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspYS5wdXNoKGNbZV0ueCksYS5wdXNoKGNbZV0ueSl9ZnVuY3Rpb24gVWQoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRXh0cnVkZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczphLG9wdGlvbnM6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFJjKGEsCmMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBSYyhhLGMpe2Z1bmN0aW9uIGUoRil7ZnVuY3Rpb24gSihRYSxlYixtYil7ZWJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0Iik7cmV0dXJuIGViLmNsb25lKCkubXVsdGlwbHlTY2FsYXIobWIpLmFkZChRYSl9ZnVuY3Rpb24gUChRYSxlYixtYil7dmFyIHBiPVFhLngtZWIueDt2YXIgc2I9UWEueS1lYi55O3ZhciBLYj1tYi54LVFhLng7dmFyIFNiPW1iLnktUWEueSxuYz1wYipwYitzYipzYjtpZihNYXRoLmFicyhwYipTYi1zYipLYik+TnVtYmVyLkVQU0lMT04pe3ZhciBRYz1NYXRoLnNxcnQobmMpLHpjPU1hdGguc3FydChLYipLYitTYipTYik7bmM9ZWIueC1zYi9RYztlYj1lYi55K3BiL1FjO1NiPSgobWIueC1TYi96Yy1uYykqU2ItKG1iLnkrS2IvemMtZWIpKktiKS8ocGIqU2Itc2IqS2IpO0tiPW5jK3BiKlNiLVFhLng7cGI9ZWIrc2IqU2ItUWEueTtzYj1LYioKS2IrcGIqcGI7aWYoMj49c2IpcmV0dXJuIG5ldyBmKEtiLHBiKTtzYj1NYXRoLnNxcnQoc2IvMil9ZWxzZSBRYT0hMSxwYj5OdW1iZXIuRVBTSUxPTj9LYj5OdW1iZXIuRVBTSUxPTiYmKFFhPSEwKTpwYjwtTnVtYmVyLkVQU0lMT04/S2I8LU51bWJlci5FUFNJTE9OJiYoUWE9ITApOk1hdGguc2lnbihzYik9PT1NYXRoLnNpZ24oU2IpJiYoUWE9ITApLFFhPyhLYj0tc2Isc2I9TWF0aC5zcXJ0KG5jKSk6KEtiPXBiLHBiPXNiLHNiPU1hdGguc3FydChuYy8yKSk7cmV0dXJuIG5ldyBmKEtiL3NiLHBiL3NiKX1mdW5jdGlvbiBSKFFhLGViKXtmb3IoamE9UWEubGVuZ3RoOzA8PS0tamE7KXt2YXIgbWI9amE7dmFyIHBiPWphLTE7MD5wYiYmKHBiPVFhLmxlbmd0aC0xKTt2YXIgc2IsS2I9cWErMipVYTtmb3Ioc2I9MDtzYjxLYjtzYisrKXt2YXIgU2I9WWEqc2IsbmM9WWEqKHNiKzEpO1coZWIrbWIrU2IsZWIrcGIrU2IsZWIrcGIrbmMsZWIrbWIrbmMpfX19ZnVuY3Rpb24gUyhRYSxlYixtYil7cmEucHVzaChRYSk7CnJhLnB1c2goZWIpO3JhLnB1c2gobWIpfWZ1bmN0aW9uIFYoUWEsZWIsbWIpe2hhKFFhKTtoYShlYik7aGEobWIpO1FhPXIubGVuZ3RoLzM7UWE9SGEuZ2VuZXJhdGVUb3BVVihnLHIsUWEtMyxRYS0yLFFhLTEpO2ZhKFFhWzBdKTtmYShRYVsxXSk7ZmEoUWFbMl0pfWZ1bmN0aW9uIFcoUWEsZWIsbWIscGIpe2hhKFFhKTtoYShlYik7aGEocGIpO2hhKGViKTtoYShtYik7aGEocGIpO1FhPXIubGVuZ3RoLzM7UWE9SGEuZ2VuZXJhdGVTaWRlV2FsbFVWKGcscixRYS02LFFhLTMsUWEtMixRYS0xKTtmYShRYVswXSk7ZmEoUWFbMV0pO2ZhKFFhWzNdKTtmYShRYVsxXSk7ZmEoUWFbMl0pO2ZhKFFhWzNdKX1mdW5jdGlvbiBoYShRYSl7ci5wdXNoKHJhWzMqUWFdKTtyLnB1c2gocmFbMypRYSsxXSk7ci5wdXNoKHJhWzMqUWErMl0pfWZ1bmN0aW9uIGZhKFFhKXt2LnB1c2goUWEueCk7di5wdXNoKFFhLnkpfXZhciByYT1bXSxwYT12b2lkIDAhPT1jLmN1cnZlU2VnbWVudHM/Yy5jdXJ2ZVNlZ21lbnRzOgoxMixxYT12b2lkIDAhPT1jLnN0ZXBzP2Muc3RlcHM6MSx1YT12b2lkIDAhPT1jLmRlcHRoP2MuZGVwdGg6MTAwLG9hPXZvaWQgMCE9PWMuYmV2ZWxFbmFibGVkP2MuYmV2ZWxFbmFibGVkOiEwLHRhPXZvaWQgMCE9PWMuYmV2ZWxUaGlja25lc3M/Yy5iZXZlbFRoaWNrbmVzczo2LEJhPXZvaWQgMCE9PWMuYmV2ZWxTaXplP2MuYmV2ZWxTaXplOnRhLTIsVGE9dm9pZCAwIT09Yy5iZXZlbE9mZnNldD9jLmJldmVsT2Zmc2V0OjAsVWE9dm9pZCAwIT09Yy5iZXZlbFNlZ21lbnRzP2MuYmV2ZWxTZWdtZW50czozLENhPWMuZXh0cnVkZVBhdGgsSGE9dm9pZCAwIT09Yy5VVkdlbmVyYXRvcj9jLlVWR2VuZXJhdG9yOmxtO3ZvaWQgMCE9PWMuYW1vdW50JiYoY29uc29sZS53YXJuKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IGFtb3VudCBoYXMgYmVlbiByZW5hbWVkIHRvIGRlcHRoLiIpLHVhPWMuYW1vdW50KTt2YXIgRGE9ITE7aWYoQ2Epe3ZhciBNYT1DYS5nZXRTcGFjZWRQb2ludHMocWEpOwpEYT0hMDtvYT0hMTt2YXIgZGI9Q2EuY29tcHV0ZUZyZW5ldEZyYW1lcyhxYSwhMSk7dmFyIHRiPW5ldyBrO3ZhciBLYT1uZXcgazt2YXIgYmI9bmV3IGt9b2F8fChUYT1CYT10YT1VYT0wKTt2YXIgamI7cGE9Ri5leHRyYWN0UG9pbnRzKHBhKTtGPXBhLnNoYXBlO3ZhciBFYj1wYS5ob2xlcztpZighZWQuaXNDbG9ja1dpc2UoRikpe0Y9Ri5yZXZlcnNlKCk7dmFyIHhiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKXt2YXIgaWE9RWJbeGJdO2VkLmlzQ2xvY2tXaXNlKGlhKSYmKEViW3hiXT1pYS5yZXZlcnNlKCkpfX12YXIgbmE9ZWQudHJpYW5ndWxhdGVTaGFwZShGLEViKSx6YT1GO3hiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKWlhPUViW3hiXSxGPUYuY29uY2F0KGlhKTt2YXIgSmEsWWE9Ri5sZW5ndGgsTmEsY2I9bmEubGVuZ3RoO3BhPVtdO3ZhciBqYT0wO3ZhciBHYT16YS5sZW5ndGg7dmFyIExhPUdhLTE7Zm9yKEphPWphKzE7amE8R2E7amErKyxMYSsrLEphKyspTGE9PT0KR2EmJihMYT0wKSxKYT09PUdhJiYoSmE9MCkscGFbamFdPVAoemFbamFdLHphW0xhXSx6YVtKYV0pO0NhPVtdO3ZhciBuYj1wYS5jb25jYXQoKTt4Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKyl7aWE9RWJbeGJdO3ZhciBWYT1bXTtqYT0wO0dhPWlhLmxlbmd0aDtMYT1HYS0xO2ZvcihKYT1qYSsxO2phPEdhO2phKyssTGErKyxKYSsrKUxhPT09R2EmJihMYT0wKSxKYT09PUdhJiYoSmE9MCksVmFbamFdPVAoaWFbamFdLGlhW0xhXSxpYVtKYV0pO0NhLnB1c2goVmEpO25iPW5iLmNvbmNhdChWYSl9Zm9yKExhPTA7TGE8VWE7TGErKyl7R2E9TGEvVWE7dmFyIGliPXRhKk1hdGguY29zKEdhKk1hdGguUEkvMik7SmE9QmEqTWF0aC5zaW4oR2EqTWF0aC5QSS8yKStUYTtqYT0wO2ZvcihHYT16YS5sZW5ndGg7amE8R2E7amErKyl7dmFyIGtiPUooemFbamFdLHBhW2phXSxKYSk7UyhrYi54LGtiLnksLWliKX14Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKylmb3IoaWE9CkViW3hiXSxWYT1DYVt4Yl0samE9MCxHYT1pYS5sZW5ndGg7amE8R2E7amErKylrYj1KKGlhW2phXSxWYVtqYV0sSmEpLFMoa2IueCxrYi55LC1pYil9SmE9QmErVGE7Zm9yKGphPTA7amE8WWE7amErKylrYj1vYT9KKEZbamFdLG5iW2phXSxKYSk6RltqYV0sRGE/KEthLmNvcHkoZGIubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoa2IueCksdGIuY29weShkYi5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGtiLnkpLGJiLmNvcHkoTWFbMF0pLmFkZChLYSkuYWRkKHRiKSxTKGJiLngsYmIueSxiYi56KSk6UyhrYi54LGtiLnksMCk7Zm9yKEdhPTE7R2E8PXFhO0dhKyspZm9yKGphPTA7amE8WWE7amErKylrYj1vYT9KKEZbamFdLG5iW2phXSxKYSk6RltqYV0sRGE/KEthLmNvcHkoZGIubm9ybWFsc1tHYV0pLm11bHRpcGx5U2NhbGFyKGtiLngpLHRiLmNvcHkoZGIuYmlub3JtYWxzW0dhXSkubXVsdGlwbHlTY2FsYXIoa2IueSksYmIuY29weShNYVtHYV0pLmFkZChLYSkuYWRkKHRiKSwKUyhiYi54LGJiLnksYmIueikpOlMoa2IueCxrYi55LHVhL3FhKkdhKTtmb3IoTGE9VWEtMTswPD1MYTtMYS0tKXtHYT1MYS9VYTtpYj10YSpNYXRoLmNvcyhHYSpNYXRoLlBJLzIpO0phPUJhKk1hdGguc2luKEdhKk1hdGguUEkvMikrVGE7amE9MDtmb3IoR2E9emEubGVuZ3RoO2phPEdhO2phKyspa2I9Sih6YVtqYV0scGFbamFdLEphKSxTKGtiLngsa2IueSx1YStpYik7eGI9MDtmb3IoamI9RWIubGVuZ3RoO3hiPGpiO3hiKyspZm9yKGlhPUViW3hiXSxWYT1DYVt4Yl0samE9MCxHYT1pYS5sZW5ndGg7amE8R2E7amErKylrYj1KKGlhW2phXSxWYVtqYV0sSmEpLERhP1Moa2IueCxrYi55K01hW3FhLTFdLnksTWFbcWEtMV0ueCtpYik6UyhrYi54LGtiLnksdWEraWIpfShmdW5jdGlvbigpe3ZhciBRYT1yLmxlbmd0aC8zO2lmKG9hKXt2YXIgZWI9MCpZYTtmb3IoamE9MDtqYTxjYjtqYSsrKU5hPW5hW2phXSxWKE5hWzJdK2ViLE5hWzFdK2ViLE5hWzBdK2ViKTtlYj1ZYSoocWErMipVYSk7CmZvcihqYT0wO2phPGNiO2phKyspTmE9bmFbamFdLFYoTmFbMF0rZWIsTmFbMV0rZWIsTmFbMl0rZWIpfWVsc2V7Zm9yKGphPTA7amE8Y2I7amErKylOYT1uYVtqYV0sVihOYVsyXSxOYVsxXSxOYVswXSk7Zm9yKGphPTA7amE8Y2I7amErKylOYT1uYVtqYV0sVihOYVswXStZYSpxYSxOYVsxXStZYSpxYSxOYVsyXStZYSpxYSl9Zy5hZGRHcm91cChRYSxyLmxlbmd0aC8zLVFhLDApfSkoKTsoZnVuY3Rpb24oKXt2YXIgUWE9ci5sZW5ndGgvMyxlYj0wO1IoemEsZWIpO2ViKz16YS5sZW5ndGg7eGI9MDtmb3IoamI9RWIubGVuZ3RoO3hiPGpiO3hiKyspaWE9RWJbeGJdLFIoaWEsZWIpLGViKz1pYS5sZW5ndGg7Zy5hZGRHcm91cChRYSxyLmxlbmd0aC8zLVFhLDEpfSkoKX12YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRXh0cnVkZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczphLG9wdGlvbnM6Y307YT1BcnJheS5pc0FycmF5KGEpP2E6W2FdO2Zvcih2YXIgZz10aGlzLApyPVtdLHY9W10sej0wLEU9YS5sZW5ndGg7ejxFO3orKyllKGFbel0pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHYsMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX1mdW5jdGlvbiBNaihhLGMsZSl7ZS5zaGFwZXM9W107aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIGc9MCxyPWEubGVuZ3RoO2c8cjtnKyspZS5zaGFwZXMucHVzaChhW2ddLnV1aWQpO2Vsc2UgZS5zaGFwZXMucHVzaChhLnV1aWQpO3ZvaWQgMCE9PWMuZXh0cnVkZVBhdGgmJihlLm9wdGlvbnMuZXh0cnVkZVBhdGg9Yy5leHRydWRlUGF0aC50b0pTT04oKSk7cmV0dXJuIGV9ZnVuY3Rpb24gUmYoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV4dEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3RleHQ6YSxwYXJhbWV0ZXJzOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBNZShhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX0KZnVuY3Rpb24gTWUoYSxjKXtjPWN8fHt9O3ZhciBlPWMuZm9udDtpZighZXx8IWUuaXNGb250KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LiIpLG5ldyB5YTthPWUuZ2VuZXJhdGVTaGFwZXMoYSxjLnNpemUpO2MuZGVwdGg9dm9pZCAwIT09Yy5oZWlnaHQ/Yy5oZWlnaHQ6NTA7dm9pZCAwPT09Yy5iZXZlbFRoaWNrbmVzcyYmKGMuYmV2ZWxUaGlja25lc3M9MTApO3ZvaWQgMD09PWMuYmV2ZWxTaXplJiYoYy5iZXZlbFNpemU9OCk7dm9pZCAwPT09Yy5iZXZlbEVuYWJsZWQmJihjLmJldmVsRW5hYmxlZD0hMSk7UmMuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJUZXh0QnVmZmVyR2VvbWV0cnkifWZ1bmN0aW9uIFNmKGEsYyxlLGcscix2LHope3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcGhlcmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSx3aWR0aFNlZ21lbnRzOmMsCmhlaWdodFNlZ21lbnRzOmUscGhpU3RhcnQ6ZyxwaGlMZW5ndGg6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEJkKGEsYyxlLGcscix2LHopKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBCZChhLGMsZSxnLHIsdix6KXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3BoZXJlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsd2lkdGhTZWdtZW50czpjLGhlaWdodFNlZ21lbnRzOmUscGhpU3RhcnQ6ZyxwaGlMZW5ndGg6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en07YT1hfHwxO2M9TWF0aC5tYXgoMyxNYXRoLmZsb29yKGMpfHw4KTtlPU1hdGgubWF4KDIsTWF0aC5mbG9vcihlKXx8Nik7Zz12b2lkIDAhPT1nP2c6MDtyPXZvaWQgMCE9PXI/cjoyKk1hdGguUEk7dj12b2lkIDAhPT12P3Y6MDt6PXZvaWQgMCE9PXo/ejpNYXRoLlBJO3ZhciBFPU1hdGgubWluKHYreixNYXRoLlBJKSxGLApKLFA9MCxSPVtdLFM9bmV3IGssVj1uZXcgayxXPVtdLGhhPVtdLGZhPVtdLHJhPVtdO2ZvcihKPTA7Sjw9ZTtKKyspe3ZhciBwYT1bXSxxYT1KL2UsdWE9MDswPT1KJiYwPT12P3VhPS41L2M6Sj09ZSYmRT09TWF0aC5QSSYmKHVhPS0uNS9jKTtmb3IoRj0wO0Y8PWM7RisrKXt2YXIgb2E9Ri9jO1MueD0tYSpNYXRoLmNvcyhnK29hKnIpKk1hdGguc2luKHYrcWEqeik7Uy55PWEqTWF0aC5jb3ModitxYSp6KTtTLno9YSpNYXRoLnNpbihnK29hKnIpKk1hdGguc2luKHYrcWEqeik7aGEucHVzaChTLngsUy55LFMueik7Vi5jb3B5KFMpLm5vcm1hbGl6ZSgpO2ZhLnB1c2goVi54LFYueSxWLnopO3JhLnB1c2gob2ErdWEsMS1xYSk7cGEucHVzaChQKyspfVIucHVzaChwYSl9Zm9yKEo9MDtKPGU7SisrKWZvcihGPTA7RjxjO0YrKylhPVJbSl1bRisxXSxnPVJbSl1bRl0scj1SW0orMV1bRl0sej1SW0orMV1bRisxXSwoMCE9PUp8fDA8dikmJlcucHVzaChhLGcseiksKEohPT1lLTF8fEU8TWF0aC5QSSkmJgpXLnB1c2goZyxyLHopO3RoaXMuc2V0SW5kZXgoVyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoaGEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShmYSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EocmEsMikpfWZ1bmN0aW9uIFRmKGEsYyxlLGcscix2KXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUmluZ0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2lubmVyUmFkaXVzOmEsb3V0ZXJSYWRpdXM6Yyx0aGV0YVNlZ21lbnRzOmUscGhpU2VnbWVudHM6Zyx0aGV0YVN0YXJ0OnIsdGhldGFMZW5ndGg6dn07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IE5lKGEsYyxlLGcscix2KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gTmUoYSxjLGUsZyxyLHYpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJSaW5nQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17aW5uZXJSYWRpdXM6YSxvdXRlclJhZGl1czpjLHRoZXRhU2VnbWVudHM6ZSwKcGhpU2VnbWVudHM6Zyx0aGV0YVN0YXJ0OnIsdGhldGFMZW5ndGg6dn07YT1hfHwuNTtjPWN8fDE7cj12b2lkIDAhPT1yP3I6MDt2PXZvaWQgMCE9PXY/djoyKk1hdGguUEk7ZT12b2lkIDAhPT1lP01hdGgubWF4KDMsZSk6ODtnPXZvaWQgMCE9PWc/TWF0aC5tYXgoMSxnKToxO3ZhciB6PVtdLEU9W10sRj1bXSxKPVtdLFA9YSxSPShjLWEpL2csUz1uZXcgayxWPW5ldyBmLFcsaGE7Zm9yKFc9MDtXPD1nO1crKyl7Zm9yKGhhPTA7aGE8PWU7aGErKylhPXIraGEvZSp2LFMueD1QKk1hdGguY29zKGEpLFMueT1QKk1hdGguc2luKGEpLEUucHVzaChTLngsUy55LFMueiksRi5wdXNoKDAsMCwxKSxWLng9KFMueC9jKzEpLzIsVi55PShTLnkvYysxKS8yLEoucHVzaChWLngsVi55KTtQKz1SfWZvcihXPTA7VzxnO1crKylmb3IoYz1XKihlKzEpLGhhPTA7aGE8ZTtoYSsrKWE9aGErYyxyPWErZSsxLHY9YStlKzIsUD1hKzEsei5wdXNoKGEscixQKSx6LnB1c2gocix2LFApO3RoaXMuc2V0SW5kZXgoeik7CnRoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKEUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShGLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYShKLDIpKX1mdW5jdGlvbiBVZihhLGMsZSxnKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGF0aGVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwb2ludHM6YSxzZWdtZW50czpjLHBoaVN0YXJ0OmUscGhpTGVuZ3RoOmd9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBPZShhLGMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gT2UoYSxjLGUsZyl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxhdGhlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cG9pbnRzOmEsc2VnbWVudHM6YyxwaGlTdGFydDplLHBoaUxlbmd0aDpnfTtjPU1hdGguZmxvb3IoYyl8fDEyO2U9ZXx8MDtnPWd8fDIqTWF0aC5QSTtnPWhiLmNsYW1wKGcsMCwyKk1hdGguUEkpO3ZhciByPQpbXSx2PVtdLHo9W10sRT0xL2MsRj1uZXcgayxKPW5ldyBmLFA7Zm9yKFA9MDtQPD1jO1ArKyl7dmFyIFI9ZStQKkUqZzt2YXIgUz1NYXRoLnNpbihSKSxWPU1hdGguY29zKFIpO2ZvcihSPTA7Ujw9YS5sZW5ndGgtMTtSKyspRi54PWFbUl0ueCpTLEYueT1hW1JdLnksRi56PWFbUl0ueCpWLHYucHVzaChGLngsRi55LEYueiksSi54PVAvYyxKLnk9Ui8oYS5sZW5ndGgtMSksei5wdXNoKEoueCxKLnkpfWZvcihQPTA7UDxjO1ArKylmb3IoUj0wO1I8YS5sZW5ndGgtMTtSKyspZT1SK1AqYS5sZW5ndGgsRT1lK2EubGVuZ3RoLEY9ZSthLmxlbmd0aCsxLEo9ZSsxLHIucHVzaChlLEUsSiksci5wdXNoKEUsRixKKTt0aGlzLnNldEluZGV4KHIpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHYsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHosMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtpZihnPT09MipNYXRoLlBJKWZvcihnPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwuYXJyYXksCnI9bmV3IGssdj1uZXcgayx6PW5ldyBrLGU9YyphLmxlbmd0aCozLFI9UD0wO1A8YS5sZW5ndGg7UCsrLFIrPTMpci54PWdbUiswXSxyLnk9Z1tSKzFdLHIuej1nW1IrMl0sdi54PWdbZStSKzBdLHYueT1nW2UrUisxXSx2Lno9Z1tlK1IrMl0sei5hZGRWZWN0b3JzKHIsdikubm9ybWFsaXplKCksZ1tSKzBdPWdbZStSKzBdPXoueCxnW1IrMV09Z1tlK1IrMV09ei55LGdbUisyXT1nW2UrUisyXT16Lnp9ZnVuY3Rpb24gVmQoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2hhcGVHZW9tZXRyeSI7Im9iamVjdCI9PT10eXBlb2YgYyYmKGNvbnNvbGUud2FybigiVEhSRUUuU2hhcGVHZW9tZXRyeTogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKSxjPWMuY3VydmVTZWdtZW50cyk7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YSxjdXJ2ZVNlZ21lbnRzOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBXZChhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBXZChhLApjKXtmdW5jdGlvbiBlKFApe3ZhciBSLFM9ci5sZW5ndGgvMztQPVAuZXh0cmFjdFBvaW50cyhjKTt2YXIgVj1QLnNoYXBlLFc9UC5ob2xlczshMT09PWVkLmlzQ2xvY2tXaXNlKFYpJiYoVj1WLnJldmVyc2UoKSk7UD0wO2ZvcihSPVcubGVuZ3RoO1A8UjtQKyspe3ZhciBoYT1XW1BdOyEwPT09ZWQuaXNDbG9ja1dpc2UoaGEpJiYoV1tQXT1oYS5yZXZlcnNlKCkpfXZhciBmYT1lZC50cmlhbmd1bGF0ZVNoYXBlKFYsVyk7UD0wO2ZvcihSPVcubGVuZ3RoO1A8UjtQKyspaGE9V1tQXSxWPVYuY29uY2F0KGhhKTtQPTA7Zm9yKFI9Vi5sZW5ndGg7UDxSO1ArKyloYT1WW1BdLHIucHVzaChoYS54LGhhLnksMCksdi5wdXNoKDAsMCwxKSx6LnB1c2goaGEueCxoYS55KTtQPTA7Zm9yKFI9ZmEubGVuZ3RoO1A8UjtQKyspVj1mYVtQXSxnLnB1c2goVlswXStTLFZbMV0rUyxWWzJdK1MpLEYrPTN9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYXBlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz0Ke3NoYXBlczphLGN1cnZlU2VnbWVudHM6Y307Yz1jfHwxMjt2YXIgZz1bXSxyPVtdLHY9W10sej1bXSxFPTAsRj0wO2lmKCExPT09QXJyYXkuaXNBcnJheShhKSllKGEpO2Vsc2UgZm9yKHZhciBKPTA7SjxhLmxlbmd0aDtKKyspZShhW0pdKSx0aGlzLmFkZEdyb3VwKEUsRixKKSxFKz1GLEY9MDt0aGlzLnNldEluZGV4KGcpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYSh2LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYSh6LDIpKX1mdW5jdGlvbiBOaihhLGMpe2Muc2hhcGVzPVtdO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKHZhciBlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKWMuc2hhcGVzLnB1c2goYVtlXS51dWlkKTtlbHNlIGMuc2hhcGVzLnB1c2goYS51dWlkKTtyZXR1cm4gY31mdW5jdGlvbiBQZShhLGMpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJFZGdlc0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9Cnt0aHJlc2hvbGRBbmdsZTpjfTt2YXIgZT1bXTtjPU1hdGguY29zKGhiLkRFRzJSQUQqKHZvaWQgMCE9PWM/YzoxKSk7dmFyIGc9WzAsMF0scj17fSx2PVsiYSIsImIiLCJjIl07aWYoYS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgej1uZXcgeWE7ei5mcm9tQnVmZmVyR2VvbWV0cnkoYSl9ZWxzZSB6PWEuY2xvbmUoKTt6Lm1lcmdlVmVydGljZXMoKTt6LmNvbXB1dGVGYWNlTm9ybWFscygpO2E9ei52ZXJ0aWNlczt6PXouZmFjZXM7Zm9yKHZhciBFPTAsRj16Lmxlbmd0aDtFPEY7RSsrKWZvcih2YXIgSj16W0VdLFA9MDszPlA7UCsrKXt2YXIgUj1KW3ZbUF1dO3ZhciBTPUpbdlsoUCsxKSUzXV07Z1swXT1NYXRoLm1pbihSLFMpO2dbMV09TWF0aC5tYXgoUixTKTtSPWdbMF0rIiwiK2dbMV07dm9pZCAwPT09cltSXT9yW1JdPXtpbmRleDE6Z1swXSxpbmRleDI6Z1sxXSxmYWNlMTpFLGZhY2UyOnZvaWQgMH06cltSXS5mYWNlMj1FfWZvcihSIGluIHIpaWYoZz1yW1JdLHZvaWQgMD09PWcuZmFjZTJ8fAp6W2cuZmFjZTFdLm5vcm1hbC5kb3QoeltnLmZhY2UyXS5ub3JtYWwpPD1jKXY9YVtnLmluZGV4MV0sZS5wdXNoKHYueCx2Lnksdi56KSx2PWFbZy5pbmRleDJdLGUucHVzaCh2Lngsdi55LHYueik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoZSwzKSl9ZnVuY3Rpb24gWGQoYSxjLGUsZyxyLHYseixFKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3lsaW5kZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXNUb3A6YSxyYWRpdXNCb3R0b206YyxoZWlnaHQ6ZSxyYWRpYWxTZWdtZW50czpnLGhlaWdodFNlZ21lbnRzOnIsb3BlbkVuZGVkOnYsdGhldGFTdGFydDp6LHRoZXRhTGVuZ3RoOkV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBmZChhLGMsZSxnLHIsdix6LEUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBmZChhLGMsZSxnLHIsdix6LEUpe2Z1bmN0aW9uIEYocGEpe3ZhciBxYSx1YT1uZXcgZixvYT1uZXcgayx0YT0wLEJhPSEwPT09CnBhP2E6YyxUYT0hMD09PXBhPzE6LTE7dmFyIFVhPVc7Zm9yKHFhPTE7cWE8PWc7cWErKylSLnB1c2goMCxmYSpUYSwwKSxTLnB1c2goMCxUYSwwKSxWLnB1c2goLjUsLjUpLFcrKzt2YXIgQ2E9Vztmb3IocWE9MDtxYTw9ZztxYSsrKXt2YXIgSGE9cWEvZypFK3osRGE9TWF0aC5jb3MoSGEpO0hhPU1hdGguc2luKEhhKTtvYS54PUJhKkhhO29hLnk9ZmEqVGE7b2Euej1CYSpEYTtSLnB1c2gob2EueCxvYS55LG9hLnopO1MucHVzaCgwLFRhLDApO3VhLng9LjUqRGErLjU7dWEueT0uNSpIYSpUYSsuNTtWLnB1c2godWEueCx1YS55KTtXKyt9Zm9yKHFhPTA7cWE8ZztxYSsrKXVhPVVhK3FhLG9hPUNhK3FhLCEwPT09cGE/UC5wdXNoKG9hLG9hKzEsdWEpOlAucHVzaChvYSsxLG9hLHVhKSx0YSs9MztKLmFkZEdyb3VwKHJhLHRhLCEwPT09cGE/MToyKTtyYSs9dGF9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN5bGluZGVyQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOmEsCnJhZGl1c0JvdHRvbTpjLGhlaWdodDplLHJhZGlhbFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6cixvcGVuRW5kZWQ6dix0aGV0YVN0YXJ0OnosdGhldGFMZW5ndGg6RX07dmFyIEo9dGhpczthPXZvaWQgMCE9PWE/YToxO2M9dm9pZCAwIT09Yz9jOjE7ZT1lfHwxO2c9TWF0aC5mbG9vcihnKXx8ODtyPU1hdGguZmxvb3Iocil8fDE7dj12b2lkIDAhPT12P3Y6ITE7ej12b2lkIDAhPT16P3o6MDtFPXZvaWQgMCE9PUU/RToyKk1hdGguUEk7dmFyIFA9W10sUj1bXSxTPVtdLFY9W10sVz0wLGhhPVtdLGZhPWUvMixyYT0wOyhmdW5jdGlvbigpe3ZhciBwYSxxYSx1YT1uZXcgayxvYT1uZXcgayx0YT0wLEJhPShjLWEpL2U7Zm9yKHFhPTA7cWE8PXI7cWErKyl7dmFyIFRhPVtdLFVhPXFhL3IsQ2E9VWEqKGMtYSkrYTtmb3IocGE9MDtwYTw9ZztwYSsrKXt2YXIgSGE9cGEvZyxEYT1IYSpFK3osTWE9TWF0aC5zaW4oRGEpO0RhPU1hdGguY29zKERhKTtvYS54PUNhKk1hO29hLnk9LVVhKmUrZmE7Cm9hLno9Q2EqRGE7Ui5wdXNoKG9hLngsb2EueSxvYS56KTt1YS5zZXQoTWEsQmEsRGEpLm5vcm1hbGl6ZSgpO1MucHVzaCh1YS54LHVhLnksdWEueik7Vi5wdXNoKEhhLDEtVWEpO1RhLnB1c2goVysrKX1oYS5wdXNoKFRhKX1mb3IocGE9MDtwYTxnO3BhKyspZm9yKHFhPTA7cWE8cjtxYSsrKXVhPWhhW3FhKzFdW3BhXSxvYT1oYVtxYSsxXVtwYSsxXSxCYT1oYVtxYV1bcGErMV0sUC5wdXNoKGhhW3FhXVtwYV0sdWEsQmEpLFAucHVzaCh1YSxvYSxCYSksdGErPTY7Si5hZGRHcm91cChyYSx0YSwwKTtyYSs9dGF9KSgpOyExPT09diYmKDA8YSYmRighMCksMDxjJiZGKCExKSk7dGhpcy5zZXRJbmRleChQKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShSLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoUywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoViwyKSl9ZnVuY3Rpb24gVmYoYSxjLGUsZyxyLHYseil7WGQuY2FsbCh0aGlzLAowLGEsYyxlLGcscix2LHopO3RoaXMudHlwZT0iQ29uZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGhlaWdodDpjLHJhZGlhbFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6ZyxvcGVuRW5kZWQ6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en19ZnVuY3Rpb24gV2YoYSxjLGUsZyxyLHYseil7ZmQuY2FsbCh0aGlzLDAsYSxjLGUsZyxyLHYseik7dGhpcy50eXBlPSJDb25lQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsaGVpZ2h0OmMscmFkaWFsU2VnbWVudHM6ZSxoZWlnaHRTZWdtZW50czpnLG9wZW5FbmRlZDpyLHRoZXRhU3RhcnQ6dix0aGV0YUxlbmd0aDp6fX1mdW5jdGlvbiBYZihhLGMsZSxnKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2lyY2xlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsc2VnbWVudHM6Yyx0aGV0YVN0YXJ0OmUsdGhldGFMZW5ndGg6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFFlKGEsCmMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUWUoYSxjLGUsZyl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNpcmNsZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHNlZ21lbnRzOmMsdGhldGFTdGFydDplLHRoZXRhTGVuZ3RoOmd9O2E9YXx8MTtjPXZvaWQgMCE9PWM/TWF0aC5tYXgoMyxjKTo4O2U9dm9pZCAwIT09ZT9lOjA7Zz12b2lkIDAhPT1nP2c6MipNYXRoLlBJO3ZhciByPVtdLHY9W10sej1bXSxFPVtdLEYsSj1uZXcgayxQPW5ldyBmO3YucHVzaCgwLDAsMCk7ei5wdXNoKDAsMCwxKTtFLnB1c2goLjUsLjUpO3ZhciBSPTA7Zm9yKEY9MztSPD1jO1IrKyxGKz0zKXt2YXIgUz1lK1IvYypnO0oueD1hKk1hdGguY29zKFMpO0oueT1hKk1hdGguc2luKFMpO3YucHVzaChKLngsSi55LEoueik7ei5wdXNoKDAsMCwxKTtQLng9KHZbRl0vYSsxKS8yO1AueT0odltGKzFdL2ErMSkvMjtFLnB1c2goUC54LFAueSl9Zm9yKEY9MTtGPD0KYztGKyspci5wdXNoKEYsRisxLDApO3RoaXMuc2V0SW5kZXgocik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKHosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKEUsMikpfWZ1bmN0aW9uIFlkKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYWRvd01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDApO3RoaXMudHJhbnNwYXJlbnQ9ITA7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gUmUoYSl7cWIuY2FsbCh0aGlzLGEpO3RoaXMudHlwZT0iUmF3U2hhZGVyTWF0ZXJpYWwifWZ1bmN0aW9uIFNjKGEpe00uY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifTt0aGlzLnR5cGU9Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLm1ldGFsbmVzcz10aGlzLnJvdWdobmVzcz0uNTt0aGlzLmxpZ2h0TWFwPXRoaXMubWFwPQpudWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEkoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuYnVtcE1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMubWV0YWxuZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwPW51bGw7dGhpcy5lbnZNYXBJbnRlbnNpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0KInJvdW5kIjt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIFpkKGEpe1NjLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn07dGhpcy50eXBlPSJNZXNoUGh5c2ljYWxNYXRlcmlhbCI7dGhpcy5yZWZsZWN0aXZpdHk9LjU7dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXQ9MDt0aGlzLnNoZWVuPW51bGw7dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZT1uZXcgZigxLDEpO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPW51bGw7dGhpcy50cmFuc3BhcmVuY3k9MDt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBCYyhhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoUGhvbmdNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5zcGVjdWxhcj1uZXcgSSgxMTE4NDgxKTt0aGlzLnNoaW5pbmVzcz0zMDt0aGlzLmxpZ2h0TWFwPQp0aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEkoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuYnVtcE1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPQoicm91bmQiO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gJGQoYSl7QmMuY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1RPT046IiJ9O3RoaXMudHlwZT0iTWVzaFRvb25NYXRlcmlhbCI7dGhpcy5ncmFkaWVudE1hcD1udWxsO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGFlKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hOb3JtYWxNYXRlcmlhbCI7dGhpcy5idW1wTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPQp0aGlzLnNraW5uaW5nPXRoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGJlKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hMYW1iZXJ0TWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEkoMTY3NzcyMTUpO3RoaXMubGlnaHRNYXA9dGhpcy5tYXA9bnVsbDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTE7dGhpcy5hb01hcD1udWxsO3RoaXMuYW9NYXBJbnRlbnNpdHk9MTt0aGlzLmVtaXNzaXZlPW5ldyBJKDApO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MTt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9dGhpcy5lbWlzc2l2ZU1hcD1udWxsO3RoaXMuY29tYmluZT0wO3RoaXMucmVmbGVjdGl2aXR5PTE7dGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4O3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIjsKdGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBjZShhKXtNLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9O3RoaXMudHlwZT0iTWVzaE1hdGNhcE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmJ1bXBNYXA9dGhpcy5tYXA9dGhpcy5tYXRjYXA9bnVsbDt0aGlzLmJ1bXBTY2FsZT0xO3RoaXMubm9ybWFsTWFwPW51bGw7dGhpcy5ub3JtYWxNYXBUeXBlPTA7dGhpcy5ub3JtYWxTY2FsZT1uZXcgZigxLDEpO3RoaXMuZGlzcGxhY2VtZW50TWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMuYWxwaGFNYXA9bnVsbDt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGRlKGEpe0ZiLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIjt0aGlzLnNjYWxlPTE7dGhpcy5kYXNoU2l6ZT0zO3RoaXMuZ2FwU2l6ZT0xO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIG9jKGEsYyxlLGcpe3RoaXMucGFyYW1ldGVyUG9zaXRpb25zPWE7dGhpcy5fY2FjaGVkSW5kZXg9MDt0aGlzLnJlc3VsdEJ1ZmZlcj12b2lkIDAhPT1nP2c6bmV3IGMuY29uc3RydWN0b3IoZSk7dGhpcy5zYW1wbGVWYWx1ZXM9Yzt0aGlzLnZhbHVlU2l6ZT1lfWZ1bmN0aW9uIEVnKGEsYyxlLGcpe29jLmNhbGwodGhpcyxhLGMsZSxnKTt0aGlzLl9vZmZzZXROZXh0PXRoaXMuX3dlaWdodE5leHQ9dGhpcy5fb2Zmc2V0UHJldj10aGlzLl93ZWlnaHRQcmV2PS0wfWZ1bmN0aW9uIFlmKGEsYyxlLGcpe29jLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBGZyhhLGMsZSxnKXtvYy5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gWGIoYSxjLGUsZyl7aWYodm9pZCAwPT09YSl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQiKTsKaWYodm9pZCAwPT09Y3x8MD09PWMubGVuZ3RoKXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgIithKTt0aGlzLm5hbWU9YTt0aGlzLnRpbWVzPVRiLmNvbnZlcnRBcnJheShjLHRoaXMuVGltZUJ1ZmZlclR5cGUpO3RoaXMudmFsdWVzPVRiLmNvbnZlcnRBcnJheShlLHRoaXMuVmFsdWVCdWZmZXJUeXBlKTt0aGlzLnNldEludGVycG9sYXRpb24oZ3x8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gR2coYSxjLGUpe1hiLmNhbGwodGhpcyxhLGMsZSl9ZnVuY3Rpb24gSGcoYSxjLGUsZyl7WGIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIFNlKGEsYyxlLGcpe1hiLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBJZyhhLGMsZSxnKXtvYy5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gWmYoYSxjLGUsZyl7WGIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIEpnKGEsYyxlLGcpe1hiLmNhbGwodGhpcywKYSxjLGUsZyl9ZnVuY3Rpb24gVGUoYSxjLGUsZyl7WGIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIHRjKGEsYyxlKXt0aGlzLm5hbWU9YTt0aGlzLnRyYWNrcz1lO3RoaXMuZHVyYXRpb249dm9pZCAwIT09Yz9jOi0xO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTswPnRoaXMuZHVyYXRpb24mJnRoaXMucmVzZXREdXJhdGlvbigpfWZ1bmN0aW9uIG1tKGEpe3N3aXRjaChhLnRvTG93ZXJDYXNlKCkpe2Nhc2UgInNjYWxhciI6Y2FzZSAiZG91YmxlIjpjYXNlICJmbG9hdCI6Y2FzZSAibnVtYmVyIjpjYXNlICJpbnRlZ2VyIjpyZXR1cm4gU2U7Y2FzZSAidmVjdG9yIjpjYXNlICJ2ZWN0b3IyIjpjYXNlICJ2ZWN0b3IzIjpjYXNlICJ2ZWN0b3I0IjpyZXR1cm4gVGU7Y2FzZSAiY29sb3IiOnJldHVybiBIZztjYXNlICJxdWF0ZXJuaW9uIjpyZXR1cm4gWmY7Y2FzZSAiYm9vbCI6Y2FzZSAiYm9vbGVhbiI6cmV0dXJuIEdnO2Nhc2UgInN0cmluZyI6cmV0dXJuIEpnfXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIisKYSk7fWZ1bmN0aW9uIG5tKGEpe2lmKHZvaWQgMD09PWEudHlwZSl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UiKTt2YXIgYz1tbShhLnR5cGUpO2lmKHZvaWQgMD09PWEudGltZXMpe3ZhciBlPVtdLGc9W107VGIuZmxhdHRlbkpTT04oYS5rZXlzLGUsZywidmFsdWUiKTthLnRpbWVzPWU7YS52YWx1ZXM9Z31yZXR1cm4gdm9pZCAwIT09Yy5wYXJzZT9jLnBhcnNlKGEpOm5ldyBjKGEubmFtZSxhLnRpbWVzLGEudmFsdWVzLGEuaW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gJGgoYSxjLGUpe3ZhciBnPXRoaXMscj0hMSx2PTAsej0wLEU9dm9pZCAwO3RoaXMub25TdGFydD12b2lkIDA7dGhpcy5vbkxvYWQ9YTt0aGlzLm9uUHJvZ3Jlc3M9Yzt0aGlzLm9uRXJyb3I9ZTt0aGlzLml0ZW1TdGFydD1mdW5jdGlvbihGKXt6Kys7aWYoITE9PT1yJiZ2b2lkIDAhPT1nLm9uU3RhcnQpZy5vblN0YXJ0KEYsdix6KTtyPSEwfTsKdGhpcy5pdGVtRW5kPWZ1bmN0aW9uKEYpe3YrKztpZih2b2lkIDAhPT1nLm9uUHJvZ3Jlc3MpZy5vblByb2dyZXNzKEYsdix6KTtpZih2PT09eiYmKHI9ITEsdm9pZCAwIT09Zy5vbkxvYWQpKWcub25Mb2FkKCl9O3RoaXMuaXRlbUVycm9yPWZ1bmN0aW9uKEYpe2lmKHZvaWQgMCE9PWcub25FcnJvcilnLm9uRXJyb3IoRil9O3RoaXMucmVzb2x2ZVVSTD1mdW5jdGlvbihGKXtyZXR1cm4gRT9FKEYpOkZ9O3RoaXMuc2V0VVJMTW9kaWZpZXI9ZnVuY3Rpb24oRil7RT1GO3JldHVybiB0aGlzfX1mdW5jdGlvbiBEYihhKXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09YT9hOk9qO3RoaXMuY3Jvc3NPcmlnaW49ImFub255bW91cyI7dGhpcy5yZXNvdXJjZVBhdGg9dGhpcy5wYXRoPSIifWZ1bmN0aW9uIHVjKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBhaShhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gYmkoYSl7RGIuY2FsbCh0aGlzLGEpO3RoaXMuX3BhcnNlcj1udWxsfWZ1bmN0aW9uIEtnKGEpe0RiLmNhbGwodGhpcywKYSk7dGhpcy5fcGFyc2VyPW51bGx9ZnVuY3Rpb24gVWUoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIExnKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBNZyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gWmEoKXt0aGlzLnR5cGU9IkN1cnZlIjt0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz0yMDB9ZnVuY3Rpb24gcGMoYSxjLGUsZyxyLHYseixFKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRWxsaXBzZUN1cnZlIjt0aGlzLmFYPWF8fDA7dGhpcy5hWT1jfHwwO3RoaXMueFJhZGl1cz1lfHwxO3RoaXMueVJhZGl1cz1nfHwxO3RoaXMuYVN0YXJ0QW5nbGU9cnx8MDt0aGlzLmFFbmRBbmdsZT12fHwyKk1hdGguUEk7dGhpcy5hQ2xvY2t3aXNlPXp8fCExO3RoaXMuYVJvdGF0aW9uPUV8fDB9ZnVuY3Rpb24gVmUoYSxjLGUsZyxyLHYpe3BjLmNhbGwodGhpcyxhLGMsZSxlLGcscix2KTt0aGlzLnR5cGU9IkFyY0N1cnZlIn1mdW5jdGlvbiBjaSgpe2Z1bmN0aW9uIGEodix6LEUsCkYpe2M9djtlPUU7Zz0tMyp2KzMqei0yKkUtRjtyPTIqdi0yKnorRStGfXZhciBjPTAsZT0wLGc9MCxyPTA7cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHYseixFLEYsSil7YSh6LEUsSiooRS12KSxKKihGLXopKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHYseixFLEYsSixQLFIpe2EoeixFLCgoei12KS9KLShFLXYpLyhKK1ApKyhFLXopL1ApKlAsKChFLXopL1AtKEYteikvKFArUikrKEYtRSkvUikqUCl9LGNhbGM6ZnVuY3Rpb24odil7dmFyIHo9dip2O3JldHVybiBjK2UqditnKnorcip6KnZ9fX1mdW5jdGlvbiBaYihhLGMsZSxnKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2F0bXVsbFJvbUN1cnZlMyI7dGhpcy5wb2ludHM9YXx8W107dGhpcy5jbG9zZWQ9Y3x8ITE7dGhpcy5jdXJ2ZVR5cGU9ZXx8ImNlbnRyaXBldGFsIjt0aGlzLnRlbnNpb249Z3x8LjV9ZnVuY3Rpb24gUGooYSxjLGUsZyxyKXtjPS41KihnLWMpO3I9LjUqKHItZSk7dmFyIHY9CmEqYTtyZXR1cm4oMiplLTIqZytjK3IpKmEqdisoLTMqZSszKmctMipjLXIpKnYrYyphK2V9ZnVuY3Rpb24gb20oYSxjKXthPTEtYTtyZXR1cm4gYSphKmN9ZnVuY3Rpb24gcG0oYSxjKXtyZXR1cm4gMiooMS1hKSphKmN9ZnVuY3Rpb24gcW0oYSxjKXtyZXR1cm4gYSphKmN9ZnVuY3Rpb24gJGYoYSxjLGUsZyl7cmV0dXJuIG9tKGEsYykrcG0oYSxlKStxbShhLGcpfWZ1bmN0aW9uIHJtKGEsYyl7YT0xLWE7cmV0dXJuIGEqYSphKmN9ZnVuY3Rpb24gc20oYSxjKXt2YXIgZT0xLWE7cmV0dXJuIDMqZSplKmEqY31mdW5jdGlvbiB0bShhLGMpe3JldHVybiAzKigxLWEpKmEqYSpjfWZ1bmN0aW9uIHVtKGEsYyl7cmV0dXJuIGEqYSphKmN9ZnVuY3Rpb24gYWcoYSxjLGUsZyxyKXtyZXR1cm4gcm0oYSxjKStzbShhLGUpK3RtKGEsZykrdW0oYSxyKX1mdW5jdGlvbiBDYyhhLGMsZSxnKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSI7dGhpcy52MD1hfHxuZXcgZjsKdGhpcy52MT1jfHxuZXcgZjt0aGlzLnYyPWV8fG5ldyBmO3RoaXMudjM9Z3x8bmV3IGZ9ZnVuY3Rpb24gVGMoYSxjLGUsZyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIjt0aGlzLnYwPWF8fG5ldyBrO3RoaXMudjE9Y3x8bmV3IGs7dGhpcy52Mj1lfHxuZXcgazt0aGlzLnYzPWd8fG5ldyBrfWZ1bmN0aW9uIGtjKGEsYyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVDdXJ2ZSI7dGhpcy52MT1hfHxuZXcgZjt0aGlzLnYyPWN8fG5ldyBmfWZ1bmN0aW9uIERjKGEsYyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiO3RoaXMudjE9YXx8bmV3IGs7dGhpcy52Mj1jfHxuZXcga31mdW5jdGlvbiBFYyhhLGMsZSl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlF1YWRyYXRpY0JlemllckN1cnZlIjt0aGlzLnYwPWF8fG5ldyBmO3RoaXMudjE9Y3x8bmV3IGY7dGhpcy52Mj1lfHxuZXcgZn1mdW5jdGlvbiBVYyhhLGMsZSl7WmEuY2FsbCh0aGlzKTsKdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiO3RoaXMudjA9YXx8bmV3IGs7dGhpcy52MT1jfHxuZXcgazt0aGlzLnYyPWV8fG5ldyBrfWZ1bmN0aW9uIEZjKGEpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcGxpbmVDdXJ2ZSI7dGhpcy5wb2ludHM9YXx8W119ZnVuY3Rpb24gZ2QoKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3VydmVQYXRoIjt0aGlzLmN1cnZlcz1bXTt0aGlzLmF1dG9DbG9zZT0hMX1mdW5jdGlvbiBHYyhhKXtnZC5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGF0aCI7dGhpcy5jdXJyZW50UG9pbnQ9bmV3IGY7YSYmdGhpcy5zZXRGcm9tUG9pbnRzKGEpfWZ1bmN0aW9uIENkKGEpe0djLmNhbGwodGhpcyxhKTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy50eXBlPSJTaGFwZSI7dGhpcy5ob2xlcz1bXX1mdW5jdGlvbiBKYihhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpZ2h0Ijt0aGlzLmNvbG9yPW5ldyBJKGEpO3RoaXMuaW50ZW5zaXR5PQp2b2lkIDAhPT1jP2M6MTt0aGlzLnJlY2VpdmVTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIE5nKGEsYyxlKXtKYi5jYWxsKHRoaXMsYSxlKTt0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCI7dGhpcy5jYXN0U2hhZG93PXZvaWQgMDt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy5ncm91bmRDb2xvcj1uZXcgSShjKX1mdW5jdGlvbiBWYyhhKXt0aGlzLmNhbWVyYT1hO3RoaXMuYmlhcz0wO3RoaXMucmFkaXVzPTE7dGhpcy5tYXBTaXplPW5ldyBmKDUxMiw1MTIpO3RoaXMubWFwUGFzcz10aGlzLm1hcD1udWxsO3RoaXMubWF0cml4PW5ldyBxO3RoaXMuX2ZydXN0dW09bmV3IGljO3RoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgZigxLDEpO3RoaXMuX3ZpZXdwb3J0Q291bnQ9MTt0aGlzLl92aWV3cG9ydHM9W25ldyBwKDAsMCwxLDEpXX1mdW5jdGlvbiBPZygpe1ZjLmNhbGwodGhpcyxuZXcgdmIoNTAsMSwuNSw1MDApKX1mdW5jdGlvbiBQZyhhLApjLGUsZyxyLHYpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iU3BvdExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy50YXJnZXQ9bmV3IEE7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBvd2VyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbih6KXt0aGlzLmludGVuc2l0eT16L01hdGguUEl9fSk7dGhpcy5kaXN0YW5jZT12b2lkIDAhPT1lP2U6MDt0aGlzLmFuZ2xlPXZvaWQgMCE9PWc/ZzpNYXRoLlBJLzM7dGhpcy5wZW51bWJyYT12b2lkIDAhPT1yP3I6MDt0aGlzLmRlY2F5PXZvaWQgMCE9PXY/djoxO3RoaXMuc2hhZG93PW5ldyBPZ31mdW5jdGlvbiBkaSgpe1ZjLmNhbGwodGhpcyxuZXcgdmIoOTAsMSwuNSw1MDApKTt0aGlzLl9mcmFtZUV4dGVudHM9bmV3IGYoNCwyKTt0aGlzLl92aWV3cG9ydENvdW50PTY7dGhpcy5fdmlld3BvcnRzPVtuZXcgcCgyLAoxLDEsMSksbmV3IHAoMCwxLDEsMSksbmV3IHAoMywxLDEsMSksbmV3IHAoMSwxLDEsMSksbmV3IHAoMywwLDEsMSksbmV3IHAoMSwwLDEsMSldO3RoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgaygxLDAsMCksbmV3IGsoLTEsMCwwKSxuZXcgaygwLDAsMSksbmV3IGsoMCwwLC0xKSxuZXcgaygwLDEsMCksbmV3IGsoMCwtMSwwKV07dGhpcy5fY3ViZVVwcz1bbmV3IGsoMCwxLDApLG5ldyBrKDAsMSwwKSxuZXcgaygwLDEsMCksbmV3IGsoMCwxLDApLG5ldyBrKDAsMCwxKSxuZXcgaygwLDAsLTEpXX1mdW5jdGlvbiBRZyhhLGMsZSxnKXtKYi5jYWxsKHRoaXMsYSxjKTt0aGlzLnR5cGU9IlBvaW50TGlnaHQiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb3dlciIse2dldDpmdW5jdGlvbigpe3JldHVybiA0KnRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbihyKXt0aGlzLmludGVuc2l0eT1yLyg0Kk1hdGguUEkpfX0pO3RoaXMuZGlzdGFuY2U9dm9pZCAwIT09ZT8KZTowO3RoaXMuZGVjYXk9dm9pZCAwIT09Zz9nOjE7dGhpcy5zaGFkb3c9bmV3IGRpfWZ1bmN0aW9uIGJnKGEsYyxlLGcscix2KXt6Yi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT3J0aG9ncmFwaGljQ2FtZXJhIjt0aGlzLnpvb209MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmxlZnQ9dm9pZCAwIT09YT9hOi0xO3RoaXMucmlnaHQ9dm9pZCAwIT09Yz9jOjE7dGhpcy50b3A9dm9pZCAwIT09ZT9lOjE7dGhpcy5ib3R0b209dm9pZCAwIT09Zz9nOi0xO3RoaXMubmVhcj12b2lkIDAhPT1yP3I6LjE7dGhpcy5mYXI9dm9pZCAwIT09dj92OjJFMzt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBSZygpe1ZjLmNhbGwodGhpcyxuZXcgYmcoLTUsNSw1LC01LC41LDUwMCkpfWZ1bmN0aW9uIFNnKGEsYyl7SmIuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7CnRoaXMudGFyZ2V0PW5ldyBBO3RoaXMuc2hhZG93PW5ldyBSZ31mdW5jdGlvbiBUZyhhLGMpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iQW1iaWVudExpZ2h0Ijt0aGlzLmNhc3RTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIFVnKGEsYyxlLGcpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodCI7dGhpcy53aWR0aD12b2lkIDAhPT1lP2U6MTA7dGhpcy5oZWlnaHQ9dm9pZCAwIT09Zz9nOjEwfWZ1bmN0aW9uIFZnKGEpe0RiLmNhbGwodGhpcyxhKTt0aGlzLnRleHR1cmVzPXt9fWZ1bmN0aW9uIFdnKCl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLm1heEluc3RhbmNlZENvdW50PXZvaWQgMH1mdW5jdGlvbiBYZyhhLGMsZSxnKXsibnVtYmVyIj09PXR5cGVvZiBlJiYoZz1lLGU9ITEsY29uc29sZS5lcnJvcigiVEhSRUUuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiBUaGUgY29uc3RydWN0b3Igbm93IGV4cGVjdHMgbm9ybWFsaXplZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQuIikpOwpRLmNhbGwodGhpcyxhLGMsZSk7dGhpcy5tZXNoUGVyQXR0cmlidXRlPWd8fDF9ZnVuY3Rpb24gWWcoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIFpnKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBlaShhKXsidW5kZWZpbmVkIj09PXR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLiIpOyJ1bmRlZmluZWQiPT09dHlwZW9mIGZldGNoJiZjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuIik7RGIuY2FsbCh0aGlzLGEpO3RoaXMub3B0aW9ucz12b2lkIDB9ZnVuY3Rpb24gZmkoKXt0aGlzLnR5cGU9IlNoYXBlUGF0aCI7dGhpcy5jb2xvcj1uZXcgSTt0aGlzLnN1YlBhdGhzPVtdO3RoaXMuY3VycmVudFBhdGg9bnVsbH1mdW5jdGlvbiBnaShhKXt0aGlzLnR5cGU9IkZvbnQiO3RoaXMuZGF0YT0KYX1mdW5jdGlvbiB2bShhLGMsZSl7YT1BcnJheS5mcm9tP0FycmF5LmZyb20oYSk6U3RyaW5nKGEpLnNwbGl0KCIiKTtjLz1lLnJlc29sdXRpb247Zm9yKHZhciBnPShlLmJvdW5kaW5nQm94LnlNYXgtZS5ib3VuZGluZ0JveC55TWluK2UudW5kZXJsaW5lVGhpY2tuZXNzKSpjLHI9W10sdj0wLHo9MCxFPTA7RTxhLmxlbmd0aDtFKyspe3ZhciBGPWFbRV07IlxuIj09PUY/KHY9MCx6LT1nKTooRj13bShGLGMsdix6LGUpLHYrPUYub2Zmc2V0WCxyLnB1c2goRi5wYXRoKSl9cmV0dXJuIHJ9ZnVuY3Rpb24gd20oYSxjLGUsZyxyKXt2YXIgdj1yLmdseXBoc1thXXx8ci5nbHlwaHNbIj8iXTtpZih2KXthPW5ldyBmaTtpZih2Lm8pe3I9di5fY2FjaGVkT3V0bGluZXx8KHYuX2NhY2hlZE91dGxpbmU9di5vLnNwbGl0KCIgIikpO2Zvcih2YXIgej0wLEU9ci5sZW5ndGg7ejxFOylzd2l0Y2goclt6KytdKXtjYXNlICJtIjp2YXIgRj1yW3orK10qYytlO3ZhciBKPXJbeisrXSpjK2c7YS5tb3ZlVG8oRiwKSik7YnJlYWs7Y2FzZSAibCI6Rj1yW3orK10qYytlO0o9clt6KytdKmMrZzthLmxpbmVUbyhGLEopO2JyZWFrO2Nhc2UgInEiOkY9clt6KytdKmMrZTtKPXJbeisrXSpjK2c7dmFyIFA9clt6KytdKmMrZTt2YXIgUj1yW3orK10qYytnO2EucXVhZHJhdGljQ3VydmVUbyhQLFIsRixKKTticmVhaztjYXNlICJiIjpGPXJbeisrXSpjK2U7Sj1yW3orK10qYytnO1A9clt6KytdKmMrZTtSPXJbeisrXSpjK2c7dmFyIFM9clt6KytdKmMrZTt2YXIgVj1yW3orK10qYytnO2EuYmV6aWVyQ3VydmVUbyhQLFIsUyxWLEYsSil9fXJldHVybntvZmZzZXRYOnYuaGEqYyxwYXRoOmF9fWNvbnNvbGUuZXJyb3IoJ1RIUkVFLkZvbnQ6IGNoYXJhY3RlciAiJythKyciIGRvZXMgbm90IGV4aXN0cyBpbiBmb250IGZhbWlseSAnK3IuZmFtaWx5TmFtZSsiLiIpfWZ1bmN0aW9uIGhpKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiAkZyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gYWgoKXt0aGlzLmNvZWZmaWNpZW50cz0KW107Zm9yKHZhciBhPTA7OT5hO2ErKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBrKX1mdW5jdGlvbiBIYyhhLGMpe0piLmNhbGwodGhpcyx2b2lkIDAsYyk7dGhpcy5zaD12b2lkIDAhPT1hP2E6bmV3IGFofWZ1bmN0aW9uIGlpKGEsYyxlKXtIYy5jYWxsKHRoaXMsdm9pZCAwLGUpO2E9KG5ldyBJKS5zZXQoYSk7ZT0obmV3IEkpLnNldChjKTtjPW5ldyBrKGEucixhLmcsYS5iKTthPW5ldyBrKGUucixlLmcsZS5iKTtlPU1hdGguc3FydChNYXRoLlBJKTt2YXIgZz1lKk1hdGguc3FydCguNzUpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLmNvcHkoYykuYWRkKGEpLm11bHRpcGx5U2NhbGFyKGUpO3RoaXMuc2guY29lZmZpY2llbnRzWzFdLmNvcHkoYykuc3ViKGEpLm11bHRpcGx5U2NhbGFyKGcpfWZ1bmN0aW9uIGppKGEsYyl7SGMuY2FsbCh0aGlzLHZvaWQgMCxjKTthPShuZXcgSSkuc2V0KGEpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLnNldChhLnIsYS5nLGEuYikubXVsdGlwbHlTY2FsYXIoMioKTWF0aC5zcXJ0KE1hdGguUEkpKX1mdW5jdGlvbiBRaigpe3RoaXMudHlwZT0iU3RlcmVvQ2FtZXJhIjt0aGlzLmFzcGVjdD0xO3RoaXMuZXllU2VwPS4wNjQ7dGhpcy5jYW1lcmFMPW5ldyB2Yjt0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSgxKTt0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNhbWVyYVI9bmV3IHZiO3RoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpO3RoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuX2NhY2hlPXtmb2N1czpudWxsLGZvdjpudWxsLGFzcGVjdDpudWxsLG5lYXI6bnVsbCxmYXI6bnVsbCx6b29tOm51bGwsZXllU2VwOm51bGx9fWZ1bmN0aW9uIGtpKGEpe3RoaXMuYXV0b1N0YXJ0PXZvaWQgMCE9PWE/YTohMDt0aGlzLmVsYXBzZWRUaW1lPXRoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZT0wO3RoaXMucnVubmluZz0hMX1mdW5jdGlvbiBsaSgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkF1ZGlvTGlzdGVuZXIiOwp0aGlzLmNvbnRleHQ9bWkuZ2V0Q29udGV4dCgpO3RoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7dGhpcy5maWx0ZXI9bnVsbDt0aGlzLnRpbWVEZWx0YT0wO3RoaXMuX2Nsb2NrPW5ldyBraX1mdW5jdGlvbiBXZShhKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJBdWRpbyI7dGhpcy5saXN0ZW5lcj1hO3RoaXMuY29udGV4dD1hLmNvbnRleHQ7dGhpcy5nYWluPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7dGhpcy5nYWluLmNvbm5lY3QoYS5nZXRJbnB1dCgpKTt0aGlzLmF1dG9wbGF5PSExO3RoaXMuYnVmZmVyPW51bGw7dGhpcy5kZXR1bmU9MDt0aGlzLmxvb3A9ITE7dGhpcy5vZmZzZXQ9dGhpcy5zdGFydFRpbWU9MDt0aGlzLmR1cmF0aW9uPXZvaWQgMDt0aGlzLnBsYXliYWNrUmF0ZT0xO3RoaXMuaXNQbGF5aW5nPSExO3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSEwO3RoaXMuc291cmNlVHlwZT0KImVtcHR5Ijt0aGlzLmZpbHRlcnM9W119ZnVuY3Rpb24gbmkoYSl7V2UuY2FsbCh0aGlzLGEpO3RoaXMucGFubmVyPXRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTt0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWw9IkhSVEYiO3RoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKX1mdW5jdGlvbiBvaShhLGMpe3RoaXMuYW5hbHlzZXI9YS5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7dGhpcy5hbmFseXNlci5mZnRTaXplPXZvaWQgMCE9PWM/YzoyMDQ4O3RoaXMuZGF0YT1uZXcgVWludDhBcnJheSh0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KTthLmdldE91dHB1dCgpLmNvbm5lY3QodGhpcy5hbmFseXNlcil9ZnVuY3Rpb24gcGkoYSxjLGUpe3RoaXMuYmluZGluZz1hO3RoaXMudmFsdWVTaXplPWU7YT1GbG9hdDY0QXJyYXk7c3dpdGNoKGMpe2Nhc2UgInF1YXRlcm5pb24iOmM9dGhpcy5fc2xlcnA7YnJlYWs7Y2FzZSAic3RyaW5nIjpjYXNlICJib29sIjphPUFycmF5O2M9CnRoaXMuX3NlbGVjdDticmVhaztkZWZhdWx0OmM9dGhpcy5fbGVycH10aGlzLmJ1ZmZlcj1uZXcgYSg0KmUpO3RoaXMuX21peEJ1ZmZlclJlZ2lvbj1jO3RoaXMucmVmZXJlbmNlQ291bnQ9dGhpcy51c2VDb3VudD10aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MH1mdW5jdGlvbiBSaihhLGMsZSl7ZT1lfHwkYi5wYXJzZVRyYWNrTmFtZShjKTt0aGlzLl90YXJnZXRHcm91cD1hO3RoaXMuX2JpbmRpbmdzPWEuc3Vic2NyaWJlXyhjLGUpfWZ1bmN0aW9uICRiKGEsYyxlKXt0aGlzLnBhdGg9Yzt0aGlzLnBhcnNlZFBhdGg9ZXx8JGIucGFyc2VUcmFja05hbWUoYyk7dGhpcy5ub2RlPSRiLmZpbmROb2RlKGEsdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lKXx8YTt0aGlzLnJvb3ROb2RlPWF9ZnVuY3Rpb24gU2ooKXt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5fb2JqZWN0cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubkNhY2hlZE9iamVjdHNfPTA7dmFyIGE9Cnt9O3RoaXMuX2luZGljZXNCeVVVSUQ9YTtmb3IodmFyIGM9MCxlPWFyZ3VtZW50cy5sZW5ndGg7YyE9PWU7KytjKWFbYXJndW1lbnRzW2NdLnV1aWRdPWM7dGhpcy5fcGF0aHM9W107dGhpcy5fcGFyc2VkUGF0aHM9W107dGhpcy5fYmluZGluZ3M9W107dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoPXt9O3ZhciBnPXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGcuX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC1nLm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiBnLl9iaW5kaW5ncy5sZW5ndGh9fX1mdW5jdGlvbiBUaihhLGMsZSl7dGhpcy5fbWl4ZXI9YTt0aGlzLl9jbGlwPWM7dGhpcy5fbG9jYWxSb290PWV8fG51bGw7YT1jLnRyYWNrcztjPWEubGVuZ3RoO2U9QXJyYXkoYyk7Zm9yKHZhciBnPXtlbmRpbmdTdGFydDoyNDAwLGVuZGluZ0VuZDoyNDAwfSxyPTA7ciE9PQpjOysrcil7dmFyIHY9YVtyXS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtlW3JdPXY7di5zZXR0aW5ncz1nfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9Zzt0aGlzLl9pbnRlcnBvbGFudHM9ZTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPUFycmF5KGMpO3RoaXMuX3dlaWdodEludGVycG9sYW50PXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PXRoaXMuX2J5Q2xpcENhY2hlSW5kZXg9dGhpcy5fY2FjaGVJbmRleD1udWxsO3RoaXMubG9vcD0yMjAxO3RoaXMuX2xvb3BDb3VudD0tMTt0aGlzLl9zdGFydFRpbWU9bnVsbDt0aGlzLnRpbWU9MDt0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy53ZWlnaHQ9dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPXRoaXMudGltZVNjYWxlPTE7dGhpcy5yZXBldGl0aW9ucz1JbmZpbml0eTt0aGlzLnBhdXNlZD0hMTt0aGlzLmVuYWJsZWQ9ITA7dGhpcy5jbGFtcFdoZW5GaW5pc2hlZD0hMTt0aGlzLnplcm9TbG9wZUF0RW5kPXRoaXMuemVyb1Nsb3BlQXRTdGFydD0KITB9ZnVuY3Rpb24gcWkoYSl7dGhpcy5fcm9vdD1hO3RoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7dGhpcy50aW1lPXRoaXMuX2FjY3VJbmRleD0wO3RoaXMudGltZVNjYWxlPTF9ZnVuY3Rpb24gYmgoYSxjKXsic3RyaW5nIj09PXR5cGVvZiBhJiYoY29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLiIpLGE9Yyk7dGhpcy52YWx1ZT1hfWZ1bmN0aW9uIHJpKGEsYyxlKXtRZC5jYWxsKHRoaXMsYSxjKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9ZXx8MX1mdW5jdGlvbiBVaihhLGMsZSxnKXt0aGlzLnJheT1uZXcgRChhLGMpO3RoaXMubmVhcj1lfHwwO3RoaXMuZmFyPWd8fEluZmluaXR5O3RoaXMuY2FtZXJhPW51bGw7dGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7fSxMT0Q6e30sUG9pbnRzOnt0aHJlc2hvbGQ6MX0sU3ByaXRlOnt9fTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLnBhcmFtcyx7UG9pbnRDbG91ZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXljYXN0ZXI6IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gcGFyYW1zLlBvaW50cy4iKTsKcmV0dXJuIHRoaXMuUG9pbnRzfX19KX1mdW5jdGlvbiBWaihhLGMpe3JldHVybiBhLmRpc3RhbmNlLWMuZGlzdGFuY2V9ZnVuY3Rpb24gc2koYSxjLGUsZyl7aWYoITEhPT1hLnZpc2libGUmJihhLnJheWNhc3QoYyxlKSwhMD09PWcpKXthPWEuY2hpbGRyZW47Zz0wO2Zvcih2YXIgcj1hLmxlbmd0aDtnPHI7ZysrKXNpKGFbZ10sYyxlLCEwKX19ZnVuY3Rpb24gV2ooYSxjLGUpe3RoaXMucmFkaXVzPXZvaWQgMCE9PWE/YToxO3RoaXMucGhpPXZvaWQgMCE9PWM/YzowO3RoaXMudGhldGE9dm9pZCAwIT09ZT9lOjA7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gWGooYSxjLGUpe3RoaXMucmFkaXVzPXZvaWQgMCE9PWE/YToxO3RoaXMudGhldGE9dm9pZCAwIT09Yz9jOjA7dGhpcy55PXZvaWQgMCE9PWU/ZTowO3JldHVybiB0aGlzfWZ1bmN0aW9uIHRpKGEsYyl7dGhpcy5taW49dm9pZCAwIT09YT9hOm5ldyBmKEluZmluaXR5LEluZmluaXR5KTt0aGlzLm1heD12b2lkIDAhPT1jP2M6bmV3IGYoLUluZmluaXR5LAotSW5maW5pdHkpfWZ1bmN0aW9uIHVpKGEsYyl7dGhpcy5zdGFydD12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5lbmQ9dm9pZCAwIT09Yz9jOm5ldyBrfWZ1bmN0aW9uIGNnKGEpe0EuY2FsbCh0aGlzKTt0aGlzLm1hdGVyaWFsPWE7dGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXt9fWZ1bmN0aW9uIGRnKGEsYyxlLGcpe3RoaXMub2JqZWN0PWE7dGhpcy5zaXplPXZvaWQgMCE9PWM/YzoxO2E9dm9pZCAwIT09ZT9lOjE2NzExNjgwO2c9dm9pZCAwIT09Zz9nOjE7Yz0wOyhlPXRoaXMub2JqZWN0Lmdlb21ldHJ5KSYmZS5pc0dlb21ldHJ5P2M9MyplLmZhY2VzLmxlbmd0aDplJiZlLmlzQnVmZmVyR2VvbWV0cnkmJihjPWUuYXR0cmlidXRlcy5ub3JtYWwuY291bnQpO2U9bmV3IHZhO2M9bmV3IGNhKDYqYywzKTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGMpO0liLmNhbGwodGhpcyxlLG5ldyBGYih7Y29sb3I6YSxsaW5ld2lkdGg6Z30pKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX0KZnVuY3Rpb24gWGUoYSxjKXtBLmNhbGwodGhpcyk7dGhpcy5saWdodD1hO3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNvbG9yPWM7YT1uZXcgdmE7Yz1bMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsLTEsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsLTEsMV07Zm9yKHZhciBlPTAsZz0xOzMyPmU7ZSsrLGcrKyl7dmFyIHI9ZS8zMipNYXRoLlBJKjIsdj1nLzMyKk1hdGguUEkqMjtjLnB1c2goTWF0aC5jb3MociksTWF0aC5zaW4ociksMSxNYXRoLmNvcyh2KSxNYXRoLnNpbih2KSwxKX1hLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShjLDMpKTtjPW5ldyBGYih7Zm9nOiExfSk7dGhpcy5jb25lPW5ldyBJYihhLGMpO3RoaXMuYWRkKHRoaXMuY29uZSk7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBZaihhKXt2YXIgYz1bXTthJiZhLmlzQm9uZSYmYy5wdXNoKGEpOwpmb3IodmFyIGU9MDtlPGEuY2hpbGRyZW4ubGVuZ3RoO2UrKyljLnB1c2guYXBwbHkoYyxZaihhLmNoaWxkcmVuW2VdKSk7cmV0dXJuIGN9ZnVuY3Rpb24gWWUoYSl7Zm9yKHZhciBjPVlqKGEpLGU9bmV3IHZhLGc9W10scj1bXSx2PW5ldyBJKDAsMCwxKSx6PW5ldyBJKDAsMSwwKSxFPTA7RTxjLmxlbmd0aDtFKyspe3ZhciBGPWNbRV07Ri5wYXJlbnQmJkYucGFyZW50LmlzQm9uZSYmKGcucHVzaCgwLDAsMCksZy5wdXNoKDAsMCwwKSxyLnB1c2godi5yLHYuZyx2LmIpLHIucHVzaCh6LnIsei5nLHouYikpfWUuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGcsMykpO2UuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKHIsMykpO2c9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6MixkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSx0cmFuc3BhcmVudDohMH0pO0liLmNhbGwodGhpcyxlLGcpO3RoaXMucm9vdD1hO3RoaXMuYm9uZXM9Yzt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0KITF9ZnVuY3Rpb24gWmUoYSxjLGUpe3RoaXMubGlnaHQ9YTt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5jb2xvcj1lO2E9bmV3IEJkKGMsNCwyKTtjPW5ldyBMKHt3aXJlZnJhbWU6ITAsZm9nOiExfSk7eGEuY2FsbCh0aGlzLGEsYyk7dGhpcy5tYXRyaXg9dGhpcy5saWdodC5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiAkZShhLGMpe3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodEhlbHBlciI7dGhpcy5saWdodD1hO3RoaXMuY29sb3I9YzthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwtMSwwLDEsMSwwXSwzKSk7YS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtjPW5ldyBGYih7Zm9nOiExfSk7VmIuY2FsbCh0aGlzLGEsYyk7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzEsMSwwLC0xLDEsMCwtMSwtMSwwLAoxLDEsMCwtMSwtMSwwLDEsLTEsMF0sMykpO2EuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7dGhpcy5hZGQobmV3IHhhKGEsbmV3IEwoe3NpZGU6MSxmb2c6ITF9KSkpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gYWYoYSxjLGUpe0EuY2FsbCh0aGlzKTt0aGlzLmxpZ2h0PWE7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMubWF0cml4PWEubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuY29sb3I9ZTthPW5ldyBSZChjKTthLnJvdGF0ZVkoLjUqTWF0aC5QSSk7dGhpcy5tYXRlcmlhbD1uZXcgTCh7d2lyZWZyYW1lOiEwLGZvZzohMX0pO3ZvaWQgMD09PXRoaXMuY29sb3ImJih0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycz0yKTtjPWEuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2EuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKmMuY291bnQpLDMpKTt0aGlzLmFkZChuZXcgeGEoYSx0aGlzLm1hdGVyaWFsKSk7CnRoaXMudXBkYXRlKCl9ZnVuY3Rpb24gYmYoYSxjKXt0aGlzLmxpZ2h0UHJvYmU9YTt0aGlzLnNpemU9YzthPW5ldyBxYih7ZGVmaW5lczp7R0FNTUFfT1VUUFVUOiIifSx1bmlmb3Jtczp7c2g6e3ZhbHVlOnRoaXMubGlnaHRQcm9iZS5zaC5jb2VmZmljaWVudHN9LGludGVuc2l0eTp7dmFsdWU6dGhpcy5saWdodFByb2JlLmludGVuc2l0eX19LHZlcnRleFNoYWRlcjoidmFyeWluZyB2ZWMzIHZOb3JtYWw7XG52b2lkIG1haW4oKSB7XG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59IixmcmFnbWVudFNoYWRlcjoiI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2XG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgbm9ybWFsLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0Ly8gbWF0cml4IGlzIGFzc3VtZWQgdG8gYmUgb3J0aG9nb25hbFxuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIG5vcm1hbCwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgbGluZWFyVG9PdXRwdXQoIGluIHZlYzMgYSApIHtcblx0I2lmZGVmIEdBTU1BX09VVFBVVFxuXHRcdHJldHVybiBwb3coIGEsIHZlYzMoIDEuMCAvIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApICk7XG5cdCNlbHNlXG5cdFx0cmV0dXJuIGE7XG5cdCNlbmRpZlxufVxuLy8gc291cmNlOiBodHRwczovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9wYXBlcnMvZW52bWFwL2Vudm1hcC5wZGZcbnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7XG5cdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcblx0ZmxvYXQgeCBceDNkIG5vcm1hbC54LCB5IFx4M2Qgbm9ybWFsLnksIHogXHgzZCBub3JtYWwuejtcblx0Ly8gYmFuZCAwXG5cdHZlYzMgcmVzdWx0IFx4M2Qgc2hDb2VmZmljaWVudHNbIDAgXSAqIDAuODg2MjI3O1xuXHQvLyBiYW5kIDFcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0Ly8gYmFuZCAyXG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudW5pZm9ybSB2ZWMzIHNoWyA5IF07IC8vIHNoIGNvZWZmaWNpZW50c1xudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHk7IC8vIGxpZ2h0IHByb2JlIGludGVuc2l0eVxudmFyeWluZyB2ZWMzIHZOb3JtYWw7XG52b2lkIG1haW4oKSB7XG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2Qgc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBzaCApO1xuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCBSRUNJUFJPQ0FMX1BJICogaXJyYWRpYW5jZSAqIGludGVuc2l0eTtcblx0b3V0Z29pbmdMaWdodCBceDNkIGxpbmVhclRvT3V0cHV0KCBvdXRnb2luZ0xpZ2h0ICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIDEuMCApO1xufSJ9KTsKYz1uZXcgQmQoMSwzMiwxNik7eGEuY2FsbCh0aGlzLGMsYSk7dGhpcy5vbkJlZm9yZVJlbmRlcigpfWZ1bmN0aW9uIGNoKGEsYyxlLGcpe2E9YXx8MTA7Yz1jfHwxMDtlPW5ldyBJKHZvaWQgMCE9PWU/ZTo0NDczOTI0KTtnPW5ldyBJKHZvaWQgMCE9PWc/Zzo4OTQ3ODQ4KTt2YXIgcj1jLzIsdj1hL2Msej1hLzI7YT1bXTtmb3IodmFyIEU9W10sRj0wLEo9MCxQPS16O0Y8PWM7RisrLFArPXYpe2EucHVzaCgteiwwLFAseiwwLFApO2EucHVzaChQLDAsLXosUCwwLHopO3ZhciBSPUY9PT1yP2U6ZztSLnRvQXJyYXkoRSxKKTtKKz0zO1IudG9BcnJheShFLEopO0orPTM7Ui50b0FycmF5KEUsSik7Sis9MztSLnRvQXJyYXkoRSxKKTtKKz0zfWM9bmV3IHZhO2MuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGEsMykpO2MuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKEUsMykpO2U9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6Mn0pO0liLmNhbGwodGhpcyxjLGUpfWZ1bmN0aW9uIGRoKGEsCmMsZSxnLHIsdil7YT1hfHwxMDtjPWN8fDE2O2U9ZXx8ODtnPWd8fDY0O3I9bmV3IEkodm9pZCAwIT09cj9yOjQ0NzM5MjQpO3Y9bmV3IEkodm9pZCAwIT09dj92Ojg5NDc4NDgpO3ZhciB6PVtdLEU9W10sRjtmb3IoRj0wO0Y8PWM7RisrKXt2YXIgSj1GL2MqMipNYXRoLlBJO3ZhciBQPU1hdGguc2luKEopKmE7Sj1NYXRoLmNvcyhKKSphO3oucHVzaCgwLDAsMCk7ei5wdXNoKFAsMCxKKTt2YXIgUj1GJjE/cjp2O0UucHVzaChSLnIsUi5nLFIuYik7RS5wdXNoKFIucixSLmcsUi5iKX1mb3IoRj0wO0Y8PWU7RisrKXtSPUYmMT9yOnY7dmFyIFM9YS1hL2UqRjtmb3IoYz0wO2M8ZztjKyspSj1jL2cqMipNYXRoLlBJLFA9TWF0aC5zaW4oSikqUyxKPU1hdGguY29zKEopKlMsei5wdXNoKFAsMCxKKSxFLnB1c2goUi5yLFIuZyxSLmIpLEo9KGMrMSkvZyoyKk1hdGguUEksUD1NYXRoLnNpbihKKSpTLEo9TWF0aC5jb3MoSikqUyx6LnB1c2goUCwwLEopLEUucHVzaChSLnIsUi5nLFIuYil9YT0KbmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHosMykpO2EuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKEUsMykpO3o9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6Mn0pO0liLmNhbGwodGhpcyxhLHopfWZ1bmN0aW9uIGNmKGEsYyxlLGcpe3RoaXMuYXVkaW89YTt0aGlzLnJhbmdlPWN8fDE7dGhpcy5kaXZpc2lvbnNJbm5lckFuZ2xlPWV8fDE2O3RoaXMuZGl2aXNpb25zT3V0ZXJBbmdsZT1nfHwyO2E9bmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKigzKih0aGlzLmRpdmlzaW9uc0lubmVyQW5nbGUrMip0aGlzLmRpdmlzaW9uc091dGVyQW5nbGUpKzMpKSwzKSk7Yz1uZXcgRmIoe2NvbG9yOjY1MjgwfSk7ZT1uZXcgRmIoe2NvbG9yOjE2Nzc2OTYwfSk7VmIuY2FsbCh0aGlzLGEsW2UsY10pO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZWcoYSxjLGUsZyl7dGhpcy5vYmplY3Q9YTt0aGlzLnNpemU9dm9pZCAwIT09CmM/YzoxO2E9dm9pZCAwIT09ZT9lOjE2Nzc2OTYwO2c9dm9pZCAwIT09Zz9nOjE7Yz0wOyhlPXRoaXMub2JqZWN0Lmdlb21ldHJ5KSYmZS5pc0dlb21ldHJ5P2M9ZS5mYWNlcy5sZW5ndGg6Y29uc29sZS53YXJuKCJUSFJFRS5GYWNlTm9ybWFsc0hlbHBlcjogb25seSBUSFJFRS5HZW9tZXRyeSBpcyBzdXBwb3J0ZWQuIFVzZSBUSFJFRS5WZXJ0ZXhOb3JtYWxzSGVscGVyLCBpbnN0ZWFkLiIpO2U9bmV3IHZhO2M9bmV3IGNhKDYqYywzKTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGMpO0liLmNhbGwodGhpcyxlLG5ldyBGYih7Y29sb3I6YSxsaW5ld2lkdGg6Z30pKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBkZihhLGMsZSl7QS5jYWxsKHRoaXMpO3RoaXMubGlnaHQ9YTt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jb2xvcj1lOwp2b2lkIDA9PT1jJiYoYz0xKTthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbLWMsYywwLGMsYywwLGMsLWMsMCwtYywtYywwLC1jLGMsMF0sMykpO2M9bmV3IEZiKHtmb2c6ITF9KTt0aGlzLmxpZ2h0UGxhbmU9bmV3IFZiKGEsYyk7dGhpcy5hZGQodGhpcy5saWdodFBsYW5lKTthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMCwwLDAsMCwwLDFdLDMpKTt0aGlzLnRhcmdldExpbmU9bmV3IFZiKGEsYyk7dGhpcy5hZGQodGhpcy50YXJnZXRMaW5lKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGZnKGEpe2Z1bmN0aW9uIGMoVixXLGhhKXtlKFYsaGEpO2UoVyxoYSl9ZnVuY3Rpb24gZShWLFcpe3YucHVzaCgwLDAsMCk7ei5wdXNoKFcucixXLmcsVy5iKTt2b2lkIDA9PT1FW1ZdJiYoRVtWXT1bXSk7RVtWXS5wdXNoKHYubGVuZ3RoLzMtMSl9dmFyIGc9bmV3IHZhLHI9bmV3IEZiKHtjb2xvcjoxNjc3NzIxNSx2ZXJ0ZXhDb2xvcnM6MX0pLAp2PVtdLHo9W10sRT17fSxGPW5ldyBJKDE2NzU1MjAwKSxKPW5ldyBJKDE2NzExNjgwKSxQPW5ldyBJKDQzNzc1KSxSPW5ldyBJKDE2Nzc3MjE1KSxTPW5ldyBJKDMzNTU0NDMpO2MoIm4xIiwibjIiLEYpO2MoIm4yIiwibjQiLEYpO2MoIm40IiwibjMiLEYpO2MoIm4zIiwibjEiLEYpO2MoImYxIiwiZjIiLEYpO2MoImYyIiwiZjQiLEYpO2MoImY0IiwiZjMiLEYpO2MoImYzIiwiZjEiLEYpO2MoIm4xIiwiZjEiLEYpO2MoIm4yIiwiZjIiLEYpO2MoIm4zIiwiZjMiLEYpO2MoIm40IiwiZjQiLEYpO2MoInAiLCJuMSIsSik7YygicCIsIm4yIixKKTtjKCJwIiwibjMiLEopO2MoInAiLCJuNCIsSik7YygidTEiLCJ1MiIsUCk7YygidTIiLCJ1MyIsUCk7YygidTMiLCJ1MSIsUCk7YygiYyIsInQiLFIpO2MoInAiLCJjIixTKTtjKCJjbjEiLCJjbjIiLFMpO2MoImNuMyIsImNuNCIsUyk7YygiY2YxIiwiY2YyIixTKTtjKCJjZjMiLCJjZjQiLFMpO2cuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsCm5ldyBjYSh2LDMpKTtnLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBjYSh6LDMpKTtJYi5jYWxsKHRoaXMsZyxyKTt0aGlzLmNhbWVyYT1hO3RoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgmJnRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLnBvaW50TWFwPUU7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBQYihhLGMsZSxnLHIsdix6KXtlaC5zZXQocix2LHopLnVucHJvamVjdChnKTthPWNbYV07aWYodm9pZCAwIT09YSlmb3IoZT1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxjPTAsZz1hLmxlbmd0aDtjPGc7YysrKWUuc2V0WFlaKGFbY10sZWgueCxlaC55LGVoLnopfWZ1bmN0aW9uIGhkKGEsYyl7dGhpcy5vYmplY3Q9YTt2b2lkIDA9PT1jJiYoYz0xNjc3Njk2MCk7YT1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LAo0LDAsNCwxLDUsMiw2LDMsN10pO3ZhciBlPW5ldyBGbG9hdDMyQXJyYXkoMjQpLGc9bmV3IHZhO2cuc2V0SW5kZXgobmV3IFEoYSwxKSk7Zy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUShlLDMpKTtJYi5jYWxsKHRoaXMsZyxuZXcgRmIoe2NvbG9yOmN9KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZ2coYSxjKXt0aGlzLnR5cGU9IkJveDNIZWxwZXIiO3RoaXMuYm94PWE7Yz1jfHwxNjc3Njk2MDthPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKTt2YXIgZT1uZXcgdmE7ZS5zZXRJbmRleChuZXcgUShhLDEpKTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwtMSwtMSwxLC0xLC0xLC0xLC0xLDEsLTEsLTFdLDMpKTtJYi5jYWxsKHRoaXMsZSxuZXcgRmIoe2NvbG9yOmN9KSk7dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX0KZnVuY3Rpb24gaGcoYSxjLGUpe3RoaXMudHlwZT0iUGxhbmVIZWxwZXIiO3RoaXMucGxhbmU9YTt0aGlzLnNpemU9dm9pZCAwPT09Yz8xOmM7YT12b2lkIDAhPT1lP2U6MTY3NzY5NjA7Yz1uZXcgdmE7Yy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzEsLTEsMSwtMSwxLDEsLTEsLTEsMSwxLDEsMSwtMSwxLDEsLTEsLTEsMSwxLC0xLDEsMSwxLDEsMCwwLDEsMCwwLDBdLDMpKTtjLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1ZiLmNhbGwodGhpcyxjLG5ldyBGYih7Y29sb3I6YX0pKTtjPW5ldyB2YTtjLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsLTEsMSwxLC0xLDFdLDMpKTtjLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3RoaXMuYWRkKG5ldyB4YShjLG5ldyBMKHtjb2xvcjphLG9wYWNpdHk6LjIsdHJhbnNwYXJlbnQ6ITAsZGVwdGhXcml0ZTohMX0pKSl9ZnVuY3Rpb24gaWQoYSxjLGUsZyxyLHYpe0EuY2FsbCh0aGlzKTsKdm9pZCAwPT09YSYmKGE9bmV3IGsoMCwwLDEpKTt2b2lkIDA9PT1jJiYoYz1uZXcgaygwLDAsMCkpO3ZvaWQgMD09PWUmJihlPTEpO3ZvaWQgMD09PWcmJihnPTE2Nzc2OTYwKTt2b2lkIDA9PT1yJiYocj0uMiplKTt2b2lkIDA9PT12JiYodj0uMipyKTt2b2lkIDA9PT1maCYmKGZoPW5ldyB2YSxmaC5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzAsMCwwLDAsMSwwXSwzKSksdmk9bmV3IGZkKDAsLjUsMSw1LDEpLHZpLnRyYW5zbGF0ZSgwLC0uNSwwKSk7dGhpcy5wb3NpdGlvbi5jb3B5KGMpO3RoaXMubGluZT1uZXcgVmIoZmgsbmV3IEZiKHtjb2xvcjpnfSkpO3RoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuYWRkKHRoaXMubGluZSk7dGhpcy5jb25lPW5ldyB4YSh2aSxuZXcgTCh7Y29sb3I6Z30pKTt0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmFkZCh0aGlzLmNvbmUpO3RoaXMuc2V0RGlyZWN0aW9uKGEpO3RoaXMuc2V0TGVuZ3RoKGUsCnIsdil9ZnVuY3Rpb24gaWcoYSl7YT1hfHwxO3ZhciBjPVswLDAsMCxhLDAsMCwwLDAsMCwwLGEsMCwwLDAsMCwwLDAsYV07YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoYywzKSk7YS5hZGRBdHRyaWJ1dGUoImNvbG9yIixuZXcgY2EoWzEsMCwwLDEsLjYsMCwwLDEsMCwuNiwxLDAsMCwwLDEsMCwuNiwxXSwzKSk7Yz1uZXcgRmIoe3ZlcnRleENvbG9yczoyfSk7SWIuY2FsbCh0aGlzLGEsYyl9ZnVuY3Rpb24gWmooYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DbG9zZWRTcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTtaYi5jYWxsKHRoaXMsYSk7dGhpcy50eXBlPSJjYXRtdWxscm9tIjt0aGlzLmNsb3NlZD0hMH1mdW5jdGlvbiBhayhhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpOwpaYi5jYWxsKHRoaXMsYSk7dGhpcy50eXBlPSJjYXRtdWxscm9tIn1mdW5jdGlvbiB3aShhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwbGluZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpO1piLmNhbGwodGhpcyxhKTt0aGlzLnR5cGU9ImNhdG11bGxyb20ifXZvaWQgMD09PU51bWJlci5FUFNJTE9OJiYoTnVtYmVyLkVQU0lMT049TWF0aC5wb3coMiwtNTIpKTt2b2lkIDA9PT1OdW1iZXIuaXNJbnRlZ2VyJiYoTnVtYmVyLmlzSW50ZWdlcj1mdW5jdGlvbihhKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBhJiZpc0Zpbml0ZShhKSYmTWF0aC5mbG9vcihhKT09PWF9KTt2b2lkIDA9PT1NYXRoLnNpZ24mJihNYXRoLnNpZ249ZnVuY3Rpb24oYSl7cmV0dXJuIDA+YT8tMTowPGE/MTorYX0pOyExPT09Im5hbWUiaW4gRnVuY3Rpb24ucHJvdG90eXBlJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCJuYW1lIiwKe2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvblxzKihbXlwoXHNdKikvKVsxXX19KTt2b2lkIDA9PT1PYmplY3QuYXNzaWduJiYoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhKXtpZih2b2lkIDA9PT1hfHxudWxsPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIGM9T2JqZWN0KGEpLGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgZz1hcmd1bWVudHNbZV07aWYodm9pZCAwIT09ZyYmbnVsbCE9PWcpZm9yKHZhciByIGluIGcpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGcscikmJihjW3JdPWdbcl0pfXJldHVybiBjfSk7T2JqZWN0LmFzc2lnbihkLnByb3RvdHlwZSx7YWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PXRoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycz17fSk7dmFyIGU9CnRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1lW2FdJiYoZVthXT1bXSk7LTE9PT1lW2FdLmluZGV4T2YoYykmJmVbYV0ucHVzaChjKX0saGFzRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMD09PXRoaXMuX2xpc3RlbmVycylyZXR1cm4hMTt2YXIgZT10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIHZvaWQgMCE9PWVbYV0mJi0xIT09ZVthXS5pbmRleE9mKGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09dGhpcy5fbGlzdGVuZXJzJiYoYT10aGlzLl9saXN0ZW5lcnNbYV0sdm9pZCAwIT09YSYmKGM9YS5pbmRleE9mKGMpLC0xIT09YyYmYS5zcGxpY2UoYywxKSkpfSxkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGEpe2lmKHZvaWQgMCE9PXRoaXMuX2xpc3RlbmVycyl7dmFyIGM9dGhpcy5fbGlzdGVuZXJzW2EudHlwZV07aWYodm9pZCAwIT09Yyl7YS50YXJnZXQ9dGhpcztjPWMuc2xpY2UoMCk7Zm9yKHZhciBlPTAsZz1jLmxlbmd0aDtlPGc7ZSsrKWNbZV0uY2FsbCh0aGlzLAphKX19fX0pO2Zvcih2YXIgWWI9W10samc9MDsyNTY+amc7amcrKylZYltqZ109KDE2PmpnPyIwIjoiIikramcudG9TdHJpbmcoMTYpO3ZhciBoYj17REVHMlJBRDpNYXRoLlBJLzE4MCxSQUQyREVHOjE4MC9NYXRoLlBJLGdlbmVyYXRlVVVJRDpmdW5jdGlvbigpe3ZhciBhPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGM9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxnPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwO3JldHVybihZYlthJjI1NV0rWWJbYT4+OCYyNTVdK1liW2E+PjE2JjI1NV0rWWJbYT4+MjQmMjU1XSsiLSIrWWJbYyYyNTVdK1liW2M+PjgmMjU1XSsiLSIrWWJbYz4+MTYmMTV8NjRdK1liW2M+PjI0JjI1NV0rIi0iK1liW2UmNjN8MTI4XStZYltlPj44JjI1NV0rIi0iK1liW2U+PjE2JjI1NV0rWWJbZT4+MjQmMjU1XStZYltnJjI1NV0rWWJbZz4+OCYyNTVdK1liW2c+PjE2JjI1NV0rWWJbZz4+MjQmMjU1XSkudG9VcHBlckNhc2UoKX0sCmNsYW1wOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gTWF0aC5tYXgoYyxNYXRoLm1pbihlLGEpKX0sZXVjbGlkZWFuTW9kdWxvOmZ1bmN0aW9uKGEsYyl7cmV0dXJuKGElYytjKSVjfSxtYXBMaW5lYXI6ZnVuY3Rpb24oYSxjLGUsZyxyKXtyZXR1cm4gZysoYS1jKSooci1nKS8oZS1jKX0sbGVycDpmdW5jdGlvbihhLGMsZSl7cmV0dXJuKDEtZSkqYStlKmN9LHNtb290aHN0ZXA6ZnVuY3Rpb24oYSxjLGUpe2lmKGE8PWMpcmV0dXJuIDA7aWYoYT49ZSlyZXR1cm4gMTthPShhLWMpLyhlLWMpO3JldHVybiBhKmEqKDMtMiphKX0sc21vb3RoZXJzdGVwOmZ1bmN0aW9uKGEsYyxlKXtpZihhPD1jKXJldHVybiAwO2lmKGE+PWUpcmV0dXJuIDE7YT0oYS1jKS8oZS1jKTtyZXR1cm4gYSphKmEqKGEqKDYqYS0xNSkrMTApfSxyYW5kSW50OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGErTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihjLWErMSkpfSxyYW5kRmxvYXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYSsKTWF0aC5yYW5kb20oKSooYy1hKX0scmFuZEZsb2F0U3ByZWFkOmZ1bmN0aW9uKGEpe3JldHVybiBhKiguNS1NYXRoLnJhbmRvbSgpKX0sZGVnVG9SYWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEqaGIuREVHMlJBRH0scmFkVG9EZWc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEqaGIuUkFEMkRFR30saXNQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe3JldHVybiAwPT09KGEmYS0xKSYmMCE9PWF9LGNlaWxQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnBvdygyLE1hdGguY2VpbChNYXRoLmxvZyhhKS9NYXRoLkxOMikpfSxmbG9vclBvd2VyT2ZUd286ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhhKS9NYXRoLkxOMikpfX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZi5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy54PWF9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnl9LApzZXQ6ZnVuY3Rpb24oYSl7dGhpcy55PWF9fX0pO09iamVjdC5hc3NpZ24oZi5wcm90b3R5cGUse2lzVmVjdG9yMjohMCxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YTt0aGlzLnk9YztyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueT10aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihhKXt0aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihhKXt0aGlzLnk9YTtyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEsYyl7c3dpdGNoKGEpe2Nhc2UgMDp0aGlzLng9YzticmVhaztjYXNlIDE6dGhpcy55PWM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2EpO31yZXR1cm4gdGhpc30sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrCmEpO319LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMueD1hLng7dGhpcy55PWEueTtyZXR1cm4gdGhpc30sYWRkOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKGEsYyk7dGhpcy54Kz1hLng7dGhpcy55Kz1hLnk7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngrPWE7dGhpcy55Kz1hO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy54PWEueCtjLng7dGhpcy55PWEueStjLnk7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihhLGMpe3RoaXMueCs9YS54KmM7dGhpcy55Kz1hLnkqYztyZXR1cm4gdGhpc30sCnN1YjpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyhhLGMpO3RoaXMueC09YS54O3RoaXMueS09YS55O3JldHVybiB0aGlzfSxzdWJTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54LT1hO3RoaXMueS09YTtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngtYy54O3RoaXMueT1hLnktYy55O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhKXt0aGlzLngqPWEueDt0aGlzLnkqPWEueTtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hO3RoaXMueSo9YTtyZXR1cm4gdGhpc30sZGl2aWRlOmZ1bmN0aW9uKGEpe3RoaXMueC89YS54O3RoaXMueS89YS55O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYSl9LGFwcGx5TWF0cml4MzpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngsZT10aGlzLnk7YT1hLmVsZW1lbnRzO3RoaXMueD1hWzBdKmMrYVszXSplK2FbNl07dGhpcy55PWFbMV0qYythWzRdKmUrYVs3XTtyZXR1cm4gdGhpc30sbWluOmZ1bmN0aW9uKGEpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYS54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LGEueSk7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGEueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxhLnkpO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLngsTWF0aC5taW4oYy54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLnksTWF0aC5taW4oYy55LHRoaXMueSkpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEsTWF0aC5taW4oYywKdGhpcy55KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoZXx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYSxNYXRoLm1pbihjLGUpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3JldHVybiB0aGlzfSxjZWlsOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguY2VpbCh0aGlzLngpO3RoaXMueT1NYXRoLmNlaWwodGhpcy55KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpO3RoaXMueT1NYXRoLnJvdW5kKHRoaXMueSk7cmV0dXJuIHRoaXN9LHJvdW5kVG9aZXJvOmZ1bmN0aW9uKCl7dGhpcy54PTA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpOwpyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueCt0aGlzLnkqYS55fSxjcm9zczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueS10aGlzLnkqYS54fSxsZW5ndGhTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfSxhbmdsZTpmdW5jdGlvbigpe3ZhciBhPU1hdGguYXRhbjIodGhpcy55LHRoaXMueCk7MD5hJiYoYSs9MipNYXRoLlBJKTtyZXR1cm4gYX0sCmRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGEpKX0sZGlzdGFuY2VUb1NxdWFyZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LWEueDthPXRoaXMueS1hLnk7cmV0dXJuIGMqYythKmF9LG1hbmhhdHRhbkRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1hLngpK01hdGguYWJzKHRoaXMueS1hLnkpfSxzZXRMZW5ndGg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoYSl9LGxlcnA6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPShhLngtdGhpcy54KSpjO3RoaXMueSs9KGEueS10aGlzLnkpKmM7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGMsYSkubXVsdGlwbHlTY2FsYXIoZSkuYWRkKGEpfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueD09PXRoaXMueCYmYS55PT09dGhpcy55fSwKZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy54PWFbY107dGhpcy55PWFbYysxXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTthW2NdPXRoaXMueDthW2MrMV09dGhpcy55O3JldHVybiBhfSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTt0aGlzLng9YS5nZXRYKGMpO3RoaXMueT1hLmdldFkoYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZUFyb3VuZDpmdW5jdGlvbihhLGMpe3ZhciBlPU1hdGguY29zKGMpO2M9TWF0aC5zaW4oYyk7dmFyIGc9dGhpcy54LWEueCxyPXRoaXMueS1hLnk7dGhpcy54PWcqZS1yKmMrYS54O3RoaXMueT1nKmMrciplK2EueTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKGgsCntzbGVycDpmdW5jdGlvbihhLGMsZSxnKXtyZXR1cm4gZS5jb3B5KGEpLnNsZXJwKGMsZyl9LHNsZXJwRmxhdDpmdW5jdGlvbihhLGMsZSxnLHIsdix6KXt2YXIgRT1lW2crMF0sRj1lW2crMV0sSj1lW2crMl07ZT1lW2crM107Zz1yW3YrMF07dmFyIFA9clt2KzFdLFI9clt2KzJdO3I9clt2KzNdO2lmKGUhPT1yfHxFIT09Z3x8RiE9PVB8fEohPT1SKXt2PTEtejt2YXIgUz1FKmcrRipQK0oqUitlKnIsVj0wPD1TPzE6LTEsVz0xLVMqUztXPk51bWJlci5FUFNJTE9OJiYoVz1NYXRoLnNxcnQoVyksUz1NYXRoLmF0YW4yKFcsUypWKSx2PU1hdGguc2luKHYqUykvVyx6PU1hdGguc2luKHoqUykvVyk7Vio9ejtFPUUqditnKlY7Rj1GKnYrUCpWO0o9Sip2K1IqVjtlPWUqdityKlY7dj09PTEteiYmKHo9MS9NYXRoLnNxcnQoRSpFK0YqRitKKkorZSplKSxFKj16LEYqPXosSio9eixlKj16KX1hW2NdPUU7YVtjKzFdPUY7YVtjKzJdPUo7YVtjKzNdPWV9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaC5wcm90b3R5cGUsCnt4OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3k9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx6OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fen0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3o9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx3OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3c9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fX0pO09iamVjdC5hc3NpZ24oaC5wcm90b3R5cGUse2lzUXVhdGVybmlvbjohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5feD1hO3RoaXMuX3k9Yzt0aGlzLl96PWU7dGhpcy5fdz1nO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCwKdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YS54O3RoaXMuX3k9YS55O3RoaXMuX3o9YS56O3RoaXMuX3c9YS53O3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbUV1bGVyOmZ1bmN0aW9uKGEsYyl7aWYoIWF8fCFhLmlzRXVsZXIpdGhyb3cgRXJyb3IoIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3ZhciBlPWEuX3gsZz1hLl95LHI9YS5fejthPWEub3JkZXI7dmFyIHY9TWF0aC5jb3Msej1NYXRoLnNpbixFPXYoZS8yKSxGPXYoZy8yKTt2PXYoci8yKTtlPXooZS8yKTtnPXooZy8yKTtyPXooci8yKTsiWFlaIj09PWE/KHRoaXMuX3g9ZSpGKnYrRSpnKnIsdGhpcy5feT1FKmcqdi1lKkYqcix0aGlzLl96PUUqRipyK2UqZyp2LHRoaXMuX3c9RSpGKnYtZSpnKnIpOiJZWFoiPT09CmE/KHRoaXMuX3g9ZSpGKnYrRSpnKnIsdGhpcy5feT1FKmcqdi1lKkYqcix0aGlzLl96PUUqRipyLWUqZyp2LHRoaXMuX3c9RSpGKnYrZSpnKnIpOiJaWFkiPT09YT8odGhpcy5feD1lKkYqdi1FKmcqcix0aGlzLl95PUUqZyp2K2UqRipyLHRoaXMuX3o9RSpGKnIrZSpnKnYsdGhpcy5fdz1FKkYqdi1lKmcqcik6IlpZWCI9PT1hPyh0aGlzLl94PWUqRip2LUUqZypyLHRoaXMuX3k9RSpnKnYrZSpGKnIsdGhpcy5fej1FKkYqci1lKmcqdix0aGlzLl93PUUqRip2K2UqZypyKToiWVpYIj09PWE/KHRoaXMuX3g9ZSpGKnYrRSpnKnIsdGhpcy5feT1FKmcqditlKkYqcix0aGlzLl96PUUqRipyLWUqZyp2LHRoaXMuX3c9RSpGKnYtZSpnKnIpOiJYWlkiPT09YSYmKHRoaXMuX3g9ZSpGKnYtRSpnKnIsdGhpcy5feT1FKmcqdi1lKkYqcix0aGlzLl96PUUqRipyK2UqZyp2LHRoaXMuX3c9RSpGKnYrZSpnKnIpOyExIT09YyYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGEsCmMpe2MvPTI7dmFyIGU9TWF0aC5zaW4oYyk7dGhpcy5feD1hLngqZTt0aGlzLl95PWEueSplO3RoaXMuX3o9YS56KmU7dGhpcy5fdz1NYXRoLmNvcyhjKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbihhKXt2YXIgYz1hLmVsZW1lbnRzLGU9Y1swXTthPWNbNF07dmFyIGc9Y1s4XSxyPWNbMV0sdj1jWzVdLHo9Y1s5XSxFPWNbMl0sRj1jWzZdO2M9Y1sxMF07dmFyIEo9ZSt2K2M7MDxKPyhlPS41L01hdGguc3FydChKKzEpLHRoaXMuX3c9LjI1L2UsdGhpcy5feD0oRi16KSplLHRoaXMuX3k9KGctRSkqZSx0aGlzLl96PShyLWEpKmUpOmU+diYmZT5jPyhlPTIqTWF0aC5zcXJ0KDErZS12LWMpLHRoaXMuX3c9KEYteikvZSx0aGlzLl94PS4yNSplLHRoaXMuX3k9KGErcikvZSx0aGlzLl96PShnK0UpL2UpOnY+Yz8oZT0yKk1hdGguc3FydCgxK3YtZS1jKSx0aGlzLl93PShnLUUpL2UsdGhpcy5feD0oYStyKS9lLAp0aGlzLl95PS4yNSplLHRoaXMuX3o9KHorRikvZSk6KGU9MipNYXRoLnNxcnQoMStjLWUtdiksdGhpcy5fdz0oci1hKS9lLHRoaXMuX3g9KGcrRSkvZSx0aGlzLl95PSh6K0YpL2UsdGhpcy5fej0uMjUqZSk7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tVW5pdFZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLmRvdChjKSsxOzFFLTY+ZT8oZT0wLE1hdGguYWJzKGEueCk+TWF0aC5hYnMoYS56KT8odGhpcy5feD0tYS55LHRoaXMuX3k9YS54LHRoaXMuX3o9MCk6KHRoaXMuX3g9MCx0aGlzLl95PS1hLnosdGhpcy5fej1hLnkpKToodGhpcy5feD1hLnkqYy56LWEueipjLnksdGhpcy5feT1hLnoqYy54LWEueCpjLnosdGhpcy5fej1hLngqYy55LWEueSpjLngpO3RoaXMuX3c9ZTtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKX0sYW5nbGVUbzpmdW5jdGlvbihhKXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoaGIuY2xhbXAodGhpcy5kb3QoYSksLTEsCjEpKSl9LHJvdGF0ZVRvd2FyZHM6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmFuZ2xlVG8oYSk7aWYoMD09PWUpcmV0dXJuIHRoaXM7dGhpcy5zbGVycChhLE1hdGgubWluKDEsYy9lKSk7cmV0dXJuIHRoaXN9LGludmVyc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25qdWdhdGUoKX0sY29uanVnYXRlOmZ1bmN0aW9uKCl7dGhpcy5feCo9LTE7dGhpcy5feSo9LTE7dGhpcy5feio9LTE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3gqYS5feCt0aGlzLl95KmEuX3krdGhpcy5feiphLl96K3RoaXMuX3cqYS5fd30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feioKdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfSxub3JtYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmxlbmd0aCgpOzA9PT1hPyh0aGlzLl96PXRoaXMuX3k9dGhpcy5feD0wLHRoaXMuX3c9MSk6KGE9MS9hLHRoaXMuX3gqPWEsdGhpcy5feSo9YSx0aGlzLl96Kj1hLHRoaXMuX3cqPWEpO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdm9pZCAwIT09Yz8oY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoYSxjKSk6dGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsYSl9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoYSx0aGlzKX0sbXVsdGlwbHlRdWF0ZXJuaW9uczpmdW5jdGlvbihhLApjKXt2YXIgZT1hLl94LGc9YS5feSxyPWEuX3o7YT1hLl93O3ZhciB2PWMuX3gsej1jLl95LEU9Yy5fejtjPWMuX3c7dGhpcy5feD1lKmMrYSp2K2cqRS1yKno7dGhpcy5feT1nKmMrYSp6K3Iqdi1lKkU7dGhpcy5fej1yKmMrYSpFK2Uqei1nKnY7dGhpcy5fdz1hKmMtZSp2LWcqei1yKkU7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzbGVycDpmdW5jdGlvbihhLGMpe2lmKDA9PT1jKXJldHVybiB0aGlzO2lmKDE9PT1jKXJldHVybiB0aGlzLmNvcHkoYSk7dmFyIGU9dGhpcy5feCxnPXRoaXMuX3kscj10aGlzLl96LHY9dGhpcy5fdyx6PXYqYS5fdytlKmEuX3grZyphLl95K3IqYS5fejswPno/KHRoaXMuX3c9LWEuX3csdGhpcy5feD0tYS5feCx0aGlzLl95PS1hLl95LHRoaXMuX3o9LWEuX3osej0teik6dGhpcy5jb3B5KGEpO2lmKDE8PXopcmV0dXJuIHRoaXMuX3c9dix0aGlzLl94PWUsdGhpcy5feT1nLHRoaXMuX3o9cix0aGlzO2E9MS16Kno7aWYoYTw9TnVtYmVyLkVQU0lMT04pcmV0dXJuIHo9CjEtYyx0aGlzLl93PXoqditjKnRoaXMuX3csdGhpcy5feD16KmUrYyp0aGlzLl94LHRoaXMuX3k9eipnK2MqdGhpcy5feSx0aGlzLl96PXoqcitjKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpczthPU1hdGguc3FydChhKTt2YXIgRT1NYXRoLmF0YW4yKGEseik7ej1NYXRoLnNpbigoMS1jKSpFKS9hO2M9TWF0aC5zaW4oYypFKS9hO3RoaXMuX3c9dip6K3RoaXMuX3cqYzt0aGlzLl94PWUqeit0aGlzLl94KmM7dGhpcy5feT1nKnordGhpcy5feSpjO3RoaXMuX3o9cip6K3RoaXMuX3oqYzt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5feD09PXRoaXMuX3gmJmEuX3k9PT10aGlzLl95JiZhLl96PT09dGhpcy5feiYmYS5fdz09PXRoaXMuX3d9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMuX3g9YVtjXTt0aGlzLl95PWFbYysxXTsKdGhpcy5fej1hW2MrMl07dGhpcy5fdz1hW2MrM107dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO2FbY109dGhpcy5feDthW2MrMV09dGhpcy5feTthW2MrMl09dGhpcy5fejthW2MrM109dGhpcy5fdztyZXR1cm4gYX0sX29uQ2hhbmdlOmZ1bmN0aW9uKGEpe3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9YTtyZXR1cm4gdGhpc30sX29uQ2hhbmdlQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9fSk7dmFyIHhpPW5ldyBrLGJrPW5ldyBoO09iamVjdC5hc3NpZ24oay5wcm90b3R5cGUse2lzVmVjdG9yMzohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUpe3RoaXMueD1hO3RoaXMueT1jO3RoaXMuej1lO3JldHVybiB0aGlzfSxzZXRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy56PXRoaXMueT10aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihhKXt0aGlzLng9YTtyZXR1cm4gdGhpc30sCnNldFk6ZnVuY3Rpb24oYSl7dGhpcy55PWE7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYSl7dGhpcy56PWE7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudDpmdW5jdGlvbihhLGMpe3N3aXRjaChhKXtjYXNlIDA6dGhpcy54PWM7YnJlYWs7Y2FzZSAxOnRoaXMueT1jO2JyZWFrO2Nhc2UgMjp0aGlzLno9YzticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fXJldHVybiB0aGlzfSxnZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueil9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy54PWEueDt0aGlzLnk9YS55Owp0aGlzLno9YS56O3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnMoYSxjKTt0aGlzLngrPWEueDt0aGlzLnkrPWEueTt0aGlzLnorPWEuejtyZXR1cm4gdGhpc30sYWRkU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCs9YTt0aGlzLnkrPWE7dGhpcy56Kz1hO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy54PWEueCtjLng7dGhpcy55PWEueStjLnk7dGhpcy56PWEueitjLno7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihhLGMpe3RoaXMueCs9YS54KmM7dGhpcy55Kz1hLnkqYzt0aGlzLnorPWEueipjO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSwKdGhpcy5zdWJWZWN0b3JzKGEsYyk7dGhpcy54LT1hLng7dGhpcy55LT1hLnk7dGhpcy56LT1hLno7cmV0dXJuIHRoaXN9LHN1YlNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngtPWE7dGhpcy55LT1hO3RoaXMuei09YTtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngtYy54O3RoaXMueT1hLnktYy55O3RoaXMuej1hLnotYy56O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5VmVjdG9ycyhhLGMpO3RoaXMueCo9YS54O3RoaXMueSo9YS55O3RoaXMueio9YS56O3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngqPWE7dGhpcy55Kj1hO3RoaXMueio9CmE7cmV0dXJuIHRoaXN9LG11bHRpcGx5VmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngqYy54O3RoaXMueT1hLnkqYy55O3RoaXMuej1hLnoqYy56O3JldHVybiB0aGlzfSxhcHBseUV1bGVyOmZ1bmN0aW9uKGEpe2EmJmEuaXNFdWxlcnx8Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihiay5zZXRGcm9tRXVsZXIoYSkpfSxhcHBseUF4aXNBbmdsZTpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihiay5zZXRGcm9tQXhpc0FuZ2xlKGEsYykpfSxhcHBseU1hdHJpeDM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbM10qZSthWzZdKmc7dGhpcy55PWFbMV0qYythWzRdKmUrYVs3XSoKZzt0aGlzLno9YVsyXSpjK2FbNV0qZSthWzhdKmc7cmV0dXJuIHRoaXN9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngsZT10aGlzLnksZz10aGlzLno7YT1hLmVsZW1lbnRzO3ZhciByPTEvKGFbM10qYythWzddKmUrYVsxMV0qZythWzE1XSk7dGhpcy54PShhWzBdKmMrYVs0XSplK2FbOF0qZythWzEyXSkqcjt0aGlzLnk9KGFbMV0qYythWzVdKmUrYVs5XSpnK2FbMTNdKSpyO3RoaXMuej0oYVsyXSpjK2FbNl0qZSthWzEwXSpnK2FbMTRdKSpyO3JldHVybiB0aGlzfSxhcHBseVF1YXRlcm5pb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56LHI9YS54LHY9YS55LHo9YS56O2E9YS53O3ZhciBFPWEqYyt2KmcteiplLEY9YSplK3oqYy1yKmcsSj1hKmcrciplLXYqYztjPS1yKmMtdiplLXoqZzt0aGlzLng9RSphK2MqLXIrRiotei1KKi12O3RoaXMueT1GKmErYyotditKKi1yLUUqLXo7dGhpcy56PUoqYStjKi16K0UqLXYtRiotcjtyZXR1cm4gdGhpc30sCnByb2plY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQoYS5wcm9qZWN0aW9uTWF0cml4KX0sdW5wcm9qZWN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKS5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCl9LHRyYW5zZm9ybURpcmVjdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngsZT10aGlzLnksZz10aGlzLno7YT1hLmVsZW1lbnRzO3RoaXMueD1hWzBdKmMrYVs0XSplK2FbOF0qZzt0aGlzLnk9YVsxXSpjK2FbNV0qZSthWzldKmc7dGhpcy56PWFbMl0qYythWzZdKmUrYVsxMF0qZztyZXR1cm4gdGhpcy5ub3JtYWxpemUoKX0sZGl2aWRlOmZ1bmN0aW9uKGEpe3RoaXMueC89YS54O3RoaXMueS89YS55O3RoaXMuei89YS56O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYSl9LG1pbjpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5taW4odGhpcy54LGEueCk7dGhpcy55PU1hdGgubWluKHRoaXMueSxhLnkpO3RoaXMuej1NYXRoLm1pbih0aGlzLnosYS56KTtyZXR1cm4gdGhpc30sbWF4OmZ1bmN0aW9uKGEpe3RoaXMueD1NYXRoLm1heCh0aGlzLngsYS54KTt0aGlzLnk9TWF0aC5tYXgodGhpcy55LGEueSk7dGhpcy56PU1hdGgubWF4KHRoaXMueixhLnopO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLngsTWF0aC5taW4oYy54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLnksTWF0aC5taW4oYy55LHRoaXMueSkpO3RoaXMuej1NYXRoLm1heChhLnosTWF0aC5taW4oYy56LHRoaXMueikpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEsTWF0aC5taW4oYyx0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYSwKTWF0aC5taW4oYyx0aGlzLnopKTtyZXR1cm4gdGhpc30sY2xhbXBMZW5ndGg6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihlfHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heChhLE1hdGgubWluKGMsZSkpKX0sZmxvb3I6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT1NYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PU1hdGguZmxvb3IodGhpcy56KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7dGhpcy56PU1hdGguY2VpbCh0aGlzLnopO3JldHVybiB0aGlzfSxyb3VuZDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLnJvdW5kKHRoaXMueCk7dGhpcy55PU1hdGgucm91bmQodGhpcy55KTt0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopO3JldHVybiB0aGlzfSxyb3VuZFRvWmVybzpmdW5jdGlvbigpe3RoaXMueD0KMD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PTA+dGhpcy56P01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KTtyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7dGhpcy56PS10aGlzLno7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueCt0aGlzLnkqYS55K3RoaXMueiphLnp9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KSsKTWF0aC5hYnModGhpcy56KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfSxzZXRMZW5ndGg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoYSl9LGxlcnA6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPShhLngtdGhpcy54KSpjO3RoaXMueSs9KGEueS10aGlzLnkpKmM7dGhpcy56Kz0oYS56LXRoaXMueikqYztyZXR1cm4gdGhpc30sbGVycFZlY3RvcnM6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiB0aGlzLnN1YlZlY3RvcnMoYyxhKS5tdWx0aXBseVNjYWxhcihlKS5hZGQoYSl9LGNyb3NzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHZvaWQgMCE9PWM/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmNyb3NzVmVjdG9ycyhhLGMpKTp0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLAphKX0sY3Jvc3NWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS54LGc9YS55O2E9YS56O3ZhciByPWMueCx2PWMueTtjPWMuejt0aGlzLng9ZypjLWEqdjt0aGlzLnk9YSpyLWUqYzt0aGlzLno9ZSp2LWcqcjtyZXR1cm4gdGhpc30scHJvamVjdE9uVmVjdG9yOmZ1bmN0aW9uKGEpe3ZhciBjPWEuZG90KHRoaXMpL2EubGVuZ3RoU3EoKTtyZXR1cm4gdGhpcy5jb3B5KGEpLm11bHRpcGx5U2NhbGFyKGMpfSxwcm9qZWN0T25QbGFuZTpmdW5jdGlvbihhKXt4aS5jb3B5KHRoaXMpLnByb2plY3RPblZlY3RvcihhKTtyZXR1cm4gdGhpcy5zdWIoeGkpfSxyZWZsZWN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN1Yih4aS5jb3B5KGEpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QoYSkpKX0sYW5nbGVUbzpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5hY29zKGhiLmNsYW1wKHRoaXMuZG90KGEpL01hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqYS5sZW5ndGhTcSgpKSwtMSwxKSl9LGRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGEpKX0sCmRpc3RhbmNlVG9TcXVhcmVkOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueC1hLngsZT10aGlzLnktYS55O2E9dGhpcy56LWEuejtyZXR1cm4gYypjK2UqZSthKmF9LG1hbmhhdHRhbkRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1hLngpK01hdGguYWJzKHRoaXMueS1hLnkpK01hdGguYWJzKHRoaXMuei1hLnopfSxzZXRGcm9tU3BoZXJpY2FsOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHMoYS5yYWRpdXMsYS5waGksYS50aGV0YSl9LHNldEZyb21TcGhlcmljYWxDb29yZHM6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPU1hdGguc2luKGMpKmE7dGhpcy54PWcqTWF0aC5zaW4oZSk7dGhpcy55PU1hdGguY29zKGMpKmE7dGhpcy56PWcqTWF0aC5jb3MoZSk7cmV0dXJuIHRoaXN9LHNldEZyb21DeWxpbmRyaWNhbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoYS5yYWRpdXMsYS50aGV0YSwKYS55KX0sc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLng9YSpNYXRoLnNpbihjKTt0aGlzLnk9ZTt0aGlzLno9YSpNYXRoLmNvcyhjKTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2E9YS5lbGVtZW50czt0aGlzLng9YVsxMl07dGhpcy55PWFbMTNdO3RoaXMuej1hWzE0XTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeFNjYWxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihhLDApLmxlbmd0aCgpLGU9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsMSkubGVuZ3RoKCk7YT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oYSwyKS5sZW5ndGgoKTt0aGlzLng9Yzt0aGlzLnk9ZTt0aGlzLno9YTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeENvbHVtbjpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmZyb21BcnJheShhLmVsZW1lbnRzLDQqYyl9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS54PT09CnRoaXMueCYmYS55PT09dGhpcy55JiZhLno9PT10aGlzLnp9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMueD1hW2NdO3RoaXMueT1hW2MrMV07dGhpcy56PWFbYysyXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTthW2NdPXRoaXMueDthW2MrMV09dGhpcy55O2FbYysyXT10aGlzLno7cmV0dXJuIGF9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe3ZvaWQgMCE9PWUmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3RoaXMueD1hLmdldFgoYyk7dGhpcy55PWEuZ2V0WShjKTt0aGlzLno9YS5nZXRaKGMpO3JldHVybiB0aGlzfX0pO3ZhciBlZT1uZXcgaztPYmplY3QuYXNzaWduKHQucHJvdG90eXBlLHtpc01hdHJpeDM6ITAsc2V0OmZ1bmN0aW9uKGEsCmMsZSxnLHIsdix6LEUsRil7dmFyIEo9dGhpcy5lbGVtZW50cztKWzBdPWE7SlsxXT1nO0pbMl09ejtKWzNdPWM7Sls0XT1yO0pbNV09RTtKWzZdPWU7Sls3XT12O0pbOF09RjtyZXR1cm4gdGhpc30saWRlbnRpdHk6ZnVuY3Rpb24oKXt0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Y1swXT1hWzBdO2NbMV09YVsxXTtjWzJdPWFbMl07Y1szXT1hWzNdO2NbNF09YVs0XTtjWzVdPWFbNV07Y1s2XT1hWzZdO2NbN109YVs3XTtjWzhdPWFbOF07cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXg0OmZ1bmN0aW9uKGEpe2E9YS5lbGVtZW50czt0aGlzLnNldChhWzBdLGFbNF0sYVs4XSxhWzFdLGFbNV0sYVs5XSxhWzJdLGFbNl0sYVsxMF0pO3JldHVybiB0aGlzfSwKYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MCxlPWEuY291bnQ7YzxlO2MrKyllZS54PWEuZ2V0WChjKSxlZS55PWEuZ2V0WShjKSxlZS56PWEuZ2V0WihjKSxlZS5hcHBseU1hdHJpeDModGhpcyksYS5zZXRYWVooYyxlZS54LGVlLnksZWUueik7cmV0dXJuIGF9LG11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyxhKX0scHJlbXVsdGlwbHk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyhhLHRoaXMpfSxtdWx0aXBseU1hdHJpY2VzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5lbGVtZW50cyxnPWMuZWxlbWVudHM7Yz10aGlzLmVsZW1lbnRzO2E9ZVswXTt2YXIgcj1lWzNdLHY9ZVs2XSx6PWVbMV0sRT1lWzRdLEY9ZVs3XSxKPWVbMl0sUD1lWzVdO2U9ZVs4XTt2YXIgUj1nWzBdLFM9Z1szXSxWPWdbNl0sVz1nWzFdLGhhPWdbNF0sZmE9Z1s3XSxyYT1nWzJdLHBhPWdbNV07Zz1nWzhdOwpjWzBdPWEqUityKlcrdipyYTtjWzNdPWEqUytyKmhhK3YqcGE7Y1s2XT1hKlYrcipmYSt2Kmc7Y1sxXT16KlIrRSpXK0YqcmE7Y1s0XT16KlMrRSpoYStGKnBhO2NbN109eipWK0UqZmErRipnO2NbMl09SipSK1AqVytlKnJhO2NbNV09SipTK1AqaGErZSpwYTtjWzhdPUoqVitQKmZhK2UqZztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50cztjWzBdKj1hO2NbM10qPWE7Y1s2XSo9YTtjWzFdKj1hO2NbNF0qPWE7Y1s3XSo9YTtjWzJdKj1hO2NbNV0qPWE7Y1s4XSo9YTtyZXR1cm4gdGhpc30sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzLGM9YVswXSxlPWFbMV0sZz1hWzJdLHI9YVszXSx2PWFbNF0sej1hWzVdLEU9YVs2XSxGPWFbN107YT1hWzhdO3JldHVybiBjKnYqYS1jKnoqRi1lKnIqYStlKnoqRStnKnIqRi1nKnYqRX0sZ2V0SW52ZXJzZTpmdW5jdGlvbihhLGMpe2EmJmEuaXNNYXRyaXg0JiYKY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LiIpO3ZhciBlPWEuZWxlbWVudHM7YT10aGlzLmVsZW1lbnRzO3ZhciBnPWVbMF0scj1lWzFdLHY9ZVsyXSx6PWVbM10sRT1lWzRdLEY9ZVs1XSxKPWVbNl0sUD1lWzddO2U9ZVs4XTt2YXIgUj1lKkUtRipQLFM9RipKLWUqeixWPVAqei1FKkosVz1nKlIrcipTK3YqVjtpZigwPT09Vyl7aWYoITA9PT1jKXRocm93IEVycm9yKCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO3JldHVybiB0aGlzLmlkZW50aXR5KCl9Yz0xL1c7YVswXT1SKmM7YVsxXT0odipQLWUqcikqYzthWzJdPShGKnItdipFKSpjO2FbM109UypjO2FbNF09CihlKmctdipKKSpjO2FbNV09KHYqei1GKmcpKmM7YVs2XT1WKmM7YVs3XT0ocipKLVAqZykqYzthWzhdPShFKmctcip6KSpjO3JldHVybiB0aGlzfSx0cmFuc3Bvc2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzO3ZhciBjPWFbMV07YVsxXT1hWzNdO2FbM109YztjPWFbMl07YVsyXT1hWzZdO2FbNl09YztjPWFbNV07YVs1XT1hWzddO2FbN109YztyZXR1cm4gdGhpc30sZ2V0Tm9ybWFsTWF0cml4OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KGEpLmdldEludmVyc2UodGhpcykudHJhbnNwb3NlKCl9LHRyYW5zcG9zZUludG9BcnJheTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2FbMF09Y1swXTthWzFdPWNbM107YVsyXT1jWzZdO2FbM109Y1sxXTthWzRdPWNbNF07YVs1XT1jWzddO2FbNl09Y1syXTthWzddPWNbNV07YVs4XT1jWzhdO3JldHVybiB0aGlzfSxzZXRVdlRyYW5zZm9ybTpmdW5jdGlvbihhLGMsZSxnLHIsdix6KXt2YXIgRT0KTWF0aC5jb3Mocik7cj1NYXRoLnNpbihyKTt0aGlzLnNldChlKkUsZSpyLC1lKihFKnYrcip6KSt2K2EsLWcqcixnKkUsLWcqKC1yKnYrRSp6KSt6K2MsMCwwLDEpfSxzY2FsZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZWxlbWVudHM7ZVswXSo9YTtlWzNdKj1hO2VbNl0qPWE7ZVsxXSo9YztlWzRdKj1jO2VbN10qPWM7cmV0dXJuIHRoaXN9LHJvdGF0ZTpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3ZhciBlPXRoaXMuZWxlbWVudHMsZz1lWzBdLHI9ZVszXSx2PWVbNl0sej1lWzFdLEU9ZVs0XSxGPWVbN107ZVswXT1jKmcrYSp6O2VbM109YypyK2EqRTtlWzZdPWMqdithKkY7ZVsxXT0tYSpnK2MqejtlWzRdPS1hKnIrYypFO2VbN109LWEqditjKkY7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZWxlbWVudHM7ZVswXSs9YSplWzJdO2VbM10rPWEqZVs1XTtlWzZdKz1hKmVbOF07ZVsxXSs9YyplWzJdO2VbNF0rPQpjKmVbNV07ZVs3XSs9YyplWzhdO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Zm9yKHZhciBlPTA7OT5lO2UrKylpZihjW2VdIT09YVtlXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmVsZW1lbnRzW2VdPWFbZStjXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTt2YXIgZT10aGlzLmVsZW1lbnRzO2FbY109ZVswXTthW2MrMV09ZVsxXTthW2MrMl09ZVsyXTthW2MrM109ZVszXTthW2MrNF09ZVs0XTthW2MrNV09ZVs1XTthW2MrNl09ZVs2XTthW2MrN109ZVs3XTthW2MrOF09ZVs4XTtyZXR1cm4gYX19KTt2YXIgZWYsRGQ9e2dldERhdGFVUkw6ZnVuY3Rpb24oYSl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudClyZXR1cm4gYS5zcmM7CmlmKCEoYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSl7dm9pZCAwPT09ZWYmJihlZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKSk7ZWYud2lkdGg9YS53aWR0aDtlZi5oZWlnaHQ9YS5oZWlnaHQ7dmFyIGM9ZWYuZ2V0Q29udGV4dCgiMmQiKTthIGluc3RhbmNlb2YgSW1hZ2VEYXRhP2MucHV0SW1hZ2VEYXRhKGEsMCwwKTpjLmRyYXdJbWFnZShhLDAsMCxhLndpZHRoLGEuaGVpZ2h0KTthPWVmfXJldHVybiAyMDQ4PGEud2lkdGh8fDIwNDg8YS5oZWlnaHQ/YS50b0RhdGFVUkwoImltYWdlL2pwZWciLC42KTphLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9fSxOaz0wO2wuREVGQVVMVF9JTUFHRT12b2lkIDA7bC5ERUZBVUxUX01BUFBJTkc9MzAwO2wucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmwsaXNUZXh0dXJlOiEwLHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsCnRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWEubmFtZTt0aGlzLmltYWdlPWEuaW1hZ2U7dGhpcy5taXBtYXBzPWEubWlwbWFwcy5zbGljZSgwKTt0aGlzLm1hcHBpbmc9YS5tYXBwaW5nO3RoaXMud3JhcFM9YS53cmFwUzt0aGlzLndyYXBUPWEud3JhcFQ7dGhpcy5tYWdGaWx0ZXI9YS5tYWdGaWx0ZXI7dGhpcy5taW5GaWx0ZXI9YS5taW5GaWx0ZXI7dGhpcy5hbmlzb3Ryb3B5PWEuYW5pc290cm9weTt0aGlzLmZvcm1hdD1hLmZvcm1hdDt0aGlzLnR5cGU9YS50eXBlO3RoaXMub2Zmc2V0LmNvcHkoYS5vZmZzZXQpO3RoaXMucmVwZWF0LmNvcHkoYS5yZXBlYXQpO3RoaXMuY2VudGVyLmNvcHkoYS5jZW50ZXIpO3RoaXMucm90YXRpb249CmEucm90YXRpb247dGhpcy5tYXRyaXhBdXRvVXBkYXRlPWEubWF0cml4QXV0b1VwZGF0ZTt0aGlzLm1hdHJpeC5jb3B5KGEubWF0cml4KTt0aGlzLmdlbmVyYXRlTWlwbWFwcz1hLmdlbmVyYXRlTWlwbWFwczt0aGlzLnByZW11bHRpcGx5QWxwaGE9YS5wcmVtdWx0aXBseUFscGhhO3RoaXMuZmxpcFk9YS5mbGlwWTt0aGlzLnVucGFja0FsaWdubWVudD1hLnVucGFja0FsaWdubWVudDt0aGlzLmVuY29kaW5nPWEuZW5jb2Rpbmc7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXt2YXIgYz12b2lkIDA9PT1hfHwic3RyaW5nIj09PXR5cGVvZiBhO2lmKCFjJiZ2b2lkIDAhPT1hLnRleHR1cmVzW3RoaXMudXVpZF0pcmV0dXJuIGEudGV4dHVyZXNbdGhpcy51dWlkXTt2YXIgZT17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxtYXBwaW5nOnRoaXMubWFwcGluZywKcmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCx0eXBlOnRoaXMudHlwZSxlbmNvZGluZzp0aGlzLmVuY29kaW5nLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxwcmVtdWx0aXBseUFscGhhOnRoaXMucHJlbXVsdGlwbHlBbHBoYSx1bnBhY2tBbGlnbm1lbnQ6dGhpcy51bnBhY2tBbGlnbm1lbnR9O2lmKHZvaWQgMCE9PXRoaXMuaW1hZ2Upe3ZhciBnPXRoaXMuaW1hZ2U7dm9pZCAwPT09Zy51dWlkJiYoZy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpKTtpZighYyYmdm9pZCAwPT09YS5pbWFnZXNbZy51dWlkXSl7aWYoQXJyYXkuaXNBcnJheShnKSl7dmFyIHI9CltdO2Zvcih2YXIgdj0wLHo9Zy5sZW5ndGg7djx6O3YrKylyLnB1c2goRGQuZ2V0RGF0YVVSTChnW3ZdKSl9ZWxzZSByPURkLmdldERhdGFVUkwoZyk7YS5pbWFnZXNbZy51dWlkXT17dXVpZDpnLnV1aWQsdXJsOnJ9fWUuaW1hZ2U9Zy51dWlkfWN8fChhLnRleHR1cmVzW3RoaXMudXVpZF09ZSk7cmV0dXJuIGV9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9LHRyYW5zZm9ybVV2OmZ1bmN0aW9uKGEpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gYTthLmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCk7aWYoMD5hLnh8fDE8YS54KXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFFMzphLngtPU1hdGguZmxvb3IoYS54KTticmVhaztjYXNlIDEwMDE6YS54PTA+YS54PzA6MTticmVhaztjYXNlIDEwMDI6YS54PTE9PT1NYXRoLmFicyhNYXRoLmZsb29yKGEueCklMik/TWF0aC5jZWlsKGEueCktYS54OmEueC1NYXRoLmZsb29yKGEueCl9aWYoMD4KYS55fHwxPGEueSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxRTM6YS55LT1NYXRoLmZsb29yKGEueSk7YnJlYWs7Y2FzZSAxMDAxOmEueT0wPmEueT8wOjE7YnJlYWs7Y2FzZSAxMDAyOmEueT0xPT09TWF0aC5hYnMoTWF0aC5mbG9vcihhLnkpJTIpP01hdGguY2VpbChhLnkpLWEueTphLnktTWF0aC5mbG9vcihhLnkpfXRoaXMuZmxpcFkmJihhLnk9MS1hLnkpO3JldHVybiBhfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShsLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYSl7ITA9PT1hJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwLnByb3RvdHlwZSx7d2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnp9LHNldDpmdW5jdGlvbihhKXt0aGlzLno9YX19LGhlaWdodDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMudz1hfX19KTtPYmplY3QuYXNzaWduKHAucHJvdG90eXBlLAp7aXNWZWN0b3I0OiEwLHNldDpmdW5jdGlvbihhLGMsZSxnKXt0aGlzLng9YTt0aGlzLnk9Yzt0aGlzLno9ZTt0aGlzLnc9ZztyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMudz10aGlzLno9dGhpcy55PXRoaXMueD1hO3JldHVybiB0aGlzfSxzZXRYOmZ1bmN0aW9uKGEpe3RoaXMueD1hO3JldHVybiB0aGlzfSxzZXRZOmZ1bmN0aW9uKGEpe3RoaXMueT1hO3JldHVybiB0aGlzfSxzZXRaOmZ1bmN0aW9uKGEpe3RoaXMuej1hO3JldHVybiB0aGlzfSxzZXRXOmZ1bmN0aW9uKGEpe3RoaXMudz1hO3JldHVybiB0aGlzfSxzZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSxjKXtzd2l0Y2goYSl7Y2FzZSAwOnRoaXMueD1jO2JyZWFrO2Nhc2UgMTp0aGlzLnk9YzticmVhaztjYXNlIDI6dGhpcy56PWM7YnJlYWs7Y2FzZSAzOnRoaXMudz1jO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9cmV0dXJuIHRoaXN9LGdldENvbXBvbmVudDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAwOnJldHVybiB0aGlzLng7CmNhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMueD1hLng7dGhpcy55PWEueTt0aGlzLno9YS56O3RoaXMudz12b2lkIDAhPT1hLnc/YS53OjE7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyhhLGMpO3RoaXMueCs9YS54O3RoaXMueSs9YS55O3RoaXMueis9YS56O3RoaXMudys9YS53O3JldHVybiB0aGlzfSwKYWRkU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCs9YTt0aGlzLnkrPWE7dGhpcy56Kz1hO3RoaXMudys9YTtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngrYy54O3RoaXMueT1hLnkrYy55O3RoaXMuej1hLnorYy56O3RoaXMudz1hLncrYy53O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPWEueCpjO3RoaXMueSs9YS55KmM7dGhpcy56Kz1hLnoqYzt0aGlzLncrPWEudypjO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnMoYSxjKTt0aGlzLngtPWEueDt0aGlzLnktPWEueTt0aGlzLnotPWEuejt0aGlzLnctPWEudztyZXR1cm4gdGhpc30sc3ViU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueC09CmE7dGhpcy55LT1hO3RoaXMuei09YTt0aGlzLnctPWE7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54LWMueDt0aGlzLnk9YS55LWMueTt0aGlzLno9YS56LWMuejt0aGlzLnc9YS53LWMudztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hO3RoaXMueSo9YTt0aGlzLnoqPWE7dGhpcy53Kj1hO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56LHI9dGhpcy53O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbNF0qZSthWzhdKmcrYVsxMl0qcjt0aGlzLnk9YVsxXSpjK2FbNV0qZSthWzldKmcrYVsxM10qcjt0aGlzLno9YVsyXSpjK2FbNl0qZSthWzEwXSpnK2FbMTRdKnI7dGhpcy53PWFbM10qYythWzddKmUrYVsxMV0qZythWzE1XSpyO3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYSl9LHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3RoaXMudz0yKk1hdGguYWNvcyhhLncpO3ZhciBjPU1hdGguc3FydCgxLWEudyphLncpOzFFLTQ+Yz8odGhpcy54PTEsdGhpcy56PXRoaXMueT0wKToodGhpcy54PWEueC9jLHRoaXMueT1hLnkvYyx0aGlzLno9YS56L2MpO3JldHVybiB0aGlzfSxzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXg6ZnVuY3Rpb24oYSl7YT1hLmVsZW1lbnRzO3ZhciBjPWFbMF07dmFyIGU9YVs0XTt2YXIgZz1hWzhdLHI9YVsxXSx2PWFbNV0sej1hWzldO3ZhciBFPWFbMl07dmFyIEY9YVs2XTt2YXIgSj1hWzEwXTtpZiguMDE+TWF0aC5hYnMoZS1yKSYmLjAxPk1hdGguYWJzKGctRSkmJi4wMT5NYXRoLmFicyh6LUYpKXtpZiguMT5NYXRoLmFicyhlK3IpJiYuMT5NYXRoLmFicyhnK0UpJiYuMT5NYXRoLmFicyh6K0YpJiYuMT5NYXRoLmFicyhjK3YrSi0zKSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpczthPU1hdGguUEk7CmM9KGMrMSkvMjt2PSh2KzEpLzI7Sj0oSisxKS8yO2U9KGUrcikvNDtnPShnK0UpLzQ7ej0oeitGKS80O2M+diYmYz5KPy4wMT5jPyhGPTAsZT1FPS43MDcxMDY3ODEpOihGPU1hdGguc3FydChjKSxFPWUvRixlPWcvRik6dj5KPy4wMT52PyhGPS43MDcxMDY3ODEsRT0wLGU9LjcwNzEwNjc4MSk6KEU9TWF0aC5zcXJ0KHYpLEY9ZS9FLGU9ei9FKTouMDE+Sj8oRT1GPS43MDcxMDY3ODEsZT0wKTooZT1NYXRoLnNxcnQoSiksRj1nL2UsRT16L2UpO3RoaXMuc2V0KEYsRSxlLGEpO3JldHVybiB0aGlzfWE9TWF0aC5zcXJ0KChGLXopKihGLXopKyhnLUUpKihnLUUpKyhyLWUpKihyLWUpKTsuMDAxPk1hdGguYWJzKGEpJiYoYT0xKTt0aGlzLng9KEYteikvYTt0aGlzLnk9KGctRSkvYTt0aGlzLno9KHItZSkvYTt0aGlzLnc9TWF0aC5hY29zKChjK3YrSi0xKS8yKTtyZXR1cm4gdGhpc30sbWluOmZ1bmN0aW9uKGEpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYS54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LAphLnkpO3RoaXMuej1NYXRoLm1pbih0aGlzLnosYS56KTt0aGlzLnc9TWF0aC5taW4odGhpcy53LGEudyk7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGEueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxhLnkpO3RoaXMuej1NYXRoLm1heCh0aGlzLnosYS56KTt0aGlzLnc9TWF0aC5tYXgodGhpcy53LGEudyk7cmV0dXJuIHRoaXN9LGNsYW1wOmZ1bmN0aW9uKGEsYyl7dGhpcy54PU1hdGgubWF4KGEueCxNYXRoLm1pbihjLngsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEueSxNYXRoLm1pbihjLnksdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGEueixNYXRoLm1pbihjLnosdGhpcy56KSk7dGhpcy53PU1hdGgubWF4KGEudyxNYXRoLm1pbihjLncsdGhpcy53KSk7cmV0dXJuIHRoaXN9LGNsYW1wU2NhbGFyOmZ1bmN0aW9uKGEsYyl7dGhpcy54PU1hdGgubWF4KGEsTWF0aC5taW4oYyx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYSxNYXRoLm1pbihjLAp0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMueikpO3RoaXMudz1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy53KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoZXx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYSxNYXRoLm1pbihjLGUpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej1NYXRoLmZsb29yKHRoaXMueik7dGhpcy53PU1hdGguZmxvb3IodGhpcy53KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7dGhpcy56PU1hdGguY2VpbCh0aGlzLnopO3RoaXMudz1NYXRoLmNlaWwodGhpcy53KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9Ck1hdGgucm91bmQodGhpcy54KTt0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpO3RoaXMuej1NYXRoLnJvdW5kKHRoaXMueik7dGhpcy53PU1hdGgucm91bmQodGhpcy53KTtyZXR1cm4gdGhpc30scm91bmRUb1plcm86ZnVuY3Rpb24oKXt0aGlzLng9MD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PTA+dGhpcy56P01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KTt0aGlzLnc9MD50aGlzLnc/TWF0aC5jZWlsKHRoaXMudyk6TWF0aC5mbG9vcih0aGlzLncpO3JldHVybiB0aGlzfSxuZWdhdGU6ZnVuY3Rpb24oKXt0aGlzLng9LXRoaXMueDt0aGlzLnk9LXRoaXMueTt0aGlzLno9LXRoaXMuejt0aGlzLnc9LXRoaXMudztyZXR1cm4gdGhpc30sZG90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLngqYS54K3RoaXMueSphLnkrdGhpcy56KgphLnordGhpcy53KmEud30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud30sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX0sc2V0TGVuZ3RoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGEpfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz0oYS54LXRoaXMueCkqYzt0aGlzLnkrPShhLnktdGhpcy55KSpjO3RoaXMueis9KGEuei0KdGhpcy56KSpjO3RoaXMudys9KGEudy10aGlzLncpKmM7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGMsYSkubXVsdGlwbHlTY2FsYXIoZSkuYWRkKGEpfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueD09PXRoaXMueCYmYS55PT09dGhpcy55JiZhLno9PT10aGlzLnomJmEudz09PXRoaXMud30sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy54PWFbY107dGhpcy55PWFbYysxXTt0aGlzLno9YVtjKzJdO3RoaXMudz1hW2MrM107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLng7YVtjKzFdPXRoaXMueTthW2MrMl09dGhpcy56O2FbYyszXT10aGlzLnc7cmV0dXJuIGF9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe3ZvaWQgMCE9PWUmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpOwp0aGlzLng9YS5nZXRYKGMpO3RoaXMueT1hLmdldFkoYyk7dGhpcy56PWEuZ2V0WihjKTt0aGlzLnc9YS5nZXRXKGMpO3JldHVybiB0aGlzfX0pO20ucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm0saXNXZWJHTFJlbmRlclRhcmdldDohMCxzZXRTaXplOmZ1bmN0aW9uKGEsYyl7aWYodGhpcy53aWR0aCE9PWF8fHRoaXMuaGVpZ2h0IT09Yyl0aGlzLndpZHRoPWEsdGhpcy5oZWlnaHQ9Yyx0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGg9YSx0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0PWMsdGhpcy5kaXNwb3NlKCk7dGhpcy52aWV3cG9ydC5zZXQoMCwwLGEsYyk7dGhpcy5zY2lzc29yLnNldCgwLDAsYSxjKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy53aWR0aD1hLndpZHRoO3RoaXMuaGVpZ2h0PWEuaGVpZ2h0O3RoaXMudmlld3BvcnQuY29weShhLnZpZXdwb3J0KTsKdGhpcy50ZXh0dXJlPWEudGV4dHVyZS5jbG9uZSgpO3RoaXMuZGVwdGhCdWZmZXI9YS5kZXB0aEJ1ZmZlcjt0aGlzLnN0ZW5jaWxCdWZmZXI9YS5zdGVuY2lsQnVmZmVyO3RoaXMuZGVwdGhUZXh0dXJlPWEuZGVwdGhUZXh0dXJlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO24ucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShtLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm4saXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7bS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5zYW1wbGVzPWEuc2FtcGxlcztyZXR1cm4gdGhpc319KTt2YXIgcWM9bmV3IGssUWI9bmV3IHEseG09bmV3IGsoMCwwLDApLHltPW5ldyBrKDEsMSwxKSxFZD1uZXcgayxnaD1uZXcgayxmYz1uZXcgaztPYmplY3QuYXNzaWduKHEucHJvdG90eXBlLHtpc01hdHJpeDQ6ITAsCnNldDpmdW5jdGlvbihhLGMsZSxnLHIsdix6LEUsRixKLFAsUixTLFYsVyxoYSl7dmFyIGZhPXRoaXMuZWxlbWVudHM7ZmFbMF09YTtmYVs0XT1jO2ZhWzhdPWU7ZmFbMTJdPWc7ZmFbMV09cjtmYVs1XT12O2ZhWzldPXo7ZmFbMTNdPUU7ZmFbMl09RjtmYVs2XT1KO2ZhWzEwXT1QO2ZhWzE0XT1SO2ZhWzNdPVM7ZmFbN109VjtmYVsxMV09VztmYVsxNV09aGE7cmV0dXJuIHRoaXN9LGlkZW50aXR5OmZ1bmN0aW9uKCl7dGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBxKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Y1swXT1hWzBdO2NbMV09YVsxXTtjWzJdPWFbMl07Y1szXT1hWzNdO2NbNF09YVs0XTtjWzVdPWFbNV07Y1s2XT1hWzZdO2NbN109YVs3XTtjWzhdPWFbOF07Y1s5XT1hWzldO2NbMTBdPQphWzEwXTtjWzExXT1hWzExXTtjWzEyXT1hWzEyXTtjWzEzXT1hWzEzXTtjWzE0XT1hWzE0XTtjWzE1XT1hWzE1XTtyZXR1cm4gdGhpc30sY29weVBvc2l0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2NbMTJdPWFbMTJdO2NbMTNdPWFbMTNdO2NbMTRdPWFbMTRdO3JldHVybiB0aGlzfSxleHRyYWN0QmFzaXM6ZnVuY3Rpb24oYSxjLGUpe2Euc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApO2Muc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpO2Uuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpO3JldHVybiB0aGlzfSxtYWtlQmFzaXM6ZnVuY3Rpb24oYSxjLGUpe3RoaXMuc2V0KGEueCxjLngsZS54LDAsYS55LGMueSxlLnksMCxhLnosYy56LGUueiwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxleHRyYWN0Um90YXRpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50cyxlPWEuZWxlbWVudHMsZz0xL3FjLnNldEZyb21NYXRyaXhDb2x1bW4oYSwKMCkubGVuZ3RoKCkscj0xL3FjLnNldEZyb21NYXRyaXhDb2x1bW4oYSwxKS5sZW5ndGgoKTthPTEvcWMuc2V0RnJvbU1hdHJpeENvbHVtbihhLDIpLmxlbmd0aCgpO2NbMF09ZVswXSpnO2NbMV09ZVsxXSpnO2NbMl09ZVsyXSpnO2NbM109MDtjWzRdPWVbNF0qcjtjWzVdPWVbNV0qcjtjWzZdPWVbNl0qcjtjWzddPTA7Y1s4XT1lWzhdKmE7Y1s5XT1lWzldKmE7Y1sxMF09ZVsxMF0qYTtjWzExXT0wO2NbMTJdPTA7Y1sxM109MDtjWzE0XT0wO2NbMTVdPTE7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvbkZyb21FdWxlcjpmdW5jdGlvbihhKXthJiZhLmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7dmFyIGM9dGhpcy5lbGVtZW50cyxlPWEueCxnPWEueSxyPWEueix2PU1hdGguY29zKGUpO2U9TWF0aC5zaW4oZSk7CnZhciB6PU1hdGguY29zKGcpO2c9TWF0aC5zaW4oZyk7dmFyIEU9TWF0aC5jb3Mocik7cj1NYXRoLnNpbihyKTtpZigiWFlaIj09PWEub3JkZXIpe2E9dipFO3ZhciBGPXYqcixKPWUqRSxQPWUqcjtjWzBdPXoqRTtjWzRdPS16KnI7Y1s4XT1nO2NbMV09RitKKmc7Y1s1XT1hLVAqZztjWzldPS1lKno7Y1syXT1QLWEqZztjWzZdPUorRipnO2NbMTBdPXYqen1lbHNlIllYWiI9PT1hLm9yZGVyPyhhPXoqRSxGPXoqcixKPWcqRSxQPWcqcixjWzBdPWErUCplLGNbNF09SiplLUYsY1s4XT12KmcsY1sxXT12KnIsY1s1XT12KkUsY1s5XT0tZSxjWzJdPUYqZS1KLGNbNl09UCthKmUsY1sxMF09dip6KToiWlhZIj09PWEub3JkZXI/KGE9eipFLEY9eipyLEo9ZypFLFA9ZypyLGNbMF09YS1QKmUsY1s0XT0tdipyLGNbOF09SitGKmUsY1sxXT1GK0oqZSxjWzVdPXYqRSxjWzldPVAtYSplLGNbMl09LXYqZyxjWzZdPWUsY1sxMF09dip6KToiWllYIj09PWEub3JkZXI/KGE9dipFLEY9dipyLEo9ZSoKRSxQPWUqcixjWzBdPXoqRSxjWzRdPUoqZy1GLGNbOF09YSpnK1AsY1sxXT16KnIsY1s1XT1QKmcrYSxjWzldPUYqZy1KLGNbMl09LWcsY1s2XT1lKnosY1sxMF09dip6KToiWVpYIj09PWEub3JkZXI/KGE9dip6LEY9dipnLEo9ZSp6LFA9ZSpnLGNbMF09eipFLGNbNF09UC1hKnIsY1s4XT1KKnIrRixjWzFdPXIsY1s1XT12KkUsY1s5XT0tZSpFLGNbMl09LWcqRSxjWzZdPUYqcitKLGNbMTBdPWEtUCpyKToiWFpZIj09PWEub3JkZXImJihhPXYqeixGPXYqZyxKPWUqeixQPWUqZyxjWzBdPXoqRSxjWzRdPS1yLGNbOF09ZypFLGNbMV09YSpyK1AsY1s1XT12KkUsY1s5XT1GKnItSixjWzJdPUoqci1GLGNbNl09ZSpFLGNbMTBdPVAqcithKTtjWzNdPTA7Y1s3XT0wO2NbMTFdPTA7Y1sxMl09MDtjWzEzXT0wO2NbMTRdPTA7Y1sxNV09MTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29tcG9zZSh4bSxhLHltKX0sbG9va0F0OmZ1bmN0aW9uKGEsCmMsZSl7dmFyIGc9dGhpcy5lbGVtZW50cztmYy5zdWJWZWN0b3JzKGEsYyk7MD09PWZjLmxlbmd0aFNxKCkmJihmYy56PTEpO2ZjLm5vcm1hbGl6ZSgpO0VkLmNyb3NzVmVjdG9ycyhlLGZjKTswPT09RWQubGVuZ3RoU3EoKSYmKDE9PT1NYXRoLmFicyhlLnopP2ZjLngrPTFFLTQ6ZmMueis9MUUtNCxmYy5ub3JtYWxpemUoKSxFZC5jcm9zc1ZlY3RvcnMoZSxmYykpO0VkLm5vcm1hbGl6ZSgpO2doLmNyb3NzVmVjdG9ycyhmYyxFZCk7Z1swXT1FZC54O2dbNF09Z2gueDtnWzhdPWZjLng7Z1sxXT1FZC55O2dbNV09Z2gueTtnWzldPWZjLnk7Z1syXT1FZC56O2dbNl09Z2guejtnWzEwXT1mYy56O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhLGMpe3JldHVybiB2b2lkIDAhPT1jPyhjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSBpbnN0ZWFkLiIpLAp0aGlzLm11bHRpcGx5TWF0cmljZXMoYSxjKSk6dGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsYSl9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoYSx0aGlzKX0sbXVsdGlwbHlNYXRyaWNlczpmdW5jdGlvbihhLGMpe3ZhciBlPWEuZWxlbWVudHMsZz1jLmVsZW1lbnRzO2M9dGhpcy5lbGVtZW50czthPWVbMF07dmFyIHI9ZVs0XSx2PWVbOF0sej1lWzEyXSxFPWVbMV0sRj1lWzVdLEo9ZVs5XSxQPWVbMTNdLFI9ZVsyXSxTPWVbNl0sVj1lWzEwXSxXPWVbMTRdLGhhPWVbM10sZmE9ZVs3XSxyYT1lWzExXTtlPWVbMTVdO3ZhciBwYT1nWzBdLHFhPWdbNF0sdWE9Z1s4XSxvYT1nWzEyXSx0YT1nWzFdLEJhPWdbNV0sVGE9Z1s5XSxVYT1nWzEzXSxDYT1nWzJdLEhhPWdbNl0sRGE9Z1sxMF0sTWE9Z1sxNF0sZGI9Z1szXSx0Yj1nWzddLEthPWdbMTFdO2c9Z1sxNV07Y1swXT1hKnBhK3IqdGErdipDYSt6KmRiO2NbNF09YSpxYStyKkJhK3YqCkhhK3oqdGI7Y1s4XT1hKnVhK3IqVGErdipEYSt6KkthO2NbMTJdPWEqb2ErcipVYSt2Kk1hK3oqZztjWzFdPUUqcGErRip0YStKKkNhK1AqZGI7Y1s1XT1FKnFhK0YqQmErSipIYStQKnRiO2NbOV09RSp1YStGKlRhK0oqRGErUCpLYTtjWzEzXT1FKm9hK0YqVWErSipNYStQKmc7Y1syXT1SKnBhK1MqdGErVipDYStXKmRiO2NbNl09UipxYStTKkJhK1YqSGErVyp0YjtjWzEwXT1SKnVhK1MqVGErVipEYStXKkthO2NbMTRdPVIqb2ErUypVYStWKk1hK1cqZztjWzNdPWhhKnBhK2ZhKnRhK3JhKkNhK2UqZGI7Y1s3XT1oYSpxYStmYSpCYStyYSpIYStlKnRiO2NbMTFdPWhhKnVhK2ZhKlRhK3JhKkRhK2UqS2E7Y1sxNV09aGEqb2ErZmEqVWErcmEqTWErZSpnO3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2NbMF0qPWE7Y1s0XSo9YTtjWzhdKj1hO2NbMTJdKj1hO2NbMV0qPWE7Y1s1XSo9YTtjWzldKj1hO2NbMTNdKj1hO2NbMl0qPQphO2NbNl0qPWE7Y1sxMF0qPWE7Y1sxNF0qPWE7Y1szXSo9YTtjWzddKj1hO2NbMTFdKj1hO2NbMTVdKj1hO3JldHVybiB0aGlzfSxhcHBseVRvQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wLGU9YS5jb3VudDtjPGU7YysrKXFjLng9YS5nZXRYKGMpLHFjLnk9YS5nZXRZKGMpLHFjLno9YS5nZXRaKGMpLHFjLmFwcGx5TWF0cml4NCh0aGlzKSxhLnNldFhZWihjLHFjLngscWMueSxxYy56KTtyZXR1cm4gYX0sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzLGM9YVswXSxlPWFbNF0sZz1hWzhdLHI9YVsxMl0sdj1hWzFdLHo9YVs1XSxFPWFbOV0sRj1hWzEzXSxKPWFbMl0sUD1hWzZdLFI9YVsxMF0sUz1hWzE0XTtyZXR1cm4gYVszXSooK3IqRSpQLWcqRipQLXIqeipSK2UqRipSK2cqeipTLWUqRSpTKSthWzddKigrYypFKlMtYypGKlIrcip2KlItZyp2KlMrZypGKkotcipFKkopK2FbMTFdKigrYypGKlAtYyp6KlMtcip2KlArZSp2KlMrCnIqeipKLWUqRipKKSthWzE1XSooLWcqeipKLWMqRSpQK2MqeipSK2cqdipQLWUqdipSK2UqRSpKKX0sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50czt2YXIgYz1hWzFdO2FbMV09YVs0XTthWzRdPWM7Yz1hWzJdO2FbMl09YVs4XTthWzhdPWM7Yz1hWzZdO2FbNl09YVs5XTthWzldPWM7Yz1hWzNdO2FbM109YVsxMl07YVsxMl09YztjPWFbN107YVs3XT1hWzEzXTthWzEzXT1jO2M9YVsxMV07YVsxMV09YVsxNF07YVsxNF09YztyZXR1cm4gdGhpc30sc2V0UG9zaXRpb246ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuZWxlbWVudHM7YS5pc1ZlY3RvcjM/KGdbMTJdPWEueCxnWzEzXT1hLnksZ1sxNF09YS56KTooZ1sxMl09YSxnWzEzXT1jLGdbMTRdPWUpO3JldHVybiB0aGlzfSxnZXRJbnZlcnNlOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5lbGVtZW50cyxnPWEuZWxlbWVudHM7YT1nWzBdO3ZhciByPWdbMV0sdj1nWzJdLHo9Z1szXSxFPWdbNF0sRj1nWzVdLApKPWdbNl0sUD1nWzddLFI9Z1s4XSxTPWdbOV0sVj1nWzEwXSxXPWdbMTFdLGhhPWdbMTJdLGZhPWdbMTNdLHJhPWdbMTRdO2c9Z1sxNV07dmFyIHBhPVMqcmEqUC1mYSpWKlArZmEqSipXLUYqcmEqVy1TKkoqZytGKlYqZyxxYT1oYSpWKlAtUipyYSpQLWhhKkoqVytFKnJhKlcrUipKKmctRSpWKmcsdWE9UipmYSpQLWhhKlMqUCtoYSpGKlctRSpmYSpXLVIqRipnK0UqUypnLG9hPWhhKlMqSi1SKmZhKkotaGEqRipWK0UqZmEqVitSKkYqcmEtRSpTKnJhLHRhPWEqcGErcipxYSt2KnVhK3oqb2E7aWYoMD09PXRhKXtpZighMD09PWMpdGhyb3cgRXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIik7cmV0dXJuIHRoaXMuaWRlbnRpdHkoKX1jPTEvdGE7ZVswXT0KcGEqYztlWzFdPShmYSpWKnotUypyYSp6LWZhKnYqVytyKnJhKlcrUyp2KmctcipWKmcpKmM7ZVsyXT0oRipyYSp6LWZhKkoqeitmYSp2KlAtcipyYSpQLUYqdipnK3IqSipnKSpjO2VbM109KFMqSip6LUYqVip6LVMqdipQK3IqVipQK0YqdipXLXIqSipXKSpjO2VbNF09cWEqYztlWzVdPShSKnJhKnotaGEqVip6K2hhKnYqVy1hKnJhKlctUip2KmcrYSpWKmcpKmM7ZVs2XT0oaGEqSip6LUUqcmEqei1oYSp2KlArYSpyYSpQK0UqdipnLWEqSipnKSpjO2VbN109KEUqVip6LVIqSip6K1IqdipQLWEqVipQLUUqdipXK2EqSipXKSpjO2VbOF09dWEqYztlWzldPShoYSpTKnotUipmYSp6LWhhKnIqVythKmZhKlcrUipyKmctYSpTKmcpKmM7ZVsxMF09KEUqZmEqei1oYSpGKnoraGEqcipQLWEqZmEqUC1FKnIqZythKkYqZykqYztlWzExXT0oUipGKnotRSpTKnotUipyKlArYSpTKlArRSpyKlctYSpGKlcpKmM7ZVsxMl09b2EqYztlWzEzXT0oUipmYSp2LWhhKlMqditoYSpyKlYtYSpmYSpWLQpSKnIqcmErYSpTKnJhKSpjO2VbMTRdPShoYSpGKnYtRSpmYSp2LWhhKnIqSithKmZhKkorRSpyKnJhLWEqRipyYSkqYztlWzE1XT0oRSpTKnYtUipGKnYrUipyKkotYSpTKkotRSpyKlYrYSpGKlYpKmM7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHMsZT1hLngsZz1hLnk7YT1hLno7Y1swXSo9ZTtjWzRdKj1nO2NbOF0qPWE7Y1sxXSo9ZTtjWzVdKj1nO2NbOV0qPWE7Y1syXSo9ZTtjWzZdKj1nO2NbMTBdKj1hO2NbM10qPWU7Y1s3XSo9ZztjWzExXSo9YTtyZXR1cm4gdGhpc30sZ2V0TWF4U2NhbGVPbkF4aXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzO3JldHVybiBNYXRoLnNxcnQoTWF0aC5tYXgoYVswXSphWzBdK2FbMV0qYVsxXSthWzJdKmFbMl0sYVs0XSphWzRdK2FbNV0qYVs1XSthWzZdKmFbNl0sYVs4XSphWzhdK2FbOV0qYVs5XSthWzEwXSphWzEwXSkpfSxtYWtlVHJhbnNsYXRpb246ZnVuY3Rpb24oYSxjLGUpe3RoaXMuc2V0KDEsCjAsMCxhLDAsMSwwLGMsMCwwLDEsZSwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWDpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3RoaXMuc2V0KDEsMCwwLDAsMCxjLC1hLDAsMCxhLGMsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWTpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3RoaXMuc2V0KGMsMCxhLDAsMCwxLDAsMCwtYSwwLGMsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWjpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3RoaXMuc2V0KGMsLWEsMCwwLGEsYywwLDAsMCwwLDEsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uQXhpczpmdW5jdGlvbihhLGMpe3ZhciBlPU1hdGguY29zKGMpO2M9TWF0aC5zaW4oYyk7dmFyIGc9MS1lLHI9YS54LHY9YS55O2E9YS56O3ZhciB6PWcqcixFPWcqdjt0aGlzLnNldCh6KgpyK2Useip2LWMqYSx6KmErYyp2LDAseip2K2MqYSxFKnYrZSxFKmEtYypyLDAseiphLWMqdixFKmErYypyLGcqYSphK2UsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVNjYWxlOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldChhLDAsMCwwLDAsYywwLDAsMCwwLGUsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVNoZWFyOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldCgxLGMsZSwwLGEsMSxlLDAsYSxjLDEsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sY29tcG9zZTpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5lbGVtZW50cyxyPWMuX3gsdj1jLl95LHo9Yy5feixFPWMuX3csRj1yK3IsSj12K3YsUD16K3o7Yz1yKkY7dmFyIFI9cipKO3IqPVA7dmFyIFM9dipKO3YqPVA7eio9UDtGKj1FO0oqPUU7RSo9UDtQPWUueDt2YXIgVj1lLnk7ZT1lLno7Z1swXT0oMS0oUyt6KSkqUDtnWzFdPShSK0UpKlA7Z1syXT0oci1KKSpQO2dbM109MDtnWzRdPShSLUUpKlY7Z1s1XT0oMS0oYyt6KSkqClY7Z1s2XT0oditGKSpWO2dbN109MDtnWzhdPShyK0opKmU7Z1s5XT0odi1GKSplO2dbMTBdPSgxLShjK1MpKSplO2dbMTFdPTA7Z1sxMl09YS54O2dbMTNdPWEueTtnWzE0XT1hLno7Z1sxNV09MTtyZXR1cm4gdGhpc30sZGVjb21wb3NlOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLmVsZW1lbnRzLHI9cWMuc2V0KGdbMF0sZ1sxXSxnWzJdKS5sZW5ndGgoKSx2PXFjLnNldChnWzRdLGdbNV0sZ1s2XSkubGVuZ3RoKCksej1xYy5zZXQoZ1s4XSxnWzldLGdbMTBdKS5sZW5ndGgoKTswPnRoaXMuZGV0ZXJtaW5hbnQoKSYmKHI9LXIpO2EueD1nWzEyXTthLnk9Z1sxM107YS56PWdbMTRdO1FiLmNvcHkodGhpcyk7YT0xL3I7Zz0xL3Y7dmFyIEU9MS96O1FiLmVsZW1lbnRzWzBdKj1hO1FiLmVsZW1lbnRzWzFdKj1hO1FiLmVsZW1lbnRzWzJdKj1hO1FiLmVsZW1lbnRzWzRdKj1nO1FiLmVsZW1lbnRzWzVdKj1nO1FiLmVsZW1lbnRzWzZdKj1nO1FiLmVsZW1lbnRzWzhdKj1FO1FiLmVsZW1lbnRzWzldKj0KRTtRYi5lbGVtZW50c1sxMF0qPUU7Yy5zZXRGcm9tUm90YXRpb25NYXRyaXgoUWIpO2UueD1yO2UueT12O2Uuej16O3JldHVybiB0aGlzfSxtYWtlUGVyc3BlY3RpdmU6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3ZvaWQgMD09PXYmJmNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VQZXJzcGVjdGl2ZSgpIGhhcyBiZWVuIHJlZGVmaW5lZCBhbmQgaGFzIGEgbmV3IHNpZ25hdHVyZS4gUGxlYXNlIGNoZWNrIHRoZSBkb2NzLiIpO3ZhciB6PXRoaXMuZWxlbWVudHM7elswXT0yKnIvKGMtYSk7els0XT0wO3pbOF09KGMrYSkvKGMtYSk7elsxMl09MDt6WzFdPTA7els1XT0yKnIvKGUtZyk7els5XT0oZStnKS8oZS1nKTt6WzEzXT0wO3pbMl09MDt6WzZdPTA7elsxMF09LSh2K3IpLyh2LXIpO3pbMTRdPS0yKnYqci8odi1yKTt6WzNdPTA7els3XT0wO3pbMTFdPS0xO3pbMTVdPTA7cmV0dXJuIHRoaXN9LG1ha2VPcnRob2dyYXBoaWM6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3ZhciB6PQp0aGlzLmVsZW1lbnRzLEU9MS8oYy1hKSxGPTEvKGUtZyksSj0xLyh2LXIpO3pbMF09MipFO3pbNF09MDt6WzhdPTA7elsxMl09LSgoYythKSpFKTt6WzFdPTA7els1XT0yKkY7els5XT0wO3pbMTNdPS0oKGUrZykqRik7elsyXT0wO3pbNl09MDt6WzEwXT0tMipKO3pbMTRdPS0oKHYrcikqSik7elszXT0wO3pbN109MDt6WzExXT0wO3pbMTVdPTE7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2E9YS5lbGVtZW50cztmb3IodmFyIGU9MDsxNj5lO2UrKylpZihjW2VdIT09YVtlXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPTA7MTY+ZTtlKyspdGhpcy5lbGVtZW50c1tlXT1hW2UrY107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7dmFyIGU9dGhpcy5lbGVtZW50czthW2NdPWVbMF07CmFbYysxXT1lWzFdO2FbYysyXT1lWzJdO2FbYyszXT1lWzNdO2FbYys0XT1lWzRdO2FbYys1XT1lWzVdO2FbYys2XT1lWzZdO2FbYys3XT1lWzddO2FbYys4XT1lWzhdO2FbYys5XT1lWzldO2FbYysxMF09ZVsxMF07YVtjKzExXT1lWzExXTthW2MrMTJdPWVbMTJdO2FbYysxM109ZVsxM107YVtjKzE0XT1lWzE0XTthW2MrMTVdPWVbMTVdO3JldHVybiBhfX0pO3ZhciBjaz1uZXcgcSxkaz1uZXcgaDt1LlJvdGF0aW9uT3JkZXJzPSJYWVogWVpYIFpYWSBYWlkgWVhaIFpZWCIuc3BsaXQoIiAiKTt1LkRlZmF1bHRPcmRlcj0iWFlaIjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1LnByb3RvdHlwZSx7eDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3h9LHNldDpmdW5jdGlvbihhKXt0aGlzLl94PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0seTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3l9LHNldDpmdW5jdGlvbihhKXt0aGlzLl95PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0sCno6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl96fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5fej1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19LG9yZGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JkZXJ9LHNldDpmdW5jdGlvbihhKXt0aGlzLl9vcmRlcj1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19fSk7T2JqZWN0LmFzc2lnbih1LnByb3RvdHlwZSx7aXNFdWxlcjohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5feD1hO3RoaXMuX3k9Yzt0aGlzLl96PWU7dGhpcy5fb3JkZXI9Z3x8dGhpcy5fb3JkZXI7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5feD1hLl94O3RoaXMuX3k9YS5feTt0aGlzLl96PWEuX3o7dGhpcy5fb3JkZXI9YS5fb3JkZXI7CnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz1oYi5jbGFtcCxyPWEuZWxlbWVudHM7YT1yWzBdO3ZhciB2PXJbNF0sej1yWzhdLEU9clsxXSxGPXJbNV0sSj1yWzldLFA9clsyXSxSPXJbNl07cj1yWzEwXTtjPWN8fHRoaXMuX29yZGVyOyJYWVoiPT09Yz8odGhpcy5feT1NYXRoLmFzaW4oZyh6LC0xLDEpKSwuOTk5OTk5OT5NYXRoLmFicyh6KT8odGhpcy5feD1NYXRoLmF0YW4yKC1KLHIpLHRoaXMuX3o9TWF0aC5hdGFuMigtdixhKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihSLEYpLHRoaXMuX3o9MCkpOiJZWFoiPT09Yz8odGhpcy5feD1NYXRoLmFzaW4oLWcoSiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoSik/KHRoaXMuX3k9TWF0aC5hdGFuMih6LHIpLHRoaXMuX3o9TWF0aC5hdGFuMihFLEYpKToodGhpcy5feT1NYXRoLmF0YW4yKC1QLGEpLHRoaXMuX3o9MCkpOiJaWFkiPT09Yz8odGhpcy5feD0KTWF0aC5hc2luKGcoUiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoUik/KHRoaXMuX3k9TWF0aC5hdGFuMigtUCxyKSx0aGlzLl96PU1hdGguYXRhbjIoLXYsRikpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKEUsYSkpKToiWllYIj09PWM/KHRoaXMuX3k9TWF0aC5hc2luKC1nKFAsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKFApPyh0aGlzLl94PU1hdGguYXRhbjIoUixyKSx0aGlzLl96PU1hdGguYXRhbjIoRSxhKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLXYsRikpKToiWVpYIj09PWM/KHRoaXMuX3o9TWF0aC5hc2luKGcoRSwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoRSk/KHRoaXMuX3g9TWF0aC5hdGFuMigtSixGKSx0aGlzLl95PU1hdGguYXRhbjIoLVAsYSkpOih0aGlzLl94PTAsdGhpcy5feT1NYXRoLmF0YW4yKHoscikpKToiWFpZIj09PWM/KHRoaXMuX3o9TWF0aC5hc2luKC1nKHYsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKHYpPyh0aGlzLl94PQpNYXRoLmF0YW4yKFIsRiksdGhpcy5feT1NYXRoLmF0YW4yKHosYSkpOih0aGlzLl94PU1hdGguYXRhbjIoLUosciksdGhpcy5feT0wKSk6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAiK2MpO3RoaXMuX29yZGVyPWM7ITEhPT1lJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEsYyxlKXtjay5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihhKTtyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoY2ssYyxlKX0sc2V0RnJvbVZlY3RvcjM6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5zZXQoYS54LGEueSxhLnosY3x8dGhpcy5fb3JkZXIpfSxyZW9yZGVyOmZ1bmN0aW9uKGEpe2RrLnNldEZyb21FdWxlcih0aGlzKTtyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbihkayxhKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLl94PT09CnRoaXMuX3gmJmEuX3k9PT10aGlzLl95JiZhLl96PT09dGhpcy5feiYmYS5fb3JkZXI9PT10aGlzLl9vcmRlcn0sZnJvbUFycmF5OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YVswXTt0aGlzLl95PWFbMV07dGhpcy5fej1hWzJdO3ZvaWQgMCE9PWFbM10mJih0aGlzLl9vcmRlcj1hWzNdKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLl94O2FbYysxXT10aGlzLl95O2FbYysyXT10aGlzLl96O2FbYyszXT10aGlzLl9vcmRlcjtyZXR1cm4gYX0sdG9WZWN0b3IzOmZ1bmN0aW9uKGEpe3JldHVybiBhP2Euc2V0KHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KTpuZXcgayh0aGlzLl94LHRoaXMuX3ksdGhpcy5feil9LF9vbkNoYW5nZTpmdW5jdGlvbihhKXt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPWE7cmV0dXJuIHRoaXN9LF9vbkNoYW5nZUNhbGxiYWNrOmZ1bmN0aW9uKCl7fX0pOwpPYmplY3QuYXNzaWduKHgucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5tYXNrPTE8PGF8MH0sZW5hYmxlOmZ1bmN0aW9uKGEpe3RoaXMubWFzaz10aGlzLm1hc2t8MTw8YXwwfSxlbmFibGVBbGw6ZnVuY3Rpb24oKXt0aGlzLm1hc2s9LTF9LHRvZ2dsZTpmdW5jdGlvbihhKXt0aGlzLm1hc2tePTE8PGF8MH0sZGlzYWJsZTpmdW5jdGlvbihhKXt0aGlzLm1hc2smPX4oMTw8YXwwKX0sZGlzYWJsZUFsbDpmdW5jdGlvbigpe3RoaXMubWFzaz0wfSx0ZXN0OmZ1bmN0aW9uKGEpe3JldHVybiAwIT09KHRoaXMubWFzayZhLm1hc2spfX0pO3ZhciBPaz0wLGVrPW5ldyBrLGZmPW5ldyBoLGpkPW5ldyBxLGhoPW5ldyBrLGtnPW5ldyBrLHptPW5ldyBrLEFtPW5ldyBoLGZrPW5ldyBrKDEsMCwwKSxnaz1uZXcgaygwLDEsMCksaGs9bmV3IGsoMCwwLDEpLEJtPXt0eXBlOiJhZGRlZCJ9LENtPXt0eXBlOiJyZW1vdmVkIn07QS5EZWZhdWx0VXA9bmV3IGsoMCwxLDApO0EuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU9CiEwO0EucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkEsaXNPYmplY3QzRDohMCxvbkJlZm9yZVJlbmRlcjpmdW5jdGlvbigpe30sb25BZnRlclJlbmRlcjpmdW5jdGlvbigpe30sYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYSl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpO3RoaXMubWF0cml4LnByZW11bHRpcGx5KGEpO3RoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX0sYXBwbHlRdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3RoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShhKTtyZXR1cm4gdGhpc30sc2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGEsYyl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoYSxjKX0sc2V0Um90YXRpb25Gcm9tRXVsZXI6ZnVuY3Rpb24oYSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcihhLAohMCl9LHNldFJvdGF0aW9uRnJvbU1hdHJpeDpmdW5jdGlvbihhKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KGEpfSxzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3RoaXMucXVhdGVybmlvbi5jb3B5KGEpfSxyb3RhdGVPbkF4aXM6ZnVuY3Rpb24oYSxjKXtmZi5zZXRGcm9tQXhpc0FuZ2xlKGEsYyk7dGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KGZmKTtyZXR1cm4gdGhpc30scm90YXRlT25Xb3JsZEF4aXM6ZnVuY3Rpb24oYSxjKXtmZi5zZXRGcm9tQXhpc0FuZ2xlKGEsYyk7dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KGZmKTtyZXR1cm4gdGhpc30scm90YXRlWDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoZmssYSl9LHJvdGF0ZVk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGdrLGEpfSxyb3RhdGVaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhoayxhKX0sdHJhbnNsYXRlT25BeGlzOmZ1bmN0aW9uKGEsCmMpe2VrLmNvcHkoYSkuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbik7dGhpcy5wb3NpdGlvbi5hZGQoZWsubXVsdGlwbHlTY2FsYXIoYykpO3JldHVybiB0aGlzfSx0cmFuc2xhdGVYOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhmayxhKX0sdHJhbnNsYXRlWTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoZ2ssYSl9LHRyYW5zbGF0ZVo6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGhrLGEpfSxsb2NhbFRvV29ybGQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfSx3b3JsZFRvTG9jYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KGpkLmdldEludmVyc2UodGhpcy5tYXRyaXhXb3JsZCkpfSxsb29rQXQ6ZnVuY3Rpb24oYSxjLGUpe2EuaXNWZWN0b3IzP2hoLmNvcHkoYSk6aGguc2V0KGEsYyxlKTthPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsCiExKTtrZy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5pc0NhbWVyYXx8dGhpcy5pc0xpZ2h0P2pkLmxvb2tBdChrZyxoaCx0aGlzLnVwKTpqZC5sb29rQXQoaGgsa2csdGhpcy51cCk7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChqZCk7YSYmKGpkLmV4dHJhY3RSb3RhdGlvbihhLm1hdHJpeFdvcmxkKSxmZi5zZXRGcm9tUm90YXRpb25NYXRyaXgoamQpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShmZi5pbnZlcnNlKCkpKX0sYWRkOmZ1bmN0aW9uKGEpe2lmKDE8YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBjPTA7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyl0aGlzLmFkZChhcmd1bWVudHNbY10pO3JldHVybiB0aGlzfWlmKGE9PT10aGlzKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLGEpLHRoaXM7YSYmYS5pc09iamVjdDNEPwoobnVsbCE9PWEucGFyZW50JiZhLnBhcmVudC5yZW1vdmUoYSksYS5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2goYSksYS5kaXNwYXRjaEV2ZW50KEJtKSk6Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELiIsYSk7cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbihhKXtpZigxPGFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW2NdKTtyZXR1cm4gdGhpc31jPXRoaXMuY2hpbGRyZW4uaW5kZXhPZihhKTstMSE9PWMmJihhLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGMsMSksYS5kaXNwYXRjaEV2ZW50KENtKSk7cmV0dXJuIHRoaXN9LGF0dGFjaDpmdW5jdGlvbihhKXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtqZC5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpO251bGwhPT0KYS5wYXJlbnQmJihhLnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksamQubXVsdGlwbHkoYS5wYXJlbnQubWF0cml4V29ybGQpKTthLmFwcGx5TWF0cml4KGpkKTthLnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTt0aGlzLmFkZChhKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0QnlJZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsYSl9LGdldE9iamVjdEJ5TmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIixhKX0sZ2V0T2JqZWN0QnlQcm9wZXJ0eTpmdW5jdGlvbihhLGMpe2lmKHRoaXNbYV09PT1jKXJldHVybiB0aGlzO2Zvcih2YXIgZT0wLGc9dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9dGhpcy5jaGlsZHJlbltlXS5nZXRPYmplY3RCeVByb3BlcnR5KGEsYyk7aWYodm9pZCAwIT09cilyZXR1cm4gcn19LGdldFdvcmxkUG9zaXRpb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09CmEmJihjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRQb3NpdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtyZXR1cm4gYS5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9LGdldFdvcmxkUXVhdGVybmlvbjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUXVhdGVybmlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBoKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShrZyxhLHptKTtyZXR1cm4gYX0sZ2V0V29ybGRTY2FsZTpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkU2NhbGUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7CnRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKGtnLEFtLGEpO3JldHVybiBhfSxnZXRXb3JsZERpcmVjdGlvbjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApO3ZhciBjPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGEuc2V0KGNbOF0sY1s5XSxjWzEwXSkubm9ybWFsaXplKCl9LHJheWNhc3Q6ZnVuY3Rpb24oKXt9LHRyYXZlcnNlOmZ1bmN0aW9uKGEpe2EodGhpcyk7Zm9yKHZhciBjPXRoaXMuY2hpbGRyZW4sZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyljW2VdLnRyYXZlcnNlKGEpfSx0cmF2ZXJzZVZpc2libGU6ZnVuY3Rpb24oYSl7aWYoITEhPT10aGlzLnZpc2libGUpe2EodGhpcyk7Zm9yKHZhciBjPXRoaXMuY2hpbGRyZW4sZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyljW2VdLnRyYXZlcnNlVmlzaWJsZShhKX19LAp0cmF2ZXJzZUFuY2VzdG9yczpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBhcmVudDtudWxsIT09YyYmKGEoYyksYy50cmF2ZXJzZUFuY2VzdG9ycyhhKSl9LHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSk7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7aWYodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHxhKW51bGw9PT10aGlzLnBhcmVudD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLGE9ITA7Zm9yKHZhciBjPXRoaXMuY2hpbGRyZW4sZT0KMCxnPWMubGVuZ3RoO2U8ZztlKyspY1tlXS51cGRhdGVNYXRyaXhXb3JsZChhKX0sdXBkYXRlV29ybGRNYXRyaXg6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLnBhcmVudDshMD09PWEmJm51bGwhPT1lJiZlLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7bnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KTtpZighMD09PWMpZm9yKGE9dGhpcy5jaGlsZHJlbixjPTAsZT1hLmxlbmd0aDtjPGU7YysrKWFbY10udXBkYXRlV29ybGRNYXRyaXgoITEsITApfSx0b0pTT046ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhQLFIpe3ZvaWQgMD09PVBbUi51dWlkXSYmKFBbUi51dWlkXT1SLnRvSlNPTihhKSk7cmV0dXJuIFIudXVpZH1mdW5jdGlvbiBlKFApe3ZhciBSPQpbXSxTO2ZvcihTIGluIFApe3ZhciBWPVBbU107ZGVsZXRlIFYubWV0YWRhdGE7Ui5wdXNoKFYpfXJldHVybiBSfXZhciBnPXZvaWQgMD09PWF8fCJzdHJpbmciPT09dHlwZW9mIGEscj17fTtnJiYoYT17Z2VvbWV0cmllczp7fSxtYXRlcmlhbHM6e30sdGV4dHVyZXM6e30saW1hZ2VzOnt9LHNoYXBlczp7fX0sci5tZXRhZGF0YT17dmVyc2lvbjo0LjUsdHlwZToiT2JqZWN0IixnZW5lcmF0b3I6Ik9iamVjdDNELnRvSlNPTiJ9KTt2YXIgdj17fTt2LnV1aWQ9dGhpcy51dWlkO3YudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJih2Lm5hbWU9dGhpcy5uYW1lKTshMD09PXRoaXMuY2FzdFNoYWRvdyYmKHYuY2FzdFNoYWRvdz0hMCk7ITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJih2LnJlY2VpdmVTaGFkb3c9ITApOyExPT09dGhpcy52aXNpYmxlJiYodi52aXNpYmxlPSExKTshMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKHYuZnJ1c3R1bUN1bGxlZD0hMSk7MCE9PXRoaXMucmVuZGVyT3JkZXImJgoodi5yZW5kZXJPcmRlcj10aGlzLnJlbmRlck9yZGVyKTsie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJih2LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO3YubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2s7di5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpOyExPT09dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiYodi5tYXRyaXhBdXRvVXBkYXRlPSExKTt0aGlzLmlzTWVzaCYmMCE9PXRoaXMuZHJhd01vZGUmJih2LmRyYXdNb2RlPXRoaXMuZHJhd01vZGUpO2lmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7di5nZW9tZXRyeT1jKGEuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTt2YXIgej10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYodm9pZCAwIT09eiYmdm9pZCAwIT09ei5zaGFwZXMpaWYoej16LnNoYXBlcyxBcnJheS5pc0FycmF5KHopKWZvcih2YXIgRT0wLEY9ei5sZW5ndGg7RTxGO0UrKyljKGEuc2hhcGVzLHpbRV0pO2Vsc2UgYyhhLnNoYXBlcywKeil9aWYodm9pZCAwIT09dGhpcy5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXt6PVtdO0U9MDtmb3IoRj10aGlzLm1hdGVyaWFsLmxlbmd0aDtFPEY7RSsrKXoucHVzaChjKGEubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbRV0pKTt2Lm1hdGVyaWFsPXp9ZWxzZSB2Lm1hdGVyaWFsPWMoYS5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYoMDx0aGlzLmNoaWxkcmVuLmxlbmd0aClmb3Iodi5jaGlsZHJlbj1bXSxFPTA7RTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtFKyspdi5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bRV0udG9KU09OKGEpLm9iamVjdCk7aWYoZyl7Zz1lKGEuZ2VvbWV0cmllcyk7RT1lKGEubWF0ZXJpYWxzKTtGPWUoYS50ZXh0dXJlcyk7dmFyIEo9ZShhLmltYWdlcyk7ej1lKGEuc2hhcGVzKTswPGcubGVuZ3RoJiYoci5nZW9tZXRyaWVzPWcpOzA8RS5sZW5ndGgmJihyLm1hdGVyaWFscz1FKTswPEYubGVuZ3RoJiYoci50ZXh0dXJlcz1GKTsKMDxKLmxlbmd0aCYmKHIuaW1hZ2VzPUopOzA8ei5sZW5ndGgmJihyLnNoYXBlcz16KX1yLm9iamVjdD12O3JldHVybiByfSxjbG9uZTpmdW5jdGlvbihhKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyxhKX0sY29weTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPSEwKTt0aGlzLm5hbWU9YS5uYW1lO3RoaXMudXAuY29weShhLnVwKTt0aGlzLnBvc2l0aW9uLmNvcHkoYS5wb3NpdGlvbik7dGhpcy5xdWF0ZXJuaW9uLmNvcHkoYS5xdWF0ZXJuaW9uKTt0aGlzLnNjYWxlLmNvcHkoYS5zY2FsZSk7dGhpcy5tYXRyaXguY29weShhLm1hdHJpeCk7dGhpcy5tYXRyaXhXb3JsZC5jb3B5KGEubWF0cml4V29ybGQpO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPWEubWF0cml4V29ybGROZWVkc1VwZGF0ZTt0aGlzLmxheWVycy5tYXNrPWEubGF5ZXJzLm1hc2s7dGhpcy52aXNpYmxlPWEudmlzaWJsZTsKdGhpcy5jYXN0U2hhZG93PWEuY2FzdFNoYWRvdzt0aGlzLnJlY2VpdmVTaGFkb3c9YS5yZWNlaXZlU2hhZG93O3RoaXMuZnJ1c3R1bUN1bGxlZD1hLmZydXN0dW1DdWxsZWQ7dGhpcy5yZW5kZXJPcmRlcj1hLnJlbmRlck9yZGVyO3RoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhLnVzZXJEYXRhKSk7aWYoITA9PT1jKWZvcihjPTA7YzxhLmNoaWxkcmVuLmxlbmd0aDtjKyspdGhpcy5hZGQoYS5jaGlsZHJlbltjXS5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt5LnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp5LGlzU2NlbmU6ITAsY29weTpmdW5jdGlvbihhLGMpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEsYyk7bnVsbCE9PWEuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZD1hLmJhY2tncm91bmQuY2xvbmUoKSk7bnVsbCE9PWEuZm9nJiYodGhpcy5mb2c9YS5mb2cuY2xvbmUoKSk7Cm51bGwhPT1hLm92ZXJyaWRlTWF0ZXJpYWwmJih0aGlzLm92ZXJyaWRlTWF0ZXJpYWw9YS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCkpO3RoaXMuYXV0b1VwZGF0ZT1hLmF1dG9VcGRhdGU7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPWEubWF0cml4QXV0b1VwZGF0ZTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGEpe3ZhciBjPUEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSk7bnVsbCE9PXRoaXMuYmFja2dyb3VuZCYmKGMub2JqZWN0LmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTihhKSk7bnVsbCE9PXRoaXMuZm9nJiYoYy5vYmplY3QuZm9nPXRoaXMuZm9nLnRvSlNPTigpKTtyZXR1cm4gY30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTt2YXIga2Q9W25ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrXSxXYz1uZXcgayxnZj1uZXcgayxoZj1uZXcgayxqZj1uZXcgaywKRmQ9bmV3IGssR2Q9bmV3IGssZmU9bmV3IGssbGc9bmV3IGssaWg9bmV3IGssamg9bmV3IGssS2Q9bmV3IGs7T2JqZWN0LmFzc2lnbih3LnByb3RvdHlwZSx7aXNCb3gzOiEwLHNldDpmdW5jdGlvbihhLGMpe3RoaXMubWluLmNvcHkoYSk7dGhpcy5tYXguY29weShjKTtyZXR1cm4gdGhpc30sc2V0RnJvbUFycmF5OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1JbmZpbml0eSxlPUluZmluaXR5LGc9SW5maW5pdHkscj0tSW5maW5pdHksdj0tSW5maW5pdHksej0tSW5maW5pdHksRT0wLEY9YS5sZW5ndGg7RTxGO0UrPTMpe3ZhciBKPWFbRV0sUD1hW0UrMV0sUj1hW0UrMl07SjxjJiYoYz1KKTtQPGUmJihlPVApO1I8ZyYmKGc9Uik7Sj5yJiYocj1KKTtQPnYmJih2PVApO1I+eiYmKHo9Uil9dGhpcy5taW4uc2V0KGMsZSxnKTt0aGlzLm1heC5zZXQocix2LHopO3JldHVybiB0aGlzfSxzZXRGcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1JbmZpbml0eSxlPUluZmluaXR5LApnPUluZmluaXR5LHI9LUluZmluaXR5LHY9LUluZmluaXR5LHo9LUluZmluaXR5LEU9MCxGPWEuY291bnQ7RTxGO0UrKyl7dmFyIEo9YS5nZXRYKEUpLFA9YS5nZXRZKEUpLFI9YS5nZXRaKEUpO0o8YyYmKGM9Sik7UDxlJiYoZT1QKTtSPGcmJihnPVIpO0o+ciYmKHI9Sik7UD52JiYodj1QKTtSPnomJih6PVIpfXRoaXMubWluLnNldChjLGUsZyk7dGhpcy5tYXguc2V0KHIsdix6KTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihhKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgYz0wLGU9YS5sZW5ndGg7YzxlO2MrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYVtjXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKGEsYyl7Yz1XYy5jb3B5KGMpLm11bHRpcGx5U2NhbGFyKC41KTt0aGlzLm1pbi5jb3B5KGEpLnN1YihjKTt0aGlzLm1heC5jb3B5KGEpLmFkZChjKTtyZXR1cm4gdGhpc30sc2V0RnJvbU9iamVjdDpmdW5jdGlvbihhKXt0aGlzLm1ha2VFbXB0eSgpOwpyZXR1cm4gdGhpcy5leHBhbmRCeU9iamVjdChhKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5taW4uY29weShhLm1pbik7dGhpcy5tYXguY29weShhLm1heCk7cmV0dXJuIHRoaXN9LG1ha2VFbXB0eTpmdW5jdGlvbigpe3RoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PUluZmluaXR5O3RoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS1JbmZpbml0eTtyZXR1cm4gdGhpc30saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fSxnZXRDZW50ZXI6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/CmEuc2V0KDAsMCwwKTphLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX0sZ2V0U2l6ZTpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/YS5zZXQoMCwwLDApOmEuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9LGV4cGFuZEJ5UG9pbnQ6ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEpO3RoaXMubWF4Lm1heChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlWZWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5taW4uc3ViKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkU2NhbGFyKC1hKTt0aGlzLm1heC5hZGRTY2FsYXIoYSk7cmV0dXJuIHRoaXN9LGV4cGFuZEJ5T2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBjO2EudXBkYXRlV29ybGRNYXRyaXgoITEsCiExKTt2YXIgZT1hLmdlb21ldHJ5O2lmKHZvaWQgMCE9PWUpaWYoZS5pc0dlb21ldHJ5KXt2YXIgZz1lLnZlcnRpY2VzO2U9MDtmb3IoYz1nLmxlbmd0aDtlPGM7ZSsrKVdjLmNvcHkoZ1tlXSksV2MuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChXYyl9ZWxzZSBpZihlLmlzQnVmZmVyR2VvbWV0cnkmJihnPWUuYXR0cmlidXRlcy5wb3NpdGlvbix2b2lkIDAhPT1nKSlmb3IoZT0wLGM9Zy5jb3VudDtlPGM7ZSsrKVdjLmZyb21CdWZmZXJBdHRyaWJ1dGUoZyxlKS5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KFdjKTthPWEuY2hpbGRyZW47ZT0wO2ZvcihjPWEubGVuZ3RoO2U8YztlKyspdGhpcy5leHBhbmRCeU9iamVjdChhW2VdKTtyZXR1cm4gdGhpc30sY29udGFpbnNQb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gYS54PHRoaXMubWluLnh8fGEueD50aGlzLm1heC54fHxhLnk8dGhpcy5taW4ueXx8YS55PnRoaXMubWF4Lnl8fAphLno8dGhpcy5taW4uenx8YS56PnRoaXMubWF4Lno/ITE6ITB9LGNvbnRhaW5zQm94OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1pbi54PD1hLm1pbi54JiZhLm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD1hLm1pbi55JiZhLm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD1hLm1pbi56JiZhLm1heC56PD10aGlzLm1heC56fSxnZXRQYXJhbWV0ZXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3JldHVybiBjLnNldCgoYS54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLChhLnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKGEuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWF4Lng8dGhpcy5taW4ueHx8CmEubWluLng+dGhpcy5tYXgueHx8YS5tYXgueTx0aGlzLm1pbi55fHxhLm1pbi55PnRoaXMubWF4Lnl8fGEubWF4Lno8dGhpcy5taW4uenx8YS5taW4uej50aGlzLm1heC56PyExOiEwfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3RoaXMuY2xhbXBQb2ludChhLmNlbnRlcixXYyk7cmV0dXJuIFdjLmRpc3RhbmNlVG9TcXVhcmVkKGEuY2VudGVyKTw9YS5yYWRpdXMqYS5yYWRpdXN9LGludGVyc2VjdHNQbGFuZTpmdW5jdGlvbihhKXtpZigwPGEubm9ybWFsLngpe3ZhciBjPWEubm9ybWFsLngqdGhpcy5taW4ueDt2YXIgZT1hLm5vcm1hbC54KnRoaXMubWF4Lnh9ZWxzZSBjPWEubm9ybWFsLngqdGhpcy5tYXgueCxlPWEubm9ybWFsLngqdGhpcy5taW4ueDswPGEubm9ybWFsLnk/KGMrPWEubm9ybWFsLnkqdGhpcy5taW4ueSxlKz1hLm5vcm1hbC55KnRoaXMubWF4LnkpOihjKz1hLm5vcm1hbC55KnRoaXMubWF4LnksZSs9YS5ub3JtYWwueSp0aGlzLm1pbi55KTswPGEubm9ybWFsLno/CihjKz1hLm5vcm1hbC56KnRoaXMubWluLnosZSs9YS5ub3JtYWwueip0aGlzLm1heC56KTooYys9YS5ub3JtYWwueip0aGlzLm1heC56LGUrPWEubm9ybWFsLnoqdGhpcy5taW4ueik7cmV0dXJuIGM8PS1hLmNvbnN0YW50JiZlPj0tYS5jb25zdGFudH0saW50ZXJzZWN0c1RyaWFuZ2xlOmZ1bmN0aW9uKGEpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKGxnKTtpaC5zdWJWZWN0b3JzKHRoaXMubWF4LGxnKTtnZi5zdWJWZWN0b3JzKGEuYSxsZyk7aGYuc3ViVmVjdG9ycyhhLmIsbGcpO2pmLnN1YlZlY3RvcnMoYS5jLGxnKTtGZC5zdWJWZWN0b3JzKGhmLGdmKTtHZC5zdWJWZWN0b3JzKGpmLGhmKTtmZS5zdWJWZWN0b3JzKGdmLGpmKTthPVswLC1GZC56LEZkLnksMCwtR2QueixHZC55LDAsLWZlLnosZmUueSxGZC56LDAsLUZkLngsR2QueiwwLC1HZC54LGZlLnosMCwtZmUueCwtRmQueSxGZC54LDAsLUdkLnksR2QueCwwLC1mZS55LGZlLngsMF07aWYoIUMoYSwKZ2YsaGYsamYsaWgpKXJldHVybiExO2E9WzEsMCwwLDAsMSwwLDAsMCwxXTtpZighQyhhLGdmLGhmLGpmLGloKSlyZXR1cm4hMTtqaC5jcm9zc1ZlY3RvcnMoRmQsR2QpO2E9W2poLngsamgueSxqaC56XTtyZXR1cm4gQyhhLGdmLGhmLGpmLGloKX0sY2xhbXBQb2ludDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3JldHVybiBjLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFdjLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1YihhKS5sZW5ndGgoKX0sZ2V0Qm91bmRpbmdTcGhlcmU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmY29uc29sZS5lcnJvcigiVEhSRUUuQm94MzogLmdldEJvdW5kaW5nU3BoZXJlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpO3RoaXMuZ2V0Q2VudGVyKGEuY2VudGVyKTsKYS5yYWRpdXM9LjUqdGhpcy5nZXRTaXplKFdjKS5sZW5ndGgoKTtyZXR1cm4gYX0saW50ZXJzZWN0OmZ1bmN0aW9uKGEpe3RoaXMubWluLm1heChhLm1pbik7dGhpcy5tYXgubWluKGEubWF4KTt0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKTtyZXR1cm4gdGhpc30sdW5pb246ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEubWluKTt0aGlzLm1heC5tYXgoYS5tYXgpO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7a2RbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoYSk7a2RbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoYSk7a2RbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoYSk7a2RbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoYSk7CmtkWzRdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO2tkWzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpO2tkWzZdLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO2tkWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpO3RoaXMuc2V0RnJvbVBvaW50cyhrZCk7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihhKXt0aGlzLm1pbi5hZGQoYSk7dGhpcy5tYXguYWRkKGEpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWluLmVxdWFscyh0aGlzLm1pbikmJmEubWF4LmVxdWFscyh0aGlzLm1heCl9fSk7dmFyIERtPW5ldyB3O09iamVjdC5hc3NpZ24oRy5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMuY2VudGVyLmNvcHkoYSk7dGhpcy5yYWRpdXM9CmM7cmV0dXJuIHRoaXN9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmNlbnRlcjt2b2lkIDAhPT1jP2UuY29weShjKTpEbS5zZXRGcm9tUG9pbnRzKGEpLmdldENlbnRlcihlKTtmb3IodmFyIGc9Yz0wLHI9YS5sZW5ndGg7ZzxyO2crKyljPU1hdGgubWF4KGMsZS5kaXN0YW5jZVRvU3F1YXJlZChhW2ddKSk7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLmNlbnRlci5jb3B5KGEuY2VudGVyKTt0aGlzLnJhZGl1cz1hLnJhZGl1cztyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gMD49dGhpcy5yYWRpdXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c30sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLQp0aGlzLnJhZGl1c30saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnJhZGl1cythLnJhZGl1cztyZXR1cm4gYS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1jKmN9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicyhhLmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c30sY2xhbXBQb2ludDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKGEpO3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLlNwaGVyZTogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7Yy5jb3B5KGEpO2U+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihjLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksYy5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSk7CnJldHVybiBjfSxnZXRCb3VuZGluZ0JveDpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5TcGhlcmU6IC5nZXRCb3VuZGluZ0JveCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyB3KTthLnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlcik7YS5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyk7cmV0dXJuIGF9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQoYSk7dGhpcy5yYWRpdXMqPWEuZ2V0TWF4U2NhbGVPbkF4aXMoKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEpe3RoaXMuY2VudGVyLmFkZChhKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZhLnJhZGl1cz09PXRoaXMucmFkaXVzfX0pO3ZhciBsZD1uZXcgayx5aT1uZXcgayxraD1uZXcgayxIZD1uZXcgayx6aT1uZXcgayxsaD1uZXcgayxBaT1uZXcgazsKT2JqZWN0LmFzc2lnbihELnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5vcmlnaW4uY29weShhKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm9yaWdpbi5jb3B5KGEub3JpZ2luKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGEuZGlyZWN0aW9uKTtyZXR1cm4gdGhpc30sYXQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5hdCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtyZXR1cm4gYy5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5vcmlnaW4pfSxsb29rQXQ6ZnVuY3Rpb24oYSl7dGhpcy5kaXJlY3Rpb24uY29weShhKS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzfSxyZWNhc3Q6ZnVuY3Rpb24oYSl7dGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KGEsCmxkKSk7cmV0dXJuIHRoaXN9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO2Muc3ViVmVjdG9ycyhhLHRoaXMub3JpZ2luKTthPWMuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gMD5hP2MuY29weSh0aGlzLm9yaWdpbik6Yy5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5vcmlnaW4pfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGEpKX0sZGlzdGFuY2VTcVRvUG9pbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9bGQuc3ViVmVjdG9ycyhhLHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA+YylyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoYSk7bGQuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYykuYWRkKHRoaXMub3JpZ2luKTsKcmV0dXJuIGxkLmRpc3RhbmNlVG9TcXVhcmVkKGEpfSxkaXN0YW5jZVNxVG9TZWdtZW50OmZ1bmN0aW9uKGEsYyxlLGcpe3lpLmNvcHkoYSkuYWRkKGMpLm11bHRpcGx5U2NhbGFyKC41KTtraC5jb3B5KGMpLnN1YihhKS5ub3JtYWxpemUoKTtIZC5jb3B5KHRoaXMub3JpZ2luKS5zdWIoeWkpO3ZhciByPS41KmEuZGlzdGFuY2VUbyhjKSx2PS10aGlzLmRpcmVjdGlvbi5kb3Qoa2gpLHo9SGQuZG90KHRoaXMuZGlyZWN0aW9uKSxFPS1IZC5kb3Qoa2gpLEY9SGQubGVuZ3RoU3EoKSxKPU1hdGguYWJzKDEtdip2KTtpZigwPEope2E9dipFLXo7Yz12KnotRTt2YXIgUD1yKko7MDw9YT9jPj0tUD9jPD1QPyhyPTEvSixhKj1yLGMqPXIsdj1hKihhK3YqYysyKnopK2MqKHYqYStjKzIqRSkrRik6KGM9cixhPU1hdGgubWF4KDAsLSh2KmMreikpLHY9LWEqYStjKihjKzIqRSkrRik6KGM9LXIsYT1NYXRoLm1heCgwLC0odipjK3opKSx2PS1hKmErYyooYysyKkUpK0YpOmM8PS1QPyhhPU1hdGgubWF4KDAsCi0oLXYqcit6KSksYz0wPGE/LXI6TWF0aC5taW4oTWF0aC5tYXgoLXIsLUUpLHIpLHY9LWEqYStjKihjKzIqRSkrRik6Yzw9UD8oYT0wLGM9TWF0aC5taW4oTWF0aC5tYXgoLXIsLUUpLHIpLHY9YyooYysyKkUpK0YpOihhPU1hdGgubWF4KDAsLSh2KnIreikpLGM9MDxhP3I6TWF0aC5taW4oTWF0aC5tYXgoLXIsLUUpLHIpLHY9LWEqYStjKihjKzIqRSkrRil9ZWxzZSBjPTA8dj8tcjpyLGE9TWF0aC5tYXgoMCwtKHYqYyt6KSksdj0tYSphK2MqKGMrMipFKStGO2UmJmUuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMub3JpZ2luKTtnJiZnLmNvcHkoa2gpLm11bHRpcGx5U2NhbGFyKGMpLmFkZCh5aSk7cmV0dXJuIHZ9LGludGVyc2VjdFNwaGVyZTpmdW5jdGlvbihhLGMpe2xkLnN1YlZlY3RvcnMoYS5jZW50ZXIsdGhpcy5vcmlnaW4pO3ZhciBlPWxkLmRvdCh0aGlzLmRpcmVjdGlvbiksZz1sZC5kb3QobGQpLWUqZTthPWEucmFkaXVzKmEucmFkaXVzOwppZihnPmEpcmV0dXJuIG51bGw7YT1NYXRoLnNxcnQoYS1nKTtnPWUtYTtlKz1hO3JldHVybiAwPmcmJjA+ZT9udWxsOjA+Zz90aGlzLmF0KGUsYyk6dGhpcy5hdChnLGMpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGEuY2VudGVyKTw9YS5yYWRpdXMqYS5yYWRpdXN9LGRpc3RhbmNlVG9QbGFuZTpmdW5jdGlvbihhKXt2YXIgYz1hLm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1jKXJldHVybiAwPT09YS5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDthPS0odGhpcy5vcmlnaW4uZG90KGEubm9ybWFsKSthLmNvbnN0YW50KS9jO3JldHVybiAwPD1hP2E6bnVsbH0saW50ZXJzZWN0UGxhbmU6ZnVuY3Rpb24oYSxjKXthPXRoaXMuZGlzdGFuY2VUb1BsYW5lKGEpO3JldHVybiBudWxsPT09YT9udWxsOnRoaXMuYXQoYSxjKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGEpe3ZhciBjPWEuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTsKcmV0dXJuIDA9PT1jfHwwPmEubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqYz8hMDohMX0saW50ZXJzZWN0Qm94OmZ1bmN0aW9uKGEsYyl7dmFyIGU9MS90aGlzLmRpcmVjdGlvbi54O3ZhciBnPTEvdGhpcy5kaXJlY3Rpb24ueTt2YXIgcj0xL3RoaXMuZGlyZWN0aW9uLnosdj10aGlzLm9yaWdpbjtpZigwPD1lKXt2YXIgej0oYS5taW4ueC12LngpKmU7ZSo9YS5tYXgueC12Lnh9ZWxzZSB6PShhLm1heC54LXYueCkqZSxlKj1hLm1pbi54LXYueDtpZigwPD1nKXt2YXIgRT0oYS5taW4ueS12LnkpKmc7Zyo9YS5tYXgueS12Lnl9ZWxzZSBFPShhLm1heC55LXYueSkqZyxnKj1hLm1pbi55LXYueTtpZih6Pmd8fEU+ZSlyZXR1cm4gbnVsbDtpZihFPnp8fHohPT16KXo9RTtpZihnPGV8fGUhPT1lKWU9ZzswPD1yPyhFPShhLm1pbi56LXYueikqcixhPShhLm1heC56LXYueikqcik6KEU9KGEubWF4Lnotdi56KSpyLGE9KGEubWluLnotdi56KSpyKTtpZih6PmF8fEU+ZSlyZXR1cm4gbnVsbDsKaWYoRT56fHx6IT09eil6PUU7aWYoYTxlfHxlIT09ZSllPWE7cmV0dXJuIDA+ZT9udWxsOnRoaXMuYXQoMDw9ej96OmUsYyl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveChhLGxkKX0saW50ZXJzZWN0VHJpYW5nbGU6ZnVuY3Rpb24oYSxjLGUsZyxyKXt6aS5zdWJWZWN0b3JzKGMsYSk7bGguc3ViVmVjdG9ycyhlLGEpO0FpLmNyb3NzVmVjdG9ycyh6aSxsaCk7Yz10aGlzLmRpcmVjdGlvbi5kb3QoQWkpO2lmKDA8Yyl7aWYoZylyZXR1cm4gbnVsbDtnPTF9ZWxzZSBpZigwPmMpZz0tMSxjPS1jO2Vsc2UgcmV0dXJuIG51bGw7SGQuc3ViVmVjdG9ycyh0aGlzLm9yaWdpbixhKTthPWcqdGhpcy5kaXJlY3Rpb24uZG90KGxoLmNyb3NzVmVjdG9ycyhIZCxsaCkpO2lmKDA+YSlyZXR1cm4gbnVsbDtlPWcqdGhpcy5kaXJlY3Rpb24uZG90KHppLmNyb3NzKEhkKSk7aWYoMD5lfHxhK2U+YylyZXR1cm4gbnVsbDthPS1nKkhkLmRvdChBaSk7CnJldHVybiAwPmE/bnVsbDp0aGlzLmF0KGEvYyxyKX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe3RoaXMub3JpZ2luLmFwcGx5TWF0cml4NChhKTt0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmYS5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX19KTt2YXIgSWM9bmV3IGssbWQ9bmV3IGssQmk9bmV3IGssbmQ9bmV3IGssa2Y9bmV3IGssbGY9bmV3IGssaWs9bmV3IGssQ2k9bmV3IGssRGk9bmV3IGssRWk9bmV3IGs7T2JqZWN0LmFzc2lnbihCLHtnZXROb3JtYWw6ZnVuY3Rpb24oYSxjLGUsZyl7dm9pZCAwPT09ZyYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXROb3JtYWwoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksZz1uZXcgayk7Zy5zdWJWZWN0b3JzKGUsYyk7SWMuc3ViVmVjdG9ycyhhLGMpO2cuY3Jvc3MoSWMpOwphPWcubGVuZ3RoU3EoKTtyZXR1cm4gMDxhP2cubXVsdGlwbHlTY2FsYXIoMS9NYXRoLnNxcnQoYSkpOmcuc2V0KDAsMCwwKX0sZ2V0QmFyeWNvb3JkOmZ1bmN0aW9uKGEsYyxlLGcscil7SWMuc3ViVmVjdG9ycyhnLGMpO21kLnN1YlZlY3RvcnMoZSxjKTtCaS5zdWJWZWN0b3JzKGEsYyk7YT1JYy5kb3QoSWMpO2M9SWMuZG90KG1kKTtlPUljLmRvdChCaSk7dmFyIHY9bWQuZG90KG1kKTtnPW1kLmRvdChCaSk7dmFyIHo9YSp2LWMqYzt2b2lkIDA9PT1yJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmdldEJhcnljb29yZCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxyPW5ldyBrKTtpZigwPT09eilyZXR1cm4gci5zZXQoLTIsLTEsLTEpO3o9MS96O3Y9KHYqZS1jKmcpKno7YT0oYSpnLWMqZSkqejtyZXR1cm4gci5zZXQoMS12LWEsYSx2KX0sY29udGFpbnNQb2ludDpmdW5jdGlvbihhLGMsZSxnKXtCLmdldEJhcnljb29yZChhLGMsZSxnLG5kKTtyZXR1cm4gMDw9bmQueCYmCjA8PW5kLnkmJjE+PW5kLngrbmQueX0sZ2V0VVY6ZnVuY3Rpb24oYSxjLGUsZyxyLHYseixFKXt0aGlzLmdldEJhcnljb29yZChhLGMsZSxnLG5kKTtFLnNldCgwLDApO0UuYWRkU2NhbGVkVmVjdG9yKHIsbmQueCk7RS5hZGRTY2FsZWRWZWN0b3IodixuZC55KTtFLmFkZFNjYWxlZFZlY3Rvcih6LG5kLnopO3JldHVybiBFfSxpc0Zyb250RmFjaW5nOmZ1bmN0aW9uKGEsYyxlLGcpe0ljLnN1YlZlY3RvcnMoZSxjKTttZC5zdWJWZWN0b3JzKGEsYyk7cmV0dXJuIDA+SWMuY3Jvc3MobWQpLmRvdChnKT8hMDohMX19KTtPYmplY3QuYXNzaWduKEIucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSxjLGUpe3RoaXMuYS5jb3B5KGEpO3RoaXMuYi5jb3B5KGMpO3RoaXMuYy5jb3B5KGUpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczpmdW5jdGlvbihhLGMsZSxnKXt0aGlzLmEuY29weShhW2NdKTt0aGlzLmIuY29weShhW2VdKTt0aGlzLmMuY29weShhW2ddKTtyZXR1cm4gdGhpc30sCmNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYS5jb3B5KGEuYSk7dGhpcy5iLmNvcHkoYS5iKTt0aGlzLmMuY29weShhLmMpO3JldHVybiB0aGlzfSxnZXRBcmVhOmZ1bmN0aW9uKCl7SWMuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKTttZC5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpO3JldHVybi41KkljLmNyb3NzKG1kKS5sZW5ndGgoKX0sZ2V0TWlkcG9pbnQ6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRNaWRwb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9LGdldE5vcm1hbDpmdW5jdGlvbihhKXtyZXR1cm4gQi5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsYSl9LGdldFBsYW5lOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmdldFBsYW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3JldHVybiBhLnNldEZyb21Db3BsYW5hclBvaW50cyh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LGdldEJhcnljb29yZDpmdW5jdGlvbihhLGMpe3JldHVybiBCLmdldEJhcnljb29yZChhLHRoaXMuYSx0aGlzLmIsdGhpcy5jLGMpfSxnZXRVVjpmdW5jdGlvbihhLGMsZSxnLHIpe3JldHVybiBCLmdldFVWKGEsdGhpcy5hLHRoaXMuYix0aGlzLmMsYyxlLGcscil9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEIuY29udGFpbnNQb2ludChhLHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0saXNGcm9udEZhY2luZzpmdW5jdGlvbihhKXtyZXR1cm4gQi5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLGEpfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLmludGVyc2VjdHNUcmlhbmdsZSh0aGlzKX0sY2xvc2VzdFBvaW50VG9Qb2ludDpmdW5jdGlvbihhLApjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7dmFyIGU9dGhpcy5hLGc9dGhpcy5iLHI9dGhpcy5jO2tmLnN1YlZlY3RvcnMoZyxlKTtsZi5zdWJWZWN0b3JzKHIsZSk7Q2kuc3ViVmVjdG9ycyhhLGUpO3ZhciB2PWtmLmRvdChDaSksej1sZi5kb3QoQ2kpO2lmKDA+PXYmJjA+PXopcmV0dXJuIGMuY29weShlKTtEaS5zdWJWZWN0b3JzKGEsZyk7dmFyIEU9a2YuZG90KERpKSxGPWxmLmRvdChEaSk7aWYoMDw9RSYmRjw9RSlyZXR1cm4gYy5jb3B5KGcpO3ZhciBKPXYqRi1FKno7aWYoMD49SiYmMDw9diYmMD49RSlyZXR1cm4gZz12Lyh2LUUpLGMuY29weShlKS5hZGRTY2FsZWRWZWN0b3Ioa2YsZyk7RWkuc3ViVmVjdG9ycyhhLHIpO2E9a2YuZG90KEVpKTt2YXIgUD1sZi5kb3QoRWkpO2lmKDA8PVAmJmE8PVApcmV0dXJuIGMuY29weShyKTt2PWEqei0KdipQO2lmKDA+PXYmJjA8PXomJjA+PVApcmV0dXJuIEo9ei8oei1QKSxjLmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKGxmLEopO3o9RSpQLWEqRjtpZigwPj16JiYwPD1GLUUmJjA8PWEtUClyZXR1cm4gaWsuc3ViVmVjdG9ycyhyLGcpLEo9KEYtRSkvKEYtRSsoYS1QKSksYy5jb3B5KGcpLmFkZFNjYWxlZFZlY3RvcihpayxKKTtyPTEvKHorditKKTtnPXYqcjtKKj1yO3JldHVybiBjLmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKGtmLGcpLmFkZFNjYWxlZFZlY3RvcihsZixKKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmEuZXF1YWxzKHRoaXMuYSkmJmEuYi5lcXVhbHModGhpcy5iKSYmYS5jLmVxdWFscyh0aGlzLmMpfX0pO3ZhciBFbT17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSwKYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LApkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsCmxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NywKbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LApyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LGxjPXtoOjAsCnM6MCxsOjB9LG1oPXtoOjAsczowLGw6MH07T2JqZWN0LmFzc2lnbihJLnByb3RvdHlwZSx7aXNDb2xvcjohMCxyOjEsZzoxLGI6MSxzZXQ6ZnVuY3Rpb24oYSl7YSYmYS5pc0NvbG9yP3RoaXMuY29weShhKToibnVtYmVyIj09PXR5cGVvZiBhP3RoaXMuc2V0SGV4KGEpOiJzdHJpbmciPT09dHlwZW9mIGEmJnRoaXMuc2V0U3R5bGUoYSk7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLmI9dGhpcy5nPXRoaXMucj1hO3JldHVybiB0aGlzfSxzZXRIZXg6ZnVuY3Rpb24oYSl7YT1NYXRoLmZsb29yKGEpO3RoaXMucj0oYT4+MTYmMjU1KS8yNTU7dGhpcy5nPShhPj44JjI1NSkvMjU1O3RoaXMuYj0oYSYyNTUpLzI1NTtyZXR1cm4gdGhpc30sc2V0UkdCOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnI9YTt0aGlzLmc9Yzt0aGlzLmI9ZTtyZXR1cm4gdGhpc30sc2V0SFNMOmZ1bmN0aW9uKGEsYyxlKXthPWhiLmV1Y2xpZGVhbk1vZHVsbyhhLDEpO2M9aGIuY2xhbXAoYywwLAoxKTtlPWhiLmNsYW1wKGUsMCwxKTswPT09Yz90aGlzLnI9dGhpcy5nPXRoaXMuYj1lOihjPS41Pj1lP2UqKDErYyk6ZStjLWUqYyxlPTIqZS1jLHRoaXMucj1OKGUsYyxhKzEvMyksdGhpcy5nPU4oZSxjLGEpLHRoaXMuYj1OKGUsYyxhLTEvMykpO3JldHVybiB0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbihhKXtmdW5jdGlvbiBjKHope3ZvaWQgMCE9PXomJjE+cGFyc2VGbG9hdCh6KSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrYSsiIHdpbGwgYmUgaWdub3JlZC4iKX12YXIgZTtpZihlPS9eKCg/OnJnYnxoc2wpYT8pXChccyooW15cKV0qKVwpLy5leGVjKGEpKXt2YXIgZz1lWzJdO3N3aXRjaChlWzFdKXtjYXNlICJyZ2IiOmNhc2UgInJnYmEiOmlmKGU9L14oXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMoZykpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigyNTUscGFyc2VJbnQoZVsxXSwKMTApKS8yNTUsdGhpcy5nPU1hdGgubWluKDI1NSxwYXJzZUludChlWzJdLDEwKSkvMjU1LHRoaXMuYj1NYXRoLm1pbigyNTUscGFyc2VJbnQoZVszXSwxMCkpLzI1NSxjKGVbNV0pLHRoaXM7aWYoZT0vXihcZCspJVxzKixccyooXGQrKSVccyosXHMqKFxkKyklXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyhnKSlyZXR1cm4gdGhpcy5yPU1hdGgubWluKDEwMCxwYXJzZUludChlWzFdLDEwKSkvMTAwLHRoaXMuZz1NYXRoLm1pbigxMDAscGFyc2VJbnQoZVsyXSwxMCkpLzEwMCx0aGlzLmI9TWF0aC5taW4oMTAwLHBhcnNlSW50KGVbM10sMTApKS8xMDAsYyhlWzVdKSx0aGlzO2JyZWFrO2Nhc2UgImhzbCI6Y2FzZSAiaHNsYSI6aWYoZT0vXihbMC05XSpcLj9bMC05XSspXHMqLFxzKihcZCspJVxzKixccyooXGQrKSVccyooLFxzKihbMC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKGcpKXtnPXBhcnNlRmxvYXQoZVsxXSkvMzYwO3ZhciByPXBhcnNlSW50KGVbMl0sCjEwKS8xMDAsdj1wYXJzZUludChlWzNdLDEwKS8xMDA7YyhlWzVdKTtyZXR1cm4gdGhpcy5zZXRIU0woZyxyLHYpfX19ZWxzZSBpZihlPS9eIyhbQS1GYS1mMC05XSspJC8uZXhlYyhhKSl7ZT1lWzFdO2c9ZS5sZW5ndGg7aWYoMz09PWcpcmV0dXJuIHRoaXMucj1wYXJzZUludChlLmNoYXJBdCgwKStlLmNoYXJBdCgwKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludChlLmNoYXJBdCgxKStlLmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludChlLmNoYXJBdCgyKStlLmNoYXJBdCgyKSwxNikvMjU1LHRoaXM7aWYoNj09PWcpcmV0dXJuIHRoaXMucj1wYXJzZUludChlLmNoYXJBdCgwKStlLmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludChlLmNoYXJBdCgyKStlLmNoYXJBdCgzKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludChlLmNoYXJBdCg0KStlLmNoYXJBdCg1KSwxNikvMjU1LHRoaXN9YSYmMDxhLmxlbmd0aCYmKGU9RW1bYV0sdm9pZCAwIT09ZT90aGlzLnNldEhleChlKToKY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK2EpKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMucj1hLnI7dGhpcy5nPWEuZzt0aGlzLmI9YS5iO3JldHVybiB0aGlzfSxjb3B5R2FtbWFUb0xpbmVhcjpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTIpO3RoaXMucj1NYXRoLnBvdyhhLnIsYyk7dGhpcy5nPU1hdGgucG93KGEuZyxjKTt0aGlzLmI9TWF0aC5wb3coYS5iLGMpO3JldHVybiB0aGlzfSxjb3B5TGluZWFyVG9HYW1tYTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTIpO2M9MDxjPzEvYzoxO3RoaXMucj1NYXRoLnBvdyhhLnIsYyk7dGhpcy5nPU1hdGgucG93KGEuZyxjKTt0aGlzLmI9TWF0aC5wb3coYS5iLGMpO3JldHVybiB0aGlzfSxjb252ZXJ0R2FtbWFUb0xpbmVhcjpmdW5jdGlvbihhKXt0aGlzLmNvcHlHYW1tYVRvTGluZWFyKHRoaXMsCmEpO3JldHVybiB0aGlzfSxjb252ZXJ0TGluZWFyVG9HYW1tYTpmdW5jdGlvbihhKXt0aGlzLmNvcHlMaW5lYXJUb0dhbW1hKHRoaXMsYSk7cmV0dXJuIHRoaXN9LGNvcHlTUkdCVG9MaW5lYXI6ZnVuY3Rpb24oYSl7dGhpcy5yPU8oYS5yKTt0aGlzLmc9TyhhLmcpO3RoaXMuYj1PKGEuYik7cmV0dXJuIHRoaXN9LGNvcHlMaW5lYXJUb1NSR0I6ZnVuY3Rpb24oYSl7dGhpcy5yPUgoYS5yKTt0aGlzLmc9SChhLmcpO3RoaXMuYj1IKGEuYik7cmV0dXJuIHRoaXN9LGNvbnZlcnRTUkdCVG9MaW5lYXI6ZnVuY3Rpb24oKXt0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyk7cmV0dXJuIHRoaXN9LGNvbnZlcnRMaW5lYXJUb1NSR0I6ZnVuY3Rpb24oKXt0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyk7cmV0dXJuIHRoaXN9LGdldEhleDpmdW5jdGlvbigpe3JldHVybiAyNTUqdGhpcy5yPDwxNl4yNTUqdGhpcy5nPDw4XjI1NSp0aGlzLmI8PDB9LGdldEhleFN0cmluZzpmdW5jdGlvbigpe3JldHVybigiMDAwMDAwIisKdGhpcy5nZXRIZXgoKS50b1N0cmluZygxNikpLnNsaWNlKC02KX0sZ2V0SFNMOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9e2g6MCxzOjAsbDowfSk7dmFyIGM9dGhpcy5yLGU9dGhpcy5nLGc9dGhpcy5iLHI9TWF0aC5tYXgoYyxlLGcpLHY9TWF0aC5taW4oYyxlLGcpLHosRT0odityKS8yO2lmKHY9PT1yKXY9ej0wO2Vsc2V7dmFyIEY9ci12O3Y9LjU+PUU/Ri8ocit2KTpGLygyLXItdik7c3dpdGNoKHIpe2Nhc2UgYzp6PShlLWcpL0YrKGU8Zz82OjApO2JyZWFrO2Nhc2UgZTp6PShnLWMpL0YrMjticmVhaztjYXNlIGc6ej0oYy1lKS9GKzR9ei89Nn1hLmg9ejthLnM9djthLmw9RTtyZXR1cm4gYX0sZ2V0U3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm4icmdiKCIrKDI1NSp0aGlzLnJ8MCkrIiwiKygyNTUqdGhpcy5nfDApKyIsIisoMjU1KnRoaXMuYnwwKSsiKSJ9LG9mZnNldEhTTDpmdW5jdGlvbihhLApjLGUpe3RoaXMuZ2V0SFNMKGxjKTtsYy5oKz1hO2xjLnMrPWM7bGMubCs9ZTt0aGlzLnNldEhTTChsYy5oLGxjLnMsbGMubCk7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhKXt0aGlzLnIrPWEucjt0aGlzLmcrPWEuZzt0aGlzLmIrPWEuYjtyZXR1cm4gdGhpc30sYWRkQ29sb3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy5yPWEucitjLnI7dGhpcy5nPWEuZytjLmc7dGhpcy5iPWEuYitjLmI7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLnIrPWE7dGhpcy5nKz1hO3RoaXMuYis9YTtyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGEpe3RoaXMucj1NYXRoLm1heCgwLHRoaXMuci1hLnIpO3RoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy1hLmcpO3RoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi1hLmIpO3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhKXt0aGlzLnIqPWEucjt0aGlzLmcqPWEuZzt0aGlzLmIqPWEuYjtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5yKj0KYTt0aGlzLmcqPWE7dGhpcy5iKj1hO3JldHVybiB0aGlzfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy5yKz0oYS5yLXRoaXMucikqYzt0aGlzLmcrPShhLmctdGhpcy5nKSpjO3RoaXMuYis9KGEuYi10aGlzLmIpKmM7cmV0dXJuIHRoaXN9LGxlcnBIU0w6ZnVuY3Rpb24oYSxjKXt0aGlzLmdldEhTTChsYyk7YS5nZXRIU0wobWgpO2E9aGIubGVycChsYy5oLG1oLmgsYyk7dmFyIGU9aGIubGVycChsYy5zLG1oLnMsYyk7Yz1oYi5sZXJwKGxjLmwsbWgubCxjKTt0aGlzLnNldEhTTChhLGUsYyk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5yPT09dGhpcy5yJiZhLmc9PT10aGlzLmcmJmEuYj09PXRoaXMuYn0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy5yPWFbY107dGhpcy5nPWFbYysxXTt0aGlzLmI9YVtjKzJdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PQpjJiYoYz0wKTthW2NdPXRoaXMucjthW2MrMV09dGhpcy5nO2FbYysyXT10aGlzLmI7cmV0dXJuIGF9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEhleCgpfX0pO09iamVjdC5hc3NpZ24oSy5wcm90b3R5cGUse2Nsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYT1hLmE7dGhpcy5iPWEuYjt0aGlzLmM9YS5jO3RoaXMubm9ybWFsLmNvcHkoYS5ub3JtYWwpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hdGVyaWFsSW5kZXg9YS5tYXRlcmlhbEluZGV4O2Zvcih2YXIgYz0wLGU9YS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDtjPGU7YysrKXRoaXMudmVydGV4Tm9ybWFsc1tjXT1hLnZlcnRleE5vcm1hbHNbY10uY2xvbmUoKTtjPTA7Zm9yKGU9YS52ZXJ0ZXhDb2xvcnMubGVuZ3RoO2M8ZTtjKyspdGhpcy52ZXJ0ZXhDb2xvcnNbY109YS52ZXJ0ZXhDb2xvcnNbY10uY2xvbmUoKTsKcmV0dXJuIHRoaXN9fSk7dmFyIFBrPTA7TS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TSxpc01hdGVyaWFsOiEwLG9uQmVmb3JlQ29tcGlsZTpmdW5jdGlvbigpe30sc2V0VmFsdWVzOmZ1bmN0aW9uKGEpe2lmKHZvaWQgMCE9PWEpZm9yKHZhciBjIGluIGEpe3ZhciBlPWFbY107aWYodm9pZCAwPT09ZSljb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAnIitjKyInIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIik7ZWxzZSBpZigic2hhZGluZyI9PT1jKWNvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpLHRoaXMuZmxhdFNoYWRpbmc9MT09PWU/ITA6ITE7ZWxzZXt2YXIgZz10aGlzW2NdO3ZvaWQgMD09PWc/Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAnIitjKyInIGlzIG5vdCBhIHByb3BlcnR5IG9mIHRoaXMgbWF0ZXJpYWwuIik6CmcmJmcuaXNDb2xvcj9nLnNldChlKTpnJiZnLmlzVmVjdG9yMyYmZSYmZS5pc1ZlY3RvcjM/Zy5jb3B5KGUpOnRoaXNbY109ZX19fSx0b0pTT046ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhyKXt2YXIgdj1bXSx6O2Zvcih6IGluIHIpe3ZhciBFPXJbel07ZGVsZXRlIEUubWV0YWRhdGE7di5wdXNoKEUpfXJldHVybiB2fXZhciBlPXZvaWQgMD09PWF8fCJzdHJpbmciPT09dHlwZW9mIGE7ZSYmKGE9e3RleHR1cmVzOnt9LGltYWdlczp7fX0pO3ZhciBnPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O2cudXVpZD10aGlzLnV1aWQ7Zy50eXBlPXRoaXMudHlwZTsiIiE9PXRoaXMubmFtZSYmKGcubmFtZT10aGlzLm5hbWUpO3RoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKGcuY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5yb3VnaG5lc3MmJihnLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyk7CnZvaWQgMCE9PXRoaXMubWV0YWxuZXNzJiYoZy5tZXRhbG5lc3M9dGhpcy5tZXRhbG5lc3MpO3RoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKGcuZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eSYmMSE9PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJihnLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpO3RoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKGcuc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5zaGluaW5lc3MmJihnLnNoaW5pbmVzcz10aGlzLnNoaW5pbmVzcyk7dm9pZCAwIT09dGhpcy5jbGVhcmNvYXQmJihnLmNsZWFyY29hdD10aGlzLmNsZWFyY29hdCk7dm9pZCAwIT09dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MmJihnLmNsZWFyY29hdFJvdWdobmVzcz10aGlzLmNsZWFyY29hdFJvdWdobmVzcyk7dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAmJgp0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUmJihnLmNsZWFyY29hdE5vcm1hbE1hcD10aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04oYSkudXVpZCxnLmNsZWFyY29hdE5vcm1hbFNjYWxlPXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpKTt0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYoZy5tYXA9dGhpcy5tYXAudG9KU09OKGEpLnV1aWQpO3RoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihnLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04oYSkudXVpZCk7dGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihnLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYoZy5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLmFvTWFwJiZ0aGlzLmFvTWFwLmlzVGV4dHVyZSYmKGcuYW9NYXA9dGhpcy5hb01hcC50b0pTT04oYSkudXVpZCwKZy5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KTt0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihnLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTihhKS51dWlkLGcuYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKTt0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYoZy5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKGEpLnV1aWQsZy5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxnLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKTt0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYoZy5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKGEpLnV1aWQsZy5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLGcuZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpO3RoaXMucm91Z2huZXNzTWFwJiYKdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYoZy5yb3VnaG5lc3NNYXA9dGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMubWV0YWxuZXNzTWFwJiZ0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUmJihnLm1ldGFsbmVzc01hcD10aGlzLm1ldGFsbmVzc01hcC50b0pTT04oYSkudXVpZCk7dGhpcy5lbWlzc2l2ZU1hcCYmdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUmJihnLmVtaXNzaXZlTWFwPXRoaXMuZW1pc3NpdmVNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMuc3BlY3VsYXJNYXAmJnRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlJiYoZy5zcGVjdWxhck1hcD10aGlzLnNwZWN1bGFyTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYoZy5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKGEpLnV1aWQsZy5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHksZy5yZWZyYWN0aW9uUmF0aW89dGhpcy5yZWZyYWN0aW9uUmF0aW8sCnZvaWQgMCE9PXRoaXMuY29tYmluZSYmKGcuY29tYmluZT10aGlzLmNvbWJpbmUpLHZvaWQgMCE9PXRoaXMuZW52TWFwSW50ZW5zaXR5JiYoZy5lbnZNYXBJbnRlbnNpdHk9dGhpcy5lbnZNYXBJbnRlbnNpdHkpKTt0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKGcuZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04oYSkudXVpZCk7dm9pZCAwIT09dGhpcy5zaXplJiYoZy5zaXplPXRoaXMuc2l6ZSk7dm9pZCAwIT09dGhpcy5zaXplQXR0ZW51YXRpb24mJihnLnNpemVBdHRlbnVhdGlvbj10aGlzLnNpemVBdHRlbnVhdGlvbik7MSE9PXRoaXMuYmxlbmRpbmcmJihnLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpOyEwPT09dGhpcy5mbGF0U2hhZGluZyYmKGcuZmxhdFNoYWRpbmc9dGhpcy5mbGF0U2hhZGluZyk7MCE9PXRoaXMuc2lkZSYmKGcuc2lkZT10aGlzLnNpZGUpOzAhPT10aGlzLnZlcnRleENvbG9ycyYmKGcudmVydGV4Q29sb3JzPQp0aGlzLnZlcnRleENvbG9ycyk7MT50aGlzLm9wYWNpdHkmJihnLm9wYWNpdHk9dGhpcy5vcGFjaXR5KTshMD09PXRoaXMudHJhbnNwYXJlbnQmJihnLnRyYW5zcGFyZW50PXRoaXMudHJhbnNwYXJlbnQpO2cuZGVwdGhGdW5jPXRoaXMuZGVwdGhGdW5jO2cuZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0O2cuZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGU7Zy5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGU7Zy5zdGVuY2lsRnVuYz10aGlzLnN0ZW5jaWxGdW5jO2cuc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWY7Zy5zdGVuY2lsTWFzaz10aGlzLnN0ZW5jaWxNYXNrO2cuc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbDtnLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbDtnLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaUGFzczt0aGlzLnJvdGF0aW9uJiYwIT09dGhpcy5yb3RhdGlvbiYmKGcucm90YXRpb249dGhpcy5yb3RhdGlvbik7ITA9PT10aGlzLnBvbHlnb25PZmZzZXQmJgooZy5wb2x5Z29uT2Zmc2V0PSEwKTswIT09dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yJiYoZy5wb2x5Z29uT2Zmc2V0RmFjdG9yPXRoaXMucG9seWdvbk9mZnNldEZhY3Rvcik7MCE9PXRoaXMucG9seWdvbk9mZnNldFVuaXRzJiYoZy5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMpO3RoaXMubGluZXdpZHRoJiYxIT09dGhpcy5saW5ld2lkdGgmJihnLmxpbmV3aWR0aD10aGlzLmxpbmV3aWR0aCk7dm9pZCAwIT09dGhpcy5kYXNoU2l6ZSYmKGcuZGFzaFNpemU9dGhpcy5kYXNoU2l6ZSk7dm9pZCAwIT09dGhpcy5nYXBTaXplJiYoZy5nYXBTaXplPXRoaXMuZ2FwU2l6ZSk7dm9pZCAwIT09dGhpcy5zY2FsZSYmKGcuc2NhbGU9dGhpcy5zY2FsZSk7ITA9PT10aGlzLmRpdGhlcmluZyYmKGcuZGl0aGVyaW5nPSEwKTswPHRoaXMuYWxwaGFUZXN0JiYoZy5hbHBoYVRlc3Q9dGhpcy5hbHBoYVRlc3QpOyEwPT09dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEmJihnLnByZW11bHRpcGxpZWRBbHBoYT0KdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEpOyEwPT09dGhpcy53aXJlZnJhbWUmJihnLndpcmVmcmFtZT10aGlzLndpcmVmcmFtZSk7MTx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCYmKGcud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKTsicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lY2FwJiYoZy53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCk7InJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWpvaW4mJihnLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pOyEwPT09dGhpcy5tb3JwaFRhcmdldHMmJihnLm1vcnBoVGFyZ2V0cz0hMCk7ITA9PT10aGlzLm1vcnBoTm9ybWFscyYmKGcubW9ycGhOb3JtYWxzPSEwKTshMD09PXRoaXMuc2tpbm5pbmcmJihnLnNraW5uaW5nPSEwKTshMT09PXRoaXMudmlzaWJsZSYmKGcudmlzaWJsZT0hMSk7ITE9PT10aGlzLnRvbmVNYXBwZWQmJihnLnRvbmVNYXBwZWQ9ITEpOwoie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJihnLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO2UmJihlPWMoYS50ZXh0dXJlcyksYT1jKGEuaW1hZ2VzKSwwPGUubGVuZ3RoJiYoZy50ZXh0dXJlcz1lKSwwPGEubGVuZ3RoJiYoZy5pbWFnZXM9YSkpO3JldHVybiBnfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm5hbWU9YS5uYW1lO3RoaXMuZm9nPWEuZm9nO3RoaXMubGlnaHRzPWEubGlnaHRzO3RoaXMuYmxlbmRpbmc9YS5ibGVuZGluZzt0aGlzLnNpZGU9YS5zaWRlO3RoaXMuZmxhdFNoYWRpbmc9YS5mbGF0U2hhZGluZzt0aGlzLnZlcnRleENvbG9ycz1hLnZlcnRleENvbG9yczt0aGlzLm9wYWNpdHk9YS5vcGFjaXR5O3RoaXMudHJhbnNwYXJlbnQ9YS50cmFuc3BhcmVudDt0aGlzLmJsZW5kU3JjPWEuYmxlbmRTcmM7dGhpcy5ibGVuZERzdD1hLmJsZW5kRHN0O3RoaXMuYmxlbmRFcXVhdGlvbj0KYS5ibGVuZEVxdWF0aW9uO3RoaXMuYmxlbmRTcmNBbHBoYT1hLmJsZW5kU3JjQWxwaGE7dGhpcy5ibGVuZERzdEFscGhhPWEuYmxlbmREc3RBbHBoYTt0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1hLmJsZW5kRXF1YXRpb25BbHBoYTt0aGlzLmRlcHRoRnVuYz1hLmRlcHRoRnVuYzt0aGlzLmRlcHRoVGVzdD1hLmRlcHRoVGVzdDt0aGlzLmRlcHRoV3JpdGU9YS5kZXB0aFdyaXRlO3RoaXMuc3RlbmNpbFdyaXRlPWEuc3RlbmNpbFdyaXRlO3RoaXMuc3RlbmNpbEZ1bmM9YS5zdGVuY2lsRnVuYzt0aGlzLnN0ZW5jaWxSZWY9YS5zdGVuY2lsUmVmO3RoaXMuc3RlbmNpbE1hc2s9YS5zdGVuY2lsTWFzazt0aGlzLnN0ZW5jaWxGYWlsPWEuc3RlbmNpbEZhaWw7dGhpcy5zdGVuY2lsWkZhaWw9YS5zdGVuY2lsWkZhaWw7dGhpcy5zdGVuY2lsWlBhc3M9YS5zdGVuY2lsWlBhc3M7dGhpcy5jb2xvcldyaXRlPWEuY29sb3JXcml0ZTt0aGlzLnByZWNpc2lvbj1hLnByZWNpc2lvbjt0aGlzLnBvbHlnb25PZmZzZXQ9CmEucG9seWdvbk9mZnNldDt0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9YS5wb2x5Z29uT2Zmc2V0RmFjdG9yO3RoaXMucG9seWdvbk9mZnNldFVuaXRzPWEucG9seWdvbk9mZnNldFVuaXRzO3RoaXMuZGl0aGVyaW5nPWEuZGl0aGVyaW5nO3RoaXMuYWxwaGFUZXN0PWEuYWxwaGFUZXN0O3RoaXMucHJlbXVsdGlwbGllZEFscGhhPWEucHJlbXVsdGlwbGllZEFscGhhO3RoaXMudmlzaWJsZT1hLnZpc2libGU7dGhpcy50b25lTWFwcGVkPWEudG9uZU1hcHBlZDt0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYS51c2VyRGF0YSkpO3RoaXMuY2xpcFNoYWRvd3M9YS5jbGlwU2hhZG93czt0aGlzLmNsaXBJbnRlcnNlY3Rpb249YS5jbGlwSW50ZXJzZWN0aW9uO3ZhciBjPWEuY2xpcHBpbmdQbGFuZXMsZT1udWxsO2lmKG51bGwhPT1jKXt2YXIgZz1jLmxlbmd0aDtlPUFycmF5KGcpO2Zvcih2YXIgcj0wO3IhPT1nOysrcillW3JdPWNbcl0uY2xvbmUoKX10aGlzLmNsaXBwaW5nUGxhbmVzPQplO3RoaXMuc2hhZG93U2lkZT1hLnNoYWRvd1NpZGU7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7TC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7TC5wcm90b3R5cGUuY29uc3RydWN0b3I9TDtMLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsPSEwO0wucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubWFwPWEubWFwO3RoaXMubGlnaHRNYXA9YS5saWdodE1hcDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWEubGlnaHRNYXBJbnRlbnNpdHk7dGhpcy5hb01hcD1hLmFvTWFwO3RoaXMuYW9NYXBJbnRlbnNpdHk9YS5hb01hcEludGVuc2l0eTt0aGlzLnNwZWN1bGFyTWFwPWEuc3BlY3VsYXJNYXA7dGhpcy5hbHBoYU1hcD1hLmFscGhhTWFwO3RoaXMuZW52TWFwPWEuZW52TWFwOwp0aGlzLmNvbWJpbmU9YS5jb21iaW5lO3RoaXMucmVmbGVjdGl2aXR5PWEucmVmbGVjdGl2aXR5O3RoaXMucmVmcmFjdGlvblJhdGlvPWEucmVmcmFjdGlvblJhdGlvO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMud2lyZWZyYW1lTGluZWNhcD1hLndpcmVmcmFtZUxpbmVjYXA7dGhpcy53aXJlZnJhbWVMaW5lam9pbj1hLndpcmVmcmFtZUxpbmVqb2luO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0cztyZXR1cm4gdGhpc307T2JqZWN0LmRlZmluZVByb3BlcnR5KFEucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihhKXshMD09PWEmJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24oUS5wcm90b3R5cGUse2lzQnVmZmVyQXR0cmlidXRlOiEwLG9uVXBsb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9LHNldEFycmF5OmZ1bmN0aW9uKGEpe2lmKEFycmF5LmlzQXJyYXkoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTsKdGhpcy5jb3VudD12b2lkIDAhPT1hP2EubGVuZ3RoL3RoaXMuaXRlbVNpemU6MDt0aGlzLmFycmF5PWE7cmV0dXJuIHRoaXN9LHNldER5bmFtaWM6ZnVuY3Rpb24oYSl7dGhpcy5keW5hbWljPWE7cmV0dXJuIHRoaXN9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWEubmFtZTt0aGlzLmFycmF5PW5ldyBhLmFycmF5LmNvbnN0cnVjdG9yKGEuYXJyYXkpO3RoaXMuaXRlbVNpemU9YS5pdGVtU2l6ZTt0aGlzLmNvdW50PWEuY291bnQ7dGhpcy5ub3JtYWxpemVkPWEubm9ybWFsaXplZDt0aGlzLmR5bmFtaWM9YS5keW5hbWljO3JldHVybiB0aGlzfSxjb3B5QXQ6ZnVuY3Rpb24oYSxjLGUpe2EqPXRoaXMuaXRlbVNpemU7ZSo9Yy5pdGVtU2l6ZTtmb3IodmFyIGc9MCxyPXRoaXMuaXRlbVNpemU7ZzxyO2crKyl0aGlzLmFycmF5W2ErZ109Yy5hcnJheVtlK2ddO3JldHVybiB0aGlzfSxjb3B5QXJyYXk6ZnVuY3Rpb24oYSl7dGhpcy5hcnJheS5zZXQoYSk7cmV0dXJuIHRoaXN9LGNvcHlDb2xvcnNBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9CnRoaXMuYXJyYXksZT0wLGc9MCxyPWEubGVuZ3RoO2c8cjtnKyspe3ZhciB2PWFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IEkpO2NbZSsrXT12LnI7Y1tlKytdPXYuZztjW2UrK109di5ifXJldHVybiB0aGlzfSxjb3B5VmVjdG9yMnNBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5hcnJheSxlPTAsZz0wLHI9YS5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9YVtnXTt2b2lkIDA9PT12JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsZyksdj1uZXcgZik7Y1tlKytdPXYueDtjW2UrK109di55fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yM3NBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5hcnJheSxlPTAsZz0wLHI9YS5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9CmFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IGspO2NbZSsrXT12Lng7Y1tlKytdPXYueTtjW2UrK109di56fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yNHNBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5hcnJheSxlPTAsZz0wLHI9YS5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9YVtnXTt2b2lkIDA9PT12JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsZyksdj1uZXcgcCk7Y1tlKytdPXYueDtjW2UrK109di55O2NbZSsrXT12Lno7Y1tlKytdPXYud31yZXR1cm4gdGhpc30sc2V0OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy5hcnJheS5zZXQoYSxjKTtyZXR1cm4gdGhpc30sZ2V0WDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcnJheVthKgp0aGlzLml0ZW1TaXplXX0sc2V0WDpmdW5jdGlvbihhLGMpe3RoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplXT1jO3JldHVybiB0aGlzfSxnZXRZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSsxXX0sc2V0WTpmdW5jdGlvbihhLGMpe3RoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzFdPWM7cmV0dXJuIHRoaXN9LGdldFo6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzJdfSxzZXRaOmZ1bmN0aW9uKGEsYyl7dGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrMl09YztyZXR1cm4gdGhpc30sZ2V0VzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrM119LHNldFc6ZnVuY3Rpb24oYSxjKXt0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSszXT1jO3JldHVybiB0aGlzfSxzZXRYWTpmdW5jdGlvbihhLGMsZSl7YSo9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2ErMF09Yzt0aGlzLmFycmF5W2ErCjFdPWU7cmV0dXJuIHRoaXN9LHNldFhZWjpmdW5jdGlvbihhLGMsZSxnKXthKj10aGlzLml0ZW1TaXplO3RoaXMuYXJyYXlbYSswXT1jO3RoaXMuYXJyYXlbYSsxXT1lO3RoaXMuYXJyYXlbYSsyXT1nO3JldHVybiB0aGlzfSxzZXRYWVpXOmZ1bmN0aW9uKGEsYyxlLGcscil7YSo9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2ErMF09Yzt0aGlzLmFycmF5W2ErMV09ZTt0aGlzLmFycmF5W2ErMl09Zzt0aGlzLmFycmF5W2ErM109cjtyZXR1cm4gdGhpc30sb25VcGxvYWQ6ZnVuY3Rpb24oYSl7dGhpcy5vblVwbG9hZENhbGxiYWNrPWE7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybntpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpLApub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fSk7VC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShRLnByb3RvdHlwZSk7VC5wcm90b3R5cGUuY29uc3RydWN0b3I9VDtYLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtYLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YO2FhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTthYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YWE7bGEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2xhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1sYTtaLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtaLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aO2JhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtiYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YmE7ZWEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2VhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lYTtjYS5wcm90b3R5cGU9Ck9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2NhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jYTtrYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShRLnByb3RvdHlwZSk7a2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPWthO09iamVjdC5hc3NpZ24oWS5wcm90b3R5cGUse2NvbXB1dGVHcm91cHM6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZT12b2lkIDA7YT1hLmZhY2VzO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgcj1hW2ddO2lmKHIubWF0ZXJpYWxJbmRleCE9PWUpe2U9ci5tYXRlcmlhbEluZGV4O3ZvaWQgMCE9PXYmJih2LmNvdW50PTMqZy12LnN0YXJ0LGMucHVzaCh2KSk7dmFyIHY9e3N0YXJ0OjMqZyxtYXRlcmlhbEluZGV4OmV9fX12b2lkIDAhPT12JiYodi5jb3VudD0zKmctdi5zdGFydCxjLnB1c2godikpO3RoaXMuZ3JvdXBzPWN9LGZyb21HZW9tZXRyeTpmdW5jdGlvbihhKXt2YXIgYz1hLmZhY2VzLGU9YS52ZXJ0aWNlcyxnPWEuZmFjZVZlcnRleFV2cyxyPWdbMF0mJgowPGdbMF0ubGVuZ3RoLHY9Z1sxXSYmMDxnWzFdLmxlbmd0aCx6PWEubW9ycGhUYXJnZXRzLEU9ei5sZW5ndGg7aWYoMDxFKXt2YXIgRj1bXTtmb3IodmFyIEo9MDtKPEU7SisrKUZbSl09e25hbWU6eltKXS5uYW1lLGRhdGE6W119O3RoaXMubW9ycGhUYXJnZXRzLnBvc2l0aW9uPUZ9dmFyIFA9YS5tb3JwaE5vcm1hbHMsUj1QLmxlbmd0aDtpZigwPFIpe3ZhciBTPVtdO2ZvcihKPTA7SjxSO0orKylTW0pdPXtuYW1lOlBbSl0ubmFtZSxkYXRhOltdfTt0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWw9U312YXIgVj1hLnNraW5JbmRpY2VzLFc9YS5za2luV2VpZ2h0cyxoYT1WLmxlbmd0aD09PWUubGVuZ3RoLGZhPVcubGVuZ3RoPT09ZS5sZW5ndGg7MDxlLmxlbmd0aCYmMD09PWMubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5EaXJlY3RHZW9tZXRyeTogRmFjZWxlc3MgZ2VvbWV0cmllcyBhcmUgbm90IHN1cHBvcnRlZC4iKTtmb3IoSj0wO0o8Yy5sZW5ndGg7SisrKXt2YXIgcmE9Y1tKXTsKdGhpcy52ZXJ0aWNlcy5wdXNoKGVbcmEuYV0sZVtyYS5iXSxlW3JhLmNdKTt2YXIgcGE9cmEudmVydGV4Tm9ybWFsczszPT09cGEubGVuZ3RoP3RoaXMubm9ybWFscy5wdXNoKHBhWzBdLHBhWzFdLHBhWzJdKToocGE9cmEubm9ybWFsLHRoaXMubm9ybWFscy5wdXNoKHBhLHBhLHBhKSk7cGE9cmEudmVydGV4Q29sb3JzOzM9PT1wYS5sZW5ndGg/dGhpcy5jb2xvcnMucHVzaChwYVswXSxwYVsxXSxwYVsyXSk6KHBhPXJhLmNvbG9yLHRoaXMuY29sb3JzLnB1c2gocGEscGEscGEpKTshMD09PXImJihwYT1nWzBdW0pdLHZvaWQgMCE9PXBhP3RoaXMudXZzLnB1c2gocGFbMF0scGFbMV0scGFbMl0pOihjb25zb2xlLndhcm4oIlRIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYgIixKKSx0aGlzLnV2cy5wdXNoKG5ldyBmLG5ldyBmLG5ldyBmKSkpOyEwPT09diYmKHBhPWdbMV1bSl0sdm9pZCAwIT09cGE/dGhpcy51dnMyLnB1c2gocGFbMF0sCnBhWzFdLHBhWzJdKTooY29uc29sZS53YXJuKCJUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2MiAiLEopLHRoaXMudXZzMi5wdXNoKG5ldyBmLG5ldyBmLG5ldyBmKSkpO2ZvcihwYT0wO3BhPEU7cGErKyl7dmFyIHFhPXpbcGFdLnZlcnRpY2VzO0ZbcGFdLmRhdGEucHVzaChxYVtyYS5hXSxxYVtyYS5iXSxxYVtyYS5jXSl9Zm9yKHBhPTA7cGE8UjtwYSsrKXFhPVBbcGFdLnZlcnRleE5vcm1hbHNbSl0sU1twYV0uZGF0YS5wdXNoKHFhLmEscWEuYixxYS5jKTtoYSYmdGhpcy5za2luSW5kaWNlcy5wdXNoKFZbcmEuYV0sVltyYS5iXSxWW3JhLmNdKTtmYSYmdGhpcy5za2luV2VpZ2h0cy5wdXNoKFdbcmEuYV0sV1tyYS5iXSxXW3JhLmNdKX10aGlzLmNvbXB1dGVHcm91cHMoYSk7dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9YS52ZXJ0aWNlc05lZWRVcGRhdGU7dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT1hLm5vcm1hbHNOZWVkVXBkYXRlOwp0aGlzLmNvbG9yc05lZWRVcGRhdGU9YS5jb2xvcnNOZWVkVXBkYXRlO3RoaXMudXZzTmVlZFVwZGF0ZT1hLnV2c05lZWRVcGRhdGU7dGhpcy5ncm91cHNOZWVkVXBkYXRlPWEuZ3JvdXBzTmVlZFVwZGF0ZTtudWxsIT09YS5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9YS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtudWxsIT09YS5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9YS5ib3VuZGluZ0JveC5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt2YXIgUWs9MSxYYz1uZXcgcSxGaT1uZXcgQSxuaD1uZXcgayxnZT1uZXcgdyxHaT1uZXcgdyxKYz1uZXcgazt2YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6dmEsaXNCdWZmZXJHZW9tZXRyeTohMCxnZXRJbmRleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluZGV4fSxzZXRJbmRleDpmdW5jdGlvbihhKXt0aGlzLmluZGV4PUFycmF5LmlzQXJyYXkoYSk/Cm5ldyAoNjU1MzU8RWEoYSk/ZWE6WikoYSwxKTphfSxhZGRBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe2lmKCEoYyYmYy5pc0J1ZmZlckF0dHJpYnV0ZXx8YyYmYy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIG5vdyBleHBlY3RzICggbmFtZSwgYXR0cmlidXRlICkuIiksdGhpcy5hZGRBdHRyaWJ1dGUoYSxuZXcgUShjLGUpKTtpZigiaW5kZXgiPT09YSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGU6IFVzZSAuc2V0SW5kZXgoKSBmb3IgaW5kZXggYXR0cmlidXRlLiIpLHRoaXMuc2V0SW5kZXgoYyksdGhpczt0aGlzLmF0dHJpYnV0ZXNbYV09YztyZXR1cm4gdGhpc30sZ2V0QXR0cmlidXRlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbYV19LHJlbW92ZUF0dHJpYnV0ZTpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW2FdOwpyZXR1cm4gdGhpc30sYWRkR3JvdXA6ZnVuY3Rpb24oYSxjLGUpe3RoaXMuZ3JvdXBzLnB1c2goe3N0YXJ0OmEsY291bnQ6YyxtYXRlcmlhbEluZGV4OnZvaWQgMCE9PWU/ZTowfSl9LGNsZWFyR3JvdXBzOmZ1bmN0aW9uKCl7dGhpcy5ncm91cHM9W119LHNldERyYXdSYW5nZTpmdW5jdGlvbihhLGMpe3RoaXMuZHJhd1JhbmdlLnN0YXJ0PWE7dGhpcy5kcmF3UmFuZ2UuY291bnQ9Y30sYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZvaWQgMCE9PWMmJihhLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoYyksYy5uZWVkc1VwZGF0ZT0hMCk7dmFyIGU9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDt2b2lkIDAhPT1lJiYoYz0obmV3IHQpLmdldE5vcm1hbE1hdHJpeChhKSxjLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoZSksZS5uZWVkc1VwZGF0ZT0hMCk7ZT10aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDt2b2lkIDAhPT1lJiYoYz0obmV3IHQpLmdldE5vcm1hbE1hdHJpeChhKSwKYy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGUpLGUubmVlZHNVcGRhdGU9ITApO251bGwhPT10aGlzLmJvdW5kaW5nQm94JiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO251bGwhPT10aGlzLmJvdW5kaW5nU3BoZXJlJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3JldHVybiB0aGlzfSxyb3RhdGVYOmZ1bmN0aW9uKGEpe1hjLm1ha2VSb3RhdGlvblgoYSk7dGhpcy5hcHBseU1hdHJpeChYYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVk6ZnVuY3Rpb24oYSl7WGMubWFrZVJvdGF0aW9uWShhKTt0aGlzLmFwcGx5TWF0cml4KFhjKTtyZXR1cm4gdGhpc30scm90YXRlWjpmdW5jdGlvbihhKXtYYy5tYWtlUm90YXRpb25aKGEpO3RoaXMuYXBwbHlNYXRyaXgoWGMpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSxjLGUpe1hjLm1ha2VUcmFuc2xhdGlvbihhLGMsZSk7dGhpcy5hcHBseU1hdHJpeChYYyk7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEsYyxlKXtYYy5tYWtlU2NhbGUoYSwKYyxlKTt0aGlzLmFwcGx5TWF0cml4KFhjKTtyZXR1cm4gdGhpc30sbG9va0F0OmZ1bmN0aW9uKGEpe0ZpLmxvb2tBdChhKTtGaS51cGRhdGVNYXRyaXgoKTt0aGlzLmFwcGx5TWF0cml4KEZpLm1hdHJpeCk7cmV0dXJuIHRoaXN9LGNlbnRlcjpmdW5jdGlvbigpe3RoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIobmgpLm5lZ2F0ZSgpO3RoaXMudHJhbnNsYXRlKG5oLngsbmgueSxuaC56KTtyZXR1cm4gdGhpc30sc2V0RnJvbU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYz1hLmdlb21ldHJ5O2lmKGEuaXNQb2ludHN8fGEuaXNMaW5lKXthPW5ldyBjYSgzKmMudmVydGljZXMubGVuZ3RoLDMpO3ZhciBlPW5ldyBjYSgzKmMuY29sb3JzLmxlbmd0aCwzKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGEuY29weVZlY3RvcjNzQXJyYXkoYy52ZXJ0aWNlcykpO3RoaXMuYWRkQXR0cmlidXRlKCJjb2xvciIsZS5jb3B5Q29sb3JzQXJyYXkoYy5jb2xvcnMpKTsKYy5saW5lRGlzdGFuY2VzJiZjLmxpbmVEaXN0YW5jZXMubGVuZ3RoPT09Yy52ZXJ0aWNlcy5sZW5ndGgmJihhPW5ldyBjYShjLmxpbmVEaXN0YW5jZXMubGVuZ3RoLDEpLHRoaXMuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLGEuY29weUFycmF5KGMubGluZURpc3RhbmNlcykpKTtudWxsIT09Yy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Yy5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtudWxsIT09Yy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9Yy5ib3VuZGluZ0JveC5jbG9uZSgpKX1lbHNlIGEuaXNNZXNoJiZjJiZjLmlzR2VvbWV0cnkmJnRoaXMuZnJvbUdlb21ldHJ5KGMpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXt2YXIgcj1hW2VdO2MucHVzaChyLngsci55LHIuenx8MCl9dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoYywzKSk7CnJldHVybiB0aGlzfSx1cGRhdGVGcm9tT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2VvbWV0cnk7aWYoYS5pc01lc2gpe3ZhciBlPWMuX19kaXJlY3RHZW9tZXRyeTshMD09PWMuZWxlbWVudHNOZWVkVXBkYXRlJiYoZT12b2lkIDAsYy5lbGVtZW50c05lZWRVcGRhdGU9ITEpO2lmKHZvaWQgMD09PWUpcmV0dXJuIHRoaXMuZnJvbUdlb21ldHJ5KGMpO2UudmVydGljZXNOZWVkVXBkYXRlPWMudmVydGljZXNOZWVkVXBkYXRlO2Uubm9ybWFsc05lZWRVcGRhdGU9Yy5ub3JtYWxzTmVlZFVwZGF0ZTtlLmNvbG9yc05lZWRVcGRhdGU9Yy5jb2xvcnNOZWVkVXBkYXRlO2UudXZzTmVlZFVwZGF0ZT1jLnV2c05lZWRVcGRhdGU7ZS5ncm91cHNOZWVkVXBkYXRlPWMuZ3JvdXBzTmVlZFVwZGF0ZTtjLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMTtjLm5vcm1hbHNOZWVkVXBkYXRlPSExO2MuY29sb3JzTmVlZFVwZGF0ZT0hMTtjLnV2c05lZWRVcGRhdGU9ITE7Yy5ncm91cHNOZWVkVXBkYXRlPSExOwpjPWV9ITA9PT1jLnZlcnRpY2VzTmVlZFVwZGF0ZSYmKGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLHZvaWQgMCE9PWUmJihlLmNvcHlWZWN0b3Izc0FycmF5KGMudmVydGljZXMpLGUubmVlZHNVcGRhdGU9ITApLGMudmVydGljZXNOZWVkVXBkYXRlPSExKTshMD09PWMubm9ybWFsc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwsdm9pZCAwIT09ZSYmKGUuY29weVZlY3RvcjNzQXJyYXkoYy5ub3JtYWxzKSxlLm5lZWRzVXBkYXRlPSEwKSxjLm5vcm1hbHNOZWVkVXBkYXRlPSExKTshMD09PWMuY29sb3JzTmVlZFVwZGF0ZSYmKGU9dGhpcy5hdHRyaWJ1dGVzLmNvbG9yLHZvaWQgMCE9PWUmJihlLmNvcHlDb2xvcnNBcnJheShjLmNvbG9ycyksZS5uZWVkc1VwZGF0ZT0hMCksYy5jb2xvcnNOZWVkVXBkYXRlPSExKTtjLnV2c05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy51dix2b2lkIDAhPT1lJiYoZS5jb3B5VmVjdG9yMnNBcnJheShjLnV2cyksZS5uZWVkc1VwZGF0ZT0KITApLGMudXZzTmVlZFVwZGF0ZT0hMSk7Yy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSYmKGU9dGhpcy5hdHRyaWJ1dGVzLmxpbmVEaXN0YW5jZSx2b2lkIDAhPT1lJiYoZS5jb3B5QXJyYXkoYy5saW5lRGlzdGFuY2VzKSxlLm5lZWRzVXBkYXRlPSEwKSxjLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlPSExKTtjLmdyb3Vwc05lZWRVcGRhdGUmJihjLmNvbXB1dGVHcm91cHMoYS5nZW9tZXRyeSksdGhpcy5ncm91cHM9Yy5ncm91cHMsYy5ncm91cHNOZWVkVXBkYXRlPSExKTtyZXR1cm4gdGhpc30sZnJvbUdlb21ldHJ5OmZ1bmN0aW9uKGEpe2EuX19kaXJlY3RHZW9tZXRyeT0obmV3IFkpLmZyb21HZW9tZXRyeShhKTtyZXR1cm4gdGhpcy5mcm9tRGlyZWN0R2VvbWV0cnkoYS5fX2RpcmVjdEdlb21ldHJ5KX0sZnJvbURpcmVjdEdlb21ldHJ5OmZ1bmN0aW9uKGEpe3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsKG5ldyBRKG5ldyBGbG9hdDMyQXJyYXkoMyphLnZlcnRpY2VzLmxlbmd0aCksCjMpKS5jb3B5VmVjdG9yM3NBcnJheShhLnZlcnRpY2VzKSk7MDxhLm5vcm1hbHMubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIiwobmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKmEubm9ybWFscy5sZW5ndGgpLDMpKS5jb3B5VmVjdG9yM3NBcnJheShhLm5vcm1hbHMpKTswPGEuY29sb3JzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoImNvbG9yIiwobmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKmEuY29sb3JzLmxlbmd0aCksMykpLmNvcHlDb2xvcnNBcnJheShhLmNvbG9ycykpOzA8YS51dnMubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLChuZXcgUShuZXcgRmxvYXQzMkFycmF5KDIqYS51dnMubGVuZ3RoKSwyKSkuY29weVZlY3RvcjJzQXJyYXkoYS51dnMpKTswPGEudXZzMi5sZW5ndGgmJnRoaXMuYWRkQXR0cmlidXRlKCJ1djIiLChuZXcgUShuZXcgRmxvYXQzMkFycmF5KDIqYS51dnMyLmxlbmd0aCksMikpLmNvcHlWZWN0b3Iyc0FycmF5KGEudXZzMikpOwp0aGlzLmdyb3Vwcz1hLmdyb3Vwcztmb3IodmFyIGMgaW4gYS5tb3JwaFRhcmdldHMpe2Zvcih2YXIgZT1bXSxnPWEubW9ycGhUYXJnZXRzW2NdLHI9MCx2PWcubGVuZ3RoO3I8djtyKyspe3ZhciB6PWdbcl0sRT1uZXcgY2EoMyp6LmRhdGEubGVuZ3RoLDMpO0UubmFtZT16Lm5hbWU7ZS5wdXNoKEUuY29weVZlY3RvcjNzQXJyYXkoei5kYXRhKSl9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbY109ZX0wPGEuc2tpbkluZGljZXMubGVuZ3RoJiYoYz1uZXcgY2EoNCphLnNraW5JbmRpY2VzLmxlbmd0aCw0KSx0aGlzLmFkZEF0dHJpYnV0ZSgic2tpbkluZGV4IixjLmNvcHlWZWN0b3I0c0FycmF5KGEuc2tpbkluZGljZXMpKSk7MDxhLnNraW5XZWlnaHRzLmxlbmd0aCYmKGM9bmV3IGNhKDQqYS5za2luV2VpZ2h0cy5sZW5ndGgsNCksdGhpcy5hZGRBdHRyaWJ1dGUoInNraW5XZWlnaHQiLGMuY29weVZlY3RvcjRzQXJyYXkoYS5za2luV2VpZ2h0cykpKTtudWxsIT09YS5ib3VuZGluZ1NwaGVyZSYmCih0aGlzLmJvdW5kaW5nU3BoZXJlPWEuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWEuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWEuYm91bmRpbmdCb3guY2xvbmUoKSk7cmV0dXJuIHRoaXN9LGNvbXB1dGVCb3VuZGluZ0JveDpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgdyk7dmFyIGE9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGM9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodm9pZCAwIT09YSl7aWYodGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpLGMpe2E9MDtmb3IodmFyIGU9Yy5sZW5ndGg7YTxlO2ErKylnZS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGNbYV0pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChnZS5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChnZS5tYXgpfX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7Cihpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi54KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueSl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnopKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94OiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX0sY29tcHV0ZUJvdW5kaW5nU3BoZXJlOmZ1bmN0aW9uKCl7bnVsbD09PXRoaXMuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBHKTt2YXIgYT10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sYz10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZihhKXt2YXIgZT10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtnZS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpO2lmKGMpZm9yKHZhciBnPTAscj1jLmxlbmd0aDtnPHI7ZysrKXt2YXIgdj0KY1tnXTtHaS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHYpO2dlLmV4cGFuZEJ5UG9pbnQoR2kubWluKTtnZS5leHBhbmRCeVBvaW50KEdpLm1heCl9Z2UuZ2V0Q2VudGVyKGUpO3ZhciB6PTA7Zz0wO2ZvcihyPWEuY291bnQ7ZzxyO2crKylKYy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsZyksej1NYXRoLm1heCh6LGUuZGlzdGFuY2VUb1NxdWFyZWQoSmMpKTtpZihjKWZvcihnPTAscj1jLmxlbmd0aDtnPHI7ZysrKXt2PWNbZ107YT0wO2Zvcih2YXIgRT12LmNvdW50O2E8RTthKyspSmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh2LGEpLHo9TWF0aC5tYXgoeixlLmRpc3RhbmNlVG9TcXVhcmVkKEpjKSl9dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM9TWF0aC5zcXJ0KHopO2lzTmFOKHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsCnRoaXMpfX0sY29tcHV0ZUZhY2VOb3JtYWxzOmZ1bmN0aW9uKCl7fSxjb21wdXRlVmVydGV4Tm9ybWFsczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaW5kZXgsYz10aGlzLmF0dHJpYnV0ZXM7aWYoYy5wb3NpdGlvbil7dmFyIGU9Yy5wb3NpdGlvbi5hcnJheTtpZih2b2lkIDA9PT1jLm5vcm1hbCl0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgUShuZXcgRmxvYXQzMkFycmF5KGUubGVuZ3RoKSwzKSk7ZWxzZSBmb3IodmFyIGc9Yy5ub3JtYWwuYXJyYXkscj0wLHY9Zy5sZW5ndGg7cjx2O3IrKylnW3JdPTA7Zz1jLm5vcm1hbC5hcnJheTt2YXIgej1uZXcgayxFPW5ldyBrLEY9bmV3IGssSj1uZXcgayxQPW5ldyBrO2lmKGEpe3ZhciBSPWEuYXJyYXk7cj0wO2Zvcih2PWEuY291bnQ7cjx2O3IrPTMpe2E9MypSW3IrMF07dmFyIFM9MypSW3IrMV07dmFyIFY9MypSW3IrMl07ei5mcm9tQXJyYXkoZSxhKTtFLmZyb21BcnJheShlLFMpO0YuZnJvbUFycmF5KGUsVik7Si5zdWJWZWN0b3JzKEYsCkUpO1Auc3ViVmVjdG9ycyh6LEUpO0ouY3Jvc3MoUCk7Z1thXSs9Si54O2dbYSsxXSs9Si55O2dbYSsyXSs9Si56O2dbU10rPUoueDtnW1MrMV0rPUoueTtnW1MrMl0rPUouejtnW1ZdKz1KLng7Z1tWKzFdKz1KLnk7Z1tWKzJdKz1KLnp9fWVsc2UgZm9yKHI9MCx2PWUubGVuZ3RoO3I8djtyKz05KXouZnJvbUFycmF5KGUsciksRS5mcm9tQXJyYXkoZSxyKzMpLEYuZnJvbUFycmF5KGUscis2KSxKLnN1YlZlY3RvcnMoRixFKSxQLnN1YlZlY3RvcnMoeixFKSxKLmNyb3NzKFApLGdbcl09Si54LGdbcisxXT1KLnksZ1tyKzJdPUoueixnW3IrM109Si54LGdbcis0XT1KLnksZ1tyKzVdPUoueixnW3IrNl09Si54LGdbcis3XT1KLnksZ1tyKzhdPUouejt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTtjLm5vcm1hbC5uZWVkc1VwZGF0ZT0hMH19LG1lcmdlOmZ1bmN0aW9uKGEsYyl7aWYoYSYmYS5pc0J1ZmZlckdlb21ldHJ5KXt2b2lkIDA9PT1jJiYoYz0wLGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogT3ZlcndyaXRpbmcgb3JpZ2luYWwgZ2VvbWV0cnksIHN0YXJ0aW5nIGF0IG9mZnNldFx4M2QwLiBVc2UgQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoKSBmb3IgbG9zc2xlc3MgbWVyZ2UuIikpOwp2YXIgZT10aGlzLmF0dHJpYnV0ZXMsZztmb3IoZyBpbiBlKWlmKHZvaWQgMCE9PWEuYXR0cmlidXRlc1tnXSl7dmFyIHI9ZVtnXS5hcnJheSx2PWEuYXR0cmlidXRlc1tnXSx6PXYuYXJyYXksRT12Lml0ZW1TaXplKmM7dj1NYXRoLm1pbih6Lmxlbmd0aCxyLmxlbmd0aC1FKTtmb3IodmFyIEY9MDtGPHY7RisrLEUrKylyW0VdPXpbRl19cmV0dXJuIHRoaXN9Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LiIsYSl9LG5vcm1hbGl6ZU5vcm1hbHM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbCxjPTAsZT1hLmNvdW50O2M8ZTtjKyspSmMueD1hLmdldFgoYyksSmMueT1hLmdldFkoYyksSmMuej1hLmdldFooYyksSmMubm9ybWFsaXplKCksYS5zZXRYWVooYyxKYy54LEpjLnksSmMueil9LHRvTm9uSW5kZXhlZDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoUCwKUil7dmFyIFM9UC5hcnJheTtQPVAuaXRlbVNpemU7Zm9yKHZhciBWPW5ldyBTLmNvbnN0cnVjdG9yKFIubGVuZ3RoKlApLFcsaGE9MCxmYT0wLHJhPVIubGVuZ3RoO2ZhPHJhO2ZhKyspe1c9UltmYV0qUDtmb3IodmFyIHBhPTA7cGE8UDtwYSsrKVZbaGErK109U1tXKytdfXJldHVybiBuZXcgUShWLFApfWlmKG51bGw9PT10aGlzLmluZGV4KXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLHRoaXM7dmFyIGM9bmV3IHZhLGU9dGhpcy5pbmRleC5hcnJheSxnPXRoaXMuYXR0cmlidXRlcyxyO2ZvcihyIGluIGcpe3ZhciB2PWdbcl07dj1hKHYsZSk7Yy5hZGRBdHRyaWJ1dGUocix2KX12YXIgej10aGlzLm1vcnBoQXR0cmlidXRlcztmb3IociBpbiB6KXt2YXIgRT1bXSxGPXpbcl07Zz0wO2Zvcih2YXIgSj1GLmxlbmd0aDtnPEo7ZysrKXY9RltnXSx2PWEodixlKSxFLnB1c2godik7CmMubW9ycGhBdHRyaWJ1dGVzW3JdPUV9ZT10aGlzLmdyb3VwcztnPTA7Zm9yKHI9ZS5sZW5ndGg7ZzxyO2crKyl2PWVbZ10sYy5hZGRHcm91cCh2LnN0YXJ0LHYuY291bnQsdi5tYXRlcmlhbEluZGV4KTtyZXR1cm4gY30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJCdWZmZXJHZW9tZXRyeSIsZ2VuZXJhdG9yOiJCdWZmZXJHZW9tZXRyeS50b0pTT04ifX07YS51dWlkPXRoaXMudXVpZDthLnR5cGU9dGhpcy50eXBlOyIiIT09dGhpcy5uYW1lJiYoYS5uYW1lPXRoaXMubmFtZSk7MDxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGgmJihhLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO2lmKHZvaWQgMCE9PXRoaXMucGFyYW1ldGVycyl7dmFyIGM9dGhpcy5wYXJhbWV0ZXJzO2ZvcihKIGluIGMpdm9pZCAwIT09Y1tKXSYmKGFbSl09Y1tKXSk7cmV0dXJuIGF9YS5kYXRhPXthdHRyaWJ1dGVzOnt9fTtjPXRoaXMuaW5kZXg7bnVsbCE9PQpjJiYoYS5kYXRhLmluZGV4PXt0eXBlOmMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjLmFycmF5KX0pO3ZhciBlPXRoaXMuYXR0cmlidXRlcztmb3IoSiBpbiBlKXtjPWVbSl07dmFyIGc9Yy50b0pTT04oKTsiIiE9PWMubmFtZSYmKGcubmFtZT1jLm5hbWUpO2EuZGF0YS5hdHRyaWJ1dGVzW0pdPWd9ZT17fTt2YXIgcj0hMTtmb3IoSiBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcyl7Zm9yKHZhciB2PXRoaXMubW9ycGhBdHRyaWJ1dGVzW0pdLHo9W10sRT0wLEY9di5sZW5ndGg7RTxGO0UrKyljPXZbRV0sZz1jLnRvSlNPTigpLCIiIT09Yy5uYW1lJiYoZy5uYW1lPWMubmFtZSksei5wdXNoKGcpOzA8ei5sZW5ndGgmJihlW0pdPXoscj0hMCl9ciYmKGEuZGF0YS5tb3JwaEF0dHJpYnV0ZXM9ZSk7dmFyIEo9dGhpcy5ncm91cHM7MDxKLmxlbmd0aCYmKGEuZGF0YS5ncm91cHM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShKKSkpO0o9CnRoaXMuYm91bmRpbmdTcGhlcmU7bnVsbCE9PUomJihhLmRhdGEuYm91bmRpbmdTcGhlcmU9e2NlbnRlcjpKLmNlbnRlci50b0FycmF5KCkscmFkaXVzOkoucmFkaXVzfSk7cmV0dXJuIGF9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB2YSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt2YXIgYzt0aGlzLmluZGV4PW51bGw7dGhpcy5hdHRyaWJ1dGVzPXt9O3RoaXMubW9ycGhBdHRyaWJ1dGVzPXt9O3RoaXMuZ3JvdXBzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMubmFtZT1hLm5hbWU7dmFyIGU9YS5pbmRleDtudWxsIT09ZSYmdGhpcy5zZXRJbmRleChlLmNsb25lKCkpO2U9YS5hdHRyaWJ1dGVzO2Zvcih6IGluIGUpdGhpcy5hZGRBdHRyaWJ1dGUoeixlW3pdLmNsb25lKCkpO3ZhciBnPWEubW9ycGhBdHRyaWJ1dGVzO2Zvcih6IGluIGcpe3ZhciByPVtdLHY9Z1t6XTtlPTA7Zm9yKGM9di5sZW5ndGg7ZTxjO2UrKylyLnB1c2godltlXS5jbG9uZSgpKTsKdGhpcy5tb3JwaEF0dHJpYnV0ZXNbel09cn12YXIgej1hLmdyb3VwcztlPTA7Zm9yKGM9ei5sZW5ndGg7ZTxjO2UrKylnPXpbZV0sdGhpcy5hZGRHcm91cChnLnN0YXJ0LGcuY291bnQsZy5tYXRlcmlhbEluZGV4KTt6PWEuYm91bmRpbmdCb3g7bnVsbCE9PXomJih0aGlzLmJvdW5kaW5nQm94PXouY2xvbmUoKSk7ej1hLmJvdW5kaW5nU3BoZXJlO251bGwhPT16JiYodGhpcy5ib3VuZGluZ1NwaGVyZT16LmNsb25lKCkpO3RoaXMuZHJhd1JhbmdlLnN0YXJ0PWEuZHJhd1JhbmdlLnN0YXJ0O3RoaXMuZHJhd1JhbmdlLmNvdW50PWEuZHJhd1JhbmdlLmNvdW50O3RoaXMudXNlckRhdGE9YS51c2VyRGF0YTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTt2YXIgams9bmV3IHEsaGU9bmV3IEQsSGk9bmV3IEcsTGQ9bmV3IGssTWQ9bmV3IGssTmQ9bmV3IGssJGk9bmV3IGssYWo9bmV3IGssYmo9bmV3IGssSWg9Cm5ldyBrLEpoPW5ldyBrLEtoPW5ldyBrLG9lPW5ldyBmLHBlPW5ldyBmLHFlPW5ldyBmLHNmPW5ldyBrLHNnPW5ldyBrO3hhLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp4YSxpc01lc2g6ITAsc2V0RHJhd01vZGU6ZnVuY3Rpb24oYSl7dGhpcy5kcmF3TW9kZT1hfSxjb3B5OmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZHJhd01vZGU9YS5kcmF3TW9kZTt2b2lkIDAhPT1hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPWEubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpO3ZvaWQgMCE9PWEubW9ycGhUYXJnZXREaWN0aW9uYXJ5JiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSxhLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpO3JldHVybiB0aGlzfSx1cGRhdGVNb3JwaFRhcmdldHM6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpe2E9YS5tb3JwaEF0dHJpYnV0ZXM7dmFyIGM9T2JqZWN0LmtleXMoYSk7aWYoMDxjLmxlbmd0aCl7dmFyIGU9YVtjWzBdXTtpZih2b2lkIDAhPT1lKWZvcih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fSxhPTAsYz1lLmxlbmd0aDthPGM7YSsrKXt2YXIgZz1lW2FdLm5hbWV8fFN0cmluZyhhKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApO3RoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2ddPWF9fX1lbHNlIGE9YS5tb3JwaFRhcmdldHMsdm9pZCAwIT09YSYmMDxhLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWVzaC51cGRhdGVNb3JwaFRhcmdldHMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfSxyYXljYXN0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5nZW9tZXRyeSwKZz10aGlzLm1hdGVyaWFsLHI9dGhpcy5tYXRyaXhXb3JsZDtpZih2b2lkIDAhPT1nJiYobnVsbD09PWUuYm91bmRpbmdTcGhlcmUmJmUuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksSGkuY29weShlLmJvdW5kaW5nU3BoZXJlKSxIaS5hcHBseU1hdHJpeDQociksITEhPT1hLnJheS5pbnRlcnNlY3RzU3BoZXJlKEhpKSYmKGprLmdldEludmVyc2UociksaGUuY29weShhLnJheSkuYXBwbHlNYXRyaXg0KGprKSxudWxsPT09ZS5ib3VuZGluZ0JveHx8ITEhPT1oZS5pbnRlcnNlY3RzQm94KGUuYm91bmRpbmdCb3gpKSkpaWYoZS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgdj1lLmluZGV4O3I9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZhciB6PWUubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLEU9ZS5hdHRyaWJ1dGVzLnV2LEY9ZS5hdHRyaWJ1dGVzLnV2MixKPWUuZ3JvdXBzLFA9ZS5kcmF3UmFuZ2UsUixTO2lmKG51bGwhPT12KWlmKEFycmF5LmlzQXJyYXkoZykpe3ZhciBWPTA7Zm9yKFI9Si5sZW5ndGg7VjwKUjtWKyspe3ZhciBXPUpbVl07dmFyIGhhPWdbVy5tYXRlcmlhbEluZGV4XTt2YXIgZmE9TWF0aC5tYXgoVy5zdGFydCxQLnN0YXJ0KTtmb3IoUz1lPU1hdGgubWluKFcuc3RhcnQrVy5jb3VudCxQLnN0YXJ0K1AuY291bnQpO2ZhPFM7ZmErPTMpe2U9di5nZXRYKGZhKTt2YXIgcmE9di5nZXRYKGZhKzEpO3ZhciBwYT12LmdldFgoZmErMik7aWYoZT1GYSh0aGlzLGhhLGEsaGUscix6LEUsRixlLHJhLHBhKSllLmZhY2VJbmRleD1NYXRoLmZsb29yKGZhLzMpLGUuZmFjZS5tYXRlcmlhbEluZGV4PVcubWF0ZXJpYWxJbmRleCxjLnB1c2goZSl9fX1lbHNlIGZvcihmYT1NYXRoLm1heCgwLFAuc3RhcnQpLGU9TWF0aC5taW4odi5jb3VudCxQLnN0YXJ0K1AuY291bnQpLFY9ZmEsUj1lO1Y8UjtWKz0zKXtpZihlPXYuZ2V0WChWKSxyYT12LmdldFgoVisxKSxwYT12LmdldFgoVisyKSxlPUZhKHRoaXMsZyxhLGhlLHIseixFLEYsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihWLzMpLApjLnB1c2goZSl9ZWxzZSBpZih2b2lkIDAhPT1yKWlmKEFycmF5LmlzQXJyYXkoZykpZm9yKFY9MCxSPUoubGVuZ3RoO1Y8UjtWKyspZm9yKFc9SltWXSxoYT1nW1cubWF0ZXJpYWxJbmRleF0sZmE9TWF0aC5tYXgoVy5zdGFydCxQLnN0YXJ0KSxTPWU9TWF0aC5taW4oVy5zdGFydCtXLmNvdW50LFAuc3RhcnQrUC5jb3VudCk7ZmE8UztmYSs9Myl7aWYoZT1mYSxyYT1mYSsxLHBhPWZhKzIsZT1GYSh0aGlzLGhhLGEsaGUscix6LEUsRixlLHJhLHBhKSllLmZhY2VJbmRleD1NYXRoLmZsb29yKGZhLzMpLGUuZmFjZS5tYXRlcmlhbEluZGV4PVcubWF0ZXJpYWxJbmRleCxjLnB1c2goZSl9ZWxzZSBmb3IoZmE9TWF0aC5tYXgoMCxQLnN0YXJ0KSxlPU1hdGgubWluKHIuY291bnQsUC5zdGFydCtQLmNvdW50KSxWPWZhLFI9ZTtWPFI7Vis9MylpZihlPVYscmE9VisxLHBhPVYrMixlPUZhKHRoaXMsZyxhLGhlLHIseixFLEYsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihWLzMpLGMucHVzaChlKX1lbHNlIGlmKGUuaXNHZW9tZXRyeSlmb3Iocj0KQXJyYXkuaXNBcnJheShnKSx6PWUudmVydGljZXMsRT1lLmZhY2VzLGU9ZS5mYWNlVmVydGV4VXZzWzBdLDA8ZS5sZW5ndGgmJih2PWUpLFY9MCxSPUUubGVuZ3RoO1Y8UjtWKyspaWYoVz1FW1ZdLGU9cj9nW1cubWF0ZXJpYWxJbmRleF06Zyx2b2lkIDAhPT1lJiYoRj16W1cuYV0sSj16W1cuYl0sUD16W1cuY10sZT1BYSh0aGlzLGUsYSxoZSxGLEosUCxzZikpKXYmJnZbVl0mJihoYT12W1ZdLG9lLmNvcHkoaGFbMF0pLHBlLmNvcHkoaGFbMV0pLHFlLmNvcHkoaGFbMl0pLGUudXY9Qi5nZXRVVihzZixGLEosUCxvZSxwZSxxZSxuZXcgZikpLGUuZmFjZT1XLGUuZmFjZUluZGV4PVYsYy5wdXNoKGUpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmdlb21ldHJ5LHRoaXMubWF0ZXJpYWwpKS5jb3B5KHRoaXMpfX0pO3ZhciBSaz0wLFljPW5ldyBxLElpPW5ldyBBLG9oPW5ldyBrO3lhLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6eWEsaXNHZW9tZXRyeTohMCxhcHBseU1hdHJpeDpmdW5jdGlvbihhKXtmb3IodmFyIGM9KG5ldyB0KS5nZXROb3JtYWxNYXRyaXgoYSksZT0wLGc9dGhpcy52ZXJ0aWNlcy5sZW5ndGg7ZTxnO2UrKyl0aGlzLnZlcnRpY2VzW2VdLmFwcGx5TWF0cml4NChhKTtlPTA7Zm9yKGc9dGhpcy5mYWNlcy5sZW5ndGg7ZTxnO2UrKyl7YT10aGlzLmZhY2VzW2VdO2Eubm9ybWFsLmFwcGx5TWF0cml4MyhjKS5ub3JtYWxpemUoKTtmb3IodmFyIHI9MCx2PWEudmVydGV4Tm9ybWFscy5sZW5ndGg7cjx2O3IrKylhLnZlcnRleE5vcm1hbHNbcl0uYXBwbHlNYXRyaXgzKGMpLm5vcm1hbGl6ZSgpfW51bGwhPT10aGlzLmJvdW5kaW5nQm94JiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO251bGwhPT10aGlzLmJvdW5kaW5nU3BoZXJlJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3RoaXMubm9ybWFsc05lZWRVcGRhdGU9dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9ITA7cmV0dXJuIHRoaXN9LApyb3RhdGVYOmZ1bmN0aW9uKGEpe1ljLm1ha2VSb3RhdGlvblgoYSk7dGhpcy5hcHBseU1hdHJpeChZYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVk6ZnVuY3Rpb24oYSl7WWMubWFrZVJvdGF0aW9uWShhKTt0aGlzLmFwcGx5TWF0cml4KFljKTtyZXR1cm4gdGhpc30scm90YXRlWjpmdW5jdGlvbihhKXtZYy5tYWtlUm90YXRpb25aKGEpO3RoaXMuYXBwbHlNYXRyaXgoWWMpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSxjLGUpe1ljLm1ha2VUcmFuc2xhdGlvbihhLGMsZSk7dGhpcy5hcHBseU1hdHJpeChZYyk7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEsYyxlKXtZYy5tYWtlU2NhbGUoYSxjLGUpO3RoaXMuYXBwbHlNYXRyaXgoWWMpO3JldHVybiB0aGlzfSxsb29rQXQ6ZnVuY3Rpb24oYSl7SWkubG9va0F0KGEpO0lpLnVwZGF0ZU1hdHJpeCgpO3RoaXMuYXBwbHlNYXRyaXgoSWkubWF0cml4KTtyZXR1cm4gdGhpc30sZnJvbUJ1ZmZlckdlb21ldHJ5OmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoViwKVyxoYSxmYSl7dmFyIHJhPXZvaWQgMD09PUU/W106W2UuY29sb3JzW1ZdLmNsb25lKCksZS5jb2xvcnNbV10uY2xvbmUoKSxlLmNvbG9yc1toYV0uY2xvbmUoKV0scGE9dm9pZCAwPT09ej9bXTpbKG5ldyBrKS5mcm9tQXJyYXkoeiwzKlYpLChuZXcgaykuZnJvbUFycmF5KHosMypXKSwobmV3IGspLmZyb21BcnJheSh6LDMqaGEpXTtmYT1uZXcgSyhWLFcsaGEscGEscmEsZmEpO2UuZmFjZXMucHVzaChmYSk7dm9pZCAwIT09RiYmZS5mYWNlVmVydGV4VXZzWzBdLnB1c2goWyhuZXcgZikuZnJvbUFycmF5KEYsMipWKSwobmV3IGYpLmZyb21BcnJheShGLDIqVyksKG5ldyBmKS5mcm9tQXJyYXkoRiwyKmhhKV0pO3ZvaWQgMCE9PUomJmUuZmFjZVZlcnRleFV2c1sxXS5wdXNoKFsobmV3IGYpLmZyb21BcnJheShKLDIqViksKG5ldyBmKS5mcm9tQXJyYXkoSiwyKlcpLChuZXcgZikuZnJvbUFycmF5KEosMipoYSldKX12YXIgZT10aGlzLGc9bnVsbCE9PWEuaW5kZXg/YS5pbmRleC5hcnJheToKdm9pZCAwLHI9YS5hdHRyaWJ1dGVzLHY9ci5wb3NpdGlvbi5hcnJheSx6PXZvaWQgMCE9PXIubm9ybWFsP3Iubm9ybWFsLmFycmF5OnZvaWQgMCxFPXZvaWQgMCE9PXIuY29sb3I/ci5jb2xvci5hcnJheTp2b2lkIDAsRj12b2lkIDAhPT1yLnV2P3IudXYuYXJyYXk6dm9pZCAwLEo9dm9pZCAwIT09ci51djI/ci51djIuYXJyYXk6dm9pZCAwO3ZvaWQgMCE9PUomJih0aGlzLmZhY2VWZXJ0ZXhVdnNbMV09W10pO2ZvcihyPTA7cjx2Lmxlbmd0aDtyKz0zKWUudmVydGljZXMucHVzaCgobmV3IGspLmZyb21BcnJheSh2LHIpKSx2b2lkIDAhPT1FJiZlLmNvbG9ycy5wdXNoKChuZXcgSSkuZnJvbUFycmF5KEUscikpO3ZhciBQPWEuZ3JvdXBzO2lmKDA8UC5sZW5ndGgpZm9yKHI9MDtyPFAubGVuZ3RoO3IrKyl7dj1QW3JdO3ZhciBSPXYuc3RhcnQsUz1SO2ZvcihSKz12LmNvdW50O1M8UjtTKz0zKXZvaWQgMCE9PWc/YyhnW1NdLGdbUysxXSxnW1MrMl0sdi5tYXRlcmlhbEluZGV4KTpjKFMsClMrMSxTKzIsdi5tYXRlcmlhbEluZGV4KX1lbHNlIGlmKHZvaWQgMCE9PWcpZm9yKHI9MDtyPGcubGVuZ3RoO3IrPTMpYyhnW3JdLGdbcisxXSxnW3IrMl0pO2Vsc2UgZm9yKHI9MDtyPHYubGVuZ3RoLzM7cis9MyljKHIscisxLHIrMik7dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtudWxsIT09YS5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9YS5ib3VuZGluZ0JveC5jbG9uZSgpKTtudWxsIT09YS5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9YS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtyZXR1cm4gdGhpc30sY2VudGVyOmZ1bmN0aW9uKCl7dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTt0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihvaCkubmVnYXRlKCk7dGhpcy50cmFuc2xhdGUob2gueCxvaC55LG9oLnopO3JldHVybiB0aGlzfSxub3JtYWxpemU6ZnVuY3Rpb24oKXt0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3ZhciBhPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyLApjPXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzO2M9MD09PWM/MToxL2M7dmFyIGU9bmV3IHE7ZS5zZXQoYywwLDAsLWMqYS54LDAsYywwLC1jKmEueSwwLDAsYywtYyphLnosMCwwLDAsMSk7dGhpcy5hcHBseU1hdHJpeChlKTtyZXR1cm4gdGhpc30sY29tcHV0ZUZhY2VOb3JtYWxzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBrLGM9bmV3IGssZT0wLGc9dGhpcy5mYWNlcy5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9dGhpcy5mYWNlc1tlXSx2PXRoaXMudmVydGljZXNbci5hXSx6PXRoaXMudmVydGljZXNbci5iXTthLnN1YlZlY3RvcnModGhpcy52ZXJ0aWNlc1tyLmNdLHopO2Muc3ViVmVjdG9ycyh2LHopO2EuY3Jvc3MoYyk7YS5ub3JtYWxpemUoKTtyLm5vcm1hbC5jb3B5KGEpfX0sY29tcHV0ZVZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9ITApO3ZhciBjO3ZhciBlPUFycmF5KHRoaXMudmVydGljZXMubGVuZ3RoKTt2YXIgZz0wO2ZvcihjPXRoaXMudmVydGljZXMubGVuZ3RoO2c8CmM7ZysrKWVbZ109bmV3IGs7aWYoYSl7dmFyIHI9bmV3IGssdj1uZXcgazthPTA7Zm9yKGc9dGhpcy5mYWNlcy5sZW5ndGg7YTxnO2ErKyl7Yz10aGlzLmZhY2VzW2FdO3ZhciB6PXRoaXMudmVydGljZXNbYy5hXTt2YXIgRT10aGlzLnZlcnRpY2VzW2MuYl07dmFyIEY9dGhpcy52ZXJ0aWNlc1tjLmNdO3Iuc3ViVmVjdG9ycyhGLEUpO3Yuc3ViVmVjdG9ycyh6LEUpO3IuY3Jvc3Modik7ZVtjLmFdLmFkZChyKTtlW2MuYl0uYWRkKHIpO2VbYy5jXS5hZGQocil9fWVsc2UgZm9yKHRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCksYT0wLGc9dGhpcy5mYWNlcy5sZW5ndGg7YTxnO2ErKyljPXRoaXMuZmFjZXNbYV0sZVtjLmFdLmFkZChjLm5vcm1hbCksZVtjLmJdLmFkZChjLm5vcm1hbCksZVtjLmNdLmFkZChjLm5vcm1hbCk7Zz0wO2ZvcihjPXRoaXMudmVydGljZXMubGVuZ3RoO2c8YztnKyspZVtnXS5ub3JtYWxpemUoKTthPTA7Zm9yKGc9dGhpcy5mYWNlcy5sZW5ndGg7YTxnO2ErKyljPQp0aGlzLmZhY2VzW2FdLHo9Yy52ZXJ0ZXhOb3JtYWxzLDM9PT16Lmxlbmd0aD8oelswXS5jb3B5KGVbYy5hXSkselsxXS5jb3B5KGVbYy5iXSkselsyXS5jb3B5KGVbYy5jXSkpOih6WzBdPWVbYy5hXS5jbG9uZSgpLHpbMV09ZVtjLmJdLmNsb25lKCkselsyXT1lW2MuY10uY2xvbmUoKSk7MDx0aGlzLmZhY2VzLmxlbmd0aCYmKHRoaXMubm9ybWFsc05lZWRVcGRhdGU9ITApfSxjb21wdXRlRmxhdFZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oKXt2YXIgYTt0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO3ZhciBjPTA7Zm9yKGE9dGhpcy5mYWNlcy5sZW5ndGg7YzxhO2MrKyl7dmFyIGU9dGhpcy5mYWNlc1tjXTt2YXIgZz1lLnZlcnRleE5vcm1hbHM7Mz09PWcubGVuZ3RoPyhnWzBdLmNvcHkoZS5ub3JtYWwpLGdbMV0uY29weShlLm5vcm1hbCksZ1syXS5jb3B5KGUubm9ybWFsKSk6KGdbMF09ZS5ub3JtYWwuY2xvbmUoKSxnWzFdPWUubm9ybWFsLmNsb25lKCksZ1syXT1lLm5vcm1hbC5jbG9uZSgpKX0wPAp0aGlzLmZhY2VzLmxlbmd0aCYmKHRoaXMubm9ybWFsc05lZWRVcGRhdGU9ITApfSxjb21wdXRlTW9ycGhOb3JtYWxzOmZ1bmN0aW9uKCl7dmFyIGEsYzt2YXIgZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8YztlKyspe3ZhciBnPXRoaXMuZmFjZXNbZV07Zy5fX29yaWdpbmFsRmFjZU5vcm1hbD9nLl9fb3JpZ2luYWxGYWNlTm9ybWFsLmNvcHkoZy5ub3JtYWwpOmcuX19vcmlnaW5hbEZhY2VOb3JtYWw9Zy5ub3JtYWwuY2xvbmUoKTtnLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzfHwoZy5fX29yaWdpbmFsVmVydGV4Tm9ybWFscz1bXSk7dmFyIHI9MDtmb3IoYT1nLnZlcnRleE5vcm1hbHMubGVuZ3RoO3I8YTtyKyspZy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1tyXT9nLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzW3JdLmNvcHkoZy52ZXJ0ZXhOb3JtYWxzW3JdKTpnLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzW3JdPWcudmVydGV4Tm9ybWFsc1tyXS5jbG9uZSgpfXZhciB2PW5ldyB5YTsKdi5mYWNlcz10aGlzLmZhY2VzO3I9MDtmb3IoYT10aGlzLm1vcnBoVGFyZ2V0cy5sZW5ndGg7cjxhO3IrKyl7aWYoIXRoaXMubW9ycGhOb3JtYWxzW3JdKXt0aGlzLm1vcnBoTm9ybWFsc1tyXT17fTt0aGlzLm1vcnBoTm9ybWFsc1tyXS5mYWNlTm9ybWFscz1bXTt0aGlzLm1vcnBoTm9ybWFsc1tyXS52ZXJ0ZXhOb3JtYWxzPVtdO2c9dGhpcy5tb3JwaE5vcm1hbHNbcl0uZmFjZU5vcm1hbHM7dmFyIHo9dGhpcy5tb3JwaE5vcm1hbHNbcl0udmVydGV4Tm9ybWFscztlPTA7Zm9yKGM9dGhpcy5mYWNlcy5sZW5ndGg7ZTxjO2UrKyl7dmFyIEU9bmV3IGs7dmFyIEY9e2E6bmV3IGssYjpuZXcgayxjOm5ldyBrfTtnLnB1c2goRSk7ei5wdXNoKEYpfX16PXRoaXMubW9ycGhOb3JtYWxzW3JdO3YudmVydGljZXM9dGhpcy5tb3JwaFRhcmdldHNbcl0udmVydGljZXM7di5jb21wdXRlRmFjZU5vcm1hbHMoKTt2LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7ZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8CmM7ZSsrKWc9dGhpcy5mYWNlc1tlXSxFPXouZmFjZU5vcm1hbHNbZV0sRj16LnZlcnRleE5vcm1hbHNbZV0sRS5jb3B5KGcubm9ybWFsKSxGLmEuY29weShnLnZlcnRleE5vcm1hbHNbMF0pLEYuYi5jb3B5KGcudmVydGV4Tm9ybWFsc1sxXSksRi5jLmNvcHkoZy52ZXJ0ZXhOb3JtYWxzWzJdKX1lPTA7Zm9yKGM9dGhpcy5mYWNlcy5sZW5ndGg7ZTxjO2UrKylnPXRoaXMuZmFjZXNbZV0sZy5ub3JtYWw9Zy5fX29yaWdpbmFsRmFjZU5vcm1hbCxnLnZlcnRleE5vcm1hbHM9Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc30sY29tcHV0ZUJvdW5kaW5nQm94OmZ1bmN0aW9uKCl7bnVsbD09PXRoaXMuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PW5ldyB3KTt0aGlzLmJvdW5kaW5nQm94LnNldEZyb21Qb2ludHModGhpcy52ZXJ0aWNlcyl9LGNvbXB1dGVCb3VuZGluZ1NwaGVyZTpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nU3BoZXJlJiYodGhpcy5ib3VuZGluZ1NwaGVyZT0KbmV3IEcpO3RoaXMuYm91bmRpbmdTcGhlcmUuc2V0RnJvbVBvaW50cyh0aGlzLnZlcnRpY2VzKX0sbWVyZ2U6ZnVuY3Rpb24oYSxjLGUpe2lmKGEmJmEuaXNHZW9tZXRyeSl7dmFyIGcscj10aGlzLnZlcnRpY2VzLmxlbmd0aCx2PXRoaXMudmVydGljZXMsej1hLnZlcnRpY2VzLEU9dGhpcy5mYWNlcyxGPWEuZmFjZXMsSj10aGlzLmNvbG9ycyxQPWEuY29sb3JzO3ZvaWQgMD09PWUmJihlPTApO3ZvaWQgMCE9PWMmJihnPShuZXcgdCkuZ2V0Tm9ybWFsTWF0cml4KGMpKTtmb3IodmFyIFI9MCxTPXoubGVuZ3RoO1I8UztSKyspe3ZhciBWPXpbUl0uY2xvbmUoKTt2b2lkIDAhPT1jJiZWLmFwcGx5TWF0cml4NChjKTt2LnB1c2goVil9Uj0wO2ZvcihTPVAubGVuZ3RoO1I8UztSKyspSi5wdXNoKFBbUl0uY2xvbmUoKSk7Uj0wO2ZvcihTPUYubGVuZ3RoO1I8UztSKyspe3o9RltSXTt2YXIgVz16LnZlcnRleE5vcm1hbHM7UD16LnZlcnRleENvbG9ycztKPW5ldyBLKHouYStyLHouYityLHouYysKcik7Si5ub3JtYWwuY29weSh6Lm5vcm1hbCk7dm9pZCAwIT09ZyYmSi5ub3JtYWwuYXBwbHlNYXRyaXgzKGcpLm5vcm1hbGl6ZSgpO2M9MDtmb3Iodj1XLmxlbmd0aDtjPHY7YysrKVY9V1tjXS5jbG9uZSgpLHZvaWQgMCE9PWcmJlYuYXBwbHlNYXRyaXgzKGcpLm5vcm1hbGl6ZSgpLEoudmVydGV4Tm9ybWFscy5wdXNoKFYpO0ouY29sb3IuY29weSh6LmNvbG9yKTtjPTA7Zm9yKHY9UC5sZW5ndGg7Yzx2O2MrKylWPVBbY10sSi52ZXJ0ZXhDb2xvcnMucHVzaChWLmNsb25lKCkpO0oubWF0ZXJpYWxJbmRleD16Lm1hdGVyaWFsSW5kZXgrZTtFLnB1c2goSil9Uj0wO2ZvcihTPWEuZmFjZVZlcnRleFV2cy5sZW5ndGg7UjxTO1IrKylmb3IoZT1hLmZhY2VWZXJ0ZXhVdnNbUl0sdm9pZCAwPT09dGhpcy5mYWNlVmVydGV4VXZzW1JdJiYodGhpcy5mYWNlVmVydGV4VXZzW1JdPVtdKSxjPTAsdj1lLmxlbmd0aDtjPHY7YysrKXtnPWVbY107cj1bXTtFPTA7Zm9yKEY9Zy5sZW5ndGg7RTxGO0UrKylyLnB1c2goZ1tFXS5jbG9uZSgpKTsKdGhpcy5mYWNlVmVydGV4VXZzW1JdLnB1c2gocil9fWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkdlb21ldHJ5LiIsYSl9LG1lcmdlTWVzaDpmdW5jdGlvbihhKXthJiZhLmlzTWVzaD8oYS5tYXRyaXhBdXRvVXBkYXRlJiZhLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWVyZ2UoYS5nZW9tZXRyeSxhLm1hdHJpeCkpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5Lm1lcmdlTWVzaCgpOiBtZXNoIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5NZXNoLiIsYSl9LG1lcmdlVmVydGljZXM6ZnVuY3Rpb24oKXt2YXIgYT17fSxjPVtdLGU9W10sZz1NYXRoLnBvdygxMCw0KSxyO3ZhciB2PTA7Zm9yKHI9dGhpcy52ZXJ0aWNlcy5sZW5ndGg7djxyO3YrKyl7dmFyIHo9dGhpcy52ZXJ0aWNlc1t2XTt6PU1hdGgucm91bmQoei54KmcpKyJfIitNYXRoLnJvdW5kKHoueSpnKSsiXyIrTWF0aC5yb3VuZCh6LnoqCmcpO3ZvaWQgMD09PWFbel0/KGFbel09dixjLnB1c2godGhpcy52ZXJ0aWNlc1t2XSksZVt2XT1jLmxlbmd0aC0xKTplW3ZdPWVbYVt6XV19YT1bXTt2PTA7Zm9yKHI9dGhpcy5mYWNlcy5sZW5ndGg7djxyO3YrKylmb3IoZz10aGlzLmZhY2VzW3ZdLGcuYT1lW2cuYV0sZy5iPWVbZy5iXSxnLmM9ZVtnLmNdLGc9W2cuYSxnLmIsZy5jXSx6PTA7Mz56O3orKylpZihnW3pdPT09Z1soeisxKSUzXSl7YS5wdXNoKHYpO2JyZWFrfWZvcih2PWEubGVuZ3RoLTE7MDw9djt2LS0pZm9yKGc9YVt2XSx0aGlzLmZhY2VzLnNwbGljZShnLDEpLGU9MCxyPXRoaXMuZmFjZVZlcnRleFV2cy5sZW5ndGg7ZTxyO2UrKyl0aGlzLmZhY2VWZXJ0ZXhVdnNbZV0uc3BsaWNlKGcsMSk7dj10aGlzLnZlcnRpY2VzLmxlbmd0aC1jLmxlbmd0aDt0aGlzLnZlcnRpY2VzPWM7cmV0dXJuIHZ9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSl7dGhpcy52ZXJ0aWNlcz1bXTtmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2M8ZTtjKyspe3ZhciBnPQphW2NdO3RoaXMudmVydGljZXMucHVzaChuZXcgayhnLngsZy55LGcuenx8MCkpfXJldHVybiB0aGlzfSxzb3J0RmFjZXNCeU1hdGVyaWFsSW5kZXg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mYWNlcyxjPWEubGVuZ3RoLGU9MDtlPGM7ZSsrKWFbZV0uX2lkPWU7YS5zb3J0KGZ1bmN0aW9uKEYsSil7cmV0dXJuIEYubWF0ZXJpYWxJbmRleC1KLm1hdGVyaWFsSW5kZXh9KTt2YXIgZz10aGlzLmZhY2VWZXJ0ZXhVdnNbMF0scj10aGlzLmZhY2VWZXJ0ZXhVdnNbMV0sdix6O2cmJmcubGVuZ3RoPT09YyYmKHY9W10pO3ImJnIubGVuZ3RoPT09YyYmKHo9W10pO2ZvcihlPTA7ZTxjO2UrKyl7dmFyIEU9YVtlXS5faWQ7diYmdi5wdXNoKGdbRV0pO3omJnoucHVzaChyW0VdKX12JiYodGhpcy5mYWNlVmVydGV4VXZzWzBdPXYpO3omJih0aGlzLmZhY2VWZXJ0ZXhVdnNbMV09eil9LHRvSlNPTjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEob2EsdGEsQmEpe3JldHVybiBCYT9vYXwxPDx0YTpvYSYKfigxPDx0YSl9ZnVuY3Rpb24gYyhvYSl7dmFyIHRhPW9hLngudG9TdHJpbmcoKStvYS55LnRvU3RyaW5nKCkrb2Euei50b1N0cmluZygpO2lmKHZvaWQgMCE9PUpbdGFdKXJldHVybiBKW3RhXTtKW3RhXT1GLmxlbmd0aC8zO0YucHVzaChvYS54LG9hLnksb2Eueik7cmV0dXJuIEpbdGFdfWZ1bmN0aW9uIGUob2Epe3ZhciB0YT1vYS5yLnRvU3RyaW5nKCkrb2EuZy50b1N0cmluZygpK29hLmIudG9TdHJpbmcoKTtpZih2b2lkIDAhPT1SW3RhXSlyZXR1cm4gUlt0YV07Ult0YV09UC5sZW5ndGg7UC5wdXNoKG9hLmdldEhleCgpKTtyZXR1cm4gUlt0YV19ZnVuY3Rpb24gZyhvYSl7dmFyIHRhPW9hLngudG9TdHJpbmcoKStvYS55LnRvU3RyaW5nKCk7aWYodm9pZCAwIT09Vlt0YV0pcmV0dXJuIFZbdGFdO1ZbdGFdPVMubGVuZ3RoLzI7Uy5wdXNoKG9hLngsb2EueSk7cmV0dXJuIFZbdGFdfXZhciByPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiR2VvbWV0cnkiLGdlbmVyYXRvcjoiR2VvbWV0cnkudG9KU09OIn19OwpyLnV1aWQ9dGhpcy51dWlkO3IudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJihyLm5hbWU9dGhpcy5uYW1lKTtpZih2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe3ZhciB2PXRoaXMucGFyYW1ldGVycyx6O2Zvcih6IGluIHYpdm9pZCAwIT09dlt6XSYmKHJbel09dlt6XSk7cmV0dXJuIHJ9dj1bXTtmb3Ioej0wO3o8dGhpcy52ZXJ0aWNlcy5sZW5ndGg7eisrKXt2YXIgRT10aGlzLnZlcnRpY2VzW3pdO3YucHVzaChFLngsRS55LEUueil9RT1bXTt2YXIgRj1bXSxKPXt9LFA9W10sUj17fSxTPVtdLFY9e307Zm9yKHo9MDt6PHRoaXMuZmFjZXMubGVuZ3RoO3orKyl7dmFyIFc9dGhpcy5mYWNlc1t6XSxoYT12b2lkIDAhPT10aGlzLmZhY2VWZXJ0ZXhVdnNbMF1bel0sZmE9MDxXLm5vcm1hbC5sZW5ndGgoKSxyYT0wPFcudmVydGV4Tm9ybWFscy5sZW5ndGgscGE9MSE9PVcuY29sb3Iucnx8MSE9PVcuY29sb3IuZ3x8MSE9PVcuY29sb3IuYixxYT0wPFcudmVydGV4Q29sb3JzLmxlbmd0aCwKdWE9MDt1YT1hKHVhLDAsMCk7dWE9YSh1YSwxLCEwKTt1YT1hKHVhLDIsITEpO3VhPWEodWEsMyxoYSk7dWE9YSh1YSw0LGZhKTt1YT1hKHVhLDUscmEpO3VhPWEodWEsNixwYSk7dWE9YSh1YSw3LHFhKTtFLnB1c2godWEpO0UucHVzaChXLmEsVy5iLFcuYyk7RS5wdXNoKFcubWF0ZXJpYWxJbmRleCk7aGEmJihoYT10aGlzLmZhY2VWZXJ0ZXhVdnNbMF1bel0sRS5wdXNoKGcoaGFbMF0pLGcoaGFbMV0pLGcoaGFbMl0pKSk7ZmEmJkUucHVzaChjKFcubm9ybWFsKSk7cmEmJihmYT1XLnZlcnRleE5vcm1hbHMsRS5wdXNoKGMoZmFbMF0pLGMoZmFbMV0pLGMoZmFbMl0pKSk7cGEmJkUucHVzaChlKFcuY29sb3IpKTtxYSYmKFc9Vy52ZXJ0ZXhDb2xvcnMsRS5wdXNoKGUoV1swXSksZShXWzFdKSxlKFdbMl0pKSl9ci5kYXRhPXt9O3IuZGF0YS52ZXJ0aWNlcz12O3IuZGF0YS5ub3JtYWxzPUY7MDxQLmxlbmd0aCYmKHIuZGF0YS5jb2xvcnM9UCk7MDxTLmxlbmd0aCYmKHIuZGF0YS51dnM9CltTXSk7ci5kYXRhLmZhY2VzPUU7cmV0dXJuIHJ9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB5YSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt2YXIgYyxlLGc7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLmNvbG9ycz1bXTt0aGlzLmZhY2VzPVtdO3RoaXMuZmFjZVZlcnRleFV2cz1bW11dO3RoaXMubW9ycGhUYXJnZXRzPVtdO3RoaXMubW9ycGhOb3JtYWxzPVtdO3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmxpbmVEaXN0YW5jZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5uYW1lPWEubmFtZTt2YXIgcj1hLnZlcnRpY2VzO3ZhciB2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLnZlcnRpY2VzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEuY29sb3JzO3Y9MDtmb3IoYz1yLmxlbmd0aDt2PGM7disrKXRoaXMuY29sb3JzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEuZmFjZXM7dj0wO2ZvcihjPQpyLmxlbmd0aDt2PGM7disrKXRoaXMuZmFjZXMucHVzaChyW3ZdLmNsb25lKCkpO3Y9MDtmb3IoYz1hLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO3Y8Yzt2Kyspe3ZhciB6PWEuZmFjZVZlcnRleFV2c1t2XTt2b2lkIDA9PT10aGlzLmZhY2VWZXJ0ZXhVdnNbdl0mJih0aGlzLmZhY2VWZXJ0ZXhVdnNbdl09W10pO3I9MDtmb3IoZT16Lmxlbmd0aDtyPGU7cisrKXt2YXIgRT16W3JdLEY9W107dmFyIEo9MDtmb3IoZz1FLmxlbmd0aDtKPGc7SisrKUYucHVzaChFW0pdLmNsb25lKCkpO3RoaXMuZmFjZVZlcnRleFV2c1t2XS5wdXNoKEYpfX1KPWEubW9ycGhUYXJnZXRzO3Y9MDtmb3IoYz1KLmxlbmd0aDt2PGM7disrKXtnPXt9O2cubmFtZT1KW3ZdLm5hbWU7aWYodm9pZCAwIT09Slt2XS52ZXJ0aWNlcylmb3IoZy52ZXJ0aWNlcz1bXSxyPTAsZT1KW3ZdLnZlcnRpY2VzLmxlbmd0aDtyPGU7cisrKWcudmVydGljZXMucHVzaChKW3ZdLnZlcnRpY2VzW3JdLmNsb25lKCkpO2lmKHZvaWQgMCE9PUpbdl0ubm9ybWFscylmb3IoZy5ub3JtYWxzPQpbXSxyPTAsZT1KW3ZdLm5vcm1hbHMubGVuZ3RoO3I8ZTtyKyspZy5ub3JtYWxzLnB1c2goSlt2XS5ub3JtYWxzW3JdLmNsb25lKCkpO3RoaXMubW9ycGhUYXJnZXRzLnB1c2goZyl9Sj1hLm1vcnBoTm9ybWFsczt2PTA7Zm9yKGM9Si5sZW5ndGg7djxjO3YrKyl7Zz17fTtpZih2b2lkIDAhPT1KW3ZdLnZlcnRleE5vcm1hbHMpZm9yKGcudmVydGV4Tm9ybWFscz1bXSxyPTAsZT1KW3ZdLnZlcnRleE5vcm1hbHMubGVuZ3RoO3I8ZTtyKyspej1KW3ZdLnZlcnRleE5vcm1hbHNbcl0sRT17fSxFLmE9ei5hLmNsb25lKCksRS5iPXouYi5jbG9uZSgpLEUuYz16LmMuY2xvbmUoKSxnLnZlcnRleE5vcm1hbHMucHVzaChFKTtpZih2b2lkIDAhPT1KW3ZdLmZhY2VOb3JtYWxzKWZvcihnLmZhY2VOb3JtYWxzPVtdLHI9MCxlPUpbdl0uZmFjZU5vcm1hbHMubGVuZ3RoO3I8ZTtyKyspZy5mYWNlTm9ybWFscy5wdXNoKEpbdl0uZmFjZU5vcm1hbHNbcl0uY2xvbmUoKSk7dGhpcy5tb3JwaE5vcm1hbHMucHVzaChnKX1yPQphLnNraW5XZWlnaHRzO3Y9MDtmb3IoYz1yLmxlbmd0aDt2PGM7disrKXRoaXMuc2tpbldlaWdodHMucHVzaChyW3ZdLmNsb25lKCkpO3I9YS5za2luSW5kaWNlczt2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLnNraW5JbmRpY2VzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEubGluZURpc3RhbmNlczt2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLmxpbmVEaXN0YW5jZXMucHVzaChyW3ZdKTt2PWEuYm91bmRpbmdCb3g7bnVsbCE9PXYmJih0aGlzLmJvdW5kaW5nQm94PXYuY2xvbmUoKSk7dj1hLmJvdW5kaW5nU3BoZXJlO251bGwhPT12JiYodGhpcy5ib3VuZGluZ1NwaGVyZT12LmNsb25lKCkpO3RoaXMuZWxlbWVudHNOZWVkVXBkYXRlPWEuZWxlbWVudHNOZWVkVXBkYXRlO3RoaXMudmVydGljZXNOZWVkVXBkYXRlPWEudmVydGljZXNOZWVkVXBkYXRlO3RoaXMudXZzTmVlZFVwZGF0ZT1hLnV2c05lZWRVcGRhdGU7dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT1hLm5vcm1hbHNOZWVkVXBkYXRlOwp0aGlzLmNvbG9yc05lZWRVcGRhdGU9YS5jb2xvcnNOZWVkVXBkYXRlO3RoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGU9YS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZTt0aGlzLmdyb3Vwc05lZWRVcGRhdGU9YS5ncm91cHNOZWVkVXBkYXRlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO1NhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7U2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNhO1hhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7WGEucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhhO3ZhciBGbT17Y2xvbmU6dWIsbWVyZ2U6QmJ9O3FiLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtxYi5wcm90b3R5cGUuY29uc3RydWN0b3I9cWI7cWIucHJvdG90eXBlLmlzU2hhZGVyTWF0ZXJpYWw9ITA7cWIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmEpO3RoaXMuZnJhZ21lbnRTaGFkZXI9YS5mcmFnbWVudFNoYWRlcjt0aGlzLnZlcnRleFNoYWRlcj1hLnZlcnRleFNoYWRlcjt0aGlzLnVuaWZvcm1zPXViKGEudW5pZm9ybXMpO3RoaXMuZGVmaW5lcz1PYmplY3QuYXNzaWduKHt9LGEuZGVmaW5lcyk7dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy5saWdodHM9YS5saWdodHM7dGhpcy5jbGlwcGluZz1hLmNsaXBwaW5nO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFsczt0aGlzLmV4dGVuc2lvbnM9YS5leHRlbnNpb25zO3JldHVybiB0aGlzfTtxYi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKGEpe3ZhciBjPU0ucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSk7Yy51bmlmb3Jtcz17fTtmb3IodmFyIGUgaW4gdGhpcy51bmlmb3Jtcyl7dmFyIGc9CnRoaXMudW5pZm9ybXNbZV0udmFsdWU7Yy51bmlmb3Jtc1tlXT1nJiZnLmlzVGV4dHVyZT97dHlwZToidCIsdmFsdWU6Zy50b0pTT04oYSkudXVpZH06ZyYmZy5pc0NvbG9yP3t0eXBlOiJjIix2YWx1ZTpnLmdldEhleCgpfTpnJiZnLmlzVmVjdG9yMj97dHlwZToidjIiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzVmVjdG9yMz97dHlwZToidjMiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzVmVjdG9yND97dHlwZToidjQiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzTWF0cml4Mz97dHlwZToibTMiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzTWF0cml4ND97dHlwZToibTQiLHZhbHVlOmcudG9BcnJheSgpfTp7dmFsdWU6Z319MDxPYmplY3Qua2V5cyh0aGlzLmRlZmluZXMpLmxlbmd0aCYmKGMuZGVmaW5lcz10aGlzLmRlZmluZXMpO2MudmVydGV4U2hhZGVyPXRoaXMudmVydGV4U2hhZGVyO2MuZnJhZ21lbnRTaGFkZXI9dGhpcy5mcmFnbWVudFNoYWRlcjthPXt9O2Zvcih2YXIgciBpbiB0aGlzLmV4dGVuc2lvbnMpITA9PT0KdGhpcy5leHRlbnNpb25zW3JdJiYoYVtyXT0hMCk7MDxPYmplY3Qua2V5cyhhKS5sZW5ndGgmJihjLmV4dGVuc2lvbnM9YSk7cmV0dXJuIGN9O3piLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp6Yixpc0NhbWVyYTohMCxjb3B5OmZ1bmN0aW9uKGEsYyl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSxjKTt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KGEubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLnByb2plY3Rpb25NYXRyaXguY29weShhLnByb2plY3Rpb25NYXRyaXgpO3RoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTtyZXR1cm4gdGhpc30sZ2V0V29ybGREaXJlY3Rpb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQ2FtZXJhOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksCmE9bmV3IGspO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApO3ZhciBjPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGEuc2V0KC1jWzhdLC1jWzldLC1jWzEwXSkubm9ybWFsaXplKCl9LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcyxhKTt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19KTt2Yi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZiLGlzUGVyc3BlY3RpdmVDYW1lcmE6ITAsY29weTpmdW5jdGlvbihhLGMpe3piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhLGMpO3RoaXMuZm92PWEuZm92O3RoaXMuem9vbT1hLnpvb207dGhpcy5uZWFyPWEubmVhcjt0aGlzLmZhcj0KYS5mYXI7dGhpcy5mb2N1cz1hLmZvY3VzO3RoaXMuYXNwZWN0PWEuYXNwZWN0O3RoaXMudmlldz1udWxsPT09YS52aWV3P251bGw6T2JqZWN0LmFzc2lnbih7fSxhLnZpZXcpO3RoaXMuZmlsbUdhdWdlPWEuZmlsbUdhdWdlO3RoaXMuZmlsbU9mZnNldD1hLmZpbG1PZmZzZXQ7cmV0dXJuIHRoaXN9LHNldEZvY2FsTGVuZ3RoOmZ1bmN0aW9uKGEpe3RoaXMuZm92PTIqaGIuUkFEMkRFRypNYXRoLmF0YW4oLjUqdGhpcy5nZXRGaWxtSGVpZ2h0KCkvYSk7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LGdldEZvY2FsTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuLjUqdGhpcy5nZXRGaWxtSGVpZ2h0KCkvTWF0aC50YW4oLjUqaGIuREVHMlJBRCp0aGlzLmZvdil9LGdldEVmZmVjdGl2ZUZPVjpmdW5jdGlvbigpe3JldHVybiAyKmhiLlJBRDJERUcqTWF0aC5hdGFuKE1hdGgudGFuKC41KmhiLkRFRzJSQUQqdGhpcy5mb3YpL3RoaXMuem9vbSl9LGdldEZpbG1XaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbG1HYXVnZSoKTWF0aC5taW4odGhpcy5hc3BlY3QsMSl9LGdldEZpbG1IZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UvTWF0aC5tYXgodGhpcy5hc3BlY3QsMSl9LHNldFZpZXdPZmZzZXQ6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3RoaXMuYXNwZWN0PWEvYztudWxsPT09dGhpcy52aWV3JiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KTt0aGlzLnZpZXcuZW5hYmxlZD0hMDt0aGlzLnZpZXcuZnVsbFdpZHRoPWE7dGhpcy52aWV3LmZ1bGxIZWlnaHQ9Yzt0aGlzLnZpZXcub2Zmc2V0WD1lO3RoaXMudmlldy5vZmZzZXRZPWc7dGhpcy52aWV3LndpZHRoPXI7dGhpcy52aWV3LmhlaWdodD12O3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxjbGVhclZpZXdPZmZzZXQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSwKdXBkYXRlUHJvamVjdGlvbk1hdHJpeDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmVhcixjPWEqTWF0aC50YW4oLjUqaGIuREVHMlJBRCp0aGlzLmZvdikvdGhpcy56b29tLGU9MipjLGc9dGhpcy5hc3BlY3QqZSxyPS0uNSpnLHY9dGhpcy52aWV3O2lmKG51bGwhPT10aGlzLnZpZXcmJnRoaXMudmlldy5lbmFibGVkKXt2YXIgej12LmZ1bGxXaWR0aCxFPXYuZnVsbEhlaWdodDtyKz12Lm9mZnNldFgqZy96O2MtPXYub2Zmc2V0WSplL0U7Zyo9di53aWR0aC96O2UqPXYuaGVpZ2h0L0V9dj10aGlzLmZpbG1PZmZzZXQ7MCE9PXYmJihyKz1hKnYvdGhpcy5nZXRGaWxtV2lkdGgoKSk7dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZShyLHIrZyxjLGMtZSxhLHRoaXMuZmFyKTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5wcm9qZWN0aW9uTWF0cml4KX0sdG9KU09OOmZ1bmN0aW9uKGEpe2E9QS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcywKYSk7YS5vYmplY3QuZm92PXRoaXMuZm92O2Eub2JqZWN0Lnpvb209dGhpcy56b29tO2Eub2JqZWN0Lm5lYXI9dGhpcy5uZWFyO2Eub2JqZWN0LmZhcj10aGlzLmZhcjthLm9iamVjdC5mb2N1cz10aGlzLmZvY3VzO2Eub2JqZWN0LmFzcGVjdD10aGlzLmFzcGVjdDtudWxsIT09dGhpcy52aWV3JiYoYS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpO2Eub2JqZWN0LmZpbG1HYXVnZT10aGlzLmZpbG1HYXVnZTthLm9iamVjdC5maWxtT2Zmc2V0PXRoaXMuZmlsbU9mZnNldDtyZXR1cm4gYX19KTtHYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7R2IucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdiO05iLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG0ucHJvdG90eXBlKTtOYi5wcm90b3R5cGUuY29uc3RydWN0b3I9TmI7TmIucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPSEwO05iLnByb3RvdHlwZS5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZT0KZnVuY3Rpb24oYSxjKXt0aGlzLnRleHR1cmUudHlwZT1jLnR5cGU7dGhpcy50ZXh0dXJlLmZvcm1hdD1jLmZvcm1hdDt0aGlzLnRleHR1cmUuZW5jb2Rpbmc9Yy5lbmNvZGluZzt2YXIgZT1uZXcgeSxnPW5ldyBxYih7dHlwZToiQ3ViZW1hcEZyb21FcXVpcmVjdCIsdW5pZm9ybXM6dWIoe3RFcXVpcmVjdDp7dmFsdWU6bnVsbH19KSx2ZXJ0ZXhTaGFkZXI6InZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxufSIsCmZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MThcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NFxudm9pZCBtYWluKCkge1xuXHR2ZWMzIGRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XG5cdHZlYzIgc2FtcGxlVVY7XG5cdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggZGlyZWN0aW9uLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcblx0c2FtcGxlVVYueCBceDNkIGF0YW4oIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xufSIsc2lkZToxLGJsZW5kaW5nOjB9KTtnLnVuaWZvcm1zLnRFcXVpcmVjdC52YWx1ZT1jOwpjPW5ldyB4YShuZXcgWGEoNSw1LDUpLGcpO2UuYWRkKGMpO2c9bmV3IEdiKDEsMTAsMSk7Zy5yZW5kZXJUYXJnZXQ9dGhpcztnLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWU9IkN1YmVDYW1lcmFUZXh0dXJlIjtnLnVwZGF0ZShhLGUpO2MuZ2VvbWV0cnkuZGlzcG9zZSgpO2MubWF0ZXJpYWwuZGlzcG9zZSgpO3JldHVybiB0aGlzfTtBYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShsLnByb3RvdHlwZSk7QWIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUFiO0FiLnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlPSEwO3ZhciBKaT1uZXcgayxHbT1uZXcgayxIbT1uZXcgdDtPYmplY3QuYXNzaWduKEhiLnByb3RvdHlwZSx7aXNQbGFuZTohMCxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLm5vcm1hbC5jb3B5KGEpO3RoaXMuY29uc3RhbnQ9YztyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50czpmdW5jdGlvbihhLGMsZSxnKXt0aGlzLm5vcm1hbC5zZXQoYSxjLGUpO3RoaXMuY29uc3RhbnQ9ZztyZXR1cm4gdGhpc30sCnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50OmZ1bmN0aW9uKGEsYyl7dGhpcy5ub3JtYWwuY29weShhKTt0aGlzLmNvbnN0YW50PS1jLmRvdCh0aGlzLm5vcm1hbCk7cmV0dXJuIHRoaXN9LHNldEZyb21Db3BsYW5hclBvaW50czpmdW5jdGlvbihhLGMsZSl7Yz1KaS5zdWJWZWN0b3JzKGUsYykuY3Jvc3MoR20uc3ViVmVjdG9ycyhhLGMpKS5ub3JtYWxpemUoKTt0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KGMsYSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubm9ybWFsLmNvcHkoYS5ub3JtYWwpO3RoaXMuY29uc3RhbnQ9YS5jb25zdGFudDtyZXR1cm4gdGhpc30sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTt0aGlzLm5vcm1hbC5tdWx0aXBseVNjYWxhcihhKTt0aGlzLmNvbnN0YW50Kj1hO3JldHVybiB0aGlzfSwKbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb25zdGFudCo9LTE7dGhpcy5ub3JtYWwubmVnYXRlKCk7cmV0dXJuIHRoaXN9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KGEpK3RoaXMuY29uc3RhbnR9LGRpc3RhbmNlVG9TcGhlcmU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KGEuY2VudGVyKS1hLnJhZGl1c30scHJvamVjdFBvaW50OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5wcm9qZWN0UG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7cmV0dXJuIGMuY29weSh0aGlzLm5vcm1hbCkubXVsdGlwbHlTY2FsYXIoLXRoaXMuZGlzdGFuY2VUb1BvaW50KGEpKS5hZGQoYSl9LGludGVyc2VjdExpbmU6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5QbGFuZTogLmludGVyc2VjdExpbmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksCmM9bmV3IGspO3ZhciBlPWEuZGVsdGEoSmkpLGc9dGhpcy5ub3JtYWwuZG90KGUpO2lmKDA9PT1nKXtpZigwPT09dGhpcy5kaXN0YW5jZVRvUG9pbnQoYS5zdGFydCkpcmV0dXJuIGMuY29weShhLnN0YXJ0KX1lbHNlIGlmKGc9LShhLnN0YXJ0LmRvdCh0aGlzLm5vcm1hbCkrdGhpcy5jb25zdGFudCkvZywhKDA+Z3x8MTxnKSlyZXR1cm4gYy5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKGcpLmFkZChhLnN0YXJ0KX0saW50ZXJzZWN0c0xpbmU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5kaXN0YW5jZVRvUG9pbnQoYS5zdGFydCk7YT10aGlzLmRpc3RhbmNlVG9Qb2ludChhLmVuZCk7cmV0dXJuIDA+YyYmMDxhfHwwPmEmJjA8Y30saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pbnRlcnNlY3RzUGxhbmUodGhpcyl9LGludGVyc2VjdHNTcGhlcmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW50ZXJzZWN0c1BsYW5lKHRoaXMpfSxjb3BsYW5hclBvaW50OmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5QbGFuZTogLmNvcGxhbmFyUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuY29weSh0aGlzLm5vcm1hbCkubXVsdGlwbHlTY2FsYXIoLXRoaXMuY29uc3RhbnQpfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSxjKXtjPWN8fEhtLmdldE5vcm1hbE1hdHJpeChhKTthPXRoaXMuY29wbGFuYXJQb2ludChKaSkuYXBwbHlNYXRyaXg0KGEpO2M9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKGMpLm5vcm1hbGl6ZSgpO3RoaXMuY29uc3RhbnQ9LWEuZG90KGMpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSl7dGhpcy5jb25zdGFudC09YS5kb3QodGhpcy5ub3JtYWwpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9ybWFsLmVxdWFscyh0aGlzLm5vcm1hbCkmJmEuY29uc3RhbnQ9PT10aGlzLmNvbnN0YW50fX0pO3ZhciBtZj1uZXcgRyxwaD1uZXcgaztPYmplY3QuYXNzaWduKGljLnByb3RvdHlwZSwKe3NldDpmdW5jdGlvbihhLGMsZSxnLHIsdil7dmFyIHo9dGhpcy5wbGFuZXM7elswXS5jb3B5KGEpO3pbMV0uY29weShjKTt6WzJdLmNvcHkoZSk7elszXS5jb3B5KGcpO3pbNF0uY29weShyKTt6WzVdLmNvcHkodik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz10aGlzLnBsYW5lcyxlPTA7Nj5lO2UrKyljW2VdLmNvcHkoYS5wbGFuZXNbZV0pO3JldHVybiB0aGlzfSxzZXRGcm9tTWF0cml4OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGxhbmVzLGU9YS5lbGVtZW50czthPWVbMF07dmFyIGc9ZVsxXSxyPWVbMl0sdj1lWzNdLHo9ZVs0XSxFPWVbNV0sRj1lWzZdLEo9ZVs3XSxQPWVbOF0sUj1lWzldLFM9ZVsxMF0sVj1lWzExXSxXPWVbMTJdLGhhPWVbMTNdLGZhPWVbMTRdO2U9ZVsxNV07Y1swXS5zZXRDb21wb25lbnRzKHYtYSxKLXosVi1QLGUtVykubm9ybWFsaXplKCk7CmNbMV0uc2V0Q29tcG9uZW50cyh2K2EsSit6LFYrUCxlK1cpLm5vcm1hbGl6ZSgpO2NbMl0uc2V0Q29tcG9uZW50cyh2K2csSitFLFYrUixlK2hhKS5ub3JtYWxpemUoKTtjWzNdLnNldENvbXBvbmVudHModi1nLEotRSxWLVIsZS1oYSkubm9ybWFsaXplKCk7Y1s0XS5zZXRDb21wb25lbnRzKHYtcixKLUYsVi1TLGUtZmEpLm5vcm1hbGl6ZSgpO2NbNV0uc2V0Q29tcG9uZW50cyh2K3IsSitGLFYrUyxlK2ZhKS5ub3JtYWxpemUoKTtyZXR1cm4gdGhpc30saW50ZXJzZWN0c09iamVjdDpmdW5jdGlvbihhKXt2YXIgYz1hLmdlb21ldHJ5O251bGw9PT1jLmJvdW5kaW5nU3BoZXJlJiZjLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO21mLmNvcHkoYy5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUobWYpfSxpbnRlcnNlY3RzU3ByaXRlOmZ1bmN0aW9uKGEpe21mLmNlbnRlci5zZXQoMCwwLDApO21mLnJhZGl1cz0KLjcwNzEwNjc4MTE4NjU0NzY7bWYuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUobWYpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGxhbmVzLGU9YS5jZW50ZXI7YT0tYS5yYWRpdXM7Zm9yKHZhciBnPTA7Nj5nO2crKylpZihjW2ddLmRpc3RhbmNlVG9Qb2ludChlKTxhKXJldHVybiExO3JldHVybiEwfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz10aGlzLnBsYW5lcyxlPTA7Nj5lO2UrKyl7dmFyIGc9Y1tlXTtwaC54PTA8Zy5ub3JtYWwueD9hLm1heC54OmEubWluLng7cGgueT0wPGcubm9ybWFsLnk/YS5tYXgueTphLm1pbi55O3BoLno9MDxnLm5vcm1hbC56P2EubWF4Lno6YS5taW4uejtpZigwPmcuZGlzdGFuY2VUb1BvaW50KHBoKSlyZXR1cm4hMX1yZXR1cm4hMH0sY29udGFpbnNQb2ludDpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5wbGFuZXMsZT0wOzY+ZTtlKyspaWYoMD4KY1tlXS5kaXN0YW5jZVRvUG9pbnQoYSkpcmV0dXJuITE7cmV0dXJuITB9fSk7dmFyIHJiPXthbHBoYW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHRkaWZmdXNlQ29sb3IuYSAqXHgzZCB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xuI2VuZGlmIixhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FMUEhBTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xuI2VuZGlmIixhbHBoYXRlc3RfZnJhZ21lbnQ6IiNpZmRlZiBBTFBIQVRFU1Rcblx0aWYgKCBkaWZmdXNlQ29sb3IuYSBceDNjIEFMUEhBVEVTVCApIGRpc2NhcmQ7XG4jZW5kaWYiLGFvbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FPTUFQXG5cdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gXHgzZCAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICpceDNkIGFtYmllbnRPY2NsdXNpb247XG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggU1RBTkRBUkQgKVxuXHRcdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICpceDNkIGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKYW9tYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcblx0dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcbiNlbmRpZiIsYmVnaW5fdmVydGV4OiJ2ZWMzIHRyYW5zZm9ybWVkIFx4M2QgdmVjMyggcG9zaXRpb24gKTsiLGJlZ2lubm9ybWFsX3ZlcnRleDoidmVjMyBvYmplY3ROb3JtYWwgXHgzZCB2ZWMzKCBub3JtYWwgKTtcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIG9iamVjdFRhbmdlbnQgXHgzZCB2ZWMzKCB0YW5nZW50Lnh5eiApO1xuI2VuZGlmIixic2RmczoidmVjMiBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IHZlYzQgYzAgXHgzZCB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xuXHRjb25zdCB2ZWM0IGMxIFx4M2QgdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTtcblx0dmVjNCByIFx4M2Qgcm91Z2huZXNzICogYzAgKyBjMTtcblx0ZmxvYXQgYTAwNCBceDNkIG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XG5cdHJldHVybiB2ZWMyKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XG59XG5mbG9hdCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHtcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXG5cdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiBceDNkIDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcblx0aWYoIGN1dG9mZkRpc3RhbmNlIFx4M2UgMC4wICkge1xuXHRcdGRpc3RhbmNlRmFsbG9mZiAqXHgzZCBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xuXHR9XG5cdHJldHVybiBkaXN0YW5jZUZhbGxvZmY7XG4jZWxzZVxuXHRpZiggY3V0b2ZmRGlzdGFuY2UgXHgzZSAwLjAgXHgyNlx4MjYgZGVjYXlFeHBvbmVudCBceDNlIDAuMCApIHtcblx0XHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XG5cdH1cblx0cmV0dXJuIDEuMDtcbiNlbmRpZlxufVxudmVjMyBCUkRGX0RpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xufVxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XG5cdGZsb2F0IGZyZXNuZWwgXHgzZCBleHAyKCAoIC01LjU1NDczICogZG90TEggLSA2Ljk4MzE2ICkgKiBkb3RMSCApO1xuXHRyZXR1cm4gKCAxLjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcbn1cbnZlYzMgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggY29uc3QgaW4gdmVjMyBGMCwgY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgZnJlc25lbCBceDNkIGV4cDIoICggLTUuNTU0NzMgKiBkb3ROViAtIDYuOTgzMTYgKSAqIGRvdE5WICk7XG5cdHZlYzMgRnIgXHgzZCBtYXgoIHZlYzMoIDEuMCAtIHJvdWdobmVzcyApLCBGMCApIC0gRjA7XG5cdHJldHVybiBGciAqIGZyZXNuZWwgKyBGMDtcbn1cbmZsb2F0IEdfR0dYX1NtaXRoKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGdsIFx4M2QgZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcblx0ZmxvYXQgZ3YgXHgzZCBkb3ROViArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRyZXR1cm4gMS4wIC8gKCBnbCAqIGd2ICk7XG59XG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XG5cdGZsb2F0IGEyIFx4M2QgcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZ3YgXHgzZCBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRmbG9hdCBnbCBceDNkIGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTtcbn1cbmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdGZsb2F0IGEyIFx4M2QgcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZGVub20gXHgzZCBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wO1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGFscGhhIFx4M2QgcG93Miggcm91Z2huZXNzICk7XG5cdHZlYzMgaGFsZkRpciBceDNkIG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyB2aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCBceDNkIHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHIFx4M2QgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XG5cdGZsb2F0IEQgXHgzZCBEX0dHWCggYWxwaGEsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFICBceDNkIDY0LjA7XG5cdGNvbnN0IGZsb2F0IExVVF9TQ0FMRSBceDNkICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFO1xuXHRjb25zdCBmbG9hdCBMVVRfQklBUyAgXHgzZCAwLjUgLyBMVVRfU0laRTtcblx0ZmxvYXQgZG90TlYgXHgzZCBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcblx0dmVjMiB1diBceDNkIHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApO1xuXHR1diBceDNkIHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XG5cdHJldHVybiB1djtcbn1cbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xuXHRmbG9hdCBsIFx4M2QgbGVuZ3RoKCBmICk7XG5cdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcbn1cbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xuXHRmbG9hdCB4IFx4M2QgZG90KCB2MSwgdjIgKTtcblx0ZmxvYXQgeSBceDNkIGFicyggeCApO1xuXHRmbG9hdCBhIFx4M2QgMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5O1xuXHRmbG9hdCBiIFx4M2QgMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5O1xuXHRmbG9hdCB2IFx4M2QgYSAvIGI7XG5cdGZsb2F0IHRoZXRhX3NpbnRoZXRhIFx4M2QgKCB4IFx4M2UgMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjtcblx0cmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhO1xufVxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XG5cdHZlYzMgdjEgXHgzZCByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgdjIgXHgzZCByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgbGlnaHROb3JtYWwgXHgzZCBjcm9zcyggdjEsIHYyICk7XG5cdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgXHgzYyAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XG5cdHZlYzMgVDEsIFQyO1xuXHRUMSBceDNkIG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xuXHRUMiBceDNkIC0gY3Jvc3MoIE4sIFQxICk7XG5cdG1hdDMgbWF0IFx4M2QgbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7XG5cdHZlYzMgY29vcmRzWyA0IF07XG5cdGNvb3Jkc1sgMCBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XG5cdGNvb3Jkc1sgMSBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7XG5cdGNvb3Jkc1sgMiBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XG5cdGNvb3Jkc1sgMyBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XG5cdGNvb3Jkc1sgMCBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDAgXSApO1xuXHRjb29yZHNbIDEgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcblx0Y29vcmRzWyAyIF0gXHgzZCBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XG5cdGNvb3Jkc1sgMyBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDMgXSApO1xuXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICtceDNkIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xuXHRmbG9hdCByZXN1bHQgXHgzZCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTtcblx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0dmVjMiBicmRmIFx4M2QgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHJldHVybiBzcGVjdWxhckNvbG9yICogYnJkZi54ICsgYnJkZi55O1xufVxudm9pZCBCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggc3BlY3VsYXJDb2xvciwgZG90TlYsIHJvdWdobmVzcyApO1xuXHR2ZWMyIGJyZGYgXHgzZCBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMyBGc3NFc3MgXHgzZCBGICogYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFc3MgXHgzZCBicmRmLnggKyBicmRmLnk7XG5cdGZsb2F0IEVtcyBceDNkIDEuMCAtIEVzcztcblx0dmVjMyBGYXZnIFx4M2Qgc3BlY3VsYXJDb2xvciArICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogMC4wNDc2MTk7XHR2ZWMzIEZtcyBceDNkIEZzc0VzcyAqIEZhdmcgLyAoIDEuMCAtIEVtcyAqIEZhdmcgKTtcblx0c2luZ2xlU2NhdHRlciArXHgzZCBGc3NFc3M7XG5cdG11bHRpU2NhdHRlciArXHgzZCBGbXMgKiBFbXM7XG59XG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkge1xuXHRyZXR1cm4gMC4yNTtcbn1cbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcblx0dmVjMyBoYWxmRGlyIFx4M2Qgbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCBceDNkIHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHIFx4M2QgR19CbGlublBob25nX0ltcGxpY2l0KCApO1xuXHRmbG9hdCBEIFx4M2QgRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxuZmxvYXQgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBjb25zdCBpbiBmbG9hdCBnZ3hSb3VnaG5lc3MgKSB7XG5cdHJldHVybiAoIDIuMCAvIHBvdzIoIGdneFJvdWdobmVzcyArIDAuMDAwMSApIC0gMi4wICk7XG59XG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XG5cdHJldHVybiBzcXJ0KCAyLjAgLyAoIGJsaW5uRXhwb25lbnQgKyAyLjAgKSApO1xufVxuI2lmIGRlZmluZWQoIFVTRV9TSEVFTiApXG5mbG9hdCBEX0NoYXJsaWUoZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBOb0gpIHtcblx0ZmxvYXQgaW52QWxwaGEgIFx4M2QgMS4wIC8gcm91Z2huZXNzO1xuXHRmbG9hdCBjb3MyaCBceDNkIE5vSCAqIE5vSDtcblx0ZmxvYXQgc2luMmggXHgzZCBtYXgoMS4wIC0gY29zMmgsIDAuMDA3ODEyNSk7XHRyZXR1cm4gKDIuMCArIGludkFscGhhKSAqIHBvdyhzaW4yaCwgaW52QWxwaGEgKiAwLjUpIC8gKDIuMCAqIFBJKTtcbn1cbmZsb2F0IFZfTmV1YmVsdChmbG9hdCBOb1YsIGZsb2F0IE5vTCkge1xuXHRyZXR1cm4gc2F0dXJhdGUoMS4wIC8gKDQuMCAqIChOb0wgKyBOb1YgLSBOb0wgKiBOb1YpKSk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfU2hlZW4oIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBMLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCB2ZWMzIHNwZWN1bGFyQ29sb3IgKSB7XG5cdHZlYzMgTiBceDNkIGdlb21ldHJ5Lm5vcm1hbDtcblx0dmVjMyBWIFx4M2QgZ2VvbWV0cnkudmlld0Rpcjtcblx0dmVjMyBIIFx4M2Qgbm9ybWFsaXplKCBWICsgTCApO1xuXHRmbG9hdCBkb3ROSCBceDNkIHNhdHVyYXRlKCBkb3QoIE4sIEggKSApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIERfQ2hhcmxpZSggcm91Z2huZXNzLCBkb3ROSCApICogVl9OZXViZWx0KCBkb3QoTiwgViksIGRvdChOLCBMKSApO1xufVxuI2VuZGlmIiwKYnVtcG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0JVTVBNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYnVtcE1hcDtcblx0dW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7XG5cdHZlYzIgZEhkeHlfZndkKCkge1xuXHRcdHZlYzIgZFNUZHggXHgzZCBkRmR4KCB2VXYgKTtcblx0XHR2ZWMyIGRTVGR5IFx4M2QgZEZkeSggdlV2ICk7XG5cdFx0ZmxvYXQgSGxsIFx4M2QgYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKS54O1xuXHRcdGZsb2F0IGRCeCBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHggKS54IC0gSGxsO1xuXHRcdGZsb2F0IGRCeSBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHkgKS54IC0gSGxsO1xuXHRcdHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xuXHR9XG5cdHZlYzMgcGVydHVyYk5vcm1hbEFyYiggdmVjMyBzdXJmX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgZEhkeHkgKSB7XG5cdFx0dmVjMyB2U2lnbWFYIFx4M2QgdmVjMyggZEZkeCggc3VyZl9wb3MueCApLCBkRmR4KCBzdXJmX3Bvcy55ICksIGRGZHgoIHN1cmZfcG9zLnogKSApO1xuXHRcdHZlYzMgdlNpZ21hWSBceDNkIHZlYzMoIGRGZHkoIHN1cmZfcG9zLnggKSwgZEZkeSggc3VyZl9wb3MueSApLCBkRmR5KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZOIFx4M2Qgc3VyZl9ub3JtO1xuXHRcdHZlYzMgUjEgXHgzZCBjcm9zcyggdlNpZ21hWSwgdk4gKTtcblx0XHR2ZWMzIFIyIFx4M2QgY3Jvc3MoIHZOLCB2U2lnbWFYICk7XG5cdFx0ZmxvYXQgZkRldCBceDNkIGRvdCggdlNpZ21hWCwgUjEgKTtcblx0XHRmRGV0ICpceDNkICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHR2ZWMzIHZHcmFkIFx4M2Qgc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XG5cdH1cbiNlbmRpZiIsCmNsaXBwaW5nX3BsYW5lc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgXHgzZSAwXG5cdHZlYzQgcGxhbmU7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xuXHRcdHBsYW5lIFx4M2QgY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRpZiAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgXHgzZSBwbGFuZS53ICkgZGlzY2FyZDtcblx0fVxuXHQjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIFx4M2MgTlVNX0NMSVBQSU5HX1BMQU5FU1xuXHRcdGJvb2wgY2xpcHBlZCBceDNkIHRydWU7XG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRcdGZvciAoIGludCBpIFx4M2QgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIFx4M2MgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRcdHBsYW5lIFx4M2QgY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRcdGNsaXBwZWQgXHgzZCAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgXHgzZSBwbGFuZS53ICkgXHgyNlx4MjYgY2xpcHBlZDtcblx0XHR9XG5cdFx0aWYgKCBjbGlwcGVkICkgZGlzY2FyZDtcblx0I2VuZGlmXG4jZW5kaWYiLApjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgXHgzZSAwXG5cdCNpZiAhIGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgISBkZWZpbmVkKCBQSE9ORyApIFx4MjZceDI2ICEgZGVmaW5lZCggTUFUQ0FQIClcblx0XHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcblx0I2VuZGlmXG5cdHVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMCBceDI2XHgyNiAhIGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgISBkZWZpbmVkKCBQSE9ORyApIFx4MjZceDI2ICEgZGVmaW5lZCggTUFUQ0FQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWYiLGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMCBceDI2XHgyNiAhIGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgISBkZWZpbmVkKCBQSE9ORyApIFx4MjZceDI2ICEgZGVmaW5lZCggTUFUQ0FQIClcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWYiLApjb2xvcl9mcmFnbWVudDoiI2lmZGVmIFVTRV9DT0xPUlxuXHRkaWZmdXNlQ29sb3IucmdiICpceDNkIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9DT0xPUlxuXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmIixjb2xvcl9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9DT0xPUlxuXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmIixjb2xvcl92ZXJ0ZXg6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dkNvbG9yLnh5eiBceDNkIGNvbG9yLnh5ejtcbiNlbmRpZiIsY29tbW9uOiIjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTlcbiNkZWZpbmUgUEkyIDYuMjgzMTg1MzA3MThcbiNkZWZpbmUgUElfSEFMRiAxLjU3MDc5NjMyNjc5NDlcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcbiNkZWZpbmUgTE9HMiAxLjQ0MjY5NVxuI2RlZmluZSBFUFNJTE9OIDFlLTZcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcbiNkZWZpbmUgd2hpdGVDb21wbGVtZW50KGEpICggMS4wIC0gc2F0dXJhdGUoIGEgKSApXG5mbG9hdCBwb3cyKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4OyB9XG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cbmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyIFx4M2QgeCp4OyByZXR1cm4geDIqeDI7IH1cbmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7IHJldHVybiBkb3QoIGNvbG9yLCB2ZWMzKCAwLjMzMzMgKSApOyB9XG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xuXHRjb25zdCBoaWdocCBmbG9hdCBhIFx4M2QgMTIuOTg5OCwgYiBceDNkIDc4LjIzMywgYyBceDNkIDQzNzU4LjU0NTM7XG5cdGhpZ2hwIGZsb2F0IGR0IFx4M2QgZG90KCB1di54eSwgdmVjMiggYSxiICkgKSwgc24gXHgzZCBtb2QoIGR0LCBQSSApO1xuXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xufVxuI2lmZGVmIEhJR0hfUFJFQ0lTSU9OXG5cdGZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHsgcmV0dXJuIGxlbmd0aCggdiApOyB9XG4jZWxzZVxuXHRmbG9hdCBtYXgzKCB2ZWMzIHYgKSB7IHJldHVybiBtYXgoIG1heCggdi54LCB2LnkgKSwgdi56ICk7IH1cblx0ZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkge1xuXHRcdGZsb2F0IG1heENvbXBvbmVudCBceDNkIG1heDMoIGFicyggdiApICk7XG5cdFx0cmV0dXJuIGxlbmd0aCggdiAvIG1heENvbXBvbmVudCApICogbWF4Q29tcG9uZW50O1xuXHR9XG4jZW5kaWZcbnN0cnVjdCBJbmNpZGVudExpZ2h0IHtcblx0dmVjMyBjb2xvcjtcblx0dmVjMyBkaXJlY3Rpb247XG5cdGJvb2wgdmlzaWJsZTtcbn07XG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xuXHR2ZWMzIGRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgZGlyZWN0U3BlY3VsYXI7XG5cdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGluZGlyZWN0U3BlY3VsYXI7XG59O1xuc3RydWN0IEdlb21ldHJpY0NvbnRleHQge1xuXHR2ZWMzIHBvc2l0aW9uO1xuXHR2ZWMzIG5vcm1hbDtcblx0dmVjMyB2aWV3RGlyO1xuI2lmZGVmIENMRUFSQ09BVFxuXHR2ZWMzIGNsZWFyY29hdE5vcm1hbDtcbiNlbmRpZlxufTtcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xufVxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggdmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xufVxudmVjMyBwcm9qZWN0T25QbGFuZShpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0ZmxvYXQgZGlzdGFuY2UgXHgzZCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludCAtIHBvaW50T25QbGFuZSApO1xuXHRyZXR1cm4gLSBkaXN0YW5jZSAqIHBsYW5lTm9ybWFsICsgcG9pbnQ7XG59XG5mbG9hdCBzaWRlT2ZQbGFuZSggaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBzaWduKCBkb3QoIHBvaW50IC0gcG9pbnRPblBsYW5lLCBwbGFuZU5vcm1hbCApICk7XG59XG52ZWMzIGxpbmVQbGFuZUludGVyc2VjdCggaW4gdmVjMyBwb2ludE9uTGluZSwgaW4gdmVjMyBsaW5lRGlyZWN0aW9uLCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0cmV0dXJuIGxpbmVEaXJlY3Rpb24gKiAoIGRvdCggcGxhbmVOb3JtYWwsIHBvaW50T25QbGFuZSAtIHBvaW50T25MaW5lICkgLyBkb3QoIHBsYW5lTm9ybWFsLCBsaW5lRGlyZWN0aW9uICkgKSArIHBvaW50T25MaW5lO1xufVxubWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7XG5cdG1hdDMgdG1wO1xuXHR0bXBbIDAgXSBceDNkIHZlYzMoIG1bIDAgXS54LCBtWyAxIF0ueCwgbVsgMiBdLnggKTtcblx0dG1wWyAxIF0gXHgzZCB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7XG5cdHRtcFsgMiBdIFx4M2QgdmVjMyggbVsgMCBdLnosIG1bIDEgXS56LCBtWyAyIF0ueiApO1xuXHRyZXR1cm4gdG1wO1xufVxuZmxvYXQgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHtcblx0dmVjMyB3ZWlnaHRzIFx4M2QgdmVjMyggMC4yMTI2LCAwLjcxNTIsIDAuMDcyMiApO1xuXHRyZXR1cm4gZG90KCB3ZWlnaHRzLCBjb2xvci5yZ2IgKTtcbn0iLApjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ6IiNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXG4jZGVmaW5lIGN1YmVVVl90ZXh0dXJlU2l6ZSAoMTAyNC4wKVxuaW50IGdldEZhY2VGcm9tRGlyZWN0aW9uKHZlYzMgZGlyZWN0aW9uKSB7XG5cdHZlYzMgYWJzRGlyZWN0aW9uIFx4M2QgYWJzKGRpcmVjdGlvbik7XG5cdGludCBmYWNlIFx4M2QgLTE7XG5cdGlmKCBhYnNEaXJlY3Rpb24ueCBceDNlIGFic0RpcmVjdGlvbi56ICkge1xuXHRcdGlmKGFic0RpcmVjdGlvbi54IFx4M2UgYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi54IFx4M2UgMC4wID8gMCA6IDM7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi55IFx4M2UgMC4wID8gMSA6IDQ7XG5cdH1cblx0ZWxzZSB7XG5cdFx0aWYoYWJzRGlyZWN0aW9uLnogXHgzZSBhYnNEaXJlY3Rpb24ueSApXG5cdFx0XHRmYWNlIFx4M2QgZGlyZWN0aW9uLnogXHgzZSAwLjAgPyAyIDogNTtcblx0XHRlbHNlXG5cdFx0XHRmYWNlIFx4M2QgZGlyZWN0aW9uLnkgXHgzZSAwLjAgPyAxIDogNDtcblx0fVxuXHRyZXR1cm4gZmFjZTtcbn1cbiNkZWZpbmUgY3ViZVVWX21heExvZHMxICAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAxLjApXG4jZGVmaW5lIGN1YmVVVl9yYW5nZUNsYW1wIChleHAyKCg2LjAgLSAxLjApICogMi4wKSlcbnZlYzIgTWlwTGV2ZWxJbmZvKCB2ZWMzIHZlYywgZmxvYXQgcm91Z2huZXNzTGV2ZWwsIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgc2NhbGUgXHgzZCBleHAyKGN1YmVVVl9tYXhMb2RzMSAtIHJvdWdobmVzc0xldmVsKTtcblx0ZmxvYXQgZHhSb3VnaG5lc3MgXHgzZCBkRmR4KHJvdWdobmVzcyk7XG5cdGZsb2F0IGR5Um91Z2huZXNzIFx4M2QgZEZkeShyb3VnaG5lc3MpO1xuXHR2ZWMzIGR4IFx4M2QgZEZkeCggdmVjICogc2NhbGUgKiBkeFJvdWdobmVzcyApO1xuXHR2ZWMzIGR5IFx4M2QgZEZkeSggdmVjICogc2NhbGUgKiBkeVJvdWdobmVzcyApO1xuXHRmbG9hdCBkIFx4M2QgbWF4KCBkb3QoIGR4LCBkeCApLCBkb3QoIGR5LCBkeSApICk7XG5cdGQgXHgzZCBjbGFtcChkLCAxLjAsIGN1YmVVVl9yYW5nZUNsYW1wKTtcblx0ZmxvYXQgbWlwTGV2ZWwgXHgzZCAwLjUgKiBsb2cyKGQpO1xuXHRyZXR1cm4gdmVjMihmbG9vcihtaXBMZXZlbCksIGZyYWN0KG1pcExldmVsKSk7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMiAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAyLjApXG4jZGVmaW5lIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZSAoMS4wIC8gY3ViZVVWX3RleHR1cmVTaXplKVxudmVjMiBnZXRDdWJlVVYodmVjMyBkaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCBtaXBMZXZlbCkge1xuXHRtaXBMZXZlbCBceDNkIHJvdWdobmVzc0xldmVsIFx4M2UgY3ViZVVWX21heExvZHMyIC0gMy4wID8gMC4wIDogbWlwTGV2ZWw7XG5cdGZsb2F0IGEgXHgzZCAxNi4wICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xuXHR2ZWMyIGV4cDJfcGFja2VkIFx4M2QgZXhwMiggdmVjMiggcm91Z2huZXNzTGV2ZWwsIG1pcExldmVsICkgKTtcblx0dmVjMiByY3BfZXhwMl9wYWNrZWQgXHgzZCB2ZWMyKCAxLjAgKSAvIGV4cDJfcGFja2VkO1xuXHRmbG9hdCBwb3dTY2FsZSBceDNkIGV4cDJfcGFja2VkLnggKiBleHAyX3BhY2tlZC55O1xuXHRmbG9hdCBzY2FsZSBceDNkIHJjcF9leHAyX3BhY2tlZC54ICogcmNwX2V4cDJfcGFja2VkLnkgKiAwLjI1O1xuXHRmbG9hdCBtaXBPZmZzZXQgXHgzZCAwLjc1KigxLjAgLSByY3BfZXhwMl9wYWNrZWQueSkgKiByY3BfZXhwMl9wYWNrZWQueDtcblx0Ym9vbCBiUmVzIFx4M2QgbWlwTGV2ZWwgXHgzZFx4M2QgMC4wO1xuXHRzY2FsZSBceDNkICBiUmVzIFx4MjZceDI2IChzY2FsZSBceDNjIGEpID8gYSA6IHNjYWxlO1xuXHR2ZWMzIHI7XG5cdHZlYzIgb2Zmc2V0O1xuXHRpbnQgZmFjZSBceDNkIGdldEZhY2VGcm9tRGlyZWN0aW9uKGRpcmVjdGlvbik7XG5cdGZsb2F0IHJjcFBvd1NjYWxlIFx4M2QgMS4wIC8gcG93U2NhbGU7XG5cdGlmKCBmYWNlIFx4M2RceDNkIDApIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSk7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMigwLjArbWlwT2Zmc2V0LDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDEpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gYSA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgMikge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gYSA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgMykge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMC4wK21pcE9mZnNldCwwLjUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgNCkge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueiwgLWRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdHIgXHgzZCBub3JtYWxpemUocik7XG5cdGZsb2F0IHRleGVsT2Zmc2V0IFx4M2QgMC41ICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xuXHR2ZWMyIHMgXHgzZCAoIHIueXogLyBhYnMoIHIueCApICsgdmVjMiggMS4wICkgKSAqIDAuNTtcblx0dmVjMiBiYXNlIFx4M2Qgb2Zmc2V0ICsgdmVjMiggdGV4ZWxPZmZzZXQgKTtcblx0cmV0dXJuIGJhc2UgKyBzICogKCBzY2FsZSAtIDIuMCAqIHRleGVsT2Zmc2V0ICk7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMyAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAzLjApXG52ZWM0IHRleHR1cmVDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgcmVmbGVjdGVkRGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHJvdWdobmVzc1ZhbCBceDNkIHJvdWdobmVzcyogY3ViZVVWX21heExvZHMzO1xuXHRmbG9hdCByMSBceDNkIGZsb29yKHJvdWdobmVzc1ZhbCk7XG5cdGZsb2F0IHIyIFx4M2QgcjEgKyAxLjA7XG5cdGZsb2F0IHQgXHgzZCBmcmFjdChyb3VnaG5lc3NWYWwpO1xuXHR2ZWMyIG1pcEluZm8gXHgzZCBNaXBMZXZlbEluZm8ocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgcm91Z2huZXNzKTtcblx0ZmxvYXQgcyBceDNkIG1pcEluZm8ueTtcblx0ZmxvYXQgbGV2ZWwwIFx4M2QgbWlwSW5mby54O1xuXHRmbG9hdCBsZXZlbDEgXHgzZCBsZXZlbDAgKyAxLjA7XG5cdGxldmVsMSBceDNkIGxldmVsMSBceDNlIDUuMCA/IDUuMCA6IGxldmVsMTtcblx0bGV2ZWwwICtceDNkIG1pbiggZmxvb3IoIHMgKyAwLjUgKSwgNS4wICk7XG5cdHZlYzIgdXZfMTAgXHgzZCBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgbGV2ZWwwKTtcblx0dmVjNCBjb2xvcjEwIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dl8xMCkpO1xuXHR2ZWMyIHV2XzIwIFx4M2QgZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjIsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IyMCBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMjApKTtcblx0dmVjNCByZXN1bHQgXHgzZCBtaXgoY29sb3IxMCwgY29sb3IyMCwgdCk7XG5cdHJldHVybiB2ZWM0KHJlc3VsdC5yZ2IsIDEuMCk7XG59XG4jZW5kaWYiLApkZWZhdWx0bm9ybWFsX3ZlcnRleDoidmVjMyB0cmFuc2Zvcm1lZE5vcm1hbCBceDNkIG5vcm1hbE1hdHJpeCAqIG9iamVjdE5vcm1hbDtcbiNpZmRlZiBGTElQX1NJREVEXG5cdHRyYW5zZm9ybWVkTm9ybWFsIFx4M2QgLSB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNlbmRpZlxuI2lmZGVmIFVTRV9UQU5HRU5UXG5cdHZlYzMgdHJhbnNmb3JtZWRUYW5nZW50IFx4M2Qgbm9ybWFsTWF0cml4ICogb2JqZWN0VGFuZ2VudDtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHR0cmFuc2Zvcm1lZFRhbmdlbnQgXHgzZCAtIHRyYW5zZm9ybWVkVGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHRyYW5zZm9ybWVkICtceDNkIG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB1diApLnggKiBkaXNwbGFjZW1lbnRTY2FsZSArIGRpc3BsYWNlbWVudEJpYXMgKTtcbiNlbmRpZiIsCmVtaXNzaXZlbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHZlYzQgZW1pc3NpdmVDb2xvciBceDNkIHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xuXHRlbWlzc2l2ZUNvbG9yLnJnYiBceDNkIGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcblx0dG90YWxFbWlzc2l2ZVJhZGlhbmNlICpceDNkIGVtaXNzaXZlQ29sb3IucmdiO1xuI2VuZGlmIixlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGVtaXNzaXZlTWFwO1xuI2VuZGlmIixlbmNvZGluZ3NfZnJhZ21lbnQ6ImdsX0ZyYWdDb2xvciBceDNkIGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApOyIsZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IlxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZhbHVlO1xufVxudmVjNCBHYW1tYVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcblx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9HYW1tYSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMS4wIC8gZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBMaW5lYXJUb3NSR0IoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgUkdCRVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogZXhwMiggdmFsdWUuYSAqIDI1NS4wIC0gMTI4LjAgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgbWF4Q29tcG9uZW50IFx4M2QgbWF4KCBtYXgoIHZhbHVlLnIsIHZhbHVlLmcgKSwgdmFsdWUuYiApO1xuXHRmbG9hdCBmRXhwIFx4M2QgY2xhbXAoIGNlaWwoIGxvZzIoIG1heENvbXBvbmVudCApICksIC0xMjguMCwgMTI3LjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XG59XG52ZWM0IFJHQk1Ub0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiB2YWx1ZS5hICogbWF4UmFuZ2UsIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgXHgzZCBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IE0gXHgzZCBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XG5cdE0gXHgzZCBjZWlsKCBNICogMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xufVxudmVjNCBSR0JEVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCAoIG1heFJhbmdlIC8gMjU1LjAgKSAvIHZhbHVlLmEgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdGZsb2F0IG1heFJHQiBceDNkIG1heCggdmFsdWUuciwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcblx0ZmxvYXQgRCBceDNkIG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xuXHREIFx4M2QgbWluKCBmbG9vciggRCApIC8gMjU1LjAsIDEuMCApO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICogKCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xufVxuY29uc3QgbWF0MyBjTG9nTHV2TSBceDNkIG1hdDMoIDAuMjIwOSwgMC4zMzkwLCAwLjQxODQsIDAuMTEzOCwgMC42NzgwLCAwLjczMTksIDAuMDEwMiwgMC4xMTMwLCAwLjI5NjkgKTtcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUgKSAge1xuXHR2ZWMzIFhwX1lfWFlacCBceDNkIGNMb2dMdXZNICogdmFsdWUucmdiO1xuXHRYcF9ZX1hZWnAgXHgzZCBtYXgoIFhwX1lfWFlacCwgdmVjMyggMWUtNiwgMWUtNiwgMWUtNiApICk7XG5cdHZlYzQgdlJlc3VsdDtcblx0dlJlc3VsdC54eSBceDNkIFhwX1lfWFlacC54eSAvIFhwX1lfWFlacC56O1xuXHRmbG9hdCBMZSBceDNkIDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XG5cdHZSZXN1bHQudyBceDNkIGZyYWN0KCBMZSApO1xuXHR2UmVzdWx0LnogXHgzZCAoIExlIC0gKCBmbG9vciggdlJlc3VsdC53ICogMjU1LjAgKSApIC8gMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdlJlc3VsdDtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNIFx4M2QgbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XG52ZWM0IExvZ0x1dlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRmbG9hdCBMZSBceDNkIHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XG5cdHZlYzMgWHBfWV9YWVpwO1xuXHRYcF9ZX1hZWnAueSBceDNkIGV4cDIoICggTGUgLSAxMjcuMCApIC8gMi4wICk7XG5cdFhwX1lfWFlacC56IFx4M2QgWHBfWV9YWVpwLnkgLyB2YWx1ZS55O1xuXHRYcF9ZX1hZWnAueCBceDNkIHZhbHVlLnggKiBYcF9ZX1hZWnAuejtcblx0dmVjMyB2UkdCIFx4M2QgY0xvZ0x1dkludmVyc2VNICogWHBfWV9YWVpwLnJnYjtcblx0cmV0dXJuIHZlYzQoIG1heCggdlJHQiwgMC4wICksIDEuMCApO1xufSIsCmVudm1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggXHgzZCBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcblx0XHR2ZWMzIHdvcmxkTm9ybWFsIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZlYzMgcmVmbGVjdFZlYyBceDNkIHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHQjZWxzZVxuXHRcdHZlYzMgcmVmbGVjdFZlYyBceDNkIHZSZWZsZWN0O1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdHZlYzIgc2FtcGxlVVY7XG5cdFx0cmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xuXHRcdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdFx0c2FtcGxlVVYueCBceDNkIGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXG5cdFx0cmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xuXHRcdHZlYzMgcmVmbGVjdFZpZXcgXHgzZCBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLCAwLjAsIDEuMCApICk7XG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSApO1xuXHQjZWxzZVxuXHRcdHZlYzQgZW52Q29sb3IgXHgzZCB2ZWM0KCAwLjAgKTtcblx0I2VuZGlmXG5cdGVudkNvbG9yIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcblx0I2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWVxuXHRcdG91dGdvaW5nTGlnaHQgXHgzZCBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApXG5cdFx0b3V0Z29pbmdMaWdodCBceDNkIG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxuXHRcdG91dGdvaW5nTGlnaHQgK1x4M2QgZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcblx0I2VuZGlmXG4jZW5kaWYiLAplbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgZW52TWFwSW50ZW5zaXR5O1xuXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XG5cdHVuaWZvcm0gaW50IG1heE1pcExldmVsO1xuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcblx0I2VuZGlmXG5cdFxuI2VuZGlmIixlbnZtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXG5cdFx0I2RlZmluZSBFTlZfV09STERQT1Ncblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xuXHQjZW5kaWZcbiNlbmRpZiIsCmVudm1hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8ZGVmaW5lZCggUEhPTkcgKVxuXHRcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0XG5cdFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2VuZGlmXG4jZW5kaWYiLGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApXG5cdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZSQUNUSU9OXG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHR2ZWMzIHdvcmxkTm9ybWFsIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHRcdHZlYzMgcXVlcnlWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHF1ZXJ5VmVjLCAxLjAgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHZlYzQoIDAuMCApO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHRmbG9hdCBtYXhNSVBMZXZlbFNjYWxhciBceDNkIGZsb2F0KCBtYXhNSVBMZXZlbCApO1xuXHRcdGZsb2F0IHNpZ21hIFx4M2QgUEkgKiByb3VnaG5lc3MgKiByb3VnaG5lc3MgLyAoIDEuMCArIHJvdWdobmVzcyApO1xuXHRcdGZsb2F0IGRlc2lyZWRNSVBMZXZlbCBceDNkIG1heE1JUExldmVsU2NhbGFyICsgbG9nMiggc2lnbWEgKTtcblx0XHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xuXHR9XG5cdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0ICB2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZsZWN0KCAtdmlld0Rpciwgbm9ybWFsICk7XG5cdFx0ICByZWZsZWN0VmVjIFx4M2Qgbm9ybWFsaXplKCBtaXgoIHJlZmxlY3RWZWMsIG5vcm1hbCwgcm91Z2huZXNzICogcm91Z2huZXNzKSApO1xuXHRcdCNlbHNlXG5cdFx0ICB2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZyYWN0KCAtdmlld0Rpciwgbm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0XHRyZWZsZWN0VmVjIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xuXHRcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgXHgzZCBnZXRTcGVjdWxhck1JUExldmVsKCByb3VnaG5lc3MsIG1heE1JUExldmVsICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVVViggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHJvdWdobmVzcyApO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdFx0dmVjMiBzYW1wbGVVVjtcblx0XHRcdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdFx0XHRzYW1wbGVVVi54IFx4M2QgYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXG5cdFx0XHR2ZWMzIHJlZmxlY3RWaWV3IFx4M2Qgbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwwLjAsMS4wICkgKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRExvZEVYVCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG4jZW5kaWYiLAplbnZtYXBfdmVydGV4OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0dldvcmxkUG9zaXRpb24gXHgzZCB3b3JsZFBvc2l0aW9uLnh5ejtcblx0I2Vsc2Vcblx0XHR2ZWMzIGNhbWVyYVRvVmVydGV4IFx4M2Qgbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZSZWZsZWN0IFx4M2QgcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZSZWZsZWN0IFx4M2QgcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWYiLGZvZ192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdGZvZ0RlcHRoIFx4M2QgLW12UG9zaXRpb24uejtcbiNlbmRpZiIsCmZvZ19wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9GT0dcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcbiNlbmRpZiIsZm9nX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0ZPR1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHRmbG9hdCBmb2dGYWN0b3IgXHgzZCAxLjAgLSBleHAoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBmb2dEZXB0aCAqIGZvZ0RlcHRoICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgZm9nRmFjdG9yIFx4M2Qgc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApO1xuI2VuZGlmIixmb2dfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9GT0dcblx0dW5pZm9ybSB2ZWMzIGZvZ0NvbG9yO1xuXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dOZWFyO1xuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRmFyO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBUT09OXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50TWFwO1xuXHR2ZWMzIGdldEdyYWRpZW50SXJyYWRpYW5jZSggdmVjMyBub3JtYWwsIHZlYzMgbGlnaHREaXJlY3Rpb24gKSB7XG5cdFx0ZmxvYXQgZG90TkwgXHgzZCBkb3QoIG5vcm1hbCwgbGlnaHREaXJlY3Rpb24gKTtcblx0XHR2ZWMyIGNvb3JkIFx4M2QgdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApO1xuXHRcdCNpZmRlZiBVU0VfR1JBRElFTlRNQVBcblx0XHRcdHJldHVybiB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnJnYjtcblx0XHQjZWxzZVxuXHRcdFx0cmV0dXJuICggY29vcmQueCBceDNjIDAuNyApID8gdmVjMyggMC43ICkgOiB2ZWMzKCAxLjAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIixsaWdodG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgUEkgKiB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG4jZW5kaWYiLApsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIixsaWdodHNfbGFtYmVydF92ZXJ0ZXg6InZlYzMgZGlmZnVzZSBceDNkIHZlYzMoIDEuMCApO1xuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uIFx4M2QgbXZQb3NpdGlvbi54eXo7XG5nZW9tZXRyeS5ub3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5nZW9tZXRyeS52aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcbkdlb21ldHJpY0NvbnRleHQgYmFja0dlb21ldHJ5O1xuYmFja0dlb21ldHJ5LnBvc2l0aW9uIFx4M2QgZ2VvbWV0cnkucG9zaXRpb247XG5iYWNrR2VvbWV0cnkubm9ybWFsIFx4M2QgLWdlb21ldHJ5Lm5vcm1hbDtcbmJhY2tHZW9tZXRyeS52aWV3RGlyIFx4M2QgZ2VvbWV0cnkudmlld0RpcjtcbnZMaWdodEZyb250IFx4M2QgdmVjMyggMC4wICk7XG52SW5kaXJlY3RGcm9udCBceDNkIHZlYzMoIDAuMCApO1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2TGlnaHRCYWNrIFx4M2QgdmVjMyggMC4wICk7XG5cdHZJbmRpcmVjdEJhY2sgXHgzZCB2ZWMzKCAwLjAgKTtcbiNlbmRpZlxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbmZsb2F0IGRvdE5MO1xudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG4jaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgXHgzZCBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICtceDNkIHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgK1x4M2Qgc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fU1BPVF9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgXHgzZCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlIFx4M2QgUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArXHgzZCBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICtceDNkIHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX0RJUl9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XG5cdFx0Z2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSBceDNkIFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgK1x4M2Qgc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArXHgzZCBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9IRU1JX0xJR0hUUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0dkluZGlyZWN0RnJvbnQgK1x4M2QgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZJbmRpcmVjdEJhY2sgK1x4M2QgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBiYWNrR2VvbWV0cnkgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIiwKbGlnaHRzX3BhcnNfYmVnaW46InVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjtcbnVuaWZvcm0gdmVjMyBsaWdodFByb2JlWyA5IF07XG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xuXHRmbG9hdCB4IFx4M2Qgbm9ybWFsLngsIHkgXHgzZCBub3JtYWwueSwgeiBceDNkIG5vcm1hbC56O1xuXHR2ZWMzIHJlc3VsdCBceDNkIHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA0IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA3IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7XG5cdHJldHVybiByZXN1bHQ7XG59XG52ZWMzIGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGxpZ2h0UHJvYmVbIDkgXSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBzaEdldElycmFkaWFuY2VBdCggd29ybGROb3JtYWwsIGxpZ2h0UHJvYmUgKTtcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG52ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGFtYmllbnRMaWdodENvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICpceDNkIFBJO1xuXHQjZW5kaWZcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG4jaWYgTlVNX0RJUl9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHR9O1xuXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XG5cdHZvaWQgZ2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgXHgzZCBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCB0cnVlO1xuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUE9JTlRfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XG5cdFx0ZmxvYXQgc2hhZG93Q2FtZXJhRmFyO1xuXHR9O1xuXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHR2ZWMzIGxWZWN0b3IgXHgzZCBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uIFx4M2Qgbm9ybWFsaXplKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSBceDNkIGxlbmd0aCggbFZlY3RvciApO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgcG9pbnRMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XG5cdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkICggZGlyZWN0TGlnaHQuY29sb3IgIVx4M2QgdmVjMyggMC4wICkgKTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdFx0ZmxvYXQgY29uZUNvcztcblx0XHRmbG9hdCBwZW51bWJyYUNvcztcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XG5cdHZvaWQgZ2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgICkge1xuXHRcdHZlYzMgbFZlY3RvciBceDNkIHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgXHgzZCBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBhbmdsZUNvcyBceDNkIGRvdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0aWYgKCBhbmdsZUNvcyBceDNlIHNwb3RMaWdodC5jb25lQ29zICkge1xuXHRcdFx0ZmxvYXQgc3BvdEVmZmVjdCBceDNkIHNtb290aHN0ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHNwb3RMaWdodC5jb2xvcjtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIHNwb3RFZmZlY3QgKiBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgdmVjMyggMC4wICk7XG5cdFx0XHRkaXJlY3RMaWdodC52aXNpYmxlIFx4M2QgZmFsc2U7XG5cdFx0fVxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQ7XG5cdH07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xO1x0dW5pZm9ybSBzYW1wbGVyMkQgbHRjXzI7XG5cdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcbiNlbmRpZlxuI2lmIE5VTV9IRU1JX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IEhlbWlzcGhlcmVMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBza3lDb2xvcjtcblx0XHR2ZWMzIGdyb3VuZENvbG9yO1xuXHR9O1xuXHR1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTtcblx0dmVjMyBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVtaUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5ICkge1xuXHRcdGZsb2F0IGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhlbWlMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRmbG9hdCBoZW1pRGlmZnVzZVdlaWdodCBceDNkIDAuNSAqIGRvdE5MICsgMC41O1xuXHRcdHZlYzMgaXJyYWRpYW5jZSBceDNkIG1peCggaGVtaUxpZ2h0Lmdyb3VuZENvbG9yLCBoZW1pTGlnaHQuc2t5Q29sb3IsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRpcnJhZGlhbmNlICpceDNkIFBJO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBpcnJhZGlhbmNlO1xuXHR9XG4jZW5kaWYiLApsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciBceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5tYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2Qgc3BlY3VsYXI7XG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyBceDNkIHNoaW5pbmVzcztcbm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggXHgzZCBzcGVjdWxhclN0cmVuZ3RoOyIsbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6InZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VDb2xvcjtcblx0dmVjM1x0c3BlY3VsYXJDb2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyU2hpbmluZXNzO1xuXHRmbG9hdFx0c3BlY3VsYXJTdHJlbmd0aDtcbn07XG52b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHQjaWZkZWYgVE9PTlxuXHRcdHZlYzMgaXJyYWRpYW5jZSBceDNkIGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGRvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRcdHZlYzMgaXJyYWRpYW5jZSBceDNkIGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNlbmRpZlxuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICpceDNkIFBJO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfQmxpbm5QaG9uZ1xuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdcbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVx0KDApIiwKbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xubWF0ZXJpYWwuZGlmZnVzZUNvbG9yIFx4M2QgZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7XG5tYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyBceDNkIGNsYW1wKCByb3VnaG5lc3NGYWN0b3IsIDAuMDQsIDEuMCApO1xuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2QgbWl4KCB2ZWMzKCBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UICogcG93MiggcmVmbGVjdGl2aXR5ICkgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XG4jZWxzZVxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2QgbWl4KCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2VuZGlmXG4jaWZkZWYgQ0xFQVJDT0FUXG5cdG1hdGVyaWFsLmNsZWFyY29hdCBceDNkIHNhdHVyYXRlKCBjbGVhcmNvYXQgKTtcdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyBceDNkIGNsYW1wKCBjbGVhcmNvYXRSb3VnaG5lc3MsIDAuMDQsIDEuMCApO1xuI2VuZGlmXG4jaWZkZWYgVVNFX1NIRUVOXG5cdG1hdGVyaWFsLnNoZWVuQ29sb3IgXHgzZCBzaGVlbjtcbiNlbmRpZiIsCmxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiJzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VDb2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyUm91Z2huZXNzO1xuXHR2ZWMzXHRzcGVjdWxhckNvbG9yO1xuI2lmZGVmIENMRUFSQ09BVFxuXHRmbG9hdCBjbGVhcmNvYXQ7XG5cdGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR2ZWMzIHNoZWVuQ29sb3I7XG4jZW5kaWZcbn07XG4jZGVmaW5lIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgMC4xNlxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcbmZsb2F0IGNsZWFyY29hdERIUkFwcHJveCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROTCApIHtcblx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcbn1cbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyBceDNlIDBcblx0dm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdFx0dmVjMyBub3JtYWwgXHgzZCBnZW9tZXRyeS5ub3JtYWw7XG5cdFx0dmVjMyB2aWV3RGlyIFx4M2QgZ2VvbWV0cnkudmlld0Rpcjtcblx0XHR2ZWMzIHBvc2l0aW9uIFx4M2QgZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0dmVjMyBsaWdodFBvcyBceDNkIHJlY3RBcmVhTGlnaHQucG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGggXHgzZCByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQgXHgzZCByZWN0QXJlYUxpZ2h0LmhhbGZIZWlnaHQ7XG5cdFx0dmVjMyBsaWdodENvbG9yIFx4M2QgcmVjdEFyZWFMaWdodC5jb2xvcjtcblx0XHRmbG9hdCByb3VnaG5lc3MgXHgzZCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcztcblx0XHR2ZWMzIHJlY3RDb29yZHNbIDQgXTtcblx0XHRyZWN0Q29vcmRzWyAwIF0gXHgzZCBsaWdodFBvcyArIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XHRcdHJlY3RDb29yZHNbIDEgXSBceDNkIGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcblx0XHRyZWN0Q29vcmRzWyAyIF0gXHgzZCBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMyBdIFx4M2QgbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHZlYzIgdXYgXHgzZCBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XG5cdFx0dmVjNCB0MSBceDNkIHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XG5cdFx0dmVjNCB0MiBceDNkIHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XG5cdFx0bWF0MyBtSW52IFx4M2QgbWF0Myhcblx0XHRcdHZlYzMoIHQxLngsIDAsIHQxLnkgKSxcblx0XHRcdHZlYzMoICAgIDAsIDEsICAgIDAgKSxcblx0XHRcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxuXHRcdCk7XG5cdFx0dmVjMyBmcmVzbmVsIFx4M2QgKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICtceDNkIGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XG5cdH1cbiNlbmRpZlxudm9pZCBSRV9EaXJlY3RfUGh5c2ljYWwoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2QgZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRmbG9hdCBjY0RvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRcdHZlYzMgY2NJcnJhZGlhbmNlIFx4M2QgY2NEb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0Y2NJcnJhZGlhbmNlICpceDNkIFBJO1xuXHRcdCNlbmRpZlxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIG1hdGVyaWFsLmNsZWFyY29hdCAqIGNsZWFyY29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBjY0RvdE5MICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgY2NJcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSIFx4M2QgMC4wO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9TSEVFTlxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9TaGVlbihcblx0XHRcdG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLFxuXHRcdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uLFxuXHRcdFx0Z2VvbWV0cnksXG5cdFx0XHRtYXRlcmlhbC5zaGVlbkNvbG9yXG5cdFx0KTtcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyk7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICtceDNkICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0KSB7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRmbG9hdCBjY0RvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICtceDNkIGNsZWFyY29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBjY0RvdE5MIFx4M2QgY2NEb3ROVjtcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIDAuMDtcblx0I2VuZGlmXG5cdGZsb2F0IGNsZWFyY29hdEludiBceDNkIDEuMCAtIGNsZWFyY29hdERIUjtcblx0dmVjMyBzaW5nbGVTY2F0dGVyaW5nIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgbXVsdGlTY2F0dGVyaW5nIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlIFx4M2QgaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7XG5cdEJSREZfU3BlY3VsYXJfTXVsdGlzY2F0dGVyaW5nX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIHNpbmdsZVNjYXR0ZXJpbmcsIG11bHRpU2NhdHRlcmluZyApO1xuXHR2ZWMzIGRpZmZ1c2UgXHgzZCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiAoIDEuMCAtICggc2luZ2xlU2NhdHRlcmluZyArIG11bHRpU2NhdHRlcmluZyApICk7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgK1x4M2QgY2xlYXJjb2F0SW52ICogcmFkaWFuY2UgKiBzaW5nbGVTY2F0dGVyaW5nO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgZGlmZnVzZSAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfUGh5c2ljYWxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXHRcdFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcdFx0UkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbFxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRyZXR1cm4gc2F0dXJhdGUoIHBvdyggZG90TlYgKyBhbWJpZW50T2NjbHVzaW9uLCBleHAyKCAtIDE2LjAgKiByb3VnaG5lc3MgLSAxLjAgKSApIC0gMS4wICsgYW1iaWVudE9jY2x1c2lvbiApO1xufSIsCmxpZ2h0c19mcmFnbWVudF9iZWdpbjoiXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xuZ2VvbWV0cnkucG9zaXRpb24gXHgzZCAtIHZWaWV3UG9zaXRpb247XG5nZW9tZXRyeS5ub3JtYWwgXHgzZCBub3JtYWw7XG5nZW9tZXRyeS52aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG4jaWZkZWYgQ0xFQVJDT0FUXG5cdGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCBceDNkIGNsZWFyY29hdE5vcm1hbDtcbiNlbmRpZlxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCBceDNkIHBvaW50TGlnaHRzWyBpIF07XG5cdFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgXHgyNlx4MjYgKCBVTlJPTExFRF9MT09QX0lOREVYIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIHBvaW50TGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX1NQT1RfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdFNwb3RMaWdodCBzcG90TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCBceDNkIHNwb3RMaWdodHNbIGkgXTtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgXHgyNlx4MjYgKCBVTlJPTExFRF9MT09QX0lOREVYIFx4M2MgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyApXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgYWxsKCBidmVjMiggc3BvdExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX0RJUl9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGRpcmVjdGlvbmFsTGlnaHQgXHgzZCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9ESVJfTElHSFRfU0hBRE9XUyApXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgYWxsKCBidmVjMiggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcblx0UmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xuXHRcdHJlY3RBcmVhTGlnaHQgXHgzZCByZWN0QXJlYUxpZ2h0c1sgaSBdO1xuXHRcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHR2ZWMzIGlibElycmFkaWFuY2UgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2QgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0aXJyYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnkgKTtcblx0I2lmICggTlVNX0hFTUlfTElHSFRTIFx4M2UgMCApXG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRcdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcblx0XHRcdGlycmFkaWFuY2UgK1x4M2QgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdH1cblx0I2VuZGlmXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0dmVjMyByYWRpYW5jZSBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIGNsZWFyY29hdFJhZGlhbmNlIFx4M2QgdmVjMyggMC4wICk7XG4jZW5kaWYiLApsaWdodHNfZnJhZ21lbnRfbWFwczoiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSBceDNkIHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRpcnJhZGlhbmNlICtceDNkIGxpZ2h0TWFwSXJyYWRpYW5jZTtcblx0I2VuZGlmXG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggU1RBTkRBUkQgKSBceDI2XHgyNiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRpYmxJcnJhZGlhbmNlICtceDNkIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGdlb21ldHJ5LCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSBceDI2XHgyNiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0cmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRjbGVhcmNvYXRSYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKbGlnaHRzX2ZyYWdtZW50X2VuZDoiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdFJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdFJFX0luZGlyZWN0U3BlY3VsYXIoIHJhZGlhbmNlLCBpYmxJcnJhZGlhbmNlLCBjbGVhcmNvYXRSYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApIFx4MjZceDI2IGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHRnbF9GcmFnRGVwdGhFWFQgXHgzZCBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41O1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkgXHgyNlx4MjYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGX0VYVCApXG5cdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuI2VuZGlmIiwKbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xuXHQjZW5kaWZcbiNlbmRpZiIsbG9nZGVwdGhidWZfdmVydGV4OiIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dkZyYWdEZXB0aCBceDNkIDEuMCArIGdsX1Bvc2l0aW9uLnc7XG5cdCNlbHNlXG5cdFx0Z2xfUG9zaXRpb24ueiBceDNkIGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xuXHRcdGdsX1Bvc2l0aW9uLnogKlx4M2QgZ2xfUG9zaXRpb24udztcblx0I2VuZGlmXG4jZW5kaWYiLG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dmVjNCB0ZXhlbENvbG9yIFx4M2QgdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xuXHR0ZXhlbENvbG9yIFx4M2QgbWFwVGV4ZWxUb0xpbmVhciggdGV4ZWxDb2xvciApO1xuXHRkaWZmdXNlQ29sb3IgKlx4M2QgdGV4ZWxDb2xvcjtcbiNlbmRpZiIsCm1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dmVjMiB1diBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCBnbF9Qb2ludENvb3JkLngsIDEuMCAtIGdsX1BvaW50Q29vcmQueSwgMSApICkueHk7XG5cdHZlYzQgbWFwVGV4ZWwgXHgzZCB0ZXh0dXJlMkQoIG1hcCwgdXYgKTtcblx0ZGlmZnVzZUNvbG9yICpceDNkIG1hcFRleGVsVG9MaW5lYXIoIG1hcFRleGVsICk7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcbiNlbmRpZiIsbWV0YWxuZXNzbWFwX2ZyYWdtZW50OiJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgXHgzZCBtZXRhbG5lc3M7XG4jaWZkZWYgVVNFX01FVEFMTkVTU01BUFxuXHR2ZWM0IHRleGVsTWV0YWxuZXNzIFx4M2QgdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZVdiApO1xuXHRtZXRhbG5lc3NGYWN0b3IgKlx4M2QgdGV4ZWxNZXRhbG5lc3MuYjtcbiNlbmRpZiIsCm1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01FVEFMTkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7XG4jZW5kaWYiLG1vcnBobm9ybWFsX3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwwIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwxIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwyIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwzIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcbiNlbmRpZiIsbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xuXHQjZWxzZVxuXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xuXHQjZW5kaWZcbiNlbmRpZiIsCm1vcnBodGFyZ2V0X3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDAgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQxIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0MiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDMgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDUgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA1IF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQ2IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNiBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDcgXTtcblx0I2VuZGlmXG4jZW5kaWYiLApub3JtYWxfZnJhZ21lbnRfYmVnaW46IiNpZmRlZiBGTEFUX1NIQURFRFxuXHR2ZWMzIGZkeCBceDNkIHZlYzMoIGRGZHgoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeCggdlZpZXdQb3NpdGlvbi56ICkgKTtcblx0dmVjMyBmZHkgXHgzZCB2ZWMzKCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeSggdlZpZXdQb3NpdGlvbi55ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApO1xuI2Vsc2Vcblx0dmVjMyBub3JtYWwgXHgzZCBub3JtYWxpemUoIHZOb3JtYWwgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCBceDNkIG5vcm1hbCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZlYzMgdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdlRhbmdlbnQgKTtcblx0XHR2ZWMzIGJpdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHRhbmdlbnQgXHgzZCB0YW5nZW50ICogKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xuXHRcdFx0Yml0YW5nZW50IFx4M2QgYml0YW5nZW50ICogKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcbiNlbmRpZlxudmVjMyBnZW9tZXRyeU5vcm1hbCBceDNkIG5vcm1hbDsiLApub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHRub3JtYWwgXHgzZCB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHQjaWZkZWYgRkxJUF9TSURFRFxuXHRcdG5vcm1hbCBceDNkIC0gbm9ybWFsO1xuXHQjZW5kaWZcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCBceDNkIG5vcm1hbCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0I2VuZGlmXG5cdG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggbm9ybWFsTWF0cml4ICogbm9ybWFsICk7XG4jZWxpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0bWF0MyB2VEJOIFx4M2QgbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBub3JtYWwgKTtcblx0XHR2ZWMzIG1hcE4gXHgzZCB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRcdG1hcE4ueHkgXHgzZCBub3JtYWxTY2FsZSAqIG1hcE4ueHk7XG5cdFx0bm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xuXHQjZWxzZVxuXHRcdG5vcm1hbCBceDNkIHBlcnR1cmJOb3JtYWwyQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBub3JtYWxTY2FsZSwgbm9ybWFsTWFwICk7XG5cdCNlbmRpZlxuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxuXHRub3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSApO1xuI2VuZGlmIiwKbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlO1xuI2VuZGlmXG4jaWZkZWYgT0JKRUNUU1BBQ0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7XG4jZW5kaWZcbiNpZiAhIGRlZmluZWQgKCBVU0VfVEFOR0VOVCApIFx4MjZceDI2ICggZGVmaW5lZCAoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkICggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSApXG5cdHZlYzMgcGVydHVyYk5vcm1hbDJBcmIoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgbm9ybWFsU2NhbGUsIGluIHNhbXBsZXIyRCBub3JtYWxNYXAgKSB7XG5cdFx0dmVjMyBxMCBceDNkIHZlYzMoIGRGZHgoIGV5ZV9wb3MueCApLCBkRmR4KCBleWVfcG9zLnkgKSwgZEZkeCggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHExIFx4M2QgdmVjMyggZEZkeSggZXllX3Bvcy54ICksIGRGZHkoIGV5ZV9wb3MueSApLCBkRmR5KCBleWVfcG9zLnogKSApO1xuXHRcdHZlYzIgc3QwIFx4M2QgZEZkeCggdlV2LnN0ICk7XG5cdFx0dmVjMiBzdDEgXHgzZCBkRmR5KCB2VXYuc3QgKTtcblx0XHRmbG9hdCBzY2FsZSBceDNkIHNpZ24oIHN0MS50ICogc3QwLnMgLSBzdDAudCAqIHN0MS5zICk7XG5cdFx0dmVjMyBTIFx4M2Qgbm9ybWFsaXplKCAoIHEwICogc3QxLnQgLSBxMSAqIHN0MC50ICkgKiBzY2FsZSApO1xuXHRcdHZlYzMgVCBceDNkIG5vcm1hbGl6ZSggKCAtIHEwICogc3QxLnMgKyBxMSAqIHN0MC5zICkgKiBzY2FsZSApO1xuXHRcdHZlYzMgTiBceDNkIG5vcm1hbGl6ZSggc3VyZl9ub3JtICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5ICpceDNkIG5vcm1hbFNjYWxlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZlYzMgTmZyb21TVCBceDNkIGNyb3NzKCBTLCBUICk7XG5cdFx0XHRpZiggZG90KCBOZnJvbVNULCBOICkgXHgzZSAwLjAgKSB7XG5cdFx0XHRcdFMgKlx4M2QgLTEuMDtcblx0XHRcdFx0VCAqXHgzZCAtMS4wO1xuXHRcdFx0fVxuXHRcdCNlbHNlXG5cdFx0XHRtYXBOLnh5ICpceDNkICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHQjZW5kaWZcblx0XHRtYXQzIHRzbiBceDNkIG1hdDMoIFMsIFQsIE4gKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCB0c24gKiBtYXBOICk7XG5cdH1cbiNlbmRpZiIsCmNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW46IiNpZmRlZiBDTEVBUkNPQVRcblx0dmVjMyBjbGVhcmNvYXROb3JtYWwgXHgzZCBnZW9tZXRyeU5vcm1hbDtcbiNlbmRpZiIsY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzOiIjaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0bWF0MyB2VEJOIFx4M2QgbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBjbGVhcmNvYXROb3JtYWwgKTtcblx0XHR2ZWMzIG1hcE4gXHgzZCB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRcdG1hcE4ueHkgXHgzZCBjbGVhcmNvYXROb3JtYWxTY2FsZSAqIG1hcE4ueHk7XG5cdFx0Y2xlYXJjb2F0Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xuXHQjZWxzZVxuXHRcdGNsZWFyY29hdE5vcm1hbCBceDNkIHBlcnR1cmJOb3JtYWwyQXJiKCAtIHZWaWV3UG9zaXRpb24sIGNsZWFyY29hdE5vcm1hbCwgY2xlYXJjb2F0Tm9ybWFsU2NhbGUsIGNsZWFyY29hdE5vcm1hbE1hcCApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmNsZWFyY29hdF9ub3JtYWxtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIGNsZWFyY29hdE5vcm1hbFNjYWxlO1xuI2VuZGlmIixwYWNraW5nOiJ2ZWMzIHBhY2tOb3JtYWxUb1JHQiggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XG5cdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xufVxudmVjMyB1bnBhY2tSR0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7XG5cdHJldHVybiAyLjAgKiByZ2IueHl6IC0gMS4wO1xufVxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgXHgzZCAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgXHgzZCAyNTUuIC8gMjU2LjtcbmNvbnN0IHZlYzMgUGFja0ZhY3RvcnMgXHgzZCB2ZWMzKCAyNTYuICogMjU2LiAqIDI1Ni4sIDI1Ni4gKiAyNTYuLCAgMjU2LiApO1xuY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzIFx4M2QgVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3RvcnMsIDEuICk7XG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCBceDNkIDEuIC8gMjU2LjtcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xuXHR2ZWM0IHIgXHgzZCB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcblx0ci55encgLVx4M2Qgci54eXogKiBTaGlmdFJpZ2h0ODtcdHJldHVybiByICogUGFja1Vwc2NhbGU7XG59XG5mbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkge1xuXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XG59XG52ZWM0IGVuY29kZUhhbGZSR0JBICggdmVjMiB2ICkge1xuXHR2ZWM0IGVuY29kZWQgXHgzZCB2ZWM0KCAwLjAgKTtcblx0Y29uc3QgdmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAxLjAgLyAyNTUuMCwgMC4wICk7XG5cdGVuY29kZWQueHkgXHgzZCB2ZWMyKCB2LngsIGZyYWN0KCB2LnggKiAyNTUuMCApICk7XG5cdGVuY29kZWQueHkgXHgzZCBlbmNvZGVkLnh5IC0gKCBlbmNvZGVkLnl5ICogb2Zmc2V0ICk7XG5cdGVuY29kZWQuencgXHgzZCB2ZWMyKCB2LnksIGZyYWN0KCB2LnkgKiAyNTUuMCApICk7XG5cdGVuY29kZWQuencgXHgzZCBlbmNvZGVkLnp3IC0gKCBlbmNvZGVkLnd3ICogb2Zmc2V0ICk7XG5cdHJldHVybiBlbmNvZGVkO1xufVxudmVjMiBkZWNvZGVIYWxmUkdCQSggdmVjNCB2ICkge1xuXHRyZXR1cm4gdmVjMiggdi54ICsgKCB2LnkgLyAyNTUuMCApLCB2LnogKyAoIHYudyAvIDI1NS4wICkgKTtcbn1cbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcbn1cbmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgbGluZWFyQ2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xufVxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCggZmFyIC0gbmVhciApICogdmlld1ogKTtcbn1cbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcbn0iLApwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiIjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxuXHRnbF9GcmFnQ29sb3IucmdiICpceDNkIGdsX0ZyYWdDb2xvci5hO1xuI2VuZGlmIixwcm9qZWN0X3ZlcnRleDoidmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuZ2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsiLGRpdGhlcmluZ19mcmFnbWVudDoiI2lmZGVmIERJVEhFUklOR1xuXHRnbF9GcmFnQ29sb3IucmdiIFx4M2QgZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiLGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiIjaWZkZWYgRElUSEVSSU5HXG5cdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRcdGZsb2F0IGdyaWRfcG9zaXRpb24gXHgzZCByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTtcblx0XHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgXHgzZCB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xuXHRcdGRpdGhlcl9zaGlmdF9SR0IgXHgzZCBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7XG5cdFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcblx0fVxuI2VuZGlmIiwKcm91Z2huZXNzbWFwX2ZyYWdtZW50OiJmbG9hdCByb3VnaG5lc3NGYWN0b3IgXHgzZCByb3VnaG5lc3M7XG4jaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR2ZWM0IHRleGVsUm91Z2huZXNzIFx4M2QgdGV4dHVyZTJEKCByb3VnaG5lc3NNYXAsIHZVdiApO1xuXHRyb3VnaG5lc3NGYWN0b3IgKlx4M2QgdGV4ZWxSb3VnaG5lc3MuZztcbiNlbmRpZiIscm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHJvdWdobmVzc01hcDtcbiNlbmRpZiIsc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHRmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdHJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApO1xuXHR9XG5cdHZlYzIgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2ICkge1xuXHRcdHJldHVybiBkZWNvZGVIYWxmUkdCQSggdGV4dHVyZTJEKCBzaGFkb3csIHV2ICkgKTtcblx0fVxuXHRmbG9hdCBWU01TaGFkb3cgKHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKXtcblx0XHRmbG9hdCBvY2NsdXNpb24gXHgzZCAxLjA7XG5cdFx0dmVjMiBkaXN0cmlidXRpb24gXHgzZCB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNoYWRvdywgdXYgKTtcblx0XHRmbG9hdCBoYXJkX3NoYWRvdyBceDNkIHN0ZXAoIGNvbXBhcmUgLCBkaXN0cmlidXRpb24ueCApO1xuXHRcdGlmIChoYXJkX3NoYWRvdyAhXHgzZCAxLjAgKSB7XG5cdFx0XHRmbG9hdCBkaXN0YW5jZSBceDNkIGNvbXBhcmUgLSBkaXN0cmlidXRpb24ueCA7XG5cdFx0XHRmbG9hdCB2YXJpYW5jZSBceDNkIG1heCggMC4wMDAwMCwgZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSApO1xuXHRcdFx0ZmxvYXQgc29mdG5lc3NfcHJvYmFiaWxpdHkgXHgzZCB2YXJpYW5jZSAvICh2YXJpYW5jZSArIGRpc3RhbmNlICogZGlzdGFuY2UgKTtcdFx0XHRzb2Z0bmVzc19wcm9iYWJpbGl0eSBceDNkIGNsYW1wKCAoIHNvZnRuZXNzX3Byb2JhYmlsaXR5IC0gMC4zICkgLyAoIDAuOTUgLSAwLjMgKSwgMC4wLCAxLjAgKTtcdFx0XHRvY2NsdXNpb24gXHgzZCBjbGFtcCggbWF4KCBoYXJkX3NoYWRvdywgc29mdG5lc3NfcHJvYmFiaWxpdHkgKSwgMC4wLCAxLjAgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9jY2x1c2lvbjtcblx0fVxuXHRmbG9hdCB0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHNpemUsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XG5cdFx0Y29uc3QgdmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAwLjAsIDEuMCApO1xuXHRcdHZlYzIgdGV4ZWxTaXplIFx4M2QgdmVjMiggMS4wICkgLyBzaXplO1xuXHRcdHZlYzIgY2VudHJvaWRVViBceDNkICggZmxvb3IoIHV2ICogc2l6ZSAtIDAuNSApICsgMC41ICkgKiB0ZXhlbFNpemU7XG5cdFx0ZmxvYXQgbGIgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHgsIGNvbXBhcmUgKTtcblx0XHRmbG9hdCBsdCBceDNkIHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC54eSwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJiIFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl4LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgcnQgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueXksIGNvbXBhcmUgKTtcblx0XHR2ZWMyIGYgXHgzZCBmcmFjdCggdXYgKiBzaXplICsgMC41ICk7XG5cdFx0ZmxvYXQgYSBceDNkIG1peCggbGIsIGx0LCBmLnkgKTtcblx0XHRmbG9hdCBiIFx4M2QgbWl4KCByYiwgcnQsIGYueSApO1xuXHRcdGZsb2F0IGMgXHgzZCBtaXgoIGEsIGIsIGYueCApO1xuXHRcdHJldHVybiBjO1xuXHR9XG5cdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XG5cdFx0ZmxvYXQgc2hhZG93IFx4M2QgMS4wO1xuXHRcdHNoYWRvd0Nvb3JkLnh5eiAvXHgzZCBzaGFkb3dDb29yZC53O1xuXHRcdHNoYWRvd0Nvb3JkLnogK1x4M2Qgc2hhZG93Qmlhcztcblx0XHRidmVjNCBpbkZydXN0dW1WZWMgXHgzZCBidmVjNCAoIHNoYWRvd0Nvb3JkLnggXHgzZVx4M2QgMC4wLCBzaGFkb3dDb29yZC54IFx4M2NceDNkIDEuMCwgc2hhZG93Q29vcmQueSBceDNlXHgzZCAwLjAsIHNoYWRvd0Nvb3JkLnkgXHgzY1x4M2QgMS4wICk7XG5cdFx0Ym9vbCBpbkZydXN0dW0gXHgzZCBhbGwoIGluRnJ1c3R1bVZlYyApO1xuXHRcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjIFx4M2QgYnZlYzIoIGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiBceDNjXHgzZCAxLjAgKTtcblx0XHRib29sIGZydXN0dW1UZXN0IFx4M2QgYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xuXHRcdGlmICggZnJ1c3R1bVRlc3QgKSB7XG5cdFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCBceDNkIC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgXHgzZCAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxIFx4M2QgKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MSBceDNkICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeDIgXHgzZCBkeDAgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeTIgXHgzZCBkeTAgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeDMgXHgzZCBkeDEgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeTMgXHgzZCBkeTEgLyAyLjA7XG5cdFx0XHRzaGFkb3cgXHgzZCAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcblx0XHRcdCkgKiAoIDEuMCAvIDE3LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCBceDNkIC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgXHgzZCAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxIFx4M2QgKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MSBceDNkICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRzaGFkb3cgXHgzZCAoXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0c2hhZG93IFx4M2QgVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHNoYWRvdyBceDNkIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTtcblx0XHQjZW5kaWZcblx0XHR9XG5cdFx0cmV0dXJuIHNoYWRvdztcblx0fVxuXHR2ZWMyIGN1YmVUb1VWKCB2ZWMzIHYsIGZsb2F0IHRleGVsU2l6ZVkgKSB7XG5cdFx0dmVjMyBhYnNWIFx4M2QgYWJzKCB2ICk7XG5cdFx0ZmxvYXQgc2NhbGVUb0N1YmUgXHgzZCAxLjAgLyBtYXgoIGFic1YueCwgbWF4KCBhYnNWLnksIGFic1YueiApICk7XG5cdFx0YWJzViAqXHgzZCBzY2FsZVRvQ3ViZTtcblx0XHR2ICpceDNkIHNjYWxlVG9DdWJlICogKCAxLjAgLSAyLjAgKiB0ZXhlbFNpemVZICk7XG5cdFx0dmVjMiBwbGFuYXIgXHgzZCB2Lnh5O1xuXHRcdGZsb2F0IGFsbW9zdEFUZXhlbCBceDNkIDEuNSAqIHRleGVsU2l6ZVk7XG5cdFx0ZmxvYXQgYWxtb3N0T25lIFx4M2QgMS4wIC0gYWxtb3N0QVRleGVsO1xuXHRcdGlmICggYWJzVi56IFx4M2VceDNkIGFsbW9zdE9uZSApIHtcblx0XHRcdGlmICggdi56IFx4M2UgMC4wIClcblx0XHRcdFx0cGxhbmFyLnggXHgzZCA0LjAgLSB2Lng7XG5cdFx0fSBlbHNlIGlmICggYWJzVi54IFx4M2VceDNkIGFsbW9zdE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25YIFx4M2Qgc2lnbiggdi54ICk7XG5cdFx0XHRwbGFuYXIueCBceDNkIHYueiAqIHNpZ25YICsgMi4wICogc2lnblg7XG5cdFx0fSBlbHNlIGlmICggYWJzVi55IFx4M2VceDNkIGFsbW9zdE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25ZIFx4M2Qgc2lnbiggdi55ICk7XG5cdFx0XHRwbGFuYXIueCBceDNkIHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xuXHRcdFx0cGxhbmFyLnkgXHgzZCB2LnogKiBzaWduWSAtIDIuMDtcblx0XHR9XG5cdFx0cmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIgKyB2ZWMyKCAwLjM3NSwgMC43NSApO1xuXHR9XG5cdGZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCwgZmxvYXQgc2hhZG93Q2FtZXJhTmVhciwgZmxvYXQgc2hhZG93Q2FtZXJhRmFyICkge1xuXHRcdHZlYzIgdGV4ZWxTaXplIFx4M2QgdmVjMiggMS4wICkgLyAoIHNoYWRvd01hcFNpemUgKiB2ZWMyKCA0LjAsIDIuMCApICk7XG5cdFx0dmVjMyBsaWdodFRvUG9zaXRpb24gXHgzZCBzaGFkb3dDb29yZC54eXo7XG5cdFx0ZmxvYXQgZHAgXHgzZCAoIGxlbmd0aCggbGlnaHRUb1Bvc2l0aW9uICkgLSBzaGFkb3dDYW1lcmFOZWFyICkgLyAoIHNoYWRvd0NhbWVyYUZhciAtIHNoYWRvd0NhbWVyYU5lYXIgKTtcdFx0ZHAgK1x4M2Qgc2hhZG93Qmlhcztcblx0XHR2ZWMzIGJkM0QgXHgzZCBub3JtYWxpemUoIGxpZ2h0VG9Qb3NpdGlvbiApO1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApXG5cdFx0XHR2ZWMyIG9mZnNldCBceDNkIHZlYzIoIC0gMSwgMSApICogc2hhZG93UmFkaXVzICogdGV4ZWxTaXplLnk7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWYiLApzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBwb2ludFNoYWRvd01hdHJpeFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2hhZG93bWFwX3ZlcnRleDoiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0dkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSBceDNkIGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHZTcG90U2hhZG93Q29vcmRbIGkgXSBceDNkIHNwb3RTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdIFx4M2QgcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG4jZW5kaWYiLApzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6ImZsb2F0IGdldFNoYWRvd01hc2soKSB7XG5cdGZsb2F0IHNoYWRvdyBceDNkIDEuMDtcblx0I2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0IFx4M2QgZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKlx4M2QgYm9vbCggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0IFx4M2Qgc3BvdExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRvdyAqXHgzZCBib29sKCBzcG90TGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0fVxuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCBceDNkIHBvaW50TGlnaHRzWyBpIF07XG5cdFx0c2hhZG93ICpceDNkIGJvb2woIHBvaW50TGlnaHQuc2hhZG93ICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNlbmRpZlxuXHRyZXR1cm4gc2hhZG93O1xufSIsCnNraW5iYXNlX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHRtYXQ0IGJvbmVNYXRYIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcblx0bWF0NCBib25lTWF0WSBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC55ICk7XG5cdG1hdDQgYm9uZU1hdFogXHgzZCBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xuXHRtYXQ0IGJvbmVNYXRXIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcbiNlbmRpZiIsc2tpbm5pbmdfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTtcblx0I2lmZGVmIEJPTkVfVEVYVFVSRVxuXHRcdHVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xuXHRcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtcblx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRmbG9hdCBqIFx4M2QgaSAqIDQuMDtcblx0XHRcdGZsb2F0IHggXHgzZCBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgeSBceDNkIGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0XHRmbG9hdCBkeCBceDNkIDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcblx0XHRcdGZsb2F0IGR5IFx4M2QgMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRcdFx0eSBceDNkIGR5ICogKCB5ICsgMC41ICk7XG5cdFx0XHR2ZWM0IHYxIFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAwLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYyIFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYzIFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHY0IFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAzLjUgKSwgeSApICk7XG5cdFx0XHRtYXQ0IGJvbmUgXHgzZCBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZWxzZVxuXHRcdHVuaWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xuXHRcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcblx0XHRcdG1hdDQgYm9uZSBceDNkIGJvbmVNYXRyaWNlc1sgaW50KGkpIF07XG5cdFx0XHRyZXR1cm4gYm9uZTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2tpbm5pbmdfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdHZlYzQgc2tpblZlcnRleCBceDNkIGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG5cdHZlYzQgc2tpbm5lZCBceDNkIHZlYzQoIDAuMCApO1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7XG5cdHNraW5uZWQgK1x4M2QgYm9uZU1hdFogKiBza2luVmVydGV4ICogc2tpbldlaWdodC56O1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudztcblx0dHJhbnNmb3JtZWQgXHgzZCAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejtcbiNlbmRpZiIsc2tpbm5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0bWF0NCBza2luTWF0cml4IFx4M2QgbWF0NCggMC4wICk7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC54ICogYm9uZU1hdFg7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC55ICogYm9uZU1hdFk7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC56ICogYm9uZU1hdFo7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC53ICogYm9uZU1hdFc7XG5cdHNraW5NYXRyaXggIFx4M2QgYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcblx0b2JqZWN0Tm9ybWFsIFx4M2QgdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG9iamVjdFRhbmdlbnQgXHgzZCB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7XG5cdCNlbmRpZlxuI2VuZGlmIiwKc3BlY3VsYXJtYXBfZnJhZ21lbnQ6ImZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXG5cdHZlYzQgdGV4ZWxTcGVjdWxhciBceDNkIHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZVdiApO1xuXHRzcGVjdWxhclN0cmVuZ3RoIFx4M2QgdGV4ZWxTcGVjdWxhci5yO1xuI2Vsc2Vcblx0c3BlY3VsYXJTdHJlbmd0aCBceDNkIDEuMDtcbiNlbmRpZiIsc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcbiNlbmRpZiIsdG9uZW1hcHBpbmdfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKVxuXHRnbF9GcmFnQ29sb3IucmdiIFx4M2QgdG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZiIsdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDoiI2lmbmRlZiBzYXR1cmF0ZVxuXHQjZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZW5kaWZcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTtcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdXaGl0ZVBvaW50O1xudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0cmV0dXJuIHRvbmVNYXBwaW5nRXhwb3N1cmUgKiBjb2xvcjtcbn1cbnZlYzMgUmVpbmhhcmRUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCBjb2xvciAvICggdmVjMyggMS4wICkgKyBjb2xvciApICk7XG59XG4jZGVmaW5lIFVuY2hhcnRlZDJIZWxwZXIoIHggKSBtYXgoICggKCB4ICogKCAwLjE1ICogeCArIDAuMTAgKiAwLjUwICkgKyAwLjIwICogMC4wMiApIC8gKCB4ICogKCAwLjE1ICogeCArIDAuNTAgKSArIDAuMjAgKiAwLjMwICkgKSAtIDAuMDIgLyAwLjMwLCB2ZWMzKCAwLjAgKSApXG52ZWMzIFVuY2hhcnRlZDJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCBVbmNoYXJ0ZWQySGVscGVyKCBjb2xvciApIC8gVW5jaGFydGVkMkhlbHBlciggdmVjMyggdG9uZU1hcHBpbmdXaGl0ZVBvaW50ICkgKSApO1xufVxudmVjMyBPcHRpbWl6ZWRDaW5lb25Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0Y29sb3IgXHgzZCBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XG5cdHJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7XG59XG52ZWMzIEFDRVNGaWxtaWNUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCAoIGNvbG9yICogKCAyLjUxICogY29sb3IgKyAwLjAzICkgKSAvICggY29sb3IgKiAoIDIuNDMgKiBjb2xvciArIDAuNTkgKSArIDAuMTQgKSApO1xufSIsCnV2X3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfVVZcblx0dmFyeWluZyB2ZWMyIHZVdjtcbiNlbmRpZiIsdXZfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfVVZcblx0dmFyeWluZyB2ZWMyIHZVdjtcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuI2VuZGlmIix1dl92ZXJ0ZXg6IiNpZmRlZiBVU0VfVVZcblx0dlV2IFx4M2QgKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcbiNlbmRpZiIsdXYyX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiIsdXYyX3BhcnNfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0YXR0cmlidXRlIHZlYzIgdXYyO1xuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiIsdXYyX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdHZVdjIgXHgzZCB1djI7XG4jZW5kaWYiLAp3b3JsZHBvc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggRElTVEFOQ0UgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApXG5cdHZlYzQgd29ybGRQb3NpdGlvbiBceDNkIG1vZGVsTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuI2VuZGlmIixiYWNrZ3JvdW5kX2ZyYWc6InVuaWZvcm0gc2FtcGxlcjJEIHQyRDtcbnZhcnlpbmcgdmVjMiB2VXY7XG52b2lkIG1haW4oKSB7XG5cdHZlYzQgdGV4Q29sb3IgXHgzZCB0ZXh0dXJlMkQoIHQyRCwgdlV2ICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLGJhY2tncm91bmRfdmVydDoidmFyeWluZyB2ZWMyIHZVdjtcbnVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbnZvaWQgbWFpbigpIHtcblx0dlV2IFx4M2QgKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcblx0Z2xfUG9zaXRpb24gXHgzZCB2ZWM0KCBwb3NpdGlvbi54eSwgMS4wLCAxLjAgKTtcbn0iLApjdWJlX2ZyYWc6InVuaWZvcm0gc2FtcGxlckN1YmUgdEN1YmU7XG51bmlmb3JtIGZsb2F0IHRGbGlwO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbnZvaWQgbWFpbigpIHtcblx0dmVjNCB0ZXhDb2xvciBceDNkIHRleHR1cmVDdWJlKCB0Q3ViZSwgdmVjMyggdEZsaXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcblx0Z2xfRnJhZ0NvbG9yLmEgKlx4M2Qgb3BhY2l0eTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxufSIsY3ViZV92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHRnbF9Qb3NpdGlvbi56IFx4M2QgZ2xfUG9zaXRpb24udztcbn0iLApkZXB0aF9mcmFnOiIjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdFx0ZGlmZnVzZUNvbG9yLmEgXHgzZCBvcGFjaXR5O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpZiBERVBUSF9QQUNLSU5HIFx4M2RceDNkIDMyMDBcblx0XHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCB2ZWMzKCAxLjAgLSBnbF9GcmFnQ29vcmQueiApLCBvcGFjaXR5ICk7XG5cdCNlbGlmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMVxuXHRcdGdsX0ZyYWdDb2xvciBceDNkIHBhY2tEZXB0aFRvUkdCQSggZ2xfRnJhZ0Nvb3JkLnogKTtcblx0I2VuZGlmXG59IiwKZGVwdGhfdmVydDoiI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0XHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcbn0iLApkaXN0YW5jZVJHQkFfZnJhZzoiI2RlZmluZSBESVNUQU5DRVxudW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uO1xudW5pZm9ybSBmbG9hdCBuZWFyRGlzdGFuY2U7XG51bmlmb3JtIGZsb2F0IGZhckRpc3RhbmNlO1xudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbiAoKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggMS4wICk7XG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0ZmxvYXQgZGlzdCBceDNkIGxlbmd0aCggdldvcmxkUG9zaXRpb24gLSByZWZlcmVuY2VQb3NpdGlvbiApO1xuXHRkaXN0IFx4M2QgKCBkaXN0IC0gbmVhckRpc3RhbmNlICkgLyAoIGZhckRpc3RhbmNlIC0gbmVhckRpc3RhbmNlICk7XG5cdGRpc3QgXHgzZCBzYXR1cmF0ZSggZGlzdCApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBwYWNrRGVwdGhUb1JHQkEoIGRpc3QgKTtcbn0iLApkaXN0YW5jZVJHQkFfdmVydDoiI2RlZmluZSBESVNUQU5DRVxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0XHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dldvcmxkUG9zaXRpb24gXHgzZCB3b3JsZFBvc2l0aW9uLnh5ejtcbn0iLAplcXVpcmVjdF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dmVjMyBkaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWO1xuXHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIGRpcmVjdGlvbi55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHNhbXBsZVVWLnggXHgzZCBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHR2ZWM0IHRleENvbG9yIFx4M2QgdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLAplcXVpcmVjdF92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxufSIsbGluZWRhc2hlZF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgXHgzZSBkYXNoU2l6ZSApIHtcblx0XHRkaXNjYXJkO1xuXHR9XG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCmxpbmVkYXNoZWRfdmVydDoidW5pZm9ybSBmbG9hdCBzY2FsZTtcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdHZMaW5lRGlzdGFuY2UgXHgzZCBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcblx0dmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaGJhc2ljX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0I2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIHZlYzMoIDEuMCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKlx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xuXHQjaW5jbHVkZSBceDNjZW52bWFwX2ZyYWdtZW50XHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2hiYXNpY192ZXJ0OiIjaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3V2Ml92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hsYW1iZXJ0X2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcblx0dmFyeWluZyB2ZWMzIHZJbmRpcmVjdEJhY2s7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFza19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgXHgzZCBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZJbmRpcmVjdEZyb250IDogdkluZGlyZWN0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgdkluZGlyZWN0RnJvbnQ7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjbGlnaHRtYXBfZnJhZ21lbnRceDNlXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqXHgzZCBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSBceDNkICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlIFx4M2QgdkxpZ2h0RnJvbnQ7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICpceDNkIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNobGFtYmVydF92ZXJ0OiIjZGVmaW5lIExBTUJFUlRcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcbnZhcnlpbmcgdmVjMyB2SW5kaXJlY3RGcm9udDtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XG5cdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfbGFtYmVydF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLAptZXNobWF0Y2FwX2ZyYWc6IiNkZWZpbmUgTUFUQ0FQXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gc2FtcGxlcjJEIG1hdGNhcDtcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHR2ZWMzIHZpZXdEaXIgXHgzZCBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcblx0dmVjMyB4IFx4M2Qgbm9ybWFsaXplKCB2ZWMzKCB2aWV3RGlyLnosIDAuMCwgLSB2aWV3RGlyLnggKSApO1xuXHR2ZWMzIHkgXHgzZCBjcm9zcyggdmlld0RpciwgeCApO1xuXHR2ZWMyIHV2IFx4M2QgdmVjMiggZG90KCB4LCBub3JtYWwgKSwgZG90KCB5LCBub3JtYWwgKSApICogMC40OTUgKyAwLjU7XG5cdCNpZmRlZiBVU0VfTUFUQ0FQXG5cdFx0dmVjNCBtYXRjYXBDb2xvciBceDNkIHRleHR1cmUyRCggbWF0Y2FwLCB1diApO1xuXHRcdG1hdGNhcENvbG9yIFx4M2QgbWF0Y2FwVGV4ZWxUb0xpbmVhciggbWF0Y2FwQ29sb3IgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IG1hdGNhcENvbG9yIFx4M2QgdmVjNCggMS4wICk7XG5cdCNlbmRpZlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiICogbWF0Y2FwQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2htYXRjYXBfdmVydDoiI2RlZmluZSBNQVRDQVBcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpZm5kZWYgRkxBVF9TSEFERURcblx0XHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcbn0iLAptZXNocGhvbmdfZnJhZzoiI2RlZmluZSBQSE9OR1xudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIHZlYzMgc3BlY3VsYXI7XG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGFyc19iZWdpblx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NidW1wbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgXHgzZCBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X2JlZ2luXHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19waG9uZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2VuZFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaW5jbHVkZSBceDNjZW52bWFwX2ZyYWdtZW50XHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZGl0aGVyaW5nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2hwaG9uZ192ZXJ0OiIjZGVmaW5lIFBIT05HXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcbiNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaHBoeXNpY2FsX2ZyYWc6IiNkZWZpbmUgU1RBTkRBUkRcbiNpZmRlZiBQSFlTSUNBTFxuXHQjZGVmaW5lIFJFRkxFQ1RJVklUWVxuXHQjZGVmaW5lIENMRUFSQ09BVFxuXHQjZGVmaW5lIFRSQU5TUEFSRU5DWVxuI2VuZGlmXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWZkZWYgVFJBTlNQQVJFTkNZXG5cdHVuaWZvcm0gZmxvYXQgdHJhbnNwYXJlbmN5O1xuI2VuZGlmXG4jaWZkZWYgUkVGTEVDVElWSVRZXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuI2VuZGlmXG4jaWZkZWYgQ0xFQVJDT0FUXG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0O1xuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR1bmlmb3JtIHZlYzMgc2hlZW47XG4jZW5kaWZcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY2RpdGhlcmluZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NhbHBoYW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FvbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2N1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgXHgzZCBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3JvdWdobmVzc21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21ldGFsbmVzc21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2JlZ2luXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfZW5kXHgzZVxuXHQjaW5jbHVkZSBceDNjYW9tYXBfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpZmRlZiBUUkFOU1BBUkVOQ1lcblx0XHRkaWZmdXNlQ29sb3IuYSAqXHgzZCBzYXR1cmF0ZSggMS4gLSB0cmFuc3BhcmVuY3kgKyBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKCByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKSApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNocGh5c2ljYWxfdmVydDoiI2RlZmluZSBTVEFOREFSRFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NoYWRvd21hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm5vcm1hbF9mcmFnOiIjZGVmaW5lIE5PUk1BTFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBwYWNrTm9ybWFsVG9SR0IoIG5vcm1hbCApLCBvcGFjaXR5ICk7XG59IiwKbm9ybWFsX3ZlcnQ6IiNkZWZpbmUgTk9STUFMXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNlbmRpZlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2VGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0dkJpdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcblx0I2VuZGlmXG4jZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcbiNlbmRpZlxufSIsCnBvaW50c19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9wYXJ0aWNsZV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLApwb2ludHNfdmVydDoidW5pZm9ybSBmbG9hdCBzaXplO1xudW5pZm9ybSBmbG9hdCBzY2FsZTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHRnbF9Qb2ludFNpemUgXHgzZCBzaXplO1xuXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxuXHRcdGJvb2wgaXNQZXJzcGVjdGl2ZSBceDNkICggcHJvamVjdGlvbk1hdHJpeFsgMiBdWyAzIF0gXHgzZFx4M2QgLSAxLjAgKTtcblx0XHRpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKlx4M2QgKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKc2hhZG93X2ZyYWc6InVuaWZvcm0gdmVjMyBjb2xvcjtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGFyc19iZWdpblx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsc2hhZG93X3ZlcnQ6IiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLApzcHJpdGVfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG59IiwKc3ByaXRlX3ZlcnQ6InVuaWZvcm0gZmxvYXQgcm90YXRpb247XG51bmlmb3JtIHZlYzIgY2VudGVyO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHR2ZWM0IG12UG9zaXRpb24gXHgzZCBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcblx0dmVjMiBzY2FsZTtcblx0c2NhbGUueCBceDNkIGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDAgXS54LCBtb2RlbE1hdHJpeFsgMCBdLnksIG1vZGVsTWF0cml4WyAwIF0ueiApICk7XG5cdHNjYWxlLnkgXHgzZCBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueCwgbW9kZWxNYXRyaXhbIDEgXS55LCBtb2RlbE1hdHJpeFsgMSBdLnogKSApO1xuXHQjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgXHgzZCAoIHByb2plY3Rpb25NYXRyaXhbIDIgXVsgMyBdIFx4M2RceDNkIC0gMS4wICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKlx4M2QgLSBtdlBvc2l0aW9uLno7XG5cdCNlbmRpZlxuXHR2ZWMyIGFsaWduZWRQb3NpdGlvbiBceDNkICggcG9zaXRpb24ueHkgLSAoIGNlbnRlciAtIHZlYzIoIDAuNSApICkgKSAqIHNjYWxlO1xuXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjtcblx0cm90YXRlZFBvc2l0aW9uLnggXHgzZCBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRyb3RhdGVkUG9zaXRpb24ueSBceDNkIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XG5cdG12UG9zaXRpb24ueHkgK1x4M2Qgcm90YXRlZFBvc2l0aW9uO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59In0sCldhPXtjb21tb246e2RpZmZ1c2U6e3ZhbHVlOm5ldyBJKDE1NjU4NzM0KX0sb3BhY2l0eTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IHR9LGFscGhhTWFwOnt2YWx1ZTpudWxsfX0sc3BlY3VsYXJtYXA6e3NwZWN1bGFyTWFwOnt2YWx1ZTpudWxsfX0sZW52bWFwOntlbnZNYXA6e3ZhbHVlOm51bGx9LGZsaXBFbnZNYXA6e3ZhbHVlOi0xfSxyZWZsZWN0aXZpdHk6e3ZhbHVlOjF9LHJlZnJhY3Rpb25SYXRpbzp7dmFsdWU6Ljk4fSxtYXhNaXBMZXZlbDp7dmFsdWU6MH19LGFvbWFwOnthb01hcDp7dmFsdWU6bnVsbH0sYW9NYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fSxsaWdodG1hcDp7bGlnaHRNYXA6e3ZhbHVlOm51bGx9LGxpZ2h0TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sZW1pc3NpdmVtYXA6e2VtaXNzaXZlTWFwOnt2YWx1ZTpudWxsfX0sYnVtcG1hcDp7YnVtcE1hcDp7dmFsdWU6bnVsbH0sYnVtcFNjYWxlOnt2YWx1ZToxfX0sbm9ybWFsbWFwOntub3JtYWxNYXA6e3ZhbHVlOm51bGx9LApub3JtYWxTY2FsZTp7dmFsdWU6bmV3IGYoMSwxKX19LGRpc3BsYWNlbWVudG1hcDp7ZGlzcGxhY2VtZW50TWFwOnt2YWx1ZTpudWxsfSxkaXNwbGFjZW1lbnRTY2FsZTp7dmFsdWU6MX0sZGlzcGxhY2VtZW50Qmlhczp7dmFsdWU6MH19LHJvdWdobmVzc21hcDp7cm91Z2huZXNzTWFwOnt2YWx1ZTpudWxsfX0sbWV0YWxuZXNzbWFwOnttZXRhbG5lc3NNYXA6e3ZhbHVlOm51bGx9fSxncmFkaWVudG1hcDp7Z3JhZGllbnRNYXA6e3ZhbHVlOm51bGx9fSxmb2c6e2ZvZ0RlbnNpdHk6e3ZhbHVlOjIuNUUtNH0sZm9nTmVhcjp7dmFsdWU6MX0sZm9nRmFyOnt2YWx1ZToyRTN9LGZvZ0NvbG9yOnt2YWx1ZTpuZXcgSSgxNjc3NzIxNSl9fSxsaWdodHM6e2FtYmllbnRMaWdodENvbG9yOnt2YWx1ZTpbXX0sbGlnaHRQcm9iZTp7dmFsdWU6W119LGRpcmVjdGlvbmFsTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sY29sb3I6e30sc2hhZG93Ont9LHNoYWRvd0JpYXM6e30sCnNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sZGlyZWN0aW9uYWxTaGFkb3dNYXA6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDp7dmFsdWU6W119LHNwb3RMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRpcmVjdGlvbjp7fSxkaXN0YW5jZTp7fSxjb25lQ29zOnt9LHBlbnVtYnJhQ29zOnt9LGRlY2F5Ont9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sc3BvdFNoYWRvd01hcDp7dmFsdWU6W119LHNwb3RTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxwb2ludExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sZGVjYXk6e30sZGlzdGFuY2U6e30sc2hhZG93Ont9LHNoYWRvd0JpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e30sc2hhZG93Q2FtZXJhTmVhcjp7fSxzaGFkb3dDYW1lcmFGYXI6e319fSwKcG9pbnRTaGFkb3dNYXA6e3ZhbHVlOltdfSxwb2ludFNoYWRvd01hdHJpeDp7dmFsdWU6W119LGhlbWlzcGhlcmVMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2RpcmVjdGlvbjp7fSxza3lDb2xvcjp7fSxncm91bmRDb2xvcjp7fX19LHJlY3RBcmVhTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSx3aWR0aDp7fSxoZWlnaHQ6e319fX0scG9pbnRzOntkaWZmdXNlOnt2YWx1ZTpuZXcgSSgxNTY1ODczNCl9LG9wYWNpdHk6e3ZhbHVlOjF9LHNpemU6e3ZhbHVlOjF9LHNjYWxlOnt2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgdH19LHNwcml0ZTp7ZGlmZnVzZTp7dmFsdWU6bmV3IEkoMTU2NTg3MzQpfSxvcGFjaXR5Ont2YWx1ZToxfSxjZW50ZXI6e3ZhbHVlOm5ldyBmKC41LC41KX0scm90YXRpb246e3ZhbHVlOjB9LG1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyB0fX19LE1jPQp7YmFzaWM6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2Euc3BlY3VsYXJtYXAsV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmZvZ10pLHZlcnRleFNoYWRlcjpyYi5tZXNoYmFzaWNfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNoYmFzaWNfZnJhZ30sbGFtYmVydDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5zcGVjdWxhcm1hcCxXYS5lbnZtYXAsV2EuYW9tYXAsV2EubGlnaHRtYXAsV2EuZW1pc3NpdmVtYXAsV2EuZm9nLFdhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBJKDApfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaGxhbWJlcnRfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNobGFtYmVydF9mcmFnfSxwaG9uZzp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5zcGVjdWxhcm1hcCxXYS5lbnZtYXAsV2EuYW9tYXAsV2EubGlnaHRtYXAsV2EuZW1pc3NpdmVtYXAsV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLFdhLmdyYWRpZW50bWFwLApXYS5mb2csV2EubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IEkoMCl9LHNwZWN1bGFyOnt2YWx1ZTpuZXcgSSgxMTE4NDgxKX0sc2hpbmluZXNzOnt2YWx1ZTozMH19XSksdmVydGV4U2hhZGVyOnJiLm1lc2hwaG9uZ192ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLm1lc2hwaG9uZ19mcmFnfSxzdGFuZGFyZDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5lbnZtYXAsV2EuYW9tYXAsV2EubGlnaHRtYXAsV2EuZW1pc3NpdmVtYXAsV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLFdhLnJvdWdobmVzc21hcCxXYS5tZXRhbG5lc3NtYXAsV2EuZm9nLFdhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBJKDApfSxyb3VnaG5lc3M6e3ZhbHVlOi41fSxtZXRhbG5lc3M6e3ZhbHVlOi41fSxlbnZNYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfZnJhZ30sCm1hdGNhcDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5idW1wbWFwLFdhLm5vcm1hbG1hcCxXYS5kaXNwbGFjZW1lbnRtYXAsV2EuZm9nLHttYXRjYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNobWF0Y2FwX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaG1hdGNhcF9mcmFnfSxwb2ludHM6e3VuaWZvcm1zOkJiKFtXYS5wb2ludHMsV2EuZm9nXSksdmVydGV4U2hhZGVyOnJiLnBvaW50c192ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLnBvaW50c19mcmFnfSxkYXNoZWQ6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuZm9nLHtzY2FsZTp7dmFsdWU6MX0sZGFzaFNpemU6e3ZhbHVlOjF9LHRvdGFsU2l6ZTp7dmFsdWU6Mn19XSksdmVydGV4U2hhZGVyOnJiLmxpbmVkYXNoZWRfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5saW5lZGFzaGVkX2ZyYWd9LGRlcHRoOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmRpc3BsYWNlbWVudG1hcF0pLHZlcnRleFNoYWRlcjpyYi5kZXB0aF92ZXJ0LApmcmFnbWVudFNoYWRlcjpyYi5kZXB0aF9mcmFnfSxub3JtYWw6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLHtvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubm9ybWFsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubm9ybWFsX2ZyYWd9LHNwcml0ZTp7dW5pZm9ybXM6QmIoW1dhLnNwcml0ZSxXYS5mb2ddKSx2ZXJ0ZXhTaGFkZXI6cmIuc3ByaXRlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuc3ByaXRlX2ZyYWd9LGJhY2tncm91bmQ6e3VuaWZvcm1zOnt1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IHR9LHQyRDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpyYi5iYWNrZ3JvdW5kX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuYmFja2dyb3VuZF9mcmFnfSxjdWJlOnt1bmlmb3Jtczp7dEN1YmU6e3ZhbHVlOm51bGx9LHRGbGlwOnt2YWx1ZTotMX0sb3BhY2l0eTp7dmFsdWU6MX19LHZlcnRleFNoYWRlcjpyYi5jdWJlX3ZlcnQsCmZyYWdtZW50U2hhZGVyOnJiLmN1YmVfZnJhZ30sZXF1aXJlY3Q6e3VuaWZvcm1zOnt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6cmIuZXF1aXJlY3RfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5lcXVpcmVjdF9mcmFnfSxkaXN0YW5jZVJHQkE6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuZGlzcGxhY2VtZW50bWFwLHtyZWZlcmVuY2VQb3NpdGlvbjp7dmFsdWU6bmV3IGt9LG5lYXJEaXN0YW5jZTp7dmFsdWU6MX0sZmFyRGlzdGFuY2U6e3ZhbHVlOjFFM319XSksdmVydGV4U2hhZGVyOnJiLmRpc3RhbmNlUkdCQV92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLmRpc3RhbmNlUkdCQV9mcmFnfSxzaGFkb3c6e3VuaWZvcm1zOkJiKFtXYS5saWdodHMsV2EuZm9nLHtjb2xvcjp7dmFsdWU6bmV3IEkoMCl9LG9wYWNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpyYi5zaGFkb3dfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5zaGFkb3dfZnJhZ319O01jLnBoeXNpY2FsPQp7dW5pZm9ybXM6QmIoW01jLnN0YW5kYXJkLnVuaWZvcm1zLHt0cmFuc3BhcmVuY3k6e3ZhbHVlOjB9LGNsZWFyY29hdDp7dmFsdWU6MH0sY2xlYXJjb2F0Um91Z2huZXNzOnt2YWx1ZTowfSxzaGVlbjp7dmFsdWU6bmV3IEkoMCl9LGNsZWFyY29hdE5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgZigxLDEpfSxjbGVhcmNvYXROb3JtYWxNYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfZnJhZ307cmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtyZC5wcm90b3R5cGUuY29uc3RydWN0b3I9cmQ7TGMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtMYy5wcm90b3R5cGUuY29uc3RydWN0b3I9TGM7Y2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO2NkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jZDtjZC5wcm90b3R5cGUuaXNDdWJlVGV4dHVyZT0KITA7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLnByb3RvdHlwZSwiaW1hZ2VzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW1hZ2V9LHNldDpmdW5jdGlvbihhKXt0aGlzLmltYWdlPWF9fSk7cmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO3JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1yZTtyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTJEQXJyYXk9ITA7c2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO3NlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1zZTtzZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTNEPSEwO3ZhciBpaj1uZXcgbCxlbD1uZXcgcmUsZ2w9bmV3IHNlLGpqPW5ldyBjZCxjaj1bXSxlaj1bXSxoaj1uZXcgRmxvYXQzMkFycmF5KDE2KSxnaj1uZXcgRmxvYXQzMkFycmF5KDkpLGZqPW5ldyBGbG9hdDMyQXJyYXkoNCk7a2oucHJvdG90eXBlLnVwZGF0ZUNhY2hlPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY2FjaGU7YSBpbnN0YW5jZW9mCkZsb2F0MzJBcnJheSYmYy5sZW5ndGghPT1hLmxlbmd0aCYmKHRoaXMuY2FjaGU9bmV3IEZsb2F0MzJBcnJheShhLmxlbmd0aCkpO21jKGMsYSl9O2xqLnByb3RvdHlwZS5zZXRWYWx1ZT1mdW5jdGlvbihhLGMsZSl7Zm9yKHZhciBnPXRoaXMuc2VxLHI9MCx2PWcubGVuZ3RoO3IhPT12Oysrcil7dmFyIHo9Z1tyXTt6LnNldFZhbHVlKGEsY1t6LmlkXSxlKX19O3ZhciBMaD0vKFtcd1xkX10rKShcXSk/KFxbfFwuKT8vZzt1ZC5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oYSxjLGUsZyl7Yz10aGlzLm1hcFtjXTt2b2lkIDAhPT1jJiZjLnNldFZhbHVlKGEsZSxnKX07dWQucHJvdG90eXBlLnNldE9wdGlvbmFsPWZ1bmN0aW9uKGEsYyxlKXtjPWNbZV07dm9pZCAwIT09YyYmdGhpcy5zZXRWYWx1ZShhLGUsYyl9O3VkLnVwbG9hZD1mdW5jdGlvbihhLGMsZSxnKXtmb3IodmFyIHI9MCx2PWMubGVuZ3RoO3IhPT12Oysrcil7dmFyIHo9Y1tyXSxFPWVbei5pZF07ITEhPT1FLm5lZWRzVXBkYXRlJiYKei5zZXRWYWx1ZShhLEUudmFsdWUsZyl9fTt1ZC5zZXFXaXRoVmFsdWU9ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9W10sZz0wLHI9YS5sZW5ndGg7ZyE9PXI7KytnKXt2YXIgdj1hW2ddO3YuaWQgaW4gYyYmZS5wdXNoKHYpfXJldHVybiBlfTt2YXIgS2w9MCxUbD0wO3ZkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTt2ZC5wcm90b3R5cGUuY29uc3RydWN0b3I9dmQ7dmQucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWw9ITA7dmQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kZXB0aFBhY2tpbmc9YS5kZXB0aFBhY2tpbmc7dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubWFwPWEubWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmRpc3BsYWNlbWVudE1hcD1hLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPQphLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7cmV0dXJuIHRoaXN9O3dkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTt3ZC5wcm90b3R5cGUuY29uc3RydWN0b3I9d2Q7d2QucHJvdG90eXBlLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9ITA7d2QucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KGEucmVmZXJlbmNlUG9zaXRpb24pO3RoaXMubmVhckRpc3RhbmNlPWEubmVhckRpc3RhbmNlO3RoaXMuZmFyRGlzdGFuY2U9YS5mYXJEaXN0YW5jZTt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tYXA9YS5tYXA7dGhpcy5hbHBoYU1hcD0KYS5hbHBoYU1hcDt0aGlzLmRpc3BsYWNlbWVudE1hcD1hLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWEuZGlzcGxhY2VtZW50U2NhbGU7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPWEuZGlzcGxhY2VtZW50QmlhcztyZXR1cm4gdGhpc307dWUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnVlLGlzR3JvdXA6ITB9KTt2Zi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHZiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZmLGlzQXJyYXlDYW1lcmE6ITB9KTt2YXIgeWo9bmV3IGssemo9bmV3IGs7T2JqZWN0LmFzc2lnbihOaC5wcm90b3R5cGUsZC5wcm90b3R5cGUpO09iamVjdC5hc3NpZ24oQWoucHJvdG90eXBlLGQucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKHpnLnByb3RvdHlwZSx7aXNGb2dFeHAyOiEwLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB6Zyh0aGlzLmNvbG9yLAp0aGlzLmRlbnNpdHkpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiRm9nRXhwMiIsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxkZW5zaXR5OnRoaXMuZGVuc2l0eX19fSk7T2JqZWN0LmFzc2lnbihBZy5wcm90b3R5cGUse2lzRm9nOiEwLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBZyh0aGlzLmNvbG9yLHRoaXMubmVhcix0aGlzLmZhcil9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJGb2ciLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksbmVhcjp0aGlzLm5lYXIsZmFyOnRoaXMuZmFyfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoUWQucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihhKXshMD09PWEmJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24oUWQucHJvdG90eXBlLHtpc0ludGVybGVhdmVkQnVmZmVyOiEwLG9uVXBsb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9LHNldEFycmF5OmZ1bmN0aW9uKGEpe2lmKEFycmF5LmlzQXJyYXkoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTsKdGhpcy5jb3VudD12b2lkIDAhPT1hP2EubGVuZ3RoL3RoaXMuc3RyaWRlOjA7dGhpcy5hcnJheT1hO3JldHVybiB0aGlzfSxzZXREeW5hbWljOmZ1bmN0aW9uKGEpe3RoaXMuZHluYW1pYz1hO3JldHVybiB0aGlzfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYXJyYXk9bmV3IGEuYXJyYXkuY29uc3RydWN0b3IoYS5hcnJheSk7dGhpcy5jb3VudD1hLmNvdW50O3RoaXMuc3RyaWRlPWEuc3RyaWRlO3RoaXMuZHluYW1pYz1hLmR5bmFtaWM7cmV0dXJuIHRoaXN9LGNvcHlBdDpmdW5jdGlvbihhLGMsZSl7YSo9dGhpcy5zdHJpZGU7ZSo9Yy5zdHJpZGU7Zm9yKHZhciBnPTAscj10aGlzLnN0cmlkZTtnPHI7ZysrKXRoaXMuYXJyYXlbYStnXT1jLmFycmF5W2UrZ107cmV0dXJuIHRoaXN9LHNldDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMuYXJyYXkuc2V0KGEsYyk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSwKb25VcGxvYWQ6ZnVuY3Rpb24oYSl7dGhpcy5vblVwbG9hZENhbGxiYWNrPWE7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeGYucHJvdG90eXBlLHtjb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5jb3VudH19LGFycmF5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5fX19KTtPYmplY3QuYXNzaWduKHhmLnByb3RvdHlwZSx7aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTohMCxzZXRYOmZ1bmN0aW9uKGEsYyl7dGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF09YztyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihhLGMpe3RoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09YztyZXR1cm4gdGhpc30sc2V0WjpmdW5jdGlvbihhLGMpe3RoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl09YztyZXR1cm4gdGhpc30sCnNldFc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdPWM7cmV0dXJuIHRoaXN9LGdldFg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdfSxnZXRZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdfSxnZXRaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdfSxnZXRXOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdfSxzZXRYWTpmdW5jdGlvbihhLGMsZSl7YT1hKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7dGhpcy5kYXRhLmFycmF5W2ErMF09Yzt0aGlzLmRhdGEuYXJyYXlbYSsxXT1lO3JldHVybiB0aGlzfSxzZXRYWVo6ZnVuY3Rpb24oYSwKYyxlLGcpe2E9YSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVthKzBdPWM7dGhpcy5kYXRhLmFycmF5W2ErMV09ZTt0aGlzLmRhdGEuYXJyYXlbYSsyXT1nO3JldHVybiB0aGlzfSxzZXRYWVpXOmZ1bmN0aW9uKGEsYyxlLGcscil7YT1hKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7dGhpcy5kYXRhLmFycmF5W2ErMF09Yzt0aGlzLmRhdGEuYXJyYXlbYSsxXT1lO3RoaXMuZGF0YS5hcnJheVthKzJdPWc7dGhpcy5kYXRhLmFycmF5W2ErM109cjtyZXR1cm4gdGhpc319KTtBZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7QWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPUFkO0FkLnByb3RvdHlwZS5pc1Nwcml0ZU1hdGVyaWFsPSEwO0FkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hcD1hLm1hcDt0aGlzLnJvdGF0aW9uPQphLnJvdGF0aW9uO3RoaXMuc2l6ZUF0dGVudWF0aW9uPWEuc2l6ZUF0dGVudWF0aW9uO3JldHVybiB0aGlzfTt2YXIgQWUsbWc9bmV3IGssbmY9bmV3IGssb2Y9bmV3IGssQmU9bmV3IGYsemY9bmV3IGYsRmo9bmV3IHEscWg9bmV3IGssbmc9bmV3IGsscmg9bmV3IGssa2s9bmV3IGYsS2k9bmV3IGYsbGs9bmV3IGY7eWYucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnlmLGlzU3ByaXRlOiEwLHJheWNhc3Q6ZnVuY3Rpb24oYSxjKXtudWxsPT09YS5jYW1lcmEmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLlNwcml0ZTogIlJheWNhc3Rlci5jYW1lcmEiIG5lZWRzIHRvIGJlIHNldCBpbiBvcmRlciB0byByYXljYXN0IGFnYWluc3Qgc3ByaXRlcy4nKTtuZi5zZXRGcm9tTWF0cml4U2NhbGUodGhpcy5tYXRyaXhXb3JsZCk7RmouY29weShhLmNhbWVyYS5tYXRyaXhXb3JsZCk7dGhpcy5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhhLmNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsCnRoaXMubWF0cml4V29ybGQpO29mLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1vZGVsVmlld01hdHJpeCk7YS5jYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSYmITE9PT10aGlzLm1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiYmbmYubXVsdGlwbHlTY2FsYXIoLW9mLnopO3ZhciBlPXRoaXMubWF0ZXJpYWwucm90YXRpb247aWYoMCE9PWUpe3ZhciBnPU1hdGguY29zKGUpO3ZhciByPU1hdGguc2luKGUpfWU9dGhpcy5jZW50ZXI7QmcocWguc2V0KC0uNSwtLjUsMCksb2YsZSxuZixyLGcpO0JnKG5nLnNldCguNSwtLjUsMCksb2YsZSxuZixyLGcpO0JnKHJoLnNldCguNSwuNSwwKSxvZixlLG5mLHIsZyk7a2suc2V0KDAsMCk7S2kuc2V0KDEsMCk7bGsuc2V0KDEsMSk7dmFyIHY9YS5yYXkuaW50ZXJzZWN0VHJpYW5nbGUocWgsbmcscmgsITEsbWcpO2lmKG51bGw9PT12JiYoQmcobmcuc2V0KC0uNSwuNSwwKSxvZixlLG5mLHIsZyksS2kuc2V0KDAsMSksdj1hLnJheS5pbnRlcnNlY3RUcmlhbmdsZShxaCwKcmgsbmcsITEsbWcpLG51bGw9PT12KSlyZXR1cm47cj1hLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhtZyk7cjxhLm5lYXJ8fHI+YS5mYXJ8fGMucHVzaCh7ZGlzdGFuY2U6cixwb2ludDptZy5jbG9uZSgpLHV2OkIuZ2V0VVYobWcscWgsbmcscmgsa2ssS2ksbGssbmV3IGYpLGZhY2U6bnVsbCxvYmplY3Q6dGhpc30pfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt2b2lkIDAhPT1hLmNlbnRlciYmdGhpcy5jZW50ZXIuY29weShhLmNlbnRlcik7cmV0dXJuIHRoaXN9fSk7dmFyIHNoPW5ldyBrLG1rPW5ldyBrO0FmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpBZixpc0xPRDohMCxjb3B5OmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphLCExKTthPWEubGV2ZWxzO2Zvcih2YXIgYz0wLGU9YS5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YVtjXTt0aGlzLmFkZExldmVsKGcub2JqZWN0LmNsb25lKCksZy5kaXN0YW5jZSl9cmV0dXJuIHRoaXN9LGFkZExldmVsOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Yz1NYXRoLmFicyhjKTtmb3IodmFyIGU9dGhpcy5sZXZlbHMsZz0wO2c8ZS5sZW5ndGgmJiEoYzxlW2ddLmRpc3RhbmNlKTtnKyspO2Uuc3BsaWNlKGcsMCx7ZGlzdGFuY2U6YyxvYmplY3Q6YX0pO3RoaXMuYWRkKGEpO3JldHVybiB0aGlzfSxnZXRPYmplY3RGb3JEaXN0YW5jZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5sZXZlbHMsZT0xLGc9Yy5sZW5ndGg7ZTxnJiYhKGE8Y1tlXS5kaXN0YW5jZSk7ZSsrKTtyZXR1cm4gY1tlLTFdLm9iamVjdH0scmF5Y2FzdDpmdW5jdGlvbihhLGMpe3NoLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKTt0aGlzLmdldE9iamVjdEZvckRpc3RhbmNlKGEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKHNoKSkucmF5Y2FzdChhLApjKX0sdXBkYXRlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMubGV2ZWxzO2lmKDE8Yy5sZW5ndGgpe3NoLnNldEZyb21NYXRyaXhQb3NpdGlvbihhLm1hdHJpeFdvcmxkKTttay5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7YT1zaC5kaXN0YW5jZVRvKG1rKTtjWzBdLm9iamVjdC52aXNpYmxlPSEwO2Zvcih2YXIgZT0xLGc9Yy5sZW5ndGg7ZTxnO2UrKylpZihhPj1jW2VdLmRpc3RhbmNlKWNbZS0xXS5vYmplY3QudmlzaWJsZT0hMSxjW2VdLm9iamVjdC52aXNpYmxlPSEwO2Vsc2UgYnJlYWs7Zm9yKDtlPGc7ZSsrKWNbZV0ub2JqZWN0LnZpc2libGU9ITF9fSx0b0pTT046ZnVuY3Rpb24oYSl7YT1BLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0LmxldmVscz1bXTtmb3IodmFyIGM9dGhpcy5sZXZlbHMsZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9Y1tlXTthLm9iamVjdC5sZXZlbHMucHVzaCh7b2JqZWN0OnIub2JqZWN0LnV1aWQsCmRpc3RhbmNlOnIuZGlzdGFuY2V9KX1yZXR1cm4gYX19KTtCZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkJmLGlzU2tpbm5lZE1lc2g6ITAsYmluZDpmdW5jdGlvbihhLGMpe3RoaXMuc2tlbGV0b249YTt2b2lkIDA9PT1jJiYodGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCksdGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpLGM9dGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5iaW5kTWF0cml4LmNvcHkoYyk7dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKGMpfSxwb3NlOmZ1bmN0aW9uKCl7dGhpcy5za2VsZXRvbi5wb3NlKCl9LG5vcm1hbGl6ZVNraW5XZWlnaHRzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBwLGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQsZT0wLGc9Yy5jb3VudDtlPGc7ZSsrKXthLng9Yy5nZXRYKGUpO2EueT1jLmdldFkoZSk7YS56PWMuZ2V0WihlKTsKYS53PWMuZ2V0VyhlKTt2YXIgcj0xL2EubWFuaGF0dGFuTGVuZ3RoKCk7SW5maW5pdHkhPT1yP2EubXVsdGlwbHlTY2FsYXIocik6YS5zZXQoMSwwLDAsMCk7Yy5zZXRYWVpXKGUsYS54LGEueSxhLnosYS53KX19LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGEpe3hhLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSk7ImF0dGFjaGVkIj09PXRoaXMuYmluZE1vZGU/dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpOiJkZXRhY2hlZCI9PT10aGlzLmJpbmRNb2RlP3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLmJpbmRNYXRyaXgpOmNvbnNvbGUud2FybigiVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogIit0aGlzLmJpbmRNb2RlKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTsKdmFyIG5rPW5ldyBxLEltPW5ldyBxO09iamVjdC5hc3NpZ24oQ2cucHJvdG90eXBlLHtjYWxjdWxhdGVJbnZlcnNlczpmdW5jdGlvbigpe3RoaXMuYm9uZUludmVyc2VzPVtdO2Zvcih2YXIgYT0wLGM9dGhpcy5ib25lcy5sZW5ndGg7YTxjO2ErKyl7dmFyIGU9bmV3IHE7dGhpcy5ib25lc1thXSYmZS5nZXRJbnZlcnNlKHRoaXMuYm9uZXNbYV0ubWF0cml4V29ybGQpO3RoaXMuYm9uZUludmVyc2VzLnB1c2goZSl9fSxwb3NlOmZ1bmN0aW9uKCl7dmFyIGEsYzt2YXIgZT0wO2ZvcihjPXRoaXMuYm9uZXMubGVuZ3RoO2U8YztlKyspKGE9dGhpcy5ib25lc1tlXSkmJmEubWF0cml4V29ybGQuZ2V0SW52ZXJzZSh0aGlzLmJvbmVJbnZlcnNlc1tlXSk7ZT0wO2ZvcihjPXRoaXMuYm9uZXMubGVuZ3RoO2U8YztlKyspaWYoYT10aGlzLmJvbmVzW2VdKWEucGFyZW50JiZhLnBhcmVudC5pc0JvbmU/KGEubWF0cml4LmdldEludmVyc2UoYS5wYXJlbnQubWF0cml4V29ybGQpLGEubWF0cml4Lm11bHRpcGx5KGEubWF0cml4V29ybGQpKToKYS5tYXRyaXguY29weShhLm1hdHJpeFdvcmxkKSxhLm1hdHJpeC5kZWNvbXBvc2UoYS5wb3NpdGlvbixhLnF1YXRlcm5pb24sYS5zY2FsZSl9LHVwZGF0ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmJvbmVzLGM9dGhpcy5ib25lSW52ZXJzZXMsZT10aGlzLmJvbmVNYXRyaWNlcyxnPXRoaXMuYm9uZVRleHR1cmUscj0wLHY9YS5sZW5ndGg7cjx2O3IrKyluay5tdWx0aXBseU1hdHJpY2VzKGFbcl0/YVtyXS5tYXRyaXhXb3JsZDpJbSxjW3JdKSxuay50b0FycmF5KGUsMTYqcik7dm9pZCAwIT09ZyYmKGcubmVlZHNVcGRhdGU9ITApfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgQ2codGhpcy5ib25lcyx0aGlzLmJvbmVJbnZlcnNlcyl9LGdldEJvbmVCeU5hbWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTAsZT10aGlzLmJvbmVzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz10aGlzLmJvbmVzW2NdO2lmKGcubmFtZT09PWEpcmV0dXJuIGd9fX0pO1VoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6VWgsaXNCb25lOiEwfSk7RmIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO0ZiLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GYjtGYi5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbD0hMDtGYi5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5saW5ld2lkdGg9YS5saW5ld2lkdGg7dGhpcy5saW5lY2FwPWEubGluZWNhcDt0aGlzLmxpbmVqb2luPWEubGluZWpvaW47cmV0dXJuIHRoaXN9O3ZhciBvaz1uZXcgayxwaz1uZXcgayxxaz1uZXcgcSx0aD1uZXcgRCxvZz1uZXcgRztWYi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VmIsaXNMaW5lOiEwLGNvbXB1dGVMaW5lRGlzdGFuY2VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PQphLmluZGV4KXtmb3IodmFyIGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9WzBdLGc9MSxyPWMuY291bnQ7ZzxyO2crKylvay5mcm9tQnVmZmVyQXR0cmlidXRlKGMsZy0xKSxway5mcm9tQnVmZmVyQXR0cmlidXRlKGMsZyksZVtnXT1lW2ctMV0sZVtnXSs9b2suZGlzdGFuY2VUbyhwayk7YS5hZGRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGNhKGUsMSkpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5MaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIGlmKGEuaXNHZW9tZXRyeSlmb3IoYz1hLnZlcnRpY2VzLGU9YS5saW5lRGlzdGFuY2VzLGVbMF09MCxnPTEscj1jLmxlbmd0aDtnPHI7ZysrKWVbZ109ZVtnLTFdLGVbZ10rPWNbZy0xXS5kaXN0YW5jZVRvKGNbZ10pO3JldHVybiB0aGlzfSxyYXljYXN0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5saW5lUHJlY2lzaW9uLApnPXRoaXMuZ2VvbWV0cnkscj10aGlzLm1hdHJpeFdvcmxkO251bGw9PT1nLmJvdW5kaW5nU3BoZXJlJiZnLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO29nLmNvcHkoZy5ib3VuZGluZ1NwaGVyZSk7b2cuYXBwbHlNYXRyaXg0KHIpO29nLnJhZGl1cys9ZTtpZighMSE9PWEucmF5LmludGVyc2VjdHNTcGhlcmUob2cpKXtxay5nZXRJbnZlcnNlKHIpO3RoLmNvcHkoYS5yYXkpLmFwcGx5TWF0cml4NChxayk7ZS89KHRoaXMuc2NhbGUueCt0aGlzLnNjYWxlLnkrdGhpcy5zY2FsZS56KS8zO2UqPWU7dmFyIHY9bmV3IGssej1uZXcgaztyPW5ldyBrO3ZhciBFPW5ldyBrLEY9dGhpcyYmdGhpcy5pc0xpbmVTZWdtZW50cz8yOjE7aWYoZy5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgSj1nLmluZGV4LFA9Zy5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O2lmKG51bGwhPT1KKXtKPUouYXJyYXk7Zz0wO2Zvcih2YXIgUj1KLmxlbmd0aC0xO2c8UjtnKz1GKXt2YXIgUz1KW2crMV07di5mcm9tQXJyYXkoUCwKMypKW2ddKTt6LmZyb21BcnJheShQLDMqUyk7Uz10aC5kaXN0YW5jZVNxVG9TZWdtZW50KHYseixFLHIpO1M+ZXx8KEUuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLFM9YS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oRSksUzxhLm5lYXJ8fFM+YS5mYXJ8fGMucHVzaCh7ZGlzdGFuY2U6Uyxwb2ludDpyLmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4OmcsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfX1lbHNlIGZvcihnPTAsUj1QLmxlbmd0aC8zLTE7ZzxSO2crPUYpdi5mcm9tQXJyYXkoUCwzKmcpLHouZnJvbUFycmF5KFAsMypnKzMpLFM9dGguZGlzdGFuY2VTcVRvU2VnbWVudCh2LHosRSxyKSxTPmV8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxTPWEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFM8YS5uZWFyfHxTPmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOlMscG9pbnQ6ci5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSwKaW5kZXg6ZyxmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsb2JqZWN0OnRoaXN9KSl9ZWxzZSBpZihnLmlzR2VvbWV0cnkpZm9yKHY9Zy52ZXJ0aWNlcyx6PXYubGVuZ3RoLGc9MDtnPHotMTtnKz1GKVM9dGguZGlzdGFuY2VTcVRvU2VnbWVudCh2W2ddLHZbZysxXSxFLHIpLFM+ZXx8KEUuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLFM9YS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oRSksUzxhLm5lYXJ8fFM+YS5mYXJ8fGMucHVzaCh7ZGlzdGFuY2U6Uyxwb2ludDpyLmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4OmcsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTt2YXIgdWg9bmV3IGssdmg9bmV3IGs7SWIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6SWIsaXNMaW5lU2VnbWVudHM6ITAsY29tcHV0ZUxpbmVEaXN0YW5jZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdlb21ldHJ5O2lmKGEuaXNCdWZmZXJHZW9tZXRyeSlpZihudWxsPT09YS5pbmRleCl7Zm9yKHZhciBjPWEuYXR0cmlidXRlcy5wb3NpdGlvbixlPVtdLGc9MCxyPWMuY291bnQ7ZzxyO2crPTIpdWguZnJvbUJ1ZmZlckF0dHJpYnV0ZShjLGcpLHZoLmZyb21CdWZmZXJBdHRyaWJ1dGUoYyxnKzEpLGVbZ109MD09PWc/MDplW2ctMV0sZVtnKzFdPWVbZ10rdWguZGlzdGFuY2VUbyh2aCk7YS5hZGRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGNhKGUsMSkpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5MaW5lU2VnbWVudHMuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LiIpO2Vsc2UgaWYoYS5pc0dlb21ldHJ5KWZvcihjPWEudmVydGljZXMsZT0KYS5saW5lRGlzdGFuY2VzLGc9MCxyPWMubGVuZ3RoO2c8cjtnKz0yKXVoLmNvcHkoY1tnXSksdmguY29weShjW2crMV0pLGVbZ109MD09PWc/MDplW2ctMV0sZVtnKzFdPWVbZ10rdWguZGlzdGFuY2VUbyh2aCk7cmV0dXJuIHRoaXN9fSk7RGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpEZyxpc0xpbmVMb29wOiEwfSk7QWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO0FjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BYztBYy5wcm90b3R5cGUuaXNQb2ludHNNYXRlcmlhbD0hMDtBYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXA9YS5tYXA7dGhpcy5zaXplPWEuc2l6ZTt0aGlzLnNpemVBdHRlbnVhdGlvbj1hLnNpemVBdHRlbnVhdGlvbjt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czsKcmV0dXJuIHRoaXN9O3ZhciByaz1uZXcgcSxXaD1uZXcgRCxwZz1uZXcgRyx3aD1uZXcgaztDZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6Q2UsaXNQb2ludHM6ITAscmF5Y2FzdDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZ2VvbWV0cnksZz10aGlzLm1hdHJpeFdvcmxkLHI9YS5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZDtudWxsPT09ZS5ib3VuZGluZ1NwaGVyZSYmZS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtwZy5jb3B5KGUuYm91bmRpbmdTcGhlcmUpO3BnLmFwcGx5TWF0cml4NChnKTtwZy5yYWRpdXMrPXI7aWYoITEhPT1hLnJheS5pbnRlcnNlY3RzU3BoZXJlKHBnKSlpZihyay5nZXRJbnZlcnNlKGcpLFdoLmNvcHkoYS5yYXkpLmFwcGx5TWF0cml4NChyayksci89KHRoaXMuc2NhbGUueCt0aGlzLnNjYWxlLnkrdGhpcy5zY2FsZS56KS8zLHIqPXIsZS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgdj1lLmluZGV4OwplPWUuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtpZihudWxsIT09dil7dmFyIHo9di5hcnJheTt2PTA7Zm9yKHZhciBFPXoubGVuZ3RoO3Y8RTt2Kyspe3ZhciBGPXpbdl07d2guZnJvbUFycmF5KGUsMypGKTtWaCh3aCxGLHIsZyxhLGMsdGhpcyl9fWVsc2UgZm9yKHY9MCx6PWUubGVuZ3RoLzM7djx6O3YrKyl3aC5mcm9tQXJyYXkoZSwzKnYpLFZoKHdoLHYscixnLGEsYyx0aGlzKX1lbHNlIGZvcihlPWUudmVydGljZXMsdj0wLHo9ZS5sZW5ndGg7djx6O3YrKylWaChlW3ZdLHYscixnLGEsYyx0aGlzKX0sdXBkYXRlTW9ycGhUYXJnZXRzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpe2E9YS5tb3JwaEF0dHJpYnV0ZXM7dmFyIGM9T2JqZWN0LmtleXMoYSk7aWYoMDxjLmxlbmd0aCl7dmFyIGU9YVtjWzBdXTtpZih2b2lkIDAhPT1lKWZvcih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT0Ke30sYT0wLGM9ZS5sZW5ndGg7YTxjO2ErKyl7dmFyIGc9ZVthXS5uYW1lfHxTdHJpbmcoYSk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKTt0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtnXT1hfX19ZWxzZSBhPWEubW9ycGhUYXJnZXRzLHZvaWQgMCE9PWEmJjA8YS5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlBvaW50cy51cGRhdGVNb3JwaFRhcmdldHMoKSBkb2VzIG5vdCBzdXBwb3J0IFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTtYaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WGgsaXNWaWRlb1RleHR1cmU6ITAsdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pbWFnZTthLnJlYWR5U3RhdGU+PQphLkhBVkVfQ1VSUkVOVF9EQVRBJiYodGhpcy5uZWVkc1VwZGF0ZT0hMCl9fSk7RGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0RlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EZTtEZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZT0hMDtDZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShsLnByb3RvdHlwZSk7Q2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPUNmO0NmLnByb3RvdHlwZS5pc0NhbnZhc1RleHR1cmU9ITA7RGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EZjtEZi5wcm90b3R5cGUuaXNEZXB0aFRleHR1cmU9ITA7RWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtFZS5wcm90b3R5cGUuY29uc3RydWN0b3I9RWU7RWYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtFZi5wcm90b3R5cGUuY29uc3RydWN0b3I9RWY7RmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTsKRmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZlO0ZmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7RmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZmO2pjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7amMucHJvdG90eXBlLmNvbnN0cnVjdG9yPWpjO0dmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7R2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdmO0dlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGpjLnByb3RvdHlwZSk7R2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdlO0hmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7SGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUhmO1JkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGpjLnByb3RvdHlwZSk7UmQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJkO0lmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7SWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpJZjtIZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShqYy5wcm90b3R5cGUpO0hlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1IZTtKZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO0pmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1KZjtJZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShqYy5wcm90b3R5cGUpO0llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1JZTtLZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO0tmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1LZjtTZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1NkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TZDtTZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9dmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EucGF0aD10aGlzLnBhcmFtZXRlcnMucGF0aC50b0pTT04oKTtyZXR1cm4gYX07TGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTsKTGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxmO0plLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7SmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPUplO01mLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7TWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPU1mO0tlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7S2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPUtlO3ZhciBKbT17dHJpYW5ndWxhdGU6ZnVuY3Rpb24oYSxjLGUpe2U9ZXx8Mjt2YXIgZz1jJiZjLmxlbmd0aCxyPWc/Y1swXSplOmEubGVuZ3RoLHY9R2ooYSwwLHIsZSwhMCksej1bXTtpZighdnx8di5uZXh0PT09di5wcmV2KXJldHVybiB6O2cmJih2PWRtKGEsYyx2LGUpKTtpZihhLmxlbmd0aD44MCplKXt2YXIgRT1jPWFbMF07dmFyIEY9Zz1hWzFdO2Zvcih2YXIgSj1lO0o8cjtKKz1lKXt2YXIgUD1hW0pdO3ZhciBSPWFbSisxXTtQPEUmJihFPVApO1I8RiYmKEY9Uik7ClA+YyYmKGM9UCk7Uj5nJiYoZz1SKX1QPU1hdGgubWF4KGMtRSxnLUYpO1A9MCE9PVA/MS9QOjB9UGYodix6LGUsRSxGLFApO3JldHVybiB6fX0sZWQ9e2FyZWE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWEubGVuZ3RoLGU9MCxnPWMtMSxyPTA7cjxjO2c9cisrKWUrPWFbZ10ueCphW3JdLnktYVtyXS54KmFbZ10ueTtyZXR1cm4uNSplfSxpc0Nsb2NrV2lzZTpmdW5jdGlvbihhKXtyZXR1cm4gMD5lZC5hcmVhKGEpfSx0cmlhbmd1bGF0ZVNoYXBlOmZ1bmN0aW9uKGEsYyl7dmFyIGU9W10sZz1bXSxyPVtdO0tqKGEpO0xqKGUsYSk7dmFyIHY9YS5sZW5ndGg7Yy5mb3JFYWNoKEtqKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKWcucHVzaCh2KSx2Kz1jW2FdLmxlbmd0aCxMaihlLGNbYV0pO2M9Sm0udHJpYW5ndWxhdGUoZSxnKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSs9MylyLnB1c2goYy5zbGljZShhLGErMykpO3JldHVybiByfX07VWQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTsKVWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVVkO1VkLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT15YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIE1qKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnMsYSl9O1JjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7UmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJjO1JjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT12YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIE1qKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnMsYSl9O3ZhciBsbT17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihhLGMsZSxnLHIpe2E9Y1szKmddO2c9Y1szKmcrMV07dmFyIHY9Y1szKnJdO3I9Y1szKnIrMV07cmV0dXJuW25ldyBmKGNbMyplXSxjWzMqZSsxXSksbmV3IGYoYSxnKSxuZXcgZih2LHIpXX0sZ2VuZXJhdGVTaWRlV2FsbFVWOmZ1bmN0aW9uKGEsCmMsZSxnLHIsdil7YT1jWzMqZV07dmFyIHo9Y1szKmUrMV07ZT1jWzMqZSsyXTt2YXIgRT1jWzMqZ10sRj1jWzMqZysxXTtnPWNbMypnKzJdO3ZhciBKPWNbMypyXSxQPWNbMypyKzFdO3I9Y1szKnIrMl07dmFyIFI9Y1szKnZdLFM9Y1szKnYrMV07Yz1jWzMqdisyXTtyZXR1cm4uMDE+TWF0aC5hYnMoei1GKT9bbmV3IGYoYSwxLWUpLG5ldyBmKEUsMS1nKSxuZXcgZihKLDEtciksbmV3IGYoUiwxLWMpXTpbbmV3IGYoeiwxLWUpLG5ldyBmKEYsMS1nKSxuZXcgZihQLDEtciksbmV3IGYoUywxLWMpXX19O1JmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7UmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJmO01lLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFJjLnByb3RvdHlwZSk7TWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPU1lO1NmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7U2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNmO0JkLnByb3RvdHlwZT0KT2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO0JkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1CZDtUZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UZjtOZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO05lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1OZTtVZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1VmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VZjtPZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO09lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1PZTtWZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1ZkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1WZDtWZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9eWEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBOaih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLAphKX07V2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtXZC5wcm90b3R5cGUuY29uc3RydWN0b3I9V2Q7V2QucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPXZhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtyZXR1cm4gTmoodGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxhKX07UGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtQZS5wcm90b3R5cGUuY29uc3RydWN0b3I9UGU7WGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtYZC5wcm90b3R5cGUuY29uc3RydWN0b3I9WGQ7ZmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtmZC5wcm90b3R5cGUuY29uc3RydWN0b3I9ZmQ7VmYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWGQucHJvdG90eXBlKTtWZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VmY7V2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZmQucHJvdG90eXBlKTtXZi5wcm90b3R5cGUuY29uc3RydWN0b3I9CldmO1hmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7WGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhmO1FlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7UWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVFlO3ZhciBnYz1PYmplY3QuZnJlZXplKHtXaXJlZnJhbWVHZW9tZXRyeTpFZSxQYXJhbWV0cmljR2VvbWV0cnk6RWYsUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5OkZlLFRldHJhaGVkcm9uR2VvbWV0cnk6R2YsVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTpHZSxPY3RhaGVkcm9uR2VvbWV0cnk6SGYsT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5OlJkLEljb3NhaGVkcm9uR2VvbWV0cnk6SWYsSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTpIZSxEb2RlY2FoZWRyb25HZW9tZXRyeTpKZixEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTpJZSxQb2x5aGVkcm9uR2VvbWV0cnk6RmYsUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OmpjLFR1YmVHZW9tZXRyeTpLZiwKVHViZUJ1ZmZlckdlb21ldHJ5OlNkLFRvcnVzS25vdEdlb21ldHJ5OkxmLFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5OkplLFRvcnVzR2VvbWV0cnk6TWYsVG9ydXNCdWZmZXJHZW9tZXRyeTpLZSxUZXh0R2VvbWV0cnk6UmYsVGV4dEJ1ZmZlckdlb21ldHJ5Ok1lLFNwaGVyZUdlb21ldHJ5OlNmLFNwaGVyZUJ1ZmZlckdlb21ldHJ5OkJkLFJpbmdHZW9tZXRyeTpUZixSaW5nQnVmZmVyR2VvbWV0cnk6TmUsUGxhbmVHZW9tZXRyeTpyZCxQbGFuZUJ1ZmZlckdlb21ldHJ5OkxjLExhdGhlR2VvbWV0cnk6VWYsTGF0aGVCdWZmZXJHZW9tZXRyeTpPZSxTaGFwZUdlb21ldHJ5OlZkLFNoYXBlQnVmZmVyR2VvbWV0cnk6V2QsRXh0cnVkZUdlb21ldHJ5OlVkLEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTpSYyxFZGdlc0dlb21ldHJ5OlBlLENvbmVHZW9tZXRyeTpWZixDb25lQnVmZmVyR2VvbWV0cnk6V2YsQ3lsaW5kZXJHZW9tZXRyeTpYZCxDeWxpbmRlckJ1ZmZlckdlb21ldHJ5OmZkLENpcmNsZUdlb21ldHJ5OlhmLApDaXJjbGVCdWZmZXJHZW9tZXRyeTpRZSxCb3hHZW9tZXRyeTpTYSxCb3hCdWZmZXJHZW9tZXRyeTpYYX0pO1lkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtZZC5wcm90b3R5cGUuY29uc3RydWN0b3I9WWQ7WWQucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWw9ITA7WWQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3JldHVybiB0aGlzfTtSZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShxYi5wcm90b3R5cGUpO1JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SZTtSZS5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbD0hMDtTYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7U2MucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNjO1NjLnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPSEwO1NjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphKTt0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5yb3VnaG5lc3M9YS5yb3VnaG5lc3M7dGhpcy5tZXRhbG5lc3M9YS5tZXRhbG5lc3M7dGhpcy5tYXA9YS5tYXA7dGhpcy5saWdodE1hcD1hLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9YS5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWEuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShhLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWEuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT1hLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7CnRoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMucm91Z2huZXNzTWFwPWEucm91Z2huZXNzTWFwO3RoaXMubWV0YWxuZXNzTWFwPWEubWV0YWxuZXNzTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD1hLmVudk1hcDt0aGlzLmVudk1hcEludGVuc2l0eT1hLmVudk1hcEludGVuc2l0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1hLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9CmEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTtaZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTYy5wcm90b3R5cGUpO1pkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aZDtaZC5wcm90b3R5cGUuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD0hMDtaZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn07dGhpcy5yZWZsZWN0aXZpdHk9YS5yZWZsZWN0aXZpdHk7dGhpcy5jbGVhcmNvYXQ9YS5jbGVhcmNvYXQ7dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9YS5jbGVhcmNvYXRSb3VnaG5lc3M7dGhpcy5zaGVlbj1hLnNoZWVuPyh0aGlzLnNoZWVufHxuZXcgSSkuY29weShhLnNoZWVuKTpudWxsO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPWEuY2xlYXJjb2F0Tm9ybWFsTWFwO3RoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUuY29weShhLmNsZWFyY29hdE5vcm1hbFNjYWxlKTsKdGhpcy50cmFuc3BhcmVuY3k9YS50cmFuc3BhcmVuY3k7cmV0dXJuIHRoaXN9O0JjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtCYy5wcm90b3R5cGUuY29uc3RydWN0b3I9QmM7QmMucHJvdG90eXBlLmlzTWVzaFBob25nTWF0ZXJpYWw9ITA7QmMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMuc3BlY3VsYXIuY29weShhLnNwZWN1bGFyKTt0aGlzLnNoaW5pbmVzcz1hLnNoaW5pbmVzczt0aGlzLm1hcD1hLm1hcDt0aGlzLmxpZ2h0TWFwPWEubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9YS5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHk7dGhpcy5lbWlzc2l2ZS5jb3B5KGEuZW1pc3NpdmUpO3RoaXMuZW1pc3NpdmVNYXA9YS5lbWlzc2l2ZU1hcDt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PQphLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy5zcGVjdWxhck1hcD1hLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD1hLmVudk1hcDt0aGlzLmNvbWJpbmU9YS5jb21iaW5lO3RoaXMucmVmbGVjdGl2aXR5PWEucmVmbGVjdGl2aXR5O3RoaXMucmVmcmFjdGlvblJhdGlvPWEucmVmcmFjdGlvblJhdGlvO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPQphLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9OyRkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEJjLnByb3RvdHlwZSk7JGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRkOyRkLnByb3RvdHlwZS5pc01lc2hUb29uTWF0ZXJpYWw9ITA7JGQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7QmMucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZ3JhZGllbnRNYXA9YS5ncmFkaWVudE1hcDtyZXR1cm4gdGhpc307YWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO2FlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hZTthZS5wcm90b3R5cGUuaXNNZXNoTm9ybWFsTWF0ZXJpYWw9CiEwO2FlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTsKYmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO2JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iZTtiZS5wcm90b3R5cGUuaXNNZXNoTGFtYmVydE1hdGVyaWFsPSEwO2JlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hcD1hLm1hcDt0aGlzLmxpZ2h0TWFwPWEubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9YS5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHk7dGhpcy5lbWlzc2l2ZS5jb3B5KGEuZW1pc3NpdmUpO3RoaXMuZW1pc3NpdmVNYXA9YS5lbWlzc2l2ZU1hcDt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PWEuZW1pc3NpdmVJbnRlbnNpdHk7dGhpcy5zcGVjdWxhck1hcD1hLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD0KYS5lbnZNYXA7dGhpcy5jb21iaW5lPWEuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1hLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9O2NlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtjZS5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2U7Y2UucHJvdG90eXBlLmlzTWVzaE1hdGNhcE1hdGVyaWFsPSEwO2NlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphKTt0aGlzLmRlZmluZXM9e01BVENBUDoiIn07dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubWF0Y2FwPWEubWF0Y2FwO3RoaXMubWFwPWEubWFwO3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy5hbHBoYU1hcD1hLmFscGhhTWFwO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307ZGUucHJvdG90eXBlPQpPYmplY3QuY3JlYXRlKEZiLnByb3RvdHlwZSk7ZGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRlO2RlLnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbD0hMDtkZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtGYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5zY2FsZT1hLnNjYWxlO3RoaXMuZGFzaFNpemU9YS5kYXNoU2l6ZTt0aGlzLmdhcFNpemU9YS5nYXBTaXplO3JldHVybiB0aGlzfTt2YXIgS209T2JqZWN0LmZyZWV6ZSh7U2hhZG93TWF0ZXJpYWw6WWQsU3ByaXRlTWF0ZXJpYWw6QWQsUmF3U2hhZGVyTWF0ZXJpYWw6UmUsU2hhZGVyTWF0ZXJpYWw6cWIsUG9pbnRzTWF0ZXJpYWw6QWMsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6WmQsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6U2MsTWVzaFBob25nTWF0ZXJpYWw6QmMsTWVzaFRvb25NYXRlcmlhbDokZCxNZXNoTm9ybWFsTWF0ZXJpYWw6YWUsTWVzaExhbWJlcnRNYXRlcmlhbDpiZSxNZXNoRGVwdGhNYXRlcmlhbDp2ZCwKTWVzaERpc3RhbmNlTWF0ZXJpYWw6d2QsTWVzaEJhc2ljTWF0ZXJpYWw6TCxNZXNoTWF0Y2FwTWF0ZXJpYWw6Y2UsTGluZURhc2hlZE1hdGVyaWFsOmRlLExpbmVCYXNpY01hdGVyaWFsOkZiLE1hdGVyaWFsOk19KSxUYj17YXJyYXlTbGljZTpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIFRiLmlzVHlwZWRBcnJheShhKT9uZXcgYS5jb25zdHJ1Y3RvcihhLnN1YmFycmF5KGMsdm9pZCAwIT09ZT9lOmEubGVuZ3RoKSk6YS5zbGljZShjLGUpfSxjb252ZXJ0QXJyYXk6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiFhfHwhZSYmYS5jb25zdHJ1Y3Rvcj09PWM/YToibnVtYmVyIj09PXR5cGVvZiBjLkJZVEVTX1BFUl9FTEVNRU5UP25ldyBjKGEpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpfSxpc1R5cGVkQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhKSYmIShhIGluc3RhbmNlb2YgRGF0YVZpZXcpfSxnZXRLZXlmcmFtZU9yZGVyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0KYS5sZW5ndGgsZT1BcnJheShjKSxnPTA7ZyE9PWM7KytnKWVbZ109ZztlLnNvcnQoZnVuY3Rpb24ocix2KXtyZXR1cm4gYVtyXS1hW3ZdfSk7cmV0dXJuIGV9LHNvcnRlZEFycmF5OmZ1bmN0aW9uKGEsYyxlKXtmb3IodmFyIGc9YS5sZW5ndGgscj1uZXcgYS5jb25zdHJ1Y3RvcihnKSx2PTAsej0wO3ohPT1nOysrdilmb3IodmFyIEU9ZVt2XSpjLEY9MDtGIT09YzsrK0Ypclt6KytdPWFbRStGXTtyZXR1cm4gcn0sZmxhdHRlbkpTT046ZnVuY3Rpb24oYSxjLGUsZyl7Zm9yKHZhciByPTEsdj1hWzBdO3ZvaWQgMCE9PXYmJnZvaWQgMD09PXZbZ107KXY9YVtyKytdO2lmKHZvaWQgMCE9PXYpe3ZhciB6PXZbZ107aWYodm9pZCAwIT09eilpZihBcnJheS5pc0FycmF5KHopKXtkbyB6PXZbZ10sdm9pZCAwIT09eiYmKGMucHVzaCh2LnRpbWUpLGUucHVzaC5hcHBseShlLHopKSx2PWFbcisrXTt3aGlsZSh2b2lkIDAhPT12KX1lbHNlIGlmKHZvaWQgMCE9PXoudG9BcnJheSl7ZG8gej12W2ddLAp2b2lkIDAhPT16JiYoYy5wdXNoKHYudGltZSksei50b0FycmF5KGUsZS5sZW5ndGgpKSx2PWFbcisrXTt3aGlsZSh2b2lkIDAhPT12KX1lbHNle2RvIHo9dltnXSx2b2lkIDAhPT16JiYoYy5wdXNoKHYudGltZSksZS5wdXNoKHopKSx2PWFbcisrXTt3aGlsZSh2b2lkIDAhPT12KX19fX07T2JqZWN0LmFzc2lnbihvYy5wcm90b3R5cGUse2V2YWx1YXRlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zLGU9dGhpcy5fY2FjaGVkSW5kZXgsZz1jW2VdLHI9Y1tlLTFdO2E6e2I6e2M6e2Q6aWYoIShhPGcpKXtmb3IodmFyIHY9ZSsyOzspe2lmKHZvaWQgMD09PWcpe2lmKGE8cilicmVhayBkO3RoaXMuX2NhY2hlZEluZGV4PWU9Yy5sZW5ndGg7cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKGUtMSxhLHIpfWlmKGU9PT12KWJyZWFrO3I9ZztnPWNbKytlXTtpZihhPGcpYnJlYWsgYn1nPWMubGVuZ3RoO2JyZWFrIGN9aWYoYT49cilicmVhayBhO2Vsc2V7dj1jWzFdO2E8diYmCihlPTIscj12KTtmb3Iodj1lLTI7Oyl7aWYodm9pZCAwPT09cilyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmJlZm9yZVN0YXJ0XygwLGEsZyk7aWYoZT09PXYpYnJlYWs7Zz1yO3I9Y1stLWUtMV07aWYoYT49cilicmVhayBifWc9ZTtlPTB9fWZvcig7ZTxnOylyPWUrZz4+PjEsYTxjW3JdP2c9cjplPXIrMTtnPWNbZV07cj1jW2UtMV07aWYodm9pZCAwPT09cilyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmJlZm9yZVN0YXJ0XygwLGEsZyk7aWYodm9pZCAwPT09ZylyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9ZT1jLmxlbmd0aCx0aGlzLmFmdGVyRW5kXyhlLTEscixhKX10aGlzLl9jYWNoZWRJbmRleD1lO3RoaXMuaW50ZXJ2YWxDaGFuZ2VkXyhlLHIsZyl9cmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKGUscixhLGcpfSxzZXR0aW5nczpudWxsLERlZmF1bHRTZXR0aW5nc186e30sZ2V0U2V0dGluZ3NfOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0dGluZ3N8fAp0aGlzLkRlZmF1bHRTZXR0aW5nc199LGNvcHlTYW1wbGVWYWx1ZV86ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5yZXN1bHRCdWZmZXIsZT10aGlzLnNhbXBsZVZhbHVlcyxnPXRoaXMudmFsdWVTaXplO2EqPWc7Zm9yKHZhciByPTA7ciE9PWc7KytyKWNbcl09ZVthK3JdO3JldHVybiBjfSxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiY2FsbCB0byBhYnN0cmFjdCBtZXRob2QiKTt9LGludGVydmFsQ2hhbmdlZF86ZnVuY3Rpb24oKXt9fSk7T2JqZWN0LmFzc2lnbihvYy5wcm90b3R5cGUse2JlZm9yZVN0YXJ0XzpvYy5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxhZnRlckVuZF86b2MucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV99KTtFZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkVnLERlZmF1bHRTZXR0aW5nc186e2VuZGluZ1N0YXJ0OjI0MDAsZW5kaW5nRW5kOjI0MDB9LGludGVydmFsQ2hhbmdlZF86ZnVuY3Rpb24oYSwKYyxlKXt2YXIgZz10aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxyPWEtMix2PWErMSx6PWdbcl0sRT1nW3ZdO2lmKHZvaWQgMD09PXopc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQpe2Nhc2UgMjQwMTpyPWE7ej0yKmMtZTticmVhaztjYXNlIDI0MDI6cj1nLmxlbmd0aC0yO3o9YytnW3JdLWdbcisxXTticmVhaztkZWZhdWx0OnI9YSx6PWV9aWYodm9pZCAwPT09RSlzd2l0Y2godGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQpe2Nhc2UgMjQwMTp2PWE7RT0yKmUtYzticmVhaztjYXNlIDI0MDI6dj0xO0U9ZStnWzFdLWdbMF07YnJlYWs7ZGVmYXVsdDp2PWEtMSxFPWN9YT0uNSooZS1jKTtnPXRoaXMudmFsdWVTaXplO3RoaXMuX3dlaWdodFByZXY9YS8oYy16KTt0aGlzLl93ZWlnaHROZXh0PWEvKEUtZSk7dGhpcy5fb2Zmc2V0UHJldj1yKmc7dGhpcy5fb2Zmc2V0TmV4dD12Kmd9LGludGVycG9sYXRlXzpmdW5jdGlvbihhLGMsZSxnKXt2YXIgcj10aGlzLnJlc3VsdEJ1ZmZlciwKdj10aGlzLnNhbXBsZVZhbHVlcyx6PXRoaXMudmFsdWVTaXplO2EqPXo7dmFyIEU9YS16LEY9dGhpcy5fb2Zmc2V0UHJldixKPXRoaXMuX29mZnNldE5leHQsUD10aGlzLl93ZWlnaHRQcmV2LFI9dGhpcy5fd2VpZ2h0TmV4dCxTPShlLWMpLyhnLWMpO2U9UypTO2c9ZSpTO2M9LVAqZysyKlAqZS1QKlM7UD0oMStQKSpnKygtMS41LTIqUCkqZSsoLS41K1ApKlMrMTtTPSgtMS1SKSpnKygxLjUrUikqZSsuNSpTO1I9UipnLVIqZTtmb3IoZT0wO2UhPT16OysrZSlyW2VdPWMqdltGK2VdK1AqdltFK2VdK1MqdlthK2VdK1IqdltKK2VdO3JldHVybiByfX0pO1lmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUob2MucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WWYsaW50ZXJwb2xhdGVfOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMucmVzdWx0QnVmZmVyLHY9dGhpcy5zYW1wbGVWYWx1ZXMsej10aGlzLnZhbHVlU2l6ZTthKj16O3ZhciBFPWEtejtjPShlLWMpLyhnLQpjKTtlPTEtYztmb3IoZz0wO2chPT16OysrZylyW2ddPXZbRStnXSplK3ZbYStnXSpjO3JldHVybiByfX0pO0ZnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUob2MucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6RmcsaW50ZXJwb2xhdGVfOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oYS0xKX19KTtPYmplY3QuYXNzaWduKFhiLHt0b0pTT046ZnVuY3Rpb24oYSl7dmFyIGM9YS5jb25zdHJ1Y3RvcjtpZih2b2lkIDAhPT1jLnRvSlNPTiljPWMudG9KU09OKGEpO2Vsc2V7Yz17bmFtZTphLm5hbWUsdGltZXM6VGIuY29udmVydEFycmF5KGEudGltZXMsQXJyYXkpLHZhbHVlczpUYi5jb252ZXJ0QXJyYXkoYS52YWx1ZXMsQXJyYXkpfTt2YXIgZT1hLmdldEludGVycG9sYXRpb24oKTtlIT09YS5EZWZhdWx0SW50ZXJwb2xhdGlvbiYmKGMuaW50ZXJwb2xhdGlvbj1lKX1jLnR5cGU9YS5WYWx1ZVR5cGVOYW1lO3JldHVybiBjfX0pO09iamVjdC5hc3NpZ24oWGIucHJvdG90eXBlLAp7Y29uc3RydWN0b3I6WGIsVGltZUJ1ZmZlclR5cGU6RmxvYXQzMkFycmF5LFZhbHVlQnVmZmVyVHlwZTpGbG9hdDMyQXJyYXksRGVmYXVsdEludGVycG9sYXRpb246MjMwMSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEZnKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxhKX0sSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgWWYodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGEpfSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBFZyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYSl9LHNldEludGVycG9sYXRpb246ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgMjMwMDp2YXIgYz10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOwpicmVhaztjYXNlIDIzMDE6Yz10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjticmVhaztjYXNlIDIzMDI6Yz10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aH1pZih2b2lkIDA9PT1jKXtjPSJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiK3RoaXMuVmFsdWVUeXBlTmFtZSsiIGtleWZyYW1lIHRyYWNrIG5hbWVkICIrdGhpcy5uYW1lO2lmKHZvaWQgMD09PXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpaWYoYSE9PXRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pdGhpcy5zZXRJbnRlcnBvbGF0aW9uKHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pO2Vsc2UgdGhyb3cgRXJyb3IoYyk7Y29uc29sZS53YXJuKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiIsYyk7cmV0dXJuIHRoaXN9dGhpcy5jcmVhdGVJbnRlcnBvbGFudD1jO3JldHVybiB0aGlzfSxnZXRJbnRlcnBvbGF0aW9uOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpe2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpyZXR1cm4gMjMwMDsKY2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpyZXR1cm4gMjMwMTtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnJldHVybiAyMzAyfX0sZ2V0VmFsdWVTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aC90aGlzLnRpbWVzLmxlbmd0aH0sc2hpZnQ6ZnVuY3Rpb24oYSl7aWYoMCE9PWEpZm9yKHZhciBjPXRoaXMudGltZXMsZT0wLGc9Yy5sZW5ndGg7ZSE9PWc7KytlKWNbZV0rPWE7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEpe2lmKDEhPT1hKWZvcih2YXIgYz10aGlzLnRpbWVzLGU9MCxnPWMubGVuZ3RoO2UhPT1nOysrZSljW2VdKj1hO3JldHVybiB0aGlzfSx0cmltOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPXRoaXMudGltZXMsZz1lLmxlbmd0aCxyPTAsdj1nLTE7ciE9PWcmJmVbcl08YTspKytyO2Zvcig7LTEhPT12JiZlW3ZdPmM7KS0tdjsrK3Y7aWYoMCE9PXJ8fHYhPT1nKXI+PXYmJih2PU1hdGgubWF4KHYsCjEpLHI9di0xKSxhPXRoaXMuZ2V0VmFsdWVTaXplKCksdGhpcy50aW1lcz1UYi5hcnJheVNsaWNlKGUscix2KSx0aGlzLnZhbHVlcz1UYi5hcnJheVNsaWNlKHRoaXMudmFsdWVzLHIqYSx2KmEpO3JldHVybiB0aGlzfSx2YWxpZGF0ZTpmdW5jdGlvbigpe3ZhciBhPSEwLGM9dGhpcy5nZXRWYWx1ZVNpemUoKTswIT09Yy1NYXRoLmZsb29yKGMpJiYoY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogSW52YWxpZCB2YWx1ZSBzaXplIGluIHRyYWNrLiIsdGhpcyksYT0hMSk7dmFyIGU9dGhpcy50aW1lcztjPXRoaXMudmFsdWVzO3ZhciBnPWUubGVuZ3RoOzA9PT1nJiYoY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuIix0aGlzKSxhPSExKTtmb3IodmFyIHI9bnVsbCx2PTA7diE9PWc7disrKXt2YXIgej1lW3ZdO2lmKCJudW1iZXIiPT09dHlwZW9mIHomJmlzTmFOKHopKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUaW1lIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLAp0aGlzLHYseik7YT0hMTticmVha31pZihudWxsIT09ciYmcj56KXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4iLHRoaXMsdix6LHIpO2E9ITE7YnJlYWt9cj16fWlmKHZvaWQgMCE9PWMmJlRiLmlzVHlwZWRBcnJheShjKSlmb3Iodj0wLGU9Yy5sZW5ndGg7diE9PWU7Kyt2KWlmKGc9Y1t2XSxpc05hTihnKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyx2LGcpO2E9ITE7YnJlYWt9cmV0dXJuIGF9LG9wdGltaXplOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudGltZXMsYz10aGlzLnZhbHVlcyxlPXRoaXMuZ2V0VmFsdWVTaXplKCksZz0yMzAyPT09dGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkscj0xLHY9YS5sZW5ndGgtMSx6PTE7ejx2Oysreil7dmFyIEU9ITEsRj1hW3pdO2lmKEYhPT1hW3orMV0mJigxIT09enx8RiE9PUZbMF0pKWlmKGcpRT0hMDsKZWxzZXt2YXIgSj16KmUsUD1KLWUsUj1KK2U7Zm9yKEY9MDtGIT09ZTsrK0Ype3ZhciBTPWNbSitGXTtpZihTIT09Y1tQK0ZdfHxTIT09Y1tSK0ZdKXtFPSEwO2JyZWFrfX19aWYoRSl7aWYoeiE9PXIpZm9yKGFbcl09YVt6XSxFPXoqZSxKPXIqZSxGPTA7RiE9PWU7KytGKWNbSitGXT1jW0UrRl07KytyfX1pZigwPHYpe2Fbcl09YVt2XTtFPXYqZTtKPXIqZTtmb3IoRj0wO0YhPT1lOysrRiljW0orRl09Y1tFK0ZdOysrcn1yIT09YS5sZW5ndGgmJih0aGlzLnRpbWVzPVRiLmFycmF5U2xpY2UoYSwwLHIpLHRoaXMudmFsdWVzPVRiLmFycmF5U2xpY2UoYywwLHIqZSkpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBhPVRiLmFycmF5U2xpY2UodGhpcy50aW1lcywwKSxjPVRiLmFycmF5U2xpY2UodGhpcy52YWx1ZXMsMCk7YT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLm5hbWUsYSxjKTthLmNyZWF0ZUludGVycG9sYW50PXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ7cmV0dXJuIGF9fSk7CkdnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6R2csVmFsdWVUeXBlTmFtZToiYm9vbCIsVmFsdWVCdWZmZXJUeXBlOkFycmF5LERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOnZvaWQgMCxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6dm9pZCAwfSk7SGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShYYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpIZyxWYWx1ZVR5cGVOYW1lOiJjb2xvciJ9KTtTZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlNlLFZhbHVlVHlwZU5hbWU6Im51bWJlciJ9KTtJZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOklnLGludGVycG9sYXRlXzpmdW5jdGlvbihhLApjLGUsZyl7dmFyIHI9dGhpcy5yZXN1bHRCdWZmZXIsdj10aGlzLnNhbXBsZVZhbHVlcyx6PXRoaXMudmFsdWVTaXplO2EqPXo7Yz0oZS1jKS8oZy1jKTtmb3IoZT1hK3o7YSE9PWU7YSs9NCloLnNsZXJwRmxhdChyLDAsdixhLXosdixhLGMpO3JldHVybiByfX0pO1pmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WmYsVmFsdWVUeXBlTmFtZToicXVhdGVybmlvbiIsRGVmYXVsdEludGVycG9sYXRpb246MjMwMSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBJZyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYSl9LEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDp2b2lkIDB9KTtKZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkpnLFZhbHVlVHlwZU5hbWU6InN0cmluZyIsClZhbHVlQnVmZmVyVHlwZTpBcnJheSxEZWZhdWx0SW50ZXJwb2xhdGlvbjoyMzAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjp2b2lkIDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnZvaWQgMH0pO1RlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VGUsVmFsdWVUeXBlTmFtZToidmVjdG9yIn0pO09iamVjdC5hc3NpZ24odGMse3BhcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPWEudHJhY2tzLGc9MS8oYS5mcHN8fDEpLHI9MCx2PWUubGVuZ3RoO3IhPT12OysrciljLnB1c2gobm0oZVtyXSkuc2NhbGUoZykpO3JldHVybiBuZXcgdGMoYS5uYW1lLGEuZHVyYXRpb24sYyl9LHRvSlNPTjpmdW5jdGlvbihhKXt2YXIgYz1bXSxlPWEudHJhY2tzO2E9e25hbWU6YS5uYW1lLGR1cmF0aW9uOmEuZHVyYXRpb24sdHJhY2tzOmMsdXVpZDphLnV1aWR9O2Zvcih2YXIgZz0wLHI9ZS5sZW5ndGg7ZyE9PQpyOysrZyljLnB1c2goWGIudG9KU09OKGVbZ10pKTtyZXR1cm4gYX0sQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2U6ZnVuY3Rpb24oYSxjLGUsZyl7Zm9yKHZhciByPWMubGVuZ3RoLHY9W10sej0wO3o8cjt6Kyspe3ZhciBFPVtdLEY9W107RS5wdXNoKCh6K3ItMSklcix6LCh6KzEpJXIpO0YucHVzaCgwLDEsMCk7dmFyIEo9VGIuZ2V0S2V5ZnJhbWVPcmRlcihFKTtFPVRiLnNvcnRlZEFycmF5KEUsMSxKKTtGPVRiLnNvcnRlZEFycmF5KEYsMSxKKTtnfHwwIT09RVswXXx8KEUucHVzaChyKSxGLnB1c2goRlswXSkpO3YucHVzaCgobmV3IFNlKCIubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyIrY1t6XS5uYW1lKyJdIixFLEYpKS5zY2FsZSgxL2UpKX1yZXR1cm4gbmV3IHRjKGEsLTEsdil9LGZpbmRCeU5hbWU6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hO0FycmF5LmlzQXJyYXkoYSl8fChlPWEuZ2VvbWV0cnkmJmEuZ2VvbWV0cnkuYW5pbWF0aW9uc3x8YS5hbmltYXRpb25zKTtmb3IoYT0KMDthPGUubGVuZ3RoO2ErKylpZihlW2FdLm5hbWU9PT1jKXJldHVybiBlW2FdO3JldHVybiBudWxsfSxDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlczpmdW5jdGlvbihhLGMsZSl7Zm9yKHZhciBnPXt9LHI9L14oW1x3LV0qPykoW1xkXSspJC8sdj0wLHo9YS5sZW5ndGg7djx6O3YrKyl7dmFyIEU9YVt2XSxGPUUubmFtZS5tYXRjaChyKTtpZihGJiYxPEYubGVuZ3RoKXt2YXIgSj1GWzFdOyhGPWdbSl0pfHwoZ1tKXT1GPVtdKTtGLnB1c2goRSl9fWE9W107Zm9yKEogaW4gZylhLnB1c2godGMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoSixnW0pdLGMsZSkpO3JldHVybiBhfSxwYXJzZUFuaW1hdGlvbjpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoaGEsZmEscmEscGEscWEpe2lmKDAhPT1yYS5sZW5ndGgpe3ZhciB1YT1bXSxvYT1bXTtUYi5mbGF0dGVuSlNPTihyYSx1YSxvYSxwYSk7MCE9PXVhLmxlbmd0aCYmcWEucHVzaChuZXcgaGEoZmEsdWEsb2EpKX19CmlmKCFhKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLiIpLG51bGw7dmFyIGc9W10scj1hLm5hbWV8fCJkZWZhdWx0Iix2PWEubGVuZ3RofHwtMSx6PWEuZnBzfHwzMDthPWEuaGllcmFyY2h5fHxbXTtmb3IodmFyIEU9MDtFPGEubGVuZ3RoO0UrKyl7dmFyIEY9YVtFXS5rZXlzO2lmKEYmJjAhPT1GLmxlbmd0aClpZihGWzBdLm1vcnBoVGFyZ2V0cyl7dj17fTtmb3IodmFyIEo9MDtKPEYubGVuZ3RoO0orKylpZihGW0pdLm1vcnBoVGFyZ2V0cylmb3IodmFyIFA9MDtQPEZbSl0ubW9ycGhUYXJnZXRzLmxlbmd0aDtQKyspdltGW0pdLm1vcnBoVGFyZ2V0c1tQXV09LTE7Zm9yKHZhciBSIGluIHYpe3ZhciBTPVtdLFY9W107Zm9yKFA9MDtQIT09RltKXS5tb3JwaFRhcmdldHMubGVuZ3RoOysrUCl7dmFyIFc9RltKXTtTLnB1c2goVy50aW1lKTtWLnB1c2goVy5tb3JwaFRhcmdldD09PVI/MTowKX1nLnB1c2gobmV3IFNlKCIubW9ycGhUYXJnZXRJbmZsdWVuY2VbIisKUisiXSIsUyxWKSl9dj12Lmxlbmd0aCooenx8MSl9ZWxzZSBKPSIuYm9uZXNbIitjW0VdLm5hbWUrIl0iLGUoVGUsSisiLnBvc2l0aW9uIixGLCJwb3MiLGcpLGUoWmYsSisiLnF1YXRlcm5pb24iLEYsInJvdCIsZyksZShUZSxKKyIuc2NhbGUiLEYsInNjbCIsZyl9cmV0dXJuIDA9PT1nLmxlbmd0aD9udWxsOm5ldyB0YyhyLHYsZyl9fSk7T2JqZWN0LmFzc2lnbih0Yy5wcm90b3R5cGUse3Jlc2V0RHVyYXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxjPTAsZT10aGlzLnRyYWNrcy5sZW5ndGg7YyE9PWU7KytjKXt2YXIgZz10aGlzLnRyYWNrc1tjXTthPU1hdGgubWF4KGEsZy50aW1lc1tnLnRpbWVzLmxlbmd0aC0xXSl9dGhpcy5kdXJhdGlvbj1hO3JldHVybiB0aGlzfSx0cmltOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLnRyYWNrcy5sZW5ndGg7YSsrKXRoaXMudHJhY2tzW2FdLnRyaW0oMCx0aGlzLmR1cmF0aW9uKTtyZXR1cm4gdGhpc30sdmFsaWRhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiEwLGM9MDtjPHRoaXMudHJhY2tzLmxlbmd0aDtjKyspYT1hJiZ0aGlzLnRyYWNrc1tjXS52YWxpZGF0ZSgpO3JldHVybiBhfSxvcHRpbWl6ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy50cmFja3MubGVuZ3RoO2ErKyl0aGlzLnRyYWNrc1thXS5vcHRpbWl6ZSgpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxjPTA7Yzx0aGlzLnRyYWNrcy5sZW5ndGg7YysrKWEucHVzaCh0aGlzLnRyYWNrc1tjXS5jbG9uZSgpKTtyZXR1cm4gbmV3IHRjKHRoaXMubmFtZSx0aGlzLmR1cmF0aW9uLGEpfX0pO3ZhciBpZT17ZW5hYmxlZDohMSxmaWxlczp7fSxhZGQ6ZnVuY3Rpb24oYSxjKXshMSE9PXRoaXMuZW5hYmxlZCYmKHRoaXMuZmlsZXNbYV09Yyl9LGdldDpmdW5jdGlvbihhKXtpZighMSE9PXRoaXMuZW5hYmxlZClyZXR1cm4gdGhpcy5maWxlc1thXX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2RlbGV0ZSB0aGlzLmZpbGVzW2FdfSxjbGVhcjpmdW5jdGlvbigpe3RoaXMuZmlsZXM9Cnt9fX0sT2o9bmV3ICRoO09iamVjdC5hc3NpZ24oRGIucHJvdG90eXBlLHtsb2FkOmZ1bmN0aW9uKCl7fSxwYXJzZTpmdW5jdGlvbigpe30sc2V0Q3Jvc3NPcmlnaW46ZnVuY3Rpb24oYSl7dGhpcy5jcm9zc09yaWdpbj1hO3JldHVybiB0aGlzfSxzZXRQYXRoOmZ1bmN0aW9uKGEpe3RoaXMucGF0aD1hO3JldHVybiB0aGlzfSxzZXRSZXNvdXJjZVBhdGg6ZnVuY3Rpb24oYSl7dGhpcy5yZXNvdXJjZVBhdGg9YTtyZXR1cm4gdGhpc319KTtEYi5IYW5kbGVycz17aGFuZGxlcnM6W10sYWRkOmZ1bmN0aW9uKGEsYyl7dGhpcy5oYW5kbGVycy5wdXNoKGEsYyl9LGdldDpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5oYW5kbGVycyxlPTAsZz1jLmxlbmd0aDtlPGc7ZSs9Mil7dmFyIHI9Y1tlKzFdO2lmKGNbZV0udGVzdChhKSlyZXR1cm4gcn1yZXR1cm4gbnVsbH19O3ZhciBLYz17fTt1Yy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnVjLApsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZvaWQgMD09PWEmJihhPSIiKTt2b2lkIDAhPT10aGlzLnBhdGgmJihhPXRoaXMucGF0aCthKTthPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGEpO3ZhciByPXRoaXMsdj1pZS5nZXQoYSk7aWYodm9pZCAwIT09dilyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyYmYyh2KTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sMCksdjtpZih2b2lkIDAhPT1LY1thXSlLY1thXS5wdXNoKHtvbkxvYWQ6YyxvblByb2dyZXNzOmUsb25FcnJvcjpnfSk7ZWxzZXt2YXIgej1hLm1hdGNoKC9eZGF0YTooLio/KSg7YmFzZTY0KT8sKC4qKSQvKTtpZih6KXtlPXpbMV07dmFyIEU9ISF6WzJdO3o9elszXTt6PWRlY29kZVVSSUNvbXBvbmVudCh6KTtFJiYoej1hdG9iKHopKTt0cnl7dmFyIEY9KHRoaXMucmVzcG9uc2VUeXBlfHwiIikudG9Mb3dlckNhc2UoKTtzd2l0Y2goRil7Y2FzZSAiYXJyYXlidWZmZXIiOmNhc2UgImJsb2IiOnZhciBKPQpuZXcgVWludDhBcnJheSh6Lmxlbmd0aCk7Zm9yKEU9MDtFPHoubGVuZ3RoO0UrKylKW0VdPXouY2hhckNvZGVBdChFKTt2YXIgUD0iYmxvYiI9PT1GP25ldyBCbG9iKFtKLmJ1ZmZlcl0se3R5cGU6ZX0pOkouYnVmZmVyO2JyZWFrO2Nhc2UgImRvY3VtZW50IjpQPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoeixlKTticmVhaztjYXNlICJqc29uIjpQPUpTT04ucGFyc2Uoeik7YnJlYWs7ZGVmYXVsdDpQPXp9c2V0VGltZW91dChmdW5jdGlvbigpe2MmJmMoUCk7ci5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApfWNhdGNoKFMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtnJiZnKFMpO3IubWFuYWdlci5pdGVtRXJyb3IoYSk7ci5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApfX1lbHNle0tjW2FdPVtdO0tjW2FdLnB1c2goe29uTG9hZDpjLG9uUHJvZ3Jlc3M6ZSxvbkVycm9yOmd9KTt2YXIgUj1uZXcgWE1MSHR0cFJlcXVlc3Q7Ui5vcGVuKCJHRVQiLGEsITApO1IuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsCmZ1bmN0aW9uKFMpe3ZhciBWPXRoaXMucmVzcG9uc2U7aWUuYWRkKGEsVik7dmFyIFc9S2NbYV07ZGVsZXRlIEtjW2FdO2lmKDIwMD09PXRoaXMuc3RhdHVzfHwwPT09dGhpcy5zdGF0dXMpezA9PT10aGlzLnN0YXR1cyYmY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpO2Zvcih2YXIgaGE9MCxmYT1XLmxlbmd0aDtoYTxmYTtoYSsrKXt2YXIgcmE9V1toYV07aWYocmEub25Mb2FkKXJhLm9uTG9hZChWKX19ZWxzZXtoYT0wO2ZvcihmYT1XLmxlbmd0aDtoYTxmYTtoYSsrKWlmKHJhPVdbaGFdLHJhLm9uRXJyb3IpcmEub25FcnJvcihTKTtyLm1hbmFnZXIuaXRlbUVycm9yKGEpfXIubWFuYWdlci5pdGVtRW5kKGEpfSwhMSk7Ui5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZnVuY3Rpb24oUyl7Zm9yKHZhciBWPUtjW2FdLFc9MCxoYT1WLmxlbmd0aDtXPGhhO1crKyl7dmFyIGZhPVZbV107aWYoZmEub25Qcm9ncmVzcylmYS5vblByb2dyZXNzKFMpfX0sCiExKTtSLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihTKXt2YXIgVj1LY1thXTtkZWxldGUgS2NbYV07Zm9yKHZhciBXPTAsaGE9Vi5sZW5ndGg7VzxoYTtXKyspe3ZhciBmYT1WW1ddO2lmKGZhLm9uRXJyb3IpZmEub25FcnJvcihTKX1yLm1hbmFnZXIuaXRlbUVycm9yKGEpO3IubWFuYWdlci5pdGVtRW5kKGEpfSwhMSk7Ui5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsZnVuY3Rpb24oUyl7dmFyIFY9S2NbYV07ZGVsZXRlIEtjW2FdO2Zvcih2YXIgVz0wLGhhPVYubGVuZ3RoO1c8aGE7VysrKXt2YXIgZmE9VltXXTtpZihmYS5vbkVycm9yKWZhLm9uRXJyb3IoUyl9ci5tYW5hZ2VyLml0ZW1FcnJvcihhKTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sITEpO3ZvaWQgMCE9PXRoaXMucmVzcG9uc2VUeXBlJiYoUi5yZXNwb25zZVR5cGU9dGhpcy5yZXNwb25zZVR5cGUpO3ZvaWQgMCE9PXRoaXMud2l0aENyZWRlbnRpYWxzJiYoUi53aXRoQ3JlZGVudGlhbHM9dGhpcy53aXRoQ3JlZGVudGlhbHMpOwpSLm92ZXJyaWRlTWltZVR5cGUmJlIub3ZlcnJpZGVNaW1lVHlwZSh2b2lkIDAhPT10aGlzLm1pbWVUeXBlP3RoaXMubWltZVR5cGU6InRleHQvcGxhaW4iKTtmb3IoRSBpbiB0aGlzLnJlcXVlc3RIZWFkZXIpUi5zZXRSZXF1ZXN0SGVhZGVyKEUsdGhpcy5yZXF1ZXN0SGVhZGVyW0VdKTtSLnNlbmQobnVsbCl9ci5tYW5hZ2VyLml0ZW1TdGFydChhKTtyZXR1cm4gUn19LHNldFJlc3BvbnNlVHlwZTpmdW5jdGlvbihhKXt0aGlzLnJlc3BvbnNlVHlwZT1hO3JldHVybiB0aGlzfSxzZXRXaXRoQ3JlZGVudGlhbHM6ZnVuY3Rpb24oYSl7dGhpcy53aXRoQ3JlZGVudGlhbHM9YTtyZXR1cm4gdGhpc30sc2V0TWltZVR5cGU6ZnVuY3Rpb24oYSl7dGhpcy5taW1lVHlwZT1hO3JldHVybiB0aGlzfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEpe3RoaXMucmVxdWVzdEhlYWRlcj1hO3JldHVybiB0aGlzfX0pO2FpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOmFpLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcyx2PW5ldyB1YyhyLm1hbmFnZXIpO3Yuc2V0UGF0aChyLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope2Moci5wYXJzZShKU09OLnBhcnNlKHopKSl9LGUsZyl9LHBhcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBnPXRjLnBhcnNlKGFbZV0pO2MucHVzaChnKX1yZXR1cm4gY319KTtiaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmJpLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7ZnVuY3Rpb24gcihTKXtGLmxvYWQoYVtTXSxmdW5jdGlvbihWKXtWPXYuX3BhcnNlcihWLCEwKTt6W1NdPXt3aWR0aDpWLndpZHRoLGhlaWdodDpWLmhlaWdodCxmb3JtYXQ6Vi5mb3JtYXQsbWlwbWFwczpWLm1pcG1hcHN9O0orPTE7Nj09PUomJigxPT09Vi5taXBtYXBDb3VudCYmKEUubWluRmlsdGVyPQoxMDA2KSxFLmZvcm1hdD1WLmZvcm1hdCxFLm5lZWRzVXBkYXRlPSEwLGMmJmMoRSkpfSxlLGcpfXZhciB2PXRoaXMsej1bXSxFPW5ldyBEZTtFLmltYWdlPXo7dmFyIEY9bmV3IHVjKHRoaXMubWFuYWdlcik7Ri5zZXRQYXRoKHRoaXMucGF0aCk7Ri5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIEo9MCxQPTAsUj1hLmxlbmd0aDtQPFI7KytQKXIoUCk7ZWxzZSBGLmxvYWQoYSxmdW5jdGlvbihTKXtTPXYuX3BhcnNlcihTLCEwKTtpZihTLmlzQ3ViZW1hcClmb3IodmFyIFY9Uy5taXBtYXBzLmxlbmd0aC9TLm1pcG1hcENvdW50LFc9MDtXPFY7VysrKXt6W1ddPXttaXBtYXBzOltdfTtmb3IodmFyIGhhPTA7aGE8Uy5taXBtYXBDb3VudDtoYSsrKXpbV10ubWlwbWFwcy5wdXNoKFMubWlwbWFwc1tXKlMubWlwbWFwQ291bnQraGFdKSx6W1ddLmZvcm1hdD1TLmZvcm1hdCx6W1ddLndpZHRoPVMud2lkdGgseltXXS5oZWlnaHQ9Uy5oZWlnaHR9ZWxzZSBFLmltYWdlLndpZHRoPQpTLndpZHRoLEUuaW1hZ2UuaGVpZ2h0PVMuaGVpZ2h0LEUubWlwbWFwcz1TLm1pcG1hcHM7MT09PVMubWlwbWFwQ291bnQmJihFLm1pbkZpbHRlcj0xMDA2KTtFLmZvcm1hdD1TLmZvcm1hdDtFLm5lZWRzVXBkYXRlPSEwO2MmJmMoRSl9LGUsZyk7cmV0dXJuIEV9fSk7S2cucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpLZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj1uZXcgQWIsej1uZXcgdWModGhpcy5tYW5hZ2VyKTt6LnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKTt6LnNldFBhdGgodGhpcy5wYXRoKTt6LmxvYWQoYSxmdW5jdGlvbihFKXtpZihFPXIuX3BhcnNlcihFKSl2b2lkIDAhPT1FLmltYWdlP3YuaW1hZ2U9RS5pbWFnZTp2b2lkIDAhPT1FLmRhdGEmJih2LmltYWdlLndpZHRoPUUud2lkdGgsdi5pbWFnZS5oZWlnaHQ9RS5oZWlnaHQsdi5pbWFnZS5kYXRhPUUuZGF0YSksdi53cmFwUz0Kdm9pZCAwIT09RS53cmFwUz9FLndyYXBTOjEwMDEsdi53cmFwVD12b2lkIDAhPT1FLndyYXBUP0Uud3JhcFQ6MTAwMSx2Lm1hZ0ZpbHRlcj12b2lkIDAhPT1FLm1hZ0ZpbHRlcj9FLm1hZ0ZpbHRlcjoxMDA2LHYubWluRmlsdGVyPXZvaWQgMCE9PUUubWluRmlsdGVyP0UubWluRmlsdGVyOjEwMDgsdi5hbmlzb3Ryb3B5PXZvaWQgMCE9PUUuYW5pc290cm9weT9FLmFuaXNvdHJvcHk6MSx2b2lkIDAhPT1FLmZvcm1hdCYmKHYuZm9ybWF0PUUuZm9ybWF0KSx2b2lkIDAhPT1FLnR5cGUmJih2LnR5cGU9RS50eXBlKSx2b2lkIDAhPT1FLm1pcG1hcHMmJih2Lm1pcG1hcHM9RS5taXBtYXBzKSwxPT09RS5taXBtYXBDb3VudCYmKHYubWluRmlsdGVyPTEwMDYpLHYubmVlZHNVcGRhdGU9ITAsYyYmYyh2LEUpfSxlLGcpO3JldHVybiB2fX0pO1VlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VWUsbG9hZDpmdW5jdGlvbihhLApjLGUsZyl7ZnVuY3Rpb24gcigpe0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsciwhMSk7Ri5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdiwhMSk7aWUuYWRkKGEsdGhpcyk7YyYmYyh0aGlzKTt6Lm1hbmFnZXIuaXRlbUVuZChhKX1mdW5jdGlvbiB2KEope0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsciwhMSk7Ri5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdiwhMSk7ZyYmZyhKKTt6Lm1hbmFnZXIuaXRlbUVycm9yKGEpO3oubWFuYWdlci5pdGVtRW5kKGEpfXZvaWQgMCE9PXRoaXMucGF0aCYmKGE9dGhpcy5wYXRoK2EpO2E9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoYSk7dmFyIHo9dGhpcyxFPWllLmdldChhKTtpZih2b2lkIDAhPT1FKXJldHVybiB6Lm1hbmFnZXIuaXRlbVN0YXJ0KGEpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjJiZjKEUpO3oubWFuYWdlci5pdGVtRW5kKGEpfSwwKSxFO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiJpbWciKTtGLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHIsITEpO0YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHYsITEpOyJkYXRhOiIhPT1hLnN1YnN0cigwLDUpJiZ2b2lkIDAhPT10aGlzLmNyb3NzT3JpZ2luJiYoRi5jcm9zc09yaWdpbj10aGlzLmNyb3NzT3JpZ2luKTt6Lm1hbmFnZXIuaXRlbVN0YXJ0KGEpO0Yuc3JjPWE7cmV0dXJuIEZ9fSk7TGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpMZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe2Z1bmN0aW9uIHIoRil7ei5sb2FkKGFbRl0sZnVuY3Rpb24oSil7di5pbWFnZXNbRl09SjtFKys7Nj09PUUmJih2Lm5lZWRzVXBkYXRlPSEwLGMmJmModikpfSx2b2lkIDAsZyl9dmFyIHY9bmV3IGNkLHo9bmV3IFVlKHRoaXMubWFuYWdlcik7ei5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTt6LnNldFBhdGgodGhpcy5wYXRoKTt2YXIgRT0wO2ZvcihlPQowO2U8YS5sZW5ndGg7KytlKXIoZSk7cmV0dXJuIHZ9fSk7TWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpNZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPW5ldyBsLHY9bmV3IFVlKHRoaXMubWFuYWdlcik7di5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTt2LnNldFBhdGgodGhpcy5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtyLmltYWdlPXo7ej0wPGEuc2VhcmNoKC9cLmpwZT9nKCR8XD8pL2kpfHwwPT09YS5zZWFyY2goL15kYXRhOmltYWdlXC9qcGVnLyk7ci5mb3JtYXQ9ej8xMDIyOjEwMjM7ci5uZWVkc1VwZGF0ZT0hMDt2b2lkIDAhPT1jJiZjKHIpfSxlLGcpO3JldHVybiByfX0pO09iamVjdC5hc3NpZ24oWmEucHJvdG90eXBlLHtnZXRQb2ludDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKTtyZXR1cm4gbnVsbH0sCmdldFBvaW50QXQ6ZnVuY3Rpb24oYSxjKXthPXRoaXMuZ2V0VXRvVG1hcHBpbmcoYSk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYSxjKX0sZ2V0UG9pbnRzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPTUpO2Zvcih2YXIgYz1bXSxlPTA7ZTw9YTtlKyspYy5wdXNoKHRoaXMuZ2V0UG9pbnQoZS9hKSk7cmV0dXJuIGN9LGdldFNwYWNlZFBvaW50czpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT01KTtmb3IodmFyIGM9W10sZT0wO2U8PWE7ZSsrKWMucHVzaCh0aGlzLmdldFBvaW50QXQoZS9hKSk7cmV0dXJuIGN9LGdldExlbmd0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiBhW2EubGVuZ3RoLTFdfSxnZXRMZW5ndGhzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKTtpZih0aGlzLmNhY2hlQXJjTGVuZ3RocyYmdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoPT09YSsxJiYhdGhpcy5uZWVkc1VwZGF0ZSlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7CnRoaXMubmVlZHNVcGRhdGU9ITE7dmFyIGM9W10sZT10aGlzLmdldFBvaW50KDApLGcscj0wO2MucHVzaCgwKTtmb3IoZz0xO2c8PWE7ZysrKXt2YXIgdj10aGlzLmdldFBvaW50KGcvYSk7cis9di5kaXN0YW5jZVRvKGUpO2MucHVzaChyKTtlPXZ9cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzPWN9LHVwZGF0ZUFyY0xlbmd0aHM6ZnVuY3Rpb24oKXt0aGlzLm5lZWRzVXBkYXRlPSEwO3RoaXMuZ2V0TGVuZ3RocygpfSxnZXRVdG9UbWFwcGluZzpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZ2V0TGVuZ3RocygpLGc9ZS5sZW5ndGg7Yz1jP2M6YSplW2ctMV07Zm9yKHZhciByPTAsdj1nLTEsejtyPD12OylpZihhPU1hdGguZmxvb3Iocisodi1yKS8yKSx6PWVbYV0tYywwPnopcj1hKzE7ZWxzZSBpZigwPHopdj1hLTE7ZWxzZXt2PWE7YnJlYWt9YT12O2lmKGVbYV09PT1jKXJldHVybiBhLyhnLTEpO3I9ZVthXTtyZXR1cm4oYSsoYy1yKS8oZVthKzFdLXIpKS8oZy0xKX0sZ2V0VGFuZ2VudDpmdW5jdGlvbihhKXt2YXIgYz0KYS0xRS00O2ErPTFFLTQ7MD5jJiYoYz0wKTsxPGEmJihhPTEpO2M9dGhpcy5nZXRQb2ludChjKTtyZXR1cm4gdGhpcy5nZXRQb2ludChhKS5jbG9uZSgpLnN1YihjKS5ub3JtYWxpemUoKX0sZ2V0VGFuZ2VudEF0OmZ1bmN0aW9uKGEpe2E9dGhpcy5nZXRVdG9UbWFwcGluZyhhKTtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KGEpfSxjb21wdXRlRnJlbmV0RnJhbWVzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9bmV3IGssZz1bXSxyPVtdLHY9W10sej1uZXcgayxFPW5ldyBxLEY7Zm9yKEY9MDtGPD1hO0YrKyl7dmFyIEo9Ri9hO2dbRl09dGhpcy5nZXRUYW5nZW50QXQoSik7Z1tGXS5ub3JtYWxpemUoKX1yWzBdPW5ldyBrO3ZbMF09bmV3IGs7Rj1OdW1iZXIuTUFYX1ZBTFVFO0o9TWF0aC5hYnMoZ1swXS54KTt2YXIgUD1NYXRoLmFicyhnWzBdLnkpLFI9TWF0aC5hYnMoZ1swXS56KTtKPD1GJiYoRj1KLGUuc2V0KDEsMCwwKSk7UDw9RiYmKEY9UCxlLnNldCgwLDEsMCkpO1I8PUYmJmUuc2V0KDAsCjAsMSk7ei5jcm9zc1ZlY3RvcnMoZ1swXSxlKS5ub3JtYWxpemUoKTtyWzBdLmNyb3NzVmVjdG9ycyhnWzBdLHopO3ZbMF0uY3Jvc3NWZWN0b3JzKGdbMF0sclswXSk7Zm9yKEY9MTtGPD1hO0YrKylyW0ZdPXJbRi0xXS5jbG9uZSgpLHZbRl09dltGLTFdLmNsb25lKCksei5jcm9zc1ZlY3RvcnMoZ1tGLTFdLGdbRl0pLHoubGVuZ3RoKCk+TnVtYmVyLkVQU0lMT04mJih6Lm5vcm1hbGl6ZSgpLGU9TWF0aC5hY29zKGhiLmNsYW1wKGdbRi0xXS5kb3QoZ1tGXSksLTEsMSkpLHJbRl0uYXBwbHlNYXRyaXg0KEUubWFrZVJvdGF0aW9uQXhpcyh6LGUpKSksdltGXS5jcm9zc1ZlY3RvcnMoZ1tGXSxyW0ZdKTtpZighMD09PWMpZm9yKGU9TWF0aC5hY29zKGhiLmNsYW1wKHJbMF0uZG90KHJbYV0pLC0xLDEpKSxlLz1hLDA8Z1swXS5kb3Qoei5jcm9zc1ZlY3RvcnMoclswXSxyW2FdKSkmJihlPS1lKSxGPTE7Rjw9YTtGKyspcltGXS5hcHBseU1hdHJpeDQoRS5tYWtlUm90YXRpb25BeGlzKGdbRl0sCmUqRikpLHZbRl0uY3Jvc3NWZWN0b3JzKGdbRl0scltGXSk7cmV0dXJue3RhbmdlbnRzOmcsbm9ybWFsczpyLGJpbm9ybWFsczp2fX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9YS5hcmNMZW5ndGhEaXZpc2lvbnM7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O2EuYXJjTGVuZ3RoRGl2aXNpb25zPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO2EudHlwZT10aGlzLnR5cGU7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWEuYXJjTGVuZ3RoRGl2aXNpb25zO3JldHVybiB0aGlzfX0pO3BjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7cGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpwYztwYy5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmU9ITA7cGMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgZjtmb3IodmFyIGU9MipNYXRoLlBJLGc9dGhpcy5hRW5kQW5nbGUtdGhpcy5hU3RhcnRBbmdsZSxyPU1hdGguYWJzKGcpPE51bWJlci5FUFNJTE9OOzA+ZzspZys9ZTtmb3IoO2c+ZTspZy09ZTtnPE51bWJlci5FUFNJTE9OJiYoZz1yPzA6ZSk7ITAhPT10aGlzLmFDbG9ja3dpc2V8fHJ8fChnPWc9PT1lPy1lOmctZSk7ZT10aGlzLmFTdGFydEFuZ2xlK2EqZzthPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGUpO3ZhciB2PXRoaXMuYVkrdGhpcy55UmFkaXVzKk1hdGguc2luKGUpOzAhPT10aGlzLmFSb3RhdGlvbiYmKGU9TWF0aC5jb3ModGhpcy5hUm90YXRpb24pLGc9TWF0aC5zaW4odGhpcy5hUm90YXRpb24pLHI9YS10aGlzLmFYLHYtPXRoaXMuYVksYT1yKmUtdipnK3RoaXMuYVgsdj1yKmcrdiplK3RoaXMuYVkpO3JldHVybiBjLnNldChhLAp2KX07cGMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuYVg9YS5hWDt0aGlzLmFZPWEuYVk7dGhpcy54UmFkaXVzPWEueFJhZGl1czt0aGlzLnlSYWRpdXM9YS55UmFkaXVzO3RoaXMuYVN0YXJ0QW5nbGU9YS5hU3RhcnRBbmdsZTt0aGlzLmFFbmRBbmdsZT1hLmFFbmRBbmdsZTt0aGlzLmFDbG9ja3dpc2U9YS5hQ2xvY2t3aXNlO3RoaXMuYVJvdGF0aW9uPWEuYVJvdGF0aW9uO3JldHVybiB0aGlzfTtwYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EuYVg9dGhpcy5hWDthLmFZPXRoaXMuYVk7YS54UmFkaXVzPXRoaXMueFJhZGl1czthLnlSYWRpdXM9dGhpcy55UmFkaXVzO2EuYVN0YXJ0QW5nbGU9dGhpcy5hU3RhcnRBbmdsZTthLmFFbmRBbmdsZT10aGlzLmFFbmRBbmdsZTthLmFDbG9ja3dpc2U9dGhpcy5hQ2xvY2t3aXNlO2EuYVJvdGF0aW9uPQp0aGlzLmFSb3RhdGlvbjtyZXR1cm4gYX07cGMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5hWD1hLmFYO3RoaXMuYVk9YS5hWTt0aGlzLnhSYWRpdXM9YS54UmFkaXVzO3RoaXMueVJhZGl1cz1hLnlSYWRpdXM7dGhpcy5hU3RhcnRBbmdsZT1hLmFTdGFydEFuZ2xlO3RoaXMuYUVuZEFuZ2xlPWEuYUVuZEFuZ2xlO3RoaXMuYUNsb2Nrd2lzZT1hLmFDbG9ja3dpc2U7dGhpcy5hUm90YXRpb249YS5hUm90YXRpb247cmV0dXJuIHRoaXN9O1ZlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHBjLnByb3RvdHlwZSk7VmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVZlO1ZlLnByb3RvdHlwZS5pc0FyY0N1cnZlPSEwO3ZhciB4aD1uZXcgayxMaT1uZXcgY2ksTWk9bmV3IGNpLE5pPW5ldyBjaTtaYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO1piLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aYjsKWmIucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMz0hMDtaYi5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBrO3ZhciBlPXRoaXMucG9pbnRzLGc9ZS5sZW5ndGg7YSo9Zy0odGhpcy5jbG9zZWQ/MDoxKTt2YXIgcj1NYXRoLmZsb29yKGEpO2EtPXI7dGhpcy5jbG9zZWQ/cis9MDxyPzA6KE1hdGguZmxvb3IoTWF0aC5hYnMocikvZykrMSkqZzowPT09YSYmcj09PWctMSYmKHI9Zy0yLGE9MSk7aWYodGhpcy5jbG9zZWR8fDA8cil2YXIgdj1lWyhyLTEpJWddO2Vsc2UgeGguc3ViVmVjdG9ycyhlWzBdLGVbMV0pLmFkZChlWzBdKSx2PXhoO3ZhciB6PWVbciVnXTt2YXIgRT1lWyhyKzEpJWddO3RoaXMuY2xvc2VkfHxyKzI8Zz9lPWVbKHIrMiklZ106KHhoLnN1YlZlY3RvcnMoZVtnLTFdLGVbZy0yXSkuYWRkKGVbZy0xXSksZT14aCk7aWYoImNlbnRyaXBldGFsIj09PXRoaXMuY3VydmVUeXBlfHwiY2hvcmRhbCI9PT10aGlzLmN1cnZlVHlwZSl7dmFyIEY9CiJjaG9yZGFsIj09PXRoaXMuY3VydmVUeXBlPy41Oi4yNTtnPU1hdGgucG93KHYuZGlzdGFuY2VUb1NxdWFyZWQoeiksRik7cj1NYXRoLnBvdyh6LmRpc3RhbmNlVG9TcXVhcmVkKEUpLEYpO0Y9TWF0aC5wb3coRS5kaXN0YW5jZVRvU3F1YXJlZChlKSxGKTsxRS00PnImJihyPTEpOzFFLTQ+ZyYmKGc9cik7MUUtND5GJiYoRj1yKTtMaS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20odi54LHoueCxFLngsZS54LGcscixGKTtNaS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20odi55LHoueSxFLnksZS55LGcscixGKTtOaS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20odi56LHoueixFLnosZS56LGcscixGKX1lbHNlImNhdG11bGxyb20iPT09dGhpcy5jdXJ2ZVR5cGUmJihMaS5pbml0Q2F0bXVsbFJvbSh2Lngsei54LEUueCxlLngsdGhpcy50ZW5zaW9uKSxNaS5pbml0Q2F0bXVsbFJvbSh2Lnksei55LEUueSxlLnksdGhpcy50ZW5zaW9uKSxOaS5pbml0Q2F0bXVsbFJvbSh2Lnosei56LEUueiwKZS56LHRoaXMudGVuc2lvbikpO2Muc2V0KExpLmNhbGMoYSksTWkuY2FsYyhhKSxOaS5jYWxjKGEpKTtyZXR1cm4gY307WmIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMucG9pbnRzPVtdO2Zvcih2YXIgYz0wLGU9YS5wb2ludHMubGVuZ3RoO2M8ZTtjKyspdGhpcy5wb2ludHMucHVzaChhLnBvaW50c1tjXS5jbG9uZSgpKTt0aGlzLmNsb3NlZD1hLmNsb3NlZDt0aGlzLmN1cnZlVHlwZT1hLmN1cnZlVHlwZTt0aGlzLnRlbnNpb249YS50ZW5zaW9uO3JldHVybiB0aGlzfTtaYi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EucG9pbnRzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5wb2ludHMubGVuZ3RoO2M8ZTtjKyspYS5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tjXS50b0FycmF5KCkpO2EuY2xvc2VkPXRoaXMuY2xvc2VkO2EuY3VydmVUeXBlPXRoaXMuY3VydmVUeXBlOwphLnRlbnNpb249dGhpcy50ZW5zaW9uO3JldHVybiBhfTtaYi5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLnBvaW50c1tjXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgaykuZnJvbUFycmF5KGcpKX10aGlzLmNsb3NlZD1hLmNsb3NlZDt0aGlzLmN1cnZlVHlwZT1hLmN1cnZlVHlwZTt0aGlzLnRlbnNpb249YS50ZW5zaW9uO3JldHVybiB0aGlzfTtDYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0NjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1DYztDYy5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlPSEwO0NjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7dmFyIGU9dGhpcy52MCxnPXRoaXMudjEscj10aGlzLnYyLHY9dGhpcy52MztjLnNldChhZyhhLAplLngsZy54LHIueCx2LngpLGFnKGEsZS55LGcueSxyLnksdi55KSk7cmV0dXJuIGN9O0NjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYwLmNvcHkoYS52MCk7dGhpcy52MS5jb3B5KGEudjEpO3RoaXMudjIuY29weShhLnYyKTt0aGlzLnYzLmNvcHkoYS52Myk7cmV0dXJuIHRoaXN9O0NjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MD10aGlzLnYwLnRvQXJyYXkoKTthLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7YS52Mz10aGlzLnYzLnRvQXJyYXkoKTtyZXR1cm4gYX07Q2MucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MC5mcm9tQXJyYXkoYS52MCk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7dGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7CnRoaXMudjMuZnJvbUFycmF5KGEudjMpO3JldHVybiB0aGlzfTtUYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO1RjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UYztUYy5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlMz0hMDtUYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBrO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHI9dGhpcy52Mix2PXRoaXMudjM7Yy5zZXQoYWcoYSxlLngsZy54LHIueCx2LngpLGFnKGEsZS55LGcueSxyLnksdi55KSxhZyhhLGUueixnLnosci56LHYueikpO3JldHVybiBjfTtUYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MC5jb3B5KGEudjApO3RoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7dGhpcy52My5jb3B5KGEudjMpO3JldHVybiB0aGlzfTtUYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9ClphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnYwPXRoaXMudjAudG9BcnJheSgpO2EudjE9dGhpcy52MS50b0FycmF5KCk7YS52Mj10aGlzLnYyLnRvQXJyYXkoKTthLnYzPXRoaXMudjMudG9BcnJheSgpO3JldHVybiBhfTtUYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYwLmZyb21BcnJheShhLnYwKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTt0aGlzLnYyLmZyb21BcnJheShhLnYyKTt0aGlzLnYzLmZyb21BcnJheShhLnYzKTtyZXR1cm4gdGhpc307a2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtrYy5wcm90b3R5cGUuY29uc3RydWN0b3I9a2M7a2MucHJvdG90eXBlLmlzTGluZUN1cnZlPSEwO2tjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7MT09PWE/Yy5jb3B5KHRoaXMudjIpOihjLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLApjLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLnYxKSk7cmV0dXJuIGN9O2tjLnByb3RvdHlwZS5nZXRQb2ludEF0PWZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYSxjKX07a2MucHJvdG90eXBlLmdldFRhbmdlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52Mi5jbG9uZSgpLnN1Yih0aGlzLnYxKS5ub3JtYWxpemUoKX07a2MucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7cmV0dXJuIHRoaXN9O2tjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtrYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTsKdGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7cmV0dXJuIHRoaXN9O0RjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7RGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPURjO0RjLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZTM9ITA7RGMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgazsxPT09YT9jLmNvcHkodGhpcy52Mik6KGMuY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksYy5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy52MSkpO3JldHVybiBjfTtEYy5wcm90b3R5cGUuZ2V0UG9pbnRBdD1mdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmdldFBvaW50KGEsYyl9O0RjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtEYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpOwphLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7cmV0dXJuIGF9O0RjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMudjEuZnJvbUFycmF5KGEudjEpO3RoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtFYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0VjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1FYztFYy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZT0hMDtFYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHI9dGhpcy52MjtjLnNldCgkZihhLGUueCxnLngsci54KSwkZihhLGUueSxnLnksci55KSk7cmV0dXJuIGN9O0VjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYwLmNvcHkoYS52MCk7CnRoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7cmV0dXJuIHRoaXN9O0VjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MD10aGlzLnYwLnRvQXJyYXkoKTthLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7cmV0dXJuIGF9O0VjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMudjAuZnJvbUFycmF5KGEudjApO3RoaXMudjEuZnJvbUFycmF5KGEudjEpO3RoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtVYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO1VjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VYztVYy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITA7VWMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHwKbmV3IGs7dmFyIGU9dGhpcy52MCxnPXRoaXMudjEscj10aGlzLnYyO2Muc2V0KCRmKGEsZS54LGcueCxyLngpLCRmKGEsZS55LGcueSxyLnkpLCRmKGEsZS56LGcueixyLnopKTtyZXR1cm4gY307VWMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudjAuY29weShhLnYwKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtVYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjA9dGhpcy52MC50b0FycmF5KCk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtVYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYwLmZyb21BcnJheShhLnYwKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTsKdGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7cmV0dXJuIHRoaXN9O0ZjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7RmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZjO0ZjLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlPSEwO0ZjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7dmFyIGU9dGhpcy5wb2ludHMsZz0oZS5sZW5ndGgtMSkqYTthPU1hdGguZmxvb3IoZyk7Zy09YTt2YXIgcj1lWzA9PT1hP2E6YS0xXSx2PWVbYV0sej1lW2E+ZS5sZW5ndGgtMj9lLmxlbmd0aC0xOmErMV07ZT1lW2E+ZS5sZW5ndGgtMz9lLmxlbmd0aC0xOmErMl07Yy5zZXQoUGooZyxyLngsdi54LHoueCxlLngpLFBqKGcsci55LHYueSx6LnksZS55KSk7cmV0dXJuIGN9O0ZjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPAplO2MrKyl0aGlzLnBvaW50cy5wdXNoKGEucG9pbnRzW2NdLmNsb25lKCkpO3JldHVybiB0aGlzfTtGYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EucG9pbnRzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5wb2ludHMubGVuZ3RoO2M8ZTtjKyspYS5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tjXS50b0FycmF5KCkpO3JldHVybiBhfTtGYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLnBvaW50c1tjXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgZikuZnJvbUFycmF5KGcpKX1yZXR1cm4gdGhpc307dmFyIE9pPU9iamVjdC5mcmVlemUoe0FyY0N1cnZlOlZlLENhdG11bGxSb21DdXJ2ZTM6WmIsQ3ViaWNCZXppZXJDdXJ2ZTpDYyxDdWJpY0JlemllckN1cnZlMzpUYywKRWxsaXBzZUN1cnZlOnBjLExpbmVDdXJ2ZTprYyxMaW5lQ3VydmUzOkRjLFF1YWRyYXRpY0JlemllckN1cnZlOkVjLFF1YWRyYXRpY0JlemllckN1cnZlMzpVYyxTcGxpbmVDdXJ2ZTpGY30pO2dkLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6Z2QsYWRkOmZ1bmN0aW9uKGEpe3RoaXMuY3VydmVzLnB1c2goYSl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3VydmVzWzBdLmdldFBvaW50KDApLGM9dGhpcy5jdXJ2ZXNbdGhpcy5jdXJ2ZXMubGVuZ3RoLTFdLmdldFBvaW50KDEpO2EuZXF1YWxzKGMpfHx0aGlzLmN1cnZlcy5wdXNoKG5ldyBrYyhjLGEpKX0sZ2V0UG9pbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9YSp0aGlzLmdldExlbmd0aCgpLGU9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtmb3IoYT0wO2E8ZS5sZW5ndGg7KXtpZihlW2FdPj1jKXJldHVybiBjPWVbYV0tYyxhPXRoaXMuY3VydmVzW2FdLGU9CmEuZ2V0TGVuZ3RoKCksYS5nZXRQb2ludEF0KDA9PT1lPzA6MS1jL2UpO2ErK31yZXR1cm4gbnVsbH0sZ2V0TGVuZ3RoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtyZXR1cm4gYVthLmxlbmd0aC0xXX0sdXBkYXRlQXJjTGVuZ3RoczpmdW5jdGlvbigpe3RoaXMubmVlZHNVcGRhdGU9ITA7dGhpcy5jYWNoZUxlbmd0aHM9bnVsbDt0aGlzLmdldEN1cnZlTGVuZ3RocygpfSxnZXRDdXJ2ZUxlbmd0aHM6ZnVuY3Rpb24oKXtpZih0aGlzLmNhY2hlTGVuZ3RocyYmdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoPT09dGhpcy5jdXJ2ZXMubGVuZ3RoKXJldHVybiB0aGlzLmNhY2hlTGVuZ3Rocztmb3IodmFyIGE9W10sYz0wLGU9MCxnPXRoaXMuY3VydmVzLmxlbmd0aDtlPGc7ZSsrKWMrPXRoaXMuY3VydmVzW2VdLmdldExlbmd0aCgpLGEucHVzaChjKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9YX0sZ2V0U3BhY2VkUG9pbnRzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoYT00MCk7Zm9yKHZhciBjPVtdLGU9MDtlPD1hO2UrKyljLnB1c2godGhpcy5nZXRQb2ludChlL2EpKTt0aGlzLmF1dG9DbG9zZSYmYy5wdXNoKGNbMF0pO3JldHVybiBjfSxnZXRQb2ludHM6ZnVuY3Rpb24oYSl7YT1hfHwxMjtmb3IodmFyIGM9W10sZSxnPTAscj10aGlzLmN1cnZlcztnPHIubGVuZ3RoO2crKyl7dmFyIHY9cltnXTt2PXYuZ2V0UG9pbnRzKHYmJnYuaXNFbGxpcHNlQ3VydmU/MiphOnYmJih2LmlzTGluZUN1cnZlfHx2LmlzTGluZUN1cnZlMyk/MTp2JiZ2LmlzU3BsaW5lQ3VydmU/YSp2LnBvaW50cy5sZW5ndGg6YSk7Zm9yKHZhciB6PTA7ejx2Lmxlbmd0aDt6Kyspe3ZhciBFPXZbel07ZSYmZS5lcXVhbHMoRSl8fChjLnB1c2goRSksZT1FKX19dGhpcy5hdXRvQ2xvc2UmJjE8Yy5sZW5ndGgmJiFjW2MubGVuZ3RoLTFdLmVxdWFscyhjWzBdKSYmYy5wdXNoKGNbMF0pO3JldHVybiBjfSxjb3B5OmZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5jdXJ2ZXM9W107Zm9yKHZhciBjPTAsZT1hLmN1cnZlcy5sZW5ndGg7YzxlO2MrKyl0aGlzLmN1cnZlcy5wdXNoKGEuY3VydmVzW2NdLmNsb25lKCkpO3RoaXMuYXV0b0Nsb3NlPWEuYXV0b0Nsb3NlO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS5hdXRvQ2xvc2U9dGhpcy5hdXRvQ2xvc2U7YS5jdXJ2ZXM9W107Zm9yKHZhciBjPTAsZT10aGlzLmN1cnZlcy5sZW5ndGg7YzxlO2MrKylhLmN1cnZlcy5wdXNoKHRoaXMuY3VydmVzW2NdLnRvSlNPTigpKTtyZXR1cm4gYX0sZnJvbUpTT046ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLmF1dG9DbG9zZT1hLmF1dG9DbG9zZTt0aGlzLmN1cnZlcz1bXTtmb3IodmFyIGM9MCxlPWEuY3VydmVzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLmN1cnZlc1tjXTt0aGlzLmN1cnZlcy5wdXNoKChuZXcgT2lbZy50eXBlXSkuZnJvbUpTT04oZykpfXJldHVybiB0aGlzfX0pOwpHYy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGdkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkdjLHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSl7dGhpcy5tb3ZlVG8oYVswXS54LGFbMF0ueSk7Zm9yKHZhciBjPTEsZT1hLmxlbmd0aDtjPGU7YysrKXRoaXMubGluZVRvKGFbY10ueCxhW2NdLnkpfSxtb3ZlVG86ZnVuY3Rpb24oYSxjKXt0aGlzLmN1cnJlbnRQb2ludC5zZXQoYSxjKX0sbGluZVRvOmZ1bmN0aW9uKGEsYyl7dmFyIGU9bmV3IGtjKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IGYoYSxjKSk7dGhpcy5jdXJ2ZXMucHVzaChlKTt0aGlzLmN1cnJlbnRQb2ludC5zZXQoYSxjKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbihhLGMsZSxnKXthPW5ldyBFYyh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBmKGEsYyksbmV3IGYoZSxnKSk7dGhpcy5jdXJ2ZXMucHVzaChhKTt0aGlzLmN1cnJlbnRQb2ludC5zZXQoZSxnKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbihhLApjLGUsZyxyLHYpe2E9bmV3IENjKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IGYoYSxjKSxuZXcgZihlLGcpLG5ldyBmKHIsdikpO3RoaXMuY3VydmVzLnB1c2goYSk7dGhpcy5jdXJyZW50UG9pbnQuc2V0KHIsdil9LHNwbGluZVRocnU6ZnVuY3Rpb24oYSl7dmFyIGM9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdChhKTtjPW5ldyBGYyhjKTt0aGlzLmN1cnZlcy5wdXNoKGMpO3RoaXMuY3VycmVudFBvaW50LmNvcHkoYVthLmxlbmd0aC0xXSl9LGFyYzpmdW5jdGlvbihhLGMsZSxnLHIsdil7dGhpcy5hYnNhcmMoYSt0aGlzLmN1cnJlbnRQb2ludC54LGMrdGhpcy5jdXJyZW50UG9pbnQueSxlLGcscix2KX0sYWJzYXJjOmZ1bmN0aW9uKGEsYyxlLGcscix2KXt0aGlzLmFic2VsbGlwc2UoYSxjLGUsZSxnLHIsdil9LGVsbGlwc2U6ZnVuY3Rpb24oYSxjLGUsZyxyLHYseixFKXt0aGlzLmFic2VsbGlwc2UoYSt0aGlzLmN1cnJlbnRQb2ludC54LGMrdGhpcy5jdXJyZW50UG9pbnQueSwKZSxnLHIsdix6LEUpfSxhYnNlbGxpcHNlOmZ1bmN0aW9uKGEsYyxlLGcscix2LHosRSl7YT1uZXcgcGMoYSxjLGUsZyxyLHYseixFKTswPHRoaXMuY3VydmVzLmxlbmd0aCYmKGM9YS5nZXRQb2ludCgwKSxjLmVxdWFscyh0aGlzLmN1cnJlbnRQb2ludCl8fHRoaXMubGluZVRvKGMueCxjLnkpKTt0aGlzLmN1cnZlcy5wdXNoKGEpO2E9YS5nZXRQb2ludCgxKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGEpfSxjb3B5OmZ1bmN0aW9uKGEpe2dkLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGEuY3VycmVudFBvaW50KTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9Z2QucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EuY3VycmVudFBvaW50PXRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKTtyZXR1cm4gYX0sZnJvbUpTT046ZnVuY3Rpb24oYSl7Z2QucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLmN1cnJlbnRQb2ludC5mcm9tQXJyYXkoYS5jdXJyZW50UG9pbnQpOwpyZXR1cm4gdGhpc319KTtDZC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEdjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkNkLGdldFBvaW50c0hvbGVzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPTAsZz10aGlzLmhvbGVzLmxlbmd0aDtlPGc7ZSsrKWNbZV09dGhpcy5ob2xlc1tlXS5nZXRQb2ludHMoYSk7cmV0dXJuIGN9LGV4dHJhY3RQb2ludHM6ZnVuY3Rpb24oYSl7cmV0dXJue3NoYXBlOnRoaXMuZ2V0UG9pbnRzKGEpLGhvbGVzOnRoaXMuZ2V0UG9pbnRzSG9sZXMoYSl9fSxjb3B5OmZ1bmN0aW9uKGEpe0djLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmhvbGVzPVtdO2Zvcih2YXIgYz0wLGU9YS5ob2xlcy5sZW5ndGg7YzxlO2MrKyl0aGlzLmhvbGVzLnB1c2goYS5ob2xlc1tjXS5jbG9uZSgpKTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9R2MucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudXVpZD10aGlzLnV1aWQ7CmEuaG9sZXM9W107Zm9yKHZhciBjPTAsZT10aGlzLmhvbGVzLmxlbmd0aDtjPGU7YysrKWEuaG9sZXMucHVzaCh0aGlzLmhvbGVzW2NdLnRvSlNPTigpKTtyZXR1cm4gYX0sZnJvbUpTT046ZnVuY3Rpb24oYSl7R2MucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnV1aWQ9YS51dWlkO3RoaXMuaG9sZXM9W107Zm9yKHZhciBjPTAsZT1hLmhvbGVzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLmhvbGVzW2NdO3RoaXMuaG9sZXMucHVzaCgobmV3IEdjKS5mcm9tSlNPTihnKSl9cmV0dXJuIHRoaXN9fSk7SmIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkpiLGlzTGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5pbnRlbnNpdHk9YS5pbnRlbnNpdHk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXthPQpBLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0LmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCk7YS5vYmplY3QuaW50ZW5zaXR5PXRoaXMuaW50ZW5zaXR5O3ZvaWQgMCE9PXRoaXMuZ3JvdW5kQ29sb3ImJihhLm9iamVjdC5ncm91bmRDb2xvcj10aGlzLmdyb3VuZENvbG9yLmdldEhleCgpKTt2b2lkIDAhPT10aGlzLmRpc3RhbmNlJiYoYS5vYmplY3QuZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSk7dm9pZCAwIT09dGhpcy5hbmdsZSYmKGEub2JqZWN0LmFuZ2xlPXRoaXMuYW5nbGUpO3ZvaWQgMCE9PXRoaXMuZGVjYXkmJihhLm9iamVjdC5kZWNheT10aGlzLmRlY2F5KTt2b2lkIDAhPT10aGlzLnBlbnVtYnJhJiYoYS5vYmplY3QucGVudW1icmE9dGhpcy5wZW51bWJyYSk7dm9pZCAwIT09dGhpcy5zaGFkb3cmJihhLm9iamVjdC5zaGFkb3c9dGhpcy5zaGFkb3cudG9KU09OKCkpO3JldHVybiBhfX0pO05nLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSmIucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOk5nLGlzSGVtaXNwaGVyZUxpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7SmIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZ3JvdW5kQ29sb3IuY29weShhLmdyb3VuZENvbG9yKTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKFZjLnByb3RvdHlwZSx7X3Byb2pTY3JlZW5NYXRyaXg6bmV3IHEsX2xpZ2h0UG9zaXRpb25Xb3JsZDpuZXcgayxfbG9va1RhcmdldDpuZXcgayxnZXRWaWV3cG9ydENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q291bnR9LGdldEZydXN0dW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJ1c3R1bX0sdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jYW1lcmEsZT10aGlzLm1hdHJpeCxnPXRoaXMuX3Byb2pTY3JlZW5NYXRyaXgscj10aGlzLl9sb29rVGFyZ2V0LHY9dGhpcy5fbGlnaHRQb3NpdGlvbldvcmxkO3Yuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEubWF0cml4V29ybGQpOwpjLnBvc2l0aW9uLmNvcHkodik7ci5zZXRGcm9tTWF0cml4UG9zaXRpb24oYS50YXJnZXQubWF0cml4V29ybGQpO2MubG9va0F0KHIpO2MudXBkYXRlTWF0cml4V29ybGQoKTtnLm11bHRpcGx5TWF0cmljZXMoYy5wcm9qZWN0aW9uTWF0cml4LGMubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLl9mcnVzdHVtLnNldEZyb21NYXRyaXgoZyk7ZS5zZXQoLjUsMCwwLC41LDAsLjUsMCwuNSwwLDAsLjUsLjUsMCwwLDAsMSk7ZS5tdWx0aXBseShjLnByb2plY3Rpb25NYXRyaXgpO2UubXVsdGlwbHkoYy5tYXRyaXhXb3JsZEludmVyc2UpfSxnZXRWaWV3cG9ydDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fdmlld3BvcnRzW2FdfSxnZXRGcmFtZUV4dGVudHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuY2FtZXJhPWEuY2FtZXJhLmNsb25lKCk7dGhpcy5iaWFzPWEuYmlhczt0aGlzLnJhZGl1cz1hLnJhZGl1czt0aGlzLm1hcFNpemUuY29weShhLm1hcFNpemUpOwpyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXt9OzAhPT10aGlzLmJpYXMmJihhLmJpYXM9dGhpcy5iaWFzKTsxIT09dGhpcy5yYWRpdXMmJihhLnJhZGl1cz10aGlzLnJhZGl1cyk7aWYoNTEyIT09dGhpcy5tYXBTaXplLnh8fDUxMiE9PXRoaXMubWFwU2l6ZS55KWEubWFwU2l6ZT10aGlzLm1hcFNpemUudG9BcnJheSgpO2EuY2FtZXJhPXRoaXMuY2FtZXJhLnRvSlNPTighMSkub2JqZWN0O2RlbGV0ZSBhLmNhbWVyYS5tYXRyaXg7cmV0dXJuIGF9fSk7T2cucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShWYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpPZyxpc1Nwb3RMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5jYW1lcmEscj0yKmhiLlJBRDJERUcqYS5hbmdsZSx2PXRoaXMubWFwU2l6ZS53aWR0aC8KdGhpcy5tYXBTaXplLmhlaWdodCx6PWEuZGlzdGFuY2V8fGcuZmFyO2lmKHIhPT1nLmZvdnx8diE9PWcuYXNwZWN0fHx6IT09Zy5mYXIpZy5mb3Y9cixnLmFzcGVjdD12LGcuZmFyPXosZy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7VmMucHJvdG90eXBlLnVwZGF0ZU1hdHJpY2VzLmNhbGwodGhpcyxhLGMsZSl9fSk7UGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShKYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpQZyxpc1Nwb3RMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmRpc3RhbmNlPWEuZGlzdGFuY2U7dGhpcy5hbmdsZT1hLmFuZ2xlO3RoaXMucGVudW1icmE9YS5wZW51bWJyYTt0aGlzLmRlY2F5PWEuZGVjYXk7dGhpcy50YXJnZXQ9YS50YXJnZXQuY2xvbmUoKTt0aGlzLnNoYWRvdz1hLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO2RpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVmMucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOmRpLGlzUG9pbnRMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihhLGMsZSl7Yz10aGlzLmNhbWVyYTt2YXIgZz10aGlzLm1hdHJpeCxyPXRoaXMuX2xpZ2h0UG9zaXRpb25Xb3JsZCx2PXRoaXMuX2xvb2tUYXJnZXQsej10aGlzLl9wcm9qU2NyZWVuTWF0cml4O3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEubWF0cml4V29ybGQpO2MucG9zaXRpb24uY29weShyKTt2LmNvcHkoYy5wb3NpdGlvbik7di5hZGQodGhpcy5fY3ViZURpcmVjdGlvbnNbZV0pO2MudXAuY29weSh0aGlzLl9jdWJlVXBzW2VdKTtjLmxvb2tBdCh2KTtjLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Zy5tYWtlVHJhbnNsYXRpb24oLXIueCwtci55LC1yLnopO3oubXVsdGlwbHlNYXRyaWNlcyhjLnByb2plY3Rpb25NYXRyaXgsYy5tYXRyaXhXb3JsZEludmVyc2UpO3RoaXMuX2ZydXN0dW0uc2V0RnJvbU1hdHJpeCh6KX19KTtRZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpRZyxpc1BvaW50TGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtKYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kaXN0YW5jZT1hLmRpc3RhbmNlO3RoaXMuZGVjYXk9YS5kZWNheTt0aGlzLnNoYWRvdz1hLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO2JnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoemIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6YmcsaXNPcnRob2dyYXBoaWNDYW1lcmE6ITAsY29weTpmdW5jdGlvbihhLGMpe3piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhLGMpO3RoaXMubGVmdD1hLmxlZnQ7dGhpcy5yaWdodD1hLnJpZ2h0O3RoaXMudG9wPWEudG9wO3RoaXMuYm90dG9tPWEuYm90dG9tO3RoaXMubmVhcj1hLm5lYXI7dGhpcy5mYXI9YS5mYXI7dGhpcy56b29tPWEuem9vbTt0aGlzLnZpZXc9bnVsbD09PWEudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sYS52aWV3KTtyZXR1cm4gdGhpc30sCnNldFZpZXdPZmZzZXQ6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe251bGw9PT10aGlzLnZpZXcmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pO3RoaXMudmlldy5lbmFibGVkPSEwO3RoaXMudmlldy5mdWxsV2lkdGg9YTt0aGlzLnZpZXcuZnVsbEhlaWdodD1jO3RoaXMudmlldy5vZmZzZXRYPWU7dGhpcy52aWV3Lm9mZnNldFk9Zzt0aGlzLnZpZXcud2lkdGg9cjt0aGlzLnZpZXcuaGVpZ2h0PXY7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LGNsZWFyVmlld09mZnNldDpmdW5jdGlvbigpe251bGwhPT10aGlzLnZpZXcmJih0aGlzLnZpZXcuZW5hYmxlZD0hMSk7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LHVwZGF0ZVByb2plY3Rpb25NYXRyaXg6ZnVuY3Rpb24oKXt2YXIgYT0odGhpcy5yaWdodC10aGlzLmxlZnQpLygyKnRoaXMuem9vbSksYz0odGhpcy50b3AtCnRoaXMuYm90dG9tKS8oMip0aGlzLnpvb20pLGU9KHRoaXMucmlnaHQrdGhpcy5sZWZ0KS8yLGc9KHRoaXMudG9wK3RoaXMuYm90dG9tKS8yLHI9ZS1hO2UrPWE7YT1nK2M7Yz1nLWM7aWYobnVsbCE9PXRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe2U9dGhpcy56b29tLyh0aGlzLnZpZXcud2lkdGgvdGhpcy52aWV3LmZ1bGxXaWR0aCk7Yz10aGlzLnpvb20vKHRoaXMudmlldy5oZWlnaHQvdGhpcy52aWV3LmZ1bGxIZWlnaHQpO3ZhciB2PSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvdGhpcy52aWV3LndpZHRoO2c9KHRoaXMudG9wLXRoaXMuYm90dG9tKS90aGlzLnZpZXcuaGVpZ2h0O3IrPXRoaXMudmlldy5vZmZzZXRYL2UqdjtlPXIrdGhpcy52aWV3LndpZHRoL2UqdjthLT10aGlzLnZpZXcub2Zmc2V0WS9jKmc7Yz1hLXRoaXMudmlldy5oZWlnaHQvYypnfXRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKHIsZSxhLGMsdGhpcy5uZWFyLHRoaXMuZmFyKTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5wcm9qZWN0aW9uTWF0cml4KX0sCnRvSlNPTjpmdW5jdGlvbihhKXthPUEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSk7YS5vYmplY3Quem9vbT10aGlzLnpvb207YS5vYmplY3QubGVmdD10aGlzLmxlZnQ7YS5vYmplY3QucmlnaHQ9dGhpcy5yaWdodDthLm9iamVjdC50b3A9dGhpcy50b3A7YS5vYmplY3QuYm90dG9tPXRoaXMuYm90dG9tO2Eub2JqZWN0Lm5lYXI9dGhpcy5uZWFyO2Eub2JqZWN0LmZhcj10aGlzLmZhcjtudWxsIT09dGhpcy52aWV3JiYoYS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpO3JldHVybiBhfX0pO1JnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVmMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6UmcsaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93OiEwLHVwZGF0ZU1hdHJpY2VzOmZ1bmN0aW9uKGEsYyxlKXtWYy5wcm90b3R5cGUudXBkYXRlTWF0cmljZXMuY2FsbCh0aGlzLGEsYyxlKX19KTtTZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpTZyxpc0RpcmVjdGlvbmFsTGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtKYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy50YXJnZXQ9YS50YXJnZXQuY2xvbmUoKTt0aGlzLnNoYWRvdz1hLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO1RnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSmIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VGcsaXNBbWJpZW50TGlnaHQ6ITB9KTtVZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlVnLGlzUmVjdEFyZWFMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLndpZHRoPWEud2lkdGg7dGhpcy5oZWlnaHQ9YS5oZWlnaHQ7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXthPUpiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0LndpZHRoPQp0aGlzLndpZHRoO2Eub2JqZWN0LmhlaWdodD10aGlzLmhlaWdodDtyZXR1cm4gYX19KTtWZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlZnLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcyx2PW5ldyB1YyhyLm1hbmFnZXIpO3Yuc2V0UGF0aChyLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope2Moci5wYXJzZShKU09OLnBhcnNlKHopKSl9LGUsZyl9LHBhcnNlOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoRSl7dm9pZCAwPT09ZVtFXSYmY29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUiLEUpO3JldHVybiBlW0VdfXZhciBlPXRoaXMudGV4dHVyZXMsZz1uZXcgS21bYS50eXBlXTt2b2lkIDAhPT1hLnV1aWQmJihnLnV1aWQ9YS51dWlkKTt2b2lkIDAhPT1hLm5hbWUmJihnLm5hbWU9YS5uYW1lKTt2b2lkIDAhPT1hLmNvbG9yJiZnLmNvbG9yLnNldEhleChhLmNvbG9yKTsKdm9pZCAwIT09YS5yb3VnaG5lc3MmJihnLnJvdWdobmVzcz1hLnJvdWdobmVzcyk7dm9pZCAwIT09YS5tZXRhbG5lc3MmJihnLm1ldGFsbmVzcz1hLm1ldGFsbmVzcyk7dm9pZCAwIT09YS5lbWlzc2l2ZSYmZy5lbWlzc2l2ZS5zZXRIZXgoYS5lbWlzc2l2ZSk7dm9pZCAwIT09YS5zcGVjdWxhciYmZy5zcGVjdWxhci5zZXRIZXgoYS5zcGVjdWxhcik7dm9pZCAwIT09YS5zaGluaW5lc3MmJihnLnNoaW5pbmVzcz1hLnNoaW5pbmVzcyk7dm9pZCAwIT09YS5jbGVhcmNvYXQmJihnLmNsZWFyY29hdD1hLmNsZWFyY29hdCk7dm9pZCAwIT09YS5jbGVhcmNvYXRSb3VnaG5lc3MmJihnLmNsZWFyY29hdFJvdWdobmVzcz1hLmNsZWFyY29hdFJvdWdobmVzcyk7dm9pZCAwIT09YS52ZXJ0ZXhDb2xvcnMmJihnLnZlcnRleENvbG9ycz1hLnZlcnRleENvbG9ycyk7dm9pZCAwIT09YS5mb2cmJihnLmZvZz1hLmZvZyk7dm9pZCAwIT09YS5mbGF0U2hhZGluZyYmKGcuZmxhdFNoYWRpbmc9YS5mbGF0U2hhZGluZyk7CnZvaWQgMCE9PWEuYmxlbmRpbmcmJihnLmJsZW5kaW5nPWEuYmxlbmRpbmcpO3ZvaWQgMCE9PWEuY29tYmluZSYmKGcuY29tYmluZT1hLmNvbWJpbmUpO3ZvaWQgMCE9PWEuc2lkZSYmKGcuc2lkZT1hLnNpZGUpO3ZvaWQgMCE9PWEub3BhY2l0eSYmKGcub3BhY2l0eT1hLm9wYWNpdHkpO3ZvaWQgMCE9PWEudHJhbnNwYXJlbnQmJihnLnRyYW5zcGFyZW50PWEudHJhbnNwYXJlbnQpO3ZvaWQgMCE9PWEuYWxwaGFUZXN0JiYoZy5hbHBoYVRlc3Q9YS5hbHBoYVRlc3QpO3ZvaWQgMCE9PWEuZGVwdGhUZXN0JiYoZy5kZXB0aFRlc3Q9YS5kZXB0aFRlc3QpO3ZvaWQgMCE9PWEuZGVwdGhXcml0ZSYmKGcuZGVwdGhXcml0ZT1hLmRlcHRoV3JpdGUpO3ZvaWQgMCE9PWEuY29sb3JXcml0ZSYmKGcuY29sb3JXcml0ZT1hLmNvbG9yV3JpdGUpO3ZvaWQgMCE9PWEud2lyZWZyYW1lJiYoZy53aXJlZnJhbWU9YS53aXJlZnJhbWUpO3ZvaWQgMCE9PWEud2lyZWZyYW1lTGluZXdpZHRoJiYoZy53aXJlZnJhbWVMaW5ld2lkdGg9CmEud2lyZWZyYW1lTGluZXdpZHRoKTt2b2lkIDAhPT1hLndpcmVmcmFtZUxpbmVjYXAmJihnLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwKTt2b2lkIDAhPT1hLndpcmVmcmFtZUxpbmVqb2luJiYoZy53aXJlZnJhbWVMaW5lam9pbj1hLndpcmVmcmFtZUxpbmVqb2luKTt2b2lkIDAhPT1hLnJvdGF0aW9uJiYoZy5yb3RhdGlvbj1hLnJvdGF0aW9uKTsxIT09YS5saW5ld2lkdGgmJihnLmxpbmV3aWR0aD1hLmxpbmV3aWR0aCk7dm9pZCAwIT09YS5kYXNoU2l6ZSYmKGcuZGFzaFNpemU9YS5kYXNoU2l6ZSk7dm9pZCAwIT09YS5nYXBTaXplJiYoZy5nYXBTaXplPWEuZ2FwU2l6ZSk7dm9pZCAwIT09YS5zY2FsZSYmKGcuc2NhbGU9YS5zY2FsZSk7dm9pZCAwIT09YS5wb2x5Z29uT2Zmc2V0JiYoZy5wb2x5Z29uT2Zmc2V0PWEucG9seWdvbk9mZnNldCk7dm9pZCAwIT09YS5wb2x5Z29uT2Zmc2V0RmFjdG9yJiYoZy5wb2x5Z29uT2Zmc2V0RmFjdG9yPWEucG9seWdvbk9mZnNldEZhY3Rvcik7CnZvaWQgMCE9PWEucG9seWdvbk9mZnNldFVuaXRzJiYoZy5wb2x5Z29uT2Zmc2V0VW5pdHM9YS5wb2x5Z29uT2Zmc2V0VW5pdHMpO3ZvaWQgMCE9PWEuc2tpbm5pbmcmJihnLnNraW5uaW5nPWEuc2tpbm5pbmcpO3ZvaWQgMCE9PWEubW9ycGhUYXJnZXRzJiYoZy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHMpO3ZvaWQgMCE9PWEubW9ycGhOb3JtYWxzJiYoZy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHMpO3ZvaWQgMCE9PWEuZGl0aGVyaW5nJiYoZy5kaXRoZXJpbmc9YS5kaXRoZXJpbmcpO3ZvaWQgMCE9PWEudmlzaWJsZSYmKGcudmlzaWJsZT1hLnZpc2libGUpO3ZvaWQgMCE9PWEudG9uZU1hcHBlZCYmKGcudG9uZU1hcHBlZD1hLnRvbmVNYXBwZWQpO3ZvaWQgMCE9PWEudXNlckRhdGEmJihnLnVzZXJEYXRhPWEudXNlckRhdGEpO2lmKHZvaWQgMCE9PWEudW5pZm9ybXMpZm9yKHZhciByIGluIGEudW5pZm9ybXMpe3ZhciB2PWEudW5pZm9ybXNbcl07Zy51bmlmb3Jtc1tyXT0Ke307c3dpdGNoKHYudHlwZSl7Y2FzZSAidCI6Zy51bmlmb3Jtc1tyXS52YWx1ZT1jKHYudmFsdWUpO2JyZWFrO2Nhc2UgImMiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBJKS5zZXRIZXgodi52YWx1ZSk7YnJlYWs7Y2FzZSAidjIiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBmKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7Y2FzZSAidjMiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBrKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7Y2FzZSAidjQiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBwKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7Y2FzZSAibTMiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyB0KS5mcm9tQXJyYXkodi52YWx1ZSk7Y2FzZSAibTQiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBxKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7ZGVmYXVsdDpnLnVuaWZvcm1zW3JdLnZhbHVlPXYudmFsdWV9fXZvaWQgMCE9PWEuZGVmaW5lcyYmKGcuZGVmaW5lcz1hLmRlZmluZXMpOwp2b2lkIDAhPT1hLnZlcnRleFNoYWRlciYmKGcudmVydGV4U2hhZGVyPWEudmVydGV4U2hhZGVyKTt2b2lkIDAhPT1hLmZyYWdtZW50U2hhZGVyJiYoZy5mcmFnbWVudFNoYWRlcj1hLmZyYWdtZW50U2hhZGVyKTtpZih2b2lkIDAhPT1hLmV4dGVuc2lvbnMpZm9yKHZhciB6IGluIGEuZXh0ZW5zaW9ucylnLmV4dGVuc2lvbnNbel09YS5leHRlbnNpb25zW3pdO3ZvaWQgMCE9PWEuc2hhZGluZyYmKGcuZmxhdFNoYWRpbmc9MT09PWEuc2hhZGluZyk7dm9pZCAwIT09YS5zaXplJiYoZy5zaXplPWEuc2l6ZSk7dm9pZCAwIT09YS5zaXplQXR0ZW51YXRpb24mJihnLnNpemVBdHRlbnVhdGlvbj1hLnNpemVBdHRlbnVhdGlvbik7dm9pZCAwIT09YS5tYXAmJihnLm1hcD1jKGEubWFwKSk7dm9pZCAwIT09YS5tYXRjYXAmJihnLm1hdGNhcD1jKGEubWF0Y2FwKSk7dm9pZCAwIT09YS5hbHBoYU1hcCYmKGcuYWxwaGFNYXA9YyhhLmFscGhhTWFwKSxnLnRyYW5zcGFyZW50PSEwKTt2b2lkIDAhPT0KYS5idW1wTWFwJiYoZy5idW1wTWFwPWMoYS5idW1wTWFwKSk7dm9pZCAwIT09YS5idW1wU2NhbGUmJihnLmJ1bXBTY2FsZT1hLmJ1bXBTY2FsZSk7dm9pZCAwIT09YS5ub3JtYWxNYXAmJihnLm5vcm1hbE1hcD1jKGEubm9ybWFsTWFwKSk7dm9pZCAwIT09YS5ub3JtYWxNYXBUeXBlJiYoZy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZSk7dm9pZCAwIT09YS5ub3JtYWxTY2FsZSYmKHI9YS5ub3JtYWxTY2FsZSwhMT09PUFycmF5LmlzQXJyYXkocikmJihyPVtyLHJdKSxnLm5vcm1hbFNjYWxlPShuZXcgZikuZnJvbUFycmF5KHIpKTt2b2lkIDAhPT1hLmRpc3BsYWNlbWVudE1hcCYmKGcuZGlzcGxhY2VtZW50TWFwPWMoYS5kaXNwbGFjZW1lbnRNYXApKTt2b2lkIDAhPT1hLmRpc3BsYWNlbWVudFNjYWxlJiYoZy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlKTt2b2lkIDAhPT1hLmRpc3BsYWNlbWVudEJpYXMmJihnLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzKTsKdm9pZCAwIT09YS5yb3VnaG5lc3NNYXAmJihnLnJvdWdobmVzc01hcD1jKGEucm91Z2huZXNzTWFwKSk7dm9pZCAwIT09YS5tZXRhbG5lc3NNYXAmJihnLm1ldGFsbmVzc01hcD1jKGEubWV0YWxuZXNzTWFwKSk7dm9pZCAwIT09YS5lbWlzc2l2ZU1hcCYmKGcuZW1pc3NpdmVNYXA9YyhhLmVtaXNzaXZlTWFwKSk7dm9pZCAwIT09YS5lbWlzc2l2ZUludGVuc2l0eSYmKGcuZW1pc3NpdmVJbnRlbnNpdHk9YS5lbWlzc2l2ZUludGVuc2l0eSk7dm9pZCAwIT09YS5zcGVjdWxhck1hcCYmKGcuc3BlY3VsYXJNYXA9YyhhLnNwZWN1bGFyTWFwKSk7dm9pZCAwIT09YS5lbnZNYXAmJihnLmVudk1hcD1jKGEuZW52TWFwKSk7dm9pZCAwIT09YS5lbnZNYXBJbnRlbnNpdHkmJihnLmVudk1hcEludGVuc2l0eT1hLmVudk1hcEludGVuc2l0eSk7dm9pZCAwIT09YS5yZWZsZWN0aXZpdHkmJihnLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eSk7dm9pZCAwIT09YS5yZWZyYWN0aW9uUmF0aW8mJihnLnJlZnJhY3Rpb25SYXRpbz0KYS5yZWZyYWN0aW9uUmF0aW8pO3ZvaWQgMCE9PWEubGlnaHRNYXAmJihnLmxpZ2h0TWFwPWMoYS5saWdodE1hcCkpO3ZvaWQgMCE9PWEubGlnaHRNYXBJbnRlbnNpdHkmJihnLmxpZ2h0TWFwSW50ZW5zaXR5PWEubGlnaHRNYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWEuYW9NYXAmJihnLmFvTWFwPWMoYS5hb01hcCkpO3ZvaWQgMCE9PWEuYW9NYXBJbnRlbnNpdHkmJihnLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWEuZ3JhZGllbnRNYXAmJihnLmdyYWRpZW50TWFwPWMoYS5ncmFkaWVudE1hcCkpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoZy5jbGVhcmNvYXROb3JtYWxNYXA9YyhhLmNsZWFyY29hdE5vcm1hbE1hcCkpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUmJihnLmNsZWFyY29hdE5vcm1hbFNjYWxlPShuZXcgZikuZnJvbUFycmF5KGEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpKTtyZXR1cm4gZ30sc2V0VGV4dHVyZXM6ZnVuY3Rpb24oYSl7dGhpcy50ZXh0dXJlcz0KYTtyZXR1cm4gdGhpc319KTt2YXIgUGk9e2RlY29kZVRleHQ6ZnVuY3Rpb24oYSl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgVGV4dERlY29kZXIpcmV0dXJuKG5ldyBUZXh0RGVjb2RlcikuZGVjb2RlKGEpO2Zvcih2YXIgYz0iIixlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKWMrPVN0cmluZy5mcm9tQ2hhckNvZGUoYVtlXSk7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGMpKX1jYXRjaChyKXtyZXR1cm4gY319LGV4dHJhY3RVcmxCYXNlOmZ1bmN0aW9uKGEpe3ZhciBjPWEubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4tMT09PWM/Ii4vIjphLnN1YnN0cigwLGMrMSl9fTtXZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOldnLGlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6ITAsY29weTpmdW5jdGlvbihhKXt2YS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5tYXhJbnN0YW5jZWRDb3VudD0KYS5tYXhJbnN0YW5jZWRDb3VudDtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXZhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLm1heEluc3RhbmNlZENvdW50PXRoaXMubWF4SW5zdGFuY2VkQ291bnQ7YS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PSEwO3JldHVybiBhfX0pO1hnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpYZyxpc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTohMCxjb3B5OmZ1bmN0aW9uKGEpe1EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMubWVzaFBlckF0dHJpYnV0ZT1hLm1lc2hQZXJBdHRyaWJ1dGU7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPVEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EubWVzaFBlckF0dHJpYnV0ZT0KdGhpcy5tZXNoUGVyQXR0cmlidXRlO2EuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITA7cmV0dXJuIGF9fSk7WWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpZZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj1uZXcgdWMoci5tYW5hZ2VyKTt2LnNldFBhdGgoci5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtjKHIucGFyc2UoSlNPTi5wYXJzZSh6KSkpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXt2YXIgYz1hLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk/bmV3IFdnOm5ldyB2YSxlPWEuZGF0YS5pbmRleDtpZih2b2lkIDAhPT1lKXt2YXIgZz1uZXcgUWlbZS50eXBlXShlLmFycmF5KTtjLnNldEluZGV4KG5ldyBRKGcsMSkpfWU9YS5kYXRhLmF0dHJpYnV0ZXM7Zm9yKHZhciByIGluIGUpe3ZhciB2PWVbcl07Zz1uZXcgUWlbdi50eXBlXSh2LmFycmF5KTtnPW5ldyAodi5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT8KWGc6USkoZyx2Lml0ZW1TaXplLHYubm9ybWFsaXplZCk7dm9pZCAwIT09di5uYW1lJiYoZy5uYW1lPXYubmFtZSk7Yy5hZGRBdHRyaWJ1dGUocixnKX12YXIgej1hLmRhdGEubW9ycGhBdHRyaWJ1dGVzO2lmKHopZm9yKHIgaW4geil7dmFyIEU9eltyXSxGPVtdO2U9MDtmb3IodmFyIEo9RS5sZW5ndGg7ZTxKO2UrKyl2PUVbZV0sZz1uZXcgUWlbdi50eXBlXSh2LmFycmF5KSxnPW5ldyBRKGcsdi5pdGVtU2l6ZSx2Lm5vcm1hbGl6ZWQpLHZvaWQgMCE9PXYubmFtZSYmKGcubmFtZT12Lm5hbWUpLEYucHVzaChnKTtjLm1vcnBoQXR0cmlidXRlc1tyXT1GfXI9YS5kYXRhLmdyb3Vwc3x8YS5kYXRhLmRyYXdjYWxsc3x8YS5kYXRhLm9mZnNldHM7aWYodm9pZCAwIT09cilmb3IoZT0wLHY9ci5sZW5ndGg7ZSE9PXY7KytlKWc9cltlXSxjLmFkZEdyb3VwKGcuc3RhcnQsZy5jb3VudCxnLm1hdGVyaWFsSW5kZXgpO2U9YS5kYXRhLmJvdW5kaW5nU3BoZXJlO3ZvaWQgMCE9PWUmJihyPW5ldyBrLAp2b2lkIDAhPT1lLmNlbnRlciYmci5mcm9tQXJyYXkoZS5jZW50ZXIpLGMuYm91bmRpbmdTcGhlcmU9bmV3IEcocixlLnJhZGl1cykpO2EubmFtZSYmKGMubmFtZT1hLm5hbWUpO2EudXNlckRhdGEmJihjLnVzZXJEYXRhPWEudXNlckRhdGEpO3JldHVybiBjfX0pO3ZhciBRaT17SW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXk6InVuZGVmaW5lZCIhPT10eXBlb2YgVWludDhDbGFtcGVkQXJyYXk/VWludDhDbGFtcGVkQXJyYXk6VWludDhBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF5LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheX07WmcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpaZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj0iIj09PXRoaXMucGF0aD9QaS5leHRyYWN0VXJsQmFzZShhKTp0aGlzLnBhdGg7dGhpcy5yZXNvdXJjZVBhdGg9CnRoaXMucmVzb3VyY2VQYXRofHx2O3Y9bmV3IHVjKHIubWFuYWdlcik7di5zZXRQYXRoKHRoaXMucGF0aCk7di5sb2FkKGEsZnVuY3Rpb24oeil7dmFyIEU9bnVsbDt0cnl7RT1KU09OLnBhcnNlKHopfWNhdGNoKEYpe3ZvaWQgMCE9PWcmJmcoRik7Y29uc29sZS5lcnJvcigiVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW4ndCBwYXJzZSAiK2ErIi4iLEYubWVzc2FnZSk7cmV0dXJufXo9RS5tZXRhZGF0YTt2b2lkIDA9PT16fHx2b2lkIDA9PT16LnR5cGV8fCJnZW9tZXRyeSI9PT16LnR5cGUudG9Mb3dlckNhc2UoKT9jb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIithKTpyLnBhcnNlKEUsYyl9LGUsZyl9LHBhcnNlOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5wYXJzZVNoYXBlKGEuc2hhcGVzKTtlPXRoaXMucGFyc2VHZW9tZXRyaWVzKGEuZ2VvbWV0cmllcyxlKTt2YXIgZz10aGlzLnBhcnNlSW1hZ2VzKGEuaW1hZ2VzLGZ1bmN0aW9uKCl7dm9pZCAwIT09CmMmJmMocil9KTtnPXRoaXMucGFyc2VUZXh0dXJlcyhhLnRleHR1cmVzLGcpO2c9dGhpcy5wYXJzZU1hdGVyaWFscyhhLm1hdGVyaWFscyxnKTt2YXIgcj10aGlzLnBhcnNlT2JqZWN0KGEub2JqZWN0LGUsZyk7YS5hbmltYXRpb25zJiYoci5hbmltYXRpb25zPXRoaXMucGFyc2VBbmltYXRpb25zKGEuYW5pbWF0aW9ucykpO3ZvaWQgMCE9PWEuaW1hZ2VzJiYwIT09YS5pbWFnZXMubGVuZ3RofHx2b2lkIDA9PT1jfHxjKHIpO3JldHVybiByfSxwYXJzZVNoYXBlOmZ1bmN0aW9uKGEpe3ZhciBjPXt9O2lmKHZvaWQgMCE9PWEpZm9yKHZhciBlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXt2YXIgcj0obmV3IENkKS5mcm9tSlNPTihhW2VdKTtjW3IudXVpZF09cn1yZXR1cm4gY30scGFyc2VHZW9tZXRyaWVzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9e307aWYodm9pZCAwIT09YSlmb3IodmFyIGc9bmV3IFlnLHI9MCx2PWEubGVuZ3RoO3I8djtyKyspe3ZhciB6PWFbcl07c3dpdGNoKHoudHlwZSl7Y2FzZSAiUGxhbmVHZW9tZXRyeSI6Y2FzZSAiUGxhbmVCdWZmZXJHZW9tZXRyeSI6dmFyIEU9Cm5ldyBnY1t6LnR5cGVdKHoud2lkdGgsei5oZWlnaHQsei53aWR0aFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMpO2JyZWFrO2Nhc2UgIkJveEdlb21ldHJ5IjpjYXNlICJCb3hCdWZmZXJHZW9tZXRyeSI6Y2FzZSAiQ3ViZUdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoud2lkdGgsei5oZWlnaHQsei5kZXB0aCx6LndpZHRoU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6LmRlcHRoU2VnbWVudHMpO2JyZWFrO2Nhc2UgIkNpcmNsZUdlb21ldHJ5IjpjYXNlICJDaXJjbGVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnJhZGl1cyx6LnNlZ21lbnRzLHoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJDeWxpbmRlckdlb21ldHJ5IjpjYXNlICJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzVG9wLHoucmFkaXVzQm90dG9tLHouaGVpZ2h0LHoucmFkaWFsU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6Lm9wZW5FbmRlZCwKei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIkNvbmVHZW9tZXRyeSI6Y2FzZSAiQ29uZUJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHouaGVpZ2h0LHoucmFkaWFsU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6Lm9wZW5FbmRlZCx6LnRoZXRhU3RhcnQsei50aGV0YUxlbmd0aCk7YnJlYWs7Y2FzZSAiU3BoZXJlR2VvbWV0cnkiOmNhc2UgIlNwaGVyZUJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHoud2lkdGhTZWdtZW50cyx6LmhlaWdodFNlZ21lbnRzLHoucGhpU3RhcnQsei5waGlMZW5ndGgsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIkRvZGVjYWhlZHJvbkdlb21ldHJ5IjpjYXNlICJEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSI6Y2FzZSAiSWNvc2FoZWRyb25HZW9tZXRyeSI6Y2FzZSAiSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSI6Y2FzZSAiT2N0YWhlZHJvbkdlb21ldHJ5IjpjYXNlICJPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIlRldHJhaGVkcm9uR2VvbWV0cnkiOmNhc2UgIlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOkU9Cm5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHouZGV0YWlsKTticmVhaztjYXNlICJSaW5nR2VvbWV0cnkiOmNhc2UgIlJpbmdCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LmlubmVyUmFkaXVzLHoub3V0ZXJSYWRpdXMsei50aGV0YVNlZ21lbnRzLHoucGhpU2VnbWVudHMsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIlRvcnVzR2VvbWV0cnkiOmNhc2UgIlRvcnVzQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGdjW3oudHlwZV0oei5yYWRpdXMsei50dWJlLHoucmFkaWFsU2VnbWVudHMsei50dWJ1bGFyU2VnbWVudHMsei5hcmMpO2JyZWFrO2Nhc2UgIlRvcnVzS25vdEdlb21ldHJ5IjpjYXNlICJUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnJhZGl1cyx6LnR1YmUsei50dWJ1bGFyU2VnbWVudHMsei5yYWRpYWxTZWdtZW50cyx6LnAsei5xKTticmVhaztjYXNlICJUdWJlR2VvbWV0cnkiOmNhc2UgIlR1YmVCdWZmZXJHZW9tZXRyeSI6RT0KbmV3IGdjW3oudHlwZV0oKG5ldyBPaVt6LnBhdGgudHlwZV0pLmZyb21KU09OKHoucGF0aCksei50dWJ1bGFyU2VnbWVudHMsei5yYWRpdXMsei5yYWRpYWxTZWdtZW50cyx6LmNsb3NlZCk7YnJlYWs7Y2FzZSAiTGF0aGVHZW9tZXRyeSI6Y2FzZSAiTGF0aGVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnBvaW50cyx6LnNlZ21lbnRzLHoucGhpU3RhcnQsei5waGlMZW5ndGgpO2JyZWFrO2Nhc2UgIlBvbHloZWRyb25HZW9tZXRyeSI6Y2FzZSAiUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoudmVydGljZXMsei5pbmRpY2VzLHoucmFkaXVzLHouZGV0YWlscyk7YnJlYWs7Y2FzZSAiU2hhcGVHZW9tZXRyeSI6Y2FzZSAiU2hhcGVCdWZmZXJHZW9tZXRyeSI6RT1bXTtmb3IodmFyIEY9MCxKPXouc2hhcGVzLmxlbmd0aDtGPEo7RisrKXt2YXIgUD1jW3ouc2hhcGVzW0ZdXTtFLnB1c2goUCl9RT1uZXcgZ2Nbei50eXBlXShFLHouY3VydmVTZWdtZW50cyk7CmJyZWFrO2Nhc2UgIkV4dHJ1ZGVHZW9tZXRyeSI6Y2FzZSAiRXh0cnVkZUJ1ZmZlckdlb21ldHJ5IjpFPVtdO0Y9MDtmb3IoSj16LnNoYXBlcy5sZW5ndGg7RjxKO0YrKylQPWNbei5zaGFwZXNbRl1dLEUucHVzaChQKTtGPXoub3B0aW9ucy5leHRydWRlUGF0aDt2b2lkIDAhPT1GJiYoei5vcHRpb25zLmV4dHJ1ZGVQYXRoPShuZXcgT2lbRi50eXBlXSkuZnJvbUpTT04oRikpO0U9bmV3IGdjW3oudHlwZV0oRSx6Lm9wdGlvbnMpO2JyZWFrO2Nhc2UgIkJ1ZmZlckdlb21ldHJ5IjpjYXNlICJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSI6RT1nLnBhcnNlKHopO2JyZWFrO2Nhc2UgIkdlb21ldHJ5IjoiVEhSRUUiaW4gd2luZG93JiYiTGVnYWN5SlNPTkxvYWRlciJpbiBUSFJFRT9FPShuZXcgVEhSRUUuTGVnYWN5SlNPTkxvYWRlcikucGFyc2Uoeix0aGlzLnJlc291cmNlUGF0aCkuZ2VvbWV0cnk6Y29uc29sZS5lcnJvcignVEhSRUUuT2JqZWN0TG9hZGVyOiBZb3UgaGF2ZSB0byBpbXBvcnQgTGVnYWN5SlNPTkxvYWRlciBpbiBvcmRlciBsb2FkIGdlb21ldHJ5IGRhdGEgb2YgdHlwZSAiR2VvbWV0cnkiLicpOwpicmVhaztkZWZhdWx0OmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlICInK3oudHlwZSsnIicpO2NvbnRpbnVlfUUudXVpZD16LnV1aWQ7dm9pZCAwIT09ei5uYW1lJiYoRS5uYW1lPXoubmFtZSk7ITA9PT1FLmlzQnVmZmVyR2VvbWV0cnkmJnZvaWQgMCE9PXoudXNlckRhdGEmJihFLnVzZXJEYXRhPXoudXNlckRhdGEpO2Vbei51dWlkXT1FfXJldHVybiBlfSxwYXJzZU1hdGVyaWFsczpmdW5jdGlvbihhLGMpe3ZhciBlPXt9LGc9e307aWYodm9pZCAwIT09YSl7dmFyIHI9bmV3IFZnO3Iuc2V0VGV4dHVyZXMoYyk7Yz0wO2Zvcih2YXIgdj1hLmxlbmd0aDtjPHY7YysrKXt2YXIgej1hW2NdO2lmKCJNdWx0aU1hdGVyaWFsIj09PXoudHlwZSl7Zm9yKHZhciBFPVtdLEY9MDtGPHoubWF0ZXJpYWxzLmxlbmd0aDtGKyspe3ZhciBKPXoubWF0ZXJpYWxzW0ZdO3ZvaWQgMD09PWVbSi51dWlkXSYmKGVbSi51dWlkXT1yLnBhcnNlKEopKTsKRS5wdXNoKGVbSi51dWlkXSl9Z1t6LnV1aWRdPUV9ZWxzZSB2b2lkIDA9PT1lW3oudXVpZF0mJihlW3oudXVpZF09ci5wYXJzZSh6KSksZ1t6LnV1aWRdPWVbei51dWlkXX19cmV0dXJuIGd9LHBhcnNlQW5pbWF0aW9uczpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz1hW2VdLHI9dGMucGFyc2UoZyk7dm9pZCAwIT09Zy51dWlkJiYoci51dWlkPWcudXVpZCk7Yy5wdXNoKHIpfXJldHVybiBjfSxwYXJzZUltYWdlczpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoUyl7Zy5tYW5hZ2VyLml0ZW1TdGFydChTKTtyZXR1cm4gdi5sb2FkKFMsZnVuY3Rpb24oKXtnLm1hbmFnZXIuaXRlbUVuZChTKX0sdm9pZCAwLGZ1bmN0aW9uKCl7Zy5tYW5hZ2VyLml0ZW1FcnJvcihTKTtnLm1hbmFnZXIuaXRlbUVuZChTKX0pfXZhciBnPXRoaXMscj17fTtpZih2b2lkIDAhPT1hJiYwPGEubGVuZ3RoKXtjPW5ldyAkaChjKTt2YXIgdj1uZXcgVWUoYyk7di5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTsKYz0wO2Zvcih2YXIgej1hLmxlbmd0aDtjPHo7YysrKXt2YXIgRT1hW2NdLEY9RS51cmw7aWYoQXJyYXkuaXNBcnJheShGKSl7cltFLnV1aWRdPVtdO2Zvcih2YXIgSj0wLFA9Ri5sZW5ndGg7SjxQO0orKyl7dmFyIFI9RltKXTtSPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KFIpP1I6Zy5yZXNvdXJjZVBhdGgrUjtyW0UudXVpZF0ucHVzaChlKFIpKX19ZWxzZSBSPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KEUudXJsKT9FLnVybDpnLnJlc291cmNlUGF0aCtFLnVybCxyW0UudXVpZF09ZShSKX19cmV0dXJuIHJ9LHBhcnNlVGV4dHVyZXM6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBlKEYsSil7aWYoIm51bWJlciI9PT10eXBlb2YgRilyZXR1cm4gRjtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlci5wYXJzZVRleHR1cmU6IENvbnN0YW50IHNob3VsZCBiZSBpbiBudW1lcmljIGZvcm0uIixGKTtyZXR1cm4gSltGXX12YXIgZz17fTtpZih2b2lkIDAhPT0KYSlmb3IodmFyIHI9MCx2PWEubGVuZ3RoO3I8djtyKyspe3ZhciB6PWFbcl07dm9pZCAwPT09ei5pbWFnZSYmY29uc29sZS53YXJuKCdUSFJFRS5PYmplY3RMb2FkZXI6IE5vICJpbWFnZSIgc3BlY2lmaWVkIGZvcicsei51dWlkKTt2b2lkIDA9PT1jW3ouaW1hZ2VdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGltYWdlIix6LmltYWdlKTt2YXIgRT1BcnJheS5pc0FycmF5KGNbei5pbWFnZV0pP25ldyBjZChjW3ouaW1hZ2VdKTpuZXcgbChjW3ouaW1hZ2VdKTtFLm5lZWRzVXBkYXRlPSEwO0UudXVpZD16LnV1aWQ7dm9pZCAwIT09ei5uYW1lJiYoRS5uYW1lPXoubmFtZSk7dm9pZCAwIT09ei5tYXBwaW5nJiYoRS5tYXBwaW5nPWUoei5tYXBwaW5nLExtKSk7dm9pZCAwIT09ei5vZmZzZXQmJkUub2Zmc2V0LmZyb21BcnJheSh6Lm9mZnNldCk7dm9pZCAwIT09ei5yZXBlYXQmJkUucmVwZWF0LmZyb21BcnJheSh6LnJlcGVhdCk7dm9pZCAwIT09ei5jZW50ZXImJgpFLmNlbnRlci5mcm9tQXJyYXkoei5jZW50ZXIpO3ZvaWQgMCE9PXoucm90YXRpb24mJihFLnJvdGF0aW9uPXoucm90YXRpb24pO3ZvaWQgMCE9PXoud3JhcCYmKEUud3JhcFM9ZSh6LndyYXBbMF0sc2spLEUud3JhcFQ9ZSh6LndyYXBbMV0sc2spKTt2b2lkIDAhPT16LmZvcm1hdCYmKEUuZm9ybWF0PXouZm9ybWF0KTt2b2lkIDAhPT16LnR5cGUmJihFLnR5cGU9ei50eXBlKTt2b2lkIDAhPT16LmVuY29kaW5nJiYoRS5lbmNvZGluZz16LmVuY29kaW5nKTt2b2lkIDAhPT16Lm1pbkZpbHRlciYmKEUubWluRmlsdGVyPWUoei5taW5GaWx0ZXIsdGspKTt2b2lkIDAhPT16Lm1hZ0ZpbHRlciYmKEUubWFnRmlsdGVyPWUoei5tYWdGaWx0ZXIsdGspKTt2b2lkIDAhPT16LmFuaXNvdHJvcHkmJihFLmFuaXNvdHJvcHk9ei5hbmlzb3Ryb3B5KTt2b2lkIDAhPT16LmZsaXBZJiYoRS5mbGlwWT16LmZsaXBZKTt2b2lkIDAhPT16LnByZW11bHRpcGx5QWxwaGEmJihFLnByZW11bHRpcGx5QWxwaGE9CnoucHJlbXVsdGlwbHlBbHBoYSk7dm9pZCAwIT09ei51bnBhY2tBbGlnbm1lbnQmJihFLnVucGFja0FsaWdubWVudD16LnVucGFja0FsaWdubWVudCk7Z1t6LnV1aWRdPUV9cmV0dXJuIGd9LHBhcnNlT2JqZWN0OmZ1bmN0aW9uKGEsYyxlKXtmdW5jdGlvbiBnKEope3ZvaWQgMD09PWNbSl0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnkiLEopO3JldHVybiBjW0pdfWZ1bmN0aW9uIHIoSil7aWYodm9pZCAwIT09Sil7aWYoQXJyYXkuaXNBcnJheShKKSl7Zm9yKHZhciBQPVtdLFI9MCxTPUoubGVuZ3RoO1I8UztSKyspe3ZhciBWPUpbUl07dm9pZCAwPT09ZVtWXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCIsVik7UC5wdXNoKGVbVl0pfXJldHVybiBQfXZvaWQgMD09PWVbSl0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLEopO3JldHVybiBlW0pdfX0Kc3dpdGNoKGEudHlwZSl7Y2FzZSAiU2NlbmUiOnZhciB2PW5ldyB5O3ZvaWQgMCE9PWEuYmFja2dyb3VuZCYmTnVtYmVyLmlzSW50ZWdlcihhLmJhY2tncm91bmQpJiYodi5iYWNrZ3JvdW5kPW5ldyBJKGEuYmFja2dyb3VuZCkpO3ZvaWQgMCE9PWEuZm9nJiYoIkZvZyI9PT1hLmZvZy50eXBlP3YuZm9nPW5ldyBBZyhhLmZvZy5jb2xvcixhLmZvZy5uZWFyLGEuZm9nLmZhcik6IkZvZ0V4cDIiPT09YS5mb2cudHlwZSYmKHYuZm9nPW5ldyB6ZyhhLmZvZy5jb2xvcixhLmZvZy5kZW5zaXR5KSkpO2JyZWFrO2Nhc2UgIlBlcnNwZWN0aXZlQ2FtZXJhIjp2PW5ldyB2YihhLmZvdixhLmFzcGVjdCxhLm5lYXIsYS5mYXIpO3ZvaWQgMCE9PWEuZm9jdXMmJih2LmZvY3VzPWEuZm9jdXMpO3ZvaWQgMCE9PWEuem9vbSYmKHYuem9vbT1hLnpvb20pO3ZvaWQgMCE9PWEuZmlsbUdhdWdlJiYodi5maWxtR2F1Z2U9YS5maWxtR2F1Z2UpO3ZvaWQgMCE9PWEuZmlsbU9mZnNldCYmKHYuZmlsbU9mZnNldD0KYS5maWxtT2Zmc2V0KTt2b2lkIDAhPT1hLnZpZXcmJih2LnZpZXc9T2JqZWN0LmFzc2lnbih7fSxhLnZpZXcpKTticmVhaztjYXNlICJPcnRob2dyYXBoaWNDYW1lcmEiOnY9bmV3IGJnKGEubGVmdCxhLnJpZ2h0LGEudG9wLGEuYm90dG9tLGEubmVhcixhLmZhcik7dm9pZCAwIT09YS56b29tJiYodi56b29tPWEuem9vbSk7dm9pZCAwIT09YS52aWV3JiYodi52aWV3PU9iamVjdC5hc3NpZ24oe30sYS52aWV3KSk7YnJlYWs7Y2FzZSAiQW1iaWVudExpZ2h0Ijp2PW5ldyBUZyhhLmNvbG9yLGEuaW50ZW5zaXR5KTticmVhaztjYXNlICJEaXJlY3Rpb25hbExpZ2h0Ijp2PW5ldyBTZyhhLmNvbG9yLGEuaW50ZW5zaXR5KTticmVhaztjYXNlICJQb2ludExpZ2h0Ijp2PW5ldyBRZyhhLmNvbG9yLGEuaW50ZW5zaXR5LGEuZGlzdGFuY2UsYS5kZWNheSk7YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6dj1uZXcgVWcoYS5jb2xvcixhLmludGVuc2l0eSxhLndpZHRoLGEuaGVpZ2h0KTticmVhazsKY2FzZSAiU3BvdExpZ2h0Ijp2PW5ldyBQZyhhLmNvbG9yLGEuaW50ZW5zaXR5LGEuZGlzdGFuY2UsYS5hbmdsZSxhLnBlbnVtYnJhLGEuZGVjYXkpO2JyZWFrO2Nhc2UgIkhlbWlzcGhlcmVMaWdodCI6dj1uZXcgTmcoYS5jb2xvcixhLmdyb3VuZENvbG9yLGEuaW50ZW5zaXR5KTticmVhaztjYXNlICJTa2lubmVkTWVzaCI6Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VPYmplY3QoKSBkb2VzIG5vdCBzdXBwb3J0IFNraW5uZWRNZXNoIHlldC4iKTtjYXNlICJNZXNoIjp2PWcoYS5nZW9tZXRyeSk7dmFyIHo9cihhLm1hdGVyaWFsKTt2PXYuYm9uZXMmJjA8di5ib25lcy5sZW5ndGg/bmV3IEJmKHYseik6bmV3IHhhKHYseik7dm9pZCAwIT09YS5kcmF3TW9kZSYmdi5zZXREcmF3TW9kZShhLmRyYXdNb2RlKTticmVhaztjYXNlICJMT0QiOnY9bmV3IEFmO2JyZWFrO2Nhc2UgIkxpbmUiOnY9bmV3IFZiKGcoYS5nZW9tZXRyeSkscihhLm1hdGVyaWFsKSxhLm1vZGUpOwpicmVhaztjYXNlICJMaW5lTG9vcCI6dj1uZXcgRGcoZyhhLmdlb21ldHJ5KSxyKGEubWF0ZXJpYWwpKTticmVhaztjYXNlICJMaW5lU2VnbWVudHMiOnY9bmV3IEliKGcoYS5nZW9tZXRyeSkscihhLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiUG9pbnRDbG91ZCI6Y2FzZSAiUG9pbnRzIjp2PW5ldyBDZShnKGEuZ2VvbWV0cnkpLHIoYS5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIlNwcml0ZSI6dj1uZXcgeWYocihhLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiR3JvdXAiOnY9bmV3IHVlO2JyZWFrO2RlZmF1bHQ6dj1uZXcgQX12LnV1aWQ9YS51dWlkO3ZvaWQgMCE9PWEubmFtZSYmKHYubmFtZT1hLm5hbWUpO3ZvaWQgMCE9PWEubWF0cml4Pyh2Lm1hdHJpeC5mcm9tQXJyYXkoYS5tYXRyaXgpLHZvaWQgMCE9PWEubWF0cml4QXV0b1VwZGF0ZSYmKHYubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGUpLHYubWF0cml4QXV0b1VwZGF0ZSYmdi5tYXRyaXguZGVjb21wb3NlKHYucG9zaXRpb24sCnYucXVhdGVybmlvbix2LnNjYWxlKSk6KHZvaWQgMCE9PWEucG9zaXRpb24mJnYucG9zaXRpb24uZnJvbUFycmF5KGEucG9zaXRpb24pLHZvaWQgMCE9PWEucm90YXRpb24mJnYucm90YXRpb24uZnJvbUFycmF5KGEucm90YXRpb24pLHZvaWQgMCE9PWEucXVhdGVybmlvbiYmdi5xdWF0ZXJuaW9uLmZyb21BcnJheShhLnF1YXRlcm5pb24pLHZvaWQgMCE9PWEuc2NhbGUmJnYuc2NhbGUuZnJvbUFycmF5KGEuc2NhbGUpKTt2b2lkIDAhPT1hLmNhc3RTaGFkb3cmJih2LmNhc3RTaGFkb3c9YS5jYXN0U2hhZG93KTt2b2lkIDAhPT1hLnJlY2VpdmVTaGFkb3cmJih2LnJlY2VpdmVTaGFkb3c9YS5yZWNlaXZlU2hhZG93KTthLnNoYWRvdyYmKHZvaWQgMCE9PWEuc2hhZG93LmJpYXMmJih2LnNoYWRvdy5iaWFzPWEuc2hhZG93LmJpYXMpLHZvaWQgMCE9PWEuc2hhZG93LnJhZGl1cyYmKHYuc2hhZG93LnJhZGl1cz1hLnNoYWRvdy5yYWRpdXMpLHZvaWQgMCE9PWEuc2hhZG93Lm1hcFNpemUmJgp2LnNoYWRvdy5tYXBTaXplLmZyb21BcnJheShhLnNoYWRvdy5tYXBTaXplKSx2b2lkIDAhPT1hLnNoYWRvdy5jYW1lcmEmJih2LnNoYWRvdy5jYW1lcmE9dGhpcy5wYXJzZU9iamVjdChhLnNoYWRvdy5jYW1lcmEpKSk7dm9pZCAwIT09YS52aXNpYmxlJiYodi52aXNpYmxlPWEudmlzaWJsZSk7dm9pZCAwIT09YS5mcnVzdHVtQ3VsbGVkJiYodi5mcnVzdHVtQ3VsbGVkPWEuZnJ1c3R1bUN1bGxlZCk7dm9pZCAwIT09YS5yZW5kZXJPcmRlciYmKHYucmVuZGVyT3JkZXI9YS5yZW5kZXJPcmRlcik7dm9pZCAwIT09YS51c2VyRGF0YSYmKHYudXNlckRhdGE9YS51c2VyRGF0YSk7dm9pZCAwIT09YS5sYXllcnMmJih2LmxheWVycy5tYXNrPWEubGF5ZXJzKTtpZih2b2lkIDAhPT1hLmNoaWxkcmVuKXt6PWEuY2hpbGRyZW47Zm9yKHZhciBFPTA7RTx6Lmxlbmd0aDtFKyspdi5hZGQodGhpcy5wYXJzZU9iamVjdCh6W0VdLGMsZSkpfWlmKCJMT0QiPT09YS50eXBlKWZvcihhPWEubGV2ZWxzLHo9CjA7ejxhLmxlbmd0aDt6Kyspe0U9YVt6XTt2YXIgRj12LmdldE9iamVjdEJ5UHJvcGVydHkoInV1aWQiLEUub2JqZWN0KTt2b2lkIDAhPT1GJiZ2LmFkZExldmVsKEYsRS5kaXN0YW5jZSl9cmV0dXJuIHZ9fSk7dmFyIExtPXtVVk1hcHBpbmc6MzAwLEN1YmVSZWZsZWN0aW9uTWFwcGluZzozMDEsQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOjMwMixFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzozMDMsRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6MzA0LFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nOjMwNSxDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzozMDYsQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6MzA3fSxzaz17UmVwZWF0V3JhcHBpbmc6MUUzLENsYW1wVG9FZGdlV3JhcHBpbmc6MTAwMSxNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOjEwMDJ9LHRrPXtOZWFyZXN0RmlsdGVyOjEwMDMsTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6MTAwNCxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOjEwMDUsCkxpbmVhckZpbHRlcjoxMDA2LExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6MTAwNyxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI6MTAwOH07ZWkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjplaSxzZXRPcHRpb25zOmZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucz1hO3JldHVybiB0aGlzfSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZvaWQgMD09PWEmJihhPSIiKTt2b2lkIDAhPT10aGlzLnBhdGgmJihhPXRoaXMucGF0aCthKTthPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGEpO3ZhciByPXRoaXMsdj1pZS5nZXQoYSk7aWYodm9pZCAwIT09dilyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyYmYyh2KTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sMCksdjtmZXRjaChhKS50aGVuKGZ1bmN0aW9uKHope3JldHVybiB6LmJsb2IoKX0pLnRoZW4oZnVuY3Rpb24oeil7cmV0dXJuIHZvaWQgMD09PQpyLm9wdGlvbnM/Y3JlYXRlSW1hZ2VCaXRtYXAoeik6Y3JlYXRlSW1hZ2VCaXRtYXAoeixyLm9wdGlvbnMpfSkudGhlbihmdW5jdGlvbih6KXtpZS5hZGQoYSx6KTtjJiZjKHopO3IubWFuYWdlci5pdGVtRW5kKGEpfSkuY2F0Y2goZnVuY3Rpb24oeil7ZyYmZyh6KTtyLm1hbmFnZXIuaXRlbUVycm9yKGEpO3IubWFuYWdlci5pdGVtRW5kKGEpfSk7ci5tYW5hZ2VyLml0ZW1TdGFydChhKX19KTtPYmplY3QuYXNzaWduKGZpLnByb3RvdHlwZSx7bW92ZVRvOmZ1bmN0aW9uKGEsYyl7dGhpcy5jdXJyZW50UGF0aD1uZXcgR2M7dGhpcy5zdWJQYXRocy5wdXNoKHRoaXMuY3VycmVudFBhdGgpO3RoaXMuY3VycmVudFBhdGgubW92ZVRvKGEsYyl9LGxpbmVUbzpmdW5jdGlvbihhLGMpe3RoaXMuY3VycmVudFBhdGgubGluZVRvKGEsYyl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKGEsYyxlLGcpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKGEsCmMsZSxnLHIsdil7dGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKGEsYyxlLGcscix2KX0sc3BsaW5lVGhydTpmdW5jdGlvbihhKXt0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUoYSl9LHRvU2hhcGVzOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZShmYSl7Zm9yKHZhciByYT1bXSxwYT0wLHFhPWZhLmxlbmd0aDtwYTxxYTtwYSsrKXt2YXIgdWE9ZmFbcGFdLG9hPW5ldyBDZDtvYS5jdXJ2ZXM9dWEuY3VydmVzO3JhLnB1c2gob2EpfXJldHVybiByYX1mdW5jdGlvbiBnKGZhLHJhKXtmb3IodmFyIHBhPXJhLmxlbmd0aCxxYT0hMSx1YT1wYS0xLG9hPTA7b2E8cGE7dWE9b2ErKyl7dmFyIHRhPXJhW3VhXSxCYT1yYVtvYV0sVGE9QmEueC10YS54LFVhPUJhLnktdGEueTtpZihNYXRoLmFicyhVYSk+TnVtYmVyLkVQU0lMT04pe2lmKDA+VWEmJih0YT1yYVtvYV0sVGE9LVRhLEJhPXJhW3VhXSxVYT0tVWEpLCEoZmEueTx0YS55fHxmYS55PkJhLnkpKWlmKGZhLnk9PT10YS55KXtpZihmYS54PT09CnRhLngpcmV0dXJuITB9ZWxzZXt1YT1VYSooZmEueC10YS54KS1UYSooZmEueS10YS55KTtpZigwPT09dWEpcmV0dXJuITA7MD51YXx8KHFhPSFxYSl9fWVsc2UgaWYoZmEueT09PXRhLnkmJihCYS54PD1mYS54JiZmYS54PD10YS54fHx0YS54PD1mYS54JiZmYS54PD1CYS54KSlyZXR1cm4hMH1yZXR1cm4gcWF9dmFyIHI9ZWQuaXNDbG9ja1dpc2Usdj10aGlzLnN1YlBhdGhzO2lmKDA9PT12Lmxlbmd0aClyZXR1cm5bXTtpZighMD09PWMpcmV0dXJuIGUodik7Yz1bXTtpZigxPT09di5sZW5ndGgpe3ZhciB6PXZbMF07dmFyIEU9bmV3IENkO0UuY3VydmVzPXouY3VydmVzO2MucHVzaChFKTtyZXR1cm4gY312YXIgRj0hcih2WzBdLmdldFBvaW50cygpKTtGPWE/IUY6RjtFPVtdO3ZhciBKPVtdLFA9W10sUj0wO0pbUl09dm9pZCAwO1BbUl09W107Zm9yKHZhciBTPTAsVj12Lmxlbmd0aDtTPFY7UysrKXt6PXZbU107dmFyIFc9ei5nZXRQb2ludHMoKTt2YXIgaGE9cihXKTsoaGE9YT8haGE6CmhhKT8oIUYmJkpbUl0mJlIrKyxKW1JdPXtzOm5ldyBDZCxwOld9LEpbUl0ucy5jdXJ2ZXM9ei5jdXJ2ZXMsRiYmUisrLFBbUl09W10pOlBbUl0ucHVzaCh7aDp6LHA6V1swXX0pfWlmKCFKWzBdKXJldHVybiBlKHYpO2lmKDE8Si5sZW5ndGgpe1M9ITE7YT1bXTtyPTA7Zm9yKHY9Si5sZW5ndGg7cjx2O3IrKylFW3JdPVtdO3I9MDtmb3Iodj1KLmxlbmd0aDtyPHY7cisrKWZvcih6PVBbcl0saGE9MDtoYTx6Lmxlbmd0aDtoYSsrKXtGPXpbaGFdO1I9ITA7Zm9yKFc9MDtXPEoubGVuZ3RoO1crKylnKEYucCxKW1ddLnApJiYociE9PVcmJmEucHVzaCh7ZnJvbXM6cix0b3M6Vyxob2xlOmhhfSksUj8oUj0hMSxFW1ddLnB1c2goRikpOlM9ITApO1ImJkVbcl0ucHVzaChGKX0wPGEubGVuZ3RoJiYoU3x8KFA9RSkpfVM9MDtmb3Iocj1KLmxlbmd0aDtTPHI7UysrKWZvcihFPUpbU10ucyxjLnB1c2goRSksYT1QW1NdLHY9MCx6PWEubGVuZ3RoO3Y8ejt2KyspRS5ob2xlcy5wdXNoKGFbdl0uaCk7CnJldHVybiBjfX0pO09iamVjdC5hc3NpZ24oZ2kucHJvdG90eXBlLHtpc0ZvbnQ6ITAsZ2VuZXJhdGVTaGFwZXM6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0xMDApO3ZhciBlPVtdO2E9dm0oYSxjLHRoaXMuZGF0YSk7Yz0wO2Zvcih2YXIgZz1hLmxlbmd0aDtjPGc7YysrKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGUsYVtjXS50b1NoYXBlcygpKTtyZXR1cm4gZX19KTtoaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmhpLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcyx2PW5ldyB1Yyh0aGlzLm1hbmFnZXIpO3Yuc2V0UGF0aCh0aGlzLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope3RyeXt2YXIgRT1KU09OLnBhcnNlKHopfWNhdGNoKEYpe2NvbnNvbGUud2FybigiVEhSRUUuRm9udExvYWRlcjogdHlwZWZhY2UuanMgc3VwcG9ydCBpcyBiZWluZyBkZXByZWNhdGVkLiBVc2UgdHlwZWZhY2UuanNvbiBpbnN0ZWFkLiIpLApFPUpTT04ucGFyc2Uoei5zdWJzdHJpbmcoNjUsei5sZW5ndGgtMikpfXo9ci5wYXJzZShFKTtjJiZjKHopfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IGdpKGEpfX0pO3ZhciB5aCxtaT17Z2V0Q29udGV4dDpmdW5jdGlvbigpe3ZvaWQgMD09PXloJiYoeWg9bmV3ICh3aW5kb3cuQXVkaW9Db250ZXh0fHx3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0KSk7cmV0dXJuIHlofSxzZXRDb250ZXh0OmZ1bmN0aW9uKGEpe3loPWF9fTskZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOiRnLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9bmV3IHVjKHRoaXMubWFuYWdlcik7ci5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7ci5zZXRQYXRoKHRoaXMucGF0aCk7ci5sb2FkKGEsZnVuY3Rpb24odil7dj12LnNsaWNlKDApO21pLmdldENvbnRleHQoKS5kZWNvZGVBdWRpb0RhdGEodixmdW5jdGlvbih6KXtjKHopfSl9LAplLGcpfX0pO09iamVjdC5hc3NpZ24oYWgucHJvdG90eXBlLHtpc1NwaGVyaWNhbEhhcm1vbmljczM6ITAsc2V0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzk+YztjKyspdGhpcy5jb2VmZmljaWVudHNbY10uY29weShhW2NdKTtyZXR1cm4gdGhpc30semVybzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wOzk+YTthKyspdGhpcy5jb2VmZmljaWVudHNbYV0uc2V0KDAsMCwwKTtyZXR1cm4gdGhpc30sZ2V0QXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLngsZz1hLnk7YT1hLno7dmFyIHI9dGhpcy5jb2VmZmljaWVudHM7Yy5jb3B5KHJbMF0pLm11bHRpcGx5U2NhbGFyKC4yODIwOTUpO2MuYWRkU2NhbGUoclsxXSwuNDg4NjAzKmcpO2MuYWRkU2NhbGUoclsyXSwuNDg4NjAzKmEpO2MuYWRkU2NhbGUoclszXSwuNDg4NjAzKmUpO2MuYWRkU2NhbGUocls0XSwxLjA5MjU0OCplKmcpO2MuYWRkU2NhbGUocls1XSwxLjA5MjU0OCpnKmEpO2MuYWRkU2NhbGUocls2XSwuMzE1MzkyKigzKmEqYS0xKSk7CmMuYWRkU2NhbGUocls3XSwxLjA5MjU0OCplKmEpO2MuYWRkU2NhbGUocls4XSwuNTQ2Mjc0KihlKmUtZypnKSk7cmV0dXJuIGN9LGdldElycmFkaWFuY2VBdDpmdW5jdGlvbihhLGMpe3ZhciBlPWEueCxnPWEueTthPWEuejt2YXIgcj10aGlzLmNvZWZmaWNpZW50cztjLmNvcHkoclswXSkubXVsdGlwbHlTY2FsYXIoLjg4NjIyNyk7Yy5hZGRTY2FsZShyWzFdLDEuMDIzMzI4KmcpO2MuYWRkU2NhbGUoclsyXSwxLjAyMzMyOCphKTtjLmFkZFNjYWxlKHJbM10sMS4wMjMzMjgqZSk7Yy5hZGRTY2FsZShyWzRdLC44NTgwODYqZSpnKTtjLmFkZFNjYWxlKHJbNV0sLjg1ODA4NipnKmEpO2MuYWRkU2NhbGUocls2XSwuNzQzMTI1KmEqYS0uMjQ3NzA4KTtjLmFkZFNjYWxlKHJbN10sLjg1ODA4NiplKmEpO2MuYWRkU2NhbGUocls4XSwuNDI5MDQzKihlKmUtZypnKSk7cmV0dXJuIGN9LGFkZDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuY29lZmZpY2llbnRzW2NdLmFkZChhLmNvZWZmaWNpZW50c1tjXSk7CnJldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuY29lZmZpY2llbnRzW2NdLm11bHRpcGx5U2NhbGFyKGEpO3JldHVybiB0aGlzfSxsZXJwOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5sZXJwKGEuY29lZmZpY2llbnRzW2VdLGMpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7OT5jO2MrKylpZighdGhpcy5jb2VmZmljaWVudHNbY10uZXF1YWxzKGEuY29lZmZpY2llbnRzW2NdKSlyZXR1cm4hMTtyZXR1cm4hMH0sY29weTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXQoYS5jb2VmZmljaWVudHMpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPXRoaXMuY29lZmZpY2llbnRzLGc9MDs5Pmc7ZysrKWVbZ10uZnJvbUFycmF5KGEsCmMrMypnKTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTtmb3IodmFyIGU9dGhpcy5jb2VmZmljaWVudHMsZz0wOzk+ZztnKyspZVtnXS50b0FycmF5KGEsYyszKmcpO3JldHVybiBhfX0pO09iamVjdC5hc3NpZ24oYWgse2dldEJhc2lzQXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLngsZz1hLnk7YT1hLno7Y1swXT0uMjgyMDk1O2NbMV09LjQ4ODYwMypnO2NbMl09LjQ4ODYwMyphO2NbM109LjQ4ODYwMyplO2NbNF09MS4wOTI1NDgqZSpnO2NbNV09MS4wOTI1NDgqZyphO2NbNl09LjMxNTM5MiooMyphKmEtMSk7Y1s3XT0xLjA5MjU0OCplKmE7Y1s4XT0uNTQ2Mjc0KihlKmUtZypnKX19KTtIYy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkhjLGlzTGlnaHRQcm9iZTohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5zaC5jb3B5KGEuc2gpO3RoaXMuaW50ZW5zaXR5PWEuaW50ZW5zaXR5O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7cmV0dXJuIEpiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpfX0pO2lpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6aWksaXNIZW1pc3BoZXJlTGlnaHRQcm9iZTohMCxjb3B5OmZ1bmN0aW9uKGEpe0hjLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGEpe3JldHVybiBIYy5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKX19KTtqaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEhjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmppLGlzQW1iaWVudExpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihhKXtIYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXtyZXR1cm4gSGMucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsCmEpfX0pO3ZhciB1az1uZXcgcSx2az1uZXcgcTtPYmplY3QuYXNzaWduKFFqLnByb3RvdHlwZSx7dXBkYXRlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2NhY2hlO2lmKGMuZm9jdXMhPT1hLmZvY3VzfHxjLmZvdiE9PWEuZm92fHxjLmFzcGVjdCE9PWEuYXNwZWN0KnRoaXMuYXNwZWN0fHxjLm5lYXIhPT1hLm5lYXJ8fGMuZmFyIT09YS5mYXJ8fGMuem9vbSE9PWEuem9vbXx8Yy5leWVTZXAhPT10aGlzLmV5ZVNlcCl7Yy5mb2N1cz1hLmZvY3VzO2MuZm92PWEuZm92O2MuYXNwZWN0PWEuYXNwZWN0KnRoaXMuYXNwZWN0O2MubmVhcj1hLm5lYXI7Yy5mYXI9YS5mYXI7Yy56b29tPWEuem9vbTtjLmV5ZVNlcD10aGlzLmV5ZVNlcDt2YXIgZT1hLnByb2plY3Rpb25NYXRyaXguY2xvbmUoKSxnPWMuZXllU2VwLzIscj1nKmMubmVhci9jLmZvY3VzLHY9Yy5uZWFyKk1hdGgudGFuKGhiLkRFRzJSQUQqYy5mb3YqLjUpL2Muem9vbTt2ay5lbGVtZW50c1sxMl09LWc7dWsuZWxlbWVudHNbMTJdPQpnO2c9LXYqYy5hc3BlY3Qrcjt2YXIgej12KmMuYXNwZWN0K3I7ZS5lbGVtZW50c1swXT0yKmMubmVhci8oei1nKTtlLmVsZW1lbnRzWzhdPSh6K2cpLyh6LWcpO3RoaXMuY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmNvcHkoZSk7Zz0tdipjLmFzcGVjdC1yO3o9dipjLmFzcGVjdC1yO2UuZWxlbWVudHNbMF09MipjLm5lYXIvKHotZyk7ZS5lbGVtZW50c1s4XT0oeitnKS8oei1nKTt0aGlzLmNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5jb3B5KGUpfXRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KGEubWF0cml4V29ybGQpLm11bHRpcGx5KHZrKTt0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weShhLm1hdHJpeFdvcmxkKS5tdWx0aXBseSh1ayl9fSk7T2JqZWN0LmFzc2lnbihraS5wcm90b3R5cGUse3N0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5vbGRUaW1lPXRoaXMuc3RhcnRUaW1lPSgidW5kZWZpbmVkIj09PXR5cGVvZiBwZXJmb3JtYW5jZT9EYXRlOnBlcmZvcm1hbmNlKS5ub3coKTsKdGhpcy5lbGFwc2VkVGltZT0wO3RoaXMucnVubmluZz0hMH0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZ2V0RWxhcHNlZFRpbWUoKTt0aGlzLmF1dG9TdGFydD10aGlzLnJ1bm5pbmc9ITF9LGdldEVsYXBzZWRUaW1lOmZ1bmN0aW9uKCl7dGhpcy5nZXREZWx0YSgpO3JldHVybiB0aGlzLmVsYXBzZWRUaW1lfSxnZXREZWx0YTpmdW5jdGlvbigpe3ZhciBhPTA7aWYodGhpcy5hdXRvU3RhcnQmJiF0aGlzLnJ1bm5pbmcpcmV0dXJuIHRoaXMuc3RhcnQoKSwwO2lmKHRoaXMucnVubmluZyl7dmFyIGM9KCJ1bmRlZmluZWQiPT09dHlwZW9mIHBlcmZvcm1hbmNlP0RhdGU6cGVyZm9ybWFuY2UpLm5vdygpO2E9KGMtdGhpcy5vbGRUaW1lKS8xRTM7dGhpcy5vbGRUaW1lPWM7dGhpcy5lbGFwc2VkVGltZSs9YX1yZXR1cm4gYX19KTt2YXIgamU9bmV3IGssd2s9bmV3IGgsTW09bmV3IGssa2U9bmV3IGs7bGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpsaSxnZXRJbnB1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW59LHJlbW92ZUZpbHRlcjpmdW5jdGlvbigpe251bGwhPT10aGlzLmZpbHRlciYmKHRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuZmlsdGVyKSx0aGlzLmZpbHRlci5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5nYWluLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmZpbHRlcj1udWxsKTtyZXR1cm4gdGhpc30sZ2V0RmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyfSxzZXRGaWx0ZXI6ZnVuY3Rpb24oYSl7bnVsbCE9PXRoaXMuZmlsdGVyPyh0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pKTp0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO3RoaXMuZmlsdGVyPWE7dGhpcy5nYWluLmNvbm5lY3QodGhpcy5maWx0ZXIpOwp0aGlzLmZpbHRlci5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7cmV0dXJuIHRoaXN9LGdldE1hc3RlclZvbHVtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX0sc2V0TWFzdGVyVm9sdW1lOmZ1bmN0aW9uKGEpe3RoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZShhLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpO3JldHVybiB0aGlzfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSk7YT10aGlzLmNvbnRleHQubGlzdGVuZXI7dmFyIGM9dGhpcy51cDt0aGlzLnRpbWVEZWx0YT10aGlzLl9jbG9jay5nZXREZWx0YSgpO3RoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKGplLHdrLE1tKTtrZS5zZXQoMCwwLC0xKS5hcHBseVF1YXRlcm5pb24od2spO2lmKGEucG9zaXRpb25YKXt2YXIgZT10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy50aW1lRGVsdGE7CmEucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGplLngsZSk7YS5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoamUueSxlKTthLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShqZS56LGUpO2EuZm9yd2FyZFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoa2UueCxlKTthLmZvcndhcmRZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGtlLnksZSk7YS5mb3J3YXJkWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShrZS56LGUpO2EudXBYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGMueCxlKTthLnVwWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShjLnksZSk7YS51cFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoYy56LGUpfWVsc2UgYS5zZXRQb3NpdGlvbihqZS54LGplLnksamUueiksYS5zZXRPcmllbnRhdGlvbihrZS54LGtlLnksa2UueixjLngsYy55LGMueil9fSk7V2UucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpXZSxnZXRPdXRwdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWlufSxzZXROb2RlU291cmNlOmZ1bmN0aW9uKGEpe3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSExO3RoaXMuc291cmNlVHlwZT0iYXVkaW9Ob2RlIjt0aGlzLnNvdXJjZT1hO3RoaXMuY29ubmVjdCgpO3JldHVybiB0aGlzfSxzZXRNZWRpYUVsZW1lbnRTb3VyY2U6ZnVuY3Rpb24oYSl7dGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9ITE7dGhpcy5zb3VyY2VUeXBlPSJtZWRpYU5vZGUiO3RoaXMuc291cmNlPXRoaXMuY29udGV4dC5jcmVhdGVNZWRpYUVsZW1lbnRTb3VyY2UoYSk7dGhpcy5jb25uZWN0KCk7cmV0dXJuIHRoaXN9LHNldEJ1ZmZlcjpmdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcj1hO3RoaXMuc291cmNlVHlwZT0iYnVmZmVyIjt0aGlzLmF1dG9wbGF5JiZ0aGlzLnBsYXkoKTtyZXR1cm4gdGhpc30scGxheTpmdW5jdGlvbigpe2lmKCEwPT09dGhpcy5pc1BsYXlpbmcpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLiIpOwplbHNlIGlmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtlbHNle3ZhciBhPXRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTthLmJ1ZmZlcj10aGlzLmJ1ZmZlcjthLmxvb3A9dGhpcy5sb29wO2Eub25lbmRlZD10aGlzLm9uRW5kZWQuYmluZCh0aGlzKTt0aGlzLnN0YXJ0VGltZT10aGlzLmNvbnRleHQuY3VycmVudFRpbWU7YS5zdGFydCh0aGlzLnN0YXJ0VGltZSx0aGlzLm9mZnNldCx0aGlzLmR1cmF0aW9uKTt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnNvdXJjZT1hO3RoaXMuc2V0RGV0dW5lKHRoaXMuZGV0dW5lKTt0aGlzLnNldFBsYXliYWNrUmF0ZSh0aGlzLnBsYXliYWNrUmF0ZSk7cmV0dXJuIHRoaXMuY29ubmVjdCgpfX0scGF1c2U6ZnVuY3Rpb24oKXtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7CmVsc2UgcmV0dXJuITA9PT10aGlzLmlzUGxheWluZyYmKHRoaXMuc291cmNlLnN0b3AoKSx0aGlzLnNvdXJjZS5vbmVuZGVkPW51bGwsdGhpcy5vZmZzZXQrPSh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUtdGhpcy5zdGFydFRpbWUpKnRoaXMucGxheWJhY2tSYXRlLHRoaXMuaXNQbGF5aW5nPSExKSx0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2UgcmV0dXJuIHRoaXMuc291cmNlLnN0b3AoKSx0aGlzLnNvdXJjZS5vbmVuZGVkPW51bGwsdGhpcy5vZmZzZXQ9MCx0aGlzLmlzUGxheWluZz0hMSx0aGlzfSxjb25uZWN0OmZ1bmN0aW9uKCl7aWYoMDx0aGlzLmZpbHRlcnMubGVuZ3RoKXt0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuZmlsdGVyc1swXSk7Zm9yKHZhciBhPTEsYz10aGlzLmZpbHRlcnMubGVuZ3RoO2E8YzthKyspdGhpcy5maWx0ZXJzW2EtCjFdLmNvbm5lY3QodGhpcy5maWx0ZXJzW2FdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpc30sZGlzY29ubmVjdDpmdW5jdGlvbigpe2lmKDA8dGhpcy5maWx0ZXJzLmxlbmd0aCl7dGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2Zvcih2YXIgYT0xLGM9dGhpcy5maWx0ZXJzLmxlbmd0aDthPGM7YSsrKXRoaXMuZmlsdGVyc1thLTFdLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzW2FdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpc30sZ2V0RmlsdGVyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcnN9LHNldEZpbHRlcnM6ZnVuY3Rpb24oYSl7YXx8CihhPVtdKTshMD09PXRoaXMuaXNQbGF5aW5nPyh0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZpbHRlcnM9YSx0aGlzLmNvbm5lY3QoKSk6dGhpcy5maWx0ZXJzPWE7cmV0dXJuIHRoaXN9LHNldERldHVuZTpmdW5jdGlvbihhKXt0aGlzLmRldHVuZT1hO2lmKHZvaWQgMCE9PXRoaXMuc291cmNlLmRldHVuZSlyZXR1cm4hMD09PXRoaXMuaXNQbGF5aW5nJiZ0aGlzLnNvdXJjZS5kZXR1bmUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMuZGV0dW5lLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9LGdldERldHVuZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRldHVuZX0sZ2V0RmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWzBdfSxzZXRGaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0RmlsdGVycyhhP1thXTpbXSl9LHNldFBsYXliYWNrUmF0ZTpmdW5jdGlvbihhKXtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7CmVsc2UgcmV0dXJuIHRoaXMucGxheWJhY2tSYXRlPWEsITA9PT10aGlzLmlzUGxheWluZyYmdGhpcy5zb3VyY2UucGxheWJhY2tSYXRlLnNldFRhcmdldEF0VGltZSh0aGlzLnBsYXliYWNrUmF0ZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfSxnZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGV9LG9uRW5kZWQ6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMX0sZ2V0TG9vcDpmdW5jdGlvbigpe3JldHVybiExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2w/KGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIiksITEpOnRoaXMubG9vcH0sc2V0TG9vcDpmdW5jdGlvbihhKXtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7ZWxzZSByZXR1cm4gdGhpcy5sb29wPQphLCEwPT09dGhpcy5pc1BsYXlpbmcmJih0aGlzLnNvdXJjZS5sb29wPXRoaXMubG9vcCksdGhpc30sZ2V0Vm9sdW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlfSxzZXRWb2x1bWU6ZnVuY3Rpb24oYSl7dGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKGEsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSk7cmV0dXJuIHRoaXN9fSk7dmFyIGxlPW5ldyBrLHhrPW5ldyBoLE5tPW5ldyBrLG1lPW5ldyBrO25pLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoV2UucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6bmksZ2V0T3V0cHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyfSxnZXRSZWZEaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZX0sc2V0UmVmRGlzdGFuY2U6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIucmVmRGlzdGFuY2U9YTtyZXR1cm4gdGhpc30sZ2V0Um9sbG9mZkZhY3RvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yfSwKc2V0Um9sbG9mZkZhY3RvcjpmdW5jdGlvbihhKXt0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yPWE7cmV0dXJuIHRoaXN9LGdldERpc3RhbmNlTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbH0sc2V0RGlzdGFuY2VNb2RlbDpmdW5jdGlvbihhKXt0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsPWE7cmV0dXJuIHRoaXN9LGdldE1heERpc3RhbmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlfSxzZXRNYXhEaXN0YW5jZTpmdW5jdGlvbihhKXt0aGlzLnBhbm5lci5tYXhEaXN0YW5jZT1hO3JldHVybiB0aGlzfSxzZXREaXJlY3Rpb25hbENvbmU6ZnVuY3Rpb24oYSxjLGUpe3RoaXMucGFubmVyLmNvbmVJbm5lckFuZ2xlPWE7dGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGU9Yzt0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluPWU7cmV0dXJuIHRoaXN9LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcywKYSk7aWYoITAhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbHx8ITEhPT10aGlzLmlzUGxheWluZylpZih0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShsZSx4ayxObSksbWUuc2V0KDAsMCwxKS5hcHBseVF1YXRlcm5pb24oeGspLGE9dGhpcy5wYW5uZXIsYS5wb3NpdGlvblgpe3ZhciBjPXRoaXMuY29udGV4dC5jdXJyZW50VGltZSt0aGlzLmxpc3RlbmVyLnRpbWVEZWx0YTthLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShsZS54LGMpO2EucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGxlLnksYyk7YS5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobGUueixjKTthLm9yaWVudGF0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShtZS54LGMpO2Eub3JpZW50YXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG1lLnksYyk7YS5vcmllbnRhdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobWUueixjKX1lbHNlIGEuc2V0UG9zaXRpb24obGUueCwKbGUueSxsZS56KSxhLnNldE9yaWVudGF0aW9uKG1lLngsbWUueSxtZS56KX19KTtPYmplY3QuYXNzaWduKG9pLnByb3RvdHlwZSx7Z2V0RnJlcXVlbmN5RGF0YTpmdW5jdGlvbigpe3RoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEodGhpcy5kYXRhKTtyZXR1cm4gdGhpcy5kYXRhfSxnZXRBdmVyYWdlRnJlcXVlbmN5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYz10aGlzLmdldEZyZXF1ZW5jeURhdGEoKSxlPTA7ZTxjLmxlbmd0aDtlKyspYSs9Y1tlXTtyZXR1cm4gYS9jLmxlbmd0aH19KTtPYmplY3QuYXNzaWduKHBpLnByb3RvdHlwZSx7YWNjdW11bGF0ZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuYnVmZmVyLGc9dGhpcy52YWx1ZVNpemU7YT1hKmcrZzt2YXIgcj10aGlzLmN1bXVsYXRpdmVXZWlnaHQ7aWYoMD09PXIpe2ZvcihyPTA7ciE9PWc7KytyKWVbYStyXT1lW3JdO3I9Y31lbHNlIHIrPWMsdGhpcy5fbWl4QnVmZmVyUmVnaW9uKGUsYSwwLGMvcixnKTt0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9CnJ9LGFwcGx5OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudmFsdWVTaXplLGU9dGhpcy5idWZmZXI7YT1hKmMrYzt2YXIgZz10aGlzLmN1bXVsYXRpdmVXZWlnaHQscj10aGlzLmJpbmRpbmc7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PTA7MT5nJiZ0aGlzLl9taXhCdWZmZXJSZWdpb24oZSxhLDMqYywxLWcsYyk7Zz1jO2Zvcih2YXIgdj1jK2M7ZyE9PXY7KytnKWlmKGVbZ10hPT1lW2crY10pe3Iuc2V0VmFsdWUoZSxhKTticmVha319LHNhdmVPcmlnaW5hbFN0YXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5idWZmZXIsYz10aGlzLnZhbHVlU2l6ZSxlPTMqYzt0aGlzLmJpbmRpbmcuZ2V0VmFsdWUoYSxlKTtmb3IodmFyIGc9YztnIT09ZTsrK2cpYVtnXT1hW2UrZyVjXTt0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MH0scmVzdG9yZU9yaWdpbmFsU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLmJpbmRpbmcuc2V0VmFsdWUodGhpcy5idWZmZXIsMyp0aGlzLnZhbHVlU2l6ZSl9LF9zZWxlY3Q6ZnVuY3Rpb24oYSwKYyxlLGcscil7aWYoLjU8PWcpZm9yKGc9MDtnIT09cjsrK2cpYVtjK2ddPWFbZStnXX0sX3NsZXJwOmZ1bmN0aW9uKGEsYyxlLGcpe2guc2xlcnBGbGF0KGEsYyxhLGMsYSxlLGcpfSxfbGVycDpmdW5jdGlvbihhLGMsZSxnLHIpe2Zvcih2YXIgdj0xLWcsej0wO3ohPT1yOysreil7dmFyIEU9Yyt6O2FbRV09YVtFXSp2K2FbZSt6XSpnfX19KTt2YXIgT209L1tcW1xdXC46XC9dL2csUG09IlteIisiXFxbXFxdXFwuOlxcLyIucmVwbGFjZSgiXFwuIiwiIikrIl0iLFFtPS8oKD86V0MrW1wvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCJXQyIsIlteXFxbXFxdXFwuOlxcL10iKSxSbT0vKFdDT0QrKT8vLnNvdXJjZS5yZXBsYWNlKCJXQ09EIixQbSksU209Lyg/OlwuKFdDKykoPzpcWyguKylcXSk/KT8vLnNvdXJjZS5yZXBsYWNlKCJXQyIsIlteXFxbXFxdXFwuOlxcL10iKSxUbT0vXC4oV0MrKSg/OlxbKC4rKVxdKT8vLnNvdXJjZS5yZXBsYWNlKCJXQyIsIlteXFxbXFxdXFwuOlxcL10iKSxVbT0KbmV3IFJlZ0V4cCgiXiIrUW0rUm0rU20rVG0rIiQiKSxWbT1bIm1hdGVyaWFsIiwibWF0ZXJpYWxzIiwiYm9uZXMiXTtPYmplY3QuYXNzaWduKFJqLnByb3RvdHlwZSx7Z2V0VmFsdWU6ZnVuY3Rpb24oYSxjKXt0aGlzLmJpbmQoKTt2YXIgZT10aGlzLl9iaW5kaW5nc1t0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c19dO3ZvaWQgMCE9PWUmJmUuZ2V0VmFsdWUoYSxjKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5fYmluZGluZ3MsZz10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18scj1lLmxlbmd0aDtnIT09cjsrK2cpZVtnXS5zZXRWYWx1ZShhLGMpfSxiaW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX2JpbmRpbmdzLGM9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLGU9YS5sZW5ndGg7YyE9PWU7KytjKWFbY10uYmluZCgpfSx1bmJpbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fYmluZGluZ3MsYz10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sCmU9YS5sZW5ndGg7YyE9PWU7KytjKWFbY10udW5iaW5kKCl9fSk7T2JqZWN0LmFzc2lnbigkYix7Q29tcG9zaXRlOlJqLGNyZWF0ZTpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIGEmJmEuaXNBbmltYXRpb25PYmplY3RHcm91cD9uZXcgJGIuQ29tcG9zaXRlKGEsYyxlKTpuZXcgJGIoYSxjLGUpfSxzYW5pdGl6ZU5vZGVOYW1lOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKE9tLCIiKX0scGFyc2VUcmFja05hbWU6ZnVuY3Rpb24oYSl7dmFyIGM9VW0uZXhlYyhhKTtpZighYyl0aHJvdyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAiK2EpO2M9e25vZGVOYW1lOmNbMl0sb2JqZWN0TmFtZTpjWzNdLG9iamVjdEluZGV4OmNbNF0scHJvcGVydHlOYW1lOmNbNV0scHJvcGVydHlJbmRleDpjWzZdfTt2YXIgZT1jLm5vZGVOYW1lJiZjLm5vZGVOYW1lLmxhc3RJbmRleE9mKCIuIik7aWYodm9pZCAwIT09ZSYmLTEhPT0KZSl7dmFyIGc9Yy5ub2RlTmFtZS5zdWJzdHJpbmcoZSsxKTstMSE9PVZtLmluZGV4T2YoZykmJihjLm5vZGVOYW1lPWMubm9kZU5hbWUuc3Vic3RyaW5nKDAsZSksYy5vYmplY3ROYW1lPWcpfWlmKG51bGw9PT1jLnByb3BlcnR5TmFtZXx8MD09PWMucHJvcGVydHlOYW1lLmxlbmd0aCl0aHJvdyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogIithKTtyZXR1cm4gY30sZmluZE5vZGU6ZnVuY3Rpb24oYSxjKXtpZighY3x8IiI9PT1jfHwicm9vdCI9PT1jfHwiLiI9PT1jfHwtMT09PWN8fGM9PT1hLm5hbWV8fGM9PT1hLnV1aWQpcmV0dXJuIGE7aWYoYS5za2VsZXRvbil7dmFyIGU9YS5za2VsZXRvbi5nZXRCb25lQnlOYW1lKGMpO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGV9aWYoYS5jaGlsZHJlbil7dmFyIGc9ZnVuY3Rpb24ocil7Zm9yKHZhciB2PTA7djxyLmxlbmd0aDt2Kyspe3ZhciB6PXJbdl07aWYoei5uYW1lPT09CmN8fHoudXVpZD09PWMpcmV0dXJuIHo7aWYoej1nKHouY2hpbGRyZW4pKXJldHVybiB6fXJldHVybiBudWxsfTtpZihhPWcoYS5jaGlsZHJlbikpcmV0dXJuIGF9cmV0dXJuIG51bGx9fSk7T2JqZWN0LmFzc2lnbigkYi5wcm90b3R5cGUse19nZXRWYWx1ZV91bmF2YWlsYWJsZTpmdW5jdGlvbigpe30sX3NldFZhbHVlX3VuYXZhaWxhYmxlOmZ1bmN0aW9uKCl7fSxCaW5kaW5nVHlwZTp7RGlyZWN0OjAsRW50aXJlQXJyYXk6MSxBcnJheUVsZW1lbnQ6MixIYXNGcm9tVG9BcnJheTozfSxWZXJzaW9uaW5nOntOb25lOjAsTmVlZHNVcGRhdGU6MSxNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOjJ9LEdldHRlckJ5QmluZGluZ1R5cGU6W2Z1bmN0aW9uKGEsYyl7YVtjXT10aGlzLm5vZGVbdGhpcy5wcm9wZXJ0eU5hbWVdfSxmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnJlc29sdmVkUHJvcGVydHksZz0wLHI9ZS5sZW5ndGg7ZyE9PXI7KytnKWFbYysrXT1lW2ddfSxmdW5jdGlvbihhLGMpe2FbY109CnRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KGEsYyl9XSxTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZzpbW2Z1bmN0aW9uKGEsYyl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWFbY119LGZ1bmN0aW9uKGEsYyl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWFbY107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9LGZ1bmN0aW9uKGEsYyl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWFbY107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnJlc29sdmVkUHJvcGVydHksZz0wLHI9ZS5sZW5ndGg7ZyE9PXI7KytnKWVbZ109YVtjKytdfSxmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnJlc29sdmVkUHJvcGVydHksCmc9MCxyPWUubGVuZ3RoO2chPT1yOysrZyllW2ddPWFbYysrXTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LGc9MCxyPWUubGVuZ3RoO2chPT1yOysrZyllW2ddPWFbYysrXTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV0sW2Z1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09YVtjXX0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPWFbY107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYSwKYyl9LGZ1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheShhLGMpO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYSxjKTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV1dLGdldFZhbHVlOmZ1bmN0aW9uKGEsYyl7dGhpcy5iaW5kKCk7dGhpcy5nZXRWYWx1ZShhLGMpfSxzZXRWYWx1ZTpmdW5jdGlvbihhLGMpe3RoaXMuYmluZCgpO3RoaXMuc2V0VmFsdWUoYSxjKX0sYmluZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubm9kZSxjPXRoaXMucGFyc2VkUGF0aCxlPWMub2JqZWN0TmFtZSxnPWMucHJvcGVydHlOYW1lLHI9Yy5wcm9wZXJ0eUluZGV4O2F8fCh0aGlzLm5vZGU9YT0kYi5maW5kTm9kZSh0aGlzLnJvb3ROb2RlLGMubm9kZU5hbWUpfHx0aGlzLnJvb3ROb2RlKTt0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlOwp0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlO2lmKGEpe2lmKGUpe3ZhciB2PWMub2JqZWN0SW5kZXg7c3dpdGNoKGUpe2Nhc2UgIm1hdGVyaWFscyI6aWYoIWEubWF0ZXJpYWwpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLiIsdGhpcyk7cmV0dXJufWlmKCFhLm1hdGVyaWFsLm1hdGVyaWFscyl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4iLHRoaXMpO3JldHVybn1hPWEubWF0ZXJpYWwubWF0ZXJpYWxzO2JyZWFrO2Nhc2UgImJvbmVzIjppZighYS5za2VsZXRvbil7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uIiwKdGhpcyk7cmV0dXJufWE9YS5za2VsZXRvbi5ib25lcztmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWlmKGFbZV0ubmFtZT09PXYpe3Y9ZTticmVha31icmVhaztkZWZhdWx0OmlmKHZvaWQgMD09PWFbZV0pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSB1bmRlZmluZWQuIix0aGlzKTtyZXR1cm59YT1hW2VdfWlmKHZvaWQgMCE9PXYpe2lmKHZvaWQgMD09PWFbdl0pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIGJpbmQgdG8gb2JqZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZC4iLHRoaXMsYSk7cmV0dXJufWE9YVt2XX19dj1hW2ddO2lmKHZvaWQgMD09PXYpY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogIitjLm5vZGVOYW1lKyIuIitnKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iLAphKTtlbHNle2M9dGhpcy5WZXJzaW9uaW5nLk5vbmU7dGhpcy50YXJnZXRPYmplY3Q9YTt2b2lkIDAhPT1hLm5lZWRzVXBkYXRlP2M9dGhpcy5WZXJzaW9uaW5nLk5lZWRzVXBkYXRlOnZvaWQgMCE9PWEubWF0cml4V29ybGROZWVkc1VwZGF0ZSYmKGM9dGhpcy5WZXJzaW9uaW5nLk1hdHJpeFdvcmxkTmVlZHNVcGRhdGUpO2U9dGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7aWYodm9pZCAwIT09cil7aWYoIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyI9PT1nKXtpZighYS5nZW9tZXRyeSl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuIix0aGlzKTtyZXR1cm59aWYoYS5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5KXtpZighYS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4iLAp0aGlzKTtyZXR1cm59Zm9yKGU9MDtlPHRoaXMubm9kZS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24ubGVuZ3RoO2UrKylpZihhLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbltlXS5uYW1lPT09cil7cj1lO2JyZWFrfX1lbHNle2lmKCFhLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhUYXJnZXRzLiIsdGhpcyk7cmV0dXJufWZvcihlPTA7ZTx0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDtlKyspaWYoYS5nZW9tZXRyeS5tb3JwaFRhcmdldHNbZV0ubmFtZT09PXIpe3I9ZTticmVha319fWU9dGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQ7dGhpcy5yZXNvbHZlZFByb3BlcnR5PXY7dGhpcy5wcm9wZXJ0eUluZGV4PXJ9ZWxzZSB2b2lkIDAhPT0Kdi5mcm9tQXJyYXkmJnZvaWQgMCE9PXYudG9BcnJheT8oZT10aGlzLkJpbmRpbmdUeXBlLkhhc0Zyb21Ub0FycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT12KTpBcnJheS5pc0FycmF5KHYpPyhlPXRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXksdGhpcy5yZXNvbHZlZFByb3BlcnR5PXYpOnRoaXMucHJvcGVydHlOYW1lPWc7dGhpcy5nZXRWYWx1ZT10aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbZV07dGhpcy5zZXRWYWx1ZT10aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nW2VdW2NdfX1lbHNlIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBub2RlIGZvciB0cmFjazogIit0aGlzLnBhdGgrIiBidXQgaXQgd2Fzbid0IGZvdW5kLiIpfSx1bmJpbmQ6ZnVuY3Rpb24oKXt0aGlzLm5vZGU9bnVsbDt0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYm91bmQ7dGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmJvdW5kfX0pOwpPYmplY3QuYXNzaWduKCRiLnByb3RvdHlwZSx7X2dldFZhbHVlX3VuYm91bmQ6JGIucHJvdG90eXBlLmdldFZhbHVlLF9zZXRWYWx1ZV91bmJvdW5kOiRiLnByb3RvdHlwZS5zZXRWYWx1ZX0pO09iamVjdC5hc3NpZ24oU2oucHJvdG90eXBlLHtpc0FuaW1hdGlvbk9iamVjdEdyb3VwOiEwLGFkZDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9vYmplY3RzLGM9YS5sZW5ndGgsZT10aGlzLm5DYWNoZWRPYmplY3RzXyxnPXRoaXMuX2luZGljZXNCeVVVSUQscj10aGlzLl9wYXRocyx2PXRoaXMuX3BhcnNlZFBhdGhzLHo9dGhpcy5fYmluZGluZ3MsRT16Lmxlbmd0aCxGPXZvaWQgMCxKPTAsUD1hcmd1bWVudHMubGVuZ3RoO0ohPT1QOysrSil7dmFyIFI9YXJndW1lbnRzW0pdLFM9Ui51dWlkLFY9Z1tTXTtpZih2b2lkIDA9PT1WKXtWPWMrKztnW1NdPVY7YS5wdXNoKFIpO1M9MDtmb3IodmFyIFc9RTtTIT09VzsrK1MpeltTXS5wdXNoKG5ldyAkYihSLHJbU10sdltTXSkpfWVsc2UgaWYoVjwKZSl7Rj1hW1ZdO3ZhciBoYT0tLWU7Vz1hW2hhXTtnW1cudXVpZF09VjthW1ZdPVc7Z1tTXT1oYTthW2hhXT1SO1M9MDtmb3IoVz1FO1MhPT1XOysrUyl7dmFyIGZhPXpbU10scmE9ZmFbVl07ZmFbVl09ZmFbaGFdO3ZvaWQgMD09PXJhJiYocmE9bmV3ICRiKFIscltTXSx2W1NdKSk7ZmFbaGFdPXJhfX1lbHNlIGFbVl0hPT1GJiZjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25PYmplY3RHcm91cDogRGlmZmVyZW50IG9iamVjdHMgd2l0aCB0aGUgc2FtZSBVVUlEIGRldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLiIpfXRoaXMubkNhY2hlZE9iamVjdHNfPWV9LHJlbW92ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9vYmplY3RzLGM9dGhpcy5uQ2FjaGVkT2JqZWN0c18sZT10aGlzLl9pbmRpY2VzQnlVVUlELGc9dGhpcy5fYmluZGluZ3Mscj1nLmxlbmd0aCx2PTAsej1hcmd1bWVudHMubGVuZ3RoO3YhPT0KejsrK3Ype3ZhciBFPWFyZ3VtZW50c1t2XSxGPUUudXVpZCxKPWVbRl07aWYodm9pZCAwIT09SiYmSj49Yyl7dmFyIFA9YysrLFI9YVtQXTtlW1IudXVpZF09SjthW0pdPVI7ZVtGXT1QO2FbUF09RTtFPTA7Zm9yKEY9cjtFIT09RjsrK0Upe1I9Z1tFXTt2YXIgUz1SW0pdO1JbSl09UltQXTtSW1BdPVN9fX10aGlzLm5DYWNoZWRPYmplY3RzXz1jfSx1bmNhY2hlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX29iamVjdHMsYz1hLmxlbmd0aCxlPXRoaXMubkNhY2hlZE9iamVjdHNfLGc9dGhpcy5faW5kaWNlc0J5VVVJRCxyPXRoaXMuX2JpbmRpbmdzLHY9ci5sZW5ndGgsej0wLEU9YXJndW1lbnRzLmxlbmd0aDt6IT09RTsrK3ope3ZhciBGPWFyZ3VtZW50c1t6XS51dWlkLEo9Z1tGXTtpZih2b2lkIDAhPT1KKWlmKGRlbGV0ZSBnW0ZdLEo8ZSl7Rj0tLWU7dmFyIFA9YVtGXSxSPS0tYyxTPWFbUl07Z1tQLnV1aWRdPUo7YVtKXT1QO2dbUy51dWlkXT1GO2FbRl09UzthLnBvcCgpO1A9CjA7Zm9yKFM9djtQIT09UzsrK1Ape3ZhciBWPXJbUF0sVz1WW1JdO1ZbSl09VltGXTtWW0ZdPVc7Vi5wb3AoKX19ZWxzZSBmb3IoUj0tLWMsUz1hW1JdLGdbUy51dWlkXT1KLGFbSl09UyxhLnBvcCgpLFA9MCxTPXY7UCE9PVM7KytQKVY9cltQXSxWW0pdPVZbUl0sVi5wb3AoKX10aGlzLm5DYWNoZWRPYmplY3RzXz1lfSxzdWJzY3JpYmVfOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLGc9ZVthXSxyPXRoaXMuX2JpbmRpbmdzO2lmKHZvaWQgMCE9PWcpcmV0dXJuIHJbZ107dmFyIHY9dGhpcy5fcGF0aHMsej10aGlzLl9wYXJzZWRQYXRocyxFPXRoaXMuX29iamVjdHMsRj10aGlzLm5DYWNoZWRPYmplY3RzXyxKPUFycmF5KEUubGVuZ3RoKTtnPXIubGVuZ3RoO2VbYV09Zzt2LnB1c2goYSk7ei5wdXNoKGMpO3IucHVzaChKKTtlPUY7Zm9yKGc9RS5sZW5ndGg7ZSE9PWc7KytlKUpbZV09bmV3ICRiKEVbZV0sYSxjKTtyZXR1cm4gSn0sdW5zdWJzY3JpYmVfOmZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsZT1jW2FdO2lmKHZvaWQgMCE9PWUpe3ZhciBnPXRoaXMuX3BhdGhzLHI9dGhpcy5fcGFyc2VkUGF0aHMsdj10aGlzLl9iaW5kaW5ncyx6PXYubGVuZ3RoLTEsRT12W3pdO2NbYVt6XV09ZTt2W2VdPUU7di5wb3AoKTtyW2VdPXJbel07ci5wb3AoKTtnW2VdPWdbel07Zy5wb3AoKX19fSk7T2JqZWN0LmFzc2lnbihUai5wcm90b3R5cGUse3BsYXk6ZnVuY3Rpb24oKXt0aGlzLl9taXhlci5fYWN0aXZhdGVBY3Rpb24odGhpcyk7cmV0dXJuIHRoaXN9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbih0aGlzKTtyZXR1cm4gdGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3RoaXMucGF1c2VkPSExO3RoaXMuZW5hYmxlZD0hMDt0aGlzLnRpbWU9MDt0aGlzLl9sb29wQ291bnQ9LTE7dGhpcy5fc3RhcnRUaW1lPW51bGw7cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCl9LGlzUnVubmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVuYWJsZWQmJgohdGhpcy5wYXVzZWQmJjAhPT10aGlzLnRpbWVTY2FsZSYmbnVsbD09PXRoaXMuX3N0YXJ0VGltZSYmdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfSxpc1NjaGVkdWxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24odGhpcyl9LHN0YXJ0QXQ6ZnVuY3Rpb24oYSl7dGhpcy5fc3RhcnRUaW1lPWE7cmV0dXJuIHRoaXN9LHNldExvb3A6ZnVuY3Rpb24oYSxjKXt0aGlzLmxvb3A9YTt0aGlzLnJlcGV0aXRpb25zPWM7cmV0dXJuIHRoaXN9LHNldEVmZmVjdGl2ZVdlaWdodDpmdW5jdGlvbihhKXt0aGlzLndlaWdodD1hO3RoaXMuX2VmZmVjdGl2ZVdlaWdodD10aGlzLmVuYWJsZWQ/YTowO3JldHVybiB0aGlzLnN0b3BGYWRpbmcoKX0sZ2V0RWZmZWN0aXZlV2VpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodH0sZmFkZUluOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyhhLDAsMSl9LGZhZGVPdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKGEsCjEsMCl9LGNyb3NzRmFkZUZyb206ZnVuY3Rpb24oYSxjLGUpe2EuZmFkZU91dChjKTt0aGlzLmZhZGVJbihjKTtpZihlKXtlPXRoaXMuX2NsaXAuZHVyYXRpb247dmFyIGc9YS5fY2xpcC5kdXJhdGlvbixyPWUvZzthLndhcnAoMSxnL2UsYyk7dGhpcy53YXJwKHIsMSxjKX1yZXR1cm4gdGhpc30sY3Jvc3NGYWRlVG86ZnVuY3Rpb24oYSxjLGUpe3JldHVybiBhLmNyb3NzRmFkZUZyb20odGhpcyxjLGUpfSxzdG9wRmFkaW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7bnVsbCE9PWEmJih0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD1udWxsLHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudChhKSk7cmV0dXJuIHRoaXN9LHNldEVmZmVjdGl2ZVRpbWVTY2FsZTpmdW5jdGlvbihhKXt0aGlzLnRpbWVTY2FsZT1hO3RoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnBhdXNlZD8wOmE7cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKX0sZ2V0RWZmZWN0aXZlVGltZVNjYWxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZX0sCnNldER1cmF0aW9uOmZ1bmN0aW9uKGEpe3RoaXMudGltZVNjYWxlPXRoaXMuX2NsaXAuZHVyYXRpb24vYTtyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpfSxzeW5jV2l0aDpmdW5jdGlvbihhKXt0aGlzLnRpbWU9YS50aW1lO3RoaXMudGltZVNjYWxlPWEudGltZVNjYWxlO3JldHVybiB0aGlzLnN0b3BXYXJwaW5nKCl9LGhhbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMud2FycCh0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsMCxhKX0sd2FycDpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5fbWl4ZXIscj1nLnRpbWUsdj10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCx6PXRoaXMudGltZVNjYWxlO251bGw9PT12JiYodGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9dj1nLl9sZW5kQ29udHJvbEludGVycG9sYW50KCkpO2c9di5wYXJhbWV0ZXJQb3NpdGlvbnM7dj12LnNhbXBsZVZhbHVlcztnWzBdPXI7Z1sxXT1yK2U7dlswXT1hL3o7dlsxXT1jL3o7cmV0dXJuIHRoaXN9LHN0b3BXYXJwaW5nOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O251bGwhPT1hJiYodGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoYSkpO3JldHVybiB0aGlzfSxnZXRNaXhlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taXhlcn0sZ2V0Q2xpcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jbGlwfSxnZXRSb290OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvY2FsUm9vdHx8dGhpcy5fbWl4ZXIuX3Jvb3R9LF91cGRhdGU6ZnVuY3Rpb24oYSxjLGUsZyl7aWYodGhpcy5lbmFibGVkKXt2YXIgcj10aGlzLl9zdGFydFRpbWU7aWYobnVsbCE9PXIpe2M9KGEtcikqZTtpZigwPmN8fDA9PT1lKXJldHVybjt0aGlzLl9zdGFydFRpbWU9bnVsbDtjKj1lfWMqPXRoaXMuX3VwZGF0ZVRpbWVTY2FsZShhKTtlPXRoaXMuX3VwZGF0ZVRpbWUoYyk7YT10aGlzLl91cGRhdGVXZWlnaHQoYSk7aWYoMDxhKXtjPXRoaXMuX2ludGVycG9sYW50czsKcj10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzO2Zvcih2YXIgdj0wLHo9Yy5sZW5ndGg7diE9PXo7Kyt2KWNbdl0uZXZhbHVhdGUoZSksclt2XS5hY2N1bXVsYXRlKGcsYSl9fWVsc2UgdGhpcy5fdXBkYXRlV2VpZ2h0KGEpfSxfdXBkYXRlV2VpZ2h0OmZ1bmN0aW9uKGEpe3ZhciBjPTA7aWYodGhpcy5lbmFibGVkKXtjPXRoaXMud2VpZ2h0O3ZhciBlPXRoaXMuX3dlaWdodEludGVycG9sYW50O2lmKG51bGwhPT1lKXt2YXIgZz1lLmV2YWx1YXRlKGEpWzBdO2MqPWc7YT5lLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcEZhZGluZygpLDA9PT1nJiYodGhpcy5lbmFibGVkPSExKSl9fXJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9Y30sX3VwZGF0ZVRpbWVTY2FsZTpmdW5jdGlvbihhKXt2YXIgYz0wO2lmKCF0aGlzLnBhdXNlZCl7Yz10aGlzLnRpbWVTY2FsZTt2YXIgZT10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtpZihudWxsIT09ZSl7dmFyIGc9ZS5ldmFsdWF0ZShhKVswXTsKYyo9ZzthPmUucGFyYW1ldGVyUG9zaXRpb25zWzFdJiYodGhpcy5zdG9wV2FycGluZygpLDA9PT1jP3RoaXMucGF1c2VkPSEwOnRoaXMudGltZVNjYWxlPWMpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPWN9LF91cGRhdGVUaW1lOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudGltZSthLGU9dGhpcy5fY2xpcC5kdXJhdGlvbixnPXRoaXMubG9vcCxyPXRoaXMuX2xvb3BDb3VudCx2PTIyMDI9PT1nO2lmKDA9PT1hKXJldHVybi0xPT09cj9jOnYmJjE9PT0ociYxKT9lLWM6YztpZigyMjAwPT09ZylhOntpZigtMT09PXImJih0aGlzLl9sb29wQ291bnQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLCEwLCExKSksYz49ZSljPWU7ZWxzZSBpZigwPmMpYz0wO2Vsc2V7dGhpcy50aW1lPWM7YnJlYWsgYX10aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMTt0aGlzLnRpbWU9Yzt0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsCmFjdGlvbjp0aGlzLGRpcmVjdGlvbjowPmE/LTE6MX0pfWVsc2V7LTE9PT1yJiYoMDw9YT8ocj0wLHRoaXMuX3NldEVuZGluZ3MoITAsMD09PXRoaXMucmVwZXRpdGlvbnMsdikpOnRoaXMuX3NldEVuZGluZ3MoMD09PXRoaXMucmVwZXRpdGlvbnMsITAsdikpO2lmKGM+PWV8fDA+Yyl7Zz1NYXRoLmZsb29yKGMvZSk7Yy09ZSpnO3IrPU1hdGguYWJzKGcpO3ZhciB6PXRoaXMucmVwZXRpdGlvbnMtcjswPj16Pyh0aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSx0aGlzLnRpbWU9Yz0wPGE/ZTowLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246MDxhPzE6LTF9KSk6KDE9PT16PyhhPTA+YSx0aGlzLl9zZXRFbmRpbmdzKGEsIWEsdikpOnRoaXMuX3NldEVuZGluZ3MoITEsITEsdiksdGhpcy5fbG9vcENvdW50PXIsdGhpcy50aW1lPWMsdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToibG9vcCIsCmFjdGlvbjp0aGlzLGxvb3BEZWx0YTpnfSkpfWVsc2UgdGhpcy50aW1lPWM7aWYodiYmMT09PShyJjEpKXJldHVybiBlLWN9cmV0dXJuIGN9LF9zZXRFbmRpbmdzOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO2U/KGcuZW5kaW5nU3RhcnQ9MjQwMSxnLmVuZGluZ0VuZD0yNDAxKTooZy5lbmRpbmdTdGFydD1hP3RoaXMuemVyb1Nsb3BlQXRTdGFydD8yNDAxOjI0MDA6MjQwMixnLmVuZGluZ0VuZD1jP3RoaXMuemVyb1Nsb3BlQXRFbmQ/MjQwMToyNDAwOjI0MDIpfSxfc2NoZWR1bGVGYWRpbmc6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuX21peGVyLHI9Zy50aW1lLHY9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7bnVsbD09PXYmJih0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD12PWcuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSk7Zz12LnBhcmFtZXRlclBvc2l0aW9uczt2PXYuc2FtcGxlVmFsdWVzO2dbMF09cjt2WzBdPWM7Z1sxXT1yK2E7dlsxXT0KZTtyZXR1cm4gdGhpc319KTtxaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6cWksX2JpbmRBY3Rpb246ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QsZz1hLl9jbGlwLnRyYWNrcyxyPWcubGVuZ3RoLHY9YS5fcHJvcGVydHlCaW5kaW5nczthPWEuX2ludGVycG9sYW50czt2YXIgej1lLnV1aWQsRT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsRj1FW3pdO3ZvaWQgMD09PUYmJihGPXt9LEVbel09Rik7Zm9yKEU9MDtFIT09cjsrK0Upe3ZhciBKPWdbRV0sUD1KLm5hbWUsUj1GW1BdO2lmKHZvaWQgMD09PVIpe1I9dltFXTtpZih2b2lkIDAhPT1SKXtudWxsPT09Ui5fY2FjaGVJbmRleCYmKCsrUi5yZWZlcmVuY2VDb3VudCx0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoUix6LFApKTtjb250aW51ZX1SPW5ldyBwaSgkYi5jcmVhdGUoZSxQLGMmJmMuX3Byb3BlcnR5QmluZGluZ3NbRV0uYmluZGluZy5wYXJzZWRQYXRoKSwKSi5WYWx1ZVR5cGVOYW1lLEouZ2V0VmFsdWVTaXplKCkpOysrUi5yZWZlcmVuY2VDb3VudDt0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoUix6LFApfXZbRV09UjthW0VdLnJlc3VsdEJ1ZmZlcj1SLmJ1ZmZlcn19LF9hY3RpdmF0ZUFjdGlvbjpmdW5jdGlvbihhKXtpZighdGhpcy5faXNBY3RpdmVBY3Rpb24oYSkpe2lmKG51bGw9PT1hLl9jYWNoZUluZGV4KXt2YXIgYz0oYS5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkLGU9YS5fY2xpcC51dWlkLGc9dGhpcy5fYWN0aW9uc0J5Q2xpcFtlXTt0aGlzLl9iaW5kQWN0aW9uKGEsZyYmZy5rbm93bkFjdGlvbnNbMF0pO3RoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGEsZSxjKX1jPWEuX3Byb3BlcnR5QmluZGluZ3M7ZT0wO2ZvcihnPWMubGVuZ3RoO2UhPT1nOysrZSl7dmFyIHI9Y1tlXTswPT09ci51c2VDb3VudCsrJiYodGhpcy5fbGVuZEJpbmRpbmcociksci5zYXZlT3JpZ2luYWxTdGF0ZSgpKX10aGlzLl9sZW5kQWN0aW9uKGEpfX0sCl9kZWFjdGl2YXRlQWN0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2lzQWN0aXZlQWN0aW9uKGEpKXtmb3IodmFyIGM9YS5fcHJvcGVydHlCaW5kaW5ncyxlPTAsZz1jLmxlbmd0aDtlIT09ZzsrK2Upe3ZhciByPWNbZV07MD09PS0tci51c2VDb3VudCYmKHIucmVzdG9yZU9yaWdpbmFsU3RhdGUoKSx0aGlzLl90YWtlQmFja0JpbmRpbmcocikpfXRoaXMuX3Rha2VCYWNrQWN0aW9uKGEpfX0sX2luaXRNZW1vcnlNYW5hZ2VyOmZ1bmN0aW9uKCl7dGhpcy5fYWN0aW9ucz1bXTt0aGlzLl9uQWN0aXZlQWN0aW9ucz0wO3RoaXMuX2FjdGlvbnNCeUNsaXA9e307dGhpcy5fYmluZGluZ3M9W107dGhpcy5fbkFjdGl2ZUJpbmRpbmdzPTA7dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lPXt9O3RoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHM9W107dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM9MDt2YXIgYT10aGlzO3RoaXMuc3RhdHM9e2FjdGlvbnM6e2dldCB0b3RhbCgpe3JldHVybiBhLl9hY3Rpb25zLmxlbmd0aH0sCmdldCBpblVzZSgpe3JldHVybiBhLl9uQWN0aXZlQWN0aW9uc319LGJpbmRpbmdzOntnZXQgdG90YWwoKXtyZXR1cm4gYS5fYmluZGluZ3MubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gYS5fbkFjdGl2ZUJpbmRpbmdzfX0sY29udHJvbEludGVycG9sYW50czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGEuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gYS5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHN9fX19LF9pc0FjdGl2ZUFjdGlvbjpmdW5jdGlvbihhKXthPWEuX2NhY2hlSW5kZXg7cmV0dXJuIG51bGwhPT1hJiZhPHRoaXMuX25BY3RpdmVBY3Rpb25zfSxfYWRkSW5hY3RpdmVBY3Rpb246ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuX2FjdGlvbnMscj10aGlzLl9hY3Rpb25zQnlDbGlwLHY9cltjXTt2b2lkIDA9PT12Pyh2PXtrbm93bkFjdGlvbnM6W2FdLGFjdGlvbkJ5Um9vdDp7fX0sYS5fYnlDbGlwQ2FjaGVJbmRleD0wLHJbY109dik6KGM9CnYua25vd25BY3Rpb25zLGEuX2J5Q2xpcENhY2hlSW5kZXg9Yy5sZW5ndGgsYy5wdXNoKGEpKTthLl9jYWNoZUluZGV4PWcubGVuZ3RoO2cucHVzaChhKTt2LmFjdGlvbkJ5Um9vdFtlXT1hfSxfcmVtb3ZlSW5hY3RpdmVBY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYWN0aW9ucyxlPWNbYy5sZW5ndGgtMV0sZz1hLl9jYWNoZUluZGV4O2UuX2NhY2hlSW5kZXg9ZztjW2ddPWU7Yy5wb3AoKTthLl9jYWNoZUluZGV4PW51bGw7Yz1hLl9jbGlwLnV1aWQ7ZT10aGlzLl9hY3Rpb25zQnlDbGlwO2c9ZVtjXTt2YXIgcj1nLmtub3duQWN0aW9ucyx2PXJbci5sZW5ndGgtMV0sej1hLl9ieUNsaXBDYWNoZUluZGV4O3YuX2J5Q2xpcENhY2hlSW5kZXg9ejtyW3pdPXY7ci5wb3AoKTthLl9ieUNsaXBDYWNoZUluZGV4PW51bGw7ZGVsZXRlIGcuYWN0aW9uQnlSb290WyhhLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QpLnV1aWRdOzA9PT1yLmxlbmd0aCYmZGVsZXRlIGVbY107dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihhKX0sCl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uOmZ1bmN0aW9uKGEpe2E9YS5fcHJvcGVydHlCaW5kaW5ncztmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2MhPT1lOysrYyl7dmFyIGc9YVtjXTswPT09LS1nLnJlZmVyZW5jZUNvdW50JiZ0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoZyl9fSxfbGVuZEFjdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9hY3Rpb25zLGU9YS5fY2FjaGVJbmRleCxnPXRoaXMuX25BY3RpdmVBY3Rpb25zKysscj1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7ci5fY2FjaGVJbmRleD1lO2NbZV09cn0sX3Rha2VCYWNrQWN0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2FjdGlvbnMsZT1hLl9jYWNoZUluZGV4LGc9LS10aGlzLl9uQWN0aXZlQWN0aW9ucyxyPWNbZ107YS5fY2FjaGVJbmRleD1nO2NbZ109YTtyLl9jYWNoZUluZGV4PWU7Y1tlXT1yfSxfYWRkSW5hY3RpdmVCaW5kaW5nOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsCnI9Z1tjXSx2PXRoaXMuX2JpbmRpbmdzO3ZvaWQgMD09PXImJihyPXt9LGdbY109cik7cltlXT1hO2EuX2NhY2hlSW5kZXg9di5sZW5ndGg7di5wdXNoKGEpfSxfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2JpbmRpbmdzLGU9YS5iaW5kaW5nLGc9ZS5yb290Tm9kZS51dWlkO2U9ZS5wYXRoO3ZhciByPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSx2PXJbZ10sej1jW2MubGVuZ3RoLTFdO2E9YS5fY2FjaGVJbmRleDt6Ll9jYWNoZUluZGV4PWE7Y1thXT16O2MucG9wKCk7ZGVsZXRlIHZbZV07MD09PU9iamVjdC5rZXlzKHYpLmxlbmd0aCYmZGVsZXRlIHJbZ119LF9sZW5kQmluZGluZzpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9iaW5kaW5ncyxlPWEuX2NhY2hlSW5kZXgsZz10aGlzLl9uQWN0aXZlQmluZGluZ3MrKyxyPWNbZ107YS5fY2FjaGVJbmRleD1nO2NbZ109YTtyLl9jYWNoZUluZGV4PWU7Y1tlXT1yfSxfdGFrZUJhY2tCaW5kaW5nOmZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLl9iaW5kaW5ncyxlPWEuX2NhY2hlSW5kZXgsZz0tLXRoaXMuX25BY3RpdmVCaW5kaW5ncyxyPWNbZ107YS5fY2FjaGVJbmRleD1nO2NbZ109YTtyLl9jYWNoZUluZGV4PWU7Y1tlXT1yfSxfbGVuZENvbnRyb2xJbnRlcnBvbGFudDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsYz10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cysrLGU9YVtjXTt2b2lkIDA9PT1lJiYoZT1uZXcgWWYobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciksZS5fX2NhY2hlSW5kZXg9YyxhW2NdPWUpO3JldHVybiBlfSxfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fY29udHJvbEludGVycG9sYW50cyxlPWEuX19jYWNoZUluZGV4LGc9LS10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyxyPWNbZ107YS5fX2NhY2hlSW5kZXg9Cmc7Y1tnXT1hO3IuX19jYWNoZUluZGV4PWU7Y1tlXT1yfSxfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlcjpuZXcgRmxvYXQzMkFycmF5KDEpLGNsaXBBY3Rpb246ZnVuY3Rpb24oYSxjKXt2YXIgZT1jfHx0aGlzLl9yb290LGc9ZS51dWlkO2U9InN0cmluZyI9PT10eXBlb2YgYT90Yy5maW5kQnlOYW1lKGUsYSk6YTthPW51bGwhPT1lP2UudXVpZDphO3ZhciByPXRoaXMuX2FjdGlvbnNCeUNsaXBbYV0sdj1udWxsO2lmKHZvaWQgMCE9PXIpe3Y9ci5hY3Rpb25CeVJvb3RbZ107aWYodm9pZCAwIT09dilyZXR1cm4gdjt2PXIua25vd25BY3Rpb25zWzBdO251bGw9PT1lJiYoZT12Ll9jbGlwKX1pZihudWxsPT09ZSlyZXR1cm4gbnVsbDtjPW5ldyBUaih0aGlzLGUsYyk7dGhpcy5fYmluZEFjdGlvbihjLHYpO3RoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGMsYSxnKTtyZXR1cm4gY30sZXhpc3RpbmdBY3Rpb246ZnVuY3Rpb24oYSxjKXt2YXIgZT1jfHx0aGlzLl9yb290O2M9ZS51dWlkOwplPSJzdHJpbmciPT09dHlwZW9mIGE/dGMuZmluZEJ5TmFtZShlLGEpOmE7YT10aGlzLl9hY3Rpb25zQnlDbGlwW2U/ZS51dWlkOmFdO3JldHVybiB2b2lkIDAhPT1hP2EuYWN0aW9uQnlSb290W2NdfHxudWxsOm51bGx9LHN0b3BBbGxBY3Rpb246ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fYWN0aW9ucyxjPXRoaXMuX25BY3RpdmVBY3Rpb25zLGU9dGhpcy5fYmluZGluZ3MsZz10aGlzLl9uQWN0aXZlQmluZGluZ3Mscj10aGlzLl9uQWN0aXZlQmluZGluZ3M9dGhpcy5fbkFjdGl2ZUFjdGlvbnM9MDtyIT09YzsrK3IpYVtyXS5yZXNldCgpO2ZvcihyPTA7ciE9PWc7KytyKWVbcl0udXNlQ291bnQ9MDtyZXR1cm4gdGhpc30sdXBkYXRlOmZ1bmN0aW9uKGEpe2EqPXRoaXMudGltZVNjYWxlO2Zvcih2YXIgYz10aGlzLl9hY3Rpb25zLGU9dGhpcy5fbkFjdGl2ZUFjdGlvbnMsZz10aGlzLnRpbWUrPWEscj1NYXRoLnNpZ24oYSksdj10aGlzLl9hY2N1SW5kZXhePTEsej0wO3ohPT1lOysreiljW3pdLl91cGRhdGUoZywKYSxyLHYpO2E9dGhpcy5fYmluZGluZ3M7Yz10aGlzLl9uQWN0aXZlQmluZGluZ3M7Zm9yKHo9MDt6IT09YzsrK3opYVt6XS5hcHBseSh2KTtyZXR1cm4gdGhpc30sZ2V0Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSx1bmNhY2hlQ2xpcDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9hY3Rpb25zO2E9YS51dWlkO3ZhciBlPXRoaXMuX2FjdGlvbnNCeUNsaXAsZz1lW2FdO2lmKHZvaWQgMCE9PWcpe2c9Zy5rbm93bkFjdGlvbnM7Zm9yKHZhciByPTAsdj1nLmxlbmd0aDtyIT09djsrK3Ipe3ZhciB6PWdbcl07dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbih6KTt2YXIgRT16Ll9jYWNoZUluZGV4LEY9Y1tjLmxlbmd0aC0xXTt6Ll9jYWNoZUluZGV4PW51bGw7ei5fYnlDbGlwQ2FjaGVJbmRleD1udWxsO0YuX2NhY2hlSW5kZXg9RTtjW0VdPUY7Yy5wb3AoKTt0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHopfWRlbGV0ZSBlW2FdfX0sdW5jYWNoZVJvb3Q6ZnVuY3Rpb24oYSl7YT0KYS51dWlkO3ZhciBjPXRoaXMuX2FjdGlvbnNCeUNsaXA7Zm9yKGcgaW4gYyl7dmFyIGU9Y1tnXS5hY3Rpb25CeVJvb3RbYV07dm9pZCAwIT09ZSYmKHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oZSksdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oZSkpfXZhciBnPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZVthXTtpZih2b2lkIDAhPT1nKWZvcih2YXIgciBpbiBnKWE9Z1tyXSxhLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKGEpfSx1bmNhY2hlQWN0aW9uOmZ1bmN0aW9uKGEsYyl7YT10aGlzLmV4aXN0aW5nQWN0aW9uKGEsYyk7bnVsbCE9PWEmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGEpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGEpKX19KTtiaC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGJoKHZvaWQgMD09PXRoaXMudmFsdWUuY2xvbmU/dGhpcy52YWx1ZTp0aGlzLnZhbHVlLmNsb25lKCkpfTtyaS5wcm90b3R5cGU9Ck9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShRZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpyaSxpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyOiEwLGNvcHk6ZnVuY3Rpb24oYSl7UWQucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMubWVzaFBlckF0dHJpYnV0ZT1hLm1lc2hQZXJBdHRyaWJ1dGU7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihVai5wcm90b3R5cGUse2xpbmVQcmVjaXNpb246MSxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLnJheS5zZXQoYSxjKX0sc2V0RnJvbUNhbWVyYTpmdW5jdGlvbihhLGMpe2MmJmMuaXNQZXJzcGVjdGl2ZUNhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbihjLm1hdHJpeFdvcmxkKSx0aGlzLnJheS5kaXJlY3Rpb24uc2V0KGEueCxhLnksLjUpLnVucHJvamVjdChjKS5zdWIodGhpcy5yYXkub3JpZ2luKS5ub3JtYWxpemUoKSx0aGlzLmNhbWVyYT1jKTpjJiZjLmlzT3J0aG9ncmFwaGljQ2FtZXJhPwoodGhpcy5yYXkub3JpZ2luLnNldChhLngsYS55LChjLm5lYXIrYy5mYXIpLyhjLm5lYXItYy5mYXIpKS51bnByb2plY3QoYyksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbihjLm1hdHJpeFdvcmxkKSx0aGlzLmNhbWVyYT1jKTpjb25zb2xlLmVycm9yKCJUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlLiIpfSxpbnRlcnNlY3RPYmplY3Q6ZnVuY3Rpb24oYSxjLGUpe2U9ZXx8W107c2koYSx0aGlzLGUsYyk7ZS5zb3J0KFZqKTtyZXR1cm4gZX0saW50ZXJzZWN0T2JqZWN0czpmdW5jdGlvbihhLGMsZSl7ZT1lfHxbXTtpZighMT09PUFycmF5LmlzQXJyYXkoYSkpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHM6IG9iamVjdHMgaXMgbm90IGFuIEFycmF5LiIpLGU7Zm9yKHZhciBnPTAscj1hLmxlbmd0aDtnPHI7ZysrKXNpKGFbZ10sdGhpcyxlLGMpO2Uuc29ydChWaik7cmV0dXJuIGV9fSk7Ck9iamVjdC5hc3NpZ24oV2oucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSxjLGUpe3RoaXMucmFkaXVzPWE7dGhpcy5waGk9Yzt0aGlzLnRoZXRhPWU7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMucmFkaXVzPWEucmFkaXVzO3RoaXMucGhpPWEucGhpO3RoaXMudGhldGE9YS50aGV0YTtyZXR1cm4gdGhpc30sbWFrZVNhZmU6ZnVuY3Rpb24oKXt0aGlzLnBoaT1NYXRoLm1heCgxRS02LE1hdGgubWluKE1hdGguUEktMUUtNix0aGlzLnBoaSkpO3JldHVybiB0aGlzfSxzZXRGcm9tVmVjdG9yMzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKGEueCxhLnksYS56KX0sc2V0RnJvbUNhcnRlc2lhbkNvb3JkczpmdW5jdGlvbihhLGMsZSl7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGEqYStjKmMrZSplKTswPT09dGhpcy5yYWRpdXM/dGhpcy5waGk9CnRoaXMudGhldGE9MDoodGhpcy50aGV0YT1NYXRoLmF0YW4yKGEsZSksdGhpcy5waGk9TWF0aC5hY29zKGhiLmNsYW1wKGMvdGhpcy5yYWRpdXMsLTEsMSkpKTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKFhqLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnJhZGl1cz1hO3RoaXMudGhldGE9Yzt0aGlzLnk9ZTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5yYWRpdXM9YS5yYWRpdXM7dGhpcy50aGV0YT1hLnRoZXRhO3RoaXMueT1hLnk7cmV0dXJuIHRoaXN9LHNldEZyb21WZWN0b3IzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoYS54LGEueSxhLnopfSxzZXRGcm9tQ2FydGVzaWFuQ29vcmRzOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnJhZGl1cz1NYXRoLnNxcnQoYSphK2UqZSk7dGhpcy50aGV0YT1NYXRoLmF0YW4yKGEsCmUpO3RoaXMueT1jO3JldHVybiB0aGlzfX0pO3ZhciB5az1uZXcgZjtPYmplY3QuYXNzaWduKHRpLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5taW4uY29weShhKTt0aGlzLm1heC5jb3B5KGMpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKHZhciBjPTAsZT1hLmxlbmd0aDtjPGU7YysrKXRoaXMuZXhwYW5kQnlQb2ludChhW2NdKTtyZXR1cm4gdGhpc30sc2V0RnJvbUNlbnRlckFuZFNpemU6ZnVuY3Rpb24oYSxjKXtjPXlrLmNvcHkoYykubXVsdGlwbHlTY2FsYXIoLjUpO3RoaXMubWluLmNvcHkoYSkuc3ViKGMpO3RoaXMubWF4LmNvcHkoYSkuYWRkKGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm1pbi5jb3B5KGEubWluKTt0aGlzLm1heC5jb3B5KGEubWF4KTtyZXR1cm4gdGhpc30sCm1ha2VFbXB0eTpmdW5jdGlvbigpe3RoaXMubWluLng9dGhpcy5taW4ueT1JbmZpbml0eTt0aGlzLm1heC54PXRoaXMubWF4Lnk9LUluZmluaXR5O3JldHVybiB0aGlzfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fSxnZXRDZW50ZXI6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBmKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/YS5zZXQoMCwwKTphLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX0sZ2V0U2l6ZTpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBmKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/YS5zZXQoMCwwKTphLnN1YlZlY3RvcnModGhpcy5tYXgsCnRoaXMubWluKX0sZXhwYW5kQnlQb2ludDpmdW5jdGlvbihhKXt0aGlzLm1pbi5taW4oYSk7dGhpcy5tYXgubWF4KGEpO3JldHVybiB0aGlzfSxleHBhbmRCeVZlY3RvcjpmdW5jdGlvbihhKXt0aGlzLm1pbi5zdWIoYSk7dGhpcy5tYXguYWRkKGEpO3JldHVybiB0aGlzfSxleHBhbmRCeVNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLm1pbi5hZGRTY2FsYXIoLWEpO3RoaXMubWF4LmFkZFNjYWxhcihhKTtyZXR1cm4gdGhpc30sY29udGFpbnNQb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gYS54PHRoaXMubWluLnh8fGEueD50aGlzLm1heC54fHxhLnk8dGhpcy5taW4ueXx8YS55PnRoaXMubWF4Lnk/ITE6ITB9LGNvbnRhaW5zQm94OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1pbi54PD1hLm1pbi54JiZhLm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD1hLm1pbi55JiZhLm1heC55PD10aGlzLm1heC55fSxnZXRQYXJhbWV0ZXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLApjPW5ldyBmKTtyZXR1cm4gYy5zZXQoKGEueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwoYS55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpKX0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXgueDx0aGlzLm1pbi54fHxhLm1pbi54PnRoaXMubWF4Lnh8fGEubWF4Lnk8dGhpcy5taW4ueXx8YS5taW4ueT50aGlzLm1heC55PyExOiEwfSxjbGFtcFBvaW50OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgZik7cmV0dXJuIGMuY29weShhKS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbihhKXtyZXR1cm4geWsuY29weShhKS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuc3ViKGEpLmxlbmd0aCgpfSxpbnRlcnNlY3Q6ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWF4KGEubWluKTsKdGhpcy5tYXgubWluKGEubWF4KTtyZXR1cm4gdGhpc30sdW5pb246ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEubWluKTt0aGlzLm1heC5tYXgoYS5tYXgpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLm1pbi5lcXVhbHModGhpcy5taW4pJiZhLm1heC5lcXVhbHModGhpcy5tYXgpfX0pO3ZhciB6az1uZXcgayx6aD1uZXcgaztPYmplY3QuYXNzaWduKHVpLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5zdGFydC5jb3B5KGEpO3RoaXMuZW5kLmNvcHkoYyk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuc3RhcnQuY29weShhLnN0YXJ0KTt0aGlzLmVuZC5jb3B5KGEuZW5kKTtyZXR1cm4gdGhpc30sZ2V0Q2VudGVyOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX0sZGVsdGE6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5kZWx0YSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfSxkaXN0YW5jZVNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5lbmQpfSxkaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpfSxhdDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz0KbmV3IGspO3JldHVybiB0aGlzLmRlbHRhKGMpLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLnN0YXJ0KX0sY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcjpmdW5jdGlvbihhLGMpe3prLnN1YlZlY3RvcnMoYSx0aGlzLnN0YXJ0KTt6aC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpO2E9emguZG90KHprKS96aC5kb3QoemgpO2MmJihhPWhiLmNsYW1wKGEsMCwxKSk7cmV0dXJuIGF9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYSxjLGUpe2E9dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKGEsYyk7dm9pZCAwPT09ZSYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGspO3JldHVybiB0aGlzLmRlbHRhKGUpLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLnN0YXJ0KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe3RoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KGEpOwp0aGlzLmVuZC5hcHBseU1hdHJpeDQoYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJmEuZW5kLmVxdWFscyh0aGlzLmVuZCl9fSk7Y2cucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO2NnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jZztjZy5wcm90b3R5cGUuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3Q9ITA7dmFyIFpjPW5ldyBrLG9kPW5ldyBrLFJpPW5ldyB0LFdtPVsiYSIsImIiLCJjIl07ZGcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtkZy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGc7ZGcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtSaS5nZXROb3JtYWxNYXRyaXgodGhpcy5vYmplY3QubWF0cml4V29ybGQpO3ZhciBhPXRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkLGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLAplPXRoaXMub2JqZWN0Lmdlb21ldHJ5O2lmKGUmJmUuaXNHZW9tZXRyeSlmb3IodmFyIGc9ZS52ZXJ0aWNlcyxyPWUuZmFjZXMsdj1lPTAsej1yLmxlbmd0aDt2PHo7disrKWZvcih2YXIgRT1yW3ZdLEY9MCxKPUUudmVydGV4Tm9ybWFscy5sZW5ndGg7RjxKO0YrKyl7dmFyIFA9RS52ZXJ0ZXhOb3JtYWxzW0ZdO1pjLmNvcHkoZ1tFW1dtW0ZdXV0pLmFwcGx5TWF0cml4NChhKTtvZC5jb3B5KFApLmFwcGx5TWF0cml4MyhSaSkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKS5hZGQoWmMpO2Muc2V0WFlaKGUsWmMueCxaYy55LFpjLnopO2UrPTE7Yy5zZXRYWVooZSxvZC54LG9kLnksb2Queik7ZSs9MX1lbHNlIGlmKGUmJmUuaXNCdWZmZXJHZW9tZXRyeSlmb3IoZz1lLmF0dHJpYnV0ZXMucG9zaXRpb24scj1lLmF0dHJpYnV0ZXMubm9ybWFsLEY9ZT0wLEo9Zy5jb3VudDtGPEo7RisrKVpjLnNldChnLmdldFgoRiksZy5nZXRZKEYpLGcuZ2V0WihGKSkuYXBwbHlNYXRyaXg0KGEpLApvZC5zZXQoci5nZXRYKEYpLHIuZ2V0WShGKSxyLmdldFooRikpLG9kLmFwcGx5TWF0cml4MyhSaSkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKS5hZGQoWmMpLGMuc2V0WFlaKGUsWmMueCxaYy55LFpjLnopLGUrPTEsYy5zZXRYWVooZSxvZC54LG9kLnksb2QueiksZSs9MTtjLm5lZWRzVXBkYXRlPSEwfTt2YXIgQWs9bmV3IGs7WGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO1hlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YZTtYZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKX07WGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt2YXIgYT10aGlzLmxpZ2h0LmRpc3RhbmNlP3RoaXMubGlnaHQuZGlzdGFuY2U6MUUzLGM9YSpNYXRoLnRhbih0aGlzLmxpZ2h0LmFuZ2xlKTsKdGhpcy5jb25lLnNjYWxlLnNldChjLGMsYSk7QWsuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKTt0aGlzLmNvbmUubG9va0F0KEFrKTt2b2lkIDAhPT10aGlzLmNvbG9yP3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9O3ZhciBJZD1uZXcgayxBaD1uZXcgcSxTaT1uZXcgcTtZZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO1llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZZTtZZS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5ib25lcyxlPXRoaXMuZ2VvbWV0cnksZz1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtTaS5nZXRJbnZlcnNlKHRoaXMucm9vdC5tYXRyaXhXb3JsZCk7Zm9yKHZhciByPTAsdj0wO3I8Yy5sZW5ndGg7cisrKXt2YXIgej1jW3JdO3oucGFyZW50JiYKei5wYXJlbnQuaXNCb25lJiYoQWgubXVsdGlwbHlNYXRyaWNlcyhTaSx6Lm1hdHJpeFdvcmxkKSxJZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oQWgpLGcuc2V0WFlaKHYsSWQueCxJZC55LElkLnopLEFoLm11bHRpcGx5TWF0cmljZXMoU2ksei5wYXJlbnQubWF0cml4V29ybGQpLElkLnNldEZyb21NYXRyaXhQb3NpdGlvbihBaCksZy5zZXRYWVoodisxLElkLngsSWQueSxJZC56KSx2Kz0yKX1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMDtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSl9O1plLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7WmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVplO1plLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9O1plLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLmNvbG9yPwp0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTp0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9OyRlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFZiLnByb3RvdHlwZSk7JGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRlOyRlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLnNjYWxlLnNldCguNSp0aGlzLmxpZ2h0LndpZHRoLC41KnRoaXMubGlnaHQuaGVpZ2h0LDEpO2lmKHZvaWQgMCE9PXRoaXMuY29sb3IpdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvciksdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7ZWxzZXt0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcikubXVsdGlwbHlTY2FsYXIodGhpcy5saWdodC5pbnRlbnNpdHkpO3ZhciBhPXRoaXMubWF0ZXJpYWwuY29sb3IsYz1NYXRoLm1heChhLnIsYS5nLGEuYik7MTxjJiZhLm11bHRpcGx5U2NhbGFyKDEvCmMpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLm1hdGVyaWFsLmNvbG9yKX19OyRlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9O3ZhciBYbT1uZXcgayxCaz1uZXcgSSxDaz1uZXcgSTthZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7YWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWFmO2FmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9O2FmLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoaWxkcmVuWzBdO2lmKHZvaWQgMCE9PXRoaXMuY29sb3IpdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7CmVsc2V7dmFyIGM9YS5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7QmsuY29weSh0aGlzLmxpZ2h0LmNvbG9yKTtDay5jb3B5KHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IpO2Zvcih2YXIgZT0wLGc9Yy5jb3VudDtlPGc7ZSsrKXt2YXIgcj1lPGcvMj9CazpDaztjLnNldFhZWihlLHIucixyLmcsci5iKX1jLm5lZWRzVXBkYXRlPSEwfWEubG9va0F0KFhtLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKS5uZWdhdGUoKSl9O2JmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7YmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWJmO2JmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9O2JmLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcj1mdW5jdGlvbigpe3RoaXMucG9zaXRpb24uY29weSh0aGlzLmxpZ2h0UHJvYmUucG9zaXRpb24pO3RoaXMuc2NhbGUuc2V0KDEsCjEsMSkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKTt0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmludGVuc2l0eS52YWx1ZT10aGlzLmxpZ2h0UHJvYmUuaW50ZW5zaXR5fTtjaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmNoLGNvcHk6ZnVuY3Rpb24oYSl7SWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZ2VvbWV0cnkuY29weShhLmdlb21ldHJ5KTt0aGlzLm1hdGVyaWFsLmNvcHkoYS5tYXRlcmlhbCk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX0pO2RoLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7ZGgucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRoO2NmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFZiLnByb3RvdHlwZSk7Y2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPWNmO2NmLnByb3RvdHlwZS51cGRhdGU9CmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShXLGhhLGZhLHJhKXtmYT0oaGEtVykvZmE7Vi5zZXRYWVooRiwwLDAsMCk7SisrO2ZvcihQPVc7UDxoYTtQKz1mYSlSPUYrSixWLnNldFhZWihSLE1hdGguc2luKFApKmUsMCxNYXRoLmNvcyhQKSplKSxWLnNldFhZWihSKzEsTWF0aC5zaW4oTWF0aC5taW4oUCtmYSxoYSkpKmUsMCxNYXRoLmNvcyhNYXRoLm1pbihQK2ZhLGhhKSkqZSksVi5zZXRYWVooUisyLDAsMCwwKSxKKz0zO1MuYWRkR3JvdXAoRixKLHJhKTtGKz1KO0o9MH12YXIgYz10aGlzLmF1ZGlvLGU9dGhpcy5yYW5nZSxnPXRoaXMuZGl2aXNpb25zSW5uZXJBbmdsZSxyPXRoaXMuZGl2aXNpb25zT3V0ZXJBbmdsZSx2PWhiLmRlZ1RvUmFkKGMucGFubmVyLmNvbmVJbm5lckFuZ2xlKTtjPWhiLmRlZ1RvUmFkKGMucGFubmVyLmNvbmVPdXRlckFuZ2xlKTt2YXIgej12LzIsRT1jLzIsRj0wLEo9MCxQLFIsUz10aGlzLmdlb21ldHJ5LFY9Uy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1MuY2xlYXJHcm91cHMoKTsKYSgtRSwteixyLDApO2EoLXoseixnLDEpO2EoeixFLHIsMCk7Vi5uZWVkc1VwZGF0ZT0hMDt2PT09YyYmKHRoaXMubWF0ZXJpYWxbMF0udmlzaWJsZT0hMSl9O2NmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbFswXS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbFsxXS5kaXNwb3NlKCl9O3ZhciBxZz1uZXcgayxCaD1uZXcgayxEaz1uZXcgdDtlZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2VnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lZztlZy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoITApO0RrLmdldE5vcm1hbE1hdHJpeCh0aGlzLm9iamVjdC5tYXRyaXhXb3JsZCk7dmFyIGE9dGhpcy5vYmplY3QubWF0cml4V29ybGQsYz10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm9iamVjdC5nZW9tZXRyeSxnPQplLnZlcnRpY2VzO2U9ZS5mYWNlcztmb3IodmFyIHI9MCx2PTAsej1lLmxlbmd0aDt2PHo7disrKXt2YXIgRT1lW3ZdLEY9RS5ub3JtYWw7cWcuY29weShnW0UuYV0pLmFkZChnW0UuYl0pLmFkZChnW0UuY10pLmRpdmlkZVNjYWxhcigzKS5hcHBseU1hdHJpeDQoYSk7QmguY29weShGKS5hcHBseU1hdHJpeDMoRGspLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKHFnKTtjLnNldFhZWihyLHFnLngscWcueSxxZy56KTtyKz0xO2Muc2V0WFlaKHIsQmgueCxCaC55LEJoLnopO3IrPTF9Yy5uZWVkc1VwZGF0ZT0hMH07dmFyIEVrPW5ldyBrLENoPW5ldyBrLEZrPW5ldyBrO2RmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtkZi5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGY7ZGYucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCk7CnRoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKX07ZGYucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe0VrLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKTtDaC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQpO0ZrLnN1YlZlY3RvcnMoQ2gsRWspO3RoaXMubGlnaHRQbGFuZS5sb29rQXQoQ2gpO3ZvaWQgMCE9PXRoaXMuY29sb3I/KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvciksdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKSk6KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpKTt0aGlzLnRhcmdldExpbmUubG9va0F0KENoKTsKdGhpcy50YXJnZXRMaW5lLnNjYWxlLno9RmsubGVuZ3RoKCl9O3ZhciBlaD1uZXcgayxPYj1uZXcgemI7ZmcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtmZy5wcm90b3R5cGUuY29uc3RydWN0b3I9Zmc7ZmcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2VvbWV0cnksYz10aGlzLnBvaW50TWFwO09iLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UpO1BiKCJjIixjLGEsT2IsMCwwLC0xKTtQYigidCIsYyxhLE9iLDAsMCwxKTtQYigibjEiLGMsYSxPYiwtMSwtMSwtMSk7UGIoIm4yIixjLGEsT2IsMSwtMSwtMSk7UGIoIm4zIixjLGEsT2IsLTEsMSwtMSk7UGIoIm40IixjLGEsT2IsMSwxLC0xKTtQYigiZjEiLGMsYSxPYiwtMSwtMSwxKTtQYigiZjIiLGMsYSxPYiwxLC0xLDEpO1BiKCJmMyIsYyxhLE9iLC0xLDEsMSk7UGIoImY0IixjLGEsT2IsMSwxLDEpO1BiKCJ1MSIsCmMsYSxPYiwuNywxLjEsLTEpO1BiKCJ1MiIsYyxhLE9iLC0uNywxLjEsLTEpO1BiKCJ1MyIsYyxhLE9iLDAsMiwtMSk7UGIoImNmMSIsYyxhLE9iLC0xLDAsMSk7UGIoImNmMiIsYyxhLE9iLDEsMCwxKTtQYigiY2YzIixjLGEsT2IsMCwtMSwxKTtQYigiY2Y0IixjLGEsT2IsMCwxLDEpO1BiKCJjbjEiLGMsYSxPYiwtMSwwLC0xKTtQYigiY24yIixjLGEsT2IsMSwwLC0xKTtQYigiY24zIixjLGEsT2IsMCwtMSwtMSk7UGIoImNuNCIsYyxhLE9iLDAsMSwtMSk7YS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITB9O3ZhciBEaD1uZXcgdztoZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2hkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZDtoZC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEmJmNvbnNvbGUud2FybigiVEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMuIik7dm9pZCAwIT09CnRoaXMub2JqZWN0JiZEaC5zZXRGcm9tT2JqZWN0KHRoaXMub2JqZWN0KTtpZighRGguaXNFbXB0eSgpKXthPURoLm1pbjt2YXIgYz1EaC5tYXgsZT10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZz1lLmFycmF5O2dbMF09Yy54O2dbMV09Yy55O2dbMl09Yy56O2dbM109YS54O2dbNF09Yy55O2dbNV09Yy56O2dbNl09YS54O2dbN109YS55O2dbOF09Yy56O2dbOV09Yy54O2dbMTBdPWEueTtnWzExXT1jLno7Z1sxMl09Yy54O2dbMTNdPWMueTtnWzE0XT1hLno7Z1sxNV09YS54O2dbMTZdPWMueTtnWzE3XT1hLno7Z1sxOF09YS54O2dbMTldPWEueTtnWzIwXT1hLno7Z1syMV09Yy54O2dbMjJdPWEueTtnWzIzXT1hLno7ZS5uZWVkc1VwZGF0ZT0hMDt0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfX07aGQucHJvdG90eXBlLnNldEZyb21PYmplY3Q9ZnVuY3Rpb24oYSl7dGhpcy5vYmplY3Q9YTt0aGlzLnVwZGF0ZSgpO3JldHVybiB0aGlzfTtoZC5wcm90b3R5cGUuY29weT0KZnVuY3Rpb24oYSl7SWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMub2JqZWN0PWEub2JqZWN0O3JldHVybiB0aGlzfTtoZC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9O2dnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7Z2cucHJvdG90eXBlLmNvbnN0cnVjdG9yPWdnO2dnLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZD1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmJveDtjLmlzRW1wdHkoKXx8KGMuZ2V0Q2VudGVyKHRoaXMucG9zaXRpb24pLGMuZ2V0U2l6ZSh0aGlzLnNjYWxlKSx0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKC41KSxBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSkpfTtoZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpO2hnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZztoZy5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9CmZ1bmN0aW9uKGEpe3ZhciBjPS10aGlzLnBsYW5lLmNvbnN0YW50OzFFLTg+TWF0aC5hYnMoYykmJihjPTFFLTgpO3RoaXMuc2NhbGUuc2V0KC41KnRoaXMuc2l6ZSwuNSp0aGlzLnNpemUsYyk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5zaWRlPTA+Yz8xOjA7dGhpcy5sb29rQXQodGhpcy5wbGFuZS5ub3JtYWwpO0EucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcyxhKX07dmFyIEdrPW5ldyBrLGZoLHZpO2lkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtpZC5wcm90b3R5cGUuY29uc3RydWN0b3I9aWQ7aWQucHJvdG90eXBlLnNldERpcmVjdGlvbj1mdW5jdGlvbihhKXsuOTk5OTk8YS55P3RoaXMucXVhdGVybmlvbi5zZXQoMCwwLDAsMSk6LS45OTk5OT5hLnk/dGhpcy5xdWF0ZXJuaW9uLnNldCgxLDAsMCwwKTooR2suc2V0KGEueiwwLC1hLngpLm5vcm1hbGl6ZSgpLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKEdrLE1hdGguYWNvcyhhLnkpKSl9OwppZC5wcm90b3R5cGUuc2V0TGVuZ3RoPWZ1bmN0aW9uKGEsYyxlKXt2b2lkIDA9PT1jJiYoYz0uMiphKTt2b2lkIDA9PT1lJiYoZT0uMipjKTt0aGlzLmxpbmUuc2NhbGUuc2V0KDEsTWF0aC5tYXgoMCxhLWMpLDEpO3RoaXMubGluZS51cGRhdGVNYXRyaXgoKTt0aGlzLmNvbmUuc2NhbGUuc2V0KGUsYyxlKTt0aGlzLmNvbmUucG9zaXRpb24ueT1hO3RoaXMuY29uZS51cGRhdGVNYXRyaXgoKX07aWQucHJvdG90eXBlLnNldENvbG9yPWZ1bmN0aW9uKGEpe3RoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQoYSk7dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldChhKX07aWQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSwhMSk7dGhpcy5saW5lLmNvcHkoYS5saW5lKTt0aGlzLmNvbmUuY29weShhLmNvbmUpO3JldHVybiB0aGlzfTtpZC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9OwppZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2lnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1pZztaYS5jcmVhdGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLmxvZygiVEhSRUUuQ3VydmUuY3JlYXRlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCIpO2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucHJvdG90eXBlLmdldFBvaW50PWM7cmV0dXJuIGF9O09iamVjdC5hc3NpZ24oZ2QucHJvdG90eXBlLHtjcmVhdGVQb2ludHNHZW9tZXRyeTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuIik7YT10aGlzLmdldFBvaW50cyhhKTtyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeShhKX0sY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpOwphPXRoaXMuZ2V0U3BhY2VkUG9pbnRzKGEpO3JldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KGEpfSxjcmVhdGVHZW9tZXRyeTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuIik7Zm9yKHZhciBjPW5ldyB5YSxlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXt2YXIgcj1hW2VdO2MudmVydGljZXMucHVzaChuZXcgayhyLngsci55LHIuenx8MCkpfXJldHVybiBjfX0pO09iamVjdC5hc3NpZ24oR2MucHJvdG90eXBlLHtmcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUGF0aDogLmZyb21Qb2ludHMoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUG9pbnRzKCkuIik7dGhpcy5zZXRGcm9tUG9pbnRzKGEpfX0pO1pqLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSk7CmFrLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSk7d2kucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmIucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKHdpLnByb3RvdHlwZSx7aW5pdEZyb21BcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNwbGluZTogLmluaXRGcm9tQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxnZXRDb250cm9sUG9pbnRzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5nZXRDb250cm9sUG9pbnRzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyZXBhcmFtZXRyaXplQnlBcmNMZW5ndGg6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO2NoLnByb3RvdHlwZS5zZXRDb2xvcnM9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5HcmlkSGVscGVyOiBzZXRDb2xvcnMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBwYXNzIHRoZW0gaW4gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuIil9OwpZZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2tlbGV0b25IZWxwZXI6IHVwZGF0ZSgpIG5vIGxvbmdlciBuZWVkcyB0byBiZSBjYWxsZWQuIil9O09iamVjdC5hc3NpZ24oRGIucHJvdG90eXBlLHtleHRyYWN0VXJsQmFzZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxvYWRlcjogLmV4dHJhY3RVcmxCYXNlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkxvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCkgaW5zdGVhZC4iKTtyZXR1cm4gUGkuZXh0cmFjdFVybEJhc2UoYSl9fSk7T2JqZWN0LmFzc2lnbihaZy5wcm90b3R5cGUse3NldFRleHR1cmVQYXRoOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiAuc2V0VGV4dHVyZVBhdGgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRSZXNvdXJjZVBhdGgoKS4iKTtyZXR1cm4gdGhpcy5zZXRSZXNvdXJjZVBhdGgoYSl9fSk7T2JqZWN0LmFzc2lnbih0aS5wcm90b3R5cGUsCntjZW50ZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGEpfSxlbXB0eTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpO3JldHVybiB0aGlzLmlzRW1wdHkoKX0saXNJbnRlcnNlY3Rpb25Cb3g6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveChhKX0sc2l6ZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLiIpO3JldHVybiB0aGlzLmdldFNpemUoYSl9fSk7T2JqZWN0LmFzc2lnbih3LnByb3RvdHlwZSwKe2NlbnRlcjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4iKTtyZXR1cm4gdGhpcy5nZXRDZW50ZXIoYSl9LGVtcHR5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuIik7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfSxpc0ludGVyc2VjdGlvbkJveDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KGEpfSxpc0ludGVyc2VjdGlvblNwaGVyZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGEpfSwKc2l6ZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLiIpO3JldHVybiB0aGlzLmdldFNpemUoYSl9fSk7dWkucHJvdG90eXBlLmNlbnRlcj1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGEpfTtPYmplY3QuYXNzaWduKGhiLHtyYW5kb20xNjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLnJhbmRvbTE2KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIE1hdGgucmFuZG9tKCkgaW5zdGVhZC4iKTtyZXR1cm4gTWF0aC5yYW5kb20oKX0sbmVhcmVzdFBvd2VyT2ZUd286ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRoOiAubmVhcmVzdFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mbG9vclBvd2VyT2ZUd28oKS4iKTsKcmV0dXJuIGhiLmZsb29yUG93ZXJPZlR3byhhKX0sbmV4dFBvd2VyT2ZUd286ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRoOiAubmV4dFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jZWlsUG93ZXJPZlR3bygpLiIpO3JldHVybiBoYi5jZWlsUG93ZXJPZlR3byhhKX19KTtPYmplY3QuYXNzaWduKHQucHJvdG90eXBlLHtmbGF0dGVuVG9BcnJheU9mZnNldDpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy50b0FycmF5KGEsYyl9LG11bHRpcGx5VmVjdG9yMzpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4iKTtyZXR1cm4gYS5hcHBseU1hdHJpeDModGhpcyl9LAptdWx0aXBseVZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFwcGx5VG9CdWZmZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb0J1ZmZlcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGEpfSxhcHBseVRvVmVjdG9yM0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5hc3NpZ24ocS5wcm90b3R5cGUse2V4dHJhY3RQb3NpdGlvbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4iKTsKcmV0dXJuIHRoaXMuY29weVBvc2l0aW9uKGEpfSxmbGF0dGVuVG9BcnJheU9mZnNldDpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy50b0FycmF5KGEsYyl9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuKG5ldyBrKS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMyl9LHNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkuIik7CnJldHVybiB0aGlzLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKGEpfSxtdWx0aXBseVRvQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxtdWx0aXBseVZlY3RvcjM6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMpfSxtdWx0aXBseVZlY3RvcjQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3I0KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMpfSxtdWx0aXBseVZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LApyb3RhdGVBeGlzOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy50cmFuc2Zvcm1EaXJlY3Rpb24oIG1hdHJpeCApIGluc3RlYWQuIik7YS50cmFuc2Zvcm1EaXJlY3Rpb24odGhpcyl9LGNyb3NzVmVjdG9yOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmNyb3NzVmVjdG9yKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMpfSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scm90YXRlWDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVYKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scm90YXRlWTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVZKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCnJvdGF0ZVo6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZUJ5QXhpczpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhcHBseVRvQnVmZmVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShhKX0sYXBwbHlUb1ZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sbWFrZUZydXN0dW06ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VGcnVzdHVtKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkgaW5zdGVhZC4iKTsKcmV0dXJuIHRoaXMubWFrZVBlcnNwZWN0aXZlKGEsYyxnLGUscix2KX19KTtIYi5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25MaW5lPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzTGluZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNMaW5lKGEpfTtoLnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjM9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGlzIG5vdyB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICkgaW5zdGVhZC4iKTtyZXR1cm4gYS5hcHBseVF1YXRlcm5pb24odGhpcyl9O09iamVjdC5hc3NpZ24oRC5wcm90b3R5cGUse2lzSW50ZXJzZWN0aW9uQm94OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7CnJldHVybiB0aGlzLmludGVyc2VjdHNCb3goYSl9LGlzSW50ZXJzZWN0aW9uUGxhbmU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1BsYW5lKCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1BsYW5lKGEpfSxpc0ludGVyc2VjdGlvblNwaGVyZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoYSl9fSk7T2JqZWN0LmFzc2lnbihCLnByb3RvdHlwZSx7YXJlYTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5hcmVhKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QXJlYSgpLiIpO3JldHVybiB0aGlzLmdldEFyZWEoKX0sYmFyeWNvb3JkRnJvbVBvaW50OmZ1bmN0aW9uKGEsCmMpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4iKTtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQoYSxjKX0sbWlkcG9pbnQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm1pZHBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0TWlkcG9pbnQoKS4iKTtyZXR1cm4gdGhpcy5nZXRNaWRwb2ludChhKX0sbm9ybWFsOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4iKTtyZXR1cm4gdGhpcy5nZXROb3JtYWwoYSl9LHBsYW5lOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5wbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFBsYW5lKCkuIik7cmV0dXJuIHRoaXMuZ2V0UGxhbmUoYSl9fSk7T2JqZWN0LmFzc2lnbihCLAp7YmFyeWNvb3JkRnJvbVBvaW50OmZ1bmN0aW9uKGEsYyxlLGcscil7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLiIpO3JldHVybiBCLmdldEJhcnljb29yZChhLGMsZSxnLHIpfSxub3JtYWw6ZnVuY3Rpb24oYSxjLGUsZyl7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLiIpO3JldHVybiBCLmdldE5vcm1hbChhLGMsZSxnKX19KTtPYmplY3QuYXNzaWduKENkLnByb3RvdHlwZSx7ZXh0cmFjdEFsbFBvaW50czpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cmFjdEFsbFBvaW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZXh0cmFjdFBvaW50cygpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuZXh0cmFjdFBvaW50cyhhKX0sZXh0cnVkZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLiIpOwpyZXR1cm4gbmV3IFVkKHRoaXMsYSl9LG1ha2VHZW9tZXRyeTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAubWFrZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgVmQodGhpcyxhKX19KTtPYmplY3QuYXNzaWduKGYucHJvdG90eXBlLHtmcm9tQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3JldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxjLGUpfSxkaXN0YW5jZVRvTWFuaGF0dGFuOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuIik7cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyhhKX0sCmxlbmd0aE1hbmhhdHRhbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfX0pO09iamVjdC5hc3NpZ24oay5wcm90b3R5cGUse3NldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGluc3RlYWQuIil9LHNldEV1bGVyRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUXVhdGVybmlvbigpIGluc3RlYWQuIil9LGdldFBvc2l0aW9uRnJvbU1hdHJpeDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5nZXRQb3NpdGlvbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4UG9zaXRpb24oKS4iKTsKcmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEpfSxnZXRTY2FsZUZyb21NYXRyaXg6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuIik7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFNjYWxlKGEpfSxnZXRDb2x1bW5Gcm9tTWF0cml4OmZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4iKTtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGMsYSl9LGFwcGx5UHJvamVjdGlvbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGEpfSwKZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsYyxlKX0sZGlzdGFuY2VUb01hbmhhdHRhbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oYSl9LGxlbmd0aE1hbmhhdHRhbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfX0pO09iamVjdC5hc3NpZ24ocC5wcm90b3R5cGUsCntmcm9tQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3JldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxjLGUpfSxsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKHlhLnByb3RvdHlwZSx7Y29tcHV0ZVRhbmdlbnRzOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxjb21wdXRlTGluZURpc3RhbmNlczpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpIGluc3RlYWQuIil9fSk7Ck9iamVjdC5hc3NpZ24oQS5wcm90b3R5cGUse2dldENoaWxkQnlOYW1lOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRDaGlsZEJ5TmFtZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE9iamVjdEJ5TmFtZSgpLiIpO3JldHVybiB0aGlzLmdldE9iamVjdEJ5TmFtZShhKX0scmVuZGVyRGVwdGg6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAucmVuZGVyRGVwdGggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5yZW5kZXJPcmRlciwgaW5zdGVhZC4iKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAudHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGMsYSl9LGdldFdvcmxkUm90YXRpb246ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUm90YXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuT2JqZWN0M0QuZ2V0V29ybGRRdWF0ZXJuaW9uKCB0YXJnZXQgKSBpbnN0ZWFkLiIpfX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhBLnByb3RvdHlwZSx7ZXVsZXJPcmRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4iKTtyZXR1cm4gdGhpcy5yb3RhdGlvbi5vcmRlcn0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIik7dGhpcy5yb3RhdGlvbi5vcmRlcj1hfX0sdXNlUXVhdGVybmlvbjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4iKX19fSk7Ck9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFmLnByb3RvdHlwZSx7b2JqZWN0czp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MT0Q6IC5vYmplY3RzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmxldmVscy4iKTtyZXR1cm4gdGhpcy5sZXZlbHN9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShDZy5wcm90b3R5cGUsInVzZVZlcnRleFRleHR1cmUiLHtnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtCZi5wcm90b3R5cGUuaW5pdEJvbmVzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2tpbm5lZE1lc2g6IGluaXRCb25lcygpIGhhcyBiZWVuIHJlbW92ZWQuIil9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShaYS5wcm90b3R5cGUsCiJfX2FyY0xlbmd0aERpdmlzaW9ucyIse2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4iKTtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnN9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuIik7dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9YX19KTt2Yi5wcm90b3R5cGUuc2V0TGVucz1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEuc2V0TGVucyBpcyBkZXByZWNhdGVkLiBVc2UgLnNldEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdlIGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC4iKTt2b2lkIDAhPT1jJiYodGhpcy5maWxtR2F1Z2U9Yyk7dGhpcy5zZXRGb2NhbExlbmd0aChhKX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSmIucHJvdG90eXBlLAp7b25seVNoYWRvdzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLm9ubHlTaGFkb3cgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHNoYWRvd0NhbWVyYUZvdjp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGb3YgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZvdi4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuZm92PWF9fSxzaGFkb3dDYW1lcmFMZWZ0OntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUxlZnQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmxlZnQuIik7dGhpcy5zaGFkb3cuY2FtZXJhLmxlZnQ9YX19LHNoYWRvd0NhbWVyYVJpZ2h0OntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4iKTt0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQ9YX19LHNoYWRvd0NhbWVyYVRvcDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFUb3AgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnRvcC4iKTsKdGhpcy5zaGFkb3cuY2FtZXJhLnRvcD1hfX0sc2hhZG93Q2FtZXJhQm90dG9tOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUJvdHRvbSBpcyBub3cgLnNoYWRvdy5jYW1lcmEuYm90dG9tLiIpO3RoaXMuc2hhZG93LmNhbWVyYS5ib3R0b209YX19LHNoYWRvd0NhbWVyYU5lYXI6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTmVhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEubmVhci4iKTt0aGlzLnNoYWRvdy5jYW1lcmEubmVhcj1hfX0sc2hhZG93Q2FtZXJhRmFyOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZmFyLiIpO3RoaXMuc2hhZG93LmNhbWVyYS5mYXI9YX19LHNoYWRvd0NhbWVyYVZpc2libGU6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFWaXNpYmxlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBsaWdodC5zaGFkb3cuY2FtZXJhICkgaW5zdGVhZC4iKX19LApzaGFkb3dCaWFzOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0JpYXMgaXMgbm93IC5zaGFkb3cuYmlhcy4iKTt0aGlzLnNoYWRvdy5iaWFzPWF9fSxzaGFkb3dEYXJrbmVzczp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0RhcmtuZXNzIGhhcyBiZWVuIHJlbW92ZWQuIil9fSxzaGFkb3dNYXBXaWR0aDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBXaWR0aCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLndpZHRoLiIpO3RoaXMuc2hhZG93Lm1hcFNpemUud2lkdGg9YX19LHNoYWRvd01hcEhlaWdodDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuIik7dGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQ9YX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUS5wcm90b3R5cGUsCntsZW5ndGg6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAubGVuZ3RoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuY291bnQgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy5hcnJheS5sZW5ndGh9fSxjb3B5SW5kaWNlc0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuY29weUluZGljZXNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7T2JqZWN0LmFzc2lnbih2YS5wcm90b3R5cGUse2FkZEluZGV4OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuIik7dGhpcy5zZXRJbmRleChhKX0sYWRkRHJhd0NhbGw6ZnVuY3Rpb24oYSxjLGUpe3ZvaWQgMCE9PWUmJmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIG5vIGxvbmdlciBzdXBwb3J0cyBpbmRleE9mZnNldC4iKTsKY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLiIpO3RoaXMuYWRkR3JvdXAoYSxjKX0sY2xlYXJEcmF3Q2FsbHM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY2xlYXJEcmF3Q2FsbHMoKSBpcyBub3cgLmNsZWFyR3JvdXBzKCkuIik7dGhpcy5jbGVhckdyb3VwcygpfSxjb21wdXRlVGFuZ2VudHM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sY29tcHV0ZU9mZnNldHM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZU9mZnNldHMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHZhLnByb3RvdHlwZSx7ZHJhd2NhbGxzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuIik7CnJldHVybiB0aGlzLmdyb3Vwc319LG9mZnNldHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5vZmZzZXRzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdyb3Vwcy4iKTtyZXR1cm4gdGhpcy5ncm91cHN9fX0pO09iamVjdC5hc3NpZ24oUmMucHJvdG90eXBlLHtnZXRBcnJheXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5nZXRBcnJheXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhZGRTaGFwZUxpc3Q6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZUxpc3QoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhZGRTaGFwZTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiaC5wcm90b3R5cGUsCntkeW5hbWljOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlVuaWZvcm06IC5keW5hbWljIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLiIpfX0sb25VcGRhdGU6e3ZhbHVlOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiAub25VcGRhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpc319fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTS5wcm90b3R5cGUse3dyYXBBcm91bmQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuIil9fSxvdmVyZHJhdzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogLm92ZXJkcmF3IGhhcyBiZWVuIHJlbW92ZWQuIil9LApzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHdyYXBSR0I6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC53cmFwUkdCIGhhcyBiZWVuIHJlbW92ZWQuIik7cmV0dXJuIG5ldyBJfX0sc2hhZGluZzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuIik7dGhpcy5mbGF0U2hhZGluZz0xPT09YX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmMucHJvdG90eXBlLHttZXRhbDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkLiIpOwpyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHFiLnByb3RvdHlwZSx7ZGVyaXZhdGl2ZXM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS4gU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4iKTt0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXM9YX19fSk7T2JqZWN0LmFzc2lnbihPaC5wcm90b3R5cGUsCntjbGVhclRhcmdldDpmdW5jdGlvbihhLGMsZSxnKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5jbGVhclRhcmdldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2V0UmVuZGVyVGFyZ2V0KCkgYW5kIC5jbGVhcigpIGluc3RlYWQuIik7dGhpcy5zZXRSZW5kZXJUYXJnZXQoYSk7dGhpcy5jbGVhcihjLGUsZyl9LGFuaW1hdGU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYW5pbWF0ZSgpIGlzIG5vdyAuc2V0QW5pbWF0aW9uTG9vcCgpLiIpO3RoaXMuc2V0QW5pbWF0aW9uTG9vcChhKX0sZ2V0Q3VycmVudFJlbmRlclRhcmdldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJnZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLiIpO3JldHVybiB0aGlzLmdldFJlbmRlclRhcmdldCgpfSxnZXRNYXhBbmlzb3Ryb3B5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0TWF4QW5pc290cm9weSgpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKS4iKTsKcmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKX0sZ2V0UHJlY2lzaW9uOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLiIpO3JldHVybiB0aGlzLmNhcGFiaWxpdGllcy5wcmVjaXNpb259LHJlc2V0R0xTdGF0ZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnJlc2V0R0xTdGF0ZSgpIGlzIG5vdyAuc3RhdGUucmVzZXQoKS4iKTtyZXR1cm4gdGhpcy5zdGF0ZS5yZXNldCgpfSxzdXBwb3J0c0Zsb2F0VGV4dHVyZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0Zsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0Iil9LApzdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Iil9LHN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpfSxzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQzpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApLiIpOwpyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKX0sc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil9LHN1cHBvcnRzQmxlbmRNaW5NYXg6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIkVYVF9ibGVuZF9taW5tYXgiKX0sc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMoKSBpcyBub3cgLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcy4iKTsKcmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzfSxzdXBwb3J0c0luc3RhbmNlZEFycmF5czpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKX0sZW5hYmxlU2Npc3NvclRlc3Q6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZW5hYmxlU2Npc3NvclRlc3QoKSBpcyBub3cgLnNldFNjaXNzb3JUZXN0KCkuIik7dGhpcy5zZXRTY2lzc29yVGVzdChhKX0saW5pdE1hdGVyaWFsOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkUHJlUGx1Z2luOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUHJlUGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCmFkZFBvc3RQbHVnaW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sdXBkYXRlU2hhZG93TWFwOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudXBkYXRlU2hhZG93TWFwKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0RmFjZUN1bGxpbmc6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRGYWNlQ3VsbGluZygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFsbG9jVGV4dHVyZVVuaXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hbGxvY1RleHR1cmVVbml0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0VGV4dHVyZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXRUZXh0dXJlMkQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlMkQoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwKc2V0VGV4dHVyZUN1YmU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlQ3ViZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGdldEFjdGl2ZU1pcE1hcExldmVsOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0QWN0aXZlTWlwTWFwTGV2ZWwoKSBpcyBub3cgLmdldEFjdGl2ZU1pcG1hcExldmVsKCkuIik7cmV0dXJuIHRoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPaC5wcm90b3R5cGUse3NoYWRvd01hcEVuYWJsZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLiIpO3RoaXMuc2hhZG93TWFwLmVuYWJsZWQ9YX19LHNoYWRvd01hcFR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC50eXBlfSwKc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcFR5cGUgaXMgbm93IC5zaGFkb3dNYXAudHlwZS4iKTt0aGlzLnNoYWRvd01hcC50eXBlPWF9fSxzaGFkb3dNYXBDdWxsRmFjZTp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19LGNvbnRleHQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNvbnRleHQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5nZXRDb250ZXh0KCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy5nZXRDb250ZXh0KCl9fX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyh2ai5wcm90b3R5cGUse2N1bGxGYWNlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxyZW5kZXJSZXZlcnNlU2lkZWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0sCnJlbmRlclNpbmdsZVNpZGVkOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE5iLnByb3RvdHlwZSx7YWN0aXZlQ3ViZUZhY2U6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlOiAuYWN0aXZlQ3ViZUZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gSXQgaXMgbm93IHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIFdlYkdMUmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCkuIil9fSwKYWN0aXZlTWlwTWFwTGV2ZWw6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlOiAuYWN0aXZlTWlwTWFwTGV2ZWwgaGFzIGJlZW4gcmVtb3ZlZC4gSXQgaXMgbm93IHRoZSB0aGlyZCBwYXJhbWV0ZXIgb2YgV2ViR0xSZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoKS4iKX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobS5wcm90b3R5cGUse3dyYXBTOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpO3JldHVybiB0aGlzLnRleHR1cmUud3JhcFN9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpO3RoaXMudGV4dHVyZS53cmFwUz1hfX0sd3JhcFQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuIik7CnJldHVybiB0aGlzLnRleHR1cmUud3JhcFR9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULiIpO3RoaXMudGV4dHVyZS53cmFwVD1hfX0sbWFnRmlsdGVyOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5tYWdGaWx0ZXJ9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuIik7dGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcj1hfX0sbWluRmlsdGVyOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXJ9LApzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpO3RoaXMudGV4dHVyZS5taW5GaWx0ZXI9YX19LGFuaXNvdHJvcHk6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpO3JldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weX0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpO3RoaXMudGV4dHVyZS5hbmlzb3Ryb3B5PWF9fSxvZmZzZXQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLm9mZnNldH0sCnNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIik7dGhpcy50ZXh0dXJlLm9mZnNldD1hfX0scmVwZWF0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5yZXBlYXR9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIik7dGhpcy50ZXh0dXJlLnJlcGVhdD1hfX0sZm9ybWF0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5mb3JtYXR9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuIik7CnRoaXMudGV4dHVyZS5mb3JtYXQ9YX19LHR5cGU6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLiIpO3JldHVybiB0aGlzLnRleHR1cmUudHlwZX0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLiIpO3RoaXMudGV4dHVyZS50eXBlPWF9fSxnZW5lcmF0ZU1pcG1hcHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwc30sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4iKTsKdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1hfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhOaC5wcm90b3R5cGUse3N0YW5kaW5nOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYlZSTWFuYWdlcjogLnN0YW5kaW5nIGhhcyBiZWVuIHJlbW92ZWQuIil9fSx1c2VySGVpZ2h0OntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYlZSTWFuYWdlcjogLnVzZXJIZWlnaHQgaGFzIGJlZW4gcmVtb3ZlZC4iKX19fSk7V2UucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogLmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkF1ZGlvTG9hZGVyIGluc3RlYWQuIik7dmFyIGM9dGhpczsobmV3ICRnKS5sb2FkKGEsZnVuY3Rpb24oZSl7Yy5zZXRCdWZmZXIoZSl9KTtyZXR1cm4gdGhpc307b2kucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvQW5hbHlzZXI6IC5nZXREYXRhKCkgaXMgbm93IC5nZXRGcmVxdWVuY3lEYXRhKCkuIik7CnJldHVybiB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKX07R2IucHJvdG90eXBlLnVwZGF0ZUN1YmVNYXA9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1YmVDYW1lcmE6IC51cGRhdGVDdWJlTWFwKCkgaXMgbm93IC51cGRhdGUoKS4iKTtyZXR1cm4gdGhpcy51cGRhdGUoYSxjKX07RGQuY3Jvc3NPcmlnaW49dm9pZCAwO0RkLmxvYWRUZXh0dXJlPWZ1bmN0aW9uKGEsYyxlLGcpe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuIik7dmFyIHI9bmV3IE1nO3Iuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7YT1yLmxvYWQoYSxlLHZvaWQgMCxnKTtjJiYoYS5tYXBwaW5nPWMpO3JldHVybiBhfTtEZC5sb2FkVGV4dHVyZUN1YmU9ZnVuY3Rpb24oYSxjLGUsZyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLiIpOwp2YXIgcj1uZXcgTGc7ci5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTthPXIubG9hZChhLGUsdm9pZCAwLGcpO2MmJihhLm1hcHBpbmc9Yyk7cmV0dXJuIGF9O0RkLmxvYWRDb21wcmVzc2VkVGV4dHVyZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4iKX07RGQubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuIil9O2IuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nPTU7Yi5BZGRFcXVhdGlvbj0xMDA7Yi5BZGRPcGVyYXRpb249MjtiLkFkZGl0aXZlQmxlbmRpbmc9MjtiLkFscGhhRm9ybWF0PTEwMjE7Yi5BbHdheXNEZXB0aD0KMTtiLkFsd2F5c1N0ZW5jaWxGdW5jPTUxOTtiLkFtYmllbnRMaWdodD1UZztiLkFtYmllbnRMaWdodFByb2JlPWppO2IuQW5pbWF0aW9uQ2xpcD10YztiLkFuaW1hdGlvbkxvYWRlcj1haTtiLkFuaW1hdGlvbk1peGVyPXFpO2IuQW5pbWF0aW9uT2JqZWN0R3JvdXA9U2o7Yi5BbmltYXRpb25VdGlscz1UYjtiLkFyY0N1cnZlPVZlO2IuQXJyYXlDYW1lcmE9dmY7Yi5BcnJvd0hlbHBlcj1pZDtiLkF1ZGlvPVdlO2IuQXVkaW9BbmFseXNlcj1vaTtiLkF1ZGlvQ29udGV4dD1taTtiLkF1ZGlvTGlzdGVuZXI9bGk7Yi5BdWRpb0xvYWRlcj0kZztiLkF4ZXNIZWxwZXI9aWc7Yi5BeGlzSGVscGVyPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQXhpc0hlbHBlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkF4ZXNIZWxwZXIuIik7cmV0dXJuIG5ldyBpZyhhKX07Yi5CYWNrU2lkZT0xO2IuQmFzaWNEZXB0aFBhY2tpbmc9MzIwMDtiLkJhc2ljU2hhZG93TWFwPTA7Yi5CaW5hcnlUZXh0dXJlTG9hZGVyPQpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJpbmFyeVRleHR1cmVMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4iKTtyZXR1cm4gbmV3IEtnKGEpfTtiLkJvbmU9VWg7Yi5Cb29sZWFuS2V5ZnJhbWVUcmFjaz1HZztiLkJvdW5kaW5nQm94SGVscGVyPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3VuZGluZ0JveEhlbHBlciBoYXMgYmVlbiBkZXByZWNhdGVkLiBDcmVhdGluZyBhIFRIUkVFLkJveEhlbHBlciBpbnN0ZWFkLiIpO3JldHVybiBuZXcgaGQoYSxjKX07Yi5Cb3gyPXRpO2IuQm94Mz13O2IuQm94M0hlbHBlcj1nZztiLkJveEJ1ZmZlckdlb21ldHJ5PVhhO2IuQm94R2VvbWV0cnk9U2E7Yi5Cb3hIZWxwZXI9aGQ7Yi5CdWZmZXJBdHRyaWJ1dGU9UTtiLkJ1ZmZlckdlb21ldHJ5PXZhO2IuQnVmZmVyR2VvbWV0cnlMb2FkZXI9WWc7Yi5CeXRlVHlwZT0xMDEwO2IuQ2FjaGU9aWU7Yi5DYW1lcmE9emI7Yi5DYW1lcmFIZWxwZXI9CmZnO2IuQ2FudmFzUmVuZGVyZXI9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5DYW52YXNSZW5kZXJlciBoYXMgYmVlbiByZW1vdmVkIil9O2IuQ2FudmFzVGV4dHVyZT1DZjtiLkNhdG11bGxSb21DdXJ2ZTM9WmI7Yi5DaW5lb25Ub25lTWFwcGluZz00O2IuQ2lyY2xlQnVmZmVyR2VvbWV0cnk9UWU7Yi5DaXJjbGVHZW9tZXRyeT1YZjtiLkNsYW1wVG9FZGdlV3JhcHBpbmc9MTAwMTtiLkNsb2NrPWtpO2IuQ2xvc2VkU3BsaW5lQ3VydmUzPVpqO2IuQ29sb3I9STtiLkNvbG9yS2V5ZnJhbWVUcmFjaz1IZztiLkNvbXByZXNzZWRUZXh0dXJlPURlO2IuQ29tcHJlc3NlZFRleHR1cmVMb2FkZXI9Ymk7Yi5Db25lQnVmZmVyR2VvbWV0cnk9V2Y7Yi5Db25lR2VvbWV0cnk9VmY7Yi5DdWJlQ2FtZXJhPUdiO2IuQ3ViZUdlb21ldHJ5PVNhO2IuQ3ViZVJlZmxlY3Rpb25NYXBwaW5nPTMwMTtiLkN1YmVSZWZyYWN0aW9uTWFwcGluZz0zMDI7Yi5DdWJlVGV4dHVyZT1jZDtiLkN1YmVUZXh0dXJlTG9hZGVyPQpMZztiLkN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nPTMwNjtiLkN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nPTMwNztiLkN1YmljQmV6aWVyQ3VydmU9Q2M7Yi5DdWJpY0JlemllckN1cnZlMz1UYztiLkN1YmljSW50ZXJwb2xhbnQ9RWc7Yi5DdWxsRmFjZUJhY2s9MTtiLkN1bGxGYWNlRnJvbnQ9MjtiLkN1bGxGYWNlRnJvbnRCYWNrPTM7Yi5DdWxsRmFjZU5vbmU9MDtiLkN1cnZlPVphO2IuQ3VydmVQYXRoPWdkO2IuQ3VzdG9tQmxlbmRpbmc9NTtiLkN5bGluZGVyQnVmZmVyR2VvbWV0cnk9ZmQ7Yi5DeWxpbmRlckdlb21ldHJ5PVhkO2IuQ3lsaW5kcmljYWw9WGo7Yi5EYXRhVGV4dHVyZT1BYjtiLkRhdGFUZXh0dXJlMkRBcnJheT1yZTtiLkRhdGFUZXh0dXJlM0Q9c2U7Yi5EYXRhVGV4dHVyZUxvYWRlcj1LZztiLkRlY3JlbWVudFN0ZW5jaWxPcD03NjgzO2IuRGVjcmVtZW50V3JhcFN0ZW5jaWxPcD0zNDA1NjtiLkRlZmF1bHRMb2FkaW5nTWFuYWdlcj1PajtiLkRlcHRoRm9ybWF0PTEwMjY7CmIuRGVwdGhTdGVuY2lsRm9ybWF0PTEwMjc7Yi5EZXB0aFRleHR1cmU9RGY7Yi5EaXJlY3Rpb25hbExpZ2h0PVNnO2IuRGlyZWN0aW9uYWxMaWdodEhlbHBlcj1kZjtiLkRpcmVjdGlvbmFsTGlnaHRTaGFkb3c9Umc7Yi5EaXNjcmV0ZUludGVycG9sYW50PUZnO2IuRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk9SWU7Yi5Eb2RlY2FoZWRyb25HZW9tZXRyeT1KZjtiLkRvdWJsZVNpZGU9MjtiLkRzdEFscGhhRmFjdG9yPTIwNjtiLkRzdENvbG9yRmFjdG9yPTIwODtiLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoKS5zZXREeW5hbWljKCB0cnVlICkgaW5zdGVhZC4iKTtyZXR1cm4obmV3IFEoYSxjKSkuc2V0RHluYW1pYyghMCl9O2IuRWRnZXNHZW9tZXRyeT1QZTtiLkVkZ2VzSGVscGVyPWZ1bmN0aW9uKGEsCmMpe2NvbnNvbGUud2FybigiVEhSRUUuRWRnZXNIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkVkZ2VzR2VvbWV0cnkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IEliKG5ldyBQZShhLmdlb21ldHJ5KSxuZXcgRmIoe2NvbG9yOnZvaWQgMCE9PWM/YzoxNjc3NzIxNX0pKX07Yi5FbGxpcHNlQ3VydmU9cGM7Yi5FcXVhbERlcHRoPTQ7Yi5FcXVhbFN0ZW5jaWxGdW5jPTUxNDtiLkVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nPTMwMztiLkVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nPTMwNDtiLkV1bGVyPXU7Yi5FdmVudERpc3BhdGNoZXI9ZDtiLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeT1SYztiLkV4dHJ1ZGVHZW9tZXRyeT1VZDtiLkZhY2UzPUs7Yi5GYWNlND1mdW5jdGlvbihhLGMsZSxnLHIsdix6KXtjb25zb2xlLndhcm4oIlRIUkVFLkZhY2U0IGhhcyBiZWVuIHJlbW92ZWQuIEEgVEhSRUUuRmFjZTMgd2lsbCBiZSBjcmVhdGVkIGluc3RlYWQuIik7cmV0dXJuIG5ldyBLKGEsCmMsZSxyLHYseil9O2IuRmFjZUNvbG9ycz0xO2IuRmFjZU5vcm1hbHNIZWxwZXI9ZWc7Yi5GaWxlTG9hZGVyPXVjO2IuRmxhdFNoYWRpbmc9MTtiLkZsb2F0MzJBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkZsb2F0MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGNhKGEsYyl9O2IuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZT1jYTtiLkZsb2F0NjRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkZsb2F0NjRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDY0QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGthKGEsYyl9O2IuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZT1rYTtiLkZsb2F0VHlwZT0xMDE1O2IuRm9nPUFnO2IuRm9nRXhwMj16ZztiLkZvbnQ9Z2k7CmIuRm9udExvYWRlcj1oaTtiLkZyb250RmFjZURpcmVjdGlvbkNDVz0xO2IuRnJvbnRGYWNlRGlyZWN0aW9uQ1c9MDtiLkZyb250U2lkZT0wO2IuRnJ1c3R1bT1pYztiLkdhbW1hRW5jb2Rpbmc9MzAwNztiLkdlb21ldHJ5PXlhO2IuR2VvbWV0cnlVdGlscz17bWVyZ2U6ZnVuY3Rpb24oYSxjLGUpe2NvbnNvbGUud2FybigiVEhSRUUuR2VvbWV0cnlVdGlsczogLm1lcmdlKCkgaGFzIGJlZW4gbW92ZWQgdG8gR2VvbWV0cnkuIFVzZSBnZW9tZXRyeS5tZXJnZSggZ2VvbWV0cnkyLCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSBpbnN0ZWFkLiIpO2lmKGMuaXNNZXNoKXtjLm1hdHJpeEF1dG9VcGRhdGUmJmMudXBkYXRlTWF0cml4KCk7dmFyIGc9Yy5tYXRyaXg7Yz1jLmdlb21ldHJ5fWEubWVyZ2UoYyxnLGUpfSxjZW50ZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5HZW9tZXRyeVV0aWxzOiAuY2VudGVyKCkgaGFzIGJlZW4gbW92ZWQgdG8gR2VvbWV0cnkuIFVzZSBnZW9tZXRyeS5jZW50ZXIoKSBpbnN0ZWFkLiIpOwpyZXR1cm4gYS5jZW50ZXIoKX19O2IuR3JlYXRlckRlcHRoPTY7Yi5HcmVhdGVyRXF1YWxEZXB0aD01O2IuR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM9NTE4O2IuR3JlYXRlclN0ZW5jaWxGdW5jPTUxNjtiLkdyaWRIZWxwZXI9Y2g7Yi5Hcm91cD11ZTtiLkhhbGZGbG9hdFR5cGU9MTAxNjtiLkhlbWlzcGhlcmVMaWdodD1OZztiLkhlbWlzcGhlcmVMaWdodEhlbHBlcj1hZjtiLkhlbWlzcGhlcmVMaWdodFByb2JlPWlpO2IuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeT1IZTtiLkljb3NhaGVkcm9uR2VvbWV0cnk9SWY7Yi5JbWFnZUJpdG1hcExvYWRlcj1laTtiLkltYWdlTG9hZGVyPVVlO2IuSW1hZ2VVdGlscz1EZDtiLkltbWVkaWF0ZVJlbmRlck9iamVjdD1jZztiLkluY3JlbWVudFN0ZW5jaWxPcD03NjgyO2IuSW5jcmVtZW50V3JhcFN0ZW5jaWxPcD0zNDA1NTtiLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT1YZztiLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PVdnO2IuSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI9CnJpO2IuSW50MTZBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgbGEoYSxjKX07Yi5JbnQxNkJ1ZmZlckF0dHJpYnV0ZT1sYTtiLkludDMyQXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGJhKGEsYyl9O2IuSW50MzJCdWZmZXJBdHRyaWJ1dGU9YmE7Yi5JbnQ4QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBUKGEsCmMpfTtiLkludDhCdWZmZXJBdHRyaWJ1dGU9VDtiLkludFR5cGU9MTAxMztiLkludGVybGVhdmVkQnVmZmVyPVFkO2IuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU9eGY7Yi5JbnRlcnBvbGFudD1vYztiLkludGVycG9sYXRlRGlzY3JldGU9MjMwMDtiLkludGVycG9sYXRlTGluZWFyPTIzMDE7Yi5JbnRlcnBvbGF0ZVNtb290aD0yMzAyO2IuSW52ZXJ0U3RlbmNpbE9wPTUzODY7Yi5KU09OTG9hZGVyPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuSlNPTkxvYWRlciBoYXMgYmVlbiByZW1vdmVkLiIpfTtiLktlZXBTdGVuY2lsT3A9NzY4MDtiLktleWZyYW1lVHJhY2s9WGI7Yi5MT0Q9QWY7Yi5MYXRoZUJ1ZmZlckdlb21ldHJ5PU9lO2IuTGF0aGVHZW9tZXRyeT1VZjtiLkxheWVycz14O2IuTGVuc0ZsYXJlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTGVuc0ZsYXJlIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy9vYmplY3RzL0xlbnNmbGFyZS5qcyIpfTsKYi5MZXNzRGVwdGg9MjtiLkxlc3NFcXVhbERlcHRoPTM7Yi5MZXNzRXF1YWxTdGVuY2lsRnVuYz01MTU7Yi5MZXNzU3RlbmNpbEZ1bmM9NTEzO2IuTGlnaHQ9SmI7Yi5MaWdodFByb2JlPUhjO2IuTGlnaHRQcm9iZUhlbHBlcj1iZjtiLkxpZ2h0U2hhZG93PVZjO2IuTGluZT1WYjtiLkxpbmUzPXVpO2IuTGluZUJhc2ljTWF0ZXJpYWw9RmI7Yi5MaW5lQ3VydmU9a2M7Yi5MaW5lQ3VydmUzPURjO2IuTGluZURhc2hlZE1hdGVyaWFsPWRlO2IuTGluZUxvb3A9RGc7Yi5MaW5lUGllY2VzPTE7Yi5MaW5lU2VnbWVudHM9SWI7Yi5MaW5lU3RyaXA9MDtiLkxpbmVhckVuY29kaW5nPTNFMztiLkxpbmVhckZpbHRlcj0xMDA2O2IuTGluZWFySW50ZXJwb2xhbnQ9WWY7Yi5MaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI9MTAwODtiLkxpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXI9MTAwNztiLkxpbmVhck1pcG1hcExpbmVhckZpbHRlcj0xMDA4O2IuTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcj0xMDA3OwpiLkxpbmVhclRvbmVNYXBwaW5nPTE7Yi5Mb2FkZXI9RGI7Yi5Mb2FkZXJVdGlscz1QaTtiLkxvYWRpbmdNYW5hZ2VyPSRoO2IuTG9nTHV2RW5jb2Rpbmc9MzAwMztiLkxvb3BPbmNlPTIyMDA7Yi5Mb29wUGluZ1Bvbmc9MjIwMjtiLkxvb3BSZXBlYXQ9MjIwMTtiLkx1bWluYW5jZUFscGhhRm9ybWF0PTEwMjU7Yi5MdW1pbmFuY2VGb3JtYXQ9MTAyNDtiLk1PVVNFPXtMRUZUOjAsTUlERExFOjEsUklHSFQ6MixST1RBVEU6MCxET0xMWToxLFBBTjoyfTtiLk1hdGVyaWFsPU07Yi5NYXRlcmlhbExvYWRlcj1WZztiLk1hdGg9aGI7Yi5NYXRyaXgzPXQ7Yi5NYXRyaXg0PXE7Yi5NYXhFcXVhdGlvbj0xMDQ7Yi5NZXNoPXhhO2IuTWVzaEJhc2ljTWF0ZXJpYWw9TDtiLk1lc2hEZXB0aE1hdGVyaWFsPXZkO2IuTWVzaERpc3RhbmNlTWF0ZXJpYWw9d2Q7Yi5NZXNoRmFjZU1hdGVyaWFsPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaEZhY2VNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4iKTsKcmV0dXJuIGF9O2IuTWVzaExhbWJlcnRNYXRlcmlhbD1iZTtiLk1lc2hNYXRjYXBNYXRlcmlhbD1jZTtiLk1lc2hOb3JtYWxNYXRlcmlhbD1hZTtiLk1lc2hQaG9uZ01hdGVyaWFsPUJjO2IuTWVzaFBoeXNpY2FsTWF0ZXJpYWw9WmQ7Yi5NZXNoU3RhbmRhcmRNYXRlcmlhbD1TYztiLk1lc2hUb29uTWF0ZXJpYWw9JGQ7Yi5NaW5FcXVhdGlvbj0xMDM7Yi5NaXJyb3JlZFJlcGVhdFdyYXBwaW5nPTEwMDI7Yi5NaXhPcGVyYXRpb249MTtiLk11bHRpTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9W10pO2NvbnNvbGUud2FybigiVEhSRUUuTXVsdGlNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4iKTthLmlzTXVsdGlNYXRlcmlhbD0hMDthLm1hdGVyaWFscz1hO2EuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5zbGljZSgpfTtyZXR1cm4gYX07Yi5NdWx0aXBseUJsZW5kaW5nPTQ7Yi5NdWx0aXBseU9wZXJhdGlvbj0wO2IuTmVhcmVzdEZpbHRlcj0KMTAwMztiLk5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI9MTAwNTtiLk5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyPTEwMDQ7Yi5OZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyPTEwMDU7Yi5OZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcj0xMDA0O2IuTmV2ZXJEZXB0aD0wO2IuTmV2ZXJTdGVuY2lsRnVuYz01MTI7Yi5Ob0JsZW5kaW5nPTA7Yi5Ob0NvbG9ycz0wO2IuTm9Ub25lTWFwcGluZz0wO2IuTm9ybWFsQmxlbmRpbmc9MTtiLk5vdEVxdWFsRGVwdGg9NztiLk5vdEVxdWFsU3RlbmNpbEZ1bmM9NTE3O2IuTnVtYmVyS2V5ZnJhbWVUcmFjaz1TZTtiLk9iamVjdDNEPUE7Yi5PYmplY3RMb2FkZXI9Wmc7Yi5PYmplY3RTcGFjZU5vcm1hbE1hcD0xO2IuT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5PVJkO2IuT2N0YWhlZHJvbkdlb21ldHJ5PUhmO2IuT25lRmFjdG9yPTIwMTtiLk9uZU1pbnVzRHN0QWxwaGFGYWN0b3I9MjA3O2IuT25lTWludXNEc3RDb2xvckZhY3Rvcj0yMDk7Yi5PbmVNaW51c1NyY0FscGhhRmFjdG9yPQoyMDU7Yi5PbmVNaW51c1NyY0NvbG9yRmFjdG9yPTIwMztiLk9ydGhvZ3JhcGhpY0NhbWVyYT1iZztiLlBDRlNoYWRvd01hcD0xO2IuUENGU29mdFNoYWRvd01hcD0yO2IuUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5PUZlO2IuUGFyYW1ldHJpY0dlb21ldHJ5PUVmO2IuUGFydGljbGU9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlNwcml0ZS4iKTtyZXR1cm4gbmV3IHlmKGEpfTtiLlBhcnRpY2xlQmFzaWNNYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlQmFzaWNNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLiIpO3JldHVybiBuZXcgQWMoYSl9O2IuUGFydGljbGVTeXN0ZW09ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlU3lzdGVtIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLiIpO3JldHVybiBuZXcgQ2UoYSwKYyl9O2IuUGFydGljbGVTeXN0ZW1NYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IEFjKGEpfTtiLlBhdGg9R2M7Yi5QZXJzcGVjdGl2ZUNhbWVyYT12YjtiLlBsYW5lPUhiO2IuUGxhbmVCdWZmZXJHZW9tZXRyeT1MYztiLlBsYW5lR2VvbWV0cnk9cmQ7Yi5QbGFuZUhlbHBlcj1oZztiLlBvaW50Q2xvdWQ9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuIik7cmV0dXJuIG5ldyBDZShhLGMpfTtiLlBvaW50Q2xvdWRNYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBvaW50Q2xvdWRNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLiIpO3JldHVybiBuZXcgQWMoYSl9O2IuUG9pbnRMaWdodD0KUWc7Yi5Qb2ludExpZ2h0SGVscGVyPVplO2IuUG9pbnRzPUNlO2IuUG9pbnRzTWF0ZXJpYWw9QWM7Yi5Qb2xhckdyaWRIZWxwZXI9ZGg7Yi5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk9amM7Yi5Qb2x5aGVkcm9uR2VvbWV0cnk9RmY7Yi5Qb3NpdGlvbmFsQXVkaW89bmk7Yi5Qb3NpdGlvbmFsQXVkaW9IZWxwZXI9Y2Y7Yi5Qcm9wZXJ0eUJpbmRpbmc9JGI7Yi5Qcm9wZXJ0eU1peGVyPXBpO2IuUXVhZHJhdGljQmV6aWVyQ3VydmU9RWM7Yi5RdWFkcmF0aWNCZXppZXJDdXJ2ZTM9VWM7Yi5RdWF0ZXJuaW9uPWg7Yi5RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaz1aZjtiLlF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudD1JZztiLlJFVklTSU9OPSIxMDgiO2IuUkdCQURlcHRoUGFja2luZz0zMjAxO2IuUkdCQUZvcm1hdD0xMDIzO2IuUkdCQV9BU1RDXzEweDEwX0Zvcm1hdD0zNzgxOTtiLlJHQkFfQVNUQ18xMHg1X0Zvcm1hdD0zNzgxNjtiLlJHQkFfQVNUQ18xMHg2X0Zvcm1hdD0zNzgxNztiLlJHQkFfQVNUQ18xMHg4X0Zvcm1hdD0KMzc4MTg7Yi5SR0JBX0FTVENfMTJ4MTBfRm9ybWF0PTM3ODIwO2IuUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdD0zNzgyMTtiLlJHQkFfQVNUQ180eDRfRm9ybWF0PTM3ODA4O2IuUkdCQV9BU1RDXzV4NF9Gb3JtYXQ9Mzc4MDk7Yi5SR0JBX0FTVENfNXg1X0Zvcm1hdD0zNzgxMDtiLlJHQkFfQVNUQ182eDVfRm9ybWF0PTM3ODExO2IuUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQ9Mzc4MTI7Yi5SR0JBX0FTVENfOHg1X0Zvcm1hdD0zNzgxMztiLlJHQkFfQVNUQ184eDZfRm9ybWF0PTM3ODE0O2IuUkdCQV9BU1RDXzh4OF9Gb3JtYXQ9Mzc4MTU7Yi5SR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQ9MzU4NDM7Yi5SR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQ9MzU4NDI7Yi5SR0JBX1MzVENfRFhUMV9Gb3JtYXQ9MzM3Nzc7Yi5SR0JBX1MzVENfRFhUM19Gb3JtYXQ9MzM3Nzg7Yi5SR0JBX1MzVENfRFhUNV9Gb3JtYXQ9MzM3Nzk7Yi5SR0JERW5jb2Rpbmc9MzAwNjtiLlJHQkVFbmNvZGluZz0zMDAyO2IuUkdCRUZvcm1hdD0KMTAyMztiLlJHQkZvcm1hdD0xMDIyO2IuUkdCTTE2RW5jb2Rpbmc9MzAwNTtiLlJHQk03RW5jb2Rpbmc9MzAwNDtiLlJHQl9FVEMxX0Zvcm1hdD0zNjE5NjtiLlJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0PTM1ODQxO2IuUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQ9MzU4NDA7Yi5SR0JfUzNUQ19EWFQxX0Zvcm1hdD0zMzc3NjtiLlJhd1NoYWRlck1hdGVyaWFsPVJlO2IuUmF5PUQ7Yi5SYXljYXN0ZXI9VWo7Yi5SZWN0QXJlYUxpZ2h0PVVnO2IuUmVjdEFyZWFMaWdodEhlbHBlcj0kZTtiLlJlZEZvcm1hdD0xMDI4O2IuUmVpbmhhcmRUb25lTWFwcGluZz0yO2IuUmVwZWF0V3JhcHBpbmc9MUUzO2IuUmVwbGFjZVN0ZW5jaWxPcD03NjgxO2IuUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb249MTAyO2IuUmluZ0J1ZmZlckdlb21ldHJ5PU5lO2IuUmluZ0dlb21ldHJ5PVRmO2IuU2NlbmU9eTtiLlNjZW5lVXRpbHM9e2NyZWF0ZU11bHRpTWF0ZXJpYWxPYmplY3Q6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9LApkZXRhY2g6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9LGF0dGFjaDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3V0aWxzL1NjZW5lVXRpbHMuanMiKX19O2IuU2hhZGVyQ2h1bms9cmI7Yi5TaGFkZXJMaWI9TWM7Yi5TaGFkZXJNYXRlcmlhbD1xYjtiLlNoYWRvd01hdGVyaWFsPVlkO2IuU2hhcGU9Q2Q7Yi5TaGFwZUJ1ZmZlckdlb21ldHJ5PVdkO2IuU2hhcGVHZW9tZXRyeT1WZDtiLlNoYXBlUGF0aD1maTtiLlNoYXBlVXRpbHM9ZWQ7Yi5TaG9ydFR5cGU9MTAxMTtiLlNrZWxldG9uPUNnO2IuU2tlbGV0b25IZWxwZXI9WWU7Yi5Ta2lubmVkTWVzaD1CZjtiLlNtb290aFNoYWRpbmc9MjtiLlNwaGVyZT1HO2IuU3BoZXJlQnVmZmVyR2VvbWV0cnk9QmQ7Yi5TcGhlcmVHZW9tZXRyeT0KU2Y7Yi5TcGhlcmljYWw9V2o7Yi5TcGhlcmljYWxIYXJtb25pY3MzPWFoO2IuU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc9MzA1O2IuU3BsaW5lPXdpO2IuU3BsaW5lQ3VydmU9RmM7Yi5TcGxpbmVDdXJ2ZTM9YWs7Yi5TcG90TGlnaHQ9UGc7Yi5TcG90TGlnaHRIZWxwZXI9WGU7Yi5TcG90TGlnaHRTaGFkb3c9T2c7Yi5TcHJpdGU9eWY7Yi5TcHJpdGVNYXRlcmlhbD1BZDtiLlNyY0FscGhhRmFjdG9yPTIwNDtiLlNyY0FscGhhU2F0dXJhdGVGYWN0b3I9MjEwO2IuU3JjQ29sb3JGYWN0b3I9MjAyO2IuU3RlcmVvQ2FtZXJhPVFqO2IuU3RyaW5nS2V5ZnJhbWVUcmFjaz1KZztiLlN1YnRyYWN0RXF1YXRpb249MTAxO2IuU3VidHJhY3RpdmVCbGVuZGluZz0zO2IuVE9VQ0g9e1JPVEFURTowLFBBTjoxLERPTExZX1BBTjoyLERPTExZX1JPVEFURTozfTtiLlRhbmdlbnRTcGFjZU5vcm1hbE1hcD0wO2IuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeT1HZTtiLlRldHJhaGVkcm9uR2VvbWV0cnk9CkdmO2IuVGV4dEJ1ZmZlckdlb21ldHJ5PU1lO2IuVGV4dEdlb21ldHJ5PVJmO2IuVGV4dHVyZT1sO2IuVGV4dHVyZUxvYWRlcj1NZztiLlRvcnVzQnVmZmVyR2VvbWV0cnk9S2U7Yi5Ub3J1c0dlb21ldHJ5PU1mO2IuVG9ydXNLbm90QnVmZmVyR2VvbWV0cnk9SmU7Yi5Ub3J1c0tub3RHZW9tZXRyeT1MZjtiLlRyaWFuZ2xlPUI7Yi5UcmlhbmdsZUZhbkRyYXdNb2RlPTI7Yi5UcmlhbmdsZVN0cmlwRHJhd01vZGU9MTtiLlRyaWFuZ2xlc0RyYXdNb2RlPTA7Yi5UdWJlQnVmZmVyR2VvbWV0cnk9U2Q7Yi5UdWJlR2VvbWV0cnk9S2Y7Yi5VVk1hcHBpbmc9MzAwO2IuVWludDE2QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgWihhLGMpfTtiLlVpbnQxNkJ1ZmZlckF0dHJpYnV0ZT1aO2IuVWludDMyQXR0cmlidXRlPQpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuVWludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGVhKGEsYyl9O2IuVWludDMyQnVmZmVyQXR0cmlidXRlPWVhO2IuVWludDhBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgWChhLGMpfTtiLlVpbnQ4QnVmZmVyQXR0cmlidXRlPVg7Yi5VaW50OENsYW1wZWRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBhYShhLApjKX07Yi5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU9YWE7Yi5VbmNoYXJ0ZWQyVG9uZU1hcHBpbmc9MztiLlVuaWZvcm09Ymg7Yi5Vbmlmb3Jtc0xpYj1XYTtiLlVuaWZvcm1zVXRpbHM9Rm07Yi5VbnNpZ25lZEJ5dGVUeXBlPTEwMDk7Yi5VbnNpZ25lZEludDI0OFR5cGU9MTAyMDtiLlVuc2lnbmVkSW50VHlwZT0xMDE0O2IuVW5zaWduZWRTaG9ydDQ0NDRUeXBlPTEwMTc7Yi5VbnNpZ25lZFNob3J0NTU1MVR5cGU9MTAxODtiLlVuc2lnbmVkU2hvcnQ1NjVUeXBlPTEwMTk7Yi5VbnNpZ25lZFNob3J0VHlwZT0xMDEyO2IuVlNNU2hhZG93TWFwPTM7Yi5WZWN0b3IyPWY7Yi5WZWN0b3IzPWs7Yi5WZWN0b3I0PXA7Yi5WZWN0b3JLZXlmcmFtZVRyYWNrPVRlO2IuVmVydGV4PWZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlcnRleCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuVmVjdG9yMyBpbnN0ZWFkLiIpO3JldHVybiBuZXcgayhhLGMsZSl9O2IuVmVydGV4Q29sb3JzPQoyO2IuVmVydGV4Tm9ybWFsc0hlbHBlcj1kZztiLlZpZGVvVGV4dHVyZT1YaDtiLldlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ9bjtiLldlYkdMUmVuZGVyVGFyZ2V0PW07Yi5XZWJHTFJlbmRlclRhcmdldEN1YmU9TmI7Yi5XZWJHTFJlbmRlcmVyPU9oO2IuV2ViR0xVdGlscz13ajtiLldpcmVmcmFtZUdlb21ldHJ5PUVlO2IuV2lyZWZyYW1lSGVscGVyPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5XaXJlZnJhbWVIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBJYihuZXcgRWUoYS5nZW9tZXRyeSksbmV3IEZiKHtjb2xvcjp2b2lkIDAhPT1jP2M6MTY3NzcyMTV9KSl9O2IuV3JhcEFyb3VuZEVuZGluZz0yNDAyO2IuWEhSTG9hZGVyPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuWEhSTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRmlsZUxvYWRlci4iKTsKcmV0dXJuIG5ldyB1YyhhKX07Yi5aZXJvQ3VydmF0dXJlRW5kaW5nPTI0MDA7Yi5aZXJvRmFjdG9yPTIwMDtiLlplcm9TbG9wZUVuZGluZz0yNDAxO2IuWmVyb1N0ZW5jaWxPcD0wO2Iuc1JHQkVuY29kaW5nPTMwMDE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9PcmJpdENvbnRyb2xzLmpzClRIUkVFLk9yYml0Q29udHJvbHM9ZnVuY3Rpb24oYixkKXtmdW5jdGlvbiBmKCl7cmV0dXJuIDIqTWF0aC5QSS82MC82MCpZLmF1dG9Sb3RhdGVTcGVlZH1mdW5jdGlvbiBoKCl7cmV0dXJuIE1hdGgucG93KC45NSxZLnpvb21TcGVlZCl9ZnVuY3Rpb24gayhzYSl7WGEudGhldGEtPXNhfWZ1bmN0aW9uIHQoc2Epe1hhLnBoaS09c2F9ZnVuY3Rpb24gbChzYSl7WS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT91Yi89c2E6WS5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/KFkub2JqZWN0Lnpvb209TWF0aC5tYXgoWS5taW5ab29tLE1hdGgubWluKFkubWF4Wm9vbSxZLm9iamVjdC56b29tKnNhKSksWS5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLHFiPSEwKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpLFkuZW5hYmxlWm9vbT0hMSl9ZnVuY3Rpb24gcChzYSl7WS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT8KdWIqPXNhOlkub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPyhZLm9iamVjdC56b29tPU1hdGgubWF4KFkubWluWm9vbSxNYXRoLm1pbihZLm1heFpvb20sWS5vYmplY3Quem9vbS9zYSkpLFkub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSxxYj0hMCk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4iKSxZLmVuYWJsZVpvb209ITEpfWZ1bmN0aW9uIG0oc2Epe3piLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIG4oc2Epe2ljLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIHEoc2Epe05iLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIHUoc2Epe3ZiLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpO0diLnN1YlZlY3RvcnModmIsemIpLm11bHRpcGx5U2NhbGFyKFkucm90YXRlU3BlZWQpO3NhPQpZLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9ZLmRvbUVsZW1lbnQuYm9keTpZLmRvbUVsZW1lbnQ7aygyKk1hdGguUEkqR2IueC9zYS5jbGllbnRIZWlnaHQpO3QoMipNYXRoLlBJKkdiLnkvc2EuY2xpZW50SGVpZ2h0KTt6Yi5jb3B5KHZiKTtZLnVwZGF0ZSgpfWZ1bmN0aW9uIHgoc2Epe2JjLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpO09kLnN1YlZlY3RvcnMoYmMsaWMpOzA8T2QueT9sKGgoKSk6MD5PZC55JiZwKGgoKSk7aWMuY29weShiYyk7WS51cGRhdGUoKX1mdW5jdGlvbiBBKHNhKXtBYi5zZXQoc2EuY2xpZW50WCxzYS5jbGllbnRZKTtIYi5zdWJWZWN0b3JzKEFiLE5iKS5tdWx0aXBseVNjYWxhcihZLnBhblNwZWVkKTtzZChIYi54LEhiLnkpO05iLmNvcHkoQWIpO1kudXBkYXRlKCl9ZnVuY3Rpb24geSgpe31mdW5jdGlvbiB3KHNhKXswPnNhLmRlbHRhWT9wKGgoKSk6MDxzYS5kZWx0YVkmJmwoaCgpKTtZLnVwZGF0ZSgpfWZ1bmN0aW9uIEMoc2Epe3ZhciBNYj0hMTtzd2l0Y2goc2Eua2V5Q29kZSl7Y2FzZSBZLmtleXMuVVA6c2QoMCwKWS5rZXlQYW5TcGVlZCk7TWI9ITA7YnJlYWs7Y2FzZSBZLmtleXMuQk9UVE9NOnNkKDAsLVkua2V5UGFuU3BlZWQpO01iPSEwO2JyZWFrO2Nhc2UgWS5rZXlzLkxFRlQ6c2QoWS5rZXlQYW5TcGVlZCwwKTtNYj0hMDticmVhaztjYXNlIFkua2V5cy5SSUdIVDpzZCgtWS5rZXlQYW5TcGVlZCwwKSxNYj0hMH1NYiYmKHNhLnByZXZlbnREZWZhdWx0KCksWS51cGRhdGUoKSl9ZnVuY3Rpb24gRyhzYSl7MT09c2EudG91Y2hlcy5sZW5ndGg/emIuc2V0KHNhLnRvdWNoZXNbMF0ucGFnZVgsc2EudG91Y2hlc1swXS5wYWdlWSk6emIuc2V0KC41KihzYS50b3VjaGVzWzBdLnBhZ2VYK3NhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBEKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD9OYi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTpOYi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrCnNhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBCKHNhKXt2YXIgTWI9c2EudG91Y2hlc1swXS5wYWdlWC1zYS50b3VjaGVzWzFdLnBhZ2VYO3NhPXNhLnRvdWNoZXNbMF0ucGFnZVktc2EudG91Y2hlc1sxXS5wYWdlWTtpYy5zZXQoMCxNYXRoLnNxcnQoTWIqTWIrc2Eqc2EpKX1mdW5jdGlvbiBJKHNhKXtZLmVuYWJsZVpvb20mJkIoc2EpO1kuZW5hYmxlUGFuJiZEKHNhKX1mdW5jdGlvbiBOKHNhKXtZLmVuYWJsZVpvb20mJkIoc2EpO1kuZW5hYmxlUm90YXRlJiZHKHNhKX1mdW5jdGlvbiBPKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD92Yi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTp2Yi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrc2EudG91Y2hlc1sxXS5wYWdlWCksLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVkrc2EudG91Y2hlc1sxXS5wYWdlWSkpO0diLnN1YlZlY3RvcnModmIsCnpiKS5tdWx0aXBseVNjYWxhcihZLnJvdGF0ZVNwZWVkKTtzYT1ZLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9ZLmRvbUVsZW1lbnQuYm9keTpZLmRvbUVsZW1lbnQ7aygyKk1hdGguUEkqR2IueC9zYS5jbGllbnRIZWlnaHQpO3QoMipNYXRoLlBJKkdiLnkvc2EuY2xpZW50SGVpZ2h0KTt6Yi5jb3B5KHZiKX1mdW5jdGlvbiBIKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD9BYi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTpBYi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrc2EudG91Y2hlc1sxXS5wYWdlWCksLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVkrc2EudG91Y2hlc1sxXS5wYWdlWSkpO0hiLnN1YlZlY3RvcnMoQWIsTmIpLm11bHRpcGx5U2NhbGFyKFkucGFuU3BlZWQpO3NkKEhiLngsSGIueSk7TmIuY29weShBYil9ZnVuY3Rpb24gSyhzYSl7dmFyIE1iPXNhLnRvdWNoZXNbMF0ucGFnZVgtc2EudG91Y2hlc1sxXS5wYWdlWDtzYT1zYS50b3VjaGVzWzBdLnBhZ2VZLQpzYS50b3VjaGVzWzFdLnBhZ2VZO2JjLnNldCgwLE1hdGguc3FydChNYipNYitzYSpzYSkpO09kLnNldCgwLE1hdGgucG93KGJjLnkvaWMueSxZLnpvb21TcGVlZCkpO2woT2QueSk7aWMuY29weShiYyl9ZnVuY3Rpb24gTShzYSl7WS5lbmFibGVab29tJiZLKHNhKTtZLmVuYWJsZVBhbiYmSChzYSl9ZnVuY3Rpb24gTChzYSl7WS5lbmFibGVab29tJiZLKHNhKTtZLmVuYWJsZVJvdGF0ZSYmTyhzYSl9ZnVuY3Rpb24gUSgpe31mdW5jdGlvbiBUKHNhKXtpZighMSE9PVkuZW5hYmxlZCl7c2EucHJldmVudERlZmF1bHQoKTtZLmRvbUVsZW1lbnQuZm9jdXM/WS5kb21FbGVtZW50LmZvY3VzKCk6d2luZG93LmZvY3VzKCk7c3dpdGNoKHNhLmJ1dHRvbil7Y2FzZSAwOnN3aXRjaChZLm1vdXNlQnV0dG9ucy5MRUZUKXtjYXNlIFRIUkVFLk1PVVNFLlJPVEFURTppZihzYS5jdHJsS2V5fHxzYS5tZXRhS2V5fHxzYS5zaGlmdEtleSl7aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9CkFhLlBBTn1lbHNle2lmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURX1icmVhaztjYXNlIFRIUkVFLk1PVVNFLlBBTjppZihzYS5jdHJsS2V5fHxzYS5tZXRhS2V5fHxzYS5zaGlmdEtleSl7aWYoITE9PT1ZLmVuYWJsZVJvdGF0ZSlyZXR1cm47bShzYSk7RmE9QWEuUk9UQVRFfWVsc2V7aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9QWEuUEFOfWJyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDE6c3dpdGNoKFkubW91c2VCdXR0b25zLk1JRERMRSl7Y2FzZSBUSFJFRS5NT1VTRS5ET0xMWTppZighMT09PVkuZW5hYmxlWm9vbSlyZXR1cm47bihzYSk7RmE9QWEuRE9MTFk7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfWJyZWFrO2Nhc2UgMjpzd2l0Y2goWS5tb3VzZUJ1dHRvbnMuUklHSFQpe2Nhc2UgVEhSRUUuTU9VU0UuUk9UQVRFOmlmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURTsKYnJlYWs7Y2FzZSBUSFJFRS5NT1VTRS5QQU46aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9QWEuUEFOO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX19RmEhPT1BYS5OT05FJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixYLCExKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIixhYSwhMSksWS5kaXNwYXRjaEV2ZW50KHZhKSl9fWZ1bmN0aW9uIFgoc2Epe2lmKCExIT09WS5lbmFibGVkKXN3aXRjaChzYS5wcmV2ZW50RGVmYXVsdCgpLEZhKXtjYXNlIEFhLlJPVEFURTppZighMT09PVkuZW5hYmxlUm90YXRlKWJyZWFrO3Uoc2EpO2JyZWFrO2Nhc2UgQWEuRE9MTFk6aWYoITE9PT1ZLmVuYWJsZVpvb20pYnJlYWs7eChzYSk7YnJlYWs7Y2FzZSBBYS5QQU46ITEhPT1ZLmVuYWJsZVBhbiYmQShzYSl9fWZ1bmN0aW9uIGFhKHNhKXshMSE9PVkuZW5hYmxlZCYmKHkoc2EpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsClgsITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGFhLCExKSxZLmRpc3BhdGNoRXZlbnQoeGEpLEZhPUFhLk5PTkUpfWZ1bmN0aW9uIGxhKHNhKXshMT09PVkuZW5hYmxlZHx8ITE9PT1ZLmVuYWJsZVpvb218fEZhIT09QWEuTk9ORSYmRmEhPT1BYS5ST1RBVEV8fChzYS5wcmV2ZW50RGVmYXVsdCgpLHNhLnN0b3BQcm9wYWdhdGlvbigpLFkuZGlzcGF0Y2hFdmVudCh2YSksdyhzYSksWS5kaXNwYXRjaEV2ZW50KHhhKSl9ZnVuY3Rpb24gWihzYSl7ITEhPT1ZLmVuYWJsZWQmJiExIT09WS5lbmFibGVLZXlzJiYhMSE9PVkuZW5hYmxlUGFuJiZDKHNhKX1mdW5jdGlvbiBiYShzYSl7aWYoITEhPT1ZLmVuYWJsZWQpe3NhLnByZXZlbnREZWZhdWx0KCk7c3dpdGNoKHNhLnRvdWNoZXMubGVuZ3RoKXtjYXNlIDE6c3dpdGNoKFkudG91Y2hlcy5PTkUpe2Nhc2UgVEhSRUUuVE9VQ0guUk9UQVRFOmlmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO0coc2EpO0ZhPQpBYS5UT1VDSF9ST1RBVEU7YnJlYWs7Y2FzZSBUSFJFRS5UT1VDSC5QQU46aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47RChzYSk7RmE9QWEuVE9VQ0hfUEFOO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDI6c3dpdGNoKFkudG91Y2hlcy5UV08pe2Nhc2UgVEhSRUUuVE9VQ0guRE9MTFlfUEFOOmlmKCExPT09WS5lbmFibGVab29tJiYhMT09PVkuZW5hYmxlUGFuKXJldHVybjtJKHNhKTtGYT1BYS5UT1VDSF9ET0xMWV9QQU47YnJlYWs7Y2FzZSBUSFJFRS5UT1VDSC5ET0xMWV9ST1RBVEU6aWYoITE9PT1ZLmVuYWJsZVpvb20mJiExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO04oc2EpO0ZhPUFhLlRPVUNIX0RPTExZX1JPVEFURTticmVhaztkZWZhdWx0OkZhPUFhLk5PTkV9YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfUZhIT09QWEuTk9ORSYmWS5kaXNwYXRjaEV2ZW50KHZhKX19ZnVuY3Rpb24gZWEoc2Epe2lmKCExIT09WS5lbmFibGVkKXN3aXRjaChzYS5wcmV2ZW50RGVmYXVsdCgpLApzYS5zdG9wUHJvcGFnYXRpb24oKSxGYSl7Y2FzZSBBYS5UT1VDSF9ST1RBVEU6aWYoITE9PT1ZLmVuYWJsZVJvdGF0ZSlicmVhaztPKHNhKTtZLnVwZGF0ZSgpO2JyZWFrO2Nhc2UgQWEuVE9VQ0hfUEFOOmlmKCExPT09WS5lbmFibGVQYW4pYnJlYWs7SChzYSk7WS51cGRhdGUoKTticmVhaztjYXNlIEFhLlRPVUNIX0RPTExZX1BBTjppZighMT09PVkuZW5hYmxlWm9vbSYmITE9PT1ZLmVuYWJsZVBhbilicmVhaztNKHNhKTtZLnVwZGF0ZSgpO2JyZWFrO2Nhc2UgQWEuVE9VQ0hfRE9MTFlfUk9UQVRFOmlmKCExPT09WS5lbmFibGVab29tJiYhMT09PVkuZW5hYmxlUm90YXRlKWJyZWFrO0woc2EpO1kudXBkYXRlKCk7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfX1mdW5jdGlvbiBjYShzYSl7ITEhPT1ZLmVuYWJsZWQmJihRKHNhKSxZLmRpc3BhdGNoRXZlbnQoeGEpLEZhPUFhLk5PTkUpfWZ1bmN0aW9uIGthKHNhKXshMSE9PVkuZW5hYmxlZCYmc2EucHJldmVudERlZmF1bHQoKX10aGlzLm9iamVjdD0KYjt0aGlzLmRvbUVsZW1lbnQ9dm9pZCAwIT09ZD9kOmRvY3VtZW50O3RoaXMuZW5hYmxlZD0hMDt0aGlzLnRhcmdldD1uZXcgVEhSRUUuVmVjdG9yMzt0aGlzLm1pbkRpc3RhbmNlPTA7dGhpcy5tYXhEaXN0YW5jZT1JbmZpbml0eTt0aGlzLm1pblpvb209MDt0aGlzLm1heFpvb209SW5maW5pdHk7dGhpcy5taW5Qb2xhckFuZ2xlPTA7dGhpcy5tYXhQb2xhckFuZ2xlPU1hdGguUEk7dGhpcy5taW5BemltdXRoQW5nbGU9LUluZmluaXR5O3RoaXMubWF4QXppbXV0aEFuZ2xlPUluZmluaXR5O3RoaXMuZW5hYmxlRGFtcGluZz0hMTt0aGlzLmRhbXBpbmdGYWN0b3I9LjA1O3RoaXMuZW5hYmxlWm9vbT0hMDt0aGlzLnpvb21TcGVlZD0xO3RoaXMuZW5hYmxlUm90YXRlPSEwO3RoaXMucm90YXRlU3BlZWQ9MTt0aGlzLmVuYWJsZVBhbj0hMDt0aGlzLnBhblNwZWVkPTE7dGhpcy5zY3JlZW5TcGFjZVBhbm5pbmc9ITE7dGhpcy5rZXlQYW5TcGVlZD03O3RoaXMuYXV0b1JvdGF0ZT0hMTt0aGlzLmF1dG9Sb3RhdGVTcGVlZD0KMjt0aGlzLmVuYWJsZUtleXM9ITA7dGhpcy5rZXlzPXtMRUZUOjM3LFVQOjM4LFJJR0hUOjM5LEJPVFRPTTo0MH07dGhpcy5tb3VzZUJ1dHRvbnM9e0xFRlQ6VEhSRUUuTU9VU0UuUk9UQVRFLE1JRERMRTpUSFJFRS5NT1VTRS5ET0xMWSxSSUdIVDpUSFJFRS5NT1VTRS5QQU59O3RoaXMudG91Y2hlcz17T05FOlRIUkVFLlRPVUNILlJPVEFURSxUV086VEhSRUUuVE9VQ0guRE9MTFlfUEFOfTt0aGlzLnRhcmdldDA9dGhpcy50YXJnZXQuY2xvbmUoKTt0aGlzLnBvc2l0aW9uMD10aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpO3RoaXMuem9vbTA9dGhpcy5vYmplY3Quem9vbTt0aGlzLmdldFBvbGFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gU2EucGhpfTt0aGlzLmdldEF6aW11dGhhbEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIFNhLnRoZXRhfTt0aGlzLnNhdmVTdGF0ZT1mdW5jdGlvbigpe1kudGFyZ2V0MC5jb3B5KFkudGFyZ2V0KTtZLnBvc2l0aW9uMC5jb3B5KFkub2JqZWN0LnBvc2l0aW9uKTsKWS56b29tMD1ZLm9iamVjdC56b29tfTt0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7WS50YXJnZXQuY29weShZLnRhcmdldDApO1kub2JqZWN0LnBvc2l0aW9uLmNvcHkoWS5wb3NpdGlvbjApO1kub2JqZWN0Lnpvb209WS56b29tMDtZLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7WS5kaXNwYXRjaEV2ZW50KEVhKTtZLnVwZGF0ZSgpO0ZhPUFhLk5PTkV9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIHNhPW5ldyBUSFJFRS5WZWN0b3IzLE1iPShuZXcgVEhSRUUuUXVhdGVybmlvbikuc2V0RnJvbVVuaXRWZWN0b3JzKGIudXAsbmV3IFRIUkVFLlZlY3RvcjMoMCwxLDApKSx3Yz1NYi5jbG9uZSgpLmludmVyc2UoKSxiZD1uZXcgVEhSRUUuVmVjdG9yMyx0ZD1uZXcgVEhSRUUuUXVhdGVybmlvbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdGc9WS5vYmplY3QucG9zaXRpb247c2EuY29weSh0Zykuc3ViKFkudGFyZ2V0KTtzYS5hcHBseVF1YXRlcm5pb24oTWIpO1NhLnNldEZyb21WZWN0b3IzKHNhKTsKWS5hdXRvUm90YXRlJiZGYT09PUFhLk5PTkUmJmsoZigpKTtZLmVuYWJsZURhbXBpbmc/KFNhLnRoZXRhKz1YYS50aGV0YSpZLmRhbXBpbmdGYWN0b3IsU2EucGhpKz1YYS5waGkqWS5kYW1waW5nRmFjdG9yKTooU2EudGhldGErPVhhLnRoZXRhLFNhLnBoaSs9WGEucGhpKTtTYS50aGV0YT1NYXRoLm1heChZLm1pbkF6aW11dGhBbmdsZSxNYXRoLm1pbihZLm1heEF6aW11dGhBbmdsZSxTYS50aGV0YSkpO1NhLnBoaT1NYXRoLm1heChZLm1pblBvbGFyQW5nbGUsTWF0aC5taW4oWS5tYXhQb2xhckFuZ2xlLFNhLnBoaSkpO1NhLm1ha2VTYWZlKCk7U2EucmFkaXVzKj11YjtTYS5yYWRpdXM9TWF0aC5tYXgoWS5taW5EaXN0YW5jZSxNYXRoLm1pbihZLm1heERpc3RhbmNlLFNhLnJhZGl1cykpOyEwPT09WS5lbmFibGVEYW1waW5nP1kudGFyZ2V0LmFkZFNjYWxlZFZlY3RvcihCYixZLmRhbXBpbmdGYWN0b3IpOlkudGFyZ2V0LmFkZChCYik7c2Euc2V0RnJvbVNwaGVyaWNhbChTYSk7c2EuYXBwbHlRdWF0ZXJuaW9uKHdjKTsKdGcuY29weShZLnRhcmdldCkuYWRkKHNhKTtZLm9iamVjdC5sb29rQXQoWS50YXJnZXQpOyEwPT09WS5lbmFibGVEYW1waW5nPyhYYS50aGV0YSo9MS1ZLmRhbXBpbmdGYWN0b3IsWGEucGhpKj0xLVkuZGFtcGluZ0ZhY3RvcixCYi5tdWx0aXBseVNjYWxhcigxLVkuZGFtcGluZ0ZhY3RvcikpOihYYS5zZXQoMCwwLDApLEJiLnNldCgwLDAsMCkpO3ViPTE7cmV0dXJuIHFifHxiZC5kaXN0YW5jZVRvU3F1YXJlZChZLm9iamVjdC5wb3NpdGlvbik+eWF8fDgqKDEtdGQuZG90KFkub2JqZWN0LnF1YXRlcm5pb24pKT55YT8oWS5kaXNwYXRjaEV2ZW50KEVhKSxiZC5jb3B5KFkub2JqZWN0LnBvc2l0aW9uKSx0ZC5jb3B5KFkub2JqZWN0LnF1YXRlcm5pb24pLHFiPSExLCEwKTohMX19KCk7dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixrYSwhMSk7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsClQsITEpO1kuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsbGEsITEpO1kuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixiYSwhMSk7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixjYSwhMSk7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsZWEsITEpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsWCwhMSk7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsYWEsITEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixaLCExKX07dmFyIFk9dGhpcyxFYT17dHlwZToiY2hhbmdlIn0sdmE9e3R5cGU6InN0YXJ0In0seGE9e3R5cGU6ImVuZCJ9LEFhPXtOT05FOi0xLFJPVEFURTowLERPTExZOjEsUEFOOjIsVE9VQ0hfUk9UQVRFOjMsVE9VQ0hfUEFOOjQsVE9VQ0hfRE9MTFlfUEFOOjUsVE9VQ0hfRE9MTFlfUk9UQVRFOjZ9LApGYT1BYS5OT05FLHlhPTFFLTYsU2E9bmV3IFRIUkVFLlNwaGVyaWNhbCxYYT1uZXcgVEhSRUUuU3BoZXJpY2FsLHViPTEsQmI9bmV3IFRIUkVFLlZlY3RvcjMscWI9ITEsemI9bmV3IFRIUkVFLlZlY3RvcjIsdmI9bmV3IFRIUkVFLlZlY3RvcjIsR2I9bmV3IFRIUkVFLlZlY3RvcjIsTmI9bmV3IFRIUkVFLlZlY3RvcjIsQWI9bmV3IFRIUkVFLlZlY3RvcjIsSGI9bmV3IFRIUkVFLlZlY3RvcjIsaWM9bmV3IFRIUkVFLlZlY3RvcjIsYmM9bmV3IFRIUkVFLlZlY3RvcjIsT2Q9bmV3IFRIUkVFLlZlY3RvcjIscmQ9ZnVuY3Rpb24oKXt2YXIgc2E9bmV3IFRIUkVFLlZlY3RvcjM7cmV0dXJuIGZ1bmN0aW9uKE1iLHdjKXtzYS5zZXRGcm9tTWF0cml4Q29sdW1uKHdjLDApO3NhLm11bHRpcGx5U2NhbGFyKC1NYik7QmIuYWRkKHNhKX19KCksTGM9ZnVuY3Rpb24oKXt2YXIgc2E9bmV3IFRIUkVFLlZlY3RvcjM7cmV0dXJuIGZ1bmN0aW9uKE1iLHdjKXshMD09PVkuc2NyZWVuU3BhY2VQYW5uaW5nPwpzYS5zZXRGcm9tTWF0cml4Q29sdW1uKHdjLDEpOihzYS5zZXRGcm9tTWF0cml4Q29sdW1uKHdjLDApLHNhLmNyb3NzVmVjdG9ycyhZLm9iamVjdC51cCxzYSkpO3NhLm11bHRpcGx5U2NhbGFyKE1iKTtCYi5hZGQoc2EpfX0oKSxzZD1mdW5jdGlvbigpe3ZhciBzYT1uZXcgVEhSRUUuVmVjdG9yMztyZXR1cm4gZnVuY3Rpb24oTWIsd2Mpe3ZhciBiZD1ZLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9ZLmRvbUVsZW1lbnQuYm9keTpZLmRvbUVsZW1lbnQ7aWYoWS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYSl7c2EuY29weShZLm9iamVjdC5wb3NpdGlvbikuc3ViKFkudGFyZ2V0KTt2YXIgdGQ9c2EubGVuZ3RoKCk7dGQqPU1hdGgudGFuKFkub2JqZWN0LmZvdi8yKk1hdGguUEkvMTgwKTtyZCgyKk1iKnRkL2JkLmNsaWVudEhlaWdodCxZLm9iamVjdC5tYXRyaXgpO0xjKDIqd2MqdGQvYmQuY2xpZW50SGVpZ2h0LFkub2JqZWN0Lm1hdHJpeCl9ZWxzZSBZLm9iamVjdC5pc09ydGhvZ3JhcGhpY0NhbWVyYT8KKHJkKE1iKihZLm9iamVjdC5yaWdodC1ZLm9iamVjdC5sZWZ0KS9ZLm9iamVjdC56b29tL2JkLmNsaWVudFdpZHRoLFkub2JqZWN0Lm1hdHJpeCksTGMod2MqKFkub2JqZWN0LnRvcC1ZLm9iamVjdC5ib3R0b20pL1kub2JqZWN0Lnpvb20vYmQuY2xpZW50SGVpZ2h0LFkub2JqZWN0Lm1hdHJpeCkpOihjb25zb2xlLndhcm4oIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIHBhbiBkaXNhYmxlZC4iKSxZLmVuYWJsZVBhbj0hMSl9fSgpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsa2EsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLFQsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsbGEsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixiYSwhMSk7WS5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwKY2EsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGVhLCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsWiwhMSk7dGhpcy51cGRhdGUoKX07VEhSRUUuT3JiaXRDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5PcmJpdENvbnRyb2xzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1USFJFRS5PcmJpdENvbnRyb2xzO1RIUkVFLk1hcENvbnRyb2xzPWZ1bmN0aW9uKGIsZCl7VEhSRUUuT3JiaXRDb250cm9scy5jYWxsKHRoaXMsYixkKTt0aGlzLm1vdXNlQnV0dG9ucy5MRUZUPVRIUkVFLk1PVVNFLlBBTjt0aGlzLm1vdXNlQnV0dG9ucy5SSUdIVD1USFJFRS5NT1VTRS5ST1RBVEU7dGhpcy50b3VjaGVzLk9ORT1USFJFRS5UT1VDSC5QQU47dGhpcy50b3VjaGVzLlRXTz1USFJFRS5UT1VDSC5ET0xMWV9ST1RBVEV9OwpUSFJFRS5NYXBDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5NYXBDb250cm9scy5wcm90b3R5cGUuY29uc3RydWN0b3I9VEhSRUUuTWFwQ29udHJvbHM7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9hcnJheS1idWZmZXItZGF0YS1wcm92aWRlci5qcwp2YXIgTGs7CihmdW5jdGlvbihiKXtiLkVycm9yQ29kZXM9e0NBTkNFTExFRDoxfTtjb25zdCBkPXtWRVJURVg6MSxGQUNFOjIsQ09MT1I6M30sZj17VkVSVEVYOiJmbG9hdDMyIixGQUNFOiJpbnQzMiIsQ09MT1I6InVpbnQ4In07Y2xhc3MgaHtjb25zdHJ1Y3RvcihrKXt0aGlzLl9yZXF1ZXN0TWFuYWdlcj1rO3RoaXMuX2NhbmNlbGxlcj1uZXcgdmMuQ2FuY2VsbGVyfXJlbG9hZChrLHQsbCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO3JldHVybiB0aGlzLl9mZXRjaE1ldGFkYXRhKGssdCxsKX1fZmV0Y2hEYXRhQnlTdGVwKGssdCxsLHAsbSxuKXtmdW5jdGlvbiBxKHUpe2xldCB4PVtdO2ZvcihsZXQgQT0wO0E8dS5sZW5ndGgvMztBKyspe2xldCB5PVtdO2ZvcihsZXQgdz0wOzM+dzt3KyspeS5wdXNoKHVbMypBK3ddKTt4LnB1c2goeSl9cmV0dXJuIHh9az12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgibWVzaCIsIi9kYXRhIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6dCxydW46aywKY29udGVudF90eXBlOmwsc2FtcGxlOnAsc3RlcDptfSkpO3Q9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKHU9PntpZih1LmNhbmNlbGxlZClyZXR1cm4gUHJvbWlzZS5yZWplY3Qoe2NvZGU6Yi5FcnJvckNvZGVzLkNBTkNFTExFRCxtZXNzYWdlOiJSZXNwb25zZSB3YXMgaW52YWxpZGF0ZWQuIn0pO3U9dS52YWx1ZTtzd2l0Y2gobCl7Y2FzZSAiVkVSVEVYIjpuLnZlcnRpY2VzPXEobmV3IEZsb2F0MzJBcnJheSh1KSk7YnJlYWs7Y2FzZSAiRkFDRSI6bi5mYWNlcz1xKG5ldyBJbnQzMkFycmF5KHUpKTticmVhaztjYXNlICJDT0xPUiI6bi5jb2xvcnM9cShuZXcgVWludDhBcnJheSh1KSl9cmV0dXJuIG59KTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIuZmV0Y2goayxudWxsLCJhcnJheWJ1ZmZlciIsZltsXSkudGhlbih1PT51LmFycmF5QnVmZmVyKCkpLnRoZW4odCl9ZmV0Y2hEYXRhKGssdCxsLHApe2xldCBtPVtdLG49bmV3IE1hcDtPYmplY3Qua2V5cyhkKS5mb3JFYWNoKHE9Pgp7ay5jb21wb25lbnRzJjE8PGRbcV0mJm0ucHVzaCh0aGlzLl9mZXRjaERhdGFCeVN0ZXAodCxsLHEscCxrLnN0ZXAsbikpfSk7cmV0dXJuIFByb21pc2UuYWxsKG0pfV9mZXRjaE1ldGFkYXRhKGssdCxsKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7az12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgibWVzaCIsIi9tZXNoZXMiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzp0LHJ1bjprLHNhbXBsZTpsfSkpO3Q9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKHA9PnAuY2FuY2VsbGVkP1Byb21pc2UucmVqZWN0KHtjb2RlOmIuRXJyb3JDb2Rlcy5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTpwLnZhbHVlKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIuZmV0Y2goaykudGhlbihwPT5wLmpzb24oKSkudGhlbih0KS50aGVuKHRoaXMuX3Byb2Nlc3NNZXRhZGF0YS5iaW5kKHRoaXMpKX1fcHJvY2Vzc01ldGFkYXRhKGspe2lmKGspe3ZhciB0PQpuZXcgTWFwO2ZvcihsZXQgcD0wO3A8ay5sZW5ndGg7cCsrKXtsZXQgbT1rW3BdO3QuaGFzKG0uc3RlcCl8fHQuc2V0KG0uc3RlcCxbXSk7dC5nZXQobS5zdGVwKS5wdXNoKG0pfXZhciBsPVtdO3QuZm9yRWFjaChwPT57cD10aGlzLl9jcmVhdGVTdGVwRGF0dW0ocFswXSk7bC5wdXNoKHApfSk7cmV0dXJuIGx9fV9jcmVhdGVTdGVwRGF0dW0oayl7cmV0dXJue3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqay53YWxsX3RpbWUpLHN0ZXA6ay5zdGVwLGNvbmZpZzprLmNvbmZpZyxjb250ZW50X3R5cGU6ay5jb250ZW50X3R5cGUsY29tcG9uZW50czprLmNvbXBvbmVudHN9fX1iLkFycmF5QnVmZmVyRGF0YVByb3ZpZGVyPWh9KShMa3x8KExrPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9tZXNoLXZpZXdlci5qcwooZnVuY3Rpb24oYil7Y2xhc3MgZCBleHRlbmRzIFRIUkVFLkV2ZW50RGlzcGF0Y2hlcntjb25zdHJ1Y3RvcihmKXtzdXBlcigpO3RoaXMuX2xhc3RNZXNoPW51bGw7dGhpcy5fY2xvY2s9bmV3IFRIUkVFLkNsb2NrO3RoaXMuX2NhbnZhc1NpemU9bnVsbDt0aGlzLl9ydW5Db2xvcj1mfV9pc09iamVjdChmKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGYmJm51bGwhPWYmJiFBcnJheS5pc0FycmF5KGYpfV9hcHBseURlZmF1bHRzKGYsaCl7bGV0IGs9e307Zj1bZixoXTtmb3IoaD0wO2g8Zi5sZW5ndGg7aCsrKXtjb25zdCB0PWZbaF07Zm9yKGxldCBsIGluIHQpe2NvbnN0IHA9bCBpbiBrO3RoaXMuX2lzT2JqZWN0KHRbbF0pP2tbbF09dGhpcy5fYXBwbHlEZWZhdWx0cyhrW2xdfHx7fSx0W2xdKTpwfHwoa1tsXT10W2xdKX19cmV0dXJuIGt9X2NyZWF0ZVdvcmxkKGYsaCl7dGhpcy5pc1JlYWR5KCl8fCh0aGlzLl9zY2VuZT1uZXcgVEhSRUUuU2NlbmUsdGhpcy5fY2FtZXJhPWY9bmV3IFRIUkVFW2YuY2FtZXJhLmNsc10oZi5jYW1lcmEuZm92LAp0aGlzLl9jYW52YXNTaXplLndpZHRoL3RoaXMuX2NhbnZhc1NpemUuaGVpZ2h0LGYuY2FtZXJhLm5lYXIsZi5jYW1lcmEuZmFyKSxoPW5ldyBUSFJFRS5PcmJpdENvbnRyb2xzKGYsaCksaC5sb29rU3BlZWQ9LjQsaC5tb3ZlbWVudFNwZWVkPTIwLGgubm9GbHk9ITAsaC5sb29rVmVydGljYWw9ITAsaC5jb25zdHJhaW5WZXJ0aWNhbD0hMCxoLnZlcnRpY2FsTWluPTEsaC52ZXJ0aWNhbE1heD0yLGguYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLl9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlLmJpbmQodGhpcykpLHRoaXMuX2NhbWVyYUNvbnRyb2xzPWgsdGhpcy5fcmVuZGVyZXI9bmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoe2FudGlhbGlhczohMH0pLHRoaXMuX3JlbmRlcmVyLnNldFBpeGVsUmF0aW8oKSx0aGlzLl9yZW5kZXJlci5zZXRTaXplKHRoaXMuX2NhbnZhc1NpemUud2lkdGgsdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQpLHRoaXMuX3JlbmRlcmVyLnNldENsZWFyQ29sb3IoMTY3NzcyMTUsCjEpKX1fY2xlYXJTY2VuZSgpe2Zvcig7MDx0aGlzLl9zY2VuZS5jaGlsZHJlbi5sZW5ndGg7KXRoaXMuX3NjZW5lLnJlbW92ZSh0aGlzLl9zY2VuZS5jaGlsZHJlblswXSl9Z2V0UmVuZGVyZXIoKXtyZXR1cm4gdGhpcy5fcmVuZGVyZXJ9Z2V0Q2FtZXJhQ29udHJvbHMoKXtyZXR1cm4gdGhpcy5fY2FtZXJhQ29udHJvbHN9aXNSZWFkeSgpe3JldHVybiEhdGhpcy5fY2FtZXJhJiYhIXRoaXMuX2NhbWVyYUNvbnRyb2xzfWdldENhbWVyYVBvc2l0aW9uKCl7cmV0dXJue2Zhcjp0aGlzLl9jYW1lcmEuZmFyLHBvc2l0aW9uOnRoaXMuX2NhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLHRhcmdldDp0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQuY2xvbmUoKX19c2V0Q2FudmFzU2l6ZShmKXt0aGlzLl9jYW52YXNTaXplPWZ9ZHJhdygpe3RoaXMuX2FuaW1hdGlvbkZyYW1lSW5kZXgmJmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGlvbkZyYW1lSW5kZXgpO3RoaXMuX2NhbWVyYS5hc3BlY3Q9CnRoaXMuX2NhbnZhc1NpemUud2lkdGgvdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQ7dGhpcy5fY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLl9yZW5kZXJlci5zZXRTaXplKHRoaXMuX2NhbnZhc1NpemUud2lkdGgsdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQpO2NvbnN0IGY9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLl9jbG9jay5nZXREZWx0YSgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZShoKTt0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4PXJlcXVlc3RBbmltYXRpb25GcmFtZShmKTt0aGlzLl9yZW5kZXJlci5yZW5kZXIodGhpcy5fc2NlbmUsdGhpcy5fY2FtZXJhKX0uYmluZCh0aGlzKTtmKCl9dXBkYXRlU2NlbmUoZixoKXtsZXQgaz17fTsiY29uZmlnImluIGYmJmYuY29uZmlnJiYoaz1KU09OLnBhcnNlKGYuY29uZmlnKSk7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJiZWZvcmVVcGRhdGVTY2VuZSJ9KTtrPXRoaXMuX2FwcGx5RGVmYXVsdHMoayx7Y2FtZXJhOntjbHM6IlBlcnNwZWN0aXZlQ2FtZXJhIiwKZm92Ojc1LG5lYXI6LjEsZmFyOjFFM30sbGlnaHRzOlt7Y2xzOiJBbWJpZW50TGlnaHQiLGNvbG9yOiIjZmZmZmZmIixpbnRlbnNpdHk6Ljc1fSx7Y2xzOiJEaXJlY3Rpb25hbExpZ2h0Iixjb2xvcjoiI2ZmZmZmZiIsaW50ZW5zaXR5Oi43NSxwb3NpdGlvbjpbMCwtMSwyXX1dfSk7dGhpcy5fY3JlYXRlV29ybGQoayxoKTt0aGlzLl9jbGVhclNjZW5lKCk7dGhpcy5fY3JlYXRlTGlnaHRzKHRoaXMuX3NjZW5lLGspO3RoaXMuX2NyZWF0ZUdlb21ldHJ5KGYsayk7dGhpcy5kcmF3KCl9cmVzZXRWaWV3KCl7aWYodGhpcy5pc1JlYWR5KCkpe3RoaXMuX2NhbWVyYUNvbnRyb2xzLnJlc2V0KCk7aWYoIWYmJnRoaXMuX2xhc3RNZXNoKXZhciBmPXRoaXMuX2xhc3RNZXNoO2YmJih0aGlzLl9maXRPYmplY3RUb1ZpZXdwb3J0KGYpLHRoaXMuX2xhc3RNZXNoPWYpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZSgpfX1fY3JlYXRlR2VvbWV0cnkoZixoKXtmPWYubWVzaDtmLnZlcnRpY2VzJiZmLmZhY2VzJiYKZi5mYWNlcy5sZW5ndGg/dGhpcy5fY3JlYXRlTWVzaChmLGgpOnRoaXMuX2NyZWF0ZVBvaW50Q2xvdWQoZixoKX1fY3JlYXRlUG9pbnRDbG91ZChmLGgpe3ZhciBrPWYudmVydGljZXM7Zj1mLmNvbG9ycztsZXQgdD17bWF0ZXJpYWw6e2NsczoiUG9pbnRzTWF0ZXJpYWwiLHNpemU6LjAwNX19O2YmJmYubGVuZ3RoPT1rLmxlbmd0aD90Lm1hdGVyaWFsLnZlcnRleENvbG9ycz1USFJFRS5WZXJ0ZXhDb2xvcnM6dC5tYXRlcmlhbC5jb2xvcj10aGlzLl9ydW5Db2xvcjtoPXRoaXMuX2FwcGx5RGVmYXVsdHMoaCx0KTt2YXIgbD1uZXcgVEhSRUUuR2VvbWV0cnk7ay5mb3JFYWNoKGZ1bmN0aW9uKHApe3ZhciBtPW5ldyBUSFJFRS5WZWN0b3IzKHBbMF0scFsxXSxwWzJdKTttLng9MSpwWzBdO20ueT0xKnBbMV07bS56PTEqcFsyXTtsLnZlcnRpY2VzLnB1c2gobSl9KTtmJiZmLmxlbmd0aD09ay5sZW5ndGgmJmYuZm9yRWFjaChmdW5jdGlvbihwKXtwPW5ldyBUSFJFRS5Db2xvcihwWzBdLzI1NSwKcFsxXS8yNTUscFsyXS8yNTUpO2wuY29sb3JzLnB1c2gocCl9KTtrPW5ldyBUSFJFRVtoLm1hdGVyaWFsLmNsc10oaC5tYXRlcmlhbCk7az1uZXcgVEhSRUUuUG9pbnRzKGwsayk7dGhpcy5fc2NlbmUuYWRkKGspO3RoaXMuX2xhc3RNZXNoPWt9c2V0Q2FtZXJhVmlld3BvaW50KGYsaCxrKXt0aGlzLl9zaWxlbnQ9ITA7dGhpcy5fY2FtZXJhLmZhcj1oO3RoaXMuX2NhbWVyYS5wb3NpdGlvbi5zZXQoZi54LGYueSxmLnopO3RoaXMuX2NhbWVyYS5sb29rQXQoay5jbG9uZSgpKTt0aGlzLl9jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnRhcmdldD1rLmNsb25lKCk7dGhpcy5fY2FtZXJhQ29udHJvbHMudXBkYXRlKCk7dGhpcy5fc2lsZW50PSExfV9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlKGYpe3RoaXMuX3NpbGVudHx8dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJjYW1lcmFQb3NpdGlvbkNoYW5nZSIsZXZlbnQ6Zn0pfV9maXRPYmplY3RUb1ZpZXdwb3J0KGYpe3ZhciBoPQpuZXcgVEhSRUUuQm94MztoLnNldEZyb21PYmplY3QoZik7Zj1oLmNlbnRlcigpO3ZhciBrPWguc2l6ZSgpO2s9MS4yNSpNYXRoLmFicyhNYXRoLm1heChrLngsay55LGsueikvKDIqTWF0aC50YW4oTWF0aC5QSS8xODAqdGhpcy5fY2FtZXJhLmZvdi8yKSkpO2g9aC5taW4uejt0aGlzLnNldENhbWVyYVZpZXdwb2ludCh7eDpmLngseTpmLnksejprfSwzKigwPmg/LWgrazprLWgpLGYpfV9jcmVhdGVNZXNoKGYsaCl7dmFyIGs9Zi52ZXJ0aWNlcztjb25zdCB0PWYuZmFjZXMsbD1mLmNvbG9ycztmPXRoaXMuX2FwcGx5RGVmYXVsdHMoaCx7bWF0ZXJpYWw6e2NsczoiTWVzaFN0YW5kYXJkTWF0ZXJpYWwiLGNvbG9yOiIjYTBhMGEwIixyb3VnaG5lc3M6MSxtZXRhbG5lc3M6MH19KTtsZXQgcD1uZXcgVEhSRUUuR2VvbWV0cnk7ay5mb3JFYWNoKGZ1bmN0aW9uKG0pe2xldCBuPW5ldyBUSFJFRS5WZWN0b3IzKG1bMF0sbVsxXSxtWzJdKTtuLng9MSptWzBdO24ueT0xKm1bMV07bi56PTEqbVsyXTsKcC52ZXJ0aWNlcy5wdXNoKG4pfSk7dC5mb3JFYWNoKGZ1bmN0aW9uKG0pe2xldCBuPW5ldyBUSFJFRS5GYWNlMyhtWzBdLG1bMV0sbVsyXSk7aWYobCYmbC5sZW5ndGgpe209W2xbbVswXV0sbFttWzFdXSxsW21bMl1dXTtmb3IobGV0IHU9MDt1PG0ubGVuZ3RoO3UrKyl7dmFyIHE9bVt1XTtxPW5ldyBUSFJFRS5Db2xvcihxWzBdLzI1NSxxWzFdLzI1NSxxWzJdLzI1NSk7bi52ZXJ0ZXhDb2xvcnMucHVzaChxKX19cC5mYWNlcy5wdXNoKG4pfSk7bCYmbC5sZW5ndGgmJihmLm1hdGVyaWFsPWYubWF0ZXJpYWx8fHt9LGYubWF0ZXJpYWwudmVydGV4Q29sb3JzPVRIUkVFLlZlcnRleENvbG9ycyk7cC5jZW50ZXIoKTtwLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3AuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtrPW5ldyBUSFJFRVtmLm1hdGVyaWFsLmNsc10oZi5tYXRlcmlhbCk7az1uZXcgVEhSRUUuTWVzaChwLGspO2suY2FzdFNoYWRvdz0hMDtrLnJlY2VpdmVTaGFkb3c9ITA7dGhpcy5fc2NlbmUuYWRkKGspOwp0aGlzLl9sYXN0TWVzaD1rfV9jcmVhdGVMaWdodHMoZixoKXtmb3IobGV0IGs9MDtrPGgubGlnaHRzLmxlbmd0aDtrKyspe2NvbnN0IHQ9aC5saWdodHNba107bGV0IGw9bmV3IFRIUkVFW3QuY2xzXSh0LmNvbG9yLHQuaW50ZW5zaXR5KTt0LnBvc2l0aW9uJiZsLnBvc2l0aW9uLnNldCh0LnBvc2l0aW9uWzBdLHQucG9zaXRpb25bMV0sdC5wb3NpdGlvblsyXSk7Zi5hZGQobCl9fX1iLk1lc2hWaWV3ZXI9ZH0pKExrfHwoTGs9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1tZXNoLWRhc2hib2FyZC9tZXNoLWxvYWRlci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLW1lc2gtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcixvZlNhbXBsZXM6TnVtYmVyLHNlbGVjdGVkVmlldzp7dHlwZTpTdHJpbmcsdmFsdWU6ImFsbCJ9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX21lc2hWaWV3ZXI6e3R5cGU6T2JqZWN0fSxfZGF0YVByb3ZpZGVyOnt0eXBlOk9iamVjdH0sX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PnBmLnJ1bnNDb2xvclNjYWxlfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfc3RlcHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdLG5vdGlmeTohMH0sX3N0ZXBJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxfY3VycmVudFN0ZXA6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRTdGVwKF9zdGVwcywgX3N0ZXBJbmRleCkifSwKX21lc2hWaWV3ZXJBdHRhY2hlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc3RlcFZhbHVlOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVTdGVwVmFsdWUoX2N1cnJlbnRTdGVwKSJ9LF9jdXJyZW50V2FsbFRpbWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRXYWxsVGltZShfY3VycmVudFN0ZXApIn0sX2lzTWVzaExvYWRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZywgYWN0aXZlLCBfZGF0YVByb3ZpZGVyLCBfbWVzaFZpZXdlcikiLCJfdXBkYXRlU2NlbmUoX2N1cnJlbnRTdGVwLiosIF9tZXNoVmlld2VyKSIsIl9kZWJvdW5jZWRGZXRjaE1lc2goX2N1cnJlbnRTdGVwKSIsIl91cGRhdGVWaWV3KHNlbGVjdGVkVmlldykiXSxfY29tcHV0ZVJ1bkNvbG9yOmZ1bmN0aW9uKGQpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24oZCl9LAphdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RhdGFQcm92aWRlcj1uZXcgYi5BcnJheUJ1ZmZlckRhdGFQcm92aWRlcih0aGlzLnJlcXVlc3RNYW5hZ2VyKTtjb25zdCBkPW5ldyBiLk1lc2hWaWV3ZXIodGhpcy5fcnVuQ29sb3IpO2QuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JlVXBkYXRlU2NlbmUiLHRoaXMuX3VwZGF0ZUNhbnZhc1NpemUuYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJjYW1lcmFQb3NpdGlvbkNoYW5nZSIsdGhpcy5fb25DYW1lcmFQb3NpdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTt0aGlzLl9tZXNoVmlld2VyPWR9LHJlbG9hZDpmdW5jdGlvbigpe3RoaXMuYWN0aXZlJiZ0aGlzLl9kYXRhUHJvdmlkZXImJih0aGlzLnNldCgiX2lzTWVzaExvYWRpbmciLCEwKSx0aGlzLl9kYXRhUHJvdmlkZXIucmVsb2FkKHRoaXMucnVuLHRoaXMudGFnLHRoaXMuc2FtcGxlKS50aGVuKGQ9PntkJiYodGhpcy5zZXQoIl9zdGVwcyIsZCksdGhpcy5zZXQoIl9zdGVwSW5kZXgiLApkLmxlbmd0aC0xKSl9KS5jYXRjaChkPT57aWYoIWR8fCFkLmNvZGV8fGQuY29kZSE9Yi5FcnJvckNvZGVzLkNBTkNFTExFRCl0aHJvdyBFcnJvcihkfHwiUmVzcG9uc2UgcHJvY2Vzc2luZyBmYWlsZWQuIik7fSkpfSxfdXBkYXRlU2NlbmU6ZnVuY3Rpb24oKXtjb25zdCBkPXRoaXMuX2N1cnJlbnRTdGVwO2QmJmQubWVzaCYmKHRoaXMuX21lc2hWaWV3ZXIudXBkYXRlU2NlbmUoZCx0aGlzKSx0aGlzLl9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkfHwodGhpcy5fbWVzaFZpZXdlci5yZXNldFZpZXcoKSx0aGlzLl9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkPSEwKSx0aGlzLl9tZXNoVmlld2VyQXR0YWNoZWR8fCh0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5fbWVzaFZpZXdlci5nZXRSZW5kZXJlcigpLmRvbUVsZW1lbnQpLHRoaXMuX21lc2hWaWV3ZXJBdHRhY2hlZD0hMCkpfSxfZGVib3VuY2VkRmV0Y2hNZXNoKCl7dGhpcy5kZWJvdW5jZSgiZmV0Y2hNZXNoIiwoKT0+dGhpcy5fbWF5YmVGZXRjaE1lc2goKSwKMTAwKX0sX21heWJlRmV0Y2hNZXNoKCl7Y29uc3QgZD10aGlzO3JldHVybiBoYyhmdW5jdGlvbiooKXtjb25zdCBmPWQuX2N1cnJlbnRTdGVwO2lmKGYmJiFmLm1lc2gmJiFmLm1lc2hGZXRjaGluZyl7Zi5tZXNoRmV0Y2hpbmc9ITA7ZC5faXNNZXNoTG9hZGluZz0hMDt0cnl7Y29uc3QgaD15aWVsZCBkLl9kYXRhUHJvdmlkZXIuZmV0Y2hEYXRhKGYsZC5ydW4sZC50YWcsZC5zYW1wbGUpO2YubWVzaD1oWzBdO2Qubm90aWZ5UGF0aCgiX2N1cnJlbnRTdGVwLm1lc2giKX1jYXRjaChoKXtpZighaHx8IWguY29kZXx8aC5jb2RlIT1iLkVycm9yQ29kZXMuQ0FOQ0VMTEVEKXRocm93IGg9aHx8IlJlc3BvbnNlIHByb2Nlc3NpbmcgZmFpbGVkLiIsRXJyb3IoaCk7fWZpbmFsbHl7ZC5faXNNZXNoTG9hZGluZz0hMSxmLm1lc2hGZXRjaGluZz0hMX19fSl9LF9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWVzaFZpZXdlci5pc1JlYWR5KCkpe3ZhciBkPW5ldyBDdXN0b21FdmVudCgiY2FtZXJhLXBvc2l0aW9uLWNoYW5nZSIsCntkZXRhaWw6dGhpcy5fbWVzaFZpZXdlci5nZXRDYW1lcmFQb3NpdGlvbigpfSk7dGhpcy5kaXNwYXRjaEV2ZW50KGQpfX0sc2V0Q2FtZXJhVmlld3BvaW50OmZ1bmN0aW9uKGQsZixoKXt0aGlzLl9tZXNoVmlld2VyLnNldENhbWVyYVZpZXdwb2ludChkLGYsaCl9LF91cGRhdGVDYW52YXNTaXplOmZ1bmN0aW9uKCl7Y29uc3QgZD10aGlzLm9mZnNldFdpZHRoLGY9dGhpcy4kJCgiLnRmLW1lc2gtbG9hZGVyLWhlYWRlciIpLm9mZnNldEhlaWdodDt0aGlzLl9tZXNoVmlld2VyLnNldENhbnZhc1NpemUoe3dpZHRoOmQsaGVpZ2h0OmQtZn0pfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDYW52YXNTaXplKCk7dGhpcy5pc0Nvbm5lY3RlZCYmdGhpcy5fbWVzaFZpZXdlci5kcmF3KCl9LF9oYXNBdExlYXN0T25lU3RlcDpmdW5jdGlvbihkKXtyZXR1cm4hIWQmJjA8ZC5sZW5ndGh9LF9oYXNNdWx0aXBsZVN0ZXBzOmZ1bmN0aW9uKGQpe3JldHVybiEhZCYmMTxkLmxlbmd0aH0sX2NvbXB1dGVDdXJyZW50U3RlcDpmdW5jdGlvbihkLApmKXtyZXR1cm4gZFtmXXx8bnVsbH0sX2NvbXB1dGVTdGVwVmFsdWU6ZnVuY3Rpb24oZCl7cmV0dXJuIGQ/ZC5zdGVwOjB9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lOmZ1bmN0aW9uKGQpe3JldHVybiBkP0hoLmZvcm1hdERhdGUoZC53YWxsX3RpbWUpOiIifSxfZ2V0TWF4U3RlcEluZGV4OmZ1bmN0aW9uKGQpe3JldHVybiBkLmxlbmd0aC0xfSxfZ2V0U2FtcGxlVGV4dDpmdW5jdGlvbihkKXtyZXR1cm4gU3RyaW5nKGQrMSl9LF9oYXNNdWx0aXBsZVNhbXBsZXM6ZnVuY3Rpb24oZCl7cmV0dXJuIDE8ZH0sX3VwZGF0ZVZpZXc6ZnVuY3Rpb24oZCl7dGhpcy5fbWVzaFZpZXdlciYmImFsbCI9PWQmJnRoaXMuX21lc2hWaWV3ZXIucmVzZXRWaWV3KCl9LHRvTG9jYWxlU3RyaW5nXzpmdW5jdGlvbihkKXtyZXR1cm4gZC50b0xvY2FsZVN0cmluZygpfX0pfSkoTGt8fChMaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW1lc2gtZGFzaGJvYXJkL3RmLW1lc2gtZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6Im1lc2gtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiLioifSxfc2VsZWN0ZWRWaWV3Ont0eXBlOlN0cmluZyxub3RpZnk6ITAsdmFsdWU6ImFsbCJ9LF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlcikifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCgpPT57dGhpcy5faGFuZGxlV2luZG93UmVzaXplKCl9LCExKTt0aGlzLnJlbG9hZCgpfSxfZ2V0QWxsQ2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLW1lc2gtbG9hZGVyIil9LApfb25DYW1lcmFQb3NpdGlvbkNoYW5nZWQoYil7InNoYXJlIj09dGhpcy5fc2VsZWN0ZWRWaWV3JiZ0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goZD0+e2IudGFyZ2V0IT1kJiZkLnNldENhbWVyYVZpZXdwb2ludChiLmRldGFpbC5wb3NpdGlvbixiLmRldGFpbC5mYXIsYi5kZXRhaWwudGFyZ2V0KX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbih0aGlzLl9yZWxvYWRNZXNoZXMuYmluZCh0aGlzKSl9LF9oYW5kbGVXaW5kb3dSZXNpemUoKXt0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goYj0+e2IucmVkcmF3KCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+e2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZj1fLm1hcFZhbHVlcyhkLApoPT5PYmplY3Qua2V5cyhoKSk7Zj12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKX19KX0sX3JlbG9hZE1lc2hlcygpe3RoaXMuX2dldEFsbENoaWxkcmVuKCkuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgodCl7Y29uc3QgbD1iW3QucnVuXVt0LnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSx0LHtzYW1wbGU6cCxvZlNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIsdD0+T2JqZWN0LmtleXModCkpO3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaCkpfSkpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9tZXNzYWdlLmpzClVpPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbihiLGQsZixoKXtyZXR1cm4gbmV3IChmfHwoZj1Qcm9taXNlKSkoZnVuY3Rpb24oayx0KXtmdW5jdGlvbiBsKG4pe3RyeXttKGgubmV4dChuKSl9Y2F0Y2gocSl7dChxKX19ZnVuY3Rpb24gcChuKXt0cnl7bShoWyJ0aHJvdyJdKG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBtKG4pe24uZG9uZT9rKG4udmFsdWUpOihuZXcgZihmdW5jdGlvbihxKXtxKG4udmFsdWUpfSkpLnRoZW4obCxwKX1tKChoPWguYXBwbHkoYixkfHxbXSkpLm5leHQoKSl9KX07dmFyIE1rOwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjbGFzcyBoe2NvbnN0cnVjdG9yKGspe3RoaXMucG9ydD1rO3RoaXMuaWQ9MDt0aGlzLnJlc3BvbnNlV2FpdHM9bmV3IE1hcDt0aGlzLmxpc3RlbmVycz1uZXcgTWFwO3RoaXMucG9ydC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0PT50aGlzLm9uTWVzc2FnZSh0KSl9bGlzdGVuKGssdCl7dGhpcy5saXN0ZW5lcnMuc2V0KGssdCl9dW5saXN0ZW4oayl7dGhpcy5saXN0ZW5lcnMuZGVsZXRlKGspfW9uTWVzc2FnZShrKXtyZXR1cm4gVWkodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3ZhciB0PUpTT04ucGFyc2Uoay5kYXRhKTtjb25zdCBsPXQudHlwZSxwPXQuaWQsbT10LnBheWxvYWQ7dmFyIG49dC5lcnJvcjtpZih0LmlzUmVwbHkpe2lmKHRoaXMucmVzcG9uc2VXYWl0cy5oYXMocCkpe3ZhciB7cmVzb2x2ZTpxLHJlamVjdDp1fT10aGlzLnJlc3BvbnNlV2FpdHMuZ2V0KHApO3RoaXMucmVzcG9uc2VXYWl0cy5kZWxldGUocCk7Cm4/dShFcnJvcihuKSk6cShtKX19ZWxzZXtuPXQ9bnVsbDtpZih0aGlzLmxpc3RlbmVycy5oYXMobCkpe2NvbnN0IHg9dGhpcy5saXN0ZW5lcnMuZ2V0KGwpO3RyeXt0PXlpZWxkIHgobSl9Y2F0Y2goQSl7bj1BfX10aGlzLnBvc3RNZXNzYWdlKHtbInR5cGUiXTpsLFsiaWQiXTpwLFsicGF5bG9hZCJdOnQsWyJlcnJvciJdOm4sWyJpc1JlcGx5Il06ITB9KX19KX1wb3N0TWVzc2FnZShrKXt0aGlzLnBvcnQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaykpfXNlbmRNZXNzYWdlKGspe2NvbnN0IHQ9dGhpcy5pZCsrO3RoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6ImV4cGVyaW1lbnRhbC5SdW5zQ2hhbmdlZCIsaWQ6dCxwYXlsb2FkOmssZXJyb3I6bnVsbCxpc1JlcGx5OiExfSk7cmV0dXJuIG5ldyBQcm9taXNlKChsLHApPT57dGhpcy5yZXNwb25zZVdhaXRzLnNldCh0LHtyZXNvbHZlOmwscmVqZWN0OnB9KX0pfX1mLklQQz1ofSkoZC5ET19OT1RfVVNFX0lOVEVSTkFMfHwoZC5ET19OT1RfVVNFX0lOVEVSTkFMPQp7fSkpfSkoYi5saWJ8fChiLmxpYj17fSkpfSkoTWt8fChNaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL3BsdWdpbi1ob3N0LWlwYy5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYobSxuKXtjb25zdCBxPW5ldyBiLmxpYi5ET19OT1RfVVNFX0lOVEVSTkFMLklQQyhtKTt0LmFkZChxKTtwLnNldChxLG4pO20uc3RhcnQoKTtmb3IoY29uc3QgW3UseF1vZiBsKW09aCh4LHEpLHEubGlzdGVuKHUsbSl9ZnVuY3Rpb24gaChtLG4pe3JldHVybiBxPT57dmFyIHU9cC5nZXQobik7dT1rLmdldCh1KXx8bnVsbDtyZXR1cm4gbSh1LHEpfX1kLnJlZ2lzdGVyUGx1Z2luSWZyYW1lPWZ1bmN0aW9uKG0sbil7ay5zZXQobSx7cGx1Z2luTmFtZTpufSl9O2NvbnN0IGs9bmV3IFdlYWtNYXAsdD1uZXcgU2V0LGw9bmV3IE1hcCxwPW5ldyBNYXA7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG09PntpZigiZXhwZXJpbWVudGFsLmJvb3RzdHJhcCI9PT1tLmRhdGEpe3ZhciBuPW0ucG9ydHNbMF07biYmKG09bS5zb3VyY2U/bS5zb3VyY2UuZnJhbWVFbGVtZW50Om51bGwpJiZmKG4sbSl9fSk7ZC5icm9hZGNhc3Q9CmZ1bmN0aW9uKCl7dmFyIG09dmMucnVuc1N0b3JlLmdldFJ1bnMoKTtmb3IodmFyIG4gb2YgdClwLmdldChuKS5pc0Nvbm5lY3RlZHx8KHQuZGVsZXRlKG4pLHAuZGVsZXRlKG4pKTtuPVsuLi50XS5tYXAocT0+cS5zZW5kTWVzc2FnZShtKSk7cmV0dXJuIFByb21pc2UuYWxsKG4pfTtkLmxpc3Rlbj1mdW5jdGlvbihtLG4pe2wuc2V0KG0sbik7Zm9yKGNvbnN0IHEgb2YgdCl7Y29uc3QgdT1oKG4scSk7cS5saXN0ZW4obSx1KX19O2QudW5saXN0ZW49ZnVuY3Rpb24obSl7bC5kZWxldGUobSk7Zm9yKGNvbnN0IG4gb2YgdCluLnVubGlzdGVuKG0pfX0pKGIuaG9zdHx8KGIuaG9zdD17fSkpfSkoTWt8fChNaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL2NvcmUtaG9zdC1pbXBsLmpzCk1rLmhvc3QubGlzdGVuKCJleHBlcmltZW50YWwuR2V0VVJMUGx1Z2luRGF0YSIsYj0+e2lmKGIpe2I9YHAuJHtiLnBsdWdpbk5hbWV9LmA7dmFyIGQ9e307Zm9yKGxldCBmIGluIHBkLnVybERpY3QpZi5zdGFydHNXaXRoKGIpJiYoZFtmLnN1YnN0cmluZyhiLmxlbmd0aCldPXBkLnVybERpY3RbZl0pO3JldHVybiBkfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL3J1bnMtaG9zdC1pbXBsLmpzCk1rLmhvc3QubGlzdGVuKCJleHBlcmltZW50YWwuR2V0UnVucyIsKCk9PnZjLnJ1bnNTdG9yZS5nZXRSdW5zKCkpO3ZjLnJ1bnNTdG9yZS5hZGRMaXN0ZW5lcigoKT0+TWsuaG9zdC5icm9hZGNhc3QoKSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGVuc29yYm9hcmQvYXV0b1JlbG9hZEJlaGF2aW9yLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKCl7cmV0dXJuKG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkpLmhhcygiX0Rpc2FibGVBdXRvUmVsb2FkIil9Yi5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVk9IlRGLlRlbnNvckJvYXJkLmF1dG9SZWxvYWRFbmFibGVkIjtiLkF1dG9SZWxvYWRCZWhhdmlvcj17cHJvcGVydGllczp7YXV0b1JlbG9hZEVuYWJsZWQ6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2F1dG9SZWxvYWRPYnNlcnZlciIsdmFsdWU6KCk9Pnt2YXIgZj13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYi5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVkpO3JldHVybiJ0cnVlIj09PWZ8fG51bGw9PWZ9fSxfYXV0b1JlbG9hZElkOnt0eXBlOk51bWJlcn0sX21pc3NlZEF1dG9SZWxvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kSGFuZGxlVmlzaWJpbGl0eUNoYW5nZTp7dHlwZTpPYmplY3R9LGF1dG9SZWxvYWRJbnRlcnZhbFNlY3M6e3R5cGU6TnVtYmVyLAp2YWx1ZTozMH19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYm91bmRIYW5kbGVWaXNpYmlsaXR5Q2hhbmdlPXRoaXMuX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UuYmluZCh0aGlzKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9ib3VuZEhhbmRsZVZpc2liaWxpdHlDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9ib3VuZEhhbmRsZVZpc2liaWxpdHlDaGFuZ2UpfSxfYXV0b1JlbG9hZE9ic2VydmVyOmZ1bmN0aW9uKGYpe3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShiLkFVVE9SRUxPQURfTE9DQUxTVE9SQUdFX0tFWSxmKTtmJiYhZCgpP3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyk6CndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKX0sX2RvQXV0b1JlbG9hZDpmdW5jdGlvbigpe3RoaXMuX2lzRG9jdW1lbnRWaXNpYmxlKCk/dGhpcy5fZG9SZWxvYWQoKTp0aGlzLl9taXNzZWRBdXRvUmVsb2FkPSEwO3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyl9LF9kb1JlbG9hZDpmdW5jdGlvbigpe2lmKG51bGw9PXRoaXMucmVsb2FkKXRocm93IEVycm9yKCJBdXRvUmVsb2FkQmVoYXZpb3IgcmVxdWlyZXMgYSByZWxvYWQgbWV0aG9kIik7dGhpcy5yZWxvYWQoKX0sX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLl9pc0RvY3VtZW50VmlzaWJsZSgpJiZ0aGlzLl9taXNzZWRBdXRvUmVsb2FkJiYodGhpcy5fbWlzc2VkQXV0b1JlbG9hZD0hMSx0aGlzLl9kb1JlbG9hZCgpKX0sX2lzRG9jdW1lbnRWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuInZpc2libGUiPT09CmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZX19fSkocWZ8fChxZj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3RmLXRlbnNvcmJvYXJkLmh0bWwuanMKY29uc3QgWW09e2dldExvY2F0aW9uKCl7cmV0dXJuIHdpbmRvdy5sb2NhdGlvbn19OwpQb2x5bWVyKHtpczoidGYtdGVuc29yYm9hcmQiLGJlaGF2aW9yczpbcWYuQXV0b1JlbG9hZEJlaGF2aW9yXSxwcm9wZXJ0aWVzOnticmFuZDp7dHlwZTpTdHJpbmcsdmFsdWU6IlRlbnNvckJvYXJkLVgifSxob21lUGF0aDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9ob21lUGF0aDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9zYW5pdGl6ZUhvbWVQYXRoKGhvbWVQYXRoKSJ9LHRpdGxlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3VwZGF0ZVRpdGxlIn0scm91dGVyOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZVJvdXRlciJ9LGRlbW9EaXI6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHVzZUhhc2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZGlzYWJsZWREYXNoYm9hcmRzOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2Rhc2hib2FyZERhdGE6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkRGF0YShfZGFzaGJvYXJkUmVnaXN0cnkpIn0sX2Rhc2hib2FyZFJlZ2lzdHJ5Ont0eXBlOk9iamVjdCwKY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkUmVnaXN0cnkoX3BsdWdpbnNMaXN0aW5nKSJ9LF9wbHVnaW5zTGlzdGluZzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9hY3RpdmVEYXNoYm9hcmRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZChfZGFzaGJvYXJkRGF0YSwgX3BsdWdpbnNMaXN0aW5nKSJ9LF9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlOnt0eXBlOlN0cmluZyx2YWx1ZTpxZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9hY3RpdmVEYXNoYm9hcmRzTm90TG9hZGVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSxfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNMb2FkZWQoX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUpIn0sCl9hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0ZhaWxlZFRvTG9hZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSxfc2hvd05vRGFzaGJvYXJkc01lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkifSxfc2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZCwgX2Rhc2hib2FyZFJlZ2lzdHJ5LCBfc2VsZWN0ZWREYXNoYm9hcmQpIn0sX3NlbGVjdGVkRGFzaGJvYXJkOnt0eXBlOlN0cmluZyx2YWx1ZTpwZC5nZXRTdHJpbmcocGQuVEFCKXx8bnVsbCxvYnNlcnZlcjoiX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZCJ9LApfZGFzaGJvYXJkVG9NYXliZVJlbW92ZTpTdHJpbmcsX2Rhc2hib2FyZENvbnRhaW5lcnNTdGFtcGVkOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX2lzUmVsb2FkRGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2xhc3RSZWxvYWRUaW1lOnt0eXBlOlN0cmluZyx2YWx1ZToibm90IHlldCBsb2FkZWQifSxfbGFzdFJlbG9hZFRpbWVTaG9ydDp7dHlwZTpTdHJpbmcsdmFsdWU6Ik5vdCB5ZXQgbG9hZGVkIn0sX2RhdGFMb2NhdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX3JlZnJlc2hpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbIl91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21BY3RpdmUoX3NlbGVjdGVkRGFzaGJvYXJkLCBfYWN0aXZlRGFzaGJvYXJkcykiLAoiX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChfZGFzaGJvYXJkUmVnaXN0cnksIF9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkiXSxfc2FuaXRpemVIb21lUGF0aChiKXtpZighYilyZXR1cm4iIjtjb25zdCBkPVltLmdldExvY2F0aW9uKCksZj1uZXcgVVJMKGIsZC5ocmVmKSxoPSJodHRwOiI9PT1mLnByb3RvY29sfHwiaHR0cHM6Ij09PWYucHJvdG9jb2wsaz1mLm9yaWdpbj09PWQub3JpZ2luO2lmKCFoKXRocm93IG5ldyBSYW5nZUVycm9yKGBFeHBlY3QgJ2hvbWVQYXRoJyB0byBiZSBvZiBodHRwOiBvciBodHRwczouICR7Yn1gKTtpZighayl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRXhwZWN0ICdob21lUGF0aCcgYmUgYSBwYXRoIG9yIGhhdmUgdGhlIHNhbWUgb3JpZ2luLiAke2J9IHZzLiAke2Qub3JpZ2lufWApO3JldHVybiBoJiZrP2YudG9TdHJpbmcoKToiIn0sX2FjdGl2ZURhc2hib2FyZHNVcGRhdGVkKCl7fSwKX2lzRGFzaGJvYXJkQWN0aXZlKGIsZCxmKXtyZXR1cm4gMDw9KGJ8fCIiKS5zcGxpdCgiLCIpLmluZGV4T2YoZi5wbHVnaW4pfHwhKGR8fFtdKS5pbmNsdWRlcyhmLnBsdWdpbik/ITE6ITB9LF9pc0Rhc2hib2FyZEluYWN0aXZlKGIsZCxmKXtyZXR1cm4gMDw9KGJ8fCIiKS5zcGxpdCgiLCIpLmluZGV4T2YoZi5wbHVnaW4pPyExOihkfHxbXSkuaW5jbHVkZXMoZi5wbHVnaW4pPyExOiEwfSxfaW5hY3RpdmVEYXNoYm9hcmRzRXhpc3QoYixkLGYpe2lmKCFmKXJldHVybiExO2NvbnN0IGg9bmV3IFNldDtiLmZvckVhY2goaz0+e2guYWRkKGsucGx1Z2luKX0pOyhkfHwiIikuc3BsaXQoIiwiKS5mb3JFYWNoKGs9PntoLmRlbGV0ZShrLnBsdWdpbil9KTtmLmZvckVhY2goaz0+e2guZGVsZXRlKGspfSk7cmV0dXJuIDA8aC5zaXplfSxfZ2V0RGFzaGJvYXJkRnJvbUluZGV4KGIsZCl7cmV0dXJuIGJbZF19LF9zZWxlY3RlZFN0YXR1cyhiLGQpe3JldHVybiBiPT09ZH0sX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZChiKXtiPQpifHwiIjtwZC5zZXRTdHJpbmcocGQuVEFCLGIpO2xldCBkPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtkKz1kLmVuZHNXaXRoKCIvIik/YjoiLyIrYjtnYSgic2V0IiwicGFnZSIsZCk7Z2EoInNlbmQiLCJwYWdldmlldyIpfSxfdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tQWN0aXZlKGIsZCl7ZCYmbnVsbD09YiYmKGI9ZFswXXx8bnVsbCxudWxsIT1iJiYocGQuc2V0U3RyaW5nKHBkLlRBQixiLHt1c2VMb2NhdGlvblJlcGxhY2U6ITB9KSx0aGlzLl9zZWxlY3RlZERhc2hib2FyZD1iKSl9LF91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21IYXNoKCl7Y29uc3QgYj1wZC5nZXRTdHJpbmcocGQuVEFCKTt0aGlzLnNldCgiX3NlbGVjdGVkRGFzaGJvYXJkIixifHxudWxsKX0sX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChiLGQsZixoKXtpZihmJiZoJiZkW2hdJiYoZD10aGlzLl9kYXNoYm9hcmRUb01heWJlUmVtb3ZlLHRoaXMuX2Rhc2hib2FyZFRvTWF5YmVSZW1vdmU9CmgsZCYmZCE9aCYmYltkXS5yZW1vdmVEb20mJihkPXRoaXMuJCQoYC5kYXNoYm9hcmQtY29udGFpbmVyW2RhdGEtZGFzaGJvYXJkPSR7ZH1dYCksZC5maXJzdENoaWxkJiZkLmZpcnN0Q2hpbGQucmVtb3ZlKCkpLGQ9dGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHtofV1gKSkpe2I9YltoXTtpZigwPT09ZC5jaGlsZHJlbi5sZW5ndGgpc3dpdGNoKGY9Yi5sb2FkaW5nTWVjaGFuaXNtLGYudHlwZSl7Y2FzZSAiQ1VTVE9NX0VMRU1FTlQiOmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChmLmVsZW1lbnROYW1lKTtoLmlkPSJkYXNoYm9hcmQiO2QuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7Y2FzZSAiSUZSQU1FIjp0aGlzLl9yZW5kZXJQbHVnaW5JZnJhbWUoZCxoLGYpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJJbnZhcmlhbnQgdmlvbGF0aW9uOiIsZil9dGhpcy5zZXQoIl9pc1JlbG9hZERpc2FibGVkIixiLmRpc2FibGVSZWxvYWQpfX0sX3JlbmRlclBsdWdpbklmcmFtZShiLApkKXtjb25zdCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2YuaWQ9ImRhc2hib2FyZCI7TWsuaG9zdC5yZWdpc3RlclBsdWdpbklmcmFtZShmLGQpO2NvbnN0IGg9bmV3IFVSTCgiZGF0YS9wbHVnaW5fZW50cnkuaHRtbCIsd2luZG93LmxvY2F0aW9uLmhyZWYpO2guc2VhcmNoUGFyYW1zLnNldCgibmFtZSIsZCk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsaC50b1N0cmluZygpKTtiLmFwcGVuZENoaWxkKGYpfSxfc2VsZWN0ZWREYXNoYm9hcmRDb21wb25lbnQoKXtyZXR1cm4gdGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHt0aGlzLl9zZWxlY3RlZERhc2hib2FyZH1dICNkYXNoYm9hcmRgKX0scmVhZHkoKXthZC5zZXRVc2VIYXNoKHRoaXMudXNlSGFzaCk7dGhpcy5fdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tSGFzaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwoKT0+e3RoaXMuX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUhhc2goKX0sCiExKTt2Yy5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5fZGF0YUxvY2F0aW9uPXZjLmVudmlyb25tZW50U3RvcmUuZ2V0RGF0YUxvY2F0aW9uKCk7Y29uc3QgYj12Yy5lbnZpcm9ubWVudFN0b3JlLmdldFdpbmRvd1RpdGxlKCk7YiYmKHdpbmRvdy5kb2N1bWVudC50aXRsZT1iKX0pO3BkLm1pZ3JhdGVMZWdhY3lVUkxTY2hlbWUoKTt0aGlzLl9yZWxvYWREYXRhKCk7dGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZCgpe3JldHVybiB0aGlzLl9kYXNoYm9hcmREYXRhP3RoaXMuX2Rhc2hib2FyZERhdGEubWFwKGI9PmIucGx1Z2luKS5maWx0ZXIoYj0+e2I9dGhpcy5fcGx1Z2luc0xpc3RpbmdbYl07cmV0dXJuImJvb2xlYW4iPT09dHlwZW9mIGI/YjpiJiZiLmVuYWJsZWR9KTpbXX0sX29uVGVtcGxhdGVDaGFuZ2VkKCl7Y29uc3QgYj17fTtmb3IoY29uc3QgZCBvZiB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRhc2hib2FyZC1jb250YWluZXIiKSliW2QuZGF0YXNldC5kYXNoYm9hcmRdPQohMDt0aGlzLl9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZD1ifSxfY29tcHV0ZURhc2hib2FyZFJlZ2lzdHJ5KGIpe2NvbnN0IGQ9e307Zm9yKGNvbnN0IFtoLGtdb2YgT2JqZWN0LmVudHJpZXMocWYuZGFzaGJvYXJkUmVnaXN0cnkpKWRbaF09e3BsdWdpbjprLnBsdWdpbixsb2FkaW5nTWVjaGFuaXNtOnt0eXBlOiJDVVNUT01fRUxFTUVOVCIsZWxlbWVudE5hbWU6ay5lbGVtZW50TmFtZX0sdGFiTmFtZTprLnRhYk5hbWUudG9VcHBlckNhc2UoKSxkaXNhYmxlUmVsb2FkOmsuaXNSZWxvYWREaXNhYmxlZHx8ITEscmVtb3ZlRG9tOmsucmVtb3ZlRG9tfHwhMX07aWYobnVsbCE9Yilmb3IoY29uc3QgW2gsa11vZiBPYmplY3QuZW50cmllcyhiKSlpZigiYm9vbGVhbiIhPT10eXBlb2Ygayl7c3dpdGNoKGsubG9hZGluZ19tZWNoYW5pc20udHlwZSl7Y2FzZSAiTk9ORSI6bnVsbD09ZFtoXSYmY29uc29sZS53YXJuKCJQbHVnaW4gaGFzIG5vIGxvYWRpbmcgbWVjaGFuaXNtIGFuZCBubyBiYWtlZC1pbiByZWdpc3RyeSBlbnRyeTogJXMiLApoKTtjb250aW51ZTtjYXNlICJDVVNUT01fRUxFTUVOVCI6dmFyIGY9e3R5cGU6IkNVU1RPTV9FTEVNRU5UIixlbGVtZW50TmFtZTprLmxvYWRpbmdfbWVjaGFuaXNtLmVsZW1lbnRfbmFtZX07YnJlYWs7Y2FzZSAiSUZSQU1FIjpmPXt0eXBlOiJJRlJBTUUiLG1vZHVsZVBhdGg6ay5sb2FkaW5nX21lY2hhbmlzbS5tb2R1bGVfcGF0aH07YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlVua25vd24gbG9hZGluZyBtZWNoYW5pc20gZm9yIHBsdWdpbiAlczogJXMiLGgsay5sb2FkaW5nX21lY2hhbmlzbSk7Y29udGludWV9bnVsbD09ZiYmY29uc29sZS5lcnJvcigiSW52YXJpYW50IHZpb2xhdGlvbjogbG9hZGluZ01lY2hhbmlzbSBpcyAlcyBmb3IgJXMiLGYsaCk7ZFtoXT17cGx1Z2luOmgsbG9hZGluZ01lY2hhbmlzbTpmLHRhYk5hbWU6ay50YWJfbmFtZS50b1VwcGVyQ2FzZSgpLGRpc2FibGVSZWxvYWQ6ay5kaXNhYmxlX3JlbG9hZCxyZW1vdmVEb206ay5yZW1vdmVfZG9tfX1mPXt9Owpmb3IoY29uc3QgaCBvZiBPYmplY3Qua2V5cyhiKSlkW2hdJiYoZltoXT1kW2hdKTtPYmplY3QuYXNzaWduKGYsZCk7cmV0dXJuIGZ9LF9jb21wdXRlRGFzaGJvYXJkRGF0YShiKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyhiKX0sX2ZldGNoUGx1Z2luc0xpc3RpbmcoKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7Y29uc3QgYj10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZD0+e2QuY2FuY2VsbGVkfHwodGhpcy5fcGx1Z2luc0xpc3Rpbmc9ZC52YWx1ZSx0aGlzLl9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPXFmLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEKX0pO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHZjLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4oYiwoKT0+e3RoaXMuX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGU9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUQ/dGhpcy5fYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT0KcWYuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5GQUlMRUQ6Y29uc29sZS53YXJuKCJGYWlsZWQgdG8gcmVsb2FkIHRoZSBzZXQgb2YgYWN0aXZlIHBsdWdpbnM7IHVzaW5nIG9sZCB2YWx1ZS4iKX0pfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWQoYil7cmV0dXJuIGI9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0xvYWRlZChiKXtyZXR1cm4gYj09PXFmLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNGYWlsZWRUb0xvYWQoYil7cmV0dXJuIGI9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLkZBSUxFRH0sX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShiLGQsZil7cmV0dXJuIGImJjA9PT1kLmxlbmd0aCYmbnVsbD09Zn0sX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShiLGQsZil7cmV0dXJuIGImJiEhZiYmCm51bGw9PWRbZl19LF91cGRhdGVSb3V0ZXIoYil7dmMuc2V0Um91dGVyKGIpfSxfdXBkYXRlVGl0bGUoYil7YiYmdGhpcy5zZXQoImJyYW5kIixiKX0scmVsb2FkKCl7dGhpcy5faXNSZWxvYWREaXNhYmxlZHx8KHRoaXMuX3JlbG9hZERhdGEoKS50aGVuKCgpPT57Y29uc3QgYj10aGlzLl9zZWxlY3RlZERhc2hib2FyZENvbXBvbmVudCgpO2ImJmIucmVsb2FkJiZiLnJlbG9hZCgpfSksdGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpKX0sX3JlbG9hZERhdGEoKXt0aGlzLl9yZWZyZXNoaW5nPSEwO3JldHVybiBQcm9taXNlLmFsbChbdGhpcy5fZmV0Y2hQbHVnaW5zTGlzdGluZygpLHZjLmVudmlyb25tZW50U3RvcmUucmVmcmVzaCgpLHZjLnJ1bnNTdG9yZS5yZWZyZXNoKCksdmMuZXhwZXJpbWVudHNTdG9yZS5yZWZyZXNoKCldKS50aGVuKCgpPT57dGhpcy5fbGFzdFJlbG9hZFRpbWVTaG9ydD0obmV3IERhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAsCnttb250aDoibG9uZyIsZGF5OiJudW1lcmljIixob3VyOiJudW1lcmljIixtaW51dGU6Im51bWVyaWMiLHNlY29uZDoibnVtZXJpYyJ9KX0pLmZpbmFsbHkoKCk9Pnt0aGlzLl9yZWZyZXNoaW5nPSExfSl9LF9nZXREYXRhUmVmcmVzaGluZ0NsYXNzKCl7cmV0dXJuIHRoaXMuX3JlZnJlc2hpbmc/InJlZnJlc2hpbmciOiIifSxvcGVuU2V0dGluZ3MoKXt0aGlzLiQuc2V0dGluZ3Mub3BlbigpO3RoaXMuJC5wYWdpbmF0aW9uTGltaXRJbnB1dC52YWx1ZT1uZS5nZXRMaW1pdCgpfSxfcGFnaW5hdGlvbkxpbWl0VmFsaWRhdGUoYil7Yi50YXJnZXQudmFsaWRhdGUoKX0sX3BhZ2luYXRpb25MaW1pdENoYW5nZWQoYil7Yj1OdW1iZXIucGFyc2VJbnQoYi50YXJnZXQudmFsdWUsMTApO2I9PT0rYiYmMDxiJiZuZS5zZXRMaW1pdChiKX19KTsK", + "ok": true, + "headers": [ + [ + "content-type", + "application/javascript; charset=utf-8" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/environment": { + "data": "eyJkYXRhX2xvY2F0aW9uIjogInRiX2xvZ3MvIiwgIndpbmRvd190aXRsZSI6ICIifQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugins_listing": { + "data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJDdXN0b20gU2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJpbWFnZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogdHJ1ZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImltYWdlcyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtaW1hZ2UtZGFzaGJvYXJkIn19LCAiYXVkaW8iOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJhdWRpbyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtYXVkaW8tZGFzaGJvYXJkIn19LCAiZGVidWdnZXIiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJkZWJ1Z2dlciIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtZGVidWdnZXItZGFzaGJvYXJkIn19LCAiZ3JhcGhzIjogeyJkaXNhYmxlX3JlbG9hZCI6IHRydWUsICJlbmFibGVkIjogdHJ1ZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImdyYXBocyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtZ3JhcGgtZGFzaGJvYXJkIn19LCAiZGlzdHJpYnV0aW9ucyI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiB0cnVlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZGlzdHJpYnV0aW9ucyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCJ9fSwgImhpc3RvZ3JhbXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogdHJ1ZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImhpc3RvZ3JhbXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWhpc3RvZ3JhbS1kYXNoYm9hcmQifX0sICJ0ZXh0IjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAidGV4dCIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtdGV4dC1kYXNoYm9hcmQifX0sICJwcl9jdXJ2ZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJQUiBDdXJ2ZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXByLWN1cnZlLWRhc2hib2FyZCJ9fSwgInByb2ZpbGVfcmVkaXJlY3QiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJQcm9maWxlIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZCJ9fSwgImJlaG9sZGVyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IHRydWUsICJ0YWJfbmFtZSI6ICJiZWhvbGRlciIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtYmVob2xkZXItZGFzaGJvYXJkIn19LCAiaHBhcmFtcyI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiB0cnVlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiaHBhcmFtcyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtaHBhcmFtcy1kYXNoYm9hcmQifX0sICJtZXNoIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAibWVzaCIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAibWVzaC1kYXNoYm9hcmQifX0sICJwcm9qZWN0b3IiOiB7ImRpc2FibGVfcmVsb2FkIjogdHJ1ZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInByb2plY3RvciIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJJRlJBTUUiLCAibW9kdWxlX3BhdGgiOiAiL2RhdGEvcGx1Z2luL3Byb2plY3Rvci9pbmRleC5qcyJ9fSwgIndoYXRpZiI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogIldoYXQtSWYgVG9vbCIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJJRlJBTUUiLCAibW9kdWxlX3BhdGgiOiAiL2RhdGEvcGx1Z2luL3doYXRpZi9pbmRleC5qcyJ9fX0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/runs": { + "data": "WyJ0ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucy92ZXJzaW9uXzAiLCAidGVzdGluZ19mb3JfYWN0aXZhdGlvbnMvdmVyc2lvbl8xIiwgInRlc3RpbmdfZm9yX2FjdGl2YXRpb25zL3ZlcnNpb25fMiIsICJ0ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucy92ZXJzaW9uXzMiLCAidGVzdGluZ19mb3JfYWN0aXZhdGlvbnMvdmVyc2lvbl80Il0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/experiments": { + "data": "W10=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/tags": { + "data": "eyJ0ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucy92ZXJzaW9uXzIiOiB7Ikxvc3MvVmFsIjogeyJkaXNwbGF5TmFtZSI6ICJMb3NzL1ZhbCIsICJkZXNjcmlwdGlvbiI6ICIifSwgIkFjY3VyYWN5L1ZhbCI6IHsiZGlzcGxheU5hbWUiOiAiQWNjdXJhY3kvVmFsIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidHJhaW5fbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAidHJhaW5fbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgImVwb2NoIjogeyJkaXNwbGF5TmFtZSI6ICJlcG9jaCIsICJkZXNjcmlwdGlvbiI6ICIifSwgInZhbF9sb3NzIjogeyJkaXNwbGF5TmFtZSI6ICJ2YWxfbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgIkFjY3VyYWN5IjogeyJkaXNwbGF5TmFtZSI6ICJBY2N1cmFjeSIsICJkZXNjcmlwdGlvbiI6ICIifX0sICJ0ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucy92ZXJzaW9uXzAiOiB7Ikxvc3MvVmFsIjogeyJkaXNwbGF5TmFtZSI6ICJMb3NzL1ZhbCIsICJkZXNjcmlwdGlvbiI6ICIifSwgIkFjY3VyYWN5L1ZhbCI6IHsiZGlzcGxheU5hbWUiOiAiQWNjdXJhY3kvVmFsIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidHJhaW5fbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAidHJhaW5fbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgImVwb2NoIjogeyJkaXNwbGF5TmFtZSI6ICJlcG9jaCIsICJkZXNjcmlwdGlvbiI6ICIifSwgInZhbF9sb3NzIjogeyJkaXNwbGF5TmFtZSI6ICJ2YWxfbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgIkFjY3VyYWN5IjogeyJkaXNwbGF5TmFtZSI6ICJBY2N1cmFjeSIsICJkZXNjcmlwdGlvbiI6ICIifX0sICJ0ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucy92ZXJzaW9uXzEiOiB7Ikxvc3MvVmFsIjogeyJkaXNwbGF5TmFtZSI6ICJMb3NzL1ZhbCIsICJkZXNjcmlwdGlvbiI6ICIifSwgIkFjY3VyYWN5L1ZhbCI6IHsiZGlzcGxheU5hbWUiOiAiQWNjdXJhY3kvVmFsIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidHJhaW5fbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAidHJhaW5fbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgImVwb2NoIjogeyJkaXNwbGF5TmFtZSI6ICJlcG9jaCIsICJkZXNjcmlwdGlvbiI6ICIifSwgInZhbF9sb3NzIjogeyJkaXNwbGF5TmFtZSI6ICJ2YWxfbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgIkFjY3VyYWN5IjogeyJkaXNwbGF5TmFtZSI6ICJBY2N1cmFjeSIsICJkZXNjcmlwdGlvbiI6ICIifX0sICJ0ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucy92ZXJzaW9uXzMiOiB7Ikxvc3MvVmFsIjogeyJkaXNwbGF5TmFtZSI6ICJMb3NzL1ZhbCIsICJkZXNjcmlwdGlvbiI6ICIifSwgIkFjY3VyYWN5L1ZhbCI6IHsiZGlzcGxheU5hbWUiOiAiQWNjdXJhY3kvVmFsIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidHJhaW5fbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAidHJhaW5fbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgImVwb2NoIjogeyJkaXNwbGF5TmFtZSI6ICJlcG9jaCIsICJkZXNjcmlwdGlvbiI6ICIifSwgInZhbF9sb3NzIjogeyJkaXNwbGF5TmFtZSI6ICJ2YWxfbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgIkFjY3VyYWN5IjogeyJkaXNwbGF5TmFtZSI6ICJBY2N1cmFjeSIsICJkZXNjcmlwdGlvbiI6ICIifSwgIkxvc3MvVHJhaW4iOiB7ImRpc3BsYXlOYW1lIjogIkxvc3MvVHJhaW4iLCAiZGVzY3JpcHRpb24iOiAiIn0sICJBY2N1cmFjeS9UcmFpbiI6IHsiZGlzcGxheU5hbWUiOiAiQWNjdXJhY3kvVHJhaW4iLCAiZGVzY3JpcHRpb24iOiAiIn0sICJsb3NzIjogeyJkaXNwbGF5TmFtZSI6ICJsb3NzIiwgImRlc2NyaXB0aW9uIjogIiJ9fSwgInRlc3RpbmdfZm9yX2FjdGl2YXRpb25zL3ZlcnNpb25fNCI6IHsiTG9zcy9WYWwiOiB7ImRpc3BsYXlOYW1lIjogIkxvc3MvVmFsIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAiQWNjdXJhY3kvVmFsIjogeyJkaXNwbGF5TmFtZSI6ICJBY2N1cmFjeS9WYWwiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJ0cmFpbl9sb3NzIjogeyJkaXNwbGF5TmFtZSI6ICJ0cmFpbl9sb3NzIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAiZXBvY2giOiB7ImRpc3BsYXlOYW1lIjogImVwb2NoIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidmFsX2xvc3MiOiB7ImRpc3BsYXlOYW1lIjogInZhbF9sb3NzIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAiQWNjdXJhY3kiOiB7ImRpc3BsYXlOYW1lIjogIkFjY3VyYWN5IiwgImRlc2NyaXB0aW9uIjogIiJ9LCAiTG9zcy9UcmFpbiI6IHsiZGlzcGxheU5hbWUiOiAiTG9zcy9UcmFpbiIsICJkZXNjcmlwdGlvbiI6ICIifSwgIkFjY3VyYWN5L1RyYWluIjogeyJkaXNwbGF5TmFtZSI6ICJBY2N1cmFjeS9UcmFpbiIsICJkZXNjcmlwdGlvbiI6ICIifSwgImxvc3MiOiB7ImRpc3BsYXlOYW1lIjogImxvc3MiLCAiZGVzY3JpcHRpb24iOiAiIn19fQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy&run=testing_for_activations%2Fversion_0": { + "data": "W1sxNTkwNDA1Njc1LjQ2NjEzMiwgNDI5LCAwLjk1ODQwMDAxMTA2MjYyMjFdXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy&run=testing_for_activations%2Fversion_3": { + "data": "W1sxNTkwNDA2MDQ0LjU1OTQyODcsIDQyOSwgMC45NTA2MDAwMjgwMzgwMjQ5XSwgWzE1OTA0MDYwNDUuMzg1MjQzMiwgNDMwLCAwLjgwNjgwMDAwNzgyMDEyOTRdLCBbMTU5MDQwNjA1OC44ODkwNDIsIDg1OSwgMC45NzExOTk5ODkzMTg4NDc3XSwgWzE1OTA0MDYwNTkuODAzNTQzOCwgODYwLCAwLjk0MTg5MDg5NTM2NjY2ODddLCBbMTU5MDQwNjA3My40Njk2NzgsIDEyODksIDAuOTgwNDAwMDI1ODQ0NTc0XSwgWzE1OTA0MDYwNzQuNDgzMDg5NCwgMTI5MCwgMC45NTgyMzYzMzY3MDgwNjg4XSwgWzE1OTA0MDYwODguMzYxMjkzNiwgMTcxOSwgMC45ODI4MDAwMDY4NjY0NTUxXSwgWzE1OTA0MDYwODkuMTQ4NTUxMiwgMTcyMCwgMC45NjUxNjM2NDgxMjg1MDk1XSwgWzE1OTA0MDYxMDIuODE1MDMxMywgMjE0OSwgMC45ODU4MDAwMjc4NDcyOV0sIFsxNTkwNDA2MTAzLjYyMzM0MDgsIDIxNTAsIDAuOTY4MTgxNzg4OTIxMzU2Ml0sIFsxNTkwNDA2MTE3LjM5MTg2NjcsIDI1NzksIDAuOTg1ODAwMDI3ODQ3MjldLCBbMTU5MDQwNjExOC4xNzAyMDEsIDI1ODAsIDAuOTcxNjM2MzU0OTIzMjQ4M10sIFsxNTkwNDA2MTMxLjc4MzI1MzQsIDMwMDksIDAuOTg2OTk5OTg4NTU1OTA4Ml0sIFsxNTkwNDA2MTMyLjU4MDY0MjIsIDMwMTAsIDAuOTc0MzA5MDg2Nzk5NjIxNl0sIFsxNTkwNDA2MTQ2LjQyNDQ2NTcsIDM0MzksIDAuOTg4MjAwMDA4ODY5MTcxMV0sIFsxNTkwNDA2MTQ3LjIwNTg4NSwgMzQ0MCwgMC45NzY4MDAwMjQ1MDk0Mjk5XSwgWzE1OTA0MDYxNjEuMDU1MjIzNSwgMzg2OSwgMC45ODkwMDAwMjI0MTEzNDY0XSwgWzE1OTA0MDYxNjEuODM5ODcwNywgMzg3MCwgMC45NzczMjcyODcxOTcxMTNdLCBbMTU5MDQwNjE3NS41ODcxOTIzLCA0Mjk5LCAwLjk4ODYwMDAxNTY0MDI1ODhdLCBbMTU5MDQwNjE3Ni41ODQ0MjM4LCA0MzAwLCAwLjk3ODcyNzI4MTA5MzU5NzRdXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Loss%2FVal&run=testing_for_activations%2Fversion_3": { + "data": "W1sxNTkwNDA2MDMwLjU3NjM4NDMsIDAsIDIuMzAyOTY4MDI1MjA3NTE5NV0sIFsxNTkwNDA2MDQ0LjU1ODQ4NjIsIDAsIDEuNzY1NTM0OTk2OTg2Mzg5Ml0sIFsxNTkwNDA2MDU4Ljg4ODE4NDgsIDEsIDEuNjUyNjM1OTMxOTY4Njg5XSwgWzE1OTA0MDYwNzMuNDY4ODA0OCwgMiwgMS42MDgyMDUwODAwMzIzNDg2XSwgWzE1OTA0MDYwODguMzYwNDI3NiwgMywgMS41NjkyMDM3MzQzOTc4ODgyXSwgWzE1OTA0MDYxMDIuODEzOTEzMywgNCwgMS41NTA2MjEwMzI3MTQ4NDM4XSwgWzE1OTA0MDYxMTcuMzkwODU2MywgNSwgMS41MzM2NTIxODYzOTM3Mzc4XSwgWzE1OTA0MDYxMzEuNzgyMzA4LCA2LCAxLjUxOTQzODAyODMzNTU3MTNdLCBbMTU5MDQwNjE0Ni40MjM2MjMzLCA3LCAxLjUxMTk5MTM4MTY0NTIwMjZdLCBbMTU5MDQwNjE2MS4wNTQxODc4LCA4LCAxLjUwNDI2MzA0MzQwMzYyNTVdLCBbMTU5MDQwNjE3NS41ODYzNDgsIDksIDEuNTAwMjQ3MDAxNjQ3OTQ5Ml1d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy&run=testing_for_activations%2Fversion_1": { + "data": "W1sxNTkwNDA1NzM1LjkzMDMwNTIsIDQyOSwgMC45NTU2MDAwMjMyNjk2NTMzXV0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy%2FVal&run=testing_for_activations%2Fversion_3": { + "data": "W1sxNTkwNDA2MDMwLjU3NjUwNCwgMCwgMC4xMjg5MDYyNV0sIFsxNTkwNDA2MDQ0LjU1ODYxNTIsIDAsIDAuOTUwNjAwMDI4MDM4MDI0OV0sIFsxNTkwNDA2MDU4Ljg4ODMwNjEsIDEsIDAuOTcxMTk5OTg5MzE4ODQ3N10sIFsxNTkwNDA2MDczLjQ2ODkxOSwgMiwgMC45ODA0MDAwMjU4NDQ1NzRdLCBbMTU5MDQwNjA4OC4zNjA1NTQ3LCAzLCAwLjk4MjgwMDAwNjg2NjQ1NTFdLCBbMTU5MDQwNjEwMi44MTQwNjksIDQsIDAuOTg1ODAwMDI3ODQ3MjldLCBbMTU5MDQwNjExNy4zOTA5ODgsIDUsIDAuOTg1ODAwMDI3ODQ3MjldLCBbMTU5MDQwNjEzMS43ODI0NDExLCA2LCAwLjk4Njk5OTk4ODU1NTkwODJdLCBbMTU5MDQwNjE0Ni40MjM3NCwgNywgMC45ODgyMDAwMDg4NjkxNzExXSwgWzE1OTA0MDYxNjEuMDU0MzE3LCA4LCAwLjk4OTAwMDAyMjQxMTM0NjRdLCBbMTU5MDQwNjE3NS41ODY0NjksIDksIDAuOTg4NjAwMDE1NjQwMjU4OF1d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy&run=testing_for_activations%2Fversion_2": { + "data": "W1sxNTkwNDA1Nzg0Ljc2MzM2MTUsIDQyOSwgMC45NjExOTk5OTg4NTU1OTA4XV0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy%2FTrain&run=testing_for_activations%2Fversion_3": { + "data": "W1sxNTkwNDA2MDQ1LjE5Mzk1LCAwLCAwLjgwNjgwMDAwNzgyMDEyOTRdLCBbMTU5MDQwNjA1OS42MTgxOTgsIDEsIDAuOTQxODkwODk1MzY2NjY4N10sIFsxNTkwNDA2MDc0LjI5NDM2NTQsIDIsIDAuOTU4MjM2MzM2NzA4MDY4OF0sIFsxNTkwNDA2MDg4Ljk3MTcyMzYsIDMsIDAuOTY1MTYzNjQ4MTI4NTA5NV0sIFsxNTkwNDA2MTAzLjQ0NTQ1MDUsIDQsIDAuOTY4MTgxNzg4OTIxMzU2Ml0sIFsxNTkwNDA2MTE3Ljk5MzAzNjMsIDUsIDAuOTcxNjM2MzU0OTIzMjQ4M10sIFsxNTkwNDA2MTMyLjM5NDM0MTIsIDYsIDAuOTc0MzA5MDg2Nzk5NjIxNl0sIFsxNTkwNDA2MTQ3LjAzMDAyODMsIDcsIDAuOTc2ODAwMDI0NTA5NDI5OV0sIFsxNTkwNDA2MTYxLjY1ODU2NDMsIDgsIDAuOTc3MzI3Mjg3MTk3MTEzXSwgWzE1OTA0MDYxNzYuMzk1NjExOCwgOSwgMC45Nzg3MjcyODEwOTM1OTc0XV0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy%2FVal&run=testing_for_activations%2Fversion_0": { + "data": "W1sxNTkwNDA1NjYxLjY4Njc5MjQsIDAsIDAuMDU4NTkzNzVdLCBbMTU5MDQwNTY3NS40NjUxOTk1LCAwLCAwLjk1ODQwMDAxMTA2MjYyMjFdXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy%2FTrain&run=testing_for_activations%2Fversion_4": { + "data": "W1sxNTkwNDA4NzUzLjMyMTYxNzEsIDAsIDAuODEyMTQ1NDcxNTcyODc2XSwgWzE1OTA0MDg3NjcuNzQxMjA5NSwgMSwgMC45NDcyNTQ1Mzg1MzYwNzE4XSwgWzE1OTA0MDg3ODEuNjQzMjIyOCwgMiwgMC45NjExNjM2NDAwMjIyNzc4XSwgWzE1OTA0MDg3OTUuNjI3MTg2LCAzLCAwLjk2NzQzNjM3MzIzMzc5NTJdLCBbMTU5MDQwODgwOS42NTM3NTE2LCA0LCAwLjk3MjA3MjcyMDUyNzY0ODldLCBbMTU5MDQwODgyNC4xMTM2NzU2LCA1LCAwLjk3NDIxODE4OTcxNjMzOTFdLCBbMTU5MDQwODgzNy45MzI3NTY3LCA2LCAwLjk3NTU0NTQ2NTk0NjE5NzVdLCBbMTU5MDQwODg1Mi4wNjc4OTIsIDcsIDAuOTc3NDE4MTg0MjgwMzk1NV0sIFsxNTkwNDA4ODY2LjE2OTczMjgsIDgsIDAuOTc4NTI3MjQ3OTA1NzMxMl0sIFsxNTkwNDA4ODgwLjQyNTI3NzcsIDksIDAuOTc5MTA5MTA4NDQ4MDI4Nl1d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy&run=testing_for_activations%2Fversion_4": { + "data": "W1sxNTkwNDA4NzUyLjYzMjg2NzgsIDQyOSwgMC45NTk4MDAwMDQ5NTkxMDY0XSwgWzE1OTA0MDg3NTMuNDk2OTQ2NiwgNDMwLCAwLjgxMjE0NTQ3MTU3Mjg3Nl0sIFsxNTkwNDA4NzY3LjAxNjc1MDYsIDg1OSwgMC45NzYwMDAwMTA5NjcyNTQ2XSwgWzE1OTA0MDg3NjcuOTExOTgzMywgODYwLCAwLjk0NzI1NDUzODUzNjA3MThdLCBbMTU5MDQwODc4MS4wNDMyMjEyLCAxMjg5LCAwLjk4MDU5OTk5OTQyNzc5NTRdLCBbMTU5MDQwODc4MS44MjIxNTAyLCAxMjkwLCAwLjk2MTE2MzY0MDAyMjI3NzhdLCBbMTU5MDQwODc5NS4wNDM5MjkzLCAxNzE5LCAwLjk4MzIwMDAxMzYzNzU0MjddLCBbMTU5MDQwODc5NS43OTgyMzY4LCAxNzIwLCAwLjk2NzQzNjM3MzIzMzc5NTJdLCBbMTU5MDQwODgwOS4wMDc0OTA0LCAyMTQ5LCAwLjk4NDc5OTk4MTExNzI0ODVdLCBbMTU5MDQwODgwOS44MzE2OTc3LCAyMTUwLCAwLjk3MjA3MjcyMDUyNzY0ODldLCBbMTU5MDQwODgyMy4zMTUyNDc4LCAyNTc5LCAwLjk4NjE5OTk3NTAxMzczMjldLCBbMTU5MDQwODgyNC4yODkxNzU3LCAyNTgwLCAwLjk3NDIxODE4OTcxNjMzOTFdLCBbMTU5MDQwODgzNy4zMTc0Mjg4LCAzMDA5LCAwLjk4NzM5OTk5NTMyNjk5NThdLCBbMTU5MDQwODgzOC4xMTAzNzE0LCAzMDEwLCAwLjk3NTU0NTQ2NTk0NjE5NzVdLCBbMTU5MDQwODg1MS40NTA0OTQ1LCAzNDM5LCAwLjk4ODM5OTk4MjQ1MjM5MjZdLCBbMTU5MDQwODg1Mi4yNTc3NTc3LCAzNDQwLCAwLjk3NzQxODE4NDI4MDM5NTVdLCBbMTU5MDQwODg2NS41NjQ3MDAxLCAzODY5LCAwLjk4Nzk5OTk3NTY4MTMwNDldLCBbMTU5MDQwODg2Ni4zNDE4MjU1LCAzODcwLCAwLjk3ODUyNzI0NzkwNTczMTJdLCBbMTU5MDQwODg3OS44Mzk3MjY3LCA0Mjk5LCAwLjk4ODc5OTk4OTIyMzQ4MDJdLCBbMTU5MDQwODg4MC42MTIwNTI0LCA0MzAwLCAwLjk3OTEwOTEwODQ0ODAyODZdXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Loss%2FVal&run=testing_for_activations%2Fversion_1": { + "data": "W1sxNTkwNDA1NzIyLjE1OTUyMywgMCwgMi4zMDM4Njk0ODU4NTUxMDI1XSwgWzE1OTA0MDU3MzUuOTI5NDI3NCwgMCwgMS43NTg4NTU0NjIwNzQyNzk4XV0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy%2FVal&run=testing_for_activations%2Fversion_2": { + "data": "W1sxNTkwNDA1NzcwLjk4NDI5MjMsIDAsIDAuMTIxMDkzNzVdLCBbMTU5MDQwNTc4NC43NjI2MjQsIDAsIDAuOTYxMTk5OTk4ODU1NTkwOF1d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy%2FVal&run=testing_for_activations%2Fversion_1": { + "data": "W1sxNTkwNDA1NzIyLjE1OTY0OTQsIDAsIDAuMDg5ODQzNzVdLCBbMTU5MDQwNTczNS45Mjk1NDUsIDAsIDAuOTU1NjAwMDIzMjY5NjUzM11d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Accuracy%2FVal&run=testing_for_activations%2Fversion_4": { + "data": "W1sxNTkwNDA4NzM4LjgwNDgwODYsIDAsIDAuMTQwNjI1XSwgWzE1OTA0MDg3NTIuNjMxODIxOSwgMCwgMC45NTk4MDAwMDQ5NTkxMDY0XSwgWzE1OTA0MDg3NjcuMDE2MDgyNSwgMSwgMC45NzYwMDAwMTA5NjcyNTQ2XSwgWzE1OTA0MDg3ODEuMDQyMzM5NiwgMiwgMC45ODA1OTk5OTk0Mjc3OTU0XSwgWzE1OTA0MDg3OTUuMDQzMDU4LCAzLCAwLjk4MzIwMDAxMzYzNzU0MjddLCBbMTU5MDQwODgwOS4wMDY2OTksIDQsIDAuOTg0Nzk5OTgxMTE3MjQ4NV0sIFsxNTkwNDA4ODIzLjMxNDUwMjUsIDUsIDAuOTg2MTk5OTc1MDEzNzMyOV0sIFsxNTkwNDA4ODM3LjMxNjY1NywgNiwgMC45ODczOTk5OTUzMjY5OTU4XSwgWzE1OTA0MDg4NTEuNDQ5NzUxOSwgNywgMC45ODgzOTk5ODI0NTIzOTI2XSwgWzE1OTA0MDg4NjUuNTY0MDA1LCA4LCAwLjk4Nzk5OTk3NTY4MTMwNDldLCBbMTU5MDQwODg3OS44Mzg4MDc4LCA5LCAwLjk4ODc5OTk4OTIyMzQ4MDJdXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Loss%2FVal&run=testing_for_activations%2Fversion_0": { + "data": "W1sxNTkwNDA1NjYxLjY4NjY0NzQsIDAsIDIuMzAzNTcwNzQ3Mzc1NDg4M10sIFsxNTkwNDA1Njc1LjQ2NTA3NjQsIDAsIDEuNzQ1NDE4MTkwOTU2MTE1N11d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Loss%2FVal&run=testing_for_activations%2Fversion_2": { + "data": "W1sxNTkwNDA1NzcwLjk4NDAzNjIsIDAsIDIuMzAyNTc2MDY1MDYzNDc2Nl0sIFsxNTkwNDA1Nzg0Ljc2MjQ5NzQsIDAsIDEuNzUzMDg3ODc4MjI3MjMzOV1d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Loss%2FVal&run=testing_for_activations%2Fversion_4": { + "data": "W1sxNTkwNDA4NzM4LjgwNDY4NjUsIDAsIDIuMzAyNTE1OTgzNTgxNTQzXSwgWzE1OTA0MDg3NTIuNjMxNjY4OCwgMCwgMS43NDA3ODU5NTYzODI3NTE1XSwgWzE1OTA0MDg3NjcuMDE1OTM0NywgMSwgMS42NDMyMTA0MTEwNzE3NzczXSwgWzE1OTA0MDg3ODEuMDQyMjE4NCwgMiwgMS41ODgxMzIwMjM4MTEzNDAzXSwgWzE1OTA0MDg3OTUuMDQyODk1OCwgMywgMS41NjE2ODIzNDM0ODI5NzEyXSwgWzE1OTA0MDg4MDkuMDA2NTY1MywgNCwgMS41MzQ5MTA5MTcyODIxMDQ1XSwgWzE1OTA0MDg4MjMuMzE0Mzc4NywgNSwgMS41MjQ1OTg5NTYxMDgwOTMzXSwgWzE1OTA0MDg4MzcuMzE2NTE4NSwgNiwgMS41MTUxNjQ3MzI5MzMwNDQ0XSwgWzE1OTA0MDg4NTEuNDQ5NjIyLCA3LCAxLjUwNzM0MDMxMjAwNDA4OTRdLCBbMTU5MDQwODg2NS41NjM4Mjg1LCA4LCAxLjUwMDExMTIyMjI2NzE1MDldLCBbMTU5MDQwODg3OS44Mzg2NzQ4LCA5LCAxLjQ5NTQxNzgzMzMyODI0N11d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Loss%2FTrain&run=testing_for_activations%2Fversion_3": { + "data": "W1sxNTkwNDA2MDQ1LjE5Mzc5MTYsIDAsIDEuODk1MzUyODQwNDIzNTg0XSwgWzE1OTA0MDYwNTkuNjE4MTE3NiwgMSwgMS43MTEzNDU0MzQxODg4NDI4XSwgWzE1OTA0MDYwNzQuMjk0MjMxNCwgMiwgMS42NDQ2MzI1Nzc4OTYxMTgyXSwgWzE1OTA0MDYwODguOTcxNTk5LCAzLCAxLjYwNTA3NzUwNTExMTY5NDNdLCBbMTU5MDQwNjEwMy40NDUzMzEsIDQsIDEuNTc4Nzk5ODQzNzg4MTQ3XSwgWzE1OTA0MDYxMTcuOTkyODg5NiwgNSwgMS41NjA2MTI5MTY5NDY0MTExXSwgWzE1OTA0MDYxMzIuMzk0MjI5LCA2LCAxLjU0NjI3ODk1MzU1MjI0Nl0sIFsxNTkwNDA2MTQ3LjAyOTkxMiwgNywgMS41MzU2MjIxMTk5MDM1NjQ1XSwgWzE1OTA0MDYxNjEuNjU4NDU3LCA4LCAxLjUyNzg4MDMxMTAxMjI2OF0sIFsxNTkwNDA2MTc2LjM5NTQ4NTQsIDksIDEuNTIwOTEwMzgyMjcwODEzXV0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=Loss%2FTrain&run=testing_for_activations%2Fversion_4": { + "data": "W1sxNTkwNDA4NzUzLjMyMTUxMTcsIDAsIDEuODkwMjA1MDI1NjcyOTEyNl0sIFsxNTkwNDA4NzY3Ljc0MTEzMywgMSwgMS43MDMxNDUxNDYzNjk5MzRdLCBbMTU5MDQwODc4MS42NDMxMTU4LCAyLCAxLjYzOTc1OTE4MjkyOTk5MjddLCBbMTU5MDQwODc5NS42MjcwNzc4LCAzLCAxLjYwMDcwODI0NjIzMTA3OV0sIFsxNTkwNDA4ODA5LjY1MzY0MTUsIDQsIDEuNTc1MDczMjQyMTg3NV0sIFsxNTkwNDA4ODI0LjExMzUzOCwgNSwgMS41NTczMjE0MjkyNTI2MjQ1XSwgWzE1OTA0MDg4MzcuOTMyNjcyMywgNiwgMS41NDM0ODE1ODgzNjM2NDc1XSwgWzE1OTA0MDg4NTIuMDY3NzgyNiwgNywgMS41MzMzNzg3MjAyODM1MDgzXSwgWzE1OTA0MDg4NjYuMTY5NjA3NCwgOCwgMS41MjU1NDQ2NDM0MDIwOTk2XSwgWzE1OTA0MDg4ODAuNDI1MTgyOCwgOSwgMS41MTk1NTE5OTI0MTYzODE4XV0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/tags": { + "data": "eyJ0ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucy92ZXJzaW9uXzIiOiB7fSwgInRlc3RpbmdfZm9yX2FjdGl2YXRpb25zL3ZlcnNpb25fMCI6IHt9LCAidGVzdGluZ19mb3JfYWN0aXZhdGlvbnMvdmVyc2lvbl8xIjoge30sICJ0ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucy92ZXJzaW9uXzMiOiB7ImxheWVyIDEiOiB7ImRpc3BsYXlOYW1lIjogImxheWVyIDEiLCAiZGVzY3JpcHRpb24iOiAiIiwgInNhbXBsZXMiOiAxfSwgImxheWVyIDIiOiB7ImRpc3BsYXlOYW1lIjogImxheWVyIDIiLCAiZGVzY3JpcHRpb24iOiAiIiwgInNhbXBsZXMiOiAxfSwgImxheWVyIDMiOiB7ImRpc3BsYXlOYW1lIjogImxheWVyIDMiLCAiZGVzY3JpcHRpb24iOiAiIiwgInNhbXBsZXMiOiAxfX0sICJ0ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucy92ZXJzaW9uXzQiOiB7ImlucHV0IjogeyJkaXNwbGF5TmFtZSI6ICJpbnB1dCIsICJkZXNjcmlwdGlvbiI6ICIiLCAic2FtcGxlcyI6IDF9LCAibGF5ZXIgMSI6IHsiZGlzcGxheU5hbWUiOiAibGF5ZXIgMSIsICJkZXNjcmlwdGlvbiI6ICIiLCAic2FtcGxlcyI6IDF9LCAibGF5ZXIgMiI6IHsiZGlzcGxheU5hbWUiOiAibGF5ZXIgMiIsICJkZXNjcmlwdGlvbiI6ICIiLCAic2FtcGxlcyI6IDF9LCAibGF5ZXIgMyI6IHsiZGlzcGxheU5hbWUiOiAibGF5ZXIgMyIsICJkZXNjcmlwdGlvbiI6ICIiLCAic2FtcGxlcyI6IDF9fX0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/images?run=testing_for_activations%2Fversion_3&sample=0&tag=layer%201": { + "data": "W3sid2FsbF90aW1lIjogMTU5MDQwNjA0NC44NzM4OTc4LCAic3RlcCI6IDAsICJxdWVyeSI6ICJydW49dGVzdGluZ19mb3JfYWN0aXZhdGlvbnMlMkZ2ZXJzaW9uXzMmdGFnPWxheWVyKzEmc2FtcGxlPTAmaW5kZXg9MCJ9LCB7IndhbGxfdGltZSI6IDE1OTA0MDYwNTkuMTc1MTc4OCwgInN0ZXAiOiAxLCAicXVlcnkiOiAicnVuPXRlc3RpbmdfZm9yX2FjdGl2YXRpb25zJTJGdmVyc2lvbl8zJnRhZz1sYXllcisxJnNhbXBsZT0wJmluZGV4PTEifSwgeyJ3YWxsX3RpbWUiOiAxNTkwNDA2MDczLjc1NTA1ODgsICJzdGVwIjogMiwgInF1ZXJ5IjogInJ1bj10ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucyUyRnZlcnNpb25fMyZ0YWc9bGF5ZXIrMSZzYW1wbGU9MCZpbmRleD0yIn0sIHsid2FsbF90aW1lIjogMTU5MDQwNjA4OC42NDYyNzgsICJzdGVwIjogMywgInF1ZXJ5IjogInJ1bj10ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucyUyRnZlcnNpb25fMyZ0YWc9bGF5ZXIrMSZzYW1wbGU9MCZpbmRleD0zIn0sIHsid2FsbF90aW1lIjogMTU5MDQwNjEwMy4xMDA3MjA0LCAic3RlcCI6IDQsICJxdWVyeSI6ICJydW49dGVzdGluZ19mb3JfYWN0aXZhdGlvbnMlMkZ2ZXJzaW9uXzMmdGFnPWxheWVyKzEmc2FtcGxlPTAmaW5kZXg9NCJ9LCB7IndhbGxfdGltZSI6IDE1OTA0MDYxMTcuNjcyMDUyNiwgInN0ZXAiOiA1LCAicXVlcnkiOiAicnVuPXRlc3RpbmdfZm9yX2FjdGl2YXRpb25zJTJGdmVyc2lvbl8zJnRhZz1sYXllcisxJnNhbXBsZT0wJmluZGV4PTUifSwgeyJ3YWxsX3RpbWUiOiAxNTkwNDA2MTMyLjA3MzE2MywgInN0ZXAiOiA2LCAicXVlcnkiOiAicnVuPXRlc3RpbmdfZm9yX2FjdGl2YXRpb25zJTJGdmVyc2lvbl8zJnRhZz1sYXllcisxJnNhbXBsZT0wJmluZGV4PTYifSwgeyJ3YWxsX3RpbWUiOiAxNTkwNDA2MTQ2LjY5ODAyMzgsICJzdGVwIjogNywgInF1ZXJ5IjogInJ1bj10ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucyUyRnZlcnNpb25fMyZ0YWc9bGF5ZXIrMSZzYW1wbGU9MCZpbmRleD03In0sIHsid2FsbF90aW1lIjogMTU5MDQwNjE2MS4zMzM3NTg0LCAic3RlcCI6IDgsICJxdWVyeSI6ICJydW49dGVzdGluZ19mb3JfYWN0aXZhdGlvbnMlMkZ2ZXJzaW9uXzMmdGFnPWxheWVyKzEmc2FtcGxlPTAmaW5kZXg9OCJ9LCB7IndhbGxfdGltZSI6IDE1OTA0MDYxNzUuODY5MTQ1LCAic3RlcCI6IDksICJxdWVyeSI6ICJydW49dGVzdGluZ19mb3JfYWN0aXZhdGlvbnMlMkZ2ZXJzaW9uXzMmdGFnPWxheWVyKzEmc2FtcGxlPTAmaW5kZXg9OSJ9XQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/images?run=testing_for_activations%2Fversion_4&sample=0&tag=layer%201": { + "data": "W3sid2FsbF90aW1lIjogMTU5MDQwODc1Mi45NTc4MTA0LCAic3RlcCI6IDAsICJxdWVyeSI6ICJydW49dGVzdGluZ19mb3JfYWN0aXZhdGlvbnMlMkZ2ZXJzaW9uXzQmdGFnPWxheWVyKzEmc2FtcGxlPTAmaW5kZXg9MCJ9LCB7IndhbGxfdGltZSI6IDE1OTA0MDg3NjcuMjkxMTA5NiwgInN0ZXAiOiAxLCAicXVlcnkiOiAicnVuPXRlc3RpbmdfZm9yX2FjdGl2YXRpb25zJTJGdmVyc2lvbl80JnRhZz1sYXllcisxJnNhbXBsZT0wJmluZGV4PTEifSwgeyJ3YWxsX3RpbWUiOiAxNTkwNDA4NzgxLjMxNDM0ODUsICJzdGVwIjogMiwgInF1ZXJ5IjogInJ1bj10ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucyUyRnZlcnNpb25fNCZ0YWc9bGF5ZXIrMSZzYW1wbGU9MCZpbmRleD0yIn0sIHsid2FsbF90aW1lIjogMTU5MDQwODc5NS4zMTE3MzA5LCAic3RlcCI6IDMsICJxdWVyeSI6ICJydW49dGVzdGluZ19mb3JfYWN0aXZhdGlvbnMlMkZ2ZXJzaW9uXzQmdGFnPWxheWVyKzEmc2FtcGxlPTAmaW5kZXg9MyJ9LCB7IndhbGxfdGltZSI6IDE1OTA0MDg4MDkuMzE0ODQ0MSwgInN0ZXAiOiA0LCAicXVlcnkiOiAicnVuPXRlc3RpbmdfZm9yX2FjdGl2YXRpb25zJTJGdmVyc2lvbl80JnRhZz1sYXllcisxJnNhbXBsZT0wJmluZGV4PTQifSwgeyJ3YWxsX3RpbWUiOiAxNTkwNDA4ODIzLjc4MzIyODIsICJzdGVwIjogNSwgInF1ZXJ5IjogInJ1bj10ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucyUyRnZlcnNpb25fNCZ0YWc9bGF5ZXIrMSZzYW1wbGU9MCZpbmRleD01In0sIHsid2FsbF90aW1lIjogMTU5MDQwODg1MS43NDIzODMyLCAic3RlcCI6IDcsICJxdWVyeSI6ICJydW49dGVzdGluZ19mb3JfYWN0aXZhdGlvbnMlMkZ2ZXJzaW9uXzQmdGFnPWxheWVyKzEmc2FtcGxlPTAmaW5kZXg9NiJ9LCB7IndhbGxfdGltZSI6IDE1OTA0MDg4NjUuODM0NzEwNCwgInN0ZXAiOiA4LCAicXVlcnkiOiAicnVuPXRlc3RpbmdfZm9yX2FjdGl2YXRpb25zJTJGdmVyc2lvbl80JnRhZz1sYXllcisxJnNhbXBsZT0wJmluZGV4PTcifSwgeyJ3YWxsX3RpbWUiOiAxNTkwNDA4ODgwLjEwOTI3NDQsICJzdGVwIjogOSwgInF1ZXJ5IjogInJ1bj10ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucyUyRnZlcnNpb25fNCZ0YWc9bGF5ZXIrMSZzYW1wbGU9MCZpbmRleD04In0sIHsid2FsbF90aW1lIjogMTU5MDQwOTA0Mi45OTI0MTIzLCAic3RlcCI6IDksICJxdWVyeSI6ICJydW49dGVzdGluZ19mb3JfYWN0aXZhdGlvbnMlMkZ2ZXJzaW9uXzQmdGFnPWxheWVyKzEmc2FtcGxlPTAmaW5kZXg9OSJ9XQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590406175.869145&run=testing_for_activations%2Fversion_3&tag=layer+1&sample=0&index=9": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/images?run=testing_for_activations%2Fversion_4&sample=0&tag=input": { + "data": "W3sid2FsbF90aW1lIjogMTU5MDQwODc1Mi42NjM4MTAzLCAic3RlcCI6IDAsICJxdWVyeSI6ICJydW49dGVzdGluZ19mb3JfYWN0aXZhdGlvbnMlMkZ2ZXJzaW9uXzQmdGFnPWlucHV0JnNhbXBsZT0wJmluZGV4PTAifSwgeyJ3YWxsX3RpbWUiOiAxNTkwNDA4NzY3LjA0NTg0NTUsICJzdGVwIjogMSwgInF1ZXJ5IjogInJ1bj10ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucyUyRnZlcnNpb25fNCZ0YWc9aW5wdXQmc2FtcGxlPTAmaW5kZXg9MSJ9LCB7IndhbGxfdGltZSI6IDE1OTA0MDg3ODEuMDcxMTQ5NiwgInN0ZXAiOiAyLCAicXVlcnkiOiAicnVuPXRlc3RpbmdfZm9yX2FjdGl2YXRpb25zJTJGdmVyc2lvbl80JnRhZz1pbnB1dCZzYW1wbGU9MCZpbmRleD0yIn0sIHsid2FsbF90aW1lIjogMTU5MDQwODc5NS4wNzM4NTE2LCAic3RlcCI6IDMsICJxdWVyeSI6ICJydW49dGVzdGluZ19mb3JfYWN0aXZhdGlvbnMlMkZ2ZXJzaW9uXzQmdGFnPWlucHV0JnNhbXBsZT0wJmluZGV4PTMifSwgeyJ3YWxsX3RpbWUiOiAxNTkwNDA4ODA5LjAzODM4NjMsICJzdGVwIjogNCwgInF1ZXJ5IjogInJ1bj10ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucyUyRnZlcnNpb25fNCZ0YWc9aW5wdXQmc2FtcGxlPTAmaW5kZXg9NCJ9LCB7IndhbGxfdGltZSI6IDE1OTA0MDg4MjMuMzQyMjUwNiwgInN0ZXAiOiA1LCAicXVlcnkiOiAicnVuPXRlc3RpbmdfZm9yX2FjdGl2YXRpb25zJTJGdmVyc2lvbl80JnRhZz1pbnB1dCZzYW1wbGU9MCZpbmRleD01In0sIHsid2FsbF90aW1lIjogMTU5MDQwODg1MS40NzkwMzQsICJzdGVwIjogNywgInF1ZXJ5IjogInJ1bj10ZXN0aW5nX2Zvcl9hY3RpdmF0aW9ucyUyRnZlcnNpb25fNCZ0YWc9aW5wdXQmc2FtcGxlPTAmaW5kZXg9NiJ9LCB7IndhbGxfdGltZSI6IDE1OTA0MDg4NjUuNTkwNjEwNywgInN0ZXAiOiA4LCAicXVlcnkiOiAicnVuPXRlc3RpbmdfZm9yX2FjdGl2YXRpb25zJTJGdmVyc2lvbl80JnRhZz1pbnB1dCZzYW1wbGU9MCZpbmRleD03In0sIHsid2FsbF90aW1lIjogMTU5MDQwODg3OS44NjcxODI1LCAic3RlcCI6IDksICJxdWVyeSI6ICJydW49dGVzdGluZ19mb3JfYWN0aXZhdGlvbnMlMkZ2ZXJzaW9uXzQmdGFnPWlucHV0JnNhbXBsZT0wJmluZGV4PTgifSwgeyJ3YWxsX3RpbWUiOiAxNTkwNDA5MDQyLjc0MTM0NSwgInN0ZXAiOiA5LCAicXVlcnkiOiAicnVuPXRlc3RpbmdfZm9yX2FjdGl2YXRpb25zJTJGdmVyc2lvbl80JnRhZz1pbnB1dCZzYW1wbGU9MCZpbmRleD05In1d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408880.1092744&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=9": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408879.8671825&run=testing_for_activations%2Fversion_4&tag=input&sample=0&index=9": { + "data": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAABlUlEQVR4nO2Uz6sBURTHv/MaYyHSUBQ1SSz8Awor+Rf8CbJgrKwo/wB/gQULRdnKxoIoC5m1tYWNBflZI907b3F702teaQyL1+t9FrfbuadP55zbvcA/f594PF6v11Op1Ht0mUym3W5TSgkhqqoqiuL3+63rIpFIpVI5Ho+EECZlzGYzPYd/ypjNZjudjs1m0yOKojQajUQicbvdni5QEIR+v69pGqWUUqqq6nA4TKfTT4u+U61W9X6n02kul3uQbLZ9h8MB4Hq9tlqtcrl8v99fqhGAy+UajUaEkFKpZCb/w0zS6XTa7XYA2PoeKYBut8txXCgUsiKNxWK1Wi0YDBriTqdT0zRRFM1IjRdVLBbz+bwsy71eb7/fz+fz5XJ5OBzsdjsAQRCsSD0eDwBRFAuFAgCO49br9Xa79fl8ALxerxXp+Xw2RCRJkiSJ7ZvNphmpkUAgMB6P6Rf6E2Ikk0krUgA8z8uy/PPLWCwWbLLWCYfDk8lks9kw42AwYGM1A/f42O12R6NRAKvV6nK5vFTmP7+OT0CY0ZIgB24RAAAAAElFTkSuQmCC", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408865.5906107&run=testing_for_activations%2Fversion_4&tag=input&sample=0&index=8": { + "data": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAABlUlEQVR4nO2Uz6sBURTHv/MaYyHSUBQ1SSz8Awor+Rf8CbJgrKwo/wB/gQULRdnKxoIoC5m1tYWNBflZI907b3F702teaQyL1+t9FrfbuadP55zbvcA/f594PF6v11Op1Ht0mUym3W5TSgkhqqoqiuL3+63rIpFIpVI5Ho+EECZlzGYzPYd/ypjNZjudjs1m0yOKojQajUQicbvdni5QEIR+v69pGqWUUqqq6nA4TKfTT4u+U61W9X6n02kul3uQbLZ9h8MB4Hq9tlqtcrl8v99fqhGAy+UajUaEkFKpZCb/w0zS6XTa7XYA2PoeKYBut8txXCgUsiKNxWK1Wi0YDBriTqdT0zRRFM1IjRdVLBbz+bwsy71eb7/fz+fz5XJ5OBzsdjsAQRCsSD0eDwBRFAuFAgCO49br9Xa79fl8ALxerxXp+Xw2RCRJkiSJ7ZvNphmpkUAgMB6P6Rf6E2Ikk0krUgA8z8uy/PPLWCwWbLLWCYfDk8lks9kw42AwYGM1A/f42O12R6NRAKvV6nK5vFTmP7+OT0CY0ZIgB24RAAAAAElFTkSuQmCC", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408851.479034&run=testing_for_activations%2Fversion_4&tag=input&sample=0&index=7": { + "data": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAABlUlEQVR4nO2Uz6sBURTHv/MaYyHSUBQ1SSz8Awor+Rf8CbJgrKwo/wB/gQULRdnKxoIoC5m1tYWNBflZI907b3F702teaQyL1+t9FrfbuadP55zbvcA/f594PF6v11Op1Ht0mUym3W5TSgkhqqoqiuL3+63rIpFIpVI5Ho+EECZlzGYzPYd/ypjNZjudjs1m0yOKojQajUQicbvdni5QEIR+v69pGqWUUqqq6nA4TKfTT4u+U61W9X6n02kul3uQbLZ9h8MB4Hq9tlqtcrl8v99fqhGAy+UajUaEkFKpZCb/w0zS6XTa7XYA2PoeKYBut8txXCgUsiKNxWK1Wi0YDBriTqdT0zRRFM1IjRdVLBbz+bwsy71eb7/fz+fz5XJ5OBzsdjsAQRCsSD0eDwBRFAuFAgCO49br9Xa79fl8ALxerxXp+Xw2RCRJkiSJ7ZvNphmpkUAgMB6P6Rf6E2Ikk0krUgA8z8uy/PPLWCwWbLLWCYfDk8lks9kw42AwYGM1A/f42O12R6NRAKvV6nK5vFTmP7+OT0CY0ZIgB24RAAAAAElFTkSuQmCC", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408823.3422506&run=testing_for_activations%2Fversion_4&tag=input&sample=0&index=5": { + "data": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAABlUlEQVR4nO2Uz6sBURTHv/MaYyHSUBQ1SSz8Awor+Rf8CbJgrKwo/wB/gQULRdnKxoIoC5m1tYWNBflZI907b3F702teaQyL1+t9FrfbuadP55zbvcA/f594PF6v11Op1Ht0mUym3W5TSgkhqqoqiuL3+63rIpFIpVI5Ho+EECZlzGYzPYd/ypjNZjudjs1m0yOKojQajUQicbvdni5QEIR+v69pGqWUUqqq6nA4TKfTT4u+U61W9X6n02kul3uQbLZ9h8MB4Hq9tlqtcrl8v99fqhGAy+UajUaEkFKpZCb/w0zS6XTa7XYA2PoeKYBut8txXCgUsiKNxWK1Wi0YDBriTqdT0zRRFM1IjRdVLBbz+bwsy71eb7/fz+fz5XJ5OBzsdjsAQRCsSD0eDwBRFAuFAgCO49br9Xa79fl8ALxerxXp+Xw2RCRJkiSJ7ZvNphmpkUAgMB6P6Rf6E2Ikk0krUgA8z8uy/PPLWCwWbLLWCYfDk8lks9kw42AwYGM1A/f42O12R6NRAKvV6nK5vFTmP7+OT0CY0ZIgB24RAAAAAElFTkSuQmCC", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408837.3473294&run=testing_for_activations%2Fversion_4&tag=input&sample=0&index=6": { + "data": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAABlUlEQVR4nO2Uz6sBURTHv/MaYyHSUBQ1SSz8Awor+Rf8CbJgrKwo/wB/gQULRdnKxoIoC5m1tYWNBflZI907b3F702teaQyL1+t9FrfbuadP55zbvcA/f594PF6v11Op1Ht0mUym3W5TSgkhqqoqiuL3+63rIpFIpVI5Ho+EECZlzGYzPYd/ypjNZjudjs1m0yOKojQajUQicbvdni5QEIR+v69pGqWUUqqq6nA4TKfTT4u+U61W9X6n02kul3uQbLZ9h8MB4Hq9tlqtcrl8v99fqhGAy+UajUaEkFKpZCb/w0zS6XTa7XYA2PoeKYBut8txXCgUsiKNxWK1Wi0YDBriTqdT0zRRFM1IjRdVLBbz+bwsy71eb7/fz+fz5XJ5OBzsdjsAQRCsSD0eDwBRFAuFAgCO49br9Xa79fl8ALxerxXp+Xw2RCRJkiSJ7ZvNphmpkUAgMB6P6Rf6E2Ikk0krUgA8z8uy/PPLWCwWbLLWCYfDk8lks9kw42AwYGM1A/f42O12R6NRAKvV6nK5vFTmP7+OT0CY0ZIgB24RAAAAAElFTkSuQmCC", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408795.0738516&run=testing_for_activations%2Fversion_4&tag=input&sample=0&index=3": { + "data": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAABlUlEQVR4nO2Uz6sBURTHv/MaYyHSUBQ1SSz8Awor+Rf8CbJgrKwo/wB/gQULRdnKxoIoC5m1tYWNBflZI907b3F702teaQyL1+t9FrfbuadP55zbvcA/f594PF6v11Op1Ht0mUym3W5TSgkhqqoqiuL3+63rIpFIpVI5Ho+EECZlzGYzPYd/ypjNZjudjs1m0yOKojQajUQicbvdni5QEIR+v69pGqWUUqqq6nA4TKfTT4u+U61W9X6n02kul3uQbLZ9h8MB4Hq9tlqtcrl8v99fqhGAy+UajUaEkFKpZCb/w0zS6XTa7XYA2PoeKYBut8txXCgUsiKNxWK1Wi0YDBriTqdT0zRRFM1IjRdVLBbz+bwsy71eb7/fz+fz5XJ5OBzsdjsAQRCsSD0eDwBRFAuFAgCO49br9Xa79fl8ALxerxXp+Xw2RCRJkiSJ7ZvNphmpkUAgMB6P6Rf6E2Ikk0krUgA8z8uy/PPLWCwWbLLWCYfDk8lks9kw42AwYGM1A/f42O12R6NRAKvV6nK5vFTmP7+OT0CY0ZIgB24RAAAAAElFTkSuQmCC", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408809.0383863&run=testing_for_activations%2Fversion_4&tag=input&sample=0&index=4": { + "data": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAABlUlEQVR4nO2Uz6sBURTHv/MaYyHSUBQ1SSz8Awor+Rf8CbJgrKwo/wB/gQULRdnKxoIoC5m1tYWNBflZI907b3F702teaQyL1+t9FrfbuadP55zbvcA/f594PF6v11Op1Ht0mUym3W5TSgkhqqoqiuL3+63rIpFIpVI5Ho+EECZlzGYzPYd/ypjNZjudjs1m0yOKojQajUQicbvdni5QEIR+v69pGqWUUqqq6nA4TKfTT4u+U61W9X6n02kul3uQbLZ9h8MB4Hq9tlqtcrl8v99fqhGAy+UajUaEkFKpZCb/w0zS6XTa7XYA2PoeKYBut8txXCgUsiKNxWK1Wi0YDBriTqdT0zRRFM1IjRdVLBbz+bwsy71eb7/fz+fz5XJ5OBzsdjsAQRCsSD0eDwBRFAuFAgCO49br9Xa79fl8ALxerxXp+Xw2RCRJkiSJ7ZvNphmpkUAgMB6P6Rf6E2Ikk0krUgA8z8uy/PPLWCwWbLLWCYfDk8lks9kw42AwYGM1A/f42O12R6NRAKvV6nK5vFTmP7+OT0CY0ZIgB24RAAAAAElFTkSuQmCC", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408781.0711496&run=testing_for_activations%2Fversion_4&tag=input&sample=0&index=2": { + "data": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAABlUlEQVR4nO2Uz6sBURTHv/MaYyHSUBQ1SSz8Awor+Rf8CbJgrKwo/wB/gQULRdnKxoIoC5m1tYWNBflZI907b3F702teaQyL1+t9FrfbuadP55zbvcA/f594PF6v11Op1Ht0mUym3W5TSgkhqqoqiuL3+63rIpFIpVI5Ho+EECZlzGYzPYd/ypjNZjudjs1m0yOKojQajUQicbvdni5QEIR+v69pGqWUUqqq6nA4TKfTT4u+U61W9X6n02kul3uQbLZ9h8MB4Hq9tlqtcrl8v99fqhGAy+UajUaEkFKpZCb/w0zS6XTa7XYA2PoeKYBut8txXCgUsiKNxWK1Wi0YDBriTqdT0zRRFM1IjRdVLBbz+bwsy71eb7/fz+fz5XJ5OBzsdjsAQRCsSD0eDwBRFAuFAgCO49br9Xa79fl8ALxerxXp+Xw2RCRJkiSJ7ZvNphmpkUAgMB6P6Rf6E2Ikk0krUgA8z8uy/PPLWCwWbLLWCYfDk8lks9kw42AwYGM1A/f42O12R6NRAKvV6nK5vFTmP7+OT0CY0ZIgB24RAAAAAElFTkSuQmCC", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408865.8347104&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=8": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408851.7423832&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=7": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408837.5963132&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=6": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408823.7832282&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=5": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408809.3148441&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=4": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408795.3117309&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=3": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408767.2911096&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=1": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408781.3143485&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=2": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408752.9578104&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=0": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590409042.741345&run=testing_for_activations%2Fversion_4&tag=input&sample=0&index=9": { + "data": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAACUElEQVR4nO2UvWvqUBjGT+SKg4M0W6Gl0MYlSqEQHRziplOrIpEiCC4uTt2cxCCugqBLXcXi0KWULB1K/RgMif4F7SDikIQOFYkHSU7uEAglV9t4ucu93Gc7D+/5vc/JeU8A+K+/QphtHQgEkskkx3Hv7++RSISmacMwRFFcr9fBYJAgCIqiLi4uVqvVHk0QQrquQwglSdJ13VxaMpeFQuFryI+trtvt9vl8iqJgGPb6+vr09GT6xWLRMAyfz7dHTCtpuVyORqP77fwk13bX5er3+38Mms1mMQyjaXrXBhzHcRz/Gmq//ePjY0EQPB7P+fn5fD43zUQi8fHxQVHUyclJLBZbr9eiKAqCcHt76zR8tVrVNC2XywEAWJbtdDqapkEIN5uNbRhkWS6VSi6X/bj2pKYkSTIMo9/vMwxjGIZpCoKgqurDw8NisQAAXF9fp9NphFClUmm327IsfxO20Wh8HszxeHx5eenxeGxlJEnyPK/r+v39/fdfgGVZhBBCaDgcxuPxLyoJgpjNZjzP/9rSLoZher1eKpX6vj8ALMvquk6SpJNipzKhrVbLcrYPv6VwOOwQfXp66hQ6GAxCoZAT6Nvbm1Ooqqp3d3etVuvq6mrXVRwcHGAYNhqNnPQGAAC/3z+dTs3x4nm+2Wze3NyYdIIgMplMt9uFEE4mE6/X6xQKAMjn84+Pj6qqWmOrKIokScvl0npgHMftQbSUTqefn5+3/rPr9frR0dHn4u3PdJeq1SqE8PDwMB6Pn52dDYfDWq328vKiadrvJP1H9RPtZlgCJoRfhwAAAABJRU5ErkJggg==", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590409042.9924123&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=9": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408880.1092744&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=8": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408851.7423832&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=6": { + "data": "iVBORw0KGgoAAAANSUhEUgAAAHAAAAA4CAIAAACqiesdAAAIfklEQVR4nO1ba0hUTxQ/mdu2tdpja9vaSHusYQ+3J5Qbpqu72JKVgUav1TBCC80HJiiKtS49YNPaKCipKJIygtB2iSwNskKswKgvfZIE8Vtfgwj+H0bH2bn3zs693lX////+Pixnzpx7Zvx5ZuaeuTMAUUTxb4Xdbvd4PB8/flTRp9lslvtIfHy8ih3gRHp6em9v7/fv31XzmJOTs337dgDw+/35+fkTd6jX641GIwCcOnUKAFpbW3meunnzJqN26dKlAFBZWYmKGzZsYHsrKio6cuQIT7sAcOLECU7L8Fi9erUs+6ampo6ODgBwOBxSNhaLxWazAcCaNWtkOZ8/f76oPicnBwAaGhoqKioAYNeuXWFdHThwIKzN7NmzySL6nzEwZ84cJOzYsSOscy5cuHBBHUcyYbPZioqKeCzPnTsX0Z4sXrxYHUebN2/mN75+/TqnZU9Pz7p16xT1SBz19fWFhYX89haLRYVWnz59qoKXUFDBu2DBAoYxnqkDgYDL5QrrXBZHDKAx6/f7VfE2joqKiocPH3748AEA5s2bp4rPtrY2APD5fA6Ho729nWF58eLF1tZWv9/PmIUBwGazVVVV1dfXnz17tqSkZPfu3VqtVtSyurqaLGZnZzPcBoNBAPj69SsABAKBrKwshrE86HQ6nU6nljeXy5Wbm4vkFy9e8DxiMpk6OjpmzpwpWmu320tKSpB85syZVatWqdJPEo8ePZKqSklJMZlMqrcI/f39w8PDSLZarWHt9+3bx+l5xowZPGaI00OHDjFsYmJiVqxYwdkuP3w+X1NTE3C8oikB/6Kk0WjUbz6KKKKIPNCkiadOag7lmVIjjcQxkBqsFzVQETGyrK1W68DAAP4laUUy0qvfTfkYHBwki4g+rKRqpxJkhFJx6nA4ysrKGIQuWrQICT9//ox0P3EwkspgMIg2kHgi9Nq1axHq2yisY8BFEIzxgoICKUK9Xu/r16+fPHmSlpbW3d1948aNyHVVOLrv3r0r18nVq1c/ffqUlpYW1jIjI0NBJ2lYrdbk5GRcNBgMAJCSksKI0KSkJBUaloDH40FCYihkOUlKSmpoaOC337t3LxLu378vq6FRSK1FZrOZDF5VkJqaOmvWLAUPCpcjqpbN9cqVKzkb8vl8wWBQ+cwgHO+kXi026+rqeMx0Ol1qaqpoFWZKarkXyiTQ7ioPqO2CCWHnzp2URkhoS0vL+/fvq6qqIpL/MoHI+vXrF8mOFNHJyck1NTWZmZlyWzEajQq+6IxDKgzx6iRcpi5dujQyMjI0NHTlyhWG54jkxQAA0NjYiGWSUKFle3v727dv+T0nJCQAwMaNG5V3DlHW19cn1IM03Tyoqal59+4dj2Vzc3PYrVKp+ZEMTMomNzf35MmTXq8XAAoKChjO9Xo93o3Lzs6e6M4cpozz7+dHZ2cnANTW1rLNbt++jWWpD0SMBUeKUAz2xtjRo0cBIDMzs66u7uXLl+yuhgeORLz/mpGRoe6KxPNyajabOzs7A4GAlIFUfpkoSEAV9FCv1yNh06ZNCh6nISTOGgpRm0kGRSVFHztCJw4Zubxo0jkwMICFaZXIDw4OJo7l78LlKHK5PNcOeRROpxPLr169wkokIwHZyNtt+t8Ck4iB6COJFjWjgTJ0HhgMBvaXRWXo6+s7f/4820av13OeeFAMp9OJuaME9Ltw4ULSRhImk2n9+vWcrcbGxqLjUAygj6BarTYmRrXBUVxcXFpaymlcW1sr9eWZjfBksW3U+jSPkZ6ezmNmNBq/fPnC6fPgwYPKOySBvLw84S6Bcwy4SBkcPnxYVC8b1NEqNlCrk489e/ZM3Ake4MKhLar8L6OwsPD06dOcxnPnzhUqSTYhdBqVjFxyrvz8+TOjybVr13J2jh/l5eUejwfn0VInRyhs2bKFx8xoNPKvBKJgjHfJwHQ6nQoWCv7DnpwbMy0tLWFt0NvJvXv3OJtWBaLEsSdW2Udh+REXFxchz1KgdipxDq4MYafIyZ5At23bFqHceXKAp050bJrUU1xHU08ukJRZLJbh4eHfv3///fsXAHDSieTYqengvw3CnBJn8aTG6XRGI5QLZAxiDckpjtNxQt1uNwA8ePAAyxRQVYTgcrmCwSD+vIGOFCM91pBnIv/8+UM+rtFokAYLUwa3243owyQyhAgBs+ZyuZDsGgOpRIRSvwgwfY6gkqxhcgGguLgYAPLy8iatJxSVLpcrLi5Oo9EgGRNHgXy3V5dTWXdcQkDyKBWM7CBV/OUdRx8uAhGwpF4YngBw69YtBY2G3RLLz8+/c+dOW1tbVlYWz9mm6urqysrK0Q+XVIQimbz/gi6yqT7qkVvRoY1RWlq6f/9+CKUYc/rs2TP+5jhP7yvA0NAQAJSVlY2WyZGOfvG9DXwrIKJzqBShb9686e7uBkHAMsb1xIe8wWCQtVc9MjJCqyiy3G433vugZlUpTDytFI7x58+fk7V4DhWuPwkJCTxnyo4fP87Tk2XLlvGYIXR1dbEmBLTBI0qfKhGKriKLQrj3LFz3EZs+nw/GCMWnkaRWeZJo9CADKNlX5yo5gy+pxaq5ubmnp+fYsWNer5d9940N4bxJVkHoJKvRaBgXCIWEcm7uAYDT6eS/TIX35H78+IFvoY0DDWqpq8mco14KYS9Qsg8qkdMrAGg0GuHrhCYUZBV5SXjJkiVSrZAnCXm2erVaLboe2tvbu3XrVrpalDK0tk6QTYTLly8jQfQDquh7Un9/f3l5udSoJy2XL18eHx9PvuRT/lW7eB2KxsbGb9++iVaNvkyQeScGSWXk8k6UdOLi48ePjUaj3W6H0Hy0q6sL55RkfkklndMi9WQrqcRUdQgTJKwXxi+1/lCxKZVNTQGECajwdSqiHRByRzILElSS8jTJ6P8BYgLVa4uK8ZYAAAAASUVORK5CYII=", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/images/individualImage?ts=1590408865.8347104&run=testing_for_activations%2Fversion_4&tag=layer+1&sample=0&index=7": { + "data": "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", + "ok": true, + "headers": [ + [ + "content-type", + "image/png" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 873 + } + }, + "source": [ + "%load_ext tensorboard\n", + "%tensorboard --logdir tb_logs/" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "The tensorboard extension is already loaded. To reload it, use:\n", + " %reload_ext tensorboard\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Reusing TensorBoard on port 6006 (pid 69682), started 0:43:08 ago. (Use '!kill 69682' to kill it.)" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "application/javascript": [ + "\n", + " (async () => {\n", + " const url = await google.colab.kernel.proxyPort(6006, {\"cache\": true});\n", + " const iframe = document.createElement('iframe');\n", + " iframe.src = url;\n", + " iframe.setAttribute('width', '100%');\n", + " iframe.setAttribute('height', '800');\n", + " iframe.setAttribute('frameborder', 0);\n", + " document.body.appendChild(iframe);\n", + " })();\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + } + ] +} \ No newline at end of file diff --git a/TensorFlow-Fully-Convolutional-Image-Classification/FullyConvolutionalResnet50.py b/TensorFlow-Fully-Convolutional-Image-Classification/FullyConvolutionalResnet50.py new file mode 100644 index 000000000..d29e92614 --- /dev/null +++ b/TensorFlow-Fully-Convolutional-Image-Classification/FullyConvolutionalResnet50.py @@ -0,0 +1,186 @@ +import cv2 +import numpy as np +import tensorflow as tf +from tensorflow.keras import Input +from tensorflow.keras.applications import ResNet50 +from tensorflow.keras.applications.resnet import preprocess_input +from tensorflow.keras.layers import ( + Activation, + AveragePooling2D, + BatchNormalization, + Conv2D, + MaxPooling2D, + ZeroPadding2D, +) +from tensorflow.python.keras.engine import training +from tensorflow.python.keras.utils import data_utils + +from utils import ( + BASE_WEIGHTS_PATH, + WEIGHTS_HASHES, + stack1, +) + + +# setting FC weights to the final convolutional layer +def set_conv_weights(model, feature_extractor): + # get pre-trained ResNet50 FC weights + dense_layer_weights = feature_extractor.layers[-1].get_weights() + weights_list = [ + tf.reshape( + dense_layer_weights[0], (1, 1, *dense_layer_weights[0].shape), + ).numpy(), + dense_layer_weights[1], + ] + model.get_layer(name="last_conv").set_weights(weights_list) + + +def fully_convolutional_resnet50( + input_shape, num_classes=1000, pretrained_resnet=True, use_bias=True, +): + # init input layer + img_input = Input(shape=input_shape) + + # define basic model pipeline + x = ZeroPadding2D(padding=((3, 3), (3, 3)), name="conv1_pad")(img_input) + x = Conv2D(64, 7, strides=2, use_bias=use_bias, name="conv1_conv")(x) + x = BatchNormalization(axis=3, epsilon=1.001e-5, name="conv1_bn")(x) + x = Activation("relu", name="conv1_relu")(x) + + x = ZeroPadding2D(padding=((1, 1), (1, 1)), name="pool1_pad")(x) + x = MaxPooling2D(3, strides=2, name="pool1_pool")(x) + + # the sequence of stacked residual blocks + x = stack1(x, 64, 3, stride1=1, name="conv2") + x = stack1(x, 128, 4, name="conv3") + x = stack1(x, 256, 6, name="conv4") + x = stack1(x, 512, 3, name="conv5") + + # add avg pooling layer after feature extraction layers + x = AveragePooling2D(pool_size=7)(x) + + # add final convolutional layer + conv_layer_final = Conv2D( + filters=num_classes, kernel_size=1, use_bias=use_bias, name="last_conv", + )(x) + + # configure fully convolutional ResNet50 model + model = training.Model(img_input, x) + + # load model weights + if pretrained_resnet: + model_name = "resnet50" + # configure full file name + file_name = model_name + "_weights_tf_dim_ordering_tf_kernels_notop.h5" + # get the file hash from TF WEIGHTS_HASHES + file_hash = WEIGHTS_HASHES[model_name][1] + weights_path = data_utils.get_file( + file_name, + BASE_WEIGHTS_PATH + file_name, + cache_subdir="models", + file_hash=file_hash, + ) + + model.load_weights(weights_path) + + # form final model + model = training.Model(inputs=model.input, outputs=[conv_layer_final]) + + if pretrained_resnet: + # get model with the dense layer for further FC weights extraction + resnet50_extractor = ResNet50( + include_top=True, weights="imagenet", classes=num_classes, + ) + # set ResNet50 FC-layer weights to final convolutional layer + set_conv_weights(model=model, feature_extractor=resnet50_extractor) + return model + + +if __name__ == "__main__": + + # read ImageNet class ids to a list of labels + with open("imagenet_classes.txt") as f: + labels = [line.strip() for line in f.readlines()] + + # read image + original_image = cv2.imread("camel.jpg") + + # convert image to the RGB format + image = cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB) + + # pre-process image + image = preprocess_input(image) + + # convert image to NCHW tf.tensor + image = tf.expand_dims(image, 0) + + # load modified resnet50 model with pre-trained ImageNet weights + model = fully_convolutional_resnet50(input_shape=(image.shape[-3:])) + + # Perform inference. + # Instead of a 1×1000 vector, we will get a + # 1×1000×n×m output ( i.e. a probability map + # of size n × m for each 1000 class, + # where n and m depend on the size of the image). + preds = model.predict(image) + preds = tf.transpose(preds, perm=[0, 3, 1, 2]) + preds = tf.nn.softmax(preds, axis=1) + print("Response map shape : ", preds.shape) + + # find the class with the maximum score in the n × m output map + pred = tf.math.reduce_max(preds, axis=1) + class_idx = tf.math.argmax(preds, axis=1) + print(class_idx) + + row_max = tf.math.reduce_max(pred, axis=1) + row_idx = tf.math.argmax(pred, axis=1) + + col_idx = tf.math.argmax(row_max, axis=1) + + predicted_class = tf.gather_nd( + class_idx, (0, tf.gather_nd(row_idx, (0, col_idx[0])), col_idx[0]), + ) + + # print top predicted class + print("Predicted Class : ", labels[predicted_class], predicted_class) + + # find the n × m score map for the predicted class + score_map = tf.expand_dims(preds[0, predicted_class, :, :], 0).numpy() + score_map = score_map[0] + + # resize score map to the original image size + score_map = cv2.resize( + score_map, (original_image.shape[1], original_image.shape[0]), + ) + + # binarize score map + _, score_map_for_contours = cv2.threshold( + score_map, 0.65, 1, type=cv2.THRESH_BINARY, + ) + score_map_for_contours = score_map_for_contours.astype(np.uint8).copy() + + # find the contour of the binary blob + contours, _ = cv2.findContours( + score_map_for_contours, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_SIMPLE, + ) + + # find bounding box around the object. + rect = cv2.boundingRect(contours[0]) + + # apply score map as a mask to original image + score_map = score_map - np.min(score_map[:]) + score_map = score_map / np.max(score_map[:]) + + score_map = cv2.cvtColor(score_map, cv2.COLOR_GRAY2BGR) + masked_image = (original_image * score_map).astype(np.uint8) + + # display bounding box + cv2.rectangle( + masked_image, rect[:2], (rect[0] + rect[2], rect[1] + rect[3]), (0, 0, 255), 2, + ) + + # display images + cv2.imshow("Original Image", original_image) + cv2.imshow("scaled_score_map", score_map) + cv2.imshow("activations_and_bbox", masked_image) + cv2.waitKey(0) diff --git a/TensorFlow-Fully-Convolutional-Image-Classification/README.md b/TensorFlow-Fully-Convolutional-Image-Classification/README.md new file mode 100644 index 000000000..4305db6ef --- /dev/null +++ b/TensorFlow-Fully-Convolutional-Image-Classification/README.md @@ -0,0 +1,12 @@ +This contains the code for **CNN Fully Convolutional Image Classification with TensorFlow**. For more information - visit +[**CNN Fully Convolutional Image Classification with TensorFlow**](https://www.learnopencv.com/cnn-fully-convolutional-image-classification-with-tensorflow) + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
diff --git a/TensorFlow-Fully-Convolutional-Image-Classification/camel.jpg b/TensorFlow-Fully-Convolutional-Image-Classification/camel.jpg new file mode 100644 index 000000000..f1eae1f94 Binary files /dev/null and b/TensorFlow-Fully-Convolutional-Image-Classification/camel.jpg differ diff --git a/TensorFlow-Fully-Convolutional-Image-Classification/imagenet_classes.txt b/TensorFlow-Fully-Convolutional-Image-Classification/imagenet_classes.txt new file mode 100644 index 000000000..a509c0074 --- /dev/null +++ b/TensorFlow-Fully-Convolutional-Image-Classification/imagenet_classes.txt @@ -0,0 +1,1000 @@ +tench, Tinca tinca +goldfish, Carassius auratus +great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias +tiger shark, Galeocerdo cuvieri +hammerhead, hammerhead shark +electric ray, crampfish, numbfish, torpedo +stingray +cock +hen +ostrich, Struthio camelus +brambling, Fringilla montifringilla +goldfinch, Carduelis carduelis +house finch, linnet, Carpodacus mexicanus +junco, snowbird +indigo bunting, indigo finch, indigo bird, Passerina cyanea +robin, American robin, Turdus migratorius +bulbul +jay +magpie +chickadee +water ouzel, dipper +kite +bald eagle, American eagle, Haliaeetus leucocephalus +vulture +great grey owl, great gray owl, Strix nebulosa +European fire salamander, Salamandra salamandra +common newt, Triturus vulgaris +eft +spotted salamander, Ambystoma maculatum +axolotl, mud puppy, Ambystoma mexicanum +bullfrog, Rana catesbeiana +tree frog, tree-frog +tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui +loggerhead, loggerhead turtle, Caretta caretta +leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea +mud turtle +terrapin +box turtle, box tortoise +banded gecko +common iguana, iguana, Iguana iguana +American chameleon, anole, Anolis carolinensis +whiptail, whiptail lizard +agama +frilled lizard, Chlamydosaurus kingi +alligator lizard +Gila monster, Heloderma suspectum +green lizard, Lacerta viridis +African chameleon, Chamaeleo chamaeleon +Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis +African crocodile, Nile crocodile, Crocodylus niloticus +American alligator, Alligator mississipiensis +triceratops +thunder snake, worm snake, Carphophis amoenus +ringneck snake, ring-necked snake, ring snake +hognose snake, puff adder, sand viper +green snake, grass snake +king snake, kingsnake +garter snake, grass snake +water snake +vine snake +night snake, Hypsiglena torquata +boa constrictor, Constrictor constrictor +rock python, rock snake, Python sebae +Indian cobra, Naja naja +green mamba +sea snake +horned viper, cerastes, sand viper, horned asp, Cerastes cornutus +diamondback, diamondback rattlesnake, Crotalus adamanteus +sidewinder, horned rattlesnake, Crotalus cerastes +trilobite +harvestman, daddy longlegs, Phalangium opilio +scorpion +black and gold garden spider, Argiope aurantia +barn spider, Araneus cavaticus +garden spider, Aranea diademata +black widow, Latrodectus mactans +tarantula +wolf spider, hunting spider +tick +centipede +black grouse +ptarmigan +ruffed grouse, partridge, Bonasa umbellus +prairie chicken, prairie grouse, prairie fowl +peacock +quail +partridge +African grey, African gray, Psittacus erithacus +macaw +sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita +lorikeet +coucal +bee eater +hornbill +hummingbird +jacamar +toucan +drake +red-breasted merganser, Mergus serrator +goose +black swan, Cygnus atratus +tusker +echidna, spiny anteater, anteater +platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus +wallaby, brush kangaroo +koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus +wombat +jellyfish +sea anemone, anemone +brain coral +flatworm, platyhelminth +nematode, nematode worm, roundworm +conch +snail +slug +sea slug, nudibranch +chiton, coat-of-mail shell, sea cradle, polyplacophore +chambered nautilus, pearly nautilus, nautilus +Dungeness crab, Cancer magister +rock crab, Cancer irroratus +fiddler crab +king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica +American lobster, Northern lobster, Maine lobster, Homarus americanus +spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish +crayfish, crawfish, crawdad, crawdaddy +hermit crab +isopod +white stork, Ciconia ciconia +black stork, Ciconia nigra +spoonbill +flamingo +little blue heron, Egretta caerulea +American egret, great white heron, Egretta albus +bittern +crane +limpkin, Aramus pictus +European gallinule, Porphyrio porphyrio +American coot, marsh hen, mud hen, water hen, Fulica americana +bustard +ruddy turnstone, Arenaria interpres +red-backed sandpiper, dunlin, Erolia alpina +redshank, Tringa totanus +dowitcher +oystercatcher, oyster catcher +pelican +king penguin, Aptenodytes patagonica +albatross, mollymawk +grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus +killer whale, killer, orca, grampus, sea wolf, Orcinus orca +dugong, Dugong dugon +sea lion +Chihuahua +Japanese spaniel +Maltese dog, Maltese terrier, Maltese +Pekinese, Pekingese, Peke +Shih-Tzu +Blenheim spaniel +papillon +toy terrier +Rhodesian ridgeback +Afghan hound, Afghan +basset, basset hound +beagle +bloodhound, sleuthhound +bluetick +black-and-tan coonhound +Walker hound, Walker foxhound +English foxhound +redbone +borzoi, Russian wolfhound +Irish wolfhound +Italian greyhound +whippet +Ibizan hound, Ibizan Podenco +Norwegian elkhound, elkhound +otterhound, otter hound +Saluki, gazelle hound +Scottish deerhound, deerhound +Weimaraner +Staffordshire bullterrier, Staffordshire bull terrier +American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier +Bedlington terrier +Border terrier +Kerry blue terrier +Irish terrier +Norfolk terrier +Norwich terrier +Yorkshire terrier +wire-haired fox terrier +Lakeland terrier +Sealyham terrier, Sealyham +Airedale, Airedale terrier +cairn, cairn terrier +Australian terrier +Dandie Dinmont, Dandie Dinmont terrier +Boston bull, Boston terrier +miniature schnauzer +giant schnauzer +standard schnauzer +Scotch terrier, Scottish terrier, Scottie +Tibetan terrier, chrysanthemum dog +silky terrier, Sydney silky +soft-coated wheaten terrier +West Highland white terrier +Lhasa, Lhasa apso +flat-coated retriever +curly-coated retriever +golden retriever +Labrador retriever +Chesapeake Bay retriever +German short-haired pointer +vizsla, Hungarian pointer +English setter +Irish setter, red setter +Gordon setter +Brittany spaniel +clumber, clumber spaniel +English springer, English springer spaniel +Welsh springer spaniel +cocker spaniel, English cocker spaniel, cocker +Sussex spaniel +Irish water spaniel +kuvasz +schipperke +groenendael +malinois +briard +kelpie +komondor +Old English sheepdog, bobtail +Shetland sheepdog, Shetland sheep dog, Shetland +collie +Border collie +Bouvier des Flandres, Bouviers des Flandres +Rottweiler +German shepherd, German shepherd dog, German police dog, alsatian +Doberman, Doberman pinscher +miniature pinscher +Greater Swiss Mountain dog +Bernese mountain dog +Appenzeller +EntleBucher +boxer +bull mastiff +Tibetan mastiff +French bulldog +Great Dane +Saint Bernard, St Bernard +Eskimo dog, husky +malamute, malemute, Alaskan malamute +Siberian husky +dalmatian, coach dog, carriage dog +affenpinscher, monkey pinscher, monkey dog +basenji +pug, pug-dog +Leonberg +Newfoundland, Newfoundland dog +Great Pyrenees +Samoyed, Samoyede +Pomeranian +chow, chow chow +keeshond +Brabancon griffon +Pembroke, Pembroke Welsh corgi +Cardigan, Cardigan Welsh corgi +toy poodle +miniature poodle +standard poodle +Mexican hairless +timber wolf, grey wolf, gray wolf, Canis lupus +white wolf, Arctic wolf, Canis lupus tundrarum +red wolf, maned wolf, Canis rufus, Canis niger +coyote, prairie wolf, brush wolf, Canis latrans +dingo, warrigal, warragal, Canis dingo +dhole, Cuon alpinus +African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus +hyena, hyaena +red fox, Vulpes vulpes +kit fox, Vulpes macrotis +Arctic fox, white fox, Alopex lagopus +grey fox, gray fox, Urocyon cinereoargenteus +tabby, tabby cat +tiger cat +Persian cat +Siamese cat, Siamese +Egyptian cat +cougar, puma, catamount, mountain lion, painter, panther, Felis concolor +lynx, catamount +leopard, Panthera pardus +snow leopard, ounce, Panthera uncia +jaguar, panther, Panthera onca, Felis onca +lion, king of beasts, Panthera leo +tiger, Panthera tigris +cheetah, chetah, Acinonyx jubatus +brown bear, bruin, Ursus arctos +American black bear, black bear, Ursus americanus, Euarctos americanus +ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus +sloth bear, Melursus ursinus, Ursus ursinus +mongoose +meerkat, mierkat +tiger beetle +ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle +ground beetle, carabid beetle +long-horned beetle, longicorn, longicorn beetle +leaf beetle, chrysomelid +dung beetle +rhinoceros beetle +weevil +fly +bee +ant, emmet, pismire +grasshopper, hopper +cricket +walking stick, walkingstick, stick insect +cockroach, roach +mantis, mantid +cicada, cicala +leafhopper +lacewing, lacewing fly +dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk +damselfly +admiral +ringlet, ringlet butterfly +monarch, monarch butterfly, milkweed butterfly, Danaus plexippus +cabbage butterfly +sulphur butterfly, sulfur butterfly +lycaenid, lycaenid butterfly +starfish, sea star +sea urchin +sea cucumber, holothurian +wood rabbit, cottontail, cottontail rabbit +hare +Angora, Angora rabbit +hamster +porcupine, hedgehog +fox squirrel, eastern fox squirrel, Sciurus niger +marmot +beaver +guinea pig, Cavia cobaya +sorrel +zebra +hog, pig, grunter, squealer, Sus scrofa +wild boar, boar, Sus scrofa +warthog +hippopotamus, hippo, river horse, Hippopotamus amphibius +ox +water buffalo, water ox, Asiatic buffalo, Bubalus bubalis +bison +ram, tup +bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis +ibex, Capra ibex +hartebeest +impala, Aepyceros melampus +gazelle +Arabian camel, dromedary, Camelus dromedarius +llama +weasel +mink +polecat, fitch, foulmart, foumart, Mustela putorius +black-footed ferret, ferret, Mustela nigripes +otter +skunk, polecat, wood pussy +badger +armadillo +three-toed sloth, ai, Bradypus tridactylus +orangutan, orang, orangutang, Pongo pygmaeus +gorilla, Gorilla gorilla +chimpanzee, chimp, Pan troglodytes +gibbon, Hylobates lar +siamang, Hylobates syndactylus, Symphalangus syndactylus +guenon, guenon monkey +patas, hussar monkey, Erythrocebus patas +baboon +macaque +langur +colobus, colobus monkey +proboscis monkey, Nasalis larvatus +marmoset +capuchin, ringtail, Cebus capucinus +howler monkey, howler +titi, titi monkey +spider monkey, Ateles geoffroyi +squirrel monkey, Saimiri sciureus +Madagascar cat, ring-tailed lemur, Lemur catta +indri, indris, Indri indri, Indri brevicaudatus +Indian elephant, Elephas maximus +African elephant, Loxodonta africana +lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens +giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca +barracouta, snoek +eel +coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch +rock beauty, Holocanthus tricolor +anemone fish +sturgeon +gar, garfish, garpike, billfish, Lepisosteus osseus +lionfish +puffer, pufferfish, blowfish, globefish +abacus +abaya +academic gown, academic robe, judge's robe +accordion, piano accordion, squeeze box +acoustic guitar +aircraft carrier, carrier, flattop, attack aircraft carrier +airliner +airship, dirigible +altar +ambulance +amphibian, amphibious vehicle +analog clock +apiary, bee house +apron +ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin +assault rifle, assault gun +backpack, back pack, knapsack, packsack, rucksack, haversack +bakery, bakeshop, bakehouse +balance beam, beam +balloon +ballpoint, ballpoint pen, ballpen, Biro +Band Aid +banjo +bannister, banister, balustrade, balusters, handrail +barbell +barber chair +barbershop +barn +barometer +barrel, cask +barrow, garden cart, lawn cart, wheelbarrow +baseball +basketball +bassinet +bassoon +bathing cap, swimming cap +bath towel +bathtub, bathing tub, bath, tub +beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon +beacon, lighthouse, beacon light, pharos +beaker +bearskin, busby, shako +beer bottle +beer glass +bell cote, bell cot +bib +bicycle-built-for-two, tandem bicycle, tandem +bikini, two-piece +binder, ring-binder +binoculars, field glasses, opera glasses +birdhouse +boathouse +bobsled, bobsleigh, bob +bolo tie, bolo, bola tie, bola +bonnet, poke bonnet +bookcase +bookshop, bookstore, bookstall +bottlecap +bow +bow tie, bow-tie, bowtie +brass, memorial tablet, plaque +brassiere, bra, bandeau +breakwater, groin, groyne, mole, bulwark, seawall, jetty +breastplate, aegis, egis +broom +bucket, pail +buckle +bulletproof vest +bullet train, bullet +butcher shop, meat market +cab, hack, taxi, taxicab +caldron, cauldron +candle, taper, wax light +cannon +canoe +can opener, tin opener +cardigan +car mirror +carousel, carrousel, merry-go-round, roundabout, whirligig +carpenter's kit, tool kit +carton +car wheel +cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM +cassette +cassette player +castle +catamaran +CD player +cello, violoncello +cellular telephone, cellular phone, cellphone, cell, mobile phone +chain +chainlink fence +chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour +chain saw, chainsaw +chest +chiffonier, commode +chime, bell, gong +china cabinet, china closet +Christmas stocking +church, church building +cinema, movie theater, movie theatre, movie house, picture palace +cleaver, meat cleaver, chopper +cliff dwelling +cloak +clog, geta, patten, sabot +cocktail shaker +coffee mug +coffeepot +coil, spiral, volute, whorl, helix +combination lock +computer keyboard, keypad +confectionery, confectionary, candy store +container ship, containership, container vessel +convertible +corkscrew, bottle screw +cornet, horn, trumpet, trump +cowboy boot +cowboy hat, ten-gallon hat +cradle +crane +crash helmet +crate +crib, cot +Crock Pot +croquet ball +crutch +cuirass +dam, dike, dyke +desk +desktop computer +dial telephone, dial phone +diaper, nappy, napkin +digital clock +digital watch +dining table, board +dishrag, dishcloth +dishwasher, dish washer, dishwashing machine +disk brake, disc brake +dock, dockage, docking facility +dogsled, dog sled, dog sleigh +dome +doormat, welcome mat +drilling platform, offshore rig +drum, membranophone, tympan +drumstick +dumbbell +Dutch oven +electric fan, blower +electric guitar +electric locomotive +entertainment center +envelope +espresso maker +face powder +feather boa, boa +file, file cabinet, filing cabinet +fireboat +fire engine, fire truck +fire screen, fireguard +flagpole, flagstaff +flute, transverse flute +folding chair +football helmet +forklift +fountain +fountain pen +four-poster +freight car +French horn, horn +frying pan, frypan, skillet +fur coat +garbage truck, dustcart +gasmask, respirator, gas helmet +gas pump, gasoline pump, petrol pump, island dispenser +goblet +go-kart +golf ball +golfcart, golf cart +gondola +gong, tam-tam +gown +grand piano, grand +greenhouse, nursery, glasshouse +grille, radiator grille +grocery store, grocery, food market, market +guillotine +hair slide +hair spray +half track +hammer +hamper +hand blower, blow dryer, blow drier, hair dryer, hair drier +hand-held computer, hand-held microcomputer +handkerchief, hankie, hanky, hankey +hard disc, hard disk, fixed disk +harmonica, mouth organ, harp, mouth harp +harp +harvester, reaper +hatchet +holster +home theater, home theatre +honeycomb +hook, claw +hoopskirt, crinoline +horizontal bar, high bar +horse cart, horse-cart +hourglass +iPod +iron, smoothing iron +jack-o'-lantern +jean, blue jean, denim +jeep, landrover +jersey, T-shirt, tee shirt +jigsaw puzzle +jinrikisha, ricksha, rickshaw +joystick +kimono +knee pad +knot +lab coat, laboratory coat +ladle +lampshade, lamp shade +laptop, laptop computer +lawn mower, mower +lens cap, lens cover +letter opener, paper knife, paperknife +library +lifeboat +lighter, light, igniter, ignitor +limousine, limo +liner, ocean liner +lipstick, lip rouge +Loafer +lotion +loudspeaker, speaker, speaker unit, loudspeaker system, speaker system +loupe, jeweler's loupe +lumbermill, sawmill +magnetic compass +mailbag, postbag +mailbox, letter box +maillot +maillot, tank suit +manhole cover +maraca +marimba, xylophone +mask +matchstick +maypole +maze, labyrinth +measuring cup +medicine chest, medicine cabinet +megalith, megalithic structure +microphone, mike +microwave, microwave oven +military uniform +milk can +minibus +miniskirt, mini +minivan +missile +mitten +mixing bowl +mobile home, manufactured home +Model T +modem +monastery +monitor +moped +mortar +mortarboard +mosque +mosquito net +motor scooter, scooter +mountain bike, all-terrain bike, off-roader +mountain tent +mouse, computer mouse +mousetrap +moving van +muzzle +nail +neck brace +necklace +nipple +notebook, notebook computer +obelisk +oboe, hautboy, hautbois +ocarina, sweet potato +odometer, hodometer, mileometer, milometer +oil filter +organ, pipe organ +oscilloscope, scope, cathode-ray oscilloscope, CRO +overskirt +oxcart +oxygen mask +packet +paddle, boat paddle +paddlewheel, paddle wheel +padlock +paintbrush +pajama, pyjama, pj's, jammies +palace +panpipe, pandean pipe, syrinx +paper towel +parachute, chute +parallel bars, bars +park bench +parking meter +passenger car, coach, carriage +patio, terrace +pay-phone, pay-station +pedestal, plinth, footstall +pencil box, pencil case +pencil sharpener +perfume, essence +Petri dish +photocopier +pick, plectrum, plectron +pickelhaube +picket fence, paling +pickup, pickup truck +pier +piggy bank, penny bank +pill bottle +pillow +ping-pong ball +pinwheel +pirate, pirate ship +pitcher, ewer +plane, carpenter's plane, woodworking plane +planetarium +plastic bag +plate rack +plow, plough +plunger, plumber's helper +Polaroid camera, Polaroid Land camera +pole +police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria +poncho +pool table, billiard table, snooker table +pop bottle, soda bottle +pot, flowerpot +potter's wheel +power drill +prayer rug, prayer mat +printer +prison, prison house +projectile, missile +projector +puck, hockey puck +punching bag, punch bag, punching ball, punchball +purse +quill, quill pen +quilt, comforter, comfort, puff +racer, race car, racing car +racket, racquet +radiator +radio, wireless +radio telescope, radio reflector +rain barrel +recreational vehicle, RV, R.V. +reel +reflex camera +refrigerator, icebox +remote control, remote +restaurant, eating house, eating place, eatery +revolver, six-gun, six-shooter +rifle +rocking chair, rocker +rotisserie +rubber eraser, rubber, pencil eraser +rugby ball +rule, ruler +running shoe +safe +safety pin +saltshaker, salt shaker +sandal +sarong +sax, saxophone +scabbard +scale, weighing machine +school bus +schooner +scoreboard +screen, CRT screen +screw +screwdriver +seat belt, seatbelt +sewing machine +shield, buckler +shoe shop, shoe-shop, shoe store +shoji +shopping basket +shopping cart +shovel +shower cap +shower curtain +ski +ski mask +sleeping bag +slide rule, slipstick +sliding door +slot, one-armed bandit +snorkel +snowmobile +snowplow, snowplough +soap dispenser +soccer ball +sock +solar dish, solar collector, solar furnace +sombrero +soup bowl +space bar +space heater +space shuttle +spatula +speedboat +spider web, spider's web +spindle +sports car, sport car +spotlight, spot +stage +steam locomotive +steel arch bridge +steel drum +stethoscope +stole +stone wall +stopwatch, stop watch +stove +strainer +streetcar, tram, tramcar, trolley, trolley car +stretcher +studio couch, day bed +stupa, tope +submarine, pigboat, sub, U-boat +suit, suit of clothes +sundial +sunglass +sunglasses, dark glasses, shades +sunscreen, sunblock, sun blocker +suspension bridge +swab, swob, mop +sweatshirt +swimming trunks, bathing trunks +swing +switch, electric switch, electrical switch +syringe +table lamp +tank, army tank, armored combat vehicle, armoured combat vehicle +tape player +teapot +teddy, teddy bear +television, television system +tennis ball +thatch, thatched roof +theater curtain, theatre curtain +thimble +thresher, thrasher, threshing machine +throne +tile roof +toaster +tobacco shop, tobacconist shop, tobacconist +toilet seat +torch +totem pole +tow truck, tow car, wrecker +toyshop +tractor +trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi +tray +trench coat +tricycle, trike, velocipede +trimaran +tripod +triumphal arch +trolleybus, trolley coach, trackless trolley +trombone +tub, vat +turnstile +typewriter keyboard +umbrella +unicycle, monocycle +upright, upright piano +vacuum, vacuum cleaner +vase +vault +velvet +vending machine +vestment +viaduct +violin, fiddle +volleyball +waffle iron +wall clock +wallet, billfold, notecase, pocketbook +wardrobe, closet, press +warplane, military plane +washbasin, handbasin, washbowl, lavabo, wash-hand basin +washer, automatic washer, washing machine +water bottle +water jug +water tower +whiskey jug +whistle +wig +window screen +window shade +Windsor tie +wine bottle +wing +wok +wooden spoon +wool, woolen, woollen +worm fence, snake fence, snake-rail fence, Virginia fence +wreck +yawl +yurt +web site, website, internet site, site +comic book +crossword puzzle, crossword +street sign +traffic light, traffic signal, stoplight +book jacket, dust cover, dust jacket, dust wrapper +menu +plate +guacamole +consomme +hot pot, hotpot +trifle +ice cream, icecream +ice lolly, lolly, lollipop, popsicle +French loaf +bagel, beigel +pretzel +cheeseburger +hotdog, hot dog, red hot +mashed potato +head cabbage +broccoli +cauliflower +zucchini, courgette +spaghetti squash +acorn squash +butternut squash +cucumber, cuke +artichoke, globe artichoke +bell pepper +cardoon +mushroom +Granny Smith +strawberry +orange +lemon +fig +pineapple, ananas +banana +jackfruit, jak, jack +custard apple +pomegranate +hay +carbonara +chocolate sauce, chocolate syrup +dough +meat loaf, meatloaf +pizza, pizza pie +potpie +burrito +red wine +espresso +cup +eggnog +alp +bubble +cliff, drop, drop-off +coral reef +geyser +lakeside, lakeshore +promontory, headland, head, foreland +sandbar, sand bar +seashore, coast, seacoast, sea-coast +valley, vale +volcano +ballplayer, baseball player +groom, bridegroom +scuba diver +rapeseed +daisy +yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum +corn +acorn +hip, rose hip, rosehip +buckeye, horse chestnut, conker +coral fungus +agaric +gyromitra +stinkhorn, carrion fungus +earthstar +hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa +bolete +ear, spike, capitulum +toilet tissue, toilet paper, bathroom tissue diff --git a/TensorFlow-Fully-Convolutional-Image-Classification/requirements.txt b/TensorFlow-Fully-Convolutional-Image-Classification/requirements.txt new file mode 100644 index 000000000..ab1f58a1c --- /dev/null +++ b/TensorFlow-Fully-Convolutional-Image-Classification/requirements.txt @@ -0,0 +1,2 @@ +opencv-python>=3.4.1.15 +tensorflow==2.1.0 diff --git a/TensorFlow-Fully-Convolutional-Image-Classification/utils.py b/TensorFlow-Fully-Convolutional-Image-Classification/utils.py new file mode 100644 index 000000000..ecd4b4f8f --- /dev/null +++ b/TensorFlow-Fully-Convolutional-Image-Classification/utils.py @@ -0,0 +1,75 @@ +from tensorflow.keras.layers import ( + Activation, + Add, + BatchNormalization, + Conv2D, +) + +# https://github.com/tensorflow/tensorflow/blob/2b96f3662bd776e277f86997659e61046b56c315/tensorflow/python/keras/applications/resnet.py#L32 +BASE_WEIGHTS_PATH = ( + "https://storage.googleapis.com/tensorflow/keras-applications/resnet/" +) +WEIGHTS_HASHES = { + "resnet50": "4d473c1dd8becc155b73f8504c6f6626", +} + + +# https://github.com/tensorflow/tensorflow/blob/2b96f3662bd776e277f86997659e61046b56c315/tensorflow/python/keras/applications/resnet.py#L262 +def stack1(x, filters, blocks, stride1=2, name=None): + """ + A set of stacked residual blocks. + Arguments: + x: input tensor. + filters: integer, filters of the bottleneck layer in a block. + blocks: integer, blocks in the stacked blocks. + stride1: default 2, stride of the first layer in the first block. + name: string, stack label. + Returns: + Output tensor for the stacked blocks. + """ + x = block1(x, filters, stride=stride1, name=name + "_block1") + for i in range(2, blocks + 1): + x = block1(x, filters, conv_shortcut=False, name=name + "_block" + str(i)) + return x + + +# https://github.com/tensorflow/tensorflow/blob/2b96f3662bd776e277f86997659e61046b56c315/tensorflow/python/keras/applications/resnet.py#L217 +def block1(x, filters, kernel_size=3, stride=1, conv_shortcut=True, name=None): + """ + A residual block. + Arguments: + x: input tensor. + filters: integer, filters of the bottleneck layer. + kernel_size: default 3, kernel size of the bottleneck layer. + stride: default 1, stride of the first layer. + conv_shortcut: default True, use convolution shortcut if True, + otherwise identity shortcut. + name: string, block label. + Returns: + Output tensor for the residual block. + """ + # channels_last format + bn_axis = 3 + + if conv_shortcut: + shortcut = Conv2D(4 * filters, 1, strides=stride, name=name + "_0_conv")(x) + shortcut = BatchNormalization( + axis=bn_axis, epsilon=1.001e-5, name=name + "_0_bn", + )(shortcut) + else: + shortcut = x + + x = Conv2D(filters, 1, strides=stride, name=name + "_1_conv")(x) + x = BatchNormalization(axis=bn_axis, epsilon=1.001e-5, name=name + "_1_bn")(x) + x = Activation("relu", name=name + "_1_relu")(x) + + x = Conv2D(filters, kernel_size, padding="SAME", name=name + "_2_conv")(x) + x = BatchNormalization(axis=bn_axis, epsilon=1.001e-5, name=name + "_2_bn")(x) + x = Activation("relu", name=name + "_2_relu")(x) + + x = Conv2D(4 * filters, 1, name=name + "_3_conv")(x) + x = BatchNormalization(axis=bn_axis, epsilon=1.001e-5, name=name + "_3_bn")(x) + + x = Add(name=name + "_add")([shortcut, x]) + x = Activation("relu", name=name + "_out")(x) + return x diff --git a/TensorFlow-Receptive-Field-With-Backprop/FullyConvolutionalResnet50.py b/TensorFlow-Receptive-Field-With-Backprop/FullyConvolutionalResnet50.py new file mode 100644 index 000000000..72d36f78a --- /dev/null +++ b/TensorFlow-Receptive-Field-With-Backprop/FullyConvolutionalResnet50.py @@ -0,0 +1,96 @@ +import cv2 +import numpy as np +import tensorflow as tf +from tensorflow.keras import Input +from tensorflow.keras.applications import ResNet50 +from tensorflow.keras.applications.resnet import preprocess_input +from tensorflow.keras.layers import ( + Activation, + AveragePooling2D, + BatchNormalization, + Conv2D, + MaxPooling2D, + ZeroPadding2D, +) +from tensorflow.python.keras.engine import training +from tensorflow.python.keras.utils import data_utils + +from utils import ( + BASE_WEIGHTS_PATH, + WEIGHTS_HASHES, + stack1, +) + + +# setting FC weights to the final convolutional layer +def set_conv_weights(model, feature_extractor): + # get pre-trained ResNet50 FC weights + dense_layer_weights = feature_extractor.layers[-1].get_weights() + weights_list = [ + tf.reshape( + dense_layer_weights[0], (1, 1, *dense_layer_weights[0].shape), + ).numpy(), + dense_layer_weights[1], + ] + model.get_layer(name="last_conv").set_weights(weights_list) + + +def fully_convolutional_resnet50( + input_shape, num_classes=1000, pretrained_resnet=True, use_bias=True, +): + # init input layer + img_input = Input(shape=input_shape) + + # define basic model pipeline + x = ZeroPadding2D(padding=((3, 3), (3, 3)), name="conv1_pad")(img_input) + x = Conv2D(64, 7, strides=2, use_bias=use_bias, name="conv1_conv")(x) + x = BatchNormalization(axis=3, epsilon=1.001e-5, name="conv1_bn")(x) + x = Activation("relu", name="conv1_relu")(x) + + x = ZeroPadding2D(padding=((1, 1), (1, 1)), name="pool1_pad")(x) + x = MaxPooling2D(3, strides=2, name="pool1_pool")(x) + + # the sequence of stacked residual blocks + x = stack1(x, 64, 3, stride1=1, name="conv2") + x = stack1(x, 128, 4, name="conv3") + x = stack1(x, 256, 6, name="conv4") + x = stack1(x, 512, 3, name="conv5") + + # add avg pooling layer after feature extraction layers + x = AveragePooling2D(pool_size=7)(x) + + # add final convolutional layer + conv_layer_final = Conv2D( + filters=num_classes, kernel_size=1, use_bias=use_bias, name="last_conv", + )(x) + + # configure fully convolutional ResNet50 model + model = training.Model(img_input, x) + + # load model weights + if pretrained_resnet: + model_name = "resnet50" + # configure full file name + file_name = model_name + "_weights_tf_dim_ordering_tf_kernels_notop.h5" + # get the file hash from TF WEIGHTS_HASHES + file_hash = WEIGHTS_HASHES[model_name][1] + weights_path = data_utils.get_file( + file_name, + BASE_WEIGHTS_PATH + file_name, + cache_subdir="models", + file_hash=file_hash, + ) + + model.load_weights(weights_path) + + # form final model + model = training.Model(inputs=model.input, outputs=[conv_layer_final]) + + if pretrained_resnet: + # get model with the dense layer for further FC weights extraction + resnet50_extractor = ResNet50( + include_top=True, weights="imagenet", classes=num_classes, + ) + # set ResNet50 FC-layer weights to final convolutional layer + set_conv_weights(model=model, feature_extractor=resnet50_extractor) + return model diff --git a/TensorFlow-Receptive-Field-With-Backprop/README.md b/TensorFlow-Receptive-Field-With-Backprop/README.md new file mode 100644 index 000000000..3baf133e8 --- /dev/null +++ b/TensorFlow-Receptive-Field-With-Backprop/README.md @@ -0,0 +1,12 @@ +This contains the code for **CNN Receptive Field Computation Using Backprop**. For more information - visit +[**CNN Receptive Field Computation Using Backprop with Tensorflow**](https://www.learnopencv.com/cnn-receptive-field-computation-using-backprop-with-tensorflow/) + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
diff --git a/TensorFlow-Receptive-Field-With-Backprop/camel.jpg b/TensorFlow-Receptive-Field-With-Backprop/camel.jpg new file mode 100644 index 000000000..f1eae1f94 Binary files /dev/null and b/TensorFlow-Receptive-Field-With-Backprop/camel.jpg differ diff --git a/TensorFlow-Receptive-Field-With-Backprop/imagenet_classes.txt b/TensorFlow-Receptive-Field-With-Backprop/imagenet_classes.txt new file mode 100644 index 000000000..a509c0074 --- /dev/null +++ b/TensorFlow-Receptive-Field-With-Backprop/imagenet_classes.txt @@ -0,0 +1,1000 @@ +tench, Tinca tinca +goldfish, Carassius auratus +great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias +tiger shark, Galeocerdo cuvieri +hammerhead, hammerhead shark +electric ray, crampfish, numbfish, torpedo +stingray +cock +hen +ostrich, Struthio camelus +brambling, Fringilla montifringilla +goldfinch, Carduelis carduelis +house finch, linnet, Carpodacus mexicanus +junco, snowbird +indigo bunting, indigo finch, indigo bird, Passerina cyanea +robin, American robin, Turdus migratorius +bulbul +jay +magpie +chickadee +water ouzel, dipper +kite +bald eagle, American eagle, Haliaeetus leucocephalus +vulture +great grey owl, great gray owl, Strix nebulosa +European fire salamander, Salamandra salamandra +common newt, Triturus vulgaris +eft +spotted salamander, Ambystoma maculatum +axolotl, mud puppy, Ambystoma mexicanum +bullfrog, Rana catesbeiana +tree frog, tree-frog +tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui +loggerhead, loggerhead turtle, Caretta caretta +leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea +mud turtle +terrapin +box turtle, box tortoise +banded gecko +common iguana, iguana, Iguana iguana +American chameleon, anole, Anolis carolinensis +whiptail, whiptail lizard +agama +frilled lizard, Chlamydosaurus kingi +alligator lizard +Gila monster, Heloderma suspectum +green lizard, Lacerta viridis +African chameleon, Chamaeleo chamaeleon +Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis +African crocodile, Nile crocodile, Crocodylus niloticus +American alligator, Alligator mississipiensis +triceratops +thunder snake, worm snake, Carphophis amoenus +ringneck snake, ring-necked snake, ring snake +hognose snake, puff adder, sand viper +green snake, grass snake +king snake, kingsnake +garter snake, grass snake +water snake +vine snake +night snake, Hypsiglena torquata +boa constrictor, Constrictor constrictor +rock python, rock snake, Python sebae +Indian cobra, Naja naja +green mamba +sea snake +horned viper, cerastes, sand viper, horned asp, Cerastes cornutus +diamondback, diamondback rattlesnake, Crotalus adamanteus +sidewinder, horned rattlesnake, Crotalus cerastes +trilobite +harvestman, daddy longlegs, Phalangium opilio +scorpion +black and gold garden spider, Argiope aurantia +barn spider, Araneus cavaticus +garden spider, Aranea diademata +black widow, Latrodectus mactans +tarantula +wolf spider, hunting spider +tick +centipede +black grouse +ptarmigan +ruffed grouse, partridge, Bonasa umbellus +prairie chicken, prairie grouse, prairie fowl +peacock +quail +partridge +African grey, African gray, Psittacus erithacus +macaw +sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita +lorikeet +coucal +bee eater +hornbill +hummingbird +jacamar +toucan +drake +red-breasted merganser, Mergus serrator +goose +black swan, Cygnus atratus +tusker +echidna, spiny anteater, anteater +platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus +wallaby, brush kangaroo +koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus +wombat +jellyfish +sea anemone, anemone +brain coral +flatworm, platyhelminth +nematode, nematode worm, roundworm +conch +snail +slug +sea slug, nudibranch +chiton, coat-of-mail shell, sea cradle, polyplacophore +chambered nautilus, pearly nautilus, nautilus +Dungeness crab, Cancer magister +rock crab, Cancer irroratus +fiddler crab +king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica +American lobster, Northern lobster, Maine lobster, Homarus americanus +spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish +crayfish, crawfish, crawdad, crawdaddy +hermit crab +isopod +white stork, Ciconia ciconia +black stork, Ciconia nigra +spoonbill +flamingo +little blue heron, Egretta caerulea +American egret, great white heron, Egretta albus +bittern +crane +limpkin, Aramus pictus +European gallinule, Porphyrio porphyrio +American coot, marsh hen, mud hen, water hen, Fulica americana +bustard +ruddy turnstone, Arenaria interpres +red-backed sandpiper, dunlin, Erolia alpina +redshank, Tringa totanus +dowitcher +oystercatcher, oyster catcher +pelican +king penguin, Aptenodytes patagonica +albatross, mollymawk +grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus +killer whale, killer, orca, grampus, sea wolf, Orcinus orca +dugong, Dugong dugon +sea lion +Chihuahua +Japanese spaniel +Maltese dog, Maltese terrier, Maltese +Pekinese, Pekingese, Peke +Shih-Tzu +Blenheim spaniel +papillon +toy terrier +Rhodesian ridgeback +Afghan hound, Afghan +basset, basset hound +beagle +bloodhound, sleuthhound +bluetick +black-and-tan coonhound +Walker hound, Walker foxhound +English foxhound +redbone +borzoi, Russian wolfhound +Irish wolfhound +Italian greyhound +whippet +Ibizan hound, Ibizan Podenco +Norwegian elkhound, elkhound +otterhound, otter hound +Saluki, gazelle hound +Scottish deerhound, deerhound +Weimaraner +Staffordshire bullterrier, Staffordshire bull terrier +American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier +Bedlington terrier +Border terrier +Kerry blue terrier +Irish terrier +Norfolk terrier +Norwich terrier +Yorkshire terrier +wire-haired fox terrier +Lakeland terrier +Sealyham terrier, Sealyham +Airedale, Airedale terrier +cairn, cairn terrier +Australian terrier +Dandie Dinmont, Dandie Dinmont terrier +Boston bull, Boston terrier +miniature schnauzer +giant schnauzer +standard schnauzer +Scotch terrier, Scottish terrier, Scottie +Tibetan terrier, chrysanthemum dog +silky terrier, Sydney silky +soft-coated wheaten terrier +West Highland white terrier +Lhasa, Lhasa apso +flat-coated retriever +curly-coated retriever +golden retriever +Labrador retriever +Chesapeake Bay retriever +German short-haired pointer +vizsla, Hungarian pointer +English setter +Irish setter, red setter +Gordon setter +Brittany spaniel +clumber, clumber spaniel +English springer, English springer spaniel +Welsh springer spaniel +cocker spaniel, English cocker spaniel, cocker +Sussex spaniel +Irish water spaniel +kuvasz +schipperke +groenendael +malinois +briard +kelpie +komondor +Old English sheepdog, bobtail +Shetland sheepdog, Shetland sheep dog, Shetland +collie +Border collie +Bouvier des Flandres, Bouviers des Flandres +Rottweiler +German shepherd, German shepherd dog, German police dog, alsatian +Doberman, Doberman pinscher +miniature pinscher +Greater Swiss Mountain dog +Bernese mountain dog +Appenzeller +EntleBucher +boxer +bull mastiff +Tibetan mastiff +French bulldog +Great Dane +Saint Bernard, St Bernard +Eskimo dog, husky +malamute, malemute, Alaskan malamute +Siberian husky +dalmatian, coach dog, carriage dog +affenpinscher, monkey pinscher, monkey dog +basenji +pug, pug-dog +Leonberg +Newfoundland, Newfoundland dog +Great Pyrenees +Samoyed, Samoyede +Pomeranian +chow, chow chow +keeshond +Brabancon griffon +Pembroke, Pembroke Welsh corgi +Cardigan, Cardigan Welsh corgi +toy poodle +miniature poodle +standard poodle +Mexican hairless +timber wolf, grey wolf, gray wolf, Canis lupus +white wolf, Arctic wolf, Canis lupus tundrarum +red wolf, maned wolf, Canis rufus, Canis niger +coyote, prairie wolf, brush wolf, Canis latrans +dingo, warrigal, warragal, Canis dingo +dhole, Cuon alpinus +African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus +hyena, hyaena +red fox, Vulpes vulpes +kit fox, Vulpes macrotis +Arctic fox, white fox, Alopex lagopus +grey fox, gray fox, Urocyon cinereoargenteus +tabby, tabby cat +tiger cat +Persian cat +Siamese cat, Siamese +Egyptian cat +cougar, puma, catamount, mountain lion, painter, panther, Felis concolor +lynx, catamount +leopard, Panthera pardus +snow leopard, ounce, Panthera uncia +jaguar, panther, Panthera onca, Felis onca +lion, king of beasts, Panthera leo +tiger, Panthera tigris +cheetah, chetah, Acinonyx jubatus +brown bear, bruin, Ursus arctos +American black bear, black bear, Ursus americanus, Euarctos americanus +ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus +sloth bear, Melursus ursinus, Ursus ursinus +mongoose +meerkat, mierkat +tiger beetle +ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle +ground beetle, carabid beetle +long-horned beetle, longicorn, longicorn beetle +leaf beetle, chrysomelid +dung beetle +rhinoceros beetle +weevil +fly +bee +ant, emmet, pismire +grasshopper, hopper +cricket +walking stick, walkingstick, stick insect +cockroach, roach +mantis, mantid +cicada, cicala +leafhopper +lacewing, lacewing fly +dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk +damselfly +admiral +ringlet, ringlet butterfly +monarch, monarch butterfly, milkweed butterfly, Danaus plexippus +cabbage butterfly +sulphur butterfly, sulfur butterfly +lycaenid, lycaenid butterfly +starfish, sea star +sea urchin +sea cucumber, holothurian +wood rabbit, cottontail, cottontail rabbit +hare +Angora, Angora rabbit +hamster +porcupine, hedgehog +fox squirrel, eastern fox squirrel, Sciurus niger +marmot +beaver +guinea pig, Cavia cobaya +sorrel +zebra +hog, pig, grunter, squealer, Sus scrofa +wild boar, boar, Sus scrofa +warthog +hippopotamus, hippo, river horse, Hippopotamus amphibius +ox +water buffalo, water ox, Asiatic buffalo, Bubalus bubalis +bison +ram, tup +bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis +ibex, Capra ibex +hartebeest +impala, Aepyceros melampus +gazelle +Arabian camel, dromedary, Camelus dromedarius +llama +weasel +mink +polecat, fitch, foulmart, foumart, Mustela putorius +black-footed ferret, ferret, Mustela nigripes +otter +skunk, polecat, wood pussy +badger +armadillo +three-toed sloth, ai, Bradypus tridactylus +orangutan, orang, orangutang, Pongo pygmaeus +gorilla, Gorilla gorilla +chimpanzee, chimp, Pan troglodytes +gibbon, Hylobates lar +siamang, Hylobates syndactylus, Symphalangus syndactylus +guenon, guenon monkey +patas, hussar monkey, Erythrocebus patas +baboon +macaque +langur +colobus, colobus monkey +proboscis monkey, Nasalis larvatus +marmoset +capuchin, ringtail, Cebus capucinus +howler monkey, howler +titi, titi monkey +spider monkey, Ateles geoffroyi +squirrel monkey, Saimiri sciureus +Madagascar cat, ring-tailed lemur, Lemur catta +indri, indris, Indri indri, Indri brevicaudatus +Indian elephant, Elephas maximus +African elephant, Loxodonta africana +lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens +giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca +barracouta, snoek +eel +coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch +rock beauty, Holocanthus tricolor +anemone fish +sturgeon +gar, garfish, garpike, billfish, Lepisosteus osseus +lionfish +puffer, pufferfish, blowfish, globefish +abacus +abaya +academic gown, academic robe, judge's robe +accordion, piano accordion, squeeze box +acoustic guitar +aircraft carrier, carrier, flattop, attack aircraft carrier +airliner +airship, dirigible +altar +ambulance +amphibian, amphibious vehicle +analog clock +apiary, bee house +apron +ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin +assault rifle, assault gun +backpack, back pack, knapsack, packsack, rucksack, haversack +bakery, bakeshop, bakehouse +balance beam, beam +balloon +ballpoint, ballpoint pen, ballpen, Biro +Band Aid +banjo +bannister, banister, balustrade, balusters, handrail +barbell +barber chair +barbershop +barn +barometer +barrel, cask +barrow, garden cart, lawn cart, wheelbarrow +baseball +basketball +bassinet +bassoon +bathing cap, swimming cap +bath towel +bathtub, bathing tub, bath, tub +beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon +beacon, lighthouse, beacon light, pharos +beaker +bearskin, busby, shako +beer bottle +beer glass +bell cote, bell cot +bib +bicycle-built-for-two, tandem bicycle, tandem +bikini, two-piece +binder, ring-binder +binoculars, field glasses, opera glasses +birdhouse +boathouse +bobsled, bobsleigh, bob +bolo tie, bolo, bola tie, bola +bonnet, poke bonnet +bookcase +bookshop, bookstore, bookstall +bottlecap +bow +bow tie, bow-tie, bowtie +brass, memorial tablet, plaque +brassiere, bra, bandeau +breakwater, groin, groyne, mole, bulwark, seawall, jetty +breastplate, aegis, egis +broom +bucket, pail +buckle +bulletproof vest +bullet train, bullet +butcher shop, meat market +cab, hack, taxi, taxicab +caldron, cauldron +candle, taper, wax light +cannon +canoe +can opener, tin opener +cardigan +car mirror +carousel, carrousel, merry-go-round, roundabout, whirligig +carpenter's kit, tool kit +carton +car wheel +cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM +cassette +cassette player +castle +catamaran +CD player +cello, violoncello +cellular telephone, cellular phone, cellphone, cell, mobile phone +chain +chainlink fence +chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour +chain saw, chainsaw +chest +chiffonier, commode +chime, bell, gong +china cabinet, china closet +Christmas stocking +church, church building +cinema, movie theater, movie theatre, movie house, picture palace +cleaver, meat cleaver, chopper +cliff dwelling +cloak +clog, geta, patten, sabot +cocktail shaker +coffee mug +coffeepot +coil, spiral, volute, whorl, helix +combination lock +computer keyboard, keypad +confectionery, confectionary, candy store +container ship, containership, container vessel +convertible +corkscrew, bottle screw +cornet, horn, trumpet, trump +cowboy boot +cowboy hat, ten-gallon hat +cradle +crane +crash helmet +crate +crib, cot +Crock Pot +croquet ball +crutch +cuirass +dam, dike, dyke +desk +desktop computer +dial telephone, dial phone +diaper, nappy, napkin +digital clock +digital watch +dining table, board +dishrag, dishcloth +dishwasher, dish washer, dishwashing machine +disk brake, disc brake +dock, dockage, docking facility +dogsled, dog sled, dog sleigh +dome +doormat, welcome mat +drilling platform, offshore rig +drum, membranophone, tympan +drumstick +dumbbell +Dutch oven +electric fan, blower +electric guitar +electric locomotive +entertainment center +envelope +espresso maker +face powder +feather boa, boa +file, file cabinet, filing cabinet +fireboat +fire engine, fire truck +fire screen, fireguard +flagpole, flagstaff +flute, transverse flute +folding chair +football helmet +forklift +fountain +fountain pen +four-poster +freight car +French horn, horn +frying pan, frypan, skillet +fur coat +garbage truck, dustcart +gasmask, respirator, gas helmet +gas pump, gasoline pump, petrol pump, island dispenser +goblet +go-kart +golf ball +golfcart, golf cart +gondola +gong, tam-tam +gown +grand piano, grand +greenhouse, nursery, glasshouse +grille, radiator grille +grocery store, grocery, food market, market +guillotine +hair slide +hair spray +half track +hammer +hamper +hand blower, blow dryer, blow drier, hair dryer, hair drier +hand-held computer, hand-held microcomputer +handkerchief, hankie, hanky, hankey +hard disc, hard disk, fixed disk +harmonica, mouth organ, harp, mouth harp +harp +harvester, reaper +hatchet +holster +home theater, home theatre +honeycomb +hook, claw +hoopskirt, crinoline +horizontal bar, high bar +horse cart, horse-cart +hourglass +iPod +iron, smoothing iron +jack-o'-lantern +jean, blue jean, denim +jeep, landrover +jersey, T-shirt, tee shirt +jigsaw puzzle +jinrikisha, ricksha, rickshaw +joystick +kimono +knee pad +knot +lab coat, laboratory coat +ladle +lampshade, lamp shade +laptop, laptop computer +lawn mower, mower +lens cap, lens cover +letter opener, paper knife, paperknife +library +lifeboat +lighter, light, igniter, ignitor +limousine, limo +liner, ocean liner +lipstick, lip rouge +Loafer +lotion +loudspeaker, speaker, speaker unit, loudspeaker system, speaker system +loupe, jeweler's loupe +lumbermill, sawmill +magnetic compass +mailbag, postbag +mailbox, letter box +maillot +maillot, tank suit +manhole cover +maraca +marimba, xylophone +mask +matchstick +maypole +maze, labyrinth +measuring cup +medicine chest, medicine cabinet +megalith, megalithic structure +microphone, mike +microwave, microwave oven +military uniform +milk can +minibus +miniskirt, mini +minivan +missile +mitten +mixing bowl +mobile home, manufactured home +Model T +modem +monastery +monitor +moped +mortar +mortarboard +mosque +mosquito net +motor scooter, scooter +mountain bike, all-terrain bike, off-roader +mountain tent +mouse, computer mouse +mousetrap +moving van +muzzle +nail +neck brace +necklace +nipple +notebook, notebook computer +obelisk +oboe, hautboy, hautbois +ocarina, sweet potato +odometer, hodometer, mileometer, milometer +oil filter +organ, pipe organ +oscilloscope, scope, cathode-ray oscilloscope, CRO +overskirt +oxcart +oxygen mask +packet +paddle, boat paddle +paddlewheel, paddle wheel +padlock +paintbrush +pajama, pyjama, pj's, jammies +palace +panpipe, pandean pipe, syrinx +paper towel +parachute, chute +parallel bars, bars +park bench +parking meter +passenger car, coach, carriage +patio, terrace +pay-phone, pay-station +pedestal, plinth, footstall +pencil box, pencil case +pencil sharpener +perfume, essence +Petri dish +photocopier +pick, plectrum, plectron +pickelhaube +picket fence, paling +pickup, pickup truck +pier +piggy bank, penny bank +pill bottle +pillow +ping-pong ball +pinwheel +pirate, pirate ship +pitcher, ewer +plane, carpenter's plane, woodworking plane +planetarium +plastic bag +plate rack +plow, plough +plunger, plumber's helper +Polaroid camera, Polaroid Land camera +pole +police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria +poncho +pool table, billiard table, snooker table +pop bottle, soda bottle +pot, flowerpot +potter's wheel +power drill +prayer rug, prayer mat +printer +prison, prison house +projectile, missile +projector +puck, hockey puck +punching bag, punch bag, punching ball, punchball +purse +quill, quill pen +quilt, comforter, comfort, puff +racer, race car, racing car +racket, racquet +radiator +radio, wireless +radio telescope, radio reflector +rain barrel +recreational vehicle, RV, R.V. +reel +reflex camera +refrigerator, icebox +remote control, remote +restaurant, eating house, eating place, eatery +revolver, six-gun, six-shooter +rifle +rocking chair, rocker +rotisserie +rubber eraser, rubber, pencil eraser +rugby ball +rule, ruler +running shoe +safe +safety pin +saltshaker, salt shaker +sandal +sarong +sax, saxophone +scabbard +scale, weighing machine +school bus +schooner +scoreboard +screen, CRT screen +screw +screwdriver +seat belt, seatbelt +sewing machine +shield, buckler +shoe shop, shoe-shop, shoe store +shoji +shopping basket +shopping cart +shovel +shower cap +shower curtain +ski +ski mask +sleeping bag +slide rule, slipstick +sliding door +slot, one-armed bandit +snorkel +snowmobile +snowplow, snowplough +soap dispenser +soccer ball +sock +solar dish, solar collector, solar furnace +sombrero +soup bowl +space bar +space heater +space shuttle +spatula +speedboat +spider web, spider's web +spindle +sports car, sport car +spotlight, spot +stage +steam locomotive +steel arch bridge +steel drum +stethoscope +stole +stone wall +stopwatch, stop watch +stove +strainer +streetcar, tram, tramcar, trolley, trolley car +stretcher +studio couch, day bed +stupa, tope +submarine, pigboat, sub, U-boat +suit, suit of clothes +sundial +sunglass +sunglasses, dark glasses, shades +sunscreen, sunblock, sun blocker +suspension bridge +swab, swob, mop +sweatshirt +swimming trunks, bathing trunks +swing +switch, electric switch, electrical switch +syringe +table lamp +tank, army tank, armored combat vehicle, armoured combat vehicle +tape player +teapot +teddy, teddy bear +television, television system +tennis ball +thatch, thatched roof +theater curtain, theatre curtain +thimble +thresher, thrasher, threshing machine +throne +tile roof +toaster +tobacco shop, tobacconist shop, tobacconist +toilet seat +torch +totem pole +tow truck, tow car, wrecker +toyshop +tractor +trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi +tray +trench coat +tricycle, trike, velocipede +trimaran +tripod +triumphal arch +trolleybus, trolley coach, trackless trolley +trombone +tub, vat +turnstile +typewriter keyboard +umbrella +unicycle, monocycle +upright, upright piano +vacuum, vacuum cleaner +vase +vault +velvet +vending machine +vestment +viaduct +violin, fiddle +volleyball +waffle iron +wall clock +wallet, billfold, notecase, pocketbook +wardrobe, closet, press +warplane, military plane +washbasin, handbasin, washbowl, lavabo, wash-hand basin +washer, automatic washer, washing machine +water bottle +water jug +water tower +whiskey jug +whistle +wig +window screen +window shade +Windsor tie +wine bottle +wing +wok +wooden spoon +wool, woolen, woollen +worm fence, snake fence, snake-rail fence, Virginia fence +wreck +yawl +yurt +web site, website, internet site, site +comic book +crossword puzzle, crossword +street sign +traffic light, traffic signal, stoplight +book jacket, dust cover, dust jacket, dust wrapper +menu +plate +guacamole +consomme +hot pot, hotpot +trifle +ice cream, icecream +ice lolly, lolly, lollipop, popsicle +French loaf +bagel, beigel +pretzel +cheeseburger +hotdog, hot dog, red hot +mashed potato +head cabbage +broccoli +cauliflower +zucchini, courgette +spaghetti squash +acorn squash +butternut squash +cucumber, cuke +artichoke, globe artichoke +bell pepper +cardoon +mushroom +Granny Smith +strawberry +orange +lemon +fig +pineapple, ananas +banana +jackfruit, jak, jack +custard apple +pomegranate +hay +carbonara +chocolate sauce, chocolate syrup +dough +meat loaf, meatloaf +pizza, pizza pie +potpie +burrito +red wine +espresso +cup +eggnog +alp +bubble +cliff, drop, drop-off +coral reef +geyser +lakeside, lakeshore +promontory, headland, head, foreland +sandbar, sand bar +seashore, coast, seacoast, sea-coast +valley, vale +volcano +ballplayer, baseball player +groom, bridegroom +scuba diver +rapeseed +daisy +yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum +corn +acorn +hip, rose hip, rosehip +buckeye, horse chestnut, conker +coral fungus +agaric +gyromitra +stinkhorn, carrion fungus +earthstar +hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa +bolete +ear, spike, capitulum +toilet tissue, toilet paper, bathroom tissue diff --git a/TensorFlow-Receptive-Field-With-Backprop/receptive_field_backpropagation.py b/TensorFlow-Receptive-Field-With-Backprop/receptive_field_backpropagation.py new file mode 100644 index 000000000..6a73b7686 --- /dev/null +++ b/TensorFlow-Receptive-Field-With-Backprop/receptive_field_backpropagation.py @@ -0,0 +1,226 @@ +from collections import namedtuple + +import cv2 +import numpy as np +import tensorflow as tf +import tensorflow.keras.backend as K +from tensorflow.keras.applications.resnet import preprocess_input +from tensorflow.keras.layers import ( + BatchNormalization, + Conv2D, +) + +from FullyConvolutionalResnet50 import fully_convolutional_resnet50 + +Rect = namedtuple("Rect", "x1 y1 x2 y2") + + +def backprop_receptive_field( + image, predicted_class, scoremap, use_max_activation=False, +): + model = fully_convolutional_resnet50( + input_shape=(image.shape[-3:]), pretrained_resnet=False, + ) + + for module in model.layers: + try: + if isinstance(module, Conv2D): + conv_weights = np.full(module.get_weights()[0].shape, 0.005) + if len(module.get_weights()) > 1: + conv_biases = np.full(module.get_weights()[1].shape, 0.0) + module.set_weights([conv_weights, conv_biases]) + # cases when use_bias = False + else: + module.set_weights([conv_weights]) + if isinstance(module, BatchNormalization): + # weight sequence: gamma, beta, running mean, running variance + bn_weights = [ + module.get_weights()[0], + module.get_weights()[1], + np.full(module.get_weights()[2].shape, 0.0), + np.full(module.get_weights()[3].shape, 1.0), + ] + module.set_weights(bn_weights) + except: + pass + + input = tf.ones_like(image) + out = model.predict(image) + receptive_field_mask = tf.Variable(tf.zeros_like(out)) + + if not use_max_activation: + receptive_field_mask[:, :, :, predicted_class].assign(scoremap) + else: + scoremap_max_row_values = tf.math.reduce_max(scoremap, axis=1) + max_row_id = tf.math.argmax(scoremap, axis=1) + max_col_id = tf.math.argmax(scoremap_max_row_values, axis=1).numpy()[0] + max_row_id = max_row_id[0, max_col_id].numpy() + print( + "Coords of the max activation:", max_row_id, max_col_id, + ) + # update gradient + receptive_field_mask = tf.tensor_scatter_nd_update( + receptive_field_mask, [(0, max_row_id, max_col_id, 0)], [1], + ) + + grads = [] + with tf.GradientTape() as tf_gradient_tape: + tf_gradient_tape.watch(input) + # get the predictions + preds = model(input) + # apply the mask + pseudo_loss = preds * receptive_field_mask + pseudo_loss = K.mean(pseudo_loss) + # get gradient + grad = tf_gradient_tape.gradient(pseudo_loss, input) + grad = tf.transpose(grad, perm=[0, 3, 1, 2]) + grads.append(grad) + return grads[0][0, 0] + + +def find_rect(activations): + # Dilate and erode the activations to remove grid-like artifacts + kernel = np.ones((5, 5), np.uint8) + activations = cv2.dilate(activations, kernel=kernel) + activations = cv2.erode(activations, kernel=kernel) + + # Binarize the activations + _, activations = cv2.threshold(activations, 0.65, 1, type=cv2.THRESH_BINARY) + activations = activations.astype(np.uint8).copy() + + # Find the contour of the binary blob + contours, _ = cv2.findContours( + activations, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_SIMPLE, + ) + + # Find bounding box around the object. + rect = cv2.boundingRect(contours[0]) + return Rect(rect[0], rect[1], rect[0] + rect[2], rect[1] + rect[3]) + + +def normalize(activations): + activations = activations - np.min(activations[:]) + activations = activations / np.max(activations[:]) + return activations + + +def visualize_activations(image, activations, show_bounding_rect=False): + activations = normalize(activations) + + activations_multichannel = np.stack([activations, activations, activations], axis=2) + masked_image = (image * activations_multichannel).astype(np.uint8) + + if show_bounding_rect: + rect = find_rect(activations.numpy()) + cv2.rectangle( + masked_image, + (rect.x1, rect.y1), + (rect.x2, rect.y2), + color=(0, 0, 255), + thickness=2, + ) + + return masked_image + + +def run_resnet_inference(original_image): + + # read ImageNet class ids to a list of labels + with open("imagenet_classes.txt") as f: + labels = [line.strip() for line in f.readlines()] + + # convert image to the RGB format + image = cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB) + + # pre-process image + image = preprocess_input(image) + + # convert image to NCHW tf.tensor + image = tf.expand_dims(image, 0) + + # load resnet50 model with pretrained ImageNet weights + model = fully_convolutional_resnet50(input_shape=(image.shape[-3:])) + + # Perform inference. + # Instead of a 1×1000 vector, we will get a + # 1×1000×n×m output ( i.e. a probability map + # of size n × m for each 1000 class, + # where n and m depend on the size of the image). + preds = model.predict(image) + preds = tf.transpose(preds, perm=[0, 3, 1, 2]) + preds = tf.nn.softmax(preds, axis=1) + print("Response map shape : ", preds.shape) + + # find class with the maximum score in the n × m output map + pred = tf.math.reduce_max(preds, axis=1) + class_idx = tf.math.argmax(preds, axis=1) + + row_max = tf.math.reduce_max(pred, axis=1) + row_idx = tf.math.argmax(pred, axis=1) + + col_idx = tf.math.argmax(row_max, axis=1) + + predicted_class = tf.gather_nd( + class_idx, (0, tf.gather_nd(row_idx, (0, col_idx[0])), col_idx[0]), + ) + + # print the top predicted class + print("Predicted Class : ", labels[predicted_class], predicted_class) + + # find the n × m score map for the predicted class + score_map = tf.expand_dims(preds[0, predicted_class, :, :], 0).numpy() + print("Score Map shape : ", score_map.shape) + + # compute the receptive filed for max activation pixel + receptive_field_max_activation = backprop_receptive_field( + image, + scoremap=score_map, + predicted_class=predicted_class, + use_max_activation=True, + ) + # compute the receptive filed for the whole image + receptive_field_image = backprop_receptive_field( + image, + scoremap=score_map, + predicted_class=predicted_class, + use_max_activation=False, + ) + + # resize score map to the original image size + score_map = score_map[0] + score_map = cv2.resize( + score_map, (original_image.shape[1], original_image.shape[0]), + ) + + # display the images + cv2.imshow("Original Image", original_image) + cv2.imshow( + "Score map: activations and bbox", + visualize_activations(original_image, score_map), + ) + cv2.imshow( + "receptive_field_max_activation", + visualize_activations( + original_image, receptive_field_max_activation, show_bounding_rect=True, + ), + ) + cv2.imshow( + "receptive_field_the_whole_image", + visualize_activations( + original_image, receptive_field_image, show_bounding_rect=True, + ), + ) + cv2.waitKey(0) + + +def main(): + # read the image + image_path = "camel.jpg" + image = cv2.imread(image_path) + + # run inference + run_resnet_inference(image) + + +if __name__ == "__main__": + main() diff --git a/TensorFlow-Receptive-Field-With-Backprop/requirements.txt b/TensorFlow-Receptive-Field-With-Backprop/requirements.txt new file mode 100644 index 000000000..ab1f58a1c --- /dev/null +++ b/TensorFlow-Receptive-Field-With-Backprop/requirements.txt @@ -0,0 +1,2 @@ +opencv-python>=3.4.1.15 +tensorflow==2.1.0 diff --git a/TensorFlow-Receptive-Field-With-Backprop/utils.py b/TensorFlow-Receptive-Field-With-Backprop/utils.py new file mode 100644 index 000000000..ecd4b4f8f --- /dev/null +++ b/TensorFlow-Receptive-Field-With-Backprop/utils.py @@ -0,0 +1,75 @@ +from tensorflow.keras.layers import ( + Activation, + Add, + BatchNormalization, + Conv2D, +) + +# https://github.com/tensorflow/tensorflow/blob/2b96f3662bd776e277f86997659e61046b56c315/tensorflow/python/keras/applications/resnet.py#L32 +BASE_WEIGHTS_PATH = ( + "https://storage.googleapis.com/tensorflow/keras-applications/resnet/" +) +WEIGHTS_HASHES = { + "resnet50": "4d473c1dd8becc155b73f8504c6f6626", +} + + +# https://github.com/tensorflow/tensorflow/blob/2b96f3662bd776e277f86997659e61046b56c315/tensorflow/python/keras/applications/resnet.py#L262 +def stack1(x, filters, blocks, stride1=2, name=None): + """ + A set of stacked residual blocks. + Arguments: + x: input tensor. + filters: integer, filters of the bottleneck layer in a block. + blocks: integer, blocks in the stacked blocks. + stride1: default 2, stride of the first layer in the first block. + name: string, stack label. + Returns: + Output tensor for the stacked blocks. + """ + x = block1(x, filters, stride=stride1, name=name + "_block1") + for i in range(2, blocks + 1): + x = block1(x, filters, conv_shortcut=False, name=name + "_block" + str(i)) + return x + + +# https://github.com/tensorflow/tensorflow/blob/2b96f3662bd776e277f86997659e61046b56c315/tensorflow/python/keras/applications/resnet.py#L217 +def block1(x, filters, kernel_size=3, stride=1, conv_shortcut=True, name=None): + """ + A residual block. + Arguments: + x: input tensor. + filters: integer, filters of the bottleneck layer. + kernel_size: default 3, kernel size of the bottleneck layer. + stride: default 1, stride of the first layer. + conv_shortcut: default True, use convolution shortcut if True, + otherwise identity shortcut. + name: string, block label. + Returns: + Output tensor for the residual block. + """ + # channels_last format + bn_axis = 3 + + if conv_shortcut: + shortcut = Conv2D(4 * filters, 1, strides=stride, name=name + "_0_conv")(x) + shortcut = BatchNormalization( + axis=bn_axis, epsilon=1.001e-5, name=name + "_0_bn", + )(shortcut) + else: + shortcut = x + + x = Conv2D(filters, 1, strides=stride, name=name + "_1_conv")(x) + x = BatchNormalization(axis=bn_axis, epsilon=1.001e-5, name=name + "_1_bn")(x) + x = Activation("relu", name=name + "_1_relu")(x) + + x = Conv2D(filters, kernel_size, padding="SAME", name=name + "_2_conv")(x) + x = BatchNormalization(axis=bn_axis, epsilon=1.001e-5, name=name + "_2_bn")(x) + x = Activation("relu", name=name + "_2_relu")(x) + + x = Conv2D(4 * filters, 1, name=name + "_3_conv")(x) + x = BatchNormalization(axis=bn_axis, epsilon=1.001e-5, name=name + "_3_bn")(x) + + x = Add(name=name + "_add")([shortcut, x]) + x = Activation("relu", name=name + "_out")(x) + return x diff --git a/Training_a_custom_hand_detector_with_dlib/Hand_Detector.svm b/Training_a_custom_hand_detector_with_dlib/Hand_Detector.svm new file mode 100644 index 000000000..1fedce3fe Binary files /dev/null and b/Training_a_custom_hand_detector_with_dlib/Hand_Detector.svm differ diff --git a/Training_a_custom_hand_detector_with_dlib/Head_Detector.svm b/Training_a_custom_hand_detector_with_dlib/Head_Detector.svm new file mode 100644 index 000000000..75934e5f0 Binary files /dev/null and b/Training_a_custom_hand_detector_with_dlib/Head_Detector.svm differ diff --git a/Training_a_custom_hand_detector_with_dlib/README.md b/Training_a_custom_hand_detector_with_dlib/README.md new file mode 100644 index 000000000..72f4d5652 --- /dev/null +++ b/Training_a_custom_hand_detector_with_dlib/README.md @@ -0,0 +1,19 @@ +# Training a Custom Object Detector with DLIB & Making Gesture Controlled Applications + +You can access the Tutorial for this repo [here](https://www.learnopencv.com/training-a-custom-object-detector-with-dlib-making-gesture-controlled-applications/). + +[Training a Custom Object Detector with DLIB & Making Gesture Controlled Applications Notebook](Training_a_custom_hand_Detector.ipynb) + +You can use the `.svm` models here but its best to train your own models. If you're unable to install dlib by doing `pip install dlib` then you should do: `pip install dlib==19.8.1` + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
+ + diff --git a/Training_a_custom_hand_detector_with_dlib/Training_a_custom_hand_Detector.ipynb b/Training_a_custom_hand_detector_with_dlib/Training_a_custom_hand_Detector.ipynb new file mode 100644 index 000000000..3ed4aed89 --- /dev/null +++ b/Training_a_custom_hand_detector_with_dlib/Training_a_custom_hand_Detector.ipynb @@ -0,0 +1,1186 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#
Training a Custom Hand Detector with Dlib
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##
Part 1 : Training a Custom Hand Detector with DLIB
\n", + "- Step 1: Data Generation & Automatic Annotation.\n", + "- Step 2: Preprocessing Data.\n", + "- Step 3: Display Images (Optional)\n", + "- Step 4: Train the Detector.\n", + "- Step 5: Save & Evaluate the Detector.\n", + "- Step 6: Test the Trained Detector on Live Webcam.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lets start by importing the required libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Import Libraries\n", + "import dlib\n", + "import glob\n", + "import cv2\n", + "import os\n", + "import sys\n", + "import time\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import pyautogui as pyg\n", + "import shutil" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Data Generation & Automatic Annotation:\n", + "Normally when you're training a hand detector you're going to need several images of the hand and then you'll need to annotate them meaning you'll have to draw bounding boxes over the hand in each hand.\n", + "\n", + "So now you have two options:\n", + "\n", + "#### Option 1: Annotate Images Manually\n", + "\n", + "Record a video of yourself and in the video wave your hand, move it around, rotate a bit and so on but don't deform your hand (palm should face the camera each time). After the recording, split the video into images and then download an annotation tool. You can install labelimg (a popular annotation tool) by just doing: `pip install labelimg`. After that you have to annotate each image with a bounding box. Now depending upon the number of images this would probably take some hours.\n", + "\n", + "#### Option 2: Automate the Annotation Process\n", + "\n", + "A smarter way to go about is to automate this annotation process while you're collecting training images.\n", + "\n", + "How are we going to do that?\n", + "\n", + "Well, all you need to do is use a sliding window, I've already explained what a sliding window is above.\n", + "\n", + "Now what we're going to do is put our hand inside the window and whenever the window moves we will move our hand with it, after that is done we will save that image and the window box will be our annotated box.\n", + "\n", + "This way we will automate the annotation process. How cool is that.\n", + "\n", + "The script below does just that, it saves the images in the folder named `training_images` and appends the window box locations in a python list." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# If cleanup is True then the new images and annotations will be appended to previous ones\n", + "# If False then all previous images and annotations will be deleted.\n", + "cleanup = True\n", + "\n", + "# Set the window to a normal one so we can adjust it\n", + "cv2.namedWindow('frame', cv2.WINDOW_NORMAL)\n", + "\n", + "# Resize the window and adjust it to the center\n", + "# This is done so we're ready for capturing the images.\n", + "cv2.resizeWindow('frame', 1920,1080)\n", + "cv2.moveWindow(\"frame\", 0,0)\n", + "\n", + "# Initialize webcam\n", + "cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)\n", + "\n", + "# Initalize sliding window's x1,y1\n", + "x1 ,y1 = 0,0\n", + "\n", + "# These will be the width and height of the sliding window.\n", + "window_width = 190#140 \n", + "window_height = 190\n", + "\n", + "# We will save images after every 4 frames\n", + "# This is done so we don't have lot's of duplicate images\n", + "skip_frames = 3\n", + "frame_gap = 0\n", + "\n", + "# This is the directory where our images will be stored\n", + "# Make sure to change both names if you're saving a different Detector\n", + "directory = 'train_images_h'\n", + "box_file = 'boxes_h.txt'\n", + "\n", + "# If cleanup is True then delete all imaages and bounding_box annotations.\n", + "if cleanup:\n", + " \n", + " # Delete the images directory if it exists\n", + " if os.path.exists(directory):\n", + " shutil.rmtree(directory)\n", + " \n", + " # Clear up all previous bounding boxes\n", + " open(box_file, 'w').close()\n", + " \n", + " # Initialize the counter to 0\n", + " counter = 0\n", + " \n", + "elif os.path.exists(box_file):\n", + "\n", + " # If cleanup is false then we must append the new boxes with the old\n", + " with open(box_file,'r') as text_file:\n", + " box_content = text_file.read()\n", + " \n", + " # Set the counter to the previous highest checkpoint\n", + " counter = int(box_content.split(':')[-2].split(',')[-1])\n", + "\n", + "# Open up this text file or create it if it does not exists\n", + "fr = open(box_file, 'a')\n", + "\n", + "# Create our image directory if it does not exists.\n", + "if not os.path.exists(directory):\n", + " os.mkdir(directory)\n", + "\n", + "# Initial wait before you start recording each row\n", + "initial_wait = 0\n", + " \n", + "# Start the loop for the sliding window\n", + "while(True):\n", + " \n", + " # Start reading from camera\n", + " ret, frame = cap.read()\n", + " if not ret:\n", + " break\n", + " \n", + " # Invert the image laterally to get the mirror reflection.\n", + " frame = cv2.flip( frame, 1 )\n", + " \n", + " # Make a copy of the original frame\n", + " orig = frame.copy() \n", + " \n", + " # Wait the first 50 frames so that you can place your hand correctly\n", + " if initial_wait > 60:\n", + " \n", + " # Increment frame_gap by 1.\n", + " frame_gap +=1 \n", + " \n", + " # Move the window to the right by some amount in each iteration. \n", + " if x1 + window_width < frame.shape[1]:\n", + " x1 += 4\n", + " time.sleep(0.1) \n", + " \n", + " elif y1 + window_height + 270 < frame.shape[1]:\n", + "\n", + " # If the sliding_window has reached the end of the row then move down by some amount.\n", + " # Also start the window from start of the row\n", + " y1 += 80 \n", + " x1 = 0\n", + "\n", + " # Setting frame_gap and init_wait to 0.\n", + " # This is done so that the user has the time to place the hand correctly\n", + " # in the next row before image is saved.\n", + " frame_gap = 0\n", + " initial_wait = 0\n", + " \n", + " # Break the loop if we have gone over the whole screen.\n", + " else:\n", + " break\n", + " \n", + " else: \n", + " initial_wait += 1\n", + "\n", + " # Save the image every nth frame.\n", + " if frame_gap == skip_frames:\n", + "\n", + " # Set the image name equal to the counter value\n", + " img_name = str(counter) + '.png'\n", + "\n", + " # Save the Image in the defined directory\n", + " img_full_name = directory + '/' + str(counter) + '.png'\n", + " cv2.imwrite(img_full_name, orig)\n", + " \n", + " # Save the bounding box coordinates in the text file.\n", + " fr.write('{}:({},{},{},{}),'.format(counter, x1, y1, x1+window_width, y1+window_height))\n", + "\n", + " # Increment the counter \n", + " counter += 1\n", + "\n", + " # Set the frame_gap back to 0.\n", + " frame_gap = 0\n", + "\n", + " # Draw the sliding window\n", + " cv2.rectangle(frame,(x1,y1),(x1+window_width,y1+window_height),(0,255,0),3)\n", + " \n", + " # Display the frame\n", + " cv2.imshow('frame', frame)\n", + " if cv2.waitKey(1) == ord('q'):\n", + " break\n", + "\n", + "# Release camera and close the file and window\n", + "cap.release()\n", + "cv2.destroyAllWindows()\n", + "fr.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note:** The Code above is structured in a way that when you run the code the second time it will append new images with the previous one, this is done so you can gather more samples at different places with different backgrounds, so you have diverse dataset. You can choose to delete all previous images by setting `clear_images` variable to `True`. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before we move forward, you should also know that the detector we're training is not a full fledge hand detector but its actually a hand palm detector this is because a HOG + SVM model is not robust enough to capture the deformation of objects like a hand. If we were training a deep learning based detector then this wouldn't be much of an issue but for this case make sure you're not collecting images of deformed hands with different variations, make sure the palm is facing the camera. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 2: Preprocessing Data.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before you start training you just need to load and preprocess the data (images and labels) slightly so they are in the required format.\n", + "\n", + "First we will extract all the image names from the images directory. Then we will use the indexes of those images to extract their associated bounding box. The bounding box will be converted to a dlib rectangle format and then the image and its box will be stored together in a dictionary in the format: `index: (image, bounding_box) ...` At the time of training we will separate the images from bounding_boxes, for now we'll keep them together.\n", + "\n", + "**Note:** You could get away by just reading in all images and labels directly from their locations in a list but its a bad practice since if you delete a single image from its directory after recording images. Then it would cause trouble. Ideally you should get rid of any image in `train_images` directory before training if you feel its not right." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# In this dictionary our images and annotations will be stored.\n", + "data = {}\n", + "\n", + "# Get the indexes of all images.\n", + "image_indexes = [int(img_name.split('.')[0]) for img_name in os.listdir(directory)]\n", + "\n", + "# Shuffle the indexes to have random train/test split later on.\n", + "np.random.shuffle(image_indexes)\n", + "\n", + "# Open and read the content of the boxes.txt file\n", + "f = open(box_file, \"r\")\n", + "box_content = f.read()\n", + "\n", + "# Convert the bounding boxes to dictionary in the format `index: (x1,y1,x2,y2)` ...\n", + "box_dict = eval( '{' +box_content + '}' )\n", + "\n", + "# Close the file\n", + "f.close()\n", + "\n", + "# Loop over all indexes\n", + "for index in image_indexes:\n", + " \n", + " # Read the image in memmory and append it to the list\n", + " img = cv2.imread(os.path.join(directory, str(index) + '.png')) \n", + " \n", + " # Read the associated bounding_box\n", + " bounding_box = box_dict[index]\n", + " \n", + " # Convert the bounding box to dlib format\n", + " x1, y1, x2, y2 = bounding_box\n", + " dlib_box = [ dlib.rectangle(left=x1 , top=y1, right=x2, bottom=y2) ]\n", + " \n", + " # Store the image and the box together\n", + " data[index] = (img, dlib_box)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's also check the total number of images and boxes present." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of Images and Boxes Present: 148\n" + ] + } + ], + "source": [ + "print('Number of Images and Boxes Present: {}'.format(len(data)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3: Display Images (Optional)\n", + "\n", + "\n", + "You can optionally choose to display images along with their bounding box, this way you can visualize if the boxes were drawn properly or not." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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fPPhYyKTxZLeATM+evVhFSlQs8rXVqsSMoNM54HBm32psxiW2tro7vwG9/EA13ms8kqC5Dvf+YRoCVxpeawoA8jaIrYZ5HUyPQkGPRZm9bKgNZaRRFzIvVaWXnJiYdz7HczarX7Nxp2v9DjR7xu9Jd2o1Va5gDvnXJi7V26UG9v1FX2pa2bOeWytVc/rdW/Yiwvr6VTnBEWvAhWAfsX6H94PssdZTBERERERERERERG5PV/8KSoRERERERERERER+UMpBBYRERERERERERG5YQqBRURERERERERERG6YQmARERERERERERGRG6YQWEREREREREREROSGKQQWERERERERERERuWEKgUVERERERERERERumEJgERERERERERERkRumEFhERERERERERETkhikEFhEREREREREREblhCoFFREREREREREREbphCYBEREREREREREZEbphBYRERERERERERE5IYpBBYRERERERERERG5YQqBRURERERERERERG6YQmARERERERERERGRG6YQWEREREREREREROSGKQQWERERERERERERuWEKgUVERERERERERERumEJgERERERERERERkRumEFhERERERERERETkhikEFhEREREREREREblhCoFFREREREREREREbphCYBEREREREREREZEbphBYRERERERERERE5IYpBBYRERERERERERG5YQqBRURERERERERERG6YQmARERERERERERGRG6YQWEREREREREREROSGKQQWERERERERERERuWEKgUVERERERERERERumEJgERERERERERERkRumEFhERERERERERETkhikEFhEREREREREREblhCoFFREREREREREREbphCYBEREREREREREZEbphBYRERERERERERE5IYpBBYRERERERERERG5YQqBRURERERERERERG6YQmARERERERERERGRG6YQWEREREREREREROSGKQQWERERERERERERuWEKgUVERERERERERERumEJgERERERERERERkRumEFhERERERERERETkhikEFhEREREREREREblhCoFFREREREREREREbphCYBEREREREREREZEbphBYRERERERERERE5IYpBBYRERERERERERG5YQqBRURERERERERERG6YQmARERERERERERGRG6YQWEREREREREREROSGKQQWERERERERERERuWEKgUVERERERERERERumEJgERERERERERERkRumEFhERERERERERETkhikEFhEREREREREREblhCoFFREREREREREREbphCYBEREREREREREZEbphBYRERERERERERE5IYpBBYRERERERERERG5YQqBRURERERERERERG6YQmARERERERERERGRG6YQWEREREREREREROSGKQQWERERERERERERuWEKgUVERERERERERERumEJgERERERERERERkRumEFhERERERERERETkhikEFhEREREREREREblhCoFFREREREREREREbphCYBEREREREREREZEbphBYRERERERERERE5IYpBBYRERERERERERG5YQqBRURERERERERERG6YQmARERERERERERGRG6YQWEREREREREREROSGKQQWERERERERERERuWEKgUVERERERERERERumEJgERERERERERERkRumEFhERERERERERETkhikEFhEREREREREREblhCoFFREREREREREREbphCYBEREREREREREZEbphBYRERERERERERE5IYpBBYRERERERERERG5YQqBRURERERERERERG6YQmARERERERERERGRG6YQWEREREREREREROSGKQQWERERERERERERuWEKgUVERERERERERERumEJgERERERERERERkRumEFhERERERERERETkhikEFhEREREREREREblhCoFFREREREREREREbphCYBEREREREREREZEbphBYRERERERERERE5IYpBBYRERERERERERG5YQqBRURERERERERERG6YQmARERERERERERGRG6YQWEREREREREREROSGKQQWERERERERERERuWEKgUVERERERERERERumEJgERERERERERERkRumEFhERERERERERETkhikEFhEREREREREREblhCoFFREREREREREREbphCYBEREREREREREZEbphBYRERERERERERE5IYpBBYRERERERERERG5YQqBRURERERERERERG6YQmARERERERERERGRG6YQWEREREREREREROSGKQQWERERERERERERuWEKgUVERERERERERERuWP9u/+df/W//oxyWmCVmDYDhjUawto6ZYZaAQzrg9Wc9IRIzw3t7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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "no_of_samples = 10\n", + "\n", + "image_names = os.listdir(directory)\n", + "\n", + "np.random.shuffle(data)\n", + "\n", + "# Extract the subset of boxes\n", + "#subset = data[][:no_of_samples ]\n", + "\n", + "cols = 5\n", + "\n", + "# Given the number of samples to display, what's the number of rows required.\n", + "rows = int(np.ceil(no_of_samples / cols))\n", + "\n", + "# Set the figure size\n", + "plt.figure(figsize=(cols*cols, rows*cols))\n", + "\n", + "#Loop for each class\n", + "for i in range(no_of_samples):\n", + " \n", + " # Extract the bonding box coordinates\n", + " d_box = data[i][1][0]\n", + " left, top, right,bottom = d_box.left(), d_box.top(), d_box.right(), d_box.bottom()\n", + " \n", + " # Get the image\n", + " image = data[i][0]\n", + " \n", + " # Draw reectangle on the detected hand\n", + " cv2.rectangle(image,(left,top),(right,bottom),(0,255,0),3)\n", + " \n", + " # Display the image\n", + " plt.subplot(rows,cols,i+1);plt.imshow(image[:,:,::-1]);plt.axis('off');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 4: Train the Detector\n", + "\n", + "You can start training the detector by calling `dlib.train_simple_object_detector` and passing in a list of images and a list of associated dlib rectangles. First we will extract the images and bounding box rectangles from our dictionary and then pass it to the training function.\n", + "\n", + "Before you start training you can also specify other training options." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training Completed, Total Time taken: 22.48 seconds\n" + ] + } + ], + "source": [ + "# This is the percentage of data we will use to train\n", + "# The rest will be used for testing\n", + "percent = 0.8\n", + "\n", + "# How many examples make 80%.\n", + "split = int(len(data) * percent)\n", + "\n", + "# Seperate the images and bounding boxes in different lists.\n", + "images = [tuple_value[0] for tuple_value in data.values()]\n", + "bounding_boxes = [tuple_value[1] for tuple_value in data.values()]\n", + "\n", + "# Initialize object detector Options\n", + "options = dlib.simple_object_detector_training_options()\n", + "\n", + "# I'm disabling the horizontal flipping, becauase it confuses the detector if you're training on few examples\n", + "# By doing this the detector will only detect left or right hand (whichever you trained on). \n", + "options.add_left_right_image_flips = False\n", + "\n", + "# Set the c parameter of SVM equal to 5\n", + "# A bigger C encourages the model to better fit the training data, it can lead to overfitting.\n", + "# So set an optimal C value via trail and error.\n", + "options.C = 5\n", + "\n", + "# Note the start time before training.\n", + "st = time.time()\n", + "\n", + "# You can start the training now\n", + "detector = dlib.train_simple_object_detector(images[:split], bounding_boxes[:split], options)\n", + "\n", + "# Print the Total time taken to train the detector\n", + "print('Training Completed, Total Time taken: {:.2f} seconds'.format(time.time() - st))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 5: Save & Evaluate the Detector." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Save The Trained Detector \n", + "You should now save the detector so you don't have to train it again the next time you want to use it. The extension of the model is `.svm` as in Support Vector Machine. " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "file_name = 'Head_Detector.svm'\n", + "detector.save(file_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Check the Hog Descriptor:**\n", + "\n", + "You can even checkout the final hog descriptor from the code below, the descriptor should look something like the target object." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "win_det = dlib.image_window()\n", + "win_det.set_image(detector)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Check Training Metrics \n", + "You can call `dlib.test_simple_object_detector()` to test your model on training data." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training Metrics: precision: 0.991379, recall: 0.974576, average precision: 0.974576\n" + ] + } + ], + "source": [ + "print(\"Training Metrics: {}\".format(dlib.test_simple_object_detector(images[:split], bounding_boxes[:split], detector)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Check Testing Metrics:\n", + "Similarly we can also check the testing accuracy by using the reamining 20% of the data" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Testing accuracy: precision: 1, recall: 0.933333, average precision: 0.933333\n" + ] + } + ], + "source": [ + "print(\"Testing accuracy: {}\".format(dlib.test_simple_object_detector(images[split:], bounding_boxes[split:], detector)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Train the Final Detector\n", + "We trained the model on 80% of the data, if you're satisfied with the metrics above then you now can retrain the detector on 100% of the data." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "detector = dlib.train_simple_object_detector(images, bounding_boxes, options)\n", + "detector.save(file_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One thing you may have noted is that the precision of the model is pretty high, this is really good since we don't want any false positive when we try to gesture control games." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 6: Test the Trained Detector on Live Webcam.\n", + "\n", + "Finally let's test our detector. Now we're going to do inference with our trained detector. You can load the detector by calling `detector = dlib.simple_object_detector()` After loading the detector you can pass in a frame by doing `detector(frame)` and it will return the bounding box location of the hand if it was detected." + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "#file_name = 'Hand_Detector.svm'\n", + "\n", + "# Load our trained detector \n", + "detector = dlib.simple_object_detector(file_name)\n", + "\n", + "# Set the window name\n", + "cv2.namedWindow('frame', cv2.WINDOW_NORMAL)\n", + "\n", + "# Initialize webcam\n", + "cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)\n", + "\n", + "# Setting the downscaling size, for faster detection\n", + "# If you're not getting any detections then you can set this to 1\n", + "scale_factor = 2.0\n", + "\n", + "# Initially the size of the hand and its center x point will be 0\n", + "size, center_x = 0,0\n", + "\n", + "# Initialize these variables for calculating FPS\n", + "fps = 0 \n", + "frame_counter = 0\n", + "start_time = time.time()\n", + "\n", + "# Set the while loop\n", + "while(True):\n", + " \n", + " # Read frame by frame\n", + " ret, frame = cap.read()\n", + " \n", + " if not ret:\n", + " break\n", + " \n", + " # Laterally flip the frame\n", + " frame = cv2.flip( frame, 1 )\n", + " \n", + " # Calculate the Average FPS\n", + " frame_counter += 1\n", + " fps = (frame_counter / (time.time() - start_time))\n", + " \n", + " # Create a clean copy of the frame\n", + " copy = frame.copy() \n", + " \n", + " # Downsize the frame.\n", + " new_width = int(frame.shape[1]/scale_factor)\n", + " new_height = int(frame.shape[0]/scale_factor)\n", + " resized_frame = cv2.resize(copy, (new_width, new_height))\n", + " \n", + " # Detect with detector\n", + " detections = detector(resized_frame)\n", + " \n", + " # Loop for each detection.\n", + " for detection in (detections): \n", + " \n", + " # Since we downscaled the image we will need to resacle the coordinates according to the original image.\n", + " x1 = int(detection.left() * scale_factor )\n", + " y1 = int(detection.top() * scale_factor )\n", + " x2 = int(detection.right() * scale_factor )\n", + " y2 = int(detection.bottom()* scale_factor )\n", + " \n", + " # Draw the bounding box\n", + " cv2.rectangle(frame,(x1,y1),(x2,y2),(0,255,0), 2 )\n", + " cv2.putText(frame, 'Hand Detected', (x1, y2+20), cv2.FONT_HERSHEY_COMPLEX, 0.6, (0, 0, 255),2)\n", + "\n", + " # Calculate size of the hand. \n", + " size = int( (x2 - x1) * (y2-y1) )\n", + " \n", + " # Extract the center of the hand on x-axis.\n", + " center_x = x2 - x1 // 2\n", + " \n", + " # Display FPS and size of hand\n", + " cv2.putText(frame, 'FPS: {:.2f}'.format(fps), (20, 20), cv2.FONT_HERSHEY_COMPLEX, 0.6, (0, 0, 255),2)\n", + "\n", + " # This information is useful for when you'll be building hand gesture applications\n", + " cv2.putText(frame, 'Center: {}'.format(center_x), (540, 20), cv2.FONT_HERSHEY_COMPLEX, 0.5, (233, 100, 25))\n", + " cv2.putText(frame, 'size: {}'.format(size), (540, 40), cv2.FONT_HERSHEY_COMPLEX, 0.5, (233, 100, 25))\n", + " \n", + " # Display the image\n", + " cv2.imshow('frame',frame)\n", + " \n", + " if cv2.waitKey(1) & 0xFF == ord('q'):\n", + " break\n", + "\n", + "# Relase the webcam and destroy all windows\n", + "cap.release()\n", + "cv2.destroyAllWindows()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you noticed above I actually down sized the frame by factor of 2 before passing it to the detector.\n", + "\n", + "Why did I do that?\n", + "\n", + "Well remember that our HOG + SVM is actually a classifier, the things that allows it to become a detector are sliding windows and image pyramids. Now we already have seen that bigger an image is, the more time a sliding window is going to take to go over its rows and columns so its safe to say that our detector will run faster if the frame is small.\n", + "\n", + "This is the reason we are downsizing the frames. Although if you downsize too much then the detector's accuracy will be effected, you will need to figure out the right scaling factor, in my case a factor of 2.0 which reduces the size by 50% gives the best balance of speed and accuracy. \n", + "\n", + "After you have resized the image and perform detection, you then must resacle the detected coordinates according to the original image. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using Multiple Object Detectors Together:\n", + "\n", + "Now if you wanted to train a detector on multiple classes and not just hands then unfortunately you can't just do that. The only way to do that is to train multiple detectors and run them simultaneously, This of course will significantly reduce your speed.\n", + "\n", + "There is a silver lining here which is that dlib comes with a function called `dlib.fhog_object_detector.run_multiple()` which allows you to run multiple object detectors simultaneously in an efficient way. Of course the more detectors you add, the slower your code gets. This method also gives you confidence scores for each detection.\n", + "\n", + "Here’s an example of me using two detectors One is trained on my hand and one on my face." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Load our trained detector \n", + "detector = dlib.simple_object_detector(file_name)\n", + "\n", + "# Set the window to normal\n", + "cv2.namedWindow('frame', cv2.WINDOW_NORMAL)\n", + "\n", + "# Initialize webcam\n", + "cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)\n", + "\n", + "# Setting the downscaling size, for faster detection\n", + "# If you're not getting any detections then you can set this to 1\n", + "scale_factor = 2.0\n", + "\n", + "# Initially the size of the hand and its center x point will be 0\n", + "size, center_x = 0,0\n", + "\n", + "# Initialize these variables for calculating FPS\n", + "fps = 0 \n", + "frame_counter = 0\n", + "start_time = time.time()\n", + "\n", + "# load up all the detectors using this function.\n", + "hand_detector = dlib.fhog_object_detector(\"Hand_Detector.svm\")\n", + "head_detector = dlib.fhog_object_detector(\"Head_Detector.svm\") \n", + "\n", + "# Now insert all detectors in a list\n", + "detectors = [hand_detector, head_detector]\n", + "\n", + "# Create a list of detector names in the same order\n", + "names = ['Hand Detected', 'Head Detected']\n", + "\n", + "\n", + "# Set the while loop\n", + "while(True):\n", + " \n", + " # Read frame by frame\n", + " ret, frame = cap.read()\n", + " \n", + " if not ret:\n", + " break\n", + " \n", + " # Laterally flip the frame\n", + " frame = cv2.flip( frame, 1 )\n", + " \n", + " # Calculate the Average FPS\n", + " frame_counter += 1\n", + " fps = (frame_counter / (time.time() - start_time))\n", + " \n", + " # Create a clean copy of the frame\n", + " copy = frame.copy() \n", + " \n", + " # Downsize the frame.\n", + " new_width = int(frame.shape[1]/scale_factor)\n", + " new_height = int(frame.shape[0]/scale_factor)\n", + " resized_frame = cv2.resize(copy, (new_width, new_height))\n", + " \n", + " # Perform the Detection\n", + " # Beside's boxes you will also get confidence scores and ID's of the detector\n", + " [detections, confidences, detector_idxs] = dlib.fhog_object_detector.run_multiple(detectors, resized_frame, \n", + " upsample_num_times=1)\n", + " \n", + " # Loop for each detected box\n", + " for i in range(len(detections)): \n", + " \n", + " # Since we downscaled the image we will need to resacle the coordinates according to the original image.\n", + " x1 = int(detections[i].left() * scale_factor )\n", + " y1 = int(detections[i].top() * scale_factor )\n", + " x2 = int(detections[i].right() * scale_factor )\n", + " y2 = int(detections[i].bottom()* scale_factor )\n", + " \n", + " # Draw the bounding box with confidence scores and the names of the detector\n", + " cv2.rectangle(frame,(x1,y1),(x2,y2),(0,255,0), 2 )\n", + " cv2.putText(frame, '{}: {:.2f}%'.format(names[detector_idxs[i]], confidences[i]*100), (x1, y2+20), \n", + " cv2.FONT_HERSHEY_COMPLEX, 0.6, (0, 0, 255),2)\n", + "\n", + " # Calculate size of the hand. \n", + " size = int( (x2 - x1) * (y2-y1) )\n", + " \n", + " # Extract the center of the hand on x-axis.\n", + " center_x = int(x1 + (x2 - x1) / 2)\n", + " \n", + " # Display FPS and size of hand\n", + " cv2.putText(frame, 'FPS: {:.2f}'.format(fps), (20, 20), cv2.FONT_HERSHEY_COMPLEX, 0.6, (0, 0, 255),2)\n", + "\n", + " # This information is useful for when you'll be building hand gesture applications\n", + " cv2.putText(frame, 'Center: {}'.format(center_x), (540, 20), cv2.FONT_HERSHEY_COMPLEX, 0.5, (233, 100, 25))\n", + " cv2.putText(frame, 'size: {}'.format(size), (540, 40), cv2.FONT_HERSHEY_COMPLEX, 0.5, (233, 100, 25))\n", + " \n", + " # Display the image\n", + " cv2.imshow('frame',frame)\n", + " \n", + " if cv2.waitKey(1) & 0xFF == ord('q'):\n", + " break\n", + "\n", + "# Relase the webcam and destroy all windows\n", + "cap.release()\n", + "cv2.destroyAllWindows()" + ] + }, + { + "attachments": { + "leftright.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABuQAAAIdCAIAAABKgoxhAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAOoRSURBVHhe7N0HfFTXmT7+7H8teu+IJooAid7B3UnsuMRO4mSzv93sbnazm7ab3fQed8c1rnHDGNsUg6mmSQiJokYvNr030RFNoDaauTf/c+48L5bAccyMzp0j3eeb81HwO4OQzn3nuefembnzub8QERERERERERERWYAnK4mIiIiIiIiIiMgKPFlJREREREREREREVuDJSiIiIiIiIiIiIrICT1YSERERERERERGRFXiykoiIiIiIiIiIiKzAk5VERERERERERERkBZ6sJCIiIiIiIiIiIivwZCURERERERERERFZgScriYiIiIiIiIiIyAo8WUlERERERERERERW4MlKIiIiIiIiIiIisgJPVhIREREREREREZEVeLKSiIiIiIiIiIiIrMCTlURERERERERERGQFnqwkIiIiIiIiIiIiK/BkJREREREREREREVmBJyuJiIiIiIiIiIjICjxZSURERERERERERFbgyUoiIiIiIiIiIiKyAk9WEhERERERERERkRV4spIS5nOTT0YH/puIiIiIiIiIiIIt6CcrP0eJImcqMYgoeBDERERERERERIInKylBeLKSKPAQxERERETkr8sHYvhvIiKb8GQlJcjl05TRQUTBgyAmIiKiQMKCgPzHYzGiwEMQ24onKylBuIMkH7DB7IYgJqprLmcL/puIiGKCBQH57/IiOTqIKHgQxLbiyUpKEO4gyTT2mPUQxBQTTCL5j9lCFHgIYoobJpT8x30ZUeAhiG3Fk5U1oErmXbGDRJWo9rDHLISoFahSTDCJ5L+a2YIiEQUJgpjihgkl/3FfRj5gg9kNQWwrnqysAVUy7+Pk8gaqRLWHPWYhRK1AlWKCSST/1cwWFIkoSBDEFDdMKPmP+zIyjT1mPQSxrXiysgZUybwrwgtVotrDHrMQolagSjHBJJL/amYLikS1iw1mNwQxxQ0TKlAl8z4OGW+gSlR72GMWQtQKVG0V9F0CtpJAlcxjeJFp7DELIWoFqhQTTCL5r2a2oEhUi9hj1kMQU9wwoQJVMu+KnEGVqPawxyyEqBWo2irouwRsJYEqmcfwItPYYxZC1ApU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" + }, + "topdown.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABuQAAAIeCAYAAABDdGmYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAM1DSURBVHhe7P0JnGVped95PucucSMi98raKCigoKpYBFoQQlKhpVFrKxASrQXbaoHGlj9VmtFYMK3BH8tG9rS1tEdINrTG8lBetCALQ3tsujAU08hDqy3KspCMjCTAVclWe+5bRNzlbPM8z3veEyeiIjIzMvNG3OX3rfrnOffcc8+9mRFx7xPv+573JKUSAAAAAAAAAAAAAGPRqpYAAAAAAAAAAAAAxoAOOQAAAAAAAAAAAGCM6JADAAAAAAAAAAAAxogOOQAAAAAAAAAAAGCM6JADAAAAAAAAAAAAxogOOQAAAAAAAAAAAGCM6JADAAAAAAAAAAAAxogOOQAAAAAAAAAAAGCM6JADAAAAAAAAAAAAxogOOQAAAAAAAAAAAGCM6JADAAAAAAAAAAAAxogOOQAAAAAAAAAAAGCM6JADAAAAAAAAAAAAxogOOQAAAAAAAAAAAGCM6JADAAAAAAAAAAAAxogOOQAAAAAAAAAAAGCM6JADAAAAAAAAAAAAxogOOQAAAAAAAAAAAGCM6JADAAAAAAAAAAAAxogOOQAAAAAAAAAAAGCMklJV6wCuUfK+49WaSPmWW6o1AAAAAAAAAAAwz+iQG4MkSao1zJXffqZaaXjrrdUKAOBqUaoAAAAAAABg2jFlJQAAAAAAAABcJZsxKQYAgO1whtwYcIbcnOIMOQAYC0oVAAAATAPag+YU7UEAMBaz2B7EGXIAgL1hv7TEAACmFiPCAQAAAAC4PM6QGwNGRM0pRkQBV46fF+wApcp0oP6ZU7yfA8BYUP9MJ+qhOUU9BABjMYv1EB1yY7BVAcY/8+zbalR4+ZZbqjUATfy8YDt8hk4vGqDmFA1QADAW1D/TiXpoTlEPATvT/JnhZwWXMIv1EFNWAgAAAAAAAACA8drcgb1VhzYwwzhDbgwY3T+fOOMHuHL8vGA7fIZOL0aEzylGhAM7w4hwXCHqn+lELTuf+P0WuHL8vGA78/IZyhlyAAAAAACMGyPCAQAAgLlGhxwAAADGwkazkdnOVrbajxDCzwvZPgAAAJgPdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgBAAAAAAAAAAAAY0SHHAAAAAAAAAAAADBGdMgB10HyvuPV2rryLbdUawAAAAAAAAAAYJ7RIQcAAAAAAAAAAACMER1yAAAAAAAAALBDzJgEANgJOuQAAAAAAAAAAACAMaJDDgAAAMCOMSIcAAAAAIArR4ccAAAAAAAAAAAAMEZ0yAEAAAAAAAAAAABjRIccAAAAAAAAAAAAMEZ0yAEAAAAAAAAAAABjRIccAAAAAAAAAAAAMEZ0yAEAAAAAAAAAAABjRIccAAAAAAAAAAAAMEZ0yAEAAAAAAAAAAABjRIccAAAAAAAAAAAAMEZ0yAEAAAAAAAAAAABjRIccAAAAAAAAAAAAMEZ0yAEAAAAAAAAAAABjRIccAAAAAAAAAAAAMEZ0yAEAAAAAAAAAAABjRIccAAAA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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##
Part 2: Integrating Gesture controls with Applications.
\n", + "\n", + "Now that we have learned how to train a single and multi Object Detector, lets move onto the fun part where we automate a game and a video player via hand gestures.\n", + "\n", + "For this tutorial I'll be controlling following two applications:\n", + "1. [VLC Media Player](https://vlc-media-player.en.softonic.com/)\n", + "2. [Temple Run Game](https://m.plonga.com/adventure/Temple-Run-2-Online-Tablet)\n", + "\n", + "In the part, I'll control the VLC media player to pause/play and move forward and backward. Then using the same code I'll control then in the second part I'll control a clone of the infamous temple run game.\n", + "\n", + "Ofcourse you can feel free to control other applications too.\n", + "\n", + "**So how are we going to accomplish this ?**\n", + "\n", + "We'll its pretty simple, We are going to use the pyautogui library. This library allows you to control keyboard buttons and mouse cursor programmatically. You can learn more about this [library here](https://pyautogui.readthedocs.io/en/latest/install.html).\n", + "\n", + "So now we'll make a program that when we move our hand to the left of the screen pyautogui will press the left arrow key and when the hand is moved to the right, right arrow key is pressed.\n", + "\n", + "![leftright.png](attachment:leftright.png)\n", + "\n", + "Similarly If our hand is closer to the screen we'll want to press the Up button and the hand is further from the screen we'll want to press the down button.\n", + "\n", + "![topdown.png](attachment:topdown.png)\n", + "\n", + "This can easily be accomplished by measuring the size of the bounding box of the hand. As the size increases or decreases when the hand moves closer or far from the camera. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Let's start with the code**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Tuning Our Thresholds:\n", + "Before we start controlling the game, we need to visualize how the buttons will be triggered and if our defined thresholds are correct. This script draws lines between thresholds and displays the buttons that should be pressed. If these default thresholds don't work for you then Change them, especially the `size_up_th` and `size_down_th`." + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "# Set these thresholds accordingly.\n", + "\n", + "# If hand size is larger than this then up, button is triggered\n", + "size_up_th = 80000\n", + "\n", + "# If hand size is smaller than this then down key is triggered\n", + "size_down_th = 25000\n", + "\n", + "# If the center_x location is less than this then left key is triggered\n", + "left = 160\n", + "\n", + "# If the center_x location is greater than this then right key is triggered\n", + "right = 480\n", + "\n", + "# Load our trained detector \n", + "detector = dlib.simple_object_detector('Hand_Detector.svm')\n", + "\n", + "# Set the window to normal\n", + "cv2.namedWindow('frame', cv2.WINDOW_NORMAL)\n", + "\n", + "# Initialize webcam\n", + "cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)\n", + "\n", + "# Setting the downscaling size, for faster detection\n", + "# If you're not getting any detections then you can set this to 1\n", + "scale_factor = 2.0\n", + "\n", + "# Initially the size of the hand and its center x point will be 0\n", + "size, center_x = 0,0\n", + "\n", + "# Initialize these variables for calculating FPS\n", + "fps = 0 \n", + "frame_counter = 0\n", + "start_time = time.time()\n", + "\n", + "# Set the while loop\n", + "while(True):\n", + " \n", + " # Read frame by frame\n", + " ret, frame = cap.read()\n", + " \n", + " if not ret:\n", + " break\n", + " \n", + " # Laterally flip the frame\n", + " frame = cv2.flip( frame, 1 )\n", + " \n", + " # Calculate the Average FPS\n", + " frame_counter += 1\n", + " fps = (frame_counter / (time.time() - start_time))\n", + " \n", + " # Create a clean copy of the frame\n", + " copy = frame.copy() \n", + " \n", + " # Downsize the frame.\n", + " new_width = int(frame.shape[1]/scale_factor)\n", + " new_height = int(frame.shape[0]/scale_factor)\n", + " resized_frame = cv2.resize(copy, (new_width, new_height))\n", + " \n", + " # Detect with detector\n", + " detections = detector(resized_frame)\n", + " \n", + " # Set Default values\n", + " text = 'No Hand Detected'\n", + " center_x = 0\n", + " size = 0\n", + "\n", + " # Loop for each detection.\n", + " for detection in (detections): \n", + " \n", + " # Since we downscaled the image we will need to resacle the coordinates according to the original image.\n", + " x1 = int(detection.left() * scale_factor )\n", + " y1 = int(detection.top() * scale_factor )\n", + " x2 = int(detection.right() * scale_factor )\n", + " y2 = int(detection.bottom()* scale_factor )\n", + " \n", + " # Calculate size of the hand. \n", + " size = int( (x2 - x1) * (y2-y1) )\n", + " \n", + " # Extract the center of the hand on x-axis.\n", + " center_x = int(x1 + (x2 - x1) / 2)\n", + " \n", + " # Draw the bounding box of the detected hand\n", + " cv2.rectangle(frame,(x1,y1),(x2,y2),(0,255,0), 2 )\n", + " \n", + " # Now based on the size or center_x location set the required text\n", + " if center_x > right:\n", + " text = 'Right'\n", + "\n", + " elif center_x < left:\n", + " text = 'Left'\n", + "\n", + " elif size > size_up_th:\n", + " text = 'Up'\n", + "\n", + " elif size < size_down_th:\n", + " text = 'Down'\n", + " \n", + " else:\n", + " text = 'Neutral'\n", + " \n", + " # Now we should draw lines for left/right threshold\n", + " cv2.line(frame, (left,0),(left, frame.shape[0]),(25,25,255), 2)\n", + " cv2.line(frame, (right,0),(right, frame.shape[0]),(25,25,255), 2) \n", + "\n", + " # Display Center_x value and size.\n", + " cv2.putText(frame, 'Center: {}'.format(center_x), (500, 20), cv2.FONT_HERSHEY_COMPLEX, 0.6, (233, 100, 25), 1)\n", + " cv2.putText(frame, 'size: {}'.format(size), (500, 40), cv2.FONT_HERSHEY_COMPLEX, 0.6, (233, 100, 25))\n", + "\n", + " # Finally display the text showing which key should be triggered\n", + " cv2.putText(frame, text, (220, 30), cv2.FONT_HERSHEY_COMPLEX, 0.7, (33, 100, 185), 2)\n", + "\n", + " # Display the image\n", + " cv2.imshow('frame',frame)\n", + "\n", + " if cv2.waitKey(1) & 0xFF == ord('q'):\n", + " break\n", + "\n", + "# Relase the webcam and destroy all windows\n", + "cap.release()\n", + "cv2.destroyAllWindows() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Make sure you're satisfied with the above results and the keys are triggered correctly based on the location of your hand, if not then change the thresholds, if you're facing trouble detecting the hand then you have to train the detector again with more examples.**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have configured our thresholds we will make a script that will press the required button based on those thresholds. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Main Function\n", + "\n", + "This is our main script which will control the keyboard keys based on the hand movement. Now with this script I've controlled both the temple run game and the VLC media player.\n", + "\n", + "When controlling the media player I make the variable `player = True`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load our trained detector \n", + "detector = dlib.simple_object_detector('Hand_Detector.svm')\n", + "\n", + "# Initialize webcam\n", + "cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)\n", + "\n", + "# Setting the downscaling size, for faster detection\n", + "# If you're not getting any detections then you can set this to 1\n", + "scale_factor = 2.0\n", + "\n", + "# Initially the size of the hand and its center x point will be 0\n", + "size, center_x = 0,0\n", + "\n", + "# Initialize these variables for calculating FPS\n", + "fps = 0 \n", + "frame_counter = 0\n", + "start_time = time.time()\n", + "\n", + "# Set Player = True in order to use this script for the VLC video palyer\n", + "player = True\n", + "\n", + "# This variable is True when we press a key and False when there is no detection.\n", + "# Its only used in the video Player\n", + "status = False\n", + "\n", + "# We're recording the whole screen to view it later\n", + "screen_width, screen_height = tuple(pyg.size())\n", + "out = cv2.VideoWriter(r'videorecord.mp4', cv2.VideoWriter_fourcc(*'XVID'), 15.0, (screen_width,screen_height ))\n", + "\n", + "# Set the while loop\n", + "while(True):\n", + " \n", + " try:\n", + " \n", + " # Read frame by frame\n", + " ret, frame = cap.read()\n", + "\n", + " if not ret:\n", + " break\n", + "\n", + " # Laterally flip the frame\n", + " frame = cv2.flip( frame, 1 )\n", + "\n", + " # Calculate the Average FPS\n", + " frame_counter += 1\n", + " fps = (frame_counter / (time.time() - start_time))\n", + "\n", + " # Create a clean copy of the frame\n", + " copy = frame.copy() \n", + "\n", + " # Downsize the frame.\n", + " new_width = int(frame.shape[1]/scale_factor)\n", + " new_height = int(frame.shape[0]/scale_factor)\n", + " resized_frame = cv2.resize(copy, (new_width, new_height))\n", + "\n", + " # Detect with detector\n", + " detections = detector(resized_frame)\n", + " \n", + " # Key will initially be None\n", + " key = None\n", + "\n", + " if len(detections) > 0:\n", + " \n", + " # Grab the first detection\n", + " detection = detections[0]\n", + "\n", + " # Since we downscaled the image we will need to resacle the coordinates according to the original image.\n", + " x1 = int(detection.left() * scale_factor )\n", + " y1 = int(detection.top() * scale_factor )\n", + " x2 = int(detection.right() * scale_factor )\n", + " y2 = int(detection.bottom()* scale_factor )\n", + " \n", + " cv2.rectangle(frame,(x1,y1),(x2,y2),(0,255,0), 2 )\n", + " cv2.putText(frame, 'Hand Detected', (x1, y2+20), cv2.FONT_HERSHEY_COMPLEX, 0.6, (0, 0, 255),2)\n", + "\n", + " # Calculate size of the hand. \n", + " size = int( (x2 - x1) * (y2-y1) )\n", + "\n", + " # Extract the center of the hand on x-axis.\n", + " center_x = int(x1 + (x2 - x1) / 2)\n", + "\n", + " # Press the requird button based on center_x location and size \n", + " # The behaviour of keys will be different depending upon if we're controlling a game or a video player.\n", + " # The status variable makes sure we do not double press the key in case of a video player.\n", + "\n", + " if center_x > right:\n", + " \n", + " key = 'right'\n", + " if player and not status:\n", + " pyg.hotkey('ctrl', 'right') \n", + " status = True\n", + "\n", + " elif center_x < left:\n", + " \n", + " key = 'left' \n", + " if player and not status:\n", + " pyg.hotkey('ctrl', 'left')\n", + " status = True\n", + "\n", + " elif size > size_up_th:\n", + " \n", + " key = 'up'\n", + " if player and not status:\n", + " pyg.press('space')\n", + " status = True\n", + "\n", + " elif size < size_down_th:\n", + " key = 'down'\n", + " \n", + " # Check if we're playing a game then press the requried key\n", + " if key is not None and player == False: \n", + " pyg.press(key) \n", + " \n", + " # If there was'nt a detection then status is made False\n", + " else:\n", + " status = False\n", + " \n", + " \n", + " # Capture the screen\n", + " image = pyg.screenshot()\n", + " \n", + " # Convert to BGR, numpy array (Opencv format of image)\n", + " img = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)\n", + " \n", + " # Resize the camera frame and attach it to screen.\n", + " resized_frame = cv2.resize(frame, (0,0), fx=0.6, fy=0.6)\n", + " h = resized_frame.shape[0]\n", + " w = resized_frame.shape[1]\n", + " img[0:h, 0:w] = resized_frame\n", + " \n", + " # Save the video frame\n", + " out.write(img)\n", + " \n", + " #time.sleep(0.2)\n", + " except KeyboardInterrupt:\n", + " print('Releasing the Camera and exiting since the program was stopped')\n", + " cap.release()\n", + " out.release()\n", + " sys.exit()" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "# Release the camera and the videowriter if the code above exited from an exception other than KeyboardInterrupt\n", + "cap.release()\n", + "out.release()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Training_a_custom_hand_detector_with_dlib/boxes.txt b/Training_a_custom_hand_detector_with_dlib/boxes.txt new file mode 100644 index 000000000..a2cb5dd0b --- /dev/null +++ b/Training_a_custom_hand_detector_with_dlib/boxes.txt @@ -0,0 +1 @@ +0:(12,0,202,190),1:(24,0,214,190),2:(36,0,226,190),3:(48,0,238,190),4:(60,0,250,190),5:(72,0,262,190),6:(84,0,274,190),7:(96,0,286,190),8:(108,0,298,190),9:(120,0,310,190),10:(132,0,322,190),11:(144,0,334,190),12:(156,0,346,190),13:(168,0,358,190),14:(180,0,370,190),15:(192,0,382,190),16:(204,0,394,190),17:(216,0,406,190),18:(228,0,418,190),19:(240,0,430,190),20:(252,0,442,190),21:(264,0,454,190),22:(276,0,466,190),23:(288,0,478,190),24:(300,0,490,190),25:(312,0,502,190),26:(324,0,514,190),27:(336,0,526,190),28:(348,0,538,190),29:(360,0,550,190),30:(372,0,562,190),31:(384,0,574,190),32:(396,0,586,190),33:(408,0,598,190),34:(420,0,610,190),35:(432,0,622,190),36:(444,0,634,190),37:(12,80,202,270),38:(24,80,214,270),39:(36,80,226,270),40:(48,80,238,270),41:(60,80,250,270),42:(72,80,262,270),43:(84,80,274,270),44:(96,80,286,270),45:(108,80,298,270),46:(120,80,310,270),47:(132,80,322,270),48:(144,80,334,270),49:(156,80,346,270),50:(168,80,358,270),51:(180,80,370,270),52:(192,80,382,270),53:(204,80,394,270),54:(216,80,406,270),55:(228,80,418,270),56:(240,80,430,270),57:(252,80,442,270),58:(264,80,454,270),59:(276,80,466,270),60:(288,80,478,270),61:(300,80,490,270),62:(312,80,502,270),63:(324,80,514,270),64:(336,80,526,270),65:(348,80,538,270),66:(360,80,550,270),67:(372,80,562,270),68:(384,80,574,270),69:(396,80,586,270),70:(408,80,598,270),71:(420,80,610,270),72:(432,80,622,270),73:(444,80,634,270),74:(12,160,202,350),75:(24,160,214,350),76:(36,160,226,350),77:(48,160,238,350),78:(60,160,250,350),79:(72,160,262,350),80:(84,160,274,350),81:(96,160,286,350),82:(108,160,298,350),83:(120,160,310,350),84:(132,160,322,350),85:(144,160,334,350),86:(156,160,346,350),87:(168,160,358,350),88:(180,160,370,350),89:(192,160,382,350),90:(204,160,394,350),91:(216,160,406,350),92:(228,160,418,350),93:(240,160,430,350),94:(252,160,442,350),95:(264,160,454,350),96:(276,160,466,350),97:(288,160,478,350),98:(300,160,490,350),99:(312,160,502,350),100:(324,160,514,350),101:(336,160,526,350),102:(348,160,538,350),103:(360,160,550,350),104:(372,160,562,350),105:(384,160,574,350),106:(396,160,586,350),107:(408,160,598,350),108:(420,160,610,350),109:(432,160,622,350),110:(444,160,634,350),111:(12,240,202,430),112:(24,240,214,430),113:(36,240,226,430),114:(48,240,238,430),115:(60,240,250,430),116:(72,240,262,430),117:(84,240,274,430),118:(96,240,286,430),119:(108,240,298,430),120:(120,240,310,430),121:(132,240,322,430),122:(144,240,334,430),123:(156,240,346,430),124:(168,240,358,430),125:(180,240,370,430),126:(192,240,382,430),127:(204,240,394,430),128:(216,240,406,430),129:(228,240,418,430),130:(240,240,430,430),131:(252,240,442,430),132:(264,240,454,430),133:(276,240,466,430),134:(288,240,478,430),135:(300,240,490,430),136:(312,240,502,430),137:(324,240,514,430),138:(336,240,526,430),139:(348,240,538,430),140:(360,240,550,430),141:(372,240,562,430),142:(384,240,574,430),143:(396,240,586,430),144:(408,240,598,430),145:(420,240,610,430),146:(432,240,622,430),147:(444,240,634,430), \ No newline at end of file diff --git a/Training_a_custom_hand_detector_with_dlib/boxes_h.txt b/Training_a_custom_hand_detector_with_dlib/boxes_h.txt new file mode 100644 index 000000000..a2cb5dd0b --- /dev/null +++ b/Training_a_custom_hand_detector_with_dlib/boxes_h.txt @@ -0,0 +1 @@ +0:(12,0,202,190),1:(24,0,214,190),2:(36,0,226,190),3:(48,0,238,190),4:(60,0,250,190),5:(72,0,262,190),6:(84,0,274,190),7:(96,0,286,190),8:(108,0,298,190),9:(120,0,310,190),10:(132,0,322,190),11:(144,0,334,190),12:(156,0,346,190),13:(168,0,358,190),14:(180,0,370,190),15:(192,0,382,190),16:(204,0,394,190),17:(216,0,406,190),18:(228,0,418,190),19:(240,0,430,190),20:(252,0,442,190),21:(264,0,454,190),22:(276,0,466,190),23:(288,0,478,190),24:(300,0,490,190),25:(312,0,502,190),26:(324,0,514,190),27:(336,0,526,190),28:(348,0,538,190),29:(360,0,550,190),30:(372,0,562,190),31:(384,0,574,190),32:(396,0,586,190),33:(408,0,598,190),34:(420,0,610,190),35:(432,0,622,190),36:(444,0,634,190),37:(12,80,202,270),38:(24,80,214,270),39:(36,80,226,270),40:(48,80,238,270),41:(60,80,250,270),42:(72,80,262,270),43:(84,80,274,270),44:(96,80,286,270),45:(108,80,298,270),46:(120,80,310,270),47:(132,80,322,270),48:(144,80,334,270),49:(156,80,346,270),50:(168,80,358,270),51:(180,80,370,270),52:(192,80,382,270),53:(204,80,394,270),54:(216,80,406,270),55:(228,80,418,270),56:(240,80,430,270),57:(252,80,442,270),58:(264,80,454,270),59:(276,80,466,270),60:(288,80,478,270),61:(300,80,490,270),62:(312,80,502,270),63:(324,80,514,270),64:(336,80,526,270),65:(348,80,538,270),66:(360,80,550,270),67:(372,80,562,270),68:(384,80,574,270),69:(396,80,586,270),70:(408,80,598,270),71:(420,80,610,270),72:(432,80,622,270),73:(444,80,634,270),74:(12,160,202,350),75:(24,160,214,350),76:(36,160,226,350),77:(48,160,238,350),78:(60,160,250,350),79:(72,160,262,350),80:(84,160,274,350),81:(96,160,286,350),82:(108,160,298,350),83:(120,160,310,350),84:(132,160,322,350),85:(144,160,334,350),86:(156,160,346,350),87:(168,160,358,350),88:(180,160,370,350),89:(192,160,382,350),90:(204,160,394,350),91:(216,160,406,350),92:(228,160,418,350),93:(240,160,430,350),94:(252,160,442,350),95:(264,160,454,350),96:(276,160,466,350),97:(288,160,478,350),98:(300,160,490,350),99:(312,160,502,350),100:(324,160,514,350),101:(336,160,526,350),102:(348,160,538,350),103:(360,160,550,350),104:(372,160,562,350),105:(384,160,574,350),106:(396,160,586,350),107:(408,160,598,350),108:(420,160,610,350),109:(432,160,622,350),110:(444,160,634,350),111:(12,240,202,430),112:(24,240,214,430),113:(36,240,226,430),114:(48,240,238,430),115:(60,240,250,430),116:(72,240,262,430),117:(84,240,274,430),118:(96,240,286,430),119:(108,240,298,430),120:(120,240,310,430),121:(132,240,322,430),122:(144,240,334,430),123:(156,240,346,430),124:(168,240,358,430),125:(180,240,370,430),126:(192,240,382,430),127:(204,240,394,430),128:(216,240,406,430),129:(228,240,418,430),130:(240,240,430,430),131:(252,240,442,430),132:(264,240,454,430),133:(276,240,466,430),134:(288,240,478,430),135:(300,240,490,430),136:(312,240,502,430),137:(324,240,514,430),138:(336,240,526,430),139:(348,240,538,430),140:(360,240,550,430),141:(372,240,562,430),142:(384,240,574,430),143:(396,240,586,430),144:(408,240,598,430),145:(420,240,610,430),146:(432,240,622,430),147:(444,240,634,430), \ No newline at end of file diff --git a/Training_a_custom_hand_detector_with_dlib/requirements.txt b/Training_a_custom_hand_detector_with_dlib/requirements.txt new file mode 100644 index 000000000..664d64cd7 --- /dev/null +++ b/Training_a_custom_hand_detector_with_dlib/requirements.txt @@ -0,0 +1,5 @@ +pyautogui==0.9.48 +matplotlib==3.1.0 +numpy==1.18.3 +opencv-contrib-python==4.3.0 +dlib==19.18.0 diff --git a/UI-cvui/canny.cpp b/UI-cvui/canny.cpp index 6ec2b9784..a394c9165 100644 --- a/UI-cvui/canny.cpp +++ b/UI-cvui/canny.cpp @@ -26,7 +26,7 @@ int main(int argc, const char *argv[]) // Should we apply Canny edge? if (use_canny) { // Yes, we should apply it. - cv::cvtColor(lena, frame, CV_BGR2GRAY); + cv::cvtColor(lena, frame, cv::COLOR_BGR2GRAY); cv::Canny(frame, frame, low_threshold, high_threshold, 3); } else { // No, so just copy the original image to the displaying frame. diff --git a/UI-cvui/cvui.h b/UI-cvui/cvui.h index 269d2caa3..c1cd356c5 100644 --- a/UI-cvui/cvui.h +++ b/UI-cvui/cvui.h @@ -1715,7 +1715,7 @@ namespace render // Then the filling. theContent.x++; theContent.y++; theContent.width -= 2; theContent.height -= 2; - cv::rectangle(aOverlay, theContent, cv::Scalar(0x31, 0x31, 0x31), CVUI_FILLED); + cv::rectangle(theBlock.where, theContent, cv::Scalar(0x31, 0x31, 0x31), CVUI_FILLED); if (aTransparecy) { theBlock.where.copyTo(aOverlay); diff --git a/UnderstandingLensDistortion/CMakeLists.txt b/UnderstandingLensDistortion/CMakeLists.txt new file mode 100644 index 000000000..3e64982fe --- /dev/null +++ b/UnderstandingLensDistortion/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 2.8.12) + +set(CMAKE_CXX_STANDARD 14) + +PROJECT(cameracalib) + +find_package( OpenCV REQUIRED ) + +include_directories( ${OpenCV_INCLUDE_DIRS}) + +MACRO(add_example name) + ADD_EXECUTABLE(${name} ${name}.cpp) + TARGET_LINK_LIBRARIES(${name} ${OpenCV_LIBS}) +ENDMACRO() + +add_example(Undistort) diff --git a/UnderstandingLensDistortion/README.md b/UnderstandingLensDistortion/README.md new file mode 100644 index 000000000..0eeaff5d0 --- /dev/null +++ b/UnderstandingLensDistortion/README.md @@ -0,0 +1,40 @@ +# Understanding Lens Distortion + +Understanding lens distortion using OpenCV. + +## Using the C++ code +### Compilation +To compile the `Undistort.cpp` code file, use the following: +```shell +mkdir build +cd build +cmake .. +cmake --build . --config Release +``` +## Usage + +### Using the C++ code + +Refer to the following to use the compiled file: + +```shell +./build/Undistort +``` + +### Using the python code + +Refer to the following to use the `Undistort.py` file: + +```shell +python3 Undistort.py +``` + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
diff --git a/UnderstandingLensDistortion/Undistort.cpp b/UnderstandingLensDistortion/Undistort.cpp new file mode 100644 index 000000000..a32b3f87c --- /dev/null +++ b/UnderstandingLensDistortion/Undistort.cpp @@ -0,0 +1,114 @@ +#include +#include +#include +#include +#include +#include + +// Defining the dimensions of checkerboard +int CHECKERBOARD[2]{6,9}; + +int main() +{ + // Creating vector to store vectors of 3D points for each checkerboard image + std::vector > objpoints; + + // Creating vector to store vectors of 2D points for each checkerboard image + std::vector > imgpoints; + + // Defining the world coordinates for 3D points + std::vector objp; + for(int i{0}; i images; + // Path of the folder containing checkerboard images + std::string path = "./images/*.jpg"; + + cv::glob(path, images); + + cv::Mat frame, gray; + // vector to store the pixel coordinates of detected checker board corners + std::vector corner_pts; + bool success; + + // Looping over all the images in the directory + for(int i{0}; i &trainCells, vector &testCells,vector &trainLabels, vector &testLabels) { - - Mat img = imread(pathName,CV_LOAD_IMAGE_GRAYSCALE); + Mat img = imread(pathName, cv::IMREAD_GRAYSCALE); int ImgCount = 0; for(int i = 0; i < img.rows; i = i + SZ) { @@ -46,7 +45,7 @@ void loadTrainTestLabel(string &pathName, vector &trainCells, vector & ImgCount++; } } - + cout << "Image Count : " << ImgCount << endl; float digitClassNumber = 0; @@ -66,7 +65,6 @@ void loadTrainTestLabel(string &pathName, vector &trainCells, vector & } void CreateDeskewedTrainTest(vector &deskewedTrainCells,vector &deskewedTestCells, vector &trainCells, vector &testCells){ - for(int i=0;i &deskewedTrainCells,vector &deskew } HOGDescriptor hog( - Size(20,20), //winSize - Size(8,8), //blocksize - Size(4,4), //blockStride, - Size(8,8), //cellSize, - 9, //nbins, - 1, //derivAper, - -1, //winSigma, - 0, //histogramNormType, - 0.2, //L2HysThresh, - 0,//gammal correction, - 64,//nlevels=64 - 1); + Size(20,20), //winSize + Size(8,8), //blocksize + Size(4,4), //blockStride, + Size(8,8), //cellSize, + 9, //nbins, + 1, //derivAper, + -1, //winSigma, + cv::HOGDescriptor::HistogramNormType::L2Hys, //histogramNormType, + 0.2, //L2HysThresh, + 0, //gammal correction, + 64, //nlevels=64 + 1 +); + void CreateTrainTestHOG(vector > &trainHOG, vector > &testHOG, vector &deskewedtrainCells, vector &deskewedtestCells){ for(int y=0;y > &trainHOG, vector > hog.compute(deskewedtrainCells[y],descriptors); trainHOG.push_back(descriptors); } - + for(int y=0;y descriptors; hog.compute(deskewedtestCells[y],descriptors); testHOG.push_back(descriptors); - } + } } + void ConvertVectortoMatrix(vector > &trainHOG, vector > &testHOG, Mat &trainMat, Mat &testMat) { - int descriptor_size = trainHOG[0].size(); - + for(int i = 0;i(i,j) = trainHOG[i][j]; + trainMat.at(i,j) = trainHOG[i][j]; } } for(int i = 0;i(i,j) = testHOG[i][j]; + testMat.at(i,j) = testHOG[i][j]; } } } @@ -165,7 +165,7 @@ void SVMevaluate(Mat &testResponse, float &count, float &accuracy, vector & { // cout << testResponse.at(i,0) << " " << testLabels[i] << endl; if(testResponse.at(i,0) == testLabels[i]) - count = count + 1; + count = count + 1; } accuracy = (count/testResponse.rows)*100; } @@ -173,29 +173,28 @@ void SVMevaluate(Mat &testResponse, float &count, float &accuracy, vector & int main() { - vector trainCells; vector testCells; vector trainLabels; vector testLabels; loadTrainTestLabel(pathName,trainCells,testCells,trainLabels,testLabels); - + vector deskewedTrainCells; vector deskewedTestCells; CreateDeskewedTrainTest(deskewedTrainCells,deskewedTestCells,trainCells,testCells); - + std::vector > trainHOG; std::vector > testHOG; CreateTrainTestHOG(trainHOG,testHOG,deskewedTrainCells,deskewedTestCells); int descriptor_size = trainHOG[0].size(); cout << "Descriptor Size : " << descriptor_size << endl; - + Mat trainMat(trainHOG.size(),descriptor_size,CV_32FC1); Mat testMat(testHOG.size(),descriptor_size,CV_32FC1); - + ConvertVectortoMatrix(trainHOG,testHOG,trainMat,testMat); - + float C = 12.5, gamma = 0.5; Mat testResponse; @@ -205,14 +204,14 @@ int main() svmTrain(model, trainMat, trainLabels); /////////// SVM Testing //////////////// - svmPredict(model, testResponse, testMat); + svmPredict(model, testResponse, testMat); ////////////// Find Accuracy /////////// float count = 0; float accuracy = 0 ; getSVMParams(model); SVMevaluate(testResponse, count, accuracy, testLabels); - + cout << "the accuracy is :" << accuracy << endl; return 0; } diff --git a/hdr/hdr.cpp b/hdr/hdr.cpp index 28c4242f7..08e138a4e 100644 --- a/hdr/hdr.cpp +++ b/hdr/hdr.cpp @@ -1,6 +1,7 @@ #include #include "opencv2/imgcodecs.hpp" #include +#include #include #include #include @@ -66,7 +67,7 @@ int main(int, char**argv) // Tonemap using Durand's method obtain 24-bit color image cout << "Tonemaping using Durand's method ... "; Mat ldrDurand; - Ptr tonemapDurand = createTonemapDurand(1.5,4,1.0,1,1); + Ptr tonemapDurand = cv::xphoto::createTonemapDurand(1.5,4,1.0,1,1); tonemapDurand->process(hdrDebevec, ldrDurand); ldrDurand = 3 * ldrDurand; imwrite("ldr-Durand.jpg", ldrDurand * 255); diff --git a/otsu-method/CMakeLists.txt b/otsu-method/CMakeLists.txt new file mode 100644 index 000000000..9c7ee6cec --- /dev/null +++ b/otsu-method/CMakeLists.txt @@ -0,0 +1,34 @@ +#SPECIFY THE MINIMUM VERSION OF CMAKE REQUIRED +cmake_minimum_required(VERSION 2.8.12) + +#SPECIFY YOUR PROJECT NAME +PROJECT(Project_Name) + +#SET PATH TO OPENCV CMAKE CONFIG FILES +#SET(OpenCV_DIR C:\\Users\\Administrator\\opencv-4.1.0\\Installation\\x64\\vc15\\staticlib) + +#ENABLE C++11 +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED TRUE) + +#SET CMAKE CXX FLAGS +SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") + + +#MAKE SURE OPENCV IS INSTALLED CORRECTLY +find_package( OpenCV REQUIRED ) + +#INCLUDE OPENCV DIRECTORIES +include_directories( ${OpenCV_INCLUDE_DIRS}) + +#MACRO TO COMPILE CPP FILES +MACRO(add_example name) + ADD_EXECUTABLE(${name} ${name}.cpp) + TARGET_LINK_LIBRARIES(${name} ${OpenCV_LIBS} ) +ENDMACRO() + +#COMPILE CPP FILES USING THIS LINE +add_example(otsu_implementation) +add_example(otsu_method) +#add_example(sampleCode2) and so on diff --git a/otsu-method/README.md b/otsu-method/README.md new file mode 100644 index 000000000..a064ed248 --- /dev/null +++ b/otsu-method/README.md @@ -0,0 +1,12 @@ +This contains the code for **Otsu's Thresholding Technique**. For more information - visit +[**Otsu's Thresholding Technique**](https://www.learnopencv.com/otsus-thresholding-technique/) + +# AI Courses by OpenCV + +Want to become an expert in AI? [AI Courses by OpenCV](https://opencv.org/courses/) is a great place to start. + + +

+ +

+
diff --git a/otsu-method/boat.jpg b/otsu-method/boat.jpg new file mode 100644 index 000000000..efd0ad2af Binary files /dev/null and b/otsu-method/boat.jpg differ diff --git a/otsu-method/otsu_implementation.cpp b/otsu-method/otsu_implementation.cpp new file mode 100644 index 000000000..caa30f700 --- /dev/null +++ b/otsu-method/otsu_implementation.cpp @@ -0,0 +1,104 @@ +#include +#include +#include + +using namespace std; +using namespace cv; + +int main(){ + + // read the image in BGR format + Mat testImage = imread("boat.jpg", 0); + int bins_num = 256; + + // Get the histogram + long double histogram[256]; + + // initialize all intensity values to 0 + for(int i = 0; i < 256; i++) + { + histogram[i] = 0; + } + + // calculate the no of pixels for each intensity values + for(int y = 0; y < testImage.rows; y++) + for(int x = 0; x < testImage.cols; x++) + histogram[(int)testImage.at(y,x)]++; + + // Calculate the bin_edges + long double bin_edges[256]; + bin_edges[0] = 0.0; + long double increment = 0.99609375; + for(int i = 1; i < 256; i++){ + bin_edges[i] = bin_edges[i-1] + increment; + } + + // Calculate bin_mids + long double bin_mids[256]; + for(int i = 0; i < 256; i++){ + bin_mids[i] = (bin_edges[i] + bin_edges[(uchar)(i+1)])/2; + } + + // Calculate weight 1 and weight 2 + long double weight1[256]; + weight1[0] = histogram[0]; + for(int i = 1; i < 256; i++){ + weight1[i] = histogram[i] + weight1[i-1]; + } + int total_sum=0; + for(int i = 0; i < 256; i++){ + total_sum = total_sum + histogram[i]; + } + long double weight2[256]; + weight2[0] = total_sum; + for(int i = 1; i < 256; i++){ + weight2[i] = weight2[i-1] - histogram[i - 1]; + } + + // Calculate mean 1 and mean 2 + long double histogram_bin_mids[256]; + for(int i = 0; i < 256; i++){ + histogram_bin_mids[i] = histogram[i] * bin_mids[i]; + } + long double cumsum_mean1[256]; + cumsum_mean1[0] = histogram_bin_mids[0]; + for(int i = 1; i < 256; i++){ + cumsum_mean1[i] = cumsum_mean1[i-1] + histogram_bin_mids[i]; + } + long double cumsum_mean2[256]; + cumsum_mean2[0] = histogram_bin_mids[255]; + for(int i = 1, j=254; i < 256 && j>=0; i++, j--){ + cumsum_mean2[i] = cumsum_mean2[i-1] + histogram_bin_mids[j]; + } + long double mean1[256]; + for(int i = 0; i < 256; i++){ + mean1[i] = cumsum_mean1[i] / weight1[i]; + } + long double mean2[256]; + for(int i = 0, j = 255; i < 256 && j >= 0; i++, j--){ + mean2[j] = cumsum_mean2[i] / weight2[j]; + } + + + // Calculate Inter_class_variance + long double Inter_class_variance[255]; + long double dnum = 10000000000; + for(int i = 0; i < 255; i++){ + Inter_class_variance[i] = ((weight1[i] * weight2[i] * (mean1[i] - mean2[i+1])) / dnum) * (mean1[i] - mean2[i+1]); + } + + // Get the maximum value + long double maxi = 0; + int getmax = 0; + for(int i = 0;i < 255; i++){ + if(maxi < Inter_class_variance[i]){ + maxi = Inter_class_variance[i]; + getmax = i; + } + } + + cout << "Otsu's algorithm implementation thresholding result: " << bin_mids[getmax]; + + + return 0; +} diff --git a/otsu-method/otsu_implementation.py b/otsu-method/otsu_implementation.py new file mode 100644 index 000000000..1129ec28f --- /dev/null +++ b/otsu-method/otsu_implementation.py @@ -0,0 +1,50 @@ +import cv2 +import numpy as np + + +def otsu_implementation(img_title="boat.jpg", is_normalized=False, is_reduce_noise=False): + # Read the image in a greyscale mode + image = cv2.imread(img_title, 0) + + # Apply GaussianBlur to reduce image noise if it is required + if is_reduce_noise: + image = cv2.GaussianBlur(image, (5, 5), 0) + + # Set total number of bins in the histogram + bins_num = 256 + + # Get the image histogram + hist, bin_edges = np.histogram(image, bins=bins_num) + + # Get normalized histogram if it is required + if is_normalized: + hist = np.divide(hist.ravel(), hist.max()) + + # Calculate centers of bins + bin_mids = (bin_edges[:-1] + bin_edges[1:]) / 2. + + # Iterate over all thresholds (indices) and get the probabilities w1(t), w2(t) + weight1 = np.cumsum(hist) + weight2 = np.cumsum(hist[::-1])[::-1] + + # Get the class means mu0(t) + mean1 = np.cumsum(hist * bin_mids) / weight1 + # Get the class means mu1(t) + mean2 = (np.cumsum((hist * bin_mids)[::-1]) / weight2[::-1])[::-1] + + inter_class_variance = weight1[:-1] * weight2[1:] * (mean1[:-1] - mean2[1:]) ** 2 + + # Maximize the inter_class_variance function val + index_of_max_val = np.argmax(inter_class_variance) + + threshold = bin_mids[:-1][index_of_max_val] + print("Otsu's algorithm implementation thresholding result: ", threshold) + return threshold + + +def main(): + otsu_implementation() + + +if __name__ == "__main__": + main() diff --git a/otsu-method/otsu_method.cpp b/otsu-method/otsu_method.cpp new file mode 100644 index 000000000..b70b05172 --- /dev/null +++ b/otsu-method/otsu_method.cpp @@ -0,0 +1,24 @@ +#include +#include +#include +#include +#include + +using namespace std; +using namespace cv; + +int main(){ + + Mat testImage = imread("boat.jpg", 0); + + Mat dst; + double thresh = 0; + double maxValue = 255; + + long double thres = cv::threshold(testImage,dst, thresh, maxValue, THRESH_OTSU); + + cout << "Otsu Threshold : " << thres <